<feed xmlns='http://www.w3.org/2005/Atom'>
<title>glusterfs.git/extras/quota, branch v3.1.0</title>
<subtitle></subtitle>
<link rel='alternate' type='text/html' href='http://git.gluster.org/cgit/glusterfs.git/'/>
</feed>
ss' href='/cgit-data/cgit.css'/>
<link rel='shortcut icon' href='/favicon.ico'/>
<link rel='alternate' title='Atom feed' href='http://git.gluster.org/cgit/glusterfs.git/atom/?h=master' type='application/atom+xml'/>
</head>
<body>
<div id='cgit'><table id='header'>
<tr>
<td class='logo' rowspan='2'><a href='/cgit/'><img src='/cgit-data/cgit.png' alt='cgit logo'/></a></td>
<td class='main'><a href='/cgit/'>index</a> : <a title='glusterfs.git' href='/cgit/glusterfs.git/'>glusterfs.git</a></td><td class='form'><form method='get'>
<input type='hidden' name='id2' value='6ee84e00f0d96e292163ebad86b2e7521776dca1'/><select name='h' onchange='this.form.submit();'>
<option value='bug-deprecated'>bug-deprecated</option>
<option value='dht-stale-layout-fixes'>dht-stale-layout-fixes</option>
<option value='exp'>exp</option>
<option value='experimental'>experimental</option>
<option value='heal-info'>heal-info</option>
<option value='master' selected='selected'>master</option>
<option value='release-2.0'>release-2.0</option>
<option value='release-3.0'>release-3.0</option>
<option value='release-3.1'>release-3.1</option>
<option value='release-3.10'>release-3.10</option>
<option value='release-3.11'>release-3.11</option>
<option value='release-3.12'>release-3.12</option>
<option value='release-3.13'>release-3.13</option>
<option value='release-3.2'>release-3.2</option>
<option value='release-3.3'>release-3.3</option>
<option value='release-3.4'>release-3.4</option>
<option value='release-3.5'>release-3.5</option>
<option value='release-3.6'>release-3.6</option>
<option value='release-3.7'>release-3.7</option>
<option value='release-3.8'>release-3.8</option>
<option value='release-3.8-fb'>release-3.8-fb</option>
<option value='release-3.9'>release-3.9</option>
<option value='release-4.0'>release-4.0</option>
<option value='release-4.1'>release-4.1</option>
<option value='release-5'>release-5</option>
<option value='release-6'>release-6</option>
<option value='release-7'>release-7</option>
<option value='release-8'>release-8</option>
<option value='round-robin2'>round-robin2</option>
<option value='testing-regression-job'>testing-regression-job</option>
</select> <input type='submit' value='switch'/></form></td></tr>
<tr><td class='sub'></td><td class='sub right'></td></tr></table>
<table class='tabs'><tr><td>
<a href='/cgit/glusterfs.git/'>summary</a><a href='/cgit/glusterfs.git/refs/'>refs</a><a href='/cgit/glusterfs.git/log/'>log</a><a href='/cgit/glusterfs.git/tree/'>tree</a><a href='/cgit/glusterfs.git/commit/'>commit</a><a class='active' href='/cgit/glusterfs.git/diff/?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>diff</a><a href='/cgit/glusterfs.git/stats/'>stats</a></td><td class='form'><form class='right' method='get' action='/cgit/glusterfs.git/log/'>
<input type='hidden' name='id2' value='6ee84e00f0d96e292163ebad86b2e7521776dca1'/><select name='qt'>
<option value='grep'>log msg</option>
<option value='author'>author</option>
<option value='committer'>committer</option>
<option value='range'>range</option>
</select>
<input class='txt' type='search' size='10' name='q' value=''/>
<input type='submit' value='search'/>
</form>
</td></tr></table>
<div class='content'><div class='cgit-panel'><b>diff options</b><form method='get'><input type='hidden' name='id2' value='6ee84e00f0d96e292163ebad86b2e7521776dca1'/><table><tr><td colspan='2'/></tr><tr><td class='label'>context:</td><td class='ctrl'><select name='context' onchange='this.form.submit();'><option value='1'>1</option><option value='2'>2</option><option value='3' selected='selected'>3</option><option value='4'>4</option><option value='5'>5</option><option value='6'>6</option><option value='7'>7</option><option value='8'>8</option><option value='9'>9</option><option value='10'>10</option><option value='15'>15</option><option value='20'>20</option><option value='25'>25</option><option value='30'>30</option><option value='35'>35</option><option value='40'>40</option></select></td></tr><tr><td class='label'>space:</td><td class='ctrl'><select name='ignorews' onchange='this.form.submit();'><option value='0' selected='selected'>include</option><option value='1'>ignore</option></select></td></tr><tr><td class='label'>mode:</td><td class='ctrl'><select name='dt' onchange='this.form.submit();'><option value='0' selected='selected'>unified</option><option value='1'>ssdiff</option><option value='2'>stat only</option></select></td></tr><tr><td/><td class='ctrl'><noscript><input type='submit' value='reload'/></noscript></td></tr></table></form></div><div class='diffstat-header'><a href='/cgit/glusterfs.git/diff/?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>Diffstat</a></div><table summary='diffstat' class='diffstat'><tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/.clang-format?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>.clang-format</a></td><td class='right'>107</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.7%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.3%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/.github/ISSUE_TEMPLATE?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>.github/ISSUE_TEMPLATE</a></td><td class='right'>30</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/.github/PULL_REQUEST_TEMPLATE?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>.github/PULL_REQUEST_TEMPLATE</a></td><td class='right'>0</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 100.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/.github/RELEASE_TRACKER_TEMPLATE?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>.github/RELEASE_TRACKER_TEMPLATE</a></td><td class='right'>12</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/.github/stale.yml?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>.github/stale.yml</a></td><td class='right'>25</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/.gitignore?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>.gitignore</a></td><td class='right'>120</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.7%;'/><td class='rem' style='width: 0.1%;'/><td class='none' style='width: 99.2%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/.mailmap?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>.mailmap</a></td><td class='right'>43</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/.testignore?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>.testignore</a></td><td class='right'>64</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/COMMITMENT?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>COMMITMENT</a></td><td class='right'>46</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/CONTRIBUTING.md?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>CONTRIBUTING.md</a></td><td class='right'>114</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.7%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.3%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/COPYING-GPLV2?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>COPYING-GPLV2</a></td><td class='right'>339</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 2.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 97.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/COPYING-LGPLV3?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>COPYING-LGPLV3</a></td><td class='right'>165</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 98.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/COPYING.AGPL?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>COPYING.AGPL</a></td><td class='right'>661</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 4.3%;'/><td class='none' style='width: 95.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/COPYING.GPL?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>COPYING.GPL</a></td><td class='right'>674</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 4.3%;'/><td class='none' style='width: 95.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/INSTALL?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>INSTALL</a></td><td class='right'>35</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.1%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/MAINTAINERS?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>MAINTAINERS</a></td><td class='right'>510</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 3.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 96.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>Makefile.am</a></td><td class='right'>53</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/NEWS?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>NEWS</a></td><td class='right'>1</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 100.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/README?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>README</a></td><td class='right'>1</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 100.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/README.md?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>README.md</a></td><td class='right'>46</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/THANKS?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>THANKS</a></td><td class='right'>4</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 100.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/api/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>api/Makefile.am</a></td><td class='right'>1</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 100.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/api/examples/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>api/examples/Makefile.am</a></td><td class='right'>6</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 100.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/api/examples/README?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>api/examples/README</a></td><td class='right'>36</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/api/examples/autogen.sh?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>api/examples/autogen.sh</a></td><td class='right'>5</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 100.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/api/examples/configure.ac?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>api/examples/configure.ac</a></td><td class='right'>12</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/api/examples/getvolfile.py?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>api/examples/getvolfile.py</a></td><td class='right'>45</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/api/examples/glfsxmp.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>api/examples/glfsxmp.c</a></td><td class='right'>1811</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 11.7%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 88.3%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/api/src/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>api/src/Makefile.am</a></td><td class='right'>43</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/api/src/README.Symbol_Versions?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>api/src/README.Symbol_Versions</a></td><td class='right'>3</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 100.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/api/src/gfapi-messages.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>api/src/gfapi-messages.h</a></td><td class='right'>147</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.9%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.1%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/api/src/gfapi.aliases?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>api/src/gfapi.aliases</a></td><td class='right'>201</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 98.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/api/src/gfapi.map?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>api/src/gfapi.map</a></td><td class='right'>283</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.8%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 98.2%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/api/src/glfs-fops.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>api/src/glfs-fops.c</a></td><td class='right'>6445</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 41.5%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 58.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/api/src/glfs-handleops.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>api/src/glfs-handleops.c</a></td><td class='right'>2655</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 17.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 82.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/api/src/glfs-handles.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>api/src/glfs-handles.h</a></td><td class='right'>355</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 2.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 97.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/api/src/glfs-internal.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>api/src/glfs-internal.h</a></td><td class='right'>756</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 4.9%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 95.1%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/api/src/glfs-master.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>api/src/glfs-master.c</a></td><td class='right'>183</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 98.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/api/src/glfs-mem-types.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>api/src/glfs-mem-types.h</a></td><td class='right'>35</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/api/src/glfs-mgmt.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>api/src/glfs-mgmt.c</a></td><td class='right'>1049</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 6.7%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 93.3%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/api/src/glfs-resolve.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>api/src/glfs-resolve.c</a></td><td class='right'>1199</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 7.7%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 92.3%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/api/src/glfs.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>api/src/glfs.c</a></td><td class='right'>1806</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 11.6%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 88.4%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/api/src/glfs.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>api/src/glfs.h</a></td><td class='right'>1485</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 9.6%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 90.4%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/argp-standalone/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>argp-standalone/Makefile.am</a></td><td class='right'>38</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.2%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/argp-standalone/acinclude.m4?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>argp-standalone/acinclude.m4</a></td><td class='right'>1084</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 7.0%;'/><td class='none' style='width: 93.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/argp-standalone/argp-ba.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>argp-standalone/argp-ba.c</a></td><td class='right'>26</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.2%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/argp-standalone/argp-eexst.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>argp-standalone/argp-eexst.c</a></td><td class='right'>36</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.2%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/argp-standalone/argp-fmtstream.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>argp-standalone/argp-fmtstream.c</a></td><td class='right'>475</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 3.1%;'/><td class='none' style='width: 96.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/argp-standalone/argp-fmtstream.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>argp-standalone/argp-fmtstream.h</a></td><td class='right'>319</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 2.1%;'/><td class='none' style='width: 97.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/argp-standalone/argp-help.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>argp-standalone/argp-help.c</a></td><td class='right'>1849</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 11.9%;'/><td class='none' style='width: 88.1%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/argp-standalone/argp-namefrob.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>argp-standalone/argp-namefrob.h</a></td><td class='right'>96</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.6%;'/><td class='none' style='width: 99.4%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/argp-standalone/argp-parse.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>argp-standalone/argp-parse.c</a></td><td class='right'>1305</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 8.4%;'/><td class='none' style='width: 91.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/argp-standalone/argp-pv.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>argp-standalone/argp-pv.c</a></td><td class='right'>25</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.2%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/argp-standalone/argp-pvh.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>argp-standalone/argp-pvh.c</a></td><td class='right'>32</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.2%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/argp-standalone/argp.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>argp-standalone/argp.h</a></td><td class='right'>602</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 3.9%;'/><td class='none' style='width: 96.1%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='del'><a href='/cgit/glusterfs.git/diff/argp-standalone/autogen.sh?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>argp-standalone/autogen.sh</a></td><td class='right'>6</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 100.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/argp-standalone/configure.ac?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>argp-standalone/configure.ac</a></td><td class='right'>100</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.6%;'/><td class='none' style='width: 99.4%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/argp-standalone/mempcpy.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>argp-standalone/mempcpy.c</a></td><td class='right'>21</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.1%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/argp-standalone/strcasecmp.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>argp-standalone/strcasecmp.c</a></td><td class='right'>29</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.2%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/argp-standalone/strchrnul.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>argp-standalone/strchrnul.c</a></td><td class='right'>23</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.1%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/argp-standalone/strndup.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>argp-standalone/strndup.c</a></td><td class='right'>34</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.2%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/argp-standalone/vsnprintf.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>argp-standalone/vsnprintf.c</a></td><td class='right'>839</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 5.4%;'/><td class='none' style='width: 94.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='upd'><a href='/cgit/glusterfs.git/diff/autogen.sh?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>autogen.sh</a></td><td class='right'>96</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.6%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.4%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/booster/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>booster/Makefile.am</a></td><td class='right'>1</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 100.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/booster/src/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>booster/src/Makefile.am</a></td><td class='right'>21</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.1%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/booster/src/booster-fd.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>booster/src/booster-fd.c</a></td><td class='right'>342</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 2.2%;'/><td class='none' style='width: 97.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/booster/src/booster-fd.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>booster/src/booster-fd.h</a></td><td class='right'>84</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.5%;'/><td class='none' style='width: 99.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/booster/src/booster.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>booster/src/booster.c</a></td><td class='right'>3172</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 20.4%;'/><td class='none' style='width: 79.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/booster/src/booster_fstab.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>booster/src/booster_fstab.c</a></td><td class='right'>452</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 2.9%;'/><td class='none' style='width: 97.1%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/booster/src/booster_fstab.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>booster/src/booster_fstab.h</a></td><td class='right'>83</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.5%;'/><td class='none' style='width: 99.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/booster/src/booster_stat.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>booster/src/booster_stat.c</a></td><td class='right'>188</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 1.2%;'/><td class='none' style='width: 98.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/build-aux/checkpatch.pl?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>build-aux/checkpatch.pl</a></td><td class='right'>4326</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 27.8%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 72.2%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/build-aux/config.guess.dist?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>build-aux/config.guess.dist</a></td><td class='right'>14</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/build-aux/config.sub.dist?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>build-aux/config.sub.dist</a></td><td class='right'>14</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/build-aux/pkg-version?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>build-aux/pkg-version</a></td><td class='right'>64</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/cli/src/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>cli/src/Makefile.am</a></td><td class='right'>35</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.1%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/cli/src/cli-cmd-global.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>cli/src/cli-cmd-global.c</a></td><td class='right'>195</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 98.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/cli/src/cli-cmd-misc.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>cli/src/cli-cmd-misc.c</a></td><td class='right'>151</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.5%;'/><td class='rem' style='width: 0.5%;'/><td class='none' style='width: 99.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/cli/src/cli-cmd-parser.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>cli/src/cli-cmd-parser.c</a></td><td class='right'>6273</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 36.3%;'/><td class='rem' style='width: 4.0%;'/><td class='none' style='width: 59.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/cli/src/cli-cmd-peer.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>cli/src/cli-cmd-peer.c</a></td><td class='right'>409</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.6%;'/><td class='rem' style='width: 1.0%;'/><td class='none' style='width: 97.4%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/cli/src/cli-cmd-snapshot.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>cli/src/cli-cmd-snapshot.c</a></td><td class='right'>135</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.9%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.1%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/cli/src/cli-cmd-system.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>cli/src/cli-cmd-system.c</a></td><td class='right'>624</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 4.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 96.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/cli/src/cli-cmd-volume.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>cli/src/cli-cmd-volume.c</a></td><td class='right'>3518</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 19.2%;'/><td class='rem' style='width: 3.4%;'/><td class='none' style='width: 77.4%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/cli/src/cli-cmd.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>cli/src/cli-cmd.c</a></td><td class='right'>560</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 2.0%;'/><td class='rem' style='width: 1.6%;'/><td class='none' style='width: 96.4%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/cli/src/cli-cmd.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>cli/src/cli-cmd.h</a></td><td class='right'>145</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.6%;'/><td class='rem' style='width: 0.3%;'/><td class='none' style='width: 99.1%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/cli/src/cli-mem-types.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>cli/src/cli-mem-types.h</a></td><td class='right'>40</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.2%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/cli/src/cli-quotad-client.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>cli/src/cli-quotad-client.c</a></td><td class='right'>146</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.9%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.1%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/cli/src/cli-quotad-client.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>cli/src/cli-quotad-client.h</a></td><td class='right'>29</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/cli/src/cli-rl.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>cli/src/cli-rl.c</a></td><td class='right'>528</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.7%;'/><td class='rem' style='width: 1.7%;'/><td class='none' style='width: 96.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/cli/src/cli-rpc-ops.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>cli/src/cli-rpc-ops.c</a></td><td class='right'>10949</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 70.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 29.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/cli/src/cli-xml-output.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>cli/src/cli-xml-output.c</a></td><td class='right'>5839</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 37.6%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 62.4%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/cli/src/cli.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>cli/src/cli.c</a></td><td class='right'>1086</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 4.8%;'/><td class='rem' style='width: 2.2%;'/><td class='none' style='width: 93.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/cli/src/cli.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>cli/src/cli.h</a></td><td class='right'>577</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 2.8%;'/><td class='rem' style='width: 0.9%;'/><td class='none' style='width: 96.3%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/cli/src/cli3_1-cops.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>cli/src/cli3_1-cops.c</a></td><td class='right'>1802</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 11.6%;'/><td class='none' style='width: 88.4%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/cli/src/input.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>cli/src/input.c</a></td><td class='right'>144</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.4%;'/><td class='rem' style='width: 0.5%;'/><td class='none' style='width: 99.1%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/cli/src/registry.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>cli/src/registry.c</a></td><td class='right'>519</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.7%;'/><td class='rem' style='width: 1.7%;'/><td class='none' style='width: 96.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='del'><a href='/cgit/glusterfs.git/diff/commit.sh?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>commit.sh</a></td><td class='right'>4</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 100.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/configure.ac?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>configure.ac</a></td><td class='right'>1716</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 9.7%;'/><td class='rem' style='width: 1.4%;'/><td class='none' style='width: 89.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/contrib/aclocal/mkdirp.m4?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>contrib/aclocal/mkdirp.m4</a></td><td class='right'>146</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.9%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.1%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/contrib/aclocal/python.m4?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>contrib/aclocal/python.m4</a></td><td class='right'>209</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 98.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/contrib/apple/daemon.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>contrib/apple/daemon.c</a></td><td class='right'>92</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.6%;'/><td class='none' style='width: 99.4%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/contrib/apple/daemon.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>contrib/apple/daemon.h</a></td><td class='right'>20</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.1%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/contrib/fuse-include/fuse-misc.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>contrib/fuse-include/fuse-misc.h</a></td><td class='right'>3</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 100.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/contrib/fuse-include/fuse-mount.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>contrib/fuse-include/fuse-mount.h</a></td><td class='right'>6</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 100.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/contrib/fuse-include/fuse_kernel.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>contrib/fuse-include/fuse_kernel.h</a></td><td class='right'>578</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 2.5%;'/><td class='rem' style='width: 1.2%;'/><td class='none' style='width: 96.3%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/contrib/fuse-include/fuse_kernel_macfuse.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>contrib/fuse-include/fuse_kernel_macfuse.h</a></td><td class='right'>461</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.4%;'/><td class='rem' style='width: 1.5%;'/><td class='none' style='width: 97.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='mov'><a href='/cgit/glusterfs.git/diff/contrib/fuse-include/mount_util.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>contrib/fuse-include/mount_util.h</a> (renamed from contrib/fuse-util/mount_util.h)</td><td class='right'>0</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 100.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/contrib/fuse-lib/misc.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>contrib/fuse-lib/misc.c</a></td><td class='right'>6</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 100.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/contrib/fuse-lib/mount-common.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>contrib/fuse-lib/mount-common.c</a></td><td class='right'>282</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.8%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 98.2%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/contrib/fuse-lib/mount-gluster-compat.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>contrib/fuse-lib/mount-gluster-compat.h</a></td><td class='right'>105</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.7%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.3%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/contrib/fuse-lib/mount.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>contrib/fuse-lib/mount.c</a></td><td class='right'>830</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 2.3%;'/><td class='rem' style='width: 3.0%;'/><td class='none' style='width: 94.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/contrib/fuse-util/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>contrib/fuse-util/Makefile.am</a></td><td class='right'>8</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/contrib/fuse-util/fusermount.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>contrib/fuse-util/fusermount.c</a></td><td class='right'>204</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.9%;'/><td class='rem' style='width: 0.4%;'/><td class='none' style='width: 98.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/contrib/fuse-util/mount_util.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>contrib/fuse-util/mount_util.c</a></td><td class='right'>64</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/contrib/libexecinfo/execinfo.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>contrib/libexecinfo/execinfo.c</a></td><td class='right'>442</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 2.8%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 97.2%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/contrib/libexecinfo/execinfo_compat.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>contrib/libexecinfo/execinfo_compat.h</a></td><td class='right'>51</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/contrib/libgen/basename_r.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>contrib/libgen/basename_r.c</a></td><td class='right'>40</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/contrib/libgen/dirname_r.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>contrib/libgen/dirname_r.c</a></td><td class='right'>243</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.6%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 98.4%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/contrib/macfuse/fuse_param.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>contrib/macfuse/fuse_param.h</a></td><td class='right'>97</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.4%;'/><td class='rem' style='width: 0.3%;'/><td class='none' style='width: 99.4%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/contrib/macfuse/mount_darwin.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>contrib/macfuse/mount_darwin.c</a></td><td class='right'>460</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.2%;'/><td class='rem' style='width: 1.8%;'/><td class='none' style='width: 97.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/contrib/md5/md5.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>contrib/md5/md5.c</a></td><td class='right'>310</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 2.0%;'/><td class='none' style='width: 98.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/contrib/md5/md5.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>contrib/md5/md5.h</a></td><td class='right'>78</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.5%;'/><td class='none' style='width: 99.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/contrib/mount/mntent.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>contrib/mount/mntent.c</a></td><td class='right'>260</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.7%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 98.3%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/contrib/mount/mntent_compat.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>contrib/mount/mntent_compat.h</a></td><td class='right'>37</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/contrib/rbtree/rb.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>contrib/rbtree/rb.c</a></td><td class='right'>34</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.1%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/contrib/rbtree/rb.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>contrib/rbtree/rb.h</a></td><td class='right'>36</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.1%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/contrib/timer-wheel/find_last_bit.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>contrib/timer-wheel/find_last_bit.c</a></td><td class='right'>61</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/contrib/timer-wheel/timer-wheel.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>contrib/timer-wheel/timer-wheel.c</a></td><td class='right'>374</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 2.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 97.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/contrib/timer-wheel/timer-wheel.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>contrib/timer-wheel/timer-wheel.h</a></td><td class='right'>77</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.5%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/contrib/umountd/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>contrib/umountd/Makefile.am</a></td><td class='right'>11</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/contrib/umountd/umountd.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>contrib/umountd/umountd.c</a></td><td class='right'>255</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.6%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 98.4%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/contrib/userspace-rcu/rculist-extra.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>contrib/userspace-rcu/rculist-extra.h</a></td><td class='right'>42</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/contrib/userspace-rcu/static-wfcqueue.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>contrib/userspace-rcu/static-wfcqueue.h</a></td><td class='right'>685</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 4.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 95.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/contrib/userspace-rcu/static-wfstack.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>contrib/userspace-rcu/static-wfstack.h</a></td><td class='right'>455</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 2.9%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 97.1%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/contrib/userspace-rcu/wfcqueue.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>contrib/userspace-rcu/wfcqueue.h</a></td><td class='right'>216</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 98.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/contrib/userspace-rcu/wfstack.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>contrib/userspace-rcu/wfstack.h</a></td><td class='right'>178</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 98.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/contrib/uuid/clear.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>contrib/uuid/clear.c</a></td><td class='right'>43</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.3%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/contrib/uuid/compare.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>contrib/uuid/compare.c</a></td><td class='right'>55</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.4%;'/><td class='none' style='width: 99.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/contrib/uuid/copy.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>contrib/uuid/copy.c</a></td><td class='right'>45</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.3%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/contrib/uuid/gen_uuid.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>contrib/uuid/gen_uuid.c</a></td><td class='right'>679</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 4.4%;'/><td class='none' style='width: 95.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/contrib/uuid/gen_uuid_nt.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>contrib/uuid/gen_uuid_nt.c</a></td><td class='right'>92</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.6%;'/><td class='none' style='width: 99.4%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/contrib/uuid/isnull.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>contrib/uuid/isnull.c</a></td><td class='right'>48</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.3%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/contrib/uuid/pack.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>contrib/uuid/pack.c</a></td><td class='right'>69</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.4%;'/><td class='none' style='width: 99.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/contrib/uuid/parse.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>contrib/uuid/parse.c</a></td><td class='right'>79</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.5%;'/><td class='none' style='width: 99.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/contrib/uuid/tst_uuid.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>contrib/uuid/tst_uuid.c</a></td><td class='right'>180</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 1.2%;'/><td class='none' style='width: 98.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/contrib/uuid/unpack.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>contrib/uuid/unpack.c</a></td><td class='right'>63</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.4%;'/><td class='none' style='width: 99.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/contrib/uuid/unparse.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>contrib/uuid/unparse.c</a></td><td class='right'>76</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.5%;'/><td class='none' style='width: 99.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/contrib/uuid/uuid.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>contrib/uuid/uuid.h</a></td><td class='right'>104</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.7%;'/><td class='none' style='width: 99.3%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/contrib/uuid/uuidP.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>contrib/uuid/uuidP.h</a></td><td class='right'>63</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.4%;'/><td class='none' style='width: 99.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/contrib/uuid/uuid_time.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>contrib/uuid/uuid_time.c</a></td><td class='right'>171</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 1.1%;'/><td class='none' style='width: 98.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/contrib/uuid/uuid_types.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>contrib/uuid/uuid_types.h</a></td><td class='right'>50</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.3%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/contrib/uuid/uuidd.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>contrib/uuid/uuidd.h</a></td><td class='right'>54</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.3%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/contrib/xxhash/xxhash.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>contrib/xxhash/xxhash.c</a></td><td class='right'>1029</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 6.6%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 93.4%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/contrib/xxhash/xxhash.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>contrib/xxhash/xxhash.h</a></td><td class='right'>328</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 2.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 97.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/contrib/xxhash/xxhsum.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>contrib/xxhash/xxhsum.c</a></td><td class='right'>1301</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 8.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 91.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/doc/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>doc/Makefile.am</a></td><td class='right'>18</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.1%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/doc/README.md?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>doc/README.md</a></td><td class='right'>26</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/doc/authentication.txt?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>doc/authentication.txt</a></td><td class='right'>112</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.7%;'/><td class='none' style='width: 99.3%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/doc/booster.txt?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>doc/booster.txt</a></td><td class='right'>54</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.3%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/doc/coding-standard.pdf?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>doc/coding-standard.pdf</a></td><td class='right'>bin</td><td class='graph'>68627 -> 0 bytes<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/doc/coding-standard.tex?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>doc/coding-standard.tex</a></td><td class='right'>385</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 2.5%;'/><td class='none' style='width: 97.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/doc/debugging/analyzing-regression-cores.md?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>doc/debugging/analyzing-regression-cores.md</a></td><td class='right'>54</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/doc/debugging/gfid-to-path.md?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>doc/debugging/gfid-to-path.md</a></td><td class='right'>68</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/doc/debugging/mem-alloc-list.md?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>doc/debugging/mem-alloc-list.md</a></td><td class='right'>19</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/doc/debugging/split-brain.md?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>doc/debugging/split-brain.md</a></td><td class='right'>264</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.7%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 98.3%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/doc/debugging/statedump.md?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>doc/debugging/statedump.md</a></td><td class='right'>414</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 2.7%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 97.3%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/doc/developer-guide/Language-Bindings.md?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>doc/developer-guide/Language-Bindings.md</a></td><td class='right'>45</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/doc/developer-guide/README.md?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>doc/developer-guide/README.md</a></td><td class='right'>81</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.5%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/doc/developer-guide/Using-Gluster-Test-Framework.md?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>doc/developer-guide/Using-Gluster-Test-Framework.md</a></td><td class='right'>271</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.7%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 98.3%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/doc/developer-guide/adding-fops.md?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>doc/developer-guide/adding-fops.md</a></td><td class='right'>18</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/doc/developer-guide/afr-locks-evolution.md?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>doc/developer-guide/afr-locks-evolution.md</a></td><td class='right'>91</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.6%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.4%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/doc/developer-guide/afr-self-heal-daemon.md?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>doc/developer-guide/afr-self-heal-daemon.md</a></td><td class='right'>92</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.6%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.4%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/doc/developer-guide/afr.md?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>doc/developer-guide/afr.md</a></td><td class='right'>191</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 98.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/doc/developer-guide/brickmux-thread-reduction.md?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>doc/developer-guide/brickmux-thread-reduction.md</a></td><td class='right'>64</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/doc/developer-guide/coding-standard.md?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>doc/developer-guide/coding-standard.md</a></td><td class='right'>697</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 4.5%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 95.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/doc/developer-guide/commit-guidelines.md?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>doc/developer-guide/commit-guidelines.md</a></td><td class='right'>136</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.9%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.1%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/doc/developer-guide/daemon-management-framework.md?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>doc/developer-guide/daemon-management-framework.md</a></td><td class='right'>38</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/doc/developer-guide/datastructure-inode.md?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>doc/developer-guide/datastructure-inode.md</a></td><td class='right'>221</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 98.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/doc/developer-guide/datastructure-iobuf.md?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>doc/developer-guide/datastructure-iobuf.md</a></td><td class='right'>259</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.7%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 98.3%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/doc/developer-guide/datastructure-mem-pool.md?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>doc/developer-guide/datastructure-mem-pool.md</a></td><td class='right'>124</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.8%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.2%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/doc/developer-guide/dirops-transactions-in-dht.md?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>doc/developer-guide/dirops-transactions-in-dht.md</a></td><td class='right'>273</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.8%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 98.2%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/doc/developer-guide/ec-implementation.md?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>doc/developer-guide/ec-implementation.md</a></td><td class='right'>588</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 3.8%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 96.2%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/doc/developer-guide/fuse-interrupt.md?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>doc/developer-guide/fuse-interrupt.md</a></td><td class='right'>211</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 98.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/doc/developer-guide/gfapi-symbol-versions.md?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>doc/developer-guide/gfapi-symbol-versions.md</a></td><td class='right'>270</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.7%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 98.3%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/doc/developer-guide/identifying-resource-leaks.md?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>doc/developer-guide/identifying-resource-leaks.md</a></td><td class='right'>200</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 98.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/doc/developer-guide/logging-guidelines.md?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>doc/developer-guide/logging-guidelines.md</a></td><td class='right'>132</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.8%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.2%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/doc/developer-guide/network_compression.md?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>doc/developer-guide/network_compression.md</a></td><td class='right'>71</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.5%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/doc/developer-guide/options-to-contribute.md?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>doc/developer-guide/options-to-contribute.md</a></td><td class='right'>212</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 98.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/doc/developer-guide/posix.md?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>doc/developer-guide/posix.md</a></td><td class='right'>59</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='mov'><a href='/cgit/glusterfs.git/diff/doc/developer-guide/rpc-for-glusterfs.changes-done.txt?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>doc/developer-guide/rpc-for-glusterfs.changes-done.txt</a> (renamed from doc/rpc-for-glusterfs.changes-done.txt)</td><td class='right'>0</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 100.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/doc/developer-guide/rpc-for-glusterfs.new-versions.md?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>doc/developer-guide/rpc-for-glusterfs.new-versions.md</a></td><td class='right'>32</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/doc/developer-guide/syncop.md?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>doc/developer-guide/syncop.md</a></td><td class='right'>72</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.5%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/doc/developer-guide/thread-naming.md?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>doc/developer-guide/thread-naming.md</a></td><td class='right'>104</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.7%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.3%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/doc/developer-guide/translator-development.md?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>doc/developer-guide/translator-development.md</a></td><td class='right'>683</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 4.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 95.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/doc/developer-guide/unittest.md?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>doc/developer-guide/unittest.md</a></td><td class='right'>228</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.5%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 98.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/doc/developer-guide/versioning.md?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>doc/developer-guide/versioning.md</a></td><td class='right'>44</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/doc/developer-guide/write-behind.md?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>doc/developer-guide/write-behind.md</a></td><td class='right'>56</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/doc/developer-guide/writing-a-cloudsync-plugin.md?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>doc/developer-guide/writing-a-cloudsync-plugin.md</a></td><td class='right'>164</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 98.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/doc/developer-guide/xlator-classification.md?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>doc/developer-guide/xlator-classification.md</a></td><td class='right'>221</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 98.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/doc/errno.list.bsd.txt?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>doc/errno.list.bsd.txt</a></td><td class='right'>376</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 2.4%;'/><td class='none' style='width: 97.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/doc/errno.list.linux.txt?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>doc/errno.list.linux.txt</a></td><td class='right'>1586</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 10.2%;'/><td class='none' style='width: 89.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/doc/errno.list.macosx.txt?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>doc/errno.list.macosx.txt</a></td><td class='right'>1513</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 9.7%;'/><td class='none' style='width: 90.3%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/doc/errno.list.solaris.txt?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>doc/errno.list.solaris.txt</a></td><td class='right'>206</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 1.3%;'/><td class='none' style='width: 98.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/doc/examples/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>doc/examples/Makefile.am</a></td><td class='right'>8</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.1%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/doc/examples/README?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>doc/examples/README</a></td><td class='right'>13</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.1%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/doc/examples/filter.vol?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>doc/examples/filter.vol</a></td><td class='right'>23</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.1%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/doc/examples/io-cache.vol?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>doc/examples/io-cache.vol</a></td><td class='right'>25</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.2%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/doc/examples/io-threads.vol?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>doc/examples/io-threads.vol</a></td><td class='right'>21</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.1%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/doc/examples/posix-locks.vol?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>doc/examples/posix-locks.vol</a></td><td class='right'>20</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.1%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/doc/examples/protocol-client.vol?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>doc/examples/protocol-client.vol</a></td><td class='right'>17</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.1%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/doc/examples/protocol-server.vol?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>doc/examples/protocol-server.vol</a></td><td class='right'>25</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.2%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/doc/examples/read-ahead.vol?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>doc/examples/read-ahead.vol</a></td><td class='right'>22</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.1%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/doc/examples/replicate.vol?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>doc/examples/replicate.vol</a></td><td class='right'>119</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.8%;'/><td class='none' style='width: 99.2%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/doc/examples/stripe.vol?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>doc/examples/stripe.vol</a></td><td class='right'>121</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.8%;'/><td class='none' style='width: 99.2%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/doc/examples/trace.vol?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>doc/examples/trace.vol</a></td><td class='right'>16</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.1%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/doc/examples/trash.vol?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>doc/examples/trash.vol</a></td><td class='right'>20</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.1%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/doc/examples/unify.vol?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>doc/examples/unify.vol</a></td><td class='right'>178</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 1.1%;'/><td class='none' style='width: 98.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/doc/examples/write-behind.vol?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>doc/examples/write-behind.vol</a></td><td class='right'>26</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.2%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/doc/features/ctime.md?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>doc/features/ctime.md</a></td><td class='right'>68</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/doc/features/ganesha-ha.md?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>doc/features/ganesha-ha.md</a></td><td class='right'>43</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/doc/get_put_api_using_xattr.txt?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>doc/get_put_api_using_xattr.txt</a></td><td class='right'>22</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.1%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/doc/gluster.8?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>doc/gluster.8</a></td><td class='right'>375</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.9%;'/><td class='rem' style='width: 0.5%;'/><td class='none' style='width: 97.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/doc/glusterd.8?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>doc/glusterd.8</a></td><td class='right'>70</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.3%;'/><td class='none' style='width: 99.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/doc/glusterd.vol?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>doc/glusterd.vol</a></td><td class='right'>9</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.1%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/doc/glusterfs-volgen.8?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>doc/glusterfs-volgen.8</a></td><td class='right'>82</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.5%;'/><td class='none' style='width: 99.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/doc/glusterfs.8?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>doc/glusterfs.8</a></td><td class='right'>160</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.7%;'/><td class='rem' style='width: 0.4%;'/><td class='none' style='width: 99.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/doc/glusterfs.vol.sample?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>doc/glusterfs.vol.sample</a></td><td class='right'>61</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.4%;'/><td class='none' style='width: 99.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/doc/glusterfsd.8?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>doc/glusterfsd.8</a></td><td class='right'>147</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.9%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.1%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/doc/glusterfsd.vol.sample?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>doc/glusterfsd.vol.sample</a></td><td class='right'>47</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.3%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/doc/hacker-guide/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>doc/hacker-guide/Makefile.am</a></td><td class='right'>8</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.1%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/doc/hacker-guide/adding-fops.txt?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>doc/hacker-guide/adding-fops.txt</a></td><td class='right'>33</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.2%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/doc/hacker-guide/bdb.txt?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>doc/hacker-guide/bdb.txt</a></td><td class='right'>70</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.5%;'/><td class='none' style='width: 99.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/doc/hacker-guide/call-stub.txt?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>doc/hacker-guide/call-stub.txt</a></td><td class='right'>1033</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 6.6%;'/><td class='none' style='width: 93.4%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/doc/hacker-guide/hacker-guide.tex?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>doc/hacker-guide/hacker-guide.tex</a></td><td class='right'>309</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 2.0%;'/><td class='none' style='width: 98.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/doc/hacker-guide/lock-ahead.txt?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>doc/hacker-guide/lock-ahead.txt</a></td><td class='right'>80</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.5%;'/><td class='none' style='width: 99.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/doc/hacker-guide/posix.txt?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>doc/hacker-guide/posix.txt</a></td><td class='right'>59</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.4%;'/><td class='none' style='width: 99.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/doc/hacker-guide/replicate.txt?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>doc/hacker-guide/replicate.txt</a></td><td class='right'>206</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 1.3%;'/><td class='none' style='width: 98.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/doc/hacker-guide/write-behind.txt?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>doc/hacker-guide/write-behind.txt</a></td><td class='right'>45</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.3%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/doc/handling-options.txt?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>doc/handling-options.txt</a></td><td class='right'>13</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.1%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/doc/mac-related-xattrs.txt?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>doc/mac-related-xattrs.txt</a></td><td class='right'>21</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.1%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/doc/mount.glusterfs.8?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>doc/mount.glusterfs.8</a></td><td class='right'>159</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.8%;'/><td class='rem' style='width: 0.2%;'/><td class='none' style='width: 99.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/doc/porting_guide.txt?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>doc/porting_guide.txt</a></td><td class='right'>45</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.3%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/doc/qa/qa-client.vol?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>doc/qa/qa-client.vol</a></td><td class='right'>170</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 1.1%;'/><td class='none' style='width: 98.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/doc/qa/qa-high-avail-client.vol?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>doc/qa/qa-high-avail-client.vol</a></td><td class='right'>17</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.1%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/doc/qa/qa-high-avail-server.vol?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>doc/qa/qa-high-avail-server.vol</a></td><td class='right'>344</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 2.2%;'/><td class='none' style='width: 97.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/doc/qa/qa-server.vol?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>doc/qa/qa-server.vol</a></td><td class='right'>284</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 1.8%;'/><td class='none' style='width: 98.2%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/doc/replicate.lyx?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>doc/replicate.lyx</a></td><td class='right'>797</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 5.1%;'/><td class='none' style='width: 94.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/doc/replicate.pdf?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>doc/replicate.pdf</a></td><td class='right'>bin</td><td class='graph'>109057 -> 0 bytes<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/doc/solaris-related-xattrs.txt?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>doc/solaris-related-xattrs.txt</a></td><td class='right'>44</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.3%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/doc/stat-prefetch-design.txt?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>doc/stat-prefetch-design.txt</a></td><td class='right'>154</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 1.0%;'/><td class='none' style='width: 99.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/doc/translator-options.txt?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>doc/translator-options.txt</a></td><td class='right'>224</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 1.4%;'/><td class='none' style='width: 98.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/doc/user-guide/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>doc/user-guide/Makefile.am</a></td><td class='right'>3</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 100.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/doc/user-guide/advanced-stripe.odg?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>doc/user-guide/advanced-stripe.odg</a></td><td class='right'>bin</td><td class='graph'>12648 -> 0 bytes<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/doc/user-guide/advanced-stripe.pdf?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>doc/user-guide/advanced-stripe.pdf</a></td><td class='right'>bin</td><td class='graph'>13382 -> 0 bytes<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/doc/user-guide/colonO-icon.jpg?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>doc/user-guide/colonO-icon.jpg</a></td><td class='right'>bin</td><td class='graph'>779 -> 0 bytes<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/doc/user-guide/fdl.texi?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>doc/user-guide/fdl.texi</a></td><td class='right'>454</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 2.9%;'/><td class='none' style='width: 97.1%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/doc/user-guide/fuse.odg?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>doc/user-guide/fuse.odg</a></td><td class='right'>bin</td><td class='graph'>13190 -> 0 bytes<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/doc/user-guide/fuse.pdf?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>doc/user-guide/fuse.pdf</a></td><td class='right'>bin</td><td class='graph'>14948 -> 0 bytes<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/doc/user-guide/ha.odg?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>doc/user-guide/ha.odg</a></td><td class='right'>bin</td><td class='graph'>37290 -> 0 bytes<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/doc/user-guide/ha.pdf?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>doc/user-guide/ha.pdf</a></td><td class='right'>bin</td><td class='graph'>19403 -> 0 bytes<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/doc/user-guide/stripe.odg?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>doc/user-guide/stripe.odg</a></td><td class='right'>bin</td><td class='graph'>10188 -> 0 bytes<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/doc/user-guide/stripe.pdf?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>doc/user-guide/stripe.pdf</a></td><td class='right'>bin</td><td class='graph'>11941 -> 0 bytes<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/doc/user-guide/unify.odg?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>doc/user-guide/unify.odg</a></td><td class='right'>bin</td><td class='graph'>12955 -> 0 bytes<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/doc/user-guide/unify.pdf?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>doc/user-guide/unify.pdf</a></td><td class='right'>bin</td><td class='graph'>18969 -> 0 bytes<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/doc/user-guide/user-guide.info?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>doc/user-guide/user-guide.info</a></td><td class='right'>2697</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 17.4%;'/><td class='none' style='width: 82.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/doc/user-guide/user-guide.pdf?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>doc/user-guide/user-guide.pdf</a></td><td class='right'>bin</td><td class='graph'>353986 -> 0 bytes<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/doc/user-guide/user-guide.texi?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>doc/user-guide/user-guide.texi</a></td><td class='right'>2246</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 14.5%;'/><td class='none' style='width: 85.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/doc/user-guide/xlator.odg?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>doc/user-guide/xlator.odg</a></td><td class='right'>bin</td><td class='graph'>12169 -> 0 bytes<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/doc/user-guide/xlator.pdf?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>doc/user-guide/xlator.pdf</a></td><td class='right'>bin</td><td class='graph'>14358 -> 0 bytes<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/events/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>events/Makefile.am</a></td><td class='right'>8</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/events/eventskeygen.py?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>events/eventskeygen.py</a></td><td class='right'>243</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.6%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 98.4%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/events/src/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>events/src/Makefile.am</a></td><td class='right'>41</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/events/src/__init__.py?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>events/src/__init__.py</a></td><td class='right'>10</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/events/src/eventsapiconf.py.in?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>events/src/eventsapiconf.py.in</a></td><td class='right'>59</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/events/src/eventsconfig.json?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>events/src/eventsconfig.json</a></td><td class='right'>5</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 100.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/events/src/gf_event.py?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>events/src/gf_event.py</a></td><td class='right'>60</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/events/src/glustereventsd.py?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>events/src/glustereventsd.py</a></td><td class='right'>159</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/events/src/handlers.py?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>events/src/handlers.py</a></td><td class='right'>40</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/events/src/peer_eventsapi.py?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>events/src/peer_eventsapi.py</a></td><td class='right'>669</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 4.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 95.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/events/src/utils.py?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>events/src/utils.py</a></td><td class='right'>445</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 2.9%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 97.1%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/events/tools/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>events/tools/Makefile.am</a></td><td class='right'>6</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 100.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/events/tools/eventsdash.py?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>events/tools/eventsdash.py</a></td><td class='right'>75</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.5%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/extras/LinuxRPM/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/LinuxRPM/Makefile.am</a></td><td class='right'>55</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/extras/LinuxRPM/make_glusterrpms?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/LinuxRPM/make_glusterrpms</a></td><td class='right'>9</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/extras/MacOSX/Portfile?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/MacOSX/Portfile</a></td><td class='right'>26</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.2%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/extras/MacOSX/README.MacOSX?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/MacOSX/README.MacOSX</a></td><td class='right'>84</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.5%;'/><td class='none' style='width: 99.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/extras/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/Makefile.am</a></td><td class='right'>76</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.5%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/extras/Solaris/README.solaris?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/Solaris/README.solaris</a></td><td class='right'>2</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 100.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/extras/Ubuntu/README.Ubuntu?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/Ubuntu/README.Ubuntu</a></td><td class='right'>26</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/extras/Ubuntu/glusterfs-server.conf?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/Ubuntu/glusterfs-server.conf</a></td><td class='right'>10</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/extras/Ubuntu/mounting-glusterfs.conf?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/Ubuntu/mounting-glusterfs.conf</a></td><td class='right'>6</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 100.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/extras/backend-cleanup.sh?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/backend-cleanup.sh</a></td><td class='right'>4</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 100.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/extras/benchmarking/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/benchmarking/Makefile.am</a></td><td class='right'>4</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 100.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/extras/benchmarking/glfs-bm.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/benchmarking/glfs-bm.c</a></td><td class='right'>733</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.5%;'/><td class='rem' style='width: 3.2%;'/><td class='none' style='width: 95.3%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/extras/benchmarking/rdd.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/benchmarking/rdd.c</a></td><td class='right'>953</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 3.4%;'/><td class='rem' style='width: 2.7%;'/><td class='none' style='width: 93.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/extras/check_goto.pl?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/check_goto.pl</a></td><td class='right'>45</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/extras/clang-checker.sh?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/clang-checker.sh</a></td><td class='right'>301</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.9%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 98.1%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/extras/clear_xattrs.sh?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/clear_xattrs.sh</a></td><td class='right'>53</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/extras/cliutils/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/cliutils/Makefile.am</a></td><td class='right'>4</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 100.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/extras/cliutils/README.md?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/cliutils/README.md</a></td><td class='right'>233</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.5%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 98.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/extras/cliutils/__init__.py?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/cliutils/__init__.py</a></td><td class='right'>31</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/extras/cliutils/cliutils.py?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/cliutils/cliutils.py</a></td><td class='right'>237</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.5%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 98.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/extras/collect-system-stats.sh?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/collect-system-stats.sh</a></td><td class='right'>52</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/extras/command-completion/Makefile?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/command-completion/Makefile</a></td><td class='right'>6</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 100.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/extras/command-completion/README?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/command-completion/README</a></td><td class='right'>5</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 100.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/extras/command-completion/gluster.bash?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/command-completion/gluster.bash</a></td><td class='right'>492</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 3.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 96.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/extras/control-cpu-load.sh?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/control-cpu-load.sh</a></td><td class='right'>116</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.7%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.3%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/extras/control-mem.sh?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/control-mem.sh</a></td><td class='right'>128</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.8%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.2%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/extras/create_new_xlator/README.md?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/create_new_xlator/README.md</a></td><td class='right'>24</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/extras/create_new_xlator/generate_xlator.py?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/create_new_xlator/generate_xlator.py</a></td><td class='right'>208</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 98.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/extras/create_new_xlator/new-xlator.c.tmpl?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/create_new_xlator/new-xlator.c.tmpl</a></td><td class='right'>151</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/extras/devel-tools/devel-vagrant/Vagrantfile?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/devel-tools/devel-vagrant/Vagrantfile</a></td><td class='right'>165</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 98.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/extras/devel-tools/devel-vagrant/ansible/roles/cluster/tasks/main.yml?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/devel-tools/devel-vagrant/ansible/roles/cluster/tasks/main.yml</a></td><td class='right'>5</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 100.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/extras/devel-tools/devel-vagrant/ansible/roles/compile-gluster/tasks/main.yml?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/devel-tools/devel-vagrant/ansible/roles/compile-gluster/tasks/main.yml</a></td><td class='right'>29</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/extras/devel-tools/devel-vagrant/ansible/roles/install-pkgs/tasks/main.yml?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/devel-tools/devel-vagrant/ansible/roles/install-pkgs/tasks/main.yml</a></td><td class='right'>72</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.5%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/extras/devel-tools/devel-vagrant/ansible/roles/iptables/tasks/main.yml?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/devel-tools/devel-vagrant/ansible/roles/iptables/tasks/main.yml</a></td><td class='right'>3</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 100.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/extras/devel-tools/devel-vagrant/ansible/roles/prepare-brick/tasks/main.yml?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/devel-tools/devel-vagrant/ansible/roles/prepare-brick/tasks/main.yml</a></td><td class='right'>30</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/extras/devel-tools/devel-vagrant/ansible/roles/selinux/tasks/main.yml?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/devel-tools/devel-vagrant/ansible/roles/selinux/tasks/main.yml</a></td><td class='right'>3</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 100.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/extras/devel-tools/devel-vagrant/ansible/roles/service/tasks/main.yml?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/devel-tools/devel-vagrant/ansible/roles/service/tasks/main.yml</a></td><td class='right'>21</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/extras/devel-tools/devel-vagrant/ansible/setup.yml?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/devel-tools/devel-vagrant/ansible/setup.yml</a></td><td class='right'>23</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/extras/devel-tools/devel-vagrant/bootstrap.sh?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/devel-tools/devel-vagrant/bootstrap.sh</a></td><td class='right'>3</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 100.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/extras/devel-tools/devel-vagrant/up.sh?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/devel-tools/devel-vagrant/up.sh</a></td><td class='right'>4</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 100.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/extras/devel-tools/gdb_macros?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/devel-tools/gdb_macros</a></td><td class='right'>84</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.5%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/extras/devel-tools/print-backtrace.sh?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/devel-tools/print-backtrace.sh</a></td><td class='right'>115</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.7%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.3%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/extras/devel-tools/strace-brick.sh?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/devel-tools/strace-brick.sh</a></td><td class='right'>55</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/extras/distributed-testing/README?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/distributed-testing/README</a></td><td class='right'>28</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/extras/distributed-testing/distributed-test-build-env?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/distributed-testing/distributed-test-build-env</a></td><td class='right'>20</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/extras/distributed-testing/distributed-test-build.sh?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/distributed-testing/distributed-test-build.sh</a></td><td class='right'>27</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/extras/distributed-testing/distributed-test-env?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/distributed-testing/distributed-test-env</a></td><td class='right'>48</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/extras/distributed-testing/distributed-test-runner.py?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/distributed-testing/distributed-test-runner.py</a></td><td class='right'>859</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 5.5%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 94.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/extras/distributed-testing/distributed-test.sh?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/distributed-testing/distributed-test.sh</a></td><td class='right'>95</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.6%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.4%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/extras/ec-heal-script/README.md?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/ec-heal-script/README.md</a></td><td class='right'>69</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/extras/ec-heal-script/correct_pending_heals.sh?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/ec-heal-script/correct_pending_heals.sh</a></td><td class='right'>415</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 2.7%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 97.3%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/extras/ec-heal-script/gfid_needing_heal_parallel.sh?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/ec-heal-script/gfid_needing_heal_parallel.sh</a></td><td class='right'>278</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.8%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 98.2%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/extras/failed-tests.py?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/failed-tests.py</a></td><td class='right'>180</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 98.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/extras/file_size_contri.sh?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/file_size_contri.sh</a></td><td class='right'>17</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/extras/firewalld/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/firewalld/Makefile.am</a></td><td class='right'>8</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/extras/firewalld/glusterfs.xml?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/firewalld/glusterfs.xml</a></td><td class='right'>14</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/extras/ganesha/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/ganesha/Makefile.am</a></td><td class='right'>2</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 100.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/extras/ganesha/config/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/ganesha/config/Makefile.am</a></td><td class='right'>4</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 100.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/extras/ganesha/config/ganesha-ha.conf.sample?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/ganesha/config/ganesha-ha.conf.sample</a></td><td class='right'>19</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/extras/ganesha/ocf/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/ganesha/ocf/Makefile.am</a></td><td class='right'>11</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/extras/ganesha/ocf/ganesha_grace?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/ganesha/ocf/ganesha_grace</a></td><td class='right'>221</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 98.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/extras/ganesha/ocf/ganesha_mon?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/ganesha/ocf/ganesha_mon</a></td><td class='right'>234</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.5%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 98.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/extras/ganesha/ocf/ganesha_nfsd?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/ganesha/ocf/ganesha_nfsd</a></td><td class='right'>167</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 98.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/extras/ganesha/scripts/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/ganesha/scripts/Makefile.am</a></td><td class='right'>6</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 100.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/extras/ganesha/scripts/create-export-ganesha.sh?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/ganesha/scripts/create-export-ganesha.sh</a></td><td class='right'>92</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.6%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.4%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/extras/ganesha/scripts/dbus-send.sh?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/ganesha/scripts/dbus-send.sh</a></td><td class='right'>70</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.5%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/extras/ganesha/scripts/ganesha-ha.sh?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/ganesha/scripts/ganesha-ha.sh</a></td><td class='right'>1199</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 7.7%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 92.3%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/extras/ganesha/scripts/generate-epoch.py?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/ganesha/scripts/generate-epoch.py</a></td><td class='right'>48</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/extras/geo-rep/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/geo-rep/Makefile.am</a></td><td class='right'>16</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/extras/geo-rep/generate-gfid-file.sh?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/geo-rep/generate-gfid-file.sh</a></td><td class='right'>70</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.5%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/extras/geo-rep/get-gfid.sh?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/geo-rep/get-gfid.sh</a></td><td class='right'>7</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 100.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/extras/geo-rep/gsync-sync-gfid.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/geo-rep/gsync-sync-gfid.c</a></td><td class='right'>109</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.7%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.3%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/extras/geo-rep/gsync-upgrade.sh?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/geo-rep/gsync-upgrade.sh</a></td><td class='right'>123</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.8%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.2%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/extras/geo-rep/schedule_georep.py.in?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/geo-rep/schedule_georep.py.in</a></td><td class='right'>492</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 3.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 96.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/extras/geo-rep/slave-upgrade.sh?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/geo-rep/slave-upgrade.sh</a></td><td class='right'>102</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.7%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.3%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/extras/gfid-to-dirname.sh?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/gfid-to-dirname.sh</a></td><td class='right'>46</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/extras/git-branch-diff.py?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/git-branch-diff.py</a></td><td class='right'>285</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.8%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 98.2%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/extras/gluster-rsyslog-5.8.conf?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/gluster-rsyslog-5.8.conf</a></td><td class='right'>51</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/extras/gluster-rsyslog-7.2.conf?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/gluster-rsyslog-7.2.conf</a></td><td class='right'>76</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.5%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/extras/glusterd-sysconfig?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/glusterd-sysconfig</a></td><td class='right'>6</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 100.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/extras/glusterd.vol.in?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/glusterd.vol.in</a></td><td class='right'>15</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/extras/glusterfs-defrag.in?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/glusterfs-defrag.in</a></td><td class='right'>123</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.8%;'/><td class='none' style='width: 99.2%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/extras/glusterfs-georep-logrotate?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/glusterfs-georep-logrotate</a></td><td class='right'>61</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/extras/glusterfs-georep-upgrade.py?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/glusterfs-georep-upgrade.py</a></td><td class='right'>77</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.5%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/extras/glusterfs-logrotate?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/glusterfs-logrotate</a></td><td class='right'>68</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/extras/glusterfs-mode.el?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/glusterfs-mode.el</a></td><td class='right'>225</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.7%;'/><td class='rem' style='width: 0.7%;'/><td class='none' style='width: 98.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/extras/glusterfs.vim?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/glusterfs.vim</a></td><td class='right'>21</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.1%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x<span class='modechange'>[-rw-r--r--]</span></td><td class='upd'><a href='/cgit/glusterfs.git/diff/extras/gnfs-loganalyse.py?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/gnfs-loganalyse.py</a></td><td class='right'>173</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.9%;'/><td class='rem' style='width: 0.2%;'/><td class='none' style='width: 98.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/extras/group-db-workload?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/group-db-workload</a></td><td class='right'>12</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/extras/group-distributed-virt?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/group-distributed-virt</a></td><td class='right'>10</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/extras/group-gluster-block?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/group-gluster-block</a></td><td class='right'>27</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/extras/group-metadata-cache?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/group-metadata-cache</a></td><td class='right'>6</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 100.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/extras/group-nl-cache?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/group-nl-cache</a></td><td class='right'>5</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 100.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/extras/group-samba?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/group-samba</a></td><td class='right'>11</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/extras/group-virt.example?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/group-virt.example</a></td><td class='right'>24</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/extras/hook-scripts/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/hook-scripts/Makefile.am</a></td><td class='right'>7</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 100.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/extras/hook-scripts/S40ufo-stop.py?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/hook-scripts/S40ufo-stop.py</a></td><td class='right'>24</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/extras/hook-scripts/S56glusterd-geo-rep-create-post.sh?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/hook-scripts/S56glusterd-geo-rep-create-post.sh</a></td><td class='right'>104</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.7%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.3%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/extras/hook-scripts/add-brick/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/hook-scripts/add-brick/Makefile.am</a></td><td class='right'>2</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 100.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/extras/hook-scripts/add-brick/post/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/hook-scripts/add-brick/post/Makefile.am</a></td><td class='right'>6</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 100.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/extras/hook-scripts/add-brick/post/S10selinux-label-brick.sh?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/hook-scripts/add-brick/post/S10selinux-label-brick.sh</a></td><td class='right'>100</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.6%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.4%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/extras/hook-scripts/add-brick/post/S13create-subdir-mounts.sh?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/hook-scripts/add-brick/post/S13create-subdir-mounts.sh</a></td><td class='right'>86</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.6%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.4%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/extras/hook-scripts/add-brick/post/disabled-quota-root-xattr-heal.sh?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/hook-scripts/add-brick/post/disabled-quota-root-xattr-heal.sh</a></td><td class='right'>145</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.9%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.1%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/extras/hook-scripts/add-brick/pre/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/hook-scripts/add-brick/pre/Makefile.am</a></td><td class='right'>6</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 100.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/extras/hook-scripts/add-brick/pre/S28Quota-enable-root-xattr-heal.sh?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/hook-scripts/add-brick/pre/S28Quota-enable-root-xattr-heal.sh</a></td><td class='right'>101</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.6%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.4%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/extras/hook-scripts/create/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/hook-scripts/create/Makefile.am</a></td><td class='right'>1</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 100.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/extras/hook-scripts/create/post/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/hook-scripts/create/post/Makefile.am</a></td><td class='right'>8</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/extras/hook-scripts/create/post/S10selinux-label-brick.sh?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/hook-scripts/create/post/S10selinux-label-brick.sh</a></td><td class='right'>65</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/extras/hook-scripts/delete/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/hook-scripts/delete/Makefile.am</a></td><td class='right'>1</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 100.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/extras/hook-scripts/delete/pre/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/hook-scripts/delete/pre/Makefile.am</a></td><td class='right'>8</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/extras/hook-scripts/delete/pre/S10selinux-del-fcontext.sh?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/hook-scripts/delete/pre/S10selinux-del-fcontext.sh</a></td><td class='right'>73</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.5%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/extras/hook-scripts/reset/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/hook-scripts/reset/Makefile.am</a></td><td class='right'>2</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 100.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/extras/hook-scripts/reset/post/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/hook-scripts/reset/post/Makefile.am</a></td><td class='right'>1</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 100.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/extras/hook-scripts/reset/pre/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/hook-scripts/reset/pre/Makefile.am</a></td><td class='right'>1</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 100.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/extras/hook-scripts/set/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/hook-scripts/set/Makefile.am</a></td><td class='right'>2</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 100.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/extras/hook-scripts/set/post/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/hook-scripts/set/post/Makefile.am</a></td><td class='right'>6</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 100.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/extras/hook-scripts/set/post/S30samba-set.sh?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/hook-scripts/set/post/S30samba-set.sh</a></td><td class='right'>161</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/extras/hook-scripts/set/post/S32gluster_enable_shared_storage.sh?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/hook-scripts/set/post/S32gluster_enable_shared_storage.sh</a></td><td class='right'>136</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.9%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.1%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/extras/hook-scripts/start/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/hook-scripts/start/Makefile.am</a></td><td class='right'>2</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 100.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/extras/hook-scripts/start/post/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/hook-scripts/start/post/Makefile.am</a></td><td class='right'>6</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 100.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/extras/hook-scripts/start/post/S29CTDBsetup.sh?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/hook-scripts/start/post/S29CTDBsetup.sh</a></td><td class='right'>84</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.5%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/extras/hook-scripts/start/post/S30samba-start.sh?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/hook-scripts/start/post/S30samba-start.sh</a></td><td class='right'>145</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.9%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.1%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/extras/hook-scripts/start/post/S31ganesha-start.sh?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/hook-scripts/start/post/S31ganesha-start.sh</a></td><td class='right'>122</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.8%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.2%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/extras/hook-scripts/stop/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/hook-scripts/stop/Makefile.am</a></td><td class='right'>2</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 100.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/extras/hook-scripts/stop/pre/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/hook-scripts/stop/pre/Makefile.am</a></td><td class='right'>6</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 100.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/extras/hook-scripts/stop/pre/S29CTDB-teardown.sh?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/hook-scripts/stop/pre/S29CTDB-teardown.sh</a></td><td class='right'>62</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/extras/hook-scripts/stop/pre/S30samba-stop.sh?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/hook-scripts/stop/pre/S30samba-stop.sh</a></td><td class='right'>77</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.5%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/extras/identify-hangs.sh?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/identify-hangs.sh</a></td><td class='right'>53</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/extras/init.d/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/init.d/Makefile.am</a></td><td class='right'>33</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.1%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='mov'><a href='/cgit/glusterfs.git/diff/extras/init.d/glusterd-Debian.in?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/init.d/glusterd-Debian.in</a> (renamed from extras/init.d/glusterfsd-Debian.in)</td><td class='right'>31</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.1%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/extras/init.d/glusterd-FreeBSD.in?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/init.d/glusterd-FreeBSD.in</a></td><td class='right'>24</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/extras/init.d/glusterd-Redhat.in?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/init.d/glusterd-Redhat.in</a></td><td class='right'>143</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.9%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.1%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='mov'><a href='/cgit/glusterfs.git/diff/extras/init.d/glusterd-SuSE.in?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/init.d/glusterd-SuSE.in</a> (renamed from extras/init.d/glusterfsd-SuSE.in)</td><td class='right'>31</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.1%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='mov'><a href='/cgit/glusterfs.git/diff/extras/init.d/glusterd.plist.in?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/init.d/glusterd.plist.in</a> (renamed from extras/init.d/glusterfs-server.plist.in)</td><td class='right'>6</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 100.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/extras/init.d/glustereventsd-Debian.in?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/init.d/glustereventsd-Debian.in</a></td><td class='right'>91</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.6%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.4%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/extras/init.d/glustereventsd-FreeBSD.in?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/init.d/glustereventsd-FreeBSD.in</a></td><td class='right'>19</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/extras/init.d/glustereventsd-Redhat.in?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/init.d/glustereventsd-Redhat.in</a></td><td class='right'>129</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.8%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.2%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='del'><a href='/cgit/glusterfs.git/diff/extras/init.d/glusterfsd-Redhat.in?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/init.d/glusterfsd-Redhat.in</a></td><td class='right'>54</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.3%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/extras/logger.conf.example?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/logger.conf.example</a></td><td class='right'>13</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/extras/mount-shared-storage.sh?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/mount-shared-storage.sh</a></td><td class='right'>39</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/extras/ocf/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/ocf/Makefile.am</a></td><td class='right'>11</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/extras/ocf/glusterd.in?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/ocf/glusterd.in</a></td><td class='right'>212</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 98.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/extras/ocf/volume.in?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/ocf/volume.in</a></td><td class='right'>276</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.8%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 98.2%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/extras/peer_add_secret_pub.in?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/peer_add_secret_pub.in</a></td><td class='right'>70</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.5%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/extras/post-upgrade-script-for-quota.sh?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/post-upgrade-script-for-quota.sh</a></td><td class='right'>65</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/extras/pre-upgrade-script-for-quota.sh?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/pre-upgrade-script-for-quota.sh</a></td><td class='right'>18</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='upd'><a href='/cgit/glusterfs.git/diff/extras/profiler/glusterfs-profiler?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/profiler/glusterfs-profiler</a></td><td class='right'>29</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.1%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/extras/python/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/python/Makefile.am</a></td><td class='right'>7</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 100.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/extras/python/__init__.py?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/python/__init__.py</a></td><td class='right'>2</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 100.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/extras/quota/contri-add.sh?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/quota/contri-add.sh</a></td><td class='right'>73</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.5%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/extras/quota/log_accounting.sh?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/quota/log_accounting.sh</a></td><td class='right'>26</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/extras/quota/quota_fsck.py?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/quota/quota_fsck.py</a></td><td class='right'>377</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 2.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 97.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/extras/quota/xattr_analysis.py?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/quota/xattr_analysis.py</a></td><td class='right'>73</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.5%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/extras/rebalance.py?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/rebalance.py</a></td><td class='right'>309</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 2.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 98.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/extras/run-gluster.tmpfiles.in?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/run-gluster.tmpfiles.in</a></td><td class='right'>2</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 100.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/extras/snap_scheduler/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/snap_scheduler/Makefile.am</a></td><td class='right'>9</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/extras/snap_scheduler/README.md?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/snap_scheduler/README.md</a></td><td class='right'>125</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.8%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.2%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/extras/snap_scheduler/conf.py.in?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/snap_scheduler/conf.py.in</a></td><td class='right'>11</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/extras/snap_scheduler/gcron.py?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/snap_scheduler/gcron.py</a></td><td class='right'>190</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 98.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/extras/snap_scheduler/snap_scheduler.py?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/snap_scheduler/snap_scheduler.py</a></td><td class='right'>941</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 6.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 93.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='upd'><a href='/cgit/glusterfs.git/diff/extras/specgen.scm?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/specgen.scm</a></td><td class='right'>2</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 100.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/extras/statedumpparse.rb?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/statedumpparse.rb</a></td><td class='right'>208</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 98.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/extras/stop-all-gluster-processes.sh?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/stop-all-gluster-processes.sh</a></td><td class='right'>193</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 98.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/extras/stripe-merge.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/stripe-merge.c</a></td><td class='right'>539</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 3.2%;'/><td class='rem' style='width: 0.3%;'/><td class='none' style='width: 96.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/extras/systemd/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/systemd/Makefile.am</a></td><td class='right'>17</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/extras/systemd/gluster-ta-volume.service.in?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/systemd/gluster-ta-volume.service.in</a></td><td class='right'>13</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/extras/systemd/glusterd.service.in?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/systemd/glusterd.service.in</a></td><td class='right'>26</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/extras/systemd/glustereventsd.service.in?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/systemd/glustereventsd.service.in</a></td><td class='right'>16</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/extras/systemd/glusterfssharedstorage.service.in?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/systemd/glusterfssharedstorage.service.in</a></td><td class='right'>13</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/extras/test/bug-920583.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/test/bug-920583.t</a></td><td class='right'>50</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='upd'><a href='/cgit/glusterfs.git/diff/extras/test/gluster_commands.sh?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/test/gluster_commands.sh</a></td><td class='right'>151</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.7%;'/><td class='rem' style='width: 0.2%;'/><td class='none' style='width: 99.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/extras/test/ld-preload-test/README?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/test/ld-preload-test/README</a></td><td class='right'>4</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 100.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/extras/test/ld-preload-test/ld-preload-lib.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/test/ld-preload-test/ld-preload-lib.c</a></td><td class='right'>620</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.9%;'/><td class='rem' style='width: 2.1%;'/><td class='none' style='width: 96.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/extras/test/ld-preload-test/ld-preload-test.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/test/ld-preload-test/ld-preload-test.c</a></td><td class='right'>527</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.6%;'/><td class='rem' style='width: 1.8%;'/><td class='none' style='width: 96.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/extras/test/open-fd-tests.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/test/open-fd-tests.c</a></td><td class='right'>67</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/extras/test/run.sh?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/test/run.sh</a></td><td class='right'>22</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/extras/test/stop_glusterd.sh?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/test/stop_glusterd.sh</a></td><td class='right'>19</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/extras/test/test-ffop.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/test/test-ffop.c</a></td><td class='right'>920</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 5.9%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 94.1%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/extras/thin-arbiter/setup-thin-arbiter.sh?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/thin-arbiter/setup-thin-arbiter.sh</a></td><td class='right'>184</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 98.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/extras/thin-arbiter/thin-arbiter.vol?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/thin-arbiter/thin-arbiter.vol</a></td><td class='right'>57</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/extras/volfilter.py?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/volfilter.py</a></td><td class='right'>168</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 98.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/extras/volgen/Common.py?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/volgen/Common.py</a></td><td class='right'>83</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.5%;'/><td class='none' style='width: 99.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/extras/volgen/CreateVolfile.py?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/volgen/CreateVolfile.py</a></td><td class='right'>684</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 4.4%;'/><td class='none' style='width: 95.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/extras/volgen/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/volgen/Makefile.am</a></td><td class='right'>8</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.1%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='del'><a href='/cgit/glusterfs.git/diff/extras/volgen/glusterfs-volgen.in?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/volgen/glusterfs-volgen.in</a></td><td class='right'>227</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 1.5%;'/><td class='none' style='width: 98.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/extras/who-wrote-glusterfs/gitdm.aliases?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/who-wrote-glusterfs/gitdm.aliases</a></td><td class='right'>58</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/extras/who-wrote-glusterfs/gitdm.config?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/who-wrote-glusterfs/gitdm.config</a></td><td class='right'>8</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/extras/who-wrote-glusterfs/gitdm.domain-map?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/who-wrote-glusterfs/gitdm.domain-map</a></td><td class='right'>29</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/extras/who-wrote-glusterfs/who-wrote-glusterfs.sh?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/who-wrote-glusterfs/who-wrote-glusterfs.sh</a></td><td class='right'>50</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='del'><a href='/cgit/glusterfs.git/diff/format-patch.sh?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>format-patch.sh</a></td><td class='right'>60</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.4%;'/><td class='none' style='width: 99.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/geo-replication/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>geo-replication/Makefile.am</a></td><td class='right'>8</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/geo-replication/gsyncd.conf.in?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>geo-replication/gsyncd.conf.in</a></td><td class='right'>349</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 2.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 97.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/geo-replication/setup.py?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>geo-replication/setup.py</a></td><td class='right'>32</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/geo-replication/src/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>geo-replication/src/Makefile.am</a></td><td class='right'>48</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/geo-replication/src/gsyncd.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>geo-replication/src/gsyncd.c</a></td><td class='right'>402</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 2.6%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 97.4%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/geo-replication/src/gverify.sh?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>geo-replication/src/gverify.sh</a></td><td class='right'>276</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.8%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 98.2%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/geo-replication/src/peer_georep-sshkey.py.in?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>geo-replication/src/peer_georep-sshkey.py.in</a></td><td class='right'>116</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.7%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.3%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/geo-replication/src/peer_gsec_create.in?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>geo-replication/src/peer_gsec_create.in</a></td><td class='right'>24</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/geo-replication/src/peer_mountbroker.in?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>geo-replication/src/peer_mountbroker.in</a></td><td class='right'>211</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 98.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/geo-replication/src/peer_mountbroker.py.in?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>geo-replication/src/peer_mountbroker.py.in</a></td><td class='right'>401</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 2.6%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 97.4%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/geo-replication/src/procdiggy.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>geo-replication/src/procdiggy.c</a></td><td class='right'>136</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.9%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.1%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/geo-replication/src/procdiggy.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>geo-replication/src/procdiggy.h</a></td><td class='right'>21</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/geo-replication/src/set_geo_rep_pem_keys.sh?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>geo-replication/src/set_geo_rep_pem_keys.sh</a></td><td class='right'>58</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/geo-replication/syncdaemon/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>geo-replication/syncdaemon/Makefile.am</a></td><td class='right'>8</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/geo-replication/syncdaemon/README.md?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>geo-replication/syncdaemon/README.md</a></td><td class='right'>57</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/geo-replication/syncdaemon/__codecheck.py?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>geo-replication/syncdaemon/__codecheck.py</a></td><td class='right'>58</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/geo-replication/syncdaemon/__init__.py?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>geo-replication/syncdaemon/__init__.py</a></td><td class='right'>9</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/geo-replication/syncdaemon/argsupgrade.py?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>geo-replication/syncdaemon/argsupgrade.py</a></td><td class='right'>359</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 2.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 97.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/geo-replication/syncdaemon/conf.py.in?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>geo-replication/syncdaemon/conf.py.in</a></td><td class='right'>17</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/geo-replication/syncdaemon/gsyncd.py?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>geo-replication/syncdaemon/gsyncd.py</a></td><td class='right'>325</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 2.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 97.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/geo-replication/syncdaemon/gsyncdconfig.py?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>geo-replication/syncdaemon/gsyncdconfig.py</a></td><td class='right'>485</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 3.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 96.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/geo-replication/syncdaemon/gsyncdstatus.py?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>geo-replication/syncdaemon/gsyncdstatus.py</a></td><td class='right'>419</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 2.7%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 97.3%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/geo-replication/syncdaemon/libcxattr.py?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>geo-replication/syncdaemon/libcxattr.py</a></td><td class='right'>112</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.7%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.3%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/geo-replication/syncdaemon/libgfchangelog.py?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>geo-replication/syncdaemon/libgfchangelog.py</a></td><td class='right'>143</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.9%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.1%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/geo-replication/syncdaemon/logutils.py?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>geo-replication/syncdaemon/logutils.py</a></td><td class='right'>77</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.5%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/geo-replication/syncdaemon/master.py?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>geo-replication/syncdaemon/master.py</a></td><td class='right'>2020</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 13.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 87.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/geo-replication/syncdaemon/monitor.py?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>geo-replication/syncdaemon/monitor.py</a></td><td class='right'>395</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 2.5%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 97.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/geo-replication/syncdaemon/py2py3.py?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>geo-replication/syncdaemon/py2py3.py</a></td><td class='right'>184</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 98.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/geo-replication/syncdaemon/rconf.py?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>geo-replication/syncdaemon/rconf.py</a></td><td class='right'>31</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/geo-replication/syncdaemon/repce.py?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>geo-replication/syncdaemon/repce.py</a></td><td class='right'>253</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.6%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 98.4%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/geo-replication/syncdaemon/resource.py?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>geo-replication/syncdaemon/resource.py</a></td><td class='right'>1583</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 10.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 89.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/geo-replication/syncdaemon/subcmds.py?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>geo-replication/syncdaemon/subcmds.py</a></td><td class='right'>335</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 2.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 97.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/geo-replication/syncdaemon/syncdutils.py?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>geo-replication/syncdaemon/syncdutils.py</a></td><td class='right'>1115</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 7.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 92.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/geo-replication/test-requirements.txt?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>geo-replication/test-requirements.txt</a></td><td class='right'>7</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 100.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/geo-replication/tests/__init__.py?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>geo-replication/tests/__init__.py</a></td><td class='right'>9</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/geo-replication/tests/unit/__init__.py?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>geo-replication/tests/unit/__init__.py</a></td><td class='right'>9</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/geo-replication/tests/unit/test_gsyncdstatus.py?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>geo-replication/tests/unit/test_gsyncdstatus.py</a></td><td class='right'>193</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 98.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/geo-replication/tests/unit/test_syncdutils.py?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>geo-replication/tests/unit/test_syncdutils.py</a></td><td class='right'>29</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/geo-replication/tox.ini?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>geo-replication/tox.ini</a></td><td class='right'>32</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/geo-replication/unittests.sh?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>geo-replication/unittests.sh</a></td><td class='right'>9</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/glusterfs-api.pc.in?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>glusterfs-api.pc.in</a></td><td class='right'>12</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/glusterfs.spec.in?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>glusterfs.spec.in</a></td><td class='right'>2352</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 14.3%;'/><td class='rem' style='width: 0.9%;'/><td class='none' style='width: 84.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/glusterfsd/src/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>glusterfsd/src/Makefile.am</a></td><td class='right'>45</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.1%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/glusterfsd/src/gf_attach.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>glusterfsd/src/gf_attach.c</a></td><td class='right'>241</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.6%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 98.4%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/glusterfsd/src/glusterfsd-common.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>glusterfsd/src/glusterfsd-common.h</a></td><td class='right'>30</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.2%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/glusterfsd/src/glusterfsd-mem-types.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>glusterfsd/src/glusterfsd-mem-types.h</a></td><td class='right'>37</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.1%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/glusterfsd/src/glusterfsd-messages.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>glusterfsd/src/glusterfsd-messages.h</a></td><td class='right'>93</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.6%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.4%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/glusterfsd/src/glusterfsd-mgmt.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>glusterfsd/src/glusterfsd-mgmt.c</a></td><td class='right'>3239</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 18.7%;'/><td class='rem' style='width: 2.2%;'/><td class='none' style='width: 79.2%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/glusterfsd/src/glusterfsd.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>glusterfsd/src/glusterfsd.c</a></td><td class='right'>3432</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 15.3%;'/><td class='rem' style='width: 6.7%;'/><td class='none' style='width: 77.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/glusterfsd/src/glusterfsd.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>glusterfsd/src/glusterfsd.h</a></td><td class='right'>185</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.8%;'/><td class='rem' style='width: 0.4%;'/><td class='none' style='width: 98.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='mov'><a href='/cgit/glusterfs.git/diff/heal/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>heal/Makefile.am</a> (renamed from xlators/features/access-control/Makefile.am)</td><td class='right'>0</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 100.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/heal/src/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>heal/src/Makefile.am</a></td><td class='right'>29</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/heal/src/glfs-heal.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>heal/src/glfs-heal.c</a></td><td class='right'>1793</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 11.5%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 88.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/libgfchangelog.pc.in?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libgfchangelog.pc.in</a></td><td class='right'>12</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='mov'><a href='/cgit/glusterfs.git/diff/libglusterd/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterd/Makefile.am</a> (renamed from scheduler/nufa/Makefile.am)</td><td class='right'>2</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 100.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/libglusterd/src/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterd/src/Makefile.am</a></td><td class='right'>31</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/libglusterd/src/gd-common-utils.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterd/src/gd-common-utils.c</a></td><td class='right'>78</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.5%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/libglusterd/src/gd-common-utils.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterd/src/gd-common-utils.h</a></td><td class='right'>28</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/libglusterd/src/libglusterd.sym?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterd/src/libglusterd.sym</a></td><td class='right'>2</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 100.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/libglusterfs/src/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/Makefile.am</a></td><td class='right'>115</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.7%;'/><td class='rem' style='width: 0.1%;'/><td class='none' style='width: 99.3%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/libglusterfs/src/async.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/async.c</a></td><td class='right'>720</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 4.6%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 95.4%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/libglusterfs/src/byte-order.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/byte-order.h</a></td><td class='right'>150</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 1.0%;'/><td class='none' style='width: 99.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/libglusterfs/src/call-stub.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/call-stub.c</a></td><td class='right'>4914</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 11.3%;'/><td class='rem' style='width: 20.4%;'/><td class='none' style='width: 68.4%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/libglusterfs/src/call-stub.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/call-stub.h</a></td><td class='right'>1116</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 7.2%;'/><td class='none' style='width: 92.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/libglusterfs/src/changelog.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/changelog.h</a></td><td class='right'>115</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.7%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.3%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/libglusterfs/src/checksum.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/checksum.c</a></td><td class='right'>86</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.4%;'/><td class='none' style='width: 99.4%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/libglusterfs/src/checksum.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/checksum.h</a></td><td class='right'>29</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.2%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/libglusterfs/src/circ-buff.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/circ-buff.c</a></td><td class='right'>193</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 98.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/libglusterfs/src/client_t.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/client_t.c</a></td><td class='right'>825</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 5.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 94.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/libglusterfs/src/cluster-syncop.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/cluster-syncop.c</a></td><td class='right'>1261</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 8.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 91.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/libglusterfs/src/common-utils.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/common-utils.c</a></td><td class='right'>6141</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 32.4%;'/><td class='rem' style='width: 7.2%;'/><td class='none' style='width: 60.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/libglusterfs/src/common-utils.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/common-utils.h</a></td><td class='right'>335</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 2.2%;'/><td class='none' style='width: 97.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/libglusterfs/src/compat-errno.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/compat-errno.c</a></td><td class='right'>1791</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 5.8%;'/><td class='rem' style='width: 5.7%;'/><td class='none' style='width: 88.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/libglusterfs/src/compat-errno.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/compat-errno.h</a></td><td class='right'>240</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 1.5%;'/><td class='none' style='width: 98.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/libglusterfs/src/compat.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/compat.c</a></td><td class='right'>922</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 3.6%;'/><td class='rem' style='width: 2.3%;'/><td class='none' style='width: 94.1%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/libglusterfs/src/compat.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/compat.h</a></td><td class='right'>354</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 2.3%;'/><td class='none' style='width: 97.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/libglusterfs/src/ctx.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/ctx.c</a></td><td class='right'>97</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.6%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.4%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/libglusterfs/src/daemon.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/daemon.c</a></td><td class='right'>65</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/libglusterfs/src/default-args.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/default-args.c</a></td><td class='right'>1651</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 10.6%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 89.4%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/libglusterfs/src/defaults-tmpl.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/defaults-tmpl.c</a></td><td class='right'>247</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.6%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 98.4%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/libglusterfs/src/defaults.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/defaults.c</a></td><td class='right'>1339</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 8.6%;'/><td class='none' style='width: 91.4%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/libglusterfs/src/defaults.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/defaults.h</a></td><td class='right'>423</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 2.7%;'/><td class='none' style='width: 97.3%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/libglusterfs/src/dict.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/dict.c</a></td><td class='right'>4672</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 18.0%;'/><td class='rem' style='width: 12.0%;'/><td class='none' style='width: 69.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/libglusterfs/src/dict.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/dict.h</a></td><td class='right'>185</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 1.2%;'/><td class='none' style='width: 98.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/libglusterfs/src/event-epoll.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/event-epoll.c</a></td><td class='right'>1032</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 6.6%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 93.4%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/libglusterfs/src/event-history.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/event-history.c</a></td><td class='right'>82</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.5%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/libglusterfs/src/event-poll.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/event-poll.c</a></td><td class='right'>513</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 3.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 96.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/libglusterfs/src/event.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/event.c</a></td><td class='right'>1136</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.5%;'/><td class='rem' style='width: 5.8%;'/><td class='none' style='width: 92.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/libglusterfs/src/event.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/event.h</a></td><td class='right'>90</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.6%;'/><td class='none' style='width: 99.4%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/libglusterfs/src/events.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/events.c</a></td><td class='right'>136</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.9%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.1%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/libglusterfs/src/fd-lk.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/fd-lk.c</a></td><td class='right'>433</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 2.8%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 97.2%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/libglusterfs/src/fd.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/fd.c</a></td><td class='right'>1589</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 6.4%;'/><td class='rem' style='width: 3.8%;'/><td class='none' style='width: 89.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/libglusterfs/src/fd.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/fd.h</a></td><td class='right'>168</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 1.1%;'/><td class='none' style='width: 98.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/libglusterfs/src/gen-defaults.py?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/gen-defaults.py</a></td><td class='right'>81</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.5%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/libglusterfs/src/generator.py?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/generator.py</a></td><td class='right'>777</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 5.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 95.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/libglusterfs/src/gf-dirent.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/gf-dirent.c</a></td><td class='right'>325</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.7%;'/><td class='rem' style='width: 0.4%;'/><td class='none' style='width: 97.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/libglusterfs/src/gf-dirent.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/gf-dirent.h</a></td><td class='right'>62</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.4%;'/><td class='none' style='width: 99.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/libglusterfs/src/gidcache.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/gidcache.c</a></td><td class='right'>211</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 98.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/libglusterfs/src/globals.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/globals.c</a></td><td class='right'>522</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.8%;'/><td class='rem' style='width: 1.6%;'/><td class='none' style='width: 96.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/libglusterfs/src/globals.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/globals.h</a></td><td class='right'>58</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.4%;'/><td class='none' style='width: 99.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/libglusterfs/src/glusterfs.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/glusterfs.h</a></td><td class='right'>313</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 2.0%;'/><td class='none' style='width: 98.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/libglusterfs/src/glusterfs/async.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/glusterfs/async.h</a></td><td class='right'>209</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 98.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/libglusterfs/src/glusterfs/atomic.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/glusterfs/atomic.h</a></td><td class='right'>459</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 3.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 97.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/libglusterfs/src/glusterfs/byte-order.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/glusterfs/byte-order.h</a></td><td class='right'>279</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.8%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 98.2%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/libglusterfs/src/glusterfs/call-stub.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/glusterfs/call-stub.h</a></td><td class='right'>622</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 4.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 96.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/libglusterfs/src/glusterfs/checksum.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/glusterfs/checksum.h</a></td><td class='right'>22</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/libglusterfs/src/glusterfs/circ-buff.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/glusterfs/circ-buff.h</a></td><td class='right'>61</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/libglusterfs/src/glusterfs/client_t.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/glusterfs/client_t.h</a></td><td class='right'>147</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.9%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.1%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/libglusterfs/src/glusterfs/cluster-syncop.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/glusterfs/cluster-syncop.h</a></td><td class='right'>227</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.5%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 98.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/libglusterfs/src/glusterfs/common-utils.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/glusterfs/common-utils.h</a></td><td class='right'>1256</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 8.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 91.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/libglusterfs/src/glusterfs/compat-errno.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/glusterfs/compat-errno.h</a></td><td class='right'>238</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.5%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 98.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/libglusterfs/src/glusterfs/compat-uuid.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/glusterfs/compat-uuid.h</a></td><td class='right'>71</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.5%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/libglusterfs/src/glusterfs/compat.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/glusterfs/compat.h</a></td><td class='right'>544</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 3.5%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 96.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/libglusterfs/src/glusterfs/daemon.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/glusterfs/daemon.h</a></td><td class='right'>20</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/libglusterfs/src/glusterfs/default-args.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/glusterfs/default-args.h</a></td><td class='right'>455</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 2.9%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 97.1%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/libglusterfs/src/glusterfs/defaults.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/glusterfs/defaults.h</a></td><td class='right'>1275</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 8.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 91.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/libglusterfs/src/glusterfs/dict.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/glusterfs/dict.h</a></td><td class='right'>420</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 2.7%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 97.3%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/libglusterfs/src/glusterfs/event-history.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/glusterfs/event-history.h</a></td><td class='right'>40</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/libglusterfs/src/glusterfs/events.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/glusterfs/events.h</a></td><td class='right'>34</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/libglusterfs/src/glusterfs/fd-lk.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/glusterfs/fd-lk.h</a></td><td class='right'>59</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/libglusterfs/src/glusterfs/fd.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/glusterfs/fd.h</a></td><td class='right'>169</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 98.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/libglusterfs/src/glusterfs/gf-dirent.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/glusterfs/gf-dirent.h</a></td><td class='right'>71</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.5%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/libglusterfs/src/glusterfs/gf-event.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/glusterfs/gf-event.h</a></td><td class='right'>140</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.9%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.1%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/libglusterfs/src/glusterfs/gidcache.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/glusterfs/gidcache.h</a></td><td class='right'>60</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/libglusterfs/src/glusterfs/glfs-message-id.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/glusterfs/glfs-message-id.h</a></td><td class='right'>102</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.7%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.3%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/libglusterfs/src/glusterfs/globals.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/glusterfs/globals.h</a></td><td class='right'>188</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 98.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/libglusterfs/src/glusterfs/glusterfs-acl.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/glusterfs/glusterfs-acl.h</a></td><td class='right'>162</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/libglusterfs/src/glusterfs/glusterfs-fops.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/glusterfs/glusterfs-fops.h</a></td><td class='right'>241</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.6%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 98.4%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/libglusterfs/src/glusterfs/glusterfs.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/glusterfs/glusterfs.h</a></td><td class='right'>838</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 5.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 94.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/libglusterfs/src/glusterfs/graph-utils.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/glusterfs/graph-utils.h</a></td><td class='right'>20</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/libglusterfs/src/glusterfs/hashfn.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/glusterfs/hashfn.h</a></td><td class='right'>23</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/libglusterfs/src/glusterfs/iatt.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/glusterfs/iatt.h</a></td><td class='right'>489</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 3.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 96.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/libglusterfs/src/glusterfs/inode.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/glusterfs/inode.h</a></td><td class='right'>306</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 2.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 98.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/libglusterfs/src/glusterfs/iobuf.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/glusterfs/iobuf.h</a></td><td class='right'>194</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 98.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/libglusterfs/src/glusterfs/latency.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/glusterfs/latency.h</a></td><td class='right'>33</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/libglusterfs/src/glusterfs/libglusterfs-messages.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/glusterfs/libglusterfs-messages.h</a></td><td class='right'>245</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.6%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 98.4%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/libglusterfs/src/glusterfs/list.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/glusterfs/list.h</a></td><td class='right'>273</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.8%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 98.2%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/libglusterfs/src/glusterfs/lkowner.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/glusterfs/lkowner.h</a></td><td class='right'>93</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.6%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.4%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/libglusterfs/src/glusterfs/locking.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/glusterfs/locking.h</a></td><td class='right'>84</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.5%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/libglusterfs/src/glusterfs/logging.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/glusterfs/logging.h</a></td><td class='right'>383</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 2.5%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 97.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/libglusterfs/src/glusterfs/lvm-defaults.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/glusterfs/lvm-defaults.h</a></td><td class='right'>20</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/libglusterfs/src/glusterfs/mem-pool.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/glusterfs/mem-pool.h</a></td><td class='right'>336</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 2.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 97.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/libglusterfs/src/glusterfs/mem-types.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/glusterfs/mem-types.h</a></td><td class='right'>139</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.9%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.1%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/libglusterfs/src/glusterfs/monitoring.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/glusterfs/monitoring.h</a></td><td class='right'>21</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/libglusterfs/src/glusterfs/options.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/glusterfs/options.h</a></td><td class='right'>327</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 2.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 97.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/libglusterfs/src/glusterfs/parse-utils.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/glusterfs/parse-utils.h</a></td><td class='right'>50</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/libglusterfs/src/glusterfs/quota-common-utils.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/glusterfs/quota-common-utils.h</a></td><td class='right'>68</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/libglusterfs/src/glusterfs/rbthash.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/glusterfs/rbthash.h</a></td><td class='right'>75</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.5%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/libglusterfs/src/glusterfs/refcount.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/glusterfs/refcount.h</a></td><td class='right'>101</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.6%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.4%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/libglusterfs/src/glusterfs/revision.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/glusterfs/revision.h</a></td><td class='right'>1</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 100.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/libglusterfs/src/glusterfs/rot-buffs.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/glusterfs/rot-buffs.h</a></td><td class='right'>125</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.8%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.2%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/libglusterfs/src/glusterfs/run.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/glusterfs/run.h</a></td><td class='right'>207</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 98.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/libglusterfs/src/glusterfs/stack.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/glusterfs/stack.h</a></td><td class='right'>555</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 3.6%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 96.4%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/libglusterfs/src/glusterfs/statedump.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/glusterfs/statedump.h</a></td><td class='right'>132</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.8%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.2%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/libglusterfs/src/glusterfs/store.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/glusterfs/store.h</a></td><td class='right'>112</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.7%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.3%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/libglusterfs/src/glusterfs/strfd.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/glusterfs/strfd.h</a></td><td class='right'>34</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/libglusterfs/src/glusterfs/syncop-utils.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/glusterfs/syncop-utils.h</a></td><td class='right'>54</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/libglusterfs/src/glusterfs/syncop.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/glusterfs/syncop.h</a></td><td class='right'>718</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 4.6%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 95.4%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/libglusterfs/src/glusterfs/syscall.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/glusterfs/syscall.h</a></td><td class='right'>278</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.8%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 98.2%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/libglusterfs/src/glusterfs/template-component-messages.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/glusterfs/template-component-messages.h</a></td><td class='right'>28</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/libglusterfs/src/glusterfs/throttle-tbf.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/glusterfs/throttle-tbf.h</a></td><td class='right'>74</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.5%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/libglusterfs/src/glusterfs/timer.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/glusterfs/timer.h</a></td><td class='right'>56</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/libglusterfs/src/glusterfs/timespec.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/glusterfs/timespec.h</a></td><td class='right'>33</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/libglusterfs/src/glusterfs/trie.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/glusterfs/trie.h</a></td><td class='right'>52</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/libglusterfs/src/glusterfs/upcall-utils.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/glusterfs/upcall-utils.h</a></td><td class='right'>110</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.7%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.3%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/libglusterfs/src/glusterfs/xlator.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/glusterfs/xlator.h</a></td><td class='right'>1106</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 7.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 92.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/libglusterfs/src/graph-print.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/graph-print.c</a></td><td class='right'>135</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.9%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.1%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/libglusterfs/src/graph.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/graph.c</a></td><td class='right'>2009</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 10.9%;'/><td class='rem' style='width: 2.0%;'/><td class='none' style='width: 87.1%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/libglusterfs/src/graph.l?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/graph.l</a></td><td class='right'>66</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.3%;'/><td class='none' style='width: 99.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/libglusterfs/src/graph.y?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/graph.y</a></td><td class='right'>318</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.9%;'/><td class='rem' style='width: 1.1%;'/><td class='none' style='width: 98.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/libglusterfs/src/hashfn.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/hashfn.c</a></td><td class='right'>296</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.9%;'/><td class='rem' style='width: 1.0%;'/><td class='none' style='width: 98.1%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/libglusterfs/src/hashfn.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/hashfn.h</a></td><td class='right'>37</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.2%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/libglusterfs/src/iatt.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/iatt.h</a></td><td class='right'>325</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 2.1%;'/><td class='none' style='width: 97.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/libglusterfs/src/inode.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/inode.c</a></td><td class='right'>3133</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 14.1%;'/><td class='rem' style='width: 6.1%;'/><td class='none' style='width: 79.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/libglusterfs/src/inode.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/inode.h</a></td><td class='right'>184</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 1.2%;'/><td class='none' style='width: 98.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/libglusterfs/src/iobuf.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/iobuf.c</a></td><td class='right'>1399</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 5.8%;'/><td class='rem' style='width: 3.2%;'/><td class='none' style='width: 91.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/libglusterfs/src/iobuf.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/iobuf.h</a></td><td class='right'>137</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.9%;'/><td class='none' style='width: 99.1%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/libglusterfs/src/latency.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/latency.c</a></td><td class='right'>205</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 1.0%;'/><td class='none' style='width: 98.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/libglusterfs/src/latency.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/latency.h</a></td><td class='right'>36</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.2%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/libglusterfs/src/libglusterfs.sym?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/libglusterfs.sym</a></td><td class='right'>1193</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 7.7%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 92.3%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/libglusterfs/src/list.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/list.h</a></td><td class='right'>154</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 1.0%;'/><td class='none' style='width: 99.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/libglusterfs/src/locking.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/locking.c</a></td><td class='right'>27</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/libglusterfs/src/locking.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/locking.h</a></td><td class='right'>49</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.3%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/libglusterfs/src/logging.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/logging.c</a></td><td class='right'>2618</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 14.7%;'/><td class='rem' style='width: 2.2%;'/><td class='none' style='width: 83.2%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/libglusterfs/src/logging.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/logging.h</a></td><td class='right'>128</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.8%;'/><td class='none' style='width: 99.2%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/libglusterfs/src/mem-pool.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/mem-pool.c</a></td><td class='right'>1199</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 5.2%;'/><td class='rem' style='width: 2.5%;'/><td class='none' style='width: 92.3%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/libglusterfs/src/mem-pool.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/mem-pool.h</a></td><td class='right'>124</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.8%;'/><td class='none' style='width: 99.2%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/libglusterfs/src/mem-types.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/mem-types.h</a></td><td class='right'>101</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.6%;'/><td class='none' style='width: 99.4%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/libglusterfs/src/monitoring.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/monitoring.c</a></td><td class='right'>282</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.8%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 98.2%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/libglusterfs/src/options.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/options.c</a></td><td class='right'>1249</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 8.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 92.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/libglusterfs/src/parse-utils.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/parse-utils.c</a></td><td class='right'>174</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 98.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/libglusterfs/src/quota-common-utils.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/quota-common-utils.c</a></td><td class='right'>241</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.6%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 98.4%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/libglusterfs/src/rbthash.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/rbthash.c</a></td><td class='right'>660</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 2.2%;'/><td class='rem' style='width: 2.0%;'/><td class='none' style='width: 95.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/libglusterfs/src/rbthash.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/rbthash.h</a></td><td class='right'>78</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.5%;'/><td class='none' style='width: 99.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/libglusterfs/src/refcount.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/refcount.c</a></td><td class='right'>108</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.7%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.3%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/libglusterfs/src/revision.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/revision.h</a></td><td class='right'>1</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 100.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/libglusterfs/src/rot-buffs.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/rot-buffs.c</a></td><td class='right'>490</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 3.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 96.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/libglusterfs/src/run.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/run.c</a></td><td class='right'>570</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 3.7%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 96.3%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/libglusterfs/src/scheduler.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/scheduler.c</a></td><td class='right'>91</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.6%;'/><td class='none' style='width: 99.4%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/libglusterfs/src/scheduler.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/scheduler.h</a></td><td class='right'>41</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.3%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/libglusterfs/src/stack.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/stack.c</a></td><td class='right'>567</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 2.7%;'/><td class='rem' style='width: 0.9%;'/><td class='none' style='width: 96.4%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/libglusterfs/src/stack.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/stack.h</a></td><td class='right'>403</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 2.6%;'/><td class='none' style='width: 97.4%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/libglusterfs/src/statedump.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/statedump.c</a></td><td class='right'>1231</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 5.9%;'/><td class='rem' style='width: 2.0%;'/><td class='none' style='width: 92.1%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/libglusterfs/src/statedump.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/statedump.h</a></td><td class='right'>96</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.6%;'/><td class='none' style='width: 99.4%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/libglusterfs/src/store.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/store.c</a></td><td class='right'>744</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 4.8%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 95.2%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/libglusterfs/src/strfd.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/strfd.c</a></td><td class='right'>93</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.6%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.4%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/libglusterfs/src/syncop-utils.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/syncop-utils.c</a></td><td class='right'>669</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 4.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 95.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/libglusterfs/src/syncop.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/syncop.c</a></td><td class='right'>3656</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 21.5%;'/><td class='rem' style='width: 2.0%;'/><td class='none' style='width: 76.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/libglusterfs/src/syncop.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/syncop.h</a></td><td class='right'>181</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 1.2%;'/><td class='none' style='width: 98.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/libglusterfs/src/syscall.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/syscall.c</a></td><td class='right'>846</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 4.2%;'/><td class='rem' style='width: 1.3%;'/><td class='none' style='width: 94.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/libglusterfs/src/syscall.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/syscall.h</a></td><td class='right'>148</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 1.0%;'/><td class='none' style='width: 99.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/libglusterfs/src/throttle-tbf.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/throttle-tbf.c</a></td><td class='right'>290</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.9%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 98.1%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/libglusterfs/src/timer.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/timer.c</a></td><td class='right'>405</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.4%;'/><td class='rem' style='width: 1.2%;'/><td class='none' style='width: 97.4%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/libglusterfs/src/timer.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/timer.h</a></td><td class='right'>70</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.5%;'/><td class='none' style='width: 99.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/libglusterfs/src/timespec.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/timespec.c</a></td><td class='right'>129</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.8%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.2%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/libglusterfs/src/trie.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/trie.c</a></td><td class='right'>366</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 2.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 97.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/libglusterfs/src/unittest/global_mock.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/unittest/global_mock.c</a></td><td class='right'>25</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/libglusterfs/src/unittest/log_mock.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/unittest/log_mock.c</a></td><td class='right'>52</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/libglusterfs/src/unittest/mem_pool_unittest.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/unittest/mem_pool_unittest.c</a></td><td class='right'>483</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 3.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 96.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/libglusterfs/src/unittest/unittest.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/unittest/unittest.h</a></td><td class='right'>47</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/libglusterfs/src/xlator.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/xlator.c</a></td><td class='right'>2326</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 9.1%;'/><td class='rem' style='width: 5.9%;'/><td class='none' style='width: 85.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/libglusterfs/src/xlator.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/xlator.h</a></td><td class='right'>864</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 5.6%;'/><td class='none' style='width: 94.4%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/libglusterfsclient/src/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfsclient/src/Makefile.am</a></td><td class='right'>16</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.1%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/libglusterfsclient/src/libglusterfsclient-dentry.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfsclient/src/libglusterfsclient-dentry.c</a></td><td class='right'>413</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 2.7%;'/><td class='none' style='width: 97.3%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='del'><a href='/cgit/glusterfs.git/diff/libglusterfsclient/src/libglusterfsclient-internals.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfsclient/src/libglusterfsclient-internals.h</a></td><td class='right'>298</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 1.9%;'/><td class='none' style='width: 98.1%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='del'><a href='/cgit/glusterfs.git/diff/libglusterfsclient/src/libglusterfsclient.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfsclient/src/libglusterfsclient.c</a></td><td class='right'>8169</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 52.6%;'/><td class='none' style='width: 47.4%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='del'><a href='/cgit/glusterfs.git/diff/libglusterfsclient/src/libglusterfsclient.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfsclient/src/libglusterfsclient.h</a></td><td class='right'>1372</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 8.8%;'/><td class='none' style='width: 91.2%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/mod_glusterfs/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>mod_glusterfs/Makefile.am</a></td><td class='right'>3</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 100.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/mod_glusterfs/apache/1.3/src/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>mod_glusterfs/apache/1.3/src/Makefile.am</a></td><td class='right'>30</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.2%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/mod_glusterfs/apache/1.3/src/README.txt?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>mod_glusterfs/apache/1.3/src/README.txt</a></td><td class='right'>107</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.7%;'/><td class='none' style='width: 99.3%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/mod_glusterfs/apache/1.3/src/mod_glusterfs.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>mod_glusterfs/apache/1.3/src/mod_glusterfs.c</a></td><td class='right'>507</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 3.3%;'/><td class='none' style='width: 96.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/mod_glusterfs/apache/2.2/src/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>mod_glusterfs/apache/2.2/src/Makefile.am</a></td><td class='right'>31</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.2%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/mod_glusterfs/apache/2.2/src/README.txt?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>mod_glusterfs/apache/2.2/src/README.txt</a></td><td class='right'>105</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.7%;'/><td class='none' style='width: 99.3%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/mod_glusterfs/apache/2.2/src/mod_glusterfs.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>mod_glusterfs/apache/2.2/src/mod_glusterfs.c</a></td><td class='right'>3627</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 23.3%;'/><td class='none' style='width: 76.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/mod_glusterfs/apache/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>mod_glusterfs/apache/Makefile.am</a></td><td class='right'>10</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.1%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/mod_glusterfs/lighttpd/1.4/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>mod_glusterfs/lighttpd/1.4/Makefile.am</a></td><td class='right'>3</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 100.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/mod_glusterfs/lighttpd/1.4/Makefile.am.diff?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>mod_glusterfs/lighttpd/1.4/Makefile.am.diff</a></td><td class='right'>29</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.2%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/mod_glusterfs/lighttpd/1.4/README.txt?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>mod_glusterfs/lighttpd/1.4/README.txt</a></td><td class='right'>57</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.4%;'/><td class='none' style='width: 99.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/mod_glusterfs/lighttpd/1.4/mod_glusterfs.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>mod_glusterfs/lighttpd/1.4/mod_glusterfs.c</a></td><td class='right'>1820</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 11.7%;'/><td class='none' style='width: 88.3%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/mod_glusterfs/lighttpd/1.4/mod_glusterfs.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>mod_glusterfs/lighttpd/1.4/mod_glusterfs.h</a></td><td class='right'>32</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.2%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/mod_glusterfs/lighttpd/1.5/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>mod_glusterfs/lighttpd/1.5/Makefile.am</a></td><td class='right'>3</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 100.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/mod_glusterfs/lighttpd/1.5/Makefile.am.diff?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>mod_glusterfs/lighttpd/1.5/Makefile.am.diff</a></td><td class='right'>29</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.2%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/mod_glusterfs/lighttpd/1.5/README.txt?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>mod_glusterfs/lighttpd/1.5/README.txt</a></td><td class='right'>57</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.4%;'/><td class='none' style='width: 99.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/mod_glusterfs/lighttpd/1.5/mod_glusterfs.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>mod_glusterfs/lighttpd/1.5/mod_glusterfs.c</a></td><td class='right'>1476</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 9.5%;'/><td class='none' style='width: 90.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/mod_glusterfs/lighttpd/1.5/mod_glusterfs.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>mod_glusterfs/lighttpd/1.5/mod_glusterfs.h</a></td><td class='right'>29</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.2%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/mod_glusterfs/lighttpd/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>mod_glusterfs/lighttpd/Makefile.am</a></td><td class='right'>3</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 100.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/rfc.sh?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>rfc.sh</a></td><td class='right'>330</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 2.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 97.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/rpc/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>rpc/Makefile.am</a></td><td class='right'>2</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 100.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/rpc/rpc-lib/src/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>rpc/rpc-lib/src/Makefile.am</a></td><td class='right'>28</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.1%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/rpc/rpc-lib/src/auth-glusterfs.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>rpc/rpc-lib/src/auth-glusterfs.c</a></td><td class='right'>514</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 2.3%;'/><td class='rem' style='width: 1.1%;'/><td class='none' style='width: 96.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/rpc/rpc-lib/src/auth-null.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>rpc/rpc-lib/src/auth-null.c</a></td><td class='right'>72</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.3%;'/><td class='none' style='width: 99.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/rpc/rpc-lib/src/auth-unix.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>rpc/rpc-lib/src/auth-unix.c</a></td><td class='right'>110</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.4%;'/><td class='none' style='width: 99.3%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/rpc/rpc-lib/src/autoscale-threads.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>rpc/rpc-lib/src/autoscale-threads.c</a></td><td class='right'>22</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/rpc/rpc-lib/src/libgfrpc.sym?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>rpc/rpc-lib/src/libgfrpc.sym</a></td><td class='right'>68</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/rpc/rpc-lib/src/mgmt-pmap.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>rpc/rpc-lib/src/mgmt-pmap.c</a></td><td class='right'>147</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.9%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.1%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/rpc/rpc-lib/src/protocol-common.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>rpc/rpc-lib/src/protocol-common.h</a></td><td class='right'>502</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 2.3%;'/><td class='rem' style='width: 1.0%;'/><td class='none' style='width: 96.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/rpc/rpc-lib/src/rpc-clnt-ping.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>rpc/rpc-lib/src/rpc-clnt-ping.c</a></td><td class='right'>357</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 2.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 97.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/rpc/rpc-lib/src/rpc-clnt-ping.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>rpc/rpc-lib/src/rpc-clnt-ping.h</a></td><td class='right'>16</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/rpc/rpc-lib/src/rpc-clnt.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>rpc/rpc-lib/src/rpc-clnt.c</a></td><td class='right'>2817</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 10.9%;'/><td class='rem' style='width: 7.2%;'/><td class='none' style='width: 81.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/rpc/rpc-lib/src/rpc-clnt.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>rpc/rpc-lib/src/rpc-clnt.h</a></td><td class='right'>297</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.0%;'/><td class='rem' style='width: 0.9%;'/><td class='none' style='width: 98.1%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/rpc/rpc-lib/src/rpc-common.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>rpc/rpc-lib/src/rpc-common.c</a></td><td class='right'>135</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.9%;'/><td class='none' style='width: 99.1%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/rpc/rpc-lib/src/rpc-drc.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>rpc/rpc-lib/src/rpc-drc.c</a></td><td class='right'>855</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 5.5%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 94.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/rpc/rpc-lib/src/rpc-drc.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>rpc/rpc-lib/src/rpc-drc.h</a></td><td class='right'>97</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.6%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.4%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/rpc/rpc-lib/src/rpc-lib-messages.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>rpc/rpc-lib/src/rpc-lib-messages.h</a></td><td class='right'>34</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/rpc/rpc-lib/src/rpc-transport.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>rpc/rpc-lib/src/rpc-transport.c</a></td><td class='right'>1516</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 3.3%;'/><td class='rem' style='width: 6.4%;'/><td class='none' style='width: 90.2%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/rpc/rpc-lib/src/rpc-transport.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>rpc/rpc-lib/src/rpc-transport.h</a></td><td class='right'>332</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.2%;'/><td class='rem' style='width: 1.0%;'/><td class='none' style='width: 97.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/rpc/rpc-lib/src/rpcsvc-auth.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>rpc/rpc-lib/src/rpcsvc-auth.c</a></td><td class='right'>788</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 3.0%;'/><td class='rem' style='width: 2.1%;'/><td class='none' style='width: 94.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/rpc/rpc-lib/src/rpcsvc-common.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>rpc/rpc-lib/src/rpcsvc-common.h</a></td><td class='right'>134</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.5%;'/><td class='rem' style='width: 0.3%;'/><td class='none' style='width: 99.1%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/rpc/rpc-lib/src/rpcsvc.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>rpc/rpc-lib/src/rpcsvc.c</a></td><td class='right'>4479</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 17.9%;'/><td class='rem' style='width: 10.9%;'/><td class='none' style='width: 71.2%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/rpc/rpc-lib/src/rpcsvc.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>rpc/rpc-lib/src/rpcsvc.h</a></td><td class='right'>825</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 3.2%;'/><td class='rem' style='width: 2.1%;'/><td class='none' style='width: 94.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/rpc/rpc-lib/src/xdr-common.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>rpc/rpc-lib/src/xdr-common.h</a></td><td class='right'>157</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.5%;'/><td class='rem' style='width: 0.5%;'/><td class='none' style='width: 99.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/rpc/rpc-lib/src/xdr-rpc.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>rpc/rpc-lib/src/xdr-rpc.c</a></td><td class='right'>279</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.9%;'/><td class='rem' style='width: 0.9%;'/><td class='none' style='width: 98.2%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/rpc/rpc-lib/src/xdr-rpc.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>rpc/rpc-lib/src/xdr-rpc.h</a></td><td class='right'>107</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.4%;'/><td class='rem' style='width: 0.3%;'/><td class='none' style='width: 99.3%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/rpc/rpc-lib/src/xdr-rpcclnt.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>rpc/rpc-lib/src/xdr-rpcclnt.c</a></td><td class='right'>154</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.4%;'/><td class='rem' style='width: 0.6%;'/><td class='none' style='width: 99.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/rpc/rpc-lib/src/xdr-rpcclnt.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>rpc/rpc-lib/src/xdr-rpcclnt.h</a></td><td class='right'>49</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.2%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/rpc/rpc-transport/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>rpc/rpc-transport/Makefile.am</a></td><td class='right'>2</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 100.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/rpc/rpc-transport/rdma/src/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>rpc/rpc-transport/rdma/src/Makefile.am</a></td><td class='right'>20</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.1%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/rpc/rpc-transport/rdma/src/name.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>rpc/rpc-transport/rdma/src/name.c</a></td><td class='right'>717</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 4.6%;'/><td class='none' style='width: 95.4%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/rpc/rpc-transport/rdma/src/name.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>rpc/rpc-transport/rdma/src/name.h</a></td><td class='right'>48</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.3%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/rpc/rpc-transport/rdma/src/rdma.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>rpc/rpc-transport/rdma/src/rdma.c</a></td><td class='right'>4806</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 30.9%;'/><td class='none' style='width: 69.1%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/rpc/rpc-transport/rdma/src/rdma.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>rpc/rpc-transport/rdma/src/rdma.h</a></td><td class='right'>395</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 2.5%;'/><td class='none' style='width: 97.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/rpc/rpc-transport/socket/src/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>rpc/rpc-transport/socket/src/Makefile.am</a></td><td class='right'>19</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/rpc/rpc-transport/socket/src/name.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>rpc/rpc-transport/socket/src/name.c</a></td><td class='right'>1181</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 3.9%;'/><td class='rem' style='width: 3.7%;'/><td class='none' style='width: 92.4%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/rpc/rpc-transport/socket/src/name.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>rpc/rpc-transport/socket/src/name.h</a></td><td class='right'>41</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.2%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/rpc/rpc-transport/socket/src/socket-mem-types.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>rpc/rpc-transport/socket/src/socket-mem-types.h</a></td><td class='right'>22</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/rpc/rpc-transport/socket/src/socket.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>rpc/rpc-transport/socket/src/socket.c</a></td><td class='right'>6070</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 26.8%;'/><td class='rem' style='width: 12.3%;'/><td class='none' style='width: 60.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/rpc/rpc-transport/socket/src/socket.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>rpc/rpc-transport/socket/src/socket.h</a></td><td class='right'>339</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.4%;'/><td class='rem' style='width: 0.8%;'/><td class='none' style='width: 97.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/rpc/xdr/src/.gitignore?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>rpc/xdr/src/.gitignore</a></td><td class='right'>25</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/rpc/xdr/src/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>rpc/xdr/src/Makefile.am</a></td><td class='right'>95</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.5%;'/><td class='rem' style='width: 0.1%;'/><td class='none' style='width: 99.4%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/rpc/xdr/src/acl3-xdr.x?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>rpc/xdr/src/acl3-xdr.x</a></td><td class='right'>52</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/rpc/xdr/src/changelog-xdr.x?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>rpc/xdr/src/changelog-xdr.x</a></td><td class='right'>42</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/rpc/xdr/src/cli1-xdr.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>rpc/xdr/src/cli1-xdr.c</a></td><td class='right'>547</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 3.5%;'/><td class='none' style='width: 96.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/rpc/xdr/src/cli1-xdr.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>rpc/xdr/src/cli1-xdr.h</a></td><td class='right'>423</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 2.7%;'/><td class='none' style='width: 97.3%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/rpc/xdr/src/cli1-xdr.x?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>rpc/xdr/src/cli1-xdr.x</a></td><td class='right'>306</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 2.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 98.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/rpc/xdr/src/cli1.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>rpc/xdr/src/cli1.c</a></td><td class='right'>525</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 3.4%;'/><td class='none' style='width: 96.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/rpc/xdr/src/cli1.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>rpc/xdr/src/cli1.h</a></td><td class='right'>239</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 1.5%;'/><td class='none' style='width: 98.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/rpc/xdr/src/cli1.x?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>rpc/xdr/src/cli1.x</a></td><td class='right'>235</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 1.5%;'/><td class='none' style='width: 98.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/rpc/xdr/src/glusterd1-xdr.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>rpc/xdr/src/glusterd1-xdr.c</a></td><td class='right'>267</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 1.7%;'/><td class='none' style='width: 98.3%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/rpc/xdr/src/glusterd1-xdr.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>rpc/xdr/src/glusterd1-xdr.h</a></td><td class='right'>218</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 1.4%;'/><td class='none' style='width: 98.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/rpc/xdr/src/glusterd1-xdr.x?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>rpc/xdr/src/glusterd1-xdr.x</a></td><td class='right'>249</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.6%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 98.4%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/rpc/xdr/src/glusterd1.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>rpc/xdr/src/glusterd1.c</a></td><td class='right'>234</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 1.5%;'/><td class='none' style='width: 98.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/rpc/xdr/src/glusterd1.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>rpc/xdr/src/glusterd1.h</a></td><td class='right'>112</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.7%;'/><td class='none' style='width: 99.3%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/rpc/xdr/src/glusterd1.x?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>rpc/xdr/src/glusterd1.x</a></td><td class='right'>107</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.7%;'/><td class='none' style='width: 99.3%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/rpc/xdr/src/glusterfs3-xdr.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>rpc/xdr/src/glusterfs3-xdr.c</a></td><td class='right'>1903</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 12.2%;'/><td class='none' style='width: 87.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/rpc/xdr/src/glusterfs3-xdr.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>rpc/xdr/src/glusterfs3-xdr.h</a></td><td class='right'>1369</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 8.8%;'/><td class='none' style='width: 91.2%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/rpc/xdr/src/glusterfs3-xdr.x?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>rpc/xdr/src/glusterfs3-xdr.x</a></td><td class='right'>890</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 5.7%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 94.3%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/rpc/xdr/src/glusterfs3.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>rpc/xdr/src/glusterfs3.c</a></td><td class='right'>1137</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 7.3%;'/><td class='none' style='width: 92.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/rpc/xdr/src/glusterfs3.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>rpc/xdr/src/glusterfs3.h</a></td><td class='right'>1447</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 6.1%;'/><td class='rem' style='width: 3.2%;'/><td class='none' style='width: 90.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/rpc/xdr/src/glusterfs3.x?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>rpc/xdr/src/glusterfs3.x</a></td><td class='right'>765</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 4.9%;'/><td class='none' style='width: 95.1%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/rpc/xdr/src/glusterfs4-xdr.x?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>rpc/xdr/src/glusterfs4-xdr.x</a></td><td class='right'>797</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 5.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 94.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/rpc/xdr/src/libgfxdr.sym?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>rpc/xdr/src/libgfxdr.sym</a></td><td class='right'>350</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 2.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 97.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/rpc/xdr/src/mount3udp.x?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>rpc/xdr/src/mount3udp.x</a></td><td class='right'>32</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/rpc/xdr/src/msg-nfs3.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>rpc/xdr/src/msg-nfs3.c</a></td><td class='right'>481</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 3.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 96.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/rpc/xdr/src/msg-nfs3.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>rpc/xdr/src/msg-nfs3.h</a></td><td class='right'>219</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 98.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/rpc/xdr/src/nlm4-xdr.x?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>rpc/xdr/src/nlm4-xdr.x</a></td><td class='right'>167</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 98.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/rpc/xdr/src/nsm-xdr.x?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>rpc/xdr/src/nsm-xdr.x</a></td><td class='right'>62</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/rpc/xdr/src/portmap-xdr.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>rpc/xdr/src/portmap-xdr.c</a></td><td class='right'>212</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 1.4%;'/><td class='none' style='width: 98.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/rpc/xdr/src/portmap-xdr.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>rpc/xdr/src/portmap-xdr.h</a></td><td class='right'>131</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.8%;'/><td class='none' style='width: 99.2%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/rpc/xdr/src/portmap-xdr.x?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>rpc/xdr/src/portmap-xdr.x</a></td><td class='right'>60</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/rpc/xdr/src/portmap.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>rpc/xdr/src/portmap.c</a></td><td class='right'>189</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 1.2%;'/><td class='none' style='width: 98.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/rpc/xdr/src/portmap.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>rpc/xdr/src/portmap.h</a></td><td class='right'>95</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.6%;'/><td class='none' style='width: 99.4%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/rpc/xdr/src/portmap.x?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>rpc/xdr/src/portmap.x</a></td><td class='right'>45</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.3%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/rpc/xdr/src/rpc-common-xdr.x?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>rpc/xdr/src/rpc-common-xdr.x</a></td><td class='right'>66</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/rpc/xdr/src/rpc-pragmas.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>rpc/xdr/src/rpc-pragmas.h</a></td><td class='right'>28</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/rpc/xdr/src/xdr-generic.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>rpc/xdr/src/xdr-generic.c</a></td><td class='right'>146</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.5%;'/><td class='rem' style='width: 0.4%;'/><td class='none' style='width: 99.1%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/rpc/xdr/src/xdr-generic.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>rpc/xdr/src/xdr-generic.h</a></td><td class='right'>80</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.4%;'/><td class='rem' style='width: 0.2%;'/><td class='none' style='width: 99.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/rpc/xdr/src/xdr-nfs3.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>rpc/xdr/src/xdr-nfs3.c</a></td><td class='right'>1907</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 12.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 87.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/rpc/xdr/src/xdr-nfs3.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>rpc/xdr/src/xdr-nfs3.h</a></td><td class='right'>1351</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 8.7%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 91.3%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/run-tests-in-vagrant.sh?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>run-tests-in-vagrant.sh</a></td><td class='right'>311</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 2.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 98.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/run-tests.sh?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>run-tests.sh</a></td><td class='right'>615</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 4.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 96.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/scheduler/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>scheduler/Makefile.am</a></td><td class='right'>3</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 100.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/scheduler/alu/src/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>scheduler/alu/src/Makefile.am</a></td><td class='right'>14</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.1%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/scheduler/alu/src/alu-mem-types.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>scheduler/alu/src/alu-mem-types.h</a></td><td class='right'>35</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.2%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/scheduler/alu/src/alu.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>scheduler/alu/src/alu.c</a></td><td class='right'>1019</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 6.6%;'/><td class='none' style='width: 93.4%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/scheduler/alu/src/alu.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>scheduler/alu/src/alu.h</a></td><td class='right'>89</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.6%;'/><td class='none' style='width: 99.4%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/scheduler/nufa/src/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>scheduler/nufa/src/Makefile.am</a></td><td class='right'>12</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.1%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/scheduler/nufa/src/nufa-mem-types.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>scheduler/nufa/src/nufa-mem-types.h</a></td><td class='right'>33</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.2%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/scheduler/nufa/src/nufa.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>scheduler/nufa/src/nufa.c</a></td><td class='right'>429</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 2.8%;'/><td class='none' style='width: 97.2%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/scheduler/random/src/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>scheduler/random/src/Makefile.am</a></td><td class='right'>14</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.1%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/scheduler/random/src/random-mem-types.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>scheduler/random/src/random-mem-types.h</a></td><td class='right'>32</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.2%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/scheduler/random/src/random.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>scheduler/random/src/random.c</a></td><td class='right'>305</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 2.0%;'/><td class='none' style='width: 98.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/scheduler/random/src/random.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>scheduler/random/src/random.h</a></td><td class='right'>46</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.3%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/scheduler/rr/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>scheduler/rr/Makefile.am</a></td><td class='right'>3</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 100.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/scheduler/rr/src/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>scheduler/rr/src/Makefile.am</a></td><td class='right'>13</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.1%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/scheduler/rr/src/rr-mem-types.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>scheduler/rr/src/rr-mem-types.h</a></td><td class='right'>32</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.2%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/scheduler/rr/src/rr-options.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>scheduler/rr/src/rr-options.c</a></td><td class='right'>256</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 1.6%;'/><td class='none' style='width: 98.4%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/scheduler/rr/src/rr-options.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>scheduler/rr/src/rr-options.h</a></td><td class='right'>34</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.2%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/scheduler/rr/src/rr.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>scheduler/rr/src/rr.c</a></td><td class='right'>567</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 3.6%;'/><td class='none' style='width: 96.4%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/scheduler/rr/src/rr.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>scheduler/rr/src/rr.h</a></td><td class='right'>70</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.5%;'/><td class='none' style='width: 99.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/scheduler/switch/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>scheduler/switch/Makefile.am</a></td><td class='right'>3</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 100.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/scheduler/switch/src/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>scheduler/switch/src/Makefile.am</a></td><td class='right'>12</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.1%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/scheduler/switch/src/switch-mem-types.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>scheduler/switch/src/switch-mem-types.h</a></td><td class='right'>33</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.2%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/scheduler/switch/src/switch.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>scheduler/switch/src/switch.c</a></td><td class='right'>451</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 2.9%;'/><td class='none' style='width: 97.1%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/site.h.in?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>site.h.in</a></td><td class='right'>44</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>l---------</td><td class='add'><a href='/cgit/glusterfs.git/diff/submit-for-review.sh?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>submit-for-review.sh</a></td><td class='right'>1</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 100.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/00-geo-rep/00-georep-verify-non-root-setup.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/00-geo-rep/00-georep-verify-non-root-setup.t</a></td><td class='right'>294</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.9%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 98.1%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/00-geo-rep/00-georep-verify-setup.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/00-geo-rep/00-georep-verify-setup.t</a></td><td class='right'>110</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.7%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.3%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/00-geo-rep/01-georep-glusterd-tests.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/00-geo-rep/01-georep-glusterd-tests.t</a></td><td class='right'>213</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 98.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/00-geo-rep/bug-1600145.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/00-geo-rep/bug-1600145.t</a></td><td class='right'>109</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.7%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.3%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/00-geo-rep/bug-1708603.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/00-geo-rep/bug-1708603.t</a></td><td class='right'>63</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/00-geo-rep/georep-basic-dr-rsync-arbiter.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/00-geo-rep/georep-basic-dr-rsync-arbiter.t</a></td><td class='right'>234</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.5%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 98.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/00-geo-rep/georep-basic-dr-rsync.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/00-geo-rep/georep-basic-dr-rsync.t</a></td><td class='right'>258</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.7%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 98.3%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/00-geo-rep/georep-basic-dr-tarssh-arbiter.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/00-geo-rep/georep-basic-dr-tarssh-arbiter.t</a></td><td class='right'>227</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.5%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 98.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/00-geo-rep/georep-basic-dr-tarssh.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/00-geo-rep/georep-basic-dr-tarssh.t</a></td><td class='right'>227</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.5%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 98.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/00-geo-rep/georep-basic-rsync-ec.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/00-geo-rep/georep-basic-rsync-ec.t</a></td><td class='right'>224</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 98.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/00-geo-rep/georep-basic-tarssh-ec.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/00-geo-rep/georep-basic-tarssh-ec.t</a></td><td class='right'>223</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 98.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/00-geo-rep/georep-config-upgrade.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/00-geo-rep/georep-config-upgrade.t</a></td><td class='right'>132</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.8%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.2%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/00-geo-rep/georep-stderr-hang.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/00-geo-rep/georep-stderr-hang.t</a></td><td class='right'>128</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.8%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.2%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/00-geo-rep/georep-upgrade.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/00-geo-rep/georep-upgrade.t</a></td><td class='right'>79</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.5%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/00-geo-rep/gsyncd.conf.old?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/00-geo-rep/gsyncd.conf.old</a></td><td class='right'>47</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/000-flaky/basic_afr_split-brain-favorite-child-policy.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/000-flaky/basic_afr_split-brain-favorite-child-policy.t</a></td><td class='right'>203</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 98.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/000-flaky/basic_changelog_changelog-snapshot.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/000-flaky/basic_changelog_changelog-snapshot.t</a></td><td class='right'>60</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/000-flaky/basic_distribute_rebal-all-nodes-migrate.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/000-flaky/basic_distribute_rebal-all-nodes-migrate.t</a></td><td class='right'>142</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.9%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.1%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/000-flaky/basic_ec_ec-quorum-count-partial-failure.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/000-flaky/basic_ec_ec-quorum-count-partial-failure.t</a></td><td class='right'>50</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/000-flaky/basic_mount-nfs-auth.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/000-flaky/basic_mount-nfs-auth.t</a></td><td class='right'>342</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 2.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 97.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/000-flaky/bugs_core_multiplex-limit-issue-151.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/000-flaky/bugs_core_multiplex-limit-issue-151.t</a></td><td class='right'>56</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/000-flaky/bugs_distribute_bug-1117851.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/000-flaky/bugs_distribute_bug-1117851.t</a></td><td class='right'>101</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.6%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.4%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/000-flaky/bugs_distribute_bug-1122443.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/000-flaky/bugs_distribute_bug-1122443.t</a></td><td class='right'>61</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/000-flaky/bugs_glusterd_bug-857330/common.rc?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/000-flaky/bugs_glusterd_bug-857330/common.rc</a></td><td class='right'>57</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/000-flaky/bugs_glusterd_bug-857330/normal.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/000-flaky/bugs_glusterd_bug-857330/normal.t</a></td><td class='right'>69</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/000-flaky/bugs_glusterd_bug-857330/xml.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/000-flaky/bugs_glusterd_bug-857330/xml.t</a></td><td class='right'>83</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.5%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/000-flaky/bugs_glusterd_quorum-value-check.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/000-flaky/bugs_glusterd_quorum-value-check.t</a></td><td class='right'>37</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/000-flaky/bugs_nfs_bug-1116503.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/000-flaky/bugs_nfs_bug-1116503.t</a></td><td class='right'>47</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/000-flaky/features_lock-migration_lkmigration-set-option.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/000-flaky/features_lock-migration_lkmigration-set-option.t</a></td><td class='right'>34</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/README.md?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/README.md</a></td><td class='right'>43</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/afr.rc?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/afr.rc</a></td><td class='right'>123</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.8%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.2%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/0symbol-check.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/0symbol-check.t</a></td><td class='right'>46</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/afr/add-brick-self-heal.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/afr/add-brick-self-heal.t</a></td><td class='right'>74</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.5%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/afr/afr-anon-inode-no-quorum.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/afr/afr-anon-inode-no-quorum.t</a></td><td class='right'>63</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/afr/afr-anon-inode.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/afr/afr-anon-inode.t</a></td><td class='right'>114</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.7%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.3%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/afr/afr-no-fsync.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/afr/afr-no-fsync.t</a></td><td class='right'>20</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/afr/afr-read-hash-mode.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/afr/afr-read-hash-mode.t</a></td><td class='right'>56</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/afr/afr-seek.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/afr/afr-seek.t</a></td><td class='right'>55</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/afr/afr-up.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/afr/afr-up.t</a></td><td class='right'>28</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/afr/arbiter-add-brick.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/afr/arbiter-add-brick.t</a></td><td class='right'>86</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.6%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.4%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/afr/arbiter-cli.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/afr/arbiter-cli.t</a></td><td class='right'>30</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/afr/arbiter-mount.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/afr/arbiter-mount.t</a></td><td class='right'>48</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/afr/arbiter-remove-brick.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/afr/arbiter-remove-brick.t</a></td><td class='right'>36</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/afr/arbiter-statfs.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/afr/arbiter-statfs.t</a></td><td class='right'>41</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/afr/arbiter.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/afr/arbiter.t</a></td><td class='right'>92</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.6%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.4%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/afr/client-side-heal.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/afr/client-side-heal.t</a></td><td class='right'>95</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.6%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.4%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/afr/data-self-heal.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/afr/data-self-heal.t</a></td><td class='right'>209</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 98.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/afr/durability-off.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/afr/durability-off.t</a></td><td class='right'>46</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/afr/entry-self-heal-anon-dir-off.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/afr/entry-self-heal-anon-dir-off.t</a></td><td class='right'>459</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 3.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 97.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/afr/entry-self-heal.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/afr/entry-self-heal.t</a></td><td class='right'>447</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 2.9%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 97.1%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/afr/gfid-heal.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/afr/gfid-heal.t</a></td><td class='right'>33</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/afr/gfid-mismatch-resolution-with-cli.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/afr/gfid-mismatch-resolution-with-cli.t</a></td><td class='right'>168</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 98.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/afr/gfid-mismatch-resolution-with-fav-child-policy.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/afr/gfid-mismatch-resolution-with-fav-child-policy.t</a></td><td class='right'>229</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.5%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 98.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/afr/gfid-mismatch.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/afr/gfid-mismatch.t</a></td><td class='right'>32</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/afr/gfid-self-heal.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/afr/gfid-self-heal.t</a></td><td class='right'>145</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.9%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.1%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/afr/granular-esh/add-brick.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/afr/granular-esh/add-brick.t</a></td><td class='right'>80</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.5%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/afr/granular-esh/cli.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/afr/granular-esh/cli.t</a></td><td class='right'>114</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.7%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.3%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/afr/granular-esh/conservative-merge.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/afr/granular-esh/conservative-merge.t</a></td><td class='right'>138</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.9%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.1%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/afr/granular-esh/granular-esh.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/afr/granular-esh/granular-esh.t</a></td><td class='right'>168</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 98.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/afr/granular-esh/granular-indices-but-non-granular-heal.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/afr/granular-esh/granular-indices-but-non-granular-heal.t</a></td><td class='right'>76</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.5%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/afr/granular-esh/replace-brick.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/afr/granular-esh/replace-brick.t</a></td><td class='right'>76</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.5%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/afr/halo.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/afr/halo.t</a></td><td class='right'>61</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/afr/heal-info.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/afr/heal-info.t</a></td><td class='right'>36</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/afr/heal-quota.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/afr/heal-quota.t</a></td><td class='right'>35</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/afr/inodelk.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/afr/inodelk.t</a></td><td class='right'>87</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.6%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.4%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/afr/lk-quorum.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/afr/lk-quorum.t</a></td><td class='right'>257</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.7%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 98.3%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/afr/metadata-self-heal.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/afr/metadata-self-heal.t</a></td><td class='right'>133</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.9%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.1%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/afr/name-self-heal.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/afr/name-self-heal.t</a></td><td class='right'>112</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.7%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.3%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/afr/quorum.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/afr/quorum.t</a></td><td class='right'>97</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.6%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.4%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/afr/read-subvol-data.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/afr/read-subvol-data.t</a></td><td class='right'>33</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/afr/read-subvol-entry.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/afr/read-subvol-entry.t</a></td><td class='right'>35</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/afr/rename-data-loss.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/afr/rename-data-loss.t</a></td><td class='right'>72</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.5%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/afr/replace-brick-self-heal.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/afr/replace-brick-self-heal.t</a></td><td class='right'>64</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/afr/resolve.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/afr/resolve.t</a></td><td class='right'>55</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/afr/root-squash-self-heal.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/afr/root-squash-self-heal.t</a></td><td class='right'>27</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/afr/self-heal.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/afr/self-heal.t</a></td><td class='right'>244</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.6%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 98.4%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/afr/self-heald.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/afr/self-heald.t</a></td><td class='right'>193</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 98.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/afr/sparse-file-self-heal.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/afr/sparse-file-self-heal.t</a></td><td class='right'>181</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 98.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/afr/split-brain-favorite-child-policy-client-side-healing.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/afr/split-brain-favorite-child-policy-client-side-healing.t</a></td><td class='right'>124</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.8%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.2%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/afr/split-brain-heal-info.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/afr/split-brain-heal-info.t</a></td><td class='right'>62</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/afr/split-brain-healing-ctime.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/afr/split-brain-healing-ctime.t</a></td><td class='right'>252</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.6%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 98.4%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/afr/split-brain-healing.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/afr/split-brain-healing.t</a></td><td class='right'>261</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.7%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 98.3%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/afr/split-brain-open.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/afr/split-brain-open.t</a></td><td class='right'>38</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/afr/split-brain-resolution.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/afr/split-brain-resolution.t</a></td><td class='right'>105</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.7%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.3%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/afr/stale-file-lookup.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/afr/stale-file-lookup.t</a></td><td class='right'>30</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/afr/ta-check-locks.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/afr/ta-check-locks.t</a></td><td class='right'>68</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/afr/ta-read.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/afr/ta-read.t</a></td><td class='right'>64</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/afr/ta-shd.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/afr/ta-shd.t</a></td><td class='right'>49</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/afr/ta-write-on-bad-brick.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/afr/ta-write-on-bad-brick.t</a></td><td class='right'>51</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/afr/ta.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/afr/ta.t</a></td><td class='right'>54</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/afr/tarissue.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/afr/tarissue.t</a></td><td class='right'>39</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/all_squash.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/all_squash.t</a></td><td class='right'>74</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.5%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/cdc.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/cdc.t</a></td><td class='right'>148</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/changelog/changelog-api.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/changelog/changelog-api.t</a></td><td class='right'>37</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/changelog/changelog-history.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/changelog/changelog-history.t</a></td><td class='right'>91</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.6%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.4%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/changelog/changelog-rename.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/changelog/changelog-rename.t</a></td><td class='right'>44</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/changelog/history-api.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/changelog/history-api.t</a></td><td class='right'>42</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/cloudsync-sanity.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/cloudsync-sanity.t</a></td><td class='right'>29</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/ctime/ctime-ec-heal.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/ctime/ctime-ec-heal.t</a></td><td class='right'>70</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.5%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/ctime/ctime-ec-rebalance.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/ctime/ctime-ec-rebalance.t</a></td><td class='right'>43</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/ctime/ctime-glfs-init.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/ctime/ctime-glfs-init.c</a></td><td class='right'>68</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/ctime/ctime-glfs-init.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/ctime/ctime-glfs-init.t</a></td><td class='right'>23</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/ctime/ctime-heal-symlinks.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/ctime/ctime-heal-symlinks.t</a></td><td class='right'>65</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/ctime/ctime-mdata-legacy-files.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/ctime/ctime-mdata-legacy-files.t</a></td><td class='right'>83</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.5%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/ctime/ctime-noatime.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/ctime/ctime-noatime.t</a></td><td class='right'>49</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/ctime/ctime-readdir.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/ctime/ctime-readdir.c</a></td><td class='right'>29</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/ctime/ctime-readdir.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/ctime/ctime-readdir.t</a></td><td class='right'>50</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/ctime/ctime-rep-heal.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/ctime/ctime-rep-heal.t</a></td><td class='right'>70</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.5%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/ctime/ctime-rep-rebalance.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/ctime/ctime-rep-rebalance.t</a></td><td class='right'>41</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/ctime/ctime-utimesat.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/ctime/ctime-utimesat.t</a></td><td class='right'>28</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/distribute/brick-down.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/distribute/brick-down.t</a></td><td class='right'>83</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.5%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/distribute/bug-1265677-use-readdirp.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/distribute/bug-1265677-use-readdirp.t</a></td><td class='right'>38</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/distribute/debug-xattrs.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/distribute/debug-xattrs.t</a></td><td class='right'>54</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/distribute/dir-heal.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/distribute/dir-heal.t</a></td><td class='right'>145</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.9%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.1%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/distribute/file-create.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/distribute/file-create.t</a></td><td class='right'>120</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.8%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.2%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/distribute/file-rename.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/distribute/file-rename.t</a></td><td class='right'>1021</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 6.6%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 93.4%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/distribute/force-migration.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/distribute/force-migration.t</a></td><td class='right'>50</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/distribute/lookup.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/distribute/lookup.t</a></td><td class='right'>54</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/distribute/non-root-unlink-stale-linkto.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/distribute/non-root-unlink-stale-linkto.t</a></td><td class='right'>51</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/distribute/spare_file_rebalance.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/distribute/spare_file_rebalance.t</a></td><td class='right'>51</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/distribute/throttle-rebal.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/distribute/throttle-rebal.t</a></td><td class='right'>56</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/ec/dht-rename.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/ec/dht-rename.t</a></td><td class='right'>19</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/ec/ec-1468261.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/ec/ec-1468261.t</a></td><td class='right'>95</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.6%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.4%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/ec/ec-3-1.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/ec/ec-3-1.t</a></td><td class='right'>14</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/ec/ec-4-1.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/ec/ec-4-1.t</a></td><td class='right'>14</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/ec/ec-5-2.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/ec/ec-5-2.t</a></td><td class='right'>14</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/ec/ec-6-2.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/ec/ec-6-2.t</a></td><td class='right'>14</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/ec/ec-anonymous-fd.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/ec/ec-anonymous-fd.t</a></td><td class='right'>42</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/ec/ec-background-heals.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/ec/ec-background-heals.t</a></td><td class='right'>105</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.7%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.3%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/ec/ec-badfd.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/ec/ec-badfd.c</a></td><td class='right'>124</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.8%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.2%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/ec/ec-badfd.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/ec/ec-badfd.t</a></td><td class='right'>26</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/ec/ec-common?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/ec/ec-common</a></td><td class='right'>145</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.9%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.1%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/ec/ec-cpu-extensions.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/ec/ec-cpu-extensions.t</a></td><td class='right'>62</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/ec/ec-data-heal.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/ec/ec-data-heal.t</a></td><td class='right'>75</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.5%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/ec/ec-dirty-flags.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/ec/ec-dirty-flags.t</a></td><td class='right'>23</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/ec/ec-discard.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/ec/ec-discard.t</a></td><td class='right'>205</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 98.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/ec/ec-fallocate.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/ec/ec-fallocate.t</a></td><td class='right'>72</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.5%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/ec/ec-fast-fgetxattr.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/ec/ec-fast-fgetxattr.c</a></td><td class='right'>129</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.8%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.2%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/ec/ec-fast-fgetxattr.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/ec/ec-fast-fgetxattr.t</a></td><td class='right'>40</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/ec/ec-fix-openfd.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/ec/ec-fix-openfd.t</a></td><td class='right'>111</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.7%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.3%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/ec/ec-internal-xattrs.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/ec/ec-internal-xattrs.t</a></td><td class='right'>45</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/ec/ec-new-entry.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/ec/ec-new-entry.t</a></td><td class='right'>70</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.5%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/ec/ec-notify.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/ec/ec-notify.t</a></td><td class='right'>101</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.6%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.4%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/ec/ec-optimistic-changelog.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/ec/ec-optimistic-changelog.t</a></td><td class='right'>153</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/ec/ec-quorum-count.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/ec/ec-quorum-count.t</a></td><td class='right'>167</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 98.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/ec/ec-read-mask.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/ec/ec-read-mask.t</a></td><td class='right'>114</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.7%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.3%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/ec/ec-read-policy.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/ec/ec-read-policy.t</a></td><td class='right'>52</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/ec/ec-readdir.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/ec/ec-readdir.t</a></td><td class='right'>46</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/ec/ec-rebalance.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/ec/ec-rebalance.t</a></td><td class='right'>61</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/ec/ec-reset-brick.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/ec/ec-reset-brick.t</a></td><td class='right'>50</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/ec/ec-root-heal.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/ec/ec-root-heal.t</a></td><td class='right'>34</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/ec/ec-seek.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/ec/ec-seek.t</a></td><td class='right'>58</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/ec/ec-stripe.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/ec/ec-stripe.t</a></td><td class='right'>227</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.5%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 98.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/ec/ec-up.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/ec/ec-up.t</a></td><td class='right'>28</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/ec/ec.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/ec/ec.t</a></td><td class='right'>259</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.7%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 98.3%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/ec/gfapi-ec-open-truncate.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/ec/gfapi-ec-open-truncate.c</a></td><td class='right'>171</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 98.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/ec/gfapi-ec-open-truncate.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/ec/gfapi-ec-open-truncate.t</a></td><td class='right'>48</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/ec/heal-info.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/ec/heal-info.t</a></td><td class='right'>74</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.5%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/ec/lock-contention.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/ec/lock-contention.t</a></td><td class='right'>62</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/ec/nfs.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/ec/nfs.t</a></td><td class='right'>29</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/ec/quota.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/ec/quota.t</a></td><td class='right'>45</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/ec/self-heal-read-write-fail.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/ec/self-heal-read-write-fail.t</a></td><td class='right'>69</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/ec/self-heal.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/ec/self-heal.t</a></td><td class='right'>235</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.5%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 98.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/ec/statedump.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/ec/statedump.t</a></td><td class='right'>28</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/exports_parsing.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/exports_parsing.t</a></td><td class='right'>57</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/fencing/afr-lock-heal-advanced.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/fencing/afr-lock-heal-advanced.c</a></td><td class='right'>227</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.5%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 98.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/fencing/afr-lock-heal-advanced.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/fencing/afr-lock-heal-advanced.t</a></td><td class='right'>115</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.7%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.3%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/fencing/afr-lock-heal-basic.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/fencing/afr-lock-heal-basic.c</a></td><td class='right'>182</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 98.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/fencing/afr-lock-heal-basic.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/fencing/afr-lock-heal-basic.t</a></td><td class='right'>102</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.7%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.3%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/fencing/fence-basic.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/fencing/fence-basic.c</a></td><td class='right'>229</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.5%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 98.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/fencing/fence-basic.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/fencing/fence-basic.t</a></td><td class='right'>31</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/fencing/fencing-crash-conistency.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/fencing/fencing-crash-conistency.t</a></td><td class='right'>62</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/fencing/test-fence-option.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/fencing/test-fence-option.t</a></td><td class='right'>37</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/fop-sampling.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/fop-sampling.t</a></td><td class='right'>61</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/fops-sanity.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/fops-sanity.c</a></td><td class='right'>1033</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 6.6%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 93.4%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/fops-sanity.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/fops-sanity.t</a></td><td class='right'>27</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/fuse/Makefile?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/fuse/Makefile</a></td><td class='right'>12</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/fuse/active-io-graph-switch.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/fuse/active-io-graph-switch.t</a></td><td class='right'>65</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/fuse/seek.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/fuse/seek.c</a></td><td class='right'>82</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.5%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/geo-replication/marker-xattrs.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/geo-replication/marker-xattrs.t</a></td><td class='right'>80</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.5%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/gfapi/Makefile?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/gfapi/Makefile</a></td><td class='right'>22</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/gfapi/anonymous_fd.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/gfapi/anonymous_fd.t</a></td><td class='right'>26</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/gfapi/anonymous_fd_read_write.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/gfapi/anonymous_fd_read_write.c</a></td><td class='right'>106</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.7%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.3%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/gfapi/bug-1241104.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/gfapi/bug-1241104.c</a></td><td class='right'>93</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.6%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.4%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/gfapi/bug-1241104.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/gfapi/bug-1241104.t</a></td><td class='right'>30</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/gfapi/bug-1507896.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/gfapi/bug-1507896.c</a></td><td class='right'>49</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/gfapi/bug-1507896.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/gfapi/bug-1507896.t</a></td><td class='right'>33</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/gfapi/bug1283983.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/gfapi/bug1283983.c</a></td><td class='right'>122</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.8%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.2%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/gfapi/bug1283983.sh?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/gfapi/bug1283983.sh</a></td><td class='right'>33</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/gfapi/bug1291259.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/gfapi/bug1291259.c</a></td><td class='right'>181</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 98.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/gfapi/bug1291259.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/gfapi/bug1291259.t</a></td><td class='right'>32</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/gfapi/bug1613098.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/gfapi/bug1613098.c</a></td><td class='right'>96</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.6%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.4%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/gfapi/bug1613098.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/gfapi/bug1613098.t</a></td><td class='right'>22</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/gfapi/gfapi-async-calls-test.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/gfapi/gfapi-async-calls-test.c</a></td><td class='right'>494</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 3.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 96.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/gfapi/gfapi-async-calls-test.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/gfapi/gfapi-async-calls-test.t</a></td><td class='right'>26</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/gfapi/gfapi-copy-file-range.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/gfapi/gfapi-copy-file-range.t</a></td><td class='right'>82</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.5%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/gfapi/gfapi-dup.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/gfapi/gfapi-dup.c</a></td><td class='right'>84</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.5%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/gfapi/gfapi-dup.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/gfapi/gfapi-dup.t</a></td><td class='right'>27</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/gfapi/gfapi-graph-switch-open-fd.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/gfapi/gfapi-graph-switch-open-fd.t</a></td><td class='right'>44</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/gfapi/gfapi-keep-writing.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/gfapi/gfapi-keep-writing.c</a></td><td class='right'>129</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.8%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.2%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/gfapi/gfapi-load-volfile.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/gfapi/gfapi-load-volfile.c</a></td><td class='right'>65</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/gfapi/gfapi-load-volfile.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/gfapi/gfapi-load-volfile.t</a></td><td class='right'>28</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/gfapi/gfapi-ssl-load-volfile-test.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/gfapi/gfapi-ssl-load-volfile-test.c</a></td><td class='right'>127</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.8%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.2%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/gfapi/gfapi-ssl-load-volfile-test.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/gfapi/gfapi-ssl-load-volfile-test.t</a></td><td class='right'>76</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.5%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/gfapi/gfapi-ssl-test.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/gfapi/gfapi-ssl-test.c</a></td><td class='right'>124</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.8%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.2%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/gfapi/gfapi-ssl-test.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/gfapi/gfapi-ssl-test.t</a></td><td class='right'>61</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/gfapi/gfapi-statx-basic.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/gfapi/gfapi-statx-basic.c</a></td><td class='right'>184</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 98.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/gfapi/gfapi-statx-basic.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/gfapi/gfapi-statx-basic.t</a></td><td class='right'>30</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/gfapi/gfapi-trunc.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/gfapi/gfapi-trunc.c</a></td><td class='right'>89</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.6%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.4%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/gfapi/gfapi-trunc.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/gfapi/gfapi-trunc.t</a></td><td class='right'>22</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/gfapi/glfd-lkowner.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/gfapi/glfd-lkowner.c</a></td><td class='right'>214</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 98.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/gfapi/glfd-lkowner.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/gfapi/glfd-lkowner.t</a></td><td class='right'>27</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/gfapi/glfs-copy-file-range.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/gfapi/glfs-copy-file-range.c</a></td><td class='right'>180</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 98.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/gfapi/glfs_h_creat_open.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/gfapi/glfs_h_creat_open.c</a></td><td class='right'>118</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.8%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.2%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/gfapi/glfs_h_creat_open.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/gfapi/glfs_h_creat_open.t</a></td><td class='right'>27</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/gfapi/glfs_sysrq.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/gfapi/glfs_sysrq.c</a></td><td class='right'>60</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/gfapi/glfs_sysrq.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/gfapi/glfs_sysrq.t</a></td><td class='right'>39</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/gfapi/glfs_xreaddirplus_r.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/gfapi/glfs_xreaddirplus_r.c</a></td><td class='right'>242</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.6%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 98.4%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/gfapi/glfs_xreaddirplus_r.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/gfapi/glfs_xreaddirplus_r.t</a></td><td class='right'>28</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/gfapi/glfsxmp-coverage.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/gfapi/glfsxmp-coverage.c</a></td><td class='right'>1900</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 12.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 87.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/gfapi/glfsxmp.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/gfapi/glfsxmp.t</a></td><td class='right'>30</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/gfapi/libgfapi-fini-hang.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/gfapi/libgfapi-fini-hang.c</a></td><td class='right'>62</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/gfapi/libgfapi-fini-hang.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/gfapi/libgfapi-fini-hang.t</a></td><td class='right'>42</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/gfapi/mandatory-lock-optimal.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/gfapi/mandatory-lock-optimal.c</a></td><td class='right'>532</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 3.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 96.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/gfapi/mandatory-lock-optimal.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/gfapi/mandatory-lock-optimal.t</a></td><td class='right'>38</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/gfapi/protocol-client-ssl.vol.in?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/gfapi/protocol-client-ssl.vol.in</a></td><td class='right'>15</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/gfapi/protocol-client.vol.in?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/gfapi/protocol-client.vol.in</a></td><td class='right'>14</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/gfapi/seek.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/gfapi/seek.c</a></td><td class='right'>99</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.6%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.4%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/gfapi/sink.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/gfapi/sink.t</a></td><td class='right'>13</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/gfapi/sink.vol?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/gfapi/sink.vol</a></td><td class='right'>24</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/gfapi/upcall-cache-invalidate.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/gfapi/upcall-cache-invalidate.c</a></td><td class='right'>209</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 98.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/gfapi/upcall-cache-invalidate.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/gfapi/upcall-cache-invalidate.t</a></td><td class='right'>30</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/gfapi/upcall-register-api.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/gfapi/upcall-register-api.c</a></td><td class='right'>286</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.8%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 98.2%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/gfapi/upcall-register-api.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/gfapi/upcall-register-api.t</a></td><td class='right'>30</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/gfid-access.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/gfid-access.t</a></td><td class='right'>80</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.5%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/gfproxy.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/gfproxy.t</a></td><td class='right'>71</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.5%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/global-threading.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/global-threading.t</a></td><td class='right'>104</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.7%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.3%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/glusterd-restart-shd-mux.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/glusterd-restart-shd-mux.t</a></td><td class='right'>96</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.6%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.4%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/glusterd/arbiter-volume-probe.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/glusterd/arbiter-volume-probe.t</a></td><td class='right'>25</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/glusterd/check-cloudsync-ancestry.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/glusterd/check-cloudsync-ancestry.t</a></td><td class='right'>48</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/glusterd/disperse-create.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/glusterd/disperse-create.t</a></td><td class='right'>73</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.5%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/glusterd/heald.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/glusterd/heald.t</a></td><td class='right'>92</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.6%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.4%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/glusterd/thin-arbiter-volume-probe.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/glusterd/thin-arbiter-volume-probe.t</a></td><td class='right'>25</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/glusterd/thin-arbiter-volume.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/glusterd/thin-arbiter-volume.t</a></td><td class='right'>45</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/glusterd/volfile_server_switch.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/glusterd/volfile_server_switch.t</a></td><td class='right'>46</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/glusterd/volume-brick-count.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/glusterd/volume-brick-count.t</a></td><td class='right'>61</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/glusterfsd-args.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/glusterfsd-args.t</a></td><td class='right'>5</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 100.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/graph-cleanup-brick-down-shd-mux.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/graph-cleanup-brick-down-shd-mux.t</a></td><td class='right'>64</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/hardlink-limit.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/hardlink-limit.t</a></td><td class='right'>44</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/inode-leak.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/inode-leak.t</a></td><td class='right'>31</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/inode-quota-enforcing.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/inode-quota-enforcing.t</a></td><td class='right'>100</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.6%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.4%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/ios-dump.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/ios-dump.t</a></td><td class='right'>43</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/jbr/jbr-volgen.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/jbr/jbr-volgen.t</a></td><td class='right'>39</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/jbr/jbr.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/jbr/jbr.t</a></td><td class='right'>38</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/logchecks-messages.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/logchecks-messages.h</a></td><td class='right'>105</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.7%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.3%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/logchecks.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/logchecks.c</a></td><td class='right'>214</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 98.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/md-cache/bug-1317785.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/md-cache/bug-1317785.t</a></td><td class='right'>34</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/md-cache/bug-1418249.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/md-cache/bug-1418249.t</a></td><td class='right'>20</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/meta.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/meta.t</a></td><td class='right'>45</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/metadisp/fsyncdir.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/metadisp/fsyncdir.c</a></td><td class='right'>29</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/metadisp/ftruncate.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/metadisp/ftruncate.c</a></td><td class='right'>34</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/metadisp/fxattr.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/metadisp/fxattr.c</a></td><td class='right'>107</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.7%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.3%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/metadisp/gfs-fsetxattr.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/metadisp/gfs-fsetxattr.c</a></td><td class='right'>141</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.9%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.1%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/metadisp/metadisp.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/metadisp/metadisp.t</a></td><td class='right'>316</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 2.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 98.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/metadisp/metadisp.vol?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/metadisp/metadisp.vol</a></td><td class='right'>14</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/mgmt_v3-locks.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/mgmt_v3-locks.t</a></td><td class='right'>120</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.8%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.2%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/mount-options.disabled?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/mount-options.disabled</a></td><td class='right'>143</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.9%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.1%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/mount.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/mount.t</a></td><td class='right'>85</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.5%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/mpx-compat.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/mpx-compat.t</a></td><td class='right'>53</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/multiple-volume-shd-mux.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/multiple-volume-shd-mux.t</a></td><td class='right'>46</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/multiplex.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/multiplex.t</a></td><td class='right'>78</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.5%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/namespace.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/namespace.t</a></td><td class='right'>131</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.8%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.2%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/netgroup_parsing.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/netgroup_parsing.t</a></td><td class='right'>56</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/nl-cache.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/nl-cache.t</a></td><td class='right'>98</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.6%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.4%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/nufa.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/nufa.t</a></td><td class='right'>41</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/op_errnos.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/op_errnos.t</a></td><td class='right'>34</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/open-behind/open-behind.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/open-behind/open-behind.t</a></td><td class='right'>183</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 98.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/open-behind/tester-fd.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/open-behind/tester-fd.c</a></td><td class='right'>99</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.6%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.4%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/open-behind/tester.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/open-behind/tester.c</a></td><td class='right'>444</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 2.9%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 97.1%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/open-behind/tester.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/open-behind/tester.h</a></td><td class='right'>145</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.9%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.1%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/open-fd-snap-delete.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/open-fd-snap-delete.t</a></td><td class='right'>74</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.5%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/peer-parsing.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/peer-parsing.t</a></td><td class='right'>52</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/pgfid-feat.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/pgfid-feat.t</a></td><td class='right'>35</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/playground/template-xlator-sanity.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/playground/template-xlator-sanity.t</a></td><td class='right'>43</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/posix/shared-statfs.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/posix/shared-statfs.t</a></td><td class='right'>58</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/posix/zero-fill-enospace.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/posix/zero-fill-enospace.c</a></td><td class='right'>67</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/posix/zero-fill-enospace.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/posix/zero-fill-enospace.t</a></td><td class='right'>35</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/posixonly.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/posixonly.t</a></td><td class='right'>31</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/quick-read-with-upcall.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/quick-read-with-upcall.t</a></td><td class='right'>72</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.5%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/quota-ancestry-building.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/quota-ancestry-building.t</a></td><td class='right'>71</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.5%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/quota-anon-fd-nfs.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/quota-anon-fd-nfs.t</a></td><td class='right'>117</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.8%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.2%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/quota-nfs.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/quota-nfs.t</a></td><td class='right'>66</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/quota-rename.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/quota-rename.t</a></td><td class='right'>37</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/quota.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/quota.c</a></td><td class='right'>89</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.6%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.4%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/quota.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/quota.t</a></td><td class='right'>236</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.5%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 98.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/quota_aux_mount.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/quota_aux_mount.t</a></td><td class='right'>53</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/rpc-coverage.sh?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/rpc-coverage.sh</a></td><td class='right'>499</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 3.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 96.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/rpc-coverage.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/rpc-coverage.t</a></td><td class='right'>25</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/sdfs-sanity.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/sdfs-sanity.t</a></td><td class='right'>28</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/seek.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/seek.c</a></td><td class='right'>182</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 98.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/shd-mux-afr.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/shd-mux-afr.t</a></td><td class='right'>70</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.5%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/shd-mux-ec.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/shd-mux-ec.t</a></td><td class='right'>75</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.5%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/stats-dump.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/stats-dump.t</a></td><td class='right'>55</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/symbol-check.sh?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/symbol-check.sh</a></td><td class='right'>114</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.7%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.3%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/trace.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/trace.t</a></td><td class='right'>55</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/uss.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/uss.t</a></td><td class='right'>421</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 2.7%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 97.3%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/volfile-sanity.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/volfile-sanity.t</a></td><td class='right'>29</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/volume-scale-shd-mux.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/volume-scale-shd-mux.t</a></td><td class='right'>116</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.7%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.3%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/volume-snap-scheduler.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/volume-snap-scheduler.t</a></td><td class='right'>49</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/volume-snapshot-clone.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/volume-snapshot-clone.t</a></td><td class='right'>129</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.8%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.2%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/volume-snapshot-xml.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/volume-snapshot-xml.t</a></td><td class='right'>72</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.5%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/volume-snapshot.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/volume-snapshot.t</a></td><td class='right'>172</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 98.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/volume-status.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/volume-status.t</a></td><td class='right'>114</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.7%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.3%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/volume.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/volume.t</a></td><td class='right'>60</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/basic/xlator-pass-through-sanity.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/basic/xlator-pass-through-sanity.t</a></td><td class='right'>22</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bitrot/br-signer-threads-config-1797869.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bitrot/br-signer-threads-config-1797869.t</a></td><td class='right'>73</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.5%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bitrot/br-state-check.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bitrot/br-state-check.t</a></td><td class='right'>83</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.5%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bitrot/br-stub.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bitrot/br-stub.c</a></td><td class='right'>195</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 98.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bitrot/br-stub.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bitrot/br-stub.t</a></td><td class='right'>66</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bitrot/bug-1207627-bitrot-scrub-status.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bitrot/bug-1207627-bitrot-scrub-status.t</a></td><td class='right'>52</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bitrot/bug-1221914.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bitrot/bug-1221914.t</a></td><td class='right'>51</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bitrot/bug-1244613.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bitrot/bug-1244613.t</a></td><td class='right'>95</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.6%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.4%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bitrot/bug-1294786.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bitrot/bug-1294786.t</a></td><td class='right'>95</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.6%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.4%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bitrot/bug-1373520.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bitrot/bug-1373520.t</a></td><td class='right'>71</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.5%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bitrot/bug-1700078.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bitrot/bug-1700078.t</a></td><td class='right'>87</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.6%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.4%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bitrot/bug-internal-xattrs-check-1243391.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bitrot/bug-internal-xattrs-check-1243391.t</a></td><td class='right'>42</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/access-control/bug-1051896.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/access-control/bug-1051896.c</a></td><td class='right'>94</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.6%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.4%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/access-control/bug-1051896.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/access-control/bug-1051896.t</a></td><td class='right'>34</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/access-control/bug-1387241.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/access-control/bug-1387241.c</a></td><td class='right'>18</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/access-control/bug-1387241.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/access-control/bug-1387241.t</a></td><td class='right'>36</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/access-control/bug-887098-gmount-crash.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/access-control/bug-887098-gmount-crash.t</a></td><td class='right'>42</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/access-control/bug-958691.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/access-control/bug-958691.t</a></td><td class='right'>52</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/bitrot/1207029-bitrot-daemon-should-start-on-valid-node.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/bitrot/1207029-bitrot-daemon-should-start-on-valid-node.t</a></td><td class='right'>57</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/bitrot/1209751-bitrot-scrub-tunable-reset.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/bitrot/1209751-bitrot-scrub-tunable-reset.t</a></td><td class='right'>48</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/bitrot/1209752-volume-status-should-show-bitrot-scrub-info.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/bitrot/1209752-volume-status-should-show-bitrot-scrub-info.t</a></td><td class='right'>70</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.5%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/bitrot/1209818-vol-info-show-scrub-process-properly.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/bitrot/1209818-vol-info-show-scrub-process-properly.t</a></td><td class='right'>48</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/bitrot/bug-1210684-scrub-pause-resume-error-handling.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/bitrot/bug-1210684-scrub-pause-resume-error-handling.t</a></td><td class='right'>39</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/bitrot/bug-1227996.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/bitrot/bug-1227996.t</a></td><td class='right'>57</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/bitrot/bug-1228680.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/bitrot/bug-1228680.t</a></td><td class='right'>48</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/bitrot/bug-1229134-bitd-not-support-vol-set.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/bitrot/bug-1229134-bitd-not-support-vol-set.t</a></td><td class='right'>38</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/bitrot/bug-1245981.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/bitrot/bug-1245981.t</a></td><td class='right'>55</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/bitrot/bug-1288490.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/bitrot/bug-1288490.t</a></td><td class='right'>48</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/bug-1064147.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/bug-1064147.t</a></td><td class='right'>72</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.5%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/bug-1110262.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/bug-1110262.t</a></td><td class='right'>72</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.5%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/bug-1138841.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/bug-1138841.t</a></td><td class='right'>25</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/bug-1258069.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/bug-1258069.t</a></td><td class='right'>30</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/bug-1368312.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/bug-1368312.t</a></td><td class='right'>86</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.6%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.4%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/bug-1371806.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/bug-1371806.t</a></td><td class='right'>81</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.5%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/bug-1371806_1.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/bug-1371806_1.t</a></td><td class='right'>48</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/bug-1371806_2.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/bug-1371806_2.t</a></td><td class='right'>52</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/bug-1371806_3.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/bug-1371806_3.t</a></td><td class='right'>63</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/bug-1371806_acl.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/bug-1371806_acl.t</a></td><td class='right'>96</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.6%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.4%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/bug-1584517.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/bug-1584517.t</a></td><td class='right'>70</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.5%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/bug-1620580.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/bug-1620580.t</a></td><td class='right'>67</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/bug-1694920.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/bug-1694920.t</a></td><td class='right'>63</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/bug-1702299.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/bug-1702299.t</a></td><td class='right'>67</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/changelog/bug-1208470.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/changelog/bug-1208470.t</a></td><td class='right'>40</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/changelog/bug-1211327.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/changelog/bug-1211327.t</a></td><td class='right'>46</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/changelog/bug-1225542.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/changelog/bug-1225542.t</a></td><td class='right'>30</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/changelog/bug-1321955.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/changelog/bug-1321955.t</a></td><td class='right'>60</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/cli/bug-1004218.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/cli/bug-1004218.t</a></td><td class='right'>26</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/cli/bug-1022905.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/cli/bug-1022905.t</a></td><td class='right'>37</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/cli/bug-1030580.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/cli/bug-1030580.t</a></td><td class='right'>53</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/cli/bug-1047378.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/cli/bug-1047378.t</a></td><td class='right'>12</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/cli/bug-1047416.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/cli/bug-1047416.t</a></td><td class='right'>71</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.5%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/cli/bug-1077682.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/cli/bug-1077682.t</a></td><td class='right'>24</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/cli/bug-1087487.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/cli/bug-1087487.t</a></td><td class='right'>23</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/cli/bug-1113476.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/cli/bug-1113476.t</a></td><td class='right'>45</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/cli/bug-1169302.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/cli/bug-1169302.c</a></td><td class='right'>79</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.5%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/cli/bug-1169302.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/cli/bug-1169302.t</a></td><td class='right'>55</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/cli/bug-1320388.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/cli/bug-1320388.t</a></td><td class='right'>44</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/cli/bug-1353156-get-state-cli-validations.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/cli/bug-1353156-get-state-cli-validations.t</a></td><td class='right'>147</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.9%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.1%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/cli/bug-1378842-volume-get-all.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/cli/bug-1378842-volume-get-all.t</a></td><td class='right'>23</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/cli/bug-764638.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/cli/bug-764638.t</a></td><td class='right'>13</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/cli/bug-822830.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/cli/bug-822830.t</a></td><td class='right'>64</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/cli/bug-867252.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/cli/bug-867252.t</a></td><td class='right'>41</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/cli/bug-921215.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/cli/bug-921215.t</a></td><td class='right'>13</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/cli/bug-949298.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/cli/bug-949298.t</a></td><td class='right'>12</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/cli/bug-961307.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/cli/bug-961307.t</a></td><td class='right'>20</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/cli/bug-969193.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/cli/bug-969193.t</a></td><td class='right'>13</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/cli/bug-977246.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/cli/bug-977246.t</a></td><td class='right'>21</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/cli/bug-982174.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/cli/bug-982174.t</a></td><td class='right'>36</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/cli/bug-983317-volume-get.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/cli/bug-983317-volume-get.t</a></td><td class='right'>45</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/core/949327.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/core/949327.t</a></td><td class='right'>23</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/core/brick-mux-fd-cleanup.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/core/brick-mux-fd-cleanup.t</a></td><td class='right'>78</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.5%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/core/bug-1110917.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/core/bug-1110917.t</a></td><td class='right'>39</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/core/bug-1111557.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/core/bug-1111557.t</a></td><td class='right'>12</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/core/bug-1117951.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/core/bug-1117951.t</a></td><td class='right'>24</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/core/bug-1119582.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/core/bug-1119582.t</a></td><td class='right'>24</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/core/bug-1135514-allow-setxattr-with-null-value.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/core/bug-1135514-allow-setxattr-with-null-value.t</a></td><td class='right'>18</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/core/bug-1168803-snapd-option-validation-fix.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/core/bug-1168803-snapd-option-validation-fix.t</a></td><td class='right'>30</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/core/bug-1402841.t-mt-dir-scan-race.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/core/bug-1402841.t-mt-dir-scan-race.t</a></td><td class='right'>42</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/core/bug-1421721-mpx-toggle.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/core/bug-1421721-mpx-toggle.t</a></td><td class='right'>25</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/core/bug-1432542-mpx-restart-crash.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/core/bug-1432542-mpx-restart-crash.t</a></td><td class='right'>116</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.7%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.3%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/core/bug-1650403.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/core/bug-1650403.t</a></td><td class='right'>113</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.7%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.3%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/core/bug-1699025-brick-mux-detach-brick-fd-issue.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/core/bug-1699025-brick-mux-detach-brick-fd-issue.t</a></td><td class='right'>33</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/core/bug-834465.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/core/bug-834465.c</a></td><td class='right'>60</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/core/bug-834465.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/core/bug-834465.t</a></td><td class='right'>51</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/core/bug-845213.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/core/bug-845213.t</a></td><td class='right'>19</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/core/bug-903336.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/core/bug-903336.t</a></td><td class='right'>13</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/core/bug-908146.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/core/bug-908146.t</a></td><td class='right'>30</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/core/bug-913544.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/core/bug-913544.t</a></td><td class='right'>24</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/core/bug-924075.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/core/bug-924075.t</a></td><td class='right'>23</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/core/bug-927616.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/core/bug-927616.t</a></td><td class='right'>65</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/core/bug-949242.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/core/bug-949242.t</a></td><td class='right'>55</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/core/bug-986429.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/core/bug-986429.t</a></td><td class='right'>19</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/core/io-stats-1322825.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/core/io-stats-1322825.t</a></td><td class='right'>67</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/core/log-bug-1362520.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/core/log-bug-1362520.t</a></td><td class='right'>43</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/ctime/issue-832.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/ctime/issue-832.t</a></td><td class='right'>32</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/distribute/bug-1042725.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/distribute/bug-1042725.t</a></td><td class='right'>49</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/distribute/bug-1066798.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/distribute/bug-1066798.t</a></td><td class='right'>88</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.6%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.4%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/distribute/bug-1086228.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/distribute/bug-1086228.t</a></td><td class='right'>34</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/distribute/bug-1088231.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/distribute/bug-1088231.t</a></td><td class='right'>173</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 98.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/distribute/bug-1099890.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/distribute/bug-1099890.t</a></td><td class='right'>130</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.8%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.2%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/distribute/bug-1125824.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/distribute/bug-1125824.t</a></td><td class='right'>103</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.7%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.3%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/distribute/bug-1161156.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/distribute/bug-1161156.t</a></td><td class='right'>58</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/distribute/bug-1161311.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/distribute/bug-1161311.t</a></td><td class='right'>164</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 98.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/distribute/bug-1190734.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/distribute/bug-1190734.t</a></td><td class='right'>93</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.6%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.4%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/distribute/bug-1193636.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/distribute/bug-1193636.c</a></td><td class='right'>68</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/distribute/bug-1193636.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/distribute/bug-1193636.t</a></td><td class='right'>74</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.5%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/distribute/bug-1204140.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/distribute/bug-1204140.t</a></td><td class='right'>22</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/distribute/bug-1247563.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/distribute/bug-1247563.t</a></td><td class='right'>62</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/distribute/bug-1368012.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/distribute/bug-1368012.t</a></td><td class='right'>51</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/distribute/bug-1389697.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/distribute/bug-1389697.t</a></td><td class='right'>42</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/distribute/bug-1543279.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/distribute/bug-1543279.t</a></td><td class='right'>67</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/distribute/bug-1600379.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/distribute/bug-1600379.t</a></td><td class='right'>54</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/distribute/bug-1667804.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/distribute/bug-1667804.t</a></td><td class='right'>63</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/distribute/bug-1786679.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/distribute/bug-1786679.t</a></td><td class='right'>69</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/distribute/bug-853258.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/distribute/bug-853258.t</a></td><td class='right'>47</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/distribute/bug-860663.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/distribute/bug-860663.c</a></td><td class='right'>41</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/distribute/bug-860663.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/distribute/bug-860663.t</a></td><td class='right'>56</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/distribute/bug-862967.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/distribute/bug-862967.t</a></td><td class='right'>59</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/distribute/bug-882278.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/distribute/bug-882278.t</a></td><td class='right'>73</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.5%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/distribute/bug-884455.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/distribute/bug-884455.t</a></td><td class='right'>84</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.5%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/distribute/bug-884597.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/distribute/bug-884597.t</a></td><td class='right'>173</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 98.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/distribute/bug-907072.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/distribute/bug-907072.t</a></td><td class='right'>49</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/distribute/bug-912564.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/distribute/bug-912564.t</a></td><td class='right'>92</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.6%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.4%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/distribute/bug-915554.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/distribute/bug-915554.t</a></td><td class='right'>76</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.5%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/distribute/bug-921408.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/distribute/bug-921408.t</a></td><td class='right'>90</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.6%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.4%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/distribute/bug-924265.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/distribute/bug-924265.t</a></td><td class='right'>35</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/distribute/bug-961615.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/distribute/bug-961615.t</a></td><td class='right'>34</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/distribute/bug-973073.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/distribute/bug-973073.t</a></td><td class='right'>48</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/distribute/issue-1327.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/distribute/issue-1327.t</a></td><td class='right'>33</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/distribute/overlap.py?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/distribute/overlap.py</a></td><td class='right'>59</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/ec/bug-1161621.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/ec/bug-1161621.t</a></td><td class='right'>42</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/ec/bug-1161886.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/ec/bug-1161886.c</a></td><td class='right'>53</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/ec/bug-1161886.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/ec/bug-1161886.t</a></td><td class='right'>44</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/ec/bug-1179050.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/ec/bug-1179050.t</a></td><td class='right'>23</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/ec/bug-1187474.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/ec/bug-1187474.t</a></td><td class='right'>43</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/ec/bug-1188145.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/ec/bug-1188145.t</a></td><td class='right'>50</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/ec/bug-1227869.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/ec/bug-1227869.t</a></td><td class='right'>33</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/ec/bug-1236065.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/ec/bug-1236065.t</a></td><td class='right'>95</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.6%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.4%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/ec/bug-1251446.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/ec/bug-1251446.t</a></td><td class='right'>50</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/ec/bug-1304988.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/ec/bug-1304988.t</a></td><td class='right'>42</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/ec/bug-1547662.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/ec/bug-1547662.t</a></td><td class='right'>41</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/ec/bug-1699866-check-reopen-fd.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/ec/bug-1699866-check-reopen-fd.t</a></td><td class='right'>34</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/ec/bug-1708156-honor-inodelk-contention-notify-on-partial-locks.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/ec/bug-1708156-honor-inodelk-contention-notify-on-partial-locks.t</a></td><td class='right'>54</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/error-gen/bug-767095.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/error-gen/bug-767095.t</a></td><td class='right'>51</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/fuse/bug-1030208.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/fuse/bug-1030208.t</a></td><td class='right'>35</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/fuse/bug-1126048.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/fuse/bug-1126048.c</a></td><td class='right'>43</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/fuse/bug-1126048.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/fuse/bug-1126048.t</a></td><td class='right'>30</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/fuse/bug-1283103.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/fuse/bug-1283103.t</a></td><td class='right'>59</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/fuse/bug-1309462.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/fuse/bug-1309462.t</a></td><td class='right'>50</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/fuse/bug-1336818.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/fuse/bug-1336818.t</a></td><td class='right'>52</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/fuse/bug-858215.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/fuse/bug-858215.t</a></td><td class='right'>79</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.5%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/fuse/bug-858488-min-free-disk.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/fuse/bug-858488-min-free-disk.t</a></td><td class='right'>108</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.7%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.3%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/fuse/bug-924726.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/fuse/bug-924726.t</a></td><td class='right'>45</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/fuse/bug-963678.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/fuse/bug-963678.t</a></td><td class='right'>57</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/fuse/bug-983477.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/fuse/bug-983477.t</a></td><td class='right'>53</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/fuse/bug-985074.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/fuse/bug-985074.t</a></td><td class='right'>54</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/fuse/many-groups-for-acl.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/fuse/many-groups-for-acl.t</a></td><td class='right'>123</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.8%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.2%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/fuse/setup.sh?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/fuse/setup.sh</a></td><td class='right'>20</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/fuse/teardown.sh?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/fuse/teardown.sh</a></td><td class='right'>5</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 100.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/geo-replication/bug-1111490.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/geo-replication/bug-1111490.t</a></td><td class='right'>35</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/geo-replication/bug-1296496.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/geo-replication/bug-1296496.t</a></td><td class='right'>44</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/geo-replication/bug-877293.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/geo-replication/bug-877293.t</a></td><td class='right'>41</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/gfapi/bug-1032894.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/gfapi/bug-1032894.t</a></td><td class='right'>33</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/gfapi/bug-1093594.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/gfapi/bug-1093594.c</a></td><td class='right'>311</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 2.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 98.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/gfapi/bug-1093594.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/gfapi/bug-1093594.t</a></td><td class='right'>22</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/gfapi/bug-1319374-THIS-crash.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/gfapi/bug-1319374-THIS-crash.t</a></td><td class='right'>27</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/gfapi/bug-1319374.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/gfapi/bug-1319374.c</a></td><td class='right'>131</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.8%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.2%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/gfapi/bug-1447266/1460514.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/gfapi/bug-1447266/1460514.c</a></td><td class='right'>150</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/gfapi/bug-1447266/1460514.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/gfapi/bug-1447266/1460514.t</a></td><td class='right'>26</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/gfapi/bug-1447266/bug-1447266.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/gfapi/bug-1447266/bug-1447266.c</a></td><td class='right'>107</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.7%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.3%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/gfapi/bug-1447266/bug-1447266.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/gfapi/bug-1447266/bug-1447266.t</a></td><td class='right'>60</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/gfapi/bug-1630804/gfapi-bz1630804.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/gfapi/bug-1630804/gfapi-bz1630804.c</a></td><td class='right'>112</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.7%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.3%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/gfapi/bug-1630804/gfapi-bz1630804.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/gfapi/bug-1630804/gfapi-bz1630804.t</a></td><td class='right'>25</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/gfapi/glfs_vol_set_IO_ERR.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/gfapi/glfs_vol_set_IO_ERR.c</a></td><td class='right'>163</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/gfapi/glfs_vol_set_IO_ERR.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/gfapi/glfs_vol_set_IO_ERR.t</a></td><td class='right'>20</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/glusterd/859927/repl.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/glusterd/859927/repl.t</a></td><td class='right'>59</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/glusterd/add-brick-and-validate-replicated-volume-options.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/glusterd/add-brick-and-validate-replicated-volume-options.t</a></td><td class='right'>110</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.7%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.3%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/glusterd/brick-mux-validation-in-cluster.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/glusterd/brick-mux-validation-in-cluster.t</a></td><td class='right'>108</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.7%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.3%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/glusterd/brick-mux-validation.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/glusterd/brick-mux-validation.t</a></td><td class='right'>104</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.7%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.3%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/glusterd/brick-mux.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/glusterd/brick-mux.t</a></td><td class='right'>81</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.5%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/glusterd/brick-order-check-add-brick.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/glusterd/brick-order-check-add-brick.t</a></td><td class='right'>61</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/glusterd/bug-1070734.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/glusterd/bug-1070734.t</a></td><td class='right'>80</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.5%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/glusterd/bug-1085330-and-bug-916549.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/glusterd/bug-1085330-and-bug-916549.t</a></td><td class='right'>93</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.6%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.4%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/glusterd/bug-1091935-brick-order-check-from-cli-to-glusterd.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/glusterd/bug-1091935-brick-order-check-from-cli-to-glusterd.t</a></td><td class='right'>93</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.6%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.4%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/glusterd/bug-1238706-daemons-stop-on-peer-cleanup.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/glusterd/bug-1238706-daemons-stop-on-peer-cleanup.t</a></td><td class='right'>44</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/glusterd/bug-1242875-do-not-pass-volinfo-quota.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/glusterd/bug-1242875-do-not-pass-volinfo-quota.t</a></td><td class='right'>38</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/glusterd/bug-1482906-peer-file-blank-line.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/glusterd/bug-1482906-peer-file-blank-line.t</a></td><td class='right'>29</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/glusterd/bug-1595320.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/glusterd/bug-1595320.t</a></td><td class='right'>93</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.6%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.4%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/glusterd/bug-1696046.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/glusterd/bug-1696046.t</a></td><td class='right'>113</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.7%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.3%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/glusterd/bug-1699339.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/glusterd/bug-1699339.t</a></td><td class='right'>73</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.5%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/glusterd/bug-1720566.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/glusterd/bug-1720566.t</a></td><td class='right'>50</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/glusterd/bug-824753-file-locker.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/glusterd/bug-824753-file-locker.c</a></td><td class='right'>46</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/glusterd/bug-824753.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/glusterd/bug-824753.t</a></td><td class='right'>45</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/glusterd/bug-948729/bug-948729-force.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/glusterd/bug-948729/bug-948729-force.t</a></td><td class='right'>103</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.7%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.3%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/glusterd/bug-948729/bug-948729-mode-script.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/glusterd/bug-948729/bug-948729-mode-script.t</a></td><td class='right'>77</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.5%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/glusterd/bug-948729/bug-948729.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/glusterd/bug-948729/bug-948729.t</a></td><td class='right'>80</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.5%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/glusterd/bug-949930.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/glusterd/bug-949930.t</a></td><td class='right'>29</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/glusterd/check_elastic_server.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/glusterd/check_elastic_server.t</a></td><td class='right'>63</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/glusterd/daemon-log-level-option.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/glusterd/daemon-log-level-option.t</a></td><td class='right'>93</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.6%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.4%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/glusterd/df-results-post-replace-brick-operations.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/glusterd/df-results-post-replace-brick-operations.t</a></td><td class='right'>61</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/glusterd/mgmt-handshake-and-volume-sync-post-glusterd-restart.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/glusterd/mgmt-handshake-and-volume-sync-post-glusterd-restart.t</a></td><td class='right'>71</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.5%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/glusterd/optimized-basic-testcases-in-cluster.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/glusterd/optimized-basic-testcases-in-cluster.t</a></td><td class='right'>115</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.7%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.3%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/glusterd/optimized-basic-testcases.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/glusterd/optimized-basic-testcases.t</a></td><td class='right'>305</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 2.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 98.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/glusterd/quorum-validation.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/glusterd/quorum-validation.t</a></td><td class='right'>122</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.8%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.2%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/glusterd/rebalance-in-cluster.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/glusterd/rebalance-in-cluster.t</a></td><td class='right'>52</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/glusterd/rebalance-operations-in-single-node.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/glusterd/rebalance-operations-in-single-node.t</a></td><td class='right'>131</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.8%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.2%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/glusterd/remove-brick-in-cluster.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/glusterd/remove-brick-in-cluster.t</a></td><td class='right'>60</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/glusterd/remove-brick-testcases.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/glusterd/remove-brick-testcases.t</a></td><td class='right'>119</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.8%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.2%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/glusterd/remove-brick-validation.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/glusterd/remove-brick-validation.t</a></td><td class='right'>68</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/glusterd/removing-multiple-bricks-in-single-remove-brick-command.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/glusterd/removing-multiple-bricks-in-single-remove-brick-command.t</a></td><td class='right'>80</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.5%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/glusterd/replace-brick-operations.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/glusterd/replace-brick-operations.t</a></td><td class='right'>48</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/glusterd/reset-brick-and-daemons-follow-quorum.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/glusterd/reset-brick-and-daemons-follow-quorum.t</a></td><td class='right'>63</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/glusterd/serialize-shd-manager-glusterd-restart.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/glusterd/serialize-shd-manager-glusterd-restart.t</a></td><td class='right'>54</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/glusterd/snapshot-operations.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/glusterd/snapshot-operations.t</a></td><td class='right'>50</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/glusterd/sync-post-glusterd-restart.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/glusterd/sync-post-glusterd-restart.t</a></td><td class='right'>54</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/glusterd/validating-options-for-replicated-volume.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/glusterd/validating-options-for-replicated-volume.t</a></td><td class='right'>142</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.9%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.1%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/glusterd/validating-server-quorum.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/glusterd/validating-server-quorum.t</a></td><td class='right'>125</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.8%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.2%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/glusterfs-server/bug-852147.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/glusterfs-server/bug-852147.t</a></td><td class='right'>85</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.5%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/glusterfs-server/bug-861542.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/glusterfs-server/bug-861542.t</a></td><td class='right'>50</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/glusterfs-server/bug-864222.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/glusterfs-server/bug-864222.t</a></td><td class='right'>30</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/glusterfs-server/bug-873549.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/glusterfs-server/bug-873549.t</a></td><td class='right'>17</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/glusterfs-server/bug-877992.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/glusterfs-server/bug-877992.t</a></td><td class='right'>63</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/glusterfs-server/bug-887145.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/glusterfs-server/bug-887145.t</a></td><td class='right'>99</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.6%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.4%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/glusterfs-server/bug-889996.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/glusterfs-server/bug-889996.t</a></td><td class='right'>19</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/glusterfs-server/bug-904300.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/glusterfs-server/bug-904300.t</a></td><td class='right'>65</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/glusterfs-server/bug-905864.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/glusterfs-server/bug-905864.c</a></td><td class='right'>83</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.5%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/glusterfs-server/bug-905864.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/glusterfs-server/bug-905864.t</a></td><td class='right'>32</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/glusterfs-server/bug-912297.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/glusterfs-server/bug-912297.t</a></td><td class='right'>44</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/glusterfs/bug-1482528.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/glusterfs/bug-1482528.t</a></td><td class='right'>100</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.6%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.4%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/glusterfs/bug-811493.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/glusterfs/bug-811493.t</a></td><td class='right'>18</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/glusterfs/bug-844688.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/glusterfs/bug-844688.t</a></td><td class='right'>55</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/glusterfs/bug-848251.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/glusterfs/bug-848251.t</a></td><td class='right'>52</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/glusterfs/bug-853690.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/glusterfs/bug-853690.t</a></td><td class='right'>91</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.6%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.4%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/glusterfs/bug-856455.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/glusterfs/bug-856455.t</a></td><td class='right'>43</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/glusterfs/bug-860297.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/glusterfs/bug-860297.t</a></td><td class='right'>13</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/glusterfs/bug-861015-index.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/glusterfs/bug-861015-index.t</a></td><td class='right'>36</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/glusterfs/bug-861015-log.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/glusterfs/bug-861015-log.t</a></td><td class='right'>29</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/glusterfs/bug-866459.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/glusterfs/bug-866459.t</a></td><td class='right'>44</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/glusterfs/bug-867253.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/glusterfs/bug-867253.t</a></td><td class='right'>64</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/glusterfs/bug-869724.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/glusterfs/bug-869724.t</a></td><td class='right'>37</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/glusterfs/bug-872923.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/glusterfs/bug-872923.t</a></td><td class='right'>59</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/glusterfs/bug-873962-spb.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/glusterfs/bug-873962-spb.t</a></td><td class='right'>40</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/glusterfs/bug-873962.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/glusterfs/bug-873962.t</a></td><td class='right'>107</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.7%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.3%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/glusterfs/bug-879490.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/glusterfs/bug-879490.t</a></td><td class='right'>37</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/glusterfs/bug-879494.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/glusterfs/bug-879494.t</a></td><td class='right'>37</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/glusterfs/bug-892730.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/glusterfs/bug-892730.t</a></td><td class='right'>77</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.5%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/glusterfs/bug-893338.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/glusterfs/bug-893338.t</a></td><td class='right'>34</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/glusterfs/bug-893378.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/glusterfs/bug-893378.t</a></td><td class='right'>75</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.5%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/glusterfs/bug-895235.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/glusterfs/bug-895235.t</a></td><td class='right'>23</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/glusterfs/bug-896431.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/glusterfs/bug-896431.t</a></td><td class='right'>89</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.6%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.4%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/glusterfs/bug-902610.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/glusterfs/bug-902610.t</a></td><td class='right'>66</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/glusterfs/bug-906646.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/glusterfs/bug-906646.t</a></td><td class='right'>97</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.6%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.4%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/glusterfs/getlk_owner.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/glusterfs/getlk_owner.c</a></td><td class='right'>124</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.8%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.2%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/heal-symlinks.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/heal-symlinks.t</a></td><td class='right'>65</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/index/bug-1559004-EMLINK-handling.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/index/bug-1559004-EMLINK-handling.t</a></td><td class='right'>91</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.6%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.4%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/io-cache/bug-858242.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/io-cache/bug-858242.c</a></td><td class='right'>84</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.5%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/io-cache/bug-858242.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/io-cache/bug-858242.t</a></td><td class='right'>28</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/io-cache/bug-read-hang.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/io-cache/bug-read-hang.c</a></td><td class='right'>125</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.8%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.2%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/io-cache/bug-read-hang.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/io-cache/bug-read-hang.t</a></td><td class='right'>34</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/io-stats/bug-1598548.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/io-stats/bug-1598548.t</a></td><td class='right'>41</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/logging/bug-823081.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/logging/bug-823081.t</a></td><td class='right'>41</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/md-cache/afr-stale-read.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/md-cache/afr-stale-read.t</a></td><td class='right'>44</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/md-cache/bug-1211863.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/md-cache/bug-1211863.t</a></td><td class='right'>69</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/md-cache/bug-1211863_unlink.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/md-cache/bug-1211863_unlink.t</a></td><td class='right'>49</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/md-cache/bug-1476324.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/md-cache/bug-1476324.t</a></td><td class='right'>27</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/md-cache/bug-1632503.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/md-cache/bug-1632503.t</a></td><td class='right'>24</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/md-cache/bug-1726205.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/md-cache/bug-1726205.t</a></td><td class='right'>22</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/md-cache/setxattr-prepoststat.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/md-cache/setxattr-prepoststat.t</a></td><td class='right'>38</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/nfs/bug-1053579.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/nfs/bug-1053579.t</a></td><td class='right'>114</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.7%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.3%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/nfs/bug-1143880-fix-gNFSd-auth-crash.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/nfs/bug-1143880-fix-gNFSd-auth-crash.t</a></td><td class='right'>24</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/nfs/bug-1157223-symlink-mounting.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/nfs/bug-1157223-symlink-mounting.t</a></td><td class='right'>126</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.8%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.2%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/nfs/bug-1161092-nfs-acls.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/nfs/bug-1161092-nfs-acls.t</a></td><td class='right'>39</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/nfs/bug-1166862.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/nfs/bug-1166862.t</a></td><td class='right'>69</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/nfs/bug-1210338.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/nfs/bug-1210338.c</a></td><td class='right'>31</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/nfs/bug-1210338.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/nfs/bug-1210338.t</a></td><td class='right'>30</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/nfs/bug-1302948.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/nfs/bug-1302948.t</a></td><td class='right'>13</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/nfs/bug-847622.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/nfs/bug-847622.t</a></td><td class='right'>39</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/nfs/bug-877885.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/nfs/bug-877885.t</a></td><td class='right'>39</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/nfs/bug-904065.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/nfs/bug-904065.t</a></td><td class='right'>100</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.6%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.4%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/nfs/bug-915280.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/nfs/bug-915280.t</a></td><td class='right'>54</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/nfs/bug-970070.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/nfs/bug-970070.t</a></td><td class='right'>13</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/nfs/bug-974972.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/nfs/bug-974972.t</a></td><td class='right'>41</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/nfs/showmount-many-clients.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/nfs/showmount-many-clients.t</a></td><td class='right'>43</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/nfs/socket-as-fifo.py?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/nfs/socket-as-fifo.py</a></td><td class='right'>33</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/nfs/socket-as-fifo.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/nfs/socket-as-fifo.t</a></td><td class='right'>25</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/nfs/subdir-trailing-slash.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/nfs/subdir-trailing-slash.t</a></td><td class='right'>32</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/nfs/zero-atime.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/nfs/zero-atime.t</a></td><td class='right'>33</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/nl-cache/bug-1451588.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/nl-cache/bug-1451588.t</a></td><td class='right'>25</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/posix/bug-1034716.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/posix/bug-1034716.t</a></td><td class='right'>60</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/posix/bug-1040275-brick-uid-reset-on-volume-restart.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/posix/bug-1040275-brick-uid-reset-on-volume-restart.t</a></td><td class='right'>60</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/posix/bug-1113960.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/posix/bug-1113960.t</a></td><td class='right'>98</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.6%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.4%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/posix/bug-1122028.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/posix/bug-1122028.t</a></td><td class='right'>51</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/posix/bug-1175711.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/posix/bug-1175711.c</a></td><td class='right'>37</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/posix/bug-1175711.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/posix/bug-1175711.t</a></td><td class='right'>30</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/posix/bug-1360679.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/posix/bug-1360679.t</a></td><td class='right'>36</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/posix/bug-1619720.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/posix/bug-1619720.t</a></td><td class='right'>58</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/posix/bug-1651445.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/posix/bug-1651445.t</a></td><td class='right'>54</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/posix/bug-765380.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/posix/bug-765380.t</a></td><td class='right'>39</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/posix/bug-990028.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/posix/bug-990028.t</a></td><td class='right'>157</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/posix/bug-gfid-path.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/posix/bug-gfid-path.t</a></td><td class='right'>70</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.5%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/posix/disallow-gfid-volumeid-fremovexattr.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/posix/disallow-gfid-volumeid-fremovexattr.c</a></td><td class='right'>104</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.7%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.3%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/posix/disallow-gfid-volumeid-fremovexattr.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/posix/disallow-gfid-volumeid-fremovexattr.t</a></td><td class='right'>21</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/posix/disallow-gfid-volumeid-removexattr.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/posix/disallow-gfid-volumeid-removexattr.t</a></td><td class='right'>26</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/protocol/bug-1321578.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/protocol/bug-1321578.t</a></td><td class='right'>82</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.5%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/protocol/bug-1390914.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/protocol/bug-1390914.t</a></td><td class='right'>36</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/protocol/bug-1433815-auth-allow.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/protocol/bug-1433815-auth-allow.t</a></td><td class='right'>40</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/protocol/bug-762989.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/protocol/bug-762989.t</a></td><td class='right'>40</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/protocol/bug-808400-dist.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/protocol/bug-808400-dist.t</a></td><td class='right'>32</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/protocol/bug-808400-fcntl.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/protocol/bug-808400-fcntl.c</a></td><td class='right'>124</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.8%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.2%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/protocol/bug-808400-flock.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/protocol/bug-808400-flock.c</a></td><td class='right'>100</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.6%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.4%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/protocol/bug-808400-repl.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/protocol/bug-808400-repl.t</a></td><td class='right'>31</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/protocol/bug-808400.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/protocol/bug-808400.t</a></td><td class='right'>35</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/quick-read/bug-846240.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/quick-read/bug-846240.t</a></td><td class='right'>59</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/quick-read/bz1523599/bz1523599.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/quick-read/bz1523599/bz1523599.t</a></td><td class='right'>32</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/quick-read/bz1523599/test_bz1523599.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/quick-read/bz1523599/test_bz1523599.c</a></td><td class='right'>198</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 98.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/quota/afr-quota-xattr-mdata-heal.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/quota/afr-quota-xattr-mdata-heal.t</a></td><td class='right'>140</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.9%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.1%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/quota/bug-1035576.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/quota/bug-1035576.t</a></td><td class='right'>53</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/quota/bug-1038598.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/quota/bug-1038598.t</a></td><td class='right'>52</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/quota/bug-1087198.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/quota/bug-1087198.t</a></td><td class='right'>86</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.6%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.4%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/quota/bug-1104692.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/quota/bug-1104692.t</a></td><td class='right'>26</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/quota/bug-1153964.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/quota/bug-1153964.t</a></td><td class='right'>81</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.5%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/quota/bug-1178130.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/quota/bug-1178130.t</a></td><td class='right'>44</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/quota/bug-1235182.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/quota/bug-1235182.t</a></td><td class='right'>61</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/quota/bug-1243798.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/quota/bug-1243798.t</a></td><td class='right'>46</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/quota/bug-1250582-volume-reset-should-not-remove-quota-quota-deem-statfs.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/quota/bug-1250582-volume-reset-should-not-remove-quota-quota-deem-statfs.t</a></td><td class='right'>53</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/quota/bug-1260545.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/quota/bug-1260545.t</a></td><td class='right'>53</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/quota/bug-1287996.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/quota/bug-1287996.t</a></td><td class='right'>21</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/quota/bug-1292020.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/quota/bug-1292020.t</a></td><td class='right'>28</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/quota/bug-1293601.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/quota/bug-1293601.t</a></td><td class='right'>33</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/read-only/bug-1134822-read-only-default-in-graph.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/read-only/bug-1134822-read-only-default-in-graph.t</a></td><td class='right'>67</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/readdir-ahead/bug-1390050.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/readdir-ahead/bug-1390050.c</a></td><td class='right'>72</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.5%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/readdir-ahead/bug-1390050.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/readdir-ahead/bug-1390050.t</a></td><td class='right'>29</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/readdir-ahead/bug-1436090.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/readdir-ahead/bug-1436090.t</a></td><td class='right'>44</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/readdir-ahead/bug-1439640.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/readdir-ahead/bug-1439640.t</a></td><td class='right'>31</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/readdir-ahead/bug-1446516.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/readdir-ahead/bug-1446516.t</a></td><td class='right'>21</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/readdir-ahead/bug-1512437.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/readdir-ahead/bug-1512437.t</a></td><td class='right'>23</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/readdir-ahead/bug-1670253-consistent-metadata.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/readdir-ahead/bug-1670253-consistent-metadata.t</a></td><td class='right'>23</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/replicate/886998/strict-readdir.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/replicate/886998/strict-readdir.t</a></td><td class='right'>52</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/replicate/bug-1015990-rep.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/replicate/bug-1015990-rep.t</a></td><td class='right'>61</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/replicate/bug-1015990.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/replicate/bug-1015990.t</a></td><td class='right'>69</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/replicate/bug-1032927.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/replicate/bug-1032927.t</a></td><td class='right'>32</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/replicate/bug-1037501.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/replicate/bug-1037501.t</a></td><td class='right'>104</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.7%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.3%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/replicate/bug-1046624.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/replicate/bug-1046624.t</a></td><td class='right'>47</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/replicate/bug-1058797.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/replicate/bug-1058797.t</a></td><td class='right'>48</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/replicate/bug-1101647.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/replicate/bug-1101647.t</a></td><td class='right'>31</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/replicate/bug-1130892.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/replicate/bug-1130892.t</a></td><td class='right'>76</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.5%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/replicate/bug-1132102.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/replicate/bug-1132102.t</a></td><td class='right'>28</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/replicate/bug-1134691-afr-lookup-metadata-heal.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/replicate/bug-1134691-afr-lookup-metadata-heal.t</a></td><td class='right'>56</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/replicate/bug-1139230.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/replicate/bug-1139230.t</a></td><td class='right'>58</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/replicate/bug-1180545.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/replicate/bug-1180545.t</a></td><td class='right'>77</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.5%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/replicate/bug-1190069-afr-stale-index-entries.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/replicate/bug-1190069-afr-stale-index-entries.t</a></td><td class='right'>57</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/replicate/bug-1221481-allow-fops-on-dir-split-brain.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/replicate/bug-1221481-allow-fops-on-dir-split-brain.t</a></td><td class='right'>42</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/replicate/bug-1238398-split-brain-resolution.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/replicate/bug-1238398-split-brain-resolution.t</a></td><td class='right'>51</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/replicate/bug-1238508-self-heal.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/replicate/bug-1238508-self-heal.t</a></td><td class='right'>51</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/replicate/bug-1250170-fsync.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/replicate/bug-1250170-fsync.c</a></td><td class='right'>56</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/replicate/bug-1250170-fsync.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/replicate/bug-1250170-fsync.t</a></td><td class='right'>35</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/replicate/bug-1266876-allow-reset-brick-for-same-path.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/replicate/bug-1266876-allow-reset-brick-for-same-path.t</a></td><td class='right'>54</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/replicate/bug-1292379.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/replicate/bug-1292379.t</a></td><td class='right'>58</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/replicate/bug-1297695.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/replicate/bug-1297695.t</a></td><td class='right'>43</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/replicate/bug-1305031-block-reads-on-metadata-sbrain.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/replicate/bug-1305031-block-reads-on-metadata-sbrain.t</a></td><td class='right'>40</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/replicate/bug-1325792.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/replicate/bug-1325792.t</a></td><td class='right'>25</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/replicate/bug-1335652.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/replicate/bug-1335652.t</a></td><td class='right'>29</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/replicate/bug-1340623-mkdir-fails-remove-brick-started.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/replicate/bug-1340623-mkdir-fails-remove-brick-started.t</a></td><td class='right'>46</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/replicate/bug-1341650.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/replicate/bug-1341650.t</a></td><td class='right'>63</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/replicate/bug-1363721.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/replicate/bug-1363721.t</a></td><td class='right'>118</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.8%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.2%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/replicate/bug-1365455.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/replicate/bug-1365455.t</a></td><td class='right'>54</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/replicate/bug-1386188-sbrain-fav-child.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/replicate/bug-1386188-sbrain-fav-child.t</a></td><td class='right'>82</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.5%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/replicate/bug-1402730.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/replicate/bug-1402730.t</a></td><td class='right'>47</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/replicate/bug-1408712.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/replicate/bug-1408712.t</a></td><td class='right'>101</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.6%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.4%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/replicate/bug-1417522-block-split-brain-resolution.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/replicate/bug-1417522-block-split-brain-resolution.t</a></td><td class='right'>69</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/replicate/bug-1433571-undo-pending-only-on-up-bricks.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/replicate/bug-1433571-undo-pending-only-on-up-bricks.t</a></td><td class='right'>79</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.5%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/replicate/bug-1438255-do-not-mark-self-accusing-xattrs.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/replicate/bug-1438255-do-not-mark-self-accusing-xattrs.t</a></td><td class='right'>46</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/replicate/bug-1448804-check-quorum-type-values.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/replicate/bug-1448804-check-quorum-type-values.t</a></td><td class='right'>47</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/replicate/bug-1473026.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/replicate/bug-1473026.t</a></td><td class='right'>31</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/replicate/bug-1477169-entry-selfheal-rename.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/replicate/bug-1477169-entry-selfheal-rename.t</a></td><td class='right'>52</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/replicate/bug-1480525.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/replicate/bug-1480525.t</a></td><td class='right'>18</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/replicate/bug-1493415-gfid-heal.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/replicate/bug-1493415-gfid-heal.t</a></td><td class='right'>78</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.5%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/replicate/bug-1498570-client-iot-graph-check.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/replicate/bug-1498570-client-iot-graph-check.t</a></td><td class='right'>48</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/replicate/bug-1539358-split-brain-detection.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/replicate/bug-1539358-split-brain-detection.t</a></td><td class='right'>89</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.6%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.4%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/replicate/bug-1561129-enospc.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/replicate/bug-1561129-enospc.t</a></td><td class='right'>24</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/replicate/bug-1586020-mark-dirty-for-entry-txn-on-quorum-failure.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/replicate/bug-1586020-mark-dirty-for-entry-txn-on-quorum-failure.t</a></td><td class='right'>72</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.5%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/replicate/bug-1591193-assign-gfid-and-heal.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/replicate/bug-1591193-assign-gfid-and-heal.t</a></td><td class='right'>128</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.8%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.2%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/replicate/bug-1626994-info-split-brain.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/replicate/bug-1626994-info-split-brain.t</a></td><td class='right'>62</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/replicate/bug-1637249-gfid-heal.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/replicate/bug-1637249-gfid-heal.t</a></td><td class='right'>149</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/replicate/bug-1637802-arbiter-stale-data-heal-lock.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/replicate/bug-1637802-arbiter-stale-data-heal-lock.t</a></td><td class='right'>45</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/replicate/bug-1655050-dir-sbrain-size-policy.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/replicate/bug-1655050-dir-sbrain-size-policy.t</a></td><td class='right'>55</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/replicate/bug-1655052-sbrain-policy-same-size.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/replicate/bug-1655052-sbrain-policy-same-size.t</a></td><td class='right'>55</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/replicate/bug-1655854-support-dist-to-rep3-arb-conversion.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/replicate/bug-1655854-support-dist-to-rep3-arb-conversion.t</a></td><td class='right'>95</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.6%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.4%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/replicate/bug-1657783-do-not-update-read-subvol-on-rename-link.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/replicate/bug-1657783-do-not-update-read-subvol-on-rename-link.t</a></td><td class='right'>40</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/replicate/bug-1686568-send-truncate-on-arbiter-from-shd.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/replicate/bug-1686568-send-truncate-on-arbiter-from-shd.t</a></td><td class='right'>38</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/replicate/bug-1696599-io-hang.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/replicate/bug-1696599-io-hang.t</a></td><td class='right'>47</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/replicate/bug-1717819-metadata-split-brain-detection.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/replicate/bug-1717819-metadata-split-brain-detection.t</a></td><td class='right'>136</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.9%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.1%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/replicate/bug-1722507-type-mismatch-error-handling.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/replicate/bug-1722507-type-mismatch-error-handling.t</a></td><td class='right'>116</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.7%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.3%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/replicate/bug-1728770-pass-xattrs.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/replicate/bug-1728770-pass-xattrs.t</a></td><td class='right'>52</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/replicate/bug-1734370-entry-heal-restore-time.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/replicate/bug-1734370-entry-heal-restore-time.t</a></td><td class='right'>102</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.7%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.3%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/replicate/bug-1744548-heal-timeout.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/replicate/bug-1744548-heal-timeout.t</a></td><td class='right'>47</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/replicate/bug-1749322-entry-heal-not-happening.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/replicate/bug-1749322-entry-heal-not-happening.t</a></td><td class='right'>89</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.6%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.4%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/replicate/bug-1756938-replica-3-sbrain-cli.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/replicate/bug-1756938-replica-3-sbrain-cli.t</a></td><td class='right'>111</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.7%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.3%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/replicate/bug-1761531-metadata-heal-restore-time.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/replicate/bug-1761531-metadata-heal-restore-time.t</a></td><td class='right'>74</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.5%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/replicate/bug-1801624-entry-heal.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/replicate/bug-1801624-entry-heal.t</a></td><td class='right'>58</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/replicate/bug-765564.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/replicate/bug-765564.t</a></td><td class='right'>86</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.6%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.4%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/replicate/bug-767585-gfid.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/replicate/bug-767585-gfid.t</a></td><td class='right'>42</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/replicate/bug-802417.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/replicate/bug-802417.t</a></td><td class='right'>120</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.8%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.2%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/replicate/bug-821056.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/replicate/bug-821056.t</a></td><td class='right'>52</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/replicate/bug-830665.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/replicate/bug-830665.t</a></td><td class='right'>127</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.8%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.2%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/replicate/bug-859581.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/replicate/bug-859581.t</a></td><td class='right'>53</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/replicate/bug-865825.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/replicate/bug-865825.t</a></td><td class='right'>82</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.5%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/replicate/bug-880898.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/replicate/bug-880898.t</a></td><td class='right'>30</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/replicate/bug-884328.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/replicate/bug-884328.t</a></td><td class='right'>12</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/replicate/bug-886998.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/replicate/bug-886998.t</a></td><td class='right'>52</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/replicate/bug-888174.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/replicate/bug-888174.t</a></td><td class='right'>62</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/replicate/bug-913051.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/replicate/bug-913051.t</a></td><td class='right'>56</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/replicate/bug-916226.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/replicate/bug-916226.t</a></td><td class='right'>26</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/replicate/bug-918437-sh-mtime.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/replicate/bug-918437-sh-mtime.t</a></td><td class='right'>71</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.5%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/replicate/bug-921231.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/replicate/bug-921231.t</a></td><td class='right'>31</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/replicate/bug-957877.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/replicate/bug-957877.t</a></td><td class='right'>33</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/replicate/bug-976800.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/replicate/bug-976800.t</a></td><td class='right'>29</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/replicate/bug-977797.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/replicate/bug-977797.t</a></td><td class='right'>96</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.6%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.4%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/replicate/bug-978794.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/replicate/bug-978794.t</a></td><td class='right'>29</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/replicate/bug-979365.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/replicate/bug-979365.t</a></td><td class='right'>47</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/replicate/bug-986905.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/replicate/bug-986905.t</a></td><td class='right'>27</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/replicate/issue-1254-prioritize-enospc.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/replicate/issue-1254-prioritize-enospc.t</a></td><td class='right'>80</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.5%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/replicate/mdata-heal-no-xattrs.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/replicate/mdata-heal-no-xattrs.t</a></td><td class='right'>59</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/replicate/ta-inode-refresh-read.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/replicate/ta-inode-refresh-read.t</a></td><td class='right'>40</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/rpc/bug-1043886.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/rpc/bug-1043886.t</a></td><td class='right'>58</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/rpc/bug-847624.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/rpc/bug-847624.t</a></td><td class='right'>29</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/rpc/bug-884452.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/rpc/bug-884452.t</a></td><td class='right'>47</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/rpc/bug-921072.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/rpc/bug-921072.t</a></td><td class='right'>132</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.8%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.2%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/rpc/bug-954057.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/rpc/bug-954057.t</a></td><td class='right'>63</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/shard/bug-1245547.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/shard/bug-1245547.t</a></td><td class='right'>35</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/shard/bug-1248887.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/shard/bug-1248887.t</a></td><td class='right'>39</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/shard/bug-1250855.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/shard/bug-1250855.t</a></td><td class='right'>34</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/shard/bug-1251824.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/shard/bug-1251824.t</a></td><td class='right'>109</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.7%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.3%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/shard/bug-1256580.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/shard/bug-1256580.t</a></td><td class='right'>34</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/shard/bug-1258334.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/shard/bug-1258334.t</a></td><td class='right'>40</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/shard/bug-1259651.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/shard/bug-1259651.t</a></td><td class='right'>40</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/shard/bug-1260637.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/shard/bug-1260637.t</a></td><td class='right'>42</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/shard/bug-1261773.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/shard/bug-1261773.t</a></td><td class='right'>14</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/shard/bug-1272986.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/shard/bug-1272986.t</a></td><td class='right'>35</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/shard/bug-1342298.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/shard/bug-1342298.t</a></td><td class='right'>23</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/shard/bug-1468483.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/shard/bug-1468483.t</a></td><td class='right'>58</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/shard/bug-1488546.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/shard/bug-1488546.t</a></td><td class='right'>25</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/shard/bug-1568521-EEXIST.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/shard/bug-1568521-EEXIST.t</a></td><td class='right'>91</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.6%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.4%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/shard/bug-1568521.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/shard/bug-1568521.t</a></td><td class='right'>53</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/shard/bug-1605056-2.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/shard/bug-1605056-2.t</a></td><td class='right'>34</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/shard/bug-1605056.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/shard/bug-1605056.t</a></td><td class='right'>63</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/shard/bug-1669077.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/shard/bug-1669077.t</a></td><td class='right'>29</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/shard/bug-1696136-lru-limit-equals-deletion-rate.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/shard/bug-1696136-lru-limit-equals-deletion-rate.t</a></td><td class='right'>34</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/shard/bug-1696136.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/shard/bug-1696136.c</a></td><td class='right'>122</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.8%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.2%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/shard/bug-1696136.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/shard/bug-1696136.t</a></td><td class='right'>33</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/shard/bug-1705884.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/shard/bug-1705884.t</a></td><td class='right'>32</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/shard/bug-1738419.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/shard/bug-1738419.t</a></td><td class='right'>29</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/shard/bug-shard-discard.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/shard/bug-shard-discard.c</a></td><td class='right'>70</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.5%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/shard/bug-shard-discard.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/shard/bug-shard-discard.t</a></td><td class='right'>65</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/shard/bug-shard-zerofill.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/shard/bug-shard-zerofill.c</a></td><td class='right'>60</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/shard/bug-shard-zerofill.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/shard/bug-shard-zerofill.t</a></td><td class='right'>46</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/shard/configure-lru-limit.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/shard/configure-lru-limit.t</a></td><td class='right'>52</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/shard/issue-1243.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/shard/issue-1243.t</a></td><td class='right'>43</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/shard/issue-1281.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/shard/issue-1281.t</a></td><td class='right'>34</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/shard/issue-1425.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/shard/issue-1425.t</a></td><td class='right'>45</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/shard/parallel-truncate-read.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/shard/parallel-truncate-read.t</a></td><td class='right'>48</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/shard/shard-append-test.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/shard/shard-append-test.c</a></td><td class='right'>183</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 98.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/shard/shard-append-test.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/shard/shard-append-test.t</a></td><td class='right'>32</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/shard/shard-fallocate.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/shard/shard-fallocate.c</a></td><td class='right'>113</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.7%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.3%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/shard/shard-inode-refcount-test.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/shard/shard-inode-refcount-test.t</a></td><td class='right'>30</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/shard/unlinks-and-renames.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/shard/unlinks-and-renames.t</a></td><td class='right'>333</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 2.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 97.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/shard/zero-flag.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/shard/zero-flag.t</a></td><td class='right'>76</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.5%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/snapshot/bug-1045333.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/snapshot/bug-1045333.t</a></td><td class='right'>44</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/snapshot/bug-1049834.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/snapshot/bug-1049834.t</a></td><td class='right'>44</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/snapshot/bug-1064768.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/snapshot/bug-1064768.t</a></td><td class='right'>20</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/snapshot/bug-1087203.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/snapshot/bug-1087203.t</a></td><td class='right'>103</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.7%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.3%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/snapshot/bug-1090042.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/snapshot/bug-1090042.t</a></td><td class='right'>26</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/snapshot/bug-1109770.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/snapshot/bug-1109770.t</a></td><td class='right'>65</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/snapshot/bug-1109889.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/snapshot/bug-1109889.t</a></td><td class='right'>74</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.5%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/snapshot/bug-1111041.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/snapshot/bug-1111041.t</a></td><td class='right'>40</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/snapshot/bug-1112613.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/snapshot/bug-1112613.t</a></td><td class='right'>49</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/snapshot/bug-1113975.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/snapshot/bug-1113975.t</a></td><td class='right'>38</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/snapshot/bug-1155042-dont-display-deactivated-snapshots.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/snapshot/bug-1155042-dont-display-deactivated-snapshots.t</a></td><td class='right'>36</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/snapshot/bug-1157991.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/snapshot/bug-1157991.t</a></td><td class='right'>30</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/snapshot/bug-1162462.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/snapshot/bug-1162462.t</a></td><td class='right'>38</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/snapshot/bug-1162498.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/snapshot/bug-1162498.t</a></td><td class='right'>56</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/snapshot/bug-1166197.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/snapshot/bug-1166197.t</a></td><td class='right'>52</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/snapshot/bug-1167580-set-proper-uid-and-gid-during-nfs-access.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/snapshot/bug-1167580-set-proper-uid-and-gid-during-nfs-access.t</a></td><td class='right'>205</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 98.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/snapshot/bug-1168875.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/snapshot/bug-1168875.t</a></td><td class='right'>96</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.6%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.4%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/snapshot/bug-1178079.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/snapshot/bug-1178079.t</a></td><td class='right'>24</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/snapshot/bug-1202436-calculate-quota-cksum-during-snap-restore.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/snapshot/bug-1202436-calculate-quota-cksum-during-snap-restore.t</a></td><td class='right'>37</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/snapshot/bug-1205592.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/snapshot/bug-1205592.t</a></td><td class='right'>30</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/snapshot/bug-1227646.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/snapshot/bug-1227646.t</a></td><td class='right'>31</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/snapshot/bug-1232430.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/snapshot/bug-1232430.t</a></td><td class='right'>22</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/snapshot/bug-1250387.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/snapshot/bug-1250387.t</a></td><td class='right'>26</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/snapshot/bug-1260848.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/snapshot/bug-1260848.t</a></td><td class='right'>28</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/snapshot/bug-1275616.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/snapshot/bug-1275616.t</a></td><td class='right'>50</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/snapshot/bug-1279327.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/snapshot/bug-1279327.t</a></td><td class='right'>29</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/snapshot/bug-1316437.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/snapshot/bug-1316437.t</a></td><td class='right'>29</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/snapshot/bug-1322772-real-path-fix-for-snapshot.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/snapshot/bug-1322772-real-path-fix-for-snapshot.t</a></td><td class='right'>56</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/snapshot/bug-1399598-uss-with-ssl.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/snapshot/bug-1399598-uss-with-ssl.t</a></td><td class='right'>108</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.7%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.3%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/snapshot/bug-1482023-snpashot-issue-with-other-processes-accessing-mounted-path.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/snapshot/bug-1482023-snpashot-issue-with-other-processes-accessing-mounted-path.t</a></td><td class='right'>133</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.9%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.1%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/snapshot/bug-1512451-snapshot-creation-failed-after-brick-reset.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/snapshot/bug-1512451-snapshot-creation-failed-after-brick-reset.t</a></td><td class='right'>39</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/snapshot/bug-1597662.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/snapshot/bug-1597662.t</a></td><td class='right'>58</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/snapshot/bug-1618004-fix-memory-corruption-in-snap-import.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/snapshot/bug-1618004-fix-memory-corruption-in-snap-import.t</a></td><td class='right'>48</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/stripe/bug-1002207.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/stripe/bug-1002207.t</a></td><td class='right'>55</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/stripe/bug-1111454.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/stripe/bug-1111454.t</a></td><td class='right'>20</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/trace/bug-797171.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/trace/bug-797171.t</a></td><td class='right'>41</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/transport/bug-873367.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/transport/bug-873367.t</a></td><td class='right'>45</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/unclassified/bug-1034085.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/unclassified/bug-1034085.t</a></td><td class='right'>31</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/unclassified/bug-1357397.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/unclassified/bug-1357397.t</a></td><td class='right'>35</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/unclassified/bug-874498.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/unclassified/bug-874498.t</a></td><td class='right'>64</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/unclassified/bug-991622.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/unclassified/bug-991622.t</a></td><td class='right'>35</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/upcall/bug-1227204.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/upcall/bug-1227204.t</a></td><td class='right'>29</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/upcall/bug-1369430.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/upcall/bug-1369430.t</a></td><td class='right'>43</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/upcall/bug-1394131.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/upcall/bug-1394131.t</a></td><td class='right'>29</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/upcall/bug-1422776.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/upcall/bug-1422776.t</a></td><td class='right'>30</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/upcall/bug-1458127.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/upcall/bug-1458127.t</a></td><td class='right'>36</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/upcall/bug-upcall-stat.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/upcall/bug-upcall-stat.t</a></td><td class='right'>39</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/write-behind/bug-1058663.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/write-behind/bug-1058663.c</a></td><td class='right'>123</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.8%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.2%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/write-behind/bug-1058663.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/write-behind/bug-1058663.t</a></td><td class='right'>28</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/write-behind/bug-1279730.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/write-behind/bug-1279730.c</a></td><td class='right'>149</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/write-behind/bug-1279730.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/write-behind/bug-1279730.t</a></td><td class='right'>37</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/write-behind/issue-884.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/write-behind/issue-884.c</a></td><td class='right'>267</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.7%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 98.3%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/bugs/write-behind/issue-884.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/bugs/write-behind/issue-884.t</a></td><td class='right'>40</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/changelog.rc?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/changelog.rc</a></td><td class='right'>9</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/cleanup.sh?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/cleanup.sh</a></td><td class='right'>4</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 100.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/cluster.rc?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/cluster.rc</a></td><td class='right'>218</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 98.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/common-utils.rc?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/common-utils.rc</a></td><td class='right'>7</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 100.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/configfiles/bad_exports?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/configfiles/bad_exports</a></td><td class='right'>9</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/configfiles/bad_netgroups?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/configfiles/bad_netgroups</a></td><td class='right'>5</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 100.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/configfiles/big_exports?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/configfiles/big_exports</a></td><td class='right'>10</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/configfiles/exports?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/configfiles/exports</a></td><td class='right'>1</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 100.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/configfiles/exports-v6?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/configfiles/exports-v6</a></td><td class='right'>1</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 100.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/configfiles/exports_bad_opt?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/configfiles/exports_bad_opt</a></td><td class='right'>1</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 100.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/configfiles/netgroups?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/configfiles/netgroups</a></td><td class='right'>4</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 100.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/dht.rc?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/dht.rc</a></td><td class='right'>174</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 98.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/ec.rc?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/ec.rc</a></td><td class='right'>18</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/env.rc.in?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/env.rc.in</a></td><td class='right'>42</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/experimental/.gitignore?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/experimental/.gitignore</a></td><td class='right'>7</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 100.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/fallocate.rc?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/fallocate.rc</a></td><td class='right'>19</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/fdl.rc?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/fdl.rc</a></td><td class='right'>12</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/features/delay-gen.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/features/delay-gen.t</a></td><td class='right'>52</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/features/dh1024.pem?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/features/dh1024.pem</a></td><td class='right'>5</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 100.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/features/fdl-overflow.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/features/fdl-overflow.t</a></td><td class='right'>72</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.5%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/features/fdl.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/features/fdl.t</a></td><td class='right'>44</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/features/flock_interrupt.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/features/flock_interrupt.t</a></td><td class='right'>32</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/features/fuse-lru-limit.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/features/fuse-lru-limit.t</a></td><td class='right'>43</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/features/glfs-lease-recall.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/features/glfs-lease-recall.c</a></td><td class='right'>372</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 2.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 97.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/features/glfs-lease.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/features/glfs-lease.c</a></td><td class='right'>717</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 4.6%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 95.4%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/features/glfs-lease.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/features/glfs-lease.t</a></td><td class='right'>31</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/features/interrupt.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/features/interrupt.t</a></td><td class='right'>71</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.5%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/features/ipc.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/features/ipc.t</a></td><td class='right'>38</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/features/ipctest.py?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/features/ipctest.py</a></td><td class='right'>28</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/features/lock_revocation.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/features/lock_revocation.t</a></td><td class='right'>54</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/features/mandatory-lock-forced.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/features/mandatory-lock-forced.c</a></td><td class='right'>143</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.9%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.1%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/features/mandatory-lock-forced.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/features/mandatory-lock-forced.t</a></td><td class='right'>80</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.5%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/features/nuke.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/features/nuke.t</a></td><td class='right'>41</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/features/open_and_sleep.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/features/open_and_sleep.c</a></td><td class='right'>27</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/features/openssl.cnf.in?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/features/openssl.cnf.in</a></td><td class='right'>41</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/features/readdir-ahead.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/features/readdir-ahead.t</a></td><td class='right'>45</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/features/recon.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/features/recon.t</a></td><td class='right'>59</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/features/ssl-authz.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/features/ssl-authz.t</a></td><td class='right'>121</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.8%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.2%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/features/ssl-ciphers.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/features/ssl-ciphers.t</a></td><td class='right'>244</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.6%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 98.4%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/features/subdir-mount.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/features/subdir-mount.t</a></td><td class='right'>121</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.8%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.2%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/features/trash.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/features/trash.t</a></td><td class='right'>247</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.6%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 98.4%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/features/unhashed-auto.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/features/unhashed-auto.t</a></td><td class='right'>125</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.8%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.2%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/features/weighted-rebalance.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/features/weighted-rebalance.t</a></td><td class='right'>78</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.5%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/features/worm.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/features/worm.t</a></td><td class='right'>117</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.8%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.2%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/features/worm_sh.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/features/worm_sh.t</a></td><td class='right'>75</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.5%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/fileio.rc?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/fileio.rc</a></td><td class='right'>61</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/geo-rep.rc?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/geo-rep.rc</a></td><td class='right'>495</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 3.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 96.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/gfid2path/block-mount-access.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/gfid2path/block-mount-access.t</a></td><td class='right'>51</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/gfid2path/get-gfid-to-path.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/gfid2path/get-gfid-to-path.t</a></td><td class='right'>72</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.5%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/gfid2path/gfid2path_fuse.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/gfid2path/gfid2path_fuse.t</a></td><td class='right'>166</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 98.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/gfid2path/gfid2path_nfs.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/gfid2path/gfid2path_nfs.t</a></td><td class='right'>152</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/glusterfind/glusterfind-basic.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/glusterfind/glusterfind-basic.t</a></td><td class='right'>84</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.5%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/include.rc?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/include.rc</a></td><td class='right'>1350</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 8.7%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 91.3%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/line-coverage/afr-heal-info.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/line-coverage/afr-heal-info.t</a></td><td class='right'>43</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/line-coverage/arbiter-coverage.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/line-coverage/arbiter-coverage.t</a></td><td class='right'>32</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/line-coverage/cli-peer-and-volume-operations.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/line-coverage/cli-peer-and-volume-operations.t</a></td><td class='right'>135</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.9%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.1%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/line-coverage/cli-volume-top-profile-coverage.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/line-coverage/cli-volume-top-profile-coverage.t</a></td><td class='right'>62</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/line-coverage/errorgen-coverage.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/line-coverage/errorgen-coverage.t</a></td><td class='right'>42</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/line-coverage/log-and-brick-ops-negative-case.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/line-coverage/log-and-brick-ops-negative-case.t</a></td><td class='right'>82</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.5%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/line-coverage/meta-max-coverage.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/line-coverage/meta-max-coverage.t</a></td><td class='right'>33</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/line-coverage/namespace-linecoverage.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/line-coverage/namespace-linecoverage.t</a></td><td class='right'>39</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/line-coverage/old-protocol.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/line-coverage/old-protocol.t</a></td><td class='right'>37</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/line-coverage/quiesce-coverage.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/line-coverage/quiesce-coverage.t</a></td><td class='right'>44</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/line-coverage/shard-coverage.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/line-coverage/shard-coverage.t</a></td><td class='right'>33</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/line-coverage/some-features-in-libglusterfs.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/line-coverage/some-features-in-libglusterfs.t</a></td><td class='right'>67</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/line-coverage/volfile-with-all-graph-syntax.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/line-coverage/volfile-with-all-graph-syntax.t</a></td><td class='right'>73</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.5%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/nfs.rc?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/nfs.rc</a></td><td class='right'>70</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.5%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/performance/open-behind.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/performance/open-behind.t</a></td><td class='right'>75</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.5%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/performance/quick-read.t?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/performance/quick-read.t</a></td><td class='right'>55</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/snapshot.rc?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/snapshot.rc</a></td><td class='right'>484</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 3.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 96.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/ssl.rc?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/ssl.rc</a></td><td class='right'>35</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/thin-arbiter.rc?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/thin-arbiter.rc</a></td><td class='right'>613</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 3.9%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 96.1%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/traps.rc?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/traps.rc</a></td><td class='right'>22</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/utils/arequal-checksum.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/utils/arequal-checksum.c</a></td><td class='right'>633</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 4.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 95.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/utils/changelog/changelog.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/utils/changelog/changelog.h</a></td><td class='right'>125</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.8%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.2%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/utils/changelog/get-history.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/utils/changelog/get-history.c</a></td><td class='right'>71</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.5%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/utils/changelog/test-changelog-api.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/utils/changelog/test-changelog-api.c</a></td><td class='right'>98</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.6%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.4%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/utils/changelog/test-history-api.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/utils/changelog/test-history-api.c</a></td><td class='right'>111</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.7%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.3%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/utils/changelogparser.py?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/utils/changelogparser.py</a></td><td class='right'>236</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.5%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 98.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/utils/create-files.py?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/utils/create-files.py</a></td><td class='right'>593</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 3.8%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 96.2%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/utils/get-mdata-xattr.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/utils/get-mdata-xattr.c</a></td><td class='right'>152</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/utils/getfattr.py?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/utils/getfattr.py</a></td><td class='right'>133</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.9%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.1%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/utils/gfid-access.py?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/utils/gfid-access.py</a></td><td class='right'>124</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.8%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.2%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/utils/libcxattr.py?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/utils/libcxattr.py</a></td><td class='right'>108</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.7%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.3%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/utils/pidof.py?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/utils/pidof.py</a></td><td class='right'>45</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/utils/py2py3.py?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/utils/py2py3.py</a></td><td class='right'>186</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 98.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/utils/setfattr.py?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/utils/setfattr.py</a></td><td class='right'>77</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.5%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/utils/testn.sh?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/utils/testn.sh</a></td><td class='right'>16</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/vagrant/vagrant-template-centos6/Vagrantfile?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/vagrant/vagrant-template-centos6/Vagrantfile</a></td><td class='right'>55</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/vagrant/vagrant-template-centos6/roles/daemon-services/tasks/main.yml?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/vagrant/vagrant-template-centos6/roles/daemon-services/tasks/main.yml</a></td><td class='right'>3</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 100.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/vagrant/vagrant-template-centos6/roles/fix-localhost/tasks/main.yml?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/vagrant/vagrant-template-centos6/roles/fix-localhost/tasks/main.yml</a></td><td class='right'>6</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 100.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/vagrant/vagrant-template-centos6/roles/install-pkgs/tasks/main.yml?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/vagrant/vagrant-template-centos6/roles/install-pkgs/tasks/main.yml</a></td><td class='right'>92</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.6%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.4%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/vagrant/vagrant-template-centos6/roles/iptables/tasks/main.yml?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/vagrant/vagrant-template-centos6/roles/iptables/tasks/main.yml</a></td><td class='right'>3</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 100.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/vagrant/vagrant-template-centos6/roles/mock-user/tasks/main.yml?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/vagrant/vagrant-template-centos6/roles/mock-user/tasks/main.yml</a></td><td class='right'>3</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 100.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/vagrant/vagrant-template-centos6/roles/prepare-brick/tasks/main.yml?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/vagrant/vagrant-template-centos6/roles/prepare-brick/tasks/main.yml</a></td><td class='right'>6</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 100.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/vagrant/vagrant-template-centos6/roles/remove-gluster-pkgs/tasks/main.yml?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/vagrant/vagrant-template-centos6/roles/remove-gluster-pkgs/tasks/main.yml</a></td><td class='right'>4</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 100.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/vagrant/vagrant-template-centos6/setup.yml?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/vagrant/vagrant-template-centos6/setup.yml</a></td><td class='right'>15</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/vagrant/vagrant-template-fedora/Vagrantfile?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/vagrant/vagrant-template-fedora/Vagrantfile</a></td><td class='right'>56</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/vagrant/vagrant-template-fedora/roles/daemon-services/tasks/main.yml?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/vagrant/vagrant-template-fedora/roles/daemon-services/tasks/main.yml</a></td><td class='right'>3</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 100.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/vagrant/vagrant-template-fedora/roles/fix-localhost/tasks/main.yml?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/vagrant/vagrant-template-fedora/roles/fix-localhost/tasks/main.yml</a></td><td class='right'>6</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 100.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/vagrant/vagrant-template-fedora/roles/install-pkgs/tasks/main.yml?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/vagrant/vagrant-template-fedora/roles/install-pkgs/tasks/main.yml</a></td><td class='right'>85</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.5%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/vagrant/vagrant-template-fedora/roles/iptables/tasks/main.yml?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/vagrant/vagrant-template-fedora/roles/iptables/tasks/main.yml</a></td><td class='right'>3</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 100.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/vagrant/vagrant-template-fedora/roles/mock-user/tasks/main.yml?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/vagrant/vagrant-template-fedora/roles/mock-user/tasks/main.yml</a></td><td class='right'>3</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 100.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/vagrant/vagrant-template-fedora/roles/prepare-brick/tasks/main.yml?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/vagrant/vagrant-template-fedora/roles/prepare-brick/tasks/main.yml</a></td><td class='right'>6</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 100.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/vagrant/vagrant-template-fedora/roles/remove-gluster-pkgs/tasks/main.yml?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/vagrant/vagrant-template-fedora/roles/remove-gluster-pkgs/tasks/main.yml</a></td><td class='right'>4</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 100.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/vagrant/vagrant-template-fedora/roles/selinux/tasks/main.yml?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/vagrant/vagrant-template-fedora/roles/selinux/tasks/main.yml</a></td><td class='right'>3</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 100.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/vagrant/vagrant-template-fedora/setup.yml?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/vagrant/vagrant-template-fedora/setup.yml</a></td><td class='right'>16</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tests/volume.rc?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tests/volume.rc</a></td><td class='right'>1002</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 6.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 93.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tools/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tools/Makefile.am</a></td><td class='right'>3</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 100.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tools/gfind_missing_files/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tools/gfind_missing_files/Makefile.am</a></td><td class='right'>32</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tools/gfind_missing_files/gcrawler.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tools/gfind_missing_files/gcrawler.c</a></td><td class='right'>581</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 3.7%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 96.3%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tools/gfind_missing_files/gfid_to_path.py?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tools/gfind_missing_files/gfid_to_path.py</a></td><td class='right'>162</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tools/gfind_missing_files/gfid_to_path.sh?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tools/gfind_missing_files/gfid_to_path.sh</a></td><td class='right'>43</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tools/gfind_missing_files/gfind_missing_files.sh?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tools/gfind_missing_files/gfind_missing_files.sh</a></td><td class='right'>119</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.8%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.2%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tools/glusterfind/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tools/glusterfind/Makefile.am</a></td><td class='right'>24</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/tools/glusterfind/S57glusterfind-delete-post.py?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tools/glusterfind/S57glusterfind-delete-post.py</a></td><td class='right'>69</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tools/glusterfind/glusterfind.in?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tools/glusterfind/glusterfind.in</a></td><td class='right'>18</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tools/glusterfind/src/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tools/glusterfind/src/Makefile.am</a></td><td class='right'>16</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tools/glusterfind/src/__init__.py?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tools/glusterfind/src/__init__.py</a></td><td class='right'>9</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tools/glusterfind/src/brickfind.py?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tools/glusterfind/src/brickfind.py</a></td><td class='right'>118</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.8%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.2%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tools/glusterfind/src/changelog.py?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tools/glusterfind/src/changelog.py</a></td><td class='right'>469</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 3.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 97.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tools/glusterfind/src/changelogdata.py?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tools/glusterfind/src/changelogdata.py</a></td><td class='right'>440</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 2.8%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 97.2%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tools/glusterfind/src/conf.py?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tools/glusterfind/src/conf.py</a></td><td class='right'>31</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tools/glusterfind/src/gfind_py2py3.py?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tools/glusterfind/src/gfind_py2py3.py</a></td><td class='right'>88</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.6%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.4%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tools/glusterfind/src/libgfchangelog.py?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tools/glusterfind/src/libgfchangelog.py</a></td><td class='right'>92</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.6%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.4%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tools/glusterfind/src/main.py?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tools/glusterfind/src/main.py</a></td><td class='right'>921</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 5.9%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 94.1%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tools/glusterfind/src/nodeagent.py?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tools/glusterfind/src/nodeagent.py</a></td><td class='right'>139</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.9%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.1%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tools/glusterfind/src/tool.conf.in?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tools/glusterfind/src/tool.conf.in</a></td><td class='right'>10</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tools/glusterfind/src/utils.py?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tools/glusterfind/src/utils.py</a></td><td class='right'>267</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.7%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 98.3%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tools/setgfid2path/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tools/setgfid2path/Makefile.am</a></td><td class='right'>5</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 100.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tools/setgfid2path/gluster-setgfid2path.8?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tools/setgfid2path/gluster-setgfid2path.8</a></td><td class='right'>54</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tools/setgfid2path/src/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tools/setgfid2path/src/Makefile.am</a></td><td class='right'>16</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/tools/setgfid2path/src/main.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>tools/setgfid2path/src/main.c</a></td><td class='right'>130</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.8%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.2%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/xlators/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/Makefile.am</a></td><td class='right'>12</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/xlators/bindings/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/bindings/Makefile.am</a></td><td class='right'>1</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 100.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/xlators/bindings/python/src/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/bindings/python/src/Makefile.am</a></td><td class='right'>19</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.1%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/xlators/bindings/python/src/gluster.py?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/bindings/python/src/gluster.py</a></td><td class='right'>47</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.3%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/xlators/bindings/python/src/glusterstack.py?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/bindings/python/src/glusterstack.py</a></td><td class='right'>55</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.4%;'/><td class='none' style='width: 99.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/xlators/bindings/python/src/glustertypes.py?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/bindings/python/src/glustertypes.py</a></td><td class='right'>167</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 1.1%;'/><td class='none' style='width: 98.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/xlators/bindings/python/src/python.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/bindings/python/src/python.c</a></td><td class='right'>232</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 1.5%;'/><td class='none' style='width: 98.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/xlators/bindings/python/src/testxlator.py?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/bindings/python/src/testxlator.py</a></td><td class='right'>56</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.4%;'/><td class='none' style='width: 99.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/xlators/cluster/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/cluster/Makefile.am</a></td><td class='right'>2</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 100.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/xlators/cluster/afr/src/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/cluster/afr/src/Makefile.am</a></td><td class='right'>31</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.1%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/xlators/cluster/afr/src/afr-common.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/cluster/afr/src/afr-common.c</a></td><td class='right'>9068</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 45.9%;'/><td class='rem' style='width: 12.4%;'/><td class='none' style='width: 41.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/xlators/cluster/afr/src/afr-dir-read.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/cluster/afr/src/afr-dir-read.c</a></td><td class='right'>923</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.7%;'/><td class='rem' style='width: 4.2%;'/><td class='none' style='width: 94.1%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/xlators/cluster/afr/src/afr-dir-read.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/cluster/afr/src/afr-dir-read.h</a></td><td class='right'>49</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.2%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/xlators/cluster/afr/src/afr-dir-write.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/cluster/afr/src/afr-dir-write.c</a></td><td class='right'>2754</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 6.5%;'/><td class='rem' style='width: 11.2%;'/><td class='none' style='width: 82.3%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/xlators/cluster/afr/src/afr-dir-write.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/cluster/afr/src/afr-dir-write.h</a></td><td class='right'>60</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.2%;'/><td class='none' style='width: 99.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/xlators/cluster/afr/src/afr-inode-read.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/cluster/afr/src/afr-inode-read.c</a></td><td class='right'>2271</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 10.5%;'/><td class='rem' style='width: 4.1%;'/><td class='none' style='width: 85.4%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/xlators/cluster/afr/src/afr-inode-read.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/cluster/afr/src/afr-inode-read.h</a></td><td class='right'>54</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.2%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/xlators/cluster/afr/src/afr-inode-write.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/cluster/afr/src/afr-inode-write.c</a></td><td class='right'>3246</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 13.6%;'/><td class='rem' style='width: 7.3%;'/><td class='none' style='width: 79.1%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/xlators/cluster/afr/src/afr-inode-write.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/cluster/afr/src/afr-inode-write.h</a></td><td class='right'>104</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.4%;'/><td class='rem' style='width: 0.3%;'/><td class='none' style='width: 99.3%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/xlators/cluster/afr/src/afr-lk-common.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/cluster/afr/src/afr-lk-common.c</a></td><td class='right'>2149</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 4.0%;'/><td class='rem' style='width: 9.8%;'/><td class='none' style='width: 86.2%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/xlators/cluster/afr/src/afr-mem-types.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/cluster/afr/src/afr-mem-types.h</a></td><td class='right'>63</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.2%;'/><td class='none' style='width: 99.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/cluster/afr/src/afr-messages.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/cluster/afr/src/afr-messages.h</a></td><td class='right'>167</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 98.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/xlators/cluster/afr/src/afr-open.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/cluster/afr/src/afr-open.c</a></td><td class='right'>723</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.9%;'/><td class='rem' style='width: 2.8%;'/><td class='none' style='width: 95.3%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/cluster/afr/src/afr-read-txn.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/cluster/afr/src/afr-read-txn.c</a></td><td class='right'>494</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 3.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 96.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/xlators/cluster/afr/src/afr-self-heal-algorithm.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/cluster/afr/src/afr-self-heal-algorithm.c</a></td><td class='right'>1079</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 6.9%;'/><td class='none' style='width: 93.1%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/xlators/cluster/afr/src/afr-self-heal-algorithm.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/cluster/afr/src/afr-self-heal-algorithm.h</a></td><td class='right'>60</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.4%;'/><td class='none' style='width: 99.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/xlators/cluster/afr/src/afr-self-heal-common.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/cluster/afr/src/afr-self-heal-common.c</a></td><td class='right'>3954</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 16.6%;'/><td class='rem' style='width: 8.8%;'/><td class='none' style='width: 74.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/xlators/cluster/afr/src/afr-self-heal-common.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/cluster/afr/src/afr-self-heal-common.h</a></td><td class='right'>73</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.5%;'/><td class='none' style='width: 99.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/xlators/cluster/afr/src/afr-self-heal-data.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/cluster/afr/src/afr-self-heal-data.c</a></td><td class='right'>1746</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 4.9%;'/><td class='rem' style='width: 6.3%;'/><td class='none' style='width: 88.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/xlators/cluster/afr/src/afr-self-heal-entry.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/cluster/afr/src/afr-self-heal-entry.c</a></td><td class='right'>3436</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 7.3%;'/><td class='rem' style='width: 14.9%;'/><td class='none' style='width: 77.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/xlators/cluster/afr/src/afr-self-heal-metadata.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/cluster/afr/src/afr-self-heal-metadata.c</a></td><td class='right'>1153</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 3.1%;'/><td class='rem' style='width: 4.3%;'/><td class='none' style='width: 92.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/cluster/afr/src/afr-self-heal-name.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/cluster/afr/src/afr-self-heal-name.c</a></td><td class='right'>616</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 4.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 96.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/xlators/cluster/afr/src/afr-self-heal.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/cluster/afr/src/afr-self-heal.h</a></td><td class='right'>389</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 2.3%;'/><td class='rem' style='width: 0.2%;'/><td class='none' style='width: 97.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/cluster/afr/src/afr-self-heald.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/cluster/afr/src/afr-self-heald.c</a></td><td class='right'>1716</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 11.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 89.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/cluster/afr/src/afr-self-heald.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/cluster/afr/src/afr-self-heald.h</a></td><td class='right'>75</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.5%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/xlators/cluster/afr/src/afr-transaction.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/cluster/afr/src/afr-transaction.c</a></td><td class='right'>3491</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 16.8%;'/><td class='rem' style='width: 5.6%;'/><td class='none' style='width: 77.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/xlators/cluster/afr/src/afr-transaction.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/cluster/afr/src/afr-transaction.h</a></td><td class='right'>84</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.4%;'/><td class='rem' style='width: 0.1%;'/><td class='none' style='width: 99.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/xlators/cluster/afr/src/afr.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/cluster/afr/src/afr.c</a></td><td class='right'>1781</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 8.3%;'/><td class='rem' style='width: 3.2%;'/><td class='none' style='width: 88.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/xlators/cluster/afr/src/afr.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/cluster/afr/src/afr.h</a></td><td class='right'>1989</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 8.1%;'/><td class='rem' style='width: 4.7%;'/><td class='none' style='width: 87.2%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/xlators/cluster/afr/src/pump.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/cluster/afr/src/pump.c</a></td><td class='right'>1867</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 12.0%;'/><td class='none' style='width: 88.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/xlators/cluster/afr/src/pump.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/cluster/afr/src/pump.h</a></td><td class='right'>97</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.6%;'/><td class='none' style='width: 99.4%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/xlators/cluster/dht/src/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/cluster/dht/src/Makefile.am</a></td><td class='right'>40</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.1%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/xlators/cluster/dht/src/dht-common.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/cluster/dht/src/dht-common.c</a></td><td class='right'>14156</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 67.4%;'/><td class='rem' style='width: 23.7%;'/><td class='none' style='width: 8.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/xlators/cluster/dht/src/dht-common.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/cluster/dht/src/dht-common.h</a></td><td class='right'>1578</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 8.6%;'/><td class='rem' style='width: 1.6%;'/><td class='none' style='width: 89.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/xlators/cluster/dht/src/dht-diskusage.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/cluster/dht/src/dht-diskusage.c</a></td><td class='right'>656</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 2.8%;'/><td class='rem' style='width: 1.4%;'/><td class='none' style='width: 95.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/xlators/cluster/dht/src/dht-hashfn.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/cluster/dht/src/dht-hashfn.c</a></td><td class='right'>167</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.6%;'/><td class='rem' style='width: 0.4%;'/><td class='none' style='width: 98.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/xlators/cluster/dht/src/dht-helper.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/cluster/dht/src/dht-helper.c</a></td><td class='right'>2471</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 13.7%;'/><td class='rem' style='width: 2.2%;'/><td class='none' style='width: 84.1%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/cluster/dht/src/dht-inode-read.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/cluster/dht/src/dht-inode-read.c</a></td><td class='right'>1658</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 10.7%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 89.3%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/cluster/dht/src/dht-inode-write.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/cluster/dht/src/dht-inode-write.c</a></td><td class='right'>1404</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 9.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 91.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/xlators/cluster/dht/src/dht-layout.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/cluster/dht/src/dht-layout.c</a></td><td class='right'>1251</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 4.3%;'/><td class='rem' style='width: 3.7%;'/><td class='none' style='width: 92.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/xlators/cluster/dht/src/dht-linkfile.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/cluster/dht/src/dht-linkfile.c</a></td><td class='right'>463</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.8%;'/><td class='rem' style='width: 1.2%;'/><td class='none' style='width: 97.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/cluster/dht/src/dht-lock.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/cluster/dht/src/dht-lock.c</a></td><td class='right'>1392</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 9.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 91.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/cluster/dht/src/dht-lock.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/cluster/dht/src/dht-lock.h</a></td><td class='right'>91</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.6%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.4%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/xlators/cluster/dht/src/dht-mem-types.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/cluster/dht/src/dht-mem-types.h</a></td><td class='right'>58</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.2%;'/><td class='none' style='width: 99.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/cluster/dht/src/dht-messages.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/cluster/dht/src/dht-messages.h</a></td><td class='right'>386</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 2.5%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 97.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/cluster/dht/src/dht-rebalance.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/cluster/dht/src/dht-rebalance.c</a></td><td class='right'>4702</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 30.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 69.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/xlators/cluster/dht/src/dht-rename.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/cluster/dht/src/dht-rename.c</a></td><td class='right'>2397</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 11.8%;'/><td class='rem' style='width: 3.6%;'/><td class='none' style='width: 84.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/xlators/cluster/dht/src/dht-selfheal.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/cluster/dht/src/dht-selfheal.c</a></td><td class='right'>2896</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 16.0%;'/><td class='rem' style='width: 2.7%;'/><td class='none' style='width: 81.4%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/cluster/dht/src/dht-shared.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/cluster/dht/src/dht-shared.c</a></td><td class='right'>1104</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 7.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 92.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/xlators/cluster/dht/src/dht.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/cluster/dht/src/dht.c</a></td><td class='right'>542</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.7%;'/><td class='rem' style='width: 2.8%;'/><td class='none' style='width: 96.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/xlators/cluster/dht/src/nufa.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/cluster/dht/src/nufa.c</a></td><td class='right'>1233</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 3.6%;'/><td class='rem' style='width: 4.3%;'/><td class='none' style='width: 92.1%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/xlators/cluster/dht/src/switch.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/cluster/dht/src/switch.c</a></td><td class='right'>1697</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 4.9%;'/><td class='rem' style='width: 6.0%;'/><td class='none' style='width: 89.1%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/cluster/dht/src/unittest/dht_layout_mock.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/cluster/dht/src/unittest/dht_layout_mock.c</a></td><td class='right'>73</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.5%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/cluster/dht/src/unittest/dht_layout_unittest.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/cluster/dht/src/unittest/dht_layout_unittest.c</a></td><td class='right'>127</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.8%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.2%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='mov'><a href='/cgit/glusterfs.git/diff/xlators/cluster/ec/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/cluster/ec/Makefile.am</a> (renamed from libglusterfsclient/Makefile.am)</td><td class='right'>0</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 100.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/cluster/ec/src/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/cluster/ec/src/Makefile.am</a></td><td class='right'>83</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.5%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/cluster/ec/src/ec-code-avx.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/cluster/ec/src/ec-code-avx.c</a></td><td class='right'>109</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.7%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.3%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/cluster/ec/src/ec-code-avx.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/cluster/ec/src/ec-code-avx.h</a></td><td class='right'>18</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/cluster/ec/src/ec-code-c.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/cluster/ec/src/ec-code-c.c</a></td><td class='right'>11679</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 75.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 24.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/cluster/ec/src/ec-code-c.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/cluster/ec/src/ec-code-c.h</a></td><td class='right'>27</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/cluster/ec/src/ec-code-intel.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/cluster/ec/src/ec-code-intel.c</a></td><td class='right'>594</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 3.8%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 96.2%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/cluster/ec/src/ec-code-intel.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/cluster/ec/src/ec-code-intel.h</a></td><td class='right'>191</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 98.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/cluster/ec/src/ec-code-sse.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/cluster/ec/src/ec-code-sse.c</a></td><td class='right'>101</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.6%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.4%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/cluster/ec/src/ec-code-sse.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/cluster/ec/src/ec-code-sse.h</a></td><td class='right'>18</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/cluster/ec/src/ec-code-x64.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/cluster/ec/src/ec-code-x64.c</a></td><td class='right'>144</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.9%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.1%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/cluster/ec/src/ec-code-x64.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/cluster/ec/src/ec-code-x64.h</a></td><td class='right'>18</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/cluster/ec/src/ec-code.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/cluster/ec/src/ec-code.c</a></td><td class='right'>1060</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 6.8%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 93.2%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/cluster/ec/src/ec-code.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/cluster/ec/src/ec-code.h</a></td><td class='right'>44</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/cluster/ec/src/ec-combine.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/cluster/ec/src/ec-combine.c</a></td><td class='right'>995</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 6.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 93.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/cluster/ec/src/ec-combine.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/cluster/ec/src/ec-combine.h</a></td><td class='right'>44</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/cluster/ec/src/ec-common.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/cluster/ec/src/ec-common.c</a></td><td class='right'>3042</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 19.6%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 80.4%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/cluster/ec/src/ec-common.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/cluster/ec/src/ec-common.h</a></td><td class='right'>234</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.5%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 98.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/cluster/ec/src/ec-data.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/cluster/ec/src/ec-data.c</a></td><td class='right'>288</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.9%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 98.1%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/cluster/ec/src/ec-data.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/cluster/ec/src/ec-data.h</a></td><td class='right'>35</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/cluster/ec/src/ec-dir-read.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/cluster/ec/src/ec-dir-read.c</a></td><td class='right'>647</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 4.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 95.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/cluster/ec/src/ec-dir-write.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/cluster/ec/src/ec-dir-write.c</a></td><td class='right'>1487</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 9.6%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 90.4%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/cluster/ec/src/ec-fops.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/cluster/ec/src/ec-fops.h</a></td><td class='right'>254</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.6%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 98.4%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/cluster/ec/src/ec-galois.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/cluster/ec/src/ec-galois.c</a></td><td class='right'>183</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 98.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/cluster/ec/src/ec-galois.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/cluster/ec/src/ec-galois.h</a></td><td class='right'>32</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/cluster/ec/src/ec-generic.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/cluster/ec/src/ec-generic.c</a></td><td class='right'>1591</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 10.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 89.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/cluster/ec/src/ec-gf8.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/cluster/ec/src/ec-gf8.c</a></td><td class='right'>5882</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 37.8%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 62.2%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/cluster/ec/src/ec-gf8.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/cluster/ec/src/ec-gf8.h</a></td><td class='right'>18</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/cluster/ec/src/ec-heal.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/cluster/ec/src/ec-heal.c</a></td><td class='right'>3367</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 21.7%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 78.3%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/cluster/ec/src/ec-heald.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/cluster/ec/src/ec-heald.c</a></td><td class='right'>681</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 4.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 95.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/cluster/ec/src/ec-heald.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/cluster/ec/src/ec-heald.h</a></td><td class='right'>30</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/cluster/ec/src/ec-helpers.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/cluster/ec/src/ec-helpers.c</a></td><td class='right'>867</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 5.6%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 94.4%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/cluster/ec/src/ec-helpers.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/cluster/ec/src/ec-helpers.h</a></td><td class='right'>200</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 98.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/cluster/ec/src/ec-inode-read.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/cluster/ec/src/ec-inode-read.c</a></td><td class='right'>2046</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 13.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 86.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/cluster/ec/src/ec-inode-write.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/cluster/ec/src/ec-inode-write.c</a></td><td class='right'>2369</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 15.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 84.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/cluster/ec/src/ec-locks.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/cluster/ec/src/ec-locks.c</a></td><td class='right'>1128</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 7.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 92.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/cluster/ec/src/ec-mem-types.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/cluster/ec/src/ec-mem-types.h</a></td><td class='right'>30</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/cluster/ec/src/ec-messages.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/cluster/ec/src/ec-messages.h</a></td><td class='right'>61</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/cluster/ec/src/ec-method.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/cluster/ec/src/ec-method.c</a></td><td class='right'>433</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 2.8%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 97.2%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/cluster/ec/src/ec-method.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/cluster/ec/src/ec-method.h</a></td><td class='right'>48</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/cluster/ec/src/ec-types.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/cluster/ec/src/ec-types.h</a></td><td class='right'>690</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 4.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 95.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/cluster/ec/src/ec.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/cluster/ec/src/ec.c</a></td><td class='right'>1873</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 12.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 87.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/cluster/ec/src/ec.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/cluster/ec/src/ec.h</a></td><td class='right'>34</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/xlators/cluster/ha/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/cluster/ha/Makefile.am</a></td><td class='right'>3</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 100.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/xlators/cluster/ha/src/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/cluster/ha/src/Makefile.am</a></td><td class='right'>15</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.1%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/xlators/cluster/ha/src/ha-helpers.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/cluster/ha/src/ha-helpers.c</a></td><td class='right'>204</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 1.3%;'/><td class='none' style='width: 98.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/xlators/cluster/ha/src/ha-mem-types.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/cluster/ha/src/ha-mem-types.h</a></td><td class='right'>37</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.2%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/xlators/cluster/ha/src/ha.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/cluster/ha/src/ha.c</a></td><td class='right'>4023</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 25.9%;'/><td class='none' style='width: 74.1%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/xlators/cluster/ha/src/ha.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/cluster/ha/src/ha.h</a></td><td class='right'>63</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.4%;'/><td class='none' style='width: 99.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/xlators/cluster/map/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/cluster/map/Makefile.am</a></td><td class='right'>3</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 100.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/xlators/cluster/map/src/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/cluster/map/src/Makefile.am</a></td><td class='right'>15</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.1%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/xlators/cluster/map/src/map-helper.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/cluster/map/src/map-helper.c</a></td><td class='right'>358</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 2.3%;'/><td class='none' style='width: 97.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/xlators/cluster/map/src/map-mem-types.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/cluster/map/src/map-mem-types.h</a></td><td class='right'>35</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.2%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/xlators/cluster/map/src/map.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/cluster/map/src/map.c</a></td><td class='right'>2577</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 16.6%;'/><td class='none' style='width: 83.4%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/xlators/cluster/map/src/map.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/cluster/map/src/map.h</a></td><td class='right'>77</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.5%;'/><td class='none' style='width: 99.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/xlators/cluster/stripe/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/cluster/stripe/Makefile.am</a></td><td class='right'>3</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 100.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/xlators/cluster/stripe/src/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/cluster/stripe/src/Makefile.am</a></td><td class='right'>16</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.1%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/xlators/cluster/stripe/src/stripe-mem-types.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/cluster/stripe/src/stripe-mem-types.h</a></td><td class='right'>40</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.3%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/xlators/cluster/stripe/src/stripe.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/cluster/stripe/src/stripe.c</a></td><td class='right'>3926</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 25.3%;'/><td class='none' style='width: 74.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/xlators/cluster/stripe/src/stripe.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/cluster/stripe/src/stripe.h</a></td><td class='right'>159</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 1.0%;'/><td class='none' style='width: 99.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/xlators/cluster/unify/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/cluster/unify/Makefile.am</a></td><td class='right'>3</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 100.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/xlators/cluster/unify/src/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/cluster/unify/src/Makefile.am</a></td><td class='right'>16</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.1%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/xlators/cluster/unify/src/unify-mem-types.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/cluster/unify/src/unify-mem-types.h</a></td><td class='right'>41</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.3%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/xlators/cluster/unify/src/unify-self-heal.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/cluster/unify/src/unify-self-heal.c</a></td><td class='right'>1239</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 8.0%;'/><td class='none' style='width: 92.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/xlators/cluster/unify/src/unify.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/cluster/unify/src/unify.c</a></td><td class='right'>4589</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 29.5%;'/><td class='none' style='width: 70.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/xlators/cluster/unify/src/unify.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/cluster/unify/src/unify.h</a></td><td class='right'>146</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.9%;'/><td class='none' style='width: 99.1%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/xlators/debug/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/debug/Makefile.am</a></td><td class='right'>2</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 100.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='mov'><a href='/cgit/glusterfs.git/diff/xlators/debug/delay-gen/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/debug/delay-gen/Makefile.am</a> (renamed from mod_glusterfs/apache/2.2/Makefile.am)</td><td class='right'>2</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 100.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/debug/delay-gen/src/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/debug/delay-gen/src/Makefile.am</a></td><td class='right'>11</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/debug/delay-gen/src/delay-gen-mem-types.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/debug/delay-gen/src/delay-gen-mem-types.h</a></td><td class='right'>21</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/debug/delay-gen/src/delay-gen-messages.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/debug/delay-gen/src/delay-gen-messages.h</a></td><td class='right'>26</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/debug/delay-gen/src/delay-gen.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/debug/delay-gen/src/delay-gen.c</a></td><td class='right'>697</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 4.5%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 95.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/debug/delay-gen/src/delay-gen.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/debug/delay-gen/src/delay-gen.h</a></td><td class='right'>27</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/xlators/debug/error-gen/src/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/debug/error-gen/src/Makefile.am</a></td><td class='right'>10</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/debug/error-gen/src/error-gen-mem-types.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/debug/error-gen/src/error-gen-mem-types.h</a></td><td class='right'>20</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/xlators/debug/error-gen/src/error-gen.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/debug/error-gen/src/error-gen.c</a></td><td class='right'>3075</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 8.7%;'/><td class='rem' style='width: 11.1%;'/><td class='none' style='width: 80.2%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/xlators/debug/error-gen/src/error-gen.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/debug/error-gen/src/error-gen.h</a></td><td class='right'>60</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.2%;'/><td class='none' style='width: 99.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/xlators/debug/io-stats/src/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/debug/io-stats/src/Makefile.am</a></td><td class='right'>10</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/xlators/debug/io-stats/src/io-stats-mem-types.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/debug/io-stats/src/io-stats-mem-types.h</a></td><td class='right'>36</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.1%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/xlators/debug/io-stats/src/io-stats.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/debug/io-stats/src/io-stats.c</a></td><td class='right'>4913</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 25.4%;'/><td class='rem' style='width: 6.2%;'/><td class='none' style='width: 68.4%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='mov'><a href='/cgit/glusterfs.git/diff/xlators/debug/sink/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/debug/sink/Makefile.am</a> (renamed from scheduler/alu/Makefile.am)</td><td class='right'>1</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 100.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/debug/sink/src/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/debug/sink/src/Makefile.am</a></td><td class='right'>14</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/debug/sink/src/sink.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/debug/sink/src/sink.c</a></td><td class='right'>94</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.6%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.4%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/xlators/debug/trace/src/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/debug/trace/src/Makefile.am</a></td><td class='right'>9</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/debug/trace/src/trace-mem-types.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/debug/trace/src/trace-mem-types.h</a></td><td class='right'>20</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/xlators/debug/trace/src/trace.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/debug/trace/src/trace.c</a></td><td class='right'>4801</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 19.9%;'/><td class='rem' style='width: 10.9%;'/><td class='none' style='width: 69.1%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/debug/trace/src/trace.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/debug/trace/src/trace.h</a></td><td class='right'>55</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/xlators/encryption/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/encryption/Makefile.am</a></td><td class='right'>3</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 100.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/xlators/encryption/rot-13/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/encryption/rot-13/Makefile.am</a></td><td class='right'>3</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 100.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/xlators/encryption/rot-13/src/rot-13.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/encryption/rot-13/src/rot-13.c</a></td><td class='right'>205</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 1.3%;'/><td class='none' style='width: 98.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/xlators/encryption/rot-13/src/rot-13.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/encryption/rot-13/src/rot-13.h</a></td><td class='right'>33</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.2%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/xlators/features/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/Makefile.am</a></td><td class='right'>15</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/xlators/features/access-control/src/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/access-control/src/Makefile.am</a></td><td class='right'>13</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.1%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/xlators/features/access-control/src/access-control.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/access-control/src/access-control.c</a></td><td class='right'>1846</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 11.9%;'/><td class='none' style='width: 88.1%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/xlators/features/access-control/src/access-control.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/access-control/src/access-control.h</a></td><td class='right'>55</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.4%;'/><td class='none' style='width: 99.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='mov'><a href='/cgit/glusterfs.git/diff/xlators/features/arbiter/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/arbiter/Makefile.am</a> (renamed from scheduler/random/Makefile.am)</td><td class='right'>2</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 100.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/arbiter/src/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/arbiter/src/Makefile.am</a></td><td class='right'>19</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/arbiter/src/arbiter-mem-types.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/arbiter/src/arbiter-mem-types.h</a></td><td class='right'>18</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/arbiter/src/arbiter.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/arbiter/src/arbiter.c</a></td><td class='right'>380</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 2.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 97.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/arbiter/src/arbiter.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/arbiter/src/arbiter.h</a></td><td class='right'>21</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/barrier/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/barrier/Makefile.am</a></td><td class='right'>3</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 100.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/barrier/src/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/barrier/src/Makefile.am</a></td><td class='right'>17</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/barrier/src/barrier-mem-types.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/barrier/src/barrier-mem-types.h</a></td><td class='right'>20</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/barrier/src/barrier.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/barrier/src/barrier.c</a></td><td class='right'>809</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 5.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 94.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/barrier/src/barrier.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/barrier/src/barrier.h</a></td><td class='right'>89</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.6%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.4%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='mov'><a href='/cgit/glusterfs.git/diff/xlators/features/bit-rot/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/bit-rot/Makefile.am</a> (renamed from rpc/rpc-transport/rdma/Makefile.am)</td><td class='right'>0</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 100.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/bit-rot/src/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/bit-rot/src/Makefile.am</a></td><td class='right'>1</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 100.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/bit-rot/src/bitd/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/bit-rot/src/bitd/Makefile.am</a></td><td class='right'>23</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/bit-rot/src/bitd/bit-rot-bitd-messages.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/bit-rot/src/bitd/bit-rot-bitd-messages.h</a></td><td class='right'>101</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.6%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.4%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/bit-rot/src/bitd/bit-rot-scrub-status.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/bit-rot/src/bitd/bit-rot-scrub-status.c</a></td><td class='right'>78</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.5%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/bit-rot/src/bitd/bit-rot-scrub-status.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/bit-rot/src/bitd/bit-rot-scrub-status.h</a></td><td class='right'>50</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/bit-rot/src/bitd/bit-rot-scrub.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/bit-rot/src/bitd/bit-rot-scrub.c</a></td><td class='right'>2070</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 13.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 86.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/bit-rot/src/bitd/bit-rot-scrub.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/bit-rot/src/bitd/bit-rot-scrub.h</a></td><td class='right'>46</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/bit-rot/src/bitd/bit-rot-ssm.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/bit-rot/src/bitd/bit-rot-ssm.c</a></td><td class='right'>124</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.8%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.2%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/bit-rot/src/bitd/bit-rot-ssm.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/bit-rot/src/bitd/bit-rot-ssm.h</a></td><td class='right'>38</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/bit-rot/src/bitd/bit-rot.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/bit-rot/src/bitd/bit-rot.c</a></td><td class='right'>2232</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 14.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 85.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/bit-rot/src/bitd/bit-rot.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/bit-rot/src/bitd/bit-rot.h</a></td><td class='right'>302</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.9%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 98.1%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/bit-rot/src/stub/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/bit-rot/src/stub/Makefile.am</a></td><td class='right'>20</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/bit-rot/src/stub/bit-rot-common.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/bit-rot/src/stub/bit-rot-common.h</a></td><td class='right'>178</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 98.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/bit-rot/src/stub/bit-rot-object-version.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/bit-rot/src/stub/bit-rot-object-version.h</a></td><td class='right'>30</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/bit-rot/src/stub/bit-rot-stub-helpers.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/bit-rot/src/stub/bit-rot-stub-helpers.c</a></td><td class='right'>796</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 5.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 94.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/bit-rot/src/stub/bit-rot-stub-mem-types.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/bit-rot/src/stub/bit-rot-stub-mem-types.h</a></td><td class='right'>36</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/bit-rot/src/stub/bit-rot-stub-messages.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/bit-rot/src/stub/bit-rot-stub-messages.h</a></td><td class='right'>117</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.8%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.2%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/bit-rot/src/stub/bit-rot-stub.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/bit-rot/src/stub/bit-rot-stub.c</a></td><td class='right'>3590</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 23.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 76.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/bit-rot/src/stub/bit-rot-stub.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/bit-rot/src/stub/bit-rot-stub.h</a></td><td class='right'>515</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 3.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 96.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/changelog/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/changelog/Makefile.am</a></td><td class='right'>3</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 100.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/changelog/lib/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/changelog/lib/Makefile.am</a></td><td class='right'>3</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 100.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/changelog/lib/examples/c/get-changes-multi.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/changelog/lib/examples/c/get-changes-multi.c</a></td><td class='right'>90</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.6%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.4%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/changelog/lib/examples/c/get-changes.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/changelog/lib/examples/c/get-changes.c</a></td><td class='right'>93</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.6%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.4%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/changelog/lib/examples/c/get-history.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/changelog/lib/examples/c/get-history.c</a></td><td class='right'>116</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.7%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.3%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/changelog/lib/examples/python/changes.py?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/changelog/lib/examples/python/changes.py</a></td><td class='right'>34</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/changelog/lib/examples/python/libgfchangelog.py?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/changelog/lib/examples/python/libgfchangelog.py</a></td><td class='right'>71</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.5%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/changelog/lib/src/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/changelog/lib/src/Makefile.am</a></td><td class='right'>35</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/changelog/lib/src/changelog-lib-messages.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/changelog/lib/src/changelog-lib-messages.h</a></td><td class='right'>74</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.5%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/changelog/lib/src/gf-changelog-api.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/changelog/lib/src/gf-changelog-api.c</a></td><td class='right'>224</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 98.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/changelog/lib/src/gf-changelog-helpers.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/changelog/lib/src/gf-changelog-helpers.c</a></td><td class='right'>170</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 98.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/changelog/lib/src/gf-changelog-helpers.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/changelog/lib/src/gf-changelog-helpers.h</a></td><td class='right'>255</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.6%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 98.4%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/changelog/lib/src/gf-changelog-journal-handler.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/changelog/lib/src/gf-changelog-journal-handler.c</a></td><td class='right'>1029</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 6.6%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 93.4%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/changelog/lib/src/gf-changelog-journal.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/changelog/lib/src/gf-changelog-journal.h</a></td><td class='right'>116</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.7%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.3%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/changelog/lib/src/gf-changelog-reborp.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/changelog/lib/src/gf-changelog-reborp.c</a></td><td class='right'>413</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 2.7%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 97.3%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/changelog/lib/src/gf-changelog-rpc.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/changelog/lib/src/gf-changelog-rpc.c</a></td><td class='right'>98</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.6%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.4%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/changelog/lib/src/gf-changelog-rpc.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/changelog/lib/src/gf-changelog-rpc.h</a></td><td class='right'>28</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/changelog/lib/src/gf-changelog.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/changelog/lib/src/gf-changelog.c</a></td><td class='right'>652</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 4.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 95.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/changelog/lib/src/gf-history-changelog.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/changelog/lib/src/gf-history-changelog.c</a></td><td class='right'>1020</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 6.6%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 93.4%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/changelog/src/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/changelog/src/Makefile.am</a></td><td class='right'>29</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/changelog/src/changelog-barrier.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/changelog/src/changelog-barrier.c</a></td><td class='right'>131</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.8%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.2%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/changelog/src/changelog-encoders.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/changelog/src/changelog-encoders.c</a></td><td class='right'>232</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.5%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 98.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/changelog/src/changelog-encoders.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/changelog/src/changelog-encoders.h</a></td><td class='right'>50</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/changelog/src/changelog-ev-handle.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/changelog/src/changelog-ev-handle.c</a></td><td class='right'>412</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 2.7%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 97.3%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/changelog/src/changelog-ev-handle.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/changelog/src/changelog-ev-handle.h</a></td><td class='right'>136</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.9%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.1%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/changelog/src/changelog-helpers.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/changelog/src/changelog-helpers.c</a></td><td class='right'>1977</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 12.7%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 87.3%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/changelog/src/changelog-helpers.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/changelog/src/changelog-helpers.h</a></td><td class='right'>716</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 4.6%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 95.4%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/changelog/src/changelog-mem-types.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/changelog/src/changelog-mem-types.h</a></td><td class='right'>34</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/changelog/src/changelog-messages.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/changelog/src/changelog-messages.h</a></td><td class='right'>172</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 98.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/changelog/src/changelog-misc.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/changelog/src/changelog-misc.h</a></td><td class='right'>131</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.8%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.2%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/changelog/src/changelog-rpc-common.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/changelog/src/changelog-rpc-common.c</a></td><td class='right'>359</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 2.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 97.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/changelog/src/changelog-rpc-common.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/changelog/src/changelog-rpc-common.h</a></td><td class='right'>85</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.5%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/changelog/src/changelog-rpc.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/changelog/src/changelog-rpc.c</a></td><td class='right'>440</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 2.8%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 97.2%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/changelog/src/changelog-rpc.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/changelog/src/changelog-rpc.h</a></td><td class='right'>31</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/changelog/src/changelog-rt.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/changelog/src/changelog-rt.c</a></td><td class='right'>66</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/changelog/src/changelog-rt.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/changelog/src/changelog-rt.h</a></td><td class='right'>33</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/changelog/src/changelog.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/changelog/src/changelog.c</a></td><td class='right'>2989</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 19.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 80.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/cloudsync/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/cloudsync/Makefile.am</a></td><td class='right'>3</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 100.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/cloudsync/src/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/cloudsync/src/Makefile.am</a></td><td class='right'>46</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/cloudsync/src/cloudsync-autogen-fops-tmpl.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/cloudsync/src/cloudsync-autogen-fops-tmpl.c</a></td><td class='right'>30</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/cloudsync/src/cloudsync-autogen-fops-tmpl.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/cloudsync/src/cloudsync-autogen-fops-tmpl.h</a></td><td class='right'>24</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/cloudsync/src/cloudsync-common.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/cloudsync/src/cloudsync-common.c</a></td><td class='right'>60</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/cloudsync/src/cloudsync-common.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/cloudsync/src/cloudsync-common.h</a></td><td class='right'>134</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.9%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.1%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/cloudsync/src/cloudsync-fops-c.py?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/cloudsync/src/cloudsync-fops-c.py</a></td><td class='right'>324</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 2.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 97.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/cloudsync/src/cloudsync-fops-h.py?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/cloudsync/src/cloudsync-fops-h.py</a></td><td class='right'>31</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/cloudsync/src/cloudsync-mem-types.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/cloudsync/src/cloudsync-mem-types.h</a></td><td class='right'>22</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/cloudsync/src/cloudsync-messages.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/cloudsync/src/cloudsync-messages.h</a></td><td class='right'>16</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/cloudsync/src/cloudsync-plugins/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/cloudsync/src/cloudsync-plugins/Makefile.am</a></td><td class='right'>3</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 100.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/cloudsync/src/cloudsync-plugins/src/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/cloudsync/src/cloudsync-plugins/src/Makefile.am</a></td><td class='right'>11</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/cloudsync/src/cloudsync-plugins/src/cloudsyncs3/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/cloudsync/src/cloudsync-plugins/src/cloudsyncs3/Makefile.am</a></td><td class='right'>3</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 100.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/cloudsync/src/cloudsync-plugins/src/cloudsyncs3/src/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/cloudsync/src/cloudsync-plugins/src/cloudsyncs3/src/Makefile.am</a></td><td class='right'>12</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/cloudsync/src/cloudsync-plugins/src/cloudsyncs3/src/libcloudsyncs3-mem-types.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/cloudsync/src/cloudsync-plugins/src/cloudsyncs3/src/libcloudsyncs3-mem-types.h</a></td><td class='right'>19</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/cloudsync/src/cloudsync-plugins/src/cloudsyncs3/src/libcloudsyncs3.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/cloudsync/src/cloudsync-plugins/src/cloudsyncs3/src/libcloudsyncs3.c</a></td><td class='right'>584</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 3.8%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 96.2%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/cloudsync/src/cloudsync-plugins/src/cloudsyncs3/src/libcloudsyncs3.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/cloudsync/src/cloudsync-plugins/src/cloudsyncs3/src/libcloudsyncs3.h</a></td><td class='right'>50</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/cloudsync/src/cloudsync-plugins/src/cloudsyncs3/src/libcloudsyncs3.sym?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/cloudsync/src/cloudsync-plugins/src/cloudsyncs3/src/libcloudsyncs3.sym</a></td><td class='right'>1</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 100.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/cloudsync/src/cloudsync-plugins/src/cvlt/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/cloudsync/src/cloudsync-plugins/src/cvlt/Makefile.am</a></td><td class='right'>3</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 100.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/cloudsync/src/cloudsync-plugins/src/cvlt/src/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/cloudsync/src/cloudsync-plugins/src/cvlt/src/Makefile.am</a></td><td class='right'>12</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/cloudsync/src/cloudsync-plugins/src/cvlt/src/archivestore.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/cloudsync/src/cloudsync-plugins/src/cvlt/src/archivestore.h</a></td><td class='right'>203</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 98.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/cloudsync/src/cloudsync-plugins/src/cvlt/src/cvlt-messages.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/cloudsync/src/cloudsync-plugins/src/cvlt/src/cvlt-messages.h</a></td><td class='right'>30</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/cloudsync/src/cloudsync-plugins/src/cvlt/src/libcloudsynccvlt.sym?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/cloudsync/src/cloudsync-plugins/src/cvlt/src/libcloudsynccvlt.sym</a></td><td class='right'>1</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 100.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/cloudsync/src/cloudsync-plugins/src/cvlt/src/libcvlt-mem-types.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/cloudsync/src/cloudsync-plugins/src/cvlt/src/libcvlt-mem-types.h</a></td><td class='right'>19</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/cloudsync/src/cloudsync-plugins/src/cvlt/src/libcvlt.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/cloudsync/src/cloudsync-plugins/src/cvlt/src/libcvlt.c</a></td><td class='right'>842</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 5.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 94.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/cloudsync/src/cloudsync-plugins/src/cvlt/src/libcvlt.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/cloudsync/src/cloudsync-plugins/src/cvlt/src/libcvlt.h</a></td><td class='right'>84</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.5%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/cloudsync/src/cloudsync.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/cloudsync/src/cloudsync.c</a></td><td class='right'>2076</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 13.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 86.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/cloudsync/src/cloudsync.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/cloudsync/src/cloudsync.h</a></td><td class='right'>123</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.8%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.2%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/compress/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/compress/Makefile.am</a></td><td class='right'>3</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 100.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/compress/src/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/compress/src/Makefile.am</a></td><td class='right'>19</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/compress/src/cdc-helper.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/compress/src/cdc-helper.c</a></td><td class='right'>527</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 3.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 96.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/compress/src/cdc-mem-types.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/compress/src/cdc-mem-types.h</a></td><td class='right'>23</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/compress/src/cdc.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/compress/src/cdc.c</a></td><td class='right'>348</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 2.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 97.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/compress/src/cdc.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/compress/src/cdc.h</a></td><td class='right'>99</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.6%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.4%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/xlators/features/filter/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/filter/Makefile.am</a></td><td class='right'>3</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 100.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/xlators/features/filter/src/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/filter/src/Makefile.am</a></td><td class='right'>15</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.1%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/xlators/features/filter/src/filter-mem-types.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/filter/src/filter-mem-types.h</a></td><td class='right'>30</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.2%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/xlators/features/filter/src/filter.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/filter/src/filter.c</a></td><td class='right'>1744</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 11.2%;'/><td class='none' style='width: 88.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='mov'><a href='/cgit/glusterfs.git/diff/xlators/features/gfid-access/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/gfid-access/Makefile.am</a> (renamed from xlators/bindings/python/Makefile.am)</td><td class='right'>0</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 100.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/gfid-access/src/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/gfid-access/src/Makefile.am</a></td><td class='right'>16</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/gfid-access/src/gfid-access-mem-types.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/gfid-access/src/gfid-access-mem-types.h</a></td><td class='right'>22</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/gfid-access/src/gfid-access.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/gfid-access/src/gfid-access.c</a></td><td class='right'>1420</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 9.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 90.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/gfid-access/src/gfid-access.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/gfid-access/src/gfid-access.h</a></td><td class='right'>107</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.7%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.3%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/index/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/index/Makefile.am</a></td><td class='right'>3</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 100.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/index/src/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/index/src/Makefile.am</a></td><td class='right'>19</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/index/src/index-mem-types.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/index/src/index-mem-types.h</a></td><td class='right'>23</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/index/src/index-messages.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/index/src/index-messages.h</a></td><td class='right'>33</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/index/src/index.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/index/src/index.c</a></td><td class='right'>2682</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 17.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 82.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/index/src/index.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/index/src/index.h</a></td><td class='right'>86</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.6%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.4%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/leases/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/leases/Makefile.am</a></td><td class='right'>3</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 100.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/leases/src/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/leases/src/Makefile.am</a></td><td class='right'>20</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/leases/src/leases-internal.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/leases/src/leases-internal.c</a></td><td class='right'>1412</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 9.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 90.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/leases/src/leases-mem-types.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/leases/src/leases-mem-types.h</a></td><td class='right'>27</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/leases/src/leases-messages.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/leases/src/leases-messages.h</a></td><td class='right'>33</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/leases/src/leases.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/leases/src/leases.c</a></td><td class='right'>1168</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 7.5%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 92.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/leases/src/leases.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/leases/src/leases.h</a></td><td class='right'>259</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.7%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 98.3%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/xlators/features/locks/src/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/locks/src/Makefile.am</a></td><td class='right'>23</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/locks/src/clear.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/locks/src/clear.c</a></td><td class='right'>460</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 3.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 97.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/locks/src/clear.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/locks/src/clear.h</a></td><td class='right'>73</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.5%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/xlators/features/locks/src/common.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/locks/src/common.c</a></td><td class='right'>1948</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 8.2%;'/><td class='rem' style='width: 4.3%;'/><td class='none' style='width: 87.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/xlators/features/locks/src/common.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/locks/src/common.h</a></td><td class='right'>265</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.3%;'/><td class='rem' style='width: 0.4%;'/><td class='none' style='width: 98.3%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/xlators/features/locks/src/entrylk.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/locks/src/entrylk.c</a></td><td class='right'>1507</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 5.9%;'/><td class='rem' style='width: 3.8%;'/><td class='none' style='width: 90.3%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/xlators/features/locks/src/inodelk.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/locks/src/inodelk.c</a></td><td class='right'>1524</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 6.3%;'/><td class='rem' style='width: 3.5%;'/><td class='none' style='width: 90.2%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/xlators/features/locks/src/locks-mem-types.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/locks/src/locks-mem-types.h</a></td><td class='right'>43</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.2%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/xlators/features/locks/src/locks.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/locks/src/locks.h</a></td><td class='right'>333</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.5%;'/><td class='rem' style='width: 0.6%;'/><td class='none' style='width: 97.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/locks/src/pl-messages.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/locks/src/pl-messages.h</a></td><td class='right'>29</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/xlators/features/locks/src/posix.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/locks/src/posix.c</a></td><td class='right'>5641</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 29.4%;'/><td class='rem' style='width: 6.9%;'/><td class='none' style='width: 63.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/locks/src/reservelk.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/locks/src/reservelk.c</a></td><td class='right'>382</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 2.5%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 97.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/xlators/features/locks/tests/unit-test.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/locks/tests/unit-test.c</a></td><td class='right'>118</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.4%;'/><td class='rem' style='width: 0.4%;'/><td class='none' style='width: 99.2%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/xlators/features/mac-compat/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/mac-compat/Makefile.am</a></td><td class='right'>3</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 100.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/xlators/features/mac-compat/src/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/mac-compat/src/Makefile.am</a></td><td class='right'>13</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.1%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/xlators/features/mac-compat/src/mac-compat.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/mac-compat/src/mac-compat.c</a></td><td class='right'>247</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 1.6%;'/><td class='none' style='width: 98.4%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/marker/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/marker/Makefile.am</a></td><td class='right'>3</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 100.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/marker/src/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/marker/src/Makefile.am</a></td><td class='right'>24</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/marker/src/marker-common.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/marker/src/marker-common.c</a></td><td class='right'>57</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/marker/src/marker-common.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/marker/src/marker-common.h</a></td><td class='right'>19</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/marker/src/marker-mem-types.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/marker/src/marker-mem-types.h</a></td><td class='right'>28</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/marker/src/marker-quota-helper.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/marker/src/marker-quota-helper.c</a></td><td class='right'>380</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 2.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 97.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/marker/src/marker-quota-helper.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/marker/src/marker-quota-helper.h</a></td><td class='right'>66</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/marker/src/marker-quota.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/marker/src/marker-quota.c</a></td><td class='right'>2297</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 14.8%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 85.2%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/marker/src/marker-quota.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/marker/src/marker-quota.h</a></td><td class='right'>140</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.9%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.1%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/marker/src/marker.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/marker/src/marker.c</a></td><td class='right'>3568</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 23.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 77.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/marker/src/marker.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/marker/src/marker.h</a></td><td class='right'>148</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/metadisp/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/metadisp/Makefile.am</a></td><td class='right'>3</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 100.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/metadisp/src/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/metadisp/src/Makefile.am</a></td><td class='right'>38</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/metadisp/src/backend.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/metadisp/src/backend.c</a></td><td class='right'>45</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/metadisp/src/fops-tmpl.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/metadisp/src/fops-tmpl.c</a></td><td class='right'>10</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/metadisp/src/gen-fops.py?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/metadisp/src/gen-fops.py</a></td><td class='right'>160</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/metadisp/src/metadisp-create.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/metadisp/src/metadisp-create.c</a></td><td class='right'>101</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.6%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.4%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/metadisp/src/metadisp-fops.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/metadisp/src/metadisp-fops.h</a></td><td class='right'>51</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/metadisp/src/metadisp-fsync.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/metadisp/src/metadisp-fsync.c</a></td><td class='right'>54</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/metadisp/src/metadisp-lookup.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/metadisp/src/metadisp-lookup.c</a></td><td class='right'>90</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.6%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.4%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/metadisp/src/metadisp-open.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/metadisp/src/metadisp-open.c</a></td><td class='right'>70</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.5%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/metadisp/src/metadisp-readdir.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/metadisp/src/metadisp-readdir.c</a></td><td class='right'>65</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/metadisp/src/metadisp-setattr.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/metadisp/src/metadisp-setattr.c</a></td><td class='right'>90</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.6%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.4%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/metadisp/src/metadisp-stat.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/metadisp/src/metadisp-stat.c</a></td><td class='right'>124</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.8%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.2%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/metadisp/src/metadisp-unlink.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/metadisp/src/metadisp-unlink.c</a></td><td class='right'>160</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/metadisp/src/metadisp.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/metadisp/src/metadisp.c</a></td><td class='right'>46</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/metadisp/src/metadisp.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/metadisp/src/metadisp.h</a></td><td class='right'>45</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/namespace/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/namespace/Makefile.am</a></td><td class='right'>3</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 100.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/namespace/src/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/namespace/src/Makefile.am</a></td><td class='right'>17</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/namespace/src/namespace.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/namespace/src/namespace.c</a></td><td class='right'>1344</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 8.6%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 91.4%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/namespace/src/namespace.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/namespace/src/namespace.h</a></td><td class='right'>23</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/xlators/features/path-convertor/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/path-convertor/Makefile.am</a></td><td class='right'>3</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 100.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/xlators/features/path-convertor/src/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/path-convertor/src/Makefile.am</a></td><td class='right'>14</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.1%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/xlators/features/path-convertor/src/path-mem-types.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/path-convertor/src/path-mem-types.h</a></td><td class='right'>32</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.2%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/xlators/features/path-convertor/src/path.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/path-convertor/src/path.c</a></td><td class='right'>1239</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 8.0%;'/><td class='none' style='width: 92.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/quiesce/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/quiesce/Makefile.am</a></td><td class='right'>3</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 100.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/quiesce/src/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/quiesce/src/Makefile.am</a></td><td class='right'>16</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/quiesce/src/quiesce-mem-types.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/quiesce/src/quiesce-mem-types.h</a></td><td class='right'>21</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/quiesce/src/quiesce-messages.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/quiesce/src/quiesce-messages.h</a></td><td class='right'>28</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/quiesce/src/quiesce.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/quiesce/src/quiesce.c</a></td><td class='right'>2704</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 17.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 82.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/quiesce/src/quiesce.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/quiesce/src/quiesce.h</a></td><td class='right'>65</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/xlators/features/quota/src/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/quota/src/Makefile.am</a></td><td class='right'>30</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.1%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/quota/src/quota-enforcer-client.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/quota/src/quota-enforcer-client.c</a></td><td class='right'>503</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 3.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 96.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/xlators/features/quota/src/quota-mem-types.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/quota/src/quota-mem-types.h</a></td><td class='right'>39</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.1%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/quota/src/quota-messages.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/quota/src/quota-messages.h</a></td><td class='right'>39</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/xlators/features/quota/src/quota.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/quota/src/quota.c</a></td><td class='right'>5824</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 32.2%;'/><td class='rem' style='width: 5.3%;'/><td class='none' style='width: 62.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/quota/src/quota.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/quota/src/quota.h</a></td><td class='right'>266</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.7%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 98.3%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/quota/src/quotad-aggregator.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/quota/src/quotad-aggregator.c</a></td><td class='right'>494</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 3.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 96.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/quota/src/quotad-aggregator.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/quota/src/quotad-aggregator.h</a></td><td class='right'>38</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/quota/src/quotad-helpers.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/quota/src/quotad-helpers.c</a></td><td class='right'>107</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.7%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.3%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/quota/src/quotad-helpers.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/quota/src/quotad-helpers.h</a></td><td class='right'>24</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/quota/src/quotad.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/quota/src/quotad.c</a></td><td class='right'>245</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.6%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 98.4%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/xlators/features/read-only/src/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/read-only/src/Makefile.am</a></td><td class='right'>20</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/read-only/src/read-only-common.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/read-only/src/read-only-common.c</a></td><td class='right'>406</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 2.6%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 97.4%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/read-only/src/read-only-common.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/read-only/src/read-only-common.h</a></td><td class='right'>121</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.8%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.2%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/read-only/src/read-only-mem-types.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/read-only/src/read-only-mem-types.h</a></td><td class='right'>20</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/xlators/features/read-only/src/read-only.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/read-only/src/read-only.c</a></td><td class='right'>373</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.7%;'/><td class='rem' style='width: 1.7%;'/><td class='none' style='width: 97.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/read-only/src/read-only.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/read-only/src/read-only.h</a></td><td class='right'>37</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/read-only/src/worm-helper.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/read-only/src/worm-helper.c</a></td><td class='right'>395</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 2.5%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 97.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/read-only/src/worm-helper.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/read-only/src/worm-helper.h</a></td><td class='right'>44</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/read-only/src/worm.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/read-only/src/worm.c</a></td><td class='right'>722</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 4.6%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 95.4%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/sdfs/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/sdfs/Makefile.am</a></td><td class='right'>3</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 100.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/sdfs/src/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/sdfs/src/Makefile.am</a></td><td class='right'>19</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/sdfs/src/sdfs-messages.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/sdfs/src/sdfs-messages.h</a></td><td class='right'>67</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/sdfs/src/sdfs.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/sdfs/src/sdfs.c</a></td><td class='right'>1479</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 9.5%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 90.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/sdfs/src/sdfs.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/sdfs/src/sdfs.h</a></td><td class='right'>49</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/selinux/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/selinux/Makefile.am</a></td><td class='right'>3</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 100.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/selinux/src/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/selinux/src/Makefile.am</a></td><td class='right'>20</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/selinux/src/selinux-mem-types.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/selinux/src/selinux-mem-types.h</a></td><td class='right'>19</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/selinux/src/selinux-messages.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/selinux/src/selinux-messages.h</a></td><td class='right'>30</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/selinux/src/selinux.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/selinux/src/selinux.c</a></td><td class='right'>323</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 2.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 97.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/selinux/src/selinux.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/selinux/src/selinux.h</a></td><td class='right'>24</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/shard/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/shard/Makefile.am</a></td><td class='right'>3</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 100.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/shard/src/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/shard/src/Makefile.am</a></td><td class='right'>17</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/shard/src/shard-mem-types.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/shard/src/shard-mem-types.h</a></td><td class='right'>24</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/shard/src/shard-messages.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/shard/src/shard-messages.h</a></td><td class='right'>39</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/shard/src/shard.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/shard/src/shard.c</a></td><td class='right'>7382</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 47.5%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 52.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/shard/src/shard.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/shard/src/shard.h</a></td><td class='right'>348</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 2.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 97.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='mov'><a href='/cgit/glusterfs.git/diff/xlators/features/snapview-client/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/snapview-client/Makefile.am</a> (renamed from xlators/performance/stat-prefetch/Makefile.am)</td><td class='right'>0</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 100.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/snapview-client/src/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/snapview-client/src/Makefile.am</a></td><td class='right'>16</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/snapview-client/src/snapview-client-mem-types.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/snapview-client/src/snapview-client-mem-types.h</a></td><td class='right'>24</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/snapview-client/src/snapview-client-messages.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/snapview-client/src/snapview-client-messages.h</a></td><td class='right'>71</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.5%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/snapview-client/src/snapview-client.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/snapview-client/src/snapview-client.c</a></td><td class='right'>2791</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 18.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 82.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/snapview-client/src/snapview-client.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/snapview-client/src/snapview-client.h</a></td><td class='right'>101</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.6%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.4%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/snapview-server/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/snapview-server/Makefile.am</a></td><td class='right'>1</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 100.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/snapview-server/src/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/snapview-server/src/Makefile.am</a></td><td class='right'>25</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/snapview-server/src/snapview-server-helpers.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/snapview-server/src/snapview-server-helpers.c</a></td><td class='right'>715</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 4.6%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 95.4%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/snapview-server/src/snapview-server-mem-types.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/snapview-server/src/snapview-server-mem-types.h</a></td><td class='right'>25</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/snapview-server/src/snapview-server-messages.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/snapview-server/src/snapview-server-messages.h</a></td><td class='right'>54</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/snapview-server/src/snapview-server-mgmt.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/snapview-server/src/snapview-server-mgmt.c</a></td><td class='right'>524</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 3.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 96.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/snapview-server/src/snapview-server.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/snapview-server/src/snapview-server.c</a></td><td class='right'>2720</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 17.5%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 82.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/snapview-server/src/snapview-server.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/snapview-server/src/snapview-server.h</a></td><td class='right'>255</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.6%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 98.4%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/thin-arbiter/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/thin-arbiter/Makefile.am</a></td><td class='right'>3</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 100.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/thin-arbiter/src/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/thin-arbiter/src/Makefile.am</a></td><td class='right'>22</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/thin-arbiter/src/thin-arbiter-mem-types.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/thin-arbiter/src/thin-arbiter-mem-types.h</a></td><td class='right'>19</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/thin-arbiter/src/thin-arbiter-messages.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/thin-arbiter/src/thin-arbiter-messages.h</a></td><td class='right'>28</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/thin-arbiter/src/thin-arbiter.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/thin-arbiter/src/thin-arbiter.c</a></td><td class='right'>661</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 4.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 95.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/thin-arbiter/src/thin-arbiter.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/thin-arbiter/src/thin-arbiter.h</a></td><td class='right'>59</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/xlators/features/trash/src/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/trash/src/Makefile.am</a></td><td class='right'>12</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/xlators/features/trash/src/trash-mem-types.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/trash/src/trash-mem-types.h</a></td><td class='right'>33</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.1%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/xlators/features/trash/src/trash.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/trash/src/trash.c</a></td><td class='right'>3764</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 15.6%;'/><td class='rem' style='width: 8.6%;'/><td class='none' style='width: 75.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/xlators/features/trash/src/trash.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/trash/src/trash.h</a></td><td class='right'>128</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.4%;'/><td class='rem' style='width: 0.4%;'/><td class='none' style='width: 99.2%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/upcall/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/upcall/Makefile.am</a></td><td class='right'>3</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 100.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/upcall/src/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/upcall/src/Makefile.am</a></td><td class='right'>23</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/upcall/src/upcall-cache-invalidation.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/upcall/src/upcall-cache-invalidation.h</a></td><td class='right'>18</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/upcall/src/upcall-internal.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/upcall/src/upcall-internal.c</a></td><td class='right'>689</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 4.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 95.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/upcall/src/upcall-mem-types.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/upcall/src/upcall-mem-types.h</a></td><td class='right'>23</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/upcall/src/upcall-messages.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/upcall/src/upcall-messages.h</a></td><td class='right'>29</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/upcall/src/upcall.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/upcall/src/upcall.c</a></td><td class='right'>2505</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 16.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 83.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/upcall/src/upcall.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/upcall/src/upcall.h</a></td><td class='right'>131</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.8%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.2%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/utime/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/utime/Makefile.am</a></td><td class='right'>3</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 100.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/utime/src/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/utime/src/Makefile.am</a></td><td class='right'>41</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/utime/src/utime-autogen-fops-tmpl.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/utime/src/utime-autogen-fops-tmpl.c</a></td><td class='right'>28</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/utime/src/utime-autogen-fops-tmpl.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/utime/src/utime-autogen-fops-tmpl.h</a></td><td class='right'>22</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/utime/src/utime-gen-fops-c.py?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/utime/src/utime-gen-fops-c.py</a></td><td class='right'>147</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.9%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.1%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/utime/src/utime-gen-fops-h.py?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/utime/src/utime-gen-fops-h.py</a></td><td class='right'>35</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/utime/src/utime-helpers.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/utime/src/utime-helpers.c</a></td><td class='right'>110</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.7%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.3%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/utime/src/utime-helpers.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/utime/src/utime-helpers.h</a></td><td class='right'>25</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/utime/src/utime-mem-types.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/utime/src/utime-mem-types.h</a></td><td class='right'>21</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/utime/src/utime-messages.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/utime/src/utime-messages.h</a></td><td class='right'>29</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/utime/src/utime.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/utime/src/utime.c</a></td><td class='right'>392</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 2.5%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 97.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/features/utime/src/utime.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/utime/src/utime.h</a></td><td class='right'>23</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/lib/src/libxlator.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/lib/src/libxlator.c</a></td><td class='right'>490</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 3.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 96.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/lib/src/libxlator.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/lib/src/libxlator.h</a></td><td class='right'>147</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.9%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.1%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/xlators/meta/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/meta/Makefile.am</a></td><td class='right'>2</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 100.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/xlators/meta/src/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/meta/src/Makefile.am</a></td><td class='right'>48</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/meta/src/active-link.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/meta/src/active-link.c</a></td><td class='right'>34</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/meta/src/cmdline-file.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/meta/src/cmdline-file.c</a></td><td class='right'>39</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/meta/src/frames-file.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/meta/src/frames-file.c</a></td><td class='right'>107</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.7%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.3%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/meta/src/graph-dir.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/meta/src/graph-dir.c</a></td><td class='right'>98</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.6%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.4%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/meta/src/graphs-dir.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/meta/src/graphs-dir.c</a></td><td class='right'>67</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/meta/src/history-file.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/meta/src/history-file.c</a></td><td class='right'>44</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/meta/src/logfile-link.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/meta/src/logfile-link.c</a></td><td class='right'>34</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/meta/src/logging-dir.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/meta/src/logging-dir.c</a></td><td class='right'>44</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/meta/src/loglevel-file.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/meta/src/loglevel-file.c</a></td><td class='right'>50</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/meta/src/mallinfo-file.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/meta/src/mallinfo-file.c</a></td><td class='right'>36</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/meta/src/measure-file.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/meta/src/measure-file.c</a></td><td class='right'>49</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/meta/src/meminfo-file.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/meta/src/meminfo-file.c</a></td><td class='right'>44</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/meta/src/meta-defaults.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/meta/src/meta-defaults.c</a></td><td class='right'>655</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 4.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 95.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/meta/src/meta-helpers.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/meta/src/meta-helpers.c</a></td><td class='right'>332</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 2.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 97.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/meta/src/meta-hooks.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/meta/src/meta-hooks.h</a></td><td class='right'>48</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/xlators/meta/src/meta-mem-types.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/meta/src/meta-mem-types.h</a></td><td class='right'>36</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.1%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/xlators/meta/src/meta.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/meta/src/meta.c</a></td><td class='right'>1355</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.0%;'/><td class='rem' style='width: 7.7%;'/><td class='none' style='width: 91.3%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/xlators/meta/src/meta.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/meta/src/meta.h</a></td><td class='right'>162</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.8%;'/><td class='rem' style='width: 0.2%;'/><td class='none' style='width: 99.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/xlators/meta/src/misc.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/meta/src/misc.c</a></td><td class='right'>67</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.4%;'/><td class='none' style='width: 99.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/xlators/meta/src/misc.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/meta/src/misc.h</a></td><td class='right'>31</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.2%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/meta/src/name-file.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/meta/src/name-file.c</a></td><td class='right'>44</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/meta/src/option-file.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/meta/src/option-file.c</a></td><td class='right'>45</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/meta/src/options-dir.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/meta/src/options-dir.c</a></td><td class='right'>65</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/meta/src/private-file.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/meta/src/private-file.c</a></td><td class='right'>44</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/meta/src/process_uuid-file.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/meta/src/process_uuid-file.c</a></td><td class='right'>37</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/meta/src/profile-file.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/meta/src/profile-file.c</a></td><td class='right'>44</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/meta/src/root-dir.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/meta/src/root-dir.c</a></td><td class='right'>77</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.5%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/meta/src/subvolume-link.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/meta/src/subvolume-link.c</a></td><td class='right'>56</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/meta/src/subvolumes-dir.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/meta/src/subvolumes-dir.c</a></td><td class='right'>62</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/meta/src/top-link.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/meta/src/top-link.c</a></td><td class='right'>40</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/xlators/meta/src/tree.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/meta/src/tree.c</a></td><td class='right'>179</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 1.2%;'/><td class='none' style='width: 98.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/xlators/meta/src/tree.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/meta/src/tree.h</a></td><td class='right'>35</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.2%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/meta/src/type-file.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/meta/src/type-file.c</a></td><td class='right'>44</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/meta/src/version-file.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/meta/src/version-file.c</a></td><td class='right'>37</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/meta/src/view-dir.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/meta/src/view-dir.c</a></td><td class='right'>33</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/xlators/meta/src/view.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/meta/src/view.c</a></td><td class='right'>258</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 1.7%;'/><td class='none' style='width: 98.3%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/xlators/meta/src/view.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/meta/src/view.h</a></td><td class='right'>32</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.2%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/meta/src/volfile-file.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/meta/src/volfile-file.c</a></td><td class='right'>79</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.5%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/meta/src/xlator-dir.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/meta/src/xlator-dir.c</a></td><td class='right'>97</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.6%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.4%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/xlators/mgmt/glusterd/src/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/mgmt/glusterd/src/Makefile.am</a></td><td class='right'>84</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.5%;'/><td class='rem' style='width: 0.1%;'/><td class='none' style='width: 99.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/mgmt/glusterd/src/glusterd-bitd-svc.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/mgmt/glusterd/src/glusterd-bitd-svc.c</a></td><td class='right'>206</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 98.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/mgmt/glusterd/src/glusterd-bitd-svc.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/mgmt/glusterd/src/glusterd-bitd-svc.h</a></td><td class='right'>40</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/mgmt/glusterd/src/glusterd-bitrot.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/mgmt/glusterd/src/glusterd-bitrot.c</a></td><td class='right'>822</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 5.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 94.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/mgmt/glusterd/src/glusterd-brick-ops.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/mgmt/glusterd/src/glusterd-brick-ops.c</a></td><td class='right'>2796</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 18.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 82.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/mgmt/glusterd/src/glusterd-conn-helper.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/mgmt/glusterd/src/glusterd-conn-helper.c</a></td><td class='right'>21</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/mgmt/glusterd/src/glusterd-conn-helper.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/mgmt/glusterd/src/glusterd-conn-helper.h</a></td><td class='right'>21</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/mgmt/glusterd/src/glusterd-conn-mgmt.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/mgmt/glusterd/src/glusterd-conn-mgmt.c</a></td><td class='right'>191</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 98.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/mgmt/glusterd/src/glusterd-conn-mgmt.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/mgmt/glusterd/src/glusterd-conn-mgmt.h</a></td><td class='right'>53</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/mgmt/glusterd/src/glusterd-errno.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/mgmt/glusterd/src/glusterd-errno.h</a></td><td class='right'>33</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/mgmt/glusterd/src/glusterd-ganesha.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/mgmt/glusterd/src/glusterd-ganesha.c</a></td><td class='right'>927</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 6.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 94.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/mgmt/glusterd/src/glusterd-geo-rep.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/mgmt/glusterd/src/glusterd-geo-rep.c</a></td><td class='right'>6782</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 43.6%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 56.4%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/mgmt/glusterd/src/glusterd-geo-rep.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/mgmt/glusterd/src/glusterd-geo-rep.h</a></td><td class='right'>52</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/mgmt/glusterd/src/glusterd-gfproxyd-svc-helper.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/mgmt/glusterd/src/glusterd-gfproxyd-svc-helper.c</a></td><td class='right'>235</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.5%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 98.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/mgmt/glusterd/src/glusterd-gfproxyd-svc-helper.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/mgmt/glusterd/src/glusterd-gfproxyd-svc-helper.h</a></td><td class='right'>51</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/mgmt/glusterd/src/glusterd-gfproxyd-svc.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/mgmt/glusterd/src/glusterd-gfproxyd-svc.c</a></td><td class='right'>478</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 3.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 96.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/mgmt/glusterd/src/glusterd-gfproxyd-svc.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/mgmt/glusterd/src/glusterd-gfproxyd-svc.h</a></td><td class='right'>47</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/xlators/mgmt/glusterd/src/glusterd-handler.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/mgmt/glusterd/src/glusterd-handler.c</a></td><td class='right'>8424</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 38.9%;'/><td class='rem' style='width: 15.3%;'/><td class='none' style='width: 45.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/xlators/mgmt/glusterd/src/glusterd-handshake.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/mgmt/glusterd/src/glusterd-handshake.c</a></td><td class='right'>2657</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 16.2%;'/><td class='rem' style='width: 0.9%;'/><td class='none' style='width: 82.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/mgmt/glusterd/src/glusterd-hooks.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/mgmt/glusterd/src/glusterd-hooks.c</a></td><td class='right'>641</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 4.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 95.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/mgmt/glusterd/src/glusterd-hooks.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/mgmt/glusterd/src/glusterd-hooks.h</a></td><td class='right'>88</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.6%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.4%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/mgmt/glusterd/src/glusterd-locks.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/mgmt/glusterd/src/glusterd-locks.c</a></td><td class='right'>870</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 5.6%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 94.4%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/mgmt/glusterd/src/glusterd-locks.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/mgmt/glusterd/src/glusterd-locks.h</a></td><td class='right'>57</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/mgmt/glusterd/src/glusterd-log-ops.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/mgmt/glusterd/src/glusterd-log-ops.c</a></td><td class='right'>290</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.9%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 98.1%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/xlators/mgmt/glusterd/src/glusterd-mem-types.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/mgmt/glusterd/src/glusterd-mem-types.h</a></td><td class='right'>104</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.4%;'/><td class='none' style='width: 99.3%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/mgmt/glusterd/src/glusterd-messages.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/mgmt/glusterd/src/glusterd-messages.h</a></td><td class='right'>451</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 2.9%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 97.1%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/mgmt/glusterd/src/glusterd-mgmt-handler.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/mgmt/glusterd/src/glusterd-mgmt-handler.c</a></td><td class='right'>1144</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 7.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 92.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/mgmt/glusterd/src/glusterd-mgmt.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/mgmt/glusterd/src/glusterd-mgmt.c</a></td><td class='right'>3114</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 20.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 80.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/mgmt/glusterd/src/glusterd-mgmt.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/mgmt/glusterd/src/glusterd-mgmt.h</a></td><td class='right'>97</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.6%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.4%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/mgmt/glusterd/src/glusterd-mountbroker.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/mgmt/glusterd/src/glusterd-mountbroker.c</a></td><td class='right'>721</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 4.6%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 95.4%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/mgmt/glusterd/src/glusterd-mountbroker.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/mgmt/glusterd/src/glusterd-mountbroker.h</a></td><td class='right'>37</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/mgmt/glusterd/src/glusterd-nfs-svc.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/mgmt/glusterd/src/glusterd-nfs-svc.c</a></td><td class='right'>228</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.5%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 98.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/mgmt/glusterd/src/glusterd-nfs-svc.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/mgmt/glusterd/src/glusterd-nfs-svc.h</a></td><td class='right'>27</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/xlators/mgmt/glusterd/src/glusterd-op-sm.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/mgmt/glusterd/src/glusterd-op-sm.c</a></td><td class='right'>10351</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 47.0%;'/><td class='rem' style='width: 19.6%;'/><td class='none' style='width: 33.4%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/xlators/mgmt/glusterd/src/glusterd-op-sm.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/mgmt/glusterd/src/glusterd-op-sm.h</a></td><td class='right'>374</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.4%;'/><td class='rem' style='width: 1.0%;'/><td class='none' style='width: 97.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/mgmt/glusterd/src/glusterd-peer-utils.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/mgmt/glusterd/src/glusterd-peer-utils.c</a></td><td class='right'>1058</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 6.8%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 93.2%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/mgmt/glusterd/src/glusterd-peer-utils.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/mgmt/glusterd/src/glusterd-peer-utils.h</a></td><td class='right'>82</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.5%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/xlators/mgmt/glusterd/src/glusterd-pmap.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/mgmt/glusterd/src/glusterd-pmap.c</a></td><td class='right'>858</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 3.5%;'/><td class='rem' style='width: 2.0%;'/><td class='none' style='width: 94.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/xlators/mgmt/glusterd/src/glusterd-pmap.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/mgmt/glusterd/src/glusterd-pmap.h</a></td><td class='right'>80</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.3%;'/><td class='none' style='width: 99.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/mgmt/glusterd/src/glusterd-proc-mgmt.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/mgmt/glusterd/src/glusterd-proc-mgmt.c</a></td><td class='right'>152</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/mgmt/glusterd/src/glusterd-proc-mgmt.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/mgmt/glusterd/src/glusterd-proc-mgmt.h</a></td><td class='right'>44</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/mgmt/glusterd/src/glusterd-quota.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/mgmt/glusterd/src/glusterd-quota.c</a></td><td class='right'>2259</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 14.5%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 85.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/mgmt/glusterd/src/glusterd-quota.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/mgmt/glusterd/src/glusterd-quota.h</a></td><td class='right'>17</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/mgmt/glusterd/src/glusterd-quotad-svc.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/mgmt/glusterd/src/glusterd-quotad-svc.c</a></td><td class='right'>217</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 98.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/mgmt/glusterd/src/glusterd-quotad-svc.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/mgmt/glusterd/src/glusterd-quotad-svc.h</a></td><td class='right'>31</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/mgmt/glusterd/src/glusterd-rcu.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/mgmt/glusterd/src/glusterd-rcu.h</a></td><td class='right'>36</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/mgmt/glusterd/src/glusterd-rebalance.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/mgmt/glusterd/src/glusterd-rebalance.c</a></td><td class='right'>1422</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 9.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 90.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/mgmt/glusterd/src/glusterd-replace-brick.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/mgmt/glusterd/src/glusterd-replace-brick.c</a></td><td class='right'>716</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 4.6%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 95.4%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/mgmt/glusterd/src/glusterd-reset-brick.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/mgmt/glusterd/src/glusterd-reset-brick.c</a></td><td class='right'>376</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 2.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 97.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/mgmt/glusterd/src/glusterd-rpc-ops.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/mgmt/glusterd/src/glusterd-rpc-ops.c</a></td><td class='right'>2448</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 15.8%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 84.2%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/mgmt/glusterd/src/glusterd-scrub-svc.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/mgmt/glusterd/src/glusterd-scrub-svc.c</a></td><td class='right'>207</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 98.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/mgmt/glusterd/src/glusterd-scrub-svc.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/mgmt/glusterd/src/glusterd-scrub-svc.h</a></td><td class='right'>45</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/mgmt/glusterd/src/glusterd-server-quorum.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/mgmt/glusterd/src/glusterd-server-quorum.c</a></td><td class='right'>486</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 3.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 96.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/mgmt/glusterd/src/glusterd-server-quorum.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/mgmt/glusterd/src/glusterd-server-quorum.h</a></td><td class='right'>46</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/mgmt/glusterd/src/glusterd-shd-svc-helper.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/mgmt/glusterd/src/glusterd-shd-svc-helper.c</a></td><td class='right'>153</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/mgmt/glusterd/src/glusterd-shd-svc-helper.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/mgmt/glusterd/src/glusterd-shd-svc-helper.h</a></td><td class='right'>42</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/mgmt/glusterd/src/glusterd-shd-svc.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/mgmt/glusterd/src/glusterd-shd-svc.c</a></td><td class='right'>796</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 5.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 94.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/mgmt/glusterd/src/glusterd-shd-svc.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/mgmt/glusterd/src/glusterd-shd-svc.h</a></td><td class='right'>45</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/xlators/mgmt/glusterd/src/glusterd-sm.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/mgmt/glusterd/src/glusterd-sm.c</a></td><td class='right'>1927</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 9.2%;'/><td class='rem' style='width: 3.2%;'/><td class='none' style='width: 87.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/xlators/mgmt/glusterd/src/glusterd-sm.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/mgmt/glusterd/src/glusterd-sm.h</a></td><td class='right'>259</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.0%;'/><td class='rem' style='width: 0.6%;'/><td class='none' style='width: 98.3%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/mgmt/glusterd/src/glusterd-snapd-svc-helper.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/mgmt/glusterd/src/glusterd-snapd-svc-helper.c</a></td><td class='right'>75</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.5%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/mgmt/glusterd/src/glusterd-snapd-svc-helper.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/mgmt/glusterd/src/glusterd-snapd-svc-helper.h</a></td><td class='right'>32</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/mgmt/glusterd/src/glusterd-snapd-svc.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/mgmt/glusterd/src/glusterd-snapd-svc.c</a></td><td class='right'>478</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 3.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 96.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/mgmt/glusterd/src/glusterd-snapd-svc.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/mgmt/glusterd/src/glusterd-snapd-svc.h</a></td><td class='right'>42</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/mgmt/glusterd/src/glusterd-snapshot-utils.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/mgmt/glusterd/src/glusterd-snapshot-utils.c</a></td><td class='right'>4290</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 27.6%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 72.4%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/mgmt/glusterd/src/glusterd-snapshot-utils.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/mgmt/glusterd/src/glusterd-snapshot-utils.h</a></td><td class='right'>169</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 98.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/mgmt/glusterd/src/glusterd-snapshot.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/mgmt/glusterd/src/glusterd-snapshot.c</a></td><td class='right'>10087</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 64.9%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 35.1%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/mgmt/glusterd/src/glusterd-statedump.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/mgmt/glusterd/src/glusterd-statedump.c</a></td><td class='right'>243</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.6%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 98.4%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/mgmt/glusterd/src/glusterd-statedump.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/mgmt/glusterd/src/glusterd-statedump.h</a></td><td class='right'>18</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/xlators/mgmt/glusterd/src/glusterd-store.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/mgmt/glusterd/src/glusterd-store.c</a></td><td class='right'>5693</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 30.2%;'/><td class='rem' style='width: 6.4%;'/><td class='none' style='width: 63.4%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/xlators/mgmt/glusterd/src/glusterd-store.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/mgmt/glusterd/src/glusterd-store.h</a></td><td class='right'>248</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.1%;'/><td class='rem' style='width: 0.5%;'/><td class='none' style='width: 98.4%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/mgmt/glusterd/src/glusterd-svc-helper.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/mgmt/glusterd/src/glusterd-svc-helper.c</a></td><td class='right'>1047</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 6.7%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 93.3%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/mgmt/glusterd/src/glusterd-svc-helper.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/mgmt/glusterd/src/glusterd-svc-helper.h</a></td><td class='right'>72</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.5%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/mgmt/glusterd/src/glusterd-svc-mgmt.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/mgmt/glusterd/src/glusterd-svc-mgmt.c</a></td><td class='right'>536</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 3.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 96.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/mgmt/glusterd/src/glusterd-svc-mgmt.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/mgmt/glusterd/src/glusterd-svc-mgmt.h</a></td><td class='right'>112</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.7%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.3%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/mgmt/glusterd/src/glusterd-syncop.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/mgmt/glusterd/src/glusterd-syncop.c</a></td><td class='right'>2043</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 13.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 86.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/mgmt/glusterd/src/glusterd-syncop.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/mgmt/glusterd/src/glusterd-syncop.h</a></td><td class='right'>93</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.6%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.4%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/mgmt/glusterd/src/glusterd-tierd-svc-helper.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/mgmt/glusterd/src/glusterd-tierd-svc-helper.c</a></td><td class='right'>207</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 98.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/xlators/mgmt/glusterd/src/glusterd-utils.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/mgmt/glusterd/src/glusterd-utils.c</a></td><td class='right'>15542</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 93.0%;'/><td class='rem' style='width: 7.0%;'/><td class='none' style='width: 0.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/xlators/mgmt/glusterd/src/glusterd-utils.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/mgmt/glusterd/src/glusterd-utils.h</a></td><td class='right'>866</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 5.1%;'/><td class='rem' style='width: 0.5%;'/><td class='none' style='width: 94.4%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/xlators/mgmt/glusterd/src/glusterd-volgen.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/mgmt/glusterd/src/glusterd-volgen.c</a></td><td class='right'>7752</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 40.0%;'/><td class='rem' style='width: 9.9%;'/><td class='none' style='width: 50.1%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/xlators/mgmt/glusterd/src/glusterd-volgen.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/mgmt/glusterd/src/glusterd-volgen.h</a></td><td class='right'>458</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 2.1%;'/><td class='rem' style='width: 0.8%;'/><td class='none' style='width: 97.1%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/mgmt/glusterd/src/glusterd-volume-ops.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/mgmt/glusterd/src/glusterd-volume-ops.c</a></td><td class='right'>3033</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 19.5%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 80.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/mgmt/glusterd/src/glusterd-volume-set.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/mgmt/glusterd/src/glusterd-volume-set.c</a></td><td class='right'>3146</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 20.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 79.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/xlators/mgmt/glusterd/src/glusterd.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/mgmt/glusterd/src/glusterd.c</a></td><td class='right'>2468</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 13.7%;'/><td class='rem' style='width: 2.1%;'/><td class='none' style='width: 84.1%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/xlators/mgmt/glusterd/src/glusterd.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/mgmt/glusterd/src/glusterd.h</a></td><td class='right'>1441</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 7.8%;'/><td class='rem' style='width: 1.4%;'/><td class='none' style='width: 90.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/xlators/mgmt/glusterd/src/glusterd3_1-mops.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/mgmt/glusterd/src/glusterd3_1-mops.c</a></td><td class='right'>1317</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 8.5%;'/><td class='none' style='width: 91.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/xlators/mount/fuse/src/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/mount/fuse/src/Makefile.am</a></td><td class='right'>28</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/xlators/mount/fuse/src/fuse-bridge.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/mount/fuse/src/fuse-bridge.c</a></td><td class='right'>9015</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 40.4%;'/><td class='rem' style='width: 17.6%;'/><td class='none' style='width: 42.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/xlators/mount/fuse/src/fuse-bridge.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/mount/fuse/src/fuse-bridge.h</a></td><td class='right'>713</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 3.1%;'/><td class='rem' style='width: 1.5%;'/><td class='none' style='width: 95.4%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/xlators/mount/fuse/src/fuse-helpers.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/mount/fuse/src/fuse-helpers.c</a></td><td class='right'>896</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 3.8%;'/><td class='rem' style='width: 1.9%;'/><td class='none' style='width: 94.2%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/xlators/mount/fuse/src/fuse-mem-types.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/mount/fuse/src/fuse-mem-types.h</a></td><td class='right'>42</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.1%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/xlators/mount/fuse/src/fuse-resolve.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/mount/fuse/src/fuse-resolve.c</a></td><td class='right'>1172</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 3.5%;'/><td class='rem' style='width: 4.1%;'/><td class='none' style='width: 92.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/xlators/mount/fuse/utils/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/mount/fuse/utils/Makefile.am</a></td><td class='right'>9</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='upd'><a href='/cgit/glusterfs.git/diff/xlators/mount/fuse/utils/mount.glusterfs.in?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/mount/fuse/utils/mount.glusterfs.in</a></td><td class='right'>891</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 4.8%;'/><td class='rem' style='width: 1.0%;'/><td class='none' style='width: 94.3%;'/></tr></table></td></tr>
<tr><td class='mode'>-rwxr-xr-x</td><td class='upd'><a href='/cgit/glusterfs.git/diff/xlators/mount/fuse/utils/mount_glusterfs.in?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/mount/fuse/utils/mount_glusterfs.in</a></td><td class='right'>626</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 3.2%;'/><td class='rem' style='width: 0.9%;'/><td class='none' style='width: 96.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/xlators/nfs/lib/src/auth-null.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/nfs/lib/src/auth-null.c</a></td><td class='right'>72</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.5%;'/><td class='none' style='width: 99.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/xlators/nfs/lib/src/auth-unix.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/nfs/lib/src/auth-unix.c</a></td><td class='right'>92</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.6%;'/><td class='none' style='width: 99.4%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/xlators/nfs/lib/src/msg-nfs3.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/nfs/lib/src/msg-nfs3.c</a></td><td class='right'>554</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 3.6%;'/><td class='none' style='width: 96.4%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/xlators/nfs/lib/src/msg-nfs3.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/nfs/lib/src/msg-nfs3.h</a></td><td class='right'>186</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 1.2%;'/><td class='none' style='width: 98.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/xlators/nfs/lib/src/rpc-socket.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/nfs/lib/src/rpc-socket.c</a></td><td class='right'>360</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 2.3%;'/><td class='none' style='width: 97.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/xlators/nfs/lib/src/rpc-socket.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/nfs/lib/src/rpc-socket.h</a></td><td class='right'>65</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.4%;'/><td class='none' style='width: 99.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/xlators/nfs/lib/src/rpcsvc-auth.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/nfs/lib/src/rpcsvc-auth.c</a></td><td class='right'>400</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 2.6%;'/><td class='none' style='width: 97.4%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/xlators/nfs/lib/src/rpcsvc.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/nfs/lib/src/rpcsvc.c</a></td><td class='right'>2803</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 18.0%;'/><td class='none' style='width: 82.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/xlators/nfs/lib/src/rpcsvc.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/nfs/lib/src/rpcsvc.h</a></td><td class='right'>732</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 4.7%;'/><td class='none' style='width: 95.3%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/xlators/nfs/lib/src/xdr-common.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/nfs/lib/src/xdr-common.h</a></td><td class='right'>48</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.3%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/xlators/nfs/lib/src/xdr-nfs3.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/nfs/lib/src/xdr-nfs3.c</a></td><td class='right'>1897</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 12.2%;'/><td class='none' style='width: 87.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/xlators/nfs/lib/src/xdr-nfs3.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/nfs/lib/src/xdr-nfs3.h</a></td><td class='right'>1206</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 7.8%;'/><td class='none' style='width: 92.2%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/xlators/nfs/lib/src/xdr-rpc.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/nfs/lib/src/xdr-rpc.c</a></td><td class='right'>229</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 1.5%;'/><td class='none' style='width: 98.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/xlators/nfs/lib/src/xdr-rpc.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/nfs/lib/src/xdr-rpc.h</a></td><td class='right'>82</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.5%;'/><td class='none' style='width: 99.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/xlators/nfs/server/src/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/nfs/server/src/Makefile.am</a></td><td class='right'>41</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.1%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/nfs/server/src/acl3.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/nfs/server/src/acl3.c</a></td><td class='right'>933</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 6.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 94.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/nfs/server/src/acl3.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/nfs/server/src/acl3.h</a></td><td class='right'>42</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/nfs/server/src/auth-cache.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/nfs/server/src/auth-cache.c</a></td><td class='right'>496</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 3.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 96.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/nfs/server/src/auth-cache.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/nfs/server/src/auth-cache.h</a></td><td class='right'>52</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/nfs/server/src/exports.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/nfs/server/src/exports.c</a></td><td class='right'>1484</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 9.5%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 90.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/nfs/server/src/exports.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/nfs/server/src/exports.h</a></td><td class='right'>93</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.6%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.4%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/nfs/server/src/mount3-auth.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/nfs/server/src/mount3-auth.c</a></td><td class='right'>642</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 4.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 95.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/nfs/server/src/mount3-auth.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/nfs/server/src/mount3-auth.h</a></td><td class='right'>59</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/xlators/nfs/server/src/mount3.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/nfs/server/src/mount3.c</a></td><td class='right'>4953</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 24.7%;'/><td class='rem' style='width: 7.2%;'/><td class='none' style='width: 68.1%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/xlators/nfs/server/src/mount3.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/nfs/server/src/mount3.h</a></td><td class='right'>208</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.9%;'/><td class='rem' style='width: 0.4%;'/><td class='none' style='width: 98.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/nfs/server/src/mount3udp_svc.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/nfs/server/src/mount3udp_svc.c</a></td><td class='right'>238</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.5%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 98.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/nfs/server/src/netgroups.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/nfs/server/src/netgroups.c</a></td><td class='right'>1161</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 7.5%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 92.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/nfs/server/src/netgroups.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/nfs/server/src/netgroups.h</a></td><td class='right'>53</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/xlators/nfs/server/src/nfs-common.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/nfs/server/src/nfs-common.c</a></td><td class='right'>602</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 2.1%;'/><td class='rem' style='width: 1.7%;'/><td class='none' style='width: 96.1%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/xlators/nfs/server/src/nfs-common.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/nfs/server/src/nfs-common.h</a></td><td class='right'>77</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.3%;'/><td class='none' style='width: 99.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/xlators/nfs/server/src/nfs-fops.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/nfs/server/src/nfs-fops.c</a></td><td class='right'>2121</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 7.9%;'/><td class='rem' style='width: 5.8%;'/><td class='none' style='width: 86.4%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/xlators/nfs/server/src/nfs-fops.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/nfs/server/src/nfs-fops.h</a></td><td class='right'>317</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.0%;'/><td class='rem' style='width: 1.0%;'/><td class='none' style='width: 98.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/xlators/nfs/server/src/nfs-generics.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/nfs/server/src/nfs-generics.c</a></td><td class='right'>355</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.1%;'/><td class='rem' style='width: 1.2%;'/><td class='none' style='width: 97.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/xlators/nfs/server/src/nfs-generics.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/nfs/server/src/nfs-generics.h</a></td><td class='right'>171</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.6%;'/><td class='rem' style='width: 0.5%;'/><td class='none' style='width: 98.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/xlators/nfs/server/src/nfs-inodes.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/nfs/server/src/nfs-inodes.c</a></td><td class='right'>761</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 2.5%;'/><td class='rem' style='width: 2.4%;'/><td class='none' style='width: 95.1%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/xlators/nfs/server/src/nfs-inodes.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/nfs/server/src/nfs-inodes.h</a></td><td class='right'>84</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.3%;'/><td class='none' style='width: 99.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/xlators/nfs/server/src/nfs-mem-types.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/nfs/server/src/nfs-mem-types.h</a></td><td class='right'>73</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.2%;'/><td class='none' style='width: 99.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/nfs/server/src/nfs-messages.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/nfs/server/src/nfs-messages.h</a></td><td class='right'>102</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.7%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.3%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/xlators/nfs/server/src/nfs.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/nfs/server/src/nfs.c</a></td><td class='right'>2485</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 12.3%;'/><td class='rem' style='width: 3.7%;'/><td class='none' style='width: 84.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/xlators/nfs/server/src/nfs.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/nfs/server/src/nfs.h</a></td><td class='right'>164</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.7%;'/><td class='rem' style='width: 0.3%;'/><td class='none' style='width: 98.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/xlators/nfs/server/src/nfs3-fh.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/nfs/server/src/nfs3-fh.c</a></td><td class='right'>352</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.8%;'/><td class='rem' style='width: 1.5%;'/><td class='none' style='width: 97.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/xlators/nfs/server/src/nfs3-fh.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/nfs/server/src/nfs3-fh.h</a></td><td class='right'>131</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.4%;'/><td class='rem' style='width: 0.4%;'/><td class='none' style='width: 99.2%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/xlators/nfs/server/src/nfs3-helpers.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/nfs/server/src/nfs3-helpers.c</a></td><td class='right'>5459</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 20.2%;'/><td class='rem' style='width: 14.9%;'/><td class='none' style='width: 64.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/xlators/nfs/server/src/nfs3-helpers.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/nfs/server/src/nfs3-helpers.h</a></td><td class='right'>300</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.9%;'/><td class='rem' style='width: 1.0%;'/><td class='none' style='width: 98.1%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/xlators/nfs/server/src/nfs3.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/nfs/server/src/nfs3.c</a></td><td class='right'>8709</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 30.3%;'/><td class='rem' style='width: 25.7%;'/><td class='none' style='width: 44.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/xlators/nfs/server/src/nfs3.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/nfs/server/src/nfs3.h</a></td><td class='right'>387</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.5%;'/><td class='rem' style='width: 1.0%;'/><td class='none' style='width: 97.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/nfs/server/src/nfsserver.sym?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/nfs/server/src/nfsserver.sym</a></td><td class='right'>12</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/nfs/server/src/nlm4.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/nfs/server/src/nlm4.c</a></td><td class='right'>2786</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 17.9%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 82.1%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/nfs/server/src/nlm4.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/nfs/server/src/nlm4.h</a></td><td class='right'>111</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.7%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.3%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/nfs/server/src/nlmcbk_svc.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/nfs/server/src/nlmcbk_svc.c</a></td><td class='right'>134</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.9%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.1%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/xlators/performance/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/performance/Makefile.am</a></td><td class='right'>3</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 100.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/xlators/performance/io-cache/src/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/performance/io-cache/src/Makefile.am</a></td><td class='right'>11</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/performance/io-cache/src/io-cache-messages.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/performance/io-cache/src/io-cache-messages.h</a></td><td class='right'>69</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/xlators/performance/io-cache/src/io-cache.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/performance/io-cache/src/io-cache.c</a></td><td class='right'>3042</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 11.4%;'/><td class='rem' style='width: 8.1%;'/><td class='none' style='width: 80.4%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/xlators/performance/io-cache/src/io-cache.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/performance/io-cache/src/io-cache.h</a></td><td class='right'>440</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.3%;'/><td class='rem' style='width: 1.5%;'/><td class='none' style='width: 97.2%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/xlators/performance/io-cache/src/ioc-inode.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/performance/io-cache/src/ioc-inode.c</a></td><td class='right'>319</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.1%;'/><td class='rem' style='width: 1.0%;'/><td class='none' style='width: 97.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/xlators/performance/io-cache/src/ioc-mem-types.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/performance/io-cache/src/ioc-mem-types.h</a></td><td class='right'>47</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.2%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/xlators/performance/io-cache/src/page.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/performance/io-cache/src/page.c</a></td><td class='right'>1547</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 5.4%;'/><td class='rem' style='width: 4.5%;'/><td class='none' style='width: 90.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/xlators/performance/io-threads/src/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/performance/io-threads/src/Makefile.am</a></td><td class='right'>10</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/performance/io-threads/src/io-threads-messages.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/performance/io-threads/src/io-threads-messages.h</a></td><td class='right'>41</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/xlators/performance/io-threads/src/io-threads.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/performance/io-threads/src/io-threads.c</a></td><td class='right'>3031</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 7.7%;'/><td class='rem' style='width: 11.8%;'/><td class='none' style='width: 80.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/xlators/performance/io-threads/src/io-threads.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/performance/io-threads/src/io-threads.h</a></td><td class='right'>113</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.4%;'/><td class='rem' style='width: 0.3%;'/><td class='none' style='width: 99.3%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/xlators/performance/io-threads/src/iot-mem-types.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/performance/io-threads/src/iot-mem-types.h</a></td><td class='right'>30</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.1%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/performance/md-cache/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/performance/md-cache/Makefile.am</a></td><td class='right'>1</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 100.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/performance/md-cache/src/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/performance/md-cache/src/Makefile.am</a></td><td class='right'>29</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/performance/md-cache/src/md-cache-mem-types.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/performance/md-cache/src/md-cache-mem-types.h</a></td><td class='right'>23</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/performance/md-cache/src/md-cache-messages.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/performance/md-cache/src/md-cache-messages.h</a></td><td class='right'>29</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/performance/md-cache/src/md-cache.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/performance/md-cache/src/md-cache.c</a></td><td class='right'>4020</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 25.9%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 74.1%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/performance/nl-cache/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/performance/nl-cache/Makefile.am</a></td><td class='right'>3</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 100.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/performance/nl-cache/src/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/performance/nl-cache/src/Makefile.am</a></td><td class='right'>12</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/performance/nl-cache/src/nl-cache-helper.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/performance/nl-cache/src/nl-cache-helper.c</a></td><td class='right'>1201</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 7.7%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 92.3%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/performance/nl-cache/src/nl-cache-mem-types.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/performance/nl-cache/src/nl-cache-mem-types.h</a></td><td class='right'>27</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/performance/nl-cache/src/nl-cache-messages.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/performance/nl-cache/src/nl-cache-messages.h</a></td><td class='right'>29</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/performance/nl-cache/src/nl-cache.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/performance/nl-cache/src/nl-cache.c</a></td><td class='right'>840</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 5.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 94.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/performance/nl-cache/src/nl-cache.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/performance/nl-cache/src/nl-cache.h</a></td><td class='right'>175</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 98.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/performance/open-behind/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/performance/open-behind/Makefile.am</a></td><td class='right'>1</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 100.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/performance/open-behind/src/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/performance/open-behind/src/Makefile.am</a></td><td class='right'>16</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/performance/open-behind/src/open-behind-mem-types.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/performance/open-behind/src/open-behind-mem-types.h</a></td><td class='right'>22</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/performance/open-behind/src/open-behind-messages.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/performance/open-behind/src/open-behind-messages.h</a></td><td class='right'>32</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/performance/open-behind/src/open-behind.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/performance/open-behind/src/open-behind.c</a></td><td class='right'>1101</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 7.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 92.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/xlators/performance/quick-read/src/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/performance/quick-read/src/Makefile.am</a></td><td class='right'>10</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/xlators/performance/quick-read/src/quick-read-mem-types.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/performance/quick-read/src/quick-read-mem-types.h</a></td><td class='right'>38</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.2%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/performance/quick-read/src/quick-read-messages.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/performance/quick-read/src/quick-read-messages.h</a></td><td class='right'>31</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/xlators/performance/quick-read/src/quick-read.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/performance/quick-read/src/quick-read.c</a></td><td class='right'>3612</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 8.3%;'/><td class='rem' style='width: 15.0%;'/><td class='none' style='width: 76.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/xlators/performance/quick-read/src/quick-read.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/performance/quick-read/src/quick-read.h</a></td><td class='right'>135</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.5%;'/><td class='none' style='width: 99.1%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/xlators/performance/read-ahead/src/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/performance/read-ahead/src/Makefile.am</a></td><td class='right'>10</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/xlators/performance/read-ahead/src/page.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/performance/read-ahead/src/page.c</a></td><td class='right'>871</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 3.0%;'/><td class='rem' style='width: 2.6%;'/><td class='none' style='width: 94.4%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/xlators/performance/read-ahead/src/read-ahead-mem-types.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/performance/read-ahead/src/read-ahead-mem-types.h</a></td><td class='right'>40</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.2%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/performance/read-ahead/src/read-ahead-messages.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/performance/read-ahead/src/read-ahead-messages.h</a></td><td class='right'>31</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/xlators/performance/read-ahead/src/read-ahead.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/performance/read-ahead/src/read-ahead.c</a></td><td class='right'>1825</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 6.8%;'/><td class='rem' style='width: 4.9%;'/><td class='none' style='width: 88.3%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/xlators/performance/read-ahead/src/read-ahead.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/performance/read-ahead/src/read-ahead.h</a></td><td class='right'>200</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.6%;'/><td class='rem' style='width: 0.7%;'/><td class='none' style='width: 98.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/performance/readdir-ahead/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/performance/readdir-ahead/Makefile.am</a></td><td class='right'>3</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 100.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/performance/readdir-ahead/src/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/performance/readdir-ahead/src/Makefile.am</a></td><td class='right'>18</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/performance/readdir-ahead/src/readdir-ahead-mem-types.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/performance/readdir-ahead/src/readdir-ahead-mem-types.h</a></td><td class='right'>24</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/performance/readdir-ahead/src/readdir-ahead-messages.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/performance/readdir-ahead/src/readdir-ahead-messages.h</a></td><td class='right'>30</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/performance/readdir-ahead/src/readdir-ahead.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/performance/readdir-ahead/src/readdir-ahead.c</a></td><td class='right'>1382</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 8.9%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 91.1%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/performance/readdir-ahead/src/readdir-ahead.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/performance/readdir-ahead/src/readdir-ahead.h</a></td><td class='right'>98</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.6%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.4%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/xlators/performance/stat-prefetch/src/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/performance/stat-prefetch/src/Makefile.am</a></td><td class='right'>14</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.1%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/xlators/performance/stat-prefetch/src/stat-prefetch-mem-types.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/performance/stat-prefetch/src/stat-prefetch-mem-types.h</a></td><td class='right'>37</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.2%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/xlators/performance/stat-prefetch/src/stat-prefetch.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/performance/stat-prefetch/src/stat-prefetch.c</a></td><td class='right'>3726</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 24.0%;'/><td class='none' style='width: 76.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/xlators/performance/stat-prefetch/src/stat-prefetch.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/performance/stat-prefetch/src/stat-prefetch.h</a></td><td class='right'>106</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.7%;'/><td class='none' style='width: 99.3%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/xlators/performance/symlink-cache/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/performance/symlink-cache/Makefile.am</a></td><td class='right'>3</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 100.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/xlators/performance/symlink-cache/src/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/performance/symlink-cache/src/Makefile.am</a></td><td class='right'>12</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.1%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/xlators/performance/symlink-cache/src/symlink-cache.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/performance/symlink-cache/src/symlink-cache.c</a></td><td class='right'>407</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 2.6%;'/><td class='none' style='width: 97.4%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/xlators/performance/write-behind/src/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/performance/write-behind/src/Makefile.am</a></td><td class='right'>10</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/xlators/performance/write-behind/src/write-behind-mem-types.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/performance/write-behind/src/write-behind-mem-types.h</a></td><td class='right'>37</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.2%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/performance/write-behind/src/write-behind-messages.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/performance/write-behind/src/write-behind-messages.h</a></td><td class='right'>31</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/xlators/performance/write-behind/src/write-behind.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/performance/write-behind/src/write-behind.c</a></td><td class='right'>5010</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 17.7%;'/><td class='rem' style='width: 14.5%;'/><td class='none' style='width: 67.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/playground/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/playground/Makefile.am</a></td><td class='right'>2</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 100.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='mov'><a href='/cgit/glusterfs.git/diff/xlators/playground/rot-13/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/playground/rot-13/Makefile.am</a> (renamed from mod_glusterfs/apache/1.3/Makefile.am)</td><td class='right'>0</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 100.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='mov'><a href='/cgit/glusterfs.git/diff/xlators/playground/rot-13/src/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/playground/rot-13/src/Makefile.am</a> (renamed from xlators/encryption/rot-13/src/Makefile.am)</td><td class='right'>8</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/playground/rot-13/src/rot-13.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/playground/rot-13/src/rot-13.c</a></td><td class='right'>166</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 98.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/playground/rot-13/src/rot-13.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/playground/rot-13/src/rot-13.h</a></td><td class='right'>18</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/playground/template/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/playground/template/Makefile.am</a></td><td class='right'>2</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 100.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/playground/template/src/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/playground/template/src/Makefile.am</a></td><td class='right'>17</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/playground/template/src/template.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/playground/template/src/template.c</a></td><td class='right'>186</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 98.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/playground/template/src/template.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/playground/template/src/template.h</a></td><td class='right'>43</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/xlators/protocol/auth/addr/src/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/protocol/auth/addr/src/Makefile.am</a></td><td class='right'>11</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/xlators/protocol/auth/addr/src/addr.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/protocol/auth/addr/src/addr.c</a></td><td class='right'>522</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 2.0%;'/><td class='rem' style='width: 1.3%;'/><td class='none' style='width: 96.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/xlators/protocol/auth/login/src/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/protocol/auth/login/src/Makefile.am</a></td><td class='right'>10</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/xlators/protocol/auth/login/src/login.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/protocol/auth/login/src/login.c</a></td><td class='right'>296</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.3%;'/><td class='rem' style='width: 0.6%;'/><td class='none' style='width: 98.1%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/xlators/protocol/client/src/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/protocol/client/src/Makefile.am</a></td><td class='right'>18</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/xlators/protocol/client/src/client-callback.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/protocol/client/src/client-callback.c</a></td><td class='right'>330</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.9%;'/><td class='rem' style='width: 0.3%;'/><td class='none' style='width: 97.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/protocol/client/src/client-common.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/protocol/client/src/client-common.c</a></td><td class='right'>3589</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 23.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 76.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/protocol/client/src/client-common.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/protocol/client/src/client-common.h</a></td><td class='right'>630</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 4.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 95.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/xlators/protocol/client/src/client-handshake.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/protocol/client/src/client-handshake.c</a></td><td class='right'>1961</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 7.9%;'/><td class='rem' style='width: 4.7%;'/><td class='none' style='width: 87.4%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/xlators/protocol/client/src/client-helpers.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/protocol/client/src/client-helpers.c</a></td><td class='right'>951</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 5.3%;'/><td class='rem' style='width: 0.9%;'/><td class='none' style='width: 93.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/protocol/client/src/client-lk.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/protocol/client/src/client-lk.c</a></td><td class='right'>515</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 3.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 96.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/xlators/protocol/client/src/client-mem-types.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/protocol/client/src/client-mem-types.h</a></td><td class='right'>37</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.1%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/protocol/client/src/client-messages.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/protocol/client/src/client-messages.h</a></td><td class='right'>174</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 98.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/protocol/client/src/client-rpc-fops.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/protocol/client/src/client-rpc-fops.c</a></td><td class='right'>6079</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 39.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 60.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/protocol/client/src/client-rpc-fops_v2.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/protocol/client/src/client-rpc-fops_v2.c</a></td><td class='right'>6177</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 39.7%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 60.3%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/xlators/protocol/client/src/client.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/protocol/client/src/client.c</a></td><td class='right'>4009</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 16.1%;'/><td class='rem' style='width: 9.7%;'/><td class='none' style='width: 74.2%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/xlators/protocol/client/src/client.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/protocol/client/src/client.h</a></td><td class='right'>459</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 2.3%;'/><td class='rem' style='width: 0.7%;'/><td class='none' style='width: 97.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/xlators/protocol/client/src/client3_1-fops.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/protocol/client/src/client3_1-fops.c</a></td><td class='right'>4987</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 32.1%;'/><td class='none' style='width: 67.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/xlators/protocol/legacy/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/protocol/legacy/Makefile.am</a></td><td class='right'>3</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 100.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/xlators/protocol/legacy/client/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/protocol/legacy/client/Makefile.am</a></td><td class='right'>3</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 100.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/xlators/protocol/legacy/client/src/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/protocol/legacy/client/src/Makefile.am</a></td><td class='right'>21</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.1%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/xlators/protocol/legacy/client/src/client-mem-types.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/protocol/legacy/client/src/client-mem-types.h</a></td><td class='right'>43</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.3%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/xlators/protocol/legacy/client/src/client-protocol.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/protocol/legacy/client/src/client-protocol.c</a></td><td class='right'>6673</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 42.9%;'/><td class='none' style='width: 57.1%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/xlators/protocol/legacy/client/src/client-protocol.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/protocol/legacy/client/src/client-protocol.h</a></td><td class='right'>178</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 1.1%;'/><td class='none' style='width: 98.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/xlators/protocol/legacy/client/src/saved-frames.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/protocol/legacy/client/src/saved-frames.c</a></td><td class='right'>196</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 1.3%;'/><td class='none' style='width: 98.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/xlators/protocol/legacy/client/src/saved-frames.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/protocol/legacy/client/src/saved-frames.h</a></td><td class='right'>79</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.5%;'/><td class='none' style='width: 99.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/xlators/protocol/legacy/lib/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/protocol/legacy/lib/Makefile.am</a></td><td class='right'>3</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 100.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/xlators/protocol/legacy/lib/src/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/protocol/legacy/lib/src/Makefile.am</a></td><td class='right'>14</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.1%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/xlators/protocol/legacy/lib/src/protocol.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/protocol/legacy/lib/src/protocol.c</a></td><td class='right'>108</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.7%;'/><td class='none' style='width: 99.3%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/xlators/protocol/legacy/lib/src/protocol.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/protocol/legacy/lib/src/protocol.h</a></td><td class='right'>1118</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 7.2%;'/><td class='none' style='width: 92.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/xlators/protocol/legacy/lib/src/transport.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/protocol/legacy/lib/src/transport.c</a></td><td class='right'>422</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 2.7%;'/><td class='none' style='width: 97.3%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/xlators/protocol/legacy/lib/src/transport.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/protocol/legacy/lib/src/transport.h</a></td><td class='right'>106</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.7%;'/><td class='none' style='width: 99.3%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/xlators/protocol/legacy/server/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/protocol/legacy/server/Makefile.am</a></td><td class='right'>3</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 100.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/xlators/protocol/legacy/server/src/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/protocol/legacy/server/src/Makefile.am</a></td><td class='right'>27</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.2%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/xlators/protocol/legacy/server/src/authenticate.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/protocol/legacy/server/src/authenticate.c</a></td><td class='right'>249</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 1.6%;'/><td class='none' style='width: 98.4%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/xlators/protocol/legacy/server/src/authenticate.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/protocol/legacy/server/src/authenticate.h</a></td><td class='right'>60</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.4%;'/><td class='none' style='width: 99.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/xlators/protocol/legacy/server/src/server-helpers.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/protocol/legacy/server/src/server-helpers.c</a></td><td class='right'>622</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 4.0%;'/><td class='none' style='width: 96.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/xlators/protocol/legacy/server/src/server-helpers.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/protocol/legacy/server/src/server-helpers.h</a></td><td class='right'>48</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.3%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/xlators/protocol/legacy/server/src/server-mem-types.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/protocol/legacy/server/src/server-mem-types.h</a></td><td class='right'>39</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.3%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/xlators/protocol/legacy/server/src/server-protocol.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/protocol/legacy/server/src/server-protocol.c</a></td><td class='right'>6587</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 42.4%;'/><td class='none' style='width: 57.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/xlators/protocol/legacy/server/src/server-protocol.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/protocol/legacy/server/src/server-protocol.h</a></td><td class='right'>191</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 1.2%;'/><td class='none' style='width: 98.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/xlators/protocol/legacy/server/src/server-resolve.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/protocol/legacy/server/src/server-resolve.c</a></td><td class='right'>658</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 4.2%;'/><td class='none' style='width: 95.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/xlators/protocol/legacy/transport/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/protocol/legacy/transport/Makefile.am</a></td><td class='right'>3</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 100.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/xlators/protocol/legacy/transport/ib-verbs/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/protocol/legacy/transport/ib-verbs/Makefile.am</a></td><td class='right'>1</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 100.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/xlators/protocol/legacy/transport/ib-verbs/src/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/protocol/legacy/transport/ib-verbs/src/Makefile.am</a></td><td class='right'>19</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.1%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/xlators/protocol/legacy/transport/ib-verbs/src/ib-verbs-mem-types.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/protocol/legacy/transport/ib-verbs/src/ib-verbs-mem-types.h</a></td><td class='right'>39</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.3%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/xlators/protocol/legacy/transport/ib-verbs/src/ib-verbs.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/protocol/legacy/transport/ib-verbs/src/ib-verbs.c</a></td><td class='right'>2625</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 16.9%;'/><td class='none' style='width: 83.1%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/xlators/protocol/legacy/transport/ib-verbs/src/ib-verbs.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/protocol/legacy/transport/ib-verbs/src/ib-verbs.h</a></td><td class='right'>220</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 1.4%;'/><td class='none' style='width: 98.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/xlators/protocol/legacy/transport/ib-verbs/src/name.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/protocol/legacy/transport/ib-verbs/src/name.c</a></td><td class='right'>712</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 4.6%;'/><td class='none' style='width: 95.4%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/xlators/protocol/legacy/transport/ib-verbs/src/name.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/protocol/legacy/transport/ib-verbs/src/name.h</a></td><td class='right'>47</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.3%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/xlators/protocol/legacy/transport/socket/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/protocol/legacy/transport/socket/Makefile.am</a></td><td class='right'>1</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 100.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/xlators/protocol/legacy/transport/socket/src/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/protocol/legacy/transport/socket/src/Makefile.am</a></td><td class='right'>19</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.1%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/xlators/protocol/legacy/transport/socket/src/name.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/protocol/legacy/transport/socket/src/name.c</a></td><td class='right'>740</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 4.8%;'/><td class='none' style='width: 95.2%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/xlators/protocol/legacy/transport/socket/src/name.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/protocol/legacy/transport/socket/src/name.h</a></td><td class='right'>44</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.3%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/xlators/protocol/legacy/transport/socket/src/socket-mem-types.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/protocol/legacy/transport/socket/src/socket-mem-types.h</a></td><td class='right'>36</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.2%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/xlators/protocol/legacy/transport/socket/src/socket.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/protocol/legacy/transport/socket/src/socket.c</a></td><td class='right'>1622</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 10.4%;'/><td class='none' style='width: 89.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/xlators/protocol/legacy/transport/socket/src/socket.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/protocol/legacy/transport/socket/src/socket.h</a></td><td class='right'>129</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.8%;'/><td class='none' style='width: 99.2%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/xlators/protocol/server/src/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/protocol/server/src/Makefile.am</a></td><td class='right'>31</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.1%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/xlators/protocol/server/src/authenticate.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/protocol/server/src/authenticate.c</a></td><td class='right'>395</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.2%;'/><td class='rem' style='width: 1.3%;'/><td class='none' style='width: 97.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/xlators/protocol/server/src/authenticate.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/protocol/server/src/authenticate.h</a></td><td class='right'>58</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.2%;'/><td class='none' style='width: 99.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/protocol/server/src/server-common.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/protocol/server/src/server-common.c</a></td><td class='right'>842</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 5.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 94.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/protocol/server/src/server-common.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/protocol/server/src/server-common.h</a></td><td class='right'>199</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 98.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/xlators/protocol/server/src/server-handshake.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/protocol/server/src/server-handshake.c</a></td><td class='right'>1299</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 4.6%;'/><td class='rem' style='width: 3.7%;'/><td class='none' style='width: 91.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/xlators/protocol/server/src/server-helpers.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/protocol/server/src/server-helpers.c</a></td><td class='right'>2300</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 8.1%;'/><td class='rem' style='width: 6.7%;'/><td class='none' style='width: 85.2%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/xlators/protocol/server/src/server-helpers.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/protocol/server/src/server-helpers.h</a></td><td class='right'>129</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.5%;'/><td class='rem' style='width: 0.3%;'/><td class='none' style='width: 99.2%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/xlators/protocol/server/src/server-mem-types.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/protocol/server/src/server-mem-types.h</a></td><td class='right'>43</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.2%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/protocol/server/src/server-messages.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/protocol/server/src/server-messages.h</a></td><td class='right'>168</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 98.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/xlators/protocol/server/src/server-resolve.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/protocol/server/src/server-resolve.c</a></td><td class='right'>987</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 3.4%;'/><td class='rem' style='width: 3.0%;'/><td class='none' style='width: 93.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/protocol/server/src/server-rpc-fops.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/protocol/server/src/server-rpc-fops.c</a></td><td class='right'>6084</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 39.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 60.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/protocol/server/src/server-rpc-fops_v2.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/protocol/server/src/server-rpc-fops_v2.c</a></td><td class='right'>6031</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 38.8%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 61.2%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/xlators/protocol/server/src/server.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/protocol/server/src/server.c</a></td><td class='right'>2225</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 11.1%;'/><td class='rem' style='width: 3.3%;'/><td class='none' style='width: 85.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/xlators/protocol/server/src/server.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/protocol/server/src/server.h</a></td><td class='right'>331</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.1%;'/><td class='rem' style='width: 1.0%;'/><td class='none' style='width: 97.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/xlators/protocol/server/src/server3_1-fops.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/protocol/server/src/server3_1-fops.c</a></td><td class='right'>5086</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 32.7%;'/><td class='none' style='width: 67.3%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/xlators/storage/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/storage/Makefile.am</a></td><td class='right'>2</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 100.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/xlators/storage/bdb/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/storage/bdb/Makefile.am</a></td><td class='right'>3</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 100.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/xlators/storage/bdb/src/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/storage/bdb/src/Makefile.am</a></td><td class='right'>18</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.1%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/xlators/storage/bdb/src/bctx.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/storage/bdb/src/bctx.c</a></td><td class='right'>341</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 2.2%;'/><td class='none' style='width: 97.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/xlators/storage/bdb/src/bdb-ll.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/storage/bdb/src/bdb-ll.c</a></td><td class='right'>1464</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 9.4%;'/><td class='none' style='width: 90.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/xlators/storage/bdb/src/bdb-mem-types.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/storage/bdb/src/bdb-mem-types.h</a></td><td class='right'>42</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.3%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/xlators/storage/bdb/src/bdb.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/storage/bdb/src/bdb.c</a></td><td class='right'>3603</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 23.2%;'/><td class='none' style='width: 76.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='del'><a href='/cgit/glusterfs.git/diff/xlators/storage/bdb/src/bdb.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/storage/bdb/src/bdb.h</a></td><td class='right'>530</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 3.4%;'/><td class='none' style='width: 96.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/xlators/storage/posix/src/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/storage/posix/src/Makefile.am</a></td><td class='right'>25</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.1%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/storage/posix/src/posix-aio.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/storage/posix/src/posix-aio.c</a></td><td class='right'>556</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 3.6%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 96.4%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/storage/posix/src/posix-aio.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/storage/posix/src/posix-aio.h</a></td><td class='right'>34</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/storage/posix/src/posix-common.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/storage/posix/src/posix-common.c</a></td><td class='right'>1524</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 9.8%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 90.2%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/storage/posix/src/posix-entry-ops.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/storage/posix/src/posix-entry-ops.c</a></td><td class='right'>2496</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 16.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 83.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/storage/posix/src/posix-gfid-path.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/storage/posix/src/posix-gfid-path.c</a></td><td class='right'>243</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.6%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 98.4%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/storage/posix/src/posix-gfid-path.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/storage/posix/src/posix-gfid-path.h</a></td><td class='right'>28</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/storage/posix/src/posix-handle.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/storage/posix/src/posix-handle.c</a></td><td class='right'>1020</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 6.6%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 93.4%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/storage/posix/src/posix-handle.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/storage/posix/src/posix-handle.h</a></td><td class='right'>221</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 98.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/storage/posix/src/posix-helpers.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/storage/posix/src/posix-helpers.c</a></td><td class='right'>3666</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 23.6%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 76.4%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/storage/posix/src/posix-inode-fd-ops.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/storage/posix/src/posix-inode-fd-ops.c</a></td><td class='right'>6004</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 38.6%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 61.4%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/storage/posix/src/posix-inode-handle.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/storage/posix/src/posix-inode-handle.h</a></td><td class='right'>118</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.8%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.2%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/xlators/storage/posix/src/posix-mem-types.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/storage/posix/src/posix-mem-types.h</a></td><td class='right'>39</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.2%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/storage/posix/src/posix-messages.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/storage/posix/src/posix-messages.h</a></td><td class='right'>74</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.5%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/storage/posix/src/posix-metadata-disk.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/storage/posix/src/posix-metadata-disk.h</a></td><td class='right'>31</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/storage/posix/src/posix-metadata.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/storage/posix/src/posix-metadata.c</a></td><td class='right'>916</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 5.9%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 94.1%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/storage/posix/src/posix-metadata.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/storage/posix/src/posix-metadata.h</a></td><td class='right'>71</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.5%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/xlators/storage/posix/src/posix.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/storage/posix/src/posix.c</a></td><td class='right'>4723</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.5%;'/><td class='rem' style='width: 29.9%;'/><td class='none' style='width: 69.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/cgit/glusterfs.git/diff/xlators/storage/posix/src/posix.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/storage/posix/src/posix.h</a></td><td class='right'>708</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 4.0%;'/><td class='rem' style='width: 0.6%;'/><td class='none' style='width: 95.4%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/system/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/system/Makefile.am</a></td><td class='right'>1</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 100.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/system/posix-acl/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/system/posix-acl/Makefile.am</a></td><td class='right'>1</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 100.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/system/posix-acl/src/Makefile.am?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/system/posix-acl/src/Makefile.am</a></td><td class='right'>28</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/system/posix-acl/src/posix-acl-mem-types.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/system/posix-acl/src/posix-acl-mem-types.h</a></td><td class='right'>23</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/system/posix-acl/src/posix-acl-messages.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/system/posix-acl/src/posix-acl-messages.h</a></td><td class='right'>28</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/system/posix-acl/src/posix-acl-xattr.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/system/posix-acl/src/posix-acl-xattr.c</a></td><td class='right'>173</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 98.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/system/posix-acl/src/posix-acl-xattr.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/system/posix-acl/src/posix-acl-xattr.h</a></td><td class='right'>29</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/system/posix-acl/src/posix-acl.c?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/system/posix-acl/src/posix-acl.c</a></td><td class='right'>2246</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 14.5%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 85.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/system/posix-acl/src/posix-acl.h?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/system/posix-acl/src/posix-acl.h</a></td><td class='right'>35</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit/glusterfs.git/diff/xlators/xlator.sym?id2=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/xlator.sym</a></td><td class='right'>1</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 100.0%;'/></tr></table></td></tr>
</table><div class='diffstat-summary'>2580 files changed, 702550 insertions, 273328 deletions</div><table summary='diff' class='diff'><tr><td><div class='head'>diff --git a/.clang-format b/.clang-format<br/>new file mode 100644<br/>index 00000000000..84c2efe3fad<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/.clang-format?id=d1d7a6f35c816822fab51c820e25023863c239c1'>.clang-format</a></div><div class='hunk'>@@ -0,0 +1,107 @@</div><div class='add'>+---</div><div class='add'>+Language:        Cpp</div><div class='add'>+# BasedOnStyle:  Chromium</div><div class='add'>+AccessModifierOffset: -1</div><div class='add'>+AlignAfterOpenBracket: Align</div><div class='add'>+AlignConsecutiveAssignments: false</div><div class='add'>+AlignConsecutiveDeclarations: false</div><div class='add'>+AlignEscapedNewlines: Right</div><div class='add'>+AlignOperands:   true</div><div class='add'>+AlignTrailingComments: true</div><div class='add'>+AllowAllParametersOfDeclarationOnNextLine: false</div><div class='add'>+AllowShortBlocksOnASingleLine: false</div><div class='add'>+AllowShortCaseLabelsOnASingleLine: false</div><div class='add'>+AllowShortFunctionsOnASingleLine: Inline</div><div class='add'>+AllowShortIfStatementsOnASingleLine: false</div><div class='add'>+AllowShortLoopsOnASingleLine: false</div><div class='add'>+AlwaysBreakAfterDefinitionReturnType: All</div><div class='add'>+AlwaysBreakAfterReturnType: All</div><div class='add'>+AlwaysBreakBeforeMultilineStrings: true</div><div class='add'>+AlwaysBreakTemplateDeclarations: true</div><div class='add'>+BinPackArguments: true</div><div class='add'>+BinPackParameters: true</div><div class='add'>+BraceWrapping:</div><div class='add'>+  AfterClass:      false</div><div class='add'>+  AfterControlStatement: false</div><div class='add'>+  AfterEnum:       false</div><div class='add'>+  AfterFunction:   true</div><div class='add'>+  AfterNamespace:  false</div><div class='add'>+  AfterObjCDeclaration: false</div><div class='add'>+  AfterStruct:     false</div><div class='add'>+  AfterUnion:      false</div><div class='add'>+  BeforeCatch:     false</div><div class='add'>+  BeforeElse:      false</div><div class='add'>+  IndentBraces:    false</div><div class='add'>+  SplitEmptyFunction: true</div><div class='add'>+  SplitEmptyRecord: true</div><div class='add'>+  SplitEmptyNamespace: true</div><div class='add'>+BreakBeforeBinaryOperators: None</div><div class='add'>+BreakBeforeBraces: Linux</div><div class='add'>+BreakBeforeInheritanceComma: false</div><div class='add'>+BreakBeforeTernaryOperators: true</div><div class='add'>+BreakConstructorInitializersBeforeComma: false</div><div class='add'>+BreakConstructorInitializers: BeforeColon</div><div class='add'>+BreakAfterJavaFieldAnnotations: false</div><div class='add'>+BreakStringLiterals: true</div><div class='add'>+ColumnLimit:     80</div><div class='add'>+CommentPragmas:  '^ IWYU pragma:'</div><div class='add'>+CompactNamespaces: false</div><div class='add'>+ConstructorInitializerAllOnOneLineOrOnePerLine: true</div><div class='add'>+ConstructorInitializerIndentWidth: 4</div><div class='add'>+ContinuationIndentWidth: 4</div><div class='add'>+Cpp11BracedListStyle: true</div><div class='add'>+DerivePointerAlignment: false</div><div class='add'>+DisableFormat:   false</div><div class='add'>+ExperimentalAutoDetectBinPacking: false</div><div class='add'>+FixNamespaceComments: true</div><div class='add'>+ForEachMacros:</div><div class='add'>+  - foreach</div><div class='add'>+  - Q_FOREACH</div><div class='add'>+  - BOOST_FOREACH</div><div class='add'>+IncludeCategories:</div><div class='add'>+  - Regex:           '^&lt;.*\.h&gt;'</div><div class='add'>+    Priority:        1</div><div class='add'>+  - Regex:           '^&lt;.*'</div><div class='add'>+    Priority:        2</div><div class='add'>+  - Regex:           '.*'</div><div class='add'>+    Priority:        3</div><div class='add'>+IncludeIsMainRegex: '([-_](test|unittest))?$'</div><div class='add'>+IndentCaseLabels: true</div><div class='add'>+IndentWidth:     4</div><div class='add'>+IndentWrappedFunctionNames: false</div><div class='add'>+JavaScriptQuotes: Leave</div><div class='add'>+JavaScriptWrapImports: true</div><div class='add'>+KeepEmptyLinesAtTheStartOfBlocks: false</div><div class='add'>+MacroBlockBegin: ''</div><div class='add'>+MacroBlockEnd:   ''</div><div class='add'>+MaxEmptyLinesToKeep: 1</div><div class='add'>+NamespaceIndentation: None</div><div class='add'>+ObjCBlockIndentWidth: 2</div><div class='add'>+ObjCSpaceAfterProperty: false</div><div class='add'>+ObjCSpaceBeforeProtocolList: false</div><div class='add'>+PenaltyBreakAssignment: 200</div><div class='add'>+PenaltyBreakBeforeFirstCallParameter: 1</div><div class='add'>+PenaltyBreakComment: 300</div><div class='add'>+PenaltyBreakFirstLessLess: 120</div><div class='add'>+PenaltyBreakString: 1000</div><div class='add'>+PenaltyExcessCharacter: 1000000</div><div class='add'>+PenaltyReturnTypeOnItsOwnLine: 200</div><div class='add'>+PointerAlignment: Right</div><div class='add'>+ReflowComments:  true</div><div class='add'>+SortIncludes:    false</div><div class='add'>+SortUsingDeclarations: true</div><div class='add'>+SpaceAfterCStyleCast: false</div><div class='add'>+SpaceAfterTemplateKeyword: true</div><div class='add'>+SpaceBeforeAssignmentOperators: true</div><div class='add'>+SpaceBeforeParens: ControlStatements</div><div class='add'>+SpaceInEmptyParentheses: false</div><div class='add'>+SpacesBeforeTrailingComments: 2</div><div class='add'>+SpacesInAngles:  false</div><div class='add'>+SpacesInContainerLiterals: true</div><div class='add'>+SpacesInCStyleCastParentheses: false</div><div class='add'>+SpacesInParentheses: false</div><div class='add'>+SpacesInSquareBrackets: false</div><div class='add'>+Standard:        Auto</div><div class='add'>+TabWidth:        8</div><div class='add'>+UseTab:          Never</div><div class='add'>+...</div><div class='head'>diff --git a/.github/ISSUE_TEMPLATE b/.github/ISSUE_TEMPLATE<br/>new file mode 100644<br/>index 00000000000..386ed2d8dd5<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/.github/ISSUE_TEMPLATE?id=d1d7a6f35c816822fab51c820e25023863c239c1'>.github/ISSUE_TEMPLATE</a></div><div class='hunk'>@@ -0,0 +1,30 @@</div><div class='add'>+&lt;!-- Please use this template while reporting an issue, providing as much information as possible. Failure to do so may result in a delayed response. Thank you! --&gt;</div><div class='add'>+</div><div class='add'>+**Description of problem:**</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+**The exact command to reproduce the issue**:</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+**The full output of the command that failed**:</div><div class='add'>+&lt;details&gt;</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+&lt;/details&gt;</div><div class='add'>+</div><div class='add'>+**Expected results:**</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+**Additional info:**</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+**- The output of the `gluster volume info` command**:</div><div class='add'>+&lt;details&gt;</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+&lt;/details&gt;</div><div class='add'>+</div><div class='add'>+**- The operating system / glusterfs version**:</div><div class='add'>+</div><div class='head'>diff --git a/.github/PULL_REQUEST_TEMPLATE b/.github/PULL_REQUEST_TEMPLATE<br/>new file mode 100644<br/>index 00000000000..e69de29bb2d<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/.github/PULL_REQUEST_TEMPLATE?id=d1d7a6f35c816822fab51c820e25023863c239c1'>.github/PULL_REQUEST_TEMPLATE</a></div><div class='head'>diff --git a/.github/RELEASE_TRACKER_TEMPLATE b/.github/RELEASE_TRACKER_TEMPLATE<br/>new file mode 100644<br/>index 00000000000..502bbd5556c<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/.github/RELEASE_TRACKER_TEMPLATE?id=d1d7a6f35c816822fab51c820e25023863c239c1'>.github/RELEASE_TRACKER_TEMPLATE</a></div><div class='hunk'>@@ -0,0 +1,12 @@</div><div class='add'>+&lt;!-- Please use this template while creating a tracker issue --&gt;</div><div class='add'>+</div><div class='add'>+**Description of problem:**</div><div class='add'>+A tracker issue to track the issues that will be fixed as a part of this release</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+**Major or minor release**:</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+**Release version**:</div><div class='add'>+</div><div class='add'>+</div><div class='head'>diff --git a/.github/stale.yml b/.github/stale.yml<br/>new file mode 100644<br/>index 00000000000..460e327c6ea<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/.github/stale.yml?id=d1d7a6f35c816822fab51c820e25023863c239c1'>.github/stale.yml</a></div><div class='hunk'>@@ -0,0 +1,25 @@</div><div class='add'>+# Number of days of inactivity before an issue becomes stale</div><div class='add'>+daysUntilStale: 210</div><div class='add'>+# Number of days of inactivity before a stale issue is closed</div><div class='add'>+daysUntilClose: 15</div><div class='add'>+# Issues with these labels will never be considered stale</div><div class='add'>+exemptLabels:</div><div class='add'>+  - pinned</div><div class='add'>+  - security</div><div class='add'>+# Label to use when marking an issue as stale</div><div class='add'>+staleLabel: wontfix</div><div class='add'>+</div><div class='add'>+# Comment to post when marking an issue as stale. Set to `false` to disable</div><div class='add'>+markComment: &gt;</div><div class='add'>+  Thank you for your contributions.</div><div class='add'>+</div><div class='add'>+  Noticed that this issue is not having any activity in last ~6 months! We</div><div class='add'>+  are marking this issue as stale because it has not had recent activity.</div><div class='add'>+</div><div class='add'>+  It will be closed in 2 weeks if no one responds with a comment here.</div><div class='add'>+  </div><div class='add'>+</div><div class='add'>+# Comment to post when closing a stale issue. Set to `false` to disable</div><div class='add'>+closeComment: &gt;</div><div class='add'>+  Closing this issue as there was no update since my last update on issue.</div><div class='add'>+  If this is an issue which is still valid, feel free to open it.</div><div class='head'>diff --git a/.gitignore b/.gitignore<br/>index c5371b26436..fc5ba586f8e 100644<br/>--- a/<a href='/cgit/glusterfs.git/tree/.gitignore?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>.gitignore</a><br/>+++ b/<a href='/cgit/glusterfs.git/tree/.gitignore?id=d1d7a6f35c816822fab51c820e25023863c239c1'>.gitignore</a></div><div class='hunk'>@@ -3,31 +3,123 @@ autom4te.cache</div><div class='ctx'> build</div><div class='ctx'> config.*</div><div class='ctx'> configure</div><div class='add'>+cscope.*</div><div class='add'>+tags</div><div class='ctx'> depcomp</div><div class='add'>+INSTALL</div><div class='ctx'> install-sh</div><div class='ctx'> ltmain.sh</div><div class='add'>+Makefile</div><div class='ctx'> Makefile.in</div><div class='ctx'> missing</div><div class='add'>+stamp-h1</div><div class='add'>+stamp-h2</div><div class='add'>+test-driver</div><div class='add'>+*compile</div><div class='add'>+*.gcda</div><div class='add'>+*.gcno</div><div class='ctx'> *.sw?</div><div class='ctx'> *~</div><div class='del'>-*lo</div><div class='del'>-*la</div><div class='del'>-*o</div><div class='add'>+*.lo</div><div class='add'>+*.la</div><div class='add'>+*.o</div><div class='add'>+*.tar.gz</div><div class='add'>+*.rpm</div><div class='add'>+*.diff</div><div class='add'>+*.patch</div><div class='ctx'> .libs</div><div class='del'>-Makefile</div><div class='del'>-stamp-h1</div><div class='add'>+.deps</div><div class='add'>+.dirstamp</div><div class='add'>+</div><div class='add'>+# Softlinks to test and log</div><div class='add'>+log</div><div class='add'>+*.vol</div><div class='add'>+.clang-format</div><div class='add'>+</div><div class='add'>+# cmocka unit tests</div><div class='add'>+*.log</div><div class='add'>+*.trs</div><div class='add'>+*_unittest</div><div class='ctx'> </div><div class='ctx'> # Generated files</div><div class='del'>-extras/init.d/glusterfs-server.plist</div><div class='del'>-extras/init.d/glusterfsd-Debian</div><div class='del'>-extras/init.d/glusterfsd-Redhat</div><div class='del'>-extras/init.d/glusterfsd-SuSE</div><div class='add'>+site.h</div><div class='add'>+*.py[co]</div><div class='add'>+api/examples/__init__.py</div><div class='add'>+api/examples/setup.py</div><div class='add'>+api/src/gfapi.map</div><div class='add'>+cli/src/gluster</div><div class='add'>+contrib/fuse-util/fusermount-glusterfs</div><div class='add'>+extras/geo-rep/gsync-sync-gfid</div><div class='add'>+extras/geo-rep/schedule_georep.py</div><div class='add'>+extras/snap_scheduler/conf.py</div><div class='add'>+extras/init.d/glusterd-Debian</div><div class='add'>+extras/init.d/glusterd-FreeBSD</div><div class='add'>+extras/init.d/glusterd-Redhat</div><div class='add'>+extras/init.d/glusterd-SuSE</div><div class='add'>+extras/init.d/glusterd.plist</div><div class='add'>+extras/ocf/glusterd</div><div class='add'>+extras/ocf/volume</div><div class='add'>+extras/run-gluster.tmpfiles</div><div class='add'>+extras/systemd/glusterd.service</div><div class='add'>+extras/systemd/gluster-ta-volume.service</div><div class='add'>+extras/systemd/glusterfssharedstorage.service</div><div class='add'>+extras/who-wrote-glusterfs/gitdm</div><div class='add'>+geo-replication/.tox</div><div class='add'>+geo-replication/gsyncd.conf</div><div class='add'>+geo-replication/src/gsyncd</div><div class='add'>+geo-replication/src/peer_gsec_create</div><div class='add'>+geo-replication/src/peer_mountbroker</div><div class='add'>+geo-replication/src/peer_mountbroker.py</div><div class='add'>+geo-replication/src/set_geo_rep_pem_keys.sh</div><div class='add'>+geo-replication/src/peer_georep-sshkey.py</div><div class='add'>+geo-replication/syncdaemon.egg-info</div><div class='add'>+geo-replication/syncdaemon/conf.py</div><div class='add'>+geo-replication/tests/unit/.coverage</div><div class='add'>+geo-replication/tests/unit/cover</div><div class='add'>+geo-replication/tests/unit/coverage.xml</div><div class='add'>+geo-replication/tests/unit/nosetests.xml</div><div class='add'>+geo-replication/tests/unit/results.html</div><div class='add'>+glusterfs-api.pc</div><div class='ctx'> glusterfs.spec</div><div class='del'>-libtool</div><div class='del'>-xlators/mount/fuse/utils/mount.glusterfs</div><div class='del'>-xlators/mount/fuse/utils/mount_glusterfs</div><div class='del'>-argp-standalone/libargp.a</div><div class='add'>+glusterfsd/src/glusterd</div><div class='add'>+glusterfsd/src/glusterfs</div><div class='ctx'> glusterfsd/src/glusterfsd</div><div class='del'>-libglusterfs/src/spec.lex.c</div><div class='add'>+glusterfsd/src/gf_attach</div><div class='add'>+heal/src/glfsheal</div><div class='add'>+libgfchangelog.pc</div><div class='add'>+libglusterfs/src/graph.lex.c</div><div class='ctx'> libglusterfs/src/y.tab.c</div><div class='ctx'> libglusterfs/src/y.tab.h</div><div class='add'>+libglusterfs/src/defaults.c</div><div class='add'>+libglusterfs/src/cli1-xdr.h</div><div class='add'>+libglusterfs/src/protocol-common.h</div><div class='add'>+libtool</div><div class='add'>+# copied XDR for cyclic libglusterfs &lt;-&gt; rpc-header dependency</div><div class='add'>+run-tests.sh</div><div class='add'>+!tests/basic/fuse/Makefile</div><div class='add'>+!tests/basic/gfapi/Makefile</div><div class='add'>+tests/env.rc</div><div class='add'>+tests/utils/arequal-checksum</div><div class='add'>+xlators/features/glupy/src/__init__.py</div><div class='add'>+xlators/features/glupy/src/setup.py</div><div class='add'>+xlators/mount/fuse/utils/mount.glusterfs</div><div class='add'>+xlators/mount/fuse/utils/mount_glusterfs</div><div class='add'>+extras/peer_add_secret_pub</div><div class='add'>+tools/gfind_missing_files/gcrawler</div><div class='add'>+tools/glusterfind/glusterfind</div><div class='add'>+tools/glusterfind/src/tool.conf</div><div class='add'>+# Eventing</div><div class='add'>+events/src/eventsapiconf.py</div><div class='add'>+extras/systemd/glustereventsd.service</div><div class='add'>+events/src/eventtypes.py</div><div class='add'>+libglusterfs/src/eventtypes.h</div><div class='add'>+extras/init.d/glustereventsd-Debian</div><div class='add'>+extras/init.d/glustereventsd-FreeBSD</div><div class='add'>+extras/init.d/glustereventsd-Redhat</div><div class='add'>+tools/setgfid2path/src/gluster-setgfid2path</div><div class='add'>+xlators/features/cloudsync/src/cloudsync-autogen-fops.c</div><div class='add'>+xlators/features/cloudsync/src/cloudsync-autogen-fops.h</div><div class='add'>+xlators/features/utime/src/utime-autogen-fops.c</div><div class='add'>+xlators/features/utime/src/utime-autogen-fops.h</div><div class='add'>+tests/basic/metadisp/ftruncate</div><div class='add'>+xlators/features/metadisp/src/fops.c</div><div class='head'>diff --git a/.mailmap b/.mailmap<br/>new file mode 100644<br/>index 00000000000..141a1667ffa<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/.mailmap?id=d1d7a6f35c816822fab51c820e25023863c239c1'>.mailmap</a></div><div class='hunk'>@@ -0,0 +1,43 @@</div><div class='add'>+# .mailmap, see 'git short-log --help' for details</div><div class='add'>+#</div><div class='add'>+# This file needs to match extras/who-wrote-glusterfs/gitdm.aliases.</div><div class='add'>+#</div><div class='add'>+# Listing of contributors that filed patches with different email addresses.</div><div class='add'>+# Format: &lt;name&gt; &lt;main-email&gt; &lt;alias&gt; [&lt;alias&gt; ...]</div><div class='add'>+#</div><div class='add'>+</div><div class='add'>+Amar Tumballi &lt;amarts@redhat.com&gt; &lt;amar@gluster.com&gt; &lt;amar@del.gluster.com&gt;</div><div class='add'>+Anand Avati &lt;avati@redhat.com&gt; &lt;avati@gluster.com&gt; &lt;avati@dev.gluster.com&gt; &lt;avati@amp.gluster.com&gt; &lt;avati@blackhole.gluster.com&gt;</div><div class='add'>+Anush Shetty &lt;ashetty@redhat.com&gt; &lt;anush@gluster.com&gt;</div><div class='add'>+Csaba Henk &lt;csaba@redhat.com&gt; &lt;csaba@gluster.com&gt; &lt;csaba@lowlife.hu&gt; &lt;csaba@zresearch.com&gt;</div><div class='add'>+GÃ¼nther Deschner &lt;gd@redhat.com&gt; &lt;gd@samba.org&gt;</div><div class='add'>+Harshavardhana &lt;fharshav@redhat.com&gt; &lt;harsha@gluster.com&gt; &lt;harsha@zresearch.com&gt; &lt;harsha@dev.gluster.com&gt; &lt;harsha@harshavardhana.net&gt;</div><div class='add'>+Ji-Hyeon Gim &lt;potatogim@gluesys.com&gt; &lt;potatogim@potatogim.net&gt;</div><div class='add'>+Justin Clift &lt;justin@gluster.org&gt; &lt;jclift@redhat.com&gt;</div><div class='add'>+Kaleb S. KEITHLEY &lt;kkeithle@redhat.com&gt; &lt;kkeithle@f16node1.kkeithle.usersys.redhat.com&gt; &lt;kkeithle@linux.keithley.org&gt;</div><div class='add'>+Kaushal M &lt;kaushal@redhat.com&gt; &lt;kaushal@gluster.com&gt;</div><div class='add'>+Kaushik BV &lt;kbudiger@redhat.com&gt; &lt;kaushikbv@gluster.com&gt;</div><div class='add'>+Krishna Srinivas &lt;ksriniva@redhat.com&gt; &lt;krishna@gluster.com&gt; &lt;krishna@zresearch.com&gt; &lt;krishna@guest-laptop&gt;</div><div class='add'>+Krishnan Parthasarathi &lt;kparthas@redhat.com&gt; &lt;kp@gluster.com&gt;</div><div class='add'>+Louis Zuckerman &lt;louiszuckerman@gmail.com&gt; &lt;me@louiszuckerman.com&gt;</div><div class='add'>+M S Vishwanath Bhat &lt;vbhat@redhat.com&gt; &lt;msvbhat@gmail.com&gt; &lt;vishwanath@gluster.com&gt;</div><div class='add'>+Michael Adam &lt;madam@redhat.com&gt; &lt;obnox@samba.org&gt;</div><div class='add'>+Oleksandr Natalenko &lt;oleksandr@natalenko.name&gt; &lt;o.natalenko@lanet.ua&gt;</div><div class='add'>+Patrick Uiterwijk &lt;puiterwijk@fedoraproject.org&gt; &lt;patrick@puiterwijk.org&gt;</div><div class='add'>+Pavan Sondur &lt;pavan@gluster.com&gt; &lt;pavan@dev.gluster.com&gt;</div><div class='add'>+Pete Zaitcev &lt;zaitcev@kotori.zaitcev.us&gt; &lt;zaitcev@yahoo.com&gt;</div><div class='add'>+Pranith Kumar K &lt;pkarampu@redhat.com&gt; &lt;pranithk@gluster.com&gt;</div><div class='add'>+Prashanth Pai &lt;ppai@redhat.com&gt; &lt;nullpai@gmail.com&gt;</div><div class='add'>+Raghavendra Bhat &lt;raghavendra@redhat.com&gt; &lt;raghavendrabhat@gluster.com&gt;</div><div class='add'>+Raghavendra G &lt;rgowdapp@redhat.com&gt; &lt;raghavendra@gluster.com&gt; &lt;raghavendra@zresearch.com&gt;</div><div class='add'>+Rahul C S &lt;rahulcs@redhat.com&gt; &lt;rahulcssjce@gmail.com&gt;</div><div class='add'>+Rajesh Amaravathi &lt;rajesh@redhat.com&gt; &lt;rajesh@gluster.com&gt; &lt;rajesh.amaravathi@gmail.com&gt;</div><div class='add'>+Ravishankar N &lt;ravishankar@redhat.com&gt; &lt;root@ravi2.(none)&gt;</div><div class='add'>+Sakshi Bansal &lt;sabansal@redhat.com&gt; &lt;sabansal@localhost.localdomain&gt;</div><div class='add'>+Shehjar Tikoo &lt;shehjart@gluster.com&gt; &lt;shehjart@zresearch.com&gt;</div><div class='add'>+Venky Shankar &lt;vshankar@redhat.com&gt; &lt;venky@gluster.com&gt;</div><div class='add'>+Vijay Bellur &lt;vbellur@redhat.com&gt; &lt;vijay@gluster.com&gt; &lt;vijay@dev.gluster.com&gt;</div><div class='add'>+Vijaykumar Koppad &lt;vkoppad@redhat.com&gt; &lt;vijaykumar.koppad@gmail.com&gt;</div><div class='add'>+Vijaikumar Mallikarjuna &lt;vmallika@redhat.com&gt;</div><div class='add'>+Vikas Gorur &lt;vikas@gluster.com&gt; &lt;vikas@zresearch.com&gt;</div><div class='add'>+shishir gowda &lt;sgowda@redhat.com&gt; &lt;shishirng@gluster.com&gt;</div><div class='head'>diff --git a/.testignore b/.testignore<br/>new file mode 100644<br/>index 00000000000..fe8f838bf2b<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/.testignore?id=d1d7a6f35c816822fab51c820e25023863c239c1'>.testignore</a></div><div class='hunk'>@@ -0,0 +1,64 @@</div><div class='add'>+.github/ISSUE_TEMPLATE</div><div class='add'>+.github/PULL_REQUEST_TEMPLATE</div><div class='add'>+.github/stale.yml</div><div class='add'>+.gitignore</div><div class='add'>+.mailmap</div><div class='add'>+.testignore</div><div class='add'>+.clang-format</div><div class='add'>+rfc.sh</div><div class='add'>+submit-for-review.sh</div><div class='add'>+AUTHORS</div><div class='add'>+CONTRIBUTING.md</div><div class='add'>+COPYING-GPLV2</div><div class='add'>+COPYING-LGPLV3</div><div class='add'>+ChangeLog</div><div class='add'>+INSTALL</div><div class='add'>+MAINTAINERS</div><div class='add'>+NEWS</div><div class='add'>+README.md</div><div class='add'>+THANKS</div><div class='add'>+COMMITMENT</div><div class='add'>+api/examples/README</div><div class='add'>+api/examples/getvolfile.py</div><div class='add'>+api/src/README.Symbol_Versions</div><div class='add'>+build-aux/checkpatch.pl</div><div class='add'>+contrib/fuse-lib/COPYING.LIB</div><div class='add'>+contrib/fuse-util/COPYING</div><div class='add'>+contrib/macfuse/COPYING.txt</div><div class='add'>+doc/*</div><div class='add'>+extras/FreeBSD/README.FreeBSD</div><div class='add'>+extras/Solaris/README.solaris</div><div class='add'>+extras/Ubuntu/README.Ubuntu</div><div class='add'>+extras/benchmarking/README</div><div class='add'>+extras/cliutils/README.md</div><div class='add'>+extras/command-completion/README</div><div class='add'>+extras/create_new_xlator/README.md</div><div class='add'>+extras/glusterfs.vim</div><div class='add'>+extras/glusterfs-logrotate</div><div class='add'>+extras/glusterfs-georep-logrotate</div><div class='add'>+extras/init.d/glusterd-Debian.in</div><div class='add'>+extras/init.d/glusterd-FreeBSD.in</div><div class='add'>+extras/init.d/glusterd-Redhat.in</div><div class='add'>+extras/init.d/glusterd-SuSE.in</div><div class='add'>+extras/init.d/glusterd.plist.in</div><div class='add'>+extras/init.d/glustereventsd-Debian.in</div><div class='add'>+extras/init.d/glustereventsd-FreeBSD.in</div><div class='add'>+extras/init.d/glustereventsd-Redhat.in</div><div class='add'>+extras/init.d/rhel5-load-fuse.modules</div><div class='add'>+extras/logger.conf.example</div><div class='add'>+extras/snap_scheduler/README.md</div><div class='add'>+extras/test/ld-preload-test/README</div><div class='add'>+extras/who-wrote-glusterfs/*</div><div class='add'>+extras/distributed-testing/*</div><div class='add'>+geo-replication/syncdaemon/README.md</div><div class='add'>+geo-replication/test-requirements.txt</div><div class='add'>+rpc/xdr/src/.gitignore</div><div class='add'>+tests/README.md</div><div class='add'>+xlators/experimental/README.md</div><div class='add'>+xlators/experimental/dht2/README.md</div><div class='add'>+xlators/experimental/dht2/TODO.md</div><div class='add'>+xlators/experimental/posix2/README.md</div><div class='add'>+xlators/experimental/posix2/TODO.md</div><div class='add'>+xlators/features/glupy/doc/README.md</div><div class='add'>+xlators/features/glupy/doc/TESTING</div><div class='add'>+xlators/features/glupy/doc/test.vol</div><div class='head'>diff --git a/COMMITMENT b/COMMITMENT<br/>new file mode 100644<br/>index 00000000000..16b75efcf29<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/COMMITMENT?id=d1d7a6f35c816822fab51c820e25023863c239c1'>COMMITMENT</a></div><div class='hunk'>@@ -0,0 +1,46 @@</div><div class='add'>+Common Cure Rights Commitment</div><div class='add'>+Version 1.0</div><div class='add'>+</div><div class='add'>+Before filing or continuing to prosecute any legal proceeding or claim</div><div class='add'>+(other than a Defensive Action) arising from termination of a Covered</div><div class='add'>+License, we commit to extend to the person or entity ('you') accused</div><div class='add'>+of violating the Covered License the following provisions regarding</div><div class='add'>+cure and reinstatement, taken from GPL version 3. As used here, the</div><div class='add'>+term 'this License' refers to the specific Covered License being</div><div class='add'>+enforced.</div><div class='add'>+</div><div class='add'>+    However, if you cease all violation of this License, then your</div><div class='add'>+    license from a particular copyright holder is reinstated (a)</div><div class='add'>+    provisionally, unless and until the copyright holder explicitly</div><div class='add'>+    and finally terminates your license, and (b) permanently, if the</div><div class='add'>+    copyright holder fails to notify you of the violation by some</div><div class='add'>+    reasonable means prior to 60 days after the cessation.</div><div class='add'>+</div><div class='add'>+    Moreover, your license from a particular copyright holder is</div><div class='add'>+    reinstated permanently if the copyright holder notifies you of the</div><div class='add'>+    violation by some reasonable means, this is the first time you</div><div class='add'>+    have received notice of violation of this License (for any work)</div><div class='add'>+    from that copyright holder, and you cure the violation prior to 30</div><div class='add'>+    days after your receipt of the notice.</div><div class='add'>+</div><div class='add'>+We intend this Commitment to be irrevocable, and binding and</div><div class='add'>+enforceable against us and assignees of or successors to our</div><div class='add'>+copyrights.</div><div class='add'>+</div><div class='add'>+Definitions</div><div class='add'>+</div><div class='add'>+'Covered License' means the GNU General Public License, version 2</div><div class='add'>+(GPLv2), the GNU Lesser General Public License, version 2.1</div><div class='add'>+(LGPLv2.1), or the GNU Library General Public License, version 2</div><div class='add'>+(LGPLv2), all as published by the Free Software Foundation.</div><div class='add'>+</div><div class='add'>+'Defensive Action' means a legal proceeding or claim that We bring</div><div class='add'>+against you in response to a prior proceeding or claim initiated by</div><div class='add'>+you or your affiliate.</div><div class='add'>+</div><div class='add'>+'We' means each contributor to this repository as of the date of</div><div class='add'>+inclusion of this file, including subsidiaries of a corporate</div><div class='add'>+contributor.</div><div class='add'>+</div><div class='add'>+This work is available under a Creative Commons Attribution-ShareAlike</div><div class='add'>+4.0 International license (https://creativecommons.org/licenses/by-sa/4.0/).</div><div class='head'>diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md<br/>new file mode 100644<br/>index 00000000000..65fc3497104<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/CONTRIBUTING.md?id=d1d7a6f35c816822fab51c820e25023863c239c1'>CONTRIBUTING.md</a></div><div class='hunk'>@@ -0,0 +1,114 @@</div><div class='add'>+# GlusterFS project Contribution guidelines</div><div class='add'>+</div><div class='add'>+## Development Workflow</div><div class='add'>+</div><div class='add'>+We follow most of the details as per the [document here](https://help.github.com/en/github/collaborating-with-issues-and-pull-requests). If you are not aware of the github workflow, it is recommended to go through them before continuing here.</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+#### Get the Repository setup</div><div class='add'>+</div><div class='add'>+0. Fork Repository</div><div class='add'>+   - Fork [GlusterFS repository](https://github.com/gluster/glusterfs/fork).</div><div class='add'>+</div><div class='add'>+1. Clone Repository</div><div class='add'>+   - Clone the glusterfs repo freshly from github using below steps.</div><div class='add'>+</div><div class='add'>+```</div><div class='add'>+   git clone git@github.com:${username}/glusterfs.git</div><div class='add'>+   cd glusterfs/</div><div class='add'>+   git remote add upstream git@github.com:gluster/glusterfs.git</div><div class='add'>+```</div><div class='add'>+</div><div class='add'>+About two tasks are one time for the life time. You can continue to use the same repository for all the work in future.</div><div class='add'>+</div><div class='add'>+#### Development &amp; Other flows</div><div class='add'>+</div><div class='add'>+0. Issue:</div><div class='add'>+   - Make sure there is an issue filed for the task you are working on.</div><div class='add'>+   - If it is not filed, open the issue with all the description.</div><div class='add'>+   - If it is a bug fix, add label "Type:Bug".</div><div class='add'>+   - If it is an RFC, provide all the documentation, and request for "DocApproved", and "SpecApproved" label.</div><div class='add'>+</div><div class='add'>+1. Code:</div><div class='add'>+   - Start coding</div><div class='add'>+   - Build and test locally</div><div class='add'>+   - Make sure clang-format is installed and is run on the patch.</div><div class='add'>+</div><div class='add'>+2. Keep up-to-date</div><div class='add'>+   - GlusterFS is a large project with many developers, so there would be one or the other patch everyday.</div><div class='add'>+   - It is critical for developer to be up-to-date with `devel` repo to be Conflict-Free when PR is opened.</div><div class='add'>+   - Git provides many options to keep up-to-date, below is one of them</div><div class='add'>+```</div><div class='add'>+   git fetch upstream</div><div class='add'>+   git rebase upstream/devel</div><div class='add'>+```</div><div class='add'>+   - It is recommended you keep pushing to your repo every day, so you don't loose any work.</div><div class='add'>+     - It can be done by `./rfc.sh` (or `git push origin HEAD:issueNNN`)</div><div class='add'>+</div><div class='add'>+2. Commit Message / PR description:</div><div class='add'>+   - The name of the branch on your personal fork can start with issueNNNN, followed by anything of your choice.</div><div class='add'>+   - PRs continue to have the title of format "component: \&lt;title\&gt;", like it is practiced now.</div><div class='add'>+   - When you open a PR, having a reference Issue for the commit is mandatory in GlusterFS.</div><div class='add'>+   - Commit message can have, either `Fixes: #NNNN` or `Updates: #NNNN` in a separate line in the commit message.</div><div class='add'>+     - Here, NNNN is the Issue ID in glusterfs repository.</div><div class='add'>+   - Each commit needs the author to have the "Signed-off-by: Name \&lt;email\&gt;" line.</div><div class='add'>+     - Can do this by `-s` option for `git commit`.</div><div class='add'>+   - If the PR is not ready for review, apply the label `work-in-progress`.</div><div class='add'>+     - Check the availability of "Draft PR" is present for you, if yes, use that instead.</div><div class='add'>+</div><div class='add'>+3. Tests:</div><div class='add'>+   - All the required smoke tests would be auto-triggered.</div><div class='add'>+     - Developers get a chance to retrigger the smoke tests using **"/recheck smoke"** as comment.</div><div class='add'>+   - The "regression" tests would be triggered by a comment **"/run regression"** from developers in the [@gluster-maintainers](https://github.com/orgs/gluster/teams/gluster-maintainers) group.</div><div class='add'>+     - Ask for help as comment in PR if you have any questions about the process!</div><div class='add'>+</div><div class='add'>+4. Review Process:</div><div class='add'>+   - `+2` : is equivalent to "Approve" from the people in the maintainer's group.</div><div class='add'>+   - `+1` : can be given by a maintainer/reviewer by explicitly stating that in the comment.</div><div class='add'>+   - `-1` : provide details on required changes and pick "Request Changes" while submitting your review.</div><div class='add'>+   - `-2` : done by adding the `DO-NOT-MERGE` label.</div><div class='add'>+</div><div class='add'>+   - Any further discussions can happen as comments in the PR.</div><div class='add'>+</div><div class='add'>+5. Making changes:</div><div class='add'>+   - There are 2 approaches to submit changes done after addressing review comments.</div><div class='add'>+     - Commit changes as a new commit on top of the original commits in the branch, and push the changes to same branch (issueNNNN)</div><div class='add'>+     - Commit changes into the same commit with `--amend` option, and do a push to the same branch with `--force` option.</div><div class='add'>+</div><div class='add'>+6. Merging:</div><div class='add'>+   - GlusterFS project follows 'Squash and Merge' method</div><div class='add'>+     - This is mainly to preserve the historic Gerrit method of one patch in `git log` for one URL link.</div><div class='add'>+     - This also makes every merge a complete patch, which has passed all tests.</div><div class='add'>+   - The merging of the patch is expected to be done by the maintainers.</div><div class='add'>+     - It can be done when all the tests (smoke and regression) pass.</div><div class='add'>+     - When the PR has 'Approved' flag from corresponding maintainer.</div><div class='add'>+   - If you feel there is delay, feel free to add a comment, discuss the same in Slack channel, or send email.</div><div class='add'>+</div><div class='add'>+## By contributing to this project, the contributor would need to agree to below.</div><div class='add'>+</div><div class='add'>+### Developer's Certificate of Origin 1.1</div><div class='add'>+</div><div class='add'>+By making a contribution to this project, I certify that:</div><div class='add'>+</div><div class='add'>+(a) The contribution was created in whole or in part by me and I</div><div class='add'>+    have the right to submit it under the open source license</div><div class='add'>+    indicated in the file; or</div><div class='add'>+</div><div class='add'>+(b) The contribution is based upon previous work that, to the best</div><div class='add'>+    of my knowledge, is covered under an appropriate open source</div><div class='add'>+    license and I have the right under that license to submit that</div><div class='add'>+    work with modifications, whether created in whole or in part</div><div class='add'>+    by me, under the same open source license (unless I am</div><div class='add'>+    permitted to submit under a different license), as indicated</div><div class='add'>+    in the file; or</div><div class='add'>+</div><div class='add'>+(c) The contribution was provided directly to me by some other</div><div class='add'>+    person who certified (a), (b) or (c) and I have not modified</div><div class='add'>+    it.</div><div class='add'>+</div><div class='add'>+(d) I understand and agree that this project and the contribution</div><div class='add'>+    are public and that a record of the contribution (including all</div><div class='add'>+    personal information I submit with it, including my sign-off) is</div><div class='add'>+    maintained indefinitely and may be redistributed consistent with</div><div class='add'>+    this project or the open source license(s) involved.</div><div class='add'>+</div><div class='head'>diff --git a/COPYING-GPLV2 b/COPYING-GPLV2<br/>new file mode 100644<br/>index 00000000000..d159169d105<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/COPYING-GPLV2?id=d1d7a6f35c816822fab51c820e25023863c239c1'>COPYING-GPLV2</a></div><div class='hunk'>@@ -0,0 +1,339 @@</div><div class='add'>+                    GNU GENERAL PUBLIC LICENSE</div><div class='add'>+                       Version 2, June 1991</div><div class='add'>+</div><div class='add'>+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.,</div><div class='add'>+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA</div><div class='add'>+ Everyone is permitted to copy and distribute verbatim copies</div><div class='add'>+ of this license document, but changing it is not allowed.</div><div class='add'>+</div><div class='add'>+                            Preamble</div><div class='add'>+</div><div class='add'>+  The licenses for most software are designed to take away your</div><div class='add'>+freedom to share and change it.  By contrast, the GNU General Public</div><div class='add'>+License is intended to guarantee your freedom to share and change free</div><div class='add'>+software--to make sure the software is free for all its users.  This</div><div class='add'>+General Public License applies to most of the Free Software</div><div class='add'>+Foundation's software and to any other program whose authors commit to</div><div class='add'>+using it.  (Some other Free Software Foundation software is covered by</div><div class='add'>+the GNU Lesser General Public License instead.)  You can apply it to</div><div class='add'>+your programs, too.</div><div class='add'>+</div><div class='add'>+  When we speak of free software, we are referring to freedom, not</div><div class='add'>+price.  Our General Public Licenses are designed to make sure that you</div><div class='add'>+have the freedom to distribute copies of free software (and charge for</div><div class='add'>+this service if you wish), that you receive source code or can get it</div><div class='add'>+if you want it, that you can change the software or use pieces of it</div><div class='add'>+in new free programs; and that you know you can do these things.</div><div class='add'>+</div><div class='add'>+  To protect your rights, we need to make restrictions that forbid</div><div class='add'>+anyone to deny you these rights or to ask you to surrender the rights.</div><div class='add'>+These restrictions translate to certain responsibilities for you if you</div><div class='add'>+distribute copies of the software, or if you modify it.</div><div class='add'>+</div><div class='add'>+  For example, if you distribute copies of such a program, whether</div><div class='add'>+gratis or for a fee, you must give the recipients all the rights that</div><div class='add'>+you have.  You must make sure that they, too, receive or can get the</div><div class='add'>+source code.  And you must show them these terms so they know their</div><div class='add'>+rights.</div><div class='add'>+</div><div class='add'>+  We protect your rights with two steps: (1) copyright the software, and</div><div class='add'>+(2) offer you this license which gives you legal permission to copy,</div><div class='add'>+distribute and/or modify the software.</div><div class='add'>+</div><div class='add'>+  Also, for each author's protection and ours, we want to make certain</div><div class='add'>+that everyone understands that there is no warranty for this free</div><div class='add'>+software.  If the software is modified by someone else and passed on, we</div><div class='add'>+want its recipients to know that what they have is not the original, so</div><div class='add'>+that any problems introduced by others will not reflect on the original</div><div class='add'>+authors' reputations.</div><div class='add'>+</div><div class='add'>+  Finally, any free program is threatened constantly by software</div><div class='add'>+patents.  We wish to avoid the danger that redistributors of a free</div><div class='add'>+program will individually obtain patent licenses, in effect making the</div><div class='add'>+program proprietary.  To prevent this, we have made it clear that any</div><div class='add'>+patent must be licensed for everyone's free use or not licensed at all.</div><div class='add'>+</div><div class='add'>+  The precise terms and conditions for copying, distribution and</div><div class='add'>+modification follow.</div><div class='add'>+</div><div class='add'>+                    GNU GENERAL PUBLIC LICENSE</div><div class='add'>+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION</div><div class='add'>+</div><div class='add'>+  0. This License applies to any program or other work which contains</div><div class='add'>+a notice placed by the copyright holder saying it may be distributed</div><div class='add'>+under the terms of this General Public License.  The "Program", below,</div><div class='add'>+refers to any such program or work, and a "work based on the Program"</div><div class='add'>+means either the Program or any derivative work under copyright law:</div><div class='add'>+that is to say, a work containing the Program or a portion of it,</div><div class='add'>+either verbatim or with modifications and/or translated into another</div><div class='add'>+language.  (Hereinafter, translation is included without limitation in</div><div class='add'>+the term "modification".)  Each licensee is addressed as "you".</div><div class='add'>+</div><div class='add'>+Activities other than copying, distribution and modification are not</div><div class='add'>+covered by this License; they are outside its scope.  The act of</div><div class='add'>+running the Program is not restricted, and the output from the Program</div><div class='add'>+is covered only if its contents constitute a work based on the</div><div class='add'>+Program (independent of having been made by running the Program).</div><div class='add'>+Whether that is true depends on what the Program does.</div><div class='add'>+</div><div class='add'>+  1. You may copy and distribute verbatim copies of the Program's</div><div class='add'>+source code as you receive it, in any medium, provided that you</div><div class='add'>+conspicuously and appropriately publish on each copy an appropriate</div><div class='add'>+copyright notice and disclaimer of warranty; keep intact all the</div><div class='add'>+notices that refer to this License and to the absence of any warranty;</div><div class='add'>+and give any other recipients of the Program a copy of this License</div><div class='add'>+along with the Program.</div><div class='add'>+</div><div class='add'>+You may charge a fee for the physical act of transferring a copy, and</div><div class='add'>+you may at your option offer warranty protection in exchange for a fee.</div><div class='add'>+</div><div class='add'>+  2. You may modify your copy or copies of the Program or any portion</div><div class='add'>+of it, thus forming a work based on the Program, and copy and</div><div class='add'>+distribute such modifications or work under the terms of Section 1</div><div class='add'>+above, provided that you also meet all of these conditions:</div><div class='add'>+</div><div class='add'>+    a) You must cause the modified files to carry prominent notices</div><div class='add'>+    stating that you changed the files and the date of any change.</div><div class='add'>+</div><div class='add'>+    b) You must cause any work that you distribute or publish, that in</div><div class='add'>+    whole or in part contains or is derived from the Program or any</div><div class='add'>+    part thereof, to be licensed as a whole at no charge to all third</div><div class='add'>+    parties under the terms of this License.</div><div class='add'>+</div><div class='add'>+    c) If the modified program normally reads commands interactively</div><div class='add'>+    when run, you must cause it, when started running for such</div><div class='add'>+    interactive use in the most ordinary way, to print or display an</div><div class='add'>+    announcement including an appropriate copyright notice and a</div><div class='add'>+    notice that there is no warranty (or else, saying that you provide</div><div class='add'>+    a warranty) and that users may redistribute the program under</div><div class='add'>+    these conditions, and telling the user how to view a copy of this</div><div class='add'>+    License.  (Exception: if the Program itself is interactive but</div><div class='add'>+    does not normally print such an announcement, your work based on</div><div class='add'>+    the Program is not required to print an announcement.)</div><div class='add'>+</div><div class='add'>+These requirements apply to the modified work as a whole.  If</div><div class='add'>+identifiable sections of that work are not derived from the Program,</div><div class='add'>+and can be reasonably considered independent and separate works in</div><div class='add'>+themselves, then this License, and its terms, do not apply to those</div><div class='add'>+sections when you distribute them as separate works.  But when you</div><div class='add'>+distribute the same sections as part of a whole which is a work based</div><div class='add'>+on the Program, the distribution of the whole must be on the terms of</div><div class='add'>+this License, whose permissions for other licensees extend to the</div><div class='add'>+entire whole, and thus to each and every part regardless of who wrote it.</div><div class='add'>+</div><div class='add'>+Thus, it is not the intent of this section to claim rights or contest</div><div class='add'>+your rights to work written entirely by you; rather, the intent is to</div><div class='add'>+exercise the right to control the distribution of derivative or</div><div class='add'>+collective works based on the Program.</div><div class='add'>+</div><div class='add'>+In addition, mere aggregation of another work not based on the Program</div><div class='add'>+with the Program (or with a work based on the Program) on a volume of</div><div class='add'>+a storage or distribution medium does not bring the other work under</div><div class='add'>+the scope of this License.</div><div class='add'>+</div><div class='add'>+  3. You may copy and distribute the Program (or a work based on it,</div><div class='add'>+under Section 2) in object code or executable form under the terms of</div><div class='add'>+Sections 1 and 2 above provided that you also do one of the following:</div><div class='add'>+</div><div class='add'>+    a) Accompany it with the complete corresponding machine-readable</div><div class='add'>+    source code, which must be distributed under the terms of Sections</div><div class='add'>+    1 and 2 above on a medium customarily used for software interchange; or,</div><div class='add'>+</div><div class='add'>+    b) Accompany it with a written offer, valid for at least three</div><div class='add'>+    years, to give any third party, for a charge no more than your</div><div class='add'>+    cost of physically performing source distribution, a complete</div><div class='add'>+    machine-readable copy of the corresponding source code, to be</div><div class='add'>+    distributed under the terms of Sections 1 and 2 above on a medium</div><div class='add'>+    customarily used for software interchange; or,</div><div class='add'>+</div><div class='add'>+    c) Accompany it with the information you received as to the offer</div><div class='add'>+    to distribute corresponding source code.  (This alternative is</div><div class='add'>+    allowed only for noncommercial distribution and only if you</div><div class='add'>+    received the program in object code or executable form with such</div><div class='add'>+    an offer, in accord with Subsection b above.)</div><div class='add'>+</div><div class='add'>+The source code for a work means the preferred form of the work for</div><div class='add'>+making modifications to it.  For an executable work, complete source</div><div class='add'>+code means all the source code for all modules it contains, plus any</div><div class='add'>+associated interface definition files, plus the scripts used to</div><div class='add'>+control compilation and installation of the executable.  However, as a</div><div class='add'>+special exception, the source code distributed need not include</div><div class='add'>+anything that is normally distributed (in either source or binary</div><div class='add'>+form) with the major components (compiler, kernel, and so on) of the</div><div class='add'>+operating system on which the executable runs, unless that component</div><div class='add'>+itself accompanies the executable.</div><div class='add'>+</div><div class='add'>+If distribution of executable or object code is made by offering</div><div class='add'>+access to copy from a designated place, then offering equivalent</div><div class='add'>+access to copy the source code from the same place counts as</div><div class='add'>+distribution of the source code, even though third parties are not</div><div class='add'>+compelled to copy the source along with the object code.</div><div class='add'>+</div><div class='add'>+  4. You may not copy, modify, sublicense, or distribute the Program</div><div class='add'>+except as expressly provided under this License.  Any attempt</div><div class='add'>+otherwise to copy, modify, sublicense or distribute the Program is</div><div class='add'>+void, and will automatically terminate your rights under this License.</div><div class='add'>+However, parties who have received copies, or rights, from you under</div><div class='add'>+this License will not have their licenses terminated so long as such</div><div class='add'>+parties remain in full compliance.</div><div class='add'>+</div><div class='add'>+  5. You are not required to accept this License, since you have not</div><div class='add'>+signed it.  However, nothing else grants you permission to modify or</div><div class='add'>+distribute the Program or its derivative works.  These actions are</div><div class='add'>+prohibited by law if you do not accept this License.  Therefore, by</div><div class='add'>+modifying or distributing the Program (or any work based on the</div><div class='add'>+Program), you indicate your acceptance of this License to do so, and</div><div class='add'>+all its terms and conditions for copying, distributing or modifying</div><div class='add'>+the Program or works based on it.</div><div class='add'>+</div><div class='add'>+  6. Each time you redistribute the Program (or any work based on the</div><div class='add'>+Program), the recipient automatically receives a license from the</div><div class='add'>+original licensor to copy, distribute or modify the Program subject to</div><div class='add'>+these terms and conditions.  You may not impose any further</div><div class='add'>+restrictions on the recipients' exercise of the rights granted herein.</div><div class='add'>+You are not responsible for enforcing compliance by third parties to</div><div class='add'>+this License.</div><div class='add'>+</div><div class='add'>+  7. If, as a consequence of a court judgment or allegation of patent</div><div class='add'>+infringement or for any other reason (not limited to patent issues),</div><div class='add'>+conditions are imposed on you (whether by court order, agreement or</div><div class='add'>+otherwise) that contradict the conditions of this License, they do not</div><div class='add'>+excuse you from the conditions of this License.  If you cannot</div><div class='add'>+distribute so as to satisfy simultaneously your obligations under this</div><div class='add'>+License and any other pertinent obligations, then as a consequence you</div><div class='add'>+may not distribute the Program at all.  For example, if a patent</div><div class='add'>+license would not permit royalty-free redistribution of the Program by</div><div class='add'>+all those who receive copies directly or indirectly through you, then</div><div class='add'>+the only way you could satisfy both it and this License would be to</div><div class='add'>+refrain entirely from distribution of the Program.</div><div class='add'>+</div><div class='add'>+If any portion of this section is held invalid or unenforceable under</div><div class='add'>+any particular circumstance, the balance of the section is intended to</div><div class='add'>+apply and the section as a whole is intended to apply in other</div><div class='add'>+circumstances.</div><div class='add'>+</div><div class='add'>+It is not the purpose of this section to induce you to infringe any</div><div class='add'>+patents or other property right claims or to contest validity of any</div><div class='add'>+such claims; this section has the sole purpose of protecting the</div><div class='add'>+integrity of the free software distribution system, which is</div><div class='add'>+implemented by public license practices.  Many people have made</div><div class='add'>+generous contributions to the wide range of software distributed</div><div class='add'>+through that system in reliance on consistent application of that</div><div class='add'>+system; it is up to the author/donor to decide if he or she is willing</div><div class='add'>+to distribute software through any other system and a licensee cannot</div><div class='add'>+impose that choice.</div><div class='add'>+</div><div class='add'>+This section is intended to make thoroughly clear what is believed to</div><div class='add'>+be a consequence of the rest of this License.</div><div class='add'>+</div><div class='add'>+  8. If the distribution and/or use of the Program is restricted in</div><div class='add'>+certain countries either by patents or by copyrighted interfaces, the</div><div class='add'>+original copyright holder who places the Program under this License</div><div class='add'>+may add an explicit geographical distribution limitation excluding</div><div class='add'>+those countries, so that distribution is permitted only in or among</div><div class='add'>+countries not thus excluded.  In such case, this License incorporates</div><div class='add'>+the limitation as if written in the body of this License.</div><div class='add'>+</div><div class='add'>+  9. The Free Software Foundation may publish revised and/or new versions</div><div class='add'>+of the General Public License from time to time.  Such new versions will</div><div class='add'>+be similar in spirit to the present version, but may differ in detail to</div><div class='add'>+address new problems or concerns.</div><div class='add'>+</div><div class='add'>+Each version is given a distinguishing version number.  If the Program</div><div class='add'>+specifies a version number of this License which applies to it and "any</div><div class='add'>+later version", you have the option of following the terms and conditions</div><div class='add'>+either of that version or of any later version published by the Free</div><div class='add'>+Software Foundation.  If the Program does not specify a version number of</div><div class='add'>+this License, you may choose any version ever published by the Free Software</div><div class='add'>+Foundation.</div><div class='add'>+</div><div class='add'>+  10. If you wish to incorporate parts of the Program into other free</div><div class='add'>+programs whose distribution conditions are different, write to the author</div><div class='add'>+to ask for permission.  For software which is copyrighted by the Free</div><div class='add'>+Software Foundation, write to the Free Software Foundation; we sometimes</div><div class='add'>+make exceptions for this.  Our decision will be guided by the two goals</div><div class='add'>+of preserving the free status of all derivatives of our free software and</div><div class='add'>+of promoting the sharing and reuse of software generally.</div><div class='add'>+</div><div class='add'>+                            NO WARRANTY</div><div class='add'>+</div><div class='add'>+  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY</div><div class='add'>+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN</div><div class='add'>+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES</div><div class='add'>+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED</div><div class='add'>+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF</div><div class='add'>+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS</div><div class='add'>+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE</div><div class='add'>+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,</div><div class='add'>+REPAIR OR CORRECTION.</div><div class='add'>+</div><div class='add'>+  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING</div><div class='add'>+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR</div><div class='add'>+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,</div><div class='add'>+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING</div><div class='add'>+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED</div><div class='add'>+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY</div><div class='add'>+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER</div><div class='add'>+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE</div><div class='add'>+POSSIBILITY OF SUCH DAMAGES.</div><div class='add'>+</div><div class='add'>+                     END OF TERMS AND CONDITIONS</div><div class='add'>+</div><div class='add'>+            How to Apply These Terms to Your New Programs</div><div class='add'>+</div><div class='add'>+  If you develop a new program, and you want it to be of the greatest</div><div class='add'>+possible use to the public, the best way to achieve this is to make it</div><div class='add'>+free software which everyone can redistribute and change under these terms.</div><div class='add'>+</div><div class='add'>+  To do so, attach the following notices to the program.  It is safest</div><div class='add'>+to attach them to the start of each source file to most effectively</div><div class='add'>+convey the exclusion of warranty; and each file should have at least</div><div class='add'>+the "copyright" line and a pointer to where the full notice is found.</div><div class='add'>+</div><div class='add'>+    &lt;one line to give the program's name and a brief idea of what it does.&gt;</div><div class='add'>+    Copyright (C) &lt;year&gt;  &lt;name of author&gt;</div><div class='add'>+</div><div class='add'>+    This program is free software; you can redistribute it and/or modify</div><div class='add'>+    it under the terms of the GNU General Public License as published by</div><div class='add'>+    the Free Software Foundation; either version 2 of the License, or</div><div class='add'>+    (at your option) any later version.</div><div class='add'>+</div><div class='add'>+    This program is distributed in the hope that it will be useful,</div><div class='add'>+    but WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='add'>+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the</div><div class='add'>+    GNU General Public License for more details.</div><div class='add'>+</div><div class='add'>+    You should have received a copy of the GNU General Public License along</div><div class='add'>+    with this program; if not, write to the Free Software Foundation, Inc.,</div><div class='add'>+    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.</div><div class='add'>+</div><div class='add'>+Also add information on how to contact you by electronic and paper mail.</div><div class='add'>+</div><div class='add'>+If the program is interactive, make it output a short notice like this</div><div class='add'>+when it starts in an interactive mode:</div><div class='add'>+</div><div class='add'>+    Gnomovision version 69, Copyright (C) year name of author</div><div class='add'>+    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.</div><div class='add'>+    This is free software, and you are welcome to redistribute it</div><div class='add'>+    under certain conditions; type `show c' for details.</div><div class='add'>+</div><div class='add'>+The hypothetical commands `show w' and `show c' should show the appropriate</div><div class='add'>+parts of the General Public License.  Of course, the commands you use may</div><div class='add'>+be called something other than `show w' and `show c'; they could even be</div><div class='add'>+mouse-clicks or menu items--whatever suits your program.</div><div class='add'>+</div><div class='add'>+You should also get your employer (if you work as a programmer) or your</div><div class='add'>+school, if any, to sign a "copyright disclaimer" for the program, if</div><div class='add'>+necessary.  Here is a sample; alter the names:</div><div class='add'>+</div><div class='add'>+  Yoyodyne, Inc., hereby disclaims all copyright interest in the program</div><div class='add'>+  `Gnomovision' (which makes passes at compilers) written by James Hacker.</div><div class='add'>+</div><div class='add'>+  &lt;signature of Ty Coon&gt;, 1 April 1989</div><div class='add'>+  Ty Coon, President of Vice</div><div class='add'>+</div><div class='add'>+This General Public License does not permit incorporating your program into</div><div class='add'>+proprietary programs.  If your program is a subroutine library, you may</div><div class='add'>+consider it more useful to permit linking proprietary applications with the</div><div class='add'>+library.  If this is what you want to do, use the GNU Lesser General</div><div class='add'>+Public License instead of this License.</div><div class='head'>diff --git a/COPYING-LGPLV3 b/COPYING-LGPLV3<br/>new file mode 100644<br/>index 00000000000..65c5ca88a67<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/COPYING-LGPLV3?id=d1d7a6f35c816822fab51c820e25023863c239c1'>COPYING-LGPLV3</a></div><div class='hunk'>@@ -0,0 +1,165 @@</div><div class='add'>+                   GNU LESSER GENERAL PUBLIC LICENSE</div><div class='add'>+                       Version 3, 29 June 2007</div><div class='add'>+</div><div class='add'>+ Copyright (C) 2007 Free Software Foundation, Inc. &lt;http://fsf.org/&gt;</div><div class='add'>+ Everyone is permitted to copy and distribute verbatim copies</div><div class='add'>+ of this license document, but changing it is not allowed.</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+  This version of the GNU Lesser General Public License incorporates</div><div class='add'>+the terms and conditions of version 3 of the GNU General Public</div><div class='add'>+License, supplemented by the additional permissions listed below.</div><div class='add'>+</div><div class='add'>+  0. Additional Definitions.</div><div class='add'>+</div><div class='add'>+  As used herein, "this License" refers to version 3 of the GNU Lesser</div><div class='add'>+General Public License, and the "GNU GPL" refers to version 3 of the GNU</div><div class='add'>+General Public License.</div><div class='add'>+</div><div class='add'>+  "The Library" refers to a covered work governed by this License,</div><div class='add'>+other than an Application or a Combined Work as defined below.</div><div class='add'>+</div><div class='add'>+  An "Application" is any work that makes use of an interface provided</div><div class='add'>+by the Library, but which is not otherwise based on the Library.</div><div class='add'>+Defining a subclass of a class defined by the Library is deemed a mode</div><div class='add'>+of using an interface provided by the Library.</div><div class='add'>+</div><div class='add'>+  A "Combined Work" is a work produced by combining or linking an</div><div class='add'>+Application with the Library.  The particular version of the Library</div><div class='add'>+with which the Combined Work was made is also called the "Linked</div><div class='add'>+Version".</div><div class='add'>+</div><div class='add'>+  The "Minimal Corresponding Source" for a Combined Work means the</div><div class='add'>+Corresponding Source for the Combined Work, excluding any source code</div><div class='add'>+for portions of the Combined Work that, considered in isolation, are</div><div class='add'>+based on the Application, and not on the Linked Version.</div><div class='add'>+</div><div class='add'>+  The "Corresponding Application Code" for a Combined Work means the</div><div class='add'>+object code and/or source code for the Application, including any data</div><div class='add'>+and utility programs needed for reproducing the Combined Work from the</div><div class='add'>+Application, but excluding the System Libraries of the Combined Work.</div><div class='add'>+</div><div class='add'>+  1. Exception to Section 3 of the GNU GPL.</div><div class='add'>+</div><div class='add'>+  You may convey a covered work under sections 3 and 4 of this License</div><div class='add'>+without being bound by section 3 of the GNU GPL.</div><div class='add'>+</div><div class='add'>+  2. Conveying Modified Versions.</div><div class='add'>+</div><div class='add'>+  If you modify a copy of the Library, and, in your modifications, a</div><div class='add'>+facility refers to a function or data to be supplied by an Application</div><div class='add'>+that uses the facility (other than as an argument passed when the</div><div class='add'>+facility is invoked), then you may convey a copy of the modified</div><div class='add'>+version:</div><div class='add'>+</div><div class='add'>+   a) under this License, provided that you make a good faith effort to</div><div class='add'>+   ensure that, in the event an Application does not supply the</div><div class='add'>+   function or data, the facility still operates, and performs</div><div class='add'>+   whatever part of its purpose remains meaningful, or</div><div class='add'>+</div><div class='add'>+   b) under the GNU GPL, with none of the additional permissions of</div><div class='add'>+   this License applicable to that copy.</div><div class='add'>+</div><div class='add'>+  3. Object Code Incorporating Material from Library Header Files.</div><div class='add'>+</div><div class='add'>+  The object code form of an Application may incorporate material from</div><div class='add'>+a header file that is part of the Library.  You may convey such object</div><div class='add'>+code under terms of your choice, provided that, if the incorporated</div><div class='add'>+material is not limited to numerical parameters, data structure</div><div class='add'>+layouts and accessors, or small macros, inline functions and templates</div><div class='add'>+(ten or fewer lines in length), you do both of the following:</div><div class='add'>+</div><div class='add'>+   a) Give prominent notice with each copy of the object code that the</div><div class='add'>+   Library is used in it and that the Library and its use are</div><div class='add'>+   covered by this License.</div><div class='add'>+</div><div class='add'>+   b) Accompany the object code with a copy of the GNU GPL and this license</div><div class='add'>+   document.</div><div class='add'>+</div><div class='add'>+  4. Combined Works.</div><div class='add'>+</div><div class='add'>+  You may convey a Combined Work under terms of your choice that,</div><div class='add'>+taken together, effectively do not restrict modification of the</div><div class='add'>+portions of the Library contained in the Combined Work and reverse</div><div class='add'>+engineering for debugging such modifications, if you also do each of</div><div class='add'>+the following:</div><div class='add'>+</div><div class='add'>+   a) Give prominent notice with each copy of the Combined Work that</div><div class='add'>+   the Library is used in it and that the Library and its use are</div><div class='add'>+   covered by this License.</div><div class='add'>+</div><div class='add'>+   b) Accompany the Combined Work with a copy of the GNU GPL and this license</div><div class='add'>+   document.</div><div class='add'>+</div><div class='add'>+   c) For a Combined Work that displays copyright notices during</div><div class='add'>+   execution, include the copyright notice for the Library among</div><div class='add'>+   these notices, as well as a reference directing the user to the</div><div class='add'>+   copies of the GNU GPL and this license document.</div><div class='add'>+</div><div class='add'>+   d) Do one of the following:</div><div class='add'>+</div><div class='add'>+       0) Convey the Minimal Corresponding Source under the terms of this</div><div class='add'>+       License, and the Corresponding Application Code in a form</div><div class='add'>+       suitable for, and under terms that permit, the user to</div><div class='add'>+       recombine or relink the Application with a modified version of</div><div class='add'>+       the Linked Version to produce a modified Combined Work, in the</div><div class='add'>+       manner specified by section 6 of the GNU GPL for conveying</div><div class='add'>+       Corresponding Source.</div><div class='add'>+</div><div class='add'>+       1) Use a suitable shared library mechanism for linking with the</div><div class='add'>+       Library.  A suitable mechanism is one that (a) uses at run time</div><div class='add'>+       a copy of the Library already present on the user's computer</div><div class='add'>+       system, and (b) will operate properly with a modified version</div><div class='add'>+       of the Library that is interface-compatible with the Linked</div><div class='add'>+       Version.</div><div class='add'>+</div><div class='add'>+   e) Provide Installation Information, but only if you would otherwise</div><div class='add'>+   be required to provide such information under section 6 of the</div><div class='add'>+   GNU GPL, and only to the extent that such information is</div><div class='add'>+   necessary to install and execute a modified version of the</div><div class='add'>+   Combined Work produced by recombining or relinking the</div><div class='add'>+   Application with a modified version of the Linked Version. (If</div><div class='add'>+   you use option 4d0, the Installation Information must accompany</div><div class='add'>+   the Minimal Corresponding Source and Corresponding Application</div><div class='add'>+   Code. If you use option 4d1, you must provide the Installation</div><div class='add'>+   Information in the manner specified by section 6 of the GNU GPL</div><div class='add'>+   for conveying Corresponding Source.)</div><div class='add'>+</div><div class='add'>+  5. Combined Libraries.</div><div class='add'>+</div><div class='add'>+  You may place library facilities that are a work based on the</div><div class='add'>+Library side by side in a single library together with other library</div><div class='add'>+facilities that are not Applications and are not covered by this</div><div class='add'>+License, and convey such a combined library under terms of your</div><div class='add'>+choice, if you do both of the following:</div><div class='add'>+</div><div class='add'>+   a) Accompany the combined library with a copy of the same work based</div><div class='add'>+   on the Library, uncombined with any other library facilities,</div><div class='add'>+   conveyed under the terms of this License.</div><div class='add'>+</div><div class='add'>+   b) Give prominent notice with the combined library that part of it</div><div class='add'>+   is a work based on the Library, and explaining where to find the</div><div class='add'>+   accompanying uncombined form of the same work.</div><div class='add'>+</div><div class='add'>+  6. Revised Versions of the GNU Lesser General Public License.</div><div class='add'>+</div><div class='add'>+  The Free Software Foundation may publish revised and/or new versions</div><div class='add'>+of the GNU Lesser General Public License from time to time. Such new</div><div class='add'>+versions will be similar in spirit to the present version, but may</div><div class='add'>+differ in detail to address new problems or concerns.</div><div class='add'>+</div><div class='add'>+  Each version is given a distinguishing version number. If the</div><div class='add'>+Library as you received it specifies that a certain numbered version</div><div class='add'>+of the GNU Lesser General Public License "or any later version"</div><div class='add'>+applies to it, you have the option of following the terms and</div><div class='add'>+conditions either of that published version or of any later version</div><div class='add'>+published by the Free Software Foundation. If the Library as you</div><div class='add'>+received it does not specify a version number of the GNU Lesser</div><div class='add'>+General Public License, you may choose any version of the GNU Lesser</div><div class='add'>+General Public License ever published by the Free Software Foundation.</div><div class='add'>+</div><div class='add'>+  If the Library as you received it specifies that a proxy can decide</div><div class='add'>+whether future versions of the GNU Lesser General Public License shall</div><div class='add'>+apply, that proxy's public statement of acceptance of any version is</div><div class='add'>+permanent authorization for you to choose that version for the</div><div class='add'>+Library.</div><div class='head'>diff --git a/COPYING.AGPL b/COPYING.AGPL<br/>deleted file mode 100644<br/>index dba13ed2ddf..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/COPYING.AGPL?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>COPYING.AGPL</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,661 +0,0 @@</div><div class='del'>-                    GNU AFFERO GENERAL PUBLIC LICENSE</div><div class='del'>-                       Version 3, 19 November 2007</div><div class='del'>-</div><div class='del'>- Copyright (C) 2007 Free Software Foundation, Inc. &lt;http://fsf.org/&gt;</div><div class='del'>- Everyone is permitted to copy and distribute verbatim copies</div><div class='del'>- of this license document, but changing it is not allowed.</div><div class='del'>-</div><div class='del'>-                            Preamble</div><div class='del'>-</div><div class='del'>-  The GNU Affero General Public License is a free, copyleft license for</div><div class='del'>-software and other kinds of works, specifically designed to ensure</div><div class='del'>-cooperation with the community in the case of network server software.</div><div class='del'>-</div><div class='del'>-  The licenses for most software and other practical works are designed</div><div class='del'>-to take away your freedom to share and change the works.  By contrast,</div><div class='del'>-our General Public Licenses are intended to guarantee your freedom to</div><div class='del'>-share and change all versions of a program--to make sure it remains free</div><div class='del'>-software for all its users.</div><div class='del'>-</div><div class='del'>-  When we speak of free software, we are referring to freedom, not</div><div class='del'>-price.  Our General Public Licenses are designed to make sure that you</div><div class='del'>-have the freedom to distribute copies of free software (and charge for</div><div class='del'>-them if you wish), that you receive source code or can get it if you</div><div class='del'>-want it, that you can change the software or use pieces of it in new</div><div class='del'>-free programs, and that you know you can do these things.</div><div class='del'>-</div><div class='del'>-  Developers that use our General Public Licenses protect your rights</div><div class='del'>-with two steps: (1) assert copyright on the software, and (2) offer</div><div class='del'>-you this License which gives you legal permission to copy, distribute</div><div class='del'>-and/or modify the software.</div><div class='del'>-</div><div class='del'>-  A secondary benefit of defending all users' freedom is that</div><div class='del'>-improvements made in alternate versions of the program, if they</div><div class='del'>-receive widespread use, become available for other developers to</div><div class='del'>-incorporate.  Many developers of free software are heartened and</div><div class='del'>-encouraged by the resulting cooperation.  However, in the case of</div><div class='del'>-software used on network servers, this result may fail to come about.</div><div class='del'>-The GNU General Public License permits making a modified version and</div><div class='del'>-letting the public access it on a server without ever releasing its</div><div class='del'>-source code to the public.</div><div class='del'>-</div><div class='del'>-  The GNU Affero General Public License is designed specifically to</div><div class='del'>-ensure that, in such cases, the modified source code becomes available</div><div class='del'>-to the community.  It requires the operator of a network server to</div><div class='del'>-provide the source code of the modified version running there to the</div><div class='del'>-users of that server.  Therefore, public use of a modified version, on</div><div class='del'>-a publicly accessible server, gives the public access to the source</div><div class='del'>-code of the modified version.</div><div class='del'>-</div><div class='del'>-  An older license, called the Affero General Public License and</div><div class='del'>-published by Affero, was designed to accomplish similar goals.  This is</div><div class='del'>-a different license, not a version of the Affero GPL, but Affero has</div><div class='del'>-released a new version of the Affero GPL which permits relicensing under</div><div class='del'>-this license.</div><div class='del'>-</div><div class='del'>-  The precise terms and conditions for copying, distribution and</div><div class='del'>-modification follow.</div><div class='del'>-</div><div class='del'>-                       TERMS AND CONDITIONS</div><div class='del'>-</div><div class='del'>-  0. Definitions.</div><div class='del'>-</div><div class='del'>-  "This License" refers to version 3 of the GNU Affero General Public License.</div><div class='del'>-</div><div class='del'>-  "Copyright" also means copyright-like laws that apply to other kinds of</div><div class='del'>-works, such as semiconductor masks.</div><div class='del'>-</div><div class='del'>-  "The Program" refers to any copyrightable work licensed under this</div><div class='del'>-License.  Each licensee is addressed as "you".  "Licensees" and</div><div class='del'>-"recipients" may be individuals or organizations.</div><div class='del'>-</div><div class='del'>-  To "modify" a work means to copy from or adapt all or part of the work</div><div class='del'>-in a fashion requiring copyright permission, other than the making of an</div><div class='del'>-exact copy.  The resulting work is called a "modified version" of the</div><div class='del'>-earlier work or a work "based on" the earlier work.</div><div class='del'>-</div><div class='del'>-  A "covered work" means either the unmodified Program or a work based</div><div class='del'>-on the Program.</div><div class='del'>-</div><div class='del'>-  To "propagate" a work means to do anything with it that, without</div><div class='del'>-permission, would make you directly or secondarily liable for</div><div class='del'>-infringement under applicable copyright law, except executing it on a</div><div class='del'>-computer or modifying a private copy.  Propagation includes copying,</div><div class='del'>-distribution (with or without modification), making available to the</div><div class='del'>-public, and in some countries other activities as well.</div><div class='del'>-</div><div class='del'>-  To "convey" a work means any kind of propagation that enables other</div><div class='del'>-parties to make or receive copies.  Mere interaction with a user through</div><div class='del'>-a computer network, with no transfer of a copy, is not conveying.</div><div class='del'>-</div><div class='del'>-  An interactive user interface displays "Appropriate Legal Notices"</div><div class='del'>-to the extent that it includes a convenient and prominently visible</div><div class='del'>-feature that (1) displays an appropriate copyright notice, and (2)</div><div class='del'>-tells the user that there is no warranty for the work (except to the</div><div class='del'>-extent that warranties are provided), that licensees may convey the</div><div class='del'>-work under this License, and how to view a copy of this License.  If</div><div class='del'>-the interface presents a list of user commands or options, such as a</div><div class='del'>-menu, a prominent item in the list meets this criterion.</div><div class='del'>-</div><div class='del'>-  1. Source Code.</div><div class='del'>-</div><div class='del'>-  The "source code" for a work means the preferred form of the work</div><div class='del'>-for making modifications to it.  "Object code" means any non-source</div><div class='del'>-form of a work.</div><div class='del'>-</div><div class='del'>-  A "Standard Interface" means an interface that either is an official</div><div class='del'>-standard defined by a recognized standards body, or, in the case of</div><div class='del'>-interfaces specified for a particular programming language, one that</div><div class='del'>-is widely used among developers working in that language.</div><div class='del'>-</div><div class='del'>-  The "System Libraries" of an executable work include anything, other</div><div class='del'>-than the work as a whole, that (a) is included in the normal form of</div><div class='del'>-packaging a Major Component, but which is not part of that Major</div><div class='del'>-Component, and (b) serves only to enable use of the work with that</div><div class='del'>-Major Component, or to implement a Standard Interface for which an</div><div class='del'>-implementation is available to the public in source code form.  A</div><div class='del'>-"Major Component", in this context, means a major essential component</div><div class='del'>-(kernel, window system, and so on) of the specific operating system</div><div class='del'>-(if any) on which the executable work runs, or a compiler used to</div><div class='del'>-produce the work, or an object code interpreter used to run it.</div><div class='del'>-</div><div class='del'>-  The "Corresponding Source" for a work in object code form means all</div><div class='del'>-the source code needed to generate, install, and (for an executable</div><div class='del'>-work) run the object code and to modify the work, including scripts to</div><div class='del'>-control those activities.  However, it does not include the work's</div><div class='del'>-System Libraries, or general-purpose tools or generally available free</div><div class='del'>-programs which are used unmodified in performing those activities but</div><div class='del'>-which are not part of the work.  For example, Corresponding Source</div><div class='del'>-includes interface definition files associated with source files for</div><div class='del'>-the work, and the source code for shared libraries and dynamically</div><div class='del'>-linked subprograms that the work is specifically designed to require,</div><div class='del'>-such as by intimate data communication or control flow between those</div><div class='del'>-subprograms and other parts of the work.</div><div class='del'>-</div><div class='del'>-  The Corresponding Source need not include anything that users</div><div class='del'>-can regenerate automatically from other parts of the Corresponding</div><div class='del'>-Source.</div><div class='del'>-</div><div class='del'>-  The Corresponding Source for a work in source code form is that</div><div class='del'>-same work.</div><div class='del'>-</div><div class='del'>-  2. Basic Permissions.</div><div class='del'>-</div><div class='del'>-  All rights granted under this License are granted for the term of</div><div class='del'>-copyright on the Program, and are irrevocable provided the stated</div><div class='del'>-conditions are met.  This License explicitly affirms your unlimited</div><div class='del'>-permission to run the unmodified Program.  The output from running a</div><div class='del'>-covered work is covered by this License only if the output, given its</div><div class='del'>-content, constitutes a covered work.  This License acknowledges your</div><div class='del'>-rights of fair use or other equivalent, as provided by copyright law.</div><div class='del'>-</div><div class='del'>-  You may make, run and propagate covered works that you do not</div><div class='del'>-convey, without conditions so long as your license otherwise remains</div><div class='del'>-in force.  You may convey covered works to others for the sole purpose</div><div class='del'>-of having them make modifications exclusively for you, or provide you</div><div class='del'>-with facilities for running those works, provided that you comply with</div><div class='del'>-the terms of this License in conveying all material for which you do</div><div class='del'>-not control copyright.  Those thus making or running the covered works</div><div class='del'>-for you must do so exclusively on your behalf, under your direction</div><div class='del'>-and control, on terms that prohibit them from making any copies of</div><div class='del'>-your copyrighted material outside their relationship with you.</div><div class='del'>-</div><div class='del'>-  Conveying under any other circumstances is permitted solely under</div><div class='del'>-the conditions stated below.  Sublicensing is not allowed; section 10</div><div class='del'>-makes it unnecessary.</div><div class='del'>-</div><div class='del'>-  3. Protecting Users' Legal Rights From Anti-Circumvention Law.</div><div class='del'>-</div><div class='del'>-  No covered work shall be deemed part of an effective technological</div><div class='del'>-measure under any applicable law fulfilling obligations under article</div><div class='del'>-11 of the WIPO copyright treaty adopted on 20 December 1996, or</div><div class='del'>-similar laws prohibiting or restricting circumvention of such</div><div class='del'>-measures.</div><div class='del'>-</div><div class='del'>-  When you convey a covered work, you waive any legal power to forbid</div><div class='del'>-circumvention of technological measures to the extent such circumvention</div><div class='del'>-is effected by exercising rights under this License with respect to</div><div class='del'>-the covered work, and you disclaim any intention to limit operation or</div><div class='del'>-modification of the work as a means of enforcing, against the work's</div><div class='del'>-users, your or third parties' legal rights to forbid circumvention of</div><div class='del'>-technological measures.</div><div class='del'>-</div><div class='del'>-  4. Conveying Verbatim Copies.</div><div class='del'>-</div><div class='del'>-  You may convey verbatim copies of the Program's source code as you</div><div class='del'>-receive it, in any medium, provided that you conspicuously and</div><div class='del'>-appropriately publish on each copy an appropriate copyright notice;</div><div class='del'>-keep intact all notices stating that this License and any</div><div class='del'>-non-permissive terms added in accord with section 7 apply to the code;</div><div class='del'>-keep intact all notices of the absence of any warranty; and give all</div><div class='del'>-recipients a copy of this License along with the Program.</div><div class='del'>-</div><div class='del'>-  You may charge any price or no price for each copy that you convey,</div><div class='del'>-and you may offer support or warranty protection for a fee.</div><div class='del'>-</div><div class='del'>-  5. Conveying Modified Source Versions.</div><div class='del'>-</div><div class='del'>-  You may convey a work based on the Program, or the modifications to</div><div class='del'>-produce it from the Program, in the form of source code under the</div><div class='del'>-terms of section 4, provided that you also meet all of these conditions:</div><div class='del'>-</div><div class='del'>-    a) The work must carry prominent notices stating that you modified</div><div class='del'>-    it, and giving a relevant date.</div><div class='del'>-</div><div class='del'>-    b) The work must carry prominent notices stating that it is</div><div class='del'>-    released under this License and any conditions added under section</div><div class='del'>-    7.  This requirement modifies the requirement in section 4 to</div><div class='del'>-    "keep intact all notices".</div><div class='del'>-</div><div class='del'>-    c) You must license the entire work, as a whole, under this</div><div class='del'>-    License to anyone who comes into possession of a copy.  This</div><div class='del'>-    License will therefore apply, along with any applicable section 7</div><div class='del'>-    additional terms, to the whole of the work, and all its parts,</div><div class='del'>-    regardless of how they are packaged.  This License gives no</div><div class='del'>-    permission to license the work in any other way, but it does not</div><div class='del'>-    invalidate such permission if you have separately received it.</div><div class='del'>-</div><div class='del'>-    d) If the work has interactive user interfaces, each must display</div><div class='del'>-    Appropriate Legal Notices; however, if the Program has interactive</div><div class='del'>-    interfaces that do not display Appropriate Legal Notices, your</div><div class='del'>-    work need not make them do so.</div><div class='del'>-</div><div class='del'>-  A compilation of a covered work with other separate and independent</div><div class='del'>-works, which are not by their nature extensions of the covered work,</div><div class='del'>-and which are not combined with it such as to form a larger program,</div><div class='del'>-in or on a volume of a storage or distribution medium, is called an</div><div class='del'>-"aggregate" if the compilation and its resulting copyright are not</div><div class='del'>-used to limit the access or legal rights of the compilation's users</div><div class='del'>-beyond what the individual works permit.  Inclusion of a covered work</div><div class='del'>-in an aggregate does not cause this License to apply to the other</div><div class='del'>-parts of the aggregate.</div><div class='del'>-</div><div class='del'>-  6. Conveying Non-Source Forms.</div><div class='del'>-</div><div class='del'>-  You may convey a covered work in object code form under the terms</div><div class='del'>-of sections 4 and 5, provided that you also convey the</div><div class='del'>-machine-readable Corresponding Source under the terms of this License,</div><div class='del'>-in one of these ways:</div><div class='del'>-</div><div class='del'>-    a) Convey the object code in, or embodied in, a physical product</div><div class='del'>-    (including a physical distribution medium), accompanied by the</div><div class='del'>-    Corresponding Source fixed on a durable physical medium</div><div class='del'>-    customarily used for software interchange.</div><div class='del'>-</div><div class='del'>-    b) Convey the object code in, or embodied in, a physical product</div><div class='del'>-    (including a physical distribution medium), accompanied by a</div><div class='del'>-    written offer, valid for at least three years and valid for as</div><div class='del'>-    long as you offer spare parts or customer support for that product</div><div class='del'>-    model, to give anyone who possesses the object code either (1) a</div><div class='del'>-    copy of the Corresponding Source for all the software in the</div><div class='del'>-    product that is covered by this License, on a durable physical</div><div class='del'>-    medium customarily used for software interchange, for a price no</div><div class='del'>-    more than your reasonable cost of physically performing this</div><div class='del'>-    conveying of source, or (2) access to copy the</div><div class='del'>-    Corresponding Source from a network server at no charge.</div><div class='del'>-</div><div class='del'>-    c) Convey individual copies of the object code with a copy of the</div><div class='del'>-    written offer to provide the Corresponding Source.  This</div><div class='del'>-    alternative is allowed only occasionally and noncommercially, and</div><div class='del'>-    only if you received the object code with such an offer, in accord</div><div class='del'>-    with subsection 6b.</div><div class='del'>-</div><div class='del'>-    d) Convey the object code by offering access from a designated</div><div class='del'>-    place (gratis or for a charge), and offer equivalent access to the</div><div class='del'>-    Corresponding Source in the same way through the same place at no</div><div class='del'>-    further charge.  You need not require recipients to copy the</div><div class='del'>-    Corresponding Source along with the object code.  If the place to</div><div class='del'>-    copy the object code is a network server, the Corresponding Source</div><div class='del'>-    may be on a different server (operated by you or a third party)</div><div class='del'>-    that supports equivalent copying facilities, provided you maintain</div><div class='del'>-    clear directions next to the object code saying where to find the</div><div class='del'>-    Corresponding Source.  Regardless of what server hosts the</div><div class='del'>-    Corresponding Source, you remain obligated to ensure that it is</div><div class='del'>-    available for as long as needed to satisfy these requirements.</div><div class='del'>-</div><div class='del'>-    e) Convey the object code using peer-to-peer transmission, provided</div><div class='del'>-    you inform other peers where the object code and Corresponding</div><div class='del'>-    Source of the work are being offered to the general public at no</div><div class='del'>-    charge under subsection 6d.</div><div class='del'>-</div><div class='del'>-  A separable portion of the object code, whose source code is excluded</div><div class='del'>-from the Corresponding Source as a System Library, need not be</div><div class='del'>-included in conveying the object code work.</div><div class='del'>-</div><div class='del'>-  A "User Product" is either (1) a "consumer product", which means any</div><div class='del'>-tangible personal property which is normally used for personal, family,</div><div class='del'>-or household purposes, or (2) anything designed or sold for incorporation</div><div class='del'>-into a dwelling.  In determining whether a product is a consumer product,</div><div class='del'>-doubtful cases shall be resolved in favor of coverage.  For a particular</div><div class='del'>-product received by a particular user, "normally used" refers to a</div><div class='del'>-typical or common use of that class of product, regardless of the status</div><div class='del'>-of the particular user or of the way in which the particular user</div><div class='del'>-actually uses, or expects or is expected to use, the product.  A product</div><div class='del'>-is a consumer product regardless of whether the product has substantial</div><div class='del'>-commercial, industrial or non-consumer uses, unless such uses represent</div><div class='del'>-the only significant mode of use of the product.</div><div class='del'>-</div><div class='del'>-  "Installation Information" for a User Product means any methods,</div><div class='del'>-procedures, authorization keys, or other information required to install</div><div class='del'>-and execute modified versions of a covered work in that User Product from</div><div class='del'>-a modified version of its Corresponding Source.  The information must</div><div class='del'>-suffice to ensure that the continued functioning of the modified object</div><div class='del'>-code is in no case prevented or interfered with solely because</div><div class='del'>-modification has been made.</div><div class='del'>-</div><div class='del'>-  If you convey an object code work under this section in, or with, or</div><div class='del'>-specifically for use in, a User Product, and the conveying occurs as</div><div class='del'>-part of a transaction in which the right of possession and use of the</div><div class='del'>-User Product is transferred to the recipient in perpetuity or for a</div><div class='del'>-fixed term (regardless of how the transaction is characterized), the</div><div class='del'>-Corresponding Source conveyed under this section must be accompanied</div><div class='del'>-by the Installation Information.  But this requirement does not apply</div><div class='del'>-if neither you nor any third party retains the ability to install</div><div class='del'>-modified object code on the User Product (for example, the work has</div><div class='del'>-been installed in ROM).</div><div class='del'>-</div><div class='del'>-  The requirement to provide Installation Information does not include a</div><div class='del'>-requirement to continue to provide support service, warranty, or updates</div><div class='del'>-for a work that has been modified or installed by the recipient, or for</div><div class='del'>-the User Product in which it has been modified or installed.  Access to a</div><div class='del'>-network may be denied when the modification itself materially and</div><div class='del'>-adversely affects the operation of the network or violates the rules and</div><div class='del'>-protocols for communication across the network.</div><div class='del'>-</div><div class='del'>-  Corresponding Source conveyed, and Installation Information provided,</div><div class='del'>-in accord with this section must be in a format that is publicly</div><div class='del'>-documented (and with an implementation available to the public in</div><div class='del'>-source code form), and must require no special password or key for</div><div class='del'>-unpacking, reading or copying.</div><div class='del'>-</div><div class='del'>-  7. Additional Terms.</div><div class='del'>-</div><div class='del'>-  "Additional permissions" are terms that supplement the terms of this</div><div class='del'>-License by making exceptions from one or more of its conditions.</div><div class='del'>-Additional permissions that are applicable to the entire Program shall</div><div class='del'>-be treated as though they were included in this License, to the extent</div><div class='del'>-that they are valid under applicable law.  If additional permissions</div><div class='del'>-apply only to part of the Program, that part may be used separately</div><div class='del'>-under those permissions, but the entire Program remains governed by</div><div class='del'>-this License without regard to the additional permissions.</div><div class='del'>-</div><div class='del'>-  When you convey a copy of a covered work, you may at your option</div><div class='del'>-remove any additional permissions from that copy, or from any part of</div><div class='del'>-it.  (Additional permissions may be written to require their own</div><div class='del'>-removal in certain cases when you modify the work.)  You may place</div><div class='del'>-additional permissions on material, added by you to a covered work,</div><div class='del'>-for which you have or can give appropriate copyright permission.</div><div class='del'>-</div><div class='del'>-  Notwithstanding any other provision of this License, for material you</div><div class='del'>-add to a covered work, you may (if authorized by the copyright holders of</div><div class='del'>-that material) supplement the terms of this License with terms:</div><div class='del'>-</div><div class='del'>-    a) Disclaiming warranty or limiting liability differently from the</div><div class='del'>-    terms of sections 15 and 16 of this License; or</div><div class='del'>-</div><div class='del'>-    b) Requiring preservation of specified reasonable legal notices or</div><div class='del'>-    author attributions in that material or in the Appropriate Legal</div><div class='del'>-    Notices displayed by works containing it; or</div><div class='del'>-</div><div class='del'>-    c) Prohibiting misrepresentation of the origin of that material, or</div><div class='del'>-    requiring that modified versions of such material be marked in</div><div class='del'>-    reasonable ways as different from the original version; or</div><div class='del'>-</div><div class='del'>-    d) Limiting the use for publicity purposes of names of licensors or</div><div class='del'>-    authors of the material; or</div><div class='del'>-</div><div class='del'>-    e) Declining to grant rights under trademark law for use of some</div><div class='del'>-    trade names, trademarks, or service marks; or</div><div class='del'>-</div><div class='del'>-    f) Requiring indemnification of licensors and authors of that</div><div class='del'>-    material by anyone who conveys the material (or modified versions of</div><div class='del'>-    it) with contractual assumptions of liability to the recipient, for</div><div class='del'>-    any liability that these contractual assumptions directly impose on</div><div class='del'>-    those licensors and authors.</div><div class='del'>-</div><div class='del'>-  All other non-permissive additional terms are considered "further</div><div class='del'>-restrictions" within the meaning of section 10.  If the Program as you</div><div class='del'>-received it, or any part of it, contains a notice stating that it is</div><div class='del'>-governed by this License along with a term that is a further</div><div class='del'>-restriction, you may remove that term.  If a license document contains</div><div class='del'>-a further restriction but permits relicensing or conveying under this</div><div class='del'>-License, you may add to a covered work material governed by the terms</div><div class='del'>-of that license document, provided that the further restriction does</div><div class='del'>-not survive such relicensing or conveying.</div><div class='del'>-</div><div class='del'>-  If you add terms to a covered work in accord with this section, you</div><div class='del'>-must place, in the relevant source files, a statement of the</div><div class='del'>-additional terms that apply to those files, or a notice indicating</div><div class='del'>-where to find the applicable terms.</div><div class='del'>-</div><div class='del'>-  Additional terms, permissive or non-permissive, may be stated in the</div><div class='del'>-form of a separately written license, or stated as exceptions;</div><div class='del'>-the above requirements apply either way.</div><div class='del'>-</div><div class='del'>-  8. Termination.</div><div class='del'>-</div><div class='del'>-  You may not propagate or modify a covered work except as expressly</div><div class='del'>-provided under this License.  Any attempt otherwise to propagate or</div><div class='del'>-modify it is void, and will automatically terminate your rights under</div><div class='del'>-this License (including any patent licenses granted under the third</div><div class='del'>-paragraph of section 11).</div><div class='del'>-</div><div class='del'>-  However, if you cease all violation of this License, then your</div><div class='del'>-license from a particular copyright holder is reinstated (a)</div><div class='del'>-provisionally, unless and until the copyright holder explicitly and</div><div class='del'>-finally terminates your license, and (b) permanently, if the copyright</div><div class='del'>-holder fails to notify you of the violation by some reasonable means</div><div class='del'>-prior to 60 days after the cessation.</div><div class='del'>-</div><div class='del'>-  Moreover, your license from a particular copyright holder is</div><div class='del'>-reinstated permanently if the copyright holder notifies you of the</div><div class='del'>-violation by some reasonable means, this is the first time you have</div><div class='del'>-received notice of violation of this License (for any work) from that</div><div class='del'>-copyright holder, and you cure the violation prior to 30 days after</div><div class='del'>-your receipt of the notice.</div><div class='del'>-</div><div class='del'>-  Termination of your rights under this section does not terminate the</div><div class='del'>-licenses of parties who have received copies or rights from you under</div><div class='del'>-this License.  If your rights have been terminated and not permanently</div><div class='del'>-reinstated, you do not qualify to receive new licenses for the same</div><div class='del'>-material under section 10.</div><div class='del'>-</div><div class='del'>-  9. Acceptance Not Required for Having Copies.</div><div class='del'>-</div><div class='del'>-  You are not required to accept this License in order to receive or</div><div class='del'>-run a copy of the Program.  Ancillary propagation of a covered work</div><div class='del'>-occurring solely as a consequence of using peer-to-peer transmission</div><div class='del'>-to receive a copy likewise does not require acceptance.  However,</div><div class='del'>-nothing other than this License grants you permission to propagate or</div><div class='del'>-modify any covered work.  These actions infringe copyright if you do</div><div class='del'>-not accept this License.  Therefore, by modifying or propagating a</div><div class='del'>-covered work, you indicate your acceptance of this License to do so.</div><div class='del'>-</div><div class='del'>-  10. Automatic Licensing of Downstream Recipients.</div><div class='del'>-</div><div class='del'>-  Each time you convey a covered work, the recipient automatically</div><div class='del'>-receives a license from the original licensors, to run, modify and</div><div class='del'>-propagate that work, subject to this License.  You are not responsible</div><div class='del'>-for enforcing compliance by third parties with this License.</div><div class='del'>-</div><div class='del'>-  An "entity transaction" is a transaction transferring control of an</div><div class='del'>-organization, or substantially all assets of one, or subdividing an</div><div class='del'>-organization, or merging organizations.  If propagation of a covered</div><div class='del'>-work results from an entity transaction, each party to that</div><div class='del'>-transaction who receives a copy of the work also receives whatever</div><div class='del'>-licenses to the work the party's predecessor in interest had or could</div><div class='del'>-give under the previous paragraph, plus a right to possession of the</div><div class='del'>-Corresponding Source of the work from the predecessor in interest, if</div><div class='del'>-the predecessor has it or can get it with reasonable efforts.</div><div class='del'>-</div><div class='del'>-  You may not impose any further restrictions on the exercise of the</div><div class='del'>-rights granted or affirmed under this License.  For example, you may</div><div class='del'>-not impose a license fee, royalty, or other charge for exercise of</div><div class='del'>-rights granted under this License, and you may not initiate litigation</div><div class='del'>-(including a cross-claim or counterclaim in a lawsuit) alleging that</div><div class='del'>-any patent claim is infringed by making, using, selling, offering for</div><div class='del'>-sale, or importing the Program or any portion of it.</div><div class='del'>-</div><div class='del'>-  11. Patents.</div><div class='del'>-</div><div class='del'>-  A "contributor" is a copyright holder who authorizes use under this</div><div class='del'>-License of the Program or a work on which the Program is based.  The</div><div class='del'>-work thus licensed is called the contributor's "contributor version".</div><div class='del'>-</div><div class='del'>-  A contributor's "essential patent claims" are all patent claims</div><div class='del'>-owned or controlled by the contributor, whether already acquired or</div><div class='del'>-hereafter acquired, that would be infringed by some manner, permitted</div><div class='del'>-by this License, of making, using, or selling its contributor version,</div><div class='del'>-but do not include claims that would be infringed only as a</div><div class='del'>-consequence of further modification of the contributor version.  For</div><div class='del'>-purposes of this definition, "control" includes the right to grant</div><div class='del'>-patent sublicenses in a manner consistent with the requirements of</div><div class='del'>-this License.</div><div class='del'>-</div><div class='del'>-  Each contributor grants you a non-exclusive, worldwide, royalty-free</div><div class='del'>-patent license under the contributor's essential patent claims, to</div><div class='del'>-make, use, sell, offer for sale, import and otherwise run, modify and</div><div class='del'>-propagate the contents of its contributor version.</div><div class='del'>-</div><div class='del'>-  In the following three paragraphs, a "patent license" is any express</div><div class='del'>-agreement or commitment, however denominated, not to enforce a patent</div><div class='del'>-(such as an express permission to practice a patent or covenant not to</div><div class='del'>-sue for patent infringement).  To "grant" such a patent license to a</div><div class='del'>-party means to make such an agreement or commitment not to enforce a</div><div class='del'>-patent against the party.</div><div class='del'>-</div><div class='del'>-  If you convey a covered work, knowingly relying on a patent license,</div><div class='del'>-and the Corresponding Source of the work is not available for anyone</div><div class='del'>-to copy, free of charge and under the terms of this License, through a</div><div class='del'>-publicly available network server or other readily accessible means,</div><div class='del'>-then you must either (1) cause the Corresponding Source to be so</div><div class='del'>-available, or (2) arrange to deprive yourself of the benefit of the</div><div class='del'>-patent license for this particular work, or (3) arrange, in a manner</div><div class='del'>-consistent with the requirements of this License, to extend the patent</div><div class='del'>-license to downstream recipients.  "Knowingly relying" means you have</div><div class='del'>-actual knowledge that, but for the patent license, your conveying the</div><div class='del'>-covered work in a country, or your recipient's use of the covered work</div><div class='del'>-in a country, would infringe one or more identifiable patents in that</div><div class='del'>-country that you have reason to believe are valid.</div><div class='del'>-</div><div class='del'>-  If, pursuant to or in connection with a single transaction or</div><div class='del'>-arrangement, you convey, or propagate by procuring conveyance of, a</div><div class='del'>-covered work, and grant a patent license to some of the parties</div><div class='del'>-receiving the covered work authorizing them to use, propagate, modify</div><div class='del'>-or convey a specific copy of the covered work, then the patent license</div><div class='del'>-you grant is automatically extended to all recipients of the covered</div><div class='del'>-work and works based on it.</div><div class='del'>-</div><div class='del'>-  A patent license is "discriminatory" if it does not include within</div><div class='del'>-the scope of its coverage, prohibits the exercise of, or is</div><div class='del'>-conditioned on the non-exercise of one or more of the rights that are</div><div class='del'>-specifically granted under this License.  You may not convey a covered</div><div class='del'>-work if you are a party to an arrangement with a third party that is</div><div class='del'>-in the business of distributing software, under which you make payment</div><div class='del'>-to the third party based on the extent of your activity of conveying</div><div class='del'>-the work, and under which the third party grants, to any of the</div><div class='del'>-parties who would receive the covered work from you, a discriminatory</div><div class='del'>-patent license (a) in connection with copies of the covered work</div><div class='del'>-conveyed by you (or copies made from those copies), or (b) primarily</div><div class='del'>-for and in connection with specific products or compilations that</div><div class='del'>-contain the covered work, unless you entered into that arrangement,</div><div class='del'>-or that patent license was granted, prior to 28 March 2007.</div><div class='del'>-</div><div class='del'>-  Nothing in this License shall be construed as excluding or limiting</div><div class='del'>-any implied license or other defenses to infringement that may</div><div class='del'>-otherwise be available to you under applicable patent law.</div><div class='del'>-</div><div class='del'>-  12. No Surrender of Others' Freedom.</div><div class='del'>-</div><div class='del'>-  If conditions are imposed on you (whether by court order, agreement or</div><div class='del'>-otherwise) that contradict the conditions of this License, they do not</div><div class='del'>-excuse you from the conditions of this License.  If you cannot convey a</div><div class='del'>-covered work so as to satisfy simultaneously your obligations under this</div><div class='del'>-License and any other pertinent obligations, then as a consequence you may</div><div class='del'>-not convey it at all.  For example, if you agree to terms that obligate you</div><div class='del'>-to collect a royalty for further conveying from those to whom you convey</div><div class='del'>-the Program, the only way you could satisfy both those terms and this</div><div class='del'>-License would be to refrain entirely from conveying the Program.</div><div class='del'>-</div><div class='del'>-  13. Remote Network Interaction; Use with the GNU General Public License.</div><div class='del'>-</div><div class='del'>-  Notwithstanding any other provision of this License, if you modify the</div><div class='del'>-Program, your modified version must prominently offer all users</div><div class='del'>-interacting with it remotely through a computer network (if your version</div><div class='del'>-supports such interaction) an opportunity to receive the Corresponding</div><div class='del'>-Source of your version by providing access to the Corresponding Source</div><div class='del'>-from a network server at no charge, through some standard or customary</div><div class='del'>-means of facilitating copying of software.  This Corresponding Source</div><div class='del'>-shall include the Corresponding Source for any work covered by version 3</div><div class='del'>-of the GNU General Public License that is incorporated pursuant to the</div><div class='del'>-following paragraph.</div><div class='del'>-</div><div class='del'>-  Notwithstanding any other provision of this License, you have</div><div class='del'>-permission to link or combine any covered work with a work licensed</div><div class='del'>-under version 3 of the GNU General Public License into a single</div><div class='del'>-combined work, and to convey the resulting work.  The terms of this</div><div class='del'>-License will continue to apply to the part which is the covered work,</div><div class='del'>-but the work with which it is combined will remain governed by version</div><div class='del'>-3 of the GNU General Public License.</div><div class='del'>-</div><div class='del'>-  14. Revised Versions of this License.</div><div class='del'>-</div><div class='del'>-  The Free Software Foundation may publish revised and/or new versions of</div><div class='del'>-the GNU Affero General Public License from time to time.  Such new versions</div><div class='del'>-will be similar in spirit to the present version, but may differ in detail to</div><div class='del'>-address new problems or concerns.</div><div class='del'>-</div><div class='del'>-  Each version is given a distinguishing version number.  If the</div><div class='del'>-Program specifies that a certain numbered version of the GNU Affero General</div><div class='del'>-Public License "or any later version" applies to it, you have the</div><div class='del'>-option of following the terms and conditions either of that numbered</div><div class='del'>-version or of any later version published by the Free Software</div><div class='del'>-Foundation.  If the Program does not specify a version number of the</div><div class='del'>-GNU Affero General Public License, you may choose any version ever published</div><div class='del'>-by the Free Software Foundation.</div><div class='del'>-</div><div class='del'>-  If the Program specifies that a proxy can decide which future</div><div class='del'>-versions of the GNU Affero General Public License can be used, that proxy's</div><div class='del'>-public statement of acceptance of a version permanently authorizes you</div><div class='del'>-to choose that version for the Program.</div><div class='del'>-</div><div class='del'>-  Later license versions may give you additional or different</div><div class='del'>-permissions.  However, no additional obligations are imposed on any</div><div class='del'>-author or copyright holder as a result of your choosing to follow a</div><div class='del'>-later version.</div><div class='del'>-</div><div class='del'>-  15. Disclaimer of Warranty.</div><div class='del'>-</div><div class='del'>-  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY</div><div class='del'>-APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT</div><div class='del'>-HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY</div><div class='del'>-OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,</div><div class='del'>-THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR</div><div class='del'>-PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM</div><div class='del'>-IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF</div><div class='del'>-ALL NECESSARY SERVICING, REPAIR OR CORRECTION.</div><div class='del'>-</div><div class='del'>-  16. Limitation of Liability.</div><div class='del'>-</div><div class='del'>-  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING</div><div class='del'>-WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS</div><div class='del'>-THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY</div><div class='del'>-GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE</div><div class='del'>-USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF</div><div class='del'>-DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD</div><div class='del'>-PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),</div><div class='del'>-EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF</div><div class='del'>-SUCH DAMAGES.</div><div class='del'>-</div><div class='del'>-  17. Interpretation of Sections 15 and 16.</div><div class='del'>-</div><div class='del'>-  If the disclaimer of warranty and limitation of liability provided</div><div class='del'>-above cannot be given local legal effect according to their terms,</div><div class='del'>-reviewing courts shall apply local law that most closely approximates</div><div class='del'>-an absolute waiver of all civil liability in connection with the</div><div class='del'>-Program, unless a warranty or assumption of liability accompanies a</div><div class='del'>-copy of the Program in return for a fee.</div><div class='del'>-</div><div class='del'>-                     END OF TERMS AND CONDITIONS</div><div class='del'>-</div><div class='del'>-            How to Apply These Terms to Your New Programs</div><div class='del'>-</div><div class='del'>-  If you develop a new program, and you want it to be of the greatest</div><div class='del'>-possible use to the public, the best way to achieve this is to make it</div><div class='del'>-free software which everyone can redistribute and change under these terms.</div><div class='del'>-</div><div class='del'>-  To do so, attach the following notices to the program.  It is safest</div><div class='del'>-to attach them to the start of each source file to most effectively</div><div class='del'>-state the exclusion of warranty; and each file should have at least</div><div class='del'>-the "copyright" line and a pointer to where the full notice is found.</div><div class='del'>-</div><div class='del'>-    &lt;one line to give the program's name and a brief idea of what it does.&gt;</div><div class='del'>-    Copyright (C) &lt;year&gt;  &lt;name of author&gt;</div><div class='del'>-</div><div class='del'>-    This program is free software: you can redistribute it and/or modify</div><div class='del'>-    it under the terms of the GNU Affero General Public License as published by</div><div class='del'>-    the Free Software Foundation, either version 3 of the License, or</div><div class='del'>-    (at your option) any later version.</div><div class='del'>-</div><div class='del'>-    This program is distributed in the hope that it will be useful,</div><div class='del'>-    but WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the</div><div class='del'>-    GNU Affero General Public License for more details.</div><div class='del'>-</div><div class='del'>-    You should have received a copy of the GNU Affero General Public License</div><div class='del'>-    along with this program.  If not, see &lt;http://www.gnu.org/licenses/&gt;.</div><div class='del'>-</div><div class='del'>-Also add information on how to contact you by electronic and paper mail.</div><div class='del'>-</div><div class='del'>-  If your software can interact with users remotely through a computer</div><div class='del'>-network, you should also make sure that it provides a way for users to</div><div class='del'>-get its source.  For example, if your program is a web application, its</div><div class='del'>-interface could display a "Source" link that leads users to an archive</div><div class='del'>-of the code.  There are many ways you could offer source, and different</div><div class='del'>-solutions will be better for different programs; see section 13 for the</div><div class='del'>-specific requirements.</div><div class='del'>-</div><div class='del'>-  You should also get your employer (if you work as a programmer) or school,</div><div class='del'>-if any, to sign a "copyright disclaimer" for the program, if necessary.</div><div class='del'>-For more information on this, and how to apply and follow the GNU AGPL, see</div><div class='del'>-&lt;http://www.gnu.org/licenses/&gt;.</div><div class='head'>diff --git a/COPYING.GPL b/COPYING.GPL<br/>deleted file mode 100644<br/>index 94a9ed024d3..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/COPYING.GPL?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>COPYING.GPL</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,674 +0,0 @@</div><div class='del'>-                    GNU GENERAL PUBLIC LICENSE</div><div class='del'>-                       Version 3, 29 June 2007</div><div class='del'>-</div><div class='del'>- Copyright (C) 2007 Free Software Foundation, Inc. &lt;http://fsf.org/&gt;</div><div class='del'>- Everyone is permitted to copy and distribute verbatim copies</div><div class='del'>- of this license document, but changing it is not allowed.</div><div class='del'>-</div><div class='del'>-                            Preamble</div><div class='del'>-</div><div class='del'>-  The GNU General Public License is a free, copyleft license for</div><div class='del'>-software and other kinds of works.</div><div class='del'>-</div><div class='del'>-  The licenses for most software and other practical works are designed</div><div class='del'>-to take away your freedom to share and change the works.  By contrast,</div><div class='del'>-the GNU General Public License is intended to guarantee your freedom to</div><div class='del'>-share and change all versions of a program--to make sure it remains free</div><div class='del'>-software for all its users.  We, the Free Software Foundation, use the</div><div class='del'>-GNU General Public License for most of our software; it applies also to</div><div class='del'>-any other work released this way by its authors.  You can apply it to</div><div class='del'>-your programs, too.</div><div class='del'>-</div><div class='del'>-  When we speak of free software, we are referring to freedom, not</div><div class='del'>-price.  Our General Public Licenses are designed to make sure that you</div><div class='del'>-have the freedom to distribute copies of free software (and charge for</div><div class='del'>-them if you wish), that you receive source code or can get it if you</div><div class='del'>-want it, that you can change the software or use pieces of it in new</div><div class='del'>-free programs, and that you know you can do these things.</div><div class='del'>-</div><div class='del'>-  To protect your rights, we need to prevent others from denying you</div><div class='del'>-these rights or asking you to surrender the rights.  Therefore, you have</div><div class='del'>-certain responsibilities if you distribute copies of the software, or if</div><div class='del'>-you modify it: responsibilities to respect the freedom of others.</div><div class='del'>-</div><div class='del'>-  For example, if you distribute copies of such a program, whether</div><div class='del'>-gratis or for a fee, you must pass on to the recipients the same</div><div class='del'>-freedoms that you received.  You must make sure that they, too, receive</div><div class='del'>-or can get the source code.  And you must show them these terms so they</div><div class='del'>-know their rights.</div><div class='del'>-</div><div class='del'>-  Developers that use the GNU GPL protect your rights with two steps:</div><div class='del'>-(1) assert copyright on the software, and (2) offer you this License</div><div class='del'>-giving you legal permission to copy, distribute and/or modify it.</div><div class='del'>-</div><div class='del'>-  For the developers' and authors' protection, the GPL clearly explains</div><div class='del'>-that there is no warranty for this free software.  For both users' and</div><div class='del'>-authors' sake, the GPL requires that modified versions be marked as</div><div class='del'>-changed, so that their problems will not be attributed erroneously to</div><div class='del'>-authors of previous versions.</div><div class='del'>-</div><div class='del'>-  Some devices are designed to deny users access to install or run</div><div class='del'>-modified versions of the software inside them, although the manufacturer</div><div class='del'>-can do so.  This is fundamentally incompatible with the aim of</div><div class='del'>-protecting users' freedom to change the software.  The systematic</div><div class='del'>-pattern of such abuse occurs in the area of products for individuals to</div><div class='del'>-use, which is precisely where it is most unacceptable.  Therefore, we</div><div class='del'>-have designed this version of the GPL to prohibit the practice for those</div><div class='del'>-products.  If such problems arise substantially in other domains, we</div><div class='del'>-stand ready to extend this provision to those domains in future versions</div><div class='del'>-of the GPL, as needed to protect the freedom of users.</div><div class='del'>-</div><div class='del'>-  Finally, every program is threatened constantly by software patents.</div><div class='del'>-States should not allow patents to restrict development and use of</div><div class='del'>-software on general-purpose computers, but in those that do, we wish to</div><div class='del'>-avoid the special danger that patents applied to a free program could</div><div class='del'>-make it effectively proprietary.  To prevent this, the GPL assures that</div><div class='del'>-patents cannot be used to render the program non-free.</div><div class='del'>-</div><div class='del'>-  The precise terms and conditions for copying, distribution and</div><div class='del'>-modification follow.</div><div class='del'>-</div><div class='del'>-                       TERMS AND CONDITIONS</div><div class='del'>-</div><div class='del'>-  0. Definitions.</div><div class='del'>-</div><div class='del'>-  "This License" refers to version 3 of the GNU General Public License.</div><div class='del'>-</div><div class='del'>-  "Copyright" also means copyright-like laws that apply to other kinds of</div><div class='del'>-works, such as semiconductor masks.</div><div class='del'>-</div><div class='del'>-  "The Program" refers to any copyrightable work licensed under this</div><div class='del'>-License.  Each licensee is addressed as "you".  "Licensees" and</div><div class='del'>-"recipients" may be individuals or organizations.</div><div class='del'>-</div><div class='del'>-  To "modify" a work means to copy from or adapt all or part of the work</div><div class='del'>-in a fashion requiring copyright permission, other than the making of an</div><div class='del'>-exact copy.  The resulting work is called a "modified version" of the</div><div class='del'>-earlier work or a work "based on" the earlier work.</div><div class='del'>-</div><div class='del'>-  A "covered work" means either the unmodified Program or a work based</div><div class='del'>-on the Program.</div><div class='del'>-</div><div class='del'>-  To "propagate" a work means to do anything with it that, without</div><div class='del'>-permission, would make you directly or secondarily liable for</div><div class='del'>-infringement under applicable copyright law, except executing it on a</div><div class='del'>-computer or modifying a private copy.  Propagation includes copying,</div><div class='del'>-distribution (with or without modification), making available to the</div><div class='del'>-public, and in some countries other activities as well.</div><div class='del'>-</div><div class='del'>-  To "convey" a work means any kind of propagation that enables other</div><div class='del'>-parties to make or receive copies.  Mere interaction with a user through</div><div class='del'>-a computer network, with no transfer of a copy, is not conveying.</div><div class='del'>-</div><div class='del'>-  An interactive user interface displays "Appropriate Legal Notices"</div><div class='del'>-to the extent that it includes a convenient and prominently visible</div><div class='del'>-feature that (1) displays an appropriate copyright notice, and (2)</div><div class='del'>-tells the user that there is no warranty for the work (except to the</div><div class='del'>-extent that warranties are provided), that licensees may convey the</div><div class='del'>-work under this License, and how to view a copy of this License.  If</div><div class='del'>-the interface presents a list of user commands or options, such as a</div><div class='del'>-menu, a prominent item in the list meets this criterion.</div><div class='del'>-</div><div class='del'>-  1. Source Code.</div><div class='del'>-</div><div class='del'>-  The "source code" for a work means the preferred form of the work</div><div class='del'>-for making modifications to it.  "Object code" means any non-source</div><div class='del'>-form of a work.</div><div class='del'>-</div><div class='del'>-  A "Standard Interface" means an interface that either is an official</div><div class='del'>-standard defined by a recognized standards body, or, in the case of</div><div class='del'>-interfaces specified for a particular programming language, one that</div><div class='del'>-is widely used among developers working in that language.</div><div class='del'>-</div><div class='del'>-  The "System Libraries" of an executable work include anything, other</div><div class='del'>-than the work as a whole, that (a) is included in the normal form of</div><div class='del'>-packaging a Major Component, but which is not part of that Major</div><div class='del'>-Component, and (b) serves only to enable use of the work with that</div><div class='del'>-Major Component, or to implement a Standard Interface for which an</div><div class='del'>-implementation is available to the public in source code form.  A</div><div class='del'>-"Major Component", in this context, means a major essential component</div><div class='del'>-(kernel, window system, and so on) of the specific operating system</div><div class='del'>-(if any) on which the executable work runs, or a compiler used to</div><div class='del'>-produce the work, or an object code interpreter used to run it.</div><div class='del'>-</div><div class='del'>-  The "Corresponding Source" for a work in object code form means all</div><div class='del'>-the source code needed to generate, install, and (for an executable</div><div class='del'>-work) run the object code and to modify the work, including scripts to</div><div class='del'>-control those activities.  However, it does not include the work's</div><div class='del'>-System Libraries, or general-purpose tools or generally available free</div><div class='del'>-programs which are used unmodified in performing those activities but</div><div class='del'>-which are not part of the work.  For example, Corresponding Source</div><div class='del'>-includes interface definition files associated with source files for</div><div class='del'>-the work, and the source code for shared libraries and dynamically</div><div class='del'>-linked subprograms that the work is specifically designed to require,</div><div class='del'>-such as by intimate data communication or control flow between those</div><div class='del'>-subprograms and other parts of the work.</div><div class='del'>-</div><div class='del'>-  The Corresponding Source need not include anything that users</div><div class='del'>-can regenerate automatically from other parts of the Corresponding</div><div class='del'>-Source.</div><div class='del'>-</div><div class='del'>-  The Corresponding Source for a work in source code form is that</div><div class='del'>-same work.</div><div class='del'>-</div><div class='del'>-  2. Basic Permissions.</div><div class='del'>-</div><div class='del'>-  All rights granted under this License are granted for the term of</div><div class='del'>-copyright on the Program, and are irrevocable provided the stated</div><div class='del'>-conditions are met.  This License explicitly affirms your unlimited</div><div class='del'>-permission to run the unmodified Program.  The output from running a</div><div class='del'>-covered work is covered by this License only if the output, given its</div><div class='del'>-content, constitutes a covered work.  This License acknowledges your</div><div class='del'>-rights of fair use or other equivalent, as provided by copyright law.</div><div class='del'>-</div><div class='del'>-  You may make, run and propagate covered works that you do not</div><div class='del'>-convey, without conditions so long as your license otherwise remains</div><div class='del'>-in force.  You may convey covered works to others for the sole purpose</div><div class='del'>-of having them make modifications exclusively for you, or provide you</div><div class='del'>-with facilities for running those works, provided that you comply with</div><div class='del'>-the terms of this License in conveying all material for which you do</div><div class='del'>-not control copyright.  Those thus making or running the covered works</div><div class='del'>-for you must do so exclusively on your behalf, under your direction</div><div class='del'>-and control, on terms that prohibit them from making any copies of</div><div class='del'>-your copyrighted material outside their relationship with you.</div><div class='del'>-</div><div class='del'>-  Conveying under any other circumstances is permitted solely under</div><div class='del'>-the conditions stated below.  Sublicensing is not allowed; section 10</div><div class='del'>-makes it unnecessary.</div><div class='del'>-</div><div class='del'>-  3. Protecting Users' Legal Rights From Anti-Circumvention Law.</div><div class='del'>-</div><div class='del'>-  No covered work shall be deemed part of an effective technological</div><div class='del'>-measure under any applicable law fulfilling obligations under article</div><div class='del'>-11 of the WIPO copyright treaty adopted on 20 December 1996, or</div><div class='del'>-similar laws prohibiting or restricting circumvention of such</div><div class='del'>-measures.</div><div class='del'>-</div><div class='del'>-  When you convey a covered work, you waive any legal power to forbid</div><div class='del'>-circumvention of technological measures to the extent such circumvention</div><div class='del'>-is effected by exercising rights under this License with respect to</div><div class='del'>-the covered work, and you disclaim any intention to limit operation or</div><div class='del'>-modification of the work as a means of enforcing, against the work's</div><div class='del'>-users, your or third parties' legal rights to forbid circumvention of</div><div class='del'>-technological measures.</div><div class='del'>-</div><div class='del'>-  4. Conveying Verbatim Copies.</div><div class='del'>-</div><div class='del'>-  You may convey verbatim copies of the Program's source code as you</div><div class='del'>-receive it, in any medium, provided that you conspicuously and</div><div class='del'>-appropriately publish on each copy an appropriate copyright notice;</div><div class='del'>-keep intact all notices stating that this License and any</div><div class='del'>-non-permissive terms added in accord with section 7 apply to the code;</div><div class='del'>-keep intact all notices of the absence of any warranty; and give all</div><div class='del'>-recipients a copy of this License along with the Program.</div><div class='del'>-</div><div class='del'>-  You may charge any price or no price for each copy that you convey,</div><div class='del'>-and you may offer support or warranty protection for a fee.</div><div class='del'>-</div><div class='del'>-  5. Conveying Modified Source Versions.</div><div class='del'>-</div><div class='del'>-  You may convey a work based on the Program, or the modifications to</div><div class='del'>-produce it from the Program, in the form of source code under the</div><div class='del'>-terms of section 4, provided that you also meet all of these conditions:</div><div class='del'>-</div><div class='del'>-    a) The work must carry prominent notices stating that you modified</div><div class='del'>-    it, and giving a relevant date.</div><div class='del'>-</div><div class='del'>-    b) The work must carry prominent notices stating that it is</div><div class='del'>-    released under this License and any conditions added under section</div><div class='del'>-    7.  This requirement modifies the requirement in section 4 to</div><div class='del'>-    "keep intact all notices".</div><div class='del'>-</div><div class='del'>-    c) You must license the entire work, as a whole, under this</div><div class='del'>-    License to anyone who comes into possession of a copy.  This</div><div class='del'>-    License will therefore apply, along with any applicable section 7</div><div class='del'>-    additional terms, to the whole of the work, and all its parts,</div><div class='del'>-    regardless of how they are packaged.  This License gives no</div><div class='del'>-    permission to license the work in any other way, but it does not</div><div class='del'>-    invalidate such permission if you have separately received it.</div><div class='del'>-</div><div class='del'>-    d) If the work has interactive user interfaces, each must display</div><div class='del'>-    Appropriate Legal Notices; however, if the Program has interactive</div><div class='del'>-    interfaces that do not display Appropriate Legal Notices, your</div><div class='del'>-    work need not make them do so.</div><div class='del'>-</div><div class='del'>-  A compilation of a covered work with other separate and independent</div><div class='del'>-works, which are not by their nature extensions of the covered work,</div><div class='del'>-and which are not combined with it such as to form a larger program,</div><div class='del'>-in or on a volume of a storage or distribution medium, is called an</div><div class='del'>-"aggregate" if the compilation and its resulting copyright are not</div><div class='del'>-used to limit the access or legal rights of the compilation's users</div><div class='del'>-beyond what the individual works permit.  Inclusion of a covered work</div><div class='del'>-in an aggregate does not cause this License to apply to the other</div><div class='del'>-parts of the aggregate.</div><div class='del'>-</div><div class='del'>-  6. Conveying Non-Source Forms.</div><div class='del'>-</div><div class='del'>-  You may convey a covered work in object code form under the terms</div><div class='del'>-of sections 4 and 5, provided that you also convey the</div><div class='del'>-machine-readable Corresponding Source under the terms of this License,</div><div class='del'>-in one of these ways:</div><div class='del'>-</div><div class='del'>-    a) Convey the object code in, or embodied in, a physical product</div><div class='del'>-    (including a physical distribution medium), accompanied by the</div><div class='del'>-    Corresponding Source fixed on a durable physical medium</div><div class='del'>-    customarily used for software interchange.</div><div class='del'>-</div><div class='del'>-    b) Convey the object code in, or embodied in, a physical product</div><div class='del'>-    (including a physical distribution medium), accompanied by a</div><div class='del'>-    written offer, valid for at least three years and valid for as</div><div class='del'>-    long as you offer spare parts or customer support for that product</div><div class='del'>-    model, to give anyone who possesses the object code either (1) a</div><div class='del'>-    copy of the Corresponding Source for all the software in the</div><div class='del'>-    product that is covered by this License, on a durable physical</div><div class='del'>-    medium customarily used for software interchange, for a price no</div><div class='del'>-    more than your reasonable cost of physically performing this</div><div class='del'>-    conveying of source, or (2) access to copy the</div><div class='del'>-    Corresponding Source from a network server at no charge.</div><div class='del'>-</div><div class='del'>-    c) Convey individual copies of the object code with a copy of the</div><div class='del'>-    written offer to provide the Corresponding Source.  This</div><div class='del'>-    alternative is allowed only occasionally and noncommercially, and</div><div class='del'>-    only if you received the object code with such an offer, in accord</div><div class='del'>-    with subsection 6b.</div><div class='del'>-</div><div class='del'>-    d) Convey the object code by offering access from a designated</div><div class='del'>-    place (gratis or for a charge), and offer equivalent access to the</div><div class='del'>-    Corresponding Source in the same way through the same place at no</div><div class='del'>-    further charge.  You need not require recipients to copy the</div><div class='del'>-    Corresponding Source along with the object code.  If the place to</div><div class='del'>-    copy the object code is a network server, the Corresponding Source</div><div class='del'>-    may be on a different server (operated by you or a third party)</div><div class='del'>-    that supports equivalent copying facilities, provided you maintain</div><div class='del'>-    clear directions next to the object code saying where to find the</div><div class='del'>-    Corresponding Source.  Regardless of what server hosts the</div><div class='del'>-    Corresponding Source, you remain obligated to ensure that it is</div><div class='del'>-    available for as long as needed to satisfy these requirements.</div><div class='del'>-</div><div class='del'>-    e) Convey the object code using peer-to-peer transmission, provided</div><div class='del'>-    you inform other peers where the object code and Corresponding</div><div class='del'>-    Source of the work are being offered to the general public at no</div><div class='del'>-    charge under subsection 6d.</div><div class='del'>-</div><div class='del'>-  A separable portion of the object code, whose source code is excluded</div><div class='del'>-from the Corresponding Source as a System Library, need not be</div><div class='del'>-included in conveying the object code work.</div><div class='del'>-</div><div class='del'>-  A "User Product" is either (1) a "consumer product", which means any</div><div class='del'>-tangible personal property which is normally used for personal, family,</div><div class='del'>-or household purposes, or (2) anything designed or sold for incorporation</div><div class='del'>-into a dwelling.  In determining whether a product is a consumer product,</div><div class='del'>-doubtful cases shall be resolved in favor of coverage.  For a particular</div><div class='del'>-product received by a particular user, "normally used" refers to a</div><div class='del'>-typical or common use of that class of product, regardless of the status</div><div class='del'>-of the particular user or of the way in which the particular user</div><div class='del'>-actually uses, or expects or is expected to use, the product.  A product</div><div class='del'>-is a consumer product regardless of whether the product has substantial</div><div class='del'>-commercial, industrial or non-consumer uses, unless such uses represent</div><div class='del'>-the only significant mode of use of the product.</div><div class='del'>-</div><div class='del'>-  "Installation Information" for a User Product means any methods,</div><div class='del'>-procedures, authorization keys, or other information required to install</div><div class='del'>-and execute modified versions of a covered work in that User Product from</div><div class='del'>-a modified version of its Corresponding Source.  The information must</div><div class='del'>-suffice to ensure that the continued functioning of the modified object</div><div class='del'>-code is in no case prevented or interfered with solely because</div><div class='del'>-modification has been made.</div><div class='del'>-</div><div class='del'>-  If you convey an object code work under this section in, or with, or</div><div class='del'>-specifically for use in, a User Product, and the conveying occurs as</div><div class='del'>-part of a transaction in which the right of possession and use of the</div><div class='del'>-User Product is transferred to the recipient in perpetuity or for a</div><div class='del'>-fixed term (regardless of how the transaction is characterized), the</div><div class='del'>-Corresponding Source conveyed under this section must be accompanied</div><div class='del'>-by the Installation Information.  But this requirement does not apply</div><div class='del'>-if neither you nor any third party retains the ability to install</div><div class='del'>-modified object code on the User Product (for example, the work has</div><div class='del'>-been installed in ROM).</div><div class='del'>-</div><div class='del'>-  The requirement to provide Installation Information does not include a</div><div class='del'>-requirement to continue to provide support service, warranty, or updates</div><div class='del'>-for a work that has been modified or installed by the recipient, or for</div><div class='del'>-the User Product in which it has been modified or installed.  Access to a</div><div class='del'>-network may be denied when the modification itself materially and</div><div class='del'>-adversely affects the operation of the network or violates the rules and</div><div class='del'>-protocols for communication across the network.</div><div class='del'>-</div><div class='del'>-  Corresponding Source conveyed, and Installation Information provided,</div><div class='del'>-in accord with this section must be in a format that is publicly</div><div class='del'>-documented (and with an implementation available to the public in</div><div class='del'>-source code form), and must require no special password or key for</div><div class='del'>-unpacking, reading or copying.</div><div class='del'>-</div><div class='del'>-  7. Additional Terms.</div><div class='del'>-</div><div class='del'>-  "Additional permissions" are terms that supplement the terms of this</div><div class='del'>-License by making exceptions from one or more of its conditions.</div><div class='del'>-Additional permissions that are applicable to the entire Program shall</div><div class='del'>-be treated as though they were included in this License, to the extent</div><div class='del'>-that they are valid under applicable law.  If additional permissions</div><div class='del'>-apply only to part of the Program, that part may be used separately</div><div class='del'>-under those permissions, but the entire Program remains governed by</div><div class='del'>-this License without regard to the additional permissions.</div><div class='del'>-</div><div class='del'>-  When you convey a copy of a covered work, you may at your option</div><div class='del'>-remove any additional permissions from that copy, or from any part of</div><div class='del'>-it.  (Additional permissions may be written to require their own</div><div class='del'>-removal in certain cases when you modify the work.)  You may place</div><div class='del'>-additional permissions on material, added by you to a covered work,</div><div class='del'>-for which you have or can give appropriate copyright permission.</div><div class='del'>-</div><div class='del'>-  Notwithstanding any other provision of this License, for material you</div><div class='del'>-add to a covered work, you may (if authorized by the copyright holders of</div><div class='del'>-that material) supplement the terms of this License with terms:</div><div class='del'>-</div><div class='del'>-    a) Disclaiming warranty or limiting liability differently from the</div><div class='del'>-    terms of sections 15 and 16 of this License; or</div><div class='del'>-</div><div class='del'>-    b) Requiring preservation of specified reasonable legal notices or</div><div class='del'>-    author attributions in that material or in the Appropriate Legal</div><div class='del'>-    Notices displayed by works containing it; or</div><div class='del'>-</div><div class='del'>-    c) Prohibiting misrepresentation of the origin of that material, or</div><div class='del'>-    requiring that modified versions of such material be marked in</div><div class='del'>-    reasonable ways as different from the original version; or</div><div class='del'>-</div><div class='del'>-    d) Limiting the use for publicity purposes of names of licensors or</div><div class='del'>-    authors of the material; or</div><div class='del'>-</div><div class='del'>-    e) Declining to grant rights under trademark law for use of some</div><div class='del'>-    trade names, trademarks, or service marks; or</div><div class='del'>-</div><div class='del'>-    f) Requiring indemnification of licensors and authors of that</div><div class='del'>-    material by anyone who conveys the material (or modified versions of</div><div class='del'>-    it) with contractual assumptions of liability to the recipient, for</div><div class='del'>-    any liability that these contractual assumptions directly impose on</div><div class='del'>-    those licensors and authors.</div><div class='del'>-</div><div class='del'>-  All other non-permissive additional terms are considered "further</div><div class='del'>-restrictions" within the meaning of section 10.  If the Program as you</div><div class='del'>-received it, or any part of it, contains a notice stating that it is</div><div class='del'>-governed by this License along with a term that is a further</div><div class='del'>-restriction, you may remove that term.  If a license document contains</div><div class='del'>-a further restriction but permits relicensing or conveying under this</div><div class='del'>-License, you may add to a covered work material governed by the terms</div><div class='del'>-of that license document, provided that the further restriction does</div><div class='del'>-not survive such relicensing or conveying.</div><div class='del'>-</div><div class='del'>-  If you add terms to a covered work in accord with this section, you</div><div class='del'>-must place, in the relevant source files, a statement of the</div><div class='del'>-additional terms that apply to those files, or a notice indicating</div><div class='del'>-where to find the applicable terms.</div><div class='del'>-</div><div class='del'>-  Additional terms, permissive or non-permissive, may be stated in the</div><div class='del'>-form of a separately written license, or stated as exceptions;</div><div class='del'>-the above requirements apply either way.</div><div class='del'>-</div><div class='del'>-  8. Termination.</div><div class='del'>-</div><div class='del'>-  You may not propagate or modify a covered work except as expressly</div><div class='del'>-provided under this License.  Any attempt otherwise to propagate or</div><div class='del'>-modify it is void, and will automatically terminate your rights under</div><div class='del'>-this License (including any patent licenses granted under the third</div><div class='del'>-paragraph of section 11).</div><div class='del'>-</div><div class='del'>-  However, if you cease all violation of this License, then your</div><div class='del'>-license from a particular copyright holder is reinstated (a)</div><div class='del'>-provisionally, unless and until the copyright holder explicitly and</div><div class='del'>-finally terminates your license, and (b) permanently, if the copyright</div><div class='del'>-holder fails to notify you of the violation by some reasonable means</div><div class='del'>-prior to 60 days after the cessation.</div><div class='del'>-</div><div class='del'>-  Moreover, your license from a particular copyright holder is</div><div class='del'>-reinstated permanently if the copyright holder notifies you of the</div><div class='del'>-violation by some reasonable means, this is the first time you have</div><div class='del'>-received notice of violation of this License (for any work) from that</div><div class='del'>-copyright holder, and you cure the violation prior to 30 days after</div><div class='del'>-your receipt of the notice.</div><div class='del'>-</div><div class='del'>-  Termination of your rights under this section does not terminate the</div><div class='del'>-licenses of parties who have received copies or rights from you under</div><div class='del'>-this License.  If your rights have been terminated and not permanently</div><div class='del'>-reinstated, you do not qualify to receive new licenses for the same</div><div class='del'>-material under section 10.</div><div class='del'>-</div><div class='del'>-  9. Acceptance Not Required for Having Copies.</div><div class='del'>-</div><div class='del'>-  You are not required to accept this License in order to receive or</div><div class='del'>-run a copy of the Program.  Ancillary propagation of a covered work</div><div class='del'>-occurring solely as a consequence of using peer-to-peer transmission</div><div class='del'>-to receive a copy likewise does not require acceptance.  However,</div><div class='del'>-nothing other than this License grants you permission to propagate or</div><div class='del'>-modify any covered work.  These actions infringe copyright if you do</div><div class='del'>-not accept this License.  Therefore, by modifying or propagating a</div><div class='del'>-covered work, you indicate your acceptance of this License to do so.</div><div class='del'>-</div><div class='del'>-  10. Automatic Licensing of Downstream Recipients.</div><div class='del'>-</div><div class='del'>-  Each time you convey a covered work, the recipient automatically</div><div class='del'>-receives a license from the original licensors, to run, modify and</div><div class='del'>-propagate that work, subject to this License.  You are not responsible</div><div class='del'>-for enforcing compliance by third parties with this License.</div><div class='del'>-</div><div class='del'>-  An "entity transaction" is a transaction transferring control of an</div><div class='del'>-organization, or substantially all assets of one, or subdividing an</div><div class='del'>-organization, or merging organizations.  If propagation of a covered</div><div class='del'>-work results from an entity transaction, each party to that</div><div class='del'>-transaction who receives a copy of the work also receives whatever</div><div class='del'>-licenses to the work the party's predecessor in interest had or could</div><div class='del'>-give under the previous paragraph, plus a right to possession of the</div><div class='del'>-Corresponding Source of the work from the predecessor in interest, if</div><div class='del'>-the predecessor has it or can get it with reasonable efforts.</div><div class='del'>-</div><div class='del'>-  You may not impose any further restrictions on the exercise of the</div><div class='del'>-rights granted or affirmed under this License.  For example, you may</div><div class='del'>-not impose a license fee, royalty, or other charge for exercise of</div><div class='del'>-rights granted under this License, and you may not initiate litigation</div><div class='del'>-(including a cross-claim or counterclaim in a lawsuit) alleging that</div><div class='del'>-any patent claim is infringed by making, using, selling, offering for</div><div class='del'>-sale, or importing the Program or any portion of it.</div><div class='del'>-</div><div class='del'>-  11. Patents.</div><div class='del'>-</div><div class='del'>-  A "contributor" is a copyright holder who authorizes use under this</div><div class='del'>-License of the Program or a work on which the Program is based.  The</div><div class='del'>-work thus licensed is called the contributor's "contributor version".</div><div class='del'>-</div><div class='del'>-  A contributor's "essential patent claims" are all patent claims</div><div class='del'>-owned or controlled by the contributor, whether already acquired or</div><div class='del'>-hereafter acquired, that would be infringed by some manner, permitted</div><div class='del'>-by this License, of making, using, or selling its contributor version,</div><div class='del'>-but do not include claims that would be infringed only as a</div><div class='del'>-consequence of further modification of the contributor version.  For</div><div class='del'>-purposes of this definition, "control" includes the right to grant</div><div class='del'>-patent sublicenses in a manner consistent with the requirements of</div><div class='del'>-this License.</div><div class='del'>-</div><div class='del'>-  Each contributor grants you a non-exclusive, worldwide, royalty-free</div><div class='del'>-patent license under the contributor's essential patent claims, to</div><div class='del'>-make, use, sell, offer for sale, import and otherwise run, modify and</div><div class='del'>-propagate the contents of its contributor version.</div><div class='del'>-</div><div class='del'>-  In the following three paragraphs, a "patent license" is any express</div><div class='del'>-agreement or commitment, however denominated, not to enforce a patent</div><div class='del'>-(such as an express permission to practice a patent or covenant not to</div><div class='del'>-sue for patent infringement).  To "grant" such a patent license to a</div><div class='del'>-party means to make such an agreement or commitment not to enforce a</div><div class='del'>-patent against the party.</div><div class='del'>-</div><div class='del'>-  If you convey a covered work, knowingly relying on a patent license,</div><div class='del'>-and the Corresponding Source of the work is not available for anyone</div><div class='del'>-to copy, free of charge and under the terms of this License, through a</div><div class='del'>-publicly available network server or other readily accessible means,</div><div class='del'>-then you must either (1) cause the Corresponding Source to be so</div><div class='del'>-available, or (2) arrange to deprive yourself of the benefit of the</div><div class='del'>-patent license for this particular work, or (3) arrange, in a manner</div><div class='del'>-consistent with the requirements of this License, to extend the patent</div><div class='del'>-license to downstream recipients.  "Knowingly relying" means you have</div><div class='del'>-actual knowledge that, but for the patent license, your conveying the</div><div class='del'>-covered work in a country, or your recipient's use of the covered work</div><div class='del'>-in a country, would infringe one or more identifiable patents in that</div><div class='del'>-country that you have reason to believe are valid.</div><div class='del'>-</div><div class='del'>-  If, pursuant to or in connection with a single transaction or</div><div class='del'>-arrangement, you convey, or propagate by procuring conveyance of, a</div><div class='del'>-covered work, and grant a patent license to some of the parties</div><div class='del'>-receiving the covered work authorizing them to use, propagate, modify</div><div class='del'>-or convey a specific copy of the covered work, then the patent license</div><div class='del'>-you grant is automatically extended to all recipients of the covered</div><div class='del'>-work and works based on it.</div><div class='del'>-</div><div class='del'>-  A patent license is "discriminatory" if it does not include within</div><div class='del'>-the scope of its coverage, prohibits the exercise of, or is</div><div class='del'>-conditioned on the non-exercise of one or more of the rights that are</div><div class='del'>-specifically granted under this License.  You may not convey a covered</div><div class='del'>-work if you are a party to an arrangement with a third party that is</div><div class='del'>-in the business of distributing software, under which you make payment</div><div class='del'>-to the third party based on the extent of your activity of conveying</div><div class='del'>-the work, and under which the third party grants, to any of the</div><div class='del'>-parties who would receive the covered work from you, a discriminatory</div><div class='del'>-patent license (a) in connection with copies of the covered work</div><div class='del'>-conveyed by you (or copies made from those copies), or (b) primarily</div><div class='del'>-for and in connection with specific products or compilations that</div><div class='del'>-contain the covered work, unless you entered into that arrangement,</div><div class='del'>-or that patent license was granted, prior to 28 March 2007.</div><div class='del'>-</div><div class='del'>-  Nothing in this License shall be construed as excluding or limiting</div><div class='del'>-any implied license or other defenses to infringement that may</div><div class='del'>-otherwise be available to you under applicable patent law.</div><div class='del'>-</div><div class='del'>-  12. No Surrender of Others' Freedom.</div><div class='del'>-</div><div class='del'>-  If conditions are imposed on you (whether by court order, agreement or</div><div class='del'>-otherwise) that contradict the conditions of this License, they do not</div><div class='del'>-excuse you from the conditions of this License.  If you cannot convey a</div><div class='del'>-covered work so as to satisfy simultaneously your obligations under this</div><div class='del'>-License and any other pertinent obligations, then as a consequence you may</div><div class='del'>-not convey it at all.  For example, if you agree to terms that obligate you</div><div class='del'>-to collect a royalty for further conveying from those to whom you convey</div><div class='del'>-the Program, the only way you could satisfy both those terms and this</div><div class='del'>-License would be to refrain entirely from conveying the Program.</div><div class='del'>-</div><div class='del'>-  13. Use with the GNU Affero General Public License.</div><div class='del'>-</div><div class='del'>-  Notwithstanding any other provision of this License, you have</div><div class='del'>-permission to link or combine any covered work with a work licensed</div><div class='del'>-under version 3 of the GNU Affero General Public License into a single</div><div class='del'>-combined work, and to convey the resulting work.  The terms of this</div><div class='del'>-License will continue to apply to the part which is the covered work,</div><div class='del'>-but the special requirements of the GNU Affero General Public License,</div><div class='del'>-section 13, concerning interaction through a network will apply to the</div><div class='del'>-combination as such.</div><div class='del'>-</div><div class='del'>-  14. Revised Versions of this License.</div><div class='del'>-</div><div class='del'>-  The Free Software Foundation may publish revised and/or new versions of</div><div class='del'>-the GNU General Public License from time to time.  Such new versions will</div><div class='del'>-be similar in spirit to the present version, but may differ in detail to</div><div class='del'>-address new problems or concerns.</div><div class='del'>-</div><div class='del'>-  Each version is given a distinguishing version number.  If the</div><div class='del'>-Program specifies that a certain numbered version of the GNU General</div><div class='del'>-Public License "or any later version" applies to it, you have the</div><div class='del'>-option of following the terms and conditions either of that numbered</div><div class='del'>-version or of any later version published by the Free Software</div><div class='del'>-Foundation.  If the Program does not specify a version number of the</div><div class='del'>-GNU General Public License, you may choose any version ever published</div><div class='del'>-by the Free Software Foundation.</div><div class='del'>-</div><div class='del'>-  If the Program specifies that a proxy can decide which future</div><div class='del'>-versions of the GNU General Public License can be used, that proxy's</div><div class='del'>-public statement of acceptance of a version permanently authorizes you</div><div class='del'>-to choose that version for the Program.</div><div class='del'>-</div><div class='del'>-  Later license versions may give you additional or different</div><div class='del'>-permissions.  However, no additional obligations are imposed on any</div><div class='del'>-author or copyright holder as a result of your choosing to follow a</div><div class='del'>-later version.</div><div class='del'>-</div><div class='del'>-  15. Disclaimer of Warranty.</div><div class='del'>-</div><div class='del'>-  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY</div><div class='del'>-APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT</div><div class='del'>-HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY</div><div class='del'>-OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,</div><div class='del'>-THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR</div><div class='del'>-PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM</div><div class='del'>-IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF</div><div class='del'>-ALL NECESSARY SERVICING, REPAIR OR CORRECTION.</div><div class='del'>-</div><div class='del'>-  16. Limitation of Liability.</div><div class='del'>-</div><div class='del'>-  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING</div><div class='del'>-WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS</div><div class='del'>-THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY</div><div class='del'>-GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE</div><div class='del'>-USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF</div><div class='del'>-DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD</div><div class='del'>-PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),</div><div class='del'>-EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF</div><div class='del'>-SUCH DAMAGES.</div><div class='del'>-</div><div class='del'>-  17. Interpretation of Sections 15 and 16.</div><div class='del'>-</div><div class='del'>-  If the disclaimer of warranty and limitation of liability provided</div><div class='del'>-above cannot be given local legal effect according to their terms,</div><div class='del'>-reviewing courts shall apply local law that most closely approximates</div><div class='del'>-an absolute waiver of all civil liability in connection with the</div><div class='del'>-Program, unless a warranty or assumption of liability accompanies a</div><div class='del'>-copy of the Program in return for a fee.</div><div class='del'>-</div><div class='del'>-                     END OF TERMS AND CONDITIONS</div><div class='del'>-</div><div class='del'>-            How to Apply These Terms to Your New Programs</div><div class='del'>-</div><div class='del'>-  If you develop a new program, and you want it to be of the greatest</div><div class='del'>-possible use to the public, the best way to achieve this is to make it</div><div class='del'>-free software which everyone can redistribute and change under these terms.</div><div class='del'>-</div><div class='del'>-  To do so, attach the following notices to the program.  It is safest</div><div class='del'>-to attach them to the start of each source file to most effectively</div><div class='del'>-state the exclusion of warranty; and each file should have at least</div><div class='del'>-the "copyright" line and a pointer to where the full notice is found.</div><div class='del'>-</div><div class='del'>-    &lt;one line to give the program's name and a brief idea of what it does.&gt;</div><div class='del'>-    Copyright (C) &lt;year&gt;  &lt;name of author&gt;</div><div class='del'>-</div><div class='del'>-    This program is free software: you can redistribute it and/or modify</div><div class='del'>-    it under the terms of the GNU General Public License as published by</div><div class='del'>-    the Free Software Foundation, either version 3 of the License, or</div><div class='del'>-    (at your option) any later version.</div><div class='del'>-</div><div class='del'>-    This program is distributed in the hope that it will be useful,</div><div class='del'>-    but WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the</div><div class='del'>-    GNU General Public License for more details.</div><div class='del'>-</div><div class='del'>-    You should have received a copy of the GNU General Public License</div><div class='del'>-    along with this program.  If not, see &lt;http://www.gnu.org/licenses/&gt;.</div><div class='del'>-</div><div class='del'>-Also add information on how to contact you by electronic and paper mail.</div><div class='del'>-</div><div class='del'>-  If the program does terminal interaction, make it output a short</div><div class='del'>-notice like this when it starts in an interactive mode:</div><div class='del'>-</div><div class='del'>-    &lt;program&gt;  Copyright (C) &lt;year&gt;  &lt;name of author&gt;</div><div class='del'>-    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.</div><div class='del'>-    This is free software, and you are welcome to redistribute it</div><div class='del'>-    under certain conditions; type `show c' for details.</div><div class='del'>-</div><div class='del'>-The hypothetical commands `show w' and `show c' should show the appropriate</div><div class='del'>-parts of the General Public License.  Of course, your program's commands</div><div class='del'>-might be different; for a GUI interface, you would use an "about box".</div><div class='del'>-</div><div class='del'>-  You should also get your employer (if you work as a programmer) or school,</div><div class='del'>-if any, to sign a "copyright disclaimer" for the program, if necessary.</div><div class='del'>-For more information on this, and how to apply and follow the GNU GPL, see</div><div class='del'>-&lt;http://www.gnu.org/licenses/&gt;.</div><div class='del'>-</div><div class='del'>-  The GNU General Public License does not permit incorporating your program</div><div class='del'>-into proprietary programs.  If your program is a subroutine library, you</div><div class='del'>-may consider it more useful to permit linking proprietary applications with</div><div class='del'>-the library.  If this is what you want to do, use the GNU Lesser General</div><div class='del'>-Public License instead of this License.  But first, please read</div><div class='del'>-&lt;http://www.gnu.org/philosophy/why-not-lgpl.html&gt;.</div><div class='head'>diff --git a/INSTALL b/INSTALL<br/>index 88e28999df9..a56390e54fb 100644<br/>--- a/<a href='/cgit/glusterfs.git/tree/INSTALL?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>INSTALL</a><br/>+++ b/<a href='/cgit/glusterfs.git/tree/INSTALL?id=d1d7a6f35c816822fab51c820e25023863c239c1'>INSTALL</a></div><div class='hunk'>@@ -1,32 +1,47 @@</div><div class='ctx'> Installation Instructions</div><div class='ctx'> *************************</div><div class='ctx'> </div><div class='del'>-Run ./configure after untaring the package.</div><div class='add'>+0. If you have cloned from git, run ./autogen.sh.</div><div class='add'>+</div><div class='add'>+1. Run ./configure.</div><div class='ctx'> </div><div class='ctx'>  bash# ./configure</div><div class='ctx'>  GlusterFS configure summary</div><div class='ctx'>  ===========================</div><div class='del'>- FUSE client        : yes</div><div class='del'>- Infiniband verbs   : yes</div><div class='del'>- epoll IO multiplex : yes</div><div class='del'>- Berkeley-DB        : yes</div><div class='del'>- libglusterfsclient : yes</div><div class='del'>- mod_glusterfs      : yes</div><div class='del'>- argp-standalone    : no</div><div class='add'>+ GlusterFS configure summary</div><div class='add'>+  ===========================</div><div class='add'>+   FUSE client          : yes</div><div class='add'>+   Infiniband verbs     : yes</div><div class='add'>+   epoll IO multiplex   : yes</div><div class='add'>+   argp-standalone      : no</div><div class='add'>+   fusermount           : yes</div><div class='add'>+   readline             : yes</div><div class='add'>+   georeplication       : yes</div><div class='add'>+   Linux-AIO            : yes</div><div class='add'>+   Enable Debug         : no</div><div class='add'>+   Block Device xlator  : yes</div><div class='add'>+   glupy                : yes</div><div class='add'>+   Use syslog           : yes</div><div class='add'>+   XML output           : yes</div><div class='add'>+   QEMU Block formats   : yes</div><div class='add'>+   Encryption xlator    : yes</div><div class='add'>+</div><div class='ctx'>  </div><div class='ctx'> The configure summary will tell you what all components will be built with </div><div class='ctx'> GlusterFS. Other than 'argp-standalone' if something else says 'no', that </div><div class='ctx'> feature in GlusterFS will not be built. 'argp-standalone' package will only </div><div class='ctx'> be used if the system doesn't have a proper argp package installed.</div><div class='ctx'> </div><div class='del'>-Now just run 'make' and later run 'make install' to install the package.</div><div class='add'>+2. Now just run 'make' and later run 'make install' to install the package.</div><div class='ctx'> </div><div class='ctx'>  bash# make </div><div class='ctx'>  bash# make install</div><div class='ctx'> </div><div class='del'>-Installation complete :-)</div><div class='add'>+Installation completed :-)</div><div class='ctx'> </div><div class='ctx'>  bash# glusterfs --version</div><div class='ctx'> </div><div class='ctx'> Make sure your version is the latest from the release, and the one you </div><div class='ctx'> just installed :-)</div><div class='add'>+</div><div class='add'>+For more information on GlusterFS installation refer# http://docs.gluster.org/en/latest/Developer-guide/Building-GlusterFS/</div><div class='head'>diff --git a/MAINTAINERS b/MAINTAINERS<br/>new file mode 100644<br/>index 00000000000..953e8755fd9<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/MAINTAINERS?id=d1d7a6f35c816822fab51c820e25023863c239c1'>MAINTAINERS</a></div><div class='hunk'>@@ -0,0 +1,510 @@</div><div class='add'>+GlusterFS Maintainers</div><div class='add'>+=====================</div><div class='add'>+</div><div class='add'>+The intention of this file is not to establish who owns what portions of the</div><div class='add'>+code base, but to provide a set of names that developers can consult when they</div><div class='add'>+have a question about a particular subset and also to provide a set of names</div><div class='add'>+to be CC'd when submitting a patch to obtain appropriate review.</div><div class='add'>+</div><div class='add'>+In general, if you have a question about inclusion of a patch, you should</div><div class='add'>+consult gluster-devel@gluster.org and not any specific individual privately.</div><div class='add'>+</div><div class='add'>+Descriptions of section entries:</div><div class='add'>+</div><div class='add'>+	M: Main contact that knows and takes care of this area</div><div class='add'>+	L: Mailing list that is relevant to this area</div><div class='add'>+	W: Web-page with status/info</div><div class='add'>+	Q: Patchwork web based patch tracking system site</div><div class='add'>+	T: SCM tree type and location.  Type is one of: git, hg, quilt, stgit.</div><div class='add'>+	S: Status, one of the following:</div><div class='add'>+	   Supported:	Someone is actually paid to look after this.</div><div class='add'>+	   Maintained:	Someone actually looks after it.</div><div class='add'>+	   Odd Fixes:	It has a maintainer but they don't have time to do</div><div class='add'>+			much other than throw the odd patch in. See below.</div><div class='add'>+	   Orphan:	No current maintainer [but maybe you could take the</div><div class='add'>+			role as you write your new code].</div><div class='add'>+	   Obsolete:	Old code. Something tagged obsolete generally means</div><div class='add'>+			it has been replaced by a better system and you</div><div class='add'>+			should be using that.</div><div class='add'>+	F: Files and directories with wildcard patterns.</div><div class='add'>+	   A trailing slash includes all files and subdirectory files.</div><div class='add'>+	   F:	drivers/net/	all files in and below drivers/net</div><div class='add'>+	   F:	drivers/net/*	all files in drivers/net, but not below</div><div class='add'>+	   F:	*/net/*		all files in "any top level directory"/net</div><div class='add'>+	   One pattern per line.  Multiple F: lines acceptable.</div><div class='add'>+	X: Files and directories that are NOT maintained, same rules as F:</div><div class='add'>+	   Files exclusions are tested before file matches.</div><div class='add'>+	   Can be useful for excluding a specific subdirectory, for instance:</div><div class='add'>+	   F:	net/</div><div class='add'>+	   X:	net/ipv6/</div><div class='add'>+	   matches all files in and below net excluding net/ipv6/</div><div class='add'>+	K: Keyword perl extended regex pattern to match content in a</div><div class='add'>+	   patch or file.  For instance:</div><div class='add'>+	   K: of_get_profile</div><div class='add'>+	      matches patches or files that contain "of_get_profile"</div><div class='add'>+	   K: \b(printk|pr_(info|err))\b</div><div class='add'>+	      matches patches or files that contain one or more of the words</div><div class='add'>+	      printk, pr_info or pr_err</div><div class='add'>+	   One regex pattern per line.  Multiple K: lines acceptable.</div><div class='add'>+        P: Peer for a component</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+General Project Architects</div><div class='add'>+--------------------------</div><div class='add'>+M: Amar Tumballi &lt;amarts@gmail.com&gt;</div><div class='add'>+M: Xavier Hernandez  &lt;xhernandez@redhat.com&gt;</div><div class='add'>+P: Pranith Karampuri &lt;pranith.karampuri@phonepe.com&gt;</div><div class='add'>+P: Atin Mukherjee &lt;amukherj@redhat.com&gt;</div><div class='add'>+</div><div class='add'>+xlators:</div><div class='add'>+--------</div><div class='add'>+Access Control List (ACL)</div><div class='add'>+M: Raghavendra Talur &lt;rtalur@redhat.com&gt;</div><div class='add'>+P: Jiffin Tony Thottan &lt;jthottan@redhat.com&gt;</div><div class='add'>+S: Maintained</div><div class='add'>+F: xlators/system/posix-acl/</div><div class='add'>+</div><div class='add'>+Arbiter</div><div class='add'>+M: Ravishankar N &lt;ravishankar@redhat.com&gt;</div><div class='add'>+P: Pranith Karampuri &lt;pranith.karampuri@phonepe.com&gt;</div><div class='add'>+S: Maintained</div><div class='add'>+F: xlators/features/arbiter/</div><div class='add'>+</div><div class='add'>+Automatic File Replication (AFR)</div><div class='add'>+M: Pranith Karampuri &lt;pranith.karampuri@phonepe.com&gt;</div><div class='add'>+M: Ravishankar N &lt;ravishankar@redhat.com&gt;</div><div class='add'>+P: Karthik US &lt;ksubrahm@redhat.com&gt;</div><div class='add'>+S: Maintained</div><div class='add'>+F: xlators/cluster/afr/</div><div class='add'>+</div><div class='add'>+Barrier</div><div class='add'>+M: Raghavendra Bhat &lt;rabhat@redhat.com&gt;</div><div class='add'>+P: Atin Mukherjee &lt;amukherj@redhat.com&gt;</div><div class='add'>+S: Maintained</div><div class='add'>+F: xlators/features/barrier</div><div class='add'>+</div><div class='add'>+BitRot</div><div class='add'>+M: Kotresh HR &lt;khiremat@redhat.com&gt;</div><div class='add'>+P: Raghavendra Bhat &lt;rabhat@redhat.com&gt;</div><div class='add'>+S: Maintained</div><div class='add'>+F: xlators/features/bit-rot/</div><div class='add'>+</div><div class='add'>+Changelog</div><div class='add'>+M: Aravinda V K &lt;avishwan@redhat.com&gt;</div><div class='add'>+P: Kotresh HR &lt;khiremat@redhat.com&gt;</div><div class='add'>+S: Maintained</div><div class='add'>+F: xlators/features/changelog/</div><div class='add'>+</div><div class='add'>+Distributed Hashing Table (DHT)</div><div class='add'>+P: Susant Palai &lt;spalai@redhat.com&gt;</div><div class='add'>+S: Maintained</div><div class='add'>+F: xlators/cluster/dht/</div><div class='add'>+</div><div class='add'>+Erasure Coding</div><div class='add'>+M: Pranith Karampuri &lt;pranith.karampuri@phonepe.com&gt;</div><div class='add'>+M: Xavier Hernandez  &lt;xhernandez@redhat.com&gt;</div><div class='add'>+P: Ashish Pandey &lt;aspandey@redhat.com&gt;</div><div class='add'>+S: Maintained</div><div class='add'>+F: xlators/cluster/ec/</div><div class='add'>+</div><div class='add'>+Error-gen</div><div class='add'>+M: Raghavendra Talur &lt;rtalur@redhat.com&gt;</div><div class='add'>+S: Maintained</div><div class='add'>+F: xlators/debug/error-gen/</div><div class='add'>+</div><div class='add'>+FUSE Bridge</div><div class='add'>+M: Csaba Henk &lt;chenk@redhat.com&gt;</div><div class='add'>+P: Niels de Vos &lt;ndevos@redhat.com&gt;</div><div class='add'>+S: Maintained</div><div class='add'>+F: xlators/mount/</div><div class='add'>+</div><div class='add'>+Index</div><div class='add'>+M: Pranith Karampuri &lt;pranith.karampuri@phonepe.com&gt;</div><div class='add'>+P: Ravishankar N &lt;ravishankar@redhat.com&gt;</div><div class='add'>+S: Maintained</div><div class='add'>+F: xlators/features/index/</div><div class='add'>+</div><div class='add'>+IO Cache</div><div class='add'>+P: Mohammed Rafi KC &lt;rafi.kavungal@iternity.com&gt;</div><div class='add'>+S: Maintained</div><div class='add'>+F: xlators/performance/io-cache/</div><div class='add'>+</div><div class='add'>+IO Statistics</div><div class='add'>+M: Krutika Dhananjay &lt;kdhananj@redhat.com&gt;</div><div class='add'>+M: Shyam Ranganathan &lt;srangana@redhat.com&gt;</div><div class='add'>+S: Maintained</div><div class='add'>+F: xlators/debug/io-stats/</div><div class='add'>+</div><div class='add'>+IO threads</div><div class='add'>+M: Pranith Karampuri &lt;pranith.karampuri@phonepe.com&gt;</div><div class='add'>+P: Ravishankar N &lt;ravishankar@redhat.com&gt;</div><div class='add'>+S: Maintained</div><div class='add'>+F: xlators/performance/io-threads/</div><div class='add'>+</div><div class='add'>+Leases</div><div class='add'>+M: Poornima G &lt;pgurusid@redhat.com&gt;</div><div class='add'>+P: Niels de Vos &lt;ndevos@redhat.com&gt;</div><div class='add'>+P: Soumya Koduri &lt;skoduri@redhat.com&gt;</div><div class='add'>+S: Maintained</div><div class='add'>+F: xlators/features/leases/</div><div class='add'>+</div><div class='add'>+Locks</div><div class='add'>+M: Krutika Dhananjay &lt;kdhananj@redhat.com&gt;</div><div class='add'>+P: Xavier Hernandez  &lt;xhernandez@redhat.com&gt;</div><div class='add'>+S: Maintained</div><div class='add'>+F: xlators/features/locks/</div><div class='add'>+</div><div class='add'>+Marker</div><div class='add'>+M: Kotresh HR &lt;khiremat@redhat.com&gt;</div><div class='add'>+S: Maintained</div><div class='add'>+F: xlators/features/marker/</div><div class='add'>+</div><div class='add'>+Meta</div><div class='add'>+M: Mohammed Rafi KC &lt;rafi.kavungal@iternity.com&gt;</div><div class='add'>+S: Maintained</div><div class='add'>+F: xlators/features/meta/</div><div class='add'>+</div><div class='add'>+Metadata-cache</div><div class='add'>+M: Poornima G &lt;pgurusid@redhat.com&gt;</div><div class='add'>+P: Soumya Koduri &lt;skoduri@redhat.com&gt;</div><div class='add'>+S: Maintained</div><div class='add'>+F: xlators/performance/md-cache/</div><div class='add'>+</div><div class='add'>+Negative-lookup Cache</div><div class='add'>+M: Poornima G &lt;pgurusid@redhat.com&gt;</div><div class='add'>+P: Pranith Karampuri &lt;pranith.karampuri@phonepe.com&gt;</div><div class='add'>+S: Maintained</div><div class='add'>+F: xlators/performance/nl-cache/</div><div class='add'>+</div><div class='add'>+gNFS</div><div class='add'>+M: Jiffin Tony Thottan &lt;jthottan@redhat.com&gt;</div><div class='add'>+P: Xie Changlong &lt;xiechanglong@cmss.chinamobile.com&gt;</div><div class='add'>+P: Amar Tumballi &lt;amarts@gmail.com&gt;</div><div class='add'>+S: Odd Fixes</div><div class='add'>+F: xlators/nfs/server/</div><div class='add'>+</div><div class='add'>+Open-behind</div><div class='add'>+S: Maintained</div><div class='add'>+F: xlators/performance/open-behind/</div><div class='add'>+</div><div class='add'>+Posix:</div><div class='add'>+M: Raghavendra Bhat &lt;raghavendra@redhat.com&gt;</div><div class='add'>+P: Kotresh HR &lt;khiremat@redhat.com&gt;</div><div class='add'>+P: Krutika Dhananjay &lt;kdhananj@redhat.com&gt;</div><div class='add'>+S: Maintained</div><div class='add'>+F: xlators/storage/posix/</div><div class='add'>+</div><div class='add'>+Quick-read</div><div class='add'>+S: Maintained</div><div class='add'>+F: xlators/performance/quick-read/</div><div class='add'>+</div><div class='add'>+Quota</div><div class='add'>+M: Shyamsundar Ranganathan &lt;srangana@redhat.com&gt;</div><div class='add'>+P: Hari Gowtham &lt;hgowtham@redhat.com&gt;</div><div class='add'>+S: Maintained</div><div class='add'>+F: xlators/features/quota/</div><div class='add'>+</div><div class='add'>+Read-ahead</div><div class='add'>+P: Csaba Henk &lt;chenk@redhat.com&gt;</div><div class='add'>+S: Maintained</div><div class='add'>+F: xlators/performance/read-ahead/</div><div class='add'>+</div><div class='add'>+Readdir-ahead</div><div class='add'>+S: Maintained</div><div class='add'>+F: xlators/performance/readdir-ahead/</div><div class='add'>+</div><div class='add'>+Sharding</div><div class='add'>+M: Krutika Dhananjay &lt;kdhananj@redhat.com&gt;</div><div class='add'>+P: Xavier Hernandez  &lt;xhernandez@redhat.com&gt;</div><div class='add'>+S: Maintained</div><div class='add'>+F: xlators/features/shard/</div><div class='add'>+</div><div class='add'>+Trash</div><div class='add'>+M: Anoop C S &lt;anoopcs@redhat.com&gt;</div><div class='add'>+M: Jiffin Tony Thottan &lt;jthottan@redhat.com&gt;</div><div class='add'>+S: Maintained</div><div class='add'>+F: xlators/features/trash/</div><div class='add'>+</div><div class='add'>+Upcall</div><div class='add'>+M: Poornima G &lt;pgurusid@redhat.com&gt;</div><div class='add'>+M: Soumya Koduri &lt;skoduri@redhat.com&gt;</div><div class='add'>+P: Niels de Vos &lt;ndevos@redhat.com&gt;</div><div class='add'>+S: Maintained</div><div class='add'>+F: xlators/features/upcall/</div><div class='add'>+</div><div class='add'>+Write-behind</div><div class='add'>+P: Csaba Henk &lt;chenk@redhat.com&gt;</div><div class='add'>+S: Maintained</div><div class='add'>+F: xlators/performance/write-behind/</div><div class='add'>+</div><div class='add'>+Write Once Read Many</div><div class='add'>+P: Karthik US &lt;ksubrahm@redhat.com&gt;</div><div class='add'>+S: Maintained</div><div class='add'>+F: xlators/features/read-only/</div><div class='add'>+</div><div class='add'>+Cloudsync</div><div class='add'>+M: Susant Kumar Palai &lt;spalai@redhat.com&gt;</div><div class='add'>+S: Maintained</div><div class='add'>+F: xlators/features/cloudsync/</div><div class='add'>+</div><div class='add'>+Other bits of code:</div><div class='add'>+-------------------</div><div class='add'>+</div><div class='add'>+Doc</div><div class='add'>+M: Humble Chirammal &lt;hchiramm@redhat.com&gt;</div><div class='add'>+M: Raghavendra Talur &lt;rtalur@redhat.com&gt;</div><div class='add'>+S: Maintained</div><div class='add'>+F: doc/</div><div class='add'>+</div><div class='add'>+Geo Replication</div><div class='add'>+M: Aravinda V K &lt;avishwan@redhat.com&gt;</div><div class='add'>+M: Kotresh HR &lt;khiremat@redhat.com&gt;</div><div class='add'>+M: Sunny Kumar &lt;sunkumar@redhat.com&gt;</div><div class='add'>+S: Maintained</div><div class='add'>+F: geo-replication/</div><div class='add'>+</div><div class='add'>+Glusterfind</div><div class='add'>+M: Aravinda VK &lt;avishwan@redhat.com&gt;</div><div class='add'>+S: Maintained</div><div class='add'>+F: tools/glusterfind/</div><div class='add'>+</div><div class='add'>+libgfapi</div><div class='add'>+M: Niels de Vos &lt;ndevos@redhat.com&gt;</div><div class='add'>+P: Poornima G &lt;pgurusid@redhat.com&gt;</div><div class='add'>+P: Shyamsundar Ranganathan &lt;srangana@redhat.com&gt;</div><div class='add'>+P: Soumya Koduri &lt;skoduri@redhat.com&gt;</div><div class='add'>+S: Maintained</div><div class='add'>+F: api/</div><div class='add'>+</div><div class='add'>+libglusterfs</div><div class='add'>+M: Amar Tumballi &lt;amarts@gmail.com&gt;</div><div class='add'>+M: Xavier Hernandez  &lt;xhernandez@redhat.com&gt;</div><div class='add'>+M: Jeff Darcy &lt;jeff@pl.atyp.us&gt;</div><div class='add'>+P: Kaleb Keithley &lt;kkeithle@redhat.com&gt;</div><div class='add'>+P: Niels de Vos &lt;ndevos@redhat.com&gt;</div><div class='add'>+P: Pranith Karampuri &lt;pranith.karampuri@phonepe.com&gt;</div><div class='add'>+P: Shyamsundar Ranganathan &lt;srangana@redhat.com&gt;</div><div class='add'>+S: Maintained</div><div class='add'>+F: libglusterfs/</div><div class='add'>+</div><div class='add'>+xxhash</div><div class='add'>+M: Aravinda VK &lt;avishwan@redhat.com&gt;</div><div class='add'>+M: Kotresh HR &lt;khiremat@redhat.com&gt;</div><div class='add'>+P: Yaniv Kaul &lt;ykaul@redhat.com&gt;</div><div class='add'>+S: Maintained</div><div class='add'>+F: contrib/xxhash/</div><div class='add'>+T: https://github.com/Cyan4973/xxHash.git</div><div class='add'>+</div><div class='add'>+Management Daemon - glusterd</div><div class='add'>+M: Atin Mukherjee &lt;amukherj@redhat.com&gt;</div><div class='add'>+M: Mohit Agrawal &lt;moagrawa@redhat.com&gt;</div><div class='add'>+M: Sanju Rakonde &lt;srakonde@redhat.com&gt;</div><div class='add'>+S: Maintained</div><div class='add'>+F: cli/</div><div class='add'>+F: xlators/mgmt/glusterd/</div><div class='add'>+</div><div class='add'>+Protocol</div><div class='add'>+M: Niels de Vos &lt;ndevos@redhat.com&gt;</div><div class='add'>+P: Mohammed Rafi KC &lt;rafi.kavungal@iternity.com&gt;</div><div class='add'>+S: Maintained</div><div class='add'>+F: xlators/protocol/</div><div class='add'>+</div><div class='add'>+Remote Procedure Call subsystem</div><div class='add'>+P: Mohit Agrawal &lt;moagrawa@redhat.com&gt;</div><div class='add'>+S: Maintained</div><div class='add'>+F: rpc/rpc-lib/</div><div class='add'>+F: rpc/xdr/</div><div class='add'>+</div><div class='add'>+Snapshot</div><div class='add'>+M: Raghavendra Bhat &lt;raghavendra@redhat.com&gt;</div><div class='add'>+P: Mohammed Rafi KC &lt;rafi.kavungal@iternity.com&gt;</div><div class='add'>+P: Sunny Kumar &lt;sunkumar@redhat.com&gt;</div><div class='add'>+S: Maintained</div><div class='add'>+F: xlators/mgmt/glusterd/src/glusterd-snap*</div><div class='add'>+F: extras/snap-scheduler.py</div><div class='add'>+</div><div class='add'>+Socket subsystem</div><div class='add'>+P: Krutika Dhananjay &lt;kdhananj@redhat.com&gt;</div><div class='add'>+P: Milind Changire &lt;mchangir@redhat.com&gt;</div><div class='add'>+P: Mohammed Rafi KC &lt;rafi.kavungal@iternity.com&gt;</div><div class='add'>+P: Mohit Agrawal &lt;moagrawa@redhat.com&gt;</div><div class='add'>+S: Maintained</div><div class='add'>+F: rpc/rpc-transport/socket/</div><div class='add'>+</div><div class='add'>+Testing - .t framework</div><div class='add'>+M: Raghavendra Talur &lt;rtalur@redhat.com&gt;</div><div class='add'>+S: Maintained</div><div class='add'>+F: tests/</div><div class='add'>+</div><div class='add'>+Utilities</div><div class='add'>+M: Aravinda VK &lt;avishwan@redhat.com&gt;</div><div class='add'>+P: Niels de Vos &lt;ndevos@redhat.com&gt;</div><div class='add'>+P: Raghavendra Talur &lt;rtalur@redhat.com&gt;</div><div class='add'>+P: Sachidanda Urs &lt;surs@redhat.com&gt;</div><div class='add'>+S: Maintained</div><div class='add'>+F: extras/</div><div class='add'>+</div><div class='add'>+Events APIs</div><div class='add'>+M: Aravinda VK &lt;avishwan@redhat.com&gt;</div><div class='add'>+S: Maintained</div><div class='add'>+F: events/</div><div class='add'>+F: libglusterfs/src/events*</div><div class='add'>+F: libglusterfs/src/eventtypes*</div><div class='add'>+F: extras/systemd/glustereventsd*</div><div class='add'>+</div><div class='add'>+Distribution Specific:</div><div class='add'>+----------------------</div><div class='add'>+Build:</div><div class='add'>+M: Niels de Vos &lt;ndevos@redhat.com&gt;</div><div class='add'>+M: Hari Gowtham &lt;hgowtham@redhat.com&gt;</div><div class='add'>+P: Anoop C S &lt;anoopcs@redhat.com&gt;</div><div class='add'>+P: Raghavendra Talur &lt;rtalur@redhat.com&gt;</div><div class='add'>+P: Rinku Kothiya &lt;rkothiya@redhat.com&gt;</div><div class='add'>+S: Maintained</div><div class='add'>+</div><div class='add'>+Debian packages on download.gluster.org</div><div class='add'>+M: packaging@gluster.org</div><div class='add'>+M: Kaleb Keithley &lt;kkeithle@redhat.com&gt;</div><div class='add'>+P: Sheetal Pamecha &lt;spamecha@redhat.com&gt;</div><div class='add'>+P: Shwetha Acharya &lt;sacharya@redhat.com&gt;</div><div class='add'>+S: Maintained</div><div class='add'>+W: http://download.gluster.org/pub/gluster/glusterfs/LATEST/Debian/Debian.README</div><div class='add'>+T: https://github.com/gluster/glusterfs-debian.git</div><div class='add'>+</div><div class='add'>+OpenSuSE</div><div class='add'>+M: packaging@gluster.org</div><div class='add'>+M: Kaleb Keithley &lt;kkeithle@redhat.com&gt;</div><div class='add'>+P: Sheetal Pamecha &lt;spamecha@redhat.com&gt;</div><div class='add'>+P: Shwetha Acharya &lt;sacharya@redhat.com&gt;</div><div class='add'>+S: Maintained</div><div class='add'>+W: https://build.opensuse.org/repositories/home:glusterfs</div><div class='add'>+W: https://download.gluster.org/pub/gluster/glusterfs/LATEST/SuSE/SuSE.README</div><div class='add'>+T: https://github.com/gluster/glusterfs-suse.git</div><div class='add'>+</div><div class='add'>+Packages for the CentOS Storage SIG</div><div class='add'>+M: centos-devel@centos.org</div><div class='add'>+M: Niels de Vos &lt;ndevos@redhat.com&gt;</div><div class='add'>+P: Kaleb Keithley &lt;kkeithle@redhat.com&gt;</div><div class='add'>+S: Maintained</div><div class='add'>+W: https://wiki.centos.org/SpecialInterestGroup/Storage/Gluster</div><div class='add'>+T: https://github.com/CentOS-Storage-SIG/glusterfs.git</div><div class='add'>+</div><div class='add'>+Ubuntu PPA</div><div class='add'>+M: packaging@gluster.org</div><div class='add'>+M: Kaleb Keithley &lt;kkeithle@redhat.com&gt;</div><div class='add'>+P: Sheetal Pamecha &lt;spamecha@redhat.com&gt;</div><div class='add'>+P: Shwetha Acharya &lt;sacharya@redhat.com&gt;</div><div class='add'>+S: Maintained</div><div class='add'>+W: https://launchpad.net/~gluster</div><div class='add'>+W: http://download.gluster.org/pub/gluster/glusterfs/LATEST/Ubuntu/Ubuntu.README</div><div class='add'>+T: https://github.com/gluster/glusterfs-debian.git</div><div class='add'>+</div><div class='add'>+Related projects</div><div class='add'>+----------------</div><div class='add'>+Gluster Block</div><div class='add'>+M: Prasanna Kumar Kalever &lt;prasanna.kalever@redhat.com&gt;</div><div class='add'>+M: Xiubo Li &lt;xiubli@redhat.com&gt;</div><div class='add'>+S: Maintained</div><div class='add'>+T: https://github.com/gluster/gluster-block.git</div><div class='add'>+</div><div class='add'>+GlusterFS core-utils</div><div class='add'>+M: Anoop C S &lt;anoopcs@redhat.com&gt;</div><div class='add'>+S: Maintained</div><div class='add'>+T: https://github.com/gluster/glusterfs-coreutils.git</div><div class='add'>+</div><div class='add'>+NFS-Ganesha FSAL plugin</div><div class='add'>+M: Jiffin Tony Thottan &lt;jthottan@redhat.com&gt;</div><div class='add'>+M: Kaleb Keithley &lt;kkeithle@redhat.com&gt;</div><div class='add'>+M: Soumya Koduri &lt;skoduri@redhat.com&gt;</div><div class='add'>+S: Maintained</div><div class='add'>+T: git://github.com/nfs-ganesha/nfs-ganesha.git</div><div class='add'>+F: src/nfs-ganesha~/src/FSAL/FSAL_GLUSTER/</div><div class='add'>+</div><div class='add'>+QEMU integration</div><div class='add'>+M: Niels de Vos &lt;ndevos@redhat.com&gt;</div><div class='add'>+M: Prasanna Kumar Kalever &lt;prasanna.kalever@redhat.com&gt;</div><div class='add'>+S: Maintained</div><div class='add'>+T: git://git.qemu.org/qemu.git</div><div class='add'>+F: block/gluster.c</div><div class='add'>+</div><div class='add'>+Samba VFS plugin</div><div class='add'>+M: Anoop C S &lt;anoopcs@redhat.com&gt;</div><div class='add'>+M: Raghavendra Talur &lt;rtalur@redhat.com&gt;</div><div class='add'>+M: Michael Adam &lt;madam@redhat.com&gt;</div><div class='add'>+M: Poornima G &lt;pgurusid@redhat.com&gt;</div><div class='add'>+S: Maintained</div><div class='add'>+T: git://git.samba.org/samba.git</div><div class='add'>+F: source3/modules/vfs_glusterfs.c</div><div class='add'>+</div><div class='add'>+Storhaug</div><div class='add'>+M: Jose A. Rivera &lt;jarrpa@redhat.com&gt;</div><div class='add'>+P: Kaleb Keithley &lt;kkeithle@redhat.com&gt;</div><div class='add'>+S: Maintained</div><div class='add'>+T: https://github.com/linux-ha-storage/storhaug.git</div><div class='add'>+</div><div class='add'>+Testing - Glusto-Tests</div><div class='add'>+M: Jonathan Holloway &lt;jholloway@redhat.com&gt;</div><div class='add'>+M: Vijay Bhaskar Reddy Avuthu &lt;vavuthu@redhat.com&gt;</div><div class='add'>+M: Akarsha Rai &lt;akrai@redhat.com&gt;</div><div class='add'>+S: Maintained</div><div class='add'>+T: https://github.com/gluster/glusto-tests.git</div><div class='add'>+</div><div class='add'>+Wireshark dissectors</div><div class='add'>+M: Niels de Vos &lt;ndevos@redhat.com&gt;</div><div class='add'>+S: Maintained</div><div class='add'>+W: https://forge.gluster.org/wireshark</div><div class='add'>+T: http://code.wireshark.org/git/wireshark</div><div class='add'>+F: epan/dissectors/packet-gluster*</div><div class='add'>+</div><div class='add'>+Infrastructure</div><div class='add'>+--------------</div><div class='add'>+</div><div class='add'>+Platform</div><div class='add'>+M: Michael Scherer &lt;misc@redhat.com&gt;</div><div class='add'>+P: Shyamsundar Ranganathan &lt;srangana@redhat.com&gt;</div><div class='add'>+P: Amar Tumballi &lt;amarts@gmail.com&gt;</div><div class='add'>+</div><div class='add'>+Continuous Integration</div><div class='add'>+M: Michael Scherer &lt;misc@redhat.com&gt;</div><div class='add'>+M: Deepshikha Khandelwal &lt;dkhandel@redhat.com&gt;</div><div class='add'>+P: Niels de Vos &lt;ndevos@redhat.com&gt;</div><div class='add'>+</div><div class='add'>+Special Thanks</div><div class='add'>+--------------</div><div class='add'>+</div><div class='add'>+GlusterFS would not be possible without the contributions of:</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+M: Vijay Bellur &lt;vbellur@redhat.com&gt;</div><div class='add'>+M: Jeff Darcy &lt;jeff@pl.atyp.us&gt;</div><div class='add'>+M: Shreyas Siravara &lt;sshreyas@fb.com&gt;</div><div class='add'>+M: Kaushal M &lt;kaushal@redhat.com&gt;</div><div class='add'>+M: Nigel Babu</div><div class='add'>+M: Prashanth Pai</div><div class='add'>+P: Sanoj Unnikrishnan</div><div class='add'>+P: Milind Changire &lt;mchangir@redhat.com&gt;</div><div class='add'>+P: Sunil Kumar Acharya &lt;sheggodu@redhat.com&gt;</div><div class='add'>+M: Samikshan Bairagya &lt;samikshan@gmail.com&gt;</div><div class='add'>+M: Chris Hertel</div><div class='add'>+M: M. Mohan Kumar &lt;mohan@in.ibm.com&gt;</div><div class='add'>+M: Shishir Gowda &lt;gowda.shishir@gmail.com&gt;</div><div class='add'>+M: Brian Foster &lt;bfoster@redhat.com&gt;</div><div class='add'>+M: Anand Avati &lt;avati@cs.stanford.edu&gt;</div><div class='add'>+M: Dennis Schafroth &lt;dennis@schafroth.com&gt;</div><div class='add'>+M: Harshavardhana &lt;harsha@harshavardhana.net&gt;</div><div class='add'>+M: Krishnan Parthasarathi</div><div class='add'>+M: Justin Clift &lt;justin@gluster.org&gt;</div><div class='add'>+M: Venky Shankar &lt;vshankar@redhat.com&gt;</div><div class='add'>+M: Shravan Chandrashekar &lt;shravantc99@gmail.com&gt;</div><div class='add'>+M: Joseph Fernandes</div><div class='add'>+M: Vijaikumar Mallikarjuna</div><div class='add'>+M: Anand Subramanian</div><div class='add'>+M: Bharata B Rao &lt;bharata@linux.vnet.ibm.com&gt;</div><div class='add'>+M: Rajesh Joseph</div><div class='add'>+M: Dan Lambright</div><div class='add'>+M: Jay Vyas</div><div class='add'>+M: Luis Pabon</div><div class='add'>+M: Ira Cooper</div><div class='add'>+M: Shwetha Panduranga</div><div class='add'>+M: Nithya Balachandran</div><div class='add'>+M: Raghavendra Gowdappa</div><div class='head'>diff --git a/Makefile.am b/Makefile.am<br/>index 1f28a0bf612..98ea5c1038d 100644<br/>--- a/<a href='/cgit/glusterfs.git/tree/Makefile.am?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>Makefile.am</a><br/>+++ b/<a href='/cgit/glusterfs.git/tree/Makefile.am?id=d1d7a6f35c816822fab51c820e25023863c239c1'>Makefile.am</a></div><div class='hunk'>@@ -1,14 +1,55 @@</div><div class='del'>-EXTRA_DIST = autogen.sh COPYING.GPL COPYING.AGPL INSTALL README AUTHORS THANKS NEWS glusterfs.spec</div><div class='add'>+SOURCES = site.h</div><div class='ctx'> </div><div class='del'>-SUBDIRS = argp-standalone libglusterfs rpc xlators glusterfsd $(FUSERMOUNT_SUBDIR) doc extras cli</div><div class='add'>+EXTRA_DIST = autogen.sh \</div><div class='add'>+	COPYING-GPLV2 COPYING-LGPLV3 COMMITMENT \</div><div class='add'>+	INSTALL README.md AUTHORS THANKS NEWS \</div><div class='add'>+	glusterfs.spec glusterfs-api.pc.in libgfchangelog.pc.in \</div><div class='add'>+	run-tests.sh \</div><div class='add'>+	build-aux/pkg-version \</div><div class='add'>+	contrib/umountd \</div><div class='add'>+	$(shell find $(top_srcdir)/tests -type f -print)</div><div class='ctx'> </div><div class='del'>-CLEANFILES = </div><div class='add'>+</div><div class='add'>+SUBDIRS = $(ARGP_STANDALONE_DIR) libglusterfs rpc libglusterd api \</div><div class='add'>+	glusterfsd xlators $(FUSERMOUNT_SUBDIR) doc extras cli heal \</div><div class='add'>+	@SYNCDAEMON_SUBDIR@ @UMOUNTD_SUBDIR@ tools events</div><div class='add'>+</div><div class='add'>+pkgconfigdir = @pkgconfigdir@</div><div class='add'>+pkgconfig_DATA = glusterfs-api.pc libgfchangelog.pc</div><div class='add'>+</div><div class='add'>+CLEANFILES = glusterfs-api.pc libgfchangelog.pc contrib/umountd/Makefile</div><div class='add'>+</div><div class='add'>+clean-local:</div><div class='add'>+	find . -name '*.o' -o -name '*.lo' -o -name '.Po' | xargs rm -f</div><div class='ctx'> </div><div class='ctx'> gitclean: distclean</div><div class='ctx'> 	find . -name Makefile.in -exec rm -f {} \;</div><div class='del'>-	find . -name Makefile -exec rm -f {} \;</div><div class='ctx'> 	find . -name mount.glusterfs -exec rm -f {} \;</div><div class='add'>+	find . -name .deps -o -name .libs | xargs rm -rf</div><div class='ctx'> 	rm -fr autom4te.cache</div><div class='ctx'> 	rm -f missing aclocal.m4 config.h.in config.guess config.sub ltmain.sh install-sh configure depcomp</div><div class='del'>-	rm -fr argp-standalone/autom4te.cache</div><div class='del'>-	rm -f argp-standalone/aclocal.m4 argp-standalone/config.h.in argp-standalone/configure argp-standalone/depcomp argp-standalone/install-sh argp-standalone/missing</div><div class='add'>+</div><div class='add'>+# dist-hook gets executed with 'make dist', this is the only target getting</div><div class='add'>+# executed, a dist-hook in other Makefile.am files seem to get ignored.</div><div class='add'>+dist-hook: gen-VERSION gen-ChangeLog</div><div class='add'>+	-rm -fr $(distdir)/contrib/umountd/.deps</div><div class='add'>+	-rm -f $(distdir)/events/src/eventtypes.py</div><div class='add'>+	-rm -f $(distdir)/tests/env.rc</div><div class='add'>+	-cp -f $(top_srcdir)/build-aux/config.sub.dist $(distdir)/config.sub</div><div class='add'>+	-cp -f $(top_srcdir)/build-aux/config.guess.dist $(distdir)/config.guess</div><div class='add'>+</div><div class='add'>+.PHONY: gen-VERSION gen-ChangeLog clang-check</div><div class='add'>+</div><div class='add'>+clang-check:</div><div class='add'>+	@$(top_srcdir)/extras/clang-checker.sh</div><div class='add'>+</div><div class='add'>+gen-ChangeLog:</div><div class='add'>+	(cd $(srcdir) &amp;&amp; git diff &amp;&amp; echo ===== git log ==== &amp;&amp; git log) &gt; $(distdir)/ChangeLog</div><div class='add'>+</div><div class='add'>+.PHONY : gen-VERSION</div><div class='add'>+gen-VERSION:</div><div class='add'>+	if test -d $(top_srcdir)/.git; then             \</div><div class='add'>+	  cd $(top_srcdir);                             \</div><div class='add'>+	  ./build-aux/pkg-version --full                \</div><div class='add'>+	    &gt; $(abs_top_builddir)/$(distdir)/VERSION;   \</div><div class='add'>+	fi</div><div class='head'>diff --git a/NEWS b/NEWS<br/>index e69de29bb2d..ad00208d351 100644<br/>--- a/<a href='/cgit/glusterfs.git/tree/NEWS?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>NEWS</a><br/>+++ b/<a href='/cgit/glusterfs.git/tree/NEWS?id=d1d7a6f35c816822fab51c820e25023863c239c1'>NEWS</a></div><div class='hunk'>@@ -0,0 +1 @@</div><div class='add'>+Gluster moves to Gerrit.</div><div class='head'>diff --git a/README b/README<br/>deleted file mode 100644<br/>index 07e76c94539..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/README?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>README</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1 +0,0 @@</div><div class='del'>-For more info visit http://www.gluster.org</div><div class='head'>diff --git a/README.md b/README.md<br/>new file mode 100644<br/>index 00000000000..9d68e033782<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/README.md?id=d1d7a6f35c816822fab51c820e25023863c239c1'>README.md</a></div><div class='hunk'>@@ -0,0 +1,46 @@</div><div class='add'>+# Gluster</div><div class='add'>+  Gluster is a software defined distributed storage that can scale to several</div><div class='add'>+  petabytes. It provides interfaces for object, block and file storage.</div><div class='add'>+</div><div class='add'>+## Development</div><div class='add'>+  The development workflow is documented in [Contributors guide](CONTRIBUTING.md)</div><div class='add'>+</div><div class='add'>+## Documentation</div><div class='add'>+  The Gluster documentation can be found at [Gluster Docs](http://docs.gluster.org).</div><div class='add'>+</div><div class='add'>+## Deployment</div><div class='add'>+  Quick instructions to build and install can be found in [INSTALL](INSTALL) file.</div><div class='add'>+</div><div class='add'>+## Testing</div><div class='add'>+</div><div class='add'>+  GlusterFS source contains some functional tests under `tests/` directory. All</div><div class='add'>+  these tests are run against every patch submitted for review. If you want your</div><div class='add'>+  patch to be tested, please add a `.t` test file as part of your patch submission.</div><div class='add'>+  You can also submit a patch to only add a `.t` file for the test case you are</div><div class='add'>+  aware of.</div><div class='add'>+</div><div class='add'>+  To run these tests, on your test-machine, just run `./run-tests.sh`. Don't run</div><div class='add'>+  this on a machine where you have 'production' glusterfs is running, as it would</div><div class='add'>+  blindly kill all gluster processes in each runs.</div><div class='add'>+</div><div class='add'>+  If you are sending a patch, and want to validate one or few specific tests, then</div><div class='add'>+  run a single test by running the below command.</div><div class='add'>+</div><div class='add'>+```</div><div class='add'>+  bash# /bin/bash ${path_to_gluster}/tests/basic/rpc-coverage.t</div><div class='add'>+```</div><div class='add'>+</div><div class='add'>+  You can also use `prove` tool if available in your machine, as follows.</div><div class='add'>+</div><div class='add'>+```</div><div class='add'>+  bash# prove -vmfe '/bin/bash' ${path_to_gluster}/tests/basic/rpc-coverage.t</div><div class='add'>+```</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+## Maintainers</div><div class='add'>+  The list of Gluster maintainers is available in [MAINTAINERS](MAINTAINERS) file.</div><div class='add'>+</div><div class='add'>+## License</div><div class='add'>+  Gluster is dual licensed under [GPLV2](COPYING-GPLV2) and [LGPLV3+](COPYING-LGPLV3).</div><div class='add'>+</div><div class='add'>+  Please visit the [Gluster Home Page](http://www.gluster.org/) to find out more about Gluster.</div><div class='head'>diff --git a/THANKS b/THANKS<br/>index ea981666273..d056d00bb72 100644<br/>--- a/<a href='/cgit/glusterfs.git/tree/THANKS?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>THANKS</a><br/>+++ b/<a href='/cgit/glusterfs.git/tree/THANKS?id=d1d7a6f35c816822fab51c820e25023863c239c1'>THANKS</a></div><div class='hunk'>@@ -1,3 +1 @@</div><div class='del'>-</div><div class='del'>-For all of you, who use the product and help us making it more robust, useful, popular.</div><div class='del'>-</div><div class='add'>+For all of you, who use the product and help us make it more robust, useful, and popular.</div><div class='head'>diff --git a/api/Makefile.am b/api/Makefile.am<br/>new file mode 100644<br/>index 00000000000..f0ad1ee971c<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/api/Makefile.am?id=d1d7a6f35c816822fab51c820e25023863c239c1'>api/Makefile.am</a></div><div class='hunk'>@@ -0,0 +1 @@</div><div class='add'>+SUBDIRS = src examples</div><div class='head'>diff --git a/api/examples/Makefile.am b/api/examples/Makefile.am<br/>new file mode 100644<br/>index 00000000000..7112c81d6a7<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/api/examples/Makefile.am?id=d1d7a6f35c816822fab51c820e25023863c239c1'>api/examples/Makefile.am</a></div><div class='hunk'>@@ -0,0 +1,6 @@</div><div class='add'>+# The bits needed for glfsxmp</div><div class='add'>+EXTRA_PROGRAMS = glfsxmp</div><div class='add'>+glfsxmp_SOURCES = glfsxmp.c</div><div class='add'>+glfsxmp_CFLAGS = $(GLFS_CFLAGS) -Wall</div><div class='add'>+glfsxmp_LDADD = $(GLFS_LIBS) -lrt</div><div class='add'>+</div><div class='head'>diff --git a/api/examples/README b/api/examples/README<br/>new file mode 100644<br/>index 00000000000..4d2b521f779<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/api/examples/README?id=d1d7a6f35c816822fab51c820e25023863c239c1'>api/examples/README</a></div><div class='hunk'>@@ -0,0 +1,36 @@</div><div class='add'>+This is an example application which uses libgfapi. It is</div><div class='add'>+a complete autotools based build system which demonstrates the</div><div class='add'>+required changes in configure.ac, Makefile.am etc to successfuly</div><div class='add'>+detect for and build an application against libgfapi.</div><div class='add'>+</div><div class='add'>+There are two approaches to building a libgfapi based application:</div><div class='add'>+</div><div class='add'>+1. In the presence of pkg-config in your build system.</div><div class='add'>+This is the recommended approach which is also used in this example.</div><div class='add'>+For this approach to work, you need to build glusterfs by passing</div><div class='add'>+--pkgconfigdir=/usr/lib64/pkgconfig (or the appropriate directory)</div><div class='add'>+in your distro. This already happens if you build RPMs with the</div><div class='add'>+glusterfs.spec provided in glusterfs.git. You will also need to</div><div class='add'>+install glusterfs-api RPM.</div><div class='add'>+</div><div class='add'>+2. In the absence of pkg-config in your build system.</div><div class='add'>+Make sure your LDFLAGS includes -L/path/to/lib where libgfapi.so is</div><div class='add'>+installed and -I/path/to/include/glusterfs where the 'api' directory</div><div class='add'>+containing the headers are available.</div><div class='add'>+</div><div class='add'>+glfsxmp.c</div><div class='add'>+=========</div><div class='add'>+</div><div class='add'>+glfsxmp.c is an example application which uses libgfapi</div><div class='add'>+</div><div class='add'>+Compilation Steps For glfsxmp.c</div><div class='add'>+===============================</div><div class='add'>+</div><div class='add'>+1. $./autogen.sh</div><div class='add'>+2. $./configure</div><div class='add'>+</div><div class='add'>+Note: Before running ./configure , as mentioned above, you need to</div><div class='add'>+      take care of #1 or #2 i.e. pkg-config path or LDFLAGS and</div><div class='add'>+      -I/&lt;path&gt; with correct values.</div><div class='add'>+</div><div class='add'>+3. $make glfsxmp</div><div class='head'>diff --git a/api/examples/autogen.sh b/api/examples/autogen.sh<br/>new file mode 100755<br/>index 00000000000..1fee6be11bb<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/api/examples/autogen.sh?id=d1d7a6f35c816822fab51c820e25023863c239c1'>api/examples/autogen.sh</a></div><div class='hunk'>@@ -0,0 +1,5 @@</div><div class='add'>+#!/bin/sh</div><div class='add'>+</div><div class='add'>+aclocal</div><div class='add'>+autoconf</div><div class='add'>+automake --foreign</div><div class='head'>diff --git a/api/examples/configure.ac b/api/examples/configure.ac<br/>new file mode 100644<br/>index 00000000000..b80177a4e87<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/api/examples/configure.ac?id=d1d7a6f35c816822fab51c820e25023863c239c1'>api/examples/configure.ac</a></div><div class='hunk'>@@ -0,0 +1,12 @@</div><div class='add'>+</div><div class='add'>+AC_INIT([glfs-test],[0.1],[gluster-devel@nongu.org])</div><div class='add'>+</div><div class='add'>+AM_INIT_AUTOMAKE</div><div class='add'>+</div><div class='add'>+AC_CONFIG_FILES([Makefile])</div><div class='add'>+</div><div class='add'>+AC_PROG_CC</div><div class='add'>+</div><div class='add'>+PKG_CHECK_MODULES([GLFS], [glusterfs-api &gt;= 3])</div><div class='add'>+</div><div class='add'>+AC_OUTPUT</div><div class='head'>diff --git a/api/examples/getvolfile.py b/api/examples/getvolfile.py<br/>new file mode 100755<br/>index 00000000000..3b2c8ab5a15<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/api/examples/getvolfile.py?id=d1d7a6f35c816822fab51c820e25023863c239c1'>api/examples/getvolfile.py</a></div><div class='hunk'>@@ -0,0 +1,45 @@</div><div class='add'>+#!/usr/bin/python3</div><div class='add'>+</div><div class='add'>+from __future__ import print_function</div><div class='add'>+import ctypes</div><div class='add'>+import ctypes.util</div><div class='add'>+</div><div class='add'>+api = ctypes.CDLL("libgfapi.so")</div><div class='add'>+api.glfs_get_volfile.argtypes = [ctypes.c_void_p,</div><div class='add'>+                                 ctypes.c_void_p,</div><div class='add'>+                                 ctypes.c_ulong]</div><div class='add'>+api.glfs_get_volfile.restype = ctypes.c_long</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def get_volfile(host, volume):</div><div class='add'>+    # This is set to a large value to exercise the "buffer not big enough"</div><div class='add'>+    # path.  More realistically, you'd just start with a huge buffer.</div><div class='add'>+    BUF_LEN = 0</div><div class='add'>+    fs = api.glfs_new(volume)</div><div class='add'>+    # api.glfs_set_logging(fs,"/dev/stderr",7)</div><div class='add'>+    api.glfs_set_volfile_server(fs, "tcp", host, 24007)</div><div class='add'>+    api.glfs_init(fs)</div><div class='add'>+    vbuf = ctypes.create_string_buffer(BUF_LEN)</div><div class='add'>+    vlen = api.glfs_get_volfile(fs, vbuf, BUF_LEN)</div><div class='add'>+    if vlen &lt; 0:</div><div class='add'>+        vlen = BUF_LEN - vlen</div><div class='add'>+        vbuf = ctypes.create_string_buffer(vlen)</div><div class='add'>+        vlen = api.glfs_get_volfile(fs, vbuf, vlen)</div><div class='add'>+    api.glfs_fini(fs)</div><div class='add'>+    if vlen &lt;= 0:</div><div class='add'>+        return vlen</div><div class='add'>+    return vbuf.value[:vlen]</div><div class='add'>+</div><div class='add'>+if __name__ == "__main__":</div><div class='add'>+    import sys</div><div class='add'>+</div><div class='add'>+    try:</div><div class='add'>+        res = get_volfile(*sys.argv[1:3])</div><div class='add'>+    except:</div><div class='add'>+        print("fetching volfile failed (volume not started?)")</div><div class='add'>+</div><div class='add'>+    try:</div><div class='add'>+        for line in res.split('\n'):</div><div class='add'>+            print(line)</div><div class='add'>+    except:</div><div class='add'>+        print("bad return value %s" % res)</div><div class='head'>diff --git a/api/examples/glfsxmp.c b/api/examples/glfsxmp.c<br/>new file mode 100644<br/>index 00000000000..a55616ef739<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/api/examples/glfsxmp.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>api/examples/glfsxmp.c</a></div><div class='hunk'>@@ -0,0 +1,1811 @@</div><div class='add'>+#include &lt;stdio.h&gt;</div><div class='add'>+#include &lt;stdlib.h&gt;</div><div class='add'>+#include &lt;errno.h&gt;</div><div class='add'>+#include &lt;glusterfs/api/glfs.h&gt;</div><div class='add'>+#include &lt;glusterfs/api/glfs-handles.h&gt;</div><div class='add'>+#include &lt;string.h&gt;</div><div class='add'>+#include &lt;time.h&gt;</div><div class='add'>+</div><div class='add'>+#define TEST_STR_LEN 2048</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+test_dirops(glfs_t *fs)</div><div class='add'>+{</div><div class='add'>+    glfs_fd_t *fd = NULL;</div><div class='add'>+    char buf[512];</div><div class='add'>+    struct dirent *entry = NULL;</div><div class='add'>+</div><div class='add'>+    fd = glfs_opendir(fs, "/");</div><div class='add'>+    if (!fd) {</div><div class='add'>+        fprintf(stderr, "/: %s\n", strerror(errno));</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    fprintf(stderr, "Entries:\n");</div><div class='add'>+    while (glfs_readdir_r(fd, (struct dirent *)buf, &amp;entry), entry) {</div><div class='add'>+        fprintf(stderr, "%s: %lu\n", entry-&gt;d_name, glfs_telldir(fd));</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    glfs_closedir(fd);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+test_xattr(glfs_t *fs)</div><div class='add'>+{</div><div class='add'>+    char *filename = "/filename2";</div><div class='add'>+    char *linkfile = "/linkfile";</div><div class='add'>+    glfs_fd_t *fd = NULL;</div><div class='add'>+    char buf[512];</div><div class='add'>+    char *ptr;</div><div class='add'>+    int ret;</div><div class='add'>+</div><div class='add'>+    ret = glfs_setxattr(fs, filename, "user.testkey", "testval", 8, 0);</div><div class='add'>+    fprintf(stderr, "setxattr(%s): %d (%s)\n", filename, ret, strerror(errno));</div><div class='add'>+</div><div class='add'>+    ret = glfs_setxattr(fs, filename, "user.testkey2", "testval", 8, 0);</div><div class='add'>+    fprintf(stderr, "setxattr(%s): %d (%s)\n", filename, ret, strerror(errno));</div><div class='add'>+</div><div class='add'>+    ret = glfs_getxattr(fs, filename, "user.testkey", buf, 512);</div><div class='add'>+    fprintf(stderr, "getxattr(%s): %d (%s)\n", filename, ret, strerror(errno));</div><div class='add'>+    if (ret &lt; 0)</div><div class='add'>+        return -1;</div><div class='add'>+</div><div class='add'>+    ret = glfs_listxattr(fs, filename, buf, 512);</div><div class='add'>+    fprintf(stderr, "listxattr(%s): %d (%s)\n", filename, ret, strerror(errno));</div><div class='add'>+    if (ret &lt; 0)</div><div class='add'>+        return -1;</div><div class='add'>+</div><div class='add'>+    ret = glfs_symlink(fs, "filename", linkfile);</div><div class='add'>+    fprintf(stderr, "symlink(%s %s): %s\n", filename, linkfile,</div><div class='add'>+            strerror(errno));</div><div class='add'>+    if (ret &lt; 0)</div><div class='add'>+        return -1;</div><div class='add'>+</div><div class='add'>+    ret = glfs_readlink(fs, linkfile, buf, 512);</div><div class='add'>+    fprintf(stderr, "readlink(%s) : %d (%s)\n", filename, ret, strerror(errno));</div><div class='add'>+    if (ret &lt; 0)</div><div class='add'>+        return -1;</div><div class='add'>+</div><div class='add'>+    ret = glfs_lsetxattr(fs, filename, "user.testkey3", "testval", 8, 0);</div><div class='add'>+    fprintf(stderr, "lsetxattr(%s) : %d (%s)\n", linkfile, ret,</div><div class='add'>+            strerror(errno));</div><div class='add'>+    if (ret &lt; 0)</div><div class='add'>+        return -1;</div><div class='add'>+</div><div class='add'>+    ret = glfs_llistxattr(fs, linkfile, buf, 512);</div><div class='add'>+    fprintf(stderr, "llistxattr(%s): %d (%s)\n", filename, ret,</div><div class='add'>+            strerror(errno));</div><div class='add'>+    if (ret &lt; 0)</div><div class='add'>+        return -1;</div><div class='add'>+</div><div class='add'>+    ret = glfs_lgetxattr(fs, filename, "user.testkey3", buf, 512);</div><div class='add'>+    fprintf(stderr, "lgetxattr(%s): %d (%s)\n", linkfile, ret, strerror(errno));</div><div class='add'>+    if (ret &lt; 0)</div><div class='add'>+        return -1;</div><div class='add'>+</div><div class='add'>+    for (ptr = buf; ptr &lt; buf + ret; ptr++) {</div><div class='add'>+        printf("key=%s\n", ptr);</div><div class='add'>+        ptr += strlen(ptr);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = glfs_removexattr(fs, filename, "user.testkey2");</div><div class='add'>+    fprintf(stderr, "removexattr(%s): %d (%s)\n", filename, ret,</div><div class='add'>+            strerror(errno));</div><div class='add'>+</div><div class='add'>+    fd = glfs_open(fs, filename, O_RDWR);</div><div class='add'>+    fprintf(stderr, "open(%s): (%p) %s\n", filename, fd, strerror(errno));</div><div class='add'>+</div><div class='add'>+    ret = glfs_fsetxattr(fd, "user.testkey2", "testval", 8, 0);</div><div class='add'>+    fprintf(stderr, "fsetxattr(%s): %d (%s)\n", filename, ret, strerror(errno));</div><div class='add'>+</div><div class='add'>+    ret = glfs_fgetxattr(fd, "user.testkey2", buf, 512);</div><div class='add'>+    fprintf(stderr, "fgetxattr(%s): %d (%s)\n", filename, ret, strerror(errno));</div><div class='add'>+</div><div class='add'>+    ret = glfs_flistxattr(fd, buf, 512);</div><div class='add'>+    fprintf(stderr, "flistxattr(%s): %d (%s)\n", filename, ret,</div><div class='add'>+            strerror(errno));</div><div class='add'>+    if (ret &lt; 0)</div><div class='add'>+        return -1;</div><div class='add'>+</div><div class='add'>+    for (ptr = buf; ptr &lt; buf + ret; ptr++) {</div><div class='add'>+        printf("key=%s\n", ptr);</div><div class='add'>+        ptr += strlen(ptr);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = glfs_fremovexattr(fd, "user.testkey2");</div><div class='add'>+    fprintf(stderr, "fremovexattr(%s): %d (%s)\n", filename, ret,</div><div class='add'>+            strerror(errno));</div><div class='add'>+</div><div class='add'>+    glfs_close(fd);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+test_chdir(glfs_t *fs)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    char *dir = "/dir";</div><div class='add'>+    char *topdir = "/topdir";</div><div class='add'>+    char *linkdir = "/linkdir";</div><div class='add'>+    char *linkdir2 = "/linkdir2";</div><div class='add'>+    char *subdir = "./subdir";</div><div class='add'>+    char *respath = NULL;</div><div class='add'>+    char pathbuf[4096];</div><div class='add'>+</div><div class='add'>+    ret = glfs_mkdir(fs, topdir, 0755);</div><div class='add'>+    fprintf(stderr, "mkdir(%s): %s\n", topdir, strerror(errno));</div><div class='add'>+    if (ret)</div><div class='add'>+        return -1;</div><div class='add'>+</div><div class='add'>+    ret = glfs_mkdir(fs, dir, 0755);</div><div class='add'>+    fprintf(stderr, "mkdir(%s): %s\n", dir, strerror(errno));</div><div class='add'>+    if (ret)</div><div class='add'>+        return -1;</div><div class='add'>+</div><div class='add'>+    respath = glfs_getcwd(fs, pathbuf, 4096);</div><div class='add'>+    fprintf(stdout, "getcwd() = %s\n", respath);</div><div class='add'>+</div><div class='add'>+    ret = glfs_symlink(fs, "topdir", linkdir);</div><div class='add'>+    if (ret) {</div><div class='add'>+        fprintf(stderr, "symlink(%s, %s): %s\n", topdir, linkdir,</div><div class='add'>+                strerror(errno));</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = glfs_chdir(fs, linkdir);</div><div class='add'>+    if (ret) {</div><div class='add'>+        fprintf(stderr, "chdir(%s): %s\n", linkdir, strerror(errno));</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    respath = glfs_getcwd(fs, pathbuf, 4096);</div><div class='add'>+    fprintf(stdout, "getcwd() = %s\n", respath);</div><div class='add'>+</div><div class='add'>+    respath = glfs_realpath(fs, subdir, pathbuf);</div><div class='add'>+    if (respath) {</div><div class='add'>+        fprintf(stderr, "realpath(%s) worked unexpectedly: %s\n", subdir,</div><div class='add'>+                respath);</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = glfs_mkdir(fs, subdir, 0755);</div><div class='add'>+    if (ret) {</div><div class='add'>+        fprintf(stderr, "mkdir(%s): %s\n", subdir, strerror(errno));</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    respath = glfs_realpath(fs, subdir, pathbuf);</div><div class='add'>+    if (!respath) {</div><div class='add'>+        fprintf(stderr, "realpath(%s): %s\n", subdir, strerror(errno));</div><div class='add'>+    } else {</div><div class='add'>+        fprintf(stdout, "realpath(%s) = %s\n", subdir, respath);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = glfs_chdir(fs, subdir);</div><div class='add'>+    if (ret) {</div><div class='add'>+        fprintf(stderr, "chdir(%s): %s\n", subdir, strerror(errno));</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    respath = glfs_getcwd(fs, pathbuf, 4096);</div><div class='add'>+    fprintf(stdout, "getcwd() = %s\n", respath);</div><div class='add'>+</div><div class='add'>+    respath = glfs_realpath(fs, "/linkdir/subdir", pathbuf);</div><div class='add'>+    if (!respath) {</div><div class='add'>+        fprintf(stderr, "realpath(/linkdir/subdir): %s\n", strerror(errno));</div><div class='add'>+    } else {</div><div class='add'>+        fprintf(stdout, "realpath(/linkdir/subdir) = %s\n", respath);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#ifdef DEBUG</div><div class='add'>+static void</div><div class='add'>+peek_stat(struct stat *sb)</div><div class='add'>+{</div><div class='add'>+    printf("Dumping stat information:\n");</div><div class='add'>+    printf("File type:                ");</div><div class='add'>+</div><div class='add'>+    switch (sb-&gt;st_mode &amp; S_IFMT) {</div><div class='add'>+        case S_IFBLK:</div><div class='add'>+            printf("block device\n");</div><div class='add'>+            break;</div><div class='add'>+        case S_IFCHR:</div><div class='add'>+            printf("character device\n");</div><div class='add'>+            break;</div><div class='add'>+        case S_IFDIR:</div><div class='add'>+            printf("directory\n");</div><div class='add'>+            break;</div><div class='add'>+        case S_IFIFO:</div><div class='add'>+            printf("FIFO/pipe\n");</div><div class='add'>+            break;</div><div class='add'>+        case S_IFLNK:</div><div class='add'>+            printf("symlink\n");</div><div class='add'>+            break;</div><div class='add'>+        case S_IFREG:</div><div class='add'>+            printf("regular file\n");</div><div class='add'>+            break;</div><div class='add'>+        case S_IFSOCK:</div><div class='add'>+            printf("socket\n");</div><div class='add'>+            break;</div><div class='add'>+        default:</div><div class='add'>+            printf("unknown?\n");</div><div class='add'>+            break;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    printf("I-node number:            %ld\n", (long)sb-&gt;st_ino);</div><div class='add'>+</div><div class='add'>+    printf("Mode:                     %lo (octal)\n",</div><div class='add'>+           (unsigned long)sb-&gt;st_mode);</div><div class='add'>+</div><div class='add'>+    printf("Link count:               %ld\n", (long)sb-&gt;st_nlink);</div><div class='add'>+    printf("Ownership:                UID=%ld   GID=%ld\n", (long)sb-&gt;st_uid,</div><div class='add'>+           (long)sb-&gt;st_gid);</div><div class='add'>+</div><div class='add'>+    printf("Preferred I/O block size: %ld bytes\n", (long)sb-&gt;st_blksize);</div><div class='add'>+    printf("File size:                %lld bytes\n", (long long)sb-&gt;st_size);</div><div class='add'>+    printf("Blocks allocated:         %lld\n", (long long)sb-&gt;st_blocks);</div><div class='add'>+</div><div class='add'>+    printf("Last status change:       %s", ctime(&amp;sb-&gt;st_ctime));</div><div class='add'>+    printf("Last file access:         %s", ctime(&amp;sb-&gt;st_atime));</div><div class='add'>+    printf("Last file modification:   %s", ctime(&amp;sb-&gt;st_mtime));</div><div class='add'>+</div><div class='add'>+    return;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+peek_handle(unsigned char *glid)</div><div class='add'>+{</div><div class='add'>+    int i;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; GFAPI_HANDLE_LENGTH; i++) {</div><div class='add'>+        printf(":%02x:", glid[i]);</div><div class='add'>+    }</div><div class='add'>+    printf("\n");</div><div class='add'>+}</div><div class='add'>+#else  /* DEBUG */</div><div class='add'>+static void</div><div class='add'>+peek_stat(struct stat *sb)</div><div class='add'>+{</div><div class='add'>+    return;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+peek_handle(unsigned char *id)</div><div class='add'>+{</div><div class='add'>+    return;</div><div class='add'>+}</div><div class='add'>+#endif /* DEBUG */</div><div class='add'>+</div><div class='add'>+glfs_t *fs = NULL;</div><div class='add'>+char *full_parent_name = "/testdir", *parent_name = "testdir";</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+test_h_unlink(void)</div><div class='add'>+{</div><div class='add'>+    char *my_dir = "unlinkdir";</div><div class='add'>+    char *my_file = "file.txt";</div><div class='add'>+    char *my_subdir = "dir1";</div><div class='add'>+    struct glfs_object *parent = NULL, *leaf = NULL, *dir = NULL,</div><div class='add'>+                       *subdir = NULL, *subleaf = NULL;</div><div class='add'>+    struct stat sb;</div><div class='add'>+    int ret;</div><div class='add'>+</div><div class='add'>+    printf("glfs_h_unlink tests: In Progress\n");</div><div class='add'>+</div><div class='add'>+    /* Prepare tests */</div><div class='add'>+    parent = glfs_h_lookupat(fs, NULL, full_parent_name, &amp;sb, 0);</div><div class='add'>+    if (parent == NULL) {</div><div class='add'>+        fprintf(stderr,</div><div class='add'>+                "glfs_h_lookupat: error on lookup of %s: from (%p),%s\n",</div><div class='add'>+                full_parent_name, NULL, strerror(errno));</div><div class='add'>+        printf("glfs_h_lookupat tests: FAILED\n");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    peek_stat(&amp;sb);</div><div class='add'>+</div><div class='add'>+    dir = glfs_h_mkdir(fs, parent, my_dir, 0755, &amp;sb);</div><div class='add'>+    if (dir == NULL) {</div><div class='add'>+        fprintf(stderr, "glfs_h_mkdir: error creating %s: from (%p),%s\n",</div><div class='add'>+                my_dir, parent, strerror(errno));</div><div class='add'>+        printf("glfs_h_unlink tests: FAILED\n");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    leaf = glfs_h_creat(fs, dir, my_file, O_CREAT, 0644, &amp;sb);</div><div class='add'>+    if (leaf == NULL) {</div><div class='add'>+        fprintf(stderr, "glfs_h_creat: error creating %s: from (%p),%s\n",</div><div class='add'>+                my_file, dir, strerror(errno));</div><div class='add'>+        printf("glfs_h_unlink tests: FAILED\n");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    subdir = glfs_h_mkdir(fs, dir, my_subdir, 0755, &amp;sb);</div><div class='add'>+    if (subdir == NULL) {</div><div class='add'>+        fprintf(stderr, "glfs_h_mkdir: error creating %s: from (%p),%s\n",</div><div class='add'>+                my_subdir, dir, strerror(errno));</div><div class='add'>+        printf("glfs_h_unlink tests: FAILED\n");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    subleaf = glfs_h_creat(fs, subdir, my_file, O_CREAT, 0644, &amp;sb);</div><div class='add'>+    if (subleaf == NULL) {</div><div class='add'>+        fprintf(stderr, "glfs_h_creat: error creating %s: from (%p),%s\n",</div><div class='add'>+                my_file, subdir, strerror(errno));</div><div class='add'>+        printf("glfs_h_unlink tests: FAILED\n");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* unlink non empty directory */</div><div class='add'>+    ret = glfs_h_unlink(fs, dir, my_subdir);</div><div class='add'>+    if ((ret &amp;&amp; errno != ENOTEMPTY) || (ret == 0)) {</div><div class='add'>+        fprintf(stderr,</div><div class='add'>+                "glfs_h_unlink: error unlinking %s: it is non empty: %s\n",</div><div class='add'>+                my_subdir, strerror(errno));</div><div class='add'>+        printf("glfs_h_unlink tests: FAILED\n");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* unlink regular file */</div><div class='add'>+    ret = glfs_h_unlink(fs, subdir, my_file);</div><div class='add'>+    if (ret) {</div><div class='add'>+        fprintf(stderr, "glfs_h_unlink: error unlinking %s: from (%p),%s\n",</div><div class='add'>+                my_file, subdir, strerror(errno));</div><div class='add'>+        printf("glfs_h_unlink tests: FAILED\n");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* unlink directory */</div><div class='add'>+    ret = glfs_h_unlink(fs, dir, my_subdir);</div><div class='add'>+    if (ret) {</div><div class='add'>+        fprintf(stderr, "glfs_h_unlink: error unlinking %s: from (%p),%s\n",</div><div class='add'>+                my_subdir, dir, strerror(errno));</div><div class='add'>+        printf("glfs_h_unlink tests: FAILED\n");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* unlink regular file */</div><div class='add'>+    ret = glfs_h_unlink(fs, dir, my_file);</div><div class='add'>+    if (ret) {</div><div class='add'>+        fprintf(stderr, "glfs_h_unlink: error unlinking %s: from (%p),%s\n",</div><div class='add'>+                my_file, dir, strerror(errno));</div><div class='add'>+        printf("glfs_h_unlink tests: FAILED\n");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* unlink non-existent regular file */</div><div class='add'>+    ret = glfs_h_unlink(fs, dir, my_file);</div><div class='add'>+    if ((ret &amp;&amp; errno != ENOENT) || (ret == 0)) {</div><div class='add'>+        fprintf(stderr,</div><div class='add'>+                "glfs_h_unlink: error unlinking non-existent %s: invalid errno "</div><div class='add'>+                ",%d, %s\n",</div><div class='add'>+                my_file, ret, strerror(errno));</div><div class='add'>+        printf("glfs_h_unlink tests: FAILED\n");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* unlink non-existent directory */</div><div class='add'>+    ret = glfs_h_unlink(fs, dir, my_subdir);</div><div class='add'>+    if ((ret &amp;&amp; errno != ENOENT) || (ret == 0)) {</div><div class='add'>+        fprintf(stderr,</div><div class='add'>+                "glfs_h_unlink: error unlinking non-existent %s:  invalid "</div><div class='add'>+                "errno ,%d, %s\n",</div><div class='add'>+                my_subdir, ret, strerror(errno));</div><div class='add'>+        printf("glfs_h_unlink tests: FAILED\n");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* unlink directory */</div><div class='add'>+    ret = glfs_h_unlink(fs, parent, my_dir);</div><div class='add'>+    if (ret) {</div><div class='add'>+        fprintf(stderr, "glfs_h_unlink: error unlinking %s: from (%p),%s\n",</div><div class='add'>+                my_dir, dir, strerror(errno));</div><div class='add'>+        printf("glfs_h_unlink tests: FAILED\n");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    printf("glfs_h_unlink tests: PASSED\n");</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (dir)</div><div class='add'>+        glfs_h_close(dir);</div><div class='add'>+    if (leaf)</div><div class='add'>+        glfs_h_close(leaf);</div><div class='add'>+    if (subdir)</div><div class='add'>+        glfs_h_close(subdir);</div><div class='add'>+    if (subleaf)</div><div class='add'>+        glfs_h_close(subleaf);</div><div class='add'>+    if (parent)</div><div class='add'>+        glfs_h_close(parent);</div><div class='add'>+</div><div class='add'>+    return;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+test_h_getsetattrs(void)</div><div class='add'>+{</div><div class='add'>+    char *my_dir = "attrdir";</div><div class='add'>+    char *my_file = "attrfile.txt";</div><div class='add'>+    struct glfs_object *parent = NULL, *leaf = NULL, *dir = NULL;</div><div class='add'>+    struct stat sb, retsb;</div><div class='add'>+    int ret, valid;</div><div class='add'>+    struct timespec timestamp;</div><div class='add'>+</div><div class='add'>+    printf("glfs_h_getattrs and setattrs tests: In Progress\n");</div><div class='add'>+</div><div class='add'>+    /* Prepare tests */</div><div class='add'>+    parent = glfs_h_lookupat(fs, NULL, full_parent_name, &amp;sb, 0);</div><div class='add'>+    if (parent == NULL) {</div><div class='add'>+        fprintf(stderr,</div><div class='add'>+                "glfs_h_lookupat: error on lookup of %s: from (%p),%s\n",</div><div class='add'>+                full_parent_name, NULL, strerror(errno));</div><div class='add'>+        printf("glfs_h_lookupat tests: FAILED\n");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    peek_stat(&amp;sb);</div><div class='add'>+</div><div class='add'>+    dir = glfs_h_mkdir(fs, parent, my_dir, 0755, &amp;sb);</div><div class='add'>+    if (dir == NULL) {</div><div class='add'>+        fprintf(stderr, "glfs_h_mkdir: error creating %s: from (%p),%s\n",</div><div class='add'>+                my_dir, parent, strerror(errno));</div><div class='add'>+        printf("glfs_h_unlink tests: FAILED\n");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    peek_stat(&amp;sb);</div><div class='add'>+</div><div class='add'>+    leaf = glfs_h_creat(fs, dir, my_file, O_CREAT, 0644, &amp;sb);</div><div class='add'>+    if (leaf == NULL) {</div><div class='add'>+        fprintf(stderr, "glfs_h_creat: error creating %s: from (%p),%s\n",</div><div class='add'>+                my_file, dir, strerror(errno));</div><div class='add'>+        printf("glfs_h_unlink tests: FAILED\n");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    peek_stat(&amp;sb);</div><div class='add'>+</div><div class='add'>+    ret = glfs_h_getattrs(fs, dir, &amp;retsb);</div><div class='add'>+    if (ret != 0) {</div><div class='add'>+        fprintf(stderr, "glfs_h_getattrs: error %s: from (%p),%s\n", my_dir,</div><div class='add'>+                dir, strerror(errno));</div><div class='add'>+        printf("glfs_h_getattrs and setattrs tests: FAILED\n");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    peek_stat(&amp;retsb);</div><div class='add'>+    /* TODO: Compare stat information */</div><div class='add'>+</div><div class='add'>+    retsb.st_mode = 00666;</div><div class='add'>+    retsb.st_uid = 1000;</div><div class='add'>+    retsb.st_gid = 1001;</div><div class='add'>+    ret = clock_gettime(CLOCK_REALTIME, &amp;timestamp);</div><div class='add'>+    if (ret != 0) {</div><div class='add'>+        fprintf(stderr, "clock_gettime: error %s\n", strerror(errno));</div><div class='add'>+        printf("glfs_h_getattrs and setattrs tests: FAILED\n");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    retsb.st_atim = timestamp;</div><div class='add'>+    retsb.st_mtim = timestamp;</div><div class='add'>+    valid = GFAPI_SET_ATTR_MODE | GFAPI_SET_ATTR_UID | GFAPI_SET_ATTR_GID |</div><div class='add'>+            GFAPI_SET_ATTR_ATIME | GFAPI_SET_ATTR_MTIME;</div><div class='add'>+    peek_stat(&amp;retsb);</div><div class='add'>+</div><div class='add'>+    ret = glfs_h_setattrs(fs, dir, &amp;retsb, valid);</div><div class='add'>+    if (ret != 0) {</div><div class='add'>+        fprintf(stderr, "glfs_h_setattrs: error %s: from (%p),%s\n", my_dir,</div><div class='add'>+                dir, strerror(errno));</div><div class='add'>+        printf("glfs_h_getattrs and setattrs tests: FAILED\n");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    memset(&amp;retsb, 0, sizeof(struct stat));</div><div class='add'>+    ret = glfs_h_stat(fs, dir, &amp;retsb);</div><div class='add'>+    if (ret != 0) {</div><div class='add'>+        fprintf(stderr, "glfs_h_stat: error %s: from (%p),%s\n", my_dir, dir,</div><div class='add'>+                strerror(errno));</div><div class='add'>+        printf("glfs_h_getattrs and setattrs tests: FAILED\n");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    peek_stat(&amp;retsb);</div><div class='add'>+</div><div class='add'>+    printf("glfs_h_getattrs and setattrs tests: PASSED\n");</div><div class='add'>+out:</div><div class='add'>+    if (parent)</div><div class='add'>+        glfs_h_close(parent);</div><div class='add'>+    if (leaf)</div><div class='add'>+        glfs_h_close(leaf);</div><div class='add'>+    if (dir)</div><div class='add'>+        glfs_h_close(dir);</div><div class='add'>+</div><div class='add'>+    return;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+test_h_truncate(void)</div><div class='add'>+{</div><div class='add'>+    char *my_dir = "truncatedir";</div><div class='add'>+    char *my_file = "file.txt";</div><div class='add'>+    struct glfs_object *root = NULL, *parent = NULL, *leaf = NULL;</div><div class='add'>+    struct stat sb;</div><div class='add'>+    glfs_fd_t *fd = NULL;</div><div class='add'>+    char buf[32];</div><div class='add'>+    off_t offset = 0;</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    printf("glfs_h_truncate tests: In Progress\n");</div><div class='add'>+</div><div class='add'>+    /* Prepare tests */</div><div class='add'>+    root = glfs_h_lookupat(fs, NULL, full_parent_name, &amp;sb, 0);</div><div class='add'>+    if (root == NULL) {</div><div class='add'>+        fprintf(stderr,</div><div class='add'>+                "glfs_h_lookupat: error on lookup of %s: from (%p),%s\n",</div><div class='add'>+                full_parent_name, NULL, strerror(errno));</div><div class='add'>+        printf("glfs_h_truncate tests: FAILED\n");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    peek_stat(&amp;sb);</div><div class='add'>+</div><div class='add'>+    parent = glfs_h_mkdir(fs, root, my_dir, 0755, &amp;sb);</div><div class='add'>+    if (parent == NULL) {</div><div class='add'>+        fprintf(stderr, "glfs_h_mkdir: error creating %s: from (%p),%s\n",</div><div class='add'>+                my_dir, root, strerror(errno));</div><div class='add'>+        printf("glfs_h_truncate tests: FAILED\n");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    peek_stat(&amp;sb);</div><div class='add'>+</div><div class='add'>+    leaf = glfs_h_creat(fs, parent, my_file, O_CREAT, 0644, &amp;sb);</div><div class='add'>+    if (leaf == NULL) {</div><div class='add'>+        fprintf(stderr, "glfs_h_creat: error creating %s: from (%p),%s\n",</div><div class='add'>+                my_file, parent, strerror(errno));</div><div class='add'>+        printf("glfs_h_truncate tests: FAILED\n");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    peek_stat(&amp;sb);</div><div class='add'>+</div><div class='add'>+    fd = glfs_h_open(fs, leaf, O_RDWR);</div><div class='add'>+    if (fd == NULL) {</div><div class='add'>+        fprintf(stderr, "glfs_h_open: error on open of %s: %s\n", my_file,</div><div class='add'>+                strerror(errno));</div><div class='add'>+        printf("glfs_h_truncate tests: FAILED\n");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    memcpy(buf, "abcdefghijklmnopqrstuvwxyz012345", 32);</div><div class='add'>+    ret = glfs_write(fd, buf, 32, 0);</div><div class='add'>+</div><div class='add'>+    /* run tests */</div><div class='add'>+    /* truncate lower */</div><div class='add'>+    offset = 30;</div><div class='add'>+    ret = glfs_h_truncate(fs, leaf, offset);</div><div class='add'>+    if (ret != 0) {</div><div class='add'>+        fprintf(stderr, "glfs_h_truncate: error creating %s: from (%p),%s\n",</div><div class='add'>+                my_file, parent, strerror(errno));</div><div class='add'>+        printf("glfs_h_truncate tests: FAILED\n");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    ret = glfs_h_getattrs(fs, leaf, &amp;sb);</div><div class='add'>+    if (ret != 0) {</div><div class='add'>+        fprintf(stderr, "glfs_h_getattrs: error for %s (%p),%s\n", my_file,</div><div class='add'>+                leaf, strerror(errno));</div><div class='add'>+        printf("glfs_h_truncate tests: FAILED\n");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    if (sb.st_size != offset) {</div><div class='add'>+        fprintf(stderr, "glfs_h_truncate: post size mismatch\n");</div><div class='add'>+        printf("glfs_h_truncate tests: FAILED\n");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* truncate higher */</div><div class='add'>+    offset = 32;</div><div class='add'>+    ret = glfs_h_truncate(fs, leaf, offset);</div><div class='add'>+    if (ret != 0) {</div><div class='add'>+        fprintf(stderr, "glfs_h_truncate: error creating %s: from (%p),%s\n",</div><div class='add'>+                my_file, parent, strerror(errno));</div><div class='add'>+        printf("glfs_h_truncate tests: FAILED\n");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    ret = glfs_h_getattrs(fs, leaf, &amp;sb);</div><div class='add'>+    if (ret != 0) {</div><div class='add'>+        fprintf(stderr, "glfs_h_getattrs: error for %s (%p),%s\n", my_file,</div><div class='add'>+                leaf, strerror(errno));</div><div class='add'>+        printf("glfs_h_truncate tests: FAILED\n");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    if (sb.st_size != offset) {</div><div class='add'>+        fprintf(stderr, "glfs_h_truncate: post size mismatch\n");</div><div class='add'>+        printf("glfs_h_truncate tests: FAILED\n");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* truncate equal */</div><div class='add'>+    offset = 30;</div><div class='add'>+    ret = glfs_h_truncate(fs, leaf, offset);</div><div class='add'>+    if (ret != 0) {</div><div class='add'>+        fprintf(stderr, "glfs_h_truncate: error creating %s: from (%p),%s\n",</div><div class='add'>+                my_file, parent, strerror(errno));</div><div class='add'>+        printf("glfs_h_truncate tests: FAILED\n");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    ret = glfs_h_getattrs(fs, leaf, &amp;sb);</div><div class='add'>+    if (ret != 0) {</div><div class='add'>+        fprintf(stderr, "glfs_h_getattrs: error for %s (%p),%s\n", my_file,</div><div class='add'>+                leaf, strerror(errno));</div><div class='add'>+        printf("glfs_h_truncate tests: FAILED\n");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    if (sb.st_size != offset) {</div><div class='add'>+        fprintf(stderr, "glfs_h_truncate: post size mismatch\n");</div><div class='add'>+        printf("glfs_h_truncate tests: FAILED\n");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    printf("glfs_h_truncate tests: PASSED\n");</div><div class='add'>+out:</div><div class='add'>+    if (fd)</div><div class='add'>+        glfs_close(fd);</div><div class='add'>+    if (root)</div><div class='add'>+        glfs_h_close(root);</div><div class='add'>+    if (parent)</div><div class='add'>+        glfs_h_close(parent);</div><div class='add'>+    if (leaf)</div><div class='add'>+        glfs_h_close(leaf);</div><div class='add'>+</div><div class='add'>+    return;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+test_h_links(void)</div><div class='add'>+{</div><div class='add'>+    char *my_dir = "linkdir";</div><div class='add'>+    char *my_file = "file.txt";</div><div class='add'>+    char *my_symlnk = "slnk.txt";</div><div class='add'>+    char *my_lnk = "lnk.txt";</div><div class='add'>+    char *linksrc_dir = "dir1";</div><div class='add'>+    char *linktgt_dir = "dir2";</div><div class='add'>+    struct glfs_object *root = NULL, *parent = NULL, *leaf = NULL,</div><div class='add'>+                       *dirsrc = NULL, *dirtgt = NULL, *dleaf = NULL;</div><div class='add'>+    struct glfs_object *ln1 = NULL;</div><div class='add'>+    struct stat sb;</div><div class='add'>+    int ret;</div><div class='add'>+    char *buf = NULL;</div><div class='add'>+</div><div class='add'>+    printf("glfs_h_link(s) tests: In Progress\n");</div><div class='add'>+</div><div class='add'>+    /* Prepare tests */</div><div class='add'>+    root = glfs_h_lookupat(fs, NULL, full_parent_name, &amp;sb, 0);</div><div class='add'>+    if (root == NULL) {</div><div class='add'>+        fprintf(stderr,</div><div class='add'>+                "glfs_h_lookupat: error on lookup of %s: from (%p),%s\n",</div><div class='add'>+                full_parent_name, NULL, strerror(errno));</div><div class='add'>+        printf("glfs_h_link(s) tests: FAILED\n");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    peek_stat(&amp;sb);</div><div class='add'>+</div><div class='add'>+    parent = glfs_h_mkdir(fs, root, my_dir, 0755, &amp;sb);</div><div class='add'>+    if (parent == NULL) {</div><div class='add'>+        fprintf(stderr, "glfs_h_mkdir: error creating %s: from (%p),%s\n",</div><div class='add'>+                my_dir, root, strerror(errno));</div><div class='add'>+        printf("glfs_h_link(s) tests: FAILED\n");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    peek_stat(&amp;sb);</div><div class='add'>+</div><div class='add'>+    leaf = glfs_h_creat(fs, parent, my_file, O_CREAT, 0644, &amp;sb);</div><div class='add'>+    if (leaf == NULL) {</div><div class='add'>+        fprintf(stderr, "glfs_h_creat: error creating %s: from (%p),%s\n",</div><div class='add'>+                my_file, parent, strerror(errno));</div><div class='add'>+        printf("glfs_h_link(s) tests: FAILED\n");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    peek_stat(&amp;sb);</div><div class='add'>+</div><div class='add'>+    dirsrc = glfs_h_mkdir(fs, parent, linksrc_dir, 0755, &amp;sb);</div><div class='add'>+    if (dirsrc == NULL) {</div><div class='add'>+        fprintf(stderr, "glfs_h_mkdir: error creating %s: from (%p),%s\n",</div><div class='add'>+                linksrc_dir, parent, strerror(errno));</div><div class='add'>+        printf("glfs_h_link(s) tests: FAILED\n");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    peek_stat(&amp;sb);</div><div class='add'>+</div><div class='add'>+    dirtgt = glfs_h_mkdir(fs, parent, linktgt_dir, 0755, &amp;sb);</div><div class='add'>+    if (dirtgt == NULL) {</div><div class='add'>+        fprintf(stderr, "glfs_h_mkdir: error creating %s: from (%p),%s\n",</div><div class='add'>+                linktgt_dir, parent, strerror(errno));</div><div class='add'>+        printf("glfs_h_link(s) tests: FAILED\n");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    peek_stat(&amp;sb);</div><div class='add'>+</div><div class='add'>+    dleaf = glfs_h_creat(fs, dirsrc, my_file, O_CREAT, 0644, &amp;sb);</div><div class='add'>+    if (dleaf == NULL) {</div><div class='add'>+        fprintf(stderr, "glfs_h_creat: error creating %s: from (%p),%s\n",</div><div class='add'>+                my_file, dirsrc, strerror(errno));</div><div class='add'>+        printf("glfs_h_link(s) tests: FAILED\n");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    peek_stat(&amp;sb);</div><div class='add'>+</div><div class='add'>+    /* run tests */</div><div class='add'>+    /* sym link: /testdir/linkdir/file.txt to ./slnk.txt */</div><div class='add'>+    ln1 = glfs_h_symlink(fs, parent, my_symlnk, "./file.txt", &amp;sb);</div><div class='add'>+    if (ln1 == NULL) {</div><div class='add'>+        fprintf(stderr, "glfs_h_symlink: error creating %s: from (%p),%s\n",</div><div class='add'>+                my_symlnk, parent, strerror(errno));</div><div class='add'>+        printf("glfs_h_link(s) tests: FAILED\n");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    peek_stat(&amp;sb);</div><div class='add'>+</div><div class='add'>+    buf = calloc(1024, sizeof(char));</div><div class='add'>+    if (buf == NULL) {</div><div class='add'>+        fprintf(stderr, "Error allocating memory\n");</div><div class='add'>+        printf("glfs_h_link(s) tests: FAILED\n");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = glfs_h_readlink(fs, ln1, buf, 1024);</div><div class='add'>+    if (ret &lt;= 0) {</div><div class='add'>+        fprintf(stderr, "glfs_h_readlink: error reading %s: from (%p),%s\n",</div><div class='add'>+                my_symlnk, ln1, strerror(errno));</div><div class='add'>+        printf("glfs_h_link(s) tests: FAILED\n");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    if (!(strncmp(buf, my_symlnk, strlen(my_symlnk)))) {</div><div class='add'>+        fprintf(stderr,</div><div class='add'>+                "glfs_h_readlink: error mismatch in link name: actual %s: "</div><div class='add'>+                "retrieved %s\n",</div><div class='add'>+                my_symlnk, buf);</div><div class='add'>+        printf("glfs_h_link(s) tests: FAILED\n");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* link: /testdir/linkdir/file.txt to ./lnk.txt */</div><div class='add'>+    ret = glfs_h_link(fs, leaf, parent, my_lnk);</div><div class='add'>+    if (ret != 0) {</div><div class='add'>+        fprintf(stderr, "glfs_h_link: error creating %s: from (%p),%s\n",</div><div class='add'>+                my_lnk, parent, strerror(errno));</div><div class='add'>+        printf("glfs_h_link(s) tests: FAILED\n");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    /* TODO: Should write content to a file and read from the link */</div><div class='add'>+</div><div class='add'>+    /* link: /testdir/linkdir/dir1/file.txt to ../dir2/slnk.txt */</div><div class='add'>+    ret = glfs_h_link(fs, dleaf, dirtgt, my_lnk);</div><div class='add'>+    if (ret != 0) {</div><div class='add'>+        fprintf(stderr, "glfs_h_link: error creating %s: from (%p),%s\n",</div><div class='add'>+                my_lnk, dirtgt, strerror(errno));</div><div class='add'>+        printf("glfs_h_link(s) tests: FAILED\n");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    /* TODO: Should write content to a file and read from the link */</div><div class='add'>+</div><div class='add'>+    printf("glfs_h_link(s) tests: PASSED\n");</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (root)</div><div class='add'>+        glfs_h_close(root);</div><div class='add'>+    if (parent)</div><div class='add'>+        glfs_h_close(parent);</div><div class='add'>+    if (leaf)</div><div class='add'>+        glfs_h_close(leaf);</div><div class='add'>+    if (dirsrc)</div><div class='add'>+        glfs_h_close(dirsrc);</div><div class='add'>+    if (dirtgt)</div><div class='add'>+        glfs_h_close(dirtgt);</div><div class='add'>+    if (dleaf)</div><div class='add'>+        glfs_h_close(dleaf);</div><div class='add'>+    if (ln1)</div><div class='add'>+        glfs_h_close(ln1);</div><div class='add'>+    if (buf)</div><div class='add'>+        free(buf);</div><div class='add'>+</div><div class='add'>+    return;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+test_h_rename(void)</div><div class='add'>+{</div><div class='add'>+    char *my_dir = "renamedir";</div><div class='add'>+    char *my_file = "file.txt";</div><div class='add'>+    char *src_dir = "dir1";</div><div class='add'>+    char *tgt_dir = "dir2";</div><div class='add'>+    struct glfs_object *root = NULL, *parent = NULL, *leaf = NULL,</div><div class='add'>+                       *dirsrc = NULL, *dirtgt = NULL, *dleaf = NULL;</div><div class='add'>+    struct stat sb;</div><div class='add'>+    int ret;</div><div class='add'>+</div><div class='add'>+    printf("glfs_h_rename tests: In Progress\n");</div><div class='add'>+</div><div class='add'>+    /* Prepare tests */</div><div class='add'>+    root = glfs_h_lookupat(fs, NULL, full_parent_name, &amp;sb, 0);</div><div class='add'>+    if (root == NULL) {</div><div class='add'>+        fprintf(stderr,</div><div class='add'>+                "glfs_h_lookupat: error on lookup of %s: from (%p),%s\n",</div><div class='add'>+                full_parent_name, NULL, strerror(errno));</div><div class='add'>+        printf("glfs_h_rename tests: FAILED\n");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    peek_stat(&amp;sb);</div><div class='add'>+</div><div class='add'>+    parent = glfs_h_mkdir(fs, root, my_dir, 0755, &amp;sb);</div><div class='add'>+    if (parent == NULL) {</div><div class='add'>+        fprintf(stderr, "glfs_h_mkdir: error creating %s: from (%p),%s\n",</div><div class='add'>+                my_dir, root, strerror(errno));</div><div class='add'>+        printf("glfs_h_rename tests: FAILED\n");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    peek_stat(&amp;sb);</div><div class='add'>+</div><div class='add'>+    leaf = glfs_h_creat(fs, parent, my_file, O_CREAT, 0644, &amp;sb);</div><div class='add'>+    if (leaf == NULL) {</div><div class='add'>+        fprintf(stderr, "glfs_h_creat: error creating %s: from (%p),%s\n",</div><div class='add'>+                my_file, parent, strerror(errno));</div><div class='add'>+        printf("glfs_h_rename tests: FAILED\n");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    peek_stat(&amp;sb);</div><div class='add'>+</div><div class='add'>+    dirsrc = glfs_h_mkdir(fs, parent, src_dir, 0755, &amp;sb);</div><div class='add'>+    if (dirsrc == NULL) {</div><div class='add'>+        fprintf(stderr, "glfs_h_mkdir: error creating %s: from (%p),%s\n",</div><div class='add'>+                src_dir, parent, strerror(errno));</div><div class='add'>+        printf("glfs_h_rename tests: FAILED\n");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    peek_stat(&amp;sb);</div><div class='add'>+</div><div class='add'>+    dirtgt = glfs_h_mkdir(fs, parent, tgt_dir, 0755, &amp;sb);</div><div class='add'>+    if (dirtgt == NULL) {</div><div class='add'>+        fprintf(stderr, "glfs_h_mkdir: error creating %s: from (%p),%s\n",</div><div class='add'>+                tgt_dir, parent, strerror(errno));</div><div class='add'>+        printf("glfs_h_rename tests: FAILED\n");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    peek_stat(&amp;sb);</div><div class='add'>+</div><div class='add'>+    dleaf = glfs_h_creat(fs, dirsrc, my_file, O_CREAT, 0644, &amp;sb);</div><div class='add'>+    if (dleaf == NULL) {</div><div class='add'>+        fprintf(stderr, "glfs_h_creat: error creating %s: from (%p),%s\n",</div><div class='add'>+                my_file, dirsrc, strerror(errno));</div><div class='add'>+        printf("glfs_h_rename tests: FAILED\n");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    peek_stat(&amp;sb);</div><div class='add'>+</div><div class='add'>+    /* run tests */</div><div class='add'>+    /* Rename file.txt -&gt; file1.txt */</div><div class='add'>+    ret = glfs_h_rename(fs, parent, "file.txt", parent, "file1.txt");</div><div class='add'>+    if (ret != 0) {</div><div class='add'>+        fprintf(stderr, "glfs_h_rename: error renaming %s to %s (%s)\n",</div><div class='add'>+                "file.txt", "file1.txt", strerror(errno));</div><div class='add'>+        printf("glfs_h_rename tests: FAILED\n");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* rename dir1/file.txt -&gt; file.txt */</div><div class='add'>+    ret = glfs_h_rename(fs, dirsrc, "file.txt", parent, "file.txt");</div><div class='add'>+    if (ret != 0) {</div><div class='add'>+        fprintf(stderr, "glfs_h_rename: error renaming %s/%s to %s (%s)\n",</div><div class='add'>+                src_dir, "file.txt", "file.txt", strerror(errno));</div><div class='add'>+        printf("glfs_h_rename tests: FAILED\n");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* rename file1.txt -&gt; file.txt (exists) */</div><div class='add'>+    ret = glfs_h_rename(fs, parent, "file1.txt", parent, "file.txt");</div><div class='add'>+    if (ret != 0) {</div><div class='add'>+        fprintf(stderr, "glfs_h_rename: error renaming %s to %s (%s)\n",</div><div class='add'>+                "file.txt", "file.txt", strerror(errno));</div><div class='add'>+        printf("glfs_h_rename tests: FAILED\n");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* rename dir1 -&gt; dir3 */</div><div class='add'>+    ret = glfs_h_rename(fs, parent, "dir1", parent, "dir3");</div><div class='add'>+    if (ret != 0) {</div><div class='add'>+        fprintf(stderr, "glfs_h_rename: error renaming %s to %s (%s)\n", "dir1",</div><div class='add'>+                "dir3", strerror(errno));</div><div class='add'>+        printf("glfs_h_rename tests: FAILED\n");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* rename dir2 -&gt;dir3 (exists) */</div><div class='add'>+    ret = glfs_h_rename(fs, parent, "dir2", parent, "dir3");</div><div class='add'>+    if (ret != 0) {</div><div class='add'>+        fprintf(stderr, "glfs_h_rename: error renaming %s to %s (%s)\n", "dir2",</div><div class='add'>+                "dir3", strerror(errno));</div><div class='add'>+        printf("glfs_h_rename tests: FAILED\n");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* rename file.txt -&gt; dir3 (fail) */</div><div class='add'>+    ret = glfs_h_rename(fs, parent, "file.txt", parent, "dir3");</div><div class='add'>+    if (ret == 0) {</div><div class='add'>+        fprintf(stderr, "glfs_h_rename: NO error renaming %s to %s (%s)\n",</div><div class='add'>+                "file.txt", "dir3", strerror(errno));</div><div class='add'>+        printf("glfs_h_rename tests: FAILED\n");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* rename dir3 -&gt; file.txt (fail) */</div><div class='add'>+    ret = glfs_h_rename(fs, parent, "dir3", parent, "file.txt");</div><div class='add'>+    if (ret == 0) {</div><div class='add'>+        fprintf(stderr, "glfs_h_rename: NO error renaming %s to %s (%s)\n",</div><div class='add'>+                "dir3", "file.txt", strerror(errno));</div><div class='add'>+        printf("glfs_h_rename tests: FAILED\n");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    printf("glfs_h_rename tests: PASSED\n");</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (root)</div><div class='add'>+        glfs_h_close(root);</div><div class='add'>+    if (parent)</div><div class='add'>+        glfs_h_close(parent);</div><div class='add'>+    if (leaf)</div><div class='add'>+        glfs_h_close(leaf);</div><div class='add'>+    if (dirsrc)</div><div class='add'>+        glfs_h_close(dirsrc);</div><div class='add'>+    if (dirtgt)</div><div class='add'>+        glfs_h_close(dirtgt);</div><div class='add'>+    if (dleaf)</div><div class='add'>+        glfs_h_close(dleaf);</div><div class='add'>+</div><div class='add'>+    return;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+assimilatetime(struct timespec *ts, struct timespec ts_st,</div><div class='add'>+               struct timespec ts_ed)</div><div class='add'>+{</div><div class='add'>+    if ((ts_ed.tv_nsec - ts_st.tv_nsec) &lt; 0) {</div><div class='add'>+        ts-&gt;tv_sec += ts_ed.tv_sec - ts_st.tv_sec - 1;</div><div class='add'>+        ts-&gt;tv_nsec += 1000000000 + ts_ed.tv_nsec - ts_st.tv_nsec;</div><div class='add'>+    } else {</div><div class='add'>+        ts-&gt;tv_sec += ts_ed.tv_sec - ts_st.tv_sec;</div><div class='add'>+        ts-&gt;tv_nsec += ts_ed.tv_nsec - ts_st.tv_nsec;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (ts-&gt;tv_nsec &gt; 1000000000) {</div><div class='add'>+        ts-&gt;tv_nsec = ts-&gt;tv_nsec - 1000000000;</div><div class='add'>+        ts-&gt;tv_sec += 1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#define MAX_FILES_CREATE 10</div><div class='add'>+#define MAXPATHNAME 512</div><div class='add'>+void</div><div class='add'>+test_h_performance(void)</div><div class='add'>+{</div><div class='add'>+    char *my_dir = "perftest", *full_dir_path = "/testdir/perftest";</div><div class='add'>+    char *my_file = "file_", my_file_name[MAXPATHNAME];</div><div class='add'>+    struct glfs_object *parent = NULL, *leaf = NULL, *dir = NULL;</div><div class='add'>+    struct stat sb;</div><div class='add'>+    int ret, i;</div><div class='add'>+    struct glfs_fd *fd;</div><div class='add'>+    struct timespec c_ts = {0, 0}, c_ts_st, c_ts_ed;</div><div class='add'>+    struct timespec o_ts = {0, 0}, o_ts_st, o_ts_ed;</div><div class='add'>+</div><div class='add'>+    printf("glfs_h_performance tests: In Progress\n");</div><div class='add'>+</div><div class='add'>+    /* Prepare tests */</div><div class='add'>+    parent = glfs_h_lookupat(fs, NULL, full_parent_name, &amp;sb, 0);</div><div class='add'>+    if (parent == NULL) {</div><div class='add'>+        fprintf(stderr,</div><div class='add'>+                "glfs_h_lookupat: error on lookup of %s: from (%p),%s\n",</div><div class='add'>+                full_parent_name, NULL, strerror(errno));</div><div class='add'>+        printf("glfs_h_performance tests: FAILED\n");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    dir = glfs_h_mkdir(fs, parent, my_dir, 0755, &amp;sb);</div><div class='add'>+    if (dir == NULL) {</div><div class='add'>+        fprintf(stderr, "glfs_h_mkdir: error creating %s: from (%p),%s\n",</div><div class='add'>+                my_dir, parent, strerror(errno));</div><div class='add'>+        printf("glfs_h_performance tests: FAILED\n");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    peek_stat(&amp;sb);</div><div class='add'>+</div><div class='add'>+    /* create performance */</div><div class='add'>+    ret = clock_gettime(CLOCK_REALTIME, &amp;o_ts_st);</div><div class='add'>+    if (ret != 0) {</div><div class='add'>+        fprintf(stderr, "clock_gettime: error %s\n", strerror(errno));</div><div class='add'>+        printf("glfs_h_getattrs and setattrs tests: FAILED\n");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; MAX_FILES_CREATE; i++) {</div><div class='add'>+        sprintf(my_file_name, "%s%d", my_file, i);</div><div class='add'>+</div><div class='add'>+        ret = clock_gettime(CLOCK_REALTIME, &amp;c_ts_st);</div><div class='add'>+        if (ret != 0) {</div><div class='add'>+            fprintf(stderr, "clock_gettime: error %s\n", strerror(errno));</div><div class='add'>+            printf("glfs_h_getattrs and setattrs tests: FAILED\n");</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        leaf = glfs_h_lookupat(fs, dir, my_file_name, &amp;sb, 0);</div><div class='add'>+        if (leaf != NULL) {</div><div class='add'>+            fprintf(stderr, "glfs_h_lookup: exists %s\n", my_file_name);</div><div class='add'>+            printf("glfs_h_performance tests: FAILED\n");</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        leaf = glfs_h_creat(fs, dir, my_file_name, O_CREAT, 0644, &amp;sb);</div><div class='add'>+        if (leaf == NULL) {</div><div class='add'>+            fprintf(stderr, "glfs_h_creat: error creating %s: from (%p),%s\n",</div><div class='add'>+                    my_file, dir, strerror(errno));</div><div class='add'>+            printf("glfs_h_performance tests: FAILED\n");</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        ret = clock_gettime(CLOCK_REALTIME, &amp;c_ts_ed);</div><div class='add'>+        if (ret != 0) {</div><div class='add'>+            fprintf(stderr, "clock_gettime: error %s\n", strerror(errno));</div><div class='add'>+            printf("glfs_h_getattrs and setattrs tests: FAILED\n");</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        assimilatetime(&amp;c_ts, c_ts_st, c_ts_ed);</div><div class='add'>+        glfs_h_close(leaf);</div><div class='add'>+        leaf = NULL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = clock_gettime(CLOCK_REALTIME, &amp;o_ts_ed);</div><div class='add'>+    if (ret != 0) {</div><div class='add'>+        fprintf(stderr, "clock_gettime: error %s\n", strerror(errno));</div><div class='add'>+        printf("glfs_h_getattrs and setattrs tests: FAILED\n");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    assimilatetime(&amp;o_ts, o_ts_st, o_ts_ed);</div><div class='add'>+</div><div class='add'>+    printf("Creation performance (handle based):\n\t# empty files:%d\n",</div><div class='add'>+           MAX_FILES_CREATE);</div><div class='add'>+    printf("\tOverall time:\n\t\tSecs:%ld\n\t\tnSecs:%ld\n", o_ts.tv_sec,</div><div class='add'>+           o_ts.tv_nsec);</div><div class='add'>+    printf("\tcreate call time time:\n\t\tSecs:%ld\n\t\tnSecs:%ld\n",</div><div class='add'>+           c_ts.tv_sec, c_ts.tv_nsec);</div><div class='add'>+</div><div class='add'>+    /* create using path */</div><div class='add'>+    c_ts.tv_sec = o_ts.tv_sec = 0;</div><div class='add'>+    c_ts.tv_nsec = o_ts.tv_nsec = 0;</div><div class='add'>+</div><div class='add'>+    sprintf(my_file_name, "%s1", full_dir_path);</div><div class='add'>+    ret = glfs_mkdir(fs, my_file_name, 0755);</div><div class='add'>+    if (ret != 0) {</div><div class='add'>+        fprintf(stderr, "glfs_mkdir: error creating %s: from (%p),%s\n", my_dir,</div><div class='add'>+                parent, strerror(errno));</div><div class='add'>+        printf("glfs_h_performance tests: FAILED\n");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    peek_stat(&amp;sb);</div><div class='add'>+</div><div class='add'>+    ret = clock_gettime(CLOCK_REALTIME, &amp;o_ts_st);</div><div class='add'>+    if (ret != 0) {</div><div class='add'>+        fprintf(stderr, "clock_gettime: error %s\n", strerror(errno));</div><div class='add'>+        printf("glfs_h_getattrs and setattrs tests: FAILED\n");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; MAX_FILES_CREATE; i++) {</div><div class='add'>+        sprintf(my_file_name, "%s1/%sn%d", full_dir_path, my_file, i);</div><div class='add'>+</div><div class='add'>+        ret = clock_gettime(CLOCK_REALTIME, &amp;c_ts_st);</div><div class='add'>+        if (ret != 0) {</div><div class='add'>+            fprintf(stderr, "clock_gettime: error %s\n", strerror(errno));</div><div class='add'>+            printf("glfs_h_getattrs and setattrs tests: FAILED\n");</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        ret = glfs_stat(fs, my_file_name, &amp;sb);</div><div class='add'>+        if (ret == 0) {</div><div class='add'>+            fprintf(stderr, "glfs_stat: exists %s\n", my_file_name);</div><div class='add'>+            printf("glfs_h_performance tests: FAILED\n");</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        fd = glfs_creat(fs, my_file_name, O_CREAT, 0644);</div><div class='add'>+        if (fd == NULL) {</div><div class='add'>+            fprintf(stderr, "glfs_creat: error creating %s: from (%p),%s\n",</div><div class='add'>+                    my_file, dir, strerror(errno));</div><div class='add'>+            printf("glfs_h_performance tests: FAILED\n");</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        ret = clock_gettime(CLOCK_REALTIME, &amp;c_ts_ed);</div><div class='add'>+        if (ret != 0) {</div><div class='add'>+            fprintf(stderr, "clock_gettime: error %s\n", strerror(errno));</div><div class='add'>+            printf("glfs_h_getattrs and setattrs tests: FAILED\n");</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        assimilatetime(&amp;c_ts, c_ts_st, c_ts_ed);</div><div class='add'>+        glfs_close(fd);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = clock_gettime(CLOCK_REALTIME, &amp;o_ts_ed);</div><div class='add'>+    if (ret != 0) {</div><div class='add'>+        fprintf(stderr, "clock_gettime: error %s\n", strerror(errno));</div><div class='add'>+        printf("glfs_h_getattrs and setattrs tests: FAILED\n");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    assimilatetime(&amp;o_ts, o_ts_st, o_ts_ed);</div><div class='add'>+</div><div class='add'>+    printf("Creation performance (path based):\n\t# empty files:%d\n",</div><div class='add'>+           MAX_FILES_CREATE);</div><div class='add'>+    printf("\tOverall time:\n\t\tSecs:%ld\n\t\tnSecs:%ld\n", o_ts.tv_sec,</div><div class='add'>+           o_ts.tv_nsec);</div><div class='add'>+    printf("\tcreate call time time:\n\t\tSecs:%ld\n\t\tnSecs:%ld\n",</div><div class='add'>+           c_ts.tv_sec, c_ts.tv_nsec);</div><div class='add'>+out:</div><div class='add'>+    return;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+test_handleops(int argc, char *argv[])</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+    glfs_fd_t *fd = NULL;</div><div class='add'>+    struct stat sb = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    struct glfs_object *root = NULL, *parent = NULL, *leaf = NULL, *tmp = NULL;</div><div class='add'>+    char readbuf[32], writebuf[32];</div><div class='add'>+    unsigned char leaf_handle[GFAPI_HANDLE_LENGTH];</div><div class='add'>+</div><div class='add'>+    char *full_leaf_name = "/testdir/testfile.txt", *leaf_name = "testfile.txt",</div><div class='add'>+         *relative_leaf_name = "testdir/testfile.txt";</div><div class='add'>+    char *leaf_name1 = "testfile1.txt";</div><div class='add'>+    char *full_newparent_name = "/testdir/dir1", *newparent_name = "dir1";</div><div class='add'>+    char *full_newnod_name = "/testdir/nod1", *newnod_name = "nod1";</div><div class='add'>+</div><div class='add'>+    /* Initialize test area */</div><div class='add'>+    ret = glfs_mkdir(fs, full_parent_name, 0755);</div><div class='add'>+    if (ret != 0 &amp;&amp; errno != EEXIST) {</div><div class='add'>+        fprintf(stderr, "%s: (%p) %s\n", full_parent_name, fd, strerror(errno));</div><div class='add'>+        printf("Test initialization failed on volume %s\n", argv[1]);</div><div class='add'>+        goto out;</div><div class='add'>+    } else if (ret != 0) {</div><div class='add'>+        printf("Found test directory %s to be existing\n", full_parent_name);</div><div class='add'>+        printf("Cleanup test directory and restart tests\n");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    fd = glfs_creat(fs, full_leaf_name, O_CREAT, 0644);</div><div class='add'>+    if (fd == NULL) {</div><div class='add'>+        fprintf(stderr, "%s: (%p) %s\n", full_leaf_name, fd, strerror(errno));</div><div class='add'>+        printf("Test initialization failed on volume %s\n", argv[1]);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    glfs_close(fd);</div><div class='add'>+</div><div class='add'>+    printf("Initialized the test area, within volume %s\n", argv[1]);</div><div class='add'>+</div><div class='add'>+    /* Handle based APIs test area */</div><div class='add'>+</div><div class='add'>+    /* glfs_lookupat test */</div><div class='add'>+    printf("glfs_h_lookupat tests: In Progress\n");</div><div class='add'>+    /* start at root of the volume */</div><div class='add'>+    root = glfs_h_lookupat(fs, NULL, "/", &amp;sb, 0);</div><div class='add'>+    if (root == NULL) {</div><div class='add'>+        fprintf(stderr,</div><div class='add'>+                "glfs_h_lookupat: error on lookup of %s: from (%p),%s\n", "/",</div><div class='add'>+                NULL, strerror(errno));</div><div class='add'>+        printf("glfs_h_lookupat tests: FAILED\n");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    peek_stat(&amp;sb);</div><div class='add'>+</div><div class='add'>+    /* lookup a parent within root */</div><div class='add'>+    parent = glfs_h_lookupat(fs, root, parent_name, &amp;sb, 0);</div><div class='add'>+    if (parent == NULL) {</div><div class='add'>+        fprintf(stderr,</div><div class='add'>+                "glfs_h_lookupat: error on lookup of %s: from (%p),%s\n",</div><div class='add'>+                parent_name, root, strerror(errno));</div><div class='add'>+        printf("glfs_h_lookupat tests: FAILED\n");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    peek_stat(&amp;sb);</div><div class='add'>+</div><div class='add'>+    /* lookup a leaf/child within the parent */</div><div class='add'>+    leaf = glfs_h_lookupat(fs, parent, leaf_name, &amp;sb, 0);</div><div class='add'>+    if (leaf == NULL) {</div><div class='add'>+        fprintf(stderr,</div><div class='add'>+                "glfs_h_lookupat: error on lookup of %s: from (%p),%s\n",</div><div class='add'>+                leaf_name, parent, strerror(errno));</div><div class='add'>+        printf("glfs_h_lookupat tests: FAILED\n");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    peek_stat(&amp;sb);</div><div class='add'>+</div><div class='add'>+    /* reset */</div><div class='add'>+    glfs_h_close(root);</div><div class='add'>+    root = NULL;</div><div class='add'>+    glfs_h_close(leaf);</div><div class='add'>+    leaf = NULL;</div><div class='add'>+    glfs_h_close(parent);</div><div class='add'>+    parent = NULL;</div><div class='add'>+</div><div class='add'>+    /* check absolute paths */</div><div class='add'>+    root = glfs_h_lookupat(fs, NULL, "/", &amp;sb, 0);</div><div class='add'>+    if (root == NULL) {</div><div class='add'>+        fprintf(stderr,</div><div class='add'>+                "glfs_h_lookupat: error on lookup of %s: from (%p),%s\n", "/",</div><div class='add'>+                NULL, strerror(errno));</div><div class='add'>+        printf("glfs_h_lookupat tests: FAILED\n");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    peek_stat(&amp;sb);</div><div class='add'>+</div><div class='add'>+    parent = glfs_h_lookupat(fs, NULL, full_parent_name, &amp;sb, 0);</div><div class='add'>+    if (parent == NULL) {</div><div class='add'>+        fprintf(stderr,</div><div class='add'>+                "glfs_h_lookupat: error on lookup of %s: from (%p),%s\n",</div><div class='add'>+                full_parent_name, root, strerror(errno));</div><div class='add'>+        printf("glfs_h_lookupat tests: FAILED\n");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    peek_stat(&amp;sb);</div><div class='add'>+</div><div class='add'>+    leaf = glfs_h_lookupat(fs, NULL, full_leaf_name, &amp;sb, 0);</div><div class='add'>+    if (leaf == NULL) {</div><div class='add'>+        fprintf(stderr,</div><div class='add'>+                "glfs_h_lookupat: error on lookup of %s: from (%p),%s\n",</div><div class='add'>+                full_leaf_name, parent, strerror(errno));</div><div class='add'>+        printf("glfs_h_lookupat tests: FAILED\n");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    peek_stat(&amp;sb);</div><div class='add'>+</div><div class='add'>+    /* reset */</div><div class='add'>+    glfs_h_close(leaf);</div><div class='add'>+    leaf = NULL;</div><div class='add'>+</div><div class='add'>+    /* check multiple component paths */</div><div class='add'>+    leaf = glfs_h_lookupat(fs, root, relative_leaf_name, &amp;sb, 0);</div><div class='add'>+    if (leaf == NULL) {</div><div class='add'>+        fprintf(stderr,</div><div class='add'>+                "glfs_h_lookupat: error on lookup of %s: from (%p),%s\n",</div><div class='add'>+                relative_leaf_name, parent, strerror(errno));</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    peek_stat(&amp;sb);</div><div class='add'>+</div><div class='add'>+    /* reset */</div><div class='add'>+    glfs_h_close(root);</div><div class='add'>+    root = NULL;</div><div class='add'>+    glfs_h_close(parent);</div><div class='add'>+    parent = NULL;</div><div class='add'>+</div><div class='add'>+    /* check symlinks in path */</div><div class='add'>+</div><div class='add'>+    /* TODO: -ve test cases */</div><div class='add'>+    /* parent invalid</div><div class='add'>+     * path invalid</div><div class='add'>+     * path does not exist after some components</div><div class='add'>+     * no parent, but relative path</div><div class='add'>+     * parent and full path? -ve?</div><div class='add'>+     */</div><div class='add'>+</div><div class='add'>+    printf("glfs_h_lookupat tests: PASSED\n");</div><div class='add'>+</div><div class='add'>+    /* glfs_openat test */</div><div class='add'>+    printf("glfs_h_open tests: In Progress\n");</div><div class='add'>+    fd = glfs_h_open(fs, leaf, O_RDWR);</div><div class='add'>+    if (fd == NULL) {</div><div class='add'>+        fprintf(stderr, "glfs_h_open: error on open of %s: %s\n",</div><div class='add'>+                full_leaf_name, strerror(errno));</div><div class='add'>+        printf("glfs_h_open tests: FAILED\n");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* test read/write based on fd */</div><div class='add'>+    memcpy(writebuf, "abcdefghijklmnopqrstuvwxyz012345", 32);</div><div class='add'>+    ret = glfs_write(fd, writebuf, 32, 0);</div><div class='add'>+</div><div class='add'>+    glfs_lseek(fd, 0, SEEK_SET);</div><div class='add'>+</div><div class='add'>+    ret = glfs_read(fd, readbuf, 32, 0);</div><div class='add'>+    if (memcmp(readbuf, writebuf, 32)) {</div><div class='add'>+        printf("Failed to read what I wrote: %s %s\n", readbuf, writebuf);</div><div class='add'>+        glfs_close(fd);</div><div class='add'>+        printf("glfs_h_open tests: FAILED\n");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    glfs_h_close(leaf);</div><div class='add'>+    leaf = NULL;</div><div class='add'>+    glfs_close(fd);</div><div class='add'>+</div><div class='add'>+    printf("glfs_h_open tests: PASSED\n");</div><div class='add'>+</div><div class='add'>+    /* Create tests */</div><div class='add'>+    printf("glfs_h_creat tests: In Progress\n");</div><div class='add'>+    parent = glfs_h_lookupat(fs, NULL, full_parent_name, &amp;sb, 0);</div><div class='add'>+    if (parent == NULL) {</div><div class='add'>+        fprintf(stderr,</div><div class='add'>+                "glfs_h_lookupat: error on lookup of %s: from (%p),%s\n",</div><div class='add'>+                full_parent_name, root, strerror(errno));</div><div class='add'>+        printf("glfs_h_creat tests: FAILED\n");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    peek_stat(&amp;sb);</div><div class='add'>+</div><div class='add'>+    leaf = glfs_h_creat(fs, parent, leaf_name1, O_CREAT, 0644, &amp;sb);</div><div class='add'>+    if (leaf == NULL) {</div><div class='add'>+        fprintf(stderr, "glfs_h_creat: error on create of %s: from (%p),%s\n",</div><div class='add'>+                leaf_name1, parent, strerror(errno));</div><div class='add'>+        printf("glfs_h_creat tests: FAILED\n");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    peek_stat(&amp;sb);</div><div class='add'>+</div><div class='add'>+    glfs_h_close(leaf);</div><div class='add'>+    leaf = NULL;</div><div class='add'>+</div><div class='add'>+    leaf = glfs_h_creat(fs, parent, leaf_name1, O_CREAT | O_EXCL, 0644, &amp;sb);</div><div class='add'>+    if (leaf != NULL || errno != EEXIST) {</div><div class='add'>+        fprintf(stderr,</div><div class='add'>+                "glfs_h_creat: existing file, leaf = (%p), errno = %s\n", leaf,</div><div class='add'>+                strerror(errno));</div><div class='add'>+        printf("glfs_h_creat tests: FAILED\n");</div><div class='add'>+        if (leaf != NULL) {</div><div class='add'>+            glfs_h_close(leaf);</div><div class='add'>+            leaf = NULL;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    tmp = glfs_h_creat(fs, root, parent_name, O_CREAT, 0644, &amp;sb);</div><div class='add'>+    if (tmp != NULL || !(errno == EISDIR || errno == EINVAL)) {</div><div class='add'>+        fprintf(stderr, "glfs_h_creat: dir create, tmp = (%p), errno = %s\n",</div><div class='add'>+                leaf, strerror(errno));</div><div class='add'>+        printf("glfs_h_creat tests: FAILED\n");</div><div class='add'>+        if (tmp != NULL) {</div><div class='add'>+            glfs_h_close(tmp);</div><div class='add'>+            tmp = NULL;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* TODO: Other combinations and -ve cases as applicable */</div><div class='add'>+    printf("glfs_h_creat tests: PASSED\n");</div><div class='add'>+</div><div class='add'>+    /* extract handle and create from handle test */</div><div class='add'>+    printf(</div><div class='add'>+        "glfs_h_extract_handle and glfs_h_create_from_handle tests: In "</div><div class='add'>+        "Progress\n");</div><div class='add'>+    /* TODO: Change the lookup to create below for a GIFD recovery failure,</div><div class='add'>+     * that needs to be fixed */</div><div class='add'>+    leaf = glfs_h_lookupat(fs, parent, leaf_name1, &amp;sb, 0);</div><div class='add'>+    if (leaf == NULL) {</div><div class='add'>+        fprintf(stderr,</div><div class='add'>+                "glfs_h_lookupat: error on lookup of %s: from (%p),%s\n",</div><div class='add'>+                leaf_name1, parent, strerror(errno));</div><div class='add'>+        printf("glfs_h_extract_handle tests: FAILED\n");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    peek_stat(&amp;sb);</div><div class='add'>+</div><div class='add'>+    ret = glfs_h_extract_handle(leaf, leaf_handle, GFAPI_HANDLE_LENGTH);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(stderr,</div><div class='add'>+                "glfs_h_extract_handle: error extracting handle of %s: %s\n",</div><div class='add'>+                full_leaf_name, strerror(errno));</div><div class='add'>+        printf("glfs_h_extract_handle tests: FAILED\n");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    peek_handle(leaf_handle);</div><div class='add'>+</div><div class='add'>+    glfs_h_close(leaf);</div><div class='add'>+    leaf = NULL;</div><div class='add'>+</div><div class='add'>+    leaf = glfs_h_create_from_handle(fs, leaf_handle, GFAPI_HANDLE_LENGTH, &amp;sb);</div><div class='add'>+    if (leaf == NULL) {</div><div class='add'>+        fprintf(</div><div class='add'>+            stderr,</div><div class='add'>+            "glfs_h_create_from_handle: error on create of %s: from (%p),%s\n",</div><div class='add'>+            leaf_name1, leaf_handle, strerror(errno));</div><div class='add'>+        printf("glfs_h_create_from_handle tests: FAILED\n");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    peek_stat(&amp;sb);</div><div class='add'>+</div><div class='add'>+    fd = glfs_h_open(fs, leaf, O_RDWR);</div><div class='add'>+    if (fd == NULL) {</div><div class='add'>+        fprintf(stderr, "glfs_h_open: error on open of %s: %s\n",</div><div class='add'>+                full_leaf_name, strerror(errno));</div><div class='add'>+        printf("glfs_h_create_from_handle tests: FAILED\n");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* test read/write based on fd */</div><div class='add'>+    memcpy(writebuf, "abcdefghijklmnopqrstuvwxyz012345", 32);</div><div class='add'>+    ret = glfs_write(fd, writebuf, 32, 0);</div><div class='add'>+</div><div class='add'>+    glfs_lseek(fd, 0, SEEK_SET);</div><div class='add'>+</div><div class='add'>+    ret = glfs_read(fd, readbuf, 32, 0);</div><div class='add'>+    if (memcmp(readbuf, writebuf, 32)) {</div><div class='add'>+        printf("Failed to read what I wrote: %s %s\n", writebuf, writebuf);</div><div class='add'>+        printf("glfs_h_create_from_handle tests: FAILED\n");</div><div class='add'>+        glfs_close(fd);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    glfs_close(fd);</div><div class='add'>+    glfs_h_close(leaf);</div><div class='add'>+    leaf = NULL;</div><div class='add'>+    glfs_h_close(parent);</div><div class='add'>+    parent = NULL;</div><div class='add'>+</div><div class='add'>+    printf(</div><div class='add'>+        "glfs_h_extract_handle and glfs_h_create_from_handle tests: PASSED\n");</div><div class='add'>+</div><div class='add'>+    /* Mkdir tests */</div><div class='add'>+    printf("glfs_h_mkdir tests: In Progress\n");</div><div class='add'>+</div><div class='add'>+    ret = glfs_rmdir(fs, full_newparent_name);</div><div class='add'>+    if (ret &amp;&amp; errno != ENOENT) {</div><div class='add'>+        fprintf(stderr, "glfs_rmdir: Failed for %s: %s\n", full_newparent_name,</div><div class='add'>+                strerror(errno));</div><div class='add'>+        printf("glfs_h_mkdir tests: FAILED\n");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    parent = glfs_h_lookupat(fs, NULL, full_parent_name, &amp;sb, 0);</div><div class='add'>+    if (parent == NULL) {</div><div class='add'>+        fprintf(stderr,</div><div class='add'>+                "glfs_h_lookupat: error on lookup of %s: from (%p),%s\n",</div><div class='add'>+                full_parent_name, root, strerror(errno));</div><div class='add'>+        printf("glfs_h_mkdir tests: FAILED\n");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    peek_stat(&amp;sb);</div><div class='add'>+</div><div class='add'>+    leaf = glfs_h_mkdir(fs, parent, newparent_name, 0755, &amp;sb);</div><div class='add'>+    if (leaf == NULL) {</div><div class='add'>+        fprintf(stderr, "glfs_h_mkdir: error on mkdir of %s: from (%p),%s\n",</div><div class='add'>+                newparent_name, parent, strerror(errno));</div><div class='add'>+        printf("glfs_h_mkdir tests: FAILED\n");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    peek_stat(&amp;sb);</div><div class='add'>+</div><div class='add'>+    glfs_h_close(leaf);</div><div class='add'>+    leaf = NULL;</div><div class='add'>+</div><div class='add'>+    leaf = glfs_h_mkdir(fs, parent, newparent_name, 0755, &amp;sb);</div><div class='add'>+    if (leaf != NULL || errno != EEXIST) {</div><div class='add'>+        fprintf(stderr,</div><div class='add'>+                "glfs_h_mkdir: existing directory, leaf = (%p), errno = %s\n",</div><div class='add'>+                leaf, strerror(errno));</div><div class='add'>+        printf("glfs_h_mkdir tests: FAILED\n");</div><div class='add'>+        if (leaf != NULL) {</div><div class='add'>+            glfs_h_close(leaf);</div><div class='add'>+            leaf = NULL;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    glfs_h_close(parent);</div><div class='add'>+    parent = NULL;</div><div class='add'>+</div><div class='add'>+    printf("glfs_h_mkdir tests: PASSED\n");</div><div class='add'>+</div><div class='add'>+    /* Mknod tests */</div><div class='add'>+    printf("glfs_h_mknod tests: In Progress\n");</div><div class='add'>+    ret = glfs_unlink(fs, full_newnod_name);</div><div class='add'>+    if (ret &amp;&amp; errno != ENOENT) {</div><div class='add'>+        fprintf(stderr, "glfs_unlink: Failed for %s: %s\n", full_newnod_name,</div><div class='add'>+                strerror(errno));</div><div class='add'>+        printf("glfs_h_mknod tests: FAILED\n");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    parent = glfs_h_lookupat(fs, NULL, full_parent_name, &amp;sb, 0);</div><div class='add'>+    if (parent == NULL) {</div><div class='add'>+        fprintf(stderr,</div><div class='add'>+                "glfs_h_lookupat: error on lookup of %s: from (%p),%s\n",</div><div class='add'>+                full_parent_name, root, strerror(errno));</div><div class='add'>+        printf("glfs_h_mknod tests: FAILED\n");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    peek_stat(&amp;sb);</div><div class='add'>+</div><div class='add'>+    leaf = glfs_h_mknod(fs, parent, newnod_name, S_IFIFO, 0, &amp;sb);</div><div class='add'>+    if (leaf == NULL) {</div><div class='add'>+        fprintf(stderr, "glfs_h_mkdir: error on mkdir of %s: from (%p),%s\n",</div><div class='add'>+                newnod_name, parent, strerror(errno));</div><div class='add'>+        printf("glfs_h_mknod tests: FAILED\n");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    peek_stat(&amp;sb);</div><div class='add'>+</div><div class='add'>+    /* TODO: create op on a FIFO node hangs, need to check and fix</div><div class='add'>+    tmp = glfs_h_creat (fs, parent, newnod_name, O_CREAT, 0644, &amp;sb);</div><div class='add'>+    if (tmp != NULL || errno != EINVAL) {</div><div class='add'>+            fprintf (stderr, "glfs_h_creat: node create, tmp = (%p), errno =</div><div class='add'>+    %s\n", tmp, strerror (errno)); printf ("glfs_h_creat/mknod tests:</div><div class='add'>+    FAILED\n"); if (tmp != NULL) { glfs_h_close(tmp); tmp = NULL;</div><div class='add'>+            }</div><div class='add'>+    } */</div><div class='add'>+</div><div class='add'>+    glfs_h_close(leaf);</div><div class='add'>+    leaf = NULL;</div><div class='add'>+</div><div class='add'>+    leaf = glfs_h_mknod(fs, parent, newnod_name, 0644, 0, &amp;sb);</div><div class='add'>+    if (leaf != NULL || errno != EEXIST) {</div><div class='add'>+        fprintf(stderr,</div><div class='add'>+                "glfs_h_mknod: existing node, leaf = (%p), errno = %s\n", leaf,</div><div class='add'>+                strerror(errno));</div><div class='add'>+        printf("glfs_h_mknod tests: FAILED\n");</div><div class='add'>+        if (leaf != NULL) {</div><div class='add'>+            glfs_h_close(leaf);</div><div class='add'>+            leaf = NULL;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    glfs_h_close(parent);</div><div class='add'>+    parent = NULL;</div><div class='add'>+</div><div class='add'>+    printf("glfs_h_mknod tests: PASSED\n");</div><div class='add'>+</div><div class='add'>+    /* unlink tests */</div><div class='add'>+    test_h_unlink();</div><div class='add'>+</div><div class='add'>+    /* TODO: opendir tests */</div><div class='add'>+</div><div class='add'>+    /* getattr tests */</div><div class='add'>+    test_h_getsetattrs();</div><div class='add'>+</div><div class='add'>+    /* TODO: setattr tests */</div><div class='add'>+</div><div class='add'>+    /* truncate tests */</div><div class='add'>+    test_h_truncate();</div><div class='add'>+</div><div class='add'>+    /* link tests */</div><div class='add'>+    test_h_links();</div><div class='add'>+</div><div class='add'>+    /* rename tests */</div><div class='add'>+    test_h_rename();</div><div class='add'>+</div><div class='add'>+    /* performance tests */</div><div class='add'>+    test_h_performance();</div><div class='add'>+</div><div class='add'>+    /* END: New APIs test area */</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    /* Cleanup glfs handles */</div><div class='add'>+    if (root)</div><div class='add'>+        glfs_h_close(root);</div><div class='add'>+    if (parent)</div><div class='add'>+        glfs_h_close(parent);</div><div class='add'>+    if (leaf)</div><div class='add'>+        glfs_h_close(leaf);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+test_write_apis(glfs_t *fs)</div><div class='add'>+{</div><div class='add'>+    /* Add more content here */</div><div class='add'>+    /* Some apis we can get are */</div><div class='add'>+    /*</div><div class='add'>+      0. glfs_set_xlator_option()</div><div class='add'>+</div><div class='add'>+      Read/Write combinations:</div><div class='add'>+      . glfs_{p,}readv/{p,}writev</div><div class='add'>+      . glfs_pread/pwrite</div><div class='add'>+</div><div class='add'>+      tests/basic/gfapi/gfapi-async-calls-test.c</div><div class='add'>+      . glfs_read_async/write_async</div><div class='add'>+      . glfs_pread_async/pwrite_async</div><div class='add'>+      . glfs_readv_async/writev_async</div><div class='add'>+      . glfs_preadv_async/pwritev_async</div><div class='add'>+</div><div class='add'>+      . ftruncate/ftruncate_async</div><div class='add'>+      . fsync/fsync_async</div><div class='add'>+      . fdatasync/fdatasync_async</div><div class='add'>+</div><div class='add'>+    */</div><div class='add'>+</div><div class='add'>+    glfs_fd_t *fd = NULL;</div><div class='add'>+    char *filename = "/filename2";</div><div class='add'>+    int flags = O_RDWR;</div><div class='add'>+    char *buf = "some bytes!";</div><div class='add'>+    char writestr[TEST_STR_LEN];</div><div class='add'>+    struct iovec iov = {&amp;writestr, TEST_STR_LEN};</div><div class='add'>+    int ret, i;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; TEST_STR_LEN; i++)</div><div class='add'>+        writestr[i] = 0x11;</div><div class='add'>+</div><div class='add'>+    fd = glfs_open(fs, filename, flags);</div><div class='add'>+    if (!fd)</div><div class='add'>+        fprintf(stderr, "open(%s): (%p) %s\n", filename, fd, strerror(errno));</div><div class='add'>+</div><div class='add'>+    ret = glfs_writev(fd, &amp;iov, 1, flags);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(stderr, "writev(%s): %d (%s)\n", filename, ret,</div><div class='add'>+                strerror(errno));</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = glfs_pwrite(fd, buf, 10, 4, flags, NULL, NULL);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(stderr, "pwrite(%s): %d (%s)\n", filename, ret,</div><div class='add'>+                strerror(errno));</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = glfs_pwritev(fd, &amp;iov, 1, 4, flags);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(stderr, "pwritev(%s): %d (%s)\n", filename, ret,</div><div class='add'>+                strerror(errno));</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+test_metadata_ops(glfs_t *fs, glfs_t *fs2)</div><div class='add'>+{</div><div class='add'>+    glfs_fd_t *fd = NULL;</div><div class='add'>+    glfs_fd_t *fd2 = NULL;</div><div class='add'>+    struct stat sb = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    struct glfs_stat gsb = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    struct statvfs sfs;</div><div class='add'>+    char readbuf[32];</div><div class='add'>+    char writebuf[32];</div><div class='add'>+</div><div class='add'>+    char *filename = "/filename2";</div><div class='add'>+    int ret;</div><div class='add'>+</div><div class='add'>+    ret = glfs_lstat(fs, filename, &amp;sb);</div><div class='add'>+    fprintf(stderr, "lstat(%s): (%d) %s\n", filename, ret, strerror(errno));</div><div class='add'>+</div><div class='add'>+    fd = glfs_creat(fs, filename, O_RDWR, 0644);</div><div class='add'>+    fprintf(stderr, "creat(%s): (%p) %s\n", filename, fd, strerror(errno));</div><div class='add'>+</div><div class='add'>+    fd2 = glfs_open(fs2, filename, O_RDWR);</div><div class='add'>+    fprintf(stderr, "open(%s): (%p) %s\n", filename, fd, strerror(errno));</div><div class='add'>+</div><div class='add'>+    glfs_lseek(fd2, 0, SEEK_SET);</div><div class='add'>+</div><div class='add'>+    ret = glfs_read(fd2, readbuf, 32, 0);</div><div class='add'>+</div><div class='add'>+    printf("read %d, %s", ret, readbuf);</div><div class='add'>+</div><div class='add'>+    /* get stat */</div><div class='add'>+    ret = glfs_fstat(fd2, &amp;sb);</div><div class='add'>+</div><div class='add'>+    ret = glfs_access(fs, filename, R_OK);</div><div class='add'>+</div><div class='add'>+    /* set stat */</div><div class='add'>+    /* TODO: got some errors, need to fix */</div><div class='add'>+    /* ret = glfs_fsetattr(fd2, &amp;gsb); */</div><div class='add'>+</div><div class='add'>+    glfs_close(fd);</div><div class='add'>+    glfs_close(fd2);</div><div class='add'>+</div><div class='add'>+    filename = "/filename3";</div><div class='add'>+    ret = glfs_mknod(fs, filename, S_IFIFO, 0);</div><div class='add'>+    fprintf(stderr, "%s: (%d) %s\n", filename, ret, strerror(errno));</div><div class='add'>+</div><div class='add'>+    ret = glfs_lstat(fs, filename, &amp;sb);</div><div class='add'>+    fprintf(stderr, "%s: (%d) %s\n", filename, ret, strerror(errno));</div><div class='add'>+</div><div class='add'>+    ret = glfs_rename(fs, filename, "/filename4");</div><div class='add'>+    fprintf(stderr, "rename(%s): (%d) %s\n", filename, ret, strerror(errno));</div><div class='add'>+</div><div class='add'>+    ret = glfs_unlink(fs, "/filename4");</div><div class='add'>+    fprintf(stderr, "unlink(%s): (%d) %s\n", "/filename4", ret,</div><div class='add'>+            strerror(errno));</div><div class='add'>+</div><div class='add'>+    filename = "/dirname2";</div><div class='add'>+    ret = glfs_mkdir(fs, filename, 0);</div><div class='add'>+    fprintf(stderr, "%s: (%d) %s\n", filename, ret, strerror(errno));</div><div class='add'>+</div><div class='add'>+    ret = glfs_lstat(fs, filename, &amp;sb);</div><div class='add'>+    fprintf(stderr, "lstat(%s): (%d) %s\n", filename, ret, strerror(errno));</div><div class='add'>+</div><div class='add'>+    ret = glfs_rmdir(fs, filename);</div><div class='add'>+    fprintf(stderr, "rmdir(%s): (%d) %s\n", filename, ret, strerror(errno));</div><div class='add'>+}</div><div class='add'>+int</div><div class='add'>+main(int argc, char *argv[])</div><div class='add'>+{</div><div class='add'>+    glfs_t *fs2 = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    glfs_fd_t *fd = NULL;</div><div class='add'>+    glfs_fd_t *fd2 = NULL;</div><div class='add'>+    struct stat sb = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    struct glfs_stat gsb = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    struct statvfs sfs;</div><div class='add'>+    char readbuf[32];</div><div class='add'>+    char writebuf[32];</div><div class='add'>+</div><div class='add'>+    char *filename = "/filename2";</div><div class='add'>+</div><div class='add'>+    if (argc != 3) {</div><div class='add'>+        printf("Expect following args\n\t%s &lt;volname&gt; &lt;hostname&gt;\n", argv[0]);</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    fs = glfs_new(argv[1]);</div><div class='add'>+    if (!fs) {</div><div class='add'>+        fprintf(stderr, "glfs_new: returned NULL\n");</div><div class='add'>+        return 1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    //      ret = glfs_set_volfile (fs, "/tmp/posix.vol");</div><div class='add'>+</div><div class='add'>+    ret = glfs_set_volfile_server(fs, "tcp", argv[2], 24007);</div><div class='add'>+</div><div class='add'>+    //      ret = glfs_set_volfile_server (fs, "unix", "/tmp/gluster.sock", 0);</div><div class='add'>+</div><div class='add'>+    ret = glfs_set_logging(fs, "/dev/stderr", 7);</div><div class='add'>+</div><div class='add'>+    ret = glfs_init(fs);</div><div class='add'>+</div><div class='add'>+    fprintf(stderr, "glfs_init: returned %d\n", ret);</div><div class='add'>+</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    sleep(2);</div><div class='add'>+</div><div class='add'>+    fs2 = glfs_new(argv[1]);</div><div class='add'>+    if (!fs2) {</div><div class='add'>+        fprintf(stderr, "glfs_new: returned NULL\n");</div><div class='add'>+        return 1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    //      ret = glfs_set_volfile (fs2, "/tmp/posix.vol");</div><div class='add'>+</div><div class='add'>+    ret = glfs_set_volfile_server(fs2, "tcp", argv[2], 24007);</div><div class='add'>+</div><div class='add'>+    ret = glfs_set_logging(fs2, "/dev/stderr", 7);</div><div class='add'>+</div><div class='add'>+    ret = glfs_init(fs2);</div><div class='add'>+</div><div class='add'>+    fprintf(stderr, "glfs_init: returned %d\n", ret);</div><div class='add'>+</div><div class='add'>+    test_metadata_ops(fs, fs2);</div><div class='add'>+</div><div class='add'>+    test_dirops(fs);</div><div class='add'>+</div><div class='add'>+    test_xattr(fs);</div><div class='add'>+</div><div class='add'>+    test_chdir(fs);</div><div class='add'>+</div><div class='add'>+    test_handleops(argc, argv);</div><div class='add'>+    // done</div><div class='add'>+</div><div class='add'>+    /* Test some extra apis */</div><div class='add'>+    test_write_apis(fs);</div><div class='add'>+</div><div class='add'>+    glfs_statvfs(fs, "/", &amp;sfs);</div><div class='add'>+</div><div class='add'>+    glfs_fini(fs);</div><div class='add'>+    glfs_fini(fs2);</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='head'>diff --git a/api/src/Makefile.am b/api/src/Makefile.am<br/>new file mode 100644<br/>index 00000000000..7f9a7d17b35<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/api/src/Makefile.am?id=d1d7a6f35c816822fab51c820e25023863c239c1'>api/src/Makefile.am</a></div><div class='hunk'>@@ -0,0 +1,43 @@</div><div class='add'>+lib_LTLIBRARIES = libgfapi.la</div><div class='add'>+noinst_HEADERS = glfs-mem-types.h glfs-internal.h gfapi-messages.h</div><div class='add'>+libgfapi_HEADERS = glfs.h glfs-handles.h</div><div class='add'>+libgfapidir = $(includedir)/glusterfs/api</div><div class='add'>+</div><div class='add'>+EXTRA_DIST = gfapi.map gfapi.aliases</div><div class='add'>+</div><div class='add'>+libgfapi_la_SOURCES = glfs.c glfs-mgmt.c glfs-fops.c glfs-resolve.c \</div><div class='add'>+	glfs-handleops.c</div><div class='add'>+libgfapi_la_LIBADD = $(top_builddir)/libglusterfs/src/libglusterfs.la \</div><div class='add'>+	$(top_builddir)/rpc/rpc-lib/src/libgfrpc.la \</div><div class='add'>+	$(top_builddir)/rpc/xdr/src/libgfxdr.la</div><div class='add'>+</div><div class='add'>+libgfapi_la_LDFLAGS = -version-info $(GFAPI_LT_VERSION) $(GF_LDFLAGS) \</div><div class='add'>+	$(GFAPI_EXTRA_LDFLAGS) $(ACL_LIBS)</div><div class='add'>+</div><div class='add'>+libgfapi_la_CPPFLAGS = $(GF_CPPFLAGS) -I$(top_srcdir)/libglusterfs/src \</div><div class='add'>+        -I$(top_srcdir)/rpc/rpc-lib/src \</div><div class='add'>+        -I$(top_srcdir)/rpc/xdr/src \</div><div class='add'>+        -I$(top_builddir)/rpc/xdr/src \</div><div class='add'>+        -DDATADIR=\"$(localstatedir)\" \</div><div class='add'>+        -D__USE_FILE_OFFSET64 -D__USE_LARGEFILE64</div><div class='add'>+</div><div class='add'>+AM_CFLAGS = -Wall $(GF_CFLAGS)</div><div class='add'>+</div><div class='add'>+xlator_LTLIBRARIES = api.la</div><div class='add'>+xlatordir = $(libdir)/glusterfs/$(PACKAGE_VERSION)/xlator/mount</div><div class='add'>+# workaround for broken parallel install support in automake with LTLIBRARIES</div><div class='add'>+# http://debbugs.gnu.org/cgi/bugreport.cgi?bug=7328</div><div class='add'>+install_xlatorLTLIBRARIES = install-xlatorLTLIBRARIES</div><div class='add'>+$(install_xlatorLTLIBRARIES): install-libLTLIBRARIES</div><div class='add'>+</div><div class='add'>+api_la_SOURCES = glfs-master.c</div><div class='add'>+api_la_DEPENDENCIES = libgfapi.la</div><div class='add'>+api_la_CPPFLAGS = $(GF_CPPFLAGS) -I$(top_srcdir)/libglusterfs/src \</div><div class='add'>+	-I$(top_srcdir)/rpc/xdr/src \</div><div class='add'>+	-I$(top_builddir)/rpc/xdr/src</div><div class='add'>+api_la_LDFLAGS = -module $(GF_XLATOR_DEFAULT_LDFLAGS)</div><div class='add'>+#api_la_LDFLAGS = -module $(GF_XLATOR_DEFAULT_LDFLAGS) $(GF_LDFLAGS)</div><div class='add'>+api_la_LIBADD = $(top_builddir)/libglusterfs/src/libglusterfs.la \</div><div class='add'>+	$(top_builddir)/rpc/rpc-lib/src/libgfrpc.la \</div><div class='add'>+	$(top_builddir)/rpc/xdr/src/libgfxdr.la \</div><div class='add'>+	$(top_builddir)/api/src/libgfapi.la</div><div class='head'>diff --git a/api/src/README.Symbol_Versions b/api/src/README.Symbol_Versions<br/>new file mode 100644<br/>index 00000000000..b6ec95f9311<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/api/src/README.Symbol_Versions?id=d1d7a6f35c816822fab51c820e25023863c239c1'>api/src/README.Symbol_Versions</a></div><div class='hunk'>@@ -0,0 +1,3 @@</div><div class='add'>+</div><div class='add'>+See ../../doc/developer-guide/gfapi-symbol-versions.md</div><div class='add'>+</div><div class='head'>diff --git a/api/src/gfapi-messages.h b/api/src/gfapi-messages.h<br/>new file mode 100644<br/>index 00000000000..b9223940416<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/api/src/gfapi-messages.h?id=d1d7a6f35c816822fab51c820e25023863c239c1'>api/src/gfapi-messages.h</a></div><div class='hunk'>@@ -0,0 +1,147 @@</div><div class='add'>+/*</div><div class='add'>+ *   Copyright (c) 2015-2018 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+ *   This file is part of GlusterFS.</div><div class='add'>+ *</div><div class='add'>+ *   This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+ *   General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+ *   later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+ *   cases as published by the Free Software Foundation.</div><div class='add'>+ *   */</div><div class='add'>+</div><div class='add'>+#ifndef _GFAPI_MESSAGES_H__</div><div class='add'>+#define _GFAPI_MESSAGES_H__</div><div class='add'>+</div><div class='add'>+#include &lt;glusterfs/glfs-message-id.h&gt;</div><div class='add'>+</div><div class='add'>+/* To add new message IDs, append new identifiers at the end of the list.</div><div class='add'>+ *</div><div class='add'>+ * Never remove a message ID. If it's not used anymore, you can rename it or</div><div class='add'>+ * leave it as it is, but not delete it. This is to prevent reutilization of</div><div class='add'>+ * IDs by other messages.</div><div class='add'>+ *</div><div class='add'>+ * The component name must match one of the entries defined in</div><div class='add'>+ * glfs-message-id.h.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+GLFS_MSGID(API, API_MSG_MEM_ACCT_INIT_FAILED, API_MSG_MASTER_XLATOR_INIT_FAILED,</div><div class='add'>+           API_MSG_GFAPI_XLATOR_INIT_FAILED, API_MSG_VOLFILE_OPEN_FAILED,</div><div class='add'>+           API_MSG_VOL_SPEC_FILE_ERROR, API_MSG_GLFS_FSOBJ_NULL,</div><div class='add'>+           API_MSG_INVALID_ENTRY, API_MSG_FSMUTEX_LOCK_FAILED,</div><div class='add'>+           API_MSG_COND_WAIT_FAILED, API_MSG_FSMUTEX_UNLOCK_FAILED,</div><div class='add'>+           API_MSG_INODE_REFRESH_FAILED, API_MSG_GRAPH_CONSTRUCT_FAILED,</div><div class='add'>+           API_MSG_API_XLATOR_ERROR, API_MSG_XDR_PAYLOAD_FAILED,</div><div class='add'>+           API_MSG_GET_VOLINFO_CBK_FAILED, API_MSG_FETCH_VOLUUID_FAILED,</div><div class='add'>+           API_MSG_INSUFF_SIZE, API_MSG_FRAME_CREAT_FAILED,</div><div class='add'>+           API_MSG_DICT_SET_FAILED, API_MSG_XDR_DECODE_FAILED,</div><div class='add'>+           API_MSG_GET_VOLFILE_FAILED, API_MSG_WRONG_OPVERSION,</div><div class='add'>+           API_MSG_DICT_SERIALIZE_FAILED, API_MSG_REMOTE_HOST_CONN_FAILED,</div><div class='add'>+           API_MSG_VOLFILE_SERVER_EXHAUST, API_MSG_CREATE_RPC_CLIENT_FAILED,</div><div class='add'>+           API_MSG_REG_NOTIFY_FUNC_FAILED, API_MSG_REG_CBK_FUNC_FAILED,</div><div class='add'>+           API_MSG_GET_CWD_FAILED, API_MSG_FGETXATTR_FAILED,</div><div class='add'>+           API_MSG_LOCKINFO_KEY_MISSING, API_MSG_FSETXATTR_FAILED,</div><div class='add'>+           API_MSG_FSYNC_FAILED, API_MSG_FDCREATE_FAILED,</div><div class='add'>+           API_MSG_INODE_PATH_FAILED, API_MSG_SYNCOP_OPEN_FAILED,</div><div class='add'>+           API_MSG_LOCK_MIGRATE_FAILED, API_MSG_OPENFD_SKIPPED,</div><div class='add'>+           API_MSG_FIRST_LOOKUP_GRAPH_FAILED, API_MSG_CWD_GRAPH_REF_FAILED,</div><div class='add'>+           API_MSG_SWITCHED_GRAPH, API_MSG_XDR_RESPONSE_DECODE_FAILED,</div><div class='add'>+           API_MSG_VOLFILE_INFO, API_MSG_VOLFILE_CONNECTING, API_MSG_NEW_GRAPH,</div><div class='add'>+           API_MSG_ALLOC_FAILED, API_MSG_CREATE_HANDLE_FAILED,</div><div class='add'>+           API_MSG_INODE_LINK_FAILED, API_MSG_STATEDUMP_FAILED,</div><div class='add'>+           API_MSG_XREADDIRP_R_FAILED, API_MSG_LOCK_INSERT_MERGE_FAILED,</div><div class='add'>+           API_MSG_SETTING_LOCK_TYPE_FAILED, API_MSG_INODE_FIND_FAILED,</div><div class='add'>+           API_MSG_FDCTX_SET_FAILED, API_MSG_UPCALL_SYNCOP_FAILED,</div><div class='add'>+           API_MSG_INVALID_ARG, API_MSG_UPCALL_EVENT_NULL_RECEIVED,</div><div class='add'>+           API_MSG_FLAGS_HANDLE, API_MSG_FDCREATE_FAILED_ON_GRAPH,</div><div class='add'>+           API_MSG_TRANS_RDMA_DEP, API_MSG_TRANS_NOT_SUPPORTED,</div><div class='add'>+           API_MSG_FS_NOT_INIT, API_MSG_INVALID_SYSRQ,</div><div class='add'>+           API_MSG_DECODE_XDR_FAILED, API_MSG_NULL, API_MSG_CALL_NOT_SUCCESSFUL,</div><div class='add'>+           API_MSG_CALL_NOT_VALID, API_MSG_UNABLE_TO_DEL,</div><div class='add'>+           API_MSG_REMOTE_HOST_DISCONN, API_MSG_HANDLE_NOT_SET);</div><div class='add'>+</div><div class='add'>+#define API_MSG_ALLOC_FAILED_STR "Upcall allocation failed"</div><div class='add'>+#define API_MSG_LOCK_INSERT_MERGE_FAILED_STR                                   \</div><div class='add'>+    "Lock insertion and splitting/merging failed"</div><div class='add'>+#define API_MSG_SETTING_LOCK_TYPE_FAILED_STR "Setting lock type failed"</div><div class='add'>+</div><div class='add'>+#define API_MSG_INVALID_ARG_STR "Invalid"</div><div class='add'>+#define API_MSG_INVALID_ENTRY_STR "Upcall entry validation failed"</div><div class='add'>+#define API_MSG_INODE_FIND_FAILED_STR "Unable to find inode entry"</div><div class='add'>+#define API_MSG_CREATE_HANDLE_FAILED_STR "handle creation failed"</div><div class='add'>+#define API_MSG_UPCALL_EVENT_NULL_RECEIVED_STR                                 \</div><div class='add'>+    "Upcall_EVENT_NULL received. Skipping it"</div><div class='add'>+#define API_MSG_UPCALL_SYNCOP_FAILED_STR "Synctask for upcall failed"</div><div class='add'>+#define API_MSG_FDCREATE_FAILED_STR "Allocating anonymous fd failed"</div><div class='add'>+#define API_MSG_XREADDIRP_R_FAILED_STR "glfs_x_readdirp_r failed"</div><div class='add'>+#define API_MSG_FDCTX_SET_FAILED_STR "Setting fd ctx failed"</div><div class='add'>+#define API_MSG_FLAGS_HANDLE_STR "arg not set. Flags handled are"</div><div class='add'>+#define API_MSG_INODE_REFRESH_FAILED_STR "inode refresh failed"</div><div class='add'>+#define API_MSG_INODE_LINK_FAILED_STR "inode linking failed"</div><div class='add'>+#define API_MSG_GET_CWD_FAILED_STR "Failed to get cwd"</div><div class='add'>+#define API_MSG_FGETXATTR_FAILED_STR "fgetxattr failed"</div><div class='add'>+#define API_MSG_LOCKINFO_KEY_MISSING_STR "missing lockinfo key"</div><div class='add'>+#define API_MSG_FSYNC_FAILED_STR "fsync() failed"</div><div class='add'>+#define API_MSG_FDCREATE_FAILED_ON_GRAPH_STR "fd_create failed on graph"</div><div class='add'>+#define API_MSG_INODE_PATH_FAILED_STR "inode_path failed"</div><div class='add'>+#define API_MSG_SYNCOP_OPEN_FAILED_STR "syncop_open failed"</div><div class='add'>+#define API_MSG_LOCK_MIGRATE_FAILED_STR "lock migration failed on graph"</div><div class='add'>+#define API_MSG_OPENFD_SKIPPED_STR "skipping openfd in graph"</div><div class='add'>+#define API_MSG_FIRST_LOOKUP_GRAPH_FAILED_STR "first lookup on graph failed"</div><div class='add'>+#define API_MSG_CWD_GRAPH_REF_FAILED_STR "cwd refresh of graph failed"</div><div class='add'>+#define API_MSG_SWITCHED_GRAPH_STR "switched to graph"</div><div class='add'>+#define API_MSG_FSETXATTR_FAILED_STR "fsetxattr failed"</div><div class='add'>+#define API_MSG_MEM_ACCT_INIT_FAILED_STR "Memory accounting init failed"</div><div class='add'>+#define API_MSG_MASTER_XLATOR_INIT_FAILED_STR                                  \</div><div class='add'>+    "master xlator for initialization failed"</div><div class='add'>+#define API_MSG_GFAPI_XLATOR_INIT_FAILED_STR                                   \</div><div class='add'>+    "failed to initialize gfapi translator"</div><div class='add'>+#define API_MSG_VOLFILE_OPEN_FAILED_STR "volume file open failed"</div><div class='add'>+#define API_MSG_VOL_SPEC_FILE_ERROR_STR "Cannot reach volume specification file"</div><div class='add'>+#define API_MSG_TRANS_RDMA_DEP_STR                                             \</div><div class='add'>+    "transport RDMA is deprecated, falling back to tcp"</div><div class='add'>+#define API_MSG_TRANS_NOT_SUPPORTED_STR                                        \</div><div class='add'>+    "transport is not supported, possible values tcp|unix"</div><div class='add'>+#define API_MSG_GLFS_FSOBJ_NULL_STR "fs is NULL"</div><div class='add'>+#define API_MSG_FS_NOT_INIT_STR "fs is not properly initialized"</div><div class='add'>+#define API_MSG_FSMUTEX_LOCK_FAILED_STR                                        \</div><div class='add'>+    "pthread lock on glfs mutex, returned error"</div><div class='add'>+#define API_MSG_FSMUTEX_UNLOCK_FAILED_STR                                      \</div><div class='add'>+    "pthread unlock on glfs mutex, returned error"</div><div class='add'>+#define API_MSG_COND_WAIT_FAILED_STR "cond wait failed"</div><div class='add'>+#define API_MSG_INVALID_SYSRQ_STR "not a valid sysrq"</div><div class='add'>+#define API_MSG_GRAPH_CONSTRUCT_FAILED_STR "failed to construct the graph"</div><div class='add'>+#define API_MSG_API_XLATOR_ERROR_STR                                           \</div><div class='add'>+    "api master xlator cannot be specified in volume file"</div><div class='add'>+#define API_MSG_STATEDUMP_FAILED_STR "statedump failed"</div><div class='add'>+#define API_MSG_DECODE_XDR_FAILED_STR                                          \</div><div class='add'>+    "Failed to decode xdr response for GF_CBK_STATEDUMP"</div><div class='add'>+#define API_MSG_NULL_STR "NULL"</div><div class='add'>+#define API_MSG_XDR_PAYLOAD_FAILED_STR "failed to create XDR payload"</div><div class='add'>+#define API_MSG_CALL_NOT_SUCCESSFUL_STR                                        \</div><div class='add'>+    "GET_VOLUME_INFO RPC call is not successful"</div><div class='add'>+#define API_MSG_XDR_RESPONSE_DECODE_FAILED_STR                                 \</div><div class='add'>+    "Failed to decode xdr response for GET_VOLUME_INFO"</div><div class='add'>+#define API_MSG_CALL_NOT_VALID_STR                                             \</div><div class='add'>+    "Response received for GET_VOLUME_INFO RPC is not valid"</div><div class='add'>+#define API_MSG_GET_VOLINFO_CBK_FAILED_STR                                     \</div><div class='add'>+    "In GET_VOLUME_INFO cbk, received error"</div><div class='add'>+#define API_MSG_FETCH_VOLUUID_FAILED_STR "Unable to fetch volume UUID"</div><div class='add'>+#define API_MSG_INSUFF_SIZE_STR "Insufficient size passed"</div><div class='add'>+#define API_MSG_FRAME_CREAT_FAILED_STR "failed to create the frame"</div><div class='add'>+#define API_MSG_DICT_SET_FAILED_STR "failed to set"</div><div class='add'>+#define API_MSG_XDR_DECODE_FAILED_STR "XDR decoding error"</div><div class='add'>+#define API_MSG_GET_VOLFILE_FAILED_STR "failed to get the volume file"</div><div class='add'>+#define API_MSG_VOLFILE_INFO_STR "No change in volfile, continuing"</div><div class='add'>+#define API_MSG_UNABLE_TO_DEL_STR "unable to delete file"</div><div class='add'>+#define API_MSG_WRONG_OPVERSION_STR                                            \</div><div class='add'>+    "Server is operating at an op-version which is not supported"</div><div class='add'>+#define API_MSG_DICT_SERIALIZE_FAILED_STR "Failed to serialize dictionary"</div><div class='add'>+#define API_MSG_REMOTE_HOST_CONN_FAILED_STR "Failed to connect to remote-host"</div><div class='add'>+#define API_MSG_REMOTE_HOST_DISCONN_STR "disconnected from remote-host"</div><div class='add'>+#define API_MSG_VOLFILE_SERVER_EXHAUST_STR "Exhausted all volfile servers"</div><div class='add'>+#define API_MSG_VOLFILE_CONNECTING_STR "connecting to next volfile server"</div><div class='add'>+#define API_MSG_CREATE_RPC_CLIENT_FAILED_STR "failed to create rpc clnt"</div><div class='add'>+#define API_MSG_REG_NOTIFY_FUNC_FAILED_STR "failed to register notify function"</div><div class='add'>+#define API_MSG_REG_CBK_FUNC_FAILED_STR "failed to register callback function"</div><div class='add'>+#define API_MSG_NEW_GRAPH_STR "New graph coming up"</div><div class='add'>+#define API_MSG_HANDLE_NOT_SET_STR "handle not set. Flags handled for xstat are"</div><div class='add'>+#endif /* !_GFAPI_MESSAGES_H__ */</div><div class='head'>diff --git a/api/src/gfapi.aliases b/api/src/gfapi.aliases<br/>new file mode 100644<br/>index 00000000000..bc639e6b99f<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/api/src/gfapi.aliases?id=d1d7a6f35c816822fab51c820e25023863c239c1'>api/src/gfapi.aliases</a></div><div class='hunk'>@@ -0,0 +1,201 @@</div><div class='add'>+</div><div class='add'>+_priv_glfs_loc_touchup _glfs_loc_touchup$GFAPI_PRIVATE_3.4.0</div><div class='add'>+_priv_glfs_active_subvol _glfs_active_subvol$GFAPI_PRIVATE_3.4.0</div><div class='add'>+_priv_glfs_subvol_done _glfs_subvol_done$GFAPI_PRIVATE_3.4.0</div><div class='add'>+_priv_glfs_init_done _glfs_init_done$GFAPI_PRIVATE_3.4.0</div><div class='add'>+_priv_glfs_resolve_at _glfs_resolve_at$GFAPI_PRIVATE_3.4.0</div><div class='add'>+</div><div class='add'>+_pub_glfs_new _glfs_new$GFAPI_3.4.0</div><div class='add'>+_pub_glfs_set_volfile _glfs_set_volfile$GFAPI_3.4.0</div><div class='add'>+_pub_glfs_set_volfile_server _glfs_set_volfile_server$GFAPI_3.4.0</div><div class='add'>+_pub_glfs_set_logging _glfs_set_logging$GFAPI_3.4.0</div><div class='add'>+_pub_glfs_init _glfs_init$GFAPI_3.4.0</div><div class='add'>+_pub_glfs_fini _glfs_fini$GFAPI_3.4.0</div><div class='add'>+_pub_glfs_open _glfs_open$GFAPI_3.4.0</div><div class='add'>+_pub_glfs_creat _glfs_creat$GFAPI_3.4.0</div><div class='add'>+_pub_glfs_close _glfs_close$GFAPI_3.4.0</div><div class='add'>+_pub_glfs_from_glfd _glfs_from_glfd$GFAPI_3.4.0</div><div class='add'>+_pub_glfs_set_xlator_option _glfs_set_xlator_option$GFAPI_3.4.0</div><div class='add'>+_pub_glfs_read _glfs_read$GFAPI_3.4.0</div><div class='add'>+_pub_glfs_write _glfs_write$GFAPI_3.4.0</div><div class='add'>+_pub_glfs_readv _glfs_readv$GFAPI_3.4.0</div><div class='add'>+_pub_glfs_writev _glfs_writev$GFAPI_3.4.0</div><div class='add'>+_pub_glfs_pread34 _glfs_pread$GFAPI_3.4.0</div><div class='add'>+_pub_glfs_pwrite34 _glfs_pwrite$GFAPI_3.4.0</div><div class='add'>+_pub_glfs_pread_async34 _glfs_pread_async$GFAPI_3.4.0</div><div class='add'>+_pub_glfs_pwrite_async34 _glfs_pwrite_async$GFAPI_3.4.0</div><div class='add'>+_pub_glfs_preadv _glfs_preadv$GFAPI_3.4.0</div><div class='add'>+_pub_glfs_pwritev _glfs_pwritev$GFAPI_3.4.0</div><div class='add'>+_pub_glfs_lseek _glfs_lseek$GFAPI_3.4.0</div><div class='add'>+_pub_glfs_ftruncate34 _glfs_ftruncate$GFAPI_3.4.0</div><div class='add'>+_pub_glfs_ftruncate_async34 _glfs_ftruncate_async$GFAPI_3.4.0</div><div class='add'>+_pub_glfs_lstat _glfs_lstat$GFAPI_3.4.0</div><div class='add'>+_pub_glfs_stat _glfs_stat$GFAPI_3.4.0</div><div class='add'>+_pub_glfs_fstat _glfs_fstat$GFAPI_3.4.0</div><div class='add'>+_pub_glfs_fsync34 _glfs_fsync$GFAPI_3.4.0</div><div class='add'>+_pub_glfs_fsync_async34 _glfs_fsync_async$GFAPI_3.4.0</div><div class='add'>+_pub_glfs_fdatasync34 _glfs_fdatasync$GFAPI_3.4.0</div><div class='add'>+_pub_glfs_fdatasync_async34 _glfs_fdatasync_async$GFAPI_3.4.0</div><div class='add'>+_pub_glfs_access _glfs_access$GFAPI_3.4.0</div><div class='add'>+_pub_glfs_symlink _glfs_symlink$GFAPI_3.4.0</div><div class='add'>+_pub_glfs_readlink _glfs_readlink$GFAPI_3.4.0</div><div class='add'>+_pub_glfs_mknod _glfs_mknod$GFAPI_3.4.0</div><div class='add'>+_pub_glfs_mkdir _glfs_mkdir$GFAPI_3.4.0</div><div class='add'>+_pub_glfs_unlink _glfs_unlink$GFAPI_3.4.0</div><div class='add'>+_pub_glfs_rmdir _glfs_rmdir$GFAPI_3.4.0</div><div class='add'>+_pub_glfs_rename _glfs_rename$GFAPI_3.4.0</div><div class='add'>+_pub_glfs_link _glfs_link$GFAPI_3.4.0</div><div class='add'>+_pub_glfs_opendir _glfs_opendir$GFAPI_3.4.0</div><div class='add'>+_pub_glfs_readdir_r _glfs_readdir_r$GFAPI_3.4.0</div><div class='add'>+_pub_glfs_readdirplus_r _glfs_readdirplus_r$GFAPI_3.4.0</div><div class='add'>+_pub_glfs_telldir _glfs_telldir$GFAPI_3.4.0</div><div class='add'>+_pub_glfs_seekdir _glfs_seekdir$GFAPI_3.4.0</div><div class='add'>+_pub_glfs_closedir _glfs_closedir$GFAPI_3.4.0</div><div class='add'>+_pub_glfs_statvfs _glfs_statvfs$GFAPI_3.4.0</div><div class='add'>+_pub_glfs_chmod _glfs_chmod$GFAPI_3.4.0</div><div class='add'>+_pub_glfs_fchmod _glfs_fchmod$GFAPI_3.4.0</div><div class='add'>+_pub_glfs_chown _glfs_chown$GFAPI_3.4.0</div><div class='add'>+_pub_glfs_lchown _glfs_lchown$GFAPI_3.4.0</div><div class='add'>+_pub_glfs_fchown _glfs_fchown$GFAPI_3.4.0</div><div class='add'>+_pub_glfs_utimens _glfs_utimens$GFAPI_3.4.0</div><div class='add'>+_pub_glfs_lutimens _glfs_lutimens$GFAPI_3.4.0</div><div class='add'>+_pub_glfs_futimens _glfs_futimens$GFAPI_3.4.0</div><div class='add'>+_pub_glfs_getxattr _glfs_getxattr$GFAPI_3.4.0</div><div class='add'>+_pub_glfs_lgetxattr _glfs_lgetxattr$GFAPI_3.4.0</div><div class='add'>+_pub_glfs_fgetxattr _glfs_fgetxattr$GFAPI_3.4.0</div><div class='add'>+_pub_glfs_listxattr _glfs_listxattr$GFAPI_3.4.0</div><div class='add'>+_pub_glfs_llistxattr _glfs_llistxattr$GFAPI_3.4.0</div><div class='add'>+_pub_glfs_flistxattr _glfs_flistxattr$GFAPI_3.4.0</div><div class='add'>+_pub_glfs_setxattr _glfs_setxattr$GFAPI_3.4.0</div><div class='add'>+_pub_glfs_lsetxattr _glfs_lsetxattr$GFAPI_3.4.0</div><div class='add'>+_pub_glfs_fsetxattr _glfs_fsetxattr$GFAPI_3.4.0</div><div class='add'>+_pub_glfs_removexattr _glfs_removexattr$GFAPI_3.4.0</div><div class='add'>+_pub_glfs_lremovexattr _glfs_lremovexattr$GFAPI_3.4.0</div><div class='add'>+_pub_glfs_fremovexattr _glfs_fremovexattr$GFAPI_3.4.0</div><div class='add'>+_pub_glfs_getcwd _glfs_getcwd$GFAPI_3.4.0</div><div class='add'>+_pub_glfs_chdir _glfs_chdir$GFAPI_3.4.0</div><div class='add'>+_pub_glfs_fchdir _glfs_fchdir$GFAPI_3.4.0</div><div class='add'>+_pub_glfs_realpath34 _glfs_realpath$GFAPI_3.4.0</div><div class='add'>+_pub_glfs_posix_lock _glfs_posix_lock$GFAPI_3.4.0</div><div class='add'>+_pub_glfs_dup _glfs_dup$GFAPI_3.4.0</div><div class='add'>+</div><div class='add'>+_pub_glfs_setfsuid _glfs_setfsuid$GFAPI_3.4.2</div><div class='add'>+_pub_glfs_setfsgid _glfs_setfsgid$GFAPI_3.4.2</div><div class='add'>+_pub_glfs_setfsgroups _glfs_setfsgroups$GFAPI_3.4.2</div><div class='add'>+_pub_glfs_h_lookupat34 _glfs_h_lookupat$GFAPI_3.4.2</div><div class='add'>+_pub_glfs_h_creat _glfs_h_creat$GFAPI_3.4.2</div><div class='add'>+_pub_glfs_h_mkdir _glfs_h_mkdir$GFAPI_3.4.2</div><div class='add'>+_pub_glfs_h_mknod _glfs_h_mknod$GFAPI_3.4.2</div><div class='add'>+_pub_glfs_h_symlink _glfs_h_symlink$GFAPI_3.4.2</div><div class='add'>+_pub_glfs_h_unlink _glfs_h_unlink$GFAPI_3.4.2</div><div class='add'>+_pub_glfs_h_close _glfs_h_close$GFAPI_3.4.2</div><div class='add'>+_pub_glfs_h_truncate _glfs_h_truncate$GFAPI_3.4.2</div><div class='add'>+_pub_glfs_h_stat _glfs_h_stat$GFAPI_3.4.2</div><div class='add'>+_pub_glfs_h_getattrs _glfs_h_getattrs$GFAPI_3.4.2</div><div class='add'>+_pub_glfs_h_setattrs _glfs_h_setattrs$GFAPI_3.4.2</div><div class='add'>+_pub_glfs_h_readlink _glfs_h_readlink$GFAPI_3.4.2</div><div class='add'>+_pub_glfs_h_link _glfs_h_link$GFAPI_3.4.2</div><div class='add'>+_pub_glfs_h_rename _glfs_h_rename$GFAPI_3.4.2</div><div class='add'>+_pub_glfs_h_extract_handle _glfs_h_extract_handle$GFAPI_3.4.2</div><div class='add'>+_pub_glfs_h_create_from_handle _glfs_h_create_from_handle$GFAPI_3.4.2</div><div class='add'>+_pub_glfs_h_opendir _glfs_h_opendir$GFAPI_3.4.2</div><div class='add'>+_pub_glfs_h_open _glfs_h_open$GFAPI_3.4.2</div><div class='add'>+</div><div class='add'>+_pub_glfs_get_volumeid _glfs_get_volumeid$GFAPI_3.5.0</div><div class='add'>+_pub_glfs_readdir _glfs_readdir$GFAPI_3.5.0</div><div class='add'>+_pub_glfs_readdirplus _glfs_readdirplus$GFAPI_3.5.0</div><div class='add'>+_pub_glfs_fallocate _glfs_fallocate$GFAPI_3.5.0</div><div class='add'>+_pub_glfs_discard _glfs_discard$GFAPI_3.5.0</div><div class='add'>+_pub_glfs_zerofill _glfs_zerofill$GFAPI_3.5.0</div><div class='add'>+_pub_glfs_caller_specific_init _glfs_caller_specific_init$GFAPI_3.5.0</div><div class='add'>+_pub_glfs_h_setxattrs _glfs_h_setxattrs$GFAPI_3.5.0</div><div class='add'>+</div><div class='add'>+_pub_glfs_unset_volfile_server _glfs_unset_volfile_server$GFAPI_3.5.1</div><div class='add'>+_pub_glfs_h_getxattrs _glfs_h_getxattrs$GFAPI_3.5.1</div><div class='add'>+_pub_glfs_h_removexattrs _glfs_h_removexattrs$GFAPI_3.5.1</div><div class='add'>+</div><div class='add'>+_pub_glfs_get_volfile _glfs_get_volfile$GFAPI_3.6.0</div><div class='add'>+_pub_glfs_h_access _glfs_h_access$GFAPI_3.6.0</div><div class='add'>+</div><div class='add'>+_pub_glfs_h_poll_upcall370 _glfs_h_poll_upcall$GFAPI_3.7.0</div><div class='add'>+_pub_glfs_h_acl_set _glfs_h_acl_set$GFAPI_3.7.0</div><div class='add'>+_pub_glfs_h_acl_get _glfs_h_acl_get$GFAPI_3.7.0</div><div class='add'>+_pub_glfs_h_statfs _glfs_h_statfs$GFAPI_3.7.0</div><div class='add'>+_pub_glfs_h_anonymous_read _glfs_h_anonymous_read$GFAPI_3.7.0</div><div class='add'>+_pub_glfs_h_anonymous_write _glfs_h_anonymous_write$GFAPI_3.7.0</div><div class='add'>+</div><div class='add'>+_priv_glfs_free_from_ctx _glfs_free_from_ctx$GFAPI_PRIVATE_3.7.0</div><div class='add'>+_priv_glfs_new_from_ctx _glfs_new_from_ctx$GFAPI_PRIVATE_3.7.0</div><div class='add'>+_priv_glfs_resolve _glfs_resolve$GFAPI_PRIVATE_3.7.0</div><div class='add'>+_priv_glfs_process_upcall_event _glfs_process_upcall_event$GFAPI_PRIVATE_3.7.0</div><div class='add'>+</div><div class='add'>+_pub_glfs_h_lookupat _glfs_h_lookupat$GFAPI_3.7.4</div><div class='add'>+</div><div class='add'>+_pub_glfs_truncate _glfs_truncate$GFAPI_3.7.15</div><div class='add'>+</div><div class='add'>+_pub_glfs_free _glfs_free$GFAPI_3.7.16</div><div class='add'>+_pub_glfs_h_poll_upcall _glfs_h_poll_upcall$GFAPI_3.7.16</div><div class='add'>+_pub_glfs_upcall_get_fs _glfs_upcall_get_fs$GFAPI_3.7.16</div><div class='add'>+_pub_glfs_upcall_get_reason _glfs_upcall_get_reason$GFAPI_3.7.16</div><div class='add'>+_pub_glfs_upcall_get_event _glfs_upcall_get_event$GFAPI_3.7.16</div><div class='add'>+_pub_glfs_upcall_inode_get_object _glfs_upcall_inode_get_object$GFAPI_3.7.16</div><div class='add'>+_pub_glfs_upcall_inode_get_flags _glfs_upcall_inode_get_flags$GFAPI_3.7.16</div><div class='add'>+_pub_glfs_upcall_inode_get_stat _glfs_upcall_inode_get_stat$GFAPI_3.7.16</div><div class='add'>+_pub_glfs_upcall_inode_get_expire _glfs_upcall_inode_get_expire$GFAPI_3.7.16</div><div class='add'>+_pub_glfs_upcall_inode_get_pobject _glfs_upcall_inode_get_pobject$GFAPI_3.7.16</div><div class='add'>+_pub_glfs_upcall_inode_get_pstat _glfs_upcall_inode_get_pstat$GFAPI_3.7.16</div><div class='add'>+_pub_glfs_upcall_inode_get_oldpobject _glfs_upcall_inode_get_oldpobject$GFAPI_3.7.16</div><div class='add'>+_pub_glfs_upcall_inode_get_oldpstat _glfs_upcall_inode_get_oldpstat$GFAPI_3.7.16</div><div class='add'>+</div><div class='add'>+_pub_glfs_realpath _glfs_realpath$GFAPI_3.7.17</div><div class='add'>+</div><div class='add'>+_pub_glfs_sysrq _glfs_sysrq$GFAPI_3.10.0</div><div class='add'>+</div><div class='add'>+_pub_glfs_fd_set_lkowner _glfs_fd_set_lkowner$GFAPI_3.10.7</div><div class='add'>+</div><div class='add'>+_pub_glfs_xreaddirplus_r _glfs_xreaddirplus_r$GFAPI_3.11.0</div><div class='add'>+_pub_glfs_xreaddirplus_r_get_stat _glfs_xreaddirplus_r_get_stat$GFAPI_3.11.0</div><div class='add'>+_pub_glfs_xreaddirplus_r_get_object _glfs_xreaddirplus_r_get_object$GFAPI_3.11.0</div><div class='add'>+_pub_glfs_object_copy _glfs_object_copy$GFAPI_3.11.0</div><div class='add'>+</div><div class='add'>+_priv_glfs_ipc _glfs_ipc$GFAPI_3.12.0</div><div class='add'>+</div><div class='add'>+_pub_glfs_upcall_register _glfs_upcall_register$GFAPI_3.13.0</div><div class='add'>+_pub_glfs_upcall_unregister _glfs_upcall_unregister$GFAPI_3.13.0</div><div class='add'>+</div><div class='add'>+_pub_glfs_setfsleaseid _glfs_setfsleaseid$GFAPI_4.0.0</div><div class='add'>+_pub_glfs_file_lock _glfs_file_lock$GFAPI_4.0.0</div><div class='add'>+_pub_glfs_lease _glfs_lease$GFAPI_4.0.0</div><div class='add'>+_pub_glfs_h_lease _glfs_h_lease$GFAPI_4.0.0</div><div class='add'>+_pub_glfs_upcall_lease_get_object _glfs_upcall_lease_get_object$GFAPI_4.1.6</div><div class='add'>+_pub_glfs_upcall_lease_get_lease_type _glfs_upcall_lease_get_lease_type$GFAPI_4.1.6</div><div class='add'>+</div><div class='add'>+_priv_glfs_statx _glfs_statx$GFAPI_6.0</div><div class='add'>+_priv_glfs_iatt_from_statx _glfs_iatt_from_statx$GFAPI_6.0</div><div class='add'>+_priv_glfs_setfspid _glfs_setfspid$GFAPI_6.1</div><div class='add'>+</div><div class='add'>+_pub_glfs_read_async _glfs_read_async$GFAPI_6.0</div><div class='add'>+_pub_glfs_write_async _glfs_write_async$GFAPI_6.0</div><div class='add'>+_pub_glfs_readv_async _glfs_readv_async$GFAPI_6.0</div><div class='add'>+_pub_glfs_writev_async _glfs_writev_async$GFAPI_6.0</div><div class='add'>+_pub_glfs_pread _glfs_pread$GFAPI_6.0</div><div class='add'>+_pub_glfs_pwrite _glfs_pwrite$GFAPI_6.0</div><div class='add'>+_pub_glfs_pread_async _glfs_pread_async$GFAPI_6.0</div><div class='add'>+_pub_glfs_pwrite_async _glfs_pwrite_async$GFAPI_6.0</div><div class='add'>+_pub_glfs_preadv_async _glfs_preadv_async$GFAPI_6.0</div><div class='add'>+_pub_glfs_pwritev_async _glfs_pwritev_async$GFAPI_6.0</div><div class='add'>+_pub_glfs_fsync _glfs_fsync$GFAPI_6.0</div><div class='add'>+_pub_glfs_fsync_async _glfs_fsync_async$GFAPI_6.0</div><div class='add'>+_pub_glfs_fdatasync _glfs_fdatasync$GFAPI_6.0</div><div class='add'>+_pub_glfs_fdatasync_async _glfs_fdatasync_async$GFAPI_6.0</div><div class='add'>+_pub_glfs_ftruncate _glfs_ftruncate$GFAPI_6.0</div><div class='add'>+_pub_glfs_ftruncate_async _glfs_ftruncate_async$GFAPI_6.0</div><div class='add'>+_pub_glfs_discard_async _glfs_discard_async$GFAPI_6.0</div><div class='add'>+_pub_glfs_zerofill_async _glfs_zerofill_async$GFAPI_6.0</div><div class='add'>+_pub_glfs_copy_file_range _glfs_copy_file_range$GFAPI_6.0</div><div class='add'>+_pub_glfs_fsetattr _glfs_fsetattr$GFAPI_6.0</div><div class='add'>+_pub_glfs_setattr _glfs_setattr$GFAPI_6.0</div><div class='add'>+</div><div class='add'>+_pub_glfs_set_statedump_path _glfs_set_statedump_path@GFAPI_7.0</div><div class='add'>+</div><div class='add'>+_pub_glfs_h_creat_open _glfs_h_creat_open@GFAPI_6.6</div><div class='head'>diff --git a/api/src/gfapi.map b/api/src/gfapi.map<br/>new file mode 100644<br/>index 00000000000..228ac47c084<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/api/src/gfapi.map?id=d1d7a6f35c816822fab51c820e25023863c239c1'>api/src/gfapi.map</a></div><div class='hunk'>@@ -0,0 +1,283 @@</div><div class='add'>+</div><div class='add'>+GFAPI_PRIVATE_3.4.0 {</div><div class='add'>+	global:</div><div class='add'>+		glfs_loc_touchup;</div><div class='add'>+		glfs_active_subvol;</div><div class='add'>+		glfs_subvol_done;</div><div class='add'>+		glfs_init_done;</div><div class='add'>+		glfs_resolve_at;</div><div class='add'>+	local: *;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+GFAPI_3.4.0 {</div><div class='add'>+	global:</div><div class='add'>+		glfs_new;</div><div class='add'>+		glfs_set_volfile;</div><div class='add'>+		glfs_set_volfile_server;</div><div class='add'>+		glfs_set_logging;</div><div class='add'>+		glfs_init;</div><div class='add'>+		glfs_fini;</div><div class='add'>+		glfs_open;</div><div class='add'>+		glfs_creat;</div><div class='add'>+		glfs_close;</div><div class='add'>+		glfs_from_glfd;</div><div class='add'>+		glfs_set_xlator_option;</div><div class='add'>+		glfs_read;</div><div class='add'>+		glfs_write;</div><div class='add'>+		glfs_read_async;</div><div class='add'>+		glfs_write_async;</div><div class='add'>+		glfs_readv;</div><div class='add'>+		glfs_writev;</div><div class='add'>+		glfs_readv_async;</div><div class='add'>+		glfs_writev_async;</div><div class='add'>+		glfs_pread;</div><div class='add'>+		glfs_pwrite;</div><div class='add'>+		glfs_pread_async;</div><div class='add'>+		glfs_pwrite_async;</div><div class='add'>+		glfs_preadv;</div><div class='add'>+		glfs_pwritev;</div><div class='add'>+		glfs_preadv_async;</div><div class='add'>+		glfs_pwritev_async;</div><div class='add'>+		glfs_lseek;</div><div class='add'>+		glfs_ftruncate;</div><div class='add'>+		glfs_ftruncate_async;</div><div class='add'>+		glfs_lstat;</div><div class='add'>+		glfs_stat;</div><div class='add'>+		glfs_fstat;</div><div class='add'>+		glfs_fsync;</div><div class='add'>+		glfs_fsync_async;</div><div class='add'>+		glfs_fdatasync;</div><div class='add'>+		glfs_fdatasync_async;</div><div class='add'>+		glfs_access;</div><div class='add'>+		glfs_symlink;</div><div class='add'>+		glfs_readlink;</div><div class='add'>+		glfs_mknod;</div><div class='add'>+		glfs_mkdir;</div><div class='add'>+		glfs_unlink;</div><div class='add'>+		glfs_rmdir;</div><div class='add'>+		glfs_rename;</div><div class='add'>+		glfs_link;</div><div class='add'>+		glfs_opendir;</div><div class='add'>+		glfs_readdir_r;</div><div class='add'>+		glfs_readdirplus_r;</div><div class='add'>+		glfs_telldir;</div><div class='add'>+		glfs_seekdir;</div><div class='add'>+		glfs_closedir;</div><div class='add'>+		glfs_statvfs;</div><div class='add'>+		glfs_chmod;</div><div class='add'>+		glfs_fchmod;</div><div class='add'>+		glfs_chown;</div><div class='add'>+		glfs_lchown;</div><div class='add'>+		glfs_fchown;</div><div class='add'>+		glfs_utimens;</div><div class='add'>+		glfs_lutimens;</div><div class='add'>+		glfs_futimens;</div><div class='add'>+		glfs_getxattr;</div><div class='add'>+		glfs_lgetxattr;</div><div class='add'>+		glfs_fgetxattr;</div><div class='add'>+		glfs_listxattr;</div><div class='add'>+		glfs_llistxattr;</div><div class='add'>+		glfs_flistxattr;</div><div class='add'>+		glfs_setxattr;</div><div class='add'>+		glfs_lsetxattr;</div><div class='add'>+		glfs_fsetxattr;</div><div class='add'>+		glfs_removexattr;</div><div class='add'>+		glfs_lremovexattr;</div><div class='add'>+		glfs_fremovexattr;</div><div class='add'>+		glfs_getcwd;</div><div class='add'>+		glfs_chdir;</div><div class='add'>+		glfs_fchdir;</div><div class='add'>+		glfs_realpath;</div><div class='add'>+		glfs_posix_lock;</div><div class='add'>+		glfs_dup;</div><div class='add'>+} GFAPI_PRIVATE_3.4.0;</div><div class='add'>+</div><div class='add'>+GFAPI_3.4.2 {</div><div class='add'>+	global:</div><div class='add'>+		glfs_setfsuid;</div><div class='add'>+		glfs_setfsgid;</div><div class='add'>+		glfs_setfsgroups;</div><div class='add'>+		glfs_h_creat;</div><div class='add'>+		glfs_h_mkdir;</div><div class='add'>+		glfs_h_mknod;</div><div class='add'>+		glfs_h_symlink;</div><div class='add'>+		glfs_h_unlink;</div><div class='add'>+		glfs_h_close;</div><div class='add'>+		glfs_h_truncate;</div><div class='add'>+		glfs_h_stat;</div><div class='add'>+		glfs_h_getattrs;</div><div class='add'>+		glfs_h_setattrs;</div><div class='add'>+		glfs_h_readlink;</div><div class='add'>+		glfs_h_link;</div><div class='add'>+		glfs_h_rename;</div><div class='add'>+		glfs_h_extract_handle;</div><div class='add'>+		glfs_h_create_from_handle;</div><div class='add'>+		glfs_h_opendir;</div><div class='add'>+		glfs_h_open;</div><div class='add'>+		glfs_h_lookupat;</div><div class='add'>+} GFAPI_3.4.0;</div><div class='add'>+</div><div class='add'>+GFAPI_3.5.0 {</div><div class='add'>+	global:</div><div class='add'>+		glfs_get_volumeid;</div><div class='add'>+		glfs_readdir;</div><div class='add'>+		glfs_readdirplus;</div><div class='add'>+		glfs_fallocate;</div><div class='add'>+		glfs_discard;</div><div class='add'>+		glfs_discard_async;</div><div class='add'>+		glfs_zerofill;</div><div class='add'>+		glfs_zerofill_async;</div><div class='add'>+		glfs_caller_specific_init;</div><div class='add'>+		glfs_h_setxattrs;</div><div class='add'>+} GFAPI_3.4.2;</div><div class='add'>+</div><div class='add'>+GFAPI_3.5.1 {</div><div class='add'>+	global:</div><div class='add'>+		glfs_unset_volfile_server;</div><div class='add'>+		glfs_h_getxattrs;</div><div class='add'>+		glfs_h_removexattrs;</div><div class='add'>+} GFAPI_3.5.0;</div><div class='add'>+</div><div class='add'>+GFAPI_3.6.0 {</div><div class='add'>+	global:</div><div class='add'>+		glfs_get_volfile;</div><div class='add'>+		glfs_h_access;</div><div class='add'>+} GFAPI_3.5.1;</div><div class='add'>+</div><div class='add'>+GFAPI_3.7.0 {</div><div class='add'>+	global:</div><div class='add'>+		glfs_h_poll_upcall;</div><div class='add'>+		glfs_h_acl_set;</div><div class='add'>+		glfs_h_acl_get;</div><div class='add'>+		glfs_h_statfs;</div><div class='add'>+		glfs_h_anonymous_read;</div><div class='add'>+		glfs_h_anonymous_write;</div><div class='add'>+} GFAPI_3.6.0;</div><div class='add'>+</div><div class='add'>+GFAPI_PRIVATE_3.7.0 {</div><div class='add'>+	global:</div><div class='add'>+		glfs_free_from_ctx;</div><div class='add'>+		glfs_new_from_ctx;</div><div class='add'>+		glfs_resolve;</div><div class='add'>+		glfs_process_upcall_event;</div><div class='add'>+} GFAPI_3.7.0;</div><div class='add'>+</div><div class='add'>+GFAPI_3.7.4 {</div><div class='add'>+	global:</div><div class='add'>+		glfs_h_lookupat;</div><div class='add'>+} GFAPI_PRIVATE_3.7.0;</div><div class='add'>+</div><div class='add'>+GFAPI_3.7.15 {</div><div class='add'>+	global:</div><div class='add'>+		glfs_truncate;</div><div class='add'>+} GFAPI_3.7.4;</div><div class='add'>+</div><div class='add'>+GFAPI_3.7.16 {</div><div class='add'>+	global:</div><div class='add'>+		glfs_free;</div><div class='add'>+		glfs_upcall_get_fs;</div><div class='add'>+		glfs_upcall_get_reason;</div><div class='add'>+		glfs_upcall_get_event;</div><div class='add'>+		glfs_upcall_inode_get_object;</div><div class='add'>+		glfs_upcall_inode_get_flags;</div><div class='add'>+		glfs_upcall_inode_get_stat;</div><div class='add'>+		glfs_upcall_inode_get_expire;</div><div class='add'>+		glfs_upcall_inode_get_pobject;</div><div class='add'>+		glfs_upcall_inode_get_pstat;</div><div class='add'>+		glfs_upcall_inode_get_oldpobject;</div><div class='add'>+		glfs_upcall_inode_get_oldpstat;</div><div class='add'>+		glfs_h_poll_upcall;</div><div class='add'>+} GFAPI_3.7.15;</div><div class='add'>+</div><div class='add'>+GFAPI_3.7.17 {</div><div class='add'>+	global:</div><div class='add'>+		glfs_realpath;</div><div class='add'>+} GFAPI_3.7.16;</div><div class='add'>+</div><div class='add'>+GFAPI_3.10.0 {</div><div class='add'>+	global:</div><div class='add'>+		glfs_sysrq;</div><div class='add'>+} GFAPI_3.7.17;</div><div class='add'>+</div><div class='add'>+GFAPI_3.10.7 {</div><div class='add'>+	global:</div><div class='add'>+		glfs_fd_set_lkowner;</div><div class='add'>+} GFAPI_3.10.0;</div><div class='add'>+</div><div class='add'>+GFAPI_3.11.0 {</div><div class='add'>+		glfs_xreaddirplus_r;</div><div class='add'>+		glfs_xreaddirplus_r_get_stat;</div><div class='add'>+		glfs_xreaddirplus_r_get_object;</div><div class='add'>+		glfs_object_copy;</div><div class='add'>+} GFAPI_3.10.7;</div><div class='add'>+</div><div class='add'>+GFAPI_PRIVATE_3.12.0 {</div><div class='add'>+	global:</div><div class='add'>+		glfs_ipc;</div><div class='add'>+} GFAPI_3.11.0;</div><div class='add'>+</div><div class='add'>+GFAPI_3.13.0 {</div><div class='add'>+	global:</div><div class='add'>+		glfs_upcall_register;</div><div class='add'>+		glfs_upcall_unregister;</div><div class='add'>+} GFAPI_PRIVATE_3.12.0;</div><div class='add'>+</div><div class='add'>+GFAPI_4.0.0 {</div><div class='add'>+	global:</div><div class='add'>+		glfs_setfsleaseid;</div><div class='add'>+		glfs_file_lock;</div><div class='add'>+		glfs_lease;</div><div class='add'>+		glfs_h_lease;</div><div class='add'>+} GFAPI_3.13.0;</div><div class='add'>+</div><div class='add'>+GFAPI_4.1.6 {</div><div class='add'>+	global:</div><div class='add'>+		glfs_upcall_lease_get_object;</div><div class='add'>+		glfs_upcall_lease_get_lease_type;</div><div class='add'>+} GFAPI_4.0.0;</div><div class='add'>+</div><div class='add'>+GFAPI_PRIVATE_6.0 {</div><div class='add'>+	global:</div><div class='add'>+		glfs_statx;</div><div class='add'>+		glfs_iatt_from_statx;</div><div class='add'>+} GFAPI_4.1.6;</div><div class='add'>+</div><div class='add'>+GFAPI_6.0 {</div><div class='add'>+	global:</div><div class='add'>+		glfs_read_async;</div><div class='add'>+		glfs_write_async;</div><div class='add'>+		glfs_readv_async;</div><div class='add'>+		glfs_writev_async;</div><div class='add'>+		glfs_pread;</div><div class='add'>+		glfs_pwrite;</div><div class='add'>+		glfs_pread_async;</div><div class='add'>+		glfs_pwrite_async;</div><div class='add'>+		glfs_preadv_async;</div><div class='add'>+		glfs_pwritev_async;</div><div class='add'>+		glfs_fsync;</div><div class='add'>+		glfs_fsync_async;</div><div class='add'>+		glfs_fdatasync;</div><div class='add'>+		glfs_fdatasync_async;</div><div class='add'>+		glfs_ftruncate;</div><div class='add'>+		glfs_ftruncate_async;</div><div class='add'>+		glfs_discard_async;</div><div class='add'>+		glfs_zerofill_async;</div><div class='add'>+		glfs_copy_file_range;</div><div class='add'>+		glfs_setattr;</div><div class='add'>+		glfs_fsetattr;</div><div class='add'>+} GFAPI_PRIVATE_6.0;</div><div class='add'>+</div><div class='add'>+GFAPI_PRIVATE_6.1 {</div><div class='add'>+	global:</div><div class='add'>+		glfs_setfspid;</div><div class='add'>+} GFAPI_6.0;</div><div class='add'>+</div><div class='add'>+GFAPI_6.6 {</div><div class='add'>+	global:</div><div class='add'>+		glfs_h_creat_open;</div><div class='add'>+} GFAPI_PRIVATE_6.1;</div><div class='add'>+</div><div class='add'>+GFAPI_7.0 {</div><div class='add'>+	global:</div><div class='add'>+		glfs_set_statedump_path;</div><div class='add'>+} GFAPI_6.6;</div><div class='head'>diff --git a/api/src/glfs-fops.c b/api/src/glfs-fops.c<br/>new file mode 100644<br/>index 00000000000..6aa3c5602d1<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/api/src/glfs-fops.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>api/src/glfs-fops.c</a></div><div class='hunk'>@@ -0,0 +1,6445 @@</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+  Copyright (c) 2012-2018 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+/* for SEEK_HOLE and SEEK_DATA */</div><div class='add'>+#ifndef _GNU_SOURCE</div><div class='add'>+#define _GNU_SOURCE</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#include &lt;unistd.h&gt;</div><div class='add'>+</div><div class='add'>+#include "glfs-internal.h"</div><div class='add'>+#include "glfs-mem-types.h"</div><div class='add'>+#include &lt;glusterfs/syncop.h&gt;</div><div class='add'>+#include "glfs.h"</div><div class='add'>+#include "gfapi-messages.h"</div><div class='add'>+#include &lt;glusterfs/compat-errno.h&gt;</div><div class='add'>+#include &lt;limits.h&gt;</div><div class='add'>+#include "glusterfs3.h"</div><div class='add'>+#include &lt;glusterfs/iatt.h&gt;</div><div class='add'>+</div><div class='add'>+#ifdef NAME_MAX</div><div class='add'>+#define GF_NAME_MAX NAME_MAX</div><div class='add'>+#else</div><div class='add'>+#define GF_NAME_MAX 255</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+struct upcall_syncop_args {</div><div class='add'>+    struct glfs *fs;</div><div class='add'>+    struct gf_upcall upcall_data;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+#define READDIRBUF_SIZE (sizeof(struct dirent) + GF_NAME_MAX + 1)</div><div class='add'>+</div><div class='add'>+typedef void (*glfs_io_cbk34)(glfs_fd_t *fd, ssize_t ret, void *data);</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+ * This function will mark glfd for deletion and decrement its refcount.</div><div class='add'>+ */</div><div class='add'>+int</div><div class='add'>+glfs_mark_glfd_for_deletion(struct glfs_fd *glfd)</div><div class='add'>+{</div><div class='add'>+    LOCK(&amp;glfd-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        glfd-&gt;state = GLFD_CLOSE;</div><div class='add'>+    }</div><div class='add'>+    UNLOCK(&amp;glfd-&gt;lock);</div><div class='add'>+</div><div class='add'>+    GF_REF_PUT(glfd);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* This function is useful for all async fops. There is chance that glfd is</div><div class='add'>+ * closed before async fop is completed. When glfd is closed we change the</div><div class='add'>+ * state to GLFD_CLOSE.</div><div class='add'>+ *</div><div class='add'>+ * This function will return _gf_true if the glfd is still valid else return</div><div class='add'>+ * _gf_false.</div><div class='add'>+ */</div><div class='add'>+gf_boolean_t</div><div class='add'>+glfs_is_glfd_still_valid(struct glfs_fd *glfd)</div><div class='add'>+{</div><div class='add'>+    gf_boolean_t ret = _gf_false;</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;glfd-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        if (glfd-&gt;state != GLFD_CLOSE)</div><div class='add'>+            ret = _gf_true;</div><div class='add'>+    }</div><div class='add'>+    UNLOCK(&amp;glfd-&gt;lock);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+glfd_set_state_bind(struct glfs_fd *glfd)</div><div class='add'>+{</div><div class='add'>+    LOCK(&amp;glfd-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        glfd-&gt;state = GLFD_OPEN;</div><div class='add'>+    }</div><div class='add'>+    UNLOCK(&amp;glfd-&gt;lock);</div><div class='add'>+</div><div class='add'>+    fd_bind(glfd-&gt;fd);</div><div class='add'>+    glfs_fd_bind(glfd);</div><div class='add'>+</div><div class='add'>+    return;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+ * This routine is called when an upcall event of type</div><div class='add'>+ * 'GF_UPCALL_CACHE_INVALIDATION' is received.</div><div class='add'>+ * It makes a copy of the contents of the upcall cache-invalidation</div><div class='add'>+ * data received into an entry which is stored in the upcall list</div><div class='add'>+ * maintained by gfapi.</div><div class='add'>+ */</div><div class='add'>+int</div><div class='add'>+glfs_get_upcall_cache_invalidation(struct gf_upcall *to_up_data,</div><div class='add'>+                                   struct gf_upcall *from_up_data)</div><div class='add'>+{</div><div class='add'>+    struct gf_upcall_cache_invalidation *ca_data = NULL;</div><div class='add'>+    struct gf_upcall_cache_invalidation *f_ca_data = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    GF_VALIDATE_OR_GOTO(THIS-&gt;name, to_up_data, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(THIS-&gt;name, from_up_data, out);</div><div class='add'>+</div><div class='add'>+    f_ca_data = from_up_data-&gt;data;</div><div class='add'>+    GF_VALIDATE_OR_GOTO(THIS-&gt;name, f_ca_data, out);</div><div class='add'>+</div><div class='add'>+    ca_data = GF_CALLOC(1, sizeof(*ca_data), glfs_mt_upcall_entry_t);</div><div class='add'>+</div><div class='add'>+    if (!ca_data) {</div><div class='add'>+        gf_smsg(THIS-&gt;name, GF_LOG_ERROR, errno, API_MSG_ALLOC_FAILED, "entry",</div><div class='add'>+                NULL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    to_up_data-&gt;data = ca_data;</div><div class='add'>+</div><div class='add'>+    ca_data-&gt;flags = f_ca_data-&gt;flags;</div><div class='add'>+    ca_data-&gt;expire_time_attr = f_ca_data-&gt;expire_time_attr;</div><div class='add'>+    ca_data-&gt;stat = f_ca_data-&gt;stat;</div><div class='add'>+    ca_data-&gt;p_stat = f_ca_data-&gt;p_stat;</div><div class='add'>+    ca_data-&gt;oldp_stat = f_ca_data-&gt;oldp_stat;</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+glfs_get_upcall_lease(struct gf_upcall *to_up_data,</div><div class='add'>+                      struct gf_upcall *from_up_data)</div><div class='add'>+{</div><div class='add'>+    struct gf_upcall_recall_lease *ca_data = NULL;</div><div class='add'>+    struct gf_upcall_recall_lease *f_ca_data = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    GF_VALIDATE_OR_GOTO(THIS-&gt;name, to_up_data, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(THIS-&gt;name, from_up_data, out);</div><div class='add'>+</div><div class='add'>+    f_ca_data = from_up_data-&gt;data;</div><div class='add'>+    GF_VALIDATE_OR_GOTO(THIS-&gt;name, f_ca_data, out);</div><div class='add'>+</div><div class='add'>+    ca_data = GF_CALLOC(1, sizeof(*ca_data), glfs_mt_upcall_entry_t);</div><div class='add'>+</div><div class='add'>+    if (!ca_data) {</div><div class='add'>+        gf_smsg(THIS-&gt;name, GF_LOG_ERROR, errno, API_MSG_ALLOC_FAILED, "entry",</div><div class='add'>+                NULL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    to_up_data-&gt;data = ca_data;</div><div class='add'>+</div><div class='add'>+    ca_data-&gt;lease_type = f_ca_data-&gt;lease_type;</div><div class='add'>+    gf_uuid_copy(ca_data-&gt;tid, f_ca_data-&gt;tid);</div><div class='add'>+    ca_data-&gt;dict = f_ca_data-&gt;dict;</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+int</div><div class='add'>+glfs_loc_link(loc_t *loc, struct iatt *iatt)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    inode_t *old_inode = NULL;</div><div class='add'>+    uint64_t ctx_value = LOOKUP_NOT_NEEDED;</div><div class='add'>+</div><div class='add'>+    if (!loc-&gt;inode) {</div><div class='add'>+        errno = EINVAL;</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    old_inode = loc-&gt;inode;</div><div class='add'>+</div><div class='add'>+    /* If the inode already exists in the cache, the inode</div><div class='add'>+     * returned here points to the existing one. We need</div><div class='add'>+     * to update loc.inode accordingly.</div><div class='add'>+     */</div><div class='add'>+    loc-&gt;inode = inode_link(loc-&gt;inode, loc-&gt;parent, loc-&gt;name, iatt);</div><div class='add'>+    if (loc-&gt;inode) {</div><div class='add'>+        inode_ctx_set(loc-&gt;inode, THIS, &amp;ctx_value);</div><div class='add'>+        inode_lookup(loc-&gt;inode);</div><div class='add'>+        inode_unref(old_inode);</div><div class='add'>+        ret = 0;</div><div class='add'>+    } else {</div><div class='add'>+        ret = -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+glfs_iatt_to_stat(struct glfs *fs, struct iatt *iatt, struct stat *stat)</div><div class='add'>+{</div><div class='add'>+    iatt_to_stat(iatt, stat);</div><div class='add'>+    stat-&gt;st_dev = fs-&gt;dev_id;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+glfs_iatt_to_statx(struct glfs *fs, const struct iatt *iatt,</div><div class='add'>+                   struct glfs_stat *statx)</div><div class='add'>+{</div><div class='add'>+    statx-&gt;glfs_st_mask = 0;</div><div class='add'>+</div><div class='add'>+    statx-&gt;glfs_st_mode = 0;</div><div class='add'>+    if (IATT_TYPE_VALID(iatt-&gt;ia_flags)) {</div><div class='add'>+        statx-&gt;glfs_st_mode |= st_mode_type_from_ia(iatt-&gt;ia_type);</div><div class='add'>+        statx-&gt;glfs_st_mask |= GLFS_STAT_TYPE;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (IATT_MODE_VALID(iatt-&gt;ia_flags)) {</div><div class='add'>+        statx-&gt;glfs_st_mode |= st_mode_prot_from_ia(iatt-&gt;ia_prot);</div><div class='add'>+        statx-&gt;glfs_st_mask |= GLFS_STAT_MODE;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (IATT_NLINK_VALID(iatt-&gt;ia_flags)) {</div><div class='add'>+        statx-&gt;glfs_st_nlink = iatt-&gt;ia_nlink;</div><div class='add'>+        statx-&gt;glfs_st_mask |= GLFS_STAT_NLINK;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (IATT_UID_VALID(iatt-&gt;ia_flags)) {</div><div class='add'>+        statx-&gt;glfs_st_uid = iatt-&gt;ia_uid;</div><div class='add'>+        statx-&gt;glfs_st_mask |= GLFS_STAT_UID;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (IATT_GID_VALID(iatt-&gt;ia_flags)) {</div><div class='add'>+        statx-&gt;glfs_st_gid = iatt-&gt;ia_gid;</div><div class='add'>+        statx-&gt;glfs_st_mask |= GLFS_STAT_GID;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (IATT_ATIME_VALID(iatt-&gt;ia_flags)) {</div><div class='add'>+        statx-&gt;glfs_st_atime.tv_sec = iatt-&gt;ia_atime;</div><div class='add'>+        statx-&gt;glfs_st_atime.tv_nsec = iatt-&gt;ia_atime_nsec;</div><div class='add'>+        statx-&gt;glfs_st_mask |= GLFS_STAT_ATIME;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (IATT_MTIME_VALID(iatt-&gt;ia_flags)) {</div><div class='add'>+        statx-&gt;glfs_st_mtime.tv_sec = iatt-&gt;ia_mtime;</div><div class='add'>+        statx-&gt;glfs_st_mtime.tv_nsec = iatt-&gt;ia_mtime_nsec;</div><div class='add'>+        statx-&gt;glfs_st_mask |= GLFS_STAT_MTIME;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (IATT_CTIME_VALID(iatt-&gt;ia_flags)) {</div><div class='add'>+        statx-&gt;glfs_st_ctime.tv_sec = iatt-&gt;ia_ctime;</div><div class='add'>+        statx-&gt;glfs_st_ctime.tv_nsec = iatt-&gt;ia_ctime_nsec;</div><div class='add'>+        statx-&gt;glfs_st_mask |= GLFS_STAT_CTIME;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (IATT_BTIME_VALID(iatt-&gt;ia_flags)) {</div><div class='add'>+        statx-&gt;glfs_st_btime.tv_sec = iatt-&gt;ia_btime;</div><div class='add'>+        statx-&gt;glfs_st_btime.tv_nsec = iatt-&gt;ia_btime_nsec;</div><div class='add'>+        statx-&gt;glfs_st_mask |= GLFS_STAT_BTIME;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (IATT_INO_VALID(iatt-&gt;ia_flags)) {</div><div class='add'>+        statx-&gt;glfs_st_ino = iatt-&gt;ia_ino;</div><div class='add'>+        statx-&gt;glfs_st_mask |= GLFS_STAT_INO;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (IATT_SIZE_VALID(iatt-&gt;ia_flags)) {</div><div class='add'>+        statx-&gt;glfs_st_size = iatt-&gt;ia_size;</div><div class='add'>+        statx-&gt;glfs_st_mask |= GLFS_STAT_SIZE;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (IATT_BLOCKS_VALID(iatt-&gt;ia_flags)) {</div><div class='add'>+        statx-&gt;glfs_st_blocks = iatt-&gt;ia_blocks;</div><div class='add'>+        statx-&gt;glfs_st_mask |= GLFS_STAT_BLOCKS;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* unconditionally present, encode as is */</div><div class='add'>+    statx-&gt;glfs_st_blksize = iatt-&gt;ia_blksize;</div><div class='add'>+    statx-&gt;glfs_st_rdev_major = ia_major(iatt-&gt;ia_rdev);</div><div class='add'>+    statx-&gt;glfs_st_rdev_minor = ia_minor(iatt-&gt;ia_rdev);</div><div class='add'>+    statx-&gt;glfs_st_dev_major = ia_major(fs-&gt;dev_id);</div><div class='add'>+    statx-&gt;glfs_st_dev_minor = ia_minor(fs-&gt;dev_id);</div><div class='add'>+</div><div class='add'>+    /* At present we do not read any localFS attributes and pass them along,</div><div class='add'>+     * so setting this to 0. As we start supporting file attributes we can</div><div class='add'>+     * populate the same here as well */</div><div class='add'>+    statx-&gt;glfs_st_attributes = 0;</div><div class='add'>+    statx-&gt;glfs_st_attributes_mask = 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+GFAPI_SYMVER_PRIVATE_DEFAULT(glfs_iatt_from_statx, 6.0)</div><div class='add'>+void</div><div class='add'>+priv_glfs_iatt_from_statx(struct iatt *iatt, const struct glfs_stat *statx)</div><div class='add'>+{</div><div class='add'>+    /* Most code in xlators are not checking validity flags before accessing</div><div class='add'>+    the items. Hence zero everything before setting valid items */</div><div class='add'>+    memset(iatt, 0, sizeof(struct iatt));</div><div class='add'>+</div><div class='add'>+    if (GLFS_STAT_TYPE_VALID(statx-&gt;glfs_st_mask)) {</div><div class='add'>+        iatt-&gt;ia_type = ia_type_from_st_mode(statx-&gt;glfs_st_mode);</div><div class='add'>+        iatt-&gt;ia_flags |= IATT_TYPE;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (GLFS_STAT_MODE_VALID(statx-&gt;glfs_st_mask)) {</div><div class='add'>+        iatt-&gt;ia_prot = ia_prot_from_st_mode(statx-&gt;glfs_st_mode);</div><div class='add'>+        iatt-&gt;ia_flags |= IATT_MODE;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (GLFS_STAT_NLINK_VALID(statx-&gt;glfs_st_mask)) {</div><div class='add'>+        iatt-&gt;ia_nlink = statx-&gt;glfs_st_nlink;</div><div class='add'>+        iatt-&gt;ia_flags |= IATT_NLINK;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (GLFS_STAT_UID_VALID(statx-&gt;glfs_st_mask)) {</div><div class='add'>+        iatt-&gt;ia_uid = statx-&gt;glfs_st_uid;</div><div class='add'>+        iatt-&gt;ia_flags |= IATT_UID;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (GLFS_STAT_GID_VALID(statx-&gt;glfs_st_mask)) {</div><div class='add'>+        iatt-&gt;ia_gid = statx-&gt;glfs_st_gid;</div><div class='add'>+        iatt-&gt;ia_flags |= IATT_GID;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (GLFS_STAT_ATIME_VALID(statx-&gt;glfs_st_mask)) {</div><div class='add'>+        iatt-&gt;ia_atime = statx-&gt;glfs_st_atime.tv_sec;</div><div class='add'>+        iatt-&gt;ia_atime_nsec = statx-&gt;glfs_st_atime.tv_nsec;</div><div class='add'>+        iatt-&gt;ia_flags |= IATT_ATIME;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (GLFS_STAT_MTIME_VALID(statx-&gt;glfs_st_mask)) {</div><div class='add'>+        iatt-&gt;ia_mtime = statx-&gt;glfs_st_mtime.tv_sec;</div><div class='add'>+        iatt-&gt;ia_mtime_nsec = statx-&gt;glfs_st_mtime.tv_nsec;</div><div class='add'>+        iatt-&gt;ia_flags |= IATT_MTIME;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (GLFS_STAT_CTIME_VALID(statx-&gt;glfs_st_mask)) {</div><div class='add'>+        iatt-&gt;ia_ctime = statx-&gt;glfs_st_ctime.tv_sec;</div><div class='add'>+        iatt-&gt;ia_ctime_nsec = statx-&gt;glfs_st_ctime.tv_nsec;</div><div class='add'>+        iatt-&gt;ia_flags |= IATT_CTIME;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (GLFS_STAT_BTIME_VALID(statx-&gt;glfs_st_mask)) {</div><div class='add'>+        iatt-&gt;ia_btime = statx-&gt;glfs_st_btime.tv_sec;</div><div class='add'>+        iatt-&gt;ia_btime_nsec = statx-&gt;glfs_st_btime.tv_nsec;</div><div class='add'>+        iatt-&gt;ia_flags |= IATT_BTIME;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (GLFS_STAT_INO_VALID(statx-&gt;glfs_st_mask)) {</div><div class='add'>+        iatt-&gt;ia_ino = statx-&gt;glfs_st_ino;</div><div class='add'>+        iatt-&gt;ia_flags |= IATT_INO;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (GLFS_STAT_SIZE_VALID(statx-&gt;glfs_st_mask)) {</div><div class='add'>+        iatt-&gt;ia_size = statx-&gt;glfs_st_size;</div><div class='add'>+        iatt-&gt;ia_flags |= IATT_SIZE;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (GLFS_STAT_BLOCKS_VALID(statx-&gt;glfs_st_mask)) {</div><div class='add'>+        iatt-&gt;ia_blocks = statx-&gt;glfs_st_blocks;</div><div class='add'>+        iatt-&gt;ia_flags |= IATT_BLOCKS;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* unconditionally present, encode as is */</div><div class='add'>+    iatt-&gt;ia_blksize = statx-&gt;glfs_st_blksize;</div><div class='add'>+    iatt-&gt;ia_rdev = makedev(statx-&gt;glfs_st_rdev_major,</div><div class='add'>+                            statx-&gt;glfs_st_rdev_minor);</div><div class='add'>+    iatt-&gt;ia_dev = makedev(statx-&gt;glfs_st_dev_major, statx-&gt;glfs_st_dev_minor);</div><div class='add'>+    iatt-&gt;ia_attributes = statx-&gt;glfs_st_attributes;</div><div class='add'>+    iatt-&gt;ia_attributes_mask = statx-&gt;glfs_st_attributes_mask;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+glfsflags_from_gfapiflags(struct glfs_stat *stat, int *glvalid)</div><div class='add'>+{</div><div class='add'>+    *glvalid = 0;</div><div class='add'>+    if (stat-&gt;glfs_st_mask &amp; GLFS_STAT_MODE) {</div><div class='add'>+        *glvalid |= GF_SET_ATTR_MODE;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (stat-&gt;glfs_st_mask &amp; GLFS_STAT_SIZE) {</div><div class='add'>+        *glvalid |= GF_SET_ATTR_SIZE;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (stat-&gt;glfs_st_mask &amp; GLFS_STAT_UID) {</div><div class='add'>+        *glvalid |= GF_SET_ATTR_UID;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (stat-&gt;glfs_st_mask &amp; GLFS_STAT_GID) {</div><div class='add'>+        *glvalid |= GF_SET_ATTR_GID;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (stat-&gt;glfs_st_mask &amp; GLFS_STAT_ATIME) {</div><div class='add'>+        *glvalid |= GF_SET_ATTR_ATIME;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (stat-&gt;glfs_st_mask &amp; GLFS_STAT_MTIME) {</div><div class='add'>+        *glvalid |= GF_SET_ATTR_MTIME;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+glfs_loc_unlink(loc_t *loc)</div><div class='add'>+{</div><div class='add'>+    inode_unlink(loc-&gt;inode, loc-&gt;parent, loc-&gt;name);</div><div class='add'>+</div><div class='add'>+    /* since glfs_h_* objects hold a reference to inode</div><div class='add'>+     * it is safe to keep lookup count to '0' */</div><div class='add'>+    if (!inode_has_dentry(loc-&gt;inode))</div><div class='add'>+        inode_forget(loc-&gt;inode, 0);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_open, 3.4.0)</div><div class='add'>+struct glfs_fd *</div><div class='add'>+pub_glfs_open(struct glfs *fs, const char *path, int flags)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    struct glfs_fd *glfd = NULL;</div><div class='add'>+    xlator_t *subvol = NULL;</div><div class='add'>+    loc_t loc = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    struct iatt iatt = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int reval = 0;</div><div class='add'>+    dict_t *fop_attr = NULL;</div><div class='add'>+</div><div class='add'>+    DECLARE_OLD_THIS;</div><div class='add'>+    __GLFS_ENTRY_VALIDATE_FS(fs, invalid_fs);</div><div class='add'>+</div><div class='add'>+    subvol = glfs_active_subvol(fs);</div><div class='add'>+    if (!subvol) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        errno = EIO;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    glfd = glfs_fd_new(fs);</div><div class='add'>+    if (!glfd)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+retry:</div><div class='add'>+    ret = glfs_resolve(fs, subvol, path, &amp;loc, &amp;iatt, reval);</div><div class='add'>+</div><div class='add'>+    ESTALE_RETRY(ret, errno, reval, &amp;loc, retry);</div><div class='add'>+</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    if (IA_ISDIR(iatt.ia_type)) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        errno = EISDIR;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (!IA_ISREG(iatt.ia_type)) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        errno = EINVAL;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (glfd-&gt;fd) {</div><div class='add'>+        /* Retry. Safe to touch glfd-&gt;fd as we</div><div class='add'>+           still have not glfs_fd_bind() yet.</div><div class='add'>+        */</div><div class='add'>+        fd_unref(glfd-&gt;fd);</div><div class='add'>+        glfd-&gt;fd = NULL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    glfd-&gt;fd = fd_create(loc.inode, getpid());</div><div class='add'>+    if (!glfd-&gt;fd) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        errno = ENOMEM;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    glfd-&gt;fd-&gt;flags = flags;</div><div class='add'>+</div><div class='add'>+    ret = get_fop_attr_thrd_key(&amp;fop_attr);</div><div class='add'>+    if (ret)</div><div class='add'>+        gf_msg_debug("gfapi", 0, "Getting leaseid from thread failed");</div><div class='add'>+</div><div class='add'>+    ret = syncop_open(subvol, &amp;loc, flags, glfd-&gt;fd, fop_attr, NULL);</div><div class='add'>+    DECODE_SYNCOP_ERR(ret);</div><div class='add'>+</div><div class='add'>+    ESTALE_RETRY(ret, errno, reval, &amp;loc, retry);</div><div class='add'>+out:</div><div class='add'>+    loc_wipe(&amp;loc);</div><div class='add'>+</div><div class='add'>+    if (fop_attr)</div><div class='add'>+        dict_unref(fop_attr);</div><div class='add'>+</div><div class='add'>+    if (ret &amp;&amp; glfd) {</div><div class='add'>+        GF_REF_PUT(glfd);</div><div class='add'>+        glfd = NULL;</div><div class='add'>+    } else if (glfd) {</div><div class='add'>+        glfd_set_state_bind(glfd);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    glfs_subvol_done(fs, subvol);</div><div class='add'>+</div><div class='add'>+    __GLFS_EXIT_FS;</div><div class='add'>+</div><div class='add'>+invalid_fs:</div><div class='add'>+    return glfd;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_close, 3.4.0)</div><div class='add'>+int</div><div class='add'>+pub_glfs_close(struct glfs_fd *glfd)</div><div class='add'>+{</div><div class='add'>+    xlator_t *subvol = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    fd_t *fd = NULL;</div><div class='add'>+    struct glfs *fs = NULL;</div><div class='add'>+    dict_t *fop_attr = NULL;</div><div class='add'>+</div><div class='add'>+    DECLARE_OLD_THIS;</div><div class='add'>+    __GLFS_ENTRY_VALIDATE_FD(glfd, invalid_fs);</div><div class='add'>+</div><div class='add'>+    subvol = glfs_active_subvol(glfd-&gt;fs);</div><div class='add'>+    if (!subvol) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        errno = EIO;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    fd = glfs_resolve_fd(glfd-&gt;fs, subvol, glfd);</div><div class='add'>+    if (!fd) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        errno = EBADFD;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (glfd-&gt;lk_owner.len != 0) {</div><div class='add'>+        ret = syncopctx_setfslkowner(&amp;glfd-&gt;lk_owner);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+    }</div><div class='add'>+    ret = get_fop_attr_thrd_key(&amp;fop_attr);</div><div class='add'>+    if (ret)</div><div class='add'>+        gf_msg_debug("gfapi", 0, "Getting leaseid from thread failed");</div><div class='add'>+</div><div class='add'>+    ret = syncop_flush(subvol, fd, fop_attr, NULL);</div><div class='add'>+    DECODE_SYNCOP_ERR(ret);</div><div class='add'>+out:</div><div class='add'>+    fs = glfd-&gt;fs;</div><div class='add'>+</div><div class='add'>+    if (fd)</div><div class='add'>+        fd_unref(fd);</div><div class='add'>+    if (fop_attr)</div><div class='add'>+        dict_unref(fop_attr);</div><div class='add'>+</div><div class='add'>+    glfs_mark_glfd_for_deletion(glfd);</div><div class='add'>+    glfs_subvol_done(fs, subvol);</div><div class='add'>+</div><div class='add'>+    __GLFS_EXIT_FS;</div><div class='add'>+</div><div class='add'>+invalid_fs:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_lstat, 3.4.0)</div><div class='add'>+int</div><div class='add'>+pub_glfs_lstat(struct glfs *fs, const char *path, struct stat *stat)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    xlator_t *subvol = NULL;</div><div class='add'>+    loc_t loc = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    struct iatt iatt = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int reval = 0;</div><div class='add'>+</div><div class='add'>+    DECLARE_OLD_THIS;</div><div class='add'>+    __GLFS_ENTRY_VALIDATE_FS(fs, invalid_fs);</div><div class='add'>+</div><div class='add'>+    subvol = glfs_active_subvol(fs);</div><div class='add'>+    if (!subvol) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        errno = EIO;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+retry:</div><div class='add'>+    ret = glfs_lresolve(fs, subvol, path, &amp;loc, &amp;iatt, reval);</div><div class='add'>+</div><div class='add'>+    ESTALE_RETRY(ret, errno, reval, &amp;loc, retry);</div><div class='add'>+</div><div class='add'>+    if (ret == 0 &amp;&amp; stat)</div><div class='add'>+        glfs_iatt_to_stat(fs, &amp;iatt, stat);</div><div class='add'>+out:</div><div class='add'>+    loc_wipe(&amp;loc);</div><div class='add'>+</div><div class='add'>+    glfs_subvol_done(fs, subvol);</div><div class='add'>+</div><div class='add'>+    __GLFS_EXIT_FS;</div><div class='add'>+</div><div class='add'>+invalid_fs:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_stat, 3.4.0)</div><div class='add'>+int</div><div class='add'>+pub_glfs_stat(struct glfs *fs, const char *path, struct stat *stat)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    xlator_t *subvol = NULL;</div><div class='add'>+    loc_t loc = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    struct iatt iatt = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int reval = 0;</div><div class='add'>+</div><div class='add'>+    DECLARE_OLD_THIS;</div><div class='add'>+    __GLFS_ENTRY_VALIDATE_FS(fs, invalid_fs);</div><div class='add'>+</div><div class='add'>+    subvol = glfs_active_subvol(fs);</div><div class='add'>+    if (!subvol) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        errno = EIO;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+retry:</div><div class='add'>+    ret = glfs_resolve(fs, subvol, path, &amp;loc, &amp;iatt, reval);</div><div class='add'>+</div><div class='add'>+    ESTALE_RETRY(ret, errno, reval, &amp;loc, retry);</div><div class='add'>+</div><div class='add'>+    if (ret == 0 &amp;&amp; stat)</div><div class='add'>+        glfs_iatt_to_stat(fs, &amp;iatt, stat);</div><div class='add'>+out:</div><div class='add'>+    loc_wipe(&amp;loc);</div><div class='add'>+</div><div class='add'>+    glfs_subvol_done(fs, subvol);</div><div class='add'>+</div><div class='add'>+    __GLFS_EXIT_FS;</div><div class='add'>+</div><div class='add'>+invalid_fs:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+GFAPI_SYMVER_PRIVATE_DEFAULT(glfs_statx, 6.0)</div><div class='add'>+int</div><div class='add'>+priv_glfs_statx(struct glfs *fs, const char *path, const unsigned int mask,</div><div class='add'>+                struct glfs_stat *statxbuf)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    xlator_t *subvol = NULL;</div><div class='add'>+    loc_t loc = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    struct iatt iatt = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int reval = 0;</div><div class='add'>+</div><div class='add'>+    DECLARE_OLD_THIS;</div><div class='add'>+    __GLFS_ENTRY_VALIDATE_FS(fs, invalid_fs);</div><div class='add'>+</div><div class='add'>+    if (path == NULL) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        errno = EINVAL;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (mask &amp; ~GLFS_STAT_ALL) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        errno = EINVAL;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    subvol = glfs_active_subvol(fs);</div><div class='add'>+    if (!subvol) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        errno = EIO;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+retry:</div><div class='add'>+    ret = glfs_resolve(fs, subvol, path, &amp;loc, &amp;iatt, reval);</div><div class='add'>+    ESTALE_RETRY(ret, errno, reval, &amp;loc, retry);</div><div class='add'>+</div><div class='add'>+    if (ret == 0 &amp;&amp; statxbuf)</div><div class='add'>+        glfs_iatt_to_statx(fs, &amp;iatt, statxbuf);</div><div class='add'>+out:</div><div class='add'>+    loc_wipe(&amp;loc);</div><div class='add'>+</div><div class='add'>+    glfs_subvol_done(fs, subvol);</div><div class='add'>+</div><div class='add'>+    __GLFS_EXIT_FS;</div><div class='add'>+</div><div class='add'>+invalid_fs:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_fstat, 3.4.0)</div><div class='add'>+int</div><div class='add'>+pub_glfs_fstat(struct glfs_fd *glfd, struct stat *stat)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    xlator_t *subvol = NULL;</div><div class='add'>+    struct iatt iatt = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    fd_t *fd = NULL;</div><div class='add'>+</div><div class='add'>+    DECLARE_OLD_THIS;</div><div class='add'>+    __GLFS_ENTRY_VALIDATE_FD(glfd, invalid_fs);</div><div class='add'>+</div><div class='add'>+    GF_REF_GET(glfd);</div><div class='add'>+</div><div class='add'>+    subvol = glfs_active_subvol(glfd-&gt;fs);</div><div class='add'>+    if (!subvol) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        errno = EIO;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    fd = glfs_resolve_fd(glfd-&gt;fs, subvol, glfd);</div><div class='add'>+    if (!fd) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        errno = EBADFD;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = syncop_fstat(subvol, fd, &amp;iatt, NULL, NULL);</div><div class='add'>+    DECODE_SYNCOP_ERR(ret);</div><div class='add'>+</div><div class='add'>+    if (ret == 0 &amp;&amp; stat)</div><div class='add'>+        glfs_iatt_to_stat(glfd-&gt;fs, &amp;iatt, stat);</div><div class='add'>+out:</div><div class='add'>+    if (fd)</div><div class='add'>+        fd_unref(fd);</div><div class='add'>+    if (glfd)</div><div class='add'>+        GF_REF_PUT(glfd);</div><div class='add'>+</div><div class='add'>+    glfs_subvol_done(glfd-&gt;fs, subvol);</div><div class='add'>+</div><div class='add'>+    __GLFS_EXIT_FS;</div><div class='add'>+</div><div class='add'>+invalid_fs:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_creat, 3.4.0)</div><div class='add'>+struct glfs_fd *</div><div class='add'>+pub_glfs_creat(struct glfs *fs, const char *path, int flags, mode_t mode)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    struct glfs_fd *glfd = NULL;</div><div class='add'>+    xlator_t *subvol = NULL;</div><div class='add'>+    loc_t loc = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    struct iatt iatt = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    uuid_t gfid;</div><div class='add'>+    dict_t *xattr_req = NULL;</div><div class='add'>+    int reval = 0;</div><div class='add'>+</div><div class='add'>+    DECLARE_OLD_THIS;</div><div class='add'>+    __GLFS_ENTRY_VALIDATE_FS(fs, invalid_fs);</div><div class='add'>+</div><div class='add'>+    subvol = glfs_active_subvol(fs);</div><div class='add'>+    if (!subvol) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        errno = EIO;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    xattr_req = dict_new();</div><div class='add'>+    if (!xattr_req) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        errno = ENOMEM;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    gf_uuid_generate(gfid);</div><div class='add'>+    ret = dict_set_gfuuid(xattr_req, "gfid-req", gfid, true);</div><div class='add'>+    if (ret) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        errno = ENOMEM;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    glfd = glfs_fd_new(fs);</div><div class='add'>+    if (!glfd)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    /* This must be glfs_resolve() and NOT glfs_lresolve().</div><div class='add'>+       That is because open("name", O_CREAT) where "name"</div><div class='add'>+       is a danging symlink must create the dangling</div><div class='add'>+       destination.</div><div class='add'>+    */</div><div class='add'>+retry:</div><div class='add'>+    ret = glfs_resolve(fs, subvol, path, &amp;loc, &amp;iatt, reval);</div><div class='add'>+</div><div class='add'>+    ESTALE_RETRY(ret, errno, reval, &amp;loc, retry);</div><div class='add'>+</div><div class='add'>+    if (ret == -1 &amp;&amp; errno != ENOENT)</div><div class='add'>+        /* Any other type of error is fatal */</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    if (ret == -1 &amp;&amp; errno == ENOENT &amp;&amp; !loc.parent)</div><div class='add'>+        /* The parent directory or an ancestor even</div><div class='add'>+           higher does not exist</div><div class='add'>+        */</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    if (loc.inode) {</div><div class='add'>+        if (flags &amp; O_EXCL) {</div><div class='add'>+            ret = -1;</div><div class='add'>+            errno = EEXIST;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        if (IA_ISDIR(iatt.ia_type)) {</div><div class='add'>+            ret = -1;</div><div class='add'>+            errno = EISDIR;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        if (!IA_ISREG(iatt.ia_type)) {</div><div class='add'>+            ret = -1;</div><div class='add'>+            errno = EINVAL;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (ret == -1 &amp;&amp; errno == ENOENT) {</div><div class='add'>+        loc.inode = inode_new(loc.parent-&gt;table);</div><div class='add'>+        if (!loc.inode) {</div><div class='add'>+            ret = -1;</div><div class='add'>+            errno = ENOMEM;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (glfd-&gt;fd) {</div><div class='add'>+        /* Retry. Safe to touch glfd-&gt;fd as we</div><div class='add'>+           still have not glfs_fd_bind() yet.</div><div class='add'>+        */</div><div class='add'>+        fd_unref(glfd-&gt;fd);</div><div class='add'>+        glfd-&gt;fd = NULL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    glfd-&gt;fd = fd_create(loc.inode, getpid());</div><div class='add'>+    if (!glfd-&gt;fd) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        errno = ENOMEM;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    glfd-&gt;fd-&gt;flags = flags;</div><div class='add'>+</div><div class='add'>+    if (get_fop_attr_thrd_key(&amp;xattr_req))</div><div class='add'>+        gf_msg_debug("gfapi", 0, "Getting leaseid from thread failed");</div><div class='add'>+    if (ret == 0) {</div><div class='add'>+        ret = syncop_open(subvol, &amp;loc, flags, glfd-&gt;fd, xattr_req, NULL);</div><div class='add'>+        DECODE_SYNCOP_ERR(ret);</div><div class='add'>+    } else {</div><div class='add'>+        ret = syncop_create(subvol, &amp;loc, flags, mode, glfd-&gt;fd, &amp;iatt,</div><div class='add'>+                            xattr_req, NULL);</div><div class='add'>+        DECODE_SYNCOP_ERR(ret);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ESTALE_RETRY(ret, errno, reval, &amp;loc, retry);</div><div class='add'>+</div><div class='add'>+    if (ret == 0)</div><div class='add'>+        ret = glfs_loc_link(&amp;loc, &amp;iatt);</div><div class='add'>+out:</div><div class='add'>+    loc_wipe(&amp;loc);</div><div class='add'>+</div><div class='add'>+    if (xattr_req)</div><div class='add'>+        dict_unref(xattr_req);</div><div class='add'>+</div><div class='add'>+    if (ret &amp;&amp; glfd) {</div><div class='add'>+        GF_REF_PUT(glfd);</div><div class='add'>+        glfd = NULL;</div><div class='add'>+    } else if (glfd) {</div><div class='add'>+        glfd_set_state_bind(glfd);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    glfs_subvol_done(fs, subvol);</div><div class='add'>+</div><div class='add'>+    __GLFS_EXIT_FS;</div><div class='add'>+</div><div class='add'>+invalid_fs:</div><div class='add'>+    return glfd;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#ifdef HAVE_SEEK_HOLE</div><div class='add'>+static int</div><div class='add'>+glfs_seek(struct glfs_fd *glfd, off_t offset, int whence)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    xlator_t *subvol = NULL;</div><div class='add'>+    fd_t *fd = NULL;</div><div class='add'>+    gf_seek_what_t what = 0;</div><div class='add'>+    off_t off = -1;</div><div class='add'>+</div><div class='add'>+    switch (whence) {</div><div class='add'>+        case SEEK_DATA:</div><div class='add'>+            what = GF_SEEK_DATA;</div><div class='add'>+            break;</div><div class='add'>+        case SEEK_HOLE:</div><div class='add'>+            what = GF_SEEK_HOLE;</div><div class='add'>+            break;</div><div class='add'>+        default:</div><div class='add'>+            /* other SEEK_* do not make sense, all operations get an offset</div><div class='add'>+             * and the position in the fd is not tracked */</div><div class='add'>+            errno = EINVAL;</div><div class='add'>+            goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    subvol = glfs_active_subvol(glfd-&gt;fs);</div><div class='add'>+    if (!subvol) {</div><div class='add'>+        errno = EIO;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    fd = glfs_resolve_fd(glfd-&gt;fs, subvol, glfd);</div><div class='add'>+    if (!fd) {</div><div class='add'>+        errno = EBADFD;</div><div class='add'>+        goto done;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = syncop_seek(subvol, fd, offset, what, NULL, &amp;off);</div><div class='add'>+    DECODE_SYNCOP_ERR(ret);</div><div class='add'>+</div><div class='add'>+    if (ret != -1)</div><div class='add'>+        glfd-&gt;offset = off;</div><div class='add'>+</div><div class='add'>+done:</div><div class='add'>+    if (fd)</div><div class='add'>+        fd_unref(fd);</div><div class='add'>+</div><div class='add'>+    glfs_subvol_done(glfd-&gt;fs, subvol);</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_lseek, 3.4.0)</div><div class='add'>+off_t</div><div class='add'>+pub_glfs_lseek(struct glfs_fd *glfd, off_t offset, int whence)</div><div class='add'>+{</div><div class='add'>+    struct stat sb = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int ret = -1;</div><div class='add'>+    off_t off = -1;</div><div class='add'>+</div><div class='add'>+    DECLARE_OLD_THIS;</div><div class='add'>+    __GLFS_ENTRY_VALIDATE_FD(glfd, invalid_fs);</div><div class='add'>+</div><div class='add'>+    GF_REF_GET(glfd);</div><div class='add'>+</div><div class='add'>+    switch (whence) {</div><div class='add'>+        case SEEK_SET:</div><div class='add'>+            glfd-&gt;offset = offset;</div><div class='add'>+            ret = 0;</div><div class='add'>+            break;</div><div class='add'>+        case SEEK_CUR:</div><div class='add'>+            glfd-&gt;offset += offset;</div><div class='add'>+            ret = 0;</div><div class='add'>+            break;</div><div class='add'>+        case SEEK_END:</div><div class='add'>+            ret = pub_glfs_fstat(glfd, &amp;sb);</div><div class='add'>+            if (ret) {</div><div class='add'>+                /* seek cannot fail :O */</div><div class='add'>+                break;</div><div class='add'>+            }</div><div class='add'>+            glfd-&gt;offset = sb.st_size + offset;</div><div class='add'>+            break;</div><div class='add'>+#ifdef HAVE_SEEK_HOLE</div><div class='add'>+        case SEEK_DATA:</div><div class='add'>+        case SEEK_HOLE:</div><div class='add'>+            ret = glfs_seek(glfd, offset, whence);</div><div class='add'>+            break;</div><div class='add'>+#endif</div><div class='add'>+        default:</div><div class='add'>+            errno = EINVAL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (glfd)</div><div class='add'>+        GF_REF_PUT(glfd);</div><div class='add'>+</div><div class='add'>+    __GLFS_EXIT_FS;</div><div class='add'>+</div><div class='add'>+    if (ret != -1)</div><div class='add'>+        off = glfd-&gt;offset;</div><div class='add'>+</div><div class='add'>+    return off;</div><div class='add'>+</div><div class='add'>+invalid_fs:</div><div class='add'>+    return -1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static ssize_t</div><div class='add'>+glfs_preadv_common(struct glfs_fd *glfd, const struct iovec *iovec, int iovcnt,</div><div class='add'>+                   off_t offset, int flags, struct glfs_stat *poststat)</div><div class='add'>+{</div><div class='add'>+    xlator_t *subvol = NULL;</div><div class='add'>+    ssize_t ret = -1;</div><div class='add'>+    ssize_t size = -1;</div><div class='add'>+    struct iovec *iov = NULL;</div><div class='add'>+    int cnt = 0;</div><div class='add'>+    struct iobref *iobref = NULL;</div><div class='add'>+    fd_t *fd = NULL;</div><div class='add'>+    struct iatt iatt = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    dict_t *fop_attr = NULL;</div><div class='add'>+</div><div class='add'>+    DECLARE_OLD_THIS;</div><div class='add'>+    __GLFS_ENTRY_VALIDATE_FD(glfd, invalid_fs);</div><div class='add'>+</div><div class='add'>+    GF_REF_GET(glfd);</div><div class='add'>+</div><div class='add'>+    subvol = glfs_active_subvol(glfd-&gt;fs);</div><div class='add'>+    if (!subvol) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        errno = EIO;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    fd = glfs_resolve_fd(glfd-&gt;fs, subvol, glfd);</div><div class='add'>+    if (!fd) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        errno = EBADFD;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    size = iov_length(iovec, iovcnt);</div><div class='add'>+</div><div class='add'>+    ret = get_fop_attr_thrd_key(&amp;fop_attr);</div><div class='add'>+    if (ret)</div><div class='add'>+        gf_msg_debug("gfapi", 0, "Getting leaseid from thread failed");</div><div class='add'>+</div><div class='add'>+    ret = syncop_readv(subvol, fd, size, offset, 0, &amp;iov, &amp;cnt, &amp;iobref, &amp;iatt,</div><div class='add'>+                       fop_attr, NULL);</div><div class='add'>+    DECODE_SYNCOP_ERR(ret);</div><div class='add'>+</div><div class='add'>+    if (ret &gt;= 0 &amp;&amp; poststat)</div><div class='add'>+        glfs_iatt_to_statx(glfd-&gt;fs, &amp;iatt, poststat);</div><div class='add'>+</div><div class='add'>+    if (ret &lt;= 0)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    size = iov_copy(iovec, iovcnt, iov, cnt); /* FIXME!!! */</div><div class='add'>+</div><div class='add'>+    glfd-&gt;offset = (offset + size);</div><div class='add'>+</div><div class='add'>+    ret = size;</div><div class='add'>+out:</div><div class='add'>+    if (iov)</div><div class='add'>+        GF_FREE(iov);</div><div class='add'>+    if (iobref)</div><div class='add'>+        iobref_unref(iobref);</div><div class='add'>+</div><div class='add'>+    if (fd)</div><div class='add'>+        fd_unref(fd);</div><div class='add'>+    if (glfd)</div><div class='add'>+        GF_REF_PUT(glfd);</div><div class='add'>+    if (fop_attr)</div><div class='add'>+        dict_unref(fop_attr);</div><div class='add'>+</div><div class='add'>+    glfs_subvol_done(glfd-&gt;fs, subvol);</div><div class='add'>+</div><div class='add'>+    __GLFS_EXIT_FS;</div><div class='add'>+</div><div class='add'>+invalid_fs:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_preadv, 3.4.0)</div><div class='add'>+ssize_t</div><div class='add'>+pub_glfs_preadv(struct glfs_fd *glfd, const struct iovec *iovec, int iovcnt,</div><div class='add'>+                off_t offset, int flags)</div><div class='add'>+{</div><div class='add'>+    return glfs_preadv_common(glfd, iovec, iovcnt, offset, flags, NULL);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_read, 3.4.0)</div><div class='add'>+ssize_t</div><div class='add'>+pub_glfs_read(struct glfs_fd *glfd, void *buf, size_t count, int flags)</div><div class='add'>+{</div><div class='add'>+    struct iovec iov = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    ssize_t ret = 0;</div><div class='add'>+</div><div class='add'>+    if (glfd == NULL) {</div><div class='add'>+        errno = EBADF;</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    iov.iov_base = buf;</div><div class='add'>+    iov.iov_len = count;</div><div class='add'>+</div><div class='add'>+    ret = pub_glfs_preadv(glfd, &amp;iov, 1, glfd-&gt;offset, flags);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+GFAPI_SYMVER_PUBLIC(glfs_pread34, glfs_pread, 3.4.0)</div><div class='add'>+ssize_t</div><div class='add'>+pub_glfs_pread34(struct glfs_fd *glfd, void *buf, size_t count, off_t offset,</div><div class='add'>+                 int flags)</div><div class='add'>+{</div><div class='add'>+    struct iovec iov = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    ssize_t ret = 0;</div><div class='add'>+</div><div class='add'>+    iov.iov_base = buf;</div><div class='add'>+    iov.iov_len = count;</div><div class='add'>+</div><div class='add'>+    ret = pub_glfs_preadv(glfd, &amp;iov, 1, offset, flags);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_pread, 6.0)</div><div class='add'>+ssize_t</div><div class='add'>+pub_glfs_pread(struct glfs_fd *glfd, void *buf, size_t count, off_t offset,</div><div class='add'>+               int flags, struct glfs_stat *poststat)</div><div class='add'>+{</div><div class='add'>+    struct iovec iov = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    ssize_t ret = 0;</div><div class='add'>+</div><div class='add'>+    iov.iov_base = buf;</div><div class='add'>+    iov.iov_len = count;</div><div class='add'>+</div><div class='add'>+    ret = glfs_preadv_common(glfd, &amp;iov, 1, offset, flags, poststat);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_readv, 3.4.0)</div><div class='add'>+ssize_t</div><div class='add'>+pub_glfs_readv(struct glfs_fd *glfd, const struct iovec *iov, int count,</div><div class='add'>+               int flags)</div><div class='add'>+{</div><div class='add'>+    ssize_t ret = 0;</div><div class='add'>+</div><div class='add'>+    if (glfd == NULL) {</div><div class='add'>+        errno = EBADF;</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = pub_glfs_preadv(glfd, iov, count, glfd-&gt;offset, flags);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+struct glfs_io {</div><div class='add'>+    struct glfs_fd *glfd;</div><div class='add'>+    int op;</div><div class='add'>+    off_t offset;</div><div class='add'>+    struct iovec *iov;</div><div class='add'>+    int count;</div><div class='add'>+    int flags;</div><div class='add'>+    gf_boolean_t oldcb;</div><div class='add'>+    union {</div><div class='add'>+        glfs_io_cbk34 fn34;</div><div class='add'>+        glfs_io_cbk fn;</div><div class='add'>+    };</div><div class='add'>+    void *data;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+glfs_io_async_cbk(int op_ret, int op_errno, call_frame_t *frame, void *cookie,</div><div class='add'>+                  struct iovec *iovec, int count, struct iatt *prebuf,</div><div class='add'>+                  struct iatt *postbuf)</div><div class='add'>+{</div><div class='add'>+    struct glfs_io *gio = NULL;</div><div class='add'>+    xlator_t *subvol = NULL;</div><div class='add'>+    struct glfs *fs = NULL;</div><div class='add'>+    struct glfs_fd *glfd = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    struct glfs_stat prestat = {}, *prestatp = NULL;</div><div class='add'>+    struct glfs_stat poststat = {}, *poststatp = NULL;</div><div class='add'>+</div><div class='add'>+    GF_VALIDATE_OR_GOTO("gfapi", frame, inval);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("gfapi", cookie, inval);</div><div class='add'>+</div><div class='add'>+    gio = frame-&gt;local;</div><div class='add'>+    frame-&gt;local = NULL;</div><div class='add'>+    subvol = cookie;</div><div class='add'>+    glfd = gio-&gt;glfd;</div><div class='add'>+    fs = glfd-&gt;fs;</div><div class='add'>+</div><div class='add'>+    if (!glfs_is_glfd_still_valid(glfd))</div><div class='add'>+        goto err;</div><div class='add'>+</div><div class='add'>+    if (op_ret &lt;= 0) {</div><div class='add'>+        goto out;</div><div class='add'>+    } else if (gio-&gt;op == GF_FOP_READ) {</div><div class='add'>+        if (!iovec) {</div><div class='add'>+            op_ret = -1;</div><div class='add'>+            op_errno = EINVAL;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        op_ret = iov_copy(gio-&gt;iov, gio-&gt;count, iovec, count);</div><div class='add'>+        glfd-&gt;offset = gio-&gt;offset + op_ret;</div><div class='add'>+    } else if (gio-&gt;op == GF_FOP_WRITE) {</div><div class='add'>+        glfd-&gt;offset = gio-&gt;offset + gio-&gt;iov-&gt;iov_len;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    errno = op_errno;</div><div class='add'>+    if (gio-&gt;oldcb) {</div><div class='add'>+        gio-&gt;fn34(gio-&gt;glfd, op_ret, gio-&gt;data);</div><div class='add'>+    } else {</div><div class='add'>+        if (prebuf) {</div><div class='add'>+            prestatp = &amp;prestat;</div><div class='add'>+            glfs_iatt_to_statx(fs, prebuf, prestatp);</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        if (postbuf) {</div><div class='add'>+            poststatp = &amp;poststat;</div><div class='add'>+            glfs_iatt_to_statx(fs, postbuf, poststatp);</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        gio-&gt;fn(gio-&gt;glfd, op_ret, prestatp, poststatp, gio-&gt;data);</div><div class='add'>+    }</div><div class='add'>+err:</div><div class='add'>+    fd_unref(glfd-&gt;fd);</div><div class='add'>+    /* Since the async operation is complete</div><div class='add'>+     * release the ref taken during the start</div><div class='add'>+     * of async operation</div><div class='add'>+     */</div><div class='add'>+    GF_REF_PUT(glfd);</div><div class='add'>+</div><div class='add'>+    GF_FREE(gio-&gt;iov);</div><div class='add'>+    GF_FREE(gio);</div><div class='add'>+    STACK_DESTROY(frame-&gt;root);</div><div class='add'>+    glfs_subvol_done(fs, subvol);</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+inval:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+glfs_preadv_async_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                      int op_ret, int op_errno, struct iovec *iovec, int count,</div><div class='add'>+                      struct iatt *stbuf, struct iobref *iobref, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    glfs_io_async_cbk(op_ret, op_errno, frame, cookie, iovec, count, NULL,</div><div class='add'>+                      stbuf);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+glfs_preadv_async_common(struct glfs_fd *glfd, const struct iovec *iovec,</div><div class='add'>+                         int count, off_t offset, int flags, gf_boolean_t oldcb,</div><div class='add'>+                         glfs_io_cbk fn, void *data)</div><div class='add'>+{</div><div class='add'>+    struct glfs_io *gio = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    call_frame_t *frame = NULL;</div><div class='add'>+    xlator_t *subvol = NULL;</div><div class='add'>+    struct glfs *fs = NULL;</div><div class='add'>+    fd_t *fd = NULL;</div><div class='add'>+    dict_t *fop_attr = NULL;</div><div class='add'>+</div><div class='add'>+    DECLARE_OLD_THIS;</div><div class='add'>+    __GLFS_ENTRY_VALIDATE_FD(glfd, invalid_fs);</div><div class='add'>+</div><div class='add'>+    GF_REF_GET(glfd);</div><div class='add'>+</div><div class='add'>+    subvol = glfs_active_subvol(glfd-&gt;fs);</div><div class='add'>+    if (!subvol) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        errno = EIO;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    fd = glfs_resolve_fd(glfd-&gt;fs, subvol, glfd);</div><div class='add'>+    if (!fd) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        errno = EBADFD;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    fs = glfd-&gt;fs;</div><div class='add'>+</div><div class='add'>+    frame = syncop_create_frame(THIS);</div><div class='add'>+    if (!frame) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        errno = ENOMEM;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    gio = GF_CALLOC(1, sizeof(*gio), glfs_mt_glfs_io_t);</div><div class='add'>+    if (!gio) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        errno = ENOMEM;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    gio-&gt;iov = iov_dup(iovec, count);</div><div class='add'>+    if (!gio-&gt;iov) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        errno = ENOMEM;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    gio-&gt;op = GF_FOP_READ;</div><div class='add'>+    gio-&gt;glfd = glfd;</div><div class='add'>+    gio-&gt;count = count;</div><div class='add'>+    gio-&gt;offset = offset;</div><div class='add'>+    gio-&gt;flags = flags;</div><div class='add'>+    gio-&gt;oldcb = oldcb;</div><div class='add'>+    gio-&gt;fn = fn;</div><div class='add'>+    gio-&gt;data = data;</div><div class='add'>+</div><div class='add'>+    frame-&gt;local = gio;</div><div class='add'>+</div><div class='add'>+    ret = get_fop_attr_thrd_key(&amp;fop_attr);</div><div class='add'>+    if (ret)</div><div class='add'>+        gf_msg_debug("gfapi", 0, "Getting leaseid from thread failed");</div><div class='add'>+</div><div class='add'>+    STACK_WIND_COOKIE(frame, glfs_preadv_async_cbk, subvol, subvol,</div><div class='add'>+                      subvol-&gt;fops-&gt;readv, fd, iov_length(iovec, count), offset,</div><div class='add'>+                      flags, fop_attr);</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (ret) {</div><div class='add'>+        if (fd)</div><div class='add'>+            fd_unref(fd);</div><div class='add'>+        if (glfd)</div><div class='add'>+            GF_REF_PUT(glfd);</div><div class='add'>+        if (gio) {</div><div class='add'>+            GF_FREE(gio-&gt;iov);</div><div class='add'>+            GF_FREE(gio);</div><div class='add'>+        }</div><div class='add'>+        if (frame) {</div><div class='add'>+            STACK_DESTROY(frame-&gt;root);</div><div class='add'>+        }</div><div class='add'>+        glfs_subvol_done(fs, subvol);</div><div class='add'>+    }</div><div class='add'>+    if (fop_attr)</div><div class='add'>+        dict_unref(fop_attr);</div><div class='add'>+</div><div class='add'>+    __GLFS_EXIT_FS;</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+</div><div class='add'>+invalid_fs:</div><div class='add'>+    return -1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+GFAPI_SYMVER_PUBLIC(glfs_preadv_async34, glfs_preadv_async, 3.4.0)</div><div class='add'>+int</div><div class='add'>+pub_glfs_preadv_async34(struct glfs_fd *glfd, const struct iovec *iovec,</div><div class='add'>+                        int count, off_t offset, int flags, glfs_io_cbk34 fn,</div><div class='add'>+                        void *data)</div><div class='add'>+{</div><div class='add'>+    return glfs_preadv_async_common(glfd, iovec, count, offset, flags, _gf_true,</div><div class='add'>+                                    (void *)fn, data);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_preadv_async, 6.0)</div><div class='add'>+int</div><div class='add'>+pub_glfs_preadv_async(struct glfs_fd *glfd, const struct iovec *iovec,</div><div class='add'>+                      int count, off_t offset, int flags, glfs_io_cbk fn,</div><div class='add'>+                      void *data)</div><div class='add'>+{</div><div class='add'>+    return glfs_preadv_async_common(glfd, iovec, count, offset, flags,</div><div class='add'>+                                    _gf_false, fn, data);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+GFAPI_SYMVER_PUBLIC(glfs_read_async34, glfs_read_async, 3.4.0)</div><div class='add'>+int</div><div class='add'>+pub_glfs_read_async34(struct glfs_fd *glfd, void *buf, size_t count, int flags,</div><div class='add'>+                      glfs_io_cbk34 fn, void *data)</div><div class='add'>+{</div><div class='add'>+    struct iovec iov = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    ssize_t ret = 0;</div><div class='add'>+</div><div class='add'>+    if (glfd == NULL) {</div><div class='add'>+        errno = EBADF;</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    iov.iov_base = buf;</div><div class='add'>+    iov.iov_len = count;</div><div class='add'>+</div><div class='add'>+    ret = glfs_preadv_async_common(glfd, &amp;iov, 1, glfd-&gt;offset, flags, _gf_true,</div><div class='add'>+                                   (void *)fn, data);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_read_async, 6.0)</div><div class='add'>+int</div><div class='add'>+pub_glfs_read_async(struct glfs_fd *glfd, void *buf, size_t count, int flags,</div><div class='add'>+                    glfs_io_cbk fn, void *data)</div><div class='add'>+{</div><div class='add'>+    struct iovec iov = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    ssize_t ret = 0;</div><div class='add'>+</div><div class='add'>+    if (glfd == NULL) {</div><div class='add'>+        errno = EBADF;</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    iov.iov_base = buf;</div><div class='add'>+    iov.iov_len = count;</div><div class='add'>+</div><div class='add'>+    ret = glfs_preadv_async_common(glfd, &amp;iov, 1, glfd-&gt;offset, flags,</div><div class='add'>+                                   _gf_false, fn, data);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+GFAPI_SYMVER_PUBLIC(glfs_pread_async34, glfs_pread_async, 3.4.0)</div><div class='add'>+int</div><div class='add'>+pub_glfs_pread_async34(struct glfs_fd *glfd, void *buf, size_t count,</div><div class='add'>+                       off_t offset, int flags, glfs_io_cbk34 fn, void *data)</div><div class='add'>+{</div><div class='add'>+    struct iovec iov = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    ssize_t ret = 0;</div><div class='add'>+</div><div class='add'>+    iov.iov_base = buf;</div><div class='add'>+    iov.iov_len = count;</div><div class='add'>+</div><div class='add'>+    ret = glfs_preadv_async_common(glfd, &amp;iov, 1, offset, flags, _gf_true,</div><div class='add'>+                                   (void *)fn, data);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_pread_async, 6.0)</div><div class='add'>+int</div><div class='add'>+pub_glfs_pread_async(struct glfs_fd *glfd, void *buf, size_t count,</div><div class='add'>+                     off_t offset, int flags, glfs_io_cbk fn, void *data)</div><div class='add'>+{</div><div class='add'>+    struct iovec iov = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    ssize_t ret = 0;</div><div class='add'>+</div><div class='add'>+    iov.iov_base = buf;</div><div class='add'>+    iov.iov_len = count;</div><div class='add'>+</div><div class='add'>+    ret = glfs_preadv_async_common(glfd, &amp;iov, 1, offset, flags, _gf_false, fn,</div><div class='add'>+                                   data);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+GFAPI_SYMVER_PUBLIC(glfs_readv_async34, glfs_readv_async, 3.4.0)</div><div class='add'>+int</div><div class='add'>+pub_glfs_readv_async34(struct glfs_fd *glfd, const struct iovec *iov, int count,</div><div class='add'>+                       int flags, glfs_io_cbk34 fn, void *data)</div><div class='add'>+{</div><div class='add'>+    ssize_t ret = 0;</div><div class='add'>+</div><div class='add'>+    if (glfd == NULL) {</div><div class='add'>+        errno = EBADF;</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = glfs_preadv_async_common(glfd, iov, count, glfd-&gt;offset, flags,</div><div class='add'>+                                   _gf_true, (void *)fn, data);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_readv_async, 6.0)</div><div class='add'>+int</div><div class='add'>+pub_glfs_readv_async(struct glfs_fd *glfd, const struct iovec *iov, int count,</div><div class='add'>+                     int flags, glfs_io_cbk fn, void *data)</div><div class='add'>+{</div><div class='add'>+    ssize_t ret = 0;</div><div class='add'>+</div><div class='add'>+    if (glfd == NULL) {</div><div class='add'>+        errno = EBADF;</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = glfs_preadv_async_common(glfd, iov, count, glfd-&gt;offset, flags,</div><div class='add'>+                                   _gf_false, fn, data);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static ssize_t</div><div class='add'>+glfs_pwritev_common(struct glfs_fd *glfd, const struct iovec *iovec, int iovcnt,</div><div class='add'>+                    off_t offset, int flags, struct glfs_stat *prestat,</div><div class='add'>+                    struct glfs_stat *poststat)</div><div class='add'>+{</div><div class='add'>+    xlator_t *subvol = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    struct iobref *iobref = NULL;</div><div class='add'>+    struct iobuf *iobuf = NULL;</div><div class='add'>+    struct iovec iov = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    fd_t *fd = NULL;</div><div class='add'>+    struct iatt preiatt =</div><div class='add'>+                    {</div><div class='add'>+                        0,</div><div class='add'>+                    },</div><div class='add'>+                postiatt = {</div><div class='add'>+                    0,</div><div class='add'>+                };</div><div class='add'>+    dict_t *fop_attr = NULL;</div><div class='add'>+</div><div class='add'>+    DECLARE_OLD_THIS;</div><div class='add'>+    __GLFS_ENTRY_VALIDATE_FD(glfd, invalid_fs);</div><div class='add'>+</div><div class='add'>+    GF_REF_GET(glfd);</div><div class='add'>+</div><div class='add'>+    subvol = glfs_active_subvol(glfd-&gt;fs);</div><div class='add'>+    if (!subvol) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        errno = EIO;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    fd = glfs_resolve_fd(glfd-&gt;fs, subvol, glfd);</div><div class='add'>+    if (!fd) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        errno = EBADFD;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = iobuf_copy(subvol-&gt;ctx-&gt;iobuf_pool, iovec, iovcnt, &amp;iobref, &amp;iobuf,</div><div class='add'>+                     &amp;iov);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    ret = get_fop_attr_thrd_key(&amp;fop_attr);</div><div class='add'>+    if (ret)</div><div class='add'>+        gf_msg_debug("gfapi", 0, "Getting leaseid from thread failed");</div><div class='add'>+</div><div class='add'>+    ret = syncop_writev(subvol, fd, &amp;iov, 1, offset, iobref, flags, &amp;preiatt,</div><div class='add'>+                        &amp;postiatt, fop_attr, NULL);</div><div class='add'>+    DECODE_SYNCOP_ERR(ret);</div><div class='add'>+</div><div class='add'>+    if (ret &gt;= 0) {</div><div class='add'>+        if (prestat)</div><div class='add'>+            glfs_iatt_to_statx(glfd-&gt;fs, &amp;preiatt, prestat);</div><div class='add'>+        if (poststat)</div><div class='add'>+            glfs_iatt_to_statx(glfd-&gt;fs, &amp;postiatt, poststat);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (ret &lt;= 0)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    glfd-&gt;offset = (offset + iov.iov_len);</div><div class='add'>+out:</div><div class='add'>+    if (iobuf)</div><div class='add'>+        iobuf_unref(iobuf);</div><div class='add'>+    if (iobref)</div><div class='add'>+        iobref_unref(iobref);</div><div class='add'>+    if (fd)</div><div class='add'>+        fd_unref(fd);</div><div class='add'>+    if (glfd)</div><div class='add'>+        GF_REF_PUT(glfd);</div><div class='add'>+    if (fop_attr)</div><div class='add'>+        dict_unref(fop_attr);</div><div class='add'>+</div><div class='add'>+    glfs_subvol_done(glfd-&gt;fs, subvol);</div><div class='add'>+</div><div class='add'>+    __GLFS_EXIT_FS;</div><div class='add'>+</div><div class='add'>+invalid_fs:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_copy_file_range, 6.0)</div><div class='add'>+ssize_t</div><div class='add'>+pub_glfs_copy_file_range(struct glfs_fd *glfd_in, off64_t *off_in,</div><div class='add'>+                         struct glfs_fd *glfd_out, off64_t *off_out, size_t len,</div><div class='add'>+                         unsigned int flags, struct glfs_stat *statbuf,</div><div class='add'>+                         struct glfs_stat *prestat, struct glfs_stat *poststat)</div><div class='add'>+{</div><div class='add'>+    xlator_t *subvol = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    fd_t *fd_in = NULL;</div><div class='add'>+    fd_t *fd_out = NULL;</div><div class='add'>+    struct iatt preiatt =</div><div class='add'>+                    {</div><div class='add'>+                        0,</div><div class='add'>+                    },</div><div class='add'>+                iattbuf =</div><div class='add'>+                    {</div><div class='add'>+                        0,</div><div class='add'>+                    },</div><div class='add'>+                postiatt = {</div><div class='add'>+                    0,</div><div class='add'>+                };</div><div class='add'>+    dict_t *fop_attr = NULL;</div><div class='add'>+    off64_t pos_in;</div><div class='add'>+    off64_t pos_out;</div><div class='add'>+</div><div class='add'>+    DECLARE_OLD_THIS;</div><div class='add'>+    __GLFS_ENTRY_VALIDATE_FD(glfd_in, invalid_fs);</div><div class='add'>+    __GLFS_ENTRY_VALIDATE_FD(glfd_out, invalid_fs);</div><div class='add'>+</div><div class='add'>+    GF_REF_GET(glfd_in);</div><div class='add'>+    GF_REF_GET(glfd_out);</div><div class='add'>+</div><div class='add'>+    if (glfd_in-&gt;fs != glfd_out-&gt;fs) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        errno = EXDEV;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    subvol = glfs_active_subvol(glfd_in-&gt;fs);</div><div class='add'>+    if (!subvol) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        errno = EIO;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    fd_in = glfs_resolve_fd(glfd_in-&gt;fs, subvol, glfd_in);</div><div class='add'>+    if (!fd_in) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        errno = EBADFD;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    fd_out = glfs_resolve_fd(glfd_out-&gt;fs, subvol, glfd_out);</div><div class='add'>+    if (!fd_out) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        errno = EBADFD;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /*</div><div class='add'>+     * This is based on how the vfs layer in the kernel handles</div><div class='add'>+     * copy_file_range call. Upon receiving it follows the</div><div class='add'>+     * below method to consider the offset.</div><div class='add'>+     * if (off_in != NULL)</div><div class='add'>+     *    use the value off_in to perform the op</div><div class='add'>+     * else if off_in == NULL</div><div class='add'>+     *    use the current file offset position to perform the op</div><div class='add'>+     *</div><div class='add'>+     * For gfapi, glfd-&gt;offset is used. For a freshly opened</div><div class='add'>+     * fd, the offset is set to 0.</div><div class='add'>+     */</div><div class='add'>+    if (off_in)</div><div class='add'>+        pos_in = *off_in;</div><div class='add'>+    else</div><div class='add'>+        pos_in = glfd_in-&gt;offset;</div><div class='add'>+</div><div class='add'>+    if (off_out)</div><div class='add'>+        pos_out = *off_out;</div><div class='add'>+    else</div><div class='add'>+        pos_out = glfd_out-&gt;offset;</div><div class='add'>+</div><div class='add'>+    ret = get_fop_attr_thrd_key(&amp;fop_attr);</div><div class='add'>+    if (ret)</div><div class='add'>+        gf_msg_debug("gfapi", 0, "Getting leaseid from thread failed");</div><div class='add'>+</div><div class='add'>+    ret = syncop_copy_file_range(subvol, fd_in, pos_in, fd_out, pos_out, len,</div><div class='add'>+                                 flags, &amp;iattbuf, &amp;preiatt, &amp;postiatt, fop_attr,</div><div class='add'>+                                 NULL);</div><div class='add'>+    DECODE_SYNCOP_ERR(ret);</div><div class='add'>+</div><div class='add'>+    if (ret &gt;= 0) {</div><div class='add'>+        pos_in += ret;</div><div class='add'>+        pos_out += ret;</div><div class='add'>+</div><div class='add'>+        if (off_in)</div><div class='add'>+            *off_in = pos_in;</div><div class='add'>+        if (off_out)</div><div class='add'>+            *off_out = pos_out;</div><div class='add'>+</div><div class='add'>+        if (statbuf)</div><div class='add'>+            glfs_iatt_to_statx(glfd_in-&gt;fs, &amp;iattbuf, statbuf);</div><div class='add'>+        if (prestat)</div><div class='add'>+            glfs_iatt_to_statx(glfd_in-&gt;fs, &amp;preiatt, prestat);</div><div class='add'>+        if (poststat)</div><div class='add'>+            glfs_iatt_to_statx(glfd_in-&gt;fs, &amp;postiatt, poststat);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (ret &lt;= 0)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    /*</div><div class='add'>+     * If *off_in is NULL, then there is no offset info that can</div><div class='add'>+     * obtained from the input argument. Hence follow below method.</div><div class='add'>+     *  If *off_in is NULL, then</div><div class='add'>+     *     glfd-&gt;offset = offset + ret;</div><div class='add'>+     * else</div><div class='add'>+     *     do nothing.</div><div class='add'>+     *</div><div class='add'>+     * According to the man page of copy_file_range, if off_in is</div><div class='add'>+     * NULL, then the offset of the source file is advanced by</div><div class='add'>+     * the return value of the fop. The same applies to off_out as</div><div class='add'>+     * well. Otherwise, if *off_in is not NULL, then the offset</div><div class='add'>+     * is not advanced by the filesystem. The entity which sends</div><div class='add'>+     * the copy_file_range call is supposed to advance the offset</div><div class='add'>+     * value in its buffer (pointed to by *off_in or *off_out)</div><div class='add'>+     * by the return value of copy_file_range.</div><div class='add'>+     */</div><div class='add'>+    if (!off_in)</div><div class='add'>+        glfd_in-&gt;offset += ret;</div><div class='add'>+</div><div class='add'>+    if (!off_out)</div><div class='add'>+        glfd_out-&gt;offset += ret;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (fd_in)</div><div class='add'>+        fd_unref(fd_in);</div><div class='add'>+    if (fd_out)</div><div class='add'>+        fd_unref(fd_out);</div><div class='add'>+    if (glfd_in)</div><div class='add'>+        GF_REF_PUT(glfd_in);</div><div class='add'>+    if (glfd_out)</div><div class='add'>+        GF_REF_PUT(glfd_out);</div><div class='add'>+    if (fop_attr)</div><div class='add'>+        dict_unref(fop_attr);</div><div class='add'>+</div><div class='add'>+    glfs_subvol_done(glfd_in-&gt;fs, subvol);</div><div class='add'>+</div><div class='add'>+    __GLFS_EXIT_FS;</div><div class='add'>+</div><div class='add'>+invalid_fs:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_pwritev, 3.4.0)</div><div class='add'>+ssize_t</div><div class='add'>+pub_glfs_pwritev(struct glfs_fd *glfd, const struct iovec *iovec, int iovcnt,</div><div class='add'>+                 off_t offset, int flags)</div><div class='add'>+{</div><div class='add'>+    return glfs_pwritev_common(glfd, iovec, iovcnt, offset, flags, NULL, NULL);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_write, 3.4.0)</div><div class='add'>+ssize_t</div><div class='add'>+pub_glfs_write(struct glfs_fd *glfd, const void *buf, size_t count, int flags)</div><div class='add'>+{</div><div class='add'>+    struct iovec iov = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    ssize_t ret = 0;</div><div class='add'>+</div><div class='add'>+    if (glfd == NULL) {</div><div class='add'>+        errno = EBADF;</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    iov.iov_base = (void *)buf;</div><div class='add'>+    iov.iov_len = count;</div><div class='add'>+</div><div class='add'>+    ret = pub_glfs_pwritev(glfd, &amp;iov, 1, glfd-&gt;offset, flags);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_writev, 3.4.0)</div><div class='add'>+ssize_t</div><div class='add'>+pub_glfs_writev(struct glfs_fd *glfd, const struct iovec *iov, int count,</div><div class='add'>+                int flags)</div><div class='add'>+{</div><div class='add'>+    ssize_t ret = 0;</div><div class='add'>+</div><div class='add'>+    if (glfd == NULL) {</div><div class='add'>+        errno = EBADF;</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = pub_glfs_pwritev(glfd, iov, count, glfd-&gt;offset, flags);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+GFAPI_SYMVER_PUBLIC(glfs_pwrite34, glfs_pwrite, 3.4.0)</div><div class='add'>+ssize_t</div><div class='add'>+pub_glfs_pwrite34(struct glfs_fd *glfd, const void *buf, size_t count,</div><div class='add'>+                  off_t offset, int flags)</div><div class='add'>+{</div><div class='add'>+    struct iovec iov = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    ssize_t ret = 0;</div><div class='add'>+</div><div class='add'>+    iov.iov_base = (void *)buf;</div><div class='add'>+    iov.iov_len = count;</div><div class='add'>+</div><div class='add'>+    ret = pub_glfs_pwritev(glfd, &amp;iov, 1, offset, flags);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_pwrite, 6.0)</div><div class='add'>+ssize_t</div><div class='add'>+pub_glfs_pwrite(struct glfs_fd *glfd, const void *buf, size_t count,</div><div class='add'>+                off_t offset, int flags, struct glfs_stat *prestat,</div><div class='add'>+                struct glfs_stat *poststat)</div><div class='add'>+{</div><div class='add'>+    struct iovec iov = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    ssize_t ret = 0;</div><div class='add'>+</div><div class='add'>+    iov.iov_base = (void *)buf;</div><div class='add'>+    iov.iov_len = count;</div><div class='add'>+</div><div class='add'>+    ret = glfs_pwritev_common(glfd, &amp;iov, 1, offset, flags, prestat, poststat);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+extern glfs_t *</div><div class='add'>+pub_glfs_from_glfd(glfs_fd_t *);</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+glfs_pwritev_async_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                       int op_ret, int op_errno, struct iatt *prebuf,</div><div class='add'>+                       struct iatt *postbuf, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    glfs_io_async_cbk(op_ret, op_errno, frame, cookie, NULL, 0, prebuf,</div><div class='add'>+                      postbuf);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+glfs_pwritev_async_common(struct glfs_fd *glfd, const struct iovec *iovec,</div><div class='add'>+                          int count, off_t offset, int flags,</div><div class='add'>+                          gf_boolean_t oldcb, glfs_io_cbk fn, void *data)</div><div class='add'>+{</div><div class='add'>+    struct glfs_io *gio = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    call_frame_t *frame = NULL;</div><div class='add'>+    xlator_t *subvol = NULL;</div><div class='add'>+    fd_t *fd = NULL;</div><div class='add'>+    struct iobref *iobref = NULL;</div><div class='add'>+    struct iobuf *iobuf = NULL;</div><div class='add'>+    dict_t *fop_attr = NULL;</div><div class='add'>+</div><div class='add'>+    DECLARE_OLD_THIS;</div><div class='add'>+    __GLFS_ENTRY_VALIDATE_FD(glfd, invalid_fs);</div><div class='add'>+</div><div class='add'>+    /* Need to take explicit ref so that the fd</div><div class='add'>+     * is not destroyed before the fop is complete</div><div class='add'>+     */</div><div class='add'>+    GF_REF_GET(glfd);</div><div class='add'>+</div><div class='add'>+    subvol = glfs_active_subvol(glfd-&gt;fs);</div><div class='add'>+    if (!subvol) {</div><div class='add'>+        errno = EIO;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    fd = glfs_resolve_fd(glfd-&gt;fs, subvol, glfd);</div><div class='add'>+    if (!fd) {</div><div class='add'>+        errno = EBADFD;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    gio = GF_CALLOC(1, sizeof(*gio), glfs_mt_glfs_io_t);</div><div class='add'>+    if (!gio) {</div><div class='add'>+        errno = ENOMEM;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    gio-&gt;op = GF_FOP_WRITE;</div><div class='add'>+    gio-&gt;glfd = glfd;</div><div class='add'>+    gio-&gt;offset = offset;</div><div class='add'>+    gio-&gt;flags = flags;</div><div class='add'>+    gio-&gt;oldcb = oldcb;</div><div class='add'>+    gio-&gt;fn = fn;</div><div class='add'>+    gio-&gt;data = data;</div><div class='add'>+    gio-&gt;count = 1;</div><div class='add'>+    gio-&gt;iov = GF_CALLOC(gio-&gt;count, sizeof(*(gio-&gt;iov)), gf_common_mt_iovec);</div><div class='add'>+    if (!gio-&gt;iov) {</div><div class='add'>+        errno = ENOMEM;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = iobuf_copy(subvol-&gt;ctx-&gt;iobuf_pool, iovec, count, &amp;iobref, &amp;iobuf,</div><div class='add'>+                     gio-&gt;iov);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    frame = syncop_create_frame(THIS);</div><div class='add'>+    if (!frame) {</div><div class='add'>+        errno = ENOMEM;</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    frame-&gt;local = gio;</div><div class='add'>+</div><div class='add'>+    ret = get_fop_attr_thrd_key(&amp;fop_attr);</div><div class='add'>+    if (ret)</div><div class='add'>+        gf_msg_debug("gfapi", 0, "Getting leaseid from thread failed");</div><div class='add'>+</div><div class='add'>+    STACK_WIND_COOKIE(frame, glfs_pwritev_async_cbk, subvol, subvol,</div><div class='add'>+                      subvol-&gt;fops-&gt;writev, fd, gio-&gt;iov, gio-&gt;count, offset,</div><div class='add'>+                      flags, iobref, fop_attr);</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+out:</div><div class='add'>+    if (ret) {</div><div class='add'>+        if (fd)</div><div class='add'>+            fd_unref(fd);</div><div class='add'>+        if (glfd)</div><div class='add'>+            GF_REF_PUT(glfd);</div><div class='add'>+        GF_FREE(gio);</div><div class='add'>+        /*</div><div class='add'>+         * If there is any error condition check after the frame</div><div class='add'>+         * creation, we have to destroy the frame root.</div><div class='add'>+         */</div><div class='add'>+        glfs_subvol_done(glfd-&gt;fs, subvol);</div><div class='add'>+    }</div><div class='add'>+    if (fop_attr)</div><div class='add'>+        dict_unref(fop_attr);</div><div class='add'>+</div><div class='add'>+    if (iobuf)</div><div class='add'>+        iobuf_unref(iobuf);</div><div class='add'>+    if (iobref)</div><div class='add'>+        iobref_unref(iobref);</div><div class='add'>+</div><div class='add'>+    __GLFS_EXIT_FS;</div><div class='add'>+</div><div class='add'>+invalid_fs:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+GFAPI_SYMVER_PUBLIC(glfs_pwritev_async34, glfs_pwritev_async, 3.4.0)</div><div class='add'>+int</div><div class='add'>+pub_glfs_pwritev_async34(struct glfs_fd *glfd, const struct iovec *iovec,</div><div class='add'>+                         int count, off_t offset, int flags, glfs_io_cbk34 fn,</div><div class='add'>+                         void *data)</div><div class='add'>+{</div><div class='add'>+    return glfs_pwritev_async_common(glfd, iovec, count, offset, flags,</div><div class='add'>+                                     _gf_true, (void *)fn, data);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_pwritev_async, 6.0)</div><div class='add'>+int</div><div class='add'>+pub_glfs_pwritev_async(struct glfs_fd *glfd, const struct iovec *iovec,</div><div class='add'>+                       int count, off_t offset, int flags, glfs_io_cbk fn,</div><div class='add'>+                       void *data)</div><div class='add'>+{</div><div class='add'>+    return glfs_pwritev_async_common(glfd, iovec, count, offset, flags,</div><div class='add'>+                                     _gf_false, fn, data);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+GFAPI_SYMVER_PUBLIC(glfs_write_async34, glfs_write_async, 3.4.0)</div><div class='add'>+int</div><div class='add'>+pub_glfs_write_async34(struct glfs_fd *glfd, const void *buf, size_t count,</div><div class='add'>+                       int flags, glfs_io_cbk34 fn, void *data)</div><div class='add'>+{</div><div class='add'>+    struct iovec iov = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    ssize_t ret = 0;</div><div class='add'>+</div><div class='add'>+    if (glfd == NULL) {</div><div class='add'>+        errno = EBADF;</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    iov.iov_base = (void *)buf;</div><div class='add'>+    iov.iov_len = count;</div><div class='add'>+</div><div class='add'>+    ret = glfs_pwritev_async_common(glfd, &amp;iov, 1, glfd-&gt;offset, flags,</div><div class='add'>+                                    _gf_true, (void *)fn, data);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_write_async, 6.0)</div><div class='add'>+int</div><div class='add'>+pub_glfs_write_async(struct glfs_fd *glfd, const void *buf, size_t count,</div><div class='add'>+                     int flags, glfs_io_cbk fn, void *data)</div><div class='add'>+{</div><div class='add'>+    struct iovec iov = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    ssize_t ret = 0;</div><div class='add'>+</div><div class='add'>+    if (glfd == NULL) {</div><div class='add'>+        errno = EBADF;</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    iov.iov_base = (void *)buf;</div><div class='add'>+    iov.iov_len = count;</div><div class='add'>+</div><div class='add'>+    ret = glfs_pwritev_async_common(glfd, &amp;iov, 1, glfd-&gt;offset, flags,</div><div class='add'>+                                    _gf_false, fn, data);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+GFAPI_SYMVER_PUBLIC(glfs_pwrite_async34, glfs_pwrite_async, 3.4.0)</div><div class='add'>+int</div><div class='add'>+pub_glfs_pwrite_async34(struct glfs_fd *glfd, const void *buf, int count,</div><div class='add'>+                        off_t offset, int flags, glfs_io_cbk34 fn, void *data)</div><div class='add'>+{</div><div class='add'>+    struct iovec iov = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    ssize_t ret = 0;</div><div class='add'>+</div><div class='add'>+    iov.iov_base = (void *)buf;</div><div class='add'>+    iov.iov_len = count;</div><div class='add'>+</div><div class='add'>+    ret = glfs_pwritev_async_common(glfd, &amp;iov, 1, offset, flags, _gf_true,</div><div class='add'>+                                    (void *)fn, data);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_pwrite_async, 6.0)</div><div class='add'>+int</div><div class='add'>+pub_glfs_pwrite_async(struct glfs_fd *glfd, const void *buf, int count,</div><div class='add'>+                      off_t offset, int flags, glfs_io_cbk fn, void *data)</div><div class='add'>+{</div><div class='add'>+    struct iovec iov = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    ssize_t ret = 0;</div><div class='add'>+</div><div class='add'>+    iov.iov_base = (void *)buf;</div><div class='add'>+    iov.iov_len = count;</div><div class='add'>+</div><div class='add'>+    ret = glfs_pwritev_async_common(glfd, &amp;iov, 1, offset, flags, _gf_false, fn,</div><div class='add'>+                                    data);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+GFAPI_SYMVER_PUBLIC(glfs_writev_async34, glfs_writev_async, 3.4.0)</div><div class='add'>+int</div><div class='add'>+pub_glfs_writev_async34(struct glfs_fd *glfd, const struct iovec *iov,</div><div class='add'>+                        int count, int flags, glfs_io_cbk34 fn, void *data)</div><div class='add'>+{</div><div class='add'>+    ssize_t ret = 0;</div><div class='add'>+</div><div class='add'>+    if (glfd == NULL) {</div><div class='add'>+        errno = EBADF;</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = glfs_pwritev_async_common(glfd, iov, count, glfd-&gt;offset, flags,</div><div class='add'>+                                    _gf_true, (void *)fn, data);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_writev_async, 6.0)</div><div class='add'>+int</div><div class='add'>+pub_glfs_writev_async(struct glfs_fd *glfd, const struct iovec *iov, int count,</div><div class='add'>+                      int flags, glfs_io_cbk fn, void *data)</div><div class='add'>+{</div><div class='add'>+    ssize_t ret = 0;</div><div class='add'>+</div><div class='add'>+    if (glfd == NULL) {</div><div class='add'>+        errno = EBADF;</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = glfs_pwritev_async_common(glfd, iov, count, glfd-&gt;offset, flags,</div><div class='add'>+                                    _gf_false, fn, data);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+glfs_fsync_common(struct glfs_fd *glfd, struct glfs_stat *prestat,</div><div class='add'>+                  struct glfs_stat *poststat)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    xlator_t *subvol = NULL;</div><div class='add'>+    fd_t *fd = NULL;</div><div class='add'>+    struct iatt preiatt =</div><div class='add'>+                    {</div><div class='add'>+                        0,</div><div class='add'>+                    },</div><div class='add'>+                postiatt = {</div><div class='add'>+                    0,</div><div class='add'>+                };</div><div class='add'>+    dict_t *fop_attr = NULL;</div><div class='add'>+</div><div class='add'>+    DECLARE_OLD_THIS;</div><div class='add'>+    __GLFS_ENTRY_VALIDATE_FD(glfd, invalid_fs);</div><div class='add'>+</div><div class='add'>+    GF_REF_GET(glfd);</div><div class='add'>+</div><div class='add'>+    subvol = glfs_active_subvol(glfd-&gt;fs);</div><div class='add'>+    if (!subvol) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        errno = EIO;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    fd = glfs_resolve_fd(glfd-&gt;fs, subvol, glfd);</div><div class='add'>+    if (!fd) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        errno = EBADFD;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = get_fop_attr_thrd_key(&amp;fop_attr);</div><div class='add'>+    if (ret)</div><div class='add'>+        gf_msg_debug("gfapi", 0, "Getting leaseid from thread failed");</div><div class='add'>+</div><div class='add'>+    ret = syncop_fsync(subvol, fd, 0, &amp;preiatt, &amp;postiatt, fop_attr, NULL);</div><div class='add'>+    DECODE_SYNCOP_ERR(ret);</div><div class='add'>+</div><div class='add'>+    if (ret &gt;= 0) {</div><div class='add'>+        if (prestat)</div><div class='add'>+            glfs_iatt_to_statx(glfd-&gt;fs, &amp;preiatt, prestat);</div><div class='add'>+        if (poststat)</div><div class='add'>+            glfs_iatt_to_statx(glfd-&gt;fs, &amp;postiatt, poststat);</div><div class='add'>+    }</div><div class='add'>+out:</div><div class='add'>+    if (fd)</div><div class='add'>+        fd_unref(fd);</div><div class='add'>+    if (glfd)</div><div class='add'>+        GF_REF_PUT(glfd);</div><div class='add'>+    if (fop_attr)</div><div class='add'>+        dict_unref(fop_attr);</div><div class='add'>+</div><div class='add'>+    glfs_subvol_done(glfd-&gt;fs, subvol);</div><div class='add'>+</div><div class='add'>+    __GLFS_EXIT_FS;</div><div class='add'>+</div><div class='add'>+invalid_fs:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+GFAPI_SYMVER_PUBLIC(glfs_fsync34, glfs_fsync, 3.4.0)</div><div class='add'>+int</div><div class='add'>+pub_glfs_fsync34(struct glfs_fd *glfd)</div><div class='add'>+{</div><div class='add'>+    return glfs_fsync_common(glfd, NULL, NULL);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_fsync, 6.0)</div><div class='add'>+int</div><div class='add'>+pub_glfs_fsync(struct glfs_fd *glfd, struct glfs_stat *prestat,</div><div class='add'>+               struct glfs_stat *poststat)</div><div class='add'>+{</div><div class='add'>+    return glfs_fsync_common(glfd, prestat, poststat);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+glfs_fsync_async_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                     int32_t op_ret, int32_t op_errno, struct iatt *prebuf,</div><div class='add'>+                     struct iatt *postbuf, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    glfs_io_async_cbk(op_ret, op_errno, frame, cookie, NULL, 0, prebuf,</div><div class='add'>+                      postbuf);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+glfs_fsync_async_common(struct glfs_fd *glfd, gf_boolean_t oldcb,</div><div class='add'>+                        glfs_io_cbk fn, void *data, int dataonly)</div><div class='add'>+{</div><div class='add'>+    struct glfs_io *gio = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    call_frame_t *frame = NULL;</div><div class='add'>+    xlator_t *subvol = NULL;</div><div class='add'>+    fd_t *fd = NULL;</div><div class='add'>+</div><div class='add'>+    /* Need to take explicit ref so that the fd</div><div class='add'>+     * is not destroyed before the fop is complete</div><div class='add'>+     */</div><div class='add'>+    GF_REF_GET(glfd);</div><div class='add'>+</div><div class='add'>+    subvol = glfs_active_subvol(glfd-&gt;fs);</div><div class='add'>+    if (!subvol) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        errno = EIO;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    fd = glfs_resolve_fd(glfd-&gt;fs, subvol, glfd);</div><div class='add'>+    if (!fd) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        errno = EBADFD;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    frame = syncop_create_frame(THIS);</div><div class='add'>+    if (!frame) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        errno = ENOMEM;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    gio = GF_CALLOC(1, sizeof(*gio), glfs_mt_glfs_io_t);</div><div class='add'>+    if (!gio) {</div><div class='add'>+        errno = ENOMEM;</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    gio-&gt;op = GF_FOP_FSYNC;</div><div class='add'>+    gio-&gt;glfd = glfd;</div><div class='add'>+    gio-&gt;flags = dataonly;</div><div class='add'>+    gio-&gt;oldcb = oldcb;</div><div class='add'>+    gio-&gt;fn = fn;</div><div class='add'>+    gio-&gt;data = data;</div><div class='add'>+</div><div class='add'>+    frame-&gt;local = gio;</div><div class='add'>+</div><div class='add'>+    STACK_WIND_COOKIE(frame, glfs_fsync_async_cbk, subvol, subvol,</div><div class='add'>+                      subvol-&gt;fops-&gt;fsync, fd, dataonly, NULL);</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (ret) {</div><div class='add'>+        if (fd)</div><div class='add'>+            fd_unref(fd);</div><div class='add'>+        GF_REF_PUT(glfd);</div><div class='add'>+        GF_FREE(gio);</div><div class='add'>+        if (frame)</div><div class='add'>+            STACK_DESTROY(frame-&gt;root);</div><div class='add'>+        glfs_subvol_done(glfd-&gt;fs, subvol);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+GFAPI_SYMVER_PUBLIC(glfs_fsync_async34, glfs_fsync_async, 3.4.0)</div><div class='add'>+int</div><div class='add'>+pub_glfs_fsync_async34(struct glfs_fd *glfd, glfs_io_cbk34 fn, void *data)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    DECLARE_OLD_THIS;</div><div class='add'>+    __GLFS_ENTRY_VALIDATE_FD(glfd, invalid_fs);</div><div class='add'>+</div><div class='add'>+    ret = glfs_fsync_async_common(glfd, _gf_true, (void *)fn, data, 0);</div><div class='add'>+</div><div class='add'>+    __GLFS_EXIT_FS;</div><div class='add'>+</div><div class='add'>+invalid_fs:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_fsync_async, 6.0)</div><div class='add'>+int</div><div class='add'>+pub_glfs_fsync_async(struct glfs_fd *glfd, glfs_io_cbk fn, void *data)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    DECLARE_OLD_THIS;</div><div class='add'>+    __GLFS_ENTRY_VALIDATE_FD(glfd, invalid_fs);</div><div class='add'>+</div><div class='add'>+    ret = glfs_fsync_async_common(glfd, _gf_false, fn, data, 0);</div><div class='add'>+</div><div class='add'>+    __GLFS_EXIT_FS;</div><div class='add'>+</div><div class='add'>+invalid_fs:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+glfs_fdatasync_common(struct glfs_fd *glfd, struct glfs_stat *prestat,</div><div class='add'>+                      struct glfs_stat *poststat)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    xlator_t *subvol = NULL;</div><div class='add'>+    fd_t *fd = NULL;</div><div class='add'>+    struct iatt preiatt =</div><div class='add'>+                    {</div><div class='add'>+                        0,</div><div class='add'>+                    },</div><div class='add'>+                postiatt = {</div><div class='add'>+                    0,</div><div class='add'>+                };</div><div class='add'>+    dict_t *fop_attr = NULL;</div><div class='add'>+</div><div class='add'>+    DECLARE_OLD_THIS;</div><div class='add'>+    __GLFS_ENTRY_VALIDATE_FD(glfd, invalid_fs);</div><div class='add'>+</div><div class='add'>+    GF_REF_GET(glfd);</div><div class='add'>+</div><div class='add'>+    subvol = glfs_active_subvol(glfd-&gt;fs);</div><div class='add'>+    if (!subvol) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        errno = EIO;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    fd = glfs_resolve_fd(glfd-&gt;fs, subvol, glfd);</div><div class='add'>+    if (!fd) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        errno = EBADFD;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = get_fop_attr_thrd_key(&amp;fop_attr);</div><div class='add'>+    if (ret)</div><div class='add'>+        gf_msg_debug("gfapi", 0, "Getting leaseid from thread failed");</div><div class='add'>+</div><div class='add'>+    ret = syncop_fsync(subvol, fd, 1, &amp;preiatt, &amp;postiatt, fop_attr, NULL);</div><div class='add'>+    DECODE_SYNCOP_ERR(ret);</div><div class='add'>+</div><div class='add'>+    if (ret &gt;= 0) {</div><div class='add'>+        if (prestat)</div><div class='add'>+            glfs_iatt_to_statx(glfd-&gt;fs, &amp;preiatt, prestat);</div><div class='add'>+        if (poststat)</div><div class='add'>+            glfs_iatt_to_statx(glfd-&gt;fs, &amp;postiatt, poststat);</div><div class='add'>+    }</div><div class='add'>+out:</div><div class='add'>+    if (fd)</div><div class='add'>+        fd_unref(fd);</div><div class='add'>+    if (glfd)</div><div class='add'>+        GF_REF_PUT(glfd);</div><div class='add'>+    if (fop_attr)</div><div class='add'>+        dict_unref(fop_attr);</div><div class='add'>+</div><div class='add'>+    glfs_subvol_done(glfd-&gt;fs, subvol);</div><div class='add'>+</div><div class='add'>+    __GLFS_EXIT_FS;</div><div class='add'>+</div><div class='add'>+invalid_fs:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+GFAPI_SYMVER_PUBLIC(glfs_fdatasync34, glfs_fdatasync, 3.4.0)</div><div class='add'>+int</div><div class='add'>+pub_glfs_fdatasync34(struct glfs_fd *glfd)</div><div class='add'>+{</div><div class='add'>+    return glfs_fdatasync_common(glfd, NULL, NULL);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_fdatasync, 6.0)</div><div class='add'>+int</div><div class='add'>+pub_glfs_fdatasync(struct glfs_fd *glfd, struct glfs_stat *prestat,</div><div class='add'>+                   struct glfs_stat *poststat)</div><div class='add'>+{</div><div class='add'>+    return glfs_fdatasync_common(glfd, prestat, poststat);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+GFAPI_SYMVER_PUBLIC(glfs_fdatasync_async34, glfs_fdatasync_async, 3.4.0)</div><div class='add'>+int</div><div class='add'>+pub_glfs_fdatasync_async34(struct glfs_fd *glfd, glfs_io_cbk34 fn, void *data)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    DECLARE_OLD_THIS;</div><div class='add'>+    __GLFS_ENTRY_VALIDATE_FD(glfd, invalid_fs);</div><div class='add'>+</div><div class='add'>+    ret = glfs_fsync_async_common(glfd, _gf_true, (void *)fn, data, 1);</div><div class='add'>+</div><div class='add'>+    __GLFS_EXIT_FS;</div><div class='add'>+</div><div class='add'>+invalid_fs:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_fdatasync_async, 6.0)</div><div class='add'>+int</div><div class='add'>+pub_glfs_fdatasync_async(struct glfs_fd *glfd, glfs_io_cbk fn, void *data)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    DECLARE_OLD_THIS;</div><div class='add'>+    __GLFS_ENTRY_VALIDATE_FD(glfd, invalid_fs);</div><div class='add'>+</div><div class='add'>+    ret = glfs_fsync_async_common(glfd, _gf_false, fn, data, 1);</div><div class='add'>+</div><div class='add'>+    __GLFS_EXIT_FS;</div><div class='add'>+</div><div class='add'>+invalid_fs:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+glfs_ftruncate_common(struct glfs_fd *glfd, off_t offset,</div><div class='add'>+                      struct glfs_stat *prestat, struct glfs_stat *poststat)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    xlator_t *subvol = NULL;</div><div class='add'>+    fd_t *fd = NULL;</div><div class='add'>+    struct iatt preiatt =</div><div class='add'>+                    {</div><div class='add'>+                        0,</div><div class='add'>+                    },</div><div class='add'>+                postiatt = {</div><div class='add'>+                    0,</div><div class='add'>+                };</div><div class='add'>+    dict_t *fop_attr = NULL;</div><div class='add'>+</div><div class='add'>+    DECLARE_OLD_THIS;</div><div class='add'>+    __GLFS_ENTRY_VALIDATE_FD(glfd, invalid_fs);</div><div class='add'>+</div><div class='add'>+    GF_REF_GET(glfd);</div><div class='add'>+</div><div class='add'>+    subvol = glfs_active_subvol(glfd-&gt;fs);</div><div class='add'>+    if (!subvol) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        errno = EIO;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    fd = glfs_resolve_fd(glfd-&gt;fs, subvol, glfd);</div><div class='add'>+    if (!fd) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        errno = EBADFD;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = get_fop_attr_thrd_key(&amp;fop_attr);</div><div class='add'>+    if (ret)</div><div class='add'>+        gf_msg_debug("gfapi", 0, "Getting leaseid from thread failed");</div><div class='add'>+</div><div class='add'>+    ret = syncop_ftruncate(subvol, fd, offset, &amp;preiatt, &amp;postiatt, fop_attr,</div><div class='add'>+                           NULL);</div><div class='add'>+    DECODE_SYNCOP_ERR(ret);</div><div class='add'>+</div><div class='add'>+    if (ret &gt;= 0) {</div><div class='add'>+        if (prestat)</div><div class='add'>+            glfs_iatt_to_statx(glfd-&gt;fs, &amp;preiatt, prestat);</div><div class='add'>+        if (poststat)</div><div class='add'>+            glfs_iatt_to_statx(glfd-&gt;fs, &amp;postiatt, poststat);</div><div class='add'>+    }</div><div class='add'>+out:</div><div class='add'>+    if (fd)</div><div class='add'>+        fd_unref(fd);</div><div class='add'>+    if (glfd)</div><div class='add'>+        GF_REF_PUT(glfd);</div><div class='add'>+    if (fop_attr)</div><div class='add'>+        dict_unref(fop_attr);</div><div class='add'>+</div><div class='add'>+    glfs_subvol_done(glfd-&gt;fs, subvol);</div><div class='add'>+</div><div class='add'>+    __GLFS_EXIT_FS;</div><div class='add'>+</div><div class='add'>+invalid_fs:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+GFAPI_SYMVER_PUBLIC(glfs_ftruncate34, glfs_ftruncate, 3.4.0)</div><div class='add'>+int</div><div class='add'>+pub_glfs_ftruncate34(struct glfs_fd *glfd, off_t offset)</div><div class='add'>+{</div><div class='add'>+    return glfs_ftruncate_common(glfd, offset, NULL, NULL);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_ftruncate, 6.0)</div><div class='add'>+int</div><div class='add'>+pub_glfs_ftruncate(struct glfs_fd *glfd, off_t offset,</div><div class='add'>+                   struct glfs_stat *prestat, struct glfs_stat *poststat)</div><div class='add'>+{</div><div class='add'>+    return glfs_ftruncate_common(glfd, offset, prestat, poststat);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_truncate, 3.7.15)</div><div class='add'>+int</div><div class='add'>+pub_glfs_truncate(struct glfs *fs, const char *path, off_t length)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    xlator_t *subvol = NULL;</div><div class='add'>+    loc_t loc = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    struct iatt iatt = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int reval = 0;</div><div class='add'>+</div><div class='add'>+    DECLARE_OLD_THIS;</div><div class='add'>+    __GLFS_ENTRY_VALIDATE_FS(fs, invalid_fs);</div><div class='add'>+</div><div class='add'>+    subvol = glfs_active_subvol(fs);</div><div class='add'>+    if (!subvol) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        errno = EIO;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+retry:</div><div class='add'>+    ret = glfs_resolve(fs, subvol, path, &amp;loc, &amp;iatt, reval);</div><div class='add'>+</div><div class='add'>+    ESTALE_RETRY(ret, errno, reval, &amp;loc, retry);</div><div class='add'>+</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    ret = syncop_truncate(subvol, &amp;loc, length, NULL, NULL);</div><div class='add'>+    DECODE_SYNCOP_ERR(ret);</div><div class='add'>+</div><div class='add'>+    ESTALE_RETRY(ret, errno, reval, &amp;loc, retry);</div><div class='add'>+out:</div><div class='add'>+    loc_wipe(&amp;loc);</div><div class='add'>+</div><div class='add'>+    glfs_subvol_done(fs, subvol);</div><div class='add'>+</div><div class='add'>+    __GLFS_EXIT_FS;</div><div class='add'>+</div><div class='add'>+invalid_fs:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+glfs_ftruncate_async_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                         int32_t op_ret, int32_t op_errno, struct iatt *prebuf,</div><div class='add'>+                         struct iatt *postbuf, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    glfs_io_async_cbk(op_ret, op_errno, frame, cookie, NULL, 0, prebuf,</div><div class='add'>+                      postbuf);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+glfs_ftruncate_async_common(struct glfs_fd *glfd, off_t offset,</div><div class='add'>+                            gf_boolean_t oldcb, glfs_io_cbk fn, void *data)</div><div class='add'>+{</div><div class='add'>+    struct glfs_io *gio = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    call_frame_t *frame = NULL;</div><div class='add'>+    xlator_t *subvol = NULL;</div><div class='add'>+    fd_t *fd = NULL;</div><div class='add'>+    dict_t *fop_attr = NULL;</div><div class='add'>+</div><div class='add'>+    DECLARE_OLD_THIS;</div><div class='add'>+    __GLFS_ENTRY_VALIDATE_FD(glfd, invalid_fs);</div><div class='add'>+</div><div class='add'>+    /* Need to take explicit ref so that the fd</div><div class='add'>+     * is not destroyed before the fop is complete</div><div class='add'>+     */</div><div class='add'>+    GF_REF_GET(glfd);</div><div class='add'>+</div><div class='add'>+    subvol = glfs_active_subvol(glfd-&gt;fs);</div><div class='add'>+    if (!subvol) {</div><div class='add'>+        errno = EIO;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    fd = glfs_resolve_fd(glfd-&gt;fs, subvol, glfd);</div><div class='add'>+    if (!fd) {</div><div class='add'>+        errno = EBADFD;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    frame = syncop_create_frame(THIS);</div><div class='add'>+    if (!frame) {</div><div class='add'>+        errno = ENOMEM;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    gio = GF_CALLOC(1, sizeof(*gio), glfs_mt_glfs_io_t);</div><div class='add'>+    if (!gio) {</div><div class='add'>+        errno = ENOMEM;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    gio-&gt;op = GF_FOP_FTRUNCATE;</div><div class='add'>+    gio-&gt;glfd = glfd;</div><div class='add'>+    gio-&gt;offset = offset;</div><div class='add'>+    gio-&gt;oldcb = oldcb;</div><div class='add'>+    gio-&gt;fn = fn;</div><div class='add'>+    gio-&gt;data = data;</div><div class='add'>+</div><div class='add'>+    frame-&gt;local = gio;</div><div class='add'>+</div><div class='add'>+    ret = get_fop_attr_thrd_key(&amp;fop_attr);</div><div class='add'>+    if (ret)</div><div class='add'>+        gf_msg_debug("gfapi", 0, "Getting leaseid from thread failed");</div><div class='add'>+</div><div class='add'>+    STACK_WIND_COOKIE(frame, glfs_ftruncate_async_cbk, subvol, subvol,</div><div class='add'>+                      subvol-&gt;fops-&gt;ftruncate, fd, offset, fop_attr);</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (ret) {</div><div class='add'>+        if (fd)</div><div class='add'>+            fd_unref(fd);</div><div class='add'>+        if (glfd)</div><div class='add'>+            GF_REF_PUT(glfd);</div><div class='add'>+        GF_FREE(gio);</div><div class='add'>+        if (frame)</div><div class='add'>+            STACK_DESTROY(frame-&gt;root);</div><div class='add'>+        glfs_subvol_done(glfd-&gt;fs, subvol);</div><div class='add'>+    }</div><div class='add'>+    if (fop_attr)</div><div class='add'>+        dict_unref(fop_attr);</div><div class='add'>+</div><div class='add'>+    __GLFS_EXIT_FS;</div><div class='add'>+</div><div class='add'>+invalid_fs:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+GFAPI_SYMVER_PUBLIC(glfs_ftruncate_async34, glfs_ftruncate_async, 3.4.0)</div><div class='add'>+int</div><div class='add'>+pub_glfs_ftruncate_async34(struct glfs_fd *glfd, off_t offset, glfs_io_cbk34 fn,</div><div class='add'>+                           void *data)</div><div class='add'>+{</div><div class='add'>+    return glfs_ftruncate_async_common(glfd, offset, _gf_true, (void *)fn,</div><div class='add'>+                                       data);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_ftruncate_async, 6.0)</div><div class='add'>+int</div><div class='add'>+pub_glfs_ftruncate_async(struct glfs_fd *glfd, off_t offset, glfs_io_cbk fn,</div><div class='add'>+                         void *data)</div><div class='add'>+{</div><div class='add'>+    return glfs_ftruncate_async_common(glfd, offset, _gf_false, fn, data);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_access, 3.4.0)</div><div class='add'>+int</div><div class='add'>+pub_glfs_access(struct glfs *fs, const char *path, int mode)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    xlator_t *subvol = NULL;</div><div class='add'>+    loc_t loc = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    struct iatt iatt = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int reval = 0;</div><div class='add'>+</div><div class='add'>+    DECLARE_OLD_THIS;</div><div class='add'>+    __GLFS_ENTRY_VALIDATE_FS(fs, invalid_fs);</div><div class='add'>+</div><div class='add'>+    subvol = glfs_active_subvol(fs);</div><div class='add'>+    if (!subvol) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        errno = EIO;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+retry:</div><div class='add'>+    ret = glfs_resolve(fs, subvol, path, &amp;loc, &amp;iatt, reval);</div><div class='add'>+</div><div class='add'>+    ESTALE_RETRY(ret, errno, reval, &amp;loc, retry);</div><div class='add'>+</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    ret = syncop_access(subvol, &amp;loc, mode, NULL, NULL);</div><div class='add'>+    DECODE_SYNCOP_ERR(ret);</div><div class='add'>+</div><div class='add'>+    ESTALE_RETRY(ret, errno, reval, &amp;loc, retry);</div><div class='add'>+out:</div><div class='add'>+    loc_wipe(&amp;loc);</div><div class='add'>+</div><div class='add'>+    glfs_subvol_done(fs, subvol);</div><div class='add'>+</div><div class='add'>+    __GLFS_EXIT_FS;</div><div class='add'>+</div><div class='add'>+invalid_fs:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_symlink, 3.4.0)</div><div class='add'>+int</div><div class='add'>+pub_glfs_symlink(struct glfs *fs, const char *data, const char *path)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    xlator_t *subvol = NULL;</div><div class='add'>+    loc_t loc = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    struct iatt iatt = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    uuid_t gfid;</div><div class='add'>+    dict_t *xattr_req = NULL;</div><div class='add'>+    int reval = 0;</div><div class='add'>+</div><div class='add'>+    DECLARE_OLD_THIS;</div><div class='add'>+    __GLFS_ENTRY_VALIDATE_FS(fs, invalid_fs);</div><div class='add'>+</div><div class='add'>+    subvol = glfs_active_subvol(fs);</div><div class='add'>+    if (!subvol) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        errno = EIO;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    xattr_req = dict_new();</div><div class='add'>+    if (!xattr_req) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        errno = ENOMEM;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    gf_uuid_generate(gfid);</div><div class='add'>+    ret = dict_set_gfuuid(xattr_req, "gfid-req", gfid, true);</div><div class='add'>+    if (ret) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        errno = ENOMEM;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+retry:</div><div class='add'>+    ret = glfs_lresolve(fs, subvol, path, &amp;loc, &amp;iatt, reval);</div><div class='add'>+</div><div class='add'>+    ESTALE_RETRY(ret, errno, reval, &amp;loc, retry);</div><div class='add'>+</div><div class='add'>+    if (loc.inode) {</div><div class='add'>+        errno = EEXIST;</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (ret == -1 &amp;&amp; errno != ENOENT)</div><div class='add'>+        /* Any other type of error is fatal */</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    if (ret == -1 &amp;&amp; errno == ENOENT &amp;&amp; !loc.parent)</div><div class='add'>+        /* The parent directory or an ancestor even</div><div class='add'>+           higher does not exist</div><div class='add'>+        */</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    /* ret == -1 &amp;&amp; errno == ENOENT */</div><div class='add'>+    loc.inode = inode_new(loc.parent-&gt;table);</div><div class='add'>+    if (!loc.inode) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        errno = ENOMEM;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = syncop_symlink(subvol, &amp;loc, data, &amp;iatt, xattr_req, NULL);</div><div class='add'>+    DECODE_SYNCOP_ERR(ret);</div><div class='add'>+</div><div class='add'>+    ESTALE_RETRY(ret, errno, reval, &amp;loc, retry);</div><div class='add'>+</div><div class='add'>+    if (ret == 0)</div><div class='add'>+        ret = glfs_loc_link(&amp;loc, &amp;iatt);</div><div class='add'>+out:</div><div class='add'>+    loc_wipe(&amp;loc);</div><div class='add'>+</div><div class='add'>+    if (xattr_req)</div><div class='add'>+        dict_unref(xattr_req);</div><div class='add'>+</div><div class='add'>+    glfs_subvol_done(fs, subvol);</div><div class='add'>+</div><div class='add'>+    __GLFS_EXIT_FS;</div><div class='add'>+</div><div class='add'>+invalid_fs:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_readlink, 3.4.0)</div><div class='add'>+int</div><div class='add'>+pub_glfs_readlink(struct glfs *fs, const char *path, char *buf, size_t bufsiz)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    xlator_t *subvol = NULL;</div><div class='add'>+    loc_t loc = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    struct iatt iatt = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int reval = 0;</div><div class='add'>+    char *linkval = NULL;</div><div class='add'>+</div><div class='add'>+    DECLARE_OLD_THIS;</div><div class='add'>+    __GLFS_ENTRY_VALIDATE_FS(fs, invalid_fs);</div><div class='add'>+</div><div class='add'>+    subvol = glfs_active_subvol(fs);</div><div class='add'>+    if (!subvol) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        errno = EIO;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+retry:</div><div class='add'>+    ret = glfs_lresolve(fs, subvol, path, &amp;loc, &amp;iatt, reval);</div><div class='add'>+</div><div class='add'>+    ESTALE_RETRY(ret, errno, reval, &amp;loc, retry);</div><div class='add'>+</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    if (iatt.ia_type != IA_IFLNK) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        errno = EINVAL;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = syncop_readlink(subvol, &amp;loc, &amp;linkval, bufsiz, NULL, NULL);</div><div class='add'>+    DECODE_SYNCOP_ERR(ret);</div><div class='add'>+    if (ret &gt; 0) {</div><div class='add'>+        memcpy(buf, linkval, ret);</div><div class='add'>+        GF_FREE(linkval);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ESTALE_RETRY(ret, errno, reval, &amp;loc, retry);</div><div class='add'>+out:</div><div class='add'>+    loc_wipe(&amp;loc);</div><div class='add'>+</div><div class='add'>+    glfs_subvol_done(fs, subvol);</div><div class='add'>+</div><div class='add'>+    __GLFS_EXIT_FS;</div><div class='add'>+</div><div class='add'>+invalid_fs:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_mknod, 3.4.0)</div><div class='add'>+int</div><div class='add'>+pub_glfs_mknod(struct glfs *fs, const char *path, mode_t mode, dev_t dev)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    xlator_t *subvol = NULL;</div><div class='add'>+    loc_t loc = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    struct iatt iatt = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    uuid_t gfid;</div><div class='add'>+    dict_t *xattr_req = NULL;</div><div class='add'>+    int reval = 0;</div><div class='add'>+</div><div class='add'>+    DECLARE_OLD_THIS;</div><div class='add'>+    __GLFS_ENTRY_VALIDATE_FS(fs, invalid_fs);</div><div class='add'>+</div><div class='add'>+    subvol = glfs_active_subvol(fs);</div><div class='add'>+    if (!subvol) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        errno = EIO;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    xattr_req = dict_new();</div><div class='add'>+    if (!xattr_req) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        errno = ENOMEM;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    gf_uuid_generate(gfid);</div><div class='add'>+    ret = dict_set_gfuuid(xattr_req, "gfid-req", gfid, true);</div><div class='add'>+    if (ret) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        errno = ENOMEM;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+retry:</div><div class='add'>+    ret = glfs_lresolve(fs, subvol, path, &amp;loc, &amp;iatt, reval);</div><div class='add'>+</div><div class='add'>+    ESTALE_RETRY(ret, errno, reval, &amp;loc, retry);</div><div class='add'>+</div><div class='add'>+    if (loc.inode) {</div><div class='add'>+        errno = EEXIST;</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (ret == -1 &amp;&amp; errno != ENOENT)</div><div class='add'>+        /* Any other type of error is fatal */</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    if (ret == -1 &amp;&amp; errno == ENOENT &amp;&amp; !loc.parent)</div><div class='add'>+        /* The parent directory or an ancestor even</div><div class='add'>+           higher does not exist</div><div class='add'>+        */</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    /* ret == -1 &amp;&amp; errno == ENOENT */</div><div class='add'>+    loc.inode = inode_new(loc.parent-&gt;table);</div><div class='add'>+    if (!loc.inode) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        errno = ENOMEM;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = syncop_mknod(subvol, &amp;loc, mode, dev, &amp;iatt, xattr_req, NULL);</div><div class='add'>+    DECODE_SYNCOP_ERR(ret);</div><div class='add'>+</div><div class='add'>+    ESTALE_RETRY(ret, errno, reval, &amp;loc, retry);</div><div class='add'>+</div><div class='add'>+    if (ret == 0)</div><div class='add'>+        ret = glfs_loc_link(&amp;loc, &amp;iatt);</div><div class='add'>+out:</div><div class='add'>+    loc_wipe(&amp;loc);</div><div class='add'>+</div><div class='add'>+    if (xattr_req)</div><div class='add'>+        dict_unref(xattr_req);</div><div class='add'>+</div><div class='add'>+    glfs_subvol_done(fs, subvol);</div><div class='add'>+</div><div class='add'>+    __GLFS_EXIT_FS;</div><div class='add'>+</div><div class='add'>+invalid_fs:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_mkdir, 3.4.0)</div><div class='add'>+int</div><div class='add'>+pub_glfs_mkdir(struct glfs *fs, const char *path, mode_t mode)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    xlator_t *subvol = NULL;</div><div class='add'>+    loc_t loc = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    struct iatt iatt = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    uuid_t gfid;</div><div class='add'>+    dict_t *xattr_req = NULL;</div><div class='add'>+    int reval = 0;</div><div class='add'>+</div><div class='add'>+    DECLARE_OLD_THIS;</div><div class='add'>+    __GLFS_ENTRY_VALIDATE_FS(fs, invalid_fs);</div><div class='add'>+</div><div class='add'>+    subvol = glfs_active_subvol(fs);</div><div class='add'>+    if (!subvol) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        errno = EIO;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    xattr_req = dict_new();</div><div class='add'>+    if (!xattr_req) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        errno = ENOMEM;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    gf_uuid_generate(gfid);</div><div class='add'>+    ret = dict_set_gfuuid(xattr_req, "gfid-req", gfid, true);</div><div class='add'>+    if (ret) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        errno = ENOMEM;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+retry:</div><div class='add'>+    ret = glfs_lresolve(fs, subvol, path, &amp;loc, &amp;iatt, reval);</div><div class='add'>+</div><div class='add'>+    ESTALE_RETRY(ret, errno, reval, &amp;loc, retry);</div><div class='add'>+</div><div class='add'>+    if (loc.inode) {</div><div class='add'>+        errno = EEXIST;</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (ret == -1 &amp;&amp; errno != ENOENT)</div><div class='add'>+        /* Any other type of error is fatal */</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    if (ret == -1 &amp;&amp; errno == ENOENT &amp;&amp; !loc.parent)</div><div class='add'>+        /* The parent directory or an ancestor even</div><div class='add'>+           higher does not exist</div><div class='add'>+        */</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    /* ret == -1 &amp;&amp; errno == ENOENT */</div><div class='add'>+    loc.inode = inode_new(loc.parent-&gt;table);</div><div class='add'>+    if (!loc.inode) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        errno = ENOMEM;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = syncop_mkdir(subvol, &amp;loc, mode, &amp;iatt, xattr_req, NULL);</div><div class='add'>+    DECODE_SYNCOP_ERR(ret);</div><div class='add'>+</div><div class='add'>+    ESTALE_RETRY(ret, errno, reval, &amp;loc, retry);</div><div class='add'>+</div><div class='add'>+    if (ret == 0)</div><div class='add'>+        ret = glfs_loc_link(&amp;loc, &amp;iatt);</div><div class='add'>+out:</div><div class='add'>+    loc_wipe(&amp;loc);</div><div class='add'>+</div><div class='add'>+    if (xattr_req)</div><div class='add'>+        dict_unref(xattr_req);</div><div class='add'>+</div><div class='add'>+    glfs_subvol_done(fs, subvol);</div><div class='add'>+</div><div class='add'>+    __GLFS_EXIT_FS;</div><div class='add'>+</div><div class='add'>+invalid_fs:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_unlink, 3.4.0)</div><div class='add'>+int</div><div class='add'>+pub_glfs_unlink(struct glfs *fs, const char *path)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    xlator_t *subvol = NULL;</div><div class='add'>+    loc_t loc = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    struct iatt iatt = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int reval = 0;</div><div class='add'>+</div><div class='add'>+    DECLARE_OLD_THIS;</div><div class='add'>+    __GLFS_ENTRY_VALIDATE_FS(fs, invalid_fs);</div><div class='add'>+</div><div class='add'>+    subvol = glfs_active_subvol(fs);</div><div class='add'>+    if (!subvol) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        errno = EIO;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+retry:</div><div class='add'>+    ret = glfs_lresolve(fs, subvol, path, &amp;loc, &amp;iatt, reval);</div><div class='add'>+</div><div class='add'>+    ESTALE_RETRY(ret, errno, reval, &amp;loc, retry);</div><div class='add'>+</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    if (iatt.ia_type == IA_IFDIR) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        errno = EISDIR;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* TODO: Add leaseid */</div><div class='add'>+    ret = syncop_unlink(subvol, &amp;loc, NULL, NULL);</div><div class='add'>+    DECODE_SYNCOP_ERR(ret);</div><div class='add'>+</div><div class='add'>+    ESTALE_RETRY(ret, errno, reval, &amp;loc, retry);</div><div class='add'>+</div><div class='add'>+    if (ret == 0)</div><div class='add'>+        ret = glfs_loc_unlink(&amp;loc);</div><div class='add'>+out:</div><div class='add'>+    loc_wipe(&amp;loc);</div><div class='add'>+</div><div class='add'>+    glfs_subvol_done(fs, subvol);</div><div class='add'>+</div><div class='add'>+    __GLFS_EXIT_FS;</div><div class='add'>+</div><div class='add'>+invalid_fs:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_rmdir, 3.4.0)</div><div class='add'>+int</div><div class='add'>+pub_glfs_rmdir(struct glfs *fs, const char *path)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    xlator_t *subvol = NULL;</div><div class='add'>+    loc_t loc = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    struct iatt iatt = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int reval = 0;</div><div class='add'>+</div><div class='add'>+    DECLARE_OLD_THIS;</div><div class='add'>+    __GLFS_ENTRY_VALIDATE_FS(fs, invalid_fs);</div><div class='add'>+</div><div class='add'>+    subvol = glfs_active_subvol(fs);</div><div class='add'>+    if (!subvol) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        errno = EIO;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+retry:</div><div class='add'>+    ret = glfs_lresolve(fs, subvol, path, &amp;loc, &amp;iatt, reval);</div><div class='add'>+</div><div class='add'>+    ESTALE_RETRY(ret, errno, reval, &amp;loc, retry);</div><div class='add'>+</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    if (iatt.ia_type != IA_IFDIR) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        errno = ENOTDIR;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = syncop_rmdir(subvol, &amp;loc, 0, NULL, NULL);</div><div class='add'>+    DECODE_SYNCOP_ERR(ret);</div><div class='add'>+</div><div class='add'>+    ESTALE_RETRY(ret, errno, reval, &amp;loc, retry);</div><div class='add'>+</div><div class='add'>+    if (ret == 0)</div><div class='add'>+        ret = glfs_loc_unlink(&amp;loc);</div><div class='add'>+out:</div><div class='add'>+    loc_wipe(&amp;loc);</div><div class='add'>+</div><div class='add'>+    glfs_subvol_done(fs, subvol);</div><div class='add'>+</div><div class='add'>+    __GLFS_EXIT_FS;</div><div class='add'>+</div><div class='add'>+invalid_fs:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_rename, 3.4.0)</div><div class='add'>+int</div><div class='add'>+pub_glfs_rename(struct glfs *fs, const char *oldpath, const char *newpath)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    xlator_t *subvol = NULL;</div><div class='add'>+    loc_t oldloc = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    loc_t newloc = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    struct iatt oldiatt = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    struct iatt newiatt = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int reval = 0;</div><div class='add'>+</div><div class='add'>+    DECLARE_OLD_THIS;</div><div class='add'>+    __GLFS_ENTRY_VALIDATE_FS(fs, invalid_fs);</div><div class='add'>+</div><div class='add'>+    subvol = glfs_active_subvol(fs);</div><div class='add'>+    if (!subvol) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        errno = EIO;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+retry:</div><div class='add'>+    ret = glfs_lresolve(fs, subvol, oldpath, &amp;oldloc, &amp;oldiatt, reval);</div><div class='add'>+</div><div class='add'>+    ESTALE_RETRY(ret, errno, reval, &amp;oldloc, retry);</div><div class='add'>+</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+retrynew:</div><div class='add'>+    ret = glfs_lresolve(fs, subvol, newpath, &amp;newloc, &amp;newiatt, reval);</div><div class='add'>+</div><div class='add'>+    ESTALE_RETRY(ret, errno, reval, &amp;newloc, retrynew);</div><div class='add'>+</div><div class='add'>+    if (ret &amp;&amp; errno != ENOENT &amp;&amp; newloc.parent)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    if (newiatt.ia_type != IA_INVAL) {</div><div class='add'>+        if ((oldiatt.ia_type == IA_IFDIR) != (newiatt.ia_type == IA_IFDIR)) {</div><div class='add'>+            /* Either both old and new must be dirs,</div><div class='add'>+             * or both must be non-dirs. Else, fail.</div><div class='add'>+             */</div><div class='add'>+            ret = -1;</div><div class='add'>+            errno = EISDIR;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* TODO: - check if new or old is a prefix of the other, and fail EINVAL</div><div class='add'>+     *       - Add leaseid */</div><div class='add'>+</div><div class='add'>+    ret = syncop_rename(subvol, &amp;oldloc, &amp;newloc, NULL, NULL);</div><div class='add'>+    DECODE_SYNCOP_ERR(ret);</div><div class='add'>+</div><div class='add'>+    if (ret == -1 &amp;&amp; errno == ESTALE) {</div><div class='add'>+        if (reval &lt; DEFAULT_REVAL_COUNT) {</div><div class='add'>+            reval++;</div><div class='add'>+            loc_wipe(&amp;oldloc);</div><div class='add'>+            loc_wipe(&amp;newloc);</div><div class='add'>+            goto retry;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (ret == 0) {</div><div class='add'>+        inode_rename(oldloc.parent-&gt;table, oldloc.parent, oldloc.name,</div><div class='add'>+                     newloc.parent, newloc.name, oldloc.inode, &amp;oldiatt);</div><div class='add'>+</div><div class='add'>+        if (newloc.inode &amp;&amp; !inode_has_dentry(newloc.inode))</div><div class='add'>+            inode_forget(newloc.inode, 0);</div><div class='add'>+    }</div><div class='add'>+out:</div><div class='add'>+    loc_wipe(&amp;oldloc);</div><div class='add'>+    loc_wipe(&amp;newloc);</div><div class='add'>+</div><div class='add'>+    glfs_subvol_done(fs, subvol);</div><div class='add'>+</div><div class='add'>+    __GLFS_EXIT_FS;</div><div class='add'>+</div><div class='add'>+invalid_fs:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_link, 3.4.0)</div><div class='add'>+int</div><div class='add'>+pub_glfs_link(struct glfs *fs, const char *oldpath, const char *newpath)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    xlator_t *subvol = NULL;</div><div class='add'>+    loc_t oldloc = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    loc_t newloc = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    struct iatt oldiatt = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    struct iatt newiatt = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int reval = 0;</div><div class='add'>+</div><div class='add'>+    DECLARE_OLD_THIS;</div><div class='add'>+    __GLFS_ENTRY_VALIDATE_FS(fs, invalid_fs);</div><div class='add'>+</div><div class='add'>+    subvol = glfs_active_subvol(fs);</div><div class='add'>+    if (!subvol) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        errno = EIO;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+retry:</div><div class='add'>+    ret = glfs_lresolve(fs, subvol, oldpath, &amp;oldloc, &amp;oldiatt, reval);</div><div class='add'>+</div><div class='add'>+    ESTALE_RETRY(ret, errno, reval, &amp;oldloc, retry);</div><div class='add'>+</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+retrynew:</div><div class='add'>+    ret = glfs_lresolve(fs, subvol, newpath, &amp;newloc, &amp;newiatt, reval);</div><div class='add'>+</div><div class='add'>+    ESTALE_RETRY(ret, errno, reval, &amp;newloc, retrynew);</div><div class='add'>+</div><div class='add'>+    if (ret == 0) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        errno = EEXIST;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (oldiatt.ia_type == IA_IFDIR) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        errno = EISDIR;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Filling the inode of the hard link to be same as that of the</div><div class='add'>+       original file</div><div class='add'>+    */</div><div class='add'>+    if (newloc.inode) {</div><div class='add'>+        inode_unref(newloc.inode);</div><div class='add'>+        newloc.inode = NULL;</div><div class='add'>+    }</div><div class='add'>+    newloc.inode = inode_ref(oldloc.inode);</div><div class='add'>+</div><div class='add'>+    ret = syncop_link(subvol, &amp;oldloc, &amp;newloc, &amp;newiatt, NULL, NULL);</div><div class='add'>+    DECODE_SYNCOP_ERR(ret);</div><div class='add'>+</div><div class='add'>+    if (ret == -1 &amp;&amp; errno == ESTALE) {</div><div class='add'>+        loc_wipe(&amp;oldloc);</div><div class='add'>+        loc_wipe(&amp;newloc);</div><div class='add'>+        if (reval--)</div><div class='add'>+            goto retry;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (ret == 0)</div><div class='add'>+        ret = glfs_loc_link(&amp;newloc, &amp;newiatt);</div><div class='add'>+out:</div><div class='add'>+    loc_wipe(&amp;oldloc);</div><div class='add'>+    loc_wipe(&amp;newloc);</div><div class='add'>+</div><div class='add'>+    glfs_subvol_done(fs, subvol);</div><div class='add'>+</div><div class='add'>+    __GLFS_EXIT_FS;</div><div class='add'>+</div><div class='add'>+invalid_fs:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_opendir, 3.4.0)</div><div class='add'>+struct glfs_fd *</div><div class='add'>+pub_glfs_opendir(struct glfs *fs, const char *path)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    struct glfs_fd *glfd = NULL;</div><div class='add'>+    xlator_t *subvol = NULL;</div><div class='add'>+    loc_t loc = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    struct iatt iatt = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int reval = 0;</div><div class='add'>+</div><div class='add'>+    DECLARE_OLD_THIS;</div><div class='add'>+    __GLFS_ENTRY_VALIDATE_FS(fs, invalid_fs);</div><div class='add'>+</div><div class='add'>+    subvol = glfs_active_subvol(fs);</div><div class='add'>+    if (!subvol) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        errno = EIO;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    glfd = glfs_fd_new(fs);</div><div class='add'>+    if (!glfd)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    INIT_LIST_HEAD(&amp;glfd-&gt;entries);</div><div class='add'>+retry:</div><div class='add'>+    ret = glfs_resolve(fs, subvol, path, &amp;loc, &amp;iatt, reval);</div><div class='add'>+</div><div class='add'>+    ESTALE_RETRY(ret, errno, reval, &amp;loc, retry);</div><div class='add'>+</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    if (!IA_ISDIR(iatt.ia_type)) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        errno = ENOTDIR;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (glfd-&gt;fd) {</div><div class='add'>+        /* Retry. Safe to touch glfd-&gt;fd as we</div><div class='add'>+           still have not glfs_fd_bind() yet.</div><div class='add'>+        */</div><div class='add'>+        fd_unref(glfd-&gt;fd);</div><div class='add'>+        glfd-&gt;fd = NULL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    glfd-&gt;fd = fd_create(loc.inode, getpid());</div><div class='add'>+    if (!glfd-&gt;fd) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        errno = ENOMEM;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = syncop_opendir(subvol, &amp;loc, glfd-&gt;fd, NULL, NULL);</div><div class='add'>+    DECODE_SYNCOP_ERR(ret);</div><div class='add'>+</div><div class='add'>+    ESTALE_RETRY(ret, errno, reval, &amp;loc, retry);</div><div class='add'>+out:</div><div class='add'>+    loc_wipe(&amp;loc);</div><div class='add'>+</div><div class='add'>+    if (ret &amp;&amp; glfd) {</div><div class='add'>+        GF_REF_PUT(glfd);</div><div class='add'>+        glfd = NULL;</div><div class='add'>+    } else if (glfd) {</div><div class='add'>+        glfd_set_state_bind(glfd);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    glfs_subvol_done(fs, subvol);</div><div class='add'>+</div><div class='add'>+    __GLFS_EXIT_FS;</div><div class='add'>+</div><div class='add'>+invalid_fs:</div><div class='add'>+    return glfd;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_closedir, 3.4.0)</div><div class='add'>+int</div><div class='add'>+pub_glfs_closedir(struct glfs_fd *glfd)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    DECLARE_OLD_THIS;</div><div class='add'>+    __GLFS_ENTRY_VALIDATE_FD(glfd, invalid_fs);</div><div class='add'>+</div><div class='add'>+    gf_dirent_free(list_entry(&amp;glfd-&gt;entries, gf_dirent_t, list));</div><div class='add'>+</div><div class='add'>+    glfs_mark_glfd_for_deletion(glfd);</div><div class='add'>+</div><div class='add'>+    __GLFS_EXIT_FS;</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+</div><div class='add'>+invalid_fs:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_telldir, 3.4.0)</div><div class='add'>+long</div><div class='add'>+pub_glfs_telldir(struct glfs_fd *fd)</div><div class='add'>+{</div><div class='add'>+    if (fd == NULL) {</div><div class='add'>+        errno = EBADF;</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return fd-&gt;offset;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_seekdir, 3.4.0)</div><div class='add'>+void</div><div class='add'>+pub_glfs_seekdir(struct glfs_fd *fd, long offset)</div><div class='add'>+{</div><div class='add'>+    gf_dirent_t *entry = NULL;</div><div class='add'>+    gf_dirent_t *tmp = NULL;</div><div class='add'>+</div><div class='add'>+    if (fd == NULL) {</div><div class='add'>+        errno = EBADF;</div><div class='add'>+        return;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (fd-&gt;offset == offset)</div><div class='add'>+        return;</div><div class='add'>+</div><div class='add'>+    fd-&gt;offset = offset;</div><div class='add'>+    fd-&gt;next = NULL;</div><div class='add'>+</div><div class='add'>+    list_for_each_entry_safe(entry, tmp, &amp;fd-&gt;entries, list)</div><div class='add'>+    {</div><div class='add'>+        if (entry-&gt;d_off != offset)</div><div class='add'>+            continue;</div><div class='add'>+</div><div class='add'>+        if (&amp;tmp-&gt;list != &amp;fd-&gt;entries) {</div><div class='add'>+            /* found! */</div><div class='add'>+            fd-&gt;next = tmp;</div><div class='add'>+            return;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    /* could not find entry at requested offset in the cache.</div><div class='add'>+       next readdir_r() will result in glfd_entry_refresh()</div><div class='add'>+    */</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+glfs_discard_async_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                       int32_t op_ret, int32_t op_errno,</div><div class='add'>+                       struct iatt *preop_stbuf, struct iatt *postop_stbuf,</div><div class='add'>+                       dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    glfs_io_async_cbk(op_ret, op_errno, frame, cookie, NULL, 0, preop_stbuf,</div><div class='add'>+                      postop_stbuf);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+glfs_discard_async_common(struct glfs_fd *glfd, off_t offset, size_t len,</div><div class='add'>+                          gf_boolean_t oldcb, glfs_io_cbk fn, void *data)</div><div class='add'>+{</div><div class='add'>+    struct glfs_io *gio = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    call_frame_t *frame = NULL;</div><div class='add'>+    xlator_t *subvol = NULL;</div><div class='add'>+    fd_t *fd = NULL;</div><div class='add'>+    dict_t *fop_attr = NULL;</div><div class='add'>+</div><div class='add'>+    DECLARE_OLD_THIS;</div><div class='add'>+    __GLFS_ENTRY_VALIDATE_FD(glfd, invalid_fs);</div><div class='add'>+</div><div class='add'>+    /* Need to take explicit ref so that the fd</div><div class='add'>+     * is not destroyed before the fop is complete</div><div class='add'>+     */</div><div class='add'>+    GF_REF_GET(glfd);</div><div class='add'>+</div><div class='add'>+    subvol = glfs_active_subvol(glfd-&gt;fs);</div><div class='add'>+    if (!subvol) {</div><div class='add'>+        errno = EIO;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    fd = glfs_resolve_fd(glfd-&gt;fs, subvol, glfd);</div><div class='add'>+    if (!fd) {</div><div class='add'>+        errno = EBADFD;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    frame = syncop_create_frame(THIS);</div><div class='add'>+    if (!frame) {</div><div class='add'>+        errno = ENOMEM;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    gio = GF_CALLOC(1, sizeof(*gio), glfs_mt_glfs_io_t);</div><div class='add'>+    if (!gio) {</div><div class='add'>+        errno = ENOMEM;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    gio-&gt;op = GF_FOP_DISCARD;</div><div class='add'>+    gio-&gt;glfd = glfd;</div><div class='add'>+    gio-&gt;offset = offset;</div><div class='add'>+    gio-&gt;count = len;</div><div class='add'>+    gio-&gt;oldcb = oldcb;</div><div class='add'>+    gio-&gt;fn = fn;</div><div class='add'>+    gio-&gt;data = data;</div><div class='add'>+</div><div class='add'>+    frame-&gt;local = gio;</div><div class='add'>+    ret = get_fop_attr_thrd_key(&amp;fop_attr);</div><div class='add'>+    if (ret)</div><div class='add'>+        gf_msg_debug("gfapi", 0, "Getting leaseid from thread failed");</div><div class='add'>+</div><div class='add'>+    STACK_WIND_COOKIE(frame, glfs_discard_async_cbk, subvol, subvol,</div><div class='add'>+                      subvol-&gt;fops-&gt;discard, fd, offset, len, fop_attr);</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+out:</div><div class='add'>+    if (ret) {</div><div class='add'>+        if (fd)</div><div class='add'>+            fd_unref(fd);</div><div class='add'>+        if (glfd)</div><div class='add'>+            GF_REF_PUT(glfd);</div><div class='add'>+        GF_FREE(gio);</div><div class='add'>+        if (frame)</div><div class='add'>+            STACK_DESTROY(frame-&gt;root);</div><div class='add'>+        glfs_subvol_done(glfd-&gt;fs, subvol);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    __GLFS_EXIT_FS;</div><div class='add'>+</div><div class='add'>+invalid_fs:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+GFAPI_SYMVER_PUBLIC(glfs_discard_async35, glfs_discard_async, 3.5.0)</div><div class='add'>+int</div><div class='add'>+pub_glfs_discard_async35(struct glfs_fd *glfd, off_t offset, size_t len,</div><div class='add'>+                         glfs_io_cbk34 fn, void *data)</div><div class='add'>+{</div><div class='add'>+    return glfs_discard_async_common(glfd, offset, len, _gf_true, (void *)fn,</div><div class='add'>+                                     data);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_discard_async, 6.0)</div><div class='add'>+int</div><div class='add'>+pub_glfs_discard_async(struct glfs_fd *glfd, off_t offset, size_t len,</div><div class='add'>+                       glfs_io_cbk fn, void *data)</div><div class='add'>+{</div><div class='add'>+    return glfs_discard_async_common(glfd, offset, len, _gf_false, fn, data);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+glfs_zerofill_async_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                        int32_t op_ret, int32_t op_errno,</div><div class='add'>+                        struct iatt *preop_stbuf, struct iatt *postop_stbuf,</div><div class='add'>+                        dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    glfs_io_async_cbk(op_ret, op_errno, frame, cookie, NULL, 0, preop_stbuf,</div><div class='add'>+                      postop_stbuf);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+glfs_zerofill_async_common(struct glfs_fd *glfd, off_t offset, off_t len,</div><div class='add'>+                           gf_boolean_t oldcb, glfs_io_cbk fn, void *data)</div><div class='add'>+{</div><div class='add'>+    struct glfs_io *gio = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    call_frame_t *frame = NULL;</div><div class='add'>+    xlator_t *subvol = NULL;</div><div class='add'>+    fd_t *fd = NULL;</div><div class='add'>+    dict_t *fop_attr = NULL;</div><div class='add'>+</div><div class='add'>+    DECLARE_OLD_THIS;</div><div class='add'>+    __GLFS_ENTRY_VALIDATE_FD(glfd, invalid_fs);</div><div class='add'>+</div><div class='add'>+    /* Need to take explicit ref so that the fd</div><div class='add'>+     * is not destroyed before the fop is complete</div><div class='add'>+     */</div><div class='add'>+    GF_REF_GET(glfd);</div><div class='add'>+</div><div class='add'>+    subvol = glfs_active_subvol(glfd-&gt;fs);</div><div class='add'>+    if (!subvol) {</div><div class='add'>+        errno = EIO;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    fd = glfs_resolve_fd(glfd-&gt;fs, subvol, glfd);</div><div class='add'>+    if (!fd) {</div><div class='add'>+        errno = EBADFD;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    frame = syncop_create_frame(THIS);</div><div class='add'>+    if (!frame) {</div><div class='add'>+        errno = ENOMEM;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    gio = GF_CALLOC(1, sizeof(*gio), glfs_mt_glfs_io_t);</div><div class='add'>+    if (!gio) {</div><div class='add'>+        errno = ENOMEM;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    gio-&gt;op = GF_FOP_ZEROFILL;</div><div class='add'>+    gio-&gt;glfd = glfd;</div><div class='add'>+    gio-&gt;offset = offset;</div><div class='add'>+    gio-&gt;count = len;</div><div class='add'>+    gio-&gt;oldcb = oldcb;</div><div class='add'>+    gio-&gt;fn = fn;</div><div class='add'>+    gio-&gt;data = data;</div><div class='add'>+</div><div class='add'>+    frame-&gt;local = gio;</div><div class='add'>+</div><div class='add'>+    ret = get_fop_attr_thrd_key(&amp;fop_attr);</div><div class='add'>+    if (ret)</div><div class='add'>+        gf_msg_debug("gfapi", 0, "Getting leaseid from thread failed");</div><div class='add'>+</div><div class='add'>+    STACK_WIND_COOKIE(frame, glfs_zerofill_async_cbk, subvol, subvol,</div><div class='add'>+                      subvol-&gt;fops-&gt;zerofill, fd, offset, len, fop_attr);</div><div class='add'>+    ret = 0;</div><div class='add'>+out:</div><div class='add'>+    if (ret) {</div><div class='add'>+        if (fd)</div><div class='add'>+            fd_unref(fd);</div><div class='add'>+        if (glfd)</div><div class='add'>+            GF_REF_PUT(glfd);</div><div class='add'>+        GF_FREE(gio);</div><div class='add'>+        if (frame)</div><div class='add'>+            STACK_DESTROY(frame-&gt;root);</div><div class='add'>+        glfs_subvol_done(glfd-&gt;fs, subvol);</div><div class='add'>+    }</div><div class='add'>+    if (fop_attr)</div><div class='add'>+        dict_unref(fop_attr);</div><div class='add'>+</div><div class='add'>+    __GLFS_EXIT_FS;</div><div class='add'>+</div><div class='add'>+invalid_fs:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+GFAPI_SYMVER_PUBLIC(glfs_zerofill_async35, glfs_zerofill_async, 3.5.0)</div><div class='add'>+int</div><div class='add'>+pub_glfs_zerofill_async35(struct glfs_fd *glfd, off_t offset, off_t len,</div><div class='add'>+                          glfs_io_cbk34 fn, void *data)</div><div class='add'>+{</div><div class='add'>+    return glfs_zerofill_async_common(glfd, offset, len, _gf_true, (void *)fn,</div><div class='add'>+                                      data);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_zerofill_async, 6.0)</div><div class='add'>+int</div><div class='add'>+pub_glfs_zerofill_async(struct glfs_fd *glfd, off_t offset, off_t len,</div><div class='add'>+                        glfs_io_cbk fn, void *data)</div><div class='add'>+{</div><div class='add'>+    return glfs_zerofill_async_common(glfd, offset, len, _gf_false, fn, data);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+gf_dirent_to_dirent(gf_dirent_t *gf_dirent, struct dirent *dirent)</div><div class='add'>+{</div><div class='add'>+    dirent-&gt;d_ino = gf_dirent-&gt;d_ino;</div><div class='add'>+</div><div class='add'>+#ifdef _DIRENT_HAVE_D_OFF</div><div class='add'>+    dirent-&gt;d_off = gf_dirent-&gt;d_off;</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#ifdef _DIRENT_HAVE_D_TYPE</div><div class='add'>+    dirent-&gt;d_type = gf_dirent-&gt;d_type;</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#ifdef _DIRENT_HAVE_D_NAMLEN</div><div class='add'>+    dirent-&gt;d_namlen = strlen(gf_dirent-&gt;d_name);</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+    snprintf(dirent-&gt;d_name, NAME_MAX + 1, "%s", gf_dirent-&gt;d_name);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+glfd_entry_refresh(struct glfs_fd *glfd, int plus)</div><div class='add'>+{</div><div class='add'>+    xlator_t *subvol = NULL;</div><div class='add'>+    gf_dirent_t entries;</div><div class='add'>+    gf_dirent_t old;</div><div class='add'>+    gf_dirent_t *entry = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    fd_t *fd = NULL;</div><div class='add'>+</div><div class='add'>+    subvol = glfs_active_subvol(glfd-&gt;fs);</div><div class='add'>+    if (!subvol) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        errno = EIO;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    fd = glfs_resolve_fd(glfd-&gt;fs, subvol, glfd);</div><div class='add'>+    if (!fd) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        errno = EBADFD;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (fd-&gt;inode-&gt;ia_type != IA_IFDIR) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        errno = EBADF;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    INIT_LIST_HEAD(&amp;entries.list);</div><div class='add'>+    INIT_LIST_HEAD(&amp;old.list);</div><div class='add'>+</div><div class='add'>+    if (plus)</div><div class='add'>+        ret = syncop_readdirp(subvol, fd, 131072, glfd-&gt;offset, &amp;entries, NULL,</div><div class='add'>+                              NULL);</div><div class='add'>+    else</div><div class='add'>+        ret = syncop_readdir(subvol, fd, 131072, glfd-&gt;offset, &amp;entries, NULL,</div><div class='add'>+                             NULL);</div><div class='add'>+    DECODE_SYNCOP_ERR(ret);</div><div class='add'>+    if (ret &gt;= 0) {</div><div class='add'>+        if (plus) {</div><div class='add'>+            list_for_each_entry(entry, &amp;entries.list, list)</div><div class='add'>+            {</div><div class='add'>+                if ((!entry-&gt;inode &amp;&amp; (!IA_ISDIR(entry-&gt;d_stat.ia_type))) ||</div><div class='add'>+                    ((entry-&gt;d_stat.ia_ctime == 0) &amp;&amp;</div><div class='add'>+                     strcmp(entry-&gt;d_name, ".") &amp;&amp;</div><div class='add'>+                     strcmp(entry-&gt;d_name, ".."))) {</div><div class='add'>+                    /* entry-&gt;inode for directories will be</div><div class='add'>+                     * always set to null to force a lookup</div><div class='add'>+                     * on the dentry. Hence to not degrade</div><div class='add'>+                     * readdir performance, we skip lookups</div><div class='add'>+                     * for directory entries. Also we will have</div><div class='add'>+                     * proper stat if directory present on</div><div class='add'>+                     * hashed subvolume.</div><div class='add'>+                     *</div><div class='add'>+                     * In addition, if the stat is invalid, force</div><div class='add'>+                     * lookup to fetch proper stat.</div><div class='add'>+                     */</div><div class='add'>+                    gf_fill_iatt_for_dirent(entry, fd-&gt;inode, subvol);</div><div class='add'>+                }</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            gf_link_inodes_from_dirent(THIS, fd-&gt;inode, &amp;entries);</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        list_splice_init(&amp;glfd-&gt;entries, &amp;old.list);</div><div class='add'>+        list_splice_init(&amp;entries.list, &amp;glfd-&gt;entries);</div><div class='add'>+</div><div class='add'>+        /* spurious errno is dangerous for glfd_entry_next() */</div><div class='add'>+        errno = 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (ret &gt; 0)</div><div class='add'>+        glfd-&gt;next = list_entry(glfd-&gt;entries.next, gf_dirent_t, list);</div><div class='add'>+</div><div class='add'>+    gf_dirent_free(&amp;old);</div><div class='add'>+out:</div><div class='add'>+    if (fd)</div><div class='add'>+        fd_unref(fd);</div><div class='add'>+</div><div class='add'>+    glfs_subvol_done(glfd-&gt;fs, subvol);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+gf_dirent_t *</div><div class='add'>+glfd_entry_next(struct glfs_fd *glfd, int plus)</div><div class='add'>+{</div><div class='add'>+    gf_dirent_t *entry = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    if (!glfd-&gt;offset || !glfd-&gt;next) {</div><div class='add'>+        ret = glfd_entry_refresh(glfd, plus);</div><div class='add'>+        if (ret &lt; 0)</div><div class='add'>+            return NULL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    entry = glfd-&gt;next;</div><div class='add'>+    if (!entry)</div><div class='add'>+        return NULL;</div><div class='add'>+</div><div class='add'>+    if (&amp;entry-&gt;next-&gt;list == &amp;glfd-&gt;entries)</div><div class='add'>+        glfd-&gt;next = NULL;</div><div class='add'>+    else</div><div class='add'>+        glfd-&gt;next = entry-&gt;next;</div><div class='add'>+</div><div class='add'>+    glfd-&gt;offset = entry-&gt;d_off;</div><div class='add'>+</div><div class='add'>+    return entry;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+struct dirent *</div><div class='add'>+glfs_readdirbuf_get(struct glfs_fd *glfd)</div><div class='add'>+{</div><div class='add'>+    struct dirent *buf = NULL;</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;glfd-&gt;fd-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        buf = glfd-&gt;readdirbuf;</div><div class='add'>+        if (buf) {</div><div class='add'>+            memset(buf, 0, READDIRBUF_SIZE);</div><div class='add'>+            goto unlock;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        buf = GF_CALLOC(1, READDIRBUF_SIZE, glfs_mt_readdirbuf_t);</div><div class='add'>+        if (!buf) {</div><div class='add'>+            errno = ENOMEM;</div><div class='add'>+            goto unlock;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        glfd-&gt;readdirbuf = buf;</div><div class='add'>+    }</div><div class='add'>+unlock:</div><div class='add'>+    UNLOCK(&amp;glfd-&gt;fd-&gt;lock);</div><div class='add'>+</div><div class='add'>+    return buf;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_readdirplus_r, 3.4.0)</div><div class='add'>+int</div><div class='add'>+pub_glfs_readdirplus_r(struct glfs_fd *glfd, struct stat *stat,</div><div class='add'>+                       struct dirent *ext, struct dirent **res)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+    gf_dirent_t *entry = NULL;</div><div class='add'>+    struct dirent *buf = NULL;</div><div class='add'>+</div><div class='add'>+    DECLARE_OLD_THIS;</div><div class='add'>+    __GLFS_ENTRY_VALIDATE_FD(glfd, invalid_fs);</div><div class='add'>+</div><div class='add'>+    GF_REF_GET(glfd);</div><div class='add'>+</div><div class='add'>+    errno = 0;</div><div class='add'>+</div><div class='add'>+    if (ext)</div><div class='add'>+        buf = ext;</div><div class='add'>+    else</div><div class='add'>+        buf = glfs_readdirbuf_get(glfd);</div><div class='add'>+</div><div class='add'>+    if (!buf) {</div><div class='add'>+        errno = ENOMEM;</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    entry = glfd_entry_next(glfd, !!stat);</div><div class='add'>+    if (errno)</div><div class='add'>+        ret = -1;</div><div class='add'>+</div><div class='add'>+    if (res) {</div><div class='add'>+        if (entry)</div><div class='add'>+            *res = buf;</div><div class='add'>+        else</div><div class='add'>+            *res = NULL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (entry) {</div><div class='add'>+        gf_dirent_to_dirent(entry, buf);</div><div class='add'>+        if (stat)</div><div class='add'>+            glfs_iatt_to_stat(glfd-&gt;fs, &amp;entry-&gt;d_stat, stat);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (glfd)</div><div class='add'>+        GF_REF_PUT(glfd);</div><div class='add'>+</div><div class='add'>+    __GLFS_EXIT_FS;</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+</div><div class='add'>+invalid_fs:</div><div class='add'>+    return -1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_readdir_r, 3.4.0)</div><div class='add'>+int</div><div class='add'>+pub_glfs_readdir_r(struct glfs_fd *glfd, struct dirent *buf,</div><div class='add'>+                   struct dirent **res)</div><div class='add'>+{</div><div class='add'>+    return pub_glfs_readdirplus_r(glfd, 0, buf, res);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_readdirplus, 3.5.0)</div><div class='add'>+struct dirent *</div><div class='add'>+pub_glfs_readdirplus(struct glfs_fd *glfd, struct stat *stat)</div><div class='add'>+{</div><div class='add'>+    struct dirent *res = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    ret = pub_glfs_readdirplus_r(glfd, stat, NULL, &amp;res);</div><div class='add'>+    if (ret)</div><div class='add'>+        return NULL;</div><div class='add'>+</div><div class='add'>+    return res;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_readdir, 3.5.0)</div><div class='add'>+struct dirent *</div><div class='add'>+pub_glfs_readdir(struct glfs_fd *glfd)</div><div class='add'>+{</div><div class='add'>+    return pub_glfs_readdirplus(glfd, NULL);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_statvfs, 3.4.0)</div><div class='add'>+int</div><div class='add'>+pub_glfs_statvfs(struct glfs *fs, const char *path, struct statvfs *buf)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    xlator_t *subvol = NULL;</div><div class='add'>+    loc_t loc = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    struct iatt iatt = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int reval = 0;</div><div class='add'>+</div><div class='add'>+    DECLARE_OLD_THIS;</div><div class='add'>+    __GLFS_ENTRY_VALIDATE_FS(fs, invalid_fs);</div><div class='add'>+</div><div class='add'>+    subvol = glfs_active_subvol(fs);</div><div class='add'>+    if (!subvol) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        errno = EIO;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+retry:</div><div class='add'>+    ret = glfs_resolve(fs, subvol, path, &amp;loc, &amp;iatt, reval);</div><div class='add'>+</div><div class='add'>+    ESTALE_RETRY(ret, errno, reval, &amp;loc, retry);</div><div class='add'>+</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    ret = syncop_statfs(subvol, &amp;loc, buf, NULL, NULL);</div><div class='add'>+    DECODE_SYNCOP_ERR(ret);</div><div class='add'>+</div><div class='add'>+    ESTALE_RETRY(ret, errno, reval, &amp;loc, retry);</div><div class='add'>+out:</div><div class='add'>+    loc_wipe(&amp;loc);</div><div class='add'>+</div><div class='add'>+    glfs_subvol_done(fs, subvol);</div><div class='add'>+</div><div class='add'>+    __GLFS_EXIT_FS;</div><div class='add'>+</div><div class='add'>+invalid_fs:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_setattr, 6.0)</div><div class='add'>+int</div><div class='add'>+pub_glfs_setattr(struct glfs *fs, const char *path, struct glfs_stat *stat,</div><div class='add'>+                 int follow)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int glvalid;</div><div class='add'>+    xlator_t *subvol = NULL;</div><div class='add'>+    loc_t loc = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    struct iatt riatt = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    struct iatt iatt = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int reval = 0;</div><div class='add'>+</div><div class='add'>+    DECLARE_OLD_THIS;</div><div class='add'>+    __GLFS_ENTRY_VALIDATE_FS(fs, invalid_fs);</div><div class='add'>+</div><div class='add'>+    GF_VALIDATE_OR_GOTO("glfs_setattr", stat, out);</div><div class='add'>+</div><div class='add'>+    subvol = glfs_active_subvol(fs);</div><div class='add'>+    if (!subvol) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        errno = EIO;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+retry:</div><div class='add'>+    if (follow)</div><div class='add'>+        ret = glfs_resolve(fs, subvol, path, &amp;loc, &amp;riatt, reval);</div><div class='add'>+    else</div><div class='add'>+        ret = glfs_lresolve(fs, subvol, path, &amp;loc, &amp;riatt, reval);</div><div class='add'>+</div><div class='add'>+    ESTALE_RETRY(ret, errno, reval, &amp;loc, retry);</div><div class='add'>+</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    glfs_iatt_from_statx(&amp;iatt, stat);</div><div class='add'>+    glfsflags_from_gfapiflags(stat, &amp;glvalid);</div><div class='add'>+</div><div class='add'>+    /* TODO : Add leaseid */</div><div class='add'>+    ret = syncop_setattr(subvol, &amp;loc, &amp;iatt, glvalid, 0, 0, NULL, NULL);</div><div class='add'>+    DECODE_SYNCOP_ERR(ret);</div><div class='add'>+</div><div class='add'>+    ESTALE_RETRY(ret, errno, reval, &amp;loc, retry);</div><div class='add'>+out:</div><div class='add'>+    loc_wipe(&amp;loc);</div><div class='add'>+</div><div class='add'>+    glfs_subvol_done(fs, subvol);</div><div class='add'>+</div><div class='add'>+    __GLFS_EXIT_FS;</div><div class='add'>+</div><div class='add'>+invalid_fs:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_fsetattr, 6.0)</div><div class='add'>+int</div><div class='add'>+pub_glfs_fsetattr(struct glfs_fd *glfd, struct glfs_stat *stat)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int glvalid;</div><div class='add'>+    struct iatt iatt = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    xlator_t *subvol = NULL;</div><div class='add'>+    fd_t *fd = NULL;</div><div class='add'>+</div><div class='add'>+    DECLARE_OLD_THIS;</div><div class='add'>+    __GLFS_ENTRY_VALIDATE_FD(glfd, invalid_fs);</div><div class='add'>+</div><div class='add'>+    GF_REF_GET(glfd);</div><div class='add'>+</div><div class='add'>+    GF_VALIDATE_OR_GOTO("glfs_fsetattr", stat, out);</div><div class='add'>+</div><div class='add'>+    subvol = glfs_active_subvol(glfd-&gt;fs);</div><div class='add'>+    if (!subvol) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        errno = EIO;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    fd = glfs_resolve_fd(glfd-&gt;fs, subvol, glfd);</div><div class='add'>+    if (!fd) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        errno = EBADFD;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    glfs_iatt_from_statx(&amp;iatt, stat);</div><div class='add'>+    glfsflags_from_gfapiflags(stat, &amp;glvalid);</div><div class='add'>+</div><div class='add'>+    /* TODO : Add leaseid */</div><div class='add'>+    ret = syncop_fsetattr(subvol, fd, &amp;iatt, glvalid, 0, 0, NULL, NULL);</div><div class='add'>+    DECODE_SYNCOP_ERR(ret);</div><div class='add'>+out:</div><div class='add'>+    if (fd)</div><div class='add'>+        fd_unref(fd);</div><div class='add'>+    if (glfd)</div><div class='add'>+        GF_REF_PUT(glfd);</div><div class='add'>+</div><div class='add'>+    glfs_subvol_done(glfd-&gt;fs, subvol);</div><div class='add'>+</div><div class='add'>+    __GLFS_EXIT_FS;</div><div class='add'>+</div><div class='add'>+invalid_fs:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_chmod, 3.4.0)</div><div class='add'>+int</div><div class='add'>+pub_glfs_chmod(struct glfs *fs, const char *path, mode_t mode)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    struct glfs_stat stat = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    stat.glfs_st_mode = mode;</div><div class='add'>+    stat.glfs_st_mask = GLFS_STAT_MODE;</div><div class='add'>+</div><div class='add'>+    ret = glfs_setattr(fs, path, &amp;stat, 1);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_fchmod, 3.4.0)</div><div class='add'>+int</div><div class='add'>+pub_glfs_fchmod(struct glfs_fd *glfd, mode_t mode)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    struct glfs_stat stat = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    stat.glfs_st_mode = mode;</div><div class='add'>+    stat.glfs_st_mask = GLFS_STAT_MODE;</div><div class='add'>+</div><div class='add'>+    ret = glfs_fsetattr(glfd, &amp;stat);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_chown, 3.4.0)</div><div class='add'>+int</div><div class='add'>+pub_glfs_chown(struct glfs *fs, const char *path, uid_t uid, gid_t gid)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+    struct glfs_stat stat = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    if (uid != (uid_t)-1) {</div><div class='add'>+        stat.glfs_st_uid = uid;</div><div class='add'>+        stat.glfs_st_mask = GLFS_STAT_UID;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (gid != (uid_t)-1) {</div><div class='add'>+        stat.glfs_st_gid = gid;</div><div class='add'>+        stat.glfs_st_mask = stat.glfs_st_mask | GLFS_STAT_GID;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (stat.glfs_st_mask)</div><div class='add'>+        ret = glfs_setattr(fs, path, &amp;stat, 1);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_lchown, 3.4.0)</div><div class='add'>+int</div><div class='add'>+pub_glfs_lchown(struct glfs *fs, const char *path, uid_t uid, gid_t gid)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+    struct glfs_stat stat = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    if (uid != (uid_t)-1) {</div><div class='add'>+        stat.glfs_st_uid = uid;</div><div class='add'>+        stat.glfs_st_mask = GLFS_STAT_UID;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (gid != (uid_t)-1) {</div><div class='add'>+        stat.glfs_st_gid = gid;</div><div class='add'>+        stat.glfs_st_mask = stat.glfs_st_mask | GLFS_STAT_GID;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (stat.glfs_st_mask)</div><div class='add'>+        ret = glfs_setattr(fs, path, &amp;stat, 0);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_fchown, 3.4.0)</div><div class='add'>+int</div><div class='add'>+pub_glfs_fchown(struct glfs_fd *glfd, uid_t uid, gid_t gid)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+    struct glfs_stat stat = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    if (uid != (uid_t)-1) {</div><div class='add'>+        stat.glfs_st_uid = uid;</div><div class='add'>+        stat.glfs_st_mask = GLFS_STAT_UID;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (gid != (uid_t)-1) {</div><div class='add'>+        stat.glfs_st_gid = gid;</div><div class='add'>+        stat.glfs_st_mask = stat.glfs_st_mask | GLFS_STAT_GID;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (stat.glfs_st_mask)</div><div class='add'>+        ret = glfs_fsetattr(glfd, &amp;stat);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_utimens, 3.4.0)</div><div class='add'>+int</div><div class='add'>+pub_glfs_utimens(struct glfs *fs, const char *path,</div><div class='add'>+                 const struct timespec times[2])</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    struct glfs_stat stat = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    stat.glfs_st_atime = times[0];</div><div class='add'>+    stat.glfs_st_mtime = times[1];</div><div class='add'>+</div><div class='add'>+    stat.glfs_st_mask = GLFS_STAT_ATIME | GLFS_STAT_MTIME;</div><div class='add'>+</div><div class='add'>+    ret = glfs_setattr(fs, path, &amp;stat, 1);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_lutimens, 3.4.0)</div><div class='add'>+int</div><div class='add'>+pub_glfs_lutimens(struct glfs *fs, const char *path,</div><div class='add'>+                  const struct timespec times[2])</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    struct glfs_stat stat = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    stat.glfs_st_atime = times[0];</div><div class='add'>+    stat.glfs_st_mtime = times[1];</div><div class='add'>+</div><div class='add'>+    stat.glfs_st_mask = GLFS_STAT_ATIME | GLFS_STAT_MTIME;</div><div class='add'>+</div><div class='add'>+    ret = glfs_setattr(fs, path, &amp;stat, 0);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_futimens, 3.4.0)</div><div class='add'>+int</div><div class='add'>+pub_glfs_futimens(struct glfs_fd *glfd, const struct timespec times[2])</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    struct glfs_stat stat = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    stat.glfs_st_atime = times[0];</div><div class='add'>+    stat.glfs_st_mtime = times[1];</div><div class='add'>+</div><div class='add'>+    stat.glfs_st_mask = GLFS_STAT_ATIME | GLFS_STAT_MTIME;</div><div class='add'>+</div><div class='add'>+    ret = glfs_fsetattr(glfd, &amp;stat);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+glfs_getxattr_process(void *value, size_t size, dict_t *xattr, const char *name)</div><div class='add'>+{</div><div class='add'>+    data_t *data = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    data = dict_get(xattr, (char *)name);</div><div class='add'>+    if (!data) {</div><div class='add'>+        errno = ENODATA;</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = data-&gt;len;</div><div class='add'>+    if (!value || !size)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    if (size &lt; ret) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        errno = ERANGE;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    memcpy(value, data-&gt;data, ret);</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+ssize_t</div><div class='add'>+glfs_getxattr_common(struct glfs *fs, const char *path, const char *name,</div><div class='add'>+                     void *value, size_t size, int follow)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    xlator_t *subvol = NULL;</div><div class='add'>+    loc_t loc = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    struct iatt iatt = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    dict_t *xattr = NULL;</div><div class='add'>+    int reval = 0;</div><div class='add'>+</div><div class='add'>+    DECLARE_OLD_THIS;</div><div class='add'>+    __GLFS_ENTRY_VALIDATE_FS(fs, invalid_fs);</div><div class='add'>+</div><div class='add'>+    if (!name || *name == '\0') {</div><div class='add'>+        ret = -1;</div><div class='add'>+        errno = EINVAL;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (strlen(name) &gt; GF_XATTR_NAME_MAX) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        errno = ENAMETOOLONG;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    subvol = glfs_active_subvol(fs);</div><div class='add'>+    if (!subvol) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        errno = EIO;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+retry:</div><div class='add'>+    if (follow)</div><div class='add'>+        ret = glfs_resolve(fs, subvol, path, &amp;loc, &amp;iatt, reval);</div><div class='add'>+    else</div><div class='add'>+        ret = glfs_lresolve(fs, subvol, path, &amp;loc, &amp;iatt, reval);</div><div class='add'>+</div><div class='add'>+    ESTALE_RETRY(ret, errno, reval, &amp;loc, retry);</div><div class='add'>+</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    ret = syncop_getxattr(subvol, &amp;loc, &amp;xattr, name, NULL, NULL);</div><div class='add'>+    DECODE_SYNCOP_ERR(ret);</div><div class='add'>+</div><div class='add'>+    ESTALE_RETRY(ret, errno, reval, &amp;loc, retry);</div><div class='add'>+</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    ret = glfs_getxattr_process(value, size, xattr, name);</div><div class='add'>+out:</div><div class='add'>+    loc_wipe(&amp;loc);</div><div class='add'>+</div><div class='add'>+    if (xattr)</div><div class='add'>+        dict_unref(xattr);</div><div class='add'>+</div><div class='add'>+    glfs_subvol_done(fs, subvol);</div><div class='add'>+</div><div class='add'>+    __GLFS_EXIT_FS;</div><div class='add'>+</div><div class='add'>+invalid_fs:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_getxattr, 3.4.0)</div><div class='add'>+ssize_t</div><div class='add'>+pub_glfs_getxattr(struct glfs *fs, const char *path, const char *name,</div><div class='add'>+                  void *value, size_t size)</div><div class='add'>+{</div><div class='add'>+    return glfs_getxattr_common(fs, path, name, value, size, 1);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_lgetxattr, 3.4.0)</div><div class='add'>+ssize_t</div><div class='add'>+pub_glfs_lgetxattr(struct glfs *fs, const char *path, const char *name,</div><div class='add'>+                   void *value, size_t size)</div><div class='add'>+{</div><div class='add'>+    return glfs_getxattr_common(fs, path, name, value, size, 0);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_fgetxattr, 3.4.0)</div><div class='add'>+ssize_t</div><div class='add'>+pub_glfs_fgetxattr(struct glfs_fd *glfd, const char *name, void *value,</div><div class='add'>+                   size_t size)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    xlator_t *subvol = NULL;</div><div class='add'>+    dict_t *xattr = NULL;</div><div class='add'>+    fd_t *fd = NULL;</div><div class='add'>+</div><div class='add'>+    DECLARE_OLD_THIS;</div><div class='add'>+    __GLFS_ENTRY_VALIDATE_FD(glfd, invalid_fs);</div><div class='add'>+</div><div class='add'>+    GF_REF_GET(glfd);</div><div class='add'>+</div><div class='add'>+    if (!name || *name == '\0') {</div><div class='add'>+        ret = -1;</div><div class='add'>+        errno = EINVAL;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (strlen(name) &gt; GF_XATTR_NAME_MAX) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        errno = ENAMETOOLONG;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    subvol = glfs_active_subvol(glfd-&gt;fs);</div><div class='add'>+    if (!subvol) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        errno = EIO;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    fd = glfs_resolve_fd(glfd-&gt;fs, subvol, glfd);</div><div class='add'>+    if (!fd) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        errno = EBADFD;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = syncop_fgetxattr(subvol, fd, &amp;xattr, name, NULL, NULL);</div><div class='add'>+    DECODE_SYNCOP_ERR(ret);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    ret = glfs_getxattr_process(value, size, xattr, name);</div><div class='add'>+out:</div><div class='add'>+    if (fd)</div><div class='add'>+        fd_unref(fd);</div><div class='add'>+    if (glfd)</div><div class='add'>+        GF_REF_PUT(glfd);</div><div class='add'>+    if (xattr)</div><div class='add'>+        dict_unref(xattr);</div><div class='add'>+</div><div class='add'>+    glfs_subvol_done(glfd-&gt;fs, subvol);</div><div class='add'>+</div><div class='add'>+    __GLFS_EXIT_FS;</div><div class='add'>+</div><div class='add'>+invalid_fs:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+glfs_listxattr_process(void *value, size_t size, dict_t *xattr)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    if (!xattr)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    ret = dict_keys_join(NULL, 0, xattr, NULL);</div><div class='add'>+</div><div class='add'>+    if (!value || !size)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    if (size &lt; ret) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        errno = ERANGE;</div><div class='add'>+    } else {</div><div class='add'>+        dict_keys_join(value, size, xattr, NULL);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+ssize_t</div><div class='add'>+glfs_listxattr_common(struct glfs *fs, const char *path, void *value,</div><div class='add'>+                      size_t size, int follow)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    xlator_t *subvol = NULL;</div><div class='add'>+    loc_t loc = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    struct iatt iatt = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    dict_t *xattr = NULL;</div><div class='add'>+    int reval = 0;</div><div class='add'>+</div><div class='add'>+    DECLARE_OLD_THIS;</div><div class='add'>+    __GLFS_ENTRY_VALIDATE_FS(fs, invalid_fs);</div><div class='add'>+</div><div class='add'>+    subvol = glfs_active_subvol(fs);</div><div class='add'>+    if (!subvol) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        errno = EIO;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+retry:</div><div class='add'>+    if (follow)</div><div class='add'>+        ret = glfs_resolve(fs, subvol, path, &amp;loc, &amp;iatt, reval);</div><div class='add'>+    else</div><div class='add'>+        ret = glfs_lresolve(fs, subvol, path, &amp;loc, &amp;iatt, reval);</div><div class='add'>+</div><div class='add'>+    ESTALE_RETRY(ret, errno, reval, &amp;loc, retry);</div><div class='add'>+</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    ret = syncop_getxattr(subvol, &amp;loc, &amp;xattr, NULL, NULL, NULL);</div><div class='add'>+    DECODE_SYNCOP_ERR(ret);</div><div class='add'>+</div><div class='add'>+    ESTALE_RETRY(ret, errno, reval, &amp;loc, retry);</div><div class='add'>+</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    ret = glfs_listxattr_process(value, size, xattr);</div><div class='add'>+out:</div><div class='add'>+    loc_wipe(&amp;loc);</div><div class='add'>+</div><div class='add'>+    if (xattr)</div><div class='add'>+        dict_unref(xattr);</div><div class='add'>+</div><div class='add'>+    glfs_subvol_done(fs, subvol);</div><div class='add'>+</div><div class='add'>+    __GLFS_EXIT_FS;</div><div class='add'>+</div><div class='add'>+invalid_fs:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_listxattr, 3.4.0)</div><div class='add'>+ssize_t</div><div class='add'>+pub_glfs_listxattr(struct glfs *fs, const char *path, void *value, size_t size)</div><div class='add'>+{</div><div class='add'>+    return glfs_listxattr_common(fs, path, value, size, 1);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_llistxattr, 3.4.0)</div><div class='add'>+ssize_t</div><div class='add'>+pub_glfs_llistxattr(struct glfs *fs, const char *path, void *value, size_t size)</div><div class='add'>+{</div><div class='add'>+    return glfs_listxattr_common(fs, path, value, size, 0);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_flistxattr, 3.4.0)</div><div class='add'>+ssize_t</div><div class='add'>+pub_glfs_flistxattr(struct glfs_fd *glfd, void *value, size_t size)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    xlator_t *subvol = NULL;</div><div class='add'>+    dict_t *xattr = NULL;</div><div class='add'>+    fd_t *fd = NULL;</div><div class='add'>+</div><div class='add'>+    DECLARE_OLD_THIS;</div><div class='add'>+    __GLFS_ENTRY_VALIDATE_FD(glfd, invalid_fs);</div><div class='add'>+</div><div class='add'>+    GF_REF_GET(glfd);</div><div class='add'>+</div><div class='add'>+    subvol = glfs_active_subvol(glfd-&gt;fs);</div><div class='add'>+    if (!subvol) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        errno = EIO;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    fd = glfs_resolve_fd(glfd-&gt;fs, subvol, glfd);</div><div class='add'>+    if (!fd) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        errno = EBADFD;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = syncop_fgetxattr(subvol, fd, &amp;xattr, NULL, NULL, NULL);</div><div class='add'>+    DECODE_SYNCOP_ERR(ret);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    ret = glfs_listxattr_process(value, size, xattr);</div><div class='add'>+out:</div><div class='add'>+    if (fd)</div><div class='add'>+        fd_unref(fd);</div><div class='add'>+    if (glfd)</div><div class='add'>+        GF_REF_PUT(glfd);</div><div class='add'>+    if (xattr)</div><div class='add'>+        dict_unref(xattr);</div><div class='add'>+</div><div class='add'>+    glfs_subvol_done(glfd-&gt;fs, subvol);</div><div class='add'>+</div><div class='add'>+    __GLFS_EXIT_FS;</div><div class='add'>+</div><div class='add'>+invalid_fs:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+glfs_setxattr_common(struct glfs *fs, const char *path, const char *name,</div><div class='add'>+                     const void *value, size_t size, int flags, int follow)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    xlator_t *subvol = NULL;</div><div class='add'>+    loc_t loc = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    struct iatt iatt = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    dict_t *xattr = NULL;</div><div class='add'>+    int reval = 0;</div><div class='add'>+    void *value_cp = NULL;</div><div class='add'>+</div><div class='add'>+    DECLARE_OLD_THIS;</div><div class='add'>+    __GLFS_ENTRY_VALIDATE_FS(fs, invalid_fs);</div><div class='add'>+</div><div class='add'>+    if (!name || *name == '\0') {</div><div class='add'>+        ret = -1;</div><div class='add'>+        errno = EINVAL;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (strlen(name) &gt; GF_XATTR_NAME_MAX) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        errno = ENAMETOOLONG;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    subvol = glfs_active_subvol(fs);</div><div class='add'>+    if (!subvol) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        errno = EIO;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+retry:</div><div class='add'>+    if (follow)</div><div class='add'>+        ret = glfs_resolve(fs, subvol, path, &amp;loc, &amp;iatt, reval);</div><div class='add'>+    else</div><div class='add'>+        ret = glfs_lresolve(fs, subvol, path, &amp;loc, &amp;iatt, reval);</div><div class='add'>+</div><div class='add'>+    ESTALE_RETRY(ret, errno, reval, &amp;loc, retry);</div><div class='add'>+</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    value_cp = gf_memdup(value, size);</div><div class='add'>+    GF_CHECK_ALLOC_AND_LOG(subvol-&gt;name, value_cp, ret,</div><div class='add'>+                           "Failed to"</div><div class='add'>+                           " duplicate setxattr value",</div><div class='add'>+                           out);</div><div class='add'>+</div><div class='add'>+    xattr = dict_for_key_value(name, value_cp, size, _gf_false);</div><div class='add'>+    if (!xattr) {</div><div class='add'>+        GF_FREE(value_cp);</div><div class='add'>+        ret = -1;</div><div class='add'>+        errno = ENOMEM;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = syncop_setxattr(subvol, &amp;loc, xattr, flags, NULL, NULL);</div><div class='add'>+    DECODE_SYNCOP_ERR(ret);</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    loc_wipe(&amp;loc);</div><div class='add'>+    if (xattr)</div><div class='add'>+        dict_unref(xattr);</div><div class='add'>+</div><div class='add'>+    glfs_subvol_done(fs, subvol);</div><div class='add'>+</div><div class='add'>+    __GLFS_EXIT_FS;</div><div class='add'>+</div><div class='add'>+invalid_fs:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_setxattr, 3.4.0)</div><div class='add'>+int</div><div class='add'>+pub_glfs_setxattr(struct glfs *fs, const char *path, const char *name,</div><div class='add'>+                  const void *value, size_t size, int flags)</div><div class='add'>+{</div><div class='add'>+    return glfs_setxattr_common(fs, path, name, value, size, flags, 1);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_lsetxattr, 3.4.0)</div><div class='add'>+int</div><div class='add'>+pub_glfs_lsetxattr(struct glfs *fs, const char *path, const char *name,</div><div class='add'>+                   const void *value, size_t size, int flags)</div><div class='add'>+{</div><div class='add'>+    return glfs_setxattr_common(fs, path, name, value, size, flags, 0);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_fsetxattr, 3.4.0)</div><div class='add'>+int</div><div class='add'>+pub_glfs_fsetxattr(struct glfs_fd *glfd, const char *name, const void *value,</div><div class='add'>+                   size_t size, int flags)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    xlator_t *subvol = NULL;</div><div class='add'>+    dict_t *xattr = NULL;</div><div class='add'>+    fd_t *fd = NULL;</div><div class='add'>+    void *value_cp = NULL;</div><div class='add'>+</div><div class='add'>+    DECLARE_OLD_THIS;</div><div class='add'>+    __GLFS_ENTRY_VALIDATE_FD(glfd, invalid_fs);</div><div class='add'>+</div><div class='add'>+    GF_REF_GET(glfd);</div><div class='add'>+</div><div class='add'>+    if (!name || *name == '\0') {</div><div class='add'>+        ret = -1;</div><div class='add'>+        errno = EINVAL;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (strlen(name) &gt; GF_XATTR_NAME_MAX) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        errno = ENAMETOOLONG;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    subvol = glfs_active_subvol(glfd-&gt;fs);</div><div class='add'>+    if (!subvol) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        errno = EIO;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    fd = glfs_resolve_fd(glfd-&gt;fs, subvol, glfd);</div><div class='add'>+    if (!fd) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        errno = EBADFD;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    value_cp = gf_memdup(value, size);</div><div class='add'>+    GF_CHECK_ALLOC_AND_LOG(subvol-&gt;name, value_cp, ret,</div><div class='add'>+                           "Failed to"</div><div class='add'>+                           " duplicate setxattr value",</div><div class='add'>+                           out);</div><div class='add'>+</div><div class='add'>+    xattr = dict_for_key_value(name, value_cp, size, _gf_false);</div><div class='add'>+    if (!xattr) {</div><div class='add'>+        GF_FREE(value_cp);</div><div class='add'>+        ret = -1;</div><div class='add'>+        errno = ENOMEM;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = syncop_fsetxattr(subvol, fd, xattr, flags, NULL, NULL);</div><div class='add'>+    DECODE_SYNCOP_ERR(ret);</div><div class='add'>+out:</div><div class='add'>+    if (xattr)</div><div class='add'>+        dict_unref(xattr);</div><div class='add'>+</div><div class='add'>+    if (fd)</div><div class='add'>+        fd_unref(fd);</div><div class='add'>+    if (glfd)</div><div class='add'>+        GF_REF_PUT(glfd);</div><div class='add'>+</div><div class='add'>+    glfs_subvol_done(glfd-&gt;fs, subvol);</div><div class='add'>+</div><div class='add'>+    __GLFS_EXIT_FS;</div><div class='add'>+</div><div class='add'>+invalid_fs:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+glfs_removexattr_common(struct glfs *fs, const char *path, const char *name,</div><div class='add'>+                        int follow)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    xlator_t *subvol = NULL;</div><div class='add'>+    loc_t loc = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    struct iatt iatt = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int reval = 0;</div><div class='add'>+</div><div class='add'>+    DECLARE_OLD_THIS;</div><div class='add'>+    __GLFS_ENTRY_VALIDATE_FS(fs, invalid_fs);</div><div class='add'>+</div><div class='add'>+    subvol = glfs_active_subvol(fs);</div><div class='add'>+    if (!subvol) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        errno = EIO;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+retry:</div><div class='add'>+    if (follow)</div><div class='add'>+        ret = glfs_resolve(fs, subvol, path, &amp;loc, &amp;iatt, reval);</div><div class='add'>+    else</div><div class='add'>+        ret = glfs_lresolve(fs, subvol, path, &amp;loc, &amp;iatt, reval);</div><div class='add'>+</div><div class='add'>+    ESTALE_RETRY(ret, errno, reval, &amp;loc, retry);</div><div class='add'>+</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    ret = syncop_removexattr(subvol, &amp;loc, name, NULL, NULL);</div><div class='add'>+    DECODE_SYNCOP_ERR(ret);</div><div class='add'>+</div><div class='add'>+    ESTALE_RETRY(ret, errno, reval, &amp;loc, retry);</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    loc_wipe(&amp;loc);</div><div class='add'>+</div><div class='add'>+    glfs_subvol_done(fs, subvol);</div><div class='add'>+</div><div class='add'>+    __GLFS_EXIT_FS;</div><div class='add'>+</div><div class='add'>+invalid_fs:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_removexattr, 3.4.0)</div><div class='add'>+int</div><div class='add'>+pub_glfs_removexattr(struct glfs *fs, const char *path, const char *name)</div><div class='add'>+{</div><div class='add'>+    return glfs_removexattr_common(fs, path, name, 1);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_lremovexattr, 3.4.0)</div><div class='add'>+int</div><div class='add'>+pub_glfs_lremovexattr(struct glfs *fs, const char *path, const char *name)</div><div class='add'>+{</div><div class='add'>+    return glfs_removexattr_common(fs, path, name, 0);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_fremovexattr, 3.4.0)</div><div class='add'>+int</div><div class='add'>+pub_glfs_fremovexattr(struct glfs_fd *glfd, const char *name)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    xlator_t *subvol = NULL;</div><div class='add'>+    fd_t *fd = NULL;</div><div class='add'>+</div><div class='add'>+    DECLARE_OLD_THIS;</div><div class='add'>+    __GLFS_ENTRY_VALIDATE_FD(glfd, invalid_fs);</div><div class='add'>+</div><div class='add'>+    GF_REF_GET(glfd);</div><div class='add'>+</div><div class='add'>+    subvol = glfs_active_subvol(glfd-&gt;fs);</div><div class='add'>+    if (!subvol) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        errno = EIO;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    fd = glfs_resolve_fd(glfd-&gt;fs, subvol, glfd);</div><div class='add'>+    if (!fd) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        errno = EBADFD;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = syncop_fremovexattr(subvol, fd, name, NULL, NULL);</div><div class='add'>+    DECODE_SYNCOP_ERR(ret);</div><div class='add'>+out:</div><div class='add'>+    if (fd)</div><div class='add'>+        fd_unref(fd);</div><div class='add'>+    if (glfd)</div><div class='add'>+        GF_REF_PUT(glfd);</div><div class='add'>+</div><div class='add'>+    glfs_subvol_done(glfd-&gt;fs, subvol);</div><div class='add'>+</div><div class='add'>+    __GLFS_EXIT_FS;</div><div class='add'>+</div><div class='add'>+invalid_fs:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_fallocate, 3.5.0)</div><div class='add'>+int</div><div class='add'>+pub_glfs_fallocate(struct glfs_fd *glfd, int keep_size, off_t offset,</div><div class='add'>+                   size_t len)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    xlator_t *subvol = NULL;</div><div class='add'>+    fd_t *fd = NULL;</div><div class='add'>+    dict_t *fop_attr = NULL;</div><div class='add'>+</div><div class='add'>+    DECLARE_OLD_THIS;</div><div class='add'>+    __GLFS_ENTRY_VALIDATE_FD(glfd, invalid_fs);</div><div class='add'>+</div><div class='add'>+    GF_REF_GET(glfd);</div><div class='add'>+</div><div class='add'>+    subvol = glfs_active_subvol(glfd-&gt;fs);</div><div class='add'>+    if (!subvol) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        errno = EIO;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    fd = glfs_resolve_fd(glfd-&gt;fs, subvol, glfd);</div><div class='add'>+    if (!fd) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        errno = EBADFD;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = get_fop_attr_thrd_key(&amp;fop_attr);</div><div class='add'>+    if (ret)</div><div class='add'>+        gf_msg_debug("gfapi", 0, "Getting leaseid from thread failed");</div><div class='add'>+</div><div class='add'>+    ret = syncop_fallocate(subvol, fd, keep_size, offset, len, fop_attr, NULL);</div><div class='add'>+    DECODE_SYNCOP_ERR(ret);</div><div class='add'>+out:</div><div class='add'>+    if (fd)</div><div class='add'>+        fd_unref(fd);</div><div class='add'>+    if (glfd)</div><div class='add'>+        GF_REF_PUT(glfd);</div><div class='add'>+    if (fop_attr)</div><div class='add'>+        dict_unref(fop_attr);</div><div class='add'>+</div><div class='add'>+    glfs_subvol_done(glfd-&gt;fs, subvol);</div><div class='add'>+</div><div class='add'>+    __GLFS_EXIT_FS;</div><div class='add'>+</div><div class='add'>+invalid_fs:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_discard, 3.5.0)</div><div class='add'>+int</div><div class='add'>+pub_glfs_discard(struct glfs_fd *glfd, off_t offset, size_t len)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    xlator_t *subvol = NULL;</div><div class='add'>+    fd_t *fd = NULL;</div><div class='add'>+    dict_t *fop_attr = NULL;</div><div class='add'>+</div><div class='add'>+    DECLARE_OLD_THIS;</div><div class='add'>+    __GLFS_ENTRY_VALIDATE_FD(glfd, invalid_fs);</div><div class='add'>+</div><div class='add'>+    GF_REF_GET(glfd);</div><div class='add'>+</div><div class='add'>+    subvol = glfs_active_subvol(glfd-&gt;fs);</div><div class='add'>+    if (!subvol) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        errno = EIO;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    fd = glfs_resolve_fd(glfd-&gt;fs, subvol, glfd);</div><div class='add'>+    if (!fd) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        errno = EBADFD;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = get_fop_attr_thrd_key(&amp;fop_attr);</div><div class='add'>+    if (ret)</div><div class='add'>+        gf_msg_debug("gfapi", 0, "Getting leaseid from thread failed");</div><div class='add'>+</div><div class='add'>+    ret = syncop_discard(subvol, fd, offset, len, fop_attr, NULL);</div><div class='add'>+    DECODE_SYNCOP_ERR(ret);</div><div class='add'>+out:</div><div class='add'>+    if (fd)</div><div class='add'>+        fd_unref(fd);</div><div class='add'>+    if (glfd)</div><div class='add'>+        GF_REF_PUT(glfd);</div><div class='add'>+    if (fop_attr)</div><div class='add'>+        dict_unref(fop_attr);</div><div class='add'>+</div><div class='add'>+    glfs_subvol_done(glfd-&gt;fs, subvol);</div><div class='add'>+</div><div class='add'>+    __GLFS_EXIT_FS;</div><div class='add'>+</div><div class='add'>+invalid_fs:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_zerofill, 3.5.0)</div><div class='add'>+int</div><div class='add'>+pub_glfs_zerofill(struct glfs_fd *glfd, off_t offset, off_t len)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    xlator_t *subvol = NULL;</div><div class='add'>+    fd_t *fd = NULL;</div><div class='add'>+    dict_t *fop_attr = NULL;</div><div class='add'>+</div><div class='add'>+    DECLARE_OLD_THIS;</div><div class='add'>+    __GLFS_ENTRY_VALIDATE_FD(glfd, invalid_fs);</div><div class='add'>+</div><div class='add'>+    GF_REF_GET(glfd);</div><div class='add'>+</div><div class='add'>+    subvol = glfs_active_subvol(glfd-&gt;fs);</div><div class='add'>+    if (!subvol) {</div><div class='add'>+        errno = EIO;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    fd = glfs_resolve_fd(glfd-&gt;fs, subvol, glfd);</div><div class='add'>+    if (!fd) {</div><div class='add'>+        errno = EBADFD;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = get_fop_attr_thrd_key(&amp;fop_attr);</div><div class='add'>+    if (ret)</div><div class='add'>+        gf_msg_debug("gfapi", 0, "Getting leaseid from thread failed");</div><div class='add'>+</div><div class='add'>+    ret = syncop_zerofill(subvol, fd, offset, len, fop_attr, NULL);</div><div class='add'>+    DECODE_SYNCOP_ERR(ret);</div><div class='add'>+out:</div><div class='add'>+    if (fd)</div><div class='add'>+        fd_unref(fd);</div><div class='add'>+    if (glfd)</div><div class='add'>+        GF_REF_PUT(glfd);</div><div class='add'>+    if (fop_attr)</div><div class='add'>+        dict_unref(fop_attr);</div><div class='add'>+</div><div class='add'>+    glfs_subvol_done(glfd-&gt;fs, subvol);</div><div class='add'>+</div><div class='add'>+    __GLFS_EXIT_FS;</div><div class='add'>+</div><div class='add'>+invalid_fs:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_chdir, 3.4.0)</div><div class='add'>+int</div><div class='add'>+pub_glfs_chdir(struct glfs *fs, const char *path)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    xlator_t *subvol = NULL;</div><div class='add'>+    loc_t loc = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    struct iatt iatt = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int reval = 0;</div><div class='add'>+</div><div class='add'>+    DECLARE_OLD_THIS;</div><div class='add'>+    __GLFS_ENTRY_VALIDATE_FS(fs, invalid_fs);</div><div class='add'>+</div><div class='add'>+    subvol = glfs_active_subvol(fs);</div><div class='add'>+    if (!subvol) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        errno = EIO;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+retry:</div><div class='add'>+    ret = glfs_resolve(fs, subvol, path, &amp;loc, &amp;iatt, reval);</div><div class='add'>+</div><div class='add'>+    ESTALE_RETRY(ret, errno, reval, &amp;loc, retry);</div><div class='add'>+</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    if (!IA_ISDIR(iatt.ia_type)) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        errno = ENOTDIR;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    glfs_cwd_set(fs, loc.inode);</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    loc_wipe(&amp;loc);</div><div class='add'>+</div><div class='add'>+    glfs_subvol_done(fs, subvol);</div><div class='add'>+</div><div class='add'>+    __GLFS_EXIT_FS;</div><div class='add'>+</div><div class='add'>+invalid_fs:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_fchdir, 3.4.0)</div><div class='add'>+int</div><div class='add'>+pub_glfs_fchdir(struct glfs_fd *glfd)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    inode_t *inode = NULL;</div><div class='add'>+    xlator_t *subvol = NULL;</div><div class='add'>+    fd_t *fd = NULL;</div><div class='add'>+</div><div class='add'>+    DECLARE_OLD_THIS;</div><div class='add'>+    __GLFS_ENTRY_VALIDATE_FD(glfd, invalid_fs);</div><div class='add'>+</div><div class='add'>+    GF_REF_GET(glfd);</div><div class='add'>+</div><div class='add'>+    subvol = glfs_active_subvol(glfd-&gt;fs);</div><div class='add'>+    if (!subvol) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        errno = EIO;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    fd = glfs_resolve_fd(glfd-&gt;fs, subvol, glfd);</div><div class='add'>+    if (!fd) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        errno = EBADFD;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    inode = fd-&gt;inode;</div><div class='add'>+</div><div class='add'>+    if (!IA_ISDIR(inode-&gt;ia_type)) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        errno = ENOTDIR;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    glfs_cwd_set(glfd-&gt;fs, inode);</div><div class='add'>+    ret = 0;</div><div class='add'>+out:</div><div class='add'>+    if (fd)</div><div class='add'>+        fd_unref(fd);</div><div class='add'>+    if (glfd)</div><div class='add'>+        GF_REF_PUT(glfd);</div><div class='add'>+</div><div class='add'>+    glfs_subvol_done(glfd-&gt;fs, subvol);</div><div class='add'>+</div><div class='add'>+    __GLFS_EXIT_FS;</div><div class='add'>+</div><div class='add'>+invalid_fs:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static gf_boolean_t warn_realpath = _gf_true; /* log once */</div><div class='add'>+</div><div class='add'>+static char *</div><div class='add'>+glfs_realpath_common(struct glfs *fs, const char *path, char *resolved_path,</div><div class='add'>+                     gf_boolean_t warn_deprecated)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    char *retpath = NULL;</div><div class='add'>+    char *allocpath = NULL;</div><div class='add'>+    xlator_t *subvol = NULL;</div><div class='add'>+    loc_t loc = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    struct iatt iatt = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int reval = 0;</div><div class='add'>+</div><div class='add'>+    DECLARE_OLD_THIS;</div><div class='add'>+    __GLFS_ENTRY_VALIDATE_FS(fs, invalid_fs);</div><div class='add'>+</div><div class='add'>+    if (resolved_path)</div><div class='add'>+        retpath = resolved_path;</div><div class='add'>+    else if (warn_deprecated) {</div><div class='add'>+        retpath = allocpath = malloc(PATH_MAX + 1);</div><div class='add'>+        if (warn_realpath) {</div><div class='add'>+            warn_realpath = _gf_false;</div><div class='add'>+            gf_log(THIS-&gt;name, GF_LOG_WARNING,</div><div class='add'>+                   "this application "</div><div class='add'>+                   "is compiled against an old version of "</div><div class='add'>+                   "libgfapi, it should use glfs_free() to "</div><div class='add'>+                   "release the path returned by "</div><div class='add'>+                   "glfs_realpath()");</div><div class='add'>+        }</div><div class='add'>+    } else {</div><div class='add'>+        retpath = allocpath = GLFS_CALLOC(1, PATH_MAX + 1, NULL,</div><div class='add'>+                                          glfs_mt_realpath_t);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (!retpath) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        errno = ENOMEM;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    subvol = glfs_active_subvol(fs);</div><div class='add'>+    if (!subvol) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        errno = EIO;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+retry:</div><div class='add'>+    ret = glfs_resolve(fs, subvol, path, &amp;loc, &amp;iatt, reval);</div><div class='add'>+</div><div class='add'>+    ESTALE_RETRY(ret, errno, reval, &amp;loc, retry);</div><div class='add'>+</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    if (loc.path) {</div><div class='add'>+        snprintf(retpath, PATH_MAX + 1, "%s", loc.path);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    loc_wipe(&amp;loc);</div><div class='add'>+</div><div class='add'>+    if (ret == -1) {</div><div class='add'>+        if (warn_deprecated &amp;&amp; allocpath)</div><div class='add'>+            free(allocpath);</div><div class='add'>+        else if (allocpath)</div><div class='add'>+            GLFS_FREE(allocpath);</div><div class='add'>+        retpath = NULL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    glfs_subvol_done(fs, subvol);</div><div class='add'>+</div><div class='add'>+    __GLFS_EXIT_FS;</div><div class='add'>+</div><div class='add'>+invalid_fs:</div><div class='add'>+    return retpath;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+GFAPI_SYMVER_PUBLIC(glfs_realpath34, glfs_realpath, 3.4.0)</div><div class='add'>+char *</div><div class='add'>+pub_glfs_realpath34(struct glfs *fs, const char *path, char *resolved_path)</div><div class='add'>+{</div><div class='add'>+    return glfs_realpath_common(fs, path, resolved_path, _gf_true);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_realpath, 3.7.17)</div><div class='add'>+char *</div><div class='add'>+pub_glfs_realpath(struct glfs *fs, const char *path, char *resolved_path)</div><div class='add'>+{</div><div class='add'>+    return glfs_realpath_common(fs, path, resolved_path, _gf_false);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_getcwd, 3.4.0)</div><div class='add'>+char *</div><div class='add'>+pub_glfs_getcwd(struct glfs *fs, char *buf, size_t n)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    inode_t *inode = NULL;</div><div class='add'>+    char *path = NULL;</div><div class='add'>+</div><div class='add'>+    DECLARE_OLD_THIS;</div><div class='add'>+    __GLFS_ENTRY_VALIDATE_FS(fs, invalid_fs);</div><div class='add'>+</div><div class='add'>+    if (!buf || n &lt; 2) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        errno = EINVAL;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    inode = glfs_cwd_get(fs);</div><div class='add'>+</div><div class='add'>+    if (!inode) {</div><div class='add'>+        strncpy(buf, "/", n);</div><div class='add'>+        ret = 0;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = inode_path(inode, 0, &amp;path);</div><div class='add'>+    if (n &lt;= ret) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        errno = ERANGE;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    strncpy(buf, path, n);</div><div class='add'>+    ret = 0;</div><div class='add'>+out:</div><div class='add'>+    GF_FREE(path);</div><div class='add'>+</div><div class='add'>+    if (inode)</div><div class='add'>+        inode_unref(inode);</div><div class='add'>+</div><div class='add'>+    __GLFS_EXIT_FS;</div><div class='add'>+</div><div class='add'>+invalid_fs:</div><div class='add'>+    if (ret &lt; 0)</div><div class='add'>+        return NULL;</div><div class='add'>+</div><div class='add'>+    return buf;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf_flock_to_flock(struct gf_flock *gf_flock, struct flock *flock)</div><div class='add'>+{</div><div class='add'>+    flock-&gt;l_type = gf_flock-&gt;l_type;</div><div class='add'>+    flock-&gt;l_whence = gf_flock-&gt;l_whence;</div><div class='add'>+    flock-&gt;l_start = gf_flock-&gt;l_start;</div><div class='add'>+    flock-&gt;l_len = gf_flock-&gt;l_len;</div><div class='add'>+    flock-&gt;l_pid = gf_flock-&gt;l_pid;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf_flock_from_flock(struct gf_flock *gf_flock, struct flock *flock)</div><div class='add'>+{</div><div class='add'>+    gf_flock-&gt;l_type = flock-&gt;l_type;</div><div class='add'>+    gf_flock-&gt;l_whence = flock-&gt;l_whence;</div><div class='add'>+    gf_flock-&gt;l_start = flock-&gt;l_start;</div><div class='add'>+    gf_flock-&gt;l_len = flock-&gt;l_len;</div><div class='add'>+    gf_flock-&gt;l_pid = flock-&gt;l_pid;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+glfs_lock_common(struct glfs_fd *glfd, int cmd, struct flock *flock,</div><div class='add'>+                 dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    xlator_t *subvol = NULL;</div><div class='add'>+    struct gf_flock gf_flock = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    struct gf_flock saved_flock = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    fd_t *fd = NULL;</div><div class='add'>+</div><div class='add'>+    DECLARE_OLD_THIS;</div><div class='add'>+    __GLFS_ENTRY_VALIDATE_FD(glfd, invalid_fs);</div><div class='add'>+</div><div class='add'>+    if (!flock) {</div><div class='add'>+        errno = EINVAL;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    GF_REF_GET(glfd);</div><div class='add'>+    subvol = glfs_active_subvol(glfd-&gt;fs);</div><div class='add'>+    if (!subvol) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        errno = EIO;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    fd = glfs_resolve_fd(glfd-&gt;fs, subvol, glfd);</div><div class='add'>+    if (!fd) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        errno = EBADFD;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Generate glusterfs flock structure from client flock</div><div class='add'>+     * structure to be processed by server */</div><div class='add'>+    gf_flock_from_flock(&amp;gf_flock, flock);</div><div class='add'>+</div><div class='add'>+    /* Keep another copy of flock for split/merge of locks</div><div class='add'>+     * at client side */</div><div class='add'>+    gf_flock_from_flock(&amp;saved_flock, flock);</div><div class='add'>+</div><div class='add'>+    if (glfd-&gt;lk_owner.len != 0) {</div><div class='add'>+        ret = syncopctx_setfslkowner(&amp;glfd-&gt;lk_owner);</div><div class='add'>+</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = get_fop_attr_thrd_key(&amp;xdata);</div><div class='add'>+    if (ret)</div><div class='add'>+        gf_msg_debug("gfapi", 0, "Getting leaseid from thread failed");</div><div class='add'>+</div><div class='add'>+    ret = syncop_lk(subvol, fd, cmd, &amp;gf_flock, xdata, NULL);</div><div class='add'>+    DECODE_SYNCOP_ERR(ret);</div><div class='add'>+</div><div class='add'>+    /* Convert back from gf_flock to flock as expected by application */</div><div class='add'>+    gf_flock_to_flock(&amp;gf_flock, flock);</div><div class='add'>+</div><div class='add'>+    if (ret == 0 &amp;&amp; (cmd == F_SETLK || cmd == F_SETLKW)) {</div><div class='add'>+        ret = fd_lk_insert_and_merge(fd, cmd, &amp;saved_flock);</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_smsg(THIS-&gt;name, GF_LOG_ERROR, 0,</div><div class='add'>+                    API_MSG_LOCK_INSERT_MERGE_FAILED, "gfid=%s",</div><div class='add'>+                    uuid_utoa(fd-&gt;inode-&gt;gfid), NULL);</div><div class='add'>+            ret = 0;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (fd)</div><div class='add'>+        fd_unref(fd);</div><div class='add'>+    if (glfd)</div><div class='add'>+        GF_REF_PUT(glfd);</div><div class='add'>+</div><div class='add'>+    glfs_subvol_done(glfd-&gt;fs, subvol);</div><div class='add'>+</div><div class='add'>+    __GLFS_EXIT_FS;</div><div class='add'>+</div><div class='add'>+invalid_fs:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_file_lock, 4.0.0)</div><div class='add'>+int</div><div class='add'>+pub_glfs_file_lock(struct glfs_fd *glfd, int cmd, struct flock *flock,</div><div class='add'>+                   glfs_lock_mode_t lk_mode)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    dict_t *xdata_in = NULL;</div><div class='add'>+</div><div class='add'>+    if (lk_mode == GLFS_LK_MANDATORY) {</div><div class='add'>+        /* Create a new dictionary */</div><div class='add'>+        xdata_in = dict_new();</div><div class='add'>+        if (xdata_in == NULL) {</div><div class='add'>+            ret = -1;</div><div class='add'>+            errno = ENOMEM;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        /* Set GF_LK_MANDATORY internally within dictionary to map</div><div class='add'>+         * GLFS_LK_MANDATORY */</div><div class='add'>+        ret = dict_set_uint32(xdata_in, GF_LOCK_MODE, GF_LK_MANDATORY);</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_smsg(THIS-&gt;name, GF_LOG_ERROR, 0,</div><div class='add'>+                    API_MSG_SETTING_LOCK_TYPE_FAILED, NULL);</div><div class='add'>+            ret = -1;</div><div class='add'>+            errno = ENOMEM;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = glfs_lock_common(glfd, cmd, flock, xdata_in);</div><div class='add'>+out:</div><div class='add'>+    if (xdata_in)</div><div class='add'>+        dict_unref(xdata_in);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_posix_lock, 3.4.0)</div><div class='add'>+int</div><div class='add'>+pub_glfs_posix_lock(struct glfs_fd *glfd, int cmd, struct flock *flock)</div><div class='add'>+{</div><div class='add'>+    return glfs_lock_common(glfd, cmd, flock, NULL);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_fd_set_lkowner, 3.10.7)</div><div class='add'>+int</div><div class='add'>+pub_glfs_fd_set_lkowner(struct glfs_fd *glfd, void *data, int len)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    DECLARE_OLD_THIS;</div><div class='add'>+    __GLFS_ENTRY_VALIDATE_FD(glfd, invalid_fs);</div><div class='add'>+</div><div class='add'>+    if (!GF_REF_GET(glfd)) {</div><div class='add'>+        goto invalid_fs;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    GF_VALIDATE_OR_GOTO(THIS-&gt;name, data, out);</div><div class='add'>+</div><div class='add'>+    if ((len &lt;= 0) || (len &gt; GFAPI_MAX_LOCK_OWNER_LEN)) {</div><div class='add'>+        errno = EINVAL;</div><div class='add'>+        gf_smsg(THIS-&gt;name, GF_LOG_ERROR, errno, API_MSG_INVALID_ARG,</div><div class='add'>+                "lk_owner len=%d", len, NULL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    glfd-&gt;lk_owner.len = len;</div><div class='add'>+</div><div class='add'>+    memcpy(glfd-&gt;lk_owner.data, data, len);</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+out:</div><div class='add'>+    if (glfd)</div><div class='add'>+        GF_REF_PUT(glfd);</div><div class='add'>+</div><div class='add'>+    __GLFS_EXIT_FS;</div><div class='add'>+</div><div class='add'>+invalid_fs:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_dup, 3.4.0)</div><div class='add'>+struct glfs_fd *</div><div class='add'>+pub_glfs_dup(struct glfs_fd *glfd)</div><div class='add'>+{</div><div class='add'>+    xlator_t *subvol = NULL;</div><div class='add'>+    fd_t *fd = NULL;</div><div class='add'>+    struct glfs_fd *dupfd = NULL;</div><div class='add'>+    struct glfs *fs = NULL;</div><div class='add'>+</div><div class='add'>+    DECLARE_OLD_THIS;</div><div class='add'>+    __GLFS_ENTRY_VALIDATE_FD(glfd, invalid_fs);</div><div class='add'>+</div><div class='add'>+    GF_REF_GET(glfd);</div><div class='add'>+</div><div class='add'>+    fs = glfd-&gt;fs;</div><div class='add'>+    subvol = glfs_active_subvol(fs);</div><div class='add'>+    if (!subvol) {</div><div class='add'>+        errno = EIO;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    fd = glfs_resolve_fd(fs, subvol, glfd);</div><div class='add'>+    if (!fd) {</div><div class='add'>+        errno = EBADFD;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    dupfd = glfs_fd_new(fs);</div><div class='add'>+    if (!dupfd) {</div><div class='add'>+        errno = ENOMEM;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    dupfd-&gt;fd = fd_ref(fd);</div><div class='add'>+    dupfd-&gt;state = glfd-&gt;state;</div><div class='add'>+out:</div><div class='add'>+    if (fd)</div><div class='add'>+        fd_unref(fd);</div><div class='add'>+    if (dupfd)</div><div class='add'>+        glfs_fd_bind(dupfd);</div><div class='add'>+    if (glfd)</div><div class='add'>+        GF_REF_PUT(glfd);</div><div class='add'>+</div><div class='add'>+    glfs_subvol_done(fs, subvol);</div><div class='add'>+</div><div class='add'>+    __GLFS_EXIT_FS;</div><div class='add'>+</div><div class='add'>+invalid_fs:</div><div class='add'>+    return dupfd;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+glfs_enqueue_upcall_data(struct glfs *fs, struct gf_upcall *upcall_data)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    upcall_entry *u_list = NULL;</div><div class='add'>+</div><div class='add'>+    if (!fs || !upcall_data)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    u_list = GF_CALLOC(1, sizeof(*u_list), glfs_mt_upcall_entry_t);</div><div class='add'>+</div><div class='add'>+    if (!u_list) {</div><div class='add'>+        gf_smsg(THIS-&gt;name, GF_LOG_ERROR, ENOMEM, API_MSG_ALLOC_FAILED, "entry",</div><div class='add'>+                NULL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    INIT_LIST_HEAD(&amp;u_list-&gt;upcall_list);</div><div class='add'>+</div><div class='add'>+    gf_uuid_copy(u_list-&gt;upcall_data.gfid, upcall_data-&gt;gfid);</div><div class='add'>+    u_list-&gt;upcall_data.event_type = upcall_data-&gt;event_type;</div><div class='add'>+</div><div class='add'>+    switch (upcall_data-&gt;event_type) {</div><div class='add'>+        case GF_UPCALL_CACHE_INVALIDATION:</div><div class='add'>+            ret = glfs_get_upcall_cache_invalidation(&amp;u_list-&gt;upcall_data,</div><div class='add'>+                                                     upcall_data);</div><div class='add'>+            break;</div><div class='add'>+        case GF_UPCALL_RECALL_LEASE:</div><div class='add'>+            ret = glfs_get_upcall_lease(&amp;u_list-&gt;upcall_data, upcall_data);</div><div class='add'>+            break;</div><div class='add'>+        default:</div><div class='add'>+            break;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_smsg(THIS-&gt;name, GF_LOG_ERROR, errno, API_MSG_INVALID_ENTRY, NULL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    pthread_mutex_lock(&amp;fs-&gt;upcall_list_mutex);</div><div class='add'>+    {</div><div class='add'>+        list_add_tail(&amp;u_list-&gt;upcall_list, &amp;fs-&gt;upcall_list);</div><div class='add'>+    }</div><div class='add'>+    pthread_mutex_unlock(&amp;fs-&gt;upcall_list_mutex);</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (ret &amp;&amp; u_list) {</div><div class='add'>+        GF_FREE(u_list-&gt;upcall_data.data);</div><div class='add'>+        GF_FREE(u_list);</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+glfs_free_upcall_lease(void *to_free)</div><div class='add'>+{</div><div class='add'>+    struct glfs_upcall_lease *arg = to_free;</div><div class='add'>+</div><div class='add'>+    if (!arg)</div><div class='add'>+        return;</div><div class='add'>+</div><div class='add'>+    if (arg-&gt;object)</div><div class='add'>+        glfs_h_close(arg-&gt;object);</div><div class='add'>+</div><div class='add'>+    GF_FREE(arg);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+glfs_recall_lease_fd(struct glfs *fs, struct gf_upcall *up_data)</div><div class='add'>+{</div><div class='add'>+    struct gf_upcall_recall_lease *recall_lease = NULL;</div><div class='add'>+    xlator_t *subvol = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    inode_t *inode = NULL;</div><div class='add'>+    struct glfs_fd *glfd = NULL;</div><div class='add'>+    struct glfs_fd *tmp = NULL;</div><div class='add'>+    struct list_head glfd_list;</div><div class='add'>+    fd_t *fd = NULL;</div><div class='add'>+    uint64_t value = 0;</div><div class='add'>+    struct glfs_lease lease = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    GF_VALIDATE_OR_GOTO("gfapi", up_data, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("gfapi", fs, out);</div><div class='add'>+</div><div class='add'>+    recall_lease = up_data-&gt;data;</div><div class='add'>+    GF_VALIDATE_OR_GOTO("gfapi", recall_lease, out);</div><div class='add'>+</div><div class='add'>+    INIT_LIST_HEAD(&amp;glfd_list);</div><div class='add'>+</div><div class='add'>+    subvol = glfs_active_subvol(fs);</div><div class='add'>+    if (!subvol) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        errno = EIO;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    gf_msg_debug(THIS-&gt;name, 0, "Recall lease received for gfid:%s",</div><div class='add'>+                 uuid_utoa(up_data-&gt;gfid));</div><div class='add'>+</div><div class='add'>+    inode = inode_find(subvol-&gt;itable, up_data-&gt;gfid);</div><div class='add'>+    if (!inode) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        gf_smsg(THIS-&gt;name, GF_LOG_ERROR, errno, API_MSG_INODE_FIND_FAILED,</div><div class='add'>+                "gfid=%s", uuid_utoa(up_data-&gt;gfid), "graph_id=%d",</div><div class='add'>+                subvol-&gt;graph-&gt;id, NULL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;inode-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        list_for_each_entry(fd, &amp;inode-&gt;fd_list, inode_list)</div><div class='add'>+        {</div><div class='add'>+            ret = fd_ctx_get(fd, subvol, &amp;value);</div><div class='add'>+            glfd = (struct glfs_fd *)(uintptr_t)value;</div><div class='add'>+            if (glfd) {</div><div class='add'>+                gf_msg_trace(THIS-&gt;name, 0, "glfd (%p) has held lease", glfd);</div><div class='add'>+                GF_REF_GET(glfd);</div><div class='add'>+                list_add_tail(&amp;glfd-&gt;list, &amp;glfd_list);</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    UNLOCK(&amp;inode-&gt;lock);</div><div class='add'>+</div><div class='add'>+    if (!list_empty(&amp;glfd_list)) {</div><div class='add'>+        list_for_each_entry_safe(glfd, tmp, &amp;glfd_list, list)</div><div class='add'>+        {</div><div class='add'>+            LOCK(&amp;glfd-&gt;lock);</div><div class='add'>+            {</div><div class='add'>+                if (glfd-&gt;state != GLFD_CLOSE) {</div><div class='add'>+                    gf_msg_trace(THIS-&gt;name, 0,</div><div class='add'>+                                 "glfd (%p) has held lease, "</div><div class='add'>+                                 "calling recall cbk",</div><div class='add'>+                                 glfd);</div><div class='add'>+                    glfd-&gt;cbk(lease, glfd-&gt;cookie);</div><div class='add'>+                }</div><div class='add'>+            }</div><div class='add'>+            UNLOCK(&amp;glfd-&gt;lock);</div><div class='add'>+</div><div class='add'>+            list_del_init(&amp;glfd-&gt;list);</div><div class='add'>+            GF_REF_PUT(glfd);</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+glfs_recall_lease_upcall(struct glfs *fs, struct glfs_upcall *up_arg,</div><div class='add'>+                         struct gf_upcall *up_data)</div><div class='add'>+{</div><div class='add'>+    struct gf_upcall_recall_lease *recall_lease = NULL;</div><div class='add'>+    struct glfs_object *object = NULL;</div><div class='add'>+    xlator_t *subvol = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    struct glfs_upcall_lease *up_lease_arg = NULL;</div><div class='add'>+</div><div class='add'>+    GF_VALIDATE_OR_GOTO("gfapi", up_data, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("gfapi", fs, out);</div><div class='add'>+</div><div class='add'>+    recall_lease = up_data-&gt;data;</div><div class='add'>+    GF_VALIDATE_OR_GOTO("gfapi", recall_lease, out);</div><div class='add'>+</div><div class='add'>+    subvol = glfs_active_subvol(fs);</div><div class='add'>+    if (!subvol) {</div><div class='add'>+        errno = EIO;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    gf_msg_debug(THIS-&gt;name, 0, "Recall lease received for gfid:%s",</div><div class='add'>+                 uuid_utoa(up_data-&gt;gfid));</div><div class='add'>+</div><div class='add'>+    object = glfs_h_find_handle(fs, up_data-&gt;gfid, GFAPI_HANDLE_LENGTH);</div><div class='add'>+    if (!object) {</div><div class='add'>+        /* The reason handle creation will fail is because we</div><div class='add'>+         * couldn't find the inode in the gfapi inode table.</div><div class='add'>+         *</div><div class='add'>+         * But since application would have taken inode_ref, the</div><div class='add'>+         * only case when this can happen is when it has closed</div><div class='add'>+         * the handle and hence will no more be interested in</div><div class='add'>+         * the upcall for this particular gfid.</div><div class='add'>+         */</div><div class='add'>+        gf_smsg(THIS-&gt;name, GF_LOG_DEBUG, errno, API_MSG_CREATE_HANDLE_FAILED,</div><div class='add'>+                "gfid=%s", uuid_utoa(up_data-&gt;gfid), NULL);</div><div class='add'>+        errno = ESTALE;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    up_lease_arg = GF_CALLOC(1, sizeof(struct glfs_upcall_lease),</div><div class='add'>+                             glfs_mt_upcall_inode_t);</div><div class='add'>+    up_lease_arg-&gt;object = object;</div><div class='add'>+</div><div class='add'>+    GF_VALIDATE_OR_GOTO("glfs_recall_lease", up_lease_arg, out);</div><div class='add'>+</div><div class='add'>+    up_lease_arg-&gt;lease_type = recall_lease-&gt;lease_type;</div><div class='add'>+</div><div class='add'>+    up_arg-&gt;reason = GLFS_UPCALL_RECALL_LEASE;</div><div class='add'>+    up_arg-&gt;event = up_lease_arg;</div><div class='add'>+    up_arg-&gt;free_event = glfs_free_upcall_lease;</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (ret) {</div><div class='add'>+        /* Close p_object and oldp_object as well if being referenced.*/</div><div class='add'>+        if (object)</div><div class='add'>+            glfs_h_close(object);</div><div class='add'>+</div><div class='add'>+        /* Set reason to prevent applications from using -&gt;event */</div><div class='add'>+        up_arg-&gt;reason = GF_UPCALL_EVENT_NULL;</div><div class='add'>+    }</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+upcall_syncop_args_free(struct upcall_syncop_args *args)</div><div class='add'>+{</div><div class='add'>+    dict_t *dict = NULL;</div><div class='add'>+    struct gf_upcall *upcall_data = NULL;</div><div class='add'>+</div><div class='add'>+    if (args) {</div><div class='add'>+        upcall_data = &amp;args-&gt;upcall_data;</div><div class='add'>+        switch (upcall_data-&gt;event_type) {</div><div class='add'>+            case GF_UPCALL_CACHE_INVALIDATION:</div><div class='add'>+                dict = ((struct gf_upcall_cache_invalidation *)(upcall_data</div><div class='add'>+                                                                    -&gt;data))</div><div class='add'>+                           -&gt;dict;</div><div class='add'>+                break;</div><div class='add'>+            case GF_UPCALL_RECALL_LEASE:</div><div class='add'>+                dict = ((struct gf_upcall_recall_lease *)(upcall_data-&gt;data))</div><div class='add'>+                           -&gt;dict;</div><div class='add'>+                break;</div><div class='add'>+        }</div><div class='add'>+        if (dict)</div><div class='add'>+            dict_unref(dict);</div><div class='add'>+</div><div class='add'>+        GF_FREE(upcall_data-&gt;client_uid);</div><div class='add'>+        GF_FREE(upcall_data-&gt;data);</div><div class='add'>+    }</div><div class='add'>+    GF_FREE(args);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+glfs_upcall_syncop_cbk(int ret, call_frame_t *frame, void *opaque)</div><div class='add'>+{</div><div class='add'>+    struct upcall_syncop_args *args = opaque;</div><div class='add'>+</div><div class='add'>+    (void)upcall_syncop_args_free(args);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+glfs_cbk_upcall_syncop(void *opaque)</div><div class='add'>+{</div><div class='add'>+    struct upcall_syncop_args *args = opaque;</div><div class='add'>+    struct gf_upcall *upcall_data = NULL;</div><div class='add'>+    struct glfs_upcall *up_arg = NULL;</div><div class='add'>+    struct glfs *fs;</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    fs = args-&gt;fs;</div><div class='add'>+    upcall_data = &amp;args-&gt;upcall_data;</div><div class='add'>+</div><div class='add'>+    if (!upcall_data) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    up_arg = GLFS_CALLOC(1, sizeof(struct gf_upcall), glfs_release_upcall,</div><div class='add'>+                         glfs_mt_upcall_entry_t);</div><div class='add'>+    if (!up_arg) {</div><div class='add'>+        gf_smsg(THIS-&gt;name, GF_LOG_ERROR, ENOMEM, API_MSG_ALLOC_FAILED, "entry",</div><div class='add'>+                NULL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    switch (upcall_data-&gt;event_type) {</div><div class='add'>+        case GF_UPCALL_CACHE_INVALIDATION:</div><div class='add'>+            ret = glfs_h_poll_cache_invalidation(fs, up_arg, upcall_data);</div><div class='add'>+            break;</div><div class='add'>+        case GF_UPCALL_RECALL_LEASE:</div><div class='add'>+            ret = glfs_recall_lease_upcall(fs, up_arg, upcall_data);</div><div class='add'>+            break;</div><div class='add'>+        default:</div><div class='add'>+            errno = EINVAL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* It could so happen that the file which got</div><div class='add'>+     * upcall notification may have got deleted by</div><div class='add'>+     * the same client. In such cases up_arg-&gt;reason</div><div class='add'>+     * is set to GLFS_UPCALL_EVENT_NULL. No need to</div><div class='add'>+     * send upcall then</div><div class='add'>+     */</div><div class='add'>+    if (up_arg-&gt;reason == GLFS_UPCALL_EVENT_NULL) {</div><div class='add'>+        gf_smsg(THIS-&gt;name, GF_LOG_DEBUG, errno,</div><div class='add'>+                API_MSG_UPCALL_EVENT_NULL_RECEIVED, NULL);</div><div class='add'>+        ret = 0;</div><div class='add'>+        GLFS_FREE(up_arg);</div><div class='add'>+        goto out;</div><div class='add'>+    } else if (ret) {</div><div class='add'>+        gf_smsg(THIS-&gt;name, GF_LOG_ERROR, errno, API_MSG_INVALID_ENTRY, NULL);</div><div class='add'>+        GLFS_FREE(up_arg);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (fs-&gt;up_cbk &amp;&amp; up_arg)</div><div class='add'>+        (fs-&gt;up_cbk)(up_arg, fs-&gt;up_data);</div><div class='add'>+</div><div class='add'>+    /* application takes care of calling glfs_free on up_arg post</div><div class='add'>+     * their processing */</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static struct gf_upcall_cache_invalidation *</div><div class='add'>+gf_copy_cache_invalidation(struct gf_upcall_cache_invalidation *src)</div><div class='add'>+{</div><div class='add'>+    struct gf_upcall_cache_invalidation *dst = NULL;</div><div class='add'>+</div><div class='add'>+    if (!src)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    dst = GF_CALLOC(1, sizeof(struct gf_upcall_cache_invalidation),</div><div class='add'>+                    glfs_mt_upcall_entry_t);</div><div class='add'>+</div><div class='add'>+    if (!dst) {</div><div class='add'>+        gf_smsg(THIS-&gt;name, GF_LOG_ERROR, ENOMEM, API_MSG_ALLOC_FAILED, "entry",</div><div class='add'>+                NULL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    dst-&gt;flags = src-&gt;flags;</div><div class='add'>+    dst-&gt;expire_time_attr = src-&gt;expire_time_attr;</div><div class='add'>+    dst-&gt;stat = src-&gt;stat;</div><div class='add'>+    dst-&gt;p_stat = src-&gt;p_stat;</div><div class='add'>+    dst-&gt;oldp_stat = src-&gt;oldp_stat;</div><div class='add'>+</div><div class='add'>+    if (src-&gt;dict)</div><div class='add'>+        dst-&gt;dict = dict_copy_with_ref(src-&gt;dict, NULL);</div><div class='add'>+</div><div class='add'>+    return dst;</div><div class='add'>+out:</div><div class='add'>+    return NULL;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static struct gf_upcall_recall_lease *</div><div class='add'>+gf_copy_recall_lease(struct gf_upcall_recall_lease *src)</div><div class='add'>+{</div><div class='add'>+    struct gf_upcall_recall_lease *dst = NULL;</div><div class='add'>+</div><div class='add'>+    if (!src)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    dst = GF_CALLOC(1, sizeof(struct gf_upcall_recall_lease),</div><div class='add'>+                    glfs_mt_upcall_entry_t);</div><div class='add'>+</div><div class='add'>+    if (!dst) {</div><div class='add'>+        gf_smsg(THIS-&gt;name, GF_LOG_ERROR, ENOMEM, API_MSG_ALLOC_FAILED, "entry",</div><div class='add'>+                NULL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    dst-&gt;lease_type = src-&gt;lease_type;</div><div class='add'>+    memcpy(dst-&gt;tid, src-&gt;tid, 16);</div><div class='add'>+</div><div class='add'>+    if (src-&gt;dict)</div><div class='add'>+        dst-&gt;dict = dict_copy_with_ref(src-&gt;dict, NULL);</div><div class='add'>+</div><div class='add'>+    return dst;</div><div class='add'>+out:</div><div class='add'>+    return NULL;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static struct upcall_syncop_args *</div><div class='add'>+upcall_syncop_args_init(struct glfs *fs, struct gf_upcall *upcall_data)</div><div class='add'>+{</div><div class='add'>+    struct upcall_syncop_args *args = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    struct gf_upcall *t_data = NULL;</div><div class='add'>+</div><div class='add'>+    if (!fs || !upcall_data)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    args = GF_CALLOC(1, sizeof(struct upcall_syncop_args),</div><div class='add'>+                     glfs_mt_upcall_entry_t);</div><div class='add'>+    if (!args) {</div><div class='add'>+        gf_smsg(THIS-&gt;name, GF_LOG_ERROR, ENOMEM, API_MSG_ALLOC_FAILED,</div><div class='add'>+                "syncop args", NULL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Note: we are not taking any ref on fs here.</div><div class='add'>+     * Ideally applications have to unregister for upcall events</div><div class='add'>+     * or stop polling for upcall events before performing</div><div class='add'>+     * glfs_fini. And as for outstanding synctasks created, we wait</div><div class='add'>+     * for all syncenv threads to finish tasks before cleaning up the</div><div class='add'>+     * fs-&gt;ctx. Hence it seems safe to process these callback</div><div class='add'>+     * notification without taking any lock/ref.</div><div class='add'>+     */</div><div class='add'>+    args-&gt;fs = fs;</div><div class='add'>+    t_data = &amp;(args-&gt;upcall_data);</div><div class='add'>+    t_data-&gt;client_uid = gf_strdup(upcall_data-&gt;client_uid);</div><div class='add'>+</div><div class='add'>+    gf_uuid_copy(t_data-&gt;gfid, upcall_data-&gt;gfid);</div><div class='add'>+    t_data-&gt;event_type = upcall_data-&gt;event_type;</div><div class='add'>+</div><div class='add'>+    switch (t_data-&gt;event_type) {</div><div class='add'>+        case GF_UPCALL_CACHE_INVALIDATION:</div><div class='add'>+            t_data-&gt;data = gf_copy_cache_invalidation(</div><div class='add'>+                (struct gf_upcall_cache_invalidation *)upcall_data-&gt;data);</div><div class='add'>+            break;</div><div class='add'>+        case GF_UPCALL_RECALL_LEASE:</div><div class='add'>+            t_data-&gt;data = gf_copy_recall_lease(</div><div class='add'>+                (struct gf_upcall_recall_lease *)upcall_data-&gt;data);</div><div class='add'>+            break;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (!t_data-&gt;data)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    return args;</div><div class='add'>+out:</div><div class='add'>+    if (ret) {</div><div class='add'>+        if (args) {</div><div class='add'>+            GF_FREE(args-&gt;upcall_data.client_uid);</div><div class='add'>+            GF_FREE(args);</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return NULL;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+glfs_cbk_upcall_data(struct glfs *fs, struct gf_upcall *upcall_data)</div><div class='add'>+{</div><div class='add'>+    struct upcall_syncop_args *args = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    if (!fs || !upcall_data)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    if (!(fs-&gt;upcall_events &amp; upcall_data-&gt;event_type)) {</div><div class='add'>+        /* ignore events which application hasn't registered*/</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    args = upcall_syncop_args_init(fs, upcall_data);</div><div class='add'>+</div><div class='add'>+    if (!args)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    ret = synctask_new(THIS-&gt;ctx-&gt;env, glfs_cbk_upcall_syncop,</div><div class='add'>+                       glfs_upcall_syncop_cbk, NULL, args);</div><div class='add'>+    /* should we retry incase of failure? */</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_smsg(THIS-&gt;name, GF_LOG_ERROR, errno, API_MSG_UPCALL_SYNCOP_FAILED,</div><div class='add'>+                "event_type=%d", upcall_data-&gt;event_type, "gfid=%s",</div><div class='add'>+                (char *)(upcall_data-&gt;gfid), NULL);</div><div class='add'>+        upcall_syncop_args_free(args);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+ * This routine is called in case of any notification received</div><div class='add'>+ * from the server. All the upcall events are queued up in a list</div><div class='add'>+ * to be read by the applications.</div><div class='add'>+ *</div><div class='add'>+ * In case if the application registers a cbk function, that shall</div><div class='add'>+ * be called by this routine in case of any event received.</div><div class='add'>+ * The cbk fn is responsible for notifying the</div><div class='add'>+ * applications the way it desires for each event queued (for eg.,</div><div class='add'>+ * can raise a signal or broadcast a cond variable etc.)</div><div class='add'>+ *</div><div class='add'>+ * Otherwise all the upcall events are queued up in a list</div><div class='add'>+ * to be read/polled by the applications.</div><div class='add'>+ */</div><div class='add'>+GFAPI_SYMVER_PRIVATE_DEFAULT(glfs_process_upcall_event, 3.7.0)</div><div class='add'>+void</div><div class='add'>+priv_glfs_process_upcall_event(struct glfs *fs, void *data)</div><div class='add'>+{</div><div class='add'>+    glusterfs_ctx_t *ctx = NULL;</div><div class='add'>+    struct gf_upcall *upcall_data = NULL;</div><div class='add'>+</div><div class='add'>+    DECLARE_OLD_THIS;</div><div class='add'>+</div><div class='add'>+    gf_msg_debug(THIS-&gt;name, 0, "Upcall gfapi callback is called");</div><div class='add'>+</div><div class='add'>+    __GLFS_ENTRY_VALIDATE_FS(fs, err);</div><div class='add'>+</div><div class='add'>+    if (!data)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    /* Unlike in I/O path, "glfs_fini" would not have freed</div><div class='add'>+     * 'fs' by the time we take lock as it waits for all epoll</div><div class='add'>+     * threads to exit including this</div><div class='add'>+     */</div><div class='add'>+    pthread_mutex_lock(&amp;fs-&gt;mutex);</div><div class='add'>+    {</div><div class='add'>+        ctx = fs-&gt;ctx;</div><div class='add'>+</div><div class='add'>+        /* if we're not interested in upcalls (anymore), skip them */</div><div class='add'>+        if (ctx-&gt;cleanup_started || !fs-&gt;cache_upcalls) {</div><div class='add'>+            pthread_mutex_unlock(&amp;fs-&gt;mutex);</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        fs-&gt;pin_refcnt++;</div><div class='add'>+    }</div><div class='add'>+    pthread_mutex_unlock(&amp;fs-&gt;mutex);</div><div class='add'>+</div><div class='add'>+    upcall_data = (struct gf_upcall *)data;</div><div class='add'>+</div><div class='add'>+    gf_msg_trace(THIS-&gt;name, 0, "Upcall gfapi gfid = %s",</div><div class='add'>+                 (char *)(upcall_data-&gt;gfid));</div><div class='add'>+</div><div class='add'>+    /* *</div><div class='add'>+     * TODO: RECALL LEASE for each glfd</div><div class='add'>+     *</div><div class='add'>+     * In case of RECALL_LEASE, we could associate separate</div><div class='add'>+     * cbk function for each glfd either by</div><div class='add'>+     * - extending pub_glfs_lease to accept new args (recall_cbk_fn, cookie)</div><div class='add'>+     * - or by defining new API "glfs_register_recall_cbk_fn (glfd,</div><div class='add'>+     * recall_cbk_fn, cookie) . In such cases, flag it and instead of calling</div><div class='add'>+     * below upcall functions, define a new one to go through the glfd list and</div><div class='add'>+     * invoke each of theirs recall_cbk_fn.</div><div class='add'>+     * */</div><div class='add'>+</div><div class='add'>+    if (fs-&gt;up_cbk) { /* upcall cbk registered */</div><div class='add'>+        (void)glfs_cbk_upcall_data(fs, upcall_data);</div><div class='add'>+    } else {</div><div class='add'>+        (void)glfs_enqueue_upcall_data(fs, upcall_data);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    pthread_mutex_lock(&amp;fs-&gt;mutex);</div><div class='add'>+    {</div><div class='add'>+        fs-&gt;pin_refcnt--;</div><div class='add'>+    }</div><div class='add'>+    pthread_mutex_unlock(&amp;fs-&gt;mutex);</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    __GLFS_EXIT_FS;</div><div class='add'>+err:</div><div class='add'>+    return;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+ssize_t</div><div class='add'>+glfs_anonymous_pwritev(struct glfs *fs, struct glfs_object *object,</div><div class='add'>+                       const struct iovec *iovec, int iovcnt, off_t offset,</div><div class='add'>+                       int flags)</div><div class='add'>+{</div><div class='add'>+    xlator_t *subvol = NULL;</div><div class='add'>+    struct iobref *iobref = NULL;</div><div class='add'>+    struct iobuf *iobuf = NULL;</div><div class='add'>+    struct iovec iov = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    inode_t *inode = NULL;</div><div class='add'>+    fd_t *fd = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    size_t size = -1;</div><div class='add'>+</div><div class='add'>+    DECLARE_OLD_THIS;</div><div class='add'>+    __GLFS_ENTRY_VALIDATE_FS(fs, invalid_fs);</div><div class='add'>+</div><div class='add'>+    subvol = glfs_active_subvol(fs);</div><div class='add'>+    if (!subvol) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        errno = EIO;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* get/refresh the in arg objects inode in correlation to the xlator */</div><div class='add'>+    inode = glfs_resolve_inode(fs, subvol, object);</div><div class='add'>+    if (!inode) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        errno = ESTALE;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    fd = fd_anonymous(inode);</div><div class='add'>+    if (!fd) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        gf_smsg("gfapi", GF_LOG_ERROR, ENOMEM, API_MSG_FDCREATE_FAILED, NULL);</div><div class='add'>+        errno = ENOMEM;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    size = iov_length(iovec, iovcnt);</div><div class='add'>+</div><div class='add'>+    iobuf = iobuf_get2(subvol-&gt;ctx-&gt;iobuf_pool, size);</div><div class='add'>+    if (!iobuf) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        errno = ENOMEM;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    iobref = iobref_new();</div><div class='add'>+    if (!iobref) {</div><div class='add'>+        iobuf_unref(iobuf);</div><div class='add'>+        errno = ENOMEM;</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = iobref_add(iobref, iobuf);</div><div class='add'>+    if (ret) {</div><div class='add'>+        iobuf_unref(iobuf);</div><div class='add'>+        iobref_unref(iobref);</div><div class='add'>+        errno = ENOMEM;</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    iov_unload(iobuf_ptr(iobuf), iovec, iovcnt);</div><div class='add'>+</div><div class='add'>+    iov.iov_base = iobuf_ptr(iobuf);</div><div class='add'>+    iov.iov_len = size;</div><div class='add'>+</div><div class='add'>+    /* TODO : set leaseid */</div><div class='add'>+    ret = syncop_writev(subvol, fd, &amp;iov, 1, offset, iobref, flags, NULL, NULL,</div><div class='add'>+                        NULL, NULL);</div><div class='add'>+    DECODE_SYNCOP_ERR(ret);</div><div class='add'>+</div><div class='add'>+    iobuf_unref(iobuf);</div><div class='add'>+    iobref_unref(iobref);</div><div class='add'>+</div><div class='add'>+    if (ret &lt;= 0)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+</div><div class='add'>+    if (fd)</div><div class='add'>+        fd_unref(fd);</div><div class='add'>+</div><div class='add'>+    if (inode)</div><div class='add'>+        inode_unref(inode);</div><div class='add'>+</div><div class='add'>+    glfs_subvol_done(fs, subvol);</div><div class='add'>+</div><div class='add'>+    __GLFS_EXIT_FS;</div><div class='add'>+</div><div class='add'>+invalid_fs:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+ssize_t</div><div class='add'>+glfs_anonymous_preadv(struct glfs *fs, struct glfs_object *object,</div><div class='add'>+                      const struct iovec *iovec, int iovcnt, off_t offset,</div><div class='add'>+                      int flags)</div><div class='add'>+{</div><div class='add'>+    xlator_t *subvol = NULL;</div><div class='add'>+    struct iovec *iov = NULL;</div><div class='add'>+    struct iobref *iobref = NULL;</div><div class='add'>+    inode_t *inode = NULL;</div><div class='add'>+    fd_t *fd = NULL;</div><div class='add'>+    int cnt = 0;</div><div class='add'>+    ssize_t ret = -1;</div><div class='add'>+    ssize_t size = -1;</div><div class='add'>+</div><div class='add'>+    DECLARE_OLD_THIS;</div><div class='add'>+    __GLFS_ENTRY_VALIDATE_FS(fs, invalid_fs);</div><div class='add'>+</div><div class='add'>+    subvol = glfs_active_subvol(fs);</div><div class='add'>+    if (!subvol) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        errno = EIO;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* get/refresh the in arg objects inode in correlation to the xlator */</div><div class='add'>+    inode = glfs_resolve_inode(fs, subvol, object);</div><div class='add'>+    if (!inode) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        errno = ESTALE;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    fd = fd_anonymous(inode);</div><div class='add'>+    if (!fd) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        gf_smsg("gfapi", GF_LOG_ERROR, ENOMEM, API_MSG_FDCREATE_FAILED, NULL);</div><div class='add'>+        errno = ENOMEM;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    size = iov_length(iovec, iovcnt);</div><div class='add'>+</div><div class='add'>+    /* TODO : set leaseid */</div><div class='add'>+    ret = syncop_readv(subvol, fd, size, offset, flags, &amp;iov, &amp;cnt, &amp;iobref,</div><div class='add'>+                       NULL, NULL, NULL);</div><div class='add'>+    DECODE_SYNCOP_ERR(ret);</div><div class='add'>+    if (ret &lt;= 0)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    size = iov_copy(iovec, iovcnt, iov, cnt);</div><div class='add'>+</div><div class='add'>+    ret = size;</div><div class='add'>+out:</div><div class='add'>+    if (iov)</div><div class='add'>+        GF_FREE(iov);</div><div class='add'>+    if (iobref)</div><div class='add'>+        iobref_unref(iobref);</div><div class='add'>+    if (fd)</div><div class='add'>+        fd_unref(fd);</div><div class='add'>+</div><div class='add'>+    if (inode)</div><div class='add'>+        inode_unref(inode);</div><div class='add'>+</div><div class='add'>+    glfs_subvol_done(fs, subvol);</div><div class='add'>+</div><div class='add'>+    __GLFS_EXIT_FS;</div><div class='add'>+</div><div class='add'>+invalid_fs:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+glfs_release_xreaddirp_stat(void *ptr)</div><div class='add'>+{</div><div class='add'>+    struct glfs_xreaddirp_stat *to_free = ptr;</div><div class='add'>+</div><div class='add'>+    if (to_free-&gt;object)</div><div class='add'>+        glfs_h_close(to_free-&gt;object);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+ * Given glfd of a directory, this function does readdirp and returns</div><div class='add'>+ * xstat along with dirents.</div><div class='add'>+ */</div><div class='add'>+GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_xreaddirplus_r, 3.11.0)</div><div class='add'>+int</div><div class='add'>+pub_glfs_xreaddirplus_r(struct glfs_fd *glfd, uint32_t flags,</div><div class='add'>+                        struct glfs_xreaddirp_stat **xstat_p,</div><div class='add'>+                        struct dirent *ext, struct dirent **res)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    gf_dirent_t *entry = NULL;</div><div class='add'>+    struct dirent *buf = NULL;</div><div class='add'>+    struct glfs_xreaddirp_stat *xstat = NULL;</div><div class='add'>+</div><div class='add'>+    DECLARE_OLD_THIS;</div><div class='add'>+    __GLFS_ENTRY_VALIDATE_FD(glfd, invalid_fs);</div><div class='add'>+</div><div class='add'>+    GF_REF_GET(glfd);</div><div class='add'>+</div><div class='add'>+    GF_VALIDATE_OR_GOTO(THIS-&gt;name, xstat_p, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(THIS-&gt;name, res, out);</div><div class='add'>+</div><div class='add'>+    errno = 0;</div><div class='add'>+</div><div class='add'>+    if (ext)</div><div class='add'>+        buf = ext;</div><div class='add'>+    else</div><div class='add'>+        buf = glfs_readdirbuf_get(glfd);</div><div class='add'>+</div><div class='add'>+    if (!buf)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    xstat = GLFS_CALLOC(1, sizeof(struct glfs_xreaddirp_stat),</div><div class='add'>+                        glfs_release_xreaddirp_stat, glfs_mt_xreaddirp_stat_t);</div><div class='add'>+</div><div class='add'>+    if (!xstat)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    /* this is readdirplus operation */</div><div class='add'>+    entry = glfd_entry_next(glfd, 1);</div><div class='add'>+</div><div class='add'>+    /* XXX: Ideally when we reach EOD, errno should have been</div><div class='add'>+     * set to ENOENT. But that doesn't seem to be the case.</div><div class='add'>+     *</div><div class='add'>+     * The only way to confirm if its EOD at this point is that</div><div class='add'>+     * errno == 0 and entry == NULL</div><div class='add'>+     */</div><div class='add'>+    if (errno)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    if (!entry) {</div><div class='add'>+        /* reached EOD, ret = 0  */</div><div class='add'>+        ret = 0;</div><div class='add'>+        *res = NULL;</div><div class='add'>+        *xstat_p = NULL;</div><div class='add'>+</div><div class='add'>+        /* free xstat as applications shall not be using it */</div><div class='add'>+        GLFS_FREE(xstat);</div><div class='add'>+</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    *res = buf;</div><div class='add'>+    gf_dirent_to_dirent(entry, buf);</div><div class='add'>+</div><div class='add'>+    if (flags &amp; GFAPI_XREADDIRP_STAT) {</div><div class='add'>+        glfs_iatt_to_stat(glfd-&gt;fs, &amp;entry-&gt;d_stat, &amp;xstat-&gt;st);</div><div class='add'>+        xstat-&gt;flags_handled |= GFAPI_XREADDIRP_STAT;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if ((flags &amp; GFAPI_XREADDIRP_HANDLE) &amp;&amp;</div><div class='add'>+        /* skip . and .. */</div><div class='add'>+        strcmp(buf-&gt;d_name, ".") &amp;&amp; strcmp(buf-&gt;d_name, "..")) {</div><div class='add'>+        /* Now create object.</div><div class='add'>+         * We can use "glfs_h_find_handle" as well as inodes would have</div><div class='add'>+         * already got linked as part of 'gf_link_inodes_from_dirent' */</div><div class='add'>+        xstat-&gt;object = glfs_h_create_from_handle(</div><div class='add'>+            glfd-&gt;fs, entry-&gt;d_stat.ia_gfid, GFAPI_HANDLE_LENGTH, NULL);</div><div class='add'>+</div><div class='add'>+        if (xstat-&gt;object) { /* success */</div><div class='add'>+            /* note: xstat-&gt;object-&gt;inode-&gt;ref is taken</div><div class='add'>+             * This shall be unref'ed when application does</div><div class='add'>+             * glfs_free(xstat) */</div><div class='add'>+            xstat-&gt;flags_handled |= GFAPI_XREADDIRP_HANDLE;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = xstat-&gt;flags_handled;</div><div class='add'>+    *xstat_p = xstat;</div><div class='add'>+</div><div class='add'>+    gf_msg_debug(THIS-&gt;name, 0,</div><div class='add'>+                 "xreaddirp- requested_flags (%x) , processed_flags (%x)",</div><div class='add'>+                 flags, xstat-&gt;flags_handled);</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    GF_REF_PUT(glfd);</div><div class='add'>+</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        gf_smsg(THIS-&gt;name, GF_LOG_WARNING, errno, API_MSG_XREADDIRP_R_FAILED,</div><div class='add'>+                "reason=%s", strerror(errno), NULL);</div><div class='add'>+</div><div class='add'>+        if (xstat)</div><div class='add'>+            GLFS_FREE(xstat);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    __GLFS_EXIT_FS;</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+</div><div class='add'>+invalid_fs:</div><div class='add'>+    return -1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_xreaddirplus_get_stat, 3.11.0)</div><div class='add'>+struct stat *</div><div class='add'>+pub_glfs_xreaddirplus_get_stat(struct glfs_xreaddirp_stat *xstat)</div><div class='add'>+{</div><div class='add'>+    GF_VALIDATE_OR_GOTO("glfs_xreaddirplus_get_stat", xstat, out);</div><div class='add'>+</div><div class='add'>+    if (!xstat-&gt;flags_handled &amp; GFAPI_XREADDIRP_STAT)</div><div class='add'>+        gf_smsg(THIS-&gt;name, GF_LOG_ERROR, errno, API_MSG_FLAGS_HANDLE,</div><div class='add'>+                "GFAPI_XREADDIRP_STAT"</div><div class='add'>+                "xstat=%p",</div><div class='add'>+                xstat, "handles=%x", xstat-&gt;flags_handled, NULL);</div><div class='add'>+    return &amp;xstat-&gt;st;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return NULL;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+gf_lease_to_glfs_lease(struct gf_lease *gf_lease, struct glfs_lease *lease)</div><div class='add'>+{</div><div class='add'>+    u_int lease_type = gf_lease-&gt;lease_type;</div><div class='add'>+    lease-&gt;cmd = gf_lease-&gt;cmd;</div><div class='add'>+    lease-&gt;lease_type = lease_type;</div><div class='add'>+    memcpy(lease-&gt;lease_id, gf_lease-&gt;lease_id, LEASE_ID_SIZE);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+glfs_lease_to_gf_lease(struct glfs_lease *lease, struct gf_lease *gf_lease)</div><div class='add'>+{</div><div class='add'>+    u_int lease_type = lease-&gt;lease_type;</div><div class='add'>+    gf_lease-&gt;cmd = lease-&gt;cmd;</div><div class='add'>+    gf_lease-&gt;lease_type = lease_type;</div><div class='add'>+    memcpy(gf_lease-&gt;lease_id, lease-&gt;lease_id, LEASE_ID_SIZE);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_lease, 4.0.0)</div><div class='add'>+int</div><div class='add'>+pub_glfs_lease(struct glfs_fd *glfd, struct glfs_lease *lease,</div><div class='add'>+               glfs_recall_cbk fn, void *data)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    loc_t loc = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    xlator_t *subvol = NULL;</div><div class='add'>+    fd_t *fd = NULL;</div><div class='add'>+    struct gf_lease gf_lease = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    DECLARE_OLD_THIS;</div><div class='add'>+    __GLFS_ENTRY_VALIDATE_FD(glfd, invalid_fs);</div><div class='add'>+</div><div class='add'>+    GF_REF_GET(glfd);</div><div class='add'>+</div><div class='add'>+    if (!is_valid_lease_id(lease-&gt;lease_id)) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        errno = EINVAL;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    subvol = glfs_active_subvol(glfd-&gt;fs);</div><div class='add'>+    if (!subvol) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        errno = EIO;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    fd = glfs_resolve_fd(glfd-&gt;fs, subvol, glfd);</div><div class='add'>+    if (!fd) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        errno = EBADFD;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    switch (lease-&gt;lease_type) {</div><div class='add'>+        case GLFS_RD_LEASE:</div><div class='add'>+            if ((fd-&gt;flags != O_RDONLY) &amp;&amp; !(fd-&gt;flags &amp; O_RDWR)) {</div><div class='add'>+                ret = -1;</div><div class='add'>+                errno = EINVAL;</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+            break;</div><div class='add'>+        case GLFS_RW_LEASE:</div><div class='add'>+            if (!((fd-&gt;flags &amp; O_WRONLY) || (fd-&gt;flags &amp; O_RDWR))) {</div><div class='add'>+                ret = -1;</div><div class='add'>+                errno = EINVAL;</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+            break;</div><div class='add'>+        default:</div><div class='add'>+            if (lease-&gt;cmd != GLFS_GET_LEASE) {</div><div class='add'>+                ret = -1;</div><div class='add'>+                errno = EINVAL;</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+            break;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* populate loc */</div><div class='add'>+    GLFS_LOC_FILL_INODE(fd-&gt;inode, loc, out);</div><div class='add'>+</div><div class='add'>+    glfs_lease_to_gf_lease(lease, &amp;gf_lease);</div><div class='add'>+</div><div class='add'>+    ret = syncop_lease(subvol, &amp;loc, &amp;gf_lease, NULL, NULL);</div><div class='add'>+    DECODE_SYNCOP_ERR(ret);</div><div class='add'>+</div><div class='add'>+    gf_lease_to_glfs_lease(&amp;gf_lease, lease);</div><div class='add'>+</div><div class='add'>+    /* TODO: Add leases for client replay</div><div class='add'>+    if (ret == 0 &amp;&amp; (cmd == F_SETLK || cmd == F_SETLKW))</div><div class='add'>+            fd_lk_insert_and_merge (fd, cmd, &amp;saved_flock);</div><div class='add'>+    */</div><div class='add'>+    if (ret == 0) {</div><div class='add'>+        ret = fd_ctx_set(glfd-&gt;fd, subvol, (uint64_t)(long)glfd);</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_smsg(subvol-&gt;name, GF_LOG_ERROR, ENOMEM,</div><div class='add'>+                    API_MSG_FDCTX_SET_FAILED, "fd=%p", glfd-&gt;fd, NULL);</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+        glfd-&gt;cbk = fn;</div><div class='add'>+        glfd-&gt;cookie = data;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+</div><div class='add'>+    if (glfd)</div><div class='add'>+        GF_REF_PUT(glfd);</div><div class='add'>+</div><div class='add'>+    if (subvol)</div><div class='add'>+        glfs_subvol_done(glfd-&gt;fs, subvol);</div><div class='add'>+</div><div class='add'>+    __GLFS_EXIT_FS;</div><div class='add'>+</div><div class='add'>+invalid_fs:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='head'>diff --git a/api/src/glfs-handleops.c b/api/src/glfs-handleops.c<br/>new file mode 100644<br/>index 00000000000..53c2ee896f9<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/api/src/glfs-handleops.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>api/src/glfs-handleops.c</a></div><div class='hunk'>@@ -0,0 +1,2655 @@</div><div class='add'>+/*</div><div class='add'>+ *  Copyright (c) 2013-2018 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+ *  This file is part of GlusterFS.</div><div class='add'>+ *</div><div class='add'>+ *  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+ *  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+ *  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+ *  cases as published by the Free Software Foundation.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+#include "glfs-internal.h"</div><div class='add'>+#include "glfs-mem-types.h"</div><div class='add'>+#include &lt;glusterfs/syncop.h&gt;</div><div class='add'>+#include "glfs.h"</div><div class='add'>+#include "glfs-handles.h"</div><div class='add'>+#include "gfapi-messages.h"</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+glfs_listxattr_process(void *value, size_t size, dict_t *xattr);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+glfs_iatt_from_stat(struct stat *stat, int valid, struct iatt *iatt,</div><div class='add'>+                    int *glvalid)</div><div class='add'>+{</div><div class='add'>+    /* validate in args */</div><div class='add'>+    if ((stat == NULL) || (iatt == NULL) || (glvalid == NULL)) {</div><div class='add'>+        errno = EINVAL;</div><div class='add'>+        return;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    *glvalid = 0;</div><div class='add'>+</div><div class='add'>+    if (valid &amp; GFAPI_SET_ATTR_MODE) {</div><div class='add'>+        iatt-&gt;ia_prot = ia_prot_from_st_mode(stat-&gt;st_mode);</div><div class='add'>+        *glvalid |= GF_SET_ATTR_MODE;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (valid &amp; GFAPI_SET_ATTR_UID) {</div><div class='add'>+        iatt-&gt;ia_uid = stat-&gt;st_uid;</div><div class='add'>+        *glvalid |= GF_SET_ATTR_UID;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (valid &amp; GFAPI_SET_ATTR_GID) {</div><div class='add'>+        iatt-&gt;ia_gid = stat-&gt;st_gid;</div><div class='add'>+        *glvalid |= GF_SET_ATTR_GID;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (valid &amp; GFAPI_SET_ATTR_ATIME) {</div><div class='add'>+        iatt-&gt;ia_atime = stat-&gt;st_atime;</div><div class='add'>+        iatt-&gt;ia_atime_nsec = ST_ATIM_NSEC(stat);</div><div class='add'>+        *glvalid |= GF_SET_ATTR_ATIME;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (valid &amp; GFAPI_SET_ATTR_MTIME) {</div><div class='add'>+        iatt-&gt;ia_mtime = stat-&gt;st_mtime;</div><div class='add'>+        iatt-&gt;ia_mtime_nsec = ST_MTIM_NSEC(stat);</div><div class='add'>+        *glvalid |= GF_SET_ATTR_MTIME;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_h_lookupat, 3.7.4)</div><div class='add'>+struct glfs_object *</div><div class='add'>+pub_glfs_h_lookupat(struct glfs *fs, struct glfs_object *parent,</div><div class='add'>+                    const char *path, struct stat *stat, int follow)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+    xlator_t *subvol = NULL;</div><div class='add'>+    inode_t *inode = NULL;</div><div class='add'>+    struct iatt iatt = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    struct glfs_object *object = NULL;</div><div class='add'>+    loc_t loc = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    DECLARE_OLD_THIS;</div><div class='add'>+</div><div class='add'>+    /* validate in args */</div><div class='add'>+    if (path == NULL) {</div><div class='add'>+        errno = EINVAL;</div><div class='add'>+        return NULL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    __GLFS_ENTRY_VALIDATE_FS(fs, invalid_fs);</div><div class='add'>+</div><div class='add'>+    /* get the active volume */</div><div class='add'>+    subvol = glfs_active_subvol(fs);</div><div class='add'>+    if (!subvol) {</div><div class='add'>+        errno = EIO;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* get/refresh the in arg objects inode in correlation to the xlator */</div><div class='add'>+    if (parent) {</div><div class='add'>+        inode = glfs_resolve_inode(fs, subvol, parent);</div><div class='add'>+        if (!inode) {</div><div class='add'>+            errno = ESTALE;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* fop/op */</div><div class='add'>+    ret = glfs_resolve_at(fs, subvol, inode, path, &amp;loc, &amp;iatt, follow, 0);</div><div class='add'>+</div><div class='add'>+    /* populate out args */</div><div class='add'>+    if (!ret) {</div><div class='add'>+        if (stat)</div><div class='add'>+            glfs_iatt_to_stat(fs, &amp;iatt, stat);</div><div class='add'>+</div><div class='add'>+        ret = glfs_create_object(&amp;loc, &amp;object);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    loc_wipe(&amp;loc);</div><div class='add'>+</div><div class='add'>+    if (inode)</div><div class='add'>+        inode_unref(inode);</div><div class='add'>+</div><div class='add'>+    glfs_subvol_done(fs, subvol);</div><div class='add'>+</div><div class='add'>+    __GLFS_EXIT_FS;</div><div class='add'>+</div><div class='add'>+invalid_fs:</div><div class='add'>+    return object;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+GFAPI_SYMVER_PUBLIC(glfs_h_lookupat34, glfs_h_lookupat, 3.4.2)</div><div class='add'>+struct glfs_object *</div><div class='add'>+pub_glfs_h_lookupat34(struct glfs *fs, struct glfs_object *parent,</div><div class='add'>+                      const char *path, struct stat *stat)</div><div class='add'>+{</div><div class='add'>+    return pub_glfs_h_lookupat(fs, parent, path, stat, 0);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_h_statfs, 3.7.0)</div><div class='add'>+int</div><div class='add'>+pub_glfs_h_statfs(struct glfs *fs, struct glfs_object *object,</div><div class='add'>+                  struct statvfs *statvfs)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    xlator_t *subvol = NULL;</div><div class='add'>+    inode_t *inode = NULL;</div><div class='add'>+    loc_t loc = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    DECLARE_OLD_THIS;</div><div class='add'>+</div><div class='add'>+    /* validate in args */</div><div class='add'>+    if ((fs == NULL) || (object == NULL || statvfs == NULL)) {</div><div class='add'>+        errno = EINVAL;</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    __GLFS_ENTRY_VALIDATE_FS(fs, invalid_fs);</div><div class='add'>+</div><div class='add'>+    /* get the active volume */</div><div class='add'>+    subvol = glfs_active_subvol(fs);</div><div class='add'>+    if (!subvol) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        errno = EIO;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* get/refresh the in arg objects inode in correlation to the xlator */</div><div class='add'>+    inode = glfs_resolve_inode(fs, subvol, object);</div><div class='add'>+    if (!inode) {</div><div class='add'>+        errno = ESTALE;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* populate loc */</div><div class='add'>+    GLFS_LOC_FILL_INODE(inode, loc, out);</div><div class='add'>+</div><div class='add'>+    /* fop/op */</div><div class='add'>+    ret = syncop_statfs(subvol, &amp;loc, statvfs, NULL, NULL);</div><div class='add'>+    DECODE_SYNCOP_ERR(ret);</div><div class='add'>+</div><div class='add'>+    loc_wipe(&amp;loc);</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (inode)</div><div class='add'>+        inode_unref(inode);</div><div class='add'>+</div><div class='add'>+    glfs_subvol_done(fs, subvol);</div><div class='add'>+</div><div class='add'>+    __GLFS_EXIT_FS;</div><div class='add'>+</div><div class='add'>+invalid_fs:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_h_stat, 3.4.2)</div><div class='add'>+int</div><div class='add'>+pub_glfs_h_stat(struct glfs *fs, struct glfs_object *object, struct stat *stat)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    xlator_t *subvol = NULL;</div><div class='add'>+    inode_t *inode = NULL;</div><div class='add'>+    loc_t loc = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    struct iatt iatt = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    DECLARE_OLD_THIS;</div><div class='add'>+</div><div class='add'>+    /* validate in args */</div><div class='add'>+    if ((fs == NULL) || (object == NULL)) {</div><div class='add'>+        errno = EINVAL;</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    __GLFS_ENTRY_VALIDATE_FS(fs, invalid_fs);</div><div class='add'>+</div><div class='add'>+    /* get the active volume */</div><div class='add'>+    subvol = glfs_active_subvol(fs);</div><div class='add'>+    if (!subvol) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        errno = EIO;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* get/refresh the in arg objects inode in correlation to the xlator */</div><div class='add'>+    inode = glfs_resolve_inode(fs, subvol, object);</div><div class='add'>+    if (!inode) {</div><div class='add'>+        errno = ESTALE;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* populate loc */</div><div class='add'>+    GLFS_LOC_FILL_INODE(inode, loc, out);</div><div class='add'>+</div><div class='add'>+    /* fop/op */</div><div class='add'>+    ret = syncop_stat(subvol, &amp;loc, &amp;iatt, NULL, NULL);</div><div class='add'>+    DECODE_SYNCOP_ERR(ret);</div><div class='add'>+</div><div class='add'>+    /* populate out args */</div><div class='add'>+    if (!ret &amp;&amp; stat) {</div><div class='add'>+        glfs_iatt_to_stat(fs, &amp;iatt, stat);</div><div class='add'>+    }</div><div class='add'>+out:</div><div class='add'>+    loc_wipe(&amp;loc);</div><div class='add'>+</div><div class='add'>+    if (inode)</div><div class='add'>+        inode_unref(inode);</div><div class='add'>+</div><div class='add'>+    glfs_subvol_done(fs, subvol);</div><div class='add'>+</div><div class='add'>+    __GLFS_EXIT_FS;</div><div class='add'>+</div><div class='add'>+invalid_fs:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_h_getattrs, 3.4.2)</div><div class='add'>+int</div><div class='add'>+pub_glfs_h_getattrs(struct glfs *fs, struct glfs_object *object,</div><div class='add'>+                    struct stat *stat)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    xlator_t *subvol = NULL;</div><div class='add'>+    inode_t *inode = NULL;</div><div class='add'>+    struct iatt iatt = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    /* validate in args */</div><div class='add'>+    if ((fs == NULL) || (object == NULL)) {</div><div class='add'>+        errno = EINVAL;</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    DECLARE_OLD_THIS;</div><div class='add'>+    __GLFS_ENTRY_VALIDATE_FS(fs, invalid_fs);</div><div class='add'>+</div><div class='add'>+    /* get the active volume */</div><div class='add'>+    subvol = glfs_active_subvol(fs);</div><div class='add'>+    if (!subvol) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        errno = EIO;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* get/refresh the in arg objects inode in correlation to the xlator */</div><div class='add'>+    inode = glfs_resolve_inode(fs, subvol, object);</div><div class='add'>+    if (!inode) {</div><div class='add'>+        ret = 0;</div><div class='add'>+        errno = ESTALE;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* fop/op */</div><div class='add'>+    ret = glfs_resolve_base(fs, subvol, inode, &amp;iatt);</div><div class='add'>+</div><div class='add'>+    /* populate out args */</div><div class='add'>+    if (!ret &amp;&amp; stat) {</div><div class='add'>+        glfs_iatt_to_stat(fs, &amp;iatt, stat);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (inode)</div><div class='add'>+        inode_unref(inode);</div><div class='add'>+</div><div class='add'>+    glfs_subvol_done(fs, subvol);</div><div class='add'>+</div><div class='add'>+    __GLFS_EXIT_FS;</div><div class='add'>+</div><div class='add'>+invalid_fs:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+glfs_h_getxattrs_common(struct glfs *fs, struct glfs_object *object,</div><div class='add'>+                        dict_t **xattr, const char *name,</div><div class='add'>+                        gf_boolean_t is_listxattr)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+    xlator_t *subvol = NULL;</div><div class='add'>+    inode_t *inode = NULL;</div><div class='add'>+    loc_t loc = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    /* validate in args */</div><div class='add'>+    if ((fs == NULL) || (object == NULL)) {</div><div class='add'>+        errno = EINVAL;</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (!is_listxattr) {</div><div class='add'>+        if (!name || *name == '\0') {</div><div class='add'>+            errno = EINVAL;</div><div class='add'>+            return -1;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        if (strlen(name) &gt; GF_XATTR_NAME_MAX) {</div><div class='add'>+            errno = ENAMETOOLONG;</div><div class='add'>+            return -1;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    /* get the active volume */</div><div class='add'>+    subvol = glfs_active_subvol(fs);</div><div class='add'>+    if (!subvol) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        errno = EIO;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* get/refresh the in arg objects inode in correlation to the xlator */</div><div class='add'>+    inode = glfs_resolve_inode(fs, subvol, object);</div><div class='add'>+    if (!inode) {</div><div class='add'>+        errno = ESTALE;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* populate loc */</div><div class='add'>+    GLFS_LOC_FILL_INODE(inode, loc, out);</div><div class='add'>+</div><div class='add'>+    ret = syncop_getxattr(subvol, &amp;loc, xattr, name, NULL, NULL);</div><div class='add'>+    DECODE_SYNCOP_ERR(ret);</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    loc_wipe(&amp;loc);</div><div class='add'>+</div><div class='add'>+    if (inode)</div><div class='add'>+        inode_unref(inode);</div><div class='add'>+</div><div class='add'>+    glfs_subvol_done(fs, subvol);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_h_getxattrs, 3.5.1)</div><div class='add'>+int</div><div class='add'>+pub_glfs_h_getxattrs(struct glfs *fs, struct glfs_object *object,</div><div class='add'>+                     const char *name, void *value, size_t size)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    dict_t *xattr = NULL;</div><div class='add'>+</div><div class='add'>+    /* validate in args */</div><div class='add'>+    if ((fs == NULL) || (object == NULL)) {</div><div class='add'>+        errno = EINVAL;</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    DECLARE_OLD_THIS;</div><div class='add'>+    __GLFS_ENTRY_VALIDATE_FS(fs, invalid_fs);</div><div class='add'>+</div><div class='add'>+    ret = glfs_h_getxattrs_common(fs, object, &amp;xattr, name, (name == NULL));</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    /* If @name is NULL, means get all the xattrs (i.e listxattr). */</div><div class='add'>+    if (name)</div><div class='add'>+        ret = glfs_getxattr_process(value, size, xattr, name);</div><div class='add'>+    else</div><div class='add'>+        ret = glfs_listxattr_process(value, size, xattr);</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (xattr)</div><div class='add'>+        dict_unref(xattr);</div><div class='add'>+</div><div class='add'>+    __GLFS_EXIT_FS;</div><div class='add'>+</div><div class='add'>+invalid_fs:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_h_setattrs, 3.4.2)</div><div class='add'>+int</div><div class='add'>+pub_glfs_h_setattrs(struct glfs *fs, struct glfs_object *object,</div><div class='add'>+                    struct stat *stat, int valid)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    xlator_t *subvol = NULL;</div><div class='add'>+    inode_t *inode = NULL;</div><div class='add'>+    loc_t loc = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    struct iatt iatt = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int glvalid = 0;</div><div class='add'>+</div><div class='add'>+    /* validate in args */</div><div class='add'>+    if ((fs == NULL) || (object == NULL) || (stat == NULL)) {</div><div class='add'>+        errno = EINVAL;</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    DECLARE_OLD_THIS;</div><div class='add'>+    __GLFS_ENTRY_VALIDATE_FS(fs, invalid_fs);</div><div class='add'>+</div><div class='add'>+    /* get the active volume */</div><div class='add'>+    subvol = glfs_active_subvol(fs);</div><div class='add'>+    if (!subvol) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        errno = EIO;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* get/refresh the in arg objects inode in correlation to the xlator */</div><div class='add'>+    inode = glfs_resolve_inode(fs, subvol, object);</div><div class='add'>+    if (!inode) {</div><div class='add'>+        errno = ESTALE;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* map valid masks from in args */</div><div class='add'>+    glfs_iatt_from_stat(stat, valid, &amp;iatt, &amp;glvalid);</div><div class='add'>+</div><div class='add'>+    /* populate loc */</div><div class='add'>+    GLFS_LOC_FILL_INODE(inode, loc, out);</div><div class='add'>+</div><div class='add'>+    /* fop/op */</div><div class='add'>+    ret = syncop_setattr(subvol, &amp;loc, &amp;iatt, glvalid, 0, 0, NULL, NULL);</div><div class='add'>+    DECODE_SYNCOP_ERR(ret);</div><div class='add'>+out:</div><div class='add'>+    loc_wipe(&amp;loc);</div><div class='add'>+</div><div class='add'>+    if (inode)</div><div class='add'>+        inode_unref(inode);</div><div class='add'>+</div><div class='add'>+    glfs_subvol_done(fs, subvol);</div><div class='add'>+</div><div class='add'>+    __GLFS_EXIT_FS;</div><div class='add'>+</div><div class='add'>+invalid_fs:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_h_setxattrs, 3.5.0)</div><div class='add'>+int</div><div class='add'>+pub_glfs_h_setxattrs(struct glfs *fs, struct glfs_object *object,</div><div class='add'>+                     const char *name, const void *value, size_t size,</div><div class='add'>+                     int flags)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    xlator_t *subvol = NULL;</div><div class='add'>+    inode_t *inode = NULL;</div><div class='add'>+    loc_t loc = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    dict_t *xattr = NULL;</div><div class='add'>+    void *value_cp = NULL;</div><div class='add'>+</div><div class='add'>+    /* validate in args */</div><div class='add'>+    if ((fs == NULL) || (object == NULL) || (name == NULL) || (value == NULL)) {</div><div class='add'>+        errno = EINVAL;</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (!name || *name == '\0') {</div><div class='add'>+        errno = EINVAL;</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (strlen(name) &gt; GF_XATTR_NAME_MAX) {</div><div class='add'>+        errno = ENAMETOOLONG;</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    DECLARE_OLD_THIS;</div><div class='add'>+    __GLFS_ENTRY_VALIDATE_FS(fs, invalid_fs);</div><div class='add'>+</div><div class='add'>+    /* get the active volume */</div><div class='add'>+    subvol = glfs_active_subvol(fs);</div><div class='add'>+    if (!subvol) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        errno = EIO;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* get/refresh the in arg objects inode in correlation to the xlator */</div><div class='add'>+    inode = glfs_resolve_inode(fs, subvol, object);</div><div class='add'>+    if (!inode) {</div><div class='add'>+        errno = ESTALE;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    value_cp = gf_memdup(value, size);</div><div class='add'>+    GF_CHECK_ALLOC_AND_LOG(subvol-&gt;name, value_cp, ret,</div><div class='add'>+                           "Failed to"</div><div class='add'>+                           " duplicate setxattr value",</div><div class='add'>+                           out);</div><div class='add'>+</div><div class='add'>+    xattr = dict_for_key_value(name, value_cp, size, _gf_false);</div><div class='add'>+    if (!xattr) {</div><div class='add'>+        GF_FREE(value_cp);</div><div class='add'>+        ret = -1;</div><div class='add'>+        errno = ENOMEM;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* populate loc */</div><div class='add'>+    GLFS_LOC_FILL_INODE(inode, loc, out);</div><div class='add'>+</div><div class='add'>+    /* fop/op */</div><div class='add'>+    ret = syncop_setxattr(subvol, &amp;loc, xattr, flags, NULL, NULL);</div><div class='add'>+    DECODE_SYNCOP_ERR(ret);</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    loc_wipe(&amp;loc);</div><div class='add'>+</div><div class='add'>+    if (inode)</div><div class='add'>+        inode_unref(inode);</div><div class='add'>+</div><div class='add'>+    if (xattr)</div><div class='add'>+        dict_unref(xattr);</div><div class='add'>+</div><div class='add'>+    glfs_subvol_done(fs, subvol);</div><div class='add'>+</div><div class='add'>+    __GLFS_EXIT_FS;</div><div class='add'>+</div><div class='add'>+invalid_fs:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_h_removexattrs, 3.5.1)</div><div class='add'>+int</div><div class='add'>+pub_glfs_h_removexattrs(struct glfs *fs, struct glfs_object *object,</div><div class='add'>+                        const char *name)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    xlator_t *subvol = NULL;</div><div class='add'>+    inode_t *inode = NULL;</div><div class='add'>+    loc_t loc = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    /* validate in args */</div><div class='add'>+    if ((fs == NULL) || (object == NULL) || (name == NULL)) {</div><div class='add'>+        errno = EINVAL;</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    DECLARE_OLD_THIS;</div><div class='add'>+    __GLFS_ENTRY_VALIDATE_FS(fs, invalid_fs);</div><div class='add'>+</div><div class='add'>+    /* get the active volume */</div><div class='add'>+    subvol = glfs_active_subvol(fs);</div><div class='add'>+    if (!subvol) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        errno = EIO;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* get/refresh the in arg objects inode in correlation to the xlator */</div><div class='add'>+    inode = glfs_resolve_inode(fs, subvol, object);</div><div class='add'>+    if (!inode) {</div><div class='add'>+        errno = ESTALE;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* populate loc */</div><div class='add'>+    GLFS_LOC_FILL_INODE(inode, loc, out);</div><div class='add'>+</div><div class='add'>+    /* fop/op */</div><div class='add'>+    ret = syncop_removexattr(subvol, &amp;loc, name, NULL, NULL);</div><div class='add'>+    DECODE_SYNCOP_ERR(ret);</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    loc_wipe(&amp;loc);</div><div class='add'>+</div><div class='add'>+    if (inode)</div><div class='add'>+        inode_unref(inode);</div><div class='add'>+</div><div class='add'>+    glfs_subvol_done(fs, subvol);</div><div class='add'>+</div><div class='add'>+    __GLFS_EXIT_FS;</div><div class='add'>+</div><div class='add'>+invalid_fs:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_h_open, 3.4.2)</div><div class='add'>+struct glfs_fd *</div><div class='add'>+pub_glfs_h_open(struct glfs *fs, struct glfs_object *object, int flags)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    struct glfs_fd *glfd = NULL;</div><div class='add'>+    xlator_t *subvol = NULL;</div><div class='add'>+    inode_t *inode = NULL;</div><div class='add'>+    loc_t loc = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    dict_t *fop_attr = NULL;</div><div class='add'>+</div><div class='add'>+    /* validate in args */</div><div class='add'>+    if ((fs == NULL) || (object == NULL)) {</div><div class='add'>+        errno = EINVAL;</div><div class='add'>+        return NULL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    DECLARE_OLD_THIS;</div><div class='add'>+    __GLFS_ENTRY_VALIDATE_FS(fs, invalid_fs);</div><div class='add'>+</div><div class='add'>+    /* get the active volume */</div><div class='add'>+    subvol = glfs_active_subvol(fs);</div><div class='add'>+    if (!subvol) {</div><div class='add'>+        errno = EIO;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* get/refresh the in arg objects inode in correlation to the xlator */</div><div class='add'>+    inode = glfs_resolve_inode(fs, subvol, object);</div><div class='add'>+    if (!inode) {</div><div class='add'>+        errno = ESTALE;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* check types to open */</div><div class='add'>+    if (IA_ISDIR(inode-&gt;ia_type)) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        errno = EISDIR;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (!IA_ISREG(inode-&gt;ia_type)) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        errno = EINVAL;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    glfd = glfs_fd_new(fs);</div><div class='add'>+    if (!glfd) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        errno = ENOMEM;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    glfd-&gt;fd = fd_create(inode, getpid());</div><div class='add'>+    if (!glfd-&gt;fd) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        errno = ENOMEM;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    glfd-&gt;fd-&gt;flags = flags;</div><div class='add'>+</div><div class='add'>+    /* populate loc */</div><div class='add'>+    GLFS_LOC_FILL_INODE(inode, loc, out);</div><div class='add'>+</div><div class='add'>+    /* fop/op */</div><div class='add'>+    ret = get_fop_attr_thrd_key(&amp;fop_attr);</div><div class='add'>+    if (ret)</div><div class='add'>+        gf_msg_debug("gfapi", 0, "Getting leaseid from thread failed");</div><div class='add'>+</div><div class='add'>+    ret = syncop_open(subvol, &amp;loc, flags, glfd-&gt;fd, fop_attr, NULL);</div><div class='add'>+    DECODE_SYNCOP_ERR(ret);</div><div class='add'>+</div><div class='add'>+    glfd-&gt;fd-&gt;flags = flags;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    loc_wipe(&amp;loc);</div><div class='add'>+</div><div class='add'>+    if (inode)</div><div class='add'>+        inode_unref(inode);</div><div class='add'>+    if (fop_attr)</div><div class='add'>+        dict_unref(fop_attr);</div><div class='add'>+</div><div class='add'>+    if (ret &amp;&amp; glfd) {</div><div class='add'>+        GF_REF_PUT(glfd);</div><div class='add'>+        glfd = NULL;</div><div class='add'>+    } else if (glfd) {</div><div class='add'>+        glfd_set_state_bind(glfd);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    glfs_subvol_done(fs, subvol);</div><div class='add'>+</div><div class='add'>+    __GLFS_EXIT_FS;</div><div class='add'>+</div><div class='add'>+invalid_fs:</div><div class='add'>+    return glfd;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_h_creat, 3.4.2)</div><div class='add'>+struct glfs_object *</div><div class='add'>+pub_glfs_h_creat(struct glfs *fs, struct glfs_object *parent, const char *path,</div><div class='add'>+                 int flags, mode_t mode, struct stat *stat)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    fd_t *fd = NULL;</div><div class='add'>+    xlator_t *subvol = NULL;</div><div class='add'>+    inode_t *inode = NULL;</div><div class='add'>+    loc_t loc = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    struct iatt iatt = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    uuid_t gfid;</div><div class='add'>+    dict_t *xattr_req = NULL;</div><div class='add'>+    struct glfs_object *object = NULL;</div><div class='add'>+</div><div class='add'>+    /* validate in args */</div><div class='add'>+    if ((fs == NULL) || (parent == NULL) || (path == NULL)) {</div><div class='add'>+        errno = EINVAL;</div><div class='add'>+        return NULL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    DECLARE_OLD_THIS;</div><div class='add'>+    __GLFS_ENTRY_VALIDATE_FS(fs, invalid_fs);</div><div class='add'>+</div><div class='add'>+    /* get the active volume */</div><div class='add'>+    subvol = glfs_active_subvol(fs);</div><div class='add'>+    if (!subvol) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        errno = EIO;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* get/refresh the in arg objects inode in correlation to the xlator */</div><div class='add'>+    inode = glfs_resolve_inode(fs, subvol, parent);</div><div class='add'>+    if (!inode) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        errno = ESTALE;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    xattr_req = dict_new();</div><div class='add'>+    if (!xattr_req) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        errno = ENOMEM;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    gf_uuid_generate(gfid);</div><div class='add'>+    ret = dict_set_gfuuid(xattr_req, "gfid-req", gfid, true);</div><div class='add'>+    if (ret) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        errno = ENOMEM;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    GLFS_LOC_FILL_PINODE(inode, loc, ret, errno, out, path);</div><div class='add'>+</div><div class='add'>+    fd = fd_create(loc.inode, getpid());</div><div class='add'>+    if (!fd) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        errno = ENOMEM;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    fd-&gt;flags = flags;</div><div class='add'>+</div><div class='add'>+    /* fop/op */</div><div class='add'>+    ret = syncop_create(subvol, &amp;loc, flags, mode, fd, &amp;iatt, xattr_req, NULL);</div><div class='add'>+    DECODE_SYNCOP_ERR(ret);</div><div class='add'>+</div><div class='add'>+    /* populate out args */</div><div class='add'>+    if (ret == 0) {</div><div class='add'>+        ret = glfs_loc_link(&amp;loc, &amp;iatt);</div><div class='add'>+        if (ret != 0) {</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        if (stat)</div><div class='add'>+            glfs_iatt_to_stat(fs, &amp;iatt, stat);</div><div class='add'>+</div><div class='add'>+        ret = glfs_create_object(&amp;loc, &amp;object);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (ret &amp;&amp; object != NULL) {</div><div class='add'>+        /* Release the held reference */</div><div class='add'>+        glfs_h_close(object);</div><div class='add'>+        object = NULL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    loc_wipe(&amp;loc);</div><div class='add'>+</div><div class='add'>+    if (inode)</div><div class='add'>+        inode_unref(inode);</div><div class='add'>+</div><div class='add'>+    if (xattr_req)</div><div class='add'>+        dict_unref(xattr_req);</div><div class='add'>+</div><div class='add'>+    if (fd)</div><div class='add'>+        fd_unref(fd);</div><div class='add'>+</div><div class='add'>+    glfs_subvol_done(fs, subvol);</div><div class='add'>+</div><div class='add'>+    __GLFS_EXIT_FS;</div><div class='add'>+</div><div class='add'>+invalid_fs:</div><div class='add'>+    return object;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_h_creat_open, 6.6)</div><div class='add'>+struct glfs_object *</div><div class='add'>+pub_glfs_h_creat_open(struct glfs *fs, struct glfs_object *parent,</div><div class='add'>+                      const char *path, int flags, mode_t mode,</div><div class='add'>+                      struct stat *stat, struct glfs_fd **out_fd)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    struct glfs_fd *glfd = NULL;</div><div class='add'>+    xlator_t *subvol = NULL;</div><div class='add'>+    inode_t *inode = NULL;</div><div class='add'>+    loc_t loc = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    struct iatt iatt = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    uuid_t gfid;</div><div class='add'>+    dict_t *xattr_req = NULL;</div><div class='add'>+    struct glfs_object *object = NULL;</div><div class='add'>+    dict_t *fop_attr = NULL;</div><div class='add'>+</div><div class='add'>+    /* validate in args */</div><div class='add'>+    if ((fs == NULL) || (parent == NULL) || (path == NULL) ||</div><div class='add'>+        (out_fd == NULL)) {</div><div class='add'>+        errno = EINVAL;</div><div class='add'>+        return NULL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    DECLARE_OLD_THIS;</div><div class='add'>+    __GLFS_ENTRY_VALIDATE_FS(fs, invalid_fs);</div><div class='add'>+</div><div class='add'>+    /* get the active volume */</div><div class='add'>+    subvol = glfs_active_subvol(fs);</div><div class='add'>+    if (!subvol) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* get/refresh the in arg objects inode in correlation to the xlator */</div><div class='add'>+    inode = glfs_resolve_inode(fs, subvol, parent);</div><div class='add'>+    if (!inode) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    xattr_req = dict_new();</div><div class='add'>+    if (!xattr_req) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        errno = ENOMEM;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    gf_uuid_generate(gfid);</div><div class='add'>+    ret = dict_set_gfuuid(xattr_req, "gfid-req", gfid, true);</div><div class='add'>+    if (ret) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        errno = ENOMEM;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    GLFS_LOC_FILL_PINODE(inode, loc, ret, errno, out, path);</div><div class='add'>+</div><div class='add'>+    glfd = glfs_fd_new(fs);</div><div class='add'>+    if (!glfd) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        errno = ENOMEM;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    glfd-&gt;fd = fd_create(loc.inode, getpid());</div><div class='add'>+    if (!glfd-&gt;fd) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        errno = ENOMEM;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    glfd-&gt;fd-&gt;flags = flags;</div><div class='add'>+</div><div class='add'>+    ret = get_fop_attr_thrd_key(&amp;fop_attr);</div><div class='add'>+    if (ret)</div><div class='add'>+        gf_msg_debug("gfapi", 0, "Getting leaseid from thread failed");</div><div class='add'>+</div><div class='add'>+    /* fop/op */</div><div class='add'>+    ret = syncop_create(subvol, &amp;loc, flags, mode, glfd-&gt;fd, &amp;iatt, xattr_req,</div><div class='add'>+                        NULL);</div><div class='add'>+    DECODE_SYNCOP_ERR(ret);</div><div class='add'>+</div><div class='add'>+    /* populate out args */</div><div class='add'>+    if (ret == 0) {</div><div class='add'>+        glfd-&gt;fd-&gt;flags = flags;</div><div class='add'>+</div><div class='add'>+        ret = glfs_loc_link(&amp;loc, &amp;iatt);</div><div class='add'>+        if (ret != 0) {</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        if (stat)</div><div class='add'>+            glfs_iatt_to_stat(fs, &amp;iatt, stat);</div><div class='add'>+</div><div class='add'>+        ret = glfs_create_object(&amp;loc, &amp;object);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (ret &amp;&amp; object != NULL) {</div><div class='add'>+        /* Release the held reference */</div><div class='add'>+        glfs_h_close(object);</div><div class='add'>+        object = NULL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    loc_wipe(&amp;loc);</div><div class='add'>+</div><div class='add'>+    if (inode)</div><div class='add'>+        inode_unref(inode);</div><div class='add'>+</div><div class='add'>+    if (fop_attr)</div><div class='add'>+        dict_unref(fop_attr);</div><div class='add'>+</div><div class='add'>+    if (xattr_req)</div><div class='add'>+        dict_unref(xattr_req);</div><div class='add'>+</div><div class='add'>+    if (ret &amp;&amp; glfd) {</div><div class='add'>+        GF_REF_PUT(glfd);</div><div class='add'>+    } else if (glfd) {</div><div class='add'>+        glfd_set_state_bind(glfd);</div><div class='add'>+        *out_fd = glfd;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    glfs_subvol_done(fs, subvol);</div><div class='add'>+</div><div class='add'>+    __GLFS_EXIT_FS;</div><div class='add'>+</div><div class='add'>+invalid_fs:</div><div class='add'>+    return object;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_h_mkdir, 3.4.2)</div><div class='add'>+struct glfs_object *</div><div class='add'>+pub_glfs_h_mkdir(struct glfs *fs, struct glfs_object *parent, const char *path,</div><div class='add'>+                 mode_t mode, struct stat *stat)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    xlator_t *subvol = NULL;</div><div class='add'>+    inode_t *inode = NULL;</div><div class='add'>+    loc_t loc = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    struct iatt iatt = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    uuid_t gfid;</div><div class='add'>+    dict_t *xattr_req = NULL;</div><div class='add'>+    struct glfs_object *object = NULL;</div><div class='add'>+</div><div class='add'>+    /* validate in args */</div><div class='add'>+    if ((fs == NULL) || (parent == NULL) || (path == NULL)) {</div><div class='add'>+        errno = EINVAL;</div><div class='add'>+        return NULL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    DECLARE_OLD_THIS;</div><div class='add'>+    __GLFS_ENTRY_VALIDATE_FS(fs, invalid_fs);</div><div class='add'>+</div><div class='add'>+    /* get the active volume */</div><div class='add'>+    subvol = glfs_active_subvol(fs);</div><div class='add'>+    if (!subvol) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        errno = EIO;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* get/refresh the in arg objects inode in correlation to the xlator */</div><div class='add'>+    inode = glfs_resolve_inode(fs, subvol, parent);</div><div class='add'>+    if (!inode) {</div><div class='add'>+        errno = ESTALE;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    xattr_req = dict_new();</div><div class='add'>+    if (!xattr_req) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        errno = ENOMEM;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    gf_uuid_generate(gfid);</div><div class='add'>+    ret = dict_set_gfuuid(xattr_req, "gfid-req", gfid, true);</div><div class='add'>+    if (ret) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        errno = ENOMEM;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    GLFS_LOC_FILL_PINODE(inode, loc, ret, errno, out, path);</div><div class='add'>+</div><div class='add'>+    /* fop/op */</div><div class='add'>+    ret = syncop_mkdir(subvol, &amp;loc, mode, &amp;iatt, xattr_req, NULL);</div><div class='add'>+    DECODE_SYNCOP_ERR(ret);</div><div class='add'>+</div><div class='add'>+    /* populate out args */</div><div class='add'>+    if (ret == 0) {</div><div class='add'>+        ret = glfs_loc_link(&amp;loc, &amp;iatt);</div><div class='add'>+        if (ret != 0) {</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        if (stat)</div><div class='add'>+            glfs_iatt_to_stat(fs, &amp;iatt, stat);</div><div class='add'>+</div><div class='add'>+        ret = glfs_create_object(&amp;loc, &amp;object);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (ret &amp;&amp; object != NULL) {</div><div class='add'>+        glfs_h_close(object);</div><div class='add'>+        object = NULL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    loc_wipe(&amp;loc);</div><div class='add'>+</div><div class='add'>+    if (inode)</div><div class='add'>+        inode_unref(inode);</div><div class='add'>+</div><div class='add'>+    if (xattr_req)</div><div class='add'>+        dict_unref(xattr_req);</div><div class='add'>+</div><div class='add'>+    glfs_subvol_done(fs, subvol);</div><div class='add'>+</div><div class='add'>+    __GLFS_EXIT_FS;</div><div class='add'>+</div><div class='add'>+invalid_fs:</div><div class='add'>+    return object;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_h_mknod, 3.4.2)</div><div class='add'>+struct glfs_object *</div><div class='add'>+pub_glfs_h_mknod(struct glfs *fs, struct glfs_object *parent, const char *path,</div><div class='add'>+                 mode_t mode, dev_t dev, struct stat *stat)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    xlator_t *subvol = NULL;</div><div class='add'>+    inode_t *inode = NULL;</div><div class='add'>+    loc_t loc = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    struct iatt iatt = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    uuid_t gfid;</div><div class='add'>+    dict_t *xattr_req = NULL;</div><div class='add'>+    struct glfs_object *object = NULL;</div><div class='add'>+</div><div class='add'>+    /* validate in args */</div><div class='add'>+    if ((fs == NULL) || (parent == NULL) || (path == NULL)) {</div><div class='add'>+        errno = EINVAL;</div><div class='add'>+        return NULL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    DECLARE_OLD_THIS;</div><div class='add'>+    __GLFS_ENTRY_VALIDATE_FS(fs, invalid_fs);</div><div class='add'>+</div><div class='add'>+    /* get the active volume */</div><div class='add'>+    subvol = glfs_active_subvol(fs);</div><div class='add'>+    if (!subvol) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        errno = EIO;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* get/refresh the in arg objects inode in correlation to the xlator */</div><div class='add'>+    inode = glfs_resolve_inode(fs, subvol, parent);</div><div class='add'>+    if (!inode) {</div><div class='add'>+        errno = ESTALE;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    xattr_req = dict_new();</div><div class='add'>+    if (!xattr_req) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        errno = ENOMEM;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    gf_uuid_generate(gfid);</div><div class='add'>+    ret = dict_set_gfuuid(xattr_req, "gfid-req", gfid, true);</div><div class='add'>+    if (ret) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        errno = ENOMEM;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    GLFS_LOC_FILL_PINODE(inode, loc, ret, errno, out, path);</div><div class='add'>+</div><div class='add'>+    /* fop/op */</div><div class='add'>+    ret = syncop_mknod(subvol, &amp;loc, mode, dev, &amp;iatt, xattr_req, NULL);</div><div class='add'>+    DECODE_SYNCOP_ERR(ret);</div><div class='add'>+</div><div class='add'>+    /* populate out args */</div><div class='add'>+    if (ret == 0) {</div><div class='add'>+        ret = glfs_loc_link(&amp;loc, &amp;iatt);</div><div class='add'>+        if (ret != 0) {</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        if (stat)</div><div class='add'>+            glfs_iatt_to_stat(fs, &amp;iatt, stat);</div><div class='add'>+</div><div class='add'>+        ret = glfs_create_object(&amp;loc, &amp;object);</div><div class='add'>+    }</div><div class='add'>+out:</div><div class='add'>+    if (ret &amp;&amp; object != NULL) {</div><div class='add'>+        glfs_h_close(object);</div><div class='add'>+        object = NULL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    loc_wipe(&amp;loc);</div><div class='add'>+</div><div class='add'>+    if (inode)</div><div class='add'>+        inode_unref(inode);</div><div class='add'>+</div><div class='add'>+    if (xattr_req)</div><div class='add'>+        dict_unref(xattr_req);</div><div class='add'>+</div><div class='add'>+    glfs_subvol_done(fs, subvol);</div><div class='add'>+</div><div class='add'>+    __GLFS_EXIT_FS;</div><div class='add'>+</div><div class='add'>+invalid_fs:</div><div class='add'>+    return object;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_h_unlink, 3.4.2)</div><div class='add'>+int</div><div class='add'>+pub_glfs_h_unlink(struct glfs *fs, struct glfs_object *parent, const char *path)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    xlator_t *subvol = NULL;</div><div class='add'>+    inode_t *inode = NULL;</div><div class='add'>+    loc_t loc = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    /* validate in args */</div><div class='add'>+    if ((fs == NULL) || (parent == NULL) || (path == NULL)) {</div><div class='add'>+        errno = EINVAL;</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    DECLARE_OLD_THIS;</div><div class='add'>+    __GLFS_ENTRY_VALIDATE_FS(fs, invalid_fs);</div><div class='add'>+</div><div class='add'>+    /* get the active volume */</div><div class='add'>+    subvol = glfs_active_subvol(fs);</div><div class='add'>+    if (!subvol) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        errno = EIO;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* get/refresh the in arg objects inode in correlation to the xlator */</div><div class='add'>+    inode = glfs_resolve_inode(fs, subvol, parent);</div><div class='add'>+    if (!inode) {</div><div class='add'>+        errno = ESTALE;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = glfs_resolve_at(fs, subvol, inode, path, &amp;loc, NULL, 0, 0);</div><div class='add'>+    if (ret != 0) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (!IA_ISDIR(loc.inode-&gt;ia_type)) {</div><div class='add'>+        ret = syncop_unlink(subvol, &amp;loc, NULL, NULL);</div><div class='add'>+        DECODE_SYNCOP_ERR(ret);</div><div class='add'>+        if (ret != 0) {</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    } else {</div><div class='add'>+        ret = syncop_rmdir(subvol, &amp;loc, 0, NULL, NULL);</div><div class='add'>+        DECODE_SYNCOP_ERR(ret);</div><div class='add'>+        if (ret != 0) {</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (ret == 0)</div><div class='add'>+        ret = glfs_loc_unlink(&amp;loc);</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    loc_wipe(&amp;loc);</div><div class='add'>+</div><div class='add'>+    if (inode)</div><div class='add'>+        inode_unref(inode);</div><div class='add'>+</div><div class='add'>+    glfs_subvol_done(fs, subvol);</div><div class='add'>+</div><div class='add'>+    __GLFS_EXIT_FS;</div><div class='add'>+</div><div class='add'>+invalid_fs:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_h_opendir, 3.4.2)</div><div class='add'>+struct glfs_fd *</div><div class='add'>+pub_glfs_h_opendir(struct glfs *fs, struct glfs_object *object)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    struct glfs_fd *glfd = NULL;</div><div class='add'>+    xlator_t *subvol = NULL;</div><div class='add'>+    inode_t *inode = NULL;</div><div class='add'>+    loc_t loc = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    /* validate in args */</div><div class='add'>+    if ((fs == NULL) || (object == NULL)) {</div><div class='add'>+        errno = EINVAL;</div><div class='add'>+        return NULL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    DECLARE_OLD_THIS;</div><div class='add'>+    __GLFS_ENTRY_VALIDATE_FS(fs, invalid_fs);</div><div class='add'>+</div><div class='add'>+    /* get the active volume */</div><div class='add'>+    subvol = glfs_active_subvol(fs);</div><div class='add'>+    if (!subvol) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        errno = EIO;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* get/refresh the in arg objects inode in correlation to the xlator */</div><div class='add'>+    inode = glfs_resolve_inode(fs, subvol, object);</div><div class='add'>+    if (!inode) {</div><div class='add'>+        errno = ESTALE;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (!IA_ISDIR(inode-&gt;ia_type)) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        errno = ENOTDIR;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    glfd = glfs_fd_new(fs);</div><div class='add'>+    if (!glfd)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    INIT_LIST_HEAD(&amp;glfd-&gt;entries);</div><div class='add'>+</div><div class='add'>+    glfd-&gt;fd = fd_create(inode, getpid());</div><div class='add'>+    if (!glfd-&gt;fd) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        errno = ENOMEM;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    GLFS_LOC_FILL_INODE(inode, loc, out);</div><div class='add'>+</div><div class='add'>+    /* fop/op */</div><div class='add'>+    ret = syncop_opendir(subvol, &amp;loc, glfd-&gt;fd, NULL, NULL);</div><div class='add'>+    DECODE_SYNCOP_ERR(ret);</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    loc_wipe(&amp;loc);</div><div class='add'>+</div><div class='add'>+    if (inode)</div><div class='add'>+        inode_unref(inode);</div><div class='add'>+</div><div class='add'>+    if (ret &amp;&amp; glfd) {</div><div class='add'>+        GF_REF_PUT(glfd);</div><div class='add'>+        glfd = NULL;</div><div class='add'>+    } else if (glfd) {</div><div class='add'>+        glfd_set_state_bind(glfd);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    glfs_subvol_done(fs, subvol);</div><div class='add'>+</div><div class='add'>+    __GLFS_EXIT_FS;</div><div class='add'>+</div><div class='add'>+invalid_fs:</div><div class='add'>+    return glfd;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_h_access, 3.6.0)</div><div class='add'>+int</div><div class='add'>+pub_glfs_h_access(struct glfs *fs, struct glfs_object *object, int mask)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    xlator_t *subvol = NULL;</div><div class='add'>+    inode_t *inode = NULL;</div><div class='add'>+    loc_t loc = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    DECLARE_OLD_THIS;</div><div class='add'>+</div><div class='add'>+    /* validate in args */</div><div class='add'>+    if ((fs == NULL) || (object == NULL)) {</div><div class='add'>+        errno = EINVAL;</div><div class='add'>+        return ret;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    __GLFS_ENTRY_VALIDATE_FS(fs, invalid_fs);</div><div class='add'>+</div><div class='add'>+    /* get the active volume */</div><div class='add'>+    subvol = glfs_active_subvol(fs);</div><div class='add'>+    if (!subvol) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        errno = EIO;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* get/refresh the in arg objects inode in correlation to the xlator */</div><div class='add'>+    inode = glfs_resolve_inode(fs, subvol, object);</div><div class='add'>+    if (!inode) {</div><div class='add'>+        errno = ESTALE;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    GLFS_LOC_FILL_INODE(inode, loc, out);</div><div class='add'>+</div><div class='add'>+    /* fop/op */</div><div class='add'>+</div><div class='add'>+    ret = syncop_access(subvol, &amp;loc, mask, NULL, NULL);</div><div class='add'>+    DECODE_SYNCOP_ERR(ret);</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    loc_wipe(&amp;loc);</div><div class='add'>+</div><div class='add'>+    if (inode)</div><div class='add'>+        inode_unref(inode);</div><div class='add'>+</div><div class='add'>+    glfs_subvol_done(fs, subvol);</div><div class='add'>+</div><div class='add'>+    __GLFS_EXIT_FS;</div><div class='add'>+</div><div class='add'>+invalid_fs:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_h_extract_handle, 3.4.2)</div><div class='add'>+ssize_t</div><div class='add'>+pub_glfs_h_extract_handle(struct glfs_object *object, unsigned char *handle,</div><div class='add'>+                          int len)</div><div class='add'>+{</div><div class='add'>+    ssize_t ret = -1;</div><div class='add'>+</div><div class='add'>+    /* validate in args */</div><div class='add'>+    if (object == NULL) {</div><div class='add'>+        errno = EINVAL;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (!handle || !len) {</div><div class='add'>+        ret = GFAPI_HANDLE_LENGTH;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (len &lt; GFAPI_HANDLE_LENGTH) {</div><div class='add'>+        errno = ERANGE;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    memcpy(handle, object-&gt;gfid, GFAPI_HANDLE_LENGTH);</div><div class='add'>+</div><div class='add'>+    ret = GFAPI_HANDLE_LENGTH;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_h_create_from_handle, 3.4.2)</div><div class='add'>+struct glfs_object *</div><div class='add'>+pub_glfs_h_create_from_handle(struct glfs *fs, unsigned char *handle, int len,</div><div class='add'>+                              struct stat *stat)</div><div class='add'>+{</div><div class='add'>+    loc_t loc = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int ret = -1;</div><div class='add'>+    struct iatt iatt = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    inode_t *newinode = NULL;</div><div class='add'>+    xlator_t *subvol = NULL;</div><div class='add'>+    struct glfs_object *object = NULL;</div><div class='add'>+    uint64_t ctx_value = LOOKUP_NOT_NEEDED;</div><div class='add'>+    gf_boolean_t lookup_needed = _gf_false;</div><div class='add'>+</div><div class='add'>+    /* validate in args */</div><div class='add'>+    if ((fs == NULL) || (handle == NULL) || (len != GFAPI_HANDLE_LENGTH)) {</div><div class='add'>+        errno = EINVAL;</div><div class='add'>+        return NULL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    DECLARE_OLD_THIS;</div><div class='add'>+    __GLFS_ENTRY_VALIDATE_FS(fs, invalid_fs);</div><div class='add'>+</div><div class='add'>+    /* get the active volume */</div><div class='add'>+    subvol = glfs_active_subvol(fs);</div><div class='add'>+    if (!subvol) {</div><div class='add'>+        errno = EIO;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    memcpy(loc.gfid, handle, GFAPI_HANDLE_LENGTH);</div><div class='add'>+</div><div class='add'>+    /* make sure the gfid received is valid */</div><div class='add'>+    GF_VALIDATE_OR_GOTO("glfs_h_create_from_handle",</div><div class='add'>+                        !(gf_uuid_is_null(loc.gfid)), out);</div><div class='add'>+</div><div class='add'>+    newinode = inode_find(subvol-&gt;itable, loc.gfid);</div><div class='add'>+    if (newinode) {</div><div class='add'>+        if (!stat) /* No need of lookup */</div><div class='add'>+            goto found;</div><div class='add'>+</div><div class='add'>+        lookup_needed = inode_needs_lookup(newinode, THIS);</div><div class='add'>+        if (lookup_needed) {</div><div class='add'>+            loc.inode = newinode;</div><div class='add'>+        } else {</div><div class='add'>+            /* populate loc */</div><div class='add'>+            GLFS_LOC_FILL_INODE(newinode, loc, fill_out);</div><div class='add'>+</div><div class='add'>+            /* fop/op */</div><div class='add'>+            ret = syncop_stat(subvol, &amp;loc, &amp;iatt, NULL, NULL);</div><div class='add'>+            DECODE_SYNCOP_ERR(ret);</div><div class='add'>+</div><div class='add'>+            if (ret) {</div><div class='add'>+            fill_out:</div><div class='add'>+                /* Drop the reference hold in inode_find */</div><div class='add'>+                inode_unref(newinode);</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            glfs_iatt_to_stat(fs, &amp;iatt, stat);</div><div class='add'>+            goto found;</div><div class='add'>+        }</div><div class='add'>+    } else {</div><div class='add'>+        loc.inode = inode_new(subvol-&gt;itable);</div><div class='add'>+        if (!loc.inode) {</div><div class='add'>+            errno = ENOMEM;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = syncop_lookup(subvol, &amp;loc, &amp;iatt, 0, 0, 0);</div><div class='add'>+    DECODE_SYNCOP_ERR(ret);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_smsg(subvol-&gt;name, GF_LOG_WARNING, errno,</div><div class='add'>+                API_MSG_INODE_REFRESH_FAILED, "gfid=%s", uuid_utoa(loc.gfid),</div><div class='add'>+                "error=%s", strerror(errno), NULL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    newinode = inode_link(loc.inode, 0, 0, &amp;iatt);</div><div class='add'>+    if (newinode) {</div><div class='add'>+        if (newinode == loc.inode) {</div><div class='add'>+            inode_ctx_set(newinode, THIS, &amp;ctx_value);</div><div class='add'>+        }</div><div class='add'>+        inode_lookup(newinode);</div><div class='add'>+    } else {</div><div class='add'>+        gf_smsg(subvol-&gt;name, GF_LOG_WARNING, errno, API_MSG_INODE_LINK_FAILED,</div><div class='add'>+                "gfid=%s", uuid_utoa(loc.gfid), NULL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* populate stat */</div><div class='add'>+    if (stat)</div><div class='add'>+        glfs_iatt_to_stat(fs, &amp;iatt, stat);</div><div class='add'>+</div><div class='add'>+found:</div><div class='add'>+    object = GF_CALLOC(1, sizeof(struct glfs_object), glfs_mt_glfs_object_t);</div><div class='add'>+    if (object == NULL) {</div><div class='add'>+        errno = ENOMEM;</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* populate the return object */</div><div class='add'>+    object-&gt;inode = newinode;</div><div class='add'>+    gf_uuid_copy(object-&gt;gfid, object-&gt;inode-&gt;gfid);</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    /* TODO: Check where the inode ref is being held? */</div><div class='add'>+    loc_wipe(&amp;loc);</div><div class='add'>+</div><div class='add'>+    glfs_subvol_done(fs, subvol);</div><div class='add'>+</div><div class='add'>+    __GLFS_EXIT_FS;</div><div class='add'>+</div><div class='add'>+invalid_fs:</div><div class='add'>+    return object;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_h_close, 3.4.2)</div><div class='add'>+int</div><div class='add'>+pub_glfs_h_close(struct glfs_object *object)</div><div class='add'>+{</div><div class='add'>+    /* since glfs_h_* objects hold a reference to inode</div><div class='add'>+     * it is safe to keep lookup count to '0' */</div><div class='add'>+    inode_forget(object-&gt;inode, 0);</div><div class='add'>+    inode_unref(object-&gt;inode);</div><div class='add'>+    GF_FREE(object);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_h_truncate, 3.4.2)</div><div class='add'>+int</div><div class='add'>+pub_glfs_h_truncate(struct glfs *fs, struct glfs_object *object, off_t offset)</div><div class='add'>+{</div><div class='add'>+    loc_t loc = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int ret = -1;</div><div class='add'>+    xlator_t *subvol = NULL;</div><div class='add'>+    inode_t *inode = NULL;</div><div class='add'>+</div><div class='add'>+    DECLARE_OLD_THIS;</div><div class='add'>+</div><div class='add'>+    /* validate in args */</div><div class='add'>+    if (object == NULL) {</div><div class='add'>+        errno = EINVAL;</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    __GLFS_ENTRY_VALIDATE_FS(fs, invalid_fs);</div><div class='add'>+</div><div class='add'>+    /* get the active volume */</div><div class='add'>+    subvol = glfs_active_subvol(fs);</div><div class='add'>+    if (!subvol) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        errno = EIO;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* get/refresh the in arg objects inode in correlation to the xlator */</div><div class='add'>+    inode = glfs_resolve_inode(fs, subvol, object);</div><div class='add'>+    if (!inode) {</div><div class='add'>+        errno = ESTALE;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    GLFS_LOC_FILL_INODE(inode, loc, out);</div><div class='add'>+</div><div class='add'>+    /* fop/op */</div><div class='add'>+    ret = syncop_truncate(subvol, &amp;loc, (off_t)offset, NULL, NULL);</div><div class='add'>+    DECODE_SYNCOP_ERR(ret);</div><div class='add'>+</div><div class='add'>+    /* populate out args */</div><div class='add'>+    if (ret == 0)</div><div class='add'>+        ret = glfs_loc_unlink(&amp;loc);</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    loc_wipe(&amp;loc);</div><div class='add'>+</div><div class='add'>+    if (inode)</div><div class='add'>+        inode_unref(inode);</div><div class='add'>+</div><div class='add'>+    glfs_subvol_done(fs, subvol);</div><div class='add'>+</div><div class='add'>+    __GLFS_EXIT_FS;</div><div class='add'>+</div><div class='add'>+invalid_fs:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_h_symlink, 3.4.2)</div><div class='add'>+struct glfs_object *</div><div class='add'>+pub_glfs_h_symlink(struct glfs *fs, struct glfs_object *parent,</div><div class='add'>+                   const char *name, const char *data, struct stat *stat)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    xlator_t *subvol = NULL;</div><div class='add'>+    inode_t *inode = NULL;</div><div class='add'>+    loc_t loc = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    struct iatt iatt = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    uuid_t gfid;</div><div class='add'>+    dict_t *xattr_req = NULL;</div><div class='add'>+    struct glfs_object *object = NULL;</div><div class='add'>+</div><div class='add'>+    DECLARE_OLD_THIS;</div><div class='add'>+</div><div class='add'>+    /* validate in args */</div><div class='add'>+    if ((parent == NULL) || (name == NULL) || (data == NULL)) {</div><div class='add'>+        errno = EINVAL;</div><div class='add'>+        return NULL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    __GLFS_ENTRY_VALIDATE_FS(fs, invalid_fs);</div><div class='add'>+</div><div class='add'>+    /* get the active volume */</div><div class='add'>+    subvol = glfs_active_subvol(fs);</div><div class='add'>+    if (!subvol) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        errno = EIO;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* get/refresh the in arg objects inode in correlation to the xlator */</div><div class='add'>+    inode = glfs_resolve_inode(fs, subvol, parent);</div><div class='add'>+    if (!inode) {</div><div class='add'>+        errno = ESTALE;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    xattr_req = dict_new();</div><div class='add'>+    if (!xattr_req) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        errno = ENOMEM;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    gf_uuid_generate(gfid);</div><div class='add'>+    ret = dict_set_gfuuid(xattr_req, "gfid-req", gfid, true);</div><div class='add'>+    if (ret) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        errno = ENOMEM;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    GLFS_LOC_FILL_PINODE(inode, loc, ret, errno, out, name);</div><div class='add'>+</div><div class='add'>+    /* fop/op */</div><div class='add'>+    ret = syncop_symlink(subvol, &amp;loc, data, &amp;iatt, xattr_req, NULL);</div><div class='add'>+    DECODE_SYNCOP_ERR(ret);</div><div class='add'>+</div><div class='add'>+    /* populate out args */</div><div class='add'>+    if (ret == 0) {</div><div class='add'>+        ret = glfs_loc_link(&amp;loc, &amp;iatt);</div><div class='add'>+        if (ret != 0) {</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        if (stat)</div><div class='add'>+            glfs_iatt_to_stat(fs, &amp;iatt, stat);</div><div class='add'>+</div><div class='add'>+        ret = glfs_create_object(&amp;loc, &amp;object);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (ret &amp;&amp; object != NULL) {</div><div class='add'>+        pub_glfs_h_close(object);</div><div class='add'>+        object = NULL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    loc_wipe(&amp;loc);</div><div class='add'>+</div><div class='add'>+    if (inode)</div><div class='add'>+        inode_unref(inode);</div><div class='add'>+</div><div class='add'>+    if (xattr_req)</div><div class='add'>+        dict_unref(xattr_req);</div><div class='add'>+</div><div class='add'>+    glfs_subvol_done(fs, subvol);</div><div class='add'>+</div><div class='add'>+    __GLFS_EXIT_FS;</div><div class='add'>+</div><div class='add'>+invalid_fs:</div><div class='add'>+    return object;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_h_readlink, 3.4.2)</div><div class='add'>+int</div><div class='add'>+pub_glfs_h_readlink(struct glfs *fs, struct glfs_object *object, char *buf,</div><div class='add'>+                    size_t bufsiz)</div><div class='add'>+{</div><div class='add'>+    loc_t loc = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int ret = -1;</div><div class='add'>+    xlator_t *subvol = NULL;</div><div class='add'>+    inode_t *inode = NULL;</div><div class='add'>+    char *linkval = NULL;</div><div class='add'>+</div><div class='add'>+    DECLARE_OLD_THIS;</div><div class='add'>+</div><div class='add'>+    /* validate in args */</div><div class='add'>+    if ((object == NULL) || (buf == NULL)) {</div><div class='add'>+        errno = EINVAL;</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    __GLFS_ENTRY_VALIDATE_FS(fs, invalid_fs);</div><div class='add'>+</div><div class='add'>+    /* get the active volume */</div><div class='add'>+    subvol = glfs_active_subvol(fs);</div><div class='add'>+    if (!subvol) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        errno = EIO;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* get/refresh the in arg objects inode in correlation to the xlator */</div><div class='add'>+    inode = glfs_resolve_inode(fs, subvol, object);</div><div class='add'>+    if (!inode) {</div><div class='add'>+        errno = ESTALE;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    GLFS_LOC_FILL_INODE(inode, loc, out);</div><div class='add'>+</div><div class='add'>+    /* fop/op */</div><div class='add'>+    ret = syncop_readlink(subvol, &amp;loc, &amp;linkval, bufsiz, NULL, NULL);</div><div class='add'>+    DECODE_SYNCOP_ERR(ret);</div><div class='add'>+</div><div class='add'>+    /* populate out args */</div><div class='add'>+    if (ret &gt; 0)</div><div class='add'>+        memcpy(buf, linkval, ret);</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    loc_wipe(&amp;loc);</div><div class='add'>+</div><div class='add'>+    if (inode)</div><div class='add'>+        inode_unref(inode);</div><div class='add'>+</div><div class='add'>+    if (linkval)</div><div class='add'>+        GF_FREE(linkval);</div><div class='add'>+</div><div class='add'>+    glfs_subvol_done(fs, subvol);</div><div class='add'>+</div><div class='add'>+    __GLFS_EXIT_FS;</div><div class='add'>+</div><div class='add'>+invalid_fs:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_h_link, 3.4.2)</div><div class='add'>+int</div><div class='add'>+pub_glfs_h_link(struct glfs *fs, struct glfs_object *linksrc,</div><div class='add'>+                struct glfs_object *parent, const char *name)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    xlator_t *subvol = NULL;</div><div class='add'>+    inode_t *inode = NULL;</div><div class='add'>+    inode_t *pinode = NULL;</div><div class='add'>+    loc_t oldloc = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    loc_t newloc = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    struct iatt iatt = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    DECLARE_OLD_THIS;</div><div class='add'>+</div><div class='add'>+    /* validate in args */</div><div class='add'>+    if ((linksrc == NULL) || (parent == NULL) || (name == NULL)) {</div><div class='add'>+        errno = EINVAL;</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    __GLFS_ENTRY_VALIDATE_FS(fs, invalid_fs);</div><div class='add'>+</div><div class='add'>+    /* get the active volume */</div><div class='add'>+    subvol = glfs_active_subvol(fs);</div><div class='add'>+    if (!subvol) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        errno = EIO;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* get/refresh the in arg objects inode in correlation to the xlator */</div><div class='add'>+    inode = glfs_resolve_inode(fs, subvol, linksrc);</div><div class='add'>+    if (!inode) {</div><div class='add'>+        errno = ESTALE;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (inode-&gt;ia_type == IA_IFDIR) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        errno = EISDIR;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    GLFS_LOC_FILL_INODE(inode, oldloc, out);</div><div class='add'>+</div><div class='add'>+    /* get/refresh the in arg objects inode in correlation to the xlator */</div><div class='add'>+    pinode = glfs_resolve_inode(fs, subvol, parent);</div><div class='add'>+    if (!pinode) {</div><div class='add'>+        errno = ESTALE;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* setup newloc based on parent */</div><div class='add'>+    newloc.parent = inode_ref(pinode);</div><div class='add'>+    newloc.name = name;</div><div class='add'>+    ret = glfs_loc_touchup(&amp;newloc);</div><div class='add'>+    if (ret != 0) {</div><div class='add'>+        errno = EINVAL;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Filling the inode of the hard link to be same as that of the</div><div class='add'>+     * original file</div><div class='add'>+     */</div><div class='add'>+    newloc.inode = inode_ref(inode);</div><div class='add'>+</div><div class='add'>+    /* fop/op */</div><div class='add'>+    ret = syncop_link(subvol, &amp;oldloc, &amp;newloc, &amp;iatt, NULL, NULL);</div><div class='add'>+    DECODE_SYNCOP_ERR(ret);</div><div class='add'>+</div><div class='add'>+    if (ret == 0)</div><div class='add'>+        ret = glfs_loc_link(&amp;newloc, &amp;iatt);</div><div class='add'>+out:</div><div class='add'>+    loc_wipe(&amp;oldloc);</div><div class='add'>+    loc_wipe(&amp;newloc);</div><div class='add'>+</div><div class='add'>+    if (inode)</div><div class='add'>+        inode_unref(inode);</div><div class='add'>+</div><div class='add'>+    if (pinode)</div><div class='add'>+        inode_unref(pinode);</div><div class='add'>+</div><div class='add'>+    glfs_subvol_done(fs, subvol);</div><div class='add'>+</div><div class='add'>+    __GLFS_EXIT_FS;</div><div class='add'>+</div><div class='add'>+invalid_fs:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_h_rename, 3.4.2)</div><div class='add'>+int</div><div class='add'>+pub_glfs_h_rename(struct glfs *fs, struct glfs_object *olddir,</div><div class='add'>+                  const char *oldname, struct glfs_object *newdir,</div><div class='add'>+                  const char *newname)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    xlator_t *subvol = NULL;</div><div class='add'>+    inode_t *oldpinode = NULL;</div><div class='add'>+    inode_t *newpinode = NULL;</div><div class='add'>+    loc_t oldloc = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    loc_t newloc = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    struct iatt oldiatt = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    struct iatt newiatt = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    DECLARE_OLD_THIS;</div><div class='add'>+</div><div class='add'>+    /* validate in args */</div><div class='add'>+    if ((olddir == NULL) || (oldname == NULL) || (newdir == NULL) ||</div><div class='add'>+        (newname == NULL)) {</div><div class='add'>+        errno = EINVAL;</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    __GLFS_ENTRY_VALIDATE_FS(fs, invalid_fs);</div><div class='add'>+</div><div class='add'>+    /* get the active volume */</div><div class='add'>+    subvol = glfs_active_subvol(fs);</div><div class='add'>+    if (!subvol) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        errno = EIO;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* get/refresh the in arg objects inode in correlation to the xlator */</div><div class='add'>+    oldpinode = glfs_resolve_inode(fs, subvol, olddir);</div><div class='add'>+    if (!oldpinode) {</div><div class='add'>+        errno = ESTALE;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = glfs_resolve_at(fs, subvol, oldpinode, oldname, &amp;oldloc, &amp;oldiatt, 0,</div><div class='add'>+                          0);</div><div class='add'>+    if (ret != 0) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* get/refresh the in arg objects inode in correlation to the xlator */</div><div class='add'>+    newpinode = glfs_resolve_inode(fs, subvol, newdir);</div><div class='add'>+    if (!newpinode) {</div><div class='add'>+        errno = ESTALE;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = glfs_resolve_at(fs, subvol, newpinode, newname, &amp;newloc, &amp;newiatt, 0,</div><div class='add'>+                          0);</div><div class='add'>+</div><div class='add'>+    if (ret &amp;&amp; errno != ENOENT &amp;&amp; newloc.parent)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    if (newiatt.ia_type != IA_INVAL) {</div><div class='add'>+        if ((oldiatt.ia_type == IA_IFDIR) != (newiatt.ia_type == IA_IFDIR)) {</div><div class='add'>+            /* Either both old and new must be dirs,</div><div class='add'>+             * or both must be non-dirs. Else, fail.</div><div class='add'>+             */</div><div class='add'>+            ret = -1;</div><div class='add'>+            errno = EEXIST;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* TODO: check if new or old is a prefix of the other, and fail EINVAL */</div><div class='add'>+</div><div class='add'>+    ret = syncop_rename(subvol, &amp;oldloc, &amp;newloc, NULL, NULL);</div><div class='add'>+    DECODE_SYNCOP_ERR(ret);</div><div class='add'>+</div><div class='add'>+    if (ret == 0) {</div><div class='add'>+        inode_rename(oldloc.parent-&gt;table, oldloc.parent, oldloc.name,</div><div class='add'>+                     newloc.parent, newloc.name, oldloc.inode, &amp;oldiatt);</div><div class='add'>+</div><div class='add'>+        if (newloc.inode &amp;&amp; !inode_has_dentry(newloc.inode))</div><div class='add'>+            inode_forget(newloc.inode, 0);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    loc_wipe(&amp;oldloc);</div><div class='add'>+    loc_wipe(&amp;newloc);</div><div class='add'>+</div><div class='add'>+    if (oldpinode)</div><div class='add'>+        inode_unref(oldpinode);</div><div class='add'>+</div><div class='add'>+    if (newpinode)</div><div class='add'>+        inode_unref(newpinode);</div><div class='add'>+</div><div class='add'>+    glfs_subvol_done(fs, subvol);</div><div class='add'>+</div><div class='add'>+    __GLFS_EXIT_FS;</div><div class='add'>+</div><div class='add'>+invalid_fs:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+ * Given a handle/gfid, find if the corresponding inode is present in</div><div class='add'>+ * the inode table. If yes create and return the corresponding glfs_object.</div><div class='add'>+ */</div><div class='add'>+struct glfs_object *</div><div class='add'>+glfs_h_find_handle(struct glfs *fs, unsigned char *handle, int len)</div><div class='add'>+{</div><div class='add'>+    inode_t *newinode = NULL;</div><div class='add'>+    xlator_t *subvol = NULL;</div><div class='add'>+    struct glfs_object *object = NULL;</div><div class='add'>+    uuid_t gfid;</div><div class='add'>+</div><div class='add'>+    /* validate in args */</div><div class='add'>+    if ((fs == NULL) || (handle == NULL) || (len != GFAPI_HANDLE_LENGTH)) {</div><div class='add'>+        errno = EINVAL;</div><div class='add'>+        return NULL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    DECLARE_OLD_THIS;</div><div class='add'>+    __GLFS_ENTRY_VALIDATE_FS(fs, invalid_fs);</div><div class='add'>+</div><div class='add'>+    /* get the active volume */</div><div class='add'>+    subvol = glfs_active_subvol(fs);</div><div class='add'>+    if (!subvol) {</div><div class='add'>+        errno = EIO;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    memcpy(gfid, handle, GFAPI_HANDLE_LENGTH);</div><div class='add'>+</div><div class='add'>+    /* make sure the gfid received is valid */</div><div class='add'>+    GF_VALIDATE_OR_GOTO("glfs_h_find_handle", !(gf_uuid_is_null(gfid)), out);</div><div class='add'>+</div><div class='add'>+    newinode = inode_find(subvol-&gt;itable, gfid);</div><div class='add'>+    if (!newinode) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    object = GF_CALLOC(1, sizeof(struct glfs_object), glfs_mt_glfs_object_t);</div><div class='add'>+    if (object == NULL) {</div><div class='add'>+        errno = ENOMEM;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* populate the return object. The ref taken here</div><div class='add'>+     * is un'refed when the application does glfs_h_close() */</div><div class='add'>+    object-&gt;inode = inode_ref(newinode);</div><div class='add'>+    gf_uuid_copy(object-&gt;gfid, object-&gt;inode-&gt;gfid);</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    /* inode_find takes a reference. Unref it. */</div><div class='add'>+    if (newinode)</div><div class='add'>+        inode_unref(newinode);</div><div class='add'>+</div><div class='add'>+    glfs_subvol_done(fs, subvol);</div><div class='add'>+</div><div class='add'>+    __GLFS_EXIT_FS;</div><div class='add'>+</div><div class='add'>+invalid_fs:</div><div class='add'>+    return object;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+glfs_free_upcall_inode(void *to_free)</div><div class='add'>+{</div><div class='add'>+    struct glfs_upcall_inode *arg = to_free;</div><div class='add'>+</div><div class='add'>+    if (!arg)</div><div class='add'>+        return;</div><div class='add'>+</div><div class='add'>+    if (arg-&gt;object)</div><div class='add'>+        glfs_h_close(arg-&gt;object);</div><div class='add'>+    if (arg-&gt;p_object)</div><div class='add'>+        glfs_h_close(arg-&gt;p_object);</div><div class='add'>+    if (arg-&gt;oldp_object)</div><div class='add'>+        glfs_h_close(arg-&gt;oldp_object);</div><div class='add'>+</div><div class='add'>+    GF_FREE(arg);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+glfs_h_poll_cache_invalidation(struct glfs *fs, struct glfs_upcall *up_arg,</div><div class='add'>+                               struct gf_upcall *upcall_data)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    struct glfs_object *p_object = NULL;</div><div class='add'>+    struct glfs_object *oldp_object = NULL;</div><div class='add'>+    struct glfs_object *object = NULL;</div><div class='add'>+    struct gf_upcall_cache_invalidation *ca_data = NULL;</div><div class='add'>+    struct glfs_upcall_inode *up_inode_arg = NULL;</div><div class='add'>+</div><div class='add'>+    ca_data = upcall_data-&gt;data;</div><div class='add'>+    GF_VALIDATE_OR_GOTO("glfs_h_poll_cache_invalidation", ca_data, out);</div><div class='add'>+</div><div class='add'>+    object = glfs_h_find_handle(fs, upcall_data-&gt;gfid, GFAPI_HANDLE_LENGTH);</div><div class='add'>+    if (!object) {</div><div class='add'>+        /* The reason handle creation will fail is because we</div><div class='add'>+         * couldn't find the inode in the gfapi inode table.</div><div class='add'>+         *</div><div class='add'>+         * But since application would have taken inode_ref, the</div><div class='add'>+         * only case when this can happen is when it has closed</div><div class='add'>+         * the handle and hence will no more be interested in</div><div class='add'>+         * the upcall for this particular gfid.</div><div class='add'>+         */</div><div class='add'>+        gf_smsg(THIS-&gt;name, GF_LOG_DEBUG, errno, API_MSG_CREATE_HANDLE_FAILED,</div><div class='add'>+                "gfid=%s", uuid_utoa(upcall_data-&gt;gfid), NULL);</div><div class='add'>+        errno = ESTALE;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    up_inode_arg = GF_CALLOC(1, sizeof(struct glfs_upcall_inode),</div><div class='add'>+                             glfs_mt_upcall_inode_t);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("glfs_h_poll_cache_invalidation", up_inode_arg, out);</div><div class='add'>+</div><div class='add'>+    up_inode_arg-&gt;object = object;</div><div class='add'>+    up_inode_arg-&gt;flags = ca_data-&gt;flags;</div><div class='add'>+    up_inode_arg-&gt;expire_time_attr = ca_data-&gt;expire_time_attr;</div><div class='add'>+</div><div class='add'>+    /* XXX: Update stat as well in case of UP_*_TIMES.</div><div class='add'>+     * This will be addressed as part of INODE_UPDATE */</div><div class='add'>+    if (ca_data-&gt;flags &amp; GFAPI_INODE_UPDATE_FLAGS) {</div><div class='add'>+        glfs_iatt_to_stat(fs, &amp;ca_data-&gt;stat, &amp;up_inode_arg-&gt;buf);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (ca_data-&gt;flags &amp; GFAPI_UP_PARENT_TIMES) {</div><div class='add'>+        p_object = glfs_h_find_handle(fs, ca_data-&gt;p_stat.ia_gfid,</div><div class='add'>+                                      GFAPI_HANDLE_LENGTH);</div><div class='add'>+        if (!p_object) {</div><div class='add'>+            gf_smsg(THIS-&gt;name, GF_LOG_DEBUG, errno,</div><div class='add'>+                    API_MSG_CREATE_HANDLE_FAILED, "gfid=%s",</div><div class='add'>+                    uuid_utoa(ca_data-&gt;p_stat.ia_gfid), NULL);</div><div class='add'>+            errno = ESTALE;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        glfs_iatt_to_stat(fs, &amp;ca_data-&gt;p_stat, &amp;up_inode_arg-&gt;p_buf);</div><div class='add'>+    }</div><div class='add'>+    up_inode_arg-&gt;p_object = p_object;</div><div class='add'>+</div><div class='add'>+    /* In case of RENAME, update old parent as well */</div><div class='add'>+    if (ca_data-&gt;flags &amp; GFAPI_UP_RENAME) {</div><div class='add'>+        oldp_object = glfs_h_find_handle(fs, ca_data-&gt;oldp_stat.ia_gfid,</div><div class='add'>+                                         GFAPI_HANDLE_LENGTH);</div><div class='add'>+        if (!oldp_object) {</div><div class='add'>+            gf_smsg(THIS-&gt;name, GF_LOG_DEBUG, errno,</div><div class='add'>+                    API_MSG_CREATE_HANDLE_FAILED, "gfid=%s",</div><div class='add'>+                    uuid_utoa(ca_data-&gt;oldp_stat.ia_gfid), NULL);</div><div class='add'>+            errno = ESTALE;</div><div class='add'>+            /* By the time we receive upcall old parent_dir may</div><div class='add'>+             * have got removed. We still need to send upcall</div><div class='add'>+             * for the file/dir and current parent handles. */</div><div class='add'>+            up_inode_arg-&gt;oldp_object = NULL;</div><div class='add'>+            ret = 0;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        glfs_iatt_to_stat(fs, &amp;ca_data-&gt;oldp_stat, &amp;up_inode_arg-&gt;oldp_buf);</div><div class='add'>+    }</div><div class='add'>+    up_inode_arg-&gt;oldp_object = oldp_object;</div><div class='add'>+</div><div class='add'>+    up_arg-&gt;reason = GLFS_UPCALL_INODE_INVALIDATE;</div><div class='add'>+    up_arg-&gt;event = up_inode_arg;</div><div class='add'>+    up_arg-&gt;free_event = glfs_free_upcall_inode;</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (ret) {</div><div class='add'>+        /* Close p_object and oldp_object as well if being referenced.*/</div><div class='add'>+        if (object)</div><div class='add'>+            glfs_h_close(object);</div><div class='add'>+</div><div class='add'>+        /* Set reason to prevent applications from using -&gt;event */</div><div class='add'>+        up_arg-&gt;reason = GLFS_UPCALL_EVENT_NULL;</div><div class='add'>+        GF_FREE(up_inode_arg);</div><div class='add'>+    }</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+glfs_release_upcall(void *ptr)</div><div class='add'>+{</div><div class='add'>+    struct glfs_upcall *to_free = ptr;</div><div class='add'>+</div><div class='add'>+    if (to_free-&gt;event)</div><div class='add'>+        to_free-&gt;free_event(to_free-&gt;event);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+ * This API is used to poll for upcall events stored in the upcall list.</div><div class='add'>+ * Current users of this API is NFS-Ganesha. In case of any event received, it</div><div class='add'>+ * will be mapped appropriately into 'glfs_upcall' along with the handle object</div><div class='add'>+ * to be passed to NFS-Ganesha.</div><div class='add'>+ *</div><div class='add'>+ * On success, applications need to check if up_arg is not-NULL or errno is not</div><div class='add'>+ * ENOENT. glfs_upcall_get_reason() can be used to decide what kind of event</div><div class='add'>+ * has been received.</div><div class='add'>+ *</div><div class='add'>+ * Current supported upcall_events:</div><div class='add'>+ *      GLFS_UPCALL_INODE_INVALIDATE</div><div class='add'>+ *</div><div class='add'>+ * After processing the event, applications need to free 'up_arg' by calling</div><div class='add'>+ * glfs_free().</div><div class='add'>+ *</div><div class='add'>+ * Also similar to I/Os, the application should ideally stop polling before</div><div class='add'>+ * calling glfs_fini(..). Hence making an assumption that 'fs' &amp; ctx structures</div><div class='add'>+ * cannot be freed while in this routine.</div><div class='add'>+ */</div><div class='add'>+GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_h_poll_upcall, 3.7.16)</div><div class='add'>+int</div><div class='add'>+pub_glfs_h_poll_upcall(struct glfs *fs, struct glfs_upcall **up_arg)</div><div class='add'>+{</div><div class='add'>+    upcall_entry *u_list = NULL;</div><div class='add'>+    upcall_entry *tmp = NULL;</div><div class='add'>+    xlator_t *subvol = NULL;</div><div class='add'>+    glusterfs_ctx_t *ctx = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    struct gf_upcall *upcall_data = NULL;</div><div class='add'>+</div><div class='add'>+    DECLARE_OLD_THIS;</div><div class='add'>+</div><div class='add'>+    if (!up_arg) {</div><div class='add'>+        errno = EINVAL;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    __GLFS_ENTRY_VALIDATE_FS(fs, err);</div><div class='add'>+</div><div class='add'>+    /* get the active volume */</div><div class='add'>+    subvol = glfs_active_subvol(fs);</div><div class='add'>+    if (!subvol) {</div><div class='add'>+        errno = EIO;</div><div class='add'>+        goto restore;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Ideally applications should stop polling before calling</div><div class='add'>+     * 'glfs_fini'. Yet cross check if cleanup has started. */</div><div class='add'>+    pthread_mutex_lock(&amp;fs-&gt;mutex);</div><div class='add'>+    {</div><div class='add'>+        ctx = fs-&gt;ctx;</div><div class='add'>+</div><div class='add'>+        if (ctx-&gt;cleanup_started) {</div><div class='add'>+            pthread_mutex_unlock(&amp;fs-&gt;mutex);</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        fs-&gt;pin_refcnt++;</div><div class='add'>+</div><div class='add'>+        /* once we call this function, the applications seems to be</div><div class='add'>+         * interested in events, enable caching them */</div><div class='add'>+        fs-&gt;cache_upcalls = _gf_true;</div><div class='add'>+    }</div><div class='add'>+    pthread_mutex_unlock(&amp;fs-&gt;mutex);</div><div class='add'>+</div><div class='add'>+    pthread_mutex_lock(&amp;fs-&gt;upcall_list_mutex);</div><div class='add'>+    {</div><div class='add'>+        list_for_each_entry_safe(u_list, tmp, &amp;fs-&gt;upcall_list, upcall_list)</div><div class='add'>+        {</div><div class='add'>+            list_del_init(&amp;u_list-&gt;upcall_list);</div><div class='add'>+            upcall_data = &amp;u_list-&gt;upcall_data;</div><div class='add'>+            break;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    /* No other thread can delete this entry. So unlock it */</div><div class='add'>+    pthread_mutex_unlock(&amp;fs-&gt;upcall_list_mutex);</div><div class='add'>+</div><div class='add'>+    if (upcall_data) {</div><div class='add'>+        switch (upcall_data-&gt;event_type) {</div><div class='add'>+            case GF_UPCALL_CACHE_INVALIDATION:</div><div class='add'>+                *up_arg = GLFS_CALLOC(1, sizeof(struct gf_upcall),</div><div class='add'>+                                      glfs_release_upcall,</div><div class='add'>+                                      glfs_mt_upcall_entry_t);</div><div class='add'>+                if (!*up_arg) {</div><div class='add'>+                    errno = ENOMEM;</div><div class='add'>+                    break; /* goto free u_list */</div><div class='add'>+                }</div><div class='add'>+</div><div class='add'>+                /* XXX: Need to revisit this to support</div><div class='add'>+                 * GLFS_UPCALL_INODE_UPDATE if required. */</div><div class='add'>+                ret = glfs_h_poll_cache_invalidation(fs, *up_arg, upcall_data);</div><div class='add'>+                if (ret || (*up_arg)-&gt;reason == GLFS_UPCALL_EVENT_NULL) {</div><div class='add'>+                    /* It could so happen that the file which got</div><div class='add'>+                     * upcall notification may have got deleted by</div><div class='add'>+                     * the same client. Irrespective of the error,</div><div class='add'>+                     * return with an error or success+ENOENT. */</div><div class='add'>+                    if ((*up_arg)-&gt;reason == GLFS_UPCALL_EVENT_NULL)</div><div class='add'>+                        errno = ENOENT;</div><div class='add'>+</div><div class='add'>+                    GLFS_FREE(*up_arg);</div><div class='add'>+                    *up_arg = NULL;</div><div class='add'>+                }</div><div class='add'>+                break;</div><div class='add'>+            case GF_UPCALL_RECALL_LEASE:</div><div class='add'>+                gf_log("glfs_h_poll_upcall", GF_LOG_DEBUG,</div><div class='add'>+                       "UPCALL_RECALL_LEASE is not implemented yet");</div><div class='add'>+            /* fallthrough till we support leases */</div><div class='add'>+            case GF_UPCALL_EVENT_NULL:</div><div class='add'>+                /* no 'default:' label, to force handling all upcall events */</div><div class='add'>+                errno = ENOENT;</div><div class='add'>+                break;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        GF_FREE(u_list-&gt;upcall_data.data);</div><div class='add'>+        GF_FREE(u_list);</div><div class='add'>+    } else {</div><div class='add'>+        /* fs-&gt;upcall_list was empty, no upcall events cached */</div><div class='add'>+        errno = ENOENT;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    pthread_mutex_lock(&amp;fs-&gt;mutex);</div><div class='add'>+    {</div><div class='add'>+        fs-&gt;pin_refcnt--;</div><div class='add'>+    }</div><div class='add'>+    pthread_mutex_unlock(&amp;fs-&gt;mutex);</div><div class='add'>+</div><div class='add'>+    glfs_subvol_done(fs, subvol);</div><div class='add'>+</div><div class='add'>+restore:</div><div class='add'>+    __GLFS_EXIT_FS;</div><div class='add'>+err:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static gf_boolean_t log_upcall370 = _gf_true; /* log once */</div><div class='add'>+</div><div class='add'>+/* The old glfs_h_poll_upcall interface requires intimate knowledge of the</div><div class='add'>+ * structures that are returned to the calling application. This is not</div><div class='add'>+ * recommended, as the returned structures need to returned correctly (handles</div><div class='add'>+ * closed, memory free'd with the unavailable GF_FREE(), and possibly more.)</div><div class='add'>+ *</div><div class='add'>+ * To the best of our knowledge, only NFS-Ganesha uses the upcall events</div><div class='add'>+ * through gfapi. We keep this backwards compatibility function around so that</div><div class='add'>+ * applications using the existing implementation do not break.</div><div class='add'>+ *</div><div class='add'>+ * WARNING: this function will be removed in the future.</div><div class='add'>+ */</div><div class='add'>+GFAPI_SYMVER_PUBLIC(glfs_h_poll_upcall370, glfs_h_poll_upcall, 3.7.0)</div><div class='add'>+int</div><div class='add'>+pub_glfs_h_poll_upcall370(struct glfs *fs, struct glfs_callback_arg *up_arg)</div><div class='add'>+{</div><div class='add'>+    struct glfs_upcall *upcall = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    if (log_upcall370) {</div><div class='add'>+        log_upcall370 = _gf_false;</div><div class='add'>+        gf_log(THIS-&gt;name, GF_LOG_WARNING,</div><div class='add'>+               "this application is "</div><div class='add'>+               "compiled against an old version of libgfapi, it "</div><div class='add'>+               "should use glfs_free() to release the structure "</div><div class='add'>+               "returned by glfs_h_poll_upcall() - for more details, "</div><div class='add'>+               "see http://review.gluster.org/14701");</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = pub_glfs_h_poll_upcall(fs, &amp;upcall);</div><div class='add'>+    if (ret == 0) {</div><div class='add'>+        up_arg-&gt;fs = fs;</div><div class='add'>+        if ((errno == ENOENT) || !upcall || !upcall-&gt;event) {</div><div class='add'>+            up_arg-&gt;reason = GLFS_UPCALL_EVENT_NULL;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        up_arg-&gt;reason = upcall-&gt;reason;</div><div class='add'>+</div><div class='add'>+        if (upcall-&gt;reason == GLFS_UPCALL_INODE_INVALIDATE) {</div><div class='add'>+            struct glfs_callback_inode_arg *cb_inode = NULL;</div><div class='add'>+            struct glfs_upcall_inode *up_inode = NULL;</div><div class='add'>+</div><div class='add'>+            cb_inode = GF_CALLOC(1, sizeof(struct glfs_callback_inode_arg),</div><div class='add'>+                                 glfs_mt_upcall_inode_t);</div><div class='add'>+            if (!cb_inode) {</div><div class='add'>+                errno = ENOMEM;</div><div class='add'>+                ret = -1;</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            up_inode = upcall-&gt;event;</div><div class='add'>+</div><div class='add'>+            /* copy attributes one by one, the memory layout might</div><div class='add'>+             * be different between the old glfs_callback_inode_arg</div><div class='add'>+             * and new glfs_upcall_inode */</div><div class='add'>+            cb_inode-&gt;object = up_inode-&gt;object;</div><div class='add'>+            cb_inode-&gt;flags = up_inode-&gt;flags;</div><div class='add'>+            memcpy(&amp;cb_inode-&gt;buf, &amp;up_inode-&gt;buf, sizeof(struct stat));</div><div class='add'>+            cb_inode-&gt;expire_time_attr = up_inode-&gt;expire_time_attr;</div><div class='add'>+            cb_inode-&gt;p_object = up_inode-&gt;p_object;</div><div class='add'>+            memcpy(&amp;cb_inode-&gt;p_buf, &amp;up_inode-&gt;p_buf, sizeof(struct stat));</div><div class='add'>+            cb_inode-&gt;oldp_object = up_inode-&gt;oldp_object;</div><div class='add'>+            memcpy(&amp;cb_inode-&gt;oldp_buf, &amp;up_inode-&gt;oldp_buf,</div><div class='add'>+                   sizeof(struct stat));</div><div class='add'>+</div><div class='add'>+            up_arg-&gt;event_arg = cb_inode;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (upcall) {</div><div class='add'>+        /* we can not use glfs_free() here, objects need to stay */</div><div class='add'>+        GF_FREE(upcall-&gt;event);</div><div class='add'>+        GF_FREE(upcall);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#ifdef HAVE_ACL_LIBACL_H</div><div class='add'>+#include &lt;glusterfs/glusterfs-acl.h&gt;</div><div class='add'>+#include &lt;acl/libacl.h&gt;</div><div class='add'>+</div><div class='add'>+GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_h_acl_set, 3.7.0)</div><div class='add'>+int</div><div class='add'>+pub_glfs_h_acl_set(struct glfs *fs, struct glfs_object *object,</div><div class='add'>+                   const acl_type_t type, const acl_t acl)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    char *acl_s = NULL;</div><div class='add'>+    const char *acl_key = NULL;</div><div class='add'>+    struct glfs_object *new_object = NULL;</div><div class='add'>+</div><div class='add'>+    DECLARE_OLD_THIS;</div><div class='add'>+</div><div class='add'>+    if (!object || !acl) {</div><div class='add'>+        errno = EINVAL;</div><div class='add'>+        return ret;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    __GLFS_ENTRY_VALIDATE_FS(fs, invalid_fs);</div><div class='add'>+</div><div class='add'>+    acl_key = gf_posix_acl_get_key(type);</div><div class='add'>+    if (!acl_key)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    acl_s = acl_to_any_text(acl, NULL, ',', TEXT_ABBREVIATE | TEXT_NUMERIC_IDS);</div><div class='add'>+    if (!acl_s)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    if (IA_ISLNK(object-&gt;inode-&gt;ia_type)) {</div><div class='add'>+        new_object = glfs_h_resolve_symlink(fs, object);</div><div class='add'>+        if (new_object == NULL)</div><div class='add'>+            goto out;</div><div class='add'>+    } else</div><div class='add'>+        new_object = object;</div><div class='add'>+</div><div class='add'>+    ret = pub_glfs_h_setxattrs(fs, new_object, acl_key, acl_s,</div><div class='add'>+                               strlen(acl_s) + 1, 0);</div><div class='add'>+</div><div class='add'>+    acl_free(acl_s);</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (IA_ISLNK(object-&gt;inode-&gt;ia_type) &amp;&amp; new_object)</div><div class='add'>+        glfs_h_close(new_object);</div><div class='add'>+</div><div class='add'>+    __GLFS_EXIT_FS;</div><div class='add'>+</div><div class='add'>+invalid_fs:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_h_acl_get, 3.7.0)</div><div class='add'>+acl_t</div><div class='add'>+pub_glfs_h_acl_get(struct glfs *fs, struct glfs_object *object,</div><div class='add'>+                   const acl_type_t type)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+    acl_t acl = NULL;</div><div class='add'>+    char *acl_s = NULL;</div><div class='add'>+    dict_t *xattr = NULL;</div><div class='add'>+    const char *acl_key = NULL;</div><div class='add'>+    struct glfs_object *new_object = NULL;</div><div class='add'>+</div><div class='add'>+    DECLARE_OLD_THIS;</div><div class='add'>+</div><div class='add'>+    if (!object) {</div><div class='add'>+        errno = EINVAL;</div><div class='add'>+        return NULL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    __GLFS_ENTRY_VALIDATE_FS(fs, invalid_fs);</div><div class='add'>+</div><div class='add'>+    acl_key = gf_posix_acl_get_key(type);</div><div class='add'>+    if (!acl_key)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    if (IA_ISLNK(object-&gt;inode-&gt;ia_type)) {</div><div class='add'>+        new_object = glfs_h_resolve_symlink(fs, object);</div><div class='add'>+        if (new_object == NULL)</div><div class='add'>+            goto out;</div><div class='add'>+    } else</div><div class='add'>+        new_object = object;</div><div class='add'>+</div><div class='add'>+    ret = glfs_h_getxattrs_common(fs, new_object, &amp;xattr, acl_key, _gf_false);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    ret = dict_get_str(xattr, (char *)acl_key, &amp;acl_s);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    acl = acl_from_text(acl_s);</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (xattr)</div><div class='add'>+        dict_unref(xattr);</div><div class='add'>+</div><div class='add'>+    if (IA_ISLNK(object-&gt;inode-&gt;ia_type) &amp;&amp; new_object)</div><div class='add'>+        glfs_h_close(new_object);</div><div class='add'>+</div><div class='add'>+    __GLFS_EXIT_FS;</div><div class='add'>+</div><div class='add'>+invalid_fs:</div><div class='add'>+    return acl;</div><div class='add'>+}</div><div class='add'>+#else /* !HAVE_ACL_LIBACL_H */</div><div class='add'>+GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_h_acl_get, 3.7.0)</div><div class='add'>+acl_t</div><div class='add'>+pub_glfs_h_acl_get(struct glfs *fs, struct glfs_object *object,</div><div class='add'>+                   const acl_type_t type)</div><div class='add'>+{</div><div class='add'>+    errno = ENOTSUP;</div><div class='add'>+    return NULL;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_h_acl_set, 3.7.0)</div><div class='add'>+int</div><div class='add'>+pub_glfs_h_acl_set(struct glfs *fs, struct glfs_object *object,</div><div class='add'>+                   const acl_type_t type, const acl_t acl)</div><div class='add'>+{</div><div class='add'>+    errno = ENOTSUP;</div><div class='add'>+    return -1;</div><div class='add'>+}</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+/* The API to perform read using anonymous fd */</div><div class='add'>+GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_h_anonymous_read, 3.7.0)</div><div class='add'>+ssize_t</div><div class='add'>+pub_glfs_h_anonymous_read(struct glfs *fs, struct glfs_object *object,</div><div class='add'>+                          const void *buf, size_t count, off_t offset)</div><div class='add'>+{</div><div class='add'>+    struct iovec iov = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    ssize_t ret = 0;</div><div class='add'>+</div><div class='add'>+    /* validate in args */</div><div class='add'>+    if ((fs == NULL) || (object == NULL)) {</div><div class='add'>+        errno = EINVAL;</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    iov.iov_base = (void *)buf;</div><div class='add'>+    iov.iov_len = count;</div><div class='add'>+</div><div class='add'>+    ret = glfs_anonymous_preadv(fs, object, &amp;iov, 1, offset, 0);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* The API to perform write using anonymous fd */</div><div class='add'>+GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_h_anonymous_write, 3.7.0)</div><div class='add'>+ssize_t</div><div class='add'>+pub_glfs_h_anonymous_write(struct glfs *fs, struct glfs_object *object,</div><div class='add'>+                           const void *buf, size_t count, off_t offset)</div><div class='add'>+{</div><div class='add'>+    struct iovec iov = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    ssize_t ret = 0;</div><div class='add'>+</div><div class='add'>+    /* validate in args */</div><div class='add'>+    if ((fs == NULL) || (object == NULL)) {</div><div class='add'>+        errno = EINVAL;</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    iov.iov_base = (void *)buf;</div><div class='add'>+    iov.iov_len = count;</div><div class='add'>+</div><div class='add'>+    ret = glfs_anonymous_pwritev(fs, object, &amp;iov, 1, offset, 0);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_object_copy, 3.11.0)</div><div class='add'>+struct glfs_object *</div><div class='add'>+pub_glfs_object_copy(struct glfs_object *src)</div><div class='add'>+{</div><div class='add'>+    struct glfs_object *object = NULL;</div><div class='add'>+</div><div class='add'>+    GF_VALIDATE_OR_GOTO("glfs_dup_object", src, out);</div><div class='add'>+</div><div class='add'>+    object = GF_CALLOC(1, sizeof(struct glfs_object), glfs_mt_glfs_object_t);</div><div class='add'>+    if (object == NULL) {</div><div class='add'>+        errno = ENOMEM;</div><div class='add'>+        gf_smsg(THIS-&gt;name, GF_LOG_WARNING, errno, API_MSG_CREATE_HANDLE_FAILED,</div><div class='add'>+                "glfs_dup_object gfid=%s", uuid_utoa(src-&gt;inode-&gt;gfid), NULL);</div><div class='add'>+        return NULL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    object-&gt;inode = inode_ref(src-&gt;inode);</div><div class='add'>+    gf_uuid_copy(object-&gt;gfid, src-&gt;inode-&gt;gfid);</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return object;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_xreaddirplus_get_object, 3.11.0)</div><div class='add'>+struct glfs_object *</div><div class='add'>+pub_glfs_xreaddirplus_get_object(struct glfs_xreaddirp_stat *xstat)</div><div class='add'>+{</div><div class='add'>+    GF_VALIDATE_OR_GOTO("glfs_xreaddirplus_get_object", xstat, out);</div><div class='add'>+</div><div class='add'>+    if (!(xstat-&gt;flags_handled &amp; GFAPI_XREADDIRP_HANDLE))</div><div class='add'>+        gf_smsg(THIS-&gt;name, GF_LOG_ERROR, errno, API_MSG_HANDLE_NOT_SET,</div><div class='add'>+                "GFAPI_XREADDIRP_HANDLE xstat=%p", xstat, "handle=%x",</div><div class='add'>+                xstat-&gt;flags_handled, NULL);</div><div class='add'>+</div><div class='add'>+    return xstat-&gt;object;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return NULL;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_h_lease, 4.0.0)</div><div class='add'>+int</div><div class='add'>+pub_glfs_h_lease(struct glfs *fs, struct glfs_object *object,</div><div class='add'>+                 struct glfs_lease *lease)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    xlator_t *subvol = NULL;</div><div class='add'>+    inode_t *inode = NULL;</div><div class='add'>+    loc_t loc = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    struct gf_lease gf_lease = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    /* validate in args */</div><div class='add'>+    if ((fs == NULL) || (object == NULL)) {</div><div class='add'>+        errno = EINVAL;</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    DECLARE_OLD_THIS;</div><div class='add'>+    __GLFS_ENTRY_VALIDATE_FS(fs, invalid_fs);</div><div class='add'>+</div><div class='add'>+    /* get the active volume */</div><div class='add'>+    subvol = glfs_active_subvol(fs);</div><div class='add'>+    if (!subvol) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        errno = EIO;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* get/refresh the in arg objects inode in correlation to the xlator */</div><div class='add'>+    inode = glfs_resolve_inode(fs, subvol, object);</div><div class='add'>+    if (!inode) {</div><div class='add'>+        errno = ESTALE;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* populate loc */</div><div class='add'>+    GLFS_LOC_FILL_INODE(inode, loc, out);</div><div class='add'>+</div><div class='add'>+    glfs_lease_to_gf_lease(lease, &amp;gf_lease);</div><div class='add'>+</div><div class='add'>+    ret = syncop_lease(subvol, &amp;loc, &amp;gf_lease, NULL, NULL);</div><div class='add'>+    DECODE_SYNCOP_ERR(ret);</div><div class='add'>+</div><div class='add'>+    gf_lease_to_glfs_lease(&amp;gf_lease, lease);</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    loc_wipe(&amp;loc);</div><div class='add'>+</div><div class='add'>+    if (inode)</div><div class='add'>+        inode_unref(inode);</div><div class='add'>+</div><div class='add'>+    glfs_subvol_done(fs, subvol);</div><div class='add'>+</div><div class='add'>+    __GLFS_EXIT_FS;</div><div class='add'>+</div><div class='add'>+invalid_fs:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='head'>diff --git a/api/src/glfs-handles.h b/api/src/glfs-handles.h<br/>new file mode 100644<br/>index 00000000000..4d039b9c76b<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/api/src/glfs-handles.h?id=d1d7a6f35c816822fab51c820e25023863c239c1'>api/src/glfs-handles.h</a></div><div class='hunk'>@@ -0,0 +1,355 @@</div><div class='add'>+/*</div><div class='add'>+  Copyright (c) 2013-2018 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#ifndef _GLFS_HANDLES_H</div><div class='add'>+#define _GLFS_HANDLES_H</div><div class='add'>+</div><div class='add'>+#include "glfs.h"</div><div class='add'>+</div><div class='add'>+/* GLFS OBJECT BASED OPERATIONS</div><div class='add'>+ *</div><div class='add'>+ * The following APIs are introduced to provide an API framework that can work</div><div class='add'>+ * with gluster objects (files and directories), instead of absolute paths.</div><div class='add'>+ *</div><div class='add'>+ * The following API set can be related to the POSIX *at interfaces (like</div><div class='add'>+ * openat (2)). The intention of these APIs is to be able to operate based</div><div class='add'>+ * on parent object and looking up or creating child objects within, OR to be</div><div class='add'>+ * used on the actual object thus looked up or created, and retrieve information</div><div class='add'>+ * regarding the same.</div><div class='add'>+ *</div><div class='add'>+ * The APIs also provide for generating an opaque invariant handle to the</div><div class='add'>+ * object, that can later be used to lookup the object, instead of the regular</div><div class='add'>+ * glfs_h_* variants. The APIs that provide this behaviour are,</div><div class='add'>+ * glfs_h_extract_handle and glfs_h_create_from_handle.</div><div class='add'>+ *</div><div class='add'>+ * The object handles can be transitioned to fd based operations as supported</div><div class='add'>+ * by glfs.h calls, using the glfs_h_open call. This provides a way to move</div><div class='add'>+ * from objects to fd's akin to moving from path to fd for required operations.</div><div class='add'>+ *</div><div class='add'>+ * NOTE: The opaque invariant handle is the GFID of the object in reality, but</div><div class='add'>+ * maintained as an opaque data value, for potential internal changes to the</div><div class='add'>+ * same without impacting the caller.</div><div class='add'>+ *</div><div class='add'>+ * NOTE: Currently looking up an object can create multiple object handles to</div><div class='add'>+ * the same, i.e distinct glfs_object *. Hence each such looked up or received</div><div class='add'>+ * handle from other calls, would need to be closed. In the future, for a given</div><div class='add'>+ * object these pointers would be the same, and an ease of use API to forget all</div><div class='add'>+ * instances of this bject would be provided (instead of a per lookup close).</div><div class='add'>+ * This should not change the APIs in their current form.</div><div class='add'>+ *</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+/* Handle length for object handles returned from glfs_h_extract_handle or</div><div class='add'>+ * glfs_h_create_from_handle */</div><div class='add'>+#define GFAPI_HANDLE_LENGTH 16</div><div class='add'>+</div><div class='add'>+/* These flags should be in sync to the ones defined in upcall.h */</div><div class='add'>+#define GFAPI_UP_NLINK 0x00000001 /* update nlink */</div><div class='add'>+#define GFAPI_UP_MODE 0x00000002  /* update mode and ctime */</div><div class='add'>+#define GFAPI_UP_OWN 0x00000004   /* update mode,uid,gid and ctime */</div><div class='add'>+#define GFAPI_UP_SIZE 0x00000008  /* update fsize */</div><div class='add'>+#define GFAPI_UP_TIMES 0x00000010 /* update all times */</div><div class='add'>+#define GFAPI_UP_ATIME 0x00000020 /* update atime only */</div><div class='add'>+#define GFAPI_UP_PERM                                                          \</div><div class='add'>+    0x00000040 /* update fields needed for                                     \</div><div class='add'>+                  permission checking */</div><div class='add'>+#define GFAPI_UP_RENAME                                                        \</div><div class='add'>+    0x00000080 /* this is a rename op -                                        \</div><div class='add'>+                  delete the cache entry */</div><div class='add'>+#define GFAPI_UP_FORGET                                                        \</div><div class='add'>+    0x00000100                           /* inode_forget on server side -      \</div><div class='add'>+                                            invalidate the cache entry */</div><div class='add'>+#define GFAPI_UP_PARENT_TIMES 0x00000200 /* update parent dir times */</div><div class='add'>+</div><div class='add'>+#define GFAPI_INODE_UPDATE_FLAGS                                               \</div><div class='add'>+    (GFAPI_UP_NLINK | GFAPI_UP_MODE | GFAPI_UP_OWN | GFAPI_UP_SIZE |           \</div><div class='add'>+     GFAPI_UP_TIMES | GFAPI_UP_ATIME)</div><div class='add'>+</div><div class='add'>+/* Portability non glibc c++ build systems */</div><div class='add'>+#ifndef __THROW</div><div class='add'>+#if defined __cplusplus</div><div class='add'>+#define __THROW throw()</div><div class='add'>+#else</div><div class='add'>+#define __THROW</div><div class='add'>+#endif</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+__BEGIN_DECLS</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+ * Notes:</div><div class='add'>+ *</div><div class='add'>+ * The file object handle. One per looked up, created file/directory</div><div class='add'>+ *</div><div class='add'>+ * This had been introduced to facilitate gfid/inode based gfapi</div><div class='add'>+ * - a requirement introduced by nfs-ganesha</div><div class='add'>+ */</div><div class='add'>+struct glfs_object;</div><div class='add'>+typedef struct glfs_object glfs_object_t;</div><div class='add'>+</div><div class='add'>+/* Functions for getting details about the glfs_upcall_inode</div><div class='add'>+ *</div><div class='add'>+ * None of the pointers returned by the below functions should be free()'d,</div><div class='add'>+ * glfs_free()'d or glfs_h_close()'d by the application.</div><div class='add'>+ *</div><div class='add'>+ * Releasing of the structures is done by passing the glfs_upcall pointer</div><div class='add'>+ * to glfs_free().</div><div class='add'>+ */</div><div class='add'>+struct glfs_upcall_inode;</div><div class='add'>+typedef struct glfs_upcall_inode glfs_upcall_inode_t;</div><div class='add'>+</div><div class='add'>+glfs_object_t *</div><div class='add'>+glfs_upcall_inode_get_object(glfs_upcall_inode_t *arg) __THROW</div><div class='add'>+    GFAPI_PUBLIC(glfs_upcall_inode_get_object, 3.7.16);</div><div class='add'>+</div><div class='add'>+uint64_t</div><div class='add'>+glfs_upcall_inode_get_flags(glfs_upcall_inode_t *arg) __THROW</div><div class='add'>+    GFAPI_PUBLIC(glfs_upcall_inode_get_flags, 3.7.16);</div><div class='add'>+</div><div class='add'>+struct stat *</div><div class='add'>+glfs_upcall_inode_get_stat(glfs_upcall_inode_t *arg) __THROW</div><div class='add'>+    GFAPI_PUBLIC(glfs_upcall_inode_get_stat, 3.7.16);</div><div class='add'>+</div><div class='add'>+uint64_t</div><div class='add'>+glfs_upcall_inode_get_expire(glfs_upcall_inode_t *arg) __THROW</div><div class='add'>+    GFAPI_PUBLIC(glfs_upcall_inode_get_expire, 3.7.16);</div><div class='add'>+</div><div class='add'>+glfs_object_t *</div><div class='add'>+glfs_upcall_inode_get_pobject(glfs_upcall_inode_t *arg) __THROW</div><div class='add'>+    GFAPI_PUBLIC(glfs_upcall_inode_get_pobject, 3.7.16);</div><div class='add'>+</div><div class='add'>+struct stat *</div><div class='add'>+glfs_upcall_inode_get_pstat(glfs_upcall_inode_t *arg) __THROW</div><div class='add'>+    GFAPI_PUBLIC(glfs_upcall_inode_get_pstat, 3.7.16);</div><div class='add'>+</div><div class='add'>+glfs_object_t *</div><div class='add'>+glfs_upcall_inode_get_oldpobject(glfs_upcall_inode_t *arg) __THROW</div><div class='add'>+    GFAPI_PUBLIC(glfs_upcall_inode_get_oldpobject, 3.7.16);</div><div class='add'>+</div><div class='add'>+struct stat *</div><div class='add'>+glfs_upcall_inode_get_oldpstat(glfs_upcall_inode_t *arg) __THROW</div><div class='add'>+    GFAPI_PUBLIC(glfs_upcall_inode_get_oldpstat, 3.7.16);</div><div class='add'>+</div><div class='add'>+/* Handle based operations */</div><div class='add'>+/* Operations that generate handles */</div><div class='add'>+glfs_object_t *</div><div class='add'>+glfs_h_lookupat(glfs_t *fs, glfs_object_t *parent, const char *path,</div><div class='add'>+                struct stat *stat, int follow) __THROW</div><div class='add'>+    GFAPI_PUBLIC(glfs_h_lookupat, 3.7.4);</div><div class='add'>+</div><div class='add'>+glfs_object_t *</div><div class='add'>+glfs_h_creat(glfs_t *fs, glfs_object_t *parent, const char *path, int flags,</div><div class='add'>+             mode_t mode, struct stat *sb) __THROW</div><div class='add'>+    GFAPI_PUBLIC(glfs_h_creat, 3.4.2);</div><div class='add'>+</div><div class='add'>+glfs_object_t *</div><div class='add'>+glfs_h_mkdir(glfs_t *fs, glfs_object_t *parent, const char *path, mode_t flags,</div><div class='add'>+             struct stat *sb) __THROW GFAPI_PUBLIC(glfs_h_mkdir, 3.4.2);</div><div class='add'>+</div><div class='add'>+glfs_object_t *</div><div class='add'>+glfs_h_mknod(glfs_t *fs, glfs_object_t *parent, const char *path, mode_t mode,</div><div class='add'>+             dev_t dev, struct stat *sb) __THROW</div><div class='add'>+    GFAPI_PUBLIC(glfs_h_mknod, 3.4.2);</div><div class='add'>+</div><div class='add'>+glfs_object_t *</div><div class='add'>+glfs_h_symlink(glfs_t *fs, glfs_object_t *parent, const char *name,</div><div class='add'>+               const char *data, struct stat *stat) __THROW</div><div class='add'>+    GFAPI_PUBLIC(glfs_h_symlink, 3.4.2);</div><div class='add'>+</div><div class='add'>+/* Operations on the actual objects */</div><div class='add'>+int</div><div class='add'>+glfs_h_unlink(glfs_t *fs, glfs_object_t *parent, const char *path) __THROW</div><div class='add'>+    GFAPI_PUBLIC(glfs_h_unlink, 3.4.2);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+glfs_h_close(glfs_object_t *object) __THROW GFAPI_PUBLIC(glfs_h_close, 3.4.2);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+glfs_caller_specific_init(void *uid_caller_key, void *gid_caller_key,</div><div class='add'>+                          void *future) __THROW</div><div class='add'>+    GFAPI_PUBLIC(glfs_caller_specific_init, 3.5.0);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+glfs_h_truncate(glfs_t *fs, glfs_object_t *object, off_t offset) __THROW</div><div class='add'>+    GFAPI_PUBLIC(glfs_h_truncate, 3.4.2);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+glfs_h_stat(glfs_t *fs, glfs_object_t *object, struct stat *stat) __THROW</div><div class='add'>+    GFAPI_PUBLIC(glfs_h_stat, 3.4.2);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+glfs_h_statfs(glfs_t *fs, glfs_object_t *object, struct statvfs *stat) __THROW</div><div class='add'>+    GFAPI_PUBLIC(glfs_h_statfs, 3.7.0);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+glfs_h_getattrs(glfs_t *fs, glfs_object_t *object, struct stat *stat) __THROW</div><div class='add'>+    GFAPI_PUBLIC(glfs_h_getattrs, 3.4.2);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+glfs_h_getxattrs(glfs_t *fs, glfs_object_t *object, const char *name,</div><div class='add'>+                 void *value, size_t size) __THROW</div><div class='add'>+    GFAPI_PUBLIC(glfs_h_getxattrs, 3.5.1);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+glfs_h_setattrs(glfs_t *fs, glfs_object_t *object, struct stat *sb,</div><div class='add'>+                int valid) __THROW GFAPI_PUBLIC(glfs_h_setattrs, 3.4.2);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+glfs_h_setxattrs(glfs_t *fs, glfs_object_t *object, const char *name,</div><div class='add'>+                 const void *value, size_t size, int flags) __THROW</div><div class='add'>+    GFAPI_PUBLIC(glfs_h_setxattrs, 3.5.0);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+glfs_h_readlink(glfs_t *fs, glfs_object_t *object, char *buf,</div><div class='add'>+                size_t bufsiz) __THROW GFAPI_PUBLIC(glfs_h_readlink, 3.4.2);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+glfs_h_link(glfs_t *fs, glfs_object_t *linktgt, glfs_object_t *parent,</div><div class='add'>+            const char *name) __THROW GFAPI_PUBLIC(glfs_h_link, 3.4.2);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+glfs_h_rename(glfs_t *fs, glfs_object_t *olddir, const char *oldname,</div><div class='add'>+              glfs_object_t *newdir, const char *newname) __THROW</div><div class='add'>+    GFAPI_PUBLIC(glfs_h_rename, 3.4.2);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+glfs_h_removexattrs(glfs_t *fs, glfs_object_t *object, const char *name) __THROW</div><div class='add'>+    GFAPI_PUBLIC(glfs_h_removexattrs, 3.5.1);</div><div class='add'>+</div><div class='add'>+/* Operations enabling opaque invariant handle to object transitions */</div><div class='add'>+ssize_t</div><div class='add'>+glfs_h_extract_handle(glfs_object_t *object, unsigned char *handle,</div><div class='add'>+                      int len) __THROW</div><div class='add'>+    GFAPI_PUBLIC(glfs_h_extract_handle, 3.4.2);</div><div class='add'>+</div><div class='add'>+/* Given a handle, looks up the inode and creates glfs_object.</div><div class='add'>+ * In addition, if provided 'stat', copies the inode attributes</div><div class='add'>+ */</div><div class='add'>+glfs_object_t *</div><div class='add'>+glfs_h_create_from_handle(glfs_t *fs, unsigned char *handle, int len,</div><div class='add'>+                          struct stat *stat) __THROW</div><div class='add'>+    GFAPI_PUBLIC(glfs_h_create_from_handle, 3.4.2);</div><div class='add'>+</div><div class='add'>+/* Operations enabling object handles to fd transitions */</div><div class='add'>+glfs_fd_t *</div><div class='add'>+glfs_h_opendir(glfs_t *fs, glfs_object_t *object) __THROW</div><div class='add'>+    GFAPI_PUBLIC(glfs_h_opendir, 3.4.2);</div><div class='add'>+</div><div class='add'>+glfs_fd_t *</div><div class='add'>+glfs_h_open(glfs_t *fs, glfs_object_t *object, int flags) __THROW</div><div class='add'>+    GFAPI_PUBLIC(glfs_h_open, 3.4.2);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+glfs_h_access(glfs_t *fs, glfs_object_t *object, int mask) __THROW</div><div class='add'>+    GFAPI_PUBLIC(glfs_h_access, 3.6.0);</div><div class='add'>+</div><div class='add'>+struct glfs_object *</div><div class='add'>+glfs_h_creat_open(struct glfs *fs, struct glfs_object *parent, const char *path,</div><div class='add'>+                  int flags, mode_t mode, struct stat *stat,</div><div class='add'>+                  struct glfs_fd **out_fd) __THROW</div><div class='add'>+    GFAPI_PUBLIC(glfs_h_creat_open, 6.6);</div><div class='add'>+/*</div><div class='add'>+  SYNOPSIS</div><div class='add'>+</div><div class='add'>+  glfs_h_poll_upcall: Poll for upcall events given a 'glfs' object.</div><div class='add'>+</div><div class='add'>+  DESCRIPTION</div><div class='add'>+</div><div class='add'>+  This API is used to poll for upcall events stored in the</div><div class='add'>+  upcall list. Current users of this API is NFS-Ganesha.</div><div class='add'>+  In case of any event received, it will be mapped appropriately</div><div class='add'>+  into 'glfs_upcall' along with the handle('glfs_object') to be</div><div class='add'>+  passed to NFS-Ganesha.</div><div class='add'>+</div><div class='add'>+  In case of success, applications need to check the value of</div><div class='add'>+  cbk-&gt;handle to be NON NULL before processing the upcall</div><div class='add'>+  events.</div><div class='add'>+</div><div class='add'>+  PARAMETERS</div><div class='add'>+</div><div class='add'>+  @fs: glfs object to poll the upcall events for</div><div class='add'>+  @cbk: Pointer that will contain an upcall event for use by the application.</div><div class='add'>+        Application is responsible for free'ing the structure with glfs_free().</div><div class='add'>+</div><div class='add'>+  RETURN VALUES</div><div class='add'>+</div><div class='add'>+  0   : Success.</div><div class='add'>+  -1  : Error condition, mostly due to out of memory.</div><div class='add'>+</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+glfs_h_poll_upcall(glfs_t *fs, glfs_upcall_t **cbk) __THROW</div><div class='add'>+    GFAPI_PUBLIC(glfs_h_poll_upcall, 3.7.16);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+glfs_h_acl_set(glfs_t *fs, glfs_object_t *object, const acl_type_t type,</div><div class='add'>+               const acl_t acl) __THROW GFAPI_PUBLIC(glfs_h_acl_set, 3.7.0);</div><div class='add'>+</div><div class='add'>+acl_t</div><div class='add'>+glfs_h_acl_get(glfs_t *fs, glfs_object_t *object, const acl_type_t type) __THROW</div><div class='add'>+    GFAPI_PUBLIC(glfs_h_acl_get, 3.7.0);</div><div class='add'>+</div><div class='add'>+size_t</div><div class='add'>+glfs_h_anonymous_write(glfs_t *fs, glfs_object_t *object, const void *buf,</div><div class='add'>+                       size_t count, off_t offset) __THROW</div><div class='add'>+    GFAPI_PUBLIC(glfs_h_anonymous_write, 3.7.0);</div><div class='add'>+</div><div class='add'>+ssize_t</div><div class='add'>+glfs_h_anonymous_read(glfs_t *fs, glfs_object_t *object, const void *buf,</div><div class='add'>+                      size_t count, off_t offset) __THROW</div><div class='add'>+    GFAPI_PUBLIC(glfs_h_anonymous_read, 3.7.0);</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+ * Caution: The object returned by this object gets freed as part</div><div class='add'>+ * of 'glfs_free(xstat)'. Make sure to have a copy using 'glfs_object_copy()'</div><div class='add'>+ * to use post that.</div><div class='add'>+ */</div><div class='add'>+glfs_object_t *</div><div class='add'>+glfs_xreaddirplus_get_object(struct glfs_xreaddirp_stat *xstat) __THROW</div><div class='add'>+    GFAPI_PUBLIC(glfs_xreaddirplus_get_object, 3.11.0);</div><div class='add'>+</div><div class='add'>+/* Applications should close the object returned by this routine</div><div class='add'>+ * explicitly using 'glfs_h_close()'</div><div class='add'>+ */</div><div class='add'>+glfs_object_t *</div><div class='add'>+glfs_object_copy(glfs_object_t *src) __THROW</div><div class='add'>+    GFAPI_PUBLIC(glfs_object_copy, 3.11.0);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+glfs_h_lease(glfs_t *fs, glfs_object_t *object, glfs_lease_t *lease) __THROW</div><div class='add'>+    GFAPI_PUBLIC(glfs_h_lease, 4.0.0);</div><div class='add'>+</div><div class='add'>+glfs_object_t *</div><div class='add'>+glfs_h_find_handle(glfs_t *fs, unsigned char *handle, int len) __THROW</div><div class='add'>+    GFAPI_PUBLIC(glfs_h_lease, 4.0.0);</div><div class='add'>+</div><div class='add'>+/* Functions for getting details about the glfs_upcall_lease</div><div class='add'>+ *</div><div class='add'>+ * None of the pointers returned by the below functions should be free()'d,</div><div class='add'>+ * glfs_free()'d or glfs_h_close()'d by the application.</div><div class='add'>+ *</div><div class='add'>+ * Releasing of the structures is done by passing the glfs_upcall pointer</div><div class='add'>+ * to glfs_free().</div><div class='add'>+ */</div><div class='add'>+struct glfs_upcall_lease;</div><div class='add'>+typedef struct glfs_upcall_lease glfs_upcall_lease_t;</div><div class='add'>+</div><div class='add'>+glfs_object_t *</div><div class='add'>+glfs_upcall_lease_get_object(glfs_upcall_lease_t *arg) __THROW</div><div class='add'>+    GFAPI_PUBLIC(glfs_upcall_lease_get_object, 4.1.6);</div><div class='add'>+</div><div class='add'>+uint32_t</div><div class='add'>+glfs_upcall_lease_get_lease_type(glfs_upcall_lease_t *arg) __THROW</div><div class='add'>+    GFAPI_PUBLIC(glfs_upcall_lease_get_lease_type, 4.1.6);</div><div class='add'>+</div><div class='add'>+__END_DECLS</div><div class='add'>+</div><div class='add'>+#endif /* !_GLFS_HANDLES_H */</div><div class='head'>diff --git a/api/src/glfs-internal.h b/api/src/glfs-internal.h<br/>new file mode 100644<br/>index 00000000000..7cc3b18a104<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/api/src/glfs-internal.h?id=d1d7a6f35c816822fab51c820e25023863c239c1'>api/src/glfs-internal.h</a></div><div class='hunk'>@@ -0,0 +1,756 @@</div><div class='add'>+/*</div><div class='add'>+  Copyright (c) 2012-2018 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#ifndef _GLFS_INTERNAL_H</div><div class='add'>+#define _GLFS_INTERNAL_H</div><div class='add'>+</div><div class='add'>+#include &lt;glusterfs/xlator.h&gt;</div><div class='add'>+#include &lt;glusterfs/glusterfs.h&gt;</div><div class='add'>+#include &lt;glusterfs/upcall-utils.h&gt;</div><div class='add'>+#include "glfs-handles.h"</div><div class='add'>+#include &lt;glusterfs/refcount.h&gt;</div><div class='add'>+#include &lt;glusterfs/syncop.h&gt;</div><div class='add'>+</div><div class='add'>+#define GLFS_SYMLINK_MAX_FOLLOW 2048</div><div class='add'>+</div><div class='add'>+#define DEFAULT_REVAL_COUNT 1</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+ * According to  pthread mutex and conditional variable ( cond,</div><div class='add'>+ * child_down_count, upcall mutex and mutex) initialization of struct glfs</div><div class='add'>+ * members, below GLFS_INIT_* flags are set in 'pthread_flags' member of struct</div><div class='add'>+ * glfs. The flags are set from glfs_init() and  glfs_new_from_ctx() functions</div><div class='add'>+ * as part of fs inititialization.</div><div class='add'>+ *</div><div class='add'>+ * These flag bits are validated in glfs_fini() to destroy all or partially</div><div class='add'>+ * initialized mutex and conditional variables of glfs object.</div><div class='add'>+ * If you introduce new pthread mutex or conditional variable in glfs object,</div><div class='add'>+ * please make sure you have a flag bit intorduced here for proper cleanup</div><div class='add'>+ * in glfs_fini().</div><div class='add'>+ *</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+#define PTHREAD_MUTEX_INIT(mutex, attr, flags, mask, label)                    \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        int __ret = -1;                                                        \</div><div class='add'>+        __ret = pthread_mutex_init(mutex, attr);                               \</div><div class='add'>+        if (__ret == 0)                                                        \</div><div class='add'>+            flags |= mask;                                                     \</div><div class='add'>+        else                                                                   \</div><div class='add'>+            goto label;                                                        \</div><div class='add'>+    } while (0)</div><div class='add'>+</div><div class='add'>+#define PTHREAD_MUTEX_DESTROY(mutex, flags, mask)                              \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        if (flags &amp; mask)                                                      \</div><div class='add'>+            (void)pthread_mutex_destroy(mutex);                                \</div><div class='add'>+    } while (0)</div><div class='add'>+</div><div class='add'>+#define PTHREAD_COND_INIT(cond, attr, flags, mask, label)                      \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        int __ret = -1;                                                        \</div><div class='add'>+        __ret = pthread_cond_init(cond, attr);                                 \</div><div class='add'>+        if (__ret == 0)                                                        \</div><div class='add'>+            flags |= mask;                                                     \</div><div class='add'>+        else                                                                   \</div><div class='add'>+            goto label;                                                        \</div><div class='add'>+    } while (0)</div><div class='add'>+</div><div class='add'>+#define PTHREAD_COND_DESTROY(cond, flags, mask)                                \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        if (flags &amp; mask)                                                      \</div><div class='add'>+            (void)pthread_cond_destroy(cond);                                  \</div><div class='add'>+    } while (0)</div><div class='add'>+</div><div class='add'>+#define GLFS_INIT_MUTEX 0x00000001        /* pthread_mutex_flag */</div><div class='add'>+#define GLFS_INIT_COND 0x00000002         /* pthread_cond_flag */</div><div class='add'>+#define GLFS_INIT_COND_CHILD 0x00000004   /* pthread_cond_child_down_flag */</div><div class='add'>+#define GLFS_INIT_MUTEX_UPCALL 0x00000008 /* pthread_mutex_upcall_flag */</div><div class='add'>+</div><div class='add'>+#ifndef GF_DARWIN_HOST_OS</div><div class='add'>+#ifndef GFAPI_PUBLIC</div><div class='add'>+#define GFAPI_PUBLIC(sym, ver) /**/</div><div class='add'>+#endif</div><div class='add'>+#ifndef GFAPI_PRIVATE</div><div class='add'>+#define GFAPI_PRIVATE(sym, ver) /**/</div><div class='add'>+#endif</div><div class='add'>+#if __GNUC__ &gt;= 10</div><div class='add'>+#define GFAPI_SYMVER_PUBLIC_DEFAULT(fn, ver)                                   \</div><div class='add'>+    __attribute__((__symver__(STR(fn) "@@GFAPI_" STR(ver))))</div><div class='add'>+</div><div class='add'>+#define GFAPI_SYMVER_PRIVATE_DEFAULT(fn, ver)                                  \</div><div class='add'>+    __attribute__((__symver__(STR(fn) "@@GFAPI_PRIVATE_" STR(ver))))</div><div class='add'>+</div><div class='add'>+#define GFAPI_SYMVER_PUBLIC(fn1, fn2, ver)                                     \</div><div class='add'>+    __attribute__((__symver__(STR(fn2) "@GFAPI_" STR(ver))))</div><div class='add'>+</div><div class='add'>+#define GFAPI_SYMVER_PRIVATE(fn1, fn2, ver)                                    \</div><div class='add'>+    __attribute__((__symver__(STR(fn2) "@GFAPI_PRIVATE_" STR(ver))))</div><div class='add'>+</div><div class='add'>+#else</div><div class='add'>+#define GFAPI_SYMVER_PUBLIC_DEFAULT(fn, ver)                                   \</div><div class='add'>+    asm(".symver pub_" STR(fn) ", " STR(fn) "@@GFAPI_" STR(ver));</div><div class='add'>+</div><div class='add'>+#define GFAPI_SYMVER_PRIVATE_DEFAULT(fn, ver)                                  \</div><div class='add'>+    asm(".symver priv_" STR(fn) ", " STR(fn) "@@GFAPI_PRIVATE_" STR(ver));</div><div class='add'>+</div><div class='add'>+#define GFAPI_SYMVER_PUBLIC(fn1, fn2, ver)                                     \</div><div class='add'>+    asm(".symver pub_" STR(fn1) ", " STR(fn2) "@GFAPI_" STR(ver));</div><div class='add'>+</div><div class='add'>+#define GFAPI_SYMVER_PRIVATE(fn1, fn2, ver)                                    \</div><div class='add'>+    asm(".symver priv_" STR(fn1) ", " STR(fn2) "@GFAPI_PRIVATE_" STR(ver));</div><div class='add'>+#endif</div><div class='add'>+#define STR(str) #str</div><div class='add'>+#else</div><div class='add'>+#ifndef GFAPI_PUBLIC</div><div class='add'>+#define GFAPI_PUBLIC(sym, ver) __asm("_" __STRING(sym) "$GFAPI_" __STRING(ver));</div><div class='add'>+#endif</div><div class='add'>+#ifndef GFAPI_PRIVATE</div><div class='add'>+#define GFAPI_PRIVATE(sym, ver)                                                \</div><div class='add'>+    __asm("_" __STRING(sym) "$GFAPI_PRIVATE_" __STRING(ver));</div><div class='add'>+#endif</div><div class='add'>+#define GFAPI_SYMVER_PUBLIC_DEFAULT(fn, dotver)  /**/</div><div class='add'>+#define GFAPI_SYMVER_PRIVATE_DEFAULT(fn, dotver) /**/</div><div class='add'>+#define GFAPI_SYMVER_PUBLIC(fn1, fn2, dotver)    /**/</div><div class='add'>+#define GFAPI_SYMVER_PRIVATE(fn1, fn2, dotver)   /**/</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#define ESTALE_RETRY(ret, errno, reval, loc, label)                            \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        if (ret == -1 &amp;&amp; errno == ESTALE) {                                    \</div><div class='add'>+            if (reval &lt; DEFAULT_REVAL_COUNT) {                                 \</div><div class='add'>+                reval++;                                                       \</div><div class='add'>+                loc_wipe(loc);                                                 \</div><div class='add'>+                goto label;                                                    \</div><div class='add'>+            }                                                                  \</div><div class='add'>+        }                                                                      \</div><div class='add'>+    } while (0)</div><div class='add'>+</div><div class='add'>+#define GLFS_LOC_FILL_INODE(oinode, loc, label)                                \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        loc.inode = inode_ref(oinode);                                         \</div><div class='add'>+        gf_uuid_copy(loc.gfid, oinode-&gt;gfid);                                  \</div><div class='add'>+        ret = glfs_loc_touchup(&amp;loc);                                          \</div><div class='add'>+        if (ret != 0) {                                                        \</div><div class='add'>+            errno = EINVAL;                                                    \</div><div class='add'>+            goto label;                                                        \</div><div class='add'>+        }                                                                      \</div><div class='add'>+    } while (0)</div><div class='add'>+</div><div class='add'>+#define GLFS_LOC_FILL_PINODE(pinode, loc, ret, errno, label, path)             \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        loc.inode = inode_new(pinode-&gt;table);                                  \</div><div class='add'>+        if (!loc.inode) {                                                      \</div><div class='add'>+            ret = -1;                                                          \</div><div class='add'>+            errno = ENOMEM;                                                    \</div><div class='add'>+            goto label;                                                        \</div><div class='add'>+        }                                                                      \</div><div class='add'>+        loc.parent = inode_ref(pinode);                                        \</div><div class='add'>+        loc.name = path;                                                       \</div><div class='add'>+        ret = glfs_loc_touchup(&amp;loc);                                          \</div><div class='add'>+        if (ret != 0) {                                                        \</div><div class='add'>+            errno = EINVAL;                                                    \</div><div class='add'>+            goto label;                                                        \</div><div class='add'>+        }                                                                      \</div><div class='add'>+    } while (0)</div><div class='add'>+</div><div class='add'>+struct glfs;</div><div class='add'>+</div><div class='add'>+struct _upcall_entry {</div><div class='add'>+    struct list_head upcall_list;</div><div class='add'>+    struct gf_upcall upcall_data;</div><div class='add'>+};</div><div class='add'>+typedef struct _upcall_entry upcall_entry;</div><div class='add'>+</div><div class='add'>+typedef int (*glfs_init_cbk)(struct glfs *fs, int ret);</div><div class='add'>+</div><div class='add'>+struct glfs {</div><div class='add'>+    char *volname;</div><div class='add'>+    uuid_t vol_uuid;</div><div class='add'>+</div><div class='add'>+    glusterfs_ctx_t *ctx;</div><div class='add'>+</div><div class='add'>+    pthread_t poller;</div><div class='add'>+</div><div class='add'>+    glfs_init_cbk init_cbk;</div><div class='add'>+    pthread_mutex_t mutex;</div><div class='add'>+    pthread_cond_t cond;</div><div class='add'>+    pthread_cond_t child_down_cond; /* for broadcasting CHILD_DOWN */</div><div class='add'>+    int init;</div><div class='add'>+    int ret;</div><div class='add'>+    int err;</div><div class='add'>+</div><div class='add'>+    xlator_t *active_subvol; /* active graph */</div><div class='add'>+    xlator_t *mip_subvol;    /* graph for which migration is in</div><div class='add'>+                              * progress */</div><div class='add'>+    xlator_t *next_subvol;   /* Any new graph is put to</div><div class='add'>+                              * next_subvol, the graph in</div><div class='add'>+                              * next_subvol can either be moved</div><div class='add'>+                              * to mip_subvol (if any IO picks it</div><div class='add'>+                              * up for migration), or be</div><div class='add'>+                              * destroyed (if there is a new</div><div class='add'>+                              * graph, and this was never picked</div><div class='add'>+                              * for migration) */</div><div class='add'>+    xlator_t *old_subvol;</div><div class='add'>+</div><div class='add'>+    char *oldvolfile;</div><div class='add'>+    ssize_t oldvollen;</div><div class='add'>+</div><div class='add'>+    inode_t *cwd;</div><div class='add'>+</div><div class='add'>+    uint32_t dev_id; /* Used to fill st_dev in struct stat */</div><div class='add'>+</div><div class='add'>+    struct list_head openfds;</div><div class='add'>+</div><div class='add'>+    gf_boolean_t migration_in_progress;</div><div class='add'>+</div><div class='add'>+    gf_boolean_t cache_upcalls; /* add upcalls to the upcall_list? */</div><div class='add'>+    struct list_head upcall_list;</div><div class='add'>+    pthread_mutex_t upcall_list_mutex; /* mutex for upcall entry list */</div><div class='add'>+</div><div class='add'>+    uint32_t pin_refcnt;</div><div class='add'>+    uint32_t pthread_flags; /* GLFS_INIT_* # defines set this flag */</div><div class='add'>+</div><div class='add'>+    uint32_t upcall_events; /* Mask of upcall events application</div><div class='add'>+                             * is interested in */</div><div class='add'>+    glfs_upcall_cbk up_cbk; /* upcall cbk function to be registered */</div><div class='add'>+    void *up_data;          /* Opaque data provided by application</div><div class='add'>+                             * during upcall registration */</div><div class='add'>+    struct list_head waitq; /* waiting synctasks */</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+/* This enum is used to maintain the state of glfd. In case of async fops</div><div class='add'>+ * fd might be closed before the actual fop is complete. Therefore we need</div><div class='add'>+ * to track whether the fd is closed or not, instead actually closing it.*/</div><div class='add'>+enum glfs_fd_state { GLFD_INIT, GLFD_OPEN, GLFD_CLOSE };</div><div class='add'>+</div><div class='add'>+struct glfs_fd {</div><div class='add'>+    struct list_head openfds;</div><div class='add'>+    struct list_head list;</div><div class='add'>+    GF_REF_DECL;</div><div class='add'>+    struct glfs *fs;</div><div class='add'>+    enum glfs_fd_state state;</div><div class='add'>+    off_t offset;</div><div class='add'>+    fd_t *fd; /* Currently guared by @fs-&gt;mutex. TODO: per-glfd lock */</div><div class='add'>+    struct list_head entries;</div><div class='add'>+    gf_dirent_t *next;</div><div class='add'>+    struct dirent *readdirbuf;</div><div class='add'>+    gf_lkowner_t lk_owner;</div><div class='add'>+    glfs_leaseid_t lease_id; /* Stores lease_id of client in glfd */</div><div class='add'>+    gf_lock_t lock;          /* lock taken before updating fd state */</div><div class='add'>+    glfs_recall_cbk cbk;</div><div class='add'>+    void *cookie;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+/* glfs object handle introduced for the alternate gfapi implementation based</div><div class='add'>+   on glfs handles/gfid/inode</div><div class='add'>+*/</div><div class='add'>+struct glfs_object {</div><div class='add'>+    inode_t *inode;</div><div class='add'>+    uuid_t gfid;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct glfs_upcall {</div><div class='add'>+    struct glfs *fs;                /* glfs object */</div><div class='add'>+    enum glfs_upcall_reason reason; /* Upcall event type */</div><div class='add'>+    void *event;                    /* changes based in the event type */</div><div class='add'>+    void (*free_event)(void *);     /* free event after the usage */</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct glfs_upcall_inode {</div><div class='add'>+    struct glfs_object *object;      /* Object which need to be acted upon */</div><div class='add'>+    int flags;                       /* Cache UPDATE/INVALIDATE flags */</div><div class='add'>+    struct stat buf;                 /* Latest stat of this entry */</div><div class='add'>+    unsigned int expire_time_attr;   /* the amount of time for which</div><div class='add'>+                                      * the application need to cache</div><div class='add'>+                                      * this entry */</div><div class='add'>+    struct glfs_object *p_object;    /* parent Object to be updated */</div><div class='add'>+    struct stat p_buf;               /* Latest stat of parent dir handle */</div><div class='add'>+    struct glfs_object *oldp_object; /* Old parent Object to be updated */</div><div class='add'>+    struct stat oldp_buf;            /* Latest stat of old parent dir handle */</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct glfs_upcall_lease {</div><div class='add'>+    struct glfs_object *object; /* Object which need to be acted upon */</div><div class='add'>+    uint32_t lease_type;        /* Lease type to which client can downgrade to*/</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct glfs_upcall_lease_fd {</div><div class='add'>+    uint32_t lease_type; /* Lease type to which client can downgrade to*/</div><div class='add'>+    void *fd_cookie;     /* Object which need to be acted upon */</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct glfs_xreaddirp_stat {</div><div class='add'>+    struct stat</div><div class='add'>+        st; /* Stat for that dirent - corresponds to GFAPI_XREADDIRP_STAT */</div><div class='add'>+    struct glfs_object *object; /* handled for GFAPI_XREADDIRP_HANDLE */</div><div class='add'>+    uint32_t flags_handled;     /* final set of flags successfulyy handled */</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+#define DEFAULT_EVENT_POOL_SIZE 16384</div><div class='add'>+#define GF_MEMPOOL_COUNT_OF_DICT_T 4096</div><div class='add'>+#define GF_MEMPOOL_COUNT_OF_DATA_T (GF_MEMPOOL_COUNT_OF_DICT_T * 4)</div><div class='add'>+#define GF_MEMPOOL_COUNT_OF_DATA_PAIR_T (GF_MEMPOOL_COUNT_OF_DICT_T * 4)</div><div class='add'>+</div><div class='add'>+#define GF_MEMPOOL_COUNT_OF_LRU_BUF_T 256</div><div class='add'>+</div><div class='add'>+typedef void(glfs_mem_release_t)(void *ptr);</div><div class='add'>+</div><div class='add'>+struct glfs_mem_header {</div><div class='add'>+    uint32_t magic;</div><div class='add'>+    size_t nmemb;</div><div class='add'>+    size_t size;</div><div class='add'>+    glfs_mem_release_t *release;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+#define GLFS_MEM_HEADER_SIZE (sizeof(struct glfs_mem_header))</div><div class='add'>+#define GLFS_MEM_HEADER_MAGIC 0x20170830</div><div class='add'>+</div><div class='add'>+static inline void *</div><div class='add'>+__glfs_calloc(size_t nmemb, size_t size, glfs_mem_release_t release,</div><div class='add'>+              uint32_t type, const char *typestr)</div><div class='add'>+{</div><div class='add'>+    struct glfs_mem_header *header = NULL;</div><div class='add'>+</div><div class='add'>+    header = __gf_calloc(nmemb, (size + GLFS_MEM_HEADER_SIZE), type, typestr);</div><div class='add'>+    if (!header)</div><div class='add'>+        return NULL;</div><div class='add'>+</div><div class='add'>+    header-&gt;magic = GLFS_MEM_HEADER_MAGIC;</div><div class='add'>+    header-&gt;nmemb = nmemb;</div><div class='add'>+    header-&gt;size = size;</div><div class='add'>+    header-&gt;release = release;</div><div class='add'>+</div><div class='add'>+    return header + 1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static inline void *</div><div class='add'>+__glfs_malloc(size_t size, glfs_mem_release_t release, uint32_t type,</div><div class='add'>+              const char *typestr)</div><div class='add'>+{</div><div class='add'>+    struct glfs_mem_header *header = NULL;</div><div class='add'>+</div><div class='add'>+    header = __gf_malloc((size + GLFS_MEM_HEADER_SIZE), type, typestr);</div><div class='add'>+    if (!header)</div><div class='add'>+        return NULL;</div><div class='add'>+</div><div class='add'>+    header-&gt;magic = GLFS_MEM_HEADER_MAGIC;</div><div class='add'>+    header-&gt;nmemb = 1;</div><div class='add'>+    header-&gt;size = size;</div><div class='add'>+    header-&gt;release = release;</div><div class='add'>+</div><div class='add'>+    return header + 1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static inline void *</div><div class='add'>+__glfs_realloc(void *ptr, size_t size)</div><div class='add'>+{</div><div class='add'>+    struct glfs_mem_header *old_header = NULL;</div><div class='add'>+    struct glfs_mem_header *new_header = NULL;</div><div class='add'>+    struct glfs_mem_header tmp_header;</div><div class='add'>+    void *new_ptr = NULL;</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(NULL != ptr);</div><div class='add'>+</div><div class='add'>+    old_header = (struct glfs_mem_header *)(ptr - GLFS_MEM_HEADER_SIZE);</div><div class='add'>+    GF_ASSERT(old_header-&gt;magic == GLFS_MEM_HEADER_MAGIC);</div><div class='add'>+    tmp_header = *old_header;</div><div class='add'>+</div><div class='add'>+    new_ptr = __gf_realloc(old_header, (size + GLFS_MEM_HEADER_SIZE));</div><div class='add'>+    if (!new_ptr)</div><div class='add'>+        return NULL;</div><div class='add'>+</div><div class='add'>+    new_header = (struct glfs_mem_header *)new_ptr;</div><div class='add'>+    *new_header = tmp_header;</div><div class='add'>+    new_header-&gt;size = size;</div><div class='add'>+</div><div class='add'>+    return new_header + 1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static inline void</div><div class='add'>+__glfs_free(void *free_ptr)</div><div class='add'>+{</div><div class='add'>+    struct glfs_mem_header *header = NULL;</div><div class='add'>+    void *release_ptr = NULL;</div><div class='add'>+    int i = 0;</div><div class='add'>+</div><div class='add'>+    if (!free_ptr)</div><div class='add'>+        return;</div><div class='add'>+</div><div class='add'>+    header = (struct glfs_mem_header *)(free_ptr - GLFS_MEM_HEADER_SIZE);</div><div class='add'>+    GF_ASSERT(header-&gt;magic == GLFS_MEM_HEADER_MAGIC);</div><div class='add'>+</div><div class='add'>+    if (header-&gt;release) {</div><div class='add'>+        release_ptr = free_ptr;</div><div class='add'>+        for (i = 0; i &lt; header-&gt;nmemb; i++) {</div><div class='add'>+            header-&gt;release(release_ptr);</div><div class='add'>+            release_ptr += header-&gt;size;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    __gf_free(header);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#define GLFS_CALLOC(nmemb, size, release, type)                                \</div><div class='add'>+    __glfs_calloc(nmemb, size, release, type, #type)</div><div class='add'>+</div><div class='add'>+#define GLFS_MALLOC(size, release, type)                                       \</div><div class='add'>+    __glfs_malloc(size, release, type, #type)</div><div class='add'>+</div><div class='add'>+#define GLFS_REALLOC(ptr, size) __glfs_realloc(ptr, size)</div><div class='add'>+</div><div class='add'>+#define GLFS_FREE(free_ptr) __glfs_free(free_ptr)</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+glfs_mgmt_init(struct glfs *fs);</div><div class='add'>+void</div><div class='add'>+glfs_init_done(struct glfs *fs, int ret) GFAPI_PRIVATE(glfs_init_done, 3.4.0);</div><div class='add'>+int</div><div class='add'>+glfs_process_volfp(struct glfs *fs, FILE *fp);</div><div class='add'>+int</div><div class='add'>+glfs_resolve(struct glfs *fs, xlator_t *subvol, const char *path, loc_t *loc,</div><div class='add'>+             struct iatt *iatt, int reval) GFAPI_PRIVATE(glfs_resolve, 3.7.0);</div><div class='add'>+int</div><div class='add'>+glfs_lresolve(struct glfs *fs, xlator_t *subvol, const char *path, loc_t *loc,</div><div class='add'>+              struct iatt *iatt, int reval);</div><div class='add'>+fd_t *</div><div class='add'>+glfs_resolve_fd(struct glfs *fs, xlator_t *subvol, struct glfs_fd *glfd);</div><div class='add'>+</div><div class='add'>+fd_t *</div><div class='add'>+__glfs_migrate_fd(struct glfs *fs, xlator_t *subvol, struct glfs_fd *glfd);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+glfs_first_lookup(xlator_t *subvol);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+glfs_process_upcall_event(struct glfs *fs, void *data)</div><div class='add'>+    GFAPI_PRIVATE(glfs_process_upcall_event, 3.7.0);</div><div class='add'>+</div><div class='add'>+#define __GLFS_ENTRY_VALIDATE_FS(fs, label)                                    \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        if (!fs) {                                                             \</div><div class='add'>+            errno = EINVAL;                                                    \</div><div class='add'>+            goto label;                                                        \</div><div class='add'>+        }                                                                      \</div><div class='add'>+        old_THIS = THIS;                                                       \</div><div class='add'>+        THIS = fs-&gt;ctx-&gt;master;                                                \</div><div class='add'>+    } while (0)</div><div class='add'>+</div><div class='add'>+#define __GLFS_EXIT_FS                                                         \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        THIS = old_THIS;                                                       \</div><div class='add'>+    } while (0)</div><div class='add'>+</div><div class='add'>+#define __GLFS_ENTRY_VALIDATE_FD(glfd, label)                                  \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        if (!glfd || !glfd-&gt;fd || !glfd-&gt;fd-&gt;inode ||                          \</div><div class='add'>+            glfd-&gt;state != GLFD_OPEN) {                                        \</div><div class='add'>+            errno = EBADF;                                                     \</div><div class='add'>+            goto label;                                                        \</div><div class='add'>+        }                                                                      \</div><div class='add'>+        old_THIS = THIS;                                                       \</div><div class='add'>+        THIS = glfd-&gt;fd-&gt;inode-&gt;table-&gt;xl-&gt;ctx-&gt;master;                        \</div><div class='add'>+    } while (0)</div><div class='add'>+</div><div class='add'>+#define __GLFS_LOCK_WAIT(fs)                                                   \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        struct synctask *task = NULL;                                          \</div><div class='add'>+                                                                               \</div><div class='add'>+        task = synctask_get();                                                 \</div><div class='add'>+                                                                               \</div><div class='add'>+        if (task) {                                                            \</div><div class='add'>+            list_add_tail(&amp;task-&gt;waitq, &amp;fs-&gt;waitq);                           \</div><div class='add'>+            pthread_mutex_unlock(&amp;fs-&gt;mutex);                                  \</div><div class='add'>+            synctask_yield(task, NULL);                                        \</div><div class='add'>+            pthread_mutex_lock(&amp;fs-&gt;mutex);                                    \</div><div class='add'>+        } else {                                                               \</div><div class='add'>+            /* non-synctask */                                                 \</div><div class='add'>+            pthread_cond_wait(&amp;fs-&gt;cond, &amp;fs-&gt;mutex);                          \</div><div class='add'>+        }                                                                      \</div><div class='add'>+    } while (0)</div><div class='add'>+</div><div class='add'>+#define __GLFS_SYNCTASK_WAKE(fs)                                               \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        struct synctask *waittask = NULL;                                      \</div><div class='add'>+                                                                               \</div><div class='add'>+        while (!list_empty(&amp;fs-&gt;waitq)) {                                      \</div><div class='add'>+            waittask = list_entry(fs-&gt;waitq.next, struct synctask, waitq);     \</div><div class='add'>+            list_del_init(&amp;waittask-&gt;waitq);                                   \</div><div class='add'>+            synctask_wake(waittask);                                           \</div><div class='add'>+        }                                                                      \</div><div class='add'>+    } while (0)</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+  By default all lock attempts from user context must</div><div class='add'>+  use glfs_lock() and glfs_unlock(). This allows</div><div class='add'>+  for a safe implementation of graph migration where</div><div class='add'>+  we can give up the mutex during syncop calls so</div><div class='add'>+  that bottom up calls (particularly CHILD_UP notify)</div><div class='add'>+  can do a mutex_lock() on @glfs without deadlocking</div><div class='add'>+  the filesystem.</div><div class='add'>+</div><div class='add'>+  All the fops should wait for graph migration to finish</div><div class='add'>+  before starting the fops. Therefore these functions should</div><div class='add'>+  call glfs_lock with wait_for_migration as true. But waiting</div><div class='add'>+  for migration to finish in call-back path can result thread</div><div class='add'>+  dead-locks. The reason for this is we only have finite</div><div class='add'>+  number of epoll threads. so if we wait on epoll threads</div><div class='add'>+  there will not be any thread left to handle outstanding</div><div class='add'>+  rpc replies.</div><div class='add'>+*/</div><div class='add'>+static inline int</div><div class='add'>+glfs_lock(struct glfs *fs, gf_boolean_t wait_for_migration)</div><div class='add'>+{</div><div class='add'>+    pthread_mutex_lock(&amp;fs-&gt;mutex);</div><div class='add'>+</div><div class='add'>+    while (!fs-&gt;init)</div><div class='add'>+        __GLFS_LOCK_WAIT(fs);</div><div class='add'>+</div><div class='add'>+    while (wait_for_migration &amp;&amp; fs-&gt;migration_in_progress)</div><div class='add'>+        __GLFS_LOCK_WAIT(fs);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static inline void</div><div class='add'>+glfs_unlock(struct glfs *fs)</div><div class='add'>+{</div><div class='add'>+    pthread_mutex_unlock(&amp;fs-&gt;mutex);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+struct glfs_fd *</div><div class='add'>+glfs_fd_new(struct glfs *fs);</div><div class='add'>+void</div><div class='add'>+glfs_fd_bind(struct glfs_fd *glfd);</div><div class='add'>+void</div><div class='add'>+glfd_set_state_bind(struct glfs_fd *glfd);</div><div class='add'>+</div><div class='add'>+xlator_t *</div><div class='add'>+glfs_active_subvol(struct glfs *fs) GFAPI_PRIVATE(glfs_active_subvol, 3.4.0);</div><div class='add'>+xlator_t *</div><div class='add'>+__glfs_active_subvol(struct glfs *fs);</div><div class='add'>+void</div><div class='add'>+glfs_subvol_done(struct glfs *fs, xlator_t *subvol)</div><div class='add'>+    GFAPI_PRIVATE(glfs_subvol_done, 3.4.0);</div><div class='add'>+</div><div class='add'>+inode_t *</div><div class='add'>+glfs_refresh_inode(xlator_t *subvol, inode_t *inode);</div><div class='add'>+</div><div class='add'>+inode_t *</div><div class='add'>+glfs_cwd_get(struct glfs *fs);</div><div class='add'>+int</div><div class='add'>+glfs_cwd_set(struct glfs *fs, inode_t *inode);</div><div class='add'>+inode_t *</div><div class='add'>+glfs_resolve_inode(struct glfs *fs, xlator_t *subvol,</div><div class='add'>+                   struct glfs_object *object);</div><div class='add'>+int</div><div class='add'>+glfs_create_object(loc_t *loc, struct glfs_object **retobject);</div><div class='add'>+int</div><div class='add'>+__glfs_cwd_set(struct glfs *fs, inode_t *inode);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+glfs_resolve_base(struct glfs *fs, xlator_t *subvol, inode_t *inode,</div><div class='add'>+                  struct iatt *iatt);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+glfs_resolve_at(struct glfs *fs, xlator_t *subvol, inode_t *at,</div><div class='add'>+                const char *origpath, loc_t *loc, struct iatt *iatt, int follow,</div><div class='add'>+                int reval) GFAPI_PRIVATE(glfs_resolve_at, 3.4.0);</div><div class='add'>+int</div><div class='add'>+glfs_loc_touchup(loc_t *loc) GFAPI_PRIVATE(glfs_loc_touchup, 3.4.0);</div><div class='add'>+void</div><div class='add'>+glfs_iatt_to_stat(struct glfs *fs, struct iatt *iatt, struct stat *stat);</div><div class='add'>+void</div><div class='add'>+glfs_iatt_from_stat(struct stat *stat, int valid, struct iatt *iatt,</div><div class='add'>+                    int *gvalid);</div><div class='add'>+int</div><div class='add'>+glfs_loc_link(loc_t *loc, struct iatt *iatt);</div><div class='add'>+int</div><div class='add'>+glfs_loc_unlink(loc_t *loc);</div><div class='add'>+int</div><div class='add'>+glfs_getxattr_process(void *value, size_t size, dict_t *xattr,</div><div class='add'>+                      const char *name);</div><div class='add'>+</div><div class='add'>+/* Sends RPC call to glusterd to fetch required volume info */</div><div class='add'>+int</div><div class='add'>+glfs_get_volume_info(struct glfs *fs);</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+  SYNOPSIS</div><div class='add'>+</div><div class='add'>+       glfs_new_from_ctx: Creates a virtual mount object by taking a</div><div class='add'>+       glusterfs_ctx_t object.</div><div class='add'>+</div><div class='add'>+  DESCRIPTION</div><div class='add'>+</div><div class='add'>+       glfs_new_from_ctx() is not same as glfs_new(). It takes the</div><div class='add'>+       glusterfs_ctx_t object instead of creating one by glusterfs_ctx_new().</div><div class='add'>+       Again the usage is restricted to NFS MOUNT over UDP i.e. in</div><div class='add'>+       glfs_resolve_at() which would take fs object as input but never use</div><div class='add'>+       (purpose is not to change the ABI of glfs_resolve_at()).</div><div class='add'>+</div><div class='add'>+  PARAMETERS</div><div class='add'>+</div><div class='add'>+       @ctx: glusterfs_ctx_t object</div><div class='add'>+</div><div class='add'>+  RETURN VALUES</div><div class='add'>+</div><div class='add'>+       fs     : Pointer to the newly created glfs_t object.</div><div class='add'>+       NULL   : Otherwise.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+struct glfs *</div><div class='add'>+glfs_new_from_ctx(glusterfs_ctx_t *ctx) GFAPI_PRIVATE(glfs_new_from_ctx, 3.7.0);</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+  SYNOPSIS</div><div class='add'>+</div><div class='add'>+       glfs_free_from_ctx: Free up the memory occupied by glfs_t object</div><div class='add'>+       created by glfs_new_from_ctx().</div><div class='add'>+</div><div class='add'>+  DESCRIPTION</div><div class='add'>+</div><div class='add'>+       The glfs_t object allocated by glfs_new_from_ctx() must be released</div><div class='add'>+       by the caller using this routine. The usage can be found</div><div class='add'>+       at glfs_fini() or NFS, MOUNT over UDP i.e.</div><div class='add'>+                        __mnt3udp_get_export_subdir_inode ()</div><div class='add'>+                                =&gt; glfs_resolve_at().</div><div class='add'>+</div><div class='add'>+  PARAMETERS</div><div class='add'>+</div><div class='add'>+       @fs: The glfs_t object to be deallocated.</div><div class='add'>+</div><div class='add'>+  RETURN VALUES</div><div class='add'>+</div><div class='add'>+       void</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+glfs_free_from_ctx(struct glfs *fs) GFAPI_PRIVATE(glfs_free_from_ctx, 3.7.0);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+glfs_recall_lease_fd(struct glfs *fs, struct gf_upcall *up_data);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+glfs_get_upcall_cache_invalidation(struct gf_upcall *to_up_data,</div><div class='add'>+                                   struct gf_upcall *from_up_data);</div><div class='add'>+int</div><div class='add'>+glfs_h_poll_cache_invalidation(struct glfs *fs, struct glfs_upcall *up_arg,</div><div class='add'>+                               struct gf_upcall *upcall_data);</div><div class='add'>+</div><div class='add'>+ssize_t</div><div class='add'>+glfs_anonymous_preadv(struct glfs *fs, struct glfs_object *object,</div><div class='add'>+                      const struct iovec *iovec, int iovcnt, off_t offset,</div><div class='add'>+                      int flags);</div><div class='add'>+ssize_t</div><div class='add'>+glfs_anonymous_pwritev(struct glfs *fs, struct glfs_object *object,</div><div class='add'>+                       const struct iovec *iovec, int iovcnt, off_t offset,</div><div class='add'>+                       int flags);</div><div class='add'>+</div><div class='add'>+struct glfs_object *</div><div class='add'>+glfs_h_resolve_symlink(struct glfs *fs, struct glfs_object *object);</div><div class='add'>+</div><div class='add'>+/* Deprecated structures that were passed to client applications, replaced by</div><div class='add'>+ * accessor functions. Do not use these in new applications, and update older</div><div class='add'>+ * usage.</div><div class='add'>+ *</div><div class='add'>+ * See http://review.gluster.org/14701 for more details.</div><div class='add'>+ *</div><div class='add'>+ * WARNING: These structures will be removed in the future.</div><div class='add'>+ */</div><div class='add'>+struct glfs_callback_arg {</div><div class='add'>+    struct glfs *fs;</div><div class='add'>+    enum glfs_upcall_reason reason;</div><div class='add'>+    void *event_arg;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct glfs_callback_inode_arg {</div><div class='add'>+    struct glfs_object *object;      /* Object which need to be acted upon */</div><div class='add'>+    int flags;                       /* Cache UPDATE/INVALIDATE flags */</div><div class='add'>+    struct stat buf;                 /* Latest stat of this entry */</div><div class='add'>+    unsigned int expire_time_attr;   /* the amount of time for which</div><div class='add'>+                                      * the application need to cache</div><div class='add'>+                                      * this entry</div><div class='add'>+                                      */</div><div class='add'>+    struct glfs_object *p_object;    /* parent Object to be updated */</div><div class='add'>+    struct stat p_buf;               /* Latest stat of parent dir handle */</div><div class='add'>+    struct glfs_object *oldp_object; /* Old parent Object</div><div class='add'>+                                      * to be updated */</div><div class='add'>+    struct stat oldp_buf;            /* Latest stat of old parent</div><div class='add'>+                                      * dir handle */</div><div class='add'>+};</div><div class='add'>+struct dirent *</div><div class='add'>+glfs_readdirbuf_get(struct glfs_fd *glfd);</div><div class='add'>+</div><div class='add'>+gf_dirent_t *</div><div class='add'>+glfd_entry_next(struct glfs_fd *glfd, int plus);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+gf_dirent_to_dirent(gf_dirent_t *gf_dirent, struct dirent *dirent);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+gf_lease_to_glfs_lease(struct gf_lease *gf_lease, struct glfs_lease *lease);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+glfs_lease_to_gf_lease(struct glfs_lease *lease, struct gf_lease *gf_lease);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+glfs_release_upcall(void *ptr);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+get_fop_attr_glfd(dict_t **fop_attr, struct glfs_fd *glfd);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+set_fop_attr_glfd(struct glfs_fd *glfd);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+get_fop_attr_thrd_key(dict_t **fop_attr);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+unset_fop_attr(dict_t **fop_attr);</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+  SYNOPSIS</div><div class='add'>+  glfs_statx: Fetch extended file attributes for the given path.</div><div class='add'>+</div><div class='add'>+  DESCRIPTION</div><div class='add'>+  This function fetches extended file attributes for the given path.</div><div class='add'>+</div><div class='add'>+  PARAMETERS</div><div class='add'>+  @fs: The 'virtual mount' object referencing a volume, under which file exists.</div><div class='add'>+  @path: Path of the file within the virtual mount.</div><div class='add'>+  @mask: Requested extended file attributes mask, (See mask defines above)</div><div class='add'>+</div><div class='add'>+  RETURN VALUES</div><div class='add'>+  -1 : Failure. @errno will be set with the type of failure.</div><div class='add'>+  0  : Filled in statxbuf with appropriate masks for valid items in the</div><div class='add'>+       structure.</div><div class='add'>+</div><div class='add'>+  ERRNO VALUES</div><div class='add'>+    EINVAL: fs is invalid</div><div class='add'>+    EINVAL: mask has unsupported bits set</div><div class='add'>+    Other errors as returned by stat(2)</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+glfs_statx(struct glfs *fs, const char *path, unsigned int mask,</div><div class='add'>+           struct glfs_stat *statxbuf) GFAPI_PRIVATE(glfs_statx, 6.0);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+glfs_iatt_from_statx(struct iatt *, const struct glfs_stat *)</div><div class='add'>+    GFAPI_PRIVATE(glfs_iatt_from_statx, 6.0);</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+ * This API is a per thread setting, similar to glfs_setfs{u/g}id, because of</div><div class='add'>+ * the call to syncopctx_setfspid.</div><div class='add'>+ */</div><div class='add'>+int</div><div class='add'>+glfs_setfspid(struct glfs *, pid_t) GFAPI_PRIVATE(glfs_setfspid, 6.1);</div><div class='add'>+#endif /* !_GLFS_INTERNAL_H */</div><div class='head'>diff --git a/api/src/glfs-master.c b/api/src/glfs-master.c<br/>new file mode 100644<br/>index 00000000000..100dcc16cc0<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/api/src/glfs-master.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>api/src/glfs-master.c</a></div><div class='hunk'>@@ -0,0 +1,183 @@</div><div class='add'>+/*</div><div class='add'>+  Copyright (c) 2012-2016 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#include &lt;stdio.h&gt;</div><div class='add'>+</div><div class='add'>+#include &lt;glusterfs/glusterfs.h&gt;</div><div class='add'>+</div><div class='add'>+#include "glfs-internal.h"</div><div class='add'>+#include "glfs-mem-types.h"</div><div class='add'>+#include "gfapi-messages.h"</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+graph_setup(struct glfs *fs, glusterfs_graph_t *graph)</div><div class='add'>+{</div><div class='add'>+    xlator_t *new_subvol = NULL;</div><div class='add'>+    xlator_t *old_subvol = NULL;</div><div class='add'>+    inode_table_t *itable = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    new_subvol = graph-&gt;top;</div><div class='add'>+</div><div class='add'>+    /* This is called in a bottom-up context, it should specifically</div><div class='add'>+       NOT be glfs_lock()</div><div class='add'>+    */</div><div class='add'>+    pthread_mutex_lock(&amp;fs-&gt;mutex);</div><div class='add'>+    {</div><div class='add'>+        if (new_subvol-&gt;switched || new_subvol == fs-&gt;active_subvol ||</div><div class='add'>+            new_subvol == fs-&gt;next_subvol || new_subvol == fs-&gt;mip_subvol) {</div><div class='add'>+            /* Spurious CHILD_UP event on old graph */</div><div class='add'>+            ret = 0;</div><div class='add'>+            goto unlock;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        if (!new_subvol-&gt;itable) {</div><div class='add'>+            itable = inode_table_new(131072, new_subvol);</div><div class='add'>+            if (!itable) {</div><div class='add'>+                errno = ENOMEM;</div><div class='add'>+                ret = -1;</div><div class='add'>+                goto unlock;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            new_subvol-&gt;itable = itable;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        old_subvol = fs-&gt;next_subvol;</div><div class='add'>+        fs-&gt;next_subvol = new_subvol;</div><div class='add'>+        fs-&gt;next_subvol-&gt;winds++; /* first ref */</div><div class='add'>+        ret = 0;</div><div class='add'>+    }</div><div class='add'>+unlock:</div><div class='add'>+    pthread_mutex_unlock(&amp;fs-&gt;mutex);</div><div class='add'>+</div><div class='add'>+    if (old_subvol)</div><div class='add'>+        /* wasn't picked up so far, skip */</div><div class='add'>+        glfs_subvol_done(fs, old_subvol);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+notify(xlator_t *this, int event, void *data, ...)</div><div class='add'>+{</div><div class='add'>+    glusterfs_graph_t *graph = NULL;</div><div class='add'>+    struct glfs *fs = NULL;</div><div class='add'>+</div><div class='add'>+    graph = data;</div><div class='add'>+    fs = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    switch (event) {</div><div class='add'>+        case GF_EVENT_GRAPH_NEW:</div><div class='add'>+            gf_smsg(this-&gt;name, GF_LOG_INFO, 0, API_MSG_NEW_GRAPH,</div><div class='add'>+                    "graph-uuid=%s",</div><div class='add'>+                    uuid_utoa((unsigned char *)graph-&gt;graph_uuid), "id=%d",</div><div class='add'>+                    graph-&gt;id, NULL);</div><div class='add'>+            break;</div><div class='add'>+        case GF_EVENT_CHILD_UP:</div><div class='add'>+            pthread_mutex_lock(&amp;fs-&gt;mutex);</div><div class='add'>+            {</div><div class='add'>+                graph-&gt;used = 1;</div><div class='add'>+            }</div><div class='add'>+            pthread_mutex_unlock(&amp;fs-&gt;mutex);</div><div class='add'>+            graph_setup(fs, graph);</div><div class='add'>+            glfs_init_done(fs, 0);</div><div class='add'>+            break;</div><div class='add'>+        case GF_EVENT_CHILD_DOWN:</div><div class='add'>+            pthread_mutex_lock(&amp;fs-&gt;mutex);</div><div class='add'>+            {</div><div class='add'>+                graph-&gt;used = 0;</div><div class='add'>+                pthread_cond_broadcast(&amp;fs-&gt;child_down_cond);</div><div class='add'>+            }</div><div class='add'>+            pthread_mutex_unlock(&amp;fs-&gt;mutex);</div><div class='add'>+            glfs_init_done(fs, 1);</div><div class='add'>+            break;</div><div class='add'>+        case GF_EVENT_CHILD_CONNECTING:</div><div class='add'>+            break;</div><div class='add'>+        case GF_EVENT_UPCALL:</div><div class='add'>+            glfs_process_upcall_event(fs, data);</div><div class='add'>+            break;</div><div class='add'>+        default:</div><div class='add'>+            gf_msg_debug(this-&gt;name, 0, "got notify event %d", event);</div><div class='add'>+            break;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+mem_acct_init(xlator_t *this)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    if (!this)</div><div class='add'>+        return ret;</div><div class='add'>+</div><div class='add'>+    ret = xlator_mem_acct_init(this, glfs_mt_end + 1);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_ERROR, ENOMEM, API_MSG_MEM_ACCT_INIT_FAILED,</div><div class='add'>+                NULL);</div><div class='add'>+        return ret;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+init(xlator_t *this)</div><div class='add'>+{</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+fini(xlator_t *this)</div><div class='add'>+{</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* place-holder fops */</div><div class='add'>+int</div><div class='add'>+glfs_forget(xlator_t *this, inode_t *inode)</div><div class='add'>+{</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+glfs_release(xlator_t *this, fd_t *fd)</div><div class='add'>+{</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+glfs_releasedir(xlator_t *this, fd_t *fd)</div><div class='add'>+{</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+struct xlator_dumpops dumpops;</div><div class='add'>+</div><div class='add'>+struct xlator_fops fops;</div><div class='add'>+</div><div class='add'>+struct xlator_cbks cbks = {</div><div class='add'>+    .forget = glfs_forget,</div><div class='add'>+    .release = glfs_release,</div><div class='add'>+    .releasedir = glfs_releasedir,</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+xlator_api_t xlator_api = {</div><div class='add'>+    .init = init,</div><div class='add'>+    .fini = fini,</div><div class='add'>+    .notify = notify,</div><div class='add'>+    .mem_acct_init = mem_acct_init,</div><div class='add'>+    .op_version = {1},</div><div class='add'>+    .dumpops = &amp;dumpops,</div><div class='add'>+    .fops = &amp;fops,</div><div class='add'>+    .cbks = &amp;cbks,</div><div class='add'>+    .identifier = "glfs-api",</div><div class='add'>+    .category = GF_MAINTAINED,</div><div class='add'>+};</div><div class='head'>diff --git a/api/src/glfs-mem-types.h b/api/src/glfs-mem-types.h<br/>new file mode 100644<br/>index 00000000000..bfa325a3ad9<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/api/src/glfs-mem-types.h?id=d1d7a6f35c816822fab51c820e25023863c239c1'>api/src/glfs-mem-types.h</a></div><div class='hunk'>@@ -0,0 +1,35 @@</div><div class='add'>+/*</div><div class='add'>+  Copyright (c) 2012-2017 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#ifndef _GLFS_MEM_TYPES_H</div><div class='add'>+#define _GLFS_MEM_TYPES_H</div><div class='add'>+</div><div class='add'>+#include &lt;glusterfs/mem-types.h&gt;</div><div class='add'>+</div><div class='add'>+#define GF_MEM_TYPE_START (gf_common_mt_end + 1)</div><div class='add'>+</div><div class='add'>+enum glfs_mem_types_ {</div><div class='add'>+    glfs_mt_call_pool_t = GF_MEM_TYPE_START,</div><div class='add'>+    glfs_mt_xlator_t,</div><div class='add'>+    glfs_mt_glfs_fd_t,</div><div class='add'>+    glfs_mt_glfs_io_t,</div><div class='add'>+    glfs_mt_volfile_t,</div><div class='add'>+    glfs_mt_xlator_cmdline_option_t,</div><div class='add'>+    glfs_mt_server_cmdline_t,</div><div class='add'>+    glfs_mt_glfs_object_t,</div><div class='add'>+    glfs_mt_readdirbuf_t,</div><div class='add'>+    glfs_mt_upcall_entry_t,</div><div class='add'>+    glfs_mt_acl_t,</div><div class='add'>+    glfs_mt_upcall_inode_t,</div><div class='add'>+    glfs_mt_realpath_t,</div><div class='add'>+    glfs_mt_xreaddirp_stat_t,</div><div class='add'>+    glfs_mt_end</div><div class='add'>+};</div><div class='add'>+#endif</div><div class='head'>diff --git a/api/src/glfs-mgmt.c b/api/src/glfs-mgmt.c<br/>new file mode 100644<br/>index 00000000000..7c82b8cd162<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/api/src/glfs-mgmt.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>api/src/glfs-mgmt.c</a></div><div class='hunk'>@@ -0,0 +1,1049 @@</div><div class='add'>+/*</div><div class='add'>+  Copyright (c) 2012-2018 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#include &lt;stdio.h&gt;</div><div class='add'>+#include &lt;sys/types.h&gt;</div><div class='add'>+#include &lt;sys/wait.h&gt;</div><div class='add'>+#include &lt;stdlib.h&gt;</div><div class='add'>+#include &lt;signal.h&gt;</div><div class='add'>+#include &lt;pthread.h&gt;</div><div class='add'>+</div><div class='add'>+#include &lt;glusterfs/glusterfs.h&gt;</div><div class='add'>+#include "glfs.h"</div><div class='add'>+#include &lt;glusterfs/dict.h&gt;</div><div class='add'>+</div><div class='add'>+#include "rpc-clnt.h"</div><div class='add'>+#include "protocol-common.h"</div><div class='add'>+#include "xdr-generic.h"</div><div class='add'>+#include "rpc-common-xdr.h"</div><div class='add'>+</div><div class='add'>+#include &lt;glusterfs/syncop.h&gt;</div><div class='add'>+</div><div class='add'>+#include "glfs-internal.h"</div><div class='add'>+#include "gfapi-messages.h"</div><div class='add'>+#include &lt;glusterfs/syscall.h&gt;</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+glfs_volfile_fetch(struct glfs *fs);</div><div class='add'>+int32_t</div><div class='add'>+glfs_get_volume_info_rpc(call_frame_t *frame, xlator_t *this, struct glfs *fs);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+glfs_process_volfp(struct glfs *fs, FILE *fp)</div><div class='add'>+{</div><div class='add'>+    glusterfs_graph_t *graph = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    xlator_t *trav = NULL;</div><div class='add'>+    glusterfs_ctx_t *ctx = NULL;</div><div class='add'>+</div><div class='add'>+    ctx = fs-&gt;ctx;</div><div class='add'>+    graph = glusterfs_graph_construct(fp);</div><div class='add'>+    if (!graph) {</div><div class='add'>+        gf_smsg("glfs", GF_LOG_ERROR, errno, API_MSG_GRAPH_CONSTRUCT_FAILED,</div><div class='add'>+                NULL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    for (trav = graph-&gt;first; trav; trav = trav-&gt;next) {</div><div class='add'>+        if (strcmp(trav-&gt;type, "mount/api") == 0) {</div><div class='add'>+            gf_smsg("glfs", GF_LOG_ERROR, EINVAL, API_MSG_API_XLATOR_ERROR,</div><div class='add'>+                    NULL);</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = glusterfs_graph_prepare(graph, ctx, fs-&gt;volname);</div><div class='add'>+    if (ret) {</div><div class='add'>+        glusterfs_graph_destroy(graph);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = glusterfs_graph_activate(graph, ctx);</div><div class='add'>+</div><div class='add'>+    if (ret) {</div><div class='add'>+        glusterfs_graph_destroy(graph);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    gf_log_dump_graph(fp, graph);</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+out:</div><div class='add'>+    if (fp)</div><div class='add'>+        fclose(fp);</div><div class='add'>+</div><div class='add'>+    if (!ctx-&gt;active) {</div><div class='add'>+        ret = -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+mgmt_cbk_spec(struct rpc_clnt *rpc, void *mydata, void *data)</div><div class='add'>+{</div><div class='add'>+    struct glfs *fs = NULL;</div><div class='add'>+    xlator_t *this = NULL;</div><div class='add'>+</div><div class='add'>+    this = mydata;</div><div class='add'>+    fs = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    glfs_volfile_fetch(fs);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+mgmt_cbk_event(struct rpc_clnt *rpc, void *mydata, void *data)</div><div class='add'>+{</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+mgmt_cbk_statedump(struct rpc_clnt *rpc, void *mydata, void *data)</div><div class='add'>+{</div><div class='add'>+    struct glfs *fs = NULL;</div><div class='add'>+    xlator_t *this = NULL;</div><div class='add'>+    gf_statedump target_pid = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    struct iovec *iov = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    this = mydata;</div><div class='add'>+    if (!this) {</div><div class='add'>+        gf_smsg("glfs", GF_LOG_ERROR, EINVAL, API_MSG_NULL, "mydata", NULL);</div><div class='add'>+        errno = EINVAL;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    fs = this-&gt;private;</div><div class='add'>+    if (!fs) {</div><div class='add'>+        gf_smsg("glfs", GF_LOG_ERROR, EINVAL, API_MSG_NULL, "glfs", NULL);</div><div class='add'>+        errno = EINVAL;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    iov = (struct iovec *)data;</div><div class='add'>+    if (!iov) {</div><div class='add'>+        gf_smsg("glfs", GF_LOG_ERROR, EINVAL, API_MSG_NULL, "iovec data", NULL);</div><div class='add'>+        errno = EINVAL;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = xdr_to_generic(*iov, &amp;target_pid, (xdrproc_t)xdr_gf_statedump);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        gf_smsg("glfs", GF_LOG_ERROR, EINVAL, API_MSG_DECODE_XDR_FAILED, NULL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    gf_msg_trace("glfs", 0, "statedump requested for pid: %d", target_pid.pid);</div><div class='add'>+</div><div class='add'>+    if ((uint64_t)getpid() == target_pid.pid) {</div><div class='add'>+        gf_msg_debug("glfs", 0, "Taking statedump for pid: %d", target_pid.pid);</div><div class='add'>+</div><div class='add'>+        ret = glfs_sysrq(fs, GLFS_SYSRQ_STATEDUMP);</div><div class='add'>+        if (ret &lt; 0) {</div><div class='add'>+            gf_smsg("glfs", GF_LOG_INFO, 0, API_MSG_STATEDUMP_FAILED, NULL);</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static rpcclnt_cb_actor_t mgmt_cbk_actors[GF_CBK_MAXVALUE] = {</div><div class='add'>+    [GF_CBK_FETCHSPEC] = {"FETCHSPEC", mgmt_cbk_spec, GF_CBK_FETCHSPEC},</div><div class='add'>+    [GF_CBK_EVENT_NOTIFY] = {"EVENTNOTIFY", mgmt_cbk_event,</div><div class='add'>+                             GF_CBK_EVENT_NOTIFY},</div><div class='add'>+    [GF_CBK_STATEDUMP] = {"STATEDUMP", mgmt_cbk_statedump, GF_CBK_STATEDUMP},</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+static struct rpcclnt_cb_program mgmt_cbk_prog = {</div><div class='add'>+    .progname = "GlusterFS Callback",</div><div class='add'>+    .prognum = GLUSTER_CBK_PROGRAM,</div><div class='add'>+    .progver = GLUSTER_CBK_VERSION,</div><div class='add'>+    .actors = mgmt_cbk_actors,</div><div class='add'>+    .numactors = GF_CBK_MAXVALUE,</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+static char *clnt_handshake_procs[GF_HNDSK_MAXVALUE] = {</div><div class='add'>+    [GF_HNDSK_NULL] = "NULL",</div><div class='add'>+    [GF_HNDSK_SETVOLUME] = "SETVOLUME",</div><div class='add'>+    [GF_HNDSK_GETSPEC] = "GETSPEC",</div><div class='add'>+    [GF_HNDSK_PING] = "PING",</div><div class='add'>+    [GF_HNDSK_EVENT_NOTIFY] = "EVENTNOTIFY",</div><div class='add'>+    [GF_HNDSK_GET_VOLUME_INFO] = "GETVOLUMEINFO",</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+static rpc_clnt_prog_t clnt_handshake_prog = {</div><div class='add'>+    .progname = "GlusterFS Handshake",</div><div class='add'>+    .prognum = GLUSTER_HNDSK_PROGRAM,</div><div class='add'>+    .progver = GLUSTER_HNDSK_VERSION,</div><div class='add'>+    .procnames = clnt_handshake_procs,</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+mgmt_submit_request(void *req, call_frame_t *frame, glusterfs_ctx_t *ctx,</div><div class='add'>+                    rpc_clnt_prog_t *prog, int procnum, fop_cbk_fn_t cbkfn,</div><div class='add'>+                    xdrproc_t xdrproc)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int count = 0;</div><div class='add'>+    struct iovec iov = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    struct iobuf *iobuf = NULL;</div><div class='add'>+    struct iobref *iobref = NULL;</div><div class='add'>+    ssize_t xdr_size = 0;</div><div class='add'>+</div><div class='add'>+    iobref = iobref_new();</div><div class='add'>+    if (!iobref) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (req) {</div><div class='add'>+        xdr_size = xdr_sizeof(xdrproc, req);</div><div class='add'>+</div><div class='add'>+        iobuf = iobuf_get2(ctx-&gt;iobuf_pool, xdr_size);</div><div class='add'>+        if (!iobuf) {</div><div class='add'>+            goto out;</div><div class='add'>+        };</div><div class='add'>+</div><div class='add'>+        iobref_add(iobref, iobuf);</div><div class='add'>+</div><div class='add'>+        iov.iov_base = iobuf-&gt;ptr;</div><div class='add'>+        iov.iov_len = iobuf_pagesize(iobuf);</div><div class='add'>+</div><div class='add'>+        /* Create the xdr payload */</div><div class='add'>+        ret = xdr_serialize_generic(iov, req, xdrproc);</div><div class='add'>+        if (ret == -1) {</div><div class='add'>+            gf_smsg(THIS-&gt;name, GF_LOG_WARNING, 0, API_MSG_XDR_PAYLOAD_FAILED,</div><div class='add'>+                    NULL);</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+        iov.iov_len = ret;</div><div class='add'>+        count = 1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Send the msg */</div><div class='add'>+    ret = rpc_clnt_submit(ctx-&gt;mgmt, prog, procnum, cbkfn, &amp;iov, count, NULL, 0,</div><div class='add'>+                          iobref, frame, NULL, 0, NULL, 0, NULL);</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (iobref)</div><div class='add'>+        iobref_unref(iobref);</div><div class='add'>+</div><div class='add'>+    if (iobuf)</div><div class='add'>+        iobuf_unref(iobuf);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+ * Callback routine for 'GF_HNDSK_GET_VOLUME_INFO' rpc request</div><div class='add'>+ */</div><div class='add'>+int</div><div class='add'>+mgmt_get_volinfo_cbk(struct rpc_req *req, struct iovec *iov, int count,</div><div class='add'>+                     void *myframe)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+    char *volume_id_str = NULL;</div><div class='add'>+    dict_t *dict = NULL;</div><div class='add'>+    gf_get_volume_info_rsp rsp = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    call_frame_t *frame = NULL;</div><div class='add'>+    glusterfs_ctx_t *ctx = NULL;</div><div class='add'>+    struct glfs *fs = NULL;</div><div class='add'>+    struct syncargs *args;</div><div class='add'>+</div><div class='add'>+    frame = myframe;</div><div class='add'>+    ctx = frame-&gt;this-&gt;ctx;</div><div class='add'>+    args = frame-&gt;local;</div><div class='add'>+</div><div class='add'>+    if (!ctx) {</div><div class='add'>+        gf_smsg(frame-&gt;this-&gt;name, GF_LOG_ERROR, EINVAL, API_MSG_NULL,</div><div class='add'>+                "context", NULL);</div><div class='add'>+        errno = EINVAL;</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    fs = ((xlator_t *)ctx-&gt;master)-&gt;private;</div><div class='add'>+</div><div class='add'>+    if (-1 == req-&gt;rpc_status) {</div><div class='add'>+        gf_smsg(frame-&gt;this-&gt;name, GF_LOG_ERROR, EINVAL,</div><div class='add'>+                API_MSG_CALL_NOT_SUCCESSFUL, NULL);</div><div class='add'>+        errno = EINVAL;</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = xdr_to_generic(*iov, &amp;rsp, (xdrproc_t)xdr_gf_get_volume_info_rsp);</div><div class='add'>+</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        gf_smsg(frame-&gt;this-&gt;name, GF_LOG_ERROR, 0,</div><div class='add'>+                API_MSG_XDR_RESPONSE_DECODE_FAILED, NULL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    gf_msg_debug(frame-&gt;this-&gt;name, 0,</div><div class='add'>+                 "Received resp to GET_VOLUME_INFO "</div><div class='add'>+                 "RPC: %d",</div><div class='add'>+                 rsp.op_ret);</div><div class='add'>+</div><div class='add'>+    if (rsp.op_ret == -1) {</div><div class='add'>+        errno = rsp.op_errno;</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (!rsp.dict.dict_len) {</div><div class='add'>+        gf_smsg(frame-&gt;this-&gt;name, GF_LOG_ERROR, EINVAL, API_MSG_CALL_NOT_VALID,</div><div class='add'>+                NULL);</div><div class='add'>+        ret = -1;</div><div class='add'>+        errno = EINVAL;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    dict = dict_new();</div><div class='add'>+</div><div class='add'>+    if (!dict) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        errno = ENOMEM;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_unserialize(rsp.dict.dict_val, rsp.dict.dict_len, &amp;dict);</div><div class='add'>+</div><div class='add'>+    if (ret) {</div><div class='add'>+        errno = ENOMEM;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_get_str_sizen(dict, "volume_id", &amp;volume_id_str);</div><div class='add'>+    if (ret) {</div><div class='add'>+        errno = EINVAL;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+out:</div><div class='add'>+    if (volume_id_str) {</div><div class='add'>+        gf_msg_debug(frame-&gt;this-&gt;name, 0, "Volume Id: %s", volume_id_str);</div><div class='add'>+        pthread_mutex_lock(&amp;fs-&gt;mutex);</div><div class='add'>+        gf_uuid_parse(volume_id_str, fs-&gt;vol_uuid);</div><div class='add'>+        pthread_mutex_unlock(&amp;fs-&gt;mutex);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_smsg(frame-&gt;this-&gt;name, GF_LOG_ERROR, errno,</div><div class='add'>+                API_MSG_GET_VOLINFO_CBK_FAILED, "error=%s", strerror(errno),</div><div class='add'>+                NULL);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (dict)</div><div class='add'>+        dict_unref(dict);</div><div class='add'>+</div><div class='add'>+    if (rsp.dict.dict_val)</div><div class='add'>+        free(rsp.dict.dict_val);</div><div class='add'>+</div><div class='add'>+    if (rsp.op_errstr)</div><div class='add'>+        free(rsp.op_errstr);</div><div class='add'>+</div><div class='add'>+    gf_msg_debug(frame-&gt;this-&gt;name, 0, "Returning: %d", ret);</div><div class='add'>+</div><div class='add'>+    __wake(args);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_get_volumeid, 3.5.0)</div><div class='add'>+int</div><div class='add'>+pub_glfs_get_volumeid(struct glfs *fs, char *volid, size_t size)</div><div class='add'>+{</div><div class='add'>+    /* TODO: Define a global macro to store UUID size */</div><div class='add'>+    size_t uuid_size = 16;</div><div class='add'>+</div><div class='add'>+    DECLARE_OLD_THIS;</div><div class='add'>+    __GLFS_ENTRY_VALIDATE_FS(fs, invalid_fs);</div><div class='add'>+</div><div class='add'>+    pthread_mutex_lock(&amp;fs-&gt;mutex);</div><div class='add'>+    {</div><div class='add'>+        /* check if the volume uuid is initialized */</div><div class='add'>+        if (!gf_uuid_is_null(fs-&gt;vol_uuid)) {</div><div class='add'>+            pthread_mutex_unlock(&amp;fs-&gt;mutex);</div><div class='add'>+            goto done;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    pthread_mutex_unlock(&amp;fs-&gt;mutex);</div><div class='add'>+</div><div class='add'>+    /* Need to fetch volume_uuid */</div><div class='add'>+    glfs_get_volume_info(fs);</div><div class='add'>+</div><div class='add'>+    if (gf_uuid_is_null(fs-&gt;vol_uuid)) {</div><div class='add'>+        gf_smsg(THIS-&gt;name, GF_LOG_ERROR, EINVAL, API_MSG_FETCH_VOLUUID_FAILED,</div><div class='add'>+                NULL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+done:</div><div class='add'>+    if (!volid || !size) {</div><div class='add'>+        gf_msg_debug(THIS-&gt;name, 0, "volumeid/size is null");</div><div class='add'>+        __GLFS_EXIT_FS;</div><div class='add'>+        return uuid_size;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (size &lt; uuid_size) {</div><div class='add'>+        gf_smsg(THIS-&gt;name, GF_LOG_ERROR, ERANGE, API_MSG_INSUFF_SIZE, NULL);</div><div class='add'>+        errno = ERANGE;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    memcpy(volid, fs-&gt;vol_uuid, uuid_size);</div><div class='add'>+</div><div class='add'>+    __GLFS_EXIT_FS;</div><div class='add'>+</div><div class='add'>+    return uuid_size;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    __GLFS_EXIT_FS;</div><div class='add'>+</div><div class='add'>+invalid_fs:</div><div class='add'>+    return -1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+glfs_get_volume_info(struct glfs *fs)</div><div class='add'>+{</div><div class='add'>+    call_frame_t *frame = NULL;</div><div class='add'>+    glusterfs_ctx_t *ctx = NULL;</div><div class='add'>+    struct syncargs args = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    ctx = fs-&gt;ctx;</div><div class='add'>+    frame = create_frame(THIS, ctx-&gt;pool);</div><div class='add'>+    if (!frame) {</div><div class='add'>+        gf_smsg("glfs", GF_LOG_ERROR, ENOMEM, API_MSG_FRAME_CREAT_FAILED, NULL);</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    frame-&gt;local = &amp;args;</div><div class='add'>+</div><div class='add'>+    __yawn((&amp;args));</div><div class='add'>+</div><div class='add'>+    ret = glfs_get_volume_info_rpc(frame, THIS, fs);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    __yield((&amp;args));</div><div class='add'>+</div><div class='add'>+    frame-&gt;local = NULL;</div><div class='add'>+    STACK_DESTROY(frame-&gt;root);</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+glfs_get_volume_info_rpc(call_frame_t *frame, xlator_t *this, struct glfs *fs)</div><div class='add'>+{</div><div class='add'>+    gf_get_volume_info_req req = {{</div><div class='add'>+        0,</div><div class='add'>+    }};</div><div class='add'>+    int ret = 0;</div><div class='add'>+    glusterfs_ctx_t *ctx = NULL;</div><div class='add'>+    dict_t *dict = NULL;</div><div class='add'>+    int32_t flags = 0;</div><div class='add'>+</div><div class='add'>+    if (!frame || !this || !fs) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ctx = fs-&gt;ctx;</div><div class='add'>+</div><div class='add'>+    dict = dict_new();</div><div class='add'>+    if (!dict) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (fs-&gt;volname) {</div><div class='add'>+        ret = dict_set_str(dict, "volname", fs-&gt;volname);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    // Set the flags for the fields which we are interested in</div><div class='add'>+    flags = (int32_t)GF_GET_VOLUME_UUID;  // ctx-&gt;flags;</div><div class='add'>+    ret = dict_set_int32(dict, "flags", flags);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_smsg(frame-&gt;this-&gt;name, GF_LOG_ERROR, EINVAL,</div><div class='add'>+                API_MSG_DICT_SET_FAILED, "flags", NULL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_allocate_and_serialize(dict, &amp;req.dict.dict_val,</div><div class='add'>+                                      &amp;req.dict.dict_len);</div><div class='add'>+</div><div class='add'>+    ret = mgmt_submit_request(&amp;req, frame, ctx, &amp;clnt_handshake_prog,</div><div class='add'>+                              GF_HNDSK_GET_VOLUME_INFO, mgmt_get_volinfo_cbk,</div><div class='add'>+                              (xdrproc_t)xdr_gf_get_volume_info_req);</div><div class='add'>+out:</div><div class='add'>+    if (dict) {</div><div class='add'>+        dict_unref(dict);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    GF_FREE(req.dict.dict_val);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+glusterfs_oldvolfile_update(struct glfs *fs, char *volfile, ssize_t size)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    pthread_mutex_lock(&amp;fs-&gt;mutex);</div><div class='add'>+</div><div class='add'>+    fs-&gt;oldvollen = size;</div><div class='add'>+    if (!fs-&gt;oldvolfile) {</div><div class='add'>+        fs-&gt;oldvolfile = CALLOC(1, size + 1);</div><div class='add'>+    } else {</div><div class='add'>+        fs-&gt;oldvolfile = REALLOC(fs-&gt;oldvolfile, size + 1);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (!fs-&gt;oldvolfile) {</div><div class='add'>+        fs-&gt;oldvollen = 0;</div><div class='add'>+    } else {</div><div class='add'>+        memcpy(fs-&gt;oldvolfile, volfile, size);</div><div class='add'>+        fs-&gt;oldvollen = size;</div><div class='add'>+        ret = 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    pthread_mutex_unlock(&amp;fs-&gt;mutex);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+glfs_mgmt_getspec_cbk(struct rpc_req *req, struct iovec *iov, int count,</div><div class='add'>+                      void *myframe)</div><div class='add'>+{</div><div class='add'>+    gf_getspec_rsp rsp = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    call_frame_t *frame = NULL;</div><div class='add'>+    glusterfs_ctx_t *ctx = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    ssize_t size = 0;</div><div class='add'>+    FILE *tmpfp = NULL;</div><div class='add'>+    int need_retry = 0;</div><div class='add'>+    struct glfs *fs = NULL;</div><div class='add'>+    dict_t *dict = NULL;</div><div class='add'>+    char *servers_list = NULL;</div><div class='add'>+    int tmp_fd = -1;</div><div class='add'>+    char template[] = "/tmp/gfapi.volfile.XXXXXX";</div><div class='add'>+</div><div class='add'>+    frame = myframe;</div><div class='add'>+    ctx = frame-&gt;this-&gt;ctx;</div><div class='add'>+</div><div class='add'>+    if (!ctx) {</div><div class='add'>+        gf_smsg(frame-&gt;this-&gt;name, GF_LOG_ERROR, EINVAL, API_MSG_NULL,</div><div class='add'>+                "context", NULL);</div><div class='add'>+        errno = EINVAL;</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    fs = ((xlator_t *)ctx-&gt;master)-&gt;private;</div><div class='add'>+</div><div class='add'>+    if (-1 == req-&gt;rpc_status) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        need_retry = 1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = xdr_to_generic(*iov, &amp;rsp, (xdrproc_t)xdr_gf_getspec_rsp);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        gf_smsg(frame-&gt;this-&gt;name, GF_LOG_ERROR, 0, API_MSG_XDR_DECODE_FAILED,</div><div class='add'>+                NULL);</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (-1 == rsp.op_ret) {</div><div class='add'>+        gf_smsg(frame-&gt;this-&gt;name, GF_LOG_ERROR, rsp.op_errno,</div><div class='add'>+                API_MSG_GET_VOLFILE_FAILED, "from server", NULL);</div><div class='add'>+        ret = -1;</div><div class='add'>+        errno = rsp.op_errno;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (!rsp.xdata.xdata_len) {</div><div class='add'>+        goto volfile;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    dict = dict_new();</div><div class='add'>+    if (!dict) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        errno = ENOMEM;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_unserialize(rsp.xdata.xdata_val, rsp.xdata.xdata_len, &amp;dict);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log(frame-&gt;this-&gt;name, GF_LOG_ERROR,</div><div class='add'>+               "failed to unserialize xdata to dictionary");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    dict-&gt;extra_stdfree = rsp.xdata.xdata_val;</div><div class='add'>+</div><div class='add'>+    /* glusterd2 only */</div><div class='add'>+    ret = dict_get_str(dict, "servers-list", &amp;servers_list);</div><div class='add'>+    if (ret) {</div><div class='add'>+        goto volfile;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    gf_log(frame-&gt;this-&gt;name, GF_LOG_INFO,</div><div class='add'>+           "Received list of available volfile servers: %s", servers_list);</div><div class='add'>+</div><div class='add'>+    ret = gf_process_getspec_servers_list(&amp;ctx-&gt;cmd_args, servers_list);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log(frame-&gt;this-&gt;name, GF_LOG_ERROR,</div><div class='add'>+               "Failed (%s) to process servers list: %s", strerror(errno),</div><div class='add'>+               servers_list);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+volfile:</div><div class='add'>+    ret = 0;</div><div class='add'>+    size = rsp.op_ret;</div><div class='add'>+</div><div class='add'>+    pthread_mutex_lock(&amp;fs-&gt;mutex);</div><div class='add'>+    if ((size == fs-&gt;oldvollen) &amp;&amp;</div><div class='add'>+        (memcmp(fs-&gt;oldvolfile, rsp.spec, size) == 0)) {</div><div class='add'>+        pthread_mutex_unlock(&amp;fs-&gt;mutex);</div><div class='add'>+        gf_smsg(frame-&gt;this-&gt;name, GF_LOG_INFO, 0, API_MSG_VOLFILE_INFO, NULL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    pthread_mutex_unlock(&amp;fs-&gt;mutex);</div><div class='add'>+</div><div class='add'>+    /* coverity[secure_temp] mkstemp uses 0600 as the mode and is safe */</div><div class='add'>+    tmp_fd = mkstemp(template);</div><div class='add'>+    if (-1 == tmp_fd) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Calling unlink so that when the file is closed or program</div><div class='add'>+     * terminates the temporary file is deleted.</div><div class='add'>+     */</div><div class='add'>+    ret = sys_unlink(template);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        gf_smsg(frame-&gt;this-&gt;name, GF_LOG_INFO, 0, API_MSG_UNABLE_TO_DEL,</div><div class='add'>+                "template=%s", template, NULL);</div><div class='add'>+        ret = 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    tmpfp = fdopen(tmp_fd, "w+b");</div><div class='add'>+    if (!tmpfp) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    fwrite(rsp.spec, size, 1, tmpfp);</div><div class='add'>+    fflush(tmpfp);</div><div class='add'>+    if (ferror(tmpfp)) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /*  Check if only options have changed. No need to reload the</div><div class='add'>+     *  volfile if topology hasn't changed.</div><div class='add'>+     *  glusterfs_volfile_reconfigure returns 3 possible return states</div><div class='add'>+     *  return 0	     =======&gt; reconfiguration of options has succeeded</div><div class='add'>+     *  return 1	     =======&gt; the graph has to be reconstructed and all</div><div class='add'>+     * the xlators should be inited return -1(or -ve) =======&gt; Some Internal</div><div class='add'>+     * Error occurred during the operation</div><div class='add'>+     */</div><div class='add'>+</div><div class='add'>+    pthread_mutex_lock(&amp;fs-&gt;mutex);</div><div class='add'>+    ret = gf_volfile_reconfigure(fs-&gt;oldvollen, tmpfp, fs-&gt;ctx, fs-&gt;oldvolfile);</div><div class='add'>+    pthread_mutex_unlock(&amp;fs-&gt;mutex);</div><div class='add'>+</div><div class='add'>+    if (ret == 0) {</div><div class='add'>+        gf_msg_debug("glusterfsd-mgmt", 0,</div><div class='add'>+                     "No need to re-load "</div><div class='add'>+                     "volfile, reconfigure done");</div><div class='add'>+        ret = glusterfs_oldvolfile_update(fs, rsp.spec, size);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        gf_msg_debug("glusterfsd-mgmt", 0, "Reconfigure failed !!");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = glfs_process_volfp(fs, tmpfp);</div><div class='add'>+    /* tmpfp closed */</div><div class='add'>+    tmpfp = NULL;</div><div class='add'>+    tmp_fd = -1;</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    ret = glusterfs_oldvolfile_update(fs, rsp.spec, size);</div><div class='add'>+out:</div><div class='add'>+    STACK_DESTROY(frame-&gt;root);</div><div class='add'>+</div><div class='add'>+    if (rsp.spec)</div><div class='add'>+        free(rsp.spec);</div><div class='add'>+</div><div class='add'>+    if (dict)</div><div class='add'>+        dict_unref(dict);</div><div class='add'>+</div><div class='add'>+    // Stop if server is running at an unsupported op-version</div><div class='add'>+    if (ENOTSUP == ret) {</div><div class='add'>+        gf_smsg("mgmt", GF_LOG_ERROR, ENOTSUP, API_MSG_WRONG_OPVERSION, NULL);</div><div class='add'>+        errno = ENOTSUP;</div><div class='add'>+        glfs_init_done(fs, -1);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (ret &amp;&amp; ctx &amp;&amp; !ctx-&gt;active) {</div><div class='add'>+        /* Do it only for the first time */</div><div class='add'>+        /* Failed to get the volume file, something wrong,</div><div class='add'>+           restart the process */</div><div class='add'>+        gf_smsg("glfs-mgmt", GF_LOG_ERROR, EINVAL, API_MSG_GET_VOLFILE_FAILED,</div><div class='add'>+                "key=%s", ctx-&gt;cmd_args.volfile_id, NULL);</div><div class='add'>+        if (!need_retry) {</div><div class='add'>+            if (!errno)</div><div class='add'>+                errno = EINVAL;</div><div class='add'>+            glfs_init_done(fs, -1);</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (tmpfp)</div><div class='add'>+        fclose(tmpfp);</div><div class='add'>+    else if (tmp_fd != -1)</div><div class='add'>+        sys_close(tmp_fd);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+glfs_volfile_fetch(struct glfs *fs)</div><div class='add'>+{</div><div class='add'>+    cmd_args_t *cmd_args = NULL;</div><div class='add'>+    gf_getspec_req req = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int ret = -1;</div><div class='add'>+    call_frame_t *frame = NULL;</div><div class='add'>+    glusterfs_ctx_t *ctx = NULL;</div><div class='add'>+    dict_t *dict = NULL;</div><div class='add'>+</div><div class='add'>+    ctx = fs-&gt;ctx;</div><div class='add'>+    cmd_args = &amp;ctx-&gt;cmd_args;</div><div class='add'>+</div><div class='add'>+    req.key = cmd_args-&gt;volfile_id;</div><div class='add'>+    req.flags = 0;</div><div class='add'>+</div><div class='add'>+    dict = dict_new();</div><div class='add'>+    if (!dict) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    // Set the supported min and max op-versions, so glusterd can make a</div><div class='add'>+    // decision</div><div class='add'>+    ret = dict_set_int32(dict, "min-op-version", GD_OP_VERSION_MIN);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_smsg(THIS-&gt;name, GF_LOG_ERROR, EINVAL, API_MSG_DICT_SET_FAILED,</div><div class='add'>+                "min-op-version", NULL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_set_int32(dict, "max-op-version", GD_OP_VERSION_MAX);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_smsg(THIS-&gt;name, GF_LOG_ERROR, EINVAL, API_MSG_DICT_SET_FAILED,</div><div class='add'>+                "max-op-version", NULL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Ask for a list of volfile (glusterd2 only) servers */</div><div class='add'>+    if (GF_CLIENT_PROCESS == ctx-&gt;process_mode) {</div><div class='add'>+        req.flags = req.flags | GF_GETSPEC_FLAG_SERVERS_LIST;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_allocate_and_serialize(dict, &amp;req.xdata.xdata_val,</div><div class='add'>+                                      &amp;req.xdata.xdata_len);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        gf_smsg(THIS-&gt;name, GF_LOG_ERROR, 0, API_MSG_DICT_SERIALIZE_FAILED,</div><div class='add'>+                NULL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    frame = create_frame(THIS, ctx-&gt;pool);</div><div class='add'>+    if (!frame) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = mgmt_submit_request(&amp;req, frame, ctx, &amp;clnt_handshake_prog,</div><div class='add'>+                              GF_HNDSK_GETSPEC, glfs_mgmt_getspec_cbk,</div><div class='add'>+                              (xdrproc_t)xdr_gf_getspec_req);</div><div class='add'>+out:</div><div class='add'>+    if (req.xdata.xdata_val)</div><div class='add'>+        GF_FREE(req.xdata.xdata_val);</div><div class='add'>+    if (dict)</div><div class='add'>+        dict_unref(dict);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+mgmt_rpc_notify(struct rpc_clnt *rpc, void *mydata, rpc_clnt_event_t event,</div><div class='add'>+                void *data)</div><div class='add'>+{</div><div class='add'>+    xlator_t *this = NULL;</div><div class='add'>+    glusterfs_ctx_t *ctx = NULL;</div><div class='add'>+    server_cmdline_t *server = NULL;</div><div class='add'>+    rpc_transport_t *rpc_trans = NULL;</div><div class='add'>+    struct glfs *fs = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    struct dnscache6 *dnscache = NULL;</div><div class='add'>+</div><div class='add'>+    this = mydata;</div><div class='add'>+    rpc_trans = rpc-&gt;conn.trans;</div><div class='add'>+</div><div class='add'>+    ctx = this-&gt;ctx;</div><div class='add'>+    if (!ctx)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    fs = ((xlator_t *)ctx-&gt;master)-&gt;private;</div><div class='add'>+</div><div class='add'>+    switch (event) {</div><div class='add'>+        case RPC_CLNT_DISCONNECT:</div><div class='add'>+            if (!ctx-&gt;active) {</div><div class='add'>+                if (rpc_trans-&gt;connect_failed)</div><div class='add'>+                    gf_smsg("glfs-mgmt", GF_LOG_ERROR, 0,</div><div class='add'>+                            API_MSG_REMOTE_HOST_CONN_FAILED, "server=%s",</div><div class='add'>+                            ctx-&gt;cmd_args.volfile_server, NULL);</div><div class='add'>+                else</div><div class='add'>+                    gf_smsg("glfs-mgmt", GF_LOG_INFO, 0,</div><div class='add'>+                            API_MSG_REMOTE_HOST_CONN_FAILED, "server=%s",</div><div class='add'>+                            ctx-&gt;cmd_args.volfile_server, NULL);</div><div class='add'>+</div><div class='add'>+                if (!rpc-&gt;disabled) {</div><div class='add'>+                    /*</div><div class='add'>+                     * Check if dnscache is exhausted for current server</div><div class='add'>+                     * and continue until cache is exhausted</div><div class='add'>+                     */</div><div class='add'>+                    dnscache = rpc_trans-&gt;dnscache;</div><div class='add'>+                    if (dnscache &amp;&amp; dnscache-&gt;next) {</div><div class='add'>+                        break;</div><div class='add'>+                    }</div><div class='add'>+                }</div><div class='add'>+                server = ctx-&gt;cmd_args.curr_server;</div><div class='add'>+                if (server-&gt;list.next == &amp;ctx-&gt;cmd_args.volfile_servers) {</div><div class='add'>+                    errno = ENOTCONN;</div><div class='add'>+                    gf_smsg("glfs-mgmt", GF_LOG_INFO, ENOTCONN,</div><div class='add'>+                            API_MSG_VOLFILE_SERVER_EXHAUST, NULL);</div><div class='add'>+                    glfs_init_done(fs, -1);</div><div class='add'>+                    break;</div><div class='add'>+                }</div><div class='add'>+                server = list_entry(server-&gt;list.next, typeof(*server), list);</div><div class='add'>+                ctx-&gt;cmd_args.curr_server = server;</div><div class='add'>+                ctx-&gt;cmd_args.volfile_server_port = server-&gt;port;</div><div class='add'>+                ctx-&gt;cmd_args.volfile_server = server-&gt;volfile_server;</div><div class='add'>+                ctx-&gt;cmd_args.volfile_server_transport = server-&gt;transport;</div><div class='add'>+</div><div class='add'>+                ret = dict_set_str(rpc_trans-&gt;options, "transport-type",</div><div class='add'>+                                   server-&gt;transport);</div><div class='add'>+                if (ret != 0) {</div><div class='add'>+                    gf_smsg("glfs-mgmt", GF_LOG_ERROR, ENOTCONN,</div><div class='add'>+                            API_MSG_DICT_SET_FAILED, "transport-type=%s",</div><div class='add'>+                            server-&gt;transport, NULL);</div><div class='add'>+                    errno = ENOTCONN;</div><div class='add'>+                    glfs_init_done(fs, -1);</div><div class='add'>+                    break;</div><div class='add'>+                }</div><div class='add'>+</div><div class='add'>+                if (strcmp(server-&gt;transport, "unix") == 0) {</div><div class='add'>+                    ret = dict_set_str(rpc_trans-&gt;options,</div><div class='add'>+                                       "transport.socket.connect-path",</div><div class='add'>+                                       server-&gt;volfile_server);</div><div class='add'>+                    if (ret != 0) {</div><div class='add'>+                        gf_smsg("glfs-mgmt", GF_LOG_ERROR, ENOTCONN,</div><div class='add'>+                                API_MSG_DICT_SET_FAILED,</div><div class='add'>+                                "socket.connect-path=%s",</div><div class='add'>+                                server-&gt;volfile_server, NULL);</div><div class='add'>+                        errno = ENOTCONN;</div><div class='add'>+                        glfs_init_done(fs, -1);</div><div class='add'>+                        break;</div><div class='add'>+                    }</div><div class='add'>+                    /* delete the remote-host and remote-port keys</div><div class='add'>+                     * in case they were set while looping through</div><div class='add'>+                     * list of volfile servers previously</div><div class='add'>+                     */</div><div class='add'>+                    dict_del(rpc_trans-&gt;options, "remote-host");</div><div class='add'>+                    dict_del(rpc_trans-&gt;options, "remote-port");</div><div class='add'>+                } else {</div><div class='add'>+                    ret = dict_set_int32(rpc_trans-&gt;options, "remote-port",</div><div class='add'>+                                         server-&gt;port);</div><div class='add'>+                    if (ret != 0) {</div><div class='add'>+                        gf_smsg("glfs-mgmt", GF_LOG_ERROR, ENOTCONN,</div><div class='add'>+                                API_MSG_DICT_SET_FAILED, "remote-port=%d",</div><div class='add'>+                                server-&gt;port, NULL);</div><div class='add'>+                        errno = ENOTCONN;</div><div class='add'>+                        glfs_init_done(fs, -1);</div><div class='add'>+                        break;</div><div class='add'>+                    }</div><div class='add'>+</div><div class='add'>+                    ret = dict_set_str(rpc_trans-&gt;options, "remote-host",</div><div class='add'>+                                       server-&gt;volfile_server);</div><div class='add'>+                    if (ret != 0) {</div><div class='add'>+                        gf_smsg("glfs-mgmt", GF_LOG_ERROR, ENOTCONN,</div><div class='add'>+                                API_MSG_DICT_SET_FAILED, "remote-host=%s",</div><div class='add'>+                                server-&gt;volfile_server, NULL);</div><div class='add'>+                        errno = ENOTCONN;</div><div class='add'>+                        glfs_init_done(fs, -1);</div><div class='add'>+                        break;</div><div class='add'>+                    }</div><div class='add'>+                    /* delete the "transport.socket.connect-path"</div><div class='add'>+                     * key in case if it was set while looping</div><div class='add'>+                     * through list of volfile servers previously</div><div class='add'>+                     */</div><div class='add'>+                    dict_del(rpc_trans-&gt;options,</div><div class='add'>+                             "transport.socket.connect-path");</div><div class='add'>+                }</div><div class='add'>+</div><div class='add'>+                gf_smsg("glfs-mgmt", GF_LOG_INFO, 0, API_MSG_VOLFILE_CONNECTING,</div><div class='add'>+                        "server=%s", server-&gt;volfile_server, "port=%d",</div><div class='add'>+                        server-&gt;port, "transport=%s", server-&gt;transport, NULL);</div><div class='add'>+            }</div><div class='add'>+            break;</div><div class='add'>+        case RPC_CLNT_CONNECT:</div><div class='add'>+            ret = glfs_volfile_fetch(fs);</div><div class='add'>+            if (ret &amp;&amp; (ctx-&gt;active == NULL)) {</div><div class='add'>+                /* Do it only for the first time */</div><div class='add'>+                /* Exit the process.. there are some wrong options */</div><div class='add'>+                gf_smsg("glfs-mgmt", GF_LOG_ERROR, EINVAL,</div><div class='add'>+                        API_MSG_GET_VOLFILE_FAILED, "key=%s",</div><div class='add'>+                        ctx-&gt;cmd_args.volfile_id, NULL);</div><div class='add'>+                errno = EINVAL;</div><div class='add'>+                glfs_init_done(fs, -1);</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            break;</div><div class='add'>+        default:</div><div class='add'>+            break;</div><div class='add'>+    }</div><div class='add'>+out:</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+glusterfs_mgmt_notify(int32_t op, void *data, ...)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    switch (op) {</div><div class='add'>+        case GF_EN_DEFRAG_STATUS:</div><div class='add'>+            break;</div><div class='add'>+</div><div class='add'>+        default:</div><div class='add'>+            break;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+glfs_mgmt_init(struct glfs *fs)</div><div class='add'>+{</div><div class='add'>+    cmd_args_t *cmd_args = NULL;</div><div class='add'>+    struct rpc_clnt *rpc = NULL;</div><div class='add'>+    dict_t *options = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int port = GF_DEFAULT_BASE_PORT;</div><div class='add'>+    char *host = NULL;</div><div class='add'>+    glusterfs_ctx_t *ctx = NULL;</div><div class='add'>+</div><div class='add'>+    ctx = fs-&gt;ctx;</div><div class='add'>+    cmd_args = &amp;ctx-&gt;cmd_args;</div><div class='add'>+</div><div class='add'>+    if (ctx-&gt;mgmt)</div><div class='add'>+        return 0;</div><div class='add'>+</div><div class='add'>+    options = dict_new();</div><div class='add'>+    if (!options)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    if (cmd_args-&gt;volfile_server_port)</div><div class='add'>+        port = cmd_args-&gt;volfile_server_port;</div><div class='add'>+</div><div class='add'>+    if (cmd_args-&gt;volfile_server) {</div><div class='add'>+        host = cmd_args-&gt;volfile_server;</div><div class='add'>+    } else if (cmd_args-&gt;volfile_server_transport &amp;&amp;</div><div class='add'>+               !strcmp(cmd_args-&gt;volfile_server_transport, "unix")) {</div><div class='add'>+        host = DEFAULT_GLUSTERD_SOCKFILE;</div><div class='add'>+    } else {</div><div class='add'>+        host = "localhost";</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (cmd_args-&gt;volfile_server_transport &amp;&amp;</div><div class='add'>+        !strcmp(cmd_args-&gt;volfile_server_transport, "unix")) {</div><div class='add'>+        ret = rpc_transport_unix_options_build(options, host, 0);</div><div class='add'>+    } else {</div><div class='add'>+        xlator_cmdline_option_t *opt = find_xlator_option_in_cmd_args_t(</div><div class='add'>+            "address-family", cmd_args);</div><div class='add'>+        ret = rpc_transport_inet_options_build(options, host, port,</div><div class='add'>+                                               (opt ? opt-&gt;value : NULL));</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    rpc = rpc_clnt_new(options, THIS, THIS-&gt;name, 8);</div><div class='add'>+    if (!rpc) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        gf_smsg(THIS-&gt;name, GF_LOG_WARNING, 0, API_MSG_CREATE_RPC_CLIENT_FAILED,</div><div class='add'>+                NULL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = rpc_clnt_register_notify(rpc, mgmt_rpc_notify, THIS);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_smsg(THIS-&gt;name, GF_LOG_WARNING, 0, API_MSG_REG_NOTIFY_FUNC_FAILED,</div><div class='add'>+                NULL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = rpcclnt_cbk_program_register(rpc, &amp;mgmt_cbk_prog, THIS);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_smsg(THIS-&gt;name, GF_LOG_WARNING, 0, API_MSG_REG_CBK_FUNC_FAILED,</div><div class='add'>+                NULL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ctx-&gt;notify = glusterfs_mgmt_notify;</div><div class='add'>+</div><div class='add'>+    /* This value should be set before doing the 'rpc_clnt_start()' as</div><div class='add'>+       the notify function uses this variable */</div><div class='add'>+    ctx-&gt;mgmt = rpc;</div><div class='add'>+</div><div class='add'>+    ret = rpc_clnt_start(rpc);</div><div class='add'>+out:</div><div class='add'>+    if (options)</div><div class='add'>+        dict_unref(options);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='head'>diff --git a/api/src/glfs-resolve.c b/api/src/glfs-resolve.c<br/>new file mode 100644<br/>index 00000000000..8a393ecb464<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/api/src/glfs-resolve.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>api/src/glfs-resolve.c</a></div><div class='hunk'>@@ -0,0 +1,1199 @@</div><div class='add'>+/*</div><div class='add'>+  Copyright (c) 2012-2018 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#include &lt;unistd.h&gt;</div><div class='add'>+#include &lt;string.h&gt;</div><div class='add'>+#include &lt;stdlib.h&gt;</div><div class='add'>+#include &lt;stdio.h&gt;</div><div class='add'>+#include &lt;inttypes.h&gt;</div><div class='add'>+#include &lt;limits.h&gt;</div><div class='add'>+</div><div class='add'>+#include &lt;glusterfs/glusterfs.h&gt;</div><div class='add'>+#include &lt;glusterfs/logging.h&gt;</div><div class='add'>+#include &lt;glusterfs/stack.h&gt;</div><div class='add'>+#include &lt;glusterfs/gf-event.h&gt;</div><div class='add'>+#include "glfs-mem-types.h"</div><div class='add'>+#include &lt;glusterfs/common-utils.h&gt;</div><div class='add'>+#include &lt;glusterfs/syncop.h&gt;</div><div class='add'>+#include &lt;glusterfs/call-stub.h&gt;</div><div class='add'>+#include "gfapi-messages.h"</div><div class='add'>+#include &lt;glusterfs/inode.h&gt;</div><div class='add'>+#include "glfs-internal.h"</div><div class='add'>+</div><div class='add'>+#define graphid_str(subvol)                                                    \</div><div class='add'>+    (uuid_utoa((unsigned char *)subvol-&gt;graph-&gt;graph_uuid))</div><div class='add'>+int</div><div class='add'>+glfs_first_lookup_safe(xlator_t *subvol)</div><div class='add'>+{</div><div class='add'>+    loc_t loc = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    loc.inode = subvol-&gt;itable-&gt;root;</div><div class='add'>+    memset(loc.gfid, 0, 16);</div><div class='add'>+    loc.gfid[15] = 1;</div><div class='add'>+    loc.path = "/";</div><div class='add'>+    loc.name = "";</div><div class='add'>+</div><div class='add'>+    ret = syncop_lookup(subvol, &amp;loc, 0, 0, 0, 0);</div><div class='add'>+    DECODE_SYNCOP_ERR(ret);</div><div class='add'>+</div><div class='add'>+    gf_msg_debug(subvol-&gt;name, 0, "first lookup complete %d", ret);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+__glfs_first_lookup(struct glfs *fs, xlator_t *subvol)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    fs-&gt;migration_in_progress = 1;</div><div class='add'>+    pthread_mutex_unlock(&amp;fs-&gt;mutex);</div><div class='add'>+    {</div><div class='add'>+        ret = glfs_first_lookup_safe(subvol);</div><div class='add'>+    }</div><div class='add'>+    pthread_mutex_lock(&amp;fs-&gt;mutex);</div><div class='add'>+    fs-&gt;migration_in_progress = 0;</div><div class='add'>+    pthread_cond_broadcast(&amp;fs-&gt;cond);</div><div class='add'>+</div><div class='add'>+    /* wake up other waiting tasks */</div><div class='add'>+    __GLFS_SYNCTASK_WAKE(fs);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/**</div><div class='add'>+ * We have to check if need_lookup flag is set in both old and the new inodes.</div><div class='add'>+ * If its set in oldinode, then directly go ahead and do an explicit lookup.</div><div class='add'>+ * But if its not set in the oldinode, then check if the newinode is linked</div><div class='add'>+ * via readdirp. If so an explicit lookup is needed on the new inode, so that</div><div class='add'>+ * below xlators can set their respective contexts.</div><div class='add'>+ */</div><div class='add'>+inode_t *</div><div class='add'>+glfs_refresh_inode_safe(xlator_t *subvol, inode_t *oldinode,</div><div class='add'>+                        gf_boolean_t need_lookup)</div><div class='add'>+{</div><div class='add'>+    loc_t loc = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int ret = -1;</div><div class='add'>+    struct iatt iatt = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    inode_t *newinode = NULL;</div><div class='add'>+    gf_boolean_t lookup_needed = _gf_false;</div><div class='add'>+    uint64_t ctx_value = LOOKUP_NOT_NEEDED;</div><div class='add'>+</div><div class='add'>+    if (!oldinode)</div><div class='add'>+        return NULL;</div><div class='add'>+</div><div class='add'>+    if (!need_lookup &amp;&amp; oldinode-&gt;table-&gt;xl == subvol)</div><div class='add'>+        return inode_ref(oldinode);</div><div class='add'>+</div><div class='add'>+    newinode = inode_find(subvol-&gt;itable, oldinode-&gt;gfid);</div><div class='add'>+    if (!need_lookup &amp;&amp; newinode) {</div><div class='add'>+        lookup_needed = inode_needs_lookup(newinode, THIS);</div><div class='add'>+        if (!lookup_needed)</div><div class='add'>+            return newinode;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    gf_uuid_copy(loc.gfid, oldinode-&gt;gfid);</div><div class='add'>+    if (!newinode)</div><div class='add'>+        loc.inode = inode_new(subvol-&gt;itable);</div><div class='add'>+    else</div><div class='add'>+        loc.inode = newinode;</div><div class='add'>+</div><div class='add'>+    if (!loc.inode)</div><div class='add'>+        return NULL;</div><div class='add'>+</div><div class='add'>+    ret = syncop_lookup(subvol, &amp;loc, &amp;iatt, 0, 0, 0);</div><div class='add'>+    DECODE_SYNCOP_ERR(ret);</div><div class='add'>+</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_smsg(subvol-&gt;name, GF_LOG_WARNING, errno,</div><div class='add'>+                API_MSG_INODE_REFRESH_FAILED, "gfid=%s",</div><div class='add'>+                uuid_utoa(oldinode-&gt;gfid), "err=%s", strerror(errno), NULL);</div><div class='add'>+        loc_wipe(&amp;loc);</div><div class='add'>+        return NULL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    newinode = inode_link(loc.inode, 0, 0, &amp;iatt);</div><div class='add'>+    if (newinode) {</div><div class='add'>+        if (newinode == loc.inode)</div><div class='add'>+            inode_ctx_set(newinode, THIS, &amp;ctx_value);</div><div class='add'>+        inode_lookup(newinode);</div><div class='add'>+    } else {</div><div class='add'>+        gf_smsg(subvol-&gt;name, GF_LOG_WARNING, errno, API_MSG_INODE_LINK_FAILED,</div><div class='add'>+                "gfid=%s", uuid_utoa((unsigned char *)&amp;iatt.ia_gfid), NULL);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    loc_wipe(&amp;loc);</div><div class='add'>+</div><div class='add'>+    return newinode;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+inode_t *</div><div class='add'>+__glfs_refresh_inode(struct glfs *fs, xlator_t *subvol, inode_t *inode,</div><div class='add'>+                     gf_boolean_t need_lookup)</div><div class='add'>+{</div><div class='add'>+    inode_t *newinode = NULL;</div><div class='add'>+</div><div class='add'>+    fs-&gt;migration_in_progress = 1;</div><div class='add'>+    pthread_mutex_unlock(&amp;fs-&gt;mutex);</div><div class='add'>+    {</div><div class='add'>+        newinode = glfs_refresh_inode_safe(subvol, inode, need_lookup);</div><div class='add'>+    }</div><div class='add'>+    pthread_mutex_lock(&amp;fs-&gt;mutex);</div><div class='add'>+    fs-&gt;migration_in_progress = 0;</div><div class='add'>+    pthread_cond_broadcast(&amp;fs-&gt;cond);</div><div class='add'>+</div><div class='add'>+    /* wake up other waiting tasks */</div><div class='add'>+    __GLFS_SYNCTASK_WAKE(fs);</div><div class='add'>+</div><div class='add'>+    return newinode;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+GFAPI_SYMVER_PRIVATE_DEFAULT(glfs_loc_touchup, 3.4.0)</div><div class='add'>+int</div><div class='add'>+priv_glfs_loc_touchup(loc_t *loc)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    ret = loc_touchup(loc, loc-&gt;name);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        errno = -ret;</div><div class='add'>+        ret = -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+glfs_resolve_symlink(struct glfs *fs, xlator_t *subvol, inode_t *inode,</div><div class='add'>+                     char **lpath)</div><div class='add'>+{</div><div class='add'>+    loc_t loc = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    char *path = NULL;</div><div class='add'>+    char *rpath = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    loc.inode = inode_ref(inode);</div><div class='add'>+    gf_uuid_copy(loc.gfid, inode-&gt;gfid);</div><div class='add'>+    ret = inode_path(inode, NULL, &amp;rpath);</div><div class='add'>+    if (ret &lt; 0)</div><div class='add'>+        goto out;</div><div class='add'>+    loc.path = rpath;</div><div class='add'>+</div><div class='add'>+    ret = syncop_readlink(subvol, &amp;loc, &amp;path, 4096, NULL, NULL);</div><div class='add'>+    DECODE_SYNCOP_ERR(ret);</div><div class='add'>+</div><div class='add'>+    if (ret &lt; 0)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    if (lpath)</div><div class='add'>+        *lpath = path;</div><div class='add'>+out:</div><div class='add'>+    loc_wipe(&amp;loc);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+glfs_resolve_base(struct glfs *fs, xlator_t *subvol, inode_t *inode,</div><div class='add'>+                  struct iatt *iatt)</div><div class='add'>+{</div><div class='add'>+    loc_t loc = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int ret = -1;</div><div class='add'>+    char *path = NULL;</div><div class='add'>+</div><div class='add'>+    loc.inode = inode_ref(inode);</div><div class='add'>+    gf_uuid_copy(loc.gfid, inode-&gt;gfid);</div><div class='add'>+</div><div class='add'>+    ret = inode_path(loc.inode, NULL, &amp;path);</div><div class='add'>+    loc.path = path;</div><div class='add'>+    if (ret &lt; 0)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    ret = syncop_lookup(subvol, &amp;loc, iatt, NULL, NULL, NULL);</div><div class='add'>+    DECODE_SYNCOP_ERR(ret);</div><div class='add'>+out:</div><div class='add'>+    loc_wipe(&amp;loc);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+/*</div><div class='add'>+ * This function can be used to call named lookup on root.</div><div class='add'>+ * If you use glfs_resolve_base, that will be a nameless lookup.</div><div class='add'>+ */</div><div class='add'>+static int</div><div class='add'>+glfs_resolve_root(struct glfs *fs, xlator_t *subvol, inode_t *inode,</div><div class='add'>+                  struct iatt *iatt)</div><div class='add'>+{</div><div class='add'>+    loc_t loc = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int ret = -1;</div><div class='add'>+    char *path = NULL;</div><div class='add'>+</div><div class='add'>+    loc.inode = inode_ref(inode);</div><div class='add'>+</div><div class='add'>+    ret = inode_path(loc.inode, ".", &amp;path);</div><div class='add'>+    loc.path = path;</div><div class='add'>+    loc.name = ".";</div><div class='add'>+    /* Having a value in loc.name will help to bypass md-cache check for</div><div class='add'>+     * nameless lookup.</div><div class='add'>+     * TODO: Re-visit on nameless lookup and md-cache.</div><div class='add'>+     * Github issue : https://github.com/gluster/glusterfs/issues/232</div><div class='add'>+     */</div><div class='add'>+    loc.parent = inode_ref(inode);</div><div class='add'>+    if (ret &lt; 0)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    ret = syncop_lookup(subvol, &amp;loc, iatt, NULL, NULL, NULL);</div><div class='add'>+    DECODE_SYNCOP_ERR(ret);</div><div class='add'>+out:</div><div class='add'>+    loc_wipe(&amp;loc);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+inode_t *</div><div class='add'>+glfs_resolve_component(struct glfs *fs, xlator_t *subvol, inode_t *parent,</div><div class='add'>+                       const char *component, struct iatt *iatt,</div><div class='add'>+                       int force_lookup)</div><div class='add'>+{</div><div class='add'>+    loc_t loc = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    inode_t *inode = NULL;</div><div class='add'>+    inode_t *temp_parent = NULL;</div><div class='add'>+    int reval = 0;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int glret = -1;</div><div class='add'>+    struct iatt ciatt = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    uuid_t gfid;</div><div class='add'>+    dict_t *xattr_req = NULL;</div><div class='add'>+    uint64_t ctx_value = LOOKUP_NOT_NEEDED;</div><div class='add'>+</div><div class='add'>+    loc.parent = inode_ref(parent);</div><div class='add'>+    gf_uuid_copy(loc.pargfid, parent-&gt;gfid);</div><div class='add'>+</div><div class='add'>+    if (__is_root_gfid(parent-&gt;gfid) &amp;&amp;</div><div class='add'>+        ((strcmp(component, ".") == 0) || (strcmp(component, "..") == 0) ||</div><div class='add'>+         (strcmp(component, "") == 0))) {</div><div class='add'>+        if (!force_lookup) {</div><div class='add'>+            inode = inode_ref(parent);</div><div class='add'>+        } else {</div><div class='add'>+            ret = glfs_resolve_root(fs, subvol, parent, &amp;ciatt);</div><div class='add'>+            if (!ret)</div><div class='add'>+                inode = inode_ref(parent);</div><div class='add'>+        }</div><div class='add'>+        goto found;</div><div class='add'>+    }</div><div class='add'>+    /* *</div><div class='add'>+     * if the component name is either "." or "..", it will try to</div><div class='add'>+     * resolve that if inode has a proper parent (named lookup).</div><div class='add'>+     *</div><div class='add'>+     * Below condition works like this</div><div class='add'>+     *</div><div class='add'>+     * Example 1 :</div><div class='add'>+     * Path /out_dir/dir/in_dir/.</div><div class='add'>+     *     In put values :</div><div class='add'>+     *         parent = in_dir</div><div class='add'>+     *         component : "."</div><div class='add'>+     *</div><div class='add'>+     *      Out put values:</div><div class='add'>+     *         parent : dir</div><div class='add'>+     *         component : "in_dir"</div><div class='add'>+     *</div><div class='add'>+     * Example 2 :</div><div class='add'>+     * Path /out_dir/dir/in_dir/..</div><div class='add'>+     *     In put values :</div><div class='add'>+     *         parent = in_dir</div><div class='add'>+     *         component : ".."</div><div class='add'>+     *</div><div class='add'>+     *     Out put values:</div><div class='add'>+     *         parent : output_dir</div><div class='add'>+     *         component : "dir"</div><div class='add'>+     *</div><div class='add'>+     * In case of nameless lookup, both "." and ".." retained</div><div class='add'>+     */</div><div class='add'>+</div><div class='add'>+    if (strcmp(component, ".") == 0) {</div><div class='add'>+        loc.inode = inode_ref(parent);</div><div class='add'>+        temp_parent = inode_parent(loc.inode, 0, 0);</div><div class='add'>+        if (temp_parent) {</div><div class='add'>+            inode_unref(loc.parent);</div><div class='add'>+            loc.parent = temp_parent;</div><div class='add'>+            gf_uuid_copy(loc.pargfid, temp_parent-&gt;gfid);</div><div class='add'>+            inode_find_directory_name(loc.inode, &amp;loc.name);</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+    } else if (strcmp(component, "..") == 0) {</div><div class='add'>+        loc.inode = inode_parent(parent, 0, 0);</div><div class='add'>+        if (loc.inode) {</div><div class='add'>+            temp_parent = inode_parent(loc.inode, 0, 0);</div><div class='add'>+            if (temp_parent) {</div><div class='add'>+                inode_unref(loc.parent);</div><div class='add'>+                loc.parent = temp_parent;</div><div class='add'>+                gf_uuid_copy(loc.pargfid, temp_parent-&gt;gfid);</div><div class='add'>+                inode_find_directory_name(loc.inode, &amp;loc.name);</div><div class='add'>+            } else if (__is_root_gfid(loc.inode-&gt;gfid)) {</div><div class='add'>+                inode_unref(loc.parent);</div><div class='add'>+                loc.parent = inode_ref(loc.inode);</div><div class='add'>+                gf_uuid_copy(loc.pargfid, loc.inode-&gt;gfid);</div><div class='add'>+                loc.name = ".";</div><div class='add'>+            } else {</div><div class='add'>+                inode_unref(loc.inode);</div><div class='add'>+                loc.inode = NULL;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+    } else</div><div class='add'>+        loc.inode = inode_grep(parent-&gt;table, parent, component);</div><div class='add'>+</div><div class='add'>+    if (!loc.name)</div><div class='add'>+        loc.name = component;</div><div class='add'>+</div><div class='add'>+    if (loc.inode) {</div><div class='add'>+        gf_uuid_copy(loc.gfid, loc.inode-&gt;gfid);</div><div class='add'>+        reval = 1;</div><div class='add'>+</div><div class='add'>+        if (!(force_lookup || inode_needs_lookup(loc.inode, THIS))) {</div><div class='add'>+            inode = inode_ref(loc.inode);</div><div class='add'>+            goto found;</div><div class='add'>+        }</div><div class='add'>+    } else {</div><div class='add'>+        gf_uuid_generate(gfid);</div><div class='add'>+        loc.inode = inode_new(parent-&gt;table);</div><div class='add'>+        if (!loc.inode) {</div><div class='add'>+            errno = ENOMEM;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        xattr_req = dict_new();</div><div class='add'>+        if (!xattr_req) {</div><div class='add'>+            errno = ENOMEM;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        ret = dict_set_gfuuid(xattr_req, "gfid-req", gfid, true);</div><div class='add'>+        if (ret) {</div><div class='add'>+            errno = ENOMEM;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    glret = priv_glfs_loc_touchup(&amp;loc);</div><div class='add'>+    if (glret &lt; 0) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = syncop_lookup(subvol, &amp;loc, &amp;ciatt, NULL, xattr_req, NULL);</div><div class='add'>+    if (ret &amp;&amp; reval) {</div><div class='add'>+        /*</div><div class='add'>+         * A stale mapping might exist for a dentry/inode that has been</div><div class='add'>+         * removed from another client.</div><div class='add'>+         */</div><div class='add'>+        if (-ret == ENOENT) {</div><div class='add'>+            inode_unlink(loc.inode, loc.parent, loc.name);</div><div class='add'>+            if (!inode_has_dentry(loc.inode))</div><div class='add'>+                inode_forget(loc.inode, 0);</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        inode_unref(loc.inode);</div><div class='add'>+        gf_uuid_clear(loc.gfid);</div><div class='add'>+        loc.inode = inode_new(parent-&gt;table);</div><div class='add'>+        if (!loc.inode) {</div><div class='add'>+            errno = ENOMEM;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        xattr_req = dict_new();</div><div class='add'>+        if (!xattr_req) {</div><div class='add'>+            errno = ENOMEM;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        gf_uuid_generate(gfid);</div><div class='add'>+</div><div class='add'>+        ret = dict_set_gfuuid(xattr_req, "gfid-req", gfid, true);</div><div class='add'>+        if (ret) {</div><div class='add'>+            errno = ENOMEM;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        ret = syncop_lookup(subvol, &amp;loc, &amp;ciatt, NULL, xattr_req, NULL);</div><div class='add'>+    }</div><div class='add'>+    DECODE_SYNCOP_ERR(ret);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    inode = inode_link(loc.inode, loc.parent, component, &amp;ciatt);</div><div class='add'>+</div><div class='add'>+    if (!inode) {</div><div class='add'>+        gf_smsg(subvol-&gt;name, GF_LOG_WARNING, errno, API_MSG_INODE_LINK_FAILED,</div><div class='add'>+                "gfid=%s", uuid_utoa((unsigned char *)&amp;ciatt.ia_gfid), NULL);</div><div class='add'>+        goto out;</div><div class='add'>+    } else if (inode == loc.inode)</div><div class='add'>+        inode_ctx_set(inode, THIS, &amp;ctx_value);</div><div class='add'>+found:</div><div class='add'>+    if (inode) {</div><div class='add'>+        ciatt.ia_type = inode-&gt;ia_type;</div><div class='add'>+        inode_lookup(inode);</div><div class='add'>+    }</div><div class='add'>+    if (iatt)</div><div class='add'>+        *iatt = ciatt;</div><div class='add'>+out:</div><div class='add'>+    if (xattr_req)</div><div class='add'>+        dict_unref(xattr_req);</div><div class='add'>+    loc_wipe(&amp;loc);</div><div class='add'>+</div><div class='add'>+    return inode;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+GFAPI_SYMVER_PRIVATE_DEFAULT(glfs_resolve_at, 3.4.0)</div><div class='add'>+int</div><div class='add'>+priv_glfs_resolve_at(struct glfs *fs, xlator_t *subvol, inode_t *at,</div><div class='add'>+                     const char *origpath, loc_t *loc, struct iatt *iatt,</div><div class='add'>+                     int follow, int reval)</div><div class='add'>+{</div><div class='add'>+    inode_t *inode = NULL;</div><div class='add'>+    inode_t *parent = NULL;</div><div class='add'>+    char *saveptr = NULL;</div><div class='add'>+    char *path = NULL;</div><div class='add'>+    char *component = NULL;</div><div class='add'>+    char *next_component = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    struct iatt ciatt = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    DECLARE_OLD_THIS;</div><div class='add'>+    __GLFS_ENTRY_VALIDATE_FS(fs, invalid_fs);</div><div class='add'>+</div><div class='add'>+    if (origpath[0] == '\0') {</div><div class='add'>+        errno = EINVAL;</div><div class='add'>+        goto invalid_fs;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    parent = NULL;</div><div class='add'>+    if (at &amp;&amp; origpath[0] != '/') {</div><div class='add'>+        /* A relative resolution of a path which starts with '/'</div><div class='add'>+           is equal to an absolute path resolution.</div><div class='add'>+        */</div><div class='add'>+        inode = inode_ref(at);</div><div class='add'>+    } else {</div><div class='add'>+        inode = inode_ref(subvol-&gt;itable-&gt;root);</div><div class='add'>+</div><div class='add'>+        if (strcmp(origpath, "/") == 0)</div><div class='add'>+            glfs_resolve_root(fs, subvol, inode, &amp;ciatt);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    path = gf_strdup(origpath);</div><div class='add'>+    if (!path)</div><div class='add'>+        goto invalid_fs;</div><div class='add'>+</div><div class='add'>+    for (component = strtok_r(path, "/", &amp;saveptr); component;</div><div class='add'>+         component = next_component) {</div><div class='add'>+        next_component = strtok_r(NULL, "/", &amp;saveptr);</div><div class='add'>+</div><div class='add'>+        if (parent)</div><div class='add'>+            inode_unref(parent);</div><div class='add'>+        parent = inode;</div><div class='add'>+        inode = glfs_resolve_component(fs, subvol, parent, component, &amp;ciatt,</div><div class='add'>+                                       /* force hard lookup on the last</div><div class='add'>+                                          component, as the caller</div><div class='add'>+                                          wants proper iatt filled</div><div class='add'>+                                       */</div><div class='add'>+                                       (reval || (!next_component &amp;&amp; iatt)));</div><div class='add'>+        if (!inode) {</div><div class='add'>+            ret = -1;</div><div class='add'>+            break;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        if (IA_ISLNK(ciatt.ia_type) &amp;&amp; (next_component || follow)) {</div><div class='add'>+            /* If the component is not the last piece,</div><div class='add'>+               then following it is necessary even if</div><div class='add'>+               not requested by the caller</div><div class='add'>+            */</div><div class='add'>+            char *lpath = NULL;</div><div class='add'>+            loc_t sym_loc = {</div><div class='add'>+                0,</div><div class='add'>+            };</div><div class='add'>+</div><div class='add'>+            if (follow &gt; GLFS_SYMLINK_MAX_FOLLOW) {</div><div class='add'>+                errno = ELOOP;</div><div class='add'>+                ret = -1;</div><div class='add'>+                if (inode) {</div><div class='add'>+                    inode_unref(inode);</div><div class='add'>+                    inode = NULL;</div><div class='add'>+                }</div><div class='add'>+                break;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            ret = glfs_resolve_symlink(fs, subvol, inode, &amp;lpath);</div><div class='add'>+            inode_unref(inode);</div><div class='add'>+            inode = NULL;</div><div class='add'>+            if (ret &lt; 0)</div><div class='add'>+                break;</div><div class='add'>+</div><div class='add'>+            ret = priv_glfs_resolve_at(fs, subvol, parent, lpath, &amp;sym_loc,</div><div class='add'>+                                       /* followed iatt becomes the</div><div class='add'>+                                          component iatt</div><div class='add'>+                                       */</div><div class='add'>+                                       &amp;ciatt,</div><div class='add'>+                                       /* always recurisvely follow while</div><div class='add'>+                                          following symlink</div><div class='add'>+                                       */</div><div class='add'>+                                       follow + 1, reval);</div><div class='add'>+            if (ret == 0)</div><div class='add'>+                inode = inode_ref(sym_loc.inode);</div><div class='add'>+            loc_wipe(&amp;sym_loc);</div><div class='add'>+            GF_FREE(lpath);</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        if (!next_component)</div><div class='add'>+            break;</div><div class='add'>+</div><div class='add'>+        if (!IA_ISDIR(ciatt.ia_type)) {</div><div class='add'>+            /* next_component exists and this component is</div><div class='add'>+               not a directory</div><div class='add'>+            */</div><div class='add'>+            inode_unref(inode);</div><div class='add'>+            inode = NULL;</div><div class='add'>+            ret = -1;</div><div class='add'>+            errno = ENOTDIR;</div><div class='add'>+            break;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (parent &amp;&amp; next_component)</div><div class='add'>+        /* resolution failed mid-way */</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    /* At this point, all components up to the last parent directory</div><div class='add'>+       have been resolved successfully (@parent). Resolution of basename</div><div class='add'>+       might have failed (@inode) if at all.</div><div class='add'>+    */</div><div class='add'>+</div><div class='add'>+    loc-&gt;parent = parent;</div><div class='add'>+    if (parent) {</div><div class='add'>+        gf_uuid_copy(loc-&gt;pargfid, parent-&gt;gfid);</div><div class='add'>+        loc-&gt;name = component;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    loc-&gt;inode = inode;</div><div class='add'>+    if (inode) {</div><div class='add'>+        gf_uuid_copy(loc-&gt;gfid, inode-&gt;gfid);</div><div class='add'>+        if (iatt)</div><div class='add'>+            *iatt = ciatt;</div><div class='add'>+        ret = 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (priv_glfs_loc_touchup(loc) &lt; 0) {</div><div class='add'>+        ret = -1;</div><div class='add'>+    }</div><div class='add'>+out:</div><div class='add'>+    GF_FREE(path);</div><div class='add'>+    __GLFS_EXIT_FS;</div><div class='add'>+</div><div class='add'>+    /* do NOT loc_wipe here as only last component might be missing */</div><div class='add'>+invalid_fs:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+glfs_resolve_path(struct glfs *fs, xlator_t *subvol, const char *origpath,</div><div class='add'>+                  loc_t *loc, struct iatt *iatt, int follow, int reval)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    inode_t *cwd = NULL;</div><div class='add'>+</div><div class='add'>+    if (origpath[0] == '/')</div><div class='add'>+        return priv_glfs_resolve_at(fs, subvol, NULL, origpath, loc, iatt,</div><div class='add'>+                                    follow, reval);</div><div class='add'>+</div><div class='add'>+    cwd = glfs_cwd_get(fs);</div><div class='add'>+    if (NULL == cwd) {</div><div class='add'>+        gf_smsg(subvol-&gt;name, GF_LOG_WARNING, EIO, API_MSG_GET_CWD_FAILED,</div><div class='add'>+                NULL);</div><div class='add'>+        errno = EIO;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = priv_glfs_resolve_at(fs, subvol, cwd, origpath, loc, iatt, follow,</div><div class='add'>+                               reval);</div><div class='add'>+    if (cwd)</div><div class='add'>+        inode_unref(cwd);</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+GFAPI_SYMVER_PRIVATE_DEFAULT(glfs_resolve, 3.7.0)</div><div class='add'>+int</div><div class='add'>+priv_glfs_resolve(struct glfs *fs, xlator_t *subvol, const char *origpath,</div><div class='add'>+                  loc_t *loc, struct iatt *iatt, int reval)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    ret = glfs_resolve_path(fs, subvol, origpath, loc, iatt, 1, reval);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+glfs_lresolve(struct glfs *fs, xlator_t *subvol, const char *origpath,</div><div class='add'>+              loc_t *loc, struct iatt *iatt, int reval)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    ret = glfs_resolve_path(fs, subvol, origpath, loc, iatt, 0, reval);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+glfs_migrate_fd_locks_safe(struct glfs *fs, xlator_t *oldsubvol, fd_t *oldfd,</div><div class='add'>+                           xlator_t *newsubvol, fd_t *newfd)</div><div class='add'>+{</div><div class='add'>+    dict_t *lockinfo = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    char uuid1[64];</div><div class='add'>+</div><div class='add'>+    if (!oldfd-&gt;lk_ctx || fd_lk_ctx_empty(oldfd-&gt;lk_ctx))</div><div class='add'>+        return 0;</div><div class='add'>+</div><div class='add'>+    newfd-&gt;lk_ctx = fd_lk_ctx_ref(oldfd-&gt;lk_ctx);</div><div class='add'>+</div><div class='add'>+    ret = syncop_fgetxattr(oldsubvol, oldfd, &amp;lockinfo, GF_XATTR_LOCKINFO_KEY,</div><div class='add'>+                           NULL, NULL);</div><div class='add'>+    DECODE_SYNCOP_ERR(ret);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        gf_smsg(fs-&gt;volname, GF_LOG_WARNING, errno, API_MSG_FGETXATTR_FAILED,</div><div class='add'>+                "gfid=%s", uuid_utoa_r(oldfd-&gt;inode-&gt;gfid, uuid1), "err=%s",</div><div class='add'>+                strerror(errno), "subvol=%s", graphid_str(oldsubvol), "id=%d",</div><div class='add'>+                oldsubvol-&gt;graph-&gt;id, NULL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (!dict_get(lockinfo, GF_XATTR_LOCKINFO_KEY)) {</div><div class='add'>+        gf_smsg(fs-&gt;volname, GF_LOG_WARNING, 0, API_MSG_LOCKINFO_KEY_MISSING,</div><div class='add'>+                "gfid=%s", uuid_utoa_r(oldfd-&gt;inode-&gt;gfid, uuid1), "subvol=%s",</div><div class='add'>+                graphid_str(oldsubvol), "id=%d", oldsubvol-&gt;graph-&gt;id, NULL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = syncop_fsetxattr(newsubvol, newfd, lockinfo, 0, NULL, NULL);</div><div class='add'>+    DECODE_SYNCOP_ERR(ret);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        gf_smsg(fs-&gt;volname, GF_LOG_WARNING, 0, API_MSG_FSETXATTR_FAILED,</div><div class='add'>+                "gfid=%s", uuid_utoa_r(newfd-&gt;inode-&gt;gfid, uuid1), "err=%s",</div><div class='add'>+                strerror(errno), "subvol=%s", graphid_str(newsubvol), "id=%d",</div><div class='add'>+                newsubvol-&gt;graph-&gt;id, NULL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+out:</div><div class='add'>+    if (lockinfo)</div><div class='add'>+        dict_unref(lockinfo);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+fd_t *</div><div class='add'>+glfs_migrate_fd_safe(struct glfs *fs, xlator_t *newsubvol, fd_t *oldfd)</div><div class='add'>+{</div><div class='add'>+    fd_t *newfd = NULL;</div><div class='add'>+    inode_t *oldinode = NULL;</div><div class='add'>+    inode_t *newinode = NULL;</div><div class='add'>+    xlator_t *oldsubvol = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    loc_t loc = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    char uuid1[64];</div><div class='add'>+    dict_t *xdata = NULL;</div><div class='add'>+</div><div class='add'>+    oldinode = oldfd-&gt;inode;</div><div class='add'>+    oldsubvol = oldinode-&gt;table-&gt;xl;</div><div class='add'>+</div><div class='add'>+    if (oldsubvol == newsubvol)</div><div class='add'>+        return fd_ref(oldfd);</div><div class='add'>+</div><div class='add'>+    if (!oldsubvol-&gt;switched) {</div><div class='add'>+        xdata = dict_new();</div><div class='add'>+        if (!xdata || dict_set_int8(xdata, "last-fsync", 1)) {</div><div class='add'>+            gf_smsg(fs-&gt;volname, GF_LOG_WARNING, ENOMEM, API_MSG_FSYNC_FAILED,</div><div class='add'>+                    "err=%s", "last-fsync set failed", "gfid=%s",</div><div class='add'>+                    uuid_utoa_r(oldfd-&gt;inode-&gt;gfid, uuid1), "subvol=%s",</div><div class='add'>+                    graphid_str(oldsubvol), "id=%d", oldsubvol-&gt;graph-&gt;id,</div><div class='add'>+                    NULL);</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        ret = syncop_fsync(oldsubvol, oldfd, 0, NULL, NULL, xdata, NULL);</div><div class='add'>+        DECODE_SYNCOP_ERR(ret);</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_smsg(fs-&gt;volname, GF_LOG_WARNING, errno, API_MSG_FSYNC_FAILED,</div><div class='add'>+                    "err=%s", strerror(errno), "gfid=%s",</div><div class='add'>+                    uuid_utoa_r(oldfd-&gt;inode-&gt;gfid, uuid1), "subvol=%s",</div><div class='add'>+                    graphid_str(oldsubvol), "id=%d", oldsubvol-&gt;graph-&gt;id,</div><div class='add'>+                    NULL);</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    newinode = glfs_refresh_inode_safe(newsubvol, oldinode, _gf_false);</div><div class='add'>+    if (!newinode) {</div><div class='add'>+        gf_smsg(fs-&gt;volname, GF_LOG_WARNING, errno,</div><div class='add'>+                API_MSG_INODE_REFRESH_FAILED, "gfid=%s",</div><div class='add'>+                uuid_utoa_r(oldinode-&gt;gfid, uuid1), "err=%s", strerror(errno),</div><div class='add'>+                "subvol=%s", graphid_str(newsubvol), "id=%d",</div><div class='add'>+                newsubvol-&gt;graph-&gt;id, NULL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    newfd = fd_create(newinode, getpid());</div><div class='add'>+    if (!newfd) {</div><div class='add'>+        gf_smsg(fs-&gt;volname, GF_LOG_WARNING, errno,</div><div class='add'>+                API_MSG_FDCREATE_FAILED_ON_GRAPH, "gfid=%s",</div><div class='add'>+                uuid_utoa_r(newinode-&gt;gfid, uuid1), "err=%s", strerror(errno),</div><div class='add'>+                "subvol=%s", graphid_str(newsubvol), "id=%d",</div><div class='add'>+                newsubvol-&gt;graph-&gt;id, NULL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    loc.inode = inode_ref(newinode);</div><div class='add'>+</div><div class='add'>+    ret = inode_path(oldfd-&gt;inode, NULL, (char **)&amp;loc.path);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        gf_smsg(fs-&gt;volname, GF_LOG_INFO, 0, API_MSG_INODE_PATH_FAILED, NULL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    gf_uuid_copy(loc.gfid, oldinode-&gt;gfid);</div><div class='add'>+</div><div class='add'>+    if (IA_ISDIR(oldinode-&gt;ia_type))</div><div class='add'>+        ret = syncop_opendir(newsubvol, &amp;loc, newfd, NULL, NULL);</div><div class='add'>+    else</div><div class='add'>+        ret = syncop_open(newsubvol, &amp;loc,</div><div class='add'>+                          oldfd-&gt;flags &amp; ~(O_TRUNC | O_EXCL | O_CREAT), newfd,</div><div class='add'>+                          NULL, NULL);</div><div class='add'>+    DECODE_SYNCOP_ERR(ret);</div><div class='add'>+    loc_wipe(&amp;loc);</div><div class='add'>+</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_smsg(fs-&gt;volname, GF_LOG_WARNING, errno, API_MSG_SYNCOP_OPEN_FAILED,</div><div class='add'>+                "type=%s", IA_ISDIR(oldinode-&gt;ia_type) ? "dir" : "", "gfid=%s",</div><div class='add'>+                uuid_utoa_r(newinode-&gt;gfid, uuid1), "err=%s", strerror(errno),</div><div class='add'>+                "subvol=%s", graphid_str(newsubvol), "id=%d",</div><div class='add'>+                newsubvol-&gt;graph-&gt;id, NULL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = glfs_migrate_fd_locks_safe(fs, oldsubvol, oldfd, newsubvol, newfd);</div><div class='add'>+</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_smsg(fs-&gt;volname, GF_LOG_WARNING, errno, API_MSG_LOCK_MIGRATE_FAILED,</div><div class='add'>+                "gfid=%s", uuid_utoa_r(newinode-&gt;gfid, uuid1), "err=%s",</div><div class='add'>+                strerror(errno), "subvol=%s", graphid_str(newsubvol), "id=%d",</div><div class='add'>+                newsubvol-&gt;graph-&gt;id, NULL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    newfd-&gt;flags = oldfd-&gt;flags;</div><div class='add'>+    fd_bind(newfd);</div><div class='add'>+out:</div><div class='add'>+    if (newinode)</div><div class='add'>+        inode_unref(newinode);</div><div class='add'>+</div><div class='add'>+    if (ret) {</div><div class='add'>+        fd_unref(newfd);</div><div class='add'>+        newfd = NULL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (xdata)</div><div class='add'>+        dict_unref(xdata);</div><div class='add'>+</div><div class='add'>+    return newfd;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+fd_t *</div><div class='add'>+__glfs_migrate_fd(struct glfs *fs, xlator_t *newsubvol, struct glfs_fd *glfd)</div><div class='add'>+{</div><div class='add'>+    fd_t *oldfd = NULL;</div><div class='add'>+    fd_t *newfd = NULL;</div><div class='add'>+</div><div class='add'>+    oldfd = glfd-&gt;fd;</div><div class='add'>+</div><div class='add'>+    fs-&gt;migration_in_progress = 1;</div><div class='add'>+    pthread_mutex_unlock(&amp;fs-&gt;mutex);</div><div class='add'>+    {</div><div class='add'>+        newfd = glfs_migrate_fd_safe(fs, newsubvol, oldfd);</div><div class='add'>+    }</div><div class='add'>+    pthread_mutex_lock(&amp;fs-&gt;mutex);</div><div class='add'>+    fs-&gt;migration_in_progress = 0;</div><div class='add'>+    pthread_cond_broadcast(&amp;fs-&gt;cond);</div><div class='add'>+</div><div class='add'>+    /* wake up other waiting tasks */</div><div class='add'>+    __GLFS_SYNCTASK_WAKE(fs);</div><div class='add'>+</div><div class='add'>+    return newfd;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+fd_t *</div><div class='add'>+__glfs_resolve_fd(struct glfs *fs, xlator_t *subvol, struct glfs_fd *glfd)</div><div class='add'>+{</div><div class='add'>+    fd_t *fd = NULL;</div><div class='add'>+</div><div class='add'>+    if (glfd-&gt;fd-&gt;inode-&gt;table-&gt;xl == subvol)</div><div class='add'>+        return fd_ref(glfd-&gt;fd);</div><div class='add'>+</div><div class='add'>+    fd = __glfs_migrate_fd(fs, subvol, glfd);</div><div class='add'>+    if (!fd)</div><div class='add'>+        return NULL;</div><div class='add'>+</div><div class='add'>+    if (subvol == fs-&gt;active_subvol) {</div><div class='add'>+        fd_unref(glfd-&gt;fd);</div><div class='add'>+        glfd-&gt;fd = fd_ref(fd);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return fd;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+fd_t *</div><div class='add'>+glfs_resolve_fd(struct glfs *fs, xlator_t *subvol, struct glfs_fd *glfd)</div><div class='add'>+{</div><div class='add'>+    fd_t *fd = NULL;</div><div class='add'>+</div><div class='add'>+    glfs_lock(fs, _gf_true);</div><div class='add'>+    {</div><div class='add'>+        fd = __glfs_resolve_fd(fs, subvol, glfd);</div><div class='add'>+    }</div><div class='add'>+    glfs_unlock(fs);</div><div class='add'>+</div><div class='add'>+    return fd;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+__glfs_migrate_openfds(struct glfs *fs, xlator_t *subvol)</div><div class='add'>+{</div><div class='add'>+    struct glfs_fd *glfd = NULL;</div><div class='add'>+    fd_t *fd = NULL;</div><div class='add'>+</div><div class='add'>+    list_for_each_entry(glfd, &amp;fs-&gt;openfds, openfds)</div><div class='add'>+    {</div><div class='add'>+        if (gf_uuid_is_null(glfd-&gt;fd-&gt;inode-&gt;gfid)) {</div><div class='add'>+            gf_smsg(fs-&gt;volname, GF_LOG_INFO, 0, API_MSG_OPENFD_SKIPPED,</div><div class='add'>+                    "glfd=%p", glfd, "glfd-&gt;fd=%p", glfd-&gt;fd, "subvol=%s",</div><div class='add'>+                    graphid_str(subvol), "id=%d", subvol-&gt;graph-&gt;id, NULL);</div><div class='add'>+            /* create in progress, defer */</div><div class='add'>+            continue;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        fd = __glfs_migrate_fd(fs, subvol, glfd);</div><div class='add'>+        if (fd) {</div><div class='add'>+            fd_unref(glfd-&gt;fd);</div><div class='add'>+            glfd-&gt;fd = fd;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* Note that though it appears that this function executes under fs-&gt;mutex,</div><div class='add'>+ * it is not fully executed under fs-&gt;mutex. i.e. there are functions like</div><div class='add'>+ * __glfs_first_lookup, __glfs_refresh_inode, __glfs_migrate_openfds which</div><div class='add'>+ * unlocks fs-&gt;mutex before sending any network fop, and reacquire fs-&gt;mutex</div><div class='add'>+ * once the fop is complete. Hence the variable read from fs at the start of the</div><div class='add'>+ * function need not have the same value by the end of the function.</div><div class='add'>+ */</div><div class='add'>+xlator_t *</div><div class='add'>+__glfs_active_subvol(struct glfs *fs)</div><div class='add'>+{</div><div class='add'>+    xlator_t *new_subvol = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    inode_t *new_cwd = NULL;</div><div class='add'>+</div><div class='add'>+    if (!fs-&gt;next_subvol)</div><div class='add'>+        return fs-&gt;active_subvol;</div><div class='add'>+</div><div class='add'>+    new_subvol = fs-&gt;mip_subvol = fs-&gt;next_subvol;</div><div class='add'>+    fs-&gt;next_subvol = NULL;</div><div class='add'>+</div><div class='add'>+    ret = __glfs_first_lookup(fs, new_subvol);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_smsg(fs-&gt;volname, GF_LOG_INFO, errno,</div><div class='add'>+                API_MSG_FIRST_LOOKUP_GRAPH_FAILED, "subvol=%s",</div><div class='add'>+                graphid_str(new_subvol), "id=%d", new_subvol-&gt;graph-&gt;id,</div><div class='add'>+                "err=%s", strerror(errno), NULL);</div><div class='add'>+        return NULL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (fs-&gt;cwd) {</div><div class='add'>+        new_cwd = __glfs_refresh_inode(fs, new_subvol, fs-&gt;cwd, _gf_false);</div><div class='add'>+</div><div class='add'>+        if (!new_cwd) {</div><div class='add'>+            char buf1[64];</div><div class='add'>+            gf_smsg(fs-&gt;volname, GF_LOG_INFO, errno,</div><div class='add'>+                    API_MSG_CWD_GRAPH_REF_FAILED, "buf=%s",</div><div class='add'>+                    uuid_utoa_r(fs-&gt;cwd-&gt;gfid, buf1), "subvol=%s",</div><div class='add'>+                    graphid_str(new_subvol), "id=%d", new_subvol-&gt;graph-&gt;id,</div><div class='add'>+                    "err=%s", strerror(errno), NULL);</div><div class='add'>+            return NULL;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    __glfs_migrate_openfds(fs, new_subvol);</div><div class='add'>+    /* TODO: Migrate the fds and inodes which have leases to the new graph</div><div class='add'>+     * (issue #350)*/</div><div class='add'>+</div><div class='add'>+    /* switching @active_subvol and @cwd</div><div class='add'>+       should be atomic</div><div class='add'>+    */</div><div class='add'>+    fs-&gt;old_subvol = fs-&gt;active_subvol;</div><div class='add'>+    fs-&gt;active_subvol = fs-&gt;mip_subvol;</div><div class='add'>+    fs-&gt;mip_subvol = NULL;</div><div class='add'>+</div><div class='add'>+    if (new_cwd) {</div><div class='add'>+        __glfs_cwd_set(fs, new_cwd);</div><div class='add'>+        inode_unref(new_cwd);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    gf_smsg(fs-&gt;volname, GF_LOG_INFO, 0, API_MSG_SWITCHED_GRAPH, "subvol=%s",</div><div class='add'>+            graphid_str(new_subvol), "id=%d", new_subvol-&gt;graph-&gt;id, NULL);</div><div class='add'>+</div><div class='add'>+    return new_subvol;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+GFAPI_SYMVER_PRIVATE_DEFAULT(glfs_subvol_done, 3.4.0)</div><div class='add'>+void</div><div class='add'>+priv_glfs_subvol_done(struct glfs *fs, xlator_t *subvol)</div><div class='add'>+{</div><div class='add'>+    int ref = 0;</div><div class='add'>+    xlator_t *active_subvol = NULL;</div><div class='add'>+</div><div class='add'>+    if (!subvol)</div><div class='add'>+        return;</div><div class='add'>+</div><div class='add'>+    /* For decrementing subvol-&gt;wind ref count we need not check/wait for</div><div class='add'>+     * migration-in-progress flag.</div><div class='add'>+     * Also glfs_subvol_done is called in call-back path therefore waiting</div><div class='add'>+     * for migration-in-progress flag can lead to dead-lock.</div><div class='add'>+     */</div><div class='add'>+    glfs_lock(fs, _gf_false);</div><div class='add'>+    {</div><div class='add'>+        ref = (--subvol-&gt;winds);</div><div class='add'>+        active_subvol = fs-&gt;active_subvol;</div><div class='add'>+    }</div><div class='add'>+    glfs_unlock(fs);</div><div class='add'>+</div><div class='add'>+    if (ref == 0) {</div><div class='add'>+        assert(subvol != active_subvol);</div><div class='add'>+        xlator_notify(subvol, GF_EVENT_PARENT_DOWN, subvol, NULL);</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+GFAPI_SYMVER_PRIVATE_DEFAULT(glfs_active_subvol, 3.4.0)</div><div class='add'>+xlator_t *</div><div class='add'>+priv_glfs_active_subvol(struct glfs *fs)</div><div class='add'>+{</div><div class='add'>+    xlator_t *subvol = NULL;</div><div class='add'>+    xlator_t *old_subvol = NULL;</div><div class='add'>+</div><div class='add'>+    glfs_lock(fs, _gf_true);</div><div class='add'>+    {</div><div class='add'>+        subvol = __glfs_active_subvol(fs);</div><div class='add'>+</div><div class='add'>+        if (subvol)</div><div class='add'>+            subvol-&gt;winds++;</div><div class='add'>+</div><div class='add'>+        if (fs-&gt;old_subvol) {</div><div class='add'>+            old_subvol = fs-&gt;old_subvol;</div><div class='add'>+            fs-&gt;old_subvol = NULL;</div><div class='add'>+            old_subvol-&gt;switched = 1;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    glfs_unlock(fs);</div><div class='add'>+</div><div class='add'>+    if (old_subvol)</div><div class='add'>+        priv_glfs_subvol_done(fs, old_subvol);</div><div class='add'>+</div><div class='add'>+    return subvol;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+__glfs_cwd_set(struct glfs *fs, inode_t *inode)</div><div class='add'>+{</div><div class='add'>+    if (inode-&gt;table-&gt;xl != fs-&gt;active_subvol) {</div><div class='add'>+        inode = __glfs_refresh_inode(fs, fs-&gt;active_subvol, inode, _gf_false);</div><div class='add'>+        if (!inode)</div><div class='add'>+            return -1;</div><div class='add'>+    } else {</div><div class='add'>+        inode_ref(inode);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (fs-&gt;cwd)</div><div class='add'>+        inode_unref(fs-&gt;cwd);</div><div class='add'>+</div><div class='add'>+    fs-&gt;cwd = inode;</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+glfs_cwd_set(struct glfs *fs, inode_t *inode)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    glfs_lock(fs, _gf_true);</div><div class='add'>+    {</div><div class='add'>+        ret = __glfs_cwd_set(fs, inode);</div><div class='add'>+    }</div><div class='add'>+    glfs_unlock(fs);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+inode_t *</div><div class='add'>+__glfs_cwd_get(struct glfs *fs)</div><div class='add'>+{</div><div class='add'>+    inode_t *cwd = NULL;</div><div class='add'>+</div><div class='add'>+    if (!fs-&gt;cwd)</div><div class='add'>+        return NULL;</div><div class='add'>+</div><div class='add'>+    if (fs-&gt;cwd-&gt;table-&gt;xl == fs-&gt;active_subvol) {</div><div class='add'>+        cwd = inode_ref(fs-&gt;cwd);</div><div class='add'>+        return cwd;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    cwd = __glfs_refresh_inode(fs, fs-&gt;active_subvol, fs-&gt;cwd, _gf_false);</div><div class='add'>+</div><div class='add'>+    return cwd;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+inode_t *</div><div class='add'>+glfs_cwd_get(struct glfs *fs)</div><div class='add'>+{</div><div class='add'>+    inode_t *cwd = NULL;</div><div class='add'>+</div><div class='add'>+    glfs_lock(fs, _gf_true);</div><div class='add'>+    {</div><div class='add'>+        cwd = __glfs_cwd_get(fs);</div><div class='add'>+    }</div><div class='add'>+    glfs_unlock(fs);</div><div class='add'>+</div><div class='add'>+    return cwd;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+inode_t *</div><div class='add'>+__glfs_resolve_inode(struct glfs *fs, xlator_t *subvol,</div><div class='add'>+                     struct glfs_object *object)</div><div class='add'>+{</div><div class='add'>+    inode_t *inode = NULL;</div><div class='add'>+    gf_boolean_t lookup_needed = _gf_false;</div><div class='add'>+</div><div class='add'>+    lookup_needed = inode_needs_lookup(object-&gt;inode, THIS);</div><div class='add'>+</div><div class='add'>+    if (!lookup_needed &amp;&amp; object-&gt;inode-&gt;table-&gt;xl == subvol)</div><div class='add'>+        return inode_ref(object-&gt;inode);</div><div class='add'>+</div><div class='add'>+    inode = __glfs_refresh_inode(fs, fs-&gt;active_subvol, object-&gt;inode,</div><div class='add'>+                                 lookup_needed);</div><div class='add'>+    if (!inode)</div><div class='add'>+        return NULL;</div><div class='add'>+</div><div class='add'>+    if (subvol == fs-&gt;active_subvol) {</div><div class='add'>+        inode_unref(object-&gt;inode);</div><div class='add'>+        object-&gt;inode = inode_ref(inode);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return inode;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+inode_t *</div><div class='add'>+glfs_resolve_inode(struct glfs *fs, xlator_t *subvol,</div><div class='add'>+                   struct glfs_object *object)</div><div class='add'>+{</div><div class='add'>+    inode_t *inode = NULL;</div><div class='add'>+</div><div class='add'>+    glfs_lock(fs, _gf_true);</div><div class='add'>+    {</div><div class='add'>+        inode = __glfs_resolve_inode(fs, subvol, object);</div><div class='add'>+    }</div><div class='add'>+    glfs_unlock(fs);</div><div class='add'>+</div><div class='add'>+    return inode;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+glfs_create_object(loc_t *loc, struct glfs_object **retobject)</div><div class='add'>+{</div><div class='add'>+    struct glfs_object *object = NULL;</div><div class='add'>+</div><div class='add'>+    object = GF_CALLOC(1, sizeof(struct glfs_object), glfs_mt_glfs_object_t);</div><div class='add'>+    if (object == NULL) {</div><div class='add'>+        errno = ENOMEM;</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    object-&gt;inode = loc-&gt;inode;</div><div class='add'>+    gf_uuid_copy(object-&gt;gfid, object-&gt;inode-&gt;gfid);</div><div class='add'>+</div><div class='add'>+    /* we hold the reference */</div><div class='add'>+    loc-&gt;inode = NULL;</div><div class='add'>+</div><div class='add'>+    *retobject = object;</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+struct glfs_object *</div><div class='add'>+glfs_h_resolve_symlink(struct glfs *fs, struct glfs_object *object)</div><div class='add'>+{</div><div class='add'>+    xlator_t *subvol = NULL;</div><div class='add'>+    loc_t sym_loc = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    struct iatt iatt = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    char *lpath = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    struct glfs_object *target_object = NULL;</div><div class='add'>+</div><div class='add'>+    subvol = glfs_active_subvol(fs);</div><div class='add'>+    if (!subvol) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        errno = EIO;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = glfs_resolve_symlink(fs, subvol, object-&gt;inode, &amp;lpath);</div><div class='add'>+    if (ret &lt; 0)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    ret = glfs_resolve_at(fs, subvol, NULL, lpath, &amp;sym_loc, &amp;iatt,</div><div class='add'>+                          /* always recurisvely follow while</div><div class='add'>+                            following symlink</div><div class='add'>+                          */</div><div class='add'>+                          1, 0);</div><div class='add'>+    if (ret == 0)</div><div class='add'>+        ret = glfs_create_object(&amp;sym_loc, &amp;target_object);</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    loc_wipe(&amp;sym_loc);</div><div class='add'>+    GF_FREE(lpath);</div><div class='add'>+    return target_object;</div><div class='add'>+}</div><div class='head'>diff --git a/api/src/glfs.c b/api/src/glfs.c<br/>new file mode 100644<br/>index 00000000000..b4bf1423f6d<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/api/src/glfs.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>api/src/glfs.c</a></div><div class='hunk'>@@ -0,0 +1,1806 @@</div><div class='add'>+/*</div><div class='add'>+  Copyright (c) 2012-2018 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+  TODO:</div><div class='add'>+  - set proper pid/lk_owner to call frames (currently buried in syncop)</div><div class='add'>+  - fix logging.c/h to store logfp and loglevel in glusterfs_ctx_t and</div><div class='add'>+    reach it via THIS.</div><div class='add'>+  - update syncop functions to accept/return xdata. ???</div><div class='add'>+  - protocol/client to reconnect immediately after portmap disconnect.</div><div class='add'>+  - handle SEEK_END failure in _lseek()</div><div class='add'>+  - handle umask (per filesystem?)</div><div class='add'>+  - make itables LRU based</div><div class='add'>+  - 0-copy for readv/writev</div><div class='add'>+  - reconcile the open/creat mess</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#include &lt;unistd.h&gt;</div><div class='add'>+#include &lt;string.h&gt;</div><div class='add'>+#include &lt;stdlib.h&gt;</div><div class='add'>+#include &lt;stdio.h&gt;</div><div class='add'>+#include &lt;inttypes.h&gt;</div><div class='add'>+#include &lt;sys/types.h&gt;</div><div class='add'>+#include &lt;unistd.h&gt;</div><div class='add'>+#include &lt;limits.h&gt;</div><div class='add'>+#ifdef GF_LINUX_HOST_OS</div><div class='add'>+#include &lt;sys/prctl.h&gt;</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#include &lt;glusterfs/glusterfs.h&gt;</div><div class='add'>+#include &lt;glusterfs/logging.h&gt;</div><div class='add'>+#include &lt;glusterfs/stack.h&gt;</div><div class='add'>+#include &lt;glusterfs/gf-event.h&gt;</div><div class='add'>+#include "glfs-mem-types.h"</div><div class='add'>+#include &lt;glusterfs/common-utils.h&gt;</div><div class='add'>+#include &lt;glusterfs/syncop.h&gt;</div><div class='add'>+#include &lt;glusterfs/call-stub.h&gt;</div><div class='add'>+#include &lt;glusterfs/hashfn.h&gt;</div><div class='add'>+#include "rpc-clnt.h"</div><div class='add'>+#include &lt;glusterfs/statedump.h&gt;</div><div class='add'>+#include &lt;glusterfs/syscall.h&gt;</div><div class='add'>+</div><div class='add'>+#include "gfapi-messages.h"</div><div class='add'>+#include "glfs.h"</div><div class='add'>+#include "glfs-internal.h"</div><div class='add'>+</div><div class='add'>+static gf_boolean_t</div><div class='add'>+vol_assigned(cmd_args_t *args)</div><div class='add'>+{</div><div class='add'>+    return args-&gt;volfile || args-&gt;volfile_server;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+glusterfs_ctx_defaults_init(glusterfs_ctx_t *ctx)</div><div class='add'>+{</div><div class='add'>+    call_pool_t *pool = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    if (!ctx) {</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = xlator_mem_acct_init(THIS, glfs_mt_end + 1);</div><div class='add'>+    if (ret != 0) {</div><div class='add'>+        gf_smsg(THIS-&gt;name, GF_LOG_ERROR, ENOMEM, API_MSG_MEM_ACCT_INIT_FAILED,</div><div class='add'>+                NULL);</div><div class='add'>+        return ret;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* reset ret to -1 so that we don't need to explicitly</div><div class='add'>+     * set it in all error paths before "goto err"</div><div class='add'>+     */</div><div class='add'>+</div><div class='add'>+    ret = -1;</div><div class='add'>+</div><div class='add'>+    ctx-&gt;process_uuid = generate_glusterfs_ctx_id();</div><div class='add'>+    if (!ctx-&gt;process_uuid) {</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ctx-&gt;page_size = 128 * GF_UNIT_KB;</div><div class='add'>+</div><div class='add'>+    ctx-&gt;iobuf_pool = iobuf_pool_new();</div><div class='add'>+    if (!ctx-&gt;iobuf_pool) {</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ctx-&gt;event_pool = gf_event_pool_new(DEFAULT_EVENT_POOL_SIZE,</div><div class='add'>+                                        STARTING_EVENT_THREADS);</div><div class='add'>+    if (!ctx-&gt;event_pool) {</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ctx-&gt;env = syncenv_new(0, 0, 0);</div><div class='add'>+    if (!ctx-&gt;env) {</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    pool = GF_CALLOC(1, sizeof(call_pool_t), glfs_mt_call_pool_t);</div><div class='add'>+    if (!pool) {</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* frame_mem_pool size 112 * 4k */</div><div class='add'>+    pool-&gt;frame_mem_pool = mem_pool_new(call_frame_t, 4096);</div><div class='add'>+    if (!pool-&gt;frame_mem_pool) {</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+    /* stack_mem_pool size 256 * 1024 */</div><div class='add'>+    pool-&gt;stack_mem_pool = mem_pool_new(call_stack_t, 1024);</div><div class='add'>+    if (!pool-&gt;stack_mem_pool) {</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ctx-&gt;stub_mem_pool = mem_pool_new(call_stub_t, 1024);</div><div class='add'>+    if (!ctx-&gt;stub_mem_pool) {</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ctx-&gt;dict_pool = mem_pool_new(dict_t, GF_MEMPOOL_COUNT_OF_DICT_T);</div><div class='add'>+    if (!ctx-&gt;dict_pool)</div><div class='add'>+        goto err;</div><div class='add'>+</div><div class='add'>+    ctx-&gt;dict_pair_pool = mem_pool_new(data_pair_t,</div><div class='add'>+                                       GF_MEMPOOL_COUNT_OF_DATA_PAIR_T);</div><div class='add'>+    if (!ctx-&gt;dict_pair_pool)</div><div class='add'>+        goto err;</div><div class='add'>+</div><div class='add'>+    ctx-&gt;dict_data_pool = mem_pool_new(data_t, GF_MEMPOOL_COUNT_OF_DATA_T);</div><div class='add'>+    if (!ctx-&gt;dict_data_pool)</div><div class='add'>+        goto err;</div><div class='add'>+</div><div class='add'>+    ctx-&gt;logbuf_pool = mem_pool_new(log_buf_t, GF_MEMPOOL_COUNT_OF_LRU_BUF_T);</div><div class='add'>+    if (!ctx-&gt;logbuf_pool)</div><div class='add'>+        goto err;</div><div class='add'>+</div><div class='add'>+    INIT_LIST_HEAD(&amp;pool-&gt;all_frames);</div><div class='add'>+    INIT_LIST_HEAD(&amp;ctx-&gt;cmd_args.xlator_options);</div><div class='add'>+    INIT_LIST_HEAD(&amp;ctx-&gt;cmd_args.volfile_servers);</div><div class='add'>+</div><div class='add'>+    LOCK_INIT(&amp;pool-&gt;lock);</div><div class='add'>+    ctx-&gt;pool = pool;</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+err:</div><div class='add'>+    if (ret &amp;&amp; pool) {</div><div class='add'>+        if (pool-&gt;frame_mem_pool)</div><div class='add'>+            mem_pool_destroy(pool-&gt;frame_mem_pool);</div><div class='add'>+        if (pool-&gt;stack_mem_pool)</div><div class='add'>+            mem_pool_destroy(pool-&gt;stack_mem_pool);</div><div class='add'>+        GF_FREE(pool);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (ret &amp;&amp; ctx) {</div><div class='add'>+        if (ctx-&gt;stub_mem_pool)</div><div class='add'>+            mem_pool_destroy(ctx-&gt;stub_mem_pool);</div><div class='add'>+        if (ctx-&gt;dict_pool)</div><div class='add'>+            mem_pool_destroy(ctx-&gt;dict_pool);</div><div class='add'>+        if (ctx-&gt;dict_data_pool)</div><div class='add'>+            mem_pool_destroy(ctx-&gt;dict_data_pool);</div><div class='add'>+        if (ctx-&gt;dict_pair_pool)</div><div class='add'>+            mem_pool_destroy(ctx-&gt;dict_pair_pool);</div><div class='add'>+        if (ctx-&gt;logbuf_pool)</div><div class='add'>+            mem_pool_destroy(ctx-&gt;logbuf_pool);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+create_master(struct glfs *fs)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+    xlator_t *master = NULL;</div><div class='add'>+</div><div class='add'>+    master = GF_CALLOC(1, sizeof(*master), glfs_mt_xlator_t);</div><div class='add'>+    if (!master)</div><div class='add'>+        goto err;</div><div class='add'>+</div><div class='add'>+    master-&gt;name = gf_strdup("gfapi");</div><div class='add'>+    if (!master-&gt;name)</div><div class='add'>+        goto err;</div><div class='add'>+</div><div class='add'>+    if (xlator_set_type(master, "mount/api") == -1) {</div><div class='add'>+        gf_smsg("glfs", GF_LOG_ERROR, 0, API_MSG_MASTER_XLATOR_INIT_FAILED,</div><div class='add'>+                "name=%s", fs-&gt;volname, NULL);</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    master-&gt;ctx = fs-&gt;ctx;</div><div class='add'>+    master-&gt;private = fs;</div><div class='add'>+    master-&gt;options = dict_new();</div><div class='add'>+    if (!master-&gt;options)</div><div class='add'>+        goto err;</div><div class='add'>+</div><div class='add'>+    ret = xlator_init(master);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_smsg("glfs", GF_LOG_ERROR, 0, API_MSG_GFAPI_XLATOR_INIT_FAILED,</div><div class='add'>+                NULL);</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    fs-&gt;ctx-&gt;master = master;</div><div class='add'>+    THIS = master;</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+</div><div class='add'>+err:</div><div class='add'>+    if (master) {</div><div class='add'>+        xlator_destroy(master);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return -1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static FILE *</div><div class='add'>+get_volfp(struct glfs *fs)</div><div class='add'>+{</div><div class='add'>+    cmd_args_t *cmd_args = NULL;</div><div class='add'>+    FILE *specfp = NULL;</div><div class='add'>+</div><div class='add'>+    cmd_args = &amp;fs-&gt;ctx-&gt;cmd_args;</div><div class='add'>+</div><div class='add'>+    if ((specfp = fopen(cmd_args-&gt;volfile, "r")) == NULL) {</div><div class='add'>+        gf_smsg("glfs", GF_LOG_ERROR, errno, API_MSG_VOLFILE_OPEN_FAILED,</div><div class='add'>+                "file=%s", cmd_args-&gt;volfile, "err=%s", strerror(errno), NULL);</div><div class='add'>+        return NULL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    gf_msg_debug("glfs", 0, "loading volume file %s", cmd_args-&gt;volfile);</div><div class='add'>+</div><div class='add'>+    return specfp;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+glfs_volumes_init(struct glfs *fs)</div><div class='add'>+{</div><div class='add'>+    FILE *fp = NULL;</div><div class='add'>+    cmd_args_t *cmd_args = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    cmd_args = &amp;fs-&gt;ctx-&gt;cmd_args;</div><div class='add'>+</div><div class='add'>+    if (!vol_assigned(cmd_args))</div><div class='add'>+        return -1;</div><div class='add'>+</div><div class='add'>+    if (sys_access(SECURE_ACCESS_FILE, F_OK) == 0) {</div><div class='add'>+        fs-&gt;ctx-&gt;secure_mgmt = 1;</div><div class='add'>+        fs-&gt;ctx-&gt;ssl_cert_depth = glusterfs_read_secure_access_file();</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (cmd_args-&gt;volfile_server) {</div><div class='add'>+        ret = glfs_mgmt_init(fs);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    fp = get_volfp(fs);</div><div class='add'>+</div><div class='add'>+    if (!fp) {</div><div class='add'>+        gf_smsg("glfs", GF_LOG_ERROR, ENOENT, API_MSG_VOL_SPEC_FILE_ERROR,</div><div class='add'>+                NULL);</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = glfs_process_volfp(fs, fp);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+///////////////////////////////////////////////////////////////////////////////</div><div class='add'>+</div><div class='add'>+GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_set_xlator_option, 3.4.0)</div><div class='add'>+int</div><div class='add'>+pub_glfs_set_xlator_option(struct glfs *fs, const char *xlator, const char *key,</div><div class='add'>+                           const char *value)</div><div class='add'>+{</div><div class='add'>+    xlator_cmdline_option_t *option = NULL;</div><div class='add'>+</div><div class='add'>+    DECLARE_OLD_THIS;</div><div class='add'>+    __GLFS_ENTRY_VALIDATE_FS(fs, invalid_fs);</div><div class='add'>+</div><div class='add'>+    option = GF_CALLOC(1, sizeof(*option), glfs_mt_xlator_cmdline_option_t);</div><div class='add'>+    if (!option)</div><div class='add'>+        goto enomem;</div><div class='add'>+</div><div class='add'>+    INIT_LIST_HEAD(&amp;option-&gt;cmd_args);</div><div class='add'>+</div><div class='add'>+    option-&gt;volume = gf_strdup(xlator);</div><div class='add'>+    if (!option-&gt;volume)</div><div class='add'>+        goto enomem;</div><div class='add'>+    option-&gt;key = gf_strdup(key);</div><div class='add'>+    if (!option-&gt;key)</div><div class='add'>+        goto enomem;</div><div class='add'>+    option-&gt;value = gf_strdup(value);</div><div class='add'>+    if (!option-&gt;value)</div><div class='add'>+        goto enomem;</div><div class='add'>+</div><div class='add'>+    list_add(&amp;option-&gt;cmd_args, &amp;fs-&gt;ctx-&gt;cmd_args.xlator_options);</div><div class='add'>+</div><div class='add'>+    __GLFS_EXIT_FS;</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+enomem:</div><div class='add'>+    errno = ENOMEM;</div><div class='add'>+</div><div class='add'>+    if (!option) {</div><div class='add'>+        __GLFS_EXIT_FS;</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    GF_FREE(option-&gt;volume);</div><div class='add'>+    GF_FREE(option-&gt;key);</div><div class='add'>+    GF_FREE(option-&gt;value);</div><div class='add'>+    GF_FREE(option);</div><div class='add'>+</div><div class='add'>+    __GLFS_EXIT_FS;</div><div class='add'>+</div><div class='add'>+invalid_fs:</div><div class='add'>+    return -1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_unset_volfile_server, 3.5.1)</div><div class='add'>+int</div><div class='add'>+pub_glfs_unset_volfile_server(struct glfs *fs, const char *transport,</div><div class='add'>+                              const char *host, const int port)</div><div class='add'>+{</div><div class='add'>+    cmd_args_t *cmd_args = NULL;</div><div class='add'>+    server_cmdline_t *server = NULL;</div><div class='add'>+    server_cmdline_t *tmp = NULL;</div><div class='add'>+    char *transport_val = NULL;</div><div class='add'>+    int port_val = 0;</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    if (!fs || !host) {</div><div class='add'>+        errno = EINVAL;</div><div class='add'>+        return ret;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    DECLARE_OLD_THIS;</div><div class='add'>+    __GLFS_ENTRY_VALIDATE_FS(fs, invalid_fs);</div><div class='add'>+</div><div class='add'>+    cmd_args = &amp;fs-&gt;ctx-&gt;cmd_args;</div><div class='add'>+</div><div class='add'>+    if (transport) {</div><div class='add'>+        transport_val = gf_strdup(transport);</div><div class='add'>+    } else {</div><div class='add'>+        transport_val = gf_strdup(GF_DEFAULT_VOLFILE_TRANSPORT);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (!transport_val) {</div><div class='add'>+        errno = ENOMEM;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (port) {</div><div class='add'>+        port_val = port;</div><div class='add'>+    } else {</div><div class='add'>+        port_val = GF_DEFAULT_BASE_PORT;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    list_for_each_entry_safe(server, tmp, &amp;cmd_args-&gt;curr_server-&gt;list, list)</div><div class='add'>+    {</div><div class='add'>+        if (!server-&gt;volfile_server || !server-&gt;transport)</div><div class='add'>+            continue;</div><div class='add'>+        if ((!strcmp(server-&gt;volfile_server, host) &amp;&amp;</div><div class='add'>+             !strcmp(server-&gt;transport, transport_val) &amp;&amp;</div><div class='add'>+             (server-&gt;port == port_val))) {</div><div class='add'>+            list_del(&amp;server-&gt;list);</div><div class='add'>+            ret = 0;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    GF_FREE(transport_val);</div><div class='add'>+    __GLFS_EXIT_FS;</div><div class='add'>+</div><div class='add'>+invalid_fs:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_set_volfile_server, 3.4.0)</div><div class='add'>+int</div><div class='add'>+pub_glfs_set_volfile_server(struct glfs *fs, const char *transport,</div><div class='add'>+                            const char *host, int port)</div><div class='add'>+{</div><div class='add'>+    cmd_args_t *cmd_args = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    char *server_host = NULL;</div><div class='add'>+    char *server_transport = NULL;</div><div class='add'>+</div><div class='add'>+    if (!fs || !host) {</div><div class='add'>+        errno = EINVAL;</div><div class='add'>+        return ret;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    DECLARE_OLD_THIS;</div><div class='add'>+    __GLFS_ENTRY_VALIDATE_FS(fs, invalid_fs);</div><div class='add'>+</div><div class='add'>+    cmd_args = &amp;fs-&gt;ctx-&gt;cmd_args;</div><div class='add'>+    cmd_args-&gt;max_connect_attempts = 1;</div><div class='add'>+</div><div class='add'>+    server_host = gf_strdup(host);</div><div class='add'>+    if (!server_host) {</div><div class='add'>+        errno = ENOMEM;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (transport) {</div><div class='add'>+        /* volfile fetch support over tcp|unix only */</div><div class='add'>+        if (!strcmp(transport, "tcp") || !strcmp(transport, "unix")) {</div><div class='add'>+            server_transport = gf_strdup(transport);</div><div class='add'>+        } else if (!strcmp(transport, "rdma")) {</div><div class='add'>+            server_transport = gf_strdup(GF_DEFAULT_VOLFILE_TRANSPORT);</div><div class='add'>+            gf_smsg("glfs", GF_LOG_WARNING, EINVAL, API_MSG_TRANS_RDMA_DEP,</div><div class='add'>+                    NULL);</div><div class='add'>+        } else {</div><div class='add'>+            gf_smsg("glfs", GF_LOG_TRACE, EINVAL, API_MSG_TRANS_NOT_SUPPORTED,</div><div class='add'>+                    "transport=%s", transport, NULL);</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    } else {</div><div class='add'>+        server_transport = gf_strdup(GF_DEFAULT_VOLFILE_TRANSPORT);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (!server_transport) {</div><div class='add'>+        errno = ENOMEM;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (!port) {</div><div class='add'>+        port = GF_DEFAULT_BASE_PORT;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (!strcmp(server_transport, "unix")) {</div><div class='add'>+        port = 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = gf_set_volfile_server_common(cmd_args, server_host, server_transport,</div><div class='add'>+                                       port);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log("glfs", GF_LOG_ERROR, "failed to set volfile server: %s",</div><div class='add'>+               strerror(errno));</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (server_host) {</div><div class='add'>+        GF_FREE(server_host);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (server_transport) {</div><div class='add'>+        GF_FREE(server_transport);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    __GLFS_EXIT_FS;</div><div class='add'>+</div><div class='add'>+invalid_fs:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* *</div><div class='add'>+ * Used to free the arguments allocated by glfs_set_volfile_server()</div><div class='add'>+ */</div><div class='add'>+static void</div><div class='add'>+glfs_free_volfile_servers(cmd_args_t *cmd_args)</div><div class='add'>+{</div><div class='add'>+    server_cmdline_t *server = NULL;</div><div class='add'>+    server_cmdline_t *tmp = NULL;</div><div class='add'>+</div><div class='add'>+    GF_VALIDATE_OR_GOTO(THIS-&gt;name, cmd_args, out);</div><div class='add'>+</div><div class='add'>+    list_for_each_entry_safe(server, tmp, &amp;cmd_args-&gt;volfile_servers, list)</div><div class='add'>+    {</div><div class='add'>+        list_del_init(&amp;server-&gt;list);</div><div class='add'>+        GF_FREE(server-&gt;volfile_server);</div><div class='add'>+        GF_FREE(server-&gt;transport);</div><div class='add'>+        GF_FREE(server);</div><div class='add'>+    }</div><div class='add'>+    cmd_args-&gt;curr_server = NULL;</div><div class='add'>+out:</div><div class='add'>+    return;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+glfs_free_xlator_options(cmd_args_t *cmd_args)</div><div class='add'>+{</div><div class='add'>+    xlator_cmdline_option_t *xo = NULL;</div><div class='add'>+    xlator_cmdline_option_t *tmp_xo = NULL;</div><div class='add'>+</div><div class='add'>+    if (!&amp;(cmd_args-&gt;xlator_options))</div><div class='add'>+        return;</div><div class='add'>+</div><div class='add'>+    list_for_each_entry_safe(xo, tmp_xo, &amp;cmd_args-&gt;xlator_options, cmd_args)</div><div class='add'>+    {</div><div class='add'>+        list_del_init(&amp;xo-&gt;cmd_args);</div><div class='add'>+        GF_FREE(xo-&gt;volume);</div><div class='add'>+        GF_FREE(xo-&gt;key);</div><div class='add'>+        GF_FREE(xo-&gt;value);</div><div class='add'>+        GF_FREE(xo);</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_setfsuid, 3.4.2)</div><div class='add'>+int</div><div class='add'>+pub_glfs_setfsuid(uid_t fsuid)</div><div class='add'>+{</div><div class='add'>+    /* TODO:</div><div class='add'>+     * - Set the THIS and restore it appropriately</div><div class='add'>+     */</div><div class='add'>+    return syncopctx_setfsuid(&amp;fsuid);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_setfsgid, 3.4.2)</div><div class='add'>+int</div><div class='add'>+pub_glfs_setfsgid(gid_t fsgid)</div><div class='add'>+{</div><div class='add'>+    /* TODO:</div><div class='add'>+     * - Set the THIS and restore it appropriately</div><div class='add'>+     */</div><div class='add'>+    return syncopctx_setfsgid(&amp;fsgid);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_setfsgroups, 3.4.2)</div><div class='add'>+int</div><div class='add'>+pub_glfs_setfsgroups(size_t size, const gid_t *list)</div><div class='add'>+{</div><div class='add'>+    /* TODO:</div><div class='add'>+     * - Set the THIS and restore it appropriately</div><div class='add'>+     */</div><div class='add'>+    return syncopctx_setfsgroups(size, list);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_setfsleaseid, 4.0.0)</div><div class='add'>+int</div><div class='add'>+pub_glfs_setfsleaseid(glfs_leaseid_t leaseid)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    char *gleaseid = NULL;</div><div class='add'>+</div><div class='add'>+    gleaseid = gf_leaseid_get();</div><div class='add'>+    if (gleaseid) {</div><div class='add'>+        if (leaseid)</div><div class='add'>+            memcpy(gleaseid, leaseid, LEASE_ID_SIZE);</div><div class='add'>+        else /* reset leaseid */</div><div class='add'>+            memset(gleaseid, 0, LEASE_ID_SIZE);</div><div class='add'>+        ret = 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (ret)</div><div class='add'>+        gf_log("glfs", GF_LOG_ERROR, "failed to set leaseid: %s",</div><div class='add'>+               strerror(errno));</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+get_fop_attr_glfd(dict_t **fop_attr, struct glfs_fd *glfd)</div><div class='add'>+{</div><div class='add'>+    char *leaseid = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    gf_boolean_t dict_create = _gf_false;</div><div class='add'>+</div><div class='add'>+    leaseid = GF_MALLOC(LEASE_ID_SIZE, gf_common_mt_char);</div><div class='add'>+    GF_CHECK_ALLOC_AND_LOG("gfapi", leaseid, ret, "lease id alloc failed", out);</div><div class='add'>+    memcpy(leaseid, glfd-&gt;lease_id, LEASE_ID_SIZE);</div><div class='add'>+    if (*fop_attr == NULL) {</div><div class='add'>+        *fop_attr = dict_new();</div><div class='add'>+        dict_create = _gf_true;</div><div class='add'>+    }</div><div class='add'>+    GF_CHECK_ALLOC_AND_LOG("gfapi", *fop_attr, ret, "dict_new failed", out);</div><div class='add'>+    ret = dict_set_bin(*fop_attr, "lease-id", leaseid, LEASE_ID_SIZE);</div><div class='add'>+out:</div><div class='add'>+    if (ret) {</div><div class='add'>+        GF_FREE(leaseid);</div><div class='add'>+        if (dict_create) {</div><div class='add'>+            if (*fop_attr)</div><div class='add'>+                dict_unref(*fop_attr);</div><div class='add'>+            *fop_attr = NULL;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+set_fop_attr_glfd(struct glfs_fd *glfd)</div><div class='add'>+{</div><div class='add'>+    char *lease_id = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    lease_id = gf_existing_leaseid();</div><div class='add'>+    if (lease_id) {</div><div class='add'>+        memcpy(glfd-&gt;lease_id, lease_id, LEASE_ID_SIZE);</div><div class='add'>+        ret = 0;</div><div class='add'>+    }</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+get_fop_attr_thrd_key(dict_t **fop_attr)</div><div class='add'>+{</div><div class='add'>+    char *existing_leaseid = NULL, *leaseid = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    gf_boolean_t dict_create = _gf_false;</div><div class='add'>+</div><div class='add'>+    existing_leaseid = gf_existing_leaseid();</div><div class='add'>+    if (existing_leaseid) {</div><div class='add'>+        leaseid = GF_MALLOC(LEASE_ID_SIZE, gf_common_mt_char);</div><div class='add'>+        GF_CHECK_ALLOC_AND_LOG("gfapi", leaseid, ret, "lease id alloc failed",</div><div class='add'>+                               out);</div><div class='add'>+        memcpy(leaseid, existing_leaseid, LEASE_ID_SIZE);</div><div class='add'>+        if (*fop_attr == NULL) {</div><div class='add'>+            *fop_attr = dict_new();</div><div class='add'>+            dict_create = _gf_true;</div><div class='add'>+        }</div><div class='add'>+        GF_CHECK_ALLOC_AND_LOG("gfapi", *fop_attr, ret, "dict_new failed", out);</div><div class='add'>+        ret = dict_set_bin(*fop_attr, "lease-id", leaseid, LEASE_ID_SIZE);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (ret) {</div><div class='add'>+        GF_FREE(leaseid);</div><div class='add'>+        if (dict_create) {</div><div class='add'>+            if (*fop_attr)</div><div class='add'>+                dict_unref(*fop_attr);</div><div class='add'>+            *fop_attr = NULL;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+unset_fop_attr(dict_t **fop_attr)</div><div class='add'>+{</div><div class='add'>+    char *lease_id = NULL;</div><div class='add'>+    lease_id = gf_existing_leaseid();</div><div class='add'>+    if (lease_id)</div><div class='add'>+        memset(lease_id, 0, LEASE_ID_SIZE);</div><div class='add'>+    if (*fop_attr) {</div><div class='add'>+        dict_unref(*fop_attr);</div><div class='add'>+        *fop_attr = NULL;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_from_glfd, 3.4.0)</div><div class='add'>+struct glfs *</div><div class='add'>+pub_glfs_from_glfd(struct glfs_fd *glfd)</div><div class='add'>+{</div><div class='add'>+    if (glfd == NULL) {</div><div class='add'>+        errno = EBADF;</div><div class='add'>+        return NULL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return glfd-&gt;fs;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+glfs_fd_destroy(struct glfs_fd *glfd)</div><div class='add'>+{</div><div class='add'>+    if (!glfd)</div><div class='add'>+        return;</div><div class='add'>+</div><div class='add'>+    glfs_lock(glfd-&gt;fs, _gf_true);</div><div class='add'>+    {</div><div class='add'>+        list_del_init(&amp;glfd-&gt;openfds);</div><div class='add'>+    }</div><div class='add'>+    glfs_unlock(glfd-&gt;fs);</div><div class='add'>+</div><div class='add'>+    if (glfd-&gt;fd) {</div><div class='add'>+        fd_unref(glfd-&gt;fd);</div><div class='add'>+        glfd-&gt;fd = NULL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    GF_FREE(glfd-&gt;readdirbuf);</div><div class='add'>+</div><div class='add'>+    GF_FREE(glfd);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+struct glfs_fd *</div><div class='add'>+glfs_fd_new(struct glfs *fs)</div><div class='add'>+{</div><div class='add'>+    struct glfs_fd *glfd = NULL;</div><div class='add'>+</div><div class='add'>+    glfd = GF_CALLOC(1, sizeof(*glfd), glfs_mt_glfs_fd_t);</div><div class='add'>+    if (!glfd)</div><div class='add'>+        return NULL;</div><div class='add'>+</div><div class='add'>+    glfd-&gt;fs = fs;</div><div class='add'>+</div><div class='add'>+    INIT_LIST_HEAD(&amp;glfd-&gt;openfds);</div><div class='add'>+</div><div class='add'>+    GF_REF_INIT(glfd, glfs_fd_destroy);</div><div class='add'>+</div><div class='add'>+    return glfd;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+glfs_fd_bind(struct glfs_fd *glfd)</div><div class='add'>+{</div><div class='add'>+    struct glfs *fs = NULL;</div><div class='add'>+</div><div class='add'>+    fs = glfd-&gt;fs;</div><div class='add'>+</div><div class='add'>+    glfs_lock(fs, _gf_true);</div><div class='add'>+    {</div><div class='add'>+        list_add_tail(&amp;glfd-&gt;openfds, &amp;fs-&gt;openfds);</div><div class='add'>+    }</div><div class='add'>+    glfs_unlock(fs);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void *</div><div class='add'>+glfs_poller(void *data)</div><div class='add'>+{</div><div class='add'>+    struct glfs *fs = NULL;</div><div class='add'>+</div><div class='add'>+    fs = data;</div><div class='add'>+</div><div class='add'>+    gf_event_dispatch(fs-&gt;ctx-&gt;event_pool);</div><div class='add'>+</div><div class='add'>+    return NULL;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static struct glfs *</div><div class='add'>+glfs_new_fs(const char *volname)</div><div class='add'>+{</div><div class='add'>+    struct glfs *fs = NULL;</div><div class='add'>+</div><div class='add'>+    fs = CALLOC(1, sizeof(*fs));</div><div class='add'>+    if (!fs)</div><div class='add'>+        return NULL;</div><div class='add'>+</div><div class='add'>+    INIT_LIST_HEAD(&amp;fs-&gt;openfds);</div><div class='add'>+    INIT_LIST_HEAD(&amp;fs-&gt;upcall_list);</div><div class='add'>+    INIT_LIST_HEAD(&amp;fs-&gt;waitq);</div><div class='add'>+</div><div class='add'>+    PTHREAD_MUTEX_INIT(&amp;fs-&gt;mutex, NULL, fs-&gt;pthread_flags, GLFS_INIT_MUTEX,</div><div class='add'>+                       err);</div><div class='add'>+</div><div class='add'>+    PTHREAD_COND_INIT(&amp;fs-&gt;cond, NULL, fs-&gt;pthread_flags, GLFS_INIT_COND, err);</div><div class='add'>+</div><div class='add'>+    PTHREAD_COND_INIT(&amp;fs-&gt;child_down_cond, NULL, fs-&gt;pthread_flags,</div><div class='add'>+                      GLFS_INIT_COND_CHILD, err);</div><div class='add'>+</div><div class='add'>+    PTHREAD_MUTEX_INIT(&amp;fs-&gt;upcall_list_mutex, NULL, fs-&gt;pthread_flags,</div><div class='add'>+                       GLFS_INIT_MUTEX_UPCALL, err);</div><div class='add'>+</div><div class='add'>+    fs-&gt;volname = strdup(volname);</div><div class='add'>+    if (!fs-&gt;volname)</div><div class='add'>+        goto err;</div><div class='add'>+</div><div class='add'>+    fs-&gt;pin_refcnt = 0;</div><div class='add'>+    fs-&gt;upcall_events = 0;</div><div class='add'>+    fs-&gt;up_cbk = NULL;</div><div class='add'>+    fs-&gt;up_data = NULL;</div><div class='add'>+</div><div class='add'>+    return fs;</div><div class='add'>+</div><div class='add'>+err:</div><div class='add'>+    glfs_free_from_ctx(fs);</div><div class='add'>+    return NULL;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+extern xlator_t global_xlator;</div><div class='add'>+extern glusterfs_ctx_t *global_ctx;</div><div class='add'>+extern pthread_mutex_t global_ctx_mutex;</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+glfs_init_global_ctx()</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+    glusterfs_ctx_t *ctx = NULL;</div><div class='add'>+</div><div class='add'>+    pthread_mutex_lock(&amp;global_ctx_mutex);</div><div class='add'>+    {</div><div class='add'>+        if (global_xlator.ctx)</div><div class='add'>+            goto unlock;</div><div class='add'>+</div><div class='add'>+        ctx = glusterfs_ctx_new();</div><div class='add'>+        if (!ctx) {</div><div class='add'>+            ret = -1;</div><div class='add'>+            goto unlock;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        gf_log_globals_init(ctx, GF_LOG_NONE);</div><div class='add'>+</div><div class='add'>+        global_ctx = ctx;</div><div class='add'>+        global_xlator.ctx = global_ctx;</div><div class='add'>+</div><div class='add'>+        ret = glusterfs_ctx_defaults_init(ctx);</div><div class='add'>+        if (ret) {</div><div class='add'>+            global_ctx = NULL;</div><div class='add'>+            global_xlator.ctx = NULL;</div><div class='add'>+            goto unlock;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+unlock:</div><div class='add'>+    pthread_mutex_unlock(&amp;global_ctx_mutex);</div><div class='add'>+</div><div class='add'>+    if (ret)</div><div class='add'>+        FREE(ctx);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_new, 3.4.0)</div><div class='add'>+struct glfs *</div><div class='add'>+pub_glfs_new(const char *volname)</div><div class='add'>+{</div><div class='add'>+    if (!volname) {</div><div class='add'>+        errno = EINVAL;</div><div class='add'>+        return NULL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    struct glfs *fs = NULL;</div><div class='add'>+    int i = 0;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    glusterfs_ctx_t *ctx = NULL;</div><div class='add'>+    xlator_t *old_THIS = NULL;</div><div class='add'>+    char pname[16] = "";</div><div class='add'>+    char msg[32] = "";</div><div class='add'>+</div><div class='add'>+    if (volname[0] == '/' || volname[0] == '-') {</div><div class='add'>+        if (strncmp(volname, "/snaps/", 7) == 0) {</div><div class='add'>+            goto label;</div><div class='add'>+        }</div><div class='add'>+        errno = EINVAL;</div><div class='add'>+        return NULL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; strlen(volname); i++) {</div><div class='add'>+        if (!isalnum(volname[i]) &amp;&amp; (volname[i] != '_') &amp;&amp;</div><div class='add'>+            (volname[i] != '-')) {</div><div class='add'>+            errno = EINVAL;</div><div class='add'>+            return NULL;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+label:</div><div class='add'>+    /*</div><div class='add'>+     * Do this as soon as possible in case something else depends on</div><div class='add'>+     * pool allocations.</div><div class='add'>+     */</div><div class='add'>+    mem_pools_init();</div><div class='add'>+</div><div class='add'>+    fs = glfs_new_fs(volname);</div><div class='add'>+    if (!fs)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    ctx = glusterfs_ctx_new();</div><div class='add'>+    if (!ctx)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    /* first globals init, for gf_mem_acct_enable_set () */</div><div class='add'>+</div><div class='add'>+    ret = glusterfs_globals_init(ctx);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    old_THIS = THIS;</div><div class='add'>+    ret = glfs_init_global_ctx();</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    /* then ctx_defaults_init, for xlator_mem_acct_init(THIS) */</div><div class='add'>+</div><div class='add'>+    ret = glusterfs_ctx_defaults_init(ctx);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    fs-&gt;ctx = ctx;</div><div class='add'>+    fs-&gt;ctx-&gt;process_mode = GF_CLIENT_PROCESS;</div><div class='add'>+</div><div class='add'>+    ret = glfs_set_logging(fs, "/dev/null", 0);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    fs-&gt;ctx-&gt;cmd_args.volfile_id = gf_strdup(volname);</div><div class='add'>+    if (!(fs-&gt;ctx-&gt;cmd_args.volfile_id)) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = -1;</div><div class='add'>+#ifdef GF_LINUX_HOST_OS</div><div class='add'>+    ret = prctl(PR_GET_NAME, (unsigned long)pname, 0, 0, 0);</div><div class='add'>+#endif</div><div class='add'>+    if (ret)</div><div class='add'>+        fs-&gt;ctx-&gt;cmd_args.process_name = gf_strdup("gfapi");</div><div class='add'>+    else {</div><div class='add'>+        snprintf(msg, sizeof(msg), "gfapi.%s", pname);</div><div class='add'>+        fs-&gt;ctx-&gt;cmd_args.process_name = gf_strdup(msg);</div><div class='add'>+    }</div><div class='add'>+    ret = 0;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (ret) {</div><div class='add'>+        if (fs) {</div><div class='add'>+            glfs_fini(fs);</div><div class='add'>+            fs = NULL;</div><div class='add'>+        } else {</div><div class='add'>+            /* glfs_fini() calls mem_pools_fini() too */</div><div class='add'>+            mem_pools_fini();</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (old_THIS)</div><div class='add'>+        THIS = old_THIS;</div><div class='add'>+</div><div class='add'>+    return fs;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+GFAPI_SYMVER_PRIVATE_DEFAULT(glfs_new_from_ctx, 3.7.0)</div><div class='add'>+struct glfs *</div><div class='add'>+priv_glfs_new_from_ctx(glusterfs_ctx_t *ctx)</div><div class='add'>+{</div><div class='add'>+    struct glfs *fs = NULL;</div><div class='add'>+</div><div class='add'>+    if (!ctx)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    fs = glfs_new_fs("");</div><div class='add'>+    if (!fs)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    fs-&gt;ctx = ctx;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return fs;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+GFAPI_SYMVER_PRIVATE_DEFAULT(glfs_free_from_ctx, 3.7.0)</div><div class='add'>+void</div><div class='add'>+priv_glfs_free_from_ctx(struct glfs *fs)</div><div class='add'>+{</div><div class='add'>+    upcall_entry *u_list = NULL;</div><div class='add'>+    upcall_entry *tmp = NULL;</div><div class='add'>+</div><div class='add'>+    if (!fs)</div><div class='add'>+        return;</div><div class='add'>+</div><div class='add'>+    /* cleanup upcall structures */</div><div class='add'>+    list_for_each_entry_safe(u_list, tmp, &amp;fs-&gt;upcall_list, upcall_list)</div><div class='add'>+    {</div><div class='add'>+        list_del_init(&amp;u_list-&gt;upcall_list);</div><div class='add'>+        GF_FREE(u_list-&gt;upcall_data.data);</div><div class='add'>+        GF_FREE(u_list);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    PTHREAD_MUTEX_DESTROY(&amp;fs-&gt;mutex, fs-&gt;pthread_flags, GLFS_INIT_MUTEX);</div><div class='add'>+</div><div class='add'>+    PTHREAD_COND_DESTROY(&amp;fs-&gt;cond, fs-&gt;pthread_flags, GLFS_INIT_COND);</div><div class='add'>+</div><div class='add'>+    PTHREAD_COND_DESTROY(&amp;fs-&gt;child_down_cond, fs-&gt;pthread_flags,</div><div class='add'>+                         GLFS_INIT_COND_CHILD);</div><div class='add'>+</div><div class='add'>+    PTHREAD_MUTEX_DESTROY(&amp;fs-&gt;upcall_list_mutex, fs-&gt;pthread_flags,</div><div class='add'>+                          GLFS_INIT_MUTEX_UPCALL);</div><div class='add'>+</div><div class='add'>+    if (fs-&gt;oldvolfile)</div><div class='add'>+        FREE(fs-&gt;oldvolfile);</div><div class='add'>+</div><div class='add'>+    FREE(fs-&gt;volname);</div><div class='add'>+</div><div class='add'>+    FREE(fs);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_set_volfile, 3.4.0)</div><div class='add'>+int</div><div class='add'>+pub_glfs_set_volfile(struct glfs *fs, const char *volfile)</div><div class='add'>+{</div><div class='add'>+    cmd_args_t *cmd_args = NULL;</div><div class='add'>+</div><div class='add'>+    cmd_args = &amp;fs-&gt;ctx-&gt;cmd_args;</div><div class='add'>+</div><div class='add'>+    if (vol_assigned(cmd_args))</div><div class='add'>+        return -1;</div><div class='add'>+</div><div class='add'>+    cmd_args-&gt;volfile = gf_strdup(volfile);</div><div class='add'>+    if (!cmd_args-&gt;volfile)</div><div class='add'>+        return -1;</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_set_logging, 3.4.0)</div><div class='add'>+int</div><div class='add'>+pub_glfs_set_logging(struct glfs *fs, const char *logfile, int loglevel)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    char *tmplog = NULL;</div><div class='add'>+</div><div class='add'>+    DECLARE_OLD_THIS;</div><div class='add'>+    __GLFS_ENTRY_VALIDATE_FS(fs, invalid_fs);</div><div class='add'>+</div><div class='add'>+    if (!logfile) {</div><div class='add'>+        ret = gf_set_log_file_path(&amp;fs-&gt;ctx-&gt;cmd_args, fs-&gt;ctx);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+        tmplog = fs-&gt;ctx-&gt;cmd_args.log_file;</div><div class='add'>+    } else {</div><div class='add'>+        tmplog = (char *)logfile;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* finish log set parameters before init */</div><div class='add'>+    if (loglevel &gt;= 0)</div><div class='add'>+        gf_log_set_loglevel(fs-&gt;ctx, loglevel);</div><div class='add'>+</div><div class='add'>+    ret = gf_log_init(fs-&gt;ctx, tmplog, NULL);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    ret = gf_log_inject_timer_event(fs-&gt;ctx);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    __GLFS_EXIT_FS;</div><div class='add'>+</div><div class='add'>+invalid_fs:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+glfs_init_wait(struct glfs *fs)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    /* Always a top-down call, use glfs_lock() */</div><div class='add'>+    glfs_lock(fs, _gf_true);</div><div class='add'>+    {</div><div class='add'>+        while (!fs-&gt;init)</div><div class='add'>+            pthread_cond_wait(&amp;fs-&gt;cond, &amp;fs-&gt;mutex);</div><div class='add'>+        ret = fs-&gt;ret;</div><div class='add'>+        errno = fs-&gt;err;</div><div class='add'>+    }</div><div class='add'>+    glfs_unlock(fs);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+GFAPI_SYMVER_PRIVATE_DEFAULT(glfs_init_done, 3.4.0)</div><div class='add'>+void</div><div class='add'>+priv_glfs_init_done(struct glfs *fs, int ret)</div><div class='add'>+{</div><div class='add'>+    glfs_init_cbk init_cbk;</div><div class='add'>+</div><div class='add'>+    if (!fs) {</div><div class='add'>+        gf_smsg("glfs", GF_LOG_ERROR, EINVAL, API_MSG_GLFS_FSOBJ_NULL, NULL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    init_cbk = fs-&gt;init_cbk;</div><div class='add'>+</div><div class='add'>+    /* Always a bottom-up call, use mutex_lock() */</div><div class='add'>+    pthread_mutex_lock(&amp;fs-&gt;mutex);</div><div class='add'>+    {</div><div class='add'>+        fs-&gt;init = 1;</div><div class='add'>+        fs-&gt;ret = ret;</div><div class='add'>+        fs-&gt;err = errno;</div><div class='add'>+</div><div class='add'>+        if (!init_cbk)</div><div class='add'>+            pthread_cond_broadcast(&amp;fs-&gt;cond);</div><div class='add'>+    }</div><div class='add'>+    pthread_mutex_unlock(&amp;fs-&gt;mutex);</div><div class='add'>+</div><div class='add'>+    if (init_cbk)</div><div class='add'>+        init_cbk(fs, ret);</div><div class='add'>+out:</div><div class='add'>+    return;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+glfs_init_common(struct glfs *fs)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    ret = create_master(fs);</div><div class='add'>+    if (ret)</div><div class='add'>+        return ret;</div><div class='add'>+</div><div class='add'>+    ret = gf_thread_create(&amp;fs-&gt;poller, NULL, glfs_poller, fs, "glfspoll");</div><div class='add'>+    if (ret)</div><div class='add'>+        return ret;</div><div class='add'>+</div><div class='add'>+    ret = glfs_volumes_init(fs);</div><div class='add'>+    if (ret)</div><div class='add'>+        return ret;</div><div class='add'>+</div><div class='add'>+    fs-&gt;dev_id = gf_dm_hashfn(fs-&gt;volname, strlen(fs-&gt;volname));</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+glfs_init_async(struct glfs *fs, glfs_init_cbk cbk)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    if (!fs || !fs-&gt;ctx) {</div><div class='add'>+        gf_smsg("glfs", GF_LOG_ERROR, EINVAL, API_MSG_FS_NOT_INIT, NULL);</div><div class='add'>+        errno = EINVAL;</div><div class='add'>+        return ret;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    fs-&gt;init_cbk = cbk;</div><div class='add'>+</div><div class='add'>+    ret = glfs_init_common(fs);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_init, 3.4.0)</div><div class='add'>+int</div><div class='add'>+pub_glfs_init(struct glfs *fs)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    DECLARE_OLD_THIS;</div><div class='add'>+</div><div class='add'>+    if (!fs || !fs-&gt;ctx) {</div><div class='add'>+        gf_smsg("glfs", GF_LOG_ERROR, EINVAL, API_MSG_FS_NOT_INIT, NULL);</div><div class='add'>+        errno = EINVAL;</div><div class='add'>+        return ret;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    __GLFS_ENTRY_VALIDATE_FS(fs, invalid_fs);</div><div class='add'>+</div><div class='add'>+    ret = glfs_init_common(fs);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    ret = glfs_init_wait(fs);</div><div class='add'>+out:</div><div class='add'>+    __GLFS_EXIT_FS;</div><div class='add'>+</div><div class='add'>+    /* Set the initial current working directory to "/" */</div><div class='add'>+    if (ret &gt;= 0) {</div><div class='add'>+        ret = glfs_chdir(fs, "/");</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+invalid_fs:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+glusterfs_ctx_destroy(glusterfs_ctx_t *ctx)</div><div class='add'>+{</div><div class='add'>+    call_pool_t *pool = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    glusterfs_graph_t *trav_graph = NULL;</div><div class='add'>+    glusterfs_graph_t *tmp = NULL;</div><div class='add'>+</div><div class='add'>+    if (ctx == NULL)</div><div class='add'>+        return 0;</div><div class='add'>+</div><div class='add'>+    if (ctx-&gt;cmd_args.curr_server)</div><div class='add'>+        glfs_free_volfile_servers(&amp;ctx-&gt;cmd_args);</div><div class='add'>+</div><div class='add'>+    glfs_free_xlator_options(&amp;ctx-&gt;cmd_args);</div><div class='add'>+</div><div class='add'>+    /* For all the graphs, crawl through the xlator_t structs and free</div><div class='add'>+     * all its members except for the mem_acct member,</div><div class='add'>+     * as GF_FREE will be referencing it.</div><div class='add'>+     */</div><div class='add'>+    list_for_each_entry_safe(trav_graph, tmp, &amp;ctx-&gt;graphs, list)</div><div class='add'>+    {</div><div class='add'>+        xlator_tree_free_members(trav_graph-&gt;first);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Free the memory pool */</div><div class='add'>+    if (ctx-&gt;stub_mem_pool)</div><div class='add'>+        mem_pool_destroy(ctx-&gt;stub_mem_pool);</div><div class='add'>+    if (ctx-&gt;dict_pool)</div><div class='add'>+        mem_pool_destroy(ctx-&gt;dict_pool);</div><div class='add'>+    if (ctx-&gt;dict_data_pool)</div><div class='add'>+        mem_pool_destroy(ctx-&gt;dict_data_pool);</div><div class='add'>+    if (ctx-&gt;dict_pair_pool)</div><div class='add'>+        mem_pool_destroy(ctx-&gt;dict_pair_pool);</div><div class='add'>+    if (ctx-&gt;logbuf_pool)</div><div class='add'>+        mem_pool_destroy(ctx-&gt;logbuf_pool);</div><div class='add'>+</div><div class='add'>+    pool = ctx-&gt;pool;</div><div class='add'>+    if (pool) {</div><div class='add'>+        if (pool-&gt;frame_mem_pool)</div><div class='add'>+            mem_pool_destroy(pool-&gt;frame_mem_pool);</div><div class='add'>+        if (pool-&gt;stack_mem_pool)</div><div class='add'>+            mem_pool_destroy(pool-&gt;stack_mem_pool);</div><div class='add'>+        LOCK_DESTROY(&amp;pool-&gt;lock);</div><div class='add'>+        GF_FREE(pool);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Free the event pool */</div><div class='add'>+    ret = gf_event_pool_destroy(ctx-&gt;event_pool);</div><div class='add'>+</div><div class='add'>+    /* Free the iobuf pool */</div><div class='add'>+    iobuf_pool_destroy(ctx-&gt;iobuf_pool);</div><div class='add'>+</div><div class='add'>+    GF_FREE(ctx-&gt;process_uuid);</div><div class='add'>+    GF_FREE(ctx-&gt;cmd_args.volfile_id);</div><div class='add'>+    GF_FREE(ctx-&gt;cmd_args.process_name);</div><div class='add'>+</div><div class='add'>+    LOCK_DESTROY(&amp;ctx-&gt;lock);</div><div class='add'>+    pthread_mutex_destroy(&amp;ctx-&gt;notify_lock);</div><div class='add'>+    pthread_cond_destroy(&amp;ctx-&gt;notify_cond);</div><div class='add'>+</div><div class='add'>+    /* Free all the graph structs and its containing xlator_t structs</div><div class='add'>+     * from this point there should be no reference to GF_FREE/GF_CALLOC</div><div class='add'>+     * as it will try to access mem_acct and the below function would</div><div class='add'>+     * have freed the same.</div><div class='add'>+     */</div><div class='add'>+    list_for_each_entry_safe(trav_graph, tmp, &amp;ctx-&gt;graphs, list)</div><div class='add'>+    {</div><div class='add'>+        glusterfs_graph_destroy_residual(trav_graph);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    GF_FREE(ctx-&gt;statedump_path);</div><div class='add'>+    FREE(ctx);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_fini, 3.4.0)</div><div class='add'>+int</div><div class='add'>+pub_glfs_fini(struct glfs *fs)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int countdown = 100;</div><div class='add'>+    xlator_t *subvol = NULL;</div><div class='add'>+    glusterfs_ctx_t *ctx = NULL;</div><div class='add'>+    glusterfs_graph_t *graph = NULL;</div><div class='add'>+    call_pool_t *call_pool = NULL;</div><div class='add'>+    int fs_init = 0;</div><div class='add'>+    int err = -1;</div><div class='add'>+    struct synctask *waittask = NULL;</div><div class='add'>+</div><div class='add'>+    DECLARE_OLD_THIS;</div><div class='add'>+</div><div class='add'>+    if (!fs) {</div><div class='add'>+        errno = EINVAL;</div><div class='add'>+        goto invalid_fs;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ctx = fs-&gt;ctx;</div><div class='add'>+    if (!ctx) {</div><div class='add'>+        goto free_fs;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    THIS = fs-&gt;ctx-&gt;master;</div><div class='add'>+</div><div class='add'>+    if (ctx-&gt;mgmt) {</div><div class='add'>+        rpc_clnt_disable(ctx-&gt;mgmt);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    call_pool = fs-&gt;ctx-&gt;pool;</div><div class='add'>+</div><div class='add'>+    /* Wake up any suspended synctasks */</div><div class='add'>+    while (!list_empty(&amp;fs-&gt;waitq)) {</div><div class='add'>+        waittask = list_entry(fs-&gt;waitq.next, struct synctask, waitq);</div><div class='add'>+        list_del_init(&amp;waittask-&gt;waitq);</div><div class='add'>+        synctask_wake(waittask);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    while (countdown--) {</div><div class='add'>+        /* give some time for background frames to finish */</div><div class='add'>+        pthread_mutex_lock(&amp;fs-&gt;mutex);</div><div class='add'>+        {</div><div class='add'>+            /* Do we need to increase countdown? */</div><div class='add'>+            if ((!call_pool-&gt;cnt) &amp;&amp; (!fs-&gt;pin_refcnt)) {</div><div class='add'>+                gf_msg_trace("glfs", 0,</div><div class='add'>+                             "call_pool_cnt - %" PRId64</div><div class='add'>+                             ","</div><div class='add'>+                             "pin_refcnt - %d",</div><div class='add'>+                             call_pool-&gt;cnt, fs-&gt;pin_refcnt);</div><div class='add'>+</div><div class='add'>+                ctx-&gt;cleanup_started = 1;</div><div class='add'>+                pthread_mutex_unlock(&amp;fs-&gt;mutex);</div><div class='add'>+                break;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+        pthread_mutex_unlock(&amp;fs-&gt;mutex);</div><div class='add'>+        gf_nanosleep(100000 * GF_US_IN_NS);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* leaked frames may exist, we ignore */</div><div class='add'>+</div><div class='add'>+    /*We deem glfs_fini as successful if there are no pending frames in the call</div><div class='add'>+     *pool*/</div><div class='add'>+    ret = (call_pool-&gt;cnt == 0) ? 0 : -1;</div><div class='add'>+</div><div class='add'>+    pthread_mutex_lock(&amp;fs-&gt;mutex);</div><div class='add'>+    {</div><div class='add'>+        fs_init = fs-&gt;init;</div><div class='add'>+    }</div><div class='add'>+    pthread_mutex_unlock(&amp;fs-&gt;mutex);</div><div class='add'>+</div><div class='add'>+    if (fs_init != 0) {</div><div class='add'>+        subvol = glfs_active_subvol(fs);</div><div class='add'>+        if (subvol) {</div><div class='add'>+            /* PARENT_DOWN within glfs_subvol_done() is issued</div><div class='add'>+               only on graph switch (new graph should activiate</div><div class='add'>+               and decrement the extra @winds count taken in</div><div class='add'>+               glfs_graph_setup()</div><div class='add'>+</div><div class='add'>+               Since we are explicitly destroying,</div><div class='add'>+               PARENT_DOWN is necessary</div><div class='add'>+            */</div><div class='add'>+            xlator_notify(subvol, GF_EVENT_PARENT_DOWN, subvol, 0);</div><div class='add'>+            /* Here we wait for GF_EVENT_CHILD_DOWN before exiting,</div><div class='add'>+               in case of asynchrnous cleanup</div><div class='add'>+            */</div><div class='add'>+            graph = subvol-&gt;graph;</div><div class='add'>+            err = pthread_mutex_lock(&amp;fs-&gt;mutex);</div><div class='add'>+            if (err != 0) {</div><div class='add'>+                gf_smsg("glfs", GF_LOG_ERROR, err, API_MSG_FSMUTEX_LOCK_FAILED,</div><div class='add'>+                        "error=%s", strerror(err), NULL);</div><div class='add'>+                goto fail;</div><div class='add'>+            }</div><div class='add'>+            /* check and wait for CHILD_DOWN for active subvol*/</div><div class='add'>+            {</div><div class='add'>+                while (graph-&gt;used) {</div><div class='add'>+                    err = pthread_cond_wait(&amp;fs-&gt;child_down_cond, &amp;fs-&gt;mutex);</div><div class='add'>+                    if (err != 0)</div><div class='add'>+                        gf_smsg("glfs", GF_LOG_INFO, err,</div><div class='add'>+                                API_MSG_COND_WAIT_FAILED, "name=%s",</div><div class='add'>+                                subvol-&gt;name, "err=%s", strerror(err), NULL);</div><div class='add'>+                }</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            err = pthread_mutex_unlock(&amp;fs-&gt;mutex);</div><div class='add'>+            if (err != 0) {</div><div class='add'>+                gf_smsg("glfs", GF_LOG_ERROR, err,</div><div class='add'>+                        API_MSG_FSMUTEX_UNLOCK_FAILED, "error=%s",</div><div class='add'>+                        strerror(err), NULL);</div><div class='add'>+                goto fail;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+        glfs_subvol_done(fs, subvol);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ctx-&gt;cleanup_started = 1;</div><div class='add'>+</div><div class='add'>+    if (fs_init != 0) {</div><div class='add'>+        /* Destroy all the inode tables of all the graphs.</div><div class='add'>+         * NOTE:</div><div class='add'>+         * - inode objects should be destroyed before calling fini()</div><div class='add'>+         *   of each xlator, as fini() and forget() of the xlators</div><div class='add'>+         *   can share few common locks or data structures, calling</div><div class='add'>+         *   fini first might destroy those required by forget</div><div class='add'>+         *   ( eg: in quick-read)</div><div class='add'>+         * - The call to inode_table_destroy_all is not required when</div><div class='add'>+         *   the cleanup during graph switch is implemented to perform</div><div class='add'>+         *   inode table destroy.</div><div class='add'>+         */</div><div class='add'>+        inode_table_destroy_all(ctx);</div><div class='add'>+</div><div class='add'>+        /* Call fini() of all the xlators in the active graph</div><div class='add'>+         * NOTE:</div><div class='add'>+         * - xlator fini() should be called before destroying any of</div><div class='add'>+         *   the threads. (eg: fini() in protocol-client uses timer</div><div class='add'>+         *   thread) */</div><div class='add'>+        glusterfs_graph_deactivate(ctx-&gt;active);</div><div class='add'>+</div><div class='add'>+        /* Join the syncenv_processor threads and cleanup</div><div class='add'>+         * syncenv resources*/</div><div class='add'>+        syncenv_destroy(ctx-&gt;env);</div><div class='add'>+</div><div class='add'>+        /* Join the poller thread */</div><div class='add'>+        if (gf_event_dispatch_destroy(ctx-&gt;event_pool) &lt; 0)</div><div class='add'>+            ret = -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Avoid dispatching events to mgmt after freed,</div><div class='add'>+     * unreference mgmt after the event_dispatch_destroy */</div><div class='add'>+    if (ctx-&gt;mgmt) {</div><div class='add'>+        rpc_clnt_unref(ctx-&gt;mgmt);</div><div class='add'>+        ctx-&gt;mgmt = NULL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* log infra has to be brought down before destroying</div><div class='add'>+     * timer registry, as logging uses timer infra</div><div class='add'>+     */</div><div class='add'>+    if (gf_log_fini(ctx) != 0)</div><div class='add'>+        ret = -1;</div><div class='add'>+</div><div class='add'>+    /* Join the timer thread */</div><div class='add'>+    if (fs_init != 0) {</div><div class='add'>+        gf_timer_registry_destroy(ctx);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Destroy the context and the global pools */</div><div class='add'>+    if (glusterfs_ctx_destroy(ctx) != 0)</div><div class='add'>+        ret = -1;</div><div class='add'>+</div><div class='add'>+free_fs:</div><div class='add'>+    glfs_free_from_ctx(fs);</div><div class='add'>+</div><div class='add'>+    /*</div><div class='add'>+     * Do this as late as possible in case anything else has (or</div><div class='add'>+     * grows) a dependency on mem-pool allocations.</div><div class='add'>+     */</div><div class='add'>+    mem_pools_fini();</div><div class='add'>+</div><div class='add'>+fail:</div><div class='add'>+    if (!ret)</div><div class='add'>+        ret = err;</div><div class='add'>+</div><div class='add'>+    __GLFS_EXIT_FS;</div><div class='add'>+</div><div class='add'>+invalid_fs:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_get_volfile, 3.6.0)</div><div class='add'>+ssize_t</div><div class='add'>+pub_glfs_get_volfile(struct glfs *fs, void *buf, size_t len)</div><div class='add'>+{</div><div class='add'>+    ssize_t res = -1;</div><div class='add'>+</div><div class='add'>+    DECLARE_OLD_THIS;</div><div class='add'>+    __GLFS_ENTRY_VALIDATE_FS(fs, invalid_fs);</div><div class='add'>+</div><div class='add'>+    glfs_lock(fs, _gf_true);</div><div class='add'>+    if (len &gt;= fs-&gt;oldvollen) {</div><div class='add'>+        gf_msg_trace("glfs", 0, "copying %zu to %p", len, buf);</div><div class='add'>+        memcpy(buf, fs-&gt;oldvolfile, len);</div><div class='add'>+        res = len;</div><div class='add'>+    } else {</div><div class='add'>+        res = len - fs-&gt;oldvollen;</div><div class='add'>+        gf_msg_trace("glfs", 0, "buffer is %zd too short", -res);</div><div class='add'>+    }</div><div class='add'>+    glfs_unlock(fs);</div><div class='add'>+</div><div class='add'>+    __GLFS_EXIT_FS;</div><div class='add'>+</div><div class='add'>+invalid_fs:</div><div class='add'>+    return res;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+GFAPI_SYMVER_PRIVATE_DEFAULT(glfs_ipc, 3.12.0)</div><div class='add'>+int</div><div class='add'>+priv_glfs_ipc(struct glfs *fs, int opcode, void *xd_in, void **xd_out)</div><div class='add'>+{</div><div class='add'>+    xlator_t *subvol = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    DECLARE_OLD_THIS;</div><div class='add'>+    __GLFS_ENTRY_VALIDATE_FS(fs, invalid_fs);</div><div class='add'>+</div><div class='add'>+    subvol = glfs_active_subvol(fs);</div><div class='add'>+    if (!subvol) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        errno = EIO;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = syncop_ipc(subvol, opcode, (dict_t *)xd_in, (dict_t **)xd_out);</div><div class='add'>+    DECODE_SYNCOP_ERR(ret);</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    glfs_subvol_done(fs, subvol);</div><div class='add'>+    __GLFS_EXIT_FS;</div><div class='add'>+</div><div class='add'>+invalid_fs:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+GFAPI_SYMVER_PRIVATE_DEFAULT(glfs_setfspid, 6.1)</div><div class='add'>+int</div><div class='add'>+priv_glfs_setfspid(struct glfs *fs, pid_t pid)</div><div class='add'>+{</div><div class='add'>+    cmd_args_t *cmd_args = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    cmd_args = &amp;fs-&gt;ctx-&gt;cmd_args;</div><div class='add'>+    cmd_args-&gt;client_pid = pid;</div><div class='add'>+    cmd_args-&gt;client_pid_set = 1;</div><div class='add'>+    ret = syncopctx_setfspid(&amp;pid);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_free, 3.7.16)</div><div class='add'>+void</div><div class='add'>+pub_glfs_free(void *ptr)</div><div class='add'>+{</div><div class='add'>+    GLFS_FREE(ptr);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_upcall_get_fs, 3.7.16)</div><div class='add'>+struct glfs *</div><div class='add'>+pub_glfs_upcall_get_fs(struct glfs_upcall *arg)</div><div class='add'>+{</div><div class='add'>+    return arg-&gt;fs;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_upcall_get_reason, 3.7.16)</div><div class='add'>+enum glfs_upcall_reason</div><div class='add'>+pub_glfs_upcall_get_reason(struct glfs_upcall *arg)</div><div class='add'>+{</div><div class='add'>+    return arg-&gt;reason;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_upcall_get_event, 3.7.16)</div><div class='add'>+void *</div><div class='add'>+pub_glfs_upcall_get_event(struct glfs_upcall *arg)</div><div class='add'>+{</div><div class='add'>+    return arg-&gt;event;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_upcall_inode_get_object, 3.7.16)</div><div class='add'>+struct glfs_object *</div><div class='add'>+pub_glfs_upcall_inode_get_object(struct glfs_upcall_inode *arg)</div><div class='add'>+{</div><div class='add'>+    return arg-&gt;object;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_upcall_inode_get_flags, 3.7.16)</div><div class='add'>+uint64_t</div><div class='add'>+pub_glfs_upcall_inode_get_flags(struct glfs_upcall_inode *arg)</div><div class='add'>+{</div><div class='add'>+    return arg-&gt;flags;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_upcall_inode_get_stat, 3.7.16)</div><div class='add'>+struct stat *</div><div class='add'>+pub_glfs_upcall_inode_get_stat(struct glfs_upcall_inode *arg)</div><div class='add'>+{</div><div class='add'>+    return &amp;arg-&gt;buf;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_upcall_inode_get_expire, 3.7.16)</div><div class='add'>+uint64_t</div><div class='add'>+pub_glfs_upcall_inode_get_expire(struct glfs_upcall_inode *arg)</div><div class='add'>+{</div><div class='add'>+    return arg-&gt;expire_time_attr;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_upcall_inode_get_pobject, 3.7.16)</div><div class='add'>+struct glfs_object *</div><div class='add'>+pub_glfs_upcall_inode_get_pobject(struct glfs_upcall_inode *arg)</div><div class='add'>+{</div><div class='add'>+    return arg-&gt;p_object;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_upcall_inode_get_pstat, 3.7.16)</div><div class='add'>+struct stat *</div><div class='add'>+pub_glfs_upcall_inode_get_pstat(struct glfs_upcall_inode *arg)</div><div class='add'>+{</div><div class='add'>+    return &amp;arg-&gt;p_buf;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_upcall_inode_get_oldpobject, 3.7.16)</div><div class='add'>+struct glfs_object *</div><div class='add'>+pub_glfs_upcall_inode_get_oldpobject(struct glfs_upcall_inode *arg)</div><div class='add'>+{</div><div class='add'>+    return arg-&gt;oldp_object;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_upcall_inode_get_oldpstat, 3.7.16)</div><div class='add'>+struct stat *</div><div class='add'>+pub_glfs_upcall_inode_get_oldpstat(struct glfs_upcall_inode *arg)</div><div class='add'>+{</div><div class='add'>+    return &amp;arg-&gt;oldp_buf;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_upcall_lease_get_object, 4.1.6)</div><div class='add'>+struct glfs_object *</div><div class='add'>+pub_glfs_upcall_lease_get_object(struct glfs_upcall_lease *arg)</div><div class='add'>+{</div><div class='add'>+    return arg-&gt;object;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_upcall_lease_get_lease_type, 4.1.6)</div><div class='add'>+uint32_t</div><div class='add'>+pub_glfs_upcall_lease_get_lease_type(struct glfs_upcall_lease *arg)</div><div class='add'>+{</div><div class='add'>+    return arg-&gt;lease_type;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* definitions of the GLFS_SYSRQ_* chars are in glfs.h */</div><div class='add'>+static struct glfs_sysrq_help {</div><div class='add'>+    char sysrq;</div><div class='add'>+    char *msg;</div><div class='add'>+} glfs_sysrq_help[] = {{GLFS_SYSRQ_HELP, "(H)elp"},</div><div class='add'>+                       {GLFS_SYSRQ_STATEDUMP, "(S)tatedump"},</div><div class='add'>+                       {0, NULL}};</div><div class='add'>+</div><div class='add'>+GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_sysrq, 3.10.0)</div><div class='add'>+int</div><div class='add'>+pub_glfs_sysrq(struct glfs *fs, char sysrq)</div><div class='add'>+{</div><div class='add'>+    glusterfs_ctx_t *ctx = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    int msg_len;</div><div class='add'>+    char msg[1024] = {</div><div class='add'>+        0,</div><div class='add'>+    }; /* should not exceed 1024 chars */</div><div class='add'>+</div><div class='add'>+    if (!fs || !fs-&gt;ctx) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        errno = EINVAL;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ctx = fs-&gt;ctx;</div><div class='add'>+</div><div class='add'>+    switch (sysrq) {</div><div class='add'>+        case GLFS_SYSRQ_HELP: {</div><div class='add'>+            struct glfs_sysrq_help *usage = NULL;</div><div class='add'>+</div><div class='add'>+            for (usage = glfs_sysrq_help; usage-&gt;sysrq; usage++) {</div><div class='add'>+                msg_len = strlen(msg);</div><div class='add'>+                snprintf(msg + msg_len, /* append to msg */</div><div class='add'>+                         sizeof(msg) - msg_len - 2,</div><div class='add'>+                         /* - 2 for the " " + terminating \0 */</div><div class='add'>+                         " %s", usage-&gt;msg);</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            /* not really an 'error', but make sure it gets logged */</div><div class='add'>+            gf_log("glfs", GF_LOG_ERROR, "available events: %s", msg);</div><div class='add'>+</div><div class='add'>+            break;</div><div class='add'>+        }</div><div class='add'>+        case GLFS_SYSRQ_STATEDUMP:</div><div class='add'>+            gf_proc_dump_info(SIGUSR1, ctx);</div><div class='add'>+            break;</div><div class='add'>+        default:</div><div class='add'>+            gf_smsg("glfs", GF_LOG_ERROR, ENOTSUP, API_MSG_INVALID_SYSRQ,</div><div class='add'>+                    "sysrq=%c", sysrq, NULL);</div><div class='add'>+            errno = ENOTSUP;</div><div class='add'>+            ret = -1;</div><div class='add'>+    }</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_upcall_register, 3.13.0)</div><div class='add'>+int</div><div class='add'>+pub_glfs_upcall_register(struct glfs *fs, uint32_t event_list,</div><div class='add'>+                         glfs_upcall_cbk cbk, void *data)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    /* list of supported upcall events */</div><div class='add'>+    uint32_t up_events = (GLFS_EVENT_INODE_INVALIDATE |</div><div class='add'>+                          GLFS_EVENT_RECALL_LEASE);</div><div class='add'>+</div><div class='add'>+    DECLARE_OLD_THIS;</div><div class='add'>+    __GLFS_ENTRY_VALIDATE_FS(fs, invalid_fs);</div><div class='add'>+</div><div class='add'>+    GF_VALIDATE_OR_GOTO(THIS-&gt;name, cbk, out);</div><div class='add'>+</div><div class='add'>+    /* Event list should be either GLFS_EVENT_ANY</div><div class='add'>+     * or list of supported individual events (up_events)</div><div class='add'>+     */</div><div class='add'>+    if ((event_list != GLFS_EVENT_ANY) &amp;&amp; (event_list &amp; ~up_events)) {</div><div class='add'>+        errno = EINVAL;</div><div class='add'>+        ret = -1;</div><div class='add'>+        gf_smsg(THIS-&gt;name, GF_LOG_ERROR, errno, API_MSG_INVALID_ARG,</div><div class='add'>+                "event_list=(0x%08x)", event_list, NULL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* in case other thread does unregister */</div><div class='add'>+    pthread_mutex_lock(&amp;fs-&gt;mutex);</div><div class='add'>+    {</div><div class='add'>+        if (event_list &amp; GLFS_EVENT_INODE_INVALIDATE) {</div><div class='add'>+            /* @todo: Check if features.cache-invalidation is</div><div class='add'>+             * enabled.</div><div class='add'>+             */</div><div class='add'>+            fs-&gt;upcall_events |= GF_UPCALL_CACHE_INVALIDATION;</div><div class='add'>+            ret |= GLFS_EVENT_INODE_INVALIDATE;</div><div class='add'>+        }</div><div class='add'>+        if (event_list &amp; GLFS_EVENT_RECALL_LEASE) {</div><div class='add'>+            /* @todo: Check if features.leases is enabled */</div><div class='add'>+            fs-&gt;upcall_events |= GF_UPCALL_RECALL_LEASE;</div><div class='add'>+            ret |= GLFS_EVENT_RECALL_LEASE;</div><div class='add'>+        }</div><div class='add'>+        /* Override cbk function if existing */</div><div class='add'>+        fs-&gt;up_cbk = cbk;</div><div class='add'>+        fs-&gt;up_data = data;</div><div class='add'>+        fs-&gt;cache_upcalls = _gf_true;</div><div class='add'>+    }</div><div class='add'>+    pthread_mutex_unlock(&amp;fs-&gt;mutex);</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    __GLFS_EXIT_FS;</div><div class='add'>+</div><div class='add'>+invalid_fs:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_upcall_unregister, 3.13.0)</div><div class='add'>+int</div><div class='add'>+pub_glfs_upcall_unregister(struct glfs *fs, uint32_t event_list)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+    /* list of supported upcall events */</div><div class='add'>+    uint32_t up_events = (GLFS_EVENT_INODE_INVALIDATE |</div><div class='add'>+                          GLFS_EVENT_RECALL_LEASE);</div><div class='add'>+</div><div class='add'>+    DECLARE_OLD_THIS;</div><div class='add'>+    __GLFS_ENTRY_VALIDATE_FS(fs, invalid_fs);</div><div class='add'>+</div><div class='add'>+    /* Event list should be either GLFS_EVENT_ANY</div><div class='add'>+     * or list of supported individual events (up_events)</div><div class='add'>+     */</div><div class='add'>+    if ((event_list != GLFS_EVENT_ANY) &amp;&amp; (event_list &amp; ~up_events)) {</div><div class='add'>+        errno = EINVAL;</div><div class='add'>+        ret = -1;</div><div class='add'>+        gf_smsg(THIS-&gt;name, GF_LOG_ERROR, errno, API_MSG_INVALID_ARG,</div><div class='add'>+                "event_list=(0x%08x)", event_list, NULL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    pthread_mutex_lock(&amp;fs-&gt;mutex);</div><div class='add'>+    {</div><div class='add'>+        /* We already checked if event_list contains list of supported</div><div class='add'>+         * upcall events. No other specific checks needed as of now for</div><div class='add'>+         * unregister */</div><div class='add'>+        fs-&gt;upcall_events &amp;= ~(event_list);</div><div class='add'>+        ret |= ((event_list == GLFS_EVENT_ANY) ? up_events : event_list);</div><div class='add'>+</div><div class='add'>+        /* If there are no upcall events registered, reset cbk */</div><div class='add'>+        if (fs-&gt;upcall_events == 0) {</div><div class='add'>+            fs-&gt;up_cbk = NULL;</div><div class='add'>+            fs-&gt;up_data = NULL;</div><div class='add'>+            fs-&gt;cache_upcalls = _gf_false;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    pthread_mutex_unlock(&amp;fs-&gt;mutex);</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    __GLFS_EXIT_FS;</div><div class='add'>+</div><div class='add'>+invalid_fs:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_set_statedump_path, 7.0)</div><div class='add'>+int</div><div class='add'>+pub_glfs_set_statedump_path(struct glfs *fs, const char *path)</div><div class='add'>+{</div><div class='add'>+    struct stat st;</div><div class='add'>+    int ret;</div><div class='add'>+    DECLARE_OLD_THIS;</div><div class='add'>+    __GLFS_ENTRY_VALIDATE_FS(fs, invalid_fs);</div><div class='add'>+</div><div class='add'>+    if (!path) {</div><div class='add'>+        gf_log("glfs", GF_LOG_ERROR, "path is NULL");</div><div class='add'>+        errno = EINVAL;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* If path is not present OR, if it is directory AND has enough permission</div><div class='add'>+     * to create files, then proceed */</div><div class='add'>+    ret = sys_stat(path, &amp;st);</div><div class='add'>+    if (ret &amp;&amp; errno != ENOENT) {</div><div class='add'>+        gf_log("glfs", GF_LOG_ERROR, "%s: not a valid path (%s)", path,</div><div class='add'>+               strerror(errno));</div><div class='add'>+        errno = EINVAL;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (!ret) {</div><div class='add'>+        /* file is present, now check other things */</div><div class='add'>+        if (!S_ISDIR(st.st_mode)) {</div><div class='add'>+            gf_log("glfs", GF_LOG_ERROR, "%s: path is not directory", path);</div><div class='add'>+            errno = EINVAL;</div><div class='add'>+            goto err;</div><div class='add'>+        }</div><div class='add'>+        if (sys_access(path, W_OK | X_OK) &lt; 0) {</div><div class='add'>+            gf_log("glfs", GF_LOG_ERROR,</div><div class='add'>+                   "%s: path doesn't have write permission", path);</div><div class='add'>+            errno = EPERM;</div><div class='add'>+            goto err;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* If set, it needs to be freed, so we don't have leak */</div><div class='add'>+    GF_FREE(fs-&gt;ctx-&gt;statedump_path);</div><div class='add'>+</div><div class='add'>+    fs-&gt;ctx-&gt;statedump_path = gf_strdup(path);</div><div class='add'>+    if (!fs-&gt;ctx-&gt;statedump_path) {</div><div class='add'>+        gf_log("glfs", GF_LOG_ERROR,</div><div class='add'>+               "%s: failed to set statedump path, no memory", path);</div><div class='add'>+        errno = ENOMEM;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    __GLFS_EXIT_FS;</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+err:</div><div class='add'>+    __GLFS_EXIT_FS;</div><div class='add'>+</div><div class='add'>+invalid_fs:</div><div class='add'>+    return -1;</div><div class='add'>+}</div><div class='head'>diff --git a/api/src/glfs.h b/api/src/glfs.h<br/>new file mode 100644<br/>index 00000000000..279d11d58ee<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/api/src/glfs.h?id=d1d7a6f35c816822fab51c820e25023863c239c1'>api/src/glfs.h</a></div><div class='hunk'>@@ -0,0 +1,1485 @@</div><div class='add'>+/*</div><div class='add'>+  Copyright (c) 2012-2018 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#ifndef _GLFS_H</div><div class='add'>+#define _GLFS_H</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+  Enforce the following flags as libgfapi is built</div><div class='add'>+  with them, and we want programs linking against them to also</div><div class='add'>+  be built with these flags. This is necessary as it affects</div><div class='add'>+  some of the structures defined in libc headers (like struct stat)</div><div class='add'>+  and those definitions need to be consistently compiled in</div><div class='add'>+  both the library and the application.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+/* Values for valid flags to be used when using XXXsetattr, to set multiple</div><div class='add'>+ attribute values passed via the related stat structure.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+#define GFAPI_SET_ATTR_MODE 0x1</div><div class='add'>+#define GFAPI_SET_ATTR_UID 0x2</div><div class='add'>+#define GFAPI_SET_ATTR_GID 0x4</div><div class='add'>+#define GFAPI_SET_ATTR_SIZE 0x8</div><div class='add'>+#define GFAPI_SET_ATTR_ATIME 0x10</div><div class='add'>+#define GFAPI_SET_ATTR_MTIME 0x20</div><div class='add'>+</div><div class='add'>+#ifndef _FILE_OFFSET_BITS</div><div class='add'>+#define _FILE_OFFSET_BITS 64</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#ifndef __USE_FILE_OFFSET64</div><div class='add'>+#define __USE_FILE_OFFSET64</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#ifndef _GNU_SOURCE</div><div class='add'>+#define _GNU_SOURCE</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#include &lt;sys/types.h&gt;</div><div class='add'>+#include &lt;sys/stat.h&gt;</div><div class='add'>+#include &lt;fcntl.h&gt;</div><div class='add'>+#include &lt;sys/uio.h&gt;</div><div class='add'>+#include &lt;unistd.h&gt;</div><div class='add'>+#include &lt;sys/cdefs.h&gt;</div><div class='add'>+#include &lt;dirent.h&gt;</div><div class='add'>+#include &lt;sys/statvfs.h&gt;</div><div class='add'>+#include &lt;stdint.h&gt;</div><div class='add'>+#include &lt;sys/time.h&gt;</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+ * For off64_t to be defined, we need both</div><div class='add'>+ * __USE_LARGEFILE64 to be true and __off64_t_defnined to be</div><div class='add'>+ * false. But, making __USE_LARGEFILE64 true causes other issues</div><div class='add'>+ * such as redinition of stat and fstat to stat64 and fstat64</div><div class='add'>+ * respectively which again causes compilation issues.</div><div class='add'>+ * Without off64_t being defined, this will not compile as</div><div class='add'>+ * copy_file_range uses off64_t. Hence define it here. First</div><div class='add'>+ * check whether __off64_t_defined is true or not. &lt;unistd.h&gt;</div><div class='add'>+ * sets that flag when it defines off64_t. If __off64_t_defined</div><div class='add'>+ * is false and __USE_FILE_OFFSET64 is true, then go on to define</div><div class='add'>+ * off64_t using __off64_t.</div><div class='add'>+ */</div><div class='add'>+#ifndef GF_BSD_HOST_OS</div><div class='add'>+#if defined(__USE_FILE_OFFSET64) &amp;&amp; !defined(__off64_t_defined)</div><div class='add'>+typedef __off64_t off64_t;</div><div class='add'>+#endif /* defined(__USE_FILE_OFFSET64) &amp;&amp; !defined(__off64_t_defined) */</div><div class='add'>+#else</div><div class='add'>+#include &lt;stdio.h&gt;</div><div class='add'>+#ifndef _OFF64_T_DECLARED</div><div class='add'>+/*</div><div class='add'>+ * Including &lt;stdio.h&gt; (done above) should actually define</div><div class='add'>+ * _OFF64_T_DECLARED with off64_t data type being available</div><div class='add'>+ * for consumption. But, off64_t data type is not recognizable</div><div class='add'>+ * for FreeBSD versions less than 11. Hence, int64_t is typedefed</div><div class='add'>+ * to off64_t.</div><div class='add'>+ */</div><div class='add'>+#define _OFF64_T_DECLARED</div><div class='add'>+typedef int64_t off64_t;</div><div class='add'>+#endif /* _OFF64_T_DECLARED */</div><div class='add'>+#endif /* GF_BSD_HOST_OS */</div><div class='add'>+</div><div class='add'>+#if defined(HAVE_SYS_ACL_H) || (defined(USE_POSIX_ACLS) &amp;&amp; USE_POSIX_ACLS)</div><div class='add'>+#include &lt;sys/acl.h&gt;</div><div class='add'>+#else</div><div class='add'>+typedef void *acl_t;</div><div class='add'>+typedef int acl_type_t;</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+/* Portability non glibc c++ build systems */</div><div class='add'>+#ifndef __THROW</div><div class='add'>+#if defined __cplusplus</div><div class='add'>+#define __THROW throw()</div><div class='add'>+#else</div><div class='add'>+#define __THROW</div><div class='add'>+#endif</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#ifndef GF_DARWIN_HOST_OS</div><div class='add'>+#define GFAPI_PUBLIC(sym, ver)  /**/</div><div class='add'>+#define GFAPI_PRIVATE(sym, ver) /**/</div><div class='add'>+#else</div><div class='add'>+#define GFAPI_PUBLIC(sym, ver) __asm("_" __STRING(sym) "$GFAPI_" __STRING(ver))</div><div class='add'>+#define GFAPI_PRIVATE(sym, ver)                                                \</div><div class='add'>+    __asm("_" __STRING(sym) "$GFAPI_PRIVATE_" __STRING(ver))</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+__BEGIN_DECLS</div><div class='add'>+</div><div class='add'>+/* The filesystem object. One object per 'virtual mount' */</div><div class='add'>+struct glfs;</div><div class='add'>+typedef struct glfs glfs_t;</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+  SYNOPSIS</div><div class='add'>+</div><div class='add'>+  glfs_new: Create a new 'virtual mount' object.</div><div class='add'>+</div><div class='add'>+  DESCRIPTION</div><div class='add'>+</div><div class='add'>+  This is most likely the very first function you will use. This function</div><div class='add'>+  will create a new glfs_t (virtual mount) object in memory.</div><div class='add'>+</div><div class='add'>+  On this newly created glfs_t, you need to be either set a volfile path</div><div class='add'>+  (glfs_set_volfile) or a volfile server (glfs_set_volfile_server).</div><div class='add'>+</div><div class='add'>+  The glfs_t object needs to be initialized with glfs_init() before you</div><div class='add'>+  can start issuing file operations on it.</div><div class='add'>+</div><div class='add'>+  PARAMETERS</div><div class='add'>+</div><div class='add'>+  @volname: Name of the volume. This identifies the server-side volume and</div><div class='add'>+            the fetched volfile (equivalent of --volfile-id command line</div><div class='add'>+            parameter to glusterfsd). When used with glfs_set_volfile() the</div><div class='add'>+            @volname has no effect (except for appearing in log messages).</div><div class='add'>+</div><div class='add'>+  RETURN VALUES</div><div class='add'>+</div><div class='add'>+  NULL   : Out of memory condition.</div><div class='add'>+  Others : Pointer to the newly created glfs_t virtual mount object.</div><div class='add'>+</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+glfs_t *</div><div class='add'>+glfs_new(const char *volname) __THROW GFAPI_PUBLIC(glfs_new, 3.4.0);</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+  SYNOPSIS</div><div class='add'>+</div><div class='add'>+  glfs_set_volfile: Specify the path to the volume specification file.</div><div class='add'>+</div><div class='add'>+  DESCRIPTION</div><div class='add'>+</div><div class='add'>+  If you are using a static volume specification file (without dynamic</div><div class='add'>+  volume management abilities from the CLI), then specify the path to</div><div class='add'>+  the volume specification file.</div><div class='add'>+</div><div class='add'>+  This is incompatible with glfs_set_volfile_server().</div><div class='add'>+</div><div class='add'>+  PARAMETERS</div><div class='add'>+</div><div class='add'>+  @fs: The 'virtual mount' object to be configured with the volume</div><div class='add'>+       specification file.</div><div class='add'>+</div><div class='add'>+  @volfile: Path to the locally available volume specification file.</div><div class='add'>+</div><div class='add'>+  RETURN VALUES</div><div class='add'>+</div><div class='add'>+   0 : Success.</div><div class='add'>+  -1 : Failure. @errno will be set with the type of failure.</div><div class='add'>+</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+glfs_set_volfile(glfs_t *fs, const char *volfile) __THROW</div><div class='add'>+    GFAPI_PUBLIC(glfs_set_volfile, 3.4.0);</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+  SYNOPSIS</div><div class='add'>+</div><div class='add'>+  glfs_set_volfile_server: Specify the list of addresses for management server.</div><div class='add'>+</div><div class='add'>+  DESCRIPTION</div><div class='add'>+</div><div class='add'>+  This function specifies the list of addresses for the management server</div><div class='add'>+  (glusterd) to connect, and establish the volume configuration. The @volname</div><div class='add'>+  parameter passed to glfs_new() is the volume which will be virtually</div><div class='add'>+  mounted as the glfs_t object. All operations performed by the CLI at</div><div class='add'>+  the management server will automatically be reflected in the 'virtual</div><div class='add'>+  mount' object as it maintains a connection to glusterd and polls on</div><div class='add'>+  configuration change notifications.</div><div class='add'>+</div><div class='add'>+  This is incompatible with glfs_set_volfile().</div><div class='add'>+</div><div class='add'>+  PARAMETERS</div><div class='add'>+</div><div class='add'>+  @fs: The 'virtual mount' object to be configured with the volume</div><div class='add'>+       specification file.</div><div class='add'>+</div><div class='add'>+  @transport: String specifying the transport used to connect to the</div><div class='add'>+              management daemon. Specifying NULL will result in the</div><div class='add'>+              usage of the default (tcp) transport type. Permitted</div><div class='add'>+              values are "tcp" or "unix".</div><div class='add'>+</div><div class='add'>+  @host:      String specifying the address where to find the management daemon.</div><div class='add'>+              Socket path, while using Unix domain socket as transport type.</div><div class='add'>+              This would either be</div><div class='add'>+              - FQDN (e.g : "storage01.company.com") or</div><div class='add'>+              - ASCII (e.g : "192.168.22.1") or</div><div class='add'>+              - Socket path (e.g : "/var/run/glusterd.socket")</div><div class='add'>+</div><div class='add'>+  NOTE: This API is special, multiple calls to this function with different</div><div class='add'>+        volfile servers, port or transport-type would create a list of volfile</div><div class='add'>+        servers which would be polled during `volfile_fetch_attempts()`</div><div class='add'>+</div><div class='add'>+  @port: The TCP port number where gluster management daemon is listening.</div><div class='add'>+         Specifying 0 uses the default port number GF_DEFAULT_BASE_PORT.</div><div class='add'>+         This parameter is unused if you are using a UNIX domain socket.</div><div class='add'>+</div><div class='add'>+  RETURN VALUES</div><div class='add'>+</div><div class='add'>+   0 : Success.</div><div class='add'>+  -1 : Failure. @errno will be set with the type of failure.</div><div class='add'>+</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+glfs_set_volfile_server(glfs_t *fs, const char *transport, const char *host,</div><div class='add'>+                        int port) __THROW</div><div class='add'>+    GFAPI_PUBLIC(glfs_set_volfile_server, 3.4.0);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+glfs_unset_volfile_server(glfs_t *fs, const char *transport, const char *host,</div><div class='add'>+                          int port) __THROW</div><div class='add'>+    GFAPI_PUBLIC(glfs_unset_volfile_server, 3.5.1);</div><div class='add'>+/*</div><div class='add'>+  SYNOPSIS</div><div class='add'>+</div><div class='add'>+  glfs_set_logging: Specify logging parameters.</div><div class='add'>+</div><div class='add'>+  DESCRIPTION</div><div class='add'>+</div><div class='add'>+  This function specifies logging parameters for the virtual mount.</div><div class='add'>+  Default log file is /dev/null.</div><div class='add'>+</div><div class='add'>+  PARAMETERS</div><div class='add'>+</div><div class='add'>+  @fs: The 'virtual mount' object to be configured with the logging parameters.</div><div class='add'>+</div><div class='add'>+  @logfile: The logfile to be used for logging. Will be created if it does not</div><div class='add'>+            already exist (provided system permissions allow). If NULL, a new</div><div class='add'>+            logfile will be created in default log directory associated with</div><div class='add'>+            the glusterfs installation.</div><div class='add'>+</div><div class='add'>+  @loglevel: Numerical value specifying the degree of verbosity. Higher the</div><div class='add'>+             value, more verbose the logging.</div><div class='add'>+</div><div class='add'>+  RETURN VALUES</div><div class='add'>+</div><div class='add'>+   0 : Success.</div><div class='add'>+  -1 : Failure. @errno will be set with the type of failure.</div><div class='add'>+</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+glfs_set_logging(glfs_t *fs, const char *logfile, int loglevel) __THROW</div><div class='add'>+    GFAPI_PUBLIC(glfs_set_logging, 3.4.0);</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+  SYNOPSIS</div><div class='add'>+</div><div class='add'>+  glfs_init: Initialize the 'virtual mount'</div><div class='add'>+</div><div class='add'>+  DESCRIPTION</div><div class='add'>+</div><div class='add'>+  This function initializes the glfs_t object. This consists of many steps:</div><div class='add'>+  - Spawn a poll-loop thread.</div><div class='add'>+  - Establish connection to management daemon and receive volume specification.</div><div class='add'>+  - Construct translator graph and initialize graph.</div><div class='add'>+  - Wait for initialization (connecting to all bricks) to complete.</div><div class='add'>+</div><div class='add'>+  PARAMETERS</div><div class='add'>+</div><div class='add'>+  @fs: The 'virtual mount' object to be initialized.</div><div class='add'>+</div><div class='add'>+  RETURN VALUES</div><div class='add'>+</div><div class='add'>+   0 : Success.</div><div class='add'>+  -1 : Failure. @errno will be set with the type of failure.</div><div class='add'>+</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+glfs_init(glfs_t *fs) __THROW GFAPI_PUBLIC(glfs_init, 3.4.0);</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+  SYNOPSIS</div><div class='add'>+</div><div class='add'>+  glfs_fini: Cleanup and destroy the 'virtual mount'</div><div class='add'>+</div><div class='add'>+  DESCRIPTION</div><div class='add'>+</div><div class='add'>+  This function attempts to gracefully destroy glfs_t object. An attempt is</div><div class='add'>+  made to wait for all background processing to complete before returning.</div><div class='add'>+</div><div class='add'>+  glfs_fini() must be called after all operations on glfs_t is finished.</div><div class='add'>+</div><div class='add'>+  IMPORTANT</div><div class='add'>+</div><div class='add'>+  IT IS NECESSARY TO CALL glfs_fini() ON ALL THE INITIALIZED glfs_t</div><div class='add'>+  OBJECTS BEFORE TERMINATING THE PROGRAM. THERE MAY BE CACHED AND</div><div class='add'>+  UNWRITTEN / INCOMPLETE OPERATIONS STILL IN PROGRESS EVEN THOUGH THE</div><div class='add'>+  API CALLS HAVE RETURNED. glfs_fini() WILL WAIT FOR BACKGROUND OPERATIONS</div><div class='add'>+  TO COMPLETE BEFORE RETURNING, THEREBY MAKING IT SAFE FOR THE PROGRAM TO</div><div class='add'>+  EXIT.</div><div class='add'>+</div><div class='add'>+  PARAMETERS</div><div class='add'>+</div><div class='add'>+  @fs: The 'virtual mount' object to be destroyed.</div><div class='add'>+</div><div class='add'>+  RETURN VALUES</div><div class='add'>+</div><div class='add'>+   0 : Success.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+glfs_fini(glfs_t *fs) __THROW GFAPI_PUBLIC(glfs_fini, 3.4.0);</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+  SYNOPSIS</div><div class='add'>+</div><div class='add'>+      glfs_getvol: Get the volfile associated with a 'virtual mount'</div><div class='add'>+</div><div class='add'>+  DESCRIPTION</div><div class='add'>+</div><div class='add'>+      Sometimes it's useful e.g. for scripts to see the volfile, so that they</div><div class='add'>+      can parse it and find subvolumes to do things like split-brain resolution</div><div class='add'>+      or custom layouts.  The API here was specifically intended to make access</div><div class='add'>+      e.g. from Python as simple as possible.</div><div class='add'>+</div><div class='add'>+      Note that the volume must be started (not necessarily mounted) for this</div><div class='add'>+      to work.</div><div class='add'>+</div><div class='add'>+  PARAMETERS</div><div class='add'>+</div><div class='add'>+      @fs:  The 'virtual mount' object for which a volfile is desired</div><div class='add'>+      @buf: Pointer to a place for the volfile length to be stored</div><div class='add'>+      @len: Length of @buf</div><div class='add'>+</div><div class='add'>+  RETURN VALUES</div><div class='add'>+</div><div class='add'>+      &gt;0: filled N bytes of buffer</div><div class='add'>+       0: no volfile available</div><div class='add'>+      &lt;0: volfile length exceeds @len by N bytes (@buf unchanged)</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+ssize_t</div><div class='add'>+glfs_get_volfile(glfs_t *fs, void *buf, size_t len) __THROW</div><div class='add'>+    GFAPI_PUBLIC(glfs_get_volfile, 3.6.0);</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+  SYNOPSIS</div><div class='add'>+</div><div class='add'>+       glfs_get_volumeid: Copy the Volume UUID stored in the glfs object fs.</div><div class='add'>+</div><div class='add'>+  DESCRIPTION</div><div class='add'>+</div><div class='add'>+       This function when invoked for the first time sends RPC call to the</div><div class='add'>+       the management server (glusterd) to fetch volume uuid and stores it</div><div class='add'>+       in the glusterfs_context linked to the glfs object fs which can be used</div><div class='add'>+       in the subsequent calls. Later it parses that UUID to convert it from</div><div class='add'>+       canonical string format into an opaque byte array and copy it into</div><div class='add'>+       the volid array. In case if either of the input parameters, volid or</div><div class='add'>+  size, is NULL, number of bytes required to copy the volume UUID is returned.</div><div class='add'>+</div><div class='add'>+  PARAMETERS</div><div class='add'>+</div><div class='add'>+       @fs: The 'virtual mount' object to be used to retrieve and store</div><div class='add'>+            volume's UUID.</div><div class='add'>+       @volid: Pointer to a place for the volume UUID to be stored</div><div class='add'>+       @size: Length of @volid</div><div class='add'>+</div><div class='add'>+  RETURN VALUES</div><div class='add'>+</div><div class='add'>+       -1 : Failure. @errno will be set with the type of failure.</div><div class='add'>+        Others : length of the volume UUID stored.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+glfs_get_volumeid(glfs_t *fs, char *volid, size_t size) __THROW</div><div class='add'>+    GFAPI_PUBLIC(glfs_get_volumeid, 3.5.0);</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+ * FILE OPERATION</div><div class='add'>+ *</div><div class='add'>+ * What follows are filesystem operations performed on the</div><div class='add'>+ * 'virtual mount'. The calls here are kept as close to</div><div class='add'>+ * the POSIX system calls as possible.</div><div class='add'>+ *</div><div class='add'>+ * Notes:</div><div class='add'>+ *</div><div class='add'>+ * - All paths specified, even if absolute, are relative to the</div><div class='add'>+ *   root of the virtual mount and not the system root (/).</div><div class='add'>+ *</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+/* The file descriptor object. One per open file/directory. */</div><div class='add'>+</div><div class='add'>+struct glfs_fd;</div><div class='add'>+typedef struct glfs_fd glfs_fd_t;</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+ * Mask for request/result items in the struct glfs_stat.</div><div class='add'>+ *</div><div class='add'>+ * Query request/result mask for glfs_stat() (family of functions) and</div><div class='add'>+ * struct glfs_stat::glfs_st_mask.</div><div class='add'>+ *</div><div class='add'>+ * These bits should be set in the mask argument of glfs_stat() (family of</div><div class='add'>+ * functions) to request particular items when calling glfs_stat().</div><div class='add'>+ *</div><div class='add'>+ * NOTE: Lower order 32 bits are used to reflect statx(2) bits. For Gluster</div><div class='add'>+ * specific attrs/extensions, use higher order 32 bits.</div><div class='add'>+ *</div><div class='add'>+ */</div><div class='add'>+#define GLFS_STAT_TYPE 0x0000000000000001U   /* Want/got stx_mode &amp; S_IFMT */</div><div class='add'>+#define GLFS_STAT_MODE 0x0000000000000002U   /* Want/got stx_mode &amp; ~S_IFMT */</div><div class='add'>+#define GLFS_STAT_NLINK 0x0000000000000004U  /* Want/got stx_nlink */</div><div class='add'>+#define GLFS_STAT_UID 0x0000000000000008U    /* Want/got stx_uid */</div><div class='add'>+#define GLFS_STAT_GID 0x0000000000000010U    /* Want/got stx_gid */</div><div class='add'>+#define GLFS_STAT_ATIME 0x0000000000000020U  /* Want/got stx_atime */</div><div class='add'>+#define GLFS_STAT_MTIME 0x0000000000000040U  /* Want/got stx_mtime */</div><div class='add'>+#define GLFS_STAT_CTIME 0x0000000000000080U  /* Want/got stx_ctime */</div><div class='add'>+#define GLFS_STAT_INO 0x0000000000000100U    /* Want/got stx_ino */</div><div class='add'>+#define GLFS_STAT_SIZE 0x0000000000000200U   /* Want/got stx_size */</div><div class='add'>+#define GLFS_STAT_BLOCKS 0x0000000000000400U /* Want/got stx_blocks */</div><div class='add'>+#define GLFS_STAT_BASIC_STATS                                                  \</div><div class='add'>+    0x00000000000007ffU /* Items in the normal stat struct */</div><div class='add'>+#define GLFS_STAT_BTIME 0x0000000000000800U /* Want/got stx_btime */</div><div class='add'>+#define GLFS_STAT_ALL 0x0000000000000fffU   /* All currently supported flags */</div><div class='add'>+#define GLFS_STAT_RESERVED                                                     \</div><div class='add'>+    0x8000000000000000U /* Reserved to denote future expansion */</div><div class='add'>+</div><div class='add'>+/* Macros for checking validity of struct glfs_stat members.*/</div><div class='add'>+#define GLFS_STAT_TYPE_VALID(stmask) (stmask &amp; GLFS_STAT_TYPE)</div><div class='add'>+#define GLFS_STAT_MODE_VALID(stmask) (stmask &amp; GLFS_STAT_MODE)</div><div class='add'>+#define GLFS_STAT_NLINK_VALID(stmask) (stmask &amp; GLFS_STAT_NLINK)</div><div class='add'>+#define GLFS_STAT_UID_VALID(stmask) (stmask &amp; GLFS_STAT_UID)</div><div class='add'>+#define GLFS_STAT_GID_VALID(stmask) (stmask &amp; GLFS_STAT_GID)</div><div class='add'>+#define GLFS_STAT_ATIME_VALID(stmask) (stmask &amp; GLFS_STAT_ATIME)</div><div class='add'>+#define GLFS_STAT_MTIME_VALID(stmask) (stmask &amp; GLFS_STAT_MTIME)</div><div class='add'>+#define GLFS_STAT_CTIME_VALID(stmask) (stmask &amp; GLFS_STAT_CTIME)</div><div class='add'>+#define GLFS_STAT_INO_VALID(stmask) (stmask &amp; GLFS_STAT_INO)</div><div class='add'>+#define GLFS_STAT_SIZE_VALID(stmask) (stmask &amp; GLFS_STAT_SIZE)</div><div class='add'>+#define GLFS_STAT_BLOCKS_VALID(stmask) (stmask &amp; GLFS_STAT_BLOCKS)</div><div class='add'>+#define GLFS_STAT_BTIME_VALID(stmask) (stmask &amp; GLFS_STAT_BTIME)</div><div class='add'>+#define GLFS_STAT_GFID_VALID(stmask) (stmask &amp; GLFS_STAT_GFID)</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+ * Attributes to be found in glfs_st_attributes and masked in</div><div class='add'>+ * glfs_st_attributes_mask.</div><div class='add'>+ *</div><div class='add'>+ * These give information about the features or the state of a file that might</div><div class='add'>+ * be of use to programs.</div><div class='add'>+ *</div><div class='add'>+ * NOTE: Lower order 32 bits are used to reflect statx(2) attribute bits. For</div><div class='add'>+ * Gluster specific attrs, use higher order 32 bits.</div><div class='add'>+ *</div><div class='add'>+ * NOTE: We do not support any file attributes or state as yet!</div><div class='add'>+ */</div><div class='add'>+#define GLFS_STAT_ATTR_RESERVED                                                \</div><div class='add'>+    0x8000000000000000U /* Reserved to denote future expansion */</div><div class='add'>+</div><div class='add'>+/* Extended file attribute structure.</div><div class='add'>+ *</div><div class='add'>+ * The caller passes a mask of what they're specifically interested in as a</div><div class='add'>+ * parameter to glfs_stat().  What glfs_stat() actually got will be indicated</div><div class='add'>+ * in glfs_st_mask upon return.</div><div class='add'>+ *</div><div class='add'>+ * For each bit in the mask argument:</div><div class='add'>+ *</div><div class='add'>+ * - if the datum is not supported:</div><div class='add'>+ *</div><div class='add'>+ *   - the bit will be cleared, and</div><div class='add'>+ *</div><div class='add'>+ *   - the datum value is undefined</div><div class='add'>+ *</div><div class='add'>+ * - otherwise, if explicitly requested:</div><div class='add'>+ *</div><div class='add'>+ *   - the field will be filled in and the bit will be set;</div><div class='add'>+ *</div><div class='add'>+ * - otherwise, if not requested, but available in, it will be filled in</div><div class='add'>+ * anyway, and the bit will be set upon return;</div><div class='add'>+ *</div><div class='add'>+ * - otherwise the field and the bit will be cleared before returning.</div><div class='add'>+ *</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+struct glfs_stat {</div><div class='add'>+    uint64_t glfs_st_mask;       /* What results were written [uncond] */</div><div class='add'>+    uint64_t glfs_st_attributes; /* Flags conveying information about the file</div><div class='add'>+                                    [uncond] */</div><div class='add'>+    uint64_t glfs_st_attributes_mask; /* Mask to show what's supported in</div><div class='add'>+                                         st_attributes [ucond] */</div><div class='add'>+    struct timespec glfs_st_atime;    /* Last access time */</div><div class='add'>+    struct timespec glfs_st_btime;    /* File creation time */</div><div class='add'>+    struct timespec glfs_st_ctime;    /* Last attribute change time */</div><div class='add'>+    struct timespec glfs_st_mtime;    /* Last data modification time */</div><div class='add'>+    ino_t glfs_st_ino;                /* Inode number */</div><div class='add'>+    off_t glfs_st_size;               /* File size */</div><div class='add'>+    blkcnt_t glfs_st_blocks;          /* Number of 512-byte blocks allocated */</div><div class='add'>+    uint32_t glfs_st_rdev_major; /* Device ID of special file [if bdev/cdev] */</div><div class='add'>+    uint32_t glfs_st_rdev_minor;</div><div class='add'>+    uint32_t glfs_st_dev_major; /* ID of device containing file [uncond] */</div><div class='add'>+    uint32_t glfs_st_dev_minor;</div><div class='add'>+    blksize_t glfs_st_blksize; /* Preferred general I/O size [uncond] */</div><div class='add'>+    nlink_t glfs_st_nlink;     /* Number of hard links */</div><div class='add'>+    uid_t glfs_st_uid;         /* User ID of owner */</div><div class='add'>+    gid_t glfs_st_gid;         /* Group ID of owner */</div><div class='add'>+    mode_t glfs_st_mode;       /* File mode */</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+#define GLFS_LEASE_ID_SIZE 16 /* 128bits */</div><div class='add'>+typedef char glfs_leaseid_t[GLFS_LEASE_ID_SIZE];</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+ * PER THREAD IDENTITY MODIFIERS</div><div class='add'>+ *</div><div class='add'>+ * The following operations enable to set a per thread identity context</div><div class='add'>+ * for the glfs APIs to perform operations as. The calls here are kept as close</div><div class='add'>+ * to POSIX equivalents as possible.</div><div class='add'>+ *</div><div class='add'>+ * NOTES:</div><div class='add'>+ *</div><div class='add'>+ *  - setgroups is a per thread setting, hence this is named as fsgroups to be</div><div class='add'>+ *    close in naming to the fs(u/g)id APIs</div><div class='add'>+ *  - Typical mode of operation is to set the IDs as required, with the</div><div class='add'>+ *    supplementary groups being optionally set, make the glfs call and post the</div><div class='add'>+ *    glfs operation set them back to eu/gid or uid/gid as appropriate to the</div><div class='add'>+ *    caller</div><div class='add'>+ *  - The groups once set, need to be unset by setting the size to 0 (in which</div><div class='add'>+ *    case the list argument is a do not care)</div><div class='add'>+ *  - In case of leases feature enables, setfsleaseid is used to set and reset</div><div class='add'>+ *    leaseid before and after every I/O operation.</div><div class='add'>+ *  - Once a process for a thread of operation choses to set the IDs, all glfs</div><div class='add'>+ *    calls made from that thread would default to the IDs set for the thread.</div><div class='add'>+ *    As a result use these APIs with care and ensure that the set IDs are</div><div class='add'>+ *    reverted to global process defaults as required.</div><div class='add'>+ *</div><div class='add'>+ */</div><div class='add'>+int</div><div class='add'>+glfs_setfsuid(uid_t fsuid) __THROW GFAPI_PUBLIC(glfs_setfsuid, 3.4.2);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+glfs_setfsgid(gid_t fsgid) __THROW GFAPI_PUBLIC(glfs_setfsgid, 3.4.2);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+glfs_setfsgroups(size_t size, const gid_t *list) __THROW</div><div class='add'>+    GFAPI_PUBLIC(glfs_setfsgroups, 3.4.2);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+glfs_setfsleaseid(glfs_leaseid_t leaseid) __THROW</div><div class='add'>+    GFAPI_PUBLIC(glfs_setfsleaseid, 4.0.0);</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+  SYNOPSIS</div><div class='add'>+</div><div class='add'>+  glfs_open: Open a file.</div><div class='add'>+</div><div class='add'>+  DESCRIPTION</div><div class='add'>+</div><div class='add'>+  This function opens a file on a virtual mount.</div><div class='add'>+</div><div class='add'>+  PARAMETERS</div><div class='add'>+</div><div class='add'>+  @fs: The 'virtual mount' object to be initialized.</div><div class='add'>+</div><div class='add'>+  @path: Path of the file within the virtual mount.</div><div class='add'>+</div><div class='add'>+  @flags: Open flags. See open(2). O_CREAT is not supported.</div><div class='add'>+          Use glfs_creat() for creating files.</div><div class='add'>+</div><div class='add'>+  RETURN VALUES</div><div class='add'>+</div><div class='add'>+  NULL   : Failure. @errno will be set with the type of failure.</div><div class='add'>+  Others : Pointer to the opened glfs_fd_t.</div><div class='add'>+</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+glfs_fd_t *</div><div class='add'>+glfs_open(glfs_t *fs, const char *path, int flags) __THROW</div><div class='add'>+    GFAPI_PUBLIC(glfs_open, 3.4.0);</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+  SYNOPSIS</div><div class='add'>+</div><div class='add'>+  glfs_creat: Create a file.</div><div class='add'>+</div><div class='add'>+  DESCRIPTION</div><div class='add'>+</div><div class='add'>+  This function opens a file on a virtual mount.</div><div class='add'>+</div><div class='add'>+  PARAMETERS</div><div class='add'>+</div><div class='add'>+  @fs: The 'virtual mount' object to be initialized.</div><div class='add'>+</div><div class='add'>+  @path: Path of the file within the virtual mount.</div><div class='add'>+</div><div class='add'>+  @mode: Permission of the file to be created.</div><div class='add'>+</div><div class='add'>+  @flags: Create flags. See open(2). O_EXCL is supported.</div><div class='add'>+</div><div class='add'>+  RETURN VALUES</div><div class='add'>+</div><div class='add'>+  NULL   : Failure. @errno will be set with the type of failure.</div><div class='add'>+  Others : Pointer to the opened glfs_fd_t.</div><div class='add'>+</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+glfs_fd_t *</div><div class='add'>+glfs_creat(glfs_t *fs, const char *path, int flags, mode_t mode) __THROW</div><div class='add'>+    GFAPI_PUBLIC(glfs_creat, 3.4.0);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+glfs_close(glfs_fd_t *fd) __THROW GFAPI_PUBLIC(glfs_close, 3.4.0);</div><div class='add'>+</div><div class='add'>+glfs_t *</div><div class='add'>+glfs_from_glfd(glfs_fd_t *fd) __THROW GFAPI_PUBLIC(glfs_from_glfd, 3.4.0);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+glfs_set_xlator_option(glfs_t *fs, const char *xlator, const char *key,</div><div class='add'>+                       const char *value) __THROW</div><div class='add'>+    GFAPI_PUBLIC(glfs_set_xlator_option, 3.4.0);</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+</div><div class='add'>+  glfs_io_cbk</div><div class='add'>+</div><div class='add'>+  The following is the function type definition of the callback</div><div class='add'>+  function pointer which has to be provided by the caller to the</div><div class='add'>+  *_async() versions of the IO calls.</div><div class='add'>+</div><div class='add'>+  The callback function is called on completion of the requested</div><div class='add'>+  IO, and the appropriate return value is returned in @ret.</div><div class='add'>+</div><div class='add'>+  In case of an error in completing the IO, @ret will be -1 and</div><div class='add'>+  @errno will be set with the appropriate error.</div><div class='add'>+</div><div class='add'>+  @ret will be same as the return value of the non _async() variant</div><div class='add'>+  of the particular call</div><div class='add'>+</div><div class='add'>+  @data is the same context pointer provided by the caller at the</div><div class='add'>+  time of issuing the async IO call. This can be used by the</div><div class='add'>+  caller to differentiate different instances of the async requests</div><div class='add'>+  in a common callback function.</div><div class='add'>+</div><div class='add'>+  @prestat and @poststat are allocated on the stack, that are auto destroyed</div><div class='add'>+  post the callback function returns.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+typedef void (*glfs_io_cbk)(glfs_fd_t *fd, ssize_t ret,</div><div class='add'>+                            struct glfs_stat *prestat,</div><div class='add'>+                            struct glfs_stat *poststat, void *data);</div><div class='add'>+</div><div class='add'>+// glfs_{read,write}[_async]</div><div class='add'>+</div><div class='add'>+ssize_t</div><div class='add'>+glfs_read(glfs_fd_t *fd, void *buf, size_t count, int flags) __THROW</div><div class='add'>+    GFAPI_PUBLIC(glfs_read, 3.4.0);</div><div class='add'>+</div><div class='add'>+ssize_t</div><div class='add'>+glfs_write(glfs_fd_t *fd, const void *buf, size_t count, int flags) __THROW</div><div class='add'>+    GFAPI_PUBLIC(glfs_write, 3.4.0);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+glfs_read_async(glfs_fd_t *fd, void *buf, size_t count, int flags,</div><div class='add'>+                glfs_io_cbk fn, void *data) __THROW</div><div class='add'>+    GFAPI_PUBLIC(glfs_read_async, 6.0);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+glfs_write_async(glfs_fd_t *fd, const void *buf, size_t count, int flags,</div><div class='add'>+                 glfs_io_cbk fn, void *data) __THROW</div><div class='add'>+    GFAPI_PUBLIC(glfs_write_async, 6.0);</div><div class='add'>+</div><div class='add'>+// glfs_{read,write}v[_async]</div><div class='add'>+</div><div class='add'>+ssize_t</div><div class='add'>+glfs_readv(glfs_fd_t *fd, const struct iovec *iov, int iovcnt,</div><div class='add'>+           int flags) __THROW GFAPI_PUBLIC(glfs_readv, 3.4.0);</div><div class='add'>+</div><div class='add'>+ssize_t</div><div class='add'>+glfs_writev(glfs_fd_t *fd, const struct iovec *iov, int iovcnt,</div><div class='add'>+            int flags) __THROW GFAPI_PUBLIC(glfs_writev, 3.4.0);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+glfs_readv_async(glfs_fd_t *fd, const struct iovec *iov, int count, int flags,</div><div class='add'>+                 glfs_io_cbk fn, void *data) __THROW</div><div class='add'>+    GFAPI_PUBLIC(glfs_readv_async, 6.0);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+glfs_writev_async(glfs_fd_t *fd, const struct iovec *iov, int count, int flags,</div><div class='add'>+                  glfs_io_cbk fn, void *data) __THROW</div><div class='add'>+    GFAPI_PUBLIC(glfs_writev_async, 6.0);</div><div class='add'>+</div><div class='add'>+// glfs_p{read,write}[_async]</div><div class='add'>+</div><div class='add'>+ssize_t</div><div class='add'>+glfs_pread(glfs_fd_t *fd, void *buf, size_t count, off_t offset, int flags,</div><div class='add'>+           struct glfs_stat *poststat) __THROW GFAPI_PUBLIC(glfs_pread, 6.0);</div><div class='add'>+</div><div class='add'>+ssize_t</div><div class='add'>+glfs_pwrite(glfs_fd_t *fd, const void *buf, size_t count, off_t offset,</div><div class='add'>+            int flags, struct glfs_stat *prestat,</div><div class='add'>+            struct glfs_stat *poststat) __THROW GFAPI_PUBLIC(glfs_pwrite, 6.0);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+glfs_pread_async(glfs_fd_t *fd, void *buf, size_t count, off_t offset,</div><div class='add'>+                 int flags, glfs_io_cbk fn, void *data) __THROW</div><div class='add'>+    GFAPI_PUBLIC(glfs_pread_async, 6.0);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+glfs_pwrite_async(glfs_fd_t *fd, const void *buf, int count, off_t offset,</div><div class='add'>+                  int flags, glfs_io_cbk fn, void *data) __THROW</div><div class='add'>+    GFAPI_PUBLIC(glfs_pwrite_async, 6.0);</div><div class='add'>+</div><div class='add'>+// glfs_p{read,write}v[_async]</div><div class='add'>+</div><div class='add'>+ssize_t</div><div class='add'>+glfs_preadv(glfs_fd_t *fd, const struct iovec *iov, int iovcnt, off_t offset,</div><div class='add'>+            int flags) __THROW GFAPI_PUBLIC(glfs_preadv, 3.4.0);</div><div class='add'>+</div><div class='add'>+ssize_t</div><div class='add'>+glfs_pwritev(glfs_fd_t *fd, const struct iovec *iov, int iovcnt, off_t offset,</div><div class='add'>+             int flags) __THROW GFAPI_PUBLIC(glfs_pwritev, 3.4.0);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+glfs_preadv_async(glfs_fd_t *fd, const struct iovec *iov, int count,</div><div class='add'>+                  off_t offset, int flags, glfs_io_cbk fn, void *data) __THROW</div><div class='add'>+    GFAPI_PUBLIC(glfs_preadv_async, 6.0);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+glfs_pwritev_async(glfs_fd_t *fd, const struct iovec *iov, int count,</div><div class='add'>+                   off_t offset, int flags, glfs_io_cbk fn, void *data) __THROW</div><div class='add'>+    GFAPI_PUBLIC(glfs_pwritev_async, 6.0);</div><div class='add'>+</div><div class='add'>+off_t</div><div class='add'>+glfs_lseek(glfs_fd_t *fd, off_t offset, int whence) __THROW</div><div class='add'>+    GFAPI_PUBLIC(glfs_lseek, 3.4.0);</div><div class='add'>+</div><div class='add'>+ssize_t</div><div class='add'>+glfs_copy_file_range(struct glfs_fd *glfd_in, off64_t *off_in,</div><div class='add'>+                     struct glfs_fd *glfd_out, off64_t *off_out, size_t len,</div><div class='add'>+                     unsigned int flags, struct glfs_stat *statbuf,</div><div class='add'>+                     struct glfs_stat *prestat,</div><div class='add'>+                     struct glfs_stat *poststat) __THROW</div><div class='add'>+    GFAPI_PUBLIC(glfs_copy_file_range, 6.0);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+glfs_truncate(glfs_t *fs, const char *path, off_t length) __THROW</div><div class='add'>+    GFAPI_PUBLIC(glfs_truncate, 3.7.15);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+glfs_ftruncate(glfs_fd_t *fd, off_t length, struct glfs_stat *prestat,</div><div class='add'>+               struct glfs_stat *poststat) __THROW</div><div class='add'>+    GFAPI_PUBLIC(glfs_ftruncate, 6.0);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+glfs_ftruncate_async(glfs_fd_t *fd, off_t length, glfs_io_cbk fn,</div><div class='add'>+                     void *data) __THROW</div><div class='add'>+    GFAPI_PUBLIC(glfs_ftruncate_async, 6.0);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+glfs_lstat(glfs_t *fs, const char *path, struct stat *buf) __THROW</div><div class='add'>+    GFAPI_PUBLIC(glfs_lstat, 3.4.0);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+glfs_stat(glfs_t *fs, const char *path, struct stat *buf) __THROW</div><div class='add'>+    GFAPI_PUBLIC(glfs_stat, 3.4.0);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+glfs_fstat(glfs_fd_t *fd, struct stat *buf) __THROW</div><div class='add'>+    GFAPI_PUBLIC(glfs_fstat, 3.4.0);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+glfs_fsync(glfs_fd_t *fd, struct glfs_stat *prestat,</div><div class='add'>+           struct glfs_stat *poststat) __THROW GFAPI_PUBLIC(glfs_fsync, 6.0);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+glfs_fsync_async(glfs_fd_t *fd, glfs_io_cbk fn, void *data) __THROW</div><div class='add'>+    GFAPI_PUBLIC(glfs_fsync_async, 6.0);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+glfs_fdatasync(glfs_fd_t *fd, struct glfs_stat *prestat,</div><div class='add'>+               struct glfs_stat *poststat) __THROW</div><div class='add'>+    GFAPI_PUBLIC(glfs_fdatasync, 6.0);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+glfs_fdatasync_async(glfs_fd_t *fd, glfs_io_cbk fn, void *data) __THROW</div><div class='add'>+    GFAPI_PUBLIC(glfs_fdatasync_async, 6.0);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+glfs_access(glfs_t *fs, const char *path, int mode) __THROW</div><div class='add'>+    GFAPI_PUBLIC(glfs_access, 3.4.0);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+glfs_symlink(glfs_t *fs, const char *oldpath, const char *newpath) __THROW</div><div class='add'>+    GFAPI_PUBLIC(glfs_symlink, 3.4.0);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+glfs_readlink(glfs_t *fs, const char *path, char *buf, size_t bufsiz) __THROW</div><div class='add'>+    GFAPI_PUBLIC(glfs_readlink, 3.4.0);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+glfs_mknod(glfs_t *fs, const char *path, mode_t mode, dev_t dev) __THROW</div><div class='add'>+    GFAPI_PUBLIC(glfs_mknod, 3.4.0);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+glfs_mkdir(glfs_t *fs, const char *path, mode_t mode) __THROW</div><div class='add'>+    GFAPI_PUBLIC(glfs_mkdir, 3.4.0);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+glfs_unlink(glfs_t *fs, const char *path) __THROW</div><div class='add'>+    GFAPI_PUBLIC(glfs_unlink, 3.4.0);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+glfs_rmdir(glfs_t *fs, const char *path) __THROW</div><div class='add'>+    GFAPI_PUBLIC(glfs_rmdir, 3.4.0);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+glfs_rename(glfs_t *fs, const char *oldpath, const char *newpath) __THROW</div><div class='add'>+    GFAPI_PUBLIC(glfs_rename, 3.4.0);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+glfs_link(glfs_t *fs, const char *oldpath, const char *newpath) __THROW</div><div class='add'>+    GFAPI_PUBLIC(glfs_link, 3.4.0);</div><div class='add'>+</div><div class='add'>+glfs_fd_t *</div><div class='add'>+glfs_opendir(glfs_t *fs, const char *path) __THROW</div><div class='add'>+    GFAPI_PUBLIC(glfs_opendir, 3.4.0);</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+ * @glfs_readdir_r and @glfs_readdirplus_r ARE thread safe AND re-entrant,</div><div class='add'>+ * but the interface has ambiguity about the size of @dirent to be allocated</div><div class='add'>+ * before calling the APIs. 512 byte buffer (for @dirent) is sufficient for</div><div class='add'>+ * all known systems which are tested againt glusterfs/gfapi, but may be</div><div class='add'>+ * insufficient in the future.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+glfs_readdir_r(glfs_fd_t *fd, struct dirent *dirent,</div><div class='add'>+               struct dirent **result) __THROW</div><div class='add'>+    GFAPI_PUBLIC(glfs_readdir_r, 3.4.0);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+glfs_readdirplus_r(glfs_fd_t *fd, struct stat *stat, struct dirent *dirent,</div><div class='add'>+                   struct dirent **result) __THROW</div><div class='add'>+    GFAPI_PUBLIC(glfs_readdirplus_r, 3.4.0);</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+ * @glfs_readdir and @glfs_readdirplus are NEITHER thread safe NOR re-entrant</div><div class='add'>+ * when called on the same directory handle. However they ARE thread safe</div><div class='add'>+ * AND re-entrant when called on different directory handles (which may be</div><div class='add'>+ * referring to the same directory too.)</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+struct dirent *</div><div class='add'>+glfs_readdir(glfs_fd_t *fd) __THROW GFAPI_PUBLIC(glfs_readdir, 3.5.0);</div><div class='add'>+</div><div class='add'>+struct dirent *</div><div class='add'>+glfs_readdirplus(glfs_fd_t *fd, struct stat *stat) __THROW</div><div class='add'>+    GFAPI_PUBLIC(glfs_readdirplus, 3.5.0);</div><div class='add'>+</div><div class='add'>+long</div><div class='add'>+glfs_telldir(glfs_fd_t *fd) __THROW GFAPI_PUBLIC(glfs_telldir, 3.4.0);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+glfs_seekdir(glfs_fd_t *fd, long offset) __THROW</div><div class='add'>+    GFAPI_PUBLIC(glfs_seekdir, 3.4.0);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+glfs_closedir(glfs_fd_t *fd) __THROW GFAPI_PUBLIC(glfs_closedir, 3.4.0);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+glfs_statvfs(glfs_t *fs, const char *path, struct statvfs *buf) __THROW</div><div class='add'>+    GFAPI_PUBLIC(glfs_statvfs, 3.4.0);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+glfs_chmod(glfs_t *fs, const char *path, mode_t mode) __THROW</div><div class='add'>+    GFAPI_PUBLIC(glfs_chmod, 3.4.0);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+glfs_fchmod(glfs_fd_t *fd, mode_t mode) __THROW</div><div class='add'>+    GFAPI_PUBLIC(glfs_fchmod, 3.4.0);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+glfs_chown(glfs_t *fs, const char *path, uid_t uid, gid_t gid) __THROW</div><div class='add'>+    GFAPI_PUBLIC(glfs_chown, 3.4.0);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+glfs_lchown(glfs_t *fs, const char *path, uid_t uid, gid_t gid) __THROW</div><div class='add'>+    GFAPI_PUBLIC(glfs_lchown, 3.4.0);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+glfs_fchown(glfs_fd_t *fd, uid_t uid, gid_t gid) __THROW</div><div class='add'>+    GFAPI_PUBLIC(glfs_fchown, 3.4.0);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+glfs_utimens(glfs_t *fs, const char *path,</div><div class='add'>+             const struct timespec times[2]) __THROW</div><div class='add'>+    GFAPI_PUBLIC(glfs_utimens, 3.4.0);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+glfs_lutimens(glfs_t *fs, const char *path,</div><div class='add'>+              const struct timespec times[2]) __THROW</div><div class='add'>+    GFAPI_PUBLIC(glfs_lutimens, 3.4.0);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+glfs_futimens(glfs_fd_t *fd, const struct timespec times[2]) __THROW</div><div class='add'>+    GFAPI_PUBLIC(glfs_futimens, 3.4.0);</div><div class='add'>+</div><div class='add'>+ssize_t</div><div class='add'>+glfs_getxattr(glfs_t *fs, const char *path, const char *name, void *value,</div><div class='add'>+              size_t size) __THROW GFAPI_PUBLIC(glfs_getxattr, 3.4.0);</div><div class='add'>+</div><div class='add'>+ssize_t</div><div class='add'>+glfs_lgetxattr(glfs_t *fs, const char *path, const char *name, void *value,</div><div class='add'>+               size_t size) __THROW GFAPI_PUBLIC(glfs_lgetxattr, 3.4.0);</div><div class='add'>+</div><div class='add'>+ssize_t</div><div class='add'>+glfs_fgetxattr(glfs_fd_t *fd, const char *name, void *value,</div><div class='add'>+               size_t size) __THROW GFAPI_PUBLIC(glfs_fgetxattr, 3.4.0);</div><div class='add'>+</div><div class='add'>+ssize_t</div><div class='add'>+glfs_listxattr(glfs_t *fs, const char *path, void *value, size_t size) __THROW</div><div class='add'>+    GFAPI_PUBLIC(glfs_listxattr, 3.4.0);</div><div class='add'>+</div><div class='add'>+ssize_t</div><div class='add'>+glfs_llistxattr(glfs_t *fs, const char *path, void *value, size_t size) __THROW</div><div class='add'>+    GFAPI_PUBLIC(glfs_llistxattr, 3.4.0);</div><div class='add'>+</div><div class='add'>+ssize_t</div><div class='add'>+glfs_flistxattr(glfs_fd_t *fd, void *value, size_t size) __THROW</div><div class='add'>+    GFAPI_PUBLIC(glfs_flistxattr, 3.4.0);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+glfs_setxattr(glfs_t *fs, const char *path, const char *name, const void *value,</div><div class='add'>+              size_t size, int flags) __THROW</div><div class='add'>+    GFAPI_PUBLIC(glfs_setxattr, 3.4.0);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+glfs_lsetxattr(glfs_t *fs, const char *path, const char *name,</div><div class='add'>+               const void *value, size_t size, int flags) __THROW</div><div class='add'>+    GFAPI_PUBLIC(glfs_lsetxattr, 3.4.0);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+glfs_fsetxattr(glfs_fd_t *fd, const char *name, const void *value, size_t size,</div><div class='add'>+               int flags) __THROW GFAPI_PUBLIC(glfs_fsetxattr, 3.4.0);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+glfs_removexattr(glfs_t *fs, const char *path, const char *name) __THROW</div><div class='add'>+    GFAPI_PUBLIC(glfs_removexattr, 3.4.0);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+glfs_lremovexattr(glfs_t *fs, const char *path, const char *name) __THROW</div><div class='add'>+    GFAPI_PUBLIC(glfs_lremovexattr, 3.4.0);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+glfs_fremovexattr(glfs_fd_t *fd, const char *name) __THROW</div><div class='add'>+    GFAPI_PUBLIC(glfs_fremovexattr, 3.4.0);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+glfs_fallocate(glfs_fd_t *fd, int keep_size, off_t offset, size_t len) __THROW</div><div class='add'>+    GFAPI_PUBLIC(glfs_fallocate, 3.5.0);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+glfs_discard(glfs_fd_t *fd, off_t offset, size_t len) __THROW</div><div class='add'>+    GFAPI_PUBLIC(glfs_discard, 3.5.0);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+glfs_discard_async(glfs_fd_t *fd, off_t length, size_t lent, glfs_io_cbk fn,</div><div class='add'>+                   void *data) __THROW GFAPI_PUBLIC(glfs_discard_async, 6.0);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+glfs_zerofill(glfs_fd_t *fd, off_t offset, off_t len) __THROW</div><div class='add'>+    GFAPI_PUBLIC(glfs_zerofill, 3.5.0);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+glfs_zerofill_async(glfs_fd_t *fd, off_t length, off_t len, glfs_io_cbk fn,</div><div class='add'>+                    void *data) __THROW GFAPI_PUBLIC(glfs_zerofill_async, 6.0);</div><div class='add'>+</div><div class='add'>+char *</div><div class='add'>+glfs_getcwd(glfs_t *fs, char *buf, size_t size) __THROW</div><div class='add'>+    GFAPI_PUBLIC(glfs_getcwd, 3.4.0);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+glfs_chdir(glfs_t *fs, const char *path) __THROW</div><div class='add'>+    GFAPI_PUBLIC(glfs_chdir, 3.4.0);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+glfs_fchdir(glfs_fd_t *fd) __THROW GFAPI_PUBLIC(glfs_fchdir, 3.4.0);</div><div class='add'>+</div><div class='add'>+char *</div><div class='add'>+glfs_realpath(glfs_t *fs, const char *path, char *resolved_path) __THROW</div><div class='add'>+    GFAPI_PUBLIC(glfs_realpath, 3.7.17);</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+ * @cmd and @flock are as specified in man fcntl(2).</div><div class='add'>+ */</div><div class='add'>+int</div><div class='add'>+glfs_posix_lock(glfs_fd_t *fd, int cmd, struct flock *flock) __THROW</div><div class='add'>+    GFAPI_PUBLIC(glfs_posix_lock, 3.4.0);</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+  SYNOPSIS</div><div class='add'>+</div><div class='add'>+  glfs_file_lock: Request extended byte range lock on a file</div><div class='add'>+</div><div class='add'>+  DESCRIPTION</div><div class='add'>+</div><div class='add'>+  This function is capable of requesting either advisory or mandatory type</div><div class='add'>+  byte range locks on a file.</div><div class='add'>+</div><div class='add'>+  Note: To set a unique owner key for locks based on a particular file</div><div class='add'>+  descriptor, make use of glfs_fd_set_lkowner() api to do so before</div><div class='add'>+  requesting lock via this api. This owner key will be further consumed</div><div class='add'>+  by other incoming data modifying file operations via the same file</div><div class='add'>+  descriptor.</div><div class='add'>+</div><div class='add'>+  PARAMETERS</div><div class='add'>+</div><div class='add'>+  @fd: File descriptor</div><div class='add'>+</div><div class='add'>+  @cmd: As specified in man fcntl(2).</div><div class='add'>+</div><div class='add'>+  @flock: As specified in man fcntl(2).</div><div class='add'>+</div><div class='add'>+  @lk_mode: Required lock type from options available with the</div><div class='add'>+            enum glfs_lock_mode_t defined below.</div><div class='add'>+</div><div class='add'>+  RETURN VALUES</div><div class='add'>+</div><div class='add'>+  0   : Success. Lock has been granted.</div><div class='add'>+  -1  : Failure. @errno will be set indicating the type of failure.</div><div class='add'>+</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+/* Lock modes used by glfs_file_lock() */</div><div class='add'>+enum glfs_lock_mode { GLFS_LK_ADVISORY = 0, GLFS_LK_MANDATORY };</div><div class='add'>+typedef enum glfs_lock_mode glfs_lock_mode_t;</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+glfs_file_lock(glfs_fd_t *fd, int cmd, struct flock *flock,</div><div class='add'>+               glfs_lock_mode_t lk_mode) __THROW</div><div class='add'>+    GFAPI_PUBLIC(glfs_file_lock, 3.13.0);</div><div class='add'>+</div><div class='add'>+glfs_fd_t *</div><div class='add'>+glfs_dup(glfs_fd_t *fd) __THROW GFAPI_PUBLIC(glfs_dup, 3.4.0);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+glfs_free(void *ptr) __THROW GFAPI_PUBLIC(glfs_free, 3.7.16);</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+ * glfs_sysrq: send a system request to the @fs instance</div><div class='add'>+ *</div><div class='add'>+ * Different commands for @sysrq are possible, the defines for these are listed</div><div class='add'>+ * below the function definition.</div><div class='add'>+ *</div><div class='add'>+ * This function always returns success if the @sysrq is recognized. The return</div><div class='add'>+ * value does not way anythin about the result of the @sysrq execution. Not all</div><div class='add'>+ * @sysrq command will be able to return a success/failure status.</div><div class='add'>+ */</div><div class='add'>+int</div><div class='add'>+glfs_sysrq(glfs_t *fs, char sysrq) __THROW GFAPI_PUBLIC(glfs_sysrq, 3.10.0);</div><div class='add'>+</div><div class='add'>+#define GLFS_SYSRQ_HELP 'h' /* log a message with supported sysrq commands */</div><div class='add'>+#define GLFS_SYSRQ_STATEDUMP 's' /* create a statedump */</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+ * Structure returned as part of xreaddirplus</div><div class='add'>+ */</div><div class='add'>+struct glfs_xreaddirp_stat;</div><div class='add'>+typedef struct glfs_xreaddirp_stat glfs_xreaddirp_stat_t;</div><div class='add'>+</div><div class='add'>+/* Request flags to be used in XREADDIRP operation */</div><div class='add'>+#define GFAPI_XREADDIRP_NULL                                                   \</div><div class='add'>+    0x00000000 /* by default, no stat will be fetched */</div><div class='add'>+#define GFAPI_XREADDIRP_STAT 0x00000001   /* Get stat */</div><div class='add'>+#define GFAPI_XREADDIRP_HANDLE 0x00000002 /* Get object handle */</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+ * This stat structure returned gets freed as part of glfs_free(xstat)</div><div class='add'>+ */</div><div class='add'>+struct stat *</div><div class='add'>+glfs_xreaddirplus_get_stat(glfs_xreaddirp_stat_t *xstat) __THROW</div><div class='add'>+    GFAPI_PUBLIC(glfs_xreaddirplus_get_stat, 3.11.0);</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+ * SYNOPSIS</div><div class='add'>+ *</div><div class='add'>+ * glfs_xreaddirplus_r: Extended Readirplus operation</div><div class='add'>+ *</div><div class='add'>+ * DESCRIPTION</div><div class='add'>+ *</div><div class='add'>+ * This API does readdirplus operation, but along with stat it can fetch other</div><div class='add'>+ * extra information like object handles etc for each of the dirents returned</div><div class='add'>+ * based on requested flags. On success it returns the set of flags successfully</div><div class='add'>+ * processed.</div><div class='add'>+ *</div><div class='add'>+ * Note that there are chances that some of the requested information may not be</div><div class='add'>+ * available or returned (for example if reached EOD). Ensure to validate the</div><div class='add'>+ * returned value to determine what flags have been successfully processed</div><div class='add'>+ * &amp; set.</div><div class='add'>+ *</div><div class='add'>+ * PARAMETERS</div><div class='add'>+ *</div><div class='add'>+ * INPUT:</div><div class='add'>+ * @glfd: GFAPI file descriptor of the directory</div><div class='add'>+ * @flags: Flags determining xreaddirp_stat requested</div><div class='add'>+ *         Current available values are:</div><div class='add'>+ *              GFAPI_XREADDIRP_NULL</div><div class='add'>+ *              GFAPI_XREADDIRP_STAT</div><div class='add'>+ *              GFAPI_XREADDIRP_HANDLE</div><div class='add'>+ * @ext: Dirent struture to copy the values to</div><div class='add'>+ *       (though optional recommended to be allocated by application</div><div class='add'>+ *        esp., in multi-threaded environment)</div><div class='add'>+ *</div><div class='add'>+ * OUTPUT:</div><div class='add'>+ * @res: to store the next dirent value. If NULL and return value is '0',</div><div class='add'>+ *       it means it reached end of the directory.</div><div class='add'>+ * @xstat_p: Pointer to contain all the requested data returned</div><div class='add'>+ *           for that dirent. Application should make use of glfs_free() API</div><div class='add'>+ *           to free this pointer and the variables returned by</div><div class='add'>+ *           glfs_xreaddirplus_get_*() APIs.</div><div class='add'>+ *</div><div class='add'>+ * RETURN VALUE:</div><div class='add'>+ * &gt;=0: SUCCESS (value contains the flags successfully processed)</div><div class='add'>+ *  -1: FAILURE</div><div class='add'>+ */</div><div class='add'>+int</div><div class='add'>+glfs_xreaddirplus_r(glfs_fd_t *glfd, uint32_t flags,</div><div class='add'>+                    glfs_xreaddirp_stat_t **xstat_p, struct dirent *ext,</div><div class='add'>+                    struct dirent **res) __THROW</div><div class='add'>+    GFAPI_PUBLIC(glfs_xreaddirplus_r, 3.11.0);</div><div class='add'>+</div><div class='add'>+#define GFAPI_MAX_LOCK_OWNER_LEN 255</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+ *</div><div class='add'>+ * DESCRIPTION</div><div class='add'>+ *</div><div class='add'>+ * This API allows application to set lk_owner on a fd.</div><div class='add'>+ * A glfd can be associated with only single lk_owner. In case if there</div><div class='add'>+ * is need to set another lk_owner, applications can make use of</div><div class='add'>+ * 'glfs_dup' to get duplicate glfd and set new lk_owner on that second</div><div class='add'>+ * glfd.</div><div class='add'>+ *</div><div class='add'>+ * Also its not recommended to override or clear lk_owner value as the</div><div class='add'>+ * same shall be used to flush any outstanding locks while closing the fd.</div><div class='add'>+ *</div><div class='add'>+ * PARAMETERS</div><div class='add'>+ *</div><div class='add'>+ * INPUT:</div><div class='add'>+ * @glfd: GFAPI file descriptor</div><div class='add'>+ * @len: Size of lk_owner buffer. Max value can be GFAPI_MAX_LOCK_OWNER_LEN</div><div class='add'>+ * @data: lk_owner data buffer.</div><div class='add'>+ *</div><div class='add'>+ * OUTPUT:</div><div class='add'>+ * 0: SUCCESS</div><div class='add'>+ * -1: FAILURE</div><div class='add'>+ */</div><div class='add'>+int</div><div class='add'>+glfs_fd_set_lkowner(glfs_fd_t *glfd, void *data, int len) __THROW</div><div class='add'>+    GFAPI_PUBLIC(glfs_fd_set_lkowner, 3.10.7);</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+ * Applications (currently NFS-Ganesha) can make use of this</div><div class='add'>+ * structure to read upcall notifications sent by server either</div><div class='add'>+ * by polling or registering a callback function.</div><div class='add'>+ *</div><div class='add'>+ * On success, applications need to check for 'reason' to decide</div><div class='add'>+ * if any upcall event is received.</div><div class='add'>+ *</div><div class='add'>+ * Currently supported upcall_events -</div><div class='add'>+ *      GLFS_UPCALL_INODE_INVALIDATE -</div><div class='add'>+ *              'event_arg' - glfs_upcall_inode</div><div class='add'>+ *</div><div class='add'>+ * After processing the event, applications need to free 'event_arg' with</div><div class='add'>+ * glfs_free().</div><div class='add'>+ *</div><div class='add'>+ * Also similar to I/Os, the application should ideally stop polling</div><div class='add'>+ * or unregister upcall_cbk function before calling glfs_fini(..).</div><div class='add'>+ * Hence making an assumption that 'fs' &amp; ctx structures cannot be</div><div class='add'>+ * freed while in this routine.</div><div class='add'>+ */</div><div class='add'>+struct glfs_upcall;</div><div class='add'>+typedef struct glfs_upcall glfs_upcall_t;</div><div class='add'>+</div><div class='add'>+glfs_t *</div><div class='add'>+glfs_upcall_get_fs(glfs_upcall_t *arg) __THROW</div><div class='add'>+    GFAPI_PUBLIC(glfs_upcall_get_fs, 3.7.16);</div><div class='add'>+</div><div class='add'>+enum glfs_upcall_reason {</div><div class='add'>+    GLFS_UPCALL_EVENT_NULL = 0,</div><div class='add'>+    GLFS_UPCALL_INODE_INVALIDATE, /* invalidate cache entry */</div><div class='add'>+    GLFS_UPCALL_RECALL_LEASE,     /* recall lease */</div><div class='add'>+};</div><div class='add'>+typedef enum glfs_upcall_reason glfs_upcall_reason_t;</div><div class='add'>+</div><div class='add'>+glfs_upcall_reason_t</div><div class='add'>+glfs_upcall_get_reason(glfs_upcall_t *arg) __THROW</div><div class='add'>+    GFAPI_PUBLIC(glfs_upcall_get_reason, 3.7.16);</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+ * Applications first need to make use of above API i.e,</div><div class='add'>+ * "glfs_upcall_get_reason" to determine which upcall event it has</div><div class='add'>+ * received. Post that below API - "glfs_upcall_get_event" should</div><div class='add'>+ * be used to get corresponding upcall event object.</div><div class='add'>+ *</div><div class='add'>+ * Below are the upcall_reason and corresponding upcall_event objects:</div><div class='add'>+ *      ==========================================================</div><div class='add'>+ *      glfs_upcall_reason           -    event_object</div><div class='add'>+ *      ==========================================================</div><div class='add'>+ *      GLFS_UPCALL_EVENT_NULL       -    NULL</div><div class='add'>+ *      GLFS_UPCALL_INODE_INVALIDATE -    struct glfs_upcall_inode</div><div class='add'>+ *      GLFS_UPCALL_RECALL_LEASE     -    struct glfs_upcall_lease</div><div class='add'>+ *</div><div class='add'>+ * After processing upcall event, glfs_free() should be called on the</div><div class='add'>+ * glfs_upcall.</div><div class='add'>+ */</div><div class='add'>+void *</div><div class='add'>+glfs_upcall_get_event(glfs_upcall_t *arg) __THROW</div><div class='add'>+    GFAPI_PUBLIC(glfs_upcall_get_event, 3.7.16);</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+ * SYNOPSIS</div><div class='add'>+ *</div><div class='add'>+ * glfs_upcall_cbk: Upcall callback definition</div><div class='add'>+ *</div><div class='add'>+ * This is function type definition of the callback function pointer</div><div class='add'>+ * which has to be provided by the caller while registering for any</div><div class='add'>+ * upcall events.</div><div class='add'>+ *</div><div class='add'>+ * This function is called whenever any upcall which the application</div><div class='add'>+ * has registered for is received from the server.</div><div class='add'>+ *</div><div class='add'>+ * @up_arg: Upcall structure whose contents need to be interpreted by</div><div class='add'>+ * making use of glfs_upcall_* helper routines.</div><div class='add'>+ *</div><div class='add'>+ * @data: The same context pointer provided by the caller at the time of</div><div class='add'>+ * registering of upcall events. This may be used by the caller for any</div><div class='add'>+ * of its internal use while processing upcalls.</div><div class='add'>+ */</div><div class='add'>+typedef void (*glfs_upcall_cbk)(glfs_upcall_t *up_arg, void *data);</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+ * List of upcall events supported by gluster/gfapi</div><div class='add'>+ */</div><div class='add'>+#define GLFS_EVENT_INODE_INVALIDATE 0x00000001 /* invalidate cache entry */</div><div class='add'>+#define GLFS_EVENT_RECALL_LEASE 0x00000002     /* Recall lease */</div><div class='add'>+#define GLFS_EVENT_ANY 0xffffffff              /* for all the above events */</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+ * SYNOPSIS</div><div class='add'>+ *</div><div class='add'>+ * glfs_upcall_register: Register for upcall events</div><div class='add'>+ *</div><div class='add'>+ * DESCRIPTION</div><div class='add'>+ *</div><div class='add'>+ * This function is used to register for various upcall events application</div><div class='add'>+ * is interested in and the callback function to be invoked when such</div><div class='add'>+ * events are triggered.</div><div class='add'>+ *</div><div class='add'>+ * Multiple calls of this routine shall override cbk function. That means</div><div class='add'>+ * only one cbk function can be used for all the upcall events registered</div><div class='add'>+ * and that shall be the one last updated.</div><div class='add'>+ *</div><div class='add'>+ * PARAMETERS:</div><div class='add'>+ *</div><div class='add'>+ * INPUT:</div><div class='add'>+ * @fs: The 'virtual mount' object</div><div class='add'>+ *</div><div class='add'>+ * @event_list: List of upcall events to be registered.</div><div class='add'>+ *              Current available values are:</div><div class='add'>+ *               - GLFS_EVENT_INODE_INVALIDATE</div><div class='add'>+ *               - GLFS_EVENT_RECALL_LEASE</div><div class='add'>+ *</div><div class='add'>+ * @cbk: The cbk routine to be invoked in case of any upcall received</div><div class='add'>+ * @data: Any opaque pointer provided by caller which shall be using while</div><div class='add'>+ * making cbk calls. This pointer may be used by caller for any of its</div><div class='add'>+ * internal use while processing upcalls. Can be NULL.</div><div class='add'>+ *</div><div class='add'>+ * RETURN VALUE:</div><div class='add'>+ * &gt;0: SUCCESS (value contains the events successfully registered)</div><div class='add'>+ * -1: FAILURE</div><div class='add'>+ */</div><div class='add'>+int</div><div class='add'>+glfs_upcall_register(glfs_t *fs, uint32_t event_list, glfs_upcall_cbk cbk,</div><div class='add'>+                     void *data) __THROW</div><div class='add'>+    GFAPI_PUBLIC(glfs_upcall_register, 3.13.0);</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+ * SYNOPSIS</div><div class='add'>+ *</div><div class='add'>+ * glfs_upcall_unregister: Unregister for upcall events</div><div class='add'>+ *</div><div class='add'>+ * DESCRIPTION</div><div class='add'>+ *</div><div class='add'>+ * This function is used to unregister the upcall events application</div><div class='add'>+ * is not interested in. In case if the caller unregisters all the events</div><div class='add'>+ * it has registered for, it shall no more receive any upcall event.</div><div class='add'>+ *</div><div class='add'>+ * PARAMETERS:</div><div class='add'>+ *</div><div class='add'>+ * INPUT:</div><div class='add'>+ * @fs: The 'virtual mount' object</div><div class='add'>+ *</div><div class='add'>+ * @event_list: List of upcall events to be unregistered.</div><div class='add'>+ *              Current available values are:</div><div class='add'>+ *               - GLFS_EVENT_INODE_INVALIDATE</div><div class='add'>+ *               - GLFS_EVENT_RECALL_LEASE</div><div class='add'>+ * RETURN VALUE:</div><div class='add'>+ * &gt;0: SUCCESS (value contains the events successfully unregistered)</div><div class='add'>+ * -1: FAILURE</div><div class='add'>+ */</div><div class='add'>+int</div><div class='add'>+glfs_upcall_unregister(glfs_t *fs, uint32_t event_list) __THROW</div><div class='add'>+    GFAPI_PUBLIC(glfs_upcall_unregister, 3.13.0);</div><div class='add'>+</div><div class='add'>+/* Lease Types */</div><div class='add'>+enum glfs_lease_types {</div><div class='add'>+    GLFS_LEASE_NONE = 0,</div><div class='add'>+    GLFS_RD_LEASE = 1,</div><div class='add'>+    GLFS_RW_LEASE = 2,</div><div class='add'>+};</div><div class='add'>+typedef enum glfs_lease_types glfs_lease_types_t;</div><div class='add'>+</div><div class='add'>+/* Lease cmds */</div><div class='add'>+enum glfs_lease_cmds {</div><div class='add'>+    GLFS_GET_LEASE = 1,</div><div class='add'>+    GLFS_SET_LEASE = 2,</div><div class='add'>+    GLFS_UNLK_LEASE = 3,</div><div class='add'>+};</div><div class='add'>+typedef enum glfs_lease_cmds glfs_lease_cmds_t;</div><div class='add'>+</div><div class='add'>+struct glfs_lease {</div><div class='add'>+    glfs_lease_cmds_t cmd;</div><div class='add'>+    glfs_lease_types_t lease_type;</div><div class='add'>+    glfs_leaseid_t lease_id;</div><div class='add'>+    unsigned int lease_flags;</div><div class='add'>+};</div><div class='add'>+typedef struct glfs_lease glfs_lease_t;</div><div class='add'>+</div><div class='add'>+typedef void (*glfs_recall_cbk)(glfs_lease_t lease, void *data);</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+  SYNOPSIS</div><div class='add'>+</div><div class='add'>+  glfs_lease: Takes a lease on a file.</div><div class='add'>+</div><div class='add'>+  DESCRIPTION</div><div class='add'>+</div><div class='add'>+  This function takes lease on an open file.</div><div class='add'>+</div><div class='add'>+  PARAMETERS</div><div class='add'>+</div><div class='add'>+  @glfd: The fd of the file on which lease should be taken,</div><div class='add'>+   this fd is returned by glfs_open/glfs_create.</div><div class='add'>+</div><div class='add'>+  @lease: Struct that defines the lease operation to be performed</div><div class='add'>+   on the file.</div><div class='add'>+      @lease.cmd - Can be one of the following values</div><div class='add'>+         GF_GET_LEASE:  Get the lease type currently present on the file,</div><div class='add'>+                        lease.lease_type will contain GF_RD_LEASE</div><div class='add'>+                        or GF_RW_LEASE or 0 if no leases.</div><div class='add'>+         GF_SET_LEASE:  Set the lease of given lease.lease_type on the file.</div><div class='add'>+         GF_UNLK_LEASE: Unlock the lease present on the given fd.</div><div class='add'>+                        Note that the every lease request should have</div><div class='add'>+                        a corresponding unlk_lease.</div><div class='add'>+</div><div class='add'>+      @lease.lease_type - Can be one of the following values</div><div class='add'>+         GF_RD_LEASE:   Read lease on a file, shared lease.</div><div class='add'>+         GF_RW_LEASE:   Read-Write lease on a file, exclusive lease.</div><div class='add'>+</div><div class='add'>+      @lease.lease_id - A unique identification of lease, 128bits.</div><div class='add'>+</div><div class='add'>+  @fn: This is the function that is invoked when the lease has to be recalled</div><div class='add'>+  @data: It is a cookie, this pointer is returned as a part of recall</div><div class='add'>+</div><div class='add'>+  fn and data field are stored as a part of glfs_fd, hence if there are multiple</div><div class='add'>+  glfs_lease calls, each of them updates the fn and data fields. glfs_recall_cbk</div><div class='add'>+  will be invoked with the last updated fn and data</div><div class='add'>+</div><div class='add'>+  RETURN VALUES</div><div class='add'>+  0:  Successful completion</div><div class='add'>+  &lt;0: Failure. @errno will be set with the type of failure</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+glfs_lease(glfs_fd_t *glfd, glfs_lease_t *lease, glfs_recall_cbk fn,</div><div class='add'>+           void *data) __THROW GFAPI_PUBLIC(glfs_lease, 4.0.0);</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+  SYNOPSIS</div><div class='add'>+</div><div class='add'>+  glfs_fsetattr: Function to set attributes.</div><div class='add'>+  glfs_setattr: Function to set attributes</div><div class='add'>+</div><div class='add'>+  DESCRIPTION</div><div class='add'>+</div><div class='add'>+  The functions are used to set attributes on the file.</div><div class='add'>+</div><div class='add'>+  PARAMETERS</div><div class='add'>+</div><div class='add'>+  @glfs_fsetattr</div><div class='add'>+</div><div class='add'>+     @glfd: The fd of the file for which the attributes are to be set,</div><div class='add'>+            this fd is returned by glfs_open/glfs_create.</div><div class='add'>+</div><div class='add'>+  @glfs_setattr</div><div class='add'>+</div><div class='add'>+         @fs: File object.</div><div class='add'>+</div><div class='add'>+         @path: The path of the file that is being operated on.</div><div class='add'>+</div><div class='add'>+         @follow: Flag used to resolve symlink.</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+  @stat: Struct that has information about the file.</div><div class='add'>+</div><div class='add'>+  @valid: This is the mask bit, that accepts GFAPI_SET_ATTR* masks.</div><div class='add'>+          Refer glfs.h to see the mask definitions.</div><div class='add'>+</div><div class='add'>+  Both functions are similar in functionality, just that the</div><div class='add'>+  func setattr() uses file path whereas the func fsetattr()</div><div class='add'>+  uses the fd.</div><div class='add'>+</div><div class='add'>+  RETURN VALUES</div><div class='add'>+  0:  Successful completion</div><div class='add'>+  &lt;0: Failure. @errno will be set with the type of failure</div><div class='add'>+</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+glfs_fsetattr(struct glfs_fd *glfd, struct glfs_stat *stat) __THROW</div><div class='add'>+    GFAPI_PUBLIC(glfs_fsetattr, 6.0);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+glfs_setattr(struct glfs *fs, const char *path, struct glfs_stat *stat,</div><div class='add'>+             int follow) __THROW GFAPI_PUBLIC(glfs_setattr, 6.0);</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+  SYNOPSIS</div><div class='add'>+</div><div class='add'>+  glfs_set_statedump_path: Function to set statedump path.</div><div class='add'>+</div><div class='add'>+  DESCRIPTION</div><div class='add'>+</div><div class='add'>+  This function is used to set statedump directory</div><div class='add'>+</div><div class='add'>+  PARAMETERS</div><div class='add'>+</div><div class='add'>+  @fs: The 'virtual mount' object to be configured with the volume</div><div class='add'>+       specification file.</div><div class='add'>+</div><div class='add'>+  @path: statedump path. Should be a directory. But the API won't fail if the</div><div class='add'>+  directory doesn't exist yet, as one may create it later.</div><div class='add'>+</div><div class='add'>+  RETURN VALUES</div><div class='add'>+</div><div class='add'>+   0 : Success.</div><div class='add'>+  -1 : Failure. @errno will be set with the type of failure.</div><div class='add'>+</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+glfs_set_statedump_path(struct glfs *fs, const char *path) __THROW</div><div class='add'>+    GFAPI_PUBLIC(glfs_set_statedump_path, 7.0);</div><div class='add'>+</div><div class='add'>+__END_DECLS</div><div class='add'>+#endif /* !_GLFS_H */</div><div class='head'>diff --git a/argp-standalone/Makefile.am b/argp-standalone/Makefile.am<br/>deleted file mode 100644<br/>index 4775d4876aa..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/argp-standalone/Makefile.am?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>argp-standalone/Makefile.am</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,38 +0,0 @@</div><div class='del'>-# From glibc</div><div class='del'>-</div><div class='del'>-# Copyright (C) 1997, 2003, 2004 Free Software Foundation, Inc.</div><div class='del'>-# This file is part of the GNU C Library.</div><div class='del'>-</div><div class='del'>-# The GNU C Library is free software; you can redistribute it and/or</div><div class='del'>-# modify it under the terms of the GNU Library General Public License as</div><div class='del'>-# published by the Free Software Foundation; either version 2 of the</div><div class='del'>-# License, or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-# The GNU C Library is distributed in the hope that it will be useful,</div><div class='del'>-# but WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-# Library General Public License for more details.</div><div class='del'>-</div><div class='del'>-# You should have received a copy of the GNU Library General Public</div><div class='del'>-# License along with the GNU C Library; see the file COPYING.LIB.  If</div><div class='del'>-# not, write to the Free Software Foundation, Inc.,</div><div class='del'>-# 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.</div><div class='del'>-AUTOMAKE_OPTIONS = foreign</div><div class='del'>-SUBDIRS = .</div><div class='del'>-</div><div class='del'>-LIBOBJS = @LIBOBJS@</div><div class='del'>-</div><div class='del'>-noinst_LIBRARIES = libargp.a</div><div class='del'>-</div><div class='del'>-noinst_HEADERS = argp.h argp-fmtstream.h argp-namefrob.h</div><div class='del'>-</div><div class='del'>-EXTRA_DIST = mempcpy.c strchrnul.c strndup.c strcasecmp.c vsnprintf.c autogen.sh</div><div class='del'>-</div><div class='del'>-# Leaves out argp-fs-xinl.c and argp-xinl.c </div><div class='del'>-libargp_a_SOURCES = argp-ba.c argp-eexst.c argp-fmtstream.c \</div><div class='del'>-		    argp-help.c argp-parse.c argp-pv.c \</div><div class='del'>-		    argp-pvh.c</div><div class='del'>-</div><div class='del'>-libargp_a_LIBADD = $(LIBOBJS)</div><div class='del'>-</div><div class='del'>-</div><div class='head'>diff --git a/argp-standalone/acinclude.m4 b/argp-standalone/acinclude.m4<br/>deleted file mode 100644<br/>index fb61e957dfa..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/argp-standalone/acinclude.m4?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>argp-standalone/acinclude.m4</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,1084 +0,0 @@</div><div class='del'>-dnl Try to detect the type of the third arg to getsockname() et al</div><div class='del'>-AC_DEFUN([LSH_TYPE_SOCKLEN_T],</div><div class='del'>-[AH_TEMPLATE([socklen_t], [Length type used by getsockopt])</div><div class='del'>-AC_CACHE_CHECK([for socklen_t in sys/socket.h], ac_cv_type_socklen_t,</div><div class='del'>-[AC_EGREP_HEADER(socklen_t, sys/socket.h,</div><div class='del'>-  [ac_cv_type_socklen_t=yes], [ac_cv_type_socklen_t=no])])</div><div class='del'>-if test $ac_cv_type_socklen_t = no; then</div><div class='del'>-        AC_MSG_CHECKING(for AIX)</div><div class='del'>-        AC_EGREP_CPP(yes, [</div><div class='del'>-#ifdef _AIX</div><div class='del'>- yes</div><div class='del'>-#endif</div><div class='del'>-],[</div><div class='del'>-AC_MSG_RESULT(yes)</div><div class='del'>-AC_DEFINE(socklen_t, size_t)</div><div class='del'>-],[</div><div class='del'>-AC_MSG_RESULT(no)</div><div class='del'>-AC_DEFINE(socklen_t, int)</div><div class='del'>-])</div><div class='del'>-fi</div><div class='del'>-])</div><div class='del'>-</div><div class='del'>-dnl Choose cc flags for compiling position independent code</div><div class='del'>-AC_DEFUN([LSH_CCPIC],</div><div class='del'>-[AC_MSG_CHECKING(CCPIC)</div><div class='del'>-AC_CACHE_VAL(lsh_cv_sys_ccpic,[</div><div class='del'>-  if test -z "$CCPIC" ; then</div><div class='del'>-    if test "$GCC" = yes ; then</div><div class='del'>-      case `uname -sr` in</div><div class='del'>-	BSD/OS*)</div><div class='del'>-         case `uname -r` in</div><div class='del'>-           4.*) CCPIC="-fPIC";;</div><div class='del'>-           *) CCPIC="";;</div><div class='del'>-         esac</div><div class='del'>-	;;</div><div class='del'>-	Darwin*)</div><div class='del'>-	  CCPIC="-fPIC"</div><div class='del'>-	;;</div><div class='del'>-	SunOS\ 5.*)</div><div class='del'>-	  # Could also use -fPIC, if there are a large number of symbol reference</div><div class='del'>-	  CCPIC="-fPIC"</div><div class='del'>-	;;</div><div class='del'>-	CYGWIN*)</div><div class='del'>-	  CCPIC=""</div><div class='del'>-	;;</div><div class='del'>-	*)</div><div class='del'>-	  CCPIC="-fpic"</div><div class='del'>-	;;</div><div class='del'>-      esac</div><div class='del'>-    else</div><div class='del'>-      case `uname -sr` in</div><div class='del'>-	Darwin*)</div><div class='del'>-	  CCPIC="-fPIC"</div><div class='del'>-	;;</div><div class='del'>-        IRIX*)</div><div class='del'>-          CCPIC="-share"</div><div class='del'>-        ;;</div><div class='del'>-	hp*|HP*) CCPIC="+z"; ;;</div><div class='del'>-	FreeBSD*) CCPIC="-fpic";;</div><div class='del'>-	SCO_SV*) CCPIC="-KPIC -dy -Bdynamic";;</div><div class='del'>-        UnixWare*|OpenUNIX*) CCPIC="-KPIC -dy -Bdynamic";;</div><div class='del'>-	Solaris*) CCPIC="-KPIC -Bdynamic";;</div><div class='del'>-	Windows_NT*) CCPIC="-shared" ;;</div><div class='del'>-      esac</div><div class='del'>-    fi</div><div class='del'>-  fi</div><div class='del'>-  OLD_CFLAGS="$CFLAGS"</div><div class='del'>-  CFLAGS="$CFLAGS $CCPIC"</div><div class='del'>-  AC_TRY_COMPILE([], [exit(0);],</div><div class='del'>-    lsh_cv_sys_ccpic="$CCPIC", lsh_cv_sys_ccpic='')</div><div class='del'>-  CFLAGS="$OLD_CFLAGS"</div><div class='del'>-])</div><div class='del'>-CCPIC="$lsh_cv_sys_ccpic"</div><div class='del'>-AC_MSG_RESULT($CCPIC)</div><div class='del'>-AC_SUBST([CCPIC])])</div><div class='del'>-</div><div class='del'>-dnl LSH_PATH_ADD(path-id, directory)</div><div class='del'>-AC_DEFUN([LSH_PATH_ADD],</div><div class='del'>-[AC_MSG_CHECKING($2)</div><div class='del'>-ac_exists=no</div><div class='del'>-if test -d "$2/." ; then</div><div class='del'>-  ac_real_dir=`cd $2 &amp;&amp; pwd`</div><div class='del'>-  if test -n "$ac_real_dir" ; then</div><div class='del'>-    ac_exists=yes</div><div class='del'>-    for old in $1_REAL_DIRS ; do</div><div class='del'>-      ac_found=no</div><div class='del'>-      if test x$ac_real_dir = x$old ; then</div><div class='del'>-        ac_found=yes;</div><div class='del'>-	break;</div><div class='del'>-      fi</div><div class='del'>-    done</div><div class='del'>-    if test $ac_found = yes ; then</div><div class='del'>-      AC_MSG_RESULT(already added)</div><div class='del'>-    else</div><div class='del'>-      AC_MSG_RESULT(added)</div><div class='del'>-      # LDFLAGS="$LDFLAGS -L $2"</div><div class='del'>-      $1_REAL_DIRS="$ac_real_dir [$]$1_REAL_DIRS"</div><div class='del'>-      $1_DIRS="$2 [$]$1_DIRS"</div><div class='del'>-    fi</div><div class='del'>-  fi</div><div class='del'>-fi</div><div class='del'>-if test $ac_exists = no ; then</div><div class='del'>-  AC_MSG_RESULT(not found)</div><div class='del'>-fi</div><div class='del'>-])</div><div class='del'>-</div><div class='del'>-dnl LSH_RPATH_ADD(dir)</div><div class='del'>-AC_DEFUN([LSH_RPATH_ADD], [LSH_PATH_ADD(RPATH_CANDIDATE, $1)])</div><div class='del'>-</div><div class='del'>-dnl LSH_RPATH_INIT(candidates)</div><div class='del'>-AC_DEFUN([LSH_RPATH_INIT],</div><div class='del'>-[AC_MSG_CHECKING([for -R flag])</div><div class='del'>-RPATHFLAG=''</div><div class='del'>-case `uname -sr` in</div><div class='del'>-  OSF1\ V4.*)</div><div class='del'>-    RPATHFLAG="-rpath "</div><div class='del'>-    ;;</div><div class='del'>-  IRIX\ 6.*)</div><div class='del'>-    RPATHFLAG="-rpath "</div><div class='del'>-    ;;</div><div class='del'>-  IRIX\ 5.*)</div><div class='del'>-    RPATHFLAG="-rpath "</div><div class='del'>-    ;;</div><div class='del'>-  SunOS\ 5.*)</div><div class='del'>-    if test "$TCC" = "yes"; then</div><div class='del'>-      # tcc doesn't know about -R</div><div class='del'>-      RPATHFLAG="-Wl,-R,"</div><div class='del'>-    else</div><div class='del'>-      RPATHFLAG=-R</div><div class='del'>-    fi</div><div class='del'>-    ;;</div><div class='del'>-  Linux\ 2.*)</div><div class='del'>-    RPATHFLAG="-Wl,-rpath,"</div><div class='del'>-    ;;</div><div class='del'>-  *)</div><div class='del'>-    :</div><div class='del'>-    ;;</div><div class='del'>-esac</div><div class='del'>-</div><div class='del'>-if test x$RPATHFLAG = x ; then</div><div class='del'>-  AC_MSG_RESULT(none)</div><div class='del'>-else</div><div class='del'>-  AC_MSG_RESULT([using $RPATHFLAG])</div><div class='del'>-fi</div><div class='del'>-</div><div class='del'>-RPATH_CANDIDATE_REAL_DIRS=''</div><div class='del'>-RPATH_CANDIDATE_DIRS=''</div><div class='del'>-</div><div class='del'>-AC_MSG_RESULT([Searching for libraries])</div><div class='del'>-</div><div class='del'>-for d in $1 ; do</div><div class='del'>-  LSH_RPATH_ADD($d)</div><div class='del'>-done</div><div class='del'>-])    </div><div class='del'>-</div><div class='del'>-dnl Try to execute a main program, and if it fails, try adding some</div><div class='del'>-dnl -R flag.</div><div class='del'>-dnl LSH_RPATH_FIX</div><div class='del'>-AC_DEFUN([LSH_RPATH_FIX],</div><div class='del'>-[if test $cross_compiling = no -a "x$RPATHFLAG" != x ; then</div><div class='del'>-  ac_success=no</div><div class='del'>-  AC_TRY_RUN([int main(int argc, char **argv) { return 0; }],</div><div class='del'>-    ac_success=yes, ac_success=no, :)</div><div class='del'>-  </div><div class='del'>-  if test $ac_success = no ; then</div><div class='del'>-    AC_MSG_CHECKING([Running simple test program failed. Trying -R flags])</div><div class='del'>-dnl echo RPATH_CANDIDATE_DIRS = $RPATH_CANDIDATE_DIRS</div><div class='del'>-    ac_remaining_dirs=''</div><div class='del'>-    ac_rpath_save_LDFLAGS="$LDFLAGS"</div><div class='del'>-    for d in $RPATH_CANDIDATE_DIRS ; do</div><div class='del'>-      if test $ac_success = yes ; then</div><div class='del'>-  	ac_remaining_dirs="$ac_remaining_dirs $d"</div><div class='del'>-      else</div><div class='del'>-  	LDFLAGS="$RPATHFLAG$d $LDFLAGS"</div><div class='del'>-dnl echo LDFLAGS = $LDFLAGS</div><div class='del'>-  	AC_TRY_RUN([int main(int argc, char **argv) { return 0; }],</div><div class='del'>-  	  [ac_success=yes</div><div class='del'>-  	  ac_rpath_save_LDFLAGS="$LDFLAGS"</div><div class='del'>-  	  AC_MSG_RESULT([adding $RPATHFLAG$d])</div><div class='del'>-  	  ],</div><div class='del'>-  	  [ac_remaining_dirs="$ac_remaining_dirs $d"], :)</div><div class='del'>-  	LDFLAGS="$ac_rpath_save_LDFLAGS"</div><div class='del'>-      fi</div><div class='del'>-    done</div><div class='del'>-    RPATH_CANDIDATE_DIRS=$ac_remaining_dirs</div><div class='del'>-  fi</div><div class='del'>-  if test $ac_success = no ; then</div><div class='del'>-    AC_MSG_RESULT(failed)</div><div class='del'>-  fi</div><div class='del'>-fi</div><div class='del'>-])</div><div class='del'>-</div><div class='del'>-dnl Like AC_CHECK_LIB, but uses $KRB_LIBS rather than $LIBS.</div><div class='del'>-dnl LSH_CHECK_KRB_LIB(LIBRARY, FUNCTION, [, ACTION-IF-FOUND [,</div><div class='del'>-dnl                  ACTION-IF-NOT-FOUND [, OTHER-LIBRARIES]]])</div><div class='del'>-</div><div class='del'>-AC_DEFUN([LSH_CHECK_KRB_LIB],</div><div class='del'>-[AC_CHECK_LIB([$1], [$2],</div><div class='del'>-  ifelse([$3], ,</div><div class='del'>-      [[ac_tr_lib=HAVE_LIB`echo $1 | sed -e 's/[^a-zA-Z0-9_]/_/g' \</div><div class='del'>-     	    -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'`</div><div class='del'>-        AC_DEFINE_UNQUOTED($ac_tr_lib)</div><div class='del'>-        KRB_LIBS="-l$1 $KRB_LIBS"</div><div class='del'>-      ]], [$3]),</div><div class='del'>-  ifelse([$4], , , [$4</div><div class='del'>-])dnl</div><div class='del'>-, [$5 $KRB_LIBS])</div><div class='del'>-])</div><div class='del'>-</div><div class='del'>-dnl LSH_LIB_ARGP(ACTION-IF-OK, ACTION-IF-BAD)</div><div class='del'>-AC_DEFUN([LSH_LIB_ARGP],</div><div class='del'>-[ ac_argp_save_LIBS="$LIBS"</div><div class='del'>-  ac_argp_save_LDFLAGS="$LDFLAGS"</div><div class='del'>-  ac_argp_ok=no</div><div class='del'>-  # First check if we can link with argp.</div><div class='del'>-  AC_SEARCH_LIBS(argp_parse, argp,</div><div class='del'>-  [ LSH_RPATH_FIX</div><div class='del'>-    AC_CACHE_CHECK([for working argp],</div><div class='del'>-      lsh_cv_lib_argp_works,</div><div class='del'>-      [ AC_TRY_RUN(</div><div class='del'>-[#include &lt;argp.h&gt;</div><div class='del'>-#include &lt;stdlib.h&gt;</div><div class='del'>-</div><div class='del'>-static const struct argp_option</div><div class='del'>-options[] =</div><div class='del'>-{</div><div class='del'>-  { NULL, 0, NULL, 0, NULL, 0 }</div><div class='del'>-};</div><div class='del'>-</div><div class='del'>-struct child_state</div><div class='del'>-{</div><div class='del'>-  int n;</div><div class='del'>-};</div><div class='del'>-</div><div class='del'>-static error_t</div><div class='del'>-child_parser(int key, char *arg, struct argp_state *state)</div><div class='del'>-{</div><div class='del'>-  struct child_state *input = (struct child_state *) state-&gt;input;</div><div class='del'>-  </div><div class='del'>-  switch(key)</div><div class='del'>-    {</div><div class='del'>-    default:</div><div class='del'>-      return ARGP_ERR_UNKNOWN;</div><div class='del'>-    case ARGP_KEY_END:</div><div class='del'>-      if (!input-&gt;n)</div><div class='del'>-	input-&gt;n = 1;</div><div class='del'>-      break;</div><div class='del'>-    }</div><div class='del'>-  return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-const struct argp child_argp =</div><div class='del'>-{</div><div class='del'>-  options,</div><div class='del'>-  child_parser,</div><div class='del'>-  NULL, NULL, NULL, NULL, NULL</div><div class='del'>-};</div><div class='del'>-</div><div class='del'>-struct main_state</div><div class='del'>-{</div><div class='del'>-  struct child_state child;</div><div class='del'>-  int m;</div><div class='del'>-};</div><div class='del'>-</div><div class='del'>-static error_t</div><div class='del'>-main_parser(int key, char *arg, struct argp_state *state)</div><div class='del'>-{</div><div class='del'>-  struct main_state *input = (struct main_state *) state-&gt;input;</div><div class='del'>-</div><div class='del'>-  switch(key)</div><div class='del'>-    {</div><div class='del'>-    default:</div><div class='del'>-      return ARGP_ERR_UNKNOWN;</div><div class='del'>-    case ARGP_KEY_INIT:</div><div class='del'>-      state-&gt;child_inputs[0] = &amp;input-&gt;child;</div><div class='del'>-      break;</div><div class='del'>-    case ARGP_KEY_END:</div><div class='del'>-      if (!input-&gt;m)</div><div class='del'>-	input-&gt;m = input-&gt;child.n;</div><div class='del'>-      </div><div class='del'>-      break;</div><div class='del'>-    }</div><div class='del'>-  return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-static const struct argp_child</div><div class='del'>-main_children[] =</div><div class='del'>-{</div><div class='del'>-  { &amp;child_argp, 0, "", 0 },</div><div class='del'>-  { NULL, 0, NULL, 0}</div><div class='del'>-};</div><div class='del'>-</div><div class='del'>-static const struct argp</div><div class='del'>-main_argp =</div><div class='del'>-{ options, main_parser, </div><div class='del'>-  NULL,</div><div class='del'>-  NULL,</div><div class='del'>-  main_children,</div><div class='del'>-  NULL, NULL</div><div class='del'>-};</div><div class='del'>-</div><div class='del'>-int main(int argc, char **argv)</div><div class='del'>-{</div><div class='del'>-  struct main_state input = { { 0 }, 0 };</div><div class='del'>-  char *v[2] = { "foo", NULL };</div><div class='del'>-</div><div class='del'>-  argp_parse(&amp;main_argp, 1, v, 0, NULL, &amp;input);</div><div class='del'>-</div><div class='del'>-  if ( (input.m == 1) &amp;&amp; (input.child.n == 1) )</div><div class='del'>-    return 0;</div><div class='del'>-  else</div><div class='del'>-    return 1;</div><div class='del'>-}</div><div class='del'>-], lsh_cv_lib_argp_works=yes,</div><div class='del'>-   lsh_cv_lib_argp_works=no,</div><div class='del'>-   lsh_cv_lib_argp_works=no)])</div><div class='del'>-</div><div class='del'>-  if test x$lsh_cv_lib_argp_works = xyes ; then</div><div class='del'>-    ac_argp_ok=yes</div><div class='del'>-  else</div><div class='del'>-    # Reset link flags</div><div class='del'>-    LIBS="$ac_argp_save_LIBS"</div><div class='del'>-    LDFLAGS="$ac_argp_save_LDFLAGS"</div><div class='del'>-  fi])</div><div class='del'>-</div><div class='del'>-  if test x$ac_argp_ok = xyes ; then</div><div class='del'>-    ifelse([$1],, true, [$1])</div><div class='del'>-  else</div><div class='del'>-    ifelse([$2],, true, [$2])</div><div class='del'>-  fi   </div><div class='del'>-])</div><div class='del'>-</div><div class='del'>-dnl LSH_GCC_ATTRIBUTES</div><div class='del'>-dnl Check for gcc's __attribute__ construction</div><div class='del'>-</div><div class='del'>-AC_DEFUN([LSH_GCC_ATTRIBUTES],</div><div class='del'>-[AC_CACHE_CHECK(for __attribute__,</div><div class='del'>-	       lsh_cv_c_attribute,</div><div class='del'>-[ AC_TRY_COMPILE([</div><div class='del'>-#include &lt;stdlib.h&gt;</div><div class='del'>-],</div><div class='del'>-[</div><div class='del'>-static void foo(void) __attribute__ ((noreturn));</div><div class='del'>-</div><div class='del'>-static void __attribute__ ((noreturn))</div><div class='del'>-foo(void)</div><div class='del'>-{</div><div class='del'>-  exit(1);</div><div class='del'>-}</div><div class='del'>-],</div><div class='del'>-lsh_cv_c_attribute=yes,</div><div class='del'>-lsh_cv_c_attribute=no)])</div><div class='del'>-</div><div class='del'>-AH_TEMPLATE([HAVE_GCC_ATTRIBUTE], [Define if the compiler understands __attribute__])</div><div class='del'>-if test "x$lsh_cv_c_attribute" = "xyes"; then</div><div class='del'>-  AC_DEFINE(HAVE_GCC_ATTRIBUTE)</div><div class='del'>-fi</div><div class='del'>-</div><div class='del'>-AH_BOTTOM(</div><div class='del'>-[#if __GNUC__ || HAVE_GCC_ATTRIBUTE</div><div class='del'>-# define NORETURN __attribute__ ((__noreturn__))</div><div class='del'>-# define PRINTF_STYLE(f, a) __attribute__ ((__format__ (__printf__, f, a)))</div><div class='del'>-# define UNUSED __attribute__ ((__unused__))</div><div class='del'>-#else</div><div class='del'>-# define NORETURN</div><div class='del'>-# define PRINTF_STYLE(f, a)</div><div class='del'>-# define UNUSED</div><div class='del'>-#endif</div><div class='del'>-])])</div><div class='del'>-</div><div class='del'>-AC_DEFUN([LSH_GCC_FUNCTION_NAME],</div><div class='del'>-[# Check for gcc's __FUNCTION__ variable</div><div class='del'>-AH_TEMPLATE([HAVE_GCC_FUNCTION],</div><div class='del'>-	    [Define if the compiler understands __FUNCTION__])</div><div class='del'>-AH_BOTTOM(</div><div class='del'>-[#if HAVE_GCC_FUNCTION</div><div class='del'>-# define FUNCTION_NAME __FUNCTION__</div><div class='del'>-#else</div><div class='del'>-# define FUNCTION_NAME "Unknown"</div><div class='del'>-#endif</div><div class='del'>-])</div><div class='del'>-</div><div class='del'>-AC_CACHE_CHECK(for __FUNCTION__,</div><div class='del'>-	       lsh_cv_c_FUNCTION,</div><div class='del'>-  [ AC_TRY_COMPILE(,</div><div class='del'>-      [ #if __GNUC__ == 3</div><div class='del'>-	#  error __FUNCTION__ is broken in gcc-3</div><div class='del'>-	#endif</div><div class='del'>-        void foo(void) { char c = __FUNCTION__[0]; } ],</div><div class='del'>-      lsh_cv_c_FUNCTION=yes,</div><div class='del'>-      lsh_cv_c_FUNCTION=no)])</div><div class='del'>-</div><div class='del'>-if test "x$lsh_cv_c_FUNCTION" = "xyes"; then</div><div class='del'>-  AC_DEFINE(HAVE_GCC_FUNCTION)</div><div class='del'>-fi</div><div class='del'>-])</div><div class='del'>-</div><div class='del'>-# Check for alloca, and include the standard blurb in config.h</div><div class='del'>-AC_DEFUN([LSH_FUNC_ALLOCA],</div><div class='del'>-[AC_FUNC_ALLOCA</div><div class='del'>-AC_CHECK_HEADERS([malloc.h])</div><div class='del'>-AH_BOTTOM(</div><div class='del'>-[/* AIX requires this to be the first thing in the file.  */</div><div class='del'>-#ifndef __GNUC__</div><div class='del'>-# if HAVE_ALLOCA_H</div><div class='del'>-#  include &lt;alloca.h&gt;</div><div class='del'>-# else</div><div class='del'>-#  ifdef _AIX</div><div class='del'>- #pragma alloca</div><div class='del'>-#  else</div><div class='del'>-#   ifndef alloca /* predefined by HP cc +Olibcalls */</div><div class='del'>-char *alloca ();</div><div class='del'>-#   endif</div><div class='del'>-#  endif</div><div class='del'>-# endif</div><div class='del'>-#else /* defined __GNUC__ */</div><div class='del'>-# if HAVE_ALLOCA_H</div><div class='del'>-#  include &lt;alloca.h&gt;</div><div class='del'>-# endif</div><div class='del'>-#endif</div><div class='del'>-/* Needed for alloca on windows */</div><div class='del'>-#if HAVE_MALLOC_H</div><div class='del'>-# include &lt;malloc.h&gt;</div><div class='del'>-#endif</div><div class='del'>-])])</div><div class='del'>-</div><div class='del'>-AC_DEFUN([LSH_FUNC_STRERROR],</div><div class='del'>-[AC_CHECK_FUNCS(strerror)</div><div class='del'>-AH_BOTTOM(</div><div class='del'>-[#if HAVE_STRERROR</div><div class='del'>-#define STRERROR strerror</div><div class='del'>-#else</div><div class='del'>-#define STRERROR(x) (sys_errlist[x])</div><div class='del'>-#endif</div><div class='del'>-])])</div><div class='del'>-</div><div class='del'>-AC_DEFUN([LSH_FUNC_STRSIGNAL],</div><div class='del'>-[AC_CHECK_FUNCS(strsignal)</div><div class='del'>-AC_CHECK_DECLS([sys_siglist, _sys_siglist])</div><div class='del'>-AH_BOTTOM(</div><div class='del'>-[#if HAVE_STRSIGNAL</div><div class='del'>-# define STRSIGNAL strsignal</div><div class='del'>-#else /* !HAVE_STRSIGNAL */</div><div class='del'>-# if HAVE_DECL_SYS_SIGLIST</div><div class='del'>-#  define STRSIGNAL(x) (sys_siglist[x])</div><div class='del'>-# else</div><div class='del'>-#  if HAVE_DECL__SYS_SIGLIST</div><div class='del'>-#   define STRSIGNAL(x) (_sys_siglist[x])</div><div class='del'>-#  else</div><div class='del'>-#   define STRSIGNAL(x) "Unknown signal"</div><div class='del'>-#   if __GNUC__</div><div class='del'>-#    warning Using dummy STRSIGNAL</div><div class='del'>-#   endif</div><div class='del'>-#  endif</div><div class='del'>-# endif</div><div class='del'>-#endif /* !HAVE_STRSIGNAL */</div><div class='del'>-])])</div><div class='del'>-</div><div class='del'>-dnl LSH_MAKE_CONDITIONAL(symbol, test)</div><div class='del'>-AC_DEFUN([LSH_MAKE_CONDITIONAL],</div><div class='del'>-[if $2 ; then</div><div class='del'>-  IF_$1=''</div><div class='del'>-  UNLESS_$1='# '</div><div class='del'>-else</div><div class='del'>-  IF_$1='# '</div><div class='del'>-  UNLESS_$1=''</div><div class='del'>-fi </div><div class='del'>-AC_SUBST(IF_$1)</div><div class='del'>-AC_SUBST(UNLESS_$1)])</div><div class='del'>-</div><div class='del'>-dnl LSH_DEPENDENCY_TRACKING</div><div class='del'>-</div><div class='del'>-dnl Defines compiler flags DEP_FLAGS to generate dependency</div><div class='del'>-dnl information, and DEP_PROCESS that is any shell commands needed for</div><div class='del'>-dnl massaging the dependency information further. Dependencies are</div><div class='del'>-dnl generated as a side effect of compilation. Dependency files</div><div class='del'>-dnl themselves are not treated as targets.</div><div class='del'>-</div><div class='del'>-AC_DEFUN([LSH_DEPENDENCY_TRACKING],</div><div class='del'>-[AC_ARG_ENABLE(dependency_tracking,</div><div class='del'>-  AC_HELP_STRING([--disable-dependency-tracking],</div><div class='del'>-    [Disable dependency tracking. Dependency tracking doesn't work with BSD make]),,</div><div class='del'>-  [enable_dependency_tracking=yes])</div><div class='del'>-</div><div class='del'>-DEP_FLAGS=''</div><div class='del'>-DEP_PROCESS='true'</div><div class='del'>-if test x$enable_dependency_tracking = xyes ; then</div><div class='del'>-  if test x$GCC = xyes ; then</div><div class='del'>-    gcc_version=`gcc --version | head -1`</div><div class='del'>-    case "$gcc_version" in</div><div class='del'>-      2.*|*[[!0-9.]]2.*)</div><div class='del'>-        enable_dependency_tracking=no</div><div class='del'>-        AC_MSG_WARN([Dependency tracking disabled, gcc-3.x is needed])</div><div class='del'>-      ;;</div><div class='del'>-      *)</div><div class='del'>-        DEP_FLAGS='-MT $[]@ -MD -MP -MF $[]@.d'</div><div class='del'>-        DEP_PROCESS='true'</div><div class='del'>-      ;;</div><div class='del'>-    esac</div><div class='del'>-  else</div><div class='del'>-    enable_dependency_tracking=no</div><div class='del'>-    AC_MSG_WARN([Dependency tracking disabled])</div><div class='del'>-  fi</div><div class='del'>-fi</div><div class='del'>-</div><div class='del'>-if test x$enable_dependency_tracking = xyes ; then</div><div class='del'>-  DEP_INCLUDE='include '</div><div class='del'>-else</div><div class='del'>-  DEP_INCLUDE='# '</div><div class='del'>-fi</div><div class='del'>-</div><div class='del'>-AC_SUBST([DEP_INCLUDE])</div><div class='del'>-AC_SUBST([DEP_FLAGS])</div><div class='del'>-AC_SUBST([DEP_PROCESS])])</div><div class='del'>-</div><div class='del'>-dnl @synopsis AX_CREATE_STDINT_H [( HEADER-TO-GENERATE [, HEADERS-TO-CHECK])]</div><div class='del'>-dnl</div><div class='del'>-dnl the "ISO C9X: 7.18 Integer types &lt;stdint.h&gt;" section requires the</div><div class='del'>-dnl existence of an include file &lt;stdint.h&gt; that defines a set of </div><div class='del'>-dnl typedefs, especially uint8_t,int32_t,uintptr_t.</div><div class='del'>-dnl Many older installations will not provide this file, but some will</div><div class='del'>-dnl have the very same definitions in &lt;inttypes.h&gt;. In other enviroments</div><div class='del'>-dnl we can use the inet-types in &lt;sys/types.h&gt; which would define the</div><div class='del'>-dnl typedefs int8_t and u_int8_t respectivly.</div><div class='del'>-dnl</div><div class='del'>-dnl This macros will create a local "_stdint.h" or the headerfile given as </div><div class='del'>-dnl an argument. In many cases that file will just "#include &lt;stdint.h&gt;" </div><div class='del'>-dnl or "#include &lt;inttypes.h&gt;", while in other environments it will provide </div><div class='del'>-dnl the set of basic 'stdint's definitions/typedefs: </div><div class='del'>-dnl   int8_t,uint8_t,int16_t,uint16_t,int32_t,uint32_t,intptr_t,uintptr_t</div><div class='del'>-dnl   int_least32_t.. int_fast32_t.. intmax_t</div><div class='del'>-dnl which may or may not rely on the definitions of other files,</div><div class='del'>-dnl or using the AC_CHECK_SIZEOF macro to determine the actual</div><div class='del'>-dnl sizeof each type.</div><div class='del'>-dnl</div><div class='del'>-dnl if your header files require the stdint-types you will want to create an</div><div class='del'>-dnl installable file mylib-int.h that all your other installable header</div><div class='del'>-dnl may include. So if you have a library package named "mylib", just use</div><div class='del'>-dnl      AX_CREATE_STDINT_H(mylib-int.h) </div><div class='del'>-dnl in configure.ac and go to install that very header file in Makefile.am</div><div class='del'>-dnl along with the other headers (mylib.h) - and the mylib-specific headers</div><div class='del'>-dnl can simply use "#include &lt;mylib-int.h&gt;" to obtain the stdint-types.</div><div class='del'>-dnl</div><div class='del'>-dnl Remember, if the system already had a valid &lt;stdint.h&gt;, the generated</div><div class='del'>-dnl file will include it directly. No need for fuzzy HAVE_STDINT_H things...</div><div class='del'>-dnl</div><div class='del'>-dnl @, (status: used on new platforms) (see http://ac-archive.sf.net/gstdint/)</div><div class='del'>-dnl @version $Id: acinclude.m4,v 1.27 2004/11/23 21:27:35 nisse Exp $</div><div class='del'>-dnl @author  Guido Draheim &lt;guidod@gmx.de&gt; </div><div class='del'>-</div><div class='del'>-AC_DEFUN([AX_CREATE_STDINT_H],</div><div class='del'>-[# ------ AX CREATE STDINT H -------------------------------------</div><div class='del'>-AC_MSG_CHECKING([for stdint types])</div><div class='del'>-ac_stdint_h=`echo ifelse($1, , _stdint.h, $1)`</div><div class='del'>-# try to shortcircuit - if the default include path of the compiler</div><div class='del'>-# can find a "stdint.h" header then we assume that all compilers can.</div><div class='del'>-AC_CACHE_VAL([ac_cv_header_stdint_t],[</div><div class='del'>-old_CXXFLAGS="$CXXFLAGS" ; CXXFLAGS=""</div><div class='del'>-old_CPPFLAGS="$CPPFLAGS" ; CPPFLAGS=""</div><div class='del'>-old_CFLAGS="$CFLAGS"     ; CFLAGS=""</div><div class='del'>-AC_TRY_COMPILE([#include &lt;stdint.h&gt;],[int_least32_t v = 0;],</div><div class='del'>-[ac_cv_stdint_result="(assuming C99 compatible system)"</div><div class='del'>- ac_cv_header_stdint_t="stdint.h"; ],</div><div class='del'>-[ac_cv_header_stdint_t=""])</div><div class='del'>-CXXFLAGS="$old_CXXFLAGS"</div><div class='del'>-CPPFLAGS="$old_CPPFLAGS"</div><div class='del'>-CFLAGS="$old_CFLAGS" ])</div><div class='del'>-</div><div class='del'>-v="... $ac_cv_header_stdint_h"</div><div class='del'>-if test "$ac_stdint_h" = "stdint.h" ; then</div><div class='del'>- AC_MSG_RESULT([(are you sure you want them in ./stdint.h?)])</div><div class='del'>-elif test "$ac_stdint_h" = "inttypes.h" ; then</div><div class='del'>- AC_MSG_RESULT([(are you sure you want them in ./inttypes.h?)])</div><div class='del'>-elif test "_$ac_cv_header_stdint_t" = "_" ; then</div><div class='del'>- AC_MSG_RESULT([(putting them into $ac_stdint_h)$v])</div><div class='del'>-else</div><div class='del'>- ac_cv_header_stdint="$ac_cv_header_stdint_t"</div><div class='del'>- AC_MSG_RESULT([$ac_cv_header_stdint (shortcircuit)])</div><div class='del'>-fi</div><div class='del'>-</div><div class='del'>-if test "_$ac_cv_header_stdint_t" = "_" ; then # can not shortcircuit..</div><div class='del'>-</div><div class='del'>-dnl .....intro message done, now do a few system checks.....</div><div class='del'>-dnl btw, all CHECK_TYPE macros do automatically "DEFINE" a type, therefore</div><div class='del'>-dnl we use the autoconf implementation detail _AC CHECK_TYPE_NEW instead</div><div class='del'>-</div><div class='del'>-inttype_headers=`echo $2 | sed -e 's/,/ /g'`</div><div class='del'>-</div><div class='del'>-ac_cv_stdint_result="(no helpful system typedefs seen)"</div><div class='del'>-AC_CACHE_CHECK([for stdint uintptr_t], [ac_cv_header_stdint_x],[</div><div class='del'>- ac_cv_header_stdint_x="" # the 1997 typedefs (inttypes.h)</div><div class='del'>-  AC_MSG_RESULT([(..)])</div><div class='del'>-  for i in stdint.h inttypes.h sys/inttypes.h $inttype_headers ; do</div><div class='del'>-   unset ac_cv_type_uintptr_t </div><div class='del'>-   unset ac_cv_type_uint64_t</div><div class='del'>-   _AC_CHECK_TYPE_NEW(uintptr_t,[ac_cv_header_stdint_x=$i],dnl</div><div class='del'>-     continue,[#include &lt;$i&gt;])</div><div class='del'>-   AC_CHECK_TYPE(uint64_t,[and64="/uint64_t"],[and64=""],[#include&lt;$i&gt;])</div><div class='del'>-   ac_cv_stdint_result="(seen uintptr_t$and64 in $i)"</div><div class='del'>-   break;</div><div class='del'>-  done</div><div class='del'>-  AC_MSG_CHECKING([for stdint uintptr_t])</div><div class='del'>- ])</div><div class='del'>-</div><div class='del'>-if test "_$ac_cv_header_stdint_x" = "_" ; then</div><div class='del'>-AC_CACHE_CHECK([for stdint uint32_t], [ac_cv_header_stdint_o],[</div><div class='del'>- ac_cv_header_stdint_o="" # the 1995 typedefs (sys/inttypes.h)</div><div class='del'>-  AC_MSG_RESULT([(..)])</div><div class='del'>-  for i in inttypes.h sys/inttypes.h stdint.h $inttype_headers ; do</div><div class='del'>-   unset ac_cv_type_uint32_t</div><div class='del'>-   unset ac_cv_type_uint64_t</div><div class='del'>-   AC_CHECK_TYPE(uint32_t,[ac_cv_header_stdint_o=$i],dnl</div><div class='del'>-     continue,[#include &lt;$i&gt;])</div><div class='del'>-   AC_CHECK_TYPE(uint64_t,[and64="/uint64_t"],[and64=""],[#include&lt;$i&gt;])</div><div class='del'>-   ac_cv_stdint_result="(seen uint32_t$and64 in $i)"</div><div class='del'>-   break;</div><div class='del'>-  done</div><div class='del'>-  AC_MSG_CHECKING([for stdint uint32_t])</div><div class='del'>- ])</div><div class='del'>-fi</div><div class='del'>-</div><div class='del'>-if test "_$ac_cv_header_stdint_x" = "_" ; then</div><div class='del'>-if test "_$ac_cv_header_stdint_o" = "_" ; then</div><div class='del'>-AC_CACHE_CHECK([for stdint u_int32_t], [ac_cv_header_stdint_u],[</div><div class='del'>- ac_cv_header_stdint_u="" # the BSD typedefs (sys/types.h)</div><div class='del'>-  AC_MSG_RESULT([(..)])</div><div class='del'>-  for i in sys/types.h inttypes.h sys/inttypes.h $inttype_headers ; do</div><div class='del'>-   unset ac_cv_type_u_int32_t</div><div class='del'>-   unset ac_cv_type_u_int64_t</div><div class='del'>-   AC_CHECK_TYPE(u_int32_t,[ac_cv_header_stdint_u=$i],dnl</div><div class='del'>-     continue,[#include &lt;$i&gt;])</div><div class='del'>-   AC_CHECK_TYPE(u_int64_t,[and64="/u_int64_t"],[and64=""],[#include&lt;$i&gt;])</div><div class='del'>-   ac_cv_stdint_result="(seen u_int32_t$and64 in $i)"</div><div class='del'>-   break;</div><div class='del'>-  done</div><div class='del'>-  AC_MSG_CHECKING([for stdint u_int32_t])</div><div class='del'>- ])</div><div class='del'>-fi fi</div><div class='del'>-</div><div class='del'>-dnl if there was no good C99 header file, do some typedef checks...</div><div class='del'>-if test "_$ac_cv_header_stdint_x" = "_" ; then</div><div class='del'>-   AC_MSG_CHECKING([for stdint datatype model])</div><div class='del'>-   AC_MSG_RESULT([(..)])</div><div class='del'>-   AC_CHECK_SIZEOF(char)</div><div class='del'>-   AC_CHECK_SIZEOF(short)</div><div class='del'>-   AC_CHECK_SIZEOF(int)</div><div class='del'>-   AC_CHECK_SIZEOF(long)</div><div class='del'>-   AC_CHECK_SIZEOF(void*)</div><div class='del'>-   ac_cv_stdint_char_model=""</div><div class='del'>-   ac_cv_stdint_char_model="$ac_cv_stdint_char_model$ac_cv_sizeof_char"</div><div class='del'>-   ac_cv_stdint_char_model="$ac_cv_stdint_char_model$ac_cv_sizeof_short"</div><div class='del'>-   ac_cv_stdint_char_model="$ac_cv_stdint_char_model$ac_cv_sizeof_int"</div><div class='del'>-   ac_cv_stdint_long_model=""</div><div class='del'>-   ac_cv_stdint_long_model="$ac_cv_stdint_long_model$ac_cv_sizeof_int"</div><div class='del'>-   ac_cv_stdint_long_model="$ac_cv_stdint_long_model$ac_cv_sizeof_long"</div><div class='del'>-   ac_cv_stdint_long_model="$ac_cv_stdint_long_model$ac_cv_sizeof_voidp"</div><div class='del'>-   name="$ac_cv_stdint_long_model"</div><div class='del'>-   case "$ac_cv_stdint_char_model/$ac_cv_stdint_long_model" in</div><div class='del'>-    122/242)     name="$name,  IP16 (standard 16bit machine)" ;;</div><div class='del'>-    122/244)     name="$name,  LP32 (standard 32bit mac/win)" ;;</div><div class='del'>-    122/*)       name="$name        (unusual int16 model)" ;; </div><div class='del'>-    124/444)     name="$name, ILP32 (standard 32bit unixish)" ;;</div><div class='del'>-    124/488)     name="$name,  LP64 (standard 64bit unixish)" ;;</div><div class='del'>-    124/448)     name="$name, LLP64 (unusual  64bit unixish)" ;;</div><div class='del'>-    124/*)       name="$name        (unusual int32 model)" ;; </div><div class='del'>-    128/888)     name="$name, ILP64 (unusual  64bit numeric)" ;;</div><div class='del'>-    128/*)       name="$name        (unusual int64 model)" ;; </div><div class='del'>-    222/*|444/*) name="$name        (unusual dsptype)" ;;</div><div class='del'>-     *)          name="$name        (very unusal model)" ;;</div><div class='del'>-   esac</div><div class='del'>-   AC_MSG_RESULT([combined for stdint datatype model...  $name])</div><div class='del'>-fi</div><div class='del'>-</div><div class='del'>-if test "_$ac_cv_header_stdint_x" != "_" ; then</div><div class='del'>-   ac_cv_header_stdint="$ac_cv_header_stdint_x"</div><div class='del'>-elif  test "_$ac_cv_header_stdint_o" != "_" ; then</div><div class='del'>-   ac_cv_header_stdint="$ac_cv_header_stdint_o"</div><div class='del'>-elif  test "_$ac_cv_header_stdint_u" != "_" ; then</div><div class='del'>-   ac_cv_header_stdint="$ac_cv_header_stdint_u"</div><div class='del'>-else</div><div class='del'>-   ac_cv_header_stdint="stddef.h"</div><div class='del'>-fi</div><div class='del'>-</div><div class='del'>-AC_MSG_CHECKING([for extra inttypes in chosen header])</div><div class='del'>-AC_MSG_RESULT([($ac_cv_header_stdint)])</div><div class='del'>-dnl see if int_least and int_fast types are present in _this_ header.</div><div class='del'>-unset ac_cv_type_int_least32_t</div><div class='del'>-unset ac_cv_type_int_fast32_t</div><div class='del'>-AC_CHECK_TYPE(int_least32_t,,,[#include &lt;$ac_cv_header_stdint&gt;])</div><div class='del'>-AC_CHECK_TYPE(int_fast32_t,,,[#include&lt;$ac_cv_header_stdint&gt;])</div><div class='del'>-AC_CHECK_TYPE(intmax_t,,,[#include &lt;$ac_cv_header_stdint&gt;])</div><div class='del'>-</div><div class='del'>-fi # shortcircut to system "stdint.h"</div><div class='del'>-# ------------------ PREPARE VARIABLES ------------------------------</div><div class='del'>-if test "$GCC" = "yes" ; then</div><div class='del'>-ac_cv_stdint_message="using gnu compiler "`$CC --version | head -1` </div><div class='del'>-else</div><div class='del'>-ac_cv_stdint_message="using $CC"</div><div class='del'>-fi</div><div class='del'>-</div><div class='del'>-AC_MSG_RESULT([make use of $ac_cv_header_stdint in $ac_stdint_h dnl</div><div class='del'>-$ac_cv_stdint_result])</div><div class='del'>-</div><div class='del'>-# ----------------- DONE inttypes.h checks START header -------------</div><div class='del'>-AC_CONFIG_COMMANDS([$ac_stdint_h],[</div><div class='del'>-AC_MSG_NOTICE(creating $ac_stdint_h : $_ac_stdint_h)</div><div class='del'>-ac_stdint=$tmp/_stdint.h</div><div class='del'>-</div><div class='del'>-echo "#ifndef" $_ac_stdint_h &gt;$ac_stdint</div><div class='del'>-echo "#define" $_ac_stdint_h "1" &gt;&gt;$ac_stdint</div><div class='del'>-echo "#ifndef" _GENERATED_STDINT_H &gt;&gt;$ac_stdint</div><div class='del'>-echo "#define" _GENERATED_STDINT_H '"'$PACKAGE $VERSION'"' &gt;&gt;$ac_stdint</div><div class='del'>-echo "/* generated $ac_cv_stdint_message */" &gt;&gt;$ac_stdint</div><div class='del'>-if test "_$ac_cv_header_stdint_t" != "_" ; then </div><div class='del'>-echo "#define _STDINT_HAVE_STDINT_H" "1" &gt;&gt;$ac_stdint</div><div class='del'>-fi</div><div class='del'>-</div><div class='del'>-cat &gt;&gt;$ac_stdint &lt;&lt;STDINT_EOF</div><div class='del'>-</div><div class='del'>-/* ................... shortcircuit part ........................... */</div><div class='del'>-</div><div class='del'>-#if defined HAVE_STDINT_H || defined _STDINT_HAVE_STDINT_H</div><div class='del'>-#include &lt;stdint.h&gt;</div><div class='del'>-#else</div><div class='del'>-#include &lt;stddef.h&gt;</div><div class='del'>-</div><div class='del'>-/* .................... configured part ............................ */</div><div class='del'>-</div><div class='del'>-STDINT_EOF</div><div class='del'>-</div><div class='del'>-echo "/* whether we have a C99 compatible stdint header file */" &gt;&gt;$ac_stdint</div><div class='del'>-if test "_$ac_cv_header_stdint_x" != "_" ; then</div><div class='del'>-  ac_header="$ac_cv_header_stdint_x"</div><div class='del'>-  echo "#define _STDINT_HEADER_INTPTR" '"'"$ac_header"'"' &gt;&gt;$ac_stdint</div><div class='del'>-else</div><div class='del'>-  echo "/* #undef _STDINT_HEADER_INTPTR */" &gt;&gt;$ac_stdint</div><div class='del'>-fi</div><div class='del'>-</div><div class='del'>-echo "/* whether we have a C96 compatible inttypes header file */" &gt;&gt;$ac_stdint</div><div class='del'>-if  test "_$ac_cv_header_stdint_o" != "_" ; then</div><div class='del'>-  ac_header="$ac_cv_header_stdint_o"</div><div class='del'>-  echo "#define _STDINT_HEADER_UINT32" '"'"$ac_header"'"' &gt;&gt;$ac_stdint</div><div class='del'>-else</div><div class='del'>-  echo "/* #undef _STDINT_HEADER_UINT32 */" &gt;&gt;$ac_stdint</div><div class='del'>-fi</div><div class='del'>-</div><div class='del'>-echo "/* whether we have a BSD compatible inet types header */" &gt;&gt;$ac_stdint</div><div class='del'>-if  test "_$ac_cv_header_stdint_u" != "_" ; then</div><div class='del'>-  ac_header="$ac_cv_header_stdint_u"</div><div class='del'>-  echo "#define _STDINT_HEADER_U_INT32" '"'"$ac_header"'"' &gt;&gt;$ac_stdint</div><div class='del'>-else</div><div class='del'>-  echo "/* #undef _STDINT_HEADER_U_INT32 */" &gt;&gt;$ac_stdint</div><div class='del'>-fi</div><div class='del'>-</div><div class='del'>-echo "" &gt;&gt;$ac_stdint</div><div class='del'>-</div><div class='del'>-if test "_$ac_header" != "_" ; then if test "$ac_header" != "stddef.h" ; then</div><div class='del'>-  echo "#include &lt;$ac_header&gt;" &gt;&gt;$ac_stdint</div><div class='del'>-  echo "" &gt;&gt;$ac_stdint</div><div class='del'>-fi fi</div><div class='del'>-</div><div class='del'>-echo "/* which 64bit typedef has been found */" &gt;&gt;$ac_stdint</div><div class='del'>-if test "$ac_cv_type_uint64_t" = "yes" ; then</div><div class='del'>-echo "#define   _STDINT_HAVE_UINT64_T" "1"  &gt;&gt;$ac_stdint</div><div class='del'>-else</div><div class='del'>-echo "/* #undef _STDINT_HAVE_UINT64_T */" &gt;&gt;$ac_stdint</div><div class='del'>-fi</div><div class='del'>-if test "$ac_cv_type_u_int64_t" = "yes" ; then</div><div class='del'>-echo "#define   _STDINT_HAVE_U_INT64_T" "1"  &gt;&gt;$ac_stdint</div><div class='del'>-else</div><div class='del'>-echo "/* #undef _STDINT_HAVE_U_INT64_T */" &gt;&gt;$ac_stdint</div><div class='del'>-fi</div><div class='del'>-echo "" &gt;&gt;$ac_stdint</div><div class='del'>-</div><div class='del'>-echo "/* which type model has been detected */" &gt;&gt;$ac_stdint</div><div class='del'>-if test "_$ac_cv_stdint_char_model" != "_" ; then</div><div class='del'>-echo "#define   _STDINT_CHAR_MODEL" "$ac_cv_stdint_char_model" &gt;&gt;$ac_stdint</div><div class='del'>-echo "#define   _STDINT_LONG_MODEL" "$ac_cv_stdint_long_model" &gt;&gt;$ac_stdint</div><div class='del'>-else</div><div class='del'>-echo "/* #undef _STDINT_CHAR_MODEL // skipped */" &gt;&gt;$ac_stdint</div><div class='del'>-echo "/* #undef _STDINT_LONG_MODEL // skipped */" &gt;&gt;$ac_stdint</div><div class='del'>-fi</div><div class='del'>-echo "" &gt;&gt;$ac_stdint</div><div class='del'>-</div><div class='del'>-echo "/* whether int_least types were detected */" &gt;&gt;$ac_stdint</div><div class='del'>-if test "$ac_cv_type_int_least32_t" = "yes"; then</div><div class='del'>-echo "#define   _STDINT_HAVE_INT_LEAST32_T" "1"  &gt;&gt;$ac_stdint</div><div class='del'>-else</div><div class='del'>-echo "/* #undef _STDINT_HAVE_INT_LEAST32_T */" &gt;&gt;$ac_stdint</div><div class='del'>-fi</div><div class='del'>-echo "/* whether int_fast types were detected */" &gt;&gt;$ac_stdint</div><div class='del'>-if test "$ac_cv_type_int_fast32_t" = "yes"; then</div><div class='del'>-echo "#define   _STDINT_HAVE_INT_FAST32_T" "1" &gt;&gt;$ac_stdint</div><div class='del'>-else</div><div class='del'>-echo "/* #undef _STDINT_HAVE_INT_FAST32_T */" &gt;&gt;$ac_stdint</div><div class='del'>-fi</div><div class='del'>-echo "/* whether intmax_t type was detected */" &gt;&gt;$ac_stdint</div><div class='del'>-if test "$ac_cv_type_intmax_t" = "yes"; then</div><div class='del'>-echo "#define   _STDINT_HAVE_INTMAX_T" "1" &gt;&gt;$ac_stdint</div><div class='del'>-else</div><div class='del'>-echo "/* #undef _STDINT_HAVE_INTMAX_T */" &gt;&gt;$ac_stdint</div><div class='del'>-fi</div><div class='del'>-echo "" &gt;&gt;$ac_stdint</div><div class='del'>-</div><div class='del'>-  cat &gt;&gt;$ac_stdint &lt;&lt;STDINT_EOF</div><div class='del'>-/* .................... detections part ............................ */</div><div class='del'>-</div><div class='del'>-/* whether we need to define bitspecific types from compiler base types */</div><div class='del'>-#ifndef _STDINT_HEADER_INTPTR</div><div class='del'>-#ifndef _STDINT_HEADER_UINT32</div><div class='del'>-#ifndef _STDINT_HEADER_U_INT32</div><div class='del'>-#define _STDINT_NEED_INT_MODEL_T</div><div class='del'>-#else</div><div class='del'>-#define _STDINT_HAVE_U_INT_TYPES</div><div class='del'>-#endif</div><div class='del'>-#endif</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-#ifdef _STDINT_HAVE_U_INT_TYPES</div><div class='del'>-#undef _STDINT_NEED_INT_MODEL_T</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-#ifdef  _STDINT_CHAR_MODEL</div><div class='del'>-#if     _STDINT_CHAR_MODEL+0 == 122 || _STDINT_CHAR_MODEL+0 == 124</div><div class='del'>-#ifndef _STDINT_BYTE_MODEL</div><div class='del'>-#define _STDINT_BYTE_MODEL 12</div><div class='del'>-#endif</div><div class='del'>-#endif</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-#ifndef _STDINT_HAVE_INT_LEAST32_T</div><div class='del'>-#define _STDINT_NEED_INT_LEAST_T</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-#ifndef _STDINT_HAVE_INT_FAST32_T</div><div class='del'>-#define _STDINT_NEED_INT_FAST_T</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-#ifndef _STDINT_HEADER_INTPTR</div><div class='del'>-#define _STDINT_NEED_INTPTR_T</div><div class='del'>-#ifndef _STDINT_HAVE_INTMAX_T</div><div class='del'>-#define _STDINT_NEED_INTMAX_T</div><div class='del'>-#endif</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-/* .................... definition part ............................ */</div><div class='del'>-</div><div class='del'>-/* some system headers have good uint64_t */</div><div class='del'>-#ifndef _HAVE_UINT64_T</div><div class='del'>-#if     defined _STDINT_HAVE_UINT64_T  || defined HAVE_UINT64_T</div><div class='del'>-#define _HAVE_UINT64_T</div><div class='del'>-#elif   defined _STDINT_HAVE_U_INT64_T || defined HAVE_U_INT64_T</div><div class='del'>-#define _HAVE_UINT64_T</div><div class='del'>-typedef u_int64_t uint64_t;</div><div class='del'>-#endif</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-#ifndef _HAVE_UINT64_T</div><div class='del'>-/* .. here are some common heuristics using compiler runtime specifics */</div><div class='del'>-#if defined __STDC_VERSION__ &amp;&amp; defined __STDC_VERSION__ &gt;= 199901L</div><div class='del'>-#define _HAVE_UINT64_T</div><div class='del'>-typedef long long int64_t;</div><div class='del'>-typedef unsigned long long uint64_t;</div><div class='del'>-</div><div class='del'>-#elif !defined __STRICT_ANSI__</div><div class='del'>-#if defined _MSC_VER || defined __WATCOMC__ || defined __BORLANDC__</div><div class='del'>-#define _HAVE_UINT64_T</div><div class='del'>-typedef __int64 int64_t;</div><div class='del'>-typedef unsigned __int64 uint64_t;</div><div class='del'>-</div><div class='del'>-#elif defined __GNUC__ || defined __MWERKS__ || defined __ELF__</div><div class='del'>-/* note: all ELF-systems seem to have loff-support which needs 64-bit */</div><div class='del'>-#if !defined _NO_LONGLONG</div><div class='del'>-#define _HAVE_UINT64_T</div><div class='del'>-typedef long long int64_t;</div><div class='del'>-typedef unsigned long long uint64_t;</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-#elif defined __alpha || (defined __mips &amp;&amp; defined _ABIN32)</div><div class='del'>-#if !defined _NO_LONGLONG</div><div class='del'>-typedef long int64_t;</div><div class='del'>-typedef unsigned long uint64_t;</div><div class='del'>-#endif</div><div class='del'>-  /* compiler/cpu type to define int64_t */</div><div class='del'>-#endif</div><div class='del'>-#endif</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-#if defined _STDINT_HAVE_U_INT_TYPES</div><div class='del'>-/* int8_t int16_t int32_t defined by inet code, redeclare the u_intXX types */</div><div class='del'>-typedef u_int8_t uint8_t;</div><div class='del'>-typedef u_int16_t uint16_t;</div><div class='del'>-typedef u_int32_t uint32_t;</div><div class='del'>-</div><div class='del'>-/* glibc compatibility */</div><div class='del'>-#ifndef __int8_t_defined</div><div class='del'>-#define __int8_t_defined</div><div class='del'>-#endif</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-#ifdef _STDINT_NEED_INT_MODEL_T</div><div class='del'>-/* we must guess all the basic types. Apart from byte-adressable system, */</div><div class='del'>-/* there a few 32-bit-only dsp-systems that we guard with BYTE_MODEL 8-} */</div><div class='del'>-/* (btw, those nibble-addressable systems are way off, or so we assume) */</div><div class='del'>-</div><div class='del'>-dnl   /* have a look at "64bit and data size neutrality" at */</div><div class='del'>-dnl   /* http://unix.org/version2/whatsnew/login_64bit.html */</div><div class='del'>-dnl   /* (the shorthand "ILP" types always have a "P" part) */</div><div class='del'>-</div><div class='del'>-#if defined _STDINT_BYTE_MODEL</div><div class='del'>-#if _STDINT_LONG_MODEL+0 == 242</div><div class='del'>-/* 2:4:2 =  IP16 = a normal 16-bit system                */</div><div class='del'>-typedef unsigned char   uint8_t;</div><div class='del'>-typedef unsigned short  uint16_t;</div><div class='del'>-typedef unsigned long   uint32_t;</div><div class='del'>-#ifndef __int8_t_defined</div><div class='del'>-#define __int8_t_defined</div><div class='del'>-typedef          char    int8_t;</div><div class='del'>-typedef          short   int16_t;</div><div class='del'>-typedef          long    int32_t;</div><div class='del'>-#endif</div><div class='del'>-#elif _STDINT_LONG_MODEL+0 == 244 || _STDINT_LONG_MODEL == 444</div><div class='del'>-/* 2:4:4 =  LP32 = a 32-bit system derived from a 16-bit */</div><div class='del'>-/* 4:4:4 = ILP32 = a normal 32-bit system                */</div><div class='del'>-typedef unsigned char   uint8_t;</div><div class='del'>-typedef unsigned short  uint16_t;</div><div class='del'>-typedef unsigned int    uint32_t;</div><div class='del'>-#ifndef __int8_t_defined</div><div class='del'>-#define __int8_t_defined</div><div class='del'>-typedef          char    int8_t;</div><div class='del'>-typedef          short   int16_t;</div><div class='del'>-typedef          int     int32_t;</div><div class='del'>-#endif</div><div class='del'>-#elif _STDINT_LONG_MODEL+0 == 484 || _STDINT_LONG_MODEL+0 == 488</div><div class='del'>-/* 4:8:4 =  IP32 = a 32-bit system prepared for 64-bit    */</div><div class='del'>-/* 4:8:8 =  LP64 = a normal 64-bit system                 */</div><div class='del'>-typedef unsigned char   uint8_t;</div><div class='del'>-typedef unsigned short  uint16_t;</div><div class='del'>-typedef unsigned int    uint32_t;</div><div class='del'>-#ifndef __int8_t_defined</div><div class='del'>-#define __int8_t_defined</div><div class='del'>-typedef          char    int8_t;</div><div class='del'>-typedef          short   int16_t;</div><div class='del'>-typedef          int     int32_t;</div><div class='del'>-#endif</div><div class='del'>-/* this system has a "long" of 64bit */</div><div class='del'>-#ifndef _HAVE_UINT64_T</div><div class='del'>-#define _HAVE_UINT64_T</div><div class='del'>-typedef unsigned long   uint64_t;</div><div class='del'>-typedef          long    int64_t;</div><div class='del'>-#endif</div><div class='del'>-#elif _STDINT_LONG_MODEL+0 == 448</div><div class='del'>-/*      LLP64   a 64-bit system derived from a 32-bit system */</div><div class='del'>-typedef unsigned char   uint8_t;</div><div class='del'>-typedef unsigned short  uint16_t;</div><div class='del'>-typedef unsigned int    uint32_t;</div><div class='del'>-#ifndef __int8_t_defined</div><div class='del'>-#define __int8_t_defined</div><div class='del'>-typedef          char    int8_t;</div><div class='del'>-typedef          short   int16_t;</div><div class='del'>-typedef          int     int32_t;</div><div class='del'>-#endif</div><div class='del'>-/* assuming the system has a "long long" */</div><div class='del'>-#ifndef _HAVE_UINT64_T</div><div class='del'>-#define _HAVE_UINT64_T</div><div class='del'>-typedef unsigned long long uint64_t;</div><div class='del'>-typedef          long long  int64_t;</div><div class='del'>-#endif</div><div class='del'>-#else</div><div class='del'>-#define _STDINT_NO_INT32_T</div><div class='del'>-#endif</div><div class='del'>-#else</div><div class='del'>-#define _STDINT_NO_INT8_T</div><div class='del'>-#define _STDINT_NO_INT32_T</div><div class='del'>-#endif</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-/*</div><div class='del'>- * quote from SunOS-5.8 sys/inttypes.h:</div><div class='del'>- * Use at your own risk.  As of February 1996, the committee is squarely</div><div class='del'>- * behind the fixed sized types; the "least" and "fast" types are still being</div><div class='del'>- * discussed.  The probability that the "fast" types may be removed before</div><div class='del'>- * the standard is finalized is high enough that they are not currently</div><div class='del'>- * implemented.</div><div class='del'>- */</div><div class='del'>-</div><div class='del'>-#if defined _STDINT_NEED_INT_LEAST_T</div><div class='del'>-typedef  int8_t    int_least8_t;</div><div class='del'>-typedef  int16_t   int_least16_t;</div><div class='del'>-typedef  int32_t   int_least32_t;</div><div class='del'>-#ifdef _HAVE_UINT64_T</div><div class='del'>-typedef  int64_t   int_least64_t;</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-typedef uint8_t   uint_least8_t;</div><div class='del'>-typedef uint16_t  uint_least16_t;</div><div class='del'>-typedef uint32_t  uint_least32_t;</div><div class='del'>-#ifdef _HAVE_UINT64_T</div><div class='del'>-typedef uint64_t  uint_least64_t;</div><div class='del'>-#endif</div><div class='del'>-  /* least types */</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-#if defined _STDINT_NEED_INT_FAST_T</div><div class='del'>-typedef  int8_t    int_fast8_t; </div><div class='del'>-typedef  int       int_fast16_t;</div><div class='del'>-typedef  int32_t   int_fast32_t;</div><div class='del'>-#ifdef _HAVE_UINT64_T</div><div class='del'>-typedef  int64_t   int_fast64_t;</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-typedef uint8_t   uint_fast8_t; </div><div class='del'>-typedef unsigned  uint_fast16_t;</div><div class='del'>-typedef uint32_t  uint_fast32_t;</div><div class='del'>-#ifdef _HAVE_UINT64_T</div><div class='del'>-typedef uint64_t  uint_fast64_t;</div><div class='del'>-#endif</div><div class='del'>-  /* fast types */</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-#ifdef _STDINT_NEED_INTMAX_T</div><div class='del'>-#ifdef _HAVE_UINT64_T</div><div class='del'>-typedef  int64_t       intmax_t;</div><div class='del'>-typedef uint64_t      uintmax_t;</div><div class='del'>-#else</div><div class='del'>-typedef          long  intmax_t;</div><div class='del'>-typedef unsigned long uintmax_t;</div><div class='del'>-#endif</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-#ifdef _STDINT_NEED_INTPTR_T</div><div class='del'>-#ifndef __intptr_t_defined</div><div class='del'>-#define __intptr_t_defined</div><div class='del'>-/* we encourage using "long" to store pointer values, never use "int" ! */</div><div class='del'>-#if   _STDINT_LONG_MODEL+0 == 242 || _STDINT_LONG_MODEL+0 == 484</div><div class='del'>-typedef  unsinged int   uintptr_t;</div><div class='del'>-typedef           int    intptr_t;</div><div class='del'>-#elif _STDINT_LONG_MODEL+0 == 244 || _STDINT_LONG_MODEL+0 == 444</div><div class='del'>-typedef  unsigned long  uintptr_t;</div><div class='del'>-typedef           long   intptr_t;</div><div class='del'>-#elif _STDINT_LONG_MODEL+0 == 448 &amp;&amp; defined _HAVE_UINT64_T</div><div class='del'>-typedef        uint64_t uintptr_t;</div><div class='del'>-typedef         int64_t  intptr_t;</div><div class='del'>-#else /* matches typical system types ILP32 and LP64 - but not IP16 or LLP64 */</div><div class='del'>-typedef  unsigned long  uintptr_t;</div><div class='del'>-typedef           long   intptr_t;</div><div class='del'>-#endif</div><div class='del'>-#endif</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-  /* shortcircuit*/</div><div class='del'>-#endif</div><div class='del'>-  /* once */</div><div class='del'>-#endif</div><div class='del'>-#endif</div><div class='del'>-STDINT_EOF</div><div class='del'>-    if cmp -s $ac_stdint_h $ac_stdint 2&gt;/dev/null; then</div><div class='del'>-      AC_MSG_NOTICE([$ac_stdint_h is unchanged])</div><div class='del'>-    else</div><div class='del'>-      ac_dir=`AS_DIRNAME(["$ac_stdint_h"])`</div><div class='del'>-      AS_MKDIR_P(["$ac_dir"])</div><div class='del'>-      rm -f $ac_stdint_h</div><div class='del'>-      mv $ac_stdint $ac_stdint_h</div><div class='del'>-    fi</div><div class='del'>-],[# variables for create stdint.h replacement</div><div class='del'>-PACKAGE="$PACKAGE"</div><div class='del'>-VERSION="$VERSION"</div><div class='del'>-ac_stdint_h="$ac_stdint_h"</div><div class='del'>-_ac_stdint_h=AS_TR_CPP(_$PACKAGE-$ac_stdint_h)</div><div class='del'>-ac_cv_stdint_message="$ac_cv_stdint_message"</div><div class='del'>-ac_cv_header_stdint_t="$ac_cv_header_stdint_t"</div><div class='del'>-ac_cv_header_stdint_x="$ac_cv_header_stdint_x"</div><div class='del'>-ac_cv_header_stdint_o="$ac_cv_header_stdint_o"</div><div class='del'>-ac_cv_header_stdint_u="$ac_cv_header_stdint_u"</div><div class='del'>-ac_cv_type_uint64_t="$ac_cv_type_uint64_t"</div><div class='del'>-ac_cv_type_u_int64_t="$ac_cv_type_u_int64_t"</div><div class='del'>-ac_cv_stdint_char_model="$ac_cv_stdint_char_model"</div><div class='del'>-ac_cv_stdint_long_model="$ac_cv_stdint_long_model"</div><div class='del'>-ac_cv_type_int_least32_t="$ac_cv_type_int_least32_t"</div><div class='del'>-ac_cv_type_int_fast32_t="$ac_cv_type_int_fast32_t"</div><div class='del'>-ac_cv_type_intmax_t="$ac_cv_type_intmax_t"</div><div class='del'>-])</div><div class='del'>-])</div><div class='head'>diff --git a/argp-standalone/argp-ba.c b/argp-standalone/argp-ba.c<br/>deleted file mode 100644<br/>index 0d3958c1151..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/argp-standalone/argp-ba.c?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>argp-standalone/argp-ba.c</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,26 +0,0 @@</div><div class='del'>-/* Default definition for ARGP_PROGRAM_BUG_ADDRESS.</div><div class='del'>-   Copyright (C) 1996, 1997, 1999, 2004 Free Software Foundation, Inc.</div><div class='del'>-   This file is part of the GNU C Library.</div><div class='del'>-   Written by Miles Bader &lt;miles@gnu.ai.mit.edu&gt;.</div><div class='del'>-</div><div class='del'>-   The GNU C Library is free software; you can redistribute it and/or</div><div class='del'>-   modify it under the terms of the GNU Library General Public License as</div><div class='del'>-   published by the Free Software Foundation; either version 2 of the</div><div class='del'>-   License, or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-   The GNU C Library is distributed in the hope that it will be useful,</div><div class='del'>-   but WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-   Library General Public License for more details.</div><div class='del'>-</div><div class='del'>-   You should have received a copy of the GNU Library General Public</div><div class='del'>-   License along with the GNU C Library; see the file COPYING.LIB.  If not,</div><div class='del'>-   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,</div><div class='del'>-   Boston, MA 02111-1307, USA.  */</div><div class='del'>-</div><div class='del'>-/* If set by the user program, it should point to string that is the</div><div class='del'>-   bug-reporting address for the program.  It will be printed by argp_help if</div><div class='del'>-   the ARGP_HELP_BUG_ADDR flag is set (as it is by various standard help</div><div class='del'>-   messages), embedded in a sentence that says something like `Report bugs to</div><div class='del'>-   ADDR.'.  */</div><div class='del'>-const char *argp_program_bug_address = 0;</div><div class='head'>diff --git a/argp-standalone/argp-eexst.c b/argp-standalone/argp-eexst.c<br/>deleted file mode 100644<br/>index 46b27847ad4..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/argp-standalone/argp-eexst.c?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>argp-standalone/argp-eexst.c</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,36 +0,0 @@</div><div class='del'>-/* Default definition for ARGP_ERR_EXIT_STATUS</div><div class='del'>-   Copyright (C) 1997 Free Software Foundation, Inc.</div><div class='del'>-   This file is part of the GNU C Library.</div><div class='del'>-   Written by Miles Bader &lt;miles@gnu.ai.mit.edu&gt;.</div><div class='del'>-</div><div class='del'>-   The GNU C Library is free software; you can redistribute it and/or</div><div class='del'>-   modify it under the terms of the GNU Library General Public License as</div><div class='del'>-   published by the Free Software Foundation; either version 2 of the</div><div class='del'>-   License, or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-   The GNU C Library is distributed in the hope that it will be useful,</div><div class='del'>-   but WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-   Library General Public License for more details.</div><div class='del'>-</div><div class='del'>-   You should have received a copy of the GNU Library General Public</div><div class='del'>-   License along with the GNU C Library; see the file COPYING.LIB.  If not,</div><div class='del'>-   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,</div><div class='del'>-   Boston, MA 02111-1307, USA.  */</div><div class='del'>-</div><div class='del'>-#ifdef HAVE_CONFIG_H</div><div class='del'>-#include &lt;config.h&gt;</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-#if HAVE_SYSEXITS_H</div><div class='del'>-# include &lt;sysexits.h&gt;</div><div class='del'>-#else</div><div class='del'>-# define EX_USAGE 64</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-#include "argp.h"</div><div class='del'>-</div><div class='del'>-/* The exit status that argp will use when exiting due to a parsing error.</div><div class='del'>-   If not defined or set by the user program, this defaults to EX_USAGE from</div><div class='del'>-   &lt;sysexits.h&gt;.  */</div><div class='del'>-error_t argp_err_exit_status = EX_USAGE;</div><div class='head'>diff --git a/argp-standalone/argp-fmtstream.c b/argp-standalone/argp-fmtstream.c<br/>deleted file mode 100644<br/>index 7f792854fc3..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/argp-standalone/argp-fmtstream.c?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>argp-standalone/argp-fmtstream.c</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,475 +0,0 @@</div><div class='del'>-/* Word-wrapping and line-truncating streams</div><div class='del'>-   Copyright (C) 1997, 1998, 1999, 2001 Free Software Foundation, Inc.</div><div class='del'>-   This file is part of the GNU C Library.</div><div class='del'>-   Written by Miles Bader &lt;miles@gnu.ai.mit.edu&gt;.</div><div class='del'>-</div><div class='del'>-   The GNU C Library is free software; you can redistribute it and/or</div><div class='del'>-   modify it under the terms of the GNU Library General Public License as</div><div class='del'>-   published by the Free Software Foundation; either version 2 of the</div><div class='del'>-   License, or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-   The GNU C Library is distributed in the hope that it will be useful,</div><div class='del'>-   but WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-   Library General Public License for more details.</div><div class='del'>-</div><div class='del'>-   You should have received a copy of the GNU Library General Public</div><div class='del'>-   License along with the GNU C Library; see the file COPYING.LIB.  If not,</div><div class='del'>-   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,</div><div class='del'>-   Boston, MA 02111-1307, USA.  */</div><div class='del'>-</div><div class='del'>-/* This package emulates glibc `line_wrap_stream' semantics for systems that</div><div class='del'>-   don't have that.  */</div><div class='del'>-</div><div class='del'>-#ifdef HAVE_CONFIG_H</div><div class='del'>-#include &lt;config.h&gt;</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-#include &lt;stdlib.h&gt;</div><div class='del'>-#include &lt;string.h&gt;</div><div class='del'>-#include &lt;errno.h&gt;</div><div class='del'>-#include &lt;stdarg.h&gt;</div><div class='del'>-#include &lt;ctype.h&gt;</div><div class='del'>-</div><div class='del'>-#include "argp-fmtstream.h"</div><div class='del'>-#include "argp-namefrob.h"</div><div class='del'>-</div><div class='del'>-#ifndef ARGP_FMTSTREAM_USE_LINEWRAP</div><div class='del'>-</div><div class='del'>-#ifndef isblank</div><div class='del'>-#define isblank(ch) ((ch)==' ' || (ch)=='\t')</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-#if defined _LIBC &amp;&amp; defined USE_IN_LIBIO</div><div class='del'>-# include &lt;libio/libioP.h&gt;</div><div class='del'>-# define __vsnprintf(s, l, f, a) _IO_vsnprintf (s, l, f, a)</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-#define INIT_BUF_SIZE 200</div><div class='del'>-#define PRINTF_SIZE_GUESS 150</div><div class='del'>-</div><div class='del'>-/* Return an argp_fmtstream that outputs to STREAM, and which prefixes lines</div><div class='del'>-   written on it with LMARGIN spaces and limits them to RMARGIN columns</div><div class='del'>-   total.  If WMARGIN &gt;= 0, words that extend past RMARGIN are wrapped by</div><div class='del'>-   replacing the whitespace before them with a newline and WMARGIN spaces.</div><div class='del'>-   Otherwise, chars beyond RMARGIN are simply dropped until a newline.</div><div class='del'>-   Returns NULL if there was an error.  */</div><div class='del'>-argp_fmtstream_t</div><div class='del'>-__argp_make_fmtstream (FILE *stream,</div><div class='del'>-		       size_t lmargin, size_t rmargin, ssize_t wmargin)</div><div class='del'>-{</div><div class='del'>-  argp_fmtstream_t fs = malloc (sizeof (struct argp_fmtstream));</div><div class='del'>-  if (fs)</div><div class='del'>-    {</div><div class='del'>-      fs-&gt;stream = stream;</div><div class='del'>-</div><div class='del'>-      fs-&gt;lmargin = lmargin;</div><div class='del'>-      fs-&gt;rmargin = rmargin;</div><div class='del'>-      fs-&gt;wmargin = wmargin;</div><div class='del'>-      fs-&gt;point_col = 0;</div><div class='del'>-      fs-&gt;point_offs = 0;</div><div class='del'>-</div><div class='del'>-      fs-&gt;buf = malloc (INIT_BUF_SIZE);</div><div class='del'>-      if (! fs-&gt;buf)</div><div class='del'>-	{</div><div class='del'>-	  free (fs);</div><div class='del'>-	  fs = 0;</div><div class='del'>-	}</div><div class='del'>-      else</div><div class='del'>-	{</div><div class='del'>-	  fs-&gt;p = fs-&gt;buf;</div><div class='del'>-	  fs-&gt;end = fs-&gt;buf + INIT_BUF_SIZE;</div><div class='del'>-	}</div><div class='del'>-    }</div><div class='del'>-</div><div class='del'>-  return fs;</div><div class='del'>-}</div><div class='del'>-#ifdef weak_alias</div><div class='del'>-weak_alias (__argp_make_fmtstream, argp_make_fmtstream)</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-/* Flush FS to its stream, and free it (but don't close the stream).  */</div><div class='del'>-void</div><div class='del'>-__argp_fmtstream_free (argp_fmtstream_t fs)</div><div class='del'>-{</div><div class='del'>-  __argp_fmtstream_update (fs);</div><div class='del'>-  if (fs-&gt;p &gt; fs-&gt;buf)</div><div class='del'>-    FWRITE_UNLOCKED (fs-&gt;buf, 1, fs-&gt;p - fs-&gt;buf, fs-&gt;stream);</div><div class='del'>-  free (fs-&gt;buf);</div><div class='del'>-  free (fs);</div><div class='del'>-}</div><div class='del'>-#ifdef weak_alias</div><div class='del'>-weak_alias (__argp_fmtstream_free, argp_fmtstream_free)</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-/* Process FS's buffer so that line wrapping is done from POINT_OFFS to the</div><div class='del'>-   end of its buffer.  This code is mostly from glibc stdio/linewrap.c.  */</div><div class='del'>-void</div><div class='del'>-__argp_fmtstream_update (argp_fmtstream_t fs)</div><div class='del'>-{</div><div class='del'>-  char *buf, *nl;</div><div class='del'>-  size_t len;</div><div class='del'>-</div><div class='del'>-  /* Scan the buffer for newlines.  */</div><div class='del'>-  buf = fs-&gt;buf + fs-&gt;point_offs;</div><div class='del'>-  while (buf &lt; fs-&gt;p)</div><div class='del'>-    {</div><div class='del'>-      size_t r;</div><div class='del'>-</div><div class='del'>-      if (fs-&gt;point_col == 0 &amp;&amp; fs-&gt;lmargin != 0)</div><div class='del'>-	{</div><div class='del'>-	  /* We are starting a new line.  Print spaces to the left margin.  */</div><div class='del'>-	  const size_t pad = fs-&gt;lmargin;</div><div class='del'>-	  if (fs-&gt;p + pad &lt; fs-&gt;end)</div><div class='del'>-	    {</div><div class='del'>-	      /* We can fit in them in the buffer by moving the</div><div class='del'>-		 buffer text up and filling in the beginning.  */</div><div class='del'>-	      memmove (buf + pad, buf, fs-&gt;p - buf);</div><div class='del'>-	      fs-&gt;p += pad; /* Compensate for bigger buffer. */</div><div class='del'>-	      memset (buf, ' ', pad); /* Fill in the spaces.  */</div><div class='del'>-	      buf += pad; /* Don't bother searching them.  */</div><div class='del'>-	    }</div><div class='del'>-	  else</div><div class='del'>-	    {</div><div class='del'>-	      /* No buffer space for spaces.  Must flush.  */</div><div class='del'>-	      size_t i;</div><div class='del'>-	      for (i = 0; i &lt; pad; i++)</div><div class='del'>-		PUTC_UNLOCKED (' ', fs-&gt;stream);</div><div class='del'>-	    }</div><div class='del'>-	  fs-&gt;point_col = pad;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-      len = fs-&gt;p - buf;</div><div class='del'>-      nl = memchr (buf, '\n', len);</div><div class='del'>-</div><div class='del'>-      if (fs-&gt;point_col &lt; 0)</div><div class='del'>-	fs-&gt;point_col = 0;</div><div class='del'>-</div><div class='del'>-      if (!nl)</div><div class='del'>-	{</div><div class='del'>-	  /* The buffer ends in a partial line.  */</div><div class='del'>-</div><div class='del'>-	  if (fs-&gt;point_col + len &lt; fs-&gt;rmargin)</div><div class='del'>-	    {</div><div class='del'>-	      /* The remaining buffer text is a partial line and fits</div><div class='del'>-		 within the maximum line width.  Advance point for the</div><div class='del'>-		 characters to be written and stop scanning.  */</div><div class='del'>-	      fs-&gt;point_col += len;</div><div class='del'>-	      break;</div><div class='del'>-	    }</div><div class='del'>-	  else</div><div class='del'>-	    /* Set the end-of-line pointer for the code below to</div><div class='del'>-	       the end of the buffer.  */</div><div class='del'>-	    nl = fs-&gt;p;</div><div class='del'>-	}</div><div class='del'>-      else if (fs-&gt;point_col + (nl - buf) &lt; (ssize_t) fs-&gt;rmargin)</div><div class='del'>-	{</div><div class='del'>-	  /* The buffer contains a full line that fits within the maximum</div><div class='del'>-	     line width.  Reset point and scan the next line.  */</div><div class='del'>-	  fs-&gt;point_col = 0;</div><div class='del'>-	  buf = nl + 1;</div><div class='del'>-	  continue;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-      /* This line is too long.  */</div><div class='del'>-      r = fs-&gt;rmargin - 1;</div><div class='del'>-</div><div class='del'>-      if (fs-&gt;wmargin &lt; 0)</div><div class='del'>-	{</div><div class='del'>-	  /* Truncate the line by overwriting the excess with the</div><div class='del'>-	     newline and anything after it in the buffer.  */</div><div class='del'>-	  if (nl &lt; fs-&gt;p)</div><div class='del'>-	    {</div><div class='del'>-	      memmove (buf + (r - fs-&gt;point_col), nl, fs-&gt;p - nl);</div><div class='del'>-	      fs-&gt;p -= buf + (r - fs-&gt;point_col) - nl;</div><div class='del'>-	      /* Reset point for the next line and start scanning it.  */</div><div class='del'>-	      fs-&gt;point_col = 0;</div><div class='del'>-	      buf += r + 1; /* Skip full line plus \n. */</div><div class='del'>-	    }</div><div class='del'>-	  else</div><div class='del'>-	    {</div><div class='del'>-	      /* The buffer ends with a partial line that is beyond the</div><div class='del'>-		 maximum line width.  Advance point for the characters</div><div class='del'>-		 written, and discard those past the max from the buffer.  */</div><div class='del'>-	      fs-&gt;point_col += len;</div><div class='del'>-	      fs-&gt;p -= fs-&gt;point_col - r;</div><div class='del'>-	      break;</div><div class='del'>-	    }</div><div class='del'>-	}</div><div class='del'>-      else</div><div class='del'>-	{</div><div class='del'>-	  /* Do word wrap.  Go to the column just past the maximum line</div><div class='del'>-	     width and scan back for the beginning of the word there.</div><div class='del'>-	     Then insert a line break.  */</div><div class='del'>-</div><div class='del'>-	  char *p, *nextline;</div><div class='del'>-	  int i;</div><div class='del'>-</div><div class='del'>-	  p = buf + (r + 1 - fs-&gt;point_col);</div><div class='del'>-	  while (p &gt;= buf &amp;&amp; !isblank (*p))</div><div class='del'>-	    --p;</div><div class='del'>-	  nextline = p + 1;	/* This will begin the next line.  */</div><div class='del'>-</div><div class='del'>-	  if (nextline &gt; buf)</div><div class='del'>-	    {</div><div class='del'>-	      /* Swallow separating blanks.  */</div><div class='del'>-	      if (p &gt;= buf)</div><div class='del'>-		do</div><div class='del'>-		  --p;</div><div class='del'>-		while (p &gt;= buf &amp;&amp; isblank (*p));</div><div class='del'>-	      nl = p + 1;	/* The newline will replace the first blank. */</div><div class='del'>-	    }</div><div class='del'>-	  else</div><div class='del'>-	    {</div><div class='del'>-	      /* A single word that is greater than the maximum line width.</div><div class='del'>-		 Oh well.  Put it on an overlong line by itself.  */</div><div class='del'>-	      p = buf + (r + 1 - fs-&gt;point_col);</div><div class='del'>-	      /* Find the end of the long word.  */</div><div class='del'>-	      do</div><div class='del'>-		++p;</div><div class='del'>-	      while (p &lt; nl &amp;&amp; !isblank (*p));</div><div class='del'>-	      if (p == nl)</div><div class='del'>-		{</div><div class='del'>-		  /* It already ends a line.  No fussing required.  */</div><div class='del'>-		  fs-&gt;point_col = 0;</div><div class='del'>-		  buf = nl + 1;</div><div class='del'>-		  continue;</div><div class='del'>-		}</div><div class='del'>-	      /* We will move the newline to replace the first blank.  */</div><div class='del'>-	      nl = p;</div><div class='del'>-	      /* Swallow separating blanks.  */</div><div class='del'>-	      do</div><div class='del'>-		++p;</div><div class='del'>-	      while (isblank (*p));</div><div class='del'>-	      /* The next line will start here.  */</div><div class='del'>-	      nextline = p;</div><div class='del'>-	    }</div><div class='del'>-</div><div class='del'>-	  /* Note: There are a bunch of tests below for</div><div class='del'>-	     NEXTLINE == BUF + LEN + 1; this case is where NL happens to fall</div><div class='del'>-	     at the end of the buffer, and NEXTLINE is in fact empty (and so</div><div class='del'>-	     we need not be careful to maintain its contents).  */</div><div class='del'>-</div><div class='del'>-	  if (nextline == buf + len + 1</div><div class='del'>-	      ? fs-&gt;end - nl &lt; fs-&gt;wmargin + 1</div><div class='del'>-	      : nextline - (nl + 1) &lt; fs-&gt;wmargin)</div><div class='del'>-	    {</div><div class='del'>-	      /* The margin needs more blanks than we removed.  */</div><div class='del'>-	      if (fs-&gt;end - fs-&gt;p &gt; fs-&gt;wmargin + 1)</div><div class='del'>-		/* Make some space for them.  */</div><div class='del'>-		{</div><div class='del'>-		  size_t mv = fs-&gt;p - nextline;</div><div class='del'>-		  memmove (nl + 1 + fs-&gt;wmargin, nextline, mv);</div><div class='del'>-		  nextline = nl + 1 + fs-&gt;wmargin;</div><div class='del'>-		  len = nextline + mv - buf;</div><div class='del'>-		  *nl++ = '\n';</div><div class='del'>-		}</div><div class='del'>-	      else</div><div class='del'>-		/* Output the first line so we can use the space.  */</div><div class='del'>-		{</div><div class='del'>-		  if (nl &gt; fs-&gt;buf)</div><div class='del'>-		    FWRITE_UNLOCKED (fs-&gt;buf, 1, nl - fs-&gt;buf, fs-&gt;stream);</div><div class='del'>-		  PUTC_UNLOCKED ('\n', fs-&gt;stream);</div><div class='del'>-		  len += buf - fs-&gt;buf;</div><div class='del'>-		  nl = buf = fs-&gt;buf;</div><div class='del'>-		}</div><div class='del'>-	    }</div><div class='del'>-	  else</div><div class='del'>-	    /* We can fit the newline and blanks in before</div><div class='del'>-	       the next word.  */</div><div class='del'>-	    *nl++ = '\n';</div><div class='del'>-</div><div class='del'>-	  if (nextline - nl &gt;= fs-&gt;wmargin</div><div class='del'>-	      || (nextline == buf + len + 1 &amp;&amp; fs-&gt;end - nextline &gt;= fs-&gt;wmargin))</div><div class='del'>-	    /* Add blanks up to the wrap margin column.  */</div><div class='del'>-	    for (i = 0; i &lt; fs-&gt;wmargin; ++i)</div><div class='del'>-	      *nl++ = ' ';</div><div class='del'>-	  else</div><div class='del'>-	    for (i = 0; i &lt; fs-&gt;wmargin; ++i)</div><div class='del'>-	      PUTC_UNLOCKED (' ', fs-&gt;stream);</div><div class='del'>-</div><div class='del'>-	  /* Copy the tail of the original buffer into the current buffer</div><div class='del'>-	     position.  */</div><div class='del'>-	  if (nl &lt; nextline)</div><div class='del'>-	    memmove (nl, nextline, buf + len - nextline);</div><div class='del'>-	  len -= nextline - buf;</div><div class='del'>-</div><div class='del'>-	  /* Continue the scan on the remaining lines in the buffer.  */</div><div class='del'>-	  buf = nl;</div><div class='del'>-</div><div class='del'>-	  /* Restore bufp to include all the remaining text.  */</div><div class='del'>-	  fs-&gt;p = nl + len;</div><div class='del'>-</div><div class='del'>-	  /* Reset the counter of what has been output this line.  If wmargin</div><div class='del'>-	     is 0, we want to avoid the lmargin getting added, so we set</div><div class='del'>-	     point_col to a magic value of -1 in that case.  */</div><div class='del'>-	  fs-&gt;point_col = fs-&gt;wmargin ? fs-&gt;wmargin : -1;</div><div class='del'>-	}</div><div class='del'>-    }</div><div class='del'>-</div><div class='del'>-  /* Remember that we've scanned as far as the end of the buffer.  */</div><div class='del'>-  fs-&gt;point_offs = fs-&gt;p - fs-&gt;buf;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-/* Ensure that FS has space for AMOUNT more bytes in its buffer, either by</div><div class='del'>-   growing the buffer, or by flushing it.  True is returned iff we succeed. */</div><div class='del'>-int</div><div class='del'>-__argp_fmtstream_ensure (struct argp_fmtstream *fs, size_t amount)</div><div class='del'>-{</div><div class='del'>-  if ((size_t) (fs-&gt;end - fs-&gt;p) &lt; amount)</div><div class='del'>-    {</div><div class='del'>-      ssize_t wrote;</div><div class='del'>-</div><div class='del'>-      /* Flush FS's buffer.  */</div><div class='del'>-      __argp_fmtstream_update (fs);</div><div class='del'>-</div><div class='del'>-      wrote = FWRITE_UNLOCKED (fs-&gt;buf, 1, fs-&gt;p - fs-&gt;buf, fs-&gt;stream);</div><div class='del'>-      if (wrote == fs-&gt;p - fs-&gt;buf)</div><div class='del'>-	{</div><div class='del'>-	  fs-&gt;p = fs-&gt;buf;</div><div class='del'>-	  fs-&gt;point_offs = 0;</div><div class='del'>-	}</div><div class='del'>-      else</div><div class='del'>-	{</div><div class='del'>-	  fs-&gt;p -= wrote;</div><div class='del'>-	  fs-&gt;point_offs -= wrote;</div><div class='del'>-	  memmove (fs-&gt;buf, fs-&gt;buf + wrote, fs-&gt;p - fs-&gt;buf);</div><div class='del'>-	  return 0;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-      if ((size_t) (fs-&gt;end - fs-&gt;buf) &lt; amount)</div><div class='del'>-	/* Gotta grow the buffer.  */</div><div class='del'>-	{</div><div class='del'>-	  size_t new_size = fs-&gt;end - fs-&gt;buf + amount;</div><div class='del'>-	  char *new_buf = realloc (fs-&gt;buf, new_size);</div><div class='del'>-</div><div class='del'>-	  if (! new_buf)</div><div class='del'>-	    {</div><div class='del'>-	      __set_errno (ENOMEM);</div><div class='del'>-	      return 0;</div><div class='del'>-	    }</div><div class='del'>-</div><div class='del'>-	  fs-&gt;buf = new_buf;</div><div class='del'>-	  fs-&gt;end = new_buf + new_size;</div><div class='del'>-	  fs-&gt;p = fs-&gt;buf;</div><div class='del'>-	}</div><div class='del'>-    }</div><div class='del'>-</div><div class='del'>-  return 1;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-__argp_fmtstream_printf (struct argp_fmtstream *fs, const char *fmt, ...)</div><div class='del'>-{</div><div class='del'>-  size_t out;</div><div class='del'>-  size_t avail;</div><div class='del'>-  size_t size_guess = PRINTF_SIZE_GUESS; /* How much space to reserve. */</div><div class='del'>-</div><div class='del'>-  do</div><div class='del'>-    {</div><div class='del'>-      va_list args;</div><div class='del'>-</div><div class='del'>-      if (! __argp_fmtstream_ensure (fs, size_guess))</div><div class='del'>-	return -1;</div><div class='del'>-</div><div class='del'>-      va_start (args, fmt);</div><div class='del'>-      avail = fs-&gt;end - fs-&gt;p;</div><div class='del'>-      out = __vsnprintf (fs-&gt;p, avail, fmt, args);</div><div class='del'>-      va_end (args);</div><div class='del'>-      if (out &gt;= avail)</div><div class='del'>-	size_guess = out + 1;</div><div class='del'>-    }</div><div class='del'>-  while (out &gt;= avail);</div><div class='del'>-</div><div class='del'>-  fs-&gt;p += out;</div><div class='del'>-</div><div class='del'>-  return out;</div><div class='del'>-}</div><div class='del'>-#ifdef weak_alias</div><div class='del'>-weak_alias (__argp_fmtstream_printf, argp_fmtstream_printf)</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-/* Duplicate the inline definitions in argp-fmtstream.h, for compilers</div><div class='del'>- * that don't do inlining. */</div><div class='del'>-size_t</div><div class='del'>-__argp_fmtstream_write (argp_fmtstream_t __fs,</div><div class='del'>-			__const char *__str, size_t __len)</div><div class='del'>-{</div><div class='del'>-  if (__fs-&gt;p + __len &lt;= __fs-&gt;end || __argp_fmtstream_ensure (__fs, __len))</div><div class='del'>-    {</div><div class='del'>-      memcpy (__fs-&gt;p, __str, __len);</div><div class='del'>-      __fs-&gt;p += __len;</div><div class='del'>-      return __len;</div><div class='del'>-    }</div><div class='del'>-  else</div><div class='del'>-    return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-__argp_fmtstream_puts (argp_fmtstream_t __fs, __const char *__str)</div><div class='del'>-{</div><div class='del'>-  size_t __len = strlen (__str);</div><div class='del'>-  if (__len)</div><div class='del'>-    {</div><div class='del'>-      size_t __wrote = __argp_fmtstream_write (__fs, __str, __len);</div><div class='del'>-      return __wrote == __len ? 0 : -1;</div><div class='del'>-    }</div><div class='del'>-  else</div><div class='del'>-    return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-__argp_fmtstream_putc (argp_fmtstream_t __fs, int __ch)</div><div class='del'>-{</div><div class='del'>-  if (__fs-&gt;p &lt; __fs-&gt;end || __argp_fmtstream_ensure (__fs, 1))</div><div class='del'>-    return *__fs-&gt;p++ = __ch;</div><div class='del'>-  else</div><div class='del'>-    return EOF;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-/* Set __FS's left margin to __LMARGIN and return the old value.  */</div><div class='del'>-size_t</div><div class='del'>-__argp_fmtstream_set_lmargin (argp_fmtstream_t __fs, size_t __lmargin)</div><div class='del'>-{</div><div class='del'>-  size_t __old;</div><div class='del'>-  if ((size_t) (__fs-&gt;p - __fs-&gt;buf) &gt; __fs-&gt;point_offs)</div><div class='del'>-    __argp_fmtstream_update (__fs);</div><div class='del'>-  __old = __fs-&gt;lmargin;</div><div class='del'>-  __fs-&gt;lmargin = __lmargin;</div><div class='del'>-  return __old;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-/* Set __FS's right margin to __RMARGIN and return the old value.  */</div><div class='del'>-size_t</div><div class='del'>-__argp_fmtstream_set_rmargin (argp_fmtstream_t __fs, size_t __rmargin)</div><div class='del'>-{</div><div class='del'>-  size_t __old;</div><div class='del'>-  if ((size_t) (__fs-&gt;p - __fs-&gt;buf) &gt; __fs-&gt;point_offs)</div><div class='del'>-    __argp_fmtstream_update (__fs);</div><div class='del'>-  __old = __fs-&gt;rmargin;</div><div class='del'>-  __fs-&gt;rmargin = __rmargin;</div><div class='del'>-  return __old;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-/* Set FS's wrap margin to __WMARGIN and return the old value.  */</div><div class='del'>-size_t</div><div class='del'>-__argp_fmtstream_set_wmargin (argp_fmtstream_t __fs, size_t __wmargin)</div><div class='del'>-{</div><div class='del'>-  size_t __old;</div><div class='del'>-  if ((size_t) (__fs-&gt;p - __fs-&gt;buf) &gt; __fs-&gt;point_offs)</div><div class='del'>-    __argp_fmtstream_update (__fs);</div><div class='del'>-  __old = __fs-&gt;wmargin;</div><div class='del'>-  __fs-&gt;wmargin = __wmargin;</div><div class='del'>-  return __old;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-/* Return the column number of the current output point in __FS.  */</div><div class='del'>-size_t</div><div class='del'>-__argp_fmtstream_point (argp_fmtstream_t __fs)</div><div class='del'>-{</div><div class='del'>-  if ((size_t) (__fs-&gt;p - __fs-&gt;buf) &gt; __fs-&gt;point_offs)</div><div class='del'>-    __argp_fmtstream_update (__fs);</div><div class='del'>-  return __fs-&gt;point_col &gt;= 0 ? __fs-&gt;point_col : 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-#endif /* !ARGP_FMTSTREAM_USE_LINEWRAP */</div><div class='head'>diff --git a/argp-standalone/argp-fmtstream.h b/argp-standalone/argp-fmtstream.h<br/>deleted file mode 100644<br/>index e797b119ebd..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/argp-standalone/argp-fmtstream.h?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>argp-standalone/argp-fmtstream.h</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,319 +0,0 @@</div><div class='del'>-/* Word-wrapping and line-truncating streams.</div><div class='del'>-   Copyright (C) 1997, 2003 Free Software Foundation, Inc.</div><div class='del'>-   This file is part of the GNU C Library.</div><div class='del'>-   Written by Miles Bader &lt;miles@gnu.ai.mit.edu&gt;.</div><div class='del'>-</div><div class='del'>-   The GNU C Library is free software; you can redistribute it and/or</div><div class='del'>-   modify it under the terms of the GNU Library General Public License as</div><div class='del'>-   published by the Free Software Foundation; either version 2 of the</div><div class='del'>-   License, or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-   The GNU C Library is distributed in the hope that it will be useful,</div><div class='del'>-   but WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-   Library General Public License for more details.</div><div class='del'>-</div><div class='del'>-   You should have received a copy of the GNU Library General Public</div><div class='del'>-   License along with the GNU C Library; see the file COPYING.LIB.  If not,</div><div class='del'>-   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,</div><div class='del'>-   Boston, MA 02111-1307, USA.  */</div><div class='del'>-</div><div class='del'>-/* This package emulates glibc `line_wrap_stream' semantics for systems that</div><div class='del'>-   don't have that.  If the system does have it, it is just a wrapper for</div><div class='del'>-   that.  This header file is only used internally while compiling argp, and</div><div class='del'>-   shouldn't be installed.  */</div><div class='del'>-</div><div class='del'>-#ifndef _ARGP_FMTSTREAM_H</div><div class='del'>-#define _ARGP_FMTSTREAM_H</div><div class='del'>-</div><div class='del'>-#include &lt;stdio.h&gt;</div><div class='del'>-#include &lt;string.h&gt;</div><div class='del'>-</div><div class='del'>-#if HAVE_UNISTD_H</div><div class='del'>-# include &lt;unistd.h&gt;</div><div class='del'>-#else</div><div class='del'>-/* This is a kludge to make the code compile on windows. Perhaps it</div><div class='del'>-   would be better to just replace ssize_t with int through out the</div><div class='del'>-   code. */</div><div class='del'>-# define ssize_t int</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-#if _LIBC || (defined (HAVE_FLOCKFILE) &amp;&amp; defined(HAVE_PUTC_UNLOCKED) \</div><div class='del'>-     &amp;&amp; defined (HAVE_FPUTS_UNLOCKED) &amp;&amp; defined (HAVE_FWRITE_UNLOCKED) )</div><div class='del'>-/* Use locking funxtions */</div><div class='del'>-# define FLOCKFILE(f) flockfile(f)</div><div class='del'>-# define FUNLOCKFILE(f) funlockfile(f)</div><div class='del'>-# define PUTC_UNLOCKED(c, f) putc_unlocked((c), (f))</div><div class='del'>-# define FPUTS_UNLOCKED(s, f) fputs_unlocked((s), (f))</div><div class='del'>-# define FWRITE_UNLOCKED(b, s, n, f) fwrite_unlocked((b), (s), (n), (f))</div><div class='del'>-#else</div><div class='del'>-/* Disable stdio locking */</div><div class='del'>-# define FLOCKFILE(f)</div><div class='del'>-# define FUNLOCKFILE(f)</div><div class='del'>-# define PUTC_UNLOCKED(c, f) putc((c), (f))</div><div class='del'>-# define FPUTS_UNLOCKED(s, f) fputs((s), (f))</div><div class='del'>-# define FWRITE_UNLOCKED(b, s, n, f) fwrite((b), (s), (n), (f))</div><div class='del'>-#endif /* No thread safe i/o */</div><div class='del'>-</div><div class='del'>-#if    (_LIBC - 0 &amp;&amp; !defined (USE_IN_LIBIO)) \</div><div class='del'>-    || (defined (__GNU_LIBRARY__) &amp;&amp; defined (HAVE_LINEWRAP_H))</div><div class='del'>-/* line_wrap_stream is available, so use that.  */</div><div class='del'>-#define ARGP_FMTSTREAM_USE_LINEWRAP</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-#ifdef ARGP_FMTSTREAM_USE_LINEWRAP</div><div class='del'>-/* Just be a simple wrapper for line_wrap_stream; the semantics are</div><div class='del'>-   *slightly* different, as line_wrap_stream doesn't actually make a new</div><div class='del'>-   object, it just modifies the given stream (reversibly) to do</div><div class='del'>-   line-wrapping.  Since we control who uses this code, it doesn't matter.  */</div><div class='del'>-</div><div class='del'>-#include &lt;linewrap.h&gt;</div><div class='del'>-</div><div class='del'>-typedef FILE *argp_fmtstream_t;</div><div class='del'>-</div><div class='del'>-#define argp_make_fmtstream line_wrap_stream</div><div class='del'>-#define __argp_make_fmtstream line_wrap_stream</div><div class='del'>-#define argp_fmtstream_free line_unwrap_stream</div><div class='del'>-#define __argp_fmtstream_free line_unwrap_stream</div><div class='del'>-</div><div class='del'>-#define __argp_fmtstream_putc(fs,ch) putc(ch,fs)</div><div class='del'>-#define argp_fmtstream_putc(fs,ch) putc(ch,fs)</div><div class='del'>-#define __argp_fmtstream_puts(fs,str) fputs(str,fs)</div><div class='del'>-#define argp_fmtstream_puts(fs,str) fputs(str,fs)</div><div class='del'>-#define __argp_fmtstream_write(fs,str,len) fwrite(str,1,len,fs)</div><div class='del'>-#define argp_fmtstream_write(fs,str,len) fwrite(str,1,len,fs)</div><div class='del'>-#define __argp_fmtstream_printf fprintf</div><div class='del'>-#define argp_fmtstream_printf fprintf</div><div class='del'>-</div><div class='del'>-#define __argp_fmtstream_lmargin line_wrap_lmargin</div><div class='del'>-#define argp_fmtstream_lmargin line_wrap_lmargin</div><div class='del'>-#define __argp_fmtstream_set_lmargin line_wrap_set_lmargin</div><div class='del'>-#define argp_fmtstream_set_lmargin line_wrap_set_lmargin</div><div class='del'>-#define __argp_fmtstream_rmargin line_wrap_rmargin</div><div class='del'>-#define argp_fmtstream_rmargin line_wrap_rmargin</div><div class='del'>-#define __argp_fmtstream_set_rmargin line_wrap_set_rmargin</div><div class='del'>-#define argp_fmtstream_set_rmargin line_wrap_set_rmargin</div><div class='del'>-#define __argp_fmtstream_wmargin line_wrap_wmargin</div><div class='del'>-#define argp_fmtstream_wmargin line_wrap_wmargin</div><div class='del'>-#define __argp_fmtstream_set_wmargin line_wrap_set_wmargin</div><div class='del'>-#define argp_fmtstream_set_wmargin line_wrap_set_wmargin</div><div class='del'>-#define __argp_fmtstream_point line_wrap_point</div><div class='del'>-#define argp_fmtstream_point line_wrap_point</div><div class='del'>-</div><div class='del'>-#else /* !ARGP_FMTSTREAM_USE_LINEWRAP */</div><div class='del'>-/* Guess we have to define our own version.  */</div><div class='del'>-</div><div class='del'>-#ifndef __const</div><div class='del'>-#define __const const</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-struct argp_fmtstream</div><div class='del'>-{</div><div class='del'>-  FILE *stream;			/* The stream we're outputting to.  */</div><div class='del'>-</div><div class='del'>-  size_t lmargin, rmargin;	/* Left and right margins.  */</div><div class='del'>-  ssize_t wmargin;		/* Margin to wrap to, or -1 to truncate.  */</div><div class='del'>-</div><div class='del'>-  /* Point in buffer to which we've processed for wrapping, but not output.  */</div><div class='del'>-  size_t point_offs;</div><div class='del'>-  /* Output column at POINT_OFFS, or -1 meaning 0 but don't add lmargin.  */</div><div class='del'>-  ssize_t point_col;</div><div class='del'>-</div><div class='del'>-  char *buf;			/* Output buffer.  */</div><div class='del'>-  char *p;			/* Current end of text in BUF. */</div><div class='del'>-  char *end;			/* Absolute end of BUF.  */</div><div class='del'>-};</div><div class='del'>-</div><div class='del'>-typedef struct argp_fmtstream *argp_fmtstream_t;</div><div class='del'>-</div><div class='del'>-/* Return an argp_fmtstream that outputs to STREAM, and which prefixes lines</div><div class='del'>-   written on it with LMARGIN spaces and limits them to RMARGIN columns</div><div class='del'>-   total.  If WMARGIN &gt;= 0, words that extend past RMARGIN are wrapped by</div><div class='del'>-   replacing the whitespace before them with a newline and WMARGIN spaces.</div><div class='del'>-   Otherwise, chars beyond RMARGIN are simply dropped until a newline.</div><div class='del'>-   Returns NULL if there was an error.  */</div><div class='del'>-extern argp_fmtstream_t __argp_make_fmtstream (FILE *__stream,</div><div class='del'>-					       size_t __lmargin,</div><div class='del'>-					       size_t __rmargin,</div><div class='del'>-					       ssize_t __wmargin);</div><div class='del'>-extern argp_fmtstream_t argp_make_fmtstream (FILE *__stream,</div><div class='del'>-					     size_t __lmargin,</div><div class='del'>-					     size_t __rmargin,</div><div class='del'>-					     ssize_t __wmargin);</div><div class='del'>-</div><div class='del'>-/* Flush __FS to its stream, and free it (but don't close the stream).  */</div><div class='del'>-extern void __argp_fmtstream_free (argp_fmtstream_t __fs);</div><div class='del'>-extern void argp_fmtstream_free (argp_fmtstream_t __fs);</div><div class='del'>-</div><div class='del'>-extern ssize_t __argp_fmtstream_printf (argp_fmtstream_t __fs,</div><div class='del'>-				       __const char *__fmt, ...)</div><div class='del'>-     PRINTF_STYLE(2,3);</div><div class='del'>-extern ssize_t argp_fmtstream_printf (argp_fmtstream_t __fs,</div><div class='del'>-				      __const char *__fmt, ...)</div><div class='del'>-     PRINTF_STYLE(2,3);</div><div class='del'>-</div><div class='del'>-extern int __argp_fmtstream_putc (argp_fmtstream_t __fs, int __ch);</div><div class='del'>-extern int argp_fmtstream_putc (argp_fmtstream_t __fs, int __ch);</div><div class='del'>-</div><div class='del'>-extern int __argp_fmtstream_puts (argp_fmtstream_t __fs, __const char *__str);</div><div class='del'>-extern int argp_fmtstream_puts (argp_fmtstream_t __fs, __const char *__str);</div><div class='del'>-</div><div class='del'>-extern size_t __argp_fmtstream_write (argp_fmtstream_t __fs,</div><div class='del'>-				      __const char *__str, size_t __len);</div><div class='del'>-extern size_t argp_fmtstream_write (argp_fmtstream_t __fs,</div><div class='del'>-				    __const char *__str, size_t __len);</div><div class='del'>-</div><div class='del'>-/* Access macros for various bits of state.  */</div><div class='del'>-#define argp_fmtstream_lmargin(__fs) ((__fs)-&gt;lmargin)</div><div class='del'>-#define argp_fmtstream_rmargin(__fs) ((__fs)-&gt;rmargin)</div><div class='del'>-#define argp_fmtstream_wmargin(__fs) ((__fs)-&gt;wmargin)</div><div class='del'>-#define __argp_fmtstream_lmargin argp_fmtstream_lmargin</div><div class='del'>-#define __argp_fmtstream_rmargin argp_fmtstream_rmargin</div><div class='del'>-#define __argp_fmtstream_wmargin argp_fmtstream_wmargin</div><div class='del'>-</div><div class='del'>-/* Set __FS's left margin to LMARGIN and return the old value.  */</div><div class='del'>-extern size_t argp_fmtstream_set_lmargin (argp_fmtstream_t __fs,</div><div class='del'>-					  size_t __lmargin);</div><div class='del'>-extern size_t __argp_fmtstream_set_lmargin (argp_fmtstream_t __fs,</div><div class='del'>-					    size_t __lmargin);</div><div class='del'>-</div><div class='del'>-/* Set __FS's right margin to __RMARGIN and return the old value.  */</div><div class='del'>-extern size_t argp_fmtstream_set_rmargin (argp_fmtstream_t __fs,</div><div class='del'>-					  size_t __rmargin);</div><div class='del'>-extern size_t __argp_fmtstream_set_rmargin (argp_fmtstream_t __fs,</div><div class='del'>-					    size_t __rmargin);</div><div class='del'>-</div><div class='del'>-/* Set __FS's wrap margin to __WMARGIN and return the old value.  */</div><div class='del'>-extern size_t argp_fmtstream_set_wmargin (argp_fmtstream_t __fs,</div><div class='del'>-					  size_t __wmargin);</div><div class='del'>-extern size_t __argp_fmtstream_set_wmargin (argp_fmtstream_t __fs,</div><div class='del'>-					    size_t __wmargin);</div><div class='del'>-</div><div class='del'>-/* Return the column number of the current output point in __FS.  */</div><div class='del'>-extern size_t argp_fmtstream_point (argp_fmtstream_t __fs);</div><div class='del'>-extern size_t __argp_fmtstream_point (argp_fmtstream_t __fs);</div><div class='del'>-</div><div class='del'>-/* Internal routines.  */</div><div class='del'>-extern void _argp_fmtstream_update (argp_fmtstream_t __fs);</div><div class='del'>-extern void __argp_fmtstream_update (argp_fmtstream_t __fs);</div><div class='del'>-extern int _argp_fmtstream_ensure (argp_fmtstream_t __fs, size_t __amount);</div><div class='del'>-extern int __argp_fmtstream_ensure (argp_fmtstream_t __fs, size_t __amount);</div><div class='del'>-</div><div class='del'>-#ifdef __OPTIMIZE__</div><div class='del'>-/* Inline versions of above routines.  */</div><div class='del'>-</div><div class='del'>-#if !_LIBC</div><div class='del'>-#define __argp_fmtstream_putc argp_fmtstream_putc</div><div class='del'>-#define __argp_fmtstream_puts argp_fmtstream_puts</div><div class='del'>-#define __argp_fmtstream_write argp_fmtstream_write</div><div class='del'>-#define __argp_fmtstream_set_lmargin argp_fmtstream_set_lmargin</div><div class='del'>-#define __argp_fmtstream_set_rmargin argp_fmtstream_set_rmargin</div><div class='del'>-#define __argp_fmtstream_set_wmargin argp_fmtstream_set_wmargin</div><div class='del'>-#define __argp_fmtstream_point argp_fmtstream_point</div><div class='del'>-#define __argp_fmtstream_update _argp_fmtstream_update</div><div class='del'>-#define __argp_fmtstream_ensure _argp_fmtstream_ensure</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-#ifndef ARGP_FS_EI</div><div class='del'>-#define ARGP_FS_EI extern inline</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-ARGP_FS_EI size_t</div><div class='del'>-__argp_fmtstream_write (argp_fmtstream_t __fs,</div><div class='del'>-			__const char *__str, size_t __len)</div><div class='del'>-{</div><div class='del'>-  if (__fs-&gt;p + __len &lt;= __fs-&gt;end || __argp_fmtstream_ensure (__fs, __len))</div><div class='del'>-    {</div><div class='del'>-      memcpy (__fs-&gt;p, __str, __len);</div><div class='del'>-      __fs-&gt;p += __len;</div><div class='del'>-      return __len;</div><div class='del'>-    }</div><div class='del'>-  else</div><div class='del'>-    return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-ARGP_FS_EI int</div><div class='del'>-__argp_fmtstream_puts (argp_fmtstream_t __fs, __const char *__str)</div><div class='del'>-{</div><div class='del'>-  size_t __len = strlen (__str);</div><div class='del'>-  if (__len)</div><div class='del'>-    {</div><div class='del'>-      size_t __wrote = __argp_fmtstream_write (__fs, __str, __len);</div><div class='del'>-      return __wrote == __len ? 0 : -1;</div><div class='del'>-    }</div><div class='del'>-  else</div><div class='del'>-    return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-ARGP_FS_EI int</div><div class='del'>-__argp_fmtstream_putc (argp_fmtstream_t __fs, int __ch)</div><div class='del'>-{</div><div class='del'>-  if (__fs-&gt;p &lt; __fs-&gt;end || __argp_fmtstream_ensure (__fs, 1))</div><div class='del'>-    return *__fs-&gt;p++ = __ch;</div><div class='del'>-  else</div><div class='del'>-    return EOF;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-/* Set __FS's left margin to __LMARGIN and return the old value.  */</div><div class='del'>-ARGP_FS_EI size_t</div><div class='del'>-__argp_fmtstream_set_lmargin (argp_fmtstream_t __fs, size_t __lmargin)</div><div class='del'>-{</div><div class='del'>-  size_t __old;</div><div class='del'>-  if ((size_t) (__fs-&gt;p - __fs-&gt;buf) &gt; __fs-&gt;point_offs)</div><div class='del'>-    __argp_fmtstream_update (__fs);</div><div class='del'>-  __old = __fs-&gt;lmargin;</div><div class='del'>-  __fs-&gt;lmargin = __lmargin;</div><div class='del'>-  return __old;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-/* Set __FS's right margin to __RMARGIN and return the old value.  */</div><div class='del'>-ARGP_FS_EI size_t</div><div class='del'>-__argp_fmtstream_set_rmargin (argp_fmtstream_t __fs, size_t __rmargin)</div><div class='del'>-{</div><div class='del'>-  size_t __old;</div><div class='del'>-  if ((size_t) (__fs-&gt;p - __fs-&gt;buf) &gt; __fs-&gt;point_offs)</div><div class='del'>-    __argp_fmtstream_update (__fs);</div><div class='del'>-  __old = __fs-&gt;rmargin;</div><div class='del'>-  __fs-&gt;rmargin = __rmargin;</div><div class='del'>-  return __old;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-/* Set FS's wrap margin to __WMARGIN and return the old value.  */</div><div class='del'>-ARGP_FS_EI size_t</div><div class='del'>-__argp_fmtstream_set_wmargin (argp_fmtstream_t __fs, size_t __wmargin)</div><div class='del'>-{</div><div class='del'>-  size_t __old;</div><div class='del'>-  if ((size_t) (__fs-&gt;p - __fs-&gt;buf) &gt; __fs-&gt;point_offs)</div><div class='del'>-    __argp_fmtstream_update (__fs);</div><div class='del'>-  __old = __fs-&gt;wmargin;</div><div class='del'>-  __fs-&gt;wmargin = __wmargin;</div><div class='del'>-  return __old;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-/* Return the column number of the current output point in __FS.  */</div><div class='del'>-ARGP_FS_EI size_t</div><div class='del'>-__argp_fmtstream_point (argp_fmtstream_t __fs)</div><div class='del'>-{</div><div class='del'>-  if ((size_t) (__fs-&gt;p - __fs-&gt;buf) &gt; __fs-&gt;point_offs)</div><div class='del'>-    __argp_fmtstream_update (__fs);</div><div class='del'>-  return __fs-&gt;point_col &gt;= 0 ? __fs-&gt;point_col : 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-#if !_LIBC</div><div class='del'>-#undef __argp_fmtstream_putc</div><div class='del'>-#undef __argp_fmtstream_puts</div><div class='del'>-#undef __argp_fmtstream_write</div><div class='del'>-#undef __argp_fmtstream_set_lmargin</div><div class='del'>-#undef __argp_fmtstream_set_rmargin</div><div class='del'>-#undef __argp_fmtstream_set_wmargin</div><div class='del'>-#undef __argp_fmtstream_point</div><div class='del'>-#undef __argp_fmtstream_update</div><div class='del'>-#undef __argp_fmtstream_ensure</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-#endif /* __OPTIMIZE__ */</div><div class='del'>-</div><div class='del'>-#endif /* ARGP_FMTSTREAM_USE_LINEWRAP */</div><div class='del'>-</div><div class='del'>-#endif /* argp-fmtstream.h */</div><div class='head'>diff --git a/argp-standalone/argp-help.c b/argp-standalone/argp-help.c<br/>deleted file mode 100644<br/>index ced78c4cb26..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/argp-standalone/argp-help.c?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>argp-standalone/argp-help.c</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,1849 +0,0 @@</div><div class='del'>-/* Hierarchial argument parsing help output</div><div class='del'>-   Copyright (C) 1995,96,97,98,99,2000, 2003 Free Software Foundation, Inc.</div><div class='del'>-   This file is part of the GNU C Library.</div><div class='del'>-   Written by Miles Bader &lt;miles@gnu.ai.mit.edu&gt;.</div><div class='del'>-</div><div class='del'>-   The GNU C Library is free software; you can redistribute it and/or</div><div class='del'>-   modify it under the terms of the GNU Library General Public License as</div><div class='del'>-   published by the Free Software Foundation; either version 2 of the</div><div class='del'>-   License, or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-   The GNU C Library is distributed in the hope that it will be useful,</div><div class='del'>-   but WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-   Library General Public License for more details.</div><div class='del'>-</div><div class='del'>-   You should have received a copy of the GNU Library General Public</div><div class='del'>-   License along with the GNU C Library; see the file COPYING.LIB.  If not,</div><div class='del'>-   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,</div><div class='del'>-   Boston, MA 02111-1307, USA.  */</div><div class='del'>-</div><div class='del'>-#ifndef _GNU_SOURCE</div><div class='del'>-# define _GNU_SOURCE	1</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-#ifdef HAVE_CONFIG_H</div><div class='del'>-#include &lt;config.h&gt;</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-#if HAVE_ALLOCA_H</div><div class='del'>-#include &lt;alloca.h&gt;</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-#include &lt;stddef.h&gt;</div><div class='del'>-#include &lt;stdlib.h&gt;</div><div class='del'>-#include &lt;string.h&gt;</div><div class='del'>-#include &lt;assert.h&gt;</div><div class='del'>-#include &lt;stdarg.h&gt;</div><div class='del'>-#include &lt;ctype.h&gt;</div><div class='del'>-#if HAVE_MALLOC_H</div><div class='del'>-/* Needed, for alloca on windows */</div><div class='del'>-# include &lt;malloc.h&gt;</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-#ifndef _</div><div class='del'>-/* This is for other GNU distributions with internationalized messages.  */</div><div class='del'>-# if defined HAVE_LIBINTL_H || defined _LIBC</div><div class='del'>-#  include &lt;libintl.h&gt;</div><div class='del'>-#  ifdef _LIBC</div><div class='del'>-#   undef dgettext</div><div class='del'>-#   define dgettext(domain, msgid) __dcgettext (domain, msgid, LC_MESSAGES)</div><div class='del'>-#  endif</div><div class='del'>-# else</div><div class='del'>-#  define dgettext(domain, msgid) (msgid)</div><div class='del'>-# endif</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-#include "argp.h"</div><div class='del'>-#include "argp-fmtstream.h"</div><div class='del'>-#include "argp-namefrob.h"</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-#ifndef _LIBC</div><div class='del'>-# ifndef __strchrnul</div><div class='del'>-#  define __strchrnul strchrnul</div><div class='del'>-# endif</div><div class='del'>-# ifndef __mempcpy</div><div class='del'>-#  define __mempcpy mempcpy</div><div class='del'>-# endif</div><div class='del'>-/* We need to use a different name, as __strndup is likely a macro. */</div><div class='del'>-# define STRNDUP strndup</div><div class='del'>-# if HAVE_STRERROR</div><div class='del'>-#  define STRERROR strerror</div><div class='del'>-# else</div><div class='del'>-#  define STRERROR(x) (sys_errlist[x])</div><div class='del'>-# endif</div><div class='del'>-#else /* _LIBC */</div><div class='del'>-# define FLOCKFILE __flockfile</div><div class='del'>-# define FUNLOCKFILE __funlockfile</div><div class='del'>-# define STRNDUP __strndup</div><div class='del'>-# define STRERROR strerror</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-#if !_LIBC</div><div class='del'>-# if !HAVE_STRNDUP</div><div class='del'>-char *strndup (const char *s, size_t size);</div><div class='del'>-# endif /* !HAVE_STRNDUP */</div><div class='del'>-</div><div class='del'>-# if !HAVE_MEMPCPY</div><div class='del'>-void *mempcpy (void *to, const void *from, size_t size);</div><div class='del'>-# endif /* !HAVE_MEMPCPY */</div><div class='del'>-</div><div class='del'>-# if !HAVE_STRCHRNUL</div><div class='del'>-char *strchrnul(const char *s, int c);</div><div class='del'>-# endif /* !HAVE_STRCHRNUL */</div><div class='del'>-</div><div class='del'>-# if !HAVE_STRCASECMP</div><div class='del'>-int strcasecmp(const char *s1, const char *s2);</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-#endif /* !_LIBC */</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-/* User-selectable (using an environment variable) formatting parameters.</div><div class='del'>-</div><div class='del'>-   These may be specified in an environment variable called `ARGP_HELP_FMT',</div><div class='del'>-   with a contents like:  VAR1=VAL1,VAR2=VAL2,BOOLVAR2,no-BOOLVAR2</div><div class='del'>-   Where VALn must be a positive integer.  The list of variables is in the</div><div class='del'>-   UPARAM_NAMES vector, below.  */</div><div class='del'>-</div><div class='del'>-/* Default parameters.  */</div><div class='del'>-#define DUP_ARGS      0		/* True if option argument can be duplicated. */</div><div class='del'>-#define DUP_ARGS_NOTE 1		/* True to print a note about duplicate args. */</div><div class='del'>-#define SHORT_OPT_COL 2		/* column in which short options start */</div><div class='del'>-#define LONG_OPT_COL  6		/* column in which long options start */</div><div class='del'>-#define DOC_OPT_COL   2		/* column in which doc options start */</div><div class='del'>-#define OPT_DOC_COL  29		/* column in which option text starts */</div><div class='del'>-#define HEADER_COL    1		/* column in which group headers are printed */</div><div class='del'>-#define USAGE_INDENT 12		/* indentation of wrapped usage lines */</div><div class='del'>-#define RMARGIN      79		/* right margin used for wrapping */</div><div class='del'>-</div><div class='del'>-/* User-selectable (using an environment variable) formatting parameters.</div><div class='del'>-   They must all be of type `int' for the parsing code to work.  */</div><div class='del'>-struct uparams</div><div class='del'>-{</div><div class='del'>-  /* If true, arguments for an option are shown with both short and long</div><div class='del'>-     options, even when a given option has both, e.g. `-x ARG, --longx=ARG'.</div><div class='del'>-     If false, then if an option has both, the argument is only shown with</div><div class='del'>-     the long one, e.g., `-x, --longx=ARG', and a message indicating that</div><div class='del'>-     this really means both is printed below the options.  */</div><div class='del'>-  int dup_args;</div><div class='del'>-</div><div class='del'>-  /* This is true if when DUP_ARGS is false, and some duplicate arguments have</div><div class='del'>-     been suppressed, an explanatory message should be printed.  */</div><div class='del'>-  int dup_args_note;</div><div class='del'>-</div><div class='del'>-  /* Various output columns.  */</div><div class='del'>-  int short_opt_col;</div><div class='del'>-  int long_opt_col;</div><div class='del'>-  int doc_opt_col;</div><div class='del'>-  int opt_doc_col;</div><div class='del'>-  int header_col;</div><div class='del'>-  int usage_indent;</div><div class='del'>-  int rmargin;</div><div class='del'>-</div><div class='del'>-  int valid;			/* True when the values in here are valid.  */</div><div class='del'>-};</div><div class='del'>-</div><div class='del'>-/* This is a global variable, as user options are only ever read once.  */</div><div class='del'>-static struct uparams uparams = {</div><div class='del'>-  DUP_ARGS, DUP_ARGS_NOTE,</div><div class='del'>-  SHORT_OPT_COL, LONG_OPT_COL, DOC_OPT_COL, OPT_DOC_COL, HEADER_COL,</div><div class='del'>-  USAGE_INDENT, RMARGIN,</div><div class='del'>-  0</div><div class='del'>-};</div><div class='del'>-</div><div class='del'>-/* A particular uparam, and what the user name is.  */</div><div class='del'>-struct uparam_name</div><div class='del'>-{</div><div class='del'>-  const char *name;		/* User name.  */</div><div class='del'>-  int is_bool;			/* Whether it's `boolean'.  */</div><div class='del'>-  size_t uparams_offs;		/* Location of the (int) field in UPARAMS.  */</div><div class='del'>-};</div><div class='del'>-</div><div class='del'>-/* The name-field mappings we know about.  */</div><div class='del'>-static const struct uparam_name uparam_names[] =</div><div class='del'>-{</div><div class='del'>-  { "dup-args",       1, offsetof (struct uparams, dup_args) },</div><div class='del'>-  { "dup-args-note",  1, offsetof (struct uparams, dup_args_note) },</div><div class='del'>-  { "short-opt-col",  0, offsetof (struct uparams, short_opt_col) },</div><div class='del'>-  { "long-opt-col",   0, offsetof (struct uparams, long_opt_col) },</div><div class='del'>-  { "doc-opt-col",    0, offsetof (struct uparams, doc_opt_col) },</div><div class='del'>-  { "opt-doc-col",    0, offsetof (struct uparams, opt_doc_col) },</div><div class='del'>-  { "header-col",     0, offsetof (struct uparams, header_col) },</div><div class='del'>-  { "usage-indent",   0, offsetof (struct uparams, usage_indent) },</div><div class='del'>-  { "rmargin",        0, offsetof (struct uparams, rmargin) },</div><div class='del'>-  { 0, 0, 0 }</div><div class='del'>-};</div><div class='del'>-</div><div class='del'>-/* Read user options from the environment, and fill in UPARAMS appropiately.  */</div><div class='del'>-static void</div><div class='del'>-fill_in_uparams (const struct argp_state *state)</div><div class='del'>-{</div><div class='del'>-</div><div class='del'>-  const char *var = getenv ("ARGP_HELP_FMT");</div><div class='del'>-</div><div class='del'>-#define SKIPWS(p) do { while (isspace (*p)) p++; } while (0);</div><div class='del'>-</div><div class='del'>-  if (var)</div><div class='del'>-    /* Parse var. */</div><div class='del'>-    while (*var)</div><div class='del'>-      {</div><div class='del'>-	SKIPWS (var);</div><div class='del'>-</div><div class='del'>-	if (isalpha (*var))</div><div class='del'>-	  {</div><div class='del'>-	    size_t var_len;</div><div class='del'>-	    const struct uparam_name *un;</div><div class='del'>-	    int unspec = 0, val = 0;</div><div class='del'>-	    const char *arg = var;</div><div class='del'>-</div><div class='del'>-	    while (isalnum (*arg) || *arg == '-' || *arg == '_')</div><div class='del'>-	      arg++;</div><div class='del'>-	    var_len = arg - var;</div><div class='del'>-</div><div class='del'>-	    SKIPWS (arg);</div><div class='del'>-</div><div class='del'>-	    if (*arg == '\0' || *arg == ',')</div><div class='del'>-	      unspec = 1;</div><div class='del'>-	    else if (*arg == '=')</div><div class='del'>-	      {</div><div class='del'>-		arg++;</div><div class='del'>-		SKIPWS (arg);</div><div class='del'>-	      }</div><div class='del'>-</div><div class='del'>-	    if (unspec)</div><div class='del'>-	      {</div><div class='del'>-		if (var[0] == 'n' &amp;&amp; var[1] == 'o' &amp;&amp; var[2] == '-')</div><div class='del'>-		  {</div><div class='del'>-		    val = 0;</div><div class='del'>-		    var += 3;</div><div class='del'>-		    var_len -= 3;</div><div class='del'>-		  }</div><div class='del'>-		else</div><div class='del'>-		  val = 1;</div><div class='del'>-	      }</div><div class='del'>-	    else if (isdigit (*arg))</div><div class='del'>-	      {</div><div class='del'>-		val = atoi (arg);</div><div class='del'>-		while (isdigit (*arg))</div><div class='del'>-		  arg++;</div><div class='del'>-		SKIPWS (arg);</div><div class='del'>-	      }</div><div class='del'>-</div><div class='del'>-	    for (un = uparam_names; un-&gt;name; un++)</div><div class='del'>-	      if (strlen (un-&gt;name) == var_len</div><div class='del'>-		  &amp;&amp; strncmp (var, un-&gt;name, var_len) == 0)</div><div class='del'>-		{</div><div class='del'>-		  if (unspec &amp;&amp; !un-&gt;is_bool)</div><div class='del'>-		    __argp_failure (state, 0, 0,</div><div class='del'>-				    dgettext (state-&gt;root_argp-&gt;argp_domain, "\</div><div class='del'>-%.*s: ARGP_HELP_FMT parameter requires a value"),</div><div class='del'>-				    (int) var_len, var);</div><div class='del'>-		  else</div><div class='del'>-		    *(int *)((char *)&amp;uparams + un-&gt;uparams_offs) = val;</div><div class='del'>-		  break;</div><div class='del'>-		}</div><div class='del'>-	    if (! un-&gt;name)</div><div class='del'>-	      __argp_failure (state, 0, 0,</div><div class='del'>-			      dgettext (state-&gt;root_argp-&gt;argp_domain, "\</div><div class='del'>-%.*s: Unknown ARGP_HELP_FMT parameter"),</div><div class='del'>-			      (int) var_len, var);</div><div class='del'>-</div><div class='del'>-	    var = arg;</div><div class='del'>-	    if (*var == ',')</div><div class='del'>-	      var++;</div><div class='del'>-	  }</div><div class='del'>-	else if (*var)</div><div class='del'>-	  {</div><div class='del'>-	    __argp_failure (state, 0, 0,</div><div class='del'>-			    dgettext (state-&gt;root_argp-&gt;argp_domain,</div><div class='del'>-				      "Garbage in ARGP_HELP_FMT: %s"), var);</div><div class='del'>-	    break;</div><div class='del'>-	  }</div><div class='del'>-      }</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-/* Returns true if OPT hasn't been marked invisible.  Visibility only affects</div><div class='del'>-   whether OPT is displayed or used in sorting, not option shadowing.  */</div><div class='del'>-#define ovisible(opt) (! ((opt)-&gt;flags &amp; OPTION_HIDDEN))</div><div class='del'>-</div><div class='del'>-/* Returns true if OPT is an alias for an earlier option.  */</div><div class='del'>-#define oalias(opt) ((opt)-&gt;flags &amp; OPTION_ALIAS)</div><div class='del'>-</div><div class='del'>-/* Returns true if OPT is an documentation-only entry.  */</div><div class='del'>-#define odoc(opt) ((opt)-&gt;flags &amp; OPTION_DOC)</div><div class='del'>-</div><div class='del'>-/* Returns true if OPT is the end-of-list marker for a list of options.  */</div><div class='del'>-#define oend(opt) __option_is_end (opt)</div><div class='del'>-</div><div class='del'>-/* Returns true if OPT has a short option.  */</div><div class='del'>-#define oshort(opt) __option_is_short (opt)</div><div class='del'>-</div><div class='del'>-/*</div><div class='del'>-   The help format for a particular option is like:</div><div class='del'>-</div><div class='del'>-     -xARG, -yARG, --long1=ARG, --long2=ARG        Documentation...</div><div class='del'>-</div><div class='del'>-   Where ARG will be omitted if there's no argument, for this option, or</div><div class='del'>-   will be surrounded by "[" and "]" appropiately if the argument is</div><div class='del'>-   optional.  The documentation string is word-wrapped appropiately, and if</div><div class='del'>-   the list of options is long enough, it will be started on a separate line.</div><div class='del'>-   If there are no short options for a given option, the first long option is</div><div class='del'>-   indented slighly in a way that's supposed to make most long options appear</div><div class='del'>-   to be in a separate column.</div><div class='del'>-</div><div class='del'>-   For example, the following output (from ps):</div><div class='del'>-</div><div class='del'>-     -p PID, --pid=PID          List the process PID</div><div class='del'>-	 --pgrp=PGRP            List processes in the process group PGRP</div><div class='del'>-     -P, -x, --no-parent        Include processes without parents</div><div class='del'>-     -Q, --all-fields           Don't elide unusable fields (normally if there's</div><div class='del'>-				some reason ps can't print a field for any</div><div class='del'>-				process, it's removed from the output entirely)</div><div class='del'>-     -r, --reverse, --gratuitously-long-reverse-option</div><div class='del'>-				Reverse the order of any sort</div><div class='del'>-	 --session[=SID]        Add the processes from the session SID (which</div><div class='del'>-				defaults to the sid of the current process)</div><div class='del'>-</div><div class='del'>-    Here are some more options:</div><div class='del'>-     -f ZOT, --foonly=ZOT       Glork a foonly</div><div class='del'>-     -z, --zaza                 Snit a zar</div><div class='del'>-</div><div class='del'>-     -?, --help                 Give this help list</div><div class='del'>-	 --usage                Give a short usage message</div><div class='del'>-     -V, --version              Print program version</div><div class='del'>-</div><div class='del'>-   The struct argp_option array for the above could look like:</div><div class='del'>-</div><div class='del'>-   {</div><div class='del'>-     {"pid",       'p',      "PID",  0, "List the process PID"},</div><div class='del'>-     {"pgrp",      OPT_PGRP, "PGRP", 0, "List processes in the process group PGRP"},</div><div class='del'>-     {"no-parent", 'P',	      0,     0, "Include processes without parents"},</div><div class='del'>-     {0,           'x',       0,     OPTION_ALIAS},</div><div class='del'>-     {"all-fields",'Q',       0,     0, "Don't elide unusable fields (normally"</div><div class='del'>-                                        " if there's some reason ps can't"</div><div class='del'>-					" print a field for any process, it's"</div><div class='del'>-                                        " removed from the output entirely)" },</div><div class='del'>-     {"reverse",   'r',       0,     0, "Reverse the order of any sort"},</div><div class='del'>-     {"gratuitously-long-reverse-option", 0, 0, OPTION_ALIAS},</div><div class='del'>-     {"session",   OPT_SESS,  "SID", OPTION_ARG_OPTIONAL,</div><div class='del'>-                                        "Add the processes from the session"</div><div class='del'>-					" SID (which defaults to the sid of"</div><div class='del'>-					" the current process)" },</div><div class='del'>-</div><div class='del'>-     {0,0,0,0, "Here are some more options:"},</div><div class='del'>-     {"foonly", 'f', "ZOT", 0, "Glork a foonly"},</div><div class='del'>-     {"zaza", 'z', 0, 0, "Snit a zar"},</div><div class='del'>-</div><div class='del'>-     {0}</div><div class='del'>-   }</div><div class='del'>-</div><div class='del'>-   Note that the last three options are automatically supplied by argp_parse,</div><div class='del'>-   unless you tell it not to with ARGP_NO_HELP.</div><div class='del'>-</div><div class='del'>-*/</div><div class='del'>-</div><div class='del'>-/* Returns true if CH occurs between BEG and END.  */</div><div class='del'>-static int</div><div class='del'>-find_char (char ch, char *beg, char *end)</div><div class='del'>-{</div><div class='del'>-  while (beg &lt; end)</div><div class='del'>-    if (*beg == ch)</div><div class='del'>-      return 1;</div><div class='del'>-    else</div><div class='del'>-      beg++;</div><div class='del'>-  return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-struct hol_cluster;		/* fwd decl */</div><div class='del'>-</div><div class='del'>-struct hol_entry</div><div class='del'>-{</div><div class='del'>-  /* First option.  */</div><div class='del'>-  const struct argp_option *opt;</div><div class='del'>-  /* Number of options (including aliases).  */</div><div class='del'>-  unsigned num;</div><div class='del'>-</div><div class='del'>-  /* A pointers into the HOL's short_options field, to the first short option</div><div class='del'>-     letter for this entry.  The order of the characters following this point</div><div class='del'>-     corresponds to the order of options pointed to by OPT, and there are at</div><div class='del'>-     most NUM.  A short option recorded in a option following OPT is only</div><div class='del'>-     valid if it occurs in the right place in SHORT_OPTIONS (otherwise it's</div><div class='del'>-     probably been shadowed by some other entry).  */</div><div class='del'>-  char *short_options;</div><div class='del'>-</div><div class='del'>-  /* Entries are sorted by their group first, in the order:</div><div class='del'>-       1, 2, ..., n, 0, -m, ..., -2, -1</div><div class='del'>-     and then alphabetically within each group.  The default is 0.  */</div><div class='del'>-  int group;</div><div class='del'>-</div><div class='del'>-  /* The cluster of options this entry belongs to, or 0 if none.  */</div><div class='del'>-  struct hol_cluster *cluster;</div><div class='del'>-</div><div class='del'>-  /* The argp from which this option came.  */</div><div class='del'>-  const struct argp *argp;</div><div class='del'>-};</div><div class='del'>-</div><div class='del'>-/* A cluster of entries to reflect the argp tree structure.  */</div><div class='del'>-struct hol_cluster</div><div class='del'>-{</div><div class='del'>-  /* A descriptive header printed before options in this cluster.  */</div><div class='del'>-  const char *header;</div><div class='del'>-</div><div class='del'>-  /* Used to order clusters within the same group with the same parent,</div><div class='del'>-     according to the order in which they occurred in the parent argp's child</div><div class='del'>-     list.  */</div><div class='del'>-  int index;</div><div class='del'>-</div><div class='del'>-  /* How to sort this cluster with respect to options and other clusters at the</div><div class='del'>-     same depth (clusters always follow options in the same group).  */</div><div class='del'>-  int group;</div><div class='del'>-</div><div class='del'>-  /* The cluster to which this cluster belongs, or 0 if it's at the base</div><div class='del'>-     level.  */</div><div class='del'>-  struct hol_cluster *parent;</div><div class='del'>-</div><div class='del'>-  /* The argp from which this cluster is (eventually) derived.  */</div><div class='del'>-  const struct argp *argp;</div><div class='del'>-</div><div class='del'>-  /* The distance this cluster is from the root.  */</div><div class='del'>-  int depth;</div><div class='del'>-</div><div class='del'>-  /* Clusters in a given hol are kept in a linked list, to make freeing them</div><div class='del'>-     possible.  */</div><div class='del'>-  struct hol_cluster *next;</div><div class='del'>-};</div><div class='del'>-</div><div class='del'>-/* A list of options for help.  */</div><div class='del'>-struct hol</div><div class='del'>-{</div><div class='del'>-  /* An array of hol_entry's.  */</div><div class='del'>-  struct hol_entry *entries;</div><div class='del'>-  /* The number of entries in this hol.  If this field is zero, the others</div><div class='del'>-     are undefined.  */</div><div class='del'>-  unsigned num_entries;</div><div class='del'>-</div><div class='del'>-  /* A string containing all short options in this HOL.  Each entry contains</div><div class='del'>-     pointers into this string, so the order can't be messed with blindly.  */</div><div class='del'>-  char *short_options;</div><div class='del'>-</div><div class='del'>-  /* Clusters of entries in this hol.  */</div><div class='del'>-  struct hol_cluster *clusters;</div><div class='del'>-};</div><div class='del'>-</div><div class='del'>-/* Create a struct hol from the options in ARGP.  CLUSTER is the</div><div class='del'>-   hol_cluster in which these entries occur, or 0, if at the root.  */</div><div class='del'>-static struct hol *</div><div class='del'>-make_hol (const struct argp *argp, struct hol_cluster *cluster)</div><div class='del'>-{</div><div class='del'>-  char *so;</div><div class='del'>-  const struct argp_option *o;</div><div class='del'>-  const struct argp_option *opts = argp-&gt;options;</div><div class='del'>-  struct hol_entry *entry;</div><div class='del'>-  unsigned num_short_options = 0;</div><div class='del'>-  struct hol *hol = malloc (sizeof (struct hol));</div><div class='del'>-</div><div class='del'>-  assert (hol);</div><div class='del'>-</div><div class='del'>-  hol-&gt;num_entries = 0;</div><div class='del'>-  hol-&gt;clusters = 0;</div><div class='del'>-</div><div class='del'>-  if (opts)</div><div class='del'>-    {</div><div class='del'>-      int cur_group = 0;</div><div class='del'>-</div><div class='del'>-      /* The first option must not be an alias.  */</div><div class='del'>-      assert (! oalias (opts));</div><div class='del'>-</div><div class='del'>-      /* Calculate the space needed.  */</div><div class='del'>-      for (o = opts; ! oend (o); o++)</div><div class='del'>-	{</div><div class='del'>-	  if (! oalias (o))</div><div class='del'>-	    hol-&gt;num_entries++;</div><div class='del'>-	  if (oshort (o))</div><div class='del'>-	    num_short_options++;	/* This is an upper bound.  */</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-      hol-&gt;entries = malloc (sizeof (struct hol_entry) * hol-&gt;num_entries);</div><div class='del'>-      hol-&gt;short_options = malloc (num_short_options + 1);</div><div class='del'>-</div><div class='del'>-      assert (hol-&gt;entries &amp;&amp; hol-&gt;short_options);</div><div class='del'>-</div><div class='del'>-      /* Fill in the entries.  */</div><div class='del'>-      so = hol-&gt;short_options;</div><div class='del'>-      for (o = opts, entry = hol-&gt;entries; ! oend (o); entry++)</div><div class='del'>-	{</div><div class='del'>-	  entry-&gt;opt = o;</div><div class='del'>-	  entry-&gt;num = 0;</div><div class='del'>-	  entry-&gt;short_options = so;</div><div class='del'>-	  entry-&gt;group = cur_group =</div><div class='del'>-	    o-&gt;group</div><div class='del'>-	    ? o-&gt;group</div><div class='del'>-	    : ((!o-&gt;name &amp;&amp; !o-&gt;key)</div><div class='del'>-	       ? cur_group + 1</div><div class='del'>-	       : cur_group);</div><div class='del'>-	  entry-&gt;cluster = cluster;</div><div class='del'>-	  entry-&gt;argp = argp;</div><div class='del'>-</div><div class='del'>-	  do</div><div class='del'>-	    {</div><div class='del'>-	      entry-&gt;num++;</div><div class='del'>-	      if (oshort (o) &amp;&amp; ! find_char (o-&gt;key, hol-&gt;short_options, so))</div><div class='del'>-		/* O has a valid short option which hasn't already been used.*/</div><div class='del'>-		*so++ = o-&gt;key;</div><div class='del'>-	      o++;</div><div class='del'>-	    }</div><div class='del'>-	  while (! oend (o) &amp;&amp; oalias (o));</div><div class='del'>-	}</div><div class='del'>-      *so = '\0';		/* null terminated so we can find the length */</div><div class='del'>-    }</div><div class='del'>-</div><div class='del'>-  return hol;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-/* Add a new cluster to HOL, with the given GROUP and HEADER (taken from the</div><div class='del'>-   associated argp child list entry), INDEX, and PARENT, and return a pointer</div><div class='del'>-   to it.  ARGP is the argp that this cluster results from.  */</div><div class='del'>-static struct hol_cluster *</div><div class='del'>-hol_add_cluster (struct hol *hol, int group, const char *header, int index,</div><div class='del'>-		 struct hol_cluster *parent, const struct argp *argp)</div><div class='del'>-{</div><div class='del'>-  struct hol_cluster *cl = malloc (sizeof (struct hol_cluster));</div><div class='del'>-  if (cl)</div><div class='del'>-    {</div><div class='del'>-      cl-&gt;group = group;</div><div class='del'>-      cl-&gt;header = header;</div><div class='del'>-</div><div class='del'>-      cl-&gt;index = index;</div><div class='del'>-      cl-&gt;parent = parent;</div><div class='del'>-      cl-&gt;argp = argp;</div><div class='del'>-      cl-&gt;depth = parent ? parent-&gt;depth + 1 : 0;</div><div class='del'>-</div><div class='del'>-      cl-&gt;next = hol-&gt;clusters;</div><div class='del'>-      hol-&gt;clusters = cl;</div><div class='del'>-    }</div><div class='del'>-  return cl;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-/* Free HOL and any resources it uses.  */</div><div class='del'>-static void</div><div class='del'>-hol_free (struct hol *hol)</div><div class='del'>-{</div><div class='del'>-  struct hol_cluster *cl = hol-&gt;clusters;</div><div class='del'>-</div><div class='del'>-  while (cl)</div><div class='del'>-    {</div><div class='del'>-      struct hol_cluster *next = cl-&gt;next;</div><div class='del'>-      free (cl);</div><div class='del'>-      cl = next;</div><div class='del'>-    }</div><div class='del'>-</div><div class='del'>-  if (hol-&gt;num_entries &gt; 0)</div><div class='del'>-    {</div><div class='del'>-      free (hol-&gt;entries);</div><div class='del'>-      free (hol-&gt;short_options);</div><div class='del'>-    }</div><div class='del'>-</div><div class='del'>-  free (hol);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-static inline int</div><div class='del'>-hol_entry_short_iterate (const struct hol_entry *entry,</div><div class='del'>-			 int (*func)(const struct argp_option *opt,</div><div class='del'>-				     const struct argp_option *real,</div><div class='del'>-				     const char *domain, void *cookie),</div><div class='del'>-			 const char *domain, void *cookie)</div><div class='del'>-{</div><div class='del'>-  unsigned nopts;</div><div class='del'>-  int val = 0;</div><div class='del'>-  const struct argp_option *opt, *real = entry-&gt;opt;</div><div class='del'>-  char *so = entry-&gt;short_options;</div><div class='del'>-</div><div class='del'>-  for (opt = real, nopts = entry-&gt;num; nopts &gt; 0 &amp;&amp; !val; opt++, nopts--)</div><div class='del'>-    if (oshort (opt) &amp;&amp; *so == opt-&gt;key)</div><div class='del'>-      {</div><div class='del'>-	if (!oalias (opt))</div><div class='del'>-	  real = opt;</div><div class='del'>-	if (ovisible (opt))</div><div class='del'>-	  val = (*func)(opt, real, domain, cookie);</div><div class='del'>-	so++;</div><div class='del'>-      }</div><div class='del'>-</div><div class='del'>-  return val;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-static inline int</div><div class='del'>-hol_entry_long_iterate (const struct hol_entry *entry,</div><div class='del'>-			int (*func)(const struct argp_option *opt,</div><div class='del'>-				    const struct argp_option *real,</div><div class='del'>-				    const char *domain, void *cookie),</div><div class='del'>-			const char *domain, void *cookie)</div><div class='del'>-{</div><div class='del'>-  unsigned nopts;</div><div class='del'>-  int val = 0;</div><div class='del'>-  const struct argp_option *opt, *real = entry-&gt;opt;</div><div class='del'>-</div><div class='del'>-  for (opt = real, nopts = entry-&gt;num; nopts &gt; 0 &amp;&amp; !val; opt++, nopts--)</div><div class='del'>-    if (opt-&gt;name)</div><div class='del'>-      {</div><div class='del'>-	if (!oalias (opt))</div><div class='del'>-	  real = opt;</div><div class='del'>-	if (ovisible (opt))</div><div class='del'>-	  val = (*func)(opt, real, domain, cookie);</div><div class='del'>-      }</div><div class='del'>-</div><div class='del'>-  return val;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-/* Iterator that returns true for the first short option.  */</div><div class='del'>-static inline int</div><div class='del'>-until_short (const struct argp_option *opt, const struct argp_option *real UNUSED,</div><div class='del'>-	     const char *domain UNUSED, void *cookie UNUSED)</div><div class='del'>-{</div><div class='del'>-  return oshort (opt) ? opt-&gt;key : 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-/* Returns the first valid short option in ENTRY, or 0 if there is none.  */</div><div class='del'>-static char</div><div class='del'>-hol_entry_first_short (const struct hol_entry *entry)</div><div class='del'>-{</div><div class='del'>-  return hol_entry_short_iterate (entry, until_short,</div><div class='del'>-				  entry-&gt;argp-&gt;argp_domain, 0);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-/* Returns the first valid long option in ENTRY, or 0 if there is none.  */</div><div class='del'>-static const char *</div><div class='del'>-hol_entry_first_long (const struct hol_entry *entry)</div><div class='del'>-{</div><div class='del'>-  const struct argp_option *opt;</div><div class='del'>-  unsigned num;</div><div class='del'>-  for (opt = entry-&gt;opt, num = entry-&gt;num; num &gt; 0; opt++, num--)</div><div class='del'>-    if (opt-&gt;name &amp;&amp; ovisible (opt))</div><div class='del'>-      return opt-&gt;name;</div><div class='del'>-  return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-/* Returns the entry in HOL with the long option name NAME, or 0 if there is</div><div class='del'>-   none.  */</div><div class='del'>-static struct hol_entry *</div><div class='del'>-hol_find_entry (struct hol *hol, const char *name)</div><div class='del'>-{</div><div class='del'>-  struct hol_entry *entry = hol-&gt;entries;</div><div class='del'>-  unsigned num_entries = hol-&gt;num_entries;</div><div class='del'>-</div><div class='del'>-  while (num_entries-- &gt; 0)</div><div class='del'>-    {</div><div class='del'>-      const struct argp_option *opt = entry-&gt;opt;</div><div class='del'>-      unsigned num_opts = entry-&gt;num;</div><div class='del'>-</div><div class='del'>-      while (num_opts-- &gt; 0)</div><div class='del'>-	if (opt-&gt;name &amp;&amp; ovisible (opt) &amp;&amp; strcmp (opt-&gt;name, name) == 0)</div><div class='del'>-	  return entry;</div><div class='del'>-	else</div><div class='del'>-	  opt++;</div><div class='del'>-</div><div class='del'>-      entry++;</div><div class='del'>-    }</div><div class='del'>-</div><div class='del'>-  return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-/* If an entry with the long option NAME occurs in HOL, set it's special</div><div class='del'>-   sort position to GROUP.  */</div><div class='del'>-static void</div><div class='del'>-hol_set_group (struct hol *hol, const char *name, int group)</div><div class='del'>-{</div><div class='del'>-  struct hol_entry *entry = hol_find_entry (hol, name);</div><div class='del'>-  if (entry)</div><div class='del'>-    entry-&gt;group = group;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-/* Order by group:  0, 1, 2, ..., n, -m, ..., -2, -1.</div><div class='del'>-   EQ is what to return if GROUP1 and GROUP2 are the same.  */</div><div class='del'>-static int</div><div class='del'>-group_cmp (int group1, int group2, int eq)</div><div class='del'>-{</div><div class='del'>-  if (group1 == group2)</div><div class='del'>-    return eq;</div><div class='del'>-  else if ((group1 &lt; 0 &amp;&amp; group2 &lt; 0) || (group1 &gt;= 0 &amp;&amp; group2 &gt;= 0))</div><div class='del'>-    return group1 - group2;</div><div class='del'>-  else</div><div class='del'>-    return group2 - group1;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-/* Compare clusters CL1 &amp; CL2 by the order that they should appear in</div><div class='del'>-   output.  */</div><div class='del'>-static int</div><div class='del'>-hol_cluster_cmp (const struct hol_cluster *cl1, const struct hol_cluster *cl2)</div><div class='del'>-{</div><div class='del'>-  /* If one cluster is deeper than the other, use its ancestor at the same</div><div class='del'>-     level, so that finding the common ancestor is straightforward.  */</div><div class='del'>-  while (cl1-&gt;depth &lt; cl2-&gt;depth)</div><div class='del'>-    cl1 = cl1-&gt;parent;</div><div class='del'>-  while (cl2-&gt;depth &lt; cl1-&gt;depth)</div><div class='del'>-    cl2 = cl2-&gt;parent;</div><div class='del'>-</div><div class='del'>-  /* Now reduce both clusters to their ancestors at the point where both have</div><div class='del'>-     a common parent; these can be directly compared.  */</div><div class='del'>-  while (cl1-&gt;parent != cl2-&gt;parent)</div><div class='del'>-    cl1 = cl1-&gt;parent, cl2 = cl2-&gt;parent;</div><div class='del'>-</div><div class='del'>-  return group_cmp (cl1-&gt;group, cl2-&gt;group, cl2-&gt;index - cl1-&gt;index);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-/* Return the ancestor of CL that's just below the root (i.e., has a parent</div><div class='del'>-   of 0).  */</div><div class='del'>-static struct hol_cluster *</div><div class='del'>-hol_cluster_base (struct hol_cluster *cl)</div><div class='del'>-{</div><div class='del'>-  while (cl-&gt;parent)</div><div class='del'>-    cl = cl-&gt;parent;</div><div class='del'>-  return cl;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-/* Return true if CL1 is a child of CL2.  */</div><div class='del'>-static int</div><div class='del'>-hol_cluster_is_child (const struct hol_cluster *cl1,</div><div class='del'>-		      const struct hol_cluster *cl2)</div><div class='del'>-{</div><div class='del'>-  while (cl1 &amp;&amp; cl1 != cl2)</div><div class='del'>-    cl1 = cl1-&gt;parent;</div><div class='del'>-  return cl1 == cl2;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-/* Given the name of a OPTION_DOC option, modifies NAME to start at the tail</div><div class='del'>-   that should be used for comparisons, and returns true iff it should be</div><div class='del'>-   treated as a non-option.  */</div><div class='del'>-</div><div class='del'>-/* FIXME: Can we use unsigned char * for the argument? */</div><div class='del'>-static int</div><div class='del'>-canon_doc_option (const char **name)</div><div class='del'>-{</div><div class='del'>-  int non_opt;</div><div class='del'>-  /* Skip initial whitespace.  */</div><div class='del'>-  while (isspace ( (unsigned char) **name))</div><div class='del'>-    (*name)++;</div><div class='del'>-  /* Decide whether this looks like an option (leading `-') or not.  */</div><div class='del'>-  non_opt = (**name != '-');</div><div class='del'>-  /* Skip until part of name used for sorting.  */</div><div class='del'>-  while (**name &amp;&amp; !isalnum ( (unsigned char) **name))</div><div class='del'>-    (*name)++;</div><div class='del'>-  return non_opt;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-/* Order ENTRY1 &amp; ENTRY2 by the order which they should appear in a help</div><div class='del'>-   listing.  */</div><div class='del'>-static int</div><div class='del'>-hol_entry_cmp (const struct hol_entry *entry1,</div><div class='del'>-	       const struct hol_entry *entry2)</div><div class='del'>-{</div><div class='del'>-  /* The group numbers by which the entries should be ordered; if either is</div><div class='del'>-     in a cluster, then this is just the group within the cluster.  */</div><div class='del'>-  int group1 = entry1-&gt;group, group2 = entry2-&gt;group;</div><div class='del'>-</div><div class='del'>-  if (entry1-&gt;cluster != entry2-&gt;cluster)</div><div class='del'>-    {</div><div class='del'>-      /* The entries are not within the same cluster, so we can't compare them</div><div class='del'>-	 directly, we have to use the appropiate clustering level too.  */</div><div class='del'>-      if (! entry1-&gt;cluster)</div><div class='del'>-	/* ENTRY1 is at the `base level', not in a cluster, so we have to</div><div class='del'>-	   compare it's group number with that of the base cluster in which</div><div class='del'>-	   ENTRY2 resides.  Note that if they're in the same group, the</div><div class='del'>-	   clustered option always comes laster.  */</div><div class='del'>-	return group_cmp (group1, hol_cluster_base (entry2-&gt;cluster)-&gt;group, -1);</div><div class='del'>-      else if (! entry2-&gt;cluster)</div><div class='del'>-	/* Likewise, but ENTRY2's not in a cluster.  */</div><div class='del'>-	return group_cmp (hol_cluster_base (entry1-&gt;cluster)-&gt;group, group2, 1);</div><div class='del'>-      else</div><div class='del'>-	/* Both entries are in clusters, we can just compare the clusters.  */</div><div class='del'>-	return hol_cluster_cmp (entry1-&gt;cluster, entry2-&gt;cluster);</div><div class='del'>-    }</div><div class='del'>-  else if (group1 == group2)</div><div class='del'>-    /* The entries are both in the same cluster and group, so compare them</div><div class='del'>-       alphabetically.  */</div><div class='del'>-    {</div><div class='del'>-      int short1 = hol_entry_first_short (entry1);</div><div class='del'>-      int short2 = hol_entry_first_short (entry2);</div><div class='del'>-      int doc1 = odoc (entry1-&gt;opt);</div><div class='del'>-      int doc2 = odoc (entry2-&gt;opt);</div><div class='del'>-      /* FIXME: Can we use unsigned char * instead? */</div><div class='del'>-      const char *long1 = hol_entry_first_long (entry1);</div><div class='del'>-      const char *long2 = hol_entry_first_long (entry2);</div><div class='del'>-</div><div class='del'>-      if (doc1)</div><div class='del'>-	doc1 = canon_doc_option (&amp;long1);</div><div class='del'>-      if (doc2)</div><div class='del'>-	doc2 = canon_doc_option (&amp;long2);</div><div class='del'>-</div><div class='del'>-      if (doc1 != doc2)</div><div class='del'>-	/* `documentation' options always follow normal options (or</div><div class='del'>-	   documentation options that *look* like normal options).  */</div><div class='del'>-	return doc1 - doc2;</div><div class='del'>-      else if (!short1 &amp;&amp; !short2 &amp;&amp; long1 &amp;&amp; long2)</div><div class='del'>-	/* Only long options.  */</div><div class='del'>-	return __strcasecmp (long1, long2);</div><div class='del'>-      else</div><div class='del'>-	/* Compare short/short, long/short, short/long, using the first</div><div class='del'>-	   character of long options.  Entries without *any* valid</div><div class='del'>-	   options (such as options with OPTION_HIDDEN set) will be put</div><div class='del'>-	   first, but as they're not displayed, it doesn't matter where</div><div class='del'>-	   they are.  */</div><div class='del'>-	{</div><div class='del'>-	  unsigned char first1 = short1 ? short1 : long1 ? *long1 : 0;</div><div class='del'>-	  unsigned char first2 = short2 ? short2 : long2 ? *long2 : 0;</div><div class='del'>-#ifdef _tolower</div><div class='del'>-	  int lower_cmp = _tolower (first1) - _tolower (first2);</div><div class='del'>-#else</div><div class='del'>-	  int lower_cmp = tolower (first1) - tolower (first2);</div><div class='del'>-#endif</div><div class='del'>-	  /* Compare ignoring case, except when the options are both the</div><div class='del'>-	     same letter, in which case lower-case always comes first.  */</div><div class='del'>-	  /* NOTE: The subtraction below does the right thing</div><div class='del'>-	     even with eight-bit chars: first1 and first2 are</div><div class='del'>-	     converted to int *before* the subtraction. */</div><div class='del'>-	  return lower_cmp ? lower_cmp : first2 - first1;</div><div class='del'>-	}</div><div class='del'>-    }</div><div class='del'>-  else</div><div class='del'>-    /* Within the same cluster, but not the same group, so just compare</div><div class='del'>-       groups.  */</div><div class='del'>-    return group_cmp (group1, group2, 0);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-/* Version of hol_entry_cmp with correct signature for qsort.  */</div><div class='del'>-static int</div><div class='del'>-hol_entry_qcmp (const void *entry1_v, const void *entry2_v)</div><div class='del'>-{</div><div class='del'>-  return hol_entry_cmp (entry1_v, entry2_v);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-/* Sort HOL by group and alphabetically by option name (with short options</div><div class='del'>-   taking precedence over long).  Since the sorting is for display purposes</div><div class='del'>-   only, the shadowing of options isn't effected.  */</div><div class='del'>-static void</div><div class='del'>-hol_sort (struct hol *hol)</div><div class='del'>-{</div><div class='del'>-  if (hol-&gt;num_entries &gt; 0)</div><div class='del'>-    qsort (hol-&gt;entries, hol-&gt;num_entries, sizeof (struct hol_entry),</div><div class='del'>-	   hol_entry_qcmp);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-/* Append MORE to HOL, destroying MORE in the process.  Options in HOL shadow</div><div class='del'>-   any in MORE with the same name.  */</div><div class='del'>-static void</div><div class='del'>-hol_append (struct hol *hol, struct hol *more)</div><div class='del'>-{</div><div class='del'>-  struct hol_cluster **cl_end = &amp;hol-&gt;clusters;</div><div class='del'>-</div><div class='del'>-  /* Steal MORE's cluster list, and add it to the end of HOL's.  */</div><div class='del'>-  while (*cl_end)</div><div class='del'>-    cl_end = &amp;(*cl_end)-&gt;next;</div><div class='del'>-  *cl_end = more-&gt;clusters;</div><div class='del'>-  more-&gt;clusters = 0;</div><div class='del'>-</div><div class='del'>-  /* Merge entries.  */</div><div class='del'>-  if (more-&gt;num_entries &gt; 0)</div><div class='del'>-    {</div><div class='del'>-      if (hol-&gt;num_entries == 0)</div><div class='del'>-	{</div><div class='del'>-	  hol-&gt;num_entries = more-&gt;num_entries;</div><div class='del'>-	  hol-&gt;entries = more-&gt;entries;</div><div class='del'>-	  hol-&gt;short_options = more-&gt;short_options;</div><div class='del'>-	  more-&gt;num_entries = 0;	/* Mark MORE's fields as invalid.  */</div><div class='del'>-	}</div><div class='del'>-      else</div><div class='del'>-	/* Append the entries in MORE to those in HOL, taking care to only add</div><div class='del'>-	   non-shadowed SHORT_OPTIONS values.  */</div><div class='del'>-	{</div><div class='del'>-	  unsigned left;</div><div class='del'>-	  char *so, *more_so;</div><div class='del'>-	  struct hol_entry *e;</div><div class='del'>-	  unsigned num_entries = hol-&gt;num_entries + more-&gt;num_entries;</div><div class='del'>-	  struct hol_entry *entries =</div><div class='del'>-	    malloc (num_entries * sizeof (struct hol_entry));</div><div class='del'>-	  unsigned hol_so_len = strlen (hol-&gt;short_options);</div><div class='del'>-	  char *short_options =</div><div class='del'>-	    malloc (hol_so_len + strlen (more-&gt;short_options) + 1);</div><div class='del'>-</div><div class='del'>-	  __mempcpy (__mempcpy (entries, hol-&gt;entries,</div><div class='del'>-				hol-&gt;num_entries * sizeof (struct hol_entry)),</div><div class='del'>-		     more-&gt;entries,</div><div class='del'>-		     more-&gt;num_entries * sizeof (struct hol_entry));</div><div class='del'>-</div><div class='del'>-	  __mempcpy (short_options, hol-&gt;short_options, hol_so_len);</div><div class='del'>-</div><div class='del'>-	  /* Fix up the short options pointers from HOL.  */</div><div class='del'>-	  for (e = entries, left = hol-&gt;num_entries; left &gt; 0; e++, left--)</div><div class='del'>-	    e-&gt;short_options += (short_options - hol-&gt;short_options);</div><div class='del'>-</div><div class='del'>-	  /* Now add the short options from MORE, fixing up its entries</div><div class='del'>-	     too.  */</div><div class='del'>-	  so = short_options + hol_so_len;</div><div class='del'>-	  more_so = more-&gt;short_options;</div><div class='del'>-	  for (left = more-&gt;num_entries; left &gt; 0; e++, left--)</div><div class='del'>-	    {</div><div class='del'>-	      int opts_left;</div><div class='del'>-	      const struct argp_option *opt;</div><div class='del'>-</div><div class='del'>-	      e-&gt;short_options = so;</div><div class='del'>-</div><div class='del'>-	      for (opts_left = e-&gt;num, opt = e-&gt;opt; opts_left; opt++, opts_left--)</div><div class='del'>-		{</div><div class='del'>-		  int ch = *more_so;</div><div class='del'>-		  if (oshort (opt) &amp;&amp; ch == opt-&gt;key)</div><div class='del'>-		    /* The next short option in MORE_SO, CH, is from OPT.  */</div><div class='del'>-		    {</div><div class='del'>-		      if (! find_char (ch, short_options,</div><div class='del'>-				       short_options + hol_so_len))</div><div class='del'>-			/* The short option CH isn't shadowed by HOL's options,</div><div class='del'>-			   so add it to the sum.  */</div><div class='del'>-			*so++ = ch;</div><div class='del'>-		      more_so++;</div><div class='del'>-		    }</div><div class='del'>-		}</div><div class='del'>-	    }</div><div class='del'>-</div><div class='del'>-	  *so = '\0';</div><div class='del'>-</div><div class='del'>-	  free (hol-&gt;entries);</div><div class='del'>-	  free (hol-&gt;short_options);</div><div class='del'>-</div><div class='del'>-	  hol-&gt;entries = entries;</div><div class='del'>-	  hol-&gt;num_entries = num_entries;</div><div class='del'>-	  hol-&gt;short_options = short_options;</div><div class='del'>-	}</div><div class='del'>-    }</div><div class='del'>-</div><div class='del'>-  hol_free (more);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-/* Inserts enough spaces to make sure STREAM is at column COL.  */</div><div class='del'>-static void</div><div class='del'>-indent_to (argp_fmtstream_t stream, unsigned col)</div><div class='del'>-{</div><div class='del'>-  int needed = col - __argp_fmtstream_point (stream);</div><div class='del'>-  while (needed-- &gt; 0)</div><div class='del'>-    __argp_fmtstream_putc (stream, ' ');</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-/* Output to STREAM either a space, or a newline if there isn't room for at</div><div class='del'>-   least ENSURE characters before the right margin.  */</div><div class='del'>-static void</div><div class='del'>-space (argp_fmtstream_t stream, size_t ensure)</div><div class='del'>-{</div><div class='del'>-  if (__argp_fmtstream_point (stream) + ensure</div><div class='del'>-      &gt;= __argp_fmtstream_rmargin (stream))</div><div class='del'>-    __argp_fmtstream_putc (stream, '\n');</div><div class='del'>-  else</div><div class='del'>-    __argp_fmtstream_putc (stream, ' ');</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-/* If the option REAL has an argument, we print it in using the printf</div><div class='del'>-   format REQ_FMT or OPT_FMT depending on whether it's a required or</div><div class='del'>-   optional argument.  */</div><div class='del'>-static void</div><div class='del'>-arg (const struct argp_option *real, const char *req_fmt, const char *opt_fmt,</div><div class='del'>-     const char *domain UNUSED, argp_fmtstream_t stream)</div><div class='del'>-{</div><div class='del'>-  if (real-&gt;arg)</div><div class='del'>-    {</div><div class='del'>-      if (real-&gt;flags &amp; OPTION_ARG_OPTIONAL)</div><div class='del'>-	__argp_fmtstream_printf (stream, opt_fmt,</div><div class='del'>-				 dgettext (domain, real-&gt;arg));</div><div class='del'>-      else</div><div class='del'>-	__argp_fmtstream_printf (stream, req_fmt,</div><div class='del'>-				 dgettext (domain, real-&gt;arg));</div><div class='del'>-    }</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-/* Helper functions for hol_entry_help.  */</div><div class='del'>-</div><div class='del'>-/* State used during the execution of hol_help.  */</div><div class='del'>-struct hol_help_state</div><div class='del'>-{</div><div class='del'>-  /* PREV_ENTRY should contain the previous entry printed, or 0.  */</div><div class='del'>-  struct hol_entry *prev_entry;</div><div class='del'>-</div><div class='del'>-  /* If an entry is in a different group from the previous one, and SEP_GROUPS</div><div class='del'>-     is true, then a blank line will be printed before any output. */</div><div class='del'>-  int sep_groups;</div><div class='del'>-</div><div class='del'>-  /* True if a duplicate option argument was suppressed (only ever set if</div><div class='del'>-     UPARAMS.dup_args is false).  */</div><div class='del'>-  int suppressed_dup_arg;</div><div class='del'>-};</div><div class='del'>-</div><div class='del'>-/* Some state used while printing a help entry (used to communicate with</div><div class='del'>-   helper functions).  See the doc for hol_entry_help for more info, as most</div><div class='del'>-   of the fields are copied from its arguments.  */</div><div class='del'>-struct pentry_state</div><div class='del'>-{</div><div class='del'>-  const struct hol_entry *entry;</div><div class='del'>-  argp_fmtstream_t stream;</div><div class='del'>-  struct hol_help_state *hhstate;</div><div class='del'>-</div><div class='del'>-  /* True if nothing's been printed so far.  */</div><div class='del'>-  int first;</div><div class='del'>-</div><div class='del'>-  /* If non-zero, the state that was used to print this help.  */</div><div class='del'>-  const struct argp_state *state;</div><div class='del'>-};</div><div class='del'>-</div><div class='del'>-/* If a user doc filter should be applied to DOC, do so.  */</div><div class='del'>-static const char *</div><div class='del'>-filter_doc (const char *doc, int key, const struct argp *argp,</div><div class='del'>-	    const struct argp_state *state)</div><div class='del'>-{</div><div class='del'>-  if (argp-&gt;help_filter)</div><div class='del'>-    /* We must apply a user filter to this output.  */</div><div class='del'>-    {</div><div class='del'>-      void *input = __argp_input (argp, state);</div><div class='del'>-      return (*argp-&gt;help_filter) (key, doc, input);</div><div class='del'>-    }</div><div class='del'>-  else</div><div class='del'>-    /* No filter.  */</div><div class='del'>-    return doc;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-/* Prints STR as a header line, with the margin lines set appropiately, and</div><div class='del'>-   notes the fact that groups should be separated with a blank line.  ARGP is</div><div class='del'>-   the argp that should dictate any user doc filtering to take place.  Note</div><div class='del'>-   that the previous wrap margin isn't restored, but the left margin is reset</div><div class='del'>-   to 0.  */</div><div class='del'>-static void</div><div class='del'>-print_header (const char *str, const struct argp *argp,</div><div class='del'>-	      struct pentry_state *pest)</div><div class='del'>-{</div><div class='del'>-  const char *tstr = dgettext (argp-&gt;argp_domain, str);</div><div class='del'>-  const char *fstr = filter_doc (tstr, ARGP_KEY_HELP_HEADER, argp, pest-&gt;state);</div><div class='del'>-</div><div class='del'>-  if (fstr)</div><div class='del'>-    {</div><div class='del'>-      if (*fstr)</div><div class='del'>-	{</div><div class='del'>-	  if (pest-&gt;hhstate-&gt;prev_entry)</div><div class='del'>-	    /* Precede with a blank line.  */</div><div class='del'>-	    __argp_fmtstream_putc (pest-&gt;stream, '\n');</div><div class='del'>-	  indent_to (pest-&gt;stream, uparams.header_col);</div><div class='del'>-	  __argp_fmtstream_set_lmargin (pest-&gt;stream, uparams.header_col);</div><div class='del'>-	  __argp_fmtstream_set_wmargin (pest-&gt;stream, uparams.header_col);</div><div class='del'>-	  __argp_fmtstream_puts (pest-&gt;stream, fstr);</div><div class='del'>-	  __argp_fmtstream_set_lmargin (pest-&gt;stream, 0);</div><div class='del'>-	  __argp_fmtstream_putc (pest-&gt;stream, '\n');</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-      pest-&gt;hhstate-&gt;sep_groups = 1; /* Separate subsequent groups. */</div><div class='del'>-    }</div><div class='del'>-</div><div class='del'>-  if (fstr != tstr)</div><div class='del'>-    free ((char *) fstr);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-/* Inserts a comma if this isn't the first item on the line, and then makes</div><div class='del'>-   sure we're at least to column COL.  If this *is* the first item on a line,</div><div class='del'>-   prints any pending whitespace/headers that should precede this line. Also</div><div class='del'>-   clears FIRST.  */</div><div class='del'>-static void</div><div class='del'>-comma (unsigned col, struct pentry_state *pest)</div><div class='del'>-{</div><div class='del'>-  if (pest-&gt;first)</div><div class='del'>-    {</div><div class='del'>-      const struct hol_entry *pe = pest-&gt;hhstate-&gt;prev_entry;</div><div class='del'>-      const struct hol_cluster *cl = pest-&gt;entry-&gt;cluster;</div><div class='del'>-</div><div class='del'>-      if (pest-&gt;hhstate-&gt;sep_groups &amp;&amp; pe &amp;&amp; pest-&gt;entry-&gt;group != pe-&gt;group)</div><div class='del'>-	__argp_fmtstream_putc (pest-&gt;stream, '\n');</div><div class='del'>-</div><div class='del'>-      if (cl &amp;&amp; cl-&gt;header &amp;&amp; *cl-&gt;header</div><div class='del'>-	  &amp;&amp; (!pe</div><div class='del'>-	      || (pe-&gt;cluster != cl</div><div class='del'>-		  &amp;&amp; !hol_cluster_is_child (pe-&gt;cluster, cl))))</div><div class='del'>-	/* If we're changing clusters, then this must be the start of the</div><div class='del'>-	   ENTRY's cluster unless that is an ancestor of the previous one</div><div class='del'>-	   (in which case we had just popped into a sub-cluster for a bit).</div><div class='del'>-	   If so, then print the cluster's header line.  */</div><div class='del'>-	{</div><div class='del'>-	  int old_wm = __argp_fmtstream_wmargin (pest-&gt;stream);</div><div class='del'>-	  print_header (cl-&gt;header, cl-&gt;argp, pest);</div><div class='del'>-	  __argp_fmtstream_set_wmargin (pest-&gt;stream, old_wm);</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-      pest-&gt;first = 0;</div><div class='del'>-    }</div><div class='del'>-  else</div><div class='del'>-    __argp_fmtstream_puts (pest-&gt;stream, ", ");</div><div class='del'>-</div><div class='del'>-  indent_to (pest-&gt;stream, col);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-/* Print help for ENTRY to STREAM.  */</div><div class='del'>-static void</div><div class='del'>-hol_entry_help (struct hol_entry *entry, const struct argp_state *state,</div><div class='del'>-		argp_fmtstream_t stream, struct hol_help_state *hhstate)</div><div class='del'>-{</div><div class='del'>-  unsigned num;</div><div class='del'>-  const struct argp_option *real = entry-&gt;opt, *opt;</div><div class='del'>-  char *so = entry-&gt;short_options;</div><div class='del'>-  int have_long_opt = 0;	/* We have any long options.  */</div><div class='del'>-  /* Saved margins.  */</div><div class='del'>-  int old_lm = __argp_fmtstream_set_lmargin (stream, 0);</div><div class='del'>-  int old_wm = __argp_fmtstream_wmargin (stream);</div><div class='del'>-  /* PEST is a state block holding some of our variables that we'd like to</div><div class='del'>-     share with helper functions.  */</div><div class='del'>-</div><div class='del'>-  /* Decent initializers are a GNU extension, so don't use it here. */</div><div class='del'>-  struct pentry_state pest;</div><div class='del'>-  pest.entry = entry;</div><div class='del'>-  pest.stream = stream;</div><div class='del'>-  pest.hhstate = hhstate;</div><div class='del'>-  pest.first = 1;</div><div class='del'>-  pest.state = state;</div><div class='del'>-</div><div class='del'>-  if (! odoc (real))</div><div class='del'>-    for (opt = real, num = entry-&gt;num; num &gt; 0; opt++, num--)</div><div class='del'>-      if (opt-&gt;name &amp;&amp; ovisible (opt))</div><div class='del'>-	{</div><div class='del'>-	  have_long_opt = 1;</div><div class='del'>-	  break;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-  /* First emit short options.  */</div><div class='del'>-  __argp_fmtstream_set_wmargin (stream, uparams.short_opt_col); /* For truly bizarre cases. */</div><div class='del'>-  for (opt = real, num = entry-&gt;num; num &gt; 0; opt++, num--)</div><div class='del'>-    if (oshort (opt) &amp;&amp; opt-&gt;key == *so)</div><div class='del'>-      /* OPT has a valid (non shadowed) short option.  */</div><div class='del'>-      {</div><div class='del'>-	if (ovisible (opt))</div><div class='del'>-	  {</div><div class='del'>-	    comma (uparams.short_opt_col, &amp;pest);</div><div class='del'>-	    __argp_fmtstream_putc (stream, '-');</div><div class='del'>-	    __argp_fmtstream_putc (stream, *so);</div><div class='del'>-	    if (!have_long_opt || uparams.dup_args)</div><div class='del'>-	      arg (real, " %s", "[%s]", state-&gt;root_argp-&gt;argp_domain, stream);</div><div class='del'>-	    else if (real-&gt;arg)</div><div class='del'>-	      hhstate-&gt;suppressed_dup_arg = 1;</div><div class='del'>-	  }</div><div class='del'>-	so++;</div><div class='del'>-      }</div><div class='del'>-</div><div class='del'>-  /* Now, long options.  */</div><div class='del'>-  if (odoc (real))</div><div class='del'>-    /* A `documentation' option.  */</div><div class='del'>-    {</div><div class='del'>-      __argp_fmtstream_set_wmargin (stream, uparams.doc_opt_col);</div><div class='del'>-      for (opt = real, num = entry-&gt;num; num &gt; 0; opt++, num--)</div><div class='del'>-	if (opt-&gt;name &amp;&amp; ovisible (opt))</div><div class='del'>-	  {</div><div class='del'>-	    comma (uparams.doc_opt_col, &amp;pest);</div><div class='del'>-	    /* Calling gettext here isn't quite right, since sorting will</div><div class='del'>-	       have been done on the original; but documentation options</div><div class='del'>-	       should be pretty rare anyway...  */</div><div class='del'>-	    __argp_fmtstream_puts (stream,</div><div class='del'>-				   dgettext (state-&gt;root_argp-&gt;argp_domain,</div><div class='del'>-					     opt-&gt;name));</div><div class='del'>-	  }</div><div class='del'>-    }</div><div class='del'>-  else</div><div class='del'>-    /* A real long option.  */</div><div class='del'>-    {</div><div class='del'>-      int first_long_opt = 1;</div><div class='del'>-</div><div class='del'>-      __argp_fmtstream_set_wmargin (stream, uparams.long_opt_col);</div><div class='del'>-      for (opt = real, num = entry-&gt;num; num &gt; 0; opt++, num--)</div><div class='del'>-	if (opt-&gt;name &amp;&amp; ovisible (opt))</div><div class='del'>-	  {</div><div class='del'>-	    comma (uparams.long_opt_col, &amp;pest);</div><div class='del'>-	    __argp_fmtstream_printf (stream, "--%s", opt-&gt;name);</div><div class='del'>-	    if (first_long_opt || uparams.dup_args)</div><div class='del'>-	      arg (real, "=%s", "[=%s]", state-&gt;root_argp-&gt;argp_domain,</div><div class='del'>-		   stream);</div><div class='del'>-	    else if (real-&gt;arg)</div><div class='del'>-	      hhstate-&gt;suppressed_dup_arg = 1;</div><div class='del'>-	  }</div><div class='del'>-    }</div><div class='del'>-</div><div class='del'>-  /* Next, documentation strings.  */</div><div class='del'>-  __argp_fmtstream_set_lmargin (stream, 0);</div><div class='del'>-</div><div class='del'>-  if (pest.first)</div><div class='del'>-    {</div><div class='del'>-      /* Didn't print any switches, what's up?  */</div><div class='del'>-      if (!oshort (real) &amp;&amp; !real-&gt;name)</div><div class='del'>-	/* This is a group header, print it nicely.  */</div><div class='del'>-	print_header (real-&gt;doc, entry-&gt;argp, &amp;pest);</div><div class='del'>-      else</div><div class='del'>-	/* Just a totally shadowed option or null header; print nothing.  */</div><div class='del'>-	goto cleanup;		/* Just return, after cleaning up.  */</div><div class='del'>-    }</div><div class='del'>-  else</div><div class='del'>-    {</div><div class='del'>-      const char *tstr = real-&gt;doc ? dgettext (state-&gt;root_argp-&gt;argp_domain,</div><div class='del'>-					       real-&gt;doc) : 0;</div><div class='del'>-      const char *fstr = filter_doc (tstr, real-&gt;key, entry-&gt;argp, state);</div><div class='del'>-      if (fstr &amp;&amp; *fstr)</div><div class='del'>-	{</div><div class='del'>-	  unsigned int col = __argp_fmtstream_point (stream);</div><div class='del'>-</div><div class='del'>-	  __argp_fmtstream_set_lmargin (stream, uparams.opt_doc_col);</div><div class='del'>-	  __argp_fmtstream_set_wmargin (stream, uparams.opt_doc_col);</div><div class='del'>-</div><div class='del'>-	  if (col &gt; (unsigned int) (uparams.opt_doc_col + 3))</div><div class='del'>-	    __argp_fmtstream_putc (stream, '\n');</div><div class='del'>-	  else if (col &gt;= (unsigned int) uparams.opt_doc_col)</div><div class='del'>-	    __argp_fmtstream_puts (stream, "   ");</div><div class='del'>-	  else</div><div class='del'>-	    indent_to (stream, uparams.opt_doc_col);</div><div class='del'>-</div><div class='del'>-	  __argp_fmtstream_puts (stream, fstr);</div><div class='del'>-	}</div><div class='del'>-      if (fstr &amp;&amp; fstr != tstr)</div><div class='del'>-	free ((char *) fstr);</div><div class='del'>-</div><div class='del'>-      /* Reset the left margin.  */</div><div class='del'>-      __argp_fmtstream_set_lmargin (stream, 0);</div><div class='del'>-      __argp_fmtstream_putc (stream, '\n');</div><div class='del'>-    }</div><div class='del'>-</div><div class='del'>-  hhstate-&gt;prev_entry = entry;</div><div class='del'>-</div><div class='del'>-cleanup:</div><div class='del'>-  __argp_fmtstream_set_lmargin (stream, old_lm);</div><div class='del'>-  __argp_fmtstream_set_wmargin (stream, old_wm);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-/* Output a long help message about the options in HOL to STREAM.  */</div><div class='del'>-static void</div><div class='del'>-hol_help (struct hol *hol, const struct argp_state *state,</div><div class='del'>-	  argp_fmtstream_t stream)</div><div class='del'>-{</div><div class='del'>-  unsigned num;</div><div class='del'>-  struct hol_entry *entry;</div><div class='del'>-  struct hol_help_state hhstate = { 0, 0, 0 };</div><div class='del'>-</div><div class='del'>-  for (entry = hol-&gt;entries, num = hol-&gt;num_entries; num &gt; 0; entry++, num--)</div><div class='del'>-    hol_entry_help (entry, state, stream, &amp;hhstate);</div><div class='del'>-</div><div class='del'>-  if (hhstate.suppressed_dup_arg &amp;&amp; uparams.dup_args_note)</div><div class='del'>-    {</div><div class='del'>-      const char *tstr = dgettext (state-&gt;root_argp-&gt;argp_domain, "\</div><div class='del'>-Mandatory or optional arguments to long options are also mandatory or \</div><div class='del'>-optional for any corresponding short options.");</div><div class='del'>-      const char *fstr = filter_doc (tstr, ARGP_KEY_HELP_DUP_ARGS_NOTE,</div><div class='del'>-				     state ? state-&gt;root_argp : 0, state);</div><div class='del'>-      if (fstr &amp;&amp; *fstr)</div><div class='del'>-	{</div><div class='del'>-	  __argp_fmtstream_putc (stream, '\n');</div><div class='del'>-	  __argp_fmtstream_puts (stream, fstr);</div><div class='del'>-	  __argp_fmtstream_putc (stream, '\n');</div><div class='del'>-	}</div><div class='del'>-      if (fstr &amp;&amp; fstr != tstr)</div><div class='del'>-	free ((char *) fstr);</div><div class='del'>-    }</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-/* Helper functions for hol_usage.  */</div><div class='del'>-</div><div class='del'>-/* If OPT is a short option without an arg, append its key to the string</div><div class='del'>-   pointer pointer to by COOKIE, and advance the pointer.  */</div><div class='del'>-static int</div><div class='del'>-add_argless_short_opt (const struct argp_option *opt,</div><div class='del'>-		       const struct argp_option *real,</div><div class='del'>-		       const char *domain UNUSED, void *cookie)</div><div class='del'>-{</div><div class='del'>-  char **snao_end = cookie;</div><div class='del'>-  if (!(opt-&gt;arg || real-&gt;arg)</div><div class='del'>-      &amp;&amp; !((opt-&gt;flags | real-&gt;flags) &amp; OPTION_NO_USAGE))</div><div class='del'>-    *(*snao_end)++ = opt-&gt;key;</div><div class='del'>-  return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-/* If OPT is a short option with an arg, output a usage entry for it to the</div><div class='del'>-   stream pointed at by COOKIE.  */</div><div class='del'>-static int</div><div class='del'>-usage_argful_short_opt (const struct argp_option *opt,</div><div class='del'>-			const struct argp_option *real,</div><div class='del'>-			const char *domain UNUSED, void *cookie)</div><div class='del'>-{</div><div class='del'>-  argp_fmtstream_t stream = cookie;</div><div class='del'>-  const char *arg = opt-&gt;arg;</div><div class='del'>-  int flags = opt-&gt;flags | real-&gt;flags;</div><div class='del'>-</div><div class='del'>-  if (! arg)</div><div class='del'>-    arg = real-&gt;arg;</div><div class='del'>-</div><div class='del'>-  if (arg &amp;&amp; !(flags &amp; OPTION_NO_USAGE))</div><div class='del'>-    {</div><div class='del'>-      arg = dgettext (domain, arg);</div><div class='del'>-</div><div class='del'>-      if (flags &amp; OPTION_ARG_OPTIONAL)</div><div class='del'>-	__argp_fmtstream_printf (stream, " [-%c[%s]]", opt-&gt;key, arg);</div><div class='del'>-      else</div><div class='del'>-	{</div><div class='del'>-	  /* Manually do line wrapping so that it (probably) won't</div><div class='del'>-	     get wrapped at the embedded space.  */</div><div class='del'>-	  space (stream, 6 + strlen (arg));</div><div class='del'>-	  __argp_fmtstream_printf (stream, "[-%c %s]", opt-&gt;key, arg);</div><div class='del'>-	}</div><div class='del'>-    }</div><div class='del'>-</div><div class='del'>-  return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-/* Output a usage entry for the long option opt to the stream pointed at by</div><div class='del'>-   COOKIE.  */</div><div class='del'>-static int</div><div class='del'>-usage_long_opt (const struct argp_option *opt,</div><div class='del'>-		const struct argp_option *real,</div><div class='del'>-		const char *domain UNUSED, void *cookie)</div><div class='del'>-{</div><div class='del'>-  argp_fmtstream_t stream = cookie;</div><div class='del'>-  const char *arg = opt-&gt;arg;</div><div class='del'>-  int flags = opt-&gt;flags | real-&gt;flags;</div><div class='del'>-</div><div class='del'>-  if (! arg)</div><div class='del'>-    arg = real-&gt;arg;</div><div class='del'>-</div><div class='del'>-  if (! (flags &amp; OPTION_NO_USAGE))</div><div class='del'>-    {</div><div class='del'>-      if (arg)</div><div class='del'>-	{</div><div class='del'>-	  arg = dgettext (domain, arg);</div><div class='del'>-	  if (flags &amp; OPTION_ARG_OPTIONAL)</div><div class='del'>-	    __argp_fmtstream_printf (stream, " [--%s[=%s]]", opt-&gt;name, arg);</div><div class='del'>-	  else</div><div class='del'>-	    __argp_fmtstream_printf (stream, " [--%s=%s]", opt-&gt;name, arg);</div><div class='del'>-	}</div><div class='del'>-      else</div><div class='del'>-	__argp_fmtstream_printf (stream, " [--%s]", opt-&gt;name);</div><div class='del'>-    }</div><div class='del'>-</div><div class='del'>-  return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-/* Print a short usage description for the arguments in HOL to STREAM.  */</div><div class='del'>-static void</div><div class='del'>-hol_usage (struct hol *hol, argp_fmtstream_t stream)</div><div class='del'>-{</div><div class='del'>-  if (hol-&gt;num_entries &gt; 0)</div><div class='del'>-    {</div><div class='del'>-      unsigned nentries;</div><div class='del'>-      struct hol_entry *entry;</div><div class='del'>-      char *short_no_arg_opts = alloca (strlen (hol-&gt;short_options) + 1);</div><div class='del'>-      char *snao_end = short_no_arg_opts;</div><div class='del'>-</div><div class='del'>-      /* First we put a list of short options without arguments.  */</div><div class='del'>-      for (entry = hol-&gt;entries, nentries = hol-&gt;num_entries</div><div class='del'>-	   ; nentries &gt; 0</div><div class='del'>-	   ; entry++, nentries--)</div><div class='del'>-	hol_entry_short_iterate (entry, add_argless_short_opt,</div><div class='del'>-				 entry-&gt;argp-&gt;argp_domain, &amp;snao_end);</div><div class='del'>-      if (snao_end &gt; short_no_arg_opts)</div><div class='del'>-	{</div><div class='del'>-	  *snao_end++ = 0;</div><div class='del'>-	  __argp_fmtstream_printf (stream, " [-%s]", short_no_arg_opts);</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-      /* Now a list of short options *with* arguments.  */</div><div class='del'>-      for (entry = hol-&gt;entries, nentries = hol-&gt;num_entries</div><div class='del'>-	   ; nentries &gt; 0</div><div class='del'>-	   ; entry++, nentries--)</div><div class='del'>-	hol_entry_short_iterate (entry, usage_argful_short_opt,</div><div class='del'>-				 entry-&gt;argp-&gt;argp_domain, stream);</div><div class='del'>-</div><div class='del'>-      /* Finally, a list of long options (whew!).  */</div><div class='del'>-      for (entry = hol-&gt;entries, nentries = hol-&gt;num_entries</div><div class='del'>-	   ; nentries &gt; 0</div><div class='del'>-	   ; entry++, nentries--)</div><div class='del'>-	hol_entry_long_iterate (entry, usage_long_opt,</div><div class='del'>-				entry-&gt;argp-&gt;argp_domain, stream);</div><div class='del'>-    }</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-/* Make a HOL containing all levels of options in ARGP.  CLUSTER is the</div><div class='del'>-   cluster in which ARGP's entries should be clustered, or 0.  */</div><div class='del'>-static struct hol *</div><div class='del'>-argp_hol (const struct argp *argp, struct hol_cluster *cluster)</div><div class='del'>-{</div><div class='del'>-  const struct argp_child *child = argp-&gt;children;</div><div class='del'>-  struct hol *hol = make_hol (argp, cluster);</div><div class='del'>-  if (child)</div><div class='del'>-    while (child-&gt;argp)</div><div class='del'>-      {</div><div class='del'>-	struct hol_cluster *child_cluster =</div><div class='del'>-	  ((child-&gt;group || child-&gt;header)</div><div class='del'>-	   /* Put CHILD-&gt;argp within its own cluster.  */</div><div class='del'>-	   ? hol_add_cluster (hol, child-&gt;group, child-&gt;header,</div><div class='del'>-			      child - argp-&gt;children, cluster, argp)</div><div class='del'>-	   /* Just merge it into the parent's cluster.  */</div><div class='del'>-	   : cluster);</div><div class='del'>-	hol_append (hol, argp_hol (child-&gt;argp, child_cluster)) ;</div><div class='del'>-	child++;</div><div class='del'>-      }</div><div class='del'>-  return hol;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-/* Calculate how many different levels with alternative args strings exist in</div><div class='del'>-   ARGP.  */</div><div class='del'>-static size_t</div><div class='del'>-argp_args_levels (const struct argp *argp)</div><div class='del'>-{</div><div class='del'>-  size_t levels = 0;</div><div class='del'>-  const struct argp_child *child = argp-&gt;children;</div><div class='del'>-</div><div class='del'>-  if (argp-&gt;args_doc &amp;&amp; strchr (argp-&gt;args_doc, '\n'))</div><div class='del'>-    levels++;</div><div class='del'>-</div><div class='del'>-  if (child)</div><div class='del'>-    while (child-&gt;argp)</div><div class='del'>-      levels += argp_args_levels ((child++)-&gt;argp);</div><div class='del'>-</div><div class='del'>-  return levels;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-/* Print all the non-option args documented in ARGP to STREAM.  Any output is</div><div class='del'>-   preceded by a space.  LEVELS is a pointer to a byte vector the length</div><div class='del'>-   returned by argp_args_levels; it should be initialized to zero, and</div><div class='del'>-   updated by this routine for the next call if ADVANCE is true.  True is</div><div class='del'>-   returned as long as there are more patterns to output.  */</div><div class='del'>-static int</div><div class='del'>-argp_args_usage (const struct argp *argp, const struct argp_state *state,</div><div class='del'>-		 char **levels, int advance, argp_fmtstream_t stream)</div><div class='del'>-{</div><div class='del'>-  char *our_level = *levels;</div><div class='del'>-  int multiple = 0;</div><div class='del'>-  const struct argp_child *child = argp-&gt;children;</div><div class='del'>-  const char *tdoc = dgettext (argp-&gt;argp_domain, argp-&gt;args_doc), *nl = 0;</div><div class='del'>-  const char *fdoc = filter_doc (tdoc, ARGP_KEY_HELP_ARGS_DOC, argp, state);</div><div class='del'>-</div><div class='del'>-  if (fdoc)</div><div class='del'>-    {</div><div class='del'>-      const char *cp = fdoc;</div><div class='del'>-      nl = __strchrnul (cp, '\n');</div><div class='del'>-      if (*nl != '\0')</div><div class='del'>-	/* This is a `multi-level' args doc; advance to the correct position</div><div class='del'>-	   as determined by our state in LEVELS, and update LEVELS.  */</div><div class='del'>-	{</div><div class='del'>-	  int i;</div><div class='del'>-	  multiple = 1;</div><div class='del'>-	  for (i = 0; i &lt; *our_level; i++)</div><div class='del'>-	    cp = nl + 1, nl = __strchrnul (cp, '\n');</div><div class='del'>-	  (*levels)++;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-      /* Manually do line wrapping so that it (probably) won't get wrapped at</div><div class='del'>-	 any embedded spaces.  */</div><div class='del'>-      space (stream, 1 + nl - cp);</div><div class='del'>-</div><div class='del'>-      __argp_fmtstream_write (stream, cp, nl - cp);</div><div class='del'>-    }</div><div class='del'>-  if (fdoc &amp;&amp; fdoc != tdoc)</div><div class='del'>-    free ((char *)fdoc);	/* Free user's modified doc string.  */</div><div class='del'>-</div><div class='del'>-  if (child)</div><div class='del'>-    while (child-&gt;argp)</div><div class='del'>-      advance = !argp_args_usage ((child++)-&gt;argp, state, levels, advance, stream);</div><div class='del'>-</div><div class='del'>-  if (advance &amp;&amp; multiple)</div><div class='del'>-    {</div><div class='del'>-      /* Need to increment our level.  */</div><div class='del'>-      if (*nl)</div><div class='del'>-	/* There's more we can do here.  */</div><div class='del'>-	{</div><div class='del'>-	  (*our_level)++;</div><div class='del'>-	  advance = 0;		/* Our parent shouldn't advance also. */</div><div class='del'>-	}</div><div class='del'>-      else if (*our_level &gt; 0)</div><div class='del'>-	/* We had multiple levels, but used them up; reset to zero.  */</div><div class='del'>-	*our_level = 0;</div><div class='del'>-    }</div><div class='del'>-</div><div class='del'>-  return !advance;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-/* Print the documentation for ARGP to STREAM; if POST is false, then</div><div class='del'>-   everything preceeding a `\v' character in the documentation strings (or</div><div class='del'>-   the whole string, for those with none) is printed, otherwise, everything</div><div class='del'>-   following the `\v' character (nothing for strings without).  Each separate</div><div class='del'>-   bit of documentation is separated a blank line, and if PRE_BLANK is true,</div><div class='del'>-   then the first is as well.  If FIRST_ONLY is true, only the first</div><div class='del'>-   occurrence is output.  Returns true if anything was output.  */</div><div class='del'>-static int</div><div class='del'>-argp_doc (const struct argp *argp, const struct argp_state *state,</div><div class='del'>-	  int post, int pre_blank, int first_only,</div><div class='del'>-	  argp_fmtstream_t stream)</div><div class='del'>-{</div><div class='del'>-  const char *text;</div><div class='del'>-  const char *inp_text;</div><div class='del'>-  void *input = 0;</div><div class='del'>-  int anything = 0;</div><div class='del'>-  size_t inp_text_limit = 0;</div><div class='del'>-  const char *doc = dgettext (argp-&gt;argp_domain, argp-&gt;doc);</div><div class='del'>-  const struct argp_child *child = argp-&gt;children;</div><div class='del'>-</div><div class='del'>-  if (doc)</div><div class='del'>-    {</div><div class='del'>-      char *vt = strchr (doc, '\v');</div><div class='del'>-      inp_text = post ? (vt ? vt + 1 : 0) : doc;</div><div class='del'>-      inp_text_limit = (!post &amp;&amp; vt) ? (vt - doc) : 0;</div><div class='del'>-    }</div><div class='del'>-  else</div><div class='del'>-    inp_text = 0;</div><div class='del'>-</div><div class='del'>-  if (argp-&gt;help_filter)</div><div class='del'>-    /* We have to filter the doc strings.  */</div><div class='del'>-    {</div><div class='del'>-      if (inp_text_limit)</div><div class='del'>-	/* Copy INP_TEXT so that it's nul-terminated.  */</div><div class='del'>-	inp_text = STRNDUP (inp_text, inp_text_limit);</div><div class='del'>-      input = __argp_input (argp, state);</div><div class='del'>-      text =</div><div class='del'>-	(*argp-&gt;help_filter) (post</div><div class='del'>-			      ? ARGP_KEY_HELP_POST_DOC</div><div class='del'>-			      : ARGP_KEY_HELP_PRE_DOC,</div><div class='del'>-			      inp_text, input);</div><div class='del'>-    }</div><div class='del'>-  else</div><div class='del'>-    text = (const char *) inp_text;</div><div class='del'>-</div><div class='del'>-  if (text)</div><div class='del'>-    {</div><div class='del'>-      if (pre_blank)</div><div class='del'>-	__argp_fmtstream_putc (stream, '\n');</div><div class='del'>-</div><div class='del'>-      if (text == inp_text &amp;&amp; inp_text_limit)</div><div class='del'>-	__argp_fmtstream_write (stream, inp_text, inp_text_limit);</div><div class='del'>-      else</div><div class='del'>-	__argp_fmtstream_puts (stream, text);</div><div class='del'>-</div><div class='del'>-      if (__argp_fmtstream_point (stream) &gt; __argp_fmtstream_lmargin (stream))</div><div class='del'>-	__argp_fmtstream_putc (stream, '\n');</div><div class='del'>-</div><div class='del'>-      anything = 1;</div><div class='del'>-    }</div><div class='del'>-</div><div class='del'>-  if (text &amp;&amp; text != inp_text)</div><div class='del'>-    free ((char *) text);	/* Free TEXT returned from the help filter.  */</div><div class='del'>-  if (inp_text &amp;&amp; inp_text_limit &amp;&amp; argp-&gt;help_filter)</div><div class='del'>-    free ((char *) inp_text);	/* We copied INP_TEXT, so free it now.  */</div><div class='del'>-</div><div class='del'>-  if (post &amp;&amp; argp-&gt;help_filter)</div><div class='del'>-    /* Now see if we have to output a ARGP_KEY_HELP_EXTRA text.  */</div><div class='del'>-    {</div><div class='del'>-      text = (*argp-&gt;help_filter) (ARGP_KEY_HELP_EXTRA, 0, input);</div><div class='del'>-      if (text)</div><div class='del'>-	{</div><div class='del'>-	  if (anything || pre_blank)</div><div class='del'>-	    __argp_fmtstream_putc (stream, '\n');</div><div class='del'>-	  __argp_fmtstream_puts (stream, text);</div><div class='del'>-	  free ((char *) text);</div><div class='del'>-	  if (__argp_fmtstream_point (stream)</div><div class='del'>-	      &gt; __argp_fmtstream_lmargin (stream))</div><div class='del'>-	    __argp_fmtstream_putc (stream, '\n');</div><div class='del'>-	  anything = 1;</div><div class='del'>-	}</div><div class='del'>-    }</div><div class='del'>-</div><div class='del'>-  if (child)</div><div class='del'>-    while (child-&gt;argp &amp;&amp; !(first_only &amp;&amp; anything))</div><div class='del'>-      anything |=</div><div class='del'>-	argp_doc ((child++)-&gt;argp, state,</div><div class='del'>-		  post, anything || pre_blank, first_only,</div><div class='del'>-		  stream);</div><div class='del'>-</div><div class='del'>-  return anything;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-/* Output a usage message for ARGP to STREAM.  If called from</div><div class='del'>-   argp_state_help, STATE is the relevent parsing state.  FLAGS are from the</div><div class='del'>-   set ARGP_HELP_*.  NAME is what to use wherever a `program name' is</div><div class='del'>-   needed. */</div><div class='del'>-</div><div class='del'>-static void</div><div class='del'>-_help (const struct argp *argp, const struct argp_state *state, FILE *stream,</div><div class='del'>-       unsigned flags, const char *name)</div><div class='del'>-{</div><div class='del'>-  int anything = 0;		/* Whether we've output anything.  */</div><div class='del'>-  struct hol *hol = 0;</div><div class='del'>-  argp_fmtstream_t fs;</div><div class='del'>-</div><div class='del'>-  if (! stream)</div><div class='del'>-    return;</div><div class='del'>-</div><div class='del'>-  FLOCKFILE (stream);</div><div class='del'>-</div><div class='del'>-  if (! uparams.valid)</div><div class='del'>-    fill_in_uparams (state);</div><div class='del'>-</div><div class='del'>-  fs = __argp_make_fmtstream (stream, 0, uparams.rmargin, 0);</div><div class='del'>-  if (! fs)</div><div class='del'>-    {</div><div class='del'>-      FUNLOCKFILE (stream);</div><div class='del'>-      return;</div><div class='del'>-    }</div><div class='del'>-</div><div class='del'>-  if (flags &amp; (ARGP_HELP_USAGE | ARGP_HELP_SHORT_USAGE | ARGP_HELP_LONG))</div><div class='del'>-    {</div><div class='del'>-      hol = argp_hol (argp, 0);</div><div class='del'>-</div><div class='del'>-      /* If present, these options always come last.  */</div><div class='del'>-      hol_set_group (hol, "help", -1);</div><div class='del'>-      hol_set_group (hol, "version", -1);</div><div class='del'>-</div><div class='del'>-      hol_sort (hol);</div><div class='del'>-    }</div><div class='del'>-</div><div class='del'>-  if (flags &amp; (ARGP_HELP_USAGE | ARGP_HELP_SHORT_USAGE))</div><div class='del'>-    /* Print a short `Usage:' message.  */</div><div class='del'>-    {</div><div class='del'>-      int first_pattern = 1, more_patterns;</div><div class='del'>-      size_t num_pattern_levels = argp_args_levels (argp);</div><div class='del'>-      char *pattern_levels = alloca (num_pattern_levels);</div><div class='del'>-</div><div class='del'>-      memset (pattern_levels, 0, num_pattern_levels);</div><div class='del'>-</div><div class='del'>-      do</div><div class='del'>-	{</div><div class='del'>-	  int old_lm;</div><div class='del'>-	  int old_wm = __argp_fmtstream_set_wmargin (fs, uparams.usage_indent);</div><div class='del'>-	  char *levels = pattern_levels;</div><div class='del'>-</div><div class='del'>-	  if (first_pattern)</div><div class='del'>-	    __argp_fmtstream_printf (fs, "%s %s",</div><div class='del'>-				     dgettext (argp-&gt;argp_domain, "Usage:"),</div><div class='del'>-				     name);</div><div class='del'>-	  else</div><div class='del'>-	    __argp_fmtstream_printf (fs, "%s %s",</div><div class='del'>-				     dgettext (argp-&gt;argp_domain, "  or: "),</div><div class='del'>-				     name);</div><div class='del'>-</div><div class='del'>-	  /* We set the lmargin as well as the wmargin, because hol_usage</div><div class='del'>-	     manually wraps options with newline to avoid annoying breaks.  */</div><div class='del'>-	  old_lm = __argp_fmtstream_set_lmargin (fs, uparams.usage_indent);</div><div class='del'>-</div><div class='del'>-	  if (flags &amp; ARGP_HELP_SHORT_USAGE)</div><div class='del'>-	    /* Just show where the options go.  */</div><div class='del'>-	    {</div><div class='del'>-	      if (hol-&gt;num_entries &gt; 0)</div><div class='del'>-		__argp_fmtstream_puts (fs, dgettext (argp-&gt;argp_domain,</div><div class='del'>-						     " [OPTION...]"));</div><div class='del'>-	    }</div><div class='del'>-	  else</div><div class='del'>-	    /* Actually print the options.  */</div><div class='del'>-	    {</div><div class='del'>-	      hol_usage (hol, fs);</div><div class='del'>-	      flags |= ARGP_HELP_SHORT_USAGE; /* But only do so once.  */</div><div class='del'>-	    }</div><div class='del'>-</div><div class='del'>-	  more_patterns = argp_args_usage (argp, state, &amp;levels, 1, fs);</div><div class='del'>-</div><div class='del'>-	  __argp_fmtstream_set_wmargin (fs, old_wm);</div><div class='del'>-	  __argp_fmtstream_set_lmargin (fs, old_lm);</div><div class='del'>-</div><div class='del'>-	  __argp_fmtstream_putc (fs, '\n');</div><div class='del'>-	  anything = 1;</div><div class='del'>-</div><div class='del'>-	  first_pattern = 0;</div><div class='del'>-	}</div><div class='del'>-      while (more_patterns);</div><div class='del'>-    }</div><div class='del'>-</div><div class='del'>-  if (flags &amp; ARGP_HELP_PRE_DOC)</div><div class='del'>-    anything |= argp_doc (argp, state, 0, 0, 1, fs);</div><div class='del'>-</div><div class='del'>-  if (flags &amp; ARGP_HELP_SEE)</div><div class='del'>-    {</div><div class='del'>-      __argp_fmtstream_printf (fs, dgettext (argp-&gt;argp_domain, "\</div><div class='del'>-Try `%s --help' or `%s --usage' for more information.\n"),</div><div class='del'>-			       name, name);</div><div class='del'>-      anything = 1;</div><div class='del'>-    }</div><div class='del'>-</div><div class='del'>-  if (flags &amp; ARGP_HELP_LONG)</div><div class='del'>-    /* Print a long, detailed help message.  */</div><div class='del'>-    {</div><div class='del'>-      /* Print info about all the options.  */</div><div class='del'>-      if (hol-&gt;num_entries &gt; 0)</div><div class='del'>-	{</div><div class='del'>-	  if (anything)</div><div class='del'>-	    __argp_fmtstream_putc (fs, '\n');</div><div class='del'>-	  hol_help (hol, state, fs);</div><div class='del'>-	  anything = 1;</div><div class='del'>-	}</div><div class='del'>-    }</div><div class='del'>-</div><div class='del'>-  if (flags &amp; ARGP_HELP_POST_DOC)</div><div class='del'>-    /* Print any documentation strings at the end.  */</div><div class='del'>-    anything |= argp_doc (argp, state, 1, anything, 0, fs);</div><div class='del'>-</div><div class='del'>-  if ((flags &amp; ARGP_HELP_BUG_ADDR) &amp;&amp; argp_program_bug_address)</div><div class='del'>-    {</div><div class='del'>-      if (anything)</div><div class='del'>-	__argp_fmtstream_putc (fs, '\n');</div><div class='del'>-      __argp_fmtstream_printf (fs, dgettext (argp-&gt;argp_domain,</div><div class='del'>-					     "Report bugs to %s.\n"),</div><div class='del'>- 			       argp_program_bug_address);</div><div class='del'>-      anything = 1;</div><div class='del'>-    }</div><div class='del'>-</div><div class='del'>-  FUNLOCKFILE (stream);</div><div class='del'>-</div><div class='del'>-  if (hol)</div><div class='del'>-    hol_free (hol);</div><div class='del'>-</div><div class='del'>-  __argp_fmtstream_free (fs);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-/* Output a usage message for ARGP to STREAM.  FLAGS are from the set</div><div class='del'>-   ARGP_HELP_*.  NAME is what to use wherever a `program name' is needed. */</div><div class='del'>-void __argp_help (const struct argp *argp, FILE *stream,</div><div class='del'>-		  unsigned flags, char *name)</div><div class='del'>-{</div><div class='del'>-  _help (argp, 0, stream, flags, name);</div><div class='del'>-}</div><div class='del'>-#ifdef weak_alias</div><div class='del'>-weak_alias (__argp_help, argp_help)</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-char *__argp_basename(char *name)</div><div class='del'>-{</div><div class='del'>-  char *short_name = strrchr(name, '/');</div><div class='del'>-  return short_name ? short_name + 1 : name;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-char *</div><div class='del'>-__argp_short_program_name(const struct argp_state *state)</div><div class='del'>-{</div><div class='del'>-  if (state)</div><div class='del'>-    return state-&gt;name;</div><div class='del'>-#if HAVE_DECL_PROGRAM_INVOCATION_SHORT_NAME</div><div class='del'>-  return program_invocation_short_name;</div><div class='del'>-#elif HAVE_DECL_PROGRAM_INVOCATION_NAME</div><div class='del'>-  return __argp_basename(program_invocation_name);</div><div class='del'>-#else /* !HAVE_DECL_PROGRAM_INVOCATION_NAME */</div><div class='del'>-  /* FIXME: What now? Miles suggests that it is better to use NULL,</div><div class='del'>-     but currently the value is passed on directly to fputs_unlocked,</div><div class='del'>-     so that requires more changes. */</div><div class='del'>-# if __GNUC__</div><div class='del'>-  return "";</div><div class='del'>-# endif /* __GNUC__ */</div><div class='del'>-#endif /* !HAVE_DECL_PROGRAM_INVOCATION_NAME */</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-/* Output, if appropriate, a usage message for STATE to STREAM.  FLAGS are</div><div class='del'>-   from the set ARGP_HELP_*.  */</div><div class='del'>-void</div><div class='del'>-__argp_state_help (const struct argp_state *state, FILE *stream, unsigned flags)</div><div class='del'>-{</div><div class='del'>-  if ((!state || ! (state-&gt;flags &amp; ARGP_NO_ERRS)) &amp;&amp; stream)</div><div class='del'>-    {</div><div class='del'>-      if (state &amp;&amp; (state-&gt;flags &amp; ARGP_LONG_ONLY))</div><div class='del'>-	flags |= ARGP_HELP_LONG_ONLY;</div><div class='del'>-</div><div class='del'>-      _help (state ? state-&gt;root_argp : 0, state, stream, flags,</div><div class='del'>-	     __argp_short_program_name(state));</div><div class='del'>-</div><div class='del'>-      if (!state || ! (state-&gt;flags &amp; ARGP_NO_EXIT))</div><div class='del'>-	{</div><div class='del'>-	  if (flags &amp; ARGP_HELP_EXIT_ERR)</div><div class='del'>-	    exit (argp_err_exit_status);</div><div class='del'>-	  if (flags &amp; ARGP_HELP_EXIT_OK)</div><div class='del'>-	    exit (0);</div><div class='del'>-	}</div><div class='del'>-  }</div><div class='del'>-}</div><div class='del'>-#ifdef weak_alias</div><div class='del'>-weak_alias (__argp_state_help, argp_state_help)</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-/* If appropriate, print the printf string FMT and following args, preceded</div><div class='del'>-   by the program name and `:', to stderr, and followed by a `Try ... --help'</div><div class='del'>-   message, then exit (1).  */</div><div class='del'>-void</div><div class='del'>-__argp_error (const struct argp_state *state, const char *fmt, ...)</div><div class='del'>-{</div><div class='del'>-  if (!state || !(state-&gt;flags &amp; ARGP_NO_ERRS))</div><div class='del'>-    {</div><div class='del'>-      FILE *stream = state ? state-&gt;err_stream : stderr;</div><div class='del'>-</div><div class='del'>-      if (stream)</div><div class='del'>-	{</div><div class='del'>-	  va_list ap;</div><div class='del'>-</div><div class='del'>-	  FLOCKFILE (stream);</div><div class='del'>-</div><div class='del'>-	  FPUTS_UNLOCKED (__argp_short_program_name(state),</div><div class='del'>-			  stream);</div><div class='del'>-	  PUTC_UNLOCKED (':', stream);</div><div class='del'>-	  PUTC_UNLOCKED (' ', stream);</div><div class='del'>-</div><div class='del'>-	  va_start (ap, fmt);</div><div class='del'>-	  vfprintf (stream, fmt, ap);</div><div class='del'>-	  va_end (ap);</div><div class='del'>-</div><div class='del'>-	  PUTC_UNLOCKED ('\n', stream);</div><div class='del'>-</div><div class='del'>-	  __argp_state_help (state, stream, ARGP_HELP_STD_ERR);</div><div class='del'>-</div><div class='del'>-	  FUNLOCKFILE (stream);</div><div class='del'>-	}</div><div class='del'>-    }</div><div class='del'>-}</div><div class='del'>-#ifdef weak_alias</div><div class='del'>-weak_alias (__argp_error, argp_error)</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-/* Similar to the standard gnu error-reporting function error(), but will</div><div class='del'>-   respect the ARGP_NO_EXIT and ARGP_NO_ERRS flags in STATE, and will print</div><div class='del'>-   to STATE-&gt;err_stream.  This is useful for argument parsing code that is</div><div class='del'>-   shared between program startup (when exiting is desired) and runtime</div><div class='del'>-   option parsing (when typically an error code is returned instead).  The</div><div class='del'>-   difference between this function and argp_error is that the latter is for</div><div class='del'>-   *parsing errors*, and the former is for other problems that occur during</div><div class='del'>-   parsing but don't reflect a (syntactic) problem with the input.  */</div><div class='del'>-void</div><div class='del'>-__argp_failure (const struct argp_state *state, int status, int errnum,</div><div class='del'>-		const char *fmt, ...)</div><div class='del'>-{</div><div class='del'>-  if (!state || !(state-&gt;flags &amp; ARGP_NO_ERRS))</div><div class='del'>-    {</div><div class='del'>-      FILE *stream = state ? state-&gt;err_stream : stderr;</div><div class='del'>-</div><div class='del'>-      if (stream)</div><div class='del'>-	{</div><div class='del'>-	  FLOCKFILE (stream);</div><div class='del'>-</div><div class='del'>-	  FPUTS_UNLOCKED (__argp_short_program_name(state),</div><div class='del'>-			  stream);</div><div class='del'>-</div><div class='del'>-	  if (fmt)</div><div class='del'>-	    {</div><div class='del'>-	      va_list ap;</div><div class='del'>-</div><div class='del'>-	      PUTC_UNLOCKED (':', stream);</div><div class='del'>-	      PUTC_UNLOCKED (' ', stream);</div><div class='del'>-</div><div class='del'>-	      va_start (ap, fmt);</div><div class='del'>-	      vfprintf (stream, fmt, ap);</div><div class='del'>-	      va_end (ap);</div><div class='del'>-	    }</div><div class='del'>-</div><div class='del'>-	  if (errnum)</div><div class='del'>-	    {</div><div class='del'>-	      PUTC_UNLOCKED (':', stream);</div><div class='del'>-	      PUTC_UNLOCKED (' ', stream);</div><div class='del'>-	      fputs (STRERROR (errnum), stream);</div><div class='del'>-	    }</div><div class='del'>-</div><div class='del'>-	  PUTC_UNLOCKED ('\n', stream);</div><div class='del'>-</div><div class='del'>-	  FUNLOCKFILE (stream);</div><div class='del'>-</div><div class='del'>-	  if (status &amp;&amp; (!state || !(state-&gt;flags &amp; ARGP_NO_EXIT)))</div><div class='del'>-	    exit (status);</div><div class='del'>-	}</div><div class='del'>-    }</div><div class='del'>-}</div><div class='del'>-#ifdef weak_alias</div><div class='del'>-weak_alias (__argp_failure, argp_failure)</div><div class='del'>-#endif</div><div class='head'>diff --git a/argp-standalone/argp-namefrob.h b/argp-standalone/argp-namefrob.h<br/>deleted file mode 100644<br/>index 0ce11481a7b..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/argp-standalone/argp-namefrob.h?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>argp-standalone/argp-namefrob.h</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,96 +0,0 @@</div><div class='del'>-/* Name frobnication for compiling argp outside of glibc</div><div class='del'>-   Copyright (C) 1997 Free Software Foundation, Inc.</div><div class='del'>-   This file is part of the GNU C Library.</div><div class='del'>-   Written by Miles Bader &lt;miles@gnu.ai.mit.edu&gt;.</div><div class='del'>-</div><div class='del'>-   The GNU C Library is free software; you can redistribute it and/or</div><div class='del'>-   modify it under the terms of the GNU Library General Public License as</div><div class='del'>-   published by the Free Software Foundation; either version 2 of the</div><div class='del'>-   License, or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-   The GNU C Library is distributed in the hope that it will be useful,</div><div class='del'>-   but WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-   Library General Public License for more details.</div><div class='del'>-</div><div class='del'>-   You should have received a copy of the GNU Library General Public</div><div class='del'>-   License along with the GNU C Library; see the file COPYING.LIB.  If not,</div><div class='del'>-   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,</div><div class='del'>-   Boston, MA 02111-1307, USA.  */</div><div class='del'>-</div><div class='del'>-#if !_LIBC</div><div class='del'>-/* This code is written for inclusion in gnu-libc, and uses names in the</div><div class='del'>-   namespace reserved for libc.  If we're not compiling in libc, define those</div><div class='del'>-   names to be the normal ones instead.  */</div><div class='del'>-</div><div class='del'>-/* argp-parse functions */</div><div class='del'>-#undef __argp_parse</div><div class='del'>-#define __argp_parse argp_parse</div><div class='del'>-#undef __option_is_end</div><div class='del'>-#define __option_is_end _option_is_end</div><div class='del'>-#undef __option_is_short</div><div class='del'>-#define __option_is_short _option_is_short</div><div class='del'>-#undef __argp_input</div><div class='del'>-#define __argp_input _argp_input</div><div class='del'>-</div><div class='del'>-/* argp-help functions */</div><div class='del'>-#undef __argp_help</div><div class='del'>-#define __argp_help argp_help</div><div class='del'>-#undef __argp_error</div><div class='del'>-#define __argp_error argp_error</div><div class='del'>-#undef __argp_failure</div><div class='del'>-#define __argp_failure argp_failure</div><div class='del'>-#undef __argp_state_help</div><div class='del'>-#define __argp_state_help argp_state_help</div><div class='del'>-#undef __argp_usage</div><div class='del'>-#define __argp_usage argp_usage</div><div class='del'>-#undef __argp_basename</div><div class='del'>-#define __argp_basename _argp_basename</div><div class='del'>-#undef __argp_short_program_name</div><div class='del'>-#define __argp_short_program_name _argp_short_program_name</div><div class='del'>-</div><div class='del'>-/* argp-fmtstream functions */</div><div class='del'>-#undef __argp_make_fmtstream</div><div class='del'>-#define __argp_make_fmtstream argp_make_fmtstream</div><div class='del'>-#undef __argp_fmtstream_free</div><div class='del'>-#define __argp_fmtstream_free argp_fmtstream_free</div><div class='del'>-#undef __argp_fmtstream_putc</div><div class='del'>-#define __argp_fmtstream_putc argp_fmtstream_putc</div><div class='del'>-#undef __argp_fmtstream_puts</div><div class='del'>-#define __argp_fmtstream_puts argp_fmtstream_puts</div><div class='del'>-#undef __argp_fmtstream_write</div><div class='del'>-#define __argp_fmtstream_write argp_fmtstream_write</div><div class='del'>-#undef __argp_fmtstream_printf</div><div class='del'>-#define __argp_fmtstream_printf argp_fmtstream_printf</div><div class='del'>-#undef __argp_fmtstream_set_lmargin</div><div class='del'>-#define __argp_fmtstream_set_lmargin argp_fmtstream_set_lmargin</div><div class='del'>-#undef __argp_fmtstream_set_rmargin</div><div class='del'>-#define __argp_fmtstream_set_rmargin argp_fmtstream_set_rmargin</div><div class='del'>-#undef __argp_fmtstream_set_wmargin</div><div class='del'>-#define __argp_fmtstream_set_wmargin argp_fmtstream_set_wmargin</div><div class='del'>-#undef __argp_fmtstream_point</div><div class='del'>-#define __argp_fmtstream_point argp_fmtstream_point</div><div class='del'>-#undef __argp_fmtstream_update</div><div class='del'>-#define __argp_fmtstream_update _argp_fmtstream_update</div><div class='del'>-#undef __argp_fmtstream_ensure</div><div class='del'>-#define __argp_fmtstream_ensure _argp_fmtstream_ensure</div><div class='del'>-#undef __argp_fmtstream_lmargin</div><div class='del'>-#define __argp_fmtstream_lmargin argp_fmtstream_lmargin</div><div class='del'>-#undef __argp_fmtstream_rmargin</div><div class='del'>-#define __argp_fmtstream_rmargin argp_fmtstream_rmargin</div><div class='del'>-#undef __argp_fmtstream_wmargin</div><div class='del'>-#define __argp_fmtstream_wmargin argp_fmtstream_wmargin</div><div class='del'>-</div><div class='del'>-/* normal libc functions we call */</div><div class='del'>-#undef __sleep</div><div class='del'>-#define __sleep sleep</div><div class='del'>-#undef __strcasecmp</div><div class='del'>-#define __strcasecmp strcasecmp</div><div class='del'>-#undef __vsnprintf</div><div class='del'>-#define __vsnprintf vsnprintf</div><div class='del'>-</div><div class='del'>-#endif /* !_LIBC */</div><div class='del'>-</div><div class='del'>-#ifndef __set_errno</div><div class='del'>-#define __set_errno(e) (errno = (e))</div><div class='del'>-#endif</div><div class='head'>diff --git a/argp-standalone/argp-parse.c b/argp-standalone/argp-parse.c<br/>deleted file mode 100644<br/>index 78f7bf139b6..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/argp-standalone/argp-parse.c?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>argp-standalone/argp-parse.c</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,1305 +0,0 @@</div><div class='del'>-/* Hierarchial argument parsing</div><div class='del'>-   Copyright (C) 1995, 96, 97, 98, 99, 2000,2003 Free Software Foundation, Inc.</div><div class='del'>-   This file is part of the GNU C Library.</div><div class='del'>-   Written by Miles Bader &lt;miles@gnu.ai.mit.edu&gt;.</div><div class='del'>-</div><div class='del'>-   The GNU C Library is free software; you can redistribute it and/or</div><div class='del'>-   modify it under the terms of the GNU Library General Public License as</div><div class='del'>-   published by the Free Software Foundation; either version 2 of the</div><div class='del'>-   License, or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-   The GNU C Library is distributed in the hope that it will be useful,</div><div class='del'>-   but WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-   Library General Public License for more details.</div><div class='del'>-</div><div class='del'>-   You should have received a copy of the GNU Library General Public</div><div class='del'>-   License along with the GNU C Library; see the file COPYING.LIB.  If not,</div><div class='del'>-   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,</div><div class='del'>-   Boston, MA 02111-1307, USA.  */</div><div class='del'>-</div><div class='del'>-#ifndef _GNU_SOURCE</div><div class='del'>-# define _GNU_SOURCE	1</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-#ifdef HAVE_CONFIG_H</div><div class='del'>-#include &lt;config.h&gt;</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-#if HAVE_ALLOCA_H</div><div class='del'>-#include &lt;alloca.h&gt;</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-#include &lt;stdlib.h&gt;</div><div class='del'>-#include &lt;string.h&gt;</div><div class='del'>-#if HAVE_UNISTD_H</div><div class='del'>-# include &lt;unistd.h&gt;</div><div class='del'>-#endif</div><div class='del'>-#include &lt;limits.h&gt;</div><div class='del'>-#include &lt;assert.h&gt;</div><div class='del'>-</div><div class='del'>-#if HAVE_MALLOC_H</div><div class='del'>-/* Needed, for alloca on windows */</div><div class='del'>-# include &lt;malloc.h&gt;</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-#ifndef _</div><div class='del'>-/* This is for other GNU distributions with internationalized messages.</div><div class='del'>-   When compiling libc, the _ macro is predefined.  */</div><div class='del'>-# if defined HAVE_LIBINTL_H || defined _LIBC</div><div class='del'>-#  include &lt;libintl.h&gt;</div><div class='del'>-#  ifdef _LIBC</div><div class='del'>-#   undef dgettext</div><div class='del'>-#   define dgettext(domain, msgid) __dcgettext (domain, msgid, LC_MESSAGES)</div><div class='del'>-#  endif</div><div class='del'>-# else</div><div class='del'>-#  define dgettext(domain, msgid) (msgid)</div><div class='del'>-#  define gettext(msgid) (msgid)</div><div class='del'>-# endif</div><div class='del'>-#endif</div><div class='del'>-#ifndef N_</div><div class='del'>-# define N_(msgid) (msgid)</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-#if _LIBC - 0</div><div class='del'>-#include &lt;bits/libc-lock.h&gt;</div><div class='del'>-#else</div><div class='del'>-#ifdef HAVE_CTHREADS_H</div><div class='del'>-#include &lt;cthreads.h&gt;</div><div class='del'>-#endif</div><div class='del'>-#endif /* _LIBC */</div><div class='del'>-</div><div class='del'>-#include "argp.h"</div><div class='del'>-#include "argp-namefrob.h"</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-/* The meta-argument used to prevent any further arguments being interpreted</div><div class='del'>-   as options.  */</div><div class='del'>-#define QUOTE "--"</div><div class='del'>-</div><div class='del'>-/* EZ alias for ARGP_ERR_UNKNOWN.  */</div><div class='del'>-#define EBADKEY ARGP_ERR_UNKNOWN</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-/* Default options.  */</div><div class='del'>-</div><div class='del'>-/* When argp is given the --HANG switch, _ARGP_HANG is set and argp will sleep</div><div class='del'>-   for one second intervals, decrementing _ARGP_HANG until it's zero.  Thus</div><div class='del'>-   you can force the program to continue by attaching a debugger and setting</div><div class='del'>-   it to 0 yourself.  */</div><div class='del'>-volatile int _argp_hang;</div><div class='del'>-</div><div class='del'>-#define OPT_PROGNAME	-2</div><div class='del'>-#define OPT_USAGE	-3</div><div class='del'>-#if HAVE_SLEEP &amp;&amp; HAVE_GETPID</div><div class='del'>-#define OPT_HANG	-4</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-static const struct argp_option argp_default_options[] =</div><div class='del'>-{</div><div class='del'>-  {"help",	  '?',    	0, 0,  N_("Give this help list"), -1},</div><div class='del'>-  {"usage",	  OPT_USAGE,	0, 0,  N_("Give a short usage message"), 0 },</div><div class='del'>-  {"program-name",OPT_PROGNAME,"NAME", OPTION_HIDDEN,</div><div class='del'>-     N_("Set the program name"), 0},</div><div class='del'>-#if OPT_HANG</div><div class='del'>-  {"HANG",	  OPT_HANG,    "SECS", OPTION_ARG_OPTIONAL | OPTION_HIDDEN,</div><div class='del'>-     N_("Hang for SECS seconds (default 3600)"), 0 },</div><div class='del'>-#endif</div><div class='del'>-  {0, 0, 0, 0, 0, 0}</div><div class='del'>-};</div><div class='del'>-</div><div class='del'>-static error_t</div><div class='del'>-argp_default_parser (int key, char *arg, struct argp_state *state)</div><div class='del'>-{</div><div class='del'>-  switch (key)</div><div class='del'>-    {</div><div class='del'>-    case '?':</div><div class='del'>-      __argp_state_help (state, state-&gt;out_stream, ARGP_HELP_STD_HELP);</div><div class='del'>-      break;</div><div class='del'>-    case OPT_USAGE:</div><div class='del'>-      __argp_state_help (state, state-&gt;out_stream,</div><div class='del'>-		       ARGP_HELP_USAGE | ARGP_HELP_EXIT_OK);</div><div class='del'>-      break;</div><div class='del'>-</div><div class='del'>-    case OPT_PROGNAME:		/* Set the program name.  */</div><div class='del'>-#if HAVE_DECL_PROGRAM_INVOCATION_NAME</div><div class='del'>-      program_invocation_name = arg;</div><div class='del'>-#endif</div><div class='del'>-      /* [Note that some systems only have PROGRAM_INVOCATION_SHORT_NAME (aka</div><div class='del'>-	 __PROGNAME), in which case, PROGRAM_INVOCATION_NAME is just defined</div><div class='del'>-	 to be that, so we have to be a bit careful here.]  */</div><div class='del'>-</div><div class='del'>-      /* Update what we use for messages.  */</div><div class='del'>-</div><div class='del'>-      state-&gt;name = __argp_basename(arg);</div><div class='del'>-      </div><div class='del'>-#if HAVE_DECL_PROGRAM_INVOCATION_SHORT_NAME</div><div class='del'>-      program_invocation_short_name = state-&gt;name;</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-      if ((state-&gt;flags &amp; (ARGP_PARSE_ARGV0 | ARGP_NO_ERRS))</div><div class='del'>-	  == ARGP_PARSE_ARGV0)</div><div class='del'>-	/* Update what getopt uses too.  */</div><div class='del'>-	state-&gt;argv[0] = arg;</div><div class='del'>-</div><div class='del'>-      break;</div><div class='del'>-      </div><div class='del'>-#if OPT_HANG</div><div class='del'>-    case OPT_HANG:</div><div class='del'>-      _argp_hang = atoi (arg ? arg : "3600");</div><div class='del'>-      fprintf(state-&gt;err_stream, "%s: pid = %ld\n",</div><div class='del'>-	      state-&gt;name, (long) getpid());</div><div class='del'>-      while (_argp_hang-- &gt; 0)</div><div class='del'>-	__sleep (1);</div><div class='del'>-      break;</div><div class='del'>-#endif</div><div class='del'>-      </div><div class='del'>-    default:</div><div class='del'>-      return EBADKEY;</div><div class='del'>-    }</div><div class='del'>-  return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-static const struct argp argp_default_argp =</div><div class='del'>-  {argp_default_options, &amp;argp_default_parser, NULL, NULL, NULL, NULL, "libc"};</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-static const struct argp_option argp_version_options[] =</div><div class='del'>-{</div><div class='del'>-  {"version",	  'V',    	0, 0,  N_("Print program version"), -1},</div><div class='del'>-  {0, 0, 0, 0, 0, 0 }</div><div class='del'>-};</div><div class='del'>-</div><div class='del'>-static error_t</div><div class='del'>-argp_version_parser (int key, char *arg UNUSED, struct argp_state *state)</div><div class='del'>-{</div><div class='del'>-  switch (key)</div><div class='del'>-    {</div><div class='del'>-    case 'V':</div><div class='del'>-      if (argp_program_version_hook)</div><div class='del'>-	(*argp_program_version_hook) (state-&gt;out_stream, state);</div><div class='del'>-      else if (argp_program_version)</div><div class='del'>-	fprintf (state-&gt;out_stream, "%s\n", argp_program_version);</div><div class='del'>-      else</div><div class='del'>-	__argp_error (state, dgettext (state-&gt;root_argp-&gt;argp_domain,</div><div class='del'>-				       "(PROGRAM ERROR) No version known!?"));</div><div class='del'>-      if (! (state-&gt;flags &amp; ARGP_NO_EXIT))</div><div class='del'>-	exit (0);</div><div class='del'>-      break;</div><div class='del'>-    default:</div><div class='del'>-      return EBADKEY;</div><div class='del'>-    }</div><div class='del'>-  return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-static const struct argp argp_version_argp =</div><div class='del'>-  {argp_version_options, &amp;argp_version_parser, NULL, NULL, NULL, NULL, "libc"};</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-/* The state of a `group' during parsing.  Each group corresponds to a</div><div class='del'>-   particular argp structure from the tree of such descending from the top</div><div class='del'>-   level argp passed to argp_parse.  */</div><div class='del'>-struct group</div><div class='del'>-{</div><div class='del'>-  /* This group's parsing function.  */</div><div class='del'>-  argp_parser_t parser;</div><div class='del'>-</div><div class='del'>-  /* Which argp this group is from.  */</div><div class='del'>-  const struct argp *argp;</div><div class='del'>-</div><div class='del'>-  /* The number of non-option args sucessfully handled by this parser.  */</div><div class='del'>-  unsigned args_processed;</div><div class='del'>-</div><div class='del'>-  /* This group's parser's parent's group.  */</div><div class='del'>-  struct group *parent;</div><div class='del'>-  unsigned parent_index;	/* And the our position in the parent.   */</div><div class='del'>-</div><div class='del'>-  /* These fields are swapped into and out of the state structure when</div><div class='del'>-     calling this group's parser.  */</div><div class='del'>-  void *input, **child_inputs;</div><div class='del'>-  void *hook;</div><div class='del'>-};</div><div class='del'>-</div><div class='del'>-/* Call GROUP's parser with KEY and ARG, swapping any group-specific info</div><div class='del'>-   from STATE before calling, and back into state afterwards.  If GROUP has</div><div class='del'>-   no parser, EBADKEY is returned.  */</div><div class='del'>-static error_t</div><div class='del'>-group_parse (struct group *group, struct argp_state *state, int key, char *arg)</div><div class='del'>-{</div><div class='del'>-  if (group-&gt;parser)</div><div class='del'>-    {</div><div class='del'>-      error_t err;</div><div class='del'>-      state-&gt;hook = group-&gt;hook;</div><div class='del'>-      state-&gt;input = group-&gt;input;</div><div class='del'>-      state-&gt;child_inputs = group-&gt;child_inputs;</div><div class='del'>-      state-&gt;arg_num = group-&gt;args_processed;</div><div class='del'>-      err = (*group-&gt;parser)(key, arg, state);</div><div class='del'>-      group-&gt;hook = state-&gt;hook;</div><div class='del'>-      return err;</div><div class='del'>-    }</div><div class='del'>-  else</div><div class='del'>-    return EBADKEY;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-struct parser</div><div class='del'>-{</div><div class='del'>-  const struct argp *argp;</div><div class='del'>-</div><div class='del'>-  const char *posixly_correct;</div><div class='del'>-  </div><div class='del'>-  /* True if there are only no-option arguments left, which are just</div><div class='del'>-     passed verbatim with ARGP_KEY_ARG. This is set if we encounter a</div><div class='del'>-     quote, or the end of the proper options, but may be cleared again</div><div class='del'>-     if the user moves the next argument pointer backwards. */</div><div class='del'>-  int args_only;</div><div class='del'>-</div><div class='del'>-  /* Describe how to deal with options that follow non-option ARGV-elements.</div><div class='del'>-</div><div class='del'>-     If the caller did not specify anything, the default is</div><div class='del'>-     REQUIRE_ORDER if the environment variable POSIXLY_CORRECT is</div><div class='del'>-     defined, PERMUTE otherwise.</div><div class='del'>-</div><div class='del'>-     REQUIRE_ORDER means don't recognize them as options; stop option</div><div class='del'>-     processing when the first non-option is seen. This is what Unix</div><div class='del'>-     does. This mode of operation is selected by either setting the</div><div class='del'>-     environment variable POSIXLY_CORRECT, or using `+' as the first</div><div class='del'>-     character of the list of option characters.</div><div class='del'>-</div><div class='del'>-     PERMUTE is the default. We permute the contents of ARGV as we</div><div class='del'>-     scan, so that eventually all the non-options are at the end. This</div><div class='del'>-     allows options to be given in any order, even with programs that</div><div class='del'>-     were not written to expect this.</div><div class='del'>-</div><div class='del'>-     RETURN_IN_ORDER is an option available to programs that were</div><div class='del'>-     written to expect options and other ARGV-elements in any order</div><div class='del'>-     and that care about the ordering of the two. We describe each</div><div class='del'>-     non-option ARGV-element as if it were the argument of an option</div><div class='del'>-     with character code 1. Using `-' as the first character of the</div><div class='del'>-     list of option characters selects this mode of operation.</div><div class='del'>-</div><div class='del'>-  */</div><div class='del'>-  enum { REQUIRE_ORDER, PERMUTE, RETURN_IN_ORDER } ordering;</div><div class='del'>-</div><div class='del'>-  /* A segment of non-option arguments that have been skipped for</div><div class='del'>-     later processing, after all options. `first_nonopt' is the index</div><div class='del'>-     in ARGV of the first of them; `last_nonopt' is the index after</div><div class='del'>-     the last of them.</div><div class='del'>-</div><div class='del'>-     If quoted or args_only is non-zero, this segment should be empty. */</div><div class='del'>-</div><div class='del'>-  /* FIXME: I'd prefer to use unsigned, but it's more consistent to</div><div class='del'>-     use the same type as for state.next. */</div><div class='del'>-  int first_nonopt;</div><div class='del'>-  int last_nonopt;</div><div class='del'>-  </div><div class='del'>-  /* String of all recognized short options. Needed for ARGP_LONG_ONLY. */</div><div class='del'>-  /* FIXME: Perhaps change to a pointer to a suitable bitmap instead? */</div><div class='del'>-  char *short_opts;</div><div class='del'>-</div><div class='del'>-  /* For parsing combined short options. */</div><div class='del'>-  char *nextchar;</div><div class='del'>-  </div><div class='del'>-  /* States of the various parsing groups.  */</div><div class='del'>-  struct group *groups;</div><div class='del'>-  /* The end of the GROUPS array.  */</div><div class='del'>-  struct group *egroup;</div><div class='del'>-  /* An vector containing storage for the CHILD_INPUTS field in all groups.  */</div><div class='del'>-  void **child_inputs;</div><div class='del'>-  </div><div class='del'>-  /* State block supplied to parsing routines.  */</div><div class='del'>-  struct argp_state state;</div><div class='del'>-</div><div class='del'>-  /* Memory used by this parser.  */</div><div class='del'>-  void *storage;</div><div class='del'>-};</div><div class='del'>-</div><div class='del'>-/* Search for a group defining a short option. */</div><div class='del'>-static const struct argp_option *</div><div class='del'>-find_short_option(struct parser *parser, int key, struct group **p)</div><div class='del'>-{</div><div class='del'>-  struct group *group;</div><div class='del'>-  </div><div class='del'>-  assert(key &gt;= 0);</div><div class='del'>-  assert(isascii(key));</div><div class='del'>-</div><div class='del'>-  for (group = parser-&gt;groups; group &lt; parser-&gt;egroup; group++)</div><div class='del'>-    {</div><div class='del'>-      const struct argp_option *opts;</div><div class='del'>-</div><div class='del'>-      for (opts = group-&gt;argp-&gt;options; !__option_is_end(opts); opts++)</div><div class='del'>-	if (opts-&gt;key == key)</div><div class='del'>-	  {</div><div class='del'>-	    *p = group;</div><div class='del'>-	    return opts;</div><div class='del'>-	  }</div><div class='del'>-    }</div><div class='del'>-  return NULL;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-enum match_result { MATCH_EXACT, MATCH_PARTIAL, MATCH_NO };</div><div class='del'>-</div><div class='del'>-/* If defined, allow complete.el-like abbreviations of long options. */</div><div class='del'>-#ifndef ARGP_COMPLETE</div><div class='del'>-#define ARGP_COMPLETE 0</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-/* Matches an encountern long-option argument ARG against an option NAME.</div><div class='del'>- * ARG is terminated by NUL or '='. */</div><div class='del'>-static enum match_result</div><div class='del'>-match_option(const char *arg, const char *name)</div><div class='del'>-{</div><div class='del'>-  unsigned i, j;</div><div class='del'>-  for (i = j = 0;; i++, j++)</div><div class='del'>-    {</div><div class='del'>-      switch(arg[i])</div><div class='del'>-	{</div><div class='del'>-	case '\0':</div><div class='del'>-	case '=':</div><div class='del'>-	  return name[j] ? MATCH_PARTIAL : MATCH_EXACT;</div><div class='del'>-#if ARGP_COMPLETE</div><div class='del'>-	case '-':</div><div class='del'>-	  while (name[j] != '-')</div><div class='del'>-	    if (!name[j++])</div><div class='del'>-	      return MATCH_NO;</div><div class='del'>-	  break;</div><div class='del'>-#endif</div><div class='del'>-	default:</div><div class='del'>-	  if (arg[i] != name[j])</div><div class='del'>-	    return MATCH_NO;</div><div class='del'>-	}</div><div class='del'>-    }</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-static const struct argp_option *</div><div class='del'>-find_long_option(struct parser *parser,</div><div class='del'>-		 const char *arg,</div><div class='del'>-		 struct group **p)</div><div class='del'>-{</div><div class='del'>-  struct group *group;</div><div class='del'>-</div><div class='del'>-  /* Partial match found so far. */</div><div class='del'>-  struct group *matched_group = NULL;</div><div class='del'>-  const struct argp_option *matched_option = NULL;</div><div class='del'>-</div><div class='del'>-  /* Number of partial matches. */</div><div class='del'>-  int num_partial = 0;</div><div class='del'>-</div><div class='del'>-  for (group = parser-&gt;groups; group &lt; parser-&gt;egroup; group++)</div><div class='del'>-    {</div><div class='del'>-      const struct argp_option *opts;</div><div class='del'>-</div><div class='del'>-      for (opts = group-&gt;argp-&gt;options; !__option_is_end(opts); opts++)</div><div class='del'>-	{</div><div class='del'>-	  if (!opts-&gt;name)</div><div class='del'>-	    continue;</div><div class='del'>-	  switch (match_option(arg, opts-&gt;name))</div><div class='del'>-	    {</div><div class='del'>-	    case MATCH_NO:</div><div class='del'>-	      break;</div><div class='del'>-	    case MATCH_PARTIAL:</div><div class='del'>-	      num_partial++;</div><div class='del'>-</div><div class='del'>-	      matched_group = group;</div><div class='del'>-	      matched_option = opts;</div><div class='del'>-</div><div class='del'>-	      break;</div><div class='del'>-	    case MATCH_EXACT:</div><div class='del'>-	      /* Exact match. */</div><div class='del'>-	      *p = group;</div><div class='del'>-	      return opts;</div><div class='del'>-	    }</div><div class='del'>-	}</div><div class='del'>-    }</div><div class='del'>-  if (num_partial == 1)</div><div class='del'>-    {</div><div class='del'>-      *p = matched_group;</div><div class='del'>-      return matched_option;</div><div class='del'>-    }</div><div class='del'>-</div><div class='del'>-  return NULL;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-/* The next usable entries in the various parser tables being filled in by</div><div class='del'>-   convert_options.  */</div><div class='del'>-struct parser_convert_state</div><div class='del'>-{</div><div class='del'>-  struct parser *parser;</div><div class='del'>-  char *short_end;</div><div class='del'>-  void **child_inputs_end;</div><div class='del'>-};</div><div class='del'>-</div><div class='del'>-/* Initialize GROUP from ARGP. If CVT-&gt;SHORT_END is non-NULL, short</div><div class='del'>-   options are recorded in the short options string. Returns the next</div><div class='del'>-   unused group entry. CVT holds state used during the conversion. */</div><div class='del'>-static struct group *</div><div class='del'>-convert_options (const struct argp *argp,</div><div class='del'>-		 struct group *parent, unsigned parent_index,</div><div class='del'>-		 struct group *group, struct parser_convert_state *cvt)</div><div class='del'>-{</div><div class='del'>-  const struct argp_option *opt = argp-&gt;options;</div><div class='del'>-  const struct argp_child *children = argp-&gt;children;</div><div class='del'>-</div><div class='del'>-  if (opt || argp-&gt;parser)</div><div class='del'>-    {</div><div class='del'>-      /* This parser needs a group. */</div><div class='del'>-      if (cvt-&gt;short_end)</div><div class='del'>-	{</div><div class='del'>-	  /* Record any short options. */</div><div class='del'>-	  for ( ; !__option_is_end (opt); opt++)</div><div class='del'>-	    if (__option_is_short(opt))</div><div class='del'>-	      *cvt-&gt;short_end++ = opt-&gt;key;</div><div class='del'>-	}</div><div class='del'>-      </div><div class='del'>-      group-&gt;parser = argp-&gt;parser;</div><div class='del'>-      group-&gt;argp = argp;</div><div class='del'>-      group-&gt;args_processed = 0;</div><div class='del'>-      group-&gt;parent = parent;</div><div class='del'>-      group-&gt;parent_index = parent_index;</div><div class='del'>-      group-&gt;input = 0;</div><div class='del'>-      group-&gt;hook = 0;</div><div class='del'>-      group-&gt;child_inputs = 0;</div><div class='del'>-      </div><div class='del'>-      if (children)</div><div class='del'>-	/* Assign GROUP's CHILD_INPUTS field some space from</div><div class='del'>-	   CVT-&gt;child_inputs_end.*/</div><div class='del'>-	{</div><div class='del'>-	  unsigned num_children = 0;</div><div class='del'>-	  while (children[num_children].argp)</div><div class='del'>-	    num_children++;</div><div class='del'>-	  group-&gt;child_inputs = cvt-&gt;child_inputs_end;</div><div class='del'>-	  cvt-&gt;child_inputs_end += num_children;</div><div class='del'>-	}</div><div class='del'>-      parent = group++;</div><div class='del'>-    }</div><div class='del'>-  else</div><div class='del'>-    parent = 0;</div><div class='del'>-</div><div class='del'>-  if (children)</div><div class='del'>-    {</div><div class='del'>-      unsigned index = 0;</div><div class='del'>-      while (children-&gt;argp)</div><div class='del'>-	group =</div><div class='del'>-	  convert_options (children++-&gt;argp, parent, index++, group, cvt);</div><div class='del'>-    }</div><div class='del'>-</div><div class='del'>-  return group;</div><div class='del'>-}</div><div class='del'>-/* Allocate and initialize the group structures, so that they are</div><div class='del'>-   ordered as if by traversing the corresponding argp parser tree in</div><div class='del'>-   pre-order. Also build the list of short options, if that is needed. */</div><div class='del'>-static void</div><div class='del'>-parser_convert (struct parser *parser, const struct argp *argp)</div><div class='del'>-{</div><div class='del'>-  struct parser_convert_state cvt;</div><div class='del'>-</div><div class='del'>-  cvt.parser = parser;</div><div class='del'>-  cvt.short_end = parser-&gt;short_opts;</div><div class='del'>-  cvt.child_inputs_end = parser-&gt;child_inputs;</div><div class='del'>-</div><div class='del'>-  parser-&gt;argp = argp;</div><div class='del'>-</div><div class='del'>-  if (argp)</div><div class='del'>-    parser-&gt;egroup = convert_options (argp, 0, 0, parser-&gt;groups, &amp;cvt);</div><div class='del'>-  else</div><div class='del'>-    parser-&gt;egroup = parser-&gt;groups; /* No parsers at all! */</div><div class='del'>-</div><div class='del'>-  if (parser-&gt;short_opts)</div><div class='del'>-    *cvt.short_end ='\0';</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-/* Lengths of various parser fields which we will allocated.  */</div><div class='del'>-struct parser_sizes</div><div class='del'>-{</div><div class='del'>-  /* Needed only ARGP_LONG_ONLY */</div><div class='del'>-  size_t short_len;		/* Number of short options.  */</div><div class='del'>-</div><div class='del'>-  size_t num_groups;		/* Group structures we allocate.  */</div><div class='del'>-  size_t num_child_inputs;	/* Child input slots.  */</div><div class='del'>-};</div><div class='del'>-</div><div class='del'>-/* For ARGP, increments the NUM_GROUPS field in SZS by the total</div><div class='del'>-   number of argp structures descended from it, and the SHORT_LEN by</div><div class='del'>-   the total number of short options. */</div><div class='del'>-static void</div><div class='del'>-calc_sizes (const struct argp *argp,  struct parser_sizes *szs)</div><div class='del'>-{</div><div class='del'>-  const struct argp_child *child = argp-&gt;children;</div><div class='del'>-  const struct argp_option *opt = argp-&gt;options;</div><div class='del'>-</div><div class='del'>-  if (opt || argp-&gt;parser)</div><div class='del'>-    {</div><div class='del'>-      /* This parser needs a group. */</div><div class='del'>-      szs-&gt;num_groups++;</div><div class='del'>-      if (opt)</div><div class='del'>-	{</div><div class='del'>-	  while (__option_is_short (opt++))</div><div class='del'>-	    szs-&gt;short_len++;</div><div class='del'>-	}</div><div class='del'>-    }</div><div class='del'>-</div><div class='del'>-  if (child)</div><div class='del'>-    while (child-&gt;argp)</div><div class='del'>-      {</div><div class='del'>-	calc_sizes ((child++)-&gt;argp, szs);</div><div class='del'>-	szs-&gt;num_child_inputs++;</div><div class='del'>-      }</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-/* Initializes PARSER to parse ARGP in a manner described by FLAGS.  */</div><div class='del'>-static error_t</div><div class='del'>-parser_init (struct parser *parser, const struct argp *argp,</div><div class='del'>-	     int argc, char **argv, int flags, void *input)</div><div class='del'>-{</div><div class='del'>-  error_t err = 0;</div><div class='del'>-  struct group *group;</div><div class='del'>-  struct parser_sizes szs;</div><div class='del'>-</div><div class='del'>-  parser-&gt;posixly_correct = getenv ("POSIXLY_CORRECT");</div><div class='del'>-</div><div class='del'>-  if (flags &amp; ARGP_IN_ORDER)</div><div class='del'>-    parser-&gt;ordering = RETURN_IN_ORDER;</div><div class='del'>-  else if (flags &amp; ARGP_NO_ARGS)</div><div class='del'>-    parser-&gt;ordering = REQUIRE_ORDER;</div><div class='del'>-  else if (parser-&gt;posixly_correct)</div><div class='del'>-    parser-&gt;ordering = REQUIRE_ORDER;</div><div class='del'>-  else</div><div class='del'>-    parser-&gt;ordering = PERMUTE;</div><div class='del'>-  </div><div class='del'>-  szs.short_len = 0;</div><div class='del'>-  szs.num_groups = 0;</div><div class='del'>-  szs.num_child_inputs = 0;</div><div class='del'>-</div><div class='del'>-  if (argp)</div><div class='del'>-    calc_sizes (argp, &amp;szs);</div><div class='del'>-</div><div class='del'>-  if (!(flags &amp; ARGP_LONG_ONLY))</div><div class='del'>-    /* We have no use for the short option array. */</div><div class='del'>-    szs.short_len = 0;</div><div class='del'>-  </div><div class='del'>-  /* Lengths of the various bits of storage used by PARSER.  */</div><div class='del'>-#define GLEN (szs.num_groups + 1) * sizeof (struct group)</div><div class='del'>-#define CLEN (szs.num_child_inputs * sizeof (void *))</div><div class='del'>-#define SLEN (szs.short_len + 1)</div><div class='del'>-#define STORAGE(offset) ((void *) (((char *) parser-&gt;storage) + (offset)))</div><div class='del'>-</div><div class='del'>-  parser-&gt;storage = malloc (GLEN + CLEN + SLEN);</div><div class='del'>-  if (! parser-&gt;storage)</div><div class='del'>-    return ENOMEM;</div><div class='del'>-</div><div class='del'>-  parser-&gt;groups = parser-&gt;storage;</div><div class='del'>-</div><div class='del'>-  parser-&gt;child_inputs = STORAGE(GLEN);</div><div class='del'>-  memset (parser-&gt;child_inputs, 0, szs.num_child_inputs * sizeof (void *));</div><div class='del'>-</div><div class='del'>-  if (flags &amp; ARGP_LONG_ONLY)</div><div class='del'>-    parser-&gt;short_opts = STORAGE(GLEN + CLEN);</div><div class='del'>-  else</div><div class='del'>-    parser-&gt;short_opts = NULL;</div><div class='del'>-</div><div class='del'>-  parser_convert (parser, argp);</div><div class='del'>-</div><div class='del'>-  memset (&amp;parser-&gt;state, 0, sizeof (struct argp_state));</div><div class='del'>-  </div><div class='del'>-  parser-&gt;state.root_argp = parser-&gt;argp;</div><div class='del'>-  parser-&gt;state.argc = argc;</div><div class='del'>-  parser-&gt;state.argv = argv;</div><div class='del'>-  parser-&gt;state.flags = flags;</div><div class='del'>-  parser-&gt;state.err_stream = stderr;</div><div class='del'>-  parser-&gt;state.out_stream = stdout;</div><div class='del'>-  parser-&gt;state.pstate = parser;</div><div class='del'>-</div><div class='del'>-  parser-&gt;args_only = 0;</div><div class='del'>-  parser-&gt;nextchar = NULL;</div><div class='del'>-  parser-&gt;first_nonopt = parser-&gt;last_nonopt = 0;</div><div class='del'>-    </div><div class='del'>-  /* Call each parser for the first time, giving it a chance to propagate</div><div class='del'>-     values to child parsers.  */</div><div class='del'>-  if (parser-&gt;groups &lt; parser-&gt;egroup)</div><div class='del'>-    parser-&gt;groups-&gt;input = input;</div><div class='del'>-  for (group = parser-&gt;groups;</div><div class='del'>-       group &lt; parser-&gt;egroup &amp;&amp; (!err || err == EBADKEY);</div><div class='del'>-       group++)</div><div class='del'>-    {</div><div class='del'>-      if (group-&gt;parent)</div><div class='del'>-	/* If a child parser, get the initial input value from the parent. */</div><div class='del'>-	group-&gt;input = group-&gt;parent-&gt;child_inputs[group-&gt;parent_index];</div><div class='del'>-</div><div class='del'>-      if (!group-&gt;parser</div><div class='del'>-	  &amp;&amp; group-&gt;argp-&gt;children &amp;&amp; group-&gt;argp-&gt;children-&gt;argp)</div><div class='del'>-	/* For the special case where no parsing function is supplied for an</div><div class='del'>-	   argp, propagate its input to its first child, if any (this just</div><div class='del'>-	   makes very simple wrapper argps more convenient).  */</div><div class='del'>-	group-&gt;child_inputs[0] = group-&gt;input;</div><div class='del'>-</div><div class='del'>-      err = group_parse (group, &amp;parser-&gt;state, ARGP_KEY_INIT, 0);</div><div class='del'>-    }</div><div class='del'>-  if (err == EBADKEY)</div><div class='del'>-    err = 0;			/* Some parser didn't understand.  */</div><div class='del'>-</div><div class='del'>-  if (err)</div><div class='del'>-    return err;</div><div class='del'>-</div><div class='del'>-  if (argv[0] &amp;&amp; !(parser-&gt;state.flags &amp; ARGP_PARSE_ARGV0))</div><div class='del'>-    /* There's an argv[0]; use it for messages.  */</div><div class='del'>-    {</div><div class='del'>-      parser-&gt;state.name = __argp_basename(argv[0]);</div><div class='del'>-</div><div class='del'>-      /* Don't parse it as an argument. */</div><div class='del'>-      parser-&gt;state.next = 1;</div><div class='del'>-    }</div><div class='del'>-  else</div><div class='del'>-    parser-&gt;state.name = __argp_short_program_name(NULL);</div><div class='del'>-  </div><div class='del'>-  return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-/* Free any storage consumed by PARSER (but not PARSER itself).  */</div><div class='del'>-static error_t</div><div class='del'>-parser_finalize (struct parser *parser,</div><div class='del'>-		 error_t err, int arg_ebadkey, int *end_index)</div><div class='del'>-{</div><div class='del'>-  struct group *group;</div><div class='del'>-</div><div class='del'>-  if (err == EBADKEY &amp;&amp; arg_ebadkey)</div><div class='del'>-    /* Suppress errors generated by unparsed arguments.  */</div><div class='del'>-    err = 0;</div><div class='del'>-</div><div class='del'>-  if (! err)</div><div class='del'>-    {</div><div class='del'>-      if (parser-&gt;state.next == parser-&gt;state.argc)</div><div class='del'>-	/* We successfully parsed all arguments!  Call all the parsers again,</div><div class='del'>-	   just a few more times... */</div><div class='del'>-	{</div><div class='del'>-	  for (group = parser-&gt;groups;</div><div class='del'>-	       group &lt; parser-&gt;egroup &amp;&amp; (!err || err==EBADKEY);</div><div class='del'>-	       group++)</div><div class='del'>-	    if (group-&gt;args_processed == 0)</div><div class='del'>-	      err = group_parse (group, &amp;parser-&gt;state, ARGP_KEY_NO_ARGS, 0);</div><div class='del'>-	  for (group = parser-&gt;egroup - 1;</div><div class='del'>-	       group &gt;= parser-&gt;groups &amp;&amp; (!err || err==EBADKEY);</div><div class='del'>-	       group--)</div><div class='del'>-	    err = group_parse (group, &amp;parser-&gt;state, ARGP_KEY_END, 0);</div><div class='del'>-</div><div class='del'>-	  if (err == EBADKEY)</div><div class='del'>-	    err = 0;		/* Some parser didn't understand.  */</div><div class='del'>-</div><div class='del'>-	  /* Tell the user that all arguments are parsed.  */</div><div class='del'>-	  if (end_index)</div><div class='del'>-	    *end_index = parser-&gt;state.next;</div><div class='del'>-	}</div><div class='del'>-      else if (end_index)</div><div class='del'>-	/* Return any remaining arguments to the user.  */</div><div class='del'>-	*end_index = parser-&gt;state.next;</div><div class='del'>-      else</div><div class='del'>-	/* No way to return the remaining arguments, they must be bogus. */</div><div class='del'>-	{</div><div class='del'>-	  if (!(parser-&gt;state.flags &amp; ARGP_NO_ERRS)</div><div class='del'>-	      &amp;&amp; parser-&gt;state.err_stream)</div><div class='del'>-	    fprintf (parser-&gt;state.err_stream,</div><div class='del'>-		     dgettext (parser-&gt;argp-&gt;argp_domain,</div><div class='del'>-			       "%s: Too many arguments\n"),</div><div class='del'>-		     parser-&gt;state.name);</div><div class='del'>-	  err = EBADKEY;</div><div class='del'>-	}</div><div class='del'>-    }</div><div class='del'>-</div><div class='del'>-  /* Okay, we're all done, with either an error or success; call the parsers</div><div class='del'>-     to indicate which one.  */</div><div class='del'>-</div><div class='del'>-  if (err)</div><div class='del'>-    {</div><div class='del'>-      /* Maybe print an error message.  */</div><div class='del'>-      if (err == EBADKEY)</div><div class='del'>-	/* An appropriate message describing what the error was should have</div><div class='del'>-	   been printed earlier.  */</div><div class='del'>-	__argp_state_help (&amp;parser-&gt;state, parser-&gt;state.err_stream,</div><div class='del'>-			   ARGP_HELP_STD_ERR);</div><div class='del'>-</div><div class='del'>-      /* Since we didn't exit, give each parser an error indication.  */</div><div class='del'>-      for (group = parser-&gt;groups; group &lt; parser-&gt;egroup; group++)</div><div class='del'>-	group_parse (group, &amp;parser-&gt;state, ARGP_KEY_ERROR, 0);</div><div class='del'>-    }</div><div class='del'>-  else</div><div class='del'>-    /* Notify parsers of success, and propagate back values from parsers.  */</div><div class='del'>-    {</div><div class='del'>-      /* We pass over the groups in reverse order so that child groups are</div><div class='del'>-	 given a chance to do there processing before passing back a value to</div><div class='del'>-	 the parent.  */</div><div class='del'>-      for (group = parser-&gt;egroup - 1</div><div class='del'>-	   ; group &gt;= parser-&gt;groups &amp;&amp; (!err || err == EBADKEY)</div><div class='del'>-	   ; group--)</div><div class='del'>-	err = group_parse (group, &amp;parser-&gt;state, ARGP_KEY_SUCCESS, 0);</div><div class='del'>-      if (err == EBADKEY)</div><div class='del'>-	err = 0;		/* Some parser didn't understand.  */</div><div class='del'>-    }</div><div class='del'>-</div><div class='del'>-  /* Call parsers once more, to do any final cleanup.  Errors are ignored.  */</div><div class='del'>-  for (group = parser-&gt;egroup - 1; group &gt;= parser-&gt;groups; group--)</div><div class='del'>-    group_parse (group, &amp;parser-&gt;state, ARGP_KEY_FINI, 0);</div><div class='del'>-</div><div class='del'>-  if (err == EBADKEY)</div><div class='del'>-    err = EINVAL;</div><div class='del'>-</div><div class='del'>-  free (parser-&gt;storage);</div><div class='del'>-</div><div class='del'>-  return err;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-/* Call the user parsers to parse the non-option argument VAL, at the</div><div class='del'>-   current position, returning any error. The state NEXT pointer</div><div class='del'>-   should point to the argument; this function will adjust it</div><div class='del'>-   correctly to reflect however many args actually end up being</div><div class='del'>-   consumed. */</div><div class='del'>-static error_t</div><div class='del'>-parser_parse_arg (struct parser *parser, char *val)</div><div class='del'>-{</div><div class='del'>-  /* Save the starting value of NEXT */</div><div class='del'>-  int index = parser-&gt;state.next;</div><div class='del'>-  error_t err = EBADKEY;</div><div class='del'>-  struct group *group;</div><div class='del'>-  int key = 0;			/* Which of ARGP_KEY_ARG[S] we used.  */</div><div class='del'>-</div><div class='del'>-  /* Try to parse the argument in each parser.  */</div><div class='del'>-  for (group = parser-&gt;groups</div><div class='del'>-       ; group &lt; parser-&gt;egroup &amp;&amp; err == EBADKEY</div><div class='del'>-       ; group++)</div><div class='del'>-    {</div><div class='del'>-      parser-&gt;state.next++;	/* For ARGP_KEY_ARG, consume the arg.  */</div><div class='del'>-      key = ARGP_KEY_ARG;</div><div class='del'>-      err = group_parse (group, &amp;parser-&gt;state, key, val);</div><div class='del'>-</div><div class='del'>-      if (err == EBADKEY)</div><div class='del'>-	/* This parser doesn't like ARGP_KEY_ARG; try ARGP_KEY_ARGS instead. */</div><div class='del'>-	{</div><div class='del'>-	  parser-&gt;state.next--;	/* For ARGP_KEY_ARGS, put back the arg.  */</div><div class='del'>-	  key = ARGP_KEY_ARGS;</div><div class='del'>-	  err = group_parse (group, &amp;parser-&gt;state, key, 0);</div><div class='del'>-	}</div><div class='del'>-    }</div><div class='del'>-</div><div class='del'>-  if (! err)</div><div class='del'>-    {</div><div class='del'>-      if (key == ARGP_KEY_ARGS)</div><div class='del'>-	/* The default for ARGP_KEY_ARGS is to assume that if NEXT isn't</div><div class='del'>-	   changed by the user, *all* arguments should be considered</div><div class='del'>-	   consumed.  */</div><div class='del'>-	parser-&gt;state.next = parser-&gt;state.argc;</div><div class='del'>-</div><div class='del'>-      if (parser-&gt;state.next &gt; index)</div><div class='del'>-	/* Remember that we successfully processed a non-option</div><div class='del'>-	   argument -- but only if the user hasn't gotten tricky and set</div><div class='del'>-	   the clock back.  */</div><div class='del'>-	(--group)-&gt;args_processed += (parser-&gt;state.next - index);</div><div class='del'>-      else</div><div class='del'>-	/* The user wants to reparse some args, so try looking for options again.  */</div><div class='del'>-	parser-&gt;args_only = 0;</div><div class='del'>-    }</div><div class='del'>-</div><div class='del'>-  return err;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-/* Exchange two adjacent subsequences of ARGV.</div><div class='del'>-   One subsequence is elements [first_nonopt,last_nonopt)</div><div class='del'>-   which contains all the non-options that have been skipped so far.</div><div class='del'>-   The other is elements [last_nonopt,next), which contains all</div><div class='del'>-   the options processed since those non-options were skipped.</div><div class='del'>-</div><div class='del'>-   `first_nonopt' and `last_nonopt' are relocated so that they describe</div><div class='del'>-   the new indices of the non-options in ARGV after they are moved.  */</div><div class='del'>-</div><div class='del'>-static void</div><div class='del'>-exchange (struct parser *parser)</div><div class='del'>-{</div><div class='del'>-  int bottom = parser-&gt;first_nonopt;</div><div class='del'>-  int middle = parser-&gt;last_nonopt;</div><div class='del'>-  int top = parser-&gt;state.next;</div><div class='del'>-  char **argv = parser-&gt;state.argv;</div><div class='del'>-  </div><div class='del'>-  char *tem;</div><div class='del'>-</div><div class='del'>-  /* Exchange the shorter segment with the far end of the longer segment.</div><div class='del'>-     That puts the shorter segment into the right place.</div><div class='del'>-     It leaves the longer segment in the right place overall,</div><div class='del'>-     but it consists of two parts that need to be swapped next.  */</div><div class='del'>-</div><div class='del'>-  while (top &gt; middle &amp;&amp; middle &gt; bottom)</div><div class='del'>-    {</div><div class='del'>-      if (top - middle &gt; middle - bottom)</div><div class='del'>-	{</div><div class='del'>-	  /* Bottom segment is the short one.  */</div><div class='del'>-	  int len = middle - bottom;</div><div class='del'>-	  register int i;</div><div class='del'>-</div><div class='del'>-	  /* Swap it with the top part of the top segment.  */</div><div class='del'>-	  for (i = 0; i &lt; len; i++)</div><div class='del'>-	    {</div><div class='del'>-	      tem = argv[bottom + i];</div><div class='del'>-	      argv[bottom + i] = argv[top - (middle - bottom) + i];</div><div class='del'>-	      argv[top - (middle - bottom) + i] = tem;</div><div class='del'>-	    }</div><div class='del'>-	  /* Exclude the moved bottom segment from further swapping.  */</div><div class='del'>-	  top -= len;</div><div class='del'>-	}</div><div class='del'>-      else</div><div class='del'>-	{</div><div class='del'>-	  /* Top segment is the short one.  */</div><div class='del'>-	  int len = top - middle;</div><div class='del'>-	  register int i;</div><div class='del'>-</div><div class='del'>-	  /* Swap it with the bottom part of the bottom segment.  */</div><div class='del'>-	  for (i = 0; i &lt; len; i++)</div><div class='del'>-	    {</div><div class='del'>-	      tem = argv[bottom + i];</div><div class='del'>-	      argv[bottom + i] = argv[middle + i];</div><div class='del'>-	      argv[middle + i] = tem;</div><div class='del'>-	    }</div><div class='del'>-	  /* Exclude the moved top segment from further swapping.  */</div><div class='del'>-	  bottom += len;</div><div class='del'>-	}</div><div class='del'>-    }</div><div class='del'>-</div><div class='del'>-  /* Update records for the slots the non-options now occupy.  */</div><div class='del'>-</div><div class='del'>-  parser-&gt;first_nonopt += (parser-&gt;state.next - parser-&gt;last_nonopt);</div><div class='del'>-  parser-&gt;last_nonopt = parser-&gt;state.next;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-enum arg_type { ARG_ARG, ARG_SHORT_OPTION,</div><div class='del'>-		ARG_LONG_OPTION, ARG_LONG_ONLY_OPTION,</div><div class='del'>-		ARG_QUOTE };</div><div class='del'>-</div><div class='del'>-static enum arg_type</div><div class='del'>-classify_arg(struct parser *parser, char *arg, char **opt)</div><div class='del'>-{</div><div class='del'>-  if (arg[0] == '-')</div><div class='del'>-    /* Looks like an option... */</div><div class='del'>-    switch (arg[1])</div><div class='del'>-      {</div><div class='del'>-      case '\0':</div><div class='del'>-	/* "-" is not an option. */</div><div class='del'>-	return ARG_ARG;</div><div class='del'>-      case '-':</div><div class='del'>-	/* Long option, or quote. */</div><div class='del'>-	if (!arg[2])</div><div class='del'>-	  return ARG_QUOTE;</div><div class='del'>-	  </div><div class='del'>-	/* A long option. */</div><div class='del'>-	if (opt)</div><div class='del'>-	  *opt = arg + 2;</div><div class='del'>-	return ARG_LONG_OPTION;</div><div class='del'>-</div><div class='del'>-      default:</div><div class='del'>-	/* Short option. But if ARGP_LONG_ONLY, it can also be a long option. */</div><div class='del'>-</div><div class='del'>-	if (opt)</div><div class='del'>-	  *opt = arg + 1;</div><div class='del'>-</div><div class='del'>-	if (parser-&gt;state.flags &amp; ARGP_LONG_ONLY)</div><div class='del'>-	  {</div><div class='del'>-	    /* Rules from getopt.c:</div><div class='del'>-</div><div class='del'>-	       If long_only and the ARGV-element has the form "-f",</div><div class='del'>-	       where f is a valid short option, don't consider it an</div><div class='del'>-	       abbreviated form of a long option that starts with f.</div><div class='del'>-	       Otherwise there would be no way to give the -f short</div><div class='del'>-	       option.</div><div class='del'>-</div><div class='del'>-	       On the other hand, if there's a long option "fubar" and</div><div class='del'>-	       the ARGV-element is "-fu", do consider that an</div><div class='del'>-	       abbreviation of the long option, just like "--fu", and</div><div class='del'>-	       not "-f" with arg "u".</div><div class='del'>-</div><div class='del'>-	       This distinction seems to be the most useful approach. */</div><div class='del'>-</div><div class='del'>-	    assert(parser-&gt;short_opts);</div><div class='del'>-	    </div><div class='del'>-	    if (arg[2] || !strchr(parser-&gt;short_opts, arg[1]))</div><div class='del'>-	      return ARG_LONG_ONLY_OPTION;</div><div class='del'>-	  }</div><div class='del'>-</div><div class='del'>-	return ARG_SHORT_OPTION;</div><div class='del'>-      }</div><div class='del'>-  </div><div class='del'>-  else</div><div class='del'>-    return ARG_ARG;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-/* Parse the next argument in PARSER (as indicated by PARSER-&gt;state.next).</div><div class='del'>-   Any error from the parsers is returned, and *ARGP_EBADKEY indicates</div><div class='del'>-   whether a value of EBADKEY is due to an unrecognized argument (which is</div><div class='del'>-   generally not fatal).  */</div><div class='del'>-static error_t</div><div class='del'>-parser_parse_next (struct parser *parser, int *arg_ebadkey)</div><div class='del'>-{</div><div class='del'>-  if (parser-&gt;state.quoted &amp;&amp; parser-&gt;state.next &lt; parser-&gt;state.quoted)</div><div class='del'>-    /* The next argument pointer has been moved to before the quoted</div><div class='del'>-       region, so pretend we never saw the quoting `--', and start</div><div class='del'>-       looking for options again. If the `--' is still there we'll just</div><div class='del'>-       process it one more time. */</div><div class='del'>-    parser-&gt;state.quoted = parser-&gt;args_only = 0;</div><div class='del'>-</div><div class='del'>-  /* Give FIRST_NONOPT &amp; LAST_NONOPT rational values if NEXT has been</div><div class='del'>-     moved back by the user (who may also have changed the arguments).  */</div><div class='del'>-  if (parser-&gt;last_nonopt &gt; parser-&gt;state.next)</div><div class='del'>-    parser-&gt;last_nonopt = parser-&gt;state.next;</div><div class='del'>-  if (parser-&gt;first_nonopt &gt; parser-&gt;state.next)</div><div class='del'>-    parser-&gt;first_nonopt = parser-&gt;state.next;</div><div class='del'>-</div><div class='del'>-  if (parser-&gt;nextchar)</div><div class='del'>-    /* Deal with short options. */</div><div class='del'>-    {</div><div class='del'>-      struct group *group;</div><div class='del'>-      char c;</div><div class='del'>-      const struct argp_option *option;</div><div class='del'>-      char *value = NULL;;</div><div class='del'>-</div><div class='del'>-      assert(!parser-&gt;args_only);</div><div class='del'>-</div><div class='del'>-      c = *parser-&gt;nextchar++;</div><div class='del'>-      </div><div class='del'>-      option = find_short_option(parser, c, &amp;group);</div><div class='del'>-      if (!option)</div><div class='del'>-	{</div><div class='del'>-	  if (parser-&gt;posixly_correct)</div><div class='del'>-	    /* 1003.2 specifies the format of this message.  */</div><div class='del'>-	    fprintf (parser-&gt;state.err_stream,</div><div class='del'>-		     dgettext(parser-&gt;state.root_argp-&gt;argp_domain,</div><div class='del'>-			      "%s: illegal option -- %c\n"),</div><div class='del'>-		     parser-&gt;state.name, c);</div><div class='del'>-	  else</div><div class='del'>-	    fprintf (parser-&gt;state.err_stream,</div><div class='del'>-		     dgettext(parser-&gt;state.root_argp-&gt;argp_domain,</div><div class='del'>-			      "%s: invalid option -- %c\n"),</div><div class='del'>-		     parser-&gt;state.name, c);</div><div class='del'>-</div><div class='del'>-	  *arg_ebadkey = 0;</div><div class='del'>-	  return EBADKEY;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-      if (!*parser-&gt;nextchar)</div><div class='del'>-	parser-&gt;nextchar = NULL;</div><div class='del'>-</div><div class='del'>-      if (option-&gt;arg)</div><div class='del'>-	{</div><div class='del'>-	  value = parser-&gt;nextchar;</div><div class='del'>-	  parser-&gt;nextchar = NULL;</div><div class='del'>-	      </div><div class='del'>-	  if (!value</div><div class='del'>-	      &amp;&amp; !(option-&gt;flags &amp; OPTION_ARG_OPTIONAL))</div><div class='del'>-	    /* We need an mandatory argument. */</div><div class='del'>-	    {</div><div class='del'>-	      if (parser-&gt;state.next == parser-&gt;state.argc)</div><div class='del'>-		/* Missing argument */</div><div class='del'>-		{</div><div class='del'>-		  /* 1003.2 specifies the format of this message.  */</div><div class='del'>-		  fprintf (parser-&gt;state.err_stream,</div><div class='del'>-			   dgettext(parser-&gt;state.root_argp-&gt;argp_domain,</div><div class='del'>-				    "%s: option requires an argument -- %c\n"),</div><div class='del'>-			   parser-&gt;state.name, c);</div><div class='del'>-</div><div class='del'>-		  *arg_ebadkey = 0;</div><div class='del'>-		  return EBADKEY;</div><div class='del'>-		}</div><div class='del'>-	      value = parser-&gt;state.argv[parser-&gt;state.next++];</div><div class='del'>-	    }</div><div class='del'>-	}</div><div class='del'>-      return group_parse(group, &amp;parser-&gt;state,</div><div class='del'>-			 option-&gt;key, value);</div><div class='del'>-    }</div><div class='del'>-  else</div><div class='del'>-    /* Advance to the next ARGV-element.  */</div><div class='del'>-    {</div><div class='del'>-      if (parser-&gt;args_only)</div><div class='del'>-	{</div><div class='del'>-	  *arg_ebadkey = 1;</div><div class='del'>-	  if (parser-&gt;state.next &gt;= parser-&gt;state.argc)</div><div class='del'>-	    /* We're done. */</div><div class='del'>-	    return EBADKEY;</div><div class='del'>-	  else</div><div class='del'>-	    return parser_parse_arg(parser,</div><div class='del'>-				    parser-&gt;state.argv[parser-&gt;state.next]);</div><div class='del'>-	}</div><div class='del'>-      </div><div class='del'>-      if (parser-&gt;state.next &gt;= parser-&gt;state.argc)</div><div class='del'>-	/* Almost done. If there are non-options that we skipped</div><div class='del'>-	   previously, we should process them now. */</div><div class='del'>-	{</div><div class='del'>-	  *arg_ebadkey = 1;</div><div class='del'>-	  if (parser-&gt;first_nonopt != parser-&gt;last_nonopt)</div><div class='del'>-	    {</div><div class='del'>-	      exchange(parser);</div><div class='del'>-	      </div><div class='del'>-	      /* Start processing the arguments we skipped previously. */</div><div class='del'>-	      parser-&gt;state.next = parser-&gt;first_nonopt;</div><div class='del'>-	      </div><div class='del'>-	      parser-&gt;first_nonopt = parser-&gt;last_nonopt = 0;</div><div class='del'>-</div><div class='del'>-	      parser-&gt;args_only = 1;</div><div class='del'>-	      return 0;</div><div class='del'>-	    }</div><div class='del'>-	  else</div><div class='del'>-	    /* Indicate that we're really done. */</div><div class='del'>-	    return EBADKEY;</div><div class='del'>-	}</div><div class='del'>-      else</div><div class='del'>-	/* Look for options. */</div><div class='del'>-	{</div><div class='del'>-	  char *arg = parser-&gt;state.argv[parser-&gt;state.next];</div><div class='del'>-</div><div class='del'>-	  char *optstart;</div><div class='del'>-	  enum arg_type token = classify_arg(parser, arg, &amp;optstart);</div><div class='del'>-	  </div><div class='del'>-	  switch (token)</div><div class='del'>-	    {</div><div class='del'>-	    case ARG_ARG:</div><div class='del'>-	      switch (parser-&gt;ordering)</div><div class='del'>-		{</div><div class='del'>-		case PERMUTE:</div><div class='del'>-		  if (parser-&gt;first_nonopt == parser-&gt;last_nonopt)</div><div class='del'>-		    /* Skipped sequence is empty; start a new one. */</div><div class='del'>-		    parser-&gt;first_nonopt = parser-&gt;last_nonopt = parser-&gt;state.next;</div><div class='del'>-</div><div class='del'>-		  else if (parser-&gt;last_nonopt != parser-&gt;state.next)</div><div class='del'>-		    /* We have a non-empty skipped sequence, and</div><div class='del'>-		       we're not at the end-point, so move it. */</div><div class='del'>-		    exchange(parser);</div><div class='del'>-</div><div class='del'>-		  assert(parser-&gt;last_nonopt == parser-&gt;state.next);</div><div class='del'>-		  </div><div class='del'>-		  /* Skip this argument for now. */</div><div class='del'>-		  parser-&gt;state.next++;</div><div class='del'>-		  parser-&gt;last_nonopt = parser-&gt;state.next; </div><div class='del'>-		  </div><div class='del'>-		  return 0;</div><div class='del'>-</div><div class='del'>-		case REQUIRE_ORDER:</div><div class='del'>-		  /* Implicit quote before the first argument. */</div><div class='del'>-		   parser-&gt;args_only = 1;</div><div class='del'>-		   return 0;</div><div class='del'>-		   </div><div class='del'>-		case RETURN_IN_ORDER:</div><div class='del'>-		  *arg_ebadkey = 1;</div><div class='del'>-		  return parser_parse_arg(parser, arg);</div><div class='del'>-</div><div class='del'>-		default:</div><div class='del'>-		  abort();</div><div class='del'>-		}</div><div class='del'>-	    case ARG_QUOTE:</div><div class='del'>-	      /* Skip it, then exchange with any previous non-options. */</div><div class='del'>-	      parser-&gt;state.next++;</div><div class='del'>-	      assert (parser-&gt;last_nonopt != parser-&gt;state.next);</div><div class='del'>-</div><div class='del'>-	      if (parser-&gt;first_nonopt != parser-&gt;last_nonopt)</div><div class='del'>-		{</div><div class='del'>-		  exchange(parser);</div><div class='del'>-		  </div><div class='del'>-		  /* Start processing the skipped and the quoted</div><div class='del'>-		     arguments. */</div><div class='del'>-</div><div class='del'>-		  parser-&gt;state.quoted = parser-&gt;state.next = parser-&gt;first_nonopt;</div><div class='del'>-</div><div class='del'>-		  /* Also empty the skipped-list, to avoid confusion</div><div class='del'>-		     if the user resets the next pointer. */</div><div class='del'>-		  parser-&gt;first_nonopt = parser-&gt;last_nonopt = 0;</div><div class='del'>-		}</div><div class='del'>-	      else</div><div class='del'>-		parser-&gt;state.quoted = parser-&gt;state.next;</div><div class='del'>-</div><div class='del'>-	      parser-&gt;args_only = 1;	      </div><div class='del'>-	      return 0;</div><div class='del'>-</div><div class='del'>-	    case ARG_LONG_ONLY_OPTION:</div><div class='del'>-	    case ARG_LONG_OPTION:</div><div class='del'>-	      {</div><div class='del'>-		struct group *group;</div><div class='del'>-		const struct argp_option *option;</div><div class='del'>-		char *value;</div><div class='del'>-</div><div class='del'>-		parser-&gt;state.next++;</div><div class='del'>-		option = find_long_option(parser, optstart, &amp;group);</div><div class='del'>-		</div><div class='del'>-		if (!option)</div><div class='del'>-		  {</div><div class='del'>-		    /* NOTE: This includes any "=something" in the output. */</div><div class='del'>-		    fprintf (parser-&gt;state.err_stream,</div><div class='del'>-			     dgettext(parser-&gt;state.root_argp-&gt;argp_domain,</div><div class='del'>-				      "%s: unrecognized option `%s'\n"),</div><div class='del'>-			     parser-&gt;state.name, arg);</div><div class='del'>-		    *arg_ebadkey = 0;</div><div class='del'>-		    return EBADKEY;</div><div class='del'>-		  }</div><div class='del'>-</div><div class='del'>-		value = strchr(optstart, '=');</div><div class='del'>-		if (value)</div><div class='del'>-		  value++;</div><div class='del'>-		</div><div class='del'>-		if (value &amp;&amp; !option-&gt;arg)</div><div class='del'>-		  /* Unexpected argument. */</div><div class='del'>-		  {</div><div class='del'>-		    if (token == ARG_LONG_OPTION)</div><div class='del'>-		      /* --option */</div><div class='del'>-		      fprintf (parser-&gt;state.err_stream,</div><div class='del'>-			       dgettext(parser-&gt;state.root_argp-&gt;argp_domain,</div><div class='del'>-					"%s: option `--%s' doesn't allow an argument\n"),</div><div class='del'>-			       parser-&gt;state.name, option-&gt;name);</div><div class='del'>-		    else</div><div class='del'>-		      /* +option or -option */</div><div class='del'>-		      fprintf (parser-&gt;state.err_stream,</div><div class='del'>-			       dgettext(parser-&gt;state.root_argp-&gt;argp_domain,</div><div class='del'>-					"%s: option `%c%s' doesn't allow an argument\n"),</div><div class='del'>-			       parser-&gt;state.name, arg[0], option-&gt;name);</div><div class='del'>-</div><div class='del'>-		    *arg_ebadkey = 0;</div><div class='del'>-		    return EBADKEY;</div><div class='del'>-		  }</div><div class='del'>-		</div><div class='del'>-		if (option-&gt;arg &amp;&amp; !value</div><div class='del'>-		    &amp;&amp; !(option-&gt;flags &amp; OPTION_ARG_OPTIONAL))</div><div class='del'>-		  /* We need an mandatory argument. */</div><div class='del'>-		  {</div><div class='del'>-		    if (parser-&gt;state.next == parser-&gt;state.argc)</div><div class='del'>-		      /* Missing argument */</div><div class='del'>-		      {</div><div class='del'>-			if (token == ARG_LONG_OPTION)</div><div class='del'>-			  /* --option */</div><div class='del'>-			  fprintf (parser-&gt;state.err_stream,</div><div class='del'>-				   dgettext(parser-&gt;state.root_argp-&gt;argp_domain,</div><div class='del'>-					    "%s: option `--%s' requires an argument\n"),</div><div class='del'>-				 parser-&gt;state.name, option-&gt;name);</div><div class='del'>-			else</div><div class='del'>-			  /* +option or -option */</div><div class='del'>-			  fprintf (parser-&gt;state.err_stream,</div><div class='del'>-				   dgettext(parser-&gt;state.root_argp-&gt;argp_domain,</div><div class='del'>-					    "%s: option `%c%s' requires an argument\n"),</div><div class='del'>-				   parser-&gt;state.name, arg[0], option-&gt;name);</div><div class='del'>-</div><div class='del'>-			*arg_ebadkey = 0;</div><div class='del'>-			return EBADKEY;</div><div class='del'>-		      }</div><div class='del'>-</div><div class='del'>-		    value = parser-&gt;state.argv[parser-&gt;state.next++];</div><div class='del'>-		  }</div><div class='del'>-		*arg_ebadkey = 0;</div><div class='del'>-		return group_parse(group, &amp;parser-&gt;state,</div><div class='del'>-				   option-&gt;key, value);</div><div class='del'>-	      }</div><div class='del'>-	    case ARG_SHORT_OPTION:</div><div class='del'>-	      parser-&gt;state.next++;</div><div class='del'>-	      parser-&gt;nextchar = optstart;</div><div class='del'>-	      return 0;</div><div class='del'>-</div><div class='del'>-	    default:</div><div class='del'>-	      abort();</div><div class='del'>-	    }</div><div class='del'>-	}</div><div class='del'>-    }</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-/* Parse the options strings in ARGC &amp; ARGV according to the argp in ARGP.</div><div class='del'>-   FLAGS is one of the ARGP_ flags above.  If END_INDEX is non-NULL, the</div><div class='del'>-   index in ARGV of the first unparsed option is returned in it.  If an</div><div class='del'>-   unknown option is present, EINVAL is returned; if some parser routine</div><div class='del'>-   returned a non-zero value, it is returned; otherwise 0 is returned.  */</div><div class='del'>-error_t</div><div class='del'>-__argp_parse (const struct argp *argp, int argc, char **argv, unsigned flags,</div><div class='del'>-	      int *end_index, void *input)</div><div class='del'>-{</div><div class='del'>-  error_t err;</div><div class='del'>-  struct parser parser;</div><div class='del'>-</div><div class='del'>-  /* If true, then err == EBADKEY is a result of a non-option argument failing</div><div class='del'>-     to be parsed (which in some cases isn't actually an error).  */</div><div class='del'>-  int arg_ebadkey = 0;</div><div class='del'>-</div><div class='del'>-  if (! (flags &amp; ARGP_NO_HELP))</div><div class='del'>-    /* Add our own options.  */</div><div class='del'>-    {</div><div class='del'>-      struct argp_child *child = alloca (4 * sizeof (struct argp_child));</div><div class='del'>-      struct argp *top_argp = alloca (sizeof (struct argp));</div><div class='del'>-</div><div class='del'>-      /* TOP_ARGP has no options, it just serves to group the user &amp; default</div><div class='del'>-	 argps.  */</div><div class='del'>-      memset (top_argp, 0, sizeof (*top_argp));</div><div class='del'>-      top_argp-&gt;children = child;</div><div class='del'>-</div><div class='del'>-      memset (child, 0, 4 * sizeof (struct argp_child));</div><div class='del'>-</div><div class='del'>-      if (argp)</div><div class='del'>-	(child++)-&gt;argp = argp;</div><div class='del'>-      (child++)-&gt;argp = &amp;argp_default_argp;</div><div class='del'>-      if (argp_program_version || argp_program_version_hook)</div><div class='del'>-	(child++)-&gt;argp = &amp;argp_version_argp;</div><div class='del'>-      child-&gt;argp = 0;</div><div class='del'>-</div><div class='del'>-      argp = top_argp;</div><div class='del'>-    }</div><div class='del'>-</div><div class='del'>-  /* Construct a parser for these arguments.  */</div><div class='del'>-  err = parser_init (&amp;parser, argp, argc, argv, flags, input);</div><div class='del'>-</div><div class='del'>-  if (! err)</div><div class='del'>-    /* Parse! */</div><div class='del'>-    {</div><div class='del'>-      while (! err)</div><div class='del'>-	err = parser_parse_next (&amp;parser, &amp;arg_ebadkey);</div><div class='del'>-      err = parser_finalize (&amp;parser, err, arg_ebadkey, end_index);</div><div class='del'>-    }</div><div class='del'>-</div><div class='del'>-  return err;</div><div class='del'>-}</div><div class='del'>-#ifdef weak_alias</div><div class='del'>-weak_alias (__argp_parse, argp_parse)</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-/* Return the input field for ARGP in the parser corresponding to STATE; used</div><div class='del'>-   by the help routines.  */</div><div class='del'>-void *</div><div class='del'>-__argp_input (const struct argp *argp, const struct argp_state *state)</div><div class='del'>-{</div><div class='del'>-  if (state)</div><div class='del'>-    {</div><div class='del'>-      struct group *group;</div><div class='del'>-      struct parser *parser = state-&gt;pstate;</div><div class='del'>-</div><div class='del'>-      for (group = parser-&gt;groups; group &lt; parser-&gt;egroup; group++)</div><div class='del'>-	if (group-&gt;argp == argp)</div><div class='del'>-	  return group-&gt;input;</div><div class='del'>-    }</div><div class='del'>-</div><div class='del'>-  return 0;</div><div class='del'>-}</div><div class='del'>-#ifdef weak_alias</div><div class='del'>-weak_alias (__argp_input, _argp_input)</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-/* Defined here, in case a user is not inlining the definitions in</div><div class='del'>- * argp.h */</div><div class='del'>-void</div><div class='del'>-__argp_usage (__const struct argp_state *__state)</div><div class='del'>-{</div><div class='del'>-  __argp_state_help (__state, stderr, ARGP_HELP_STD_USAGE);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-__option_is_short (__const struct argp_option *__opt)</div><div class='del'>-{</div><div class='del'>-  if (__opt-&gt;flags &amp; OPTION_DOC)</div><div class='del'>-    return 0;</div><div class='del'>-  else</div><div class='del'>-    {</div><div class='del'>-      int __key = __opt-&gt;key;</div><div class='del'>-      /* FIXME: whether or not a particular key implies a short option</div><div class='del'>-       * ought not to be locale dependent. */</div><div class='del'>-      return __key &gt; 0 &amp;&amp; isprint (__key);</div><div class='del'>-    }</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-__option_is_end (__const struct argp_option *__opt)</div><div class='del'>-{</div><div class='del'>-  return !__opt-&gt;key &amp;&amp; !__opt-&gt;name &amp;&amp; !__opt-&gt;doc &amp;&amp; !__opt-&gt;group;</div><div class='del'>-}</div><div class='head'>diff --git a/argp-standalone/argp-pv.c b/argp-standalone/argp-pv.c<br/>deleted file mode 100644<br/>index d7d374a66bd..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/argp-standalone/argp-pv.c?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>argp-standalone/argp-pv.c</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,25 +0,0 @@</div><div class='del'>-/* Default definition for ARGP_PROGRAM_VERSION.</div><div class='del'>-   Copyright (C) 1996, 1997, 1999, 2004 Free Software Foundation, Inc.</div><div class='del'>-   This file is part of the GNU C Library.</div><div class='del'>-   Written by Miles Bader &lt;miles@gnu.ai.mit.edu&gt;.</div><div class='del'>-</div><div class='del'>-   The GNU C Library is free software; you can redistribute it and/or</div><div class='del'>-   modify it under the terms of the GNU Library General Public License as</div><div class='del'>-   published by the Free Software Foundation; either version 2 of the</div><div class='del'>-   License, or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-   The GNU C Library is distributed in the hope that it will be useful,</div><div class='del'>-   but WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-   Library General Public License for more details.</div><div class='del'>-</div><div class='del'>-   You should have received a copy of the GNU Library General Public</div><div class='del'>-   License along with the GNU C Library; see the file COPYING.LIB.  If not,</div><div class='del'>-   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,</div><div class='del'>-   Boston, MA 02111-1307, USA.  */</div><div class='del'>-</div><div class='del'>-/* If set by the user program to a non-zero value, then a default option</div><div class='del'>-   --version is added (unless the ARGP_NO_HELP flag is used), which will</div><div class='del'>-   print this this string followed by a newline and exit (unless the</div><div class='del'>-   ARGP_NO_EXIT flag is used).  Overridden by ARGP_PROGRAM_VERSION_HOOK.  */</div><div class='del'>-const char *argp_program_version = 0;</div><div class='head'>diff --git a/argp-standalone/argp-pvh.c b/argp-standalone/argp-pvh.c<br/>deleted file mode 100644<br/>index 829a1cda80d..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/argp-standalone/argp-pvh.c?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>argp-standalone/argp-pvh.c</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,32 +0,0 @@</div><div class='del'>-/* Default definition for ARGP_PROGRAM_VERSION_HOOK.</div><div class='del'>-   Copyright (C) 1996, 1997, 1999, 2004 Free Software Foundation, Inc.</div><div class='del'>-   This file is part of the GNU C Library.</div><div class='del'>-   Written by Miles Bader &lt;miles@gnu.ai.mit.edu&gt;.</div><div class='del'>-</div><div class='del'>-   The GNU C Library is free software; you can redistribute it and/or</div><div class='del'>-   modify it under the terms of the GNU Library General Public License as</div><div class='del'>-   published by the Free Software Foundation; either version 2 of the</div><div class='del'>-   License, or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-   The GNU C Library is distributed in the hope that it will be useful,</div><div class='del'>-   but WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-   Library General Public License for more details.</div><div class='del'>-</div><div class='del'>-   You should have received a copy of the GNU Library General Public</div><div class='del'>-   License along with the GNU C Library; see the file COPYING.LIB.  If not,</div><div class='del'>-   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,</div><div class='del'>-   Boston, MA 02111-1307, USA.  */</div><div class='del'>-</div><div class='del'>-#ifdef HAVE_CONFIG_H</div><div class='del'>-#include &lt;config.h&gt;</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-#include "argp.h"</div><div class='del'>-</div><div class='del'>-/* If set by the user program to a non-zero value, then a default option</div><div class='del'>-   --version is added (unless the ARGP_NO_HELP flag is used), which calls</div><div class='del'>-   this function with a stream to print the version to and a pointer to the</div><div class='del'>-   current parsing state, and then exits (unless the ARGP_NO_EXIT flag is</div><div class='del'>-   used).  This variable takes precedent over ARGP_PROGRAM_VERSION.  */</div><div class='del'>-void (*argp_program_version_hook) (FILE *stream, struct argp_state *state) = 0;</div><div class='head'>diff --git a/argp-standalone/argp.h b/argp-standalone/argp.h<br/>deleted file mode 100644<br/>index 29d3dfe9720..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/argp-standalone/argp.h?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>argp-standalone/argp.h</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,602 +0,0 @@</div><div class='del'>-/* Hierarchial argument parsing.</div><div class='del'>-   Copyright (C) 1995, 96, 97, 98, 99, 2003 Free Software Foundation, Inc.</div><div class='del'>-   This file is part of the GNU C Library.</div><div class='del'>-   Written by Miles Bader &lt;miles@gnu.ai.mit.edu&gt;.</div><div class='del'>-</div><div class='del'>-   The GNU C Library is free software; you can redistribute it and/or</div><div class='del'>-   modify it under the terms of the GNU Library General Public License as</div><div class='del'>-   published by the Free Software Foundation; either version 2 of the</div><div class='del'>-   License, or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-   The GNU C Library is distributed in the hope that it will be useful,</div><div class='del'>-   but WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-   Library General Public License for more details.</div><div class='del'>-</div><div class='del'>-   You should have received a copy of the GNU Library General Public</div><div class='del'>-   License along with the GNU C Library; see the file COPYING.LIB.  If not,</div><div class='del'>-   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,</div><div class='del'>-   Boston, MA 02111-1307, USA.  */</div><div class='del'>-</div><div class='del'>-#ifndef _ARGP_H</div><div class='del'>-#define _ARGP_H</div><div class='del'>-</div><div class='del'>-#include &lt;stdio.h&gt;</div><div class='del'>-#include &lt;ctype.h&gt;</div><div class='del'>-</div><div class='del'>-#define __need_error_t</div><div class='del'>-#include &lt;errno.h&gt;</div><div class='del'>-</div><div class='del'>-#ifndef __THROW</div><div class='del'>-# define __THROW</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-#ifndef __const</div><div class='del'>-# define __const const</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-#ifndef __error_t_defined</div><div class='del'>-typedef int error_t;</div><div class='del'>-# define __error_t_defined</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-/* FIXME: What's the right way to check for __restrict? Sun's cc seems</div><div class='del'>-   not to have it. Perhaps it's easiest to just delete the use of</div><div class='del'>-   __restrict from the prototypes. */</div><div class='del'>-#ifndef __restrict</div><div class='del'>-# ifndef __GNUC___</div><div class='del'>-#  define __restrict</div><div class='del'>-# endif</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-/* NOTE: We can't use the autoconf tests, since this is supposed to be</div><div class='del'>-   an installed header file and argp's config.h is of course not</div><div class='del'>-   installed. */</div><div class='del'>-#ifndef PRINTF_STYLE</div><div class='del'>-# if __GNUC__ &gt;= 2</div><div class='del'>-#  define PRINTF_STYLE(f, a) __attribute__ ((__format__ (__printf__, f, a)))</div><div class='del'>-# else</div><div class='del'>-#  define PRINTF_STYLE(f, a)</div><div class='del'>-# endif</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-#ifdef  __cplusplus</div><div class='del'>-extern "C" {</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-/* A description of a particular option.  A pointer to an array of</div><div class='del'>-   these is passed in the OPTIONS field of an argp structure.  Each option</div><div class='del'>-   entry can correspond to one long option and/or one short option; more</div><div class='del'>-   names for the same option can be added by following an entry in an option</div><div class='del'>-   array with options having the OPTION_ALIAS flag set.  */</div><div class='del'>-struct argp_option</div><div class='del'>-{</div><div class='del'>-  /* The long option name.  For more than one name for the same option, you</div><div class='del'>-     can use following options with the OPTION_ALIAS flag set.  */</div><div class='del'>-  __const char *name;</div><div class='del'>-</div><div class='del'>-  /* What key is returned for this option.  If &gt; 0 and printable, then it's</div><div class='del'>-     also accepted as a short option.  */</div><div class='del'>-  int key;</div><div class='del'>-</div><div class='del'>-  /* If non-NULL, this is the name of the argument associated with this</div><div class='del'>-     option, which is required unless the OPTION_ARG_OPTIONAL flag is set. */</div><div class='del'>-  __const char *arg;</div><div class='del'>-</div><div class='del'>-  /* OPTION_ flags.  */</div><div class='del'>-  int flags;</div><div class='del'>-</div><div class='del'>-  /* The doc string for this option.  If both NAME and KEY are 0, This string</div><div class='del'>-     will be printed outdented from the normal option column, making it</div><div class='del'>-     useful as a group header (it will be the first thing printed in its</div><div class='del'>-     group); in this usage, it's conventional to end the string with a `:'.  */</div><div class='del'>-  __const char *doc;</div><div class='del'>-</div><div class='del'>-  /* The group this option is in.  In a long help message, options are sorted</div><div class='del'>-     alphabetically within each group, and the groups presented in the order</div><div class='del'>-     0, 1, 2, ..., n, -m, ..., -2, -1.  Every entry in an options array with</div><div class='del'>-     if this field 0 will inherit the group number of the previous entry, or</div><div class='del'>-     zero if it's the first one, unless its a group header (NAME and KEY both</div><div class='del'>-     0), in which case, the previous entry + 1 is the default.  Automagic</div><div class='del'>-     options such as --help are put into group -1.  */</div><div class='del'>-  int group;</div><div class='del'>-};</div><div class='del'>-</div><div class='del'>-/* The argument associated with this option is optional.  */</div><div class='del'>-#define OPTION_ARG_OPTIONAL	0x1</div><div class='del'>-</div><div class='del'>-/* This option isn't displayed in any help messages.  */</div><div class='del'>-#define OPTION_HIDDEN	       	0x2</div><div class='del'>-</div><div class='del'>-/* This option is an alias for the closest previous non-alias option.  This</div><div class='del'>-   means that it will be displayed in the same help entry, and will inherit</div><div class='del'>-   fields other than NAME and KEY from the aliased option.  */</div><div class='del'>-#define OPTION_ALIAS		0x4</div><div class='del'>-</div><div class='del'>-/* This option isn't actually an option (and so should be ignored by the</div><div class='del'>-   actual option parser), but rather an arbitrary piece of documentation that</div><div class='del'>-   should be displayed in much the same manner as the options.  If this flag</div><div class='del'>-   is set, then the option NAME field is displayed unmodified (e.g., no `--'</div><div class='del'>-   prefix is added) at the left-margin (where a *short* option would normally</div><div class='del'>-   be displayed), and the documentation string in the normal place.  For</div><div class='del'>-   purposes of sorting, any leading whitespace and puncuation is ignored,</div><div class='del'>-   except that if the first non-whitespace character is not `-', this entry</div><div class='del'>-   is displayed after all options (and OPTION_DOC entries with a leading `-')</div><div class='del'>-   in the same group.  */</div><div class='del'>-#define OPTION_DOC		0x8</div><div class='del'>-</div><div class='del'>-/* This option shouldn't be included in `long' usage messages (but is still</div><div class='del'>-   included in help messages).  This is mainly intended for options that are</div><div class='del'>-   completely documented in an argp's ARGS_DOC field, in which case including</div><div class='del'>-   the option in the generic usage list would be redundant.  For instance,</div><div class='del'>-   if ARGS_DOC is "FOO BAR\n-x BLAH", and the `-x' option's purpose is to</div><div class='del'>-   distinguish these two cases, -x should probably be marked</div><div class='del'>-   OPTION_NO_USAGE.  */</div><div class='del'>-#define OPTION_NO_USAGE		0x10</div><div class='del'>-</div><div class='del'>-struct argp;			/* fwd declare this type */</div><div class='del'>-struct argp_state;		/* " */</div><div class='del'>-struct argp_child;		/* " */</div><div class='del'>-</div><div class='del'>-/* The type of a pointer to an argp parsing function.  */</div><div class='del'>-typedef error_t (*argp_parser_t) (int key, char *arg,</div><div class='del'>-				  struct argp_state *state);</div><div class='del'>-</div><div class='del'>-/* What to return for unrecognized keys.  For special ARGP_KEY_ keys, such</div><div class='del'>-   returns will simply be ignored.  For user keys, this error will be turned</div><div class='del'>-   into EINVAL (if the call to argp_parse is such that errors are propagated</div><div class='del'>-   back to the user instead of exiting); returning EINVAL itself would result</div><div class='del'>-   in an immediate stop to parsing in *all* cases.  */</div><div class='del'>-#define ARGP_ERR_UNKNOWN	E2BIG /* Hurd should never need E2BIG.  XXX */</div><div class='del'>-</div><div class='del'>-/* Special values for the KEY argument to an argument parsing function.</div><div class='del'>-   ARGP_ERR_UNKNOWN should be returned if they aren't understood.</div><div class='del'>-</div><div class='del'>-   The sequence of keys to a parsing function is either (where each</div><div class='del'>-   uppercased word should be prefixed by `ARGP_KEY_' and opt is a user key):</div><div class='del'>-</div><div class='del'>-       INIT opt... NO_ARGS END SUCCESS  -- No non-option arguments at all</div><div class='del'>-   or  INIT (opt | ARG)... END SUCCESS  -- All non-option args parsed</div><div class='del'>-   or  INIT (opt | ARG)... SUCCESS      -- Some non-option arg unrecognized</div><div class='del'>-</div><div class='del'>-   The third case is where every parser returned ARGP_KEY_UNKNOWN for an</div><div class='del'>-   argument, in which case parsing stops at that argument (returning the</div><div class='del'>-   unparsed arguments to the caller of argp_parse if requested, or stopping</div><div class='del'>-   with an error message if not).</div><div class='del'>-</div><div class='del'>-   If an error occurs (either detected by argp, or because the parsing</div><div class='del'>-   function returned an error value), then the parser is called with</div><div class='del'>-   ARGP_KEY_ERROR, and no further calls are made.  */</div><div class='del'>-</div><div class='del'>-/* This is not an option at all, but rather a command line argument.  If a</div><div class='del'>-   parser receiving this key returns success, the fact is recorded, and the</div><div class='del'>-   ARGP_KEY_NO_ARGS case won't be used.  HOWEVER, if while processing the</div><div class='del'>-   argument, a parser function decrements the NEXT field of the state it's</div><div class='del'>-   passed, the option won't be considered processed; this is to allow you to</div><div class='del'>-   actually modify the argument (perhaps into an option), and have it</div><div class='del'>-   processed again.  */</div><div class='del'>-#define ARGP_KEY_ARG		0</div><div class='del'>-/* There are remaining arguments not parsed by any parser, which may be found</div><div class='del'>-   starting at (STATE-&gt;argv + STATE-&gt;next).  If success is returned, but</div><div class='del'>-   STATE-&gt;next left untouched, it's assumed that all arguments were consume,</div><div class='del'>-   otherwise, the parser should adjust STATE-&gt;next to reflect any arguments</div><div class='del'>-   consumed.  */</div><div class='del'>-#define ARGP_KEY_ARGS		0x1000006</div><div class='del'>-/* There are no more command line arguments at all.  */</div><div class='del'>-#define ARGP_KEY_END		0x1000001</div><div class='del'>-/* Because it's common to want to do some special processing if there aren't</div><div class='del'>-   any non-option args, user parsers are called with this key if they didn't</div><div class='del'>-   successfully process any non-option arguments.  Called just before</div><div class='del'>-   ARGP_KEY_END (where more general validity checks on previously parsed</div><div class='del'>-   arguments can take place).  */</div><div class='del'>-#define ARGP_KEY_NO_ARGS	0x1000002</div><div class='del'>-/* Passed in before any parsing is done.  Afterwards, the values of each</div><div class='del'>-   element of the CHILD_INPUT field, if any, in the state structure is</div><div class='del'>-   copied to each child's state to be the initial value of the INPUT field.  */</div><div class='del'>-#define ARGP_KEY_INIT		0x1000003</div><div class='del'>-/* Use after all other keys, including SUCCESS &amp; END.  */</div><div class='del'>-#define ARGP_KEY_FINI		0x1000007</div><div class='del'>-/* Passed in when parsing has successfully been completed (even if there are</div><div class='del'>-   still arguments remaining).  */</div><div class='del'>-#define ARGP_KEY_SUCCESS	0x1000004</div><div class='del'>-/* Passed in if an error occurs.  */</div><div class='del'>-#define ARGP_KEY_ERROR		0x1000005</div><div class='del'>-</div><div class='del'>-/* An argp structure contains a set of options declarations, a function to</div><div class='del'>-   deal with parsing one, documentation string, a possible vector of child</div><div class='del'>-   argp's, and perhaps a function to filter help output.  When actually</div><div class='del'>-   parsing options, getopt is called with the union of all the argp</div><div class='del'>-   structures chained together through their CHILD pointers, with conflicts</div><div class='del'>-   being resolved in favor of the first occurrence in the chain.  */</div><div class='del'>-struct argp</div><div class='del'>-{</div><div class='del'>-  /* An array of argp_option structures, terminated by an entry with both</div><div class='del'>-     NAME and KEY having a value of 0.  */</div><div class='del'>-  __const struct argp_option *options;</div><div class='del'>-</div><div class='del'>-  /* What to do with an option from this structure.  KEY is the key</div><div class='del'>-     associated with the option, and ARG is any associated argument (NULL if</div><div class='del'>-     none was supplied).  If KEY isn't understood, ARGP_ERR_UNKNOWN should be</div><div class='del'>-     returned.  If a non-zero, non-ARGP_ERR_UNKNOWN value is returned, then</div><div class='del'>-     parsing is stopped immediately, and that value is returned from</div><div class='del'>-     argp_parse().  For special (non-user-supplied) values of KEY, see the</div><div class='del'>-     ARGP_KEY_ definitions below.  */</div><div class='del'>-  argp_parser_t parser;</div><div class='del'>-</div><div class='del'>-  /* A string describing what other arguments are wanted by this program.  It</div><div class='del'>-     is only used by argp_usage to print the `Usage:' message.  If it</div><div class='del'>-     contains newlines, the strings separated by them are considered</div><div class='del'>-     alternative usage patterns, and printed on separate lines (lines after</div><div class='del'>-     the first are prefix by `  or: ' instead of `Usage:').  */</div><div class='del'>-  __const char *args_doc;</div><div class='del'>-</div><div class='del'>-  /* If non-NULL, a string containing extra text to be printed before and</div><div class='del'>-     after the options in a long help message (separated by a vertical tab</div><div class='del'>-     `\v' character).  */</div><div class='del'>-  __const char *doc;</div><div class='del'>-</div><div class='del'>-  /* A vector of argp_children structures, terminated by a member with a 0</div><div class='del'>-     argp field, pointing to child argps should be parsed with this one.  Any</div><div class='del'>-     conflicts are resolved in favor of this argp, or early argps in the</div><div class='del'>-     CHILDREN list.  This field is useful if you use libraries that supply</div><div class='del'>-     their own argp structure, which you want to use in conjunction with your</div><div class='del'>-     own.  */</div><div class='del'>-  __const struct argp_child *children;</div><div class='del'>-</div><div class='del'>-  /* If non-zero, this should be a function to filter the output of help</div><div class='del'>-     messages.  KEY is either a key from an option, in which case TEXT is</div><div class='del'>-     that option's help text, or a special key from the ARGP_KEY_HELP_</div><div class='del'>-     defines, below, describing which other help text TEXT is.  The function</div><div class='del'>-     should return either TEXT, if it should be used as-is, a replacement</div><div class='del'>-     string, which should be malloced, and will be freed by argp, or NULL,</div><div class='del'>-     meaning `print nothing'.  The value for TEXT is *after* any translation</div><div class='del'>-     has been done, so if any of the replacement text also needs translation,</div><div class='del'>-     that should be done by the filter function.  INPUT is either the input</div><div class='del'>-     supplied to argp_parse, or NULL, if argp_help was called directly.  */</div><div class='del'>-  char *(*help_filter) (int __key, __const char *__text, void *__input);</div><div class='del'>-</div><div class='del'>-  /* If non-zero the strings used in the argp library are translated using</div><div class='del'>-     the domain described by this string.  Otherwise the currently installed</div><div class='del'>-     default domain is used.  */</div><div class='del'>-  const char *argp_domain;</div><div class='del'>-};</div><div class='del'>-</div><div class='del'>-/* Possible KEY arguments to a help filter function.  */</div><div class='del'>-#define ARGP_KEY_HELP_PRE_DOC	0x2000001 /* Help text preceeding options. */</div><div class='del'>-#define ARGP_KEY_HELP_POST_DOC	0x2000002 /* Help text following options. */</div><div class='del'>-#define ARGP_KEY_HELP_HEADER	0x2000003 /* Option header string. */</div><div class='del'>-#define ARGP_KEY_HELP_EXTRA	0x2000004 /* After all other documentation;</div><div class='del'>-					     TEXT is NULL for this key.  */</div><div class='del'>-/* Explanatory note emitted when duplicate option arguments have been</div><div class='del'>-   suppressed.  */</div><div class='del'>-#define ARGP_KEY_HELP_DUP_ARGS_NOTE 0x2000005</div><div class='del'>-#define ARGP_KEY_HELP_ARGS_DOC	0x2000006 /* Argument doc string.  */</div><div class='del'>-</div><div class='del'>-/* When an argp has a non-zero CHILDREN field, it should point to a vector of</div><div class='del'>-   argp_child structures, each of which describes a subsidiary argp.  */</div><div class='del'>-struct argp_child</div><div class='del'>-{</div><div class='del'>-  /* The child parser.  */</div><div class='del'>-  __const struct argp *argp;</div><div class='del'>-</div><div class='del'>-  /* Flags for this child.  */</div><div class='del'>-  int flags;</div><div class='del'>-</div><div class='del'>-  /* If non-zero, an optional header to be printed in help output before the</div><div class='del'>-     child options.  As a side-effect, a non-zero value forces the child</div><div class='del'>-     options to be grouped together; to achieve this effect without actually</div><div class='del'>-     printing a header string, use a value of "".  */</div><div class='del'>-  __const char *header;</div><div class='del'>-</div><div class='del'>-  /* Where to group the child options relative to the other (`consolidated')</div><div class='del'>-     options in the parent argp; the values are the same as the GROUP field</div><div class='del'>-     in argp_option structs, but all child-groupings follow parent options at</div><div class='del'>-     a particular group level.  If both this field and HEADER are zero, then</div><div class='del'>-     they aren't grouped at all, but rather merged with the parent options</div><div class='del'>-     (merging the child's grouping levels with the parents).  */</div><div class='del'>-  int group;</div><div class='del'>-};</div><div class='del'>-</div><div class='del'>-/* Parsing state.  This is provided to parsing functions called by argp,</div><div class='del'>-   which may examine and, as noted, modify fields.  */</div><div class='del'>-struct argp_state</div><div class='del'>-{</div><div class='del'>-  /* The top level ARGP being parsed.  */</div><div class='del'>-  __const struct argp *root_argp;</div><div class='del'>-</div><div class='del'>-  /* The argument vector being parsed.  May be modified.  */</div><div class='del'>-  int argc;</div><div class='del'>-  char **argv;</div><div class='del'>-</div><div class='del'>-  /* The index in ARGV of the next arg that to be parsed.  May be modified. */</div><div class='del'>-  int next;</div><div class='del'>-</div><div class='del'>-  /* The flags supplied to argp_parse.  May be modified.  */</div><div class='del'>-  unsigned flags;</div><div class='del'>-</div><div class='del'>-  /* While calling a parsing function with a key of ARGP_KEY_ARG, this is the</div><div class='del'>-     number of the current arg, starting at zero, and incremented after each</div><div class='del'>-     such call returns.  At all other times, this is the number of such</div><div class='del'>-     arguments that have been processed.  */</div><div class='del'>-  unsigned arg_num;</div><div class='del'>-</div><div class='del'>-  /* If non-zero, the index in ARGV of the first argument following a special</div><div class='del'>-     `--' argument (which prevents anything following being interpreted as an</div><div class='del'>-     option).  Only set once argument parsing has proceeded past this point. */</div><div class='del'>-  int quoted;</div><div class='del'>-</div><div class='del'>-  /* An arbitrary pointer passed in from the user.  */</div><div class='del'>-  void *input;</div><div class='del'>-  /* Values to pass to child parsers.  This vector will be the same length as</div><div class='del'>-     the number of children for the current parser.  */</div><div class='del'>-  void **child_inputs;</div><div class='del'>-</div><div class='del'>-  /* For the parser's use.  Initialized to 0.  */</div><div class='del'>-  void *hook;</div><div class='del'>-</div><div class='del'>-  /* The name used when printing messages.  This is initialized to ARGV[0],</div><div class='del'>-     or PROGRAM_INVOCATION_NAME if that is unavailable.  */</div><div class='del'>-  char *name;</div><div class='del'>-</div><div class='del'>-  /* Streams used when argp prints something.  */</div><div class='del'>-  FILE *err_stream;		/* For errors; initialized to stderr. */</div><div class='del'>-  FILE *out_stream;		/* For information; initialized to stdout. */</div><div class='del'>-</div><div class='del'>-  void *pstate;			/* Private, for use by argp.  */</div><div class='del'>-};</div><div class='del'>-</div><div class='del'>-/* Flags for argp_parse (note that the defaults are those that are</div><div class='del'>-   convenient for program command line parsing): */</div><div class='del'>-</div><div class='del'>-/* Don't ignore the first element of ARGV.  Normally (and always unless</div><div class='del'>-   ARGP_NO_ERRS is set) the first element of the argument vector is</div><div class='del'>-   skipped for option parsing purposes, as it corresponds to the program name</div><div class='del'>-   in a command line.  */</div><div class='del'>-#define ARGP_PARSE_ARGV0  0x01</div><div class='del'>-</div><div class='del'>-/* Don't print error messages for unknown options to stderr; unless this flag</div><div class='del'>-   is set, ARGP_PARSE_ARGV0 is ignored, as ARGV[0] is used as the program</div><div class='del'>-   name in the error messages.  This flag implies ARGP_NO_EXIT (on the</div><div class='del'>-   assumption that silent exiting upon errors is bad behaviour).  */</div><div class='del'>-#define ARGP_NO_ERRS	0x02</div><div class='del'>-</div><div class='del'>-/* Don't parse any non-option args.  Normally non-option args are parsed by</div><div class='del'>-   calling the parse functions with a key of ARGP_KEY_ARG, and the actual arg</div><div class='del'>-   as the value.  Since it's impossible to know which parse function wants to</div><div class='del'>-   handle it, each one is called in turn, until one returns 0 or an error</div><div class='del'>-   other than ARGP_ERR_UNKNOWN; if an argument is handled by no one, the</div><div class='del'>-   argp_parse returns prematurely (but with a return value of 0).  If all</div><div class='del'>-   args have been parsed without error, all parsing functions are called one</div><div class='del'>-   last time with a key of ARGP_KEY_END.  This flag needn't normally be set,</div><div class='del'>-   as the normal behavior is to stop parsing as soon as some argument can't</div><div class='del'>-   be handled.  */</div><div class='del'>-#define ARGP_NO_ARGS	0x04</div><div class='del'>-</div><div class='del'>-/* Parse options and arguments in the same order they occur on the command</div><div class='del'>-   line -- normally they're rearranged so that all options come first. */</div><div class='del'>-#define ARGP_IN_ORDER	0x08</div><div class='del'>-</div><div class='del'>-/* Don't provide the standard long option --help, which causes usage and</div><div class='del'>-      option help information to be output to stdout, and exit (0) called. */</div><div class='del'>-#define ARGP_NO_HELP	0x10</div><div class='del'>-</div><div class='del'>-/* Don't exit on errors (they may still result in error messages).  */</div><div class='del'>-#define ARGP_NO_EXIT	0x20</div><div class='del'>-</div><div class='del'>-/* Use the gnu getopt `long-only' rules for parsing arguments.  */</div><div class='del'>-#define ARGP_LONG_ONLY	0x40</div><div class='del'>-</div><div class='del'>-/* Turns off any message-printing/exiting options.  */</div><div class='del'>-#define ARGP_SILENT    (ARGP_NO_EXIT | ARGP_NO_ERRS | ARGP_NO_HELP)</div><div class='del'>-</div><div class='del'>-/* Parse the options strings in ARGC &amp; ARGV according to the options in ARGP.</div><div class='del'>-   FLAGS is one of the ARGP_ flags above.  If ARG_INDEX is non-NULL, the</div><div class='del'>-   index in ARGV of the first unparsed option is returned in it.  If an</div><div class='del'>-   unknown option is present, ARGP_ERR_UNKNOWN is returned; if some parser</div><div class='del'>-   routine returned a non-zero value, it is returned; otherwise 0 is</div><div class='del'>-   returned.  This function may also call exit unless the ARGP_NO_HELP flag</div><div class='del'>-   is set.  INPUT is a pointer to a value to be passed in to the parser.  */</div><div class='del'>-extern error_t argp_parse (__const struct argp *__restrict argp,</div><div class='del'>-			   int argc, char **__restrict argv,</div><div class='del'>-			   unsigned flags, int *__restrict arg_index,</div><div class='del'>-			   void *__restrict input) __THROW;</div><div class='del'>-extern error_t __argp_parse (__const struct argp *__restrict argp,</div><div class='del'>-			     int argc, char **__restrict argv,</div><div class='del'>-			     unsigned flags, int *__restrict arg_index,</div><div class='del'>-			     void *__restrict input) __THROW;</div><div class='del'>-</div><div class='del'>-/* Global variables.  */</div><div class='del'>-</div><div class='del'>-/* If defined or set by the user program to a non-zero value, then a default</div><div class='del'>-   option --version is added (unless the ARGP_NO_HELP flag is used), which</div><div class='del'>-   will print this string followed by a newline and exit (unless the</div><div class='del'>-   ARGP_NO_EXIT flag is used).  Overridden by ARGP_PROGRAM_VERSION_HOOK.  */</div><div class='del'>-extern __const char *argp_program_version;</div><div class='del'>-</div><div class='del'>-/* If defined or set by the user program to a non-zero value, then a default</div><div class='del'>-   option --version is added (unless the ARGP_NO_HELP flag is used), which</div><div class='del'>-   calls this function with a stream to print the version to and a pointer to</div><div class='del'>-   the current parsing state, and then exits (unless the ARGP_NO_EXIT flag is</div><div class='del'>-   used).  This variable takes precedent over ARGP_PROGRAM_VERSION.  */</div><div class='del'>-extern void (*argp_program_version_hook) (FILE *__restrict __stream,</div><div class='del'>-					  struct argp_state *__restrict</div><div class='del'>-					  __state);</div><div class='del'>-</div><div class='del'>-/* If defined or set by the user program, it should point to string that is</div><div class='del'>-   the bug-reporting address for the program.  It will be printed by</div><div class='del'>-   argp_help if the ARGP_HELP_BUG_ADDR flag is set (as it is by various</div><div class='del'>-   standard help messages), embedded in a sentence that says something like</div><div class='del'>-   `Report bugs to ADDR.'.  */</div><div class='del'>-extern __const char *argp_program_bug_address;</div><div class='del'>-</div><div class='del'>-/* The exit status that argp will use when exiting due to a parsing error.</div><div class='del'>-   If not defined or set by the user program, this defaults to EX_USAGE from</div><div class='del'>-   &lt;sysexits.h&gt;.  */</div><div class='del'>-extern error_t argp_err_exit_status;</div><div class='del'>-</div><div class='del'>-/* Flags for argp_help.  */</div><div class='del'>-#define ARGP_HELP_USAGE		0x01 /* a Usage: message. */</div><div class='del'>-#define ARGP_HELP_SHORT_USAGE	0x02 /*  " but don't actually print options. */</div><div class='del'>-#define ARGP_HELP_SEE		0x04 /* a `Try ... for more help' message. */</div><div class='del'>-#define ARGP_HELP_LONG		0x08 /* a long help message. */</div><div class='del'>-#define ARGP_HELP_PRE_DOC	0x10 /* doc string preceding long help.  */</div><div class='del'>-#define ARGP_HELP_POST_DOC	0x20 /* doc string following long help.  */</div><div class='del'>-#define ARGP_HELP_DOC		(ARGP_HELP_PRE_DOC | ARGP_HELP_POST_DOC)</div><div class='del'>-#define ARGP_HELP_BUG_ADDR	0x40 /* bug report address */</div><div class='del'>-#define ARGP_HELP_LONG_ONLY	0x80 /* modify output appropriately to</div><div class='del'>-					reflect ARGP_LONG_ONLY mode.  */</div><div class='del'>-</div><div class='del'>-/* These ARGP_HELP flags are only understood by argp_state_help.  */</div><div class='del'>-#define ARGP_HELP_EXIT_ERR	0x100 /* Call exit(1) instead of returning.  */</div><div class='del'>-#define ARGP_HELP_EXIT_OK	0x200 /* Call exit(0) instead of returning.  */</div><div class='del'>-</div><div class='del'>-/* The standard thing to do after a program command line parsing error, if an</div><div class='del'>-   error message has already been printed.  */</div><div class='del'>-#define ARGP_HELP_STD_ERR \</div><div class='del'>-  (ARGP_HELP_SEE | ARGP_HELP_EXIT_ERR)</div><div class='del'>-/* The standard thing to do after a program command line parsing error, if no</div><div class='del'>-   more specific error message has been printed.  */</div><div class='del'>-#define ARGP_HELP_STD_USAGE \</div><div class='del'>-  (ARGP_HELP_SHORT_USAGE | ARGP_HELP_SEE | ARGP_HELP_EXIT_ERR)</div><div class='del'>-/* The standard thing to do in response to a --help option.  */</div><div class='del'>-#define ARGP_HELP_STD_HELP \</div><div class='del'>-  (ARGP_HELP_SHORT_USAGE | ARGP_HELP_LONG | ARGP_HELP_EXIT_OK \</div><div class='del'>-   | ARGP_HELP_DOC | ARGP_HELP_BUG_ADDR)</div><div class='del'>-</div><div class='del'>-/* Output a usage message for ARGP to STREAM.  FLAGS are from the set</div><div class='del'>-   ARGP_HELP_*.  */</div><div class='del'>-extern void argp_help (__const struct argp *__restrict __argp,</div><div class='del'>-		       FILE *__restrict __stream,</div><div class='del'>-		       unsigned __flags, char *__restrict __name) __THROW;</div><div class='del'>-extern void __argp_help (__const struct argp *__restrict __argp,</div><div class='del'>-			 FILE *__restrict __stream, unsigned __flags,</div><div class='del'>-			 char *__name) __THROW;</div><div class='del'>-</div><div class='del'>-/* The following routines are intended to be called from within an argp</div><div class='del'>-   parsing routine (thus taking an argp_state structure as the first</div><div class='del'>-   argument).  They may or may not print an error message and exit, depending</div><div class='del'>-   on the flags in STATE -- in any case, the caller should be prepared for</div><div class='del'>-   them *not* to exit, and should return an appropiate error after calling</div><div class='del'>-   them.  [argp_usage &amp; argp_error should probably be called argp_state_...,</div><div class='del'>-   but they're used often enough that they should be short]  */</div><div class='del'>-</div><div class='del'>-/* Output, if appropriate, a usage message for STATE to STREAM.  FLAGS are</div><div class='del'>-   from the set ARGP_HELP_*.  */</div><div class='del'>-extern void argp_state_help (__const struct argp_state *__restrict __state,</div><div class='del'>-			     FILE *__restrict __stream,</div><div class='del'>-			     unsigned int __flags) __THROW;</div><div class='del'>-extern void __argp_state_help (__const struct argp_state *__restrict __state,</div><div class='del'>-			       FILE *__restrict __stream,</div><div class='del'>-			       unsigned int __flags) __THROW;</div><div class='del'>-</div><div class='del'>-/* Possibly output the standard usage message for ARGP to stderr and exit.  */</div><div class='del'>-extern void argp_usage (__const struct argp_state *__state) __THROW;</div><div class='del'>-extern void __argp_usage (__const struct argp_state *__state) __THROW;</div><div class='del'>-</div><div class='del'>-/* If appropriate, print the printf string FMT and following args, preceded</div><div class='del'>-   by the program name and `:', to stderr, and followed by a `Try ... --help'</div><div class='del'>-   message, then exit (1).  */</div><div class='del'>-extern void argp_error (__const struct argp_state *__restrict __state,</div><div class='del'>-			__const char *__restrict __fmt, ...) __THROW</div><div class='del'>-     PRINTF_STYLE(2,3);</div><div class='del'>-extern void __argp_error (__const struct argp_state *__restrict __state,</div><div class='del'>-			  __const char *__restrict __fmt, ...) __THROW</div><div class='del'>-     PRINTF_STYLE(2,3);</div><div class='del'>-</div><div class='del'>-/* Similar to the standard gnu error-reporting function error(), but will</div><div class='del'>-   respect the ARGP_NO_EXIT and ARGP_NO_ERRS flags in STATE, and will print</div><div class='del'>-   to STATE-&gt;err_stream.  This is useful for argument parsing code that is</div><div class='del'>-   shared between program startup (when exiting is desired) and runtime</div><div class='del'>-   option parsing (when typically an error code is returned instead).  The</div><div class='del'>-   difference between this function and argp_error is that the latter is for</div><div class='del'>-   *parsing errors*, and the former is for other problems that occur during</div><div class='del'>-   parsing but don't reflect a (syntactic) problem with the input.  */</div><div class='del'>-extern void argp_failure (__const struct argp_state *__restrict __state,</div><div class='del'>-			  int __status, int __errnum,</div><div class='del'>-			  __const char *__restrict __fmt, ...) __THROW</div><div class='del'>-     PRINTF_STYLE(4,5);</div><div class='del'>-extern void __argp_failure (__const struct argp_state *__restrict __state,</div><div class='del'>-			    int __status, int __errnum,</div><div class='del'>-			    __const char *__restrict __fmt, ...) __THROW</div><div class='del'>-     PRINTF_STYLE(4,5);</div><div class='del'>-</div><div class='del'>-/* Returns true if the option OPT is a valid short option.  */</div><div class='del'>-extern int _option_is_short (__const struct argp_option *__opt) __THROW;</div><div class='del'>-extern int __option_is_short (__const struct argp_option *__opt) __THROW;</div><div class='del'>-</div><div class='del'>-/* Returns true if the option OPT is in fact the last (unused) entry in an</div><div class='del'>-   options array.  */</div><div class='del'>-extern int _option_is_end (__const struct argp_option *__opt) __THROW;</div><div class='del'>-extern int __option_is_end (__const struct argp_option *__opt) __THROW;</div><div class='del'>-</div><div class='del'>-/* Return the input field for ARGP in the parser corresponding to STATE; used</div><div class='del'>-   by the help routines.  */</div><div class='del'>-extern void *_argp_input (__const struct argp *__restrict __argp,</div><div class='del'>-			  __const struct argp_state *__restrict __state)</div><div class='del'>-     __THROW;</div><div class='del'>-extern void *__argp_input (__const struct argp *__restrict __argp,</div><div class='del'>-			   __const struct argp_state *__restrict __state)</div><div class='del'>-     __THROW;</div><div class='del'>-</div><div class='del'>-/* Used for extracting the program name from argv[0] */</div><div class='del'>-extern char *_argp_basename(char *name) __THROW;</div><div class='del'>-extern char *__argp_basename(char *name) __THROW;</div><div class='del'>-</div><div class='del'>-/* Getting the program name given an argp state */</div><div class='del'>-extern char *</div><div class='del'>-_argp_short_program_name(const struct argp_state *state) __THROW;</div><div class='del'>-extern char *</div><div class='del'>-__argp_short_program_name(const struct argp_state *state) __THROW;</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-#ifdef __USE_EXTERN_INLINES</div><div class='del'>-</div><div class='del'>-# if !_LIBC</div><div class='del'>-#  define __argp_usage argp_usage</div><div class='del'>-#  define __argp_state_help argp_state_help</div><div class='del'>-#  define __option_is_short _option_is_short</div><div class='del'>-#  define __option_is_end _option_is_end</div><div class='del'>-# endif</div><div class='del'>-</div><div class='del'>-# ifndef ARGP_EI</div><div class='del'>-#  define ARGP_EI extern __inline__</div><div class='del'>-# endif</div><div class='del'>-</div><div class='del'>-ARGP_EI void</div><div class='del'>-__argp_usage (__const struct argp_state *__state)</div><div class='del'>-{</div><div class='del'>-  __argp_state_help (__state, stderr, ARGP_HELP_STD_USAGE);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-ARGP_EI int</div><div class='del'>-__option_is_short (__const struct argp_option *__opt)</div><div class='del'>-{</div><div class='del'>-  if (__opt-&gt;flags &amp; OPTION_DOC)</div><div class='del'>-    return 0;</div><div class='del'>-  else</div><div class='del'>-    {</div><div class='del'>-      int __key = __opt-&gt;key;</div><div class='del'>-      return __key &gt; 0 &amp;&amp; isprint (__key);</div><div class='del'>-    }</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-ARGP_EI int</div><div class='del'>-__option_is_end (__const struct argp_option *__opt)</div><div class='del'>-{</div><div class='del'>-  return !__opt-&gt;key &amp;&amp; !__opt-&gt;name &amp;&amp; !__opt-&gt;doc &amp;&amp; !__opt-&gt;group;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-# if !_LIBC</div><div class='del'>-#  undef __argp_usage</div><div class='del'>-#  undef __argp_state_help</div><div class='del'>-#  undef __option_is_short</div><div class='del'>-#  undef __option_is_end</div><div class='del'>-# endif</div><div class='del'>-#endif /* Use extern inlines.  */</div><div class='del'>-</div><div class='del'>-#ifdef  __cplusplus</div><div class='del'>-}</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-#endif /* argp.h */</div><div class='head'>diff --git a/argp-standalone/autogen.sh b/argp-standalone/autogen.sh<br/>deleted file mode 100755<br/>index 8337353b5ae..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/argp-standalone/autogen.sh?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>argp-standalone/autogen.sh</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,6 +0,0 @@</div><div class='del'>-#!/bin/sh</div><div class='del'>-</div><div class='del'>-aclocal -I .</div><div class='del'>-autoheader</div><div class='del'>-autoconf</div><div class='del'>-automake --add-missing --copy --foreign</div><div class='head'>diff --git a/argp-standalone/configure.ac b/argp-standalone/configure.ac<br/>deleted file mode 100644<br/>index fe54d5ac991..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/argp-standalone/configure.ac?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>argp-standalone/configure.ac</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,100 +0,0 @@</div><div class='del'>-dnl Process this file with autoconf to produce a configure script.</div><div class='del'>-</div><div class='del'>-dnl This configure.ac is only for building a standalone argp library.</div><div class='del'>-AC_INIT([argp], [standalone-1.3])</div><div class='del'>-AC_PREREQ(2.54)</div><div class='del'>-AC_CONFIG_SRCDIR([argp-ba.c])</div><div class='del'>-# Needed to stop autoconf from looking for files in parent directories.</div><div class='del'>-AC_CONFIG_AUX_DIR([.])</div><div class='del'>-</div><div class='del'>-AM_INIT_AUTOMAKE</div><div class='del'>-AM_CONFIG_HEADER(config.h)</div><div class='del'>-</div><div class='del'>-# GNU libc defaults to supplying the ISO C library functions only. The</div><div class='del'>-# _GNU_SOURCE define enables these extensions, in particular we want</div><div class='del'>-# errno.h to declare program_invocation_name. Enable it on all</div><div class='del'>-# systems; no problems have been reported with it so far.</div><div class='del'>-AC_GNU_SOURCE</div><div class='del'>-	</div><div class='del'>-# Checks for programs.</div><div class='del'>-AC_PROG_CC</div><div class='del'>-AC_PROG_MAKE_SET</div><div class='del'>-AC_PROG_RANLIB</div><div class='del'>-AM_PROG_CC_STDC</div><div class='del'>-</div><div class='del'>-if test "x$am_cv_prog_cc_stdc" = xno ; then</div><div class='del'>-  AC_ERROR([the C compiler doesn't handle ANSI-C])</div><div class='del'>-fi</div><div class='del'>-</div><div class='del'>-# Checks for libraries.</div><div class='del'>-</div><div class='del'>-# Checks for header files.</div><div class='del'>-AC_HEADER_STDC</div><div class='del'>-AC_CHECK_HEADERS(limits.h malloc.h unistd.h sysexits.h stdarg.h)</div><div class='del'>-</div><div class='del'>-# Checks for typedefs, structures, and compiler characteristics.</div><div class='del'>-AC_C_CONST</div><div class='del'>-AC_C_INLINE</div><div class='del'>-AC_TYPE_SIZE_T</div><div class='del'>-</div><div class='del'>-LSH_GCC_ATTRIBUTES</div><div class='del'>-</div><div class='del'>-# Checks for library functions.</div><div class='del'>-AC_FUNC_ALLOCA</div><div class='del'>-AC_FUNC_VPRINTF</div><div class='del'>-AC_CHECK_FUNCS(strerror sleep getpid snprintf)</div><div class='del'>-</div><div class='del'>-AC_REPLACE_FUNCS(mempcpy strndup strchrnul strcasecmp vsnprintf)</div><div class='del'>-</div><div class='del'>-dnl ARGP_CHECK_FUNC(includes, function-call [, if-found [, if-not-found]])</div><div class='del'>-AC_DEFUN([ARGP_CHECK_FUNC],</div><div class='del'>-  [AS_VAR_PUSHDEF([ac_func], m4_substr([$2], 0, m4_index([$2], [(])))</div><div class='del'>-   AS_VAR_PUSHDEF([ac_var], [ac_cv_func_call_]ac_func)</div><div class='del'>-   AH_TEMPLATE(AS_TR_CPP(HAVE_[]ac_func),</div><div class='del'>-               [Define to 1 if you have the `]ac_func[' function.])</div><div class='del'>-   AC_CACHE_CHECK([for $2], ac_var,</div><div class='del'>-     [AC_TRY_LINK([$1], [$2],</div><div class='del'>-		  [AS_VAR_SET(ac_var, yes)],</div><div class='del'>-		  [AS_VAR_SET(ac_var, no)])])</div><div class='del'>-   if test AS_VAR_GET(ac_var) = yes ; then</div><div class='del'>-     ifelse([$3],,</div><div class='del'>-	    [AC_DEFINE_UNQUOTED(AS_TR_CPP(HAVE_[]ac_func))],</div><div class='del'>-	    [$3</div><div class='del'>-])</div><div class='del'>-   else</div><div class='del'>-     ifelse([$4],, true, [$4])</div><div class='del'>-   fi</div><div class='del'>-   AS_VAR_POPDEF([ac_var])</div><div class='del'>-   AS_VAR_POPDEF([ac_func])</div><div class='del'>-   ])</div><div class='del'>-</div><div class='del'>-# At least on freebsd, putc_unlocked is a macro, so the standard</div><div class='del'>-# AC_CHECK_FUNCS doesn't work well.</div><div class='del'>-ARGP_CHECK_FUNC([#include &lt;stdio.h&gt;], [putc_unlocked('x', stdout)])</div><div class='del'>-</div><div class='del'>-AC_CHECK_FUNCS(flockfile)</div><div class='del'>-AC_CHECK_FUNCS(fputs_unlocked fwrite_unlocked)</div><div class='del'>-</div><div class='del'>-# Used only by argp-test.c, so don't use AC_REPLACE_FUNCS.</div><div class='del'>-AC_CHECK_FUNCS(strdup asprintf)</div><div class='del'>-</div><div class='del'>-AC_CHECK_DECLS([program_invocation_name, program_invocation_short_name],</div><div class='del'>-               [], [], [[#include &lt;errno.h&gt;]])</div><div class='del'>-</div><div class='del'>-# Set these flags *last*, or else the test programs won't compile</div><div class='del'>-if test x$GCC = xyes ; then</div><div class='del'>-  # Using -ggdb3 makes (some versions of) Redhat's gcc-2.96 dump core</div><div class='del'>-  if "$CC" --version | grep '^2\.96$' 1&gt;/dev/null 2&gt;&amp;1; then</div><div class='del'>-    true</div><div class='del'>-  else</div><div class='del'>-    CFLAGS="$CFLAGS -ggdb3"</div><div class='del'>-  fi</div><div class='del'>-  CFLAGS="$CFLAGS -Wall -W \</div><div class='del'>- -Wmissing-prototypes -Wmissing-declarations -Wstrict-prototypes \</div><div class='del'>- -Waggregate-return \</div><div class='del'>- -Wpointer-arith -Wbad-function-cast -Wnested-externs"</div><div class='del'>-fi</div><div class='del'>-</div><div class='del'>-CPPFLAGS="$CPPFLAGS -I$srcdir"</div><div class='del'>-</div><div class='del'>-AC_OUTPUT(Makefile)</div><div class='head'>diff --git a/argp-standalone/mempcpy.c b/argp-standalone/mempcpy.c<br/>deleted file mode 100644<br/>index 21d8bd2ed94..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/argp-standalone/mempcpy.c?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>argp-standalone/mempcpy.c</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,21 +0,0 @@</div><div class='del'>-/* strndup.c</div><div class='del'>- *</div><div class='del'>- */</div><div class='del'>-</div><div class='del'>-/* Written by Niels Möller &lt;nisse@lysator.liu.se&gt;</div><div class='del'>- *</div><div class='del'>- * This file is hereby placed in the public domain.</div><div class='del'>- */</div><div class='del'>-</div><div class='del'>-#include &lt;string.h&gt;</div><div class='del'>-</div><div class='del'>-void *</div><div class='del'>-mempcpy (void *, const void *, size_t) ;</div><div class='del'>-</div><div class='del'>-void *</div><div class='del'>-mempcpy (void *to, const void *from, size_t size)</div><div class='del'>-{</div><div class='del'>-  memcpy(to, from, size);</div><div class='del'>-  return (char *) to + size;</div><div class='del'>-}</div><div class='del'>-</div><div class='head'>diff --git a/argp-standalone/strcasecmp.c b/argp-standalone/strcasecmp.c<br/>deleted file mode 100644<br/>index 9c1637232fd..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/argp-standalone/strcasecmp.c?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>argp-standalone/strcasecmp.c</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,29 +0,0 @@</div><div class='del'>-/* strcasecmp.c</div><div class='del'>- *</div><div class='del'>- */</div><div class='del'>-</div><div class='del'>-/* Written by Niels Möller &lt;nisse@lysator.liu.se&gt;</div><div class='del'>- *</div><div class='del'>- * This file is hereby placed in the public domain.</div><div class='del'>- */</div><div class='del'>-</div><div class='del'>-#include &lt;ctype.h&gt;</div><div class='del'>-int strcasecmp(const char *, const char *);</div><div class='del'>-</div><div class='del'>-int strcasecmp(const char *s1, const char *s2)</div><div class='del'>-{</div><div class='del'>-  unsigned i;</div><div class='del'>-  </div><div class='del'>-  for (i = 0; s1[i] &amp;&amp; s2[i]; i++)</div><div class='del'>-    {</div><div class='del'>-      unsigned char c1 = tolower( (unsigned char) s1[i]);</div><div class='del'>-      unsigned char c2 = tolower( (unsigned char) s2[i]);</div><div class='del'>-</div><div class='del'>-      if (c1 &lt; c2)</div><div class='del'>-	return -1;</div><div class='del'>-      else if (c1 &gt; c2)</div><div class='del'>-	return 1;</div><div class='del'>-    }</div><div class='del'>-</div><div class='del'>-  return !s2[i] - !s1[i];	</div><div class='del'>-}</div><div class='head'>diff --git a/argp-standalone/strchrnul.c b/argp-standalone/strchrnul.c<br/>deleted file mode 100644<br/>index ee4145e4eda..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/argp-standalone/strchrnul.c?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>argp-standalone/strchrnul.c</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,23 +0,0 @@</div><div class='del'>-/* strchrnul.c</div><div class='del'>- *</div><div class='del'>- */</div><div class='del'>-</div><div class='del'>-/* Written by Niels Möller &lt;nisse@lysator.liu.se&gt;</div><div class='del'>- *</div><div class='del'>- * This file is hereby placed in the public domain.</div><div class='del'>- */</div><div class='del'>-</div><div class='del'>-/* FIXME: What is this function supposed to do? My guess is that it is</div><div class='del'>- * like strchr, but returns a pointer to the NUL character, not a NULL</div><div class='del'>- * pointer, if the character isn't found. */</div><div class='del'>-</div><div class='del'>-char *strchrnul(const char *, int );</div><div class='del'>-</div><div class='del'>-char *strchrnul(const char *s, int c)</div><div class='del'>-{</div><div class='del'>-  const char *p = s;</div><div class='del'>-  while (*p &amp;&amp; (*p != c))</div><div class='del'>-    p++;</div><div class='del'>-</div><div class='del'>-  return (char *) p;</div><div class='del'>-}</div><div class='head'>diff --git a/argp-standalone/strndup.c b/argp-standalone/strndup.c<br/>deleted file mode 100644<br/>index 4147b7a2051..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/argp-standalone/strndup.c?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>argp-standalone/strndup.c</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,34 +0,0 @@</div><div class='del'>-/* strndup.c</div><div class='del'>- *</div><div class='del'>- */</div><div class='del'>-</div><div class='del'>-/* Written by Niels Möller &lt;nisse@lysator.liu.se&gt;</div><div class='del'>- *</div><div class='del'>- * This file is hereby placed in the public domain.</div><div class='del'>- */</div><div class='del'>-</div><div class='del'>-#include &lt;stdlib.h&gt;</div><div class='del'>-#include &lt;string.h&gt;</div><div class='del'>-</div><div class='del'>-char *</div><div class='del'>-strndup (const char *, size_t);</div><div class='del'>-</div><div class='del'>-char *</div><div class='del'>-strndup (const char *s, size_t size)</div><div class='del'>-{</div><div class='del'>-  char *r;</div><div class='del'>-  char *end = memchr(s, 0, size);</div><div class='del'>-  </div><div class='del'>-  if (end)</div><div class='del'>-    /* Length + 1 */</div><div class='del'>-    size = end - s + 1;</div><div class='del'>-  </div><div class='del'>-  r = malloc(size);</div><div class='del'>-</div><div class='del'>-  if (size)</div><div class='del'>-    {</div><div class='del'>-      memcpy(r, s, size-1);</div><div class='del'>-      r[size-1] = '\0';</div><div class='del'>-    }</div><div class='del'>-  return r;</div><div class='del'>-}</div><div class='head'>diff --git a/argp-standalone/vsnprintf.c b/argp-standalone/vsnprintf.c<br/>deleted file mode 100644<br/>index 33c9a5d0042..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/argp-standalone/vsnprintf.c?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>argp-standalone/vsnprintf.c</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,839 +0,0 @@</div><div class='del'>-/* Copied from http://www.fiction.net/blong/programs/snprintf.c */</div><div class='del'>-</div><div class='del'>-/*</div><div class='del'>- * Copyright Patrick Powell 1995</div><div class='del'>- * This code is based on code written by Patrick Powell (papowell@astart.com)</div><div class='del'>- * It may be used for any purpose as long as this notice remains intact</div><div class='del'>- * on all source code distributions</div><div class='del'>- */</div><div class='del'>-</div><div class='del'>-/**************************************************************</div><div class='del'>- * Original:</div><div class='del'>- * Patrick Powell Tue Apr 11 09:48:21 PDT 1995</div><div class='del'>- * A bombproof version of doprnt (dopr) included.</div><div class='del'>- * Sigh.  This sort of thing is always nasty do deal with.  Note that</div><div class='del'>- * the version here does not include floating point...</div><div class='del'>- *</div><div class='del'>- * snprintf() is used instead of sprintf() as it does limit checks</div><div class='del'>- * for string length.  This covers a nasty loophole.</div><div class='del'>- *</div><div class='del'>- * The other functions are there to prevent NULL pointers from</div><div class='del'>- * causing nast effects.</div><div class='del'>- *</div><div class='del'>- * More Recently:</div><div class='del'>- *  Brandon Long &lt;blong@fiction.net&gt; 9/15/96 for mutt 0.43</div><div class='del'>- *  This was ugly.  It is still ugly.  I opted out of floating point</div><div class='del'>- *  numbers, but the formatter understands just about everything</div><div class='del'>- *  from the normal C string format, at least as far as I can tell from</div><div class='del'>- *  the Solaris 2.5 printf(3S) man page.</div><div class='del'>- *</div><div class='del'>- *  Brandon Long &lt;blong@fiction.net&gt; 10/22/97 for mutt 0.87.1</div><div class='del'>- *    Ok, added some minimal floating point support, which means this</div><div class='del'>- *    probably requires libm on most operating systems.  Don't yet</div><div class='del'>- *    support the exponent (e,E) and sigfig (g,G).  Also, fmtint()</div><div class='del'>- *    was pretty badly broken, it just wasn't being exercised in ways</div><div class='del'>- *    which showed it, so that's been fixed.  Also, formated the code</div><div class='del'>- *    to mutt conventions, and removed dead code left over from the</div><div class='del'>- *    original.  Also, there is now a builtin-test, just compile with:</div><div class='del'>- *           gcc -DTEST_SNPRINTF -o snprintf snprintf.c -lm</div><div class='del'>- *    and run snprintf for results.</div><div class='del'>- * </div><div class='del'>- *  Thomas Roessler &lt;roessler@guug.de&gt; 01/27/98 for mutt 0.89i</div><div class='del'>- *    The PGP code was using unsigned hexadecimal formats. </div><div class='del'>- *    Unfortunately, unsigned formats simply didn't work.</div><div class='del'>- *</div><div class='del'>- *  Michael Elkins &lt;me@cs.hmc.edu&gt; 03/05/98 for mutt 0.90.8</div><div class='del'>- *    The original code assumed that both snprintf() and vsnprintf() were</div><div class='del'>- *    missing.  Some systems only have snprintf() but not vsnprintf(), so</div><div class='del'>- *    the code is now broken down under HAVE_SNPRINTF and HAVE_VSNPRINTF.</div><div class='del'>- *</div><div class='del'>- *  Andrew Tridgell (tridge@samba.org) Oct 1998</div><div class='del'>- *    fixed handling of %.0f</div><div class='del'>- *    added test for HAVE_LONG_DOUBLE</div><div class='del'>- *</div><div class='del'>- *  Russ Allbery &lt;rra@stanford.edu&gt; 2000-08-26</div><div class='del'>- *    fixed return value to comply with C99</div><div class='del'>- *    fixed handling of snprintf(NULL, ...)</div><div class='del'>- *</div><div class='del'>- * Niels Möller &lt;nisse@lysator.liu.se&gt; 2004-03-05</div><div class='del'>- *    fixed calls to isdigit to use unsigned char.</div><div class='del'>- *    fixed calls to va_arg; short arguments are always passed as int.</div><div class='del'>- *</div><div class='del'>- **************************************************************/</div><div class='del'>-</div><div class='del'>-#if HAVE_CONFIG_H</div><div class='del'>-# include "config.h"</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-#if !defined(HAVE_SNPRINTF) || !defined(HAVE_VSNPRINTF)</div><div class='del'>-</div><div class='del'>-#include &lt;string.h&gt;</div><div class='del'>-#include &lt;ctype.h&gt;</div><div class='del'>-#include &lt;sys/types.h&gt;</div><div class='del'>-</div><div class='del'>-/* Define this as a fall through, HAVE_STDARG_H is probably already set */</div><div class='del'>-</div><div class='del'>-#define HAVE_VARARGS_H</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-/* varargs declarations: */</div><div class='del'>-</div><div class='del'>-#if defined(HAVE_STDARG_H)</div><div class='del'>-# include &lt;stdarg.h&gt;</div><div class='del'>-# define HAVE_STDARGS    /* let's hope that works everywhere (mj) */</div><div class='del'>-# define VA_LOCAL_DECL   va_list ap</div><div class='del'>-# define VA_START(f)     va_start(ap, f)</div><div class='del'>-# define VA_SHIFT(v,t)  ;   /* no-op for ANSI */</div><div class='del'>-# define VA_END          va_end(ap)</div><div class='del'>-#else</div><div class='del'>-# if defined(HAVE_VARARGS_H)</div><div class='del'>-#  include &lt;varargs.h&gt;</div><div class='del'>-#  undef HAVE_STDARGS</div><div class='del'>-#  define VA_LOCAL_DECL   va_list ap</div><div class='del'>-#  define VA_START(f)     va_start(ap)      /* f is ignored! */</div><div class='del'>-#  define VA_SHIFT(v,t) v = va_arg(ap,t)</div><div class='del'>-#  define VA_END        va_end(ap)</div><div class='del'>-# else</div><div class='del'>-/*XX ** NO VARARGS ** XX*/</div><div class='del'>-# endif</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-#ifdef HAVE_LONG_DOUBLE</div><div class='del'>-#define LDOUBLE long double</div><div class='del'>-#else</div><div class='del'>-#define LDOUBLE double</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-int snprintf (char *str, size_t count, const char *fmt, ...);</div><div class='del'>-int vsnprintf (char *str, size_t count, const char *fmt, va_list arg);</div><div class='del'>-</div><div class='del'>-static int dopr (char *buffer, size_t maxlen, const char *format, </div><div class='del'>-                 va_list args);</div><div class='del'>-static int fmtstr (char *buffer, size_t *currlen, size_t maxlen,</div><div class='del'>-		   char *value, int flags, int min, int max);</div><div class='del'>-static int fmtint (char *buffer, size_t *currlen, size_t maxlen,</div><div class='del'>-		   long value, int base, int min, int max, int flags);</div><div class='del'>-static int fmtfp (char *buffer, size_t *currlen, size_t maxlen,</div><div class='del'>-		  LDOUBLE fvalue, int min, int max, int flags);</div><div class='del'>-static int dopr_outch (char *buffer, size_t *currlen, size_t maxlen, char c );</div><div class='del'>-</div><div class='del'>-/*</div><div class='del'>- * dopr(): poor man's version of doprintf</div><div class='del'>- */</div><div class='del'>-</div><div class='del'>-/* format read states */</div><div class='del'>-#define DP_S_DEFAULT 0</div><div class='del'>-#define DP_S_FLAGS   1</div><div class='del'>-#define DP_S_MIN     2</div><div class='del'>-#define DP_S_DOT     3</div><div class='del'>-#define DP_S_MAX     4</div><div class='del'>-#define DP_S_MOD     5</div><div class='del'>-#define DP_S_CONV    6</div><div class='del'>-#define DP_S_DONE    7</div><div class='del'>-</div><div class='del'>-/* format flags - Bits */</div><div class='del'>-#define DP_F_MINUS 	(1 &lt;&lt; 0)</div><div class='del'>-#define DP_F_PLUS  	(1 &lt;&lt; 1)</div><div class='del'>-#define DP_F_SPACE 	(1 &lt;&lt; 2)</div><div class='del'>-#define DP_F_NUM   	(1 &lt;&lt; 3)</div><div class='del'>-#define DP_F_ZERO  	(1 &lt;&lt; 4)</div><div class='del'>-#define DP_F_UP    	(1 &lt;&lt; 5)</div><div class='del'>-#define DP_F_UNSIGNED 	(1 &lt;&lt; 6)</div><div class='del'>-</div><div class='del'>-/* Conversion Flags */</div><div class='del'>-#define DP_C_SHORT   1</div><div class='del'>-#define DP_C_LONG    2</div><div class='del'>-#define DP_C_LDOUBLE 3</div><div class='del'>-</div><div class='del'>-#define char_to_int(p) (p - '0')</div><div class='del'>-#define MAX(p,q) ((p &gt;= q) ? p : q)</div><div class='del'>-#define MIN(p,q) ((p &lt;= q) ? p : q)</div><div class='del'>-</div><div class='del'>-static int dopr (char *buffer, size_t maxlen, const char *format, va_list args)</div><div class='del'>-{</div><div class='del'>-  unsigned char ch;</div><div class='del'>-  long value;</div><div class='del'>-  LDOUBLE fvalue;</div><div class='del'>-  char *strvalue;</div><div class='del'>-  int min;</div><div class='del'>-  int max;</div><div class='del'>-  int state;</div><div class='del'>-  int flags;</div><div class='del'>-  int cflags;</div><div class='del'>-  int total;</div><div class='del'>-  size_t currlen;</div><div class='del'>-  </div><div class='del'>-  state = DP_S_DEFAULT;</div><div class='del'>-  currlen = flags = cflags = min = 0;</div><div class='del'>-  max = -1;</div><div class='del'>-  ch = *format++;</div><div class='del'>-  total = 0;</div><div class='del'>-</div><div class='del'>-  while (state != DP_S_DONE)</div><div class='del'>-  {</div><div class='del'>-    if (ch == '\0')</div><div class='del'>-      state = DP_S_DONE;</div><div class='del'>-</div><div class='del'>-    switch(state) </div><div class='del'>-    {</div><div class='del'>-    case DP_S_DEFAULT:</div><div class='del'>-      if (ch == '%') </div><div class='del'>-	state = DP_S_FLAGS;</div><div class='del'>-      else </div><div class='del'>-	total += dopr_outch (buffer, &amp;currlen, maxlen, ch);</div><div class='del'>-      ch = *format++;</div><div class='del'>-      break;</div><div class='del'>-    case DP_S_FLAGS:</div><div class='del'>-      switch (ch) </div><div class='del'>-      {</div><div class='del'>-      case '-':</div><div class='del'>-	flags |= DP_F_MINUS;</div><div class='del'>-        ch = *format++;</div><div class='del'>-	break;</div><div class='del'>-      case '+':</div><div class='del'>-	flags |= DP_F_PLUS;</div><div class='del'>-        ch = *format++;</div><div class='del'>-	break;</div><div class='del'>-      case ' ':</div><div class='del'>-	flags |= DP_F_SPACE;</div><div class='del'>-        ch = *format++;</div><div class='del'>-	break;</div><div class='del'>-      case '#':</div><div class='del'>-	flags |= DP_F_NUM;</div><div class='del'>-        ch = *format++;</div><div class='del'>-	break;</div><div class='del'>-      case '0':</div><div class='del'>-	flags |= DP_F_ZERO;</div><div class='del'>-        ch = *format++;</div><div class='del'>-	break;</div><div class='del'>-      default:</div><div class='del'>-	state = DP_S_MIN;</div><div class='del'>-	break;</div><div class='del'>-      }</div><div class='del'>-      break;</div><div class='del'>-    case DP_S_MIN:</div><div class='del'>-      if (isdigit(ch)) </div><div class='del'>-      {</div><div class='del'>-	min = 10*min + char_to_int (ch);</div><div class='del'>-	ch = *format++;</div><div class='del'>-      } </div><div class='del'>-      else if (ch == '*') </div><div class='del'>-      {</div><div class='del'>-	min = va_arg (args, int);</div><div class='del'>-	ch = *format++;</div><div class='del'>-	state = DP_S_DOT;</div><div class='del'>-      } </div><div class='del'>-      else </div><div class='del'>-	state = DP_S_DOT;</div><div class='del'>-      break;</div><div class='del'>-    case DP_S_DOT:</div><div class='del'>-      if (ch == '.') </div><div class='del'>-      {</div><div class='del'>-	state = DP_S_MAX;</div><div class='del'>-	ch = *format++;</div><div class='del'>-      } </div><div class='del'>-      else </div><div class='del'>-	state = DP_S_MOD;</div><div class='del'>-      break;</div><div class='del'>-    case DP_S_MAX:</div><div class='del'>-      if (isdigit(ch)) </div><div class='del'>-      {</div><div class='del'>-	if (max &lt; 0)</div><div class='del'>-	  max = 0;</div><div class='del'>-	max = 10*max + char_to_int (ch);</div><div class='del'>-	ch = *format++;</div><div class='del'>-      } </div><div class='del'>-      else if (ch == '*') </div><div class='del'>-      {</div><div class='del'>-	max = va_arg (args, int);</div><div class='del'>-	ch = *format++;</div><div class='del'>-	state = DP_S_MOD;</div><div class='del'>-      } </div><div class='del'>-      else </div><div class='del'>-	state = DP_S_MOD;</div><div class='del'>-      break;</div><div class='del'>-    case DP_S_MOD:</div><div class='del'>-      /* Currently, we don't support Long Long, bummer */</div><div class='del'>-      switch (ch) </div><div class='del'>-      {</div><div class='del'>-      case 'h':</div><div class='del'>-	cflags = DP_C_SHORT;</div><div class='del'>-	ch = *format++;</div><div class='del'>-	break;</div><div class='del'>-      case 'l':</div><div class='del'>-	cflags = DP_C_LONG;</div><div class='del'>-	ch = *format++;</div><div class='del'>-	break;</div><div class='del'>-      case 'L':</div><div class='del'>-	cflags = DP_C_LDOUBLE;</div><div class='del'>-	ch = *format++;</div><div class='del'>-	break;</div><div class='del'>-      default:</div><div class='del'>-	break;</div><div class='del'>-      }</div><div class='del'>-      state = DP_S_CONV;</div><div class='del'>-      break;</div><div class='del'>-    case DP_S_CONV:</div><div class='del'>-      switch (ch) </div><div class='del'>-      {</div><div class='del'>-      case 'd':</div><div class='del'>-      case 'i':</div><div class='del'>-	if (cflags == DP_C_SHORT) </div><div class='del'>-	  value = (short) va_arg (args, int);</div><div class='del'>-	else if (cflags == DP_C_LONG)</div><div class='del'>-	  value = va_arg (args, long int);</div><div class='del'>-	else</div><div class='del'>-	  value = va_arg (args, int);</div><div class='del'>-	total += fmtint (buffer, &amp;currlen, maxlen, value, 10, min, max, flags);</div><div class='del'>-	break;</div><div class='del'>-      case 'o':</div><div class='del'>-	flags |= DP_F_UNSIGNED;</div><div class='del'>-	if (cflags == DP_C_SHORT)</div><div class='del'>-	  value = (unsigned short) va_arg (args, unsigned);</div><div class='del'>-	else if (cflags == DP_C_LONG)</div><div class='del'>-	  value = va_arg (args, unsigned long int);</div><div class='del'>-	else</div><div class='del'>-	  value = va_arg (args, unsigned int);</div><div class='del'>-	total += fmtint (buffer, &amp;currlen, maxlen, value, 8, min, max, flags);</div><div class='del'>-	break;</div><div class='del'>-      case 'u':</div><div class='del'>-	flags |= DP_F_UNSIGNED;</div><div class='del'>-	if (cflags == DP_C_SHORT)</div><div class='del'>-	  value = (unsigned short) va_arg (args, unsigned);</div><div class='del'>-	else if (cflags == DP_C_LONG)</div><div class='del'>-	  value = va_arg (args, unsigned long int);</div><div class='del'>-	else</div><div class='del'>-	  value = va_arg (args, unsigned int);</div><div class='del'>-	total += fmtint (buffer, &amp;currlen, maxlen, value, 10, min, max, flags);</div><div class='del'>-	break;</div><div class='del'>-      case 'X':</div><div class='del'>-	flags |= DP_F_UP;</div><div class='del'>-      case 'x':</div><div class='del'>-	flags |= DP_F_UNSIGNED;</div><div class='del'>-	if (cflags == DP_C_SHORT)</div><div class='del'>-	  value = (unsigned short) va_arg (args, unsigned);</div><div class='del'>-	else if (cflags == DP_C_LONG)</div><div class='del'>-	  value = va_arg (args, unsigned long int);</div><div class='del'>-	else</div><div class='del'>-	  value = va_arg (args, unsigned int);</div><div class='del'>-	total += fmtint (buffer, &amp;currlen, maxlen, value, 16, min, max, flags);</div><div class='del'>-	break;</div><div class='del'>-      case 'f':</div><div class='del'>-	if (cflags == DP_C_LDOUBLE)</div><div class='del'>-	  fvalue = va_arg (args, LDOUBLE);</div><div class='del'>-	else</div><div class='del'>-	  fvalue = va_arg (args, double);</div><div class='del'>-	/* um, floating point? */</div><div class='del'>-	total += fmtfp (buffer, &amp;currlen, maxlen, fvalue, min, max, flags);</div><div class='del'>-	break;</div><div class='del'>-      case 'E':</div><div class='del'>-	flags |= DP_F_UP;</div><div class='del'>-      case 'e':</div><div class='del'>-	if (cflags == DP_C_LDOUBLE)</div><div class='del'>-	  fvalue = va_arg (args, LDOUBLE);</div><div class='del'>-	else</div><div class='del'>-	  fvalue = va_arg (args, double);</div><div class='del'>-	break;</div><div class='del'>-      case 'G':</div><div class='del'>-	flags |= DP_F_UP;</div><div class='del'>-      case 'g':</div><div class='del'>-	if (cflags == DP_C_LDOUBLE)</div><div class='del'>-	  fvalue = va_arg (args, LDOUBLE);</div><div class='del'>-	else</div><div class='del'>-	  fvalue = va_arg (args, double);</div><div class='del'>-	break;</div><div class='del'>-      case 'c':</div><div class='del'>-	total += dopr_outch (buffer, &amp;currlen, maxlen, va_arg (args, int));</div><div class='del'>-	break;</div><div class='del'>-      case 's':</div><div class='del'>-	strvalue = va_arg (args, char *);</div><div class='del'>-	total += fmtstr (buffer, &amp;currlen, maxlen, strvalue, flags, min, max);</div><div class='del'>-	break;</div><div class='del'>-      case 'p':</div><div class='del'>-	strvalue = va_arg (args, void *);</div><div class='del'>-	total += fmtint (buffer, &amp;currlen, maxlen, (long) strvalue, 16, min,</div><div class='del'>-                         max, flags);</div><div class='del'>-	break;</div><div class='del'>-      case 'n':</div><div class='del'>-	if (cflags == DP_C_SHORT) </div><div class='del'>-	{</div><div class='del'>-	  short int *num;</div><div class='del'>-	  num = va_arg (args, short int *);</div><div class='del'>-	  *num = currlen;</div><div class='del'>-        } </div><div class='del'>-	else if (cflags == DP_C_LONG) </div><div class='del'>-	{</div><div class='del'>-	  long int *num;</div><div class='del'>-	  num = va_arg (args, long int *);</div><div class='del'>-	  *num = currlen;</div><div class='del'>-        } </div><div class='del'>-	else </div><div class='del'>-	{</div><div class='del'>-	  int *num;</div><div class='del'>-	  num = va_arg (args, int *);</div><div class='del'>-	  *num = currlen;</div><div class='del'>-        }</div><div class='del'>-	break;</div><div class='del'>-      case '%':</div><div class='del'>-	total += dopr_outch (buffer, &amp;currlen, maxlen, ch);</div><div class='del'>-	break;</div><div class='del'>-      case 'w':</div><div class='del'>-	/* not supported yet, treat as next char */</div><div class='del'>-	ch = *format++;</div><div class='del'>-	break;</div><div class='del'>-      default:</div><div class='del'>-	/* Unknown, skip */</div><div class='del'>-	break;</div><div class='del'>-      }</div><div class='del'>-      ch = *format++;</div><div class='del'>-      state = DP_S_DEFAULT;</div><div class='del'>-      flags = cflags = min = 0;</div><div class='del'>-      max = -1;</div><div class='del'>-      break;</div><div class='del'>-    case DP_S_DONE:</div><div class='del'>-      break;</div><div class='del'>-    default:</div><div class='del'>-      /* hmm? */</div><div class='del'>-      break; /* some picky compilers need this */</div><div class='del'>-    }</div><div class='del'>-  }</div><div class='del'>-  if (buffer != NULL)</div><div class='del'>-  {</div><div class='del'>-    if (currlen &lt; maxlen - 1) </div><div class='del'>-      buffer[currlen] = '\0';</div><div class='del'>-    else </div><div class='del'>-      buffer[maxlen - 1] = '\0';</div><div class='del'>-  }</div><div class='del'>-  return total;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-static int fmtstr (char *buffer, size_t *currlen, size_t maxlen,</div><div class='del'>-                   char *value, int flags, int min, int max)</div><div class='del'>-{</div><div class='del'>-  int padlen, strln;     /* amount to pad */</div><div class='del'>-  int cnt = 0;</div><div class='del'>-  int total = 0;</div><div class='del'>-  </div><div class='del'>-  if (value == 0)</div><div class='del'>-  {</div><div class='del'>-    value = "&lt;NULL&gt;";</div><div class='del'>-  }</div><div class='del'>-</div><div class='del'>-  for (strln = 0; value[strln]; ++strln); /* strlen */</div><div class='del'>-  if (max &gt;= 0 &amp;&amp; max &lt; strln)</div><div class='del'>-    strln = max;</div><div class='del'>-  padlen = min - strln;</div><div class='del'>-  if (padlen &lt; 0) </div><div class='del'>-    padlen = 0;</div><div class='del'>-  if (flags &amp; DP_F_MINUS) </div><div class='del'>-    padlen = -padlen; /* Left Justify */</div><div class='del'>-</div><div class='del'>-  while (padlen &gt; 0)</div><div class='del'>-  {</div><div class='del'>-    total += dopr_outch (buffer, currlen, maxlen, ' ');</div><div class='del'>-    --padlen;</div><div class='del'>-  }</div><div class='del'>-  while (*value &amp;&amp; ((max &lt; 0) || (cnt &lt; max)))</div><div class='del'>-  {</div><div class='del'>-    total += dopr_outch (buffer, currlen, maxlen, *value++);</div><div class='del'>-    ++cnt;</div><div class='del'>-  }</div><div class='del'>-  while (padlen &lt; 0)</div><div class='del'>-  {</div><div class='del'>-    total += dopr_outch (buffer, currlen, maxlen, ' ');</div><div class='del'>-    ++padlen;</div><div class='del'>-  }</div><div class='del'>-  return total;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-/* Have to handle DP_F_NUM (ie 0x and 0 alternates) */</div><div class='del'>-</div><div class='del'>-static int fmtint (char *buffer, size_t *currlen, size_t maxlen,</div><div class='del'>-		   long value, int base, int min, int max, int flags)</div><div class='del'>-{</div><div class='del'>-  int signvalue = 0;</div><div class='del'>-  unsigned long uvalue;</div><div class='del'>-  char convert[20];</div><div class='del'>-  int place = 0;</div><div class='del'>-  int spadlen = 0; /* amount to space pad */</div><div class='del'>-  int zpadlen = 0; /* amount to zero pad */</div><div class='del'>-  int caps = 0;</div><div class='del'>-  int total = 0;</div><div class='del'>-  </div><div class='del'>-  if (max &lt; 0)</div><div class='del'>-    max = 0;</div><div class='del'>-</div><div class='del'>-  uvalue = value;</div><div class='del'>-</div><div class='del'>-  if(!(flags &amp; DP_F_UNSIGNED))</div><div class='del'>-  {</div><div class='del'>-    if( value &lt; 0 ) {</div><div class='del'>-      signvalue = '-';</div><div class='del'>-      uvalue = -value;</div><div class='del'>-    }</div><div class='del'>-    else</div><div class='del'>-      if (flags &amp; DP_F_PLUS)  /* Do a sign (+/i) */</div><div class='del'>-	signvalue = '+';</div><div class='del'>-    else</div><div class='del'>-      if (flags &amp; DP_F_SPACE)</div><div class='del'>-	signvalue = ' ';</div><div class='del'>-  }</div><div class='del'>-  </div><div class='del'>-  if (flags &amp; DP_F_UP) caps = 1; /* Should characters be upper case? */</div><div class='del'>-</div><div class='del'>-  do {</div><div class='del'>-    convert[place++] =</div><div class='del'>-      (caps? "0123456789ABCDEF":"0123456789abcdef")</div><div class='del'>-      [uvalue % (unsigned)base  ];</div><div class='del'>-    uvalue = (uvalue / (unsigned)base );</div><div class='del'>-  } while(uvalue &amp;&amp; (place &lt; 20));</div><div class='del'>-  if (place == 20) place--;</div><div class='del'>-  convert[place] = 0;</div><div class='del'>-</div><div class='del'>-  zpadlen = max - place;</div><div class='del'>-  spadlen = min - MAX (max, place) - (signvalue ? 1 : 0);</div><div class='del'>-  if (zpadlen &lt; 0) zpadlen = 0;</div><div class='del'>-  if (spadlen &lt; 0) spadlen = 0;</div><div class='del'>-  if (flags &amp; DP_F_ZERO)</div><div class='del'>-  {</div><div class='del'>-    zpadlen = MAX(zpadlen, spadlen);</div><div class='del'>-    spadlen = 0;</div><div class='del'>-  }</div><div class='del'>-  if (flags &amp; DP_F_MINUS) </div><div class='del'>-    spadlen = -spadlen; /* Left Justifty */</div><div class='del'>-</div><div class='del'>-#ifdef DEBUG_SNPRINTF</div><div class='del'>-  dprint (1, (debugfile, "zpad: %d, spad: %d, min: %d, max: %d, place: %d\n",</div><div class='del'>-      zpadlen, spadlen, min, max, place));</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-  /* Spaces */</div><div class='del'>-  while (spadlen &gt; 0) </div><div class='del'>-  {</div><div class='del'>-    total += dopr_outch (buffer, currlen, maxlen, ' ');</div><div class='del'>-    --spadlen;</div><div class='del'>-  }</div><div class='del'>-</div><div class='del'>-  /* Sign */</div><div class='del'>-  if (signvalue) </div><div class='del'>-    total += dopr_outch (buffer, currlen, maxlen, signvalue);</div><div class='del'>-</div><div class='del'>-  /* Zeros */</div><div class='del'>-  if (zpadlen &gt; 0) </div><div class='del'>-  {</div><div class='del'>-    while (zpadlen &gt; 0)</div><div class='del'>-    {</div><div class='del'>-      total += dopr_outch (buffer, currlen, maxlen, '0');</div><div class='del'>-      --zpadlen;</div><div class='del'>-    }</div><div class='del'>-  }</div><div class='del'>-</div><div class='del'>-  /* Digits */</div><div class='del'>-  while (place &gt; 0) </div><div class='del'>-    total += dopr_outch (buffer, currlen, maxlen, convert[--place]);</div><div class='del'>-  </div><div class='del'>-  /* Left Justified spaces */</div><div class='del'>-  while (spadlen &lt; 0) {</div><div class='del'>-    total += dopr_outch (buffer, currlen, maxlen, ' ');</div><div class='del'>-    ++spadlen;</div><div class='del'>-  }</div><div class='del'>-</div><div class='del'>-  return total;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-static LDOUBLE abs_val (LDOUBLE value)</div><div class='del'>-{</div><div class='del'>-  LDOUBLE result = value;</div><div class='del'>-</div><div class='del'>-  if (value &lt; 0)</div><div class='del'>-    result = -value;</div><div class='del'>-</div><div class='del'>-  return result;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-static LDOUBLE pow10_argp (int exp)</div><div class='del'>-{</div><div class='del'>-  LDOUBLE result = 1;</div><div class='del'>-</div><div class='del'>-  while (exp)</div><div class='del'>-  {</div><div class='del'>-    result *= 10;</div><div class='del'>-    exp--;</div><div class='del'>-  }</div><div class='del'>-  </div><div class='del'>-  return result;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-static long round_argp (LDOUBLE value)</div><div class='del'>-{</div><div class='del'>-  long intpart;</div><div class='del'>-</div><div class='del'>-  intpart = value;</div><div class='del'>-  value = value - intpart;</div><div class='del'>-  if (value &gt;= 0.5)</div><div class='del'>-    intpart++;</div><div class='del'>-</div><div class='del'>-  return intpart;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-static int fmtfp (char *buffer, size_t *currlen, size_t maxlen,</div><div class='del'>-		  LDOUBLE fvalue, int min, int max, int flags)</div><div class='del'>-{</div><div class='del'>-  int signvalue = 0;</div><div class='del'>-  LDOUBLE ufvalue;</div><div class='del'>-  char iconvert[20];</div><div class='del'>-  char fconvert[20];</div><div class='del'>-  int iplace = 0;</div><div class='del'>-  int fplace = 0;</div><div class='del'>-  int padlen = 0; /* amount to pad */</div><div class='del'>-  int zpadlen = 0; </div><div class='del'>-  int caps = 0;</div><div class='del'>-  int total = 0;</div><div class='del'>-  long intpart;</div><div class='del'>-  long fracpart;</div><div class='del'>-  </div><div class='del'>-  /* </div><div class='del'>-   * AIX manpage says the default is 0, but Solaris says the default</div><div class='del'>-   * is 6, and sprintf on AIX defaults to 6</div><div class='del'>-   */</div><div class='del'>-  if (max &lt; 0)</div><div class='del'>-    max = 6;</div><div class='del'>-</div><div class='del'>-  ufvalue = abs_val (fvalue);</div><div class='del'>-</div><div class='del'>-  if (fvalue &lt; 0)</div><div class='del'>-    signvalue = '-';</div><div class='del'>-  else</div><div class='del'>-    if (flags &amp; DP_F_PLUS)  /* Do a sign (+/i) */</div><div class='del'>-      signvalue = '+';</div><div class='del'>-    else</div><div class='del'>-      if (flags &amp; DP_F_SPACE)</div><div class='del'>-	signvalue = ' ';</div><div class='del'>-</div><div class='del'>-#if 0</div><div class='del'>-  if (flags &amp; DP_F_UP) caps = 1; /* Should characters be upper case? */</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-  intpart = ufvalue;</div><div class='del'>-</div><div class='del'>-  /* </div><div class='del'>-   * Sorry, we only support 9 digits past the decimal because of our </div><div class='del'>-   * conversion method</div><div class='del'>-   */</div><div class='del'>-  if (max &gt; 9)</div><div class='del'>-    max = 9;</div><div class='del'>-</div><div class='del'>-  /* We "cheat" by converting the fractional part to integer by</div><div class='del'>-   * multiplying by a factor of 10</div><div class='del'>-   */</div><div class='del'>-  fracpart = round_argp ((pow10_argp (max)) * (ufvalue - intpart));</div><div class='del'>-</div><div class='del'>-  if (fracpart &gt;= pow10_argp (max))</div><div class='del'>-  {</div><div class='del'>-    intpart++;</div><div class='del'>-    fracpart -= pow10_argp (max);</div><div class='del'>-  }</div><div class='del'>-</div><div class='del'>-#ifdef DEBUG_SNPRINTF</div><div class='del'>-  dprint (1, (debugfile, "fmtfp: %f =? %d.%d\n", fvalue, intpart, fracpart));</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-  /* Convert integer part */</div><div class='del'>-  do {</div><div class='del'>-    iconvert[iplace++] =</div><div class='del'>-      (caps? "0123456789ABCDEF":"0123456789abcdef")[intpart % 10];</div><div class='del'>-    intpart = (intpart / 10);</div><div class='del'>-  } while(intpart &amp;&amp; (iplace &lt; 20));</div><div class='del'>-  if (iplace == 20) iplace--;</div><div class='del'>-  iconvert[iplace] = 0;</div><div class='del'>-</div><div class='del'>-  /* Convert fractional part */</div><div class='del'>-  do {</div><div class='del'>-    fconvert[fplace++] =</div><div class='del'>-      (caps? "0123456789ABCDEF":"0123456789abcdef")[fracpart % 10];</div><div class='del'>-    fracpart = (fracpart / 10);</div><div class='del'>-  } while(fracpart &amp;&amp; (fplace &lt; 20));</div><div class='del'>-  if (fplace == 20) fplace--;</div><div class='del'>-  fconvert[fplace] = 0;</div><div class='del'>-</div><div class='del'>-  /* -1 for decimal point, another -1 if we are printing a sign */</div><div class='del'>-  padlen = min - iplace - max - 1 - ((signvalue) ? 1 : 0); </div><div class='del'>-  zpadlen = max - fplace;</div><div class='del'>-  if (zpadlen &lt; 0)</div><div class='del'>-    zpadlen = 0;</div><div class='del'>-  if (padlen &lt; 0) </div><div class='del'>-    padlen = 0;</div><div class='del'>-  if (flags &amp; DP_F_MINUS) </div><div class='del'>-    padlen = -padlen; /* Left Justifty */</div><div class='del'>-</div><div class='del'>-  if ((flags &amp; DP_F_ZERO) &amp;&amp; (padlen &gt; 0)) </div><div class='del'>-  {</div><div class='del'>-    if (signvalue) </div><div class='del'>-    {</div><div class='del'>-      total += dopr_outch (buffer, currlen, maxlen, signvalue);</div><div class='del'>-      --padlen;</div><div class='del'>-      signvalue = 0;</div><div class='del'>-    }</div><div class='del'>-    while (padlen &gt; 0)</div><div class='del'>-    {</div><div class='del'>-      total += dopr_outch (buffer, currlen, maxlen, '0');</div><div class='del'>-      --padlen;</div><div class='del'>-    }</div><div class='del'>-  }</div><div class='del'>-  while (padlen &gt; 0)</div><div class='del'>-  {</div><div class='del'>-    total += dopr_outch (buffer, currlen, maxlen, ' ');</div><div class='del'>-    --padlen;</div><div class='del'>-  }</div><div class='del'>-  if (signvalue) </div><div class='del'>-    total += dopr_outch (buffer, currlen, maxlen, signvalue);</div><div class='del'>-</div><div class='del'>-  while (iplace &gt; 0) </div><div class='del'>-    total += dopr_outch (buffer, currlen, maxlen, iconvert[--iplace]);</div><div class='del'>-</div><div class='del'>-  /*</div><div class='del'>-   * Decimal point.  This should probably use locale to find the correct</div><div class='del'>-   * char to print out.</div><div class='del'>-   */</div><div class='del'>-  if (max &gt; 0)</div><div class='del'>-  {</div><div class='del'>-    total += dopr_outch (buffer, currlen, maxlen, '.');</div><div class='del'>-</div><div class='del'>-    while (fplace &gt; 0) </div><div class='del'>-      total += dopr_outch (buffer, currlen, maxlen, fconvert[--fplace]);</div><div class='del'>-  }</div><div class='del'>-</div><div class='del'>-  while (zpadlen &gt; 0)</div><div class='del'>-  {</div><div class='del'>-    total += dopr_outch (buffer, currlen, maxlen, '0');</div><div class='del'>-    --zpadlen;</div><div class='del'>-  }</div><div class='del'>-</div><div class='del'>-  while (padlen &lt; 0) </div><div class='del'>-  {</div><div class='del'>-    total += dopr_outch (buffer, currlen, maxlen, ' ');</div><div class='del'>-    ++padlen;</div><div class='del'>-  }</div><div class='del'>-</div><div class='del'>-  return total;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-static int dopr_outch (char *buffer, size_t *currlen, size_t maxlen, char c)</div><div class='del'>-{</div><div class='del'>-  if (*currlen + 1 &lt; maxlen)</div><div class='del'>-    buffer[(*currlen)++] = c;</div><div class='del'>-  return 1;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-#ifndef HAVE_VSNPRINTF</div><div class='del'>-int vsnprintf (char *str, size_t count, const char *fmt, va_list args)</div><div class='del'>-{</div><div class='del'>-  if (str != NULL)</div><div class='del'>-    str[0] = 0;</div><div class='del'>-  return dopr(str, count, fmt, args);</div><div class='del'>-}</div><div class='del'>-#endif /* !HAVE_VSNPRINTF */</div><div class='del'>-</div><div class='del'>-#ifndef HAVE_SNPRINTF</div><div class='del'>-/* VARARGS3 */</div><div class='del'>-#ifdef HAVE_STDARGS</div><div class='del'>-int snprintf (char *str,size_t count,const char *fmt,...)</div><div class='del'>-#else</div><div class='del'>-int snprintf (va_alist) va_dcl</div><div class='del'>-#endif</div><div class='del'>-{</div><div class='del'>-#ifndef HAVE_STDARGS</div><div class='del'>-  char *str;</div><div class='del'>-  size_t count;</div><div class='del'>-  char *fmt;</div><div class='del'>-#endif</div><div class='del'>-  VA_LOCAL_DECL;</div><div class='del'>-  int total;</div><div class='del'>-    </div><div class='del'>-  VA_START (fmt);</div><div class='del'>-  VA_SHIFT (str, char *);</div><div class='del'>-  VA_SHIFT (count, size_t );</div><div class='del'>-  VA_SHIFT (fmt, char *);</div><div class='del'>-  total = vsnprintf(str, count, fmt, ap);</div><div class='del'>-  VA_END;</div><div class='del'>-  return total;</div><div class='del'>-}</div><div class='del'>-#endif /* !HAVE_SNPRINTF */</div><div class='del'>-</div><div class='del'>-#ifdef TEST_SNPRINTF</div><div class='del'>-#ifndef LONG_STRING</div><div class='del'>-#define LONG_STRING 1024</div><div class='del'>-#endif</div><div class='del'>-int main (void)</div><div class='del'>-{</div><div class='del'>-  char buf1[LONG_STRING];</div><div class='del'>-  char buf2[LONG_STRING];</div><div class='del'>-  char *fp_fmt[] = {</div><div class='del'>-    "%-1.5f",</div><div class='del'>-    "%1.5f",</div><div class='del'>-    "%123.9f",</div><div class='del'>-    "%10.5f",</div><div class='del'>-    "% 10.5f",</div><div class='del'>-    "%+22.9f",</div><div class='del'>-    "%+4.9f",</div><div class='del'>-    "%01.3f",</div><div class='del'>-    "%4f",</div><div class='del'>-    "%3.1f",</div><div class='del'>-    "%3.2f",</div><div class='del'>-    "%.0f",</div><div class='del'>-    "%.1f",</div><div class='del'>-    NULL</div><div class='del'>-  };</div><div class='del'>-  double fp_nums[] = { -1.5, 134.21, 91340.2, 341.1234, 0203.9, 0.96, 0.996, </div><div class='del'>-    0.9996, 1.996, 4.136, 0};</div><div class='del'>-  char *int_fmt[] = {</div><div class='del'>-    "%-1.5d",</div><div class='del'>-    "%1.5d",</div><div class='del'>-    "%123.9d",</div><div class='del'>-    "%5.5d",</div><div class='del'>-    "%10.5d",</div><div class='del'>-    "% 10.5d",</div><div class='del'>-    "%+22.33d",</div><div class='del'>-    "%01.3d",</div><div class='del'>-    "%4d",</div><div class='del'>-    NULL</div><div class='del'>-  };</div><div class='del'>-  long int_nums[] = { -1, 134, 91340, 341, 0203, 0};</div><div class='del'>-  int x, y;</div><div class='del'>-  int fail = 0;</div><div class='del'>-  int num = 0;</div><div class='del'>-</div><div class='del'>-  printf ("Testing snprintf format codes against system sprintf...\n");</div><div class='del'>-</div><div class='del'>-  for (x = 0; fp_fmt[x] != NULL ; x++)</div><div class='del'>-    for (y = 0; fp_nums[y] != 0 ; y++)</div><div class='del'>-    {</div><div class='del'>-      snprintf (buf1, sizeof (buf1), fp_fmt[x], fp_nums[y]);</div><div class='del'>-      sprintf (buf2, fp_fmt[x], fp_nums[y]);</div><div class='del'>-      if (strcmp (buf1, buf2))</div><div class='del'>-      {</div><div class='del'>-	printf("snprintf doesn't match Format: %s\n\tsnprintf = %s\n\tsprintf  = %s\n", </div><div class='del'>-	    fp_fmt[x], buf1, buf2);</div><div class='del'>-	fail++;</div><div class='del'>-      }</div><div class='del'>-      num++;</div><div class='del'>-    }</div><div class='del'>-</div><div class='del'>-  for (x = 0; int_fmt[x] != NULL ; x++)</div><div class='del'>-    for (y = 0; int_nums[y] != 0 ; y++)</div><div class='del'>-    {</div><div class='del'>-      snprintf (buf1, sizeof (buf1), int_fmt[x], int_nums[y]);</div><div class='del'>-      sprintf (buf2, int_fmt[x], int_nums[y]);</div><div class='del'>-      if (strcmp (buf1, buf2))</div><div class='del'>-      {</div><div class='del'>-	printf("snprintf doesn't match Format: %s\n\tsnprintf = %s\n\tsprintf  = %s\n", </div><div class='del'>-	    int_fmt[x], buf1, buf2);</div><div class='del'>-	fail++;</div><div class='del'>-      }</div><div class='del'>-      num++;</div><div class='del'>-    }</div><div class='del'>-  printf ("%d tests failed out of %d.\n", fail, num);</div><div class='del'>-}</div><div class='del'>-#endif /* SNPRINTF_TEST */</div><div class='del'>-</div><div class='del'>-#endif /* !HAVE_SNPRINTF */</div><div class='head'>diff --git a/autogen.sh b/autogen.sh<br/>index e20408bf2ea..c8cdc3f89fa 100755<br/>--- a/<a href='/cgit/glusterfs.git/tree/autogen.sh?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>autogen.sh</a><br/>+++ b/<a href='/cgit/glusterfs.git/tree/autogen.sh?id=d1d7a6f35c816822fab51c820e25023863c239c1'>autogen.sh</a></div><div class='hunk'>@@ -1,8 +1,92 @@</div><div class='ctx'> #!/bin/sh</div><div class='ctx'> </div><div class='del'>-aclocal</div><div class='del'>-autoheader</div><div class='del'>-(libtoolize --automake --copy --force || glibtoolize --automake --copy --force)</div><div class='del'>-autoconf</div><div class='del'>-automake --add-missing --copy --foreign</div><div class='del'>-cd argp-standalone;./autogen.sh</div><div class='add'>+echo</div><div class='add'>+echo ... GlusterFS autogen ...</div><div class='add'>+echo</div><div class='add'>+</div><div class='add'>+## Check all dependencies are present</div><div class='add'>+MISSING=""</div><div class='add'>+</div><div class='add'>+# Check for aclocal</div><div class='add'>+env aclocal --version &gt; /dev/null 2&gt;&amp;1</div><div class='add'>+if [ $? -eq 0 ]; then</div><div class='add'>+  ACLOCAL=aclocal</div><div class='add'>+else</div><div class='add'>+  MISSING="$MISSING aclocal"</div><div class='add'>+fi</div><div class='add'>+</div><div class='add'>+# Check for autoconf</div><div class='add'>+env autoconf --version &gt; /dev/null 2&gt;&amp;1</div><div class='add'>+if [ $? -eq 0 ]; then</div><div class='add'>+  AUTOCONF=autoconf</div><div class='add'>+else</div><div class='add'>+  MISSING="$MISSING autoconf"</div><div class='add'>+fi</div><div class='add'>+</div><div class='add'>+# Check for autoheader</div><div class='add'>+env autoheader --version &gt; /dev/null 2&gt;&amp;1</div><div class='add'>+if [ $? -eq 0 ]; then</div><div class='add'>+  AUTOHEADER=autoheader</div><div class='add'>+else</div><div class='add'>+  MISSING="$MISSING autoheader"</div><div class='add'>+fi</div><div class='add'>+</div><div class='add'>+# Check for automake</div><div class='add'>+env automake --version &gt; /dev/null 2&gt;&amp;1</div><div class='add'>+if [ $? -eq 0 ]; then</div><div class='add'>+  AUTOMAKE=automake</div><div class='add'>+else</div><div class='add'>+  MISSING="$MISSING automake"</div><div class='add'>+fi</div><div class='add'>+</div><div class='add'>+# Check for libtoolize or glibtoolize</div><div class='add'>+env libtoolize --version &gt; /dev/null 2&gt;&amp;1</div><div class='add'>+if [ $? -eq 0 ]; then</div><div class='add'>+  # libtoolize was found, so use it</div><div class='add'>+  TOOL=libtoolize</div><div class='add'>+else</div><div class='add'>+  # libtoolize wasn't found, so check for glibtoolize</div><div class='add'>+  env glibtoolize --version &gt; /dev/null 2&gt;&amp;1</div><div class='add'>+  if [ $? -eq 0 ]; then</div><div class='add'>+    TOOL=glibtoolize</div><div class='add'>+  else</div><div class='add'>+    MISSING="$MISSING libtoolize/glibtoolize"</div><div class='add'>+  fi</div><div class='add'>+fi</div><div class='add'>+</div><div class='add'>+# Check for tar</div><div class='add'>+env tar -cf /dev/null /dev/null &gt; /dev/null 2&gt;&amp;1</div><div class='add'>+if [ $? -ne 0 ]; then</div><div class='add'>+  MISSING="$MISSING tar"</div><div class='add'>+fi</div><div class='add'>+</div><div class='add'>+## If dependencies are missing, warn the user and abort</div><div class='add'>+if [ "x$MISSING" != "x" ]; then</div><div class='add'>+  echo "Aborting."</div><div class='add'>+  echo</div><div class='add'>+  echo "The following build tools are missing:"</div><div class='add'>+  echo</div><div class='add'>+  for pkg in $MISSING; do</div><div class='add'>+    echo "  * $pkg"</div><div class='add'>+  done</div><div class='add'>+  echo</div><div class='add'>+  echo "Please install them and try again."</div><div class='add'>+  echo</div><div class='add'>+  exit 1</div><div class='add'>+fi</div><div class='add'>+</div><div class='add'>+## Do the autogeneration</div><div class='add'>+echo Running ${ACLOCAL}...</div><div class='add'>+$ACLOCAL -I ./contrib/aclocal</div><div class='add'>+echo Running ${AUTOHEADER}...</div><div class='add'>+$AUTOHEADER</div><div class='add'>+echo Running ${TOOL}...</div><div class='add'>+$TOOL --automake --copy --force</div><div class='add'>+echo Running ${AUTOCONF}...</div><div class='add'>+$AUTOCONF</div><div class='add'>+echo Running ${AUTOMAKE}...</div><div class='add'>+$AUTOMAKE --add-missing --force-missing --copy</div><div class='add'>+</div><div class='add'>+# Instruct user on next steps</div><div class='add'>+echo</div><div class='add'>+echo "Please proceed with configuring, compiling, and installing."</div><div class='head'>diff --git a/booster/Makefile.am b/booster/Makefile.am<br/>deleted file mode 100644<br/>index e1c45f3051c..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/booster/Makefile.am?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>booster/Makefile.am</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1 +0,0 @@</div><div class='del'>-SUBDIRS=src
\ No newline at end of file</div><div class='head'>diff --git a/booster/src/Makefile.am b/booster/src/Makefile.am<br/>deleted file mode 100644<br/>index d7d83abf5ee..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/booster/src/Makefile.am?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>booster/src/Makefile.am</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,21 +0,0 @@</div><div class='del'>-ldpreload_LTLIBRARIES = libglusterfs-booster.la</div><div class='del'>-ldpreloaddir = $(libdir)/glusterfs</div><div class='del'>-noinst_HEADERS = booster_fstab.h booster-fd.h</div><div class='del'>-libglusterfs_booster_la_SOURCES = booster.c booster_stat.c booster_fstab.c booster-fd.c</div><div class='del'>-libglusterfs_booster_la_CFLAGS = -I$(top_srcdir)/libglusterfsclient/src/ -D_GNU_SOURCE -D$(GF_HOST_OS) -fPIC -Wall \</div><div class='del'>-	-pthread $(GF_BOOSTER_CFLAGS) -shared -nostartfiles </div><div class='del'>-libglusterfs_booster_la_CPPFLAGS = -D_FILE_OFFSET_BITS=64 -D_GNU_SOURCE  \</div><div class='del'>-	-I$(top_srcdir)/libglusterfsclient/src \</div><div class='del'>-	-I$(top_srcdir)/libglusterfs/src -DDATADIR=\"$(localstatedir)\" \</div><div class='del'>-	-DCONFDIR=\"$(sysconfdir)/glusterfs\" $(ARGP_STANDALONE_CPPFLAGS)</div><div class='del'>-</div><div class='del'>-libglusterfs_booster_la_LDFLAGS = -module -avoidversion</div><div class='del'>-libglusterfs_booster_la_LIBADD =  $(top_builddir)/libglusterfs/src/libglusterfs.la $(top_builddir)/libglusterfsclient/src/libglusterfsclient.la</div><div class='del'>-</div><div class='del'>-CLEANFILES =</div><div class='del'>-</div><div class='del'>-uninstall-local:</div><div class='del'>-	rm -f $(DESTDIR)$(ldpreloaddir)/glusterfs-booster.so</div><div class='del'>-</div><div class='del'>-install-data-hook:</div><div class='del'>-	ln -sf libglusterfs-booster.so $(DESTDIR)$(ldpreloaddir)/glusterfs-booster.so</div><div class='head'>diff --git a/booster/src/booster-fd.c b/booster/src/booster-fd.c<br/>deleted file mode 100644<br/>index 8df9fd51c66..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/booster/src/booster-fd.c?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>booster/src/booster-fd.c</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,342 +0,0 @@</div><div class='del'>-/*</div><div class='del'>-  Copyright (c) 2009 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='del'>-  This file is part of GlusterFS.</div><div class='del'>-</div><div class='del'>-  GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-  it under the terms of the GNU General Public License as published</div><div class='del'>-  by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-  or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-  GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-  WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-  General Public License for more details.</div><div class='del'>-</div><div class='del'>-  You should have received a copy of the GNU General Public License</div><div class='del'>-  along with this program.  If not, see</div><div class='del'>-  &lt;http://www.gnu.org/licenses/&gt;.</div><div class='del'>-*/</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-#include "booster-fd.h"</div><div class='del'>-#include &lt;logging.h&gt;</div><div class='del'>-#include &lt;mem-pool.h&gt;</div><div class='del'>-#include &lt;stdlib.h&gt;</div><div class='del'>-#include &lt;errno.h&gt;</div><div class='del'>-#include &lt;common-utils.h&gt;</div><div class='del'>-#include &lt;string.h&gt;</div><div class='del'>-</div><div class='del'>-#include &lt;assert.h&gt;</div><div class='del'>-</div><div class='del'>-extern fd_t *</div><div class='del'>-fd_ref (fd_t *fd);</div><div class='del'>-</div><div class='del'>-extern void</div><div class='del'>-fd_unref (fd_t *fd);</div><div class='del'>-/*</div><div class='del'>-   Allocate in memory chunks of power of 2 starting from 1024B</div><div class='del'>-   Assumes fdtable-&gt;lock is held</div><div class='del'>-   */</div><div class='del'>-static inline uint</div><div class='del'>-gf_roundup_power_of_two (uint nr)</div><div class='del'>-{</div><div class='del'>-        uint result = 1;</div><div class='del'>-</div><div class='del'>-        if (nr &lt; 0) {</div><div class='del'>-                gf_log ("booster-fd", GF_LOG_ERROR, "Negative number passed");</div><div class='del'>-                return -1;</div><div class='del'>-        }</div><div class='del'>-        </div><div class='del'>-        while (result &lt;= nr)</div><div class='del'>-                result *= 2;</div><div class='del'>-</div><div class='del'>-        return result;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-#define BOOSTER_NFDBITS (sizeof (unsigned long))</div><div class='del'>-</div><div class='del'>-#define BOOSTER_FDMASK(d)             (1UL &lt;&lt; ((d) % BOOSTER_NFDBITS))</div><div class='del'>-#define BOOSTER_FDELT(d)              (d / BOOSTER_NFDBITS)</div><div class='del'>-#define BOOSTER_FD_SET(set, d)        (set-&gt;fd_bits[BOOSTER_FDELT(d)] |= BOOSTER_FDMASK(d))</div><div class='del'>-#define BOOSTER_FD_CLR(set, d)        (set-&gt;fd_bits[BOOSTER_FDELT(d)] &amp;= ~BOOSTER_FDMASK(d))</div><div class='del'>-#define BOOSTER_FD_ISSET(set, d)      (set-&gt;fd_bits[BOOSTER_FDELT(d)] &amp; BOOSTER_FDMASK(d))</div><div class='del'>-</div><div class='del'>-inline int</div><div class='del'>-booster_get_close_on_exec (booster_fdtable_t *fdtable, int fd)</div><div class='del'>-{</div><div class='del'>-        return BOOSTER_FD_ISSET(fdtable-&gt;close_on_exec, fd);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-inline void</div><div class='del'>-booster_set_close_on_exec (booster_fdtable_t *fdtable, int fd)</div><div class='del'>-{</div><div class='del'>-        BOOSTER_FD_SET(fdtable-&gt;close_on_exec, fd);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-booster_fdtable_expand (booster_fdtable_t *fdtable, uint nr)</div><div class='del'>-{</div><div class='del'>-        fd_t    **oldfds = NULL, **tmp = NULL;</div><div class='del'>-        uint    oldmax_fds = -1;</div><div class='del'>-        uint    cpy = 0;</div><div class='del'>-        int32_t ret = -1, bytes = 0;</div><div class='del'>-        booster_fd_set_t *oldclose_on_exec = NULL;</div><div class='del'>-</div><div class='del'>-        if (fdtable == NULL || nr &lt; 0) {</div><div class='del'>-                gf_log ("booster-fd", GF_LOG_ERROR, "Invalid argument");</div><div class='del'>-                errno = EINVAL;</div><div class='del'>-                ret = -1;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        nr /= (1024 / sizeof (fd_t *));</div><div class='del'>-        nr = gf_roundup_power_of_two (nr + 1);</div><div class='del'>-        nr *= (1024 / sizeof (fd_t *));</div><div class='del'>-</div><div class='del'>-        oldfds = fdtable-&gt;fds;</div><div class='del'>-        oldmax_fds = fdtable-&gt;max_fds;</div><div class='del'>-        oldclose_on_exec = fdtable-&gt;close_on_exec;</div><div class='del'>-</div><div class='del'>-        fdtable-&gt;fds = CALLOC (nr, sizeof (fd_t *));</div><div class='del'>-        if (fdtable-&gt;fds == NULL) {</div><div class='del'>-                gf_log ("booster-fd", GF_LOG_ERROR, "Memory allocation failed");</div><div class='del'>-                fdtable-&gt;fds = oldfds;</div><div class='del'>-                oldfds = NULL;</div><div class='del'>-                ret = -1;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        fdtable-&gt;max_fds = nr;</div><div class='del'>-</div><div class='del'>-        if (oldfds) {</div><div class='del'>-                cpy = oldmax_fds * sizeof (fd_t *);</div><div class='del'>-                memcpy (fdtable-&gt;fds, oldfds, cpy);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        /* nr will be either less than 8 or a multiple of 8 */</div><div class='del'>-        bytes = nr/8;</div><div class='del'>-        bytes = bytes ? bytes : 1;</div><div class='del'>-        fdtable-&gt;close_on_exec = CALLOC (bytes, 1);</div><div class='del'>-        if (fdtable-&gt;close_on_exec == NULL) {</div><div class='del'>-                gf_log ("booster-fd", GF_LOG_ERROR, "Memory allocation "</div><div class='del'>-                        "failed");</div><div class='del'>-                tmp = fdtable-&gt;fds;</div><div class='del'>-                fdtable-&gt;fds = oldfds;</div><div class='del'>-                oldfds = tmp;</div><div class='del'>-                ret = -1;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (oldclose_on_exec != NULL) {</div><div class='del'>-                bytes = oldmax_fds/8;</div><div class='del'>-                cpy = bytes ? bytes : 1;</div><div class='del'>-                memcpy (fdtable-&gt;close_on_exec, oldclose_on_exec, cpy);</div><div class='del'>-        }</div><div class='del'>-        gf_log ("booster-fd", GF_LOG_TRACE, "FD-table expanded: Old: %d,New: %d"</div><div class='del'>-                , oldmax_fds, nr);</div><div class='del'>-        ret = 0;</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        FREE (oldfds);</div><div class='del'>-        FREE (oldclose_on_exec);</div><div class='del'>-</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-booster_fdtable_t *</div><div class='del'>-booster_fdtable_alloc (void)</div><div class='del'>-{</div><div class='del'>-        booster_fdtable_t *fdtable = NULL;</div><div class='del'>-        int32_t            ret = -1;</div><div class='del'>-</div><div class='del'>-        fdtable = CALLOC (1, sizeof (*fdtable));</div><div class='del'>-        GF_VALIDATE_OR_GOTO ("booster-fd", fdtable, out);</div><div class='del'>-</div><div class='del'>-        LOCK_INIT (&amp;fdtable-&gt;lock);</div><div class='del'>-</div><div class='del'>-        LOCK (&amp;fdtable-&gt;lock);</div><div class='del'>-        {</div><div class='del'>-                ret = booster_fdtable_expand (fdtable, 0);</div><div class='del'>-        }</div><div class='del'>-        UNLOCK (&amp;fdtable-&gt;lock);</div><div class='del'>-</div><div class='del'>-        if (ret == -1) {</div><div class='del'>-                gf_log ("booster-fd", GF_LOG_ERROR, "FD-table allocation "</div><div class='del'>-                        "failed");</div><div class='del'>-                FREE (fdtable);</div><div class='del'>-                fdtable = NULL;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        return fdtable;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-fd_t **</div><div class='del'>-__booster_fdtable_get_all_fds (booster_fdtable_t *fdtable, uint *count)</div><div class='del'>-{</div><div class='del'>-        fd_t **fds = NULL;</div><div class='del'>-</div><div class='del'>-        if (count == NULL)</div><div class='del'>-                goto out;</div><div class='del'>-</div><div class='del'>-        fds = fdtable-&gt;fds;</div><div class='del'>-        fdtable-&gt;fds = calloc (fdtable-&gt;max_fds, sizeof (fd_t *));</div><div class='del'>-        *count = fdtable-&gt;max_fds;</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        return fds;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-fd_t **</div><div class='del'>-booster_fdtable_get_all_fds (booster_fdtable_t *fdtable, uint *count)</div><div class='del'>-{</div><div class='del'>-        fd_t **fds = NULL;</div><div class='del'>-        if (!fdtable)</div><div class='del'>-                return NULL;</div><div class='del'>-</div><div class='del'>-        LOCK (&amp;fdtable-&gt;lock);</div><div class='del'>-        {</div><div class='del'>-                fds = __booster_fdtable_get_all_fds (fdtable, count);</div><div class='del'>-        }</div><div class='del'>-        UNLOCK (&amp;fdtable-&gt;lock);</div><div class='del'>-</div><div class='del'>-        return fds;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-void</div><div class='del'>-booster_fdtable_destroy (booster_fdtable_t *fdtable)</div><div class='del'>-{</div><div class='del'>-        fd_t                    *fd = NULL;</div><div class='del'>-        fd_t                    **fds = NULL;</div><div class='del'>-        uint                    fd_count = 0;</div><div class='del'>-        int                     i = 0;</div><div class='del'>-</div><div class='del'>-        if (!fdtable)</div><div class='del'>-                return;</div><div class='del'>-</div><div class='del'>-        LOCK (&amp;fdtable-&gt;lock);</div><div class='del'>-        {</div><div class='del'>-                fds = __booster_fdtable_get_all_fds (fdtable, &amp;fd_count);</div><div class='del'>-                FREE (fdtable-&gt;fds);</div><div class='del'>-        }</div><div class='del'>-        UNLOCK (&amp;fdtable-&gt;lock);</div><div class='del'>-</div><div class='del'>-        if (!fds)</div><div class='del'>-                goto free_table;</div><div class='del'>-        </div><div class='del'>-        for (i = 0; i &lt; fd_count; i++) {</div><div class='del'>-                fd = fds[i];</div><div class='del'>-                if (fd != NULL)</div><div class='del'>-                        fd_unref (fd);</div><div class='del'>-        }</div><div class='del'>-        FREE (fds);</div><div class='del'>-free_table:</div><div class='del'>-        LOCK_DESTROY (&amp;fdtable-&gt;lock);</div><div class='del'>-        FREE (fdtable);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-booster_fd_unused_get (booster_fdtable_t *fdtable, fd_t *fdptr, int fd)</div><div class='del'>-{</div><div class='del'>-        int ret = -1;</div><div class='del'>-        int error = 0;</div><div class='del'>-</div><div class='del'>-        if (fdtable == NULL || fdptr == NULL || fd &lt; 0) {</div><div class='del'>-                gf_log ("booster-fd", GF_LOG_ERROR, "invalid argument");</div><div class='del'>-                errno = EINVAL;</div><div class='del'>-                return -1;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        gf_log ("booster-fd", GF_LOG_TRACE, "Requested fd: %d", fd);</div><div class='del'>-        LOCK (&amp;fdtable-&gt;lock);</div><div class='del'>-        {</div><div class='del'>-                while (fdtable-&gt;max_fds &lt; fd) {</div><div class='del'>-                        error = 0;</div><div class='del'>-                        error = booster_fdtable_expand (fdtable,</div><div class='del'>-                                                        fdtable-&gt;max_fds + 1);</div><div class='del'>-                        if (error) {</div><div class='del'>-                                gf_log ("booster-fd", GF_LOG_ERROR,</div><div class='del'>-                                        "Cannot expand fdtable:%s",</div><div class='del'>-                                        strerror (error));</div><div class='del'>-                                goto err;</div><div class='del'>-                        }</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                if (!fdtable-&gt;fds[fd]) {</div><div class='del'>-                        fdtable-&gt;fds[fd] = fdptr;</div><div class='del'>-                        fd_ref (fdptr);</div><div class='del'>-                        ret = fd;</div><div class='del'>-                } else</div><div class='del'>-                        gf_log ("booster-fd", GF_LOG_ERROR, "Cannot allocate fd"</div><div class='del'>-                                " %d (slot not empty in fdtable)", fd);</div><div class='del'>-        }</div><div class='del'>-err:</div><div class='del'>-        UNLOCK (&amp;fdtable-&gt;lock);</div><div class='del'>-</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-void</div><div class='del'>-booster_fd_put (booster_fdtable_t *fdtable, int fd)</div><div class='del'>-{</div><div class='del'>-        fd_t *fdptr = NULL;</div><div class='del'>-        if (fdtable == NULL || fd &lt; 0) {</div><div class='del'>-                gf_log ("booster-fd", GF_LOG_ERROR, "invalid argument");</div><div class='del'>-                return;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        gf_log ("booster-fd", GF_LOG_TRACE, "FD put: %d", fd);</div><div class='del'>-        if (!(fd &lt; fdtable-&gt;max_fds)) {</div><div class='del'>-                gf_log ("booster-fd", GF_LOG_ERROR, "FD not in booster fd"</div><div class='del'>-                        " table");</div><div class='del'>-                return;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        LOCK (&amp;fdtable-&gt;lock);</div><div class='del'>-        {</div><div class='del'>-                fdptr = fdtable-&gt;fds[fd];</div><div class='del'>-                fdtable-&gt;fds[fd] = NULL;</div><div class='del'>-        }</div><div class='del'>-        UNLOCK (&amp;fdtable-&gt;lock);</div><div class='del'>-</div><div class='del'>-        if (fdptr)</div><div class='del'>-                fd_unref (fdptr);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-fd_t *</div><div class='del'>-booster_fdptr_get (booster_fdtable_t *fdtable, int fd)</div><div class='del'>-{</div><div class='del'>-        fd_t *fdptr = NULL;</div><div class='del'>-</div><div class='del'>-        if (fdtable == NULL || fd &lt; 0) {</div><div class='del'>-                gf_log ("booster-fd", GF_LOG_ERROR, "invalid argument");</div><div class='del'>-                errno = EINVAL;</div><div class='del'>-                return NULL;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        gf_log ("booster-fd", GF_LOG_TRACE, "FD ptr request: %d", fd);</div><div class='del'>-        if (!(fd &lt; fdtable-&gt;max_fds)) {</div><div class='del'>-                gf_log ("booster-fd", GF_LOG_ERROR, "FD not in booster fd"</div><div class='del'>-                        " table");</div><div class='del'>-                errno = EINVAL;</div><div class='del'>-                return NULL;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        LOCK (&amp;fdtable-&gt;lock);</div><div class='del'>-        {</div><div class='del'>-                fdptr = fdtable-&gt;fds[fd];</div><div class='del'>-                if (fdptr)</div><div class='del'>-                        fd_ref (fdptr);</div><div class='del'>-        }</div><div class='del'>-        UNLOCK (&amp;fdtable-&gt;lock);</div><div class='del'>-</div><div class='del'>-        return fdptr;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-void</div><div class='del'>-booster_fdptr_put (fd_t *booster_fd)</div><div class='del'>-{</div><div class='del'>-        if (booster_fd)</div><div class='del'>-                fd_unref (booster_fd);</div><div class='del'>-}</div><div class='head'>diff --git a/booster/src/booster-fd.h b/booster/src/booster-fd.h<br/>deleted file mode 100644<br/>index dd6d00d5c97..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/booster/src/booster-fd.h?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>booster/src/booster-fd.h</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,84 +0,0 @@</div><div class='del'>-/*</div><div class='del'>-  Copyright (c) 2009 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='del'>-  This file is part of GlusterFS.</div><div class='del'>-</div><div class='del'>-  GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-  it under the terms of the GNU General Public License as published</div><div class='del'>-  by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-  or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-  GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-  WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-  General Public License for more details.</div><div class='del'>-</div><div class='del'>-  You should have received a copy of the GNU General Public License</div><div class='del'>-  along with this program.  If not, see</div><div class='del'>-  &lt;http://www.gnu.org/licenses/&gt;.</div><div class='del'>-*/</div><div class='del'>-</div><div class='del'>-#ifndef _BOOSTER_FD_H</div><div class='del'>-#define _BOOSTER_FD_H</div><div class='del'>-</div><div class='del'>-#include &lt;libglusterfsclient.h&gt;</div><div class='del'>-#include &lt;locking.h&gt;</div><div class='del'>-#include &lt;list.h&gt;</div><div class='del'>-</div><div class='del'>-/* This struct must be updated if the fd_t in fd.h changes.</div><div class='del'>- * We cannot include those headers here because unistd.h, included</div><div class='del'>- * by glusterfs headers, conflicts with the syscall prototypes we</div><div class='del'>- * define for booster.</div><div class='del'>- */</div><div class='del'>-struct _fd {</div><div class='del'>-        pid_t             pid;</div><div class='del'>-	int32_t           flags;</div><div class='del'>-        int32_t           refcount;</div><div class='del'>-        uint64_t          flush_unique;</div><div class='del'>-        struct list_head  inode_list;</div><div class='del'>-        struct _inode    *inode;</div><div class='del'>-        struct _dict     *ctx;</div><div class='del'>-        gf_lock_t         lock; /* used ONLY for manipulating</div><div class='del'>-                                   'struct _fd_ctx' array (_ctx).*/</div><div class='del'>-	struct _fd_ctx   *_ctx;</div><div class='del'>-};</div><div class='del'>-typedef struct _fd fd_t;</div><div class='del'>-</div><div class='del'>-struct _booster_fd_set {</div><div class='del'>-        unsigned long fd_bits[0];</div><div class='del'>-};</div><div class='del'>-typedef struct _booster_fd_set booster_fd_set_t;</div><div class='del'>-</div><div class='del'>-struct _booster_fdtable {</div><div class='del'>-        booster_fd_set_t *close_on_exec;</div><div class='del'>-        int               refcount;</div><div class='del'>-        unsigned int      max_fds;</div><div class='del'>-        gf_lock_t         lock;</div><div class='del'>-        fd_t            **fds;</div><div class='del'>-};</div><div class='del'>-typedef struct _booster_fdtable booster_fdtable_t;</div><div class='del'>-</div><div class='del'>-void</div><div class='del'>-booster_set_close_on_exec (booster_fdtable_t *fdtable, int fd);</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-booster_get_close_on_exec (booster_fdtable_t *fdtable, int fd);</div><div class='del'>-</div><div class='del'>-extern int</div><div class='del'>-booster_fd_unused_get (booster_fdtable_t *fdtable, fd_t *fdptr, int fd);</div><div class='del'>-</div><div class='del'>-extern void</div><div class='del'>-booster_fd_put (booster_fdtable_t *fdtable, int fd);</div><div class='del'>-</div><div class='del'>-extern fd_t *</div><div class='del'>-booster_fdptr_get (booster_fdtable_t *fdtable, int fd);</div><div class='del'>-</div><div class='del'>-extern void</div><div class='del'>-booster_fdptr_put (fd_t *fdptr);</div><div class='del'>-</div><div class='del'>-extern void</div><div class='del'>-booster_fdtable_destroy (booster_fdtable_t *fdtable);</div><div class='del'>-</div><div class='del'>-booster_fdtable_t *</div><div class='del'>-booster_fdtable_alloc (void);</div><div class='del'>-</div><div class='del'>-#endif /* #ifndef _BOOSTER_FD_H */</div><div class='head'>diff --git a/booster/src/booster.c b/booster/src/booster.c<br/>deleted file mode 100644<br/>index d767465985d..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/booster/src/booster.c?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>booster/src/booster.c</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,3172 +0,0 @@</div><div class='del'>-/*</div><div class='del'>-   Copyright (c) 2007-2009 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='del'>-   This file is part of GlusterFS.</div><div class='del'>-</div><div class='del'>-   GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-   it under the terms of the GNU General Public License as published</div><div class='del'>-   by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-   or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-   GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-   WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-   General Public License for more details.</div><div class='del'>-</div><div class='del'>-   You should have received a copy of the GNU General Public License</div><div class='del'>-   along with this program.  If not, see</div><div class='del'>-   &lt;http://www.gnu.org/licenses/&gt;.</div><div class='del'>-*/</div><div class='del'>-</div><div class='del'>-#ifndef _CONFIG_H</div><div class='del'>-#define _CONFIG_H</div><div class='del'>-#include "config.h"</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-#include &lt;dlfcn.h&gt;</div><div class='del'>-#include &lt;sys/types.h&gt;</div><div class='del'>-#include &lt;sys/uio.h&gt;</div><div class='del'>-#include &lt;stdio.h&gt;</div><div class='del'>-#include &lt;stdarg.h&gt;</div><div class='del'>-#include &lt;stdlib.h&gt;</div><div class='del'>-#include &lt;inttypes.h&gt;</div><div class='del'>-#include &lt;libglusterfsclient.h&gt;</div><div class='del'>-#include &lt;list.h&gt;</div><div class='del'>-#include &lt;pthread.h&gt;</div><div class='del'>-#include &lt;sys/xattr.h&gt;</div><div class='del'>-#include &lt;string.h&gt;</div><div class='del'>-#include &lt;assert.h&gt;</div><div class='del'>-#include &lt;errno.h&gt;</div><div class='del'>-#include &lt;ctype.h&gt;</div><div class='del'>-#include &lt;logging.h&gt;</div><div class='del'>-#include &lt;utime.h&gt;</div><div class='del'>-#include &lt;dirent.h&gt;</div><div class='del'>-#include &lt;sys/statfs.h&gt;</div><div class='del'>-#include &lt;sys/statvfs.h&gt;</div><div class='del'>-#include &lt;fcntl.h&gt;</div><div class='del'>-#include "booster-fd.h"</div><div class='del'>-</div><div class='del'>-#ifndef GF_UNIT_KB</div><div class='del'>-#define GF_UNIT_KB 1024</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-static pthread_mutex_t cwdlock   = PTHREAD_MUTEX_INITIALIZER;</div><div class='del'>-</div><div class='del'>-/* attr constructor registers this function with libc's</div><div class='del'>- * _init function as a function that must be called before</div><div class='del'>- * the main() of the program.</div><div class='del'>- */</div><div class='del'>-static void booster_lib_init (void) __attribute__((constructor));</div><div class='del'>-</div><div class='del'>-extern fd_t *</div><div class='del'>-fd_ref (fd_t *fd);</div><div class='del'>-</div><div class='del'>-extern void</div><div class='del'>-fd_unref (fd_t *fd);</div><div class='del'>-</div><div class='del'>-extern int pipe (int filedes[2]);</div><div class='del'>-/* We define these flags so that we can remove fcntl.h from the include path.</div><div class='del'>- * fcntl.h has certain defines and other lines of code that redirect the</div><div class='del'>- * application's open and open64 calls to the syscalls defined by</div><div class='del'>- * libc, for us, thats not a Good Thing (TM).</div><div class='del'>- */</div><div class='del'>-#ifndef GF_O_CREAT</div><div class='del'>-#define GF_O_CREAT      0x40</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-#ifndef GF_O_TRUNC</div><div class='del'>-#define GF_O_TRUNC      0x200</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-#ifndef GF_O_RDWR</div><div class='del'>-#define GF_O_RDWR       0x2</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-#ifndef GF_O_WRONLY</div><div class='del'>-#define GF_O_WRONLY     0x1</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-#ifndef UNIX_PATH_MAX</div><div class='del'>-#define UNIX_PATH_MAX 108</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-typedef enum {</div><div class='del'>-        BOOSTER_OPEN,</div><div class='del'>-        BOOSTER_CREAT</div><div class='del'>-} booster_op_t;</div><div class='del'>-</div><div class='del'>-struct _inode;</div><div class='del'>-struct _dict;</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-write (int fd, const void *buf, size_t count);</div><div class='del'>-</div><div class='del'>-/* open, open64, creat */</div><div class='del'>-static int (*real_open) (const char *pathname, int flags, ...);</div><div class='del'>-static int (*real_open64) (const char *pathname, int flags, ...);</div><div class='del'>-static int (*real_creat) (const char *pathname, mode_t mode);</div><div class='del'>-static int (*real_creat64) (const char *pathname, mode_t mode);</div><div class='del'>-</div><div class='del'>-/* read, readv, pread, pread64 */</div><div class='del'>-static ssize_t (*real_read) (int fd, void *buf, size_t count);</div><div class='del'>-static ssize_t (*real_readv) (int fd, const struct iovec *vector, int count);</div><div class='del'>-static ssize_t (*real_pread) (int fd, void *buf, size_t count,</div><div class='del'>-                              unsigned long offset);</div><div class='del'>-static ssize_t (*real_pread64) (int fd, void *buf, size_t count,</div><div class='del'>-                                uint64_t offset);</div><div class='del'>-</div><div class='del'>-/* write, writev, pwrite, pwrite64 */</div><div class='del'>-static ssize_t (*real_write) (int fd, const void *buf, size_t count);</div><div class='del'>-static ssize_t (*real_writev) (int fd, const struct iovec *vector, int count);</div><div class='del'>-static ssize_t (*real_pwrite) (int fd, const void *buf, size_t count,</div><div class='del'>-                               unsigned long offset);</div><div class='del'>-static ssize_t (*real_pwrite64) (int fd, const void *buf, size_t count,</div><div class='del'>-                                 uint64_t offset);</div><div class='del'>-</div><div class='del'>-/* lseek, llseek, lseek64 */</div><div class='del'>-static off_t (*real_lseek) (int fildes, unsigned long offset, int whence);</div><div class='del'>-static off_t (*real_lseek64) (int fildes, uint64_t offset, int whence);</div><div class='del'>-</div><div class='del'>-/* close */</div><div class='del'>-static int (*real_close) (int fd);</div><div class='del'>-</div><div class='del'>-/* dup dup2 */</div><div class='del'>-static int (*real_dup) (int fd);</div><div class='del'>-static int (*real_dup2) (int oldfd, int newfd);</div><div class='del'>-</div><div class='del'>-static pid_t (*real_fork) (void);</div><div class='del'>-static int (*real_mkdir) (const char *pathname, mode_t mode);</div><div class='del'>-static int (*real_rmdir) (const char *pathname);</div><div class='del'>-static int (*real_chmod) (const char *pathname, mode_t mode);</div><div class='del'>-static int (*real_chown) (const char *pathname, uid_t owner, gid_t group);</div><div class='del'>-static int (*real_fchmod) (int fd, mode_t mode);</div><div class='del'>-static int (*real_fchown) (int fd, uid_t, gid_t gid);</div><div class='del'>-static int (*real_fsync) (int fd);</div><div class='del'>-static int (*real_ftruncate) (int fd, off_t length);</div><div class='del'>-static int (*real_ftruncate64) (int fd, loff_t length);</div><div class='del'>-static int (*real_link) (const char *oldpath, const char *newname);</div><div class='del'>-static int (*real_rename) (const char *oldpath, const char *newpath);</div><div class='del'>-static int (*real_utimes) (const char *path, const struct timeval times[2]);</div><div class='del'>-static int (*real_utime) (const char *path, const struct utimbuf *buf);</div><div class='del'>-static int (*real_mknod) (const char *path, mode_t mode, dev_t dev);</div><div class='del'>-static int (*real_mkfifo) (const char *path, mode_t mode);</div><div class='del'>-static int (*real_unlink) (const char *path);</div><div class='del'>-static int (*real_symlink) (const char *oldpath, const char *newpath);</div><div class='del'>-static int (*real_readlink) (const char *path, char *buf, size_t bufsize);</div><div class='del'>-static char * (*real_realpath) (const char *path, char *resolved);</div><div class='del'>-static DIR * (*real_opendir) (const char *path);</div><div class='del'>-static struct dirent * (*real_readdir) (DIR *dir);</div><div class='del'>-static struct dirent64 * (*real_readdir64) (DIR *dir);</div><div class='del'>-static int (*real_readdir_r) (DIR *dir, struct dirent *entry,</div><div class='del'>-                              struct dirent **result);</div><div class='del'>-static int (*real_readdir64_r) (DIR *dir, struct dirent64 *entry,</div><div class='del'>-                                struct dirent64 **result);</div><div class='del'>-static int (*real_closedir) (DIR *dh);</div><div class='del'>-static int (*real___xstat) (int ver, const char *path, struct stat *buf);</div><div class='del'>-static int (*real___xstat64) (int ver, const char *path, struct stat64 *buf);</div><div class='del'>-static int (*real_stat) (const char *path, struct stat *buf);</div><div class='del'>-static int (*real_stat64) (const char *path, struct stat64 *buf);</div><div class='del'>-static int (*real___fxstat) (int ver, int fd, struct stat *buf);</div><div class='del'>-static int (*real___fxstat64) (int ver, int fd, struct stat64 *buf);</div><div class='del'>-static int (*real_fstat) (int fd, struct stat *buf);</div><div class='del'>-static int (*real_fstat64) (int fd , struct stat64 *buf);</div><div class='del'>-static int (*real___lxstat) (int ver, const char *path, struct stat *buf);</div><div class='del'>-static int (*real___lxstat64) (int ver, const char *path, struct stat64 *buf);</div><div class='del'>-static int (*real_lstat) (const char *path, struct stat *buf);</div><div class='del'>-static int (*real_lstat64) (const char *path, struct stat64 *buf);</div><div class='del'>-static int (*real_statfs) (const char *path, struct statfs *buf);</div><div class='del'>-static int (*real_statfs64) (const char *path, struct statfs64 *buf);</div><div class='del'>-static int (*real_statvfs) (const char *path, struct statvfs *buf);</div><div class='del'>-static int (*real_statvfs64) (const char *path, struct statvfs64 *buf);</div><div class='del'>-static ssize_t (*real_getxattr) (const char *path, const char *name,</div><div class='del'>-                                 void *value, size_t size);</div><div class='del'>-static ssize_t (*real_lgetxattr) (const char *path, const char *name,</div><div class='del'>-                                  void *value, size_t size);</div><div class='del'>-static int (*real_remove) (const char* path);</div><div class='del'>-static int (*real_lchown) (const char *path, uid_t owner, gid_t group);</div><div class='del'>-static void (*real_rewinddir) (DIR *dirp);</div><div class='del'>-static void (*real_seekdir) (DIR *dirp, off_t offset);</div><div class='del'>-static off_t (*real_telldir) (DIR *dirp);</div><div class='del'>-</div><div class='del'>-static ssize_t (*real_sendfile) (int out_fd, int in_fd, off_t *offset,</div><div class='del'>-                                 size_t count);</div><div class='del'>-static ssize_t (*real_sendfile64) (int out_fd, int in_fd, off_t *offset,</div><div class='del'>-                                   size_t count);</div><div class='del'>-static int (*real_fcntl) (int fd, int cmd, ...);</div><div class='del'>-static int (*real_chdir) (const char *path);</div><div class='del'>-static int (*real_fchdir) (int fd);  </div><div class='del'>-static char * (*real_getcwd) (char *buf, size_t size);</div><div class='del'>-static int (*real_truncate) (const char *path, off_t length);</div><div class='del'>-static int (*real_truncate64) (const char *path, loff_t length);</div><div class='del'>-static int (*real_setxattr) (const char *path, const char *name,</div><div class='del'>-                             const void *value, size_t size, int flags);</div><div class='del'>-static int (*real_lsetxattr) (const char *path, const char *name,</div><div class='del'>-                              const void *value, size_t size, int flags);</div><div class='del'>-static int (*real_fsetxattr) (int filedes, const char *name,</div><div class='del'>-                              const void *value, size_t size, int flags);</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-#define RESOLVE(sym) do {                                       \</div><div class='del'>-                if (!real_##sym)                                \</div><div class='del'>-                        real_##sym = dlsym (RTLD_NEXT, #sym);   \</div><div class='del'>-        } while (0)</div><div class='del'>-</div><div class='del'>-/*TODO: set proper value */</div><div class='del'>-#define MOUNT_HASH_SIZE 256</div><div class='del'>-</div><div class='del'>-struct booster_mount {</div><div class='del'>-        dev_t st_dev;</div><div class='del'>-        glusterfs_handle_t handle;</div><div class='del'>-        struct list_head device_list;</div><div class='del'>-};</div><div class='del'>-typedef struct booster_mount booster_mount_t;</div><div class='del'>-</div><div class='del'>-static booster_fdtable_t *booster_fdtable = NULL;</div><div class='del'>-</div><div class='del'>-extern int booster_configure (char *confpath);</div><div class='del'>-/* This is dup'ed every time VMP open/creat wants a new fd.</div><div class='del'>- * This is needed so we occupy an entry in the process' file</div><div class='del'>- * table.</div><div class='del'>- */</div><div class='del'>-int process_piped_fd = -1;</div><div class='del'>-</div><div class='del'>-static int</div><div class='del'>-booster_get_process_fd ()</div><div class='del'>-{</div><div class='del'>-        return real_dup (process_piped_fd);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-/* The following two define which file contains</div><div class='del'>- * the FSTAB configuration for VMP-based usage.</div><div class='del'>- */</div><div class='del'>-#define DEFAULT_BOOSTER_CONF    CONFDIR"/booster.conf"</div><div class='del'>-#define BOOSTER_CONF_ENV_VAR    "GLUSTERFS_BOOSTER_FSTAB"</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-/* The following define which log file is used when</div><div class='del'>- * using the old mount point bypass approach.</div><div class='del'>- */</div><div class='del'>-#define BOOSTER_DEFAULT_LOG     CONFDIR"/booster.log"</div><div class='del'>-#define BOOSTER_LOG_ENV_VAR     "GLUSTERFS_BOOSTER_LOG"</div><div class='del'>-</div><div class='del'>-void</div><div class='del'>-do_open (int fd, const char *pathname, int flags, mode_t mode, booster_op_t op)</div><div class='del'>-{</div><div class='del'>-        char                   *specfile = NULL;</div><div class='del'>-        char                   *mount_point = NULL; </div><div class='del'>-        int32_t                 size = 0;</div><div class='del'>-        int32_t                 ret = -1;</div><div class='del'>-        FILE                   *specfp = NULL;</div><div class='del'>-        glusterfs_file_t        fh = NULL;</div><div class='del'>-        char                   *logfile = NULL;</div><div class='del'>-        glusterfs_init_params_t iparams = {</div><div class='del'>-                .loglevel = "error",</div><div class='del'>-                .lookup_timeout = 600,</div><div class='del'>-                .stat_timeout = 600,</div><div class='del'>-        };</div><div class='del'>-      </div><div class='del'>-        gf_log ("booster", GF_LOG_DEBUG, "Opening using MPB: %s", pathname);</div><div class='del'>-        size = fgetxattr (fd, "user.glusterfs-booster-volfile", NULL, 0);</div><div class='del'>-        if (size == -1) {</div><div class='del'>-                gf_log ("booster", GF_LOG_ERROR, "Xattr "</div><div class='del'>-                        "user.glusterfs-booster-volfile not found: %s",</div><div class='del'>-                        strerror (errno));</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-		</div><div class='del'>-        specfile = calloc (1, size);</div><div class='del'>-        if (!specfile) {</div><div class='del'>-                gf_log ("booster", GF_LOG_ERROR, "Memory allocation failed");</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        ret = fgetxattr (fd, "user.glusterfs-booster-volfile", specfile,</div><div class='del'>-                         size);</div><div class='del'>-        if (ret == -1) {</div><div class='del'>-                gf_log ("booster", GF_LOG_ERROR, "Xattr "</div><div class='del'>-                        "user.glusterfs-booster-volfile not found: %s",</div><div class='del'>-                        strerror (errno));</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-    </div><div class='del'>-        specfp = tmpfile ();</div><div class='del'>-        if (!specfp) {</div><div class='del'>-                gf_log ("booster", GF_LOG_ERROR, "Temp file creation failed"</div><div class='del'>-                        ": %s", strerror (errno));</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        ret = fwrite (specfile, size, 1, specfp);</div><div class='del'>-        if (ret != 1) {</div><div class='del'>-                gf_log ("booster", GF_LOG_ERROR, "Failed to write volfile: %s",</div><div class='del'>-                        strerror (errno));</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-		</div><div class='del'>-        fseek (specfp, 0L, SEEK_SET);</div><div class='del'>-</div><div class='del'>-        size = fgetxattr (fd, "user.glusterfs-booster-mount", NULL, 0);</div><div class='del'>-        if (size == -1) {</div><div class='del'>-                gf_log ("booster", GF_LOG_ERROR, "Xattr "</div><div class='del'>-                        "user.glusterfs-booster-mount not found: %s",</div><div class='del'>-                        strerror (errno));</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-        </div><div class='del'>-        mount_point = calloc (size, sizeof (char));</div><div class='del'>-        if (!mount_point) {</div><div class='del'>-                gf_log ("booster", GF_LOG_ERROR, "Memory allocation failed");</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-	</div><div class='del'>-        ret = fgetxattr (fd, "user.glusterfs-booster-mount", mount_point, size);</div><div class='del'>-        if (ret == -1) {</div><div class='del'>-                gf_log ("booster", GF_LOG_ERROR, "Xattr "</div><div class='del'>-                        "user.glusterfs-booster-mount not found: %s",</div><div class='del'>-                        strerror (errno));</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        logfile = getenv (BOOSTER_LOG_ENV_VAR);</div><div class='del'>-        if (logfile) {</div><div class='del'>-                if (strlen (logfile) &gt; 0)</div><div class='del'>-                        iparams.logfile = strdup (logfile);</div><div class='del'>-                else</div><div class='del'>-                        iparams.logfile = strdup (BOOSTER_DEFAULT_LOG);</div><div class='del'>-        } else {</div><div class='del'>-                iparams.logfile = strdup (BOOSTER_DEFAULT_LOG);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        gf_log ("booster", GF_LOG_TRACE, "Using log-file: %s", iparams.logfile);</div><div class='del'>-        iparams.specfp = specfp;</div><div class='del'>-</div><div class='del'>-        ret = glusterfs_mount (mount_point, &amp;iparams);</div><div class='del'>-        if (ret == -1) {</div><div class='del'>-                if (errno != EEXIST) {</div><div class='del'>-                        gf_log ("booster", GF_LOG_ERROR, "Mount failed over"</div><div class='del'>-                                " glusterfs");</div><div class='del'>-                        goto out;</div><div class='del'>-                } else</div><div class='del'>-                        gf_log ("booster", GF_LOG_ERROR, "Already mounted");</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        switch (op) {</div><div class='del'>-        case BOOSTER_OPEN:</div><div class='del'>-                gf_log ("booster", GF_LOG_TRACE, "Booster open call");</div><div class='del'>-                fh = glusterfs_open (pathname, flags, mode);</div><div class='del'>-                break;</div><div class='del'>-</div><div class='del'>-        case BOOSTER_CREAT:</div><div class='del'>-                gf_log ("booster", GF_LOG_TRACE, "Booster create call");</div><div class='del'>-                fh = glusterfs_creat (pathname, mode);</div><div class='del'>-                break;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (!fh) {</div><div class='del'>-                gf_log ("booster", GF_LOG_ERROR, "Error performing operation");</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (booster_fd_unused_get (booster_fdtable, fh, fd) == -1) {</div><div class='del'>-                gf_log ("booster", GF_LOG_ERROR, "Failed to get unused FD");</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-        fh = NULL;</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        if (specfile) {</div><div class='del'>-                free (specfile);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (specfp) {</div><div class='del'>-                fclose (specfp);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (mount_point) {</div><div class='del'>-                free (mount_point);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (fh) {</div><div class='del'>-                glusterfs_close (fh);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        return;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-vmp_open (const char *pathname, int flags, ...)</div><div class='del'>-{</div><div class='del'>-        mode_t                  mode = 0;</div><div class='del'>-        int                     fd = -1;</div><div class='del'>-        glusterfs_file_t        fh = NULL;</div><div class='del'>-        va_list                 ap;</div><div class='del'>-</div><div class='del'>-        if (flags &amp; GF_O_CREAT) {</div><div class='del'>-                va_start (ap, flags);</div><div class='del'>-                mode = va_arg (ap, mode_t);</div><div class='del'>-                va_end (ap);</div><div class='del'>-</div><div class='del'>-                fh = glusterfs_open (pathname, flags, mode);</div><div class='del'>-        }</div><div class='del'>-        else</div><div class='del'>-                fh = glusterfs_open (pathname, flags);</div><div class='del'>-</div><div class='del'>-        if (!fh) {</div><div class='del'>-                gf_log ("booster", GF_LOG_ERROR, "VMP open failed");</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        fd = booster_get_process_fd ();</div><div class='del'>-        if (fd == -1) {</div><div class='del'>-                gf_log ("booster", GF_LOG_ERROR, "Failed to create open fd");</div><div class='del'>-                goto fh_close_out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (booster_fd_unused_get (booster_fdtable, fh, fd) == -1) {</div><div class='del'>-                gf_log ("booster", GF_LOG_ERROR, "Failed to map fd into table");</div><div class='del'>-                goto realfd_close_out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        return fd;</div><div class='del'>-</div><div class='del'>-realfd_close_out:</div><div class='del'>-        real_close (fd);</div><div class='del'>-        fd = -1;</div><div class='del'>-</div><div class='del'>-fh_close_out:</div><div class='del'>-        glusterfs_close (fh);</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        return fd;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-#define BOOSTER_USE_OPEN64          1</div><div class='del'>-#define BOOSTER_DONT_USE_OPEN64     0</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-booster_open (const char *pathname, int use64, int flags, ...)</div><div class='del'>-{</div><div class='del'>-        int     ret = -1;</div><div class='del'>-        mode_t  mode = 0;</div><div class='del'>-        va_list ap;</div><div class='del'>-        int     (*my_open) (const char *pathname, int flags, ...);</div><div class='del'>-</div><div class='del'>-        if (!pathname) {</div><div class='del'>-                errno = EINVAL;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        gf_log ("booster", GF_LOG_TRACE, "Open: %s", pathname);</div><div class='del'>-        /* First try opening through the virtual mount point.</div><div class='del'>-         * The difference lies in the fact that:</div><div class='del'>-         * 1. We depend on libglusterfsclient library to perform</div><div class='del'>-         * the translation from the path to handle.</div><div class='del'>-         * 2. We do not go to the file system for the fd, instead</div><div class='del'>-         * we use booster_get_process_fd (), which returns a dup'ed</div><div class='del'>-         * fd of a pipe created in booster_init.</div><div class='del'>-         */</div><div class='del'>-        if (flags &amp; GF_O_CREAT) {</div><div class='del'>-                va_start (ap, flags);</div><div class='del'>-                mode = va_arg (ap, mode_t);</div><div class='del'>-                va_end (ap);</div><div class='del'>-                ret = vmp_open (pathname, flags, mode);</div><div class='del'>-        }</div><div class='del'>-        else</div><div class='del'>-                ret = vmp_open (pathname, flags);</div><div class='del'>-</div><div class='del'>-        /* We receive an ENODEV if the VMP does not exist. If we</div><div class='del'>-         * receive an error other than ENODEV, it means, there</div><div class='del'>-         * actually was an error performing vmp_open. This must</div><div class='del'>-         * be returned to the user.</div><div class='del'>-         */</div><div class='del'>-        if ((ret &lt; 0) &amp;&amp; (errno != ENODEV)) {</div><div class='del'>-                gf_log ("booster", GF_LOG_ERROR, "Error in opening file over "</div><div class='del'>-                        " VMP: %s", strerror (errno));</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (ret &gt; 0) {</div><div class='del'>-                gf_log ("booster", GF_LOG_TRACE, "File opened");</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (use64) {</div><div class='del'>-                gf_log ("booster", GF_LOG_TRACE, "Using 64-bit open");</div><div class='del'>-		my_open = real_open64;</div><div class='del'>-        } else {</div><div class='del'>-                gf_log ("booster", GF_LOG_TRACE, "Using 32-bit open");</div><div class='del'>-		my_open = real_open;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        /* It is possible the RESOLVE macro is not able</div><div class='del'>-         * to resolve the symbol of a function, in that case</div><div class='del'>-         * we dont want to seg-fault on calling a NULL functor.</div><div class='del'>-         */</div><div class='del'>-        if (my_open == NULL) {</div><div class='del'>-                gf_log ("booster", GF_LOG_ERROR, "open not resolved");</div><div class='del'>-                ret = -1;</div><div class='del'>-                errno = ENOSYS;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-	if (flags &amp; GF_O_CREAT) {</div><div class='del'>-		va_start (ap, flags);</div><div class='del'>-		mode = va_arg (ap, mode_t);</div><div class='del'>-		va_end (ap);</div><div class='del'>-</div><div class='del'>-                ret = my_open (pathname, flags, mode);</div><div class='del'>-	} else</div><div class='del'>-                ret = my_open (pathname, flags);</div><div class='del'>-</div><div class='del'>-        if (ret != -1) {</div><div class='del'>-                do_open (ret, pathname, flags, mode, BOOSTER_OPEN);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-/* This is done to over-write existing definitions of open and open64 inside</div><div class='del'>- * libc with our own copies. __REDIRECT is provided by libc.</div><div class='del'>- *</div><div class='del'>- * XXX: This will not work anywhere other than libc based systems.</div><div class='del'>- */</div><div class='del'>-int __REDIRECT (booster_false_open, (__const char *__file, int __oflag, ...),</div><div class='del'>-                open) __nonnull ((1));</div><div class='del'>-int __REDIRECT (booster_false_open64, (__const char *__file, int __oflag, ...),</div><div class='del'>-                open64) __nonnull ((1));</div><div class='del'>-int</div><div class='del'>-booster_false_open (const char *pathname, int flags, ...)</div><div class='del'>-{</div><div class='del'>-        int     ret;</div><div class='del'>-        mode_t  mode = 0;</div><div class='del'>-        va_list ap;</div><div class='del'>-</div><div class='del'>-        if (flags &amp; GF_O_CREAT) {</div><div class='del'>-                va_start (ap, flags);</div><div class='del'>-                mode = va_arg (ap, mode_t);</div><div class='del'>-                va_end (ap);</div><div class='del'>-</div><div class='del'>-                ret = booster_open (pathname, BOOSTER_DONT_USE_OPEN64, flags,</div><div class='del'>-                                    mode);</div><div class='del'>-        }</div><div class='del'>-        else</div><div class='del'>-                ret = booster_open (pathname, BOOSTER_DONT_USE_OPEN64, flags);</div><div class='del'>-</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-booster_false_open64 (const char *pathname, int flags, ...)</div><div class='del'>-{</div><div class='del'>-        int     ret;</div><div class='del'>-        mode_t  mode = 0;</div><div class='del'>-        va_list ap;</div><div class='del'>-</div><div class='del'>-        if (flags &amp; GF_O_CREAT) {</div><div class='del'>-                va_start (ap, flags);</div><div class='del'>-                mode = va_arg (ap, mode_t);</div><div class='del'>-                va_end (ap);</div><div class='del'>-</div><div class='del'>-                ret = booster_open (pathname, BOOSTER_USE_OPEN64, flags, mode);</div><div class='del'>-        }</div><div class='del'>-        else</div><div class='del'>-                ret = booster_open (pathname, BOOSTER_USE_OPEN64, flags);</div><div class='del'>-</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-vmp_creat (const char *pathname, mode_t mode)</div><div class='del'>-{</div><div class='del'>-        int                     fd = -1;</div><div class='del'>-        glusterfs_file_t        fh = NULL;</div><div class='del'>-</div><div class='del'>-        fh = glusterfs_creat (pathname, mode);</div><div class='del'>-        if (!fh) {</div><div class='del'>-                gf_log ("booster", GF_LOG_ERROR, "Create failed: %s: %s",</div><div class='del'>-                        pathname, strerror (errno));</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        fd = booster_get_process_fd ();</div><div class='del'>-        if (fd == -1) {</div><div class='del'>-                gf_log ("booster", GF_LOG_ERROR, "Failed to create fd");</div><div class='del'>-                goto close_out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if ((booster_fd_unused_get (booster_fdtable, fh, fd)) == -1) {</div><div class='del'>-                gf_log ("booster", GF_LOG_ERROR, "Failed to map unused fd");</div><div class='del'>-                goto real_close_out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        return fd;</div><div class='del'>-</div><div class='del'>-real_close_out:</div><div class='del'>-        real_close (fd);</div><div class='del'>-        fd = -1;</div><div class='del'>-</div><div class='del'>-close_out:</div><div class='del'>-        glusterfs_close (fh);</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        return -1;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int __REDIRECT (booster_false_creat, (const char *pathname, mode_t mode),</div><div class='del'>-                creat) __nonnull ((1));</div><div class='del'>-int __REDIRECT (booster_false_creat64, (const char *pathname, mode_t mode),</div><div class='del'>-                creat64) __nonnull ((1));</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-booster_false_creat (const char *pathname, mode_t mode)</div><div class='del'>-{</div><div class='del'>-        int     ret = -1;</div><div class='del'>-        if (!pathname) {</div><div class='del'>-                errno = EINVAL;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        gf_log ("booster", GF_LOG_TRACE, "Create: %s", pathname);</div><div class='del'>-        ret = vmp_creat (pathname, mode);</div><div class='del'>-</div><div class='del'>-        if ((ret == -1) &amp;&amp; (errno != ENODEV)) {</div><div class='del'>-                gf_log ("booster", GF_LOG_ERROR, "VMP create failed: %s",</div><div class='del'>-                        strerror (errno));</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (ret &gt; 0) {</div><div class='del'>-                gf_log ("booster", GF_LOG_TRACE, "File created");</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (real_creat == NULL) {</div><div class='del'>-                errno = ENOSYS;</div><div class='del'>-                ret = -1;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        ret = real_creat (pathname, mode);</div><div class='del'>-</div><div class='del'>-        if (ret != -1) {</div><div class='del'>-                do_open (ret, pathname, GF_O_WRONLY | GF_O_TRUNC, mode,</div><div class='del'>-                         BOOSTER_CREAT);</div><div class='del'>-        } else</div><div class='del'>-                gf_log ("booster", GF_LOG_ERROR, "real create failed: %s",</div><div class='del'>-                        strerror (errno));</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-booster_false_creat64 (const char *pathname, mode_t mode)</div><div class='del'>-{</div><div class='del'>-        int     ret = -1;</div><div class='del'>-        if (!pathname) {</div><div class='del'>-                errno = EINVAL;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        gf_log ("booster", GF_LOG_TRACE, "Create: %s", pathname);</div><div class='del'>-        ret = vmp_creat (pathname, mode);</div><div class='del'>-</div><div class='del'>-        if ((ret == -1) &amp;&amp; (errno != ENODEV)) {</div><div class='del'>-                gf_log ("booster", GF_LOG_ERROR, "VMP create failed: %s",</div><div class='del'>-                        strerror (errno));</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (ret &gt; 0) {</div><div class='del'>-                gf_log ("booster", GF_LOG_TRACE, "File created");</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (real_creat64 == NULL) {</div><div class='del'>-                errno = ENOSYS;</div><div class='del'>-                ret = -1;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        ret = real_creat64 (pathname, mode);</div><div class='del'>-</div><div class='del'>-        if (ret != -1) {</div><div class='del'>-                do_open (ret, pathname, GF_O_WRONLY | GF_O_TRUNC, mode,</div><div class='del'>-                         BOOSTER_CREAT);</div><div class='del'>-        } else</div><div class='del'>-                gf_log ("booster", GF_LOG_ERROR, "real create failed: %s",</div><div class='del'>-                        strerror (errno));</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-/* pread */</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-pread (int fd, void *buf, size_t count, unsigned long offset)</div><div class='del'>-{</div><div class='del'>-        ssize_t ret;</div><div class='del'>-        glusterfs_file_t glfs_fd = 0;</div><div class='del'>-</div><div class='del'>-        gf_log ("booster", GF_LOG_TRACE, "pread: fd %d, count %lu, offset %lu"</div><div class='del'>-                ,fd, (long unsigned)count, offset);</div><div class='del'>-        glfs_fd = booster_fdptr_get (booster_fdtable, fd);</div><div class='del'>-        if (!glfs_fd) { </div><div class='del'>-                gf_log ("booster", GF_LOG_TRACE, "Not booster fd");</div><div class='del'>-                if (real_pread == NULL) {</div><div class='del'>-                        errno = ENOSYS;</div><div class='del'>-                        ret = -1;</div><div class='del'>-                } else</div><div class='del'>-                        ret = real_pread (fd, buf, count, offset);</div><div class='del'>-        } else {</div><div class='del'>-                gf_log ("booster", GF_LOG_TRACE, "Is a booster fd");</div><div class='del'>-                ret = glusterfs_pread (glfs_fd, buf, count, offset);</div><div class='del'>-                booster_fdptr_put (glfs_fd);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-pread64 (int fd, void *buf, size_t count, uint64_t offset)</div><div class='del'>-{</div><div class='del'>-        ssize_t ret;</div><div class='del'>-        glusterfs_file_t glfs_fd = 0;</div><div class='del'>-</div><div class='del'>-        gf_log ("booster", GF_LOG_TRACE, "pread64: fd %d, count %lu, offset %"</div><div class='del'>-                PRIu64, fd, (long unsigned)count, offset);</div><div class='del'>-        glfs_fd = booster_fdptr_get (booster_fdtable, fd);</div><div class='del'>-        if (!glfs_fd) { </div><div class='del'>-                gf_log ("booster", GF_LOG_TRACE, "Not booster fd");</div><div class='del'>-                if (real_pread64 == NULL) {</div><div class='del'>-                        errno = ENOSYS;</div><div class='del'>-                        ret = -1;</div><div class='del'>-                } else</div><div class='del'>-                        ret = real_pread64 (fd, buf, count, offset);</div><div class='del'>-        } else {</div><div class='del'>-                gf_log ("booster", GF_LOG_TRACE, "Is a booster fd");</div><div class='del'>-                ret = glusterfs_pread (glfs_fd, buf, count, offset);</div><div class='del'>-                booster_fdptr_put (glfs_fd);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-read (int fd, void *buf, size_t count)</div><div class='del'>-{</div><div class='del'>-        int ret;</div><div class='del'>-        glusterfs_file_t glfs_fd;</div><div class='del'>-</div><div class='del'>-        gf_log ("booster", GF_LOG_TRACE, "read: fd %d, count %lu", fd,</div><div class='del'>-                (long unsigned)count);</div><div class='del'>-        glfs_fd = booster_fdptr_get (booster_fdtable, fd);</div><div class='del'>-        if (!glfs_fd) {</div><div class='del'>-                gf_log ("booster", GF_LOG_TRACE, "Not booster fd");</div><div class='del'>-                if (real_read == NULL) {</div><div class='del'>-                        errno = ENOSYS;</div><div class='del'>-                        ret = -1;</div><div class='del'>-                } else</div><div class='del'>-                        ret = real_read (fd, buf, count);</div><div class='del'>-        } else {</div><div class='del'>-                gf_log ("booster", GF_LOG_TRACE, "Is a booster fd");</div><div class='del'>-                ret = glusterfs_read (glfs_fd, buf, count);</div><div class='del'>-                booster_fdptr_put (glfs_fd);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-readv (int fd, const struct iovec *vector, int count)</div><div class='del'>-{</div><div class='del'>-        int ret;</div><div class='del'>-        glusterfs_file_t glfs_fd = 0;</div><div class='del'>-</div><div class='del'>-        gf_log ("booster", GF_LOG_TRACE, "readv: fd %d, iovecs %d", fd, count);</div><div class='del'>-        glfs_fd = booster_fdptr_get (booster_fdtable, fd);</div><div class='del'>-        if (!glfs_fd) {</div><div class='del'>-                gf_log ("booster", GF_LOG_TRACE, "Not a booster fd");</div><div class='del'>-                if (real_readv == NULL) {</div><div class='del'>-                        errno = ENOSYS;</div><div class='del'>-                        ret = -1;</div><div class='del'>-                } else</div><div class='del'>-                        ret = real_readv (fd, vector, count);</div><div class='del'>-        } else {</div><div class='del'>-                gf_log ("booster", GF_LOG_TRACE, "Is a booster fd");</div><div class='del'>-		ret = glusterfs_readv (glfs_fd, vector, count);</div><div class='del'>-                booster_fdptr_put (glfs_fd);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-write (int fd, const void *buf, size_t count)</div><div class='del'>-{</div><div class='del'>-        int ret;</div><div class='del'>-        glusterfs_file_t glfs_fd = 0;</div><div class='del'>-</div><div class='del'>-        gf_log ("booster", GF_LOG_TRACE, "write: fd %d, count %"GF_PRI_SIZET,</div><div class='del'>-                fd, count);</div><div class='del'>-</div><div class='del'>-        glfs_fd = booster_fdptr_get (booster_fdtable, fd);</div><div class='del'>-</div><div class='del'>-        if (!glfs_fd) {</div><div class='del'>-                gf_log ("booster", GF_LOG_TRACE, "Not a booster fd");</div><div class='del'>-                if (real_write == NULL) {</div><div class='del'>-                        errno = ENOSYS;</div><div class='del'>-                        ret = -1;</div><div class='del'>-                } else</div><div class='del'>-                        ret = real_write (fd, buf, count);</div><div class='del'>-        } else {</div><div class='del'>-                gf_log ("booster", GF_LOG_TRACE, "Is a booster fd");</div><div class='del'>-                ret = glusterfs_write (glfs_fd, buf, count);</div><div class='del'>-                booster_fdptr_put (glfs_fd);</div><div class='del'>-        }</div><div class='del'>- </div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-writev (int fd, const struct iovec *vector, int count)</div><div class='del'>-{</div><div class='del'>-        int ret = 0;</div><div class='del'>-        glusterfs_file_t glfs_fd = 0; </div><div class='del'>-</div><div class='del'>-        gf_log ("booster", GF_LOG_TRACE, "writev: fd %d, iovecs %d", fd, count);</div><div class='del'>-        glfs_fd = booster_fdptr_get (booster_fdtable, fd);</div><div class='del'>-</div><div class='del'>-        if (!glfs_fd) {</div><div class='del'>-                gf_log ("booster", GF_LOG_TRACE, "Not a booster fd");</div><div class='del'>-                if (real_writev == NULL) {</div><div class='del'>-                        errno = ENOSYS;</div><div class='del'>-                        ret = -1;</div><div class='del'>-                } else</div><div class='del'>-                        ret = real_writev (fd, vector, count);</div><div class='del'>-        } else {</div><div class='del'>-                gf_log ("booster", GF_LOG_TRACE, "Is a booster fd");</div><div class='del'>-                ret = glusterfs_writev (glfs_fd, vector, count);</div><div class='del'>-                booster_fdptr_put (glfs_fd);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-pwrite (int fd, const void *buf, size_t count, unsigned long offset)</div><div class='del'>-{</div><div class='del'>-        int ret;</div><div class='del'>-        glusterfs_file_t glfs_fd = 0;</div><div class='del'>-</div><div class='del'>-        gf_log ("booster", GF_LOG_TRACE, "pwrite: fd %d, count %"GF_PRI_SIZET</div><div class='del'>-                ", offset %lu", fd, count, offset);</div><div class='del'>-        glfs_fd = booster_fdptr_get (booster_fdtable, fd);</div><div class='del'>-</div><div class='del'>-        if (!glfs_fd) {</div><div class='del'>-                gf_log ("booster", GF_LOG_TRACE, "Not a booster fd");</div><div class='del'>-                if (real_pwrite == NULL) {</div><div class='del'>-                        errno = ENOSYS;</div><div class='del'>-                        ret = -1;</div><div class='del'>-                } else</div><div class='del'>-                        ret = real_pwrite (fd, buf, count, offset);</div><div class='del'>-        } else {</div><div class='del'>-                gf_log ("booster", GF_LOG_TRACE, "Is a booster fd");</div><div class='del'>-                ret = glusterfs_pwrite (glfs_fd, buf, count, offset);</div><div class='del'>-                booster_fdptr_put (glfs_fd);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-pwrite64 (int fd, const void *buf, size_t count, uint64_t offset)</div><div class='del'>-{</div><div class='del'>-        int ret;</div><div class='del'>-        glusterfs_file_t glfs_fd = 0;</div><div class='del'>-</div><div class='del'>-        gf_log ("booster", GF_LOG_TRACE, "pwrite64: fd %d, count %"GF_PRI_SIZET</div><div class='del'>-                ", offset %"PRIu64, fd, count, offset);</div><div class='del'>-        glfs_fd = booster_fdptr_get (booster_fdtable, fd);</div><div class='del'>-</div><div class='del'>-        if (!glfs_fd) {</div><div class='del'>-                gf_log ("booster", GF_LOG_TRACE, "Not a booster fd");</div><div class='del'>-                if (real_pwrite64 == NULL) {</div><div class='del'>-                        errno = ENOSYS;</div><div class='del'>-                        ret = -1;</div><div class='del'>-                } else</div><div class='del'>-                        ret = real_pwrite64 (fd, buf, count, offset);</div><div class='del'>-        } else {</div><div class='del'>-                gf_log ("booster", GF_LOG_TRACE, "Is a booster fd");</div><div class='del'>-                ret = glusterfs_pwrite (glfs_fd, buf, count, offset);</div><div class='del'>-                booster_fdptr_put (glfs_fd);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-close (int fd)</div><div class='del'>-{</div><div class='del'>-        int ret = -1;</div><div class='del'>-        glusterfs_file_t glfs_fd = 0;</div><div class='del'>-</div><div class='del'>-        gf_log ("booster", GF_LOG_TRACE, "close: fd %d", fd);</div><div class='del'>-	glfs_fd = booster_fdptr_get (booster_fdtable, fd);</div><div class='del'>-    </div><div class='del'>-	if (glfs_fd) {</div><div class='del'>-                gf_log ("booster", GF_LOG_TRACE, "Is a booster fd");</div><div class='del'>-		booster_fd_put (booster_fdtable, fd);</div><div class='del'>-		ret = glusterfs_close (glfs_fd);</div><div class='del'>-		booster_fdptr_put (glfs_fd);</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-        ret = real_close (fd);</div><div class='del'>-</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-#ifndef _LSEEK_DECLARED</div><div class='del'>-#define _LSEEK_DECLARED</div><div class='del'>-off_t</div><div class='del'>-lseek (int filedes, unsigned long offset, int whence)</div><div class='del'>-{</div><div class='del'>-        int ret;</div><div class='del'>-        glusterfs_file_t glfs_fd = 0;</div><div class='del'>-</div><div class='del'>-        gf_log ("booster", GF_LOG_TRACE, "lseek: fd %d, offset %ld",</div><div class='del'>-                filedes, offset);</div><div class='del'>-</div><div class='del'>-        glfs_fd = booster_fdptr_get (booster_fdtable, filedes);</div><div class='del'>-        if (glfs_fd) {</div><div class='del'>-                gf_log ("booster", GF_LOG_TRACE, "Is a booster fd");</div><div class='del'>-                ret = glusterfs_lseek (glfs_fd, offset, whence);</div><div class='del'>-                booster_fdptr_put (glfs_fd);</div><div class='del'>-        } else {</div><div class='del'>-                gf_log ("booster", GF_LOG_TRACE, "Not a booster fd");</div><div class='del'>-                if (real_lseek == NULL) {</div><div class='del'>-                        errno = ENOSYS;</div><div class='del'>-                        ret = -1;</div><div class='del'>-                } else</div><div class='del'>-                        ret = real_lseek (filedes, offset, whence);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-off_t</div><div class='del'>-lseek64 (int filedes, uint64_t offset, int whence)</div><div class='del'>-{</div><div class='del'>-        int ret;</div><div class='del'>-        glusterfs_file_t glfs_fd = 0;</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-        gf_log ("booster", GF_LOG_TRACE, "lseek: fd %d, offset %"PRIu64,</div><div class='del'>-                filedes, offset);</div><div class='del'>-        glfs_fd = booster_fdptr_get (booster_fdtable, filedes);</div><div class='del'>-        if (glfs_fd) {</div><div class='del'>-                gf_log ("booster", GF_LOG_TRACE, "Is a booster fd");</div><div class='del'>-                ret = glusterfs_lseek (glfs_fd, offset, whence);</div><div class='del'>-                booster_fdptr_put (glfs_fd);</div><div class='del'>-        } else {</div><div class='del'>-                gf_log ("booster", GF_LOG_TRACE, "Not a booster fd");</div><div class='del'>-                if (real_lseek64 == NULL) {</div><div class='del'>-                        errno = ENOSYS;</div><div class='del'>-                        ret = -1;</div><div class='del'>-                } else</div><div class='del'>-                        ret = real_lseek64 (filedes, offset, whence);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int </div><div class='del'>-dup (int oldfd)</div><div class='del'>-{</div><div class='del'>-        int ret = -1, new_fd = -1;</div><div class='del'>-        glusterfs_file_t glfs_fd = 0;</div><div class='del'>-</div><div class='del'>-        gf_log ("booster", GF_LOG_TRACE, "dup: fd %d", oldfd);</div><div class='del'>-        glfs_fd = booster_fdptr_get (booster_fdtable, oldfd);</div><div class='del'>-        new_fd = real_dup (oldfd);</div><div class='del'>-</div><div class='del'>-        if (new_fd &gt;=0 &amp;&amp; glfs_fd) {</div><div class='del'>-                gf_log ("booster", GF_LOG_TRACE, "Is a booster fd");</div><div class='del'>-                ret = booster_fd_unused_get (booster_fdtable, glfs_fd,</div><div class='del'>-                                             new_fd);</div><div class='del'>-                fd_ref ((fd_t *)glfs_fd);</div><div class='del'>-                if (ret == -1) {</div><div class='del'>-                        gf_log ("booster", GF_LOG_ERROR,"Failed to map new fd");</div><div class='del'>-                        real_close (new_fd);</div><div class='del'>-                } </div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (glfs_fd) {</div><div class='del'>-                booster_fdptr_put (glfs_fd);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        return new_fd;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int </div><div class='del'>-dup2 (int oldfd, int newfd)</div><div class='del'>-{</div><div class='del'>-        int ret = -1;</div><div class='del'>-        glusterfs_file_t old_glfs_fd = NULL, new_glfs_fd = NULL;</div><div class='del'>-</div><div class='del'>-        if (oldfd == newfd) {</div><div class='del'>-                return newfd;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        old_glfs_fd = booster_fdptr_get (booster_fdtable, oldfd);</div><div class='del'>-        new_glfs_fd = booster_fdptr_get (booster_fdtable, newfd);</div><div class='del'>- </div><div class='del'>-        ret = real_dup2 (oldfd, newfd); </div><div class='del'>-        if (ret &gt;= 0) {</div><div class='del'>-                if (new_glfs_fd) {</div><div class='del'>-                        glusterfs_close (new_glfs_fd);</div><div class='del'>-                        booster_fdptr_put (new_glfs_fd);</div><div class='del'>-                        booster_fd_put (booster_fdtable, newfd);</div><div class='del'>-                        new_glfs_fd = 0;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                if (old_glfs_fd) {</div><div class='del'>-                        ret = booster_fd_unused_get (booster_fdtable,</div><div class='del'>-                                                     old_glfs_fd, newfd);</div><div class='del'>-                        fd_ref ((fd_t *)old_glfs_fd);</div><div class='del'>-                        if (ret == -1) {</div><div class='del'>-                                real_close (newfd);</div><div class='del'>-                        }</div><div class='del'>-                }</div><div class='del'>-        } </div><div class='del'>-</div><div class='del'>-        if (old_glfs_fd) {</div><div class='del'>-                booster_fdptr_put (old_glfs_fd);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (new_glfs_fd) {</div><div class='del'>-                booster_fdptr_put (new_glfs_fd);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-mkdir (const char *pathname, mode_t mode)</div><div class='del'>-{</div><div class='del'>-        int     ret = -1;</div><div class='del'>-</div><div class='del'>-        gf_log ("booster", GF_LOG_TRACE, "mkdir: path %s", pathname);</div><div class='del'>-        ret = glusterfs_mkdir (pathname, mode);</div><div class='del'>-</div><div class='del'>-        if ((ret == -1) &amp;&amp; (errno != ENODEV)) {</div><div class='del'>-                gf_log ("booster", GF_LOG_ERROR, "mkdir failed: %s",</div><div class='del'>-                        strerror (errno));</div><div class='del'>-                return ret;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (ret == 0) {</div><div class='del'>-                gf_log ("booster", GF_LOG_TRACE, "directory created");</div><div class='del'>-                return ret;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (real_mkdir == NULL) {</div><div class='del'>-                ret = -1;</div><div class='del'>-                errno = ENOSYS;</div><div class='del'>-        } else</div><div class='del'>-                ret = real_mkdir (pathname, mode);</div><div class='del'>-</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-rmdir (const char *pathname)</div><div class='del'>-{</div><div class='del'>-        int     ret = -1;</div><div class='del'>-</div><div class='del'>-        gf_log ("booster", GF_LOG_TRACE, "rmdir: path %s", pathname);</div><div class='del'>-        ret = glusterfs_rmdir (pathname);</div><div class='del'>-        if ((ret == -1) &amp;&amp; (errno != ENODEV)) {</div><div class='del'>-                gf_log ("booster", GF_LOG_ERROR, "rmdir failed: %s",</div><div class='del'>-                        strerror (errno));</div><div class='del'>-                return ret;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (ret == 0) {</div><div class='del'>-                gf_log ("booster", GF_LOG_TRACE, "directory removed");</div><div class='del'>-                return ret;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (real_rmdir == NULL) {</div><div class='del'>-                errno = ENOSYS;</div><div class='del'>-                ret = -1;</div><div class='del'>-        } else</div><div class='del'>-                ret = real_rmdir (pathname);</div><div class='del'>-</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-chmod (const char *pathname, mode_t mode)</div><div class='del'>-{</div><div class='del'>-        int     ret = -1;</div><div class='del'>-</div><div class='del'>-        gf_log ("booster", GF_LOG_TRACE, "chmod: path %s", pathname);</div><div class='del'>-        ret = glusterfs_chmod (pathname, mode);</div><div class='del'>-        if ((ret == -1) &amp;&amp; (errno != ENODEV)) {</div><div class='del'>-                gf_log ("booster", GF_LOG_ERROR, "chmod failed: %s",</div><div class='del'>-                        strerror (errno));</div><div class='del'>-                return ret;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (ret == 0) {</div><div class='del'>-                gf_log ("booster", GF_LOG_TRACE, "chmod succeeded");</div><div class='del'>-                return ret;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (real_chmod == NULL) {</div><div class='del'>-                errno = ENOSYS;</div><div class='del'>-                ret = -1;</div><div class='del'>-        } else</div><div class='del'>-                ret = real_chmod (pathname, mode);</div><div class='del'>-</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-chown (const char *pathname, uid_t owner, gid_t group)</div><div class='del'>-{</div><div class='del'>-        int     ret = -1;</div><div class='del'>-</div><div class='del'>-        gf_log ("booster", GF_LOG_TRACE, "chown: path: %s", pathname);</div><div class='del'>-        ret = glusterfs_chown (pathname, owner, group);</div><div class='del'>-</div><div class='del'>-        if ((ret == -1) &amp;&amp; (errno != ENODEV)) {</div><div class='del'>-                gf_log ("booster", GF_LOG_ERROR, "chown failed: %s\n",</div><div class='del'>-                        strerror (errno));</div><div class='del'>-                return ret;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (ret == 0) {</div><div class='del'>-                gf_log ("booster", GF_LOG_TRACE, "chown succeeded");</div><div class='del'>-                return ret;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (real_chown == NULL) {</div><div class='del'>-                errno = ENOSYS;</div><div class='del'>-                ret = -1;</div><div class='del'>-        } else</div><div class='del'>-                ret = real_chown (pathname, owner, group);</div><div class='del'>-</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-fchown (int fd, uid_t owner, gid_t group)</div><div class='del'>-{</div><div class='del'>-        int                     ret = -1;</div><div class='del'>-        glusterfs_file_t        fh = NULL;</div><div class='del'>-</div><div class='del'>-        gf_log ("booster", GF_LOG_TRACE, "fchown: fd %d, uid %d, gid %d", fd,</div><div class='del'>-                owner, group);</div><div class='del'>-        fh = booster_fdptr_get (booster_fdtable, fd);</div><div class='del'>-        if (!fh) {</div><div class='del'>-                gf_log ("booster", GF_LOG_TRACE, "Not a booster fd");</div><div class='del'>-                if (real_fchown == NULL) {</div><div class='del'>-                        errno = ENOSYS;</div><div class='del'>-                        ret = -1;</div><div class='del'>-                } else</div><div class='del'>-                        ret = real_fchown (fd, owner, group);</div><div class='del'>-        } else {</div><div class='del'>-                gf_log ("booster", GF_LOG_TRACE, "Is a booster fd");</div><div class='del'>-                ret = glusterfs_fchown (fh, owner, group);</div><div class='del'>-                booster_fdptr_put (fh);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-#define MOUNT_TABLE_HASH_SIZE 256</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-static void booster_cleanup (void);</div><div class='del'>-static int </div><div class='del'>-booster_init (void)</div><div class='del'>-{</div><div class='del'>-        char    *booster_conf_path = NULL;</div><div class='del'>-        int     ret = -1;</div><div class='del'>-        int     pipefd[2];</div><div class='del'>-</div><div class='del'>-        booster_fdtable = booster_fdtable_alloc ();</div><div class='del'>-        if (!booster_fdtable) {</div><div class='del'>-                fprintf (stderr, "cannot allocate fdtable: %s\n",</div><div class='del'>-                         strerror (errno));</div><div class='del'>-		goto err;</div><div class='del'>-        }</div><div class='del'>- </div><div class='del'>-        if (pipe (pipefd) == -1) {</div><div class='del'>-                gf_log ("booster-fstab", GF_LOG_ERROR, "Pipe creation failed:%s"</div><div class='del'>-                        , strerror (errno));</div><div class='del'>-                goto err;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        process_piped_fd = pipefd[0];</div><div class='del'>-        real_close (pipefd[1]);</div><div class='del'>-        /* libglusterfsclient based VMPs should be inited only</div><div class='del'>-         * after the file tables are inited so that if the socket</div><div class='del'>-         * calls use the fd based syscalls, the fd tables are</div><div class='del'>-         * correctly initialized to return a NULL handle, on which the</div><div class='del'>-         * socket calls will fall-back to the real API.</div><div class='del'>-         */</div><div class='del'>-        booster_conf_path = getenv (BOOSTER_CONF_ENV_VAR);</div><div class='del'>-        if (booster_conf_path != NULL) {</div><div class='del'>-                if (strlen (booster_conf_path) &gt; 0)</div><div class='del'>-                        ret = booster_configure (booster_conf_path);</div><div class='del'>-                else {</div><div class='del'>-                        gf_log ("booster", GF_LOG_ERROR, "%s not defined, "</div><div class='del'>-                                "using default path: %s", BOOSTER_CONF_ENV_VAR,</div><div class='del'>-                                DEFAULT_BOOSTER_CONF);</div><div class='del'>-                        ret = booster_configure (DEFAULT_BOOSTER_CONF);</div><div class='del'>-                }</div><div class='del'>-        } else {</div><div class='del'>-                gf_log ("booster", GF_LOG_ERROR, "%s not defined, using default"</div><div class='del'>-                        " path: %s", BOOSTER_CONF_ENV_VAR,DEFAULT_BOOSTER_CONF);</div><div class='del'>-                ret = booster_configure (DEFAULT_BOOSTER_CONF);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        atexit (booster_cleanup);</div><div class='del'>-        if (ret == 0)</div><div class='del'>-                gf_log ("booster", GF_LOG_DEBUG, "booster is inited");</div><div class='del'>-	return 0;</div><div class='del'>-</div><div class='del'>-err:</div><div class='del'>-        /* Sure we return an error value here</div><div class='del'>-         * but who cares about booster.</div><div class='del'>-         */</div><div class='del'>-	return -1; </div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-static void</div><div class='del'>-booster_cleanup (void)</div><div class='del'>-{</div><div class='del'>-        /* Ideally, we should be de-initing the fd-table</div><div class='del'>-         * here but the problem is that I've seen file accesses through booster</div><div class='del'>-         * continuing while the atexit registered function is called. That means</div><div class='del'>-         * , we cannot dealloc the fd-table since then there could be a crash</div><div class='del'>-         * while trying to determine whether a given fd is for libc or for</div><div class='del'>-         * libglusterfsclient.</div><div class='del'>-         * We should be satisfied with having cleaned up glusterfs contexts.</div><div class='del'>-         */</div><div class='del'>-        glusterfs_umount_all ();</div><div class='del'>-	glusterfs_reset ();</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-fchmod (int fd, mode_t mode)</div><div class='del'>-{</div><div class='del'>-        int                     ret = -1;</div><div class='del'>-        glusterfs_file_t        fh = NULL;</div><div class='del'>-</div><div class='del'>-        gf_log ("booster", GF_LOG_TRACE, "fchmod: fd %d, mode: 0x%x", fd, mode);</div><div class='del'>-        fh = booster_fdptr_get (booster_fdtable, fd);</div><div class='del'>-        if (!fh) {</div><div class='del'>-                gf_log ("booster", GF_LOG_TRACE, "Not a booster fd");</div><div class='del'>-                if (real_fchmod == NULL) {</div><div class='del'>-                        errno = ENOSYS;</div><div class='del'>-                        ret = -1;</div><div class='del'>-                } else</div><div class='del'>-                        ret = real_fchmod (fd, mode);</div><div class='del'>-        } else {</div><div class='del'>-                gf_log ("booster", GF_LOG_TRACE, "Is a booster fd");</div><div class='del'>-                ret = glusterfs_fchmod (fh, mode);</div><div class='del'>-                booster_fdptr_put (fh);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-fsync (int fd)</div><div class='del'>-{</div><div class='del'>-        int                     ret = -1;</div><div class='del'>-        glusterfs_file_t        fh = NULL;</div><div class='del'>-</div><div class='del'>-        gf_log ("booster", GF_LOG_TRACE, "fsync: fd %d", fd);</div><div class='del'>-        fh = booster_fdptr_get (booster_fdtable, fd);</div><div class='del'>-        if (!fh) {</div><div class='del'>-                gf_log ("booster", GF_LOG_TRACE, "Not a booster fd");</div><div class='del'>-                if (real_fsync == NULL) {</div><div class='del'>-                        errno = ENOSYS;</div><div class='del'>-                        ret = -1;</div><div class='del'>-                } else</div><div class='del'>-                        ret = real_fsync (fd);</div><div class='del'>-        } else {</div><div class='del'>-                gf_log ("booster", GF_LOG_TRACE, "Is a booster fd");</div><div class='del'>-                ret = glusterfs_fsync (fh);</div><div class='del'>-                booster_fdptr_put (fh);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int __REDIRECT (booster_false_ftruncate, (int fd, off_t length),</div><div class='del'>-                ftruncate);</div><div class='del'>-int __REDIRECT (booster_false_ftruncate64, (int fd, loff_t length),</div><div class='del'>-                ftruncate64);</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-booster_false_ftruncate (int fd, off_t length)</div><div class='del'>-{</div><div class='del'>-        int                     ret = -1;</div><div class='del'>-        glusterfs_file_t        fh = NULL;</div><div class='del'>-</div><div class='del'>-        gf_log ("booster", GF_LOG_TRACE, "ftruncate: fd %d, length: %"PRIu64,fd</div><div class='del'>-                , length);</div><div class='del'>-        fh = booster_fdptr_get (booster_fdtable, fd);</div><div class='del'>-        if (!fh) {</div><div class='del'>-                gf_log ("booster", GF_LOG_TRACE, "Not a booster fd");</div><div class='del'>-                if (real_ftruncate == NULL) {</div><div class='del'>-                        errno = ENOSYS;</div><div class='del'>-                        ret = -1;</div><div class='del'>-                } else</div><div class='del'>-                        ret = real_ftruncate (fd, length);</div><div class='del'>-        } else {</div><div class='del'>-                gf_log ("booster", GF_LOG_TRACE, "Is a booster fd");</div><div class='del'>-                ret = glusterfs_ftruncate (fh, length);</div><div class='del'>-                booster_fdptr_put (fh);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-booster_false_ftruncate64 (int fd, loff_t length)</div><div class='del'>-{</div><div class='del'>-        int                     ret = -1;</div><div class='del'>-        glusterfs_file_t        fh = NULL;</div><div class='del'>-</div><div class='del'>-        gf_log ("booster", GF_LOG_TRACE, "ftruncate: fd %d, length: %"PRIu64,fd</div><div class='del'>-                , length);</div><div class='del'>-        fh = booster_fdptr_get (booster_fdtable, fd);</div><div class='del'>-        if (!fh) {</div><div class='del'>-                gf_log ("booster", GF_LOG_TRACE, "Not a booster fd");</div><div class='del'>-                if (real_ftruncate == NULL) {</div><div class='del'>-                        errno = ENOSYS;</div><div class='del'>-                        ret = -1;</div><div class='del'>-                } else</div><div class='del'>-                        ret = real_ftruncate64 (fd, length);</div><div class='del'>-        } else {</div><div class='del'>-                gf_log ("booster", GF_LOG_TRACE, "Is a booster fd");</div><div class='del'>-                ret = glusterfs_ftruncate (fh, length);</div><div class='del'>-                booster_fdptr_put (fh);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-link (const char *old, const char *new)</div><div class='del'>-{</div><div class='del'>-        int             ret = -1;</div><div class='del'>-</div><div class='del'>-        gf_log ("booster", GF_LOG_TRACE, "link: old: %s, new: %s", old, new);</div><div class='del'>-        ret = glusterfs_link (old, new);</div><div class='del'>-</div><div class='del'>-        if ((ret == -1) &amp;&amp; (errno != ENODEV)) {</div><div class='del'>-                gf_log ("booster", GF_LOG_ERROR, "Link failed: %s",</div><div class='del'>-                        strerror (errno));</div><div class='del'>-                return ret;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (ret == 0) {</div><div class='del'>-                gf_log ("booster", GF_LOG_TRACE, "link call succeeded");</div><div class='del'>-                return ret;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (real_link == NULL) {</div><div class='del'>-                errno = ENOSYS;</div><div class='del'>-                ret = -1;</div><div class='del'>-        } else</div><div class='del'>-                ret = real_link (old, new);</div><div class='del'>-</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-rename (const char *old, const char *new)</div><div class='del'>-{</div><div class='del'>-        int             ret = -1;</div><div class='del'>-</div><div class='del'>-        gf_log ("booster", GF_LOG_TRACE, "link: old: %s, new: %s", old, new);</div><div class='del'>-        ret = glusterfs_rename (old, new);</div><div class='del'>-</div><div class='del'>-        if ((ret == -1) &amp;&amp; (errno != ENODEV)) {</div><div class='del'>-                gf_log ("booster", GF_LOG_ERROR, "Rename failed: %s",</div><div class='del'>-                        strerror (errno));</div><div class='del'>-                return ret;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (ret == 0) {</div><div class='del'>-                gf_log ("booster", GF_LOG_TRACE, "Rename succeeded");</div><div class='del'>-                return ret;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (real_rename == NULL) {</div><div class='del'>-                errno = ENOSYS;</div><div class='del'>-                ret = -1;</div><div class='del'>-        } else</div><div class='del'>-                ret = real_rename (old, new);</div><div class='del'>-</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-utimes (const char *path, const struct timeval times[2])</div><div class='del'>-{</div><div class='del'>-        int             ret = -1;</div><div class='del'>-</div><div class='del'>-        gf_log ("booster", GF_LOG_TRACE, "utimes: path %s", path);</div><div class='del'>-        ret = glusterfs_utimes (path, times);</div><div class='del'>-        if ((ret == -1) &amp;&amp; (errno != ENODEV)) {</div><div class='del'>-                gf_log ("booster", GF_LOG_ERROR, "utimes failed: %s",</div><div class='del'>-                        strerror (errno));</div><div class='del'>-                return ret;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (ret == 0) {</div><div class='del'>-                gf_log ("booster", GF_LOG_TRACE, "utimes succeeded");</div><div class='del'>-                return ret;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (real_utimes == NULL) {</div><div class='del'>-                errno = ENOSYS;</div><div class='del'>-                ret = -1;</div><div class='del'>-        } else</div><div class='del'>-                ret = real_utimes (path, times);</div><div class='del'>-</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-utime (const char *path, const struct utimbuf *buf)</div><div class='del'>-{</div><div class='del'>-        int     ret = -1;</div><div class='del'>-</div><div class='del'>-        gf_log ("booster", GF_LOG_TRACE, "utime: path %s", path);</div><div class='del'>-        ret = glusterfs_utime (path, buf);</div><div class='del'>-</div><div class='del'>-        if ((ret == -1) &amp;&amp; (errno != ENODEV)) {</div><div class='del'>-                gf_log ("booster", GF_LOG_ERROR, "utime failed: %s",</div><div class='del'>-                        strerror (errno));</div><div class='del'>-                return ret;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (ret == 0) {</div><div class='del'>-                gf_log ("booster", GF_LOG_TRACE, "utime succeeded");</div><div class='del'>-                return ret;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (real_utime == NULL) {</div><div class='del'>-                errno = ENOSYS;</div><div class='del'>-                ret = -1;</div><div class='del'>-        } else</div><div class='del'>-                ret = real_utime (path, buf);</div><div class='del'>-</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-mknod (const char *path, mode_t mode, dev_t dev)</div><div class='del'>-{</div><div class='del'>-        int     ret = -1;</div><div class='del'>-</div><div class='del'>-        gf_log ("booster", GF_LOG_TRACE, "mknod: path %s", path);</div><div class='del'>-        ret = glusterfs_mknod (path, mode, dev);</div><div class='del'>-        if ((ret == -1) &amp;&amp; (errno != ENODEV)) {</div><div class='del'>-                gf_log ("booster", GF_LOG_ERROR, "mknod failed: %s",</div><div class='del'>-                        strerror (errno));</div><div class='del'>-                return ret;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (ret == 0) {</div><div class='del'>-                gf_log ("booster", GF_LOG_TRACE, "mknod succeeded");</div><div class='del'>-                return ret;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (real_mknod) {</div><div class='del'>-                errno = ENOSYS;</div><div class='del'>-                ret = -1;</div><div class='del'>-        } else</div><div class='del'>-                ret = real_mknod (path, mode, dev);</div><div class='del'>-</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-mkfifo (const  char *path, mode_t mode)</div><div class='del'>-{</div><div class='del'>-        int     ret = -1;</div><div class='del'>-</div><div class='del'>-        gf_log ("booster", GF_LOG_TRACE, "mkfifo: path %s", path);</div><div class='del'>-        ret = glusterfs_mkfifo (path, mode);</div><div class='del'>-        if ((ret == -1) &amp;&amp; (errno != ENODEV)) {</div><div class='del'>-                gf_log ("booster", GF_LOG_ERROR, "mkfifo failed: %s",</div><div class='del'>-                        strerror (errno));</div><div class='del'>-                return ret;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (ret == 0) {</div><div class='del'>-                gf_log ("booster", GF_LOG_TRACE, "mkfifo succeeded");</div><div class='del'>-                return ret;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (real_mkfifo == NULL) {</div><div class='del'>-                errno = ENOSYS;</div><div class='del'>-                ret = -1;</div><div class='del'>-        } else</div><div class='del'>-                ret = real_mkfifo (path, mode);</div><div class='del'>-</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-unlink (const char *path)</div><div class='del'>-{</div><div class='del'>-        int     ret = -1;</div><div class='del'>-</div><div class='del'>-        gf_log ("booster", GF_LOG_TRACE, "unlink: path %s", path);</div><div class='del'>-        ret = glusterfs_unlink (path);</div><div class='del'>-        if ((ret == -1) &amp;&amp; (errno != ENODEV)) {</div><div class='del'>-                gf_log ("booster", GF_LOG_ERROR, "unlink failed: %s",</div><div class='del'>-                        strerror (errno));</div><div class='del'>-                return ret;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (ret == 0) {</div><div class='del'>-                gf_log ("booster", GF_LOG_TRACE, "unlink succeeded");</div><div class='del'>-                return ret;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (real_unlink == NULL) {</div><div class='del'>-                errno = ENOSYS;</div><div class='del'>-                ret = -1;</div><div class='del'>-        } else</div><div class='del'>-                ret = real_unlink (path);</div><div class='del'>-</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-symlink (const char *oldpath, const char *newpath)</div><div class='del'>-{</div><div class='del'>-        int     ret = -1;</div><div class='del'>-</div><div class='del'>-        gf_log ("booster", GF_LOG_TRACE, "symlink: old: %s, new: %s",</div><div class='del'>-                oldpath, newpath);</div><div class='del'>-        ret = glusterfs_symlink (oldpath, newpath);</div><div class='del'>-        if ((ret == -1) &amp;&amp; (errno != ENODEV)) {</div><div class='del'>-                gf_log ("booster", GF_LOG_ERROR, "symlink failed: %s",</div><div class='del'>-                        strerror (errno));</div><div class='del'>-                return ret;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (ret == 0) {</div><div class='del'>-                gf_log ("booster", GF_LOG_TRACE, "symlink succeeded");</div><div class='del'>-                return ret;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (real_symlink == NULL) {</div><div class='del'>-                errno = ENOSYS;</div><div class='del'>-                ret = -1;</div><div class='del'>-        } else</div><div class='del'>-                ret = real_symlink (oldpath, newpath);</div><div class='del'>-</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-readlink (const char *path, char *buf, size_t bufsize)</div><div class='del'>-{</div><div class='del'>-        int     ret = -1;</div><div class='del'>-</div><div class='del'>-        gf_log ("booster", GF_LOG_TRACE, "readlink: path %s", path);</div><div class='del'>-        ret = glusterfs_readlink (path, buf, bufsize);</div><div class='del'>-        if ((ret == -1) &amp;&amp; (errno != ENODEV)) {</div><div class='del'>-                gf_log ("booster", GF_LOG_ERROR, "readlink failed: %s",</div><div class='del'>-                        strerror (errno));</div><div class='del'>-                return ret;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (ret &gt; 0) {</div><div class='del'>-                gf_log ("booster", GF_LOG_TRACE, "readlink succeeded");</div><div class='del'>-                return ret;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (real_readlink == NULL) {</div><div class='del'>-                errno = ENOSYS;</div><div class='del'>-                ret = -1;</div><div class='del'>-        } else</div><div class='del'>-                ret = real_readlink (path, buf, bufsize);</div><div class='del'>-</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-char *</div><div class='del'>-realpath (const char *path, char *resolved_path)</div><div class='del'>-{</div><div class='del'>-        char    *res = NULL;</div><div class='del'>-</div><div class='del'>-        gf_log ("booster", GF_LOG_TRACE, "realpath: path %s", path);</div><div class='del'>-        res = glusterfs_realpath (path, resolved_path);</div><div class='del'>-        if ((res == NULL) &amp;&amp; (errno != ENODEV)) {</div><div class='del'>-                gf_log ("booster", GF_LOG_ERROR, "realpath failed: %s",</div><div class='del'>-                        strerror (errno));</div><div class='del'>-                return res;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (res != NULL) {</div><div class='del'>-                gf_log ("booster", GF_LOG_TRACE, "realpath succeeded");</div><div class='del'>-                return res;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (real_realpath == NULL) {</div><div class='del'>-                errno = ENOSYS;</div><div class='del'>-                res = NULL;</div><div class='del'>-        } else</div><div class='del'>-                res = real_realpath (path, resolved_path);</div><div class='del'>-</div><div class='del'>-        return res;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-#define BOOSTER_GL_DIR          1</div><div class='del'>-#define BOOSTER_POSIX_DIR       2</div><div class='del'>-</div><div class='del'>-struct booster_dir_handle {</div><div class='del'>-        int type;</div><div class='del'>-        void *dirh;</div><div class='del'>-};</div><div class='del'>-</div><div class='del'>-DIR *</div><div class='del'>-opendir (const char *path)</div><div class='del'>-{</div><div class='del'>-        glusterfs_dir_t                 gdir = NULL;</div><div class='del'>-        struct booster_dir_handle       *bh = NULL;</div><div class='del'>-        DIR                             *pdir = NULL;</div><div class='del'>-</div><div class='del'>-        gf_log ("booster", GF_LOG_TRACE, "opendir: path: %s", path);</div><div class='del'>-        bh = calloc (1, sizeof (struct booster_dir_handle));</div><div class='del'>-        if (!bh) {</div><div class='del'>-                gf_log ("booster", GF_LOG_ERROR, "memory allocation failed");</div><div class='del'>-                errno = ENOMEM;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        gdir = glusterfs_opendir (path);</div><div class='del'>-        if (gdir) {</div><div class='del'>-                gf_log ("booster", GF_LOG_TRACE, "Gluster dir opened");</div><div class='del'>-                bh-&gt;type = BOOSTER_GL_DIR;</div><div class='del'>-                bh-&gt;dirh = (void *)gdir;</div><div class='del'>-                goto out;</div><div class='del'>-        } else if ((!gdir) &amp;&amp; (errno != ENODEV)) {</div><div class='del'>-                gf_log ("booster", GF_LOG_ERROR, "Opendir failed");</div><div class='del'>-                goto free_out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (real_opendir == NULL) {</div><div class='del'>-                errno = ENOSYS;</div><div class='del'>-                goto free_out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        pdir = real_opendir (path);</div><div class='del'>-</div><div class='del'>-        if (pdir) {</div><div class='del'>-                bh-&gt;type = BOOSTER_POSIX_DIR;</div><div class='del'>-                bh-&gt;dirh = (void *)pdir;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-free_out:</div><div class='del'>-        if (bh) {</div><div class='del'>-                free (bh);</div><div class='del'>-                bh = NULL;</div><div class='del'>-        }</div><div class='del'>-out:</div><div class='del'>-        return (DIR *)bh;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int __REDIRECT (booster_false_readdir_r, (DIR *dir, struct dirent *entry,</div><div class='del'>-                struct dirent **result), readdir_r) __nonnull ((1));</div><div class='del'>-int __REDIRECT (booster_false_readdir64_r, (DIR *dir, struct dirent64 *entry,</div><div class='del'>-                struct dirent64 **result), readdir64_r) __nonnull ((1));</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-booster_false_readdir_r (DIR *dir, struct dirent *entry, struct dirent **result)</div><div class='del'>-{</div><div class='del'>-        struct booster_dir_handle       *bh = (struct booster_dir_handle *)dir;</div><div class='del'>-        int                              ret = 0;  </div><div class='del'>-</div><div class='del'>-        if (!bh) {</div><div class='del'>-                ret = errno = EFAULT;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (bh-&gt;type == BOOSTER_GL_DIR) {</div><div class='del'>-                gf_log ("booster", GF_LOG_TRACE, "readdir_r on gluster");</div><div class='del'>-                ret = glusterfs_readdir_r ((glusterfs_dir_t)bh-&gt;dirh, entry,</div><div class='del'>-                                           result);</div><div class='del'>-                </div><div class='del'>-        } else if (bh-&gt;type == BOOSTER_POSIX_DIR) {</div><div class='del'>-                gf_log ("booster", GF_LOG_TRACE, "readdir_r on posix");</div><div class='del'>-                if (real_readdir_r == NULL) {</div><div class='del'>-                        ret = errno = ENOSYS;</div><div class='del'>-                        goto out;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                ret = real_readdir_r ((DIR *)bh-&gt;dirh, entry, result);</div><div class='del'>-        } else {</div><div class='del'>-                ret = errno = EINVAL;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        return  ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-booster_false_readdir64_r (DIR *dir, struct dirent64 *entry,</div><div class='del'>-                           struct dirent64 **result)</div><div class='del'>-{</div><div class='del'>-        struct booster_dir_handle       *bh = (struct booster_dir_handle *)dir;</div><div class='del'>-        int                              ret = 0;  </div><div class='del'>-</div><div class='del'>-        if (!bh) {</div><div class='del'>-                ret = errno = EFAULT;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (bh-&gt;type == BOOSTER_GL_DIR) {</div><div class='del'>-                gf_log ("booster", GF_LOG_TRACE, "readdir_r on gluster");</div><div class='del'>-                ret = glusterfs_readdir_r ((glusterfs_dir_t)bh-&gt;dirh,</div><div class='del'>-                                           (struct dirent *)entry,</div><div class='del'>-                                           (struct dirent **)result);</div><div class='del'>-        } else if (bh-&gt;type == BOOSTER_POSIX_DIR) {</div><div class='del'>-                gf_log ("booster", GF_LOG_TRACE, "readdir_r on posix");</div><div class='del'>-                if (real_readdir64_r == NULL) {</div><div class='del'>-                        ret = errno = ENOSYS;</div><div class='del'>-                        goto out;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                ret = real_readdir64_r ((DIR *)bh-&gt;dirh, entry, result);</div><div class='del'>-        } else {</div><div class='del'>-                ret = errno = EINVAL;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        return  ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-struct dirent *</div><div class='del'>-__REDIRECT (booster_false_readdir, (DIR *dir), readdir) __nonnull ((1));</div><div class='del'>-</div><div class='del'>-struct dirent64 *</div><div class='del'>-__REDIRECT (booster_false_readdir64, (DIR *dir), readdir64) __nonnull ((1));</div><div class='del'>-</div><div class='del'>-struct dirent *</div><div class='del'>-booster_false_readdir (DIR *dir)</div><div class='del'>-{</div><div class='del'>-        struct booster_dir_handle       *bh = (struct booster_dir_handle *)dir;</div><div class='del'>-        struct dirent                   *dirp = NULL;</div><div class='del'>-</div><div class='del'>-        if (!bh) {</div><div class='del'>-                errno = EFAULT;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (bh-&gt;type == BOOSTER_GL_DIR) {</div><div class='del'>-                gf_log ("booster", GF_LOG_TRACE, "readdir on gluster");</div><div class='del'>-                dirp = glusterfs_readdir ((glusterfs_dir_t)bh-&gt;dirh);</div><div class='del'>-        } else if (bh-&gt;type == BOOSTER_POSIX_DIR) {</div><div class='del'>-                gf_log ("booster", GF_LOG_TRACE, "readdir on posix");</div><div class='del'>-                if (real_readdir == NULL) {</div><div class='del'>-                        errno = ENOSYS;</div><div class='del'>-                        dirp = NULL;</div><div class='del'>-                        goto out;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                dirp = real_readdir ((DIR *)bh-&gt;dirh);</div><div class='del'>-        } else {</div><div class='del'>-                dirp = NULL;</div><div class='del'>-                errno = EINVAL;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        return  dirp;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-struct dirent64 *</div><div class='del'>-booster_false_readdir64 (DIR *dir)</div><div class='del'>-{</div><div class='del'>-        struct booster_dir_handle       *bh = (struct booster_dir_handle *)dir;</div><div class='del'>-        struct dirent64                 *dirp = NULL;</div><div class='del'>-</div><div class='del'>-        if (!bh) {</div><div class='del'>-                errno = EFAULT;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (bh-&gt;type == BOOSTER_GL_DIR) {</div><div class='del'>-                gf_log ("booster", GF_LOG_TRACE, "readdir on gluster");</div><div class='del'>-                dirp = glusterfs_readdir ((glusterfs_dir_t)bh-&gt;dirh);</div><div class='del'>-        } else if (bh-&gt;type == BOOSTER_POSIX_DIR) {</div><div class='del'>-                gf_log ("booster", GF_LOG_TRACE, "readdir on posix");</div><div class='del'>-                if (real_readdir == NULL) {</div><div class='del'>-                        errno = ENOSYS;</div><div class='del'>-                        dirp = NULL;</div><div class='del'>-                        goto out;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                dirp = real_readdir64 ((DIR *)bh-&gt;dirh);</div><div class='del'>-        } else {</div><div class='del'>-                dirp = NULL;</div><div class='del'>-                errno = EINVAL;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        return  dirp;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-closedir (DIR *dh)</div><div class='del'>-{</div><div class='del'>-        struct booster_dir_handle       *bh = (struct booster_dir_handle *)dh;</div><div class='del'>-        int                             ret = -1;</div><div class='del'>-</div><div class='del'>-        if (!bh) {</div><div class='del'>-                errno = EFAULT;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (bh-&gt;type == BOOSTER_GL_DIR) {</div><div class='del'>-                gf_log ("booster", GF_LOG_TRACE, "closedir on gluster");</div><div class='del'>-                ret = glusterfs_closedir ((glusterfs_dir_t)bh-&gt;dirh);</div><div class='del'>-        } else if (bh-&gt;type == BOOSTER_POSIX_DIR) {</div><div class='del'>-                gf_log ("booster", GF_LOG_TRACE, "closedir on posix");</div><div class='del'>-                if (real_closedir == NULL) {</div><div class='del'>-                        errno = ENOSYS;</div><div class='del'>-                        ret = -1;</div><div class='del'>-                } else</div><div class='del'>-                        ret = real_closedir ((DIR *)bh-&gt;dirh);</div><div class='del'>-        } else {</div><div class='del'>-                errno = EBADF;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (ret == 0) {</div><div class='del'>-                free (bh);</div><div class='del'>-                bh = NULL;</div><div class='del'>-        }</div><div class='del'>-out:</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-/* The real stat functions reside in booster_stat.c to</div><div class='del'>- * prevent clash with the statX prototype and functions</div><div class='del'>- * declared from sys/stat.h</div><div class='del'>- */</div><div class='del'>-int</div><div class='del'>-booster_xstat (int ver, const char *path, void *buf)</div><div class='del'>-{</div><div class='del'>-        struct stat     *sbuf = (struct stat *)buf;</div><div class='del'>-        int             ret = -1;</div><div class='del'>-</div><div class='del'>-        gf_log ("booster", GF_LOG_TRACE, "xstat: path: %s", path);</div><div class='del'>-        ret = glusterfs_stat (path, sbuf);</div><div class='del'>-        if ((ret == -1) &amp;&amp; (errno != ENODEV)) {</div><div class='del'>-                gf_log ("booster", GF_LOG_ERROR, "xstat failed: %s",</div><div class='del'>-                        strerror (errno));</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (ret == 0) {</div><div class='del'>-                gf_log ("booster", GF_LOG_TRACE, "xstat succeeded");</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (real___xstat == NULL) {</div><div class='del'>-                ret = -1;</div><div class='del'>-                errno = ENOSYS;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        ret = real___xstat (ver, path, sbuf);</div><div class='del'>-out:</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-booster_xstat64 (int ver, const char *path, void *buf)</div><div class='del'>-{</div><div class='del'>-        int             ret = -1;</div><div class='del'>-        struct stat64   *sbuf = (struct stat64 *)buf;</div><div class='del'>-</div><div class='del'>-        gf_log ("booster", GF_LOG_TRACE, "xstat64: path: %s", path);</div><div class='del'>-        ret = glusterfs_stat (path, (struct stat *)sbuf);</div><div class='del'>-        if ((ret == -1) &amp;&amp; (errno != ENODEV)) {</div><div class='del'>-                gf_log ("booster", GF_LOG_ERROR, "xstat64 failed: %s",</div><div class='del'>-                        strerror (errno));</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (ret == 0) {</div><div class='del'>-                gf_log ("booster", GF_LOG_TRACE, "xstat64 succeeded");</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (real___xstat64 == NULL) {</div><div class='del'>-                errno = ENOSYS;</div><div class='del'>-                ret = -1;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        ret = real___xstat64 (ver, path, sbuf);</div><div class='del'>-out:</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-booster_stat (const char *path, void *buf)</div><div class='del'>-{</div><div class='del'>-        struct stat     *sbuf = (struct stat *)buf;</div><div class='del'>-        int             ret = -1;</div><div class='del'>-</div><div class='del'>-        gf_log ("booster", GF_LOG_TRACE, "stat: path: %s", path);</div><div class='del'>-        ret = glusterfs_stat (path, sbuf);</div><div class='del'>-        if ((ret == -1) &amp;&amp; (errno != ENODEV)) {</div><div class='del'>-                gf_log ("booster", GF_LOG_ERROR, "stat failed: %s",</div><div class='del'>-                        strerror (errno));</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (ret == 0) {</div><div class='del'>-                gf_log ("booster", GF_LOG_TRACE, "stat succeeded");</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (real_stat != NULL)</div><div class='del'>-                ret = real_stat (path, sbuf);</div><div class='del'>-        else if (real___xstat != NULL)</div><div class='del'>-                ret = real___xstat (0, path, sbuf);</div><div class='del'>-        else {</div><div class='del'>-                errno = ENOSYS;</div><div class='del'>-                ret = -1;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-booster_stat64 (const char *path, void *buf)</div><div class='del'>-{</div><div class='del'>-        int             ret = -1;</div><div class='del'>-        struct stat64   *sbuf = (struct stat64 *)buf;</div><div class='del'>-</div><div class='del'>-        gf_log ("booster", GF_LOG_TRACE, "stat64: %s", path);</div><div class='del'>-        ret = glusterfs_stat (path, (struct stat *)sbuf);</div><div class='del'>-        if ((ret == -1) &amp;&amp; (errno != ENODEV)) {</div><div class='del'>-                gf_log ("booster", GF_LOG_ERROR, "stat64 failed: %s",</div><div class='del'>-                        strerror (errno));</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (ret == 0) {</div><div class='del'>-                gf_log ("booster", GF_LOG_TRACE, "stat64 succeeded");</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (real_stat64 != NULL)</div><div class='del'>-                ret = real_stat64 (path, sbuf);</div><div class='del'>-        else if (real___xstat64 != NULL)</div><div class='del'>-                ret = real___xstat64 (0, path, sbuf);</div><div class='del'>-        else {</div><div class='del'>-                errno = ENOSYS;</div><div class='del'>-                ret = -1;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-booster_fxstat (int ver, int fd, void *buf)</div><div class='del'>-{</div><div class='del'>-        struct stat             *sbuf = (struct stat *)buf;</div><div class='del'>-        int                     ret = -1;</div><div class='del'>-        glusterfs_file_t        fh = NULL;</div><div class='del'>-</div><div class='del'>-        gf_log ("booster", GF_LOG_TRACE, "fxstat: fd %d", fd);</div><div class='del'>-        fh = booster_fdptr_get (booster_fdtable, fd);</div><div class='del'>-        if (!fh) {</div><div class='del'>-                gf_log ("booster", GF_LOG_TRACE, "Not a booster fd");</div><div class='del'>-                if (real___fxstat == NULL) {</div><div class='del'>-                        errno = ENOSYS;</div><div class='del'>-                        ret = -1;</div><div class='del'>-                        goto out;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                ret = real___fxstat (ver, fd, sbuf);</div><div class='del'>-        } else {</div><div class='del'>-                gf_log ("booster", GF_LOG_TRACE, "Is a booster fd");</div><div class='del'>-                ret = glusterfs_fstat (fh, sbuf);</div><div class='del'>-                booster_fdptr_put (fh);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-booster_fxstat64 (int ver, int fd, void *buf)</div><div class='del'>-{</div><div class='del'>-        int                     ret = -1;</div><div class='del'>-        struct stat64           *sbuf = (struct stat64 *)buf;</div><div class='del'>-        glusterfs_file_t        fh = NULL;</div><div class='del'>-</div><div class='del'>-        gf_log ("booster", GF_LOG_TRACE, "fxstat64: fd %d", fd);</div><div class='del'>-        fh = booster_fdptr_get (booster_fdtable, fd);</div><div class='del'>-        if (!fh) {</div><div class='del'>-                gf_log ("booster", GF_LOG_TRACE, "Not a booster fd");</div><div class='del'>-                if (real___fxstat64 == NULL) {</div><div class='del'>-                        ret = -1;</div><div class='del'>-                        errno = ENOSYS;</div><div class='del'>-                        goto out;</div><div class='del'>-                }</div><div class='del'>-                ret = real___fxstat64 (ver, fd, sbuf);</div><div class='del'>-        } else {</div><div class='del'>-                gf_log ("booster", GF_LOG_TRACE, "Is a booster fd");</div><div class='del'>-                ret = glusterfs_fstat (fh, (struct stat *)sbuf);</div><div class='del'>-                booster_fdptr_put (fh);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-booster_fstat (int fd, void *buf)</div><div class='del'>-{</div><div class='del'>-        struct stat             *sbuf = (struct stat *)buf;</div><div class='del'>-        int                     ret = -1;</div><div class='del'>-        glusterfs_file_t        fh = NULL;</div><div class='del'>-</div><div class='del'>-        gf_log ("booster", GF_LOG_TRACE, "fstat: fd %d", fd);</div><div class='del'>-        fh = booster_fdptr_get (booster_fdtable, fd);</div><div class='del'>-        if (!fh) {</div><div class='del'>-                gf_log ("booster", GF_LOG_TRACE, "Not a booster fd");</div><div class='del'>-                if (real_fstat != NULL)</div><div class='del'>-                        ret = real_fstat (fd, sbuf);</div><div class='del'>-                else if (real___fxstat != NULL)</div><div class='del'>-                        ret = real___fxstat (0, fd, sbuf);</div><div class='del'>-                else {</div><div class='del'>-                        ret = -1;</div><div class='del'>-                        errno = ENOSYS;</div><div class='del'>-                        goto out;</div><div class='del'>-                }</div><div class='del'>-        } else {</div><div class='del'>-                gf_log ("booster", GF_LOG_TRACE, "Is a booster fd");</div><div class='del'>-                ret = glusterfs_fstat (fh, sbuf);</div><div class='del'>-                booster_fdptr_put (fh);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-booster_fstat64 (int fd, void *buf)</div><div class='del'>-{</div><div class='del'>-        int                     ret = -1;</div><div class='del'>-        struct stat64           *sbuf = (struct stat64 *)buf;</div><div class='del'>-        glusterfs_file_t        fh = NULL;</div><div class='del'>-</div><div class='del'>-        gf_log ("booster", GF_LOG_TRACE, "fstat64: fd %d", fd);</div><div class='del'>-        fh = booster_fdptr_get (booster_fdtable, fd);</div><div class='del'>-        if (!fh) {</div><div class='del'>-                gf_log ("booster", GF_LOG_TRACE, "Not a booster fd");</div><div class='del'>-                if (real_fstat64 != NULL)</div><div class='del'>-                        ret = real_fstat64 (fd, sbuf);</div><div class='del'>-                else if (real___fxstat64 != NULL)</div><div class='del'>-                        /* Not sure how portable the use of 0 for</div><div class='del'>-                         * version number is but it works over glibc.</div><div class='del'>-                         * We need this because, I've</div><div class='del'>-                         * observed that all the above real* functors can be</div><div class='del'>-                         * NULL. In that case, this is our last and only option.</div><div class='del'>-                         */</div><div class='del'>-                        ret = real___fxstat64 (0, fd, sbuf);</div><div class='del'>-                else {</div><div class='del'>-                        ret = -1;</div><div class='del'>-                        errno = ENOSYS;</div><div class='del'>-                        goto out;</div><div class='del'>-                }</div><div class='del'>-        } else {</div><div class='del'>-                gf_log ("booster", GF_LOG_TRACE, "Is a booster fd");</div><div class='del'>-                ret = glusterfs_fstat (fh, (struct stat *)sbuf);</div><div class='del'>-                booster_fdptr_put (fh);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-booster_lxstat (int ver, const char *path, void *buf)</div><div class='del'>-{</div><div class='del'>-        struct stat     *sbuf = (struct stat *)buf;</div><div class='del'>-        int             ret = -1;</div><div class='del'>-</div><div class='del'>-        gf_log ("booster", GF_LOG_TRACE, "lxstat: path %s", path);</div><div class='del'>-        ret = glusterfs_lstat (path, sbuf);</div><div class='del'>-        if ((ret == -1) &amp;&amp; (errno != ENODEV)) {</div><div class='del'>-                gf_log ("booster", GF_LOG_ERROR, "lxstat failed: %s",</div><div class='del'>-                        strerror (errno));</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (ret == 0) {</div><div class='del'>-                gf_log ("booster", GF_LOG_TRACE, "lxstat succeeded");</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (real___lxstat == NULL) {</div><div class='del'>-                ret = -1;</div><div class='del'>-                errno = ENOSYS;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        ret = real___lxstat (ver, path, sbuf);</div><div class='del'>-out:</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-booster_lxstat64 (int ver, const char *path, void *buf)</div><div class='del'>-{</div><div class='del'>-        int             ret = -1;</div><div class='del'>-        struct stat64   *sbuf = (struct stat64 *)buf;</div><div class='del'>-</div><div class='del'>-        gf_log ("booster", GF_LOG_TRACE, "lxstat64: path %s", path);</div><div class='del'>-        ret = glusterfs_lstat (path, (struct stat *)sbuf);</div><div class='del'>-        if ((ret == -1) &amp;&amp; (errno != ENODEV)) {</div><div class='del'>-                gf_log ("booster", GF_LOG_ERROR, "lxstat64 failed: %s",</div><div class='del'>-                        strerror (errno));</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (ret == 0) {</div><div class='del'>-                gf_log ("booster", GF_LOG_TRACE, "lxstat64 succeeded");</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (real___lxstat64 == NULL) {</div><div class='del'>-                errno = ENOSYS;</div><div class='del'>-                ret = -1;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        ret = real___lxstat64 (ver, path, sbuf);</div><div class='del'>-out:</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-booster_lstat (const char *path, void *buf)</div><div class='del'>-{</div><div class='del'>-        struct stat     *sbuf = (struct stat *)buf;</div><div class='del'>-        int             ret = -1;</div><div class='del'>-</div><div class='del'>-        gf_log ("booster", GF_LOG_TRACE, "lstat: path %s", path);</div><div class='del'>-        ret = glusterfs_lstat (path, sbuf);</div><div class='del'>-        if ((ret == -1) &amp;&amp; (errno != ENODEV)) {</div><div class='del'>-                gf_log ("booster", GF_LOG_ERROR, "lstat failed: %s",</div><div class='del'>-                        strerror (errno));</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (ret == 0) {</div><div class='del'>-                gf_log ("booster", GF_LOG_TRACE, "lstat succeeded");</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (real_lstat != NULL)</div><div class='del'>-                ret = real_lstat (path, sbuf);</div><div class='del'>-        else if (real___lxstat != NULL)</div><div class='del'>-                ret = real___lxstat (0, path, sbuf);</div><div class='del'>-        else {</div><div class='del'>-                errno = ENOSYS;</div><div class='del'>-                ret = -1;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-booster_lstat64 (const char *path, void *buf)</div><div class='del'>-{</div><div class='del'>-        int             ret = -1;</div><div class='del'>-        struct stat64   *sbuf = (struct stat64 *)buf;</div><div class='del'>-</div><div class='del'>-        gf_log ("booster", GF_LOG_TRACE, "lstat64: path %s", path);</div><div class='del'>-        ret = glusterfs_lstat (path, (struct stat *)sbuf);</div><div class='del'>-        if ((ret == -1) &amp;&amp; (errno != ENODEV)) {</div><div class='del'>-                gf_log ("booster", GF_LOG_ERROR, "lstat64 failed: %s",</div><div class='del'>-                        strerror (errno));</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (ret == 0) {</div><div class='del'>-                gf_log ("booster", GF_LOG_TRACE, "lstat64 succeeded");</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (real_lstat64 != NULL)</div><div class='del'>-                ret = real_lstat64 (path, sbuf);</div><div class='del'>-        else if (real___lxstat64 != NULL)</div><div class='del'>-                ret = real___lxstat64 (0, path, sbuf);</div><div class='del'>-        else {</div><div class='del'>-                errno = ENOSYS;</div><div class='del'>-                ret = -1;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-booster_statfs (const char *pathname, struct statfs *buf)</div><div class='del'>-{</div><div class='del'>-        int             ret = -1;</div><div class='del'>-</div><div class='del'>-        gf_log ("booster", GF_LOG_TRACE, "statfs: path %s", pathname);</div><div class='del'>-        ret = glusterfs_statfs (pathname, buf);</div><div class='del'>-        if ((ret == -1) &amp;&amp; (errno != ENODEV)) {</div><div class='del'>-                gf_log ("booster", GF_LOG_ERROR, "statfs failed: %s",</div><div class='del'>-                        strerror (errno));</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (ret == 0) {</div><div class='del'>-                gf_log ("booster", GF_LOG_TRACE, "statfs succeeded");</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (real_statfs == NULL) {</div><div class='del'>-                ret = -1;</div><div class='del'>-                errno = ENOSYS;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        ret = real_statfs (pathname, buf);</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-booster_statfs64 (const char *pathname, struct statfs64 *buf)</div><div class='del'>-{</div><div class='del'>-        int             ret = -1;</div><div class='del'>-</div><div class='del'>-        gf_log ("booster", GF_LOG_TRACE, "stat64: path %s", pathname);</div><div class='del'>-        ret = glusterfs_statfs (pathname, (struct statfs *)buf);</div><div class='del'>-        if ((ret == -1) &amp;&amp; (errno != ENODEV)) {</div><div class='del'>-                gf_log ("booster", GF_LOG_ERROR, "statfs64 failed: %s",</div><div class='del'>-                        strerror (errno));</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (ret == 0) {</div><div class='del'>-                gf_log ("booster", GF_LOG_TRACE, "statfs64 succeeded");</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (real_statfs64 == NULL) {</div><div class='del'>-                ret = -1;</div><div class='del'>-                errno = ENOSYS;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        ret = real_statfs64 (pathname, buf);</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-booster_statvfs (const char *pathname, struct statvfs *buf)</div><div class='del'>-{</div><div class='del'>-        int             ret = -1;</div><div class='del'>-</div><div class='del'>-        gf_log ("booster", GF_LOG_TRACE, "statvfs: path %s", pathname);</div><div class='del'>-        ret = glusterfs_statvfs (pathname, buf);</div><div class='del'>-        if ((ret == -1) &amp;&amp; (errno != ENODEV)) {</div><div class='del'>-                gf_log ("booster", GF_LOG_ERROR, "statvfs failed: %s",</div><div class='del'>-                        strerror (errno));</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (ret == 0) {</div><div class='del'>-                gf_log ("booster", GF_LOG_TRACE, "statvfs succeeded");</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (real_statvfs == NULL) {</div><div class='del'>-                ret = -1;</div><div class='del'>-                errno = ENOSYS;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        ret = real_statvfs (pathname, buf);</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-booster_statvfs64 (const char *pathname, struct statvfs64 *buf)</div><div class='del'>-{</div><div class='del'>-        int             ret = -1;</div><div class='del'>-</div><div class='del'>-        gf_log ("booster", GF_LOG_TRACE, "statvfs64: path %s", pathname);</div><div class='del'>-        ret = glusterfs_statvfs (pathname, (struct statvfs *)buf);</div><div class='del'>-        if ((ret == -1) &amp;&amp; (errno != ENODEV)) {</div><div class='del'>-                gf_log ("booster", GF_LOG_ERROR, "statvfs64 failed: %s",</div><div class='del'>-                        strerror (errno));</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (ret == 0) {</div><div class='del'>-                gf_log ("booster", GF_LOG_TRACE, "statvfs64 succeeded");</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (real_statvfs64 == NULL) {</div><div class='del'>-                ret = -1;</div><div class='del'>-                errno = ENOSYS;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        ret = real_statvfs64 (pathname, buf);</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-getxattr (const char *path, const char *name, void *value, size_t size)</div><div class='del'>-{</div><div class='del'>-        int     ret = -1;</div><div class='del'>-</div><div class='del'>-        gf_log ("booster", GF_LOG_TRACE, "getxattr: path %s, name %s", path,</div><div class='del'>-                name);</div><div class='del'>-        ret = glusterfs_getxattr (path, name, value, size);</div><div class='del'>-        if ((ret == -1) &amp;&amp; (errno != ENODEV)) {</div><div class='del'>-                gf_log ("booster", GF_LOG_ERROR, "getxattr failed: %s",</div><div class='del'>-                        strerror (errno));</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (ret &gt; 0) {</div><div class='del'>-                gf_log ("booster", GF_LOG_TRACE, "getxattr succeeded");</div><div class='del'>-                return ret;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (real_getxattr == NULL) {</div><div class='del'>-                ret = -1;</div><div class='del'>-                errno = ENOSYS;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        ret = real_getxattr (path, name, value, size);</div><div class='del'>-out:</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-lgetxattr (const char *path, const char *name, void *value, size_t size)</div><div class='del'>-{</div><div class='del'>-        int     ret = -1;</div><div class='del'>-</div><div class='del'>-        gf_log ("booster", GF_LOG_TRACE, "lgetxattr: path %s, name %s", path,</div><div class='del'>-                name);</div><div class='del'>-        ret = glusterfs_lgetxattr (path, name, value, size);</div><div class='del'>-        if ((ret == -1) &amp;&amp; (errno != ENODEV)) {</div><div class='del'>-                gf_log ("booster", GF_LOG_ERROR, "lgetxattr failed: %s",</div><div class='del'>-                        strerror (errno));</div><div class='del'>-</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (ret &gt; 0) {</div><div class='del'>-                gf_log ("booster", GF_LOG_TRACE, "lgetxattr succeeded");</div><div class='del'>-                return ret;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (real_lgetxattr == NULL) {</div><div class='del'>-                ret = -1;</div><div class='del'>-                errno = ENOSYS;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        ret = real_lgetxattr (path, name, value, size);</div><div class='del'>-out:</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-remove (const char *path)</div><div class='del'>-{</div><div class='del'>-        int     ret = -1;</div><div class='del'>-</div><div class='del'>-        gf_log ("booster", GF_LOG_TRACE, "remove: %s", path);</div><div class='del'>-        ret = glusterfs_remove (path);</div><div class='del'>-        if ((ret == -1) &amp;&amp; (errno != ENODEV)) {</div><div class='del'>-                gf_log ("booster", GF_LOG_ERROR, "remove failed: %s",</div><div class='del'>-                        strerror (errno));</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (ret == 0) {</div><div class='del'>-                gf_log ("booster", GF_LOG_TRACE, "remove succeeded");</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (real_remove == NULL) {</div><div class='del'>-                errno = ENOSYS;</div><div class='del'>-                ret = -1;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        ret = real_remove (path);</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-lchown (const char *path, uid_t owner, gid_t group)</div><div class='del'>-{</div><div class='del'>-        int     ret = -1;</div><div class='del'>-</div><div class='del'>-        gf_log ("booster", GF_LOG_TRACE, "lchown: path %s", path);</div><div class='del'>-        ret = glusterfs_lchown (path, owner, group);</div><div class='del'>-        if ((ret == -1) &amp;&amp; (errno != ENODEV)) {</div><div class='del'>-                gf_log ("booster", GF_LOG_ERROR, "lchown failed: %s",</div><div class='del'>-                        strerror (errno));</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (ret == 0) {</div><div class='del'>-                gf_log ("booster", GF_LOG_ERROR, "lchown succeeded");</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (real_lchown == NULL) {</div><div class='del'>-                errno = ENOSYS;</div><div class='del'>-                ret = -1;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        ret = real_lchown (path, owner, group);</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-void</div><div class='del'>-booster_rewinddir (DIR *dir)</div><div class='del'>-{</div><div class='del'>-        struct booster_dir_handle       *bh = (struct booster_dir_handle *)dir;</div><div class='del'>-</div><div class='del'>-        if (!bh) {</div><div class='del'>-                errno = EFAULT;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (bh-&gt;type == BOOSTER_GL_DIR) {</div><div class='del'>-                gf_log ("booster", GF_LOG_TRACE, "rewinddir on glusterfs");</div><div class='del'>-                glusterfs_rewinddir ((glusterfs_dir_t)bh-&gt;dirh);</div><div class='del'>-        } else if (bh-&gt;type == BOOSTER_POSIX_DIR) {</div><div class='del'>-                if (real_rewinddir == NULL) {</div><div class='del'>-                        errno = ENOSYS;</div><div class='del'>-                        goto out;</div><div class='del'>-                }</div><div class='del'>-                gf_log ("booster", GF_LOG_TRACE, "rewinddir on posix");</div><div class='del'>-                real_rewinddir ((DIR *)bh-&gt;dirh);</div><div class='del'>-        } else</div><div class='del'>-                errno = EINVAL;</div><div class='del'>-out:</div><div class='del'>-        return;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-void</div><div class='del'>-booster_seekdir (DIR *dir, off_t offset)</div><div class='del'>-{</div><div class='del'>-        struct booster_dir_handle       *bh = (struct booster_dir_handle *)dir;</div><div class='del'>-</div><div class='del'>-        if (!bh) {</div><div class='del'>-                errno = EFAULT;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (bh-&gt;type == BOOSTER_GL_DIR) {</div><div class='del'>-                gf_log ("booster", GF_LOG_TRACE, "seekdir on glusterfs");</div><div class='del'>-                glusterfs_seekdir ((glusterfs_dir_t)bh-&gt;dirh, offset);</div><div class='del'>-         } else if (bh-&gt;type == BOOSTER_POSIX_DIR) {</div><div class='del'>-                if (real_seekdir == NULL) {</div><div class='del'>-                        errno = ENOSYS;</div><div class='del'>-                        goto out;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                gf_log ("booster", GF_LOG_TRACE, "seekdir on posix");</div><div class='del'>-                real_seekdir ((DIR *)bh-&gt;dirh, offset);</div><div class='del'>-        } else</div><div class='del'>-                errno = EINVAL;</div><div class='del'>-out:</div><div class='del'>-        return;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-off_t</div><div class='del'>-booster_telldir (DIR *dir)</div><div class='del'>-{</div><div class='del'>-        struct booster_dir_handle       *bh = (struct booster_dir_handle *)dir;</div><div class='del'>-        off_t	offset = -1;</div><div class='del'>-</div><div class='del'>-        if (!bh) {</div><div class='del'>-                errno = EFAULT;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (bh-&gt;type == BOOSTER_GL_DIR) {</div><div class='del'>-                gf_log ("booster", GF_LOG_TRACE, "telldir on glusterfs");</div><div class='del'>-                offset = glusterfs_telldir ((glusterfs_dir_t)bh-&gt;dirh);</div><div class='del'>-        } else if (bh-&gt;type == BOOSTER_POSIX_DIR) {</div><div class='del'>-                if (real_telldir == NULL) {</div><div class='del'>-                        errno = ENOSYS;</div><div class='del'>-                        goto out;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                gf_log ("booster", GF_LOG_TRACE, "telldir on posix");</div><div class='del'>-                offset = real_telldir ((DIR *)bh-&gt;dirh);</div><div class='del'>-        } else</div><div class='del'>-                errno = EINVAL;</div><div class='del'>-out:</div><div class='del'>-        return offset;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-pid_t </div><div class='del'>-fork (void)</div><div class='del'>-{</div><div class='del'>-	pid_t pid = 0;</div><div class='del'>-	char child = 0;</div><div class='del'>-</div><div class='del'>-	glusterfs_log_lock ();</div><div class='del'>-	{</div><div class='del'>-		pid = real_fork ();</div><div class='del'>-	}</div><div class='del'>-	glusterfs_log_unlock ();</div><div class='del'>-</div><div class='del'>-	child = (pid == 0);</div><div class='del'>-	if (child) {</div><div class='del'>-		booster_cleanup ();</div><div class='del'>-		booster_init ();</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	return pid;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-sendfile (int out_fd, int in_fd, off_t *offset, size_t count)</div><div class='del'>-{</div><div class='del'>-        glusterfs_file_t            in_fh = NULL;</div><div class='del'>-        ssize_t                     ret = -1;</div><div class='del'>-</div><div class='del'>-        gf_log ("booster", GF_LOG_TRACE, "sendfile: in fd %d, out fd %d, offset"</div><div class='del'>-                " %"PRIu64", count %"GF_PRI_SIZET, in_fd, out_fd, *offset,</div><div class='del'>-                count);</div><div class='del'>-        /*</div><div class='del'>-         * handle sendfile in booster only if in_fd corresponds to a glusterfs</div><div class='del'>-         * file handle </div><div class='del'>-         */</div><div class='del'>-        in_fh = booster_fdptr_get (booster_fdtable, in_fd);</div><div class='del'>-        if (!in_fh) {</div><div class='del'>-                gf_log ("booster", GF_LOG_TRACE, "Not a booster fd");</div><div class='del'>-                if (real_sendfile == NULL) {</div><div class='del'>-                        errno = ENOSYS;</div><div class='del'>-                        ret = -1;</div><div class='del'>-                } else {</div><div class='del'>-                        ret = real_sendfile (out_fd, in_fd, offset, count);</div><div class='del'>-                }</div><div class='del'>-        } else {</div><div class='del'>-                gf_log ("booster", GF_LOG_TRACE, "Is a booster fd");</div><div class='del'>-                ret = glusterfs_sendfile (out_fd, in_fh, offset, count);</div><div class='del'>-                booster_fdptr_put (in_fh);</div><div class='del'>-        }</div><div class='del'>-        </div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-sendfile64 (int out_fd, int in_fd, off_t *offset, size_t count)</div><div class='del'>-{</div><div class='del'>-        glusterfs_file_t            in_fh = NULL;</div><div class='del'>-        ssize_t                     ret = -1;</div><div class='del'>-</div><div class='del'>-        gf_log ("booster", GF_LOG_TRACE, "sendfile64: in fd %d, out fd %d,"</div><div class='del'>-                " offset %"PRIu64", count %"GF_PRI_SIZET, in_fd, out_fd,</div><div class='del'>-                *offset, count);</div><div class='del'>-        /*</div><div class='del'>-         * handle sendfile in booster only if in_fd corresponds to a glusterfs</div><div class='del'>-         * file handle </div><div class='del'>-         */</div><div class='del'>-        in_fh = booster_fdptr_get (booster_fdtable, in_fd);</div><div class='del'>-        if (!in_fh) {</div><div class='del'>-                gf_log ("booster", GF_LOG_TRACE, "Not a booster fd");</div><div class='del'>-                if (real_sendfile64 == NULL) {</div><div class='del'>-                        errno = ENOSYS;</div><div class='del'>-                        ret = -1;</div><div class='del'>-                } else {</div><div class='del'>-                        ret = real_sendfile64 (out_fd, in_fd, offset, count);</div><div class='del'>-                }</div><div class='del'>-        } else {</div><div class='del'>-                gf_log ("booster", GF_LOG_TRACE, "Is a booster fd");</div><div class='del'>-                ret = glusterfs_sendfile (out_fd, in_fh, offset, count);</div><div class='del'>-                booster_fdptr_put (in_fh);</div><div class='del'>-        }</div><div class='del'>-        </div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-fcntl (int fd, int cmd, ...)</div><div class='del'>-{</div><div class='del'>-        va_list           ap;</div><div class='del'>-        int               ret = -1;</div><div class='del'>-        long              arg = 0;</div><div class='del'>-        struct flock     *lock = NULL;</div><div class='del'>-        glusterfs_file_t  glfs_fd = 0; </div><div class='del'>-</div><div class='del'>-        glfs_fd = booster_fdptr_get (booster_fdtable, fd);</div><div class='del'>-</div><div class='del'>-        gf_log ("booster", GF_LOG_TRACE, "fcntl: fd %d, cmd %d", fd, cmd);</div><div class='del'>-	switch (cmd) {</div><div class='del'>-	case F_DUPFD:</div><div class='del'>-                ret = dup (fd);</div><div class='del'>-                break;</div><div class='del'>-                /* </div><div class='del'>-                 * FIXME: Consider this case when implementing F_DUPFD, F_GETFD</div><div class='del'>-                 *        etc flags in libglusterfsclient. Commenting it out for</div><div class='del'>-                 *        timebeing since it is defined only in linux kernel </div><div class='del'>-                 *        versions &gt;= 2.6.24.</div><div class='del'>-                 */</div><div class='del'>-                /* case F_DUPFD_CLOEXEC: */</div><div class='del'>-	case F_GETFD:</div><div class='del'>-                if (glfs_fd != NULL) {</div><div class='del'>-                        ret = booster_get_close_on_exec (booster_fdtable, fd)</div><div class='del'>-                                ? FD_CLOEXEC : 0;</div><div class='del'>-                } else {</div><div class='del'>-                        if (real_fcntl == NULL) {</div><div class='del'>-                                ret = -1;</div><div class='del'>-                                errno = ENOSYS;</div><div class='del'>-                        } else {</div><div class='del'>-                                ret = real_fcntl (fd, cmd);</div><div class='del'>-                        }</div><div class='del'>-                }</div><div class='del'>-                break;</div><div class='del'>-</div><div class='del'>-	case F_GETFL:</div><div class='del'>-	case F_GETOWN:</div><div class='del'>-	case F_GETSIG:</div><div class='del'>-	case F_GETLEASE:</div><div class='del'>-                if (glfs_fd) {</div><div class='del'>-                        gf_log ("booster", GF_LOG_TRACE, "Is a booster fd");</div><div class='del'>-                        ret = glusterfs_fcntl (glfs_fd, cmd);</div><div class='del'>-                } else {</div><div class='del'>-                        if (!real_fcntl) {</div><div class='del'>-                                errno = ENOSYS;</div><div class='del'>-                                goto out;</div><div class='del'>-                        }</div><div class='del'>-</div><div class='del'>-                        gf_log ("booster", GF_LOG_TRACE, "Not a booster fd");</div><div class='del'>-                        ret = real_fcntl (fd, cmd);</div><div class='del'>-                }</div><div class='del'>-		break;</div><div class='del'>-</div><div class='del'>-	case F_SETFD:</div><div class='del'>-                if (glfs_fd != NULL) {</div><div class='del'>-                        booster_set_close_on_exec (booster_fdtable, fd);</div><div class='del'>-                        ret = 0;</div><div class='del'>-                } else {</div><div class='del'>-                        if (real_fcntl == NULL) {</div><div class='del'>-                                ret = -1;</div><div class='del'>-                                errno = ENOSYS;</div><div class='del'>-                        } else {</div><div class='del'>-                                ret = real_fcntl (fd, cmd);</div><div class='del'>-                        }</div><div class='del'>-                }</div><div class='del'>-                break;</div><div class='del'>-</div><div class='del'>-	case F_SETFL:</div><div class='del'>-	case F_SETOWN:</div><div class='del'>-	case F_SETSIG:</div><div class='del'>-	case F_SETLEASE:</div><div class='del'>-	case F_NOTIFY:</div><div class='del'>-                va_start (ap, cmd);</div><div class='del'>-                arg = va_arg (ap, long);</div><div class='del'>-                va_end (ap);</div><div class='del'>-</div><div class='del'>-                if (glfs_fd) {</div><div class='del'>-                        gf_log ("booster", GF_LOG_TRACE, "Is a booster fd");</div><div class='del'>-                        ret = glusterfs_fcntl (glfs_fd, cmd, arg);</div><div class='del'>-                } else {</div><div class='del'>-                        if (!real_fcntl) {</div><div class='del'>-                                errno = ENOSYS;</div><div class='del'>-                                goto out;</div><div class='del'>-                        }</div><div class='del'>-</div><div class='del'>-                        gf_log ("booster", GF_LOG_TRACE, "Not a booster fd");</div><div class='del'>-                        ret = real_fcntl (fd, cmd, arg);</div><div class='del'>-                }</div><div class='del'>-		break;</div><div class='del'>-</div><div class='del'>-	case F_GETLK:</div><div class='del'>-	case F_SETLK:</div><div class='del'>-	case F_SETLKW:</div><div class='del'>-#if F_GETLK != F_GETLK64 </div><div class='del'>-        case F_GETLK64:</div><div class='del'>-#endif</div><div class='del'>-#if F_SETLK != F_SETLK64</div><div class='del'>-        case F_SETLK64:</div><div class='del'>-#endif</div><div class='del'>-#if F_SETLKW != F_SETLKW64</div><div class='del'>-        case F_SETLKW64:</div><div class='del'>-#endif</div><div class='del'>-                va_start (ap, cmd);</div><div class='del'>-                lock = va_arg (ap, struct flock *);</div><div class='del'>-                va_end (ap);</div><div class='del'>-</div><div class='del'>-                if (lock == NULL) {</div><div class='del'>-                        errno = EINVAL;</div><div class='del'>-                        goto out;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                if (glfs_fd) {</div><div class='del'>-                        gf_log ("booster", GF_LOG_TRACE, "Is a booster fd");</div><div class='del'>-                        ret = glusterfs_fcntl (glfs_fd, cmd, lock);</div><div class='del'>-                } else {</div><div class='del'>-                        if (!real_fcntl) {</div><div class='del'>-                                errno = ENOSYS;</div><div class='del'>-                                goto out;</div><div class='del'>-                        }</div><div class='del'>-</div><div class='del'>-                        gf_log ("booster", GF_LOG_TRACE, "Not a booster fd");</div><div class='del'>-                        ret = real_fcntl (fd, cmd, lock);</div><div class='del'>-                }</div><div class='del'>-		break;</div><div class='del'>-</div><div class='del'>-	default:</div><div class='del'>-                errno = EINVAL;</div><div class='del'>-		break;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        if (glfs_fd) {</div><div class='del'>-                booster_fdptr_put (glfs_fd);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-chdir (const char *path)</div><div class='del'>-{</div><div class='del'>-        int     ret = -1;</div><div class='del'>-        char    cwd[PATH_MAX];</div><div class='del'>-        char   *res = NULL;</div><div class='del'>-</div><div class='del'>-        gf_log ("booster", GF_LOG_TRACE, "chdir: path %s", path);</div><div class='del'>-</div><div class='del'>-        pthread_mutex_lock (&amp;cwdlock);</div><div class='del'>-        {</div><div class='del'>-                res = glusterfs_getcwd (cwd, PATH_MAX);</div><div class='del'>-                if (res == NULL) {</div><div class='del'>-                        gf_log ("booster", GF_LOG_ERROR, "getcwd failed: %s",</div><div class='del'>-                                strerror (errno));</div><div class='del'>-                        goto unlock;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                ret = glusterfs_chdir (path);</div><div class='del'>-                if ((ret == -1) &amp;&amp; (errno != ENODEV)) {</div><div class='del'>-                        gf_log ("booster", GF_LOG_ERROR, "chdir failed: %s",</div><div class='del'>-                                strerror (errno));</div><div class='del'>-                        goto unlock;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                if (ret == 0) {</div><div class='del'>-                        gf_log ("booster", GF_LOG_TRACE, "chdir succeeded");</div><div class='del'>-                        goto unlock;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                if (real_chdir == NULL) {</div><div class='del'>-                        errno = ENOSYS;</div><div class='del'>-                        ret = -1;</div><div class='del'>-                        goto unlock;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                ret = real_chdir (path);</div><div class='del'>-                if (ret == -1) {</div><div class='del'>-                        glusterfs_chdir (cwd);</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='del'>-unlock:</div><div class='del'>-        pthread_mutex_unlock (&amp;cwdlock);</div><div class='del'>-</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-fchdir (int fd)</div><div class='del'>-{</div><div class='del'>-        int              ret     = -1;</div><div class='del'>-        glusterfs_file_t glfs_fd = 0;</div><div class='del'>-        char             cwd[PATH_MAX]; </div><div class='del'>-        char            *res     = NULL;</div><div class='del'>-</div><div class='del'>-        glfs_fd = booster_fdptr_get (booster_fdtable, fd);</div><div class='del'>-</div><div class='del'>-        if (!glfs_fd) {</div><div class='del'>-                gf_log ("booster", GF_LOG_TRACE, "Not a booster fd");</div><div class='del'>-                if (real_write == NULL) {</div><div class='del'>-                        errno = ENOSYS;</div><div class='del'>-                        ret = -1;</div><div class='del'>-                } else {</div><div class='del'>-                        ret = real_fchdir (fd);</div><div class='del'>-                        if (ret == 0) {</div><div class='del'>-                                res = real_getcwd (cwd, PATH_MAX);</div><div class='del'>-                                if (res == NULL) {</div><div class='del'>-                                        gf_log ("booster", GF_LOG_ERROR,</div><div class='del'>-                                                "getcwd failed (%s)",</div><div class='del'>-                                                strerror (errno));</div><div class='del'>-                                        ret = -1;</div><div class='del'>-                                } else {</div><div class='del'>-                                        glusterfs_chdir (cwd);</div><div class='del'>-                                }</div><div class='del'>-                        }</div><div class='del'>-                }</div><div class='del'>-        } else {</div><div class='del'>-                gf_log ("booster", GF_LOG_TRACE, "Is a booster fd");</div><div class='del'>-                ret = glusterfs_fchdir (glfs_fd);</div><div class='del'>-                booster_fdptr_put (glfs_fd);</div><div class='del'>-        }</div><div class='del'>- </div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-char *</div><div class='del'>-getcwd (char *buf, size_t size)</div><div class='del'>-{</div><div class='del'>-        char *res = NULL;</div><div class='del'>-</div><div class='del'>-        res = glusterfs_getcwd (buf, size);</div><div class='del'>-        if ((res == NULL) &amp;&amp; (errno == ENODEV)) {</div><div class='del'>-                res = real_getcwd (buf, size);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        return res;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int __REDIRECT (booster_false_truncate, (const char *path, off_t length),</div><div class='del'>-                truncate) __nonnull ((1));</div><div class='del'>-int __REDIRECT (booster_false_truncate64, (const char *path, loff_t length),</div><div class='del'>-                truncate64) __nonnull ((1));;</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-booster_false_truncate (const char *path, off_t length)</div><div class='del'>-{</div><div class='del'>-        int             ret = -1;</div><div class='del'>-</div><div class='del'>-        gf_log ("booster", GF_LOG_TRACE, "truncate: path (%s) length (%"PRIu64</div><div class='del'>-                ")", path, length);</div><div class='del'>-</div><div class='del'>-        ret = glusterfs_truncate (path, length);</div><div class='del'>-        if ((ret == -1) &amp;&amp; (errno != ENODEV)) {</div><div class='del'>-                gf_log ("booster", GF_LOG_ERROR, "truncate failed: %s",</div><div class='del'>-                        strerror (errno));</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (ret == 0) {</div><div class='del'>-                gf_log ("booster", GF_LOG_TRACE, "truncate succeeded");</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (real_truncate != NULL)</div><div class='del'>-                ret = real_truncate (path, length);</div><div class='del'>-        else {</div><div class='del'>-                errno = ENOSYS;</div><div class='del'>-                ret = -1;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-booster_false_truncate64 (const char *path, loff_t length)</div><div class='del'>-{</div><div class='del'>-        int             ret = -1;</div><div class='del'>-  </div><div class='del'>-        gf_log ("booster", GF_LOG_TRACE, "truncate64: path (%s) length "</div><div class='del'>-                "(%"PRIu64")", path, length);</div><div class='del'>-</div><div class='del'>-        ret = glusterfs_truncate (path, length);</div><div class='del'>-        if ((ret == -1) &amp;&amp; (errno != ENODEV)) {</div><div class='del'>-                gf_log ("booster", GF_LOG_ERROR, "truncate64 failed: %s",</div><div class='del'>-                        strerror (errno));</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (ret == 0) {</div><div class='del'>-                gf_log ("booster", GF_LOG_TRACE, "truncate64 succeeded");</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (real_truncate64 != NULL)</div><div class='del'>-                ret = real_truncate64 (path, length);</div><div class='del'>-        else {</div><div class='del'>-                errno = ENOSYS;</div><div class='del'>-                ret = -1;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-setxattr (const char *path, const char *name, const void *value, size_t size,</div><div class='del'>-          int flags)</div><div class='del'>-{</div><div class='del'>-        int             ret = -1;</div><div class='del'>-</div><div class='del'>-        gf_log ("booster", GF_LOG_TRACE, "setxattr: path: %s", path);</div><div class='del'>-        ret = glusterfs_setxattr (path, name, value, size, flags);</div><div class='del'>-        if ((ret == -1) &amp;&amp; (errno != ENODEV)) {</div><div class='del'>-                gf_log ("booster", GF_LOG_ERROR, "setxattr failed: %s",</div><div class='del'>-                        strerror (errno));</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (ret == 0) {</div><div class='del'>-                gf_log ("booster", GF_LOG_TRACE, "setxattr succeeded");</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (real_setxattr != NULL)</div><div class='del'>-                ret = real_setxattr (path, name, value, size, flags);</div><div class='del'>-        else {</div><div class='del'>-                errno = ENOSYS;</div><div class='del'>-                ret = -1;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-lsetxattr (const char *path, const char *name, const void *value, size_t size,</div><div class='del'>-           int flags)</div><div class='del'>-{</div><div class='del'>-        int             ret = -1;</div><div class='del'>-</div><div class='del'>-        gf_log ("booster", GF_LOG_TRACE, "lsetxattr: path: %s", path);</div><div class='del'>-        ret = glusterfs_lsetxattr (path, name, value, size, flags);</div><div class='del'>-        if ((ret == -1) &amp;&amp; (errno != ENODEV)) {</div><div class='del'>-                gf_log ("booster", GF_LOG_ERROR, "lsetxattr failed: %s",</div><div class='del'>-                        strerror (errno));</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (ret == 0) {</div><div class='del'>-                gf_log ("booster", GF_LOG_TRACE, "lsetxattr succeeded");</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (real_lsetxattr != NULL)</div><div class='del'>-                ret = real_lsetxattr (path, name, value, size, flags);</div><div class='del'>-        else {</div><div class='del'>-                errno = ENOSYS;</div><div class='del'>-                ret = -1;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-fsetxattr (int fd, const char *name, const void *value, size_t size, int flags)</div><div class='del'>-{</div><div class='del'>-        int                     ret = -1;</div><div class='del'>-        glusterfs_file_t        fh = NULL;</div><div class='del'>-</div><div class='del'>-        gf_log ("booster", GF_LOG_TRACE, "fsetxattr: fd %d", fd);</div><div class='del'>-        fh = booster_fdptr_get (booster_fdtable, fd);</div><div class='del'>-        if (!fh) {</div><div class='del'>-                gf_log ("booster", GF_LOG_TRACE, "Not a booster fd");</div><div class='del'>-                if (real_fsetxattr != NULL)</div><div class='del'>-                        ret = real_fsetxattr (fd, name, value, size, flags);</div><div class='del'>-                else {</div><div class='del'>-                        ret = -1;</div><div class='del'>-                        errno = ENOSYS;</div><div class='del'>-                        goto out;</div><div class='del'>-                }</div><div class='del'>-        } else {</div><div class='del'>-                gf_log ("booster", GF_LOG_TRACE, "Is a booster fd");</div><div class='del'>-                ret = glusterfs_fsetxattr (fh, name, value, size, flags);</div><div class='del'>-                booster_fdptr_put (fh);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-void</div><div class='del'>-booster_lib_init (void)</div><div class='del'>-{</div><div class='del'>-</div><div class='del'>-        RESOLVE (open);</div><div class='del'>-        RESOLVE (open64);</div><div class='del'>-        RESOLVE (creat);</div><div class='del'>-        RESOLVE (creat64);</div><div class='del'>-</div><div class='del'>-        RESOLVE (read);</div><div class='del'>-        RESOLVE (readv);</div><div class='del'>-        RESOLVE (pread);</div><div class='del'>-        RESOLVE (pread64);</div><div class='del'>-</div><div class='del'>-        RESOLVE (write);</div><div class='del'>-        RESOLVE (writev);</div><div class='del'>-        RESOLVE (pwrite);</div><div class='del'>-        RESOLVE (pwrite64);</div><div class='del'>-</div><div class='del'>-        RESOLVE (lseek);</div><div class='del'>-        RESOLVE (lseek64);</div><div class='del'>-</div><div class='del'>-        RESOLVE (close);</div><div class='del'>-</div><div class='del'>-        RESOLVE (dup);</div><div class='del'>-        RESOLVE (dup2);</div><div class='del'>-</div><div class='del'>-	RESOLVE (fork); </div><div class='del'>-        RESOLVE (mkdir);</div><div class='del'>-        RESOLVE (rmdir);</div><div class='del'>-        RESOLVE (chmod);</div><div class='del'>-        RESOLVE (chown);</div><div class='del'>-        RESOLVE (fchmod);</div><div class='del'>-        RESOLVE (fchown);</div><div class='del'>-        RESOLVE (fsync);</div><div class='del'>-        RESOLVE (ftruncate);</div><div class='del'>-        RESOLVE (ftruncate64);</div><div class='del'>-        RESOLVE (link);</div><div class='del'>-        RESOLVE (rename);</div><div class='del'>-        RESOLVE (utimes);</div><div class='del'>-        RESOLVE (utime);</div><div class='del'>-        RESOLVE (mknod);</div><div class='del'>-        RESOLVE (mkfifo);</div><div class='del'>-        RESOLVE (unlink);</div><div class='del'>-        RESOLVE (symlink);</div><div class='del'>-        RESOLVE (readlink);</div><div class='del'>-        RESOLVE (realpath);</div><div class='del'>-        RESOLVE (opendir);</div><div class='del'>-        RESOLVE (readdir);</div><div class='del'>-        RESOLVE (readdir64);</div><div class='del'>-        RESOLVE (closedir);</div><div class='del'>-        RESOLVE (__xstat);</div><div class='del'>-        RESOLVE (__xstat64);</div><div class='del'>-        RESOLVE (stat);</div><div class='del'>-        RESOLVE (stat64);</div><div class='del'>-        RESOLVE (__fxstat);</div><div class='del'>-        RESOLVE (__fxstat64);</div><div class='del'>-        RESOLVE (fstat);</div><div class='del'>-        RESOLVE (fstat64);</div><div class='del'>-        RESOLVE (__lxstat);</div><div class='del'>-        RESOLVE (__lxstat64);</div><div class='del'>-        RESOLVE (lstat);</div><div class='del'>-        RESOLVE (lstat64);</div><div class='del'>-        RESOLVE (statfs);</div><div class='del'>-        RESOLVE (statfs64);</div><div class='del'>-        RESOLVE (statvfs);</div><div class='del'>-        RESOLVE (statvfs64);</div><div class='del'>-        RESOLVE (getxattr);</div><div class='del'>-        RESOLVE (lgetxattr);</div><div class='del'>-        RESOLVE (remove);</div><div class='del'>-        RESOLVE (lchown);</div><div class='del'>-	RESOLVE (rewinddir);</div><div class='del'>-	RESOLVE (seekdir);</div><div class='del'>-	RESOLVE (telldir);</div><div class='del'>-        RESOLVE (sendfile);</div><div class='del'>-        RESOLVE (sendfile64);</div><div class='del'>-        RESOLVE (readdir_r);</div><div class='del'>-        RESOLVE (readdir64_r);</div><div class='del'>-        RESOLVE (fcntl);</div><div class='del'>-        RESOLVE (chdir);</div><div class='del'>-        RESOLVE (fchdir);</div><div class='del'>-        RESOLVE (getcwd);</div><div class='del'>-        RESOLVE (truncate);</div><div class='del'>-        RESOLVE (truncate64);</div><div class='del'>-        RESOLVE (setxattr);</div><div class='del'>-        RESOLVE (lsetxattr);</div><div class='del'>-        RESOLVE (fsetxattr);</div><div class='del'>-</div><div class='del'>-        /* This must be called after resolving real functions</div><div class='del'>-         * above so that the socket based IO calls in libglusterfsclient</div><div class='del'>-         * can fall back to a non-NULL real_XXX function pointer.</div><div class='del'>-         * Calling booster_init before resolving the names above</div><div class='del'>-         * results in seg-faults because the function symbols above are NULL.</div><div class='del'>-         */</div><div class='del'>-	booster_init ();</div><div class='del'>-}</div><div class='del'>-</div><div class='head'>diff --git a/booster/src/booster_fstab.c b/booster/src/booster_fstab.c<br/>deleted file mode 100644<br/>index 202249cadf3..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/booster/src/booster_fstab.c?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>booster/src/booster_fstab.c</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,452 +0,0 @@</div><div class='del'>-/* Utilities for reading/writing fstab, mtab, etc.</div><div class='del'>-   Copyright (C) 1995-2000, 2001, 2002, 2003, 2006</div><div class='del'>-   Free Software Foundation, Inc.</div><div class='del'>-   This file is part of the GNU C Library.</div><div class='del'>-</div><div class='del'>-   The GNU C Library is free software; you can redistribute it and/or</div><div class='del'>-   modify it under the terms of the GNU Lesser General Public</div><div class='del'>-   License as published by the Free Software Foundation; either</div><div class='del'>-   version 2.1 of the License, or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-   The GNU C Library is distributed in the hope that it will be useful,</div><div class='del'>-   but WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-   Lesser General Public License for more details.</div><div class='del'>-</div><div class='del'>-   You should have received a copy of the GNU Lesser General Public</div><div class='del'>-   License along with the GNU C Library; if not, write to the Free</div><div class='del'>-   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA</div><div class='del'>-   02111-1307 USA.  */</div><div class='del'>-</div><div class='del'>-#include &lt;alloca.h&gt;</div><div class='del'>-#include &lt;stdio.h&gt;</div><div class='del'>-#include &lt;string.h&gt;</div><div class='del'>-#include &lt;sys/types.h&gt;</div><div class='del'>-#include "booster_fstab.h"</div><div class='del'>-#include &lt;stdlib.h&gt;</div><div class='del'>-#include &lt;libglusterfsclient.h&gt;</div><div class='del'>-#include &lt;errno.h&gt;</div><div class='del'>-</div><div class='del'>-/* The default timeout for inode and stat cache. */</div><div class='del'>-#define BOOSTER_DEFAULT_ATTR_TIMEO      5 /* In Secs */</div><div class='del'>-</div><div class='del'>-/* Prepare to begin reading and/or writing mount table entries from the</div><div class='del'>-   beginning of FILE.  MODE is as for `fopen'.  */</div><div class='del'>-glusterfs_fstab_t *</div><div class='del'>-glusterfs_fstab_init (const char *file, const char *mode)</div><div class='del'>-{</div><div class='del'>-        glusterfs_fstab_t *handle = NULL;</div><div class='del'>-        handle = calloc (1, sizeof (glusterfs_fstab_t));</div><div class='del'>-        if (!handle) {</div><div class='del'>-                gf_log ("booster-fstab", GF_LOG_ERROR, "Memory allocation"</div><div class='del'>-                        " failed");</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        gf_log ("booster-fstab", GF_LOG_DEBUG, "FSTAB file: %s", file);</div><div class='del'>-        FILE *result = fopen (file,mode);</div><div class='del'>-        if (result != NULL) {</div><div class='del'>-                handle-&gt;fp = result;</div><div class='del'>-        } else {</div><div class='del'>-                gf_log ("booster-fstab", GF_LOG_ERROR, "FSTAB file open failed:"</div><div class='del'>-                        " %s", strerror (errno));</div><div class='del'>-                free (handle);</div><div class='del'>-                handle = NULL;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-</div><div class='del'>-        return handle;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-glusterfs_fstab_close (glusterfs_fstab_t *h)</div><div class='del'>-{</div><div class='del'>-        if (!h)</div><div class='del'>-                return -1;</div><div class='del'>-</div><div class='del'>-        if (h-&gt;fp)</div><div class='del'>-                fclose (h-&gt;fp);</div><div class='del'>-</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-/* Since the values in a line are separated by spaces, a name cannot</div><div class='del'>-   contain a space.  Therefore some programs encode spaces in names</div><div class='del'>-   by the strings "\040".  We undo the encoding when reading an entry.</div><div class='del'>-   The decoding happens in place.  */</div><div class='del'>-static char *</div><div class='del'>-decode_name (char *buf)</div><div class='del'>-{</div><div class='del'>-        char *rp = buf;</div><div class='del'>-        char *wp = buf;</div><div class='del'>-</div><div class='del'>-        do</div><div class='del'>-                if (rp[0] == '\\' &amp;&amp; rp[1] == '0' &amp;&amp; rp[2] == '4'</div><div class='del'>-                                &amp;&amp; rp[3] == '0')</div><div class='del'>-                {</div><div class='del'>-                        /* \040 is a SPACE.  */</div><div class='del'>-                        *wp++ = ' ';</div><div class='del'>-                        rp += 3;</div><div class='del'>-                }</div><div class='del'>-                else if (rp[0] == '\\' &amp;&amp; rp[1] == '0' &amp;&amp; rp[2] == '1'</div><div class='del'>-                                &amp;&amp; rp[3] == '1')</div><div class='del'>-                {</div><div class='del'>-                        /* \011 is a TAB.  */</div><div class='del'>-                        *wp++ = '\t';</div><div class='del'>-                        rp += 3;</div><div class='del'>-                }</div><div class='del'>-                else if (rp[0] == '\\' &amp;&amp; rp[1] == '0' &amp;&amp; rp[2] == '1'</div><div class='del'>-                                &amp;&amp; rp[3] == '2')</div><div class='del'>-                {</div><div class='del'>-                        /* \012 is a NEWLINE.  */</div><div class='del'>-                        *wp++ = '\n';</div><div class='del'>-                        rp += 3;</div><div class='del'>-                }</div><div class='del'>-                else if (rp[0] == '\\' &amp;&amp; rp[1] == '\\')</div><div class='del'>-                {</div><div class='del'>-                        /* We have to escape \\ to be able to represent all</div><div class='del'>-                         * characters.  */</div><div class='del'>-                        *wp++ = '\\';</div><div class='del'>-                        rp += 1;</div><div class='del'>-                }</div><div class='del'>-                else if (rp[0] == '\\' &amp;&amp; rp[1] == '1' &amp;&amp; rp[2] == '3'</div><div class='del'>-                                &amp;&amp; rp[3] == '4')</div><div class='del'>-                {</div><div class='del'>-                        /* \134 is also \\.  */</div><div class='del'>-                        *wp++ = '\\';</div><div class='del'>-                        rp += 3;</div><div class='del'>-                }</div><div class='del'>-                else</div><div class='del'>-                        *wp++ = *rp;</div><div class='del'>-        while (*rp++ != '\0');</div><div class='del'>-</div><div class='del'>-        return buf;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-/* Read one mount table entry from STREAM.  Returns a pointer to storage</div><div class='del'>-   reused on the next call, or null for EOF or error (use feof/ferror to</div><div class='del'>-   check).  */</div><div class='del'>-struct glusterfs_mntent *</div><div class='del'>-__glusterfs_fstab_getent (FILE *stream, struct glusterfs_mntent *mp,</div><div class='del'>-                          char *buffer, int bufsiz)</div><div class='del'>-{</div><div class='del'>-        char *cp;</div><div class='del'>-        char *head;</div><div class='del'>-</div><div class='del'>-        do</div><div class='del'>-        {</div><div class='del'>-                char *end_ptr;</div><div class='del'>-</div><div class='del'>-                if (fgets (buffer, bufsiz, stream) == NULL)</div><div class='del'>-                {</div><div class='del'>-                        return NULL;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                end_ptr = strchr (buffer, '\n');</div><div class='del'>-                if (end_ptr != NULL)	/* chop newline */</div><div class='del'>-                        *end_ptr = '\0';</div><div class='del'>-                else</div><div class='del'>-                {</div><div class='del'>-                        /* Not the whole line was read.  Do it now but forget</div><div class='del'>-                         * it.  */</div><div class='del'>-                        char tmp[1024];</div><div class='del'>-                        while (fgets (tmp, sizeof tmp, stream) != NULL)</div><div class='del'>-                                if (strchr (tmp, '\n') != NULL)</div><div class='del'>-                                        break;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                head = buffer + strspn (buffer, " \t");</div><div class='del'>-                /* skip empty lines and comment lines:  */</div><div class='del'>-        }</div><div class='del'>-        while (head[0] == '\0' || head[0] == '#');</div><div class='del'>-</div><div class='del'>-        cp = strsep (&amp;head, " \t");</div><div class='del'>-        mp-&gt;mnt_fsname = cp != NULL ? decode_name (cp) : (char *) "";</div><div class='del'>-        if (head)</div><div class='del'>-                head += strspn (head, " \t");</div><div class='del'>-        cp = strsep (&amp;head, " \t");</div><div class='del'>-        mp-&gt;mnt_dir = cp != NULL ? decode_name (cp) : (char *) "";</div><div class='del'>-        if (head)</div><div class='del'>-                head += strspn (head, " \t");</div><div class='del'>-        cp = strsep (&amp;head, " \t");</div><div class='del'>-        mp-&gt;mnt_type = cp != NULL ? decode_name (cp) : (char *) "";</div><div class='del'>-        if (head)</div><div class='del'>-                head += strspn (head, " \t");</div><div class='del'>-        cp = strsep (&amp;head, " \t");</div><div class='del'>-        mp-&gt;mnt_opts = cp != NULL ? decode_name (cp) : (char *) "";</div><div class='del'>-        switch (head ? sscanf (head, " %d %d ", &amp;mp-&gt;mnt_freq,</div><div class='del'>-                               &amp;mp-&gt;mnt_passno) : 0)</div><div class='del'>-        {</div><div class='del'>-                case 0:</div><div class='del'>-                        mp-&gt;mnt_freq = 0;</div><div class='del'>-                case 1:</div><div class='del'>-                        mp-&gt;mnt_passno = 0;</div><div class='del'>-                case 2:</div><div class='del'>-                        break;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        return mp;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-struct glusterfs_mntent *</div><div class='del'>-glusterfs_fstab_getent (glusterfs_fstab_t *h)</div><div class='del'>-{</div><div class='del'>-        if (!h)</div><div class='del'>-                return NULL;</div><div class='del'>-</div><div class='del'>-        if (!h-&gt;fp)</div><div class='del'>-                return NULL;</div><div class='del'>-</div><div class='del'>-        return __glusterfs_fstab_getent (h-&gt;fp, &amp;h-&gt;tmpent, h-&gt;buf,</div><div class='del'>-                                         GF_MNTENT_BUFSIZE);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-/* We have to use an encoding for names if they contain spaces or tabs.</div><div class='del'>-   To be able to represent all characters we also have to escape the</div><div class='del'>-   backslash itself.  This "function" must be a macro since we use</div><div class='del'>-   `alloca'.  */</div><div class='del'>-#define encode_name(name)                                               \</div><div class='del'>-        do {                                                            \</div><div class='del'>-                const char *rp = name;		                        \</div><div class='del'>-                                                                        \</div><div class='del'>-                while (*rp != '\0')     	                        \</div><div class='del'>-                        if (*rp == ' ' || *rp == '\t' || *rp == '\\')   \</div><div class='del'>-                                break;                                  \</div><div class='del'>-                        else	                                        \</div><div class='del'>-                                ++rp;                                   \</div><div class='del'>-                                                                        \</div><div class='del'>-                if (*rp != '\0')                                        \</div><div class='del'>-                {                                               \</div><div class='del'>-                /* In the worst case the length of the string   \</div><div class='del'>-                 * can increase to four times the current       \</div><div class='del'>-                 * length.  */				        \</div><div class='del'>-                        char *wp;				\</div><div class='del'>-                                                                \</div><div class='del'>-                        rp = name;				\</div><div class='del'>-                        name = wp = (char *) alloca (strlen (name) * 4 + 1);                                                                 \</div><div class='del'>-                                                                \</div><div class='del'>-                        do {                            \</div><div class='del'>-                                if (*rp == ' ')		\</div><div class='del'>-                                {       		\</div><div class='del'>-                                        *wp++ = '\\';   \</div><div class='del'>-                                        *wp++ = '0';	\</div><div class='del'>-                                        *wp++ = '4';	\</div><div class='del'>-                                        *wp++ = '0';    \</div><div class='del'>-                                }			\</div><div class='del'>-                                else if (*rp == '\t')	\</div><div class='del'>-                                {			\</div><div class='del'>-                                        *wp++ = '\\';	\</div><div class='del'>-                                        *wp++ = '0';	\</div><div class='del'>-                                        *wp++ = '1';	\</div><div class='del'>-                                        *wp++ = '1';	\</div><div class='del'>-                                }			\</div><div class='del'>-                                else if (*rp == '\n')	\</div><div class='del'>-                                {	                \</div><div class='del'>-                                        *wp++ = '\\';	\</div><div class='del'>-                                        *wp++ = '0';	\</div><div class='del'>-                                        *wp++ = '1';	\</div><div class='del'>-                                        *wp++ = '2';	\</div><div class='del'>-                                }	                \</div><div class='del'>-                                else if (*rp == '\\')	\</div><div class='del'>-                                {                       \</div><div class='del'>-                                        *wp++ = '\\';	\</div><div class='del'>-                                        *wp++ = '\\';	\</div><div class='del'>-                                }                       \</div><div class='del'>-                                else	                \</div><div class='del'>-                                        *wp++ = *rp;	\</div><div class='del'>-                        } while (*rp++ != '\0');	\</div><div class='del'>-                }                                       \</div><div class='del'>-        } while (0)                                     \</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-glusterfs_fstab_addent (glusterfs_fstab_t *h,</div><div class='del'>-                const struct glusterfs_mntent *mnt)</div><div class='del'>-{</div><div class='del'>-        struct glusterfs_mntent mntcopy = *mnt;</div><div class='del'>-        if (!h)</div><div class='del'>-                return -1;</div><div class='del'>-</div><div class='del'>-        if (!h-&gt;fp)</div><div class='del'>-                return -1;</div><div class='del'>-</div><div class='del'>-        if (fseek (h-&gt;fp, 0, SEEK_END))</div><div class='del'>-                return -1;</div><div class='del'>-</div><div class='del'>-        /* Encode spaces and tabs in the names.  */</div><div class='del'>-        encode_name (mntcopy.mnt_fsname);</div><div class='del'>-        encode_name (mntcopy.mnt_dir);</div><div class='del'>-        encode_name (mntcopy.mnt_type);</div><div class='del'>-        encode_name (mntcopy.mnt_opts);</div><div class='del'>-</div><div class='del'>-        return (fprintf (h-&gt;fp, "%s %s %s %s %d %d\n",</div><div class='del'>-                                mntcopy.mnt_fsname,</div><div class='del'>-                                mntcopy.mnt_dir,</div><div class='del'>-                                mntcopy.mnt_type,</div><div class='del'>-                                mntcopy.mnt_opts,</div><div class='del'>-                                mntcopy.mnt_freq,</div><div class='del'>-                                mntcopy.mnt_passno)</div><div class='del'>-                        &lt; 0 ? 1 : 0);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-/* Search MNT-&gt;mnt_opts for an option matching OPT.</div><div class='del'>-   Returns the address of the substring, or null if none found.  */</div><div class='del'>-char *</div><div class='del'>-glusterfs_fstab_hasoption (const struct glusterfs_mntent *mnt, const char *opt)</div><div class='del'>-{</div><div class='del'>-        const size_t optlen = strlen (opt);</div><div class='del'>-        char *rest = mnt-&gt;mnt_opts, *p;</div><div class='del'>-</div><div class='del'>-        while ((p = strstr (rest, opt)) != NULL)</div><div class='del'>-        {</div><div class='del'>-                if ((p == rest || p[-1] == ',')</div><div class='del'>-                                &amp;&amp; (p[optlen] == '\0' || p[optlen] == '=' || p[optlen] == ','))</div><div class='del'>-                        return p;</div><div class='del'>-</div><div class='del'>-                rest = strchr (p, ',');</div><div class='del'>-                if (rest == NULL)</div><div class='del'>-                        break;</div><div class='del'>-                ++rest;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        return NULL;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-void</div><div class='del'>-clean_init_params (glusterfs_init_params_t *ipars)</div><div class='del'>-{</div><div class='del'>-        if (!ipars)</div><div class='del'>-                return;</div><div class='del'>-</div><div class='del'>-        if (ipars-&gt;volume_name)</div><div class='del'>-                free (ipars-&gt;volume_name);</div><div class='del'>-</div><div class='del'>-        if (ipars-&gt;specfile)</div><div class='del'>-                free (ipars-&gt;specfile);</div><div class='del'>-</div><div class='del'>-        if (ipars-&gt;logfile)</div><div class='del'>-                free (ipars-&gt;logfile);</div><div class='del'>-</div><div class='del'>-        if (ipars-&gt;loglevel)</div><div class='del'>-                free (ipars-&gt;loglevel);</div><div class='del'>-</div><div class='del'>-        return;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-char *</div><div class='del'>-get_option_value (char *opt)</div><div class='del'>-{</div><div class='del'>-        char *val = NULL;</div><div class='del'>-        char *saveptr = NULL;</div><div class='del'>-        char *copy_opt = NULL;</div><div class='del'>-        char *retval = NULL;</div><div class='del'>-</div><div class='del'>-        copy_opt = strdup (opt);</div><div class='del'>-</div><div class='del'>-        /* Get the = before the value of the option. */</div><div class='del'>-        val = index (copy_opt, '=');</div><div class='del'>-        if (val) {</div><div class='del'>-                /* Move to start of option */</div><div class='del'>-                ++val;</div><div class='del'>-</div><div class='del'>-                /* Now, to create a '\0' delimited string out of the</div><div class='del'>-                 * options string, first get the position where the</div><div class='del'>-                 * next option starts, that would be the next ','.</div><div class='del'>-                 */</div><div class='del'>-                saveptr = index (val, ',');</div><div class='del'>-                if (saveptr)</div><div class='del'>-                        *saveptr = '\0';</div><div class='del'>-                retval = strdup (val);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        free (copy_opt);</div><div class='del'>-</div><div class='del'>-        return retval;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-void</div><div class='del'>-booster_mount (struct glusterfs_mntent *ent)</div><div class='del'>-{</div><div class='del'>-        char                    *opt = NULL;</div><div class='del'>-        glusterfs_init_params_t ipars;</div><div class='del'>-        time_t                  timeout = BOOSTER_DEFAULT_ATTR_TIMEO;</div><div class='del'>-        char                    *timeostr = NULL;</div><div class='del'>-        char                    *endptr = NULL;</div><div class='del'>-</div><div class='del'>-        if (!ent)</div><div class='del'>-                return;</div><div class='del'>-</div><div class='del'>-        gf_log ("booster-fstab", GF_LOG_DEBUG, "Mount entry: volfile: %s,"</div><div class='del'>-                " VMP: %s, Type: %s, Options: %s", ent-&gt;mnt_fsname,</div><div class='del'>-                ent-&gt;mnt_dir, ent-&gt;mnt_type, ent-&gt;mnt_opts);</div><div class='del'>-        if ((strcmp (ent-&gt;mnt_type, "glusterfs") != 0)) {</div><div class='del'>-                gf_log ("booster-fstab", GF_LOG_ERROR, "Type is not glusterfs");</div><div class='del'>-                return;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        memset (&amp;ipars, 0, sizeof (glusterfs_init_params_t));</div><div class='del'>-        if (ent-&gt;mnt_fsname)</div><div class='del'>-                ipars.specfile = strdup (ent-&gt;mnt_fsname);</div><div class='del'>-</div><div class='del'>-        opt = glusterfs_fstab_hasoption (ent, "subvolume");</div><div class='del'>-        if (opt)</div><div class='del'>-                ipars.volume_name = get_option_value (opt);</div><div class='del'>-</div><div class='del'>-        opt = glusterfs_fstab_hasoption (ent, "log-file");</div><div class='del'>-        if (!opt)</div><div class='del'>-                opt = glusterfs_fstab_hasoption (ent, "logfile");</div><div class='del'>-</div><div class='del'>-        if (opt)</div><div class='del'>-                ipars.logfile = get_option_value (opt);</div><div class='del'>-</div><div class='del'>-        opt = glusterfs_fstab_hasoption (ent, "log-level");</div><div class='del'>-        if (!opt)</div><div class='del'>-                opt = glusterfs_fstab_hasoption (ent, "loglevel");</div><div class='del'>-</div><div class='del'>-        if (opt)</div><div class='del'>-                ipars.loglevel = get_option_value (opt);</div><div class='del'>-</div><div class='del'>-        /* Attribute cache timeout */</div><div class='del'>-        opt = glusterfs_fstab_hasoption (ent, "attr_timeout");</div><div class='del'>-        if (opt) {</div><div class='del'>-                 timeostr = get_option_value (opt);</div><div class='del'>-                 if (timeostr)</div><div class='del'>-                         timeout = strtol (timeostr, &amp;endptr, 10);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        ipars.lookup_timeout = timeout;</div><div class='del'>-        ipars.stat_timeout = timeout;</div><div class='del'>-</div><div class='del'>-        if ((glusterfs_mount (ent-&gt;mnt_dir, &amp;ipars)) == -1)</div><div class='del'>-                gf_log ("booster-fstab", GF_LOG_ERROR, "VMP mounting failed");</div><div class='del'>-</div><div class='del'>-        clean_init_params (&amp;ipars);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-booster_configure (char *confpath)</div><div class='del'>-{</div><div class='del'>-        int                     ret = -1;</div><div class='del'>-        glusterfs_fstab_t       *handle = NULL;</div><div class='del'>-        struct glusterfs_mntent *ent = NULL;</div><div class='del'>-</div><div class='del'>-        if (!confpath)</div><div class='del'>-                goto out;</div><div class='del'>-</div><div class='del'>-        handle = glusterfs_fstab_init (confpath, "r");</div><div class='del'>-        if (!handle)</div><div class='del'>-                goto out;</div><div class='del'>-</div><div class='del'>-        while ((ent = glusterfs_fstab_getent (handle)) != NULL)</div><div class='del'>-                booster_mount (ent);</div><div class='del'>-</div><div class='del'>-        glusterfs_fstab_close (handle);</div><div class='del'>-        ret = 0;</div><div class='del'>-out:</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='head'>diff --git a/booster/src/booster_fstab.h b/booster/src/booster_fstab.h<br/>deleted file mode 100644<br/>index 9bab04c5aa0..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/booster/src/booster_fstab.h?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>booster/src/booster_fstab.h</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,83 +0,0 @@</div><div class='del'>-/* Utilities for reading/writing fstab, mtab, etc.</div><div class='del'>-   Copyright (C) 1995, 1996, 1997, 1998, 1999 Free Software Foundation, Inc.</div><div class='del'>-   This file is part of the GNU C Library.</div><div class='del'>-</div><div class='del'>-   The GNU C Library is free software; you can redistribute it and/or</div><div class='del'>-   modify it under the terms of the GNU Lesser General Public</div><div class='del'>-   License as published by the Free Software Foundation; either</div><div class='del'>-   version 2.1 of the License, or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-   The GNU C Library is distributed in the hope that it will be useful,</div><div class='del'>-   but WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-   Lesser General Public License for more details.</div><div class='del'>-</div><div class='del'>-   You should have received a copy of the GNU Lesser General Public</div><div class='del'>-   License along with the GNU C Library; if not, write to the Free</div><div class='del'>-   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA</div><div class='del'>-   02111-1307 USA.  */</div><div class='del'>-</div><div class='del'>-#ifndef	GLUSTERFS_FSTAB_MNTENT_H</div><div class='del'>-#define	GLUSTERFS_FSTAB_MNTENT_H	1</div><div class='del'>-#ifndef _CONFIG_H</div><div class='del'>-#define _CONFIG_H</div><div class='del'>-#include "config.h"</div><div class='del'>-#endif</div><div class='del'>- </div><div class='del'>-#include "compat.h"</div><div class='del'>-</div><div class='del'>-/* General filesystem types.  */</div><div class='del'>-#define GF_MNTTYPE_IGNORE	"ignore"	/* Ignore this entry.  */</div><div class='del'>-#define GF_MNTTYPE_NFS	"nfs"		/* Network file system.  */</div><div class='del'>-#define GF_MNTTYPE_SWAP	"swap"		/* Swap device.  */</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-/* Generic mount options.  */</div><div class='del'>-#define GF_MNTOPT_DEFAULTS	"defaults"	/* Use all default options.  */</div><div class='del'>-#define GF_MNTOPT_RO	        "ro"		/* Read only.  */</div><div class='del'>-#define GF_MNTOPT_RW	        "rw"		/* Read/write.  */</div><div class='del'>-#define GF_MNTOPT_SUID	        "suid"		/* Set uid allowed.  */</div><div class='del'>-#define GF_MNTOPT_NOSUID	"nosuid"	/* No set uid allowed.  */</div><div class='del'>-#define GF_MNTOPT_NOAUTO	"noauto"	/* Do not auto mount.  */</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-/* Structure describing a mount table entry.  */</div><div class='del'>-struct glusterfs_mntent</div><div class='del'>-{</div><div class='del'>-        char *mnt_fsname;		/* Device or server for filesystem.  */</div><div class='del'>-        char *mnt_dir;		/* Directory mounted on.  */</div><div class='del'>-        char *mnt_type;		/* Type of filesystem: ufs, nfs, etc.  */</div><div class='del'>-        char *mnt_opts;		/* Comma-separated options for fs.  */</div><div class='del'>-        int mnt_freq;		/* Dump frequency (in days).  */</div><div class='del'>-        int mnt_passno;		/* Pass number for `fsck'.  */</div><div class='del'>-};</div><div class='del'>-</div><div class='del'>-#define GF_MNTENT_BUFSIZE       1024</div><div class='del'>-typedef struct glusterfs_fstab_handle {</div><div class='del'>-        FILE *fp;</div><div class='del'>-        char buf[GF_MNTENT_BUFSIZE];</div><div class='del'>-        struct glusterfs_mntent tmpent;</div><div class='del'>-}glusterfs_fstab_t;</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-/* Prepare to begin reading and/or writing mount table entries from the</div><div class='del'>-   beginning of FILE.  MODE is as for `fopen'.  */</div><div class='del'>-extern glusterfs_fstab_t *glusterfs_fstab_init (const char *file,</div><div class='del'>-                const char *mode);</div><div class='del'>-</div><div class='del'>-extern struct glusterfs_mntent *glusterfs_fstab_getent (glusterfs_fstab_t *h);</div><div class='del'>-</div><div class='del'>-/* Write the mount table entry described by MNT to STREAM.</div><div class='del'>-   Return zero on success, nonzero on failure.  */</div><div class='del'>-extern int glusterfs_fstab_addent (glusterfs_fstab_t *h,</div><div class='del'>-                const struct glusterfs_mntent *mnt);</div><div class='del'>-</div><div class='del'>-/* Close a stream opened with `glusterfs_fstab_init'.  */</div><div class='del'>-extern int glusterfs_fstab_close (glusterfs_fstab_t *h);</div><div class='del'>-</div><div class='del'>-/* Search MNT-&gt;mnt_opts for an option matching OPT.</div><div class='del'>-   Returns the address of the substring, or null if none found.  */</div><div class='del'>-extern char *glusterfs_fstab_hasoption (const struct glusterfs_mntent *mnt,</div><div class='del'>-                const char *opt);</div><div class='del'>-</div><div class='del'>-#endif</div><div class='head'>diff --git a/booster/src/booster_stat.c b/booster/src/booster_stat.c<br/>deleted file mode 100644<br/>index 23bc10c0d1f..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/booster/src/booster_stat.c?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>booster/src/booster_stat.c</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,188 +0,0 @@</div><div class='del'>-/*</div><div class='del'>-   Copyright (c) 2007-2009 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='del'>-   This file is part of GlusterFS.</div><div class='del'>-</div><div class='del'>-   GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-   it under the terms of the GNU General Public License as published</div><div class='del'>-   by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-   or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-   GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-   WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-   General Public License for more details.</div><div class='del'>-</div><div class='del'>-   You should have received a copy of the GNU General Public License</div><div class='del'>-   along with this program.  If not, see</div><div class='del'>-   &lt;http://www.gnu.org/licenses/&gt;.</div><div class='del'>-*/</div><div class='del'>-</div><div class='del'>-#include &lt;sys/types.h&gt;</div><div class='del'>-</div><div class='del'>-extern int</div><div class='del'>-booster_stat (const char *path, void *buf);</div><div class='del'>-</div><div class='del'>-extern int</div><div class='del'>-booster_stat64 (const char *path, void *buf);</div><div class='del'>-</div><div class='del'>-extern int</div><div class='del'>-booster_xstat (int ver, const char *path, void *buf);</div><div class='del'>-</div><div class='del'>-extern int</div><div class='del'>-booster_xstat64 (int ver, const char *path, void *buf);</div><div class='del'>-</div><div class='del'>-extern int</div><div class='del'>-booster_fxstat (int ver, int fd, void *buf);</div><div class='del'>-extern int</div><div class='del'>-booster_fxstat64 (int ver, int fd, void *buf);</div><div class='del'>-extern int</div><div class='del'>-booster_fstat (int fd, void *buf);</div><div class='del'>-extern int</div><div class='del'>-booster_fstat64 (int fd, void *buf);</div><div class='del'>-</div><div class='del'>-extern int</div><div class='del'>-booster_lstat (const char *path, void *buf);</div><div class='del'>-extern int</div><div class='del'>-booster_lstat64 (const char *path, void *buf);</div><div class='del'>-extern int</div><div class='del'>-booster_lxstat (int ver, const char *path, void *buf);</div><div class='del'>-extern int</div><div class='del'>-booster_lxstat64 (int ver, const char *path, void *buf);</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-extern int</div><div class='del'>-booster_statfs (const char *path, void *buf);</div><div class='del'>-extern int</div><div class='del'>-booster_statfs64 (const char *path, void *buf);</div><div class='del'>-</div><div class='del'>-extern int</div><div class='del'>-booster_statvfs (const char *path, void *buf);</div><div class='del'>-</div><div class='del'>-extern int</div><div class='del'>-booster_statvfs64 (const char *path, void *buf);</div><div class='del'>-</div><div class='del'>-extern void *</div><div class='del'>-booster_readdir (void *dir);</div><div class='del'>-</div><div class='del'>-extern void</div><div class='del'>-booster_rewinddir (void *dir);</div><div class='del'>-</div><div class='del'>-extern void</div><div class='del'>-booster_seekdir (void *dir, off_t offset);</div><div class='del'>-</div><div class='del'>-extern off_t</div><div class='del'>-booster_telldir (void *dir);</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-stat (const char *path, void *buf)</div><div class='del'>-{</div><div class='del'>-        return booster_stat (path, buf);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-stat64 (const char *path, void *buf)</div><div class='del'>-{</div><div class='del'>-        return booster_stat64 (path, buf);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-__xstat (int ver, const char *path, void *buf)</div><div class='del'>-{</div><div class='del'>-        return booster_xstat (ver, path, buf);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-__xstat64 (int ver, const char *path, void *buf)</div><div class='del'>-{</div><div class='del'>-        return booster_xstat64 (ver, path, buf);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-__fxstat (int ver, int fd, void *buf)</div><div class='del'>-{</div><div class='del'>-        return booster_fxstat (ver, fd, buf);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-__fxstat64 (int ver, int fd, void *buf)</div><div class='del'>-{</div><div class='del'>-        return booster_fxstat64 (ver, fd, buf);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-fstat (int fd, void *buf)</div><div class='del'>-{</div><div class='del'>-        return booster_fstat (fd, buf);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-fstat64 (int fd, void *buf)</div><div class='del'>-{</div><div class='del'>-        return booster_fstat64 (fd, buf);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-lstat (const char *path, void *buf)</div><div class='del'>-{</div><div class='del'>-        return booster_lstat (path, buf);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-lstat64 (const char *path, void *buf)</div><div class='del'>-{</div><div class='del'>-        return booster_lstat64 (path, buf);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-__lxstat (int ver, const char *path, void *buf)</div><div class='del'>-{</div><div class='del'>-        return booster_lxstat (ver, path, buf);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-__lxstat64 (int ver, const char *path, void *buf)</div><div class='del'>-{</div><div class='del'>-        return booster_lxstat64 (ver, path, buf);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-statfs (const char *pathname, void *buf)</div><div class='del'>-{</div><div class='del'>-        return booster_statfs (pathname, buf);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-statfs64 (const char *pathname, void *buf)</div><div class='del'>-{</div><div class='del'>-        return booster_statfs64 (pathname, buf);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-statvfs (const char *pathname, void *buf)</div><div class='del'>-{</div><div class='del'>-        return booster_statvfs (pathname, buf);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-statvfs64 (const char *pathname, void *buf)</div><div class='del'>-{</div><div class='del'>-        return booster_statvfs64 (pathname, buf);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-void</div><div class='del'>-rewinddir (void *dir)</div><div class='del'>-{</div><div class='del'>-	return booster_rewinddir (dir);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-void</div><div class='del'>-seekdir (void *dir, off_t offset)</div><div class='del'>-{</div><div class='del'>-	return booster_seekdir (dir, offset);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-off_t</div><div class='del'>-telldir (void *dir)</div><div class='del'>-{</div><div class='del'>-	return booster_telldir (dir);</div><div class='del'>-}</div><div class='head'>diff --git a/build-aux/checkpatch.pl b/build-aux/checkpatch.pl<br/>new file mode 100755<br/>index 00000000000..17ae4e4d579<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/build-aux/checkpatch.pl?id=d1d7a6f35c816822fab51c820e25023863c239c1'>build-aux/checkpatch.pl</a></div><div class='hunk'>@@ -0,0 +1,4326 @@</div><div class='add'>+#!/usr/bin/perl -w</div><div class='add'>+# (c) 2001, Dave Jones. (the file handling bit)</div><div class='add'>+# (c) 2005, Joel Schopp &lt;jschopp@austin.ibm.com&gt; (the ugly bit)</div><div class='add'>+# (c) 2007,2008, Andy Whitcroft &lt;apw@uk.ibm.com&gt; (new conditions, test suite)</div><div class='add'>+# (c) 2008-2010 Andy Whitcroft &lt;apw@canonical.com&gt;</div><div class='add'>+# (c) 2014 Gluster Community &lt;gluster-devel@gluster.org&gt;</div><div class='add'>+# Licensed under the terms of the GNU GPL License version 2</div><div class='add'>+</div><div class='add'>+use strict;</div><div class='add'>+use POSIX;</div><div class='add'>+</div><div class='add'>+my $P = $0;</div><div class='add'>+$P =~ s@.*/@@g;</div><div class='add'>+</div><div class='add'>+my $V = '0.32.1';</div><div class='add'>+</div><div class='add'>+use Getopt::Long qw(:config no_auto_abbrev);</div><div class='add'>+</div><div class='add'>+my $quiet = 0;</div><div class='add'>+my $tree = 1;</div><div class='add'>+my $chk_signoff = 1;</div><div class='add'>+my $chk_patch = 1;</div><div class='add'>+my $tst_only;</div><div class='add'>+my $emacs = 0;</div><div class='add'>+my $terse = 0;</div><div class='add'>+my $file = 0;</div><div class='add'>+my $check = 0;</div><div class='add'>+my $check_orig = 0;</div><div class='add'>+my $summary = 1;</div><div class='add'>+my $mailback = 0;</div><div class='add'>+my $summary_file = 0;</div><div class='add'>+my $show_types = 0;</div><div class='add'>+my $fix = 0;</div><div class='add'>+my $fix_inplace = 0;</div><div class='add'>+my $root;</div><div class='add'>+my %debug;</div><div class='add'>+my %camelcase = ();</div><div class='add'>+my %use_type = ();</div><div class='add'>+my @use = ();</div><div class='add'>+my %ignore_type = ();</div><div class='add'>+my @ignore = ();</div><div class='add'>+my $help = 0;</div><div class='add'>+my $configuration_file = ".checkpatch.conf";</div><div class='add'>+my $max_line_length = 80;</div><div class='add'>+my $ignore_perl_version = 0;</div><div class='add'>+my $minimum_perl_version = 5.10.0;</div><div class='add'>+my $gerrit_url = $ENV{GERRIT_URL};</div><div class='add'>+</div><div class='add'>+sub help {</div><div class='add'>+    my ($exitcode) = @_;</div><div class='add'>+</div><div class='add'>+    print &lt;&lt; "EOM";</div><div class='add'>+Usage: $P [OPTION]... [FILE]...</div><div class='add'>+Version: $V</div><div class='add'>+</div><div class='add'>+Options:</div><div class='add'>+  -q, --quiet                quiet</div><div class='add'>+  --patch                    treat FILE as patchfile (default)</div><div class='add'>+  --emacs                    emacs compile window format</div><div class='add'>+  --gerrit-url=STRING        URL the patch was reviewed at</div><div class='add'>+  --terse                    one line per report</div><div class='add'>+  -f, --file                 treat FILE as regular source file</div><div class='add'>+  --subjective, --strict     enable more subjective tests</div><div class='add'>+  --types TYPE(,TYPE2...)    show only these comma separated message types</div><div class='add'>+  --ignore TYPE(,TYPE2...)   ignore various comma separated message types</div><div class='add'>+  --max-line-length=n        set the maximum line length, if exceeded, warn</div><div class='add'>+  --show-types               show the message "types" in the output</div><div class='add'>+  --root=PATH                PATH to the glusterfs tree root</div><div class='add'>+  --no-summary               suppress the per-file summary</div><div class='add'>+  --mailback                 only produce a report in case of warnings/errors</div><div class='add'>+  --summary-file             include the filename in summary</div><div class='add'>+  --debug KEY=[0|1]          turn on/off debugging of KEY, where KEY is one of</div><div class='add'>+                             'values', 'possible', 'type', and 'attr' (default</div><div class='add'>+                             is all off)</div><div class='add'>+  --test-only=WORD           report only warnings/errors containing WORD literally</div><div class='add'>+  --fix                      EXPERIMENTAL - may create horrible results</div><div class='add'>+                             If correctable single-line errors exist, create</div><div class='add'>+                             "&lt;inputfile&gt;.EXPERIMENTAL-checkpatch-fixes"</div><div class='add'>+                             with potential errors corrected to the preferred</div><div class='add'>+                             checkpatch style</div><div class='add'>+  --fix-inplace              EXPERIMENTAL - may create horrible results</div><div class='add'>+                             Is the same as --fix, but overwrites the input</div><div class='add'>+                             file.  It's your fault if there's no backup or git</div><div class='add'>+  --ignore-perl-version      override checking of perl version.  expect</div><div class='add'>+                             runtime errors.</div><div class='add'>+  -h, --help, --version      display this help and exit</div><div class='add'>+</div><div class='add'>+When FILE is - read standard input.</div><div class='add'>+EOM</div><div class='add'>+</div><div class='add'>+exit($exitcode);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+my $conf = which_conf($configuration_file);</div><div class='add'>+if (-f $conf) {</div><div class='add'>+    my @conf_args;</div><div class='add'>+    open(my $conffile, '&lt;', "$conf")</div><div class='add'>+        or warn "$P: Can't find a readable $configuration_file file $!\n";</div><div class='add'>+</div><div class='add'>+    while (&lt;$conffile&gt;) {</div><div class='add'>+        my $line = $_;</div><div class='add'>+</div><div class='add'>+        $line =~ s/\s*\n?$//g;</div><div class='add'>+        $line =~ s/^\s*//g;</div><div class='add'>+        $line =~ s/\s+/ /g;</div><div class='add'>+</div><div class='add'>+        next if ($line =~ m/^\s*#/);</div><div class='add'>+        next if ($line =~ m/^\s*$/);</div><div class='add'>+</div><div class='add'>+        my @words = split(" ", $line);</div><div class='add'>+        foreach my $word (@words) {</div><div class='add'>+            last if ($word =~ m/^#/);</div><div class='add'>+            push (@conf_args, $word);</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    close($conffile);</div><div class='add'>+    unshift(@ARGV, @conf_args) if @conf_args;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+GetOptions(</div><div class='add'>+    'q|quiet+'  =&gt; \$quiet,</div><div class='add'>+    'patch!'    =&gt; \$chk_patch,</div><div class='add'>+    'emacs!'    =&gt; \$emacs,</div><div class='add'>+    'gerrit-url=s' =&gt; \$gerrit_url,</div><div class='add'>+    'terse!'    =&gt; \$terse,</div><div class='add'>+    'f|file!'   =&gt; \$file,</div><div class='add'>+    'subjective!'       =&gt; \$check,</div><div class='add'>+    'strict!'   =&gt; \$check,</div><div class='add'>+    'ignore=s'  =&gt; \@ignore,</div><div class='add'>+    'types=s'   =&gt; \@use,</div><div class='add'>+    'show-types!'       =&gt; \$show_types,</div><div class='add'>+    'max-line-length=i' =&gt; \$max_line_length,</div><div class='add'>+    'root=s'    =&gt; \$root,</div><div class='add'>+    'summary!'  =&gt; \$summary,</div><div class='add'>+    'mailback!' =&gt; \$mailback,</div><div class='add'>+    'summary-file!'     =&gt; \$summary_file,</div><div class='add'>+    'fix!'              =&gt; \$fix,</div><div class='add'>+    'fix-inplace!'      =&gt; \$fix_inplace,</div><div class='add'>+    'ignore-perl-version!' =&gt; \$ignore_perl_version,</div><div class='add'>+    'debug=s'   =&gt; \%debug,</div><div class='add'>+    'test-only=s'       =&gt; \$tst_only,</div><div class='add'>+    'h|help'    =&gt; \$help,</div><div class='add'>+    'version'   =&gt; \$help</div><div class='add'>+) or help(1);</div><div class='add'>+</div><div class='add'>+help(0) if ($help);</div><div class='add'>+</div><div class='add'>+$fix = 1 if ($fix_inplace);</div><div class='add'>+$check_orig = $check;</div><div class='add'>+</div><div class='add'>+my $exit = 0;</div><div class='add'>+</div><div class='add'>+if ($^V &amp;&amp; $^V lt $minimum_perl_version) {</div><div class='add'>+    printf "$P: requires at least perl version %vd\n", $minimum_perl_version;</div><div class='add'>+    if (!$ignore_perl_version) {</div><div class='add'>+        exit(1);</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+if ($#ARGV &lt; 0) {</div><div class='add'>+    print "$P: no input files\n";</div><div class='add'>+    exit(1);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+sub hash_save_array_words {</div><div class='add'>+    my ($hashRef, $arrayRef) = @_;</div><div class='add'>+</div><div class='add'>+    my @array = split(/,/, join(',', @$arrayRef));</div><div class='add'>+    foreach my $word (@array) {</div><div class='add'>+        $word =~ s/\s*\n?$//g;</div><div class='add'>+        $word =~ s/^\s*//g;</div><div class='add'>+        $word =~ s/\s+/ /g;</div><div class='add'>+        $word =~ tr/[a-z]/[A-Z]/;</div><div class='add'>+</div><div class='add'>+        next if ($word =~ m/^\s*#/);</div><div class='add'>+        next if ($word =~ m/^\s*$/);</div><div class='add'>+</div><div class='add'>+        $hashRef-&gt;{$word}++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+sub hash_show_words {</div><div class='add'>+    my ($hashRef, $prefix) = @_;</div><div class='add'>+</div><div class='add'>+    if ($quiet == 0 &amp;&amp; keys %$hashRef) {</div><div class='add'>+        print "NOTE: $prefix message types:";</div><div class='add'>+        foreach my $word (sort keys %$hashRef) {</div><div class='add'>+            print " $word";</div><div class='add'>+        }</div><div class='add'>+        print "\n\n";</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+hash_save_array_words(\%ignore_type, \@ignore);</div><div class='add'>+hash_save_array_words(\%use_type, \@use);</div><div class='add'>+</div><div class='add'>+my $dbg_values = 0;</div><div class='add'>+my $dbg_possible = 0;</div><div class='add'>+my $dbg_type = 0;</div><div class='add'>+my $dbg_attr = 0;</div><div class='add'>+for my $key (keys %debug) {</div><div class='add'>+    ## no critic</div><div class='add'>+    eval "\${dbg_$key} = '$debug{$key}';";</div><div class='add'>+    die "$@" if ($@);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+my $rpt_cleaners = 0;</div><div class='add'>+</div><div class='add'>+if ($terse) {</div><div class='add'>+    $emacs = 1;</div><div class='add'>+    $quiet++;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+if ($tree) {</div><div class='add'>+    if (defined $root) {</div><div class='add'>+        if (!top_of_glusterfs_tree($root)) {</div><div class='add'>+            die "$P: $root: --root does not point at a valid tree\n";</div><div class='add'>+        }</div><div class='add'>+    } else {</div><div class='add'>+        if (top_of_glusterfs_tree('.')) {</div><div class='add'>+            $root = '.';</div><div class='add'>+        } elsif ($0 =~ m@(.*)/extras/[^/]*$@ &amp;&amp;</div><div class='add'>+                 top_of_glusterfs_tree($1)) {</div><div class='add'>+            $root = $1;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (!defined $root) {</div><div class='add'>+        print "Must be run from the top-level dir. of a GlusterFS tree\n";</div><div class='add'>+        exit(2);</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+my $emitted_corrupt = 0;</div><div class='add'>+</div><div class='add'>+our $Ident      = qr{</div><div class='add'>+                        [A-Za-z_][A-Za-z\d_]*</div><div class='add'>+                        (?:\s*\#\#\s*[A-Za-z_][A-Za-z\d_]*)*</div><div class='add'>+                }x;</div><div class='add'>+our $Storage    = qr{extern|static|asmlinkage};</div><div class='add'>+our $Sparse     = qr{</div><div class='add'>+                        __user|</div><div class='add'>+                        __kernel|</div><div class='add'>+                        __force|</div><div class='add'>+                        __iomem|</div><div class='add'>+                        __must_check|</div><div class='add'>+                        __init_refok|</div><div class='add'>+                        __kprobes|</div><div class='add'>+                        __ref|</div><div class='add'>+                        __rcu</div><div class='add'>+                }x;</div><div class='add'>+our $InitAttributePrefix = qr{__(?:mem|cpu|dev|net_|)};</div><div class='add'>+our $InitAttributeData = qr{$InitAttributePrefix(?:initdata\b)};</div><div class='add'>+our $InitAttributeConst = qr{$InitAttributePrefix(?:initconst\b)};</div><div class='add'>+our $InitAttributeInit = qr{$InitAttributePrefix(?:init\b)};</div><div class='add'>+our $InitAttribute = qr{$InitAttributeData|$InitAttributeConst|$InitAttributeInit};</div><div class='add'>+</div><div class='add'>+# Notes to $Attribute:</div><div class='add'>+# We need \b after 'init' otherwise 'initconst' will cause a false positive in a check</div><div class='add'>+our $Attribute  = qr{</div><div class='add'>+                        const|</div><div class='add'>+                        __percpu|</div><div class='add'>+                        __nocast|</div><div class='add'>+                        __safe|</div><div class='add'>+                        __bitwise__|</div><div class='add'>+                        __packed__|</div><div class='add'>+                        __packed2__|</div><div class='add'>+                        __naked|</div><div class='add'>+                        __maybe_unused|</div><div class='add'>+                        __always_unused|</div><div class='add'>+                        __noreturn|</div><div class='add'>+                        __used|</div><div class='add'>+                        __cold|</div><div class='add'>+                        __noclone|</div><div class='add'>+                        __deprecated|</div><div class='add'>+                        __read_mostly|</div><div class='add'>+                        __kprobes|</div><div class='add'>+                        $InitAttribute|</div><div class='add'>+                        ____cacheline_aligned|</div><div class='add'>+                        ____cacheline_aligned_in_smp|</div><div class='add'>+                        ____cacheline_internodealigned_in_smp|</div><div class='add'>+                        __weak</div><div class='add'>+                  }x;</div><div class='add'>+our $Modifier;</div><div class='add'>+our $Inline     = qr{inline|__always_inline|noinline|__inline|__inline__};</div><div class='add'>+our $Member     = qr{-&gt;$Ident|\.$Ident|\[[^]]*\]};</div><div class='add'>+our $Lval       = qr{$Ident(?:$Member)*};</div><div class='add'>+</div><div class='add'>+our $Int_type   = qr{(?i)llu|ull|ll|lu|ul|l|u};</div><div class='add'>+our $Binary     = qr{(?i)0b[01]+$Int_type?};</div><div class='add'>+our $Hex        = qr{(?i)0x[0-9a-f]+$Int_type?};</div><div class='add'>+our $Int        = qr{[0-9]+$Int_type?};</div><div class='add'>+our $Octal      = qr{0[0-7]+$Int_type?};</div><div class='add'>+our $Float_hex  = qr{(?i)0x[0-9a-f]+p-?[0-9]+[fl]?};</div><div class='add'>+our $Float_dec  = qr{(?i)(?:[0-9]+\.[0-9]*|[0-9]*\.[0-9]+)(?:e-?[0-9]+)?[fl]?};</div><div class='add'>+our $Float_int  = qr{(?i)[0-9]+e-?[0-9]+[fl]?};</div><div class='add'>+our $Float      = qr{$Float_hex|$Float_dec|$Float_int};</div><div class='add'>+our $Constant   = qr{$Float|$Binary|$Octal|$Hex|$Int};</div><div class='add'>+our $Assignment = qr{\*\=|/=|%=|\+=|-=|&lt;&lt;=|&gt;&gt;=|&amp;=|\^=|\|=|=};</div><div class='add'>+our $Compare    = qr{&lt;=|&gt;=|==|!=|&lt;|(?&lt;!-)&gt;};</div><div class='add'>+our $Arithmetic = qr{\+|-|\*|\/|%};</div><div class='add'>+our $Operators  = qr{</div><div class='add'>+                        &lt;=|&gt;=|==|!=|</div><div class='add'>+                        =&gt;|-&gt;|&lt;&lt;|&gt;&gt;|&lt;|&gt;|!|~|</div><div class='add'>+                        &amp;&amp;|\|\||,|\^|\+\+|--|&amp;|\||$Arithmetic</div><div class='add'>+                  }x;</div><div class='add'>+</div><div class='add'>+our $c90_Keywords = qr{do|for|while|if|else|return|goto|continue|switch|default|case|break}x;</div><div class='add'>+</div><div class='add'>+our $NonptrType;</div><div class='add'>+our $NonptrTypeWithAttr;</div><div class='add'>+our $Type;</div><div class='add'>+our $Declare;</div><div class='add'>+</div><div class='add'>+our $NON_ASCII_UTF8     = qr{</div><div class='add'>+        [\xC2-\xDF][\x80-\xBF]               # non-overlong 2-byte</div><div class='add'>+        |  \xE0[\xA0-\xBF][\x80-\xBF]        # excluding overlongs</div><div class='add'>+        | [\xE1-\xEC\xEE\xEF][\x80-\xBF]{2}  # straight 3-byte</div><div class='add'>+        |  \xED[\x80-\x9F][\x80-\xBF]        # excluding surrogates</div><div class='add'>+        |  \xF0[\x90-\xBF][\x80-\xBF]{2}     # planes 1-3</div><div class='add'>+        | [\xF1-\xF3][\x80-\xBF]{3}          # planes 4-15</div><div class='add'>+        |  \xF4[\x80-\x8F][\x80-\xBF]{2}     # plane 16</div><div class='add'>+}x;</div><div class='add'>+</div><div class='add'>+our $UTF8       = qr{</div><div class='add'>+        [\x09\x0A\x0D\x20-\x7E]              # ASCII</div><div class='add'>+        | $NON_ASCII_UTF8</div><div class='add'>+}x;</div><div class='add'>+</div><div class='add'>+our $typeTypedefs = qr{(?x:</div><div class='add'>+        (?:__)?(?:u|s|be|le)(?:8|16|32|64)|</div><div class='add'>+        atomic_t</div><div class='add'>+)};</div><div class='add'>+</div><div class='add'>+our $logFunctions = qr{(?x:</div><div class='add'>+        printk(?:_ratelimited|_once|)|</div><div class='add'>+        (?:[a-z0-9]+_){1,2}(?:printk|emerg|alert|crit|err|warning|warn|notice|info|debug|dbg|vdbg|devel|cont|WARN)(?:_ratelimited|_once|)|</div><div class='add'>+        WARN(?:_RATELIMIT|_ONCE|)|</div><div class='add'>+        panic|</div><div class='add'>+        MODULE_[A-Z_]+|</div><div class='add'>+        seq_vprintf|seq_printf|seq_puts</div><div class='add'>+)};</div><div class='add'>+</div><div class='add'>+our $signature_tags = qr{(?xi:</div><div class='add'>+        Signed-off-by:|</div><div class='add'>+        Acked-by:|</div><div class='add'>+        Tested-by:|</div><div class='add'>+        Reviewed-by:|</div><div class='add'>+        Reviewed-on:|</div><div class='add'>+        Reported-by:|</div><div class='add'>+        Original-author:|</div><div class='add'>+        Original-Author:|</div><div class='add'>+        Original-Authors:|</div><div class='add'>+        Suggested-by:|</div><div class='add'>+        To:|</div><div class='add'>+        Cc:</div><div class='add'>+)};</div><div class='add'>+</div><div class='add'>+our $url_tags = qr{http:|https:};</div><div class='add'>+</div><div class='add'>+our @typeList = (</div><div class='add'>+        qr{void},</div><div class='add'>+        qr{(?:unsigned\s+)?char},</div><div class='add'>+        qr{(?:unsigned\s+)?short},</div><div class='add'>+        qr{(?:unsigned\s+)?int},</div><div class='add'>+        qr{(?:unsigned\s+)?long},</div><div class='add'>+        qr{(?:unsigned\s+)?long\s+int},</div><div class='add'>+        qr{(?:unsigned\s+)?long\s+long},</div><div class='add'>+        qr{(?:unsigned\s+)?long\s+long\s+int},</div><div class='add'>+        qr{unsigned},</div><div class='add'>+        qr{float},</div><div class='add'>+        qr{double},</div><div class='add'>+        qr{bool},</div><div class='add'>+        qr{struct\s+$Ident},</div><div class='add'>+        qr{union\s+$Ident},</div><div class='add'>+        qr{enum\s+$Ident},</div><div class='add'>+        qr{${Ident}_t},</div><div class='add'>+        qr{${Ident}_handler},</div><div class='add'>+        qr{${Ident}_handler_fn},</div><div class='add'>+);</div><div class='add'>+our @typeListWithAttr = (</div><div class='add'>+        @typeList,</div><div class='add'>+        qr{struct\s+$InitAttribute\s+$Ident},</div><div class='add'>+        qr{union\s+$InitAttribute\s+$Ident},</div><div class='add'>+);</div><div class='add'>+</div><div class='add'>+our @modifierList = (</div><div class='add'>+        qr{fastcall},</div><div class='add'>+);</div><div class='add'>+</div><div class='add'>+our @mode_permission_funcs = (</div><div class='add'>+        ["module_param", 3],</div><div class='add'>+        ["module_param_(?:array|named|string)", 4],</div><div class='add'>+        ["module_param_array_named", 5],</div><div class='add'>+        ["debugfs_create_(?:file|u8|u16|u32|u64|x8|x16|x32|x64|size_t|atomic_t|bool|blob|regset32|u32_array)", 2],</div><div class='add'>+        ["proc_create(?:_data|)", 2],</div><div class='add'>+        ["(?:CLASS|DEVICE|SENSOR)_ATTR", 2],</div><div class='add'>+);</div><div class='add'>+</div><div class='add'>+#Create a search pattern for all these functions to speed up a loop below</div><div class='add'>+our $mode_perms_search = "";</div><div class='add'>+foreach my $entry (@mode_permission_funcs) {</div><div class='add'>+        $mode_perms_search .= '|' if ($mode_perms_search ne "");</div><div class='add'>+        $mode_perms_search .= $entry-&gt;[0];</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+our $declaration_macros = qr{(?x:</div><div class='add'>+        (?:$Storage\s+)?(?:DECLARE|DEFINE)_[A-Z]+\s*\(|</div><div class='add'>+        (?:$Storage\s+)?LIST_HEAD\s*\(</div><div class='add'>+)};</div><div class='add'>+</div><div class='add'>+our $allowed_asm_includes = qr{(?x:</div><div class='add'>+        irq|</div><div class='add'>+        memory</div><div class='add'>+)};</div><div class='add'>+# memory.h: ARM has a custom one</div><div class='add'>+</div><div class='add'>+sub build_types {</div><div class='add'>+    my $mods = "(?x:\n" . join("|\n  ", @modifierList) . "\n)";</div><div class='add'>+    my $all = "(?x:\n" . join("|\n  ", @typeList) . "\n)";</div><div class='add'>+    my $allWithAttr = "(?x:\n" . join("|\n  ", @typeListWithAttr) . "\n)";</div><div class='add'>+    $Modifier   = qr{(?:$Attribute|$Sparse|$mods)};</div><div class='add'>+    $NonptrType = qr{</div><div class='add'>+                        (?:$Modifier\s+|const\s+)*</div><div class='add'>+                        (?:</div><div class='add'>+                                (?:typeof|__typeof__)\s*\([^\)]*\)|</div><div class='add'>+                                (?:$typeTypedefs\b)|</div><div class='add'>+                                (?:${all}\b)</div><div class='add'>+                        )</div><div class='add'>+                        (?:\s+$Modifier|\s+const)*</div><div class='add'>+                  }x;</div><div class='add'>+        $NonptrTypeWithAttr     = qr{</div><div class='add'>+                        (?:$Modifier\s+|const\s+)*</div><div class='add'>+                        (?:</div><div class='add'>+                                (?:typeof|__typeof__)\s*\([^\)]*\)|</div><div class='add'>+                                (?:$typeTypedefs\b)|</div><div class='add'>+                                (?:${allWithAttr}\b)</div><div class='add'>+                        )</div><div class='add'>+                        (?:\s+$Modifier|\s+const)*</div><div class='add'>+                  }x;</div><div class='add'>+        $Type   = qr{</div><div class='add'>+                        $NonptrType</div><div class='add'>+                        (?:(?:\s|\*|\[\])+\s*const|(?:\s|\*|\[\])+|(?:\s*\[\s*\])+)?</div><div class='add'>+                        (?:\s+$Inline|\s+$Modifier)*</div><div class='add'>+                  }x;</div><div class='add'>+        $Declare        = qr{(?:$Storage\s+(?:$Inline\s+)?)?$Type};</div><div class='add'>+}</div><div class='add'>+build_types();</div><div class='add'>+</div><div class='add'>+our $Typecast   = qr{\s*(\(\s*$NonptrType\s*\)){0,1}\s*};</div><div class='add'>+</div><div class='add'>+# Using $balanced_parens, $LvalOrFunc, or $FuncArg</div><div class='add'>+# requires at least perl version v5.10.0</div><div class='add'>+# Any use must be runtime checked with $^V</div><div class='add'>+</div><div class='add'>+our $balanced_parens = qr/(\((?:[^\(\)]++|(?-1))*\))/;</div><div class='add'>+our $LvalOrFunc = qr{((?:[\&amp;\*]\s*)?$Lval)\s*($balanced_parens{0,1})\s*};</div><div class='add'>+our $FuncArg = qr{$Typecast{0,1}($LvalOrFunc|$Constant)};</div><div class='add'>+</div><div class='add'>+sub deparenthesize {</div><div class='add'>+    my ($string) = @_;</div><div class='add'>+    return "" if (!defined($string));</div><div class='add'>+</div><div class='add'>+    while ($string =~ /^\s*\(.*\)\s*$/) {</div><div class='add'>+        $string =~ s@^\s*\(\s*@@;</div><div class='add'>+        $string =~ s@\s*\)\s*$@@;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    $string =~ s@\s+@ @g;</div><div class='add'>+</div><div class='add'>+    return $string;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+sub seed_camelcase_file {</div><div class='add'>+    my ($file) = @_;</div><div class='add'>+</div><div class='add'>+    return if (!(-f $file));</div><div class='add'>+</div><div class='add'>+    local $/;</div><div class='add'>+</div><div class='add'>+    open(my $include_file, '&lt;', "$file")</div><div class='add'>+        or warn "$P: Can't read '$file' $!\n";</div><div class='add'>+    my $text = &lt;$include_file&gt;;</div><div class='add'>+    close($include_file);</div><div class='add'>+</div><div class='add'>+    my @lines = split('\n', $text);</div><div class='add'>+</div><div class='add'>+    foreach my $line (@lines) {</div><div class='add'>+        next if ($line !~ /(?:[A-Z][a-z]|[a-z][A-Z])/);</div><div class='add'>+        if ($line =~ /^[ \t]*(?:#[ \t]*define|typedef\s+$Type)\s+(\w*(?:[A-Z][a-z]|[a-z][A-Z])\w*)/) {</div><div class='add'>+            $camelcase{$1} = 1;</div><div class='add'>+        } elsif ($line =~ /^\s*$Declare\s+(\w*(?:[A-Z][a-z]|[a-z][A-Z])\w*)\s*[\(\[,;]/) {</div><div class='add'>+            $camelcase{$1} = 1;</div><div class='add'>+        } elsif ($line =~ /^\s*(?:union|struct|enum)\s+(\w*(?:[A-Z][a-z]|[a-z][A-Z])\w*)\s*[;\{]/) {</div><div class='add'>+            $camelcase{$1} = 1;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+my $camelcase_seeded = 0;</div><div class='add'>+sub seed_camelcase_includes {</div><div class='add'>+    return if ($camelcase_seeded);</div><div class='add'>+</div><div class='add'>+    my $files;</div><div class='add'>+    my $camelcase_cache = "";</div><div class='add'>+    my @include_files = ();</div><div class='add'>+</div><div class='add'>+    $camelcase_seeded = 1;</div><div class='add'>+</div><div class='add'>+    if (-e ".git") {</div><div class='add'>+        my $git_last_include_commit = `git log --no-merges --pretty=format:"%h%n" -1 -- include`;</div><div class='add'>+        chomp $git_last_include_commit;</div><div class='add'>+        $camelcase_cache = ".checkpatch-camelcase.git.$git_last_include_commit";</div><div class='add'>+    } else {</div><div class='add'>+        my $last_mod_date = 0;</div><div class='add'>+        $files = `find $root/include -name "*.h"`;</div><div class='add'>+        @include_files = split('\n', $files);</div><div class='add'>+        foreach my $file (@include_files) {</div><div class='add'>+            my $date = POSIX::strftime("%Y%m%d%H%M",</div><div class='add'>+                                       localtime((stat $file)[9]));</div><div class='add'>+            $last_mod_date = $date if ($last_mod_date &lt; $date);</div><div class='add'>+        }</div><div class='add'>+        $camelcase_cache = ".checkpatch-camelcase.date.$last_mod_date";</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if ($camelcase_cache ne "" &amp;&amp; -f $camelcase_cache) {</div><div class='add'>+        open(my $camelcase_file, '&lt;', "$camelcase_cache")</div><div class='add'>+            or warn "$P: Can't read '$camelcase_cache' $!\n";</div><div class='add'>+        while (&lt;$camelcase_file&gt;) {</div><div class='add'>+            chomp;</div><div class='add'>+            $camelcase{$_} = 1;</div><div class='add'>+        }</div><div class='add'>+        close($camelcase_file);</div><div class='add'>+        return;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (-e ".git") {</div><div class='add'>+        $files = `git ls-files "include/*.h"`;</div><div class='add'>+        @include_files = split('\n', $files);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    foreach my $file (@include_files) {</div><div class='add'>+        seed_camelcase_file($file);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if ($camelcase_cache ne "") {</div><div class='add'>+        unlink glob ".checkpatch-camelcase.*";</div><div class='add'>+        open(my $camelcase_file, '&gt;', "$camelcase_cache")</div><div class='add'>+            or warn "$P: Can't write '$camelcase_cache' $!\n";</div><div class='add'>+        foreach (sort { lc($a) cmp lc($b) } keys(%camelcase)) {</div><div class='add'>+            print $camelcase_file ("$_\n");</div><div class='add'>+        }</div><div class='add'>+        close($camelcase_file);</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+$chk_signoff = 0 if ($file);</div><div class='add'>+</div><div class='add'>+my @rawlines = ();</div><div class='add'>+my @lines = ();</div><div class='add'>+my @fixed = ();</div><div class='add'>+my $vname;</div><div class='add'>+for my $filename (@ARGV) {</div><div class='add'>+    my $FILE;</div><div class='add'>+    if ($file) {</div><div class='add'>+        open($FILE, '-|', "diff -u /dev/null $filename") ||</div><div class='add'>+            die "$P: $filename: diff failed - $!\n";</div><div class='add'>+    } elsif ($filename eq '-') {</div><div class='add'>+        open($FILE, '&lt;&amp;STDIN');</div><div class='add'>+    } else {</div><div class='add'>+        open($FILE, '&lt;', "$filename") ||</div><div class='add'>+            die "$P: $filename: open failed - $!\n";</div><div class='add'>+    }</div><div class='add'>+    if ($filename eq '-') {</div><div class='add'>+        $vname = 'Your patch';</div><div class='add'>+    } else {</div><div class='add'>+        $vname = $filename;</div><div class='add'>+    }</div><div class='add'>+    while (&lt;$FILE&gt;) {</div><div class='add'>+        chomp;</div><div class='add'>+        push(@rawlines, $_);</div><div class='add'>+    }</div><div class='add'>+    close($FILE);</div><div class='add'>+    if (!process($filename)) {</div><div class='add'>+        $exit = 1;</div><div class='add'>+    }</div><div class='add'>+    @rawlines = ();</div><div class='add'>+    @lines = ();</div><div class='add'>+    @fixed = ();</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+exit($exit);</div><div class='add'>+</div><div class='add'>+sub top_of_glusterfs_tree {</div><div class='add'>+    my ($root) = @_;</div><div class='add'>+</div><div class='add'>+    # Add here if the tree changes</div><div class='add'>+    my @tree_check = (</div><div class='add'>+        "api",</div><div class='add'>+        "AUTHORS",</div><div class='add'>+        "autogen.sh",</div><div class='add'>+        "build-aux",</div><div class='add'>+        "ChangeLog",</div><div class='add'>+        "cli",</div><div class='add'>+        "configure.ac",</div><div class='add'>+        "contrib",</div><div class='add'>+        "CONTRIBUTING",</div><div class='add'>+        "COPYING-GPLV2",</div><div class='add'>+        "COPYING-LGPLV3",</div><div class='add'>+        "doc",</div><div class='add'>+        "extras",</div><div class='add'>+        "geo-replication",</div><div class='add'>+        "glusterfs-api.pc.in",</div><div class='add'>+        "glusterfsd",</div><div class='add'>+        "glusterfs.spec.in",</div><div class='add'>+        "heal",</div><div class='add'>+        "INSTALL",</div><div class='add'>+        "libgfchangelog.pc.in",</div><div class='add'>+        "libglusterfs",</div><div class='add'>+        "MAINTAINERS",</div><div class='add'>+        "Makefile.am",</div><div class='add'>+        "NEWS",</div><div class='add'>+        "README.md",</div><div class='add'>+        "rfc.sh",</div><div class='add'>+        "rpc",</div><div class='add'>+        "run-tests.sh",</div><div class='add'>+        "tests",</div><div class='add'>+        "THANKS",</div><div class='add'>+        "xlators",</div><div class='add'>+        );</div><div class='add'>+</div><div class='add'>+    foreach my $check (@tree_check) {</div><div class='add'>+        if (! -e $root . '/' . $check) {</div><div class='add'>+            return 0;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    return 1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+sub parse_email {</div><div class='add'>+    my ($formatted_email) = @_;</div><div class='add'>+</div><div class='add'>+    my $name = "";</div><div class='add'>+    my $address = "";</div><div class='add'>+    my $comment = "";</div><div class='add'>+</div><div class='add'>+    if ($formatted_email =~ /^(.*)&lt;(\S+\@\S+)&gt;(.*)$/) {</div><div class='add'>+        $name = $1;</div><div class='add'>+        $address = $2;</div><div class='add'>+        $comment = $3 if defined $3;</div><div class='add'>+    } elsif ($formatted_email =~ /^\s*&lt;(\S+\@\S+)&gt;(.*)$/) {</div><div class='add'>+        $address = $1;</div><div class='add'>+        $comment = $2 if defined $2;</div><div class='add'>+    } elsif ($formatted_email =~ /(\S+\@\S+)(.*)$/) {</div><div class='add'>+        $address = $1;</div><div class='add'>+        $comment = $2 if defined $2;</div><div class='add'>+        $formatted_email =~ s/$address.*$//;</div><div class='add'>+        $name = $formatted_email;</div><div class='add'>+        $name = trim($name);</div><div class='add'>+        $name =~ s/^\"|\"$//g;</div><div class='add'>+        # If there's a name left after stripping spaces and</div><div class='add'>+        # leading quotes, and the address doesn't have both</div><div class='add'>+        # leading and trailing angle brackets, the address</div><div class='add'>+        # is invalid. ie:</div><div class='add'>+        #   "joe smith joe@smith.com" bad</div><div class='add'>+        #   "joe smith &lt;joe@smith.com" bad</div><div class='add'>+        if ($name ne "" &amp;&amp; $address !~ /^&lt;[^&gt;]+&gt;$/) {</div><div class='add'>+            $name = "";</div><div class='add'>+            $address = "";</div><div class='add'>+            $comment = "";</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    $name = trim($name);</div><div class='add'>+    $name =~ s/^\"|\"$//g;</div><div class='add'>+    $address = trim($address);</div><div class='add'>+    $address =~ s/^\&lt;|\&gt;$//g;</div><div class='add'>+</div><div class='add'>+    if ($name =~ /[^\w \-]/i) { ##has "must quote" chars</div><div class='add'>+        $name =~ s/(?&lt;!\\)"/\\"/g; ##escape quotes</div><div class='add'>+        $name = "\"$name\"";</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return ($name, $address, $comment);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+sub format_email {</div><div class='add'>+    my ($name, $address) = @_;</div><div class='add'>+</div><div class='add'>+    my $formatted_email;</div><div class='add'>+</div><div class='add'>+    $name = trim($name);</div><div class='add'>+    $name =~ s/^\"|\"$//g;</div><div class='add'>+    $address = trim($address);</div><div class='add'>+</div><div class='add'>+    if ($name =~ /[^\w \-]/i) { ##has "must quote" chars</div><div class='add'>+        $name =~ s/(?&lt;!\\)"/\\"/g; ##escape quotes</div><div class='add'>+        $name = "\"$name\"";</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if ("$name" eq "") {</div><div class='add'>+        $formatted_email = "$address";</div><div class='add'>+    } else {</div><div class='add'>+        $formatted_email = "$name &lt;$address&gt;";</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return $formatted_email;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+sub which_conf {</div><div class='add'>+    my ($conf) = @_;</div><div class='add'>+</div><div class='add'>+    foreach my $path (split(/:/, ".:$ENV{HOME}:.scripts")) {</div><div class='add'>+        if (-e "$path/$conf") {</div><div class='add'>+            return "$path/$conf";</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return "";</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+sub expand_tabs {</div><div class='add'>+    my ($str) = @_;</div><div class='add'>+</div><div class='add'>+    my $res = '';</div><div class='add'>+    my $n = 0;</div><div class='add'>+    for my $c (split(//, $str)) {</div><div class='add'>+        if ($c eq "\t") {</div><div class='add'>+            $res .= ' ';</div><div class='add'>+            $n++;</div><div class='add'>+            for (; ($n % 8) != 0; $n++) {</div><div class='add'>+                $res .= ' ';</div><div class='add'>+            }</div><div class='add'>+            next;</div><div class='add'>+        }</div><div class='add'>+        $res .= $c;</div><div class='add'>+        $n++;</div><div class='add'>+    }</div><div class='add'>+    return $res;</div><div class='add'>+}</div><div class='add'>+sub copy_spacing {</div><div class='add'>+    (my $res = shift) =~ tr/\t/ /c;</div><div class='add'>+    return $res;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+sub line_stats {</div><div class='add'>+    my ($line) = @_;</div><div class='add'>+</div><div class='add'>+    # Drop the diff line leader and expand tabs</div><div class='add'>+    $line =~ s/^.//;</div><div class='add'>+    $line = expand_tabs($line);</div><div class='add'>+</div><div class='add'>+    # Pick the indent from the front of the line.</div><div class='add'>+    my ($white) = ($line =~ /^(\s*)/);</div><div class='add'>+</div><div class='add'>+    return (length($line), length($white));</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+my $sanitise_quote = '';</div><div class='add'>+</div><div class='add'>+sub sanitise_line_reset {</div><div class='add'>+    my ($in_comment) = @_;</div><div class='add'>+</div><div class='add'>+    if ($in_comment) {</div><div class='add'>+        $sanitise_quote = '*/';</div><div class='add'>+    } else {</div><div class='add'>+        $sanitise_quote = '';</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+sub sanitise_line {</div><div class='add'>+    my ($line) = @_;</div><div class='add'>+</div><div class='add'>+    my $res = '';</div><div class='add'>+    my $l = '';</div><div class='add'>+</div><div class='add'>+    my $qlen = 0;</div><div class='add'>+    my $off = 0;</div><div class='add'>+    my $c;</div><div class='add'>+</div><div class='add'>+    # Always copy over the diff marker.</div><div class='add'>+    $res = substr($line, 0, 1);</div><div class='add'>+</div><div class='add'>+    for ($off = 1; $off &lt; length($line); $off++) {</div><div class='add'>+        $c = substr($line, $off, 1);</div><div class='add'>+</div><div class='add'>+        # Comments we are wacking completly including the begin</div><div class='add'>+        # and end, all to $;.</div><div class='add'>+        if ($sanitise_quote eq '' &amp;&amp; substr($line, $off, 2) eq '/*') {</div><div class='add'>+            $sanitise_quote = '*/';</div><div class='add'>+</div><div class='add'>+            substr($res, $off, 2, "$;$;");</div><div class='add'>+            $off++;</div><div class='add'>+            next;</div><div class='add'>+        }</div><div class='add'>+        if ($sanitise_quote eq '*/' &amp;&amp; substr($line, $off, 2) eq '*/') {</div><div class='add'>+            $sanitise_quote = '';</div><div class='add'>+            substr($res, $off, 2, "$;$;");</div><div class='add'>+            $off++;</div><div class='add'>+            next;</div><div class='add'>+        }</div><div class='add'>+        if ($sanitise_quote eq '' &amp;&amp; substr($line, $off, 2) eq '//') {</div><div class='add'>+            $sanitise_quote = '//';</div><div class='add'>+</div><div class='add'>+            substr($res, $off, 2, $sanitise_quote);</div><div class='add'>+            $off++;</div><div class='add'>+            next;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        # A \ in a string means ignore the next character.</div><div class='add'>+        if (($sanitise_quote eq "'" || $sanitise_quote eq '"') &amp;&amp;</div><div class='add'>+            $c eq "\\") {</div><div class='add'>+            substr($res, $off, 2, 'XX');</div><div class='add'>+            $off++;</div><div class='add'>+            next;</div><div class='add'>+        }</div><div class='add'>+        # Regular quotes.</div><div class='add'>+        if ($c eq "'" || $c eq '"') {</div><div class='add'>+            if ($sanitise_quote eq '') {</div><div class='add'>+                $sanitise_quote = $c;</div><div class='add'>+</div><div class='add'>+                substr($res, $off, 1, $c);</div><div class='add'>+                next;</div><div class='add'>+            } elsif ($sanitise_quote eq $c) {</div><div class='add'>+                $sanitise_quote = '';</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        #print "c&lt;$c&gt; SQ&lt;$sanitise_quote&gt;\n";</div><div class='add'>+        if ($off != 0 &amp;&amp; $sanitise_quote eq '*/' &amp;&amp; $c ne "\t") {</div><div class='add'>+            substr($res, $off, 1, $;);</div><div class='add'>+        } elsif ($off != 0 &amp;&amp; $sanitise_quote eq '//' &amp;&amp; $c ne "\t") {</div><div class='add'>+            substr($res, $off, 1, $;);</div><div class='add'>+        } elsif ($off != 0 &amp;&amp; $sanitise_quote &amp;&amp; $c ne "\t") {</div><div class='add'>+            substr($res, $off, 1, 'X');</div><div class='add'>+        } else {</div><div class='add'>+            substr($res, $off, 1, $c);</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if ($sanitise_quote eq '//') {</div><div class='add'>+        $sanitise_quote = '';</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    # The pathname on a #include may be surrounded by '&lt;' and '&gt;'.</div><div class='add'>+    if ($res =~ /^.\s*\#\s*include\s+\&lt;(.*)\&gt;/) {</div><div class='add'>+        my $clean = 'X' x length($1);</div><div class='add'>+        $res =~ s@\&lt;.*\&gt;@&lt;$clean&gt;@;</div><div class='add'>+</div><div class='add'>+    # The whole of a #error is a string.</div><div class='add'>+    } elsif ($res =~ /^.\s*\#\s*(?:error|warning)\s+(.*)\b/) {</div><div class='add'>+        my $clean = 'X' x length($1);</div><div class='add'>+        $res =~ s@(\#\s*(?:error|warning)\s+).*@$1$clean@;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return $res;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+sub get_quoted_string {</div><div class='add'>+    my ($line, $rawline) = @_;</div><div class='add'>+</div><div class='add'>+    return "" if ($line !~ m/(\"[X]+\")/g);</div><div class='add'>+    return substr($rawline, $-[0], $+[0] - $-[0]);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+sub ctx_statement_block {</div><div class='add'>+    my ($linenr, $remain, $off) = @_;</div><div class='add'>+    my $line = $linenr - 1;</div><div class='add'>+    my $blk = '';</div><div class='add'>+    my $soff = $off;</div><div class='add'>+    my $coff = $off - 1;</div><div class='add'>+    my $coff_set = 0;</div><div class='add'>+</div><div class='add'>+    my $loff = 0;</div><div class='add'>+</div><div class='add'>+    my $type = '';</div><div class='add'>+    my $level = 0;</div><div class='add'>+    my @stack = ();</div><div class='add'>+    my $p;</div><div class='add'>+    my $c;</div><div class='add'>+    my $len = 0;</div><div class='add'>+</div><div class='add'>+    my $remainder;</div><div class='add'>+    while (1) {</div><div class='add'>+        @stack = (['', 0]) if ($#stack == -1);</div><div class='add'>+</div><div class='add'>+        #warn "CSB: blk&lt;$blk&gt; remain&lt;$remain&gt;\n";</div><div class='add'>+        # If we are about to drop off the end, pull in more</div><div class='add'>+        # context.</div><div class='add'>+        if ($off &gt;= $len) {</div><div class='add'>+            for (; $remain &gt; 0; $line++) {</div><div class='add'>+                last if (!defined $lines[$line]);</div><div class='add'>+                next if ($lines[$line] =~ /^-/);</div><div class='add'>+                $remain--;</div><div class='add'>+                $loff = $len;</div><div class='add'>+                $blk .= $lines[$line] . "\n";</div><div class='add'>+                $len = length($blk);</div><div class='add'>+                $line++;</div><div class='add'>+                last;</div><div class='add'>+            }</div><div class='add'>+            # Bail if there is no further context.</div><div class='add'>+            #warn "CSB: blk&lt;$blk&gt; off&lt;$off&gt; len&lt;$len&gt;\n";</div><div class='add'>+            if ($off &gt;= $len) {</div><div class='add'>+                last;</div><div class='add'>+            }</div><div class='add'>+            if ($level == 0 &amp;&amp; substr($blk, $off) =~ /^.\s*#\s*define/) {</div><div class='add'>+                $level++;</div><div class='add'>+                $type = '#';</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+        $p = $c;</div><div class='add'>+        $c = substr($blk, $off, 1);</div><div class='add'>+        $remainder = substr($blk, $off);</div><div class='add'>+</div><div class='add'>+        #warn "CSB: c&lt;$c&gt; type&lt;$type&gt; level&lt;$level&gt; remainder&lt;$remainder&gt; coff_set&lt;$coff_set&gt;\n";</div><div class='add'>+</div><div class='add'>+        # Handle nested #if/#else.</div><div class='add'>+        if ($remainder =~ /^#\s*(?:ifndef|ifdef|if)\s/) {</div><div class='add'>+            push(@stack, [ $type, $level ]);</div><div class='add'>+        } elsif ($remainder =~ /^#\s*(?:else|elif)\b/) {</div><div class='add'>+            ($type, $level) = @{$stack[$#stack - 1]};</div><div class='add'>+        } elsif ($remainder =~ /^#\s*endif\b/) {</div><div class='add'>+            ($type, $level) = @{pop(@stack)};</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        # Statement ends at the ';' or a close '}' at the</div><div class='add'>+        # outermost level.</div><div class='add'>+        if ($level == 0 &amp;&amp; $c eq ';') {</div><div class='add'>+            last;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        # An else is really a conditional as long as its not else if</div><div class='add'>+        if ($level == 0 &amp;&amp; $coff_set == 0 &amp;&amp;</div><div class='add'>+            (!defined($p) || $p =~ /(?:\s|\}|\+)/) &amp;&amp;</div><div class='add'>+            $remainder =~ /^(else)(?:\s|{)/ &amp;&amp;</div><div class='add'>+            $remainder !~ /^else\s+if\b/) {</div><div class='add'>+            $coff = $off + length($1) - 1;</div><div class='add'>+            $coff_set = 1;</div><div class='add'>+            #warn "CSB: mark coff&lt;$coff&gt; soff&lt;$soff&gt; 1&lt;$1&gt;\n";</div><div class='add'>+            #warn "[" . substr($blk, $soff, $coff - $soff + 1) . "]\n";</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        if (($type eq '' || $type eq '(') &amp;&amp; $c eq '(') {</div><div class='add'>+            $level++;</div><div class='add'>+            $type = '(';</div><div class='add'>+        }</div><div class='add'>+        if ($type eq '(' &amp;&amp; $c eq ')') {</div><div class='add'>+            $level--;</div><div class='add'>+            $type = ($level != 0)? '(' : '';</div><div class='add'>+</div><div class='add'>+            if ($level == 0 &amp;&amp; $coff &lt; $soff) {</div><div class='add'>+                $coff = $off;</div><div class='add'>+                $coff_set = 1;</div><div class='add'>+                #warn "CSB: mark coff&lt;$coff&gt;\n";</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+        if (($type eq '' || $type eq '{') &amp;&amp; $c eq '{') {</div><div class='add'>+            $level++;</div><div class='add'>+            $type = '{';</div><div class='add'>+        }</div><div class='add'>+        if ($type eq '{' &amp;&amp; $c eq '}') {</div><div class='add'>+            $level--;</div><div class='add'>+            $type = ($level != 0)? '{' : '';</div><div class='add'>+</div><div class='add'>+            if ($level == 0) {</div><div class='add'>+                if (substr($blk, $off + 1, 1) eq ';') {</div><div class='add'>+                    $off++;</div><div class='add'>+                }</div><div class='add'>+                last;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+        # Preprocessor commands end at the newline unless escaped.</div><div class='add'>+        if ($type eq '#' &amp;&amp; $c eq "\n" &amp;&amp; $p ne "\\") {</div><div class='add'>+            $level--;</div><div class='add'>+            $type = '';</div><div class='add'>+            $off++;</div><div class='add'>+            last;</div><div class='add'>+        }</div><div class='add'>+        $off++;</div><div class='add'>+    }</div><div class='add'>+    # We are truly at the end, so shuffle to the next line.</div><div class='add'>+    if ($off == $len) {</div><div class='add'>+        $loff = $len + 1;</div><div class='add'>+        $line++;</div><div class='add'>+        $remain--;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    my $statement = substr($blk, $soff, $off - $soff + 1);</div><div class='add'>+    my $condition = substr($blk, $soff, $coff - $soff + 1);</div><div class='add'>+</div><div class='add'>+    #warn "STATEMENT&lt;$statement&gt;\n";</div><div class='add'>+    #warn "CONDITION&lt;$condition&gt;\n";</div><div class='add'>+</div><div class='add'>+    #print "coff&lt;$coff&gt; soff&lt;$off&gt; loff&lt;$loff&gt;\n";</div><div class='add'>+</div><div class='add'>+    return ($statement, $condition,</div><div class='add'>+            $line, $remain + 1, $off - $loff + 1, $level);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+sub statement_lines {</div><div class='add'>+    my ($stmt) = @_;</div><div class='add'>+</div><div class='add'>+    # Strip the diff line prefixes and rip blank lines at start and end.</div><div class='add'>+    $stmt =~ s/(^|\n)./$1/g;</div><div class='add'>+    $stmt =~ s/^\s*//;</div><div class='add'>+    $stmt =~ s/\s*$//;</div><div class='add'>+</div><div class='add'>+    my @stmt_lines = ($stmt =~ /\n/g);</div><div class='add'>+</div><div class='add'>+    return $#stmt_lines + 2;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+sub statement_rawlines {</div><div class='add'>+    my ($stmt) = @_;</div><div class='add'>+</div><div class='add'>+    my @stmt_lines = ($stmt =~ /\n/g);</div><div class='add'>+</div><div class='add'>+    return $#stmt_lines + 2;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+sub statement_block_size {</div><div class='add'>+    my ($stmt) = @_;</div><div class='add'>+</div><div class='add'>+    $stmt =~ s/(^|\n)./$1/g;</div><div class='add'>+    $stmt =~ s/^\s*{//;</div><div class='add'>+    $stmt =~ s/}\s*$//;</div><div class='add'>+    $stmt =~ s/^\s*//;</div><div class='add'>+    $stmt =~ s/\s*$//;</div><div class='add'>+</div><div class='add'>+    my @stmt_lines = ($stmt =~ /\n/g);</div><div class='add'>+    my @stmt_statements = ($stmt =~ /;/g);</div><div class='add'>+</div><div class='add'>+    my $stmt_lines = $#stmt_lines + 2;</div><div class='add'>+    my $stmt_statements = $#stmt_statements + 1;</div><div class='add'>+</div><div class='add'>+    if ($stmt_lines &gt; $stmt_statements) {</div><div class='add'>+        return $stmt_lines;</div><div class='add'>+    } else {</div><div class='add'>+        return $stmt_statements;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+sub ctx_statement_full {</div><div class='add'>+    my ($linenr, $remain, $off) = @_;</div><div class='add'>+    my ($statement, $condition, $level);</div><div class='add'>+</div><div class='add'>+    my (@chunks);</div><div class='add'>+</div><div class='add'>+    # Grab the first conditional/block pair.</div><div class='add'>+    ($statement, $condition, $linenr, $remain, $off, $level) =</div><div class='add'>+        ctx_statement_block($linenr, $remain, $off);</div><div class='add'>+    #print "F: c&lt;$condition&gt; s&lt;$statement&gt; remain&lt;$remain&gt;\n";</div><div class='add'>+    push(@chunks, [ $condition, $statement ]);</div><div class='add'>+    if (!($remain &gt; 0 &amp;&amp; $condition =~ /^\s*(?:\n[+-])?\s*(?:if|else|do)\b/s)) {</div><div class='add'>+        return ($level, $linenr, @chunks);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    # Pull in the following conditional/block pairs and see if they</div><div class='add'>+    # could continue the statement.</div><div class='add'>+    for (;;) {</div><div class='add'>+        ($statement, $condition, $linenr, $remain, $off, $level) =</div><div class='add'>+            ctx_statement_block($linenr, $remain, $off);</div><div class='add'>+        #print "C: c&lt;$condition&gt; s&lt;$statement&gt; remain&lt;$remain&gt;\n";</div><div class='add'>+        last if (!($remain &gt; 0 &amp;&amp; $condition =~ /^(?:\s*\n[+-])*\s*(?:else|do)\b/s));</div><div class='add'>+        #print "C: push\n";</div><div class='add'>+        push(@chunks, [ $condition, $statement ]);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return ($level, $linenr, @chunks);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+sub ctx_block_get {</div><div class='add'>+    my ($linenr, $remain, $outer, $open, $close, $off) = @_;</div><div class='add'>+    my $line;</div><div class='add'>+    my $start = $linenr - 1;</div><div class='add'>+    my $blk = '';</div><div class='add'>+    my @o;</div><div class='add'>+    my @c;</div><div class='add'>+    my @res = ();</div><div class='add'>+</div><div class='add'>+    my $level = 0;</div><div class='add'>+    my @stack = ($level);</div><div class='add'>+    for ($line = $start; $remain &gt; 0; $line++) {</div><div class='add'>+        next if ($rawlines[$line] =~ /^-/);</div><div class='add'>+        $remain--;</div><div class='add'>+</div><div class='add'>+        $blk .= $rawlines[$line];</div><div class='add'>+</div><div class='add'>+        # Handle nested #if/#else.</div><div class='add'>+        if ($lines[$line] =~ /^.\s*#\s*(?:ifndef|ifdef|if)\s/) {</div><div class='add'>+            push(@stack, $level);</div><div class='add'>+        } elsif ($lines[$line] =~ /^.\s*#\s*(?:else|elif)\b/) {</div><div class='add'>+            $level = $stack[$#stack - 1];</div><div class='add'>+        } elsif ($lines[$line] =~ /^.\s*#\s*endif\b/) {</div><div class='add'>+            $level = pop(@stack);</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        foreach my $c (split(//, $lines[$line])) {</div><div class='add'>+            ##print "C&lt;$c&gt;L&lt;$level&gt;&lt;$open$close&gt;O&lt;$off&gt;\n";</div><div class='add'>+            if ($off &gt; 0) {</div><div class='add'>+                $off--;</div><div class='add'>+                next;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            if ($c eq $close &amp;&amp; $level &gt; 0) {</div><div class='add'>+                $level--;</div><div class='add'>+                last if ($level == 0);</div><div class='add'>+            } elsif ($c eq $open) {</div><div class='add'>+                $level++;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        if (!$outer || $level &lt;= 1) {</div><div class='add'>+            push(@res, $rawlines[$line]);</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        last if ($level == 0);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return ($level, @res);</div><div class='add'>+}</div><div class='add'>+sub ctx_block_outer {</div><div class='add'>+    my ($linenr, $remain) = @_;</div><div class='add'>+</div><div class='add'>+    my ($level, @r) = ctx_block_get($linenr, $remain, 1, '{', '}', 0);</div><div class='add'>+    return @r;</div><div class='add'>+}</div><div class='add'>+sub ctx_block {</div><div class='add'>+    my ($linenr, $remain) = @_;</div><div class='add'>+</div><div class='add'>+    my ($level, @r) = ctx_block_get($linenr, $remain, 0, '{', '}', 0);</div><div class='add'>+    return @r;</div><div class='add'>+}</div><div class='add'>+sub ctx_statement {</div><div class='add'>+    my ($linenr, $remain, $off) = @_;</div><div class='add'>+</div><div class='add'>+    my ($level, @r) = ctx_block_get($linenr, $remain, 0, '(', ')', $off);</div><div class='add'>+    return @r;</div><div class='add'>+}</div><div class='add'>+sub ctx_block_level {</div><div class='add'>+    my ($linenr, $remain) = @_;</div><div class='add'>+</div><div class='add'>+    return ctx_block_get($linenr, $remain, 0, '{', '}', 0);</div><div class='add'>+}</div><div class='add'>+sub ctx_statement_level {</div><div class='add'>+    my ($linenr, $remain, $off) = @_;</div><div class='add'>+</div><div class='add'>+    return ctx_block_get($linenr, $remain, 0, '(', ')', $off);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+sub ctx_locate_comment {</div><div class='add'>+    my ($first_line, $end_line) = @_;</div><div class='add'>+</div><div class='add'>+    # Catch a comment on the end of the line itself.</div><div class='add'>+    my ($current_comment) = ($rawlines[$end_line - 1] =~ m@.*(/\*.*\*/)\s*(?:\\\s*)?$@);</div><div class='add'>+    return $current_comment if (defined $current_comment);</div><div class='add'>+</div><div class='add'>+    # Look through the context and try and figure out if there is a</div><div class='add'>+    # comment.</div><div class='add'>+    my $in_comment = 0;</div><div class='add'>+    $current_comment = '';</div><div class='add'>+    for (my $linenr = $first_line; $linenr &lt; $end_line; $linenr++) {</div><div class='add'>+        my $line = $rawlines[$linenr - 1];</div><div class='add'>+        #warn "           $line\n";</div><div class='add'>+        if ($linenr == $first_line and $line =~ m@^.\s*\*@) {</div><div class='add'>+            $in_comment = 1;</div><div class='add'>+        }</div><div class='add'>+        if ($line =~ m@/\*@) {</div><div class='add'>+            $in_comment = 1;</div><div class='add'>+        }</div><div class='add'>+        if (!$in_comment &amp;&amp; $current_comment ne '') {</div><div class='add'>+            $current_comment = '';</div><div class='add'>+        }</div><div class='add'>+        $current_comment .= $line . "\n" if ($in_comment);</div><div class='add'>+        if ($line =~ m@\*/@) {</div><div class='add'>+            $in_comment = 0;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    chomp($current_comment);</div><div class='add'>+    return($current_comment);</div><div class='add'>+}</div><div class='add'>+sub ctx_has_comment {</div><div class='add'>+    my ($first_line, $end_line) = @_;</div><div class='add'>+    my $cmt = ctx_locate_comment($first_line, $end_line);</div><div class='add'>+</div><div class='add'>+    ##print "LINE: $rawlines[$end_line - 1 ]\n";</div><div class='add'>+    ##print "CMMT: $cmt\n";</div><div class='add'>+</div><div class='add'>+    return ($cmt ne '');</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+sub raw_line {</div><div class='add'>+    my ($linenr, $cnt) = @_;</div><div class='add'>+</div><div class='add'>+    my $offset = $linenr - 1;</div><div class='add'>+    $cnt++;</div><div class='add'>+</div><div class='add'>+    my $line;</div><div class='add'>+    while ($cnt) {</div><div class='add'>+        $line = $rawlines[$offset++];</div><div class='add'>+        next if (defined($line) &amp;&amp; $line =~ /^-/);</div><div class='add'>+        $cnt--;</div><div class='add'>+    }</div><div class='add'>+    return $line;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+sub cat_vet {</div><div class='add'>+    my ($vet) = @_;</div><div class='add'>+    my ($res, $coded);</div><div class='add'>+</div><div class='add'>+    $res = '';</div><div class='add'>+    while ($vet =~ /([^[:cntrl:]]*)([[:cntrl:]]|$)/g) {</div><div class='add'>+        $res .= $1;</div><div class='add'>+        if ($2 ne '') {</div><div class='add'>+            $coded = sprintf("^%c", unpack('C', $2) + 64);</div><div class='add'>+            $res .= $coded;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    $res =~ s/$/\$/;</div><div class='add'>+    return $res;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+my $av_preprocessor = 0;</div><div class='add'>+my $av_pending;</div><div class='add'>+my @av_paren_type;</div><div class='add'>+my $av_pend_colon;</div><div class='add'>+</div><div class='add'>+sub annotate_reset {</div><div class='add'>+    $av_preprocessor = 0;</div><div class='add'>+    $av_pending = '_';</div><div class='add'>+    @av_paren_type = ('E');</div><div class='add'>+    $av_pend_colon = 'O';</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+sub annotate_values {</div><div class='add'>+    my ($stream, $type) = @_;</div><div class='add'>+</div><div class='add'>+    my $res;</div><div class='add'>+    my $var = '_' x length($stream);</div><div class='add'>+    my $cur = $stream;</div><div class='add'>+</div><div class='add'>+    print "$stream\n" if ($dbg_values &gt; 1);</div><div class='add'>+</div><div class='add'>+    while (length($cur)) {</div><div class='add'>+        @av_paren_type = ('E') if ($#av_paren_type &lt; 0);</div><div class='add'>+        print " &lt;" . join('', @av_paren_type) .</div><div class='add'>+            "&gt; &lt;$type&gt; &lt;$av_pending&gt;" if ($dbg_values &gt; 1);</div><div class='add'>+        if ($cur =~ /^(\s+)/o) {</div><div class='add'>+            print "WS($1)\n" if ($dbg_values &gt; 1);</div><div class='add'>+            if ($1 =~ /\n/ &amp;&amp; $av_preprocessor) {</div><div class='add'>+                $type = pop(@av_paren_type);</div><div class='add'>+                $av_preprocessor = 0;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+        } elsif ($cur =~ /^(\(\s*$Type\s*)\)/ &amp;&amp; $av_pending eq '_') {</div><div class='add'>+            print "CAST($1)\n" if ($dbg_values &gt; 1);</div><div class='add'>+            push(@av_paren_type, $type);</div><div class='add'>+            $type = 'c';</div><div class='add'>+</div><div class='add'>+        } elsif ($cur =~ /^($Type)\s*(?:$Ident|,|\)|\(|\s*$)/) {</div><div class='add'>+            print "DECLARE($1)\n" if ($dbg_values &gt; 1);</div><div class='add'>+            $type = 'T';</div><div class='add'>+</div><div class='add'>+        } elsif ($cur =~ /^($Modifier)\s*/) {</div><div class='add'>+            print "MODIFIER($1)\n" if ($dbg_values &gt; 1);</div><div class='add'>+            $type = 'T';</div><div class='add'>+</div><div class='add'>+        } elsif ($cur =~ /^(\#\s*define\s*$Ident)(\(?)/o) {</div><div class='add'>+            print "DEFINE($1,$2)\n" if ($dbg_values &gt; 1);</div><div class='add'>+            $av_preprocessor = 1;</div><div class='add'>+            push(@av_paren_type, $type);</div><div class='add'>+            if ($2 ne '') {</div><div class='add'>+                $av_pending = 'N';</div><div class='add'>+            }</div><div class='add'>+            $type = 'E';</div><div class='add'>+</div><div class='add'>+        } elsif ($cur =~ /^(\#\s*(?:undef\s*$Ident|include\b))/o) {</div><div class='add'>+            print "UNDEF($1)\n" if ($dbg_values &gt; 1);</div><div class='add'>+            $av_preprocessor = 1;</div><div class='add'>+            push(@av_paren_type, $type);</div><div class='add'>+</div><div class='add'>+        } elsif ($cur =~ /^(\#\s*(?:ifdef|ifndef|if))/o) {</div><div class='add'>+            print "PRE_START($1)\n" if ($dbg_values &gt; 1);</div><div class='add'>+            $av_preprocessor = 1;</div><div class='add'>+</div><div class='add'>+            push(@av_paren_type, $type);</div><div class='add'>+            push(@av_paren_type, $type);</div><div class='add'>+            $type = 'E';</div><div class='add'>+</div><div class='add'>+        } elsif ($cur =~ /^(\#\s*(?:else|elif))/o) {</div><div class='add'>+            print "PRE_RESTART($1)\n" if ($dbg_values &gt; 1);</div><div class='add'>+            $av_preprocessor = 1;</div><div class='add'>+</div><div class='add'>+            push(@av_paren_type, $av_paren_type[$#av_paren_type]);</div><div class='add'>+</div><div class='add'>+            $type = 'E';</div><div class='add'>+</div><div class='add'>+        } elsif ($cur =~ /^(\#\s*(?:endif))/o) {</div><div class='add'>+            print "PRE_END($1)\n" if ($dbg_values &gt; 1);</div><div class='add'>+</div><div class='add'>+            $av_preprocessor = 1;</div><div class='add'>+</div><div class='add'>+            # Assume all arms of the conditional end as this</div><div class='add'>+            # one does, and continue as if the #endif was not here.</div><div class='add'>+            pop(@av_paren_type);</div><div class='add'>+            push(@av_paren_type, $type);</div><div class='add'>+            $type = 'E';</div><div class='add'>+</div><div class='add'>+        } elsif ($cur =~ /^(\\\n)/o) {</div><div class='add'>+            print "PRECONT($1)\n" if ($dbg_values &gt; 1);</div><div class='add'>+</div><div class='add'>+        } elsif ($cur =~ /^(__attribute__)\s*\(?/o) {</div><div class='add'>+            print "ATTR($1)\n" if ($dbg_values &gt; 1);</div><div class='add'>+            $av_pending = $type;</div><div class='add'>+            $type = 'N';</div><div class='add'>+</div><div class='add'>+        } elsif ($cur =~ /^(sizeof)\s*(\()?/o) {</div><div class='add'>+            print "SIZEOF($1)\n" if ($dbg_values &gt; 1);</div><div class='add'>+            if (defined $2) {</div><div class='add'>+                $av_pending = 'V';</div><div class='add'>+            }</div><div class='add'>+            $type = 'N';</div><div class='add'>+</div><div class='add'>+        } elsif ($cur =~ /^(if|while|for)\b/o) {</div><div class='add'>+            print "COND($1)\n" if ($dbg_values &gt; 1);</div><div class='add'>+            $av_pending = 'E';</div><div class='add'>+            $type = 'N';</div><div class='add'>+</div><div class='add'>+        } elsif ($cur =~/^(case)/o) {</div><div class='add'>+            print "CASE($1)\n" if ($dbg_values &gt; 1);</div><div class='add'>+            $av_pend_colon = 'C';</div><div class='add'>+            $type = 'N';</div><div class='add'>+</div><div class='add'>+        } elsif ($cur =~/^(return|else|goto|typeof|__typeof__)\b/o) {</div><div class='add'>+            print "KEYWORD($1)\n" if ($dbg_values &gt; 1);</div><div class='add'>+            $type = 'N';</div><div class='add'>+</div><div class='add'>+        } elsif ($cur =~ /^(\()/o) {</div><div class='add'>+            print "PAREN('$1')\n" if ($dbg_values &gt; 1);</div><div class='add'>+            push(@av_paren_type, $av_pending);</div><div class='add'>+            $av_pending = '_';</div><div class='add'>+            $type = 'N';</div><div class='add'>+</div><div class='add'>+        } elsif ($cur =~ /^(\))/o) {</div><div class='add'>+            my $new_type = pop(@av_paren_type);</div><div class='add'>+            if ($new_type ne '_') {</div><div class='add'>+                $type = $new_type;</div><div class='add'>+                print "PAREN('$1') -&gt; $type\n"</div><div class='add'>+                    if ($dbg_values &gt; 1);</div><div class='add'>+            } else {</div><div class='add'>+                print "PAREN('$1')\n" if ($dbg_values &gt; 1);</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+        } elsif ($cur =~ /^($Ident)\s*\(/o) {</div><div class='add'>+            print "FUNC($1)\n" if ($dbg_values &gt; 1);</div><div class='add'>+            $type = 'V';</div><div class='add'>+            $av_pending = 'V';</div><div class='add'>+</div><div class='add'>+        } elsif ($cur =~ /^($Ident\s*):(?:\s*\d+\s*(,|=|;))?/) {</div><div class='add'>+            if (defined $2 &amp;&amp; $type eq 'C' || $type eq 'T') {</div><div class='add'>+                $av_pend_colon = 'B';</div><div class='add'>+            } elsif ($type eq 'E') {</div><div class='add'>+                $av_pend_colon = 'L';</div><div class='add'>+            }</div><div class='add'>+            print "IDENT_COLON($1,$type&gt;$av_pend_colon)\n" if ($dbg_values &gt; 1);</div><div class='add'>+            $type = 'V';</div><div class='add'>+</div><div class='add'>+        } elsif ($cur =~ /^($Ident|$Constant)/o) {</div><div class='add'>+            print "IDENT($1)\n" if ($dbg_values &gt; 1);</div><div class='add'>+            $type = 'V';</div><div class='add'>+</div><div class='add'>+        } elsif ($cur =~ /^($Assignment)/o) {</div><div class='add'>+            print "ASSIGN($1)\n" if ($dbg_values &gt; 1);</div><div class='add'>+            $type = 'N';</div><div class='add'>+</div><div class='add'>+        } elsif ($cur =~/^(;|{|})/) {</div><div class='add'>+            print "END($1)\n" if ($dbg_values &gt; 1);</div><div class='add'>+            $type = 'E';</div><div class='add'>+            $av_pend_colon = 'O';</div><div class='add'>+</div><div class='add'>+        } elsif ($cur =~/^(,)/) {</div><div class='add'>+            print "COMMA($1)\n" if ($dbg_values &gt; 1);</div><div class='add'>+            $type = 'C';</div><div class='add'>+</div><div class='add'>+        } elsif ($cur =~ /^(\?)/o) {</div><div class='add'>+            print "QUESTION($1)\n" if ($dbg_values &gt; 1);</div><div class='add'>+            $type = 'N';</div><div class='add'>+</div><div class='add'>+        } elsif ($cur =~ /^(:)/o) {</div><div class='add'>+            print "COLON($1,$av_pend_colon)\n" if ($dbg_values &gt; 1);</div><div class='add'>+</div><div class='add'>+            substr($var, length($res), 1, $av_pend_colon);</div><div class='add'>+            if ($av_pend_colon eq 'C' || $av_pend_colon eq 'L') {</div><div class='add'>+                $type = 'E';</div><div class='add'>+            } else {</div><div class='add'>+                $type = 'N';</div><div class='add'>+            }</div><div class='add'>+            $av_pend_colon = 'O';</div><div class='add'>+</div><div class='add'>+        } elsif ($cur =~ /^(\[)/o) {</div><div class='add'>+            print "CLOSE($1)\n" if ($dbg_values &gt; 1);</div><div class='add'>+            $type = 'N';</div><div class='add'>+</div><div class='add'>+        } elsif ($cur =~ /^(-(?![-&gt;])|\+(?!\+)|\*|\&amp;\&amp;|\&amp;)/o) {</div><div class='add'>+            my $variant;</div><div class='add'>+</div><div class='add'>+            print "OPV($1)\n" if ($dbg_values &gt; 1);</div><div class='add'>+            if ($type eq 'V') {</div><div class='add'>+                $variant = 'B';</div><div class='add'>+            } else {</div><div class='add'>+                $variant = 'U';</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            substr($var, length($res), 1, $variant);</div><div class='add'>+            $type = 'N';</div><div class='add'>+</div><div class='add'>+        } elsif ($cur =~ /^($Operators)/o) {</div><div class='add'>+            print "OP($1)\n" if ($dbg_values &gt; 1);</div><div class='add'>+            if ($1 ne '++' &amp;&amp; $1 ne '--') {</div><div class='add'>+                $type = 'N';</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+        } elsif ($cur =~ /(^.)/o) {</div><div class='add'>+            print "C($1)\n" if ($dbg_values &gt; 1);</div><div class='add'>+        }</div><div class='add'>+        if (defined $1) {</div><div class='add'>+            $cur = substr($cur, length($1));</div><div class='add'>+            $res .= $type x length($1);</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return ($res, $var);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+sub possible {</div><div class='add'>+    my ($possible, $line) = @_;</div><div class='add'>+    my $notPermitted = qr{(?:</div><div class='add'>+                ^(?:</div><div class='add'>+                        $Modifier|</div><div class='add'>+                        $Storage|</div><div class='add'>+                        $Type|</div><div class='add'>+                        DEFINE_\S+</div><div class='add'>+                )$|</div><div class='add'>+                ^(?:</div><div class='add'>+                        goto|</div><div class='add'>+                        return|</div><div class='add'>+                        case|</div><div class='add'>+                        else|</div><div class='add'>+                        asm|__asm__|</div><div class='add'>+                        do|</div><div class='add'>+                        \#|</div><div class='add'>+                        \#\#|</div><div class='add'>+                )(?:\s|$)|</div><div class='add'>+                ^(?:typedef|struct|enum)\b</div><div class='add'>+            )}x;</div><div class='add'>+    warn "CHECK&lt;$possible&gt; ($line)\n" if ($dbg_possible &gt; 2);</div><div class='add'>+    if ($possible !~ $notPermitted) {</div><div class='add'>+        # Check for modifiers.</div><div class='add'>+        $possible =~ s/\s*$Storage\s*//g;</div><div class='add'>+        $possible =~ s/\s*$Sparse\s*//g;</div><div class='add'>+        if ($possible =~ /^\s*$/) {</div><div class='add'>+</div><div class='add'>+        } elsif ($possible =~ /\s/) {</div><div class='add'>+            $possible =~ s/\s*$Type\s*//g;</div><div class='add'>+            for my $modifier (split(' ', $possible)) {</div><div class='add'>+                if ($modifier !~ $notPermitted) {</div><div class='add'>+                    warn "MODIFIER: $modifier ($possible) ($line)\n" if ($dbg_possible);</div><div class='add'>+                    push(@modifierList, $modifier);</div><div class='add'>+                }</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+        } else {</div><div class='add'>+            warn "POSSIBLE: $possible ($line)\n" if ($dbg_possible);</div><div class='add'>+            push(@typeList, $possible);</div><div class='add'>+        }</div><div class='add'>+        build_types();</div><div class='add'>+    } else {</div><div class='add'>+        warn "NOTPOSS: $possible ($line)\n" if ($dbg_possible &gt; 1);</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+my $prefix = '';</div><div class='add'>+</div><div class='add'>+sub show_type {</div><div class='add'>+    my ($type) = @_;</div><div class='add'>+</div><div class='add'>+    return defined $use_type{$type} if (scalar keys %use_type &gt; 0);</div><div class='add'>+</div><div class='add'>+    return !defined $ignore_type{$type};</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+sub report {</div><div class='add'>+    my ($level, $type, $msg) = @_;</div><div class='add'>+</div><div class='add'>+    if (!show_type($type) ||</div><div class='add'>+        (defined $tst_only &amp;&amp; $msg !~ /\Q$tst_only\E/)) {</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='add'>+    my $line;</div><div class='add'>+    if ($show_types) {</div><div class='add'>+        $line = "$prefix$level:$type: $msg\n";</div><div class='add'>+    } else {</div><div class='add'>+        $line = "$prefix$level: $msg\n";</div><div class='add'>+    }</div><div class='add'>+    $line = (split('\n', $line))[0] . "\n" if ($terse);</div><div class='add'>+</div><div class='add'>+    if ($quiet == 0) {</div><div class='add'>+        push(our @report, $line);</div><div class='add'>+    }</div><div class='add'>+    return 1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+sub report_dump {</div><div class='add'>+    our @report;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+sub ERROR {</div><div class='add'>+    my ($type, $msg) = @_;</div><div class='add'>+</div><div class='add'>+    if (report("ERROR", $type, $msg)) {</div><div class='add'>+        our $clean = 0;</div><div class='add'>+        our $cnt_error++;</div><div class='add'>+        return 1;</div><div class='add'>+    }</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+sub WARN {</div><div class='add'>+    my ($type, $msg) = @_;</div><div class='add'>+</div><div class='add'>+    if (report("WARNING", $type, $msg)) {</div><div class='add'>+        ## Warning is okay to submit</div><div class='add'>+        our $clean = 0;</div><div class='add'>+        our $cnt_warn++;</div><div class='add'>+        return 1;</div><div class='add'>+    }</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+sub CHK {</div><div class='add'>+    my ($type, $msg) = @_;</div><div class='add'>+</div><div class='add'>+    if ($check &amp;&amp; report("CHECK", $type, $msg)) {</div><div class='add'>+        our $clean = 0;</div><div class='add'>+        our $cnt_chk++;</div><div class='add'>+        return 1;</div><div class='add'>+    }</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+sub check_absolute_file {</div><div class='add'>+    my ($absolute, $herecurr) = @_;</div><div class='add'>+    my $file = $absolute;</div><div class='add'>+</div><div class='add'>+    ##print "absolute&lt;$absolute&gt;\n";</div><div class='add'>+</div><div class='add'>+    # See if any suffix of this path is a path within the tree.</div><div class='add'>+    while ($file =~ s@^[^/]*/@@) {</div><div class='add'>+        if (-f "$root/$file") {</div><div class='add'>+            ##print "file&lt;$file&gt;\n";</div><div class='add'>+            last;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    if (! -f _)  {</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    # It is, so see if the prefix is acceptable.</div><div class='add'>+    my $prefix = $absolute;</div><div class='add'>+    substr($prefix, -length($file)) = '';</div><div class='add'>+</div><div class='add'>+    ##print "prefix&lt;$prefix&gt;\n";</div><div class='add'>+    if ($prefix ne ".../") {</div><div class='add'>+        WARN("USE_RELATIVE_PATH",</div><div class='add'>+             "use relative pathname instead of absolute in changelog text\n" . $herecurr);</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+sub trim {</div><div class='add'>+    my ($string) = @_;</div><div class='add'>+</div><div class='add'>+    $string =~ s/^\s+|\s+$//g;</div><div class='add'>+</div><div class='add'>+    return $string;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+sub ltrim {</div><div class='add'>+    my ($string) = @_;</div><div class='add'>+</div><div class='add'>+    $string =~ s/^\s+//;</div><div class='add'>+</div><div class='add'>+    return $string;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+sub rtrim {</div><div class='add'>+    my ($string) = @_;</div><div class='add'>+</div><div class='add'>+    $string =~ s/\s+$//;</div><div class='add'>+</div><div class='add'>+    return $string;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+sub string_find_replace {</div><div class='add'>+    my ($string, $find, $replace) = @_;</div><div class='add'>+</div><div class='add'>+    $string =~ s/$find/$replace/g;</div><div class='add'>+</div><div class='add'>+    return $string;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+sub tabify {</div><div class='add'>+    my ($leading) = @_;</div><div class='add'>+</div><div class='add'>+    my $source_indent = 8;</div><div class='add'>+    my $max_spaces_before_tab = $source_indent - 1;</div><div class='add'>+    my $spaces_to_tab = " " x $source_indent;</div><div class='add'>+</div><div class='add'>+    #convert leading spaces to tabs</div><div class='add'>+    1 while $leading =~ s@^([\t]*)$spaces_to_tab@$1\t@g;</div><div class='add'>+    #Remove spaces before a tab</div><div class='add'>+    1 while $leading =~ s@^([\t]*)( {1,$max_spaces_before_tab})\t@$1\t@g;</div><div class='add'>+    return "$leading";</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+sub pos_last_openparen {</div><div class='add'>+    my ($line) = @_;</div><div class='add'>+</div><div class='add'>+    my $pos = 0;</div><div class='add'>+</div><div class='add'>+    my $opens = $line =~ tr/\(/\(/;</div><div class='add'>+    my $closes = $line =~ tr/\)/\)/;</div><div class='add'>+</div><div class='add'>+    my $last_openparen = 0;</div><div class='add'>+</div><div class='add'>+    if (($opens == 0) || ($closes &gt;= $opens)) {</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    my $len = length($line);</div><div class='add'>+</div><div class='add'>+    for ($pos = 0; $pos &lt; $len; $pos++) {</div><div class='add'>+        my $string = substr($line, $pos);</div><div class='add'>+        if ($string =~ /^($FuncArg|$balanced_parens)/) {</div><div class='add'>+            $pos += length($1) - 1;</div><div class='add'>+        } elsif (substr($line, $pos, 1) eq '(') {</div><div class='add'>+            $last_openparen = $pos;</div><div class='add'>+        } elsif (index($string, '(') == -1) {</div><div class='add'>+            last;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return length(expand_tabs(substr($line, 0, $last_openparen))) + 1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+sub process {</div><div class='add'>+    my $filename = shift;</div><div class='add'>+</div><div class='add'>+    my $linenr=0;</div><div class='add'>+    my $prevline="";</div><div class='add'>+    my $prevrawline="";</div><div class='add'>+    my $stashline="";</div><div class='add'>+    my $stashrawline="";</div><div class='add'>+</div><div class='add'>+    my $length;</div><div class='add'>+    my $indent;</div><div class='add'>+    my $previndent=0;</div><div class='add'>+    my $stashindent=0;</div><div class='add'>+</div><div class='add'>+    our $clean = 1;</div><div class='add'>+    my $signoff = 0;</div><div class='add'>+    my $subject_trailing_dot = 0;</div><div class='add'>+    my $is_patch = 0;</div><div class='add'>+</div><div class='add'>+    my $in_header_lines = 1;</div><div class='add'>+    my $in_commit_log = 0; #Scanning lines before patch</div><div class='add'>+</div><div class='add'>+    my $non_utf8_charset = 0;</div><div class='add'>+</div><div class='add'>+    our @report = ();</div><div class='add'>+    our $cnt_lines = 0;</div><div class='add'>+    our $cnt_error = 0;</div><div class='add'>+    our $cnt_warn = 0;</div><div class='add'>+    our $cnt_chk = 0;</div><div class='add'>+</div><div class='add'>+    # Trace the real file/line as we go.</div><div class='add'>+    my $realfile = '';</div><div class='add'>+    my $realline = 0;</div><div class='add'>+    my $realcnt = 0;</div><div class='add'>+    my $here = '';</div><div class='add'>+    my $in_comment = 0;</div><div class='add'>+    my $comment_edge = 0;</div><div class='add'>+    my $first_line = 0;</div><div class='add'>+    my $p1_prefix = '';</div><div class='add'>+</div><div class='add'>+    my $prev_values = 'E';</div><div class='add'>+</div><div class='add'>+    # suppression flags</div><div class='add'>+    my %suppress_ifbraces;</div><div class='add'>+    my %suppress_whiletrailers;</div><div class='add'>+    my %suppress_export;</div><div class='add'>+    my $suppress_statement = 0;</div><div class='add'>+</div><div class='add'>+    my %signatures = ();</div><div class='add'>+</div><div class='add'>+    # Pre-scan the patch sanitizing the lines.</div><div class='add'>+    # Pre-scan the patch looking for any __setup documentation.</div><div class='add'>+    #</div><div class='add'>+    my @setup_docs = ();</div><div class='add'>+    my $setup_docs = 0;</div><div class='add'>+</div><div class='add'>+    my $camelcase_file_seeded = 0;</div><div class='add'>+</div><div class='add'>+    sanitise_line_reset();</div><div class='add'>+    my $line;</div><div class='add'>+    foreach my $rawline (@rawlines) {</div><div class='add'>+        $linenr++;</div><div class='add'>+        $line = $rawline;</div><div class='add'>+</div><div class='add'>+        push(@fixed, $rawline) if ($fix);</div><div class='add'>+</div><div class='add'>+        if ($rawline=~/^\+\+\+\s+(\S+)/) {</div><div class='add'>+            $setup_docs = 0;</div><div class='add'>+            if ($1 =~ m@Documentation/kernel-parameters.txt$@) {</div><div class='add'>+                $setup_docs = 1;</div><div class='add'>+            }</div><div class='add'>+            #next;</div><div class='add'>+        }</div><div class='add'>+        if ($rawline=~/^\@\@ -\d+(?:,\d+)? \+(\d+)(,(\d+))? \@\@/) {</div><div class='add'>+            $realline=$1-1;</div><div class='add'>+            if (defined $2) {</div><div class='add'>+                $realcnt=$3+1;</div><div class='add'>+            } else {</div><div class='add'>+                $realcnt=1+1;</div><div class='add'>+            }</div><div class='add'>+            $in_comment = 0;</div><div class='add'>+</div><div class='add'>+            # Guestimate if this is a continuing comment.  Run</div><div class='add'>+            # the context looking for a comment "edge".  If this</div><div class='add'>+            # edge is a close comment then we must be in a comment</div><div class='add'>+            # at context start.</div><div class='add'>+            my $edge;</div><div class='add'>+            my $cnt = $realcnt;</div><div class='add'>+            for (my $ln = $linenr + 1; $cnt &gt; 0; $ln++) {</div><div class='add'>+                next if (defined $rawlines[$ln - 1] &amp;&amp;</div><div class='add'>+                         $rawlines[$ln - 1] =~ /^-/);</div><div class='add'>+                $cnt--;</div><div class='add'>+                #print "RAW&lt;$rawlines[$ln - 1]&gt;\n";</div><div class='add'>+                last if (!defined $rawlines[$ln - 1]);</div><div class='add'>+                if ($rawlines[$ln - 1] =~ m@(/\*|\*/)@ &amp;&amp;</div><div class='add'>+                    $rawlines[$ln - 1] !~ m@"[^"]*(?:/\*|\*/)[^"]*"@) {</div><div class='add'>+                    ($edge) = $1;</div><div class='add'>+                    last;</div><div class='add'>+                }</div><div class='add'>+            }</div><div class='add'>+            if (defined $edge &amp;&amp; $edge eq '*/') {</div><div class='add'>+                $in_comment = 1;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            # Guestimate if this is a continuing comment.  If this</div><div class='add'>+            # is the start of a diff block and this line starts</div><div class='add'>+            # ' *' then it is very likely a comment.</div><div class='add'>+            if (!defined $edge &amp;&amp;</div><div class='add'>+                $rawlines[$linenr] =~ m@^.\s*(?:\*\*+| \*)(?:\s|$)@)</div><div class='add'>+            {</div><div class='add'>+                $in_comment = 1;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            ##print "COMMENT:$in_comment edge&lt;$edge&gt; $rawline\n";</div><div class='add'>+            sanitise_line_reset($in_comment);</div><div class='add'>+</div><div class='add'>+        } elsif ($realcnt &amp;&amp; $rawline =~ /^(?:\+| |$)/) {</div><div class='add'>+            # Standardise the strings and chars within the input to</div><div class='add'>+            # simplify matching -- only bother with positive lines.</div><div class='add'>+            $line = sanitise_line($rawline);</div><div class='add'>+        }</div><div class='add'>+        push(@lines, $line);</div><div class='add'>+</div><div class='add'>+        if ($realcnt &gt; 1) {</div><div class='add'>+            $realcnt-- if ($line =~ /^(?:\+| |$)/);</div><div class='add'>+        } else {</div><div class='add'>+            $realcnt = 0;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        #print "==&gt;$rawline\n";</div><div class='add'>+        #print "--&gt;$line\n";</div><div class='add'>+</div><div class='add'>+        if ($setup_docs &amp;&amp; $line =~ /^\+/) {</div><div class='add'>+            push(@setup_docs, $line);</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    $prefix = '';</div><div class='add'>+</div><div class='add'>+    $realcnt = 0;</div><div class='add'>+    $linenr = 0;</div><div class='add'>+    foreach my $line (@lines) {</div><div class='add'>+        $linenr++;</div><div class='add'>+        my $sline = $line;      #copy of $line</div><div class='add'>+        $sline =~ s/$;/ /g;     #with comments as spaces</div><div class='add'>+</div><div class='add'>+        my $rawline = $rawlines[$linenr - 1];</div><div class='add'>+</div><div class='add'>+#extract the line range in the file after the patch is applied</div><div class='add'>+        if ($line=~/^\@\@ -\d+(?:,\d+)? \+(\d+)(,(\d+))? \@\@/) {</div><div class='add'>+            $is_patch = 1;</div><div class='add'>+            $first_line = $linenr + 1;</div><div class='add'>+            $realline=$1-1;</div><div class='add'>+            if (defined $2) {</div><div class='add'>+                $realcnt=$3+1;</div><div class='add'>+            } else {</div><div class='add'>+                $realcnt=1+1;</div><div class='add'>+            }</div><div class='add'>+            annotate_reset();</div><div class='add'>+            $prev_values = 'E';</div><div class='add'>+</div><div class='add'>+            %suppress_ifbraces = ();</div><div class='add'>+            %suppress_whiletrailers = ();</div><div class='add'>+            %suppress_export = ();</div><div class='add'>+            $suppress_statement = 0;</div><div class='add'>+            next;</div><div class='add'>+</div><div class='add'>+# track the line number as we move through the hunk, note that</div><div class='add'>+# new versions of GNU diff omit the leading space on completely</div><div class='add'>+# blank context lines so we need to count that too.</div><div class='add'>+        } elsif ($line =~ /^( |\+|$)/) {</div><div class='add'>+            $realline++;</div><div class='add'>+            $realcnt-- if ($realcnt != 0);</div><div class='add'>+</div><div class='add'>+            # Measure the line length and indent.</div><div class='add'>+            ($length, $indent) = line_stats($rawline);</div><div class='add'>+</div><div class='add'>+            # Track the previous line.</div><div class='add'>+            ($prevline, $stashline) = ($stashline, $line);</div><div class='add'>+            ($previndent, $stashindent) = ($stashindent, $indent);</div><div class='add'>+            ($prevrawline, $stashrawline) = ($stashrawline, $rawline);</div><div class='add'>+</div><div class='add'>+            #warn "line&lt;$line&gt;\n";</div><div class='add'>+</div><div class='add'>+        } elsif ($realcnt == 1) {</div><div class='add'>+            $realcnt--;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        my $hunk_line = ($realcnt != 0);</div><div class='add'>+</div><div class='add'>+#make up the handle for any error we report on this line</div><div class='add'>+        $prefix = "$filename:$realline: " if ($emacs &amp;&amp; $file);</div><div class='add'>+        $prefix = "$filename:$linenr: " if ($emacs &amp;&amp; !$file);</div><div class='add'>+</div><div class='add'>+        $here = "#$linenr: " if (!$file);</div><div class='add'>+        $here = "#$realline: " if ($file);</div><div class='add'>+</div><div class='add'>+        my $found_file = 0;</div><div class='add'>+        # extract the filename as it passes</div><div class='add'>+        if ($line =~ /^diff --git.*?(\S+)$/) {</div><div class='add'>+            $realfile = $1;</div><div class='add'>+            $realfile =~ s@^([^/]*)/@@ if (!$file);</div><div class='add'>+            $in_commit_log = 0;</div><div class='add'>+            $found_file = 1;</div><div class='add'>+        } elsif ($line =~ /^\+\+\+\s+(\S+)/) {</div><div class='add'>+            $realfile = $1;</div><div class='add'>+            $realfile =~ s@^([^/]*)/@@ if (!$file);</div><div class='add'>+            $in_commit_log = 0;</div><div class='add'>+</div><div class='add'>+            $p1_prefix = $1;</div><div class='add'>+            if (!$file &amp;&amp; $tree &amp;&amp; $p1_prefix ne '' &amp;&amp;</div><div class='add'>+                -e "$root/$p1_prefix") {</div><div class='add'>+                WARN("PATCH_PREFIX",</div><div class='add'>+                     "patch prefix '$p1_prefix' exists, appears to be a -p0 patch\n");</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            $found_file = 1;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        if ($found_file) {</div><div class='add'>+            if ($realfile =~ m@^(drivers/net/|net/)@) {</div><div class='add'>+                $check = 1;</div><div class='add'>+            } else {</div><div class='add'>+                $check = $check_orig;</div><div class='add'>+            }</div><div class='add'>+            next;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        $here .= "FILE: $realfile:$realline:" if ($realcnt != 0);</div><div class='add'>+</div><div class='add'>+        my $hereline = "$here\n$rawline\n";</div><div class='add'>+        my $herecurr = "$here\n$rawline\n";</div><div class='add'>+        my $hereprev = "$here\n$prevrawline\n$rawline\n";</div><div class='add'>+</div><div class='add'>+        $cnt_lines++ if ($realcnt != 0);</div><div class='add'>+</div><div class='add'>+# Check for incorrect file permissions</div><div class='add'>+        if ($line =~ /^new (file )?mode.*[7531]\d{0,2}$/) {</div><div class='add'>+            my $permhere = $here . "FILE: $realfile\n";</div><div class='add'>+            if ($realfile !~ m@scripts/@ &amp;&amp;</div><div class='add'>+                $realfile !~ /\.(py|pl|awk|sh|t)$/) {</div><div class='add'>+                ERROR("EXECUTE_PERMISSIONS",</div><div class='add'>+                      "do not set execute permissions for source files\n" . $permhere);</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        next if ($realfile =~ /(checkpatch.pl)/);</div><div class='add'>+        next if ($realfile =~ /\.(md|txt|doc|8|pdf|tex)$/);</div><div class='add'>+</div><div class='add'>+# Check that the subject does not have a trailing dot</div><div class='add'>+        if ($in_header_lines &amp;&amp;</div><div class='add'>+            $line =~ /^Subject: \[PATCH\] (.+)\.(\s*)$/) {</div><div class='add'>+                $subject_trailing_dot++;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+# Check the patch for a signoff:</div><div class='add'>+        if ($line =~ /^\s*signed-off-by:/i) {</div><div class='add'>+            $signoff++;</div><div class='add'>+            $in_commit_log = 0;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+# Check signature styles</div><div class='add'>+        if (!$in_header_lines &amp;&amp;</div><div class='add'>+            $line =~ /^(\s*)([a-z0-9_-]+by:|$signature_tags)(\s*)(.*)/i) {</div><div class='add'>+            my $space_before = $1;</div><div class='add'>+            my $sign_off = $2;</div><div class='add'>+            my $space_after = $3;</div><div class='add'>+            my $email = $4;</div><div class='add'>+            my $ucfirst_sign_off = ucfirst(lc($sign_off));</div><div class='add'>+</div><div class='add'>+            if ($sign_off !~ /$signature_tags/) {</div><div class='add'>+                WARN("BAD_SIGN_OFF",</div><div class='add'>+                     "Non-standard signature: $sign_off\n" . $herecurr);</div><div class='add'>+            }</div><div class='add'>+            if (defined $space_before &amp;&amp; $space_before ne "") {</div><div class='add'>+                if (WARN("BAD_SIGN_OFF",</div><div class='add'>+                         "Do not use whitespace before $ucfirst_sign_off\n" . $herecurr) &amp;&amp;</div><div class='add'>+                    $fix) {</div><div class='add'>+                    $fixed[$linenr - 1] =</div><div class='add'>+                        "$ucfirst_sign_off $email";</div><div class='add'>+                }</div><div class='add'>+            }</div><div class='add'>+            if ($sign_off =~ /-by:$/i &amp;&amp; $sign_off ne $ucfirst_sign_off) {</div><div class='add'>+                if (WARN("BAD_SIGN_OFF",</div><div class='add'>+                         "'$ucfirst_sign_off' is the preferred signature form\n" . $herecurr) &amp;&amp;</div><div class='add'>+                    $fix) {</div><div class='add'>+                    $fixed[$linenr - 1] =</div><div class='add'>+                        "$ucfirst_sign_off $email";</div><div class='add'>+                }</div><div class='add'>+</div><div class='add'>+            }</div><div class='add'>+            if (!defined $space_after || $space_after ne " ") {</div><div class='add'>+                if (WARN("BAD_SIGN_OFF",</div><div class='add'>+                         "Use a single space after $ucfirst_sign_off\n" . $herecurr) &amp;&amp;</div><div class='add'>+                    $fix) {</div><div class='add'>+                    $fixed[$linenr - 1] =</div><div class='add'>+                        "$ucfirst_sign_off $email";</div><div class='add'>+                }</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            # Check if email is really Gerrit URL</div><div class='add'>+            if ($email =~ /^($url_tags)(.*)/) {</div><div class='add'>+                my $uri = $1;</div><div class='add'>+                my $url = $2;</div><div class='add'>+                if ($uri &amp;&amp; $url !~ /$gerrit_url/) {</div><div class='add'>+                    ERROR("BAD_URL",</div><div class='add'>+                          "Unrecognized url address: '$email'\n" . $herecurr);</div><div class='add'>+                }</div><div class='add'>+            } else {</div><div class='add'>+                my ($email_name, $email_address, $comment) = parse_email($email);</div><div class='add'>+                my $suggested_email = format_email(($email_name, $email_address));</div><div class='add'>+                if ($suggested_email eq "") {</div><div class='add'>+                    ERROR("BAD_SIGN_OFF",</div><div class='add'>+                          "Unrecognized email address: '$email'\n" . $herecurr);</div><div class='add'>+                } else {</div><div class='add'>+                    my $dequoted = $suggested_email;</div><div class='add'>+                    $dequoted =~ s/^"//;</div><div class='add'>+                    $dequoted =~ s/" &lt;/ &lt;/;</div><div class='add'>+                    # Don't force email to have quotes</div><div class='add'>+                    # Allow just an angle bracketed address</div><div class='add'>+                    if ("$dequoted$comment" ne $email &amp;&amp;</div><div class='add'>+                        "&lt;$email_address&gt;$comment" ne $email &amp;&amp;</div><div class='add'>+                        "$suggested_email$comment" ne $email) {</div><div class='add'>+                        WARN("BAD_SIGN_OFF",</div><div class='add'>+                             "email address '$email' might be better as '$suggested_email$comment'\n" . $herecurr);</div><div class='add'>+                    }</div><div class='add'>+                }</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+# Check for duplicate signatures</div><div class='add'>+            my $sig_nospace = $line;</div><div class='add'>+            $sig_nospace =~ s/\s//g;</div><div class='add'>+            $sig_nospace = lc($sig_nospace);</div><div class='add'>+            if (defined $signatures{$sig_nospace}) {</div><div class='add'>+                WARN("BAD_SIGN_OFF",</div><div class='add'>+                     "Duplicate signature\n" . $herecurr);</div><div class='add'>+            } else {</div><div class='add'>+                $signatures{$sig_nospace} = 1;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+# Check for wrappage within a valid hunk of the file</div><div class='add'>+        if ($realcnt != 0 &amp;&amp; $line !~ m{^(?:\+|-| |\\ No newline|$)}) {</div><div class='add'>+            ERROR("CORRUPTED_PATCH",</div><div class='add'>+                  "patch seems to be corrupt (line wrapped?)\n" .</div><div class='add'>+                  $herecurr) if (!$emitted_corrupt++);</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+# Check for absolute kernel paths.</div><div class='add'>+        if ($tree) {</div><div class='add'>+            while ($line =~ m{(?:^|\s)(/\S*)}g) {</div><div class='add'>+                my $file = $1;</div><div class='add'>+</div><div class='add'>+                if ($file =~ m{^(.*?)(?::\d+)+:?$} &amp;&amp;</div><div class='add'>+                    check_absolute_file($1, $herecurr)) {</div><div class='add'>+                    #</div><div class='add'>+                } else {</div><div class='add'>+                    check_absolute_file($file, $herecurr);</div><div class='add'>+                }</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+# UTF-8 regex found at http://www.w3.org/International/questions/qa-forms-utf-8.en.php</div><div class='add'>+        if (($realfile =~ /^$/ || $line =~ /^\+/) &amp;&amp;</div><div class='add'>+            $rawline !~ m/^$UTF8*$/) {</div><div class='add'>+            my ($utf8_prefix) = ($rawline =~ /^($UTF8*)/);</div><div class='add'>+</div><div class='add'>+            my $blank = copy_spacing($rawline);</div><div class='add'>+            my $ptr = substr($blank, 0, length($utf8_prefix)) . "^";</div><div class='add'>+            my $hereptr = "$hereline$ptr\n";</div><div class='add'>+</div><div class='add'>+            CHK("INVALID_UTF8",</div><div class='add'>+                "Invalid UTF-8, patch and commit message should be encoded in UTF-8\n" . $hereptr);</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+# Check if it's the start of a commit log</div><div class='add'>+# (not a header line and we haven't seen the patch filename)</div><div class='add'>+        if ($in_header_lines &amp;&amp; $realfile =~ /^$/ &amp;&amp;</div><div class='add'>+            $rawline !~ /^(commit\b|from\b|[\w-]+:).+$/i) {</div><div class='add'>+            $in_header_lines = 0;</div><div class='add'>+            $in_commit_log = 1;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+# Check if there is UTF-8 in a commit log when a mail header has explicitly</div><div class='add'>+# declined it, i.e defined some charset where it is missing.</div><div class='add'>+        if ($in_header_lines &amp;&amp;</div><div class='add'>+            $rawline =~ /^Content-Type:.+charset="(.+)".*$/ &amp;&amp;</div><div class='add'>+            $1 !~ /utf-8/i) {</div><div class='add'>+            $non_utf8_charset = 1;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        if ($in_commit_log &amp;&amp; $non_utf8_charset &amp;&amp; $realfile =~ /^$/ &amp;&amp;</div><div class='add'>+            $rawline =~ /$NON_ASCII_UTF8/) {</div><div class='add'>+            WARN("UTF8_BEFORE_PATCH",</div><div class='add'>+                 "8-bit UTF-8 used in possible commit log\n" . $herecurr);</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+# ignore non-hunk lines and lines being removed</div><div class='add'>+        next if (!$hunk_line || $line =~ /^-/);</div><div class='add'>+</div><div class='add'>+#trailing whitespace</div><div class='add'>+        if ($line =~ /^\+.*\015/) {</div><div class='add'>+            my $herevet = "$here\n" . cat_vet($rawline) . "\n";</div><div class='add'>+            if (ERROR("DOS_LINE_ENDINGS",</div><div class='add'>+                      "DOS line endings\n" . $herevet) &amp;&amp;</div><div class='add'>+                $fix) {</div><div class='add'>+                $fixed[$linenr - 1] =~ s/[\s\015]+$//;</div><div class='add'>+            }</div><div class='add'>+        } elsif ($rawline =~ /^\+.*\S\s+$/ || $rawline =~ /^\+\s+$/) {</div><div class='add'>+            my $herevet = "$here\n" . cat_vet($rawline) . "\n";</div><div class='add'>+            if (ERROR("TRAILING_WHITESPACE",</div><div class='add'>+                      "trailing whitespace\n" . $herevet) &amp;&amp;</div><div class='add'>+                $fix) {</div><div class='add'>+                $fixed[$linenr - 1] =~ s/\s+$//;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            $rpt_cleaners = 1;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        if (($realfile =~ /Makefile.*/) &amp;&amp;</div><div class='add'>+            ($line =~ /\+(EXTRA_[A-Z]+FLAGS).*/)) {</div><div class='add'>+            my $flag = $1;</div><div class='add'>+            my $replacement = {</div><div class='add'>+                            'EXTRA_AFLAGS' =&gt;   'asflags-y',</div><div class='add'>+                            'EXTRA_CFLAGS' =&gt;   'ccflags-y',</div><div class='add'>+                            'EXTRA_CPPFLAGS' =&gt; 'cppflags-y',</div><div class='add'>+                            'EXTRA_LDFLAGS' =&gt;  'ldflags-y',</div><div class='add'>+            };</div><div class='add'>+</div><div class='add'>+            WARN("DEPRECATED_VARIABLE",</div><div class='add'>+                 "Use of $flag is deprecated, please use \`$replacement-&gt;{$flag} instead.\n" . $herecurr) if ($replacement-&gt;{$flag});</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+# check we are in .spec file, then ignore this hunk</div><div class='add'>+        next if ($realfile eq "glusterfs.spec.in");</div><div class='add'>+</div><div class='add'>+# check we are in a valid source file if not then ignore this hunk</div><div class='add'>+        next if ($realfile !~ /\.(h|c|pl|py|l|y|sh|in)$/);</div><div class='add'>+</div><div class='add'>+#line length limit</div><div class='add'>+        if ($line =~ /^\+/ &amp;&amp; $prevrawline !~ /\/\*\*/ &amp;&amp;</div><div class='add'>+            $rawline !~ /^.\s*\*\s*\@$Ident\s/ &amp;&amp;</div><div class='add'>+            !($line =~ /^\+\s*$logFunctions\s*\(\s*(?:(KERN_\S+\s*|[^"]*))?"[X\t]*"\s*(?:|,|\)\s*;)\s*$/ ||</div><div class='add'>+              $line =~ /^\+\s*"[^"]*"\s*(?:\s*|,|\)\s*;)\s*$/) &amp;&amp;</div><div class='add'>+            $length &gt; $max_line_length)</div><div class='add'>+        {</div><div class='add'>+            WARN("LONG_LINE",</div><div class='add'>+                 "line over $max_line_length characters\n" . $herecurr);</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+# check for spaces before a quoted newline</div><div class='add'>+        if ($rawline =~ /^.*\".*\s\\n/) {</div><div class='add'>+            if (WARN("QUOTED_WHITESPACE_BEFORE_NEWLINE",</div><div class='add'>+                     "unnecessary whitespace before a quoted newline\n" . $herecurr) &amp;&amp;</div><div class='add'>+                $fix) {</div><div class='add'>+                $fixed[$linenr - 1] =~ s/^(\+.*\".*)\s+\\n/$1\\n/;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+# check for adding lines without a newline.</div><div class='add'>+        if ($line =~ /^\+/ &amp;&amp; defined $lines[$linenr] &amp;&amp; $lines[$linenr] =~ /^\\ No newline at end of file/) {</div><div class='add'>+            WARN("MISSING_EOF_NEWLINE",</div><div class='add'>+                 "adding a line without newline at end of file\n" . $herecurr);</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+# check we are in a valid source file C or perl if not then ignore this hunk</div><div class='add'>+        next if ($realfile !~ /\.(h|c|pl)$/);</div><div class='add'>+</div><div class='add'>+# check for space before tabs.</div><div class='add'>+        if ($rawline =~ /^\+/ &amp;&amp; $rawline =~ / \t/) {</div><div class='add'>+            my $herevet = "$here\n" . cat_vet($rawline) . "\n";</div><div class='add'>+            if (WARN("SPACE_BEFORE_TAB",</div><div class='add'>+                     "please, no space before tabs\n" . $herevet) &amp;&amp;</div><div class='add'>+                $fix) {</div><div class='add'>+                while ($fixed[$linenr - 1] =~</div><div class='add'>+                       s/(^\+.*) {8,8}\t/$1\t\t/) {}</div><div class='add'>+                while ($fixed[$linenr - 1] =~</div><div class='add'>+                       s/(^\+.*) +\t/$1\t/) {}</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+# check for &amp;&amp; or || at the start of a line</div><div class='add'>+        if ($rawline =~ /^\+\s*(&amp;&amp;|\|\|)/) {</div><div class='add'>+            CHK("LOGICAL_CONTINUATIONS",</div><div class='add'>+                "Logical continuations should be on the previous line\n" . $hereprev);</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+# check multi-line statement indentation matches previous line</div><div class='add'>+        if ($^V &amp;&amp; $^V ge 5.10.0 &amp;&amp;</div><div class='add'>+            $prevline =~ /^\+([ \t]*)((?:$c90_Keywords(?:\s+if)\s*)|(?:$Declare\s*)?(?:$Ident|\(\s*\*\s*$Ident\s*\))\s*|$Ident\s*=\s*$Ident\s*)\(.*(\&amp;\&amp;|\|\||,)\s*$/) {</div><div class='add'>+            $prevline =~ /^\+(\t*)(.*)$/;</div><div class='add'>+            my $oldindent = $1;</div><div class='add'>+            my $rest = $2;</div><div class='add'>+</div><div class='add'>+            my $pos = pos_last_openparen($rest);</div><div class='add'>+            if ($pos &gt;= 0) {</div><div class='add'>+                $line =~ /^(\+| )([ \t]*)/;</div><div class='add'>+                my $newindent = $2;</div><div class='add'>+</div><div class='add'>+                my $goodtabindent = $oldindent .</div><div class='add'>+                    "\t" x ($pos / 8) .</div><div class='add'>+                    " "  x ($pos % 8);</div><div class='add'>+                my $goodspaceindent = $oldindent . " "  x $pos;</div><div class='add'>+</div><div class='add'>+                if ($newindent ne $goodtabindent &amp;&amp;</div><div class='add'>+                    $newindent ne $goodspaceindent) {</div><div class='add'>+</div><div class='add'>+                    if (CHK("PARENTHESIS_ALIGNMENT",</div><div class='add'>+                            "Alignment should match open parenthesis\n" . $hereprev) &amp;&amp;</div><div class='add'>+                        $fix &amp;&amp; $line =~ /^\+/) {</div><div class='add'>+                        $fixed[$linenr - 1] =~</div><div class='add'>+                            s/^\+[ \t]*/\+$goodtabindent/;</div><div class='add'>+                    }</div><div class='add'>+                }</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        if ($line =~ /^\+.*\*[ \t]*\)[ \t]+(?!$Assignment|$Arithmetic)/) {</div><div class='add'>+            if (CHK("SPACING",</div><div class='add'>+                    "No space is necessary after a cast\n" . $hereprev) &amp;&amp;</div><div class='add'>+                $fix) {</div><div class='add'>+                $fixed[$linenr - 1] =~</div><div class='add'>+                    s/^(\+.*\*[ \t]*\))[ \t]+/$1/;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+# check for missing blank lines after declarations</div><div class='add'>+        if ($sline =~ /^\+\s+\S/ &amp;&amp;  #Not at char 1</div><div class='add'>+            # actual declarations</div><div class='add'>+            ($prevline =~ /^\+\s+$Declare\s*$Ident\s*[=,;:\[]/ ||</div><div class='add'>+             # foo bar; where foo is some local typedef or #define</div><div class='add'>+             $prevline =~ /^\+\s+$Ident(?:\s+|\s*\*\s*)$Ident\s*[=,;\[]/ ||</div><div class='add'>+             # known declaration macros</div><div class='add'>+             $prevline =~ /^\+\s+$declaration_macros/) &amp;&amp;</div><div class='add'>+            # for "else if" which can look like "$Ident $Ident"</div><div class='add'>+            !($prevline =~ /^\+\s+$c90_Keywords\b/ ||</div><div class='add'>+              # other possible extensions of declaration lines</div><div class='add'>+              $prevline =~ /(?:$Compare|$Assignment|$Operators)\s*$/ ||</div><div class='add'>+              # not starting a section or a macro "\" extended line</div><div class='add'>+              $prevline =~ /(?:\{\s*|\\)$/) &amp;&amp;</div><div class='add'>+            # looks like a declaration</div><div class='add'>+            !($sline =~ /^\+\s+$Declare\s*$Ident\s*[=,;:\[]/ ||</div><div class='add'>+              # foo bar; where foo is some local typedef or #define</div><div class='add'>+              $sline =~ /^\+\s+$Ident(?:\s+|\s*\*\s*)$Ident\s*[=,;\[]/ ||</div><div class='add'>+              # known declaration macros</div><div class='add'>+              $sline =~ /^\+\s+$declaration_macros/ ||</div><div class='add'>+              # start of struct or union or enum</div><div class='add'>+              $sline =~ /^\+\s+(?:union|struct|enum|typedef)\b/ ||</div><div class='add'>+              # start or end of block or continuation of declaration</div><div class='add'>+              $sline =~ /^\+\s+(?:$|[\{\}\.\#\"\?\:\(\[])/ ||</div><div class='add'>+              # bitfield continuation</div><div class='add'>+              $sline =~ /^\+\s+$Ident\s*:\s*\d+\s*[,;]/ ||</div><div class='add'>+              # other possible extensions of declaration lines</div><div class='add'>+              $sline =~ /^\+\s+\(?\s*(?:$Compare|$Assignment|$Operators)/) &amp;&amp;</div><div class='add'>+            # indentation of previous and current line are the same</div><div class='add'>+            (($prevline =~ /\+(\s+)\S/) &amp;&amp; $sline =~ /^\+$1\S/)) {</div><div class='add'>+            WARN("SPACING",</div><div class='add'>+                 "Missing a blank line after declarations\n" . $hereprev);</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+# check we are in a valid C source file if not then ignore this hunk</div><div class='add'>+        next if ($realfile !~ /\.(h|c)$/);</div><div class='add'>+</div><div class='add'>+# check for RCS/CVS revision markers</div><div class='add'>+        if ($rawline =~ /^\+.*\$(Revision|Log|Id)(?:\$|)/) {</div><div class='add'>+            WARN("CVS_KEYWORD",</div><div class='add'>+                 "CVS style keyword markers, these will _not_ be updated\n". $herecurr);</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+# Check for potential 'bare' types</div><div class='add'>+        my ($stat, $cond, $line_nr_next, $remain_next, $off_next,</div><div class='add'>+            $realline_next);</div><div class='add'>+#print "LINE&lt;$line&gt;\n";</div><div class='add'>+        if ($linenr &gt;= $suppress_statement &amp;&amp;</div><div class='add'>+            $realcnt &amp;&amp; $sline =~ /.\s*\S/) {</div><div class='add'>+            ($stat, $cond, $line_nr_next, $remain_next, $off_next) =</div><div class='add'>+                ctx_statement_block($linenr, $realcnt, 0);</div><div class='add'>+            $stat =~ s/\n./\n /g;</div><div class='add'>+            $cond =~ s/\n./\n /g;</div><div class='add'>+</div><div class='add'>+#print "linenr&lt;$linenr&gt; &lt;$stat&gt;\n";</div><div class='add'>+            # If this statement has no statement boundaries within</div><div class='add'>+            # it there is no point in retrying a statement scan</div><div class='add'>+            # until we hit end of it.</div><div class='add'>+            my $frag = $stat; $frag =~ s/;+\s*$//;</div><div class='add'>+            if ($frag !~ /(?:{|;)/) {</div><div class='add'>+#print "skip&lt;$line_nr_next&gt;\n";</div><div class='add'>+                $suppress_statement = $line_nr_next;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            # Find the real next line.</div><div class='add'>+            $realline_next = $line_nr_next;</div><div class='add'>+            if (defined $realline_next &amp;&amp;</div><div class='add'>+                (!defined $lines[$realline_next - 1] ||</div><div class='add'>+                 substr($lines[$realline_next - 1], $off_next) =~ /^\s*$/)) {</div><div class='add'>+                $realline_next++;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            my $s = $stat;</div><div class='add'>+            $s =~ s/{.*$//s;</div><div class='add'>+</div><div class='add'>+            # Ignore goto labels.</div><div class='add'>+            if ($s =~ /$Ident:\*$/s) {</div><div class='add'>+</div><div class='add'>+                # Ignore functions being called</div><div class='add'>+            } elsif ($s =~ /^.\s*$Ident\s*\(/s) {</div><div class='add'>+</div><div class='add'>+            } elsif ($s =~ /^.\s*else\b/s) {</div><div class='add'>+</div><div class='add'>+                # declarations always start with types</div><div class='add'>+            } elsif ($prev_values eq 'E' &amp;&amp; $s =~ /^.\s*(?:$Storage\s+)?(?:$Inline\s+)?(?:const\s+)?((?:\s*$Ident)+?)\b(?:\s+$Sparse)?\s*\**\s*(?:$Ident|\(\*[^\)]*\))(?:\s*$Modifier)?\s*(?:;|=|,|\()/s) {</div><div class='add'>+                my $type = $1;</div><div class='add'>+                $type =~ s/\s+/ /g;</div><div class='add'>+                possible($type, "A:" . $s);</div><div class='add'>+</div><div class='add'>+                # definitions in global scope can only start with types</div><div class='add'>+            } elsif ($s =~ /^.(?:$Storage\s+)?(?:$Inline\s+)?(?:const\s+)?($Ident)\b\s*(?!:)/s) {</div><div class='add'>+                possible($1, "B:" . $s);</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            # any (foo ... *) is a pointer cast, and foo is a type</div><div class='add'>+            while ($s =~ /\(($Ident)(?:\s+$Sparse)*[\s\*]+\s*\)/sg) {</div><div class='add'>+                possible($1, "C:" . $s);</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            # Check for any sort of function declaration.</div><div class='add'>+            # int foo(something bar, other baz);</div><div class='add'>+            # void (*store_gdt)(x86_descr_ptr *);</div><div class='add'>+            if ($prev_values eq 'E' &amp;&amp; $s =~ /^(.(?:typedef\s*)?(?:(?:$Storage|$Inline)\s*)*\s*$Type\s*(?:\b$Ident|\(\*\s*$Ident\))\s*)\(/s) {</div><div class='add'>+                my ($name_len) = length($1);</div><div class='add'>+</div><div class='add'>+                my $ctx = $s;</div><div class='add'>+                substr($ctx, 0, $name_len + 1, '');</div><div class='add'>+                $ctx =~ s/\)[^\)]*$//;</div><div class='add'>+</div><div class='add'>+                for my $arg (split(/\s*,\s*/, $ctx)) {</div><div class='add'>+                    if ($arg =~ /^(?:const\s+)?($Ident)(?:\s+$Sparse)*\s*\**\s*(:?\b$Ident)?$/s || $arg =~ /^($Ident)$/s) {</div><div class='add'>+</div><div class='add'>+                        possible($1, "D:" . $s);</div><div class='add'>+                    }</div><div class='add'>+                }</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+#</div><div class='add'>+# Checks which may be anchored in the context.</div><div class='add'>+#</div><div class='add'>+</div><div class='add'>+# Check for switch () and associated case and default</div><div class='add'>+# statements should be at the same indent.</div><div class='add'>+        if ($line=~/\bswitch\s*\(.*\)/) {</div><div class='add'>+            my $err = '';</div><div class='add'>+            my $sep = '';</div><div class='add'>+            my @ctx = ctx_block_outer($linenr, $realcnt);</div><div class='add'>+            shift(@ctx);</div><div class='add'>+            for my $ctx (@ctx) {</div><div class='add'>+                my ($clen, $cindent) = line_stats($ctx);</div><div class='add'>+                if ($ctx =~ /^\+\s*(case\s+|default:)/ &amp;&amp;</div><div class='add'>+                    $indent != $cindent) {</div><div class='add'>+                    $err .= "$sep$ctx\n";</div><div class='add'>+                    $sep = '';</div><div class='add'>+                } else {</div><div class='add'>+                    $sep = "[...]\n";</div><div class='add'>+                }</div><div class='add'>+            }</div><div class='add'>+            if ($err ne '') {</div><div class='add'>+                ERROR("SWITCH_CASE_INDENT_LEVEL",</div><div class='add'>+                      "switch and case should be at the same indent\n$hereline$err");</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+# if/while/etc brace do not go on next line, unless defining a do while loop,</div><div class='add'>+# or if that brace on the next line is for something else</div><div class='add'>+        if ($line =~ /(.*)\b((?:if|while|for|switch)\s*\(|do\b|else\b)/ &amp;&amp; $line !~ /^.\s*\#/) {</div><div class='add'>+            my $pre_ctx = "$1$2";</div><div class='add'>+</div><div class='add'>+            my ($level, @ctx) = ctx_statement_level($linenr, $realcnt, 0);</div><div class='add'>+</div><div class='add'>+            if ($line =~ /^\+\t{6,}/) {</div><div class='add'>+                WARN("DEEP_INDENTATION",</div><div class='add'>+                     "Too many leading tabs - consider code refactoring\n" . $herecurr);</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            my $ctx_cnt = $realcnt - $#ctx - 1;</div><div class='add'>+            my $ctx = join("\n", @ctx);</div><div class='add'>+</div><div class='add'>+            my $ctx_ln = $linenr;</div><div class='add'>+            my $ctx_skip = $realcnt;</div><div class='add'>+</div><div class='add'>+            while ($ctx_skip &gt; $ctx_cnt || ($ctx_skip == $ctx_cnt &amp;&amp;</div><div class='add'>+                                            defined $lines[$ctx_ln - 1] &amp;&amp;</div><div class='add'>+                                            $lines[$ctx_ln - 1] =~ /^-/)) {</div><div class='add'>+                ##print "SKIP&lt;$ctx_skip&gt; CNT&lt;$ctx_cnt&gt;\n";</div><div class='add'>+                $ctx_skip-- if (!defined $lines[$ctx_ln - 1] || $lines[$ctx_ln - 1] !~ /^-/);</div><div class='add'>+                $ctx_ln++;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            #print "realcnt&lt;$realcnt&gt; ctx_cnt&lt;$ctx_cnt&gt;\n";</div><div class='add'>+            #print "pre&lt;$pre_ctx&gt;\nline&lt;$line&gt;\nctx&lt;$ctx&gt;\nnext&lt;$lines[$ctx_ln - 1]&gt;\n";</div><div class='add'>+</div><div class='add'>+            if ($ctx !~ /{\s*/ &amp;&amp; defined($lines[$ctx_ln -1]) &amp;&amp; $lines[$ctx_ln - 1] =~ /^\+\s*{/) {</div><div class='add'>+                ERROR("OPEN_BRACE",</div><div class='add'>+                      "that open brace { should be on the previous line\n" .</div><div class='add'>+                      "$here\n$ctx\n$rawlines[$ctx_ln - 1]\n");</div><div class='add'>+            }</div><div class='add'>+            if ($level == 0 &amp;&amp; $pre_ctx !~ /}\s*while\s*\($/ &amp;&amp;</div><div class='add'>+                $ctx =~ /\)\s*\;\s*$/ &amp;&amp;</div><div class='add'>+                defined $lines[$ctx_ln - 1])</div><div class='add'>+            {</div><div class='add'>+                my ($nlength, $nindent) = line_stats($lines[$ctx_ln - 1]);</div><div class='add'>+                if ($nindent &gt; $indent) {</div><div class='add'>+                    WARN("TRAILING_SEMICOLON",</div><div class='add'>+                         "trailing semicolon indicates no statements, indent implies otherwise\n" .</div><div class='add'>+                         "$here\n$ctx\n$rawlines[$ctx_ln - 1]\n");</div><div class='add'>+                }</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+# Check relative indent for conditionals and blocks.</div><div class='add'>+        if ($line =~ /\b(?:(?:if|while|for)\s*\(|do\b)/ &amp;&amp; $line !~ /^.\s*#/ &amp;&amp; $line !~ /\}\s*while\s*/) {</div><div class='add'>+            ($stat, $cond, $line_nr_next, $remain_next, $off_next) =</div><div class='add'>+                ctx_statement_block($linenr, $realcnt, 0)</div><div class='add'>+                if (!defined $stat);</div><div class='add'>+            my ($s, $c) = ($stat, $cond);</div><div class='add'>+</div><div class='add'>+            substr($s, 0, length($c), '');</div><div class='add'>+</div><div class='add'>+            # Make sure we remove the line prefixes as we have</div><div class='add'>+            # none on the first line, and are going to readd them</div><div class='add'>+            # where necessary.</div><div class='add'>+            $s =~ s/\n./\n/gs;</div><div class='add'>+</div><div class='add'>+            # Find out how long the conditional actually is.</div><div class='add'>+            my @newlines = ($c =~ /\n/gs);</div><div class='add'>+            my $cond_lines = 1 + $#newlines;</div><div class='add'>+</div><div class='add'>+            # We want to check the first line inside the block</div><div class='add'>+            # starting at the end of the conditional, so remove:</div><div class='add'>+            #  1) any blank line termination</div><div class='add'>+            #  2) any opening brace { on end of the line</div><div class='add'>+            #  3) any do (...) {</div><div class='add'>+            my $continuation = 0;</div><div class='add'>+            my $check = 0;</div><div class='add'>+            $s =~ s/^.*\bdo\b//;</div><div class='add'>+            $s =~ s/^\s*{//;</div><div class='add'>+            if ($s =~ s/^\s*\\//) {</div><div class='add'>+                $continuation = 1;</div><div class='add'>+            }</div><div class='add'>+            if ($s =~ s/^\s*?\n//) {</div><div class='add'>+                $check = 1;</div><div class='add'>+                $cond_lines++;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            # Also ignore a loop construct at the end of a</div><div class='add'>+            # preprocessor statement.</div><div class='add'>+            if (($prevline =~ /^.\s*#\s*define\s/ ||</div><div class='add'>+                 $prevline =~ /\\\s*$/) &amp;&amp; $continuation == 0) {</div><div class='add'>+                $check = 0;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            my $cond_ptr = -1;</div><div class='add'>+            $continuation = 0;</div><div class='add'>+            while ($cond_ptr != $cond_lines) {</div><div class='add'>+                $cond_ptr = $cond_lines;</div><div class='add'>+</div><div class='add'>+                # If we see an #else/#elif then the code</div><div class='add'>+                # is not linear.</div><div class='add'>+                if ($s =~ /^\s*\#\s*(?:else|elif)/) {</div><div class='add'>+                    $check = 0;</div><div class='add'>+                }</div><div class='add'>+</div><div class='add'>+                # Ignore:</div><div class='add'>+                #  1) blank lines, they should be at 0,</div><div class='add'>+                #  2) preprocessor lines, and</div><div class='add'>+                #  3) labels.</div><div class='add'>+                if ($continuation ||</div><div class='add'>+                    $s =~ /^\s*?\n/ ||</div><div class='add'>+                    $s =~ /^\s*#\s*?/ ||</div><div class='add'>+                    $s =~ /^\s*$Ident\s*:/) {</div><div class='add'>+                    $continuation = ($s =~ /^.*?\\\n/) ? 1 : 0;</div><div class='add'>+                    if ($s =~ s/^.*?\n//) {</div><div class='add'>+                        $cond_lines++;</div><div class='add'>+                    }</div><div class='add'>+                }</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            my (undef, $sindent) = line_stats("+" . $s);</div><div class='add'>+            my $stat_real = raw_line($linenr, $cond_lines);</div><div class='add'>+</div><div class='add'>+            # Check if either of these lines are modified, else</div><div class='add'>+            # this is not this patch's fault.</div><div class='add'>+            if (!defined($stat_real) ||</div><div class='add'>+                $stat !~ /^\+/ &amp;&amp; $stat_real !~ /^\+/) {</div><div class='add'>+                $check = 0;</div><div class='add'>+            }</div><div class='add'>+            if (defined($stat_real) &amp;&amp; $cond_lines &gt; 1) {</div><div class='add'>+                $stat_real = "[...]\n$stat_real";</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            #print "line&lt;$line&gt; prevline&lt;$prevline&gt; indent&lt;$indent&gt; sindent&lt;$sindent&gt; check&lt;$check&gt; continuation&lt;$continuation&gt; s&lt;$s&gt; cond_lines&lt;$cond_lines&gt; stat_real&lt;$stat_real&gt; stat&lt;$stat&gt;\n";</div><div class='add'>+</div><div class='add'>+            if ($check &amp;&amp; (($sindent % 8) != 0 ||</div><div class='add'>+                           ($sindent &lt;= $indent &amp;&amp; $s ne ''))) {</div><div class='add'>+                WARN("SUSPECT_CODE_INDENT",</div><div class='add'>+                     "suspect code indent for conditional statements ($indent, $sindent)\n" . $herecurr . "$stat_real\n");</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        # Track the 'values' across context and added lines.</div><div class='add'>+        my $opline = $line; $opline =~ s/^./ /;</div><div class='add'>+        my ($curr_values, $curr_vars) =</div><div class='add'>+            annotate_values($opline . "\n", $prev_values);</div><div class='add'>+        $curr_values = $prev_values . $curr_values;</div><div class='add'>+        if ($dbg_values) {</div><div class='add'>+            my $outline = $opline; $outline =~ s/\t/ /g;</div><div class='add'>+            print "$linenr &gt; .$outline\n";</div><div class='add'>+            print "$linenr &gt; $curr_values\n";</div><div class='add'>+            print "$linenr &gt;  $curr_vars\n";</div><div class='add'>+        }</div><div class='add'>+        $prev_values = substr($curr_values, -1);</div><div class='add'>+</div><div class='add'>+#ignore lines not being added</div><div class='add'>+        next if ($line =~ /^[^\+]/);</div><div class='add'>+</div><div class='add'>+# TEST: allow direct testing of the type matcher.</div><div class='add'>+        if ($dbg_type) {</div><div class='add'>+            if ($line =~ /^.\s*$Declare\s*$/) {</div><div class='add'>+                ERROR("TEST_TYPE",</div><div class='add'>+                      "TEST: is type\n" . $herecurr);</div><div class='add'>+            } elsif ($dbg_type &gt; 1 &amp;&amp; $line =~ /^.+($Declare)/) {</div><div class='add'>+                ERROR("TEST_NOT_TYPE",</div><div class='add'>+                      "TEST: is not type ($1 is)\n". $herecurr);</div><div class='add'>+            }</div><div class='add'>+            next;</div><div class='add'>+        }</div><div class='add'>+# TEST: allow direct testing of the attribute matcher.</div><div class='add'>+        if ($dbg_attr) {</div><div class='add'>+            if ($line =~ /^.\s*$Modifier\s*$/) {</div><div class='add'>+                ERROR("TEST_ATTR",</div><div class='add'>+                      "TEST: is attr\n" . $herecurr);</div><div class='add'>+            } elsif ($dbg_attr &gt; 1 &amp;&amp; $line =~ /^.+($Modifier)/) {</div><div class='add'>+                ERROR("TEST_NOT_ATTR",</div><div class='add'>+                      "TEST: is not attr ($1 is)\n". $herecurr);</div><div class='add'>+            }</div><div class='add'>+            next;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+# check for initialisation to aggregates open brace on the next line</div><div class='add'>+        if ($line =~ /^.\s*{/ &amp;&amp;</div><div class='add'>+            $prevline =~ /(?:^|[^=])=\s*$/) {</div><div class='add'>+            ERROR("OPEN_BRACE",</div><div class='add'>+                  "that open brace { should be on the previous line\n" . $hereprev);</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+#</div><div class='add'>+# Checks which are anchored on the added line.</div><div class='add'>+#</div><div class='add'>+</div><div class='add'>+# check for malformed paths in #include statements (uses RAW line)</div><div class='add'>+        if ($rawline =~ m{^.\s*\#\s*include\s+[&lt;"](.*)["&gt;]}) {</div><div class='add'>+            my $path = $1;</div><div class='add'>+            if ($path =~ m{//}) {</div><div class='add'>+                ERROR("MALFORMED_INCLUDE",</div><div class='add'>+                      "malformed #include filename\n" . $herecurr);</div><div class='add'>+            }</div><div class='add'>+            if ($path =~ "^uapi/" &amp;&amp; $realfile =~ m@\binclude/uapi/@) {</div><div class='add'>+                ERROR("UAPI_INCLUDE",</div><div class='add'>+                      "No #include in ...include/uapi/... should use a uapi/ path prefix\n" . $herecurr);</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+# no C99 // comments</div><div class='add'>+        if ($line =~ m{//}) {</div><div class='add'>+            if (ERROR("C99_COMMENTS",</div><div class='add'>+                      "do not use C99 // comments\n" . $herecurr) &amp;&amp;</div><div class='add'>+                $fix) {</div><div class='add'>+                my $line = $fixed[$linenr - 1];</div><div class='add'>+                if ($line =~ /\/\/(.*)$/) {</div><div class='add'>+                    my $comment = trim($1);</div><div class='add'>+                    $fixed[$linenr - 1] =~ s@\/\/(.*)$@/\* $comment \*/@;</div><div class='add'>+                }</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+        # Remove C99 comments.</div><div class='add'>+        $line =~ s@//.*@@;</div><div class='add'>+        $opline =~ s@//.*@@;</div><div class='add'>+</div><div class='add'>+# EXPORT_SYMBOL should immediately follow the thing it is exporting, consider</div><div class='add'>+# the whole statement.</div><div class='add'>+#print "APW &lt;$lines[$realline_next - 1]&gt;\n";</div><div class='add'>+        if (defined $realline_next &amp;&amp;</div><div class='add'>+            exists $lines[$realline_next - 1] &amp;&amp;</div><div class='add'>+            !defined $suppress_export{$realline_next} &amp;&amp;</div><div class='add'>+            ($lines[$realline_next - 1] =~ /EXPORT_SYMBOL.*\((.*)\)/ ||</div><div class='add'>+             $lines[$realline_next - 1] =~ /EXPORT_UNUSED_SYMBOL.*\((.*)\)/)) {</div><div class='add'>+            # Handle definitions which produce identifiers with</div><div class='add'>+            # a prefix:</div><div class='add'>+            #   XXX(foo);</div><div class='add'>+            #   EXPORT_SYMBOL(something_foo);</div><div class='add'>+            my $name = $1;</div><div class='add'>+            if ($stat =~ /^(?:.\s*}\s*\n)?.([A-Z_]+)\s*\(\s*($Ident)/ &amp;&amp;</div><div class='add'>+                $name =~ /^${Ident}_$2/) {</div><div class='add'>+#print "FOO C name&lt;$name&gt;\n";</div><div class='add'>+                $suppress_export{$realline_next} = 1;</div><div class='add'>+</div><div class='add'>+            } elsif ($stat !~ /(?:</div><div class='add'>+                                \n.}\s*$|</div><div class='add'>+                                ^.DEFINE_$Ident\(\Q$name\E\)|</div><div class='add'>+                                ^.DECLARE_$Ident\(\Q$name\E\)|</div><div class='add'>+                                ^.LIST_HEAD\(\Q$name\E\)|</div><div class='add'>+                                ^.(?:$Storage\s+)?$Type\s*\(\s*\*\s*\Q$name\E\s*\)\s*\(|</div><div class='add'>+                                \b\Q$name\E(?:\s+$Attribute)*\s*(?:;|=|\[|\()</div><div class='add'>+                            )/x) {</div><div class='add'>+#print "FOO A&lt;$lines[$realline_next - 1]&gt; stat&lt;$stat&gt; name&lt;$name&gt;\n";</div><div class='add'>+                $suppress_export{$realline_next} = 2;</div><div class='add'>+            } else {</div><div class='add'>+                $suppress_export{$realline_next} = 1;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+        if (!defined $suppress_export{$linenr} &amp;&amp;</div><div class='add'>+            $prevline =~ /^.\s*$/ &amp;&amp;</div><div class='add'>+            ($line =~ /EXPORT_SYMBOL.*\((.*)\)/ ||</div><div class='add'>+             $line =~ /EXPORT_UNUSED_SYMBOL.*\((.*)\)/)) {</div><div class='add'>+#print "FOO B &lt;$lines[$linenr - 1]&gt;\n";</div><div class='add'>+            $suppress_export{$linenr} = 2;</div><div class='add'>+        }</div><div class='add'>+        if (defined $suppress_export{$linenr} &amp;&amp;</div><div class='add'>+            $suppress_export{$linenr} == 2) {</div><div class='add'>+            WARN("EXPORT_SYMBOL",</div><div class='add'>+                 "EXPORT_SYMBOL(foo); should immediately follow its function/variable\n" . $herecurr);</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+# check for global initialisers.</div><div class='add'>+        if ($line =~ /^\+(\s*$Type\s*$Ident\s*(?:\s+$Modifier))*\s*=\s*(0|NULL|false)\s*;/) {</div><div class='add'>+            if (ERROR("GLOBAL_INITIALISERS",</div><div class='add'>+                      "do not initialise globals to 0 or NULL\n" .</div><div class='add'>+                      $herecurr) &amp;&amp;</div><div class='add'>+                $fix) {</div><div class='add'>+                $fixed[$linenr - 1] =~ s/($Type\s*$Ident\s*(?:\s+$Modifier))*\s*=\s*(0|NULL|false)\s*;/$1;/;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+# check for static initialisers.</div><div class='add'>+        if ($line =~ /^\+.*\bstatic\s.*=\s*(0|NULL|false)\s*;/) {</div><div class='add'>+            if (ERROR("INITIALISED_STATIC",</div><div class='add'>+                      "do not initialise statics to 0 or NULL\n" .</div><div class='add'>+                      $herecurr) &amp;&amp;</div><div class='add'>+                $fix) {</div><div class='add'>+                $fixed[$linenr - 1] =~ s/(\bstatic\s.*?)\s*=\s*(0|NULL|false)\s*;/$1;/;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+# check for static const char * arrays.</div><div class='add'>+        if ($line =~ /\bstatic\s+const\s+char\s*\*\s*(\w+)\s*\[\s*\]\s*=\s*/) {</div><div class='add'>+            WARN("STATIC_CONST_CHAR_ARRAY",</div><div class='add'>+                 "static const char * array should probably be static const char * const\n" .</div><div class='add'>+                 $herecurr);</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+# check for static char foo[] = "bar" declarations.</div><div class='add'>+        if ($line =~ /\bstatic\s+char\s+(\w+)\s*\[\s*\]\s*=\s*"/) {</div><div class='add'>+            WARN("STATIC_CONST_CHAR_ARRAY",</div><div class='add'>+                 "static char array declaration should probably be static const char\n" .</div><div class='add'>+                 $herecurr);</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+# check for non-global char *foo[] = {"bar", ...} declarations.</div><div class='add'>+        if ($line =~ /^.\s+(?:static\s+|const\s+)?char\s+\*\s*\w+\s*\[\s*\]\s*=\s*\{/) {</div><div class='add'>+            WARN("STATIC_CONST_CHAR_ARRAY",</div><div class='add'>+                 "char * array declaration might be better as static const\n" .</div><div class='add'>+                 $herecurr);</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+# check for function declarations without arguments like "int foo()"</div><div class='add'>+        if ($line =~ /(\b$Type\s+$Ident)\s*\(\s*\)/) {</div><div class='add'>+            if (ERROR("FUNCTION_WITHOUT_ARGS",</div><div class='add'>+                      "Bad function definition - $1() should probably be $1(void)\n" . $herecurr) &amp;&amp;</div><div class='add'>+                $fix) {</div><div class='add'>+                $fixed[$linenr - 1] =~ s/(\b($Type)\s+($Ident))\s*\(\s*\)/$2 $3(void)/;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+# * goes on variable not on type</div><div class='add'>+        # (char*[ const])</div><div class='add'>+        while ($line =~ m{(\($NonptrType(\s*(?:$Modifier\b\s*|\*\s*)+)\))}g) {</div><div class='add'>+            #print "AA&lt;$1&gt;\n";</div><div class='add'>+            my ($ident, $from, $to) = ($1, $2, $2);</div><div class='add'>+</div><div class='add'>+            # Should start with a space.</div><div class='add'>+            $to =~ s/^(\S)/ $1/;</div><div class='add'>+            # Should not end with a space.</div><div class='add'>+            $to =~ s/\s+$//;</div><div class='add'>+            # '*'s should not have spaces between.</div><div class='add'>+            while ($to =~ s/\*\s+\*/\*\*/) {</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+##   print "1: from&lt;$from&gt; to&lt;$to&gt; ident&lt;$ident&gt;\n";</div><div class='add'>+            if ($from ne $to) {</div><div class='add'>+                if (ERROR("POINTER_LOCATION",</div><div class='add'>+                          "\"(foo$from)\" should be \"(foo$to)\"\n" .  $herecurr) &amp;&amp;</div><div class='add'>+                    $fix) {</div><div class='add'>+                    my $sub_from = $ident;</div><div class='add'>+                    my $sub_to = $ident;</div><div class='add'>+                    $sub_to =~ s/\Q$from\E/$to/;</div><div class='add'>+                    $fixed[$linenr - 1] =~</div><div class='add'>+                        s@\Q$sub_from\E@$sub_to@;</div><div class='add'>+                }</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+        while ($line =~ m{(\b$NonptrType(\s*(?:$Modifier\b\s*|\*\s*)+)($Ident))}g) {</div><div class='add'>+            #print "BB&lt;$1&gt;\n";</div><div class='add'>+            my ($match, $from, $to, $ident) = ($1, $2, $2, $3);</div><div class='add'>+</div><div class='add'>+            # Should start with a space.</div><div class='add'>+            $to =~ s/^(\S)/ $1/;</div><div class='add'>+            # Should not end with a space.</div><div class='add'>+            $to =~ s/\s+$//;</div><div class='add'>+            # '*'s should not have spaces between.</div><div class='add'>+            while ($to =~ s/\*\s+\*/\*\*/) {</div><div class='add'>+            }</div><div class='add'>+            # Modifiers should have spaces.</div><div class='add'>+            $to =~ s/(\b$Modifier$)/$1 /;</div><div class='add'>+</div><div class='add'>+##  print "2: from&lt;$from&gt; to&lt;$to&gt; ident&lt;$ident&gt;\n";</div><div class='add'>+            if ($from ne $to &amp;&amp; $ident !~ /^$Modifier$/) {</div><div class='add'>+                if (ERROR("POINTER_LOCATION",</div><div class='add'>+                          "\"foo${from}bar\" should be \"foo${to}bar\"\n" .  $herecurr) &amp;&amp;</div><div class='add'>+                    $fix) {</div><div class='add'>+</div><div class='add'>+                    my $sub_from = $match;</div><div class='add'>+                    my $sub_to = $match;</div><div class='add'>+                    $sub_to =~ s/\Q$from\E/$to/;</div><div class='add'>+                    $fixed[$linenr - 1] =~</div><div class='add'>+                        s@\Q$sub_from\E@$sub_to@;</div><div class='add'>+                }</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+# function brace can't be on same line, except for #defines of do while,</div><div class='add'>+# or if closed on same line</div><div class='add'>+        if (($line=~/$Type\s*$Ident\(.*\).*\s\{/) and</div><div class='add'>+            !($line=~/\#\s*define.*do\s\{/) and !($line=~/}/)) {</div><div class='add'>+            ERROR("OPEN_BRACE",</div><div class='add'>+                  "open brace '{' following function declarations go on the next line\n" . $herecurr);</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+# open braces for enum, union and struct go on the same line.</div><div class='add'>+        if ($line =~ /^.\s*{/ &amp;&amp;</div><div class='add'>+            $prevline =~ /^.\s*(?:typedef\s+)?(enum|union|struct)(?:\s+$Ident)?\s*$/) {</div><div class='add'>+            ERROR("OPEN_BRACE",</div><div class='add'>+                  "open brace '{' following $1 go on the same line\n" . $hereprev);</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+# missing space after union, struct or enum definition</div><div class='add'>+        if ($line =~ /^.\s*(?:typedef\s+)?(enum|union|struct)(?:\s+$Ident){1,2}[=\{]/) {</div><div class='add'>+            if (WARN("SPACING",</div><div class='add'>+                     "missing space after $1 definition\n" . $herecurr) &amp;&amp;</div><div class='add'>+                $fix) {</div><div class='add'>+                $fixed[$linenr - 1] =~</div><div class='add'>+                    s/^(.\s*(?:typedef\s+)?(?:enum|union|struct)(?:\s+$Ident){1,2})([=\{])/$1 $2/;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+# Function pointer declarations</div><div class='add'>+# check spacing between type, funcptr, and args</div><div class='add'>+# canonical declaration is "type (*funcptr)(args...)"</div><div class='add'>+        if ($line =~ /^.\s*($Declare)\((\s*)\*(\s*)($Ident)(\s*)\)(\s*)\(/) {</div><div class='add'>+            my $declare = $1;</div><div class='add'>+            my $pre_pointer_space = $2;</div><div class='add'>+            my $post_pointer_space = $3;</div><div class='add'>+            my $funcname = $4;</div><div class='add'>+            my $post_funcname_space = $5;</div><div class='add'>+            my $pre_args_space = $6;</div><div class='add'>+</div><div class='add'>+# the $Declare variable will capture all spaces after the type</div><div class='add'>+# so check it for a missing trailing missing space but pointer return types</div><div class='add'>+# don't need a space so don't warn for those.</div><div class='add'>+            my $post_declare_space = "";</div><div class='add'>+            if ($declare =~ /(\s+)$/) {</div><div class='add'>+                $post_declare_space = $1;</div><div class='add'>+                $declare = rtrim($declare);</div><div class='add'>+            }</div><div class='add'>+            if ($declare !~ /\*$/ &amp;&amp; $post_declare_space =~ /^$/) {</div><div class='add'>+                WARN("SPACING",</div><div class='add'>+                     "missing space after return type\n" . $herecurr);</div><div class='add'>+                $post_declare_space = " ";</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+# unnecessary space "type ( *funcptr)(args...)"</div><div class='add'>+            if (defined $pre_pointer_space &amp;&amp;</div><div class='add'>+                $pre_pointer_space =~ /^\s/) {</div><div class='add'>+                WARN("SPACING",</div><div class='add'>+                     "Unnecessary space after function pointer open parenthesis\n" . $herecurr);</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+# unnecessary space "type (* funcptr)(args...)"</div><div class='add'>+            if (defined $post_pointer_space &amp;&amp;</div><div class='add'>+                $post_pointer_space =~ /^\s/) {</div><div class='add'>+                WARN("SPACING",</div><div class='add'>+                     "Unnecessary space before function pointer name\n" . $herecurr);</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+# unnecessary space "type (*funcptr )(args...)"</div><div class='add'>+            if (defined $post_funcname_space &amp;&amp;</div><div class='add'>+                $post_funcname_space =~ /^\s/) {</div><div class='add'>+                WARN("SPACING",</div><div class='add'>+                     "Unnecessary space after function pointer name\n" . $herecurr);</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+# unnecessary space "type (*funcptr) (args...)"</div><div class='add'>+            if (defined $pre_args_space &amp;&amp;</div><div class='add'>+                $pre_args_space =~ /^\s/) {</div><div class='add'>+                WARN("SPACING",</div><div class='add'>+                     "Unnecessary space before function pointer arguments\n" . $herecurr);</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            if (show_type("SPACING") &amp;&amp; $fix) {</div><div class='add'>+                $fixed[$linenr - 1] =~</div><div class='add'>+                    s/^(.\s*)$Declare\s*\(\s*\*\s*$Ident\s*\)\s*\(/$1 . $declare . $post_declare_space . '(*' . $funcname . ')('/ex;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+# check for spacing round square brackets; allowed:</div><div class='add'>+#  1. with a type on the left -- int [] a;</div><div class='add'>+#  2. at the beginning of a line for slice initialisers -- [0...10] = 5,</div><div class='add'>+#  3. inside a curly brace -- = { [0...10] = 5 }</div><div class='add'>+        while ($line =~ /(.*?\s)\[/g) {</div><div class='add'>+            my ($where, $prefix) = ($-[1], $1);</div><div class='add'>+            if ($prefix !~ /$Type\s+$/ &amp;&amp;</div><div class='add'>+                ($where != 0 || $prefix !~ /^.\s+$/) &amp;&amp;</div><div class='add'>+                $prefix !~ /[{,]\s+$/) {</div><div class='add'>+                if (ERROR("BRACKET_SPACE",</div><div class='add'>+                          "space prohibited before open square bracket '['\n" . $herecurr) &amp;&amp;</div><div class='add'>+                    $fix) {</div><div class='add'>+                    $fixed[$linenr - 1] =~</div><div class='add'>+                        s/^(\+.*?)\s+\[/$1\[/;</div><div class='add'>+                }</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+# Check operator spacing.</div><div class='add'>+        if (!($line=~/\#\s*include/)) {</div><div class='add'>+            my $fixed_line = "";</div><div class='add'>+            my $line_fixed = 0;</div><div class='add'>+</div><div class='add'>+            my $ops = qr{</div><div class='add'>+                                &lt;&lt;=|&gt;&gt;=|&lt;=|&gt;=|==|!=|</div><div class='add'>+                                \+=|-=|\*=|\/=|%=|\^=|\|=|&amp;=|</div><div class='add'>+                                =&gt;|-&gt;|&lt;&lt;|&gt;&gt;|&lt;|&gt;|=|!|~|</div><div class='add'>+                                &amp;&amp;|\|\||,|\^|\+\+|--|&amp;|\||\+|-|\*|\/|%|</div><div class='add'>+                                \?:|\?|:</div><div class='add'>+                        }x;</div><div class='add'>+            my @elements = split(/($ops|;)/, $opline);</div><div class='add'>+</div><div class='add'>+##                      print("element count: &lt;" . $#elements . "&gt;\n");</div><div class='add'>+##                      foreach my $el (@elements) {</div><div class='add'>+##                              print("el: &lt;$el&gt;\n");</div><div class='add'>+##                      }</div><div class='add'>+</div><div class='add'>+            my @fix_elements = ();</div><div class='add'>+            my $off = 0;</div><div class='add'>+</div><div class='add'>+            foreach my $el (@elements) {</div><div class='add'>+                push(@fix_elements, substr($rawline, $off, length($el)));</div><div class='add'>+                $off += length($el);</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            $off = 0;</div><div class='add'>+</div><div class='add'>+            my $blank = copy_spacing($opline);</div><div class='add'>+            my $last_after = -1;</div><div class='add'>+</div><div class='add'>+            for (my $n = 0; $n &lt; $#elements; $n += 2) {</div><div class='add'>+</div><div class='add'>+                my $good = $fix_elements[$n] . $fix_elements[$n + 1];</div><div class='add'>+</div><div class='add'>+##                              print("n: &lt;$n&gt; good: &lt;$good&gt;\n");</div><div class='add'>+</div><div class='add'>+                $off += length($elements[$n]);</div><div class='add'>+</div><div class='add'>+                # Pick up the preceding and succeeding characters.</div><div class='add'>+                my $ca = substr($opline, 0, $off);</div><div class='add'>+                my $cc = '';</div><div class='add'>+                if (length($opline) &gt;= ($off + length($elements[$n + 1]))) {</div><div class='add'>+                    $cc = substr($opline, $off + length($elements[$n + 1]));</div><div class='add'>+                }</div><div class='add'>+                my $cb = "$ca$;$cc";</div><div class='add'>+</div><div class='add'>+                my $a = '';</div><div class='add'>+                $a = 'V' if ($elements[$n] ne '');</div><div class='add'>+                $a = 'W' if ($elements[$n] =~ /\s$/);</div><div class='add'>+                $a = 'C' if ($elements[$n] =~ /$;$/);</div><div class='add'>+                $a = 'B' if ($elements[$n] =~ /(\[|\()$/);</div><div class='add'>+                $a = 'O' if ($elements[$n] eq '');</div><div class='add'>+                $a = 'E' if ($ca =~ /^\s*$/);</div><div class='add'>+</div><div class='add'>+                my $op = $elements[$n + 1];</div><div class='add'>+</div><div class='add'>+                my $c = '';</div><div class='add'>+                if (defined $elements[$n + 2]) {</div><div class='add'>+                    $c = 'V' if ($elements[$n + 2] ne '');</div><div class='add'>+                    $c = 'W' if ($elements[$n + 2] =~ /^\s/);</div><div class='add'>+                    $c = 'C' if ($elements[$n + 2] =~ /^$;/);</div><div class='add'>+                    $c = 'B' if ($elements[$n + 2] =~ /^(\)|\]|;)/);</div><div class='add'>+                    $c = 'O' if ($elements[$n + 2] eq '');</div><div class='add'>+                    $c = 'E' if ($elements[$n + 2] =~ /^\s*\\$/);</div><div class='add'>+                } else {</div><div class='add'>+                    $c = 'E';</div><div class='add'>+                }</div><div class='add'>+</div><div class='add'>+                my $ctx = "${a}x${c}";</div><div class='add'>+</div><div class='add'>+                my $at = "(ctx:$ctx)";</div><div class='add'>+</div><div class='add'>+                my $ptr = substr($blank, 0, $off) . "^";</div><div class='add'>+                my $hereptr = "$hereline$ptr\n";</div><div class='add'>+</div><div class='add'>+                # Pull out the value of this operator.</div><div class='add'>+                my $op_type = substr($curr_values, $off + 1, 1);</div><div class='add'>+</div><div class='add'>+                # Get the full operator variant.</div><div class='add'>+                my $opv = $op . substr($curr_vars, $off, 1);</div><div class='add'>+</div><div class='add'>+                # Ignore operators passed as parameters.</div><div class='add'>+                if ($op_type ne 'V' &amp;&amp;</div><div class='add'>+                    $ca =~ /\s$/ &amp;&amp; $cc =~ /^\s*,/) {</div><div class='add'>+</div><div class='add'>+#                               # Ignore comments</div><div class='add'>+#                               } elsif ($op =~ /^$;+$/) {</div><div class='add'>+</div><div class='add'>+                    # ; should have either the end of line or a space or \ after it</div><div class='add'>+                } elsif ($op eq ';') {</div><div class='add'>+                    if ($ctx !~ /.x[WEBC]/ &amp;&amp;</div><div class='add'>+                        $cc !~ /^\\/ &amp;&amp; $cc !~ /^;/) {</div><div class='add'>+                        if (ERROR("SPACING",</div><div class='add'>+                                  "space required after that '$op' $at\n" . $hereptr)) {</div><div class='add'>+                            $good = $fix_elements[$n] . trim($fix_elements[$n + 1]) . " ";</div><div class='add'>+                            $line_fixed = 1;</div><div class='add'>+                        }</div><div class='add'>+                    }</div><div class='add'>+</div><div class='add'>+                    # // is a comment</div><div class='add'>+                } elsif ($op eq '//') {</div><div class='add'>+</div><div class='add'>+                    #   :   when part of a bitfield</div><div class='add'>+                } elsif ($opv eq ':B') {</div><div class='add'>+                    # skip the bitfield test for now</div><div class='add'>+</div><div class='add'>+                    # No spaces for:</div><div class='add'>+                    #   -&gt;</div><div class='add'>+                } elsif ($op eq '-&gt;') {</div><div class='add'>+                    if ($ctx =~ /Wx.|.xW/) {</div><div class='add'>+                        if (ERROR("SPACING",</div><div class='add'>+                                  "spaces prohibited around that '$op' $at\n" . $hereptr)) {</div><div class='add'>+                            $good = rtrim($fix_elements[$n]) . trim($fix_elements[$n + 1]);</div><div class='add'>+                            if (defined $fix_elements[$n + 2]) {</div><div class='add'>+                                $fix_elements[$n + 2] =~ s/^\s+//;</div><div class='add'>+                            }</div><div class='add'>+                            $line_fixed = 1;</div><div class='add'>+                        }</div><div class='add'>+                    }</div><div class='add'>+</div><div class='add'>+                    # , must have a space on the right.</div><div class='add'>+                } elsif ($op eq ',') {</div><div class='add'>+                    if ($ctx !~ /.x[WEC]/ &amp;&amp; $cc !~ /^}/) {</div><div class='add'>+                        if (ERROR("SPACING",</div><div class='add'>+                                  "space required after that '$op' $at\n" . $hereptr)) {</div><div class='add'>+                            $good = $fix_elements[$n] . trim($fix_elements[$n + 1]) . " ";</div><div class='add'>+                            $line_fixed = 1;</div><div class='add'>+                            $last_after = $n;</div><div class='add'>+                        }</div><div class='add'>+                    }</div><div class='add'>+</div><div class='add'>+                    # '*' as part of a type definition -- reported already.</div><div class='add'>+                } elsif ($opv eq '*_') {</div><div class='add'>+                    #warn "'*' is part of type\n";</div><div class='add'>+</div><div class='add'>+                    # unary operators should have a space before and</div><div class='add'>+                    # none after.  May be left adjacent to another</div><div class='add'>+                    # unary operator, or a cast</div><div class='add'>+                } elsif ($op eq '!' || $op eq '~' ||</div><div class='add'>+                         $opv eq '*U' || $opv eq '-U' ||</div><div class='add'>+                         $opv eq '&amp;U' || $opv eq '&amp;&amp;U') {</div><div class='add'>+                    if ($ctx !~ /[WEBC]x./ &amp;&amp; $ca !~ /(?:\)|!|~|\*|-|\&amp;|\||\+\+|\-\-|\{)$/) {</div><div class='add'>+                        if (ERROR("SPACING",</div><div class='add'>+                                  "space required before that '$op' $at\n" . $hereptr)) {</div><div class='add'>+                            if ($n != $last_after + 2) {</div><div class='add'>+                                $good = $fix_elements[$n] . " " . ltrim($fix_elements[$n + 1]);</div><div class='add'>+                                $line_fixed = 1;</div><div class='add'>+                            }</div><div class='add'>+                        }</div><div class='add'>+                    }</div><div class='add'>+                    if ($op eq '*' &amp;&amp; $cc =~/\s*$Modifier\b/) {</div><div class='add'>+                        # A unary '*' may be const</div><div class='add'>+</div><div class='add'>+                    } elsif ($ctx =~ /.xW/) {</div><div class='add'>+                        if (ERROR("SPACING",</div><div class='add'>+                                  "space prohibited after that '$op' $at\n" . $hereptr)) {</div><div class='add'>+                            $good = $fix_elements[$n] . rtrim($fix_elements[$n + 1]);</div><div class='add'>+                            if (defined $fix_elements[$n + 2]) {</div><div class='add'>+                                $fix_elements[$n + 2] =~ s/^\s+//;</div><div class='add'>+                            }</div><div class='add'>+                            $line_fixed = 1;</div><div class='add'>+                        }</div><div class='add'>+                    }</div><div class='add'>+</div><div class='add'>+                    # unary ++ and unary -- are allowed no space on one side.</div><div class='add'>+                } elsif ($op eq '++' or $op eq '--') {</div><div class='add'>+                    if ($ctx !~ /[WEOBC]x[^W]/ &amp;&amp; $ctx !~ /[^W]x[WOBEC]/) {</div><div class='add'>+                        if (ERROR("SPACING",</div><div class='add'>+                                  "space required one side of that '$op' $at\n" . $hereptr)) {</div><div class='add'>+                            $good = $fix_elements[$n] . trim($fix_elements[$n + 1]) . " ";</div><div class='add'>+                            $line_fixed = 1;</div><div class='add'>+                        }</div><div class='add'>+                    }</div><div class='add'>+                    if ($ctx =~ /Wx[BE]/ ||</div><div class='add'>+                        ($ctx =~ /Wx./ &amp;&amp; $cc =~ /^;/)) {</div><div class='add'>+                        if (ERROR("SPACING",</div><div class='add'>+                                  "space prohibited before that '$op' $at\n" . $hereptr)) {</div><div class='add'>+                            $good = rtrim($fix_elements[$n]) . trim($fix_elements[$n + 1]);</div><div class='add'>+                            $line_fixed = 1;</div><div class='add'>+                        }</div><div class='add'>+                    }</div><div class='add'>+                    if ($ctx =~ /ExW/) {</div><div class='add'>+                        if (ERROR("SPACING",</div><div class='add'>+                                  "space prohibited after that '$op' $at\n" . $hereptr)) {</div><div class='add'>+                            $good = $fix_elements[$n] . trim($fix_elements[$n + 1]);</div><div class='add'>+                            if (defined $fix_elements[$n + 2]) {</div><div class='add'>+                                $fix_elements[$n + 2] =~ s/^\s+//;</div><div class='add'>+                            }</div><div class='add'>+                            $line_fixed = 1;</div><div class='add'>+                        }</div><div class='add'>+                    }</div><div class='add'>+</div><div class='add'>+                    # &lt;&lt; and &gt;&gt; may either have or not have spaces both sides</div><div class='add'>+                } elsif ($op eq '&lt;&lt;' or $op eq '&gt;&gt;' or</div><div class='add'>+                         $op eq '&amp;' or $op eq '^' or $op eq '|' or</div><div class='add'>+                         $op eq '+' or $op eq '-' or</div><div class='add'>+                         $op eq '*' or $op eq '/' or</div><div class='add'>+                         $op eq '%')</div><div class='add'>+                {</div><div class='add'>+                    if ($ctx =~ /Wx[^WCE]|[^WCE]xW/) {</div><div class='add'>+                        if (ERROR("SPACING",</div><div class='add'>+                                  "need consistent spacing around '$op' $at\n" . $hereptr)) {</div><div class='add'>+                            $good = rtrim($fix_elements[$n]) . " " . trim($fix_elements[$n + 1]) . " ";</div><div class='add'>+                            if (defined $fix_elements[$n + 2]) {</div><div class='add'>+                                $fix_elements[$n + 2] =~ s/^\s+//;</div><div class='add'>+                            }</div><div class='add'>+                            $line_fixed = 1;</div><div class='add'>+                        }</div><div class='add'>+                    }</div><div class='add'>+</div><div class='add'>+                    # A colon needs no spaces before when it is</div><div class='add'>+                    # terminating a case value or a label.</div><div class='add'>+                } elsif ($opv eq ':C' || $opv eq ':L') {</div><div class='add'>+                    if ($ctx =~ /Wx./) {</div><div class='add'>+                        if (ERROR("SPACING",</div><div class='add'>+                                  "space prohibited before that '$op' $at\n" . $hereptr)) {</div><div class='add'>+                            $good = rtrim($fix_elements[$n]) . trim($fix_elements[$n + 1]);</div><div class='add'>+                            $line_fixed = 1;</div><div class='add'>+                        }</div><div class='add'>+                    }</div><div class='add'>+</div><div class='add'>+                    # All the others need spaces both sides.</div><div class='add'>+                } elsif ($ctx !~ /[EWC]x[CWE]/) {</div><div class='add'>+                    my $ok = 0;</div><div class='add'>+</div><div class='add'>+                    # Ignore email addresses &lt;foo@bar&gt;</div><div class='add'>+                    if (($op eq '&lt;' &amp;&amp;</div><div class='add'>+                         $cc =~ /^\S+\@\S+&gt;/) ||</div><div class='add'>+                        ($op eq '&gt;' &amp;&amp;</div><div class='add'>+                         $ca =~ /&lt;\S+\@\S+$/))</div><div class='add'>+                    {</div><div class='add'>+                        $ok = 1;</div><div class='add'>+                    }</div><div class='add'>+</div><div class='add'>+                    # messages are ERROR, but ?: are CHK</div><div class='add'>+                    if ($ok == 0) {</div><div class='add'>+                        my $msg_type = \&amp;ERROR;</div><div class='add'>+                        $msg_type = \&amp;CHK if (($op eq '?:' || $op eq '?' || $op eq ':') &amp;&amp; $ctx =~ /VxV/);</div><div class='add'>+</div><div class='add'>+                        if (&amp;{$msg_type}("SPACING",</div><div class='add'>+                                         "spaces required around that '$op' $at\n" . $hereptr)) {</div><div class='add'>+                            $good = rtrim($fix_elements[$n]) . " " . trim($fix_elements[$n + 1]) . " ";</div><div class='add'>+                            if (defined $fix_elements[$n + 2]) {</div><div class='add'>+                                $fix_elements[$n + 2] =~ s/^\s+//;</div><div class='add'>+                            }</div><div class='add'>+                            $line_fixed = 1;</div><div class='add'>+                        }</div><div class='add'>+                    }</div><div class='add'>+                }</div><div class='add'>+                $off += length($elements[$n + 1]);</div><div class='add'>+</div><div class='add'>+##                              print("n: &lt;$n&gt; GOOD: &lt;$good&gt;\n");</div><div class='add'>+</div><div class='add'>+                $fixed_line = $fixed_line . $good;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            if (($#elements % 2) == 0) {</div><div class='add'>+                $fixed_line = $fixed_line . $fix_elements[$#elements];</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            if ($fix &amp;&amp; $line_fixed &amp;&amp; $fixed_line ne $fixed[$linenr - 1]) {</div><div class='add'>+                $fixed[$linenr - 1] = $fixed_line;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+# check for whitespace before a non-naked semicolon</div><div class='add'>+        if ($line =~ /^\+.*\S\s+;\s*$/) {</div><div class='add'>+            if (WARN("SPACING",</div><div class='add'>+                     "space prohibited before semicolon\n" . $herecurr) &amp;&amp;</div><div class='add'>+                $fix) {</div><div class='add'>+                1 while $fixed[$linenr - 1] =~</div><div class='add'>+                    s/^(\+.*\S)\s+;/$1;/;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+# check for multiple assignments</div><div class='add'>+        if ($line =~ /^.\s*$Lval\s*=\s*$Lval\s*=(?!=)/) {</div><div class='add'>+            CHK("MULTIPLE_ASSIGNMENTS",</div><div class='add'>+                "multiple assignments should be avoided\n" . $herecurr);</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+## # check for multiple declarations, allowing for a function declaration</div><div class='add'>+## # continuation.</div><div class='add'>+##              if ($line =~ /^.\s*$Type\s+$Ident(?:\s*=[^,{]*)?\s*,\s*$Ident.*/ &amp;&amp;</div><div class='add'>+##                  $line !~ /^.\s*$Type\s+$Ident(?:\s*=[^,{]*)?\s*,\s*$Type\s*$Ident.*/) {</div><div class='add'>+##</div><div class='add'>+##                      # Remove any bracketed sections to ensure we do not</div><div class='add'>+##                      # falsly report the parameters of functions.</div><div class='add'>+##                      my $ln = $line;</div><div class='add'>+##                      while ($ln =~ s/\([^\(\)]*\)//g) {</div><div class='add'>+##                      }</div><div class='add'>+##                      if ($ln =~ /,/) {</div><div class='add'>+##                              WARN("MULTIPLE_DECLARATION",</div><div class='add'>+##                                   "declaring multiple variables together should be avoided\n" . $herecurr);</div><div class='add'>+##                      }</div><div class='add'>+##              }</div><div class='add'>+</div><div class='add'>+#need space before brace following if, while, etc</div><div class='add'>+        if (($line =~ /\(.*\)\{/ &amp;&amp; $line !~ /\($Type\)\{/) ||</div><div class='add'>+            $line =~ /do\{/) {</div><div class='add'>+            if (ERROR("SPACING",</div><div class='add'>+                      "space required before the open brace '{'\n" . $herecurr) &amp;&amp;</div><div class='add'>+                $fix) {</div><div class='add'>+                $fixed[$linenr - 1] =~ s/^(\+.*(?:do|\)))\{/$1 {/;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+## # check for blank lines before declarations</div><div class='add'>+##              if ($line =~ /^.\t+$Type\s+$Ident(?:\s*=.*)?;/ &amp;&amp;</div><div class='add'>+##                  $prevrawline =~ /^.\s*$/) {</div><div class='add'>+##                      WARN("SPACING",</div><div class='add'>+##                           "No blank lines before declarations\n" . $hereprev);</div><div class='add'>+##              }</div><div class='add'>+##</div><div class='add'>+</div><div class='add'>+# closing brace should have a space following it when it has anything</div><div class='add'>+# on the line</div><div class='add'>+        if ($line =~ /}(?!(?:,|;|\)))\S/) {</div><div class='add'>+            if (ERROR("SPACING",</div><div class='add'>+                      "space required after that close brace '}'\n" . $herecurr) &amp;&amp;</div><div class='add'>+                $fix) {</div><div class='add'>+                $fixed[$linenr - 1] =~</div><div class='add'>+                    s/}((?!(?:,|;|\)))\S)/} $1/;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+# check spacing on square brackets</div><div class='add'>+        if ($line =~ /\[\s/ &amp;&amp; $line !~ /\[\s*$/) {</div><div class='add'>+            if (ERROR("SPACING",</div><div class='add'>+                      "space prohibited after that open square bracket '['\n" . $herecurr) &amp;&amp;</div><div class='add'>+                $fix) {</div><div class='add'>+                $fixed[$linenr - 1] =~</div><div class='add'>+                    s/\[\s+/\[/;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+        if ($line =~ /\s\]/) {</div><div class='add'>+            if (ERROR("SPACING",</div><div class='add'>+                      "space prohibited before that close square bracket ']'\n" . $herecurr) &amp;&amp;</div><div class='add'>+                $fix) {</div><div class='add'>+                $fixed[$linenr - 1] =~</div><div class='add'>+                    s/\s+\]/\]/;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+# check spacing on parentheses</div><div class='add'>+        if ($line =~ /\(\s/ &amp;&amp; $line !~ /\(\s*(?:\\)?$/ &amp;&amp;</div><div class='add'>+            $line !~ /for\s*\(\s+;/) {</div><div class='add'>+            if (ERROR("SPACING",</div><div class='add'>+                      "space prohibited after that open parenthesis '('\n" . $herecurr) &amp;&amp;</div><div class='add'>+                $fix) {</div><div class='add'>+                $fixed[$linenr - 1] =~</div><div class='add'>+                    s/\(\s+/\(/;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+        if ($line =~ /(\s+)\)/ &amp;&amp; $line !~ /^.\s*\)/ &amp;&amp;</div><div class='add'>+            $line !~ /for\s*\(.*;\s+\)/ &amp;&amp;</div><div class='add'>+            $line !~ /:\s+\)/) {</div><div class='add'>+            if (ERROR("SPACING",</div><div class='add'>+                      "space prohibited before that close parenthesis ')'\n" . $herecurr) &amp;&amp;</div><div class='add'>+                $fix) {</div><div class='add'>+                $fixed[$linenr - 1] =~</div><div class='add'>+                    s/\s+\)/\)/;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+#goto labels aren't indented, allow a single space however</div><div class='add'>+        if ($line=~/^.\s+[A-Za-z\d_]+:(?![0-9]+)/ and</div><div class='add'>+            !($line=~/^. [A-Za-z\d_]+:/) and !($line=~/^.\s+default:/)) {</div><div class='add'>+            if (WARN("INDENTED_LABEL",</div><div class='add'>+                     "labels should not be indented\n" . $herecurr) &amp;&amp;</div><div class='add'>+                $fix) {</div><div class='add'>+                $fixed[$linenr - 1] =~</div><div class='add'>+                    s/^(.)\s+/$1/;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+# return is not a function</div><div class='add'>+        if (defined($stat) &amp;&amp; $stat =~ /^.\s*return(\s*)\(/s) {</div><div class='add'>+            my $spacing = $1;</div><div class='add'>+            if ($^V &amp;&amp; $^V ge 5.10.0 &amp;&amp;</div><div class='add'>+                $stat =~ /^.\s*return\s*($balanced_parens)\s*;\s*$/) {</div><div class='add'>+                my $value = $1;</div><div class='add'>+                $value = deparenthesize($value);</div><div class='add'>+                if ($value =~ m/^\s*$FuncArg\s*(?:\?|$)/) {</div><div class='add'>+                    ERROR("RETURN_PARENTHESES",</div><div class='add'>+                          "return is not a function, parentheses are not required\n" . $herecurr);</div><div class='add'>+                }</div><div class='add'>+            } elsif ($spacing !~ /\s+/) {</div><div class='add'>+                ERROR("SPACING",</div><div class='add'>+                      "space required before the open parenthesis '('\n" . $herecurr);</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+# unnecessary return in a void function</div><div class='add'>+# at end-of-function, with the previous line a single leading tab, then return;</div><div class='add'>+# and the line before that not a goto label target like "out:"</div><div class='add'>+        if ($sline =~ /^[ \+]}\s*$/ &amp;&amp;</div><div class='add'>+            $prevline =~ /^\+\treturn\s*;\s*$/ &amp;&amp;</div><div class='add'>+            $linenr &gt;= 3 &amp;&amp;</div><div class='add'>+            $lines[$linenr - 3] =~ /^[ +]/ &amp;&amp;</div><div class='add'>+            $lines[$linenr - 3] !~ /^[ +]\s*$Ident\s*:/) {</div><div class='add'>+            WARN("RETURN_VOID",</div><div class='add'>+                 "void function return statements are not generally useful\n" . $hereprev);</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+# if statements using unnecessary parentheses - ie: if ((foo == bar))</div><div class='add'>+        if ($^V &amp;&amp; $^V ge 5.10.0 &amp;&amp;</div><div class='add'>+            $line =~ /\bif\s*((?:\(\s*){2,})/) {</div><div class='add'>+            my $openparens = $1;</div><div class='add'>+            my $count = $openparens =~ tr@\(@\(@;</div><div class='add'>+            my $msg = "";</div><div class='add'>+            if ($line =~ /\bif\s*(?:\(\s*){$count,$count}$LvalOrFunc\s*($Compare)\s*$LvalOrFunc(?:\s*\)){$count,$count}/) {</div><div class='add'>+                my $comp = $4;  #Not $1 because of $LvalOrFunc</div><div class='add'>+                $msg = " - maybe == should be = ?" if ($comp eq "==");</div><div class='add'>+                WARN("UNNECESSARY_PARENTHESES",</div><div class='add'>+                     "Unnecessary parentheses$msg\n" . $herecurr);</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+# Return of what appears to be an errno should normally be -'ve</div><div class='add'>+        if ($line =~ /^.\s*return\s*(E[A-Z]*)\s*;/) {</div><div class='add'>+            my $name = $1;</div><div class='add'>+            if ($name ne 'EOF' &amp;&amp; $name ne 'ERROR') {</div><div class='add'>+                WARN("USE_NEGATIVE_ERRNO",</div><div class='add'>+                     "return of an errno should typically be -ve (return -$1)\n" . $herecurr);</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+# Need a space before open parenthesis after if, while etc</div><div class='add'>+        if ($line =~ /\b(if|while|for|switch)\(/) {</div><div class='add'>+            if (ERROR("SPACING",</div><div class='add'>+                      "space required before the open parenthesis '('\n" . $herecurr) &amp;&amp;</div><div class='add'>+                $fix) {</div><div class='add'>+                $fixed[$linenr - 1] =~</div><div class='add'>+                    s/\b(if|while|for|switch)\(/$1 \(/;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+# Check for illegal assignment in if conditional -- and check for trailing</div><div class='add'>+# statements after the conditional.</div><div class='add'>+        if ($line =~ /do\s*(?!{)/) {</div><div class='add'>+            ($stat, $cond, $line_nr_next, $remain_next, $off_next) =</div><div class='add'>+                ctx_statement_block($linenr, $realcnt, 0)</div><div class='add'>+                if (!defined $stat);</div><div class='add'>+            my ($stat_next) = ctx_statement_block($line_nr_next,</div><div class='add'>+                                                  $remain_next, $off_next);</div><div class='add'>+            $stat_next =~ s/\n./\n /g;</div><div class='add'>+            ##print "stat&lt;$stat&gt; stat_next&lt;$stat_next&gt;\n";</div><div class='add'>+</div><div class='add'>+            if ($stat_next =~ /^\s*while\b/) {</div><div class='add'>+                # If the statement carries leading newlines,</div><div class='add'>+                # then count those as offsets.</div><div class='add'>+                my ($whitespace) =</div><div class='add'>+                    ($stat_next =~ /^((?:\s*\n[+-])*\s*)/s);</div><div class='add'>+                my $offset =</div><div class='add'>+                    statement_rawlines($whitespace) - 1;</div><div class='add'>+</div><div class='add'>+                $suppress_whiletrailers{$line_nr_next +</div><div class='add'>+                                            $offset} = 1;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+        if (!defined $suppress_whiletrailers{$linenr} &amp;&amp;</div><div class='add'>+            defined($stat) &amp;&amp; defined($cond) &amp;&amp;</div><div class='add'>+            $line =~ /\b(?:if|while|for)\s*\(/ &amp;&amp; $line !~ /^.\s*#/) {</div><div class='add'>+            my ($s, $c) = ($stat, $cond);</div><div class='add'>+</div><div class='add'>+            if ($c =~ /\bif\s*\(.*[^&lt;&gt;!=]=[^=].*/s) {</div><div class='add'>+                ERROR("ASSIGN_IN_IF",</div><div class='add'>+                      "do not use assignment in if condition\n" . $herecurr);</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            # Find out what is on the end of the line after the</div><div class='add'>+            # conditional.</div><div class='add'>+            substr($s, 0, length($c), '');</div><div class='add'>+            $s =~ s/\n.*//g;</div><div class='add'>+            $s =~ s/$;//g;      # Remove any comments</div><div class='add'>+            if (length($c) &amp;&amp; $s !~ /^\s*{?\s*\\*\s*$/ &amp;&amp;</div><div class='add'>+                $c !~ /}\s*while\s*/)</div><div class='add'>+            {</div><div class='add'>+                # Find out how long the conditional actually is.</div><div class='add'>+                my @newlines = ($c =~ /\n/gs);</div><div class='add'>+                my $cond_lines = 1 + $#newlines;</div><div class='add'>+                my $stat_real = '';</div><div class='add'>+</div><div class='add'>+                $stat_real = raw_line($linenr, $cond_lines)</div><div class='add'>+                    . "\n" if ($cond_lines);</div><div class='add'>+                if (defined($stat_real) &amp;&amp; $cond_lines &gt; 1) {</div><div class='add'>+                    $stat_real = "[...]\n$stat_real";</div><div class='add'>+                }</div><div class='add'>+</div><div class='add'>+                ERROR("TRAILING_STATEMENTS",</div><div class='add'>+                      "trailing statements should be on next line\n" . $herecurr . $stat_real);</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+# Check for bitwise tests written as boolean</div><div class='add'>+        if ($line =~ /</div><div class='add'>+                        (?:</div><div class='add'>+                                (?:\[|\(|\&amp;\&amp;|\|\|)</div><div class='add'>+                                \s*0[xX][0-9]+\s*</div><div class='add'>+                                (?:\&amp;\&amp;|\|\|)</div><div class='add'>+                        |</div><div class='add'>+                                (?:\&amp;\&amp;|\|\|)</div><div class='add'>+                                \s*0[xX][0-9]+\s*</div><div class='add'>+                                (?:\&amp;\&amp;|\|\||\)|\])</div><div class='add'>+                        )/x)</div><div class='add'>+        {</div><div class='add'>+            WARN("HEXADECIMAL_BOOLEAN_TEST",</div><div class='add'>+                 "boolean test with hexadecimal, perhaps just 1 \&amp; or \|?\n" . $herecurr);</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+# if and else should not have general statements after it</div><div class='add'>+        if ($line =~ /^.\s*(?:}\s*)?else\b(.*)/) {</div><div class='add'>+            my $s = $1;</div><div class='add'>+            $s =~ s/$;//g;      # Remove any comments</div><div class='add'>+            if ($s !~ /^\s*(?:\sif|(?:{|)\s*\\?\s*$)/) {</div><div class='add'>+                ERROR("TRAILING_STATEMENTS",</div><div class='add'>+                      "trailing statements should be on next line\n" . $herecurr);</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+# if should not continue a brace</div><div class='add'>+        if ($line =~ /}\s*if\b/) {</div><div class='add'>+            ERROR("TRAILING_STATEMENTS",</div><div class='add'>+                  "trailing statements should be on next line\n" .</div><div class='add'>+                  $herecurr);</div><div class='add'>+        }</div><div class='add'>+# case and default should not have general statements after them</div><div class='add'>+        if ($line =~ /^.\s*(?:case\s*.*|default\s*):/g &amp;&amp;</div><div class='add'>+            $line !~ /\G(?:</div><div class='add'>+                        (?:\s*$;*)(?:\s*{)?(?:\s*$;*)(?:\s*\\)?\s*$|</div><div class='add'>+                        \s*return\s+</div><div class='add'>+                    )/xg)</div><div class='add'>+        {</div><div class='add'>+            ERROR("TRAILING_STATEMENTS",</div><div class='add'>+                  "trailing statements should be on next line\n" . $herecurr);</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        # Check for }&lt;nl&gt;else {, these must be at the same</div><div class='add'>+        # indent level to be relevant to each other.</div><div class='add'>+        if ($prevline=~/}\s*$/ and $line=~/^.\s*else\s*/ and</div><div class='add'>+            $previndent == $indent) {</div><div class='add'>+            ERROR("ELSE_AFTER_BRACE",</div><div class='add'>+                  "else should follow close brace '}'\n" . $hereprev);</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        if ($prevline=~/}\s*$/ and $line=~/^.\s*while\s*/ and</div><div class='add'>+            $previndent == $indent) {</div><div class='add'>+            my ($s, $c) = ctx_statement_block($linenr, $realcnt, 0);</div><div class='add'>+</div><div class='add'>+            # Find out what is on the end of the line after the</div><div class='add'>+            # conditional.</div><div class='add'>+            substr($s, 0, length($c), '');</div><div class='add'>+            $s =~ s/\n.*//g;</div><div class='add'>+</div><div class='add'>+            if ($s =~ /^\s*;/) {</div><div class='add'>+                ERROR("WHILE_AFTER_BRACE",</div><div class='add'>+                      "while should follow close brace '}'\n" . $hereprev);</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+#Specific variable tests</div><div class='add'>+        while ($line =~ m{($Constant|$Lval)}g) {</div><div class='add'>+            my $var = $1;</div><div class='add'>+</div><div class='add'>+#gcc binary extension</div><div class='add'>+            if ($var =~ /^$Binary$/) {</div><div class='add'>+                if (WARN("GCC_BINARY_CONSTANT",</div><div class='add'>+                         "Avoid gcc v4.3+ binary constant extension: &lt;$var&gt;\n" . $herecurr) &amp;&amp;</div><div class='add'>+                    $fix) {</div><div class='add'>+                    my $hexval = sprintf("0x%x", oct($var));</div><div class='add'>+                    $fixed[$linenr - 1] =~</div><div class='add'>+                        s/\b$var\b/$hexval/;</div><div class='add'>+                }</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+#CamelCase</div><div class='add'>+            if ($var !~ /^$Constant$/ &amp;&amp;</div><div class='add'>+                $var =~ /[A-Z][a-z]|[a-z][A-Z]/ &amp;&amp;</div><div class='add'>+#Ignore Page&lt;foo&gt; variants</div><div class='add'>+                $var !~ /^(?:Clear|Set|TestClear|TestSet|)Page[A-Z]/ &amp;&amp;</div><div class='add'>+#Ignore SI style variants like nS, mV and dB (ie: max_uV, regulator_min_uA_show)</div><div class='add'>+                $var !~ /^(?:[a-z_]*?)_?[a-z][A-Z](?:_[a-z_]+)?$/) {</div><div class='add'>+                while ($var =~ m{($Ident)}g) {</div><div class='add'>+                    my $word = $1;</div><div class='add'>+                    next if ($word !~ /[A-Z][a-z]|[a-z][A-Z]/);</div><div class='add'>+                    if ($check) {</div><div class='add'>+                        seed_camelcase_includes();</div><div class='add'>+                        if (!$file &amp;&amp; !$camelcase_file_seeded) {</div><div class='add'>+                            seed_camelcase_file($realfile);</div><div class='add'>+                            $camelcase_file_seeded = 1;</div><div class='add'>+                        }</div><div class='add'>+                    }</div><div class='add'>+                    if (!defined $camelcase{$word}) {</div><div class='add'>+                        $camelcase{$word} = 1;</div><div class='add'>+                        CHK("CAMELCASE",</div><div class='add'>+                            "Avoid CamelCase: &lt;$word&gt;\n" . $herecurr);</div><div class='add'>+                    }</div><div class='add'>+                }</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+#no spaces allowed after \ in define</div><div class='add'>+        if ($line =~ /\#\s*define.*\\\s+$/) {</div><div class='add'>+            if (WARN("WHITESPACE_AFTER_LINE_CONTINUATION",</div><div class='add'>+                     "Whitespace after \\ makes next lines useless\n" . $herecurr) &amp;&amp;</div><div class='add'>+                $fix) {</div><div class='add'>+                $fixed[$linenr - 1] =~ s/\s+$//;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+#warn if &lt;asm/foo.h&gt; is #included and &lt;linux/foo.h&gt; is available (uses RAW line)</div><div class='add'>+        if ($tree &amp;&amp; $rawline =~ m{^.\s*\#\s*include\s*\&lt;asm\/(.*)\.h\&gt;}) {</div><div class='add'>+            my $file = "$1.h";</div><div class='add'>+            my $checkfile = "include/linux/$file";</div><div class='add'>+            if (-f "$root/$checkfile" &amp;&amp;</div><div class='add'>+                $realfile ne $checkfile &amp;&amp;</div><div class='add'>+                $1 !~ /$allowed_asm_includes/)</div><div class='add'>+            {</div><div class='add'>+                if ($realfile =~ m{^arch/}) {</div><div class='add'>+                    CHK("ARCH_INCLUDE_LINUX",</div><div class='add'>+                        "Consider using #include &lt;linux/$file&gt; instead of &lt;asm/$file&gt;\n" . $herecurr);</div><div class='add'>+                } else {</div><div class='add'>+                    WARN("INCLUDE_LINUX",</div><div class='add'>+                         "Use #include &lt;linux/$file&gt; instead of &lt;asm/$file&gt;\n" . $herecurr);</div><div class='add'>+                }</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+# multi-statement macros should be enclosed in a do while loop, grab the</div><div class='add'>+# first statement and ensure its the whole macro if its not enclosed</div><div class='add'>+# in a known good container</div><div class='add'>+        if ($realfile !~ m@/vmlinux.lds.h$@ &amp;&amp;</div><div class='add'>+            $line =~ /^.\s*\#\s*define\s*$Ident(\()?/) {</div><div class='add'>+            my $ln = $linenr;</div><div class='add'>+            my $cnt = $realcnt;</div><div class='add'>+            my ($off, $dstat, $dcond, $rest);</div><div class='add'>+            my $ctx = '';</div><div class='add'>+            ($dstat, $dcond, $ln, $cnt, $off) =</div><div class='add'>+                ctx_statement_block($linenr, $realcnt, 0);</div><div class='add'>+            $ctx = $dstat;</div><div class='add'>+            #print "dstat&lt;$dstat&gt; dcond&lt;$dcond&gt; cnt&lt;$cnt&gt; off&lt;$off&gt;\n";</div><div class='add'>+            #print "LINE&lt;$lines[$ln-1]&gt; len&lt;" . length($lines[$ln-1]) . "\n";</div><div class='add'>+</div><div class='add'>+            $dstat =~ s/^.\s*\#\s*define\s+$Ident(?:\([^\)]*\))?\s*//;</div><div class='add'>+            $dstat =~ s/$;//g;</div><div class='add'>+            $dstat =~ s/\\\n.//g;</div><div class='add'>+            $dstat =~ s/^\s*//s;</div><div class='add'>+            $dstat =~ s/\s*$//s;</div><div class='add'>+</div><div class='add'>+            # Flatten any parentheses and braces</div><div class='add'>+            while ($dstat =~ s/\([^\(\)]*\)/1/ ||</div><div class='add'>+                   $dstat =~ s/\{[^\{\}]*\}/1/ ||</div><div class='add'>+                   $dstat =~ s/\[[^\[\]]*\]/1/)</div><div class='add'>+            {</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            # Flatten any obvious string concatentation.</div><div class='add'>+            while ($dstat =~ s/("X*")\s*$Ident/$1/ ||</div><div class='add'>+                   $dstat =~ s/$Ident\s*("X*")/$1/)</div><div class='add'>+            {</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            my $exceptions = qr{</div><div class='add'>+                                $Declare|</div><div class='add'>+                                module_param_named|</div><div class='add'>+                                MODULE_PARM_DESC|</div><div class='add'>+                                DECLARE_PER_CPU|</div><div class='add'>+                                DEFINE_PER_CPU|</div><div class='add'>+                                __typeof__\(|</div><div class='add'>+                                union|</div><div class='add'>+                                struct|</div><div class='add'>+                                \.$Ident\s*=\s*|</div><div class='add'>+                                ^\"|\"$</div><div class='add'>+                        }x;</div><div class='add'>+            #print "REST&lt;$rest&gt; dstat&lt;$dstat&gt; ctx&lt;$ctx&gt;\n";</div><div class='add'>+            if ($dstat ne '' &amp;&amp;</div><div class='add'>+                $dstat !~ /^(?:$Ident|-?$Constant),$/ &amp;&amp;                        # 10, // foo(),</div><div class='add'>+                $dstat !~ /^(?:$Ident|-?$Constant);$/ &amp;&amp;                        # foo();</div><div class='add'>+                $dstat !~ /^[!~-]?(?:$Lval|$Constant)$/ &amp;&amp;              # 10 // foo() // !foo // ~foo // -foo // foo-&gt;bar // foo.bar-&gt;baz</div><div class='add'>+                $dstat !~ /^'X'$/ &amp;&amp;                                    # character constants</div><div class='add'>+                $dstat !~ /$exceptions/ &amp;&amp;</div><div class='add'>+                $dstat !~ /^\.$Ident\s*=/ &amp;&amp;                            # .foo =</div><div class='add'>+                $dstat !~ /^(?:\#\s*$Ident|\#\s*$Constant)\s*$/ &amp;&amp;              # stringification #foo</div><div class='add'>+                $dstat !~ /^do\s*$Constant\s*while\s*$Constant;?$/ &amp;&amp;   # do {...} while (...); // do {...} while (...)</div><div class='add'>+                $dstat !~ /^for\s*$Constant$/ &amp;&amp;                                # for (...)</div><div class='add'>+                $dstat !~ /^for\s*$Constant\s+(?:$Ident|-?$Constant)$/ &amp;&amp;       # for (...) bar()</div><div class='add'>+                $dstat !~ /^do\s*{/ &amp;&amp;                                  # do {...</div><div class='add'>+                $dstat !~ /^\(\{/ &amp;&amp;                                             # ({...</div><div class='add'>+                $ctx !~ /^.\s*#\s*define\s+TRACE_(?:SYSTEM|INCLUDE_FILE|INCLUDE_PATH)\b/)</div><div class='add'>+            {</div><div class='add'>+                $ctx =~ s/\n*$//;</div><div class='add'>+                my $herectx = $here . "\n";</div><div class='add'>+                my $cnt = statement_rawlines($ctx);</div><div class='add'>+</div><div class='add'>+                for (my $n = 0; $n &lt; $cnt; $n++) {</div><div class='add'>+                    $herectx .= raw_line($linenr, $n) . "\n";</div><div class='add'>+                }</div><div class='add'>+</div><div class='add'>+                if ($dstat =~ /;/) {</div><div class='add'>+                    ERROR("MULTISTATEMENT_MACRO_USE_DO_WHILE",</div><div class='add'>+                          "Macros with multiple statements should be enclosed in a do - while loop\n" . "$herectx");</div><div class='add'>+                } else {</div><div class='add'>+                    ERROR("COMPLEX_MACRO",</div><div class='add'>+                          "Macros with complex values should be enclosed in parenthesis\n" . "$herectx");</div><div class='add'>+                }</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+# check for line continuations outside of #defines, preprocessor #, and asm</div><div class='add'>+</div><div class='add'>+        } else {</div><div class='add'>+            if ($prevline !~ /^..*\\$/ &amp;&amp;</div><div class='add'>+                $line !~ /^\+\s*\#.*\\$/ &amp;&amp;             # preprocessor</div><div class='add'>+                $line !~ /^\+.*\b(__asm__|asm)\b.*\\$/ &amp;&amp;       # asm</div><div class='add'>+                $line =~ /^\+.*\\$/) {</div><div class='add'>+                WARN("LINE_CONTINUATIONS",</div><div class='add'>+                     "Avoid unnecessary line continuations\n" . $herecurr);</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+# do {} while (0) macro tests:</div><div class='add'>+# single-statement macros do not need to be enclosed in do while (0) loop,</div><div class='add'>+# macro should not end with a semicolon</div><div class='add'>+        if ($^V &amp;&amp; $^V ge 5.10.0 &amp;&amp;</div><div class='add'>+            $realfile !~ m@/vmlinux.lds.h$@ &amp;&amp;</div><div class='add'>+            $line =~ /^.\s*\#\s*define\s+$Ident(\()?/) {</div><div class='add'>+            my $ln = $linenr;</div><div class='add'>+            my $cnt = $realcnt;</div><div class='add'>+            my ($off, $dstat, $dcond, $rest);</div><div class='add'>+            my $ctx = '';</div><div class='add'>+            ($dstat, $dcond, $ln, $cnt, $off) =</div><div class='add'>+                ctx_statement_block($linenr, $realcnt, 0);</div><div class='add'>+            $ctx = $dstat;</div><div class='add'>+</div><div class='add'>+            $dstat =~ s/\\\n.//g;</div><div class='add'>+</div><div class='add'>+            if ($dstat =~ /^\+\s*#\s*define\s+$Ident\s*${balanced_parens}\s*do\s*{(.*)\s*}\s*while\s*\(\s*0\s*\)\s*([;\s]*)\s*$/) {</div><div class='add'>+                my $stmts = $2;</div><div class='add'>+                my $semis = $3;</div><div class='add'>+</div><div class='add'>+                $ctx =~ s/\n*$//;</div><div class='add'>+                my $cnt = statement_rawlines($ctx);</div><div class='add'>+                my $herectx = $here . "\n";</div><div class='add'>+</div><div class='add'>+                for (my $n = 0; $n &lt; $cnt; $n++) {</div><div class='add'>+                    $herectx .= raw_line($linenr, $n) . "\n";</div><div class='add'>+                }</div><div class='add'>+</div><div class='add'>+                if (($stmts =~ tr/;/;/) == 1 &amp;&amp;</div><div class='add'>+                    $stmts !~ /^\s*(if|while|for|switch)\b/) {</div><div class='add'>+                    WARN("SINGLE_STATEMENT_DO_WHILE_MACRO",</div><div class='add'>+                         "Single statement macros should not use a do {} while (0) loop\n" . "$herectx");</div><div class='add'>+                }</div><div class='add'>+                if (defined $semis &amp;&amp; $semis ne "") {</div><div class='add'>+                    WARN("DO_WHILE_MACRO_WITH_TRAILING_SEMICOLON",</div><div class='add'>+                         "do {} while (0) macros should not be semicolon terminated\n" . "$herectx");</div><div class='add'>+                }</div><div class='add'>+            } elsif ($dstat =~ /^\+\s*#\s*define\s+$Ident.*;\s*$/) {</div><div class='add'>+                $ctx =~ s/\n*$//;</div><div class='add'>+                my $cnt = statement_rawlines($ctx);</div><div class='add'>+                my $herectx = $here . "\n";</div><div class='add'>+</div><div class='add'>+                for (my $n = 0; $n &lt; $cnt; $n++) {</div><div class='add'>+                    $herectx .= raw_line($linenr, $n) . "\n";</div><div class='add'>+                }</div><div class='add'>+</div><div class='add'>+                WARN("TRAILING_SEMICOLON",</div><div class='add'>+                     "macros should not use a trailing semicolon\n" . "$herectx");</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+# make sure symbols are always wrapped with VMLINUX_SYMBOL() ...</div><div class='add'>+# all assignments may have only one of the following with an assignment:</div><div class='add'>+#       .</div><div class='add'>+#       ALIGN(...)</div><div class='add'>+#       VMLINUX_SYMBOL(...)</div><div class='add'>+        if ($realfile eq 'vmlinux.lds.h' &amp;&amp; $line =~ /(?:(?:^|\s)$Ident\s*=|=\s*$Ident(?:\s|$))/) {</div><div class='add'>+            WARN("MISSING_VMLINUX_SYMBOL",</div><div class='add'>+                 "vmlinux.lds.h needs VMLINUX_SYMBOL() around C-visible symbols\n" . $herecurr);</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+# check for redundant bracing round if etc</div><div class='add'>+        if ($line =~ /(^.*)\bif\b/ &amp;&amp; $1 !~ /else\s*$/) {</div><div class='add'>+            my ($level, $endln, @chunks) =</div><div class='add'>+                ctx_statement_full($linenr, $realcnt, 1);</div><div class='add'>+            #print "chunks&lt;$#chunks&gt; linenr&lt;$linenr&gt; endln&lt;$endln&gt; level&lt;$level&gt;\n";</div><div class='add'>+            #print "APW: &lt;&lt;$chunks[1][0]&gt;&gt;&lt;&lt;$chunks[1][1]&gt;&gt;\n";</div><div class='add'>+            if ($#chunks &gt; 0 &amp;&amp; $level == 0) {</div><div class='add'>+                my @allowed = ();</div><div class='add'>+                my $allow = 0;</div><div class='add'>+                my $seen = 0;</div><div class='add'>+                my $herectx = $here . "\n";</div><div class='add'>+                my $ln = $linenr - 1;</div><div class='add'>+                for my $chunk (@chunks) {</div><div class='add'>+                    my ($cond, $block) = @{$chunk};</div><div class='add'>+</div><div class='add'>+                    # If the condition carries leading newlines, then count those as offsets.</div><div class='add'>+                    my ($whitespace) = ($cond =~ /^((?:\s*\n[+-])*\s*)/s);</div><div class='add'>+                    my $offset = statement_rawlines($whitespace) - 1;</div><div class='add'>+</div><div class='add'>+                    $allowed[$allow] = 0;</div><div class='add'>+                    #print "COND&lt;$cond&gt; whitespace&lt;$whitespace&gt; offset&lt;$offset&gt;\n";</div><div class='add'>+</div><div class='add'>+                    # We have looked at and allowed this specific line.</div><div class='add'>+                    $suppress_ifbraces{$ln + $offset} = 1;</div><div class='add'>+</div><div class='add'>+                    $herectx .= "$rawlines[$ln + $offset]\n[...]\n";</div><div class='add'>+                    $ln += statement_rawlines($block) - 1;</div><div class='add'>+</div><div class='add'>+                    substr($block, 0, length($cond), '');</div><div class='add'>+</div><div class='add'>+                    $seen++ if ($block =~ /^\s*{/);</div><div class='add'>+</div><div class='add'>+                    #print "cond&lt;$cond&gt; block&lt;$block&gt; allowed&lt;$allowed[$allow]&gt;\n";</div><div class='add'>+                    if (statement_lines($cond) &gt; 1) {</div><div class='add'>+                        #print "APW: ALLOWED: cond&lt;$cond&gt;\n";</div><div class='add'>+                        $allowed[$allow] = 1;</div><div class='add'>+                    }</div><div class='add'>+                    if ($block =~/\b(?:if|for|while)\b/) {</div><div class='add'>+                        #print "APW: ALLOWED: block&lt;$block&gt;\n";</div><div class='add'>+                        $allowed[$allow] = 1;</div><div class='add'>+                    }</div><div class='add'>+                    if (statement_block_size($block) &gt; 1) {</div><div class='add'>+                        #print "APW: ALLOWED: lines block&lt;$block&gt;\n";</div><div class='add'>+                        $allowed[$allow] = 1;</div><div class='add'>+                    }</div><div class='add'>+                    $allow++;</div><div class='add'>+                }</div><div class='add'>+                if ($seen) {</div><div class='add'>+                    my $sum_allowed = 0;</div><div class='add'>+                    foreach (@allowed) {</div><div class='add'>+                        $sum_allowed += $_;</div><div class='add'>+                    }</div><div class='add'>+                    if ($sum_allowed != 0 &amp;&amp; $sum_allowed != $allow</div><div class='add'>+		    			  &amp;&amp; $seen != $allow) {</div><div class='add'>+                        CHK("BRACES",</div><div class='add'>+                            "braces {} should be used on all arms of this statement\n" . $herectx);</div><div class='add'>+                    }</div><div class='add'>+                }</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+        if (!defined $suppress_ifbraces{$linenr - 1} &amp;&amp;</div><div class='add'>+            $line =~ /\b(if|while|for|else)\b/) {</div><div class='add'>+            my $allowed = 0;</div><div class='add'>+</div><div class='add'>+            # Check the pre-context.</div><div class='add'>+            if (substr($line, 0, $-[0]) =~ /(\}\s*)$/) {</div><div class='add'>+                #print "APW: ALLOWED: pre&lt;$1&gt;\n";</div><div class='add'>+                $allowed = 1;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            my ($level, $endln, @chunks) =</div><div class='add'>+                ctx_statement_full($linenr, $realcnt, $-[0]);</div><div class='add'>+</div><div class='add'>+            # Check the condition.</div><div class='add'>+            my ($cond, $block) = @{$chunks[0]};</div><div class='add'>+            #print "CHECKING&lt;$linenr&gt; cond&lt;$cond&gt; block&lt;$block&gt;\n";</div><div class='add'>+            if (defined $cond) {</div><div class='add'>+                substr($block, 0, length($cond), '');</div><div class='add'>+            }</div><div class='add'>+            if (statement_lines($cond) &gt; 1) {</div><div class='add'>+                #print "APW: ALLOWED: cond&lt;$cond&gt;\n";</div><div class='add'>+                $allowed = 1;</div><div class='add'>+            }</div><div class='add'>+            if ($block =~/\b(?:if|for|while)\b/) {</div><div class='add'>+                #print "APW: ALLOWED: block&lt;$block&gt;\n";</div><div class='add'>+                $allowed = 1;</div><div class='add'>+            }</div><div class='add'>+            if (statement_block_size($block) &gt; 1) {</div><div class='add'>+                #print "APW: ALLOWED: lines block&lt;$block&gt;\n";</div><div class='add'>+                $allowed = 1;</div><div class='add'>+            }</div><div class='add'>+            # Check the post-context.</div><div class='add'>+            if (defined $chunks[1]) {</div><div class='add'>+                my ($cond, $block) = @{$chunks[1]};</div><div class='add'>+                if (defined $cond) {</div><div class='add'>+                    substr($block, 0, length($cond), '');</div><div class='add'>+                }</div><div class='add'>+                if ($block =~ /^\s*\{/) {</div><div class='add'>+                    #print "APW: ALLOWED: chunk-1 block&lt;$block&gt;\n";</div><div class='add'>+                    $allowed = 1;</div><div class='add'>+                }</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+# check for unnecessary blank lines around braces</div><div class='add'>+        if (($line =~ /^.\s*}\s*$/ &amp;&amp; $prevrawline =~ /^.\s*$/)) {</div><div class='add'>+            CHK("BRACES",</div><div class='add'>+                "Blank lines aren't necessary before a close brace '}'\n" . $hereprev);</div><div class='add'>+        }</div><div class='add'>+        if (($rawline =~ /^.\s*$/ &amp;&amp; $prevline =~ /^..*{\s*$/)) {</div><div class='add'>+            CHK("BRACES",</div><div class='add'>+                "Blank lines aren't necessary after an open brace '{'\n" . $hereprev);</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+# no volatiles please</div><div class='add'>+        my $asm_volatile = qr{\b(__asm__|asm)\s+(__volatile__|volatile)\b};</div><div class='add'>+        if ($line =~ /\bvolatile\b/ &amp;&amp; $line !~ /$asm_volatile/) {</div><div class='add'>+            WARN("VOLATILE",</div><div class='add'>+                 "Use of volatile is usually wrong: see Documentation/volatile-considered-harmful.txt\n" . $herecurr);</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+# warn about #if 0</div><div class='add'>+        if ($line =~ /^.\s*\#\s*if\s+0\b/) {</div><div class='add'>+            CHK("REDUNDANT_CODE",</div><div class='add'>+                "if this code is redundant consider removing it\n" .</div><div class='add'>+                $herecurr);</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+# check for needless "if (&lt;foo&gt;) fn(&lt;foo&gt;)" uses</div><div class='add'>+        if ($prevline =~ /\bif\s*\(\s*($Lval)\s*\)/) {</div><div class='add'>+            my $expr = '\s*\(\s*' . quotemeta($1) . '\s*\)\s*;';</div><div class='add'>+            if ($line =~ /\b(kfree|usb_free_urb|debugfs_remove(?:_recursive)?)$expr/) {</div><div class='add'>+                WARN('NEEDLESS_IF',</div><div class='add'>+                     "$1(NULL) is safe this check is probably not required\n" . $hereprev);</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+# check for bad placement of section $InitAttribute (e.g.: __initdata)</div><div class='add'>+        if ($line =~ /(\b$InitAttribute\b)/) {</div><div class='add'>+            my $attr = $1;</div><div class='add'>+            if ($line =~ /^\+\s*static\s+(?:const\s+)?(?:$attr\s+)?($NonptrTypeWithAttr)\s+(?:$attr\s+)?($Ident(?:\[[^]]*\])?)\s*[=;]/) {</div><div class='add'>+                my $ptr = $1;</div><div class='add'>+                my $var = $2;</div><div class='add'>+                if ((($ptr =~ /\b(union|struct)\s+$attr\b/ &amp;&amp;</div><div class='add'>+                      ERROR("MISPLACED_INIT",</div><div class='add'>+                            "$attr should be placed after $var\n" . $herecurr)) ||</div><div class='add'>+                     ($ptr !~ /\b(union|struct)\s+$attr\b/ &amp;&amp;</div><div class='add'>+                      WARN("MISPLACED_INIT",</div><div class='add'>+                           "$attr should be placed after $var\n" . $herecurr))) &amp;&amp;</div><div class='add'>+                    $fix) {</div><div class='add'>+                    $fixed[$linenr - 1] =~ s/(\bstatic\s+(?:const\s+)?)(?:$attr\s+)?($NonptrTypeWithAttr)\s+(?:$attr\s+)?($Ident(?:\[[^]]*\])?)\s*([=;])\s*/"$1" . trim(string_find_replace($2, "\\s*$attr\\s*", " ")) . " " . trim(string_find_replace($3, "\\s*$attr\\s*", "")) . " $attr" . ("$4" eq ";" ? ";" : " = ")/e;</div><div class='add'>+                }</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+# check for $InitAttributeData (ie: __initdata) with const</div><div class='add'>+        if ($line =~ /\bconst\b/ &amp;&amp; $line =~ /($InitAttributeData)/) {</div><div class='add'>+            my $attr = $1;</div><div class='add'>+            $attr =~ /($InitAttributePrefix)(.*)/;</div><div class='add'>+            my $attr_prefix = $1;</div><div class='add'>+            my $attr_type = $2;</div><div class='add'>+            if (ERROR("INIT_ATTRIBUTE",</div><div class='add'>+                      "Use of const init definition must use ${attr_prefix}initconst\n" . $herecurr) &amp;&amp;</div><div class='add'>+                $fix) {</div><div class='add'>+                $fixed[$linenr - 1] =~</div><div class='add'>+                    s/$InitAttributeData/${attr_prefix}initconst/;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+# check for $InitAttributeConst (ie: __initconst) without const</div><div class='add'>+        if ($line !~ /\bconst\b/ &amp;&amp; $line =~ /($InitAttributeConst)/) {</div><div class='add'>+            my $attr = $1;</div><div class='add'>+            if (ERROR("INIT_ATTRIBUTE",</div><div class='add'>+                      "Use of $attr requires a separate use of const\n" . $herecurr) &amp;&amp;</div><div class='add'>+                $fix) {</div><div class='add'>+                my $lead = $fixed[$linenr - 1] =~</div><div class='add'>+                    /(^\+\s*(?:static\s+))/;</div><div class='add'>+                $lead = rtrim($1);</div><div class='add'>+                $lead = "$lead " if ($lead !~ /^\+$/);</div><div class='add'>+                $lead = "${lead}const ";</div><div class='add'>+                $fixed[$linenr - 1] =~ s/(^\+\s*(?:static\s+))/$lead/;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+# don't use __constant_&lt;foo&gt; functions outside of include/uapi/</div><div class='add'>+        if ($realfile !~ m@^include/uapi/@ &amp;&amp;</div><div class='add'>+            $line =~ /(__constant_(?:htons|ntohs|[bl]e(?:16|32|64)_to_cpu|cpu_to_[bl]e(?:16|32|64)))\s*\(/) {</div><div class='add'>+            my $constant_func = $1;</div><div class='add'>+            my $func = $constant_func;</div><div class='add'>+            $func =~ s/^__constant_//;</div><div class='add'>+            if (WARN("CONSTANT_CONVERSION",</div><div class='add'>+                     "$constant_func should be $func\n" . $herecurr) &amp;&amp;</div><div class='add'>+                $fix) {</div><div class='add'>+                $fixed[$linenr - 1] =~ s/\b$constant_func\b/$func/g;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+# prefer usleep_range over udelay</div><div class='add'>+        if ($line =~ /\budelay\s*\(\s*(\d+)\s*\)/) {</div><div class='add'>+            my $delay = $1;</div><div class='add'>+            # ignore udelay's &lt; 10, however</div><div class='add'>+            if (! ($delay &lt; 10) ) {</div><div class='add'>+                CHK("USLEEP_RANGE",</div><div class='add'>+                    "usleep_range is preferred over udelay; see Documentation/timers/timers-howto.txt\n" . $herecurr);</div><div class='add'>+            }</div><div class='add'>+            if ($delay &gt; 2000) {</div><div class='add'>+                WARN("LONG_UDELAY",</div><div class='add'>+                     "long udelay - prefer mdelay; see arch/arm/include/asm/delay.h\n" . $herecurr);</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+# warn about unexpectedly long msleep's</div><div class='add'>+        if ($line =~ /\bmsleep\s*\((\d+)\);/) {</div><div class='add'>+            if ($1 &lt; 20) {</div><div class='add'>+                WARN("MSLEEP",</div><div class='add'>+                     "msleep &lt; 20ms can sleep for up to 20ms; see Documentation/timers/timers-howto.txt\n" . $herecurr);</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+# check for comparisons of jiffies</div><div class='add'>+        if ($line =~ /\bjiffies\s*$Compare|$Compare\s*jiffies\b/) {</div><div class='add'>+            WARN("JIFFIES_COMPARISON",</div><div class='add'>+                 "Comparing jiffies is almost always wrong; prefer time_after, time_before and friends\n" . $herecurr);</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+# check for comparisons of get_jiffies_64()</div><div class='add'>+        if ($line =~ /\bget_jiffies_64\s*\(\s*\)\s*$Compare|$Compare\s*get_jiffies_64\s*\(\s*\)/) {</div><div class='add'>+            WARN("JIFFIES_COMPARISON",</div><div class='add'>+                 "Comparing get_jiffies_64() is almost always wrong; prefer time_after64, time_before64 and friends\n" . $herecurr);</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+# warn about spacing in #ifdefs</div><div class='add'>+        if ($line =~ /^.\s*\#\s*(ifdef|ifndef|elif)\s\s+/) {</div><div class='add'>+            if (ERROR("SPACING",</div><div class='add'>+                      "exactly one space required after that #$1\n" . $herecurr) &amp;&amp;</div><div class='add'>+                $fix) {</div><div class='add'>+                $fixed[$linenr - 1] =~</div><div class='add'>+                    s/^(.\s*\#\s*(ifdef|ifndef|elif))\s{2,}/$1 /;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+# check for spinlock_t definitions without a comment.</div><div class='add'>+        if ($line =~ /^.\s*(struct\s+mutex|spinlock_t)\s+\S+;/ ||</div><div class='add'>+            $line =~ /^.\s*(DEFINE_MUTEX)\s*\(/) {</div><div class='add'>+            my $which = $1;</div><div class='add'>+            if (!ctx_has_comment($first_line, $linenr)) {</div><div class='add'>+                CHK("UNCOMMENTED_DEFINITION",</div><div class='add'>+                    "$1 definition without comment\n" . $herecurr);</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+# check for memory barriers without a comment.</div><div class='add'>+        if ($line =~ /\b(mb|rmb|wmb|read_barrier_depends|smp_mb|smp_rmb|smp_wmb|smp_read_barrier_depends)\(/) {</div><div class='add'>+            if (!ctx_has_comment($first_line, $linenr)) {</div><div class='add'>+                WARN("MEMORY_BARRIER",</div><div class='add'>+                     "memory barrier without comment\n" . $herecurr);</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+# check of hardware specific defines</div><div class='add'>+        if ($line =~ m@^.\s*\#\s*if.*\b(__i386__|__powerpc64__|__sun__|__s390x__)\b@ &amp;&amp; $realfile !~ m@include/asm-@) {</div><div class='add'>+            CHK("ARCH_DEFINES",</div><div class='add'>+                "architecture specific defines should be avoided\n" .  $herecurr);</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+# Check that the storage class is at the beginning of a declaration</div><div class='add'>+        if ($line =~ /\b$Storage\b/ &amp;&amp; $line !~ /^.\s*$Storage\b/) {</div><div class='add'>+            WARN("STORAGE_CLASS",</div><div class='add'>+                 "storage class should be at the beginning of the declaration\n" . $herecurr)</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+# check the location of the inline attribute, that it is between</div><div class='add'>+# storage class and type.</div><div class='add'>+        if ($line =~ /\b$Type\s+$Inline\b/ ||</div><div class='add'>+            $line =~ /\b$Inline\s+$Storage\b/) {</div><div class='add'>+            ERROR("INLINE_LOCATION",</div><div class='add'>+                  "inline keyword should sit between storage class and type\n" . $herecurr);</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+# Check for __inline__ and __inline, prefer inline</div><div class='add'>+        if ($realfile !~ m@\binclude/uapi/@ &amp;&amp;</div><div class='add'>+            $line =~ /\b(__inline__|__inline)\b/) {</div><div class='add'>+            if (WARN("INLINE",</div><div class='add'>+                     "plain inline is preferred over $1\n" . $herecurr) &amp;&amp;</div><div class='add'>+                $fix) {</div><div class='add'>+                $fixed[$linenr - 1] =~ s/\b(__inline__|__inline)\b/inline/;</div><div class='add'>+</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+# Check for __attribute__ packed, prefer __packed</div><div class='add'>+        if ($realfile !~ m@\binclude/uapi/@ &amp;&amp;</div><div class='add'>+            $line =~ /\b__attribute__\s*\(\s*\(.*\bpacked\b/) {</div><div class='add'>+            WARN("PREFER_PACKED",</div><div class='add'>+                 "__packed is preferred over __attribute__((packed))\n" . $herecurr);</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+# Check for __attribute__ aligned, prefer __aligned</div><div class='add'>+        if ($realfile !~ m@\binclude/uapi/@ &amp;&amp;</div><div class='add'>+            $line =~ /\b__attribute__\s*\(\s*\(.*aligned/) {</div><div class='add'>+            WARN("PREFER_ALIGNED",</div><div class='add'>+                 "__aligned(size) is preferred over __attribute__((aligned(size)))\n" . $herecurr);</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+# Check for __attribute__ format(printf, prefer __printf</div><div class='add'>+        if ($realfile !~ m@\binclude/uapi/@ &amp;&amp;</div><div class='add'>+            $line =~ /\b__attribute__\s*\(\s*\(\s*format\s*\(\s*printf/) {</div><div class='add'>+            if (WARN("PREFER_PRINTF",</div><div class='add'>+                     "__printf(string-index, first-to-check) is preferred over __attribute__((format(printf, string-index, first-to-check)))\n" . $herecurr) &amp;&amp;</div><div class='add'>+                $fix) {</div><div class='add'>+                $fixed[$linenr - 1] =~ s/\b__attribute__\s*\(\s*\(\s*format\s*\(\s*printf\s*,\s*(.*)\)\s*\)\s*\)/"__printf(" . trim($1) . ")"/ex;</div><div class='add'>+</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+# Check for __attribute__ format(scanf, prefer __scanf</div><div class='add'>+        if ($realfile !~ m@\binclude/uapi/@ &amp;&amp;</div><div class='add'>+            $line =~ /\b__attribute__\s*\(\s*\(\s*format\s*\(\s*scanf\b/) {</div><div class='add'>+            if (WARN("PREFER_SCANF",</div><div class='add'>+                     "__scanf(string-index, first-to-check) is preferred over __attribute__((format(scanf, string-index, first-to-check)))\n" . $herecurr) &amp;&amp;</div><div class='add'>+                $fix) {</div><div class='add'>+                $fixed[$linenr - 1] =~ s/\b__attribute__\s*\(\s*\(\s*format\s*\(\s*scanf\s*,\s*(.*)\)\s*\)\s*\)/"__scanf(" . trim($1) . ")"/ex;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+# check for sizeof(&amp;)</div><div class='add'>+        if ($line =~ /\bsizeof\s*\(\s*\&amp;/) {</div><div class='add'>+            WARN("SIZEOF_ADDRESS",</div><div class='add'>+                 "sizeof(&amp; should be avoided\n" . $herecurr);</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+# check for sizeof without parenthesis</div><div class='add'>+        if ($line =~ /\bsizeof\s+((?:\*\s*|)$Lval|$Type(?:\s+$Lval|))/) {</div><div class='add'>+            if (WARN("SIZEOF_PARENTHESIS",</div><div class='add'>+                     "sizeof $1 should be sizeof($1)\n" . $herecurr) &amp;&amp;</div><div class='add'>+                $fix) {</div><div class='add'>+                $fixed[$linenr - 1] =~ s/\bsizeof\s+((?:\*\s*|)$Lval|$Type(?:\s+$Lval|))/"sizeof(" . trim($1) . ")"/ex;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+# check for line continuations in quoted strings with odd counts of "</div><div class='add'>+        if ($rawline =~ /\\$/ &amp;&amp; $rawline =~ tr/"/"/ % 2) {</div><div class='add'>+            WARN("LINE_CONTINUATIONS",</div><div class='add'>+                 "Avoid line continuations in quoted strings\n" . $herecurr);</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+# check for struct spinlock declarations</div><div class='add'>+        if ($line =~ /^.\s*\bstruct\s+spinlock\s+\w+\s*;/) {</div><div class='add'>+            WARN("USE_SPINLOCK_T",</div><div class='add'>+                 "struct spinlock should be spinlock_t\n" . $herecurr);</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+# check for seq_printf uses that could be seq_puts</div><div class='add'>+        if ($sline =~ /\bseq_printf\s*\(.*"\s*\)\s*;\s*$/) {</div><div class='add'>+            my $fmt = get_quoted_string($line, $rawline);</div><div class='add'>+            if ($fmt ne "" &amp;&amp; $fmt !~ /[^\\]\%/) {</div><div class='add'>+                if (WARN("PREFER_SEQ_PUTS",</div><div class='add'>+                         "Prefer seq_puts to seq_printf\n" . $herecurr) &amp;&amp;</div><div class='add'>+                    $fix) {</div><div class='add'>+                    $fixed[$linenr - 1] =~ s/\bseq_printf\b/seq_puts/;</div><div class='add'>+                }</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+# Check for misused memsets</div><div class='add'>+        if ($^V &amp;&amp; $^V ge 5.10.0 &amp;&amp;</div><div class='add'>+            defined $stat &amp;&amp;</div><div class='add'>+            $stat =~ /^\+(?:.*?)\bmemset\s*\(\s*$FuncArg\s*,\s*$FuncArg\s*\,\s*$FuncArg\s*\)/s) {</div><div class='add'>+</div><div class='add'>+            my $ms_addr = $2;</div><div class='add'>+            my $ms_val = $7;</div><div class='add'>+            my $ms_size = $12;</div><div class='add'>+</div><div class='add'>+            if ($ms_size =~ /^(0x|)0$/i) {</div><div class='add'>+                ERROR("MEMSET",</div><div class='add'>+                      "memset to 0's uses 0 as the 2nd argument, not the 3rd\n" . "$here\n$stat\n");</div><div class='add'>+            } elsif ($ms_size =~ /^(0x|)1$/i) {</div><div class='add'>+                WARN("MEMSET",</div><div class='add'>+                     "single byte memset is suspicious. Swapped 2nd/3rd argument?\n" . "$here\n$stat\n");</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+# typecasts on min/max could be min_t/max_t</div><div class='add'>+        if ($^V &amp;&amp; $^V ge 5.10.0 &amp;&amp;</div><div class='add'>+            defined $stat &amp;&amp;</div><div class='add'>+            $stat =~ /^\+(?:.*?)\b(min|max)\s*\(\s*$FuncArg\s*,\s*$FuncArg\s*\)/) {</div><div class='add'>+            if (defined $2 || defined $7) {</div><div class='add'>+                my $call = $1;</div><div class='add'>+                my $cast1 = deparenthesize($2);</div><div class='add'>+                my $arg1 = $3;</div><div class='add'>+                my $cast2 = deparenthesize($7);</div><div class='add'>+                my $arg2 = $8;</div><div class='add'>+                my $cast;</div><div class='add'>+</div><div class='add'>+                if ($cast1 ne "" &amp;&amp; $cast2 ne "" &amp;&amp; $cast1 ne $cast2) {</div><div class='add'>+                    $cast = "$cast1 or $cast2";</div><div class='add'>+                } elsif ($cast1 ne "") {</div><div class='add'>+                    $cast = $cast1;</div><div class='add'>+                } else {</div><div class='add'>+                    $cast = $cast2;</div><div class='add'>+                }</div><div class='add'>+                WARN("MINMAX",</div><div class='add'>+                     "$call() should probably be ${call}_t($cast, $arg1, $arg2)\n" . "$here\n$stat\n");</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+# check usleep_range arguments</div><div class='add'>+        if ($^V &amp;&amp; $^V ge 5.10.0 &amp;&amp;</div><div class='add'>+            defined $stat &amp;&amp;</div><div class='add'>+            $stat =~ /^\+(?:.*?)\busleep_range\s*\(\s*($FuncArg)\s*,\s*($FuncArg)\s*\)/) {</div><div class='add'>+            my $min = $1;</div><div class='add'>+            my $max = $7;</div><div class='add'>+            if ($min eq $max) {</div><div class='add'>+                WARN("USLEEP_RANGE",</div><div class='add'>+                     "usleep_range should not use min == max args; see Documentation/timers/timers-howto.txt\n" . "$here\n$stat\n");</div><div class='add'>+            } elsif ($min =~ /^\d+$/ &amp;&amp; $max =~ /^\d+$/ &amp;&amp;</div><div class='add'>+                     $min &gt; $max) {</div><div class='add'>+                WARN("USLEEP_RANGE",</div><div class='add'>+                     "usleep_range args reversed, use min then max; see Documentation/timers/timers-howto.txt\n" . "$here\n$stat\n");</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+# check for naked sscanf</div><div class='add'>+        if ($^V &amp;&amp; $^V ge 5.10.0 &amp;&amp;</div><div class='add'>+            defined $stat &amp;&amp;</div><div class='add'>+            $line =~ /\bsscanf\b/ &amp;&amp;</div><div class='add'>+            ($stat !~ /$Ident\s*=\s*sscanf\s*$balanced_parens/ &amp;&amp;</div><div class='add'>+             $stat !~ /\bsscanf\s*$balanced_parens\s*(?:$Compare)/ &amp;&amp;</div><div class='add'>+             $stat !~ /(?:$Compare)\s*\bsscanf\s*$balanced_parens/)) {</div><div class='add'>+            my $lc = $stat =~ tr@\n@@;</div><div class='add'>+            $lc = $lc + $linenr;</div><div class='add'>+            my $stat_real = raw_line($linenr, 0);</div><div class='add'>+            for (my $count = $linenr + 1; $count &lt;= $lc; $count++) {</div><div class='add'>+                $stat_real = $stat_real . "\n" . raw_line($count, 0);</div><div class='add'>+            }</div><div class='add'>+            WARN("NAKED_SSCANF",</div><div class='add'>+                 "unchecked sscanf return value\n" . "$here\n$stat_real\n");</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+# check for simple sscanf that should be kstrto&lt;foo&gt;</div><div class='add'>+        if ($^V &amp;&amp; $^V ge 5.10.0 &amp;&amp;</div><div class='add'>+            defined $stat &amp;&amp;</div><div class='add'>+            $line =~ /\bsscanf\b/) {</div><div class='add'>+            my $lc = $stat =~ tr@\n@@;</div><div class='add'>+            $lc = $lc + $linenr;</div><div class='add'>+            my $stat_real = raw_line($linenr, 0);</div><div class='add'>+            for (my $count = $linenr + 1; $count &lt;= $lc; $count++) {</div><div class='add'>+                $stat_real = $stat_real . "\n" . raw_line($count, 0);</div><div class='add'>+            }</div><div class='add'>+            if ($stat_real =~ /\bsscanf\b\s*\(\s*$FuncArg\s*,\s*("[^"]+")/) {</div><div class='add'>+                my $format = $6;</div><div class='add'>+                my $count = $format =~ tr@%@%@;</div><div class='add'>+                if ($count == 1 &amp;&amp;</div><div class='add'>+                    $format =~ /^"\%(?i:ll[udxi]|[udxi]ll|ll|[hl]h?[udxi]|[udxi][hl]h?|[hl]h?|[udxi])"$/) {</div><div class='add'>+                    WARN("SSCANF_TO_KSTRTO",</div><div class='add'>+                         "Prefer kstrto&lt;type&gt; to single variable sscanf\n" . "$here\n$stat_real\n");</div><div class='add'>+                }</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+# check for new externs in .h files.</div><div class='add'>+        if ($realfile =~ /\.h$/ &amp;&amp;</div><div class='add'>+            $line =~ /^\+\s*(extern\s+)$Type\s*$Ident\s*\(/s) {</div><div class='add'>+            if (CHK("AVOID_EXTERNS",</div><div class='add'>+                    "extern prototypes should be avoided in .h files\n" . $herecurr) &amp;&amp;</div><div class='add'>+                $fix) {</div><div class='add'>+                $fixed[$linenr - 1] =~ s/(.*)\bextern\b\s*(.*)/$1$2/;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+# check for new externs in .c files.</div><div class='add'>+        if ($realfile =~ /\.c$/ &amp;&amp; defined $stat &amp;&amp;</div><div class='add'>+            $stat =~ /^.\s*(?:extern\s+)?$Type\s+($Ident)(\s*)\(/s)</div><div class='add'>+        {</div><div class='add'>+            my $function_name = $1;</div><div class='add'>+            my $paren_space = $2;</div><div class='add'>+</div><div class='add'>+            my $s = $stat;</div><div class='add'>+            if (defined $cond) {</div><div class='add'>+                substr($s, 0, length($cond), '');</div><div class='add'>+            }</div><div class='add'>+            if ($s =~ /^\s*;/ &amp;&amp;</div><div class='add'>+                $function_name ne 'uninitialized_var')</div><div class='add'>+            {</div><div class='add'>+                WARN("AVOID_EXTERNS",</div><div class='add'>+                     "externs should be avoided in .c files\n" .  $herecurr);</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            if ($paren_space =~ /\n/) {</div><div class='add'>+                WARN("FUNCTION_ARGUMENTS",</div><div class='add'>+                     "arguments for function declarations should follow identifier\n" . $herecurr);</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+        } elsif ($realfile =~ /\.c$/ &amp;&amp; defined $stat &amp;&amp;</div><div class='add'>+                 $stat =~ /^.\s*extern\s+/)</div><div class='add'>+        {</div><div class='add'>+            WARN("AVOID_EXTERNS",</div><div class='add'>+                 "externs should be avoided in .c files\n" .  $herecurr);</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+# check for pointless casting of kmalloc return</div><div class='add'>+        if ($line =~ /\*\s*\)\s*[kv][czm]alloc(_node){0,1}\b/) {</div><div class='add'>+            WARN("UNNECESSARY_CASTS",</div><div class='add'>+                 "unnecessary cast may hide bugs, see http://c-faq.com/malloc/mallocnocast.html\n" . $herecurr);</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+# alloc style</div><div class='add'>+# p = alloc(sizeof(struct foo), ...) should be p = alloc(sizeof(*p), ...)</div><div class='add'>+        if ($^V &amp;&amp; $^V ge 5.10.0 &amp;&amp;</div><div class='add'>+            $line =~ /\b($Lval)\s*\=\s*(?:$balanced_parens)?\s*([kv][mz]alloc(?:_node)?)\s*\(\s*(sizeof\s*\(\s*struct\s+$Lval\s*\))/) {</div><div class='add'>+            CHK("ALLOC_SIZEOF_STRUCT",</div><div class='add'>+                "Prefer $3(sizeof(*$1)...) over $3($4...)\n" . $herecurr);</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+# check for multiple semicolons</div><div class='add'>+        if ($line =~ /;\s*;\s*$/) {</div><div class='add'>+            if (WARN("ONE_SEMICOLON",</div><div class='add'>+                     "Statements terminations use 1 semicolon\n" . $herecurr) &amp;&amp;</div><div class='add'>+                $fix) {</div><div class='add'>+                $fixed[$linenr - 1] =~ s/(\s*;\s*){2,}$/;/g;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+# check for case / default statements not preceeded by break/fallthrough/switch</div><div class='add'>+        if ($line =~ /^.\s*(?:case\s+(?:$Ident|$Constant)\s*|default):/) {</div><div class='add'>+            my $has_break = 0;</div><div class='add'>+            my $has_statement = 0;</div><div class='add'>+            my $count = 0;</div><div class='add'>+            my $prevline = $linenr;</div><div class='add'>+            while ($prevline &gt; 1 &amp;&amp; $count &lt; 3 &amp;&amp; !$has_break) {</div><div class='add'>+                $prevline--;</div><div class='add'>+                my $rline = $rawlines[$prevline - 1];</div><div class='add'>+                my $fline = $lines[$prevline - 1];</div><div class='add'>+                last if ($fline =~ /^\@\@/);</div><div class='add'>+                next if ($fline =~ /^\-/);</div><div class='add'>+                next if ($fline =~ /^.(?:\s*(?:case\s+(?:$Ident|$Constant)[\s$;]*|default):[\s$;]*)*$/);</div><div class='add'>+                $has_break = 1 if ($rline =~ /fall[\s_-]*(through|thru)/i);</div><div class='add'>+                next if ($fline =~ /^.[\s$;]*$/);</div><div class='add'>+                $has_statement = 1;</div><div class='add'>+                $count++;</div><div class='add'>+                $has_break = 1 if ($fline =~ /\bswitch\b|\b(?:break\s*;[\s$;]*$|return\b|goto\b|continue\b)/);</div><div class='add'>+            }</div><div class='add'>+            if (!$has_break &amp;&amp; $has_statement) {</div><div class='add'>+                WARN("MISSING_BREAK",</div><div class='add'>+                     "Possible switch case/default not preceeded by break or fallthrough comment\n" . $herecurr);</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+# check for switch/default statements without a break;</div><div class='add'>+        if ($^V &amp;&amp; $^V ge 5.10.0 &amp;&amp;</div><div class='add'>+            defined $stat &amp;&amp;</div><div class='add'>+            $stat =~ /^\+[$;\s]*(?:case[$;\s]+\w+[$;\s]*:[$;\s]*|)*[$;\s]*\bdefault[$;\s]*:[$;\s]*;/g) {</div><div class='add'>+            my $ctx = '';</div><div class='add'>+            my $herectx = $here . "\n";</div><div class='add'>+            my $cnt = statement_rawlines($stat);</div><div class='add'>+            for (my $n = 0; $n &lt; $cnt; $n++) {</div><div class='add'>+                $herectx .= raw_line($linenr, $n) . "\n";</div><div class='add'>+            }</div><div class='add'>+            WARN("DEFAULT_NO_BREAK",</div><div class='add'>+                 "switch default: should use break\n" . $herectx);</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+# check for comparisons against true and false</div><div class='add'>+        if ($line =~ /\+\s*(.*?)\b(true|false|$Lval)\s*(==|\!=)\s*(true|false|$Lval)\b(.*)$/i) {</div><div class='add'>+            my $lead = $1;</div><div class='add'>+            my $arg = $2;</div><div class='add'>+            my $test = $3;</div><div class='add'>+            my $otype = $4;</div><div class='add'>+            my $trail = $5;</div><div class='add'>+            my $op = "!";</div><div class='add'>+</div><div class='add'>+            ($arg, $otype) = ($otype, $arg) if ($arg =~ /^(?:true|false)$/i);</div><div class='add'>+</div><div class='add'>+            my $type = lc($otype);</div><div class='add'>+            if ($type =~ /^(?:true|false)$/) {</div><div class='add'>+                if (("$test" eq "==" &amp;&amp; "$type" eq "true") ||</div><div class='add'>+                    ("$test" eq "!=" &amp;&amp; "$type" eq "false")) {</div><div class='add'>+                    $op = "";</div><div class='add'>+                }</div><div class='add'>+</div><div class='add'>+                CHK("BOOL_COMPARISON",</div><div class='add'>+                    "Using comparison to $otype is error prone\n" . $herecurr);</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+# check for semaphores initialized locked</div><div class='add'>+        if ($line =~ /^.\s*sema_init.+,\W?0\W?\)/) {</div><div class='add'>+            WARN("CONSIDER_COMPLETION",</div><div class='add'>+                 "consider using a completion\n" . $herecurr);</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+# check for %L{u,d,i} in strings</div><div class='add'>+        my $string;</div><div class='add'>+        while ($line =~ /(?:^|")([X\t]*)(?:"|$)/g) {</div><div class='add'>+            $string = substr($rawline, $-[1], $+[1] - $-[1]);</div><div class='add'>+            $string =~ s/%%/__/g;</div><div class='add'>+            if ($string =~ /(?&lt;!%)%L[udi]/) {</div><div class='add'>+                WARN("PRINTF_L",</div><div class='add'>+                     "\%Ld/%Lu are not-standard C, use %lld/%llu\n" . $herecurr);</div><div class='add'>+                last;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+# Mode permission misuses where it seems decimal should be octal</div><div class='add'>+# This uses a shortcut match to avoid unnecessary uses of a slow foreach loop</div><div class='add'>+        if ($^V &amp;&amp; $^V ge 5.10.0 &amp;&amp;</div><div class='add'>+            $line =~ /$mode_perms_search/) {</div><div class='add'>+            foreach my $entry (@mode_permission_funcs) {</div><div class='add'>+                my $func = $entry-&gt;[0];</div><div class='add'>+                my $arg_pos = $entry-&gt;[1];</div><div class='add'>+</div><div class='add'>+                my $skip_args = "";</div><div class='add'>+                if ($arg_pos &gt; 1) {</div><div class='add'>+                    $arg_pos--;</div><div class='add'>+                    $skip_args = "(?:\\s*$FuncArg\\s*,\\s*){$arg_pos,$arg_pos}";</div><div class='add'>+                }</div><div class='add'>+                my $test = "\\b$func\\s*\\(${skip_args}([\\d]+)\\s*[,\\)]";</div><div class='add'>+                if ($line =~ /$test/) {</div><div class='add'>+                    my $val = $1;</div><div class='add'>+                    $val = $6 if ($skip_args ne "");</div><div class='add'>+</div><div class='add'>+                    if ($val !~ /^0$/ &amp;&amp;</div><div class='add'>+                        (($val =~ /^$Int$/ &amp;&amp; $val !~ /^$Octal$/) ||</div><div class='add'>+                         length($val) ne 4)) {</div><div class='add'>+                        ERROR("NON_OCTAL_PERMISSIONS",</div><div class='add'>+                              "Use 4 digit octal (0777) not decimal permissions\n" . $herecurr);</div><div class='add'>+                    }</div><div class='add'>+                }</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    # If we have no input at all, then there is nothing to report on</div><div class='add'>+    # so just keep quiet.</div><div class='add'>+    if ($#rawlines == -1) {</div><div class='add'>+        exit(0);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    # In mailback mode only produce a report in the negative, for</div><div class='add'>+    # things that appear to be patches.</div><div class='add'>+    if ($mailback &amp;&amp; ($clean == 1 || !$is_patch)) {</div><div class='add'>+        exit(0);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    # This is not a patch, and we are are in 'no-patch' mode so</div><div class='add'>+    # just keep quiet.</div><div class='add'>+    if (!$chk_patch &amp;&amp; !$is_patch) {</div><div class='add'>+        exit(0);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (!$is_patch) {</div><div class='add'>+        ERROR("NOT_UNIFIED_DIFF",</div><div class='add'>+              "Does not appear to be a unified-diff format patch\n");</div><div class='add'>+    }</div><div class='add'>+    if ($is_patch &amp;&amp; $subject_trailing_dot != 0) {</div><div class='add'>+        ERROR("SUBJECT_TRAILING_DOT",</div><div class='add'>+              "The subject of the patch should not end with a dot.\n");</div><div class='add'>+    }</div><div class='add'>+    if ($is_patch &amp;&amp; $chk_signoff &amp;&amp; $signoff == 0) {</div><div class='add'>+        ERROR("MISSING_SIGN_OFF",</div><div class='add'>+              "Missing Signed-off-by: line(s)\n");</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    print report_dump();</div><div class='add'>+    if ($summary &amp;&amp; !($clean == 1 &amp;&amp; $quiet == 1)) {</div><div class='add'>+        print "$filename " if ($summary_file);</div><div class='add'>+        if ($cnt_error &gt; 0) {</div><div class='add'>+            print "Patch not according to coding guidelines! please fix.\n";</div><div class='add'>+            print "total: $cnt_error errors, $cnt_warn warnings, " .</div><div class='add'>+                (($check)? "$cnt_chk checks, " : "") .</div><div class='add'>+                "$cnt_lines lines checked\n"; exit 1;</div><div class='add'>+        } else {</div><div class='add'>+            print "total: $cnt_warn warnings, " .</div><div class='add'>+                (($check)? "$cnt_chk checks, " : "") .</div><div class='add'>+                "$cnt_lines lines checked\n";</div><div class='add'>+            print "Patch found to have warnings, please fix if necessary.\n" if ($cnt_warn &gt; 0);</div><div class='add'>+            exit 2;</div><div class='add'>+        }</div><div class='add'>+        print "\n" if ($quiet == 0);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if ($quiet == 0) {</div><div class='add'>+</div><div class='add'>+        if ($^V lt 5.10.0) {</div><div class='add'>+            print("NOTE: perl $^V is not modern enough to detect all possible issues.\n");</div><div class='add'>+            print("An upgrade to at least perl v5.10.0 is suggested.\n\n");</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        # If there were whitespace errors which cleanpatch can fix</div><div class='add'>+        # then suggest that.</div><div class='add'>+        if ($rpt_cleaners) {</div><div class='add'>+            print "NOTE: whitespace errors detected, you may wish to use scripts/cleanpatch or\n";</div><div class='add'>+            print "      scripts/cleanfile\n\n";</div><div class='add'>+            $rpt_cleaners = 0;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    hash_show_words(\%use_type, "Used");</div><div class='add'>+    hash_show_words(\%ignore_type, "Ignored");</div><div class='add'>+</div><div class='add'>+    if ($clean == 0 &amp;&amp; $fix &amp;&amp; "@rawlines" ne "@fixed") {</div><div class='add'>+        my $newfile = $filename;</div><div class='add'>+        $newfile .= ".EXPERIMENTAL-checkpatch-fixes" if (!$fix_inplace);</div><div class='add'>+        my $linecount = 0;</div><div class='add'>+        my $f;</div><div class='add'>+</div><div class='add'>+        open($f, '&gt;', $newfile)</div><div class='add'>+            or die "$P: Can't open $newfile for write\n";</div><div class='add'>+        foreach my $fixed_line (@fixed) {</div><div class='add'>+            $linecount++;</div><div class='add'>+            if ($file) {</div><div class='add'>+                if ($linecount &gt; 3) {</div><div class='add'>+                    $fixed_line =~ s/^\+//;</div><div class='add'>+                    print $f $fixed_line. "\n";</div><div class='add'>+                }</div><div class='add'>+            } else {</div><div class='add'>+                print $f $fixed_line . "\n";</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+        close($f);</div><div class='add'>+</div><div class='add'>+        if (!$quiet) {</div><div class='add'>+            print &lt;&lt; "EOM";</div><div class='add'>+Wrote EXPERIMENTAL --fix correction(s) to '$newfile'</div><div class='add'>+</div><div class='add'>+Do _NOT_ trust the results written to this file.</div><div class='add'>+Do _NOT_ submit these changes without inspecting them for correctness.</div><div class='add'>+</div><div class='add'>+This EXPERIMENTAL file is simply a convenience to help rewrite patches.</div><div class='add'>+No warranties, expressed or implied...</div><div class='add'>+EOM</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if ($clean == 1 &amp;&amp; $quiet == 0) {</div><div class='add'>+        print "$vname has no obvious style problems and is ready for submission.\n"</div><div class='add'>+    }</div><div class='add'>+    if ($clean == 0 &amp;&amp; $quiet == 0) {</div><div class='add'>+        print &lt;&lt; "EOM";</div><div class='add'>+$vname has style problems, please review.</div><div class='add'>+</div><div class='add'>+If any of these errors are false positives, please report</div><div class='add'>+them to the maintainer, see MAINTAINERS</div><div class='add'>+EOM</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return $clean;</div><div class='add'>+}</div><div class='head'>diff --git a/build-aux/config.guess.dist b/build-aux/config.guess.dist<br/>new file mode 100755<br/>index 00000000000..881ba7a0438<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/build-aux/config.guess.dist?id=d1d7a6f35c816822fab51c820e25023863c239c1'>build-aux/config.guess.dist</a></div><div class='hunk'>@@ -0,0 +1,14 @@</div><div class='add'>+#!/bin/sh</div><div class='add'>+#</div><div class='add'>+# This script is intentionally left empty. Distributions that package GlusterFS</div><div class='add'>+# may want to to replace it with an updated copy from the automake project.</div><div class='add'>+#</div><div class='add'>+</div><div class='add'>+cat &lt;&lt; EOM</div><div class='add'>+It is not expected to execute this script. When you are building from a</div><div class='add'>+released tarball (generated with 'make dist'), you are expected to pass</div><div class='add'>+--build=... and --host=... to ./configure or replace this config.guess script</div><div class='add'>+in the sources with an updated version.</div><div class='add'>+EOM</div><div class='add'>+</div><div class='add'>+exit 0</div><div class='head'>diff --git a/build-aux/config.sub.dist b/build-aux/config.sub.dist<br/>new file mode 100755<br/>index 00000000000..c5a0dbad282<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/build-aux/config.sub.dist?id=d1d7a6f35c816822fab51c820e25023863c239c1'>build-aux/config.sub.dist</a></div><div class='hunk'>@@ -0,0 +1,14 @@</div><div class='add'>+#!/bin/sh</div><div class='add'>+#</div><div class='add'>+# This script is intentionally left empty. Distributions that package GlusterFS</div><div class='add'>+# may want to to replace it with an updated copy from the automake project.</div><div class='add'>+#</div><div class='add'>+</div><div class='add'>+cat &lt;&lt; EOM</div><div class='add'>+It is not expected to execute this script. When you are building from a</div><div class='add'>+released tarball (generated with 'make dist'), you are expected to pass</div><div class='add'>+--build=... and --host=... to ./configure or replace this config.sub script in</div><div class='add'>+the sources with an updated version.</div><div class='add'>+EOM</div><div class='add'>+</div><div class='add'>+exit 0</div><div class='head'>diff --git a/build-aux/pkg-version b/build-aux/pkg-version<br/>new file mode 100755<br/>index 00000000000..17ceab70c03<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/build-aux/pkg-version?id=d1d7a6f35c816822fab51c820e25023863c239c1'>build-aux/pkg-version</a></div><div class='hunk'>@@ -0,0 +1,64 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+# To override version/release from git,</div><div class='add'>+# create VERSION file containing text with version/release</div><div class='add'>+# eg. v3.4.0-1</div><div class='add'>+</div><div class='add'>+# One thing to note, If one does 'git clone --depth N glusterfs.git',</div><div class='add'>+# the git describe command doesn't work. Hence you notice below that</div><div class='add'>+# we have added timestamp as version (YYYY.MM.DD) and release (HH.mmss)</div><div class='add'>+PKG_VERSION=`cat VERSION 2&gt; /dev/null || git describe --tags --match "v[0-9]*" 2&gt;/dev/null`</div><div class='add'>+</div><div class='add'>+get_version()</div><div class='add'>+{</div><div class='add'>+    # tags and output versions:</div><div class='add'>+    #   - v3.4.0   =&gt; 3.4.0 (upstream clean)</div><div class='add'>+    #   - v3.4.0-1 =&gt; 3.4.0 (downstream clean)</div><div class='add'>+    #   - v3.4.0-2-g34e62f   =&gt; 3.4.0 (upstream dirty)</div><div class='add'>+    #   - v3.4.0-1-2-g34e62f =&gt; 3.4.0 (downstream dirty)</div><div class='add'>+    AWK_VERSION='</div><div class='add'>+    BEGIN { FS="-" }</div><div class='add'>+    /^v[0-9]/ {</div><div class='add'>+      sub(/^v/,"") ; print $1</div><div class='add'>+    }'</div><div class='add'>+</div><div class='add'>+    version=$(echo $PKG_VERSION | awk "$AWK_VERSION" | tr -cd '[:alnum:].')</div><div class='add'>+    if [ "x${version}" == "x" ] ; then</div><div class='add'>+       version=$(date +%Y.%m.%d | tr -d '\n')</div><div class='add'>+    fi</div><div class='add'>+    echo $version | tr -d '\n'</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+get_release()</div><div class='add'>+{</div><div class='add'>+    # tags and output releases:</div><div class='add'>+    #   - v3.4.0   =&gt; 0 (upstream clean)</div><div class='add'>+    #   - v3.4.0-1 =&gt; 1 (downstream clean)</div><div class='add'>+    #   - v3.4.0-2-g34e62f1   =&gt; 2.git34e62f1 (upstream dirty)</div><div class='add'>+    #   - v3.4.0-1-2-g34e62f1 =&gt; 1.2.git34e62f1 (downstream dirty)</div><div class='add'>+    AWK_RELEASE='</div><div class='add'>+    BEGIN { FS="-"; OFS="." }</div><div class='add'>+    /^v[0-9]/ {</div><div class='add'>+      if (NF == 1) print 0</div><div class='add'>+      else if (NF == 2) print $2</div><div class='add'>+      else if (NF == 3) print $2, "git" substr($3, 2)</div><div class='add'>+      else if (NF == 4) print $2, $3, "git" substr($4, 2)</div><div class='add'>+    }'</div><div class='add'>+</div><div class='add'>+    release=$(echo $PKG_VERSION | awk "$AWK_RELEASE" | tr -cd '[:alnum:].')</div><div class='add'>+    if [ "x${release}" == "x" ] ; then</div><div class='add'>+       release=$(date +%H.%M%S | tr -d '\n')</div><div class='add'>+    fi</div><div class='add'>+    echo $release | tr -d '\n'</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+if test "x$1" = "x--full"; then</div><div class='add'>+    echo -n "v$(get_version)-$(get_release)"</div><div class='add'>+elif test "x$1" = "x--version"; then</div><div class='add'>+    get_version</div><div class='add'>+elif test "x$1" = "x--release"; then</div><div class='add'>+    get_release</div><div class='add'>+else</div><div class='add'>+    echo "usage: $0 [--full|--version|--release]"</div><div class='add'>+    exit 1</div><div class='add'>+fi</div><div class='head'>diff --git a/cli/src/Makefile.am b/cli/src/Makefile.am<br/>index fbbf44dd080..16063f27c7f 100644<br/>--- a/<a href='/cgit/glusterfs.git/tree/cli/src/Makefile.am?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>cli/src/Makefile.am</a><br/>+++ b/<a href='/cgit/glusterfs.git/tree/cli/src/Makefile.am?id=d1d7a6f35c816822fab51c820e25023863c239c1'>cli/src/Makefile.am</a></div><div class='hunk'>@@ -1,24 +1,37 @@</div><div class='ctx'> sbin_PROGRAMS = gluster</div><div class='ctx'> </div><div class='del'>-gluster_SOURCES = cli.c registry.c input.c cli-cmd.c cli-rl.c \</div><div class='del'>-	 cli-cmd-volume.c cli-cmd-peer.c cli3_1-cops.c cli-cmd-parser.c\</div><div class='del'>-	 cli-cmd-misc.c</div><div class='add'>+gluster_SOURCES = cli.c registry.c input.c cli-cmd.c cli-rl.c cli-cmd-global.c \</div><div class='add'>+	 cli-cmd-volume.c cli-cmd-peer.c cli-rpc-ops.c cli-cmd-parser.c\</div><div class='add'>+	 cli-cmd-system.c cli-cmd-misc.c cli-xml-output.c cli-quotad-client.c cli-cmd-snapshot.c</div><div class='ctx'> </div><div class='del'>-gluster_LDADD = $(top_builddir)/libglusterfs/src/libglusterfs.la $(GF_LDADD)\</div><div class='add'>+gluster_LDADD = $(top_builddir)/libglusterfs/src/libglusterfs.la $(GF_LDADD) \</div><div class='add'>+		$(top_builddir)/libglusterd/src/libglusterd.la \</div><div class='ctx'> 		$(RLLIBS) $(top_builddir)/rpc/xdr/src/libgfxdr.la \</div><div class='del'>-		$(top_builddir)/rpc/rpc-lib/src/libgfrpc.la</div><div class='add'>+		$(top_builddir)/rpc/rpc-lib/src/libgfrpc.la \</div><div class='add'>+		$(XML_LIBS)</div><div class='ctx'> </div><div class='del'>-gluster_LDFLAGS = $(GF_LDFLAGS) $(GF_GLUSTERFS_LDFLAGS)</div><div class='del'>-noinst_HEADERS = cli.h cli-mem-types.h cli-cmd.h</div><div class='add'>+gluster_LDFLAGS = $(GF_LDFLAGS)</div><div class='add'>+noinst_HEADERS = cli.h cli-mem-types.h cli-cmd.h cli-quotad-client.h</div><div class='ctx'> </div><div class='del'>-AM_CFLAGS = -fPIC -Wall -D_FILE_OFFSET_BITS=64 -D_GNU_SOURCE -D$(GF_HOST_OS)\</div><div class='del'>-	-I$(top_srcdir)/libglusterfs/src -I$(top_srcdir)/rpc/rpc-lib/src\</div><div class='del'>-	-I$(top_srcdir)/rpc/xdr/src\</div><div class='add'>+AM_CPPFLAGS = $(GF_CPPFLAGS) \</div><div class='add'>+	-I$(top_srcdir)/libglusterfs/src -I$(top_srcdir)/rpc/rpc-lib/src \</div><div class='add'>+	-I$(top_srcdir)/rpc/xdr/src -I$(top_srcdir)/libglusterd/src \</div><div class='add'>+	-I$(top_builddir)/rpc/xdr/src \</div><div class='ctx'> 	-DDATADIR=\"$(localstatedir)\" \</div><div class='del'>-	-DCONFDIR=\"$(sysconfdir)/glusterfs\" $(GF_GLUSTERFS_CFLAGS)</div><div class='add'>+	-DCONFDIR=\"$(sysconfdir)/glusterfs\" \</div><div class='add'>+	-DGSYNCD_PREFIX=\"$(GLUSTERFS_LIBEXECDIR)\"\</div><div class='add'>+	-DGLFSHEAL_PREFIX=\"$(GLUSTERFS_LIBEXECDIR)\"\</div><div class='add'>+	-DSYNCDAEMON_COMPILE=$(SYNCDAEMON_COMPILE)</div><div class='ctx'> </div><div class='add'>+AM_CFLAGS = -Wall $(GF_CFLAGS) $(XML_CFLAGS)</div><div class='ctx'> </div><div class='ctx'> CLEANFILES =</div><div class='ctx'> </div><div class='ctx'> $(top_builddir)/libglusterfs/src/libglusterfs.la:</div><div class='ctx'> 	$(MAKE) -C $(top_builddir)/libglusterfs/src/ all</div><div class='add'>+</div><div class='add'>+$(top_builddir)/libglusterd/src/libglusterd.la:</div><div class='add'>+	$(MAKE) -C $(top_builddir)/libglusterd/src/ all</div><div class='add'>+</div><div class='add'>+install-data-hook:</div><div class='add'>+	$(mkdir_p) $(DESTDIR)$(localstatedir)/run/gluster</div><div class='head'>diff --git a/cli/src/cli-cmd-global.c b/cli/src/cli-cmd-global.c<br/>new file mode 100644<br/>index 00000000000..2c9a5f01bb1<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/cli/src/cli-cmd-global.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>cli/src/cli-cmd-global.c</a></div><div class='hunk'>@@ -0,0 +1,195 @@</div><div class='add'>+/*</div><div class='add'>+   Copyright (c) 2015 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+   This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+   This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+   General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+   later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+   cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+#include &lt;stdio.h&gt;</div><div class='add'>+#include &lt;string.h&gt;</div><div class='add'>+#include &lt;stdlib.h&gt;</div><div class='add'>+#include &lt;stdint.h&gt;</div><div class='add'>+#include &lt;pthread.h&gt;</div><div class='add'>+</div><div class='add'>+#include &lt;sys/socket.h&gt;</div><div class='add'>+#include &lt;netdb.h&gt;</div><div class='add'>+#include &lt;sys/types.h&gt;</div><div class='add'>+#include &lt;sys/wait.h&gt;</div><div class='add'>+#include &lt;netinet/in.h&gt;</div><div class='add'>+</div><div class='add'>+#include "cli.h"</div><div class='add'>+#include "cli-cmd.h"</div><div class='add'>+#include "cli-mem-types.h"</div><div class='add'>+#include "cli1-xdr.h"</div><div class='add'>+#include &lt;glusterfs/run.h&gt;</div><div class='add'>+#include &lt;glusterfs/syscall.h&gt;</div><div class='add'>+#include &lt;glusterfs/common-utils.h&gt;</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+cli_cmd_global_help_cbk(struct cli_state *state, struct cli_cmd_word *in_word,</div><div class='add'>+                        const char **words, int wordcount);</div><div class='add'>+int</div><div class='add'>+cli_cmd_get_state_cbk(struct cli_state *state, struct cli_cmd_word *word,</div><div class='add'>+                      const char **words, int wordcount);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+cli_cmd_ganesha_cbk(struct cli_state *state, struct cli_cmd_word *word,</div><div class='add'>+                    const char **words, int wordcount);</div><div class='add'>+</div><div class='add'>+struct cli_cmd global_cmds[] = {</div><div class='add'>+    {</div><div class='add'>+        "global help",</div><div class='add'>+        cli_cmd_global_help_cbk,</div><div class='add'>+        "list global commands",</div><div class='add'>+    },</div><div class='add'>+    {</div><div class='add'>+        "get-state [&lt;daemon&gt;] [[odir &lt;/path/to/output/dir/&gt;] "</div><div class='add'>+        "[file &lt;filename&gt;]] [detail|volumeoptions]",</div><div class='add'>+        cli_cmd_get_state_cbk,</div><div class='add'>+        "Get local state representation of mentioned daemon",</div><div class='add'>+    },</div><div class='add'>+    {</div><div class='add'>+        "nfs-ganesha {enable| disable} ",</div><div class='add'>+        cli_cmd_ganesha_cbk,</div><div class='add'>+        "Enable/disable NFS-Ganesha support",</div><div class='add'>+    },</div><div class='add'>+    {NULL, NULL, NULL}};</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+cli_cmd_global_help_cbk(struct cli_state *state, struct cli_cmd_word *in_word,</div><div class='add'>+                        const char **words, int wordcount)</div><div class='add'>+{</div><div class='add'>+    struct cli_cmd *cmd = NULL;</div><div class='add'>+    struct cli_cmd *global_cmd = NULL;</div><div class='add'>+    int count = 0;</div><div class='add'>+</div><div class='add'>+    cmd = GF_MALLOC(sizeof(global_cmds), cli_mt_cli_cmd);</div><div class='add'>+    memcpy(cmd, global_cmds, sizeof(global_cmds));</div><div class='add'>+    count = (sizeof(global_cmds) / sizeof(struct cli_cmd));</div><div class='add'>+    cli_cmd_sort(cmd, count);</div><div class='add'>+</div><div class='add'>+    cli_out("\ngluster global commands");</div><div class='add'>+    cli_out("========================\n");</div><div class='add'>+    for (global_cmd = cmd; global_cmd-&gt;pattern; global_cmd++)</div><div class='add'>+        if (_gf_false == global_cmd-&gt;disable)</div><div class='add'>+            cli_out("%s - %s", global_cmd-&gt;pattern, global_cmd-&gt;desc);</div><div class='add'>+</div><div class='add'>+    cli_out("\n");</div><div class='add'>+    GF_FREE(cmd);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+cli_cmd_global_register(struct cli_state *state)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+    struct cli_cmd *cmd = NULL;</div><div class='add'>+    for (cmd = global_cmds; cmd-&gt;pattern; cmd++) {</div><div class='add'>+        ret = cli_cmd_register(&amp;state-&gt;tree, cmd);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+    }</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+cli_cmd_ganesha_cbk(struct cli_state *state, struct cli_cmd_word *word,</div><div class='add'>+                    const char **words, int wordcount)</div><div class='add'>+</div><div class='add'>+{</div><div class='add'>+    int sent = 0;</div><div class='add'>+    int parse_error = 0;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    rpc_clnt_procedure_t *proc = NULL;</div><div class='add'>+    call_frame_t *frame = NULL;</div><div class='add'>+    dict_t *options = NULL;</div><div class='add'>+    cli_local_t *local = NULL;</div><div class='add'>+    char *op_errstr = NULL;</div><div class='add'>+</div><div class='add'>+    proc = &amp;cli_rpc_prog-&gt;proctable[GLUSTER_CLI_GANESHA];</div><div class='add'>+</div><div class='add'>+    frame = create_frame(THIS, THIS-&gt;ctx-&gt;pool);</div><div class='add'>+    if (!frame)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    ret = cli_cmd_ganesha_parse(state, words, wordcount, &amp;options, &amp;op_errstr);</div><div class='add'>+    if (ret) {</div><div class='add'>+        if (op_errstr) {</div><div class='add'>+            cli_err("%s", op_errstr);</div><div class='add'>+            GF_FREE(op_errstr);</div><div class='add'>+        } else</div><div class='add'>+            cli_usage_out(word-&gt;pattern);</div><div class='add'>+        parse_error = 1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    CLI_LOCAL_INIT(local, words, frame, options);</div><div class='add'>+</div><div class='add'>+    if (proc-&gt;fn) {</div><div class='add'>+        ret = proc-&gt;fn(frame, THIS, options);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (ret) {</div><div class='add'>+        cli_cmd_sent_status_get(&amp;sent);</div><div class='add'>+        if ((sent == 0) &amp;&amp; (parse_error == 0))</div><div class='add'>+            cli_out("Setting global option failed");</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    CLI_STACK_DESTROY(frame);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+cli_cmd_get_state_cbk(struct cli_state *state, struct cli_cmd_word *word,</div><div class='add'>+                      const char **words, int wordcount)</div><div class='add'>+{</div><div class='add'>+    int sent = 0;</div><div class='add'>+    int parse_error = 0;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    rpc_clnt_procedure_t *proc = NULL;</div><div class='add'>+    call_frame_t *frame = NULL;</div><div class='add'>+    dict_t *options = NULL;</div><div class='add'>+    cli_local_t *local = NULL;</div><div class='add'>+    char *op_errstr = NULL;</div><div class='add'>+</div><div class='add'>+    ret = cli_cmd_get_state_parse(state, words, wordcount, &amp;options,</div><div class='add'>+                                  &amp;op_errstr);</div><div class='add'>+</div><div class='add'>+    if (ret) {</div><div class='add'>+        if (op_errstr) {</div><div class='add'>+            cli_err("%s", op_errstr);</div><div class='add'>+            cli_usage_out(word-&gt;pattern);</div><div class='add'>+            GF_FREE(op_errstr);</div><div class='add'>+        } else</div><div class='add'>+            cli_usage_out(word-&gt;pattern);</div><div class='add'>+</div><div class='add'>+        parse_error = 1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    frame = create_frame(THIS, THIS-&gt;ctx-&gt;pool);</div><div class='add'>+    if (!frame) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    CLI_LOCAL_INIT(local, words, frame, options);</div><div class='add'>+</div><div class='add'>+    proc = &amp;cli_rpc_prog-&gt;proctable[GLUSTER_CLI_GET_STATE];</div><div class='add'>+    if (proc-&gt;fn)</div><div class='add'>+        ret = proc-&gt;fn(frame, THIS, options);</div><div class='add'>+out:</div><div class='add'>+    if (ret) {</div><div class='add'>+        cli_cmd_sent_status_get(&amp;sent);</div><div class='add'>+        if ((sent == 0) &amp;&amp; (parse_error == 0))</div><div class='add'>+            cli_out("Getting daemon state failed");</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    CLI_STACK_DESTROY(frame);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='head'>diff --git a/cli/src/cli-cmd-misc.c b/cli/src/cli-cmd-misc.c<br/>index 7833456b730..e961d88da86 100644<br/>--- a/<a href='/cgit/glusterfs.git/tree/cli/src/cli-cmd-misc.c?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>cli/src/cli-cmd-misc.c</a><br/>+++ b/<a href='/cgit/glusterfs.git/tree/cli/src/cli-cmd-misc.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>cli/src/cli-cmd-misc.c</a></div><div class='hunk'>@@ -1,106 +1,117 @@</div><div class='ctx'> /*</div><div class='del'>-  Copyright (c) 2010 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='del'>-  This file is part of GlusterFS.</div><div class='del'>-</div><div class='del'>-  GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-  it under the terms of the GNU Affero General Public License as published</div><div class='del'>-  by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-  or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-  GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-  WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-  Affero General Public License for more details.</div><div class='del'>-</div><div class='del'>-  You should have received a copy of the GNU Affero General Public License</div><div class='del'>-  along with this program.  If not, see</div><div class='del'>-  &lt;http://www.gnu.org/licenses/&gt;.</div><div class='del'>-*/</div><div class='add'>+   Copyright (c) 2010-2012 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+   This file is part of GlusterFS.</div><div class='ctx'> </div><div class='add'>+   This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+   General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+   later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+   cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='ctx'> #include &lt;stdio.h&gt;</div><div class='ctx'> #include &lt;string.h&gt;</div><div class='ctx'> #include &lt;stdlib.h&gt;</div><div class='ctx'> #include &lt;stdint.h&gt;</div><div class='ctx'> #include &lt;pthread.h&gt;</div><div class='ctx'> </div><div class='del'>-#ifndef _CONFIG_H</div><div class='del'>-#define _CONFIG_H</div><div class='del'>-#include "config.h"</div><div class='del'>-#endif</div><div class='del'>-</div><div class='ctx'> #include "cli.h"</div><div class='ctx'> #include "cli-cmd.h"</div><div class='ctx'> #include "cli-mem-types.h"</div><div class='ctx'> #include "protocol-common.h"</div><div class='ctx'> </div><div class='del'>-extern struct rpc_clnt *global_rpc;</div><div class='del'>-</div><div class='del'>-extern rpc_clnt_prog_t *cli_rpc_prog;</div><div class='del'>-</div><div class='ctx'> extern struct cli_cmd volume_cmds[];</div><div class='add'>+extern struct cli_cmd bitrot_cmds[];</div><div class='add'>+extern struct cli_cmd quota_cmds[];</div><div class='ctx'> extern struct cli_cmd cli_probe_cmds[];</div><div class='ctx'> extern struct cli_cmd cli_log_cmds[];</div><div class='add'>+extern struct cli_cmd cli_system_cmds[];</div><div class='add'>+extern struct cli_cmd cli_bd_cmds[];</div><div class='add'>+extern struct cli_cmd snapshot_cmds[];</div><div class='add'>+extern struct cli_cmd global_cmds[];</div><div class='ctx'> struct cli_cmd cli_misc_cmds[];</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-cli_cmd_quit_cbk (struct cli_state *state, struct cli_cmd_word *word,</div><div class='del'>-                   const char **words, int wordcount)</div><div class='add'>+cli_cmd_quit_cbk(struct cli_state *state, struct cli_cmd_word *word,</div><div class='add'>+                 const char **words, int wordcount)</div><div class='ctx'> {</div><div class='del'>-        exit (0);</div><div class='add'>+    exit(0);</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-cli_cmd_display_help (struct cli_state *state, struct cli_cmd_word *in_word,</div><div class='del'>-                      const char **words, int wordcount)</div><div class='add'>+static gf_boolean_t</div><div class='add'>+cli_is_help_command(const char *pattern)</div><div class='ctx'> {</div><div class='del'>-        struct cli_cmd        *cmd = NULL;</div><div class='del'>-</div><div class='del'>-        for (cmd = volume_cmds; cmd-&gt;pattern; cmd++)</div><div class='del'>-                cli_out ("%s - %s", cmd-&gt;pattern, cmd-&gt;desc);</div><div class='del'>-</div><div class='del'>-        for (cmd = cli_probe_cmds; cmd-&gt;pattern; cmd++)</div><div class='del'>-                cli_out ("%s - %s", cmd-&gt;pattern, cmd-&gt;desc);</div><div class='add'>+    /* FixFixFix</div><div class='add'>+     * This is not the best way to determine whether</div><div class='add'>+     * this is a help command</div><div class='add'>+     */</div><div class='add'>+    if (strstr(pattern, "help"))</div><div class='add'>+        return _gf_true;</div><div class='add'>+</div><div class='add'>+    return _gf_false;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        for (cmd = cli_misc_cmds; cmd-&gt;pattern; cmd++) {</div><div class='del'>-                if (cmd-&gt;cbk)</div><div class='del'>-                        cli_out ("%s - %s", cmd-&gt;pattern, cmd-&gt;desc);</div><div class='add'>+int</div><div class='add'>+cli_cmd_display_help(struct cli_state *state, struct cli_cmd_word *in_word,</div><div class='add'>+                     const char **words, int wordcount)</div><div class='add'>+{</div><div class='add'>+    static struct cli_cmd *cmd[] = {</div><div class='add'>+        cli_misc_cmds, cli_probe_cmds, volume_cmds, bitrot_cmds,</div><div class='add'>+        quota_cmds,    snapshot_cmds,  global_cmds, NULL};</div><div class='add'>+    struct cli_cmd *cmd_ind = NULL;</div><div class='add'>+    int i = 0;</div><div class='add'>+    gf_boolean_t list_all = _gf_false;</div><div class='add'>+</div><div class='add'>+    /* cli_system_cmds commands for internal usage</div><div class='add'>+      they are not exposed</div><div class='add'>+    */</div><div class='add'>+</div><div class='add'>+    /* If "help all" */</div><div class='add'>+    if (wordcount == 2)</div><div class='add'>+        list_all = _gf_true;</div><div class='add'>+</div><div class='add'>+    for (i = 0; cmd[i] != NULL; i++) {</div><div class='add'>+        for (cmd_ind = cmd[i]; cmd_ind-&gt;pattern; cmd_ind++) {</div><div class='add'>+            if ((_gf_false == cmd_ind-&gt;disable) &amp;&amp;</div><div class='add'>+                cli_is_help_command(cmd_ind-&gt;pattern)) {</div><div class='add'>+                if (list_all &amp;&amp; (cmd_ind-&gt;cbk)) {</div><div class='add'>+                    cmd_ind-&gt;cbk(state, in_word, words, wordcount);</div><div class='add'>+                } else {</div><div class='add'>+                    cli_out(" %-25s- %s", cmd_ind-&gt;pattern, cmd_ind-&gt;desc);</div><div class='add'>+                }</div><div class='add'>+            }</div><div class='ctx'>         }</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        if (!state-&gt;rl_enabled)</div><div class='del'>-                exit (0);</div><div class='del'>-</div><div class='del'>-        return 0;</div><div class='add'>+    cli_out("\n");</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-struct cli_cmd cli_misc_cmds[] = {</div><div class='del'>-        { "quit",</div><div class='del'>-          cli_cmd_quit_cbk,</div><div class='del'>-          "quit"},</div><div class='del'>-</div><div class='del'>-        { "help",</div><div class='del'>-           cli_cmd_display_help,</div><div class='del'>-           "display command options"},</div><div class='add'>+struct cli_cmd cli_help_cmds[] = {</div><div class='add'>+    {"help [all]", cli_cmd_display_help, "display help for command classes"},</div><div class='ctx'> </div><div class='del'>-        { "mode script",</div><div class='del'>-           NULL,</div><div class='del'>-           "assign gluster execution mode"},</div><div class='add'>+    {NULL, NULL, NULL}};</div><div class='ctx'> </div><div class='del'>-        { NULL, NULL, NULL }</div><div class='del'>-};</div><div class='add'>+struct cli_cmd cli_misc_cmds[] = {{"quit", cli_cmd_quit_cbk, "quit"},</div><div class='add'>+                                  {"exit", cli_cmd_quit_cbk, "exit"},</div><div class='ctx'> </div><div class='add'>+                                  {NULL, NULL, NULL}};</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-cli_cmd_misc_register (struct cli_state *state)</div><div class='add'>+cli_cmd_misc_register(struct cli_state *state)</div><div class='ctx'> {</div><div class='del'>-        int  ret = 0;</div><div class='del'>-        struct cli_cmd *cmd = NULL;</div><div class='del'>-</div><div class='del'>-        for (cmd = cli_misc_cmds; cmd-&gt;pattern; cmd++) {</div><div class='del'>-                ret = cli_cmd_register (&amp;state-&gt;tree, cmd-&gt;pattern, cmd-&gt;cbk,</div><div class='del'>-                                        cmd-&gt;desc);</div><div class='del'>-                if (ret)</div><div class='del'>-                        goto out;</div><div class='del'>-        }</div><div class='add'>+    int ret = 0;</div><div class='add'>+    struct cli_cmd *cmd = NULL;</div><div class='add'>+</div><div class='add'>+    for (cmd = cli_misc_cmds; cmd-&gt;pattern; cmd++) {</div><div class='add'>+        ret = cli_cmd_register(&amp;state-&gt;tree, cmd);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    for (cmd = cli_help_cmds; cmd-&gt;pattern; cmd++) {</div><div class='add'>+        ret = cli_cmd_register(&amp;state-&gt;tree, cmd);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+    }</div><div class='ctx'> out:</div><div class='del'>-        return ret;</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='head'>diff --git a/cli/src/cli-cmd-parser.c b/cli/src/cli-cmd-parser.c<br/>index daec9c8d6e8..34620b4a31b 100644<br/>--- a/<a href='/cgit/glusterfs.git/tree/cli/src/cli-cmd-parser.c?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>cli/src/cli-cmd-parser.c</a><br/>+++ b/<a href='/cgit/glusterfs.git/tree/cli/src/cli-cmd-parser.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>cli/src/cli-cmd-parser.c</a></div><div class='hunk'>@@ -1,925 +1,5946 @@</div><div class='ctx'> /*</div><div class='del'>-  Copyright (c) 2010 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='del'>-  This file is part of GlusterFS.</div><div class='del'>-</div><div class='del'>-  GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-  it under the terms of the GNU Affero General Public License as published</div><div class='del'>-  by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-  or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-  GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-  WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-  Affero General Public License for more details.</div><div class='del'>-</div><div class='del'>-  You should have received a copy of the GNU Affero General Public License</div><div class='del'>-  along with this program.  If not, see</div><div class='del'>-  &lt;http://www.gnu.org/licenses/&gt;.</div><div class='del'>-*/</div><div class='add'>+   Copyright (c) 2010-2013 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+   This file is part of GlusterFS.</div><div class='ctx'> </div><div class='add'>+   This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+   General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+   later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+   cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='ctx'> #include &lt;stdio.h&gt;</div><div class='ctx'> #include &lt;string.h&gt;</div><div class='ctx'> #include &lt;stdlib.h&gt;</div><div class='ctx'> #include &lt;stdint.h&gt;</div><div class='ctx'> #include &lt;pthread.h&gt;</div><div class='del'>-</div><div class='del'>-#ifndef _CONFIG_H</div><div class='del'>-#define _CONFIG_H</div><div class='del'>-#include "config.h"</div><div class='del'>-#endif</div><div class='add'>+#include &lt;fnmatch.h&gt;</div><div class='add'>+#include &lt;time.h&gt;</div><div class='ctx'> </div><div class='ctx'> #include "cli.h"</div><div class='ctx'> #include "cli-cmd.h"</div><div class='ctx'> #include "cli-mem-types.h"</div><div class='del'>-#include "dict.h"</div><div class='add'>+#include &lt;glusterfs/dict.h&gt;</div><div class='add'>+#include &lt;glusterfs/list.h&gt;</div><div class='ctx'> </div><div class='ctx'> #include "protocol-common.h"</div><div class='ctx'> #include "cli1-xdr.h"</div><div class='ctx'> </div><div class='del'>-int32_t</div><div class='del'>-cli_cmd_volume_create_parse (const char **words, int wordcount, dict_t **options)</div><div class='add'>+#define MAX_SNAP_DESCRIPTION_LEN 1024</div><div class='add'>+</div><div class='add'>+static struct snap_config_opt_vals_ snap_confopt_vals[] = {</div><div class='add'>+    {.op_name = "snap-max-hard-limit",</div><div class='add'>+     .question = "Changing snapshot-max-hard-limit "</div><div class='add'>+                 "will limit the creation of new snapshots "</div><div class='add'>+                 "if they exceed the new limit.\n"</div><div class='add'>+                 "Do you want to continue?"},</div><div class='add'>+    {.op_name = "snap-max-soft-limit",</div><div class='add'>+     .question = "If Auto-delete is enabled, snap-max-soft-limit will"</div><div class='add'>+                 " trigger deletion of oldest snapshot, on the "</div><div class='add'>+                 "creation of new snapshot, when the "</div><div class='add'>+                 "snap-max-soft-limit is reached.\n"</div><div class='add'>+                 "Do you want to change the snap-max-soft-limit?"},</div><div class='add'>+    {.op_name = "both",</div><div class='add'>+     .question = "Changing snapshot-max-hard-limit "</div><div class='add'>+                 "will limit the creation of new snapshots "</div><div class='add'>+                 "if they exceed the new snapshot-max-hard-limit.\n"</div><div class='add'>+                 "If Auto-delete is enabled, snap-max-soft-limit will"</div><div class='add'>+                 " trigger deletion of oldest snapshot, on the "</div><div class='add'>+                 "creation of new snapshot, when the "</div><div class='add'>+                 "snap-max-soft-limit is reached.\n"</div><div class='add'>+                 "Do you want to continue?"},</div><div class='add'>+    {</div><div class='add'>+        .op_name = NULL,</div><div class='add'>+    }};</div><div class='add'>+</div><div class='add'>+enum cli_snap_config_set_types {</div><div class='add'>+    GF_SNAP_CONFIG_SET_HARD = 0,</div><div class='add'>+    GF_SNAP_CONFIG_SET_SOFT = 1,</div><div class='add'>+    GF_SNAP_CONFIG_SET_BOTH = 2,</div><div class='add'>+};</div><div class='add'>+typedef enum cli_snap_config_set_types cli_snap_config_set_types;</div><div class='add'>+</div><div class='add'>+typedef struct _cli_brick {</div><div class='add'>+    struct list_head list;</div><div class='add'>+    const char *name;</div><div class='add'>+    int32_t len;</div><div class='add'>+} cli_brick_t;</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+cli_cmd_validate_volume(char *volname);</div><div class='add'>+</div><div class='add'>+static const char *</div><div class='add'>+id_sel(void *wcon)</div><div class='ctx'> {</div><div class='del'>-        dict_t  *dict = NULL;</div><div class='del'>-        char    *volname = NULL;</div><div class='del'>-        char    *delimiter = NULL;</div><div class='del'>-        int     ret = -1;</div><div class='del'>-        gf1_cluster_type type = GF_CLUSTER_TYPE_NONE;</div><div class='del'>-        int     count = 1;</div><div class='del'>-        int     brick_count = 0, brick_index = 0;</div><div class='del'>-        int     brick_list_size = 1;</div><div class='del'>-        char    brick_list[120000] = {0,};</div><div class='del'>-        int     i = 0;</div><div class='del'>-        char    *tmp_list = NULL;</div><div class='del'>-        char    *tmpptr = NULL;</div><div class='del'>-        int     j = 0;</div><div class='del'>-        char    *host_name = NULL;</div><div class='del'>-        char    *tmp = NULL;</div><div class='del'>-        char    *freeptr = NULL;</div><div class='del'>-        char    *trans_type = NULL;</div><div class='del'>-        int32_t index = 0;</div><div class='del'>-</div><div class='del'>-        GF_ASSERT (words);</div><div class='del'>-        GF_ASSERT (options);</div><div class='add'>+    return (const char *)wcon;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        GF_ASSERT ((strcmp (words[0], "volume")) == 0);</div><div class='del'>-        GF_ASSERT ((strcmp (words[1], "create")) == 0);</div><div class='add'>+static char *</div><div class='add'>+str_getunamb(const char *tok, char **opwords)</div><div class='add'>+{</div><div class='add'>+    return (char *)cli_getunamb(tok, (void **)opwords, id_sel);</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        dict = dict_new ();</div><div class='add'>+int32_t</div><div class='add'>+cli_cmd_ta_brick_parse(const char **words, int wordcount, char **ta_brick)</div><div class='add'>+{</div><div class='add'>+    char *host_name = NULL;</div><div class='add'>+    char *tmp_host = NULL;</div><div class='add'>+    char *delimiter = NULL;</div><div class='add'>+    cli_brick_t *brick = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(words);</div><div class='add'>+    GF_ASSERT(wordcount);</div><div class='add'>+</div><div class='add'>+    if (validate_brick_name((char *)words[wordcount - 1])) {</div><div class='add'>+        cli_err(</div><div class='add'>+            "Wrong brick type: %s, use &lt;HOSTNAME&gt;:"</div><div class='add'>+            "&lt;export-dir-abs-path&gt;",</div><div class='add'>+            words[wordcount - 1]);</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    } else {</div><div class='add'>+        delimiter = strrchr(words[wordcount - 1], ':');</div><div class='add'>+        ret = gf_canonicalize_path(delimiter + 1);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    tmp_host = gf_strdup((char *)words[wordcount - 1]);</div><div class='add'>+    if (!tmp_host) {</div><div class='add'>+        gf_log("cli", GF_LOG_ERROR, "Out of memory");</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    get_host_name(tmp_host, &amp;host_name);</div><div class='add'>+    if (!host_name) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        gf_log("cli", GF_LOG_ERROR,</div><div class='add'>+               "Unable to retrieve "</div><div class='add'>+               "hostname");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (!(strcmp(host_name, "localhost") &amp;&amp; strcmp(host_name, "127.0.0.1") &amp;&amp;</div><div class='add'>+          strncmp(host_name, "0.", 2))) {</div><div class='add'>+        cli_err(</div><div class='add'>+            "Please provide a valid hostname/ip other "</div><div class='add'>+            "than localhost, 127.0.0.1 or loopback "</div><div class='add'>+            "address (0.0.0.0 to 0.255.255.255).");</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    if (!valid_internet_address(host_name, _gf_false, _gf_false)) {</div><div class='add'>+        cli_err(</div><div class='add'>+            "internet address '%s' does not conform to "</div><div class='add'>+            "standards",</div><div class='add'>+            host_name);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    brick = GF_MALLOC(sizeof(cli_brick_t), gf_common_list_node);</div><div class='add'>+    if (brick == NULL) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        gf_log("cli", GF_LOG_ERROR, "Out of memory");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    brick-&gt;name = words[wordcount - 1];</div><div class='add'>+    brick-&gt;len = strlen(words[wordcount - 1]);</div><div class='add'>+    *ta_brick = GF_MALLOC(brick-&gt;len + 3, gf_common_mt_char);</div><div class='add'>+    if (*ta_brick == NULL) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        gf_log("cli", GF_LOG_ERROR, "Out of memory");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    strcat(*ta_brick, " ");</div><div class='add'>+    strcat(*ta_brick, brick-&gt;name);</div><div class='add'>+    strcat(*ta_brick, " ");</div><div class='add'>+out:</div><div class='add'>+    if (tmp_host) {</div><div class='add'>+        GF_FREE(tmp_host);</div><div class='add'>+        tmp_host = NULL;</div><div class='add'>+    }</div><div class='add'>+    if (brick) {</div><div class='add'>+        GF_FREE(brick);</div><div class='add'>+        brick = NULL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        if (!dict)</div><div class='add'>+int32_t</div><div class='add'>+cli_cmd_bricks_parse(const char **words, int wordcount, int brick_index,</div><div class='add'>+                     char **bricks, int *brick_count)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+    char *delimiter = NULL;</div><div class='add'>+    char *host_name = NULL;</div><div class='add'>+    char *tmp_host = NULL;</div><div class='add'>+    char *bricks_str = NULL;</div><div class='add'>+    int len = 0;</div><div class='add'>+    int brick_list_len = 1; /* For initial space */</div><div class='add'>+    struct list_head brick_list = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    cli_brick_t *brick = NULL;</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(words);</div><div class='add'>+    GF_ASSERT(wordcount);</div><div class='add'>+    GF_ASSERT(bricks);</div><div class='add'>+    GF_ASSERT(brick_index &gt; 0);</div><div class='add'>+    GF_ASSERT(brick_index &lt; wordcount);</div><div class='add'>+</div><div class='add'>+    INIT_LIST_HEAD(&amp;brick_list);</div><div class='add'>+</div><div class='add'>+    while (brick_index &lt; wordcount) {</div><div class='add'>+        if (validate_brick_name((char *)words[brick_index])) {</div><div class='add'>+            cli_err(</div><div class='add'>+                "Wrong brick type: %s, use &lt;HOSTNAME&gt;:"</div><div class='add'>+                "&lt;export-dir-abs-path&gt;",</div><div class='add'>+                words[brick_index]);</div><div class='add'>+            ret = -1;</div><div class='add'>+            goto out;</div><div class='add'>+        } else {</div><div class='add'>+            delimiter = strrchr(words[brick_index], ':');</div><div class='add'>+            ret = gf_canonicalize_path(delimiter + 1);</div><div class='add'>+            if (ret)</div><div class='ctx'>                 goto out;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-        if (wordcount &lt; 3)</div><div class='add'>+        tmp_host = gf_strdup((char *)words[brick_index]);</div><div class='add'>+        if (!tmp_host) {</div><div class='add'>+            gf_log("cli", GF_LOG_ERROR, "Out of memory");</div><div class='add'>+            ret = -1;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+        get_host_name(tmp_host, &amp;host_name);</div><div class='add'>+        if (!host_name) {</div><div class='add'>+            ret = -1;</div><div class='add'>+            gf_log("cli", GF_LOG_ERROR,</div><div class='add'>+                   "Unable to allocate "</div><div class='add'>+                   "memory");</div><div class='add'>+            GF_FREE(tmp_host);</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        if (!(strcmp(host_name, "localhost") &amp;&amp;</div><div class='add'>+              strcmp(host_name, "127.0.0.1") &amp;&amp; strncmp(host_name, "0.", 2))) {</div><div class='add'>+            cli_err(</div><div class='add'>+                "Please provide a valid hostname/ip other "</div><div class='add'>+                "than localhost, 127.0.0.1 or loopback "</div><div class='add'>+                "address (0.0.0.0 to 0.255.255.255).");</div><div class='add'>+            ret = -1;</div><div class='add'>+            GF_FREE(tmp_host);</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+        if (!valid_internet_address(host_name, _gf_false, _gf_false)) {</div><div class='add'>+            cli_err(</div><div class='add'>+                "internet address '%s' does not conform to "</div><div class='add'>+                "standards",</div><div class='add'>+                host_name);</div><div class='add'>+        }</div><div class='add'>+        GF_FREE(tmp_host);</div><div class='add'>+        list_for_each_entry(brick, &amp;brick_list, list)</div><div class='add'>+        {</div><div class='add'>+            if (strcmp(brick-&gt;name, words[brick_index]) == 0) {</div><div class='add'>+                ret = -1;</div><div class='add'>+                cli_err("Found duplicate exports %s", words[brick_index]);</div><div class='ctx'>                 goto out;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-        volname = (char *)words[2];</div><div class='add'>+        brick = GF_MALLOC(sizeof(cli_brick_t), gf_common_list_node);</div><div class='add'>+        if (brick == NULL) {</div><div class='add'>+            ret = -1;</div><div class='add'>+            gf_log("cli", GF_LOG_ERROR, "Out of memory");</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+        len = strlen(words[brick_index]);</div><div class='add'>+        brick-&gt;name = words[brick_index];</div><div class='add'>+        brick-&gt;len = len;</div><div class='add'>+        list_add_tail(&amp;brick-&gt;list, &amp;brick_list);</div><div class='add'>+</div><div class='add'>+        brick_list_len += len + 1; /* Brick name + space */</div><div class='add'>+        ++(*brick_count);</div><div class='add'>+        ++brick_index;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* If brick count is not valid exit here */</div><div class='add'>+    if (!*brick_count) {</div><div class='add'>+        cli_err("No bricks specified");</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    brick_list_len++; /* For terminating null char */</div><div class='add'>+</div><div class='add'>+    bricks_str = GF_MALLOC(brick_list_len, gf_common_mt_char);</div><div class='add'>+    if (bricks_str == NULL) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        gf_log("cli", GF_LOG_ERROR, "Out of memory");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    *bricks = bricks_str;</div><div class='add'>+    *bricks_str = ' ';</div><div class='add'>+    bricks_str++;</div><div class='add'>+    while (!list_empty(&amp;brick_list)) {</div><div class='add'>+        brick = list_first_entry(&amp;brick_list, cli_brick_t, list);</div><div class='add'>+        list_del_init(&amp;brick-&gt;list);</div><div class='add'>+        memcpy(bricks_str, brick-&gt;name, brick-&gt;len);</div><div class='add'>+        bricks_str[brick-&gt;len] = ' ';</div><div class='add'>+        bricks_str += brick-&gt;len + 1;</div><div class='add'>+        GF_FREE(brick);</div><div class='add'>+    }</div><div class='add'>+    *bricks_str = 0;</div><div class='ctx'> </div><div class='del'>-        GF_ASSERT (volname);</div><div class='add'>+out:</div><div class='add'>+    while (!list_empty(&amp;brick_list)) {</div><div class='add'>+        brick = list_first_entry(&amp;brick_list, cli_brick_t, list);</div><div class='add'>+        list_del_init(&amp;brick-&gt;list);</div><div class='add'>+        GF_FREE(brick);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        /* Validate the volume name here itself */</div><div class='del'>-        {</div><div class='del'>-                if (volname[0] == '-')</div><div class='del'>-                        goto out;</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-                if (!strcmp (volname, "all"))</div><div class='del'>-                        goto out;</div><div class='add'>+int32_t</div><div class='add'>+cli_cmd_create_disperse_check(struct cli_state *state, int *disperse,</div><div class='add'>+                              int *redundancy, int *data, int count)</div><div class='add'>+{</div><div class='add'>+    int i = 0;</div><div class='add'>+    int tmp = 0;</div><div class='add'>+    gf_answer_t answer = GF_ANSWER_NO;</div><div class='add'>+    char question[128];</div><div class='add'>+</div><div class='add'>+    const char *question1 =</div><div class='add'>+        "There isn't an optimal redundancy value "</div><div class='add'>+        "for this configuration. Do you want to "</div><div class='add'>+        "create the volume with redundancy 1 ?";</div><div class='add'>+</div><div class='add'>+    const char *question2 =</div><div class='add'>+        "The optimal redundancy for this "</div><div class='add'>+        "configuration is %d. Do you want to create "</div><div class='add'>+        "the volume with this value ?";</div><div class='add'>+</div><div class='add'>+    const char *question3 =</div><div class='add'>+        "This configuration is not optimal on most "</div><div class='add'>+        "workloads. Do you want to use it ?";</div><div class='add'>+</div><div class='add'>+    const char *question4 =</div><div class='add'>+        "Redundancy for this configuration is %d. "</div><div class='add'>+        "Do you want to create "</div><div class='add'>+        "the volume with this value ?";</div><div class='add'>+</div><div class='add'>+    if (*data &gt; 0) {</div><div class='add'>+        if (*disperse &gt; 0 &amp;&amp; *redundancy &gt; 0) {</div><div class='add'>+            if (*disperse != (*data + *redundancy)) {</div><div class='add'>+                cli_err(</div><div class='add'>+                    "Disperse count(%d) should be equal "</div><div class='add'>+                    "to sum of disperse-data count(%d) and "</div><div class='add'>+                    "redundancy count(%d)",</div><div class='add'>+                    *disperse, *data, *redundancy);</div><div class='add'>+                return -1;</div><div class='add'>+            }</div><div class='add'>+        } else if (*redundancy &gt; 0) {</div><div class='add'>+            *disperse = *data + *redundancy;</div><div class='add'>+        } else if (*disperse &gt; 0) {</div><div class='add'>+            *redundancy = *disperse - *data;</div><div class='add'>+        } else {</div><div class='add'>+            if ((count - *data) &gt;= *data) {</div><div class='add'>+                cli_err(</div><div class='add'>+                    "Please provide redundancy count "</div><div class='add'>+                    "along with disperse-data count");</div><div class='add'>+                return -1;</div><div class='add'>+            } else {</div><div class='add'>+                sprintf(question, question4, count - *data);</div><div class='add'>+                answer = cli_cmd_get_confirmation(state, question);</div><div class='add'>+                if (answer == GF_ANSWER_NO)</div><div class='add'>+                    return -1;</div><div class='add'>+                *redundancy = count - *data;</div><div class='add'>+                *disperse = count;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-                if (strchr (volname, '/'))</div><div class='del'>-                        goto out;</div><div class='add'>+    if (*disperse &lt;= 0) {</div><div class='add'>+        if (count &lt; 3) {</div><div class='add'>+            cli_err(</div><div class='add'>+                "number of bricks must be greater "</div><div class='add'>+                "than 2");</div><div class='add'>+</div><div class='add'>+            return -1;</div><div class='add'>+        }</div><div class='add'>+        *disperse = count;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-                if (strlen (volname) &gt; 512)</div><div class='add'>+    if (*redundancy == -1) {</div><div class='add'>+        tmp = *disperse - 1;</div><div class='add'>+        for (i = tmp / 2; (i &gt; 0) &amp;&amp; ((tmp &amp; -tmp) != tmp); i--, tmp--)</div><div class='add'>+            ;</div><div class='add'>+</div><div class='add'>+        if (i == 0) {</div><div class='add'>+            answer = cli_cmd_get_confirmation(state, question1);</div><div class='add'>+            if (answer == GF_ANSWER_NO)</div><div class='add'>+                return -1;</div><div class='add'>+</div><div class='add'>+            *redundancy = 1;</div><div class='add'>+        } else {</div><div class='add'>+            *redundancy = *disperse - tmp;</div><div class='add'>+            if (*redundancy &gt; 1) {</div><div class='add'>+                sprintf(question, question2, *redundancy);</div><div class='add'>+                answer = cli_cmd_get_confirmation(state, question);</div><div class='add'>+                if (answer == GF_ANSWER_NO)</div><div class='add'>+                    return -1;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        tmp = 0;</div><div class='add'>+    } else {</div><div class='add'>+        tmp = *disperse - *redundancy;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if ((*redundancy &lt; 1) || (*redundancy &gt; (*disperse - 1) / 2)) {</div><div class='add'>+        cli_err(</div><div class='add'>+            "redundancy must be greater than or equal to 1 and "</div><div class='add'>+            "less than %d for a disperse %d volume",</div><div class='add'>+            (*disperse + 1) / 2, *disperse);</div><div class='add'>+</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if ((tmp &amp; -tmp) != tmp) {</div><div class='add'>+        answer = cli_cmd_get_confirmation(state, question3);</div><div class='add'>+        if (answer == GF_ANSWER_NO)</div><div class='add'>+            return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int32_t</div><div class='add'>+cli_validate_disperse_volume(char *word, gf1_cluster_type type,</div><div class='add'>+                             const char **words, int32_t wordcount,</div><div class='add'>+                             int32_t index, int32_t *disperse_count,</div><div class='add'>+                             int32_t *redundancy_count, int32_t *data_count)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    switch (type) {</div><div class='add'>+        case GF_CLUSTER_TYPE_NONE:</div><div class='add'>+        case GF_CLUSTER_TYPE_DISPERSE:</div><div class='add'>+            if (strcmp(word, "disperse") == 0) {</div><div class='add'>+                if (*disperse_count &gt;= 0) {</div><div class='add'>+                    cli_err("disperse option given twice");</div><div class='add'>+                    goto out;</div><div class='add'>+                }</div><div class='add'>+                if (wordcount &lt; (index + 2)) {</div><div class='add'>+                    goto out;</div><div class='add'>+                }</div><div class='add'>+                ret = gf_string2int(words[index + 1], disperse_count);</div><div class='add'>+                if (ret == -1 &amp;&amp; errno == EINVAL) {</div><div class='add'>+                    *disperse_count = 0;</div><div class='add'>+                    ret = 1;</div><div class='add'>+                } else if (ret == -1) {</div><div class='add'>+                    goto out;</div><div class='add'>+                } else {</div><div class='add'>+                    if (*disperse_count &lt; 3) {</div><div class='add'>+                        cli_err(</div><div class='add'>+                            "disperse count must "</div><div class='add'>+                            "be greater than 2");</div><div class='ctx'>                         goto out;</div><div class='add'>+                    }</div><div class='add'>+                    ret = 2;</div><div class='add'>+                }</div><div class='add'>+            } else if (strcmp(word, "disperse-data") == 0) {</div><div class='add'>+                if (*data_count &gt;= 0) {</div><div class='add'>+                    cli_err("disperse-data option given twice");</div><div class='add'>+                    goto out;</div><div class='add'>+                }</div><div class='add'>+                if (wordcount &lt; (index + 2)) {</div><div class='add'>+                    goto out;</div><div class='add'>+                }</div><div class='add'>+                ret = gf_string2int(words[index + 1], data_count);</div><div class='add'>+                if (ret == -1 || *data_count &lt; 2) {</div><div class='add'>+                    cli_err("disperse-data must be greater than 1");</div><div class='add'>+                    goto out;</div><div class='add'>+                }</div><div class='add'>+                ret = 2;</div><div class='add'>+            } else if (strcmp(word, "redundancy") == 0) {</div><div class='add'>+                if (*redundancy_count &gt;= 0) {</div><div class='add'>+                    cli_err("redundancy option given twice");</div><div class='add'>+                    goto out;</div><div class='add'>+                }</div><div class='add'>+                if (wordcount &lt; (index + 2)) {</div><div class='add'>+                    goto out;</div><div class='add'>+                }</div><div class='add'>+                ret = gf_string2int(words[index + 1], redundancy_count);</div><div class='add'>+                if (ret == -1 || *redundancy_count &lt; 1) {</div><div class='add'>+                    cli_err("redundancy must be greater than 0");</div><div class='add'>+                    goto out;</div><div class='add'>+                }</div><div class='add'>+                ret = 2;</div><div class='add'>+            }</div><div class='add'>+            break;</div><div class='add'>+        case GF_CLUSTER_TYPE_REPLICATE:</div><div class='add'>+            cli_err(</div><div class='add'>+                "replicated-dispersed volume is not "</div><div class='add'>+                "supported");</div><div class='add'>+            goto out;</div><div class='add'>+        default:</div><div class='add'>+            cli_err("Invalid type given");</div><div class='add'>+            break;</div><div class='add'>+    }</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-                for (i = 0; i &lt; strlen (volname); i++)</div><div class='del'>-                        if (!isalnum (volname[i]) &amp;&amp; (volname[i] != '_') &amp;&amp; (volname[i] != '-'))</div><div class='del'>-                                goto out;</div><div class='add'>+int32_t</div><div class='add'>+cli_validate_volname(const char *volname)</div><div class='add'>+{</div><div class='add'>+    int32_t ret = -1;</div><div class='add'>+    int32_t i = -1;</div><div class='add'>+    int volname_len;</div><div class='add'>+    static const char *const invalid_volnames[] = {"volume",</div><div class='add'>+                                                   "type",</div><div class='add'>+                                                   "subvolumes",</div><div class='add'>+                                                   "option",</div><div class='add'>+                                                   "end-volume",</div><div class='add'>+                                                   "all",</div><div class='add'>+                                                   "volume_not_in_ring",</div><div class='add'>+                                                   "description",</div><div class='add'>+                                                   "force",</div><div class='add'>+                                                   "snap-max-hard-limit",</div><div class='add'>+                                                   "snap-max-soft-limit",</div><div class='add'>+                                                   "auto-delete",</div><div class='add'>+                                                   "activate-on-create",</div><div class='add'>+                                                   NULL};</div><div class='add'>+</div><div class='add'>+    if (volname[0] == '-')</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; invalid_volnames[i]; i++) {</div><div class='add'>+        if (!strcmp(volname, invalid_volnames[i])) {</div><div class='add'>+            cli_err("\"%s\" cannot be the name of a volume.", volname);</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (strchr(volname, '/'))</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    volname_len = strlen(volname);</div><div class='add'>+    if (volname_len &gt; GD_VOLUME_NAME_MAX) {</div><div class='add'>+        cli_err("Volume name exceeds %d characters.", GD_VOLUME_NAME_MAX);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; volname_len; i++) {</div><div class='add'>+        if (!isalnum(volname[i]) &amp;&amp; (volname[i] != '_') &amp;&amp;</div><div class='add'>+            (volname[i] != '-')) {</div><div class='add'>+            cli_err(</div><div class='add'>+                "Volume name should not contain \"%c\""</div><div class='add'>+                " character.\nVolume names can only"</div><div class='add'>+                "contain alphanumeric, '-' and '_' "</div><div class='add'>+                "characters.",</div><div class='add'>+                volname[i]);</div><div class='add'>+            goto out;</div><div class='ctx'>         }</div><div class='add'>+    }</div><div class='ctx'> </div><div class='add'>+    ret = 0;</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        ret = dict_set_str (dict, "volname", volname);</div><div class='del'>-        if (ret)</div><div class='add'>+int32_t</div><div class='add'>+cli_cmd_volume_create_parse(struct cli_state *state, const char **words,</div><div class='add'>+                            int wordcount, dict_t **options, char **brick_list)</div><div class='add'>+{</div><div class='add'>+    dict_t *dict = NULL;</div><div class='add'>+    char *volname = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    gf1_cluster_type type = GF_CLUSTER_TYPE_NONE;</div><div class='add'>+    int sub_count = 1;</div><div class='add'>+    int brick_index = 0;</div><div class='add'>+    char *trans_type = NULL;</div><div class='add'>+    int32_t index = 0;</div><div class='add'>+    char *bricks = NULL;</div><div class='add'>+    char *ta_brick = NULL;</div><div class='add'>+    int32_t brick_count = 0;</div><div class='add'>+    static char *opwords[] = {"replica",  "stripe",       "transport",</div><div class='add'>+                              "disperse", "redundancy",   "disperse-data",</div><div class='add'>+                              "arbiter",  "thin-arbiter", NULL};</div><div class='add'>+</div><div class='add'>+    char *w = NULL;</div><div class='add'>+    int op_count = 0;</div><div class='add'>+    int32_t replica_count = 1;</div><div class='add'>+    int32_t arbiter_count = 0;</div><div class='add'>+    int32_t thin_arbiter_count = 0;</div><div class='add'>+    int32_t stripe_count = 1;</div><div class='add'>+    int32_t disperse_count = -1;</div><div class='add'>+    int32_t redundancy_count = -1;</div><div class='add'>+    int32_t disperse_data_count = -1;</div><div class='add'>+    gf_boolean_t is_force = _gf_false;</div><div class='add'>+    int wc = wordcount;</div><div class='add'>+    gf_answer_t answer = GF_ANSWER_NO;</div><div class='add'>+    const char *question = NULL;</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(words);</div><div class='add'>+    GF_ASSERT(options);</div><div class='add'>+</div><div class='add'>+    dict = dict_new();</div><div class='add'>+</div><div class='add'>+    if (!dict)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    if (wordcount &lt; 3)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    volname = (char *)words[2];</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(volname);</div><div class='add'>+</div><div class='add'>+    /* Validate the volume name here itself */</div><div class='add'>+    if (cli_validate_volname(volname) &lt; 0)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    if (wordcount &lt; 4) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    type = GF_CLUSTER_TYPE_NONE;</div><div class='add'>+    index = 3;</div><div class='add'>+</div><div class='add'>+    while (op_count &lt; 3) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        w = str_getunamb(words[index], opwords);</div><div class='add'>+        if (!w) {</div><div class='add'>+            break;</div><div class='add'>+        } else if ((strcmp(w, "replica")) == 0) {</div><div class='add'>+            switch (type) {</div><div class='add'>+                case GF_CLUSTER_TYPE_STRIPE_REPLICATE:</div><div class='add'>+                case GF_CLUSTER_TYPE_REPLICATE:</div><div class='add'>+                    cli_err("replica option given twice");</div><div class='add'>+                    goto out;</div><div class='add'>+                case GF_CLUSTER_TYPE_NONE:</div><div class='add'>+                    type = GF_CLUSTER_TYPE_REPLICATE;</div><div class='add'>+                    break;</div><div class='add'>+                case GF_CLUSTER_TYPE_STRIPE:</div><div class='add'>+                    cli_err("stripe option not supported");</div><div class='add'>+                    goto out;</div><div class='add'>+                case GF_CLUSTER_TYPE_DISPERSE:</div><div class='add'>+                    cli_err(</div><div class='add'>+                        "replicated-dispersed volume is not "</div><div class='add'>+                        "supported");</div><div class='add'>+                    goto out;</div><div class='add'>+                default:</div><div class='add'>+                    cli_err("Invalid type given");</div><div class='add'>+                    goto out;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            if (wordcount &lt; (index + 2)) {</div><div class='add'>+                ret = -1;</div><div class='ctx'>                 goto out;</div><div class='add'>+            }</div><div class='ctx'> </div><div class='del'>-        if (wordcount &lt; 4) {</div><div class='add'>+            replica_count = strtol(words[index + 1], NULL, 0);</div><div class='add'>+            if (replica_count &lt; 2) {</div><div class='add'>+                cli_err(</div><div class='add'>+                    "replica count should be greater"</div><div class='add'>+                    " than 1");</div><div class='ctx'>                 ret = -1;</div><div class='ctx'>                 goto out;</div><div class='del'>-        }</div><div class='del'>-        if ((strcasecmp (words[3], "replica")) == 0) {</div><div class='del'>-                type = GF_CLUSTER_TYPE_REPLICATE;</div><div class='del'>-                if (wordcount &lt; 5) {</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            index += 2;</div><div class='add'>+            if (words[index]) {</div><div class='add'>+                if (!strcmp(words[index], "arbiter")) {</div><div class='add'>+                    ret = gf_string2int(words[index + 1], &amp;arbiter_count);</div><div class='add'>+                    if ((ret == -1) || (arbiter_count != 1)) {</div><div class='add'>+                        cli_err(</div><div class='add'>+                            "For arbiter "</div><div class='add'>+                            "configuration, "</div><div class='add'>+                            "replica count must be"</div><div class='add'>+                            " 2 and arbiter count "</div><div class='add'>+                            "must be 1. The 3rd "</div><div class='add'>+                            "brick of the replica "</div><div class='add'>+                            "will be the arbiter");</div><div class='ctx'>                         ret = -1;</div><div class='ctx'>                         goto out;</div><div class='del'>-                }</div><div class='del'>-                count = strtol (words[4], NULL, 0);</div><div class='del'>-                if (!count || (count &lt; 2)) {</div><div class='del'>-                        cli_out ("replica count should be greater than 1");</div><div class='del'>-                        ret = -1;</div><div class='add'>+                    }</div><div class='add'>+                    ret = dict_set_int32(dict, "arbiter-count", arbiter_count);</div><div class='add'>+                    if (ret)</div><div class='ctx'>                         goto out;</div><div class='del'>-                }</div><div class='del'>-                ret = dict_set_int32 (dict, "replica-count", count);</div><div class='del'>-                if (ret)</div><div class='del'>-                        goto out;</div><div class='del'>-                brick_index = 5;</div><div class='del'>-        } else if ((strcasecmp (words[3], "stripe")) == 0) {</div><div class='del'>-                type = GF_CLUSTER_TYPE_STRIPE;</div><div class='del'>-                if (wordcount &lt; 5) {</div><div class='add'>+                    index += 2;</div><div class='add'>+                } else if (!strcmp(words[index], "thin-arbiter")) {</div><div class='add'>+                    ret = gf_string2int(words[index + 1], &amp;thin_arbiter_count);</div><div class='add'>+                    if ((ret == -1) || (thin_arbiter_count != 1) ||</div><div class='add'>+                        (replica_count != 2)) {</div><div class='add'>+                        cli_err(</div><div class='add'>+                            "For thin-arbiter "</div><div class='add'>+                            "configuration, "</div><div class='add'>+                            "replica count must be"</div><div class='add'>+                            " 2 and thin-arbiter count "</div><div class='add'>+                            "must be 1. The 3rd "</div><div class='add'>+                            "brick of the replica "</div><div class='add'>+                            "will be the thin-arbiter brick");</div><div class='ctx'>                         ret = -1;</div><div class='ctx'>                         goto out;</div><div class='add'>+                    }</div><div class='add'>+                    ret = dict_set_int32(dict, "thin-arbiter-count",</div><div class='add'>+                                         thin_arbiter_count);</div><div class='add'>+                    if (ret)</div><div class='add'>+                        goto out;</div><div class='add'>+                    index += 2;</div><div class='ctx'>                 }</div><div class='del'>-                count = strtol (words[4], NULL, 0);</div><div class='del'>-                if (!count || (count &lt; 2)) {</div><div class='del'>-                        cli_out ("stripe count should be greater than 1");</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            /* Do this to keep glusterd happy with sending</div><div class='add'>+               "replica 3 arbiter 1" options to server */</div><div class='add'>+            if ((arbiter_count == 1) &amp;&amp; (replica_count == 2))</div><div class='add'>+                replica_count += arbiter_count;</div><div class='add'>+</div><div class='add'>+            if (replica_count == 2 &amp;&amp; thin_arbiter_count == 0) {</div><div class='add'>+                if (strcmp(words[wordcount - 1], "force")) {</div><div class='add'>+                    question =</div><div class='add'>+                        "Replica 2 volumes are prone"</div><div class='add'>+                        " to split-brain. Use "</div><div class='add'>+                        "Arbiter or Replica 3 to "</div><div class='add'>+                        "avoid this. See: "</div><div class='add'>+                        "http://docs.gluster.org/en/latest/"</div><div class='add'>+                        "Administrator%20Guide/"</div><div class='add'>+                        "Split%20brain%20and%20ways%20to%20deal%20with%20it/."</div><div class='add'>+                        "\nDo you still want to "</div><div class='add'>+                        "continue?\n";</div><div class='add'>+                    answer = cli_cmd_get_confirmation(state, question);</div><div class='add'>+                    if (GF_ANSWER_NO == answer) {</div><div class='add'>+                        gf_log("cli", GF_LOG_ERROR,</div><div class='add'>+                               "Volume create "</div><div class='add'>+                               "cancelled, exiting");</div><div class='ctx'>                         ret = -1;</div><div class='ctx'>                         goto out;</div><div class='add'>+                    }</div><div class='ctx'>                 }</div><div class='del'>-                ret = dict_set_int32 (dict, "stripe-count", count);</div><div class='del'>-                if (ret)</div><div class='del'>-                        goto out;</div><div class='del'>-                brick_index = 5;</div><div class='add'>+            }</div><div class='add'>+            ret = dict_set_int32(dict, "replica-count", replica_count);</div><div class='add'>+            if (ret)</div><div class='add'>+                goto out;</div><div class='add'>+</div><div class='add'>+        } else if ((strcmp(w, "stripe")) == 0) {</div><div class='add'>+            cli_err("stripe option not supported");</div><div class='add'>+            goto out;</div><div class='add'>+        } else if ((strcmp(w, "transport")) == 0) {</div><div class='add'>+            if (trans_type) {</div><div class='add'>+                cli_err(</div><div class='add'>+                    "'transport' option given more"</div><div class='add'>+                    " than one time");</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+            if ((strcasecmp(words[index + 1], "tcp") == 0)) {</div><div class='add'>+                trans_type = gf_strdup("tcp");</div><div class='add'>+            } else if ((strcasecmp(words[index + 1], "rdma") == 0)) {</div><div class='add'>+                trans_type = gf_strdup("rdma");</div><div class='add'>+            } else if ((strcasecmp(words[index + 1], "tcp,rdma") == 0) ||</div><div class='add'>+                       (strcasecmp(words[index + 1], "rdma,tcp") == 0)) {</div><div class='add'>+                trans_type = gf_strdup("tcp,rdma");</div><div class='add'>+            } else {</div><div class='add'>+                gf_log("", GF_LOG_ERROR,</div><div class='add'>+                       "incorrect transport"</div><div class='add'>+                       " protocol specified");</div><div class='add'>+                ret = -1;</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+            index += 2;</div><div class='add'>+</div><div class='add'>+        } else if ((strcmp(w, "disperse") == 0) ||</div><div class='add'>+                   (strcmp(w, "redundancy") == 0) ||</div><div class='add'>+                   (strcmp(w, "disperse-data") == 0)) {</div><div class='add'>+            ret = cli_validate_disperse_volume(</div><div class='add'>+                w, type, words, wordcount, index, &amp;disperse_count,</div><div class='add'>+                &amp;redundancy_count, &amp;disperse_data_count);</div><div class='add'>+            if (ret &lt; 0)</div><div class='add'>+                goto out;</div><div class='add'>+            index += ret;</div><div class='add'>+            type = GF_CLUSTER_TYPE_DISPERSE;</div><div class='add'>+        } else if ((strcmp(w, "arbiter") == 0)) {</div><div class='add'>+            cli_err(</div><div class='add'>+                "arbiter option must be preceded by replica "</div><div class='add'>+                "option.");</div><div class='add'>+            ret = -1;</div><div class='add'>+            goto out;</div><div class='add'>+        } else if ((strcmp(w, "thin-arbiter") == 0)) {</div><div class='add'>+            cli_err(</div><div class='add'>+                "thin-arbiter option must be preceded by replica "</div><div class='add'>+                "option.");</div><div class='add'>+            ret = -1;</div><div class='add'>+            goto out;</div><div class='ctx'>         } else {</div><div class='del'>-                type = GF_CLUSTER_TYPE_NONE;</div><div class='del'>-                brick_index = 3;</div><div class='add'>+            GF_ASSERT(!"opword mismatch");</div><div class='add'>+            ret = -1;</div><div class='add'>+            goto out;</div><div class='ctx'>         }</div><div class='add'>+        op_count++;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        ret = dict_set_int32 (dict, "type", type);</div><div class='del'>-        if (ret)</div><div class='del'>-                goto out;</div><div class='add'>+    if (!trans_type)</div><div class='add'>+        trans_type = gf_strdup("tcp");</div><div class='add'>+</div><div class='add'>+    if (index &gt;= wordcount) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    brick_index = index;</div><div class='ctx'> </div><div class='del'>-        if (type)</div><div class='del'>-                index = 5;</div><div class='add'>+    if (strcmp(words[wordcount - 1], "force") == 0) {</div><div class='add'>+        is_force = _gf_true;</div><div class='add'>+        wc = wordcount - 1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    // Exclude the thin-arbiter-brick i.e. last brick in the bricks list</div><div class='add'>+    if (thin_arbiter_count == 1) {</div><div class='add'>+        ret = cli_cmd_bricks_parse(words, wc - 1, brick_index, &amp;bricks,</div><div class='add'>+                                   &amp;brick_count);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+</div><div class='add'>+        ret = cli_cmd_ta_brick_parse(words, wc, &amp;ta_brick);</div><div class='add'>+</div><div class='add'>+    } else {</div><div class='add'>+        ret = cli_cmd_bricks_parse(words, wc, brick_index, &amp;bricks,</div><div class='add'>+                                   &amp;brick_count);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    if (type == GF_CLUSTER_TYPE_DISPERSE) {</div><div class='add'>+        ret = cli_cmd_create_disperse_check(state, &amp;disperse_count,</div><div class='add'>+                                            &amp;redundancy_count,</div><div class='add'>+                                            &amp;disperse_data_count, brick_count);</div><div class='add'>+        if (!ret)</div><div class='add'>+            ret = dict_set_int32(dict, "disperse-count", disperse_count);</div><div class='add'>+        if (!ret)</div><div class='add'>+            ret = dict_set_int32(dict, "redundancy-count", redundancy_count);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+</div><div class='add'>+        sub_count = disperse_count;</div><div class='add'>+    } else</div><div class='add'>+        sub_count = stripe_count * replica_count;</div><div class='add'>+</div><div class='add'>+    if (brick_count % sub_count) {</div><div class='add'>+        if (type == GF_CLUSTER_TYPE_STRIPE)</div><div class='add'>+            cli_err(</div><div class='add'>+                "number of bricks is not a multiple of "</div><div class='add'>+                "stripe count");</div><div class='add'>+        else if (type == GF_CLUSTER_TYPE_REPLICATE)</div><div class='add'>+            cli_err(</div><div class='add'>+                "number of bricks is not a multiple of "</div><div class='add'>+                "replica count");</div><div class='add'>+        else if (type == GF_CLUSTER_TYPE_DISPERSE)</div><div class='add'>+            cli_err(</div><div class='add'>+                "number of bricks is not a multiple of "</div><div class='add'>+                "disperse count");</div><div class='ctx'>         else</div><div class='del'>-                index = 3;</div><div class='add'>+            cli_err(</div><div class='add'>+                "number of bricks given doesn't match "</div><div class='add'>+                "required count");</div><div class='add'>+</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Everything is parsed fine. start setting info in dict */</div><div class='add'>+    ret = dict_set_str(dict, "volname", volname);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    ret = dict_set_int32(dict, "type", type);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    ret = dict_set_dynstr(dict, "transport", trans_type);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+    trans_type = NULL;</div><div class='add'>+</div><div class='add'>+    ret = dict_set_dynstr(dict, "bricks", bricks);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    if (thin_arbiter_count == 1) {</div><div class='add'>+        ret = dict_set_dynstr(dict, "ta-brick", ta_brick);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        if (wordcount &lt; (index + 1)) {</div><div class='del'>-                ret = -1;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='add'>+    ret = dict_set_int32(dict, "count", brick_count);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='ctx'> </div><div class='del'>-        if (strcasecmp(words[index], "transport") == 0) {</div><div class='del'>-                brick_index = index+2;</div><div class='del'>-                if (wordcount &lt; (index + 2)) {</div><div class='del'>-                        ret = -1;</div><div class='del'>-                        goto out;</div><div class='del'>-                }</div><div class='add'>+    ret = dict_set_int32(dict, "force", is_force);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='ctx'> </div><div class='del'>-                if ((strcasecmp (words[index+1], "tcp") == 0)) {</div><div class='del'>-                        trans_type = gf_strdup ("tcp");</div><div class='del'>-                } else if ((strcasecmp (words[index+1], "rdma") == 0)) {</div><div class='del'>-                        trans_type = gf_strdup ("rdma");</div><div class='del'>-                } else {</div><div class='del'>-                        gf_log ("", GF_LOG_ERROR, "incorrect transport"</div><div class='del'>-                                       " protocol specified");</div><div class='del'>-                        ret = -1;</div><div class='del'>-                        goto out;</div><div class='del'>-                }</div><div class='add'>+    *options = dict;</div><div class='add'>+    *brick_list = bricks;</div><div class='add'>+out:</div><div class='add'>+    if (ret) {</div><div class='add'>+        GF_FREE(bricks);</div><div class='add'>+        GF_FREE(ta_brick);</div><div class='add'>+        gf_log("cli", GF_LOG_ERROR, "Unable to parse create volume CLI");</div><div class='add'>+        if (dict)</div><div class='add'>+            dict_unref(dict);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    GF_FREE(trans_type);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+cli_cmd_volume_reset_parse(const char **words, int wordcount, dict_t **options)</div><div class='add'>+{</div><div class='add'>+    dict_t *dict = NULL;</div><div class='add'>+    char *volname = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(words);</div><div class='add'>+    GF_ASSERT(options);</div><div class='add'>+</div><div class='add'>+    dict = dict_new();</div><div class='add'>+</div><div class='add'>+    if (!dict)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    if (wordcount &lt; 3)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    if (wordcount &gt; 5)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    volname = (char *)words[2];</div><div class='add'>+</div><div class='add'>+    if (!volname) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_set_str(dict, "volname", volname);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    if (wordcount == 3) {</div><div class='add'>+        ret = dict_set_str(dict, "key", "all");</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (wordcount &gt;= 4) {</div><div class='add'>+        if (!strcmp("force", (char *)words[3])) {</div><div class='add'>+            ret = dict_set_int32(dict, "force", 1);</div><div class='add'>+            if (ret)</div><div class='add'>+                goto out;</div><div class='add'>+            ret = dict_set_str(dict, "key", "all");</div><div class='add'>+            if (ret)</div><div class='add'>+                goto out;</div><div class='ctx'>         } else {</div><div class='del'>-                trans_type = gf_strdup ("tcp");</div><div class='add'>+            ret = dict_set_str(dict, "key", (char *)words[3]);</div><div class='add'>+            if (ret)</div><div class='add'>+                goto out;</div><div class='ctx'>         }</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        ret = dict_set_str (dict, "transport", trans_type);</div><div class='del'>-        if (ret)</div><div class='add'>+    if (wordcount == 5) {</div><div class='add'>+        if (strcmp("force", (char *)words[4])) {</div><div class='add'>+            ret = -1;</div><div class='add'>+            goto out;</div><div class='add'>+        } else {</div><div class='add'>+            ret = dict_set_int32(dict, "force", 1);</div><div class='add'>+            if (ret)</div><div class='ctx'>                 goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    *options = dict;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (ret &amp;&amp; dict) {</div><div class='add'>+        dict_unref(dict);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        strcpy (brick_list, " ");</div><div class='del'>-        while (brick_index &lt; wordcount) {</div><div class='del'>-                delimiter = strchr (words[brick_index], ':');</div><div class='del'>-                if (!delimiter || delimiter == words[brick_index]</div><div class='del'>-                    || *(delimiter+1) != '/') {</div><div class='del'>-                        cli_out ("wrong brick type: %s, use &lt;HOSTNAME&gt;:"</div><div class='del'>-                                 "&lt;export-dir-abs-path&gt;", words[brick_index]);</div><div class='add'>+int32_t</div><div class='add'>+cli_cmd_get_state_parse(struct cli_state *state, const char **words,</div><div class='add'>+                        int wordcount, dict_t **options, char **op_errstr)</div><div class='add'>+{</div><div class='add'>+    dict_t *dict = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    char *odir = NULL;</div><div class='add'>+    char *filename = NULL;</div><div class='add'>+    char *daemon_name = NULL;</div><div class='add'>+    int count = 0;</div><div class='add'>+    uint32_t cmd = 0;</div><div class='add'>+</div><div class='add'>+    GF_VALIDATE_OR_GOTO("cli", options, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("cli", words, out);</div><div class='add'>+</div><div class='add'>+    dict = dict_new();</div><div class='add'>+    if (!dict)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    if (wordcount &lt; 1 || wordcount &gt; 7) {</div><div class='add'>+        *op_errstr = gf_strdup(</div><div class='add'>+            "Problem parsing arguments."</div><div class='add'>+            " Check usage.");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (wordcount &gt;= 1) {</div><div class='add'>+        gf_asprintf(&amp;daemon_name, "%s", "glusterd");</div><div class='add'>+</div><div class='add'>+        for (count = 1; count &lt; wordcount; count++) {</div><div class='add'>+            if (strcmp(words[count], "odir") == 0 ||</div><div class='add'>+                strcmp(words[count], "file") == 0) {</div><div class='add'>+                if (strcmp(words[count], "odir") == 0) {</div><div class='add'>+                    if (++count &lt; wordcount) {</div><div class='add'>+                        odir = (char *)words[count];</div><div class='add'>+                        continue;</div><div class='add'>+                    } else {</div><div class='ctx'>                         ret = -1;</div><div class='ctx'>                         goto out;</div><div class='del'>-                }</div><div class='del'>-                if ((brick_list_size + strlen (words[brick_index]) + 1) &gt; 120000) {</div><div class='del'>-                        gf_log ("cli", GF_LOG_ERROR,</div><div class='del'>-                                "total brick list is larger than a request "</div><div class='del'>-                                "can take (brick_count %d)", brick_count);</div><div class='add'>+                    }</div><div class='add'>+                } else if (strcmp(words[count], "file") == 0) {</div><div class='add'>+                    if (++count &lt; wordcount) {</div><div class='add'>+                        filename = (char *)words[count];</div><div class='add'>+                        continue;</div><div class='add'>+                    } else {</div><div class='ctx'>                         ret = -1;</div><div class='ctx'>                         goto out;</div><div class='add'>+                    }</div><div class='ctx'>                 }</div><div class='del'>-</div><div class='del'>-                host_name = gf_strdup(words[brick_index]);</div><div class='del'>-                if (!host_name) {</div><div class='add'>+            } else {</div><div class='add'>+                if (count &gt; 1) {</div><div class='add'>+                    if (count == wordcount - 1) {</div><div class='add'>+                        if (strcmp(words[count], "detail") == 0) {</div><div class='add'>+                            cmd = GF_CLI_GET_STATE_DETAIL;</div><div class='add'>+                            continue;</div><div class='add'>+                        } else if (strcmp(words[count], "volumeoptions") == 0) {</div><div class='add'>+                            cmd = GF_CLI_GET_STATE_VOLOPTS;</div><div class='add'>+                            continue;</div><div class='add'>+                        }</div><div class='add'>+                    } else {</div><div class='add'>+                        *op_errstr = gf_strdup(</div><div class='add'>+                            "Problem"</div><div class='add'>+                            " parsing arguments. "</div><div class='add'>+                            "Check usage.");</div><div class='ctx'>                         ret = -1;</div><div class='del'>-                        gf_log("cli",GF_LOG_ERROR, "Unable to allocate "</div><div class='del'>-                               "memory");</div><div class='ctx'>                         goto out;</div><div class='add'>+                    }</div><div class='ctx'>                 }</div><div class='del'>-                freeptr = host_name;</div><div class='add'>+                if (strcmp(words[count], "glusterd") == 0) {</div><div class='add'>+                    continue;</div><div class='add'>+                } else {</div><div class='add'>+                    if (count == wordcount - 1) {</div><div class='add'>+                        if (strcmp(words[count], "detail") == 0) {</div><div class='add'>+                            cmd = GF_CLI_GET_STATE_DETAIL;</div><div class='add'>+                            continue;</div><div class='add'>+                        } else if (strcmp(words[count], "volumeoptions") == 0) {</div><div class='add'>+                            cmd = GF_CLI_GET_STATE_VOLOPTS;</div><div class='add'>+                            continue;</div><div class='add'>+                        }</div><div class='add'>+                    }</div><div class='ctx'> </div><div class='del'>-                strtok_r(host_name, ":", &amp;tmp);</div><div class='del'>-                if (!(strcmp(host_name, "localhost") &amp;&amp;</div><div class='del'>-                      strcmp (host_name, "127.0.0.1"))) {</div><div class='del'>-                        cli_out ("Please provide a valid hostname/ip other "</div><div class='del'>-                                 "than localhost or 127.0.0.1");</div><div class='del'>-                        ret = -1;</div><div class='del'>-                        GF_FREE(freeptr);</div><div class='del'>-                        goto out;</div><div class='add'>+                    *op_errstr = gf_strdup(</div><div class='add'>+                        "glusterd is "</div><div class='add'>+                        "the only supported daemon.");</div><div class='add'>+                    ret = -1;</div><div class='add'>+                    goto out;</div><div class='ctx'>                 }</div><div class='del'>-                GF_FREE (freeptr);</div><div class='del'>-                tmp_list = strdup(brick_list+1);</div><div class='del'>-                j = 0;</div><div class='del'>-                while(( brick_count != 0) &amp;&amp; (j &lt; brick_count)) {</div><div class='del'>-                        strtok_r (tmp_list, " ", &amp;tmpptr);</div><div class='del'>-                        if (!(strcmp (tmp_list, words[brick_index]))) {</div><div class='del'>-                                ret = -1;</div><div class='del'>-                                cli_out ("Found duplicate"</div><div class='del'>-                                         " exports %s",words[brick_index]);</div><div class='del'>-                                goto out;</div><div class='del'>-                       }</div><div class='del'>-                       tmp_list = tmpptr;</div><div class='del'>-                       j++;</div><div class='del'>-                }</div><div class='del'>-                strcat (brick_list, words[brick_index]);</div><div class='del'>-                strcat (brick_list, " ");</div><div class='del'>-                brick_list_size += (strlen (words[brick_index]) + 1);</div><div class='del'>-                ++brick_count;</div><div class='del'>-                ++brick_index;</div><div class='del'>-                /*</div><div class='del'>-                  char    key[50];</div><div class='del'>-                snprintf (key, 50, "brick%d", ++brick_count);</div><div class='del'>-                ret = dict_set_str (dict, key, (char *)words[brick_index++]);</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-                if (ret)</div><div class='del'>-                        goto out;</div><div class='del'>-                */</div><div class='add'>+        ret = dict_set_dynstr(dict, "daemon", daemon_name);</div><div class='add'>+        if (ret) {</div><div class='add'>+            *op_errstr = gf_strdup(</div><div class='add'>+                "Command failed. Please check "</div><div class='add'>+                " log file for more details.");</div><div class='add'>+            gf_log(THIS-&gt;name, GF_LOG_ERROR,</div><div class='add'>+                   "Setting daemon name to dictionary failed");</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+        daemon_name = NULL;</div><div class='add'>+</div><div class='add'>+        if (odir) {</div><div class='add'>+            ret = dict_set_str(dict, "odir", odir);</div><div class='add'>+            if (ret) {</div><div class='add'>+                *op_errstr = gf_strdup(</div><div class='add'>+                    "Command failed. Please"</div><div class='add'>+                    " check log file for"</div><div class='add'>+                    " more details.");</div><div class='add'>+                gf_log(THIS-&gt;name, GF_LOG_ERROR,</div><div class='add'>+                       "Setting output directory to"</div><div class='add'>+                       "dictionary failed");</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        if (filename) {</div><div class='add'>+            ret = dict_set_str(dict, "filename", filename);</div><div class='add'>+            if (ret) {</div><div class='add'>+                *op_errstr = gf_strdup(</div><div class='add'>+                    "Command failed. Please"</div><div class='add'>+                    " check log file for"</div><div class='add'>+                    " more  details.");</div><div class='add'>+                gf_log(THIS-&gt;name, GF_LOG_ERROR,</div><div class='add'>+                       "Setting filename to dictionary failed");</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        if (cmd) {</div><div class='add'>+            ret = dict_set_uint32(dict, "getstate-cmd", cmd);</div><div class='add'>+            if (ret) {</div><div class='add'>+                *op_errstr = gf_strdup(</div><div class='add'>+                    "Command failed. Please"</div><div class='add'>+                    " check log file for"</div><div class='add'>+                    " more details.");</div><div class='add'>+                gf_log(THIS-&gt;name, GF_LOG_ERROR,</div><div class='add'>+                       "Setting "</div><div class='add'>+                       "get-state command type to dictionary "</div><div class='add'>+                       "failed");</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (dict)</div><div class='add'>+        *options = dict;</div><div class='add'>+</div><div class='add'>+    if (ret &amp;&amp; dict)</div><div class='add'>+        dict_unref(dict);</div><div class='add'>+</div><div class='add'>+    GF_FREE(daemon_name);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+cli_cmd_inode_quota_parse(const char **words, int wordcount, dict_t **options)</div><div class='add'>+{</div><div class='add'>+    dict_t *dict = NULL;</div><div class='add'>+    char *volname = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(words);</div><div class='add'>+    GF_ASSERT(options);</div><div class='add'>+</div><div class='add'>+    dict = dict_new();</div><div class='add'>+    if (!dict) {</div><div class='add'>+        gf_log("cli", GF_LOG_ERROR, "dict_new failed");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (wordcount != 4)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    volname = (char *)words[2];</div><div class='add'>+    if (!volname) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Validate the volume name here itself */</div><div class='add'>+    if (cli_validate_volname(volname) &lt; 0)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    ret = dict_set_str(dict, "volname", volname);</div><div class='add'>+    if (ret &lt; 0)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    if (strcmp(words[3], "enable") != 0) {</div><div class='add'>+        cli_out("Invalid quota option : %s", words[3]);</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_set_int32(dict, "type", GF_QUOTA_OPTION_TYPE_ENABLE_OBJECTS);</div><div class='add'>+    if (ret &lt; 0)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    *options = dict;</div><div class='add'>+out:</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        if (dict)</div><div class='add'>+            dict_unref(dict);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+cli_cmd_quota_parse(const char **words, int wordcount, dict_t **options)</div><div class='add'>+{</div><div class='add'>+    dict_t *dict = NULL;</div><div class='add'>+    char *volname = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int i = -1;</div><div class='add'>+    char key[20] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int64_t value = 0;</div><div class='add'>+    gf_quota_type type = GF_QUOTA_OPTION_TYPE_NONE;</div><div class='add'>+    static char *opwords[] = {"enable",</div><div class='add'>+                              "disable",</div><div class='add'>+                              "limit-usage",</div><div class='add'>+                              "remove",</div><div class='add'>+                              "list",</div><div class='add'>+                              "alert-time",</div><div class='add'>+                              "soft-timeout",</div><div class='add'>+                              "hard-timeout",</div><div class='add'>+                              "default-soft-limit",</div><div class='add'>+                              "limit-objects",</div><div class='add'>+                              "list-objects",</div><div class='add'>+                              "remove-objects",</div><div class='add'>+                              NULL};</div><div class='add'>+    char *w = NULL;</div><div class='add'>+    uint32_t time = 0;</div><div class='add'>+    double percent = 0;</div><div class='add'>+    char *end_ptr = NULL;</div><div class='add'>+    int64_t limit = 0;</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(words);</div><div class='add'>+    GF_ASSERT(options);</div><div class='add'>+</div><div class='add'>+    dict = dict_new();</div><div class='add'>+    if (!dict) {</div><div class='add'>+        gf_log("cli", GF_LOG_ERROR, "dict_new failed");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (wordcount &lt; 4) {</div><div class='add'>+        if ((wordcount == 3) &amp;&amp; !(strcmp(words[2], "help"))) {</div><div class='add'>+            ret = 1;</div><div class='add'>+        }</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    volname = (char *)words[2];</div><div class='add'>+    if (!volname) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Validate the volume name here itself */</div><div class='add'>+    if (cli_validate_volname(volname) &lt; 0)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    ret = dict_set_str(dict, "volname", volname);</div><div class='add'>+    if (ret &lt; 0)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    w = str_getunamb(words[3], opwords);</div><div class='add'>+    if (!w) {</div><div class='add'>+        cli_out("Invalid quota option : %s", words[3]);</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (strcmp(w, "enable") == 0) {</div><div class='add'>+        if (wordcount == 4) {</div><div class='add'>+            type = GF_QUOTA_OPTION_TYPE_ENABLE;</div><div class='add'>+            ret = 0;</div><div class='add'>+            goto set_type;</div><div class='add'>+        } else {</div><div class='add'>+            ret = -1;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (strcmp(w, "disable") == 0) {</div><div class='add'>+        if (wordcount == 4) {</div><div class='add'>+            type = GF_QUOTA_OPTION_TYPE_DISABLE;</div><div class='add'>+            ret = 0;</div><div class='add'>+            goto set_type;</div><div class='add'>+        } else {</div><div class='add'>+            ret = -1;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (strcmp(w, "limit-usage") == 0) {</div><div class='add'>+        type = GF_QUOTA_OPTION_TYPE_LIMIT_USAGE;</div><div class='add'>+    } else if (strcmp(w, "limit-objects") == 0) {</div><div class='add'>+        type = GF_QUOTA_OPTION_TYPE_LIMIT_OBJECTS;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (type == GF_QUOTA_OPTION_TYPE_LIMIT_USAGE ||</div><div class='add'>+        type == GF_QUOTA_OPTION_TYPE_LIMIT_OBJECTS) {</div><div class='add'>+        if (wordcount &lt; 6 || wordcount &gt; 7) {</div><div class='add'>+            ret = -1;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        if (words[4][0] != '/') {</div><div class='add'>+            cli_err("Please enter absolute path");</div><div class='add'>+            ret = -1;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+        ret = dict_set_str(dict, "path", (char *)words[4]);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+</div><div class='add'>+        if (!words[5]) {</div><div class='add'>+            cli_err("Please enter the limit value to be set");</div><div class='add'>+            ret = -1;</div><div class='add'>+            goto out;</div><div class='ctx'>         }</div><div class='ctx'> </div><div class='del'>-        /* If brick-count is not valid when replica or stripe is</div><div class='del'>-           given, exit here */</div><div class='del'>-        if (!brick_count) {</div><div class='del'>-                cli_out ("No bricks specified");</div><div class='add'>+        if (type == GF_QUOTA_OPTION_TYPE_LIMIT_USAGE) {</div><div class='add'>+            ret = gf_string2bytesize_int64(words[5], &amp;value);</div><div class='add'>+            if (ret != 0 || value &lt;= 0) {</div><div class='add'>+                if (errno == ERANGE || value &lt;= 0) {</div><div class='add'>+                    ret = -1;</div><div class='add'>+                    cli_err(</div><div class='add'>+                        "Please enter an integer "</div><div class='add'>+                        "value in the range of "</div><div class='add'>+                        "(1 - %" PRId64 ")",</div><div class='add'>+                        INT64_MAX);</div><div class='add'>+                } else</div><div class='add'>+                    cli_err(</div><div class='add'>+                        "Please enter a correct "</div><div class='add'>+                        "value");</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+        } else {</div><div class='add'>+            errno = 0;</div><div class='add'>+            limit = strtol(words[5], &amp;end_ptr, 10);</div><div class='add'>+            if (errno == ERANGE || errno == EINVAL || limit &lt;= 0 ||</div><div class='add'>+                strcmp(end_ptr, "") != 0) {</div><div class='ctx'>                 ret = -1;</div><div class='add'>+                cli_err(</div><div class='add'>+                    "Please enter an integer value in "</div><div class='add'>+                    "the range 1 - %" PRId64,</div><div class='add'>+                    INT64_MAX);</div><div class='ctx'>                 goto out;</div><div class='add'>+            }</div><div class='ctx'>         }</div><div class='ctx'> </div><div class='del'>-        if (brick_count % count) {</div><div class='del'>-                if (type == GF_CLUSTER_TYPE_STRIPE)</div><div class='del'>-                        cli_out ("number of bricks is not a multiple of "</div><div class='del'>-                                 "stripe count");</div><div class='del'>-                else if (type == GF_CLUSTER_TYPE_REPLICATE)</div><div class='del'>-                        cli_out ("number of bricks is not a multiple of "</div><div class='del'>-                                 "replica count");</div><div class='add'>+        ret = dict_set_str(dict, "hard-limit", (char *)words[5]);</div><div class='add'>+        if (ret &lt; 0)</div><div class='add'>+            goto out;</div><div class='add'>+</div><div class='add'>+        if (wordcount == 7) {</div><div class='add'>+            ret = gf_string2percent(words[6], &amp;percent);</div><div class='add'>+            if (ret != 0 || percent &gt; 100) {</div><div class='ctx'>                 ret = -1;</div><div class='add'>+                cli_err(</div><div class='add'>+                    "Please enter a correct value "</div><div class='add'>+                    "in the range of 0 to 100");</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            ret = dict_set_str(dict, "soft-limit", (char *)words[6]);</div><div class='add'>+            if (ret &lt; 0)</div><div class='ctx'>                 goto out;</div><div class='ctx'>         }</div><div class='ctx'> </div><div class='del'>-        ret = dict_set_str (dict, "bricks", brick_list);</div><div class='del'>-        if (ret)</div><div class='add'>+        goto set_type;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (strcmp(w, "remove") == 0) {</div><div class='add'>+        if (wordcount != 5) {</div><div class='add'>+            ret = -1;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        type = GF_QUOTA_OPTION_TYPE_REMOVE;</div><div class='add'>+</div><div class='add'>+        if (words[4][0] != '/') {</div><div class='add'>+            cli_err("Please enter absolute path");</div><div class='add'>+            ret = -1;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        ret = dict_set_str(dict, "path", (char *)words[4]);</div><div class='add'>+        if (ret &lt; 0)</div><div class='add'>+            goto out;</div><div class='add'>+        goto set_type;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (strcmp(w, "remove-objects") == 0) {</div><div class='add'>+        if (wordcount != 5) {</div><div class='add'>+            ret = -1;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        type = GF_QUOTA_OPTION_TYPE_REMOVE_OBJECTS;</div><div class='add'>+</div><div class='add'>+        if (words[4][0] != '/') {</div><div class='add'>+            cli_err("Please enter absolute path");</div><div class='add'>+            ret = -1;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        ret = dict_set_str(dict, "path", (char *)words[4]);</div><div class='add'>+        if (ret &lt; 0)</div><div class='add'>+            goto out;</div><div class='add'>+        goto set_type;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (strcmp(w, "list") == 0) {</div><div class='add'>+        type = GF_QUOTA_OPTION_TYPE_LIST;</div><div class='add'>+</div><div class='add'>+        if (words[4] &amp;&amp; words[4][0] != '/') {</div><div class='add'>+            cli_err("Please enter absolute path");</div><div class='add'>+            ret = -1;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        i = 4;</div><div class='add'>+        while (i &lt; wordcount) {</div><div class='add'>+            snprintf(key, 20, "path%d", i - 4);</div><div class='add'>+</div><div class='add'>+            ret = dict_set_str(dict, key, (char *)words[i++]);</div><div class='add'>+            if (ret &lt; 0)</div><div class='ctx'>                 goto out;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-        ret = dict_set_int32 (dict, "count", brick_count);</div><div class='del'>-        if (ret)</div><div class='add'>+        ret = dict_set_int32(dict, "count", i - 4);</div><div class='add'>+        if (ret &lt; 0)</div><div class='add'>+            goto out;</div><div class='add'>+</div><div class='add'>+        goto set_type;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (strcmp(w, "list-objects") == 0) {</div><div class='add'>+        type = GF_QUOTA_OPTION_TYPE_LIST_OBJECTS;</div><div class='add'>+</div><div class='add'>+        i = 4;</div><div class='add'>+        while (i &lt; wordcount) {</div><div class='add'>+            snprintf(key, 20, "path%d", i - 4);</div><div class='add'>+</div><div class='add'>+            ret = dict_set_str(dict, key, (char *)words[i++]);</div><div class='add'>+            if (ret &lt; 0) {</div><div class='add'>+                gf_log("cli", GF_LOG_ERROR,</div><div class='add'>+                       "Failed to set "</div><div class='add'>+                       "quota patch in request dictionary");</div><div class='ctx'>                 goto out;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-        *options = dict;</div><div class='add'>+        ret = dict_set_int32(dict, "count", i - 4);</div><div class='add'>+        if (ret &lt; 0) {</div><div class='add'>+            gf_log("cli", GF_LOG_ERROR,</div><div class='add'>+                   "Failed to set quota "</div><div class='add'>+                   "limit count in request dictionary");</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-out:</div><div class='add'>+        goto set_type;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (strcmp(w, "alert-time") == 0) {</div><div class='add'>+        if (wordcount != 5) {</div><div class='add'>+            ret = -1;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+        type = GF_QUOTA_OPTION_TYPE_ALERT_TIME;</div><div class='add'>+</div><div class='add'>+        ret = gf_string2time(words[4], &amp;time);</div><div class='ctx'>         if (ret) {</div><div class='del'>-                gf_log ("cli", GF_LOG_ERROR, "Unable to parse create volume CLI");</div><div class='del'>-                if (dict)</div><div class='del'>-                        dict_destroy (dict);</div><div class='add'>+            cli_err(</div><div class='add'>+                "Invalid argument %s. Please enter a valid "</div><div class='add'>+                "string",</div><div class='add'>+                words[4]);</div><div class='add'>+            goto out;</div><div class='ctx'>         }</div><div class='del'>-        if (trans_type)</div><div class='del'>-                GF_FREE (trans_type);</div><div class='ctx'> </div><div class='del'>-        return ret;</div><div class='add'>+        ret = dict_set_str(dict, "value", (char *)words[4]);</div><div class='add'>+        if (ret &lt; 0)</div><div class='add'>+            goto out;</div><div class='add'>+        goto set_type;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (strcmp(w, "soft-timeout") == 0) {</div><div class='add'>+        if (wordcount != 5) {</div><div class='add'>+            ret = -1;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+        type = GF_QUOTA_OPTION_TYPE_SOFT_TIMEOUT;</div><div class='add'>+</div><div class='add'>+        ret = gf_string2time(words[4], &amp;time);</div><div class='add'>+        if (ret) {</div><div class='add'>+            cli_err(</div><div class='add'>+                "Invalid argument %s. Please enter a valid "</div><div class='add'>+                "string",</div><div class='add'>+                words[4]);</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        ret = dict_set_str(dict, "value", (char *)words[4]);</div><div class='add'>+        if (ret &lt; 0)</div><div class='add'>+            goto out;</div><div class='add'>+        goto set_type;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (strcmp(w, "hard-timeout") == 0) {</div><div class='add'>+        if (wordcount != 5) {</div><div class='add'>+            ret = -1;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+        type = GF_QUOTA_OPTION_TYPE_HARD_TIMEOUT;</div><div class='add'>+</div><div class='add'>+        ret = gf_string2time(words[4], &amp;time);</div><div class='add'>+        if (ret) {</div><div class='add'>+            cli_err(</div><div class='add'>+                "Invalid argument %s. Please enter a valid "</div><div class='add'>+                "string",</div><div class='add'>+                words[4]);</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        ret = dict_set_str(dict, "value", (char *)words[4]);</div><div class='add'>+        if (ret &lt; 0)</div><div class='add'>+            goto out;</div><div class='add'>+        goto set_type;</div><div class='add'>+    }</div><div class='add'>+    if (strcmp(w, "default-soft-limit") == 0) {</div><div class='add'>+        if (wordcount != 5) {</div><div class='add'>+            ret = -1;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+        type = GF_QUOTA_OPTION_TYPE_DEFAULT_SOFT_LIMIT;</div><div class='add'>+</div><div class='add'>+        ret = dict_set_str(dict, "value", (char *)words[4]);</div><div class='add'>+        if (ret &lt; 0)</div><div class='add'>+            goto out;</div><div class='add'>+        goto set_type;</div><div class='add'>+    } else {</div><div class='add'>+        GF_ASSERT(!"opword mismatch");</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+set_type:</div><div class='add'>+    ret = dict_set_int32(dict, "type", type);</div><div class='add'>+    if (ret &lt; 0)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    *options = dict;</div><div class='add'>+out:</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        if (dict)</div><div class='add'>+            dict_unref(dict);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static gf_boolean_t</div><div class='add'>+cli_is_key_spl(char *key)</div><div class='add'>+{</div><div class='add'>+    return (strcmp(key, "group") == 0);</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+static int32_t</div><div class='add'>+cli_add_key_group_value(dict_t *dict, const char *name, const char *value,</div><div class='add'>+                        int32_t id, char **op_errstr)</div><div class='add'>+{</div><div class='add'>+    char *key = NULL;</div><div class='add'>+    char *data = NULL;</div><div class='add'>+    int32_t ret = -1;</div><div class='add'>+</div><div class='add'>+    ret = gf_asprintf(&amp;key, "%s%d", name, id);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    data = gf_strdup(value);</div><div class='add'>+    if (data == NULL) {</div><div class='add'>+        gf_log(THIS-&gt;name, GF_LOG_ERROR, "Failed to allocate memory for data");</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_set_dynstr(dict, key, data);</div><div class='add'>+    if (ret == 0) {</div><div class='add'>+        data = NULL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    GF_FREE(key);</div><div class='add'>+    GF_FREE(data);</div><div class='add'>+</div><div class='add'>+    if ((ret != 0) &amp;&amp; (op_errstr != NULL)) {</div><div class='add'>+        *op_errstr = gf_strdup("Failed to allocate memory");</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+cli_add_key_group(dict_t *dict, char *key, char *value, char **op_errstr)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int opt_count = 0;</div><div class='add'>+    char *saveptr = NULL;</div><div class='add'>+    char *tok_key = NULL;</div><div class='add'>+    char *tok_val = NULL;</div><div class='add'>+    char *tagpath = NULL;</div><div class='add'>+    char line[PATH_MAX + 256] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    FILE *fp = NULL;</div><div class='add'>+</div><div class='add'>+    ret = gf_asprintf(&amp;tagpath, "%s/groups/%s", GLUSTERD_DEFAULT_WORKDIR,</div><div class='add'>+                      value);</div><div class='add'>+    if (ret == -1) {</div><div class='add'>+        tagpath = NULL;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    fp = fopen(tagpath, "r");</div><div class='add'>+    if (!fp) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        if (op_errstr) {</div><div class='add'>+            gf_asprintf(op_errstr,</div><div class='add'>+                        "Unable to open file '%s'. "</div><div class='add'>+                        "Error: %s",</div><div class='add'>+                        tagpath, strerror(errno));</div><div class='add'>+        }</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    opt_count = 0;</div><div class='add'>+    while (fgets(line, sizeof(line), fp) != NULL) {</div><div class='add'>+        if (strlen(line) &gt;= sizeof(line) - 1) {</div><div class='add'>+            ret = -1;</div><div class='add'>+            if (op_errstr != NULL) {</div><div class='add'>+                *op_errstr = gf_strdup("Line too long");</div><div class='add'>+            }</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        /* Treat line that start with "#" as comments */</div><div class='add'>+        if ('#' == line[0])</div><div class='add'>+            continue;</div><div class='add'>+</div><div class='add'>+        opt_count++;</div><div class='add'>+        tok_key = strtok_r(line, "=", &amp;saveptr);</div><div class='add'>+        tok_val = strtok_r(NULL, "\r\n", &amp;saveptr);</div><div class='add'>+        if (!tok_key || !tok_val) {</div><div class='add'>+            ret = -1;</div><div class='add'>+            if (op_errstr) {</div><div class='add'>+                gf_asprintf(op_errstr,</div><div class='add'>+                            "'%s' file format "</div><div class='add'>+                            "not valid.",</div><div class='add'>+                            tagpath);</div><div class='add'>+            }</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        ret = cli_add_key_group_value(dict, "key", tok_key, opt_count,</div><div class='add'>+                                      op_errstr);</div><div class='add'>+        if (ret != 0) {</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+        ret = cli_add_key_group_value(dict, "value", tok_val, opt_count,</div><div class='add'>+                                      op_errstr);</div><div class='add'>+        if (ret != 0) {</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (!opt_count) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        if (op_errstr) {</div><div class='add'>+            gf_asprintf(op_errstr, "'%s' file format not valid.", tagpath);</div><div class='add'>+        }</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    ret = dict_set_int32(dict, "count", opt_count);</div><div class='add'>+out:</div><div class='add'>+</div><div class='add'>+    GF_FREE(tagpath);</div><div class='add'>+</div><div class='add'>+    if (fp)</div><div class='add'>+        fclose(fp);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int32_t</div><div class='del'>-cli_cmd_volume_set_parse (const char **words, int wordcount, dict_t **options)</div><div class='add'>+cli_cmd_volume_set_parse(struct cli_state *state, const char **words,</div><div class='add'>+                         int wordcount, dict_t **options, char **op_errstr)</div><div class='ctx'> {</div><div class='del'>-        dict_t  *dict = NULL;</div><div class='del'>-        char    *volname = NULL;</div><div class='del'>-        int     ret = -1;</div><div class='del'>-        int     count = 0;</div><div class='del'>-        char    *key = NULL;</div><div class='del'>-        char    *value = NULL;</div><div class='del'>-        int     i = 0;</div><div class='del'>-        char    str[50] = {0,};</div><div class='add'>+    dict_t *dict = NULL;</div><div class='add'>+    char *volname = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int count = 0;</div><div class='add'>+    char *key = NULL;</div><div class='add'>+    char *value = NULL;</div><div class='add'>+    int i = 0;</div><div class='add'>+    char str[50] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    const char *question = NULL;</div><div class='add'>+    gf_answer_t answer = GF_ANSWER_NO;</div><div class='ctx'> </div><div class='del'>-        GF_ASSERT (words);</div><div class='del'>-        GF_ASSERT (options);</div><div class='add'>+    GF_ASSERT(words);</div><div class='add'>+    GF_ASSERT(options);</div><div class='ctx'> </div><div class='del'>-        GF_ASSERT ((strcmp (words[0], "volume")) == 0);</div><div class='del'>-        GF_ASSERT ((strcmp (words[1], "set")) == 0);</div><div class='add'>+    dict = dict_new();</div><div class='ctx'> </div><div class='del'>-        dict = dict_new ();</div><div class='add'>+    if (!dict)</div><div class='add'>+        goto out;</div><div class='ctx'> </div><div class='del'>-        if (!dict)</div><div class='del'>-                goto out;</div><div class='add'>+    if (wordcount &lt; 3)</div><div class='add'>+        goto out;</div><div class='ctx'> </div><div class='del'>-        if (wordcount &lt; 3)</div><div class='del'>-                goto out;</div><div class='add'>+    volname = (char *)words[2];</div><div class='ctx'> </div><div class='del'>-        volname = (char *)words[2];</div><div class='add'>+    GF_ASSERT(volname);</div><div class='ctx'> </div><div class='del'>-        GF_ASSERT (volname);</div><div class='add'>+    ret = dict_set_str(dict, "volname", volname);</div><div class='ctx'> </div><div class='del'>-        ret = dict_set_str (dict, "volname", volname);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='ctx'> </div><div class='add'>+    if (!strcmp(volname, "all")) {</div><div class='add'>+        ret = dict_set_str(dict, "globalname", "All");</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_log(THIS-&gt;name, GF_LOG_ERROR, "dict set on global key failed.");</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        ret = dict_set_int32(dict, "hold_global_locks", _gf_true);</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_log(THIS-&gt;name, GF_LOG_ERROR, "dict set on global key failed.");</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if ((!strcmp(volname, "help") || !strcmp(volname, "help-xml")) &amp;&amp;</div><div class='add'>+        wordcount == 3) {</div><div class='add'>+        ret = dict_set_str(dict, volname, volname);</div><div class='ctx'>         if (ret)</div><div class='del'>-                goto out;</div><div class='add'>+            goto out;</div><div class='add'>+</div><div class='add'>+    } else if (wordcount &lt; 5) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    } else if (wordcount == 5 &amp;&amp; cli_is_key_spl((char *)words[3])) {</div><div class='add'>+        key = (char *)words[3];</div><div class='add'>+        value = (char *)words[4];</div><div class='add'>+        if (!key || !value) {</div><div class='add'>+            ret = -1;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-        for (i = 3; i &lt; wordcount; i++) {</div><div class='del'>-                key = strtok ((char *)words[i], "=");</div><div class='del'>-                value = strtok (NULL, "=");</div><div class='add'>+        ret = gf_strip_whitespace(value, strlen(value));</div><div class='add'>+        if (ret == -1)</div><div class='add'>+            goto out;</div><div class='ctx'> </div><div class='del'>-                GF_ASSERT (key);</div><div class='del'>-                GF_ASSERT (value);</div><div class='add'>+        if (strlen(value) == 0) {</div><div class='add'>+            ret = -1;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-                count++;</div><div class='add'>+        ret = cli_add_key_group(dict, key, value, op_errstr);</div><div class='add'>+        if (ret == 0)</div><div class='add'>+            *options = dict;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-                sprintf (str, "key%d", count);</div><div class='del'>-                ret = dict_set_str (dict, str, key);</div><div class='del'>-                if (ret)</div><div class='del'>-                        goto out;</div><div class='add'>+    for (i = 3; i &lt; wordcount; i += 2) {</div><div class='add'>+        key = (char *)words[i];</div><div class='add'>+        value = (char *)words[i + 1];</div><div class='ctx'> </div><div class='del'>-                sprintf (str, "value%d", count);</div><div class='del'>-                ret = dict_set_str (dict, str, value);</div><div class='add'>+        if (!key || !value) {</div><div class='add'>+            ret = -1;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-                if (ret)</div><div class='del'>-                        goto out;</div><div class='add'>+        count++;</div><div class='add'>+</div><div class='add'>+        if (fnmatch("user.*", key, FNM_NOESCAPE) != 0) {</div><div class='add'>+            ret = gf_strip_whitespace(value, strlen(value));</div><div class='add'>+            if (ret == -1)</div><div class='add'>+                goto out;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        if (strlen(value) == 0) {</div><div class='add'>+            ret = -1;</div><div class='add'>+            goto out;</div><div class='ctx'>         }</div><div class='ctx'> </div><div class='del'>-        ret = dict_set_int32 (dict, "count", count);</div><div class='add'>+        if (cli_is_key_spl(key)) {</div><div class='add'>+            ret = -1;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        sprintf(str, "key%d", count);</div><div class='add'>+        ret = dict_set_str(dict, str, key);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+</div><div class='add'>+        sprintf(str, "value%d", count);</div><div class='add'>+        ret = dict_set_str(dict, str, value);</div><div class='ctx'> </div><div class='ctx'>         if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+</div><div class='add'>+        if ((!strcmp(key, "cluster.enable-shared-storage")) &amp;&amp;</div><div class='add'>+            (!strcmp(value, "disable"))) {</div><div class='add'>+            question =</div><div class='add'>+                "Disabling cluster.enable-shared-storage "</div><div class='add'>+                "will delete the shared storage volume"</div><div class='add'>+                "(gluster_shared_storage), which is used "</div><div class='add'>+                "by snapshot scheduler, geo-replication "</div><div class='add'>+                "and NFS-Ganesha. Do you still want to "</div><div class='add'>+                "continue?";</div><div class='add'>+            answer = cli_cmd_get_confirmation(state, question);</div><div class='add'>+            if (GF_ANSWER_NO == answer) {</div><div class='add'>+                gf_log("cli", GF_LOG_ERROR,</div><div class='add'>+                       "Operation "</div><div class='add'>+                       "cancelled, exiting");</div><div class='add'>+                *op_errstr = gf_strdup("Aborted by user.");</div><div class='add'>+                ret = -1;</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+        if ((!strcmp(key, "nfs.disable")) &amp;&amp; (!strcmp(value, "off"))) {</div><div class='add'>+            question =</div><div class='add'>+                "Gluster NFS is being deprecated in favor "</div><div class='add'>+                "of NFS-Ganesha Enter \"yes\" to continue "</div><div class='add'>+                "using Gluster NFS";</div><div class='add'>+            answer = cli_cmd_get_confirmation(state, question);</div><div class='add'>+            if (GF_ANSWER_NO == answer) {</div><div class='add'>+                gf_log("cli", GF_LOG_ERROR,</div><div class='add'>+                       "Operation "</div><div class='add'>+                       "cancelled, exiting");</div><div class='add'>+                *op_errstr = gf_strdup("Aborted by user.");</div><div class='add'>+                ret = -1;</div><div class='ctx'>                 goto out;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        *options = dict;</div><div class='add'>+    ret = dict_set_int32(dict, "count", wordcount - 3);</div><div class='add'>+</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    *options = dict;</div><div class='ctx'> </div><div class='ctx'> out:</div><div class='del'>-        if (ret) {</div><div class='del'>-                if (dict)</div><div class='del'>-                        dict_destroy (dict);</div><div class='del'>-        }</div><div class='add'>+    if (ret &amp;&amp; dict)</div><div class='add'>+        dict_unref(dict);</div><div class='ctx'> </div><div class='del'>-        return ret;</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> int32_t</div><div class='del'>-cli_cmd_volume_add_brick_parse (const char **words, int wordcount,</div><div class='del'>-                                dict_t **options)</div><div class='add'>+cli_cmd_volume_add_brick_parse(struct cli_state *state, const char **words,</div><div class='add'>+                               int wordcount, dict_t **options, int *ret_type)</div><div class='ctx'> {</div><div class='del'>-        dict_t  *dict = NULL;</div><div class='del'>-        char    *volname = NULL;</div><div class='del'>-        char    *delimiter = NULL;</div><div class='del'>-        int     ret = -1;</div><div class='del'>-        gf1_cluster_type type = GF_CLUSTER_TYPE_NONE;</div><div class='del'>-        int     count = 0;</div><div class='del'>-        //char    key[50] = {0,};</div><div class='del'>-        int     brick_count = 0, brick_index = 0;</div><div class='del'>-        int     brick_list_size = 1;</div><div class='del'>-        char    brick_list[120000] = {0,};</div><div class='del'>-        int     j = 0;</div><div class='del'>-        char    *tmp_list = NULL;</div><div class='del'>-        char    *tmpptr = NULL;</div><div class='del'>-        char    *host_name = NULL;</div><div class='del'>-        char    *tmp = NULL;</div><div class='del'>-        char    *freeptr = NULL;</div><div class='add'>+    dict_t *dict = NULL;</div><div class='add'>+    char *volname = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int brick_count = 0, brick_index = 0;</div><div class='add'>+    char *bricks = NULL;</div><div class='add'>+    static char *opwords_cl[] = {"replica", "stripe", NULL};</div><div class='add'>+    gf1_cluster_type type = GF_CLUSTER_TYPE_NONE;</div><div class='add'>+    int count = 1;</div><div class='add'>+    int arbiter_count = 0;</div><div class='add'>+    char *w = NULL;</div><div class='add'>+    int index;</div><div class='add'>+    gf_boolean_t is_force = _gf_false;</div><div class='add'>+    int wc = wordcount;</div><div class='add'>+    gf_answer_t answer = GF_ANSWER_NO;</div><div class='add'>+    const char *question = NULL;</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(words);</div><div class='add'>+    GF_ASSERT(options);</div><div class='add'>+</div><div class='add'>+    dict = dict_new();</div><div class='add'>+</div><div class='add'>+    if (!dict)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    if (wordcount &lt; 3)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    volname = (char *)words[2];</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(volname);</div><div class='add'>+</div><div class='add'>+    ret = dict_set_str(dict, "volname", volname);</div><div class='add'>+</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    if (wordcount &lt; 4) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    if (wordcount &lt; 6) {</div><div class='add'>+        /* seems no options are given, go directly to the parse_brick */</div><div class='add'>+        brick_index = 3;</div><div class='add'>+        type = GF_CLUSTER_TYPE_NONE;</div><div class='add'>+        goto parse_bricks;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    w = str_getunamb(words[3], opwords_cl);</div><div class='add'>+    if (!w) {</div><div class='add'>+        type = GF_CLUSTER_TYPE_NONE;</div><div class='add'>+        index = 3;</div><div class='add'>+    } else if ((strcmp(w, "replica")) == 0) {</div><div class='add'>+        type = GF_CLUSTER_TYPE_REPLICATE;</div><div class='add'>+        count = strtol(words[4], NULL, 0);</div><div class='add'>+        if (!count || (count &lt; 2)) {</div><div class='add'>+            cli_err("replica count should be greater than 1");</div><div class='add'>+            ret = -1;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+        ret = dict_set_int32(dict, "replica-count", count);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+        index = 5;</div><div class='add'>+        if (words[index] &amp;&amp; !strcmp(words[index], "arbiter")) {</div><div class='add'>+            arbiter_count = strtol(words[6], NULL, 0);</div><div class='add'>+            if (arbiter_count != 1 || count != 3) {</div><div class='add'>+                cli_err(</div><div class='add'>+                    "For arbiter configuration, replica "</div><div class='add'>+                    "count must be 3 and arbiter count "</div><div class='add'>+                    "must be 1. The 3rd brick of the "</div><div class='add'>+                    "replica will be the arbiter");</div><div class='add'>+                ret = -1;</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+            ret = dict_set_int32(dict, "arbiter-count", arbiter_count);</div><div class='add'>+            if (ret)</div><div class='add'>+                goto out;</div><div class='add'>+            index = 7;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-        GF_ASSERT (words);</div><div class='del'>-        GF_ASSERT (options);</div><div class='add'>+        if (count == 2) {</div><div class='add'>+            if (strcmp(words[wordcount - 1], "force")) {</div><div class='add'>+                question =</div><div class='add'>+                    "Replica 2 volumes are prone to "</div><div class='add'>+                    "split-brain. Use Arbiter or "</div><div class='add'>+                    "Replica 3 to avoid this. See: "</div><div class='add'>+                    "http://docs.gluster.org/en/latest/Administrator%20Guide/"</div><div class='add'>+                    "Split%20brain%20and%20ways%20to%20deal%20with%20it/."</div><div class='add'>+                    "\nDo you still want to continue?\n";</div><div class='add'>+                answer = cli_cmd_get_confirmation(state, question);</div><div class='add'>+                if (GF_ANSWER_NO == answer) {</div><div class='add'>+                    gf_log("cli", GF_LOG_ERROR,</div><div class='add'>+                           "Add brick"</div><div class='add'>+                           " cancelled, exiting");</div><div class='add'>+                    ret = -1;</div><div class='add'>+                    goto out;</div><div class='add'>+                }</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+    } else if ((strcmp(w, "stripe")) == 0) {</div><div class='add'>+        cli_err("stripe option not supported");</div><div class='add'>+        goto out;</div><div class='add'>+    } else {</div><div class='add'>+        GF_ASSERT(!"opword mismatch");</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        GF_ASSERT ((strcmp (words[0], "volume")) == 0);</div><div class='del'>-        GF_ASSERT ((strcmp (words[1], "add-brick")) == 0);</div><div class='add'>+    brick_index = index;</div><div class='ctx'> </div><div class='del'>-        dict = dict_new ();</div><div class='add'>+parse_bricks:</div><div class='ctx'> </div><div class='del'>-        if (!dict)</div><div class='del'>-                goto out;</div><div class='add'>+    if (strcmp(words[wordcount - 1], "force") == 0) {</div><div class='add'>+        is_force = _gf_true;</div><div class='add'>+        wc = wordcount - 1;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        if (wordcount &lt; 3)</div><div class='del'>-                goto out;</div><div class='add'>+    ret = cli_cmd_bricks_parse(words, wc, brick_index, &amp;bricks, &amp;brick_count);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='ctx'> </div><div class='del'>-        volname = (char *)words[2];</div><div class='add'>+    ret = dict_set_dynstr(dict, "bricks", bricks);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    ret = dict_set_int32(dict, "count", brick_count);</div><div class='ctx'> </div><div class='del'>-        GF_ASSERT (volname);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='ctx'> </div><div class='del'>-        ret = dict_set_str (dict, "volname", volname);</div><div class='add'>+    ret = dict_set_int32(dict, "force", is_force);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='ctx'> </div><div class='add'>+    *options = dict;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (ret_type)</div><div class='add'>+        *ret_type = type;</div><div class='add'>+</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log("cli", GF_LOG_ERROR, "Unable to parse add-brick CLI");</div><div class='add'>+        if (dict)</div><div class='add'>+            dict_unref(dict);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+cli_cmd_volume_remove_brick_parse(struct cli_state *state, const char **words,</div><div class='add'>+                                  int wordcount, dict_t **options,</div><div class='add'>+                                  int *question, int *brick_count,</div><div class='add'>+                                  int32_t *comm)</div><div class='add'>+{</div><div class='add'>+    dict_t *dict = NULL;</div><div class='add'>+    char *volname = NULL;</div><div class='add'>+    char *delimiter = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    char key[50];</div><div class='add'>+    int brick_index = 0;</div><div class='add'>+    int32_t tmp_index = 0;</div><div class='add'>+    int32_t j = 0;</div><div class='add'>+    char *tmp_brick = NULL;</div><div class='add'>+    char *tmp_brick1 = NULL;</div><div class='add'>+    static char *type_opword[] = {"replica", NULL};</div><div class='add'>+    static char *opwords[] = {"start",  "commit", "stop",</div><div class='add'>+                              "status", "force",  NULL};</div><div class='add'>+    char *w = NULL;</div><div class='add'>+    int32_t command = GF_OP_CMD_NONE;</div><div class='add'>+    long count = 0;</div><div class='add'>+    gf_answer_t answer = GF_ANSWER_NO;</div><div class='add'>+    const char *ques = NULL;</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(words);</div><div class='add'>+    GF_ASSERT(options);</div><div class='add'>+</div><div class='add'>+    if (wordcount &lt; 5)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    dict = dict_new();</div><div class='add'>+    if (!dict)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    volname = (char *)words[2];</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(volname);</div><div class='add'>+</div><div class='add'>+    ret = dict_set_str(dict, "volname", volname);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    brick_index = 3;</div><div class='add'>+    w = str_getunamb(words[3], type_opword);</div><div class='add'>+    if (w &amp;&amp; !strcmp("replica", w)) {</div><div class='add'>+        if (wordcount &lt; 6) {</div><div class='add'>+            ret = -1;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+        count = strtol(words[4], NULL, 0);</div><div class='add'>+        if (count &lt; 1) {</div><div class='add'>+            cli_err(</div><div class='add'>+                "replica count should be greater than 0 in "</div><div class='add'>+                "case of remove-brick");</div><div class='add'>+            ret = -1;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        if (count == 2) {</div><div class='add'>+            if (strcmp(words[wordcount - 1], "force")) {</div><div class='add'>+                ques =</div><div class='add'>+                    "Replica 2 volumes are prone to "</div><div class='add'>+                    "split-brain. Use Arbiter or Replica 3 "</div><div class='add'>+                    "to avoid this. See: "</div><div class='add'>+                    "http://docs.gluster.org/en/latest/Administrator%20Guide/"</div><div class='add'>+                    "Split%20brain%20and%20ways%20to%20deal%20with%20it/."</div><div class='add'>+                    "\nDo you still want to continue?\n";</div><div class='add'>+                answer = cli_cmd_get_confirmation(state, ques);</div><div class='add'>+                if (GF_ANSWER_NO == answer) {</div><div class='add'>+                    gf_log("cli", GF_LOG_ERROR,</div><div class='add'>+                           "Remove "</div><div class='add'>+                           "brick cancelled, exiting");</div><div class='add'>+                    ret = -1;</div><div class='add'>+                    goto out;</div><div class='add'>+                }</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        ret = dict_set_int32(dict, "replica-count", count);</div><div class='ctx'>         if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+        brick_index = 5;</div><div class='add'>+    } else if (w) {</div><div class='add'>+        GF_ASSERT(!"opword mismatch");</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    w = str_getunamb(words[wordcount - 1], opwords);</div><div class='add'>+    if (!w) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    } else {</div><div class='add'>+        /* handled this option */</div><div class='add'>+        wordcount--;</div><div class='add'>+        if (!strcmp("start", w)) {</div><div class='add'>+            command = GF_OP_CMD_START;</div><div class='add'>+            if (question)</div><div class='add'>+                *question = 1;</div><div class='add'>+        } else if (!strcmp("commit", w)) {</div><div class='add'>+            command = GF_OP_CMD_COMMIT;</div><div class='add'>+        } else if (!strcmp("stop", w)) {</div><div class='add'>+            command = GF_OP_CMD_STOP;</div><div class='add'>+        } else if (!strcmp("status", w)) {</div><div class='add'>+            command = GF_OP_CMD_STATUS;</div><div class='add'>+        } else if (!strcmp("force", w)) {</div><div class='add'>+            command = GF_OP_CMD_COMMIT_FORCE;</div><div class='add'>+            if (question)</div><div class='add'>+                *question = 1;</div><div class='add'>+        } else {</div><div class='add'>+            GF_ASSERT(!"opword mismatch");</div><div class='add'>+            ret = -1;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_set_int32(dict, "command", command);</div><div class='add'>+    if (ret)</div><div class='add'>+        gf_log("cli", GF_LOG_INFO, "failed to set 'command' %d", command);</div><div class='add'>+</div><div class='add'>+    tmp_index = brick_index;</div><div class='add'>+    tmp_brick = GF_MALLOC(2048 * sizeof(*tmp_brick), gf_common_mt_char);</div><div class='add'>+</div><div class='add'>+    if (!tmp_brick) {</div><div class='add'>+        gf_log("", GF_LOG_ERROR,</div><div class='add'>+               "cli_cmd_volume_remove_brick_parse: "</div><div class='add'>+               "Unable to get memory");</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    tmp_brick1 = GF_MALLOC(2048 * sizeof(*tmp_brick1), gf_common_mt_char);</div><div class='add'>+</div><div class='add'>+    if (!tmp_brick1) {</div><div class='add'>+        gf_log("", GF_LOG_ERROR,</div><div class='add'>+               "cli_cmd_volume_remove_brick_parse: "</div><div class='add'>+               "Unable to get memory");</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    while (brick_index &lt; wordcount) {</div><div class='add'>+        if (validate_brick_name((char *)words[brick_index])) {</div><div class='add'>+            cli_err(</div><div class='add'>+                "wrong brick type: %s, use &lt;HOSTNAME&gt;:"</div><div class='add'>+                "&lt;export-dir-abs-path&gt;",</div><div class='add'>+                words[brick_index]);</div><div class='add'>+            ret = -1;</div><div class='add'>+            goto out;</div><div class='add'>+        } else {</div><div class='add'>+            delimiter = strrchr(words[brick_index], ':');</div><div class='add'>+            ret = gf_canonicalize_path(delimiter + 1);</div><div class='add'>+            if (ret)</div><div class='ctx'>                 goto out;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-        if (wordcount &lt; 4) {</div><div class='add'>+        j = tmp_index;</div><div class='add'>+        strcpy(tmp_brick, words[brick_index]);</div><div class='add'>+        while (j &lt; brick_index) {</div><div class='add'>+            strcpy(tmp_brick1, words[j]);</div><div class='add'>+            if (!(strcmp(tmp_brick, tmp_brick1))) {</div><div class='add'>+                gf_log("", GF_LOG_ERROR,</div><div class='add'>+                       "Duplicate bricks"</div><div class='add'>+                       " found %s",</div><div class='add'>+                       words[brick_index]);</div><div class='add'>+                cli_err("Duplicate bricks found %s", words[brick_index]);</div><div class='ctx'>                 ret = -1;</div><div class='ctx'>                 goto out;</div><div class='add'>+            }</div><div class='add'>+            j++;</div><div class='ctx'>         }</div><div class='add'>+        snprintf(key, 50, "brick%d", ++(*brick_count));</div><div class='add'>+        ret = dict_set_str(dict, key, (char *)words[brick_index++]);</div><div class='ctx'> </div><div class='del'>-        if ((strcasecmp (words[3], "replica")) == 0) {</div><div class='del'>-                type = GF_CLUSTER_TYPE_REPLICATE;</div><div class='del'>-                if (wordcount &lt; 5) {</div><div class='del'>-                        ret = -1;</div><div class='del'>-                        goto out;</div><div class='del'>-                }</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-                errno = 0;</div><div class='del'>-                count = strtol (words[4], NULL, 0);</div><div class='del'>-                if (errno == ERANGE &amp;&amp; (count == LONG_MAX || count == LONG_MIN))</div><div class='del'>-                        goto out;</div><div class='add'>+    if (command != GF_OP_CMD_STATUS &amp;&amp; command != GF_OP_CMD_STOP) {</div><div class='add'>+        ret = dict_set_int32(dict, "count", *brick_count);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-                brick_index = 5;</div><div class='del'>-        } else if ((strcasecmp (words[3], "stripe")) == 0) {</div><div class='del'>-                type = GF_CLUSTER_TYPE_STRIPE;</div><div class='del'>-                if (wordcount &lt; 5) {</div><div class='del'>-                        ret = -1;</div><div class='del'>-                        goto out;</div><div class='del'>-                }</div><div class='add'>+    *options = dict;</div><div class='ctx'> </div><div class='del'>-                errno = 0;</div><div class='del'>-                count = strtol (words[4], NULL, 0);</div><div class='del'>-                if (errno == ERANGE &amp;&amp; (count == LONG_MAX || count == LONG_MIN))</div><div class='del'>-                        goto out;</div><div class='add'>+out:</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log("cli", GF_LOG_ERROR, "Unable to parse remove-brick CLI");</div><div class='add'>+        if (dict)</div><div class='add'>+            dict_unref(dict);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-                brick_index = 5;</div><div class='del'>-        } else {</div><div class='del'>-                brick_index = 3;</div><div class='add'>+    GF_FREE(tmp_brick);</div><div class='add'>+    GF_FREE(tmp_brick1);</div><div class='add'>+</div><div class='add'>+    *comm = command;</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+cli_cmd_brick_op_validate_bricks(const char **words, dict_t *dict, int src,</div><div class='add'>+                                 int dst)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    char *delimiter = NULL;</div><div class='add'>+</div><div class='add'>+    if (validate_brick_name((char *)words[src])) {</div><div class='add'>+        cli_err(</div><div class='add'>+            "wrong brick type: %s, use "</div><div class='add'>+            "&lt;HOSTNAME&gt;:&lt;export-dir-abs-path&gt;",</div><div class='add'>+            words[3]);</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    } else {</div><div class='add'>+        delimiter = strrchr((char *)words[src], '/');</div><div class='add'>+        ret = gf_canonicalize_path(delimiter);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_set_str(dict, "src-brick", (char *)words[src]);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    if (dst == -1) {</div><div class='add'>+        ret = 0;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (validate_brick_name((char *)words[dst])) {</div><div class='add'>+        cli_err(</div><div class='add'>+            "wrong brick type: %s, use "</div><div class='add'>+            "&lt;HOSTNAME&gt;:&lt;export-dir-abs-path&gt;",</div><div class='add'>+            words[dst]);</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    } else {</div><div class='add'>+        delimiter = strrchr((char *)words[dst], '/');</div><div class='add'>+        ret = gf_canonicalize_path(delimiter);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_set_str(dict, "dst-brick", (char *)words[dst]);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+    ret = 0;</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+cli_cmd_volume_reset_brick_parse(const char **words, int wordcount,</div><div class='add'>+                                 dict_t **options)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    char *volname = NULL;</div><div class='add'>+    dict_t *dict = NULL;</div><div class='add'>+</div><div class='add'>+    if (wordcount &lt; 5 || wordcount &gt; 7)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    dict = dict_new();</div><div class='add'>+</div><div class='add'>+    if (!dict)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    volname = (char *)words[2];</div><div class='add'>+</div><div class='add'>+    ret = dict_set_str(dict, "volname", volname);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    if (wordcount == 5) {</div><div class='add'>+        if (strcmp(words[4], "start")) {</div><div class='add'>+            cli_err(</div><div class='add'>+                "Invalid option '%s' for reset-brick. Please "</div><div class='add'>+                "enter valid reset-brick command",</div><div class='add'>+                words[4]);</div><div class='add'>+            ret = -1;</div><div class='add'>+            goto out;</div><div class='ctx'>         }</div><div class='ctx'> </div><div class='del'>-        strcpy (brick_list, " ");</div><div class='del'>-        while (brick_index &lt; wordcount) {</div><div class='del'>-                delimiter = strchr (words[brick_index], ':');</div><div class='del'>-                if (!delimiter || delimiter == words[brick_index]</div><div class='del'>-                    || *(delimiter+1) != '/') {</div><div class='del'>-                        cli_out ("wrong brick type: %s, use &lt;HOSTNAME&gt;:"</div><div class='del'>-                                 "&lt;export-dir-abs-path&gt;", words[brick_index]);</div><div class='del'>-                        ret = -1;</div><div class='del'>-                        goto out;</div><div class='del'>-                }</div><div class='del'>-                if ((brick_list_size + strlen (words[brick_index]) + 1) &gt; 120000) {</div><div class='del'>-                        gf_log ("cli", GF_LOG_ERROR,</div><div class='del'>-                                "total brick list is larger than a request "</div><div class='del'>-                                "can take (brick_count %d)", brick_count);</div><div class='del'>-                        ret = -1;</div><div class='del'>-                        goto out;</div><div class='del'>-                }</div><div class='add'>+        ret = cli_cmd_brick_op_validate_bricks(words, dict, 3, -1);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='ctx'> </div><div class='del'>-                host_name = gf_strdup(words[brick_index]);</div><div class='del'>-                if (!host_name) {</div><div class='del'>-                        ret = -1;</div><div class='del'>-                        gf_log ("cli", GF_LOG_ERROR, "unable to allocate "</div><div class='del'>-                                "memory");</div><div class='del'>-                        goto out;</div><div class='del'>-                }</div><div class='del'>-                freeptr = host_name;</div><div class='del'>-                strtok_r(host_name, ":", &amp;tmp);</div><div class='del'>-                if (!(strcmp(host_name, "localhost") &amp;&amp;</div><div class='del'>-                      strcmp (host_name, "127.0.0.1"))) {</div><div class='del'>-                        cli_out ("Please provide a valid hostname/ip other "</div><div class='del'>-                                 "localhost or 127.0.0.1");</div><div class='del'>-                        ret = -1;</div><div class='del'>-                        GF_FREE (freeptr);</div><div class='del'>-                        goto out;</div><div class='del'>-                }</div><div class='del'>-                GF_FREE (freeptr);</div><div class='del'>-</div><div class='del'>-                tmp_list = strdup(brick_list+1);</div><div class='del'>-                j = 0;</div><div class='del'>-                while(( brick_count != 0) &amp;&amp; (j &lt; brick_count)) {</div><div class='del'>-                        strtok_r (tmp_list, " ", &amp;tmpptr);</div><div class='del'>-                        if (!(strcmp (tmp_list, words[brick_index]))) {</div><div class='del'>-                                ret = -1;</div><div class='del'>-                                cli_out ("Found duplicate"</div><div class='del'>-                                         " exports %s",words[brick_index]);</div><div class='del'>-                                goto out;</div><div class='del'>-                       }</div><div class='del'>-                       tmp_list = tmpptr;</div><div class='del'>-                       j++;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                strcat (brick_list, words[brick_index]);</div><div class='del'>-                strcat (brick_list, " ");</div><div class='del'>-                brick_list_size += (strlen (words[brick_index]) + 1);</div><div class='del'>-                ++brick_count;</div><div class='del'>-                ++brick_index;</div><div class='del'>-                /*</div><div class='del'>-                  char    key[50];</div><div class='del'>-                snprintf (key, 50, "brick%d", ++brick_count);</div><div class='del'>-                ret = dict_set_str (dict, key, (char *)words[brick_index++]);</div><div class='add'>+        ret = dict_set_str(dict, "operation", "GF_RESET_OP_START");</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+    } else if (wordcount == 6) {</div><div class='add'>+        if (strcmp(words[5], "commit")) {</div><div class='add'>+            cli_err(</div><div class='add'>+                "Invalid option '%s' for reset-brick. Please "</div><div class='add'>+                "enter valid reset-brick command",</div><div class='add'>+                words[5]);</div><div class='add'>+            ret = -1;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-                if (ret)</div><div class='del'>-                        goto out;</div><div class='del'>-                */</div><div class='add'>+        ret = cli_cmd_brick_op_validate_bricks(words, dict, 3, 4);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+</div><div class='add'>+        ret = dict_set_str(dict, "operation", "GF_RESET_OP_COMMIT");</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+    } else if (wordcount == 7) {</div><div class='add'>+        if (strcmp(words[5], "commit") || strcmp(words[6], "force")) {</div><div class='add'>+            cli_err(</div><div class='add'>+                "Invalid option '%s %s' for reset-brick. Please "</div><div class='add'>+                "enter valid reset-brick command",</div><div class='add'>+                words[5], words[6]);</div><div class='add'>+            ret = -1;</div><div class='add'>+            goto out;</div><div class='ctx'>         }</div><div class='del'>-        ret = dict_set_str (dict, "bricks", brick_list);</div><div class='add'>+</div><div class='add'>+        ret = cli_cmd_brick_op_validate_bricks(words, dict, 3, 4);</div><div class='ctx'>         if (ret)</div><div class='del'>-                goto out;</div><div class='add'>+            goto out;</div><div class='add'>+</div><div class='add'>+        ret = dict_set_str(dict, "operation", "GF_RESET_OP_COMMIT_FORCE");</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    *options = dict;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log("cli", GF_LOG_ERROR, "Unable to parse reset-brick CLI");</div><div class='add'>+        if (dict)</div><div class='add'>+            dict_unref(dict);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+cli_cmd_volume_replace_brick_parse(const char **words, int wordcount,</div><div class='add'>+                                   dict_t **options)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    char *volname = NULL;</div><div class='add'>+    dict_t *dict = NULL;</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(words);</div><div class='add'>+    GF_ASSERT(options);</div><div class='add'>+</div><div class='add'>+    if (wordcount != 7) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    dict = dict_new();</div><div class='add'>+</div><div class='add'>+    if (!dict) {</div><div class='add'>+        gf_log("cli", GF_LOG_ERROR, "Failed to allocate dictionary");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        ret = dict_set_int32 (dict, "count", brick_count);</div><div class='add'>+    volname = (char *)words[2];</div><div class='ctx'> </div><div class='add'>+    GF_ASSERT(volname);</div><div class='add'>+</div><div class='add'>+    ret = dict_set_str(dict, "volname", volname);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    ret = cli_cmd_brick_op_validate_bricks(words, dict, 3, 4);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    /* commit force option */</div><div class='add'>+    if (strcmp("commit", words[5]) || strcmp("force", words[6])) {</div><div class='add'>+        cli_err(</div><div class='add'>+            "Invalid option '%s' '%s' for replace-brick. Please "</div><div class='add'>+            "enter valid replace-brick command",</div><div class='add'>+            words[5], words[6]);</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_set_str(dict, "operation", "GF_REPLACE_OP_COMMIT_FORCE");</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    *options = dict;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log("cli", GF_LOG_ERROR, "Unable to parse reset-brick CLI");</div><div class='add'>+        if (dict)</div><div class='add'>+            dict_unref(dict);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+cli_cmd_log_filename_parse(const char **words, int wordcount, dict_t **options)</div><div class='add'>+{</div><div class='add'>+    dict_t *dict = NULL;</div><div class='add'>+    char *volname = NULL;</div><div class='add'>+    char *str = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    char *delimiter = NULL;</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(words);</div><div class='add'>+    GF_ASSERT(options);</div><div class='add'>+</div><div class='add'>+    dict = dict_new();</div><div class='add'>+    if (!dict)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    volname = (char *)words[3];</div><div class='add'>+    GF_ASSERT(volname);</div><div class='add'>+</div><div class='add'>+    ret = dict_set_str(dict, "volname", volname);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    str = (char *)words[4];</div><div class='add'>+    if (strchr(str, ':')) {</div><div class='add'>+        delimiter = strchr(words[4], ':');</div><div class='add'>+        if (!delimiter || delimiter == words[4] || *(delimiter + 1) != '/') {</div><div class='add'>+            cli_err(</div><div class='add'>+                "wrong brick type: %s, use &lt;HOSTNAME&gt;:"</div><div class='add'>+                "&lt;export-dir-abs-path&gt;",</div><div class='add'>+                words[4]);</div><div class='add'>+            ret = -1;</div><div class='add'>+            goto out;</div><div class='add'>+        } else {</div><div class='add'>+            ret = gf_canonicalize_path(delimiter + 1);</div><div class='add'>+            if (ret)</div><div class='add'>+                goto out;</div><div class='add'>+        }</div><div class='add'>+        ret = dict_set_str(dict, "brick", str);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+        /* Path */</div><div class='add'>+        str = (char *)words[5];</div><div class='add'>+        ret = dict_set_str(dict, "path", str);</div><div class='ctx'>         if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+    } else {</div><div class='add'>+        ret = dict_set_str(dict, "path", str);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    *options = dict;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (ret &amp;&amp; dict)</div><div class='add'>+        dict_unref(dict);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+cli_cmd_log_level_parse(const char **words, int worcount, dict_t **options)</div><div class='add'>+{</div><div class='add'>+    dict_t *dict = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(words);</div><div class='add'>+    GF_ASSERT(options);</div><div class='add'>+</div><div class='add'>+    /*</div><div class='add'>+     * loglevel command format:</div><div class='add'>+     *  &gt; volume log level &lt;VOL&gt; &lt;XLATOR[*]&gt; &lt;LOGLEVEL&gt;</div><div class='add'>+     *  &gt; volume log level colon-o posix WARNING</div><div class='add'>+     *  &gt; volume log level colon-o replicate* DEBUG</div><div class='add'>+     *  &gt; volume log level coon-o * TRACE</div><div class='add'>+     */</div><div class='add'>+</div><div class='add'>+    GF_ASSERT((strncmp(words[0], "volume", 6) == 0));</div><div class='add'>+    GF_ASSERT((strncmp(words[1], "log", 3) == 0));</div><div class='add'>+    GF_ASSERT((strncmp(words[2], "level", 5) == 0));</div><div class='add'>+</div><div class='add'>+    ret = glusterd_check_log_level(words[5]);</div><div class='add'>+    if (ret == -1) {</div><div class='add'>+        cli_err("Invalid log level [%s] specified", words[5]);</div><div class='add'>+        cli_err(</div><div class='add'>+            "Valid values for loglevel: (DEBUG|WARNING|ERROR"</div><div class='add'>+            "|CRITICAL|NONE|TRACE)");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    dict = dict_new();</div><div class='add'>+    if (!dict)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(words[3]);</div><div class='add'>+    GF_ASSERT(words[4]);</div><div class='add'>+</div><div class='add'>+    ret = dict_set_str(dict, "volname", (char *)words[3]);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    ret = dict_set_str(dict, "xlator", (char *)words[4]);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    ret = dict_set_str(dict, "loglevel", (char *)words[5]);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    *options = dict;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (ret &amp;&amp; dict)</div><div class='add'>+        dict_unref(dict);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+cli_cmd_log_locate_parse(const char **words, int wordcount, dict_t **options)</div><div class='add'>+{</div><div class='add'>+    dict_t *dict = NULL;</div><div class='add'>+    char *volname = NULL;</div><div class='add'>+    char *str = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    char *delimiter = NULL;</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(words);</div><div class='add'>+    GF_ASSERT(options);</div><div class='add'>+</div><div class='add'>+    dict = dict_new();</div><div class='add'>+    if (!dict)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    volname = (char *)words[3];</div><div class='add'>+    GF_ASSERT(volname);</div><div class='add'>+</div><div class='add'>+    ret = dict_set_str(dict, "volname", volname);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    if (words[4]) {</div><div class='add'>+        delimiter = strchr(words[4], ':');</div><div class='add'>+        if (!delimiter || delimiter == words[4] || *(delimiter + 1) != '/') {</div><div class='add'>+            cli_err(</div><div class='add'>+                "wrong brick type: %s, use &lt;HOSTNAME&gt;:"</div><div class='add'>+                "&lt;export-dir-abs-path&gt;",</div><div class='add'>+                words[4]);</div><div class='add'>+            ret = -1;</div><div class='add'>+            goto out;</div><div class='add'>+        } else {</div><div class='add'>+            ret = gf_canonicalize_path(delimiter + 1);</div><div class='add'>+            if (ret)</div><div class='ctx'>                 goto out;</div><div class='add'>+        }</div><div class='add'>+        str = (char *)words[4];</div><div class='add'>+        ret = dict_set_str(dict, "brick", str);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        *options = dict;</div><div class='add'>+    *options = dict;</div><div class='ctx'> </div><div class='ctx'> out:</div><div class='del'>-        if (ret) {</div><div class='del'>-                gf_log ("cli", GF_LOG_ERROR, "Unable to parse add-brick CLI");</div><div class='del'>-                if (dict)</div><div class='del'>-                        dict_destroy (dict);</div><div class='add'>+    if (ret &amp;&amp; dict)</div><div class='add'>+        dict_unref(dict);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+cli_cmd_log_rotate_parse(const char **words, int wordcount, dict_t **options)</div><div class='add'>+{</div><div class='add'>+    dict_t *dict = NULL;</div><div class='add'>+    char *volname = NULL;</div><div class='add'>+    char *str = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    char *delimiter = NULL;</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(words);</div><div class='add'>+    GF_ASSERT(options);</div><div class='add'>+</div><div class='add'>+    dict = dict_new();</div><div class='add'>+    if (!dict)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    if (strcmp("rotate", words[3]) == 0)</div><div class='add'>+        volname = (char *)words[2];</div><div class='add'>+    GF_ASSERT(volname);</div><div class='add'>+</div><div class='add'>+    ret = dict_set_str(dict, "volname", volname);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    if (words[4]) {</div><div class='add'>+        delimiter = strchr(words[4], ':');</div><div class='add'>+        if (!delimiter || delimiter == words[4] || *(delimiter + 1) != '/') {</div><div class='add'>+            cli_err(</div><div class='add'>+                "wrong brick type: %s, use &lt;HOSTNAME&gt;:"</div><div class='add'>+                "&lt;export-dir-abs-path&gt;",</div><div class='add'>+                words[4]);</div><div class='add'>+            ret = -1;</div><div class='add'>+            goto out;</div><div class='add'>+        } else {</div><div class='add'>+            ret = gf_canonicalize_path(delimiter + 1);</div><div class='add'>+            if (ret)</div><div class='add'>+                goto out;</div><div class='ctx'>         }</div><div class='add'>+        str = (char *)words[4];</div><div class='add'>+        ret = dict_set_str(dict, "brick", str);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        return ret;</div><div class='add'>+    *options = dict;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (ret &amp;&amp; dict)</div><div class='add'>+        dict_unref(dict);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+static gf_boolean_t</div><div class='add'>+gsyncd_url_check(const char *w)</div><div class='add'>+{</div><div class='add'>+    return !!strpbrk(w, ":/");</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-int32_t</div><div class='del'>-cli_cmd_volume_remove_brick_parse (const char **words, int wordcount,</div><div class='del'>-                                   dict_t **options)</div><div class='add'>+static gf_boolean_t</div><div class='add'>+valid_slave_gsyncd_url(const char *w)</div><div class='add'>+{</div><div class='add'>+    if (strstr(w, ":::"))</div><div class='add'>+        return _gf_false;</div><div class='add'>+    else if (strstr(w, "::"))</div><div class='add'>+        return _gf_true;</div><div class='add'>+    else</div><div class='add'>+        return _gf_false;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static gf_boolean_t</div><div class='add'>+gsyncd_glob_check(const char *w)</div><div class='ctx'> {</div><div class='del'>-        dict_t  *dict = NULL;</div><div class='del'>-        char    *volname = NULL;</div><div class='del'>-        char    *delimiter = NULL;</div><div class='del'>-        int     ret = -1;</div><div class='del'>-        gf1_cluster_type type = GF_CLUSTER_TYPE_NONE;</div><div class='del'>-        int     count = 0;</div><div class='del'>-        char    key[50];</div><div class='del'>-        int     brick_count = 0, brick_index = 0;</div><div class='del'>-        int32_t tmp_index = 0;</div><div class='del'>-        int32_t j = 0;</div><div class='del'>-        char    *tmp_brick = NULL;</div><div class='del'>-        char    *tmp_brick1 = NULL;</div><div class='add'>+    return !!strpbrk(w, "*?[");</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        GF_ASSERT (words);</div><div class='del'>-        GF_ASSERT (options);</div><div class='add'>+static int</div><div class='add'>+config_parse(const char **words, int wordcount, dict_t *dict, unsigned cmdi,</div><div class='add'>+             unsigned glob)</div><div class='add'>+{</div><div class='add'>+    int32_t ret = -1;</div><div class='add'>+    int32_t i = -1;</div><div class='add'>+    char *append_str = NULL;</div><div class='add'>+    size_t append_len = 0;</div><div class='add'>+    char *subop = NULL;</div><div class='add'>+    char *ret_chkpt = NULL;</div><div class='add'>+    struct tm checkpoint_time;</div><div class='add'>+    char chkpt_buf[20] = "";</div><div class='add'>+</div><div class='add'>+    switch ((wordcount - 1) - cmdi) {</div><div class='add'>+        case 0:</div><div class='add'>+            subop = gf_strdup("get-all");</div><div class='add'>+            break;</div><div class='add'>+        case 1:</div><div class='add'>+            if (words[cmdi + 1][0] == '!') {</div><div class='add'>+                (words[cmdi + 1])++;</div><div class='add'>+                if (gf_asprintf(&amp;subop, "del%s", glob ? "-glob" : "") == -1)</div><div class='add'>+                    subop = NULL;</div><div class='add'>+            } else</div><div class='add'>+                subop = gf_strdup("get");</div><div class='add'>+</div><div class='add'>+            ret = dict_set_str(dict, "op_name", ((char *)words[cmdi + 1]));</div><div class='add'>+            if (ret &lt; 0)</div><div class='add'>+                goto out;</div><div class='add'>+            break;</div><div class='add'>+        default:</div><div class='add'>+            if (gf_asprintf(&amp;subop, "set%s", glob ? "-glob" : "") == -1)</div><div class='add'>+                subop = NULL;</div><div class='ctx'> </div><div class='del'>-        GF_ASSERT ((strcmp (words[0], "volume")) == 0);</div><div class='del'>-        GF_ASSERT ((strcmp (words[1], "remove-brick")) == 0);</div><div class='add'>+            ret = dict_set_str(dict, "op_name", ((char *)words[cmdi + 1]));</div><div class='add'>+            if (ret &lt; 0)</div><div class='add'>+                goto out;</div><div class='ctx'> </div><div class='del'>-        dict = dict_new ();</div><div class='add'>+            /* join the varargs by spaces to get the op_value */</div><div class='ctx'> </div><div class='del'>-        if (!dict)</div><div class='add'>+            for (i = cmdi + 2; i &lt; wordcount; i++)</div><div class='add'>+                append_len += (strlen(words[i]) + 1);</div><div class='add'>+            /* trailing strcat will add two bytes, make space for that */</div><div class='add'>+            append_len++;</div><div class='add'>+</div><div class='add'>+            /* strcat is used on this allocation and hence expected to be</div><div class='add'>+             * initiatlized to 0. So GF_CALLOC is used.</div><div class='add'>+             */</div><div class='add'>+            append_str = GF_CALLOC(1, append_len, cli_mt_append_str);</div><div class='add'>+            if (!append_str) {</div><div class='add'>+                ret = -1;</div><div class='ctx'>                 goto out;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            for (i = cmdi + 2; i &lt; wordcount; i++) {</div><div class='add'>+                strcat(append_str, words[i]);</div><div class='add'>+                strcat(append_str, " ");</div><div class='add'>+            }</div><div class='add'>+            append_str[append_len - 2] = '\0';</div><div class='add'>+            /* "checkpoint now" is special: we resolve that "now" */</div><div class='add'>+            if ((strcmp(words[cmdi + 1], "checkpoint") == 0) &amp;&amp;</div><div class='add'>+                (strcmp(append_str, "now") == 0)) {</div><div class='add'>+                struct timeval tv = {</div><div class='add'>+                    0,</div><div class='add'>+                };</div><div class='add'>+</div><div class='add'>+                ret = gettimeofday(&amp;tv, NULL);</div><div class='add'>+                if (ret == -1)</div><div class='add'>+                    goto out;</div><div class='add'>+</div><div class='add'>+                GF_FREE(append_str);</div><div class='add'>+                append_str = GF_MALLOC(300, cli_mt_append_str);</div><div class='add'>+                if (!append_str) {</div><div class='add'>+                    ret = -1;</div><div class='add'>+                    goto out;</div><div class='add'>+                }</div><div class='add'>+                snprintf(append_str, 300, "%" GF_PRI_SECOND, tv.tv_sec);</div><div class='add'>+            } else if ((strcmp(words[cmdi + 1], "checkpoint") == 0) &amp;&amp;</div><div class='add'>+                       (strcmp(append_str, "now") != 0)) {</div><div class='add'>+                memset(&amp;checkpoint_time, 0, sizeof(struct tm));</div><div class='add'>+                ret_chkpt = strptime(append_str, "%Y-%m-%d %H:%M:%S",</div><div class='add'>+                                     &amp;checkpoint_time);</div><div class='add'>+</div><div class='add'>+                if (ret_chkpt == NULL || *ret_chkpt != '\0') {</div><div class='add'>+                    ret = -1;</div><div class='add'>+                    cli_err(</div><div class='add'>+                        "Invalid Checkpoint label. Use format "</div><div class='add'>+                        "\"Y-m-d H:M:S\", Example: 2016-10-25 15:30:45");</div><div class='add'>+                    goto out;</div><div class='add'>+                }</div><div class='add'>+                GF_FREE(append_str);</div><div class='add'>+                append_str = GF_MALLOC(300, cli_mt_append_str);</div><div class='add'>+                if (!append_str) {</div><div class='add'>+                    ret = -1;</div><div class='add'>+                    goto out;</div><div class='add'>+                }</div><div class='add'>+                strftime(chkpt_buf, sizeof(chkpt_buf), "%s", &amp;checkpoint_time);</div><div class='add'>+                snprintf(append_str, 300, "%s", chkpt_buf);</div><div class='add'>+            }</div><div class='ctx'> </div><div class='del'>-        if (wordcount &lt; 3)</div><div class='add'>+            ret = dict_set_dynstr(dict, "op_value", append_str);</div><div class='add'>+            if (ret != 0) {</div><div class='ctx'>                 goto out;</div><div class='add'>+            }</div><div class='add'>+            append_str = NULL;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        volname = (char *)words[2];</div><div class='add'>+    ret = -1;</div><div class='add'>+    if (subop) {</div><div class='add'>+        ret = dict_set_dynstr(dict, "subop", subop);</div><div class='add'>+        if (!ret)</div><div class='add'>+            subop = NULL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    GF_FREE(append_str);</div><div class='add'>+    GF_FREE(subop);</div><div class='add'>+</div><div class='add'>+    gf_log("cli", GF_LOG_DEBUG, "Returning %d", ret);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        GF_ASSERT (volname);</div><div class='add'>+/* ssh_port_parse: Parses and validates when ssh_port is given.</div><div class='add'>+ *                 ssh_index refers to index of ssh_port and</div><div class='add'>+ *                 type refers to either push-pem or no-verify</div><div class='add'>+ */</div><div class='ctx'> </div><div class='del'>-        ret = dict_set_str (dict, "volname", volname);</div><div class='add'>+static int32_t</div><div class='add'>+parse_ssh_port(const char **words, int wordcount, dict_t *dict, unsigned *cmdi,</div><div class='add'>+               int ssh_index, char *type)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+    char *end_ptr = NULL;</div><div class='add'>+    int64_t limit = 0;</div><div class='add'>+</div><div class='add'>+    if (!strcmp((char *)words[ssh_index], "ssh-port")) {</div><div class='add'>+        if (strcmp((char *)words[ssh_index - 1], "create")) {</div><div class='add'>+            ret = -1;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+        (*cmdi)++;</div><div class='add'>+        limit = strtol(words[ssh_index + 1], &amp;end_ptr, 10);</div><div class='add'>+        if (errno == ERANGE || errno == EINVAL || limit &lt;= 0 ||</div><div class='add'>+            strcmp(end_ptr, "") != 0) {</div><div class='add'>+            ret = -1;</div><div class='add'>+            cli_err("Please enter an integer value for ssh_port ");</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='add'>+        ret = dict_set_int32(dict, "ssh_port", limit);</div><div class='ctx'>         if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+        (*cmdi)++;</div><div class='add'>+    } else if (strcmp((char *)words[ssh_index + 1], "create")) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_set_int32(dict, type, 1);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+    (*cmdi)++;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int32_t</div><div class='add'>+force_push_pem_no_verify_parse(const char **words, int wordcount, dict_t *dict,</div><div class='add'>+                               unsigned *cmdi)</div><div class='add'>+{</div><div class='add'>+    int32_t ret = 0;</div><div class='add'>+</div><div class='add'>+    if (!strcmp((char *)words[wordcount - 1], "force")) {</div><div class='add'>+        if ((strcmp((char *)words[wordcount - 2], "start")) &amp;&amp;</div><div class='add'>+            (strcmp((char *)words[wordcount - 2], "stop")) &amp;&amp;</div><div class='add'>+            (strcmp((char *)words[wordcount - 2], "create")) &amp;&amp;</div><div class='add'>+            (strcmp((char *)words[wordcount - 2], "no-verify")) &amp;&amp;</div><div class='add'>+            (strcmp((char *)words[wordcount - 2], "push-pem")) &amp;&amp;</div><div class='add'>+            (strcmp((char *)words[wordcount - 2], "pause")) &amp;&amp;</div><div class='add'>+            (strcmp((char *)words[wordcount - 2], "resume"))) {</div><div class='add'>+            ret = -1;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+        ret = dict_set_int32n(dict, "force", SLEN("force"), 1);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+        (*cmdi)++;</div><div class='add'>+</div><div class='add'>+        if (!strcmp((char *)words[wordcount - 2], "push-pem")) {</div><div class='add'>+            ret = parse_ssh_port(words, wordcount, dict, cmdi, wordcount - 4,</div><div class='add'>+                                 "push_pem");</div><div class='add'>+            if (ret)</div><div class='ctx'>                 goto out;</div><div class='add'>+        } else if (!strcmp((char *)words[wordcount - 2], "no-verify")) {</div><div class='add'>+            ret = parse_ssh_port(words, wordcount, dict, cmdi, wordcount - 4,</div><div class='add'>+                                 "no_verify");</div><div class='add'>+            if (ret)</div><div class='add'>+                goto out;</div><div class='add'>+        }</div><div class='add'>+    } else if (!strcmp((char *)words[wordcount - 1], "push-pem")) {</div><div class='add'>+        ret = parse_ssh_port(words, wordcount, dict, cmdi, wordcount - 3,</div><div class='add'>+                             "push_pem");</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+    } else if (!strcmp((char *)words[wordcount - 1], "no-verify")) {</div><div class='add'>+        ret = parse_ssh_port(words, wordcount, dict, cmdi, wordcount - 3,</div><div class='add'>+                             "no_verify");</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    gf_log("cli", GF_LOG_DEBUG, "Returning %d", ret);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+cli_cmd_gsync_set_parse(struct cli_state *state, const char **words,</div><div class='add'>+                        int wordcount, dict_t **options, char **errstr)</div><div class='add'>+{</div><div class='add'>+    int32_t ret = -1;</div><div class='add'>+    dict_t *dict = NULL;</div><div class='add'>+    gf1_cli_gsync_set type = GF_GSYNC_OPTION_TYPE_NONE;</div><div class='add'>+    int i = 0;</div><div class='add'>+    unsigned masteri = 0;</div><div class='add'>+    unsigned slavei = 0;</div><div class='add'>+    unsigned glob = 0;</div><div class='add'>+    unsigned cmdi = 0;</div><div class='add'>+    static char *opwords[] = {"create",    "status",   "start",  "stop",</div><div class='add'>+                              "config",    "force",    "delete", "ssh-port",</div><div class='add'>+                              "no-verify", "push-pem", "detail", "pause",</div><div class='add'>+                              "resume",    NULL};</div><div class='add'>+    char *w = NULL;</div><div class='add'>+    char *save_ptr = NULL;</div><div class='add'>+    char *slave_temp = NULL;</div><div class='add'>+    char *token = NULL;</div><div class='add'>+    gf_answer_t answer = GF_ANSWER_NO;</div><div class='add'>+    const char *question = NULL;</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(words);</div><div class='add'>+    GF_ASSERT(options);</div><div class='add'>+</div><div class='add'>+    dict = dict_new();</div><div class='add'>+    if (!dict)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    /* new syntax:</div><div class='add'>+     *</div><div class='add'>+     * volume geo-replication $m $s create [[ssh-port n] [[no-verify] |</div><div class='add'>+     * [push-pem]]] [force] volume geo-replication [$m [$s]] status [detail]</div><div class='add'>+     * volume geo-replication [$m] $s config [[!]$opt [$val]]</div><div class='add'>+     * volume geo-replication $m $s start|stop [force]</div><div class='add'>+     * volume geo-replication $m $s delete [reset-sync-time]</div><div class='add'>+     * volume geo-replication $m $s pause [force]</div><div class='add'>+     * volume geo-replication $m $s resume [force]</div><div class='add'>+     */</div><div class='add'>+</div><div class='add'>+    if (wordcount &lt; 3)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    for (i = 2; i &lt;= 3 &amp;&amp; i &lt; wordcount - 1; i++) {</div><div class='add'>+        if (gsyncd_glob_check(words[i]))</div><div class='add'>+            glob = i;</div><div class='add'>+        if (gsyncd_url_check(words[i])) {</div><div class='add'>+            slavei = i;</div><div class='add'>+            break;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (glob &amp;&amp; !slavei)</div><div class='add'>+        /* glob is allowed only for config, thus it implies there is a</div><div class='add'>+         * slave argument; but that might have not been recognized on</div><div class='add'>+         * the first scan as it's url characteristics has been covered</div><div class='add'>+         * by the glob syntax.</div><div class='add'>+         *</div><div class='add'>+         * In this case, the slave is perforce the last glob-word -- the</div><div class='add'>+         * upcoming one is neither glob, nor url, so it's definitely not</div><div class='add'>+         * the slave.</div><div class='add'>+         */</div><div class='add'>+        slavei = glob;</div><div class='add'>+    if (slavei) {</div><div class='add'>+        cmdi = slavei + 1;</div><div class='add'>+        if (slavei == 3)</div><div class='add'>+            masteri = 2;</div><div class='add'>+    } else if (i &lt;= 4) {</div><div class='add'>+        if (strtail("detail", (char *)words[wordcount - 1])) {</div><div class='add'>+            cmdi = wordcount - 2;</div><div class='add'>+            if (i == 4)</div><div class='add'>+                masteri = 2;</div><div class='add'>+        } else {</div><div class='add'>+            /* no $s, can only be status cmd</div><div class='add'>+             * (with either a single $m before it or nothing)</div><div class='add'>+             * -- these conditions imply that i &lt;= 3 after</div><div class='add'>+             * the iteration and that i is the successor of</div><div class='add'>+             * the (0 or 1 length) sequence of $m-s.</div><div class='add'>+             */</div><div class='add'>+            cmdi = i;</div><div class='add'>+            if (i == 3)</div><div class='add'>+                masteri = 2;</div><div class='add'>+        }</div><div class='add'>+    } else</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    /* now check if input really complies syntax</div><div class='add'>+     * (in a somewhat redundant way, in favor</div><div class='add'>+     * transparent soundness)</div><div class='add'>+     */</div><div class='add'>+</div><div class='add'>+    if (masteri &amp;&amp; gsyncd_url_check(words[masteri]))</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    if (slavei &amp;&amp; !glob &amp;&amp; !valid_slave_gsyncd_url(words[slavei])) {</div><div class='add'>+        gf_asprintf(errstr, "Invalid slave url: %s", words[slavei]);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    w = str_getunamb(words[cmdi], opwords);</div><div class='add'>+    if (!w)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    if (strcmp(w, "create") == 0) {</div><div class='add'>+        type = GF_GSYNC_OPTION_TYPE_CREATE;</div><div class='add'>+</div><div class='add'>+        if (!masteri || !slavei)</div><div class='add'>+            goto out;</div><div class='add'>+    } else if (strcmp(w, "status") == 0) {</div><div class='add'>+        type = GF_GSYNC_OPTION_TYPE_STATUS;</div><div class='add'>+</div><div class='add'>+        if (slavei &amp;&amp; !masteri)</div><div class='add'>+            goto out;</div><div class='add'>+    } else if (strcmp(w, "config") == 0) {</div><div class='add'>+        type = GF_GSYNC_OPTION_TYPE_CONFIG;</div><div class='add'>+</div><div class='add'>+        if (!slavei)</div><div class='add'>+            goto out;</div><div class='add'>+    } else if (strcmp(w, "start") == 0) {</div><div class='add'>+        type = GF_GSYNC_OPTION_TYPE_START;</div><div class='add'>+</div><div class='add'>+        if (!masteri || !slavei)</div><div class='add'>+            goto out;</div><div class='add'>+    } else if (strcmp(w, "stop") == 0) {</div><div class='add'>+        type = GF_GSYNC_OPTION_TYPE_STOP;</div><div class='add'>+</div><div class='add'>+        if (!masteri || !slavei)</div><div class='add'>+            goto out;</div><div class='add'>+    } else if (strcmp(w, "delete") == 0) {</div><div class='add'>+        type = GF_GSYNC_OPTION_TYPE_DELETE;</div><div class='add'>+</div><div class='add'>+        if (!masteri || !slavei)</div><div class='add'>+            goto out;</div><div class='add'>+    } else if (strcmp(w, "pause") == 0) {</div><div class='add'>+        type = GF_GSYNC_OPTION_TYPE_PAUSE;</div><div class='add'>+</div><div class='add'>+        if (!masteri || !slavei)</div><div class='add'>+            goto out;</div><div class='add'>+    } else if (strcmp(w, "resume") == 0) {</div><div class='add'>+        type = GF_GSYNC_OPTION_TYPE_RESUME;</div><div class='add'>+</div><div class='add'>+        if (!masteri || !slavei)</div><div class='add'>+            goto out;</div><div class='add'>+    } else</div><div class='add'>+        GF_ASSERT(!"opword mismatch");</div><div class='add'>+</div><div class='add'>+    ret = force_push_pem_no_verify_parse(words, wordcount, dict, &amp;cmdi);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    if (strtail("detail", (char *)words[wordcount - 1])) {</div><div class='add'>+        if (!strtail("status", (char *)words[wordcount - 2])) {</div><div class='add'>+            ret = -1;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-        if (wordcount &lt; 4) {</div><div class='add'>+        ret = dict_set_uint32(dict, "status-detail", _gf_true);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+        cmdi++;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (type == GF_GSYNC_OPTION_TYPE_DELETE &amp;&amp;</div><div class='add'>+        !strcmp((char *)words[wordcount - 1], "reset-sync-time")) {</div><div class='add'>+        if (strcmp((char *)words[wordcount - 2], "delete")) {</div><div class='add'>+            ret = -1;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+        ret = dict_set_uint32(dict, "reset-sync-time", _gf_true);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+        cmdi++;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (type != GF_GSYNC_OPTION_TYPE_CONFIG &amp;&amp; (cmdi &lt; wordcount - 1 || glob)) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* If got so far, input is valid, assemble the message */</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+</div><div class='add'>+    if (masteri) {</div><div class='add'>+        ret = dict_set_str(dict, "master", (char *)words[masteri]);</div><div class='add'>+        if (!ret)</div><div class='add'>+            ret = dict_set_str(dict, "volname", (char *)words[masteri]);</div><div class='add'>+    }</div><div class='add'>+    if (!ret &amp;&amp; slavei) {</div><div class='add'>+        /* If geo-rep is created with root user using the syntax</div><div class='add'>+         * gluster vol geo-rep &lt;mastervol&gt; root@&lt;slavehost&gt; ...</div><div class='add'>+         * pass down only &lt;slavehost&gt; else pass as it is.</div><div class='add'>+         */</div><div class='add'>+        slave_temp = gf_strdup(words[slavei]);</div><div class='add'>+        if (slave_temp == NULL) {</div><div class='add'>+            ret = -1;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+        token = strtok_r(slave_temp, "@", &amp;save_ptr);</div><div class='add'>+        if (token &amp;&amp; !strcmp(token, "root")) {</div><div class='add'>+            ret = dict_set_str(dict, "slave", (char *)words[slavei] + 5);</div><div class='add'>+        } else {</div><div class='add'>+            ret = dict_set_str(dict, "slave", (char *)words[slavei]);</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    if (!ret)</div><div class='add'>+        ret = dict_set_int32(dict, "type", type);</div><div class='add'>+    if (!ret &amp;&amp; type == GF_GSYNC_OPTION_TYPE_CONFIG) {</div><div class='add'>+        if (!strcmp((char *)words[wordcount - 2], "ignore-deletes") &amp;&amp;</div><div class='add'>+            !strcmp((char *)words[wordcount - 1], "true")) {</div><div class='add'>+            question =</div><div class='add'>+                "There exists ~15 seconds delay for the option to take"</div><div class='add'>+                " effect from stime of the corresponding brick. Please"</div><div class='add'>+                " check the log for the time, the option is effective."</div><div class='add'>+                " Proceed";</div><div class='add'>+</div><div class='add'>+            answer = cli_cmd_get_confirmation(state, question);</div><div class='add'>+</div><div class='add'>+            if (GF_ANSWER_NO == answer) {</div><div class='add'>+                gf_log("cli", GF_LOG_INFO,</div><div class='add'>+                       "Operation "</div><div class='add'>+                       "cancelled, exiting");</div><div class='add'>+                *errstr = gf_strdup("Aborted by user.");</div><div class='ctx'>                 ret = -1;</div><div class='ctx'>                 goto out;</div><div class='add'>+            }</div><div class='ctx'>         }</div><div class='ctx'> </div><div class='del'>-        if ((strcasecmp (words[3], "replica")) == 0) {</div><div class='del'>-                type = GF_CLUSTER_TYPE_REPLICATE;</div><div class='del'>-                if (wordcount &lt; 5) {</div><div class='del'>-                        ret = -1;</div><div class='del'>-                        goto out;</div><div class='del'>-                }</div><div class='del'>-                errno = 0;</div><div class='del'>-                count = strtol (words[4], NULL, 0);</div><div class='del'>-                if (errno == ERANGE &amp;&amp; (count == LONG_MAX || count == LONG_MIN))</div><div class='del'>-                        goto out;</div><div class='add'>+        ret = config_parse(words, wordcount, dict, cmdi, glob);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-                brick_index = 5;</div><div class='del'>-        } else if ((strcasecmp (words[3], "stripe")) == 0) {</div><div class='del'>-                type = GF_CLUSTER_TYPE_STRIPE;</div><div class='del'>-                if (wordcount &lt; 5) {</div><div class='del'>-                        ret = -1;</div><div class='del'>-                        goto out;</div><div class='del'>-                }</div><div class='add'>+out:</div><div class='add'>+    if (slave_temp)</div><div class='add'>+        GF_FREE(slave_temp);</div><div class='add'>+    if (ret &amp;&amp; dict)</div><div class='add'>+        dict_unref(dict);</div><div class='add'>+    else</div><div class='add'>+        *options = dict;</div><div class='ctx'> </div><div class='del'>-                errno = 0;</div><div class='del'>-                count = strtol (words[4], NULL, 0);</div><div class='del'>-                if (errno == ERANGE &amp;&amp; (count == LONG_MAX || count == LONG_MIN))</div><div class='del'>-                        goto out;</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-                brick_index = 5;</div><div class='del'>-        } else {</div><div class='del'>-                brick_index = 3;</div><div class='add'>+int32_t</div><div class='add'>+cli_cmd_volume_profile_parse(const char **words, int wordcount,</div><div class='add'>+                             dict_t **options)</div><div class='add'>+{</div><div class='add'>+    dict_t *dict = NULL;</div><div class='add'>+    char *volname = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    gf1_cli_stats_op op = GF_CLI_STATS_NONE;</div><div class='add'>+    gf1_cli_info_op info_op = GF_CLI_INFO_NONE;</div><div class='add'>+    gf_boolean_t is_peek = _gf_false;</div><div class='add'>+</div><div class='add'>+    static char *opwords[] = {"start", "stop", "info", NULL};</div><div class='add'>+    char *w = NULL;</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(words);</div><div class='add'>+    GF_ASSERT(options);</div><div class='add'>+</div><div class='add'>+    dict = dict_new();</div><div class='add'>+    if (!dict)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    if (wordcount &lt; 4)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    volname = (char *)words[2];</div><div class='add'>+</div><div class='add'>+    ret = dict_set_str(dict, "volname", volname);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    w = str_getunamb(words[3], opwords);</div><div class='add'>+    if (!w) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if ((strcmp(w, "start") == 0 || strcmp(w, "stop") == 0) &amp;&amp; wordcount &gt; 5) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (strcmp(w, "info") == 0 &amp;&amp; wordcount &gt; 7) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (strcmp(w, "start") == 0) {</div><div class='add'>+        op = GF_CLI_STATS_START;</div><div class='add'>+    } else if (strcmp(w, "stop") == 0) {</div><div class='add'>+        op = GF_CLI_STATS_STOP;</div><div class='add'>+    } else if (strcmp(w, "info") == 0) {</div><div class='add'>+        op = GF_CLI_STATS_INFO;</div><div class='add'>+        info_op = GF_CLI_INFO_ALL;</div><div class='add'>+        if (wordcount &gt; 4) {</div><div class='add'>+            if (strcmp(words[4], "incremental") == 0) {</div><div class='add'>+                info_op = GF_CLI_INFO_INCREMENTAL;</div><div class='add'>+                if (wordcount &gt; 5 &amp;&amp; strcmp(words[5], "peek") == 0) {</div><div class='add'>+                    is_peek = _gf_true;</div><div class='add'>+                }</div><div class='add'>+            } else if (strcmp(words[4], "cumulative") == 0) {</div><div class='add'>+                info_op = GF_CLI_INFO_CUMULATIVE;</div><div class='add'>+            } else if (strcmp(words[4], "clear") == 0) {</div><div class='add'>+                info_op = GF_CLI_INFO_CLEAR;</div><div class='add'>+            } else if (strcmp(words[4], "peek") == 0) {</div><div class='add'>+                is_peek = _gf_true;</div><div class='add'>+            }</div><div class='ctx'>         }</div><div class='add'>+    } else</div><div class='add'>+        GF_ASSERT(!"opword mismatch");</div><div class='add'>+</div><div class='add'>+    ret = dict_set_int32(dict, "op", (int32_t)op);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    ret = dict_set_int32(dict, "info-op", (int32_t)info_op);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='ctx'> </div><div class='del'>-        ret = dict_set_int32 (dict, "type", type);</div><div class='add'>+    ret = dict_set_int32(dict, "peek", is_peek);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='ctx'> </div><div class='add'>+    if (!strcmp(words[wordcount - 1], "nfs")) {</div><div class='add'>+        ret = dict_set_int32(dict, "nfs", _gf_true);</div><div class='ctx'>         if (ret)</div><div class='del'>-                goto out;</div><div class='add'>+            goto out;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        tmp_index = brick_index;</div><div class='del'>-        tmp_brick = GF_MALLOC(2048 * sizeof(*tmp_brick), gf_common_mt_char);</div><div class='add'>+    *options = dict;</div><div class='add'>+out:</div><div class='add'>+    if (ret &amp;&amp; dict)</div><div class='add'>+        dict_unref(dict);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        if (!tmp_brick) {</div><div class='del'>-                gf_log ("",GF_LOG_ERROR,"cli_cmd_volume_remove_brick_parse: "</div><div class='del'>-                        "Unable to get memory");</div><div class='add'>+int32_t</div><div class='add'>+cli_cmd_volume_top_parse(const char **words, int wordcount, dict_t **options)</div><div class='add'>+{</div><div class='add'>+    dict_t *dict = NULL;</div><div class='add'>+    char *volname = NULL;</div><div class='add'>+    char *value = NULL;</div><div class='add'>+    char *key = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    gf1_cli_stats_op op = GF_CLI_STATS_NONE;</div><div class='add'>+    gf1_cli_top_op top_op = GF_CLI_TOP_NONE;</div><div class='add'>+    int32_t list_cnt = -1;</div><div class='add'>+    int index = 0;</div><div class='add'>+    int perf = 0;</div><div class='add'>+    int32_t blk_size = 0;</div><div class='add'>+    int count = 0;</div><div class='add'>+    gf_boolean_t nfs = _gf_false;</div><div class='add'>+    char *delimiter = NULL;</div><div class='add'>+    static char *opwords[] = {"open",       "read",    "write",</div><div class='add'>+                              "opendir",    "readdir", "read-perf",</div><div class='add'>+                              "write-perf", "clear",   NULL};</div><div class='add'>+    char *w = NULL;</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(words);</div><div class='add'>+    GF_ASSERT(options);</div><div class='add'>+</div><div class='add'>+    dict = dict_new();</div><div class='add'>+    if (!dict)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    if (wordcount &lt; 4)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    volname = (char *)words[2];</div><div class='add'>+</div><div class='add'>+    ret = dict_set_str(dict, "volname", volname);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    op = GF_CLI_STATS_TOP;</div><div class='add'>+    ret = dict_set_int32(dict, "op", (int32_t)op);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    w = str_getunamb(words[3], opwords);</div><div class='add'>+    if (!w) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    if (strcmp(w, "open") == 0) {</div><div class='add'>+        top_op = GF_CLI_TOP_OPEN;</div><div class='add'>+    } else if (strcmp(w, "read") == 0) {</div><div class='add'>+        top_op = GF_CLI_TOP_READ;</div><div class='add'>+    } else if (strcmp(w, "write") == 0) {</div><div class='add'>+        top_op = GF_CLI_TOP_WRITE;</div><div class='add'>+    } else if (strcmp(w, "opendir") == 0) {</div><div class='add'>+        top_op = GF_CLI_TOP_OPENDIR;</div><div class='add'>+    } else if (strcmp(w, "readdir") == 0) {</div><div class='add'>+        top_op = GF_CLI_TOP_READDIR;</div><div class='add'>+    } else if (strcmp(w, "read-perf") == 0) {</div><div class='add'>+        top_op = GF_CLI_TOP_READ_PERF;</div><div class='add'>+        perf = 1;</div><div class='add'>+    } else if (strcmp(w, "write-perf") == 0) {</div><div class='add'>+        top_op = GF_CLI_TOP_WRITE_PERF;</div><div class='add'>+        perf = 1;</div><div class='add'>+    } else if (strcmp(w, "clear") == 0) {</div><div class='add'>+        ret = dict_set_int32(dict, "clear-stats", 1);</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_log("cli", GF_LOG_ERROR, "Could not set clear-stats in dict");</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    } else</div><div class='add'>+        GF_ASSERT(!"opword mismatch");</div><div class='add'>+    ret = dict_set_int32(dict, "top-op", (int32_t)top_op);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    if ((wordcount &gt; 4) &amp;&amp; !strcmp(words[4], "nfs")) {</div><div class='add'>+        nfs = _gf_true;</div><div class='add'>+        ret = dict_set_int32(dict, "nfs", nfs);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+        index = 5;</div><div class='add'>+    } else {</div><div class='add'>+        index = 4;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    for (; index &lt; wordcount; index += 2) {</div><div class='add'>+        key = (char *)words[index];</div><div class='add'>+        value = (char *)words[index + 1];</div><div class='add'>+</div><div class='add'>+        if (!key || !value) {</div><div class='add'>+            ret = -1;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+        if (!strcmp(key, "brick")) {</div><div class='add'>+            delimiter = strchr(value, ':');</div><div class='add'>+            if (!delimiter || delimiter == value || *(delimiter + 1) != '/') {</div><div class='add'>+                cli_err(</div><div class='add'>+                    "wrong brick type: %s, use &lt;HOSTNAME&gt;:"</div><div class='add'>+                    "&lt;export-dir-abs-path&gt;",</div><div class='add'>+                    value);</div><div class='ctx'>                 ret = -1;</div><div class='ctx'>                 goto out;</div><div class='del'>-        }</div><div class='del'>- </div><div class='del'>-        tmp_brick1 = GF_MALLOC(2048 * sizeof(*tmp_brick1), gf_common_mt_char);</div><div class='add'>+            } else {</div><div class='add'>+                ret = gf_canonicalize_path(delimiter + 1);</div><div class='add'>+                if (ret)</div><div class='add'>+                    goto out;</div><div class='add'>+            }</div><div class='add'>+            ret = dict_set_str(dict, "brick", value);</div><div class='add'>+</div><div class='add'>+        } else if (!strcmp(key, "list-cnt")) {</div><div class='add'>+            ret = gf_is_str_int(value);</div><div class='add'>+            if (!ret)</div><div class='add'>+                list_cnt = atoi(value);</div><div class='add'>+            if (ret || (list_cnt &lt; 0) || (list_cnt &gt; 100)) {</div><div class='add'>+                cli_err("list-cnt should be between 0 to 100");</div><div class='add'>+                ret = -1;</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+        } else if (perf &amp;&amp; !nfs &amp;&amp; !strcmp(key, "bs")) {</div><div class='add'>+            ret = gf_is_str_int(value);</div><div class='add'>+            if (!ret)</div><div class='add'>+                blk_size = atoi(value);</div><div class='add'>+            if (ret || (blk_size &lt;= 0)) {</div><div class='add'>+                if (blk_size &lt; 0)</div><div class='add'>+                    cli_err(</div><div class='add'>+                        "block size is an invalid"</div><div class='add'>+                        " number");</div><div class='add'>+                else</div><div class='add'>+                    cli_err(</div><div class='add'>+                        "block size should be an "</div><div class='add'>+                        "integer greater than zero");</div><div class='add'>+                ret = -1;</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+            ret = dict_set_uint32(dict, "blk-size", (uint32_t)blk_size);</div><div class='add'>+        } else if (perf &amp;&amp; !nfs &amp;&amp; !strcmp(key, "count")) {</div><div class='add'>+            ret = gf_is_str_int(value);</div><div class='add'>+            if (!ret)</div><div class='add'>+                count = atoi(value);</div><div class='add'>+            if (ret || (count &lt;= 0)) {</div><div class='add'>+                if (count &lt; 0)</div><div class='add'>+                    cli_err("count is an invalid number");</div><div class='add'>+                else</div><div class='add'>+                    cli_err(</div><div class='add'>+                        "count should be an integer "</div><div class='add'>+                        "greater than zero");</div><div class='ctx'> </div><div class='del'>-        if (!tmp_brick1) {</div><div class='del'>-                gf_log ("",GF_LOG_ERROR,"cli_cmd_volume_remove_brick_parse: "</div><div class='del'>-                        "Unable to get memory");</div><div class='ctx'>                 ret = -1;</div><div class='ctx'>                 goto out;</div><div class='add'>+            }</div><div class='add'>+            ret = dict_set_uint32(dict, "blk-cnt", count);</div><div class='add'>+        } else {</div><div class='add'>+            ret = -1;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_log("", GF_LOG_WARNING,</div><div class='add'>+                   "Dict set failed for "</div><div class='add'>+                   "key %s",</div><div class='add'>+                   key);</div><div class='add'>+            goto out;</div><div class='ctx'>         }</div><div class='add'>+    }</div><div class='add'>+    if (list_cnt == -1)</div><div class='add'>+        list_cnt = 100;</div><div class='add'>+    ret = dict_set_int32(dict, "list-cnt", list_cnt);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log("", GF_LOG_WARNING, "Dict set failed for list_cnt");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if ((blk_size &gt; 0) ^ (count &gt; 0)) {</div><div class='add'>+        cli_err("Need to give both 'bs' and 'count'");</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    } else if (((uint64_t)blk_size * count) &gt; (10 * GF_UNIT_GB)) {</div><div class='add'>+        cli_err("'bs * count' value %" PRIu64</div><div class='add'>+                " is greater than "</div><div class='add'>+                "maximum allowed value of 10GB",</div><div class='add'>+                ((uint64_t)blk_size * count));</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    *options = dict;</div><div class='add'>+out:</div><div class='add'>+    if (ret &amp;&amp; dict)</div><div class='add'>+        dict_unref(dict);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        while (brick_index &lt; wordcount) {</div><div class='del'>-                delimiter = strchr(words[brick_index], ':');</div><div class='del'>-                if (!delimiter || delimiter == words[brick_index]</div><div class='del'>-                    || *(delimiter+1) != '/') {</div><div class='del'>-                        cli_out ("wrong brick type: %s, use &lt;HOSTNAME&gt;:"</div><div class='del'>-                                 "&lt;export-dir-abs-path&gt;", words[brick_index]);</div><div class='del'>-                        ret = -1;</div><div class='del'>-                        goto out;</div><div class='del'>-                }</div><div class='del'>-                j = tmp_index;</div><div class='del'>-                strcpy(tmp_brick, words[brick_index]);</div><div class='del'>-                while ( j &lt; brick_index) {</div><div class='del'>-                        strcpy(tmp_brick1, words[j]);</div><div class='del'>-                        if (!(strcmp (tmp_brick, tmp_brick1))) {</div><div class='del'>-                                gf_log("",GF_LOG_ERROR, "Duplicate bricks"</div><div class='del'>-                                       " found %s", words[brick_index]);</div><div class='del'>-                                cli_out("Duplicate bricks found %s",</div><div class='del'>-                                        words[brick_index]);</div><div class='del'>-                                ret = -1;</div><div class='del'>-                                goto out;</div><div class='del'>-                        }</div><div class='del'>-                        j++;</div><div class='add'>+uint32_t</div><div class='add'>+cli_cmd_get_statusop(const char *arg)</div><div class='add'>+{</div><div class='add'>+    int i = 0;</div><div class='add'>+    uint32_t ret = GF_CLI_STATUS_NONE;</div><div class='add'>+    char *w = NULL;</div><div class='add'>+    static char *opwords[] = {"detail",   "mem",   "clients",     "fd", "inode",</div><div class='add'>+                              "callpool", "tasks", "client-list", NULL};</div><div class='add'>+    static struct {</div><div class='add'>+        char *opname;</div><div class='add'>+        uint32_t opcode;</div><div class='add'>+    } optable[] = {{"detail", GF_CLI_STATUS_DETAIL},</div><div class='add'>+                   {"mem", GF_CLI_STATUS_MEM},</div><div class='add'>+                   {"clients", GF_CLI_STATUS_CLIENTS},</div><div class='add'>+                   {"fd", GF_CLI_STATUS_FD},</div><div class='add'>+                   {"inode", GF_CLI_STATUS_INODE},</div><div class='add'>+                   {"callpool", GF_CLI_STATUS_CALLPOOL},</div><div class='add'>+                   {"tasks", GF_CLI_STATUS_TASKS},</div><div class='add'>+                   {"client-list", GF_CLI_STATUS_CLIENT_LIST},</div><div class='add'>+                   {NULL}};</div><div class='add'>+</div><div class='add'>+    w = str_getunamb(arg, opwords);</div><div class='add'>+    if (!w) {</div><div class='add'>+        gf_log("cli", GF_LOG_DEBUG, "Not a status op  %s", arg);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    for (i = 0; optable[i].opname; i++) {</div><div class='add'>+        if (!strcmp(w, optable[i].opname)) {</div><div class='add'>+            ret = optable[i].opcode;</div><div class='add'>+            break;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+cli_cmd_volume_status_parse(const char **words, int wordcount, dict_t **options)</div><div class='add'>+{</div><div class='add'>+    dict_t *dict = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    uint32_t cmd = 0;</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(options);</div><div class='add'>+</div><div class='add'>+    dict = dict_new();</div><div class='add'>+    if (!dict)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    switch (wordcount) {</div><div class='add'>+        case 2:</div><div class='add'>+            cmd = GF_CLI_STATUS_ALL;</div><div class='add'>+            ret = 0;</div><div class='add'>+            break;</div><div class='add'>+</div><div class='add'>+        case 3:</div><div class='add'>+            if (!strcmp(words[2], "all")) {</div><div class='add'>+                cmd = GF_CLI_STATUS_ALL;</div><div class='add'>+                ret = 0;</div><div class='add'>+</div><div class='add'>+            } else {</div><div class='add'>+                cmd = GF_CLI_STATUS_VOL;</div><div class='add'>+                ret = dict_set_str(dict, "volname", (char *)words[2]);</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            break;</div><div class='add'>+</div><div class='add'>+        case 4:</div><div class='add'>+            cmd = cli_cmd_get_statusop(words[3]);</div><div class='add'>+</div><div class='add'>+            if (!strcmp(words[2], "all")) {</div><div class='add'>+                if (cmd == GF_CLI_STATUS_NONE) {</div><div class='add'>+                    cli_err("%s is not a valid status option", words[3]);</div><div class='add'>+                    ret = -1;</div><div class='add'>+                    goto out;</div><div class='ctx'>                 }</div><div class='del'>-                snprintf (key, 50, "brick%d", ++brick_count);</div><div class='del'>-                ret = dict_set_str (dict, key, (char *)words[brick_index++]);</div><div class='add'>+                cmd |= GF_CLI_STATUS_ALL;</div><div class='add'>+                ret = 0;</div><div class='ctx'> </div><div class='add'>+            } else {</div><div class='add'>+                ret = dict_set_str(dict, "volname", (char *)words[2]);</div><div class='ctx'>                 if (ret)</div><div class='del'>-                        goto out;</div><div class='add'>+                    goto out;</div><div class='add'>+</div><div class='add'>+                if (cmd == GF_CLI_STATUS_NONE) {</div><div class='add'>+                    if (!strcmp(words[3], "nfs")) {</div><div class='add'>+                        cmd |= GF_CLI_STATUS_NFS;</div><div class='add'>+                    } else if (!strcmp(words[3], "shd")) {</div><div class='add'>+                        cmd |= GF_CLI_STATUS_SHD;</div><div class='add'>+                    } else if (!strcmp(words[3], "quotad")) {</div><div class='add'>+                        cmd |= GF_CLI_STATUS_QUOTAD;</div><div class='add'>+                    } else if (!strcmp(words[3], "snapd")) {</div><div class='add'>+                        cmd |= GF_CLI_STATUS_SNAPD;</div><div class='add'>+                    } else if (!strcmp(words[3], "bitd")) {</div><div class='add'>+                        cmd |= GF_CLI_STATUS_BITD;</div><div class='add'>+                    } else if (!strcmp(words[3], "scrub")) {</div><div class='add'>+                        cmd |= GF_CLI_STATUS_SCRUB;</div><div class='add'>+                    } else {</div><div class='add'>+                        cmd = GF_CLI_STATUS_BRICK;</div><div class='add'>+                        ret = dict_set_str(dict, "brick", (char *)words[3]);</div><div class='add'>+                    }</div><div class='add'>+</div><div class='add'>+                } else {</div><div class='add'>+                    cmd |= GF_CLI_STATUS_VOL;</div><div class='add'>+                    ret = 0;</div><div class='add'>+                }</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            break;</div><div class='add'>+</div><div class='add'>+        case 5:</div><div class='add'>+            if (!strcmp(words[2], "all")) {</div><div class='add'>+                cli_err("Cannot specify brick/nfs for \"all\"");</div><div class='add'>+                ret = -1;</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            cmd = cli_cmd_get_statusop(words[4]);</div><div class='add'>+            if (cmd == GF_CLI_STATUS_NONE) {</div><div class='add'>+                cli_err("%s is not a valid status option", words[4]);</div><div class='add'>+                ret = -1;</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            ret = dict_set_str(dict, "volname", (char *)words[2]);</div><div class='add'>+            if (ret)</div><div class='add'>+                goto out;</div><div class='add'>+</div><div class='add'>+            if (!strcmp(words[3], "nfs")) {</div><div class='add'>+                if (cmd == GF_CLI_STATUS_FD || cmd == GF_CLI_STATUS_DETAIL ||</div><div class='add'>+                    cmd == GF_CLI_STATUS_TASKS) {</div><div class='add'>+                    cli_err(</div><div class='add'>+                        "Detail/FD/Tasks status not available"</div><div class='add'>+                        " for NFS Servers");</div><div class='add'>+                    ret = -1;</div><div class='add'>+                    goto out;</div><div class='add'>+                }</div><div class='add'>+                cmd |= GF_CLI_STATUS_NFS;</div><div class='add'>+            } else if (!strcmp(words[3], "shd")) {</div><div class='add'>+                if (cmd == GF_CLI_STATUS_FD || cmd == GF_CLI_STATUS_CLIENTS ||</div><div class='add'>+                    cmd == GF_CLI_STATUS_DETAIL || cmd == GF_CLI_STATUS_TASKS) {</div><div class='add'>+                    cli_err(</div><div class='add'>+                        "Detail/FD/Clients/Tasks status not "</div><div class='add'>+                        "available for Self-heal Daemons");</div><div class='add'>+                    ret = -1;</div><div class='add'>+                    goto out;</div><div class='add'>+                }</div><div class='add'>+                cmd |= GF_CLI_STATUS_SHD;</div><div class='add'>+            } else if (!strcmp(words[3], "quotad")) {</div><div class='add'>+                if (cmd == GF_CLI_STATUS_FD || cmd == GF_CLI_STATUS_CLIENTS ||</div><div class='add'>+                    cmd == GF_CLI_STATUS_DETAIL || cmd == GF_CLI_STATUS_INODE) {</div><div class='add'>+                    cli_err(</div><div class='add'>+                        "Detail/FD/Clients/Inode status not "</div><div class='add'>+                        "available for Quota Daemon");</div><div class='add'>+                    ret = -1;</div><div class='add'>+                    goto out;</div><div class='add'>+                }</div><div class='add'>+                cmd |= GF_CLI_STATUS_QUOTAD;</div><div class='add'>+            } else if (!strcmp(words[3], "snapd")) {</div><div class='add'>+                if (cmd == GF_CLI_STATUS_FD || cmd == GF_CLI_STATUS_CLIENTS ||</div><div class='add'>+                    cmd == GF_CLI_STATUS_DETAIL || cmd == GF_CLI_STATUS_INODE) {</div><div class='add'>+                    cli_err(</div><div class='add'>+                        "Detail/FD/Clients/Inode status not "</div><div class='add'>+                        "available for snap daemon");</div><div class='add'>+                    ret = -1;</div><div class='add'>+                    goto out;</div><div class='add'>+                }</div><div class='add'>+                cmd |= GF_CLI_STATUS_SNAPD;</div><div class='add'>+            } else {</div><div class='add'>+                if (cmd == GF_CLI_STATUS_TASKS) {</div><div class='add'>+                    cli_err(</div><div class='add'>+                        "Tasks status not available for "</div><div class='add'>+                        "bricks");</div><div class='add'>+                    ret = -1;</div><div class='add'>+                    goto out;</div><div class='add'>+                }</div><div class='add'>+                cmd |= GF_CLI_STATUS_BRICK;</div><div class='add'>+                ret = dict_set_str(dict, "brick", (char *)words[3]);</div><div class='add'>+            }</div><div class='add'>+            break;</div><div class='add'>+</div><div class='add'>+        default:</div><div class='add'>+            goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    ret = dict_set_int32(dict, "cmd", cmd);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    *options = dict;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (ret &amp;&amp; dict)</div><div class='add'>+        dict_unref(dict);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+gf_boolean_t</div><div class='add'>+cli_cmd_validate_dumpoption(const char *arg, char **option)</div><div class='add'>+{</div><div class='add'>+    static char *opwords[] = {"all",   "nfs",    "mem",   "iobuf",   "callpool",</div><div class='add'>+                              "priv",  "fd",     "inode", "history", "inodectx",</div><div class='add'>+                              "fdctx", "quotad", NULL};</div><div class='add'>+    char *w = NULL;</div><div class='add'>+</div><div class='add'>+    w = str_getunamb(arg, opwords);</div><div class='add'>+    if (!w) {</div><div class='add'>+        gf_log("cli", GF_LOG_DEBUG, "Unknown statedump option  %s", arg);</div><div class='add'>+        return _gf_false;</div><div class='add'>+    }</div><div class='add'>+    *option = w;</div><div class='add'>+    return _gf_true;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+cli_cmd_volume_statedump_options_parse(const char **words, int wordcount,</div><div class='add'>+                                       dict_t **options)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+    int i = 0;</div><div class='add'>+    dict_t *dict = NULL;</div><div class='add'>+    int option_cnt = 0;</div><div class='add'>+    char *option = NULL;</div><div class='add'>+    char *option_str = NULL;</div><div class='add'>+    char *tmp_str = NULL;</div><div class='add'>+    char *tmp = NULL;</div><div class='add'>+    char *ip_addr = NULL;</div><div class='add'>+    char *pid = NULL;</div><div class='add'>+</div><div class='add'>+    if ((wordcount &gt;= 5) &amp;&amp; ((strcmp(words[3], "client")) == 0)) {</div><div class='add'>+        tmp = gf_strdup(words[4]);</div><div class='add'>+        if (!tmp) {</div><div class='add'>+            ret = -1;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+        ip_addr = strtok(tmp, ":");</div><div class='add'>+        pid = strtok(NULL, ":");</div><div class='add'>+        if (valid_internet_address(ip_addr, _gf_true, _gf_false) &amp;&amp; pid &amp;&amp;</div><div class='add'>+            gf_valid_pid(pid, strlen(pid))) {</div><div class='add'>+            ret = gf_asprintf(&amp;option_str, "%s %s %s", words[3], ip_addr, pid);</div><div class='add'>+            if (ret &lt; 0) {</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+            option_cnt = 3;</div><div class='add'>+        } else {</div><div class='add'>+            ret = -1;</div><div class='add'>+            goto out;</div><div class='ctx'>         }</div><div class='add'>+    } else {</div><div class='add'>+        for (i = 3; i &lt; wordcount; i++, option_cnt++) {</div><div class='add'>+            if (!cli_cmd_validate_dumpoption(words[i], &amp;option)) {</div><div class='add'>+                ret = -1;</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+            tmp_str = option_str;</div><div class='add'>+            option_str = NULL;</div><div class='add'>+            ret = gf_asprintf(&amp;option_str, "%s%s ", tmp_str ? tmp_str : "",</div><div class='add'>+                              option);</div><div class='add'>+            GF_FREE(tmp_str);</div><div class='add'>+            if (ret &lt; 0) {</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+        if (option_str &amp;&amp; (strstr(option_str, "nfs")) &amp;&amp;</div><div class='add'>+            strstr(option_str, "quotad")) {</div><div class='add'>+            ret = -1;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    dict = dict_new();</div><div class='add'>+    if (!dict) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* dynamic string in dict is freed up when dict is freed up, and hence</div><div class='add'>+    if option_str is NULL pass in an duplicate empty string to the same */</div><div class='add'>+    ret = dict_set_dynstr(dict, "options",</div><div class='add'>+                          (option_str ? option_str : gf_strdup("")));</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+    option_str = NULL;</div><div class='add'>+</div><div class='add'>+    ret = dict_set_int32(dict, "option_cnt", option_cnt);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    *options = dict;</div><div class='add'>+out:</div><div class='add'>+    GF_FREE(tmp);</div><div class='add'>+    GF_FREE(option_str);</div><div class='add'>+    if (ret &amp;&amp; dict)</div><div class='add'>+        dict_unref(dict);</div><div class='add'>+    if (ret)</div><div class='add'>+        gf_log("cli", GF_LOG_ERROR, "Error parsing dumpoptions");</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        ret = dict_set_int32 (dict, "count", brick_count);</div><div class='add'>+int</div><div class='add'>+cli_cmd_volume_clrlks_opts_parse(const char **words, int wordcount,</div><div class='add'>+                                 dict_t **options)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int i = 0;</div><div class='add'>+    dict_t *dict = NULL;</div><div class='add'>+    char *kind_opts[4] = {"blocked", "granted", "all", NULL};</div><div class='add'>+    char *types[4] = {"inode", "entry", "posix", NULL};</div><div class='add'>+    char *free_ptr = NULL;</div><div class='add'>+</div><div class='add'>+    dict = dict_new();</div><div class='add'>+    if (!dict)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    if (strcmp(words[4], "kind"))</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; kind_opts[i]; i++) {</div><div class='add'>+        if (!strcmp(words[5], kind_opts[i])) {</div><div class='add'>+            free_ptr = gf_strdup(words[5]);</div><div class='add'>+            ret = dict_set_dynstr(dict, "kind", free_ptr);</div><div class='add'>+            if (ret)</div><div class='add'>+                goto out;</div><div class='add'>+            free_ptr = NULL;</div><div class='add'>+            break;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    if (i == 3)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    ret = -1;</div><div class='add'>+    for (i = 0; types[i]; i++) {</div><div class='add'>+        if (!strcmp(words[6], types[i])) {</div><div class='add'>+            free_ptr = gf_strdup(words[6]);</div><div class='add'>+            ret = dict_set_dynstr(dict, "type", free_ptr);</div><div class='add'>+            if (ret)</div><div class='add'>+                goto out;</div><div class='add'>+            free_ptr = NULL;</div><div class='add'>+            break;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    if (i == 3)</div><div class='add'>+        goto out;</div><div class='ctx'> </div><div class='add'>+    if (wordcount == 8) {</div><div class='add'>+        free_ptr = gf_strdup(words[7]);</div><div class='add'>+        ret = dict_set_dynstr(dict, "opts", free_ptr);</div><div class='ctx'>         if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+        free_ptr = NULL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+    *options = dict;</div><div class='add'>+out:</div><div class='add'>+    if (ret) {</div><div class='add'>+        GF_FREE(free_ptr);</div><div class='add'>+        dict_unref(dict);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+extract_hostname_path_from_token(const char *tmp_words, char **hostname,</div><div class='add'>+                                 char **path)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+    char *delimiter = NULL;</div><div class='add'>+    char *tmp_host = NULL;</div><div class='add'>+    char *host_name = NULL;</div><div class='add'>+    char *words = NULL;</div><div class='add'>+    int str_len = 0;</div><div class='add'>+    *hostname = NULL;</div><div class='add'>+    *path = NULL;</div><div class='add'>+</div><div class='add'>+    str_len = strlen(tmp_words) + 1;</div><div class='add'>+    words = GF_MALLOC(str_len, gf_common_mt_char);</div><div class='add'>+    if (!words) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    snprintf(words, str_len, "%s", tmp_words);</div><div class='add'>+</div><div class='add'>+    if (validate_brick_name(words)) {</div><div class='add'>+        cli_err(</div><div class='add'>+            "Wrong brick type: %s, use &lt;HOSTNAME&gt;:"</div><div class='add'>+            "&lt;export-dir-abs-path&gt;",</div><div class='add'>+            words);</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    } else {</div><div class='add'>+        delimiter = strrchr(words, ':');</div><div class='add'>+        ret = gf_canonicalize_path(delimiter + 1);</div><div class='add'>+        if (ret) {</div><div class='add'>+            goto out;</div><div class='add'>+        } else {</div><div class='add'>+            str_len = strlen(delimiter + 1) + 1;</div><div class='add'>+            *path = GF_MALLOC(str_len, gf_common_mt_char);</div><div class='add'>+            if (!*path) {</div><div class='add'>+                ret = -1;</div><div class='ctx'>                 goto out;</div><div class='add'>+            }</div><div class='add'>+            snprintf(*path, str_len, "%s", delimiter + 1);</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    tmp_host = gf_strdup(words);</div><div class='add'>+    if (!tmp_host) {</div><div class='add'>+        gf_log("cli", GF_LOG_ERROR, "Out of memory");</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    get_host_name(tmp_host, &amp;host_name);</div><div class='add'>+    if (!host_name) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        gf_log("cli", GF_LOG_ERROR,</div><div class='add'>+               "Unable to allocate "</div><div class='add'>+               "memory");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    if (!(strcmp(host_name, "localhost") &amp;&amp; strcmp(host_name, "127.0.0.1") &amp;&amp;</div><div class='add'>+          strncmp(host_name, "0.", 2))) {</div><div class='add'>+        cli_err(</div><div class='add'>+            "Please provide a valid hostname/ip other "</div><div class='add'>+            "than localhost, 127.0.0.1 or loopback "</div><div class='add'>+            "address (0.0.0.0 to 0.255.255.255).");</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    if (!valid_internet_address(host_name, _gf_false, _gf_false)) {</div><div class='add'>+        cli_err(</div><div class='add'>+            "internet address '%s' does not conform to "</div><div class='add'>+            "standards",</div><div class='add'>+            host_name);</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    str_len = strlen(host_name) + 1;</div><div class='add'>+    *hostname = GF_MALLOC(str_len, gf_common_mt_char);</div><div class='add'>+    if (!*hostname) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    snprintf(*hostname, str_len, "%s", host_name);</div><div class='add'>+    ret = 0;</div><div class='ctx'> </div><div class='del'>-        *options = dict;</div><div class='add'>+out:</div><div class='add'>+    GF_FREE(words);</div><div class='add'>+    GF_FREE(tmp_host);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+set_hostname_path_in_dict(const char *token, dict_t *dict, int heal_op)</div><div class='add'>+{</div><div class='add'>+    char *hostname = NULL;</div><div class='add'>+    char *path = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    ret = extract_hostname_path_from_token(token, &amp;hostname, &amp;path);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    switch (heal_op) {</div><div class='add'>+        case GF_SHD_OP_SBRAIN_HEAL_FROM_BRICK:</div><div class='add'>+            ret = dict_set_dynstr(dict, "heal-source-hostname", hostname);</div><div class='add'>+            if (ret)</div><div class='add'>+                goto out;</div><div class='add'>+            hostname = NULL;</div><div class='add'>+            ret = dict_set_dynstr(dict, "heal-source-brickpath", path);</div><div class='add'>+            if (ret) {</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+            path = NULL;</div><div class='add'>+            break;</div><div class='add'>+        case GF_SHD_OP_STATISTICS_HEAL_COUNT_PER_REPLICA:</div><div class='add'>+            ret = dict_set_dynstr(dict, "per-replica-cmd-hostname", hostname);</div><div class='add'>+            if (ret)</div><div class='add'>+                goto out;</div><div class='add'>+            hostname = NULL;</div><div class='add'>+            ret = dict_set_dynstr(dict, "per-replica-cmd-path", path);</div><div class='add'>+            if (ret) {</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+            path = NULL;</div><div class='add'>+            break;</div><div class='add'>+        default:</div><div class='add'>+            ret = -1;</div><div class='add'>+            break;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='ctx'> out:</div><div class='del'>-        if (ret) {</div><div class='del'>-                gf_log ("cli", GF_LOG_ERROR, "Unable to parse remove-brick CLI");</div><div class='del'>-                if (dict)</div><div class='del'>-                        dict_destroy (dict);</div><div class='add'>+    GF_FREE(hostname);</div><div class='add'>+    GF_FREE(path);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+heal_command_type_get(const char *command)</div><div class='add'>+{</div><div class='add'>+    int i = 0;</div><div class='add'>+    /* subcommands are set as NULL */</div><div class='add'>+    char *heal_cmds[GF_SHD_OP_HEAL_DISABLE + 1] = {</div><div class='add'>+        [GF_SHD_OP_INVALID] = NULL,</div><div class='add'>+        [GF_SHD_OP_HEAL_INDEX] = NULL,</div><div class='add'>+        [GF_SHD_OP_HEAL_FULL] = "full",</div><div class='add'>+        [GF_SHD_OP_INDEX_SUMMARY] = "info",</div><div class='add'>+        [GF_SHD_OP_SPLIT_BRAIN_FILES] = NULL,</div><div class='add'>+        [GF_SHD_OP_STATISTICS] = "statistics",</div><div class='add'>+        [GF_SHD_OP_STATISTICS_HEAL_COUNT] = NULL,</div><div class='add'>+        [GF_SHD_OP_STATISTICS_HEAL_COUNT_PER_REPLICA] = NULL,</div><div class='add'>+        [GF_SHD_OP_SBRAIN_HEAL_FROM_BIGGER_FILE] = NULL,</div><div class='add'>+        [GF_SHD_OP_SBRAIN_HEAL_FROM_BRICK] = NULL,</div><div class='add'>+        [GF_SHD_OP_HEAL_ENABLE] = "enable",</div><div class='add'>+        [GF_SHD_OP_HEAL_DISABLE] = "disable",</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt;= GF_SHD_OP_HEAL_DISABLE; i++) {</div><div class='add'>+        if (heal_cmds[i] &amp;&amp; (strcmp(heal_cmds[i], command) == 0))</div><div class='add'>+            return i;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return GF_SHD_OP_INVALID;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+cli_cmd_volume_heal_options_parse(const char **words, int wordcount,</div><div class='add'>+                                  dict_t **options)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+    dict_t *dict = NULL;</div><div class='add'>+    gf_xl_afr_op_t op = GF_SHD_OP_INVALID;</div><div class='add'>+</div><div class='add'>+    dict = dict_new();</div><div class='add'>+    if (!dict) {</div><div class='add'>+        gf_log(THIS-&gt;name, GF_LOG_ERROR, "Failed to create the dict");</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_set_str(dict, "volname", (char *)words[2]);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log(THIS-&gt;name, GF_LOG_ERROR, "failed to set volname");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (wordcount == 3) {</div><div class='add'>+        ret = dict_set_int32(dict, "heal-op", GF_SHD_OP_HEAL_INDEX);</div><div class='add'>+        goto done;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (wordcount == 4) {</div><div class='add'>+        op = heal_command_type_get(words[3]);</div><div class='add'>+        if (op == GF_SHD_OP_INVALID) {</div><div class='add'>+            ret = -1;</div><div class='add'>+            goto out;</div><div class='ctx'>         }</div><div class='ctx'> </div><div class='del'>-        if (tmp_brick)</div><div class='del'>-                GF_FREE (tmp_brick);</div><div class='del'>-        if (tmp_brick1)</div><div class='del'>-                GF_FREE (tmp_brick1);</div><div class='add'>+        ret = dict_set_int32(dict, "heal-op", op);</div><div class='add'>+        goto done;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        return ret;</div><div class='add'>+    if (wordcount == 5) {</div><div class='add'>+        if (strcmp(words[3], "info") &amp;&amp; strcmp(words[3], "statistics") &amp;&amp;</div><div class='add'>+            strcmp(words[3], "granular-entry-heal")) {</div><div class='add'>+            ret = -1;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        if (!strcmp(words[3], "info")) {</div><div class='add'>+            if (!strcmp(words[4], "split-brain")) {</div><div class='add'>+                ret = dict_set_int32(dict, "heal-op",</div><div class='add'>+                                     GF_SHD_OP_SPLIT_BRAIN_FILES);</div><div class='add'>+                goto done;</div><div class='add'>+            }</div><div class='add'>+            if (!strcmp(words[4], "summary")) {</div><div class='add'>+                ret = dict_set_int32(dict, "heal-op", GF_SHD_OP_HEAL_SUMMARY);</div><div class='add'>+                goto done;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        if (!strcmp(words[3], "statistics")) {</div><div class='add'>+            if (!strcmp(words[4], "heal-count")) {</div><div class='add'>+                ret = dict_set_int32(dict, "heal-op",</div><div class='add'>+                                     GF_SHD_OP_STATISTICS_HEAL_COUNT);</div><div class='add'>+                goto done;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        if (!strcmp(words[3], "granular-entry-heal")) {</div><div class='add'>+            if (!strcmp(words[4], "enable")) {</div><div class='add'>+                ret = dict_set_int32(dict, "heal-op",</div><div class='add'>+                                     GF_SHD_OP_GRANULAR_ENTRY_HEAL_ENABLE);</div><div class='add'>+                goto done;</div><div class='add'>+            } else if (!strcmp(words[4], "disable")) {</div><div class='add'>+                ret = dict_set_int32(dict, "heal-op",</div><div class='add'>+                                     GF_SHD_OP_GRANULAR_ENTRY_HEAL_DISABLE);</div><div class='add'>+                goto done;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    if (wordcount == 6) {</div><div class='add'>+        if (strcmp(words[3], "split-brain")) {</div><div class='add'>+            ret = -1;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+        if (!strcmp(words[4], "bigger-file")) {</div><div class='add'>+            ret = dict_set_int32(dict, "heal-op",</div><div class='add'>+                                 GF_SHD_OP_SBRAIN_HEAL_FROM_BIGGER_FILE);</div><div class='add'>+            if (ret)</div><div class='add'>+                goto out;</div><div class='add'>+            ret = dict_set_str(dict, "file", (char *)words[5]);</div><div class='add'>+            if (ret)</div><div class='add'>+                goto out;</div><div class='add'>+            goto done;</div><div class='add'>+        }</div><div class='add'>+        if (!strcmp(words[4], "latest-mtime")) {</div><div class='add'>+            ret = dict_set_int32(dict, "heal-op",</div><div class='add'>+                                 GF_SHD_OP_SBRAIN_HEAL_FROM_LATEST_MTIME);</div><div class='add'>+            if (ret)</div><div class='add'>+                goto out;</div><div class='add'>+            ret = dict_set_str(dict, "file", (char *)words[5]);</div><div class='add'>+            if (ret)</div><div class='add'>+                goto out;</div><div class='add'>+            goto done;</div><div class='add'>+        }</div><div class='add'>+        if (!strcmp(words[4], "source-brick")) {</div><div class='add'>+            ret = dict_set_int32(dict, "heal-op",</div><div class='add'>+                                 GF_SHD_OP_SBRAIN_HEAL_FROM_BRICK);</div><div class='add'>+            if (ret)</div><div class='add'>+                goto out;</div><div class='add'>+            ret = set_hostname_path_in_dict(words[5], dict,</div><div class='add'>+                                            GF_SHD_OP_SBRAIN_HEAL_FROM_BRICK);</div><div class='add'>+            if (ret)</div><div class='add'>+                goto out;</div><div class='add'>+            goto done;</div><div class='add'>+        }</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    if (wordcount == 7) {</div><div class='add'>+        if (!strcmp(words[3], "statistics") &amp;&amp;</div><div class='add'>+            !strcmp(words[4], "heal-count") &amp;&amp; !strcmp(words[5], "replica")) {</div><div class='add'>+            ret = dict_set_int32(dict, "heal-op",</div><div class='add'>+                                 GF_SHD_OP_STATISTICS_HEAL_COUNT_PER_REPLICA);</div><div class='add'>+            if (ret)</div><div class='add'>+                goto out;</div><div class='add'>+            ret = set_hostname_path_in_dict(</div><div class='add'>+                words[6], dict, GF_SHD_OP_STATISTICS_HEAL_COUNT_PER_REPLICA);</div><div class='add'>+            if (ret)</div><div class='add'>+                goto out;</div><div class='add'>+            goto done;</div><div class='add'>+        }</div><div class='add'>+        if (!strcmp(words[3], "split-brain") &amp;&amp;</div><div class='add'>+            !strcmp(words[4], "source-brick")) {</div><div class='add'>+            ret = dict_set_int32(dict, "heal-op",</div><div class='add'>+                                 GF_SHD_OP_SBRAIN_HEAL_FROM_BRICK);</div><div class='add'>+            ret = set_hostname_path_in_dict(words[5], dict,</div><div class='add'>+                                            GF_SHD_OP_SBRAIN_HEAL_FROM_BRICK);</div><div class='add'>+            if (ret)</div><div class='add'>+                goto out;</div><div class='add'>+            ret = dict_set_str(dict, "file", (char *)words[6]);</div><div class='add'>+            if (ret)</div><div class='add'>+                goto out;</div><div class='add'>+            goto done;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    ret = -1;</div><div class='add'>+    goto out;</div><div class='add'>+done:</div><div class='add'>+    *options = dict;</div><div class='add'>+out:</div><div class='add'>+    if (ret &amp;&amp; dict) {</div><div class='add'>+        dict_unref(dict);</div><div class='add'>+        *options = NULL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+int</div><div class='add'>+cli_cmd_volume_defrag_parse(const char **words, int wordcount, dict_t **options)</div><div class='add'>+{</div><div class='add'>+    dict_t *dict = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    char *option = NULL;</div><div class='add'>+    char *volname = NULL;</div><div class='add'>+    char *command = NULL;</div><div class='add'>+    gf_cli_defrag_type cmd = 0;</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(words);</div><div class='add'>+    GF_ASSERT(options);</div><div class='add'>+</div><div class='add'>+    dict = dict_new();</div><div class='add'>+    if (!dict)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    if (!((wordcount == 4) || (wordcount == 5)))</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    if (wordcount == 4) {</div><div class='add'>+        if (strcmp(words[3], "start") &amp;&amp; strcmp(words[3], "stop") &amp;&amp;</div><div class='add'>+            strcmp(words[3], "status"))</div><div class='add'>+            goto out;</div><div class='add'>+    } else {</div><div class='add'>+        if (strcmp(words[3], "fix-layout") &amp;&amp; strcmp(words[3], "start"))</div><div class='add'>+            goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    volname = (char *)words[2];</div><div class='add'>+</div><div class='add'>+    if (wordcount == 4) {</div><div class='add'>+        command = (char *)words[3];</div><div class='add'>+    }</div><div class='add'>+    if (wordcount == 5) {</div><div class='add'>+        if ((strcmp(words[3], "fix-layout") || strcmp(words[4], "start")) &amp;&amp;</div><div class='add'>+            (strcmp(words[3], "start") || strcmp(words[4], "force"))) {</div><div class='add'>+            ret = -1;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+        command = (char *)words[3];</div><div class='add'>+        option = (char *)words[4];</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (strcmp(command, "start") == 0) {</div><div class='add'>+        cmd = GF_DEFRAG_CMD_START;</div><div class='add'>+        if (option &amp;&amp; strcmp(option, "force") == 0) {</div><div class='add'>+            cmd = GF_DEFRAG_CMD_START_FORCE;</div><div class='add'>+        }</div><div class='add'>+        goto done;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (strcmp(command, "fix-layout") == 0) {</div><div class='add'>+        cmd = GF_DEFRAG_CMD_START_LAYOUT_FIX;</div><div class='add'>+        goto done;</div><div class='add'>+    }</div><div class='add'>+    if (strcmp(command, "stop") == 0) {</div><div class='add'>+        cmd = GF_DEFRAG_CMD_STOP;</div><div class='add'>+        goto done;</div><div class='add'>+    }</div><div class='add'>+    if (strcmp(command, "status") == 0) {</div><div class='add'>+        cmd = GF_DEFRAG_CMD_STATUS;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+done:</div><div class='add'>+    ret = dict_set_str(dict, "volname", volname);</div><div class='add'>+</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log(THIS-&gt;name, GF_LOG_ERROR, "failed to set dict");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_set_int32(dict, "rebalance-command", (int32_t)cmd);</div><div class='add'>+</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log(THIS-&gt;name, GF_LOG_ERROR, "failed to set dict");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    *options = dict;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (ret &amp;&amp; dict)</div><div class='add'>+        dict_unref(dict);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int32_t</div><div class='del'>-cli_cmd_volume_replace_brick_parse (const char **words, int wordcount,</div><div class='del'>-                                   dict_t **options)</div><div class='add'>+cli_snap_create_desc_parse(dict_t *dict, const char **words, size_t wordcount,</div><div class='add'>+                           int32_t desc_opt_loc)</div><div class='ctx'> {</div><div class='del'>-        dict_t  *dict = NULL;</div><div class='del'>-        char    *volname = NULL;</div><div class='del'>-        int     ret = -1;</div><div class='del'>-        char    *op = NULL;</div><div class='del'>-        int     op_index = 0;</div><div class='del'>-        char    *delimiter = NULL;</div><div class='del'>-        gf1_cli_replace_op replace_op = GF_REPLACE_OP_NONE;</div><div class='add'>+    int32_t ret = -1;</div><div class='add'>+    char *desc = NULL;</div><div class='add'>+    int32_t desc_len = 0;</div><div class='add'>+    int len;</div><div class='add'>+</div><div class='add'>+    desc = GF_MALLOC(MAX_SNAP_DESCRIPTION_LEN + 1, gf_common_mt_char);</div><div class='add'>+    if (!desc) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    len = strlen(words[desc_opt_loc]);</div><div class='add'>+    if (len &gt;= MAX_SNAP_DESCRIPTION_LEN) {</div><div class='add'>+        cli_out(</div><div class='add'>+            "snapshot create: description truncated: "</div><div class='add'>+            "Description provided is longer than 1024 characters");</div><div class='add'>+        desc_len = MAX_SNAP_DESCRIPTION_LEN;</div><div class='add'>+    } else {</div><div class='add'>+        desc_len = len;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    snprintf(desc, desc_len + 1, "%s", words[desc_opt_loc]);</div><div class='add'>+    /* Calculating the size of the description as given by the user */</div><div class='add'>+</div><div class='add'>+    ret = dict_set_dynstr(dict, "description", desc);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log("cli", GF_LOG_ERROR,</div><div class='add'>+               "Unable to save snap "</div><div class='add'>+               "description");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+out:</div><div class='add'>+    if (ret &amp;&amp; desc)</div><div class='add'>+        GF_FREE(desc);</div><div class='ctx'> </div><div class='del'>-        GF_ASSERT (words);</div><div class='del'>-        GF_ASSERT (options);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        GF_ASSERT ((strcmp (words[0], "volume")) == 0);</div><div class='del'>-        GF_ASSERT ((strcmp (words[1], "replace-brick")) == 0);</div><div class='add'>+/* Function to check whether the Volume name is repeated */</div><div class='add'>+int</div><div class='add'>+cli_check_if_volname_repeated(const char **words, unsigned int start_index,</div><div class='add'>+                              uint64_t cur_index)</div><div class='add'>+{</div><div class='add'>+    uint64_t i = -1;</div><div class='add'>+    int ret = 0;</div><div class='ctx'> </div><div class='del'>-        dict = dict_new ();</div><div class='add'>+    GF_ASSERT(words);</div><div class='ctx'> </div><div class='del'>-        if (!dict)</div><div class='del'>-                goto out;</div><div class='add'>+    for (i = start_index; i &lt; cur_index; i++) {</div><div class='add'>+        if (strcmp(words[i], words[cur_index]) == 0) {</div><div class='add'>+            ret = -1;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        if (wordcount &lt; 3)</div><div class='del'>-                goto out;</div><div class='add'>+/* snapshot clone &lt;clonename&gt; &lt;snapname&gt;</div><div class='add'>+ * @arg-0, dict     : Request Dictionary to be sent to server side.</div><div class='add'>+ * @arg-1, words    : Contains individual words of CLI command.</div><div class='add'>+ * @arg-2, wordcount: Contains number of words present in the CLI command.</div><div class='add'>+ *</div><div class='add'>+ * return value : -1 on failure</div><div class='add'>+ *                 0 on success</div><div class='add'>+ */</div><div class='add'>+int</div><div class='add'>+cli_snap_clone_parse(dict_t *dict, const char **words, int wordcount)</div><div class='add'>+{</div><div class='add'>+    uint64_t i = 0;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    char *clonename = NULL;</div><div class='add'>+    unsigned int cmdi = 2;</div><div class='add'>+    /* cmdi is command index, here cmdi is "2" (gluster snapshot clone)*/</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(words);</div><div class='add'>+    GF_ASSERT(dict);</div><div class='add'>+</div><div class='add'>+    if (wordcount == cmdi + 1) {</div><div class='add'>+        cli_err("Invalid Syntax.");</div><div class='add'>+        gf_log("cli", GF_LOG_ERROR,</div><div class='add'>+               "Invalid number of  words for snap clone command");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (strlen(words[cmdi]) &gt;= GLUSTERD_MAX_SNAP_NAME) {</div><div class='add'>+        cli_err(</div><div class='add'>+            "snapshot clone: failed: clonename cannot exceed "</div><div class='add'>+            "255 characters.");</div><div class='add'>+        gf_log("cli", GF_LOG_ERROR, "Clone name too long");</div><div class='add'>+</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    clonename = (char *)words[cmdi];</div><div class='add'>+    for (i = 0; i &lt; strlen(clonename); i++) {</div><div class='add'>+        /* Following volume name convention */</div><div class='add'>+        if (!isalnum(clonename[i]) &amp;&amp;</div><div class='add'>+            (clonename[i] != '_' &amp;&amp; (clonename[i] != '-'))) {</div><div class='add'>+            /* TODO : Is this message enough?? */</div><div class='add'>+            cli_err(</div><div class='add'>+                "Clonename can contain only alphanumeric, "</div><div class='add'>+                "\"-\" and \"_\" characters");</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_set_int32(dict, "volcount", 1);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log("cli", GF_LOG_ERROR, "Could not save volcount");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_set_str(dict, "clonename", (char *)words[cmdi]);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log("cli", GF_LOG_ERROR,</div><div class='add'>+               "Could not save clone "</div><div class='add'>+               "name(%s)",</div><div class='add'>+               (char *)words[cmdi]);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Filling snap name in the dictionary */</div><div class='add'>+    ret = dict_set_str(dict, "snapname", (char *)words[cmdi + 1]);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log("cli", GF_LOG_ERROR,</div><div class='add'>+               "Could not "</div><div class='add'>+               "save snap name(%s)",</div><div class='add'>+               (char *)words[cmdi + 1]);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='ctx'> </div><div class='del'>-        volname = (char *)words[2];</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        GF_ASSERT (volname);</div><div class='add'>+/* snapshot create &lt;snapname&gt; &lt;vol-name(s)&gt; [description &lt;description&gt;]</div><div class='add'>+ *                                           [force]</div><div class='add'>+ * @arg-0, dict     : Request Dictionary to be sent to server side.</div><div class='add'>+ * @arg-1, words    : Contains individual words of CLI command.</div><div class='add'>+ * @arg-2, wordcount: Contains number of words present in the CLI command.</div><div class='add'>+ *</div><div class='add'>+ * return value : -1 on failure</div><div class='add'>+ *                 0 on success</div><div class='add'>+ */</div><div class='add'>+int</div><div class='add'>+cli_snap_create_parse(dict_t *dict, const char **words, int wordcount)</div><div class='add'>+{</div><div class='add'>+    uint64_t i = 0;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    uint64_t volcount = 0;</div><div class='add'>+    char key[PATH_MAX] = "";</div><div class='add'>+    char *snapname = NULL;</div><div class='add'>+    unsigned int cmdi = 2;</div><div class='add'>+    int flags = 0;</div><div class='add'>+    /* cmdi is command index, here cmdi is "2" (gluster snapshot create)*/</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(words);</div><div class='add'>+    GF_ASSERT(dict);</div><div class='add'>+</div><div class='add'>+    if (wordcount &lt;= cmdi + 1) {</div><div class='add'>+        cli_err("Invalid Syntax.");</div><div class='add'>+        gf_log("cli", GF_LOG_ERROR, "Too less words for snap create command");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (strlen(words[cmdi]) &gt;= GLUSTERD_MAX_SNAP_NAME) {</div><div class='add'>+        cli_err(</div><div class='add'>+            "snapshot create: failed: snapname cannot exceed "</div><div class='add'>+            "255 characters.");</div><div class='add'>+        gf_log("cli", GF_LOG_ERROR, "Snapname too long");</div><div class='add'>+</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    snapname = (char *)words[cmdi];</div><div class='add'>+    for (i = 0; i &lt; strlen(snapname); i++) {</div><div class='add'>+        /* Following volume name convention */</div><div class='add'>+        if (!isalnum(snapname[i]) &amp;&amp;</div><div class='add'>+            (snapname[i] != '_' &amp;&amp; (snapname[i] != '-'))) {</div><div class='add'>+            /* TODO : Is this message enough?? */</div><div class='add'>+            cli_err(</div><div class='add'>+                "Snapname can contain only alphanumeric, "</div><div class='add'>+                "\"-\" and \"_\" characters");</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_set_str(dict, "snapname", (char *)words[cmdi]);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log("cli", GF_LOG_ERROR,</div><div class='add'>+               "Could not save snap "</div><div class='add'>+               "name(%s)",</div><div class='add'>+               (char *)words[cmdi]);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Filling volume name in the dictionary */</div><div class='add'>+    for (i = cmdi + 1;</div><div class='add'>+         i &lt; wordcount &amp;&amp; (strcmp(words[i], "description")) != 0 &amp;&amp;</div><div class='add'>+         (strcmp(words[i], "force") != 0) &amp;&amp;</div><div class='add'>+         (strcmp(words[i], "no-timestamp") != 0);</div><div class='add'>+         i++) {</div><div class='add'>+        volcount++;</div><div class='add'>+        /* volume index starts from 1 */</div><div class='add'>+        ret = snprintf(key, sizeof(key), "volname%" PRIu64, volcount);</div><div class='add'>+        if (ret &lt; 0) {</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-        ret = dict_set_str (dict, "volname", volname);</div><div class='add'>+        ret = dict_set_str(dict, key, (char *)words[i]);</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_log("cli", GF_LOG_ERROR,</div><div class='add'>+                   "Could not "</div><div class='add'>+                   "save volume name(%s)",</div><div class='add'>+                   (char *)words[i]);</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-        if (ret)</div><div class='del'>-                goto out;</div><div class='add'>+        if (i &gt;= cmdi + 2) {</div><div class='add'>+            ret = -1;</div><div class='add'>+            cli_err(</div><div class='add'>+                "Creating multiple volume snapshot is not "</div><div class='add'>+                "supported as of now");</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+        /* TODO : remove this above condition check once</div><div class='add'>+         * multiple volume snapshot is supported */</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (volcount == 0) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        cli_err("Please provide the volume name");</div><div class='add'>+        gf_log("cli", GF_LOG_ERROR, "Invalid Syntax");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_set_int32(dict, "volcount", volcount);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log("cli", GF_LOG_ERROR, "Could not save volcount");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Verify how we got out of "for" loop,</div><div class='add'>+     * if it is by reaching wordcount limit then goto "out",</div><div class='add'>+     * because we need not parse for "description","force" and</div><div class='add'>+     * "no-timestamp" after this.</div><div class='add'>+     */</div><div class='add'>+    if (i == wordcount) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (strcmp(words[i], "no-timestamp") == 0) {</div><div class='add'>+        ret = dict_set_int32n(dict, "no-timestamp", SLEN("no-timestamp"), 1);</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_log("cli", GF_LOG_ERROR,</div><div class='add'>+                   "Could not save "</div><div class='add'>+                   "time-stamp option");</div><div class='add'>+        }</div><div class='add'>+        if (i == (wordcount - 1))</div><div class='add'>+            goto out;</div><div class='add'>+        i++;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if ((strcmp(words[i], "description")) == 0) {</div><div class='add'>+        ++i;</div><div class='add'>+        if (i &gt; (wordcount - 1)) {</div><div class='add'>+            ret = -1;</div><div class='add'>+            cli_err("Please provide a description");</div><div class='add'>+            gf_log("cli", GF_LOG_ERROR, "Description not provided");</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-        if (wordcount &lt; 4) {</div><div class='del'>-                ret = -1;</div><div class='del'>-                goto out;</div><div class='add'>+        ret = cli_snap_create_desc_parse(dict, words, wordcount, i);</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_log("cli", GF_LOG_ERROR,</div><div class='add'>+                   "Could not save snap "</div><div class='add'>+                   "description");</div><div class='add'>+            goto out;</div><div class='ctx'>         }</div><div class='ctx'> </div><div class='del'>-        delimiter = strchr ((char *)words[3], ':');</div><div class='del'>-        if (delimiter &amp;&amp; delimiter != words[3]</div><div class='del'>-            &amp;&amp; *(delimiter+1) == '/') {</div><div class='del'>-                ret = dict_set_str (dict, "src-brick", (char *)words[3]);</div><div class='add'>+        if (i == (wordcount - 1))</div><div class='add'>+            goto out;</div><div class='add'>+        i++;</div><div class='add'>+        /* point the index to next word.</div><div class='add'>+         * As description might be follwed by force option.</div><div class='add'>+         * Before that, check if wordcount limit is reached</div><div class='add'>+         */</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (strcmp(words[i], "force") == 0) {</div><div class='add'>+        flags = GF_CLI_FLAG_OP_FORCE;</div><div class='add'>+</div><div class='add'>+    } else {</div><div class='add'>+        ret = -1;</div><div class='add'>+        cli_err("Invalid Syntax.");</div><div class='add'>+        gf_log("cli", GF_LOG_ERROR, "Invalid Syntax");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Check if the command has anything after "force" keyword */</div><div class='add'>+    if (++i &lt; wordcount) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        gf_log("cli", GF_LOG_ERROR, "Invalid Syntax");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='ctx'> </div><div class='del'>-                if (ret)</div><div class='del'>-                        goto out;</div><div class='add'>+out:</div><div class='add'>+    if (ret == 0) {</div><div class='add'>+        /*Adding force flag in either of the case i.e force set</div><div class='add'>+         * or unset*/</div><div class='add'>+        ret = dict_set_int32(dict, "flags", flags);</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_log("cli", GF_LOG_ERROR,</div><div class='add'>+                   "Could not save "</div><div class='add'>+                   "snap force option");</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-                if (wordcount &lt; 5) {</div><div class='del'>-                        ret = -1;</div><div class='del'>-                        goto out;</div><div class='del'>-                }</div><div class='add'>+/* snapshot list [volname]</div><div class='add'>+ * @arg-0, dict     : Request Dictionary to be sent to server side.</div><div class='add'>+ * @arg-1, words    : Contains individual words of CLI command.</div><div class='add'>+ * @arg-2, wordcount: Contains number of words present in the CLI command.</div><div class='add'>+ *</div><div class='add'>+ * return value : -1 on failure</div><div class='add'>+ *                 0 on success</div><div class='add'>+ */</div><div class='add'>+int</div><div class='add'>+cli_snap_list_parse(dict_t *dict, const char **words, int wordcount)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(words);</div><div class='add'>+    GF_ASSERT(dict);</div><div class='add'>+</div><div class='add'>+    if (wordcount &lt; 2 || wordcount &gt; 3) {</div><div class='add'>+        gf_log("cli", GF_LOG_ERROR, "Invalid Syntax");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (wordcount == 2) {</div><div class='add'>+        ret = 0;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_set_str(dict, "volname", (char *)words[2]);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log("cli", GF_LOG_ERROR, "Failed to save volname in dictionary");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-                delimiter = strchr ((char *)words[4], ':');</div><div class='del'>-                if (!delimiter || delimiter == words[4]</div><div class='del'>-                    || *(delimiter+1) != '/') {</div><div class='del'>-                        cli_out ("wrong brick type: %s, use "</div><div class='del'>-                                "&lt;HOSTNAME&gt;:&lt;export-dir-abs-path&gt;", words[4]);</div><div class='del'>-                        ret = -1;</div><div class='del'>-                        goto out;</div><div class='del'>-                }</div><div class='add'>+/* snapshot info [(snapname |  volume &lt;volname&gt;)]</div><div class='add'>+ * @arg-0, dict     : Request Dictionary to be sent to server side.</div><div class='add'>+ * @arg-1, words    : Contains individual words of CLI command.</div><div class='add'>+ * @arg-2, wordcount: Contains number of words present in the CLI command.</div><div class='add'>+ *</div><div class='add'>+ * return value : -1 on failure</div><div class='add'>+ *                 0 on success</div><div class='add'>+ */</div><div class='add'>+int</div><div class='add'>+cli_snap_info_parse(dict_t *dict, const char **words, int wordcount)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int32_t cmd = GF_SNAP_INFO_TYPE_ALL;</div><div class='add'>+    unsigned int cmdi = 2;</div><div class='add'>+    /* cmdi is command index, here cmdi is "2" (gluster snapshot info)*/</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(words);</div><div class='add'>+    GF_ASSERT(dict);</div><div class='add'>+</div><div class='add'>+    if (wordcount &gt; 4 || wordcount &lt; cmdi) {</div><div class='add'>+        gf_log("cli", GF_LOG_ERROR, "Invalid syntax");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (wordcount == cmdi) {</div><div class='add'>+        ret = 0;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* If 3rd word is not "volume", then it must</div><div class='add'>+     * be snapname.</div><div class='add'>+     */</div><div class='add'>+    if (strcmp(words[cmdi], "volume") != 0) {</div><div class='add'>+        ret = dict_set_str(dict, "snapname", (char *)words[cmdi]);</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_log("cli", GF_LOG_ERROR,</div><div class='add'>+                   "Unable to save "</div><div class='add'>+                   "snapname %s",</div><div class='add'>+                   words[cmdi]);</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-                ret = dict_set_str (dict, "dst-brick", (char *)words[4]);</div><div class='add'>+        /* Once snap name is parsed, if we encounter any other</div><div class='add'>+         * word then fail it. Invalid Syntax.</div><div class='add'>+         * example : snapshot info &lt;snapname&gt; word</div><div class='add'>+         */</div><div class='add'>+        if ((cmdi + 1) != wordcount) {</div><div class='add'>+            ret = -1;</div><div class='add'>+            gf_log("cli", GF_LOG_ERROR, "Invalid Syntax");</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-                if (ret)</div><div class='del'>-                        goto out;</div><div class='add'>+        cmd = GF_SNAP_INFO_TYPE_SNAP;</div><div class='add'>+        ret = 0;</div><div class='add'>+        goto out;</div><div class='add'>+        /* No need to continue the parsing once we</div><div class='add'>+         * get the snapname</div><div class='add'>+         */</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* If 3rd word is "volume", then check if next word</div><div class='add'>+     * is present. As, "snapshot info volume" is an</div><div class='add'>+     * invalid command.</div><div class='add'>+     */</div><div class='add'>+    if ((cmdi + 1) == wordcount) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        gf_log("cli", GF_LOG_ERROR, "Invalid Syntax");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_set_str(dict, "volname", (char *)words[wordcount - 1]);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log("cli", GF_LOG_ERROR,</div><div class='add'>+               "Could not save "</div><div class='add'>+               "volume name %s",</div><div class='add'>+               words[wordcount - 1]);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    cmd = GF_SNAP_INFO_TYPE_VOL;</div><div class='add'>+out:</div><div class='add'>+    if (ret == 0) {</div><div class='add'>+        ret = dict_set_int32(dict, "sub-cmd", cmd);</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_log("cli", GF_LOG_ERROR,</div><div class='add'>+                   "Could not save "</div><div class='add'>+                   "type of snapshot info");</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* snapshot restore &lt;snapname&gt;</div><div class='add'>+ * @arg-0, dict     : Request Dictionary to be sent to server side.</div><div class='add'>+ * @arg-1, words    : Contains individual words of CLI command.</div><div class='add'>+ * @arg-2, wordcount: Contains number of words present in the CLI command.</div><div class='add'>+ *</div><div class='add'>+ * return value : -1 on failure</div><div class='add'>+ *                 0 on success</div><div class='add'>+ */</div><div class='add'>+int</div><div class='add'>+cli_snap_restore_parse(dict_t *dict, const char **words, int wordcount,</div><div class='add'>+                       struct cli_state *state)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    const char *question = NULL;</div><div class='add'>+    gf_answer_t answer = GF_ANSWER_NO;</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(words);</div><div class='add'>+    GF_ASSERT(dict);</div><div class='add'>+</div><div class='add'>+    if (wordcount != 3) {</div><div class='add'>+        gf_log("cli", GF_LOG_ERROR, "Invalid Syntax");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_set_str(dict, "snapname", (char *)words[2]);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log("cli", GF_LOG_ERROR, "Unable to save snap-name %s", words[2]);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    question =</div><div class='add'>+        "Restore operation will replace the "</div><div class='add'>+        "original volume with the snapshotted volume. "</div><div class='add'>+        "Do you still want to continue?";</div><div class='add'>+</div><div class='add'>+    answer = cli_cmd_get_confirmation(state, question);</div><div class='add'>+    if (GF_ANSWER_NO == answer) {</div><div class='add'>+        ret = 1;</div><div class='add'>+        gf_log("cli", GF_LOG_ERROR,</div><div class='add'>+               "User cancelled a snapshot "</div><div class='add'>+               "restore operation for snap %s",</div><div class='add'>+               (char *)words[2]);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-                op_index = 5;</div><div class='add'>+/* snapshot activate &lt;snapname&gt; [force]</div><div class='add'>+ * @arg-0, dict     : Request Dictionary to be sent to server side.</div><div class='add'>+ * @arg-1, words    : Contains individual words of CLI command.</div><div class='add'>+ * @arg-2, wordcount: Contains number of words present in the CLI command.</div><div class='add'>+ *</div><div class='add'>+ * return value : -1 on failure</div><div class='add'>+ *                 0 on success</div><div class='add'>+ */</div><div class='add'>+int</div><div class='add'>+cli_snap_activate_parse(dict_t *dict, const char **words, int wordcount)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int flags = 0;</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(words);</div><div class='add'>+    GF_ASSERT(dict);</div><div class='add'>+</div><div class='add'>+    if ((wordcount &lt; 3) || (wordcount &gt; 4)) {</div><div class='add'>+        gf_log("cli", GF_LOG_ERROR, "Invalid Syntax");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_set_str(dict, "snapname", (char *)words[2]);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log("cli", GF_LOG_ERROR, "Unable to save snap-name %s", words[2]);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (wordcount == 4) {</div><div class='add'>+        if (!strcmp("force", (char *)words[3])) {</div><div class='add'>+            flags = GF_CLI_FLAG_OP_FORCE;</div><div class='ctx'>         } else {</div><div class='del'>-                op_index = 3;</div><div class='add'>+            gf_log("cli", GF_LOG_ERROR, "Invalid option");</div><div class='add'>+            ret = -1;</div><div class='add'>+            goto out;</div><div class='ctx'>         }</div><div class='add'>+    }</div><div class='add'>+    ret = dict_set_int32(dict, "flags", flags);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log("cli", GF_LOG_ERROR, "Unable to save force option");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        if (wordcount &lt; (op_index + 1)) {</div><div class='del'>-                ret = -1;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='add'>+/* snapshot deactivate &lt;snapname&gt;</div><div class='add'>+ * @arg-0, dict     : Request Dictionary to be sent to server side.</div><div class='add'>+ * @arg-1, words    : Contains individual words of CLI command.</div><div class='add'>+ * @arg-2, wordcount: Contains number of words present in the CLI command.</div><div class='add'>+ *</div><div class='add'>+ * return value : -1 on failure</div><div class='add'>+ *                 0 on success</div><div class='add'>+ *                 1 if user cancelled the request</div><div class='add'>+ */</div><div class='add'>+int</div><div class='add'>+cli_snap_deactivate_parse(dict_t *dict, const char **words, int wordcount,</div><div class='add'>+                          struct cli_state *state)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    gf_answer_t answer = GF_ANSWER_NO;</div><div class='add'>+    const char *question =</div><div class='add'>+        "Deactivating snap will make its "</div><div class='add'>+        "data inaccessible. Do you want to "</div><div class='add'>+        "continue?";</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(words);</div><div class='add'>+    GF_ASSERT(dict);</div><div class='add'>+</div><div class='add'>+    if ((wordcount != 3)) {</div><div class='add'>+        gf_log("cli", GF_LOG_ERROR, "Invalid Syntax");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_set_str(dict, "snapname", (char *)words[2]);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log("cli", GF_LOG_ERROR, "Unable to save snap-name %s", words[2]);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    answer = cli_cmd_get_confirmation(state, question);</div><div class='add'>+    if (GF_ANSWER_NO == answer) {</div><div class='add'>+        ret = 1;</div><div class='add'>+        gf_log("cli", GF_LOG_DEBUG,</div><div class='add'>+               "User cancelled "</div><div class='add'>+               "snapshot deactivate operation");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        op = (char *) words[op_index];</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        if (!strcasecmp ("start", op)) {</div><div class='del'>-                replace_op = GF_REPLACE_OP_START;</div><div class='del'>-        } else if (!strcasecmp ("commit", op)) {</div><div class='del'>-                replace_op = GF_REPLACE_OP_COMMIT;</div><div class='del'>-        } else if (!strcasecmp ("pause", op)) {</div><div class='del'>-                replace_op = GF_REPLACE_OP_PAUSE;</div><div class='del'>-        } else if (!strcasecmp ("abort", op)) {</div><div class='del'>-                replace_op = GF_REPLACE_OP_ABORT;</div><div class='del'>-        } else if (!strcasecmp ("status", op)) {</div><div class='del'>-                replace_op = GF_REPLACE_OP_STATUS;</div><div class='add'>+/* snapshot delete (all | snapname | volume &lt;volname&gt;)</div><div class='add'>+ * @arg-0, dict     : Request Dictionary to be sent to server side.</div><div class='add'>+ * @arg-1, words    : Contains individual words of CLI command.</div><div class='add'>+ * @arg-2, wordcount: Contains number of words present in the CLI command.</div><div class='add'>+ *</div><div class='add'>+ * return value : -1 on failure</div><div class='add'>+ *                 0 on success</div><div class='add'>+ *                 1 if user cancel the operation</div><div class='add'>+ */</div><div class='add'>+int</div><div class='add'>+cli_snap_delete_parse(dict_t *dict, const char **words, int wordcount,</div><div class='add'>+                      struct cli_state *state)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    const char *question = NULL;</div><div class='add'>+    int32_t cmd = -1;</div><div class='add'>+    unsigned int cmdi = 2;</div><div class='add'>+    gf_answer_t answer = GF_ANSWER_NO;</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(words);</div><div class='add'>+    GF_ASSERT(dict);</div><div class='add'>+</div><div class='add'>+    if (wordcount &gt; 4 || wordcount &lt;= cmdi) {</div><div class='add'>+        gf_log("cli", GF_LOG_ERROR, "Invalid Syntax");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    question =</div><div class='add'>+        "Deleting snap will erase all the information about "</div><div class='add'>+        "the snap. Do you still want to continue?";</div><div class='add'>+</div><div class='add'>+    if (strcmp(words[cmdi], "all") == 0) {</div><div class='add'>+        ret = 0;</div><div class='add'>+        cmd = GF_SNAP_DELETE_TYPE_ALL;</div><div class='add'>+    } else if (strcmp(words[cmdi], "volume") == 0) {</div><div class='add'>+        if (++cmdi == wordcount) {</div><div class='add'>+            ret = -1;</div><div class='add'>+            gf_log("cli", GF_LOG_ERROR, "Invalid Syntax");</div><div class='add'>+            goto out;</div><div class='ctx'>         }</div><div class='ctx'> </div><div class='del'>-        if (replace_op == GF_REPLACE_OP_NONE) {</div><div class='del'>-                ret = -1;</div><div class='del'>-                goto out;</div><div class='add'>+        ret = dict_set_str(dict, "volname", (char *)words[cmdi]);</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_log("cli", GF_LOG_ERROR,</div><div class='add'>+                   "Could not save "</div><div class='add'>+                   "volume name %s",</div><div class='add'>+                   words[wordcount - 1]);</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+        cmd = GF_SNAP_DELETE_TYPE_VOL;</div><div class='add'>+    } else {</div><div class='add'>+        ret = dict_set_str(dict, "snapname", (char *)words[cmdi]);</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_log("cli", GF_LOG_ERROR,</div><div class='add'>+                   "Unable to save "</div><div class='add'>+                   "snapname %s",</div><div class='add'>+                   words[2]);</div><div class='add'>+            goto out;</div><div class='ctx'>         }</div><div class='add'>+        cmd = GF_SNAP_DELETE_TYPE_SNAP;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if ((cmdi + 1) != wordcount) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        gf_log("cli", GF_LOG_ERROR, "Invalid Syntax");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (cmd == GF_SNAP_DELETE_TYPE_SNAP) {</div><div class='add'>+        answer = cli_cmd_get_confirmation(state, question);</div><div class='add'>+        if (GF_ANSWER_NO == answer) {</div><div class='add'>+            ret = 1;</div><div class='add'>+            gf_log("cli", GF_LOG_DEBUG,</div><div class='add'>+                   "User cancelled "</div><div class='add'>+                   "snapshot delete operation for snap %s",</div><div class='add'>+                   (char *)words[2]);</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_set_int32(dict, "sub-cmd", cmd);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log("cli", GF_LOG_ERROR,</div><div class='add'>+               "Could not save "</div><div class='add'>+               "type of snapshot delete");</div><div class='add'>+    }</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        ret = dict_set_int32 (dict, "operation", (int32_t) replace_op);</div><div class='add'>+/* snapshot status [(snapname | volume &lt;volname&gt;)]</div><div class='add'>+ * @arg-0, dict     : Request Dictionary to be sent to server side.</div><div class='add'>+ * @arg-1, words    : Contains individual words of CLI command.</div><div class='add'>+ * @arg-2, wordcount: Contains number of words present in the CLI command.</div><div class='add'>+ *</div><div class='add'>+ * return value : -1 on failure</div><div class='add'>+ *                 0 on success</div><div class='add'>+ */</div><div class='add'>+int</div><div class='add'>+cli_snap_status_parse(dict_t *dict, const char **words, int wordcount)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int32_t cmd = GF_SNAP_STATUS_TYPE_ALL;</div><div class='add'>+    unsigned int cmdi = 2;</div><div class='add'>+    /* cmdi is command index, here cmdi is "2" (gluster snapshot status)*/</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(words);</div><div class='add'>+    GF_ASSERT(dict);</div><div class='add'>+</div><div class='add'>+    if (wordcount &gt; 4 || wordcount &lt; cmdi) {</div><div class='add'>+        gf_log("cli", GF_LOG_ERROR, "Invalid Syntax");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (wordcount == cmdi) {</div><div class='add'>+        ret = 0;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* if 3rd word is not "volume", then it must be "snapname"</div><div class='add'>+     */</div><div class='add'>+    if (strcmp(words[cmdi], "volume") != 0) {</div><div class='add'>+        ret = dict_set_str(dict, "snapname", (char *)words[cmdi]);</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_log("cli", GF_LOG_ERROR,</div><div class='add'>+                   "Count not save "</div><div class='add'>+                   "snap name %s",</div><div class='add'>+                   words[cmdi]);</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-        if (ret)</div><div class='del'>-                goto out;</div><div class='add'>+        if ((cmdi + 1) != wordcount) {</div><div class='add'>+            ret = -1;</div><div class='add'>+            gf_log("cli", GF_LOG_ERROR, "Invalid Syntax");</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-        *options = dict;</div><div class='add'>+        ret = 0;</div><div class='add'>+        cmd = GF_SNAP_STATUS_TYPE_SNAP;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* If 3rd word is "volume", then check if next word is present.</div><div class='add'>+     * As, "snapshot info volume" is an invalid command</div><div class='add'>+     */</div><div class='add'>+    if ((cmdi + 1) == wordcount) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        gf_log("cli", GF_LOG_ERROR, "Invalid Syntax");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_set_str(dict, "volname", (char *)words[wordcount - 1]);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log("cli", GF_LOG_ERROR,</div><div class='add'>+               "Count not save "</div><div class='add'>+               "volume name %s",</div><div class='add'>+               words[wordcount - 1]);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    cmd = GF_SNAP_STATUS_TYPE_VOL;</div><div class='ctx'> </div><div class='ctx'> out:</div><div class='add'>+    if (ret == 0) {</div><div class='add'>+        ret = dict_set_int32(dict, "sub-cmd", cmd);</div><div class='ctx'>         if (ret) {</div><div class='del'>-                gf_log ("cli", GF_LOG_ERROR, "Unable to parse remove-brick CLI");</div><div class='del'>-                if (dict)</div><div class='del'>-                        dict_destroy (dict);</div><div class='add'>+            gf_log("cli", GF_LOG_ERROR,</div><div class='add'>+                   "Could not save cmd "</div><div class='add'>+                   "of snapshot status");</div><div class='ctx'>         }</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        return ret;</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+/* return value:</div><div class='add'>+ *      -1  in case of failure.</div><div class='add'>+ *       0  in case of success.</div><div class='add'>+ */</div><div class='ctx'> int32_t</div><div class='del'>-cli_cmd_log_filename_parse (const char **words, int wordcount, dict_t **options)</div><div class='add'>+cli_snap_config_limit_parse(const char **words, dict_t *dict,</div><div class='add'>+                            unsigned int wordcount, unsigned int index,</div><div class='add'>+                            char *key)</div><div class='ctx'> {</div><div class='del'>-        dict_t  *dict = NULL;</div><div class='del'>-        char    *volname = NULL;</div><div class='del'>-        char    *str = NULL;</div><div class='del'>-        int     ret = -1;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int limit = 0;</div><div class='add'>+    char *end_ptr = NULL;</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(words);</div><div class='add'>+    GF_ASSERT(dict);</div><div class='add'>+    GF_ASSERT(key);</div><div class='add'>+</div><div class='add'>+    if (index &gt;= wordcount) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        cli_err("Please provide a value for %s.", key);</div><div class='add'>+        gf_log("cli", GF_LOG_ERROR, "Value not provided for %s", key);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    limit = strtol(words[index], &amp;end_ptr, 10);</div><div class='add'>+</div><div class='add'>+    if (limit &lt;= 0 || strcmp(end_ptr, "") != 0) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        cli_err(</div><div class='add'>+            "Please enter an integer value "</div><div class='add'>+            "greater than zero for %s",</div><div class='add'>+            key);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_set_int32(dict, key, limit);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log("cli", GF_LOG_ERROR,</div><div class='add'>+               "Could not set "</div><div class='add'>+               "%s in dictionary",</div><div class='add'>+               key);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_set_dynstr_with_alloc(dict, "globalname", "All");</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log("cli", GF_LOG_ERROR, "Could not set global key");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    ret = dict_set_int32(dict, "hold_global_locks", _gf_true);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log("cli", GF_LOG_ERROR, "Could not set global locks");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        GF_ASSERT (words);</div><div class='del'>-        GF_ASSERT (options);</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        GF_ASSERT ((strcmp (words[0], "volume")) == 0);</div><div class='del'>-        GF_ASSERT ((strcmp (words[1], "log")) == 0);</div><div class='del'>-        GF_ASSERT ((strcmp (words[2], "filename")) == 0);</div><div class='add'>+/* function cli_snap_config_parse</div><div class='add'>+ * Config Syntax : gluster snapshot config [volname]</div><div class='add'>+ *                                         [snap-max-hard-limit &lt;count&gt;]</div><div class='add'>+ *                                         [snap-max-soft-limit &lt;count&gt;]</div><div class='add'>+ *</div><div class='add'>+   return value: &lt;0  on failure</div><div class='add'>+                  1  if user cancels the operation, or limit value is out of</div><div class='add'>+                                                                      range</div><div class='add'>+                  0  on success</div><div class='add'>+</div><div class='add'>+  NOTE : snap-max-soft-limit can only be set for system.</div><div class='add'>+*/</div><div class='add'>+int32_t</div><div class='add'>+cli_snap_config_parse(const char **words, int wordcount, dict_t *dict,</div><div class='add'>+                      struct cli_state *state)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    gf_answer_t answer = GF_ANSWER_NO;</div><div class='add'>+    gf_boolean_t vol_presence = _gf_false;</div><div class='add'>+    struct snap_config_opt_vals_ *conf_vals = NULL;</div><div class='add'>+    int8_t hard_limit = 0;</div><div class='add'>+    int8_t soft_limit = 0;</div><div class='add'>+    int8_t config_type = -1;</div><div class='add'>+    const char *question = NULL;</div><div class='add'>+    unsigned int cmdi = 2;</div><div class='add'>+    /* cmdi is command index, here cmdi is "2" (gluster snapshot config)*/</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(words);</div><div class='add'>+    GF_ASSERT(dict);</div><div class='add'>+    GF_ASSERT(state);</div><div class='add'>+</div><div class='add'>+    if ((wordcount &lt; 2) || (wordcount &gt; 7)) {</div><div class='add'>+        gf_log("cli", GF_LOG_ERROR, "Invalid wordcount(%d)", wordcount);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (wordcount == 2) {</div><div class='add'>+        config_type = GF_SNAP_CONFIG_DISPLAY;</div><div class='add'>+        ret = 0;</div><div class='add'>+        goto set;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* auto-delete cannot be a volume name */</div><div class='add'>+    /* Check whether the 3rd word is volname */</div><div class='add'>+    if (strcmp(words[cmdi], "snap-max-hard-limit") != 0 &amp;&amp;</div><div class='add'>+        strcmp(words[cmdi], "snap-max-soft-limit") != 0 &amp;&amp;</div><div class='add'>+        strcmp(words[cmdi], "auto-delete") != 0 &amp;&amp;</div><div class='add'>+        strcmp(words[cmdi], "activate-on-create") != 0) {</div><div class='add'>+        ret = dict_set_str(dict, "volname", (char *)words[cmdi]);</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_log("cli", GF_LOG_ERROR, "Failed to set volname");</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+        cmdi++;</div><div class='add'>+        vol_presence = _gf_true;</div><div class='ctx'> </div><div class='del'>-        dict = dict_new ();</div><div class='del'>-        if (!dict)</div><div class='del'>-                goto out;</div><div class='add'>+        if (cmdi == wordcount) {</div><div class='add'>+            config_type = GF_SNAP_CONFIG_DISPLAY;</div><div class='add'>+            ret = 0;</div><div class='add'>+            goto set;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        volname = (char *)words[3];</div><div class='del'>-        GF_ASSERT (volname);</div><div class='add'>+    config_type = GF_SNAP_CONFIG_TYPE_SET;</div><div class='ctx'> </div><div class='del'>-        ret = dict_set_str (dict, "volname", volname);</div><div class='del'>-        if (ret)</div><div class='del'>-                goto out;</div><div class='add'>+    if (strcmp(words[cmdi], "snap-max-hard-limit") == 0) {</div><div class='add'>+        ret = cli_snap_config_limit_parse(words, dict, wordcount, ++cmdi,</div><div class='add'>+                                          "snap-max-hard-limit");</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_log("cli", GF_LOG_ERROR,</div><div class='add'>+                   "Failed to parse snap "</div><div class='add'>+                   "config hard limit");</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+        hard_limit = 1;</div><div class='ctx'> </div><div class='del'>-        str = (char *)words[4];</div><div class='del'>-        if (strchr (str, ':')) {</div><div class='del'>-                ret = dict_set_str (dict, "brick", str);</div><div class='del'>-                if (ret)</div><div class='del'>-                        goto out;</div><div class='del'>-                /* Path */</div><div class='del'>-                str = (char *)words[5];</div><div class='del'>-                ret = dict_set_str (dict, "path", str);</div><div class='del'>-                if (ret)</div><div class='del'>-                        goto out;</div><div class='del'>-        } else {</div><div class='del'>-                ret = dict_set_str (dict, "path", str);</div><div class='del'>-                if (ret)</div><div class='del'>-                        goto out;</div><div class='add'>+        if (++cmdi == wordcount) {</div><div class='add'>+            ret = 0;</div><div class='add'>+            goto set;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (strcmp(words[cmdi], "snap-max-soft-limit") == 0) {</div><div class='add'>+        if (vol_presence == 1) {</div><div class='add'>+            ret = -1;</div><div class='add'>+            cli_err(</div><div class='add'>+                "Soft limit cannot be set to individual "</div><div class='add'>+                "volumes.");</div><div class='add'>+            gf_log("cli", GF_LOG_ERROR,</div><div class='add'>+                   "Soft limit cannot be "</div><div class='add'>+                   "set to volumes");</div><div class='add'>+            goto out;</div><div class='ctx'>         }</div><div class='ctx'> </div><div class='del'>-        *options = dict;</div><div class='add'>+        ret = cli_snap_config_limit_parse(words, dict, wordcount, ++cmdi,</div><div class='add'>+                                          "snap-max-soft-limit");</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_log("cli", GF_LOG_ERROR,</div><div class='add'>+                   "Failed to parse snap "</div><div class='add'>+                   "config soft limit");</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        if (++cmdi != wordcount) {</div><div class='add'>+            ret = -1;</div><div class='add'>+            gf_log("cli", GF_LOG_ERROR, "Invalid Syntax");</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+        soft_limit = 1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (hard_limit || soft_limit)</div><div class='add'>+        goto set;</div><div class='add'>+</div><div class='add'>+    if (strcmp(words[cmdi], "auto-delete") == 0) {</div><div class='add'>+        if (vol_presence == 1) {</div><div class='add'>+            ret = -1;</div><div class='add'>+            cli_err(</div><div class='add'>+                "As of now, auto-delete option cannot be set "</div><div class='add'>+                "to volumes");</div><div class='add'>+            gf_log("cli", GF_LOG_ERROR,</div><div class='add'>+                   "auto-delete option "</div><div class='add'>+                   "cannot be set to volumes");</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        if (++cmdi &gt;= wordcount) {</div><div class='add'>+            ret = -1;</div><div class='add'>+            gf_log("cli", GF_LOG_ERROR, "Invalid Syntax");</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        ret = dict_set_str(dict, "auto-delete", (char *)words[cmdi]);</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_log("cli", GF_LOG_ERROR,</div><div class='add'>+                   "Failed to set "</div><div class='add'>+                   "value of auto-delete in request "</div><div class='add'>+                   "dictionary");</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        if (++cmdi != wordcount) {</div><div class='add'>+            ret = -1;</div><div class='add'>+            gf_log("cli", GF_LOG_ERROR, "Invalid Syntax");</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    } else if (strcmp(words[cmdi], "activate-on-create") == 0) {</div><div class='add'>+        if (vol_presence == 1) {</div><div class='add'>+            ret = -1;</div><div class='add'>+            cli_err(</div><div class='add'>+                "As of now, activate-on-create option "</div><div class='add'>+                "cannot be set to volumes");</div><div class='add'>+            gf_log("cli", GF_LOG_ERROR,</div><div class='add'>+                   "activate-on-create "</div><div class='add'>+                   "option cannot be set to volumes");</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        if (++cmdi &gt;= wordcount) {</div><div class='add'>+            ret = -1;</div><div class='add'>+            gf_log("cli", GF_LOG_ERROR, "Invalid Syntax");</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        ret = dict_set_str(dict, "snap-activate-on-create",</div><div class='add'>+                           (char *)words[cmdi]);</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_log("cli", GF_LOG_ERROR,</div><div class='add'>+                   "Failed to set value "</div><div class='add'>+                   "of activate-on-create in request dictionary");</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        if (++cmdi != wordcount) {</div><div class='add'>+            ret = -1;</div><div class='add'>+            gf_log("cli", GF_LOG_ERROR, "Invalid Syntax");</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    } else {</div><div class='add'>+        ret = -1;</div><div class='add'>+        gf_log("cli", GF_LOG_ERROR, "Invalid Syntax");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = 0; /* Success */</div><div class='add'>+</div><div class='add'>+set:</div><div class='add'>+    ret = dict_set_int32(dict, "config-command", config_type);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log("cli", GF_LOG_ERROR,</div><div class='add'>+               "Unable to set "</div><div class='add'>+               "config-command");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (config_type == GF_SNAP_CONFIG_TYPE_SET &amp;&amp; (hard_limit || soft_limit)) {</div><div class='add'>+        conf_vals = snap_confopt_vals;</div><div class='add'>+        if (hard_limit &amp;&amp; soft_limit) {</div><div class='add'>+            question = conf_vals[GF_SNAP_CONFIG_SET_BOTH].question;</div><div class='add'>+        } else if (soft_limit) {</div><div class='add'>+            question = conf_vals[GF_SNAP_CONFIG_SET_SOFT].question;</div><div class='add'>+        } else if (hard_limit) {</div><div class='add'>+            question = conf_vals[GF_SNAP_CONFIG_SET_HARD].question;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        answer = cli_cmd_get_confirmation(state, question);</div><div class='add'>+        if (GF_ANSWER_NO == answer) {</div><div class='add'>+            ret = 1;</div><div class='add'>+            gf_log("cli", GF_LOG_DEBUG,</div><div class='add'>+                   "User cancelled "</div><div class='add'>+                   "snapshot config operation");</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='ctx'> </div><div class='ctx'> out:</div><div class='del'>-        if (ret &amp;&amp; dict)</div><div class='del'>-                dict_destroy (dict);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        return ret;</div><div class='add'>+int</div><div class='add'>+validate_op_name(const char *op, const char *opname, char **opwords)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int i = 0;</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(opname);</div><div class='add'>+    GF_ASSERT(opwords);</div><div class='add'>+</div><div class='add'>+    for (i = 0; opwords[i] != NULL; i++) {</div><div class='add'>+        if (strcmp(opwords[i], opname) == 0) {</div><div class='add'>+            cli_out("\"%s\" cannot be a %s", opname, op);</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    ret = 0;</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> int32_t</div><div class='del'>-cli_cmd_log_locate_parse (const char **words, int wordcount, dict_t **options)</div><div class='add'>+cli_cmd_snapshot_parse(const char **words, int wordcount, dict_t **options,</div><div class='add'>+                       struct cli_state *state)</div><div class='ctx'> {</div><div class='del'>-        dict_t  *dict = NULL;</div><div class='del'>-        char    *volname = NULL;</div><div class='del'>-        char    *str = NULL;</div><div class='del'>-        int     ret = -1;</div><div class='add'>+    int32_t ret = -1;</div><div class='add'>+    dict_t *dict = NULL;</div><div class='add'>+    gf1_cli_snapshot type = GF_SNAP_OPTION_TYPE_NONE;</div><div class='add'>+    char *w = NULL;</div><div class='add'>+    static char *opwords[] = {"create",     "delete", "restore", "activate",</div><div class='add'>+                              "deactivate", "list",   "status",  "config",</div><div class='add'>+                              "info",       "clone",  NULL};</div><div class='add'>+    static char *invalid_snapnames[] = {"description", "force", "volume", "all",</div><div class='add'>+                                        NULL};</div><div class='add'>+    static char *invalid_volnames[] = {"volume",</div><div class='add'>+                                       "type",</div><div class='add'>+                                       "subvolumes",</div><div class='add'>+                                       "option",</div><div class='add'>+                                       "end-volume",</div><div class='add'>+                                       "all",</div><div class='add'>+                                       "volume_not_in_ring",</div><div class='add'>+                                       "description",</div><div class='add'>+                                       "force",</div><div class='add'>+                                       "snap-max-hard-limit",</div><div class='add'>+                                       "snap-max-soft-limit",</div><div class='add'>+                                       "auto-delete",</div><div class='add'>+                                       "activate-on-create",</div><div class='add'>+                                       NULL};</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(words);</div><div class='add'>+    GF_ASSERT(options);</div><div class='add'>+    GF_ASSERT(state);</div><div class='add'>+</div><div class='add'>+    dict = dict_new();</div><div class='add'>+    if (!dict)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    /* Lowest wordcount possible */</div><div class='add'>+    if (wordcount &lt; 2) {</div><div class='add'>+        gf_log("", GF_LOG_ERROR, "Invalid command: Not enough arguments");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    w = str_getunamb(words[1], opwords);</div><div class='add'>+    if (!w) {</div><div class='add'>+        /* Checks if the operation is a valid operation */</div><div class='add'>+        gf_log("", GF_LOG_ERROR, "Opword Mismatch");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (!strcmp(w, "create")) {</div><div class='add'>+        type = GF_SNAP_OPTION_TYPE_CREATE;</div><div class='add'>+    } else if (!strcmp(w, "list")) {</div><div class='add'>+        type = GF_SNAP_OPTION_TYPE_LIST;</div><div class='add'>+    } else if (!strcmp(w, "info")) {</div><div class='add'>+        type = GF_SNAP_OPTION_TYPE_INFO;</div><div class='add'>+    } else if (!strcmp(w, "delete")) {</div><div class='add'>+        type = GF_SNAP_OPTION_TYPE_DELETE;</div><div class='add'>+    } else if (!strcmp(w, "config")) {</div><div class='add'>+        type = GF_SNAP_OPTION_TYPE_CONFIG;</div><div class='add'>+    } else if (!strcmp(w, "restore")) {</div><div class='add'>+        type = GF_SNAP_OPTION_TYPE_RESTORE;</div><div class='add'>+    } else if (!strcmp(w, "status")) {</div><div class='add'>+        type = GF_SNAP_OPTION_TYPE_STATUS;</div><div class='add'>+    } else if (!strcmp(w, "activate")) {</div><div class='add'>+        type = GF_SNAP_OPTION_TYPE_ACTIVATE;</div><div class='add'>+    } else if (!strcmp(w, "deactivate")) {</div><div class='add'>+        type = GF_SNAP_OPTION_TYPE_DEACTIVATE;</div><div class='add'>+    } else if (!strcmp(w, "clone")) {</div><div class='add'>+        type = GF_SNAP_OPTION_TYPE_CLONE;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (type != GF_SNAP_OPTION_TYPE_CONFIG &amp;&amp;</div><div class='add'>+        type != GF_SNAP_OPTION_TYPE_STATUS) {</div><div class='add'>+        ret = dict_set_int32(dict, "hold_snap_locks", _gf_true);</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_log("cli", GF_LOG_ERROR,</div><div class='add'>+                   "Unable to set hold-snap-locks value "</div><div class='add'>+                   "as _gf_true");</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        GF_ASSERT (words);</div><div class='del'>-        GF_ASSERT (options);</div><div class='add'>+    /* Following commands does not require volume locks  */</div><div class='add'>+    if (type == GF_SNAP_OPTION_TYPE_STATUS ||</div><div class='add'>+        type == GF_SNAP_OPTION_TYPE_ACTIVATE ||</div><div class='add'>+        type == GF_SNAP_OPTION_TYPE_DEACTIVATE) {</div><div class='add'>+        ret = dict_set_int32(dict, "hold_vol_locks", _gf_false);</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_log("cli", GF_LOG_ERROR,</div><div class='add'>+                   "Setting volume lock "</div><div class='add'>+                   "flag failed");</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Check which op is intended */</div><div class='add'>+    switch (type) {</div><div class='add'>+        case GF_SNAP_OPTION_TYPE_CREATE:</div><div class='add'>+            /* Syntax :</div><div class='add'>+             * gluster snapshot create &lt;snapname&gt; &lt;vol-name(s)&gt;</div><div class='add'>+             *                         [no-timestamp]</div><div class='add'>+             *                         [description &lt;description&gt;]</div><div class='add'>+             *                         [force]</div><div class='add'>+             */</div><div class='add'>+            /* In cases where the snapname is not given then</div><div class='add'>+             * parsing fails &amp; snapname cannot be "description",</div><div class='add'>+             * "force" and "volume", that check is made here</div><div class='add'>+             */</div><div class='add'>+            if (wordcount == 2) {</div><div class='add'>+                ret = -1;</div><div class='add'>+                gf_log("cli", GF_LOG_ERROR, "Invalid Syntax");</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='ctx'> </div><div class='del'>-        GF_ASSERT ((strcmp (words[0], "volume")) == 0);</div><div class='del'>-        GF_ASSERT ((strcmp (words[1], "log")) == 0);</div><div class='del'>-        GF_ASSERT ((strcmp (words[2], "locate")) == 0);</div><div class='add'>+            ret = validate_op_name("snapname", words[2], invalid_snapnames);</div><div class='add'>+            if (ret) {</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='ctx'> </div><div class='del'>-        dict = dict_new ();</div><div class='del'>-        if (!dict)</div><div class='add'>+            ret = cli_snap_create_parse(dict, words, wordcount);</div><div class='add'>+            if (ret) {</div><div class='add'>+                gf_log("cli", GF_LOG_ERROR, "create command parsing failed.");</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+            break;</div><div class='add'>+</div><div class='add'>+        case GF_SNAP_OPTION_TYPE_CLONE:</div><div class='add'>+            /* Syntax :</div><div class='add'>+             * gluster snapshot clone &lt;clonename&gt; &lt;snapname&gt;</div><div class='add'>+             */</div><div class='add'>+            /* In cases where the clonename is not given then</div><div class='add'>+             * parsing fails &amp; snapname cannot be "description",</div><div class='add'>+             * "force" and "volume", that check is made here</div><div class='add'>+             */</div><div class='add'>+            if (wordcount == 2) {</div><div class='add'>+                ret = -1;</div><div class='add'>+                gf_log("cli", GF_LOG_ERROR, "Invalid Syntax");</div><div class='ctx'>                 goto out;</div><div class='add'>+            }</div><div class='ctx'> </div><div class='del'>-        volname = (char *)words[3];</div><div class='del'>-        GF_ASSERT (volname);</div><div class='add'>+            ret = validate_op_name("clonename", words[2], invalid_volnames);</div><div class='add'>+            if (ret) {</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='ctx'> </div><div class='del'>-        ret = dict_set_str (dict, "volname", volname);</div><div class='del'>-        if (ret)</div><div class='add'>+            ret = cli_snap_clone_parse(dict, words, wordcount);</div><div class='add'>+            if (ret) {</div><div class='add'>+                gf_log("cli", GF_LOG_ERROR, "clone command parsing failed.");</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+            break;</div><div class='add'>+</div><div class='add'>+        case GF_SNAP_OPTION_TYPE_INFO:</div><div class='add'>+            /* Syntax :</div><div class='add'>+             * gluster snapshot info [(snapname] | [vol &lt;volname&gt;)]</div><div class='add'>+             */</div><div class='add'>+            ret = cli_snap_info_parse(dict, words, wordcount);</div><div class='add'>+            if (ret) {</div><div class='add'>+                gf_log("cli", GF_LOG_ERROR,</div><div class='add'>+                       "Failed to parse "</div><div class='add'>+                       "snapshot info command");</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+            break;</div><div class='add'>+</div><div class='add'>+        case GF_SNAP_OPTION_TYPE_LIST:</div><div class='add'>+            /* Syntax :</div><div class='add'>+             * gluster snaphsot list [volname]</div><div class='add'>+             */</div><div class='add'>+</div><div class='add'>+            ret = cli_snap_list_parse(dict, words, wordcount);</div><div class='add'>+            if (ret) {</div><div class='add'>+                gf_log("cli", GF_LOG_ERROR,</div><div class='add'>+                       "Failed to parse "</div><div class='add'>+                       "snapshot list command");</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+            break;</div><div class='add'>+</div><div class='add'>+        case GF_SNAP_OPTION_TYPE_DELETE:</div><div class='add'>+            /* Syntax :</div><div class='add'>+             * snapshot delete (all | snapname | volume &lt;volname&gt;)</div><div class='add'>+             */</div><div class='add'>+            ret = cli_snap_delete_parse(dict, words, wordcount, state);</div><div class='add'>+            if (ret) {</div><div class='add'>+                /* A positive ret value means user cancelled</div><div class='add'>+                 * the command */</div><div class='add'>+                if (ret &lt; 0) {</div><div class='add'>+                    gf_log("cli", GF_LOG_ERROR,</div><div class='add'>+                           "Failed to parse "</div><div class='add'>+                           "snapshot delete command");</div><div class='add'>+                }</div><div class='ctx'>                 goto out;</div><div class='add'>+            }</div><div class='add'>+            break;</div><div class='add'>+</div><div class='add'>+        case GF_SNAP_OPTION_TYPE_CONFIG:</div><div class='add'>+            /* snapshot config [volname]  [snap-max-hard-limit &lt;count&gt;]</div><div class='add'>+             *                            [snap-max-soft-limit &lt;percent&gt;] */</div><div class='add'>+            ret = cli_snap_config_parse(words, wordcount, dict, state);</div><div class='add'>+            if (ret) {</div><div class='add'>+                if (ret &lt; 0)</div><div class='add'>+                    gf_log("cli", GF_LOG_ERROR,</div><div class='add'>+                           "config command parsing failed.");</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='ctx'> </div><div class='del'>-        str = (char *)words[4];</div><div class='del'>-        if (str &amp;&amp; strchr (str, ':')) {</div><div class='del'>-                ret = dict_set_str (dict, "brick", str);</div><div class='del'>-                if (ret)</div><div class='del'>-                        goto out;</div><div class='add'>+            ret = dict_set_int32(dict, "type", GF_SNAP_OPTION_TYPE_CONFIG);</div><div class='add'>+            if (ret) {</div><div class='add'>+                gf_log("cli", GF_LOG_ERROR,</div><div class='add'>+                       "Unable to set "</div><div class='add'>+                       "config type");</div><div class='add'>+                ret = -1;</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+            break;</div><div class='add'>+</div><div class='add'>+        case GF_SNAP_OPTION_TYPE_STATUS: {</div><div class='add'>+            /* Syntax :</div><div class='add'>+             * gluster snapshot status [(snapname |</div><div class='add'>+             *                         volume &lt;volname&gt;)]</div><div class='add'>+             */</div><div class='add'>+            ret = cli_snap_status_parse(dict, words, wordcount);</div><div class='add'>+            if (ret) {</div><div class='add'>+                gf_log("cli", GF_LOG_ERROR,</div><div class='add'>+                       "Failed to parse "</div><div class='add'>+                       "snapshot status command");</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+            break;</div><div class='ctx'>         }</div><div class='ctx'> </div><div class='add'>+        case GF_SNAP_OPTION_TYPE_RESTORE:</div><div class='add'>+            /* Syntax:</div><div class='add'>+             * snapshot restore &lt;snapname&gt;</div><div class='add'>+             */</div><div class='add'>+            ret = cli_snap_restore_parse(dict, words, wordcount, state);</div><div class='add'>+            if (ret) {</div><div class='add'>+                gf_log("cli", GF_LOG_ERROR,</div><div class='add'>+                       "Failed to parse "</div><div class='add'>+                       "restore command");</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+            break;</div><div class='add'>+</div><div class='add'>+        case GF_SNAP_OPTION_TYPE_ACTIVATE:</div><div class='add'>+            /* Syntax:</div><div class='add'>+             * snapshot activate &lt;snapname&gt; [force]</div><div class='add'>+             */</div><div class='add'>+            ret = cli_snap_activate_parse(dict, words, wordcount);</div><div class='add'>+            if (ret) {</div><div class='add'>+                gf_log("cli", GF_LOG_ERROR,</div><div class='add'>+                       "Failed to parse "</div><div class='add'>+                       "start command");</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+            break;</div><div class='add'>+        case GF_SNAP_OPTION_TYPE_DEACTIVATE:</div><div class='add'>+            /* Syntax:</div><div class='add'>+             * snapshot deactivate &lt;snapname&gt;</div><div class='add'>+             */</div><div class='add'>+            ret = cli_snap_deactivate_parse(dict, words, wordcount, state);</div><div class='add'>+            if (ret) {</div><div class='add'>+                /* A positive ret value means user cancelled</div><div class='add'>+                 * the command */</div><div class='add'>+                if (ret &lt; 0) {</div><div class='add'>+                    gf_log("cli", GF_LOG_ERROR,</div><div class='add'>+                           "Failed to parse deactivate "</div><div class='add'>+                           "command");</div><div class='add'>+                }</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+            break;</div><div class='add'>+</div><div class='add'>+        default:</div><div class='add'>+            ret = -1;</div><div class='add'>+            gf_log("", GF_LOG_ERROR, "Opword Mismatch");</div><div class='add'>+            goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_set_int32(dict, "type", type);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log("", GF_LOG_ERROR, "Failed to set type.");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    /* If you got so far, input is valid */</div><div class='add'>+    ret = 0;</div><div class='add'>+out:</div><div class='add'>+    if (ret) {</div><div class='add'>+        if (dict)</div><div class='add'>+            dict_unref(dict);</div><div class='add'>+    } else</div><div class='ctx'>         *options = dict;</div><div class='ctx'> </div><div class='del'>-out:</div><div class='del'>-        if (ret &amp;&amp; dict)</div><div class='del'>-                dict_destroy (dict);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+cli_cmd_validate_volume(char *volname)</div><div class='add'>+{</div><div class='add'>+    int i = 0;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int volname_len;</div><div class='add'>+</div><div class='add'>+    if (volname[0] == '-')</div><div class='add'>+        return ret;</div><div class='add'>+</div><div class='add'>+    if (!strcmp(volname, "all")) {</div><div class='add'>+        cli_err("\"all\" cannot be the name of a volume.");</div><div class='add'>+        return ret;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='add'>+    if (strchr(volname, '/')) {</div><div class='add'>+        cli_err("Volume name should not contain \"/\" character.");</div><div class='ctx'>         return ret;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    volname_len = strlen(volname);</div><div class='add'>+    if (volname_len &gt; GD_VOLUME_NAME_MAX) {</div><div class='add'>+        cli_err("Volname can not exceed %d characters.", GD_VOLUME_NAME_MAX);</div><div class='add'>+        return ret;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; volname_len; i++)</div><div class='add'>+        if (!isalnum(volname[i]) &amp;&amp; (volname[i] != '_') &amp;&amp;</div><div class='add'>+            (volname[i] != '-')) {</div><div class='add'>+            cli_err(</div><div class='add'>+                "Volume name should not contain \"%c\""</div><div class='add'>+                " character.\nVolume names can only"</div><div class='add'>+                "contain alphanumeric, '-' and '_' "</div><div class='add'>+                "characters.",</div><div class='add'>+                volname[i]);</div><div class='add'>+            return ret;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> int32_t</div><div class='del'>-cli_cmd_log_rotate_parse (const char **words, int wordcount, dict_t **options)</div><div class='add'>+cli_cmd_bitrot_parse(const char **words, int wordcount, dict_t **options)</div><div class='ctx'> {</div><div class='del'>-        dict_t  *dict = NULL;</div><div class='del'>-        char    *volname = NULL;</div><div class='del'>-        char    *str = NULL;</div><div class='del'>-        int     ret = -1;</div><div class='add'>+    int32_t ret = -1;</div><div class='add'>+    char *w = NULL;</div><div class='add'>+    char *volname = NULL;</div><div class='add'>+    static char *opwords[] = {"enable",          "disable", "scrub-throttle",</div><div class='add'>+                              "scrub-frequency", "scrub",   "signing-time",</div><div class='add'>+                              "signer-threads",  NULL};</div><div class='add'>+    static char *scrub_throt_values[] = {"lazy", "normal", "aggressive", NULL};</div><div class='add'>+    static char *scrub_freq_values[] = {</div><div class='add'>+        "hourly", "daily", "weekly", "biweekly", "monthly", "minute", NULL};</div><div class='add'>+    static char *scrub_values[] = {"pause", "resume", "status", "ondemand",</div><div class='add'>+                                   NULL};</div><div class='add'>+    dict_t *dict = NULL;</div><div class='add'>+    gf_bitrot_type type = GF_BITROT_OPTION_TYPE_NONE;</div><div class='add'>+    int32_t expiry_time = 0;</div><div class='add'>+    int32_t signer_th_count = 0;</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(words);</div><div class='add'>+    GF_ASSERT(options);</div><div class='add'>+</div><div class='add'>+    /* Hack to print out bitrot help properly */</div><div class='add'>+    if ((wordcount == 3) &amp;&amp; !(strcmp(words[2], "help"))) {</div><div class='add'>+        ret = 1;</div><div class='add'>+        return ret;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (wordcount &lt; 4 || wordcount &gt; 5) {</div><div class='add'>+        gf_log("cli", GF_LOG_ERROR, "Invalid syntax");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    dict = dict_new();</div><div class='add'>+    if (!dict)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    volname = (char *)words[2];</div><div class='add'>+    if (!volname) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = cli_cmd_validate_volume(volname);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log("cli", GF_LOG_ERROR, "Failed to validate volume name");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_set_str(dict, "volname", volname);</div><div class='add'>+    if (ret) {</div><div class='add'>+        cli_out("Failed to set volume name in dictionary ");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    w = str_getunamb(words[3], opwords);</div><div class='add'>+    if (!w) {</div><div class='add'>+        cli_out("Invalid bit rot option : %s", words[3]);</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (strcmp(w, "enable") == 0) {</div><div class='add'>+        if (wordcount == 4) {</div><div class='add'>+            type = GF_BITROT_OPTION_TYPE_ENABLE;</div><div class='add'>+            ret = 0;</div><div class='add'>+            goto set_type;</div><div class='add'>+        } else {</div><div class='add'>+            ret = -1;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        GF_ASSERT (words);</div><div class='del'>-        GF_ASSERT (options);</div><div class='add'>+    if (strcmp(w, "disable") == 0) {</div><div class='add'>+        if (wordcount == 4) {</div><div class='add'>+            type = GF_BITROT_OPTION_TYPE_DISABLE;</div><div class='add'>+            ret = 0;</div><div class='add'>+            goto set_type;</div><div class='add'>+        } else {</div><div class='add'>+            ret = -1;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (!strcmp(w, "scrub-throttle")) {</div><div class='add'>+        if (!words[4]) {</div><div class='add'>+            cli_err(</div><div class='add'>+                "Missing scrub-throttle value for bitrot "</div><div class='add'>+                "option");</div><div class='add'>+            ret = -1;</div><div class='add'>+            goto out;</div><div class='add'>+        } else {</div><div class='add'>+            w = str_getunamb(words[4], scrub_throt_values);</div><div class='add'>+            if (!w) {</div><div class='add'>+                cli_err(</div><div class='add'>+                    "Invalid scrub-throttle option for "</div><div class='add'>+                    "bitrot");</div><div class='add'>+                ret = -1;</div><div class='add'>+                goto out;</div><div class='add'>+            } else {</div><div class='add'>+                type = GF_BITROT_OPTION_TYPE_SCRUB_THROTTLE;</div><div class='add'>+                ret = dict_set_str(dict, "scrub-throttle-value",</div><div class='add'>+                                   (char *)words[4]);</div><div class='add'>+                if (ret) {</div><div class='add'>+                    cli_out(</div><div class='add'>+                        "Failed to set scrub-throttle "</div><div class='add'>+                        "value in the dict");</div><div class='add'>+                    goto out;</div><div class='add'>+                }</div><div class='add'>+                goto set_type;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (!strcmp(words[3], "scrub-frequency")) {</div><div class='add'>+        if (!words[4]) {</div><div class='add'>+            cli_err("Missing scrub-frequency value");</div><div class='add'>+            ret = -1;</div><div class='add'>+            goto out;</div><div class='add'>+        } else {</div><div class='add'>+            w = str_getunamb(words[4], scrub_freq_values);</div><div class='add'>+            if (!w) {</div><div class='add'>+                cli_err("Invalid frequency option for bitrot");</div><div class='add'>+                ret = -1;</div><div class='add'>+                goto out;</div><div class='add'>+            } else {</div><div class='add'>+                type = GF_BITROT_OPTION_TYPE_SCRUB_FREQ;</div><div class='add'>+                ret = dict_set_str(dict, "scrub-frequency-value",</div><div class='add'>+                                   (char *)words[4]);</div><div class='add'>+                if (ret) {</div><div class='add'>+                    cli_out(</div><div class='add'>+                        "Failed to set dict for "</div><div class='add'>+                        "bitrot");</div><div class='add'>+                    goto out;</div><div class='add'>+                }</div><div class='add'>+                goto set_type;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        GF_ASSERT ((strcmp (words[0], "volume")) == 0);</div><div class='del'>-        GF_ASSERT ((strcmp (words[1], "log")) == 0);</div><div class='del'>-        GF_ASSERT ((strcmp (words[2], "rotate")) == 0);</div><div class='add'>+    if (!strcmp(words[3], "scrub")) {</div><div class='add'>+        if (!words[4]) {</div><div class='add'>+            cli_err("Missing scrub value for bitrot option");</div><div class='add'>+            ret = -1;</div><div class='add'>+            goto out;</div><div class='add'>+        } else {</div><div class='add'>+            w = str_getunamb(words[4], scrub_values);</div><div class='add'>+            if (!w) {</div><div class='add'>+                cli_err("Invalid scrub option for bitrot");</div><div class='add'>+                ret = -1;</div><div class='add'>+                goto out;</div><div class='add'>+            } else {</div><div class='add'>+                if (strcmp(words[4], "status") == 0) {</div><div class='add'>+                    type = GF_BITROT_CMD_SCRUB_STATUS;</div><div class='add'>+                } else if (strcmp(words[4], "ondemand") == 0) {</div><div class='add'>+                    type = GF_BITROT_CMD_SCRUB_ONDEMAND;</div><div class='add'>+                } else {</div><div class='add'>+                    type = GF_BITROT_OPTION_TYPE_SCRUB;</div><div class='add'>+                }</div><div class='add'>+                ret = dict_set_str(dict, "scrub-value", (char *)words[4]);</div><div class='add'>+                if (ret) {</div><div class='add'>+                    cli_out(</div><div class='add'>+                        "Failed to set dict for "</div><div class='add'>+                        "bitrot");</div><div class='add'>+                    goto out;</div><div class='add'>+                }</div><div class='add'>+                goto set_type;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (!strcmp(words[3], "signing-time")) {</div><div class='add'>+        if (!words[4]) {</div><div class='add'>+            cli_err(</div><div class='add'>+                "Missing signing-time value for bitrot "</div><div class='add'>+                "option");</div><div class='add'>+            ret = -1;</div><div class='add'>+            goto out;</div><div class='add'>+        } else {</div><div class='add'>+            type = GF_BITROT_OPTION_TYPE_EXPIRY_TIME;</div><div class='ctx'> </div><div class='del'>-        dict = dict_new ();</div><div class='del'>-        if (!dict)</div><div class='add'>+            expiry_time = strtol(words[4], NULL, 0);</div><div class='add'>+            if (expiry_time &lt; 1) {</div><div class='add'>+                cli_err(</div><div class='add'>+                    "Expiry time  value should not be less"</div><div class='add'>+                    " than 1");</div><div class='add'>+                ret = -1;</div><div class='ctx'>                 goto out;</div><div class='add'>+            }</div><div class='ctx'> </div><div class='del'>-        volname = (char *)words[3];</div><div class='del'>-        GF_ASSERT (volname);</div><div class='add'>+            ret = dict_set_uint32(dict, "expiry-time",</div><div class='add'>+                                  (unsigned int)expiry_time);</div><div class='add'>+            if (ret) {</div><div class='add'>+                cli_out("Failed to set dict for bitrot");</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+            goto set_type;</div><div class='add'>+        }</div><div class='add'>+    } else if (!strcmp(words[3], "signer-threads")) {</div><div class='add'>+        if (!words[4]) {</div><div class='add'>+            cli_err(</div><div class='add'>+                "Missing signer-thread value for bitrot "</div><div class='add'>+                "option");</div><div class='add'>+            ret = -1;</div><div class='add'>+            goto out;</div><div class='add'>+        } else {</div><div class='add'>+            type = GF_BITROT_OPTION_TYPE_SIGNER_THREADS;</div><div class='ctx'> </div><div class='del'>-        ret = dict_set_str (dict, "volname", volname);</div><div class='del'>-        if (ret)</div><div class='add'>+            signer_th_count = strtol(words[4], NULL, 0);</div><div class='add'>+            if (signer_th_count &lt; 1) {</div><div class='add'>+                cli_err("signer-thread count should not be less than 1");</div><div class='add'>+                ret = -1;</div><div class='ctx'>                 goto out;</div><div class='add'>+            }</div><div class='ctx'> </div><div class='del'>-        str = (char *)words[4];</div><div class='del'>-        if (str &amp;&amp; strchr (str, ':')) {</div><div class='del'>-                ret = dict_set_str (dict, "brick", str);</div><div class='del'>-                if (ret)</div><div class='del'>-                        goto out;</div><div class='add'>+            ret = dict_set_uint32(dict, "signer-threads",</div><div class='add'>+                                  (unsigned int)signer_th_count);</div><div class='add'>+            if (ret) {</div><div class='add'>+                cli_out("Failed to set dict for bitrot");</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+            goto set_type;</div><div class='ctx'>         }</div><div class='add'>+    } else {</div><div class='add'>+        cli_err(</div><div class='add'>+            "Invalid option %s for bitrot. Please enter valid "</div><div class='add'>+            "bitrot option",</div><div class='add'>+            words[3]);</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+set_type:</div><div class='add'>+    ret = dict_set_int32(dict, "type", type);</div><div class='add'>+    if (ret &lt; 0)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    *options = dict;</div><div class='ctx'> </div><div class='del'>-        *options = dict;</div><div class='add'>+out:</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log("cli", GF_LOG_ERROR, "Unable to parse bitrot command");</div><div class='add'>+        if (dict)</div><div class='add'>+            dict_unref(dict);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* Parsing global option for NFS-Ganesha config</div><div class='add'>+ *  gluster nfs-ganesha enable/disable */</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+cli_cmd_ganesha_parse(struct cli_state *state, const char **words,</div><div class='add'>+                      int wordcount, dict_t **options, char **op_errstr)</div><div class='add'>+{</div><div class='add'>+    dict_t *dict = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    char *key = NULL;</div><div class='add'>+    char *value = NULL;</div><div class='add'>+    char *w = NULL;</div><div class='add'>+    static char *opwords[] = {"enable", "disable", NULL};</div><div class='add'>+    const char *question = NULL;</div><div class='add'>+    gf_answer_t answer = GF_ANSWER_NO;</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(words);</div><div class='add'>+    GF_ASSERT(options);</div><div class='add'>+</div><div class='add'>+    dict = dict_new();</div><div class='add'>+</div><div class='add'>+    if (!dict)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    if (wordcount != 2)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    key = (char *)words[0];</div><div class='add'>+    value = (char *)words[1];</div><div class='add'>+</div><div class='add'>+    if (!key || !value) {</div><div class='add'>+        cli_out("Usage : nfs-ganesha &lt;enable/disable&gt;");</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = gf_strip_whitespace(value, strlen(value));</div><div class='add'>+    if (ret == -1)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    if (strcmp(key, "nfs-ganesha")) {</div><div class='add'>+        gf_asprintf(op_errstr,</div><div class='add'>+                    "Global option: error: ' %s '"</div><div class='add'>+                    "is not a valid global option.",</div><div class='add'>+                    key);</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    w = str_getunamb(value, opwords);</div><div class='add'>+    if (!w) {</div><div class='add'>+        cli_out(</div><div class='add'>+            "Invalid global option \n"</div><div class='add'>+            "Usage : nfs-ganesha &lt;enable/disable&gt;");</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (strcmp(value, "enable") == 0) {</div><div class='add'>+        question =</div><div class='add'>+            "Enabling NFS-Ganesha requires Gluster-NFS to be "</div><div class='add'>+            "disabled across the trusted pool. Do you "</div><div class='add'>+            "still want to continue?\n";</div><div class='add'>+    } else if (strcmp(value, "disable") == 0) {</div><div class='add'>+        question =</div><div class='add'>+            "Disabling NFS-Ganesha will tear down the entire "</div><div class='add'>+            "ganesha cluster across the trusted pool. Do you "</div><div class='add'>+            "still want to continue?\n";</div><div class='add'>+    } else {</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    answer = cli_cmd_get_confirmation(state, question);</div><div class='add'>+    if (GF_ANSWER_NO == answer) {</div><div class='add'>+        gf_log("cli", GF_LOG_ERROR,</div><div class='add'>+               "Global operation "</div><div class='add'>+               "cancelled, exiting");</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    cli_out("This will take a few minutes to complete. Please wait ..");</div><div class='add'>+</div><div class='add'>+    ret = dict_set_str(dict, "key", key);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log(THIS-&gt;name, GF_LOG_ERROR, "dict set on key failed");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_set_str(dict, "value", value);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log(THIS-&gt;name, GF_LOG_ERROR, "dict set on value failed");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_set_str(dict, "globalname", "All");</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log(THIS-&gt;name, GF_LOG_ERROR,</div><div class='add'>+               "dict set on global"</div><div class='add'>+               " key failed.");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_set_int32(dict, "hold_global_locks", _gf_true);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log(THIS-&gt;name, GF_LOG_ERROR,</div><div class='add'>+               "dict set on global key "</div><div class='add'>+               "failed.");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    *options = dict;</div><div class='ctx'> out:</div><div class='del'>-        if (ret &amp;&amp; dict)</div><div class='del'>-                dict_destroy (dict);</div><div class='add'>+    if (ret)</div><div class='add'>+        dict_unref(dict);</div><div class='ctx'> </div><div class='del'>-        return ret;</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='head'>diff --git a/cli/src/cli-cmd-peer.c b/cli/src/cli-cmd-peer.c<br/>index d0c7639ada4..084998701d8 100644<br/>--- a/<a href='/cgit/glusterfs.git/tree/cli/src/cli-cmd-peer.c?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>cli/src/cli-cmd-peer.c</a><br/>+++ b/<a href='/cgit/glusterfs.git/tree/cli/src/cli-cmd-peer.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>cli/src/cli-cmd-peer.c</a></div><div class='hunk'>@@ -1,232 +1,317 @@</div><div class='ctx'> /*</div><div class='del'>-  Copyright (c) 2010 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='del'>-  This file is part of GlusterFS.</div><div class='del'>-</div><div class='del'>-  GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-  it under the terms of the GNU Affero General Public License as published</div><div class='del'>-  by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-  or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-  GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-  WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-  Affero General Public License for more details.</div><div class='del'>-</div><div class='del'>-  You should have received a copy of the GNU Affero General Public License</div><div class='del'>-  along with this program.  If not, see</div><div class='del'>-  &lt;http://www.gnu.org/licenses/&gt;.</div><div class='del'>-*/</div><div class='add'>+   Copyright (c) 2010-2012 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+   This file is part of GlusterFS.</div><div class='ctx'> </div><div class='add'>+   This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+   General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+   later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+   cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='ctx'> #include &lt;stdio.h&gt;</div><div class='ctx'> #include &lt;string.h&gt;</div><div class='ctx'> #include &lt;stdlib.h&gt;</div><div class='ctx'> #include &lt;stdint.h&gt;</div><div class='ctx'> #include &lt;pthread.h&gt;</div><div class='ctx'> </div><div class='del'>-#ifndef _CONFIG_H</div><div class='del'>-#define _CONFIG_H</div><div class='del'>-#include "config.h"</div><div class='del'>-#endif</div><div class='del'>-</div><div class='ctx'> #include "cli.h"</div><div class='ctx'> #include "cli-cmd.h"</div><div class='ctx'> #include "cli-mem-types.h"</div><div class='add'>+#include "cli1-xdr.h"</div><div class='ctx'> #include "protocol-common.h"</div><div class='add'>+#include &lt;glusterfs/events.h&gt;</div><div class='ctx'> </div><div class='del'>-extern struct rpc_clnt *global_rpc;</div><div class='del'>-</div><div class='del'>-extern rpc_clnt_prog_t *cli_rpc_prog;</div><div class='del'>-</div><div class='del'>-int cli_cmd_peer_help_cbk (struct cli_state *state, struct cli_cmd_word *in_word,</div><div class='add'>+int</div><div class='add'>+cli_cmd_peer_help_cbk(struct cli_state *state, struct cli_cmd_word *in_word,</div><div class='ctx'>                       const char **words, int wordcount);</div><div class='ctx'> </div><div class='del'>-void</div><div class='del'>-cli_cmd_probe_usage ()</div><div class='add'>+int</div><div class='add'>+cli_cmd_peer_probe_cbk(struct cli_state *state, struct cli_cmd_word *word,</div><div class='add'>+                       const char **words, int wordcount)</div><div class='ctx'> {</div><div class='del'>-        cli_out ("Usage: probe &lt;hostname&gt;");</div><div class='del'>-}</div><div class='add'>+    int ret = -1;</div><div class='add'>+    rpc_clnt_procedure_t *proc = NULL;</div><div class='add'>+    call_frame_t *frame = NULL;</div><div class='add'>+    dict_t *dict = NULL;</div><div class='add'>+    int sent = 0;</div><div class='add'>+    int parse_error = 0;</div><div class='add'>+    cli_local_t *local = NULL;</div><div class='add'>+</div><div class='add'>+    if (!(wordcount == 3)) {</div><div class='add'>+        cli_usage_out(word-&gt;pattern);</div><div class='add'>+        parse_error = 1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    proc = &amp;cli_rpc_prog-&gt;proctable[GLUSTER_CLI_PROBE];</div><div class='add'>+</div><div class='add'>+    dict = dict_new();</div><div class='add'>+    if (!dict)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    ret = dict_set_str(dict, "hostname", (char *)words[2]);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    ret = valid_internet_address((char *)words[2], _gf_false, _gf_false);</div><div class='add'>+    if (ret == 1) {</div><div class='add'>+        ret = 0;</div><div class='add'>+    } else {</div><div class='add'>+        cli_out("%s is an invalid address", words[2]);</div><div class='add'>+        cli_usage_out(word-&gt;pattern);</div><div class='add'>+        parse_error = 1;</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    /*        if (words[3]) {</div><div class='add'>+                    ret = dict_set_str (dict, "port", (char *)words[3]);</div><div class='add'>+                    if (ret)</div><div class='add'>+                            goto out;</div><div class='add'>+            }</div><div class='add'>+    */</div><div class='add'>+</div><div class='add'>+    frame = create_frame(THIS, THIS-&gt;ctx-&gt;pool);</div><div class='add'>+    if (!frame) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    CLI_LOCAL_INIT(local, words, frame, dict);</div><div class='add'>+</div><div class='add'>+    if (proc-&gt;fn) {</div><div class='add'>+        ret = proc-&gt;fn(frame, THIS, dict);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-void</div><div class='del'>-cli_cmd_deprobe_usage ()</div><div class='del'>-{</div><div class='del'>-        cli_out ("Usage: detach &lt;hostname&gt;");</div><div class='del'>-}</div><div class='add'>+out:</div><div class='add'>+    if (ret) {</div><div class='add'>+        cli_cmd_sent_status_get(&amp;sent);</div><div class='add'>+        if ((sent == 0) &amp;&amp; (parse_error == 0))</div><div class='add'>+            cli_out("Peer probe failed");</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-void</div><div class='del'>-cli_cmd_peer_status_usage ()</div><div class='del'>-{</div><div class='del'>-        cli_out ("Usage: peer status");</div><div class='add'>+    CLI_STACK_DESTROY(frame);</div><div class='add'>+</div><div class='add'>+    if (ret == 0) {</div><div class='add'>+        gf_event(EVENT_PEER_ATTACH, "host=%s", (char *)words[2]);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-cli_cmd_peer_probe_cbk (struct cli_state *state, struct cli_cmd_word *word,</div><div class='del'>-                   const char **words, int wordcount)</div><div class='add'>+cli_cmd_peer_deprobe_cbk(struct cli_state *state, struct cli_cmd_word *word,</div><div class='add'>+                         const char **words, int wordcount)</div><div class='ctx'> {</div><div class='del'>-        int                     ret = -1;</div><div class='del'>-        rpc_clnt_procedure_t    *proc = NULL;</div><div class='del'>-        call_frame_t            *frame = NULL;</div><div class='del'>-        dict_t                  *dict = NULL;</div><div class='del'>-</div><div class='del'>-        if (!(wordcount == 3)) {</div><div class='del'>-                cli_cmd_probe_usage ();</div><div class='del'>-                goto out;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    rpc_clnt_procedure_t *proc = NULL;</div><div class='add'>+    call_frame_t *frame = NULL;</div><div class='add'>+    dict_t *dict = NULL;</div><div class='add'>+    int flags = 0;</div><div class='add'>+    int sent = 0;</div><div class='add'>+    int parse_error = 0;</div><div class='add'>+    cli_local_t *local = NULL;</div><div class='add'>+    gf_answer_t answer = GF_ANSWER_NO;</div><div class='add'>+    const char *question = NULL;</div><div class='add'>+</div><div class='add'>+    if ((wordcount &lt; 3) || (wordcount &gt; 4)) {</div><div class='add'>+        cli_usage_out(word-&gt;pattern);</div><div class='add'>+        parse_error = 1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    question =</div><div class='add'>+        "All clients mounted through the peer which is getting detached need "</div><div class='add'>+        "to be remounted using one of the other active peers in the trusted "</div><div class='add'>+        "storage pool to ensure client gets notification on any changes done "</div><div class='add'>+        "on the gluster configuration and if the same has been done do you "</div><div class='add'>+        "want to proceed?";</div><div class='add'>+    proc = &amp;cli_rpc_prog-&gt;proctable[GLUSTER_CLI_DEPROBE];</div><div class='add'>+</div><div class='add'>+    dict = dict_new();</div><div class='add'>+</div><div class='add'>+    ret = dict_set_str(dict, "hostname", (char *)words[2]);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    /*        if (words[3]) {</div><div class='add'>+                    ret = dict_set_str (dict, "port", (char *)words[3]);</div><div class='add'>+                    if (ret)</div><div class='add'>+                            goto out;</div><div class='add'>+            }</div><div class='add'>+    */</div><div class='add'>+    if (wordcount == 4) {</div><div class='add'>+        if (!strcmp("force", words[3]))</div><div class='add'>+            flags |= GF_CLI_FLAG_OP_FORCE;</div><div class='add'>+        else {</div><div class='add'>+            ret = -1;</div><div class='add'>+            cli_usage_out(word-&gt;pattern);</div><div class='add'>+            parse_error = 1;</div><div class='add'>+            goto out;</div><div class='ctx'>         }</div><div class='add'>+    }</div><div class='add'>+    ret = dict_set_int32(dict, "flags", flags);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+    answer = cli_cmd_get_confirmation(state, question);</div><div class='add'>+    if (GF_ANSWER_NO == answer) {</div><div class='add'>+        ret = 0;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    frame = create_frame(THIS, THIS-&gt;ctx-&gt;pool);</div><div class='add'>+    if (!frame) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    CLI_LOCAL_INIT(local, words, frame, dict);</div><div class='add'>+</div><div class='add'>+    if (proc-&gt;fn) {</div><div class='add'>+        ret = proc-&gt;fn(frame, THIS, dict);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        proc = &amp;cli_rpc_prog-&gt;proctable[GF1_CLI_PROBE];</div><div class='del'>-</div><div class='del'>-        frame = create_frame (THIS, THIS-&gt;ctx-&gt;pool);</div><div class='del'>-        if (!frame)</div><div class='del'>-                goto out;</div><div class='add'>+out:</div><div class='add'>+    if (ret) {</div><div class='add'>+        cli_cmd_sent_status_get(&amp;sent);</div><div class='add'>+        if ((sent == 0) &amp;&amp; (parse_error == 0))</div><div class='add'>+            cli_out("Peer detach failed");</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        dict = dict_new ();</div><div class='del'>-        if (!dict)</div><div class='del'>-                goto out;</div><div class='add'>+    CLI_STACK_DESTROY(frame);</div><div class='ctx'> </div><div class='del'>-        ret = dict_set_str (dict, "hostname", (char *)words[2]);</div><div class='del'>-        if (ret)</div><div class='del'>-                goto out;</div><div class='add'>+    if (ret == 0) {</div><div class='add'>+        gf_event(EVENT_PEER_DETACH, "host=%s", (char *)words[2]);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-/*        if (words[3]) {</div><div class='del'>-                ret = dict_set_str (dict, "port", (char *)words[3]);</div><div class='del'>-                if (ret)</div><div class='del'>-                        goto out;</div><div class='del'>-        }</div><div class='del'>-*/</div><div class='del'>-        if (proc-&gt;fn) {</div><div class='del'>-                ret = proc-&gt;fn (frame, THIS, dict);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        if (ret)</div><div class='del'>-                cli_out ("Probe failed");</div><div class='del'>-        return ret;</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-cli_cmd_peer_deprobe_cbk (struct cli_state *state, struct cli_cmd_word *word,</div><div class='del'>-                          const char **words, int wordcount)</div><div class='add'>+cli_cmd_peer_status_cbk(struct cli_state *state, struct cli_cmd_word *word,</div><div class='add'>+                        const char **words, int wordcount)</div><div class='ctx'> {</div><div class='del'>-        int                   ret   = -1;</div><div class='del'>-        rpc_clnt_procedure_t *proc  = NULL;</div><div class='del'>-        call_frame_t         *frame = NULL;</div><div class='del'>-        dict_t               *dict  = NULL;</div><div class='del'>-</div><div class='del'>-        if (!(wordcount == 3) ) {</div><div class='del'>-                cli_cmd_deprobe_usage ();</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='add'>+    int ret = -1;</div><div class='add'>+    rpc_clnt_procedure_t *proc = NULL;</div><div class='add'>+    call_frame_t *frame = NULL;</div><div class='add'>+    int sent = 0;</div><div class='add'>+    int parse_error = 0;</div><div class='ctx'> </div><div class='del'>-        proc = &amp;cli_rpc_prog-&gt;proctable[GF1_CLI_DEPROBE];</div><div class='add'>+    if (wordcount != 2) {</div><div class='add'>+        cli_usage_out(word-&gt;pattern);</div><div class='add'>+        parse_error = 1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        frame = create_frame (THIS, THIS-&gt;ctx-&gt;pool);</div><div class='del'>-        if (!frame)</div><div class='del'>-                goto out;</div><div class='add'>+    proc = &amp;cli_rpc_prog-&gt;proctable[GLUSTER_CLI_LIST_FRIENDS];</div><div class='ctx'> </div><div class='del'>-        dict = dict_new ();</div><div class='add'>+    frame = create_frame(THIS, THIS-&gt;ctx-&gt;pool);</div><div class='add'>+    if (!frame)</div><div class='add'>+        goto out;</div><div class='ctx'> </div><div class='del'>-        ret = dict_set_str (dict, "hostname", (char *)words[2]);</div><div class='del'>-        if (ret)</div><div class='del'>-                goto out;</div><div class='del'>-</div><div class='del'>-/*        if (words[3]) {</div><div class='del'>-                ret = dict_set_str (dict, "port", (char *)words[3]);</div><div class='del'>-                if (ret)</div><div class='del'>-                        goto out;</div><div class='del'>-        }</div><div class='del'>-*/</div><div class='del'>-        if (proc-&gt;fn) {</div><div class='del'>-                ret = proc-&gt;fn (frame, THIS, dict);</div><div class='del'>-        }</div><div class='add'>+    if (proc-&gt;fn) {</div><div class='add'>+        ret = proc-&gt;fn(frame, THIS, (void *)GF_CLI_LIST_PEERS);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='ctx'> out:</div><div class='del'>-        if (ret)</div><div class='del'>-                cli_out ("Detach failed");</div><div class='add'>+    if (ret) {</div><div class='add'>+        cli_cmd_sent_status_get(&amp;sent);</div><div class='add'>+        if ((sent == 0) &amp;&amp; (parse_error == 0))</div><div class='add'>+            cli_out("Peer status failed");</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    CLI_STACK_DESTROY(frame);</div><div class='ctx'> </div><div class='del'>-        return ret;</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-cli_cmd_peer_status_cbk (struct cli_state *state, struct cli_cmd_word *word,</div><div class='del'>-                        const char **words, int wordcount)</div><div class='add'>+cli_cmd_pool_list_cbk(struct cli_state *state, struct cli_cmd_word *word,</div><div class='add'>+                      const char **words, int wordcount)</div><div class='ctx'> {</div><div class='del'>-        int                     ret = -1;</div><div class='del'>-        rpc_clnt_procedure_t    *proc = NULL;</div><div class='del'>-        call_frame_t            *frame = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    rpc_clnt_procedure_t *proc = NULL;</div><div class='add'>+    call_frame_t *frame = NULL;</div><div class='add'>+    int sent = 0;</div><div class='add'>+    int parse_error = 0;</div><div class='ctx'> </div><div class='del'>-        if (wordcount != 2) {</div><div class='del'>-                cli_cmd_peer_status_usage ();</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='add'>+    if (wordcount != 2) {</div><div class='add'>+        cli_usage_out(word-&gt;pattern);</div><div class='add'>+        parse_error = 1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        proc = &amp;cli_rpc_prog-&gt;proctable[GF1_CLI_LIST_FRIENDS];</div><div class='add'>+    proc = &amp;cli_rpc_prog-&gt;proctable[GLUSTER_CLI_LIST_FRIENDS];</div><div class='ctx'> </div><div class='del'>-        frame = create_frame (THIS, THIS-&gt;ctx-&gt;pool);</div><div class='del'>-        if (!frame)</div><div class='del'>-                goto out;</div><div class='add'>+    frame = create_frame(THIS, THIS-&gt;ctx-&gt;pool);</div><div class='add'>+    if (!frame)</div><div class='add'>+        goto out;</div><div class='ctx'> </div><div class='del'>-        if (proc-&gt;fn) {</div><div class='del'>-                ret = proc-&gt;fn (frame, THIS, (char *)words[1] );</div><div class='del'>-        }</div><div class='add'>+    if (proc-&gt;fn) {</div><div class='add'>+        ret = proc-&gt;fn(frame, THIS, (void *)GF_CLI_LIST_POOL_NODES);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='ctx'> out:</div><div class='del'>-        if (ret)</div><div class='del'>-                cli_out ("Command Execution failed");</div><div class='del'>-        return ret;</div><div class='add'>+    if (ret) {</div><div class='add'>+        cli_cmd_sent_status_get(&amp;sent);</div><div class='add'>+        if ((sent == 0) &amp;&amp; (parse_error == 0))</div><div class='add'>+            cli_err("pool list: command execution failed");</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    CLI_STACK_DESTROY(frame);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> struct cli_cmd cli_probe_cmds[] = {</div><div class='del'>-        { "peer probe &lt;HOSTNAME&gt;",</div><div class='del'>-          cli_cmd_peer_probe_cbk,</div><div class='del'>-          "probe peer specified by &lt;HOSTNAME&gt;"},</div><div class='add'>+    {"peer probe { &lt;HOSTNAME&gt; | &lt;IP-address&gt; }", cli_cmd_peer_probe_cbk,</div><div class='add'>+     "probe peer specified by &lt;HOSTNAME&gt;"},</div><div class='add'>+</div><div class='add'>+    {"peer detach { &lt;HOSTNAME&gt; | &lt;IP-address&gt; } [force]",</div><div class='add'>+     cli_cmd_peer_deprobe_cbk, "detach peer specified by &lt;HOSTNAME&gt;"},</div><div class='ctx'> </div><div class='del'>-        { "peer detach &lt;HOSTNAME&gt;",</div><div class='del'>-          cli_cmd_peer_deprobe_cbk,</div><div class='del'>-          "detach peer specified by &lt;HOSTNAME&gt;"},</div><div class='add'>+    {"peer status", cli_cmd_peer_status_cbk, "list status of peers"},</div><div class='ctx'> </div><div class='del'>-        { "peer status",</div><div class='del'>-          cli_cmd_peer_status_cbk,</div><div class='del'>-          "list status of peers"},</div><div class='del'>-	</div><div class='del'>-	{ "peer help", </div><div class='del'>-           cli_cmd_peer_help_cbk, </div><div class='del'>-           "Help command for peer "},</div><div class='add'>+    {"peer help", cli_cmd_peer_help_cbk, "display help for peer commands"},</div><div class='ctx'> </div><div class='add'>+    {"pool list", cli_cmd_pool_list_cbk,</div><div class='add'>+     "list all the nodes in the pool (including localhost)"},</div><div class='ctx'> </div><div class='del'>-        { NULL, NULL, NULL }</div><div class='del'>-};</div><div class='add'>+    {NULL, NULL, NULL}};</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-cli_cmd_peer_help_cbk (struct cli_state *state, struct cli_cmd_word *in_word,</div><div class='add'>+cli_cmd_peer_help_cbk(struct cli_state *state, struct cli_cmd_word *in_word,</div><div class='ctx'>                       const char **words, int wordcount)</div><div class='ctx'> {</div><div class='del'>-        struct cli_cmd        *cmd = NULL;</div><div class='add'>+    struct cli_cmd *cmd = NULL;</div><div class='add'>+    struct cli_cmd *probe_cmd = NULL;</div><div class='add'>+    int count = 0;</div><div class='ctx'> </div><div class='del'>-   </div><div class='add'>+    cli_out("\ngluster peer commands");</div><div class='add'>+    cli_out("======================\n");</div><div class='ctx'> </div><div class='del'>-        for (cmd = cli_probe_cmds; cmd-&gt;pattern; cmd++)</div><div class='del'>-                cli_out ("%s - %s", cmd-&gt;pattern, cmd-&gt;desc);</div><div class='add'>+    cmd = GF_MALLOC(sizeof(cli_probe_cmds), cli_mt_cli_cmd);</div><div class='add'>+    memcpy(cmd, cli_probe_cmds, sizeof(cli_probe_cmds));</div><div class='add'>+    count = (sizeof(cli_probe_cmds) / sizeof(struct cli_cmd));</div><div class='add'>+    cli_cmd_sort(cmd, count);</div><div class='ctx'> </div><div class='del'>-      </div><div class='add'>+    for (probe_cmd = cmd; probe_cmd-&gt;pattern; probe_cmd++)</div><div class='add'>+        cli_out("%s - %s", probe_cmd-&gt;pattern, probe_cmd-&gt;desc);</div><div class='ctx'> </div><div class='del'>-        if (!state-&gt;rl_enabled)</div><div class='del'>-                exit (0);</div><div class='add'>+    GF_FREE(cmd);</div><div class='ctx'> </div><div class='del'>-        return 0;</div><div class='add'>+    cli_out("\n");</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-cli_cmd_probe_register (struct cli_state *state)</div><div class='add'>+cli_cmd_probe_register(struct cli_state *state)</div><div class='ctx'> {</div><div class='del'>-        int  ret = 0;</div><div class='del'>-        struct cli_cmd *cmd = NULL;</div><div class='del'>-</div><div class='del'>-        for (cmd = cli_probe_cmds; cmd-&gt;pattern; cmd++) {</div><div class='del'>-                ret = cli_cmd_register (&amp;state-&gt;tree, cmd-&gt;pattern, cmd-&gt;cbk,</div><div class='del'>-                                        cmd-&gt;desc);</div><div class='del'>-                if (ret)</div><div class='del'>-                        goto out;</div><div class='del'>-        }</div><div class='add'>+    int ret = 0;</div><div class='add'>+    struct cli_cmd *cmd = NULL;</div><div class='add'>+</div><div class='add'>+    for (cmd = cli_probe_cmds; cmd-&gt;pattern; cmd++) {</div><div class='add'>+        ret = cli_cmd_register(&amp;state-&gt;tree, cmd);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+    }</div><div class='ctx'> out:</div><div class='del'>-        return ret;</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='head'>diff --git a/cli/src/cli-cmd-snapshot.c b/cli/src/cli-cmd-snapshot.c<br/>new file mode 100644<br/>index 00000000000..859d6b2e40d<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/cli/src/cli-cmd-snapshot.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>cli/src/cli-cmd-snapshot.c</a></div><div class='hunk'>@@ -0,0 +1,135 @@</div><div class='add'>+/*</div><div class='add'>+   Copyright (c) 2013-2014 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+   This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+   This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+   General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+   later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+   cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+#include &lt;stdio.h&gt;</div><div class='add'>+#include &lt;string.h&gt;</div><div class='add'>+#include &lt;stdlib.h&gt;</div><div class='add'>+#include &lt;stdint.h&gt;</div><div class='add'>+#include &lt;pthread.h&gt;</div><div class='add'>+</div><div class='add'>+#include "cli.h"</div><div class='add'>+#include "cli-cmd.h"</div><div class='add'>+#include "cli-mem-types.h"</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+cli_cmd_snapshot_help_cbk(struct cli_state *state, struct cli_cmd_word *in_word,</div><div class='add'>+                          const char **words, int wordcount);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+cli_cmd_snapshot_cbk(struct cli_state *state, struct cli_cmd_word *word,</div><div class='add'>+                     const char **words, int wordcount)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+    int parse_err = 0;</div><div class='add'>+    dict_t *options = NULL;</div><div class='add'>+    rpc_clnt_procedure_t *proc = NULL;</div><div class='add'>+    call_frame_t *frame = NULL;</div><div class='add'>+    cli_local_t *local = NULL;</div><div class='add'>+</div><div class='add'>+    proc = &amp;cli_rpc_prog-&gt;proctable[GLUSTER_CLI_SNAP];</div><div class='add'>+</div><div class='add'>+    /* Parses the command entered by the user */</div><div class='add'>+    ret = cli_cmd_snapshot_parse(words, wordcount, &amp;options, state);</div><div class='add'>+    if (ret) {</div><div class='add'>+        if (ret &lt; 0) {</div><div class='add'>+            cli_usage_out(word-&gt;pattern);</div><div class='add'>+            parse_err = 1;</div><div class='add'>+        } else {</div><div class='add'>+            /* User might have cancelled the snapshot operation */</div><div class='add'>+            ret = 0;</div><div class='add'>+        }</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    frame = create_frame(THIS, THIS-&gt;ctx-&gt;pool);</div><div class='add'>+    if (frame == NULL) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    CLI_LOCAL_INIT(local, words, frame, options);</div><div class='add'>+</div><div class='add'>+    if (proc-&gt;fn)</div><div class='add'>+        ret = proc-&gt;fn(frame, THIS, options);</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (ret &amp;&amp; parse_err == 0)</div><div class='add'>+        cli_out("Snapshot command failed");</div><div class='add'>+</div><div class='add'>+    CLI_STACK_DESTROY(frame);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+struct cli_cmd snapshot_cmds[] = {</div><div class='add'>+    {"snapshot help", cli_cmd_snapshot_help_cbk,</div><div class='add'>+     "display help for snapshot commands"},</div><div class='add'>+    {"snapshot create &lt;snapname&gt; &lt;volname&gt; [no-timestamp] "</div><div class='add'>+     "[description &lt;description&gt;] [force]",</div><div class='add'>+     cli_cmd_snapshot_cbk, "Snapshot Create."},</div><div class='add'>+    {"snapshot clone &lt;clonename&gt; &lt;snapname&gt;", cli_cmd_snapshot_cbk,</div><div class='add'>+     "Snapshot Clone."},</div><div class='add'>+    {"snapshot restore &lt;snapname&gt;", cli_cmd_snapshot_cbk, "Snapshot Restore."},</div><div class='add'>+    {"snapshot status [(snapname | volume &lt;volname&gt;)]", cli_cmd_snapshot_cbk,</div><div class='add'>+     "Snapshot Status."},</div><div class='add'>+    {"snapshot info [(snapname | volume &lt;volname&gt;)]", cli_cmd_snapshot_cbk,</div><div class='add'>+     "Snapshot Info."},</div><div class='add'>+    {"snapshot list [volname]", cli_cmd_snapshot_cbk, "Snapshot List."},</div><div class='add'>+    {"snapshot config [volname] ([snap-max-hard-limit &lt;count&gt;] "</div><div class='add'>+     "[snap-max-soft-limit &lt;percent&gt;]) "</div><div class='add'>+     "| ([auto-delete &lt;enable|disable&gt;])"</div><div class='add'>+     "| ([activate-on-create &lt;enable|disable&gt;])",</div><div class='add'>+     cli_cmd_snapshot_cbk, "Snapshot Config."},</div><div class='add'>+    {"snapshot delete (all | snapname | volume &lt;volname&gt;)",</div><div class='add'>+     cli_cmd_snapshot_cbk, "Snapshot Delete."},</div><div class='add'>+    {"snapshot activate &lt;snapname&gt; [force]", cli_cmd_snapshot_cbk,</div><div class='add'>+     "Activate snapshot volume."},</div><div class='add'>+    {"snapshot deactivate &lt;snapname&gt;", cli_cmd_snapshot_cbk,</div><div class='add'>+     "Deactivate snapshot volume."},</div><div class='add'>+    {NULL, NULL, NULL}};</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+cli_cmd_snapshot_help_cbk(struct cli_state *state, struct cli_cmd_word *in_word,</div><div class='add'>+                          const char **words, int wordcount)</div><div class='add'>+{</div><div class='add'>+    struct cli_cmd *cmd = NULL;</div><div class='add'>+    struct cli_cmd *snap_cmd = NULL;</div><div class='add'>+    int count = 0;</div><div class='add'>+</div><div class='add'>+    cmd = GF_MALLOC(sizeof(snapshot_cmds), cli_mt_cli_cmd);</div><div class='add'>+    memcpy(cmd, snapshot_cmds, sizeof(snapshot_cmds));</div><div class='add'>+    count = (sizeof(snapshot_cmds) / sizeof(struct cli_cmd));</div><div class='add'>+    cli_cmd_sort(cmd, count);</div><div class='add'>+</div><div class='add'>+    cli_out("\ngluster snapshot commands");</div><div class='add'>+    cli_out("=========================\n");</div><div class='add'>+</div><div class='add'>+    for (snap_cmd = cmd; snap_cmd-&gt;pattern; snap_cmd++)</div><div class='add'>+        if (_gf_false == snap_cmd-&gt;disable)</div><div class='add'>+            cli_out("%s - %s", snap_cmd-&gt;pattern, snap_cmd-&gt;desc);</div><div class='add'>+    cli_out("\n");</div><div class='add'>+</div><div class='add'>+    GF_FREE(cmd);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+cli_cmd_snapshot_register(struct cli_state *state)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+    struct cli_cmd *cmd = NULL;</div><div class='add'>+</div><div class='add'>+    for (cmd = snapshot_cmds; cmd-&gt;pattern; cmd++) {</div><div class='add'>+        ret = cli_cmd_register(&amp;state-&gt;tree, cmd);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+    }</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='head'>diff --git a/cli/src/cli-cmd-system.c b/cli/src/cli-cmd-system.c<br/>new file mode 100644<br/>index 00000000000..801e8f4efed<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/cli/src/cli-cmd-system.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>cli/src/cli-cmd-system.c</a></div><div class='hunk'>@@ -0,0 +1,624 @@</div><div class='add'>+/*</div><div class='add'>+   Copyright (c) 2010-2012 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+   This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+   This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+   General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+   later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+   cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+#include &lt;stdio.h&gt;</div><div class='add'>+#include &lt;string.h&gt;</div><div class='add'>+#include &lt;stdlib.h&gt;</div><div class='add'>+#include &lt;stdint.h&gt;</div><div class='add'>+#include &lt;pthread.h&gt;</div><div class='add'>+</div><div class='add'>+#include "cli.h"</div><div class='add'>+#include "cli-cmd.h"</div><div class='add'>+#include "cli-mem-types.h"</div><div class='add'>+#include "protocol-common.h"</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+cli_cmd_system_help_cbk(struct cli_state *state, struct cli_cmd_word *in_word,</div><div class='add'>+                        const char **words, int wordcount);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+cli_cmd_copy_file_cbk(struct cli_state *state, struct cli_cmd_word *word,</div><div class='add'>+                      const char **words, int wordcount);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+cli_cmd_sys_exec_cbk(struct cli_state *state, struct cli_cmd_word *word,</div><div class='add'>+                     const char **words, int wordcount);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+cli_cmd_getspec_cbk(struct cli_state *state, struct cli_cmd_word *word,</div><div class='add'>+                    const char **words, int wordcount)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    rpc_clnt_procedure_t *proc = NULL;</div><div class='add'>+    call_frame_t *frame = NULL;</div><div class='add'>+    dict_t *dict = NULL;</div><div class='add'>+</div><div class='add'>+    if (wordcount != 3) {</div><div class='add'>+        cli_usage_out(word-&gt;pattern);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    dict = dict_new();</div><div class='add'>+    if (!dict)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    ret = dict_set_str(dict, "volid", (char *)words[2]);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    proc = &amp;cli_rpc_prog-&gt;proctable[GLUSTER_CLI_GETSPEC];</div><div class='add'>+    if (proc-&gt;fn) {</div><div class='add'>+        frame = create_frame(THIS, THIS-&gt;ctx-&gt;pool);</div><div class='add'>+        if (!frame) {</div><div class='add'>+            ret = -1;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+        ret = proc-&gt;fn(frame, THIS, dict);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (!proc &amp;&amp; ret) {</div><div class='add'>+        if (wordcount &gt; 1)</div><div class='add'>+            cli_out("Fetching spec for volume %s failed", (char *)words[2]);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (dict)</div><div class='add'>+        dict_unref(dict);</div><div class='add'>+</div><div class='add'>+    CLI_STACK_DESTROY(frame);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+cli_cmd_pmap_b2p_cbk(struct cli_state *state, struct cli_cmd_word *word,</div><div class='add'>+                     const char **words, int wordcount)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    rpc_clnt_procedure_t *proc = NULL;</div><div class='add'>+    call_frame_t *frame = NULL;</div><div class='add'>+    dict_t *dict = NULL;</div><div class='add'>+</div><div class='add'>+    if (wordcount != 4) {</div><div class='add'>+        cli_usage_out(word-&gt;pattern);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    dict = dict_new();</div><div class='add'>+    if (!dict)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    ret = dict_set_str(dict, "brick", (char *)words[3]);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    proc = &amp;cli_rpc_prog-&gt;proctable[GLUSTER_CLI_PMAP_PORTBYBRICK];</div><div class='add'>+    if (proc-&gt;fn) {</div><div class='add'>+        frame = create_frame(THIS, THIS-&gt;ctx-&gt;pool);</div><div class='add'>+        if (!frame) {</div><div class='add'>+            ret = -1;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+        ret = proc-&gt;fn(frame, THIS, dict);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (!proc &amp;&amp; ret) {</div><div class='add'>+        if (wordcount &gt; 1)</div><div class='add'>+            cli_out("Fetching spec for volume %s failed", (char *)words[3]);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (dict)</div><div class='add'>+        dict_unref(dict);</div><div class='add'>+</div><div class='add'>+    CLI_STACK_DESTROY(frame);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+cli_cmd_fsm_log_cbk(struct cli_state *state, struct cli_cmd_word *word,</div><div class='add'>+                    const char **words, int wordcount)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    rpc_clnt_procedure_t *proc = NULL;</div><div class='add'>+    call_frame_t *frame = NULL;</div><div class='add'>+    char *name = "";</div><div class='add'>+</div><div class='add'>+    if ((wordcount != 4) &amp;&amp; (wordcount != 3)) {</div><div class='add'>+        cli_usage_out(word-&gt;pattern);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (wordcount == 4)</div><div class='add'>+        name = (char *)words[3];</div><div class='add'>+    proc = &amp;cli_rpc_prog-&gt;proctable[GLUSTER_CLI_FSM_LOG];</div><div class='add'>+    if (proc &amp;&amp; proc-&gt;fn) {</div><div class='add'>+        frame = create_frame(THIS, THIS-&gt;ctx-&gt;pool);</div><div class='add'>+        if (!frame)</div><div class='add'>+            goto out;</div><div class='add'>+        ret = proc-&gt;fn(frame, THIS, (void *)name);</div><div class='add'>+    }</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+cli_cmd_getwd_cbk(struct cli_state *state, struct cli_cmd_word *word,</div><div class='add'>+                  const char **words, int wordcount)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    rpc_clnt_procedure_t *proc = NULL;</div><div class='add'>+    call_frame_t *frame = NULL;</div><div class='add'>+</div><div class='add'>+    if (wordcount != 2) {</div><div class='add'>+        cli_usage_out(word-&gt;pattern);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    proc = &amp;cli_rpc_prog-&gt;proctable[GLUSTER_CLI_GETWD];</div><div class='add'>+    if (proc &amp;&amp; proc-&gt;fn) {</div><div class='add'>+        frame = create_frame(THIS, THIS-&gt;ctx-&gt;pool);</div><div class='add'>+        if (!frame)</div><div class='add'>+            goto out;</div><div class='add'>+        ret = proc-&gt;fn(frame, THIS, NULL);</div><div class='add'>+    }</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static dict_t *</div><div class='add'>+make_seq_dict(int argc, char **argv)</div><div class='add'>+{</div><div class='add'>+    char index[] = "4294967296";  // 1&lt;&lt;32</div><div class='add'>+    int i = 0;</div><div class='add'>+    int len;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    dict_t *dict = dict_new();</div><div class='add'>+</div><div class='add'>+    if (!dict)</div><div class='add'>+        return NULL;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; argc; i++) {</div><div class='add'>+        len = snprintf(index, sizeof(index), "%d", i);</div><div class='add'>+        ret = dict_set_strn(dict, index, len, argv[i]);</div><div class='add'>+        if (ret == -1)</div><div class='add'>+            break;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (ret) {</div><div class='add'>+        dict_unref(dict);</div><div class='add'>+        dict = NULL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return dict;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+cli_cmd_mount_cbk(struct cli_state *state, struct cli_cmd_word *word,</div><div class='add'>+                  const char **words, int wordcount)</div><div class='add'>+{</div><div class='add'>+    rpc_clnt_procedure_t *proc = NULL;</div><div class='add'>+    call_frame_t *frame = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    dict_t *dict = NULL;</div><div class='add'>+    void *dataa[] = {NULL, NULL};</div><div class='add'>+</div><div class='add'>+    if (wordcount &lt; 4) {</div><div class='add'>+        cli_usage_out(word-&gt;pattern);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    dict = make_seq_dict(wordcount - 3, (char **)words + 3);</div><div class='add'>+    if (!dict)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    dataa[0] = (void *)words[2];</div><div class='add'>+    dataa[1] = dict;</div><div class='add'>+</div><div class='add'>+    proc = &amp;cli_rpc_prog-&gt;proctable[GLUSTER_CLI_MOUNT];</div><div class='add'>+    if (proc &amp;&amp; proc-&gt;fn) {</div><div class='add'>+        frame = create_frame(THIS, THIS-&gt;ctx-&gt;pool);</div><div class='add'>+        if (!frame)</div><div class='add'>+            goto out;</div><div class='add'>+        ret = proc-&gt;fn(frame, THIS, dataa);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (dict)</div><div class='add'>+        dict_unref(dict);</div><div class='add'>+</div><div class='add'>+    if (!proc &amp;&amp; ret)</div><div class='add'>+        cli_out("Mount command failed");</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+cli_cmd_umount_cbk(struct cli_state *state, struct cli_cmd_word *word,</div><div class='add'>+                   const char **words, int wordcount)</div><div class='add'>+{</div><div class='add'>+    rpc_clnt_procedure_t *proc = NULL;</div><div class='add'>+    call_frame_t *frame = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    dict_t *dict = NULL;</div><div class='add'>+</div><div class='add'>+    if (!(wordcount == 3 ||</div><div class='add'>+          (wordcount == 4 &amp;&amp; strcmp(words[3], "lazy") == 0))) {</div><div class='add'>+        cli_usage_out(word-&gt;pattern);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    dict = dict_new();</div><div class='add'>+    if (!dict)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    ret = dict_set_str(dict, "path", (char *)words[2]);</div><div class='add'>+    if (ret != 0)</div><div class='add'>+        goto out;</div><div class='add'>+    ret = dict_set_int32(dict, "lazy", wordcount == 4);</div><div class='add'>+    if (ret != 0)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    proc = &amp;cli_rpc_prog-&gt;proctable[GLUSTER_CLI_UMOUNT];</div><div class='add'>+    if (proc &amp;&amp; proc-&gt;fn) {</div><div class='add'>+        frame = create_frame(THIS, THIS-&gt;ctx-&gt;pool);</div><div class='add'>+        if (!frame) {</div><div class='add'>+            gf_log(THIS-&gt;name, GF_LOG_ERROR, "failed to create frame");</div><div class='add'>+            ret = -1;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+        ret = proc-&gt;fn(frame, THIS, dict);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (dict)</div><div class='add'>+        dict_unref(dict);</div><div class='add'>+</div><div class='add'>+    if (!proc &amp;&amp; ret)</div><div class='add'>+        cli_out("Umount command failed");</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+cli_cmd_uuid_get_cbk(struct cli_state *state, struct cli_cmd_word *word,</div><div class='add'>+                     const char **words, int wordcount)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int sent = 0;</div><div class='add'>+    int parse_error = 0;</div><div class='add'>+    dict_t *dict = NULL;</div><div class='add'>+    rpc_clnt_procedure_t *proc = NULL;</div><div class='add'>+    call_frame_t *frame = NULL;</div><div class='add'>+    cli_local_t *local = NULL;</div><div class='add'>+    xlator_t *this = NULL;</div><div class='add'>+</div><div class='add'>+    this = THIS;</div><div class='add'>+    if (wordcount != 3) {</div><div class='add'>+        cli_usage_out(word-&gt;pattern);</div><div class='add'>+        parse_error = 1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    proc = &amp;cli_rpc_prog-&gt;proctable[GLUSTER_CLI_UUID_GET];</div><div class='add'>+    frame = create_frame(this, this-&gt;ctx-&gt;pool);</div><div class='add'>+    if (!frame)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    dict = dict_new();</div><div class='add'>+    if (!dict)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    CLI_LOCAL_INIT(local, words, frame, dict);</div><div class='add'>+    if (proc-&gt;fn)</div><div class='add'>+        ret = proc-&gt;fn(frame, this, dict);</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (ret) {</div><div class='add'>+        cli_cmd_sent_status_get(&amp;sent);</div><div class='add'>+        if ((sent == 0) &amp;&amp; (parse_error == 0))</div><div class='add'>+            cli_out("uuid get failed");</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (dict)</div><div class='add'>+        dict_unref(dict);</div><div class='add'>+</div><div class='add'>+    CLI_STACK_DESTROY(frame);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+cli_cmd_uuid_reset_cbk(struct cli_state *state, struct cli_cmd_word *word,</div><div class='add'>+                       const char **words, int wordcount)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    rpc_clnt_procedure_t *proc = NULL;</div><div class='add'>+    call_frame_t *frame = NULL;</div><div class='add'>+    int sent = 0;</div><div class='add'>+    int parse_error = 0;</div><div class='add'>+    gf_answer_t answer = GF_ANSWER_NO;</div><div class='add'>+    char *question = NULL;</div><div class='add'>+    cli_local_t *local = NULL;</div><div class='add'>+    dict_t *dict = NULL;</div><div class='add'>+    xlator_t *this = NULL;</div><div class='add'>+</div><div class='add'>+    question =</div><div class='add'>+        "Resetting uuid changes the uuid of local glusterd. "</div><div class='add'>+        "Do you want to continue?";</div><div class='add'>+</div><div class='add'>+    if (wordcount != 3) {</div><div class='add'>+        cli_usage_out(word-&gt;pattern);</div><div class='add'>+        parse_error = 1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    proc = &amp;cli_rpc_prog-&gt;proctable[GLUSTER_CLI_UUID_RESET];</div><div class='add'>+</div><div class='add'>+    this = THIS;</div><div class='add'>+    frame = create_frame(this, this-&gt;ctx-&gt;pool);</div><div class='add'>+    if (!frame)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    dict = dict_new();</div><div class='add'>+    if (!dict) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    CLI_LOCAL_INIT(local, words, frame, dict);</div><div class='add'>+    answer = cli_cmd_get_confirmation(state, question);</div><div class='add'>+</div><div class='add'>+    if (GF_ANSWER_NO == answer) {</div><div class='add'>+        ret = 0;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    // send NULL as argument since no dictionary is sent to glusterd</div><div class='add'>+    if (proc-&gt;fn) {</div><div class='add'>+        ret = proc-&gt;fn(frame, this, dict);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (ret) {</div><div class='add'>+        cli_cmd_sent_status_get(&amp;sent);</div><div class='add'>+        if ((sent == 0) &amp;&amp; (parse_error == 0))</div><div class='add'>+            cli_out("uuid reset failed");</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (dict)</div><div class='add'>+        dict_unref(dict);</div><div class='add'>+</div><div class='add'>+    CLI_STACK_DESTROY(frame);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static struct cli_cmd cli_system_cmds[] = {</div><div class='add'>+    {"system:: getspec &lt;VOLNAME&gt;", cli_cmd_getspec_cbk,</div><div class='add'>+     "fetch the volume file for the volume &lt;VOLNAME&gt;"},</div><div class='add'>+</div><div class='add'>+    {"system:: portmap brick2port &lt;BRICK&gt;", cli_cmd_pmap_b2p_cbk,</div><div class='add'>+     "query which port &lt;BRICK&gt; listens on"},</div><div class='add'>+</div><div class='add'>+    {"system:: fsm log [&lt;peer-name&gt;]", cli_cmd_fsm_log_cbk,</div><div class='add'>+     "display fsm transitions"},</div><div class='add'>+</div><div class='add'>+    {"system:: getwd", cli_cmd_getwd_cbk, "query glusterd work directory"},</div><div class='add'>+</div><div class='add'>+    {"system:: mount &lt;label&gt; &lt;args...&gt;", cli_cmd_mount_cbk, "request a mount"},</div><div class='add'>+</div><div class='add'>+    {"system:: umount &lt;path&gt; [lazy]", cli_cmd_umount_cbk, "request an umount"},</div><div class='add'>+</div><div class='add'>+    {"system:: uuid get", cli_cmd_uuid_get_cbk, "get uuid of glusterd"},</div><div class='add'>+</div><div class='add'>+    {"system:: uuid reset", cli_cmd_uuid_reset_cbk,</div><div class='add'>+     "reset the uuid of glusterd"},</div><div class='add'>+</div><div class='add'>+    {"system:: help", cli_cmd_system_help_cbk,</div><div class='add'>+     "display help for system commands"},</div><div class='add'>+</div><div class='add'>+    {"system:: copy file [&lt;filename&gt;]", cli_cmd_copy_file_cbk,</div><div class='add'>+     "Copy file from current node's $working_dir to "</div><div class='add'>+     "$working_dir of all cluster nodes"},</div><div class='add'>+</div><div class='add'>+    {"system:: execute &lt;command&gt; &lt;args&gt;", cli_cmd_sys_exec_cbk,</div><div class='add'>+     "Execute the command on all the nodes "</div><div class='add'>+     "in the cluster and display their output."},</div><div class='add'>+</div><div class='add'>+    {NULL, NULL, NULL}};</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+cli_cmd_sys_exec_cbk(struct cli_state *state, struct cli_cmd_word *word,</div><div class='add'>+                     const char **words, int wordcount)</div><div class='add'>+{</div><div class='add'>+    char cmd_arg_name[PATH_MAX] = "";</div><div class='add'>+    char *command = NULL;</div><div class='add'>+    char *saveptr = NULL;</div><div class='add'>+    char *tmp = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int i = -1;</div><div class='add'>+    int len;</div><div class='add'>+    int cmd_args_count = 0;</div><div class='add'>+    int in_cmd_args_count = 0;</div><div class='add'>+    rpc_clnt_procedure_t *proc = NULL;</div><div class='add'>+    call_frame_t *frame = NULL;</div><div class='add'>+    dict_t *dict = NULL;</div><div class='add'>+    cli_local_t *local = NULL;</div><div class='add'>+</div><div class='add'>+    if ((wordcount &lt; 3) || (words[2] == NULL)) {</div><div class='add'>+        cli_usage_out(word-&gt;pattern);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    command = strtok_r((char *)words[2], " ", &amp;saveptr);</div><div class='add'>+    if (command == NULL) {</div><div class='add'>+        gf_log("cli", GF_LOG_ERROR, "Failed to parse command");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    dict = dict_new();</div><div class='add'>+    if (!dict)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    do {</div><div class='add'>+        tmp = strtok_r(NULL, " ", &amp;saveptr);</div><div class='add'>+        if (tmp) {</div><div class='add'>+            in_cmd_args_count++;</div><div class='add'>+            snprintf(cmd_arg_name, sizeof(cmd_arg_name), "cmd_arg_%d",</div><div class='add'>+                     in_cmd_args_count);</div><div class='add'>+            ret = dict_set_str(dict, cmd_arg_name, tmp);</div><div class='add'>+            if (ret) {</div><div class='add'>+                gf_log("", GF_LOG_ERROR,</div><div class='add'>+                       "Unable to set "</div><div class='add'>+                       "%s in dict",</div><div class='add'>+                       cmd_arg_name);</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+    } while (tmp);</div><div class='add'>+</div><div class='add'>+    cmd_args_count = wordcount - 3;</div><div class='add'>+</div><div class='add'>+    ret = dict_set_str(dict, "command", command);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log("", GF_LOG_ERROR, "Unable to set command in dict");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    for (i = 1; i &lt;= cmd_args_count; i++) {</div><div class='add'>+        in_cmd_args_count++;</div><div class='add'>+        len = snprintf(cmd_arg_name, sizeof(cmd_arg_name), "cmd_arg_%d",</div><div class='add'>+                       in_cmd_args_count);</div><div class='add'>+        ret = dict_set_strn(dict, cmd_arg_name, len, (char *)words[2 + i]);</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_log("", GF_LOG_ERROR, "Unable to set %s in dict", cmd_arg_name);</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_set_int32(dict, "cmd_args_count", in_cmd_args_count);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log("", GF_LOG_ERROR, "Unable to set cmd_args_count in dict");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_set_str(dict, "volname", "N/A");</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log("", GF_LOG_ERROR, "Unable to set volname in dict");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    proc = &amp;cli_rpc_prog-&gt;proctable[GLUSTER_CLI_SYS_EXEC];</div><div class='add'>+    if (proc-&gt;fn) {</div><div class='add'>+        frame = create_frame(THIS, THIS-&gt;ctx-&gt;pool);</div><div class='add'>+        if (!frame) {</div><div class='add'>+            gf_log(THIS-&gt;name, GF_LOG_ERROR, "failed to create frame");</div><div class='add'>+            ret = -1;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+        CLI_LOCAL_INIT(local, words, frame, dict);</div><div class='add'>+        ret = proc-&gt;fn(frame, THIS, (void *)dict);</div><div class='add'>+</div><div class='add'>+        /* proc-&gt;fn is processed synchronously, which means that the</div><div class='add'>+         * execution flow won't return here until the operation is</div><div class='add'>+         * fully processed, including any related callback. For this</div><div class='add'>+         * reason, it's safe to destroy the stack here, since no one</div><div class='add'>+         * can still be using it. Additionally, it's not easy to move</div><div class='add'>+         * the stack destroy to the callback executed after completion</div><div class='add'>+         * of the operation because there are multiple things than can</div><div class='add'>+         * fail even before having queued the callback, so we would</div><div class='add'>+         * still need to destroy the stack if proc-&gt;fn returns an</div><div class='add'>+         * error. */</div><div class='add'>+        CLI_STACK_DESTROY(frame);</div><div class='add'>+        dict = NULL;</div><div class='add'>+    }</div><div class='add'>+out:</div><div class='add'>+    if (dict != NULL) {</div><div class='add'>+        dict_unref(dict);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+cli_cmd_copy_file_cbk(struct cli_state *state, struct cli_cmd_word *word,</div><div class='add'>+                      const char **words, int wordcount)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    rpc_clnt_procedure_t *proc = NULL;</div><div class='add'>+    call_frame_t *frame = NULL;</div><div class='add'>+    char *filename = "";</div><div class='add'>+    dict_t *dict = NULL;</div><div class='add'>+    cli_local_t *local = NULL;</div><div class='add'>+</div><div class='add'>+    if (wordcount != 4) {</div><div class='add'>+        cli_usage_out(word-&gt;pattern);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    dict = dict_new();</div><div class='add'>+    if (!dict)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    filename = (char *)words[3];</div><div class='add'>+    ret = dict_set_str(dict, "source", filename);</div><div class='add'>+    if (ret)</div><div class='add'>+        gf_log("", GF_LOG_ERROR, "Unable to set filename in dict");</div><div class='add'>+</div><div class='add'>+    ret = dict_set_str(dict, "volname", "N/A");</div><div class='add'>+    if (ret)</div><div class='add'>+        gf_log("", GF_LOG_ERROR, "Unable to set volname in dict");</div><div class='add'>+</div><div class='add'>+    proc = &amp;cli_rpc_prog-&gt;proctable[GLUSTER_CLI_COPY_FILE];</div><div class='add'>+    if (proc &amp;&amp; proc-&gt;fn) {</div><div class='add'>+        frame = create_frame(THIS, THIS-&gt;ctx-&gt;pool);</div><div class='add'>+        if (!frame) {</div><div class='add'>+            gf_log(THIS-&gt;name, GF_LOG_ERROR, "failed to create frame");</div><div class='add'>+            ret = -1;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+        CLI_LOCAL_INIT(local, words, frame, dict);</div><div class='add'>+        ret = proc-&gt;fn(frame, THIS, (void *)dict);</div><div class='add'>+    }</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+cli_cmd_system_help_cbk(struct cli_state *state, struct cli_cmd_word *in_word,</div><div class='add'>+                        const char **words, int wordcount)</div><div class='add'>+{</div><div class='add'>+    struct cli_cmd *cmd = NULL;</div><div class='add'>+    struct cli_cmd *system_cmd = NULL;</div><div class='add'>+    int count = 0;</div><div class='add'>+</div><div class='add'>+    cmd = GF_MALLOC(sizeof(cli_system_cmds), cli_mt_cli_cmd);</div><div class='add'>+    memcpy(cmd, cli_system_cmds, sizeof(cli_system_cmds));</div><div class='add'>+    count = (sizeof(cli_system_cmds) / sizeof(struct cli_cmd));</div><div class='add'>+    cli_cmd_sort(cmd, count);</div><div class='add'>+</div><div class='add'>+    for (system_cmd = cmd; system_cmd-&gt;pattern; system_cmd++)</div><div class='add'>+        cli_out("%s - %s", system_cmd-&gt;pattern, system_cmd-&gt;desc);</div><div class='add'>+</div><div class='add'>+    GF_FREE(cmd);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+cli_cmd_system_register(struct cli_state *state)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+    struct cli_cmd *cmd = NULL;</div><div class='add'>+</div><div class='add'>+    for (cmd = cli_system_cmds; cmd-&gt;pattern; cmd++) {</div><div class='add'>+        ret = cli_cmd_register(&amp;state-&gt;tree, cmd);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+    }</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='head'>diff --git a/cli/src/cli-cmd-volume.c b/cli/src/cli-cmd-volume.c<br/>index 539c7eeac11..f238851586e 100644<br/>--- a/<a href='/cgit/glusterfs.git/tree/cli/src/cli-cmd-volume.c?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>cli/src/cli-cmd-volume.c</a><br/>+++ b/<a href='/cgit/glusterfs.git/tree/cli/src/cli-cmd-volume.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>cli/src/cli-cmd-volume.c</a></div><div class='hunk'>@@ -1,830 +1,3278 @@</div><div class='ctx'> /*</div><div class='del'>-  Copyright (c) 2010 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='del'>-  This file is part of GlusterFS.</div><div class='del'>-</div><div class='del'>-  GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-  it under the terms of the GNU Affero General Public License as published</div><div class='del'>-  by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-  or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-  GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-  WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-  Affero General Public License for more details.</div><div class='del'>-</div><div class='del'>-  You should have received a copy of the GNU Affero General Public License</div><div class='del'>-  along with this program.  If not, see</div><div class='del'>-  &lt;http://www.gnu.org/licenses/&gt;.</div><div class='del'>-*/</div><div class='add'>+   Copyright (c) 2010-2012 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+   This file is part of GlusterFS.</div><div class='ctx'> </div><div class='add'>+   This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+   General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+   later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+   cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='ctx'> #include &lt;stdio.h&gt;</div><div class='ctx'> #include &lt;string.h&gt;</div><div class='ctx'> #include &lt;stdlib.h&gt;</div><div class='ctx'> #include &lt;stdint.h&gt;</div><div class='ctx'> #include &lt;pthread.h&gt;</div><div class='ctx'> </div><div class='del'>-#ifndef _CONFIG_H</div><div class='del'>-#define _CONFIG_H</div><div class='del'>-#include "config.h"</div><div class='del'>-#endif</div><div class='add'>+#include &lt;sys/socket.h&gt;</div><div class='add'>+#include &lt;netdb.h&gt;</div><div class='add'>+#include &lt;sys/types.h&gt;</div><div class='add'>+#include &lt;sys/wait.h&gt;</div><div class='add'>+#include &lt;netinet/in.h&gt;</div><div class='ctx'> </div><div class='ctx'> #include "cli.h"</div><div class='ctx'> #include "cli-cmd.h"</div><div class='ctx'> #include "cli-mem-types.h"</div><div class='ctx'> #include "cli1-xdr.h"</div><div class='add'>+#include &lt;glusterfs/run.h&gt;</div><div class='add'>+#include &lt;glusterfs/syscall.h&gt;</div><div class='add'>+#include &lt;glusterfs/common-utils.h&gt;</div><div class='add'>+#include &lt;glusterfs/events.h&gt;</div><div class='ctx'> </div><div class='del'>-extern struct rpc_clnt *global_rpc;</div><div class='add'>+extern rpc_clnt_prog_t cli_quotad_clnt;</div><div class='ctx'> </div><div class='del'>-extern rpc_clnt_prog_t *cli_rpc_prog;</div><div class='add'>+static int</div><div class='add'>+gf_asprintf_append(char **string_ptr, const char *format, ...);</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-cli_cmd_volume_help_cbk (struct cli_state *state, struct cli_cmd_word *in_word,</div><div class='del'>-                      const char **words, int wordcount);</div><div class='add'>+cli_cmd_volume_help_cbk(struct cli_state *state, struct cli_cmd_word *in_word,</div><div class='add'>+                        const char **words, int wordcount);</div><div class='ctx'> </div><div class='del'>-void</div><div class='del'>-cli_cmd_volume_start_usage ()</div><div class='del'>-{</div><div class='del'>-        cli_out ("Usage: volume start &lt;VOLNAME&gt;");</div><div class='del'>-}</div><div class='add'>+int</div><div class='add'>+cli_cmd_bitrot_help_cbk(struct cli_state *state, struct cli_cmd_word *in_word,</div><div class='add'>+                        const char **words, int wordcount);</div><div class='ctx'> </div><div class='del'>-void</div><div class='del'>-cli_cmd_volume_stop_usage ()</div><div class='del'>-{</div><div class='del'>-        cli_out ("Usage: volume stop &lt;VOLNAME&gt; [force]");</div><div class='del'>-}</div><div class='add'>+int</div><div class='add'>+cli_cmd_quota_help_cbk(struct cli_state *state, struct cli_cmd_word *in_word,</div><div class='add'>+                       const char **words, int wordcount);</div><div class='ctx'> </div><div class='del'>-void</div><div class='del'>-cli_cmd_volume_rename_usage ()</div><div class='add'>+int</div><div class='add'>+cli_cmd_volume_info_cbk(struct cli_state *state, struct cli_cmd_word *word,</div><div class='add'>+                        const char **words, int wordcount)</div><div class='ctx'> {</div><div class='del'>-        cli_out ("Usage: volume rename &lt;VOLNAME&gt; &lt;NEW-VOLNAME&gt;");</div><div class='add'>+    int ret = -1;</div><div class='add'>+    rpc_clnt_procedure_t *proc = NULL;</div><div class='add'>+    call_frame_t *frame = NULL;</div><div class='add'>+    cli_cmd_volume_get_ctx_t ctx = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    cli_local_t *local = NULL;</div><div class='add'>+    int sent = 0;</div><div class='add'>+    int parse_error = 0;</div><div class='add'>+</div><div class='add'>+    proc = &amp;cli_rpc_prog-&gt;proctable[GLUSTER_CLI_GET_VOLUME];</div><div class='add'>+</div><div class='add'>+    if ((wordcount == 2) || (wordcount == 3 &amp;&amp; !strcmp(words[2], "all"))) {</div><div class='add'>+        ctx.flags = GF_CLI_GET_NEXT_VOLUME;</div><div class='add'>+        proc = &amp;cli_rpc_prog-&gt;proctable[GLUSTER_CLI_GET_NEXT_VOLUME];</div><div class='add'>+    } else if (wordcount == 3) {</div><div class='add'>+        ctx.flags = GF_CLI_GET_VOLUME;</div><div class='add'>+        ctx.volname = (char *)words[2];</div><div class='add'>+        if (strlen(ctx.volname) &gt; GD_VOLUME_NAME_MAX) {</div><div class='add'>+            cli_out("Invalid volume name");</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+        proc = &amp;cli_rpc_prog-&gt;proctable[GLUSTER_CLI_GET_VOLUME];</div><div class='add'>+    } else {</div><div class='add'>+        cli_usage_out(word-&gt;pattern);</div><div class='add'>+        parse_error = 1;</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    local = cli_local_get();</div><div class='add'>+</div><div class='add'>+    if (!local)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    frame = create_frame(THIS, THIS-&gt;ctx-&gt;pool);</div><div class='add'>+    if (!frame)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    local-&gt;get_vol.flags = ctx.flags;</div><div class='add'>+    if (ctx.volname)</div><div class='add'>+        local-&gt;get_vol.volname = gf_strdup(ctx.volname);</div><div class='add'>+</div><div class='add'>+    frame-&gt;local = local;</div><div class='add'>+</div><div class='add'>+    if (proc-&gt;fn) {</div><div class='add'>+        ret = proc-&gt;fn(frame, THIS, &amp;ctx);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (ret) {</div><div class='add'>+        cli_cmd_sent_status_get(&amp;sent);</div><div class='add'>+        if ((sent == 0) &amp;&amp; (parse_error == 0))</div><div class='add'>+            cli_out("Getting Volume information failed!");</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    CLI_STACK_DESTROY(frame);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-void</div><div class='del'>-cli_cmd_volume_delete_usage ()</div><div class='add'>+int</div><div class='add'>+cli_cmd_sync_volume_cbk(struct cli_state *state, struct cli_cmd_word *word,</div><div class='add'>+                        const char **words, int wordcount)</div><div class='ctx'> {</div><div class='del'>-        cli_out ("Usage: volume delete &lt;VOLNAME&gt;");</div><div class='add'>+    int ret = -1;</div><div class='add'>+    rpc_clnt_procedure_t *proc = NULL;</div><div class='add'>+    call_frame_t *frame = NULL;</div><div class='add'>+    int sent = 0;</div><div class='add'>+    int parse_error = 0;</div><div class='add'>+    dict_t *dict = NULL;</div><div class='add'>+    cli_local_t *local = NULL;</div><div class='add'>+    gf_answer_t answer = GF_ANSWER_NO;</div><div class='add'>+    const char *question =</div><div class='add'>+        "Sync volume may make data "</div><div class='add'>+        "inaccessible while the sync "</div><div class='add'>+        "is in progress. Do you want "</div><div class='add'>+        "to continue?";</div><div class='add'>+</div><div class='add'>+    if ((wordcount &lt; 3) || (wordcount &gt; 4)) {</div><div class='add'>+        cli_usage_out(word-&gt;pattern);</div><div class='add'>+        parse_error = 1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    dict = dict_new();</div><div class='add'>+    if (!dict)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    if ((wordcount == 3) || !strcmp(words[3], "all")) {</div><div class='add'>+        ret = dict_set_int32(dict, "flags", (int32_t)GF_CLI_SYNC_ALL);</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_log(THIS-&gt;name, GF_LOG_ERROR,</div><div class='add'>+                   "failed to set"</div><div class='add'>+                   "flag");</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    } else {</div><div class='add'>+        ret = dict_set_str(dict, "volname", (char *)words[3]);</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_log(THIS-&gt;name, GF_LOG_ERROR,</div><div class='add'>+                   "failed to set "</div><div class='add'>+                   "volume");</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_set_str(dict, "hostname", (char *)words[2]);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log(THIS-&gt;name, GF_LOG_ERROR, "failed to set hostname");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (!(state-&gt;mode &amp; GLUSTER_MODE_SCRIPT)) {</div><div class='add'>+        answer = cli_cmd_get_confirmation(state, question);</div><div class='add'>+        if (GF_ANSWER_NO == answer) {</div><div class='add'>+            ret = 0;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    proc = &amp;cli_rpc_prog-&gt;proctable[GLUSTER_CLI_SYNC_VOLUME];</div><div class='add'>+</div><div class='add'>+    frame = create_frame(THIS, THIS-&gt;ctx-&gt;pool);</div><div class='add'>+    if (!frame) {</div><div class='add'>+        gf_log(THIS-&gt;name, GF_LOG_ERROR, "failed to create frame");</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    CLI_LOCAL_INIT(local, words, frame, dict);</div><div class='add'>+</div><div class='add'>+    if (proc-&gt;fn) {</div><div class='add'>+        ret = proc-&gt;fn(frame, THIS, dict);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (ret) {</div><div class='add'>+        cli_cmd_sent_status_get(&amp;sent);</div><div class='add'>+        if ((sent == 0) &amp;&amp; (parse_error == 0))</div><div class='add'>+            cli_out("Volume sync failed");</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    CLI_STACK_DESTROY(frame);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-void</div><div class='del'>-cli_cmd_volume_info_usage ()</div><div class='add'>+int</div><div class='add'>+cli_cmd_volume_create_cbk(struct cli_state *state, struct cli_cmd_word *word,</div><div class='add'>+                          const char **words, int wordcount)</div><div class='ctx'> {</div><div class='del'>-        cli_out ("Usage: volume info [all|&lt;VOLNAME&gt;]");</div><div class='add'>+    int ret = -1;</div><div class='add'>+    rpc_clnt_procedure_t *proc = NULL;</div><div class='add'>+    call_frame_t *frame = NULL;</div><div class='add'>+    dict_t *options = NULL;</div><div class='add'>+    int sent = 0;</div><div class='add'>+    int parse_error = 0;</div><div class='add'>+    cli_local_t *local = NULL;</div><div class='add'>+    char *trans_type = NULL;</div><div class='add'>+    char *bricks = NULL;</div><div class='add'>+</div><div class='add'>+    proc = &amp;cli_rpc_prog-&gt;proctable[GLUSTER_CLI_CREATE_VOLUME];</div><div class='add'>+</div><div class='add'>+    ret = cli_cmd_volume_create_parse(state, words, wordcount, &amp;options,</div><div class='add'>+                                      &amp;bricks);</div><div class='add'>+</div><div class='add'>+    if (ret) {</div><div class='add'>+        cli_usage_out(word-&gt;pattern);</div><div class='add'>+        parse_error = 1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_get_str(options, "transport", &amp;trans_type);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log("cli", GF_LOG_ERROR, "Unable to get transport type");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (state-&gt;mode &amp; GLUSTER_MODE_WIGNORE) {</div><div class='add'>+        ret = dict_set_int32(options, "force", _gf_true);</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_log("cli", GF_LOG_ERROR,</div><div class='add'>+                   "Failed to set force "</div><div class='add'>+                   "option");</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    frame = create_frame(THIS, THIS-&gt;ctx-&gt;pool);</div><div class='add'>+    if (!frame) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    CLI_LOCAL_INIT(local, words, frame, options);</div><div class='add'>+</div><div class='add'>+    if (proc-&gt;fn) {</div><div class='add'>+        ret = proc-&gt;fn(frame, THIS, options);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (ret) {</div><div class='add'>+        cli_cmd_sent_status_get(&amp;sent);</div><div class='add'>+        if ((sent == 0) &amp;&amp; (parse_error == 0))</div><div class='add'>+            cli_out("Volume create failed");</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (ret == 0) {</div><div class='add'>+        gf_event(EVENT_VOLUME_CREATE, "name=%s;bricks=%s", (char *)words[2],</div><div class='add'>+                 bricks);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    CLI_STACK_DESTROY(frame);</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-cli_cmd_volume_info_cbk (struct cli_state *state, struct cli_cmd_word *word,</div><div class='del'>-                         const char **words, int wordcount)</div><div class='add'>+cli_cmd_volume_delete_cbk(struct cli_state *state, struct cli_cmd_word *word,</div><div class='add'>+                          const char **words, int wordcount)</div><div class='ctx'> {</div><div class='del'>-        int                             ret = -1;</div><div class='del'>-        rpc_clnt_procedure_t            *proc = NULL;</div><div class='del'>-        call_frame_t                    *frame = NULL;</div><div class='del'>-        cli_cmd_volume_get_ctx_t        ctx = {0,};</div><div class='del'>-        cli_local_t                     *local = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    rpc_clnt_procedure_t *proc = NULL;</div><div class='add'>+    call_frame_t *frame = NULL;</div><div class='add'>+    char *volname = NULL;</div><div class='add'>+    gf_answer_t answer = GF_ANSWER_NO;</div><div class='add'>+    const char *question = NULL;</div><div class='add'>+    int sent = 0;</div><div class='add'>+    int parse_error = 0;</div><div class='add'>+    cli_local_t *local = NULL;</div><div class='add'>+    dict_t *dict = NULL;</div><div class='add'>+</div><div class='add'>+    question =</div><div class='add'>+        "Deleting volume will erase all information about the volume. "</div><div class='add'>+        "Do you want to continue?";</div><div class='add'>+    proc = &amp;cli_rpc_prog-&gt;proctable[GLUSTER_CLI_DELETE_VOLUME];</div><div class='add'>+</div><div class='add'>+    if (wordcount != 3) {</div><div class='add'>+        cli_usage_out(word-&gt;pattern);</div><div class='add'>+        parse_error = 1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    volname = (char *)words[2];</div><div class='add'>+</div><div class='add'>+    dict = dict_new();</div><div class='add'>+    if (!dict)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    ret = dict_set_str(dict, "volname", volname);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log(THIS-&gt;name, GF_LOG_WARNING, "dict set failed");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (!strcmp(volname, GLUSTER_SHARED_STORAGE)) {</div><div class='add'>+        question =</div><div class='add'>+            "Deleting the shared storage volume"</div><div class='add'>+            "(gluster_shared_storage), will affect features "</div><div class='add'>+            "like snapshot scheduler, geo-replication "</div><div class='add'>+            "and NFS-Ganesha. Do you still want to "</div><div class='add'>+            "continue?";</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    answer = cli_cmd_get_confirmation(state, question);</div><div class='add'>+    if (GF_ANSWER_NO == answer) {</div><div class='add'>+        ret = 0;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    frame = create_frame(THIS, THIS-&gt;ctx-&gt;pool);</div><div class='add'>+    if (!frame) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    CLI_LOCAL_INIT(local, words, frame, dict);</div><div class='add'>+</div><div class='add'>+    if (proc-&gt;fn) {</div><div class='add'>+        ret = proc-&gt;fn(frame, THIS, dict);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        proc = &amp;cli_rpc_prog-&gt;proctable[GF1_CLI_GET_VOLUME];</div><div class='add'>+out:</div><div class='add'>+    if (ret) {</div><div class='add'>+        cli_cmd_sent_status_get(&amp;sent);</div><div class='add'>+        if ((sent == 0) &amp;&amp; (parse_error == 0))</div><div class='add'>+            cli_out("Volume delete failed");</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        frame = create_frame (THIS, THIS-&gt;ctx-&gt;pool);</div><div class='del'>-        if (!frame)</div><div class='del'>-                goto out;</div><div class='add'>+    CLI_STACK_DESTROY(frame);</div><div class='ctx'> </div><div class='del'>-        if ((wordcount == 2)  || (wordcount == 3 &amp;&amp;</div><div class='del'>-                                  !strcmp (words[2], "all"))) {</div><div class='del'>-                ctx.flags = GF_CLI_GET_NEXT_VOLUME;</div><div class='del'>-                proc = &amp;cli_rpc_prog-&gt;proctable[GF1_CLI_GET_NEXT_VOLUME];</div><div class='del'>-        } else if (wordcount == 3) {</div><div class='del'>-                ctx.flags = GF_CLI_GET_VOLUME;</div><div class='del'>-                ctx.volname = (char *)words[2];</div><div class='del'>-                if (strlen (ctx.volname) &gt; 1024) {</div><div class='del'>-                        cli_out ("Invalid volume name");</div><div class='del'>-                        goto out;</div><div class='del'>-                }</div><div class='del'>-                proc = &amp;cli_rpc_prog-&gt;proctable[GF1_CLI_GET_VOLUME];</div><div class='add'>+    if (ret == 0 &amp;&amp; GF_ANSWER_YES == answer) {</div><div class='add'>+        gf_event(EVENT_VOLUME_DELETE, "name=%s", (char *)words[2]);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+cli_cmd_volume_start_cbk(struct cli_state *state, struct cli_cmd_word *word,</div><div class='add'>+                         const char **words, int wordcount)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    rpc_clnt_procedure_t *proc = NULL;</div><div class='add'>+    call_frame_t *frame = NULL;</div><div class='add'>+    int sent = 0;</div><div class='add'>+    int parse_error = 0;</div><div class='add'>+    dict_t *dict = NULL;</div><div class='add'>+    int flags = 0;</div><div class='add'>+    cli_local_t *local = NULL;</div><div class='add'>+</div><div class='add'>+    if (wordcount &lt; 3 || wordcount &gt; 4) {</div><div class='add'>+        cli_usage_out(word-&gt;pattern);</div><div class='add'>+        parse_error = 1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (!words[2])</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    if (wordcount == 4) {</div><div class='add'>+        if (!strcmp("force", words[3])) {</div><div class='add'>+            flags |= GF_CLI_FLAG_OP_FORCE;</div><div class='ctx'>         } else {</div><div class='del'>-                cli_cmd_volume_info_usage ();</div><div class='del'>-                return -1;</div><div class='add'>+            ret = -1;</div><div class='add'>+            cli_usage_out(word-&gt;pattern);</div><div class='add'>+            parse_error = 1;</div><div class='add'>+            goto out;</div><div class='ctx'>         }</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        local = cli_local_get ();</div><div class='add'>+    dict = dict_new();</div><div class='add'>+    if (!dict) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        if (!local)</div><div class='del'>-                goto out;</div><div class='add'>+    ret = dict_set_str(dict, "volname", (char *)words[2]);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log(THIS-&gt;name, GF_LOG_ERROR, "dict set failed");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        local-&gt;u.get_vol.flags = ctx.flags;</div><div class='del'>-        if (ctx.volname)</div><div class='del'>-                local-&gt;u.get_vol.volname = gf_strdup (ctx.volname);</div><div class='add'>+    ret = dict_set_int32(dict, "flags", flags);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log(THIS-&gt;name, GF_LOG_ERROR, "dict set failed");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        frame-&gt;local = local;</div><div class='add'>+    proc = &amp;cli_rpc_prog-&gt;proctable[GLUSTER_CLI_START_VOLUME];</div><div class='ctx'> </div><div class='del'>-        if (proc-&gt;fn) {</div><div class='del'>-                ret = proc-&gt;fn (frame, THIS, &amp;ctx);</div><div class='del'>-        }</div><div class='add'>+    frame = create_frame(THIS, THIS-&gt;ctx-&gt;pool);</div><div class='add'>+    if (!frame) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    CLI_LOCAL_INIT(local, words, frame, dict);</div><div class='add'>+</div><div class='add'>+    if (proc-&gt;fn) {</div><div class='add'>+        ret = proc-&gt;fn(frame, THIS, dict);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='ctx'> out:</div><div class='del'>-        if (ret)</div><div class='del'>-                cli_out ("Getting Volume information failed!");</div><div class='del'>-        return ret;</div><div class='add'>+    if (ret) {</div><div class='add'>+        cli_cmd_sent_status_get(&amp;sent);</div><div class='add'>+        if ((sent == 0) &amp;&amp; (parse_error == 0))</div><div class='add'>+            cli_out("Volume start failed");</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    CLI_STACK_DESTROY(frame);</div><div class='ctx'> </div><div class='add'>+    if (ret == 0) {</div><div class='add'>+        gf_event(EVENT_VOLUME_START, "name=%s;force=%d", (char *)words[2],</div><div class='add'>+                 (flags &amp; GF_CLI_FLAG_OP_FORCE));</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-void</div><div class='del'>-cli_cmd_volume_create_usage ()</div><div class='add'>+gf_answer_t</div><div class='add'>+cli_cmd_get_confirmation(struct cli_state *state, const char *question)</div><div class='ctx'> {</div><div class='del'>-        cli_out ("Usage: volume create &lt;NEW-VOLNAME&gt; "</div><div class='del'>-                 "[stripe &lt;COUNT&gt;] [replica &lt;COUNT&gt;] [transport &lt;tcp|rdma&gt;] "</div><div class='del'>-                 "&lt;NEW-BRICK&gt; ...");</div><div class='add'>+    char answer[5] = {</div><div class='add'>+        '\0',</div><div class='add'>+    };</div><div class='add'>+    int flush = '\0';</div><div class='add'>+    size_t len;</div><div class='add'>+</div><div class='add'>+    if (state-&gt;mode &amp; GLUSTER_MODE_SCRIPT)</div><div class='add'>+        return GF_ANSWER_YES;</div><div class='add'>+</div><div class='add'>+    printf("%s (y/n) ", question);</div><div class='add'>+</div><div class='add'>+    if (fgets(answer, 4, stdin) == NULL) {</div><div class='add'>+        cli_out("gluster cli read error");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    len = strlen(answer);</div><div class='add'>+</div><div class='add'>+    if (len &amp;&amp; answer[len - 1] == '\n') {</div><div class='add'>+        answer[--len] = '\0';</div><div class='add'>+    } else {</div><div class='add'>+        do {</div><div class='add'>+            flush = getchar();</div><div class='add'>+        } while (flush != '\n');</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (len &gt; 3)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    if (!strcasecmp(answer, "y") || !strcasecmp(answer, "yes"))</div><div class='add'>+        return GF_ANSWER_YES;</div><div class='add'>+</div><div class='add'>+    else if (!strcasecmp(answer, "n") || !strcasecmp(answer, "no"))</div><div class='add'>+        return GF_ANSWER_NO;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    cli_out("Invalid input, please enter y/n");</div><div class='add'>+</div><div class='add'>+    return GF_ANSWER_NO;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-cli_cmd_volume_create_cbk (struct cli_state *state, struct cli_cmd_word *word,</div><div class='del'>-                           const char **words, int wordcount)</div><div class='add'>+cli_cmd_volume_stop_cbk(struct cli_state *state, struct cli_cmd_word *word,</div><div class='add'>+                        const char **words, int wordcount)</div><div class='ctx'> {</div><div class='del'>-        int                     ret = -1;</div><div class='del'>-        rpc_clnt_procedure_t    *proc = NULL;</div><div class='del'>-        call_frame_t            *frame = NULL;</div><div class='del'>-        dict_t                  *options = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    rpc_clnt_procedure_t *proc = NULL;</div><div class='add'>+    call_frame_t *frame = NULL;</div><div class='add'>+    int flags = 0;</div><div class='add'>+    gf_answer_t answer = GF_ANSWER_NO;</div><div class='add'>+    int sent = 0;</div><div class='add'>+    int parse_error = 0;</div><div class='add'>+    dict_t *dict = NULL;</div><div class='add'>+    char *volname = NULL;</div><div class='add'>+    cli_local_t *local = NULL;</div><div class='add'>+</div><div class='add'>+    const char *question =</div><div class='add'>+        "Stopping volume will make its data inaccessible. "</div><div class='add'>+        "Do you want to continue?";</div><div class='add'>+</div><div class='add'>+    if (wordcount &lt; 3 || wordcount &gt; 4) {</div><div class='add'>+        cli_usage_out(word-&gt;pattern);</div><div class='add'>+        parse_error = 1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    volname = (char *)words[2];</div><div class='add'>+</div><div class='add'>+    dict = dict_new();</div><div class='add'>+    ret = dict_set_str(dict, "volname", volname);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log(THIS-&gt;name, GF_LOG_ERROR, "dict set failed");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (!strcmp(volname, GLUSTER_SHARED_STORAGE)) {</div><div class='add'>+        question =</div><div class='add'>+            "Stopping the shared storage volume"</div><div class='add'>+            "(gluster_shared_storage), will affect features "</div><div class='add'>+            "like snapshot scheduler, geo-replication "</div><div class='add'>+            "and NFS-Ganesha. Do you still want to "</div><div class='add'>+            "continue?";</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (wordcount == 4) {</div><div class='add'>+        if (!strcmp("force", words[3])) {</div><div class='add'>+            flags |= GF_CLI_FLAG_OP_FORCE;</div><div class='add'>+        } else {</div><div class='add'>+            ret = -1;</div><div class='add'>+            cli_usage_out(word-&gt;pattern);</div><div class='add'>+            parse_error = 1;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        proc = &amp;cli_rpc_prog-&gt;proctable[GF1_CLI_CREATE_VOLUME];</div><div class='add'>+    ret = dict_set_int32(dict, "flags", flags);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log(THIS-&gt;name, GF_LOG_ERROR, "dict set failed");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        frame = create_frame (THIS, THIS-&gt;ctx-&gt;pool);</div><div class='del'>-        if (!frame)</div><div class='del'>-                goto out;</div><div class='add'>+    answer = cli_cmd_get_confirmation(state, question);</div><div class='ctx'> </div><div class='del'>-        ret = cli_cmd_volume_create_parse (words, wordcount, &amp;options);</div><div class='add'>+    if (GF_ANSWER_NO == answer) {</div><div class='add'>+        ret = 0;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        if (ret) {</div><div class='del'>-                cli_cmd_volume_create_usage ();</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='add'>+    proc = &amp;cli_rpc_prog-&gt;proctable[GLUSTER_CLI_STOP_VOLUME];</div><div class='ctx'> </div><div class='del'>-        if (proc-&gt;fn) {</div><div class='del'>-                ret = proc-&gt;fn (frame, THIS, options);</div><div class='del'>-        }</div><div class='add'>+    frame = create_frame(THIS, THIS-&gt;ctx-&gt;pool);</div><div class='add'>+    if (!frame) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-out:</div><div class='del'>-        if (options)</div><div class='del'>-                dict_unref (options);</div><div class='add'>+    CLI_LOCAL_INIT(local, words, frame, dict);</div><div class='ctx'> </div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='add'>+    if (proc-&gt;fn) {</div><div class='add'>+        ret = proc-&gt;fn(frame, THIS, dict);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='add'>+out:</div><div class='add'>+    if (ret) {</div><div class='add'>+        cli_cmd_sent_status_get(&amp;sent);</div><div class='add'>+        if ((sent == 0) &amp;&amp; (parse_error == 0))</div><div class='add'>+            cli_out("Volume stop on '%s' failed", volname);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    CLI_STACK_DESTROY(frame);</div><div class='add'>+    if (dict)</div><div class='add'>+        dict_unref(dict);</div><div class='add'>+</div><div class='add'>+    if (ret == 0 &amp;&amp; GF_ANSWER_YES == answer) {</div><div class='add'>+        gf_event(EVENT_VOLUME_STOP, "name=%s;force=%d", (char *)words[2],</div><div class='add'>+                 (flags &amp; GF_CLI_FLAG_OP_FORCE));</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-cli_cmd_volume_delete_cbk (struct cli_state *state, struct cli_cmd_word *word,</div><div class='del'>-                           const char **words, int wordcount)</div><div class='add'>+cli_cmd_volume_rename_cbk(struct cli_state *state, struct cli_cmd_word *word,</div><div class='add'>+                          const char **words, int wordcount)</div><div class='ctx'> {</div><div class='del'>-        int                     ret = -1;</div><div class='del'>-        rpc_clnt_procedure_t    *proc = NULL;</div><div class='del'>-        call_frame_t            *frame = NULL;</div><div class='del'>-        char                    *volname = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    rpc_clnt_procedure_t *proc = NULL;</div><div class='add'>+    call_frame_t *frame = NULL;</div><div class='add'>+    dict_t *dict = NULL;</div><div class='add'>+    int sent = 0;</div><div class='add'>+    int parse_error = 0;</div><div class='ctx'> </div><div class='del'>-        proc = &amp;cli_rpc_prog-&gt;proctable[GF1_CLI_DELETE_VOLUME];</div><div class='add'>+    if (wordcount != 4) {</div><div class='add'>+        cli_usage_out(word-&gt;pattern);</div><div class='add'>+        parse_error = 1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        frame = create_frame (THIS, THIS-&gt;ctx-&gt;pool);</div><div class='del'>-        if (!frame)</div><div class='del'>-                goto out;</div><div class='add'>+    dict = dict_new();</div><div class='add'>+    if (!dict)</div><div class='add'>+        goto out;</div><div class='ctx'> </div><div class='del'>-        if (wordcount != 3) {</div><div class='del'>-                cli_cmd_volume_delete_usage ();</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='add'>+    ret = dict_set_str(dict, "old-volname", (char *)words[2]);</div><div class='add'>+</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='ctx'> </div><div class='del'>-        volname = (char *)words[2];</div><div class='add'>+    ret = dict_set_str(dict, "new-volname", (char *)words[3]);</div><div class='ctx'> </div><div class='del'>-        if (proc-&gt;fn) {</div><div class='del'>-                ret = proc-&gt;fn (frame, THIS, volname);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    proc = &amp;cli_rpc_prog-&gt;proctable[GLUSTER_CLI_RENAME_VOLUME];</div><div class='add'>+</div><div class='add'>+    if (proc-&gt;fn) {</div><div class='add'>+        frame = create_frame(THIS, THIS-&gt;ctx-&gt;pool);</div><div class='add'>+        if (!frame) {</div><div class='add'>+            ret = -1;</div><div class='add'>+            goto out;</div><div class='ctx'>         }</div><div class='add'>+        ret = proc-&gt;fn(frame, THIS, dict);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='ctx'> out:</div><div class='del'>-        if (ret &amp;&amp; volname)</div><div class='del'>-                cli_out ("Deleting Volume %s failed", volname);</div><div class='add'>+    if (dict)</div><div class='add'>+        dict_unref(dict);</div><div class='ctx'> </div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='add'>+    if (ret) {</div><div class='add'>+        cli_cmd_sent_status_get(&amp;sent);</div><div class='add'>+        if ((sent == 0) &amp;&amp; (parse_error == 0))</div><div class='add'>+            cli_out("Volume rename on '%s' failed", (char *)words[2]);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='add'>+    CLI_STACK_DESTROY(frame);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-cli_cmd_volume_start_cbk (struct cli_state *state, struct cli_cmd_word *word,</div><div class='add'>+cli_cmd_volume_defrag_cbk(struct cli_state *state, struct cli_cmd_word *word,</div><div class='ctx'>                           const char **words, int wordcount)</div><div class='ctx'> {</div><div class='del'>-        int                     ret = -1;</div><div class='del'>-        rpc_clnt_procedure_t    *proc = NULL;</div><div class='del'>-        call_frame_t            *frame = NULL;</div><div class='del'>-        char                    *volname = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    rpc_clnt_procedure_t *proc = NULL;</div><div class='add'>+    call_frame_t *frame = NULL;</div><div class='add'>+    dict_t *dict = NULL;</div><div class='add'>+    int sent = 0;</div><div class='add'>+    int parse_error = 0;</div><div class='add'>+    cli_local_t *local = NULL;</div><div class='add'>+#if (USE_EVENTS)</div><div class='add'>+    eventtypes_t event = EVENT_LAST;</div><div class='add'>+#endif</div><div class='ctx'> </div><div class='add'>+#ifdef GF_SOLARIS_HOST_OS</div><div class='add'>+    cli_out("Command not supported on Solaris");</div><div class='add'>+    goto out;</div><div class='add'>+#endif</div><div class='ctx'> </div><div class='del'>-        frame = create_frame (THIS, THIS-&gt;ctx-&gt;pool);</div><div class='del'>-        if (!frame)</div><div class='del'>-                goto out;</div><div class='add'>+    ret = cli_cmd_volume_defrag_parse(words, wordcount, &amp;dict);</div><div class='ctx'> </div><div class='del'>-        if (wordcount != 3) {</div><div class='del'>-               cli_cmd_volume_start_usage ();</div><div class='del'>-               goto out;</div><div class='del'>-        }</div><div class='add'>+    if (ret) {</div><div class='add'>+        cli_usage_out(word-&gt;pattern);</div><div class='add'>+        parse_error = 1;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        volname = (char *)words[2];</div><div class='add'>+    proc = &amp;cli_rpc_prog-&gt;proctable[GLUSTER_CLI_DEFRAG_VOLUME];</div><div class='ctx'> </div><div class='del'>-        proc = &amp;cli_rpc_prog-&gt;proctable[GF1_CLI_START_VOLUME];</div><div class='add'>+    frame = create_frame(THIS, THIS-&gt;ctx-&gt;pool);</div><div class='add'>+    if (!frame) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        if (proc-&gt;fn) {</div><div class='del'>-                ret = proc-&gt;fn (frame, THIS, volname);</div><div class='del'>-        }</div><div class='add'>+    CLI_LOCAL_INIT(local, words, frame, dict);</div><div class='add'>+</div><div class='add'>+    if (proc-&gt;fn) {</div><div class='add'>+        ret = proc-&gt;fn(frame, THIS, dict);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='ctx'> out:</div><div class='del'>-        if (!proc &amp;&amp; ret &amp;&amp; volname)</div><div class='del'>-                cli_out ("Starting Volume %s failed", volname);</div><div class='add'>+    if (ret) {</div><div class='add'>+        cli_cmd_sent_status_get(&amp;sent);</div><div class='add'>+        if ((sent == 0) &amp;&amp; (parse_error == 0))</div><div class='add'>+            cli_out("Volume rebalance failed");</div><div class='add'>+    } else {</div><div class='add'>+#if (USE_EVENTS)</div><div class='add'>+        if (!(strcmp(words[wordcount - 1], "start")) ||</div><div class='add'>+            !(strcmp(words[wordcount - 1], "force"))) {</div><div class='add'>+            event = EVENT_VOLUME_REBALANCE_START;</div><div class='add'>+        } else if (!strcmp(words[wordcount - 1], "stop")) {</div><div class='add'>+            event = EVENT_VOLUME_REBALANCE_STOP;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        if (event != EVENT_LAST)</div><div class='add'>+            gf_event(event, "volume=%s", (char *)words[2]);</div><div class='add'>+#endif</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    CLI_STACK_DESTROY(frame);</div><div class='ctx'> </div><div class='del'>-        return ret;</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-gf_answer_t</div><div class='del'>-cli_cmd_get_confirmation (struct cli_state *state, const char *question)</div><div class='add'>+int</div><div class='add'>+cli_cmd_volume_reset_cbk(struct cli_state *state, struct cli_cmd_word *word,</div><div class='add'>+                         const char **words, int wordcount)</div><div class='ctx'> {</div><div class='del'>-        char                    answer = '\0';</div><div class='del'>-        char                    flush = '\0';</div><div class='add'>+    int sent = 0;</div><div class='add'>+    int parse_error = 0;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    rpc_clnt_procedure_t *proc = NULL;</div><div class='add'>+    call_frame_t *frame = NULL;</div><div class='add'>+    dict_t *options = NULL;</div><div class='add'>+    cli_local_t *local = NULL;</div><div class='add'>+#if (USE_EVENTS)</div><div class='add'>+    int ret1 = -1;</div><div class='add'>+    char *tmp_opt = NULL;</div><div class='add'>+#endif</div><div class='ctx'> </div><div class='del'>-        if (GLUSTER_MODE_SCRIPT == state-&gt;mode)</div><div class='del'>-                return GF_ANSWER_YES;</div><div class='del'>-        printf ("%s (y/n) ", question);</div><div class='del'>-        answer = getchar ();</div><div class='del'>-        flush = answer;</div><div class='del'>-        while ('\n' != flush)</div><div class='del'>-                flush = getchar ();</div><div class='del'>-        if ('y' != answer) {</div><div class='del'>-                return GF_ANSWER_NO;</div><div class='del'>-        }</div><div class='del'>-        return GF_ANSWER_YES;</div><div class='add'>+    proc = &amp;cli_rpc_prog-&gt;proctable[GLUSTER_CLI_RESET_VOLUME];</div><div class='add'>+</div><div class='add'>+    ret = cli_cmd_volume_reset_parse(words, wordcount, &amp;options);</div><div class='add'>+    if (ret) {</div><div class='add'>+        cli_usage_out(word-&gt;pattern);</div><div class='add'>+        parse_error = 1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    frame = create_frame(THIS, THIS-&gt;ctx-&gt;pool);</div><div class='add'>+    if (!frame) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    CLI_LOCAL_INIT(local, words, frame, options);</div><div class='add'>+</div><div class='add'>+    if (proc-&gt;fn) {</div><div class='add'>+        ret = proc-&gt;fn(frame, THIS, options);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (ret) {</div><div class='add'>+        cli_cmd_sent_status_get(&amp;sent);</div><div class='add'>+        if ((sent == 0) &amp;&amp; (parse_error == 0))</div><div class='add'>+            cli_out("Volume reset failed");</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+#if (USE_EVENTS)</div><div class='add'>+    if (ret == 0) {</div><div class='add'>+        ret1 = dict_get_str(options, "key", &amp;tmp_opt);</div><div class='add'>+        if (ret1)</div><div class='add'>+            tmp_opt = "";</div><div class='add'>+</div><div class='add'>+        gf_event(EVENT_VOLUME_RESET, "name=%s;option=%s", (char *)words[2],</div><div class='add'>+                 tmp_opt);</div><div class='add'>+    }</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+    CLI_STACK_DESTROY(frame);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-cli_cmd_volume_stop_cbk (struct cli_state *state, struct cli_cmd_word *word,</div><div class='add'>+cli_cmd_volume_profile_cbk(struct cli_state *state, struct cli_cmd_word *word,</div><div class='ctx'>                            const char **words, int wordcount)</div><div class='ctx'> {</div><div class='del'>-        int                     ret = -1;</div><div class='del'>-        rpc_clnt_procedure_t    *proc = NULL;</div><div class='del'>-        call_frame_t            *frame = NULL;</div><div class='del'>-        int                     flags   = 0;</div><div class='del'>-        gf1_cli_stop_vol_req    req = {0,};</div><div class='del'>-        gf_answer_t             answer = GF_ANSWER_NO;</div><div class='add'>+    int sent = 0;</div><div class='add'>+    int parse_error = 0;</div><div class='ctx'> </div><div class='del'>-        const char *question = "Stopping volume will make its data inaccessible. "</div><div class='del'>-                               "Do you want to Continue?";</div><div class='add'>+    int ret = -1;</div><div class='add'>+    rpc_clnt_procedure_t *proc = NULL;</div><div class='add'>+    call_frame_t *frame = NULL;</div><div class='add'>+    dict_t *options = NULL;</div><div class='add'>+    cli_local_t *local = NULL;</div><div class='ctx'> </div><div class='del'>-        frame = create_frame (THIS, THIS-&gt;ctx-&gt;pool);</div><div class='del'>-        if (!frame)</div><div class='del'>-                goto out;</div><div class='add'>+    ret = cli_cmd_volume_profile_parse(words, wordcount, &amp;options);</div><div class='ctx'> </div><div class='del'>-        if (wordcount &lt; 3 || wordcount &gt; 4) {</div><div class='del'>-               cli_cmd_volume_stop_usage ();</div><div class='del'>-               goto out;</div><div class='del'>-        }</div><div class='add'>+    if (ret) {</div><div class='add'>+        cli_usage_out(word-&gt;pattern);</div><div class='add'>+        parse_error = 1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        req.volname = (char *)words[2];</div><div class='del'>-        if (!req.volname)</div><div class='del'>-                goto out;</div><div class='add'>+    proc = &amp;cli_rpc_prog-&gt;proctable[GLUSTER_CLI_PROFILE_VOLUME];</div><div class='ctx'> </div><div class='del'>-        if (wordcount == 4) {</div><div class='del'>-                if (!strcmp("force", words[3])) {</div><div class='del'>-                        flags |= GF_CLI_FLAG_OP_FORCE;</div><div class='del'>-                } else {</div><div class='del'>-                        ret = -1;</div><div class='del'>-                        cli_cmd_volume_stop_usage ();</div><div class='del'>-                        goto out;</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='add'>+    frame = create_frame(THIS, THIS-&gt;ctx-&gt;pool);</div><div class='add'>+    if (!frame) {</div><div class='add'>+        gf_log(THIS-&gt;name, GF_LOG_ERROR, "failed to create frame");</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        answer = cli_cmd_get_confirmation (state, question);</div><div class='add'>+    CLI_LOCAL_INIT(local, words, frame, options);</div><div class='ctx'> </div><div class='del'>-        if (GF_ANSWER_NO == answer) {</div><div class='del'>-                ret = 0;</div><div class='del'>-                goto out;</div><div class='add'>+    if (proc-&gt;fn) {</div><div class='add'>+        ret = proc-&gt;fn(frame, THIS, options);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (ret) {</div><div class='add'>+        cli_cmd_sent_status_get(&amp;sent);</div><div class='add'>+        if ((sent == 0) &amp;&amp; (parse_error == 0))</div><div class='add'>+            cli_out("Volume profile failed");</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    CLI_STACK_DESTROY(frame);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+cli_cmd_volume_set_cbk(struct cli_state *state, struct cli_cmd_word *word,</div><div class='add'>+                       const char **words, int wordcount)</div><div class='add'>+{</div><div class='add'>+    int sent = 0;</div><div class='add'>+    int parse_error = 0;</div><div class='add'>+</div><div class='add'>+    int ret = -1;</div><div class='add'>+    rpc_clnt_procedure_t *proc = NULL;</div><div class='add'>+    call_frame_t *frame = NULL;</div><div class='add'>+    dict_t *options = NULL;</div><div class='add'>+    cli_local_t *local = NULL;</div><div class='add'>+    char *op_errstr = NULL;</div><div class='add'>+</div><div class='add'>+#if (USE_EVENTS)</div><div class='add'>+    int ret1 = -1;</div><div class='add'>+    int i = 1;</div><div class='add'>+    char dict_key[50] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    char *tmp_opt = NULL;</div><div class='add'>+    char *opts_str = NULL;</div><div class='add'>+    int num_options = 0;</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+    proc = &amp;cli_rpc_prog-&gt;proctable[GLUSTER_CLI_SET_VOLUME];</div><div class='add'>+</div><div class='add'>+    ret = cli_cmd_volume_set_parse(state, words, wordcount, &amp;options,</div><div class='add'>+                                   &amp;op_errstr);</div><div class='add'>+    if (ret) {</div><div class='add'>+        if (op_errstr) {</div><div class='add'>+            cli_err("%s", op_errstr);</div><div class='add'>+            GF_FREE(op_errstr);</div><div class='add'>+        } else</div><div class='add'>+            cli_usage_out(word-&gt;pattern);</div><div class='add'>+</div><div class='add'>+        parse_error = 1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    frame = create_frame(THIS, THIS-&gt;ctx-&gt;pool);</div><div class='add'>+    if (!frame) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    CLI_LOCAL_INIT(local, words, frame, options);</div><div class='add'>+</div><div class='add'>+    if (proc-&gt;fn) {</div><div class='add'>+        ret = proc-&gt;fn(frame, THIS, options);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (ret) {</div><div class='add'>+        cli_cmd_sent_status_get(&amp;sent);</div><div class='add'>+        if ((sent == 0) &amp;&amp; (parse_error == 0))</div><div class='add'>+            cli_out("Volume set failed");</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+#if (USE_EVENTS)</div><div class='add'>+    if (ret == 0 &amp;&amp; strcmp(words[2], "help") != 0) {</div><div class='add'>+        ret1 = dict_get_int32(options, "count", &amp;num_options);</div><div class='add'>+        if (ret1) {</div><div class='add'>+            num_options = 0;</div><div class='add'>+            goto end;</div><div class='add'>+        } else {</div><div class='add'>+            num_options = num_options / 2;</div><div class='ctx'>         }</div><div class='ctx'> </div><div class='del'>-        req.flags = flags;</div><div class='del'>-        proc = &amp;cli_rpc_prog-&gt;proctable[GF1_CLI_STOP_VOLUME];</div><div class='add'>+        char *free_list_key[num_options];</div><div class='add'>+        char *free_list_val[num_options];</div><div class='add'>+        for (i = 0; i &lt; num_options; i++) {</div><div class='add'>+            free_list_key[i] = NULL;</div><div class='add'>+            free_list_val[i] = NULL;</div><div class='add'>+        }</div><div class='add'>+        /* Initialize opts_str */</div><div class='add'>+        opts_str = "";</div><div class='add'>+</div><div class='add'>+        /* Prepare String in format options=KEY1,VALUE1,KEY2,VALUE2 */</div><div class='add'>+        for (i = 1; i &lt;= num_options; i++) {</div><div class='add'>+            sprintf(dict_key, "key%d", i);</div><div class='add'>+            ret1 = dict_get_str(options, dict_key, &amp;tmp_opt);</div><div class='add'>+            if (ret1)</div><div class='add'>+                tmp_opt = "";</div><div class='add'>+</div><div class='add'>+            gf_asprintf(&amp;opts_str, "%s,%s", opts_str, tmp_opt);</div><div class='add'>+            free_list_key[i - 1] = opts_str;</div><div class='add'>+</div><div class='add'>+            sprintf(dict_key, "value%d", i);</div><div class='add'>+            ret1 = dict_get_str(options, dict_key, &amp;tmp_opt);</div><div class='add'>+            if (ret1)</div><div class='add'>+                tmp_opt = "";</div><div class='add'>+</div><div class='add'>+            gf_asprintf(&amp;opts_str, "%s,%s", opts_str, tmp_opt);</div><div class='add'>+            free_list_val[i - 1] = opts_str;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-        if (proc-&gt;fn) {</div><div class='del'>-                ret = proc-&gt;fn (frame, THIS, &amp;req);</div><div class='add'>+        gf_event(EVENT_VOLUME_SET, "name=%s;options=%s", (char *)words[2],</div><div class='add'>+                 opts_str);</div><div class='add'>+</div><div class='add'>+        /* Allocated by gf_strdup and gf_asprintf */</div><div class='add'>+        for (i = 0; i &lt; num_options; i++) {</div><div class='add'>+            GF_FREE(free_list_key[i]);</div><div class='add'>+            GF_FREE(free_list_val[i]);</div><div class='ctx'>         }</div><div class='add'>+    }</div><div class='add'>+#endif</div><div class='ctx'> </div><div class='del'>-out:</div><div class='del'>-        if (!proc &amp;&amp; ret &amp;&amp; req.volname)</div><div class='del'>-                cli_out ("Stopping Volume %s failed", req.volname);</div><div class='add'>+end:</div><div class='add'>+    CLI_STACK_DESTROY(frame);</div><div class='ctx'> </div><div class='del'>-        return ret;</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-cli_cmd_volume_rename_cbk (struct cli_state *state, struct cli_cmd_word *word,</div><div class='del'>-                           const char **words, int wordcount)</div><div class='add'>+static int</div><div class='add'>+cli_event_remove_brick_str(dict_t *options, char **event_str,</div><div class='add'>+                           eventtypes_t *event)</div><div class='ctx'> {</div><div class='del'>-        int                     ret = -1;</div><div class='del'>-        rpc_clnt_procedure_t    *proc = NULL;</div><div class='del'>-        call_frame_t            *frame = NULL;</div><div class='del'>-        dict_t                  *dict = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    char *bricklist = NULL;</div><div class='add'>+    char *brick = NULL;</div><div class='add'>+    char *volname = NULL;</div><div class='add'>+    char key[256] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    const char *eventstrformat = "volume=%s;bricks=%s";</div><div class='add'>+    int32_t command = 0;</div><div class='add'>+    int32_t i = 1;</div><div class='add'>+    int32_t count = 0;</div><div class='add'>+    int32_t eventstrlen = 1;</div><div class='add'>+    int bricklen = 0;</div><div class='add'>+    char *tmp_ptr = NULL;</div><div class='add'>+</div><div class='add'>+    if (!options || !event_str || !event)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    ret = dict_get_str(options, "volname", &amp;volname);</div><div class='add'>+    if (ret || !volname) {</div><div class='add'>+        gf_log("cli", GF_LOG_ERROR, "Failed to fetch volname");</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    /* Get the list of bricks for the event */</div><div class='add'>+    ret = dict_get_int32(options, "command", &amp;command);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log("cli", GF_LOG_ERROR, "Failed to fetch command");</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    switch (command) {</div><div class='add'>+        case GF_OP_CMD_START:</div><div class='add'>+            *event = EVENT_VOLUME_REMOVE_BRICK_START;</div><div class='add'>+            break;</div><div class='add'>+        case GF_OP_CMD_COMMIT:</div><div class='add'>+            *event = EVENT_VOLUME_REMOVE_BRICK_COMMIT;</div><div class='add'>+            break;</div><div class='add'>+        case GF_OP_CMD_COMMIT_FORCE:</div><div class='add'>+            *event = EVENT_VOLUME_REMOVE_BRICK_FORCE;</div><div class='add'>+            break;</div><div class='add'>+        case GF_OP_CMD_STOP:</div><div class='add'>+            *event = EVENT_VOLUME_REMOVE_BRICK_STOP;</div><div class='add'>+            break;</div><div class='add'>+        default:</div><div class='add'>+            *event = EVENT_LAST;</div><div class='add'>+            break;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = -1;</div><div class='add'>+</div><div class='add'>+    if (*event == EVENT_LAST) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* I could just get this from words[] but this is cleaner in case the</div><div class='add'>+     * format changes  */</div><div class='add'>+    while (i) {</div><div class='add'>+        snprintf(key, sizeof(key), "brick%d", i);</div><div class='add'>+        ret = dict_get_str(options, key, &amp;brick);</div><div class='add'>+        if (ret) {</div><div class='add'>+            break;</div><div class='add'>+        }</div><div class='add'>+        eventstrlen += strlen(brick) + 1;</div><div class='add'>+        i++;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='add'>+    count = --i;</div><div class='ctx'> </div><div class='del'>-        frame = create_frame (THIS, THIS-&gt;ctx-&gt;pool);</div><div class='del'>-        if (!frame)</div><div class='del'>-                goto out;</div><div class='add'>+    eventstrlen += 1;</div><div class='ctx'> </div><div class='del'>-        dict = dict_new ();</div><div class='del'>-        if (!dict)</div><div class='del'>-                goto out;</div><div class='add'>+    bricklist = GF_CALLOC(eventstrlen, sizeof(char), gf_common_mt_char);</div><div class='add'>+    if (!bricklist) {</div><div class='add'>+        gf_log(THIS-&gt;name, GF_LOG_ERROR,</div><div class='add'>+               "memory allocation failed for"</div><div class='add'>+               "bricklist");</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        if (wordcount != 4) {</div><div class='del'>-                cli_cmd_volume_rename_usage ();</div><div class='del'>-                goto out;</div><div class='add'>+    tmp_ptr = bricklist;</div><div class='add'>+</div><div class='add'>+    i = 1;</div><div class='add'>+    while (i &lt;= count) {</div><div class='add'>+        snprintf(key, sizeof(key), "brick%d", i);</div><div class='add'>+        ret = dict_get_str(options, key, &amp;brick);</div><div class='add'>+        if (ret) {</div><div class='add'>+            break;</div><div class='ctx'>         }</div><div class='add'>+        snprintf(tmp_ptr, eventstrlen, "%s ", brick);</div><div class='add'>+        bricklen = strlen(brick);</div><div class='add'>+        eventstrlen -= (bricklen + 1);</div><div class='add'>+        tmp_ptr += (bricklen + 1);</div><div class='add'>+        i++;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (!ret) {</div><div class='add'>+        gf_asprintf(event_str, eventstrformat, volname, bricklist);</div><div class='add'>+    } else {</div><div class='add'>+        gf_asprintf(event_str, eventstrformat, volname, "&lt;unavailable&gt;");</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+out:</div><div class='add'>+    GF_FREE(bricklist);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        ret = dict_set_str (dict, "old-volname", (char *)words[2]);</div><div class='add'>+int</div><div class='add'>+cli_cmd_volume_add_brick_cbk(struct cli_state *state, struct cli_cmd_word *word,</div><div class='add'>+                             const char **words, int wordcount)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    rpc_clnt_procedure_t *proc = NULL;</div><div class='add'>+    call_frame_t *frame = NULL;</div><div class='add'>+    dict_t *options = NULL;</div><div class='add'>+    int sent = 0;</div><div class='add'>+    int parse_error = 0;</div><div class='add'>+    gf_answer_t answer = GF_ANSWER_NO;</div><div class='add'>+    cli_local_t *local = NULL;</div><div class='add'>+</div><div class='add'>+#if (USE_EVENTS)</div><div class='add'>+    char *event_str = NULL;</div><div class='add'>+    char *bricks = NULL;</div><div class='add'>+    const char *eventstrformat = "volume=%s;bricks=%s";</div><div class='add'>+#endif</div><div class='ctx'> </div><div class='del'>-        if (ret)</div><div class='del'>-                goto out;</div><div class='add'>+    const char *question =</div><div class='add'>+        "Changing the 'stripe count' of the volume is "</div><div class='add'>+        "not a supported feature. In some cases it may result in data "</div><div class='add'>+        "loss on the volume. Also there may be issues with regular "</div><div class='add'>+        "filesystem operations on the volume after the change. Do you "</div><div class='add'>+        "really want to continue with 'stripe' count option ? ";</div><div class='add'>+</div><div class='add'>+    ret = cli_cmd_volume_add_brick_parse(state, words, wordcount, &amp;options, 0);</div><div class='add'>+    if (ret) {</div><div class='add'>+        cli_usage_out(word-&gt;pattern);</div><div class='add'>+        parse_error = 1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* TODO: there are challenges in supporting changing of</div><div class='add'>+       stripe-count, until it is properly supported give warning to user */</div><div class='add'>+    if (dict_get(options, "stripe-count")) {</div><div class='add'>+        answer = cli_cmd_get_confirmation(state, question);</div><div class='ctx'> </div><div class='del'>-        ret = dict_set_str (dict, "new-volname", (char *)words[3]);</div><div class='add'>+        if (GF_ANSWER_NO == answer) {</div><div class='add'>+            ret = 0;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        if (ret)</div><div class='del'>-                goto out;</div><div class='add'>+#if (USE_EVENTS)</div><div class='add'>+    /* Get the list of bricks for the event */</div><div class='ctx'> </div><div class='del'>-        proc = &amp;cli_rpc_prog-&gt;proctable[GF1_CLI_RENAME_VOLUME];</div><div class='add'>+    ret = dict_get_str(options, "bricks", &amp;bricks);</div><div class='ctx'> </div><div class='del'>-        if (proc-&gt;fn) {</div><div class='del'>-                ret = proc-&gt;fn (frame, THIS, dict);</div><div class='add'>+    if (!ret) {</div><div class='add'>+        gf_asprintf(&amp;event_str, eventstrformat, (char *)words[2],</div><div class='add'>+                    &amp;bricks[1] /*Skip leading space*/);</div><div class='add'>+    } else {</div><div class='add'>+        gf_asprintf(&amp;event_str, eventstrformat, (char *)words[2],</div><div class='add'>+                    "&lt;unavailable&gt;");</div><div class='add'>+    }</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+    if (state-&gt;mode &amp; GLUSTER_MODE_WIGNORE) {</div><div class='add'>+        ret = dict_set_int32(options, "force", _gf_true);</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_log("cli", GF_LOG_ERROR,</div><div class='add'>+                   "Failed to set force "</div><div class='add'>+                   "option");</div><div class='add'>+            goto out;</div><div class='ctx'>         }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    proc = &amp;cli_rpc_prog-&gt;proctable[GLUSTER_CLI_ADD_BRICK];</div><div class='add'>+</div><div class='add'>+    frame = create_frame(THIS, THIS-&gt;ctx-&gt;pool);</div><div class='add'>+    if (!frame) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    CLI_LOCAL_INIT(local, words, frame, options);</div><div class='add'>+</div><div class='add'>+    if (proc-&gt;fn) {</div><div class='add'>+        ret = proc-&gt;fn(frame, THIS, options);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='ctx'> out:</div><div class='del'>-        if (!proc &amp;&amp; ret) {</div><div class='del'>-                if (dict)</div><div class='del'>-                        dict_destroy (dict);</div><div class='del'>-                if (wordcount &gt; 2)</div><div class='del'>-                        cli_out ("Renaming Volume %s failed", (char *)words[2]);</div><div class='del'>-        }</div><div class='add'>+    if (ret) {</div><div class='add'>+        cli_cmd_sent_status_get(&amp;sent);</div><div class='add'>+        if ((sent == 0) &amp;&amp; (parse_error == 0))</div><div class='add'>+            cli_out("Volume add-brick failed");</div><div class='add'>+    } else {</div><div class='add'>+#if (USE_EVENTS)</div><div class='add'>+        gf_event(EVENT_VOLUME_ADD_BRICK, "%s", event_str);</div><div class='add'>+#endif</div><div class='add'>+    }</div><div class='add'>+#if (USE_EVENTS)</div><div class='add'>+    GF_FREE(event_str);</div><div class='add'>+#endif</div><div class='ctx'> </div><div class='del'>-        return ret;</div><div class='add'>+    CLI_STACK_DESTROY(frame);</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-void</div><div class='del'>-cli_cmd_volume_defrag_usage ()</div><div class='add'>+int</div><div class='add'>+cli_get_soft_limit(dict_t *options, const char **words, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-        cli_out ("Usage: volume rebalance &lt;VOLNAME&gt; &lt;start|stop|status&gt;");</div><div class='add'>+    call_frame_t *frame = NULL;</div><div class='add'>+    cli_local_t *local = NULL;</div><div class='add'>+    rpc_clnt_procedure_t *proc = NULL;</div><div class='add'>+    char *default_sl = NULL;</div><div class='add'>+    char *default_sl_dup = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    frame = create_frame(THIS, THIS-&gt;ctx-&gt;pool);</div><div class='add'>+    if (!frame) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    // We need a ref on @options to prevent CLI_STACK_DESTROY</div><div class='add'>+    // from destroying it prematurely.</div><div class='add'>+    dict_ref(options);</div><div class='add'>+    CLI_LOCAL_INIT(local, words, frame, options);</div><div class='add'>+    proc = &amp;cli_rpc_prog-&gt;proctable[GLUSTER_CLI_QUOTA];</div><div class='add'>+    ret = proc-&gt;fn(frame, THIS, options);</div><div class='add'>+</div><div class='add'>+    ret = dict_get_str(options, "default-soft-limit", &amp;default_sl);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log("cli", GF_LOG_ERROR, "Failed to get default soft limit");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    default_sl_dup = gf_strdup(default_sl);</div><div class='add'>+    if (!default_sl_dup) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_set_dynstr(xdata, "default-soft-limit", default_sl_dup);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log("cli", GF_LOG_ERROR, "Failed to set default soft limit");</div><div class='add'>+        GF_FREE(default_sl_dup);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    CLI_STACK_DESTROY(frame);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* Checks if at least one limit has been set on the volume</div><div class='add'>+ *</div><div class='add'>+ * Returns true if at least one limit is set. Returns false otherwise.</div><div class='add'>+ */</div><div class='add'>+gf_boolean_t</div><div class='add'>+_limits_set_on_volume(char *volname, int type)</div><div class='add'>+{</div><div class='add'>+    gf_boolean_t limits_set = _gf_false;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    char quota_conf_file[PATH_MAX] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int fd = -1;</div><div class='add'>+    char buf[16] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    float version = 0.0f;</div><div class='add'>+    char gfid_type_stored = 0;</div><div class='add'>+    char gfid_type = 0;</div><div class='add'>+</div><div class='add'>+    /* TODO: fix hardcoding; Need to perform an RPC call to glusterd</div><div class='add'>+     * to fetch working directory</div><div class='add'>+     */</div><div class='add'>+    snprintf(quota_conf_file, sizeof quota_conf_file, "%s/vols/%s/quota.conf",</div><div class='add'>+             GLUSTERD_DEFAULT_WORKDIR, volname);</div><div class='add'>+    fd = open(quota_conf_file, O_RDONLY);</div><div class='add'>+    if (fd == -1)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    ret = quota_conf_read_version(fd, &amp;version);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    if (type == GF_QUOTA_OPTION_TYPE_LIST)</div><div class='add'>+        gfid_type = GF_QUOTA_CONF_TYPE_USAGE;</div><div class='add'>+    else</div><div class='add'>+        gfid_type = GF_QUOTA_CONF_TYPE_OBJECTS;</div><div class='add'>+</div><div class='add'>+    /* Try to read at least one gfid  of type 'gfid_type' */</div><div class='add'>+    while (1) {</div><div class='add'>+        ret = quota_conf_read_gfid(fd, buf, &amp;gfid_type_stored, version);</div><div class='add'>+        if (ret &lt;= 0)</div><div class='add'>+            break;</div><div class='add'>+</div><div class='add'>+        if (gfid_type_stored == gfid_type) {</div><div class='add'>+            limits_set = _gf_true;</div><div class='add'>+            break;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+out:</div><div class='add'>+    if (fd != -1)</div><div class='add'>+        sys_close(fd);</div><div class='add'>+</div><div class='add'>+    return limits_set;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-cli_cmd_volume_defrag_cbk (struct cli_state *state, struct cli_cmd_word *word,</div><div class='del'>-                           const char **words, int wordcount)</div><div class='add'>+cli_cmd_quota_handle_list_all(const char **words, dict_t *options)</div><div class='ctx'> {</div><div class='del'>-        int                   ret     = -1;</div><div class='del'>-        rpc_clnt_procedure_t *proc    = NULL;</div><div class='del'>-        call_frame_t         *frame   = NULL;</div><div class='del'>-        dict_t               *dict = NULL;</div><div class='add'>+    int all_failed = 1;</div><div class='add'>+    int count = 0;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    rpc_clnt_procedure_t *proc = NULL;</div><div class='add'>+    cli_local_t *local = NULL;</div><div class='add'>+    call_frame_t *frame = NULL;</div><div class='add'>+    dict_t *xdata = NULL;</div><div class='add'>+    char gfid_str[UUID_CANONICAL_FORM_LEN + 1];</div><div class='add'>+    char *volname = NULL;</div><div class='add'>+    char *volname_dup = NULL;</div><div class='add'>+    unsigned char buf[16] = {0};</div><div class='add'>+    int fd = -1;</div><div class='add'>+    char quota_conf_file[PATH_MAX] = {0};</div><div class='add'>+    gf_boolean_t xml_err_flag = _gf_false;</div><div class='add'>+    char err_str[NAME_MAX] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int32_t type = 0;</div><div class='add'>+    char gfid_type = 0;</div><div class='add'>+    float version = 0.0f;</div><div class='add'>+    int32_t max_count = 0;</div><div class='add'>+</div><div class='add'>+    xdata = dict_new();</div><div class='add'>+    if (!xdata) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_get_str(options, "volname", &amp;volname);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log("cli", GF_LOG_ERROR, "Failed to get volume name");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_get_int32(options, "type", &amp;type);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log("cli", GF_LOG_ERROR, "Failed to get quota option type");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_set_int32(xdata, "type", type);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log("cli", GF_LOG_ERROR, "Failed to set type in xdata");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = cli_get_soft_limit(options, words, xdata);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log("cli", GF_LOG_ERROR,</div><div class='add'>+               "Failed to fetch default "</div><div class='add'>+               "soft-limit");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Check if at least one limit is set on volume. No need to check for</div><div class='add'>+     * quota enabled as cli_get_soft_limit() handles that</div><div class='add'>+     */</div><div class='add'>+    if (!_limits_set_on_volume(volname, type)) {</div><div class='add'>+        snprintf(err_str, sizeof(err_str),</div><div class='add'>+                 "No%s quota configured on"</div><div class='add'>+                 " volume %s",</div><div class='add'>+                 (type == GF_QUOTA_OPTION_TYPE_LIST) ? "" : " inode", volname);</div><div class='add'>+        if (global_state-&gt;mode &amp; GLUSTER_MODE_XML) {</div><div class='add'>+            xml_err_flag = _gf_true;</div><div class='add'>+        } else {</div><div class='add'>+            cli_out("quota: %s", err_str);</div><div class='add'>+        }</div><div class='add'>+        ret = 0;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    volname_dup = gf_strdup(volname);</div><div class='add'>+    if (!volname_dup) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_set_dynstr(xdata, "volume-uuid", volname_dup);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log("cli", GF_LOG_ERROR, "Failed to set volume-uuid");</div><div class='add'>+        GF_FREE(volname_dup);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    // TODO: fix hardcoding; Need to perform an RPC call to glusterd</div><div class='add'>+    // to fetch working directory</div><div class='add'>+    snprintf(quota_conf_file, sizeof quota_conf_file, "%s/vols/%s/quota.conf",</div><div class='add'>+             GLUSTERD_DEFAULT_WORKDIR, volname);</div><div class='add'>+    fd = open(quota_conf_file, O_RDONLY);</div><div class='add'>+    if (fd == -1) {</div><div class='add'>+        // This may because no limits were yet set on the volume</div><div class='add'>+        gf_log("cli", GF_LOG_TRACE,</div><div class='add'>+               "Unable to open "</div><div class='add'>+               "quota.conf");</div><div class='add'>+        ret = 0;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = quota_conf_read_version(fd, &amp;version);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    frame = create_frame(THIS, THIS-&gt;ctx-&gt;pool);</div><div class='add'>+    if (!frame) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    CLI_LOCAL_INIT(local, words, frame, xdata);</div><div class='add'>+    proc = &amp;cli_quotad_clnt.proctable[GF_AGGREGATOR_GETLIMIT];</div><div class='add'>+</div><div class='add'>+    for (count = 0;; count++) {</div><div class='add'>+        ret = quota_conf_read_gfid(fd, buf, &amp;gfid_type, version);</div><div class='add'>+        if (ret == 0) {</div><div class='add'>+            break;</div><div class='add'>+        } else if (ret &lt; 0) {</div><div class='add'>+            gf_log(THIS-&gt;name, GF_LOG_CRITICAL,</div><div class='add'>+                   "Quota "</div><div class='add'>+                   "configuration store may be corrupt.");</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-        frame = create_frame (THIS, THIS-&gt;ctx-&gt;pool);</div><div class='del'>-        if (!frame)</div><div class='del'>-                goto out;</div><div class='add'>+        if ((type == GF_QUOTA_OPTION_TYPE_LIST &amp;&amp;</div><div class='add'>+             gfid_type == GF_QUOTA_CONF_TYPE_OBJECTS) ||</div><div class='add'>+            (type == GF_QUOTA_OPTION_TYPE_LIST_OBJECTS &amp;&amp;</div><div class='add'>+             gfid_type == GF_QUOTA_CONF_TYPE_USAGE))</div><div class='add'>+            continue;</div><div class='add'>+</div><div class='add'>+        max_count++;</div><div class='add'>+    }</div><div class='add'>+    ret = dict_set_int32(xdata, "max_count", max_count);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log("cli", GF_LOG_ERROR, "Failed to set max_count");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = sys_lseek(fd, 0L, SEEK_SET);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        gf_log(THIS-&gt;name, GF_LOG_ERROR,</div><div class='add'>+               "failed to move offset to "</div><div class='add'>+               "the beginning: %s",</div><div class='add'>+               strerror(errno));</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    ret = quota_conf_read_version(fd, &amp;version);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    for (count = 0;; count++) {</div><div class='add'>+        ret = quota_conf_read_gfid(fd, buf, &amp;gfid_type, version);</div><div class='add'>+        if (ret == 0) {</div><div class='add'>+            break;</div><div class='add'>+        } else if (ret &lt; 0) {</div><div class='add'>+            gf_log(THIS-&gt;name, GF_LOG_CRITICAL,</div><div class='add'>+                   "Quota "</div><div class='add'>+                   "configuration store may be corrupt.");</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-        dict = dict_new ();</div><div class='del'>-        if (!dict)</div><div class='del'>-                goto out;</div><div class='add'>+        if ((type == GF_QUOTA_OPTION_TYPE_LIST &amp;&amp;</div><div class='add'>+             gfid_type == GF_QUOTA_CONF_TYPE_OBJECTS) ||</div><div class='add'>+            (type == GF_QUOTA_OPTION_TYPE_LIST_OBJECTS &amp;&amp;</div><div class='add'>+             gfid_type == GF_QUOTA_CONF_TYPE_USAGE))</div><div class='add'>+            continue;</div><div class='ctx'> </div><div class='del'>-        if (wordcount != 4) {</div><div class='del'>-                cli_cmd_volume_defrag_usage();</div><div class='del'>-                goto out;</div><div class='add'>+        uuid_utoa_r(buf, gfid_str);</div><div class='add'>+        ret = dict_set_str(xdata, "gfid", gfid_str);</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_log("cli", GF_LOG_ERROR, "Failed to set gfid");</div><div class='add'>+            goto out;</div><div class='ctx'>         }</div><div class='ctx'> </div><div class='del'>-        ret = dict_set_str (dict, "volname", (char *)words[2]);</div><div class='del'>-        if (ret)</div><div class='del'>-                goto out;</div><div class='add'>+        ret = proc-&gt;fn(frame, THIS, xdata);</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_log("cli", GF_LOG_ERROR,</div><div class='add'>+                   "Failed to get quota "</div><div class='add'>+                   "limits for %s",</div><div class='add'>+                   uuid_utoa((unsigned char *)buf));</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-        ret = dict_set_str (dict, "command", (char *)words[3]);</div><div class='del'>-        if (ret)</div><div class='del'>-                goto out;</div><div class='add'>+        dict_del(xdata, "gfid");</div><div class='add'>+        all_failed = all_failed &amp;&amp; ret;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (global_state-&gt;mode &amp; GLUSTER_MODE_XML) {</div><div class='add'>+        ret = cli_xml_output_vol_quota_limit_list_end(local);</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_log("cli", GF_LOG_ERROR,</div><div class='add'>+                   "Error in printing "</div><div class='add'>+                   "xml output");</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        proc = &amp;cli_rpc_prog-&gt;proctable[GF1_CLI_DEFRAG_VOLUME];</div><div class='add'>+    if (count &gt; 0) {</div><div class='add'>+        ret = all_failed ? -1 : 0;</div><div class='add'>+    } else {</div><div class='add'>+        ret = 0;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        if (proc-&gt;fn) {</div><div class='del'>-                ret = proc-&gt;fn (frame, THIS, dict);</div><div class='add'>+out:</div><div class='add'>+    if (xml_err_flag) {</div><div class='add'>+        ret = cli_xml_output_str("volQuota", NULL, -1, 0, err_str);</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_log("cli", GF_LOG_ERROR,</div><div class='add'>+                   "Error outputting in "</div><div class='add'>+                   "xml format");</div><div class='ctx'>         }</div><div class='add'>+    }</div><div class='add'>+    if (xdata)</div><div class='add'>+        dict_unref(xdata);</div><div class='add'>+</div><div class='add'>+    if (fd != -1) {</div><div class='add'>+        sys_close(fd);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log("cli", GF_LOG_ERROR,</div><div class='add'>+               "Could not fetch and display quota"</div><div class='add'>+               " limits");</div><div class='add'>+    }</div><div class='add'>+    CLI_STACK_DESTROY(frame);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+cli_cmd_bitrot_cbk(struct cli_state *state, struct cli_cmd_word *word,</div><div class='add'>+                   const char **words, int wordcount)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int parse_err = 0;</div><div class='add'>+    call_frame_t *frame = NULL;</div><div class='add'>+    dict_t *options = NULL;</div><div class='add'>+    cli_local_t *local = NULL;</div><div class='add'>+    rpc_clnt_procedure_t *proc = NULL;</div><div class='add'>+    int sent = 0;</div><div class='add'>+#if (USE_EVENTS)</div><div class='add'>+    int cmd_type = -1;</div><div class='add'>+    int ret1 = -1;</div><div class='add'>+    int event_type = -1;</div><div class='add'>+    char *tmp = NULL;</div><div class='add'>+    char *events_str = NULL;</div><div class='add'>+    char *volname = NULL;</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+    ret = cli_cmd_bitrot_parse(words, wordcount, &amp;options);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        cli_usage_out(word-&gt;pattern);</div><div class='add'>+        parse_err = 1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (ret == 1) {</div><div class='add'>+        /* this is 'volume bitrot help' */</div><div class='add'>+        cli_cmd_bitrot_help_cbk(state, word, words, wordcount);</div><div class='add'>+        ret = 0;</div><div class='add'>+        goto out2;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    frame = create_frame(THIS, THIS-&gt;ctx-&gt;pool);</div><div class='add'>+    if (!frame) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    proc = &amp;cli_rpc_prog-&gt;proctable[GLUSTER_CLI_BITROT];</div><div class='add'>+</div><div class='add'>+    CLI_LOCAL_INIT(local, words, frame, options);</div><div class='add'>+</div><div class='add'>+    if (proc-&gt;fn) {</div><div class='add'>+        ret = proc-&gt;fn(frame, THIS, options);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='ctx'> out:</div><div class='del'>-        if (!proc &amp;&amp; ret) {</div><div class='del'>-                if (dict)</div><div class='del'>-                        dict_destroy (dict);</div><div class='add'>+    if (ret) {</div><div class='add'>+        cli_cmd_sent_status_get(&amp;sent);</div><div class='add'>+        if ((sent == 0) &amp;&amp; (parse_err == 0))</div><div class='add'>+            cli_err(</div><div class='add'>+                "Bit rot command failed. Please check the cli "</div><div class='add'>+                "logs for more details");</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+#if (USE_EVENTS)</div><div class='add'>+    if (ret == 0) {</div><div class='add'>+        ret1 = dict_get_int32(options, "type", &amp;cmd_type);</div><div class='add'>+        if (ret1)</div><div class='add'>+            cmd_type = -1;</div><div class='add'>+        else {</div><div class='add'>+            ret1 = dict_get_str(options, "volname", &amp;volname);</div><div class='add'>+            if (ret1)</div><div class='add'>+                volname = "";</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-                if (wordcount &gt; 2)</div><div class='del'>-                        cli_out ("Rebalance of Volume %s failed",</div><div class='del'>-                                 (char *)words[2]);</div><div class='add'>+        switch (cmd_type) {</div><div class='add'>+            case GF_BITROT_OPTION_TYPE_ENABLE:</div><div class='add'>+                event_type = EVENT_BITROT_ENABLE;</div><div class='add'>+                break;</div><div class='add'>+            case GF_BITROT_OPTION_TYPE_DISABLE:</div><div class='add'>+                event_type = EVENT_BITROT_DISABLE;</div><div class='add'>+                break;</div><div class='add'>+            case GF_BITROT_CMD_SCRUB_ONDEMAND:</div><div class='add'>+                event_type = EVENT_BITROT_SCRUB_ONDEMAND;</div><div class='add'>+                break;</div><div class='add'>+            case GF_BITROT_OPTION_TYPE_SCRUB_THROTTLE:</div><div class='add'>+                event_type = EVENT_BITROT_SCRUB_THROTTLE;</div><div class='add'>+                ret1 = dict_get_str(options, "scrub-throttle-value", &amp;tmp);</div><div class='add'>+                if (ret1)</div><div class='add'>+                    tmp = "";</div><div class='add'>+                gf_asprintf(&amp;events_str, "name=%s;value=%s", volname, tmp);</div><div class='add'>+                break;</div><div class='add'>+            case GF_BITROT_OPTION_TYPE_SCRUB_FREQ:</div><div class='add'>+                event_type = EVENT_BITROT_SCRUB_FREQ;</div><div class='add'>+                ret1 = dict_get_str(options, "scrub-frequency-value", &amp;tmp);</div><div class='add'>+                if (ret1)</div><div class='add'>+                    tmp = "";</div><div class='add'>+                gf_asprintf(&amp;events_str, "name=%s;value=%s", volname, tmp);</div><div class='add'>+                break;</div><div class='add'>+            case GF_BITROT_OPTION_TYPE_SCRUB:</div><div class='add'>+                event_type = EVENT_BITROT_SCRUB_OPTION;</div><div class='add'>+                ret1 = dict_get_str(options, "scrub-value", &amp;tmp);</div><div class='add'>+                if (ret1)</div><div class='add'>+                    tmp = "";</div><div class='add'>+                gf_asprintf(&amp;events_str, "name=%s;value=%s", volname, tmp);</div><div class='add'>+                break;</div><div class='add'>+            default:</div><div class='add'>+                break;</div><div class='ctx'>         }</div><div class='ctx'> </div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='add'>+        if (event_type &gt; -1)</div><div class='add'>+            gf_event(event_type, "%s", events_str);</div><div class='ctx'> </div><div class='add'>+        if (events_str)</div><div class='add'>+            GF_FREE(events_str);</div><div class='add'>+    }</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+    CLI_STACK_DESTROY(frame);</div><div class='add'>+out2:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-cli_cmd_volume_set_cbk (struct cli_state *state, struct cli_cmd_word *word,</div><div class='del'>-                        const char **words, int wordcount)</div><div class='add'>+cli_cmd_quota_cbk(struct cli_state *state, struct cli_cmd_word *word,</div><div class='add'>+                  const char **words, int wordcount)</div><div class='ctx'> {</div><div class='del'>-        cli_cmd_broadcast_response (0);</div><div class='del'>-        return 0;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    int parse_err = 0;</div><div class='add'>+    int32_t type = 0;</div><div class='add'>+    rpc_clnt_procedure_t *proc = NULL;</div><div class='add'>+    call_frame_t *frame = NULL;</div><div class='add'>+    dict_t *options = NULL;</div><div class='add'>+    gf_answer_t answer = GF_ANSWER_NO;</div><div class='add'>+    cli_local_t *local = NULL;</div><div class='add'>+    int sent = 0;</div><div class='add'>+    char *volname = NULL;</div><div class='add'>+    const char *question =</div><div class='add'>+        "Disabling quota will delete all the quota "</div><div class='add'>+        "configuration. Do you want to continue?";</div><div class='add'>+</div><div class='add'>+    // parse **words into options dictionary</div><div class='add'>+    if (strcmp(words[1], "inode-quota") == 0) {</div><div class='add'>+        ret = cli_cmd_inode_quota_parse(words, wordcount, &amp;options);</div><div class='add'>+        if (ret &lt; 0) {</div><div class='add'>+            cli_usage_out(word-&gt;pattern);</div><div class='add'>+            parse_err = 1;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    } else {</div><div class='add'>+        ret = cli_cmd_quota_parse(words, wordcount, &amp;options);</div><div class='add'>+</div><div class='add'>+        if (ret == 1) {</div><div class='add'>+            cli_cmd_quota_help_cbk(state, word, words, wordcount);</div><div class='add'>+            ret = 0;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+        if (ret &lt; 0) {</div><div class='add'>+            cli_usage_out(word-&gt;pattern);</div><div class='add'>+            parse_err = 1;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_get_int32(options, "type", &amp;type);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log("cli", GF_LOG_ERROR, "Failed to get opcode");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    // handle quota-disable and quota-list-all different from others</div><div class='add'>+    switch (type) {</div><div class='add'>+        case GF_QUOTA_OPTION_TYPE_DISABLE:</div><div class='add'>+            answer = cli_cmd_get_confirmation(state, question);</div><div class='add'>+            if (answer == GF_ANSWER_NO)</div><div class='add'>+                goto out;</div><div class='add'>+            break;</div><div class='add'>+        case GF_QUOTA_OPTION_TYPE_LIST:</div><div class='add'>+        case GF_QUOTA_OPTION_TYPE_LIST_OBJECTS:</div><div class='add'>+            if (wordcount != 4)</div><div class='add'>+                break;</div><div class='add'>+            ret = cli_cmd_quota_handle_list_all(words, options);</div><div class='add'>+            goto out;</div><div class='add'>+        default:</div><div class='add'>+            break;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_get_str(options, "volname", &amp;volname);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log("cli", GF_LOG_ERROR, "Failed to get volume name");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    frame = create_frame(THIS, THIS-&gt;ctx-&gt;pool);</div><div class='add'>+    if (!frame) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    CLI_LOCAL_INIT(local, words, frame, options);</div><div class='add'>+    proc = &amp;cli_rpc_prog-&gt;proctable[GLUSTER_CLI_QUOTA];</div><div class='add'>+</div><div class='add'>+    if (proc-&gt;fn)</div><div class='add'>+        ret = proc-&gt;fn(frame, THIS, options);</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (ret) {</div><div class='add'>+        cli_cmd_sent_status_get(&amp;sent);</div><div class='add'>+        if (sent == 0 &amp;&amp; parse_err == 0)</div><div class='add'>+            cli_out(</div><div class='add'>+                "Quota command failed. Please check the cli "</div><div class='add'>+                "logs for more details");</div><div class='add'>+    }</div><div class='add'>+    if (options)</div><div class='add'>+        dict_unref(options);</div><div class='add'>+</div><div class='add'>+    /* Events for Quota */</div><div class='add'>+    if (ret == 0) {</div><div class='add'>+        switch (type) {</div><div class='add'>+            case GF_QUOTA_OPTION_TYPE_ENABLE:</div><div class='add'>+                gf_event(EVENT_QUOTA_ENABLE, "volume=%s", volname);</div><div class='add'>+                break;</div><div class='add'>+            case GF_QUOTA_OPTION_TYPE_DISABLE:</div><div class='add'>+                gf_event(EVENT_QUOTA_DISABLE, "volume=%s", volname);</div><div class='add'>+                break;</div><div class='add'>+            case GF_QUOTA_OPTION_TYPE_LIMIT_USAGE:</div><div class='add'>+                gf_event(EVENT_QUOTA_SET_USAGE_LIMIT,</div><div class='add'>+                         "volume=%s;"</div><div class='add'>+                         "path=%s;limit=%s",</div><div class='add'>+                         volname, words[4], words[5]);</div><div class='add'>+                break;</div><div class='add'>+            case GF_QUOTA_OPTION_TYPE_LIMIT_OBJECTS:</div><div class='add'>+                gf_event(EVENT_QUOTA_SET_OBJECTS_LIMIT,</div><div class='add'>+                         "volume=%s;"</div><div class='add'>+                         "path=%s;limit=%s",</div><div class='add'>+                         volname, words[4], words[5]);</div><div class='add'>+                break;</div><div class='add'>+            case GF_QUOTA_OPTION_TYPE_REMOVE:</div><div class='add'>+                gf_event(EVENT_QUOTA_REMOVE_USAGE_LIMIT,</div><div class='add'>+                         "volume=%s;"</div><div class='add'>+                         "path=%s",</div><div class='add'>+                         volname, words[4]);</div><div class='add'>+                break;</div><div class='add'>+            case GF_QUOTA_OPTION_TYPE_REMOVE_OBJECTS:</div><div class='add'>+                gf_event(EVENT_QUOTA_REMOVE_OBJECTS_LIMIT,</div><div class='add'>+                         "volume=%s;"</div><div class='add'>+                         "path=%s",</div><div class='add'>+                         volname, words[4]);</div><div class='add'>+                break;</div><div class='add'>+            case GF_QUOTA_OPTION_TYPE_ALERT_TIME:</div><div class='add'>+                gf_event(EVENT_QUOTA_ALERT_TIME, "volume=%s;time=%s", volname,</div><div class='add'>+                         words[4]);</div><div class='add'>+                break;</div><div class='add'>+            case GF_QUOTA_OPTION_TYPE_SOFT_TIMEOUT:</div><div class='add'>+                gf_event(EVENT_QUOTA_SOFT_TIMEOUT,</div><div class='add'>+                         "volume=%s;"</div><div class='add'>+                         "soft-timeout=%s",</div><div class='add'>+                         volname, words[4]);</div><div class='add'>+                break;</div><div class='add'>+            case GF_QUOTA_OPTION_TYPE_HARD_TIMEOUT:</div><div class='add'>+                gf_event(EVENT_QUOTA_HARD_TIMEOUT,</div><div class='add'>+                         "volume=%s;"</div><div class='add'>+                         "hard-timeout=%s",</div><div class='add'>+                         volname, words[4]);</div><div class='add'>+                break;</div><div class='add'>+            case GF_QUOTA_OPTION_TYPE_DEFAULT_SOFT_LIMIT:</div><div class='add'>+                gf_event(EVENT_QUOTA_DEFAULT_SOFT_LIMIT,</div><div class='add'>+                         "volume=%s;"</div><div class='add'>+                         "default-soft-limit=%s",</div><div class='add'>+                         volname, words[4]);</div><div class='add'>+                break;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    CLI_STACK_DESTROY(frame);</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-void</div><div class='del'>-cli_cmd_volume_add_brick_usage ()</div><div class='add'>+int</div><div class='add'>+cli_cmd_volume_remove_brick_cbk(struct cli_state *state,</div><div class='add'>+                                struct cli_cmd_word *word, const char **words,</div><div class='add'>+                                int wordcount)</div><div class='ctx'> {</div><div class='del'>-        cli_out ("Usage: volume add-brick &lt;VOLNAME&gt; "</div><div class='del'>-                 "&lt;NEW-BRICK&gt; ...");</div><div class='add'>+    int ret = -1;</div><div class='add'>+    rpc_clnt_procedure_t *proc = NULL;</div><div class='add'>+    call_frame_t *frame = NULL;</div><div class='add'>+    dict_t *options = NULL;</div><div class='add'>+    gf_answer_t answer = GF_ANSWER_NO;</div><div class='add'>+    int brick_count = 0;</div><div class='add'>+    int sent = 0;</div><div class='add'>+    int parse_error = 0;</div><div class='add'>+    int need_question = 0;</div><div class='add'>+    cli_local_t *local = NULL;</div><div class='add'>+    char *volname = NULL;</div><div class='add'>+#if (USE_EVENTS)</div><div class='add'>+    eventtypes_t event = EVENT_LAST;</div><div class='add'>+    char *event_str = NULL;</div><div class='add'>+    int event_ret = -1;</div><div class='add'>+#endif</div><div class='add'>+    int32_t command = GF_OP_CMD_NONE;</div><div class='add'>+    char *question = NULL;</div><div class='add'>+</div><div class='add'>+    ret = cli_cmd_volume_remove_brick_parse(state, words, wordcount, &amp;options,</div><div class='add'>+                                            &amp;need_question, &amp;brick_count,</div><div class='add'>+                                            &amp;command);</div><div class='add'>+    if (ret) {</div><div class='add'>+        cli_usage_out(word-&gt;pattern);</div><div class='add'>+        parse_error = 1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (command == GF_OP_CMD_COMMIT_FORCE) {</div><div class='add'>+        question =</div><div class='add'>+            "Remove-brick force will not migrate files from the "</div><div class='add'>+            "removed bricks, so they will no longer be available"</div><div class='add'>+            " on the volume.\nDo you want to continue?";</div><div class='add'>+    } else if (command == GF_OP_CMD_START) {</div><div class='add'>+        question =</div><div class='add'>+            "It is recommended that remove-brick be run with"</div><div class='add'>+            " cluster.force-migration option disabled to prevent"</div><div class='add'>+            " possible data corruption. Doing so will ensure that"</div><div class='add'>+            " files that receive writes during migration will not"</div><div class='add'>+            " be migrated and will need to be manually copied"</div><div class='add'>+            " after the remove-brick commit operation. Please"</div><div class='add'>+            " check the value of the option and update accordingly."</div><div class='add'>+            " \nDo you want to continue with your current"</div><div class='add'>+            " cluster.force-migration settings?";</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (!brick_count) {</div><div class='add'>+        cli_err("No bricks specified");</div><div class='add'>+        cli_usage_out(word-&gt;pattern);</div><div class='add'>+        parse_error = 1;</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    ret = dict_get_str(options, "volname", &amp;volname);</div><div class='add'>+    if (ret || !volname) {</div><div class='add'>+        gf_log("cli", GF_LOG_ERROR, "Failed to fetch volname");</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+#if (USE_EVENTS)</div><div class='add'>+    event_ret = cli_event_remove_brick_str(options, &amp;event_str, &amp;event);</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+    if (!strcmp(volname, GLUSTER_SHARED_STORAGE)) {</div><div class='add'>+        question =</div><div class='add'>+            "Removing brick from the shared storage volume"</div><div class='add'>+            "(gluster_shared_storage), will affect features "</div><div class='add'>+            "like snapshot scheduler, geo-replication "</div><div class='add'>+            "and NFS-Ganesha. Do you still want to "</div><div class='add'>+            "continue?";</div><div class='add'>+        need_question = _gf_true;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (!(state-&gt;mode &amp; GLUSTER_MODE_SCRIPT) &amp;&amp; need_question) {</div><div class='add'>+        answer = cli_cmd_get_confirmation(state, question);</div><div class='add'>+        if (GF_ANSWER_NO == answer) {</div><div class='add'>+            ret = 0;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    proc = &amp;cli_rpc_prog-&gt;proctable[GLUSTER_CLI_REMOVE_BRICK];</div><div class='add'>+</div><div class='add'>+    frame = create_frame(THIS, THIS-&gt;ctx-&gt;pool);</div><div class='add'>+    if (!frame) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    CLI_LOCAL_INIT(local, words, frame, options);</div><div class='add'>+</div><div class='add'>+    if (proc-&gt;fn) {</div><div class='add'>+        ret = proc-&gt;fn(frame, THIS, options);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (ret) {</div><div class='add'>+        cli_cmd_sent_status_get(&amp;sent);</div><div class='add'>+        if ((sent == 0) &amp;&amp; (parse_error == 0))</div><div class='add'>+            cli_out("Volume remove-brick failed");</div><div class='add'>+    }</div><div class='add'>+#if (USE_EVENTS)</div><div class='add'>+    if (!ret &amp;&amp; !event_ret)</div><div class='add'>+        gf_event(event, "%s", event_str);</div><div class='add'>+    if (event_str)</div><div class='add'>+        GF_FREE(event_str);</div><div class='add'>+</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+    CLI_STACK_DESTROY(frame);</div><div class='add'>+    if (options)</div><div class='add'>+        dict_unref(options);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-cli_cmd_volume_add_brick_cbk (struct cli_state *state,</div><div class='del'>-                              struct cli_cmd_word *word, const char **words,</div><div class='del'>-                              int wordcount)</div><div class='add'>+cli_cmd_volume_reset_brick_cbk(struct cli_state *state,</div><div class='add'>+                               struct cli_cmd_word *word, const char **words,</div><div class='add'>+                               int wordcount)</div><div class='ctx'> {</div><div class='del'>-        int                     ret = -1;</div><div class='del'>-        rpc_clnt_procedure_t    *proc = NULL;</div><div class='del'>-        call_frame_t            *frame = NULL;</div><div class='del'>-        dict_t                  *options = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    rpc_clnt_procedure_t *proc = NULL;</div><div class='add'>+    call_frame_t *frame = NULL;</div><div class='add'>+    dict_t *options = NULL;</div><div class='add'>+    int sent = 0;</div><div class='add'>+    int parse_error = 0;</div><div class='add'>+    cli_local_t *local = NULL;</div><div class='add'>+</div><div class='add'>+#ifdef GF_SOLARIS_HOST_OS</div><div class='add'>+    cli_out("Command not supported on Solaris");</div><div class='add'>+    goto out;</div><div class='add'>+#endif</div><div class='add'>+    proc = &amp;cli_rpc_prog-&gt;proctable[GLUSTER_CLI_RESET_BRICK];</div><div class='ctx'> </div><div class='del'>-        frame = create_frame (THIS, THIS-&gt;ctx-&gt;pool);</div><div class='del'>-        if (!frame)</div><div class='del'>-                goto out;</div><div class='add'>+    ret = cli_cmd_volume_reset_brick_parse(words, wordcount, &amp;options);</div><div class='ctx'> </div><div class='del'>-        ret = cli_cmd_volume_add_brick_parse (words, wordcount, &amp;options);</div><div class='add'>+    if (ret) {</div><div class='add'>+        cli_usage_out(word-&gt;pattern);</div><div class='add'>+        parse_error = 1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='add'>+    if (state-&gt;mode &amp; GLUSTER_MODE_WIGNORE_PARTITION) {</div><div class='add'>+        ret = dict_set_int32(options, "ignore-partition", _gf_true);</div><div class='ctx'>         if (ret) {</div><div class='del'>-                cli_cmd_volume_add_brick_usage ();</div><div class='del'>-                goto out;</div><div class='add'>+            gf_log("cli", GF_LOG_ERROR,</div><div class='add'>+                   "Failed to set ignore-"</div><div class='add'>+                   "partition option");</div><div class='add'>+            goto out;</div><div class='ctx'>         }</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        proc = &amp;cli_rpc_prog-&gt;proctable[GF1_CLI_ADD_BRICK];</div><div class='add'>+    frame = create_frame(THIS, THIS-&gt;ctx-&gt;pool);</div><div class='add'>+    if (!frame) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        if (proc-&gt;fn) {</div><div class='del'>-                ret = proc-&gt;fn (frame, THIS, options);</div><div class='del'>-        }</div><div class='add'>+    CLI_LOCAL_INIT(local, words, frame, options);</div><div class='add'>+</div><div class='add'>+    if (proc-&gt;fn) {</div><div class='add'>+        ret = proc-&gt;fn(frame, THIS, options);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='ctx'> out:</div><div class='del'>-        if (!proc &amp;&amp; ret) {</div><div class='del'>-                if (wordcount &gt; 2) {</div><div class='del'>-                        char *volname = (char *) words[2];</div><div class='del'>-                        cli_out ("Adding brick to Volume %s failed",volname );</div><div class='del'>-                }</div><div class='add'>+    if (ret) {</div><div class='add'>+        cli_cmd_sent_status_get(&amp;sent);</div><div class='add'>+        if ((sent == 0) &amp;&amp; (parse_error == 0))</div><div class='add'>+            cli_out("Volume reset-brick failed");</div><div class='add'>+    } else {</div><div class='add'>+        if (wordcount &gt; 5) {</div><div class='add'>+            gf_event(EVENT_BRICK_RESET_COMMIT,</div><div class='add'>+                     "Volume=%s;source-brick=%s;"</div><div class='add'>+                     "destination-brick=%s",</div><div class='add'>+                     (char *)words[2], (char *)words[3], (char *)words[4]);</div><div class='add'>+        } else {</div><div class='add'>+            gf_event(EVENT_BRICK_RESET_START, "Volume=%s;source-brick=%s",</div><div class='add'>+                     (char *)words[2], (char *)words[3]);</div><div class='ctx'>         }</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='add'>+    }</div><div class='add'>+    CLI_STACK_DESTROY(frame);</div><div class='ctx'> </div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-void</div><div class='del'>-cli_cmd_volume_remove_brick_usage ()</div><div class='add'>+int</div><div class='add'>+cli_cmd_volume_replace_brick_cbk(struct cli_state *state,</div><div class='add'>+                                 struct cli_cmd_word *word, const char **words,</div><div class='add'>+                                 int wordcount)</div><div class='ctx'> {</div><div class='del'>-        cli_out ("Usage: volume remove-brick &lt;VOLNAME&gt; "</div><div class='del'>-                 "&lt;BRICK&gt; ...");</div><div class='add'>+    int ret = -1;</div><div class='add'>+    rpc_clnt_procedure_t *proc = NULL;</div><div class='add'>+    call_frame_t *frame = NULL;</div><div class='add'>+    dict_t *options = NULL;</div><div class='add'>+    int sent = 0;</div><div class='add'>+    int parse_error = 0;</div><div class='add'>+    cli_local_t *local = NULL;</div><div class='add'>+</div><div class='add'>+#ifdef GF_SOLARIS_HOST_OS</div><div class='add'>+    cli_out("Command not supported on Solaris");</div><div class='add'>+    goto out;</div><div class='add'>+#endif</div><div class='add'>+    proc = &amp;cli_rpc_prog-&gt;proctable[GLUSTER_CLI_REPLACE_BRICK];</div><div class='add'>+</div><div class='add'>+    ret = cli_cmd_volume_replace_brick_parse(words, wordcount, &amp;options);</div><div class='add'>+</div><div class='add'>+    if (ret) {</div><div class='add'>+        cli_usage_out(word-&gt;pattern);</div><div class='add'>+        parse_error = 1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    frame = create_frame(THIS, THIS-&gt;ctx-&gt;pool);</div><div class='add'>+    if (!frame) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    CLI_LOCAL_INIT(local, words, frame, options);</div><div class='add'>+</div><div class='add'>+    if (proc-&gt;fn) {</div><div class='add'>+        ret = proc-&gt;fn(frame, THIS, options);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (ret) {</div><div class='add'>+        cli_cmd_sent_status_get(&amp;sent);</div><div class='add'>+        if ((sent == 0) &amp;&amp; (parse_error == 0))</div><div class='add'>+            cli_out("Volume replace-brick failed");</div><div class='add'>+    } else {</div><div class='add'>+        gf_event(EVENT_BRICK_REPLACE,</div><div class='add'>+                 "Volume=%s;source-brick=%s;destination-brick=%s",</div><div class='add'>+                 (char *)words[2], (char *)words[3], (char *)words[4]);</div><div class='add'>+    }</div><div class='add'>+    CLI_STACK_DESTROY(frame);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-cli_cmd_volume_remove_brick_cbk (struct cli_state *state,</div><div class='add'>+cli_cmd_volume_set_transport_cbk(struct cli_state *state,</div><div class='ctx'>                                  struct cli_cmd_word *word, const char **words,</div><div class='ctx'>                                  int wordcount)</div><div class='ctx'> {</div><div class='del'>-        int                     ret = -1;</div><div class='del'>-        rpc_clnt_procedure_t    *proc = NULL;</div><div class='del'>-        call_frame_t            *frame = NULL;</div><div class='del'>-        dict_t                  *options = NULL;</div><div class='del'>-        gf_answer_t             answer = GF_ANSWER_NO;</div><div class='add'>+    cli_cmd_broadcast_response(0);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        const char *question = "Removing brick(s) can result in data loss. "</div><div class='del'>-                               "Do you want to Continue?";</div><div class='add'>+int</div><div class='add'>+cli_cmd_volume_top_cbk(struct cli_state *state, struct cli_cmd_word *word,</div><div class='add'>+                       const char **words, int wordcount)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    rpc_clnt_procedure_t *proc = NULL;</div><div class='add'>+    call_frame_t *frame = NULL;</div><div class='add'>+    dict_t *options = NULL;</div><div class='add'>+    int sent = 0;</div><div class='add'>+    int parse_error = 0;</div><div class='add'>+    cli_local_t *local = NULL;</div><div class='ctx'> </div><div class='del'>-        frame = create_frame (THIS, THIS-&gt;ctx-&gt;pool);</div><div class='del'>-        if (!frame)</div><div class='del'>-                goto out;</div><div class='add'>+    ret = cli_cmd_volume_top_parse(words, wordcount, &amp;options);</div><div class='ctx'> </div><div class='del'>-        ret = cli_cmd_volume_remove_brick_parse (words, wordcount, &amp;options);</div><div class='add'>+    if (ret) {</div><div class='add'>+        parse_error = 1;</div><div class='add'>+        cli_usage_out(word-&gt;pattern);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        if (ret) {</div><div class='del'>-                cli_cmd_volume_remove_brick_usage ();</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='add'>+    proc = &amp;cli_rpc_prog-&gt;proctable[GLUSTER_CLI_TOP_VOLUME];</div><div class='ctx'> </div><div class='del'>-        answer = cli_cmd_get_confirmation (state, question);</div><div class='add'>+    frame = create_frame(THIS, THIS-&gt;ctx-&gt;pool);</div><div class='add'>+    if (!frame) {</div><div class='add'>+        gf_log(THIS-&gt;name, GF_LOG_ERROR, "failed to create frame");</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        if (GF_ANSWER_NO == answer) {</div><div class='del'>-                ret = 0;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='add'>+    CLI_LOCAL_INIT(local, words, frame, options);</div><div class='ctx'> </div><div class='del'>-        proc = &amp;cli_rpc_prog-&gt;proctable[GF1_CLI_REMOVE_BRICK];</div><div class='add'>+    if (proc-&gt;fn) {</div><div class='add'>+        ret = proc-&gt;fn(frame, THIS, options);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        if (proc-&gt;fn) {</div><div class='del'>-                ret = proc-&gt;fn (frame, THIS, options);</div><div class='del'>-        }</div><div class='add'>+out:</div><div class='add'>+    if (ret) {</div><div class='add'>+        cli_cmd_sent_status_get(&amp;sent);</div><div class='add'>+        if ((sent == 0) &amp;&amp; (parse_error == 0))</div><div class='add'>+            cli_out("Volume top failed");</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    CLI_STACK_DESTROY(frame);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+cli_cmd_log_rotate_cbk(struct cli_state *state, struct cli_cmd_word *word,</div><div class='add'>+                       const char **words, int wordcount)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    rpc_clnt_procedure_t *proc = NULL;</div><div class='add'>+    call_frame_t *frame = NULL;</div><div class='add'>+    dict_t *options = NULL;</div><div class='add'>+    int sent = 0;</div><div class='add'>+    int parse_error = 0;</div><div class='add'>+    cli_local_t *local = NULL;</div><div class='add'>+</div><div class='add'>+    if (!((wordcount == 4) || (wordcount == 5))) {</div><div class='add'>+        cli_usage_out(word-&gt;pattern);</div><div class='add'>+        parse_error = 1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (!(strcmp("rotate", words[3]) == 0)) {</div><div class='add'>+        cli_usage_out(word-&gt;pattern);</div><div class='add'>+        parse_error = 1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    proc = &amp;cli_rpc_prog-&gt;proctable[GLUSTER_CLI_LOG_ROTATE];</div><div class='add'>+</div><div class='add'>+    ret = cli_cmd_log_rotate_parse(words, wordcount, &amp;options);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    frame = create_frame(THIS, THIS-&gt;ctx-&gt;pool);</div><div class='add'>+    if (!frame) {</div><div class='add'>+        gf_log(THIS-&gt;name, GF_LOG_ERROR, "failed to create frame");</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    CLI_LOCAL_INIT(local, words, frame, options);</div><div class='add'>+</div><div class='add'>+    if (proc-&gt;fn) {</div><div class='add'>+        ret = proc-&gt;fn(frame, THIS, options);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='ctx'> out:</div><div class='del'>-        if (!proc &amp;&amp; ret) {</div><div class='del'>-                if (wordcount &gt; 2) {</div><div class='del'>-                        char *volname = (char *) words[2];</div><div class='del'>-                        cli_out ("Removing brick from Volume %s failed",volname );</div><div class='del'>-                }</div><div class='add'>+    if (ret) {</div><div class='add'>+        cli_cmd_sent_status_get(&amp;sent);</div><div class='add'>+        if ((sent == 0) &amp;&amp; (parse_error == 0))</div><div class='add'>+            cli_out("Volume log rotate failed");</div><div class='add'>+    }</div><div class='add'>+    CLI_STACK_DESTROY(frame);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#if (SYNCDAEMON_COMPILE)</div><div class='add'>+static int</div><div class='add'>+cli_check_gsync_present()</div><div class='add'>+{</div><div class='add'>+    char buff[PATH_MAX] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    runner_t runner = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    char *ptr = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    ret = setenv("_GLUSTERD_CALLED_", "1", 1);</div><div class='add'>+    if (-1 == ret) {</div><div class='add'>+        gf_log("", GF_LOG_WARNING,</div><div class='add'>+               "setenv syscall failed, hence could"</div><div class='add'>+               "not assert if geo-replication is installed");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    runinit(&amp;runner);</div><div class='add'>+    runner_add_args(&amp;runner, GSYNCD_PREFIX "/gsyncd", "--version", NULL);</div><div class='add'>+    runner_redir(&amp;runner, STDOUT_FILENO, RUN_PIPE);</div><div class='add'>+    ret = runner_start(&amp;runner);</div><div class='add'>+    if (ret == -1) {</div><div class='add'>+        gf_log("", GF_LOG_INFO, "geo-replication not installed");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ptr = fgets(buff, sizeof(buff), runner_chio(&amp;runner, STDOUT_FILENO));</div><div class='add'>+    if (ptr) {</div><div class='add'>+        if (!strstr(buff, "gsyncd")) {</div><div class='add'>+            ret = -1;</div><div class='add'>+            goto out;</div><div class='ctx'>         }</div><div class='del'>-        return ret;</div><div class='add'>+    } else {</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='add'>+    ret = runner_end(&amp;runner);</div><div class='add'>+</div><div class='add'>+    if (ret)</div><div class='add'>+        gf_log("", GF_LOG_ERROR, "geo-replication not installed");</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    gf_log("cli", GF_LOG_DEBUG, "Returning %d", ret);</div><div class='add'>+    return ret ? -1 : 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> void</div><div class='del'>-cli_cmd_volume_replace_brick_usage ()</div><div class='add'>+cli_cmd_check_gsync_exists_cbk(struct cli_cmd *this)</div><div class='ctx'> {</div><div class='del'>-        cli_out("Usage: volume replace-brick &lt;VOLNAME&gt; "</div><div class='del'>-                "(&lt;BRICK&gt; &lt;NEW-BRICK&gt;) start|pause|abort|status");</div><div class='del'>-}</div><div class='add'>+    int ret = 0;</div><div class='ctx'> </div><div class='add'>+    ret = cli_check_gsync_present();</div><div class='add'>+    if (ret)</div><div class='add'>+        this-&gt;disable = _gf_true;</div><div class='add'>+}</div><div class='add'>+#endif</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-cli_cmd_volume_replace_brick_cbk (struct cli_state *state,</div><div class='del'>-                                  struct cli_cmd_word *word,</div><div class='del'>-                                  const char **words,</div><div class='del'>-                                  int wordcount)</div><div class='add'>+cli_cmd_volume_gsync_set_cbk(struct cli_state *state, struct cli_cmd_word *word,</div><div class='add'>+                             const char **words, int wordcount)</div><div class='ctx'> {</div><div class='del'>-        int                     ret = -1;</div><div class='del'>-        rpc_clnt_procedure_t    *proc = NULL;</div><div class='del'>-        call_frame_t            *frame = NULL;</div><div class='del'>-        dict_t                  *options = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    int parse_err = 0;</div><div class='add'>+    dict_t *options = NULL;</div><div class='add'>+    rpc_clnt_procedure_t *proc = NULL;</div><div class='add'>+    call_frame_t *frame = NULL;</div><div class='add'>+    cli_local_t *local = NULL;</div><div class='add'>+    char *errstr = NULL;</div><div class='add'>+#if (USE_EVENTS)</div><div class='add'>+    int ret1 = -1;</div><div class='add'>+    int cmd_type = -1;</div><div class='add'>+    int tmpi = 0;</div><div class='add'>+    char *tmp = NULL;</div><div class='add'>+    char *events_str = NULL;</div><div class='add'>+    int event_type = -1;</div><div class='add'>+#endif</div><div class='ctx'> </div><div class='del'>-        proc = &amp;cli_rpc_prog-&gt;proctable[GF1_CLI_REPLACE_BRICK];</div><div class='add'>+    proc = &amp;cli_rpc_prog-&gt;proctable[GLUSTER_CLI_GSYNC_SET];</div><div class='ctx'> </div><div class='del'>-        frame = create_frame (THIS, THIS-&gt;ctx-&gt;pool);</div><div class='del'>-        if (!frame)</div><div class='del'>-                goto out;</div><div class='add'>+    ret = cli_cmd_gsync_set_parse(state, words, wordcount, &amp;options, &amp;errstr);</div><div class='add'>+    if (ret) {</div><div class='add'>+        if (errstr) {</div><div class='add'>+            cli_err("%s", errstr);</div><div class='add'>+            GF_FREE(errstr);</div><div class='add'>+        } else {</div><div class='add'>+            cli_usage_out(word-&gt;pattern);</div><div class='add'>+        }</div><div class='add'>+        parse_err = 1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        ret = cli_cmd_volume_replace_brick_parse (words, wordcount, &amp;options);</div><div class='add'>+    frame = create_frame(THIS, THIS-&gt;ctx-&gt;pool);</div><div class='add'>+    if (frame == NULL) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        if (ret) {</div><div class='del'>-                cli_cmd_volume_replace_brick_usage ();</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='add'>+    CLI_LOCAL_INIT(local, words, frame, options);</div><div class='ctx'> </div><div class='del'>-        if (proc-&gt;fn) {</div><div class='del'>-                ret = proc-&gt;fn (frame, THIS, options);</div><div class='del'>-        }</div><div class='add'>+    if (proc-&gt;fn)</div><div class='add'>+        ret = proc-&gt;fn(frame, THIS, options);</div><div class='ctx'> </div><div class='ctx'> out:</div><div class='del'>-        if (ret) {</div><div class='del'>-                if (wordcount &gt; 2) {</div><div class='del'>-                        char *volname = (char *) words[2];</div><div class='del'>-                        cli_out ("Replacing brick from Volume %s failed",volname );</div><div class='add'>+    if (ret &amp;&amp; parse_err == 0)</div><div class='add'>+        cli_out(GEOREP " command failed");</div><div class='add'>+</div><div class='add'>+#if (USE_EVENTS)</div><div class='add'>+    if (ret == 0) {</div><div class='add'>+        events_str = gf_strdup("");</div><div class='add'>+</div><div class='add'>+        /* Type of Geo-rep Action - Create, Start etc */</div><div class='add'>+        ret1 = dict_get_int32(options, "type", &amp;cmd_type);</div><div class='add'>+        if (ret1)</div><div class='add'>+            cmd_type = -1;</div><div class='add'>+</div><div class='add'>+        /* Only capture Events for modification commands */</div><div class='add'>+        switch (cmd_type) {</div><div class='add'>+            case GF_GSYNC_OPTION_TYPE_CREATE:</div><div class='add'>+                event_type = EVENT_GEOREP_CREATE;</div><div class='add'>+                break;</div><div class='add'>+            case GF_GSYNC_OPTION_TYPE_START:</div><div class='add'>+                event_type = EVENT_GEOREP_START;</div><div class='add'>+                break;</div><div class='add'>+            case GF_GSYNC_OPTION_TYPE_STOP:</div><div class='add'>+                event_type = EVENT_GEOREP_STOP;</div><div class='add'>+                break;</div><div class='add'>+            case GF_GSYNC_OPTION_TYPE_PAUSE:</div><div class='add'>+                event_type = EVENT_GEOREP_PAUSE;</div><div class='add'>+                break;</div><div class='add'>+            case GF_GSYNC_OPTION_TYPE_RESUME:</div><div class='add'>+                event_type = EVENT_GEOREP_RESUME;</div><div class='add'>+                break;</div><div class='add'>+            case GF_GSYNC_OPTION_TYPE_DELETE:</div><div class='add'>+                event_type = EVENT_GEOREP_DELETE;</div><div class='add'>+                break;</div><div class='add'>+            case GF_GSYNC_OPTION_TYPE_CONFIG:</div><div class='add'>+                ret1 = dict_get_str(options, "subop", &amp;tmp);</div><div class='add'>+                if (ret1)</div><div class='add'>+                    tmp = "";</div><div class='add'>+</div><div class='add'>+                /* For Config Set additionally capture key and value */</div><div class='add'>+                /* For Config Reset capture key */</div><div class='add'>+                if (strcmp(tmp, "set") == 0) {</div><div class='add'>+                    event_type = EVENT_GEOREP_CONFIG_SET;</div><div class='add'>+</div><div class='add'>+                    ret1 = dict_get_str(options, "op_name", &amp;tmp);</div><div class='add'>+                    if (ret1)</div><div class='add'>+                        tmp = "";</div><div class='add'>+</div><div class='add'>+                    gf_asprintf_append(&amp;events_str, "%soption=%s;", events_str,</div><div class='add'>+                                       tmp);</div><div class='add'>+</div><div class='add'>+                    ret1 = dict_get_str(options, "op_value", &amp;tmp);</div><div class='add'>+                    if (ret1)</div><div class='add'>+                        tmp = "";</div><div class='add'>+</div><div class='add'>+                    gf_asprintf_append(&amp;events_str, "%svalue=%s;", events_str,</div><div class='add'>+                                       tmp);</div><div class='add'>+                } else if (strcmp(tmp, "del") == 0) {</div><div class='add'>+                    event_type = EVENT_GEOREP_CONFIG_RESET;</div><div class='add'>+</div><div class='add'>+                    ret1 = dict_get_str(options, "op_name", &amp;tmp);</div><div class='add'>+                    if (ret1)</div><div class='add'>+                        tmp = "";</div><div class='add'>+</div><div class='add'>+                    gf_asprintf_append(&amp;events_str, "%soption=%s;", events_str,</div><div class='add'>+                                       tmp);</div><div class='ctx'>                 }</div><div class='add'>+                break;</div><div class='add'>+            default:</div><div class='add'>+                break;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        if (event_type &gt; -1) {</div><div class='add'>+            /* Capture all optional arguments used */</div><div class='add'>+            ret1 = dict_get_int32(options, "force", &amp;tmpi);</div><div class='add'>+            if (ret1 == 0) {</div><div class='add'>+                gf_asprintf_append(&amp;events_str, "%sforce=%d;", events_str,</div><div class='add'>+                                   tmpi);</div><div class='add'>+            }</div><div class='add'>+            ret1 = dict_get_int32(options, "push_pem", &amp;tmpi);</div><div class='add'>+            if (ret1 == 0) {</div><div class='add'>+                gf_asprintf_append(&amp;events_str, "%spush_pem=%d;", events_str,</div><div class='add'>+                                   tmpi);</div><div class='add'>+            }</div><div class='add'>+            ret1 = dict_get_int32(options, "no_verify", &amp;tmpi);</div><div class='add'>+            if (ret1 == 0) {</div><div class='add'>+                gf_asprintf_append(&amp;events_str, "%sno_verify=%d;", events_str,</div><div class='add'>+                                   tmpi);</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            ret1 = dict_get_int32(options, "ssh_port", &amp;tmpi);</div><div class='add'>+            if (ret1 == 0) {</div><div class='add'>+                gf_asprintf_append(&amp;events_str, "%sssh_port=%d;", events_str,</div><div class='add'>+                                   tmpi);</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            ret1 = dict_get_int32(options, "reset-sync-time", &amp;tmpi);</div><div class='add'>+            if (ret1 == 0) {</div><div class='add'>+                gf_asprintf_append(&amp;events_str, "%sreset_sync_time=%d;",</div><div class='add'>+                                   events_str, tmpi);</div><div class='add'>+            }</div><div class='add'>+            /* Capture Master and Slave Info */</div><div class='add'>+            ret1 = dict_get_str(options, "master", &amp;tmp);</div><div class='add'>+            if (ret1)</div><div class='add'>+                tmp = "";</div><div class='add'>+            gf_asprintf_append(&amp;events_str, "%smaster=%s;", events_str, tmp);</div><div class='add'>+</div><div class='add'>+            ret1 = dict_get_str(options, "slave", &amp;tmp);</div><div class='add'>+            if (ret1)</div><div class='add'>+                tmp = "";</div><div class='add'>+            gf_asprintf_append(&amp;events_str, "%sslave=%s", events_str, tmp);</div><div class='add'>+</div><div class='add'>+            gf_event(event_type, "%s", events_str);</div><div class='ctx'>         }</div><div class='del'>-        return ret;</div><div class='ctx'> </div><div class='add'>+        /* Allocated by gf_strdup and gf_asprintf */</div><div class='add'>+        if (events_str)</div><div class='add'>+            GF_FREE(events_str);</div><div class='add'>+    }</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+    CLI_STACK_DESTROY(frame);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+int</div><div class='add'>+cli_cmd_volume_status_cbk(struct cli_state *state, struct cli_cmd_word *word,</div><div class='add'>+                          const char **words, int wordcount)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    rpc_clnt_procedure_t *proc = NULL;</div><div class='add'>+    call_frame_t *frame = NULL;</div><div class='add'>+    dict_t *dict = NULL;</div><div class='add'>+    uint32_t cmd = 0;</div><div class='add'>+    cli_local_t *local = NULL;</div><div class='add'>+</div><div class='add'>+    ret = cli_cmd_volume_status_parse(words, wordcount, &amp;dict);</div><div class='add'>+</div><div class='add'>+    if (ret) {</div><div class='add'>+        cli_usage_out(word-&gt;pattern);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_get_uint32(dict, "cmd", &amp;cmd);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    if (!(cmd &amp; GF_CLI_STATUS_ALL)) {</div><div class='add'>+        /* for one volume or brick */</div><div class='add'>+        proc = &amp;cli_rpc_prog-&gt;proctable[GLUSTER_CLI_STATUS_VOLUME];</div><div class='add'>+    } else {</div><div class='add'>+        /* volume status all or all detail */</div><div class='add'>+        proc = &amp;cli_rpc_prog-&gt;proctable[GLUSTER_CLI_STATUS_ALL];</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (!proc-&gt;fn) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    frame = create_frame(THIS, THIS-&gt;ctx-&gt;pool);</div><div class='add'>+    if (!frame) {</div><div class='add'>+        gf_log(THIS-&gt;name, GF_LOG_ERROR, "failed to create frame");</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    CLI_LOCAL_INIT(local, words, frame, dict);</div><div class='add'>+</div><div class='add'>+    ret = proc-&gt;fn(frame, THIS, dict);</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    CLI_STACK_DESTROY(frame);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-cli_cmd_volume_set_transport_cbk (struct cli_state *state,</div><div class='del'>-                                  struct cli_cmd_word *word,</div><div class='del'>-                                  const char **words, int wordcount)</div><div class='add'>+cli_get_detail_status(dict_t *dict, int i, cli_volume_status_t *status)</div><div class='ctx'> {</div><div class='del'>-        cli_cmd_broadcast_response (0);</div><div class='del'>-        return 0;</div><div class='add'>+    uint64_t free = 0;</div><div class='add'>+    uint64_t total = 0;</div><div class='add'>+    char key[1024] = {0};</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    snprintf(key, sizeof(key), "brick%d.free", i);</div><div class='add'>+    ret = dict_get_uint64(dict, key, &amp;free);</div><div class='add'>+</div><div class='add'>+    status-&gt;free = gf_uint64_2human_readable(free);</div><div class='add'>+    if (!status-&gt;free)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    snprintf(key, sizeof(key), "brick%d.total", i);</div><div class='add'>+    ret = dict_get_uint64(dict, key, &amp;total);</div><div class='add'>+</div><div class='add'>+    status-&gt;total = gf_uint64_2human_readable(total);</div><div class='add'>+    if (!status-&gt;total)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    snprintf(key, sizeof(key), "brick%d.device", i);</div><div class='add'>+    ret = dict_get_str(dict, key, &amp;(status-&gt;device));</div><div class='add'>+    if (ret)</div><div class='add'>+        status-&gt;device = NULL;</div><div class='add'>+</div><div class='add'>+    snprintf(key, sizeof(key), "brick%d.block_size", i);</div><div class='add'>+    ret = dict_get_uint64(dict, key, &amp;(status-&gt;block_size));</div><div class='add'>+    if (ret) {</div><div class='add'>+        ret = 0;</div><div class='add'>+        status-&gt;block_size = 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    snprintf(key, sizeof(key), "brick%d.mnt_options", i);</div><div class='add'>+    ret = dict_get_str(dict, key, &amp;(status-&gt;mount_options));</div><div class='add'>+    if (ret)</div><div class='add'>+        status-&gt;mount_options = NULL;</div><div class='add'>+</div><div class='add'>+    snprintf(key, sizeof(key), "brick%d.fs_name", i);</div><div class='add'>+    ret = dict_get_str(dict, key, &amp;(status-&gt;fs_name));</div><div class='add'>+    if (ret) {</div><div class='add'>+        ret = 0;</div><div class='add'>+        status-&gt;fs_name = NULL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    snprintf(key, sizeof(key), "brick%d.inode_size", i);</div><div class='add'>+    ret = dict_get_str(dict, key, &amp;(status-&gt;inode_size));</div><div class='add'>+    if (ret)</div><div class='add'>+        status-&gt;inode_size = NULL;</div><div class='add'>+</div><div class='add'>+    snprintf(key, sizeof(key), "brick%d.total_inodes", i);</div><div class='add'>+    ret = dict_get_uint64(dict, key, &amp;(status-&gt;total_inodes));</div><div class='add'>+    if (ret)</div><div class='add'>+        status-&gt;total_inodes = 0;</div><div class='add'>+</div><div class='add'>+    snprintf(key, sizeof(key), "brick%d.free_inodes", i);</div><div class='add'>+    ret = dict_get_uint64(dict, key, &amp;(status-&gt;free_inodes));</div><div class='add'>+    if (ret) {</div><div class='add'>+        ret = 0;</div><div class='add'>+        status-&gt;free_inodes = 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> void</div><div class='del'>-cli_cmd_log_filename_usage ()</div><div class='add'>+cli_print_detailed_status(cli_volume_status_t *status)</div><div class='ctx'> {</div><div class='del'>-        cli_out ("Usage: volume log filename &lt;VOLNAME&gt; [BRICK] &lt;PATH&gt;");</div><div class='add'>+    cli_out("%-20s : %-20s", "Brick", status-&gt;brick);</div><div class='add'>+</div><div class='add'>+    if (status-&gt;online) {</div><div class='add'>+        cli_out("%-20s : %-20d", "TCP Port", status-&gt;port);</div><div class='add'>+        cli_out("%-20s : %-20d", "RDMA Port", status-&gt;rdma_port);</div><div class='add'>+    } else {</div><div class='add'>+        cli_out("%-20s : %-20s", "TCP Port", "N/A");</div><div class='add'>+        cli_out("%-20s : %-20s", "RDMA Port", "N/A");</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    cli_out("%-20s : %-20c", "Online", (status-&gt;online) ? 'Y' : 'N');</div><div class='add'>+    cli_out("%-20s : %-20s", "Pid", status-&gt;pid_str);</div><div class='add'>+</div><div class='add'>+    if (status-&gt;fs_name)</div><div class='add'>+        cli_out("%-20s : %-20s", "File System", status-&gt;fs_name);</div><div class='add'>+    else</div><div class='add'>+        cli_out("%-20s : %-20s", "File System", "N/A");</div><div class='add'>+</div><div class='add'>+    if (status-&gt;device)</div><div class='add'>+        cli_out("%-20s : %-20s", "Device", status-&gt;device);</div><div class='add'>+    else</div><div class='add'>+        cli_out("%-20s : %-20s", "Device", "N/A");</div><div class='add'>+</div><div class='add'>+    if (status-&gt;mount_options) {</div><div class='add'>+        cli_out("%-20s : %-20s", "Mount Options", status-&gt;mount_options);</div><div class='add'>+    } else {</div><div class='add'>+        cli_out("%-20s : %-20s", "Mount Options", "N/A");</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (status-&gt;inode_size) {</div><div class='add'>+        cli_out("%-20s : %-20s", "Inode Size", status-&gt;inode_size);</div><div class='add'>+    } else {</div><div class='add'>+        cli_out("%-20s : %-20s", "Inode Size", "N/A");</div><div class='add'>+    }</div><div class='add'>+    if (status-&gt;free)</div><div class='add'>+        cli_out("%-20s : %-20s", "Disk Space Free", status-&gt;free);</div><div class='add'>+    else</div><div class='add'>+        cli_out("%-20s : %-20s", "Disk Space Free", "N/A");</div><div class='add'>+</div><div class='add'>+    if (status-&gt;total)</div><div class='add'>+        cli_out("%-20s : %-20s", "Total Disk Space", status-&gt;total);</div><div class='add'>+    else</div><div class='add'>+        cli_out("%-20s : %-20s", "Total Disk Space", "N/A");</div><div class='add'>+</div><div class='add'>+    if (status-&gt;total_inodes) {</div><div class='add'>+        cli_out("%-20s : %-20" GF_PRI_INODE, "Inode Count",</div><div class='add'>+                status-&gt;total_inodes);</div><div class='add'>+    } else {</div><div class='add'>+        cli_out("%-20s : %-20s", "Inode Count", "N/A");</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (status-&gt;free_inodes) {</div><div class='add'>+        cli_out("%-20s : %-20" GF_PRI_INODE, "Free Inodes",</div><div class='add'>+                status-&gt;free_inodes);</div><div class='add'>+    } else {</div><div class='add'>+        cli_out("%-20s : %-20s", "Free Inodes", "N/A");</div><div class='add'>+    }</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-cli_cmd_log_filename_cbk (struct cli_state *state, struct cli_cmd_word *word,</div><div class='del'>-                          const char **words, int wordcount)</div><div class='add'>+cli_print_brick_status(cli_volume_status_t *status)</div><div class='ctx'> {</div><div class='del'>-        int                     ret = -1;</div><div class='del'>-        rpc_clnt_procedure_t    *proc = NULL;</div><div class='del'>-        call_frame_t            *frame = NULL;</div><div class='del'>-        dict_t                  *options = NULL;</div><div class='del'>-</div><div class='del'>-        if (!((wordcount == 5) || (wordcount == 6))) {</div><div class='del'>-               cli_cmd_log_filename_usage ();</div><div class='del'>-               goto out;</div><div class='add'>+    int fieldlen = CLI_VOL_STATUS_BRICK_LEN;</div><div class='add'>+    int bricklen = 0;</div><div class='add'>+    char *p = NULL;</div><div class='add'>+    int num_spaces = 0;</div><div class='add'>+</div><div class='add'>+    p = status-&gt;brick;</div><div class='add'>+    bricklen = strlen(p);</div><div class='add'>+    while (bricklen &gt; 0) {</div><div class='add'>+        if (bricklen &gt; fieldlen) {</div><div class='add'>+            cli_out("%.*s", fieldlen, p);</div><div class='add'>+            p += fieldlen;</div><div class='add'>+            bricklen -= fieldlen;</div><div class='add'>+        } else {</div><div class='add'>+            num_spaces = (fieldlen - bricklen) + 1;</div><div class='add'>+            printf("%s", p);</div><div class='add'>+            while (num_spaces-- != 0)</div><div class='add'>+                printf(" ");</div><div class='add'>+            if (status-&gt;port || status-&gt;rdma_port) {</div><div class='add'>+                if (status-&gt;online)</div><div class='add'>+                    cli_out("%-10d%-11d%-8c%-5s", status-&gt;port,</div><div class='add'>+                            status-&gt;rdma_port, status-&gt;online ? 'Y' : 'N',</div><div class='add'>+                            status-&gt;pid_str);</div><div class='add'>+                else</div><div class='add'>+                    cli_out("%-10s%-11s%-8c%-5s", "N/A", "N/A",</div><div class='add'>+                            status-&gt;online ? 'Y' : 'N', status-&gt;pid_str);</div><div class='add'>+            } else</div><div class='add'>+                cli_out("%-10s%-11s%-8c%-5s", "N/A", "N/A",</div><div class='add'>+                        status-&gt;online ? 'Y' : 'N', status-&gt;pid_str);</div><div class='add'>+            bricklen = 0;</div><div class='ctx'>         }</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        proc = &amp;cli_rpc_prog-&gt;proctable[GF1_CLI_LOG_FILENAME];</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        frame = create_frame (THIS, THIS-&gt;ctx-&gt;pool);</div><div class='del'>-        if (!frame)</div><div class='del'>-                goto out;</div><div class='add'>+#define NEEDS_GLFS_HEAL(op)                                                    \</div><div class='add'>+    ((op == GF_SHD_OP_SBRAIN_HEAL_FROM_BIGGER_FILE) ||                         \</div><div class='add'>+     (op == GF_SHD_OP_SBRAIN_HEAL_FROM_LATEST_MTIME) ||                        \</div><div class='add'>+     (op == GF_SHD_OP_SBRAIN_HEAL_FROM_BRICK) ||                               \</div><div class='add'>+     (op == GF_SHD_OP_INDEX_SUMMARY) || (op == GF_SHD_OP_SPLIT_BRAIN_FILES) || \</div><div class='add'>+     (op == GF_SHD_OP_GRANULAR_ENTRY_HEAL_ENABLE) ||                           \</div><div class='add'>+     (op == GF_SHD_OP_HEAL_SUMMARY))</div><div class='ctx'> </div><div class='del'>-        ret = cli_cmd_log_filename_parse (words, wordcount, &amp;options);</div><div class='del'>-        if (ret)</div><div class='del'>-                goto out;</div><div class='add'>+int</div><div class='add'>+cli_launch_glfs_heal(int heal_op, dict_t *options)</div><div class='add'>+{</div><div class='add'>+    char buff[PATH_MAX] = {0};</div><div class='add'>+    runner_t runner = {0};</div><div class='add'>+    char *filename = NULL;</div><div class='add'>+    char *hostname = NULL;</div><div class='add'>+    char *path = NULL;</div><div class='add'>+    char *volname = NULL;</div><div class='add'>+    char *out = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    runinit(&amp;runner);</div><div class='add'>+    ret = dict_get_str(options, "volname", &amp;volname);</div><div class='add'>+    runner_add_args(&amp;runner, GLFSHEAL_PREFIX "/glfsheal", volname, NULL);</div><div class='add'>+    runner_redir(&amp;runner, STDOUT_FILENO, RUN_PIPE);</div><div class='add'>+</div><div class='add'>+    switch (heal_op) {</div><div class='add'>+        case GF_SHD_OP_INDEX_SUMMARY:</div><div class='add'>+            if (global_state-&gt;mode &amp; GLUSTER_MODE_XML) {</div><div class='add'>+                runner_add_args(&amp;runner, "--xml", NULL);</div><div class='add'>+            }</div><div class='add'>+            break;</div><div class='add'>+        case GF_SHD_OP_SBRAIN_HEAL_FROM_BIGGER_FILE:</div><div class='add'>+            ret = dict_get_str(options, "file", &amp;filename);</div><div class='add'>+            runner_add_args(&amp;runner, "bigger-file", filename, NULL);</div><div class='add'>+            break;</div><div class='add'>+        case GF_SHD_OP_SBRAIN_HEAL_FROM_LATEST_MTIME:</div><div class='add'>+            ret = dict_get_str(options, "file", &amp;filename);</div><div class='add'>+            runner_add_args(&amp;runner, "latest-mtime", filename, NULL);</div><div class='add'>+            break;</div><div class='add'>+        case GF_SHD_OP_SBRAIN_HEAL_FROM_BRICK:</div><div class='add'>+            ret = dict_get_str(options, "heal-source-hostname", &amp;hostname);</div><div class='add'>+            ret = dict_get_str(options, "heal-source-brickpath", &amp;path);</div><div class='add'>+            runner_add_args(&amp;runner, "source-brick", NULL);</div><div class='add'>+            runner_argprintf(&amp;runner, "%s:%s", hostname, path);</div><div class='add'>+            if (dict_get_str(options, "file", &amp;filename) == 0)</div><div class='add'>+                runner_argprintf(&amp;runner, "%s", filename);</div><div class='add'>+            break;</div><div class='add'>+        case GF_SHD_OP_SPLIT_BRAIN_FILES:</div><div class='add'>+            runner_add_args(&amp;runner, "split-brain-info", NULL);</div><div class='add'>+            if (global_state-&gt;mode &amp; GLUSTER_MODE_XML) {</div><div class='add'>+                runner_add_args(&amp;runner, "--xml", NULL);</div><div class='add'>+            }</div><div class='add'>+            break;</div><div class='add'>+        case GF_SHD_OP_GRANULAR_ENTRY_HEAL_ENABLE:</div><div class='add'>+        case GF_SHD_OP_GRANULAR_ENTRY_HEAL_DISABLE:</div><div class='add'>+            runner_add_args(&amp;runner, "granular-entry-heal-op", NULL);</div><div class='add'>+            break;</div><div class='add'>+        case GF_SHD_OP_HEAL_SUMMARY:</div><div class='add'>+            runner_add_args(&amp;runner, "info-summary", NULL);</div><div class='add'>+            if (global_state-&gt;mode &amp; GLUSTER_MODE_XML) {</div><div class='add'>+                runner_add_args(&amp;runner, "--xml", NULL);</div><div class='add'>+            }</div><div class='add'>+            break;</div><div class='add'>+        default:</div><div class='add'>+            ret = -1;</div><div class='add'>+            goto out;</div><div class='add'>+    }</div><div class='add'>+    if (global_state-&gt;mode &amp; GLUSTER_MODE_GLFSHEAL_NOLOG)</div><div class='add'>+        runner_add_args(&amp;runner, "--nolog", NULL);</div><div class='add'>+    ret = runner_start(&amp;runner);</div><div class='add'>+    if (ret == -1)</div><div class='add'>+        goto out;</div><div class='add'>+    while ((</div><div class='add'>+        out = fgets(buff, sizeof(buff), runner_chio(&amp;runner, STDOUT_FILENO)))) {</div><div class='add'>+        printf("%s", out);</div><div class='add'>+    }</div><div class='add'>+    ret = runner_end(&amp;runner);</div><div class='ctx'> </div><div class='del'>-        if (proc-&gt;fn) {</div><div class='del'>-                ret = proc-&gt;fn (frame, THIS, options);</div><div class='del'>-        }</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='add'>+int</div><div class='add'>+cli_cmd_volume_heal_cbk(struct cli_state *state, struct cli_cmd_word *word,</div><div class='add'>+                        const char **words, int wordcount)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    rpc_clnt_procedure_t *proc = NULL;</div><div class='add'>+    call_frame_t *frame = NULL;</div><div class='add'>+    int sent = 0;</div><div class='add'>+    int parse_error = 0;</div><div class='add'>+    dict_t *options = NULL;</div><div class='add'>+    xlator_t *this = NULL;</div><div class='add'>+    cli_local_t *local = NULL;</div><div class='add'>+    int heal_op = 0;</div><div class='add'>+</div><div class='add'>+    this = THIS;</div><div class='add'>+</div><div class='add'>+    if (wordcount &lt; 3) {</div><div class='add'>+        cli_usage_out(word-&gt;pattern);</div><div class='add'>+        parse_error = 1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = cli_cmd_volume_heal_options_parse(words, wordcount, &amp;options);</div><div class='add'>+    if (ret) {</div><div class='add'>+        cli_usage_out(word-&gt;pattern);</div><div class='add'>+        parse_error = 1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    ret = dict_get_int32(options, "heal-op", &amp;heal_op);</div><div class='add'>+    if (ret &lt; 0)</div><div class='add'>+        goto out;</div><div class='add'>+    if (NEEDS_GLFS_HEAL(heal_op)) {</div><div class='add'>+        ret = cli_launch_glfs_heal(heal_op, options);</div><div class='add'>+        if (ret &lt; 0)</div><div class='add'>+            goto out;</div><div class='add'>+        if (heal_op != GF_SHD_OP_GRANULAR_ENTRY_HEAL_ENABLE)</div><div class='add'>+            goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    proc = &amp;cli_rpc_prog-&gt;proctable[GLUSTER_CLI_HEAL_VOLUME];</div><div class='add'>+</div><div class='add'>+    frame = create_frame(this, this-&gt;ctx-&gt;pool);</div><div class='add'>+    if (!frame) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    CLI_LOCAL_INIT(local, words, frame, options);</div><div class='add'>+</div><div class='add'>+    if (proc-&gt;fn) {</div><div class='add'>+        ret = proc-&gt;fn(frame, THIS, options);</div><div class='add'>+    }</div><div class='ctx'> out:</div><div class='del'>-        if (ret)</div><div class='del'>-                cli_out ("setting log filename failed");</div><div class='add'>+    if (ret) {</div><div class='add'>+        cli_cmd_sent_status_get(&amp;sent);</div><div class='add'>+        if ((sent == 0) &amp;&amp; (parse_error == 0) &amp;&amp;</div><div class='add'>+            !(global_state-&gt;mode &amp; GLUSTER_MODE_XML)) {</div><div class='add'>+            cli_out("Volume heal failed.");</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        if (options)</div><div class='del'>-                dict_destroy (options);</div><div class='add'>+    if (options)</div><div class='add'>+        dict_unref(options);</div><div class='ctx'> </div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='add'>+    CLI_STACK_DESTROY(frame);</div><div class='ctx'> </div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-void</div><div class='del'>-cli_cmd_log_locate_usage ()</div><div class='add'>+int</div><div class='add'>+cli_cmd_volume_statedump_cbk(struct cli_state *state, struct cli_cmd_word *word,</div><div class='add'>+                             const char **words, int wordcount)</div><div class='ctx'> {</div><div class='del'>-        cli_out ("Usage: volume log locate &lt;VOLNAME&gt; [BRICK]");</div><div class='add'>+    int ret = -1;</div><div class='add'>+    rpc_clnt_procedure_t *proc = NULL;</div><div class='add'>+    call_frame_t *frame = NULL;</div><div class='add'>+    dict_t *options = NULL;</div><div class='add'>+    int sent = 0;</div><div class='add'>+    int parse_error = 0;</div><div class='add'>+    cli_local_t *local = NULL;</div><div class='add'>+</div><div class='add'>+    if (wordcount &lt; 3) {</div><div class='add'>+        cli_usage_out(word-&gt;pattern);</div><div class='add'>+        parse_error = 1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (wordcount &gt;= 3) {</div><div class='add'>+        ret = cli_cmd_volume_statedump_options_parse(words, wordcount,</div><div class='add'>+                                                     &amp;options);</div><div class='add'>+        if (ret) {</div><div class='add'>+            parse_error = 1;</div><div class='add'>+            gf_log("cli", GF_LOG_ERROR,</div><div class='add'>+                   "Error parsing "</div><div class='add'>+                   "statedump options");</div><div class='add'>+            cli_out("Error parsing options");</div><div class='add'>+            cli_usage_out(word-&gt;pattern);</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_set_str(options, "volname", (char *)words[2]);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    proc = &amp;cli_rpc_prog-&gt;proctable[GLUSTER_CLI_STATEDUMP_VOLUME];</div><div class='add'>+</div><div class='add'>+    frame = create_frame(THIS, THIS-&gt;ctx-&gt;pool);</div><div class='add'>+    if (!frame) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    CLI_LOCAL_INIT(local, words, frame, options);</div><div class='add'>+</div><div class='add'>+    if (proc-&gt;fn) {</div><div class='add'>+        ret = proc-&gt;fn(frame, THIS, options);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (ret) {</div><div class='add'>+        cli_cmd_sent_status_get(&amp;sent);</div><div class='add'>+        if ((sent == 0) &amp;&amp; (parse_error == 0))</div><div class='add'>+            cli_out("Volume statedump failed");</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    CLI_STACK_DESTROY(frame);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-cli_cmd_log_locate_cbk (struct cli_state *state, struct cli_cmd_word *word,</div><div class='add'>+cli_cmd_volume_list_cbk(struct cli_state *state, struct cli_cmd_word *word,</div><div class='ctx'>                         const char **words, int wordcount)</div><div class='ctx'> {</div><div class='del'>-        int                     ret = -1;</div><div class='del'>-        rpc_clnt_procedure_t    *proc = NULL;</div><div class='del'>-        call_frame_t            *frame = NULL;</div><div class='del'>-        dict_t                  *options = NULL;</div><div class='del'>-</div><div class='del'>-        if (!((wordcount == 4) || (wordcount == 5))) {</div><div class='del'>-               cli_cmd_log_locate_usage ();</div><div class='del'>-               goto out;</div><div class='del'>-        }</div><div class='add'>+    int ret = -1;</div><div class='add'>+    call_frame_t *frame = NULL;</div><div class='add'>+    rpc_clnt_procedure_t *proc = NULL;</div><div class='add'>+    int sent = 0;</div><div class='add'>+</div><div class='add'>+    proc = &amp;cli_rpc_prog-&gt;proctable[GLUSTER_CLI_LIST_VOLUME];</div><div class='add'>+    if (proc-&gt;fn) {</div><div class='add'>+        frame = create_frame(THIS, THIS-&gt;ctx-&gt;pool);</div><div class='add'>+        if (!frame)</div><div class='add'>+            goto out;</div><div class='add'>+        ret = proc-&gt;fn(frame, THIS, NULL);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        proc = &amp;cli_rpc_prog-&gt;proctable[GF1_CLI_LOG_LOCATE];</div><div class='add'>+out:</div><div class='add'>+    if (ret) {</div><div class='add'>+        cli_cmd_sent_status_get(&amp;sent);</div><div class='add'>+        if (sent == 0)</div><div class='add'>+            cli_out("Volume list failed");</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        frame = create_frame (THIS, THIS-&gt;ctx-&gt;pool);</div><div class='del'>-        if (!frame)</div><div class='del'>-                goto out;</div><div class='add'>+    CLI_STACK_DESTROY(frame);</div><div class='ctx'> </div><div class='del'>-        ret = cli_cmd_log_locate_parse (words, wordcount, &amp;options);</div><div class='del'>-        if (ret)</div><div class='del'>-                goto out;</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        if (proc-&gt;fn) {</div><div class='del'>-                ret = proc-&gt;fn (frame, THIS, options);</div><div class='del'>-        }</div><div class='add'>+int</div><div class='add'>+cli_cmd_volume_clearlocks_cbk(struct cli_state *state,</div><div class='add'>+                              struct cli_cmd_word *word, const char **words,</div><div class='add'>+                              int wordcount)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    rpc_clnt_procedure_t *proc = NULL;</div><div class='add'>+    call_frame_t *frame = NULL;</div><div class='add'>+    dict_t *options = NULL;</div><div class='add'>+    int sent = 0;</div><div class='add'>+    int parse_error = 0;</div><div class='add'>+    cli_local_t *local = NULL;</div><div class='add'>+</div><div class='add'>+    if (wordcount &lt; 7 || wordcount &gt; 8) {</div><div class='add'>+        cli_usage_out(word-&gt;pattern);</div><div class='add'>+        parse_error = 1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = cli_cmd_volume_clrlks_opts_parse(words, wordcount, &amp;options);</div><div class='add'>+    if (ret) {</div><div class='add'>+        parse_error = 1;</div><div class='add'>+        gf_log("cli", GF_LOG_ERROR,</div><div class='add'>+               "Error parsing "</div><div class='add'>+               "clear-locks options");</div><div class='add'>+        cli_out("Error parsing options");</div><div class='add'>+        cli_usage_out(word-&gt;pattern);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_set_str(options, "volname", (char *)words[2]);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    ret = dict_set_str(options, "path", (char *)words[3]);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    proc = &amp;cli_rpc_prog-&gt;proctable[GLUSTER_CLI_CLRLOCKS_VOLUME];</div><div class='add'>+</div><div class='add'>+    frame = create_frame(THIS, THIS-&gt;ctx-&gt;pool);</div><div class='add'>+    if (!frame) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    CLI_LOCAL_INIT(local, words, frame, options);</div><div class='add'>+</div><div class='add'>+    if (proc-&gt;fn) {</div><div class='add'>+        ret = proc-&gt;fn(frame, THIS, options);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='ctx'> out:</div><div class='del'>-        if (ret)</div><div class='del'>-                cli_out ("getting log file location information failed");</div><div class='del'>-</div><div class='del'>-        if (options)</div><div class='del'>-                dict_destroy (options);</div><div class='add'>+    if (ret) {</div><div class='add'>+        cli_cmd_sent_status_get(&amp;sent);</div><div class='add'>+        if ((sent == 0) &amp;&amp; (parse_error == 0))</div><div class='add'>+            cli_out("Volume clear-locks failed");</div><div class='add'>+    }</div><div class='ctx'> </div><div class='add'>+    CLI_STACK_DESTROY(frame);</div><div class='ctx'> </div><div class='del'>-        return ret;</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-void</div><div class='del'>-cli_cmd_log_rotate_usage ()</div><div class='add'>+int</div><div class='add'>+cli_cmd_volume_barrier_cbk(struct cli_state *state, struct cli_cmd_word *word,</div><div class='add'>+                           const char **words, int wordcount)</div><div class='ctx'> {</div><div class='del'>-        cli_out ("Usage: volume log rotate &lt;VOLNAME&gt; [BRICK]");</div><div class='add'>+    int ret = -1;</div><div class='add'>+    rpc_clnt_procedure_t *proc = NULL;</div><div class='add'>+    call_frame_t *frame = NULL;</div><div class='add'>+    dict_t *options = NULL;</div><div class='add'>+    int sent = 0;</div><div class='add'>+    int parse_error = 0;</div><div class='add'>+    cli_local_t *local = NULL;</div><div class='add'>+</div><div class='add'>+    if (wordcount != 4) {</div><div class='add'>+        cli_usage_out(word-&gt;pattern);</div><div class='add'>+        parse_error = 1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    options = dict_new();</div><div class='add'>+    if (!options) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    ret = dict_set_str(options, "volname", (char *)words[2]);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    ret = dict_set_str(options, "barrier", (char *)words[3]);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    proc = &amp;cli_rpc_prog-&gt;proctable[GLUSTER_CLI_BARRIER_VOLUME];</div><div class='add'>+</div><div class='add'>+    frame = create_frame(THIS, THIS-&gt;ctx-&gt;pool);</div><div class='add'>+    if (!frame) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    CLI_LOCAL_INIT(local, words, frame, options);</div><div class='add'>+</div><div class='add'>+    if (proc-&gt;fn)</div><div class='add'>+        ret = proc-&gt;fn(frame, THIS, options);</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (ret) {</div><div class='add'>+        cli_cmd_sent_status_get(&amp;sent);</div><div class='add'>+        if ((sent == 0) &amp;&amp; (parse_error == 0))</div><div class='add'>+            cli_err("Volume barrier failed");</div><div class='add'>+    }</div><div class='add'>+    CLI_STACK_DESTROY(frame);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-cli_cmd_log_rotate_cbk (struct cli_state *state, struct cli_cmd_word *word,</div><div class='del'>-                        const char **words, int wordcount)</div><div class='add'>+cli_cmd_volume_getopt_cbk(struct cli_state *state, struct cli_cmd_word *word,</div><div class='add'>+                          const char **words, int wordcount)</div><div class='ctx'> {</div><div class='del'>-        int                     ret = -1;</div><div class='del'>-        rpc_clnt_procedure_t    *proc = NULL;</div><div class='del'>-        call_frame_t            *frame = NULL;</div><div class='del'>-        dict_t                  *options = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    rpc_clnt_procedure_t *proc = NULL;</div><div class='add'>+    call_frame_t *frame = NULL;</div><div class='add'>+    dict_t *options = NULL;</div><div class='add'>+    int sent = 0;</div><div class='add'>+    int parse_err = 0;</div><div class='add'>+    cli_local_t *local = NULL;</div><div class='ctx'> </div><div class='del'>-        if (!((wordcount == 4) || (wordcount == 5))) {</div><div class='del'>-               cli_cmd_log_rotate_usage ();</div><div class='del'>-               goto out;</div><div class='del'>-        }</div><div class='add'>+    if (wordcount != 4) {</div><div class='add'>+        cli_usage_out(word-&gt;pattern);</div><div class='add'>+        parse_err = 1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        proc = &amp;cli_rpc_prog-&gt;proctable[GF1_CLI_LOG_ROTATE];</div><div class='add'>+    options = dict_new();</div><div class='add'>+    if (!options)</div><div class='add'>+        goto out;</div><div class='ctx'> </div><div class='del'>-        frame = create_frame (THIS, THIS-&gt;ctx-&gt;pool);</div><div class='del'>-        if (!frame)</div><div class='del'>-                goto out;</div><div class='add'>+    ret = dict_set_str(options, "volname", (char *)words[2]);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='ctx'> </div><div class='del'>-        ret = cli_cmd_log_rotate_parse (words, wordcount, &amp;options);</div><div class='del'>-        if (ret)</div><div class='del'>-                goto out;</div><div class='add'>+    ret = dict_set_str(options, "key", (char *)words[3]);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='ctx'> </div><div class='del'>-        if (proc-&gt;fn) {</div><div class='del'>-                ret = proc-&gt;fn (frame, THIS, options);</div><div class='del'>-        }</div><div class='add'>+    proc = &amp;cli_rpc_prog-&gt;proctable[GLUSTER_CLI_GET_VOL_OPT];</div><div class='ctx'> </div><div class='del'>-out:</div><div class='del'>-        if (ret)</div><div class='del'>-                cli_out ("log rotate failed");</div><div class='add'>+    frame = create_frame(THIS, THIS-&gt;ctx-&gt;pool);</div><div class='add'>+    if (!frame) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    CLI_LOCAL_INIT(local, words, frame, options);</div><div class='ctx'> </div><div class='del'>-        if (options)</div><div class='del'>-                dict_destroy (options);</div><div class='add'>+    if (proc-&gt;fn)</div><div class='add'>+        ret = proc-&gt;fn(frame, THIS, options);</div><div class='ctx'> </div><div class='del'>-        return ret;</div><div class='add'>+out:</div><div class='add'>+    if (ret) {</div><div class='add'>+        cli_cmd_sent_status_get(&amp;sent);</div><div class='add'>+        if ((sent == 0) &amp;&amp; (parse_err == 0))</div><div class='add'>+            cli_err("Volume get option failed");</div><div class='add'>+    }</div><div class='add'>+    CLI_STACK_DESTROY(frame);</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+/* This is a bit of a hack to display the help. The current bitrot cmd</div><div class='add'>+ * format does not work well when registering the cmds.</div><div class='add'>+ * Ideally the should have been of the form</div><div class='add'>+ * gluster volume bitrot &lt;subcommand&gt; &lt;volumename&gt; ...</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+struct cli_cmd bitrot_cmds[] = {</div><div class='add'>+</div><div class='add'>+    {"volume bitrot help", cli_cmd_bitrot_help_cbk,</div><div class='add'>+     "display help for volume bitrot commands"},</div><div class='add'>+</div><div class='add'>+    {"volume bitrot &lt;VOLNAME&gt; {enable|disable}", NULL, /*cli_cmd_bitrot_cbk,*/</div><div class='add'>+     "Enable/disable bitrot for volume &lt;VOLNAME&gt;"},</div><div class='add'>+</div><div class='add'>+    {"volume bitrot &lt;VOLNAME&gt; signing-time &lt;time-in-secs&gt;",</div><div class='add'>+     NULL, /*cli_cmd_bitrot_cbk,*/</div><div class='add'>+     "Waiting time for an object after last fd is closed to start signing "</div><div class='add'>+     "process"},</div><div class='add'>+</div><div class='add'>+    {"volume bitrot &lt;VOLNAME&gt; signer-threads &lt;count&gt;",</div><div class='add'>+     NULL, /*cli_cmd_bitrot_cbk,*/</div><div class='add'>+     "Number of signing process threads. Usually set to number of available "</div><div class='add'>+     "cores"},</div><div class='add'>+</div><div class='add'>+    {"volume bitrot &lt;VOLNAME&gt; scrub-throttle {lazy|normal|aggressive}",</div><div class='add'>+     NULL, /*cli_cmd_bitrot_cbk,*/</div><div class='add'>+     "Set the speed of the scrubber for volume &lt;VOLNAME&gt;"},</div><div class='add'>+</div><div class='add'>+    {"volume bitrot &lt;VOLNAME&gt; scrub-frequency {hourly|daily|weekly|biweekly"</div><div class='add'>+     "|monthly}",</div><div class='add'>+     NULL, /*cli_cmd_bitrot_cbk,*/</div><div class='add'>+     "Set the frequency of the scrubber for volume &lt;VOLNAME&gt;"},</div><div class='add'>+</div><div class='add'>+    {"volume bitrot &lt;VOLNAME&gt; scrub {pause|resume|status|ondemand}",</div><div class='add'>+     NULL, /*cli_cmd_bitrot_cbk,*/</div><div class='add'>+     "Pause/resume the scrubber for &lt;VOLNAME&gt;. Status displays the status of "</div><div class='add'>+     "the scrubber. ondemand starts the scrubber immediately."},</div><div class='add'>+</div><div class='add'>+    {"volume bitrot &lt;VOLNAME&gt; {enable|disable}\n"</div><div class='add'>+     "volume bitrot &lt;VOLNAME&gt; signing-time &lt;time-in-secs&gt;\n"</div><div class='add'>+     "volume bitrot &lt;VOLNAME&gt; signer-threads &lt;count&gt;\n"</div><div class='add'>+     "volume bitrot &lt;volname&gt; scrub-throttle {lazy|normal|aggressive}\n"</div><div class='add'>+     "volume bitrot &lt;volname&gt; scrub-frequency {hourly|daily|weekly|biweekly"</div><div class='add'>+     "|monthly}\n"</div><div class='add'>+     "volume bitrot &lt;volname&gt; scrub {pause|resume|status|ondemand}",</div><div class='add'>+     cli_cmd_bitrot_cbk, NULL},</div><div class='add'>+</div><div class='add'>+    {NULL, NULL, NULL}};</div><div class='add'>+</div><div class='add'>+struct cli_cmd quota_cmds[] = {</div><div class='add'>+</div><div class='add'>+    /* Quota commands */</div><div class='add'>+    {"volume quota help", cli_cmd_quota_help_cbk,</div><div class='add'>+     "display help for volume quota commands"},</div><div class='add'>+</div><div class='add'>+    {"volume quota &lt;VOLNAME&gt; {enable|disable|list [&lt;path&gt; ...]| "</div><div class='add'>+     "list-objects [&lt;path&gt; ...] | remove &lt;path&gt;| remove-objects &lt;path&gt; | "</div><div class='add'>+     "default-soft-limit &lt;percent&gt;}",</div><div class='add'>+     cli_cmd_quota_cbk, "Enable/disable and configure quota for &lt;VOLNAME&gt;"},</div><div class='add'>+</div><div class='add'>+    {"volume quota &lt;VOLNAME&gt; {limit-usage &lt;path&gt; &lt;size&gt; [&lt;percent&gt;]}",</div><div class='add'>+     cli_cmd_quota_cbk, "Set maximum size for &lt;path&gt; for &lt;VOLNAME&gt;"},</div><div class='add'>+</div><div class='add'>+    {"volume quota &lt;VOLNAME&gt; {limit-objects &lt;path&gt; &lt;number&gt; [&lt;percent&gt;]}",</div><div class='add'>+     cli_cmd_quota_cbk,</div><div class='add'>+     "Set the maximum number of entries allowed in &lt;path&gt; for &lt;VOLNAME&gt;"},</div><div class='add'>+</div><div class='add'>+    {"volume quota &lt;VOLNAME&gt; {alert-time|soft-timeout|hard-timeout} {&lt;time&gt;}",</div><div class='add'>+     cli_cmd_quota_cbk, "Set quota timeout for &lt;VOLNAME&gt;"},</div><div class='add'>+</div><div class='add'>+    {"volume inode-quota &lt;VOLNAME&gt; enable", cli_cmd_quota_cbk,</div><div class='add'>+     "Enable/disable inode-quota for &lt;VOLNAME&gt;"},</div><div class='add'>+</div><div class='add'>+    {"volume quota &lt;VOLNAME&gt; {enable|disable|list [&lt;path&gt; ...]| "</div><div class='add'>+     "list-objects [&lt;path&gt; ...] | remove &lt;path&gt;| remove-objects &lt;path&gt; | "</div><div class='add'>+     "default-soft-limit &lt;percent&gt;}\n"</div><div class='add'>+     "volume quota &lt;VOLNAME&gt; {limit-usage &lt;path&gt; &lt;size&gt; [&lt;percent&gt;]}\n"</div><div class='add'>+     "volume quota &lt;VOLNAME&gt; {limit-objects &lt;path&gt; &lt;number&gt; [&lt;percent&gt;]}\n"</div><div class='add'>+     "volume quota &lt;VOLNAME&gt; {alert-time|soft-timeout|hard-timeout} {&lt;time&gt;}",</div><div class='add'>+     cli_cmd_quota_cbk, NULL},</div><div class='add'>+</div><div class='add'>+    {NULL, NULL, NULL}};</div><div class='ctx'> </div><div class='ctx'> struct cli_cmd volume_cmds[] = {</div><div class='del'>-        { "volume info [all|&lt;VOLNAME&gt;]",</div><div class='del'>-          cli_cmd_volume_info_cbk,</div><div class='del'>-          "list information of all volumes"},</div><div class='add'>+    {"volume help", cli_cmd_volume_help_cbk,</div><div class='add'>+     "display help for volume commands"},</div><div class='add'>+</div><div class='add'>+    {"volume info [all|&lt;VOLNAME&gt;]", cli_cmd_volume_info_cbk,</div><div class='add'>+     "list information of all volumes"},</div><div class='ctx'> </div><div class='del'>-        { "volume create &lt;NEW-VOLNAME&gt; [stripe &lt;COUNT&gt;] [replica &lt;COUNT&gt;] [transport &lt;tcp|rdma&gt;] &lt;NEW-BRICK&gt; ...",</div><div class='del'>-          cli_cmd_volume_create_cbk,</div><div class='del'>-          "create a new volume of specified type with mentioned bricks"},</div><div class='add'>+    {"volume create &lt;NEW-VOLNAME&gt; [stripe &lt;COUNT&gt;] "</div><div class='add'>+     "[[replica &lt;COUNT&gt; [arbiter &lt;COUNT&gt;]]|[replica 2 thin-arbiter 1]] "</div><div class='add'>+     "[disperse [&lt;COUNT&gt;]] [disperse-data &lt;COUNT&gt;] [redundancy &lt;COUNT&gt;] "</div><div class='add'>+     "[transport &lt;tcp|rdma|tcp,rdma&gt;] &lt;NEW-BRICK&gt; &lt;TA-BRICK&gt;"</div><div class='add'>+     "... [force]",</div><div class='ctx'> </div><div class='del'>-        { "volume delete &lt;VOLNAME&gt;",</div><div class='del'>-          cli_cmd_volume_delete_cbk,</div><div class='del'>-          "delete volume specified by &lt;VOLNAME&gt;"},</div><div class='add'>+     cli_cmd_volume_create_cbk,</div><div class='add'>+     "create a new volume of specified type with mentioned bricks"},</div><div class='ctx'> </div><div class='del'>-        { "volume start &lt;VOLNAME&gt;",</div><div class='del'>-          cli_cmd_volume_start_cbk,</div><div class='del'>-          "start volume specified by &lt;VOLNAME&gt;"},</div><div class='add'>+    {"volume delete &lt;VOLNAME&gt;", cli_cmd_volume_delete_cbk,</div><div class='add'>+     "delete volume specified by &lt;VOLNAME&gt;"},</div><div class='ctx'> </div><div class='del'>-        { "volume stop &lt;VOLNAME&gt; [force]",</div><div class='del'>-          cli_cmd_volume_stop_cbk,</div><div class='del'>-          "stop volume specified by &lt;VOLNAME&gt;"},</div><div class='add'>+    {"volume start &lt;VOLNAME&gt; [force]", cli_cmd_volume_start_cbk,</div><div class='add'>+     "start volume specified by &lt;VOLNAME&gt;"},</div><div class='ctx'> </div><div class='del'>-        { "volume rename &lt;VOLNAME&gt; &lt;NEW-VOLNAME&gt;",</div><div class='del'>-          cli_cmd_volume_rename_cbk,</div><div class='del'>-          "rename volume &lt;VOLNAME&gt; to &lt;NEW-VOLNAME&gt;"},</div><div class='add'>+    {"volume stop &lt;VOLNAME&gt; [force]", cli_cmd_volume_stop_cbk,</div><div class='add'>+     "stop volume specified by &lt;VOLNAME&gt;"},</div><div class='ctx'> </div><div class='del'>-        { "volume add-brick &lt;VOLNAME&gt; [(replica &lt;COUNT&gt;)|(stripe &lt;COUNT&gt;)] &lt;NEW-BRICK&gt; ...",</div><div class='del'>-          cli_cmd_volume_add_brick_cbk,</div><div class='del'>-          "add brick to volume &lt;VOLNAME&gt;"},</div><div class='add'>+    /*{ "volume rename &lt;VOLNAME&gt; &lt;NEW-VOLNAME&gt;",</div><div class='add'>+      cli_cmd_volume_rename_cbk,</div><div class='add'>+      "rename volume &lt;VOLNAME&gt; to &lt;NEW-VOLNAME&gt;"},*/</div><div class='ctx'> </div><div class='del'>-        { "volume remove-brick &lt;VOLNAME&gt; [(replica &lt;COUNT&gt;)|(stripe &lt;COUNT&gt;)] &lt;BRICK&gt; ...",</div><div class='del'>-          cli_cmd_volume_remove_brick_cbk,</div><div class='del'>-          "remove brick from volume &lt;VOLNAME&gt;"},</div><div class='add'>+    {"volume add-brick &lt;VOLNAME&gt; [&lt;stripe|replica&gt; &lt;COUNT&gt; "</div><div class='add'>+     "[arbiter &lt;COUNT&gt;]] &lt;NEW-BRICK&gt; ... [force]",</div><div class='add'>+     cli_cmd_volume_add_brick_cbk, "add brick to volume &lt;VOLNAME&gt;"},</div><div class='ctx'> </div><div class='del'>-        { "volume rebalance &lt;VOLNAME&gt; start",</div><div class='del'>-          cli_cmd_volume_defrag_cbk,</div><div class='del'>-          "start rebalance of volume &lt;VOLNAME&gt;"},</div><div class='add'>+    {"volume remove-brick &lt;VOLNAME&gt; [replica &lt;COUNT&gt;] &lt;BRICK&gt; ..."</div><div class='add'>+     " &lt;start|stop|status|commit|force&gt;",</div><div class='add'>+     cli_cmd_volume_remove_brick_cbk, "remove brick from volume &lt;VOLNAME&gt;"},</div><div class='ctx'> </div><div class='del'>-        { "volume rebalance &lt;VOLNAME&gt; stop",</div><div class='del'>-          cli_cmd_volume_defrag_cbk,</div><div class='del'>-          "stop rebalance of volume &lt;VOLNAME&gt;"},</div><div class='add'>+    {"volume rebalance &lt;VOLNAME&gt; {{fix-layout start} | {start "</div><div class='add'>+     "[force]|stop|status}}",</div><div class='add'>+     cli_cmd_volume_defrag_cbk, "rebalance operations"},</div><div class='ctx'> </div><div class='del'>-        { "volume rebalance &lt;VOLNAME&gt; status",</div><div class='del'>-          cli_cmd_volume_defrag_cbk,</div><div class='del'>-          "rebalance status of volume &lt;VOLNAME&gt;"},</div><div class='add'>+    {"volume replace-brick &lt;VOLNAME&gt; &lt;SOURCE-BRICK&gt; &lt;NEW-BRICK&gt; "</div><div class='add'>+     "{commit force}",</div><div class='add'>+     cli_cmd_volume_replace_brick_cbk, "replace-brick operations"},</div><div class='ctx'> </div><div class='del'>-        { "volume replace-brick &lt;VOLNAME&gt; (&lt;BRICK&gt; &lt;NEW-BRICK&gt;) start|pause|abort|status",</div><div class='del'>-          cli_cmd_volume_replace_brick_cbk,</div><div class='del'>-          "replace-brick operations"},</div><div class='add'>+    /*{ "volume set-transport &lt;VOLNAME&gt; &lt;TRANSPORT-TYPE&gt; [&lt;TRANSPORT-TYPE&gt;]</div><div class='add'>+      ...", cli_cmd_volume_set_transport_cbk, "set transport type for volume</div><div class='add'>+      &lt;VOLNAME&gt;"},*/</div><div class='ctx'> </div><div class='del'>-        { "volume set-transport &lt;VOLNAME&gt; &lt;TRANSPORT-TYPE&gt; [&lt;TRANSPORT-TYPE&gt;] ...",</div><div class='del'>-          cli_cmd_volume_set_transport_cbk,</div><div class='del'>-          "set transport type for volume &lt;VOLNAME&gt;"},</div><div class='add'>+    {"volume set &lt;VOLNAME&gt; &lt;KEY&gt; &lt;VALUE&gt;", cli_cmd_volume_set_cbk,</div><div class='add'>+     "set options for volume &lt;VOLNAME&gt;"},</div><div class='ctx'> </div><div class='del'>-        { "volume set &lt;VOLNAME&gt; &lt;KEY&gt; &lt;VALUE&gt;",</div><div class='del'>-          cli_cmd_volume_set_cbk,</div><div class='del'>-         "set options for volume &lt;VOLNAME&gt;"},</div><div class='add'>+    {"volume set &lt;VOLNAME&gt; group &lt;GROUP&gt;", cli_cmd_volume_set_cbk,</div><div class='add'>+     "This option can be used for setting multiple pre-defined volume options "</div><div class='add'>+     "where group_name is a file under /var/lib/glusterd/groups containing one "</div><div class='add'>+     "key value pair per line"},</div><div class='ctx'> </div><div class='del'>-        { "volume help",</div><div class='del'>-          cli_cmd_volume_help_cbk,</div><div class='del'>-          "display help for the volume command"},</div><div class='add'>+    {"volume log &lt;VOLNAME&gt; rotate [BRICK]", cli_cmd_log_rotate_cbk,</div><div class='add'>+     "rotate the log file for corresponding volume/brick"},</div><div class='ctx'> </div><div class='del'>-        { "volume log filename &lt;VOLNAME&gt; [BRICK] &lt;PATH&gt;",</div><div class='del'>-          cli_cmd_log_filename_cbk,</div><div class='del'>-         "set the log file for corresponding volume/brick"},</div><div class='add'>+    {"volume sync &lt;HOSTNAME&gt; [all|&lt;VOLNAME&gt;]", cli_cmd_sync_volume_cbk,</div><div class='add'>+     "sync the volume information from a peer"},</div><div class='ctx'> </div><div class='del'>-        { "volume log locate &lt;VOLNAME&gt; [BRICK]",</div><div class='del'>-          cli_cmd_log_locate_cbk,</div><div class='del'>-         "locate the log file for corresponding volume/brick"},</div><div class='add'>+    {"volume reset &lt;VOLNAME&gt; [option] [force]", cli_cmd_volume_reset_cbk,</div><div class='add'>+     "reset all the reconfigured options"},</div><div class='ctx'> </div><div class='del'>-        { "volume log rotate &lt;VOLNAME&gt; [BRICK]",</div><div class='del'>-          cli_cmd_log_rotate_cbk,</div><div class='del'>-         "rotate the log file for corresponding volume/brick"},</div><div class='add'>+#if (SYNCDAEMON_COMPILE)</div><div class='add'>+    {"volume " GEOREP " [&lt;MASTER-VOLNAME&gt;] [&lt;SLAVE-IP&gt;]::[&lt;SLAVE-VOLNAME&gt;] {"</div><div class='add'>+     "\\\n create [[ssh-port n] [[no-verify] \\\n | [push-pem]]] [force] \\\n"</div><div class='add'>+     " | start [force] \\\n | stop [force] \\\n | pause [force] \\\n | resume "</div><div class='add'>+     "[force] \\\n"</div><div class='add'>+     " | config [[[\\!]&lt;option&gt;] [&lt;value&gt;]] \\\n | status "</div><div class='add'>+     "[detail] \\\n | delete [reset-sync-time]} ",</div><div class='add'>+     cli_cmd_volume_gsync_set_cbk, "Geo-sync operations",</div><div class='add'>+     cli_cmd_check_gsync_exists_cbk},</div><div class='add'>+#endif</div><div class='ctx'> </div><div class='del'>-        { NULL, NULL, NULL }</div><div class='del'>-};</div><div class='add'>+    {"volume profile &lt;VOLNAME&gt; {start|info [peek|incremental "</div><div class='add'>+     "[peek]|cumulative|clear]|stop} [nfs]",</div><div class='add'>+     cli_cmd_volume_profile_cbk, "volume profile operations"},</div><div class='add'>+</div><div class='add'>+    {"volume top &lt;VOLNAME&gt; {open|read|write|opendir|readdir|clear} [nfs|brick "</div><div class='add'>+     "&lt;brick&gt;] [list-cnt &lt;value&gt;] | "</div><div class='add'>+     "{read-perf|write-perf} [bs &lt;size&gt; count &lt;count&gt;] "</div><div class='add'>+     "[brick &lt;brick&gt;] [list-cnt &lt;value&gt;]",</div><div class='add'>+     cli_cmd_volume_top_cbk, "volume top operations"},</div><div class='add'>+</div><div class='add'>+    {"volume status [all | &lt;VOLNAME&gt; [nfs|shd|&lt;BRICK&gt;|quotad]]"</div><div class='add'>+     " [detail|clients|mem|inode|fd|callpool|tasks|client-list]",</div><div class='add'>+     cli_cmd_volume_status_cbk,</div><div class='add'>+     "display status of all or specified volume(s)/brick"},</div><div class='add'>+</div><div class='add'>+    {"volume heal &lt;VOLNAME&gt; [enable | disable | full |"</div><div class='add'>+     "statistics [heal-count [replica &lt;HOSTNAME:BRICKNAME&gt;]] |"</div><div class='add'>+     "info [summary | split-brain] |"</div><div class='add'>+     "split-brain {bigger-file &lt;FILE&gt; | latest-mtime &lt;FILE&gt; |"</div><div class='add'>+     "source-brick &lt;HOSTNAME:BRICKNAME&gt; [&lt;FILE&gt;]} |"</div><div class='add'>+     "granular-entry-heal {enable | disable}]",</div><div class='add'>+     cli_cmd_volume_heal_cbk,</div><div class='add'>+     "self-heal commands on volume specified by &lt;VOLNAME&gt;"},</div><div class='add'>+</div><div class='add'>+    {"volume statedump &lt;VOLNAME&gt; [[nfs|quotad] [all|mem|iobuf|callpool|"</div><div class='add'>+     "priv|fd|inode|history]... | [client &lt;hostname:process-id&gt;]]",</div><div class='add'>+     cli_cmd_volume_statedump_cbk, "perform statedump on bricks"},</div><div class='add'>+</div><div class='add'>+    {"volume list", cli_cmd_volume_list_cbk, "list all volumes in cluster"},</div><div class='add'>+</div><div class='add'>+    {"volume clear-locks &lt;VOLNAME&gt; &lt;path&gt; kind {blocked|granted|all}"</div><div class='add'>+     "{inode [range]|entry [basename]|posix [range]}",</div><div class='add'>+     cli_cmd_volume_clearlocks_cbk, "Clear locks held on path"},</div><div class='add'>+    {"volume barrier &lt;VOLNAME&gt; {enable|disable}", cli_cmd_volume_barrier_cbk,</div><div class='add'>+     "Barrier/unbarrier file operations on a volume"},</div><div class='add'>+    {"volume get &lt;VOLNAME|all&gt; &lt;key|all&gt;", cli_cmd_volume_getopt_cbk,</div><div class='add'>+     "Get the value of the all options or given option for volume &lt;VOLNAME&gt;"</div><div class='add'>+     " or all option. gluster volume get all all is to get all global "</div><div class='add'>+     "options"},</div><div class='add'>+</div><div class='add'>+    {"volume reset-brick &lt;VOLNAME&gt; &lt;SOURCE-BRICK&gt; {{start} |"</div><div class='add'>+     " {&lt;NEW-BRICK&gt; commit}}",</div><div class='add'>+     cli_cmd_volume_reset_brick_cbk, "reset-brick operations"},</div><div class='add'>+</div><div class='add'>+    {NULL, NULL, NULL}};</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-cli_cmd_volume_help_cbk (struct cli_state *state, struct cli_cmd_word *in_word,</div><div class='del'>-                      const char **words, int wordcount)</div><div class='add'>+cli_cmd_quota_help_cbk(struct cli_state *state, struct cli_cmd_word *in_word,</div><div class='add'>+                       const char **words, int wordcount)</div><div class='ctx'> {</div><div class='del'>-        struct cli_cmd        *cmd = NULL;</div><div class='add'>+    struct cli_cmd *cmd = NULL;</div><div class='add'>+    struct cli_cmd *quota_cmd = NULL;</div><div class='add'>+    int count = 0;</div><div class='add'>+</div><div class='add'>+    cmd = GF_MALLOC(sizeof(quota_cmds), cli_mt_cli_cmd);</div><div class='add'>+    memcpy(cmd, quota_cmds, sizeof(quota_cmds));</div><div class='add'>+    count = (sizeof(quota_cmds) / sizeof(struct cli_cmd));</div><div class='add'>+    cli_cmd_sort(cmd, count);</div><div class='ctx'> </div><div class='del'>-        for (cmd = volume_cmds; cmd-&gt;pattern; cmd++)</div><div class='del'>-                cli_out ("%s - %s", cmd-&gt;pattern, cmd-&gt;desc);</div><div class='add'>+    cli_out("\ngluster quota commands");</div><div class='add'>+    cli_out("=======================\n");</div><div class='ctx'> </div><div class='add'>+    for (quota_cmd = cmd; quota_cmd-&gt;pattern; quota_cmd++)</div><div class='add'>+        if ((_gf_false == quota_cmd-&gt;disable) &amp;&amp; (quota_cmd-&gt;desc))</div><div class='add'>+            cli_out("%s - %s", quota_cmd-&gt;pattern, quota_cmd-&gt;desc);</div><div class='ctx'> </div><div class='del'>-        if (!state-&gt;rl_enabled)</div><div class='del'>-                exit (0);</div><div class='add'>+    cli_out("\n");</div><div class='add'>+    GF_FREE(cmd);</div><div class='ctx'> </div><div class='del'>-        return 0;</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-cli_cmd_volume_register (struct cli_state *state)</div><div class='add'>+cli_cmd_bitrot_help_cbk(struct cli_state *state, struct cli_cmd_word *in_word,</div><div class='add'>+                        const char **words, int wordcount)</div><div class='ctx'> {</div><div class='del'>-        int  ret = 0;</div><div class='del'>-        struct cli_cmd *cmd = NULL;</div><div class='add'>+    struct cli_cmd *cmd = NULL;</div><div class='add'>+    struct cli_cmd *bitrot_cmd = NULL;</div><div class='add'>+    int count = 0;</div><div class='add'>+</div><div class='add'>+    cmd = GF_MALLOC(sizeof(bitrot_cmds), cli_mt_cli_cmd);</div><div class='add'>+    memcpy(cmd, bitrot_cmds, sizeof(bitrot_cmds));</div><div class='add'>+    count = (sizeof(bitrot_cmds) / sizeof(struct cli_cmd));</div><div class='add'>+    cli_cmd_sort(cmd, count);</div><div class='add'>+</div><div class='add'>+    cli_out("\ngluster bitrot commands");</div><div class='add'>+    cli_out("========================\n");</div><div class='add'>+</div><div class='add'>+    for (bitrot_cmd = cmd; bitrot_cmd-&gt;pattern; bitrot_cmd++)</div><div class='add'>+        if ((_gf_false == bitrot_cmd-&gt;disable) &amp;&amp; (bitrot_cmd-&gt;desc))</div><div class='add'>+            cli_out("%s - %s", bitrot_cmd-&gt;pattern, bitrot_cmd-&gt;desc);</div><div class='add'>+</div><div class='add'>+    cli_out("\n");</div><div class='add'>+    GF_FREE(cmd);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+cli_cmd_volume_help_cbk(struct cli_state *state, struct cli_cmd_word *in_word,</div><div class='add'>+                        const char **words, int wordcount)</div><div class='add'>+{</div><div class='add'>+    struct cli_cmd *cmd = NULL;</div><div class='add'>+    struct cli_cmd *vol_cmd = NULL;</div><div class='add'>+    int count = 0;</div><div class='add'>+</div><div class='add'>+    cmd = GF_MALLOC(sizeof(volume_cmds), cli_mt_cli_cmd);</div><div class='add'>+    memcpy(cmd, volume_cmds, sizeof(volume_cmds));</div><div class='add'>+    count = (sizeof(volume_cmds) / sizeof(struct cli_cmd));</div><div class='add'>+    cli_cmd_sort(cmd, count);</div><div class='add'>+</div><div class='add'>+    cli_out("\ngluster volume commands");</div><div class='add'>+    cli_out("========================\n");</div><div class='add'>+</div><div class='add'>+    for (vol_cmd = cmd; vol_cmd-&gt;pattern; vol_cmd++)</div><div class='add'>+        if (_gf_false == vol_cmd-&gt;disable)</div><div class='add'>+            cli_out("%s - %s", vol_cmd-&gt;pattern, vol_cmd-&gt;desc);</div><div class='add'>+</div><div class='add'>+    cli_out("\n");</div><div class='add'>+    GF_FREE(cmd);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+cli_cmd_volume_register(struct cli_state *state)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+    struct cli_cmd *cmd = NULL;</div><div class='add'>+</div><div class='add'>+    for (cmd = volume_cmds; cmd-&gt;pattern; cmd++) {</div><div class='add'>+        ret = cli_cmd_register(&amp;state-&gt;tree, cmd);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    for (cmd = bitrot_cmds; cmd-&gt;pattern; cmd++) {</div><div class='add'>+        ret = cli_cmd_register(&amp;state-&gt;tree, cmd);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    for (cmd = quota_cmds; cmd-&gt;pattern; cmd++) {</div><div class='add'>+        ret = cli_cmd_register(&amp;state-&gt;tree, cmd);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        for (cmd = volume_cmds; cmd-&gt;pattern; cmd++) {</div><div class='del'>-                ret = cli_cmd_register (&amp;state-&gt;tree, cmd-&gt;pattern, cmd-&gt;cbk,</div><div class='del'>-                                        cmd-&gt;desc);</div><div class='del'>-                if (ret)</div><div class='del'>-                        goto out;</div><div class='del'>-        }</div><div class='ctx'> out:</div><div class='del'>-        return ret;</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+gf_asprintf_append(char **string_ptr, const char *format, ...)</div><div class='add'>+{</div><div class='add'>+    va_list arg;</div><div class='add'>+    int rv = 0;</div><div class='add'>+    char *tmp = *string_ptr;</div><div class='add'>+</div><div class='add'>+    va_start(arg, format);</div><div class='add'>+    rv = gf_vasprintf(string_ptr, format, arg);</div><div class='add'>+    va_end(arg);</div><div class='add'>+</div><div class='add'>+    if (tmp)</div><div class='add'>+        GF_FREE(tmp);</div><div class='add'>+</div><div class='add'>+    return rv;</div><div class='ctx'> }</div><div class='head'>diff --git a/cli/src/cli-cmd.c b/cli/src/cli-cmd.c<br/>index 011edacfe90..2d458b16a56 100644<br/>--- a/<a href='/cgit/glusterfs.git/tree/cli/src/cli-cmd.c?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>cli/src/cli-cmd.c</a><br/>+++ b/<a href='/cgit/glusterfs.git/tree/cli/src/cli-cmd.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>cli/src/cli-cmd.c</a></div><div class='hunk'>@@ -1,339 +1,411 @@</div><div class='ctx'> /*</div><div class='del'>-  Copyright (c) 2010 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='del'>-  This file is part of GlusterFS.</div><div class='del'>-</div><div class='del'>-  GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-  it under the terms of the GNU Affero General Public License as published</div><div class='del'>-  by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-  or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-  GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-  WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-  Affero General Public License for more details.</div><div class='del'>-</div><div class='del'>-  You should have received a copy of the GNU Affero General Public License</div><div class='del'>-  along with this program.  If not, see</div><div class='del'>-  &lt;http://www.gnu.org/licenses/&gt;.</div><div class='del'>-*/</div><div class='add'>+   Copyright (c) 2010-2012 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+   This file is part of GlusterFS.</div><div class='ctx'> </div><div class='add'>+   This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+   General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+   later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+   cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='ctx'> #include &lt;stdio.h&gt;</div><div class='ctx'> #include &lt;string.h&gt;</div><div class='ctx'> #include &lt;stdlib.h&gt;</div><div class='ctx'> #include &lt;stdint.h&gt;</div><div class='ctx'> #include &lt;pthread.h&gt;</div><div class='ctx'> </div><div class='del'>-#ifndef _CONFIG_H</div><div class='del'>-#define _CONFIG_H</div><div class='del'>-#include "config.h"</div><div class='del'>-#endif</div><div class='del'>-</div><div class='ctx'> #include "cli.h"</div><div class='ctx'> #include "cli-cmd.h"</div><div class='ctx'> #include "cli-mem-types.h"</div><div class='add'>+#include "protocol-common.h"</div><div class='ctx'> </div><div class='ctx'> #include &lt;fnmatch.h&gt;</div><div class='ctx'> </div><div class='ctx'> static int cmd_done;</div><div class='ctx'> static int cmd_sent;</div><div class='del'>-static pthread_cond_t      cond  = PTHREAD_COND_INITIALIZER;</div><div class='del'>-static pthread_mutex_t     cond_mutex = PTHREAD_MUTEX_INITIALIZER;</div><div class='del'>-static pthread_cond_t      conn  = PTHREAD_COND_INITIALIZER;</div><div class='del'>-static pthread_mutex_t     conn_mutex = PTHREAD_MUTEX_INITIALIZER;</div><div class='add'>+static pthread_cond_t cond = PTHREAD_COND_INITIALIZER;</div><div class='add'>+static pthread_mutex_t cond_mutex = PTHREAD_MUTEX_INITIALIZER;</div><div class='add'>+static pthread_cond_t conn = PTHREAD_COND_INITIALIZER;</div><div class='add'>+static pthread_mutex_t conn_mutex = PTHREAD_MUTEX_INITIALIZER;</div><div class='ctx'> </div><div class='del'>-int    cli_op_ret = 0;</div><div class='del'>-int    connected = 0;</div><div class='add'>+int cli_op_ret = 0;</div><div class='add'>+static gf_boolean_t connected = _gf_false;</div><div class='ctx'> </div><div class='del'>-int cli_cmd_log_help_cbk (struct cli_state *state, struct cli_cmd_word *in_word,</div><div class='del'>-                      const char **words, int wordcount);</div><div class='del'>-</div><div class='del'>-static gf_boolean_t</div><div class='del'>-cli_cmd_needs_connection (struct cli_cmd_word *word)</div><div class='add'>+static unsigned</div><div class='add'>+cli_cmd_needs_connection(struct cli_cmd_word *word)</div><div class='ctx'> {</div><div class='del'>-        if (!strcasecmp ("quit", word-&gt;word))</div><div class='del'>-                return _gf_false;</div><div class='add'>+    if (!strcasecmp("quit", word-&gt;word))</div><div class='add'>+        return 0;</div><div class='ctx'> </div><div class='del'>-        if (!strcasecmp ("help", word-&gt;word))</div><div class='del'>-                return _gf_false;</div><div class='add'>+    if (!strcasecmp("help", word-&gt;word))</div><div class='add'>+        return 0;</div><div class='add'>+</div><div class='add'>+    if (!strcasecmp("getwd", word-&gt;word))</div><div class='add'>+        return 1;</div><div class='add'>+</div><div class='add'>+    if (!strcasecmp("exit", word-&gt;word))</div><div class='add'>+        return 0;</div><div class='ctx'> </div><div class='del'>-        return _gf_true;</div><div class='add'>+    return cli_default_conn_timeout;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-cli_cmd_process (struct cli_state *state, int argc, char **argv)</div><div class='add'>+cli_cmd_status_reset(void)</div><div class='ctx'> {</div><div class='del'>-        int                  ret = 0;</div><div class='del'>-        struct cli_cmd_word *word = NULL;</div><div class='del'>-        struct cli_cmd_word *next = NULL;</div><div class='del'>-        int                  i = 0;</div><div class='del'>-        gf_boolean_t         await_conn = _gf_false;</div><div class='del'>-</div><div class='del'>-        word = &amp;state-&gt;tree.root;</div><div class='del'>-</div><div class='del'>-        if (!argc)</div><div class='del'>-                return 0;</div><div class='del'>-</div><div class='del'>-        for (i = 0; i &lt; argc; i++) {</div><div class='del'>-                next = cli_cmd_nextword (word, argv[i]);</div><div class='del'>-</div><div class='del'>-                word = next;</div><div class='del'>-                if (!word)</div><div class='del'>-                        break;</div><div class='del'>-</div><div class='del'>-                if (word-&gt;cbkfn)</div><div class='del'>-                        break;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (!word) {</div><div class='del'>-                cli_out ("unrecognized word: %s (position %d)",</div><div class='del'>-                         argv[i], i);</div><div class='del'>-                return -1;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (!word-&gt;cbkfn) {</div><div class='del'>-                cli_out ("unrecognized command");</div><div class='del'>-                return -1;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-	if ( strcmp (word-&gt;word,"help")==0 )</div><div class='del'>-		goto callback;</div><div class='del'>-</div><div class='del'>-        await_conn = cli_cmd_needs_connection (word);</div><div class='add'>+    int ret = 0;</div><div class='ctx'> </div><div class='del'>-        if (await_conn) {</div><div class='del'>-                ret = cli_cmd_await_connected ();</div><div class='del'>-                if (ret) {</div><div class='del'>-                        cli_out ("Connection failed. Please check if gluster "</div><div class='del'>-                                  "daemon is operational.");</div><div class='del'>-                        gf_log ("", GF_LOG_NORMAL, "Exiting with: %d", ret);</div><div class='del'>-                        exit (ret);</div><div class='del'>-                }</div><div class='add'>+    ret = cli_cmd_lock();</div><div class='add'>+    {</div><div class='add'>+        if (ret == 0) {</div><div class='add'>+            cmd_sent = 0;</div><div class='add'>+            cmd_done = 0;</div><div class='ctx'>         }</div><div class='del'>-</div><div class='del'>-callback:</div><div class='del'>-        ret = word-&gt;cbkfn (state, word, (const char **)argv, argc);</div><div class='del'>-</div><div class='del'>-        return ret;</div><div class='add'>+    }</div><div class='add'>+    ret = cli_cmd_unlock();</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-cli_cmd_input_token_count (const char *text)</div><div class='add'>+cli_cmd_sent_status_get(int *status)</div><div class='ctx'> {</div><div class='del'>-        int          count = 0;</div><div class='del'>-        const char  *trav = NULL;</div><div class='del'>-        int          is_spc = 1;</div><div class='del'>-</div><div class='del'>-        for (trav = text; *trav; trav++) {</div><div class='del'>-                if (*trav == ' ') {</div><div class='del'>-                        is_spc = 1;</div><div class='del'>-                } else {</div><div class='del'>-                        if (is_spc) {</div><div class='del'>-                                count++;</div><div class='del'>-                                is_spc = 0;</div><div class='del'>-                        }</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        return count;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    GF_ASSERT(status);</div><div class='add'>+</div><div class='add'>+    ret = cli_cmd_lock();</div><div class='add'>+    {</div><div class='add'>+        if (ret == 0)</div><div class='add'>+            *status = cmd_sent;</div><div class='add'>+    }</div><div class='add'>+    ret = cli_cmd_unlock();</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-cli_cmd_process_line (struct cli_state *state, const char *text)</div><div class='add'>+cli_cmd_process(struct cli_state *state, int argc, char **argv)</div><div class='ctx'> {</div><div class='del'>-        int     count = 0;</div><div class='del'>-        char  **tokens = NULL;</div><div class='del'>-        char  **tokenp = NULL;</div><div class='del'>-        char   *token = NULL;</div><div class='del'>-        char   *copy = NULL;</div><div class='del'>-        char   *saveptr = NULL;</div><div class='del'>-        int     i = 0;</div><div class='del'>-        int     ret = -1;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    struct cli_cmd_word *word = NULL;</div><div class='add'>+    struct cli_cmd_word *next = NULL;</div><div class='add'>+    int i = 0;</div><div class='ctx'> </div><div class='del'>-        count = cli_cmd_input_token_count (text);</div><div class='add'>+    word = &amp;state-&gt;tree.root;</div><div class='ctx'> </div><div class='del'>-        tokens = calloc (count + 1, sizeof (*tokens));</div><div class='del'>-        if (!tokens)</div><div class='del'>-                return -1;</div><div class='add'>+    if (!argc)</div><div class='add'>+        return 0;</div><div class='ctx'> </div><div class='del'>-        copy = strdup (text);</div><div class='del'>-        if (!copy)</div><div class='del'>-                goto out;</div><div class='add'>+    for (i = 0; i &lt; argc; i++) {</div><div class='add'>+        next = cli_cmd_nextword(word, argv[i]);</div><div class='ctx'> </div><div class='del'>-        tokenp = tokens;</div><div class='add'>+        word = next;</div><div class='add'>+        if (!word)</div><div class='add'>+            break;</div><div class='ctx'> </div><div class='del'>-        for (token = strtok_r (copy, " \t\r\n", &amp;saveptr); token;</div><div class='del'>-             token = strtok_r (NULL, " \t\r\n", &amp;saveptr)) {</div><div class='del'>-                *tokenp = strdup (token);</div><div class='add'>+        if (word-&gt;cbkfn)</div><div class='add'>+            break;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-                if (!*tokenp)</div><div class='del'>-                        goto out;</div><div class='del'>-                tokenp++;</div><div class='del'>-                i++;</div><div class='add'>+    if (!word) {</div><div class='add'>+        cli_out("unrecognized word: %s (position %d)\n", argv[i], i);</div><div class='add'>+        usage();</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        }</div><div class='add'>+    if (!word-&gt;cbkfn) {</div><div class='add'>+        cli_out("unrecognized command\n");</div><div class='add'>+        usage();</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        ret = cli_cmd_process (state, count, tokens);</div><div class='del'>-out:</div><div class='del'>-        if (copy)</div><div class='del'>-                free (copy);</div><div class='add'>+    if (strcmp(word-&gt;word, "help") == 0)</div><div class='add'>+        goto callback;</div><div class='ctx'> </div><div class='del'>-        if (tokens)</div><div class='del'>-                cli_cmd_tokens_destroy (tokens);</div><div class='add'>+    state-&gt;await_connected = cli_cmd_needs_connection(word);</div><div class='ctx'> </div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='add'>+    ret = cli_cmd_await_connected(state-&gt;await_connected);</div><div class='add'>+    if (ret) {</div><div class='add'>+        cli_out(</div><div class='add'>+            "Connection failed. Please check if gluster "</div><div class='add'>+            "daemon is operational.");</div><div class='add'>+        gf_log("", GF_LOG_INFO, "Exiting with: %d", ret);</div><div class='add'>+        exit(ret);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='add'>+callback:</div><div class='add'>+    ret = word-&gt;cbkfn(state, word, (const char **)argv, argc);</div><div class='add'>+    (void)cli_cmd_status_reset();</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-cli_cmds_register (struct cli_state *state)</div><div class='add'>+cli_cmd_input_token_count(const char *text)</div><div class='ctx'> {</div><div class='del'>-        int  ret = 0;</div><div class='del'>-</div><div class='del'>-        ret = cli_cmd_volume_register (state);</div><div class='del'>-        if (ret)</div><div class='del'>-                goto out;</div><div class='del'>-</div><div class='del'>-        ret = cli_cmd_probe_register (state);</div><div class='del'>-        if (ret)</div><div class='del'>-                goto out;</div><div class='del'>-</div><div class='del'>-        ret = cli_cmd_misc_register (state);</div><div class='del'>-        if (ret)</div><div class='del'>-                goto out;</div><div class='add'>+    int count = 0;</div><div class='add'>+    const char *trav = NULL;</div><div class='add'>+    int is_spc = 1;</div><div class='add'>+</div><div class='add'>+    for (trav = text; *trav; trav++) {</div><div class='add'>+        if (*trav == ' ') {</div><div class='add'>+            is_spc = 1;</div><div class='add'>+        } else {</div><div class='add'>+            if (is_spc) {</div><div class='add'>+                count++;</div><div class='add'>+                is_spc = 0;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-out:</div><div class='del'>-        return ret;</div><div class='add'>+    return count;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-cli_cmd_cond_init ()</div><div class='add'>+cli_cmd_process_line(struct cli_state *state, const char *text)</div><div class='ctx'> {</div><div class='add'>+    int count = 0;</div><div class='add'>+    char **tokens = NULL;</div><div class='add'>+    char **tokenp = NULL;</div><div class='add'>+    char *token = NULL;</div><div class='add'>+    char *copy = NULL;</div><div class='add'>+    char *saveptr = NULL;</div><div class='add'>+    int i = 0;</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    count = cli_cmd_input_token_count(text);</div><div class='add'>+</div><div class='add'>+    tokens = calloc(count + 1, sizeof(*tokens));</div><div class='add'>+    if (!tokens)</div><div class='add'>+        return -1;</div><div class='add'>+</div><div class='add'>+    copy = strdup(text);</div><div class='add'>+    if (!copy)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    tokenp = tokens;</div><div class='add'>+</div><div class='add'>+    for (token = strtok_r(copy, " \t\r\n", &amp;saveptr); token;</div><div class='add'>+         token = strtok_r(NULL, " \t\r\n", &amp;saveptr)) {</div><div class='add'>+        *tokenp = strdup(token);</div><div class='add'>+</div><div class='add'>+        if (!*tokenp)</div><div class='add'>+            goto out;</div><div class='add'>+        tokenp++;</div><div class='add'>+        i++;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = cli_cmd_process(state, count, tokens);</div><div class='add'>+out:</div><div class='add'>+    free(copy);</div><div class='ctx'> </div><div class='del'>-       pthread_mutex_init (&amp;cond_mutex, NULL);</div><div class='del'>-       pthread_cond_init (&amp;cond, NULL);</div><div class='del'>-</div><div class='del'>-       pthread_mutex_init (&amp;conn_mutex, NULL);</div><div class='del'>-       pthread_cond_init (&amp;conn, NULL);</div><div class='add'>+    if (tokens)</div><div class='add'>+        cli_cmd_tokens_destroy(tokens);</div><div class='ctx'> </div><div class='del'>-       return 0;</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-cli_cmd_lock ()</div><div class='add'>+cli_cmds_register(struct cli_state *state)</div><div class='ctx'> {</div><div class='del'>-       pthread_mutex_lock (&amp;cond_mutex);</div><div class='del'>-       return 0;</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    ret = cli_cmd_volume_register(state);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    ret = cli_cmd_probe_register(state);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    ret = cli_cmd_system_register(state);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    ret = cli_cmd_misc_register(state);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    ret = cli_cmd_snapshot_register(state);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+    ret = cli_cmd_global_register(state);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-cli_cmd_unlock ()</div><div class='add'>+cli_cmd_lock()</div><div class='ctx'> {</div><div class='del'>-        pthread_mutex_unlock (&amp;cond_mutex);</div><div class='del'>-        return 0;</div><div class='add'>+    pthread_mutex_lock(&amp;cond_mutex);</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-cli_cmd_await_response ()</div><div class='add'>+cli_cmd_unlock()</div><div class='ctx'> {</div><div class='del'>-        struct  timespec        ts = {0,};</div><div class='del'>-        int                     ret = 0;</div><div class='del'>-</div><div class='del'>-        cli_op_ret = -1;</div><div class='del'>-</div><div class='del'>-        time (&amp;ts.tv_sec);</div><div class='del'>-        ts.tv_sec += CLI_DEFAULT_CMD_TIMEOUT;</div><div class='del'>-        while (!cmd_done &amp;&amp; !ret) {</div><div class='del'>-                ret = pthread_cond_timedwait (&amp;cond, &amp;cond_mutex,</div><div class='del'>-                                        &amp;ts);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        cmd_done = 0;</div><div class='add'>+    pthread_mutex_unlock(&amp;cond_mutex);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        cli_cmd_unlock ();</div><div class='add'>+static void</div><div class='add'>+seconds_from_now(unsigned secs, struct timespec *ts)</div><div class='add'>+{</div><div class='add'>+    struct timeval tv = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='ctx'> </div><div class='del'>-        if (ret)</div><div class='del'>-                return ret;</div><div class='add'>+    gettimeofday(&amp;tv, NULL);</div><div class='ctx'> </div><div class='del'>-        return cli_op_ret;</div><div class='add'>+    ts-&gt;tv_sec = tv.tv_sec + secs;</div><div class='add'>+    ts-&gt;tv_nsec = tv.tv_usec * 1000;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-cli_cmd_broadcast_response (int32_t status)</div><div class='add'>+cli_cmd_await_response(unsigned time)</div><div class='ctx'> {</div><div class='add'>+    struct timespec ts = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    cli_op_ret = -1;</div><div class='add'>+</div><div class='add'>+    seconds_from_now(time, &amp;ts);</div><div class='add'>+    while (!cmd_done &amp;&amp; !ret) {</div><div class='add'>+        ret = pthread_cond_timedwait(&amp;cond, &amp;cond_mutex, &amp;ts);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (!cmd_done) {</div><div class='add'>+        if (ret == ETIMEDOUT)</div><div class='add'>+            cli_out("Error : Request timed out");</div><div class='add'>+        else</div><div class='add'>+            cli_out("Error : Command returned with error code:%d", ret);</div><div class='add'>+    }</div><div class='add'>+    cmd_done = 0;</div><div class='add'>+</div><div class='add'>+    return cli_op_ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        pthread_mutex_lock (&amp;cond_mutex);</div><div class='del'>-        {</div><div class='del'>-                if (!cmd_sent)</div><div class='del'>-                        goto out;</div><div class='del'>-                cmd_done = 1;</div><div class='del'>-                cli_op_ret = status;</div><div class='del'>-                pthread_cond_broadcast (&amp;cond);</div><div class='del'>-        }</div><div class='del'>-</div><div class='add'>+/* This function must be called _only_ after all actions associated with</div><div class='add'>+ * command processing is complete. Otherwise, gluster process may exit before</div><div class='add'>+ * reporting results to stdout/stderr. */</div><div class='add'>+int</div><div class='add'>+cli_cmd_broadcast_response(int32_t status)</div><div class='add'>+{</div><div class='add'>+    pthread_mutex_lock(&amp;cond_mutex);</div><div class='add'>+    {</div><div class='add'>+        if (!cmd_sent)</div><div class='add'>+            goto out;</div><div class='add'>+        cmd_done = 1;</div><div class='add'>+        cli_op_ret = status;</div><div class='add'>+        pthread_cond_broadcast(&amp;cond);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='ctx'> out:</div><div class='del'>-        pthread_mutex_unlock (&amp;cond_mutex);</div><div class='del'>-        return 0;</div><div class='add'>+    pthread_mutex_unlock(&amp;cond_mutex);</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> int32_t</div><div class='del'>-cli_cmd_await_connected ()</div><div class='add'>+cli_cmd_await_connected(unsigned conn_timo)</div><div class='ctx'> {</div><div class='del'>-        int32_t                 ret = 0;</div><div class='del'>-        struct  timespec        ts = {0,};</div><div class='del'>-</div><div class='del'>-        pthread_mutex_lock (&amp;conn_mutex);</div><div class='del'>-        {</div><div class='del'>-                time (&amp;ts.tv_sec);</div><div class='del'>-                ts.tv_sec += CLI_DEFAULT_CONN_TIMEOUT;</div><div class='del'>-                while (!connected &amp;&amp; !ret) {</div><div class='del'>-                        ret = pthread_cond_timedwait (&amp;conn, &amp;conn_mutex,</div><div class='del'>-                                                      &amp;ts);</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='del'>-        pthread_mutex_unlock (&amp;conn_mutex);</div><div class='add'>+    int32_t ret = 0;</div><div class='add'>+    struct timespec ts = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='ctx'> </div><div class='add'>+    if (!conn_timo)</div><div class='add'>+        return 0;</div><div class='add'>+</div><div class='add'>+    pthread_mutex_lock(&amp;conn_mutex);</div><div class='add'>+    {</div><div class='add'>+        seconds_from_now(conn_timo, &amp;ts);</div><div class='add'>+        while (!connected &amp;&amp; !ret) {</div><div class='add'>+            ret = pthread_cond_timedwait(&amp;conn, &amp;conn_mutex, &amp;ts);</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    pthread_mutex_unlock(&amp;conn_mutex);</div><div class='ctx'> </div><div class='del'>-        return ret;</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> int32_t</div><div class='del'>-cli_cmd_broadcast_connected ()</div><div class='add'>+cli_cmd_broadcast_connected(gf_boolean_t status)</div><div class='ctx'> {</div><div class='del'>-        pthread_mutex_lock (&amp;conn_mutex);</div><div class='del'>-        {</div><div class='del'>-                connected = 1;</div><div class='del'>-                pthread_cond_broadcast (&amp;conn);</div><div class='del'>-        }</div><div class='add'>+    pthread_mutex_lock(&amp;conn_mutex);</div><div class='add'>+    {</div><div class='add'>+        connected = status;</div><div class='add'>+        pthread_cond_broadcast(&amp;conn);</div><div class='add'>+    }</div><div class='add'>+    pthread_mutex_unlock(&amp;conn_mutex);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        pthread_mutex_unlock (&amp;conn_mutex);</div><div class='add'>+gf_boolean_t</div><div class='add'>+cli_cmd_connected(void)</div><div class='add'>+{</div><div class='add'>+    gf_boolean_t status;</div><div class='ctx'> </div><div class='del'>-        return 0;</div><div class='add'>+    pthread_mutex_lock(&amp;conn_mutex);</div><div class='add'>+    {</div><div class='add'>+        status = connected;</div><div class='add'>+    }</div><div class='add'>+    pthread_mutex_unlock(&amp;conn_mutex);</div><div class='add'>+</div><div class='add'>+    return status;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+cli_cmd_submit(struct rpc_clnt *rpc, void *req, call_frame_t *frame,</div><div class='add'>+               rpc_clnt_prog_t *prog, int procnum, struct iobref *iobref,</div><div class='add'>+               xlator_t *this, fop_cbk_fn_t cbkfn, xdrproc_t xdrproc)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    unsigned timeout = 0;</div><div class='add'>+</div><div class='add'>+    if ((GLUSTER_CLI_PROFILE_VOLUME == procnum) ||</div><div class='add'>+        (GLUSTER_CLI_HEAL_VOLUME == procnum) ||</div><div class='add'>+        (GLUSTER_CLI_GANESHA == procnum))</div><div class='add'>+        timeout = cli_ten_minutes_timeout;</div><div class='add'>+    else</div><div class='add'>+        timeout = cli_default_conn_timeout;</div><div class='add'>+</div><div class='add'>+    cli_cmd_lock();</div><div class='add'>+    cmd_sent = 0;</div><div class='add'>+    ret = cli_submit_request(rpc, req, frame, prog, procnum, NULL, this, cbkfn,</div><div class='add'>+                             xdrproc);</div><div class='add'>+</div><div class='add'>+    if (!ret) {</div><div class='add'>+        cmd_sent = 1;</div><div class='add'>+        ret = cli_cmd_await_response(timeout);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    cli_cmd_unlock();</div><div class='add'>+</div><div class='add'>+    gf_log("cli", GF_LOG_DEBUG, "Returning %d", ret);</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-cli_cmd_submit (void *req, call_frame_t *frame,</div><div class='del'>-                rpc_clnt_prog_t *prog,</div><div class='del'>-                int procnum, struct iobref *iobref,</div><div class='del'>-                cli_serialize_t sfunc, xlator_t *this,</div><div class='del'>-                fop_cbk_fn_t cbkfn)</div><div class='add'>+cli_cmd_pattern_cmp(void *a, void *b)</div><div class='add'>+{</div><div class='add'>+    struct cli_cmd *ia = NULL;</div><div class='add'>+    struct cli_cmd *ib = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    ia = a;</div><div class='add'>+    ib = b;</div><div class='add'>+    if (strcmp(ia-&gt;pattern, ib-&gt;pattern) &gt; 0)</div><div class='add'>+        ret = 1;</div><div class='add'>+    else if (strcmp(ia-&gt;pattern, ib-&gt;pattern) &lt; 0)</div><div class='add'>+        ret = -1;</div><div class='add'>+    else</div><div class='add'>+        ret = 0;</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+cli_cmd_sort(struct cli_cmd *cmd, int count)</div><div class='ctx'> {</div><div class='del'>-        int     ret = -1;</div><div class='del'>-</div><div class='del'>-        cli_cmd_lock ();</div><div class='del'>-        cmd_sent = 0;</div><div class='del'>-        ret = cli_submit_request (req, frame, prog,</div><div class='del'>-                                  procnum, NULL, sfunc,</div><div class='del'>-                                  this, cbkfn);</div><div class='del'>-</div><div class='del'>-        if (!ret) {</div><div class='del'>-                cmd_sent = 1;</div><div class='del'>-                ret = cli_cmd_await_response ();</div><div class='del'>-        } else</div><div class='del'>-                cli_cmd_unlock ();</div><div class='del'>-</div><div class='del'>-        gf_log ("cli", GF_LOG_DEBUG, "Returning %d", ret);</div><div class='del'>-        return ret;</div><div class='add'>+    gf_array_insertionsort(cmd, 1, count - 2, sizeof(struct cli_cmd),</div><div class='add'>+                           cli_cmd_pattern_cmp);</div><div class='ctx'> }</div><div class='head'>diff --git a/cli/src/cli-cmd.h b/cli/src/cli-cmd.h<br/>index 7dda509dd0c..c1c068c7085 100644<br/>--- a/<a href='/cgit/glusterfs.git/tree/cli/src/cli-cmd.h?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>cli/src/cli-cmd.h</a><br/>+++ b/<a href='/cgit/glusterfs.git/tree/cli/src/cli-cmd.h?id=d1d7a6f35c816822fab51c820e25023863c239c1'>cli/src/cli-cmd.h</a></div><div class='hunk'>@@ -1,74 +1,129 @@</div><div class='ctx'> /*</div><div class='del'>-   Copyright (c) 2006-2009 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='add'>+   Copyright (c) 2006-2012 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='ctx'>    This file is part of GlusterFS.</div><div class='ctx'> </div><div class='del'>-   GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-   it under the terms of the GNU Affero General Public License as published</div><div class='del'>-   by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-   or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-   GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-   WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-   Affero General Public License for more details.</div><div class='del'>-</div><div class='del'>-   You should have received a copy of the GNU Affero General Public License</div><div class='del'>-   along with this program.  If not, see</div><div class='del'>-   &lt;http://www.gnu.org/licenses/&gt;.</div><div class='add'>+   This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+   General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+   later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+   cases as published by the Free Software Foundation.</div><div class='ctx'> */</div><div class='del'>-</div><div class='ctx'> #ifndef __CLI_CMD_H__</div><div class='ctx'> #define __CLI_CMD_H__</div><div class='ctx'> </div><div class='del'>-#ifndef _CONFIG_H</div><div class='del'>-#define _CONFIG_H</div><div class='del'>-#include "config.h"</div><div class='del'>-#endif</div><div class='add'>+#include &lt;netdb.h&gt;</div><div class='ctx'> </div><div class='ctx'> #include "cli.h"</div><div class='del'>-</div><div class='del'>-typedef enum {</div><div class='del'>-        GF_ANSWER_YES = 1,</div><div class='del'>-        GF_ANSWER_NO  = 2</div><div class='del'>-} gf_answer_t;</div><div class='add'>+#include &lt;glusterfs/list.h&gt;</div><div class='add'>+</div><div class='add'>+#define GLUSTER_SHARED_STORAGE "gluster_shared_storage"</div><div class='add'>+</div><div class='add'>+#define CLI_LOCAL_INIT(local, words, frame, dictionary)                        \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        local = cli_local_get();                                               \</div><div class='add'>+                                                                               \</div><div class='add'>+        if (local) {                                                           \</div><div class='add'>+            local-&gt;words = words;                                              \</div><div class='add'>+            if (dictionary)                                                    \</div><div class='add'>+                local-&gt;dict = dictionary;                                      \</div><div class='add'>+            if (frame)                                                         \</div><div class='add'>+                frame-&gt;local = local;                                          \</div><div class='add'>+        }                                                                      \</div><div class='add'>+    } while (0)</div><div class='add'>+</div><div class='add'>+#define CLI_STACK_DESTROY(_frame)                                              \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        if (_frame) {                                                          \</div><div class='add'>+            if (_frame-&gt;local) {                                               \</div><div class='add'>+                gf_log("cli", GF_LOG_DEBUG,                                    \</div><div class='add'>+                       "frame-&gt;local "                                         \</div><div class='add'>+                       "is not NULL (%p)",                                     \</div><div class='add'>+                       _frame-&gt;local);                                         \</div><div class='add'>+                cli_local_wipe(_frame-&gt;local);                                 \</div><div class='add'>+                _frame-&gt;local = NULL;                                          \</div><div class='add'>+            }                                                                  \</div><div class='add'>+            STACK_DESTROY(_frame-&gt;root);                                       \</div><div class='add'>+        }                                                                      \</div><div class='add'>+    } while (0);</div><div class='add'>+</div><div class='add'>+typedef enum { GF_ANSWER_YES = 1, GF_ANSWER_NO = 2 } gf_answer_t;</div><div class='ctx'> </div><div class='ctx'> struct cli_cmd {</div><div class='del'>-        const char     *pattern;</div><div class='del'>-        cli_cmd_cbk_t  *cbk;</div><div class='del'>-        const char     *desc;</div><div class='add'>+    const char *pattern;</div><div class='add'>+    cli_cmd_cbk_t *cbk;</div><div class='add'>+    const char *desc;</div><div class='add'>+    cli_cmd_reg_cbk_t *reg_cbk; /* callback to check in runtime if the   *</div><div class='add'>+                                 * command should be enabled or disabled */</div><div class='add'>+    gf_boolean_t disable;</div><div class='ctx'> };</div><div class='ctx'> </div><div class='ctx'> struct cli_cmd_volume_get_ctx_ {</div><div class='del'>-        char            *volname;</div><div class='del'>-        int             flags;</div><div class='add'>+    char *volname;</div><div class='add'>+    int flags;</div><div class='ctx'> };</div><div class='ctx'> </div><div class='add'>+typedef struct cli_profile_info_ {</div><div class='add'>+    uint64_t fop_hits;</div><div class='add'>+    double min_latency;</div><div class='add'>+    double max_latency;</div><div class='add'>+    double avg_latency;</div><div class='add'>+    char *fop_name;</div><div class='add'>+    double percentage_avg_latency;</div><div class='add'>+} cli_profile_info_t;</div><div class='add'>+</div><div class='ctx'> typedef struct cli_cmd_volume_get_ctx_ cli_cmd_volume_get_ctx_t;</div><div class='ctx'> </div><div class='del'>-int cli_cmd_volume_register (struct cli_state *state);</div><div class='add'>+int</div><div class='add'>+cli_cmd_volume_register(struct cli_state *state);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+cli_cmd_probe_register(struct cli_state *state);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+cli_cmd_system_register(struct cli_state *state);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+cli_cmd_snapshot_register(struct cli_state *state);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+cli_cmd_global_register(struct cli_state *state);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+cli_cmd_misc_register(struct cli_state *state);</div><div class='ctx'> </div><div class='del'>-int cli_cmd_probe_register (struct cli_state *state);</div><div class='add'>+struct cli_cmd_word *</div><div class='add'>+cli_cmd_nextword(struct cli_cmd_word *word, const char *text);</div><div class='add'>+void</div><div class='add'>+cli_cmd_tokens_destroy(char **tokens);</div><div class='ctx'> </div><div class='del'>-int cli_cmd_misc_register (struct cli_state *state);</div><div class='add'>+int</div><div class='add'>+cli_cmd_await_response(unsigned time);</div><div class='ctx'> </div><div class='del'>-struct cli_cmd_word *cli_cmd_nextword (struct cli_cmd_word *word,</div><div class='del'>-                                       const char *text);</div><div class='del'>-void cli_cmd_tokens_destroy (char **tokens);</div><div class='add'>+int</div><div class='add'>+cli_cmd_broadcast_response(int32_t status);</div><div class='ctx'> </div><div class='del'>-int cli_cmd_await_response ();</div><div class='add'>+int</div><div class='add'>+cli_cmd_lock();</div><div class='ctx'> </div><div class='del'>-int cli_cmd_broadcast_response (int32_t status);</div><div class='add'>+int</div><div class='add'>+cli_cmd_unlock();</div><div class='ctx'> </div><div class='del'>-int cli_cmd_cond_init ();</div><div class='add'>+int</div><div class='add'>+cli_cmd_submit(struct rpc_clnt *rpc, void *req, call_frame_t *frame,</div><div class='add'>+               rpc_clnt_prog_t *prog, int procnum, struct iobref *iobref,</div><div class='add'>+               xlator_t *this, fop_cbk_fn_t cbkfn, xdrproc_t xdrproc);</div><div class='ctx'> </div><div class='del'>-int cli_cmd_lock ();</div><div class='add'>+int</div><div class='add'>+cli_cmd_pattern_cmp(void *a, void *b);</div><div class='ctx'> </div><div class='del'>-int cli_cmd_unlock ();</div><div class='add'>+void</div><div class='add'>+cli_cmd_sort(struct cli_cmd *cmd, int count);</div><div class='ctx'> </div><div class='add'>+gf_answer_t</div><div class='add'>+cli_cmd_get_confirmation(struct cli_state *state, const char *question);</div><div class='ctx'> int</div><div class='del'>-cli_cmd_submit (void *req, call_frame_t *frame,</div><div class='del'>-                rpc_clnt_prog_t *prog,</div><div class='del'>-                int procnum, struct iobref *iobref,</div><div class='del'>-                cli_serialize_t sfunc, xlator_t *this,</div><div class='del'>-                fop_cbk_fn_t cbkfn);</div><div class='add'>+cli_cmd_sent_status_get(int *status);</div><div class='add'>+</div><div class='add'>+gf_boolean_t</div><div class='add'>+_limits_set_on_volume(char *volname, int type);</div><div class='add'>+</div><div class='ctx'> #endif /* __CLI_CMD_H__ */</div><div class='head'>diff --git a/cli/src/cli-mem-types.h b/cli/src/cli-mem-types.h<br/>index 86e346641ff..b42b4dd86c2 100644<br/>--- a/<a href='/cgit/glusterfs.git/tree/cli/src/cli-mem-types.h?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>cli/src/cli-mem-types.h</a><br/>+++ b/<a href='/cgit/glusterfs.git/tree/cli/src/cli-mem-types.h?id=d1d7a6f35c816822fab51c820e25023863c239c1'>cli/src/cli-mem-types.h</a></div><div class='hunk'>@@ -1,38 +1,30 @@</div><div class='ctx'> /*</div><div class='del'>-   Copyright (c) 2010 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='add'>+   Copyright (c) 2010-2012 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='ctx'>    This file is part of GlusterFS.</div><div class='ctx'> </div><div class='del'>-   GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-   it under the terms of the GNU Affero General Public License as published</div><div class='del'>-   by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-   or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-   GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-   WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-   Affero General Public License for more details.</div><div class='del'>-</div><div class='del'>-   You should have received a copy of the GNU Affero General Public License</div><div class='del'>-   along with this program.  If not, see</div><div class='del'>-   &lt;http://www.gnu.org/licenses/&gt;.</div><div class='add'>+   This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+   General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+   later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+   cases as published by the Free Software Foundation.</div><div class='ctx'> */</div><div class='del'>-</div><div class='ctx'> #ifndef __CLI_MEM_TYPES_H__</div><div class='ctx'> #define __CLI_MEM_TYPES_H__</div><div class='ctx'> </div><div class='del'>-#include "mem-types.h"</div><div class='add'>+#include &lt;glusterfs/mem-types.h&gt;</div><div class='ctx'> </div><div class='ctx'> #define CLI_MEM_TYPE_START (gf_common_mt_end + 1)</div><div class='ctx'> </div><div class='ctx'> enum cli_mem_types_ {</div><div class='del'>-        cli_mt_xlator_list_t = CLI_MEM_TYPE_START,</div><div class='del'>-        cli_mt_xlator_t,</div><div class='del'>-        cli_mt_xlator_cmdline_option_t,</div><div class='del'>-        cli_mt_char,</div><div class='del'>-        cli_mt_call_pool_t,</div><div class='del'>-        cli_mt_cli_local_t,</div><div class='del'>-        cli_mt_cli_get_vol_ctx_t,</div><div class='del'>-        cli_mt_end</div><div class='add'>+    cli_mt_xlator_list_t = CLI_MEM_TYPE_START,</div><div class='add'>+    cli_mt_xlator_t,</div><div class='add'>+    cli_mt_xlator_cmdline_option_t,</div><div class='add'>+    cli_mt_char,</div><div class='add'>+    cli_mt_call_pool_t,</div><div class='add'>+    cli_mt_cli_local_t,</div><div class='add'>+    cli_mt_cli_get_vol_ctx_t,</div><div class='add'>+    cli_mt_append_str,</div><div class='add'>+    cli_mt_cli_cmd,</div><div class='add'>+    cli_mt_end</div><div class='ctx'> </div><div class='ctx'> };</div><div class='ctx'> </div><div class='head'>diff --git a/cli/src/cli-quotad-client.c b/cli/src/cli-quotad-client.c<br/>new file mode 100644<br/>index 00000000000..772b8f75bd9<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/cli/src/cli-quotad-client.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>cli/src/cli-quotad-client.c</a></div><div class='hunk'>@@ -0,0 +1,146 @@</div><div class='add'>+/*</div><div class='add'>+   Copyright (c) 2010-2013 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+   This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+   This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+   General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+   later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+   cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#include "cli-quotad-client.h"</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+cli_quotad_submit_request(void *req, call_frame_t *frame, rpc_clnt_prog_t *prog,</div><div class='add'>+                          int procnum, struct iobref *iobref, xlator_t *this,</div><div class='add'>+                          fop_cbk_fn_t cbkfn, xdrproc_t xdrproc)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int count = 0;</div><div class='add'>+    struct iovec iov = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    struct iobuf *iobuf = NULL;</div><div class='add'>+    char new_iobref = 0;</div><div class='add'>+    ssize_t xdr_size = 0;</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(this);</div><div class='add'>+</div><div class='add'>+    if (req) {</div><div class='add'>+        xdr_size = xdr_sizeof(xdrproc, req);</div><div class='add'>+        iobuf = iobuf_get2(this-&gt;ctx-&gt;iobuf_pool, xdr_size);</div><div class='add'>+        if (!iobuf) {</div><div class='add'>+            goto out;</div><div class='add'>+        };</div><div class='add'>+</div><div class='add'>+        if (!iobref) {</div><div class='add'>+            iobref = iobref_new();</div><div class='add'>+            if (!iobref) {</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            new_iobref = 1;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        iobref_add(iobref, iobuf);</div><div class='add'>+</div><div class='add'>+        iov.iov_base = iobuf-&gt;ptr;</div><div class='add'>+        iov.iov_len = iobuf_size(iobuf);</div><div class='add'>+</div><div class='add'>+        /* Create the xdr payload */</div><div class='add'>+        ret = xdr_serialize_generic(iov, req, xdrproc);</div><div class='add'>+        if (ret == -1) {</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+        iov.iov_len = ret;</div><div class='add'>+        count = 1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Send the msg */</div><div class='add'>+    ret = rpc_clnt_submit(global_quotad_rpc, prog, procnum, cbkfn, &amp;iov, count,</div><div class='add'>+                          NULL, 0, iobref, frame, NULL, 0, NULL, 0, NULL);</div><div class='add'>+    ret = 0;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (new_iobref)</div><div class='add'>+        iobref_unref(iobref);</div><div class='add'>+    if (iobuf)</div><div class='add'>+        iobuf_unref(iobuf);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+cli_quotad_notify(struct rpc_clnt *rpc, void *mydata, rpc_clnt_event_t event,</div><div class='add'>+                  void *data)</div><div class='add'>+{</div><div class='add'>+    xlator_t *this = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    this = mydata;</div><div class='add'>+</div><div class='add'>+    switch (event) {</div><div class='add'>+        case RPC_CLNT_CONNECT: {</div><div class='add'>+            gf_log(this-&gt;name, GF_LOG_TRACE, "got RPC_CLNT_CONNECT");</div><div class='add'>+            break;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        case RPC_CLNT_DISCONNECT: {</div><div class='add'>+            gf_log(this-&gt;name, GF_LOG_TRACE, "got RPC_CLNT_DISCONNECT");</div><div class='add'>+            break;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        default:</div><div class='add'>+            gf_log(this-&gt;name, GF_LOG_TRACE, "got some other RPC event %d",</div><div class='add'>+                   event);</div><div class='add'>+            ret = 0;</div><div class='add'>+            break;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+struct rpc_clnt *</div><div class='add'>+cli_quotad_clnt_init(xlator_t *this, dict_t *options)</div><div class='add'>+{</div><div class='add'>+    struct rpc_clnt *rpc = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    ret = dict_set_nstrn(options, "transport.address-family",</div><div class='add'>+                         SLEN("transport.address-family"), "unix",</div><div class='add'>+                         SLEN("unix"));</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    ret = dict_set_nstrn(options, "transport-type", SLEN("transport-type"),</div><div class='add'>+                         "socket", SLEN("socket"));</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    ret = dict_set_nstrn(options, "transport.socket.connect-path",</div><div class='add'>+                         SLEN("transport.socket.connect-path"),</div><div class='add'>+                         "/var/run/gluster/quotad.socket",</div><div class='add'>+                         SLEN("/var/run/gluster/quotad.socket"));</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    rpc = rpc_clnt_new(options, this, this-&gt;name, 16);</div><div class='add'>+    if (!rpc)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    ret = rpc_clnt_register_notify(rpc, cli_quotad_notify, this);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log("cli", GF_LOG_ERROR, "failed to register notify");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    rpc_clnt_start(rpc);</div><div class='add'>+out:</div><div class='add'>+    if (ret) {</div><div class='add'>+        if (rpc)</div><div class='add'>+            rpc_clnt_unref(rpc);</div><div class='add'>+        rpc = NULL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return rpc;</div><div class='add'>+}</div><div class='head'>diff --git a/cli/src/cli-quotad-client.h b/cli/src/cli-quotad-client.h<br/>new file mode 100644<br/>index 00000000000..71a44e5916b<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/cli/src/cli-quotad-client.h?id=d1d7a6f35c816822fab51c820e25023863c239c1'>cli/src/cli-quotad-client.h</a></div><div class='hunk'>@@ -0,0 +1,29 @@</div><div class='add'>+/*</div><div class='add'>+   Copyright (c) 2010-2013 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+   This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+   This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+   General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+   later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+   cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+#include "cli.h"</div><div class='add'>+#include &lt;glusterfs/compat-errno.h&gt;</div><div class='add'>+#include &lt;glusterfs/compat.h&gt;</div><div class='add'>+#include "cli-cmd.h"</div><div class='add'>+#include "cli1-xdr.h"</div><div class='add'>+#include "xdr-generic.h"</div><div class='add'>+#include "protocol-common.h"</div><div class='add'>+#include "cli-mem-types.h"</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+cli_quotad_submit_request(void *req, call_frame_t *frame, rpc_clnt_prog_t *prog,</div><div class='add'>+                          int procnum, struct iobref *iobref, xlator_t *this,</div><div class='add'>+                          fop_cbk_fn_t cbkfn, xdrproc_t xdrproc);</div><div class='add'>+</div><div class='add'>+struct rpc_clnt *</div><div class='add'>+cli_quotad_clnt_init(xlator_t *this, dict_t *options);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+cli_quotad_notify(struct rpc_clnt *rpc, void *mydata, rpc_clnt_event_t event,</div><div class='add'>+                  void *data);</div><div class='head'>diff --git a/cli/src/cli-rl.c b/cli/src/cli-rl.c<br/>index 5d1310858ec..7a38a0b882a 100644<br/>--- a/<a href='/cgit/glusterfs.git/tree/cli/src/cli-rl.c?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>cli/src/cli-rl.c</a><br/>+++ b/<a href='/cgit/glusterfs.git/tree/cli/src/cli-rl.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>cli/src/cli-rl.c</a></div><div class='hunk'>@@ -1,38 +1,23 @@</div><div class='ctx'> /*</div><div class='del'>-  Copyright (c) 2010 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='del'>-  This file is part of GlusterFS.</div><div class='del'>-</div><div class='del'>-  GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-  it under the terms of the GNU Affero General Public License as published</div><div class='del'>-  by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-  or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-  GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-  WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-  Affero General Public License for more details.</div><div class='del'>-</div><div class='del'>-  You should have received a copy of the GNU Affero General Public License</div><div class='del'>-  along with this program.  If not, see</div><div class='del'>-  &lt;http://www.gnu.org/licenses/&gt;.</div><div class='del'>-*/</div><div class='add'>+   Copyright (c) 2010-2012 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+   This file is part of GlusterFS.</div><div class='ctx'> </div><div class='add'>+   This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+   General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+   later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+   cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='ctx'> #include &lt;stdio.h&gt;</div><div class='ctx'> #include &lt;string.h&gt;</div><div class='ctx'> #include &lt;stdlib.h&gt;</div><div class='ctx'> #include &lt;stdint.h&gt;</div><div class='ctx'> #include &lt;pthread.h&gt;</div><div class='ctx'> </div><div class='del'>-#ifndef _CONFIG_H</div><div class='del'>-#define _CONFIG_H</div><div class='del'>-#include "config.h"</div><div class='del'>-#endif</div><div class='del'>-</div><div class='ctx'> #include "cli.h"</div><div class='ctx'> #include "cli-cmd.h"</div><div class='ctx'> #include "cli-mem-types.h"</div><div class='ctx'> </div><div class='del'>-#include "event.h"</div><div class='add'>+#include &lt;glusterfs/gf-event.h&gt;</div><div class='ctx'> </div><div class='ctx'> #include &lt;fnmatch.h&gt;</div><div class='ctx'> </div><div class='hunk'>@@ -42,357 +27,376 @@</div><div class='ctx'> #include &lt;readline/readline.h&gt;</div><div class='ctx'> #include &lt;readline/history.h&gt;</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-cli_rl_out (struct cli_state *state, const char *fmt, va_list ap)</div><div class='add'>+cli_rl_out(struct cli_state *state, const char *fmt, va_list ap)</div><div class='ctx'> {</div><div class='del'>-        int tmp_rl_point = rl_point;</div><div class='del'>-        int            n = rl_end;</div><div class='del'>-        int            i = 0;</div><div class='del'>-        int            ret = 0;</div><div class='del'>-</div><div class='del'>-        if (rl_end &gt;= 0 ) {</div><div class='del'>-                rl_kill_text (0, rl_end);</div><div class='del'>-                rl_redisplay ();</div><div class='del'>-        }</div><div class='add'>+    int tmp_rl_point = rl_point;</div><div class='add'>+    int n = rl_end;</div><div class='add'>+    int ret = 0;</div><div class='ctx'> </div><div class='del'>-        printf ("\r");</div><div class='add'>+    if (rl_end &gt;= 0) {</div><div class='add'>+        rl_kill_text(0, rl_end);</div><div class='add'>+        rl_redisplay();</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        for (i = 0; i &lt;= strlen (state-&gt;prompt); i++)</div><div class='del'>-                printf (" ");</div><div class='add'>+    printf("\r%*s\r", (int)strlen(state-&gt;prompt), "");</div><div class='ctx'> </div><div class='del'>-        printf ("\r");</div><div class='add'>+    ret = vprintf(fmt, ap);</div><div class='ctx'> </div><div class='del'>-        ret = vprintf (fmt, ap);</div><div class='add'>+    printf("\n");</div><div class='add'>+    fflush(stdout);</div><div class='ctx'> </div><div class='del'>-        printf ("\n");</div><div class='del'>-        fflush(stdout);</div><div class='add'>+    if (n) {</div><div class='add'>+        rl_do_undo();</div><div class='add'>+        rl_point = tmp_rl_point;</div><div class='add'>+        rl_reset_line_state();</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        if (n) {</div><div class='del'>-                rl_do_undo ();</div><div class='del'>-                rl_point = tmp_rl_point;</div><div class='del'>-                rl_reset_line_state ();</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        return ret;</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+int</div><div class='add'>+cli_rl_err(struct cli_state *state, const char *fmt, va_list ap)</div><div class='add'>+{</div><div class='add'>+    int tmp_rl_point = rl_point;</div><div class='add'>+    int n = rl_end;</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    if (rl_end &gt;= 0) {</div><div class='add'>+        rl_kill_text(0, rl_end);</div><div class='add'>+        rl_redisplay();</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    fprintf(stderr, "\r%*s\r", (int)strlen(state-&gt;prompt), "");</div><div class='add'>+</div><div class='add'>+    ret = vfprintf(stderr, fmt, ap);</div><div class='add'>+</div><div class='add'>+    fprintf(stderr, "\n");</div><div class='add'>+    fflush(stderr);</div><div class='add'>+</div><div class='add'>+    if (n) {</div><div class='add'>+        rl_do_undo();</div><div class='add'>+        rl_point = tmp_rl_point;</div><div class='add'>+        rl_reset_line_state();</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> void</div><div class='del'>-cli_rl_process_line (char *line)</div><div class='add'>+cli_rl_process_line(char *line)</div><div class='ctx'> {</div><div class='del'>-        struct cli_state *state = NULL;</div><div class='del'>-        int               ret = 0;</div><div class='add'>+    struct cli_state *state = NULL;</div><div class='add'>+    int ret = 0;</div><div class='ctx'> </div><div class='del'>-        state = global_state;</div><div class='add'>+    state = global_state;</div><div class='ctx'> </div><div class='del'>-        state-&gt;rl_processing = 1;</div><div class='del'>-        {</div><div class='del'>-                ret = cli_cmd_process_line (state, line);</div><div class='del'>-                add_history (line);</div><div class='del'>-        }</div><div class='del'>-        state-&gt;rl_processing = 0;</div><div class='del'>-}</div><div class='add'>+    state-&gt;rl_processing = 1;</div><div class='add'>+    {</div><div class='add'>+        ret = cli_cmd_process_line(state, line);</div><div class='add'>+        if (ret)</div><div class='add'>+            gf_log(THIS-&gt;name, GF_LOG_WARNING, "failed to process line");</div><div class='ctx'> </div><div class='add'>+        add_history(line);</div><div class='add'>+    }</div><div class='add'>+    state-&gt;rl_processing = 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-cli_rl_stdin (int fd, int idx, void *data,</div><div class='del'>-              int poll_out, int poll_in, int poll_err)</div><div class='add'>+void</div><div class='add'>+cli_rl_stdin(int fd, int idx, int gen, void *data, int poll_out, int poll_in,</div><div class='add'>+             int poll_err, char event_thread_died)</div><div class='ctx'> {</div><div class='del'>-        rl_callback_read_char ();</div><div class='add'>+    struct cli_state *state = NULL;</div><div class='ctx'> </div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='add'>+    state = data;</div><div class='add'>+</div><div class='add'>+    rl_callback_read_char();</div><div class='add'>+</div><div class='add'>+    gf_event_handled(state-&gt;ctx-&gt;event_pool, fd, idx, gen);</div><div class='ctx'> </div><div class='add'>+    return;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> char *</div><div class='del'>-cli_rl_autocomplete_entry (const char *text, int times)</div><div class='add'>+cli_rl_autocomplete_entry(const char *text, int times)</div><div class='ctx'> {</div><div class='del'>-        struct cli_state  *state = NULL;</div><div class='del'>-        char              *retp = NULL;</div><div class='add'>+    struct cli_state *state = NULL;</div><div class='add'>+    char *retp = NULL;</div><div class='ctx'> </div><div class='del'>-        state = global_state;</div><div class='add'>+    state = global_state;</div><div class='ctx'> </div><div class='del'>-        if (!state-&gt;matchesp)</div><div class='del'>-                return NULL;</div><div class='add'>+    if (!state-&gt;matchesp)</div><div class='add'>+        return NULL;</div><div class='ctx'> </div><div class='del'>-        retp = *state-&gt;matchesp;</div><div class='add'>+    retp = *state-&gt;matchesp;</div><div class='ctx'> </div><div class='del'>-        state-&gt;matchesp++;</div><div class='add'>+    state-&gt;matchesp++;</div><div class='ctx'> </div><div class='del'>-        return retp ? strdup (retp) : NULL;</div><div class='add'>+    return retp ? strdup(retp) : NULL;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-cli_rl_token_count (const char *text)</div><div class='add'>+cli_rl_token_count(const char *text)</div><div class='ctx'> {</div><div class='del'>-        int          count = 0;</div><div class='del'>-        const char  *trav = NULL;</div><div class='del'>-        int          is_spc = 1;</div><div class='del'>-</div><div class='del'>-        for (trav = text; *trav; trav++) {</div><div class='del'>-                if (*trav == ' ') {</div><div class='del'>-                        is_spc = 1;</div><div class='del'>-                } else {</div><div class='del'>-                        if (is_spc) {</div><div class='del'>-                                count++;</div><div class='del'>-                                is_spc = 0;</div><div class='del'>-                        }</div><div class='del'>-                }</div><div class='add'>+    int count = 0;</div><div class='add'>+    const char *trav = NULL;</div><div class='add'>+    int is_spc = 1;</div><div class='add'>+</div><div class='add'>+    for (trav = text; *trav; trav++) {</div><div class='add'>+        if (*trav == ' ') {</div><div class='add'>+            is_spc = 1;</div><div class='add'>+        } else {</div><div class='add'>+            if (is_spc) {</div><div class='add'>+                count++;</div><div class='add'>+                is_spc = 0;</div><div class='add'>+            }</div><div class='ctx'>         }</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        if (is_spc)</div><div class='del'>-                /* what needs to be autocompleted is a full</div><div class='del'>-                   new word, and not extend the last word</div><div class='del'>-                */</div><div class='del'>-                count++;</div><div class='add'>+    if (is_spc)</div><div class='add'>+        /* what needs to be autocompleted is a full</div><div class='add'>+           new word, and not extend the last word</div><div class='add'>+        */</div><div class='add'>+        count++;</div><div class='ctx'> </div><div class='del'>-        return count;</div><div class='add'>+    return count;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> char **</div><div class='del'>-cli_rl_tokenize (const char *text)</div><div class='add'>+cli_rl_tokenize(const char *text)</div><div class='ctx'> {</div><div class='del'>-        int     count = 0;</div><div class='del'>-        char  **tokens = NULL;</div><div class='del'>-        char  **tokenp = NULL;</div><div class='del'>-        char   *token = NULL;</div><div class='del'>-        char   *copy = NULL;</div><div class='del'>-        char   *saveptr = NULL;</div><div class='del'>-        int     i = 0;</div><div class='del'>-</div><div class='del'>-        count = cli_rl_token_count (text);</div><div class='del'>-</div><div class='del'>-        tokens = calloc (count + 1, sizeof (*tokens));</div><div class='del'>-        if (!tokens)</div><div class='del'>-                return NULL;</div><div class='del'>-</div><div class='del'>-        copy = strdup (text);</div><div class='del'>-        if (!copy)</div><div class='del'>-                goto out;</div><div class='del'>-</div><div class='del'>-        tokenp = tokens;</div><div class='del'>-</div><div class='del'>-        for (token = strtok_r (copy, " \t\r\n", &amp;saveptr); token;</div><div class='del'>-             token = strtok_r (NULL, " \t\r\n", &amp;saveptr)) {</div><div class='del'>-                *tokenp = strdup (token);</div><div class='del'>-</div><div class='del'>-                if (!*tokenp)</div><div class='del'>-                        goto out;</div><div class='del'>-                tokenp++;</div><div class='del'>-                i++;</div><div class='del'>-</div><div class='del'>-        }</div><div class='add'>+    int count = 0;</div><div class='add'>+    char **tokens = NULL;</div><div class='add'>+    char **tokenp = NULL;</div><div class='add'>+    char *token = NULL;</div><div class='add'>+    char *copy = NULL;</div><div class='add'>+    char *saveptr = NULL;</div><div class='add'>+    int i = 0;</div><div class='add'>+</div><div class='add'>+    count = cli_rl_token_count(text);</div><div class='add'>+</div><div class='add'>+    tokens = calloc(count + 1, sizeof(*tokens));</div><div class='add'>+    if (!tokens)</div><div class='add'>+        return NULL;</div><div class='ctx'> </div><div class='del'>-        if (i &lt; count) {</div><div class='del'>-                /* symoblize that what needs to be autocompleted is</div><div class='del'>-                   the full set of possible nextwords, and not extend</div><div class='del'>-                   the last word</div><div class='del'>-                */</div><div class='del'>-                *tokenp = strdup ("");</div><div class='del'>-                if (!*tokenp)</div><div class='del'>-                        goto out;</div><div class='del'>-                tokenp++;</div><div class='del'>-                i++;</div><div class='del'>-        }</div><div class='add'>+    copy = strdup(text);</div><div class='add'>+    if (!copy)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    tokenp = tokens;</div><div class='add'>+</div><div class='add'>+    for (token = strtok_r(copy, " \t\r\n", &amp;saveptr); token;</div><div class='add'>+         token = strtok_r(NULL, " \t\r\n", &amp;saveptr)) {</div><div class='add'>+        *tokenp = strdup(token);</div><div class='add'>+</div><div class='add'>+        if (!*tokenp)</div><div class='add'>+            goto out;</div><div class='add'>+        tokenp++;</div><div class='add'>+        i++;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (i &lt; count) {</div><div class='add'>+        /* symbolize that what needs to be autocompleted is</div><div class='add'>+           the full set of possible nextwords, and not extend</div><div class='add'>+           the last word</div><div class='add'>+        */</div><div class='add'>+        *tokenp = strdup("");</div><div class='add'>+        if (!*tokenp)</div><div class='add'>+            goto out;</div><div class='add'>+        tokenp++;</div><div class='add'>+        i++;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='ctx'> out:</div><div class='del'>-        if (copy)</div><div class='del'>-                free (copy);</div><div class='add'>+    free(copy);</div><div class='ctx'> </div><div class='del'>-        if (i &lt; count) {</div><div class='del'>-                cli_cmd_tokens_destroy (tokens);</div><div class='del'>-                tokens = NULL;</div><div class='del'>-        }</div><div class='add'>+    if (i &lt; count) {</div><div class='add'>+        cli_cmd_tokens_destroy(tokens);</div><div class='add'>+        tokens = NULL;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        return tokens;</div><div class='add'>+    return tokens;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> char **</div><div class='del'>-cli_rl_get_matches (struct cli_state *state, struct cli_cmd_word *word,</div><div class='del'>-                    const char *text)</div><div class='add'>+cli_rl_get_matches(struct cli_state *state, struct cli_cmd_word *word,</div><div class='add'>+                   const char *text)</div><div class='ctx'> {</div><div class='del'>-        char                 **matches = NULL;</div><div class='del'>-        char                 **matchesp = NULL;</div><div class='del'>-        struct cli_cmd_word  **next = NULL;</div><div class='del'>-        int                    count = 0;</div><div class='del'>-        int                    len = 0;</div><div class='add'>+    char **matches = NULL;</div><div class='add'>+    char **matchesp = NULL;</div><div class='add'>+    struct cli_cmd_word **next = NULL;</div><div class='add'>+    int count = 0;</div><div class='add'>+    int len = 0;</div><div class='ctx'> </div><div class='del'>-        len = strlen (text);</div><div class='add'>+    len = strlen(text);</div><div class='ctx'> </div><div class='del'>-        if (!word-&gt;nextwords)</div><div class='del'>-                return NULL;</div><div class='add'>+    if (!word-&gt;nextwords)</div><div class='add'>+        return NULL;</div><div class='ctx'> </div><div class='del'>-        for (next = word-&gt;nextwords; *next; next++)</div><div class='del'>-                count++;</div><div class='add'>+    for (next = word-&gt;nextwords; *next; next++)</div><div class='add'>+        count++;</div><div class='ctx'> </div><div class='del'>-        matches = calloc (count + 1, sizeof (*matches));</div><div class='del'>-        matchesp = matches;</div><div class='add'>+    matches = calloc(count + 1, sizeof(*matches));</div><div class='add'>+    matchesp = matches;</div><div class='ctx'> </div><div class='del'>-        for (next = word-&gt;nextwords; *next; next++) {</div><div class='del'>-                if ((*next)-&gt;match) {</div><div class='del'>-                        continue;</div><div class='del'>-                }</div><div class='add'>+    for (next = word-&gt;nextwords; *next; next++) {</div><div class='add'>+        if ((*next)-&gt;match) {</div><div class='add'>+            continue;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-                if (strncmp ((*next)-&gt;word, text, len) == 0) {</div><div class='del'>-                        *matchesp = strdup ((*next)-&gt;word);</div><div class='del'>-                        matchesp++;</div><div class='del'>-                }</div><div class='add'>+        if (strncmp((*next)-&gt;word, text, len) == 0) {</div><div class='add'>+            *matchesp = strdup((*next)-&gt;word);</div><div class='add'>+            matchesp++;</div><div class='ctx'>         }</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        return matches;</div><div class='add'>+    return matches;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-cli_rl_autocomplete_prepare (struct cli_state *state, const char *text)</div><div class='add'>+cli_rl_autocomplete_prepare(struct cli_state *state, const char *text)</div><div class='ctx'> {</div><div class='del'>-        struct cli_cmd_word   *word = NULL;</div><div class='del'>-        struct cli_cmd_word   *next = NULL;</div><div class='del'>-        char                 **tokens = NULL;</div><div class='del'>-        char                 **tokenp = NULL;</div><div class='del'>-        char                  *token = NULL;</div><div class='del'>-        char                 **matches = NULL;</div><div class='del'>-</div><div class='del'>-        tokens = cli_rl_tokenize (text);</div><div class='del'>-        if (!tokens)</div><div class='del'>-                return 0;</div><div class='del'>-</div><div class='del'>-        word = &amp;state-&gt;tree.root;</div><div class='del'>-</div><div class='del'>-        for (tokenp = tokens; (token = *tokenp); tokenp++) {</div><div class='del'>-                if (!*(tokenp+1)) {</div><div class='del'>-                        /* last word */</div><div class='del'>-                        break;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                next = cli_cmd_nextword (word, token);</div><div class='del'>-                word = next;</div><div class='del'>-                if (!word)</div><div class='del'>-                        break;</div><div class='add'>+    struct cli_cmd_word *word = NULL;</div><div class='add'>+    struct cli_cmd_word *next = NULL;</div><div class='add'>+    char **tokens = NULL;</div><div class='add'>+    char **tokenp = NULL;</div><div class='add'>+    char *token = NULL;</div><div class='add'>+    char **matches = NULL;</div><div class='add'>+</div><div class='add'>+    tokens = cli_rl_tokenize(text);</div><div class='add'>+    if (!tokens)</div><div class='add'>+        return 0;</div><div class='add'>+</div><div class='add'>+    word = &amp;state-&gt;tree.root;</div><div class='add'>+</div><div class='add'>+    for (tokenp = tokens; (token = *tokenp); tokenp++) {</div><div class='add'>+        if (!*(tokenp + 1)) {</div><div class='add'>+            /* last word */</div><div class='add'>+            break;</div><div class='ctx'>         }</div><div class='ctx'> </div><div class='add'>+        next = cli_cmd_nextword(word, token);</div><div class='add'>+        word = next;</div><div class='ctx'>         if (!word)</div><div class='del'>-                goto out;</div><div class='add'>+            break;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (!word || !token)</div><div class='add'>+        goto out;</div><div class='ctx'> </div><div class='del'>-        matches = cli_rl_get_matches (state, word, token);</div><div class='add'>+    matches = cli_rl_get_matches(state, word, token);</div><div class='ctx'> </div><div class='del'>-        state-&gt;matches = matches;</div><div class='del'>-        state-&gt;matchesp = matches;</div><div class='add'>+    state-&gt;matches = matches;</div><div class='add'>+    state-&gt;matchesp = matches;</div><div class='ctx'> </div><div class='ctx'> out:</div><div class='del'>-        cli_cmd_tokens_destroy (tokens);</div><div class='del'>-        return 0;</div><div class='add'>+    cli_cmd_tokens_destroy(tokens);</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-cli_rl_autocomplete_cleanup (struct cli_state *state)</div><div class='add'>+cli_rl_autocomplete_cleanup(struct cli_state *state)</div><div class='ctx'> {</div><div class='del'>-        if (state-&gt;matches)</div><div class='del'>-                cli_cmd_tokens_destroy (state-&gt;matches);</div><div class='add'>+    if (state-&gt;matches)</div><div class='add'>+        cli_cmd_tokens_destroy(state-&gt;matches);</div><div class='ctx'> </div><div class='del'>-        state-&gt;matches = NULL;</div><div class='del'>-        state-&gt;matchesp = NULL;</div><div class='add'>+    state-&gt;matches = NULL;</div><div class='add'>+    state-&gt;matchesp = NULL;</div><div class='ctx'> </div><div class='del'>-        return 0;</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> char **</div><div class='del'>-cli_rl_autocomplete (const char *text, int start, int end)</div><div class='add'>+cli_rl_autocomplete(const char *text, int start, int end)</div><div class='ctx'> {</div><div class='del'>-        struct cli_state  *state = NULL;</div><div class='del'>-        char             **matches = NULL;</div><div class='del'>-        char               save = 0;</div><div class='add'>+    struct cli_state *state = NULL;</div><div class='add'>+    char **matches = NULL;</div><div class='add'>+    char save = 0;</div><div class='ctx'> </div><div class='del'>-        state = global_state;</div><div class='add'>+    state = global_state;</div><div class='ctx'> </div><div class='del'>-        /* hack to make the autocompletion code neater */</div><div class='del'>-        /* fake it as though the cursor is at the end of line */</div><div class='add'>+    /* hack to make the autocompletion code neater */</div><div class='add'>+    /* fake it as though the cursor is at the end of line */</div><div class='ctx'> </div><div class='del'>-        save = rl_line_buffer[rl_point];</div><div class='del'>-        rl_line_buffer[rl_point] = 0;</div><div class='add'>+    save = rl_line_buffer[rl_point];</div><div class='add'>+    rl_line_buffer[rl_point] = 0;</div><div class='ctx'> </div><div class='del'>-        cli_rl_autocomplete_prepare (state, rl_line_buffer);</div><div class='add'>+    cli_rl_autocomplete_prepare(state, rl_line_buffer);</div><div class='ctx'> </div><div class='del'>-        matches = rl_completion_matches (text, cli_rl_autocomplete_entry);</div><div class='add'>+    matches = rl_completion_matches(text, cli_rl_autocomplete_entry);</div><div class='ctx'> </div><div class='del'>-        cli_rl_autocomplete_cleanup (state);</div><div class='add'>+    cli_rl_autocomplete_cleanup(state);</div><div class='ctx'> </div><div class='del'>-        rl_line_buffer[rl_point] = save;</div><div class='add'>+    rl_line_buffer[rl_point] = save;</div><div class='ctx'> </div><div class='del'>-        return matches;</div><div class='add'>+    return matches;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> static char *</div><div class='del'>-complete_none (const char *txt, int times)</div><div class='add'>+complete_none(const char *txt, int times)</div><div class='ctx'> {</div><div class='del'>-        return NULL;</div><div class='add'>+    return NULL;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> void *</div><div class='del'>-cli_rl_input (void *_data)</div><div class='add'>+cli_rl_input(void *_data)</div><div class='ctx'> {</div><div class='del'>-        struct cli_state *state = NULL;</div><div class='del'>-        char             *line = NULL;</div><div class='add'>+    struct cli_state *state = NULL;</div><div class='add'>+    char *line = NULL;</div><div class='ctx'> </div><div class='del'>-        state = _data;</div><div class='add'>+    state = _data;</div><div class='ctx'> </div><div class='del'>-        for (;;) {</div><div class='del'>-                line = readline (state-&gt;prompt);</div><div class='del'>-                if (!line)</div><div class='del'>-                        break;</div><div class='add'>+    fprintf(stderr,</div><div class='add'>+            "Welcome to gluster prompt, type 'help' to see the available "</div><div class='add'>+            "commands.\n");</div><div class='add'>+    for (;;) {</div><div class='add'>+        line = readline(state-&gt;prompt);</div><div class='add'>+        if (!line)</div><div class='add'>+            exit(0);  // break;</div><div class='ctx'> </div><div class='del'>-                cli_rl_process_line (line);</div><div class='add'>+        if (*line)</div><div class='add'>+            cli_rl_process_line(line);</div><div class='ctx'> </div><div class='del'>-                free (line);</div><div class='del'>-        }</div><div class='add'>+        free(line);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        return NULL;</div><div class='add'>+    return NULL;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-cli_rl_enable (struct cli_state *state)</div><div class='add'>+cli_rl_enable(struct cli_state *state)</div><div class='ctx'> {</div><div class='del'>-        int ret = 0;</div><div class='del'>-</div><div class='del'>-        rl_pre_input_hook = NULL;</div><div class='del'>-        rl_attempted_completion_function = cli_rl_autocomplete;</div><div class='del'>-        rl_completion_entry_function = complete_none;</div><div class='del'>-</div><div class='del'>-        if (!state-&gt;rl_async) {</div><div class='del'>-                ret = pthread_create (&amp;state-&gt;input, NULL,</div><div class='del'>-                                      cli_rl_input, state);</div><div class='del'>-                if (ret == 0)</div><div class='del'>-                        state-&gt;rl_enabled = 1;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    rl_pre_input_hook = NULL;</div><div class='add'>+    rl_attempted_completion_function = cli_rl_autocomplete;</div><div class='add'>+    rl_completion_entry_function = complete_none;</div><div class='ctx'> </div><div class='del'>-        ret = event_register (state-&gt;ctx-&gt;event_pool, 0, cli_rl_stdin, state,</div><div class='del'>-                              1, 0);</div><div class='del'>-        if (ret == -1)</div><div class='del'>-                goto out;</div><div class='add'>+    if (!state-&gt;rl_async) {</div><div class='add'>+        ret = pthread_create(&amp;state-&gt;input, NULL, cli_rl_input, state);</div><div class='add'>+        if (ret == 0)</div><div class='add'>+            state-&gt;rl_enabled = 1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        state-&gt;rl_enabled = 1;</div><div class='del'>-        rl_callback_handler_install (state-&gt;prompt, cli_rl_process_line);</div><div class='add'>+    ret = gf_event_register(state-&gt;ctx-&gt;event_pool, 0, cli_rl_stdin, state, 1,</div><div class='add'>+                            0, 0);</div><div class='add'>+    if (ret == -1)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    state-&gt;rl_enabled = 1;</div><div class='add'>+    rl_callback_handler_install(state-&gt;prompt, cli_rl_process_line);</div><div class='ctx'> </div><div class='ctx'> out:</div><div class='del'>-        return state-&gt;rl_enabled;</div><div class='add'>+    return state-&gt;rl_enabled;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> #else /* HAVE_READLINE */</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-cli_rl_enable (struct cli_state *state)</div><div class='add'>+cli_rl_enable(struct cli_state *state)</div><div class='ctx'> {</div><div class='del'>-        return 0;</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> #endif /* HAVE_READLINE */</div><div class='head'>diff --git a/cli/src/cli-rpc-ops.c b/cli/src/cli-rpc-ops.c<br/>new file mode 100644<br/>index 00000000000..9b6b0c7fa50<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/cli/src/cli-rpc-ops.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>cli/src/cli-rpc-ops.c</a></div><div class='hunk'>@@ -0,0 +1,10949 @@</div><div class='add'>+/*</div><div class='add'>+   Copyright (c) 2010-2012 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+   This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+   This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+   General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+   later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+   cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+/* Widths of various columns in top read/write-perf output</div><div class='add'>+ * Total width of top read/write-perf should be 80 chars</div><div class='add'>+ * including one space between column</div><div class='add'>+ */</div><div class='add'>+#define VOL_TOP_PERF_FILENAME_DEF_WIDTH 47</div><div class='add'>+#define VOL_TOP_PERF_FILENAME_ALT_WIDTH 44</div><div class='add'>+#define VOL_TOP_PERF_SPEED_WIDTH 4</div><div class='add'>+#define VOL_TOP_PERF_TIME_WIDTH 26</div><div class='add'>+</div><div class='add'>+#define INDENT_MAIN_HEAD "%-25s %s "</div><div class='add'>+</div><div class='add'>+#define RETURNING "Returning %d"</div><div class='add'>+#define XML_ERROR "Error outputting to xml"</div><div class='add'>+#define XDR_DECODE_FAIL "Failed to decode xdr response"</div><div class='add'>+#define DICT_SERIALIZE_FAIL "Failed to serialize to data to dictionary"</div><div class='add'>+#define DICT_UNSERIALIZE_FAIL "Failed to unserialize the dictionary"</div><div class='add'>+</div><div class='add'>+/* Do not show estimates if greater than this number */</div><div class='add'>+#define REBAL_ESTIMATE_SEC_UPPER_LIMIT (60 * 24 * 3600)</div><div class='add'>+#define REBAL_ESTIMATE_START_TIME 600</div><div class='add'>+</div><div class='add'>+#include "cli.h"</div><div class='add'>+#include &lt;glusterfs/compat-errno.h&gt;</div><div class='add'>+#include "cli-cmd.h"</div><div class='add'>+#include &lt;sys/uio.h&gt;</div><div class='add'>+#include &lt;stdlib.h&gt;</div><div class='add'>+#include &lt;sys/mount.h&gt;</div><div class='add'>+#include &lt;glusterfs/compat.h&gt;</div><div class='add'>+#include "cli-mem-types.h"</div><div class='add'>+#include &lt;glusterfs/syscall.h&gt;</div><div class='add'>+#include "glusterfs3.h"</div><div class='add'>+#include "portmap-xdr.h"</div><div class='add'>+#include &lt;glusterfs/byte-order.h&gt;</div><div class='add'>+</div><div class='add'>+#include &lt;glusterfs/run.h&gt;</div><div class='add'>+#include &lt;glusterfs/events.h&gt;</div><div class='add'>+</div><div class='add'>+enum gf_task_types { GF_TASK_TYPE_REBALANCE, GF_TASK_TYPE_REMOVE_BRICK };</div><div class='add'>+</div><div class='add'>+rpc_clnt_prog_t cli_quotad_clnt;</div><div class='add'>+</div><div class='add'>+static int32_t</div><div class='add'>+gf_cli_remove_brick(call_frame_t *frame, xlator_t *this, void *data);</div><div class='add'>+</div><div class='add'>+char *cli_vol_status_str[] = {</div><div class='add'>+    "Created",</div><div class='add'>+    "Started",</div><div class='add'>+    "Stopped",</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+char *cli_vol_task_status_str[] = {"not started",</div><div class='add'>+                                   "in progress",</div><div class='add'>+                                   "stopped",</div><div class='add'>+                                   "completed",</div><div class='add'>+                                   "failed",</div><div class='add'>+                                   "fix-layout in progress",</div><div class='add'>+                                   "fix-layout stopped",</div><div class='add'>+                                   "fix-layout completed",</div><div class='add'>+                                   "fix-layout failed",</div><div class='add'>+                                   "unknown"};</div><div class='add'>+</div><div class='add'>+static int32_t</div><div class='add'>+gf_cli_snapshot(call_frame_t *frame, xlator_t *this, void *data);</div><div class='add'>+</div><div class='add'>+static int32_t</div><div class='add'>+gf_cli_get_volume(call_frame_t *frame, xlator_t *this, void *data);</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+cli_to_glusterd(gf_cli_req *req, call_frame_t *frame, fop_cbk_fn_t cbkfn,</div><div class='add'>+                xdrproc_t xdrproc, dict_t *dict, int procnum, xlator_t *this,</div><div class='add'>+                rpc_clnt_prog_t *prog, struct iobref *iobref);</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+add_cli_cmd_timeout_to_dict(dict_t *dict);</div><div class='add'>+</div><div class='add'>+static rpc_clnt_prog_t cli_handshake_prog = {</div><div class='add'>+    .progname = "cli handshake",</div><div class='add'>+    .prognum = GLUSTER_HNDSK_PROGRAM,</div><div class='add'>+    .progver = GLUSTER_HNDSK_VERSION,</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+static rpc_clnt_prog_t cli_pmap_prog = {</div><div class='add'>+    .progname = "cli portmap",</div><div class='add'>+    .prognum = GLUSTER_PMAP_PROGRAM,</div><div class='add'>+    .progver = GLUSTER_PMAP_VERSION,</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf_free_xdr_cli_rsp(gf_cli_rsp rsp)</div><div class='add'>+{</div><div class='add'>+    if (rsp.dict.dict_val) {</div><div class='add'>+        free(rsp.dict.dict_val);</div><div class='add'>+    }</div><div class='add'>+    if (rsp.op_errstr) {</div><div class='add'>+        free(rsp.op_errstr);</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf_free_xdr_getspec_rsp(gf_getspec_rsp rsp)</div><div class='add'>+{</div><div class='add'>+    if (rsp.spec) {</div><div class='add'>+        free(rsp.spec);</div><div class='add'>+    }</div><div class='add'>+    if (rsp.xdata.xdata_val) {</div><div class='add'>+        free(rsp.xdata.xdata_val);</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf_free_xdr_fsm_log_rsp(gf1_cli_fsm_log_rsp rsp)</div><div class='add'>+{</div><div class='add'>+    if (rsp.op_errstr) {</div><div class='add'>+        free(rsp.op_errstr);</div><div class='add'>+    }</div><div class='add'>+    if (rsp.fsm_log.fsm_log_val) {</div><div class='add'>+        free(rsp.fsm_log.fsm_log_val);</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+gf_cli_probe_cbk(struct rpc_req *req, struct iovec *iov, int count,</div><div class='add'>+                 void *myframe)</div><div class='add'>+{</div><div class='add'>+    gf_cli_rsp rsp = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int ret = -1;</div><div class='add'>+    char msg[1024] = "success";</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(myframe);</div><div class='add'>+</div><div class='add'>+    if (-1 == req-&gt;rpc_status) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = xdr_to_generic(*iov, &amp;rsp, (xdrproc_t)xdr_gf_cli_rsp);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        gf_log(((call_frame_t *)myframe)-&gt;this-&gt;name, GF_LOG_ERROR,</div><div class='add'>+               XDR_DECODE_FAIL);</div><div class='add'>+        // rsp.op_ret   = -1;</div><div class='add'>+        // rsp.op_errno = EINVAL;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    gf_log("cli", GF_LOG_INFO, "Received resp to probe");</div><div class='add'>+</div><div class='add'>+    if (rsp.op_errstr &amp;&amp; rsp.op_errstr[0] != '\0') {</div><div class='add'>+        snprintf(msg, sizeof(msg), "%s", rsp.op_errstr);</div><div class='add'>+        if (rsp.op_ret) {</div><div class='add'>+            gf_log("cli", GF_LOG_ERROR, "%s", msg);</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (global_state-&gt;mode &amp; GLUSTER_MODE_XML) {</div><div class='add'>+        ret = cli_xml_output_str(NULL, (rsp.op_ret) ? NULL : msg, rsp.op_ret,</div><div class='add'>+                                 rsp.op_errno, (rsp.op_ret) ? msg : NULL);</div><div class='add'>+        if (ret)</div><div class='add'>+            gf_log("cli", GF_LOG_ERROR, XML_ERROR);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (!rsp.op_ret)</div><div class='add'>+        cli_out("peer probe: %s", msg);</div><div class='add'>+    else</div><div class='add'>+        cli_err("peer probe: failed: %s", msg);</div><div class='add'>+</div><div class='add'>+    ret = rsp.op_ret;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    cli_cmd_broadcast_response(ret);</div><div class='add'>+    gf_free_xdr_cli_rsp(rsp);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+gf_cli_deprobe_cbk(struct rpc_req *req, struct iovec *iov, int count,</div><div class='add'>+                   void *myframe)</div><div class='add'>+{</div><div class='add'>+    gf_cli_rsp rsp = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int ret = -1;</div><div class='add'>+    char msg[1024] = "success";</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(myframe);</div><div class='add'>+</div><div class='add'>+    if (-1 == req-&gt;rpc_status) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = xdr_to_generic(*iov, &amp;rsp, (xdrproc_t)xdr_gf_cli_rsp);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        gf_log(((call_frame_t *)myframe)-&gt;this-&gt;name, GF_LOG_ERROR,</div><div class='add'>+               XDR_DECODE_FAIL);</div><div class='add'>+        // rsp.op_ret   = -1;</div><div class='add'>+        // rsp.op_errno = EINVAL;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    gf_log("cli", GF_LOG_INFO, "Received resp to deprobe");</div><div class='add'>+</div><div class='add'>+    if (rsp.op_ret) {</div><div class='add'>+        if (rsp.op_errstr[0] != '\0') {</div><div class='add'>+            snprintf(msg, sizeof(msg), "%s", rsp.op_errstr);</div><div class='add'>+            gf_log("cli", GF_LOG_ERROR, "%s", rsp.op_errstr);</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (global_state-&gt;mode &amp; GLUSTER_MODE_XML) {</div><div class='add'>+        ret = cli_xml_output_str(NULL, (rsp.op_ret) ? NULL : msg, rsp.op_ret,</div><div class='add'>+                                 rsp.op_errno, (rsp.op_ret) ? msg : NULL);</div><div class='add'>+        if (ret)</div><div class='add'>+            gf_log("cli", GF_LOG_ERROR, XML_ERROR);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (!rsp.op_ret)</div><div class='add'>+        cli_out("peer detach: %s", msg);</div><div class='add'>+    else</div><div class='add'>+        cli_err("peer detach: failed: %s", msg);</div><div class='add'>+</div><div class='add'>+    ret = rsp.op_ret;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    cli_cmd_broadcast_response(ret);</div><div class='add'>+    gf_free_xdr_cli_rsp(rsp);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+gf_cli_output_peer_hostnames(dict_t *dict, int count, const char *prefix)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    char key[512] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int i = 0;</div><div class='add'>+    char *hostname = NULL;</div><div class='add'>+</div><div class='add'>+    cli_out("Other names:");</div><div class='add'>+    /* Starting from friend.hostname1, as friend.hostname0 will be the same</div><div class='add'>+     * as friend.hostname</div><div class='add'>+     */</div><div class='add'>+    for (i = 1; i &lt; count; i++) {</div><div class='add'>+        ret = snprintf(key, sizeof(key), "%s.hostname%d", prefix, i);</div><div class='add'>+        ret = dict_get_strn(dict, key, ret, &amp;hostname);</div><div class='add'>+        if (ret)</div><div class='add'>+            break;</div><div class='add'>+        cli_out("%s", hostname);</div><div class='add'>+        hostname = NULL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+gf_cli_output_peer_status(dict_t *dict, int count)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    char *uuid_buf = NULL;</div><div class='add'>+    char *hostname_buf = NULL;</div><div class='add'>+    int32_t i = 1;</div><div class='add'>+    char key[256] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int keylen;</div><div class='add'>+    char *state = NULL;</div><div class='add'>+    int32_t connected = 0;</div><div class='add'>+    const char *connected_str = NULL;</div><div class='add'>+    int hostname_count = 0;</div><div class='add'>+</div><div class='add'>+    cli_out("Number of Peers: %d", count);</div><div class='add'>+    i = 1;</div><div class='add'>+    while (i &lt;= count) {</div><div class='add'>+        keylen = snprintf(key, sizeof(key), "friend%d.uuid", i);</div><div class='add'>+        ret = dict_get_strn(dict, key, keylen, &amp;uuid_buf);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+</div><div class='add'>+        keylen = snprintf(key, sizeof(key), "friend%d.hostname", i);</div><div class='add'>+        ret = dict_get_strn(dict, key, keylen, &amp;hostname_buf);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+</div><div class='add'>+        keylen = snprintf(key, sizeof(key), "friend%d.connected", i);</div><div class='add'>+        ret = dict_get_int32n(dict, key, keylen, &amp;connected);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+        if (connected)</div><div class='add'>+            connected_str = "Connected";</div><div class='add'>+        else</div><div class='add'>+            connected_str = "Disconnected";</div><div class='add'>+</div><div class='add'>+        keylen = snprintf(key, sizeof(key), "friend%d.state", i);</div><div class='add'>+        ret = dict_get_strn(dict, key, keylen, &amp;state);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+</div><div class='add'>+        cli_out("\nHostname: %s\nUuid: %s\nState: %s (%s)", hostname_buf,</div><div class='add'>+                uuid_buf, state, connected_str);</div><div class='add'>+</div><div class='add'>+        keylen = snprintf(key, sizeof(key), "friend%d.hostname_count", i);</div><div class='add'>+        ret = dict_get_int32n(dict, key, keylen, &amp;hostname_count);</div><div class='add'>+        /* Print other addresses only if there are more than 1.</div><div class='add'>+         */</div><div class='add'>+        if ((ret == 0) &amp;&amp; (hostname_count &gt; 1)) {</div><div class='add'>+            snprintf(key, sizeof(key), "friend%d", i);</div><div class='add'>+            ret = gf_cli_output_peer_hostnames(dict, hostname_count, key);</div><div class='add'>+            if (ret) {</div><div class='add'>+                gf_log("cli", GF_LOG_WARNING,</div><div class='add'>+                       "error outputting peer other names");</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+        i++;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+gf_cli_output_pool_list(dict_t *dict, int count)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    char *uuid_buf = NULL;</div><div class='add'>+    char *hostname_buf = NULL;</div><div class='add'>+    int32_t hostname_len = 8; /*min len 8 chars*/</div><div class='add'>+    int32_t i = 1;</div><div class='add'>+    char key[64] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int keylen;</div><div class='add'>+    int32_t connected = 0;</div><div class='add'>+    const char *connected_str = NULL;</div><div class='add'>+</div><div class='add'>+    if (count &lt;= 0)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    while (i &lt;= count) {</div><div class='add'>+        keylen = snprintf(key, sizeof(key), "friend%d.hostname", i);</div><div class='add'>+        ret = dict_get_strn(dict, key, keylen, &amp;hostname_buf);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+</div><div class='add'>+        ret = strlen(hostname_buf);</div><div class='add'>+        if (ret &gt; hostname_len)</div><div class='add'>+            hostname_len = ret;</div><div class='add'>+</div><div class='add'>+        i++;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    cli_out("UUID\t\t\t\t\t%-*s\tState", hostname_len, "Hostname");</div><div class='add'>+</div><div class='add'>+    i = 1;</div><div class='add'>+    while (i &lt;= count) {</div><div class='add'>+        keylen = snprintf(key, sizeof(key), "friend%d.uuid", i);</div><div class='add'>+        ret = dict_get_strn(dict, key, keylen, &amp;uuid_buf);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+</div><div class='add'>+        keylen = snprintf(key, sizeof(key), "friend%d.hostname", i);</div><div class='add'>+        ret = dict_get_strn(dict, key, keylen, &amp;hostname_buf);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+</div><div class='add'>+        keylen = snprintf(key, sizeof(key), "friend%d.connected", i);</div><div class='add'>+        ret = dict_get_int32n(dict, key, keylen, &amp;connected);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+        if (connected)</div><div class='add'>+            connected_str = "Connected";</div><div class='add'>+        else</div><div class='add'>+            connected_str = "Disconnected";</div><div class='add'>+</div><div class='add'>+        cli_out("%s\t%-*s\t%s ", uuid_buf, hostname_len, hostname_buf,</div><div class='add'>+                connected_str);</div><div class='add'>+        i++;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* function pointer for gf_cli_output_{pool_list,peer_status} */</div><div class='add'>+typedef int (*cli_friend_output_fn)(dict_t *, int);</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+gf_cli_list_friends_cbk(struct rpc_req *req, struct iovec *iov, int count,</div><div class='add'>+                        void *myframe)</div><div class='add'>+{</div><div class='add'>+    gf1_cli_peer_list_rsp rsp = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int ret = -1;</div><div class='add'>+    dict_t *dict = NULL;</div><div class='add'>+    char msg[1024] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    const char *cmd = NULL;</div><div class='add'>+    cli_friend_output_fn friend_output_fn;</div><div class='add'>+    call_frame_t *frame = NULL;</div><div class='add'>+    unsigned long flags = 0;</div><div class='add'>+</div><div class='add'>+    if (-1 == req-&gt;rpc_status) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(myframe);</div><div class='add'>+</div><div class='add'>+    frame = myframe;</div><div class='add'>+</div><div class='add'>+    flags = (long)frame-&gt;local;</div><div class='add'>+</div><div class='add'>+    if (flags == GF_CLI_LIST_POOL_NODES) {</div><div class='add'>+        cmd = "pool list";</div><div class='add'>+        friend_output_fn = &amp;gf_cli_output_pool_list;</div><div class='add'>+    } else {</div><div class='add'>+        cmd = "peer status";</div><div class='add'>+        friend_output_fn = &amp;gf_cli_output_peer_status;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* 'free' the flags set by gf_cli_list_friends */</div><div class='add'>+    frame-&gt;local = NULL;</div><div class='add'>+</div><div class='add'>+    ret = xdr_to_generic(*iov, &amp;rsp, (xdrproc_t)xdr_gf1_cli_peer_list_rsp);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        gf_log(frame-&gt;this-&gt;name, GF_LOG_ERROR, XDR_DECODE_FAIL);</div><div class='add'>+        // rsp.op_ret   = -1;</div><div class='add'>+        // rsp.op_errno = EINVAL;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    gf_log("cli", GF_LOG_DEBUG, "Received resp to list: %d", rsp.op_ret);</div><div class='add'>+</div><div class='add'>+    if (!rsp.op_ret) {</div><div class='add'>+        if (!rsp.friends.friends_len) {</div><div class='add'>+            snprintf(msg, sizeof(msg), "%s: No peers present", cmd);</div><div class='add'>+            if (global_state-&gt;mode &amp; GLUSTER_MODE_XML) {</div><div class='add'>+                ret = cli_xml_output_peer_status(dict, rsp.op_ret, rsp.op_errno,</div><div class='add'>+                                                 msg);</div><div class='add'>+                if (ret)</div><div class='add'>+                    gf_log("cli", GF_LOG_ERROR, XML_ERROR);</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+            cli_err("%s", msg);</div><div class='add'>+            ret = 0;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        dict = dict_new();</div><div class='add'>+</div><div class='add'>+        if (!dict) {</div><div class='add'>+            ret = -1;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        ret = dict_unserialize(rsp.friends.friends_val, rsp.friends.friends_len,</div><div class='add'>+                               &amp;dict);</div><div class='add'>+</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_log("", GF_LOG_ERROR, DICT_UNSERIALIZE_FAIL);</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        if (global_state-&gt;mode &amp; GLUSTER_MODE_XML) {</div><div class='add'>+            ret = cli_xml_output_peer_status(dict, rsp.op_ret, rsp.op_errno,</div><div class='add'>+                                             msg);</div><div class='add'>+            if (ret)</div><div class='add'>+                gf_log("cli", GF_LOG_ERROR, XML_ERROR);</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        ret = dict_get_int32_sizen(dict, "count", &amp;count);</div><div class='add'>+        if (ret) {</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        ret = friend_output_fn(dict, count);</div><div class='add'>+        if (ret) {</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    } else {</div><div class='add'>+        if (global_state-&gt;mode &amp; GLUSTER_MODE_XML) {</div><div class='add'>+            ret = cli_xml_output_peer_status(dict, rsp.op_ret, rsp.op_errno,</div><div class='add'>+                                             NULL);</div><div class='add'>+            if (ret)</div><div class='add'>+                gf_log("cli", GF_LOG_ERROR, XML_ERROR);</div><div class='add'>+        } else {</div><div class='add'>+            ret = -1;</div><div class='add'>+        }</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (ret)</div><div class='add'>+        cli_err("%s: failed", cmd);</div><div class='add'>+</div><div class='add'>+    cli_cmd_broadcast_response(ret);</div><div class='add'>+</div><div class='add'>+    if (dict)</div><div class='add'>+        dict_unref(dict);</div><div class='add'>+</div><div class='add'>+    if (rsp.friends.friends_val) {</div><div class='add'>+        free(rsp.friends.friends_val);</div><div class='add'>+    }</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+gf_cli_get_state_cbk(struct rpc_req *req, struct iovec *iov, int count,</div><div class='add'>+                     void *myframe)</div><div class='add'>+{</div><div class='add'>+    gf_cli_rsp rsp = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int ret = -1;</div><div class='add'>+    dict_t *dict = NULL;</div><div class='add'>+    char *daemon_name = NULL;</div><div class='add'>+    char *ofilepath = NULL;</div><div class='add'>+</div><div class='add'>+    GF_VALIDATE_OR_GOTO("cli", myframe, out);</div><div class='add'>+</div><div class='add'>+    if (-1 == req-&gt;rpc_status) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    ret = xdr_to_generic(*iov, &amp;rsp, (xdrproc_t)xdr_gf_cli_rsp);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        gf_log(((call_frame_t *)myframe)-&gt;this-&gt;name, GF_LOG_ERROR,</div><div class='add'>+               XDR_DECODE_FAIL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    dict = dict_new();</div><div class='add'>+</div><div class='add'>+    if (!dict) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_unserialize(rsp.dict.dict_val, rsp.dict.dict_len, &amp;dict);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    if (rsp.op_ret) {</div><div class='add'>+        if (strcmp(rsp.op_errstr, ""))</div><div class='add'>+            cli_err("Failed to get daemon state: %s", rsp.op_errstr);</div><div class='add'>+        else</div><div class='add'>+            cli_err(</div><div class='add'>+                "Failed to get daemon state. Check glusterd"</div><div class='add'>+                " log file for more details");</div><div class='add'>+    } else {</div><div class='add'>+        ret = dict_get_str_sizen(dict, "daemon", &amp;daemon_name);</div><div class='add'>+        if (ret)</div><div class='add'>+            gf_log("cli", GF_LOG_ERROR, "Couldn't get daemon name");</div><div class='add'>+</div><div class='add'>+        ret = dict_get_str_sizen(dict, "ofilepath", &amp;ofilepath);</div><div class='add'>+        if (ret)</div><div class='add'>+            gf_log("cli", GF_LOG_ERROR, "Couldn't get filepath");</div><div class='add'>+</div><div class='add'>+        if (daemon_name &amp;&amp; ofilepath)</div><div class='add'>+            cli_out("%s state dumped to %s", daemon_name, ofilepath);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = rsp.op_ret;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (dict)</div><div class='add'>+        dict_unref(dict);</div><div class='add'>+</div><div class='add'>+    cli_cmd_broadcast_response(ret);</div><div class='add'>+    gf_free_xdr_cli_rsp(rsp);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+cli_out_options(char *substr, char *optstr, char *valstr)</div><div class='add'>+{</div><div class='add'>+    char *ptr1 = NULL;</div><div class='add'>+    char *ptr2 = NULL;</div><div class='add'>+</div><div class='add'>+    ptr1 = substr;</div><div class='add'>+    ptr2 = optstr;</div><div class='add'>+</div><div class='add'>+    while (ptr1) {</div><div class='add'>+        /* Avoiding segmentation fault. */</div><div class='add'>+        if (!ptr2)</div><div class='add'>+            return;</div><div class='add'>+        if (*ptr1 != *ptr2)</div><div class='add'>+            break;</div><div class='add'>+        ptr1++;</div><div class='add'>+        ptr2++;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (*ptr2 == '\0')</div><div class='add'>+        return;</div><div class='add'>+    cli_out("%s: %s", ptr2, valstr);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+_gf_cli_output_volinfo_opts(dict_t *d, char *k, data_t *v, void *tmp)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+    char *key = NULL;</div><div class='add'>+    char *ptr = NULL;</div><div class='add'>+    data_t *value = NULL;</div><div class='add'>+</div><div class='add'>+    key = tmp;</div><div class='add'>+</div><div class='add'>+    ptr = strstr(k, "option.");</div><div class='add'>+    if (ptr) {</div><div class='add'>+        value = v;</div><div class='add'>+        if (!value) {</div><div class='add'>+            ret = -1;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+        cli_out_options(key, k, v-&gt;data);</div><div class='add'>+    }</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+print_brick_details(dict_t *dict, int volcount, int start_index, int end_index,</div><div class='add'>+                    int replica_count)</div><div class='add'>+{</div><div class='add'>+    char key[64] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int keylen;</div><div class='add'>+    int index = start_index;</div><div class='add'>+    int isArbiter = 0;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    char *brick = NULL;</div><div class='add'>+</div><div class='add'>+    while (index &lt;= end_index) {</div><div class='add'>+        keylen = snprintf(key, sizeof(key), "volume%d.brick%d", volcount,</div><div class='add'>+                          index);</div><div class='add'>+        ret = dict_get_strn(dict, key, keylen, &amp;brick);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+        keylen = snprintf(key, sizeof(key), "volume%d.brick%d.isArbiter",</div><div class='add'>+                          volcount, index);</div><div class='add'>+        if (dict_getn(dict, key, keylen))</div><div class='add'>+            isArbiter = 1;</div><div class='add'>+        else</div><div class='add'>+            isArbiter = 0;</div><div class='add'>+</div><div class='add'>+        if (isArbiter)</div><div class='add'>+            cli_out("Brick%d: %s (arbiter)", index, brick);</div><div class='add'>+        else</div><div class='add'>+            cli_out("Brick%d: %s", index, brick);</div><div class='add'>+        index++;</div><div class='add'>+    }</div><div class='add'>+    ret = 0;</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf_cli_print_number_of_bricks(int type, int brick_count, int dist_count,</div><div class='add'>+                              int stripe_count, int replica_count,</div><div class='add'>+                              int disperse_count, int redundancy_count,</div><div class='add'>+                              int arbiter_count)</div><div class='add'>+{</div><div class='add'>+    if (type == GF_CLUSTER_TYPE_NONE) {</div><div class='add'>+        cli_out("Number of Bricks: %d", brick_count);</div><div class='add'>+    } else if (type == GF_CLUSTER_TYPE_DISPERSE) {</div><div class='add'>+        cli_out("Number of Bricks: %d x (%d + %d) = %d",</div><div class='add'>+                (brick_count / dist_count), disperse_count - redundancy_count,</div><div class='add'>+                redundancy_count, brick_count);</div><div class='add'>+    } else {</div><div class='add'>+        /* For both replicate and stripe, dist_count is</div><div class='add'>+           good enough */</div><div class='add'>+        if (arbiter_count == 0) {</div><div class='add'>+            cli_out("Number of Bricks: %d x %d = %d",</div><div class='add'>+                    (brick_count / dist_count), dist_count, brick_count);</div><div class='add'>+        } else {</div><div class='add'>+            cli_out("Number of Bricks: %d x (%d + %d) = %d",</div><div class='add'>+                    (brick_count / dist_count), dist_count - arbiter_count,</div><div class='add'>+                    arbiter_count, brick_count);</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+gf_cli_get_volume_cbk(struct rpc_req *req, struct iovec *iov, int count,</div><div class='add'>+                      void *myframe)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int opt_count = 0;</div><div class='add'>+    int32_t i = 0;</div><div class='add'>+    int32_t j = 1;</div><div class='add'>+    int32_t status = 0;</div><div class='add'>+    int32_t type = 0;</div><div class='add'>+    int32_t brick_count = 0;</div><div class='add'>+    int32_t dist_count = 0;</div><div class='add'>+    int32_t stripe_count = 0;</div><div class='add'>+    int32_t replica_count = 0;</div><div class='add'>+    int32_t disperse_count = 0;</div><div class='add'>+    int32_t redundancy_count = 0;</div><div class='add'>+    int32_t arbiter_count = 0;</div><div class='add'>+    int32_t snap_count = 0;</div><div class='add'>+    int32_t thin_arbiter_count = 0;</div><div class='add'>+    int32_t vol_type = 0;</div><div class='add'>+    int32_t transport = 0;</div><div class='add'>+    char *volume_id_str = NULL;</div><div class='add'>+    char *volname = NULL;</div><div class='add'>+    char *ta_brick = NULL;</div><div class='add'>+    dict_t *dict = NULL;</div><div class='add'>+    cli_local_t *local = NULL;</div><div class='add'>+    char key[64] = {0};</div><div class='add'>+    int keylen;</div><div class='add'>+    char err_str[2048] = {0};</div><div class='add'>+    gf_cli_rsp rsp = {0};</div><div class='add'>+    char *caps __attribute__((unused)) = NULL;</div><div class='add'>+    int k __attribute__((unused)) = 0;</div><div class='add'>+    call_frame_t *frame = NULL;</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(myframe);</div><div class='add'>+</div><div class='add'>+    if (-1 == req-&gt;rpc_status)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    frame = myframe;</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(frame-&gt;local);</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+</div><div class='add'>+    ret = xdr_to_generic(*iov, &amp;rsp, (xdrproc_t)xdr_gf_cli_rsp);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        gf_log(frame-&gt;this-&gt;name, GF_LOG_ERROR, XDR_DECODE_FAIL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    gf_log("cli", GF_LOG_INFO, "Received resp to get vol: %d", rsp.op_ret);</div><div class='add'>+</div><div class='add'>+    if (!rsp.dict.dict_len) {</div><div class='add'>+        if (global_state-&gt;mode &amp; GLUSTER_MODE_XML)</div><div class='add'>+            goto xml_output;</div><div class='add'>+        cli_err("No volumes present");</div><div class='add'>+        ret = 0;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    dict = dict_new();</div><div class='add'>+</div><div class='add'>+    if (!dict) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_unserialize(rsp.dict.dict_val, rsp.dict.dict_len, &amp;dict);</div><div class='add'>+</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log("cli", GF_LOG_ERROR, DICT_UNSERIALIZE_FAIL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_get_int32_sizen(dict, "count", &amp;count);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    if (!count) {</div><div class='add'>+        switch (local-&gt;get_vol.flags) {</div><div class='add'>+            case GF_CLI_GET_NEXT_VOLUME:</div><div class='add'>+                GF_FREE(local-&gt;get_vol.volname);</div><div class='add'>+                local-&gt;get_vol.volname = NULL;</div><div class='add'>+                ret = 0;</div><div class='add'>+                goto out;</div><div class='add'>+</div><div class='add'>+            case GF_CLI_GET_VOLUME:</div><div class='add'>+                snprintf(err_str, sizeof(err_str), "Volume %s does not exist",</div><div class='add'>+                         local-&gt;get_vol.volname);</div><div class='add'>+                ret = -1;</div><div class='add'>+                if (!(global_state-&gt;mode &amp; GLUSTER_MODE_XML))</div><div class='add'>+                    goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (rsp.op_ret) {</div><div class='add'>+        if (global_state-&gt;mode &amp; GLUSTER_MODE_XML)</div><div class='add'>+            goto xml_output;</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+xml_output:</div><div class='add'>+    if (global_state-&gt;mode &amp; GLUSTER_MODE_XML) {</div><div class='add'>+        /* For GET_NEXT_VOLUME output is already begun in</div><div class='add'>+         * and will also end in gf_cli_get_next_volume()</div><div class='add'>+         */</div><div class='add'>+        if (local-&gt;get_vol.flags == GF_CLI_GET_VOLUME) {</div><div class='add'>+            ret = cli_xml_output_vol_info_begin(local, rsp.op_ret, rsp.op_errno,</div><div class='add'>+                                                rsp.op_errstr);</div><div class='add'>+            if (ret) {</div><div class='add'>+                gf_log("cli", GF_LOG_ERROR, XML_ERROR);</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        if (dict) {</div><div class='add'>+            ret = cli_xml_output_vol_info(local, dict);</div><div class='add'>+            if (ret) {</div><div class='add'>+                gf_log("cli", GF_LOG_ERROR, XML_ERROR);</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        if (local-&gt;get_vol.flags == GF_CLI_GET_VOLUME) {</div><div class='add'>+            ret = cli_xml_output_vol_info_end(local);</div><div class='add'>+            if (ret)</div><div class='add'>+                gf_log("cli", GF_LOG_ERROR, XML_ERROR);</div><div class='add'>+        }</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    while (i &lt; count) {</div><div class='add'>+        cli_out(" ");</div><div class='add'>+        keylen = snprintf(key, sizeof(key), "volume%d.name", i);</div><div class='add'>+        ret = dict_get_strn(dict, key, keylen, &amp;volname);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+</div><div class='add'>+        keylen = snprintf(key, sizeof(key), "volume%d.type", i);</div><div class='add'>+        ret = dict_get_int32n(dict, key, keylen, &amp;type);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+</div><div class='add'>+        keylen = snprintf(key, sizeof(key), "volume%d.status", i);</div><div class='add'>+        ret = dict_get_int32n(dict, key, keylen, &amp;status);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+</div><div class='add'>+        keylen = snprintf(key, sizeof(key), "volume%d.brick_count", i);</div><div class='add'>+        ret = dict_get_int32n(dict, key, keylen, &amp;brick_count);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+</div><div class='add'>+        keylen = snprintf(key, sizeof(key), "volume%d.dist_count", i);</div><div class='add'>+        ret = dict_get_int32n(dict, key, keylen, &amp;dist_count);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+</div><div class='add'>+        keylen = snprintf(key, sizeof(key), "volume%d.stripe_count", i);</div><div class='add'>+        ret = dict_get_int32n(dict, key, keylen, &amp;stripe_count);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+</div><div class='add'>+        keylen = snprintf(key, sizeof(key), "volume%d.replica_count", i);</div><div class='add'>+        ret = dict_get_int32n(dict, key, keylen, &amp;replica_count);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+</div><div class='add'>+        keylen = snprintf(key, sizeof(key), "volume%d.disperse_count", i);</div><div class='add'>+        ret = dict_get_int32n(dict, key, keylen, &amp;disperse_count);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+</div><div class='add'>+        keylen = snprintf(key, sizeof(key), "volume%d.redundancy_count", i);</div><div class='add'>+        ret = dict_get_int32n(dict, key, keylen, &amp;redundancy_count);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+</div><div class='add'>+        keylen = snprintf(key, sizeof(key), "volume%d.arbiter_count", i);</div><div class='add'>+        ret = dict_get_int32n(dict, key, keylen, &amp;arbiter_count);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+</div><div class='add'>+        keylen = snprintf(key, sizeof(key), "volume%d.transport", i);</div><div class='add'>+        ret = dict_get_int32n(dict, key, keylen, &amp;transport);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+</div><div class='add'>+        keylen = snprintf(key, sizeof(key), "volume%d.volume_id", i);</div><div class='add'>+        ret = dict_get_strn(dict, key, keylen, &amp;volume_id_str);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+</div><div class='add'>+        keylen = snprintf(key, sizeof(key), "volume%d.snap_count", i);</div><div class='add'>+        ret = dict_get_int32n(dict, key, keylen, &amp;snap_count);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+</div><div class='add'>+        keylen = snprintf(key, sizeof(key), "volume%d.thin_arbiter_count", i);</div><div class='add'>+        ret = dict_get_int32n(dict, key, keylen, &amp;thin_arbiter_count);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+</div><div class='add'>+        // Distributed (stripe/replicate/stripe-replica) setups</div><div class='add'>+        vol_type = get_vol_type(type, dist_count, brick_count);</div><div class='add'>+</div><div class='add'>+        cli_out("Volume Name: %s", volname);</div><div class='add'>+        cli_out("Type: %s", vol_type_str[vol_type]);</div><div class='add'>+        cli_out("Volume ID: %s", volume_id_str);</div><div class='add'>+        cli_out("Status: %s", cli_vol_status_str[status]);</div><div class='add'>+        cli_out("Snapshot Count: %d", snap_count);</div><div class='add'>+</div><div class='add'>+        gf_cli_print_number_of_bricks(</div><div class='add'>+            type, brick_count, dist_count, stripe_count, replica_count,</div><div class='add'>+            disperse_count, redundancy_count, arbiter_count);</div><div class='add'>+</div><div class='add'>+        cli_out("Transport-type: %s",</div><div class='add'>+                ((transport == 0) ? "tcp"</div><div class='add'>+                                  : (transport == 1) ? "rdma" : "tcp,rdma"));</div><div class='add'>+        j = 1;</div><div class='add'>+</div><div class='add'>+        GF_FREE(local-&gt;get_vol.volname);</div><div class='add'>+        local-&gt;get_vol.volname = gf_strdup(volname);</div><div class='add'>+</div><div class='add'>+        cli_out("Bricks:");</div><div class='add'>+        ret = print_brick_details(dict, i, j, brick_count, replica_count);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+</div><div class='add'>+        if (thin_arbiter_count) {</div><div class='add'>+            snprintf(key, sizeof(key), "volume%d.thin_arbiter_brick", i);</div><div class='add'>+            ret = dict_get_str(dict, key, &amp;ta_brick);</div><div class='add'>+            if (ret)</div><div class='add'>+                goto out;</div><div class='add'>+            cli_out("Thin-arbiter-path: %s", ta_brick);</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        snprintf(key, sizeof(key), "volume%d.opt_count", i);</div><div class='add'>+        ret = dict_get_int32(dict, key, &amp;opt_count);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+</div><div class='add'>+        if (!opt_count)</div><div class='add'>+            goto out;</div><div class='add'>+</div><div class='add'>+        cli_out("Options Reconfigured:");</div><div class='add'>+</div><div class='add'>+        snprintf(key, sizeof(key), "volume%d.option.", i);</div><div class='add'>+</div><div class='add'>+        ret = dict_foreach(dict, _gf_cli_output_volinfo_opts, key);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+</div><div class='add'>+        i++;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+out:</div><div class='add'>+    if (ret)</div><div class='add'>+        cli_err("%s", err_str);</div><div class='add'>+</div><div class='add'>+    cli_cmd_broadcast_response(ret);</div><div class='add'>+</div><div class='add'>+    if (dict)</div><div class='add'>+        dict_unref(dict);</div><div class='add'>+</div><div class='add'>+    gf_free_xdr_cli_rsp(rsp);</div><div class='add'>+</div><div class='add'>+    gf_log("cli", GF_LOG_DEBUG, RETURNING, ret);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+gf_cli_create_volume_cbk(struct rpc_req *req, struct iovec *iov, int count,</div><div class='add'>+                         void *myframe)</div><div class='add'>+{</div><div class='add'>+    gf_cli_rsp rsp = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int ret = -1;</div><div class='add'>+    cli_local_t *local = NULL;</div><div class='add'>+    char *volname = NULL;</div><div class='add'>+    dict_t *rsp_dict = NULL;</div><div class='add'>+    call_frame_t *frame = NULL;</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(myframe);</div><div class='add'>+</div><div class='add'>+    if (-1 == req-&gt;rpc_status) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    frame = myframe;</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(frame-&gt;local);</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+</div><div class='add'>+    ret = xdr_to_generic(*iov, &amp;rsp, (xdrproc_t)xdr_gf_cli_rsp);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        gf_log(frame-&gt;this-&gt;name, GF_LOG_ERROR, XDR_DECODE_FAIL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    gf_log("cli", GF_LOG_INFO, "Received resp to create volume");</div><div class='add'>+</div><div class='add'>+    if (global_state-&gt;mode &amp; GLUSTER_MODE_XML) {</div><div class='add'>+        if (rsp.op_ret == 0) {</div><div class='add'>+            rsp_dict = dict_new();</div><div class='add'>+            ret = dict_unserialize(rsp.dict.dict_val, rsp.dict.dict_len,</div><div class='add'>+                                   &amp;rsp_dict);</div><div class='add'>+            if (ret) {</div><div class='add'>+                gf_log("cli", GF_LOG_ERROR, DICT_UNSERIALIZE_FAIL);</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        ret = cli_xml_output_vol_create(rsp_dict, rsp.op_ret, rsp.op_errno,</div><div class='add'>+                                        rsp.op_errstr);</div><div class='add'>+        if (ret)</div><div class='add'>+            gf_log("cli", GF_LOG_ERROR, XML_ERROR);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_get_str_sizen(local-&gt;dict, "volname", &amp;volname);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    if (rsp.op_ret &amp;&amp; strcmp(rsp.op_errstr, ""))</div><div class='add'>+        cli_err("volume create: %s: failed: %s", volname, rsp.op_errstr);</div><div class='add'>+    else if (rsp.op_ret)</div><div class='add'>+        cli_err("volume create: %s: failed", volname);</div><div class='add'>+    else</div><div class='add'>+        cli_out(</div><div class='add'>+            "volume create: %s: success: "</div><div class='add'>+            "please start the volume to access data",</div><div class='add'>+            volname);</div><div class='add'>+</div><div class='add'>+    ret = rsp.op_ret;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    cli_cmd_broadcast_response(ret);</div><div class='add'>+    gf_free_xdr_cli_rsp(rsp);</div><div class='add'>+</div><div class='add'>+    if (rsp_dict)</div><div class='add'>+        dict_unref(rsp_dict);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+gf_cli_delete_volume_cbk(struct rpc_req *req, struct iovec *iov, int count,</div><div class='add'>+                         void *myframe)</div><div class='add'>+{</div><div class='add'>+    gf_cli_rsp rsp = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int ret = -1;</div><div class='add'>+    cli_local_t *local = NULL;</div><div class='add'>+    char *volname = NULL;</div><div class='add'>+    call_frame_t *frame = NULL;</div><div class='add'>+    dict_t *rsp_dict = NULL;</div><div class='add'>+</div><div class='add'>+    if (-1 == req-&gt;rpc_status) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(myframe);</div><div class='add'>+    frame = myframe;</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(frame-&gt;local);</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+</div><div class='add'>+    ret = xdr_to_generic(*iov, &amp;rsp, (xdrproc_t)xdr_gf_cli_rsp);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        gf_log(frame-&gt;this-&gt;name, GF_LOG_ERROR, XDR_DECODE_FAIL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    gf_log("cli", GF_LOG_INFO, "Received resp to delete volume");</div><div class='add'>+</div><div class='add'>+    if (global_state-&gt;mode &amp; GLUSTER_MODE_XML) {</div><div class='add'>+        if (rsp.op_ret == 0) {</div><div class='add'>+            rsp_dict = dict_new();</div><div class='add'>+            ret = dict_unserialize(rsp.dict.dict_val, rsp.dict.dict_len,</div><div class='add'>+                                   &amp;rsp_dict);</div><div class='add'>+            if (ret) {</div><div class='add'>+                gf_log("cli", GF_LOG_ERROR, DICT_UNSERIALIZE_FAIL);</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        ret = cli_xml_output_generic_volume("volDelete", rsp_dict, rsp.op_ret,</div><div class='add'>+                                            rsp.op_errno, rsp.op_errstr);</div><div class='add'>+        if (ret)</div><div class='add'>+            gf_log("cli", GF_LOG_ERROR, XML_ERROR);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_get_str_sizen(local-&gt;dict, "volname", &amp;volname);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log(frame-&gt;this-&gt;name, GF_LOG_ERROR, "dict get failed");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (rsp.op_ret &amp;&amp; strcmp(rsp.op_errstr, ""))</div><div class='add'>+        cli_err("volume delete: %s: failed: %s", volname, rsp.op_errstr);</div><div class='add'>+    else if (rsp.op_ret)</div><div class='add'>+        cli_err("volume delete: %s: failed", volname);</div><div class='add'>+    else</div><div class='add'>+        cli_out("volume delete: %s: success", volname);</div><div class='add'>+</div><div class='add'>+    ret = rsp.op_ret;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    cli_cmd_broadcast_response(ret);</div><div class='add'>+    gf_free_xdr_cli_rsp(rsp);</div><div class='add'>+</div><div class='add'>+    if (rsp_dict)</div><div class='add'>+        dict_unref(rsp_dict);</div><div class='add'>+    gf_log("", GF_LOG_DEBUG, RETURNING, ret);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+gf_cli3_1_uuid_get_cbk(struct rpc_req *req, struct iovec *iov, int count,</div><div class='add'>+                       void *myframe)</div><div class='add'>+{</div><div class='add'>+    char *uuid_str = NULL;</div><div class='add'>+    gf_cli_rsp rsp = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int ret = -1;</div><div class='add'>+    cli_local_t *local = NULL;</div><div class='add'>+    call_frame_t *frame = NULL;</div><div class='add'>+    dict_t *dict = NULL;</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(myframe);</div><div class='add'>+</div><div class='add'>+    if (-1 == req-&gt;rpc_status)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    frame = myframe;</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(frame-&gt;local);</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+</div><div class='add'>+    ret = xdr_to_generic(*iov, &amp;rsp, (xdrproc_t)xdr_gf_cli_rsp);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        gf_log(frame-&gt;this-&gt;name, GF_LOG_ERROR, XDR_DECODE_FAIL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    frame-&gt;local = NULL;</div><div class='add'>+</div><div class='add'>+    gf_log("cli", GF_LOG_INFO, "Received resp to uuid get");</div><div class='add'>+</div><div class='add'>+    dict = dict_new();</div><div class='add'>+    if (!dict) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_unserialize(rsp.dict.dict_val, rsp.dict.dict_len, &amp;dict);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log("cli", GF_LOG_ERROR, DICT_UNSERIALIZE_FAIL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (global_state-&gt;mode &amp; GLUSTER_MODE_XML) {</div><div class='add'>+        ret = cli_xml_output_dict("uuidGenerate", dict, rsp.op_ret,</div><div class='add'>+                                  rsp.op_errno, rsp.op_errstr);</div><div class='add'>+        if (ret)</div><div class='add'>+            gf_log("cli", GF_LOG_ERROR, XML_ERROR);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (rsp.op_ret) {</div><div class='add'>+        if (strcmp(rsp.op_errstr, "") == 0)</div><div class='add'>+            cli_err("Get uuid was unsuccessful");</div><div class='add'>+        else</div><div class='add'>+            cli_err("%s", rsp.op_errstr);</div><div class='add'>+</div><div class='add'>+    } else {</div><div class='add'>+        ret = dict_get_str_sizen(dict, "uuid", &amp;uuid_str);</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_log("cli", GF_LOG_ERROR, "Failed to get uuid from dictionary");</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+        cli_out("UUID: %s", uuid_str);</div><div class='add'>+    }</div><div class='add'>+    ret = rsp.op_ret;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    cli_cmd_broadcast_response(ret);</div><div class='add'>+    cli_local_wipe(local);</div><div class='add'>+    gf_free_xdr_cli_rsp(rsp);</div><div class='add'>+</div><div class='add'>+    if (dict)</div><div class='add'>+        dict_unref(dict);</div><div class='add'>+</div><div class='add'>+    gf_log("", GF_LOG_DEBUG, RETURNING, ret);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+gf_cli3_1_uuid_reset_cbk(struct rpc_req *req, struct iovec *iov, int count,</div><div class='add'>+                         void *myframe)</div><div class='add'>+{</div><div class='add'>+    gf_cli_rsp rsp = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int ret = -1;</div><div class='add'>+    cli_local_t *local = NULL;</div><div class='add'>+    call_frame_t *frame = NULL;</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(myframe);</div><div class='add'>+</div><div class='add'>+    if (-1 == req-&gt;rpc_status) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    frame = myframe;</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(frame-&gt;local);</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+</div><div class='add'>+    ret = xdr_to_generic(*iov, &amp;rsp, (xdrproc_t)xdr_gf_cli_rsp);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        gf_log(frame-&gt;this-&gt;name, GF_LOG_ERROR, XDR_DECODE_FAIL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    frame-&gt;local = NULL;</div><div class='add'>+</div><div class='add'>+    gf_log("cli", GF_LOG_INFO, "Received resp to uuid reset");</div><div class='add'>+</div><div class='add'>+    if (global_state-&gt;mode &amp; GLUSTER_MODE_XML) {</div><div class='add'>+        ret = cli_xml_output_dict("uuidReset", NULL, rsp.op_ret, rsp.op_errno,</div><div class='add'>+                                  rsp.op_errstr);</div><div class='add'>+        if (ret)</div><div class='add'>+            gf_log("cli", GF_LOG_ERROR, XML_ERROR);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (rsp.op_ret &amp;&amp; strcmp(rsp.op_errstr, ""))</div><div class='add'>+        cli_err("%s", rsp.op_errstr);</div><div class='add'>+    else</div><div class='add'>+        cli_out("resetting the peer uuid has been %s",</div><div class='add'>+                (rsp.op_ret) ? "unsuccessful" : "successful");</div><div class='add'>+    ret = rsp.op_ret;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    cli_cmd_broadcast_response(ret);</div><div class='add'>+    cli_local_wipe(local);</div><div class='add'>+    gf_free_xdr_cli_rsp(rsp);</div><div class='add'>+</div><div class='add'>+    gf_log("", GF_LOG_DEBUG, RETURNING, ret);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+gf_cli_start_volume_cbk(struct rpc_req *req, struct iovec *iov, int count,</div><div class='add'>+                        void *myframe)</div><div class='add'>+{</div><div class='add'>+    gf_cli_rsp rsp = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int ret = -1;</div><div class='add'>+    cli_local_t *local = NULL;</div><div class='add'>+    char *volname = NULL;</div><div class='add'>+    call_frame_t *frame = NULL;</div><div class='add'>+    dict_t *rsp_dict = NULL;</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(myframe);</div><div class='add'>+</div><div class='add'>+    if (-1 == req-&gt;rpc_status) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    frame = myframe;</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(frame-&gt;local);</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+</div><div class='add'>+    ret = xdr_to_generic(*iov, &amp;rsp, (xdrproc_t)xdr_gf_cli_rsp);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        gf_log(frame-&gt;this-&gt;name, GF_LOG_ERROR, XDR_DECODE_FAIL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    gf_log("cli", GF_LOG_INFO, "Received resp to start volume");</div><div class='add'>+</div><div class='add'>+    if (global_state-&gt;mode &amp; GLUSTER_MODE_XML) {</div><div class='add'>+        if (rsp.op_ret == 0) {</div><div class='add'>+            rsp_dict = dict_new();</div><div class='add'>+            ret = dict_unserialize(rsp.dict.dict_val, rsp.dict.dict_len,</div><div class='add'>+                                   &amp;rsp_dict);</div><div class='add'>+            if (ret) {</div><div class='add'>+                gf_log("cli", GF_LOG_ERROR, DICT_UNSERIALIZE_FAIL);</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        ret = cli_xml_output_generic_volume("volStart", rsp_dict, rsp.op_ret,</div><div class='add'>+                                            rsp.op_errno, rsp.op_errstr);</div><div class='add'>+        if (ret)</div><div class='add'>+            gf_log("cli", GF_LOG_ERROR, XML_ERROR);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_get_str_sizen(local-&gt;dict, "volname", &amp;volname);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log("cli", GF_LOG_ERROR, "dict get failed");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (rsp.op_ret &amp;&amp; strcmp(rsp.op_errstr, ""))</div><div class='add'>+        cli_err("volume start: %s: failed: %s", volname, rsp.op_errstr);</div><div class='add'>+    else if (rsp.op_ret)</div><div class='add'>+        cli_err("volume start: %s: failed", volname);</div><div class='add'>+    else</div><div class='add'>+        cli_out("volume start: %s: success", volname);</div><div class='add'>+</div><div class='add'>+    ret = rsp.op_ret;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    cli_cmd_broadcast_response(ret);</div><div class='add'>+    gf_free_xdr_cli_rsp(rsp);</div><div class='add'>+</div><div class='add'>+    if (rsp_dict)</div><div class='add'>+        dict_unref(rsp_dict);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+gf_cli_stop_volume_cbk(struct rpc_req *req, struct iovec *iov, int count,</div><div class='add'>+                       void *myframe)</div><div class='add'>+{</div><div class='add'>+    gf_cli_rsp rsp = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int ret = -1;</div><div class='add'>+    cli_local_t *local = NULL;</div><div class='add'>+    char *volname = NULL;</div><div class='add'>+    call_frame_t *frame = NULL;</div><div class='add'>+    dict_t *rsp_dict = NULL;</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(myframe);</div><div class='add'>+</div><div class='add'>+    if (-1 == req-&gt;rpc_status) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    frame = myframe;</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(frame-&gt;local);</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+</div><div class='add'>+    ret = xdr_to_generic(*iov, &amp;rsp, (xdrproc_t)xdr_gf_cli_rsp);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        gf_log(frame-&gt;this-&gt;name, GF_LOG_ERROR, XDR_DECODE_FAIL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    gf_log("cli", GF_LOG_INFO, "Received resp to stop volume");</div><div class='add'>+</div><div class='add'>+    if (global_state-&gt;mode &amp; GLUSTER_MODE_XML) {</div><div class='add'>+        if (rsp.op_ret == 0) {</div><div class='add'>+            rsp_dict = dict_new();</div><div class='add'>+            ret = dict_unserialize(rsp.dict.dict_val, rsp.dict.dict_len,</div><div class='add'>+                                   &amp;rsp_dict);</div><div class='add'>+            if (ret) {</div><div class='add'>+                gf_log("cli", GF_LOG_ERROR, DICT_UNSERIALIZE_FAIL);</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        ret = cli_xml_output_generic_volume("volStop", rsp_dict, rsp.op_ret,</div><div class='add'>+                                            rsp.op_errno, rsp.op_errstr);</div><div class='add'>+        if (ret)</div><div class='add'>+            gf_log("cli", GF_LOG_ERROR, XML_ERROR);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_get_str_sizen(local-&gt;dict, "volname", &amp;volname);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log(frame-&gt;this-&gt;name, GF_LOG_ERROR,</div><div class='add'>+               "Unable to get volname from dict");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (rsp.op_ret &amp;&amp; strcmp(rsp.op_errstr, ""))</div><div class='add'>+        cli_err("volume stop: %s: failed: %s", volname, rsp.op_errstr);</div><div class='add'>+    else if (rsp.op_ret)</div><div class='add'>+        cli_err("volume stop: %s: failed", volname);</div><div class='add'>+    else</div><div class='add'>+        cli_out("volume stop: %s: success", volname);</div><div class='add'>+</div><div class='add'>+    ret = rsp.op_ret;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    cli_cmd_broadcast_response(ret);</div><div class='add'>+    gf_free_xdr_cli_rsp(rsp);</div><div class='add'>+</div><div class='add'>+    if (rsp_dict)</div><div class='add'>+        dict_unref(rsp_dict);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+gf_cli_print_rebalance_status(dict_t *dict, enum gf_task_types task_type)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int count = 0;</div><div class='add'>+    int i = 1;</div><div class='add'>+    char key[64] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int keylen;</div><div class='add'>+    gf_defrag_status_t status_rcd = GF_DEFRAG_STATUS_NOT_STARTED;</div><div class='add'>+    uint64_t files = 0;</div><div class='add'>+    uint64_t size = 0;</div><div class='add'>+    uint64_t lookup = 0;</div><div class='add'>+    char *node_name = NULL;</div><div class='add'>+    uint64_t failures = 0;</div><div class='add'>+    uint64_t skipped = 0;</div><div class='add'>+    double elapsed = 0;</div><div class='add'>+    char *status_str = NULL;</div><div class='add'>+    char *size_str = NULL;</div><div class='add'>+    int32_t hrs = 0;</div><div class='add'>+    uint32_t min = 0;</div><div class='add'>+    uint32_t sec = 0;</div><div class='add'>+    gf_boolean_t fix_layout = _gf_false;</div><div class='add'>+    uint64_t max_time = 0;</div><div class='add'>+    uint64_t max_elapsed = 0;</div><div class='add'>+    uint64_t time_left = 0;</div><div class='add'>+    gf_boolean_t show_estimates = _gf_false;</div><div class='add'>+</div><div class='add'>+    ret = dict_get_int32_sizen(dict, "count", &amp;count);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log("cli", GF_LOG_ERROR, "count not set");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    for (i = 1; i &lt;= count; i++) {</div><div class='add'>+        keylen = snprintf(key, sizeof(key), "status-%d", i);</div><div class='add'>+        ret = dict_get_int32n(dict, key, keylen, (int32_t *)&amp;status_rcd);</div><div class='add'>+        /* If information from a node is missing we should skip</div><div class='add'>+         * the node and try to fetch information of other nodes.</div><div class='add'>+         * If information is not found for all nodes, we should</div><div class='add'>+         * error out.</div><div class='add'>+         */</div><div class='add'>+        if (!ret)</div><div class='add'>+            break;</div><div class='add'>+        if (ret &amp;&amp; i == count) {</div><div class='add'>+            gf_log("cli", GF_LOG_TRACE, "failed to get status");</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Fix layout will be sent to all nodes for the volume</div><div class='add'>+       so every status should be of type</div><div class='add'>+       GF_DEFRAG_STATUS_LAYOUT_FIX*</div><div class='add'>+    */</div><div class='add'>+</div><div class='add'>+    if ((task_type == GF_TASK_TYPE_REBALANCE) &amp;&amp;</div><div class='add'>+        (status_rcd &gt;= GF_DEFRAG_STATUS_LAYOUT_FIX_STARTED)) {</div><div class='add'>+        fix_layout = _gf_true;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (fix_layout) {</div><div class='add'>+        cli_out("%35s %41s %27s", "Node", "status", "run time in h:m:s");</div><div class='add'>+        cli_out("%35s %41s %27s", "---------", "-----------", "------------");</div><div class='add'>+    } else {</div><div class='add'>+        cli_out("%40s %16s %13s %13s %13s %13s %20s %18s", "Node",</div><div class='add'>+                "Rebalanced-files", "size", "scanned", "failures", "skipped",</div><div class='add'>+                "status",</div><div class='add'>+                "run time in"</div><div class='add'>+                " h:m:s");</div><div class='add'>+        cli_out("%40s %16s %13s %13s %13s %13s %20s %18s", "---------",</div><div class='add'>+                "-----------", "-----------", "-----------", "-----------",</div><div class='add'>+                "-----------", "------------", "--------------");</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    for (i = 1; i &lt;= count; i++) {</div><div class='add'>+        /* Reset the variables to prevent carryover of values */</div><div class='add'>+        node_name = NULL;</div><div class='add'>+        files = 0;</div><div class='add'>+        size = 0;</div><div class='add'>+        lookup = 0;</div><div class='add'>+        skipped = 0;</div><div class='add'>+        status_str = NULL;</div><div class='add'>+        elapsed = 0;</div><div class='add'>+        time_left = 0;</div><div class='add'>+</div><div class='add'>+        /* Check if status is NOT_STARTED, and continue early */</div><div class='add'>+        keylen = snprintf(key, sizeof(key), "status-%d", i);</div><div class='add'>+</div><div class='add'>+        ret = dict_get_int32n(dict, key, keylen, (int32_t *)&amp;status_rcd);</div><div class='add'>+        if (ret == -ENOENT) {</div><div class='add'>+            gf_log("cli", GF_LOG_TRACE, "count %d %d", count, i);</div><div class='add'>+            gf_log("cli", GF_LOG_TRACE, "failed to get status");</div><div class='add'>+            gf_log("cli", GF_LOG_ERROR, "node down and has failed to set dict");</div><div class='add'>+            continue;</div><div class='add'>+            /* skip this node if value not available*/</div><div class='add'>+        } else if (ret) {</div><div class='add'>+            gf_log("cli", GF_LOG_TRACE, "count %d %d", count, i);</div><div class='add'>+            gf_log("cli", GF_LOG_TRACE, "failed to get status");</div><div class='add'>+            continue;</div><div class='add'>+            /* skip this node if value not available*/</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        if (GF_DEFRAG_STATUS_NOT_STARTED == status_rcd)</div><div class='add'>+            continue;</div><div class='add'>+</div><div class='add'>+        if (GF_DEFRAG_STATUS_STARTED == status_rcd)</div><div class='add'>+            show_estimates = _gf_true;</div><div class='add'>+</div><div class='add'>+        keylen = snprintf(key, sizeof(key), "node-name-%d", i);</div><div class='add'>+        ret = dict_get_strn(dict, key, keylen, &amp;node_name);</div><div class='add'>+        if (ret)</div><div class='add'>+            gf_log("cli", GF_LOG_TRACE, "failed to get node-name");</div><div class='add'>+</div><div class='add'>+        snprintf(key, sizeof(key), "files-%d", i);</div><div class='add'>+        ret = dict_get_uint64(dict, key, &amp;files);</div><div class='add'>+        if (ret)</div><div class='add'>+            gf_log("cli", GF_LOG_TRACE, "failed to get file count");</div><div class='add'>+</div><div class='add'>+        snprintf(key, sizeof(key), "size-%d", i);</div><div class='add'>+        ret = dict_get_uint64(dict, key, &amp;size);</div><div class='add'>+        if (ret)</div><div class='add'>+            gf_log("cli", GF_LOG_TRACE, "failed to get size of xfer");</div><div class='add'>+</div><div class='add'>+        snprintf(key, sizeof(key), "lookups-%d", i);</div><div class='add'>+        ret = dict_get_uint64(dict, key, &amp;lookup);</div><div class='add'>+        if (ret)</div><div class='add'>+            gf_log("cli", GF_LOG_TRACE, "failed to get lookedup file count");</div><div class='add'>+</div><div class='add'>+        snprintf(key, sizeof(key), "failures-%d", i);</div><div class='add'>+        ret = dict_get_uint64(dict, key, &amp;failures);</div><div class='add'>+        if (ret)</div><div class='add'>+            gf_log("cli", GF_LOG_TRACE, "failed to get failures count");</div><div class='add'>+</div><div class='add'>+        snprintf(key, sizeof(key), "skipped-%d", i);</div><div class='add'>+        ret = dict_get_uint64(dict, key, &amp;skipped);</div><div class='add'>+        if (ret)</div><div class='add'>+            gf_log("cli", GF_LOG_TRACE, "failed to get skipped count");</div><div class='add'>+</div><div class='add'>+        /* For remove-brick include skipped count into failure count*/</div><div class='add'>+        if (task_type != GF_TASK_TYPE_REBALANCE) {</div><div class='add'>+            failures += skipped;</div><div class='add'>+            skipped = 0;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        snprintf(key, sizeof(key), "run-time-%d", i);</div><div class='add'>+        ret = dict_get_double(dict, key, &amp;elapsed);</div><div class='add'>+        if (ret)</div><div class='add'>+            gf_log("cli", GF_LOG_TRACE, "failed to get run-time");</div><div class='add'>+</div><div class='add'>+        snprintf(key, sizeof(key), "time-left-%d", i);</div><div class='add'>+        ret = dict_get_uint64(dict, key, &amp;time_left);</div><div class='add'>+        if (ret)</div><div class='add'>+            gf_log("cli", GF_LOG_TRACE, "failed to get time left");</div><div class='add'>+</div><div class='add'>+        if (elapsed &gt; max_elapsed)</div><div class='add'>+            max_elapsed = elapsed;</div><div class='add'>+</div><div class='add'>+        if (time_left &gt; max_time)</div><div class='add'>+            max_time = time_left;</div><div class='add'>+</div><div class='add'>+        /* Check for array bound */</div><div class='add'>+        if (status_rcd &gt;= GF_DEFRAG_STATUS_MAX)</div><div class='add'>+            status_rcd = GF_DEFRAG_STATUS_MAX;</div><div class='add'>+</div><div class='add'>+        status_str = cli_vol_task_status_str[status_rcd];</div><div class='add'>+        size_str = gf_uint64_2human_readable(size);</div><div class='add'>+        hrs = elapsed / 3600;</div><div class='add'>+        min = ((uint64_t)elapsed % 3600) / 60;</div><div class='add'>+        sec = ((uint64_t)elapsed % 3600) % 60;</div><div class='add'>+</div><div class='add'>+        if (fix_layout) {</div><div class='add'>+            cli_out("%35s %50s %8d:%d:%d", node_name, status_str, hrs, min,</div><div class='add'>+                    sec);</div><div class='add'>+        } else {</div><div class='add'>+            if (size_str) {</div><div class='add'>+                cli_out("%40s %16" PRIu64</div><div class='add'>+                        " %13s"</div><div class='add'>+                        " %13" PRIu64 " %13" PRIu64 " %13" PRIu64</div><div class='add'>+                        " %20s "</div><div class='add'>+                        "%8d:%02d:%02d",</div><div class='add'>+                        node_name, files, size_str, lookup, failures, skipped,</div><div class='add'>+                        status_str, hrs, min, sec);</div><div class='add'>+            } else {</div><div class='add'>+                cli_out("%40s %16" PRIu64 " %13" PRIu64 " %13" PRIu64</div><div class='add'>+                        " %13" PRIu64 " %13" PRIu64</div><div class='add'>+                        " %20s"</div><div class='add'>+                        " %8d:%02d:%02d",</div><div class='add'>+                        node_name, files, size, lookup, failures, skipped,</div><div class='add'>+                        status_str, hrs, min, sec);</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+        GF_FREE(size_str);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Max time will be non-zero if rebalance is still running */</div><div class='add'>+    if (max_time) {</div><div class='add'>+        hrs = max_time / 3600;</div><div class='add'>+        min = (max_time % 3600) / 60;</div><div class='add'>+        sec = (max_time % 3600) % 60;</div><div class='add'>+</div><div class='add'>+        if (hrs &lt; REBAL_ESTIMATE_SEC_UPPER_LIMIT) {</div><div class='add'>+            cli_out(</div><div class='add'>+                "Estimated time left for rebalance to "</div><div class='add'>+                "complete : %8d:%02d:%02d",</div><div class='add'>+                hrs, min, sec);</div><div class='add'>+        } else {</div><div class='add'>+            cli_out(</div><div class='add'>+                "Estimated time left for rebalance to "</div><div class='add'>+                "complete : &gt; 2 months. Please try again "</div><div class='add'>+                "later.");</div><div class='add'>+        }</div><div class='add'>+    } else {</div><div class='add'>+        /* Rebalance will return 0 if it could not calculate the</div><div class='add'>+         * estimates or if it is complete.</div><div class='add'>+         */</div><div class='add'>+        if (!show_estimates) {</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+        if (max_elapsed &lt;= REBAL_ESTIMATE_START_TIME) {</div><div class='add'>+            cli_out(</div><div class='add'>+                "The estimated time for rebalance to complete "</div><div class='add'>+                "will be unavailable for the first 10 "</div><div class='add'>+                "minutes.");</div><div class='add'>+        } else {</div><div class='add'>+            cli_out(</div><div class='add'>+                "Rebalance estimated time unavailable. Please "</div><div class='add'>+                "try again later.");</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+gf_cli_defrag_volume_cbk(struct rpc_req *req, struct iovec *iov, int count,</div><div class='add'>+                         void *myframe)</div><div class='add'>+{</div><div class='add'>+    gf_cli_rsp rsp = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    cli_local_t *local = NULL;</div><div class='add'>+    char *volname = NULL;</div><div class='add'>+    call_frame_t *frame = NULL;</div><div class='add'>+    int cmd = 0;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    dict_t *dict = NULL;</div><div class='add'>+    char msg[1024] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    char *task_id_str = NULL;</div><div class='add'>+</div><div class='add'>+    if (-1 == req-&gt;rpc_status) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(myframe);</div><div class='add'>+</div><div class='add'>+    frame = myframe;</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(frame-&gt;local);</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+</div><div class='add'>+    ret = xdr_to_generic(*iov, &amp;rsp, (xdrproc_t)xdr_gf_cli_rsp);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        gf_log(frame-&gt;this-&gt;name, GF_LOG_ERROR, XDR_DECODE_FAIL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_get_str_sizen(local-&gt;dict, "volname", &amp;volname);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log(frame-&gt;this-&gt;name, GF_LOG_ERROR, "Failed to get volname");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_get_int32_sizen(local-&gt;dict, "rebalance-command",</div><div class='add'>+                               (int32_t *)&amp;cmd);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log("cli", GF_LOG_ERROR, "Failed to get command");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (rsp.dict.dict_len) {</div><div class='add'>+        /* Unserialize the dictionary */</div><div class='add'>+        dict = dict_new();</div><div class='add'>+</div><div class='add'>+        ret = dict_unserialize(rsp.dict.dict_val, rsp.dict.dict_len, &amp;dict);</div><div class='add'>+        if (ret &lt; 0) {</div><div class='add'>+            gf_log("glusterd", GF_LOG_ERROR, DICT_UNSERIALIZE_FAIL);</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (!((cmd == GF_DEFRAG_CMD_STOP) || (cmd == GF_DEFRAG_CMD_STATUS)) &amp;&amp;</div><div class='add'>+        !(global_state-&gt;mode &amp; GLUSTER_MODE_XML)) {</div><div class='add'>+        ret = dict_get_str_sizen(dict, GF_REBALANCE_TID_KEY, &amp;task_id_str);</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_log("cli", GF_LOG_WARNING, "failed to get %s from dict",</div><div class='add'>+                   GF_REBALANCE_TID_KEY);</div><div class='add'>+        }</div><div class='add'>+        if (rsp.op_ret &amp;&amp; strcmp(rsp.op_errstr, "")) {</div><div class='add'>+            snprintf(msg, sizeof(msg), "%s", rsp.op_errstr);</div><div class='add'>+        } else {</div><div class='add'>+            if (!rsp.op_ret) {</div><div class='add'>+                /* append errstr in the cli msg for successful</div><div class='add'>+                 * case since unlock failures can be highlighted</div><div class='add'>+                 * event though rebalance command was successful</div><div class='add'>+                 */</div><div class='add'>+                snprintf(msg, sizeof(msg),</div><div class='add'>+                         "Rebalance on %s has been "</div><div class='add'>+                         "started successfully. Use "</div><div class='add'>+                         "rebalance status command to"</div><div class='add'>+                         " check status of the "</div><div class='add'>+                         "rebalance process.\nID: %s",</div><div class='add'>+                         volname, task_id_str);</div><div class='add'>+            } else {</div><div class='add'>+                snprintf(msg, sizeof(msg),</div><div class='add'>+                         "Starting rebalance on volume %s has "</div><div class='add'>+                         "been unsuccessful.",</div><div class='add'>+                         volname);</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+        goto done;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (cmd == GF_DEFRAG_CMD_STOP) {</div><div class='add'>+        if (rsp.op_ret == -1) {</div><div class='add'>+            if (strcmp(rsp.op_errstr, ""))</div><div class='add'>+                snprintf(msg, sizeof(msg), "%s", rsp.op_errstr);</div><div class='add'>+            else</div><div class='add'>+                snprintf(msg, sizeof(msg), "rebalance volume %s stop failed",</div><div class='add'>+                         volname);</div><div class='add'>+            goto done;</div><div class='add'>+        } else {</div><div class='add'>+            /* append errstr in the cli msg for successful case</div><div class='add'>+             * since unlock failures can be highlighted event though</div><div class='add'>+             * rebalance command was successful */</div><div class='add'>+            snprintf(msg, sizeof(msg),</div><div class='add'>+                     "rebalance process may be in the middle of a "</div><div class='add'>+                     "file migration.\nThe process will be fully "</div><div class='add'>+                     "stopped once the migration of the file is "</div><div class='add'>+                     "complete.\nPlease check rebalance process "</div><div class='add'>+                     "for completion before doing any further "</div><div class='add'>+                     "brick related tasks on the volume.\n%s",</div><div class='add'>+                     rsp.op_errstr);</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    if (cmd == GF_DEFRAG_CMD_STATUS) {</div><div class='add'>+        if (rsp.op_ret == -1) {</div><div class='add'>+            if (strcmp(rsp.op_errstr, ""))</div><div class='add'>+                snprintf(msg, sizeof(msg), "%s", rsp.op_errstr);</div><div class='add'>+            else</div><div class='add'>+                snprintf(msg, sizeof(msg),</div><div class='add'>+                         "Failed to get the status of rebalance process");</div><div class='add'>+            goto done;</div><div class='add'>+        } else {</div><div class='add'>+            snprintf(msg, sizeof(msg), "%s", rsp.op_errstr);</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (global_state-&gt;mode &amp; GLUSTER_MODE_XML) {</div><div class='add'>+        ret = cli_xml_output_vol_rebalance(cmd, dict, rsp.op_ret, rsp.op_errno,</div><div class='add'>+                                           rsp.op_errstr);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = gf_cli_print_rebalance_status(dict, GF_TASK_TYPE_REBALANCE);</div><div class='add'>+    if (ret)</div><div class='add'>+        gf_log("cli", GF_LOG_ERROR, "Failed to print rebalance status");</div><div class='add'>+</div><div class='add'>+done:</div><div class='add'>+    if (global_state-&gt;mode &amp; GLUSTER_MODE_XML)</div><div class='add'>+        cli_xml_output_str("volRebalance", msg, rsp.op_ret, rsp.op_errno,</div><div class='add'>+                           rsp.op_errstr);</div><div class='add'>+    else {</div><div class='add'>+        if (rsp.op_ret)</div><div class='add'>+            cli_err("volume rebalance: %s: failed%s%s", volname,</div><div class='add'>+                    strlen(msg) ? ": " : "", msg);</div><div class='add'>+        else</div><div class='add'>+            cli_out("volume rebalance: %s: success%s%s", volname,</div><div class='add'>+                    strlen(msg) ? ": " : "", msg);</div><div class='add'>+    }</div><div class='add'>+    ret = rsp.op_ret;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    gf_free_xdr_cli_rsp(rsp);</div><div class='add'>+    if (dict)</div><div class='add'>+        dict_unref(dict);</div><div class='add'>+    cli_cmd_broadcast_response(ret);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+gf_cli_rename_volume_cbk(struct rpc_req *req, struct iovec *iov, int count,</div><div class='add'>+                         void *myframe)</div><div class='add'>+{</div><div class='add'>+    gf_cli_rsp rsp = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int ret = -1;</div><div class='add'>+    char msg[1024] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(myframe);</div><div class='add'>+</div><div class='add'>+    if (-1 == req-&gt;rpc_status) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = xdr_to_generic(*iov, &amp;rsp, (xdrproc_t)xdr_gf_cli_rsp);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        gf_log(((call_frame_t *)myframe)-&gt;this-&gt;name, GF_LOG_ERROR,</div><div class='add'>+               XDR_DECODE_FAIL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    gf_log("cli", GF_LOG_INFO, "Received resp to probe");</div><div class='add'>+    snprintf(msg, sizeof(msg), "Rename volume %s",</div><div class='add'>+             (rsp.op_ret) ? "unsuccessful" : "successful");</div><div class='add'>+</div><div class='add'>+    if (global_state-&gt;mode &amp; GLUSTER_MODE_XML) {</div><div class='add'>+        ret = cli_xml_output_str("volRename", msg, rsp.op_ret, rsp.op_errno,</div><div class='add'>+                                 rsp.op_errstr);</div><div class='add'>+        if (ret)</div><div class='add'>+            gf_log("cli", GF_LOG_ERROR, XML_ERROR);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (rsp.op_ret)</div><div class='add'>+        cli_err("volume rename: failed");</div><div class='add'>+    else</div><div class='add'>+        cli_out("volume rename: success");</div><div class='add'>+</div><div class='add'>+    ret = rsp.op_ret;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    cli_cmd_broadcast_response(ret);</div><div class='add'>+    gf_free_xdr_cli_rsp(rsp);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+gf_cli_reset_volume_cbk(struct rpc_req *req, struct iovec *iov, int count,</div><div class='add'>+                        void *myframe)</div><div class='add'>+{</div><div class='add'>+    gf_cli_rsp rsp = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int ret = -1;</div><div class='add'>+    char msg[1024] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(myframe);</div><div class='add'>+</div><div class='add'>+    if (-1 == req-&gt;rpc_status) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = xdr_to_generic(*iov, &amp;rsp, (xdrproc_t)xdr_gf_cli_rsp);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        gf_log(((call_frame_t *)myframe)-&gt;this-&gt;name, GF_LOG_ERROR,</div><div class='add'>+               XDR_DECODE_FAIL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    gf_log("cli", GF_LOG_INFO, "Received resp to reset");</div><div class='add'>+</div><div class='add'>+    if (strcmp(rsp.op_errstr, ""))</div><div class='add'>+        snprintf(msg, sizeof(msg), "%s", rsp.op_errstr);</div><div class='add'>+    else</div><div class='add'>+        snprintf(msg, sizeof(msg), "reset volume %s",</div><div class='add'>+                 (rsp.op_ret) ? "unsuccessful" : "successful");</div><div class='add'>+</div><div class='add'>+    if (global_state-&gt;mode &amp; GLUSTER_MODE_XML) {</div><div class='add'>+        ret = cli_xml_output_str("volReset", msg, rsp.op_ret, rsp.op_errno,</div><div class='add'>+                                 rsp.op_errstr);</div><div class='add'>+        if (ret)</div><div class='add'>+            gf_log("cli", GF_LOG_ERROR, XML_ERROR);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (rsp.op_ret)</div><div class='add'>+        cli_err("volume reset: failed: %s", msg);</div><div class='add'>+    else</div><div class='add'>+        cli_out("volume reset: success: %s", msg);</div><div class='add'>+</div><div class='add'>+    ret = rsp.op_ret;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    cli_cmd_broadcast_response(ret);</div><div class='add'>+    gf_free_xdr_cli_rsp(rsp);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+gf_cli_ganesha_cbk(struct rpc_req *req, struct iovec *iov, int count,</div><div class='add'>+                   void *myframe)</div><div class='add'>+{</div><div class='add'>+    gf_cli_rsp rsp = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int ret = -1;</div><div class='add'>+    dict_t *dict = NULL;</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(myframe);</div><div class='add'>+</div><div class='add'>+    if (-1 == req-&gt;rpc_status) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = xdr_to_generic(*iov, &amp;rsp, (xdrproc_t)xdr_gf_cli_rsp);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        gf_log(((call_frame_t *)myframe)-&gt;this-&gt;name, GF_LOG_ERROR,</div><div class='add'>+               XDR_DECODE_FAIL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    gf_log("cli", GF_LOG_DEBUG, "Received resp to ganesha");</div><div class='add'>+</div><div class='add'>+    dict = dict_new();</div><div class='add'>+</div><div class='add'>+    if (!dict) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_unserialize(rsp.dict.dict_val, rsp.dict.dict_len, &amp;dict);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    if (rsp.op_ret) {</div><div class='add'>+        if (strcmp(rsp.op_errstr, ""))</div><div class='add'>+            cli_err("nfs-ganesha: failed: %s", rsp.op_errstr);</div><div class='add'>+        else</div><div class='add'>+            cli_err("nfs-ganesha: failed");</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    else {</div><div class='add'>+        cli_out("nfs-ganesha : success ");</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = rsp.op_ret;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (dict)</div><div class='add'>+        dict_unref(dict);</div><div class='add'>+    cli_cmd_broadcast_response(ret);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static char *</div><div class='add'>+is_server_debug_xlator(void *myframe)</div><div class='add'>+{</div><div class='add'>+    call_frame_t *frame = NULL;</div><div class='add'>+    cli_local_t *local = NULL;</div><div class='add'>+    char **words = NULL;</div><div class='add'>+    char *key = NULL;</div><div class='add'>+    char *value = NULL;</div><div class='add'>+    char *debug_xlator = NULL;</div><div class='add'>+</div><div class='add'>+    frame = myframe;</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    words = (char **)local-&gt;words;</div><div class='add'>+</div><div class='add'>+    while (*words != NULL) {</div><div class='add'>+        if (strstr(*words, "trace") == NULL &amp;&amp;</div><div class='add'>+            strstr(*words, "error-gen") == NULL) {</div><div class='add'>+            words++;</div><div class='add'>+            continue;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        key = *words;</div><div class='add'>+        words++;</div><div class='add'>+        value = *words;</div><div class='add'>+        if (value == NULL)</div><div class='add'>+            break;</div><div class='add'>+        if (strstr(value, "client")) {</div><div class='add'>+            words++;</div><div class='add'>+            continue;</div><div class='add'>+        } else {</div><div class='add'>+            if (!(strstr(value, "posix") || strstr(value, "acl") ||</div><div class='add'>+                  strstr(value, "locks") || strstr(value, "io-threads") ||</div><div class='add'>+                  strstr(value, "marker") || strstr(value, "index"))) {</div><div class='add'>+                words++;</div><div class='add'>+                continue;</div><div class='add'>+            } else {</div><div class='add'>+                debug_xlator = gf_strdup(key);</div><div class='add'>+                break;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return debug_xlator;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+gf_cli_set_volume_cbk(struct rpc_req *req, struct iovec *iov, int count,</div><div class='add'>+                      void *myframe)</div><div class='add'>+{</div><div class='add'>+    gf_cli_rsp rsp = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int ret = -1;</div><div class='add'>+    dict_t *dict = NULL;</div><div class='add'>+    char *help_str = NULL;</div><div class='add'>+    char msg[1024] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    char *debug_xlator = NULL;</div><div class='add'>+    char tmp_str[512] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(myframe);</div><div class='add'>+</div><div class='add'>+    if (-1 == req-&gt;rpc_status) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = xdr_to_generic(*iov, &amp;rsp, (xdrproc_t)xdr_gf_cli_rsp);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        gf_log(((call_frame_t *)myframe)-&gt;this-&gt;name, GF_LOG_ERROR,</div><div class='add'>+               XDR_DECODE_FAIL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    gf_log("cli", GF_LOG_INFO, "Received resp to set");</div><div class='add'>+</div><div class='add'>+    dict = dict_new();</div><div class='add'>+</div><div class='add'>+    if (!dict) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_unserialize(rsp.dict.dict_val, rsp.dict.dict_len, &amp;dict);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log("cli", GF_LOG_ERROR, DICT_UNSERIALIZE_FAIL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* For brick processes graph change does not happen on the fly.</div><div class='add'>+     * The process has to be restarted. So this is a check from the</div><div class='add'>+     * volume set option such that if debug xlators such as trace/errorgen</div><div class='add'>+     * are provided in the set command, warn the user.</div><div class='add'>+     */</div><div class='add'>+    debug_xlator = is_server_debug_xlator(myframe);</div><div class='add'>+</div><div class='add'>+    if (dict_get_str_sizen(dict, "help-str", &amp;help_str) &amp;&amp; !msg[0])</div><div class='add'>+        snprintf(msg, sizeof(msg), "Set volume %s",</div><div class='add'>+                 (rsp.op_ret) ? "unsuccessful" : "successful");</div><div class='add'>+    if (rsp.op_ret == 0 &amp;&amp; debug_xlator) {</div><div class='add'>+        snprintf(tmp_str, sizeof(tmp_str),</div><div class='add'>+                 "\n%s translator has been "</div><div class='add'>+                 "added to the server volume file. Please restart the"</div><div class='add'>+                 " volume for enabling the translator",</div><div class='add'>+                 debug_xlator);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if ((global_state-&gt;mode &amp; GLUSTER_MODE_XML) &amp;&amp; (help_str == NULL)) {</div><div class='add'>+        ret = cli_xml_output_str("volSet", msg, rsp.op_ret, rsp.op_errno,</div><div class='add'>+                                 rsp.op_errstr);</div><div class='add'>+        if (ret)</div><div class='add'>+            gf_log("cli", GF_LOG_ERROR, XML_ERROR);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (rsp.op_ret) {</div><div class='add'>+        if (strcmp(rsp.op_errstr, ""))</div><div class='add'>+            cli_err("volume set: failed: %s", rsp.op_errstr);</div><div class='add'>+        else</div><div class='add'>+            cli_err("volume set: failed");</div><div class='add'>+    } else {</div><div class='add'>+        if (help_str == NULL) {</div><div class='add'>+            if (debug_xlator == NULL)</div><div class='add'>+                cli_out("volume set: success");</div><div class='add'>+            else</div><div class='add'>+                cli_out("volume set: success%s", tmp_str);</div><div class='add'>+        } else {</div><div class='add'>+            cli_out("%s", help_str);</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = rsp.op_ret;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (dict)</div><div class='add'>+        dict_unref(dict);</div><div class='add'>+    GF_FREE(debug_xlator);</div><div class='add'>+    cli_cmd_broadcast_response(ret);</div><div class='add'>+    gf_free_xdr_cli_rsp(rsp);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+gf_cli_add_brick_cbk(struct rpc_req *req, struct iovec *iov, int count,</div><div class='add'>+                     void *myframe)</div><div class='add'>+{</div><div class='add'>+    gf_cli_rsp rsp = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int ret = -1;</div><div class='add'>+    char msg[1024] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(myframe);</div><div class='add'>+</div><div class='add'>+    if (-1 == req-&gt;rpc_status) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = xdr_to_generic(*iov, &amp;rsp, (xdrproc_t)xdr_gf_cli_rsp);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        gf_log(((call_frame_t *)myframe)-&gt;this-&gt;name, GF_LOG_ERROR,</div><div class='add'>+               XDR_DECODE_FAIL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    gf_log("cli", GF_LOG_INFO, "Received resp to add brick");</div><div class='add'>+</div><div class='add'>+    if (rsp.op_ret &amp;&amp; strcmp(rsp.op_errstr, ""))</div><div class='add'>+        snprintf(msg, sizeof(msg), "%s", rsp.op_errstr);</div><div class='add'>+    else</div><div class='add'>+        snprintf(msg, sizeof(msg), "Add Brick %s",</div><div class='add'>+                 (rsp.op_ret) ? "unsuccessful" : "successful");</div><div class='add'>+</div><div class='add'>+    if (global_state-&gt;mode &amp; GLUSTER_MODE_XML) {</div><div class='add'>+        ret = cli_xml_output_str("volAddBrick", msg, rsp.op_ret, rsp.op_errno,</div><div class='add'>+                                 rsp.op_errstr);</div><div class='add'>+        if (ret)</div><div class='add'>+            gf_log("cli", GF_LOG_ERROR, XML_ERROR);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (rsp.op_ret)</div><div class='add'>+        cli_err("volume add-brick: failed: %s", rsp.op_errstr);</div><div class='add'>+    else</div><div class='add'>+        cli_out("volume add-brick: success");</div><div class='add'>+    ret = rsp.op_ret;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    cli_cmd_broadcast_response(ret);</div><div class='add'>+    gf_free_xdr_cli_rsp(rsp);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+gf_cli3_remove_brick_status_cbk(struct rpc_req *req, struct iovec *iov,</div><div class='add'>+                                int count, void *myframe)</div><div class='add'>+{</div><div class='add'>+    gf_cli_rsp rsp = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int ret = -1;</div><div class='add'>+    dict_t *dict = NULL;</div><div class='add'>+    char msg[1024] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int32_t command = 0;</div><div class='add'>+    gf1_op_commands cmd = GF_OP_CMD_NONE;</div><div class='add'>+    cli_local_t *local = NULL;</div><div class='add'>+    call_frame_t *frame = NULL;</div><div class='add'>+    const char *cmd_str;</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(myframe);</div><div class='add'>+</div><div class='add'>+    if (-1 == req-&gt;rpc_status) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    frame = myframe;</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(frame-&gt;local);</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+</div><div class='add'>+    ret = xdr_to_generic(*iov, &amp;rsp, (xdrproc_t)xdr_gf_cli_rsp);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        gf_log(frame-&gt;this-&gt;name, GF_LOG_ERROR, XDR_DECODE_FAIL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_get_int32_sizen(local-&gt;dict, "command", &amp;command);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    cmd = command;</div><div class='add'>+</div><div class='add'>+    switch (cmd) {</div><div class='add'>+        case GF_OP_CMD_STOP:</div><div class='add'>+            cmd_str = "stop";</div><div class='add'>+            break;</div><div class='add'>+        case GF_OP_CMD_STATUS:</div><div class='add'>+            cmd_str = "status";</div><div class='add'>+            break;</div><div class='add'>+        default:</div><div class='add'>+            cmd_str = "unknown";</div><div class='add'>+            break;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = rsp.op_ret;</div><div class='add'>+    if (rsp.op_ret == -1) {</div><div class='add'>+        if (strcmp(rsp.op_errstr, ""))</div><div class='add'>+            snprintf(msg, sizeof(msg), "volume remove-brick %s: failed: %s",</div><div class='add'>+                     cmd_str, rsp.op_errstr);</div><div class='add'>+        else</div><div class='add'>+            snprintf(msg, sizeof(msg), "volume remove-brick %s: failed",</div><div class='add'>+                     cmd_str);</div><div class='add'>+</div><div class='add'>+        if (global_state-&gt;mode &amp; GLUSTER_MODE_XML)</div><div class='add'>+            goto xml_output;</div><div class='add'>+</div><div class='add'>+        cli_err("%s", msg);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (rsp.dict.dict_len) {</div><div class='add'>+        /* Unserialize the dictionary */</div><div class='add'>+        dict = dict_new();</div><div class='add'>+</div><div class='add'>+        ret = dict_unserialize(rsp.dict.dict_val, rsp.dict.dict_len, &amp;dict);</div><div class='add'>+        if (ret &lt; 0) {</div><div class='add'>+            strncpy(msg, DICT_UNSERIALIZE_FAIL, sizeof(msg));</div><div class='add'>+</div><div class='add'>+            if (global_state-&gt;mode &amp; GLUSTER_MODE_XML) {</div><div class='add'>+                rsp.op_ret = -1;</div><div class='add'>+                goto xml_output;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            gf_log("cli", GF_LOG_ERROR, "%s", msg);</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+xml_output:</div><div class='add'>+    if (global_state-&gt;mode &amp; GLUSTER_MODE_XML) {</div><div class='add'>+        if (strcmp(rsp.op_errstr, "")) {</div><div class='add'>+            ret = cli_xml_output_vol_remove_brick(_gf_true, dict, rsp.op_ret,</div><div class='add'>+                                                  rsp.op_errno, rsp.op_errstr,</div><div class='add'>+                                                  "volRemoveBrick");</div><div class='add'>+        } else {</div><div class='add'>+            ret = cli_xml_output_vol_remove_brick(_gf_true, dict, rsp.op_ret,</div><div class='add'>+                                                  rsp.op_errno, msg,</div><div class='add'>+                                                  "volRemoveBrick");</div><div class='add'>+        }</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = gf_cli_print_rebalance_status(dict, GF_TASK_TYPE_REMOVE_BRICK);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log("cli", GF_LOG_ERROR,</div><div class='add'>+               "Failed to print remove-brick rebalance status");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if ((cmd == GF_OP_CMD_STOP) &amp;&amp; (rsp.op_ret == 0)) {</div><div class='add'>+        cli_out(</div><div class='add'>+            "'remove-brick' process may be in the middle of a "</div><div class='add'>+            "file migration.\nThe process will be fully stopped "</div><div class='add'>+            "once the migration of the file is complete.\nPlease "</div><div class='add'>+            "check remove-brick process for completion before "</div><div class='add'>+            "doing any further brick related tasks on the "</div><div class='add'>+            "volume.");</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (dict)</div><div class='add'>+        dict_unref(dict);</div><div class='add'>+    cli_cmd_broadcast_response(ret);</div><div class='add'>+    gf_free_xdr_cli_rsp(rsp);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+gf_cli_remove_brick_cbk(struct rpc_req *req, struct iovec *iov, int count,</div><div class='add'>+                        void *myframe)</div><div class='add'>+{</div><div class='add'>+    gf_cli_rsp rsp = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int ret = -1;</div><div class='add'>+    char msg[1024] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    gf1_op_commands cmd = GF_OP_CMD_NONE;</div><div class='add'>+    char *cmd_str = "unknown";</div><div class='add'>+    cli_local_t *local = NULL;</div><div class='add'>+    call_frame_t *frame = NULL;</div><div class='add'>+    char *task_id_str = NULL;</div><div class='add'>+    dict_t *rsp_dict = NULL;</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(myframe);</div><div class='add'>+</div><div class='add'>+    if (-1 == req-&gt;rpc_status) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    frame = myframe;</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(frame-&gt;local);</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+</div><div class='add'>+    ret = xdr_to_generic(*iov, &amp;rsp, (xdrproc_t)xdr_gf_cli_rsp);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        gf_log(frame-&gt;this-&gt;name, GF_LOG_ERROR, XDR_DECODE_FAIL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_get_int32_sizen(local-&gt;dict, "command", (int32_t *)&amp;cmd);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log("", GF_LOG_ERROR, "failed to get command");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (rsp.dict.dict_len) {</div><div class='add'>+        rsp_dict = dict_new();</div><div class='add'>+        if (!rsp_dict) {</div><div class='add'>+            ret = -1;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        ret = dict_unserialize(rsp.dict.dict_val, rsp.dict.dict_len, &amp;rsp_dict);</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_log("cli", GF_LOG_ERROR, DICT_UNSERIALIZE_FAIL);</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    switch (cmd) {</div><div class='add'>+        case GF_OP_CMD_DETACH_START:</div><div class='add'>+        case GF_OP_CMD_START:</div><div class='add'>+            cmd_str = "start";</div><div class='add'>+</div><div class='add'>+            ret = dict_get_str_sizen(rsp_dict, GF_REMOVE_BRICK_TID_KEY,</div><div class='add'>+                                     &amp;task_id_str);</div><div class='add'>+            if (ret) {</div><div class='add'>+                gf_log("cli", GF_LOG_ERROR,</div><div class='add'>+                       "remove-brick-id is not present in dict");</div><div class='add'>+            }</div><div class='add'>+            break;</div><div class='add'>+        case GF_OP_CMD_COMMIT:</div><div class='add'>+            cmd_str = "commit";</div><div class='add'>+            break;</div><div class='add'>+        case GF_OP_CMD_COMMIT_FORCE:</div><div class='add'>+            cmd_str = "commit force";</div><div class='add'>+            break;</div><div class='add'>+        default:</div><div class='add'>+            cmd_str = "unknown";</div><div class='add'>+            break;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    gf_log("cli", GF_LOG_INFO, "Received resp to remove brick");</div><div class='add'>+</div><div class='add'>+    if (rsp.op_ret &amp;&amp; strcmp(rsp.op_errstr, ""))</div><div class='add'>+        snprintf(msg, sizeof(msg), "%s", rsp.op_errstr);</div><div class='add'>+    else</div><div class='add'>+        snprintf(msg, sizeof(msg), "Remove Brick %s %s", cmd_str,</div><div class='add'>+                 (rsp.op_ret) ? "unsuccessful" : "successful");</div><div class='add'>+</div><div class='add'>+    if (global_state-&gt;mode &amp; GLUSTER_MODE_XML) {</div><div class='add'>+        ret = cli_xml_output_vol_remove_brick(_gf_false, rsp_dict, rsp.op_ret,</div><div class='add'>+                                              rsp.op_errno, msg,</div><div class='add'>+                                              "volRemoveBrick");</div><div class='add'>+        if (ret)</div><div class='add'>+            gf_log("cli", GF_LOG_ERROR, XML_ERROR);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (rsp.op_ret) {</div><div class='add'>+        cli_err("volume remove-brick %s: failed: %s", cmd_str, msg);</div><div class='add'>+    } else {</div><div class='add'>+        cli_out("volume remove-brick %s: success", cmd_str);</div><div class='add'>+        if (GF_OP_CMD_START == cmd &amp;&amp; task_id_str != NULL)</div><div class='add'>+            cli_out("ID: %s", task_id_str);</div><div class='add'>+        if (GF_OP_CMD_COMMIT == cmd)</div><div class='add'>+            cli_out(</div><div class='add'>+                "Check the removed bricks to ensure all files "</div><div class='add'>+                "are migrated.\nIf files with data are "</div><div class='add'>+                "found on the brick path, copy them via a "</div><div class='add'>+                "gluster mount point before re-purposing the "</div><div class='add'>+                "removed brick. ");</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = rsp.op_ret;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    cli_cmd_broadcast_response(ret);</div><div class='add'>+    gf_free_xdr_cli_rsp(rsp);</div><div class='add'>+</div><div class='add'>+    if (rsp_dict)</div><div class='add'>+        dict_unref(rsp_dict);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+gf_cli_reset_brick_cbk(struct rpc_req *req, struct iovec *iov, int count,</div><div class='add'>+                       void *myframe)</div><div class='add'>+{</div><div class='add'>+    gf_cli_rsp rsp = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int ret = -1;</div><div class='add'>+    cli_local_t *local = NULL;</div><div class='add'>+    call_frame_t *frame = NULL;</div><div class='add'>+    const char *rb_operation_str = NULL;</div><div class='add'>+    dict_t *rsp_dict = NULL;</div><div class='add'>+    char msg[1024] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    char *reset_op = NULL;</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(myframe);</div><div class='add'>+</div><div class='add'>+    if (-1 == req-&gt;rpc_status) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    frame = myframe;</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(frame-&gt;local);</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+</div><div class='add'>+    ret = xdr_to_generic(*iov, &amp;rsp, (xdrproc_t)xdr_gf_cli_rsp);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        gf_log(frame-&gt;this-&gt;name, GF_LOG_ERROR, XDR_DECODE_FAIL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_get_str_sizen(local-&gt;dict, "operation", &amp;reset_op);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log(frame-&gt;this-&gt;name, GF_LOG_ERROR, "dict_get on operation failed");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (strcmp(reset_op, "GF_RESET_OP_START") &amp;&amp;</div><div class='add'>+        strcmp(reset_op, "GF_RESET_OP_COMMIT") &amp;&amp;</div><div class='add'>+        strcmp(reset_op, "GF_RESET_OP_COMMIT_FORCE")) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (rsp.dict.dict_len) {</div><div class='add'>+        /* Unserialize the dictionary */</div><div class='add'>+        rsp_dict = dict_new();</div><div class='add'>+</div><div class='add'>+        ret = dict_unserialize(rsp.dict.dict_val, rsp.dict.dict_len, &amp;rsp_dict);</div><div class='add'>+        if (ret &lt; 0) {</div><div class='add'>+            gf_log(frame-&gt;this-&gt;name, GF_LOG_ERROR, DICT_UNSERIALIZE_FAIL);</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (rsp.op_ret &amp;&amp; (strcmp(rsp.op_errstr, ""))) {</div><div class='add'>+        rb_operation_str = rsp.op_errstr;</div><div class='add'>+    } else {</div><div class='add'>+        if (!strcmp(reset_op, "GF_RESET_OP_START")) {</div><div class='add'>+            if (rsp.op_ret)</div><div class='add'>+                rb_operation_str = "reset-brick start operation failed";</div><div class='add'>+            else</div><div class='add'>+                rb_operation_str = "reset-brick start operation successful";</div><div class='add'>+        } else if (!strcmp(reset_op, "GF_RESET_OP_COMMIT")) {</div><div class='add'>+            if (rsp.op_ret)</div><div class='add'>+                rb_operation_str = "reset-brick commit operation failed";</div><div class='add'>+            else</div><div class='add'>+                rb_operation_str = "reset-brick commit operation successful";</div><div class='add'>+        } else if (!strcmp(reset_op, "GF_RESET_OP_COMMIT_FORCE")) {</div><div class='add'>+            if (rsp.op_ret)</div><div class='add'>+                rb_operation_str = "reset-brick commit force operation failed";</div><div class='add'>+            else</div><div class='add'>+                rb_operation_str =</div><div class='add'>+                    "reset-brick commit force operation successful";</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    gf_log("cli", GF_LOG_INFO, "Received resp to reset brick");</div><div class='add'>+    snprintf(msg, sizeof(msg), "%s",</div><div class='add'>+             rb_operation_str ? rb_operation_str : "Unknown operation");</div><div class='add'>+</div><div class='add'>+    if (global_state-&gt;mode &amp; GLUSTER_MODE_XML) {</div><div class='add'>+        ret = cli_xml_output_vol_replace_brick(rsp_dict, rsp.op_ret,</div><div class='add'>+                                               rsp.op_errno, msg);</div><div class='add'>+        if (ret)</div><div class='add'>+            gf_log("cli", GF_LOG_ERROR, XML_ERROR);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (rsp.op_ret)</div><div class='add'>+        cli_err("volume reset-brick: failed: %s", msg);</div><div class='add'>+    else</div><div class='add'>+        cli_out("volume reset-brick: success: %s", msg);</div><div class='add'>+    ret = rsp.op_ret;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (frame)</div><div class='add'>+        frame-&gt;local = NULL;</div><div class='add'>+</div><div class='add'>+    if (local)</div><div class='add'>+        cli_local_wipe(local);</div><div class='add'>+</div><div class='add'>+    cli_cmd_broadcast_response(ret);</div><div class='add'>+    gf_free_xdr_cli_rsp(rsp);</div><div class='add'>+    if (rsp_dict)</div><div class='add'>+        dict_unref(rsp_dict);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+static int</div><div class='add'>+gf_cli_replace_brick_cbk(struct rpc_req *req, struct iovec *iov, int count,</div><div class='add'>+                         void *myframe)</div><div class='add'>+{</div><div class='add'>+    gf_cli_rsp rsp = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int ret = -1;</div><div class='add'>+    cli_local_t *local = NULL;</div><div class='add'>+    call_frame_t *frame = NULL;</div><div class='add'>+    const char *rb_operation_str = NULL;</div><div class='add'>+    dict_t *rsp_dict = NULL;</div><div class='add'>+    char msg[1024] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    char *replace_op = NULL;</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(myframe);</div><div class='add'>+</div><div class='add'>+    if (-1 == req-&gt;rpc_status) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    frame = myframe;</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(frame-&gt;local);</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+</div><div class='add'>+    ret = xdr_to_generic(*iov, &amp;rsp, (xdrproc_t)xdr_gf_cli_rsp);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        gf_log(frame-&gt;this-&gt;name, GF_LOG_ERROR, XDR_DECODE_FAIL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_get_str_sizen(local-&gt;dict, "operation", &amp;replace_op);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log(frame-&gt;this-&gt;name, GF_LOG_ERROR, "dict_get on operation failed");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (rsp.dict.dict_len) {</div><div class='add'>+        /* Unserialize the dictionary */</div><div class='add'>+        rsp_dict = dict_new();</div><div class='add'>+</div><div class='add'>+        ret = dict_unserialize(rsp.dict.dict_val, rsp.dict.dict_len, &amp;rsp_dict);</div><div class='add'>+        if (ret &lt; 0) {</div><div class='add'>+            gf_log(frame-&gt;this-&gt;name, GF_LOG_ERROR, DICT_UNSERIALIZE_FAIL);</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (!strcmp(replace_op, "GF_REPLACE_OP_COMMIT_FORCE")) {</div><div class='add'>+        if (rsp.op_ret || ret)</div><div class='add'>+            rb_operation_str = "replace-brick commit force operation failed";</div><div class='add'>+        else</div><div class='add'>+            rb_operation_str =</div><div class='add'>+                "replace-brick commit force operation successful";</div><div class='add'>+    } else {</div><div class='add'>+        gf_log(frame-&gt;this-&gt;name, GF_LOG_DEBUG, "Unknown operation");</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (rsp.op_ret &amp;&amp; (strcmp(rsp.op_errstr, ""))) {</div><div class='add'>+        rb_operation_str = rsp.op_errstr;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    gf_log("cli", GF_LOG_INFO, "Received resp to replace brick");</div><div class='add'>+    snprintf(msg, sizeof(msg), "%s",</div><div class='add'>+             rb_operation_str ? rb_operation_str : "Unknown operation");</div><div class='add'>+</div><div class='add'>+    if (global_state-&gt;mode &amp; GLUSTER_MODE_XML) {</div><div class='add'>+        ret = cli_xml_output_vol_replace_brick(rsp_dict, rsp.op_ret,</div><div class='add'>+                                               rsp.op_errno, msg);</div><div class='add'>+        if (ret)</div><div class='add'>+            gf_log("cli", GF_LOG_ERROR, XML_ERROR);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (rsp.op_ret)</div><div class='add'>+        cli_err("volume replace-brick: failed: %s", msg);</div><div class='add'>+    else</div><div class='add'>+        cli_out("volume replace-brick: success: %s", msg);</div><div class='add'>+    ret = rsp.op_ret;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (frame)</div><div class='add'>+        frame-&gt;local = NULL;</div><div class='add'>+</div><div class='add'>+    if (local)</div><div class='add'>+        cli_local_wipe(local);</div><div class='add'>+</div><div class='add'>+    cli_cmd_broadcast_response(ret);</div><div class='add'>+    gf_free_xdr_cli_rsp(rsp);</div><div class='add'>+    if (rsp_dict)</div><div class='add'>+        dict_unref(rsp_dict);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+gf_cli_log_rotate_cbk(struct rpc_req *req, struct iovec *iov, int count,</div><div class='add'>+                      void *myframe)</div><div class='add'>+{</div><div class='add'>+    gf_cli_rsp rsp = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int ret = -1;</div><div class='add'>+    char msg[1024] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(myframe);</div><div class='add'>+</div><div class='add'>+    if (-1 == req-&gt;rpc_status) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = xdr_to_generic(*iov, &amp;rsp, (xdrproc_t)xdr_gf_cli_rsp);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        gf_log(((call_frame_t *)myframe)-&gt;this-&gt;name, GF_LOG_ERROR,</div><div class='add'>+               XDR_DECODE_FAIL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    gf_log("cli", GF_LOG_DEBUG, "Received resp to log rotate");</div><div class='add'>+</div><div class='add'>+    if (rsp.op_ret &amp;&amp; strcmp(rsp.op_errstr, ""))</div><div class='add'>+        snprintf(msg, sizeof(msg), "%s", rsp.op_errstr);</div><div class='add'>+    else</div><div class='add'>+        snprintf(msg, sizeof(msg), "log rotate %s",</div><div class='add'>+                 (rsp.op_ret) ? "unsuccessful" : "successful");</div><div class='add'>+</div><div class='add'>+    if (global_state-&gt;mode &amp; GLUSTER_MODE_XML) {</div><div class='add'>+        ret = cli_xml_output_str("volLogRotate", msg, rsp.op_ret, rsp.op_errno,</div><div class='add'>+                                 rsp.op_errstr);</div><div class='add'>+        if (ret)</div><div class='add'>+            gf_log("cli", GF_LOG_ERROR, XML_ERROR);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (rsp.op_ret)</div><div class='add'>+        cli_err("volume log-rotate: failed: %s", msg);</div><div class='add'>+    else</div><div class='add'>+        cli_out("volume log-rotate: success");</div><div class='add'>+    ret = rsp.op_ret;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    cli_cmd_broadcast_response(ret);</div><div class='add'>+    gf_free_xdr_cli_rsp(rsp);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+gf_cli_sync_volume_cbk(struct rpc_req *req, struct iovec *iov, int count,</div><div class='add'>+                       void *myframe)</div><div class='add'>+{</div><div class='add'>+    gf_cli_rsp rsp = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int ret = -1;</div><div class='add'>+    char msg[1024] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(myframe);</div><div class='add'>+</div><div class='add'>+    if (-1 == req-&gt;rpc_status) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = xdr_to_generic(*iov, &amp;rsp, (xdrproc_t)xdr_gf_cli_rsp);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        gf_log(((call_frame_t *)myframe)-&gt;this-&gt;name, GF_LOG_ERROR,</div><div class='add'>+               XDR_DECODE_FAIL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    gf_log("cli", GF_LOG_DEBUG, "Received resp to sync");</div><div class='add'>+</div><div class='add'>+    if (rsp.op_ret &amp;&amp; strcmp(rsp.op_errstr, ""))</div><div class='add'>+        snprintf(msg, sizeof(msg), "volume sync: failed: %s", rsp.op_errstr);</div><div class='add'>+    else</div><div class='add'>+        snprintf(msg, sizeof(msg), "volume sync: %s",</div><div class='add'>+                 (rsp.op_ret) ? "failed" : "success");</div><div class='add'>+</div><div class='add'>+    if (global_state-&gt;mode &amp; GLUSTER_MODE_XML) {</div><div class='add'>+        ret = cli_xml_output_str("volSync", msg, rsp.op_ret, rsp.op_errno,</div><div class='add'>+                                 rsp.op_errstr);</div><div class='add'>+        if (ret)</div><div class='add'>+            gf_log("cli", GF_LOG_ERROR, XML_ERROR);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (rsp.op_ret)</div><div class='add'>+        cli_err("%s", msg);</div><div class='add'>+    else</div><div class='add'>+        cli_out("%s", msg);</div><div class='add'>+    ret = rsp.op_ret;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    cli_cmd_broadcast_response(ret);</div><div class='add'>+    gf_free_xdr_cli_rsp(rsp);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+print_quota_list_usage_output(cli_local_t *local, char *path, int64_t avail,</div><div class='add'>+                              char *sl_str, quota_limits_t *limits,</div><div class='add'>+                              quota_meta_t *used_space, gf_boolean_t sl,</div><div class='add'>+                              gf_boolean_t hl, double sl_num,</div><div class='add'>+                              gf_boolean_t limit_set)</div><div class='add'>+{</div><div class='add'>+    int32_t ret = -1;</div><div class='add'>+    char *used_str = NULL;</div><div class='add'>+    char *avail_str = NULL;</div><div class='add'>+    char *hl_str = NULL;</div><div class='add'>+    char *sl_val = NULL;</div><div class='add'>+</div><div class='add'>+    if (global_state-&gt;mode &amp; GLUSTER_MODE_XML) {</div><div class='add'>+        ret = cli_quota_xml_output(local, path, limits-&gt;hl, sl_str, sl_num,</div><div class='add'>+                                   used_space-&gt;size, avail, sl ? "Yes" : "No",</div><div class='add'>+                                   hl ? "Yes" : "No", limit_set);</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_log("cli", GF_LOG_ERROR,</div><div class='add'>+                   "Failed to output in xml format for quota list command");</div><div class='add'>+        }</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    used_str = gf_uint64_2human_readable(used_space-&gt;size);</div><div class='add'>+</div><div class='add'>+    if (limit_set) {</div><div class='add'>+        hl_str = gf_uint64_2human_readable(limits-&gt;hl);</div><div class='add'>+        sl_val = gf_uint64_2human_readable(sl_num);</div><div class='add'>+</div><div class='add'>+        if (!used_str) {</div><div class='add'>+            cli_out("%-40s %7s %7s(%s) %8" PRIu64 "%9" PRIu64</div><div class='add'>+                    ""</div><div class='add'>+                    "%15s %18s",</div><div class='add'>+                    path, hl_str, sl_str, sl_val, used_space-&gt;size, avail,</div><div class='add'>+                    sl ? "Yes" : "No", hl ? "Yes" : "No");</div><div class='add'>+        } else {</div><div class='add'>+            avail_str = gf_uint64_2human_readable(avail);</div><div class='add'>+            cli_out("%-40s %7s %7s(%s) %8s %7s %15s %20s", path, hl_str, sl_str,</div><div class='add'>+                    sl_val, used_str, avail_str, sl ? "Yes" : "No",</div><div class='add'>+                    hl ? "Yes" : "No");</div><div class='add'>+        }</div><div class='add'>+    } else {</div><div class='add'>+        cli_out("%-36s %10s %10s %14s %9s %15s %18s", path, "N/A", "N/A",</div><div class='add'>+                used_str, "N/A", "N/A", "N/A");</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+out:</div><div class='add'>+    GF_FREE(hl_str);</div><div class='add'>+    GF_FREE(used_str);</div><div class='add'>+    GF_FREE(avail_str);</div><div class='add'>+    GF_FREE(sl_val);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+print_quota_list_object_output(cli_local_t *local, char *path, int64_t avail,</div><div class='add'>+                               char *sl_str, quota_limits_t *limits,</div><div class='add'>+                               quota_meta_t *used_space, gf_boolean_t sl,</div><div class='add'>+                               gf_boolean_t hl, double sl_num,</div><div class='add'>+                               gf_boolean_t limit_set)</div><div class='add'>+{</div><div class='add'>+    int32_t ret = -1;</div><div class='add'>+    int64_t sl_val = sl_num;</div><div class='add'>+</div><div class='add'>+    if (global_state-&gt;mode &amp; GLUSTER_MODE_XML) {</div><div class='add'>+        ret = cli_quota_object_xml_output(local, path, sl_str, sl_val, limits,</div><div class='add'>+                                          used_space, avail, sl ? "Yes" : "No",</div><div class='add'>+                                          hl ? "Yes" : "No", limit_set);</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_log("cli", GF_LOG_ERROR,</div><div class='add'>+                   "Failed to output in xml format for quota list command");</div><div class='add'>+        }</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (limit_set) {</div><div class='add'>+        cli_out("%-40s %9" PRIu64 " %9s(%" PRId64 ") %10" PRIu64</div><div class='add'>+                ""</div><div class='add'>+                "%10" PRIu64 " %11" PRIu64 " %15s %20s",</div><div class='add'>+                path, limits-&gt;hl, sl_str, sl_val, used_space-&gt;file_count,</div><div class='add'>+                used_space-&gt;dir_count, avail, sl ? "Yes" : "No",</div><div class='add'>+                hl ? "Yes" : "No");</div><div class='add'>+    } else {</div><div class='add'>+        cli_out("%-40s %9s %9s %10" PRIu64 " %10" PRIu64 " %11s %15s %20s",</div><div class='add'>+                path, "N/A", "N/A", used_space-&gt;file_count,</div><div class='add'>+                used_space-&gt;dir_count, "N/A", "N/A", "N/A");</div><div class='add'>+    }</div><div class='add'>+    ret = 0;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+print_quota_list_output(cli_local_t *local, char *path, char *default_sl,</div><div class='add'>+                        quota_limits_t *limits, quota_meta_t *used_space,</div><div class='add'>+                        int type, gf_boolean_t limit_set)</div><div class='add'>+{</div><div class='add'>+    int64_t avail = 0;</div><div class='add'>+    char percent_str[20] = {0};</div><div class='add'>+    char *sl_final = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    double sl_num = 0;</div><div class='add'>+    gf_boolean_t sl = _gf_false;</div><div class='add'>+    gf_boolean_t hl = _gf_false;</div><div class='add'>+    int64_t used_size = 0;</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(local);</div><div class='add'>+    GF_ASSERT(path);</div><div class='add'>+</div><div class='add'>+    if (limit_set) {</div><div class='add'>+        if (limits-&gt;sl &lt; 0) {</div><div class='add'>+            ret = gf_string2percent(default_sl, &amp;sl_num);</div><div class='add'>+            if (ret) {</div><div class='add'>+                gf_log("cli", GF_LOG_ERROR,</div><div class='add'>+                       "could not convert default soft limit to percent");</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+            sl_num = (sl_num * limits-&gt;hl) / 100;</div><div class='add'>+            sl_final = default_sl;</div><div class='add'>+        } else {</div><div class='add'>+            sl_num = (limits-&gt;sl * limits-&gt;hl) / 100;</div><div class='add'>+            ret = snprintf(percent_str, sizeof(percent_str), "%" PRIu64 "%%",</div><div class='add'>+                           limits-&gt;sl);</div><div class='add'>+            if (ret &lt; 0)</div><div class='add'>+                goto out;</div><div class='add'>+            sl_final = percent_str;</div><div class='add'>+        }</div><div class='add'>+        if (type == GF_QUOTA_OPTION_TYPE_LIST)</div><div class='add'>+            used_size = used_space-&gt;size;</div><div class='add'>+        else</div><div class='add'>+            used_size = used_space-&gt;file_count + used_space-&gt;dir_count;</div><div class='add'>+</div><div class='add'>+        if (limits-&gt;hl &gt; used_size) {</div><div class='add'>+            avail = limits-&gt;hl - used_size;</div><div class='add'>+            hl = _gf_false;</div><div class='add'>+            if (used_size &gt; sl_num)</div><div class='add'>+                sl = _gf_true;</div><div class='add'>+            else</div><div class='add'>+                sl = _gf_false;</div><div class='add'>+        } else {</div><div class='add'>+            avail = 0;</div><div class='add'>+            hl = sl = _gf_true;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (type == GF_QUOTA_OPTION_TYPE_LIST)</div><div class='add'>+        ret = print_quota_list_usage_output(local, path, avail, sl_final,</div><div class='add'>+                                            limits, used_space, sl, hl, sl_num,</div><div class='add'>+                                            limit_set);</div><div class='add'>+    else</div><div class='add'>+        ret = print_quota_list_object_output(local, path, avail, sl_final,</div><div class='add'>+                                             limits, used_space, sl, hl, sl_num,</div><div class='add'>+                                             limit_set);</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+print_quota_list_from_mountdir(cli_local_t *local, char *mountdir,</div><div class='add'>+                               char *default_sl, char *path, int type)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    ssize_t xattr_size = 0;</div><div class='add'>+    quota_limits_t limits = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    quota_meta_t used_space = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    char *key = NULL;</div><div class='add'>+    gf_boolean_t limit_set = _gf_true;</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(local);</div><div class='add'>+    GF_ASSERT(mountdir);</div><div class='add'>+    GF_ASSERT(path);</div><div class='add'>+</div><div class='add'>+    if (type == GF_QUOTA_OPTION_TYPE_LIST)</div><div class='add'>+        key = QUOTA_LIMIT_KEY;</div><div class='add'>+    else</div><div class='add'>+        key = QUOTA_LIMIT_OBJECTS_KEY;</div><div class='add'>+</div><div class='add'>+    ret = sys_lgetxattr(mountdir, key, (void *)&amp;limits, sizeof(limits));</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        gf_log("cli", GF_LOG_ERROR,</div><div class='add'>+               "Failed to get the xattr %s on %s. Reason : %s", key, mountdir,</div><div class='add'>+               strerror(errno));</div><div class='add'>+</div><div class='add'>+        switch (errno) {</div><div class='add'>+#if defined(ENODATA)</div><div class='add'>+            case ENODATA:</div><div class='add'>+#endif</div><div class='add'>+#if defined(ENOATTR) &amp;&amp; (ENOATTR != ENODATA)</div><div class='add'>+            case ENOATTR:</div><div class='add'>+#endif</div><div class='add'>+                /* If it's an ENOATTR, quota/inode-quota is</div><div class='add'>+                 * configured(limit is set at least for one directory).</div><div class='add'>+                 * The user is trying to issue 'list/list-objects'</div><div class='add'>+                 * command for a directory on which quota limit is</div><div class='add'>+                 * not set and we are showing the used-space in case</div><div class='add'>+                 * of list-usage and showing (dir_count, file_count)</div><div class='add'>+                 * in case of list-objects. Other labels are</div><div class='add'>+                 * shown "N/A".</div><div class='add'>+                 */</div><div class='add'>+</div><div class='add'>+                limit_set = _gf_false;</div><div class='add'>+                goto enoattr;</div><div class='add'>+                break;</div><div class='add'>+</div><div class='add'>+            default:</div><div class='add'>+                cli_err("%-40s %s", path, strerror(errno));</div><div class='add'>+                break;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    limits.hl = ntoh64(limits.hl);</div><div class='add'>+    limits.sl = ntoh64(limits.sl);</div><div class='add'>+</div><div class='add'>+enoattr:</div><div class='add'>+    xattr_size = sys_lgetxattr(mountdir, QUOTA_SIZE_KEY, NULL, 0);</div><div class='add'>+    if (xattr_size &lt; (sizeof(int64_t) * 2) &amp;&amp;</div><div class='add'>+        type == GF_QUOTA_OPTION_TYPE_LIST_OBJECTS) {</div><div class='add'>+        ret = -1;</div><div class='add'>+</div><div class='add'>+        /* This can happen when glusterfs is upgraded from 3.6 to 3.7</div><div class='add'>+         * and the xattr healing is not completed.</div><div class='add'>+         */</div><div class='add'>+    } else if (xattr_size &gt; (sizeof(int64_t) * 2)) {</div><div class='add'>+        ret = sys_lgetxattr(mountdir, QUOTA_SIZE_KEY, &amp;used_space,</div><div class='add'>+                            sizeof(used_space));</div><div class='add'>+    } else if (xattr_size &gt; 0) {</div><div class='add'>+        /* This is for compatibility.</div><div class='add'>+         * Older version had only file usage</div><div class='add'>+         */</div><div class='add'>+        ret = sys_lgetxattr(mountdir, QUOTA_SIZE_KEY, &amp;(used_space.size),</div><div class='add'>+                            sizeof(used_space.size));</div><div class='add'>+        used_space.file_count = 0;</div><div class='add'>+        used_space.dir_count = 0;</div><div class='add'>+    } else {</div><div class='add'>+        ret = -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        gf_log("cli", GF_LOG_ERROR, "Failed to get quota size on path %s: %s",</div><div class='add'>+               mountdir, strerror(errno));</div><div class='add'>+        print_quota_list_empty(path, type);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    used_space.size = ntoh64(used_space.size);</div><div class='add'>+    used_space.file_count = ntoh64(used_space.file_count);</div><div class='add'>+    used_space.dir_count = ntoh64(used_space.dir_count);</div><div class='add'>+</div><div class='add'>+    ret = print_quota_list_output(local, path, default_sl, &amp;limits, &amp;used_space,</div><div class='add'>+                                  type, limit_set);</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+gluster_remove_auxiliary_mount(char *volname)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    char mountdir[PATH_MAX] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    xlator_t *this = NULL;</div><div class='add'>+</div><div class='add'>+    this = THIS;</div><div class='add'>+    GF_ASSERT(this);</div><div class='add'>+</div><div class='add'>+    GLUSTERD_GET_QUOTA_LIST_MOUNT_PATH(mountdir, volname, "/");</div><div class='add'>+    ret = gf_umount_lazy(this-&gt;name, mountdir, 1);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log("cli", GF_LOG_ERROR, "umount on %s failed, reason : %s",</div><div class='add'>+               mountdir, strerror(errno));</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+gf_cli_print_limit_list_from_dict(cli_local_t *local, char *volname,</div><div class='add'>+                                  dict_t *dict, char *default_sl, int count,</div><div class='add'>+                                  int op_ret, int op_errno, char *op_errstr)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int i = 0;</div><div class='add'>+    char key[32] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int keylen;</div><div class='add'>+    char mountdir[PATH_MAX] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    char *path = NULL;</div><div class='add'>+    int type = -1;</div><div class='add'>+</div><div class='add'>+    if (!dict || count &lt;= 0)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    ret = dict_get_int32_sizen(dict, "type", &amp;type);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log("cli", GF_LOG_ERROR, "Failed to get quota type");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (global_state-&gt;mode &amp; GLUSTER_MODE_XML) {</div><div class='add'>+        ret = cli_xml_output_vol_quota_limit_list_begin(local, op_ret, op_errno,</div><div class='add'>+                                                        op_errstr);</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_log("cli", GF_LOG_ERROR, XML_ERROR);</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    } else {</div><div class='add'>+        print_quota_list_header(type);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    while (count--) {</div><div class='add'>+        keylen = snprintf(key, sizeof(key), "path%d", i++);</div><div class='add'>+</div><div class='add'>+        ret = dict_get_strn(dict, key, keylen, &amp;path);</div><div class='add'>+        if (ret &lt; 0) {</div><div class='add'>+            gf_log("cli", GF_LOG_DEBUG, "Path not present in limit list");</div><div class='add'>+            continue;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        ret = gf_canonicalize_path(path);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+        GLUSTERD_GET_QUOTA_LIST_MOUNT_PATH(mountdir, volname, path);</div><div class='add'>+        ret = print_quota_list_from_mountdir(local, mountdir, default_sl, path,</div><div class='add'>+                                             type);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+print_quota_list_from_quotad(call_frame_t *frame, dict_t *rsp_dict)</div><div class='add'>+{</div><div class='add'>+    char *path = NULL;</div><div class='add'>+    char *default_sl = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    cli_local_t *local = NULL;</div><div class='add'>+    dict_t *gd_rsp_dict = NULL;</div><div class='add'>+    quota_meta_t used_space = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    quota_limits_t limits = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    quota_limits_t *size_limits = NULL;</div><div class='add'>+    int32_t type = 0;</div><div class='add'>+    int32_t success_count = 0;</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(frame);</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    gd_rsp_dict = local-&gt;dict;</div><div class='add'>+</div><div class='add'>+    ret = dict_get_int32_sizen(rsp_dict, "type", &amp;type);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log("cli", GF_LOG_ERROR, "Failed to get type");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_get_str_sizen(rsp_dict, GET_ANCESTRY_PATH_KEY, &amp;path);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log("cli", GF_LOG_WARNING, "path key is not present in dict");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_get_str_sizen(gd_rsp_dict, "default-soft-limit", &amp;default_sl);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log(frame-&gt;this-&gt;name, GF_LOG_ERROR,</div><div class='add'>+               "failed to get default soft limit");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (type == GF_QUOTA_OPTION_TYPE_LIST) {</div><div class='add'>+        ret = dict_get_bin(rsp_dict, QUOTA_LIMIT_KEY, (void **)&amp;size_limits);</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_log("cli", GF_LOG_WARNING, "limit key not present in dict on %s",</div><div class='add'>+                   path);</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    } else {</div><div class='add'>+        ret = dict_get_bin(rsp_dict, QUOTA_LIMIT_OBJECTS_KEY,</div><div class='add'>+                           (void **)&amp;size_limits);</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_log("cli", GF_LOG_WARNING,</div><div class='add'>+                   "object limit key not present in dict on %s", path);</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    limits.hl = ntoh64(size_limits-&gt;hl);</div><div class='add'>+    limits.sl = ntoh64(size_limits-&gt;sl);</div><div class='add'>+</div><div class='add'>+    if (type == GF_QUOTA_OPTION_TYPE_LIST)</div><div class='add'>+        ret = quota_dict_get_meta(rsp_dict, QUOTA_SIZE_KEY,</div><div class='add'>+                                  SLEN(QUOTA_SIZE_KEY), &amp;used_space);</div><div class='add'>+    else</div><div class='add'>+        ret = quota_dict_get_inode_meta(rsp_dict, QUOTA_SIZE_KEY,</div><div class='add'>+                                        SLEN(QUOTA_SIZE_KEY), &amp;used_space);</div><div class='add'>+</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        gf_log("cli", GF_LOG_WARNING, "size key not present in dict");</div><div class='add'>+        print_quota_list_empty(path, type);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;local-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        ret = dict_get_int32_sizen(gd_rsp_dict, "quota-list-success-count",</div><div class='add'>+                                   &amp;success_count);</div><div class='add'>+        if (ret)</div><div class='add'>+            success_count = 0;</div><div class='add'>+</div><div class='add'>+        ret = dict_set_int32_sizen(gd_rsp_dict, "quota-list-success-count",</div><div class='add'>+                                   success_count + 1);</div><div class='add'>+    }</div><div class='add'>+    UNLOCK(&amp;local-&gt;lock);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log("cli", GF_LOG_ERROR,</div><div class='add'>+               "Failed to set quota-list-success-count in dict");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (success_count == 0) {</div><div class='add'>+        if (!(global_state-&gt;mode &amp; GLUSTER_MODE_XML)) {</div><div class='add'>+            print_quota_list_header(type);</div><div class='add'>+        } else {</div><div class='add'>+            ret = cli_xml_output_vol_quota_limit_list_begin(local, 0, 0, NULL);</div><div class='add'>+            if (ret) {</div><div class='add'>+                gf_log("cli", GF_LOG_ERROR, XML_ERROR);</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = print_quota_list_output(local, path, default_sl, &amp;limits, &amp;used_space,</div><div class='add'>+                                  type, _gf_true);</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void *</div><div class='add'>+cli_cmd_broadcast_response_detached(void *opaque)</div><div class='add'>+{</div><div class='add'>+    int32_t ret = 0;</div><div class='add'>+</div><div class='add'>+    ret = (intptr_t)opaque;</div><div class='add'>+    cli_cmd_broadcast_response(ret);</div><div class='add'>+</div><div class='add'>+    return NULL;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int32_t</div><div class='add'>+cli_quota_compare_path(struct list_head *list1, struct list_head *list2)</div><div class='add'>+{</div><div class='add'>+    struct list_node *node1 = NULL;</div><div class='add'>+    struct list_node *node2 = NULL;</div><div class='add'>+    dict_t *dict1 = NULL;</div><div class='add'>+    dict_t *dict2 = NULL;</div><div class='add'>+    char *path1 = NULL;</div><div class='add'>+    char *path2 = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    node1 = list_entry(list1, struct list_node, list);</div><div class='add'>+    node2 = list_entry(list2, struct list_node, list);</div><div class='add'>+</div><div class='add'>+    dict1 = node1-&gt;ptr;</div><div class='add'>+    dict2 = node2-&gt;ptr;</div><div class='add'>+</div><div class='add'>+    ret = dict_get_str_sizen(dict1, GET_ANCESTRY_PATH_KEY, &amp;path1);</div><div class='add'>+    if (ret &lt; 0)</div><div class='add'>+        return 0;</div><div class='add'>+</div><div class='add'>+    ret = dict_get_str_sizen(dict2, GET_ANCESTRY_PATH_KEY, &amp;path2);</div><div class='add'>+    if (ret &lt; 0)</div><div class='add'>+        return 0;</div><div class='add'>+</div><div class='add'>+    return strcmp(path1, path2);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+cli_quotad_getlimit_cbk(struct rpc_req *req, struct iovec *iov, int count,</div><div class='add'>+                        void *myframe)</div><div class='add'>+{</div><div class='add'>+    /*TODO: we need to gather the path, hard-limit, soft-limit and used space*/</div><div class='add'>+    gf_cli_rsp rsp = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int ret = -1;</div><div class='add'>+    dict_t *dict = NULL;</div><div class='add'>+    struct list_node *node = NULL;</div><div class='add'>+    struct list_node *tmpnode = NULL;</div><div class='add'>+    call_frame_t *frame = NULL;</div><div class='add'>+    cli_local_t *local = NULL;</div><div class='add'>+    int32_t list_count = 0;</div><div class='add'>+    pthread_t th_id = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int32_t max_count = 0;</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(myframe);</div><div class='add'>+</div><div class='add'>+    frame = myframe;</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(frame-&gt;local);</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;local-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        ret = dict_get_int32_sizen(local-&gt;dict, "quota-list-count",</div><div class='add'>+                                   &amp;list_count);</div><div class='add'>+        if (ret)</div><div class='add'>+            list_count = 0;</div><div class='add'>+</div><div class='add'>+        list_count++;</div><div class='add'>+        ret = dict_set_int32_sizen(local-&gt;dict, "quota-list-count", list_count);</div><div class='add'>+    }</div><div class='add'>+    UNLOCK(&amp;local-&gt;lock);</div><div class='add'>+</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log("cli", GF_LOG_ERROR, "Failed to set quota-list-count in dict");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (-1 == req-&gt;rpc_status) {</div><div class='add'>+        if (list_count == 0)</div><div class='add'>+            cli_err(</div><div class='add'>+                "Connection failed. Please check if quota "</div><div class='add'>+                "daemon is operational.");</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = xdr_to_generic(*iov, &amp;rsp, (xdrproc_t)xdr_gf_cli_rsp);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        gf_log(frame-&gt;this-&gt;name, GF_LOG_ERROR, XDR_DECODE_FAIL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (rsp.op_ret) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        if (strcmp(rsp.op_errstr, ""))</div><div class='add'>+            cli_err("quota command failed : %s", rsp.op_errstr);</div><div class='add'>+        else</div><div class='add'>+            cli_err("quota command : failed");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (rsp.dict.dict_len) {</div><div class='add'>+        /* Unserialize the dictionary */</div><div class='add'>+        dict = dict_new();</div><div class='add'>+</div><div class='add'>+        ret = dict_unserialize(rsp.dict.dict_val, rsp.dict.dict_len, &amp;dict);</div><div class='add'>+        if (ret &lt; 0) {</div><div class='add'>+            gf_log("cli", GF_LOG_ERROR, DICT_UNSERIALIZE_FAIL);</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        node = list_node_add_order(dict, &amp;local-&gt;dict_list,</div><div class='add'>+                                   cli_quota_compare_path);</div><div class='add'>+        if (node == NULL) {</div><div class='add'>+            gf_log("cli", GF_LOG_ERROR, "failed to add node to the list");</div><div class='add'>+            dict_unref(dict);</div><div class='add'>+            ret = -1;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_get_int32_sizen(local-&gt;dict, "max_count", &amp;max_count);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        gf_log("cli", GF_LOG_ERROR, "failed to get max_count");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (list_count == max_count) {</div><div class='add'>+        list_for_each_entry_safe(node, tmpnode, &amp;local-&gt;dict_list, list)</div><div class='add'>+        {</div><div class='add'>+            dict = node-&gt;ptr;</div><div class='add'>+            print_quota_list_from_quotad(frame, dict);</div><div class='add'>+            list_node_del(node);</div><div class='add'>+            dict_unref(dict);</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    /* Bad Fix: CLI holds the lock to process a command.</div><div class='add'>+     * When processing quota list command, below sequence of steps executed</div><div class='add'>+     * in the same thread and causing deadlock</div><div class='add'>+     *</div><div class='add'>+     * 1) CLI holds the lock</div><div class='add'>+     * 2) Send rpc_clnt_submit request to quotad for quota usage</div><div class='add'>+     * 3) If quotad is down, rpc_clnt_submit invokes cbk function with error</div><div class='add'>+     * 4) cbk function cli_quotad_getlimit_cbk invokes</div><div class='add'>+     *    cli_cmd_broadcast_response which tries to hold lock to broadcast</div><div class='add'>+     *    the results and hangs, because same thread has already holding</div><div class='add'>+     *    the lock</div><div class='add'>+     *</div><div class='add'>+     * Broadcasting response in a separate thread which is not a</div><div class='add'>+     * good fix. This needs to be re-visted with better solution</div><div class='add'>+     */</div><div class='add'>+    if (ret == -1) {</div><div class='add'>+        ret = pthread_create(&amp;th_id, NULL, cli_cmd_broadcast_response_detached,</div><div class='add'>+                             (void *)-1);</div><div class='add'>+        if (ret)</div><div class='add'>+            gf_log("cli", GF_LOG_ERROR, "pthread_create failed: %s",</div><div class='add'>+                   strerror(errno));</div><div class='add'>+    } else {</div><div class='add'>+        cli_cmd_broadcast_response(ret);</div><div class='add'>+    }</div><div class='add'>+    gf_free_xdr_cli_rsp(rsp);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+cli_quotad_getlimit(call_frame_t *frame, xlator_t *this, void *data)</div><div class='add'>+{</div><div class='add'>+    gf_cli_req req = {{</div><div class='add'>+        0,</div><div class='add'>+    }};</div><div class='add'>+    int ret = 0;</div><div class='add'>+    dict_t *dict = NULL;</div><div class='add'>+</div><div class='add'>+    if (!frame || !this || !data) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    dict = data;</div><div class='add'>+    ret = add_cli_cmd_timeout_to_dict(dict);</div><div class='add'>+</div><div class='add'>+    ret = dict_allocate_and_serialize(dict, &amp;req.dict.dict_val,</div><div class='add'>+                                      &amp;req.dict.dict_len);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        gf_log(this-&gt;name, GF_LOG_ERROR, DICT_SERIALIZE_FAIL);</div><div class='add'>+</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = cli_cmd_submit(global_quotad_rpc, &amp;req, frame, &amp;cli_quotad_clnt,</div><div class='add'>+                         GF_AGGREGATOR_GETLIMIT, NULL, this,</div><div class='add'>+                         cli_quotad_getlimit_cbk, (xdrproc_t)xdr_gf_cli_req);</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    GF_FREE(req.dict.dict_val);</div><div class='add'>+    gf_log("cli", GF_LOG_DEBUG, RETURNING, ret);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf_cli_quota_list(cli_local_t *local, char *volname, dict_t *dict,</div><div class='add'>+                  char *default_sl, int count, int op_ret, int op_errno,</div><div class='add'>+                  char *op_errstr)</div><div class='add'>+{</div><div class='add'>+    if (!cli_cmd_connected())</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    if (count &gt; 0) {</div><div class='add'>+        GF_VALIDATE_OR_GOTO("cli", volname, out);</div><div class='add'>+</div><div class='add'>+        gf_cli_print_limit_list_from_dict(local, volname, dict, default_sl,</div><div class='add'>+                                          count, op_ret, op_errno, op_errstr);</div><div class='add'>+    }</div><div class='add'>+out:</div><div class='add'>+    return;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+gf_cli_quota_cbk(struct rpc_req *req, struct iovec *iov, int count,</div><div class='add'>+                 void *myframe)</div><div class='add'>+{</div><div class='add'>+    gf_cli_rsp rsp = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int ret = -1;</div><div class='add'>+    dict_t *dict = NULL;</div><div class='add'>+    char *volname = NULL;</div><div class='add'>+    int32_t type = 0;</div><div class='add'>+    call_frame_t *frame = NULL;</div><div class='add'>+    char *default_sl = NULL;</div><div class='add'>+    cli_local_t *local = NULL;</div><div class='add'>+    char *default_sl_dup = NULL;</div><div class='add'>+    int32_t entry_count = 0;</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(myframe);</div><div class='add'>+</div><div class='add'>+    if (-1 == req-&gt;rpc_status) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    frame = myframe;</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(frame-&gt;local);</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+</div><div class='add'>+    ret = xdr_to_generic(*iov, &amp;rsp, (xdrproc_t)xdr_gf_cli_rsp);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        gf_log(frame-&gt;this-&gt;name, GF_LOG_ERROR, XDR_DECODE_FAIL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (rsp.op_ret) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        if (global_state-&gt;mode &amp; GLUSTER_MODE_XML)</div><div class='add'>+            goto xml_output;</div><div class='add'>+</div><div class='add'>+        if (strcmp(rsp.op_errstr, "")) {</div><div class='add'>+            cli_err("quota command failed : %s", rsp.op_errstr);</div><div class='add'>+            if (rsp.op_ret == -ENOENT)</div><div class='add'>+                cli_err("please enter the path relative to the volume");</div><div class='add'>+        } else {</div><div class='add'>+            cli_err("quota command : failed");</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (rsp.dict.dict_len) {</div><div class='add'>+        /* Unserialize the dictionary */</div><div class='add'>+        dict = dict_new();</div><div class='add'>+</div><div class='add'>+        ret = dict_unserialize(rsp.dict.dict_val, rsp.dict.dict_len, &amp;dict);</div><div class='add'>+        if (ret &lt; 0) {</div><div class='add'>+            gf_log("cli", GF_LOG_ERROR, DICT_UNSERIALIZE_FAIL);</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    gf_log("cli", GF_LOG_DEBUG, "Received resp to quota command");</div><div class='add'>+</div><div class='add'>+    ret = dict_get_str_sizen(dict, "default-soft-limit", &amp;default_sl);</div><div class='add'>+    if (ret)</div><div class='add'>+        gf_log(frame-&gt;this-&gt;name, GF_LOG_TRACE,</div><div class='add'>+               "failed to get default soft limit");</div><div class='add'>+</div><div class='add'>+    // default-soft-limit is part of rsp_dict only iff we sent</div><div class='add'>+    // GLUSTER_CLI_QUOTA with type being GF_QUOTA_OPTION_TYPE_LIST</div><div class='add'>+    if (default_sl) {</div><div class='add'>+        default_sl_dup = gf_strdup(default_sl);</div><div class='add'>+        if (!default_sl_dup) {</div><div class='add'>+            ret = -1;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+        ret = dict_set_dynstr_sizen(local-&gt;dict, "default-soft-limit",</div><div class='add'>+                                    default_sl_dup);</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_log(frame-&gt;this-&gt;name, GF_LOG_TRACE,</div><div class='add'>+                   "failed to set default soft limit");</div><div class='add'>+            GF_FREE(default_sl_dup);</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_get_str_sizen(dict, "volname", &amp;volname);</div><div class='add'>+    if (ret)</div><div class='add'>+        gf_log(frame-&gt;this-&gt;name, GF_LOG_ERROR, "failed to get volname");</div><div class='add'>+</div><div class='add'>+    ret = dict_get_int32_sizen(dict, "type", &amp;type);</div><div class='add'>+    if (ret)</div><div class='add'>+        gf_log(frame-&gt;this-&gt;name, GF_LOG_TRACE, "failed to get type");</div><div class='add'>+</div><div class='add'>+    ret = dict_get_int32_sizen(dict, "count", &amp;entry_count);</div><div class='add'>+    if (ret)</div><div class='add'>+        gf_log(frame-&gt;this-&gt;name, GF_LOG_TRACE, "failed to get count");</div><div class='add'>+</div><div class='add'>+    if ((type == GF_QUOTA_OPTION_TYPE_LIST) ||</div><div class='add'>+        (type == GF_QUOTA_OPTION_TYPE_LIST_OBJECTS)) {</div><div class='add'>+        gf_cli_quota_list(local, volname, dict, default_sl, entry_count,</div><div class='add'>+                          rsp.op_ret, rsp.op_errno, rsp.op_errstr);</div><div class='add'>+</div><div class='add'>+        if (global_state-&gt;mode &amp; GLUSTER_MODE_XML) {</div><div class='add'>+            ret = cli_xml_output_vol_quota_limit_list_end(local);</div><div class='add'>+            if (ret &lt; 0) {</div><div class='add'>+                ret = -1;</div><div class='add'>+                gf_log("cli", GF_LOG_ERROR, XML_ERROR);</div><div class='add'>+            }</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+xml_output:</div><div class='add'>+</div><div class='add'>+    if (global_state-&gt;mode &amp; GLUSTER_MODE_XML) {</div><div class='add'>+        ret = cli_xml_output_str("volQuota", NULL, rsp.op_ret, rsp.op_errno,</div><div class='add'>+                                 rsp.op_errstr);</div><div class='add'>+        if (ret)</div><div class='add'>+            gf_log("cli", GF_LOG_ERROR, XML_ERROR);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (!rsp.op_ret &amp;&amp; type != GF_QUOTA_OPTION_TYPE_LIST &amp;&amp;</div><div class='add'>+        type != GF_QUOTA_OPTION_TYPE_LIST_OBJECTS)</div><div class='add'>+        cli_out("volume quota : success");</div><div class='add'>+</div><div class='add'>+    ret = rsp.op_ret;</div><div class='add'>+out:</div><div class='add'>+</div><div class='add'>+    if ((type == GF_QUOTA_OPTION_TYPE_LIST) ||</div><div class='add'>+        (type == GF_QUOTA_OPTION_TYPE_LIST_OBJECTS)) {</div><div class='add'>+        gluster_remove_auxiliary_mount(volname);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    cli_cmd_broadcast_response(ret);</div><div class='add'>+    if (dict)</div><div class='add'>+        dict_unref(dict);</div><div class='add'>+</div><div class='add'>+    gf_free_xdr_cli_rsp(rsp);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+gf_cli_getspec_cbk(struct rpc_req *req, struct iovec *iov, int count,</div><div class='add'>+                   void *myframe)</div><div class='add'>+{</div><div class='add'>+    gf_getspec_rsp rsp = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int ret = -1;</div><div class='add'>+    char *spec = NULL;</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(myframe);</div><div class='add'>+</div><div class='add'>+    if (-1 == req-&gt;rpc_status) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = xdr_to_generic(*iov, &amp;rsp, (xdrproc_t)xdr_gf_getspec_rsp);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        gf_log(((call_frame_t *)myframe)-&gt;this-&gt;name, GF_LOG_ERROR,</div><div class='add'>+               XDR_DECODE_FAIL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (rsp.op_ret == -1) {</div><div class='add'>+        gf_log(((call_frame_t *)myframe)-&gt;this-&gt;name, GF_LOG_ERROR,</div><div class='add'>+               "getspec failed");</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    gf_log("cli", GF_LOG_INFO, "Received resp to getspec");</div><div class='add'>+</div><div class='add'>+    spec = GF_MALLOC(rsp.op_ret + 1, cli_mt_char);</div><div class='add'>+    if (!spec) {</div><div class='add'>+        gf_log("", GF_LOG_ERROR, "out of memory");</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    memcpy(spec, rsp.spec, rsp.op_ret);</div><div class='add'>+    spec[rsp.op_ret] = '\0';</div><div class='add'>+    cli_out("%s", spec);</div><div class='add'>+    GF_FREE(spec);</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    cli_cmd_broadcast_response(ret);</div><div class='add'>+    gf_free_xdr_getspec_rsp(rsp);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+gf_cli_pmap_b2p_cbk(struct rpc_req *req, struct iovec *iov, int count,</div><div class='add'>+                    void *myframe)</div><div class='add'>+{</div><div class='add'>+    pmap_port_by_brick_rsp rsp = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int ret = -1;</div><div class='add'>+    char *spec = NULL;</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(myframe);</div><div class='add'>+</div><div class='add'>+    if (-1 == req-&gt;rpc_status) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = xdr_to_generic(*iov, &amp;rsp, (xdrproc_t)xdr_pmap_port_by_brick_rsp);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        gf_log(((call_frame_t *)myframe)-&gt;this-&gt;name, GF_LOG_ERROR,</div><div class='add'>+               XDR_DECODE_FAIL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (rsp.op_ret == -1) {</div><div class='add'>+        gf_log(((call_frame_t *)myframe)-&gt;this-&gt;name, GF_LOG_ERROR,</div><div class='add'>+               "pump_b2p failed");</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    gf_log("cli", GF_LOG_INFO, "Received resp to pmap b2p");</div><div class='add'>+</div><div class='add'>+    cli_out("%d", rsp.port);</div><div class='add'>+    GF_FREE(spec);</div><div class='add'>+</div><div class='add'>+    ret = rsp.op_ret;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    cli_cmd_broadcast_response(ret);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int32_t</div><div class='add'>+gf_cli_probe(call_frame_t *frame, xlator_t *this, void *data)</div><div class='add'>+{</div><div class='add'>+    gf_cli_req req = {</div><div class='add'>+        {</div><div class='add'>+            0,</div><div class='add'>+        },</div><div class='add'>+    };</div><div class='add'>+    int ret = 0;</div><div class='add'>+    dict_t *dict = NULL;</div><div class='add'>+    int port = 0;</div><div class='add'>+</div><div class='add'>+    if (!frame || !this || !data) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    dict = data;</div><div class='add'>+</div><div class='add'>+    ret = dict_get_int32_sizen(dict, "port", &amp;port);</div><div class='add'>+    if (ret) {</div><div class='add'>+        ret = dict_set_int32_sizen(dict, "port", CLI_GLUSTERD_PORT);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = cli_to_glusterd(&amp;req, frame, gf_cli_probe_cbk,</div><div class='add'>+                          (xdrproc_t)xdr_gf_cli_req, dict, GLUSTER_CLI_PROBE,</div><div class='add'>+                          this, cli_rpc_prog, NULL);</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    GF_FREE(req.dict.dict_val);</div><div class='add'>+    gf_log("cli", GF_LOG_DEBUG, RETURNING, ret);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int32_t</div><div class='add'>+gf_cli_deprobe(call_frame_t *frame, xlator_t *this, void *data)</div><div class='add'>+{</div><div class='add'>+    gf_cli_req req = {</div><div class='add'>+        {</div><div class='add'>+            0,</div><div class='add'>+        },</div><div class='add'>+    };</div><div class='add'>+    int ret = 0;</div><div class='add'>+    dict_t *dict = NULL;</div><div class='add'>+    int port = 0;</div><div class='add'>+    int flags = 0;</div><div class='add'>+</div><div class='add'>+    if (!frame || !this || !data) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    dict = data;</div><div class='add'>+    ret = dict_get_int32_sizen(dict, "port", &amp;port);</div><div class='add'>+    if (ret) {</div><div class='add'>+        ret = dict_set_int32_sizen(dict, "port", CLI_GLUSTERD_PORT);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_get_int32_sizen(dict, "flags", &amp;flags);</div><div class='add'>+    if (ret) {</div><div class='add'>+        ret = dict_set_int32_sizen(dict, "flags", 0);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = cli_to_glusterd(&amp;req, frame, gf_cli_deprobe_cbk,</div><div class='add'>+                          (xdrproc_t)xdr_gf_cli_req, dict, GLUSTER_CLI_DEPROBE,</div><div class='add'>+                          this, cli_rpc_prog, NULL);</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    GF_FREE(req.dict.dict_val);</div><div class='add'>+    gf_log("cli", GF_LOG_DEBUG, RETURNING, ret);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int32_t</div><div class='add'>+gf_cli_list_friends(call_frame_t *frame, xlator_t *this, void *data)</div><div class='add'>+{</div><div class='add'>+    gf1_cli_peer_list_req req = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int ret = 0;</div><div class='add'>+    unsigned long flags = 0;</div><div class='add'>+</div><div class='add'>+    if (!frame || !this) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(frame-&gt;local == NULL);</div><div class='add'>+</div><div class='add'>+    flags = (long)data;</div><div class='add'>+    req.flags = flags;</div><div class='add'>+    frame-&gt;local = (void *)flags;</div><div class='add'>+    ret = cli_cmd_submit(</div><div class='add'>+        NULL, &amp;req, frame, cli_rpc_prog, GLUSTER_CLI_LIST_FRIENDS, NULL, this,</div><div class='add'>+        gf_cli_list_friends_cbk, (xdrproc_t)xdr_gf1_cli_peer_list_req);</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (ret &amp;&amp; frame) {</div><div class='add'>+        /*</div><div class='add'>+         * If everything goes fine, gf_cli_list_friends_cbk()</div><div class='add'>+         * [invoked through cli_cmd_submit()]resets the</div><div class='add'>+         * frame-&gt;local to NULL. In case cli_cmd_submit()</div><div class='add'>+         * fails in between, RESET frame-&gt;local here.</div><div class='add'>+         */</div><div class='add'>+        frame-&gt;local = NULL;</div><div class='add'>+    }</div><div class='add'>+    gf_log("cli", GF_LOG_DEBUG, RETURNING, ret);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int32_t</div><div class='add'>+gf_cli_get_state(call_frame_t *frame, xlator_t *this, void *data)</div><div class='add'>+{</div><div class='add'>+    gf_cli_req req = {</div><div class='add'>+        {</div><div class='add'>+            0,</div><div class='add'>+        },</div><div class='add'>+    };</div><div class='add'>+    int ret = 0;</div><div class='add'>+    dict_t *dict = NULL;</div><div class='add'>+</div><div class='add'>+    dict = data;</div><div class='add'>+</div><div class='add'>+    ret = cli_to_glusterd(&amp;req, frame, gf_cli_get_state_cbk,</div><div class='add'>+                          (xdrproc_t)xdr_gf_cli_req, dict,</div><div class='add'>+                          GLUSTER_CLI_GET_STATE, this, cli_rpc_prog, NULL);</div><div class='add'>+    gf_log("cli", GF_LOG_DEBUG, RETURNING, ret);</div><div class='add'>+    GF_FREE(req.dict.dict_val);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int32_t</div><div class='add'>+gf_cli_get_next_volume(call_frame_t *frame, xlator_t *this, void *data)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+    cli_cmd_volume_get_ctx_t *ctx = NULL;</div><div class='add'>+    cli_local_t *local = NULL;</div><div class='add'>+</div><div class='add'>+    if (!frame || !this || !data) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ctx = data;</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+</div><div class='add'>+    if (global_state-&gt;mode &amp; GLUSTER_MODE_XML) {</div><div class='add'>+        ret = cli_xml_output_vol_info_begin(local, 0, 0, "");</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_log("cli", GF_LOG_ERROR, XML_ERROR);</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = gf_cli_get_volume(frame, this, data);</div><div class='add'>+</div><div class='add'>+    if (!local || !local-&gt;get_vol.volname) {</div><div class='add'>+        if ((global_state-&gt;mode &amp; GLUSTER_MODE_XML))</div><div class='add'>+            goto end_xml;</div><div class='add'>+</div><div class='add'>+        cli_err("No volumes present");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ctx-&gt;volname = local-&gt;get_vol.volname;</div><div class='add'>+</div><div class='add'>+    while (ctx-&gt;volname) {</div><div class='add'>+        ret = gf_cli_get_volume(frame, this, ctx);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+        ctx-&gt;volname = local-&gt;get_vol.volname;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+end_xml:</div><div class='add'>+    if (global_state-&gt;mode &amp; GLUSTER_MODE_XML) {</div><div class='add'>+        ret = cli_xml_output_vol_info_end(local);</div><div class='add'>+        if (ret)</div><div class='add'>+            gf_log("cli", GF_LOG_ERROR, XML_ERROR);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    gf_log("cli", GF_LOG_DEBUG, RETURNING, ret);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int32_t</div><div class='add'>+gf_cli_get_volume(call_frame_t *frame, xlator_t *this, void *data)</div><div class='add'>+{</div><div class='add'>+    gf_cli_req req = {{</div><div class='add'>+        0,</div><div class='add'>+    }};</div><div class='add'>+    int ret = 0;</div><div class='add'>+    cli_cmd_volume_get_ctx_t *ctx = NULL;</div><div class='add'>+    dict_t *dict = NULL;</div><div class='add'>+    int32_t flags = 0;</div><div class='add'>+</div><div class='add'>+    if (!this || !data) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ctx = data;</div><div class='add'>+</div><div class='add'>+    dict = dict_new();</div><div class='add'>+    if (!dict) {</div><div class='add'>+        gf_log(THIS-&gt;name, GF_LOG_ERROR, "Failed to create the dict");</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (ctx-&gt;volname) {</div><div class='add'>+        ret = dict_set_str_sizen(dict, "volname", ctx-&gt;volname);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    flags = ctx-&gt;flags;</div><div class='add'>+    ret = dict_set_int32_sizen(dict, "flags", flags);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log(frame-&gt;this-&gt;name, GF_LOG_ERROR, "failed to set flags");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_allocate_and_serialize(dict, &amp;req.dict.dict_val,</div><div class='add'>+                                      &amp;req.dict.dict_len);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log(frame-&gt;this-&gt;name, GF_LOG_ERROR, DICT_SERIALIZE_FAIL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = cli_cmd_submit(NULL, &amp;req, frame, cli_rpc_prog,</div><div class='add'>+                         GLUSTER_CLI_GET_VOLUME, NULL, this,</div><div class='add'>+                         gf_cli_get_volume_cbk, (xdrproc_t)xdr_gf_cli_req);</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (dict)</div><div class='add'>+        dict_unref(dict);</div><div class='add'>+</div><div class='add'>+    GF_FREE(req.dict.dict_val);</div><div class='add'>+</div><div class='add'>+    gf_log("cli", GF_LOG_DEBUG, RETURNING, ret);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int32_t</div><div class='add'>+gf_cli3_1_uuid_get(call_frame_t *frame, xlator_t *this, void *data)</div><div class='add'>+{</div><div class='add'>+    gf_cli_req req = {{</div><div class='add'>+        0,</div><div class='add'>+    }};</div><div class='add'>+    int ret = 0;</div><div class='add'>+    dict_t *dict = NULL;</div><div class='add'>+</div><div class='add'>+    dict = data;</div><div class='add'>+    ret = cli_to_glusterd(&amp;req, frame, gf_cli3_1_uuid_get_cbk,</div><div class='add'>+                          (xdrproc_t)xdr_gf_cli_req, dict, GLUSTER_CLI_UUID_GET,</div><div class='add'>+                          this, cli_rpc_prog, NULL);</div><div class='add'>+    gf_log("cli", GF_LOG_DEBUG, RETURNING, ret);</div><div class='add'>+    GF_FREE(req.dict.dict_val);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int32_t</div><div class='add'>+gf_cli3_1_uuid_reset(call_frame_t *frame, xlator_t *this, void *data)</div><div class='add'>+{</div><div class='add'>+    gf_cli_req req = {{</div><div class='add'>+        0,</div><div class='add'>+    }};</div><div class='add'>+    int ret = 0;</div><div class='add'>+    dict_t *dict = NULL;</div><div class='add'>+</div><div class='add'>+    dict = data;</div><div class='add'>+    ret = cli_to_glusterd(&amp;req, frame, gf_cli3_1_uuid_reset_cbk,</div><div class='add'>+                          (xdrproc_t)xdr_gf_cli_req, dict,</div><div class='add'>+                          GLUSTER_CLI_UUID_RESET, this, cli_rpc_prog, NULL);</div><div class='add'>+    gf_log("cli", GF_LOG_DEBUG, RETURNING, ret);</div><div class='add'>+    GF_FREE(req.dict.dict_val);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int32_t</div><div class='add'>+gf_cli_create_volume(call_frame_t *frame, xlator_t *this, void *data)</div><div class='add'>+{</div><div class='add'>+    gf_cli_req req = {{</div><div class='add'>+        0,</div><div class='add'>+    }};</div><div class='add'>+    int ret = 0;</div><div class='add'>+    dict_t *dict = NULL;</div><div class='add'>+</div><div class='add'>+    dict = data;</div><div class='add'>+</div><div class='add'>+    ret = cli_to_glusterd(&amp;req, frame, gf_cli_create_volume_cbk,</div><div class='add'>+                          (xdrproc_t)xdr_gf_cli_req, dict,</div><div class='add'>+                          GLUSTER_CLI_CREATE_VOLUME, this, cli_rpc_prog, NULL);</div><div class='add'>+    gf_log("cli", GF_LOG_DEBUG, RETURNING, ret);</div><div class='add'>+</div><div class='add'>+    GF_FREE(req.dict.dict_val);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int32_t</div><div class='add'>+gf_cli_delete_volume(call_frame_t *frame, xlator_t *this, void *data)</div><div class='add'>+{</div><div class='add'>+    gf_cli_req req = {{</div><div class='add'>+        0,</div><div class='add'>+    }};</div><div class='add'>+    int ret = 0;</div><div class='add'>+    dict_t *dict = NULL;</div><div class='add'>+</div><div class='add'>+    dict = data;</div><div class='add'>+</div><div class='add'>+    ret = cli_to_glusterd(&amp;req, frame, gf_cli_delete_volume_cbk,</div><div class='add'>+                          (xdrproc_t)xdr_gf_cli_req, dict,</div><div class='add'>+                          GLUSTER_CLI_DELETE_VOLUME, this, cli_rpc_prog, NULL);</div><div class='add'>+    GF_FREE(req.dict.dict_val);</div><div class='add'>+    gf_log("cli", GF_LOG_DEBUG, RETURNING, ret);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int32_t</div><div class='add'>+gf_cli_start_volume(call_frame_t *frame, xlator_t *this, void *data)</div><div class='add'>+{</div><div class='add'>+    gf_cli_req req = {{</div><div class='add'>+        0,</div><div class='add'>+    }};</div><div class='add'>+    int ret = 0;</div><div class='add'>+    dict_t *dict = NULL;</div><div class='add'>+</div><div class='add'>+    dict = data;</div><div class='add'>+</div><div class='add'>+    ret = cli_to_glusterd(&amp;req, frame, gf_cli_start_volume_cbk,</div><div class='add'>+                          (xdrproc_t)xdr_gf_cli_req, dict,</div><div class='add'>+                          GLUSTER_CLI_START_VOLUME, this, cli_rpc_prog, NULL);</div><div class='add'>+</div><div class='add'>+    gf_log("cli", GF_LOG_DEBUG, RETURNING, ret);</div><div class='add'>+    GF_FREE(req.dict.dict_val);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int32_t</div><div class='add'>+gf_cli_stop_volume(call_frame_t *frame, xlator_t *this, void *data)</div><div class='add'>+{</div><div class='add'>+    gf_cli_req req = {{</div><div class='add'>+        0,</div><div class='add'>+    }};</div><div class='add'>+    int ret = 0;</div><div class='add'>+    dict_t *dict = data;</div><div class='add'>+</div><div class='add'>+    dict = data;</div><div class='add'>+</div><div class='add'>+    ret = cli_to_glusterd(&amp;req, frame, gf_cli_stop_volume_cbk,</div><div class='add'>+                          (xdrproc_t)xdr_gf_cli_req, dict,</div><div class='add'>+                          GLUSTER_CLI_STOP_VOLUME, this, cli_rpc_prog, NULL);</div><div class='add'>+    gf_log("cli", GF_LOG_DEBUG, RETURNING, ret);</div><div class='add'>+    GF_FREE(req.dict.dict_val);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int32_t</div><div class='add'>+gf_cli_defrag_volume(call_frame_t *frame, xlator_t *this, void *data)</div><div class='add'>+{</div><div class='add'>+    gf_cli_req req = {{</div><div class='add'>+        0,</div><div class='add'>+    }};</div><div class='add'>+    int ret = 0;</div><div class='add'>+    dict_t *dict = NULL;</div><div class='add'>+</div><div class='add'>+    dict = data;</div><div class='add'>+</div><div class='add'>+    ret = cli_to_glusterd(&amp;req, frame, gf_cli_defrag_volume_cbk,</div><div class='add'>+                          (xdrproc_t)xdr_gf_cli_req, dict,</div><div class='add'>+                          GLUSTER_CLI_DEFRAG_VOLUME, this, cli_rpc_prog, NULL);</div><div class='add'>+    gf_log("cli", GF_LOG_DEBUG, RETURNING, ret);</div><div class='add'>+    GF_FREE(req.dict.dict_val);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int32_t</div><div class='add'>+gf_cli_rename_volume(call_frame_t *frame, xlator_t *this, void *data)</div><div class='add'>+{</div><div class='add'>+    gf_cli_req req = {{</div><div class='add'>+        0,</div><div class='add'>+    }};</div><div class='add'>+    int ret = 0;</div><div class='add'>+    dict_t *dict = NULL;</div><div class='add'>+</div><div class='add'>+    if (!frame || !this || !data) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    dict = data;</div><div class='add'>+</div><div class='add'>+    ret = dict_allocate_and_serialize(dict, &amp;req.dict.dict_val,</div><div class='add'>+                                      &amp;req.dict.dict_len);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        gf_log(this-&gt;name, GF_LOG_ERROR, DICT_SERIALIZE_FAIL);</div><div class='add'>+</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = cli_cmd_submit(NULL, &amp;req, frame, cli_rpc_prog,</div><div class='add'>+                         GLUSTER_CLI_RENAME_VOLUME, NULL, this,</div><div class='add'>+                         gf_cli_rename_volume_cbk, (xdrproc_t)xdr_gf_cli_req);</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    GF_FREE(req.dict.dict_val);</div><div class='add'>+    gf_log("cli", GF_LOG_DEBUG, RETURNING, ret);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int32_t</div><div class='add'>+gf_cli_reset_volume(call_frame_t *frame, xlator_t *this, void *data)</div><div class='add'>+{</div><div class='add'>+    gf_cli_req req = {{</div><div class='add'>+        0,</div><div class='add'>+    }};</div><div class='add'>+    int ret = 0;</div><div class='add'>+    dict_t *dict = NULL;</div><div class='add'>+</div><div class='add'>+    dict = data;</div><div class='add'>+</div><div class='add'>+    ret = cli_to_glusterd(&amp;req, frame, gf_cli_reset_volume_cbk,</div><div class='add'>+                          (xdrproc_t)xdr_gf_cli_req, dict,</div><div class='add'>+                          GLUSTER_CLI_RESET_VOLUME, this, cli_rpc_prog, NULL);</div><div class='add'>+    gf_log("cli", GF_LOG_DEBUG, RETURNING, ret);</div><div class='add'>+    GF_FREE(req.dict.dict_val);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int32_t</div><div class='add'>+gf_cli_ganesha(call_frame_t *frame, xlator_t *this, void *data)</div><div class='add'>+{</div><div class='add'>+    gf_cli_req req = {{</div><div class='add'>+        0,</div><div class='add'>+    }};</div><div class='add'>+    int ret = 0;</div><div class='add'>+    dict_t *dict = NULL;</div><div class='add'>+</div><div class='add'>+    dict = data;</div><div class='add'>+</div><div class='add'>+    ret = cli_to_glusterd(&amp;req, frame, gf_cli_ganesha_cbk,</div><div class='add'>+                          (xdrproc_t)xdr_gf_cli_req, dict, GLUSTER_CLI_GANESHA,</div><div class='add'>+                          this, cli_rpc_prog, NULL);</div><div class='add'>+    gf_log("cli", GF_LOG_DEBUG, RETURNING, ret);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int32_t</div><div class='add'>+gf_cli_set_volume(call_frame_t *frame, xlator_t *this, void *data)</div><div class='add'>+{</div><div class='add'>+    gf_cli_req req = {{</div><div class='add'>+        0,</div><div class='add'>+    }};</div><div class='add'>+    int ret = 0;</div><div class='add'>+    dict_t *dict = NULL;</div><div class='add'>+</div><div class='add'>+    dict = data;</div><div class='add'>+</div><div class='add'>+    ret = cli_to_glusterd(&amp;req, frame, gf_cli_set_volume_cbk,</div><div class='add'>+                          (xdrproc_t)xdr_gf_cli_req, dict,</div><div class='add'>+                          GLUSTER_CLI_SET_VOLUME, this, cli_rpc_prog, NULL);</div><div class='add'>+    gf_log("cli", GF_LOG_DEBUG, RETURNING, ret);</div><div class='add'>+    GF_FREE(req.dict.dict_val);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+gf_cli_add_brick(call_frame_t *frame, xlator_t *this, void *data)</div><div class='add'>+{</div><div class='add'>+    gf_cli_req req = {{</div><div class='add'>+        0,</div><div class='add'>+    }};</div><div class='add'>+    int ret = 0;</div><div class='add'>+    dict_t *dict = NULL;</div><div class='add'>+</div><div class='add'>+    dict = data;</div><div class='add'>+</div><div class='add'>+    ret = cli_to_glusterd(&amp;req, frame, gf_cli_add_brick_cbk,</div><div class='add'>+                          (xdrproc_t)xdr_gf_cli_req, dict,</div><div class='add'>+                          GLUSTER_CLI_ADD_BRICK, this, cli_rpc_prog, NULL);</div><div class='add'>+</div><div class='add'>+    gf_log("cli", GF_LOG_DEBUG, RETURNING, ret);</div><div class='add'>+</div><div class='add'>+    GF_FREE(req.dict.dict_val);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int32_t</div><div class='add'>+gf_cli_remove_brick(call_frame_t *frame, xlator_t *this, void *data)</div><div class='add'>+{</div><div class='add'>+    gf_cli_req req = {{</div><div class='add'>+        0,</div><div class='add'>+    }};</div><div class='add'>+    ;</div><div class='add'>+    gf_cli_req status_req = {{</div><div class='add'>+        0,</div><div class='add'>+    }};</div><div class='add'>+    ;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    dict_t *dict = NULL;</div><div class='add'>+    int32_t command = 0;</div><div class='add'>+    int32_t cmd = 0;</div><div class='add'>+</div><div class='add'>+    if (!frame || !this) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    dict = data;</div><div class='add'>+</div><div class='add'>+    ret = dict_get_int32_sizen(dict, "command", &amp;command);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    if ((command != GF_OP_CMD_STATUS) &amp;&amp; (command != GF_OP_CMD_STOP)) {</div><div class='add'>+        ret = cli_to_glusterd(</div><div class='add'>+            &amp;req, frame, gf_cli_remove_brick_cbk, (xdrproc_t)xdr_gf_cli_req,</div><div class='add'>+            dict, GLUSTER_CLI_REMOVE_BRICK, this, cli_rpc_prog, NULL);</div><div class='add'>+    } else {</div><div class='add'>+        /* Need rebalance status to be sent :-) */</div><div class='add'>+        if (command == GF_OP_CMD_STATUS)</div><div class='add'>+            cmd |= GF_DEFRAG_CMD_STATUS;</div><div class='add'>+        else</div><div class='add'>+            cmd |= GF_DEFRAG_CMD_STOP;</div><div class='add'>+</div><div class='add'>+        ret = dict_set_int32_sizen(dict, "rebalance-command", (int32_t)cmd);</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_log(this-&gt;name, GF_LOG_ERROR, "Failed to set dict");</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        ret = cli_to_glusterd(</div><div class='add'>+            &amp;status_req, frame, gf_cli3_remove_brick_status_cbk,</div><div class='add'>+            (xdrproc_t)xdr_gf_cli_req, dict, GLUSTER_CLI_DEFRAG_VOLUME, this,</div><div class='add'>+            cli_rpc_prog, NULL);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    gf_log("cli", GF_LOG_DEBUG, RETURNING, ret);</div><div class='add'>+</div><div class='add'>+    GF_FREE(req.dict.dict_val);</div><div class='add'>+</div><div class='add'>+    GF_FREE(status_req.dict.dict_val);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int32_t</div><div class='add'>+gf_cli_reset_brick(call_frame_t *frame, xlator_t *this, void *data)</div><div class='add'>+{</div><div class='add'>+    gf_cli_req req = {{</div><div class='add'>+        0,</div><div class='add'>+    }};</div><div class='add'>+    int ret = 0;</div><div class='add'>+    dict_t *dict = NULL;</div><div class='add'>+    char *dst_brick = NULL;</div><div class='add'>+    char *op = NULL;</div><div class='add'>+</div><div class='add'>+    if (!frame || !this || !data) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    dict = data;</div><div class='add'>+</div><div class='add'>+    ret = dict_get_str_sizen(dict, "operation", &amp;op);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log(this-&gt;name, GF_LOG_DEBUG, "dict_get on operation failed");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (!strcmp(op, "GF_RESET_OP_COMMIT") ||</div><div class='add'>+        !strcmp(op, "GF_RESET_OP_COMMIT_FORCE")) {</div><div class='add'>+        ret = dict_get_str_sizen(dict, "dst-brick", &amp;dst_brick);</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_log(this-&gt;name, GF_LOG_DEBUG, "dict_get on dst-brick failed");</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = cli_to_glusterd(&amp;req, frame, gf_cli_reset_brick_cbk,</div><div class='add'>+                          (xdrproc_t)xdr_gf_cli_req, dict,</div><div class='add'>+                          GLUSTER_CLI_RESET_BRICK, this, cli_rpc_prog, NULL);</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    gf_log("cli", GF_LOG_DEBUG, RETURNING, ret);</div><div class='add'>+</div><div class='add'>+    GF_FREE(req.dict.dict_val);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int32_t</div><div class='add'>+gf_cli_replace_brick(call_frame_t *frame, xlator_t *this, void *data)</div><div class='add'>+{</div><div class='add'>+    gf_cli_req req = {{</div><div class='add'>+        0,</div><div class='add'>+    }};</div><div class='add'>+    int ret = 0;</div><div class='add'>+    dict_t *dict = NULL;</div><div class='add'>+    int32_t op = 0;</div><div class='add'>+</div><div class='add'>+    if (!frame || !this || !data) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    dict = data;</div><div class='add'>+</div><div class='add'>+    ret = dict_get_int32_sizen(dict, "operation", &amp;op);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log(this-&gt;name, GF_LOG_DEBUG, "dict_get on operation failed");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = cli_to_glusterd(&amp;req, frame, gf_cli_replace_brick_cbk,</div><div class='add'>+                          (xdrproc_t)xdr_gf_cli_req, dict,</div><div class='add'>+                          GLUSTER_CLI_REPLACE_BRICK, this, cli_rpc_prog, NULL);</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    gf_log("cli", GF_LOG_DEBUG, RETURNING, ret);</div><div class='add'>+</div><div class='add'>+    GF_FREE(req.dict.dict_val);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int32_t</div><div class='add'>+gf_cli_log_rotate(call_frame_t *frame, xlator_t *this, void *data)</div><div class='add'>+{</div><div class='add'>+    gf_cli_req req = {{</div><div class='add'>+        0,</div><div class='add'>+    }};</div><div class='add'>+    int ret = 0;</div><div class='add'>+    dict_t *dict = NULL;</div><div class='add'>+</div><div class='add'>+    dict = data;</div><div class='add'>+</div><div class='add'>+    ret = cli_to_glusterd(&amp;req, frame, gf_cli_log_rotate_cbk,</div><div class='add'>+                          (xdrproc_t)xdr_gf_cli_req, dict,</div><div class='add'>+                          GLUSTER_CLI_LOG_ROTATE, this, cli_rpc_prog, NULL);</div><div class='add'>+    gf_log("cli", GF_LOG_DEBUG, RETURNING, ret);</div><div class='add'>+</div><div class='add'>+    GF_FREE(req.dict.dict_val);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int32_t</div><div class='add'>+gf_cli_sync_volume(call_frame_t *frame, xlator_t *this, void *data)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+    gf_cli_req req = {{</div><div class='add'>+        0,</div><div class='add'>+    }};</div><div class='add'>+    dict_t *dict = NULL;</div><div class='add'>+</div><div class='add'>+    dict = data;</div><div class='add'>+</div><div class='add'>+    ret = cli_to_glusterd(&amp;req, frame, gf_cli_sync_volume_cbk,</div><div class='add'>+                          (xdrproc_t)xdr_gf_cli_req, dict,</div><div class='add'>+                          GLUSTER_CLI_SYNC_VOLUME, this, cli_rpc_prog, NULL);</div><div class='add'>+    gf_log("cli", GF_LOG_DEBUG, RETURNING, ret);</div><div class='add'>+    GF_FREE(req.dict.dict_val);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int32_t</div><div class='add'>+gf_cli_getspec(call_frame_t *frame, xlator_t *this, void *data)</div><div class='add'>+{</div><div class='add'>+    gf_getspec_req req = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int ret = 0;</div><div class='add'>+    dict_t *dict = NULL;</div><div class='add'>+    dict_t *op_dict = NULL;</div><div class='add'>+</div><div class='add'>+    if (!frame || !this) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    dict = data;</div><div class='add'>+</div><div class='add'>+    ret = dict_get_str_sizen(dict, "volid", &amp;req.key);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    op_dict = dict_new();</div><div class='add'>+    if (!op_dict) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    // Set the supported min and max op-versions, so glusterd can make a</div><div class='add'>+    // decision</div><div class='add'>+    ret = dict_set_int32_sizen(op_dict, "min-op-version", GD_OP_VERSION_MIN);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log(THIS-&gt;name, GF_LOG_ERROR,</div><div class='add'>+               "Failed to set min-op-version in request dict");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_set_int32_sizen(op_dict, "max-op-version", GD_OP_VERSION_MAX);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log(THIS-&gt;name, GF_LOG_ERROR,</div><div class='add'>+               "Failed to set max-op-version in request dict");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_allocate_and_serialize(op_dict, &amp;req.xdata.xdata_val,</div><div class='add'>+                                      &amp;req.xdata.xdata_len);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        gf_log(THIS-&gt;name, GF_LOG_ERROR, DICT_SERIALIZE_FAIL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = cli_cmd_submit(NULL, &amp;req, frame, &amp;cli_handshake_prog,</div><div class='add'>+                         GF_HNDSK_GETSPEC, NULL, this, gf_cli_getspec_cbk,</div><div class='add'>+                         (xdrproc_t)xdr_gf_getspec_req);</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (op_dict) {</div><div class='add'>+        dict_unref(op_dict);</div><div class='add'>+    }</div><div class='add'>+    GF_FREE(req.xdata.xdata_val);</div><div class='add'>+    gf_log("cli", GF_LOG_DEBUG, RETURNING, ret);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int32_t</div><div class='add'>+gf_cli_quota(call_frame_t *frame, xlator_t *this, void *data)</div><div class='add'>+{</div><div class='add'>+    gf_cli_req req = {{</div><div class='add'>+        0,</div><div class='add'>+    }};</div><div class='add'>+    int ret = 0;</div><div class='add'>+    dict_t *dict = NULL;</div><div class='add'>+</div><div class='add'>+    dict = data;</div><div class='add'>+</div><div class='add'>+    ret = cli_to_glusterd(&amp;req, frame, gf_cli_quota_cbk,</div><div class='add'>+                          (xdrproc_t)xdr_gf_cli_req, dict, GLUSTER_CLI_QUOTA,</div><div class='add'>+                          this, cli_rpc_prog, NULL);</div><div class='add'>+    GF_FREE(req.dict.dict_val);</div><div class='add'>+    gf_log("cli", GF_LOG_DEBUG, RETURNING, ret);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int32_t</div><div class='add'>+gf_cli_pmap_b2p(call_frame_t *frame, xlator_t *this, void *data)</div><div class='add'>+{</div><div class='add'>+    pmap_port_by_brick_req req = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int ret = 0;</div><div class='add'>+    dict_t *dict = NULL;</div><div class='add'>+</div><div class='add'>+    if (!frame || !this) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    dict = data;</div><div class='add'>+</div><div class='add'>+    ret = dict_get_str_sizen(dict, "brick", &amp;req.brick);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    ret = cli_cmd_submit(NULL, &amp;req, frame, &amp;cli_pmap_prog, GF_PMAP_PORTBYBRICK,</div><div class='add'>+                         NULL, this, gf_cli_pmap_b2p_cbk,</div><div class='add'>+                         (xdrproc_t)xdr_pmap_port_by_brick_req);</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    gf_log("cli", GF_LOG_DEBUG, RETURNING, ret);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+gf_cli_fsm_log_cbk(struct rpc_req *req, struct iovec *iov, int count,</div><div class='add'>+                   void *myframe)</div><div class='add'>+{</div><div class='add'>+    gf1_cli_fsm_log_rsp rsp = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int ret = -1;</div><div class='add'>+    dict_t *dict = NULL;</div><div class='add'>+    int tr_count = 0;</div><div class='add'>+    char key[64] = {0};</div><div class='add'>+    int keylen;</div><div class='add'>+    int i = 0;</div><div class='add'>+    char *old_state = NULL;</div><div class='add'>+    char *new_state = NULL;</div><div class='add'>+    char *event = NULL;</div><div class='add'>+    char *time = NULL;</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(myframe);</div><div class='add'>+</div><div class='add'>+    if (-1 == req-&gt;rpc_status) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = xdr_to_generic(*iov, &amp;rsp, (xdrproc_t)xdr_gf1_cli_fsm_log_rsp);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        gf_log(((call_frame_t *)myframe)-&gt;this-&gt;name, GF_LOG_ERROR,</div><div class='add'>+               XDR_DECODE_FAIL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (rsp.op_ret) {</div><div class='add'>+        if (strcmp(rsp.op_errstr, ""))</div><div class='add'>+            cli_err("%s", rsp.op_errstr);</div><div class='add'>+        cli_err("fsm log unsuccessful");</div><div class='add'>+        ret = rsp.op_ret;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    dict = dict_new();</div><div class='add'>+    if (!dict) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_unserialize(rsp.fsm_log.fsm_log_val, rsp.fsm_log.fsm_log_len,</div><div class='add'>+                           &amp;dict);</div><div class='add'>+</div><div class='add'>+    if (ret) {</div><div class='add'>+        cli_err(DICT_UNSERIALIZE_FAIL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_get_int32_sizen(dict, "count", &amp;tr_count);</div><div class='add'>+    if (!ret &amp;&amp; tr_count)</div><div class='add'>+        cli_out("number of transitions: %d", tr_count);</div><div class='add'>+    else</div><div class='add'>+        cli_err("No transitions");</div><div class='add'>+    for (i = 0; i &lt; tr_count; i++) {</div><div class='add'>+        keylen = snprintf(key, sizeof(key), "log%d-old-state", i);</div><div class='add'>+        ret = dict_get_strn(dict, key, keylen, &amp;old_state);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+</div><div class='add'>+        keylen = snprintf(key, sizeof(key), "log%d-event", i);</div><div class='add'>+        ret = dict_get_strn(dict, key, keylen, &amp;event);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+</div><div class='add'>+        keylen = snprintf(key, sizeof(key), "log%d-new-state", i);</div><div class='add'>+        ret = dict_get_strn(dict, key, keylen, &amp;new_state);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+</div><div class='add'>+        keylen = snprintf(key, sizeof(key), "log%d-time", i);</div><div class='add'>+        ret = dict_get_strn(dict, key, keylen, &amp;time);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+        cli_out(</div><div class='add'>+            "Old State: [%s]\n"</div><div class='add'>+            "New State: [%s]\n"</div><div class='add'>+            "Event    : [%s]\n"</div><div class='add'>+            "timestamp: [%s]\n",</div><div class='add'>+            old_state, new_state, event, time);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = rsp.op_ret;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    cli_cmd_broadcast_response(ret);</div><div class='add'>+    if (dict) {</div><div class='add'>+        dict_unref(dict);</div><div class='add'>+    }</div><div class='add'>+    gf_free_xdr_fsm_log_rsp(rsp);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int32_t</div><div class='add'>+gf_cli_fsm_log(call_frame_t *frame, xlator_t *this, void *data)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    gf1_cli_fsm_log_req req = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(frame);</div><div class='add'>+    GF_ASSERT(this);</div><div class='add'>+    GF_ASSERT(data);</div><div class='add'>+</div><div class='add'>+    if (!frame || !this || !data)</div><div class='add'>+        goto out;</div><div class='add'>+    req.name = data;</div><div class='add'>+    ret = cli_cmd_submit(NULL, &amp;req, frame, cli_rpc_prog, GLUSTER_CLI_FSM_LOG,</div><div class='add'>+                         NULL, this, gf_cli_fsm_log_cbk,</div><div class='add'>+                         (xdrproc_t)xdr_gf1_cli_fsm_log_req);</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    gf_log("cli", GF_LOG_DEBUG, RETURNING, ret);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+gf_cli_gsync_config_command(dict_t *dict)</div><div class='add'>+{</div><div class='add'>+    runner_t runner = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    char *subop = NULL;</div><div class='add'>+    char *gwd = NULL;</div><div class='add'>+    char *slave = NULL;</div><div class='add'>+    char *confpath = NULL;</div><div class='add'>+    char *master = NULL;</div><div class='add'>+    char *op_name = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    char conf_path[PATH_MAX] = "";</div><div class='add'>+</div><div class='add'>+    if (dict_get_str_sizen(dict, "subop", &amp;subop) != 0)</div><div class='add'>+        return -1;</div><div class='add'>+</div><div class='add'>+    if (strcmp(subop, "get") != 0 &amp;&amp; strcmp(subop, "get-all") != 0) {</div><div class='add'>+        cli_out(GEOREP " config updated successfully");</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (dict_get_str_sizen(dict, "glusterd_workdir", &amp;gwd) != 0 ||</div><div class='add'>+        dict_get_str_sizen(dict, "slave", &amp;slave) != 0)</div><div class='add'>+        return -1;</div><div class='add'>+</div><div class='add'>+    if (dict_get_str_sizen(dict, "master", &amp;master) != 0)</div><div class='add'>+        master = NULL;</div><div class='add'>+    if (dict_get_str_sizen(dict, "op_name", &amp;op_name) != 0)</div><div class='add'>+        op_name = NULL;</div><div class='add'>+</div><div class='add'>+    ret = dict_get_str_sizen(dict, "conf_path", &amp;confpath);</div><div class='add'>+    if (ret || !confpath) {</div><div class='add'>+        ret = snprintf(conf_path, sizeof(conf_path) - 1,</div><div class='add'>+                       "%s/" GEOREP "/gsyncd_template.conf", gwd);</div><div class='add'>+        conf_path[ret] = '\0';</div><div class='add'>+        confpath = conf_path;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    runinit(&amp;runner);</div><div class='add'>+    runner_add_args(&amp;runner, GSYNCD_PREFIX "/gsyncd", "-c", NULL);</div><div class='add'>+    runner_argprintf(&amp;runner, "%s", confpath);</div><div class='add'>+    runner_argprintf(&amp;runner, "--iprefix=%s", DATADIR);</div><div class='add'>+    if (master)</div><div class='add'>+        runner_argprintf(&amp;runner, ":%s", master);</div><div class='add'>+    runner_add_arg(&amp;runner, slave);</div><div class='add'>+    runner_argprintf(&amp;runner, "--config-%s", subop);</div><div class='add'>+    if (op_name)</div><div class='add'>+        runner_add_arg(&amp;runner, op_name);</div><div class='add'>+</div><div class='add'>+    return runner_run(&amp;runner);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+gf_cli_print_status(char **title_values, gf_gsync_status_t **sts_vals,</div><div class='add'>+                    int *spacing, int gsync_count, int number_of_fields,</div><div class='add'>+                    int is_detail)</div><div class='add'>+{</div><div class='add'>+    int i = 0;</div><div class='add'>+    int j = 0;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    int status_fields = 8; /* Indexed at 0 */</div><div class='add'>+    int total_spacing = 0;</div><div class='add'>+    char **output_values = NULL;</div><div class='add'>+    char *tmp = NULL;</div><div class='add'>+    char *hyphens = NULL;</div><div class='add'>+</div><div class='add'>+    /* calculating spacing for hyphens */</div><div class='add'>+    for (i = 0; i &lt; number_of_fields; i++) {</div><div class='add'>+        /* Suppressing detail output for status */</div><div class='add'>+        if ((!is_detail) &amp;&amp; (i &gt; status_fields)) {</div><div class='add'>+            /* Suppressing detailed output for</div><div class='add'>+             * status */</div><div class='add'>+            continue;</div><div class='add'>+        }</div><div class='add'>+        spacing[i] += 3; /* Adding extra space to</div><div class='add'>+                            distinguish between fields */</div><div class='add'>+        total_spacing += spacing[i];</div><div class='add'>+    }</div><div class='add'>+    total_spacing += 4; /* For the spacing between the fields */</div><div class='add'>+</div><div class='add'>+    /* char pointers for each field */</div><div class='add'>+    output_values = GF_MALLOC(number_of_fields * sizeof(char *),</div><div class='add'>+                              gf_common_mt_char);</div><div class='add'>+    if (!output_values) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    for (i = 0; i &lt; number_of_fields; i++) {</div><div class='add'>+        output_values[i] = GF_CALLOC(spacing[i] + 1, sizeof(char),</div><div class='add'>+                                     gf_common_mt_char);</div><div class='add'>+        if (!output_values[i]) {</div><div class='add'>+            ret = -1;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    cli_out(" ");</div><div class='add'>+</div><div class='add'>+    /* setting the title "NODE", "MASTER", etc. from title_values[]</div><div class='add'>+       and printing the same */</div><div class='add'>+    for (j = 0; j &lt; number_of_fields; j++) {</div><div class='add'>+        if ((!is_detail) &amp;&amp; (j &gt; status_fields)) {</div><div class='add'>+            /* Suppressing detailed output for</div><div class='add'>+             * status */</div><div class='add'>+            output_values[j][0] = '\0';</div><div class='add'>+            continue;</div><div class='add'>+        }</div><div class='add'>+        memset(output_values[j], ' ', spacing[j]);</div><div class='add'>+        memcpy(output_values[j], title_values[j], strlen(title_values[j]));</div><div class='add'>+        output_values[j][spacing[j]] = '\0';</div><div class='add'>+    }</div><div class='add'>+    cli_out("%s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s", output_values[0],</div><div class='add'>+            output_values[1], output_values[2], output_values[3],</div><div class='add'>+            output_values[4], output_values[5], output_values[6],</div><div class='add'>+            output_values[7], output_values[8], output_values[9],</div><div class='add'>+            output_values[10], output_values[11], output_values[12],</div><div class='add'>+            output_values[13], output_values[14], output_values[15]);</div><div class='add'>+</div><div class='add'>+    hyphens = GF_MALLOC((total_spacing + 1) * sizeof(char), gf_common_mt_char);</div><div class='add'>+    if (!hyphens) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* setting and printing the hyphens */</div><div class='add'>+    memset(hyphens, '-', total_spacing);</div><div class='add'>+    hyphens[total_spacing] = '\0';</div><div class='add'>+    cli_out("%s", hyphens);</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; gsync_count; i++) {</div><div class='add'>+        for (j = 0; j &lt; number_of_fields; j++) {</div><div class='add'>+            if ((!is_detail) &amp;&amp; (j &gt; status_fields)) {</div><div class='add'>+                /* Suppressing detailed output for</div><div class='add'>+                 * status */</div><div class='add'>+                output_values[j][0] = '\0';</div><div class='add'>+                continue;</div><div class='add'>+            }</div><div class='add'>+            tmp = get_struct_variable(j, sts_vals[i]);</div><div class='add'>+            if (!tmp) {</div><div class='add'>+                gf_log("", GF_LOG_ERROR, "struct member empty.");</div><div class='add'>+                ret = -1;</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+            memset(output_values[j], ' ', spacing[j]);</div><div class='add'>+            memcpy(output_values[j], tmp, strlen(tmp));</div><div class='add'>+            output_values[j][spacing[j]] = '\0';</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        cli_out("%s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s",</div><div class='add'>+                output_values[0], output_values[1], output_values[2],</div><div class='add'>+                output_values[3], output_values[4], output_values[5],</div><div class='add'>+                output_values[6], output_values[7], output_values[8],</div><div class='add'>+                output_values[9], output_values[10], output_values[11],</div><div class='add'>+                output_values[12], output_values[13], output_values[14],</div><div class='add'>+                output_values[15]);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (output_values) {</div><div class='add'>+        for (i = 0; i &lt; number_of_fields; i++) {</div><div class='add'>+            if (output_values[i])</div><div class='add'>+                GF_FREE(output_values[i]);</div><div class='add'>+        }</div><div class='add'>+        GF_FREE(output_values);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (hyphens)</div><div class='add'>+        GF_FREE(hyphens);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+gf_gsync_status_t_comparator(const void *p, const void *q)</div><div class='add'>+{</div><div class='add'>+    char *slavekey1 = NULL;</div><div class='add'>+    char *slavekey2 = NULL;</div><div class='add'>+</div><div class='add'>+    slavekey1 = get_struct_variable(20, (*(gf_gsync_status_t **)p));</div><div class='add'>+    slavekey2 = get_struct_variable(20, (*(gf_gsync_status_t **)q));</div><div class='add'>+    if (!slavekey1 || !slavekey2) {</div><div class='add'>+        gf_log("cli", GF_LOG_ERROR, "struct member empty.");</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return strcmp(slavekey1, slavekey2);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+gf_cli_read_status_data(dict_t *dict, gf_gsync_status_t **sts_vals,</div><div class='add'>+                        int *spacing, int gsync_count, int number_of_fields)</div><div class='add'>+{</div><div class='add'>+    char *tmp = NULL;</div><div class='add'>+    char sts_val_name[PATH_MAX] = "";</div><div class='add'>+    int ret = 0;</div><div class='add'>+    int i = 0;</div><div class='add'>+    int j = 0;</div><div class='add'>+</div><div class='add'>+    /* Storing per node status info in each object */</div><div class='add'>+    for (i = 0; i &lt; gsync_count; i++) {</div><div class='add'>+        snprintf(sts_val_name, sizeof(sts_val_name), "status_value%d", i);</div><div class='add'>+</div><div class='add'>+        /* Fetching the values from dict, and calculating</div><div class='add'>+           the max length for each field */</div><div class='add'>+        ret = dict_get_bin(dict, sts_val_name, (void **)&amp;(sts_vals[i]));</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+</div><div class='add'>+        for (j = 0; j &lt; number_of_fields; j++) {</div><div class='add'>+            tmp = get_struct_variable(j, sts_vals[i]);</div><div class='add'>+            if (!tmp) {</div><div class='add'>+                gf_log("", GF_LOG_ERROR, "struct member empty.");</div><div class='add'>+                ret = -1;</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+            if (strlen(tmp) &gt; spacing[j])</div><div class='add'>+                spacing[j] = strlen(tmp);</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Sort based on Session Slave */</div><div class='add'>+    qsort(sts_vals, gsync_count, sizeof(gf_gsync_status_t *),</div><div class='add'>+          gf_gsync_status_t_comparator);</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+gf_cli_gsync_status_output(dict_t *dict, gf_boolean_t is_detail)</div><div class='add'>+{</div><div class='add'>+    int gsync_count = 0;</div><div class='add'>+    int i = 0;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    int spacing[16] = {0};</div><div class='add'>+    int num_of_fields = 16;</div><div class='add'>+    char errmsg[1024] = "";</div><div class='add'>+    char *master = NULL;</div><div class='add'>+    char *slave = NULL;</div><div class='add'>+    static char *title_values[] = {"MASTER NODE",</div><div class='add'>+                                   "MASTER VOL",</div><div class='add'>+                                   "MASTER BRICK",</div><div class='add'>+                                   "SLAVE USER",</div><div class='add'>+                                   "SLAVE",</div><div class='add'>+                                   "SLAVE NODE",</div><div class='add'>+                                   "STATUS",</div><div class='add'>+                                   "CRAWL STATUS",</div><div class='add'>+                                   "LAST_SYNCED",</div><div class='add'>+                                   "ENTRY",</div><div class='add'>+                                   "DATA",</div><div class='add'>+                                   "META",</div><div class='add'>+                                   "FAILURES",</div><div class='add'>+                                   "CHECKPOINT TIME",</div><div class='add'>+                                   "CHECKPOINT COMPLETED",</div><div class='add'>+                                   "CHECKPOINT COMPLETION TIME"};</div><div class='add'>+    gf_gsync_status_t **sts_vals = NULL;</div><div class='add'>+</div><div class='add'>+    /* Checks if any session is active or not */</div><div class='add'>+    ret = dict_get_int32_sizen(dict, "gsync-count", &amp;gsync_count);</div><div class='add'>+    if (ret) {</div><div class='add'>+        ret = dict_get_str_sizen(dict, "master", &amp;master);</div><div class='add'>+</div><div class='add'>+        ret = dict_get_str_sizen(dict, "slave", &amp;slave);</div><div class='add'>+</div><div class='add'>+        if (master) {</div><div class='add'>+            if (slave)</div><div class='add'>+                snprintf(errmsg, sizeof(errmsg),</div><div class='add'>+                         "No active geo-replication sessions between %s"</div><div class='add'>+                         " and %s",</div><div class='add'>+                         master, slave);</div><div class='add'>+            else</div><div class='add'>+                snprintf(errmsg, sizeof(errmsg),</div><div class='add'>+                         "No active geo-replication sessions for %s", master);</div><div class='add'>+        } else</div><div class='add'>+            snprintf(errmsg, sizeof(errmsg),</div><div class='add'>+                     "No active geo-replication sessions");</div><div class='add'>+</div><div class='add'>+        gf_log("cli", GF_LOG_INFO, "%s", errmsg);</div><div class='add'>+        cli_out("%s", errmsg);</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; num_of_fields; i++)</div><div class='add'>+        spacing[i] = strlen(title_values[i]);</div><div class='add'>+</div><div class='add'>+    /* gsync_count = number of nodes reporting output.</div><div class='add'>+       each sts_val object will store output of each</div><div class='add'>+       node */</div><div class='add'>+    sts_vals = GF_MALLOC(gsync_count * sizeof(gf_gsync_status_t *),</div><div class='add'>+                         gf_common_mt_char);</div><div class='add'>+    if (!sts_vals) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = gf_cli_read_status_data(dict, sts_vals, spacing, gsync_count,</div><div class='add'>+                                  num_of_fields);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log("", GF_LOG_ERROR, "Unable to read status data");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = gf_cli_print_status(title_values, sts_vals, spacing, gsync_count,</div><div class='add'>+                              num_of_fields, is_detail);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log("", GF_LOG_ERROR, "Unable to print status output");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (sts_vals)</div><div class='add'>+        GF_FREE(sts_vals);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int32_t</div><div class='add'>+write_contents_to_common_pem_file(dict_t *dict, int output_count)</div><div class='add'>+{</div><div class='add'>+    char *workdir = NULL;</div><div class='add'>+    char common_pem_file[PATH_MAX] = "";</div><div class='add'>+    char *output = NULL;</div><div class='add'>+    char output_name[32] = "";</div><div class='add'>+    int bytes_written = 0;</div><div class='add'>+    int fd = -1;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int i = -1;</div><div class='add'>+</div><div class='add'>+    ret = dict_get_str_sizen(dict, "glusterd_workdir", &amp;workdir);</div><div class='add'>+    if (ret || !workdir) {</div><div class='add'>+        gf_log("", GF_LOG_ERROR, "Unable to fetch workdir");</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    snprintf(common_pem_file, sizeof(common_pem_file),</div><div class='add'>+             "%s/geo-replication/common_secret.pem.pub", workdir);</div><div class='add'>+</div><div class='add'>+    sys_unlink(common_pem_file);</div><div class='add'>+</div><div class='add'>+    fd = open(common_pem_file, O_WRONLY | O_CREAT, 0600);</div><div class='add'>+    if (fd == -1) {</div><div class='add'>+        gf_log("", GF_LOG_ERROR, "Failed to open %s Error : %s",</div><div class='add'>+               common_pem_file, strerror(errno));</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    for (i = 1; i &lt;= output_count; i++) {</div><div class='add'>+        ret = snprintf(output_name, sizeof(output_name), "output_%d", i);</div><div class='add'>+        ret = dict_get_strn(dict, output_name, ret, &amp;output);</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_log("", GF_LOG_ERROR, "Failed to get %s.", output_name);</div><div class='add'>+            cli_out("Unable to fetch output.");</div><div class='add'>+        }</div><div class='add'>+        if (output) {</div><div class='add'>+            bytes_written = sys_write(fd, output, strlen(output));</div><div class='add'>+            if (bytes_written != strlen(output)) {</div><div class='add'>+                gf_log("", GF_LOG_ERROR, "Failed to write to %s",</div><div class='add'>+                       common_pem_file);</div><div class='add'>+                ret = -1;</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+            /* Adding the new line character */</div><div class='add'>+            bytes_written = sys_write(fd, "\n", 1);</div><div class='add'>+            if (bytes_written != 1) {</div><div class='add'>+                gf_log("", GF_LOG_ERROR, "Failed to add new line char");</div><div class='add'>+                ret = -1;</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+            output = NULL;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    cli_out("Common secret pub file present at %s", common_pem_file);</div><div class='add'>+    ret = 0;</div><div class='add'>+out:</div><div class='add'>+    if (fd &gt;= 0)</div><div class='add'>+        sys_close(fd);</div><div class='add'>+</div><div class='add'>+    gf_log("", GF_LOG_DEBUG, RETURNING, ret);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+gf_cli_sys_exec_cbk(struct rpc_req *req, struct iovec *iov, int count,</div><div class='add'>+                    void *myframe)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int output_count = -1;</div><div class='add'>+    int i = -1;</div><div class='add'>+    char *output = NULL;</div><div class='add'>+    char *command = NULL;</div><div class='add'>+    char output_name[32] = "";</div><div class='add'>+    gf_cli_rsp rsp = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    dict_t *dict = NULL;</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(myframe);</div><div class='add'>+</div><div class='add'>+    if (req-&gt;rpc_status == -1) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = xdr_to_generic(*iov, &amp;rsp, (xdrproc_t)xdr_gf_cli_rsp);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        gf_log(((call_frame_t *)myframe)-&gt;this-&gt;name, GF_LOG_ERROR,</div><div class='add'>+               XDR_DECODE_FAIL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    dict = dict_new();</div><div class='add'>+</div><div class='add'>+    if (!dict) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_unserialize(rsp.dict.dict_val, rsp.dict.dict_len, &amp;dict);</div><div class='add'>+</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    if (rsp.op_ret) {</div><div class='add'>+        cli_err("%s", rsp.op_errstr ? rsp.op_errstr : "Command failed.");</div><div class='add'>+        ret = rsp.op_ret;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_get_int32_sizen(dict, "output_count", &amp;output_count);</div><div class='add'>+    if (ret) {</div><div class='add'>+        cli_out("Command executed successfully.");</div><div class='add'>+        ret = 0;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_get_str_sizen(dict, "command", &amp;command);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log("", GF_LOG_ERROR, "Unable to get command from dict");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (!strcmp(command, "gsec_create")) {</div><div class='add'>+        ret = write_contents_to_common_pem_file(dict, output_count);</div><div class='add'>+        if (!ret)</div><div class='add'>+            goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    for (i = 1; i &lt;= output_count; i++) {</div><div class='add'>+        ret = snprintf(output_name, sizeof(output_name), "output_%d", i);</div><div class='add'>+        ret = dict_get_strn(dict, output_name, ret, &amp;output);</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_log("", GF_LOG_ERROR, "Failed to get %s.", output_name);</div><div class='add'>+            cli_out("Unable to fetch output.");</div><div class='add'>+        }</div><div class='add'>+        if (output) {</div><div class='add'>+            cli_out("%s", output);</div><div class='add'>+            output = NULL;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+out:</div><div class='add'>+    if (dict)</div><div class='add'>+        dict_unref(dict);</div><div class='add'>+    cli_cmd_broadcast_response(ret);</div><div class='add'>+    gf_free_xdr_cli_rsp(rsp);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+gf_cli_copy_file_cbk(struct rpc_req *req, struct iovec *iov, int count,</div><div class='add'>+                     void *myframe)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    gf_cli_rsp rsp = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    dict_t *dict = NULL;</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(myframe);</div><div class='add'>+</div><div class='add'>+    if (req-&gt;rpc_status == -1) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = xdr_to_generic(*iov, &amp;rsp, (xdrproc_t)xdr_gf_cli_rsp);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        gf_log(((call_frame_t *)myframe)-&gt;this-&gt;name, GF_LOG_ERROR,</div><div class='add'>+               XDR_DECODE_FAIL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    dict = dict_new();</div><div class='add'>+</div><div class='add'>+    if (!dict) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_unserialize(rsp.dict.dict_val, rsp.dict.dict_len, &amp;dict);</div><div class='add'>+</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    if (rsp.op_ret) {</div><div class='add'>+        cli_err("%s", rsp.op_errstr ? rsp.op_errstr : "Copy unsuccessful");</div><div class='add'>+        ret = rsp.op_ret;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    cli_out("Successfully copied file.");</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (dict)</div><div class='add'>+        dict_unref(dict);</div><div class='add'>+    cli_cmd_broadcast_response(ret);</div><div class='add'>+    gf_free_xdr_cli_rsp(rsp);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+gf_cli_gsync_set_cbk(struct rpc_req *req, struct iovec *iov, int count,</div><div class='add'>+                     void *myframe)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    gf_cli_rsp rsp = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    dict_t *dict = NULL;</div><div class='add'>+    char *gsync_status = NULL;</div><div class='add'>+    char *master = NULL;</div><div class='add'>+    char *slave = NULL;</div><div class='add'>+    int32_t type = 0;</div><div class='add'>+    gf_boolean_t status_detail = _gf_false;</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(myframe);</div><div class='add'>+</div><div class='add'>+    if (req-&gt;rpc_status == -1) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = xdr_to_generic(*iov, &amp;rsp, (xdrproc_t)xdr_gf_cli_rsp);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        gf_log(((call_frame_t *)myframe)-&gt;this-&gt;name, GF_LOG_ERROR,</div><div class='add'>+               XDR_DECODE_FAIL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    dict = dict_new();</div><div class='add'>+</div><div class='add'>+    if (!dict) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_unserialize(rsp.dict.dict_val, rsp.dict.dict_len, &amp;dict);</div><div class='add'>+</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    if (global_state-&gt;mode &amp; GLUSTER_MODE_XML) {</div><div class='add'>+        ret = cli_xml_output_vol_gsync(dict, rsp.op_ret, rsp.op_errno,</div><div class='add'>+                                       rsp.op_errstr);</div><div class='add'>+        if (ret)</div><div class='add'>+            gf_log("cli", GF_LOG_ERROR, XML_ERROR);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (rsp.op_ret) {</div><div class='add'>+        cli_err("%s",</div><div class='add'>+                rsp.op_errstr ? rsp.op_errstr : GEOREP " command unsuccessful");</div><div class='add'>+        ret = rsp.op_ret;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_get_str_sizen(dict, "gsync-status", &amp;gsync_status);</div><div class='add'>+    if (!ret)</div><div class='add'>+        cli_out("%s", gsync_status);</div><div class='add'>+</div><div class='add'>+    ret = dict_get_int32_sizen(dict, "type", &amp;type);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log(((call_frame_t *)myframe)-&gt;this-&gt;name, GF_LOG_ERROR,</div><div class='add'>+               "failed to get type");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    switch (type) {</div><div class='add'>+        case GF_GSYNC_OPTION_TYPE_START:</div><div class='add'>+        case GF_GSYNC_OPTION_TYPE_STOP:</div><div class='add'>+            if (dict_get_str_sizen(dict, "master", &amp;master) != 0)</div><div class='add'>+                master = "???";</div><div class='add'>+            if (dict_get_str_sizen(dict, "slave", &amp;slave) != 0)</div><div class='add'>+                slave = "???";</div><div class='add'>+</div><div class='add'>+            cli_out(</div><div class='add'>+                "%s " GEOREP " session between %s &amp; %s has been successful",</div><div class='add'>+                type == GF_GSYNC_OPTION_TYPE_START ? "Starting" : "Stopping",</div><div class='add'>+                master, slave);</div><div class='add'>+            break;</div><div class='add'>+</div><div class='add'>+        case GF_GSYNC_OPTION_TYPE_PAUSE:</div><div class='add'>+        case GF_GSYNC_OPTION_TYPE_RESUME:</div><div class='add'>+            if (dict_get_str_sizen(dict, "master", &amp;master) != 0)</div><div class='add'>+                master = "???";</div><div class='add'>+            if (dict_get_str_sizen(dict, "slave", &amp;slave) != 0)</div><div class='add'>+                slave = "???";</div><div class='add'>+</div><div class='add'>+            cli_out("%s " GEOREP " session between %s &amp; %s has been successful",</div><div class='add'>+                    type == GF_GSYNC_OPTION_TYPE_PAUSE ? "Pausing" : "Resuming",</div><div class='add'>+                    master, slave);</div><div class='add'>+            break;</div><div class='add'>+</div><div class='add'>+        case GF_GSYNC_OPTION_TYPE_CONFIG:</div><div class='add'>+            ret = gf_cli_gsync_config_command(dict);</div><div class='add'>+            break;</div><div class='add'>+</div><div class='add'>+        case GF_GSYNC_OPTION_TYPE_STATUS:</div><div class='add'>+            status_detail = dict_get_str_boolean(dict, "status-detail",</div><div class='add'>+                                                 _gf_false);</div><div class='add'>+            ret = gf_cli_gsync_status_output(dict, status_detail);</div><div class='add'>+            break;</div><div class='add'>+</div><div class='add'>+        case GF_GSYNC_OPTION_TYPE_DELETE:</div><div class='add'>+            if (dict_get_str_sizen(dict, "master", &amp;master) != 0)</div><div class='add'>+                master = "???";</div><div class='add'>+            if (dict_get_str_sizen(dict, "slave", &amp;slave) != 0)</div><div class='add'>+                slave = "???";</div><div class='add'>+            cli_out("Deleting " GEOREP</div><div class='add'>+                    " session between %s &amp; %s has been successful",</div><div class='add'>+                    master, slave);</div><div class='add'>+            break;</div><div class='add'>+</div><div class='add'>+        case GF_GSYNC_OPTION_TYPE_CREATE:</div><div class='add'>+            if (dict_get_str_sizen(dict, "master", &amp;master) != 0)</div><div class='add'>+                master = "???";</div><div class='add'>+            if (dict_get_str_sizen(dict, "slave", &amp;slave) != 0)</div><div class='add'>+                slave = "???";</div><div class='add'>+            cli_out("Creating " GEOREP</div><div class='add'>+                    " session between %s &amp; %s has been successful",</div><div class='add'>+                    master, slave);</div><div class='add'>+            break;</div><div class='add'>+</div><div class='add'>+        default:</div><div class='add'>+            cli_out(GEOREP " command executed successfully");</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (dict)</div><div class='add'>+        dict_unref(dict);</div><div class='add'>+    cli_cmd_broadcast_response(ret);</div><div class='add'>+    gf_free_xdr_cli_rsp(rsp);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int32_t</div><div class='add'>+gf_cli_sys_exec(call_frame_t *frame, xlator_t *this, void *data)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+    dict_t *dict = NULL;</div><div class='add'>+    gf_cli_req req = {{</div><div class='add'>+        0,</div><div class='add'>+    }};</div><div class='add'>+</div><div class='add'>+    dict = data;</div><div class='add'>+</div><div class='add'>+    ret = cli_to_glusterd(&amp;req, frame, gf_cli_sys_exec_cbk,</div><div class='add'>+                          (xdrproc_t)xdr_gf_cli_req, dict, GLUSTER_CLI_SYS_EXEC,</div><div class='add'>+                          this, cli_rpc_prog, NULL);</div><div class='add'>+    if (ret)</div><div class='add'>+        if (!frame || !this || !data) {</div><div class='add'>+            ret = -1;</div><div class='add'>+            gf_log("cli", GF_LOG_ERROR, "Invalid data");</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+    GF_FREE(req.dict.dict_val);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int32_t</div><div class='add'>+gf_cli_copy_file(call_frame_t *frame, xlator_t *this, void *data)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+    dict_t *dict = NULL;</div><div class='add'>+    gf_cli_req req = {{</div><div class='add'>+        0,</div><div class='add'>+    }};</div><div class='add'>+</div><div class='add'>+    dict = data;</div><div class='add'>+</div><div class='add'>+    ret = cli_to_glusterd(&amp;req, frame, gf_cli_copy_file_cbk,</div><div class='add'>+                          (xdrproc_t)xdr_gf_cli_req, dict,</div><div class='add'>+                          GLUSTER_CLI_COPY_FILE, this, cli_rpc_prog, NULL);</div><div class='add'>+    if (ret)</div><div class='add'>+        if (!frame || !this || !data) {</div><div class='add'>+            ret = -1;</div><div class='add'>+            gf_log("cli", GF_LOG_ERROR, "Invalid data");</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+    GF_FREE(req.dict.dict_val);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int32_t</div><div class='add'>+gf_cli_gsync_set(call_frame_t *frame, xlator_t *this, void *data)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+    dict_t *dict = NULL;</div><div class='add'>+    gf_cli_req req = {{</div><div class='add'>+        0,</div><div class='add'>+    }};</div><div class='add'>+</div><div class='add'>+    dict = data;</div><div class='add'>+</div><div class='add'>+    ret = cli_to_glusterd(&amp;req, frame, gf_cli_gsync_set_cbk,</div><div class='add'>+                          (xdrproc_t)xdr_gf_cli_req, dict,</div><div class='add'>+                          GLUSTER_CLI_GSYNC_SET, this, cli_rpc_prog, NULL);</div><div class='add'>+    GF_FREE(req.dict.dict_val);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+cli_profile_info_percentage_cmp(void *a, void *b)</div><div class='add'>+{</div><div class='add'>+    cli_profile_info_t *ia = NULL;</div><div class='add'>+    cli_profile_info_t *ib = NULL;</div><div class='add'>+</div><div class='add'>+    ia = a;</div><div class='add'>+    ib = b;</div><div class='add'>+    if (ia-&gt;percentage_avg_latency &lt; ib-&gt;percentage_avg_latency)</div><div class='add'>+        return -1;</div><div class='add'>+    else if (ia-&gt;percentage_avg_latency &gt; ib-&gt;percentage_avg_latency)</div><div class='add'>+        return 1;</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+cmd_profile_volume_brick_out(dict_t *dict, int count, int interval)</div><div class='add'>+{</div><div class='add'>+    char key[256] = {0};</div><div class='add'>+    int i = 0;</div><div class='add'>+    uint64_t sec = 0;</div><div class='add'>+    uint64_t r_count = 0;</div><div class='add'>+    uint64_t w_count = 0;</div><div class='add'>+    uint64_t rb_counts[32] = {0};</div><div class='add'>+    uint64_t wb_counts[32] = {0};</div><div class='add'>+    cli_profile_info_t profile_info[GF_FOP_MAXVALUE] = {{0}};</div><div class='add'>+    cli_profile_info_t upcall_info[GF_UPCALL_FLAGS_MAXVALUE] = {</div><div class='add'>+        {0},</div><div class='add'>+    };</div><div class='add'>+    char output[128] = {0};</div><div class='add'>+    int per_line = 0;</div><div class='add'>+    char read_blocks[128] = {0};</div><div class='add'>+    char write_blocks[128] = {0};</div><div class='add'>+    int index = 0;</div><div class='add'>+    int is_header_printed = 0;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    double total_percentage_latency = 0;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; 32; i++) {</div><div class='add'>+        snprintf(key, sizeof(key), "%d-%d-read-%" PRIu32, count, interval,</div><div class='add'>+                 (1U &lt;&lt; i));</div><div class='add'>+        ret = dict_get_uint64(dict, key, &amp;rb_counts[i]);</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_log("cli", GF_LOG_DEBUG, "failed to get %s from dict", key);</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; 32; i++) {</div><div class='add'>+        snprintf(key, sizeof(key), "%d-%d-write-%" PRIu32, count, interval,</div><div class='add'>+                 (1U &lt;&lt; i));</div><div class='add'>+        ret = dict_get_uint64(dict, key, &amp;wb_counts[i]);</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_log("cli", GF_LOG_DEBUG, "failed to get %s from dict", key);</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; GF_UPCALL_FLAGS_MAXVALUE; i++) {</div><div class='add'>+        snprintf(key, sizeof(key), "%d-%d-%d-upcall-hits", count, interval, i);</div><div class='add'>+        ret = dict_get_uint64(dict, key, &amp;upcall_info[i].fop_hits);</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_log("cli", GF_LOG_DEBUG, "failed to get %s from dict", key);</div><div class='add'>+        }</div><div class='add'>+        upcall_info[i].fop_name = (char *)gf_upcall_list[i];</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; GF_FOP_MAXVALUE; i++) {</div><div class='add'>+        snprintf(key, sizeof(key), "%d-%d-%d-hits", count, interval, i);</div><div class='add'>+        ret = dict_get_uint64(dict, key, &amp;profile_info[i].fop_hits);</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_log("cli", GF_LOG_DEBUG, "failed to get %s from dict", key);</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        snprintf(key, sizeof(key), "%d-%d-%d-avglatency", count, interval, i);</div><div class='add'>+        ret = dict_get_double(dict, key, &amp;profile_info[i].avg_latency);</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_log("cli", GF_LOG_DEBUG, "failed to get %s from dict", key);</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        snprintf(key, sizeof(key), "%d-%d-%d-minlatency", count, interval, i);</div><div class='add'>+        ret = dict_get_double(dict, key, &amp;profile_info[i].min_latency);</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_log("cli", GF_LOG_DEBUG, "failed to get %s from dict", key);</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        snprintf(key, sizeof(key), "%d-%d-%d-maxlatency", count, interval, i);</div><div class='add'>+        ret = dict_get_double(dict, key, &amp;profile_info[i].max_latency);</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_log("cli", GF_LOG_DEBUG, "failed to get %s from dict", key);</div><div class='add'>+        }</div><div class='add'>+        profile_info[i].fop_name = (char *)gf_fop_list[i];</div><div class='add'>+</div><div class='add'>+        total_percentage_latency += (profile_info[i].fop_hits *</div><div class='add'>+                                     profile_info[i].avg_latency);</div><div class='add'>+    }</div><div class='add'>+    if (total_percentage_latency) {</div><div class='add'>+        for (i = 0; i &lt; GF_FOP_MAXVALUE; i++) {</div><div class='add'>+            profile_info[i]</div><div class='add'>+                .percentage_avg_latency = 100 * ((profile_info[i].avg_latency *</div><div class='add'>+                                                  profile_info[i].fop_hits) /</div><div class='add'>+                                                 total_percentage_latency);</div><div class='add'>+        }</div><div class='add'>+        gf_array_insertionsort(profile_info, 1, GF_FOP_MAXVALUE - 1,</div><div class='add'>+                               sizeof(cli_profile_info_t),</div><div class='add'>+                               cli_profile_info_percentage_cmp);</div><div class='add'>+    }</div><div class='add'>+    snprintf(key, sizeof(key), "%d-%d-duration", count, interval);</div><div class='add'>+    ret = dict_get_uint64(dict, key, &amp;sec);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log("cli", GF_LOG_DEBUG, "failed to get %s from dict", key);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    snprintf(key, sizeof(key), "%d-%d-total-read", count, interval);</div><div class='add'>+    ret = dict_get_uint64(dict, key, &amp;r_count);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log("cli", GF_LOG_DEBUG, "failed to get %s from dict", key);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    snprintf(key, sizeof(key), "%d-%d-total-write", count, interval);</div><div class='add'>+    ret = dict_get_uint64(dict, key, &amp;w_count);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log("cli", GF_LOG_DEBUG, "failed to get %s from dict", key);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (interval == -1)</div><div class='add'>+        cli_out("Cumulative Stats:");</div><div class='add'>+    else</div><div class='add'>+        cli_out("Interval %d Stats:", interval);</div><div class='add'>+    snprintf(output, sizeof(output), "%14s", "Block Size:");</div><div class='add'>+    snprintf(read_blocks, sizeof(read_blocks), "%14s", "No. of Reads:");</div><div class='add'>+    snprintf(write_blocks, sizeof(write_blocks), "%14s", "No. of Writes:");</div><div class='add'>+    index = 14;</div><div class='add'>+    for (i = 0; i &lt; 32; i++) {</div><div class='add'>+        if ((rb_counts[i] == 0) &amp;&amp; (wb_counts[i] == 0))</div><div class='add'>+            continue;</div><div class='add'>+        per_line++;</div><div class='add'>+        snprintf(output + index, sizeof(output) - index, "%19" PRIu32 "b+ ",</div><div class='add'>+                 (1U &lt;&lt; i));</div><div class='add'>+        if (rb_counts[i]) {</div><div class='add'>+            snprintf(read_blocks + index, sizeof(read_blocks) - index,</div><div class='add'>+                     "%21" PRId64 " ", rb_counts[i]);</div><div class='add'>+        } else {</div><div class='add'>+            snprintf(read_blocks + index, sizeof(read_blocks) - index, "%21s ",</div><div class='add'>+                     "0");</div><div class='add'>+        }</div><div class='add'>+        if (wb_counts[i]) {</div><div class='add'>+            snprintf(write_blocks + index, sizeof(write_blocks) - index,</div><div class='add'>+                     "%21" PRId64 " ", wb_counts[i]);</div><div class='add'>+        } else {</div><div class='add'>+            snprintf(write_blocks + index, sizeof(write_blocks) - index,</div><div class='add'>+                     "%21s ", "0");</div><div class='add'>+        }</div><div class='add'>+        index += 22;</div><div class='add'>+        if (per_line == 3) {</div><div class='add'>+            cli_out("%s", output);</div><div class='add'>+            cli_out("%s", read_blocks);</div><div class='add'>+            cli_out("%s", write_blocks);</div><div class='add'>+            cli_out(" ");</div><div class='add'>+            per_line = 0;</div><div class='add'>+            snprintf(output, sizeof(output), "%14s", "Block Size:");</div><div class='add'>+            snprintf(read_blocks, sizeof(read_blocks), "%14s", "No. of Reads:");</div><div class='add'>+            snprintf(write_blocks, sizeof(write_blocks), "%14s",</div><div class='add'>+                     "No. of Writes:");</div><div class='add'>+            index = 14;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (per_line != 0) {</div><div class='add'>+        cli_out("%s", output);</div><div class='add'>+        cli_out("%s", read_blocks);</div><div class='add'>+        cli_out("%s", write_blocks);</div><div class='add'>+    }</div><div class='add'>+    for (i = 0; i &lt; GF_FOP_MAXVALUE; i++) {</div><div class='add'>+        if (profile_info[i].fop_hits == 0)</div><div class='add'>+            continue;</div><div class='add'>+        if (is_header_printed == 0) {</div><div class='add'>+            cli_out("%10s %13s %13s %13s %14s %11s", "%-latency", "Avg-latency",</div><div class='add'>+                    "Min-Latency", "Max-Latency", "No. of calls", "Fop");</div><div class='add'>+            cli_out("%10s %13s %13s %13s %14s %11s", "---------", "-----------",</div><div class='add'>+                    "-----------", "-----------", "------------", "----");</div><div class='add'>+            is_header_printed = 1;</div><div class='add'>+        }</div><div class='add'>+        if (profile_info[i].fop_hits) {</div><div class='add'>+            cli_out(</div><div class='add'>+                "%10.2lf %10.2lf us %10.2lf us %10.2lf us"</div><div class='add'>+                " %14" PRId64 " %11s",</div><div class='add'>+                profile_info[i].percentage_avg_latency,</div><div class='add'>+                profile_info[i].avg_latency, profile_info[i].min_latency,</div><div class='add'>+                profile_info[i].max_latency, profile_info[i].fop_hits,</div><div class='add'>+                profile_info[i].fop_name);</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; GF_UPCALL_FLAGS_MAXVALUE; i++) {</div><div class='add'>+        if (upcall_info[i].fop_hits == 0)</div><div class='add'>+            continue;</div><div class='add'>+        if (upcall_info[i].fop_hits) {</div><div class='add'>+            cli_out(</div><div class='add'>+                "%10.2lf %10.2lf us %10.2lf us %10.2lf us"</div><div class='add'>+                " %14" PRId64 " %11s",</div><div class='add'>+                upcall_info[i].percentage_avg_latency,</div><div class='add'>+                upcall_info[i].avg_latency, upcall_info[i].min_latency,</div><div class='add'>+                upcall_info[i].max_latency, upcall_info[i].fop_hits,</div><div class='add'>+                upcall_info[i].fop_name);</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    cli_out(" ");</div><div class='add'>+    cli_out("%12s: %" PRId64 " seconds", "Duration", sec);</div><div class='add'>+    cli_out("%12s: %" PRId64 " bytes", "Data Read", r_count);</div><div class='add'>+    cli_out("%12s: %" PRId64 " bytes", "Data Written", w_count);</div><div class='add'>+    cli_out(" ");</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int32_t</div><div class='add'>+gf_cli_profile_volume_cbk(struct rpc_req *req, struct iovec *iov, int count,</div><div class='add'>+                          void *myframe)</div><div class='add'>+{</div><div class='add'>+    gf_cli_rsp rsp = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int ret = -1;</div><div class='add'>+    dict_t *dict = NULL;</div><div class='add'>+    gf1_cli_stats_op op = GF_CLI_STATS_NONE;</div><div class='add'>+    char key[64] = {0};</div><div class='add'>+    int len;</div><div class='add'>+    int interval = 0;</div><div class='add'>+    int i = 1;</div><div class='add'>+    int32_t brick_count = 0;</div><div class='add'>+    char *volname = NULL;</div><div class='add'>+    char *brick = NULL;</div><div class='add'>+    char str[1024] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int stats_cleared = 0;</div><div class='add'>+    gf1_cli_info_op info_op = GF_CLI_INFO_NONE;</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(myframe);</div><div class='add'>+</div><div class='add'>+    if (-1 == req-&gt;rpc_status) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    gf_log("cli", GF_LOG_DEBUG, "Received resp to profile");</div><div class='add'>+    ret = xdr_to_generic(*iov, &amp;rsp, (xdrproc_t)xdr_gf_cli_rsp);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        gf_log(((call_frame_t *)myframe)-&gt;this-&gt;name, GF_LOG_ERROR,</div><div class='add'>+               XDR_DECODE_FAIL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    dict = dict_new();</div><div class='add'>+</div><div class='add'>+    if (!dict) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_unserialize(rsp.dict.dict_val, rsp.dict.dict_len, &amp;dict);</div><div class='add'>+</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log("", GF_LOG_ERROR, DICT_UNSERIALIZE_FAIL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (global_state-&gt;mode &amp; GLUSTER_MODE_XML) {</div><div class='add'>+        ret = cli_xml_output_vol_profile(dict, rsp.op_ret, rsp.op_errno,</div><div class='add'>+                                         rsp.op_errstr);</div><div class='add'>+        if (ret)</div><div class='add'>+            gf_log("cli", GF_LOG_ERROR, XML_ERROR);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_get_int32_sizen(dict, "op", (int32_t *)&amp;op);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    ret = dict_get_str_sizen(dict, "volname", &amp;volname);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    if (rsp.op_ret &amp;&amp; strcmp(rsp.op_errstr, "")) {</div><div class='add'>+        cli_err("%s", rsp.op_errstr);</div><div class='add'>+    } else {</div><div class='add'>+        switch (op) {</div><div class='add'>+            case GF_CLI_STATS_START:</div><div class='add'>+                cli_out("Starting volume profile on %s has been %s ", volname,</div><div class='add'>+                        (rsp.op_ret) ? "unsuccessful" : "successful");</div><div class='add'>+                break;</div><div class='add'>+            case GF_CLI_STATS_STOP:</div><div class='add'>+                cli_out("Stopping volume profile on %s has been %s ", volname,</div><div class='add'>+                        (rsp.op_ret) ? "unsuccessful" : "successful");</div><div class='add'>+                break;</div><div class='add'>+            case GF_CLI_STATS_INFO:</div><div class='add'>+                break;</div><div class='add'>+            default:</div><div class='add'>+                cli_out("volume profile on %s has been %s ", volname,</div><div class='add'>+                        (rsp.op_ret) ? "unsuccessful" : "successful");</div><div class='add'>+                break;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (rsp.op_ret) {</div><div class='add'>+        ret = rsp.op_ret;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (GF_CLI_STATS_INFO != op) {</div><div class='add'>+        ret = 0;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_get_int32_sizen(dict, "count", &amp;brick_count);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    if (!brick_count) {</div><div class='add'>+        cli_err("All bricks of volume %s are down.", volname);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_get_int32_sizen(dict, "info-op", (int32_t *)&amp;info_op);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    while (i &lt;= brick_count) {</div><div class='add'>+        len = snprintf(key, sizeof(key), "%d-brick", i);</div><div class='add'>+        ret = dict_get_strn(dict, key, len, &amp;brick);</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_log("cli", GF_LOG_ERROR, "Couldn't get brick name");</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        ret = dict_get_str_boolean(dict, "nfs", _gf_false);</div><div class='add'>+</div><div class='add'>+        if (ret)</div><div class='add'>+            len = snprintf(str, sizeof(str), "NFS Server : %s", brick);</div><div class='add'>+        else</div><div class='add'>+            len = snprintf(str, sizeof(str), "Brick: %s", brick);</div><div class='add'>+        cli_out("%s", str);</div><div class='add'>+        memset(str, '-', len);</div><div class='add'>+        cli_out("%s", str);</div><div class='add'>+</div><div class='add'>+        if (GF_CLI_INFO_CLEAR == info_op) {</div><div class='add'>+            len = snprintf(key, sizeof(key), "%d-stats-cleared", i);</div><div class='add'>+            ret = dict_get_int32n(dict, key, len, &amp;stats_cleared);</div><div class='add'>+            if (ret)</div><div class='add'>+                goto out;</div><div class='add'>+            cli_out(stats_cleared ? "Cleared stats."</div><div class='add'>+                                  : "Failed to clear stats.");</div><div class='add'>+        } else {</div><div class='add'>+            len = snprintf(key, sizeof(key), "%d-cumulative", i);</div><div class='add'>+            ret = dict_get_int32n(dict, key, len, &amp;interval);</div><div class='add'>+            if (ret == 0)</div><div class='add'>+                cmd_profile_volume_brick_out(dict, i, interval);</div><div class='add'>+</div><div class='add'>+            len = snprintf(key, sizeof(key), "%d-interval", i);</div><div class='add'>+            ret = dict_get_int32n(dict, key, len, &amp;interval);</div><div class='add'>+            if (ret == 0)</div><div class='add'>+                cmd_profile_volume_brick_out(dict, i, interval);</div><div class='add'>+        }</div><div class='add'>+        i++;</div><div class='add'>+    }</div><div class='add'>+    ret = rsp.op_ret;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (dict)</div><div class='add'>+        dict_unref(dict);</div><div class='add'>+    cli_cmd_broadcast_response(ret);</div><div class='add'>+    gf_free_xdr_cli_rsp(rsp);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int32_t</div><div class='add'>+gf_cli_profile_volume(call_frame_t *frame, xlator_t *this, void *data)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    gf_cli_req req = {{</div><div class='add'>+        0,</div><div class='add'>+    }};</div><div class='add'>+    dict_t *dict = NULL;</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(frame);</div><div class='add'>+    GF_ASSERT(this);</div><div class='add'>+    GF_ASSERT(data);</div><div class='add'>+</div><div class='add'>+    dict = data;</div><div class='add'>+</div><div class='add'>+    ret = cli_to_glusterd(&amp;req, frame, gf_cli_profile_volume_cbk,</div><div class='add'>+                          (xdrproc_t)xdr_gf_cli_req, dict,</div><div class='add'>+                          GLUSTER_CLI_PROFILE_VOLUME, this, cli_rpc_prog, NULL);</div><div class='add'>+    gf_log("cli", GF_LOG_DEBUG, RETURNING, ret);</div><div class='add'>+</div><div class='add'>+    GF_FREE(req.dict.dict_val);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int32_t</div><div class='add'>+gf_cli_top_volume_cbk(struct rpc_req *req, struct iovec *iov, int count,</div><div class='add'>+                      void *myframe)</div><div class='add'>+{</div><div class='add'>+    gf_cli_rsp rsp = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int ret = -1;</div><div class='add'>+    dict_t *dict = NULL;</div><div class='add'>+    gf1_cli_stats_op op = GF_CLI_STATS_NONE;</div><div class='add'>+    char key[256] = {0};</div><div class='add'>+    int keylen;</div><div class='add'>+    int i = 0;</div><div class='add'>+    int32_t brick_count = 0;</div><div class='add'>+    char brick[1024];</div><div class='add'>+    int32_t members = 0;</div><div class='add'>+    char *filename;</div><div class='add'>+    char *bricks;</div><div class='add'>+    uint64_t value = 0;</div><div class='add'>+    int32_t j = 0;</div><div class='add'>+    gf1_cli_top_op top_op = GF_CLI_TOP_NONE;</div><div class='add'>+    uint64_t nr_open = 0;</div><div class='add'>+    uint64_t max_nr_open = 0;</div><div class='add'>+    double throughput = 0;</div><div class='add'>+    double time = 0;</div><div class='add'>+    int32_t time_sec = 0;</div><div class='add'>+    long int time_usec = 0;</div><div class='add'>+    char timestr[GF_TIMESTR_SIZE] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    char *openfd_str = NULL;</div><div class='add'>+    gf_boolean_t nfs = _gf_false;</div><div class='add'>+    gf_boolean_t clear_stats = _gf_false;</div><div class='add'>+    int stats_cleared = 0;</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(myframe);</div><div class='add'>+</div><div class='add'>+    if (-1 == req-&gt;rpc_status) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    gf_log("cli", GF_LOG_DEBUG, "Received resp to top");</div><div class='add'>+    ret = xdr_to_generic(*iov, &amp;rsp, (xdrproc_t)xdr_gf_cli_rsp);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        gf_log(((call_frame_t *)myframe)-&gt;this-&gt;name, GF_LOG_ERROR,</div><div class='add'>+               XDR_DECODE_FAIL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (rsp.op_ret) {</div><div class='add'>+        if (strcmp(rsp.op_errstr, ""))</div><div class='add'>+            cli_err("%s", rsp.op_errstr);</div><div class='add'>+        cli_err("volume top unsuccessful");</div><div class='add'>+        ret = rsp.op_ret;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    dict = dict_new();</div><div class='add'>+</div><div class='add'>+    if (!dict) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_unserialize(rsp.dict.dict_val, rsp.dict.dict_len, &amp;dict);</div><div class='add'>+</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log("", GF_LOG_ERROR, DICT_UNSERIALIZE_FAIL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_get_int32_sizen(dict, "op", (int32_t *)&amp;op);</div><div class='add'>+</div><div class='add'>+    if (op != GF_CLI_STATS_TOP) {</div><div class='add'>+        ret = 0;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (global_state-&gt;mode &amp; GLUSTER_MODE_XML) {</div><div class='add'>+        ret = cli_xml_output_vol_top(dict, rsp.op_ret, rsp.op_errno,</div><div class='add'>+                                     rsp.op_errstr);</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_log("cli", GF_LOG_ERROR, XML_ERROR);</div><div class='add'>+        }</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_get_int32_sizen(dict, "count", &amp;brick_count);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+    keylen = snprintf(key, sizeof(key), "%d-top-op", 1);</div><div class='add'>+    ret = dict_get_int32n(dict, key, keylen, (int32_t *)&amp;top_op);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    clear_stats = dict_get_str_boolean(dict, "clear-stats", _gf_false);</div><div class='add'>+</div><div class='add'>+    while (i &lt; brick_count) {</div><div class='add'>+        i++;</div><div class='add'>+        keylen = snprintf(brick, sizeof(brick), "%d-brick", i);</div><div class='add'>+        ret = dict_get_strn(dict, brick, keylen, &amp;bricks);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+</div><div class='add'>+        nfs = dict_get_str_boolean(dict, "nfs", _gf_false);</div><div class='add'>+</div><div class='add'>+        if (clear_stats) {</div><div class='add'>+            keylen = snprintf(key, sizeof(key), "%d-stats-cleared", i);</div><div class='add'>+            ret = dict_get_int32n(dict, key, keylen, &amp;stats_cleared);</div><div class='add'>+            if (ret)</div><div class='add'>+                goto out;</div><div class='add'>+            cli_out(stats_cleared ? "Cleared stats for %s %s"</div><div class='add'>+                                  : "Failed to clear stats for %s %s",</div><div class='add'>+                    nfs ? "NFS server on" : "brick", bricks);</div><div class='add'>+            continue;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        if (nfs)</div><div class='add'>+            cli_out("NFS Server : %s", bricks);</div><div class='add'>+        else</div><div class='add'>+            cli_out("Brick: %s", bricks);</div><div class='add'>+</div><div class='add'>+        keylen = snprintf(key, sizeof(key), "%d-members", i);</div><div class='add'>+        ret = dict_get_int32n(dict, key, keylen, &amp;members);</div><div class='add'>+</div><div class='add'>+        switch (top_op) {</div><div class='add'>+            case GF_CLI_TOP_OPEN:</div><div class='add'>+                snprintf(key, sizeof(key), "%d-current-open", i);</div><div class='add'>+                ret = dict_get_uint64(dict, key, &amp;nr_open);</div><div class='add'>+                if (ret)</div><div class='add'>+                    break;</div><div class='add'>+                snprintf(key, sizeof(key), "%d-max-open", i);</div><div class='add'>+                ret = dict_get_uint64(dict, key, &amp;max_nr_open);</div><div class='add'>+                if (ret)</div><div class='add'>+                    goto out;</div><div class='add'>+                keylen = snprintf(key, sizeof(key), "%d-max-openfd-time", i);</div><div class='add'>+                ret = dict_get_strn(dict, key, keylen, &amp;openfd_str);</div><div class='add'>+                if (ret)</div><div class='add'>+                    goto out;</div><div class='add'>+                cli_out("Current open fds: %" PRIu64 ", Max open fds: %" PRIu64</div><div class='add'>+                        ", Max openfd time: %s",</div><div class='add'>+                        nr_open, max_nr_open, openfd_str);</div><div class='add'>+            case GF_CLI_TOP_READ:</div><div class='add'>+            case GF_CLI_TOP_WRITE:</div><div class='add'>+            case GF_CLI_TOP_OPENDIR:</div><div class='add'>+            case GF_CLI_TOP_READDIR:</div><div class='add'>+                if (!members) {</div><div class='add'>+                    continue;</div><div class='add'>+                }</div><div class='add'>+                cli_out("Count\t\tfilename\n=======================");</div><div class='add'>+                break;</div><div class='add'>+            case GF_CLI_TOP_READ_PERF:</div><div class='add'>+            case GF_CLI_TOP_WRITE_PERF:</div><div class='add'>+                snprintf(key, sizeof(key), "%d-throughput", i);</div><div class='add'>+                ret = dict_get_double(dict, key, &amp;throughput);</div><div class='add'>+                if (!ret) {</div><div class='add'>+                    snprintf(key, sizeof(key), "%d-time", i);</div><div class='add'>+                    ret = dict_get_double(dict, key, &amp;time);</div><div class='add'>+                }</div><div class='add'>+                if (!ret)</div><div class='add'>+                    cli_out("Throughput %.2f MBps time %.4f secs", throughput,</div><div class='add'>+                            time / 1e6);</div><div class='add'>+</div><div class='add'>+                if (!members) {</div><div class='add'>+                    continue;</div><div class='add'>+                }</div><div class='add'>+                cli_out("%*s %-*s %-*s", VOL_TOP_PERF_SPEED_WIDTH, "MBps",</div><div class='add'>+                        VOL_TOP_PERF_FILENAME_DEF_WIDTH, "Filename",</div><div class='add'>+                        VOL_TOP_PERF_TIME_WIDTH, "Time");</div><div class='add'>+                cli_out("%*s %-*s %-*s", VOL_TOP_PERF_SPEED_WIDTH,</div><div class='add'>+                        "====", VOL_TOP_PERF_FILENAME_DEF_WIDTH,</div><div class='add'>+                        "========", VOL_TOP_PERF_TIME_WIDTH, "====");</div><div class='add'>+                break;</div><div class='add'>+            default:</div><div class='add'>+                goto out;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        for (j = 1; j &lt;= members; j++) {</div><div class='add'>+            keylen = snprintf(key, sizeof(key), "%d-filename-%d", i, j);</div><div class='add'>+            ret = dict_get_strn(dict, key, keylen, &amp;filename);</div><div class='add'>+            if (ret)</div><div class='add'>+                break;</div><div class='add'>+            snprintf(key, sizeof(key), "%d-value-%d", i, j);</div><div class='add'>+            ret = dict_get_uint64(dict, key, &amp;value);</div><div class='add'>+            if (ret)</div><div class='add'>+                goto out;</div><div class='add'>+            if (top_op == GF_CLI_TOP_READ_PERF ||</div><div class='add'>+                top_op == GF_CLI_TOP_WRITE_PERF) {</div><div class='add'>+                keylen = snprintf(key, sizeof(key), "%d-time-sec-%d", i, j);</div><div class='add'>+                ret = dict_get_int32n(dict, key, keylen, (int32_t *)&amp;time_sec);</div><div class='add'>+                if (ret)</div><div class='add'>+                    goto out;</div><div class='add'>+                keylen = snprintf(key, sizeof(key), "%d-time-usec-%d", i, j);</div><div class='add'>+                ret = dict_get_int32n(dict, key, keylen, (int32_t *)&amp;time_usec);</div><div class='add'>+                if (ret)</div><div class='add'>+                    goto out;</div><div class='add'>+                gf_time_fmt(timestr, sizeof timestr, time_sec, gf_timefmt_FT);</div><div class='add'>+                snprintf(timestr + strlen(timestr),</div><div class='add'>+                         sizeof timestr - strlen(timestr), ".%ld", time_usec);</div><div class='add'>+                if (strlen(filename) &lt; VOL_TOP_PERF_FILENAME_DEF_WIDTH)</div><div class='add'>+                    cli_out("%*" PRIu64 " %-*s %-*s", VOL_TOP_PERF_SPEED_WIDTH,</div><div class='add'>+                            value, VOL_TOP_PERF_FILENAME_DEF_WIDTH, filename,</div><div class='add'>+                            VOL_TOP_PERF_TIME_WIDTH, timestr);</div><div class='add'>+                else</div><div class='add'>+                    cli_out("%*" PRIu64 " ...%-*s %-*s",</div><div class='add'>+                            VOL_TOP_PERF_SPEED_WIDTH, value,</div><div class='add'>+                            VOL_TOP_PERF_FILENAME_ALT_WIDTH,</div><div class='add'>+                            filename + strlen(filename) -</div><div class='add'>+                                VOL_TOP_PERF_FILENAME_ALT_WIDTH,</div><div class='add'>+                            VOL_TOP_PERF_TIME_WIDTH, timestr);</div><div class='add'>+            } else {</div><div class='add'>+                cli_out("%" PRIu64 "\t\t%s", value, filename);</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    ret = rsp.op_ret;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    cli_cmd_broadcast_response(ret);</div><div class='add'>+</div><div class='add'>+    if (dict)</div><div class='add'>+        dict_unref(dict);</div><div class='add'>+</div><div class='add'>+    gf_free_xdr_cli_rsp(rsp);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int32_t</div><div class='add'>+gf_cli_top_volume(call_frame_t *frame, xlator_t *this, void *data)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    gf_cli_req req = {{</div><div class='add'>+        0,</div><div class='add'>+    }};</div><div class='add'>+    dict_t *dict = NULL;</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(frame);</div><div class='add'>+    GF_ASSERT(this);</div><div class='add'>+    GF_ASSERT(data);</div><div class='add'>+</div><div class='add'>+    dict = data;</div><div class='add'>+</div><div class='add'>+    ret = cli_to_glusterd(&amp;req, frame, gf_cli_top_volume_cbk,</div><div class='add'>+                          (xdrproc_t)xdr_gf_cli_req, dict,</div><div class='add'>+                          GLUSTER_CLI_PROFILE_VOLUME, this, cli_rpc_prog, NULL);</div><div class='add'>+    gf_log("cli", GF_LOG_DEBUG, RETURNING, ret);</div><div class='add'>+    GF_FREE(req.dict.dict_val);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+gf_cli_getwd_cbk(struct rpc_req *req, struct iovec *iov, int count,</div><div class='add'>+                 void *myframe)</div><div class='add'>+{</div><div class='add'>+    gf1_cli_getwd_rsp rsp = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(myframe);</div><div class='add'>+</div><div class='add'>+    if (-1 == req-&gt;rpc_status) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = xdr_to_generic(*iov, &amp;rsp, (xdrproc_t)xdr_gf1_cli_getwd_rsp);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        gf_log(((call_frame_t *)myframe)-&gt;this-&gt;name, GF_LOG_ERROR,</div><div class='add'>+               XDR_DECODE_FAIL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (rsp.op_ret == -1) {</div><div class='add'>+        cli_err("getwd failed");</div><div class='add'>+        ret = rsp.op_ret;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    gf_log("cli", GF_LOG_INFO, "Received resp to getwd");</div><div class='add'>+</div><div class='add'>+    cli_out("%s", rsp.wd);</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    cli_cmd_broadcast_response(ret);</div><div class='add'>+    if (rsp.wd) {</div><div class='add'>+        free(rsp.wd);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int32_t</div><div class='add'>+gf_cli_getwd(call_frame_t *frame, xlator_t *this, void *data)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    gf1_cli_getwd_req req = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(frame);</div><div class='add'>+    GF_ASSERT(this);</div><div class='add'>+</div><div class='add'>+    if (!frame || !this)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    ret = cli_cmd_submit(NULL, &amp;req, frame, cli_rpc_prog, GLUSTER_CLI_GETWD,</div><div class='add'>+                         NULL, this, gf_cli_getwd_cbk,</div><div class='add'>+                         (xdrproc_t)xdr_gf1_cli_getwd_req);</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    gf_log("cli", GF_LOG_DEBUG, RETURNING, ret);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+cli_print_volume_status_mempool(dict_t *dict, char *prefix)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int32_t mempool_count = 0;</div><div class='add'>+    char *name = NULL;</div><div class='add'>+    int32_t hotcount = 0;</div><div class='add'>+    int32_t coldcount = 0;</div><div class='add'>+    uint64_t paddedsizeof = 0;</div><div class='add'>+    uint64_t alloccount = 0;</div><div class='add'>+    int32_t maxalloc = 0;</div><div class='add'>+    uint64_t pool_misses = 0;</div><div class='add'>+    int32_t maxstdalloc = 0;</div><div class='add'>+    char key[128] = {</div><div class='add'>+        /* prefix is really small 'brick%d' really */</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int keylen;</div><div class='add'>+    int i = 0;</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(dict);</div><div class='add'>+    GF_ASSERT(prefix);</div><div class='add'>+</div><div class='add'>+    keylen = snprintf(key, sizeof(key), "%s.mempool-count", prefix);</div><div class='add'>+    ret = dict_get_int32n(dict, key, keylen, &amp;mempool_count);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    cli_out("Mempool Stats\n-------------");</div><div class='add'>+    cli_out("%-30s %9s %9s %12s %10s %8s %8s %12s", "Name", "HotCount",</div><div class='add'>+            "ColdCount", "PaddedSizeof", "AllocCount", "MaxAlloc", "Misses",</div><div class='add'>+            "Max-StdAlloc");</div><div class='add'>+    cli_out("%-30s %9s %9s %12s %10s %8s %8s %12s", "----", "--------",</div><div class='add'>+            "---------", "------------", "----------", "--------", "--------",</div><div class='add'>+            "------------");</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; mempool_count; i++) {</div><div class='add'>+        keylen = snprintf(key, sizeof(key), "%s.pool%d.name", prefix, i);</div><div class='add'>+        ret = dict_get_strn(dict, key, keylen, &amp;name);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+</div><div class='add'>+        keylen = snprintf(key, sizeof(key), "%s.pool%d.hotcount", prefix, i);</div><div class='add'>+        ret = dict_get_int32n(dict, key, keylen, &amp;hotcount);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+</div><div class='add'>+        keylen = snprintf(key, sizeof(key), "%s.pool%d.coldcount", prefix, i);</div><div class='add'>+        ret = dict_get_int32n(dict, key, keylen, &amp;coldcount);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+</div><div class='add'>+        snprintf(key, sizeof(key), "%s.pool%d.paddedsizeof", prefix, i);</div><div class='add'>+        ret = dict_get_uint64(dict, key, &amp;paddedsizeof);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+</div><div class='add'>+        snprintf(key, sizeof(key), "%s.pool%d.alloccount", prefix, i);</div><div class='add'>+        ret = dict_get_uint64(dict, key, &amp;alloccount);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+</div><div class='add'>+        keylen = snprintf(key, sizeof(key), "%s.pool%d.max_alloc", prefix, i);</div><div class='add'>+        ret = dict_get_int32n(dict, key, keylen, &amp;maxalloc);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+</div><div class='add'>+        keylen = snprintf(key, sizeof(key), "%s.pool%d.max-stdalloc", prefix,</div><div class='add'>+                          i);</div><div class='add'>+        ret = dict_get_int32n(dict, key, keylen, &amp;maxstdalloc);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+</div><div class='add'>+        snprintf(key, sizeof(key), "%s.pool%d.pool-misses", prefix, i);</div><div class='add'>+        ret = dict_get_uint64(dict, key, &amp;pool_misses);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+</div><div class='add'>+        cli_out("%-30s %9d %9d %12" PRIu64 " %10" PRIu64 " %8d %8" PRIu64</div><div class='add'>+                " %12d",</div><div class='add'>+                name, hotcount, coldcount, paddedsizeof, alloccount, maxalloc,</div><div class='add'>+                pool_misses, maxstdalloc);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+cli_print_volume_status_mem(dict_t *dict, gf_boolean_t notbrick)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    char *volname = NULL;</div><div class='add'>+    char *hostname = NULL;</div><div class='add'>+    char *path = NULL;</div><div class='add'>+    int online = -1;</div><div class='add'>+    char key[64] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int brick_index_max = -1;</div><div class='add'>+    int other_count = 0;</div><div class='add'>+    int index_max = 0;</div><div class='add'>+    int val = 0;</div><div class='add'>+    int i = 0;</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(dict);</div><div class='add'>+</div><div class='add'>+    ret = dict_get_str_sizen(dict, "volname", &amp;volname);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+    cli_out("Memory status for volume : %s", volname);</div><div class='add'>+</div><div class='add'>+    ret = dict_get_int32_sizen(dict, "brick-index-max", &amp;brick_index_max);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+    ret = dict_get_int32_sizen(dict, "other-count", &amp;other_count);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    index_max = brick_index_max + other_count;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt;= index_max; i++) {</div><div class='add'>+        cli_out("----------------------------------------------");</div><div class='add'>+</div><div class='add'>+        snprintf(key, sizeof(key), "brick%d.hostname", i);</div><div class='add'>+        ret = dict_get_str(dict, key, &amp;hostname);</div><div class='add'>+        if (ret)</div><div class='add'>+            continue;</div><div class='add'>+        snprintf(key, sizeof(key), "brick%d.path", i);</div><div class='add'>+        ret = dict_get_str(dict, key, &amp;path);</div><div class='add'>+        if (ret)</div><div class='add'>+            continue;</div><div class='add'>+        if (notbrick)</div><div class='add'>+            cli_out("%s : %s", hostname, path);</div><div class='add'>+        else</div><div class='add'>+            cli_out("Brick : %s:%s", hostname, path);</div><div class='add'>+</div><div class='add'>+        snprintf(key, sizeof(key), "brick%d.status", i);</div><div class='add'>+        ret = dict_get_int32(dict, key, &amp;online);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+        if (!online) {</div><div class='add'>+            if (notbrick)</div><div class='add'>+                cli_out("%s is offline", hostname);</div><div class='add'>+            else</div><div class='add'>+                cli_out("Brick is offline");</div><div class='add'>+            continue;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        cli_out("Mallinfo\n--------");</div><div class='add'>+</div><div class='add'>+        snprintf(key, sizeof(key), "brick%d.mallinfo.arena", i);</div><div class='add'>+        ret = dict_get_int32(dict, key, &amp;val);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+        cli_out("%-8s : %d", "Arena", val);</div><div class='add'>+</div><div class='add'>+        snprintf(key, sizeof(key), "brick%d.mallinfo.ordblks", i);</div><div class='add'>+        ret = dict_get_int32(dict, key, &amp;val);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+        cli_out("%-8s : %d", "Ordblks", val);</div><div class='add'>+</div><div class='add'>+        snprintf(key, sizeof(key), "brick%d.mallinfo.smblks", i);</div><div class='add'>+        ret = dict_get_int32(dict, key, &amp;val);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+        cli_out("%-8s : %d", "Smblks", val);</div><div class='add'>+</div><div class='add'>+        snprintf(key, sizeof(key), "brick%d.mallinfo.hblks", i);</div><div class='add'>+        ret = dict_get_int32(dict, key, &amp;val);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+        cli_out("%-8s : %d", "Hblks", val);</div><div class='add'>+</div><div class='add'>+        snprintf(key, sizeof(key), "brick%d.mallinfo.hblkhd", i);</div><div class='add'>+        ret = dict_get_int32(dict, key, &amp;val);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+        cli_out("%-8s : %d", "Hblkhd", val);</div><div class='add'>+</div><div class='add'>+        snprintf(key, sizeof(key), "brick%d.mallinfo.usmblks", i);</div><div class='add'>+        ret = dict_get_int32(dict, key, &amp;val);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+        cli_out("%-8s : %d", "Usmblks", val);</div><div class='add'>+</div><div class='add'>+        snprintf(key, sizeof(key), "brick%d.mallinfo.fsmblks", i);</div><div class='add'>+        ret = dict_get_int32(dict, key, &amp;val);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+        cli_out("%-8s : %d", "Fsmblks", val);</div><div class='add'>+</div><div class='add'>+        snprintf(key, sizeof(key), "brick%d.mallinfo.uordblks", i);</div><div class='add'>+        ret = dict_get_int32(dict, key, &amp;val);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+        cli_out("%-8s : %d", "Uordblks", val);</div><div class='add'>+</div><div class='add'>+        snprintf(key, sizeof(key), "brick%d.mallinfo.fordblks", i);</div><div class='add'>+        ret = dict_get_int32(dict, key, &amp;val);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+        cli_out("%-8s : %d", "Fordblks", val);</div><div class='add'>+</div><div class='add'>+        snprintf(key, sizeof(key), "brick%d.mallinfo.keepcost", i);</div><div class='add'>+        ret = dict_get_int32(dict, key, &amp;val);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+        cli_out("%-8s : %d", "Keepcost", val);</div><div class='add'>+</div><div class='add'>+        cli_out(" ");</div><div class='add'>+        snprintf(key, sizeof(key), "brick%d", i);</div><div class='add'>+        cli_print_volume_status_mempool(dict, key);</div><div class='add'>+    }</div><div class='add'>+out:</div><div class='add'>+    cli_out("----------------------------------------------\n");</div><div class='add'>+    return;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+cli_print_volume_status_client_list(dict_t *dict, gf_boolean_t notbrick)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    char *volname = NULL;</div><div class='add'>+    int client_count = 0;</div><div class='add'>+    int current_count = 0;</div><div class='add'>+    char key[64] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int i = 0;</div><div class='add'>+    int total = 0;</div><div class='add'>+    char *name = NULL;</div><div class='add'>+    gf_boolean_t is_fuse_done = _gf_false;</div><div class='add'>+    gf_boolean_t is_gfapi_done = _gf_false;</div><div class='add'>+    gf_boolean_t is_rebalance_done = _gf_false;</div><div class='add'>+    gf_boolean_t is_glustershd_done = _gf_false;</div><div class='add'>+    gf_boolean_t is_quotad_done = _gf_false;</div><div class='add'>+    gf_boolean_t is_snapd_done = _gf_false;</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(dict);</div><div class='add'>+</div><div class='add'>+    ret = dict_get_str_sizen(dict, "volname", &amp;volname);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+    cli_out("Client connections for volume %s", volname);</div><div class='add'>+</div><div class='add'>+    ret = dict_get_int32_sizen(dict, "client-count", &amp;client_count);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    cli_out("%-48s %15s", "Name", "count");</div><div class='add'>+    cli_out("%-48s %15s", "-----", "------");</div><div class='add'>+    for (i = 0; i &lt; client_count; i++) {</div><div class='add'>+        name = NULL;</div><div class='add'>+        snprintf(key, sizeof(key), "client%d.name", i);</div><div class='add'>+        ret = dict_get_str(dict, key, &amp;name);</div><div class='add'>+</div><div class='add'>+        if (!strncmp(name, "fuse", 4)) {</div><div class='add'>+            if (!is_fuse_done) {</div><div class='add'>+                is_fuse_done = _gf_true;</div><div class='add'>+                ret = dict_get_int32_sizen(dict, "fuse-count", &amp;current_count);</div><div class='add'>+                if (ret)</div><div class='add'>+                    goto out;</div><div class='add'>+                total = total + current_count;</div><div class='add'>+                goto print;</div><div class='add'>+            }</div><div class='add'>+            continue;</div><div class='add'>+        } else if (!strncmp(name, "gfapi", 5)) {</div><div class='add'>+            if (!is_gfapi_done) {</div><div class='add'>+                is_gfapi_done = _gf_true;</div><div class='add'>+                ret = dict_get_int32_sizen(dict, "gfapi-count", &amp;current_count);</div><div class='add'>+                if (ret)</div><div class='add'>+                    goto out;</div><div class='add'>+                total = total + current_count;</div><div class='add'>+                goto print;</div><div class='add'>+            }</div><div class='add'>+            continue;</div><div class='add'>+        } else if (!strcmp(name, "rebalance")) {</div><div class='add'>+            if (!is_rebalance_done) {</div><div class='add'>+                is_rebalance_done = _gf_true;</div><div class='add'>+                ret = dict_get_int32_sizen(dict, "rebalance-count",</div><div class='add'>+                                           &amp;current_count);</div><div class='add'>+                if (ret)</div><div class='add'>+                    goto out;</div><div class='add'>+                total = total + current_count;</div><div class='add'>+                goto print;</div><div class='add'>+            }</div><div class='add'>+            continue;</div><div class='add'>+        } else if (!strcmp(name, "glustershd")) {</div><div class='add'>+            if (!is_glustershd_done) {</div><div class='add'>+                is_glustershd_done = _gf_true;</div><div class='add'>+                ret = dict_get_int32_sizen(dict, "glustershd-count",</div><div class='add'>+                                           &amp;current_count);</div><div class='add'>+                if (ret)</div><div class='add'>+                    goto out;</div><div class='add'>+                total = total + current_count;</div><div class='add'>+                goto print;</div><div class='add'>+            }</div><div class='add'>+            continue;</div><div class='add'>+        } else if (!strcmp(name, "quotad")) {</div><div class='add'>+            if (!is_quotad_done) {</div><div class='add'>+                is_quotad_done = _gf_true;</div><div class='add'>+                ret = dict_get_int32_sizen(dict, "quotad-count",</div><div class='add'>+                                           &amp;current_count);</div><div class='add'>+                if (ret)</div><div class='add'>+                    goto out;</div><div class='add'>+                total = total + current_count;</div><div class='add'>+                goto print;</div><div class='add'>+            }</div><div class='add'>+            continue;</div><div class='add'>+        } else if (!strcmp(name, "snapd")) {</div><div class='add'>+            if (!is_snapd_done) {</div><div class='add'>+                is_snapd_done = _gf_true;</div><div class='add'>+                ret = dict_get_int32_sizen(dict, "snapd-count", &amp;current_count);</div><div class='add'>+                if (ret)</div><div class='add'>+                    goto out;</div><div class='add'>+                total = total + current_count;</div><div class='add'>+                goto print;</div><div class='add'>+            }</div><div class='add'>+            continue;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+    print:</div><div class='add'>+        cli_out("%-48s %15d", name, current_count);</div><div class='add'>+    }</div><div class='add'>+out:</div><div class='add'>+    cli_out("\ntotal clients for volume %s : %d ", volname, total);</div><div class='add'>+    cli_out(</div><div class='add'>+        "-----------------------------------------------------------------\n");</div><div class='add'>+    return;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+cli_print_volume_status_clients(dict_t *dict, gf_boolean_t notbrick)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    char *volname = NULL;</div><div class='add'>+    int brick_index_max = -1;</div><div class='add'>+    int other_count = 0;</div><div class='add'>+    int index_max = 0;</div><div class='add'>+    char *hostname = NULL;</div><div class='add'>+    char *path = NULL;</div><div class='add'>+    int online = -1;</div><div class='add'>+    int client_count = 0;</div><div class='add'>+    char *clientname = NULL;</div><div class='add'>+    uint64_t bytesread = 0;</div><div class='add'>+    uint64_t byteswrite = 0;</div><div class='add'>+    uint32_t opversion = 0;</div><div class='add'>+    char key[128] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int i = 0;</div><div class='add'>+    int j = 0;</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(dict);</div><div class='add'>+</div><div class='add'>+    ret = dict_get_str_sizen(dict, "volname", &amp;volname);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+    cli_out("Client connections for volume %s", volname);</div><div class='add'>+</div><div class='add'>+    ret = dict_get_int32_sizen(dict, "brick-index-max", &amp;brick_index_max);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+    ret = dict_get_int32_sizen(dict, "other-count", &amp;other_count);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    index_max = brick_index_max + other_count;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt;= index_max; i++) {</div><div class='add'>+        hostname = NULL;</div><div class='add'>+        path = NULL;</div><div class='add'>+        online = -1;</div><div class='add'>+        client_count = 0;</div><div class='add'>+        clientname = NULL;</div><div class='add'>+        bytesread = 0;</div><div class='add'>+        byteswrite = 0;</div><div class='add'>+</div><div class='add'>+        cli_out("----------------------------------------------");</div><div class='add'>+</div><div class='add'>+        snprintf(key, sizeof(key), "brick%d.hostname", i);</div><div class='add'>+        ret = dict_get_str(dict, key, &amp;hostname);</div><div class='add'>+</div><div class='add'>+        snprintf(key, sizeof(key), "brick%d.path", i);</div><div class='add'>+        ret = dict_get_str(dict, key, &amp;path);</div><div class='add'>+</div><div class='add'>+        if (hostname &amp;&amp; path) {</div><div class='add'>+            if (notbrick)</div><div class='add'>+                cli_out("%s : %s", hostname, path);</div><div class='add'>+            else</div><div class='add'>+                cli_out("Brick : %s:%s", hostname, path);</div><div class='add'>+        }</div><div class='add'>+        snprintf(key, sizeof(key), "brick%d.status", i);</div><div class='add'>+        ret = dict_get_int32(dict, key, &amp;online);</div><div class='add'>+        if (!online) {</div><div class='add'>+            if (notbrick)</div><div class='add'>+                cli_out("%s is offline", hostname);</div><div class='add'>+            else</div><div class='add'>+                cli_out("Brick is offline");</div><div class='add'>+            continue;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        snprintf(key, sizeof(key), "brick%d.clientcount", i);</div><div class='add'>+        ret = dict_get_int32(dict, key, &amp;client_count);</div><div class='add'>+</div><div class='add'>+        if (hostname &amp;&amp; path)</div><div class='add'>+            cli_out("Clients connected : %d", client_count);</div><div class='add'>+        if (client_count == 0)</div><div class='add'>+            continue;</div><div class='add'>+</div><div class='add'>+        cli_out("%-48s %15s %15s %15s", "Hostname", "BytesRead", "BytesWritten",</div><div class='add'>+                "OpVersion");</div><div class='add'>+        cli_out("%-48s %15s %15s %15s", "--------", "---------", "------------",</div><div class='add'>+                "---------");</div><div class='add'>+        for (j = 0; j &lt; client_count; j++) {</div><div class='add'>+            snprintf(key, sizeof(key), "brick%d.client%d.hostname", i, j);</div><div class='add'>+            ret = dict_get_str(dict, key, &amp;clientname);</div><div class='add'>+</div><div class='add'>+            snprintf(key, sizeof(key), "brick%d.client%d.bytesread", i, j);</div><div class='add'>+            ret = dict_get_uint64(dict, key, &amp;bytesread);</div><div class='add'>+</div><div class='add'>+            snprintf(key, sizeof(key), "brick%d.client%d.byteswrite", i, j);</div><div class='add'>+            ret = dict_get_uint64(dict, key, &amp;byteswrite);</div><div class='add'>+</div><div class='add'>+            snprintf(key, sizeof(key), "brick%d.client%d.opversion", i, j);</div><div class='add'>+            ret = dict_get_uint32(dict, key, &amp;opversion);</div><div class='add'>+</div><div class='add'>+            cli_out("%-48s %15" PRIu64 " %15" PRIu64 " %15" PRIu32, clientname,</div><div class='add'>+                    bytesread, byteswrite, opversion);</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+out:</div><div class='add'>+    cli_out("----------------------------------------------\n");</div><div class='add'>+    return;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#ifdef DEBUG /* this function is only used in debug */</div><div class='add'>+static void</div><div class='add'>+cli_print_volume_status_inode_entry(dict_t *dict, char *prefix)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    char key[1024] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    char *gfid = NULL;</div><div class='add'>+    uint64_t nlookup = 0;</div><div class='add'>+    uint32_t ref = 0;</div><div class='add'>+    int ia_type = 0;</div><div class='add'>+    char inode_type;</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(dict);</div><div class='add'>+    GF_ASSERT(prefix);</div><div class='add'>+</div><div class='add'>+    snprintf(key, sizeof(key), "%s.gfid", prefix);</div><div class='add'>+    ret = dict_get_str(dict, key, &amp;gfid);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    snprintf(key, sizeof(key), "%s.nlookup", prefix);</div><div class='add'>+    ret = dict_get_uint64(dict, key, &amp;nlookup);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    snprintf(key, sizeof(key), "%s.ref", prefix);</div><div class='add'>+    ret = dict_get_uint32(dict, key, &amp;ref);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    snprintf(key, sizeof(key), "%s.ia_type", prefix);</div><div class='add'>+    ret = dict_get_int32(dict, key, &amp;ia_type);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    switch (ia_type) {</div><div class='add'>+        case IA_IFREG:</div><div class='add'>+            inode_type = 'R';</div><div class='add'>+            break;</div><div class='add'>+        case IA_IFDIR:</div><div class='add'>+            inode_type = 'D';</div><div class='add'>+            break;</div><div class='add'>+        case IA_IFLNK:</div><div class='add'>+            inode_type = 'L';</div><div class='add'>+            break;</div><div class='add'>+        case IA_IFBLK:</div><div class='add'>+            inode_type = 'B';</div><div class='add'>+            break;</div><div class='add'>+        case IA_IFCHR:</div><div class='add'>+            inode_type = 'C';</div><div class='add'>+            break;</div><div class='add'>+        case IA_IFIFO:</div><div class='add'>+            inode_type = 'F';</div><div class='add'>+            break;</div><div class='add'>+        case IA_IFSOCK:</div><div class='add'>+            inode_type = 'S';</div><div class='add'>+            break;</div><div class='add'>+        default:</div><div class='add'>+            inode_type = 'I';</div><div class='add'>+            break;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    cli_out("%-40s %14" PRIu64 " %14" PRIu32 " %9c", gfid, nlookup, ref,</div><div class='add'>+            inode_type);</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return;</div><div class='add'>+}</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+cli_print_volume_status_itables(dict_t *dict, char *prefix)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    char key[1024] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    uint32_t active_size = 0;</div><div class='add'>+    uint32_t lru_size = 0;</div><div class='add'>+    uint32_t purge_size = 0;</div><div class='add'>+    uint32_t lru_limit = 0;</div><div class='add'>+#ifdef DEBUG</div><div class='add'>+    int i = 0;</div><div class='add'>+#endif</div><div class='add'>+    GF_ASSERT(dict);</div><div class='add'>+    GF_ASSERT(prefix);</div><div class='add'>+</div><div class='add'>+    snprintf(key, sizeof(key), "%s.lru_limit", prefix);</div><div class='add'>+    ret = dict_get_uint32(dict, key, &amp;lru_limit);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+    cli_out("LRU limit     : %u", lru_limit);</div><div class='add'>+</div><div class='add'>+    snprintf(key, sizeof(key), "%s.active_size", prefix);</div><div class='add'>+    ret = dict_get_uint32(dict, key, &amp;active_size);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+#ifdef DEBUG</div><div class='add'>+    if (active_size != 0) {</div><div class='add'>+        cli_out("Active inodes:");</div><div class='add'>+        cli_out("%-40s %14s %14s %9s", "GFID", "Lookups", "Ref", "IA type");</div><div class='add'>+        cli_out("%-40s %14s %14s %9s", "----", "-------", "---", "-------");</div><div class='add'>+    }</div><div class='add'>+    for (i = 0; i &lt; active_size; i++) {</div><div class='add'>+        snprintf(key, sizeof(key), "%s.active%d", prefix, i);</div><div class='add'>+        cli_print_volume_status_inode_entry(dict, key);</div><div class='add'>+    }</div><div class='add'>+    cli_out(" ");</div><div class='add'>+#else</div><div class='add'>+    cli_out("Active Inodes : %u", active_size);</div><div class='add'>+</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+    snprintf(key, sizeof(key), "%s.lru_size", prefix);</div><div class='add'>+    ret = dict_get_uint32(dict, key, &amp;lru_size);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+#ifdef DEBUG</div><div class='add'>+    if (lru_size != 0) {</div><div class='add'>+        cli_out("LRU inodes:");</div><div class='add'>+        cli_out("%-40s %14s %14s %9s", "GFID", "Lookups", "Ref", "IA type");</div><div class='add'>+        cli_out("%-40s %14s %14s %9s", "----", "-------", "---", "-------");</div><div class='add'>+    }</div><div class='add'>+    for (i = 0; i &lt; lru_size; i++) {</div><div class='add'>+        snprintf(key, sizeof(key), "%s.lru%d", prefix, i);</div><div class='add'>+        cli_print_volume_status_inode_entry(dict, key);</div><div class='add'>+    }</div><div class='add'>+    cli_out(" ");</div><div class='add'>+#else</div><div class='add'>+    cli_out("LRU Inodes    : %u", lru_size);</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+    snprintf(key, sizeof(key), "%s.purge_size", prefix);</div><div class='add'>+    ret = dict_get_uint32(dict, key, &amp;purge_size);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+#ifdef DEBUG</div><div class='add'>+    if (purge_size != 0) {</div><div class='add'>+        cli_out("Purged inodes:");</div><div class='add'>+        cli_out("%-40s %14s %14s %9s", "GFID", "Lookups", "Ref", "IA type");</div><div class='add'>+        cli_out("%-40s %14s %14s %9s", "----", "-------", "---", "-------");</div><div class='add'>+    }</div><div class='add'>+    for (i = 0; i &lt; purge_size; i++) {</div><div class='add'>+        snprintf(key, sizeof(key), "%s.purge%d", prefix, i);</div><div class='add'>+        cli_print_volume_status_inode_entry(dict, key);</div><div class='add'>+    }</div><div class='add'>+#else</div><div class='add'>+    cli_out("Purge Inodes  : %u", purge_size);</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+cli_print_volume_status_inode(dict_t *dict, gf_boolean_t notbrick)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    char *volname = NULL;</div><div class='add'>+    int brick_index_max = -1;</div><div class='add'>+    int other_count = 0;</div><div class='add'>+    int index_max = 0;</div><div class='add'>+    char *hostname = NULL;</div><div class='add'>+    char *path = NULL;</div><div class='add'>+    int online = -1;</div><div class='add'>+    int conn_count = 0;</div><div class='add'>+    char key[64] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int i = 0;</div><div class='add'>+    int j = 0;</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(dict);</div><div class='add'>+</div><div class='add'>+    ret = dict_get_str_sizen(dict, "volname", &amp;volname);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+    cli_out("Inode tables for volume %s", volname);</div><div class='add'>+</div><div class='add'>+    ret = dict_get_int32_sizen(dict, "brick-index-max", &amp;brick_index_max);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+    ret = dict_get_int32_sizen(dict, "other-count", &amp;other_count);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    index_max = brick_index_max + other_count;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt;= index_max; i++) {</div><div class='add'>+        cli_out("----------------------------------------------");</div><div class='add'>+</div><div class='add'>+        snprintf(key, sizeof(key), "brick%d.hostname", i);</div><div class='add'>+        ret = dict_get_str(dict, key, &amp;hostname);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+        snprintf(key, sizeof(key), "brick%d.path", i);</div><div class='add'>+        ret = dict_get_str(dict, key, &amp;path);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+        if (notbrick)</div><div class='add'>+            cli_out("%s : %s", hostname, path);</div><div class='add'>+        else</div><div class='add'>+            cli_out("Brick : %s:%s", hostname, path);</div><div class='add'>+</div><div class='add'>+        snprintf(key, sizeof(key), "brick%d.status", i);</div><div class='add'>+        ret = dict_get_int32(dict, key, &amp;online);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+        if (!online) {</div><div class='add'>+            if (notbrick)</div><div class='add'>+                cli_out("%s is offline", hostname);</div><div class='add'>+            else</div><div class='add'>+                cli_out("Brick is offline");</div><div class='add'>+            continue;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        snprintf(key, sizeof(key), "brick%d.conncount", i);</div><div class='add'>+        ret = dict_get_int32(dict, key, &amp;conn_count);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+</div><div class='add'>+        for (j = 0; j &lt; conn_count; j++) {</div><div class='add'>+            if (conn_count &gt; 1)</div><div class='add'>+                cli_out("Connection %d:", j + 1);</div><div class='add'>+</div><div class='add'>+            snprintf(key, sizeof(key), "brick%d.conn%d.itable", i, j);</div><div class='add'>+            cli_print_volume_status_itables(dict, key);</div><div class='add'>+            cli_out(" ");</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+out:</div><div class='add'>+    cli_out("----------------------------------------------");</div><div class='add'>+    return;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+cli_print_volume_status_fdtable(dict_t *dict, char *prefix)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    char key[256] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int refcount = 0;</div><div class='add'>+    uint32_t maxfds = 0;</div><div class='add'>+    int firstfree = 0;</div><div class='add'>+    int openfds = 0;</div><div class='add'>+    int fd_pid = 0;</div><div class='add'>+    int fd_refcount = 0;</div><div class='add'>+    int fd_flags = 0;</div><div class='add'>+    int i = 0;</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(dict);</div><div class='add'>+    GF_ASSERT(prefix);</div><div class='add'>+</div><div class='add'>+    snprintf(key, sizeof(key), "%s.refcount", prefix);</div><div class='add'>+    ret = dict_get_int32(dict, key, &amp;refcount);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    snprintf(key, sizeof(key), "%s.maxfds", prefix);</div><div class='add'>+    ret = dict_get_uint32(dict, key, &amp;maxfds);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    snprintf(key, sizeof(key), "%s.firstfree", prefix);</div><div class='add'>+    ret = dict_get_int32(dict, key, &amp;firstfree);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    cli_out("RefCount = %d  MaxFDs = %d  FirstFree = %d", refcount, maxfds,</div><div class='add'>+            firstfree);</div><div class='add'>+</div><div class='add'>+    snprintf(key, sizeof(key), "%s.openfds", prefix);</div><div class='add'>+    ret = dict_get_int32(dict, key, &amp;openfds);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+    if (0 == openfds) {</div><div class='add'>+        cli_err("No open fds");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    cli_out("%-19s %-19s %-19s %-19s", "FD Entry", "PID", "RefCount", "Flags");</div><div class='add'>+    cli_out("%-19s %-19s %-19s %-19s", "--------", "---", "--------", "-----");</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; maxfds; i++) {</div><div class='add'>+        snprintf(key, sizeof(key), "%s.fdentry%d.pid", prefix, i);</div><div class='add'>+        ret = dict_get_int32(dict, key, &amp;fd_pid);</div><div class='add'>+        if (ret)</div><div class='add'>+            continue;</div><div class='add'>+</div><div class='add'>+        snprintf(key, sizeof(key), "%s.fdentry%d.refcount", prefix, i);</div><div class='add'>+        ret = dict_get_int32(dict, key, &amp;fd_refcount);</div><div class='add'>+        if (ret)</div><div class='add'>+            continue;</div><div class='add'>+</div><div class='add'>+        snprintf(key, sizeof(key), "%s.fdentry%d.flags", prefix, i);</div><div class='add'>+        ret = dict_get_int32(dict, key, &amp;fd_flags);</div><div class='add'>+        if (ret)</div><div class='add'>+            continue;</div><div class='add'>+</div><div class='add'>+        cli_out("%-19d %-19d %-19d %-19d", i, fd_pid, fd_refcount, fd_flags);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+cli_print_volume_status_fd(dict_t *dict, gf_boolean_t notbrick)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    char *volname = NULL;</div><div class='add'>+    int brick_index_max = -1;</div><div class='add'>+    int other_count = 0;</div><div class='add'>+    int index_max = 0;</div><div class='add'>+    char *hostname = NULL;</div><div class='add'>+    char *path = NULL;</div><div class='add'>+    int online = -1;</div><div class='add'>+    int conn_count = 0;</div><div class='add'>+    char key[64] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int i = 0;</div><div class='add'>+    int j = 0;</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(dict);</div><div class='add'>+</div><div class='add'>+    ret = dict_get_str_sizen(dict, "volname", &amp;volname);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+    cli_out("FD tables for volume %s", volname);</div><div class='add'>+</div><div class='add'>+    ret = dict_get_int32_sizen(dict, "brick-index-max", &amp;brick_index_max);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+    ret = dict_get_int32_sizen(dict, "other-count", &amp;other_count);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    index_max = brick_index_max + other_count;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt;= index_max; i++) {</div><div class='add'>+        cli_out("----------------------------------------------");</div><div class='add'>+</div><div class='add'>+        snprintf(key, sizeof(key), "brick%d.hostname", i);</div><div class='add'>+        ret = dict_get_str(dict, key, &amp;hostname);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+        snprintf(key, sizeof(key), "brick%d.path", i);</div><div class='add'>+        ret = dict_get_str(dict, key, &amp;path);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+</div><div class='add'>+        if (notbrick)</div><div class='add'>+            cli_out("%s : %s", hostname, path);</div><div class='add'>+        else</div><div class='add'>+            cli_out("Brick : %s:%s", hostname, path);</div><div class='add'>+</div><div class='add'>+        snprintf(key, sizeof(key), "brick%d.status", i);</div><div class='add'>+        ret = dict_get_int32(dict, key, &amp;online);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+        if (!online) {</div><div class='add'>+            if (notbrick)</div><div class='add'>+                cli_out("%s is offline", hostname);</div><div class='add'>+            else</div><div class='add'>+                cli_out("Brick is offline");</div><div class='add'>+            continue;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        snprintf(key, sizeof(key), "brick%d.conncount", i);</div><div class='add'>+        ret = dict_get_int32(dict, key, &amp;conn_count);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+</div><div class='add'>+        for (j = 0; j &lt; conn_count; j++) {</div><div class='add'>+            cli_out("Connection %d:", j + 1);</div><div class='add'>+</div><div class='add'>+            snprintf(key, sizeof(key), "brick%d.conn%d.fdtable", i, j);</div><div class='add'>+            cli_print_volume_status_fdtable(dict, key);</div><div class='add'>+            cli_out(" ");</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+out:</div><div class='add'>+    cli_out("----------------------------------------------");</div><div class='add'>+    return;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+cli_print_volume_status_call_frame(dict_t *dict, char *prefix)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    char key[1024] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int ref_count = 0;</div><div class='add'>+    char *translator = 0;</div><div class='add'>+    int complete = 0;</div><div class='add'>+    char *parent = NULL;</div><div class='add'>+    char *wind_from = NULL;</div><div class='add'>+    char *wind_to = NULL;</div><div class='add'>+    char *unwind_from = NULL;</div><div class='add'>+    char *unwind_to = NULL;</div><div class='add'>+</div><div class='add'>+    if (!dict || !prefix)</div><div class='add'>+        return;</div><div class='add'>+</div><div class='add'>+    snprintf(key, sizeof(key), "%s.refcount", prefix);</div><div class='add'>+    ret = dict_get_int32(dict, key, &amp;ref_count);</div><div class='add'>+    if (ret)</div><div class='add'>+        return;</div><div class='add'>+</div><div class='add'>+    snprintf(key, sizeof(key), "%s.translator", prefix);</div><div class='add'>+    ret = dict_get_str(dict, key, &amp;translator);</div><div class='add'>+    if (ret)</div><div class='add'>+        return;</div><div class='add'>+</div><div class='add'>+    snprintf(key, sizeof(key), "%s.complete", prefix);</div><div class='add'>+    ret = dict_get_int32(dict, key, &amp;complete);</div><div class='add'>+    if (ret)</div><div class='add'>+        return;</div><div class='add'>+</div><div class='add'>+    cli_out("  Ref Count   = %d", ref_count);</div><div class='add'>+    cli_out("  Translator  = %s", translator);</div><div class='add'>+    cli_out("  Completed   = %s", (complete ? "Yes" : "No"));</div><div class='add'>+</div><div class='add'>+    snprintf(key, sizeof(key), "%s.parent", prefix);</div><div class='add'>+    ret = dict_get_str(dict, key, &amp;parent);</div><div class='add'>+    if (!ret)</div><div class='add'>+        cli_out("  Parent      = %s", parent);</div><div class='add'>+</div><div class='add'>+    snprintf(key, sizeof(key), "%s.windfrom", prefix);</div><div class='add'>+    ret = dict_get_str(dict, key, &amp;wind_from);</div><div class='add'>+    if (!ret)</div><div class='add'>+        cli_out("  Wind From   = %s", wind_from);</div><div class='add'>+</div><div class='add'>+    snprintf(key, sizeof(key), "%s.windto", prefix);</div><div class='add'>+    ret = dict_get_str(dict, key, &amp;wind_to);</div><div class='add'>+    if (!ret)</div><div class='add'>+        cli_out("  Wind To     = %s", wind_to);</div><div class='add'>+</div><div class='add'>+    snprintf(key, sizeof(key), "%s.unwindfrom", prefix);</div><div class='add'>+    ret = dict_get_str(dict, key, &amp;unwind_from);</div><div class='add'>+    if (!ret)</div><div class='add'>+        cli_out("  Unwind From = %s", unwind_from);</div><div class='add'>+</div><div class='add'>+    snprintf(key, sizeof(key), "%s.unwindto", prefix);</div><div class='add'>+    ret = dict_get_str(dict, key, &amp;unwind_to);</div><div class='add'>+    if (!ret)</div><div class='add'>+        cli_out("  Unwind To   = %s", unwind_to);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+cli_print_volume_status_call_stack(dict_t *dict, char *prefix)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    char key[256] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int uid = 0;</div><div class='add'>+    int gid = 0;</div><div class='add'>+    int pid = 0;</div><div class='add'>+    uint64_t unique = 0;</div><div class='add'>+    // char            *op = NULL;</div><div class='add'>+    int count = 0;</div><div class='add'>+    int i = 0;</div><div class='add'>+</div><div class='add'>+    if (!prefix)</div><div class='add'>+        return;</div><div class='add'>+</div><div class='add'>+    snprintf(key, sizeof(key), "%s.uid", prefix);</div><div class='add'>+    ret = dict_get_int32(dict, key, &amp;uid);</div><div class='add'>+    if (ret)</div><div class='add'>+        return;</div><div class='add'>+</div><div class='add'>+    snprintf(key, sizeof(key), "%s.gid", prefix);</div><div class='add'>+    ret = dict_get_int32(dict, key, &amp;gid);</div><div class='add'>+    if (ret)</div><div class='add'>+        return;</div><div class='add'>+</div><div class='add'>+    snprintf(key, sizeof(key), "%s.pid", prefix);</div><div class='add'>+    ret = dict_get_int32(dict, key, &amp;pid);</div><div class='add'>+    if (ret)</div><div class='add'>+        return;</div><div class='add'>+</div><div class='add'>+    snprintf(key, sizeof(key), "%s.unique", prefix);</div><div class='add'>+    ret = dict_get_uint64(dict, key, &amp;unique);</div><div class='add'>+    if (ret)</div><div class='add'>+        return;</div><div class='add'>+</div><div class='add'>+    /*</div><div class='add'>+    snprintf (key, sizeof (key), "%s.op", prefix);</div><div class='add'>+    ret = dict_get_str (dict, key, &amp;op);</div><div class='add'>+    if (ret)</div><div class='add'>+            return;</div><div class='add'>+    */</div><div class='add'>+</div><div class='add'>+    snprintf(key, sizeof(key), "%s.count", prefix);</div><div class='add'>+    ret = dict_get_int32(dict, key, &amp;count);</div><div class='add'>+    if (ret)</div><div class='add'>+        return;</div><div class='add'>+</div><div class='add'>+    cli_out(" UID    : %d", uid);</div><div class='add'>+    cli_out(" GID    : %d", gid);</div><div class='add'>+    cli_out(" PID    : %d", pid);</div><div class='add'>+    cli_out(" Unique : %" PRIu64, unique);</div><div class='add'>+    // cli_out ("\tOp     : %s", op);</div><div class='add'>+    cli_out(" Frames : %d", count);</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; count; i++) {</div><div class='add'>+        cli_out(" Frame %d", i + 1);</div><div class='add'>+</div><div class='add'>+        snprintf(key, sizeof(key), "%s.frame%d", prefix, i);</div><div class='add'>+        cli_print_volume_status_call_frame(dict, key);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    cli_out(" ");</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+cli_print_volume_status_callpool(dict_t *dict, gf_boolean_t notbrick)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    char *volname = NULL;</div><div class='add'>+    int brick_index_max = -1;</div><div class='add'>+    int other_count = 0;</div><div class='add'>+    int index_max = 0;</div><div class='add'>+    char *hostname = NULL;</div><div class='add'>+    char *path = NULL;</div><div class='add'>+    int online = -1;</div><div class='add'>+    int call_count = 0;</div><div class='add'>+    char key[64] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int i = 0;</div><div class='add'>+    int j = 0;</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(dict);</div><div class='add'>+</div><div class='add'>+    ret = dict_get_str_sizen(dict, "volname", &amp;volname);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+    cli_out("Pending calls for volume %s", volname);</div><div class='add'>+</div><div class='add'>+    ret = dict_get_int32_sizen(dict, "brick-index-max", &amp;brick_index_max);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+    ret = dict_get_int32_sizen(dict, "other-count", &amp;other_count);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    index_max = brick_index_max + other_count;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt;= index_max; i++) {</div><div class='add'>+        cli_out("----------------------------------------------");</div><div class='add'>+</div><div class='add'>+        snprintf(key, sizeof(key), "brick%d.hostname", i);</div><div class='add'>+        ret = dict_get_str(dict, key, &amp;hostname);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+        snprintf(key, sizeof(key), "brick%d.path", i);</div><div class='add'>+        ret = dict_get_str(dict, key, &amp;path);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+</div><div class='add'>+        if (notbrick)</div><div class='add'>+            cli_out("%s : %s", hostname, path);</div><div class='add'>+        else</div><div class='add'>+            cli_out("Brick : %s:%s", hostname, path);</div><div class='add'>+</div><div class='add'>+        snprintf(key, sizeof(key), "brick%d.status", i);</div><div class='add'>+        ret = dict_get_int32(dict, key, &amp;online);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+        if (!online) {</div><div class='add'>+            if (notbrick)</div><div class='add'>+                cli_out("%s is offline", hostname);</div><div class='add'>+            else</div><div class='add'>+                cli_out("Brick is offline");</div><div class='add'>+            continue;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        snprintf(key, sizeof(key), "brick%d.callpool.count", i);</div><div class='add'>+        ret = dict_get_int32(dict, key, &amp;call_count);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+        cli_out("Pending calls: %d", call_count);</div><div class='add'>+</div><div class='add'>+        if (0 == call_count)</div><div class='add'>+            continue;</div><div class='add'>+</div><div class='add'>+        for (j = 0; j &lt; call_count; j++) {</div><div class='add'>+            cli_out("Call Stack%d", j + 1);</div><div class='add'>+</div><div class='add'>+            snprintf(key, sizeof(key), "brick%d.callpool.stack%d", i, j);</div><div class='add'>+            cli_print_volume_status_call_stack(dict, key);</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    cli_out("----------------------------------------------");</div><div class='add'>+    return;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+cli_print_volume_status_tasks(dict_t *dict)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int i = 0;</div><div class='add'>+    int j = 0;</div><div class='add'>+    int count = 0;</div><div class='add'>+    int task_count = 0;</div><div class='add'>+    int status = 0;</div><div class='add'>+    char *op = NULL;</div><div class='add'>+    char *task_id_str = NULL;</div><div class='add'>+    char *volname = NULL;</div><div class='add'>+    char key[64] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    char task[32] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    char *brick = NULL;</div><div class='add'>+</div><div class='add'>+    ret = dict_get_int32_sizen(dict, "tasks", &amp;task_count);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log("cli", GF_LOG_ERROR, "Failed to get tasks count");</div><div class='add'>+        return;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_get_str_sizen(dict, "volname", &amp;volname);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    cli_out("Task Status of Volume %s", volname);</div><div class='add'>+    cli_print_line(CLI_BRICK_STATUS_LINE_LEN);</div><div class='add'>+</div><div class='add'>+    if (task_count == 0) {</div><div class='add'>+        cli_out("There are no active volume tasks");</div><div class='add'>+        cli_out(" ");</div><div class='add'>+        return;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; task_count; i++) {</div><div class='add'>+        snprintf(key, sizeof(key), "task%d.type", i);</div><div class='add'>+        ret = dict_get_str(dict, key, &amp;op);</div><div class='add'>+        if (ret)</div><div class='add'>+            return;</div><div class='add'>+        cli_out("%-20s : %-20s", "Task", op);</div><div class='add'>+</div><div class='add'>+        snprintf(key, sizeof(key), "task%d.id", i);</div><div class='add'>+        ret = dict_get_str(dict, key, &amp;task_id_str);</div><div class='add'>+        if (ret)</div><div class='add'>+            return;</div><div class='add'>+        cli_out("%-20s : %-20s", "ID", task_id_str);</div><div class='add'>+</div><div class='add'>+        snprintf(key, sizeof(key), "task%d.status", i);</div><div class='add'>+        ret = dict_get_int32(dict, key, &amp;status);</div><div class='add'>+        if (ret)</div><div class='add'>+            return;</div><div class='add'>+</div><div class='add'>+        snprintf(task, sizeof(task), "task%d", i);</div><div class='add'>+</div><div class='add'>+        if (!strcmp(op, "Remove brick")) {</div><div class='add'>+            snprintf(key, sizeof(key), "%s.count", task);</div><div class='add'>+            ret = dict_get_int32(dict, key, &amp;count);</div><div class='add'>+            if (ret)</div><div class='add'>+                goto out;</div><div class='add'>+</div><div class='add'>+            cli_out("%-20s", "Removed bricks:");</div><div class='add'>+</div><div class='add'>+            for (j = 1; j &lt;= count; j++) {</div><div class='add'>+                snprintf(key, sizeof(key), "%s.brick%d", task, j);</div><div class='add'>+                ret = dict_get_str(dict, key, &amp;brick);</div><div class='add'>+                if (ret)</div><div class='add'>+                    goto out;</div><div class='add'>+</div><div class='add'>+                cli_out("%-20s", brick);</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+        cli_out("%-20s : %-20s", "Status", cli_vol_task_status_str[status]);</div><div class='add'>+        cli_out(" ");</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+gf_cli_status_cbk(struct rpc_req *req, struct iovec *iov, int count,</div><div class='add'>+                  void *myframe)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int brick_index_max = -1;</div><div class='add'>+    int other_count = 0;</div><div class='add'>+    int index_max = 0;</div><div class='add'>+    int i = 0;</div><div class='add'>+    int type = -1;</div><div class='add'>+    int hot_brick_count = -1;</div><div class='add'>+    int pid = -1;</div><div class='add'>+    uint32_t cmd = 0;</div><div class='add'>+    gf_boolean_t notbrick = _gf_false;</div><div class='add'>+    char key[64] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    char *hostname = NULL;</div><div class='add'>+    char *path = NULL;</div><div class='add'>+    char *volname = NULL;</div><div class='add'>+    dict_t *dict = NULL;</div><div class='add'>+    gf_cli_rsp rsp = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    cli_volume_status_t status = {0};</div><div class='add'>+    cli_local_t *local = NULL;</div><div class='add'>+    gf_boolean_t wipe_local = _gf_false;</div><div class='add'>+    char msg[1024] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(myframe);</div><div class='add'>+</div><div class='add'>+    if (req-&gt;rpc_status == -1)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    ret = xdr_to_generic(*iov, &amp;rsp, (xdrproc_t)xdr_gf_cli_rsp);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        gf_log(((call_frame_t *)myframe)-&gt;this-&gt;name, GF_LOG_ERROR,</div><div class='add'>+               XDR_DECODE_FAIL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    gf_log("cli", GF_LOG_DEBUG, "Received response to status cmd");</div><div class='add'>+</div><div class='add'>+    local = ((call_frame_t *)myframe)-&gt;local;</div><div class='add'>+    if (!local) {</div><div class='add'>+        local = cli_local_get();</div><div class='add'>+        if (!local) {</div><div class='add'>+            ret = -1;</div><div class='add'>+            gf_log("cli", GF_LOG_ERROR, "Failed to get local");</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+        wipe_local = _gf_true;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (rsp.op_ret) {</div><div class='add'>+        if (strcmp(rsp.op_errstr, ""))</div><div class='add'>+            snprintf(msg, sizeof(msg), "%s", rsp.op_errstr);</div><div class='add'>+        else</div><div class='add'>+            snprintf(msg, sizeof(msg),</div><div class='add'>+                     "Unable to obtain volume status information.");</div><div class='add'>+</div><div class='add'>+        if (global_state-&gt;mode &amp; GLUSTER_MODE_XML) {</div><div class='add'>+            if (!local-&gt;all)</div><div class='add'>+                cli_xml_output_str("volStatus", msg, rsp.op_ret, rsp.op_errno,</div><div class='add'>+                                   rsp.op_errstr);</div><div class='add'>+            ret = 0;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        cli_err("%s", msg);</div><div class='add'>+        if (local &amp;&amp; local-&gt;all) {</div><div class='add'>+            ret = 0;</div><div class='add'>+            cli_out(" ");</div><div class='add'>+        } else</div><div class='add'>+            ret = -1;</div><div class='add'>+</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    dict = dict_new();</div><div class='add'>+    if (!dict) {</div><div class='add'>+        gf_log(THIS-&gt;name, GF_LOG_ERROR, "Failed to create the dict");</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_unserialize(rsp.dict.dict_val, rsp.dict.dict_len, &amp;dict);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    ret = dict_get_uint32(dict, "cmd", &amp;cmd);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    if ((cmd &amp; GF_CLI_STATUS_ALL)) {</div><div class='add'>+        if (local &amp;&amp; local-&gt;dict) {</div><div class='add'>+            dict_ref(dict);</div><div class='add'>+            ret = dict_set_static_ptr(local-&gt;dict, "rsp-dict", dict);</div><div class='add'>+            ret = 0;</div><div class='add'>+        } else {</div><div class='add'>+            gf_log("cli", GF_LOG_ERROR, "local not found");</div><div class='add'>+            ret = -1;</div><div class='add'>+        }</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (global_state-&gt;mode &amp; GLUSTER_MODE_XML) {</div><div class='add'>+        if (!local-&gt;all) {</div><div class='add'>+            ret = cli_xml_output_vol_status_begin(local, rsp.op_ret,</div><div class='add'>+                                                  rsp.op_errno, rsp.op_errstr);</div><div class='add'>+            if (ret) {</div><div class='add'>+                gf_log("cli", GF_LOG_ERROR, XML_ERROR);</div><div class='add'>+                goto xml_end;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+        if (cmd &amp; GF_CLI_STATUS_TASKS) {</div><div class='add'>+            ret = cli_xml_output_vol_status_tasks_detail(local, dict);</div><div class='add'>+            if (ret) {</div><div class='add'>+                gf_log("cli", GF_LOG_ERROR, "Error outputting to xml");</div><div class='add'>+                goto xml_end;</div><div class='add'>+            }</div><div class='add'>+        } else {</div><div class='add'>+            ret = cli_xml_output_vol_status(local, dict);</div><div class='add'>+            if (ret) {</div><div class='add'>+                gf_log("cli", GF_LOG_ERROR, XML_ERROR);</div><div class='add'>+                goto xml_end;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+    xml_end:</div><div class='add'>+        if (!local-&gt;all) {</div><div class='add'>+            ret = cli_xml_output_vol_status_end(local);</div><div class='add'>+            if (ret) {</div><div class='add'>+                gf_log("cli", GF_LOG_ERROR, XML_ERROR);</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if ((cmd &amp; GF_CLI_STATUS_NFS) || (cmd &amp; GF_CLI_STATUS_SHD) ||</div><div class='add'>+        (cmd &amp; GF_CLI_STATUS_QUOTAD) || (cmd &amp; GF_CLI_STATUS_SNAPD) ||</div><div class='add'>+        (cmd &amp; GF_CLI_STATUS_BITD) || (cmd &amp; GF_CLI_STATUS_SCRUB))</div><div class='add'>+        notbrick = _gf_true;</div><div class='add'>+</div><div class='add'>+    switch (cmd &amp; GF_CLI_STATUS_MASK) {</div><div class='add'>+        case GF_CLI_STATUS_MEM:</div><div class='add'>+            cli_print_volume_status_mem(dict, notbrick);</div><div class='add'>+            goto cont;</div><div class='add'>+            break;</div><div class='add'>+        case GF_CLI_STATUS_CLIENTS:</div><div class='add'>+            cli_print_volume_status_clients(dict, notbrick);</div><div class='add'>+            goto cont;</div><div class='add'>+            break;</div><div class='add'>+        case GF_CLI_STATUS_CLIENT_LIST:</div><div class='add'>+            cli_print_volume_status_client_list(dict, notbrick);</div><div class='add'>+            goto cont;</div><div class='add'>+            break;</div><div class='add'>+        case GF_CLI_STATUS_INODE:</div><div class='add'>+            cli_print_volume_status_inode(dict, notbrick);</div><div class='add'>+            goto cont;</div><div class='add'>+            break;</div><div class='add'>+        case GF_CLI_STATUS_FD:</div><div class='add'>+            cli_print_volume_status_fd(dict, notbrick);</div><div class='add'>+            goto cont;</div><div class='add'>+            break;</div><div class='add'>+        case GF_CLI_STATUS_CALLPOOL:</div><div class='add'>+            cli_print_volume_status_callpool(dict, notbrick);</div><div class='add'>+            goto cont;</div><div class='add'>+            break;</div><div class='add'>+        case GF_CLI_STATUS_TASKS:</div><div class='add'>+            cli_print_volume_status_tasks(dict);</div><div class='add'>+            goto cont;</div><div class='add'>+            break;</div><div class='add'>+        default:</div><div class='add'>+            break;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_get_str_sizen(dict, "volname", &amp;volname);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    ret = dict_get_int32_sizen(dict, "brick-index-max", &amp;brick_index_max);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    ret = dict_get_int32_sizen(dict, "other-count", &amp;other_count);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    index_max = brick_index_max + other_count;</div><div class='add'>+</div><div class='add'>+    ret = dict_get_int32_sizen(dict, "type", &amp;type);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    ret = dict_get_int32_sizen(dict, "hot_brick_count", &amp;hot_brick_count);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    cli_out("Status of volume: %s", volname);</div><div class='add'>+</div><div class='add'>+    if ((cmd &amp; GF_CLI_STATUS_DETAIL) == 0) {</div><div class='add'>+        cli_out("%-*s %s  %s  %s  %s", CLI_VOL_STATUS_BRICK_LEN,</div><div class='add'>+                "Gluster process", "TCP Port", "RDMA Port", "Online", "Pid");</div><div class='add'>+        cli_print_line(CLI_BRICK_STATUS_LINE_LEN);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    status.brick = GF_MALLOC(PATH_MAX + 256, gf_common_mt_strdup);</div><div class='add'>+    if (!status.brick) {</div><div class='add'>+        errno = ENOMEM;</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt;= index_max; i++) {</div><div class='add'>+        status.rdma_port = 0;</div><div class='add'>+</div><div class='add'>+        snprintf(key, sizeof(key), "brick%d.hostname", i);</div><div class='add'>+        ret = dict_get_str(dict, key, &amp;hostname);</div><div class='add'>+        if (ret)</div><div class='add'>+            continue;</div><div class='add'>+</div><div class='add'>+        snprintf(key, sizeof(key), "brick%d.path", i);</div><div class='add'>+        ret = dict_get_str(dict, key, &amp;path);</div><div class='add'>+        if (ret)</div><div class='add'>+            continue;</div><div class='add'>+</div><div class='add'>+        /* Brick/not-brick is handled separately here as all</div><div class='add'>+         * types of nodes are contained in the default output</div><div class='add'>+         */</div><div class='add'>+        status.brick[0] = '\0';</div><div class='add'>+        if (!strcmp(hostname, "NFS Server") ||</div><div class='add'>+            !strcmp(hostname, "Self-heal Daemon") ||</div><div class='add'>+            !strcmp(hostname, "Quota Daemon") ||</div><div class='add'>+            !strcmp(hostname, "Snapshot Daemon") ||</div><div class='add'>+            !strcmp(hostname, "Scrubber Daemon") ||</div><div class='add'>+            !strcmp(hostname, "Bitrot Daemon"))</div><div class='add'>+            snprintf(status.brick, PATH_MAX + 255, "%s on %s", hostname, path);</div><div class='add'>+        else {</div><div class='add'>+            snprintf(key, sizeof(key), "brick%d.rdma_port", i);</div><div class='add'>+            ret = dict_get_int32(dict, key, &amp;(status.rdma_port));</div><div class='add'>+            if (ret)</div><div class='add'>+                continue;</div><div class='add'>+            snprintf(status.brick, PATH_MAX + 255, "Brick %s:%s", hostname,</div><div class='add'>+                     path);</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        snprintf(key, sizeof(key), "brick%d.port", i);</div><div class='add'>+        ret = dict_get_int32(dict, key, &amp;(status.port));</div><div class='add'>+        if (ret)</div><div class='add'>+            continue;</div><div class='add'>+</div><div class='add'>+        snprintf(key, sizeof(key), "brick%d.status", i);</div><div class='add'>+        ret = dict_get_int32(dict, key, &amp;(status.online));</div><div class='add'>+        if (ret)</div><div class='add'>+            continue;</div><div class='add'>+</div><div class='add'>+        snprintf(key, sizeof(key), "brick%d.pid", i);</div><div class='add'>+        ret = dict_get_int32(dict, key, &amp;pid);</div><div class='add'>+        if (ret)</div><div class='add'>+            continue;</div><div class='add'>+        if (pid == -1)</div><div class='add'>+            ret = gf_asprintf(&amp;(status.pid_str), "%s", "N/A");</div><div class='add'>+        else</div><div class='add'>+            ret = gf_asprintf(&amp;(status.pid_str), "%d", pid);</div><div class='add'>+</div><div class='add'>+        if (ret == -1)</div><div class='add'>+            goto out;</div><div class='add'>+</div><div class='add'>+        if ((cmd &amp; GF_CLI_STATUS_DETAIL)) {</div><div class='add'>+            ret = cli_get_detail_status(dict, i, &amp;status);</div><div class='add'>+            if (ret)</div><div class='add'>+                goto out;</div><div class='add'>+            cli_print_line(CLI_BRICK_STATUS_LINE_LEN);</div><div class='add'>+            cli_print_detailed_status(&amp;status);</div><div class='add'>+        } else {</div><div class='add'>+            cli_print_brick_status(&amp;status);</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        /* Allocatated memory using gf_asprintf*/</div><div class='add'>+        GF_FREE(status.pid_str);</div><div class='add'>+    }</div><div class='add'>+    cli_out(" ");</div><div class='add'>+</div><div class='add'>+    if ((cmd &amp; GF_CLI_STATUS_MASK) == GF_CLI_STATUS_NONE)</div><div class='add'>+        cli_print_volume_status_tasks(dict);</div><div class='add'>+cont:</div><div class='add'>+    ret = rsp.op_ret;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (dict)</div><div class='add'>+        dict_unref(dict);</div><div class='add'>+    GF_FREE(status.brick);</div><div class='add'>+    if (local &amp;&amp; wipe_local) {</div><div class='add'>+        cli_local_wipe(local);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    cli_cmd_broadcast_response(ret);</div><div class='add'>+    gf_free_xdr_cli_rsp(rsp);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int32_t</div><div class='add'>+gf_cli_status_volume(call_frame_t *frame, xlator_t *this, void *data)</div><div class='add'>+{</div><div class='add'>+    gf_cli_req req = {{</div><div class='add'>+        0,</div><div class='add'>+    }};</div><div class='add'>+    int ret = -1;</div><div class='add'>+    dict_t *dict = NULL;</div><div class='add'>+</div><div class='add'>+    dict = data;</div><div class='add'>+</div><div class='add'>+    ret = cli_to_glusterd(&amp;req, frame, gf_cli_status_cbk,</div><div class='add'>+                          (xdrproc_t)xdr_gf_cli_req, dict,</div><div class='add'>+                          GLUSTER_CLI_STATUS_VOLUME, this, cli_rpc_prog, NULL);</div><div class='add'>+    gf_log("cli", GF_LOG_DEBUG, RETURNING, ret);</div><div class='add'>+    GF_FREE(req.dict.dict_val);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+gf_cli_status_volume_all(call_frame_t *frame, xlator_t *this, void *data)</div><div class='add'>+{</div><div class='add'>+    int i = 0;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int vol_count = -1;</div><div class='add'>+    uint32_t cmd = 0;</div><div class='add'>+    char key[1024] = {0};</div><div class='add'>+    char *volname = NULL;</div><div class='add'>+    void *vol_dict = NULL;</div><div class='add'>+    dict_t *dict = NULL;</div><div class='add'>+    cli_local_t *local = NULL;</div><div class='add'>+</div><div class='add'>+    if (!frame)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    if (!frame-&gt;local)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+</div><div class='add'>+    ret = dict_get_uint32(local-&gt;dict, "cmd", &amp;cmd);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    local-&gt;all = _gf_true;</div><div class='add'>+</div><div class='add'>+    ret = gf_cli_status_volume(frame, this, data);</div><div class='add'>+</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    ret = dict_get_ptr(local-&gt;dict, "rsp-dict", &amp;vol_dict);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    ret = dict_get_int32_sizen((dict_t *)vol_dict, "vol_count", &amp;vol_count);</div><div class='add'>+    if (ret) {</div><div class='add'>+        cli_err("Failed to get names of volumes");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* remove the "all" flag in cmd */</div><div class='add'>+    cmd &amp;= ~GF_CLI_STATUS_ALL;</div><div class='add'>+    cmd |= GF_CLI_STATUS_VOL;</div><div class='add'>+</div><div class='add'>+    if (global_state-&gt;mode &amp; GLUSTER_MODE_XML) {</div><div class='add'>+        // TODO: Pass proper op_* values</div><div class='add'>+        ret = cli_xml_output_vol_status_begin(local, 0, 0, NULL);</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_log("cli", GF_LOG_ERROR, XML_ERROR);</div><div class='add'>+            goto xml_end;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (vol_count == 0 &amp;&amp; !(global_state-&gt;mode &amp; GLUSTER_MODE_XML)) {</div><div class='add'>+        cli_err("No volumes present");</div><div class='add'>+        ret = 0;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; vol_count; i++) {</div><div class='add'>+        dict = dict_new();</div><div class='add'>+        if (!dict)</div><div class='add'>+            goto out;</div><div class='add'>+</div><div class='add'>+        ret = snprintf(key, sizeof(key), "vol%d", i);</div><div class='add'>+        ret = dict_get_strn(vol_dict, key, ret, &amp;volname);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+</div><div class='add'>+        ret = dict_set_str_sizen(dict, "volname", volname);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+</div><div class='add'>+        ret = dict_set_uint32(dict, "cmd", cmd);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+</div><div class='add'>+        ret = gf_cli_status_volume(frame, this, dict);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+</div><div class='add'>+        dict_unref(dict);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+xml_end:</div><div class='add'>+    if (global_state-&gt;mode &amp; GLUSTER_MODE_XML) {</div><div class='add'>+        ret = cli_xml_output_vol_status_end(local);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (ret)</div><div class='add'>+        gf_log("cli", GF_LOG_ERROR, "status all failed");</div><div class='add'>+</div><div class='add'>+    if (vol_dict)</div><div class='add'>+        dict_unref(vol_dict);</div><div class='add'>+</div><div class='add'>+    if (ret &amp;&amp; dict)</div><div class='add'>+        dict_unref(dict);</div><div class='add'>+</div><div class='add'>+    if (local)</div><div class='add'>+        cli_local_wipe(local);</div><div class='add'>+</div><div class='add'>+    if (frame)</div><div class='add'>+        frame-&gt;local = NULL;</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+gf_cli_mount_cbk(struct rpc_req *req, struct iovec *iov, int count,</div><div class='add'>+                 void *myframe)</div><div class='add'>+{</div><div class='add'>+    gf1_cli_mount_rsp rsp = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(myframe);</div><div class='add'>+</div><div class='add'>+    if (-1 == req-&gt;rpc_status) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = xdr_to_generic(*iov, &amp;rsp, (xdrproc_t)xdr_gf1_cli_mount_rsp);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        gf_log(((call_frame_t *)myframe)-&gt;this-&gt;name, GF_LOG_ERROR,</div><div class='add'>+               XDR_DECODE_FAIL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    gf_log("cli", GF_LOG_INFO, "Received resp to mount");</div><div class='add'>+</div><div class='add'>+    if (rsp.op_ret == 0) {</div><div class='add'>+        ret = 0;</div><div class='add'>+        cli_out("%s", rsp.path);</div><div class='add'>+    } else {</div><div class='add'>+        /* weird sounding but easy to parse... */</div><div class='add'>+        cli_err("%d : failed with this errno (%s)", rsp.op_errno,</div><div class='add'>+                strerror(rsp.op_errno));</div><div class='add'>+        ret = -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    cli_cmd_broadcast_response(ret);</div><div class='add'>+    if (rsp.path) {</div><div class='add'>+        free(rsp.path);</div><div class='add'>+    }</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int32_t</div><div class='add'>+gf_cli_mount(call_frame_t *frame, xlator_t *this, void *data)</div><div class='add'>+{</div><div class='add'>+    gf1_cli_mount_req req = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int ret = -1;</div><div class='add'>+    void **dataa = data;</div><div class='add'>+    char *label = NULL;</div><div class='add'>+    dict_t *dict = NULL;</div><div class='add'>+</div><div class='add'>+    if (!frame || !this || !data)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    label = dataa[0];</div><div class='add'>+    dict = dataa[1];</div><div class='add'>+</div><div class='add'>+    req.label = label;</div><div class='add'>+    ret = dict_allocate_and_serialize(dict, &amp;req.dict.dict_val,</div><div class='add'>+                                      &amp;req.dict.dict_len);</div><div class='add'>+    if (ret) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = cli_cmd_submit(NULL, &amp;req, frame, cli_rpc_prog, GLUSTER_CLI_MOUNT,</div><div class='add'>+                         NULL, this, gf_cli_mount_cbk,</div><div class='add'>+                         (xdrproc_t)xdr_gf1_cli_mount_req);</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    GF_FREE(req.dict.dict_val);</div><div class='add'>+    gf_log("cli", GF_LOG_DEBUG, RETURNING, ret);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+gf_cli_umount_cbk(struct rpc_req *req, struct iovec *iov, int count,</div><div class='add'>+                  void *myframe)</div><div class='add'>+{</div><div class='add'>+    gf1_cli_umount_rsp rsp = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(myframe);</div><div class='add'>+</div><div class='add'>+    if (-1 == req-&gt;rpc_status) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = xdr_to_generic(*iov, &amp;rsp, (xdrproc_t)xdr_gf1_cli_umount_rsp);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        gf_log(((call_frame_t *)myframe)-&gt;this-&gt;name, GF_LOG_ERROR,</div><div class='add'>+               XDR_DECODE_FAIL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    gf_log("cli", GF_LOG_INFO, "Received resp to mount");</div><div class='add'>+</div><div class='add'>+    if (rsp.op_ret == 0)</div><div class='add'>+        ret = 0;</div><div class='add'>+    else {</div><div class='add'>+        cli_err("umount failed");</div><div class='add'>+        ret = -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    cli_cmd_broadcast_response(ret);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int32_t</div><div class='add'>+gf_cli_umount(call_frame_t *frame, xlator_t *this, void *data)</div><div class='add'>+{</div><div class='add'>+    gf1_cli_umount_req req = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int ret = -1;</div><div class='add'>+    dict_t *dict = NULL;</div><div class='add'>+</div><div class='add'>+    if (!frame || !this || !data)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    dict = data;</div><div class='add'>+</div><div class='add'>+    ret = dict_get_str_sizen(dict, "path", &amp;req.path);</div><div class='add'>+    if (ret == 0)</div><div class='add'>+        ret = dict_get_int32_sizen(dict, "lazy", &amp;req.lazy);</div><div class='add'>+</div><div class='add'>+    if (ret) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = cli_cmd_submit(NULL, &amp;req, frame, cli_rpc_prog, GLUSTER_CLI_UMOUNT,</div><div class='add'>+                         NULL, this, gf_cli_umount_cbk,</div><div class='add'>+                         (xdrproc_t)xdr_gf1_cli_umount_req);</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    gf_log("cli", GF_LOG_DEBUG, RETURNING, ret);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+cmd_heal_volume_statistics_out(dict_t *dict, int brick)</div><div class='add'>+{</div><div class='add'>+    uint64_t num_entries = 0;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    char key[256] = {0};</div><div class='add'>+    char *hostname = NULL;</div><div class='add'>+    uint64_t i = 0;</div><div class='add'>+    uint64_t healed_count = 0;</div><div class='add'>+    uint64_t split_brain_count = 0;</div><div class='add'>+    uint64_t heal_failed_count = 0;</div><div class='add'>+    char *start_time_str = NULL;</div><div class='add'>+    char *end_time_str = NULL;</div><div class='add'>+    char *crawl_type = NULL;</div><div class='add'>+    int progress = -1;</div><div class='add'>+</div><div class='add'>+    snprintf(key, sizeof key, "%d-hostname", brick);</div><div class='add'>+    ret = dict_get_str(dict, key, &amp;hostname);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+    cli_out("------------------------------------------------");</div><div class='add'>+    cli_out("\nCrawl statistics for brick no %d", brick);</div><div class='add'>+    cli_out("Hostname of brick %s", hostname);</div><div class='add'>+</div><div class='add'>+    snprintf(key, sizeof key, "statistics-%d-count", brick);</div><div class='add'>+    ret = dict_get_uint64(dict, key, &amp;num_entries);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; num_entries; i++) {</div><div class='add'>+        snprintf(key, sizeof key, "statistics_crawl_type-%d-%" PRIu64, brick,</div><div class='add'>+                 i);</div><div class='add'>+        ret = dict_get_str(dict, key, &amp;crawl_type);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+</div><div class='add'>+        snprintf(key, sizeof key, "statistics_healed_cnt-%d-%" PRIu64, brick,</div><div class='add'>+                 i);</div><div class='add'>+        ret = dict_get_uint64(dict, key, &amp;healed_count);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+</div><div class='add'>+        snprintf(key, sizeof key, "statistics_sb_cnt-%d-%" PRIu64, brick, i);</div><div class='add'>+        ret = dict_get_uint64(dict, key, &amp;split_brain_count);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+        snprintf(key, sizeof key, "statistics_heal_failed_cnt-%d-%" PRIu64,</div><div class='add'>+                 brick, i);</div><div class='add'>+        ret = dict_get_uint64(dict, key, &amp;heal_failed_count);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+        snprintf(key, sizeof key, "statistics_strt_time-%d-%" PRIu64, brick, i);</div><div class='add'>+        ret = dict_get_str(dict, key, &amp;start_time_str);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+        snprintf(key, sizeof key, "statistics_end_time-%d-%" PRIu64, brick, i);</div><div class='add'>+        ret = dict_get_str(dict, key, &amp;end_time_str);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+        snprintf(key, sizeof key, "statistics_inprogress-%d-%" PRIu64, brick,</div><div class='add'>+                 i);</div><div class='add'>+        ret = dict_get_int32(dict, key, &amp;progress);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+</div><div class='add'>+        cli_out("\nStarting time of crawl: %s", start_time_str);</div><div class='add'>+        if (progress == 1)</div><div class='add'>+            cli_out("Crawl is in progress");</div><div class='add'>+        else</div><div class='add'>+            cli_out("Ending time of crawl: %s", end_time_str);</div><div class='add'>+</div><div class='add'>+        cli_out("Type of crawl: %s", crawl_type);</div><div class='add'>+        cli_out("No. of entries healed: %" PRIu64, healed_count);</div><div class='add'>+        cli_out("No. of entries in split-brain: %" PRIu64, split_brain_count);</div><div class='add'>+        cli_out("No. of heal failed entries: %" PRIu64, heal_failed_count);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+cmd_heal_volume_brick_out(dict_t *dict, int brick)</div><div class='add'>+{</div><div class='add'>+    uint64_t num_entries = 0;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    char key[64] = {0};</div><div class='add'>+    char *hostname = NULL;</div><div class='add'>+    char *path = NULL;</div><div class='add'>+    char *status = NULL;</div><div class='add'>+    uint64_t i = 0;</div><div class='add'>+    uint32_t time = 0;</div><div class='add'>+    char timestr[GF_TIMESTR_SIZE] = {0};</div><div class='add'>+    char *shd_status = NULL;</div><div class='add'>+</div><div class='add'>+    snprintf(key, sizeof key, "%d-hostname", brick);</div><div class='add'>+    ret = dict_get_str(dict, key, &amp;hostname);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+    snprintf(key, sizeof key, "%d-path", brick);</div><div class='add'>+    ret = dict_get_str(dict, key, &amp;path);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+    cli_out("\nBrick %s:%s", hostname, path);</div><div class='add'>+</div><div class='add'>+    snprintf(key, sizeof key, "%d-status", brick);</div><div class='add'>+    ret = dict_get_str(dict, key, &amp;status);</div><div class='add'>+    if (status &amp;&amp; status[0] != '\0')</div><div class='add'>+        cli_out("Status: %s", status);</div><div class='add'>+</div><div class='add'>+    snprintf(key, sizeof key, "%d-shd-status", brick);</div><div class='add'>+    ret = dict_get_str(dict, key, &amp;shd_status);</div><div class='add'>+</div><div class='add'>+    if (!shd_status) {</div><div class='add'>+        snprintf(key, sizeof key, "%d-count", brick);</div><div class='add'>+        ret = dict_get_uint64(dict, key, &amp;num_entries);</div><div class='add'>+        cli_out("Number of entries: %" PRIu64, num_entries);</div><div class='add'>+</div><div class='add'>+        for (i = 0; i &lt; num_entries; i++) {</div><div class='add'>+            snprintf(key, sizeof key, "%d-%" PRIu64, brick, i);</div><div class='add'>+            ret = dict_get_str(dict, key, &amp;path);</div><div class='add'>+            if (ret)</div><div class='add'>+                continue;</div><div class='add'>+            time = 0;</div><div class='add'>+            snprintf(key, sizeof key, "%d-%" PRIu64 "-time", brick, i);</div><div class='add'>+            ret = dict_get_uint32(dict, key, &amp;time);</div><div class='add'>+            if (ret || !time) {</div><div class='add'>+                cli_out("%s", path);</div><div class='add'>+            } else {</div><div class='add'>+                gf_time_fmt(timestr, sizeof timestr, time, gf_timefmt_FT);</div><div class='add'>+                if (i == 0) {</div><div class='add'>+                    cli_out("at                    path on brick");</div><div class='add'>+                    cli_out("-----------------------------------");</div><div class='add'>+                }</div><div class='add'>+                cli_out("%s %s", timestr, path);</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+cmd_heal_volume_statistics_heal_count_out(dict_t *dict, int brick)</div><div class='add'>+{</div><div class='add'>+    uint64_t num_entries = 0;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    char key[64] = {0};</div><div class='add'>+    char *hostname = NULL;</div><div class='add'>+    char *path = NULL;</div><div class='add'>+    char *status = NULL;</div><div class='add'>+    char *shd_status = NULL;</div><div class='add'>+</div><div class='add'>+    snprintf(key, sizeof key, "%d-hostname", brick);</div><div class='add'>+    ret = dict_get_str(dict, key, &amp;hostname);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+    snprintf(key, sizeof key, "%d-path", brick);</div><div class='add'>+    ret = dict_get_str(dict, key, &amp;path);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+    cli_out("\nBrick %s:%s", hostname, path);</div><div class='add'>+</div><div class='add'>+    snprintf(key, sizeof key, "%d-status", brick);</div><div class='add'>+    ret = dict_get_str(dict, key, &amp;status);</div><div class='add'>+    if (status &amp;&amp; strlen(status))</div><div class='add'>+        cli_out("Status: %s", status);</div><div class='add'>+</div><div class='add'>+    snprintf(key, sizeof key, "%d-shd-status", brick);</div><div class='add'>+    ret = dict_get_str(dict, key, &amp;shd_status);</div><div class='add'>+</div><div class='add'>+    if (!shd_status) {</div><div class='add'>+        snprintf(key, sizeof key, "%d-hardlinks", brick);</div><div class='add'>+        ret = dict_get_uint64(dict, key, &amp;num_entries);</div><div class='add'>+        if (ret)</div><div class='add'>+            cli_out("No gathered input for this brick");</div><div class='add'>+        else</div><div class='add'>+            cli_out("Number of entries: %" PRIu64, num_entries);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+gf_is_cli_heal_get_command(gf_xl_afr_op_t heal_op)</div><div class='add'>+{</div><div class='add'>+    /* If the command is get command value is 1 otherwise 0, for</div><div class='add'>+       invalid commands -1 */</div><div class='add'>+    static int get_cmds[GF_SHD_OP_HEAL_DISABLE + 1] = {</div><div class='add'>+        [GF_SHD_OP_INVALID] = -1,</div><div class='add'>+        [GF_SHD_OP_HEAL_INDEX] = 0,</div><div class='add'>+        [GF_SHD_OP_HEAL_FULL] = 0,</div><div class='add'>+        [GF_SHD_OP_INDEX_SUMMARY] = 1,</div><div class='add'>+        [GF_SHD_OP_SPLIT_BRAIN_FILES] = 1,</div><div class='add'>+        [GF_SHD_OP_STATISTICS] = 1,</div><div class='add'>+        [GF_SHD_OP_STATISTICS_HEAL_COUNT] = 1,</div><div class='add'>+        [GF_SHD_OP_STATISTICS_HEAL_COUNT_PER_REPLICA] = 1,</div><div class='add'>+        [GF_SHD_OP_HEAL_ENABLE] = 0,</div><div class='add'>+        [GF_SHD_OP_HEAL_DISABLE] = 0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    if (heal_op &gt; GF_SHD_OP_INVALID &amp;&amp; heal_op &lt;= GF_SHD_OP_HEAL_DISABLE)</div><div class='add'>+        return get_cmds[heal_op] == 1;</div><div class='add'>+    return _gf_false;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+gf_cli_heal_volume_cbk(struct rpc_req *req, struct iovec *iov, int count,</div><div class='add'>+                       void *myframe)</div><div class='add'>+{</div><div class='add'>+    gf_cli_rsp rsp = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int ret = -1;</div><div class='add'>+    cli_local_t *local = NULL;</div><div class='add'>+    char *volname = NULL;</div><div class='add'>+    call_frame_t *frame = NULL;</div><div class='add'>+    dict_t *dict = NULL;</div><div class='add'>+    int brick_count = 0;</div><div class='add'>+    int i = 0;</div><div class='add'>+    gf_xl_afr_op_t heal_op = GF_SHD_OP_INVALID;</div><div class='add'>+    const char *operation = NULL;</div><div class='add'>+    const char *substr = NULL;</div><div class='add'>+    const char *heal_op_str = NULL;</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(myframe);</div><div class='add'>+</div><div class='add'>+    if (-1 == req-&gt;rpc_status) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    frame = myframe;</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(frame-&gt;local);</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+</div><div class='add'>+    ret = xdr_to_generic(*iov, &amp;rsp, (xdrproc_t)xdr_gf_cli_rsp);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        gf_log(frame-&gt;this-&gt;name, GF_LOG_ERROR, XDR_DECODE_FAIL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_get_int32_sizen(local-&gt;dict, "heal-op", (int32_t *)&amp;heal_op);</div><div class='add'>+    // TODO: Proper XML output</div><div class='add'>+    //#if (HAVE_LIB_XML)</div><div class='add'>+    //        if (global_state-&gt;mode &amp; GLUSTER_MODE_XML) {</div><div class='add'>+    //                ret = cli_xml_output_dict ("volHeal", dict, rsp.op_ret,</div><div class='add'>+    //                                           rsp.op_errno, rsp.op_errstr);</div><div class='add'>+    //                if (ret)</div><div class='add'>+    //                        gf_log ("cli", GF_LOG_ERROR, XML_ERROR);</div><div class='add'>+    //                goto out;</div><div class='add'>+    //        }</div><div class='add'>+    //#endif</div><div class='add'>+</div><div class='add'>+    ret = dict_get_str_sizen(local-&gt;dict, "volname", &amp;volname);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log(frame-&gt;this-&gt;name, GF_LOG_ERROR, "failed to get volname");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    gf_log("cli", GF_LOG_INFO, "Received resp to heal volume");</div><div class='add'>+</div><div class='add'>+    operation = "Gathering ";</div><div class='add'>+    substr = "";</div><div class='add'>+    switch (heal_op) {</div><div class='add'>+        case GF_SHD_OP_HEAL_INDEX:</div><div class='add'>+            operation = "Launching heal operation ";</div><div class='add'>+            heal_op_str = "to perform index self heal";</div><div class='add'>+            substr = "\nUse heal info commands to check status.";</div><div class='add'>+            break;</div><div class='add'>+        case GF_SHD_OP_HEAL_FULL:</div><div class='add'>+            operation = "Launching heal operation ";</div><div class='add'>+            heal_op_str = "to perform full self heal";</div><div class='add'>+            substr = "\nUse heal info commands to check status.";</div><div class='add'>+            break;</div><div class='add'>+        case GF_SHD_OP_INDEX_SUMMARY:</div><div class='add'>+            heal_op_str = "list of entries to be healed";</div><div class='add'>+            break;</div><div class='add'>+        case GF_SHD_OP_SPLIT_BRAIN_FILES:</div><div class='add'>+            heal_op_str = "list of split brain entries";</div><div class='add'>+            break;</div><div class='add'>+        case GF_SHD_OP_STATISTICS:</div><div class='add'>+            heal_op_str = "crawl statistics";</div><div class='add'>+            break;</div><div class='add'>+        case GF_SHD_OP_STATISTICS_HEAL_COUNT:</div><div class='add'>+            heal_op_str = "count of entries to be healed";</div><div class='add'>+            break;</div><div class='add'>+        case GF_SHD_OP_STATISTICS_HEAL_COUNT_PER_REPLICA:</div><div class='add'>+            heal_op_str = "count of entries to be healed per replica";</div><div class='add'>+            break;</div><div class='add'>+        case GF_SHD_OP_SBRAIN_HEAL_FROM_BIGGER_FILE:</div><div class='add'>+        case GF_SHD_OP_SBRAIN_HEAL_FROM_LATEST_MTIME:</div><div class='add'>+        case GF_SHD_OP_SBRAIN_HEAL_FROM_BRICK:</div><div class='add'>+        case GF_SHD_OP_HEAL_SUMMARY:</div><div class='add'>+        case GF_SHD_OP_HEALED_FILES:</div><div class='add'>+        case GF_SHD_OP_HEAL_FAILED_FILES:</div><div class='add'>+            /* These cases are never hit; they're coded just to silence the</div><div class='add'>+             * compiler warnings.*/</div><div class='add'>+            break;</div><div class='add'>+</div><div class='add'>+        case GF_SHD_OP_INVALID:</div><div class='add'>+            heal_op_str = "invalid heal op";</div><div class='add'>+            break;</div><div class='add'>+        case GF_SHD_OP_HEAL_ENABLE:</div><div class='add'>+            operation = "";</div><div class='add'>+            heal_op_str = "Enable heal";</div><div class='add'>+            break;</div><div class='add'>+        case GF_SHD_OP_HEAL_DISABLE:</div><div class='add'>+            operation = "";</div><div class='add'>+            heal_op_str = "Disable heal";</div><div class='add'>+            break;</div><div class='add'>+        case GF_SHD_OP_GRANULAR_ENTRY_HEAL_ENABLE:</div><div class='add'>+            operation = "";</div><div class='add'>+            heal_op_str = "Enable granular entry heal";</div><div class='add'>+            break;</div><div class='add'>+        case GF_SHD_OP_GRANULAR_ENTRY_HEAL_DISABLE:</div><div class='add'>+            operation = "";</div><div class='add'>+            heal_op_str = "Disable granular entry heal";</div><div class='add'>+            break;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (rsp.op_ret) {</div><div class='add'>+        if (strcmp(rsp.op_errstr, "")) {</div><div class='add'>+            cli_err("%s%s on volume %s has been unsuccessful:", operation,</div><div class='add'>+                    heal_op_str, volname);</div><div class='add'>+            cli_err("%s", rsp.op_errstr);</div><div class='add'>+        }</div><div class='add'>+        ret = rsp.op_ret;</div><div class='add'>+        goto out;</div><div class='add'>+    } else {</div><div class='add'>+        cli_out("%s%s on volume %s has been successful %s", operation,</div><div class='add'>+                heal_op_str, volname, substr);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = rsp.op_ret;</div><div class='add'>+    if (!gf_is_cli_heal_get_command(heal_op))</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    dict = dict_new();</div><div class='add'>+    if (!dict) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_unserialize(rsp.dict.dict_val, rsp.dict.dict_len, &amp;dict);</div><div class='add'>+</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log("", GF_LOG_ERROR, DICT_UNSERIALIZE_FAIL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_get_int32_sizen(dict, "count", &amp;brick_count);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    if (!brick_count) {</div><div class='add'>+        cli_err("All bricks of volume %s are down.", volname);</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    switch (heal_op) {</div><div class='add'>+        case GF_SHD_OP_STATISTICS:</div><div class='add'>+            for (i = 0; i &lt; brick_count; i++)</div><div class='add'>+                cmd_heal_volume_statistics_out(dict, i);</div><div class='add'>+            break;</div><div class='add'>+        case GF_SHD_OP_STATISTICS_HEAL_COUNT:</div><div class='add'>+        case GF_SHD_OP_STATISTICS_HEAL_COUNT_PER_REPLICA:</div><div class='add'>+            for (i = 0; i &lt; brick_count; i++)</div><div class='add'>+                cmd_heal_volume_statistics_heal_count_out(dict, i);</div><div class='add'>+            break;</div><div class='add'>+        case GF_SHD_OP_INDEX_SUMMARY:</div><div class='add'>+        case GF_SHD_OP_SPLIT_BRAIN_FILES:</div><div class='add'>+            for (i = 0; i &lt; brick_count; i++)</div><div class='add'>+                cmd_heal_volume_brick_out(dict, i);</div><div class='add'>+            break;</div><div class='add'>+        default:</div><div class='add'>+            break;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = rsp.op_ret;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    cli_cmd_broadcast_response(ret);</div><div class='add'>+    gf_free_xdr_cli_rsp(rsp);</div><div class='add'>+    if (dict)</div><div class='add'>+        dict_unref(dict);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int32_t</div><div class='add'>+gf_cli_heal_volume(call_frame_t *frame, xlator_t *this, void *data)</div><div class='add'>+{</div><div class='add'>+    gf_cli_req req = {{</div><div class='add'>+        0,</div><div class='add'>+    }};</div><div class='add'>+    int ret = 0;</div><div class='add'>+    dict_t *dict = NULL;</div><div class='add'>+</div><div class='add'>+    dict = data;</div><div class='add'>+</div><div class='add'>+    ret = cli_to_glusterd(&amp;req, frame, gf_cli_heal_volume_cbk,</div><div class='add'>+                          (xdrproc_t)xdr_gf_cli_req, dict,</div><div class='add'>+                          GLUSTER_CLI_HEAL_VOLUME, this, cli_rpc_prog, NULL);</div><div class='add'>+</div><div class='add'>+    gf_log("cli", GF_LOG_DEBUG, RETURNING, ret);</div><div class='add'>+</div><div class='add'>+    GF_FREE(req.dict.dict_val);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int32_t</div><div class='add'>+gf_cli_statedump_volume_cbk(struct rpc_req *req, struct iovec *iov, int count,</div><div class='add'>+                            void *myframe)</div><div class='add'>+{</div><div class='add'>+    gf_cli_rsp rsp = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int ret = -1;</div><div class='add'>+    char msg[1024] = "Volume statedump successful";</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(myframe);</div><div class='add'>+</div><div class='add'>+    if (-1 == req-&gt;rpc_status)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    ret = xdr_to_generic(*iov, &amp;rsp, (xdrproc_t)xdr_gf_cli_rsp);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        gf_log(((call_frame_t *)myframe)-&gt;this-&gt;name, GF_LOG_ERROR,</div><div class='add'>+               XDR_DECODE_FAIL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    gf_log("cli", GF_LOG_DEBUG, "Received response to statedump");</div><div class='add'>+    if (rsp.op_ret)</div><div class='add'>+        snprintf(msg, sizeof(msg), "%s", rsp.op_errstr);</div><div class='add'>+</div><div class='add'>+    if (global_state-&gt;mode &amp; GLUSTER_MODE_XML) {</div><div class='add'>+        ret = cli_xml_output_str("volStatedump", msg, rsp.op_ret, rsp.op_errno,</div><div class='add'>+                                 rsp.op_errstr);</div><div class='add'>+        if (ret)</div><div class='add'>+            gf_log("cli", GF_LOG_ERROR, XML_ERROR);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (rsp.op_ret)</div><div class='add'>+        cli_err("volume statedump: failed: %s", msg);</div><div class='add'>+    else</div><div class='add'>+        cli_out("volume statedump: success");</div><div class='add'>+    ret = rsp.op_ret;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    cli_cmd_broadcast_response(ret);</div><div class='add'>+    gf_free_xdr_cli_rsp(rsp);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int32_t</div><div class='add'>+gf_cli_statedump_volume(call_frame_t *frame, xlator_t *this, void *data)</div><div class='add'>+{</div><div class='add'>+    gf_cli_req req = {{</div><div class='add'>+        0,</div><div class='add'>+    }};</div><div class='add'>+    dict_t *options = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    options = data;</div><div class='add'>+</div><div class='add'>+    ret = cli_to_glusterd(</div><div class='add'>+        &amp;req, frame, gf_cli_statedump_volume_cbk, (xdrproc_t)xdr_gf_cli_req,</div><div class='add'>+        options, GLUSTER_CLI_STATEDUMP_VOLUME, this, cli_rpc_prog, NULL);</div><div class='add'>+    gf_log("cli", GF_LOG_DEBUG, RETURNING, ret);</div><div class='add'>+</div><div class='add'>+    GF_FREE(req.dict.dict_val);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int32_t</div><div class='add'>+gf_cli_list_volume_cbk(struct rpc_req *req, struct iovec *iov, int count,</div><div class='add'>+                       void *myframe)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    gf_cli_rsp rsp = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    dict_t *dict = NULL;</div><div class='add'>+    int vol_count = 0;</div><div class='add'>+    ;</div><div class='add'>+    char *volname = NULL;</div><div class='add'>+    char key[1024] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int i = 0;</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(myframe);</div><div class='add'>+</div><div class='add'>+    if (-1 == req-&gt;rpc_status)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    ret = xdr_to_generic(*iov, &amp;rsp, (xdrproc_t)xdr_gf_cli_rsp);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        gf_log(((call_frame_t *)myframe)-&gt;this-&gt;name, GF_LOG_ERROR,</div><div class='add'>+               XDR_DECODE_FAIL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    dict = dict_new();</div><div class='add'>+    if (!dict) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_unserialize(rsp.dict.dict_val, rsp.dict.dict_len, &amp;dict);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log("cli", GF_LOG_ERROR, DICT_UNSERIALIZE_FAIL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (global_state-&gt;mode &amp; GLUSTER_MODE_XML) {</div><div class='add'>+        ret = cli_xml_output_vol_list(dict, rsp.op_ret, rsp.op_errno,</div><div class='add'>+                                      rsp.op_errstr);</div><div class='add'>+        if (ret)</div><div class='add'>+            gf_log("cli", GF_LOG_ERROR, XML_ERROR);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (rsp.op_ret)</div><div class='add'>+        cli_err("%s", rsp.op_errstr);</div><div class='add'>+    else {</div><div class='add'>+        ret = dict_get_int32_sizen(dict, "count", &amp;vol_count);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+</div><div class='add'>+        if (vol_count == 0) {</div><div class='add'>+            cli_err("No volumes present in cluster");</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+        for (i = 0; i &lt; vol_count; i++) {</div><div class='add'>+            ret = snprintf(key, sizeof(key), "volume%d", i);</div><div class='add'>+            ret = dict_get_strn(dict, key, ret, &amp;volname);</div><div class='add'>+            if (ret)</div><div class='add'>+                goto out;</div><div class='add'>+            cli_out("%s", volname);</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = rsp.op_ret;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    cli_cmd_broadcast_response(ret);</div><div class='add'>+    gf_free_xdr_cli_rsp(rsp);</div><div class='add'>+</div><div class='add'>+    if (dict)</div><div class='add'>+        dict_unref(dict);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int32_t</div><div class='add'>+gf_cli_list_volume(call_frame_t *frame, xlator_t *this, void *data)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    gf_cli_req req = {{</div><div class='add'>+        0,</div><div class='add'>+    }};</div><div class='add'>+</div><div class='add'>+    ret = cli_cmd_submit(NULL, &amp;req, frame, cli_rpc_prog,</div><div class='add'>+                         GLUSTER_CLI_LIST_VOLUME, NULL, this,</div><div class='add'>+                         gf_cli_list_volume_cbk, (xdrproc_t)xdr_gf_cli_req);</div><div class='add'>+    gf_log("cli", GF_LOG_DEBUG, RETURNING, ret);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int32_t</div><div class='add'>+gf_cli_clearlocks_volume_cbk(struct rpc_req *req, struct iovec *iov, int count,</div><div class='add'>+                             void *myframe)</div><div class='add'>+{</div><div class='add'>+    gf_cli_rsp rsp = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int ret = -1;</div><div class='add'>+    char *lk_summary = NULL;</div><div class='add'>+    dict_t *dict = NULL;</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(myframe);</div><div class='add'>+</div><div class='add'>+    if (-1 == req-&gt;rpc_status)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    ret = xdr_to_generic(*iov, &amp;rsp, (xdrproc_t)xdr_gf_cli_rsp);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        gf_log(((call_frame_t *)myframe)-&gt;this-&gt;name, GF_LOG_ERROR,</div><div class='add'>+               XDR_DECODE_FAIL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    gf_log("cli", GF_LOG_DEBUG, "Received response to clear-locks");</div><div class='add'>+</div><div class='add'>+    if (rsp.op_ret) {</div><div class='add'>+        cli_err("Volume clear-locks unsuccessful");</div><div class='add'>+        cli_err("%s", rsp.op_errstr);</div><div class='add'>+</div><div class='add'>+    } else {</div><div class='add'>+        if (!rsp.dict.dict_len) {</div><div class='add'>+            cli_err("Possibly no locks cleared");</div><div class='add'>+            ret = 0;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        dict = dict_new();</div><div class='add'>+</div><div class='add'>+        if (!dict) {</div><div class='add'>+            ret = -1;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        ret = dict_unserialize(rsp.dict.dict_val, rsp.dict.dict_len, &amp;dict);</div><div class='add'>+</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_log("cli", GF_LOG_ERROR, DICT_UNSERIALIZE_FAIL);</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        ret = dict_get_str(dict, "lk-summary", &amp;lk_summary);</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_log("cli", GF_LOG_ERROR,</div><div class='add'>+                   "Unable to get lock summary from dictionary");</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+        cli_out("Volume clear-locks successful");</div><div class='add'>+        cli_out("%s", lk_summary);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = rsp.op_ret;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (dict)</div><div class='add'>+        dict_unref(dict);</div><div class='add'>+    cli_cmd_broadcast_response(ret);</div><div class='add'>+    gf_free_xdr_cli_rsp(rsp);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int32_t</div><div class='add'>+gf_cli_clearlocks_volume(call_frame_t *frame, xlator_t *this, void *data)</div><div class='add'>+{</div><div class='add'>+    gf_cli_req req = {{</div><div class='add'>+        0,</div><div class='add'>+    }};</div><div class='add'>+    dict_t *options = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    options = data;</div><div class='add'>+</div><div class='add'>+    ret = cli_to_glusterd(</div><div class='add'>+        &amp;req, frame, gf_cli_clearlocks_volume_cbk, (xdrproc_t)xdr_gf_cli_req,</div><div class='add'>+        options, GLUSTER_CLI_CLRLOCKS_VOLUME, this, cli_rpc_prog, NULL);</div><div class='add'>+    gf_log("cli", GF_LOG_DEBUG, RETURNING, ret);</div><div class='add'>+</div><div class='add'>+    GF_FREE(req.dict.dict_val);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int32_t</div><div class='add'>+cli_snapshot_remove_reply(gf_cli_rsp *rsp, dict_t *dict, call_frame_t *frame)</div><div class='add'>+{</div><div class='add'>+    int32_t ret = -1;</div><div class='add'>+    char *snap_name = NULL;</div><div class='add'>+    int32_t delete_cmd = -1;</div><div class='add'>+    cli_local_t *local = NULL;</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(frame);</div><div class='add'>+    GF_ASSERT(rsp);</div><div class='add'>+    GF_ASSERT(dict);</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+</div><div class='add'>+    ret = dict_get_int32_sizen(dict, "sub-cmd", &amp;delete_cmd);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log("cli", GF_LOG_ERROR, "Could not get sub-cmd");</div><div class='add'>+        goto end;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if ((global_state-&gt;mode &amp; GLUSTER_MODE_XML) &amp;&amp;</div><div class='add'>+        (delete_cmd == GF_SNAP_DELETE_TYPE_SNAP)) {</div><div class='add'>+        ret = cli_xml_output_snap_delete_begin(local, rsp-&gt;op_ret,</div><div class='add'>+                                               rsp-&gt;op_errno, rsp-&gt;op_errstr);</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_log("cli", GF_LOG_ERROR,</div><div class='add'>+                   "Failed to create xml output for delete");</div><div class='add'>+            goto end;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (rsp-&gt;op_ret &amp;&amp; !(global_state-&gt;mode &amp; GLUSTER_MODE_XML)) {</div><div class='add'>+        cli_err("snapshot delete: failed: %s",</div><div class='add'>+                rsp-&gt;op_errstr ? rsp-&gt;op_errstr</div><div class='add'>+                               : "Please check log file for details");</div><div class='add'>+        ret = rsp-&gt;op_ret;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (delete_cmd == GF_SNAP_DELETE_TYPE_ALL ||</div><div class='add'>+        delete_cmd == GF_SNAP_DELETE_TYPE_VOL) {</div><div class='add'>+        local = ((call_frame_t *)frame)-&gt;local;</div><div class='add'>+        if (!local) {</div><div class='add'>+            ret = -1;</div><div class='add'>+            gf_log("cli", GF_LOG_ERROR, "frame-&gt;local is NULL");</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        /* During first call back of snapshot delete of type</div><div class='add'>+         * ALL and VOL, We will get the snapcount and snapnames.</div><div class='add'>+         * Hence to make the subsequent rpc calls for individual</div><div class='add'>+         * snapshot delete, We need to save it in local dictionary.</div><div class='add'>+         */</div><div class='add'>+        dict_copy(dict, local-&gt;dict);</div><div class='add'>+        ret = 0;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (global_state-&gt;mode &amp; GLUSTER_MODE_XML) {</div><div class='add'>+        ret = cli_xml_snapshot_delete(local, dict, rsp);</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_log("cli", GF_LOG_ERROR,</div><div class='add'>+                   "Failed to create xml output for snapshot delete command");</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+        /* Error out in case of the op already failed */</div><div class='add'>+        if (rsp-&gt;op_ret) {</div><div class='add'>+            ret = rsp-&gt;op_ret;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    } else {</div><div class='add'>+        ret = dict_get_str_sizen(dict, "snapname", &amp;snap_name);</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_log("cli", GF_LOG_ERROR, "Failed to get snapname");</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        cli_out("snapshot delete: %s: snap removed successfully", snap_name);</div><div class='add'>+    }</div><div class='add'>+    ret = 0;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if ((global_state-&gt;mode &amp; GLUSTER_MODE_XML) &amp;&amp;</div><div class='add'>+        (delete_cmd == GF_SNAP_DELETE_TYPE_SNAP)) {</div><div class='add'>+        ret = cli_xml_output_snap_delete_end(local);</div><div class='add'>+    }</div><div class='add'>+end:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+cli_snapshot_config_display(dict_t *dict, gf_cli_rsp *rsp)</div><div class='add'>+{</div><div class='add'>+    char buf[PATH_MAX] = "";</div><div class='add'>+    char *volname = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int config_command = 0;</div><div class='add'>+    uint64_t value = 0;</div><div class='add'>+    uint64_t hard_limit = 0;</div><div class='add'>+    uint64_t soft_limit = 0;</div><div class='add'>+    uint64_t i = 0;</div><div class='add'>+    uint64_t voldisplaycount = 0;</div><div class='add'>+    char *auto_delete = NULL;</div><div class='add'>+    char *snap_activate = NULL;</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(dict);</div><div class='add'>+    GF_ASSERT(rsp);</div><div class='add'>+</div><div class='add'>+    if (rsp-&gt;op_ret) {</div><div class='add'>+        cli_err("Snapshot Config : failed: %s",</div><div class='add'>+                rsp-&gt;op_errstr ? rsp-&gt;op_errstr</div><div class='add'>+                               : "Please check log file for details");</div><div class='add'>+        ret = rsp-&gt;op_ret;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_get_int32_sizen(dict, "config-command", &amp;config_command);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log("cli", GF_LOG_ERROR, "Could not fetch config type");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_get_uint64(dict, "snap-max-hard-limit", &amp;hard_limit);</div><div class='add'>+    /* Ignore the error, as the key specified is optional */</div><div class='add'>+    ret = dict_get_uint64(dict, "snap-max-soft-limit", &amp;soft_limit);</div><div class='add'>+</div><div class='add'>+    ret = dict_get_str_sizen(dict, "auto-delete", &amp;auto_delete);</div><div class='add'>+</div><div class='add'>+    ret = dict_get_str_sizen(dict, "snap-activate-on-create", &amp;snap_activate);</div><div class='add'>+</div><div class='add'>+    if (!hard_limit &amp;&amp; !soft_limit &amp;&amp;</div><div class='add'>+        config_command != GF_SNAP_CONFIG_DISPLAY &amp;&amp; !auto_delete &amp;&amp;</div><div class='add'>+        !snap_activate) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        gf_log(THIS-&gt;name, GF_LOG_ERROR, "Could not fetch config-key");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_get_str_sizen(dict, "volname", &amp;volname);</div><div class='add'>+    /* Ignore the error, as volname is optional */</div><div class='add'>+</div><div class='add'>+    if (!volname) {</div><div class='add'>+        volname = "System";</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    switch (config_command) {</div><div class='add'>+        case GF_SNAP_CONFIG_TYPE_SET:</div><div class='add'>+            if (hard_limit &amp;&amp; soft_limit) {</div><div class='add'>+                cli_out(</div><div class='add'>+                    "snapshot config: snap-max-hard-limit "</div><div class='add'>+                    "&amp; snap-max-soft-limit for system set successfully");</div><div class='add'>+            } else if (hard_limit) {</div><div class='add'>+                cli_out(</div><div class='add'>+                    "snapshot config: snap-max-hard-limit "</div><div class='add'>+                    "for %s set successfully",</div><div class='add'>+                    volname);</div><div class='add'>+            } else if (soft_limit) {</div><div class='add'>+                cli_out(</div><div class='add'>+                    "snapshot config: snap-max-soft-limit "</div><div class='add'>+                    "for %s set successfully",</div><div class='add'>+                    volname);</div><div class='add'>+            } else if (auto_delete) {</div><div class='add'>+                cli_out("snapshot config: auto-delete successfully set");</div><div class='add'>+            } else if (snap_activate) {</div><div class='add'>+                cli_out("snapshot config: activate-on-create successfully set");</div><div class='add'>+            }</div><div class='add'>+            break;</div><div class='add'>+</div><div class='add'>+        case GF_SNAP_CONFIG_DISPLAY:</div><div class='add'>+            cli_out("\nSnapshot System Configuration:");</div><div class='add'>+            ret = dict_get_uint64(dict, "snap-max-hard-limit", &amp;value);</div><div class='add'>+            if (ret) {</div><div class='add'>+                gf_log("cli", GF_LOG_ERROR,</div><div class='add'>+                       "Could not fetch snap_max_hard_limit for %s", volname);</div><div class='add'>+                ret = -1;</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+            cli_out("snap-max-hard-limit : %" PRIu64, value);</div><div class='add'>+</div><div class='add'>+            ret = dict_get_uint64(dict, "snap-max-soft-limit", &amp;soft_limit);</div><div class='add'>+            if (ret) {</div><div class='add'>+                gf_log("cli", GF_LOG_ERROR,</div><div class='add'>+                       "Could not fetch snap-max-soft-limit for %s", volname);</div><div class='add'>+                ret = -1;</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+            cli_out("snap-max-soft-limit : %" PRIu64 "%%", soft_limit);</div><div class='add'>+</div><div class='add'>+            cli_out("auto-delete : %s", auto_delete);</div><div class='add'>+</div><div class='add'>+            cli_out("activate-on-create : %s\n", snap_activate);</div><div class='add'>+</div><div class='add'>+            cli_out("Snapshot Volume Configuration:");</div><div class='add'>+</div><div class='add'>+            ret = dict_get_uint64(dict, "voldisplaycount", &amp;voldisplaycount);</div><div class='add'>+            if (ret) {</div><div class='add'>+                gf_log("cli", GF_LOG_ERROR, "Could not fetch voldisplaycount");</div><div class='add'>+                ret = -1;</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            for (i = 0; i &lt; voldisplaycount; i++) {</div><div class='add'>+                ret = snprintf(buf, sizeof(buf), "volume%" PRIu64 "-volname",</div><div class='add'>+                               i);</div><div class='add'>+                ret = dict_get_strn(dict, buf, ret, &amp;volname);</div><div class='add'>+                if (ret) {</div><div class='add'>+                    gf_log("cli", GF_LOG_ERROR, "Could not fetch %s", buf);</div><div class='add'>+                    ret = -1;</div><div class='add'>+                    goto out;</div><div class='add'>+                }</div><div class='add'>+                cli_out("\nVolume : %s", volname);</div><div class='add'>+</div><div class='add'>+                snprintf(buf, sizeof(buf),</div><div class='add'>+                         "volume%" PRIu64 "-snap-max-hard-limit", i);</div><div class='add'>+                ret = dict_get_uint64(dict, buf, &amp;value);</div><div class='add'>+                if (ret) {</div><div class='add'>+                    gf_log("cli", GF_LOG_ERROR, "Could not fetch %s", buf);</div><div class='add'>+                    ret = -1;</div><div class='add'>+                    goto out;</div><div class='add'>+                }</div><div class='add'>+                cli_out("snap-max-hard-limit : %" PRIu64, value);</div><div class='add'>+</div><div class='add'>+                snprintf(buf, sizeof(buf),</div><div class='add'>+                         "volume%" PRIu64 "-active-hard-limit", i);</div><div class='add'>+                ret = dict_get_uint64(dict, buf, &amp;value);</div><div class='add'>+                if (ret) {</div><div class='add'>+                    gf_log("cli", GF_LOG_ERROR,</div><div class='add'>+                           "Could not fetch"</div><div class='add'>+                           " effective snap_max_hard_limit for %s",</div><div class='add'>+                           volname);</div><div class='add'>+                    ret = -1;</div><div class='add'>+                    goto out;</div><div class='add'>+                }</div><div class='add'>+                cli_out("Effective snap-max-hard-limit : %" PRIu64, value);</div><div class='add'>+</div><div class='add'>+                snprintf(buf, sizeof(buf),</div><div class='add'>+                         "volume%" PRIu64 "-snap-max-soft-limit", i);</div><div class='add'>+                ret = dict_get_uint64(dict, buf, &amp;value);</div><div class='add'>+                if (ret) {</div><div class='add'>+                    gf_log("cli", GF_LOG_ERROR, "Could not fetch %s", buf);</div><div class='add'>+                    ret = -1;</div><div class='add'>+                    goto out;</div><div class='add'>+                }</div><div class='add'>+                cli_out("Effective snap-max-soft-limit : %" PRIu64</div><div class='add'>+                        " "</div><div class='add'>+                        "(%" PRIu64 "%%)",</div><div class='add'>+                        value, soft_limit);</div><div class='add'>+            }</div><div class='add'>+            break;</div><div class='add'>+        default:</div><div class='add'>+            break;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* This function is used to print the volume related information</div><div class='add'>+ * of a snap.</div><div class='add'>+ *</div><div class='add'>+ * arg - 0, dict       : Response Dictionary.</div><div class='add'>+ * arg - 1, prefix str : snaplist.snap{0..}.vol{0..}.*</div><div class='add'>+ */</div><div class='add'>+static int</div><div class='add'>+cli_get_each_volinfo_in_snap(dict_t *dict, char *keyprefix,</div><div class='add'>+                             gf_boolean_t snap_driven)</div><div class='add'>+{</div><div class='add'>+    char key[PATH_MAX] = "";</div><div class='add'>+    char *get_buffer = NULL;</div><div class='add'>+    int value = 0;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    char indent[5] = "\t";</div><div class='add'>+    char *volname = NULL;</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(dict);</div><div class='add'>+    GF_ASSERT(keyprefix);</div><div class='add'>+</div><div class='add'>+    if (snap_driven) {</div><div class='add'>+        ret = snprintf(key, sizeof(key), "%s.volname", keyprefix);</div><div class='add'>+        if (ret &lt; 0) {</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        ret = dict_get_str(dict, key, &amp;get_buffer);</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_log("cli", GF_LOG_ERROR, "Failed to get %s", key);</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+        cli_out("%s" INDENT_MAIN_HEAD "%s", indent, "Snap Volume Name", ":",</div><div class='add'>+                get_buffer);</div><div class='add'>+</div><div class='add'>+        ret = snprintf(key, sizeof(key), "%s.origin-volname", keyprefix);</div><div class='add'>+        if (ret &lt; 0) {</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        ret = dict_get_str(dict, key, &amp;volname);</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_log("cli", GF_LOG_WARNING, "Failed to get %s", key);</div><div class='add'>+            cli_out("%-12s", "Origin:");</div><div class='add'>+        }</div><div class='add'>+        cli_out("%s" INDENT_MAIN_HEAD "%s", indent, "Origin Volume name", ":",</div><div class='add'>+                volname);</div><div class='add'>+</div><div class='add'>+        ret = snprintf(key, sizeof(key), "%s.snapcount", keyprefix);</div><div class='add'>+        if (ret &lt; 0) {</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        ret = dict_get_int32(dict, key, &amp;value);</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_log("cli", GF_LOG_ERROR, "Failed to get %s", key);</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+        cli_out("%s%s %s      %s %d", indent, "Snaps taken for", volname, ":",</div><div class='add'>+                value);</div><div class='add'>+</div><div class='add'>+        ret = snprintf(key, sizeof(key), "%s.snaps-available", keyprefix);</div><div class='add'>+        if (ret &lt; 0) {</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        ret = dict_get_int32(dict, key, &amp;value);</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_log("cli", GF_LOG_ERROR, "Failed to get %s", key);</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+        cli_out("%s%s %s  %s %d", indent, "Snaps available for", volname, ":",</div><div class='add'>+                value);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = snprintf(key, sizeof(key), "%s.vol-status", keyprefix);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_get_str(dict, key, &amp;get_buffer);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log("cli", GF_LOG_ERROR, "Failed to get %s", key);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    cli_out("%s" INDENT_MAIN_HEAD "%s", indent, "Status", ":", get_buffer);</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* This function is used to print snap related information</div><div class='add'>+ * arg - 0, dict       : Response dictionary.</div><div class='add'>+ * arg - 1, prefix_str : snaplist.snap{0..}.*</div><div class='add'>+ */</div><div class='add'>+static int</div><div class='add'>+cli_get_volinfo_in_snap(dict_t *dict, char *keyprefix)</div><div class='add'>+{</div><div class='add'>+    char key[PATH_MAX] = "";</div><div class='add'>+    int i = 0;</div><div class='add'>+    int volcount = 0;</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(dict);</div><div class='add'>+    GF_ASSERT(keyprefix);</div><div class='add'>+</div><div class='add'>+    ret = snprintf(key, sizeof(key), "%s.vol-count", keyprefix);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_get_int32(dict, key, &amp;volcount);</div><div class='add'>+    for (i = 1; i &lt;= volcount; i++) {</div><div class='add'>+        ret = snprintf(key, sizeof(key), "%s.vol%d", keyprefix, i);</div><div class='add'>+        if (ret &lt; 0) {</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+        ret = cli_get_each_volinfo_in_snap(dict, key, _gf_true);</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_log("cli", GF_LOG_ERROR,</div><div class='add'>+                   "Could not list details of volume in a snap");</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+        cli_out(" ");</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+cli_get_each_snap_info(dict_t *dict, char *prefix_str, gf_boolean_t snap_driven)</div><div class='add'>+{</div><div class='add'>+    char key_buffer[PATH_MAX] = "";</div><div class='add'>+    char *get_buffer = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    char indent[5] = "";</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(dict);</div><div class='add'>+    GF_ASSERT(prefix_str);</div><div class='add'>+</div><div class='add'>+    if (!snap_driven)</div><div class='add'>+        strcat(indent, "\t");</div><div class='add'>+</div><div class='add'>+    ret = snprintf(key_buffer, sizeof(key_buffer), "%s.snapname", prefix_str);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_get_str(dict, key_buffer, &amp;get_buffer);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log("cli", GF_LOG_ERROR, "Unable to fetch snapname %s ", key_buffer);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    cli_out("%s" INDENT_MAIN_HEAD "%s", indent, "Snapshot", ":", get_buffer);</div><div class='add'>+</div><div class='add'>+    ret = snprintf(key_buffer, sizeof(key_buffer), "%s.snap-id", prefix_str);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_get_str(dict, key_buffer, &amp;get_buffer);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log("cli", GF_LOG_ERROR, "Unable to fetch snap-id %s ", key_buffer);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    cli_out("%s" INDENT_MAIN_HEAD "%s", indent, "Snap UUID", ":", get_buffer);</div><div class='add'>+</div><div class='add'>+    ret = snprintf(key_buffer, sizeof(key_buffer), "%s.snap-desc", prefix_str);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_get_str(dict, key_buffer, &amp;get_buffer);</div><div class='add'>+    if (!ret) {</div><div class='add'>+        /* Ignore error for description */</div><div class='add'>+        cli_out("%s" INDENT_MAIN_HEAD "%s", indent, "Description", ":",</div><div class='add'>+                get_buffer);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = snprintf(key_buffer, sizeof(key_buffer), "%s.snap-time", prefix_str);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_get_str(dict, key_buffer, &amp;get_buffer);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log("cli", GF_LOG_ERROR, "Unable to fetch snap-time %s ",</div><div class='add'>+               prefix_str);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    cli_out("%s" INDENT_MAIN_HEAD "%s", indent, "Created", ":", get_buffer);</div><div class='add'>+</div><div class='add'>+    if (snap_driven) {</div><div class='add'>+        cli_out("%-12s", "Snap Volumes:\n");</div><div class='add'>+        ret = cli_get_volinfo_in_snap(dict, prefix_str);</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_log("cli", GF_LOG_ERROR, "Unable to list details of the snaps");</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* This is a generic function to print snap related information.</div><div class='add'>+ * arg - 0, dict : Response Dictionary</div><div class='add'>+ */</div><div class='add'>+static int</div><div class='add'>+cli_call_snapshot_info(dict_t *dict, gf_boolean_t bool_snap_driven)</div><div class='add'>+{</div><div class='add'>+    int snap_count = 0;</div><div class='add'>+    char key[32] = "";</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int i = 0;</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(dict);</div><div class='add'>+</div><div class='add'>+    ret = dict_get_int32_sizen(dict, "snapcount", &amp;snap_count);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log("cli", GF_LOG_ERROR, "Unable to get snapcount");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (snap_count == 0) {</div><div class='add'>+        cli_out("No snapshots present");</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    for (i = 1; i &lt;= snap_count; i++) {</div><div class='add'>+        ret = snprintf(key, sizeof(key), "snap%d", i);</div><div class='add'>+        if (ret &lt; 0) {</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+        ret = cli_get_each_snap_info(dict, key, bool_snap_driven);</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_log("cli", GF_LOG_ERROR, "Unable to print snap details");</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+cli_get_snaps_in_volume(dict_t *dict)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int i = 0;</div><div class='add'>+    int count = 0;</div><div class='add'>+    int avail = 0;</div><div class='add'>+    char key[32] = "";</div><div class='add'>+    char *get_buffer = NULL;</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(dict);</div><div class='add'>+</div><div class='add'>+    ret = dict_get_str_sizen(dict, "origin-volname", &amp;get_buffer);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log("cli", GF_LOG_ERROR, "Could not fetch origin-volname");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    cli_out(INDENT_MAIN_HEAD "%s", "Volume Name", ":", get_buffer);</div><div class='add'>+</div><div class='add'>+    ret = dict_get_int32_sizen(dict, "snapcount", &amp;avail);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log("cli", GF_LOG_ERROR, "Could not fetch snapcount");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    cli_out(INDENT_MAIN_HEAD "%d", "Snaps Taken", ":", avail);</div><div class='add'>+</div><div class='add'>+    ret = dict_get_int32_sizen(dict, "snaps-available", &amp;count);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log("cli", GF_LOG_ERROR, "Could not fetch snaps-available");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    cli_out(INDENT_MAIN_HEAD "%d", "Snaps Available", ":", count);</div><div class='add'>+</div><div class='add'>+    for (i = 1; i &lt;= avail; i++) {</div><div class='add'>+        snprintf(key, sizeof(key), "snap%d", i);</div><div class='add'>+        ret = cli_get_each_snap_info(dict, key, _gf_false);</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_log("cli", GF_LOG_ERROR, "Unable to print snap details");</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        ret = snprintf(key, sizeof(key), "snap%d.vol1", i);</div><div class='add'>+        if (ret &lt; 0) {</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+        ret = cli_get_each_volinfo_in_snap(dict, key, _gf_false);</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_log("cli", GF_LOG_ERROR,</div><div class='add'>+                   "Could not get volume related information");</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        cli_out(" ");</div><div class='add'>+    }</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+cli_snapshot_list(dict_t *dict)</div><div class='add'>+{</div><div class='add'>+    int snapcount = 0;</div><div class='add'>+    char key[32] = "";</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int i = 0;</div><div class='add'>+    char *get_buffer = NULL;</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(dict);</div><div class='add'>+</div><div class='add'>+    ret = dict_get_int32_sizen(dict, "snapcount", &amp;snapcount);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log("cli", GF_LOG_ERROR, "Could not fetch snap count");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (snapcount == 0) {</div><div class='add'>+        cli_out("No snapshots present");</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    for (i = 1; i &lt;= snapcount; i++) {</div><div class='add'>+        ret = snprintf(key, sizeof(key), "snapname%d", i);</div><div class='add'>+        if (ret &lt; 0) {</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        ret = dict_get_strn(dict, key, ret, &amp;get_buffer);</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_log("cli", GF_LOG_ERROR, "Could not get %s ", key);</div><div class='add'>+            goto out;</div><div class='add'>+        } else {</div><div class='add'>+            cli_out("%s", get_buffer);</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+cli_get_snap_volume_status(dict_t *dict, char *key_prefix)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    char key[PATH_MAX] = "";</div><div class='add'>+    char *buffer = NULL;</div><div class='add'>+    int brickcount = 0;</div><div class='add'>+    int i = 0;</div><div class='add'>+    int pid = 0;</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(dict);</div><div class='add'>+    GF_ASSERT(key_prefix);</div><div class='add'>+</div><div class='add'>+    ret = snprintf(key, sizeof(key), "%s.brickcount", key_prefix);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    ret = dict_get_int32(dict, key, &amp;brickcount);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log("cli", GF_LOG_ERROR, "Failed to fetch brickcount");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; brickcount; i++) {</div><div class='add'>+        ret = snprintf(key, sizeof(key), "%s.brick%d.path", key_prefix, i);</div><div class='add'>+        if (ret &lt; 0) {</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        ret = dict_get_str(dict, key, &amp;buffer);</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_log("cli", GF_LOG_INFO, "Unable to get Brick Path");</div><div class='add'>+            continue;</div><div class='add'>+        }</div><div class='add'>+        cli_out("\n\t%-17s %s   %s", "Brick Path", ":", buffer);</div><div class='add'>+</div><div class='add'>+        ret = snprintf(key, sizeof(key), "%s.brick%d.vgname", key_prefix, i);</div><div class='add'>+        if (ret &lt; 0) {</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        ret = dict_get_str(dict, key, &amp;buffer);</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_log("cli", GF_LOG_INFO, "Unable to get Volume Group");</div><div class='add'>+            cli_out("\t%-17s %s   %s", "Volume Group", ":", "N/A");</div><div class='add'>+        } else</div><div class='add'>+            cli_out("\t%-17s %s   %s", "Volume Group", ":", buffer);</div><div class='add'>+</div><div class='add'>+        ret = snprintf(key, sizeof(key), "%s.brick%d.status", key_prefix, i);</div><div class='add'>+        if (ret &lt; 0) {</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        ret = dict_get_str(dict, key, &amp;buffer);</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_log("cli", GF_LOG_INFO, "Unable to get Brick Running");</div><div class='add'>+            cli_out("\t%-17s %s   %s", "Brick Running", ":", "N/A");</div><div class='add'>+        } else</div><div class='add'>+            cli_out("\t%-17s %s   %s", "Brick Running", ":", buffer);</div><div class='add'>+</div><div class='add'>+        ret = snprintf(key, sizeof(key), "%s.brick%d.pid", key_prefix, i);</div><div class='add'>+        if (ret &lt; 0) {</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        ret = dict_get_int32(dict, key, &amp;pid);</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_log("cli", GF_LOG_INFO, "Unable to get pid");</div><div class='add'>+            cli_out("\t%-17s %s   %s", "Brick PID", ":", "N/A");</div><div class='add'>+        } else</div><div class='add'>+            cli_out("\t%-17s %s   %d", "Brick PID", ":", pid);</div><div class='add'>+</div><div class='add'>+        ret = snprintf(key, sizeof(key), "%s.brick%d.data", key_prefix, i);</div><div class='add'>+        if (ret &lt; 0) {</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        ret = dict_get_str(dict, key, &amp;buffer);</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_log("cli", GF_LOG_INFO, "Unable to get Data Percent");</div><div class='add'>+            cli_out("\t%-17s %s   %s", "Data Percentage", ":", "N/A");</div><div class='add'>+        } else</div><div class='add'>+            cli_out("\t%-17s %s   %s", "Data Percentage", ":", buffer);</div><div class='add'>+</div><div class='add'>+        ret = snprintf(key, sizeof(key), "%s.brick%d.lvsize", key_prefix, i);</div><div class='add'>+        if (ret &lt; 0) {</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+        ret = dict_get_str(dict, key, &amp;buffer);</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_log("cli", GF_LOG_INFO, "Unable to get LV Size");</div><div class='add'>+            cli_out("\t%-17s %s   %s", "LV Size", ":", "N/A");</div><div class='add'>+        } else</div><div class='add'>+            cli_out("\t%-17s %s   %s", "LV Size", ":", buffer);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+cli_get_single_snap_status(dict_t *dict, char *keyprefix)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    char key[64] = ""; /* keyprefix is ""status.snap0" */</div><div class='add'>+    int i = 0;</div><div class='add'>+    int volcount = 0;</div><div class='add'>+    char *get_buffer = NULL;</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(dict);</div><div class='add'>+    GF_ASSERT(keyprefix);</div><div class='add'>+</div><div class='add'>+    ret = snprintf(key, sizeof(key), "%s.snapname", keyprefix);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_get_str(dict, key, &amp;get_buffer);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log("cli", GF_LOG_ERROR, "Unable to get snapname");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    cli_out("\nSnap Name : %s", get_buffer);</div><div class='add'>+</div><div class='add'>+    ret = snprintf(key, sizeof(key), "%s.uuid", keyprefix);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_get_str(dict, key, &amp;get_buffer);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log("cli", GF_LOG_ERROR, "Unable to get snap UUID");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    cli_out("Snap UUID : %s", get_buffer);</div><div class='add'>+</div><div class='add'>+    ret = snprintf(key, sizeof(key), "%s.volcount", keyprefix);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_get_int32(dict, key, &amp;volcount);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log("cli", GF_LOG_ERROR, "Unable to get volume count");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; volcount; i++) {</div><div class='add'>+        ret = snprintf(key, sizeof(key), "%s.vol%d", keyprefix, i);</div><div class='add'>+        if (ret &lt; 0) {</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        ret = cli_get_snap_volume_status(dict, key);</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_log("cli", GF_LOG_ERROR, "Could not get snap volume status");</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int32_t</div><div class='add'>+cli_populate_req_dict_for_delete(dict_t *snap_dict, dict_t *dict, size_t index)</div><div class='add'>+{</div><div class='add'>+    int32_t ret = -1;</div><div class='add'>+    char key[PATH_MAX] = "";</div><div class='add'>+    char *buffer = NULL;</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(snap_dict);</div><div class='add'>+    GF_ASSERT(dict);</div><div class='add'>+</div><div class='add'>+    ret = dict_set_int32_sizen(snap_dict, "sub-cmd", GF_SNAP_DELETE_TYPE_ITER);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log("cli", GF_LOG_ERROR,</div><div class='add'>+               "Could not save command type in snap dictionary");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = snprintf(key, sizeof(key), "snapname%zu", index);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_get_str(dict, key, &amp;buffer);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log("cli", GF_LOG_ERROR, "Failed to get snapname");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_set_dynstr_with_alloc(snap_dict, "snapname", buffer);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log("cli", GF_LOG_ERROR, "Failed to save snapname");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_set_int32_sizen(snap_dict, "type", GF_SNAP_OPTION_TYPE_DELETE);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log("cli", GF_LOG_ERROR, "Failed to save command type");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_set_dynstr_with_alloc(snap_dict, "cmd-str", "snapshot delete");</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log("cli", GF_LOG_ERROR, "Could not save command string as delete");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+cli_populate_req_dict_for_status(dict_t *snap_dict, dict_t *dict, int index)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    char key[PATH_MAX] = "";</div><div class='add'>+    char *buffer = NULL;</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(snap_dict);</div><div class='add'>+    GF_ASSERT(dict);</div><div class='add'>+</div><div class='add'>+    ret = dict_set_uint32(snap_dict, "sub-cmd", GF_SNAP_STATUS_TYPE_ITER);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log("cli", GF_LOG_ERROR, "Could not save command type in snap dict");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = snprintf(key, sizeof(key), "status.snap%d.snapname", index);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_get_strn(dict, key, ret, &amp;buffer);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log("cli", GF_LOG_ERROR, "Could not get snapname");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_set_str_sizen(snap_dict, "snapname", buffer);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log("cli", GF_LOG_ERROR, "Could not save snapname in snap dict");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_set_int32_sizen(snap_dict, "type", GF_SNAP_OPTION_TYPE_STATUS);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log("cli", GF_LOG_ERROR, "Could not save command type");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_set_dynstr_with_alloc(snap_dict, "cmd-str", "snapshot status");</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log("cli", GF_LOG_ERROR, "Could not save command string as status");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_set_int32_sizen(snap_dict, "hold_vol_locks", _gf_false);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log("cli", GF_LOG_ERROR, "Setting volume lock flag failed");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+cli_snapshot_status(dict_t *dict, gf_cli_rsp *rsp, call_frame_t *frame)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int status_cmd = -1;</div><div class='add'>+    cli_local_t *local = NULL;</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(dict);</div><div class='add'>+    GF_ASSERT(rsp);</div><div class='add'>+    GF_ASSERT(frame);</div><div class='add'>+</div><div class='add'>+    local = ((call_frame_t *)frame)-&gt;local;</div><div class='add'>+    if (!local) {</div><div class='add'>+        gf_log("cli", GF_LOG_ERROR, "frame-&gt;local is NULL");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (rsp-&gt;op_ret) {</div><div class='add'>+        if (rsp-&gt;op_errstr) {</div><div class='add'>+            ret = dict_set_dynstr_with_alloc(local-&gt;dict, "op_err_str",</div><div class='add'>+                                             rsp-&gt;op_errstr);</div><div class='add'>+            if (ret) {</div><div class='add'>+                gf_log("cli", GF_LOG_ERROR,</div><div class='add'>+                       "Failed to set op_errstr in local dictionary");</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+        ret = rsp-&gt;op_ret;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_get_int32_sizen(dict, "sub-cmd", &amp;status_cmd);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log("cli", GF_LOG_ERROR, "Could not fetch status type");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if ((status_cmd != GF_SNAP_STATUS_TYPE_SNAP) &amp;&amp;</div><div class='add'>+        (status_cmd != GF_SNAP_STATUS_TYPE_ITER)) {</div><div class='add'>+        dict_copy(dict, local-&gt;dict);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (global_state-&gt;mode &amp; GLUSTER_MODE_XML) {</div><div class='add'>+        ret = cli_xml_snapshot_status_single_snap(local, dict, "status.snap0");</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_log("cli", GF_LOG_ERROR,</div><div class='add'>+                   "Failed to create xml output for snapshot status");</div><div class='add'>+        }</div><div class='add'>+    } else {</div><div class='add'>+        ret = cli_get_single_snap_status(dict, "status.snap0");</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_log("cli", GF_LOG_ERROR, "Could not fetch status of snap");</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+gf_cli_generate_snapshot_event(gf_cli_rsp *rsp, dict_t *dict, int32_t type,</div><div class='add'>+                               char *snap_name, char *volname, char *snap_uuid,</div><div class='add'>+                               char *clone_name)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int config_command = 0;</div><div class='add'>+    int32_t delete_cmd = -1;</div><div class='add'>+    uint64_t hard_limit = 0;</div><div class='add'>+    uint64_t soft_limit = 0;</div><div class='add'>+    char *auto_delete = NULL;</div><div class='add'>+    char *snap_activate = NULL;</div><div class='add'>+    char msg[PATH_MAX] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    char option[512] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    GF_VALIDATE_OR_GOTO("cli", dict, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("cli", rsp, out);</div><div class='add'>+</div><div class='add'>+    switch (type) {</div><div class='add'>+        case GF_SNAP_OPTION_TYPE_CREATE:</div><div class='add'>+            if (!snap_name) {</div><div class='add'>+                gf_log("cli", GF_LOG_ERROR, "Failed to get snap name");</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            if (!volname) {</div><div class='add'>+                gf_log("cli", GF_LOG_ERROR, "Failed to get volume name");</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            if (rsp-&gt;op_ret != 0) {</div><div class='add'>+                gf_event(EVENT_SNAPSHOT_CREATE_FAILED,</div><div class='add'>+                         "snapshot_name=%s;volume_name=%s;error=%s", snap_name,</div><div class='add'>+                         volname,</div><div class='add'>+                         rsp-&gt;op_errstr ? rsp-&gt;op_errstr</div><div class='add'>+                                        : "Please check log file for details");</div><div class='add'>+                ret = 0;</div><div class='add'>+                break;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            if (!snap_uuid) {</div><div class='add'>+                gf_log("cli", GF_LOG_ERROR, "Failed to get snap uuid");</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            gf_event(EVENT_SNAPSHOT_CREATED,</div><div class='add'>+                     "snapshot_name=%s;volume_name=%s;snapshot_uuid=%s",</div><div class='add'>+                     snap_name, volname, snap_uuid);</div><div class='add'>+</div><div class='add'>+            ret = 0;</div><div class='add'>+            break;</div><div class='add'>+</div><div class='add'>+        case GF_SNAP_OPTION_TYPE_ACTIVATE:</div><div class='add'>+            if (!snap_name) {</div><div class='add'>+                gf_log("cli", GF_LOG_ERROR, "Failed to get snap name");</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            if (rsp-&gt;op_ret != 0) {</div><div class='add'>+                gf_event(EVENT_SNAPSHOT_ACTIVATE_FAILED,</div><div class='add'>+                         "snapshot_name=%s;error=%s", snap_name,</div><div class='add'>+                         rsp-&gt;op_errstr ? rsp-&gt;op_errstr</div><div class='add'>+                                        : "Please check log file for details");</div><div class='add'>+                ret = 0;</div><div class='add'>+                break;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            if (!snap_uuid) {</div><div class='add'>+                gf_log("cli", GF_LOG_ERROR, "Failed to get snap uuid");</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            gf_event(EVENT_SNAPSHOT_ACTIVATED,</div><div class='add'>+                     "snapshot_name=%s;snapshot_uuid=%s", snap_name, snap_uuid);</div><div class='add'>+</div><div class='add'>+            ret = 0;</div><div class='add'>+            break;</div><div class='add'>+</div><div class='add'>+        case GF_SNAP_OPTION_TYPE_DEACTIVATE:</div><div class='add'>+            if (!snap_name) {</div><div class='add'>+                gf_log("cli", GF_LOG_ERROR, "Failed to get snap name");</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            if (rsp-&gt;op_ret != 0) {</div><div class='add'>+                gf_event(EVENT_SNAPSHOT_DEACTIVATE_FAILED,</div><div class='add'>+                         "snapshot_name=%s;error=%s", snap_name,</div><div class='add'>+                         rsp-&gt;op_errstr ? rsp-&gt;op_errstr</div><div class='add'>+                                        : "Please check log file for details");</div><div class='add'>+                ret = 0;</div><div class='add'>+                break;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            if (!snap_uuid) {</div><div class='add'>+                gf_log("cli", GF_LOG_ERROR, "Failed to get snap uuid");</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            gf_event(EVENT_SNAPSHOT_DEACTIVATED,</div><div class='add'>+                     "snapshot_name=%s;snapshot_uuid=%s", snap_name, snap_uuid);</div><div class='add'>+</div><div class='add'>+            ret = 0;</div><div class='add'>+            break;</div><div class='add'>+</div><div class='add'>+        case GF_SNAP_OPTION_TYPE_RESTORE:</div><div class='add'>+            if (!snap_name) {</div><div class='add'>+                gf_log("cli", GF_LOG_ERROR, "Failed to get snap name");</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            if (rsp-&gt;op_ret != 0) {</div><div class='add'>+                gf_event(EVENT_SNAPSHOT_RESTORE_FAILED,</div><div class='add'>+                         "snapshot_name=%s;error=%s", snap_name,</div><div class='add'>+                         rsp-&gt;op_errstr ? rsp-&gt;op_errstr</div><div class='add'>+                                        : "Please check log file for details");</div><div class='add'>+                ret = 0;</div><div class='add'>+                break;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            if (!snap_uuid) {</div><div class='add'>+                ret = -1;</div><div class='add'>+                gf_log("cli", GF_LOG_ERROR, "Failed to get snap uuid");</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            if (!volname) {</div><div class='add'>+                ret = -1;</div><div class='add'>+                gf_log("cli", GF_LOG_ERROR, "Failed to get volname");</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            gf_event(EVENT_SNAPSHOT_RESTORED,</div><div class='add'>+                     "snapshot_name=%s;snapshot_uuid=%s;volume_name=%s",</div><div class='add'>+                     snap_name, snap_uuid, volname);</div><div class='add'>+</div><div class='add'>+            ret = 0;</div><div class='add'>+            break;</div><div class='add'>+</div><div class='add'>+        case GF_SNAP_OPTION_TYPE_DELETE:</div><div class='add'>+            ret = dict_get_int32_sizen(dict, "sub-cmd", &amp;delete_cmd);</div><div class='add'>+            if (ret) {</div><div class='add'>+                gf_log("cli", GF_LOG_ERROR, "Could not get sub-cmd");</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            /*</div><div class='add'>+             * Need not generate any event (success or failure) for delete *</div><div class='add'>+             * all, as it will trigger individual delete for all snapshots *</div><div class='add'>+             */</div><div class='add'>+            if (delete_cmd == GF_SNAP_DELETE_TYPE_ALL) {</div><div class='add'>+                ret = 0;</div><div class='add'>+                break;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            if (!snap_name) {</div><div class='add'>+                gf_log("cli", GF_LOG_ERROR, "Failed to get snap name");</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            if (rsp-&gt;op_ret != 0) {</div><div class='add'>+                gf_event(EVENT_SNAPSHOT_DELETE_FAILED,</div><div class='add'>+                         "snapshot_name=%s;error=%s", snap_name,</div><div class='add'>+                         rsp-&gt;op_errstr ? rsp-&gt;op_errstr</div><div class='add'>+                                        : "Please check log file for details");</div><div class='add'>+                ret = 0;</div><div class='add'>+                break;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            if (!snap_uuid) {</div><div class='add'>+                ret = -1;</div><div class='add'>+                gf_log("cli", GF_LOG_ERROR, "Failed to get snap uuid");</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            gf_event(EVENT_SNAPSHOT_DELETED,</div><div class='add'>+                     "snapshot_name=%s;snapshot_uuid=%s", snap_name, snap_uuid);</div><div class='add'>+</div><div class='add'>+            ret = 0;</div><div class='add'>+            break;</div><div class='add'>+</div><div class='add'>+        case GF_SNAP_OPTION_TYPE_CLONE:</div><div class='add'>+            if (!clone_name) {</div><div class='add'>+                gf_log("cli", GF_LOG_ERROR, "Failed to get clone name");</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            if (!snap_name) {</div><div class='add'>+                gf_log("cli", GF_LOG_ERROR, "Failed to get snapname name");</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            if (rsp-&gt;op_ret != 0) {</div><div class='add'>+                gf_event(EVENT_SNAPSHOT_CLONE_FAILED,</div><div class='add'>+                         "snapshot_name=%s;clone_name=%s;error=%s", snap_name,</div><div class='add'>+                         clone_name,</div><div class='add'>+                         rsp-&gt;op_errstr ? rsp-&gt;op_errstr</div><div class='add'>+                                        : "Please check log file for details");</div><div class='add'>+                ret = 0;</div><div class='add'>+                break;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            if (!snap_uuid) {</div><div class='add'>+                ret = -1;</div><div class='add'>+                gf_log("cli", GF_LOG_ERROR, "Failed to get snap uuid");</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            gf_event(EVENT_SNAPSHOT_CLONED,</div><div class='add'>+                     "snapshot_name=%s;clone_name=%s;clone_uuid=%s", snap_name,</div><div class='add'>+                     clone_name, snap_uuid);</div><div class='add'>+</div><div class='add'>+            ret = 0;</div><div class='add'>+            break;</div><div class='add'>+</div><div class='add'>+        case GF_SNAP_OPTION_TYPE_CONFIG:</div><div class='add'>+            if (rsp-&gt;op_ret != 0) {</div><div class='add'>+                gf_event(EVENT_SNAPSHOT_CONFIG_UPDATE_FAILED, "error=%s",</div><div class='add'>+                         rsp-&gt;op_errstr ? rsp-&gt;op_errstr</div><div class='add'>+                                        : "Please check log file for details");</div><div class='add'>+                ret = 0;</div><div class='add'>+                break;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            ret = dict_get_int32_sizen(dict, "config-command", &amp;config_command);</div><div class='add'>+            if (ret) {</div><div class='add'>+                gf_log("cli", GF_LOG_ERROR, "Could not fetch config type");</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            if (config_command == GF_SNAP_CONFIG_DISPLAY) {</div><div class='add'>+                ret = 0;</div><div class='add'>+                break;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            /* These are optional parameters therefore ignore the error */</div><div class='add'>+            ret = dict_get_uint64(dict, "snap-max-hard-limit", &amp;hard_limit);</div><div class='add'>+            ret = dict_get_uint64(dict, "snap-max-soft-limit", &amp;soft_limit);</div><div class='add'>+            ret = dict_get_str_sizen(dict, "auto-delete", &amp;auto_delete);</div><div class='add'>+            ret = dict_get_str_sizen(dict, "snap-activate-on-create",</div><div class='add'>+                                     &amp;snap_activate);</div><div class='add'>+</div><div class='add'>+            if (!hard_limit &amp;&amp; !soft_limit &amp;&amp; !auto_delete &amp;&amp; !snap_activate) {</div><div class='add'>+                ret = -1;</div><div class='add'>+                gf_log("cli", GF_LOG_ERROR,</div><div class='add'>+                       "At least one option from "</div><div class='add'>+                       "snap-max-hard-limit, snap-max-soft-limit, "</div><div class='add'>+                       "auto-delete and snap-activate-on-create "</div><div class='add'>+                       "should be set");</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            if (hard_limit || soft_limit) {</div><div class='add'>+                snprintf(option, sizeof(option), "%s=%" PRIu64,</div><div class='add'>+                         hard_limit ? "hard_limit" : "soft_limit",</div><div class='add'>+                         hard_limit ? hard_limit : soft_limit);</div><div class='add'>+            } else if (auto_delete || snap_activate) {</div><div class='add'>+                snprintf(option, sizeof(option), "%s=%s",</div><div class='add'>+                         auto_delete ? "auto-delete" : "snap-activate",</div><div class='add'>+                         auto_delete ? auto_delete : snap_activate);</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            volname = NULL;</div><div class='add'>+            ret = dict_get_str_sizen(dict, "volname", &amp;volname);</div><div class='add'>+</div><div class='add'>+            snprintf(msg, sizeof(msg), "config_type=%s;%s",</div><div class='add'>+                     volname ? "volume_config" : "system_config", option);</div><div class='add'>+</div><div class='add'>+            gf_event(EVENT_SNAPSHOT_CONFIG_UPDATED, "%s", msg);</div><div class='add'>+</div><div class='add'>+            ret = 0;</div><div class='add'>+            break;</div><div class='add'>+</div><div class='add'>+        default:</div><div class='add'>+            gf_log("cli", GF_LOG_WARNING,</div><div class='add'>+                   "Cannot generate event for unknown type.");</div><div class='add'>+            ret = 0;</div><div class='add'>+            goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+ * Fetch necessary data from dict at one place instead of *</div><div class='add'>+ * repeating the same code again and again.               *</div><div class='add'>+ */</div><div class='add'>+static int</div><div class='add'>+gf_cli_snapshot_get_data_from_dict(dict_t *dict, char **snap_name,</div><div class='add'>+                                   char **volname, char **snap_uuid,</div><div class='add'>+                                   int8_t *soft_limit_flag, char **clone_name)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    GF_VALIDATE_OR_GOTO("cli", dict, out);</div><div class='add'>+</div><div class='add'>+    if (snap_name) {</div><div class='add'>+        ret = dict_get_str_sizen(dict, "snapname", snap_name);</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_log("cli", GF_LOG_DEBUG, "failed to get snapname from dict");</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (volname) {</div><div class='add'>+        ret = dict_get_str_sizen(dict, "volname1", volname);</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_log("cli", GF_LOG_DEBUG, "failed to get volname1 from dict");</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (snap_uuid) {</div><div class='add'>+        ret = dict_get_str_sizen(dict, "snapuuid", snap_uuid);</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_log("cli", GF_LOG_DEBUG, "failed to get snapuuid from dict");</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (soft_limit_flag) {</div><div class='add'>+        ret = dict_get_int8(dict, "soft-limit-reach", soft_limit_flag);</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_log("cli", GF_LOG_DEBUG,</div><div class='add'>+                   "failed to get soft-limit-reach from dict");</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (clone_name) {</div><div class='add'>+        ret = dict_get_str_sizen(dict, "clonename", clone_name);</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_log("cli", GF_LOG_DEBUG, "failed to get clonename from dict");</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+gf_cli_snapshot_cbk(struct rpc_req *req, struct iovec *iov, int count,</div><div class='add'>+                    void *myframe)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    gf_cli_rsp rsp = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    dict_t *dict = NULL;</div><div class='add'>+    char *snap_name = NULL;</div><div class='add'>+    char *clone_name = NULL;</div><div class='add'>+    int32_t type = 0;</div><div class='add'>+    call_frame_t *frame = NULL;</div><div class='add'>+    gf_boolean_t snap_driven = _gf_false;</div><div class='add'>+    int8_t soft_limit_flag = -1;</div><div class='add'>+    char *volname = NULL;</div><div class='add'>+    char *snap_uuid = NULL;</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(myframe);</div><div class='add'>+</div><div class='add'>+    if (req-&gt;rpc_status == -1) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    frame = myframe;</div><div class='add'>+</div><div class='add'>+    ret = xdr_to_generic(*iov, &amp;rsp, (xdrproc_t)xdr_gf_cli_rsp);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        gf_log(frame-&gt;this-&gt;name, GF_LOG_ERROR, XDR_DECODE_FAIL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    dict = dict_new();</div><div class='add'>+</div><div class='add'>+    if (!dict) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_unserialize(rsp.dict.dict_val, rsp.dict.dict_len, &amp;dict);</div><div class='add'>+</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    ret = dict_get_int32_sizen(dict, "type", &amp;type);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log(frame-&gt;this-&gt;name, GF_LOG_ERROR, "failed to get type");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = gf_cli_snapshot_get_data_from_dict(</div><div class='add'>+        dict, &amp;snap_name, &amp;volname, &amp;snap_uuid, &amp;soft_limit_flag, &amp;clone_name);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log("cli", GF_LOG_ERROR, "Failed to fetch data from dict.");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+#if (USE_EVENTS)</div><div class='add'>+    ret = gf_cli_generate_snapshot_event(&amp;rsp, dict, type, snap_name, volname,</div><div class='add'>+                                         snap_uuid, clone_name);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log("cli", GF_LOG_ERROR, "Failed to generate snapshot event");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+    /* Snapshot status and delete command is handled separately */</div><div class='add'>+    if (global_state-&gt;mode &amp; GLUSTER_MODE_XML &amp;&amp;</div><div class='add'>+        GF_SNAP_OPTION_TYPE_STATUS != type &amp;&amp;</div><div class='add'>+        GF_SNAP_OPTION_TYPE_DELETE != type) {</div><div class='add'>+        ret = cli_xml_output_snapshot(type, dict, rsp.op_ret, rsp.op_errno,</div><div class='add'>+                                      rsp.op_errstr);</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_log("cli", GF_LOG_ERROR, XML_ERROR);</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    switch (type) {</div><div class='add'>+        case GF_SNAP_OPTION_TYPE_CREATE:</div><div class='add'>+            if (rsp.op_ret) {</div><div class='add'>+                cli_err("snapshot create: failed: %s",</div><div class='add'>+                        rsp.op_errstr ? rsp.op_errstr</div><div class='add'>+                                      : "Please check log file for details");</div><div class='add'>+                ret = rsp.op_ret;</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            if (!snap_name) {</div><div class='add'>+                ret = -1;</div><div class='add'>+                gf_log("cli", GF_LOG_ERROR, "Failed to get snap name");</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            if (!volname) {</div><div class='add'>+                ret = -1;</div><div class='add'>+                gf_log("cli", GF_LOG_ERROR, "Failed to get volume name");</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            cli_out("snapshot create: success: Snap %s created successfully",</div><div class='add'>+                    snap_name);</div><div class='add'>+</div><div class='add'>+            if (soft_limit_flag == 1) {</div><div class='add'>+                cli_out(</div><div class='add'>+                    "Warning: Soft-limit of volume (%s) is "</div><div class='add'>+                    "reached. Snapshot creation is not possible "</div><div class='add'>+                    "once hard-limit is reached.",</div><div class='add'>+                    volname);</div><div class='add'>+            }</div><div class='add'>+            ret = 0;</div><div class='add'>+            break;</div><div class='add'>+</div><div class='add'>+        case GF_SNAP_OPTION_TYPE_CLONE:</div><div class='add'>+            if (rsp.op_ret) {</div><div class='add'>+                cli_err("snapshot clone: failed: %s",</div><div class='add'>+                        rsp.op_errstr ? rsp.op_errstr</div><div class='add'>+                                      : "Please check log file for details");</div><div class='add'>+                ret = rsp.op_ret;</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            if (!clone_name) {</div><div class='add'>+                gf_log("cli", GF_LOG_ERROR, "Failed to get clone name");</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            if (!snap_name) {</div><div class='add'>+                gf_log("cli", GF_LOG_ERROR, "Failed to get snapname name");</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            cli_out("snapshot clone: success: Clone %s created successfully",</div><div class='add'>+                    clone_name);</div><div class='add'>+</div><div class='add'>+            ret = 0;</div><div class='add'>+            break;</div><div class='add'>+</div><div class='add'>+        case GF_SNAP_OPTION_TYPE_RESTORE:</div><div class='add'>+            if (rsp.op_ret) {</div><div class='add'>+                cli_err("snapshot restore: failed: %s",</div><div class='add'>+                        rsp.op_errstr ? rsp.op_errstr</div><div class='add'>+                                      : "Please check log file for details");</div><div class='add'>+                ret = rsp.op_ret;</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            if (!snap_name) {</div><div class='add'>+                gf_log("cli", GF_LOG_ERROR, "Failed to get snap name");</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            cli_out("Snapshot restore: %s: Snap restored successfully",</div><div class='add'>+                    snap_name);</div><div class='add'>+</div><div class='add'>+            ret = 0;</div><div class='add'>+            break;</div><div class='add'>+        case GF_SNAP_OPTION_TYPE_ACTIVATE:</div><div class='add'>+            if (rsp.op_ret) {</div><div class='add'>+                cli_err("snapshot activate: failed: %s",</div><div class='add'>+                        rsp.op_errstr ? rsp.op_errstr</div><div class='add'>+                                      : "Please check log file for details");</div><div class='add'>+                ret = rsp.op_ret;</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            if (!snap_name) {</div><div class='add'>+                gf_log("cli", GF_LOG_ERROR, "Failed to get snap name");</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            cli_out("Snapshot activate: %s: Snap activated successfully",</div><div class='add'>+                    snap_name);</div><div class='add'>+</div><div class='add'>+            ret = 0;</div><div class='add'>+            break;</div><div class='add'>+</div><div class='add'>+        case GF_SNAP_OPTION_TYPE_DEACTIVATE:</div><div class='add'>+            if (rsp.op_ret) {</div><div class='add'>+                cli_err("snapshot deactivate: failed: %s",</div><div class='add'>+                        rsp.op_errstr ? rsp.op_errstr</div><div class='add'>+                                      : "Please check log file for details");</div><div class='add'>+                ret = rsp.op_ret;</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            if (!snap_name) {</div><div class='add'>+                gf_log("cli", GF_LOG_ERROR, "Failed to get snap name");</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            cli_out("Snapshot deactivate: %s: Snap deactivated successfully",</div><div class='add'>+                    snap_name);</div><div class='add'>+</div><div class='add'>+            ret = 0;</div><div class='add'>+            break;</div><div class='add'>+        case GF_SNAP_OPTION_TYPE_INFO:</div><div class='add'>+            if (rsp.op_ret) {</div><div class='add'>+                cli_err("Snapshot info : failed: %s",</div><div class='add'>+                        rsp.op_errstr ? rsp.op_errstr</div><div class='add'>+                                      : "Please check log file for details");</div><div class='add'>+                ret = rsp.op_ret;</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            snap_driven = dict_get_str_boolean(dict, "snap-driven", _gf_false);</div><div class='add'>+            if (snap_driven == _gf_true) {</div><div class='add'>+                ret = cli_call_snapshot_info(dict, snap_driven);</div><div class='add'>+                if (ret) {</div><div class='add'>+                    gf_log("cli", GF_LOG_ERROR, "Snapshot info failed");</div><div class='add'>+                    goto out;</div><div class='add'>+                }</div><div class='add'>+            } else if (snap_driven == _gf_false) {</div><div class='add'>+                ret = cli_get_snaps_in_volume(dict);</div><div class='add'>+                if (ret) {</div><div class='add'>+                    gf_log("cli", GF_LOG_ERROR, "Snapshot info failed");</div><div class='add'>+                    goto out;</div><div class='add'>+                }</div><div class='add'>+            }</div><div class='add'>+            break;</div><div class='add'>+</div><div class='add'>+        case GF_SNAP_OPTION_TYPE_CONFIG:</div><div class='add'>+            ret = cli_snapshot_config_display(dict, &amp;rsp);</div><div class='add'>+            if (ret) {</div><div class='add'>+                gf_log("cli", GF_LOG_ERROR,</div><div class='add'>+                       "Failed to display snapshot config output.");</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+            break;</div><div class='add'>+</div><div class='add'>+        case GF_SNAP_OPTION_TYPE_LIST:</div><div class='add'>+            if (rsp.op_ret) {</div><div class='add'>+                cli_err("Snapshot list : failed: %s",</div><div class='add'>+                        rsp.op_errstr ? rsp.op_errstr</div><div class='add'>+                                      : "Please check log file for details");</div><div class='add'>+                ret = rsp.op_ret;</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            ret = cli_snapshot_list(dict);</div><div class='add'>+            if (ret) {</div><div class='add'>+                gf_log("cli", GF_LOG_ERROR, "Failed to display snapshot list");</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+            break;</div><div class='add'>+</div><div class='add'>+        case GF_SNAP_OPTION_TYPE_DELETE:</div><div class='add'>+            ret = cli_snapshot_remove_reply(&amp;rsp, dict, frame);</div><div class='add'>+            if (ret) {</div><div class='add'>+                gf_log("cli", GF_LOG_ERROR, "Failed to delete snap");</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+            break;</div><div class='add'>+</div><div class='add'>+        case GF_SNAP_OPTION_TYPE_STATUS:</div><div class='add'>+            ret = cli_snapshot_status(dict, &amp;rsp, frame);</div><div class='add'>+            if (ret) {</div><div class='add'>+                gf_log("cli", GF_LOG_ERROR,</div><div class='add'>+                       "Failed to display snapshot status output.");</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+            break;</div><div class='add'>+</div><div class='add'>+        default:</div><div class='add'>+            cli_err("Unknown command executed");</div><div class='add'>+            ret = -1;</div><div class='add'>+            goto out;</div><div class='add'>+    }</div><div class='add'>+out:</div><div class='add'>+    if (dict)</div><div class='add'>+        dict_unref(dict);</div><div class='add'>+    cli_cmd_broadcast_response(ret);</div><div class='add'>+</div><div class='add'>+    free(rsp.dict.dict_val);</div><div class='add'>+    free(rsp.op_errstr);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+gf_cli_snapshot_for_delete(call_frame_t *frame, xlator_t *this, void *data)</div><div class='add'>+{</div><div class='add'>+    gf_cli_req req = {{</div><div class='add'>+        0,</div><div class='add'>+    }};</div><div class='add'>+    int32_t ret = -1;</div><div class='add'>+    int32_t cmd = -1;</div><div class='add'>+    cli_local_t *local = NULL;</div><div class='add'>+    dict_t *snap_dict = NULL;</div><div class='add'>+    int32_t snapcount = 0;</div><div class='add'>+    int i = 0;</div><div class='add'>+    char question[PATH_MAX] = "";</div><div class='add'>+    char *volname = NULL;</div><div class='add'>+    gf_answer_t answer = GF_ANSWER_NO;</div><div class='add'>+</div><div class='add'>+    GF_VALIDATE_OR_GOTO("cli", frame, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("cli", frame-&gt;local, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("cli", this, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("cli", data, out);</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+</div><div class='add'>+    ret = dict_get_int32_sizen(local-&gt;dict, "sub-cmd", &amp;cmd);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log("cli", GF_LOG_ERROR, "Failed to get sub-cmd");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* No need multiple RPCs for individual snapshot delete*/</div><div class='add'>+    if (cmd == GF_SNAP_DELETE_TYPE_SNAP) {</div><div class='add'>+        ret = 0;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_get_int32_sizen(local-&gt;dict, "snapcount", &amp;snapcount);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log("cli", GF_LOG_ERROR, "Could not get snapcount");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (global_state-&gt;mode &amp; GLUSTER_MODE_XML) {</div><div class='add'>+#ifdef HAVE_LIB_XML</div><div class='add'>+        ret = xmlTextWriterWriteFormatElement(</div><div class='add'>+            local-&gt;writer, (xmlChar *)"snapCount", "%d", snapcount);</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_log("cli", GF_LOG_ERROR,</div><div class='add'>+                   "Failed to write xml element \"snapCount\"");</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+#endif /* HAVE_LIB_XML */</div><div class='add'>+    } else if (snapcount == 0) {</div><div class='add'>+        cli_out("No snapshots present");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (cmd == GF_SNAP_DELETE_TYPE_ALL) {</div><div class='add'>+        snprintf(question, sizeof(question),</div><div class='add'>+                 "System contains %d snapshot(s).\nDo you still "</div><div class='add'>+                 "want to continue and delete them? ",</div><div class='add'>+                 snapcount);</div><div class='add'>+    } else {</div><div class='add'>+        ret = dict_get_str_sizen(local-&gt;dict, "volname", &amp;volname);</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_log("cli", GF_LOG_ERROR,</div><div class='add'>+                   "Failed to fetch volname from local dictionary");</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        snprintf(question, sizeof(question),</div><div class='add'>+                 "Volume (%s) contains %d snapshot(s).\nDo you still want to "</div><div class='add'>+                 "continue and delete them? ",</div><div class='add'>+                 volname, snapcount);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    answer = cli_cmd_get_confirmation(global_state, question);</div><div class='add'>+    if (GF_ANSWER_NO == answer) {</div><div class='add'>+        ret = 0;</div><div class='add'>+        gf_log("cli", GF_LOG_DEBUG,</div><div class='add'>+               "User cancelled snapshot delete operation for snap delete");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    for (i = 1; i &lt;= snapcount; i++) {</div><div class='add'>+        ret = -1;</div><div class='add'>+</div><div class='add'>+        snap_dict = dict_new();</div><div class='add'>+        if (!snap_dict)</div><div class='add'>+            goto out;</div><div class='add'>+</div><div class='add'>+        ret = cli_populate_req_dict_for_delete(snap_dict, local-&gt;dict, i);</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_log("cli", GF_LOG_ERROR,</div><div class='add'>+                   "Could not populate snap request dictionary");</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        ret = cli_to_glusterd(&amp;req, frame, gf_cli_snapshot_cbk,</div><div class='add'>+                              (xdrproc_t)xdr_gf_cli_req, snap_dict,</div><div class='add'>+                              GLUSTER_CLI_SNAP, this, cli_rpc_prog, NULL);</div><div class='add'>+        if (ret) {</div><div class='add'>+            /* Fail the operation if deleting one of the</div><div class='add'>+             * snapshots is failed</div><div class='add'>+             */</div><div class='add'>+            gf_log("cli", GF_LOG_ERROR,</div><div class='add'>+                   "cli_to_glusterd for snapshot delete failed");</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+        dict_unref(snap_dict);</div><div class='add'>+        snap_dict = NULL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (snap_dict)</div><div class='add'>+        dict_unref(snap_dict);</div><div class='add'>+    GF_FREE(req.dict.dict_val);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int32_t</div><div class='add'>+gf_cli_snapshot_for_status(call_frame_t *frame, xlator_t *this, void *data)</div><div class='add'>+{</div><div class='add'>+    gf_cli_req req = {{</div><div class='add'>+        0,</div><div class='add'>+    }};</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int32_t cmd = -1;</div><div class='add'>+    cli_local_t *local = NULL;</div><div class='add'>+    dict_t *snap_dict = NULL;</div><div class='add'>+    int snapcount = 0;</div><div class='add'>+    int i = 0;</div><div class='add'>+</div><div class='add'>+    GF_VALIDATE_OR_GOTO("cli", frame, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("cli", frame-&gt;local, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("cli", this, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("cli", data, out);</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+</div><div class='add'>+    ret = dict_get_int32_sizen(local-&gt;dict, "sub-cmd", &amp;cmd);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log("cli", GF_LOG_ERROR, "Failed to get sub-cmd");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Snapshot status of single snap (i.e. GF_SNAP_STATUS_TYPE_SNAP)</div><div class='add'>+     * is already handled. Therefore we can return from here.</div><div class='add'>+     * If want to get status of all snaps in the system or volume then</div><div class='add'>+     * we should get them one by one.*/</div><div class='add'>+    if ((cmd == GF_SNAP_STATUS_TYPE_SNAP) ||</div><div class='add'>+        (cmd == GF_SNAP_STATUS_TYPE_ITER)) {</div><div class='add'>+        ret = 0;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_get_int32_sizen(local-&gt;dict, "status.snapcount", &amp;snapcount);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log("cli", GF_LOG_ERROR, "Could not get snapcount");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (snapcount == 0 &amp;&amp; !(global_state-&gt;mode &amp; GLUSTER_MODE_XML)) {</div><div class='add'>+        cli_out("No snapshots present");</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; snapcount; i++) {</div><div class='add'>+        ret = -1;</div><div class='add'>+</div><div class='add'>+        snap_dict = dict_new();</div><div class='add'>+        if (!snap_dict)</div><div class='add'>+            goto out;</div><div class='add'>+</div><div class='add'>+        ret = cli_populate_req_dict_for_status(snap_dict, local-&gt;dict, i);</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_log("cli", GF_LOG_ERROR,</div><div class='add'>+                   "Could not populate snap request dictionary");</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        ret = cli_to_glusterd(&amp;req, frame, gf_cli_snapshot_cbk,</div><div class='add'>+                              (xdrproc_t)xdr_gf_cli_req, snap_dict,</div><div class='add'>+                              GLUSTER_CLI_SNAP, this, cli_rpc_prog, NULL);</div><div class='add'>+</div><div class='add'>+        /* Ignore the return value and error for snapshot</div><div class='add'>+         * status of type "ALL" or "VOL"</div><div class='add'>+         *</div><div class='add'>+         * Scenario : There might be case where status command</div><div class='add'>+         * and delete command might be issued at the same time.</div><div class='add'>+         * In that case when status tried to fetch detail of</div><div class='add'>+         * snap which has been deleted by concurrent command,</div><div class='add'>+         * then it will show snapshot not present. Which will</div><div class='add'>+         * not be appropriate.</div><div class='add'>+         */</div><div class='add'>+        if (ret &amp;&amp; (cmd != GF_SNAP_STATUS_TYPE_ALL &amp;&amp;</div><div class='add'>+                    cmd != GF_SNAP_STATUS_TYPE_VOL)) {</div><div class='add'>+            gf_log("cli", GF_LOG_ERROR,</div><div class='add'>+                   "cli_to_glusterd for snapshot status failed");</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+        dict_unref(snap_dict);</div><div class='add'>+        snap_dict = NULL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+out:</div><div class='add'>+    if (snap_dict)</div><div class='add'>+        dict_unref(snap_dict);</div><div class='add'>+    GF_FREE(req.dict.dict_val);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int32_t</div><div class='add'>+gf_cli_snapshot(call_frame_t *frame, xlator_t *this, void *data)</div><div class='add'>+{</div><div class='add'>+    gf_cli_req req = {{</div><div class='add'>+        0,</div><div class='add'>+    }};</div><div class='add'>+    dict_t *options = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int tmp_ret = -1;</div><div class='add'>+    cli_local_t *local = NULL;</div><div class='add'>+    char *err_str = NULL;</div><div class='add'>+    int type = -1;</div><div class='add'>+</div><div class='add'>+    if (!frame || !frame-&gt;local || !this || !data)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+</div><div class='add'>+    options = data;</div><div class='add'>+</div><div class='add'>+    if (global_state-&gt;mode &amp; GLUSTER_MODE_XML) {</div><div class='add'>+        ret = cli_xml_snapshot_begin_composite_op(local);</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_log("cli", GF_LOG_ERROR,</div><div class='add'>+                   "Failed to begin snapshot xml composite op");</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = cli_to_glusterd(&amp;req, frame, gf_cli_snapshot_cbk,</div><div class='add'>+                          (xdrproc_t)xdr_gf_cli_req, options, GLUSTER_CLI_SNAP,</div><div class='add'>+                          this, cli_rpc_prog, NULL);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log("cli", GF_LOG_ERROR, "cli_to_glusterd for snapshot failed");</div><div class='add'>+        goto xmlend;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_get_int32_sizen(local-&gt;dict, "type", &amp;type);</div><div class='add'>+</div><div class='add'>+    if (GF_SNAP_OPTION_TYPE_STATUS == type) {</div><div class='add'>+        ret = gf_cli_snapshot_for_status(frame, this, data);</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_log("cli", GF_LOG_ERROR,</div><div class='add'>+                   "cli to glusterd for snapshot status command failed");</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        goto xmlend;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (GF_SNAP_OPTION_TYPE_DELETE == type) {</div><div class='add'>+        ret = gf_cli_snapshot_for_delete(frame, this, data);</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_log("cli", GF_LOG_ERROR,</div><div class='add'>+                   "cli to glusterd for snapshot delete command failed");</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        goto xmlend;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+</div><div class='add'>+xmlend:</div><div class='add'>+    if (global_state-&gt;mode &amp; GLUSTER_MODE_XML) {</div><div class='add'>+        ret = cli_xml_snapshot_end_composite_op(local);</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_log("cli", GF_LOG_ERROR,</div><div class='add'>+                   "Failed to end snapshot xml composite op");</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+out:</div><div class='add'>+    if (ret &amp;&amp; local &amp;&amp; GF_SNAP_OPTION_TYPE_STATUS == type) {</div><div class='add'>+        tmp_ret = dict_get_str_sizen(local-&gt;dict, "op_err_str", &amp;err_str);</div><div class='add'>+        if (tmp_ret || !err_str) {</div><div class='add'>+            cli_err("Snapshot Status : failed: %s",</div><div class='add'>+                    "Please check log file for details");</div><div class='add'>+        } else {</div><div class='add'>+            cli_err("Snapshot Status : failed: %s", err_str);</div><div class='add'>+            dict_del_sizen(local-&gt;dict, "op_err_str");</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    gf_log("cli", GF_LOG_DEBUG, RETURNING, ret);</div><div class='add'>+</div><div class='add'>+    GF_FREE(req.dict.dict_val);</div><div class='add'>+</div><div class='add'>+    if (global_state-&gt;mode &amp; GLUSTER_MODE_XML) {</div><div class='add'>+        /* XML mode handles its own error */</div><div class='add'>+        ret = 0;</div><div class='add'>+    }</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int32_t</div><div class='add'>+gf_cli_barrier_volume_cbk(struct rpc_req *req, struct iovec *iov, int count,</div><div class='add'>+                          void *myframe)</div><div class='add'>+{</div><div class='add'>+    gf_cli_rsp rsp = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(myframe);</div><div class='add'>+</div><div class='add'>+    if (-1 == req-&gt;rpc_status)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    ret = xdr_to_generic(*iov, &amp;rsp, (xdrproc_t)xdr_gf_cli_rsp);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        gf_log(((call_frame_t *)myframe)-&gt;this-&gt;name, GF_LOG_ERROR,</div><div class='add'>+               XDR_DECODE_FAIL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    gf_log("cli", GF_LOG_DEBUG, "Received response to barrier");</div><div class='add'>+</div><div class='add'>+    if (rsp.op_ret) {</div><div class='add'>+        if (rsp.op_errstr &amp;&amp; (strlen(rsp.op_errstr) &gt; 1)) {</div><div class='add'>+            cli_err("volume barrier: command unsuccessful : %s", rsp.op_errstr);</div><div class='add'>+        } else {</div><div class='add'>+            cli_err("volume barrier: command unsuccessful");</div><div class='add'>+        }</div><div class='add'>+    } else {</div><div class='add'>+        cli_out("volume barrier: command successful");</div><div class='add'>+    }</div><div class='add'>+    ret = rsp.op_ret;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    cli_cmd_broadcast_response(ret);</div><div class='add'>+    gf_free_xdr_cli_rsp(rsp);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+gf_cli_barrier_volume(call_frame_t *frame, xlator_t *this, void *data)</div><div class='add'>+{</div><div class='add'>+    gf_cli_req req = {{</div><div class='add'>+        0,</div><div class='add'>+    }};</div><div class='add'>+    dict_t *options = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    options = data;</div><div class='add'>+</div><div class='add'>+    ret = cli_to_glusterd(&amp;req, frame, gf_cli_barrier_volume_cbk,</div><div class='add'>+                          (xdrproc_t)xdr_gf_cli_req, options,</div><div class='add'>+                          GLUSTER_CLI_BARRIER_VOLUME, this, cli_rpc_prog, NULL);</div><div class='add'>+    gf_log("cli", GF_LOG_DEBUG, RETURNING, ret);</div><div class='add'>+</div><div class='add'>+    GF_FREE(req.dict.dict_val);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int32_t</div><div class='add'>+gf_cli_get_vol_opt_cbk(struct rpc_req *req, struct iovec *iov, int count,</div><div class='add'>+                       void *myframe)</div><div class='add'>+{</div><div class='add'>+    gf_cli_rsp rsp = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int ret = -1;</div><div class='add'>+    dict_t *dict = NULL;</div><div class='add'>+    char *key = NULL;</div><div class='add'>+    char *value = NULL;</div><div class='add'>+    char msg[1024] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int i = 0;</div><div class='add'>+    char dict_key[50] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(myframe);</div><div class='add'>+</div><div class='add'>+    if (-1 == req-&gt;rpc_status)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    ret = xdr_to_generic(*iov, &amp;rsp, (xdrproc_t)xdr_gf_cli_rsp);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        gf_log(((call_frame_t *)myframe)-&gt;this-&gt;name, GF_LOG_ERROR,</div><div class='add'>+               XDR_DECODE_FAIL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    gf_log("cli", GF_LOG_DEBUG, "Received response to get volume option");</div><div class='add'>+</div><div class='add'>+    if (rsp.op_ret) {</div><div class='add'>+        if (strcmp(rsp.op_errstr, ""))</div><div class='add'>+            snprintf(msg, sizeof(msg), "volume get option: failed: %s",</div><div class='add'>+                     rsp.op_errstr);</div><div class='add'>+        else</div><div class='add'>+            snprintf(msg, sizeof(msg), "volume get option: failed");</div><div class='add'>+</div><div class='add'>+        if (global_state-&gt;mode &amp; GLUSTER_MODE_XML) {</div><div class='add'>+            ret = cli_xml_output_str("volGetopts", msg, rsp.op_ret,</div><div class='add'>+                                     rsp.op_errno, rsp.op_errstr);</div><div class='add'>+            if (ret) {</div><div class='add'>+                gf_log("cli", GF_LOG_ERROR, XML_ERROR);</div><div class='add'>+            }</div><div class='add'>+        } else {</div><div class='add'>+            cli_err("%s", msg);</div><div class='add'>+        }</div><div class='add'>+        ret = rsp.op_ret;</div><div class='add'>+        goto out_nolog;</div><div class='add'>+    }</div><div class='add'>+    dict = dict_new();</div><div class='add'>+</div><div class='add'>+    if (!dict) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_unserialize(rsp.dict.dict_val, rsp.dict.dict_len, &amp;dict);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log("cli", GF_LOG_ERROR, DICT_UNSERIALIZE_FAIL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (global_state-&gt;mode &amp; GLUSTER_MODE_XML) {</div><div class='add'>+        ret = cli_xml_output_vol_getopts(dict, rsp.op_ret, rsp.op_errno,</div><div class='add'>+                                         rsp.op_errstr);</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_log("cli", GF_LOG_ERROR, XML_ERROR);</div><div class='add'>+            ret = 0;</div><div class='add'>+        }</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_get_str_sizen(dict, "warning", &amp;value);</div><div class='add'>+    if (!ret) {</div><div class='add'>+        cli_out("%s", value);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_get_int32_sizen(dict, "count", &amp;count);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log("cli", GF_LOG_ERROR,</div><div class='add'>+               "Failed to retrieve count from the dictionary");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (count &lt;= 0) {</div><div class='add'>+        gf_log("cli", GF_LOG_ERROR, "Value of count :%d is invalid", count);</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    cli_out("%-40s%-40s", "Option", "Value");</div><div class='add'>+    cli_out("%-40s%-40s", "------", "-----");</div><div class='add'>+    for (i = 1; i &lt;= count; i++) {</div><div class='add'>+        ret = snprintf(dict_key, sizeof dict_key, "key%d", i);</div><div class='add'>+        ret = dict_get_strn(dict, dict_key, ret, &amp;key);</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_log("cli", GF_LOG_ERROR,</div><div class='add'>+                   "Failed to retrieve %s from the dictionary", dict_key);</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+        ret = snprintf(dict_key, sizeof dict_key, "value%d", i);</div><div class='add'>+        ret = dict_get_strn(dict, dict_key, ret, &amp;value);</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_log("cli", GF_LOG_ERROR,</div><div class='add'>+                   "Failed to retrieve key value for %s from the dictionary",</div><div class='add'>+                   dict_key);</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+        cli_out("%-40s%-40s", key, value);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (ret) {</div><div class='add'>+        cli_out(</div><div class='add'>+            "volume get option failed. Check the cli/glusterd log "</div><div class='add'>+            "file for more details");</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out_nolog:</div><div class='add'>+    if (dict)</div><div class='add'>+        dict_unref(dict);</div><div class='add'>+    cli_cmd_broadcast_response(ret);</div><div class='add'>+    gf_free_xdr_cli_rsp(rsp);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+gf_cli_get_vol_opt(call_frame_t *frame, xlator_t *this, void *data)</div><div class='add'>+{</div><div class='add'>+    gf_cli_req req = {{</div><div class='add'>+        0,</div><div class='add'>+    }};</div><div class='add'>+    dict_t *options = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    options = data;</div><div class='add'>+</div><div class='add'>+    ret = cli_to_glusterd(&amp;req, frame, gf_cli_get_vol_opt_cbk,</div><div class='add'>+                          (xdrproc_t)xdr_gf_cli_req, options,</div><div class='add'>+                          GLUSTER_CLI_GET_VOL_OPT, this, cli_rpc_prog, NULL);</div><div class='add'>+    gf_log("cli", GF_LOG_DEBUG, RETURNING, ret);</div><div class='add'>+</div><div class='add'>+    GF_FREE(req.dict.dict_val);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+add_cli_cmd_timeout_to_dict(dict_t *dict)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    if (cli_default_conn_timeout &gt; 120) {</div><div class='add'>+        ret = dict_set_uint32(dict, "timeout", cli_default_conn_timeout);</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_log("cli", GF_LOG_INFO, "Failed to save timeout to dict");</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+cli_to_glusterd(gf_cli_req *req, call_frame_t *frame, fop_cbk_fn_t cbkfn,</div><div class='add'>+                xdrproc_t xdrproc, dict_t *dict, int procnum, xlator_t *this,</div><div class='add'>+                rpc_clnt_prog_t *prog, struct iobref *iobref)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+    size_t len = 0;</div><div class='add'>+    char *cmd = NULL;</div><div class='add'>+    int i = 0;</div><div class='add'>+    const char **words = NULL;</div><div class='add'>+    cli_local_t *local = NULL;</div><div class='add'>+</div><div class='add'>+    if (!this || !frame || !frame-&gt;local || !dict) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+</div><div class='add'>+    if (!local-&gt;words) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    words = local-&gt;words;</div><div class='add'>+</div><div class='add'>+    while (words[i])</div><div class='add'>+        len += strlen(words[i++]) + 1;</div><div class='add'>+</div><div class='add'>+    cmd = GF_MALLOC(len + 1, gf_common_mt_char);</div><div class='add'>+    if (!cmd) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    cmd[0] = '\0';</div><div class='add'>+</div><div class='add'>+    for (i = 0; words[i]; i++) {</div><div class='add'>+        strncat(cmd, words[i], len - 1);</div><div class='add'>+        if (words[i + 1] != NULL)</div><div class='add'>+            strncat(cmd, " ", len - 1);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_set_dynstr_sizen(dict, "cmd-str", cmd);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    ret = add_cli_cmd_timeout_to_dict(dict);</div><div class='add'>+</div><div class='add'>+    ret = dict_allocate_and_serialize(dict, &amp;(req-&gt;dict).dict_val,</div><div class='add'>+                                      &amp;(req-&gt;dict).dict_len);</div><div class='add'>+</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        gf_log(this-&gt;name, GF_LOG_DEBUG,</div><div class='add'>+               "failed to get serialized length of dict");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = cli_cmd_submit(NULL, req, frame, prog, procnum, iobref, this, cbkfn,</div><div class='add'>+                         (xdrproc_t)xdrproc);</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+gf_cli_print_bitrot_scrub_status(dict_t *dict)</div><div class='add'>+{</div><div class='add'>+    int i = 1;</div><div class='add'>+    int j = 0;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int count = 0;</div><div class='add'>+    char key[64] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    char *volname = NULL;</div><div class='add'>+    char *node_name = NULL;</div><div class='add'>+    char *scrub_freq = NULL;</div><div class='add'>+    char *state_scrub = NULL;</div><div class='add'>+    char *scrub_impact = NULL;</div><div class='add'>+    char *bad_file_str = NULL;</div><div class='add'>+    char *scrub_log_file = NULL;</div><div class='add'>+    char *bitrot_log_file = NULL;</div><div class='add'>+    uint64_t scrub_files = 0;</div><div class='add'>+    uint64_t unsigned_files = 0;</div><div class='add'>+    uint64_t scrub_time = 0;</div><div class='add'>+    uint64_t days = 0;</div><div class='add'>+    uint64_t hours = 0;</div><div class='add'>+    uint64_t minutes = 0;</div><div class='add'>+    uint64_t seconds = 0;</div><div class='add'>+    char *last_scrub = NULL;</div><div class='add'>+    uint64_t error_count = 0;</div><div class='add'>+    int8_t scrub_running = 0;</div><div class='add'>+    char *scrub_state_op = NULL;</div><div class='add'>+</div><div class='add'>+    ret = dict_get_int32_sizen(dict, "count", &amp;count);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log("cli", GF_LOG_ERROR,</div><div class='add'>+               "failed to get count value from dictionary");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_get_str_sizen(dict, "volname", &amp;volname);</div><div class='add'>+    if (ret)</div><div class='add'>+        gf_log("cli", GF_LOG_TRACE, "failed to get volume name");</div><div class='add'>+</div><div class='add'>+    ret = dict_get_str_sizen(dict, "features.scrub", &amp;state_scrub);</div><div class='add'>+    if (ret)</div><div class='add'>+        gf_log("cli", GF_LOG_TRACE, "failed to get scrub state value");</div><div class='add'>+</div><div class='add'>+    ret = dict_get_str_sizen(dict, "features.scrub-throttle", &amp;scrub_impact);</div><div class='add'>+    if (ret)</div><div class='add'>+        gf_log("cli", GF_LOG_TRACE, "failed to get scrub impact value");</div><div class='add'>+</div><div class='add'>+    ret = dict_get_str_sizen(dict, "features.scrub-freq", &amp;scrub_freq);</div><div class='add'>+    if (ret)</div><div class='add'>+        gf_log("cli", GF_LOG_TRACE, "failed to get scrub -freq value");</div><div class='add'>+</div><div class='add'>+    ret = dict_get_str_sizen(dict, "bitrot_log_file", &amp;bitrot_log_file);</div><div class='add'>+    if (ret)</div><div class='add'>+        gf_log("cli", GF_LOG_TRACE, "failed to get bitrot log file location");</div><div class='add'>+</div><div class='add'>+    ret = dict_get_str_sizen(dict, "scrub_log_file", &amp;scrub_log_file);</div><div class='add'>+    if (ret)</div><div class='add'>+        gf_log("cli", GF_LOG_TRACE, "failed to get scrubber log file location");</div><div class='add'>+</div><div class='add'>+    for (i = 1; i &lt;= count; i++) {</div><div class='add'>+        snprintf(key, sizeof(key), "scrub-running-%d", i);</div><div class='add'>+        ret = dict_get_int8(dict, key, &amp;scrub_running);</div><div class='add'>+        if (ret)</div><div class='add'>+            gf_log("cli", GF_LOG_TRACE, "failed to get scrubbed files");</div><div class='add'>+        if (scrub_running)</div><div class='add'>+            break;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (scrub_running)</div><div class='add'>+        gf_asprintf(&amp;scrub_state_op, "%s (In Progress)", state_scrub);</div><div class='add'>+    else</div><div class='add'>+        gf_asprintf(&amp;scrub_state_op, "%s (Idle)", state_scrub);</div><div class='add'>+</div><div class='add'>+    cli_out("\n%s: %s\n", "Volume name ", volname);</div><div class='add'>+</div><div class='add'>+    cli_out("%s: %s\n", "State of scrub", scrub_state_op);</div><div class='add'>+</div><div class='add'>+    cli_out("%s: %s\n", "Scrub impact", scrub_impact);</div><div class='add'>+</div><div class='add'>+    cli_out("%s: %s\n", "Scrub frequency", scrub_freq);</div><div class='add'>+</div><div class='add'>+    cli_out("%s: %s\n", "Bitrot error log location", bitrot_log_file);</div><div class='add'>+</div><div class='add'>+    cli_out("%s: %s\n", "Scrubber error log location", scrub_log_file);</div><div class='add'>+</div><div class='add'>+    for (i = 1; i &lt;= count; i++) {</div><div class='add'>+        /* Reset the variables to prevent carryover of values */</div><div class='add'>+        node_name = NULL;</div><div class='add'>+        last_scrub = NULL;</div><div class='add'>+        scrub_time = 0;</div><div class='add'>+        error_count = 0;</div><div class='add'>+        scrub_files = 0;</div><div class='add'>+        unsigned_files = 0;</div><div class='add'>+</div><div class='add'>+        snprintf(key, sizeof(key), "node-name-%d", i);</div><div class='add'>+        ret = dict_get_str(dict, key, &amp;node_name);</div><div class='add'>+        if (ret)</div><div class='add'>+            gf_log("cli", GF_LOG_TRACE, "failed to get node-name");</div><div class='add'>+</div><div class='add'>+        snprintf(key, sizeof(key), "scrubbed-files-%d", i);</div><div class='add'>+        ret = dict_get_uint64(dict, key, &amp;scrub_files);</div><div class='add'>+        if (ret)</div><div class='add'>+            gf_log("cli", GF_LOG_TRACE, "failed to get scrubbed files");</div><div class='add'>+</div><div class='add'>+        snprintf(key, sizeof(key), "unsigned-files-%d", i);</div><div class='add'>+        ret = dict_get_uint64(dict, key, &amp;unsigned_files);</div><div class='add'>+        if (ret)</div><div class='add'>+            gf_log("cli", GF_LOG_TRACE, "failed to get unsigned files");</div><div class='add'>+</div><div class='add'>+        snprintf(key, sizeof(key), "scrub-duration-%d", i);</div><div class='add'>+        ret = dict_get_uint64(dict, key, &amp;scrub_time);</div><div class='add'>+        if (ret)</div><div class='add'>+            gf_log("cli", GF_LOG_TRACE, "failed to get last scrub duration");</div><div class='add'>+</div><div class='add'>+        snprintf(key, sizeof(key), "last-scrub-time-%d", i);</div><div class='add'>+        ret = dict_get_str(dict, key, &amp;last_scrub);</div><div class='add'>+        if (ret)</div><div class='add'>+            gf_log("cli", GF_LOG_TRACE, "failed to get last scrub time");</div><div class='add'>+        snprintf(key, sizeof(key), "error-count-%d", i);</div><div class='add'>+        ret = dict_get_uint64(dict, key, &amp;error_count);</div><div class='add'>+        if (ret)</div><div class='add'>+            gf_log("cli", GF_LOG_TRACE, "failed to get error count");</div><div class='add'>+</div><div class='add'>+        cli_out("\n%s\n",</div><div class='add'>+                "=========================================================");</div><div class='add'>+</div><div class='add'>+        cli_out("%s: %s\n", "Node", node_name);</div><div class='add'>+</div><div class='add'>+        cli_out("%s: %" PRIu64 "\n", "Number of Scrubbed files", scrub_files);</div><div class='add'>+</div><div class='add'>+        cli_out("%s: %" PRIu64 "\n", "Number of Skipped files", unsigned_files);</div><div class='add'>+</div><div class='add'>+        if ((!last_scrub) || !strcmp(last_scrub, ""))</div><div class='add'>+            cli_out("%s: %s\n", "Last completed scrub time",</div><div class='add'>+                    "Scrubber pending to complete.");</div><div class='add'>+        else</div><div class='add'>+            cli_out("%s: %s\n", "Last completed scrub time", last_scrub);</div><div class='add'>+</div><div class='add'>+        /* Printing last scrub duration time in human readable form*/</div><div class='add'>+        seconds = scrub_time % 60;</div><div class='add'>+        minutes = (scrub_time / 60) % 60;</div><div class='add'>+        hours = (scrub_time / 3600) % 24;</div><div class='add'>+        days = scrub_time / 86400;</div><div class='add'>+        cli_out("%s: %" PRIu64 ":%" PRIu64 ":%" PRIu64 ":%" PRIu64 "\n",</div><div class='add'>+                "Duration of last scrub (D:M:H:M:S)", days, hours, minutes,</div><div class='add'>+                seconds);</div><div class='add'>+</div><div class='add'>+        cli_out("%s: %" PRIu64 "\n", "Error count", error_count);</div><div class='add'>+</div><div class='add'>+        if (error_count) {</div><div class='add'>+            cli_out("%s:\n", "Corrupted object's [GFID]");</div><div class='add'>+            /* Printing list of bad file's (Corrupted object's)*/</div><div class='add'>+            for (j = 0; j &lt; error_count; j++) {</div><div class='add'>+                snprintf(key, sizeof(key), "quarantine-%d-%d", j, i);</div><div class='add'>+                ret = dict_get_str(dict, key, &amp;bad_file_str);</div><div class='add'>+                if (!ret) {</div><div class='add'>+                    cli_out("%s\n", bad_file_str);</div><div class='add'>+                }</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    cli_out("%s\n",</div><div class='add'>+            "=========================================================");</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    GF_FREE(scrub_state_op);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+gf_cli_bitrot_cbk(struct rpc_req *req, struct iovec *iov, int count,</div><div class='add'>+                  void *myframe)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int type = 0;</div><div class='add'>+    gf_cli_rsp rsp = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    dict_t *dict = NULL;</div><div class='add'>+    char *scrub_cmd = NULL;</div><div class='add'>+    char *volname = NULL;</div><div class='add'>+    char *cmd_str = NULL;</div><div class='add'>+    char *cmd_op = NULL;</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(myframe);</div><div class='add'>+</div><div class='add'>+    if (req-&gt;rpc_status == -1) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = xdr_to_generic(*iov, &amp;rsp, (xdrproc_t)xdr_gf_cli_rsp);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        gf_log(((call_frame_t *)myframe)-&gt;this-&gt;name, GF_LOG_ERROR,</div><div class='add'>+               XDR_DECODE_FAIL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (rsp.op_ret) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        if (global_state-&gt;mode &amp; GLUSTER_MODE_XML)</div><div class='add'>+            goto xml_output;</div><div class='add'>+</div><div class='add'>+        if (strcmp(rsp.op_errstr, ""))</div><div class='add'>+            cli_err("Bitrot command failed : %s", rsp.op_errstr);</div><div class='add'>+        else</div><div class='add'>+            cli_err("Bitrot command : failed");</div><div class='add'>+</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (rsp.dict.dict_len) {</div><div class='add'>+        /* Unserialize the dictionary */</div><div class='add'>+        dict = dict_new();</div><div class='add'>+</div><div class='add'>+        if (!dict) {</div><div class='add'>+            ret = -1;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        ret = dict_unserialize(rsp.dict.dict_val, rsp.dict.dict_len, &amp;dict);</div><div class='add'>+</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_log("cli", GF_LOG_ERROR, DICT_UNSERIALIZE_FAIL);</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    gf_log("cli", GF_LOG_DEBUG, "Received resp to bit rot command");</div><div class='add'>+</div><div class='add'>+    ret = dict_get_int32_sizen(dict, "type", &amp;type);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log("cli", GF_LOG_ERROR, "Failed to get command type");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if ((type == GF_BITROT_CMD_SCRUB_STATUS) &amp;&amp;</div><div class='add'>+        !(global_state-&gt;mode &amp; GLUSTER_MODE_XML)) {</div><div class='add'>+        ret = gf_cli_print_bitrot_scrub_status(dict);</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_log("cli", GF_LOG_ERROR, "Failed to print bitrot scrub status");</div><div class='add'>+        }</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Ignoring the error, as using dict val for cli output only */</div><div class='add'>+    ret = dict_get_str_sizen(dict, "volname", &amp;volname);</div><div class='add'>+    if (ret)</div><div class='add'>+        gf_log("cli", GF_LOG_TRACE, "failed to get volume name");</div><div class='add'>+</div><div class='add'>+    ret = dict_get_str_sizen(dict, "scrub-value", &amp;scrub_cmd);</div><div class='add'>+    if (ret)</div><div class='add'>+        gf_log("cli", GF_LOG_TRACE, "Failed to get scrub command");</div><div class='add'>+</div><div class='add'>+    ret = dict_get_str_sizen(dict, "cmd-str", &amp;cmd_str);</div><div class='add'>+    if (ret)</div><div class='add'>+        gf_log("cli", GF_LOG_TRACE, "failed to get command string");</div><div class='add'>+</div><div class='add'>+    if (cmd_str)</div><div class='add'>+        cmd_op = strrchr(cmd_str, ' ') + 1;</div><div class='add'>+</div><div class='add'>+    switch (type) {</div><div class='add'>+        case GF_BITROT_OPTION_TYPE_ENABLE:</div><div class='add'>+            cli_out("volume bitrot: success bitrot enabled for volume %s",</div><div class='add'>+                    volname);</div><div class='add'>+            ret = 0;</div><div class='add'>+            goto out;</div><div class='add'>+        case GF_BITROT_OPTION_TYPE_DISABLE:</div><div class='add'>+            cli_out("volume bitrot: success bitrot disabled for volume %s",</div><div class='add'>+                    volname);</div><div class='add'>+            ret = 0;</div><div class='add'>+            goto out;</div><div class='add'>+        case GF_BITROT_CMD_SCRUB_ONDEMAND:</div><div class='add'>+            cli_out("volume bitrot: scrubber started ondemand for volume %s",</div><div class='add'>+                    volname);</div><div class='add'>+            ret = 0;</div><div class='add'>+            goto out;</div><div class='add'>+        case GF_BITROT_OPTION_TYPE_SCRUB:</div><div class='add'>+            if (!strncmp("pause", scrub_cmd, sizeof("pause")))</div><div class='add'>+                cli_out("volume bitrot: scrubber paused for volume %s",</div><div class='add'>+                        volname);</div><div class='add'>+            if (!strncmp("resume", scrub_cmd, sizeof("resume")))</div><div class='add'>+                cli_out("volume bitrot: scrubber resumed for volume %s",</div><div class='add'>+                        volname);</div><div class='add'>+            ret = 0;</div><div class='add'>+            goto out;</div><div class='add'>+        case GF_BITROT_OPTION_TYPE_SCRUB_FREQ:</div><div class='add'>+            cli_out(</div><div class='add'>+                "volume bitrot: scrub-frequency is set to %s "</div><div class='add'>+                "successfully for volume %s",</div><div class='add'>+                cmd_op, volname);</div><div class='add'>+            ret = 0;</div><div class='add'>+            goto out;</div><div class='add'>+        case GF_BITROT_OPTION_TYPE_SCRUB_THROTTLE:</div><div class='add'>+            cli_out(</div><div class='add'>+                "volume bitrot: scrub-throttle is set to %s "</div><div class='add'>+                "successfully for volume %s",</div><div class='add'>+                cmd_op, volname);</div><div class='add'>+            ret = 0;</div><div class='add'>+            goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+xml_output:</div><div class='add'>+    if (global_state-&gt;mode &amp; GLUSTER_MODE_XML) {</div><div class='add'>+        ret = cli_xml_output_vol_profile(dict, rsp.op_ret, rsp.op_errno,</div><div class='add'>+                                         rsp.op_errstr);</div><div class='add'>+        if (ret)</div><div class='add'>+            gf_log("cli", GF_LOG_ERROR, XML_ERROR);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (!rsp.op_ret)</div><div class='add'>+        cli_out("volume bitrot: success");</div><div class='add'>+</div><div class='add'>+    ret = rsp.op_ret;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (dict)</div><div class='add'>+        dict_unref(dict);</div><div class='add'>+</div><div class='add'>+    gf_free_xdr_cli_rsp(rsp);</div><div class='add'>+    cli_cmd_broadcast_response(ret);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int32_t</div><div class='add'>+gf_cli_bitrot(call_frame_t *frame, xlator_t *this, void *data)</div><div class='add'>+{</div><div class='add'>+    gf_cli_req req = {{</div><div class='add'>+        0,</div><div class='add'>+    }};</div><div class='add'>+    dict_t *options = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    options = data;</div><div class='add'>+</div><div class='add'>+    ret = cli_to_glusterd(&amp;req, frame, gf_cli_bitrot_cbk,</div><div class='add'>+                          (xdrproc_t)xdr_gf_cli_req, options,</div><div class='add'>+                          GLUSTER_CLI_BITROT, this, cli_rpc_prog, NULL);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log("cli", GF_LOG_ERROR, "cli_to_glusterd for bitrot failed");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    gf_log("cli", GF_LOG_DEBUG, RETURNING, ret);</div><div class='add'>+</div><div class='add'>+    GF_FREE(req.dict.dict_val);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static struct rpc_clnt_procedure gluster_cli_actors[GLUSTER_CLI_MAXVALUE] = {</div><div class='add'>+    [GLUSTER_CLI_NULL] = {"NULL", NULL},</div><div class='add'>+    [GLUSTER_CLI_PROBE] = {"PROBE_QUERY", gf_cli_probe},</div><div class='add'>+    [GLUSTER_CLI_DEPROBE] = {"DEPROBE_QUERY", gf_cli_deprobe},</div><div class='add'>+    [GLUSTER_CLI_LIST_FRIENDS] = {"LIST_FRIENDS", gf_cli_list_friends},</div><div class='add'>+    [GLUSTER_CLI_UUID_RESET] = {"UUID_RESET", gf_cli3_1_uuid_reset},</div><div class='add'>+    [GLUSTER_CLI_UUID_GET] = {"UUID_GET", gf_cli3_1_uuid_get},</div><div class='add'>+    [GLUSTER_CLI_CREATE_VOLUME] = {"CREATE_VOLUME", gf_cli_create_volume},</div><div class='add'>+    [GLUSTER_CLI_DELETE_VOLUME] = {"DELETE_VOLUME", gf_cli_delete_volume},</div><div class='add'>+    [GLUSTER_CLI_START_VOLUME] = {"START_VOLUME", gf_cli_start_volume},</div><div class='add'>+    [GLUSTER_CLI_STOP_VOLUME] = {"STOP_VOLUME", gf_cli_stop_volume},</div><div class='add'>+    [GLUSTER_CLI_RENAME_VOLUME] = {"RENAME_VOLUME", gf_cli_rename_volume},</div><div class='add'>+    [GLUSTER_CLI_DEFRAG_VOLUME] = {"DEFRAG_VOLUME", gf_cli_defrag_volume},</div><div class='add'>+    [GLUSTER_CLI_GET_VOLUME] = {"GET_VOLUME", gf_cli_get_volume},</div><div class='add'>+    [GLUSTER_CLI_GET_NEXT_VOLUME] = {"GET_NEXT_VOLUME", gf_cli_get_next_volume},</div><div class='add'>+    [GLUSTER_CLI_SET_VOLUME] = {"SET_VOLUME", gf_cli_set_volume},</div><div class='add'>+    [GLUSTER_CLI_ADD_BRICK] = {"ADD_BRICK", gf_cli_add_brick},</div><div class='add'>+    [GLUSTER_CLI_REMOVE_BRICK] = {"REMOVE_BRICK", gf_cli_remove_brick},</div><div class='add'>+    [GLUSTER_CLI_REPLACE_BRICK] = {"REPLACE_BRICK", gf_cli_replace_brick},</div><div class='add'>+    [GLUSTER_CLI_LOG_ROTATE] = {"LOG ROTATE", gf_cli_log_rotate},</div><div class='add'>+    [GLUSTER_CLI_GETSPEC] = {"GETSPEC", gf_cli_getspec},</div><div class='add'>+    [GLUSTER_CLI_PMAP_PORTBYBRICK] = {"PMAP PORTBYBRICK", gf_cli_pmap_b2p},</div><div class='add'>+    [GLUSTER_CLI_SYNC_VOLUME] = {"SYNC_VOLUME", gf_cli_sync_volume},</div><div class='add'>+    [GLUSTER_CLI_RESET_VOLUME] = {"RESET_VOLUME", gf_cli_reset_volume},</div><div class='add'>+    [GLUSTER_CLI_FSM_LOG] = {"FSM_LOG", gf_cli_fsm_log},</div><div class='add'>+    [GLUSTER_CLI_GSYNC_SET] = {"GSYNC_SET", gf_cli_gsync_set},</div><div class='add'>+    [GLUSTER_CLI_PROFILE_VOLUME] = {"PROFILE_VOLUME", gf_cli_profile_volume},</div><div class='add'>+    [GLUSTER_CLI_QUOTA] = {"QUOTA", gf_cli_quota},</div><div class='add'>+    [GLUSTER_CLI_TOP_VOLUME] = {"TOP_VOLUME", gf_cli_top_volume},</div><div class='add'>+    [GLUSTER_CLI_GETWD] = {"GETWD", gf_cli_getwd},</div><div class='add'>+    [GLUSTER_CLI_STATUS_VOLUME] = {"STATUS_VOLUME", gf_cli_status_volume},</div><div class='add'>+    [GLUSTER_CLI_STATUS_ALL] = {"STATUS_ALL", gf_cli_status_volume_all},</div><div class='add'>+    [GLUSTER_CLI_MOUNT] = {"MOUNT", gf_cli_mount},</div><div class='add'>+    [GLUSTER_CLI_UMOUNT] = {"UMOUNT", gf_cli_umount},</div><div class='add'>+    [GLUSTER_CLI_HEAL_VOLUME] = {"HEAL_VOLUME", gf_cli_heal_volume},</div><div class='add'>+    [GLUSTER_CLI_STATEDUMP_VOLUME] = {"STATEDUMP_VOLUME",</div><div class='add'>+                                      gf_cli_statedump_volume},</div><div class='add'>+    [GLUSTER_CLI_LIST_VOLUME] = {"LIST_VOLUME", gf_cli_list_volume},</div><div class='add'>+    [GLUSTER_CLI_CLRLOCKS_VOLUME] = {"CLEARLOCKS_VOLUME",</div><div class='add'>+                                     gf_cli_clearlocks_volume},</div><div class='add'>+    [GLUSTER_CLI_COPY_FILE] = {"COPY_FILE", gf_cli_copy_file},</div><div class='add'>+    [GLUSTER_CLI_SYS_EXEC] = {"SYS_EXEC", gf_cli_sys_exec},</div><div class='add'>+    [GLUSTER_CLI_SNAP] = {"SNAP", gf_cli_snapshot},</div><div class='add'>+    [GLUSTER_CLI_BARRIER_VOLUME] = {"BARRIER VOLUME", gf_cli_barrier_volume},</div><div class='add'>+    [GLUSTER_CLI_GET_VOL_OPT] = {"GET_VOL_OPT", gf_cli_get_vol_opt},</div><div class='add'>+    [GLUSTER_CLI_BITROT] = {"BITROT", gf_cli_bitrot},</div><div class='add'>+    [GLUSTER_CLI_GET_STATE] = {"GET_STATE", gf_cli_get_state},</div><div class='add'>+    [GLUSTER_CLI_RESET_BRICK] = {"RESET_BRICK", gf_cli_reset_brick},</div><div class='add'>+    [GLUSTER_CLI_GANESHA] = {"GANESHA", gf_cli_ganesha},</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct rpc_clnt_program cli_prog = {</div><div class='add'>+    .progname = "Gluster CLI",</div><div class='add'>+    .prognum = GLUSTER_CLI_PROGRAM,</div><div class='add'>+    .progver = GLUSTER_CLI_VERSION,</div><div class='add'>+    .numproc = GLUSTER_CLI_MAXVALUE,</div><div class='add'>+    .proctable = gluster_cli_actors,</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+static struct rpc_clnt_procedure cli_quotad_procs[GF_AGGREGATOR_MAXVALUE] = {</div><div class='add'>+    [GF_AGGREGATOR_NULL] = {"NULL", NULL},</div><div class='add'>+    [GF_AGGREGATOR_LOOKUP] = {"LOOKUP", NULL},</div><div class='add'>+    [GF_AGGREGATOR_GETLIMIT] = {"GETLIMIT", cli_quotad_getlimit},</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct rpc_clnt_program cli_quotad_clnt = {</div><div class='add'>+    .progname = "CLI Quotad client",</div><div class='add'>+    .prognum = GLUSTER_AGGREGATOR_PROGRAM,</div><div class='add'>+    .progver = GLUSTER_AGGREGATOR_VERSION,</div><div class='add'>+    .numproc = GF_AGGREGATOR_MAXVALUE,</div><div class='add'>+    .proctable = cli_quotad_procs,</div><div class='add'>+};</div><div class='head'>diff --git a/cli/src/cli-xml-output.c b/cli/src/cli-xml-output.c<br/>new file mode 100644<br/>index 00000000000..069de75801c<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/cli/src/cli-xml-output.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>cli/src/cli-xml-output.c</a></div><div class='hunk'>@@ -0,0 +1,5839 @@</div><div class='add'>+/*</div><div class='add'>+   Copyright (c) 2010-2012 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+   This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+   This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+   General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+   later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+   cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+#include &lt;stdlib.h&gt;</div><div class='add'>+#include "cli.h"</div><div class='add'>+#include "cli1-xdr.h"</div><div class='add'>+#include &lt;glusterfs/run.h&gt;</div><div class='add'>+#include &lt;glusterfs/compat.h&gt;</div><div class='add'>+#include &lt;glusterfs/syscall.h&gt;</div><div class='add'>+#include &lt;glusterfs/upcall-utils.h&gt;</div><div class='add'>+</div><div class='add'>+enum gf_task_types { GF_TASK_TYPE_REBALANCE, GF_TASK_TYPE_REMOVE_BRICK };</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+ * IMPORTANT NOTE:</div><div class='add'>+ * All exported functions in this file which use libxml need use a</div><div class='add'>+ * #if (HAVE_LIB_XML), #else, #endif</div><div class='add'>+ * For eg,</div><div class='add'>+ *      int exported_func () {</div><div class='add'>+ *              #if (HAVE_LIB_XML)</div><div class='add'>+ *                      &lt;Stuff using libxml&gt;</div><div class='add'>+ *              #else</div><div class='add'>+ *                      return 0;</div><div class='add'>+ *              #endif</div><div class='add'>+ *      }</div><div class='add'>+ *</div><div class='add'>+ *  All other functions, which are called internally within this file need to be</div><div class='add'>+ *  within #if (HAVE_LIB_XML), #endif statements</div><div class='add'>+ *  For eg,</div><div class='add'>+ *      #if (HAVE_LIB_XML)</div><div class='add'>+ *      int internal_func ()</div><div class='add'>+ *      {</div><div class='add'>+ *      }</div><div class='add'>+ *      #endif</div><div class='add'>+ *</div><div class='add'>+ *  Following the above format ensures that all xml related code is compiled</div><div class='add'>+ *  only when libxml2 is present, and also keeps the rest of the codebase free</div><div class='add'>+ *  of #if (HAVE_LIB_XML)</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+#if (HAVE_LIB_XML)</div><div class='add'>+</div><div class='add'>+#include &lt;libxml/encoding.h&gt;</div><div class='add'>+#include &lt;libxml/xmlwriter.h&gt;</div><div class='add'>+</div><div class='add'>+#define XML_RET_CHECK_AND_GOTO(ret, label)                                     \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        if (ret &lt; 0) {                                                         \</div><div class='add'>+            ret = -1;                                                          \</div><div class='add'>+            goto label;                                                        \</div><div class='add'>+        } else                                                                 \</div><div class='add'>+            ret = 0;                                                           \</div><div class='add'>+    } while (0)</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+cli_begin_xml_output(xmlTextWriterPtr *writer, xmlDocPtr *doc)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    *writer = xmlNewTextWriterDoc(doc, 0);</div><div class='add'>+    if (*writer == NULL) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = xmlTextWriterStartDocument(*writer, "1.0", "UTF-8", "yes");</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    /* &lt;cliOutput&gt; */</div><div class='add'>+    ret = xmlTextWriterStartElement(*writer, (xmlChar *)"cliOutput");</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    gf_log("cli", GF_LOG_DEBUG, "Returning %d", ret);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+cli_end_xml_output(xmlTextWriterPtr writer, xmlDocPtr doc)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    /* &lt;/cliOutput&gt; */</div><div class='add'>+    ret = xmlTextWriterEndElement(writer);</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    ret = xmlTextWriterEndDocument(writer);</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    /* Dump xml document to stdout and pretty format it */</div><div class='add'>+    xmlSaveFormatFileEnc("-", doc, "UTF-8", 1);</div><div class='add'>+</div><div class='add'>+    xmlFreeTextWriter(writer);</div><div class='add'>+    xmlFreeDoc(doc);</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    gf_log("cli", GF_LOG_DEBUG, "Returning %d", ret);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+cli_xml_output_common(xmlTextWriterPtr writer, int op_ret, int op_errno,</div><div class='add'>+                      char *op_errstr)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"opRet", "%d",</div><div class='add'>+                                          op_ret);</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"opErrno", "%d",</div><div class='add'>+                                          op_errno);</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    if (op_errstr)</div><div class='add'>+        ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"opErrstr",</div><div class='add'>+                                              "%s", op_errstr);</div><div class='add'>+    else</div><div class='add'>+        ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"opErrstr",</div><div class='add'>+                                              "%s", "");</div><div class='add'>+</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    gf_log("cli", GF_LOG_DEBUG, "Returning %d", ret);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+cli_xml_output_str(char *op, char *str, int op_ret, int op_errno,</div><div class='add'>+                   char *op_errstr)</div><div class='add'>+{</div><div class='add'>+#if (HAVE_LIB_XML)</div><div class='add'>+    int ret = -1;</div><div class='add'>+    xmlTextWriterPtr writer = NULL;</div><div class='add'>+    xmlDocPtr doc = NULL;</div><div class='add'>+</div><div class='add'>+    ret = cli_begin_xml_output(&amp;writer, &amp;doc);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    ret = cli_xml_output_common(writer, op_ret, op_errno, op_errstr);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    if (op) {</div><div class='add'>+        ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"cliOp", "%s",</div><div class='add'>+                                              op);</div><div class='add'>+        XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (str) {</div><div class='add'>+        ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"output", "%s",</div><div class='add'>+                                              str);</div><div class='add'>+        XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = cli_end_xml_output(writer, doc);</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    gf_log("cli", GF_LOG_DEBUG, "Returning %d", ret);</div><div class='add'>+    return ret;</div><div class='add'>+#else</div><div class='add'>+    return 0;</div><div class='add'>+#endif</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#if (HAVE_LIB_XML)</div><div class='add'>+int</div><div class='add'>+cli_xml_output_data_pair(dict_t *this, char *key, data_t *value, void *data)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    xmlTextWriterPtr *writer = NULL;</div><div class='add'>+</div><div class='add'>+    writer = (xmlTextWriterPtr *)data;</div><div class='add'>+</div><div class='add'>+    ret = xmlTextWriterWriteFormatElement(*writer, (xmlChar *)key, "%s",</div><div class='add'>+                                          value-&gt;data);</div><div class='add'>+</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+cli_xml_output_dict(char *op, dict_t *dict, int op_ret, int op_errno,</div><div class='add'>+                    char *op_errstr)</div><div class='add'>+{</div><div class='add'>+#if (HAVE_LIB_XML)</div><div class='add'>+    int ret = -1;</div><div class='add'>+    xmlTextWriterPtr writer = NULL;</div><div class='add'>+    xmlDocPtr doc = NULL;</div><div class='add'>+</div><div class='add'>+    ret = cli_begin_xml_output(&amp;writer, &amp;doc);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    ret = cli_xml_output_common(writer, op_ret, op_errno, op_errstr);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    /* &lt;"op"&gt; */</div><div class='add'>+    ret = xmlTextWriterStartElement(writer, (xmlChar *)op);</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    if (dict)</div><div class='add'>+        dict_foreach(dict, cli_xml_output_data_pair, &amp;writer);</div><div class='add'>+</div><div class='add'>+    /* &lt;/"op"&gt; */</div><div class='add'>+    ret = xmlTextWriterEndElement(writer);</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    ret = cli_end_xml_output(writer, doc);</div><div class='add'>+out:</div><div class='add'>+    gf_log("cli", GF_LOG_DEBUG, "Returning %d", ret);</div><div class='add'>+    return ret;</div><div class='add'>+#else</div><div class='add'>+    return 0;</div><div class='add'>+#endif</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#if (HAVE_LIB_XML)</div><div class='add'>+int</div><div class='add'>+cli_xml_output_vol_status_common(xmlTextWriterPtr writer, dict_t *dict,</div><div class='add'>+                                 int brick_index, int *online,</div><div class='add'>+                                 gf_boolean_t *node_present)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    char *hostname = NULL;</div><div class='add'>+    char *path = NULL;</div><div class='add'>+    char *uuid = NULL;</div><div class='add'>+    int port = 0;</div><div class='add'>+    int rdma_port = 0;</div><div class='add'>+    int status = 0;</div><div class='add'>+    int pid = 0;</div><div class='add'>+    char key[1024] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    snprintf(key, sizeof(key), "brick%d.hostname", brick_index);</div><div class='add'>+    ret = dict_get_str(dict, key, &amp;hostname);</div><div class='add'>+    if (ret) {</div><div class='add'>+        *node_present = _gf_false;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    *node_present = _gf_true;</div><div class='add'>+</div><div class='add'>+    /* &lt;node&gt;</div><div class='add'>+     * will be closed in the calling function cli_xml_output_vol_status()*/</div><div class='add'>+    ret = xmlTextWriterStartElement(writer, (xmlChar *)"node");</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"hostname", "%s",</div><div class='add'>+                                          hostname);</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    snprintf(key, sizeof(key), "brick%d.path", brick_index);</div><div class='add'>+    ret = dict_get_str(dict, key, &amp;path);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+    ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"path", "%s",</div><div class='add'>+                                          path);</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    snprintf(key, sizeof(key), "brick%d.peerid", brick_index);</div><div class='add'>+    ret = dict_get_str(dict, key, &amp;uuid);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+    ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"peerid", "%s",</div><div class='add'>+                                          uuid);</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    snprintf(key, sizeof(key), "brick%d.status", brick_index);</div><div class='add'>+    ret = dict_get_int32(dict, key, &amp;status);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+    ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"status", "%d",</div><div class='add'>+                                          status);</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+    *online = status;</div><div class='add'>+</div><div class='add'>+    snprintf(key, sizeof(key), "brick%d.port", brick_index);</div><div class='add'>+    ret = dict_get_int32(dict, key, &amp;port);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    snprintf(key, sizeof(key), "brick%d.rdma_port", brick_index);</div><div class='add'>+    ret = dict_get_int32(dict, key, &amp;rdma_port);</div><div class='add'>+</div><div class='add'>+    /* If the process is either offline or doesn't provide a port (shd)</div><div class='add'>+     * port = "N/A"</div><div class='add'>+     * else print the port number of the process.</div><div class='add'>+     */</div><div class='add'>+</div><div class='add'>+    /*</div><div class='add'>+     * Tag 'port' can be removed once console management is started</div><div class='add'>+     * to support new tag ports.</div><div class='add'>+     */</div><div class='add'>+</div><div class='add'>+    if (*online == 1 &amp;&amp; port != 0)</div><div class='add'>+        ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"port", "%d",</div><div class='add'>+                                              port);</div><div class='add'>+    else</div><div class='add'>+        ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"port", "%s",</div><div class='add'>+                                              "N/A");</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+    ret = xmlTextWriterStartElement(writer, (xmlChar *)"ports");</div><div class='add'>+    if (*online == 1 &amp;&amp; (port != 0 || rdma_port != 0)) {</div><div class='add'>+        if (port) {</div><div class='add'>+            ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"tcp",</div><div class='add'>+                                                  "%d", port);</div><div class='add'>+        } else {</div><div class='add'>+            ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"tcp",</div><div class='add'>+                                                  "%s", "N/A");</div><div class='add'>+        }</div><div class='add'>+        XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+        if (rdma_port) {</div><div class='add'>+            ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"rdma",</div><div class='add'>+                                                  "%d", rdma_port);</div><div class='add'>+        } else {</div><div class='add'>+            ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"rdma",</div><div class='add'>+                                                  "%s", "N/A");</div><div class='add'>+        }</div><div class='add'>+        XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+    } else {</div><div class='add'>+        ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"tcp", "%s",</div><div class='add'>+                                              "N/A");</div><div class='add'>+        XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+        ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"rdma", "%s",</div><div class='add'>+                                              "N/A");</div><div class='add'>+        XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = xmlTextWriterEndElement(writer);</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    snprintf(key, sizeof(key), "brick%d.pid", brick_index);</div><div class='add'>+    ret = dict_get_int32(dict, key, &amp;pid);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+    ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"pid", "%d", pid);</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    gf_log("cli", GF_LOG_DEBUG, "Returning %d", ret);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+cli_xml_output_vol_status_detail(xmlTextWriterPtr writer, dict_t *dict,</div><div class='add'>+                                 int brick_index)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    uint64_t size_total = 0;</div><div class='add'>+    uint64_t size_free = 0;</div><div class='add'>+    char *device = NULL;</div><div class='add'>+    uint64_t block_size = 0;</div><div class='add'>+    char *mnt_options = NULL;</div><div class='add'>+    char *fs_name = NULL;</div><div class='add'>+    char *inode_size = NULL;</div><div class='add'>+    uint64_t inodes_total = 0;</div><div class='add'>+    uint64_t inodes_free = 0;</div><div class='add'>+    char key[1024] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    snprintf(key, sizeof(key), "brick%d.total", brick_index);</div><div class='add'>+    ret = dict_get_uint64(dict, key, &amp;size_total);</div><div class='add'>+    if (!ret) {</div><div class='add'>+        ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"sizeTotal",</div><div class='add'>+                                              "%" PRIu64, size_total);</div><div class='add'>+        XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+    }</div><div class='add'>+    snprintf(key, sizeof(key), "brick%d.free", brick_index);</div><div class='add'>+    ret = dict_get_uint64(dict, key, &amp;size_free);</div><div class='add'>+    if (!ret) {</div><div class='add'>+        ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"sizeFree",</div><div class='add'>+                                              "%" PRIu64, size_free);</div><div class='add'>+        XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+    }</div><div class='add'>+    snprintf(key, sizeof(key), "brick%d.device", brick_index);</div><div class='add'>+    ret = dict_get_str(dict, key, &amp;device);</div><div class='add'>+    if (!ret) {</div><div class='add'>+        ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"device", "%s",</div><div class='add'>+                                              device);</div><div class='add'>+        XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+    }</div><div class='add'>+    snprintf(key, sizeof(key), "brick%d.block_size", brick_index);</div><div class='add'>+    ret = dict_get_uint64(dict, key, &amp;block_size);</div><div class='add'>+    if (!ret) {</div><div class='add'>+        ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"blockSize",</div><div class='add'>+                                              "%" PRIu64, block_size);</div><div class='add'>+        XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+    }</div><div class='add'>+    snprintf(key, sizeof(key), "brick%d.mnt_options", brick_index);</div><div class='add'>+    ret = dict_get_str(dict, key, &amp;mnt_options);</div><div class='add'>+    if (!ret) {</div><div class='add'>+        ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"mntOptions",</div><div class='add'>+                                              "%s", mnt_options);</div><div class='add'>+        XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+    }</div><div class='add'>+    snprintf(key, sizeof(key), "brick%d.fs_name", brick_index);</div><div class='add'>+    ret = dict_get_str(dict, key, &amp;fs_name);</div><div class='add'>+    if (!ret) {</div><div class='add'>+        ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"fsName", "%s",</div><div class='add'>+                                              fs_name);</div><div class='add'>+        XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+    }</div><div class='add'>+    snprintf(key, sizeof(key), "brick%d.inode_size", brick_index);</div><div class='add'>+    ret = dict_get_str(dict, key, &amp;inode_size);</div><div class='add'>+    if (!ret) {</div><div class='add'>+        ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"inodeSize",</div><div class='add'>+                                              "%s", fs_name);</div><div class='add'>+        XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+    }</div><div class='add'>+    snprintf(key, sizeof(key), "brick%d.total_inodes", brick_index);</div><div class='add'>+    ret = dict_get_uint64(dict, key, &amp;inodes_total);</div><div class='add'>+    if (!ret) {</div><div class='add'>+        ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"inodesTotal",</div><div class='add'>+                                              "%" PRIu64, inodes_total);</div><div class='add'>+        XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+    }</div><div class='add'>+    snprintf(key, sizeof(key), "brick%d.free_inodes", brick_index);</div><div class='add'>+    ret = dict_get_uint64(dict, key, &amp;inodes_free);</div><div class='add'>+    if (!ret) {</div><div class='add'>+        ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"inodesFree",</div><div class='add'>+                                              "%" PRIu64, inodes_free);</div><div class='add'>+        XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+    } else {</div><div class='add'>+        ret = 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    gf_log("cli", GF_LOG_DEBUG, "Returning %d", ret);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+cli_xml_output_vol_status_mempool(xmlTextWriterPtr writer, dict_t *dict,</div><div class='add'>+                                  char *prefix)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int mempool_count = 0;</div><div class='add'>+    char *name = NULL;</div><div class='add'>+    int hotcount = 0;</div><div class='add'>+    int coldcount = 0;</div><div class='add'>+    uint64_t paddedsizeof = 0;</div><div class='add'>+    uint64_t alloccount = 0;</div><div class='add'>+    int maxalloc = 0;</div><div class='add'>+    char key[1024] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int i = 0;</div><div class='add'>+</div><div class='add'>+    /* &lt;mempool&gt; */</div><div class='add'>+    ret = xmlTextWriterStartElement(writer, (xmlChar *)"mempool");</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    snprintf(key, sizeof(key), "%s.mempool-count", prefix);</div><div class='add'>+    ret = dict_get_int32(dict, key, &amp;mempool_count);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+    ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"count", "%d",</div><div class='add'>+                                          mempool_count);</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; mempool_count; i++) {</div><div class='add'>+        /* &lt;pool&gt; */</div><div class='add'>+        ret = xmlTextWriterStartElement(writer, (xmlChar *)"pool");</div><div class='add'>+        XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+        snprintf(key, sizeof(key), "%s.pool%d.name", prefix, i);</div><div class='add'>+        ret = dict_get_str(dict, key, &amp;name);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+        ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"name", "%s",</div><div class='add'>+                                              name);</div><div class='add'>+        XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+        snprintf(key, sizeof(key), "%s.pool%d.hotcount", prefix, i);</div><div class='add'>+        ret = dict_get_int32(dict, key, &amp;hotcount);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+        ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"hotCount",</div><div class='add'>+                                              "%d", hotcount);</div><div class='add'>+        XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+        snprintf(key, sizeof(key), "%s.pool%d.coldcount", prefix, i);</div><div class='add'>+        ret = dict_get_int32(dict, key, &amp;coldcount);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+        ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"coldCount",</div><div class='add'>+                                              "%d", coldcount);</div><div class='add'>+        XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+        snprintf(key, sizeof(key), "%s.pool%d.paddedsizeof", prefix, i);</div><div class='add'>+        ret = dict_get_uint64(dict, key, &amp;paddedsizeof);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+        ret = xmlTextWriterWriteFormatElement(</div><div class='add'>+            writer, (xmlChar *)"padddedSizeOf", "%" PRIu64, paddedsizeof);</div><div class='add'>+        XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+        snprintf(key, sizeof(key), "%s.pool%d.alloccount", prefix, i);</div><div class='add'>+        ret = dict_get_uint64(dict, key, &amp;alloccount);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+        ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"allocCount",</div><div class='add'>+                                              "%" PRIu64, alloccount);</div><div class='add'>+        XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+        snprintf(key, sizeof(key), "%s.pool%d.max_alloc", prefix, i);</div><div class='add'>+        ret = dict_get_int32(dict, key, &amp;maxalloc);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+        ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"maxAlloc",</div><div class='add'>+                                              "%d", maxalloc);</div><div class='add'>+        XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+        snprintf(key, sizeof(key), "%s.pool%d.pool-misses", prefix, i);</div><div class='add'>+        ret = dict_get_uint64(dict, key, &amp;alloccount);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+        ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"poolMisses",</div><div class='add'>+                                              "%" PRIu64, alloccount);</div><div class='add'>+        XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+        snprintf(key, sizeof(key), "%s.pool%d.max-stdalloc", prefix, i);</div><div class='add'>+        ret = dict_get_int32(dict, key, &amp;maxalloc);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+        ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"maxStdAlloc",</div><div class='add'>+                                              "%d", maxalloc);</div><div class='add'>+        XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+        /* &lt;/pool&gt; */</div><div class='add'>+        ret = xmlTextWriterEndElement(writer);</div><div class='add'>+        XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* &lt;/mempool&gt; */</div><div class='add'>+    ret = xmlTextWriterEndElement(writer);</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    gf_log("cli", GF_LOG_DEBUG, "Returning %d", ret);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+cli_xml_output_vol_status_mem(xmlTextWriterPtr writer, dict_t *dict,</div><div class='add'>+                              int brick_index)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int arena = 0;</div><div class='add'>+    int ordblks = 0;</div><div class='add'>+    int smblks = 0;</div><div class='add'>+    int hblks = 0;</div><div class='add'>+    int hblkhd = 0;</div><div class='add'>+    int usmblks = 0;</div><div class='add'>+    int fsmblks = 0;</div><div class='add'>+    int uordblks = 0;</div><div class='add'>+    int fordblks = 0;</div><div class='add'>+    int keepcost = 0;</div><div class='add'>+    char key[1024] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    /* &lt;memStatus&gt; */</div><div class='add'>+    ret = xmlTextWriterStartElement(writer, (xmlChar *)"memStatus");</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    /* &lt;mallinfo&gt; */</div><div class='add'>+    ret = xmlTextWriterStartElement(writer, (xmlChar *)"mallinfo");</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    snprintf(key, sizeof(key), "brick%d.mallinfo.arena", brick_index);</div><div class='add'>+    ret = dict_get_int32(dict, key, &amp;arena);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+    ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"arena", "%d",</div><div class='add'>+                                          arena);</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    snprintf(key, sizeof(key), "brick%d.mallinfo.ordblks", brick_index);</div><div class='add'>+    ret = dict_get_int32(dict, key, &amp;ordblks);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+    ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"ordblks", "%d",</div><div class='add'>+                                          ordblks);</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    snprintf(key, sizeof(key), "brick%d.mallinfo.smblks", brick_index);</div><div class='add'>+    ret = dict_get_int32(dict, key, &amp;smblks);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+    ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"smblks", "%d",</div><div class='add'>+                                          smblks);</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    snprintf(key, sizeof(key), "brick%d.mallinfo.hblks", brick_index);</div><div class='add'>+    ret = dict_get_int32(dict, key, &amp;hblks);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+    ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"hblks", "%d",</div><div class='add'>+                                          hblks);</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    snprintf(key, sizeof(key), "brick%d.mallinfo.hblkhd", brick_index);</div><div class='add'>+    ret = dict_get_int32(dict, key, &amp;hblkhd);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+    ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"hblkhd", "%d",</div><div class='add'>+                                          hblkhd);</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    snprintf(key, sizeof(key), "brick%d.mallinfo.usmblks", brick_index);</div><div class='add'>+    ret = dict_get_int32(dict, key, &amp;usmblks);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+    ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"usmblks", "%d",</div><div class='add'>+                                          usmblks);</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    snprintf(key, sizeof(key), "brick%d.mallinfo.fsmblks", brick_index);</div><div class='add'>+    ret = dict_get_int32(dict, key, &amp;fsmblks);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+    ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"fsmblks", "%d",</div><div class='add'>+                                          fsmblks);</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    snprintf(key, sizeof(key), "brick%d.mallinfo.uordblks", brick_index);</div><div class='add'>+    ret = dict_get_int32(dict, key, &amp;uordblks);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+    ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"uordblks", "%d",</div><div class='add'>+                                          uordblks);</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    snprintf(key, sizeof(key), "brick%d.mallinfo.fordblks", brick_index);</div><div class='add'>+    ret = dict_get_int32(dict, key, &amp;fordblks);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+    ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"fordblks", "%d",</div><div class='add'>+                                          fordblks);</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    snprintf(key, sizeof(key), "brick%d.mallinfo.keepcost", brick_index);</div><div class='add'>+    ret = dict_get_int32(dict, key, &amp;keepcost);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+    ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"keepcost", "%d",</div><div class='add'>+                                          keepcost);</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    /* &lt;/mallinfo&gt; */</div><div class='add'>+    ret = xmlTextWriterEndElement(writer);</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    snprintf(key, sizeof(key), "brick%d", brick_index);</div><div class='add'>+    ret = cli_xml_output_vol_status_mempool(writer, dict, key);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    /* &lt;/memStatus&gt; */</div><div class='add'>+    ret = xmlTextWriterEndElement(writer);</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    gf_log("cli", GF_LOG_DEBUG, "Returning %d", ret);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+cli_xml_output_vol_status_clients(xmlTextWriterPtr writer, dict_t *dict,</div><div class='add'>+                                  int brick_index)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int client_count = 0;</div><div class='add'>+    char *hostname = NULL;</div><div class='add'>+    uint64_t bytes_read = 0;</div><div class='add'>+    uint64_t bytes_write = 0;</div><div class='add'>+    uint32_t opversion = 0;</div><div class='add'>+    char key[1024] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int i = 0;</div><div class='add'>+</div><div class='add'>+    /* &lt;clientsStatus&gt; */</div><div class='add'>+    ret = xmlTextWriterStartElement(writer, (xmlChar *)"clientsStatus");</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    snprintf(key, sizeof(key), "brick%d.clientcount", brick_index);</div><div class='add'>+    ret = dict_get_int32(dict, key, &amp;client_count);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+    ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"clientCount",</div><div class='add'>+                                          "%d", client_count);</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; client_count; i++) {</div><div class='add'>+        /* &lt;client&gt; */</div><div class='add'>+        ret = xmlTextWriterStartElement(writer, (xmlChar *)"client");</div><div class='add'>+        XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+        snprintf(key, sizeof(key), "brick%d.client%d.hostname", brick_index, i);</div><div class='add'>+        ret = dict_get_str(dict, key, &amp;hostname);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+        ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"hostname",</div><div class='add'>+                                              "%s", hostname);</div><div class='add'>+        XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+        snprintf(key, sizeof(key), "brick%d.client%d.bytesread", brick_index,</div><div class='add'>+                 i);</div><div class='add'>+        ret = dict_get_uint64(dict, key, &amp;bytes_read);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+        ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"bytesRead",</div><div class='add'>+                                              "%" PRIu64, bytes_read);</div><div class='add'>+        XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+        snprintf(key, sizeof(key), "brick%d.client%d.byteswrite", brick_index,</div><div class='add'>+                 i);</div><div class='add'>+        ret = dict_get_uint64(dict, key, &amp;bytes_write);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+        ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"bytesWrite",</div><div class='add'>+                                              "%" PRIu64, bytes_write);</div><div class='add'>+        XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+        snprintf(key, sizeof(key), "brick%d.client%d.opversion", brick_index,</div><div class='add'>+                 i);</div><div class='add'>+        ret = dict_get_uint32(dict, key, &amp;opversion);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+        ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"opVersion",</div><div class='add'>+                                              "%" PRIu32, opversion);</div><div class='add'>+        XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+        /* &lt;/client&gt; */</div><div class='add'>+        ret = xmlTextWriterEndElement(writer);</div><div class='add'>+        XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* &lt;/clientsStatus&gt; */</div><div class='add'>+    ret = xmlTextWriterEndElement(writer);</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+out:</div><div class='add'>+    gf_log("cli", GF_LOG_DEBUG, "Returning %d", ret);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+cli_xml_output_vol_status_inode_entry(xmlTextWriterPtr writer, dict_t *dict,</div><div class='add'>+                                      char *prefix)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    char *gfid = NULL;</div><div class='add'>+    uint64_t nlookup = 0;</div><div class='add'>+    uint32_t ref = 0;</div><div class='add'>+    int ia_type = 0;</div><div class='add'>+    char key[1024] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    /* &lt;inode&gt; */</div><div class='add'>+    ret = xmlTextWriterStartElement(writer, (xmlChar *)"inode");</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    snprintf(key, sizeof(key), "%s.gfid", prefix);</div><div class='add'>+    ret = dict_get_str(dict, key, &amp;gfid);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+    ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"gfid", "%s",</div><div class='add'>+                                          gfid);</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    snprintf(key, sizeof(key), "%s.nlookup", prefix);</div><div class='add'>+    ret = dict_get_uint64(dict, key, &amp;nlookup);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+    ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"nLookup",</div><div class='add'>+                                          "%" PRIu64, nlookup);</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    snprintf(key, sizeof(key), "%s.ref", prefix);</div><div class='add'>+    ret = dict_get_uint32(dict, key, &amp;ref);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+    ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"ref", "%" PRIu32,</div><div class='add'>+                                          ref);</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    snprintf(key, sizeof(key), "%s.ia_type", prefix);</div><div class='add'>+    ret = dict_get_int32(dict, key, &amp;ia_type);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+    ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"iaType", "%d",</div><div class='add'>+                                          ia_type);</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    /* &lt;/inode&gt; */</div><div class='add'>+    ret = xmlTextWriterEndElement(writer);</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    gf_log("cli", GF_LOG_DEBUG, "Returning %d", ret);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+cli_xml_output_vol_status_itable(xmlTextWriterPtr writer, dict_t *dict,</div><div class='add'>+                                 char *prefix)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    uint32_t active_size = 0;</div><div class='add'>+    uint32_t lru_size = 0;</div><div class='add'>+    uint32_t purge_size = 0;</div><div class='add'>+    char key[1024] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int i = 0;</div><div class='add'>+</div><div class='add'>+    snprintf(key, sizeof(key), "%s.active_size", prefix);</div><div class='add'>+    ret = dict_get_uint32(dict, key, &amp;active_size);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+    ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"activeSize",</div><div class='add'>+                                          "%" PRIu32, active_size);</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+    if (active_size != 0) {</div><div class='add'>+        /* &lt;active&gt; */</div><div class='add'>+        ret = xmlTextWriterStartElement(writer, (xmlChar *)"active");</div><div class='add'>+        XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+        for (i = 0; i &lt; active_size; i++) {</div><div class='add'>+            snprintf(key, sizeof(key), "%s.active%d", prefix, i);</div><div class='add'>+            ret = cli_xml_output_vol_status_inode_entry(writer, dict, key);</div><div class='add'>+            if (ret)</div><div class='add'>+                goto out;</div><div class='add'>+        }</div><div class='add'>+        /* &lt;/active&gt; */</div><div class='add'>+        ret = xmlTextWriterEndElement(writer);</div><div class='add'>+        XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    snprintf(key, sizeof(key), "%s.lru_size", prefix);</div><div class='add'>+    ret = dict_get_uint32(dict, key, &amp;lru_size);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+    ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"lruSize",</div><div class='add'>+                                          "%" PRIu32, lru_size);</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+    if (lru_size != 0) {</div><div class='add'>+        /* &lt;lru&gt; */</div><div class='add'>+        ret = xmlTextWriterStartElement(writer, (xmlChar *)"lru");</div><div class='add'>+        XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+        for (i = 0; i &lt; lru_size; i++) {</div><div class='add'>+            snprintf(key, sizeof(key), "%s.lru%d", prefix, i);</div><div class='add'>+            ret = cli_xml_output_vol_status_inode_entry(writer, dict, key);</div><div class='add'>+            if (ret)</div><div class='add'>+                goto out;</div><div class='add'>+        }</div><div class='add'>+        /* &lt;/lru&gt; */</div><div class='add'>+        ret = xmlTextWriterEndElement(writer);</div><div class='add'>+        XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    snprintf(key, sizeof(key), "%s.purge_size", prefix);</div><div class='add'>+    ret = dict_get_uint32(dict, key, &amp;purge_size);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+    ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"purgeSize",</div><div class='add'>+                                          "%" PRIu32, purge_size);</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+    if (purge_size != 0) {</div><div class='add'>+        /* &lt;purge&gt; */</div><div class='add'>+        ret = xmlTextWriterStartElement(writer, (xmlChar *)"purge");</div><div class='add'>+        XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+        for (i = 0; i &lt; purge_size; i++) {</div><div class='add'>+            snprintf(key, sizeof(key), "%s.purge%d", prefix, i);</div><div class='add'>+            ret = cli_xml_output_vol_status_inode_entry(writer, dict, key);</div><div class='add'>+            if (ret)</div><div class='add'>+                goto out;</div><div class='add'>+        }</div><div class='add'>+        /* &lt;/purge&gt; */</div><div class='add'>+        ret = xmlTextWriterEndElement(writer);</div><div class='add'>+        XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    gf_log("cli", GF_LOG_DEBUG, "Returning %d", ret);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+cli_xml_output_vol_status_inode(xmlTextWriterPtr writer, dict_t *dict,</div><div class='add'>+                                int brick_index)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int conn_count = 0;</div><div class='add'>+    char key[1024] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int i = 0;</div><div class='add'>+</div><div class='add'>+    /* &lt;inodeStatus&gt; */</div><div class='add'>+    ret = xmlTextWriterStartElement(writer, (xmlChar *)"inodeStatus");</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    snprintf(key, sizeof(key), "brick%d.conncount", brick_index);</div><div class='add'>+    ret = dict_get_int32(dict, key, &amp;conn_count);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+    ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"connections",</div><div class='add'>+                                          "%d", conn_count);</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; conn_count; i++) {</div><div class='add'>+        /* &lt;connection&gt; */</div><div class='add'>+        ret = xmlTextWriterStartElement(writer, (xmlChar *)"connection");</div><div class='add'>+        XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+        snprintf(key, sizeof(key), "brick%d.conn%d.itable", brick_index, i);</div><div class='add'>+        ret = cli_xml_output_vol_status_itable(writer, dict, key);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+</div><div class='add'>+        /* &lt;/connection&gt; */</div><div class='add'>+        ret = xmlTextWriterEndElement(writer);</div><div class='add'>+        XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* &lt;/inodeStatus&gt; */</div><div class='add'>+    ret = xmlTextWriterEndElement(writer);</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    gf_log("cli", GF_LOG_DEBUG, "Returning %d", ret);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+cli_xml_output_vol_status_fdtable(xmlTextWriterPtr writer, dict_t *dict,</div><div class='add'>+                                  char *prefix)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int refcount = 0;</div><div class='add'>+    uint32_t maxfds = 0;</div><div class='add'>+    int firstfree = 0;</div><div class='add'>+    int openfds = 0;</div><div class='add'>+    int fd_pid = 0;</div><div class='add'>+    int fd_refcount = 0;</div><div class='add'>+    int fd_flags = 0;</div><div class='add'>+    char key[1024] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int i = 0;</div><div class='add'>+</div><div class='add'>+    /* &lt;fdTable&gt; */</div><div class='add'>+    ret = xmlTextWriterStartElement(writer, (xmlChar *)"fdTable");</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    snprintf(key, sizeof(key), "%s.refcount", prefix);</div><div class='add'>+    ret = dict_get_int32(dict, key, &amp;refcount);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+    ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"refCount", "%d",</div><div class='add'>+                                          refcount);</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    snprintf(key, sizeof(key), "%s.maxfds", prefix);</div><div class='add'>+    ret = dict_get_uint32(dict, key, &amp;maxfds);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+    ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"maxFds",</div><div class='add'>+                                          "%" PRIu32, maxfds);</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    snprintf(key, sizeof(key), "%s.firstfree", prefix);</div><div class='add'>+    ret = dict_get_int32(dict, key, &amp;firstfree);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+    ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"firstFree", "%d",</div><div class='add'>+                                          firstfree);</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    snprintf(key, sizeof(key), "%s.openfds", prefix);</div><div class='add'>+    ret = dict_get_int32(dict, key, &amp;openfds);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+    ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"openFds", "%d",</div><div class='add'>+                                          openfds);</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; maxfds; i++) {</div><div class='add'>+        snprintf(key, sizeof(key), "%s.fdentry%d.pid", prefix, i);</div><div class='add'>+        ret = dict_get_int32(dict, key, &amp;fd_pid);</div><div class='add'>+        if (ret)</div><div class='add'>+            continue;</div><div class='add'>+</div><div class='add'>+        snprintf(key, sizeof(key), "%s.fdentry%d.refcount", prefix, i);</div><div class='add'>+        ret = dict_get_int32(dict, key, &amp;fd_refcount);</div><div class='add'>+        if (ret)</div><div class='add'>+            continue;</div><div class='add'>+</div><div class='add'>+        snprintf(key, sizeof(key), "%s.fdentry%d.flags", prefix, i);</div><div class='add'>+        ret = dict_get_int32(dict, key, &amp;fd_flags);</div><div class='add'>+        if (ret)</div><div class='add'>+            continue;</div><div class='add'>+</div><div class='add'>+        /* &lt;fd&gt; */</div><div class='add'>+        ret = xmlTextWriterStartElement(writer, (xmlChar *)"fd");</div><div class='add'>+        XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+        ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"entry", "%d",</div><div class='add'>+                                              i + 1);</div><div class='add'>+        XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+        ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"pid", "%d",</div><div class='add'>+                                              fd_pid);</div><div class='add'>+        XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+        ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"refCount",</div><div class='add'>+                                              "%d", fd_refcount);</div><div class='add'>+        XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+        ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"flags", "%d",</div><div class='add'>+                                              fd_flags);</div><div class='add'>+        XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+        /* &lt;/fd&gt; */</div><div class='add'>+        ret = xmlTextWriterEndElement(writer);</div><div class='add'>+        XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* &lt;/fdTable&gt; */</div><div class='add'>+    ret = xmlTextWriterEndElement(writer);</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    gf_log("cli", GF_LOG_DEBUG, "Returning %d", ret);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+cli_xml_output_vol_status_fd(xmlTextWriterPtr writer, dict_t *dict,</div><div class='add'>+                             int brick_index)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int conn_count = 0;</div><div class='add'>+    char key[1024] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int i = 0;</div><div class='add'>+</div><div class='add'>+    /* &lt;fdStatus&gt; */</div><div class='add'>+    ret = xmlTextWriterStartElement(writer, (xmlChar *)"fdStatus");</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    snprintf(key, sizeof(key), "brick%d.conncount", brick_index);</div><div class='add'>+    ret = dict_get_int32(dict, key, &amp;conn_count);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+    ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"connections",</div><div class='add'>+                                          "%d", conn_count);</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; conn_count; i++) {</div><div class='add'>+        /* &lt;connection&gt; */</div><div class='add'>+        ret = xmlTextWriterStartElement(writer, (xmlChar *)"connection");</div><div class='add'>+        XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+        snprintf(key, sizeof(key), "brick%d.conn%d.fdtable", brick_index, i);</div><div class='add'>+        ret = cli_xml_output_vol_status_fdtable(writer, dict, key);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+</div><div class='add'>+        /* &lt;/connection&gt; */</div><div class='add'>+        ret = xmlTextWriterEndElement(writer);</div><div class='add'>+        XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* &lt;/fdStatus&gt; */</div><div class='add'>+    ret = xmlTextWriterEndElement(writer);</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    gf_log("cli", GF_LOG_DEBUG, "Returning %d", ret);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+cli_xml_output_vol_status_callframe(xmlTextWriterPtr writer, dict_t *dict,</div><div class='add'>+                                    char *prefix)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int ref_count = 0;</div><div class='add'>+    char *translator = NULL;</div><div class='add'>+    int complete = 0;</div><div class='add'>+    char *parent = NULL;</div><div class='add'>+    char *wind_from = NULL;</div><div class='add'>+    char *wind_to = NULL;</div><div class='add'>+    char *unwind_from = NULL;</div><div class='add'>+    char *unwind_to = NULL;</div><div class='add'>+    char key[1024] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    /* &lt;callFrame&gt; */</div><div class='add'>+    ret = xmlTextWriterStartElement(writer, (xmlChar *)"callFrame");</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    snprintf(key, sizeof(key), "%s.refcount", prefix);</div><div class='add'>+    ret = dict_get_int32(dict, key, &amp;ref_count);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+    ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"refCount", "%d",</div><div class='add'>+                                          ref_count);</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    snprintf(key, sizeof(key), "%s.translator", prefix);</div><div class='add'>+    ret = dict_get_str(dict, key, &amp;translator);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+    ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"translator", "%s",</div><div class='add'>+                                          translator);</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    snprintf(key, sizeof(key), "%s.complete", prefix);</div><div class='add'>+    ret = dict_get_int32(dict, key, &amp;complete);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+    ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"complete", "%d",</div><div class='add'>+                                          complete);</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    snprintf(key, sizeof(key), "%s.parent", prefix);</div><div class='add'>+    ret = dict_get_str(dict, key, &amp;parent);</div><div class='add'>+    if (!ret) {</div><div class='add'>+        ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"parent", "%s",</div><div class='add'>+                                              parent);</div><div class='add'>+        XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    snprintf(key, sizeof(key), "%s.windfrom", prefix);</div><div class='add'>+    ret = dict_get_str(dict, key, &amp;wind_from);</div><div class='add'>+    if (!ret) {</div><div class='add'>+        ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"windFrom",</div><div class='add'>+                                              "%s", wind_from);</div><div class='add'>+        XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    snprintf(key, sizeof(key), "%s.windto", prefix);</div><div class='add'>+    ret = dict_get_str(dict, key, &amp;wind_to);</div><div class='add'>+    if (!ret) {</div><div class='add'>+        ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"windTo", "%s",</div><div class='add'>+                                              wind_to);</div><div class='add'>+        XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    snprintf(key, sizeof(key), "%s.unwindfrom", prefix);</div><div class='add'>+    ret = dict_get_str(dict, key, &amp;unwind_from);</div><div class='add'>+    if (!ret) {</div><div class='add'>+        ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"unwindFrom",</div><div class='add'>+                                              "%s", unwind_from);</div><div class='add'>+        XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    snprintf(key, sizeof(key), "%s.unwindto", prefix);</div><div class='add'>+    ret = dict_get_str(dict, key, &amp;unwind_to);</div><div class='add'>+    if (!ret) {</div><div class='add'>+        ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"unwindTo",</div><div class='add'>+                                              "%s", unwind_to);</div><div class='add'>+        XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* &lt;/callFrame&gt; */</div><div class='add'>+    ret = xmlTextWriterEndElement(writer);</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+out:</div><div class='add'>+    gf_log("cli", GF_LOG_DEBUG, "Returning %d", ret);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+cli_xml_output_vol_status_callstack(xmlTextWriterPtr writer, dict_t *dict,</div><div class='add'>+                                    char *prefix)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int uid = 0;</div><div class='add'>+    int gid = 0;</div><div class='add'>+    int pid = 0;</div><div class='add'>+    uint64_t unique = 0;</div><div class='add'>+    int frame_count = 0;</div><div class='add'>+    char key[1024] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int i = 0;</div><div class='add'>+</div><div class='add'>+    /* &lt;callStack&gt; */</div><div class='add'>+    ret = xmlTextWriterStartElement(writer, (xmlChar *)"callStack");</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    snprintf(key, sizeof(key), "%s.uid", prefix);</div><div class='add'>+    ret = dict_get_int32(dict, key, &amp;uid);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+    ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"uid", "%d", uid);</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    snprintf(key, sizeof(key), "%s.gid", prefix);</div><div class='add'>+    ret = dict_get_int32(dict, key, &amp;gid);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+    ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"gid", "%d", gid);</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    snprintf(key, sizeof(key), "%s.pid", prefix);</div><div class='add'>+    ret = dict_get_int32(dict, key, &amp;pid);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+    ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"pid", "%d", pid);</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    snprintf(key, sizeof(key), "%s.unique", prefix);</div><div class='add'>+    ret = dict_get_uint64(dict, key, &amp;unique);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+    ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"unique",</div><div class='add'>+                                          "%" PRIu64, unique);</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    snprintf(key, sizeof(key), "%s.count", prefix);</div><div class='add'>+    ret = dict_get_int32(dict, key, &amp;frame_count);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+    ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"frameCount", "%d",</div><div class='add'>+                                          frame_count);</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; frame_count; i++) {</div><div class='add'>+        snprintf(key, sizeof(key), "%s.frame%d", prefix, i);</div><div class='add'>+        ret = cli_xml_output_vol_status_callframe(writer, dict, key);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* &lt;/callStack&gt; */</div><div class='add'>+    ret = xmlTextWriterEndElement(writer);</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+out:</div><div class='add'>+    gf_log("cli", GF_LOG_DEBUG, "Returning %d", ret);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+cli_xml_output_vol_status_callpool(xmlTextWriterPtr writer, dict_t *dict,</div><div class='add'>+                                   int brick_index)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int call_count = 0;</div><div class='add'>+    char key[1024] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int i = 0;</div><div class='add'>+</div><div class='add'>+    /* &lt;callpoolStatus&gt; */</div><div class='add'>+    ret = xmlTextWriterStartElement(writer, (xmlChar *)"callpoolStatus");</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    snprintf(key, sizeof(key), "brick%d.callpool.count", brick_index);</div><div class='add'>+    ret = dict_get_int32(dict, key, &amp;call_count);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+    ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"count", "%d",</div><div class='add'>+                                          call_count);</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; call_count; i++) {</div><div class='add'>+        snprintf(key, sizeof(key), "brick%d.callpool.stack%d", brick_index, i);</div><div class='add'>+        ret = cli_xml_output_vol_status_callstack(writer, dict, key);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* &lt;/callpoolStatus&gt; */</div><div class='add'>+    ret = xmlTextWriterEndElement(writer);</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    gf_log("cli", GF_LOG_DEBUG, "Returning %d", ret);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+cli_xml_output_vol_status_begin(cli_local_t *local, int op_ret, int op_errno,</div><div class='add'>+                                char *op_errstr)</div><div class='add'>+{</div><div class='add'>+#if (HAVE_LIB_XML)</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    ret = cli_begin_xml_output(&amp;(local-&gt;writer), &amp;(local-&gt;doc));</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    ret = cli_xml_output_common(local-&gt;writer, op_ret, op_errno, op_errstr);</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    /* &lt;volStatus&gt; */</div><div class='add'>+    ret = xmlTextWriterStartElement(local-&gt;writer, (xmlChar *)"volStatus");</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    /* &lt;volumes&gt; */</div><div class='add'>+    ret = xmlTextWriterStartElement(local-&gt;writer, (xmlChar *)"volumes");</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    gf_log("cli", GF_LOG_DEBUG, "Returning %d", ret);</div><div class='add'>+    return ret;</div><div class='add'>+#else</div><div class='add'>+    return 0;</div><div class='add'>+#endif</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+cli_xml_output_vol_status_end(cli_local_t *local)</div><div class='add'>+{</div><div class='add'>+#if (HAVE_LIB_XML)</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    /* &lt;/volumes&gt; */</div><div class='add'>+    ret = xmlTextWriterEndElement(local-&gt;writer);</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    /* &lt;/volStatus&gt; */</div><div class='add'>+    ret = xmlTextWriterEndElement(local-&gt;writer);</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    ret = cli_end_xml_output(local-&gt;writer, local-&gt;doc);</div><div class='add'>+out:</div><div class='add'>+    gf_log("cli", GF_LOG_DEBUG, "Returning %d", ret);</div><div class='add'>+    return ret;</div><div class='add'>+#else</div><div class='add'>+    return 0;</div><div class='add'>+#endif</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#if (HAVE_LIB_XML)</div><div class='add'>+int</div><div class='add'>+cli_xml_output_remove_brick_task_params(xmlTextWriterPtr writer, dict_t *dict,</div><div class='add'>+                                        char *prefix)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    char key[1024] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int count = 0;</div><div class='add'>+    int i = 0;</div><div class='add'>+    char *brick = NULL;</div><div class='add'>+</div><div class='add'>+    /* &lt;params&gt; */</div><div class='add'>+    ret = xmlTextWriterStartElement(writer, (xmlChar *)"params");</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    snprintf(key, sizeof(key), "%s.count", prefix);</div><div class='add'>+    ret = dict_get_int32(dict, key, &amp;count);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    for (i = 1; i &lt;= count; i++) {</div><div class='add'>+        snprintf(key, sizeof(key), "%s.brick%d", prefix, i);</div><div class='add'>+        ret = dict_get_str(dict, key, &amp;brick);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+        ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"brick", "%s",</div><div class='add'>+                                              brick);</div><div class='add'>+        XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+        brick = NULL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* &lt;/param&gt; */</div><div class='add'>+    ret = xmlTextWriterEndElement(writer);</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+out:</div><div class='add'>+    gf_log("cli", GF_LOG_DEBUG, "Returning %d", ret);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+cli_xml_output_vol_status_tasks(cli_local_t *local, dict_t *dict)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    char *task_type = NULL;</div><div class='add'>+    char *task_id_str = NULL;</div><div class='add'>+    int status = 0;</div><div class='add'>+    int tasks = 0;</div><div class='add'>+    char key[1024] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int i = 0;</div><div class='add'>+</div><div class='add'>+    /* &lt;tasks&gt; */</div><div class='add'>+    ret = xmlTextWriterStartElement(local-&gt;writer, (xmlChar *)"tasks");</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    ret = dict_get_int32(dict, "tasks", &amp;tasks);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; tasks; i++) {</div><div class='add'>+        /* &lt;task&gt; */</div><div class='add'>+        ret = xmlTextWriterStartElement(local-&gt;writer, (xmlChar *)"task");</div><div class='add'>+        XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+        snprintf(key, sizeof(key), "task%d.type", i);</div><div class='add'>+        ret = dict_get_str(dict, key, &amp;task_type);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+        ret = xmlTextWriterWriteFormatElement(local-&gt;writer, (xmlChar *)"type",</div><div class='add'>+                                              "%s", task_type);</div><div class='add'>+        XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+        snprintf(key, sizeof(key), "task%d.id", i);</div><div class='add'>+        ret = dict_get_str(dict, key, &amp;task_id_str);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+        ret = xmlTextWriterWriteFormatElement(local-&gt;writer, (xmlChar *)"id",</div><div class='add'>+                                              "%s", task_id_str);</div><div class='add'>+        XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+        snprintf(key, sizeof(key), "task%d.status", i);</div><div class='add'>+        ret = dict_get_int32(dict, key, &amp;status);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+        ret = xmlTextWriterWriteFormatElement(</div><div class='add'>+            local-&gt;writer, (xmlChar *)"status", "%d", status);</div><div class='add'>+        XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+        ret = xmlTextWriterWriteFormatElement(local-&gt;writer,</div><div class='add'>+                                              (xmlChar *)"statusStr", "%s",</div><div class='add'>+                                              cli_vol_task_status_str[status]);</div><div class='add'>+</div><div class='add'>+        XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+        snprintf(key, sizeof(key), "task%d", i);</div><div class='add'>+        if (!strcmp(task_type, "Remove brick")) {</div><div class='add'>+            ret = cli_xml_output_remove_brick_task_params(local-&gt;writer, dict,</div><div class='add'>+                                                          key);</div><div class='add'>+            if (ret)</div><div class='add'>+                goto out;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        /* &lt;/task&gt; */</div><div class='add'>+        ret = xmlTextWriterEndElement(local-&gt;writer);</div><div class='add'>+        XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* &lt;/tasks&gt; */</div><div class='add'>+    ret = xmlTextWriterEndElement(local-&gt;writer);</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+out:</div><div class='add'>+    gf_log("cli", GF_LOG_DEBUG, "Returning %d", ret);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+cli_xml_output_vol_status_tasks_detail(cli_local_t *local, dict_t *dict)</div><div class='add'>+{</div><div class='add'>+#if (HAVE_LIB_XML)</div><div class='add'>+    int ret = -1;</div><div class='add'>+    char *volname = NULL;</div><div class='add'>+</div><div class='add'>+    /*&lt;volume&gt;*/</div><div class='add'>+    ret = xmlTextWriterStartElement(local-&gt;writer, (xmlChar *)"volume");</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    ret = dict_get_str(dict, "volname", &amp;volname);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+    ret = xmlTextWriterWriteFormatElement(local-&gt;writer, (xmlChar *)"volName",</div><div class='add'>+                                          "%s", volname);</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    ret = cli_xml_output_vol_status_tasks(local, dict);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    /* &lt;/volume&gt; */</div><div class='add'>+    ret = xmlTextWriterEndElement(local-&gt;writer);</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+#else</div><div class='add'>+    return 0;</div><div class='add'>+#endif</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+cli_xml_output_vol_status(cli_local_t *local, dict_t *dict)</div><div class='add'>+{</div><div class='add'>+#if (HAVE_LIB_XML)</div><div class='add'>+    int ret = -1;</div><div class='add'>+    char *volname = NULL;</div><div class='add'>+    int brick_count = 0;</div><div class='add'>+    int brick_index_max = -1;</div><div class='add'>+    int other_count = 0;</div><div class='add'>+    int index_max = 0;</div><div class='add'>+    uint32_t cmd = GF_CLI_STATUS_NONE;</div><div class='add'>+    int online = 0;</div><div class='add'>+    gf_boolean_t node_present = _gf_true;</div><div class='add'>+    int i;</div><div class='add'>+    int type = -1;</div><div class='add'>+</div><div class='add'>+    /* &lt;volume&gt; */</div><div class='add'>+    ret = xmlTextWriterStartElement(local-&gt;writer, (xmlChar *)"volume");</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    ret = dict_get_str(dict, "volname", &amp;volname);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+    ret = xmlTextWriterWriteFormatElement(local-&gt;writer, (xmlChar *)"volName",</div><div class='add'>+                                          "%s", volname);</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    ret = dict_get_int32(dict, "count", &amp;brick_count);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+    ret = xmlTextWriterWriteFormatElement(local-&gt;writer, (xmlChar *)"nodeCount",</div><div class='add'>+                                          "%d", brick_count);</div><div class='add'>+</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    ret = dict_get_uint32(dict, "cmd", &amp;cmd);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    ret = dict_get_int32(dict, "brick-index-max", &amp;brick_index_max);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+    ret = dict_get_int32(dict, "other-count", &amp;other_count);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    index_max = brick_index_max + other_count;</div><div class='add'>+</div><div class='add'>+    ret = dict_get_int32(dict, "type", &amp;type);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt;= index_max; i++) {</div><div class='add'>+        ret = cli_xml_output_vol_status_common(local-&gt;writer, dict, i, &amp;online,</div><div class='add'>+                                               &amp;node_present);</div><div class='add'>+        if (ret) {</div><div class='add'>+            if (node_present)</div><div class='add'>+                goto out;</div><div class='add'>+            else</div><div class='add'>+                continue;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        switch (cmd &amp; GF_CLI_STATUS_MASK) {</div><div class='add'>+            case GF_CLI_STATUS_DETAIL:</div><div class='add'>+                ret = cli_xml_output_vol_status_detail(local-&gt;writer, dict, i);</div><div class='add'>+                if (ret)</div><div class='add'>+                    goto out;</div><div class='add'>+                break;</div><div class='add'>+</div><div class='add'>+            case GF_CLI_STATUS_MEM:</div><div class='add'>+                if (online) {</div><div class='add'>+                    ret = cli_xml_output_vol_status_mem(local-&gt;writer, dict, i);</div><div class='add'>+                    if (ret)</div><div class='add'>+                        goto out;</div><div class='add'>+                }</div><div class='add'>+                break;</div><div class='add'>+</div><div class='add'>+            case GF_CLI_STATUS_CLIENTS:</div><div class='add'>+                if (online) {</div><div class='add'>+                    ret = cli_xml_output_vol_status_clients(local-&gt;writer, dict,</div><div class='add'>+                                                            i);</div><div class='add'>+                    if (ret)</div><div class='add'>+                        goto out;</div><div class='add'>+                }</div><div class='add'>+                break;</div><div class='add'>+</div><div class='add'>+            case GF_CLI_STATUS_INODE:</div><div class='add'>+                if (online) {</div><div class='add'>+                    ret = cli_xml_output_vol_status_inode(local-&gt;writer, dict,</div><div class='add'>+                                                          i);</div><div class='add'>+                    if (ret)</div><div class='add'>+                        goto out;</div><div class='add'>+                }</div><div class='add'>+                break;</div><div class='add'>+</div><div class='add'>+            case GF_CLI_STATUS_FD:</div><div class='add'>+                if (online) {</div><div class='add'>+                    ret = cli_xml_output_vol_status_fd(local-&gt;writer, dict, i);</div><div class='add'>+                    if (ret)</div><div class='add'>+                        goto out;</div><div class='add'>+                }</div><div class='add'>+                break;</div><div class='add'>+</div><div class='add'>+            case GF_CLI_STATUS_CALLPOOL:</div><div class='add'>+                if (online) {</div><div class='add'>+                    ret = cli_xml_output_vol_status_callpool(local-&gt;writer,</div><div class='add'>+                                                             dict, i);</div><div class='add'>+                    if (ret)</div><div class='add'>+                        goto out;</div><div class='add'>+                }</div><div class='add'>+                break;</div><div class='add'>+            default:</div><div class='add'>+                break;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        /* &lt;/node&gt;  was opened in cli_xml_output_vol_status_common()*/</div><div class='add'>+        ret = xmlTextWriterEndElement(local-&gt;writer);</div><div class='add'>+        XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Tasks are only present when a normal volume status call is done on a</div><div class='add'>+     * single volume or on all volumes</div><div class='add'>+     */</div><div class='add'>+    if (((cmd &amp; GF_CLI_STATUS_MASK) == GF_CLI_STATUS_NONE) &amp;&amp;</div><div class='add'>+        (cmd &amp; (GF_CLI_STATUS_VOL | GF_CLI_STATUS_ALL))) {</div><div class='add'>+        ret = cli_xml_output_vol_status_tasks(local, dict);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* &lt;/volume&gt; */</div><div class='add'>+    ret = xmlTextWriterEndElement(local-&gt;writer);</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    gf_log("cli", GF_LOG_DEBUG, "Returning %d", ret);</div><div class='add'>+    return ret;</div><div class='add'>+#else</div><div class='add'>+    return 0;</div><div class='add'>+#endif</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#if (HAVE_LIB_XML)</div><div class='add'>+int</div><div class='add'>+cli_xml_output_vol_top_rw_perf(xmlTextWriterPtr writer, dict_t *dict,</div><div class='add'>+                               int brick_index, int member_index)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    char *filename = NULL;</div><div class='add'>+    uint64_t throughput = 0;</div><div class='add'>+    struct timeval tv = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    char timestr[GF_TIMESTR_SIZE] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    char key[1024] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    /* &lt;file&gt; */</div><div class='add'>+    ret = xmlTextWriterStartElement(writer, (xmlChar *)"file");</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    snprintf(key, sizeof(key), "%d-filename-%d", brick_index, member_index);</div><div class='add'>+    ret = dict_get_str(dict, key, &amp;filename);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+    ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"filename", "%s",</div><div class='add'>+                                          filename);</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    snprintf(key, sizeof(key), "%d-value-%d", brick_index, member_index);</div><div class='add'>+    ret = dict_get_uint64(dict, key, &amp;throughput);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+    ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"count",</div><div class='add'>+                                          "%" PRIu64, throughput);</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    snprintf(key, sizeof(key), "%d-time-sec-%d", brick_index, member_index);</div><div class='add'>+    ret = dict_get_int32(dict, key, (int32_t *)&amp;tv.tv_sec);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    snprintf(key, sizeof(key), "%d-time-usec-%d", brick_index, member_index);</div><div class='add'>+    ret = dict_get_int32(dict, key, (int32_t *)&amp;tv.tv_usec);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    gf_time_fmt_tv(timestr, sizeof timestr, &amp;tv, gf_timefmt_FT);</div><div class='add'>+    ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"time", "%s",</div><div class='add'>+                                          timestr);</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    /* &lt;/file&gt; */</div><div class='add'>+    ret = xmlTextWriterEndElement(writer);</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    gf_log("cli", GF_LOG_DEBUG, "Returning %d", ret);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+cli_xml_output_vol_top_other(xmlTextWriterPtr writer, dict_t *dict,</div><div class='add'>+                             int brick_index, int member_index)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    char *filename = NULL;</div><div class='add'>+    uint64_t count = 0;</div><div class='add'>+    char key[1024] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    /* &lt;file&gt; */</div><div class='add'>+    ret = xmlTextWriterStartElement(writer, (xmlChar *)"file");</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    snprintf(key, sizeof(key), "%d-filename-%d", brick_index, member_index);</div><div class='add'>+    ret = dict_get_str(dict, key, &amp;filename);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+    ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"filename", "%s",</div><div class='add'>+                                          filename);</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    snprintf(key, sizeof(key), "%d-value-%d", brick_index, member_index);</div><div class='add'>+    ret = dict_get_uint64(dict, key, &amp;count);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+    ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"count",</div><div class='add'>+                                          "%" PRIu64, count);</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    /* &lt;/file&gt; */</div><div class='add'>+    ret = xmlTextWriterEndElement(writer);</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    gf_log("cli", GF_LOG_DEBUG, "Returning %d", ret);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+cli_xml_output_vol_top(dict_t *dict, int op_ret, int op_errno, char *op_errstr)</div><div class='add'>+{</div><div class='add'>+#if (HAVE_LIB_XML)</div><div class='add'>+    int ret = -1;</div><div class='add'>+    xmlTextWriterPtr writer = NULL;</div><div class='add'>+    xmlDocPtr doc = NULL;</div><div class='add'>+    int brick_count = 0;</div><div class='add'>+    int top_op = GF_CLI_TOP_NONE;</div><div class='add'>+    char *brick_name = NULL;</div><div class='add'>+    int members = 0;</div><div class='add'>+    uint64_t current_open = 0;</div><div class='add'>+    uint64_t max_open = 0;</div><div class='add'>+    char *max_open_time = NULL;</div><div class='add'>+    double throughput = 0.0;</div><div class='add'>+    double time_taken = 0.0;</div><div class='add'>+    char key[1024] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int i = 0;</div><div class='add'>+    int j = 0;</div><div class='add'>+</div><div class='add'>+    ret = cli_begin_xml_output(&amp;writer, &amp;doc);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    ret = cli_xml_output_common(writer, op_ret, op_errno, op_errstr);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    /* &lt;volTop&gt; */</div><div class='add'>+    ret = xmlTextWriterStartElement(writer, (xmlChar *)"volTop");</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    ret = dict_get_int32(dict, "count", &amp;brick_count);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+    ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"brickCount", "%d",</div><div class='add'>+                                          brick_count);</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    ret = dict_get_int32(dict, "1-top-op", &amp;top_op);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+    ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"topOp", "%d",</div><div class='add'>+                                          top_op);</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    while (i &lt; brick_count) {</div><div class='add'>+        i++;</div><div class='add'>+</div><div class='add'>+        /* &lt;brick&gt; */</div><div class='add'>+        ret = xmlTextWriterStartElement(writer, (xmlChar *)"brick");</div><div class='add'>+        XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+        snprintf(key, sizeof(key), "%d-brick", i);</div><div class='add'>+        ret = dict_get_str(dict, key, &amp;brick_name);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+        ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"name", "%s",</div><div class='add'>+                                              brick_name);</div><div class='add'>+        XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+        snprintf(key, sizeof(key), "%d-members", i);</div><div class='add'>+        ret = dict_get_int32(dict, key, &amp;members);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+        ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"members",</div><div class='add'>+                                              "%d", members);</div><div class='add'>+        XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+        switch (top_op) {</div><div class='add'>+            case GF_CLI_TOP_OPEN:</div><div class='add'>+                snprintf(key, sizeof(key), "%d-current-open", i);</div><div class='add'>+                ret = dict_get_uint64(dict, key, &amp;current_open);</div><div class='add'>+                if (ret)</div><div class='add'>+                    goto out;</div><div class='add'>+                ret = xmlTextWriterWriteFormatElement(</div><div class='add'>+                    writer, (xmlChar *)"currentOpen", "%" PRIu64, current_open);</div><div class='add'>+                XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+                snprintf(key, sizeof(key), "%d-max-open", i);</div><div class='add'>+                ret = dict_get_uint64(dict, key, &amp;max_open);</div><div class='add'>+                if (ret)</div><div class='add'>+                    goto out;</div><div class='add'>+                ret = xmlTextWriterWriteFormatElement(</div><div class='add'>+                    writer, (xmlChar *)"maxOpen", "%" PRIu64, max_open);</div><div class='add'>+                XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+                snprintf(key, sizeof(key), "%d-max-openfd-time", i);</div><div class='add'>+                ret = dict_get_str(dict, key, &amp;max_open_time);</div><div class='add'>+                if (ret)</div><div class='add'>+                    goto out;</div><div class='add'>+                ret = xmlTextWriterWriteFormatElement(</div><div class='add'>+                    writer, (xmlChar *)"maxOpenTime", "%s", max_open_time);</div><div class='add'>+                XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+            case GF_CLI_TOP_READ:</div><div class='add'>+            case GF_CLI_TOP_WRITE:</div><div class='add'>+            case GF_CLI_TOP_OPENDIR:</div><div class='add'>+            case GF_CLI_TOP_READDIR:</div><div class='add'>+</div><div class='add'>+                break;</div><div class='add'>+</div><div class='add'>+            case GF_CLI_TOP_READ_PERF:</div><div class='add'>+            case GF_CLI_TOP_WRITE_PERF:</div><div class='add'>+                snprintf(key, sizeof(key), "%d-throughput", i);</div><div class='add'>+                ret = dict_get_double(dict, key, &amp;throughput);</div><div class='add'>+                if (!ret) {</div><div class='add'>+                    snprintf(key, sizeof(key), "%d-time", i);</div><div class='add'>+                    ret = dict_get_double(dict, key, &amp;time_taken);</div><div class='add'>+                }</div><div class='add'>+</div><div class='add'>+                if (!ret) {</div><div class='add'>+                    ret = xmlTextWriterWriteFormatElement(</div><div class='add'>+                        writer, (xmlChar *)"throughput", "%f", throughput);</div><div class='add'>+                    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+                    ret = xmlTextWriterWriteFormatElement(</div><div class='add'>+                        writer, (xmlChar *)"timeTaken", "%f", time_taken);</div><div class='add'>+                    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+                }</div><div class='add'>+</div><div class='add'>+                break;</div><div class='add'>+</div><div class='add'>+            default:</div><div class='add'>+                ret = -1;</div><div class='add'>+                goto out;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        for (j = 1; j &lt;= members; j++) {</div><div class='add'>+            if (top_op == GF_CLI_TOP_READ_PERF ||</div><div class='add'>+                top_op == GF_CLI_TOP_WRITE_PERF) {</div><div class='add'>+                ret = cli_xml_output_vol_top_rw_perf(writer, dict, i, j);</div><div class='add'>+            } else {</div><div class='add'>+                ret = cli_xml_output_vol_top_other(writer, dict, i, j);</div><div class='add'>+            }</div><div class='add'>+            if (ret)</div><div class='add'>+                goto out;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        /* &lt;/brick&gt; */</div><div class='add'>+        ret = xmlTextWriterEndElement(writer);</div><div class='add'>+        XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* &lt;/volTop&gt; */</div><div class='add'>+    ret = xmlTextWriterEndElement(writer);</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+    ret = cli_end_xml_output(writer, doc);</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    gf_log("cli", GF_LOG_DEBUG, "Returning %d", ret);</div><div class='add'>+    return ret;</div><div class='add'>+#else</div><div class='add'>+    return 0;</div><div class='add'>+#endif</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#if (HAVE_LIB_XML)</div><div class='add'>+int</div><div class='add'>+cli_xml_output_vol_profile_stats(xmlTextWriterPtr writer, dict_t *dict,</div><div class='add'>+                                 int brick_index, int interval)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    uint64_t read_count = 0;</div><div class='add'>+    uint64_t write_count = 0;</div><div class='add'>+    uint64_t hits = 0;</div><div class='add'>+    double avg_latency = 0.0;</div><div class='add'>+    double max_latency = 0.0;</div><div class='add'>+    double min_latency = 0.0;</div><div class='add'>+    uint64_t duration = 0;</div><div class='add'>+    uint64_t total_read = 0;</div><div class='add'>+    uint64_t total_write = 0;</div><div class='add'>+    char key[1024] = {0};</div><div class='add'>+    int i = 0;</div><div class='add'>+</div><div class='add'>+    /* &lt;cumulativeStats&gt; || &lt;intervalStats&gt; */</div><div class='add'>+    if (interval == -1)</div><div class='add'>+        ret = xmlTextWriterStartElement(writer, (xmlChar *)"cumulativeStats");</div><div class='add'>+    else</div><div class='add'>+        ret = xmlTextWriterStartElement(writer, (xmlChar *)"intervalStats");</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    /* &lt;blockStats&gt; */</div><div class='add'>+    ret = xmlTextWriterStartElement(writer, (xmlChar *)"blockStats");</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; 32; i++) {</div><div class='add'>+        /* &lt;block&gt; */</div><div class='add'>+        ret = xmlTextWriterStartElement(writer, (xmlChar *)"block");</div><div class='add'>+        XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+        ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"size",</div><div class='add'>+                                              "%" PRIu32, (1U &lt;&lt; i));</div><div class='add'>+        XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+        snprintf(key, sizeof(key), "%d-%d-read-%" PRIu32, brick_index, interval,</div><div class='add'>+                 (1U &lt;&lt; i));</div><div class='add'>+        ret = dict_get_uint64(dict, key, &amp;read_count);</div><div class='add'>+        if (ret)</div><div class='add'>+            read_count = 0;</div><div class='add'>+        ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"reads",</div><div class='add'>+                                              "%" PRIu64, read_count);</div><div class='add'>+        XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+        snprintf(key, sizeof(key), "%d-%d-write-%" PRIu32, brick_index,</div><div class='add'>+                 interval, (1U &lt;&lt; i));</div><div class='add'>+        ret = dict_get_uint64(dict, key, &amp;write_count);</div><div class='add'>+        if (ret)</div><div class='add'>+            write_count = 0;</div><div class='add'>+        ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"writes",</div><div class='add'>+                                              "%" PRIu64, write_count);</div><div class='add'>+        XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+        /* &lt;/block&gt; */</div><div class='add'>+        ret = xmlTextWriterEndElement(writer);</div><div class='add'>+        XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* &lt;/blockStats&gt; */</div><div class='add'>+    ret = xmlTextWriterEndElement(writer);</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    /* &lt;fopStats&gt; */</div><div class='add'>+    ret = xmlTextWriterStartElement(writer, (xmlChar *)"fopStats");</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; GF_FOP_MAXVALUE; i++) {</div><div class='add'>+        snprintf(key, sizeof(key), "%d-%d-%d-hits", brick_index, interval, i);</div><div class='add'>+        ret = dict_get_uint64(dict, key, &amp;hits);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto cont;</div><div class='add'>+</div><div class='add'>+        snprintf(key, sizeof(key), "%d-%d-%d-avglatency", brick_index, interval,</div><div class='add'>+                 i);</div><div class='add'>+        ret = dict_get_double(dict, key, &amp;avg_latency);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto cont;</div><div class='add'>+</div><div class='add'>+        snprintf(key, sizeof(key), "%d-%d-%d-minlatency", brick_index, interval,</div><div class='add'>+                 i);</div><div class='add'>+        ret = dict_get_double(dict, key, &amp;min_latency);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto cont;</div><div class='add'>+</div><div class='add'>+        snprintf(key, sizeof(key), "%d-%d-%d-maxlatency", brick_index, interval,</div><div class='add'>+                 i);</div><div class='add'>+        ret = dict_get_double(dict, key, &amp;max_latency);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto cont;</div><div class='add'>+</div><div class='add'>+        /* &lt;fop&gt; */</div><div class='add'>+        ret = xmlTextWriterStartElement(writer, (xmlChar *)"fop");</div><div class='add'>+        XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+        ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"name", "%s",</div><div class='add'>+                                              gf_fop_list[i]);</div><div class='add'>+        XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+        ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"hits",</div><div class='add'>+                                              "%" PRIu64, hits);</div><div class='add'>+        XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+        ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"avgLatency",</div><div class='add'>+                                              "%f", avg_latency);</div><div class='add'>+        XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+        ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"minLatency",</div><div class='add'>+                                              "%f", min_latency);</div><div class='add'>+        XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+        ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"maxLatency",</div><div class='add'>+                                              "%f", max_latency);</div><div class='add'>+        XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+        /* &lt;/fop&gt; */</div><div class='add'>+        ret = xmlTextWriterEndElement(writer);</div><div class='add'>+        XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    cont:</div><div class='add'>+        hits = 0;</div><div class='add'>+        avg_latency = 0.0;</div><div class='add'>+        min_latency = 0.0;</div><div class='add'>+        max_latency = 0.0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; GF_UPCALL_FLAGS_MAXVALUE; i++) {</div><div class='add'>+        hits = 0;</div><div class='add'>+        avg_latency = 0.0;</div><div class='add'>+        min_latency = 0.0;</div><div class='add'>+        max_latency = 0.0;</div><div class='add'>+</div><div class='add'>+        snprintf(key, sizeof(key), "%d-%d-%d-upcall-hits", brick_index,</div><div class='add'>+                 interval, i);</div><div class='add'>+        ret = dict_get_uint64(dict, key, &amp;hits);</div><div class='add'>+        if (ret)</div><div class='add'>+            continue;</div><div class='add'>+</div><div class='add'>+        /* &lt;fop&gt; */</div><div class='add'>+        ret = xmlTextWriterStartElement(writer, (xmlChar *)"fop");</div><div class='add'>+        XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+        ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"name", "%s",</div><div class='add'>+                                              gf_fop_list[i]);</div><div class='add'>+        XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+        ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"hits",</div><div class='add'>+                                              "%" PRIu64, hits);</div><div class='add'>+        XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+        ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"avgLatency",</div><div class='add'>+                                              "%f", avg_latency);</div><div class='add'>+        XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+        ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"minLatency",</div><div class='add'>+                                              "%f", min_latency);</div><div class='add'>+        XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+        ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"maxLatency",</div><div class='add'>+                                              "%f", max_latency);</div><div class='add'>+        XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+        /* &lt;/fop&gt; */</div><div class='add'>+        ret = xmlTextWriterEndElement(writer);</div><div class='add'>+        XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* &lt;/fopStats&gt; */</div><div class='add'>+    ret = xmlTextWriterEndElement(writer);</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    snprintf(key, sizeof(key), "%d-%d-duration", brick_index, interval);</div><div class='add'>+    ret = dict_get_uint64(dict, key, &amp;duration);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+    ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"duration",</div><div class='add'>+                                          "%" PRIu64, duration);</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    snprintf(key, sizeof(key), "%d-%d-total-read", brick_index, interval);</div><div class='add'>+    ret = dict_get_uint64(dict, key, &amp;total_read);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+    ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"totalRead",</div><div class='add'>+                                          "%" PRIu64, total_read);</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    snprintf(key, sizeof(key), "%d-%d-total-write", brick_index, interval);</div><div class='add'>+    ret = dict_get_uint64(dict, key, &amp;total_write);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+    ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"totalWrite",</div><div class='add'>+                                          "%" PRIu64, total_write);</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    /* &lt;/cumulativeStats&gt; || &lt;/intervalStats&gt; */</div><div class='add'>+    ret = xmlTextWriterEndElement(writer);</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    gf_log("cli", GF_LOG_DEBUG, "Returning %d", ret);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+cli_xml_output_vol_profile(dict_t *dict, int op_ret, int op_errno,</div><div class='add'>+                           char *op_errstr)</div><div class='add'>+{</div><div class='add'>+#if (HAVE_LIB_XML)</div><div class='add'>+    int ret = -1;</div><div class='add'>+    xmlTextWriterPtr writer = NULL;</div><div class='add'>+    xmlDocPtr doc = NULL;</div><div class='add'>+    char *volname = NULL;</div><div class='add'>+    int op = GF_CLI_STATS_NONE;</div><div class='add'>+    int info_op = GF_CLI_INFO_NONE;</div><div class='add'>+    int brick_count = 0;</div><div class='add'>+    char *brick_name = NULL;</div><div class='add'>+    int interval = 0;</div><div class='add'>+    char key[1024] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int i = 0;</div><div class='add'>+    int stats_cleared = 0;</div><div class='add'>+</div><div class='add'>+    ret = cli_begin_xml_output(&amp;writer, &amp;doc);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    ret = cli_xml_output_common(writer, op_ret, op_errno, op_errstr);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    /* &lt;volProfile&gt; */</div><div class='add'>+    ret = xmlTextWriterStartElement(writer, (xmlChar *)"volProfile");</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    ret = dict_get_str(dict, "volname", &amp;volname);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+    ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"volname", "%s",</div><div class='add'>+                                          volname);</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    ret = dict_get_int32(dict, "op", &amp;op);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+    ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"profileOp", "%d",</div><div class='add'>+                                          op);</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    if (GF_CLI_STATS_INFO != op)</div><div class='add'>+        goto cont;</div><div class='add'>+</div><div class='add'>+    ret = dict_get_int32(dict, "count", &amp;brick_count);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+    ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"brickCount", "%d",</div><div class='add'>+                                          brick_count);</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    ret = dict_get_int32(dict, "info-op", &amp;info_op);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    while (i &lt; brick_count) {</div><div class='add'>+        i++;</div><div class='add'>+</div><div class='add'>+        /* &lt;brick&gt; */</div><div class='add'>+        ret = xmlTextWriterStartElement(writer, (xmlChar *)"brick");</div><div class='add'>+        XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+        snprintf(key, sizeof(key), "%d-brick", i);</div><div class='add'>+        ret = dict_get_str(dict, key, &amp;brick_name);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+        ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"brickName",</div><div class='add'>+                                              "%s", brick_name);</div><div class='add'>+        XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+        if (GF_CLI_INFO_CLEAR == info_op) {</div><div class='add'>+            snprintf(key, sizeof(key), "%d-stats-cleared", i);</div><div class='add'>+            ret = dict_get_int32(dict, key, &amp;stats_cleared);</div><div class='add'>+            if (ret)</div><div class='add'>+                goto out;</div><div class='add'>+</div><div class='add'>+            ret = xmlTextWriterWriteFormatElement(</div><div class='add'>+                writer, (xmlChar *)"clearStats", "%s",</div><div class='add'>+                stats_cleared ? "Cleared stats." : "Failed to clear stats.");</div><div class='add'>+            XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+        } else {</div><div class='add'>+            snprintf(key, sizeof(key), "%d-cumulative", i);</div><div class='add'>+            ret = dict_get_int32(dict, key, &amp;interval);</div><div class='add'>+            if (ret == 0) {</div><div class='add'>+                ret = cli_xml_output_vol_profile_stats(writer, dict, i,</div><div class='add'>+                                                       interval);</div><div class='add'>+                if (ret)</div><div class='add'>+                    goto out;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            snprintf(key, sizeof(key), "%d-interval", i);</div><div class='add'>+            ret = dict_get_int32(dict, key, &amp;interval);</div><div class='add'>+            if (ret == 0) {</div><div class='add'>+                ret = cli_xml_output_vol_profile_stats(writer, dict, i,</div><div class='add'>+                                                       interval);</div><div class='add'>+                if (ret)</div><div class='add'>+                    goto out;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        /* &lt;/brick&gt; */</div><div class='add'>+        ret = xmlTextWriterEndElement(writer);</div><div class='add'>+        XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+cont:</div><div class='add'>+    /* &lt;/volProfile&gt; */</div><div class='add'>+    ret = xmlTextWriterEndElement(writer);</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    ret = cli_end_xml_output(writer, doc);</div><div class='add'>+out:</div><div class='add'>+    gf_log("cli", GF_LOG_DEBUG, "Returning %d", ret);</div><div class='add'>+    return ret;</div><div class='add'>+#else</div><div class='add'>+    return 0;</div><div class='add'>+#endif</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+cli_xml_output_vol_list(dict_t *dict, int op_ret, int op_errno, char *op_errstr)</div><div class='add'>+{</div><div class='add'>+#if (HAVE_LIB_XML)</div><div class='add'>+    int ret = -1;</div><div class='add'>+    xmlTextWriterPtr writer = NULL;</div><div class='add'>+    xmlDocPtr doc = NULL;</div><div class='add'>+    int count = 0;</div><div class='add'>+    char *volname = NULL;</div><div class='add'>+    char key[1024] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int i = 0;</div><div class='add'>+</div><div class='add'>+    ret = cli_begin_xml_output(&amp;writer, &amp;doc);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    ret = cli_xml_output_common(writer, op_ret, op_errno, op_errstr);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    /* &lt;volList&gt; */</div><div class='add'>+    ret = xmlTextWriterStartElement(writer, (xmlChar *)"volList");</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    ret = dict_get_int32(dict, "count", &amp;count);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+    ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"count", "%d",</div><div class='add'>+                                          count);</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; count; i++) {</div><div class='add'>+        snprintf(key, sizeof(key), "volume%d", i);</div><div class='add'>+        ret = dict_get_str(dict, key, &amp;volname);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+        ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"volume", "%s",</div><div class='add'>+                                              volname);</div><div class='add'>+        XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* &lt;/volList&gt; */</div><div class='add'>+    ret = xmlTextWriterEndElement(writer);</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    ret = cli_end_xml_output(writer, doc);</div><div class='add'>+out:</div><div class='add'>+    gf_log("cli", GF_LOG_DEBUG, "Returning %d", ret);</div><div class='add'>+    return ret;</div><div class='add'>+#else</div><div class='add'>+    return 0;</div><div class='add'>+#endif</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#if (HAVE_LIB_XML)</div><div class='add'>+int</div><div class='add'>+cli_xml_output_vol_info_option(xmlTextWriterPtr writer, char *substr,</div><div class='add'>+                               char *optstr, char *valstr)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    char *ptr1 = NULL;</div><div class='add'>+    char *ptr2 = NULL;</div><div class='add'>+</div><div class='add'>+    ptr1 = substr;</div><div class='add'>+    ptr2 = optstr;</div><div class='add'>+</div><div class='add'>+    while (ptr1) {</div><div class='add'>+        if (*ptr1 != *ptr2)</div><div class='add'>+            break;</div><div class='add'>+        ptr1++;</div><div class='add'>+        ptr2++;</div><div class='add'>+        if (!*ptr1)</div><div class='add'>+            break;</div><div class='add'>+        if (!*ptr2)</div><div class='add'>+            break;</div><div class='add'>+    }</div><div class='add'>+    if (*ptr2 == '\0')</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    /* &lt;option&gt; */</div><div class='add'>+    ret = xmlTextWriterStartElement(writer, (xmlChar *)"option");</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"name", "%s",</div><div class='add'>+                                          ptr2);</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"value", "%s",</div><div class='add'>+                                          valstr);</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    /* &lt;/option&gt; */</div><div class='add'>+    ret = xmlTextWriterEndElement(writer);</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+out:</div><div class='add'>+    gf_log("cli", GF_LOG_DEBUG, "Returning %d", ret);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+struct tmp_xml_option_logger {</div><div class='add'>+    char *key;</div><div class='add'>+    xmlTextWriterPtr writer;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+_output_vol_info_option(dict_t *d, char *k, data_t *v, void *data)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+    char *ptr = NULL;</div><div class='add'>+    struct tmp_xml_option_logger *tmp = NULL;</div><div class='add'>+</div><div class='add'>+    tmp = data;</div><div class='add'>+</div><div class='add'>+    ptr = strstr(k, "option.");</div><div class='add'>+    if (!ptr)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    if (!v) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    ret = cli_xml_output_vol_info_option(tmp-&gt;writer, tmp-&gt;key, k, v-&gt;data);</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+cli_xml_output_vol_info_options(xmlTextWriterPtr writer, dict_t *dict,</div><div class='add'>+                                char *prefix)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int opt_count = 0;</div><div class='add'>+    char key[1024] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    struct tmp_xml_option_logger tmp = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    snprintf(key, sizeof(key), "%s.opt_count", prefix);</div><div class='add'>+    ret = dict_get_int32(dict, key, &amp;opt_count);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+    ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"optCount", "%d",</div><div class='add'>+                                          opt_count);</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    /* &lt;options&gt; */</div><div class='add'>+    ret = xmlTextWriterStartElement(writer, (xmlChar *)"options");</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+    snprintf(key, sizeof(key), "%s.option.", prefix);</div><div class='add'>+</div><div class='add'>+    tmp.key = key;</div><div class='add'>+    tmp.writer = writer;</div><div class='add'>+    ret = dict_foreach(dict, _output_vol_info_option, &amp;tmp);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    /* &lt;/options&gt; */</div><div class='add'>+    ret = xmlTextWriterEndElement(writer);</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+out:</div><div class='add'>+    gf_log("cli", GF_LOG_DEBUG, "Returning %d", ret);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+cli_xml_output_vol_info(cli_local_t *local, dict_t *dict)</div><div class='add'>+{</div><div class='add'>+#if (HAVE_LIB_XML)</div><div class='add'>+    int ret = 0;</div><div class='add'>+    int count = 0;</div><div class='add'>+    char *volname = NULL;</div><div class='add'>+    char *volume_id = NULL;</div><div class='add'>+    char *uuid = NULL;</div><div class='add'>+    int type = 0;</div><div class='add'>+    int status = 0;</div><div class='add'>+    int brick_count = 0;</div><div class='add'>+    int dist_count = 0;</div><div class='add'>+    int stripe_count = 0;</div><div class='add'>+    int replica_count = 0;</div><div class='add'>+    int arbiter_count = 0;</div><div class='add'>+    int snap_count = 0;</div><div class='add'>+    int isArbiter = 0;</div><div class='add'>+    int disperse_count = 0;</div><div class='add'>+    int redundancy_count = 0;</div><div class='add'>+    int transport = 0;</div><div class='add'>+    char *brick = NULL;</div><div class='add'>+    char key[1024] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int i = 0;</div><div class='add'>+    int j = 1;</div><div class='add'>+    char *caps __attribute__((unused)) = NULL;</div><div class='add'>+    int k __attribute__((unused)) = 0;</div><div class='add'>+</div><div class='add'>+    ret = dict_get_int32(dict, "count", &amp;count);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; count; i++) {</div><div class='add'>+        /* &lt;volume&gt; */</div><div class='add'>+        ret = xmlTextWriterStartElement(local-&gt;writer, (xmlChar *)"volume");</div><div class='add'>+        XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+        snprintf(key, sizeof(key), "volume%d.name", i);</div><div class='add'>+        ret = dict_get_str(dict, key, &amp;volname);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+        ret = xmlTextWriterWriteFormatElement(local-&gt;writer, (xmlChar *)"name",</div><div class='add'>+                                              "%s", volname);</div><div class='add'>+        XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+        snprintf(key, sizeof(key), "volume%d.volume_id", i);</div><div class='add'>+        ret = dict_get_str(dict, key, &amp;volume_id);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+        ret = xmlTextWriterWriteFormatElement(local-&gt;writer, (xmlChar *)"id",</div><div class='add'>+                                              "%s", volume_id);</div><div class='add'>+        XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+        snprintf(key, sizeof(key), "volume%d.status", i);</div><div class='add'>+        ret = dict_get_int32(dict, key, &amp;status);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+        ret = xmlTextWriterWriteFormatElement(</div><div class='add'>+            local-&gt;writer, (xmlChar *)"status", "%d", status);</div><div class='add'>+        XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+        ret = xmlTextWriterWriteFormatElement(local-&gt;writer,</div><div class='add'>+                                              (xmlChar *)"statusStr", "%s",</div><div class='add'>+                                              cli_vol_status_str[status]);</div><div class='add'>+        XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+        snprintf(key, sizeof(key), "volume%d.snap_count", i);</div><div class='add'>+        ret = dict_get_int32(dict, key, &amp;snap_count);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+        ret = xmlTextWriterWriteFormatElement(</div><div class='add'>+            local-&gt;writer, (xmlChar *)"snapshotCount", "%d", snap_count);</div><div class='add'>+        XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+        snprintf(key, sizeof(key), "volume%d.brick_count", i);</div><div class='add'>+        ret = dict_get_int32(dict, key, &amp;brick_count);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+        ret = xmlTextWriterWriteFormatElement(</div><div class='add'>+            local-&gt;writer, (xmlChar *)"brickCount", "%d", brick_count);</div><div class='add'>+        XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+        snprintf(key, sizeof(key), "volume%d.dist_count", i);</div><div class='add'>+        ret = dict_get_int32(dict, key, &amp;dist_count);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+        ret = xmlTextWriterWriteFormatElement(local-&gt;writer,</div><div class='add'>+                                              (xmlChar *)"distCount", "%d",</div><div class='add'>+                                              (brick_count / dist_count));</div><div class='add'>+        XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+        snprintf(key, sizeof(key), "volume%d.stripe_count", i);</div><div class='add'>+        ret = dict_get_int32(dict, key, &amp;stripe_count);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+        ret = xmlTextWriterWriteFormatElement(</div><div class='add'>+            local-&gt;writer, (xmlChar *)"stripeCount", "%d", stripe_count);</div><div class='add'>+        XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+        snprintf(key, sizeof(key), "volume%d.replica_count", i);</div><div class='add'>+        ret = dict_get_int32(dict, key, &amp;replica_count);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+        ret = xmlTextWriterWriteFormatElement(</div><div class='add'>+            local-&gt;writer, (xmlChar *)"replicaCount", "%d", replica_count);</div><div class='add'>+        XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+        snprintf(key, sizeof(key), "volume%d.arbiter_count", i);</div><div class='add'>+        ret = dict_get_int32(dict, key, &amp;arbiter_count);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+        ret = xmlTextWriterWriteFormatElement(</div><div class='add'>+            local-&gt;writer, (xmlChar *)"arbiterCount", "%d", arbiter_count);</div><div class='add'>+        XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+        snprintf(key, sizeof(key), "volume%d.disperse_count", i);</div><div class='add'>+        ret = dict_get_int32(dict, key, &amp;disperse_count);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+        ret = xmlTextWriterWriteFormatElement(</div><div class='add'>+            local-&gt;writer, (xmlChar *)"disperseCount", "%d", disperse_count);</div><div class='add'>+        XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+        snprintf(key, sizeof(key), "volume%d.redundancy_count", i);</div><div class='add'>+        ret = dict_get_int32(dict, key, &amp;redundancy_count);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+        ret = xmlTextWriterWriteFormatElement(local-&gt;writer,</div><div class='add'>+                                              (xmlChar *)"redundancyCount",</div><div class='add'>+                                              "%d", redundancy_count);</div><div class='add'>+        XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+        snprintf(key, sizeof(key), "volume%d.type", i);</div><div class='add'>+        ret = dict_get_int32(dict, key, &amp;type);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+        /* For Distributed-(stripe,replicate,stipe-replicate,disperse)</div><div class='add'>+           types</div><div class='add'>+         */</div><div class='add'>+        type = get_vol_type(type, dist_count, brick_count);</div><div class='add'>+</div><div class='add'>+        ret = xmlTextWriterWriteFormatElement(local-&gt;writer, (xmlChar *)"type",</div><div class='add'>+                                              "%d", type);</div><div class='add'>+        XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+        ret = xmlTextWriterWriteFormatElement(</div><div class='add'>+            local-&gt;writer, (xmlChar *)"typeStr", "%s", vol_type_str[type]);</div><div class='add'>+        XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+        snprintf(key, sizeof(key), "volume%d.transport", i);</div><div class='add'>+        ret = dict_get_int32(dict, key, &amp;transport);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+        ret = xmlTextWriterWriteFormatElement(</div><div class='add'>+            local-&gt;writer, (xmlChar *)"transport", "%d", transport);</div><div class='add'>+        XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+        j = 1;</div><div class='add'>+</div><div class='add'>+        /* &lt;bricks&gt; */</div><div class='add'>+        ret = xmlTextWriterStartElement(local-&gt;writer, (xmlChar *)"bricks");</div><div class='add'>+        XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+        while (j &lt;= brick_count) {</div><div class='add'>+            ret = xmlTextWriterStartElement(local-&gt;writer, (xmlChar *)"brick");</div><div class='add'>+            XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+            snprintf(key, sizeof(key), "volume%d.brick%d.uuid", i, j);</div><div class='add'>+            ret = dict_get_str(dict, key, &amp;uuid);</div><div class='add'>+            if (ret)</div><div class='add'>+                goto out;</div><div class='add'>+            ret = xmlTextWriterWriteFormatAttribute(</div><div class='add'>+                local-&gt;writer, (xmlChar *)"uuid", "%s", uuid);</div><div class='add'>+            XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+            snprintf(key, sizeof(key), "volume%d.brick%d", i, j);</div><div class='add'>+            ret = dict_get_str(dict, key, &amp;brick);</div><div class='add'>+            if (ret)</div><div class='add'>+                goto out;</div><div class='add'>+            ret = xmlTextWriterWriteFormatString(local-&gt;writer, "%s", brick);</div><div class='add'>+            XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+            ret = xmlTextWriterWriteFormatElement(</div><div class='add'>+                local-&gt;writer, (xmlChar *)"name", "%s", brick);</div><div class='add'>+            XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+            ret = xmlTextWriterWriteFormatElement(</div><div class='add'>+                local-&gt;writer, (xmlChar *)"hostUuid", "%s", uuid);</div><div class='add'>+            XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+            snprintf(key, sizeof(key), "volume%d.brick%d.isArbiter", i, j);</div><div class='add'>+            if (dict_get(dict, key))</div><div class='add'>+                isArbiter = 1;</div><div class='add'>+            else</div><div class='add'>+                isArbiter = 0;</div><div class='add'>+            ret = xmlTextWriterWriteFormatElement(</div><div class='add'>+                local-&gt;writer, (xmlChar *)"isArbiter", "%d", isArbiter);</div><div class='add'>+            XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+            /* &lt;/brick&gt; */</div><div class='add'>+            ret = xmlTextWriterEndElement(local-&gt;writer);</div><div class='add'>+            XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+            j++;</div><div class='add'>+        }</div><div class='add'>+        /* &lt;/bricks&gt; */</div><div class='add'>+        ret = xmlTextWriterEndElement(local-&gt;writer);</div><div class='add'>+        XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+        snprintf(key, sizeof(key), "volume%d", i);</div><div class='add'>+        ret = cli_xml_output_vol_info_options(local-&gt;writer, dict, key);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+</div><div class='add'>+        /* &lt;/volume&gt; */</div><div class='add'>+        ret = xmlTextWriterEndElement(local-&gt;writer);</div><div class='add'>+        XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (volname) {</div><div class='add'>+        GF_FREE(local-&gt;get_vol.volname);</div><div class='add'>+        local-&gt;get_vol.volname = gf_strdup(volname);</div><div class='add'>+        local-&gt;vol_count += count;</div><div class='add'>+    }</div><div class='add'>+out:</div><div class='add'>+    gf_log("cli", GF_LOG_DEBUG, "Returning %d", ret);</div><div class='add'>+    return ret;</div><div class='add'>+#else</div><div class='add'>+    return 0;</div><div class='add'>+#endif</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+cli_xml_output_vol_info_begin(cli_local_t *local, int op_ret, int op_errno,</div><div class='add'>+                              char *op_errstr)</div><div class='add'>+{</div><div class='add'>+#if (HAVE_LIB_XML)</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(local);</div><div class='add'>+</div><div class='add'>+    ret = cli_begin_xml_output(&amp;(local-&gt;writer), &amp;(local-&gt;doc));</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    ret = cli_xml_output_common(local-&gt;writer, op_ret, op_errno, op_errstr);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    /* &lt;volInfo&gt; */</div><div class='add'>+    ret = xmlTextWriterStartElement(local-&gt;writer, (xmlChar *)"volInfo");</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    /* &lt;volumes&gt; */</div><div class='add'>+    ret = xmlTextWriterStartElement(local-&gt;writer, (xmlChar *)"volumes");</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    /* Init vol count */</div><div class='add'>+    local-&gt;vol_count = 0;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    gf_log("cli", GF_LOG_DEBUG, "Returning %d", ret);</div><div class='add'>+    return ret;</div><div class='add'>+#else</div><div class='add'>+    return 0;</div><div class='add'>+#endif</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+cli_xml_output_vol_info_end(cli_local_t *local)</div><div class='add'>+{</div><div class='add'>+#if (HAVE_LIB_XML)</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(local);</div><div class='add'>+</div><div class='add'>+    ret = xmlTextWriterWriteFormatElement(local-&gt;writer, (xmlChar *)"count",</div><div class='add'>+                                          "%d", local-&gt;vol_count);</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+    /* &lt;/volumes&gt; */</div><div class='add'>+    ret = xmlTextWriterEndElement(local-&gt;writer);</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    /* &lt;/volInfo&gt; */</div><div class='add'>+    ret = xmlTextWriterEndElement(local-&gt;writer);</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    ret = cli_end_xml_output(local-&gt;writer, local-&gt;doc);</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    gf_log("cli", GF_LOG_DEBUG, "Returning %d", ret);</div><div class='add'>+    return ret;</div><div class='add'>+#else</div><div class='add'>+    return 0;</div><div class='add'>+#endif</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+cli_xml_output_vol_quota_limit_list_end(cli_local_t *local)</div><div class='add'>+{</div><div class='add'>+#if (HAVE_LIB_XML)</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    ret = xmlTextWriterEndElement(local-&gt;writer);</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    ret = cli_end_xml_output(local-&gt;writer, local-&gt;doc);</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+#else</div><div class='add'>+    return 0;</div><div class='add'>+#endif</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+cli_xml_output_vol_quota_limit_list_begin(cli_local_t *local, int op_ret,</div><div class='add'>+                                          int op_errno, char *op_errstr)</div><div class='add'>+{</div><div class='add'>+#if (HAVE_LIB_XML)</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    ret = cli_begin_xml_output(&amp;(local-&gt;writer), &amp;(local-&gt;doc));</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    ret = cli_xml_output_common(local-&gt;writer, op_ret, op_errno, op_errstr);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    /* &lt;volQuota&gt; */</div><div class='add'>+    ret = xmlTextWriterStartElement(local-&gt;writer, (xmlChar *)"volQuota");</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    gf_log("cli", GF_LOG_DEBUG, "Returning %d", ret);</div><div class='add'>+    return ret;</div><div class='add'>+#else</div><div class='add'>+    return 0;</div><div class='add'>+#endif</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#if (HAVE_LIB_XML)</div><div class='add'>+static int</div><div class='add'>+cli_xml_output_peer_hostnames(xmlTextWriterPtr writer, dict_t *dict,</div><div class='add'>+                              const char *prefix, int count)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int i = 0;</div><div class='add'>+    char *hostname = NULL;</div><div class='add'>+    char key[1024] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    /* &lt;hostnames&gt; */</div><div class='add'>+    ret = xmlTextWriterStartElement(writer, (xmlChar *)"hostnames");</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; count; i++) {</div><div class='add'>+        ret = snprintf(key, sizeof(key), "%s.hostname%d", prefix, i);</div><div class='add'>+        if (ret &lt; 0)</div><div class='add'>+            goto out;</div><div class='add'>+        ret = dict_get_str(dict, key, &amp;hostname);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+        ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"hostname",</div><div class='add'>+                                              "%s", hostname);</div><div class='add'>+        XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+        hostname = NULL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* &lt;/hostnames&gt; */</div><div class='add'>+    ret = xmlTextWriterEndElement(writer);</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+out:</div><div class='add'>+    gf_log("cli", GF_LOG_DEBUG, "Returning %d", ret);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+cli_xml_output_peer_status(dict_t *dict, int op_ret, int op_errno,</div><div class='add'>+                           char *op_errstr)</div><div class='add'>+{</div><div class='add'>+#if (HAVE_LIB_XML)</div><div class='add'>+    int ret = -1;</div><div class='add'>+    xmlTextWriterPtr writer = NULL;</div><div class='add'>+    xmlDocPtr doc = NULL;</div><div class='add'>+    int count = 0;</div><div class='add'>+    char *uuid = NULL;</div><div class='add'>+    char *hostname = NULL;</div><div class='add'>+    int connected = 0;</div><div class='add'>+    int state_id = 0;</div><div class='add'>+    char *state_str = NULL;</div><div class='add'>+    int hostname_count = 0;</div><div class='add'>+    int i = 1;</div><div class='add'>+    char key[1024] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    ret = cli_begin_xml_output(&amp;writer, &amp;doc);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    ret = cli_xml_output_common(writer, op_ret, op_errno, op_errstr);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    /* &lt;peerStatus&gt; */</div><div class='add'>+    ret = xmlTextWriterStartElement(writer, (xmlChar *)"peerStatus");</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    if (!dict)</div><div class='add'>+        goto cont;</div><div class='add'>+</div><div class='add'>+    ret = dict_get_int32(dict, "count", &amp;count);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    while (i &lt;= count) {</div><div class='add'>+        /* &lt;peer&gt; */</div><div class='add'>+        ret = xmlTextWriterStartElement(writer, (xmlChar *)"peer");</div><div class='add'>+        XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+        snprintf(key, sizeof(key), "friend%d.uuid", i);</div><div class='add'>+        ret = dict_get_str(dict, key, &amp;uuid);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+</div><div class='add'>+        ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"uuid", "%s",</div><div class='add'>+                                              uuid);</div><div class='add'>+        XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+        snprintf(key, sizeof(key), "friend%d.hostname", i);</div><div class='add'>+        ret = dict_get_str(dict, key, &amp;hostname);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+</div><div class='add'>+        ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"hostname",</div><div class='add'>+                                              "%s", hostname);</div><div class='add'>+        XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+        snprintf(key, sizeof(key), "friend%d.hostname_count", i);</div><div class='add'>+        ret = dict_get_int32(dict, key, &amp;hostname_count);</div><div class='add'>+        if ((ret == 0) &amp;&amp; (hostname_count &gt; 0)) {</div><div class='add'>+            snprintf(key, sizeof(key), "friend%d", i);</div><div class='add'>+            ret = cli_xml_output_peer_hostnames(writer, dict, key,</div><div class='add'>+                                                hostname_count);</div><div class='add'>+            XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        snprintf(key, sizeof(key), "friend%d.connected", i);</div><div class='add'>+        ret = dict_get_int32(dict, key, &amp;connected);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+</div><div class='add'>+        ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"connected",</div><div class='add'>+                                              "%d", connected);</div><div class='add'>+        XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+        snprintf(key, sizeof(key), "friend%d.stateId", i);</div><div class='add'>+        ret = dict_get_int32(dict, key, &amp;state_id);</div><div class='add'>+        if (!ret) {</div><div class='add'>+            /* ignore */</div><div class='add'>+</div><div class='add'>+            ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"state",</div><div class='add'>+                                                  "%d", state_id);</div><div class='add'>+            XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        snprintf(key, sizeof(key), "friend%d.state", i);</div><div class='add'>+        ret = dict_get_str(dict, key, &amp;state_str);</div><div class='add'>+        if (!ret) {</div><div class='add'>+            /* ignore */</div><div class='add'>+</div><div class='add'>+            ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"stateStr",</div><div class='add'>+                                                  "%s", state_str);</div><div class='add'>+            XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        /* &lt;/peer&gt; */</div><div class='add'>+        ret = xmlTextWriterEndElement(writer);</div><div class='add'>+        XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+        i++;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+cont:</div><div class='add'>+    /* &lt;/peerStatus&gt; */</div><div class='add'>+    ret = xmlTextWriterEndElement(writer);</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    ret = cli_end_xml_output(writer, doc);</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    gf_log("cli", GF_LOG_DEBUG, "Returning %d", ret);</div><div class='add'>+    return ret;</div><div class='add'>+#else</div><div class='add'>+    return 0;</div><div class='add'>+#endif</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#if (HAVE_LIB_XML)</div><div class='add'>+/* Used for rebalance stop/status, remove-brick status */</div><div class='add'>+int</div><div class='add'>+cli_xml_output_vol_rebalance_status(xmlTextWriterPtr writer, dict_t *dict,</div><div class='add'>+                                    enum gf_task_types task_type)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int count = 0;</div><div class='add'>+    char *node_name = NULL;</div><div class='add'>+    char *node_uuid = NULL;</div><div class='add'>+    uint64_t files = 0;</div><div class='add'>+    uint64_t size = 0;</div><div class='add'>+    uint64_t lookups = 0;</div><div class='add'>+    int status_rcd = 0;</div><div class='add'>+    uint64_t failures = 0;</div><div class='add'>+    uint64_t skipped = 0;</div><div class='add'>+    uint64_t total_files = 0;</div><div class='add'>+    uint64_t total_size = 0;</div><div class='add'>+    uint64_t total_lookups = 0;</div><div class='add'>+    uint64_t total_failures = 0;</div><div class='add'>+    uint64_t total_skipped = 0;</div><div class='add'>+    char key[1024] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int i = 0;</div><div class='add'>+    int overall_status = -1;</div><div class='add'>+    double elapsed = 0;</div><div class='add'>+    double overall_elapsed = 0;</div><div class='add'>+</div><div class='add'>+    if (!dict) {</div><div class='add'>+        ret = 0;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_get_int32(dict, "count", &amp;count);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+    ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"nodeCount", "%d",</div><div class='add'>+                                          count);</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    while (i &lt; count) {</div><div class='add'>+        i++;</div><div class='add'>+        /* Getting status early, to skip nodes that don't have the</div><div class='add'>+         * rebalance process started</div><div class='add'>+         */</div><div class='add'>+        snprintf(key, sizeof(key), "status-%d", i);</div><div class='add'>+        ret = dict_get_int32(dict, key, &amp;status_rcd);</div><div class='add'>+</div><div class='add'>+        /* If glusterd is down it fails to get the status, try</div><div class='add'>+         getting status from other nodes */</div><div class='add'>+        if (ret)</div><div class='add'>+            continue;</div><div class='add'>+        if (GF_DEFRAG_STATUS_NOT_STARTED == status_rcd)</div><div class='add'>+            continue;</div><div class='add'>+</div><div class='add'>+        /* &lt;node&gt; */</div><div class='add'>+        ret = xmlTextWriterStartElement(writer, (xmlChar *)"node");</div><div class='add'>+        XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+        snprintf(key, sizeof(key), "node-name-%d", i);</div><div class='add'>+        ret = dict_get_str(dict, key, &amp;node_name);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+        ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"nodeName",</div><div class='add'>+                                              "%s", node_name);</div><div class='add'>+        XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+        snprintf(key, sizeof(key), "node-uuid-%d", i);</div><div class='add'>+        ret = dict_get_str(dict, key, &amp;node_uuid);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+        ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"id", "%s",</div><div class='add'>+                                              node_uuid);</div><div class='add'>+        XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+        snprintf(key, sizeof(key), "files-%d", i);</div><div class='add'>+        ret = dict_get_uint64(dict, key, &amp;files);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+        total_files += files;</div><div class='add'>+        ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"files",</div><div class='add'>+                                              "%" PRIu64, files);</div><div class='add'>+        XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+        snprintf(key, sizeof(key), "size-%d", i);</div><div class='add'>+        ret = dict_get_uint64(dict, key, &amp;size);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+        total_size += size;</div><div class='add'>+        ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"size",</div><div class='add'>+                                              "%" PRIu64, size);</div><div class='add'>+        XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+        snprintf(key, sizeof(key), "lookups-%d", i);</div><div class='add'>+        ret = dict_get_uint64(dict, key, &amp;lookups);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+        total_lookups += lookups;</div><div class='add'>+        ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"lookups",</div><div class='add'>+                                              "%" PRIu64, lookups);</div><div class='add'>+        XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+        snprintf(key, sizeof(key), "failures-%d", i);</div><div class='add'>+        ret = dict_get_uint64(dict, key, &amp;failures);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+</div><div class='add'>+        snprintf(key, sizeof(key), "skipped-%d", i);</div><div class='add'>+</div><div class='add'>+        ret = dict_get_uint64(dict, key, &amp;skipped);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+</div><div class='add'>+        if (task_type == GF_TASK_TYPE_REMOVE_BRICK) {</div><div class='add'>+            failures += skipped;</div><div class='add'>+            skipped = 0;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        total_failures += failures;</div><div class='add'>+        ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"failures",</div><div class='add'>+                                              "%" PRIu64, failures);</div><div class='add'>+        XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+        total_skipped += skipped;</div><div class='add'>+</div><div class='add'>+        ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"skipped",</div><div class='add'>+                                              "%" PRIu64, skipped);</div><div class='add'>+        XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+        ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"status", "%d",</div><div class='add'>+                                              status_rcd);</div><div class='add'>+        XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+        ret = xmlTextWriterWriteFormatElement(</div><div class='add'>+            writer, (xmlChar *)"statusStr", "%s",</div><div class='add'>+            cli_vol_task_status_str[status_rcd]);</div><div class='add'>+        XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+        snprintf(key, sizeof(key), "run-time-%d", i);</div><div class='add'>+        ret = dict_get_double(dict, key, &amp;elapsed);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+        ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"runtime",</div><div class='add'>+                                              "%.2f", elapsed);</div><div class='add'>+        XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+        if (elapsed &gt; overall_elapsed) {</div><div class='add'>+            overall_elapsed = elapsed;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        /* Rebalance has 5 states,</div><div class='add'>+         * NOT_STARTED, STARTED, STOPPED, COMPLETE, FAILED</div><div class='add'>+         * The precedence used to determine the aggregate status is as</div><div class='add'>+         * below,</div><div class='add'>+         * STARTED &gt; FAILED &gt; STOPPED &gt; COMPLETE &gt; NOT_STARTED</div><div class='add'>+         */</div><div class='add'>+        /* TODO: Move this to a common place utilities that both CLI and</div><div class='add'>+         * glusterd need.</div><div class='add'>+         * Till then if the below algorithm is changed, change it in</div><div class='add'>+         * glusterd_volume_status_aggregate_tasks_status in</div><div class='add'>+         * glusterd-utils.c</div><div class='add'>+         */</div><div class='add'>+</div><div class='add'>+        if (-1 == overall_status)</div><div class='add'>+            overall_status = status_rcd;</div><div class='add'>+        int rank[] = {[GF_DEFRAG_STATUS_STARTED] = 1,</div><div class='add'>+                      [GF_DEFRAG_STATUS_FAILED] = 2,</div><div class='add'>+                      [GF_DEFRAG_STATUS_STOPPED] = 3,</div><div class='add'>+                      [GF_DEFRAG_STATUS_COMPLETE] = 4,</div><div class='add'>+                      [GF_DEFRAG_STATUS_NOT_STARTED] = 5};</div><div class='add'>+        if (rank[status_rcd] &lt;= rank[overall_status])</div><div class='add'>+            overall_status = status_rcd;</div><div class='add'>+</div><div class='add'>+        /* &lt;/node&gt; */</div><div class='add'>+        ret = xmlTextWriterEndElement(writer);</div><div class='add'>+        XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Aggregate status */</div><div class='add'>+    /* &lt;aggregate&gt; */</div><div class='add'>+    ret = xmlTextWriterStartElement(writer, (xmlChar *)"aggregate");</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"files",</div><div class='add'>+                                          "%" PRIu64, total_files);</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"size", "%" PRIu64,</div><div class='add'>+                                          total_size);</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"lookups",</div><div class='add'>+                                          "%" PRIu64, total_lookups);</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"failures",</div><div class='add'>+                                          "%" PRIu64, total_failures);</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"skipped",</div><div class='add'>+                                          "%" PRIu64, total_skipped);</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    if (overall_status == -1) {</div><div class='add'>+        overall_status = status_rcd;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"status", "%d",</div><div class='add'>+                                          overall_status);</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    ret = xmlTextWriterWriteFormatElement(</div><div class='add'>+        writer, (xmlChar *)"statusStr", "%s",</div><div class='add'>+        cli_vol_task_status_str[overall_status]);</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"runtime", "%.2f",</div><div class='add'>+                                          overall_elapsed);</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    /* &lt;/aggregate&gt; */</div><div class='add'>+    ret = xmlTextWriterEndElement(writer);</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    gf_log("cli", GF_LOG_DEBUG, "Returning %d", ret);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+cli_xml_output_vol_rebalance(gf_cli_defrag_type op, dict_t *dict, int op_ret,</div><div class='add'>+                             int op_errno, char *op_errstr)</div><div class='add'>+{</div><div class='add'>+#if (HAVE_LIB_XML)</div><div class='add'>+    int ret = -1;</div><div class='add'>+    xmlTextWriterPtr writer = NULL;</div><div class='add'>+    xmlDocPtr doc = NULL;</div><div class='add'>+    char *task_id_str = NULL;</div><div class='add'>+</div><div class='add'>+    ret = cli_begin_xml_output(&amp;writer, &amp;doc);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    ret = cli_xml_output_common(writer, op_ret, op_errno, op_errstr);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    /* &lt;volRebalance&gt; */</div><div class='add'>+    ret = xmlTextWriterStartElement(writer, (xmlChar *)"volRebalance");</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    ret = dict_get_str(dict, GF_REBALANCE_TID_KEY, &amp;task_id_str);</div><div class='add'>+    if (ret == 0) {</div><div class='add'>+        ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"task-id",</div><div class='add'>+                                              "%s", task_id_str);</div><div class='add'>+        XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"op", "%d", op);</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    if ((GF_DEFRAG_CMD_STOP == op) || (GF_DEFRAG_CMD_STATUS == op)) {</div><div class='add'>+        ret = cli_xml_output_vol_rebalance_status(writer, dict,</div><div class='add'>+                                                  GF_TASK_TYPE_REBALANCE);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* &lt;/volRebalance&gt; */</div><div class='add'>+    ret = xmlTextWriterEndElement(writer);</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    ret = cli_end_xml_output(writer, doc);</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    gf_log("cli", GF_LOG_DEBUG, "Returning %d", ret);</div><div class='add'>+    return ret;</div><div class='add'>+#else</div><div class='add'>+    return 0;</div><div class='add'>+#endif</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+cli_xml_output_vol_remove_brick(gf_boolean_t status_op, dict_t *dict,</div><div class='add'>+                                int op_ret, int op_errno, char *op_errstr,</div><div class='add'>+                                const char *op)</div><div class='add'>+{</div><div class='add'>+#if (HAVE_LIB_XML)</div><div class='add'>+    int ret = -1;</div><div class='add'>+    xmlTextWriterPtr writer = NULL;</div><div class='add'>+    xmlDocPtr doc = NULL;</div><div class='add'>+    char *task_id_str = NULL;</div><div class='add'>+</div><div class='add'>+    ret = cli_begin_xml_output(&amp;writer, &amp;doc);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    ret = cli_xml_output_common(writer, op_ret, op_errno, op_errstr);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    ret = xmlTextWriterStartElement(writer, (xmlChar *)op);</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    ret = dict_get_str(dict, GF_REMOVE_BRICK_TID_KEY, &amp;task_id_str);</div><div class='add'>+    if (ret == 0) {</div><div class='add'>+        ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"task-id",</div><div class='add'>+                                              "%s", task_id_str);</div><div class='add'>+        XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (status_op) {</div><div class='add'>+        ret = cli_xml_output_vol_rebalance_status(writer, dict,</div><div class='add'>+                                                  GF_TASK_TYPE_REMOVE_BRICK);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = xmlTextWriterEndElement(writer);</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    ret = cli_end_xml_output(writer, doc);</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    gf_log("cli", GF_LOG_DEBUG, "Returning %d", ret);</div><div class='add'>+    return ret;</div><div class='add'>+#else</div><div class='add'>+    return 0;</div><div class='add'>+#endif</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+cli_xml_output_vol_replace_brick(dict_t *dict, int op_ret, int op_errno,</div><div class='add'>+                                 char *op_errstr)</div><div class='add'>+{</div><div class='add'>+#if (HAVE_LIB_XML)</div><div class='add'>+    int ret = -1;</div><div class='add'>+    xmlTextWriterPtr writer = NULL;</div><div class='add'>+    xmlDocPtr doc = NULL;</div><div class='add'>+</div><div class='add'>+    ret = cli_begin_xml_output(&amp;writer, &amp;doc);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    ret = cli_xml_output_common(writer, op_ret, op_errno, op_errstr);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    ret = cli_end_xml_output(writer, doc);</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    gf_log("cli", GF_LOG_DEBUG, "Returning %d", ret);</div><div class='add'>+    return ret;</div><div class='add'>+#else</div><div class='add'>+    return 0;</div><div class='add'>+#endif</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+cli_xml_output_vol_create(dict_t *dict, int op_ret, int op_errno,</div><div class='add'>+                          char *op_errstr)</div><div class='add'>+{</div><div class='add'>+#if (HAVE_LIB_XML)</div><div class='add'>+    int ret = -1;</div><div class='add'>+    xmlTextWriterPtr writer = NULL;</div><div class='add'>+    xmlDocPtr doc = NULL;</div><div class='add'>+    char *volname = NULL;</div><div class='add'>+    char *volid = NULL;</div><div class='add'>+</div><div class='add'>+    ret = cli_begin_xml_output(&amp;writer, &amp;doc);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    ret = cli_xml_output_common(writer, op_ret, op_errno, op_errstr);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    if (dict) {</div><div class='add'>+        /* &lt;volCreate&gt; */</div><div class='add'>+        ret = xmlTextWriterStartElement(writer, (xmlChar *)"volCreate");</div><div class='add'>+        XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+        /* &lt;volume&gt; */</div><div class='add'>+        ret = xmlTextWriterStartElement(writer, (xmlChar *)"volume");</div><div class='add'>+        XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+        ret = dict_get_str(dict, "volname", &amp;volname);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+        ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"name", "%s",</div><div class='add'>+                                              volname);</div><div class='add'>+        XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+        ret = dict_get_str(dict, "volume-id", &amp;volid);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+        ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"id", "%s",</div><div class='add'>+                                              volid);</div><div class='add'>+        XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+        /* &lt;/volume&gt; */</div><div class='add'>+        ret = xmlTextWriterEndElement(writer);</div><div class='add'>+        XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+        /* &lt;/volCreate&gt; */</div><div class='add'>+        ret = xmlTextWriterEndElement(writer);</div><div class='add'>+        XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = cli_end_xml_output(writer, doc);</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    gf_log("cli", GF_LOG_DEBUG, "Returning %d", ret);</div><div class='add'>+    return ret;</div><div class='add'>+#else</div><div class='add'>+    return 0;</div><div class='add'>+#endif</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+cli_xml_output_generic_volume(char *op, dict_t *dict, int op_ret, int op_errno,</div><div class='add'>+                              char *op_errstr)</div><div class='add'>+{</div><div class='add'>+#if (HAVE_LIB_XML)</div><div class='add'>+    int ret = -1;</div><div class='add'>+    xmlTextWriterPtr writer = NULL;</div><div class='add'>+    xmlDocPtr doc = NULL;</div><div class='add'>+    char *volname = NULL;</div><div class='add'>+    char *volid = NULL;</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(op);</div><div class='add'>+</div><div class='add'>+    ret = cli_begin_xml_output(&amp;writer, &amp;doc);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    ret = cli_xml_output_common(writer, op_ret, op_errno, op_errstr);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    if (dict) {</div><div class='add'>+        /* &lt;"op"&gt; */</div><div class='add'>+        ret = xmlTextWriterStartElement(writer, (xmlChar *)op);</div><div class='add'>+        XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+        /* &lt;volume&gt; */</div><div class='add'>+        ret = xmlTextWriterStartElement(writer, (xmlChar *)"volume");</div><div class='add'>+        XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+        ret = dict_get_str(dict, "volname", &amp;volname);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+        ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"name", "%s",</div><div class='add'>+                                              volname);</div><div class='add'>+        XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+        ret = dict_get_str(dict, "vol-id", &amp;volid);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+        ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"id", "%s",</div><div class='add'>+                                              volid);</div><div class='add'>+        XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+        /* &lt;/volume&gt; */</div><div class='add'>+        ret = xmlTextWriterEndElement(writer);</div><div class='add'>+        XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+        /* &lt;/"op"&gt; */</div><div class='add'>+        ret = xmlTextWriterEndElement(writer);</div><div class='add'>+        XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = cli_end_xml_output(writer, doc);</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    gf_log("cli", GF_LOG_DEBUG, "Returning %d", ret);</div><div class='add'>+    return ret;</div><div class='add'>+#else</div><div class='add'>+    return 0;</div><div class='add'>+#endif</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#if (HAVE_LIB_XML)</div><div class='add'>+int</div><div class='add'>+_output_gsync_config(FILE *fp, xmlTextWriterPtr writer, char *op_name)</div><div class='add'>+{</div><div class='add'>+    char resbuf[256 + PATH_MAX] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    char *ptr = NULL;</div><div class='add'>+    char *v = NULL;</div><div class='add'>+    int blen = sizeof(resbuf);</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    for (;;) {</div><div class='add'>+        ptr = fgets(resbuf, blen, fp);</div><div class='add'>+        if (!ptr)</div><div class='add'>+            break;</div><div class='add'>+</div><div class='add'>+        v = resbuf + strlen(resbuf) - 1;</div><div class='add'>+        while (isspace(*v)) {</div><div class='add'>+            /* strip trailing space */</div><div class='add'>+            *v-- = '\0';</div><div class='add'>+        }</div><div class='add'>+        if (v == resbuf) {</div><div class='add'>+            /* skip empty line */</div><div class='add'>+            continue;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        if (op_name != NULL) {</div><div class='add'>+            ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)op_name,</div><div class='add'>+                                                  "%s", resbuf);</div><div class='add'>+            XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        v = strchr(resbuf, ':');</div><div class='add'>+        if (!v) {</div><div class='add'>+            ret = -1;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+        *v++ = '\0';</div><div class='add'>+        while (isspace(*v))</div><div class='add'>+            v++;</div><div class='add'>+        v = gf_strdup(v);</div><div class='add'>+        if (!v) {</div><div class='add'>+            ret = -1;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)resbuf, "%s",</div><div class='add'>+                                              v);</div><div class='add'>+        XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+    }</div><div class='add'>+out:</div><div class='add'>+    gf_log("cli", GF_LOG_DEBUG, "Returning %d", ret);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#if (HAVE_LIB_XML)</div><div class='add'>+int</div><div class='add'>+get_gsync_config(runner_t *runner,</div><div class='add'>+                 int (*op_conf)(FILE *fp, xmlTextWriterPtr writer,</div><div class='add'>+                                char *op_name),</div><div class='add'>+                 xmlTextWriterPtr writer, char *op_name)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    runner_redir(runner, STDOUT_FILENO, RUN_PIPE);</div><div class='add'>+    if (runner_start(runner) != 0) {</div><div class='add'>+        gf_log("cli", GF_LOG_ERROR, "spawning child failed");</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = op_conf(runner_chio(runner, STDOUT_FILENO), writer, op_name);</div><div class='add'>+</div><div class='add'>+    ret |= runner_end(runner);</div><div class='add'>+    if (ret)</div><div class='add'>+        gf_log("cli", GF_LOG_ERROR, "reading data from child failed");</div><div class='add'>+</div><div class='add'>+    return ret ? -1 : 0;</div><div class='add'>+}</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#if (HAVE_LIB_XML)</div><div class='add'>+int</div><div class='add'>+cli_xml_generate_gsync_config(dict_t *dict, xmlTextWriterPtr writer)</div><div class='add'>+{</div><div class='add'>+    runner_t runner = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    char *subop = NULL;</div><div class='add'>+    char *gwd = NULL;</div><div class='add'>+    char *slave = NULL;</div><div class='add'>+    char *confpath = NULL;</div><div class='add'>+    char *master = NULL;</div><div class='add'>+    char *op_name = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    char conf_path[PATH_MAX] = "";</div><div class='add'>+</div><div class='add'>+    if (dict_get_str(dict, "subop", &amp;subop) != 0) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (strcmp(subop, "get") != 0 &amp;&amp; strcmp(subop, "get-all") != 0) {</div><div class='add'>+        ret = xmlTextWriterWriteFormatElement(</div><div class='add'>+            writer, (xmlChar *)"message", "%s",</div><div class='add'>+            GEOREP " config updated successfully");</div><div class='add'>+        XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+        ret = 0;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (dict_get_str(dict, "glusterd_workdir", &amp;gwd) != 0 ||</div><div class='add'>+        dict_get_str(dict, "slave", &amp;slave) != 0) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (dict_get_str(dict, "master", &amp;master) != 0)</div><div class='add'>+        master = NULL;</div><div class='add'>+</div><div class='add'>+    if (dict_get_str(dict, "op_name", &amp;op_name) != 0)</div><div class='add'>+        op_name = NULL;</div><div class='add'>+</div><div class='add'>+    ret = dict_get_str(dict, "conf_path", &amp;confpath);</div><div class='add'>+    if (!confpath) {</div><div class='add'>+        ret = snprintf(conf_path, sizeof(conf_path) - 1,</div><div class='add'>+                       "%s/" GEOREP "/gsyncd_template.conf", gwd);</div><div class='add'>+        conf_path[ret] = '\0';</div><div class='add'>+        confpath = conf_path;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    runinit(&amp;runner);</div><div class='add'>+    runner_add_args(&amp;runner, GSYNCD_PREFIX "/gsyncd", "-c", NULL);</div><div class='add'>+    runner_argprintf(&amp;runner, "%s", confpath);</div><div class='add'>+    runner_argprintf(&amp;runner, "--iprefix=%s", DATADIR);</div><div class='add'>+</div><div class='add'>+    if (master)</div><div class='add'>+        runner_argprintf(&amp;runner, ":%s", master);</div><div class='add'>+</div><div class='add'>+    runner_add_arg(&amp;runner, slave);</div><div class='add'>+    runner_argprintf(&amp;runner, "--config-%s", subop);</div><div class='add'>+</div><div class='add'>+    if (op_name)</div><div class='add'>+        runner_add_arg(&amp;runner, op_name);</div><div class='add'>+</div><div class='add'>+    ret = get_gsync_config(&amp;runner, _output_gsync_config, writer, op_name);</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    gf_log("cli", GF_LOG_DEBUG, "Returning %d", ret);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#if (HAVE_LIB_XML)</div><div class='add'>+int</div><div class='add'>+cli_xml_output_vol_gsync_status(dict_t *dict, xmlTextWriterPtr writer)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int i = 1;</div><div class='add'>+    int j = 0;</div><div class='add'>+    int count = 0;</div><div class='add'>+    const int number_of_fields = 20;</div><div class='add'>+    int closed = 1;</div><div class='add'>+    int session_closed = 1;</div><div class='add'>+    gf_gsync_status_t **status_values = NULL;</div><div class='add'>+    char status_value_name[PATH_MAX] = "";</div><div class='add'>+    char *tmp = NULL;</div><div class='add'>+    char *volume = NULL;</div><div class='add'>+    char *volume_next = NULL;</div><div class='add'>+    char *slave = NULL;</div><div class='add'>+    char *slave_next = NULL;</div><div class='add'>+    static const char *title_values[] = {</div><div class='add'>+        "master_node", "", "master_brick", "slave_user", "slave", "slave_node",</div><div class='add'>+        "status", "crawl_status",</div><div class='add'>+        /* last_synced */</div><div class='add'>+        "", "entry", "data", "meta", "failures",</div><div class='add'>+        /* checkpoint_time */</div><div class='add'>+        "", "checkpoint_completed",</div><div class='add'>+        /* checkpoint_completion_time */</div><div class='add'>+        "", "master_node_uuid",</div><div class='add'>+        /* last_synced_utc */</div><div class='add'>+        "last_synced",</div><div class='add'>+        /* checkpoint_time_utc */</div><div class='add'>+        "checkpoint_time",</div><div class='add'>+        /* checkpoint_completion_time_utc */</div><div class='add'>+        "checkpoint_completion_time"};</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(dict);</div><div class='add'>+</div><div class='add'>+    ret = dict_get_int32(dict, "gsync-count", &amp;count);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    status_values = GF_MALLOC(count * sizeof(gf_gsync_status_t *),</div><div class='add'>+                              gf_common_mt_char);</div><div class='add'>+    if (!status_values) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; count; i++) {</div><div class='add'>+        status_values[i] = GF_CALLOC(1, sizeof(gf_gsync_status_t),</div><div class='add'>+                                     gf_common_mt_char);</div><div class='add'>+        if (!status_values[i]) {</div><div class='add'>+            ret = -1;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        snprintf(status_value_name, sizeof(status_value_name), "status_value%d",</div><div class='add'>+                 i);</div><div class='add'>+</div><div class='add'>+        ret = dict_get_bin(dict, status_value_name,</div><div class='add'>+                           (void **)&amp;(status_values[i]));</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_log("cli", GF_LOG_ERROR, "struct member empty.");</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    qsort(status_values, count, sizeof(gf_gsync_status_t *),</div><div class='add'>+          gf_gsync_status_t_comparator);</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; count; i++) {</div><div class='add'>+        if (closed) {</div><div class='add'>+            ret = xmlTextWriterStartElement(writer, (xmlChar *)"volume");</div><div class='add'>+            XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+            tmp = get_struct_variable(1, status_values[i]);</div><div class='add'>+            if (!tmp) {</div><div class='add'>+                gf_log("cli", GF_LOG_ERROR, "struct member empty.");</div><div class='add'>+                ret = -1;</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"name",</div><div class='add'>+                                                  "%s", tmp);</div><div class='add'>+            XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+            ret = xmlTextWriterStartElement(writer, (xmlChar *)"sessions");</div><div class='add'>+            XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+            closed = 0;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        if (session_closed) {</div><div class='add'>+            ret = xmlTextWriterStartElement(writer, (xmlChar *)"session");</div><div class='add'>+            XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+            session_closed = 0;</div><div class='add'>+</div><div class='add'>+            tmp = get_struct_variable(21, status_values[i]);</div><div class='add'>+            if (!tmp) {</div><div class='add'>+                gf_log("cli", GF_LOG_ERROR, "struct member empty.");</div><div class='add'>+                ret = -1;</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            ret = xmlTextWriterWriteFormatElement(</div><div class='add'>+                writer, (xmlChar *)"session_slave", "%s", tmp);</div><div class='add'>+            XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        ret = xmlTextWriterStartElement(writer, (xmlChar *)"pair");</div><div class='add'>+        XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+        for (j = 0; j &lt; number_of_fields; j++) {</div><div class='add'>+            /* XML ignore fields */</div><div class='add'>+            if (strcmp(title_values[j], "") == 0)</div><div class='add'>+                continue;</div><div class='add'>+</div><div class='add'>+            tmp = get_struct_variable(j, status_values[i]);</div><div class='add'>+            if (!tmp) {</div><div class='add'>+                gf_log("cli", GF_LOG_ERROR, "struct member empty.");</div><div class='add'>+                ret = -1;</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            ret = xmlTextWriterWriteFormatElement(</div><div class='add'>+                writer, (xmlChar *)title_values[j], "%s", tmp);</div><div class='add'>+            XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        ret = xmlTextWriterEndElement(writer);</div><div class='add'>+        XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+        if (i + 1 &lt; count) {</div><div class='add'>+            slave = get_struct_variable(20, status_values[i]);</div><div class='add'>+            slave_next = get_struct_variable(20, status_values[i + 1]);</div><div class='add'>+            volume = get_struct_variable(1, status_values[i]);</div><div class='add'>+            volume_next = get_struct_variable(1, status_values[i + 1]);</div><div class='add'>+            if (!slave || !slave_next || !volume || !volume_next) {</div><div class='add'>+                gf_log("cli", GF_LOG_ERROR, "struct member empty.");</div><div class='add'>+                ret = -1;</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            if (strcmp(volume, volume_next) != 0) {</div><div class='add'>+                closed = 1;</div><div class='add'>+                session_closed = 1;</div><div class='add'>+</div><div class='add'>+                ret = xmlTextWriterEndElement(writer);</div><div class='add'>+                XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+                ret = xmlTextWriterEndElement(writer);</div><div class='add'>+                XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+                ret = xmlTextWriterEndElement(writer);</div><div class='add'>+                XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+            } else if (strcmp(slave, slave_next) != 0) {</div><div class='add'>+                session_closed = 1;</div><div class='add'>+</div><div class='add'>+                ret = xmlTextWriterEndElement(writer);</div><div class='add'>+                XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+            }</div><div class='add'>+        } else {</div><div class='add'>+            ret = xmlTextWriterEndElement(writer);</div><div class='add'>+            XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+            ret = xmlTextWriterEndElement(writer);</div><div class='add'>+            XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+            ret = xmlTextWriterEndElement(writer);</div><div class='add'>+            XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+out:</div><div class='add'>+    if (status_values)</div><div class='add'>+        GF_FREE(status_values);</div><div class='add'>+    gf_log("cli", GF_LOG_DEBUG, "Returning %d", ret);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+cli_xml_output_vol_gsync(dict_t *dict, int op_ret, int op_errno,</div><div class='add'>+                         char *op_errstr)</div><div class='add'>+{</div><div class='add'>+#if (HAVE_LIB_XML)</div><div class='add'>+    int ret = -1;</div><div class='add'>+    xmlTextWriterPtr writer = NULL;</div><div class='add'>+    xmlDocPtr doc = NULL;</div><div class='add'>+    char *master = NULL;</div><div class='add'>+    char *slave = NULL;</div><div class='add'>+    int type = 0;</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(dict);</div><div class='add'>+</div><div class='add'>+    ret = cli_begin_xml_output(&amp;writer, &amp;doc);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    ret = cli_xml_output_common(writer, op_ret, op_errno, op_errstr);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    /* &lt;geoRep&gt; */</div><div class='add'>+    ret = xmlTextWriterStartElement(writer, (xmlChar *)"geoRep");</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    ret = dict_get_int32(dict, "type", &amp;type);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log("cli", GF_LOG_ERROR, "Failed to get type");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    switch (type) {</div><div class='add'>+        case GF_GSYNC_OPTION_TYPE_START:</div><div class='add'>+        case GF_GSYNC_OPTION_TYPE_STOP:</div><div class='add'>+        case GF_GSYNC_OPTION_TYPE_PAUSE:</div><div class='add'>+        case GF_GSYNC_OPTION_TYPE_RESUME:</div><div class='add'>+        case GF_GSYNC_OPTION_TYPE_CREATE:</div><div class='add'>+        case GF_GSYNC_OPTION_TYPE_DELETE:</div><div class='add'>+            if (dict_get_str(dict, "master", &amp;master) != 0)</div><div class='add'>+                master = "???";</div><div class='add'>+            if (dict_get_str(dict, "slave", &amp;slave) != 0)</div><div class='add'>+                slave = "???";</div><div class='add'>+</div><div class='add'>+            ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"master",</div><div class='add'>+                                                  "%s", master);</div><div class='add'>+            XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+            ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"slave",</div><div class='add'>+                                                  "%s", slave);</div><div class='add'>+            XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+            break;</div><div class='add'>+</div><div class='add'>+        case GF_GSYNC_OPTION_TYPE_CONFIG:</div><div class='add'>+            if (op_ret == 0) {</div><div class='add'>+                ret = xmlTextWriterStartElement(writer, (xmlChar *)"config");</div><div class='add'>+                XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+                ret = cli_xml_generate_gsync_config(dict, writer);</div><div class='add'>+                if (ret)</div><div class='add'>+                    goto out;</div><div class='add'>+</div><div class='add'>+                ret = xmlTextWriterEndElement(writer);</div><div class='add'>+                XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            break;</div><div class='add'>+        case GF_GSYNC_OPTION_TYPE_STATUS:</div><div class='add'>+            ret = cli_xml_output_vol_gsync_status(dict, writer);</div><div class='add'>+            if (ret) {</div><div class='add'>+                gf_log("cli", GF_LOG_DEBUG, "Failed to get gsync status");</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+            break;</div><div class='add'>+        default:</div><div class='add'>+            ret = 0;</div><div class='add'>+            break;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* &lt;/geoRep&gt; */</div><div class='add'>+    ret = xmlTextWriterEndElement(writer);</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    ret = cli_end_xml_output(writer, doc);</div><div class='add'>+out:</div><div class='add'>+    gf_log("cli", GF_LOG_DEBUG, "Returning %d", ret);</div><div class='add'>+    return ret;</div><div class='add'>+#else</div><div class='add'>+    return 0;</div><div class='add'>+#endif</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#if (HAVE_LIB_XML)</div><div class='add'>+/* This function will generate snapshot create output in xml format.</div><div class='add'>+ *</div><div class='add'>+ * @param writer        xmlTextWriterPtr</div><div class='add'>+ * @param doc           xmlDocPtr</div><div class='add'>+ * @param dict          dict containing create output</div><div class='add'>+ *</div><div class='add'>+ * @return 0 on success and -1 on failure</div><div class='add'>+ */</div><div class='add'>+static int</div><div class='add'>+cli_xml_snapshot_create(xmlTextWriterPtr writer, xmlDocPtr doc, dict_t *dict)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    char *str_value = NULL;</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(writer);</div><div class='add'>+    GF_ASSERT(doc);</div><div class='add'>+    GF_ASSERT(dict);</div><div class='add'>+</div><div class='add'>+    /* &lt;snapCreate&gt; */</div><div class='add'>+    ret = xmlTextWriterStartElement(writer, (xmlChar *)"snapCreate");</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    /* &lt;snapshot&gt; */</div><div class='add'>+    ret = xmlTextWriterStartElement(writer, (xmlChar *)"snapshot");</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    ret = dict_get_str(dict, "snapname", &amp;str_value);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log("cli", GF_LOG_ERROR, "Failed to get snap name");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"name", "%s",</div><div class='add'>+                                          str_value);</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    ret = dict_get_str(dict, "snapuuid", &amp;str_value);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log("cli", GF_LOG_ERROR, "Failed to get snap uuid");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"uuid", "%s",</div><div class='add'>+                                          str_value);</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    /* &lt;/snapshot&gt; */</div><div class='add'>+    ret = xmlTextWriterEndElement(writer);</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    /* &lt;/snapCreate&gt; */</div><div class='add'>+    ret = xmlTextWriterEndElement(writer);</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* This function will generate snapshot clone output in xml format.</div><div class='add'>+ *</div><div class='add'>+ * @param writer        xmlTextWriterPtr</div><div class='add'>+ * @param doc           xmlDocPtr</div><div class='add'>+ * @param dict          dict containing create output</div><div class='add'>+ *</div><div class='add'>+ * @return 0 on success and -1 on failure</div><div class='add'>+ */</div><div class='add'>+static int</div><div class='add'>+cli_xml_snapshot_clone(xmlTextWriterPtr writer, xmlDocPtr doc, dict_t *dict)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    char *str_value = NULL;</div><div class='add'>+</div><div class='add'>+    GF_VALIDATE_OR_GOTO("cli", writer, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("cli", doc, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("cli", dict, out);</div><div class='add'>+</div><div class='add'>+    /* &lt;CloneCreate&gt; */</div><div class='add'>+    ret = xmlTextWriterStartElement(writer, (xmlChar *)"CloneCreate");</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    /* &lt;volume&gt; */</div><div class='add'>+    ret = xmlTextWriterStartElement(writer, (xmlChar *)"volume");</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    ret = dict_get_str(dict, "clonename", &amp;str_value);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log("cli", GF_LOG_ERROR, "Failed to get clone name");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"name", "%s",</div><div class='add'>+                                          str_value);</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    ret = dict_get_str(dict, "snapuuid", &amp;str_value);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log("cli", GF_LOG_ERROR, "Failed to get clone uuid");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"uuid", "%s",</div><div class='add'>+                                          str_value);</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    /* &lt;/volume&gt; */</div><div class='add'>+    ret = xmlTextWriterEndElement(writer);</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    /* &lt;/CloneCreate&gt; */</div><div class='add'>+    ret = xmlTextWriterEndElement(writer);</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* This function will generate snapshot restore output in xml format.</div><div class='add'>+ *</div><div class='add'>+ * @param writer        xmlTextWriterPtr</div><div class='add'>+ * @param doc           xmlDocPtr</div><div class='add'>+ * @param dict          dict containing restore output</div><div class='add'>+ *</div><div class='add'>+ * @return 0 on success and -1 on failure</div><div class='add'>+ */</div><div class='add'>+static int</div><div class='add'>+cli_xml_snapshot_restore(xmlTextWriterPtr writer, xmlDocPtr doc, dict_t *dict)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    char *str_value = NULL;</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(writer);</div><div class='add'>+    GF_ASSERT(doc);</div><div class='add'>+    GF_ASSERT(dict);</div><div class='add'>+</div><div class='add'>+    /* &lt;snapRestore&gt; */</div><div class='add'>+    ret = xmlTextWriterStartElement(writer, (xmlChar *)"snapRestore");</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    /* &lt;volume&gt; */</div><div class='add'>+    ret = xmlTextWriterStartElement(writer, (xmlChar *)"volume");</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    ret = dict_get_str(dict, "volname", &amp;str_value);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log("cli", GF_LOG_ERROR, "Failed to get vol name");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"name", "%s",</div><div class='add'>+                                          str_value);</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    ret = dict_get_str(dict, "volid", &amp;str_value);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log("cli", GF_LOG_ERROR, "Failed to get volume id");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"uuid", "%s",</div><div class='add'>+                                          str_value);</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    /* &lt;/volume&gt; */</div><div class='add'>+    ret = xmlTextWriterEndElement(writer);</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    /* &lt;snapshot&gt; */</div><div class='add'>+    ret = xmlTextWriterStartElement(writer, (xmlChar *)"snapshot");</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    ret = dict_get_str(dict, "snapname", &amp;str_value);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log("cli", GF_LOG_ERROR, "Failed to get snap name");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"name", "%s",</div><div class='add'>+                                          str_value);</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    ret = dict_get_str(dict, "snapuuid", &amp;str_value);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log("cli", GF_LOG_ERROR, "Failed to get snap uuid");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"uuid", "%s",</div><div class='add'>+                                          str_value);</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    /* &lt;/snapshot&gt; */</div><div class='add'>+    ret = xmlTextWriterEndElement(writer);</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    /* &lt;/snapRestore&gt; */</div><div class='add'>+    ret = xmlTextWriterEndElement(writer);</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+out:</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* This function will generate snapshot list output in xml format.</div><div class='add'>+ *</div><div class='add'>+ * @param writer        xmlTextWriterPtr</div><div class='add'>+ * @param doc           xmlDocPtr</div><div class='add'>+ * @param dict          dict containing list output</div><div class='add'>+ *</div><div class='add'>+ * @return 0 on success and -1 on failure</div><div class='add'>+ */</div><div class='add'>+static int</div><div class='add'>+cli_xml_snapshot_list(xmlTextWriterPtr writer, xmlDocPtr doc, dict_t *dict)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int i = 0;</div><div class='add'>+    int snapcount = 0;</div><div class='add'>+    char *str_value = NULL;</div><div class='add'>+    char key[PATH_MAX] = "";</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(writer);</div><div class='add'>+    GF_ASSERT(doc);</div><div class='add'>+    GF_ASSERT(dict);</div><div class='add'>+</div><div class='add'>+    /* &lt;snapList&gt; */</div><div class='add'>+    ret = xmlTextWriterStartElement(writer, (xmlChar *)"snapList");</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    ret = dict_get_int32(dict, "snapcount", &amp;snapcount);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log("cli", GF_LOG_ERROR, "Failed to get snapcount");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"count", "%d",</div><div class='add'>+                                          snapcount);</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    for (i = 1; i &lt;= snapcount; ++i) {</div><div class='add'>+        ret = snprintf(key, sizeof(key), "snapname%d", i);</div><div class='add'>+        if (ret &lt; 0) {</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        ret = dict_get_str(dict, key, &amp;str_value);</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_log("cli", GF_LOG_ERROR, "Could not get %s ", key);</div><div class='add'>+            goto out;</div><div class='add'>+        } else {</div><div class='add'>+            ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"snapshot",</div><div class='add'>+                                                  "%s", str_value);</div><div class='add'>+            XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* &lt;/snapList&gt; */</div><div class='add'>+    ret = xmlTextWriterEndElement(writer);</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+out:</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* This function will generate xml output for origin volume</div><div class='add'>+ * of the given snapshot.</div><div class='add'>+ *</div><div class='add'>+ * @param writer        xmlTextWriterPtr</div><div class='add'>+ * @param doc           xmlDocPtr</div><div class='add'>+ * @param dict          dict containing info output</div><div class='add'>+ * @param keyprefix     prefix for dictionary key</div><div class='add'>+ *</div><div class='add'>+ * @return 0 on success and -1 on failure</div><div class='add'>+ */</div><div class='add'>+static int</div><div class='add'>+cli_xml_snapshot_info_orig_vol(xmlTextWriterPtr writer, xmlDocPtr doc,</div><div class='add'>+                               dict_t *dict, char *keyprefix)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int value = 0;</div><div class='add'>+    char *buffer = NULL;</div><div class='add'>+    char key[PATH_MAX] = "";</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(dict);</div><div class='add'>+    GF_ASSERT(keyprefix);</div><div class='add'>+    GF_ASSERT(writer);</div><div class='add'>+    GF_ASSERT(doc);</div><div class='add'>+</div><div class='add'>+    /* &lt;originVolume&gt; */</div><div class='add'>+    ret = xmlTextWriterStartElement(writer, (xmlChar *)"originVolume");</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    snprintf(key, sizeof(key), "%sorigin-volname", keyprefix);</div><div class='add'>+</div><div class='add'>+    ret = dict_get_str(dict, key, &amp;buffer);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log("cli", GF_LOG_WARNING, "Failed to get %s", key);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"name", "%s",</div><div class='add'>+                                          buffer);</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    snprintf(key, sizeof(key), "%ssnapcount", keyprefix);</div><div class='add'>+</div><div class='add'>+    ret = dict_get_int32(dict, key, &amp;value);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log("cli", GF_LOG_ERROR, "Failed to get %s", key);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"snapCount", "%d",</div><div class='add'>+                                          value);</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    snprintf(key, sizeof(key), "%ssnaps-available", keyprefix);</div><div class='add'>+</div><div class='add'>+    ret = dict_get_int32(dict, key, &amp;value);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log("cli", GF_LOG_ERROR, "Failed to get %s", key);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"snapRemaining",</div><div class='add'>+                                          "%d", value);</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    /* &lt;/originVolume&gt; */</div><div class='add'>+    ret = xmlTextWriterEndElement(writer);</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* This function will generate xml output of snapshot volume info.</div><div class='add'>+ *</div><div class='add'>+ * @param writer        xmlTextWriterPtr</div><div class='add'>+ * @param doc           xmlDocPtr</div><div class='add'>+ * @param dict          dict containing info output</div><div class='add'>+ * @param keyprefix     key prefix for dictionary</div><div class='add'>+ * @param snap_driven   boolean to check if output is based of volume</div><div class='add'>+ *                      or snapshot</div><div class='add'>+ *</div><div class='add'>+ * @return 0 on success and -1 on failure</div><div class='add'>+ */</div><div class='add'>+static int</div><div class='add'>+cli_xml_snapshot_info_snap_vol(xmlTextWriterPtr writer, xmlDocPtr doc,</div><div class='add'>+                               dict_t *dict, char *keyprefix,</div><div class='add'>+                               gf_boolean_t snap_driven)</div><div class='add'>+{</div><div class='add'>+    char key[PATH_MAX] = "";</div><div class='add'>+    char *buffer = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(dict);</div><div class='add'>+    GF_ASSERT(keyprefix);</div><div class='add'>+    GF_ASSERT(writer);</div><div class='add'>+    GF_ASSERT(doc);</div><div class='add'>+</div><div class='add'>+    /* &lt;snapVolume&gt; */</div><div class='add'>+    ret = xmlTextWriterStartElement(writer, (xmlChar *)"snapVolume");</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    ret = snprintf(key, sizeof(key), "%s.volname", keyprefix);</div><div class='add'>+    if (ret &lt; 0)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    ret = dict_get_str(dict, key, &amp;buffer);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log("cli", GF_LOG_ERROR, "Failed to get %s", key);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"name", "%s",</div><div class='add'>+                                          buffer);</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    ret = snprintf(key, sizeof(key), "%s.vol-status", keyprefix);</div><div class='add'>+    if (ret &lt; 0)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    ret = dict_get_str(dict, key, &amp;buffer);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log("cli", GF_LOG_ERROR, "Failed to get %s", key);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"status", "%s",</div><div class='add'>+                                          buffer);</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    /* If the command is snap_driven then we need to show origin volume</div><div class='add'>+     * info. Else this is shown in the start of info display.*/</div><div class='add'>+    if (snap_driven) {</div><div class='add'>+        ret = snprintf(key, sizeof(key), "%s.", keyprefix);</div><div class='add'>+        if (ret &lt; 0)</div><div class='add'>+            goto out;</div><div class='add'>+</div><div class='add'>+        ret = cli_xml_snapshot_info_orig_vol(writer, doc, dict, key);</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_log("cli", GF_LOG_ERROR,</div><div class='add'>+                   "Failed to create "</div><div class='add'>+                   "xml output for snapshot's origin volume");</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* &lt;/snapVolume&gt; */</div><div class='add'>+    ret = xmlTextWriterEndElement(writer);</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* This function will generate snapshot info of individual snapshot</div><div class='add'>+ * in xml format.</div><div class='add'>+ *</div><div class='add'>+ * @param writer        xmlTextWriterPtr</div><div class='add'>+ * @param doc           xmlDocPtr</div><div class='add'>+ * @param dict          dict containing info output</div><div class='add'>+ * @param keyprefix     key prefix for dictionary</div><div class='add'>+ * @param snap_driven   boolean to check if output is based of volume</div><div class='add'>+ *                      or snapshot</div><div class='add'>+ *</div><div class='add'>+ * @return 0 on success and -1 on failure</div><div class='add'>+ */</div><div class='add'>+static int</div><div class='add'>+cli_xml_snapshot_info_per_snap(xmlTextWriterPtr writer, xmlDocPtr doc,</div><div class='add'>+                               dict_t *dict, char *keyprefix,</div><div class='add'>+                               gf_boolean_t snap_driven)</div><div class='add'>+{</div><div class='add'>+    char key_buffer[PATH_MAX] = "";</div><div class='add'>+    char *buffer = NULL;</div><div class='add'>+    int volcount = 0;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int i = 0;</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(dict);</div><div class='add'>+    GF_ASSERT(keyprefix);</div><div class='add'>+    GF_ASSERT(writer);</div><div class='add'>+    GF_ASSERT(doc);</div><div class='add'>+</div><div class='add'>+    /* &lt;snapshot&gt; */</div><div class='add'>+    ret = xmlTextWriterStartElement(writer, (xmlChar *)"snapshot");</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    ret = snprintf(key_buffer, sizeof(key_buffer), "%s.snapname", keyprefix);</div><div class='add'>+    if (ret &lt; 0)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    ret = dict_get_str(dict, key_buffer, &amp;buffer);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log("cli", GF_LOG_ERROR, "Unable to fetch snapname %s ", key_buffer);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"name", "%s",</div><div class='add'>+                                          buffer);</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    ret = snprintf(key_buffer, sizeof(key_buffer), "%s.snap-id", keyprefix);</div><div class='add'>+    if (ret &lt; 0)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    ret = dict_get_str(dict, key_buffer, &amp;buffer);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log("cli", GF_LOG_ERROR, "Unable to fetch snap-id %s ", key_buffer);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"uuid", "%s",</div><div class='add'>+                                          buffer);</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    ret = snprintf(key_buffer, sizeof(key_buffer), "%s.snap-desc", keyprefix);</div><div class='add'>+    if (ret &lt; 0)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    ret = dict_get_str(dict, key_buffer, &amp;buffer);</div><div class='add'>+    if (!ret) {</div><div class='add'>+        ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"description",</div><div class='add'>+                                              "%s", buffer);</div><div class='add'>+    } else {</div><div class='add'>+        ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"description",</div><div class='add'>+                                              "%s", "");</div><div class='add'>+    }</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    ret = snprintf(key_buffer, sizeof(key_buffer), "%s.snap-time", keyprefix);</div><div class='add'>+    if (ret &lt; 0)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    ret = dict_get_str(dict, key_buffer, &amp;buffer);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log("cli", GF_LOG_ERROR, "Unable to fetch snap-time %s ", keyprefix);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"createTime", "%s",</div><div class='add'>+                                          buffer);</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    ret = snprintf(key_buffer, sizeof(key_buffer), "%s.vol-count", keyprefix);</div><div class='add'>+    if (ret &lt; 0)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    ret = dict_get_int32(dict, key_buffer, &amp;volcount);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log("cli", GF_LOG_ERROR, "Fail to get snap vol count");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"volCount", "%d",</div><div class='add'>+                                          volcount);</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    ret = dict_get_int32(dict, key_buffer, &amp;volcount);</div><div class='add'>+    /* Display info of each snapshot volume */</div><div class='add'>+    for (i = 1; i &lt;= volcount; i++) {</div><div class='add'>+        ret = snprintf(key_buffer, sizeof(key_buffer), "%s.vol%d", keyprefix,</div><div class='add'>+                       i);</div><div class='add'>+        if (ret &lt; 0)</div><div class='add'>+            goto out;</div><div class='add'>+</div><div class='add'>+        ret = cli_xml_snapshot_info_snap_vol(writer, doc, dict, key_buffer,</div><div class='add'>+                                             snap_driven);</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_log("cli", GF_LOG_ERROR,</div><div class='add'>+                   "Could not list "</div><div class='add'>+                   "details of volume in a snap");</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* &lt;/snapshot&gt; */</div><div class='add'>+    ret = xmlTextWriterEndElement(writer);</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* This function will generate snapshot info output in xml format.</div><div class='add'>+ *</div><div class='add'>+ * @param writer        xmlTextWriterPtr</div><div class='add'>+ * @param doc           xmlDocPtr</div><div class='add'>+ * @param dict          dict containing info output</div><div class='add'>+ *</div><div class='add'>+ * @return 0 on success and -1 on failure</div><div class='add'>+ */</div><div class='add'>+static int</div><div class='add'>+cli_xml_snapshot_info(xmlTextWriterPtr writer, xmlDocPtr doc, dict_t *dict)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int i = 0;</div><div class='add'>+    int snapcount = 0;</div><div class='add'>+    char key[PATH_MAX] = "";</div><div class='add'>+    gf_boolean_t snap_driven = _gf_false;</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(writer);</div><div class='add'>+    GF_ASSERT(doc);</div><div class='add'>+    GF_ASSERT(dict);</div><div class='add'>+</div><div class='add'>+    /* &lt;snapInfo&gt; */</div><div class='add'>+    ret = xmlTextWriterStartElement(writer, (xmlChar *)"snapInfo");</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    snap_driven = dict_get_str_boolean(dict, "snap-driven", _gf_false);</div><div class='add'>+</div><div class='add'>+    /* If the approach is volume based then we should display origin volume</div><div class='add'>+     * information first followed by per snap info*/</div><div class='add'>+    if (!snap_driven) {</div><div class='add'>+        ret = cli_xml_snapshot_info_orig_vol(writer, doc, dict, "");</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_log("cli", GF_LOG_ERROR,</div><div class='add'>+                   "Failed to create "</div><div class='add'>+                   "xml output for snapshot's origin volume");</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_get_int32(dict, "snapcount", &amp;snapcount);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log("cli", GF_LOG_ERROR, "Failed to get snapcount");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"count", "%d",</div><div class='add'>+                                          snapcount);</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    /* &lt;snapshots&gt; */</div><div class='add'>+    ret = xmlTextWriterStartElement(writer, (xmlChar *)"snapshots");</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    /* Get snapshot info of individual snapshots */</div><div class='add'>+    for (i = 1; i &lt;= snapcount; ++i) {</div><div class='add'>+        snprintf(key, sizeof(key), "snap%d", i);</div><div class='add'>+</div><div class='add'>+        ret = cli_xml_snapshot_info_per_snap(writer, doc, dict, key,</div><div class='add'>+                                             snap_driven);</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_log("cli", GF_LOG_ERROR, "Could not get %s ", key);</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* &lt;/snapshots&gt; */</div><div class='add'>+    ret = xmlTextWriterEndElement(writer);</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    /* &lt;/snapInfo&gt; */</div><div class='add'>+    ret = xmlTextWriterEndElement(writer);</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+out:</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* This function will generate snapshot status of individual</div><div class='add'>+ * snapshot volume in xml format.</div><div class='add'>+ *</div><div class='add'>+ * @param writer        xmlTextWriterPtr</div><div class='add'>+ * @param doc           xmlDocPtr</div><div class='add'>+ * @param dict          dict containing status output</div><div class='add'>+ * @param keyprefix     key prefix for dictionary</div><div class='add'>+ *</div><div class='add'>+ * @return 0 on success and -1 on failure</div><div class='add'>+ */</div><div class='add'>+static int</div><div class='add'>+cli_xml_snapshot_volume_status(xmlTextWriterPtr writer, xmlDocPtr doc,</div><div class='add'>+                               dict_t *dict, const char *keyprefix)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int brickcount = 0;</div><div class='add'>+    int i = 0;</div><div class='add'>+    int pid = 0;</div><div class='add'>+    char *buffer = NULL;</div><div class='add'>+    char key[PATH_MAX] = "";</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(writer);</div><div class='add'>+    GF_ASSERT(doc);</div><div class='add'>+    GF_ASSERT(dict);</div><div class='add'>+    GF_ASSERT(keyprefix);</div><div class='add'>+</div><div class='add'>+    ret = snprintf(key, sizeof(key), "%s.brickcount", keyprefix);</div><div class='add'>+    if (ret &lt; 0)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    ret = dict_get_int32(dict, key, &amp;brickcount);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log("cli", GF_LOG_ERROR, "Failed to fetch brickcount");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"brickCount", "%d",</div><div class='add'>+                                          brickcount);</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    /* Get status of every brick belonging to the snapshot volume */</div><div class='add'>+    for (i = 0; i &lt; brickcount; i++) {</div><div class='add'>+        /* &lt;snapInfo&gt; */</div><div class='add'>+        ret = xmlTextWriterStartElement(writer, (xmlChar *)"brick");</div><div class='add'>+        XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+        ret = snprintf(key, sizeof(key), "%s.brick%d.path", keyprefix, i);</div><div class='add'>+        if (ret &lt; 0)</div><div class='add'>+            goto out;</div><div class='add'>+</div><div class='add'>+        ret = dict_get_str(dict, key, &amp;buffer);</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_log("cli", GF_LOG_ERROR, "Unable to get Brick Path");</div><div class='add'>+            /*</div><div class='add'>+             * If path itself is not present, then end *</div><div class='add'>+             * this brick's status and continue to the *</div><div class='add'>+             * brick                                   *</div><div class='add'>+             */</div><div class='add'>+            ret = xmlTextWriterEndElement(writer);</div><div class='add'>+            XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+            continue;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"path", "%s",</div><div class='add'>+                                              buffer);</div><div class='add'>+        XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+        ret = snprintf(key, sizeof(key), "%s.brick%d.vgname", keyprefix, i);</div><div class='add'>+        if (ret &lt; 0)</div><div class='add'>+            goto out;</div><div class='add'>+</div><div class='add'>+        ret = dict_get_str(dict, key, &amp;buffer);</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_log("cli", GF_LOG_ERROR, "Unable to get Volume Group");</div><div class='add'>+            ret = xmlTextWriterWriteFormatElement(</div><div class='add'>+                writer, (xmlChar *)"volumeGroup", "N/A");</div><div class='add'>+        } else</div><div class='add'>+            ret = xmlTextWriterWriteFormatElement(</div><div class='add'>+                writer, (xmlChar *)"volumeGroup", "%s", buffer);</div><div class='add'>+</div><div class='add'>+        XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+        ret = snprintf(key, sizeof(key), "%s.brick%d.status", keyprefix, i);</div><div class='add'>+        if (ret &lt; 0)</div><div class='add'>+            goto out;</div><div class='add'>+</div><div class='add'>+        ret = dict_get_str(dict, key, &amp;buffer);</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_log("cli", GF_LOG_INFO, "Unable to get Brick Running");</div><div class='add'>+            ret = xmlTextWriterWriteFormatElement(</div><div class='add'>+                writer, (xmlChar *)"brick_running", "N/A");</div><div class='add'>+        } else</div><div class='add'>+            ret = xmlTextWriterWriteFormatElement(</div><div class='add'>+                writer, (xmlChar *)"brick_running", "%s", buffer);</div><div class='add'>+</div><div class='add'>+        XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+        ret = snprintf(key, sizeof(key), "%s.brick%d.pid", keyprefix, i);</div><div class='add'>+        if (ret &lt; 0)</div><div class='add'>+            goto out;</div><div class='add'>+</div><div class='add'>+        ret = dict_get_int32(dict, key, &amp;pid);</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_log("cli", GF_LOG_INFO, "Unable to get pid");</div><div class='add'>+            ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"pid",</div><div class='add'>+                                                  "N/A");</div><div class='add'>+        } else</div><div class='add'>+            ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"pid",</div><div class='add'>+                                                  "%d", pid);</div><div class='add'>+</div><div class='add'>+        XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+        ret = snprintf(key, sizeof(key), "%s.brick%d.data", keyprefix, i);</div><div class='add'>+        if (ret &lt; 0)</div><div class='add'>+            goto out;</div><div class='add'>+</div><div class='add'>+        ret = dict_get_str(dict, key, &amp;buffer);</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_log("cli", GF_LOG_ERROR, "Unable to get Data Percent");</div><div class='add'>+            ret = xmlTextWriterWriteFormatElement(</div><div class='add'>+                writer, (xmlChar *)"data_percentage", "N/A");</div><div class='add'>+        } else</div><div class='add'>+            ret = xmlTextWriterWriteFormatElement(</div><div class='add'>+                writer, (xmlChar *)"data_percentage", "%s", buffer);</div><div class='add'>+</div><div class='add'>+        XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+        ret = snprintf(key, sizeof(key), "%s.brick%d.lvsize", keyprefix, i);</div><div class='add'>+        if (ret &lt; 0)</div><div class='add'>+            goto out;</div><div class='add'>+</div><div class='add'>+        ret = dict_get_str(dict, key, &amp;buffer);</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_log("cli", GF_LOG_ERROR, "Unable to get LV Size");</div><div class='add'>+            ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"lvSize",</div><div class='add'>+                                                  "N/A");</div><div class='add'>+        } else {</div><div class='add'>+            /* Truncate any newline character */</div><div class='add'>+            buffer = strtok(buffer, "\n");</div><div class='add'>+</div><div class='add'>+            ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"lvSize",</div><div class='add'>+                                                  "%s", buffer);</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+        /* &lt;/brick&gt; */</div><div class='add'>+        ret = xmlTextWriterEndElement(writer);</div><div class='add'>+        XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* This function will generate snapshot status of individual</div><div class='add'>+ * snapshot in xml format.</div><div class='add'>+ *</div><div class='add'>+ * @param writer        xmlTextWriterPtr</div><div class='add'>+ * @param doc           xmlDocPtr</div><div class='add'>+ * @param dict          dict containing status output</div><div class='add'>+ *</div><div class='add'>+ * @return 0 on success and -1 on failure</div><div class='add'>+ */</div><div class='add'>+static int</div><div class='add'>+cli_xml_snapshot_status_per_snap(xmlTextWriterPtr writer, xmlDocPtr doc,</div><div class='add'>+                                 dict_t *dict, const char *keyprefix)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int volcount = 0;</div><div class='add'>+    int i = 0;</div><div class='add'>+    char *buffer = NULL;</div><div class='add'>+    char key[PATH_MAX] = "";</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(writer);</div><div class='add'>+    GF_ASSERT(doc);</div><div class='add'>+    GF_ASSERT(dict);</div><div class='add'>+    GF_ASSERT(keyprefix);</div><div class='add'>+</div><div class='add'>+    ret = xmlTextWriterStartElement(writer, (xmlChar *)"snapshot");</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    snprintf(key, sizeof(key), "%s.snapname", keyprefix);</div><div class='add'>+</div><div class='add'>+    ret = dict_get_str(dict, key, &amp;buffer);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log("cli", GF_LOG_ERROR, "Unable to get snapname");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"name", "%s",</div><div class='add'>+                                          buffer);</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    snprintf(key, sizeof(key), "%s.uuid", keyprefix);</div><div class='add'>+</div><div class='add'>+    ret = dict_get_str(dict, key, &amp;buffer);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log("cli", GF_LOG_ERROR, "Unable to get snap UUID");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"uuid", "%s",</div><div class='add'>+                                          buffer);</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    snprintf(key, sizeof(key), "%s.volcount", keyprefix);</div><div class='add'>+</div><div class='add'>+    ret = dict_get_int32(dict, key, &amp;volcount);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log("cli", GF_LOG_ERROR, "Unable to get volume count");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"volCount", "%d",</div><div class='add'>+                                          volcount);</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    /* Get snapshot status of individual snapshot volume */</div><div class='add'>+    for (i = 0; i &lt; volcount; i++) {</div><div class='add'>+        /* &lt;volume&gt; */</div><div class='add'>+        ret = xmlTextWriterStartElement(writer, (xmlChar *)"volume");</div><div class='add'>+        XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+        snprintf(key, sizeof(key), "%s.vol%d", keyprefix, i);</div><div class='add'>+</div><div class='add'>+        ret = cli_xml_snapshot_volume_status(writer, doc, dict, key);</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_log("cli", GF_LOG_ERROR, "Could not get snap volume status");</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        /* &lt;/volume&gt; */</div><div class='add'>+        ret = xmlTextWriterEndElement(writer);</div><div class='add'>+        XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* &lt;/snapshot&gt; */</div><div class='add'>+    ret = xmlTextWriterEndElement(writer);</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* This function will generate snapshot status output in xml format.</div><div class='add'>+ *</div><div class='add'>+ * @param writer        xmlTextWriterPtr</div><div class='add'>+ * @param doc           xmlDocPtr</div><div class='add'>+ * @param dict          dict containing status output</div><div class='add'>+ *</div><div class='add'>+ * @return 0 on success and -1 on failure</div><div class='add'>+ */</div><div class='add'>+static int</div><div class='add'>+cli_xml_snapshot_status(xmlTextWriterPtr writer, xmlDocPtr doc, dict_t *dict)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int snapcount = 0;</div><div class='add'>+    int i = 0;</div><div class='add'>+    int status_cmd = 0;</div><div class='add'>+    char key[PATH_MAX] = "";</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(writer);</div><div class='add'>+    GF_ASSERT(doc);</div><div class='add'>+    GF_ASSERT(dict);</div><div class='add'>+</div><div class='add'>+    /* &lt;snapStatus&gt; */</div><div class='add'>+    ret = xmlTextWriterStartElement(writer, (xmlChar *)"snapStatus");</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    ret = dict_get_int32(dict, "sub-cmd", &amp;status_cmd);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log("cli", GF_LOG_ERROR, "Could not fetch status type");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if ((GF_SNAP_STATUS_TYPE_SNAP == status_cmd) ||</div><div class='add'>+        (GF_SNAP_STATUS_TYPE_ITER == status_cmd)) {</div><div class='add'>+        snapcount = 1;</div><div class='add'>+    } else {</div><div class='add'>+        ret = dict_get_int32(dict, "status.snapcount", &amp;snapcount);</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_log("cli", GF_LOG_ERROR, "Could not get snapcount");</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"count", "%d",</div><div class='add'>+                                              snapcount);</div><div class='add'>+        XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; snapcount; i++) {</div><div class='add'>+        snprintf(key, sizeof(key), "status.snap%d", i);</div><div class='add'>+</div><div class='add'>+        ret = cli_xml_snapshot_status_per_snap(writer, doc, dict, key);</div><div class='add'>+        if (ret &lt; 0) {</div><div class='add'>+            gf_log("cli", GF_LOG_ERROR,</div><div class='add'>+                   "failed to create xml "</div><div class='add'>+                   "output for snapshot status");</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* &lt;/snapStatus&gt; */</div><div class='add'>+    ret = xmlTextWriterEndElement(writer);</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+out:</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* This function will generate snapshot config show output in xml format.</div><div class='add'>+ *</div><div class='add'>+ * @param writer        xmlTextWriterPtr</div><div class='add'>+ * @param doc           xmlDocPtr</div><div class='add'>+ * @param dict          dict containing status output</div><div class='add'>+ *</div><div class='add'>+ * @return 0 on success and -1 on failure</div><div class='add'>+ */</div><div class='add'>+static int</div><div class='add'>+cli_xml_snapshot_config_show(xmlTextWriterPtr writer, xmlDocPtr doc,</div><div class='add'>+                             dict_t *dict)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    uint64_t i = 0;</div><div class='add'>+    uint64_t value = 0;</div><div class='add'>+    uint64_t volcount = 0;</div><div class='add'>+    char buf[PATH_MAX] = "";</div><div class='add'>+    char *str_value = NULL;</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(writer);</div><div class='add'>+    GF_ASSERT(doc);</div><div class='add'>+    GF_ASSERT(dict);</div><div class='add'>+</div><div class='add'>+    /* &lt;systemConfig&gt; */</div><div class='add'>+    ret = xmlTextWriterStartElement(writer, (xmlChar *)"systemConfig");</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    ret = dict_get_uint64(dict, "snap-max-hard-limit", &amp;value);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log("cli", GF_LOG_ERROR,</div><div class='add'>+               "Failed to get "</div><div class='add'>+               "snap-max-hard-limit");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"hardLimit",</div><div class='add'>+                                          "%" PRIu64, value);</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    ret = dict_get_uint64(dict, "snap-max-soft-limit", &amp;value);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log("cli", GF_LOG_ERROR,</div><div class='add'>+               "Failed to get "</div><div class='add'>+               "snap-max-soft-limit");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"softLimit",</div><div class='add'>+                                          "%" PRIu64 "%%", value);</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    ret = dict_get_str(dict, "auto-delete", &amp;str_value);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log("cli", GF_LOG_ERROR, "Could not fetch auto-delete");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"autoDelete", "%s",</div><div class='add'>+                                          str_value);</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    ret = dict_get_str(dict, "snap-activate-on-create", &amp;str_value);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log("cli", GF_LOG_ERROR,</div><div class='add'>+               "Could not fetch snap-activate-on-create-delete");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"activateOnCreate",</div><div class='add'>+                                          "%s", str_value);</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    /* &lt;/systemConfig&gt; */</div><div class='add'>+    ret = xmlTextWriterEndElement(writer);</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    /* &lt;volumeConfig&gt; */</div><div class='add'>+    ret = xmlTextWriterStartElement(writer, (xmlChar *)"volumeConfig");</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    ret = dict_get_uint64(dict, "voldisplaycount", &amp;volcount);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log("cli", GF_LOG_ERROR, "Could not fetch volcount");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Get config of all the volumes */</div><div class='add'>+    for (i = 0; i &lt; volcount; i++) {</div><div class='add'>+        /* &lt;volume&gt; */</div><div class='add'>+        ret = xmlTextWriterStartElement(writer, (xmlChar *)"volume");</div><div class='add'>+        XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+        snprintf(buf, sizeof(buf), "volume%" PRIu64 "-volname", i);</div><div class='add'>+        ret = dict_get_str(dict, buf, &amp;str_value);</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_log("cli", GF_LOG_ERROR, "Could not fetch %s", buf);</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"name", "%s",</div><div class='add'>+                                              str_value);</div><div class='add'>+        XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+        snprintf(buf, sizeof(buf), "volume%" PRIu64 "-snap-max-hard-limit", i);</div><div class='add'>+        ret = dict_get_uint64(dict, buf, &amp;value);</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_log("cli", GF_LOG_ERROR, "Could not fetch %s", buf);</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"hardLimit",</div><div class='add'>+                                              "%" PRIu64, value);</div><div class='add'>+        XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+        snprintf(buf, sizeof(buf), "volume%" PRIu64 "-active-hard-limit", i);</div><div class='add'>+        ret = dict_get_uint64(dict, buf, &amp;value);</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_log("cli", GF_LOG_ERROR,</div><div class='add'>+                   "Could not fetch"</div><div class='add'>+                   " effective snap_max_hard_limit for "</div><div class='add'>+                   "%s",</div><div class='add'>+                   str_value);</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        ret = xmlTextWriterWriteFormatElement(</div><div class='add'>+            writer, (xmlChar *)"effectiveHardLimit", "%" PRIu64, value);</div><div class='add'>+        XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+        snprintf(buf, sizeof(buf), "volume%" PRIu64 "-snap-max-soft-limit", i);</div><div class='add'>+        ret = dict_get_uint64(dict, buf, &amp;value);</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_log("cli", GF_LOG_ERROR, "Could not fetch %s", buf);</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"softLimit",</div><div class='add'>+                                              "%" PRIu64, value);</div><div class='add'>+        XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+        /* &lt;/volume&gt; */</div><div class='add'>+        ret = xmlTextWriterEndElement(writer);</div><div class='add'>+        XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* &lt;/volume&gt; */</div><div class='add'>+    ret = xmlTextWriterEndElement(writer);</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* This function will generate snapshot config set output in xml format.</div><div class='add'>+ *</div><div class='add'>+ * @param writer        xmlTextWriterPtr</div><div class='add'>+ * @param doc           xmlDocPtr</div><div class='add'>+ * @param dict          dict containing status output</div><div class='add'>+ *</div><div class='add'>+ * @return 0 on success and -1 on failure</div><div class='add'>+ */</div><div class='add'>+static int</div><div class='add'>+cli_xml_snapshot_config_set(xmlTextWriterPtr writer, xmlDocPtr doc,</div><div class='add'>+                            dict_t *dict)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    uint64_t hard_limit = 0;</div><div class='add'>+    uint64_t soft_limit = 0;</div><div class='add'>+    char *volname = NULL;</div><div class='add'>+    char *auto_delete = NULL;</div><div class='add'>+    char *snap_activate = NULL;</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(writer);</div><div class='add'>+    GF_ASSERT(doc);</div><div class='add'>+    GF_ASSERT(dict);</div><div class='add'>+</div><div class='add'>+    /* This is optional parameter therefore ignore the error */</div><div class='add'>+    ret = dict_get_uint64(dict, "snap-max-hard-limit", &amp;hard_limit);</div><div class='add'>+    /* This is optional parameter therefore ignore the error */</div><div class='add'>+    ret = dict_get_uint64(dict, "snap-max-soft-limit", &amp;soft_limit);</div><div class='add'>+    ret = dict_get_str(dict, "auto-delete", &amp;auto_delete);</div><div class='add'>+    ret = dict_get_str(dict, "snap-activate-on-create", &amp;snap_activate);</div><div class='add'>+</div><div class='add'>+    if (!hard_limit &amp;&amp; !soft_limit &amp;&amp; !auto_delete &amp;&amp; !snap_activate) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        gf_log("cli", GF_LOG_ERROR,</div><div class='add'>+               "At least one option from "</div><div class='add'>+               "snap-max-hard-limit, snap-max-soft-limit, auto-delete"</div><div class='add'>+               " and snap-activate-on-create should be set");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Ignore the error, as volname is optional */</div><div class='add'>+    ret = dict_get_str(dict, "volname", &amp;volname);</div><div class='add'>+</div><div class='add'>+    if (NULL == volname) {</div><div class='add'>+        /* &lt;systemConfig&gt; */</div><div class='add'>+        ret = xmlTextWriterStartElement(writer, (xmlChar *)"systemConfig");</div><div class='add'>+    } else {</div><div class='add'>+        /* &lt;volumeConfig&gt; */</div><div class='add'>+        ret = xmlTextWriterStartElement(writer, (xmlChar *)"volumeConfig");</div><div class='add'>+        XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+        ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"name", "%s",</div><div class='add'>+                                              volname);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    if (hard_limit) {</div><div class='add'>+        ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"newHardLimit",</div><div class='add'>+                                              "%" PRIu64, hard_limit);</div><div class='add'>+        XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (soft_limit) {</div><div class='add'>+        ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"newSoftLimit",</div><div class='add'>+                                              "%" PRIu64, soft_limit);</div><div class='add'>+        XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (auto_delete) {</div><div class='add'>+        ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"autoDelete",</div><div class='add'>+                                              "%s", auto_delete);</div><div class='add'>+        XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (snap_activate) {</div><div class='add'>+        ret = xmlTextWriterWriteFormatElement(</div><div class='add'>+            writer, (xmlChar *)"activateOnCreate", "%s", snap_activate);</div><div class='add'>+        XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* &lt;/volumeConfig&gt; or &lt;/systemConfig&gt; */</div><div class='add'>+    ret = xmlTextWriterEndElement(writer);</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* This function will generate snapshot config output in xml format.</div><div class='add'>+ *</div><div class='add'>+ * @param writer        xmlTextWriterPtr</div><div class='add'>+ * @param doc           xmlDocPtr</div><div class='add'>+ * @param dict          dict containing config output</div><div class='add'>+ *</div><div class='add'>+ * @return 0 on success and -1 on failure</div><div class='add'>+ */</div><div class='add'>+static int</div><div class='add'>+cli_xml_snapshot_config(xmlTextWriterPtr writer, xmlDocPtr doc, dict_t *dict)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int config_command = 0;</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(writer);</div><div class='add'>+    GF_ASSERT(doc);</div><div class='add'>+    GF_ASSERT(dict);</div><div class='add'>+</div><div class='add'>+    /* &lt;snapConfig&gt; */</div><div class='add'>+    ret = xmlTextWriterStartElement(writer, (xmlChar *)"snapConfig");</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    ret = dict_get_int32(dict, "config-command", &amp;config_command);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log("cli", GF_LOG_ERROR, "Could not fetch config type");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    switch (config_command) {</div><div class='add'>+        case GF_SNAP_CONFIG_TYPE_SET:</div><div class='add'>+            ret = cli_xml_snapshot_config_set(writer, doc, dict);</div><div class='add'>+            if (ret) {</div><div class='add'>+                gf_log("cli", GF_LOG_ERROR,</div><div class='add'>+                       "Failed to create xml "</div><div class='add'>+                       "output for snapshot config set command");</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            break;</div><div class='add'>+        case GF_SNAP_CONFIG_DISPLAY:</div><div class='add'>+            ret = cli_xml_snapshot_config_show(writer, doc, dict);</div><div class='add'>+            if (ret) {</div><div class='add'>+                gf_log("cli", GF_LOG_ERROR,</div><div class='add'>+                       "Failed to create xml "</div><div class='add'>+                       "output for snapshot config show command");</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+            break;</div><div class='add'>+        default:</div><div class='add'>+            gf_log("cli", GF_LOG_ERROR, "Unknown config command :%d",</div><div class='add'>+                   config_command);</div><div class='add'>+            ret = -1;</div><div class='add'>+            goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* &lt;/snapConfig&gt; */</div><div class='add'>+    ret = xmlTextWriterEndElement(writer);</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+out:</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* This function will generate snapshot activate or</div><div class='add'>+ * deactivate output in xml format.</div><div class='add'>+ *</div><div class='add'>+ * @param writer        xmlTextWriterPtr</div><div class='add'>+ * @param doc           xmlDocPtr</div><div class='add'>+ * @param dict          dict containing activate or deactivate output</div><div class='add'>+ *</div><div class='add'>+ * @return 0 on success and -1 on failure</div><div class='add'>+ */</div><div class='add'>+static int</div><div class='add'>+cli_xml_snapshot_activate_deactivate(xmlTextWriterPtr writer, xmlDocPtr doc,</div><div class='add'>+                                     dict_t *dict, int cmd)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    char *buffer = NULL;</div><div class='add'>+    char *tag = NULL;</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(writer);</div><div class='add'>+    GF_ASSERT(doc);</div><div class='add'>+    GF_ASSERT(dict);</div><div class='add'>+</div><div class='add'>+    if (GF_SNAP_OPTION_TYPE_ACTIVATE == cmd) {</div><div class='add'>+        tag = "snapActivate";</div><div class='add'>+    } else if (GF_SNAP_OPTION_TYPE_DEACTIVATE == cmd) {</div><div class='add'>+        tag = "snapDeactivate";</div><div class='add'>+    } else {</div><div class='add'>+        gf_log("cli", GF_LOG_ERROR, "invalid command %d", cmd);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* &lt;snapActivate&gt; or &lt;snapDeactivate&gt; */</div><div class='add'>+    ret = xmlTextWriterStartElement(writer, (xmlChar *)tag);</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    /* &lt;snapshot&gt; */</div><div class='add'>+    ret = xmlTextWriterStartElement(writer, (xmlChar *)"snapshot");</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    ret = dict_get_str(dict, "snapname", &amp;buffer);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log("cli", GF_LOG_ERROR, "Failed to get snap name");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"name", "%s",</div><div class='add'>+                                          buffer);</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    ret = dict_get_str(dict, "snapuuid", &amp;buffer);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log("cli", GF_LOG_ERROR, "Failed to get snap uuid");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"uuid", "%s",</div><div class='add'>+                                          buffer);</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    /* &lt;/snapshot&gt; */</div><div class='add'>+    ret = xmlTextWriterEndElement(writer);</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    /* &lt;/snapActivate&gt; or &lt;/snapDeactivate&gt; */</div><div class='add'>+    ret = xmlTextWriterEndElement(writer);</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+out:</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+#endif /* HAVE_LIB_XML */</div><div class='add'>+</div><div class='add'>+/* This function will generate snapshot delete output in xml format.</div><div class='add'>+ *</div><div class='add'>+ * @param writer        xmlTextWriterPtr</div><div class='add'>+ * @param doc           xmlDocPtr</div><div class='add'>+ * @param dict          dict containing delete output</div><div class='add'>+ * @param rsp           cli response</div><div class='add'>+ *</div><div class='add'>+ * @return 0 on success and -1 on failure</div><div class='add'>+ */</div><div class='add'>+int</div><div class='add'>+cli_xml_snapshot_delete(cli_local_t *local, dict_t *dict, gf_cli_rsp *rsp)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+#ifdef HAVE_LIB_XML</div><div class='add'>+    char *str_value = NULL;</div><div class='add'>+    xmlTextWriterPtr writer = local-&gt;writer;</div><div class='add'>+    xmlDocPtr doc = local-&gt;doc;</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(writer);</div><div class='add'>+    GF_ASSERT(doc);</div><div class='add'>+    GF_ASSERT(dict);</div><div class='add'>+</div><div class='add'>+    /* &lt;snapshot&gt; */</div><div class='add'>+    ret = xmlTextWriterStartElement(writer, (xmlChar *)"snapshot");</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    ret = dict_get_str(dict, "snapname", &amp;str_value);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log("cli", GF_LOG_ERROR, "Failed to get snap name");</div><div class='add'>+        goto xmlend;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (!rsp-&gt;op_ret) {</div><div class='add'>+        ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"status",</div><div class='add'>+                                              "Success");</div><div class='add'>+    } else {</div><div class='add'>+        ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"status",</div><div class='add'>+                                              "Failure");</div><div class='add'>+        XML_RET_CHECK_AND_GOTO(ret, xmlend);</div><div class='add'>+</div><div class='add'>+        ret = cli_xml_output_common(writer, rsp-&gt;op_ret, rsp-&gt;op_errno,</div><div class='add'>+                                    rsp-&gt;op_errstr);</div><div class='add'>+    }</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, xmlend);</div><div class='add'>+</div><div class='add'>+    ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"name", "%s",</div><div class='add'>+                                          str_value);</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, xmlend);</div><div class='add'>+</div><div class='add'>+    ret = dict_get_str(dict, "snapuuid", &amp;str_value);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log("cli", GF_LOG_ERROR, "Failed to get snap uuid");</div><div class='add'>+        goto xmlend;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"uuid", "%s",</div><div class='add'>+                                          str_value);</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+xmlend:</div><div class='add'>+    /* &lt;/snapshot&gt; */</div><div class='add'>+    ret = xmlTextWriterEndElement(writer);</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+#endif /* HAVE_LIB_XML */</div><div class='add'>+    ret = 0;</div><div class='add'>+out:</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+cli_xml_output_snap_status_begin(cli_local_t *local, int op_ret, int op_errno,</div><div class='add'>+                                 char *op_errstr)</div><div class='add'>+{</div><div class='add'>+#if (HAVE_LIB_XML)</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(local);</div><div class='add'>+</div><div class='add'>+    ret = cli_begin_xml_output(&amp;(local-&gt;writer), &amp;(local-&gt;doc));</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    ret = cli_xml_output_common(local-&gt;writer, op_ret, op_errno, op_errstr);</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    /* &lt;snapStatus&gt; */</div><div class='add'>+    ret = xmlTextWriterStartElement(local-&gt;writer, (xmlChar *)"snapStatus");</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    /* &lt;snapshots&gt; */</div><div class='add'>+    ret = xmlTextWriterStartElement(local-&gt;writer, (xmlChar *)"snapshots");</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    gf_log("cli", GF_LOG_TRACE, "Returning %d", ret);</div><div class='add'>+    return ret;</div><div class='add'>+#else</div><div class='add'>+    return 0;</div><div class='add'>+#endif</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+cli_xml_output_snap_status_end(cli_local_t *local)</div><div class='add'>+{</div><div class='add'>+#if (HAVE_LIB_XML)</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(local);</div><div class='add'>+</div><div class='add'>+    /* &lt;/snapshots&gt; */</div><div class='add'>+    ret = xmlTextWriterEndElement(local-&gt;writer);</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    /* &lt;/snapStatus&gt; */</div><div class='add'>+    ret = xmlTextWriterEndElement(local-&gt;writer);</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    ret = cli_end_xml_output(local-&gt;writer, local-&gt;doc);</div><div class='add'>+out:</div><div class='add'>+    gf_log("cli", GF_LOG_TRACE, "Returning %d", ret);</div><div class='add'>+    return ret;</div><div class='add'>+#else</div><div class='add'>+    return 0;</div><div class='add'>+#endif</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+cli_xml_output_snap_delete_begin(cli_local_t *local, int op_ret, int op_errno,</div><div class='add'>+                                 char *op_errstr)</div><div class='add'>+{</div><div class='add'>+#if (HAVE_LIB_XML)</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int delete_cmd = -1;</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(local);</div><div class='add'>+</div><div class='add'>+    ret = cli_begin_xml_output(&amp;(local-&gt;writer), &amp;(local-&gt;doc));</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    ret = dict_get_int32(local-&gt;dict, "sub-cmd", &amp;delete_cmd);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log("cli", GF_LOG_ERROR, "Failed to get sub-cmd");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = cli_xml_output_common(local-&gt;writer, op_ret, op_errno, op_errstr);</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    /* &lt;snapStatus&gt; */</div><div class='add'>+    ret = xmlTextWriterStartElement(local-&gt;writer, (xmlChar *)"snapDelete");</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    /* &lt;snapshots&gt; */</div><div class='add'>+    ret = xmlTextWriterStartElement(local-&gt;writer, (xmlChar *)"snapshots");</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    gf_log("cli", GF_LOG_TRACE, "Returning %d", ret);</div><div class='add'>+    return ret;</div><div class='add'>+#else</div><div class='add'>+    return 0;</div><div class='add'>+#endif</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+cli_xml_output_snap_delete_end(cli_local_t *local)</div><div class='add'>+{</div><div class='add'>+#if (HAVE_LIB_XML)</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(local);</div><div class='add'>+</div><div class='add'>+    /* &lt;/snapshots&gt; */</div><div class='add'>+    ret = xmlTextWriterEndElement(local-&gt;writer);</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    /* &lt;/snapDelete&gt; */</div><div class='add'>+    ret = xmlTextWriterEndElement(local-&gt;writer);</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    ret = cli_end_xml_output(local-&gt;writer, local-&gt;doc);</div><div class='add'>+out:</div><div class='add'>+    gf_log("cli", GF_LOG_TRACE, "Returning %d", ret);</div><div class='add'>+    return ret;</div><div class='add'>+#else</div><div class='add'>+    return 0;</div><div class='add'>+#endif</div><div class='add'>+}</div><div class='add'>+/* This function will generate xml output for all the snapshot commands</div><div class='add'>+ *</div><div class='add'>+ * @param cmd_type      command type</div><div class='add'>+ * @param dict          dict containing snapshot command output</div><div class='add'>+ * @param op_ret        return value of the snapshot command</div><div class='add'>+ * @param op_errno      errno for the snapshot command</div><div class='add'>+ * @param op_errstr     error string for the snapshot command</div><div class='add'>+ *</div><div class='add'>+ * @return 0 on success and -1 on failure</div><div class='add'>+ */</div><div class='add'>+int</div><div class='add'>+cli_xml_output_snapshot(int cmd_type, dict_t *dict, int op_ret, int op_errno,</div><div class='add'>+                        char *op_errstr)</div><div class='add'>+{</div><div class='add'>+#if (HAVE_LIB_XML)</div><div class='add'>+    int ret = -1;</div><div class='add'>+    xmlTextWriterPtr writer = NULL;</div><div class='add'>+    xmlDocPtr doc = NULL;</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(dict);</div><div class='add'>+</div><div class='add'>+    ret = cli_begin_xml_output(&amp;writer, &amp;doc);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log("cli", GF_LOG_ERROR,</div><div class='add'>+               "Failed to output "</div><div class='add'>+               "xml begin block");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = cli_xml_output_common(writer, op_ret, op_errno, op_errstr);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log("cli", GF_LOG_ERROR,</div><div class='add'>+               "Failed to output "</div><div class='add'>+               "xml common block");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* In case of command failure just printing the error message is good</div><div class='add'>+     * enough */</div><div class='add'>+    if (0 != op_ret) {</div><div class='add'>+        goto end;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    switch (cmd_type) {</div><div class='add'>+        case GF_SNAP_OPTION_TYPE_CREATE:</div><div class='add'>+            ret = cli_xml_snapshot_create(writer, doc, dict);</div><div class='add'>+            if (ret) {</div><div class='add'>+                gf_log("cli", GF_LOG_ERROR,</div><div class='add'>+                       "Failed to create "</div><div class='add'>+                       "xml output for snapshot create command");</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+            break;</div><div class='add'>+        case GF_SNAP_OPTION_TYPE_CLONE:</div><div class='add'>+            ret = cli_xml_snapshot_clone(writer, doc, dict);</div><div class='add'>+            if (ret) {</div><div class='add'>+                gf_log("cli", GF_LOG_ERROR,</div><div class='add'>+                       "Failed to create "</div><div class='add'>+                       "xml output for snapshot clone command");</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+            break;</div><div class='add'>+        case GF_SNAP_OPTION_TYPE_RESTORE:</div><div class='add'>+            ret = cli_xml_snapshot_restore(writer, doc, dict);</div><div class='add'>+            if (ret) {</div><div class='add'>+                gf_log("cli", GF_LOG_ERROR,</div><div class='add'>+                       "Failed to create "</div><div class='add'>+                       "xml output for snapshot restore command");</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+            break;</div><div class='add'>+        case GF_SNAP_OPTION_TYPE_LIST:</div><div class='add'>+            ret = cli_xml_snapshot_list(writer, doc, dict);</div><div class='add'>+            if (ret) {</div><div class='add'>+                gf_log("cli", GF_LOG_ERROR,</div><div class='add'>+                       "Failed to create "</div><div class='add'>+                       "xml output for snapshot list command");</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+            break;</div><div class='add'>+        case GF_SNAP_OPTION_TYPE_STATUS:</div><div class='add'>+            ret = cli_xml_snapshot_status(writer, doc, dict);</div><div class='add'>+            if (ret) {</div><div class='add'>+                gf_log("cli", GF_LOG_ERROR,</div><div class='add'>+                       "Failed to create"</div><div class='add'>+                       "xml output for snapshot status command");</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+            break;</div><div class='add'>+        case GF_SNAP_OPTION_TYPE_INFO:</div><div class='add'>+            ret = cli_xml_snapshot_info(writer, doc, dict);</div><div class='add'>+            if (ret) {</div><div class='add'>+                gf_log("cli", GF_LOG_ERROR,</div><div class='add'>+                       "Failed to create "</div><div class='add'>+                       "xml output for snapshot info command");</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+            break;</div><div class='add'>+        case GF_SNAP_OPTION_TYPE_ACTIVATE:</div><div class='add'>+        case GF_SNAP_OPTION_TYPE_DEACTIVATE:</div><div class='add'>+            ret = cli_xml_snapshot_activate_deactivate(writer, doc, dict,</div><div class='add'>+                                                       cmd_type);</div><div class='add'>+            if (ret) {</div><div class='add'>+                gf_log("cli", GF_LOG_ERROR,</div><div class='add'>+                       "Failed to create "</div><div class='add'>+                       "xml output for snapshot config command");</div><div class='add'>+            }</div><div class='add'>+            break;</div><div class='add'>+        case GF_SNAP_OPTION_TYPE_CONFIG:</div><div class='add'>+            ret = cli_xml_snapshot_config(writer, doc, dict);</div><div class='add'>+            if (ret) {</div><div class='add'>+                gf_log("cli", GF_LOG_ERROR,</div><div class='add'>+                       "Failed to create "</div><div class='add'>+                       "xml output for snapshot config command");</div><div class='add'>+            }</div><div class='add'>+            break;</div><div class='add'>+        default:</div><div class='add'>+            gf_log("cli", GF_LOG_ERROR, "Unexpected snapshot command: %d",</div><div class='add'>+                   cmd_type);</div><div class='add'>+            goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+end:</div><div class='add'>+    ret = cli_end_xml_output(writer, doc);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log("cli", GF_LOG_ERROR,</div><div class='add'>+               "Failed to output "</div><div class='add'>+               "xml end block");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+#else</div><div class='add'>+    return 0;</div><div class='add'>+#endif /* HAVE_LIB_XML */</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+cli_xml_snapshot_begin_composite_op(cli_local_t *local)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+#ifdef HAVE_LIB_XML</div><div class='add'>+    int cmd = -1;</div><div class='add'>+    int type = -1;</div><div class='add'>+</div><div class='add'>+    ret = dict_get_int32(local-&gt;dict, "sub-cmd", &amp;cmd);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log("cli", GF_LOG_ERROR,</div><div class='add'>+               "Failed to get "</div><div class='add'>+               "sub-cmd");</div><div class='add'>+        ret = 0;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (cmd == GF_SNAP_STATUS_TYPE_ITER || cmd == GF_SNAP_DELETE_TYPE_SNAP) {</div><div class='add'>+        ret = 0;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_get_int32(local-&gt;dict, "type", &amp;type);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log("cli", GF_LOG_ERROR,</div><div class='add'>+               "Failed to get snapshot "</div><div class='add'>+               "command type from dictionary");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (GF_SNAP_OPTION_TYPE_STATUS == type)</div><div class='add'>+        ret = cli_xml_output_snap_status_begin(local, 0, 0, NULL);</div><div class='add'>+    else if (GF_SNAP_OPTION_TYPE_DELETE == type)</div><div class='add'>+        ret = cli_xml_output_snap_delete_begin(local, 0, 0, NULL);</div><div class='add'>+</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log("cli", GF_LOG_ERROR, "Error creating xml output");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+#endif /* HAVE_LIB_XML */</div><div class='add'>+    ret = 0;</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+cli_xml_snapshot_end_composite_op(cli_local_t *local)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+#ifdef HAVE_LIB_XML</div><div class='add'>+    int cmd = -1;</div><div class='add'>+    int type = -1;</div><div class='add'>+</div><div class='add'>+    ret = dict_get_int32(local-&gt;dict, "sub-cmd", &amp;cmd);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log("cli", GF_LOG_ERROR,</div><div class='add'>+               "Failed to get "</div><div class='add'>+               "sub-cmd");</div><div class='add'>+        ret = 0;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (cmd == GF_SNAP_STATUS_TYPE_ITER || cmd == GF_SNAP_DELETE_TYPE_SNAP) {</div><div class='add'>+        ret = 0;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_get_int32(local-&gt;dict, "type", &amp;type);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log("cli", GF_LOG_ERROR,</div><div class='add'>+               "Failed to get snapshot "</div><div class='add'>+               "command type from dictionary");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (GF_SNAP_OPTION_TYPE_STATUS == type)</div><div class='add'>+        ret = cli_xml_output_snap_status_end(local);</div><div class='add'>+    else if (GF_SNAP_OPTION_TYPE_DELETE == type)</div><div class='add'>+        ret = cli_xml_output_snap_delete_end(local);</div><div class='add'>+</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log("cli", GF_LOG_ERROR,</div><div class='add'>+               "Error creating xml "</div><div class='add'>+               "output");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+#endif /* HAVE_LIB_XML */</div><div class='add'>+    ret = 0;</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+cli_xml_snapshot_status_single_snap(cli_local_t *local, dict_t *dict, char *key)</div><div class='add'>+{</div><div class='add'>+#if (HAVE_LIB_XML)</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    GF_VALIDATE_OR_GOTO("cli", (local != NULL), out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("cli", (dict != NULL), out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("cli", (key != NULL), out);</div><div class='add'>+</div><div class='add'>+    ret = cli_xml_snapshot_status_per_snap(local-&gt;writer, local-&gt;doc, dict,</div><div class='add'>+                                           key);</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+#else</div><div class='add'>+    return 0;</div><div class='add'>+#endif /* HAVE_LIB_XML */</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+cli_xml_output_vol_getopts(dict_t *dict, int op_ret, int op_errno,</div><div class='add'>+                           char *op_errstr)</div><div class='add'>+{</div><div class='add'>+#if (HAVE_LIB_XML)</div><div class='add'>+    int i = 0;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int count = 0;</div><div class='add'>+    xmlTextWriterPtr writer = NULL;</div><div class='add'>+    xmlDocPtr doc = NULL;</div><div class='add'>+    char *key = NULL;</div><div class='add'>+    char *value = NULL;</div><div class='add'>+    char dict_key[50] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    ret = cli_begin_xml_output(&amp;writer, &amp;doc);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    ret = cli_xml_output_common(writer, op_ret, op_errno, op_errstr);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    ret = xmlTextWriterStartElement(writer, (xmlChar *)"volGetopts");</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    ret = dict_get_int32(dict, "count", &amp;count);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log("cli", GF_LOG_ERROR,</div><div class='add'>+               "Failed to retrieve count "</div><div class='add'>+               "from the dictionary");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    if (count &lt;= 0) {</div><div class='add'>+        gf_log("cli", GF_LOG_ERROR,</div><div class='add'>+               "Value of count :%d is "</div><div class='add'>+               "invalid",</div><div class='add'>+               count);</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"count", "%d",</div><div class='add'>+                                          count);</div><div class='add'>+</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    for (i = 1; i &lt;= count; i++) {</div><div class='add'>+        sprintf(dict_key, "key%d", i);</div><div class='add'>+        ret = dict_get_str(dict, dict_key, &amp;key);</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_log("cli", GF_LOG_ERROR,</div><div class='add'>+                   "Failed to"</div><div class='add'>+                   " retrieve %s from the "</div><div class='add'>+                   "dictionary",</div><div class='add'>+                   dict_key);</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+        sprintf(dict_key, "value%d", i);</div><div class='add'>+        ret = dict_get_str(dict, dict_key, &amp;value);</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_log("cli", GF_LOG_ERROR,</div><div class='add'>+                   "Failed to "</div><div class='add'>+                   "retrieve key value for %s from"</div><div class='add'>+                   "the dictionary",</div><div class='add'>+                   dict_key);</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+        ret = xmlTextWriterStartElement(writer, (xmlChar *)"Opt");</div><div class='add'>+        XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+        ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"Option", "%s",</div><div class='add'>+                                              key);</div><div class='add'>+        XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+        ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"Value", "%s",</div><div class='add'>+                                              value);</div><div class='add'>+        XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+        ret = xmlTextWriterEndElement(writer);</div><div class='add'>+        XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+    }</div><div class='add'>+    ret = cli_end_xml_output(writer, doc);</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    gf_log("cli", GF_LOG_DEBUG, "Returning %d", ret);</div><div class='add'>+    return ret;</div><div class='add'>+#else</div><div class='add'>+    return 0;</div><div class='add'>+#endif /* HAVE_LIB_XML */</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+cli_quota_list_xml_error(cli_local_t *local, char *path, char *errstr)</div><div class='add'>+{</div><div class='add'>+#if (HAVE_LIB_XML)</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    ret = xmlTextWriterStartElement(local-&gt;writer, (xmlChar *)"limit");</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    ret = xmlTextWriterWriteFormatElement(local-&gt;writer, (xmlChar *)"path",</div><div class='add'>+                                          "%s", path);</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    ret = xmlTextWriterWriteFormatElement(local-&gt;writer, (xmlChar *)"errstr",</div><div class='add'>+                                          "%s", errstr);</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    ret = xmlTextWriterEndElement(local-&gt;writer);</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+#else</div><div class='add'>+    return 0;</div><div class='add'>+#endif</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+cli_quota_xml_output(cli_local_t *local, char *path, int64_t hl_str,</div><div class='add'>+                     char *sl_final, int64_t sl_num, int64_t used,</div><div class='add'>+                     int64_t avail, char *sl, char *hl, gf_boolean_t limit_set)</div><div class='add'>+{</div><div class='add'>+#if (HAVE_LIB_XML)</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    ret = xmlTextWriterStartElement(local-&gt;writer, (xmlChar *)"limit");</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    ret = xmlTextWriterWriteFormatElement(local-&gt;writer, (xmlChar *)"path",</div><div class='add'>+                                          "%s", path);</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    ret = xmlTextWriterWriteFormatElement(</div><div class='add'>+        local-&gt;writer, (xmlChar *)"hard_limit", !limit_set ? "N/A" : "%" PRId64,</div><div class='add'>+        hl_str);</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    ret = xmlTextWriterWriteFormatElement(local-&gt;writer,</div><div class='add'>+                                          (xmlChar *)"soft_limit_percent",</div><div class='add'>+                                          !limit_set ? "N/A" : "%s", sl_final);</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    ret = xmlTextWriterWriteFormatElement(</div><div class='add'>+        local-&gt;writer, (xmlChar *)"soft_limit_value",</div><div class='add'>+        !limit_set ? "N/A" : "%" PRId64, sl_num);</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    ret = xmlTextWriterWriteFormatElement(</div><div class='add'>+        local-&gt;writer, (xmlChar *)"used_space", "%" PRId64, used);</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    ret = xmlTextWriterWriteFormatElement(</div><div class='add'>+        local-&gt;writer, (xmlChar *)"avail_space",</div><div class='add'>+        !limit_set ? "N/A" : "%" PRId64, avail);</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    ret = xmlTextWriterWriteFormatElement(</div><div class='add'>+        local-&gt;writer, (xmlChar *)"sl_exceeded", !limit_set ? "N/A" : "%s", sl);</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    ret = xmlTextWriterWriteFormatElement(</div><div class='add'>+        local-&gt;writer, (xmlChar *)"hl_exceeded", !limit_set ? "N/A" : "%s", hl);</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    ret = xmlTextWriterEndElement(local-&gt;writer);</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+#else</div><div class='add'>+    return 0;</div><div class='add'>+#endif /* HAVE_LIB_XML */</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+cli_quota_object_xml_output(cli_local_t *local, char *path, char *sl_str,</div><div class='add'>+                            int64_t sl_val, quota_limits_t *limits,</div><div class='add'>+                            quota_meta_t *used_space, int64_t avail, char *sl,</div><div class='add'>+                            char *hl, gf_boolean_t limit_set)</div><div class='add'>+{</div><div class='add'>+#if (HAVE_LIB_XML)</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    ret = xmlTextWriterStartElement(local-&gt;writer, (xmlChar *)"limit");</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    ret = xmlTextWriterWriteFormatElement(local-&gt;writer, (xmlChar *)"path",</div><div class='add'>+                                          "%s", path);</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    ret = xmlTextWriterWriteFormatElement(</div><div class='add'>+        local-&gt;writer, (xmlChar *)"hard_limit", !limit_set ? "N/A" : "%" PRId64,</div><div class='add'>+        limits-&gt;hl);</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    ret = xmlTextWriterWriteFormatElement(local-&gt;writer,</div><div class='add'>+                                          (xmlChar *)"soft_limit_percent",</div><div class='add'>+                                          !limit_set ? "N/A" : "%s", sl_str);</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    ret = xmlTextWriterWriteFormatElement(</div><div class='add'>+        local-&gt;writer, (xmlChar *)"soft_limit_value",</div><div class='add'>+        !limit_set ? "N/A" : "%" PRIu64, sl_val);</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    ret = xmlTextWriterWriteFormatElement(local-&gt;writer,</div><div class='add'>+                                          (xmlChar *)"file_count", "%" PRId64,</div><div class='add'>+                                          used_space-&gt;file_count);</div><div class='add'>+</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    ret = xmlTextWriterWriteFormatElement(local-&gt;writer, (xmlChar *)"dir_count",</div><div class='add'>+                                          "%" PRIu64, used_space-&gt;dir_count);</div><div class='add'>+</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    ret = xmlTextWriterWriteFormatElement(local-&gt;writer, (xmlChar *)"available",</div><div class='add'>+                                          !limit_set ? "N/A" : "%" PRId64,</div><div class='add'>+                                          avail);</div><div class='add'>+</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    ret = xmlTextWriterWriteFormatElement(</div><div class='add'>+        local-&gt;writer, (xmlChar *)"sl_exceeded", !limit_set ? "N/A" : "%s", sl);</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    ret = xmlTextWriterWriteFormatElement(</div><div class='add'>+        local-&gt;writer, (xmlChar *)"hl_exceeded", !limit_set ? "N/A" : "%s", hl);</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+    ret = xmlTextWriterEndElement(local-&gt;writer);</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, out);</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+#else</div><div class='add'>+    return 0;</div><div class='add'>+#endif /* HAVE_LIB_XML */</div><div class='add'>+}</div><div class='head'>diff --git a/cli/src/cli.c b/cli/src/cli.c<br/>index 58cb61bb417..a52b39c5fb8 100644<br/>--- a/<a href='/cgit/glusterfs.git/tree/cli/src/cli.c?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>cli/src/cli.c</a><br/>+++ b/<a href='/cgit/glusterfs.git/tree/cli/src/cli.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>cli/src/cli.c</a></div><div class='hunk'>@@ -1,22 +1,12 @@</div><div class='ctx'> /*</div><div class='del'>-  Copyright (c) 2010 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='del'>-  This file is part of GlusterFS.</div><div class='del'>-</div><div class='del'>-  GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-  it under the terms of the GNU Affero General Public License as published</div><div class='del'>-  by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-  or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-  GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-  WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-  Affero General Public License for more details.</div><div class='del'>-</div><div class='del'>-  You should have received a copy of the GNU Affero General Public License</div><div class='del'>-  along with this program.  If not, see</div><div class='del'>-  &lt;http://www.gnu.org/licenses/&gt;.</div><div class='del'>-*/</div><div class='add'>+   Copyright (c) 2010-2016 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+   This file is part of GlusterFS.</div><div class='ctx'> </div><div class='add'>+   This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+   General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+   later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+   cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='ctx'> #include &lt;stdio.h&gt;</div><div class='ctx'> #include &lt;string.h&gt;</div><div class='ctx'> #include &lt;stdlib.h&gt;</div><div class='hunk'>@@ -39,478 +29,884 @@</div><div class='ctx'> #include &lt;semaphore.h&gt;</div><div class='ctx'> #include &lt;errno.h&gt;</div><div class='ctx'> </div><div class='del'>-#ifndef _CONFIG_H</div><div class='del'>-#define _CONFIG_H</div><div class='del'>-#include "config.h"</div><div class='del'>-#endif</div><div class='del'>-</div><div class='ctx'> #ifdef HAVE_MALLOC_H</div><div class='ctx'> #include &lt;malloc.h&gt;</div><div class='ctx'> #endif</div><div class='ctx'> </div><div class='del'>-#ifdef HAVE_MALLOC_STATS</div><div class='del'>-#ifdef DEBUG</div><div class='del'>-#include &lt;mcheck.h&gt;</div><div class='del'>-#endif</div><div class='del'>-#endif</div><div class='del'>-</div><div class='ctx'> #include "cli.h"</div><div class='add'>+#include "cli-quotad-client.h"</div><div class='ctx'> #include "cli-cmd.h"</div><div class='ctx'> #include "cli-mem-types.h"</div><div class='ctx'> </div><div class='del'>-#include "xlator.h"</div><div class='del'>-#include "glusterfs.h"</div><div class='del'>-#include "compat.h"</div><div class='del'>-#include "logging.h"</div><div class='del'>-#include "dict.h"</div><div class='del'>-#include "list.h"</div><div class='del'>-#include "timer.h"</div><div class='del'>-#include "stack.h"</div><div class='del'>-#include "revision.h"</div><div class='del'>-#include "common-utils.h"</div><div class='del'>-#include "event.h"</div><div class='del'>-#include "globals.h"</div><div class='del'>-#include "syscall.h"</div><div class='del'>-#include "call-stub.h"</div><div class='add'>+#include &lt;glusterfs/xlator.h&gt;</div><div class='add'>+#include &lt;glusterfs/glusterfs.h&gt;</div><div class='add'>+#include &lt;glusterfs/compat.h&gt;</div><div class='add'>+#include &lt;glusterfs/logging.h&gt;</div><div class='add'>+#include &lt;glusterfs/dict.h&gt;</div><div class='add'>+#include &lt;glusterfs/list.h&gt;</div><div class='add'>+#include &lt;glusterfs/timer.h&gt;</div><div class='add'>+#include &lt;glusterfs/stack.h&gt;</div><div class='add'>+#include &lt;glusterfs/revision.h&gt;</div><div class='add'>+#include &lt;glusterfs/common-utils.h&gt;</div><div class='add'>+#include &lt;glusterfs/gf-event.h&gt;</div><div class='add'>+#include &lt;glusterfs/syscall.h&gt;</div><div class='add'>+#include &lt;glusterfs/call-stub.h&gt;</div><div class='ctx'> #include &lt;fnmatch.h&gt;</div><div class='ctx'> </div><div class='del'>-extern int connected;</div><div class='del'>-/* using argp for command line parsing */</div><div class='add'>+#include "xdr-generic.h"</div><div class='ctx'> </div><div class='del'>-const char *argp_program_version = ""                                 \</div><div class='del'>-        PACKAGE_NAME" "PACKAGE_VERSION" built on "__DATE__" "__TIME__ \</div><div class='del'>-        "\nRepository revision: " GLUSTERFS_REPOSITORY_REVISION "\n"  \</div><div class='del'>-        "Copyright (c) 2006-2010 Gluster Inc. "                       \</div><div class='del'>-        "&lt;http://www.gluster.com&gt;\n"                                  \</div><div class='del'>-        "GlusterFS comes with ABSOLUTELY NO WARRANTY.\n"              \</div><div class='del'>-        "You may redistribute copies of GlusterFS under the terms of "\</div><div class='del'>-        "the GNU Affero General Public License.";</div><div class='add'>+/* using argp for command line parsing */</div><div class='ctx'> </div><div class='add'>+const char *argp_program_version =</div><div class='add'>+    "" PACKAGE_NAME " " PACKAGE_VERSION</div><div class='add'>+    "\nRepository revision: " GLUSTERFS_REPOSITORY_REVISION</div><div class='add'>+    "\n"</div><div class='add'>+    "Copyright (c) 2006-2016 Red Hat, Inc. "</div><div class='add'>+    "&lt;https://www.gluster.org/&gt;\n"</div><div class='add'>+    "GlusterFS comes with ABSOLUTELY NO WARRANTY.\n"</div><div class='add'>+    "It is licensed to you under your choice of the GNU Lesser\n"</div><div class='add'>+    "General Public License, version 3 or any later version (LGPLv3\n"</div><div class='add'>+    "or later), or the GNU General Public License, version 2 (GPLv2),\n"</div><div class='add'>+    "in all cases as published by the Free Software Foundation.";</div><div class='ctx'> const char *argp_program_bug_address = "&lt;" PACKAGE_BUGREPORT "&gt;";</div><div class='ctx'> </div><div class='del'>-</div><div class='add'>+struct rpc_clnt *global_quotad_rpc;</div><div class='ctx'> </div><div class='ctx'> struct rpc_clnt *global_rpc;</div><div class='ctx'> </div><div class='ctx'> rpc_clnt_prog_t *cli_rpc_prog;</div><div class='ctx'> </div><div class='add'>+extern struct rpc_clnt_program cli_prog;</div><div class='ctx'> </div><div class='del'>-extern struct rpc_clnt_program cli3_1_prog;</div><div class='add'>+int cli_default_conn_timeout = 120;</div><div class='add'>+int cli_ten_minutes_timeout = 600;</div><div class='ctx'> </div><div class='del'>-</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-static char *</div><div class='del'>-generate_uuid ()</div><div class='add'>+static int</div><div class='add'>+glusterfs_ctx_defaults_init(glusterfs_ctx_t *ctx)</div><div class='ctx'> {</div><div class='del'>-        char           tmp_str[1024] = {0,};</div><div class='del'>-        char           hostname[256] = {0,};</div><div class='del'>-        struct timeval tv = {0,};</div><div class='del'>-        struct tm      now = {0, };</div><div class='del'>-        char           now_str[32];</div><div class='del'>-</div><div class='del'>-        if (gettimeofday (&amp;tv, NULL) == -1) {</div><div class='del'>-                gf_log ("glusterfsd", GF_LOG_ERROR,</div><div class='del'>-                        "gettimeofday: failed %s",</div><div class='del'>-                        strerror (errno));</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (gethostname (hostname, 256) == -1) {</div><div class='del'>-                gf_log ("glusterfsd", GF_LOG_ERROR,</div><div class='del'>-                        "gethostname: failed %s",</div><div class='del'>-                        strerror (errno));</div><div class='del'>-        }</div><div class='add'>+    cmd_args_t *cmd_args = NULL;</div><div class='add'>+    struct rlimit lim = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    call_pool_t *pool = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    if (!ctx)</div><div class='add'>+        return ret;</div><div class='ctx'> </div><div class='del'>-        localtime_r (&amp;tv.tv_sec, &amp;now);</div><div class='del'>-        strftime (now_str, 32, "%Y/%m/%d-%H:%M:%S", &amp;now);</div><div class='del'>-        snprintf (tmp_str, 1024, "%s-%d-%s:%"</div><div class='del'>-#ifdef GF_DARWIN_HOST_OS</div><div class='del'>-                  PRId32,</div><div class='del'>-#else</div><div class='del'>-                  "ld",</div><div class='del'>-#endif</div><div class='del'>-                  hostname, getpid(), now_str, tv.tv_usec);</div><div class='add'>+    ret = xlator_mem_acct_init(THIS, cli_mt_end);</div><div class='add'>+    if (ret != 0) {</div><div class='add'>+        gf_log("cli", GF_LOG_ERROR, "Memory accounting init failed.");</div><div class='add'>+        return ret;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Resetting ret to -1 to so in case of failure</div><div class='add'>+     * we can relese allocated resource.</div><div class='add'>+     */</div><div class='add'>+    ret = -1;</div><div class='add'>+</div><div class='add'>+    ctx-&gt;process_uuid = generate_glusterfs_ctx_id();</div><div class='add'>+    if (!ctx-&gt;process_uuid) {</div><div class='add'>+        gf_log("cli", GF_LOG_ERROR, "Failed to generate uuid.");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ctx-&gt;page_size = 128 * GF_UNIT_KB;</div><div class='add'>+</div><div class='add'>+    ctx-&gt;iobuf_pool = iobuf_pool_new();</div><div class='add'>+    if (!ctx-&gt;iobuf_pool) {</div><div class='add'>+        gf_log("cli", GF_LOG_ERROR, "Failed to create iobuf pool.");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ctx-&gt;event_pool = gf_event_pool_new(DEFAULT_EVENT_POOL_SIZE,</div><div class='add'>+                                        STARTING_EVENT_THREADS);</div><div class='add'>+    if (!ctx-&gt;event_pool) {</div><div class='add'>+        gf_log("cli", GF_LOG_ERROR, "Failed to create event pool.");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    pool = GF_CALLOC(1, sizeof(call_pool_t), cli_mt_call_pool_t);</div><div class='add'>+    if (!pool) {</div><div class='add'>+        gf_log("cli", GF_LOG_ERROR, "Failed to create call pool.");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* frame_mem_pool size 112 * 64 */</div><div class='add'>+    pool-&gt;frame_mem_pool = mem_pool_new(call_frame_t, 32);</div><div class='add'>+    if (!pool-&gt;frame_mem_pool) {</div><div class='add'>+        gf_log("cli", GF_LOG_ERROR, "Failed to create frame mem pool.");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* stack_mem_pool size 256 * 128 */</div><div class='add'>+    pool-&gt;stack_mem_pool = mem_pool_new(call_stack_t, 16);</div><div class='add'>+</div><div class='add'>+    if (!pool-&gt;stack_mem_pool) {</div><div class='add'>+        gf_log("cli", GF_LOG_ERROR, "Failed to create stack mem pool.");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ctx-&gt;stub_mem_pool = mem_pool_new(call_stub_t, 16);</div><div class='add'>+    if (!ctx-&gt;stub_mem_pool) {</div><div class='add'>+        gf_log("cli", GF_LOG_ERROR, "Failed to stub mem pool.");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ctx-&gt;dict_pool = mem_pool_new(dict_t, 32);</div><div class='add'>+    if (!ctx-&gt;dict_pool) {</div><div class='add'>+        gf_log("cli", GF_LOG_ERROR, "Failed to create dict pool.");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ctx-&gt;dict_pair_pool = mem_pool_new(data_pair_t, 512);</div><div class='add'>+    if (!ctx-&gt;dict_pair_pool) {</div><div class='add'>+        gf_log("cli", GF_LOG_ERROR, "Failed to create dict pair pool.");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ctx-&gt;dict_data_pool = mem_pool_new(data_t, 512);</div><div class='add'>+    if (!ctx-&gt;dict_data_pool) {</div><div class='add'>+        gf_log("cli", GF_LOG_ERROR, "Failed to create dict data pool.");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ctx-&gt;logbuf_pool = mem_pool_new(log_buf_t, 256);</div><div class='add'>+    if (!ctx-&gt;logbuf_pool) {</div><div class='add'>+        gf_log("cli", GF_LOG_ERROR, "Failed to create logbuf pool.");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    INIT_LIST_HEAD(&amp;pool-&gt;all_frames);</div><div class='add'>+    LOCK_INIT(&amp;pool-&gt;lock);</div><div class='add'>+    ctx-&gt;pool = pool;</div><div class='add'>+</div><div class='add'>+    cmd_args = &amp;ctx-&gt;cmd_args;</div><div class='add'>+</div><div class='add'>+    INIT_LIST_HEAD(&amp;cmd_args-&gt;xlator_options);</div><div class='add'>+</div><div class='add'>+    lim.rlim_cur = RLIM_INFINITY;</div><div class='add'>+    lim.rlim_max = RLIM_INFINITY;</div><div class='add'>+    setrlimit(RLIMIT_CORE, &amp;lim);</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='ctx'> </div><div class='del'>-        return gf_strdup (tmp_str);</div><div class='add'>+out:</div><div class='add'>+    if (ret != 0) {</div><div class='add'>+        if (pool) {</div><div class='add'>+            mem_pool_destroy(pool-&gt;frame_mem_pool);</div><div class='add'>+            mem_pool_destroy(pool-&gt;stack_mem_pool);</div><div class='add'>+        }</div><div class='add'>+        GF_FREE(pool);</div><div class='add'>+        pool = NULL;</div><div class='add'>+        GF_FREE(ctx-&gt;process_uuid);</div><div class='add'>+        mem_pool_destroy(ctx-&gt;stub_mem_pool);</div><div class='add'>+        mem_pool_destroy(ctx-&gt;dict_pool);</div><div class='add'>+        mem_pool_destroy(ctx-&gt;dict_pair_pool);</div><div class='add'>+        mem_pool_destroy(ctx-&gt;dict_data_pool);</div><div class='add'>+        mem_pool_destroy(ctx-&gt;logbuf_pool);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> static int</div><div class='del'>-glusterfs_ctx_defaults_init (glusterfs_ctx_t *ctx)</div><div class='add'>+logging_init(glusterfs_ctx_t *ctx, struct cli_state *state)</div><div class='ctx'> {</div><div class='del'>-        cmd_args_t    *cmd_args = NULL;</div><div class='del'>-        struct rlimit  lim = {0, };</div><div class='del'>-        call_pool_t   *pool = NULL;</div><div class='del'>-</div><div class='del'>-        xlator_mem_acct_init (THIS, cli_mt_end);</div><div class='del'>-</div><div class='del'>-        ctx-&gt;process_uuid = generate_uuid ();</div><div class='del'>-        if (!ctx-&gt;process_uuid)</div><div class='del'>-                return -1;</div><div class='del'>-</div><div class='del'>-        ctx-&gt;page_size  = 128 * GF_UNIT_KB;</div><div class='del'>-</div><div class='del'>-        ctx-&gt;iobuf_pool = iobuf_pool_new (8 * GF_UNIT_MB, ctx-&gt;page_size);</div><div class='del'>-        if (!ctx-&gt;iobuf_pool)</div><div class='del'>-                return -1;</div><div class='add'>+    char *log_file = state-&gt;log_file ? state-&gt;log_file</div><div class='add'>+                                     : DEFAULT_CLI_LOG_FILE_DIRECTORY</div><div class='add'>+                         "/cli.log";</div><div class='add'>+</div><div class='add'>+    /* passing ident as NULL means to use default ident for syslog */</div><div class='add'>+    if (gf_log_init(ctx, log_file, NULL) == -1) {</div><div class='add'>+        fprintf(stderr, "ERROR: failed to open logfile %s\n", log_file);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* CLI should not have something to DEBUG after the release,</div><div class='add'>+       hence defaulting to INFO loglevel */</div><div class='add'>+    gf_log_set_loglevel(ctx, (state-&gt;log_level == GF_LOG_NONE)</div><div class='add'>+                                 ? GF_LOG_INFO</div><div class='add'>+                                 : state-&gt;log_level);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        ctx-&gt;event_pool = event_pool_new (DEFAULT_EVENT_POOL_SIZE);</div><div class='del'>-        if (!ctx-&gt;event_pool)</div><div class='del'>-                return -1;</div><div class='add'>+int</div><div class='add'>+cli_submit_request(struct rpc_clnt *rpc, void *req, call_frame_t *frame,</div><div class='add'>+                   rpc_clnt_prog_t *prog, int procnum, struct iobref *iobref,</div><div class='add'>+                   xlator_t *this, fop_cbk_fn_t cbkfn, xdrproc_t xdrproc)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int count = 0;</div><div class='add'>+    struct iovec iov = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    struct iobuf *iobuf = NULL;</div><div class='add'>+    char new_iobref = 0;</div><div class='add'>+    ssize_t xdr_size = 0;</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(this);</div><div class='add'>+</div><div class='add'>+    if (req) {</div><div class='add'>+        xdr_size = xdr_sizeof(xdrproc, req);</div><div class='add'>+        iobuf = iobuf_get2(this-&gt;ctx-&gt;iobuf_pool, xdr_size);</div><div class='add'>+        if (!iobuf) {</div><div class='add'>+            goto out;</div><div class='add'>+        };</div><div class='ctx'> </div><div class='del'>-        pool = GF_CALLOC (1, sizeof (call_pool_t),</div><div class='del'>-                          cli_mt_call_pool_t);</div><div class='del'>-        if (!pool)</div><div class='del'>-                return -1;</div><div class='add'>+        if (!iobref) {</div><div class='add'>+            iobref = iobref_new();</div><div class='add'>+            if (!iobref) {</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='ctx'> </div><div class='del'>-        /* frame_mem_pool size 112 * 16k */</div><div class='del'>-        pool-&gt;frame_mem_pool = mem_pool_new (call_frame_t, 16384);</div><div class='add'>+            new_iobref = 1;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-        if (!pool-&gt;frame_mem_pool)</div><div class='del'>-                return -1;</div><div class='add'>+        iobref_add(iobref, iobuf);</div><div class='ctx'> </div><div class='del'>-        /* stack_mem_pool size 256 * 8k */</div><div class='del'>-        pool-&gt;stack_mem_pool = mem_pool_new (call_stack_t, 8192); </div><div class='add'>+        iov.iov_base = iobuf-&gt;ptr;</div><div class='add'>+        iov.iov_len = iobuf_size(iobuf);</div><div class='ctx'> </div><div class='del'>-        if (!pool-&gt;stack_mem_pool)</div><div class='del'>-                return -1;</div><div class='add'>+        /* Create the xdr payload */</div><div class='add'>+        ret = xdr_serialize_generic(iov, req, xdrproc);</div><div class='add'>+        if (ret == -1) {</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+        iov.iov_len = ret;</div><div class='add'>+        count = 1;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        ctx-&gt;stub_mem_pool = mem_pool_new (call_stub_t, 1024);</div><div class='del'>-        if (!ctx-&gt;stub_mem_pool)</div><div class='del'>-                return -1;</div><div class='add'>+    if (!rpc)</div><div class='add'>+        rpc = global_rpc;</div><div class='add'>+    /* Send the msg */</div><div class='add'>+    ret = rpc_clnt_submit(rpc, prog, procnum, cbkfn, &amp;iov, count, NULL, 0,</div><div class='add'>+                          iobref, frame, NULL, 0, NULL, 0, NULL);</div><div class='add'>+    ret = 0;</div><div class='ctx'> </div><div class='del'>-        INIT_LIST_HEAD (&amp;pool-&gt;all_frames);</div><div class='del'>-        LOCK_INIT (&amp;pool-&gt;lock);</div><div class='del'>-        ctx-&gt;pool = pool;</div><div class='add'>+out:</div><div class='add'>+    if (new_iobref)</div><div class='add'>+        iobref_unref(iobref);</div><div class='add'>+    if (iobuf)</div><div class='add'>+        iobuf_unref(iobuf);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        pthread_mutex_init (&amp;(ctx-&gt;lock), NULL);</div><div class='add'>+int</div><div class='add'>+cli_rpc_notify(struct rpc_clnt *rpc, void *mydata, rpc_clnt_event_t event,</div><div class='add'>+               void *data)</div><div class='add'>+{</div><div class='add'>+    xlator_t *this = NULL;</div><div class='add'>+    int ret = 0;</div><div class='ctx'> </div><div class='del'>-        cmd_args = &amp;ctx-&gt;cmd_args;</div><div class='add'>+    this = mydata;</div><div class='ctx'> </div><div class='del'>-        /* parsing command line arguments */</div><div class='del'>-        cmd_args-&gt;log_file  = "/dev/stderr";</div><div class='del'>-        cmd_args-&gt;log_level = GF_LOG_NONE;</div><div class='add'>+    switch (event) {</div><div class='add'>+        case RPC_CLNT_CONNECT: {</div><div class='add'>+            cli_cmd_broadcast_connected(_gf_true);</div><div class='add'>+            gf_log(this-&gt;name, GF_LOG_TRACE, "got RPC_CLNT_CONNECT");</div><div class='add'>+            break;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-        INIT_LIST_HEAD (&amp;cmd_args-&gt;xlator_options);</div><div class='add'>+        case RPC_CLNT_DISCONNECT: {</div><div class='add'>+            cli_cmd_broadcast_connected(_gf_false);</div><div class='add'>+            gf_log(this-&gt;name, GF_LOG_TRACE, "got RPC_CLNT_DISCONNECT");</div><div class='add'>+            if (!global_state-&gt;prompt &amp;&amp; global_state-&gt;await_connected) {</div><div class='add'>+                ret = 1;</div><div class='add'>+                cli_out(</div><div class='add'>+                    "Connection failed. Please check if gluster "</div><div class='add'>+                    "daemon is operational.");</div><div class='add'>+                exit(ret);</div><div class='add'>+            }</div><div class='add'>+            break;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-        lim.rlim_cur = RLIM_INFINITY;</div><div class='del'>-        lim.rlim_max = RLIM_INFINITY;</div><div class='del'>-        setrlimit (RLIMIT_CORE, &amp;lim);</div><div class='add'>+        default:</div><div class='add'>+            gf_log(this-&gt;name, GF_LOG_TRACE, "got some other RPC event %d",</div><div class='add'>+                   event);</div><div class='add'>+            ret = 0;</div><div class='add'>+            break;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        return 0;</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='del'>-static int</div><div class='del'>-logging_init (glusterfs_ctx_t *ctx)</div><div class='add'>+static gf_boolean_t</div><div class='add'>+is_valid_int(char *str)</div><div class='ctx'> {</div><div class='del'>-        cmd_args_t *cmd_args = NULL;</div><div class='del'>-</div><div class='del'>-        cmd_args = &amp;ctx-&gt;cmd_args;</div><div class='del'>-</div><div class='del'>-        if (gf_log_init (cmd_args-&gt;log_file) == -1) {</div><div class='del'>-                fprintf (stderr,</div><div class='del'>-                         "failed to open logfile %s.  exiting\n",</div><div class='del'>-                         cmd_args-&gt;log_file);</div><div class='del'>-                return -1;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        gf_log_set_loglevel (cmd_args-&gt;log_level);</div><div class='del'>-</div><div class='del'>-        return 0;</div><div class='add'>+    if (*str == '-')</div><div class='add'>+        ++str;</div><div class='add'>+</div><div class='add'>+    /* Handle empty string or just "-".*/</div><div class='add'>+    if (!*str)</div><div class='add'>+        return _gf_false;</div><div class='add'>+</div><div class='add'>+    /* Check for non-digit chars in the rest of the string */</div><div class='add'>+    while (*str) {</div><div class='add'>+        if (!isdigit(*str))</div><div class='add'>+            return _gf_false;</div><div class='add'>+        else</div><div class='add'>+            ++str;</div><div class='add'>+    }</div><div class='add'>+    return _gf_true;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+/*</div><div class='add'>+ * ret: 0: option successfully processed</div><div class='add'>+ *      1: signalling end of option list</div><div class='add'>+ *     -1: unknown option</div><div class='add'>+ *     -2: parsing issue (avoid unknown option error)</div><div class='add'>+ */</div><div class='ctx'> int</div><div class='del'>-cli_submit_request (void *req, call_frame_t *frame,</div><div class='del'>-                    rpc_clnt_prog_t *prog,</div><div class='del'>-                    int procnum, struct iobref *iobref,</div><div class='del'>-                    cli_serialize_t sfunc, xlator_t *this,</div><div class='del'>-                    fop_cbk_fn_t cbkfn)</div><div class='add'>+cli_opt_parse(char *opt, struct cli_state *state)</div><div class='ctx'> {</div><div class='del'>-        int                     ret         = -1;</div><div class='del'>-        int                     count      = 0;</div><div class='del'>-        char                    start_ping = 0;</div><div class='del'>-        struct iovec            iov         = {0, };</div><div class='del'>-        struct iobuf            *iobuf = NULL;</div><div class='del'>-        char                    new_iobref = 0;</div><div class='add'>+    char *oarg = NULL;</div><div class='add'>+    gf_boolean_t secure_mgmt_tmp = 0;</div><div class='add'>+</div><div class='add'>+    if (strcmp(opt, "") == 0)</div><div class='add'>+        return 1;</div><div class='add'>+    if (strcmp(opt, "help") == 0) {</div><div class='add'>+        cli_out(</div><div class='add'>+            " peer help                - display help for peer commands\n"</div><div class='add'>+            " volume help              - display help for volume commands\n"</div><div class='add'>+            " volume bitrot help       - display help for volume"</div><div class='add'>+            " bitrot commands\n"</div><div class='add'>+            " volume quota help        - display help for volume"</div><div class='add'>+            " quota commands\n"</div><div class='add'>+            " snapshot help            - display help for snapshot commands\n"</div><div class='add'>+            " global help              - list global commands\n");</div><div class='add'>+        exit(0);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (strcmp(opt, "version") == 0) {</div><div class='add'>+        cli_out("%s", argp_program_version);</div><div class='add'>+        exit(0);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (strcmp(opt, "print-logdir") == 0) {</div><div class='add'>+        cli_out("%s", DEFAULT_LOG_FILE_DIRECTORY);</div><div class='add'>+        exit(0);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (strcmp(opt, "print-statedumpdir") == 0) {</div><div class='add'>+        cli_out("%s", DEFAULT_VAR_RUN_DIRECTORY);</div><div class='add'>+        exit(0);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (strcmp(opt, "xml") == 0) {</div><div class='add'>+#if (HAVE_LIB_XML)</div><div class='add'>+        state-&gt;mode |= GLUSTER_MODE_XML;</div><div class='add'>+#else</div><div class='add'>+        cli_err("XML output not supported. Ignoring '--xml' option");</div><div class='add'>+#endif</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        GF_ASSERT (this);</div><div class='add'>+    if (strcmp(opt, "nolog") == 0) {</div><div class='add'>+        state-&gt;mode |= GLUSTER_MODE_GLFSHEAL_NOLOG;</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        iobuf = iobuf_get (this-&gt;ctx-&gt;iobuf_pool);</div><div class='del'>-        if (!iobuf) {</div><div class='del'>-                goto out;</div><div class='del'>-        };</div><div class='add'>+    if (strcmp(opt, "wignore-partition") == 0) {</div><div class='add'>+        state-&gt;mode |= GLUSTER_MODE_WIGNORE_PARTITION;</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        if (!iobref) {</div><div class='del'>-                iobref = iobref_new ();</div><div class='del'>-                if (!iobref) {</div><div class='del'>-                        goto out;</div><div class='del'>-                }</div><div class='add'>+    if (strcmp(opt, "wignore") == 0) {</div><div class='add'>+        state-&gt;mode |= GLUSTER_MODE_WIGNORE;</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-                new_iobref = 1;</div><div class='add'>+    oarg = strtail(opt, "mode=");</div><div class='add'>+    if (oarg) {</div><div class='add'>+        if (strcmp(oarg, "script") == 0) {</div><div class='add'>+            state-&gt;mode |= GLUSTER_MODE_SCRIPT;</div><div class='add'>+            return 0;</div><div class='ctx'>         }</div><div class='ctx'> </div><div class='del'>-        iobref_add (iobref, iobuf);</div><div class='add'>+        if (strcmp(oarg, "interactive") == 0)</div><div class='add'>+            return 0;</div><div class='ctx'> </div><div class='del'>-        iov.iov_base = iobuf-&gt;ptr;</div><div class='del'>-        iov.iov_len  = 128 * GF_UNIT_KB;</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='add'>+    oarg = strtail(opt, "remote-host=");</div><div class='add'>+    if (oarg) {</div><div class='add'>+        state-&gt;remote_host = oarg;</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        /* Create the xdr payload */</div><div class='del'>-        if (req &amp;&amp; sfunc) {</div><div class='del'>-                ret = sfunc (iov, req);</div><div class='del'>-                if (ret == -1) {</div><div class='del'>-                        goto out;</div><div class='del'>-                }</div><div class='del'>-                iov.iov_len = ret;</div><div class='del'>-                count = 1;</div><div class='del'>-        }</div><div class='add'>+    oarg = strtail(opt, "inet6");</div><div class='add'>+    if (oarg) {</div><div class='add'>+        state-&gt;address_family = "inet6";</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        /* Send the msg */</div><div class='del'>-        ret = rpc_clnt_submit (global_rpc, prog, procnum, cbkfn,</div><div class='del'>-                               &amp;iov, count,</div><div class='del'>-                               NULL, 0, iobref, frame, NULL, 0, NULL, 0, NULL);</div><div class='del'>-</div><div class='del'>-        if (ret == 0) {</div><div class='del'>-                pthread_mutex_lock (&amp;global_rpc-&gt;conn.lock);</div><div class='del'>-                {</div><div class='del'>-                        if (!global_rpc-&gt;conn.ping_started) {</div><div class='del'>-                                start_ping = 1;</div><div class='del'>-                        }</div><div class='del'>-                }</div><div class='del'>-                pthread_mutex_unlock (&amp;global_rpc-&gt;conn.lock);</div><div class='add'>+    oarg = strtail(opt, "log-file=");</div><div class='add'>+    if (oarg) {</div><div class='add'>+        state-&gt;log_file = oarg;</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='add'>+    oarg = strtail(opt, "timeout=");</div><div class='add'>+    if (oarg) {</div><div class='add'>+        if (!is_valid_int(oarg) || atoi(oarg) &lt;= 0) {</div><div class='add'>+            cli_err("timeout value should be a positive integer");</div><div class='add'>+            return -2; /* -2 instead of -1 to avoid unknown option</div><div class='add'>+                          error */</div><div class='ctx'>         }</div><div class='add'>+        cli_default_conn_timeout = atoi(oarg);</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    oarg = strtail(opt, "log-level=");</div><div class='add'>+    if (oarg) {</div><div class='add'>+        int log_level = glusterd_check_log_level(oarg);</div><div class='add'>+        if (log_level == -1)</div><div class='add'>+            return -1;</div><div class='add'>+        state-&gt;log_level = (gf_loglevel_t)log_level;</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        if (start_ping)</div><div class='del'>-                //client_start_ping ((void *) this);</div><div class='del'>-</div><div class='del'>-        ret = 0;</div><div class='add'>+    oarg = strtail(opt, "glusterd-sock=");</div><div class='add'>+    if (oarg) {</div><div class='add'>+        state-&gt;glusterd_sock = oarg;</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    oarg = strtail(opt, "secure-mgmt=");</div><div class='add'>+    if (oarg) {</div><div class='add'>+        if (gf_string2boolean(oarg, &amp;secure_mgmt_tmp) == 0) {</div><div class='add'>+            if (secure_mgmt_tmp) {</div><div class='add'>+                /* See declaration for why this is an int. */</div><div class='add'>+                state-&gt;ctx-&gt;secure_mgmt = 1;</div><div class='add'>+            }</div><div class='add'>+        } else {</div><div class='add'>+            cli_err("invalid secure-mgmt value (ignored)");</div><div class='add'>+        }</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-out:</div><div class='del'>-        return ret;</div><div class='add'>+    return -1;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-cli_rpc_notify (struct rpc_clnt *rpc, void *mydata, rpc_clnt_event_t event,</div><div class='del'>-                void *data)</div><div class='add'>+parse_cmdline(int argc, char *argv[], struct cli_state *state)</div><div class='ctx'> {</div><div class='del'>-        xlator_t                *this = NULL;</div><div class='del'>-        int                     ret = 0;</div><div class='del'>-</div><div class='del'>-        this = mydata;</div><div class='del'>-</div><div class='del'>-        switch (event) {</div><div class='del'>-        case RPC_CLNT_CONNECT:</div><div class='del'>-        {</div><div class='del'>-</div><div class='del'>-                cli_cmd_broadcast_connected ();</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_TRACE, "got RPC_CLNT_CONNECT");</div><div class='del'>-               break;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    int i = 0;</div><div class='add'>+    int j = 0;</div><div class='add'>+    char *opt = NULL;</div><div class='add'>+</div><div class='add'>+    state-&gt;argc = argc - 1;</div><div class='add'>+    state-&gt;argv = &amp;argv[1];</div><div class='add'>+</div><div class='add'>+    /* Do this first so that an option can override. */</div><div class='add'>+    if (sys_access(SECURE_ACCESS_FILE, F_OK) == 0) {</div><div class='add'>+        state-&gt;ctx-&gt;secure_mgmt = 1;</div><div class='add'>+        state-&gt;ctx-&gt;ssl_cert_depth = glusterfs_read_secure_access_file();</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (state-&gt;argc &gt; GEO_REP_CMD_CONFIG_INDEX &amp;&amp;</div><div class='add'>+        strtail(state-&gt;argv[GEO_REP_CMD_INDEX], "geo") &amp;&amp;</div><div class='add'>+        strtail(state-&gt;argv[GEO_REP_CMD_CONFIG_INDEX], "co"))</div><div class='add'>+        goto done;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; state-&gt;argc; i++) {</div><div class='add'>+        opt = strtail(state-&gt;argv[i], "--");</div><div class='add'>+        if (!opt)</div><div class='add'>+            continue;</div><div class='add'>+        ret = cli_opt_parse(opt, state);</div><div class='add'>+        if (ret == -1) {</div><div class='add'>+            cli_out("unrecognized option --%s\n", opt);</div><div class='add'>+            usage();</div><div class='add'>+            return ret;</div><div class='add'>+        } else if (ret == -2) {</div><div class='add'>+            return ret;</div><div class='ctx'>         }</div><div class='del'>-</div><div class='del'>-        case RPC_CLNT_DISCONNECT:</div><div class='del'>-        {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_TRACE, "got RPC_CLNT_DISCONNECT");</div><div class='del'>-                connected = 0;</div><div class='del'>-                break;</div><div class='add'>+        for (j = i; j &lt; state-&gt;argc - 1; j++)</div><div class='add'>+            state-&gt;argv[j] = state-&gt;argv[j + 1];</div><div class='add'>+        state-&gt;argc--;</div><div class='add'>+        /* argv shifted, next check should be at i again */</div><div class='add'>+        i--;</div><div class='add'>+        if (ret == 1) {</div><div class='add'>+            /* end of cli options */</div><div class='add'>+            ret = 0;</div><div class='add'>+            break;</div><div class='ctx'>         }</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        default:</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_TRACE,</div><div class='del'>-                        "got some other RPC event %d", event);</div><div class='del'>-                ret = 0;</div><div class='del'>-                break;</div><div class='del'>-        }</div><div class='add'>+done:</div><div class='add'>+    state-&gt;argv[state-&gt;argc] = NULL;</div><div class='ctx'> </div><div class='del'>-        return ret;</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-parse_cmdline (int argc, char *argv[], struct cli_state *state)</div><div class='add'>+cli_cmd_tree_init(struct cli_cmd_tree *tree)</div><div class='ctx'> {</div><div class='del'>-        int         ret = 0;</div><div class='add'>+    struct cli_cmd_word *root = NULL;</div><div class='add'>+    int ret = 0;</div><div class='ctx'> </div><div class='del'>-	state-&gt;argc=argc-1;</div><div class='del'>-        state-&gt;argv=&amp;argv[1];</div><div class='add'>+    root = &amp;tree-&gt;root;</div><div class='add'>+    root-&gt;tree = tree;</div><div class='ctx'> </div><div class='del'>-        return ret;</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-cli_cmd_tree_init (struct cli_cmd_tree *tree)</div><div class='add'>+cli_state_init(struct cli_state *state)</div><div class='ctx'> {</div><div class='del'>-        struct cli_cmd_word  *root = NULL;</div><div class='del'>-        int                   ret = 0;</div><div class='add'>+    struct cli_cmd_tree *tree = NULL;</div><div class='add'>+    int ret = 0;</div><div class='ctx'> </div><div class='del'>-        root = &amp;tree-&gt;root;</div><div class='del'>-        root-&gt;tree = tree;</div><div class='add'>+    state-&gt;log_level = GF_LOG_NONE;</div><div class='ctx'> </div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='add'>+    tree = &amp;state-&gt;tree;</div><div class='add'>+    tree-&gt;state = state;</div><div class='ctx'> </div><div class='add'>+    ret = cli_cmd_tree_init(tree);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-cli_state_init (struct cli_state *state)</div><div class='add'>+cli_usage_out(const char *usage)</div><div class='ctx'> {</div><div class='del'>-        struct cli_cmd_tree  *tree = NULL;</div><div class='del'>-        int                   ret = 0;</div><div class='del'>-</div><div class='del'>-        tree = &amp;state-&gt;tree;</div><div class='del'>-        tree-&gt;state = state;</div><div class='add'>+    GF_ASSERT(usage);</div><div class='ctx'> </div><div class='del'>-        ret = cli_cmd_tree_init (tree);</div><div class='add'>+    if (!usage || usage[0] == '\0')</div><div class='add'>+        return -1;</div><div class='ctx'> </div><div class='del'>-        return ret;</div><div class='add'>+    cli_err("\nUsage:\n%s\n", usage);</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-cli_out (const char *fmt, ...)</div><div class='add'>+_cli_err(const char *fmt, ...)</div><div class='ctx'> {</div><div class='del'>-        struct cli_state *state = NULL;</div><div class='del'>-        va_list           ap;</div><div class='del'>-        int               ret = 0;</div><div class='del'>-</div><div class='del'>-        state = global_state;</div><div class='add'>+    va_list ap;</div><div class='add'>+    int ret = 0;</div><div class='add'>+#ifdef HAVE_READLINE</div><div class='add'>+    struct cli_state *state = global_state;</div><div class='add'>+#endif</div><div class='ctx'> </div><div class='del'>-        va_start (ap, fmt);</div><div class='add'>+    va_start(ap, fmt);</div><div class='ctx'> </div><div class='ctx'> #ifdef HAVE_READLINE</div><div class='del'>-        if (state-&gt;rl_enabled &amp;&amp; !state-&gt;rl_processing)</div><div class='del'>-                return cli_rl_out(state, fmt, ap);</div><div class='add'>+    if (state-&gt;rl_enabled &amp;&amp; !state-&gt;rl_processing) {</div><div class='add'>+        ret = cli_rl_err(state, fmt, ap);</div><div class='add'>+        va_end(ap);</div><div class='add'>+        return ret;</div><div class='add'>+    }</div><div class='ctx'> #endif</div><div class='ctx'> </div><div class='del'>-        ret = vprintf (fmt, ap);</div><div class='del'>-        printf ("\n");</div><div class='add'>+    ret = vfprintf(stderr, fmt, ap);</div><div class='add'>+    fprintf(stderr, "\n");</div><div class='add'>+    va_end(ap);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+_cli_out(const char *fmt, ...)</div><div class='add'>+{</div><div class='add'>+    va_list ap;</div><div class='add'>+    int ret = 0;</div><div class='add'>+#ifdef HAVE_READLINE</div><div class='add'>+    struct cli_state *state = global_state;</div><div class='add'>+#endif</div><div class='ctx'> </div><div class='add'>+    va_start(ap, fmt);</div><div class='add'>+#ifdef HAVE_READLINE</div><div class='add'>+    if (state-&gt;rl_enabled &amp;&amp; !state-&gt;rl_processing) {</div><div class='add'>+        ret = cli_rl_out(state, fmt, ap);</div><div class='add'>+        va_end(ap);</div><div class='ctx'>         return ret;</div><div class='add'>+    }</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+    ret = vprintf(fmt, ap);</div><div class='add'>+    printf("\n");</div><div class='add'>+    va_end(ap);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> struct rpc_clnt *</div><div class='del'>-cli_rpc_init (struct cli_state *state)</div><div class='add'>+cli_quotad_clnt_rpc_init(void)</div><div class='ctx'> {</div><div class='del'>-        struct rpc_clnt         *rpc = NULL;</div><div class='del'>-        struct rpc_clnt_config  rpc_cfg = {0,};</div><div class='del'>-        dict_t                  *options = NULL;</div><div class='del'>-        int                     ret = -1;</div><div class='del'>-        int                     port = CLI_GLUSTERD_PORT;</div><div class='del'>-        xlator_t                *this = NULL;</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-        this = THIS;</div><div class='del'>-        cli_rpc_prog = &amp;cli3_1_prog;</div><div class='del'>-        options = dict_new ();</div><div class='del'>-        if (!options)</div><div class='del'>-                goto out;</div><div class='add'>+    struct rpc_clnt *rpc = NULL;</div><div class='add'>+    dict_t *rpc_opts = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    rpc_opts = dict_new();</div><div class='add'>+    if (!rpc_opts) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_set_str(rpc_opts, "transport.address-family", "unix");</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    ret = dict_set_str(rpc_opts, "transport-type", "socket");</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    ret = dict_set_str(rpc_opts, "transport.socket.connect-path",</div><div class='add'>+                       "/var/run/gluster/quotad.socket");</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    rpc = cli_quotad_clnt_init(THIS, rpc_opts);</div><div class='add'>+    if (!rpc)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    global_quotad_rpc = rpc;</div><div class='add'>+out:</div><div class='add'>+    if (rpc_opts) {</div><div class='add'>+        dict_unref(rpc_opts);</div><div class='add'>+    }</div><div class='add'>+    return rpc;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        ret = dict_set_str (options, "remote-host", "localhost");</div><div class='add'>+struct rpc_clnt *</div><div class='add'>+cli_rpc_init(struct cli_state *state)</div><div class='add'>+{</div><div class='add'>+    struct rpc_clnt *rpc = NULL;</div><div class='add'>+    dict_t *options = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int port = CLI_GLUSTERD_PORT;</div><div class='add'>+    xlator_t *this = NULL;</div><div class='add'>+#ifdef IPV6_DEFAULT</div><div class='add'>+    char *addr_family = "inet6";</div><div class='add'>+#else</div><div class='add'>+    char *addr_family = "inet";</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+    this = THIS;</div><div class='add'>+    cli_rpc_prog = &amp;cli_prog;</div><div class='add'>+</div><div class='add'>+    options = dict_new();</div><div class='add'>+    if (!options)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    /* If address family specified in CLI */</div><div class='add'>+    if (state-&gt;address_family) {</div><div class='add'>+        addr_family = state-&gt;address_family;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Connect to glusterd using the specified method, giving preference</div><div class='add'>+     * to a unix socket connection.  If nothing is specified, connect to</div><div class='add'>+     * the default glusterd socket.</div><div class='add'>+     */</div><div class='add'>+    if (state-&gt;glusterd_sock) {</div><div class='add'>+        gf_log("cli", GF_LOG_INFO,</div><div class='add'>+               "Connecting to glusterd using "</div><div class='add'>+               "sockfile %s",</div><div class='add'>+               state-&gt;glusterd_sock);</div><div class='add'>+        ret = rpc_transport_unix_options_build(options, state-&gt;glusterd_sock,</div><div class='add'>+                                               0);</div><div class='ctx'>         if (ret)</div><div class='del'>-                goto out;</div><div class='add'>+            goto out;</div><div class='add'>+    } else if (state-&gt;remote_host) {</div><div class='add'>+        gf_log("cli", GF_LOG_INFO,</div><div class='add'>+               "Connecting to remote glusterd at "</div><div class='add'>+               "%s",</div><div class='add'>+               state-&gt;remote_host);</div><div class='add'>+</div><div class='add'>+        ret = dict_set_str(options, "remote-host", state-&gt;remote_host);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='ctx'> </div><div class='ctx'>         if (state-&gt;remote_port)</div><div class='del'>-                port = state-&gt;remote_port;</div><div class='del'>-</div><div class='del'>-        rpc_cfg.remote_host = "localhost";</div><div class='del'>-        rpc_cfg.remote_port = port;</div><div class='add'>+            port = state-&gt;remote_port;</div><div class='ctx'> </div><div class='del'>-        ret = dict_set_int32 (options, "remote-port", port);</div><div class='add'>+        ret = dict_set_int32(options, "remote-port", port);</div><div class='ctx'>         if (ret)</div><div class='del'>-                goto out;</div><div class='add'>+            goto out;</div><div class='ctx'> </div><div class='del'>-        ret = dict_set_str (options, "transport.address-family", "inet");</div><div class='add'>+        ret = dict_set_str(options, "transport.address-family", addr_family);</div><div class='ctx'>         if (ret)</div><div class='del'>-                goto out;</div><div class='add'>+            goto out;</div><div class='add'>+    } else {</div><div class='add'>+        gf_log("cli", GF_LOG_DEBUG,</div><div class='add'>+               "Connecting to glusterd using "</div><div class='add'>+               "default socket");</div><div class='add'>+        ret = rpc_transport_unix_options_build(options,</div><div class='add'>+                                               DEFAULT_GLUSTERD_SOCKFILE, 0);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        rpc = rpc_clnt_init (&amp;rpc_cfg, options, this-&gt;ctx, this-&gt;name);</div><div class='add'>+    rpc = rpc_clnt_new(options, this, this-&gt;name, 16);</div><div class='add'>+    if (!rpc)</div><div class='add'>+        goto out;</div><div class='ctx'> </div><div class='del'>-        if (rpc) {</div><div class='del'>-                ret = rpc_clnt_register_notify (rpc, cli_rpc_notify, this);</div><div class='del'>-        }</div><div class='add'>+    ret = rpc_clnt_register_notify(rpc, cli_rpc_notify, this);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log("cli", GF_LOG_ERROR, "failed to register notify");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = rpc_clnt_start(rpc);</div><div class='ctx'> out:</div><div class='del'>-        return rpc;</div><div class='add'>+    if (options)</div><div class='add'>+        dict_unref(options);</div><div class='add'>+</div><div class='add'>+    if (ret) {</div><div class='add'>+        if (rpc)</div><div class='add'>+            rpc_clnt_unref(rpc);</div><div class='add'>+        rpc = NULL;</div><div class='add'>+    }</div><div class='add'>+    return rpc;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> cli_local_t *</div><div class='del'>-cli_local_get ()</div><div class='add'>+cli_local_get()</div><div class='ctx'> {</div><div class='del'>-        cli_local_t     *local = NULL;</div><div class='add'>+    cli_local_t *local = NULL;</div><div class='ctx'> </div><div class='del'>-        local = GF_CALLOC (1, sizeof (*local), cli_mt_cli_local_t);</div><div class='add'>+    local = GF_CALLOC(1, sizeof(*local), cli_mt_cli_local_t);</div><div class='add'>+    LOCK_INIT(&amp;local-&gt;lock);</div><div class='add'>+    INIT_LIST_HEAD(&amp;local-&gt;dict_list);</div><div class='ctx'> </div><div class='del'>-        return local;</div><div class='add'>+    return local;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> void</div><div class='del'>-cli_local_wipe (cli_local_t *local)</div><div class='add'>+cli_local_wipe(cli_local_t *local)</div><div class='ctx'> {</div><div class='del'>-        if (local) {</div><div class='del'>-                GF_FREE (local);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        return;</div><div class='add'>+    if (local) {</div><div class='add'>+        GF_FREE(local-&gt;get_vol.volname);</div><div class='add'>+        if (local-&gt;dict)</div><div class='add'>+            dict_unref(local-&gt;dict);</div><div class='add'>+        GF_FREE(local);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> struct cli_state *global_state;</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-main (int argc, char *argv[])</div><div class='add'>+main(int argc, char *argv[])</div><div class='ctx'> {</div><div class='del'>-        struct cli_state   state = {0, };</div><div class='del'>-        int                ret = -1;</div><div class='del'>-        glusterfs_ctx_t   *ctx = NULL;</div><div class='add'>+    struct cli_state state = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int ret = -1;</div><div class='add'>+    glusterfs_ctx_t *ctx = NULL;</div><div class='ctx'> </div><div class='del'>-        if (geteuid ()) {</div><div class='del'>-                printf ("Only super user can run this command\n");</div><div class='del'>-                return EPERM;</div><div class='del'>-        }</div><div class='add'>+    mem_pools_init();</div><div class='ctx'> </div><div class='del'>-        ret = glusterfs_globals_init ();</div><div class='del'>-        if (ret)</div><div class='del'>-                return ret;</div><div class='add'>+    ctx = glusterfs_ctx_new();</div><div class='add'>+    if (!ctx)</div><div class='add'>+        return ENOMEM;</div><div class='ctx'> </div><div class='del'>-        ctx = glusterfs_ctx_get ();</div><div class='del'>-        if (!ctx)</div><div class='del'>-                return ENOMEM;</div><div class='add'>+#ifdef DEBUG</div><div class='add'>+    gf_mem_acct_enable_set(ctx);</div><div class='add'>+#endif</div><div class='ctx'> </div><div class='del'>-        ret = glusterfs_ctx_defaults_init (ctx);</div><div class='del'>-        if (ret)</div><div class='del'>-                goto out;</div><div class='add'>+    ret = glusterfs_globals_init(ctx);</div><div class='add'>+    if (ret)</div><div class='add'>+        return ret;</div><div class='ctx'> </div><div class='del'>-        ret = cli_state_init (&amp;state);</div><div class='del'>-        if (ret)</div><div class='del'>-                goto out;</div><div class='add'>+    THIS-&gt;ctx = ctx;</div><div class='ctx'> </div><div class='del'>-        global_rpc = cli_rpc_init (&amp;state);</div><div class='del'>-        if (!global_rpc)</div><div class='del'>-                goto out;</div><div class='add'>+    ret = glusterfs_ctx_defaults_init(ctx);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='ctx'> </div><div class='del'>-        state.ctx = ctx;</div><div class='del'>-        global_state = &amp;state;</div><div class='add'>+    cli_default_conn_timeout = 120;</div><div class='add'>+    cli_ten_minutes_timeout = 600;</div><div class='ctx'> </div><div class='del'>-        ret = parse_cmdline (argc, argv, &amp;state);</div><div class='del'>-        if (ret)</div><div class='del'>-                goto out;</div><div class='add'>+    ret = cli_state_init(&amp;state);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='ctx'> </div><div class='del'>-        ret = logging_init (ctx);</div><div class='del'>-        if (ret)</div><div class='del'>-                goto out;</div><div class='add'>+    state.ctx = ctx;</div><div class='add'>+    global_state = &amp;state;</div><div class='ctx'> </div><div class='del'>-        ret = cli_cmds_register (&amp;state);</div><div class='del'>-        if (ret)</div><div class='del'>-                goto out;</div><div class='add'>+    ret = parse_cmdline(argc, argv, &amp;state);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='ctx'> </div><div class='del'>-        ret = cli_cmd_cond_init ();</div><div class='del'>-        if (ret)</div><div class='del'>-                goto out;</div><div class='add'>+    ret = logging_init(ctx, &amp;state);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='ctx'> </div><div class='del'>-        ret = cli_input_init (&amp;state);</div><div class='del'>-        if (ret)</div><div class='del'>-                goto out;</div><div class='add'>+    gf_log("cli", GF_LOG_INFO, "Started running %s with version %s", argv[0],</div><div class='add'>+           PACKAGE_VERSION);</div><div class='add'>+</div><div class='add'>+    global_rpc = cli_rpc_init(&amp;state);</div><div class='add'>+    if (!global_rpc)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    global_quotad_rpc = cli_quotad_clnt_rpc_init();</div><div class='add'>+    if (!global_quotad_rpc)</div><div class='add'>+        goto out;</div><div class='ctx'> </div><div class='del'>-        ret = event_dispatch (ctx-&gt;event_pool);</div><div class='add'>+    ret = cli_cmds_register(&amp;state);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    ret = cli_input_init(&amp;state);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    ret = gf_event_dispatch(ctx-&gt;event_pool);</div><div class='ctx'> </div><div class='ctx'> out:</div><div class='del'>-//        glusterfs_ctx_destroy (ctx);</div><div class='add'>+    //        glusterfs_ctx_destroy (ctx);</div><div class='ctx'> </div><div class='del'>-        return ret;</div><div class='add'>+    mem_pools_fini();</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+cli_print_line(int len)</div><div class='add'>+{</div><div class='add'>+    GF_ASSERT(len &gt; 0);</div><div class='add'>+</div><div class='add'>+    while (len--)</div><div class='add'>+        printf("-");</div><div class='add'>+</div><div class='add'>+    printf("\n");</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+print_quota_list_header(int type)</div><div class='add'>+{</div><div class='add'>+    if (type == GF_QUOTA_OPTION_TYPE_LIST) {</div><div class='add'>+        cli_out(</div><div class='add'>+            "                  Path                   Hard-limit "</div><div class='add'>+            " Soft-limit      Used  Available  Soft-limit "</div><div class='add'>+            "exceeded? Hard-limit exceeded?");</div><div class='add'>+        cli_out(</div><div class='add'>+            "-----------------------------------------------------"</div><div class='add'>+            "-----------------------------------------------------"</div><div class='add'>+            "---------------------");</div><div class='add'>+    } else {</div><div class='add'>+        cli_out(</div><div class='add'>+            "                  Path                   Hard-limit  "</div><div class='add'>+            " Soft-limit      Files       Dirs     Available  "</div><div class='add'>+            "Soft-limit exceeded? Hard-limit exceeded?");</div><div class='add'>+        cli_out(</div><div class='add'>+            "-----------------------------------------------------"</div><div class='add'>+            "-----------------------------------------------------"</div><div class='add'>+            "-------------------------------------");</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+print_quota_list_empty(char *path, int type)</div><div class='add'>+{</div><div class='add'>+    if (type == GF_QUOTA_OPTION_TYPE_LIST)</div><div class='add'>+        cli_out("%-40s %7s %9s %10s %7s %15s %20s", path, "N/A", "N/A", "N/A",</div><div class='add'>+                "N/A", "N/A", "N/A");</div><div class='add'>+    else</div><div class='add'>+        cli_out("%-40s %9s %9s %12s %10s %10s %15s %20s", path, "N/A", "N/A",</div><div class='add'>+                "N/A", "N/A", "N/A", "N/A", "N/A");</div><div class='ctx'> }</div><div class='head'>diff --git a/cli/src/cli.h b/cli/src/cli.h<br/>index eaa638c29d6..c0d933e8f8a 100644<br/>--- a/<a href='/cgit/glusterfs.git/tree/cli/src/cli.h?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>cli/src/cli.h</a><br/>+++ b/<a href='/cgit/glusterfs.git/tree/cli/src/cli.h?id=d1d7a6f35c816822fab51c820e25023863c239c1'>cli/src/cli.h</a></div><div class='hunk'>@@ -1,209 +1,516 @@</div><div class='ctx'> /*</div><div class='del'>-   Copyright (c) 2006-2009 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='add'>+   Copyright (c) 2006-2012 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='ctx'>    This file is part of GlusterFS.</div><div class='ctx'> </div><div class='del'>-   GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-   it under the terms of the GNU Affero General Public License as published</div><div class='del'>-   by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-   or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-   GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-   WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-   Affero General Public License for more details.</div><div class='del'>-</div><div class='del'>-   You should have received a copy of the GNU Affero General Public License</div><div class='del'>-   along with this program.  If not, see</div><div class='del'>-   &lt;http://www.gnu.org/licenses/&gt;.</div><div class='add'>+   This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+   General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+   later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+   cases as published by the Free Software Foundation.</div><div class='ctx'> */</div><div class='del'>-</div><div class='ctx'> #ifndef __CLI_H__</div><div class='ctx'> #define __CLI_H__</div><div class='ctx'> </div><div class='del'>-#ifndef _CONFIG_H</div><div class='del'>-#define _CONFIG_H</div><div class='del'>-#include "config.h"</div><div class='del'>-#endif</div><div class='del'>-</div><div class='ctx'> #include "rpc-clnt.h"</div><div class='del'>-#include "glusterfs.h"</div><div class='add'>+#include &lt;glusterfs/glusterfs.h&gt;</div><div class='ctx'> #include "protocol-common.h"</div><div class='add'>+#include &lt;glusterfs/logging.h&gt;</div><div class='add'>+#include &lt;glusterfs/quota-common-utils.h&gt;</div><div class='ctx'> </div><div class='del'>-#define DEFAULT_EVENT_POOL_SIZE            16384</div><div class='del'>-#define CLI_GLUSTERD_PORT                   6969</div><div class='del'>-#define CLI_DEFAULT_CONN_TIMEOUT             120</div><div class='del'>-#define CLI_DEFAULT_CMD_TIMEOUT              120</div><div class='add'>+#include "cli1-xdr.h"</div><div class='add'>+#include "gd-common-utils.h"</div><div class='add'>+</div><div class='add'>+#if (HAVE_LIB_XML)</div><div class='add'>+#include &lt;libxml/encoding.h&gt;</div><div class='add'>+#include &lt;libxml/xmlwriter.h&gt;</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#define DEFAULT_EVENT_POOL_SIZE 16384</div><div class='add'>+#define CLI_GLUSTERD_PORT 24007</div><div class='add'>+#define DEFAULT_CLI_LOG_FILE_DIRECTORY DATADIR "/log/glusterfs"</div><div class='add'>+#define CLI_VOL_STATUS_BRICK_LEN 43</div><div class='add'>+#define CLI_TAB_LENGTH 8</div><div class='add'>+#define CLI_BRICK_STATUS_LINE_LEN 78</div><div class='add'>+</div><div class='add'>+/* Geo-rep command positional arguments' index  */</div><div class='add'>+#define GEO_REP_CMD_INDEX 1</div><div class='add'>+#define GEO_REP_CMD_CONFIG_INDEX 4</div><div class='ctx'> </div><div class='ctx'> enum argp_option_keys {</div><div class='del'>-	ARGP_DEBUG_KEY = 133,</div><div class='del'>-	ARGP_PORT_KEY = 'p',</div><div class='add'>+    ARGP_DEBUG_KEY = 133,</div><div class='add'>+    ARGP_PORT_KEY = 'p',</div><div class='ctx'> };</div><div class='ctx'> </div><div class='del'>-enum gluster_mode {</div><div class='del'>-        GLUSTER_MODE_SCRIPT = 1</div><div class='del'>-};</div><div class='add'>+extern int cli_default_conn_timeout;</div><div class='add'>+extern int cli_ten_minutes_timeout;</div><div class='add'>+</div><div class='add'>+typedef enum {</div><div class='add'>+    COLD_BRICK_COUNT,</div><div class='add'>+    COLD_TYPE,</div><div class='add'>+    COLD_DIST_COUNT,</div><div class='add'>+    COLD_REPLICA_COUNT,</div><div class='add'>+    COLD_ARBITER_COUNT,</div><div class='add'>+    COLD_DISPERSE_COUNT,</div><div class='add'>+    COLD_REDUNDANCY_COUNT,</div><div class='add'>+    HOT_BRICK_COUNT,</div><div class='add'>+    HOT_TYPE,</div><div class='add'>+    HOT_REPLICA_COUNT,</div><div class='add'>+    MAX</div><div class='add'>+} values;</div><div class='add'>+</div><div class='add'>+#define GLUSTER_MODE_SCRIPT (1 &lt;&lt; 0)</div><div class='add'>+#define GLUSTER_MODE_ERR_FATAL (1 &lt;&lt; 1)</div><div class='add'>+#define GLUSTER_MODE_XML (1 &lt;&lt; 2)</div><div class='add'>+#define GLUSTER_MODE_WIGNORE (1 &lt;&lt; 3)</div><div class='add'>+#define GLUSTER_MODE_WIGNORE_PARTITION (1 &lt;&lt; 4)</div><div class='add'>+#define GLUSTER_MODE_GLFSHEAL_NOLOG (1 &lt;&lt; 5)</div><div class='add'>+</div><div class='add'>+#define GLUSTERD_GET_QUOTA_LIST_MOUNT_PATH(abspath, volname, path)             \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        snprintf(abspath, sizeof(abspath) - 1,                                 \</div><div class='add'>+                 DEFAULT_VAR_RUN_DIRECTORY "/%s_quota_list%s", volname, path); \</div><div class='add'>+    } while (0)</div><div class='add'>+</div><div class='ctx'> struct cli_state;</div><div class='ctx'> struct cli_cmd_word;</div><div class='ctx'> struct cli_cmd_tree;</div><div class='add'>+struct cli_cmd;</div><div class='add'>+</div><div class='add'>+extern char *cli_vol_status_str[];</div><div class='add'>+extern char *cli_vol_task_status_str[];</div><div class='add'>+</div><div class='add'>+typedef int(cli_cmd_cbk_t)(struct cli_state *state, struct cli_cmd_word *word,</div><div class='add'>+                           const char **words, int wordcount);</div><div class='add'>+typedef void(cli_cmd_reg_cbk_t)(struct cli_cmd *this);</div><div class='ctx'> </div><div class='del'>-typedef int (cli_cmd_cbk_t)(struct cli_state *state,</div><div class='del'>-                            struct cli_cmd_word *word,</div><div class='del'>-                            const char **words,</div><div class='del'>-                            int wordcount);</div><div class='del'>-typedef int (cli_cmd_match_t)(struct cli_cmd_word *word);</div><div class='del'>-typedef int (cli_cmd_filler_t)(struct cli_cmd_word *word);</div><div class='add'>+typedef int(cli_cmd_match_t)(struct cli_cmd_word *word);</div><div class='add'>+typedef int(cli_cmd_filler_t)(struct cli_cmd_word *word);</div><div class='ctx'> </div><div class='ctx'> struct cli_cmd_word {</div><div class='del'>-        struct cli_cmd_tree   *tree;</div><div class='del'>-        const char            *word;</div><div class='del'>-        cli_cmd_filler_t      *filler;</div><div class='del'>-        cli_cmd_match_t       *match;</div><div class='del'>-        cli_cmd_cbk_t         *cbkfn;</div><div class='del'>-        const char            *desc;</div><div class='del'>-</div><div class='del'>-        int                    nextwords_cnt;</div><div class='del'>-        struct cli_cmd_word  **nextwords;</div><div class='add'>+    struct cli_cmd_tree *tree;</div><div class='add'>+    const char *word;</div><div class='add'>+    cli_cmd_filler_t *filler;</div><div class='add'>+    cli_cmd_match_t *match;</div><div class='add'>+    cli_cmd_cbk_t *cbkfn;</div><div class='add'>+    const char *desc;</div><div class='add'>+    const char *pattern;</div><div class='add'>+    int nextwords_cnt;</div><div class='add'>+    struct cli_cmd_word **nextwords;</div><div class='ctx'> };</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> struct cli_cmd_tree {</div><div class='del'>-        struct cli_state      *state;</div><div class='del'>-        struct cli_cmd_word    root;</div><div class='add'>+    struct cli_state *state;</div><div class='add'>+    struct cli_cmd_word root;</div><div class='ctx'> };</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> struct cli_state {</div><div class='del'>-        int                   argc;</div><div class='del'>-        char                **argv;</div><div class='add'>+    int argc;</div><div class='add'>+    char **argv;</div><div class='ctx'> </div><div class='del'>-        char                  debug;</div><div class='add'>+    char debug;</div><div class='ctx'> </div><div class='del'>-        /* for events dispatching */</div><div class='del'>-        glusterfs_ctx_t      *ctx;</div><div class='add'>+    /* for events dispatching */</div><div class='add'>+    glusterfs_ctx_t *ctx;</div><div class='ctx'> </div><div class='del'>-        /* registry of known commands */</div><div class='del'>-        struct cli_cmd_tree   tree;</div><div class='add'>+    /* registry of known commands */</div><div class='add'>+    struct cli_cmd_tree tree;</div><div class='ctx'> </div><div class='del'>-        /* the thread which "executes" the command in non-interactive mode */</div><div class='del'>-        /* also the thread which reads from stdin in non-readline mode */</div><div class='del'>-        pthread_t             input;</div><div class='add'>+    /* the thread which "executes" the command in non-interactive mode */</div><div class='add'>+    /* also the thread which reads from stdin in non-readline mode */</div><div class='add'>+    pthread_t input;</div><div class='ctx'> </div><div class='del'>-        /* terminal I/O */</div><div class='del'>-        const char           *prompt;</div><div class='del'>-        int                   rl_enabled;</div><div class='del'>-        int                   rl_async;</div><div class='del'>-        int                   rl_processing;</div><div class='add'>+    /* terminal I/O */</div><div class='add'>+    const char *prompt;</div><div class='add'>+    int rl_enabled;</div><div class='add'>+    int rl_async;</div><div class='add'>+    int rl_processing;</div><div class='ctx'> </div><div class='del'>-        /* autocompletion state */</div><div class='del'>-        char                **matches;</div><div class='del'>-        char                **matchesp;</div><div class='add'>+    /* autocompletion state */</div><div class='add'>+    char **matches;</div><div class='add'>+    char **matchesp;</div><div class='ctx'> </div><div class='del'>-        int                   remote_port;</div><div class='del'>-        int                   mode;</div><div class='add'>+    char *remote_host;</div><div class='add'>+    int remote_port;</div><div class='add'>+    int mode;</div><div class='add'>+    int await_connected;</div><div class='add'>+</div><div class='add'>+    char *log_file;</div><div class='add'>+    gf_loglevel_t log_level;</div><div class='add'>+</div><div class='add'>+    char *glusterd_sock;</div><div class='add'>+    char *address_family;</div><div class='ctx'> };</div><div class='ctx'> </div><div class='ctx'> struct cli_local {</div><div class='del'>-        union {</div><div class='del'>-                struct {</div><div class='del'>-                        dict_t  *dict;</div><div class='del'>-                } create_vol;</div><div class='del'>-</div><div class='del'>-                struct {</div><div class='del'>-                        char    *volname;</div><div class='del'>-                } start_vol;</div><div class='del'>-</div><div class='del'>-                struct {</div><div class='del'>-                        char    *volname;</div><div class='del'>-                        int     flags;</div><div class='del'>-                } stop_vol;</div><div class='del'>-</div><div class='del'>-                struct {</div><div class='del'>-                        char    *volname;</div><div class='del'>-                } delete_vol;</div><div class='del'>-</div><div class='del'>-                struct {</div><div class='del'>-                        char    *volname;</div><div class='del'>-                        int      cmd;</div><div class='del'>-                } defrag_vol;</div><div class='del'>-</div><div class='del'>-                struct {</div><div class='del'>-                        char    *volname;</div><div class='del'>-                        dict_t  *dict;</div><div class='del'>-                } replace_brick;</div><div class='del'>-</div><div class='del'>-                struct {</div><div class='del'>-                        char    *volname;</div><div class='del'>-                        int     flags;</div><div class='del'>-                } get_vol;</div><div class='del'>-        } u;</div><div class='add'>+    struct {</div><div class='add'>+        char *volname;</div><div class='add'>+        int flags;</div><div class='add'>+    } get_vol;</div><div class='add'>+</div><div class='add'>+    dict_t *dict;</div><div class='add'>+    const char **words;</div><div class='add'>+    /* Marker for volume status all */</div><div class='add'>+    gf_boolean_t all;</div><div class='add'>+#if (HAVE_LIB_XML)</div><div class='add'>+    xmlTextWriterPtr writer;</div><div class='add'>+    xmlDocPtr doc;</div><div class='add'>+    int vol_count;</div><div class='add'>+#endif</div><div class='add'>+    gf_lock_t lock;</div><div class='add'>+    struct list_head dict_list;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct cli_volume_status {</div><div class='add'>+    int port;</div><div class='add'>+    int rdma_port;</div><div class='add'>+    int online;</div><div class='add'>+    uint64_t block_size;</div><div class='add'>+    uint64_t total_inodes;</div><div class='add'>+    uint64_t free_inodes;</div><div class='add'>+    char *brick;</div><div class='add'>+    char *pid_str;</div><div class='add'>+    char *free;</div><div class='add'>+    char *total;</div><div class='add'>+    char *fs_name;</div><div class='add'>+    char *mount_options;</div><div class='add'>+    char *device;</div><div class='add'>+    char *inode_size;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct snap_config_opt_vals_ {</div><div class='add'>+    char *op_name;</div><div class='add'>+    char *question;</div><div class='ctx'> };</div><div class='ctx'> </div><div class='add'>+typedef struct cli_volume_status cli_volume_status_t;</div><div class='add'>+</div><div class='ctx'> typedef struct cli_local cli_local_t;</div><div class='ctx'> </div><div class='del'>-typedef ssize_t (*cli_serialize_t) (struct iovec outmsg, void *args);</div><div class='add'>+typedef ssize_t (*cli_serialize_t)(struct iovec outmsg, void *args);</div><div class='ctx'> </div><div class='ctx'> extern struct cli_state *global_state; /* use only in readline callback */</div><div class='ctx'> </div><div class='del'>-int cli_cmd_register (struct cli_cmd_tree *tree, const char *template,</div><div class='del'>-                      cli_cmd_cbk_t cbk, const char *desc);</div><div class='del'>-int cli_cmds_register (struct cli_state *state);</div><div class='add'>+extern struct rpc_clnt *global_quotad_rpc;</div><div class='add'>+</div><div class='add'>+extern struct rpc_clnt *global_rpc;</div><div class='ctx'> </div><div class='del'>-int cli_input_init (struct cli_state *state);</div><div class='add'>+extern rpc_clnt_prog_t *cli_rpc_prog;</div><div class='ctx'> </div><div class='del'>-int cli_cmd_process (struct cli_state *state, int argc, char *argv[]);</div><div class='del'>-int cli_cmd_process_line (struct cli_state *state, const char *line);</div><div class='add'>+typedef const char *(*cli_selector_t)(void *wcon);</div><div class='add'>+</div><div class='add'>+char *</div><div class='add'>+get_struct_variable(int mem_num, gf_gsync_status_t *sts_val);</div><div class='add'>+</div><div class='add'>+void *</div><div class='add'>+cli_getunamb(const char *tok, void **choices, cli_selector_t sel);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+cli_cmd_register(struct cli_cmd_tree *tree, struct cli_cmd *cmd);</div><div class='add'>+int</div><div class='add'>+cli_cmds_register(struct cli_state *state);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+cli_input_init(struct cli_state *state);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+cli_cmd_process(struct cli_state *state, int argc, char *argv[]);</div><div class='add'>+int</div><div class='add'>+cli_cmd_process_line(struct cli_state *state, const char *line);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+cli_rl_enable(struct cli_state *state);</div><div class='add'>+int</div><div class='add'>+cli_rl_out(struct cli_state *state, const char *fmt, va_list ap);</div><div class='add'>+int</div><div class='add'>+cli_rl_err(struct cli_state *state, const char *fmt, va_list ap);</div><div class='ctx'> </div><div class='del'>-int cli_rl_enable (struct cli_state *state);</div><div class='del'>-int cli_rl_out (struct cli_state *state, const char *fmt, va_list ap);</div><div class='add'>+int</div><div class='add'>+cli_usage_out(const char *usage);</div><div class='ctx'> </div><div class='del'>-int cli_out (const char *fmt, ...);</div><div class='add'>+int</div><div class='add'>+_cli_out(const char *fmt, ...);</div><div class='add'>+int</div><div class='add'>+_cli_err(const char *fmt, ...);</div><div class='add'>+</div><div class='add'>+#define cli_out(fmt...)                                                        \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        FMT_WARN(fmt);                                                         \</div><div class='add'>+                                                                               \</div><div class='add'>+        _cli_out(fmt);                                                         \</div><div class='add'>+                                                                               \</div><div class='add'>+    } while (0)</div><div class='add'>+</div><div class='add'>+#define cli_err(fmt...)                                                        \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        FMT_WARN(fmt);                                                         \</div><div class='add'>+                                                                               \</div><div class='add'>+        _cli_err(fmt);                                                         \</div><div class='add'>+                                                                               \</div><div class='add'>+    } while (0)</div><div class='add'>+</div><div class='add'>+#define usage()                                                                \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        cli_out(                                                               \</div><div class='add'>+            " Usage: gluster [options] &lt;help&gt; &lt;peer&gt;"                          \</div><div class='add'>+            " &lt;pool&gt; &lt;volume&gt;\n"                                               \</div><div class='add'>+            " Options:\n"                                                      \</div><div class='add'>+            " --help  Shows the help information\n"                            \</div><div class='add'>+            " --version  Shows the version\n"                                  \</div><div class='add'>+            " --print-logdir  Shows the log directory\n"                       \</div><div class='add'>+            " --print-statedumpdir Shows the state dump directory\n");         \</div><div class='add'>+                                                                               \</div><div class='add'>+    } while (0)</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-cli_submit_request (void *req, call_frame_t *frame,</div><div class='del'>-                    rpc_clnt_prog_t *prog,</div><div class='del'>-                    int procnum, struct iobref *iobref,</div><div class='del'>-                    cli_serialize_t sfunc, xlator_t *this,</div><div class='del'>-                    fop_cbk_fn_t cbkfn);</div><div class='add'>+cli_submit_request(struct rpc_clnt *rpc, void *req, call_frame_t *frame,</div><div class='add'>+                   rpc_clnt_prog_t *prog, int procnum, struct iobref *iobref,</div><div class='add'>+                   xlator_t *this, fop_cbk_fn_t cbkfn, xdrproc_t xdrproc);</div><div class='ctx'> </div><div class='ctx'> int32_t</div><div class='del'>-cli_cmd_volume_create_parse (const char **words, int wordcount,</div><div class='del'>-                             dict_t **options);</div><div class='add'>+cli_cmd_volume_create_parse(struct cli_state *state, const char **words,</div><div class='add'>+                            int wordcount, dict_t **options, char **bricks);</div><div class='ctx'> </div><div class='ctx'> int32_t</div><div class='del'>-cli_cmd_volume_set_parse (const char **words, int wordcount,</div><div class='del'>-                          dict_t **options);</div><div class='add'>+cli_cmd_volume_reset_parse(const char **words, int wordcount, dict_t **opt);</div><div class='ctx'> </div><div class='ctx'> int32_t</div><div class='del'>-cli_cmd_volume_add_brick_parse (const char **words, int wordcount,</div><div class='del'>-                                dict_t **options);</div><div class='add'>+cli_cmd_gsync_set_parse(struct cli_state *state, const char **words,</div><div class='add'>+                        int wordcount, dict_t **opt, char **errstr);</div><div class='ctx'> </div><div class='ctx'> int32_t</div><div class='del'>-cli_cmd_volume_remove_brick_parse (const char **words, int wordcount,</div><div class='del'>-                                   dict_t **options);</div><div class='add'>+cli_cmd_quota_parse(const char **words, int wordcount, dict_t **opt);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+cli_cmd_inode_quota_parse(const char **words, int wordcount, dict_t **opt);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+cli_cmd_bitrot_parse(const char **words, int wordcount, dict_t **opt);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+cli_cmd_volume_set_parse(struct cli_state *state, const char **words,</div><div class='add'>+                         int wordcount, dict_t **options, char **op_errstr);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+cli_cmd_ganesha_parse(struct cli_state *state, const char **words,</div><div class='add'>+                      int wordcount, dict_t **options, char **op_errstr);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+cli_cmd_get_state_parse(struct cli_state *state, const char **words,</div><div class='add'>+                        int wordcount, dict_t **options, char **op_errstr);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+cli_cmd_volume_add_brick_parse(struct cli_state *state, const char **words,</div><div class='add'>+                               int wordcount, dict_t **options, int *type);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+cli_cmd_volume_remove_brick_parse(struct cli_state *state, const char **words,</div><div class='add'>+                                  int wordcount, dict_t **options,</div><div class='add'>+                                  int *question, int *brick_count,</div><div class='add'>+                                  int32_t *command);</div><div class='ctx'> </div><div class='ctx'> int32_t</div><div class='del'>-cli_cmd_volume_replace_brick_parse (const char **words, int wordcount,</div><div class='add'>+cli_cmd_volume_replace_brick_parse(const char **words, int wordcount,</div><div class='ctx'>                                    dict_t **options);</div><div class='ctx'> </div><div class='ctx'> int32_t</div><div class='del'>-cli_cmd_log_rotate_parse (const char **words, int wordcount, dict_t **options);</div><div class='add'>+cli_cmd_volume_reset_brick_parse(const char **words, int wordcount,</div><div class='add'>+                                 dict_t **options);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+cli_cmd_log_rotate_parse(const char **words, int wordcount, dict_t **options);</div><div class='add'>+int32_t</div><div class='add'>+cli_cmd_log_locate_parse(const char **words, int wordcount, dict_t **options);</div><div class='add'>+int32_t</div><div class='add'>+cli_cmd_log_filename_parse(const char **words, int wordcount, dict_t **options);</div><div class='add'>+</div><div class='ctx'> int32_t</div><div class='del'>-cli_cmd_log_locate_parse (const char **words, int wordcount, dict_t **options);</div><div class='add'>+cli_cmd_volume_statedump_options_parse(const char **words, int wordcount,</div><div class='add'>+                                       dict_t **options);</div><div class='ctx'> int32_t</div><div class='del'>-cli_cmd_log_filename_parse (const char **words, int wordcount, dict_t **options);</div><div class='add'>+cli_cmd_volume_clrlks_opts_parse(const char **words, int wordcount,</div><div class='add'>+                                 dict_t **options);</div><div class='ctx'> </div><div class='del'>-cli_local_t * cli_local_get ();</div><div class='add'>+cli_local_t *</div><div class='add'>+cli_local_get();</div><div class='ctx'> </div><div class='ctx'> void</div><div class='del'>-cli_local_wipe (cli_local_t *local);</div><div class='add'>+cli_local_wipe(cli_local_t *local);</div><div class='add'>+</div><div class='add'>+gf_boolean_t</div><div class='add'>+cli_cmd_connected();</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+cli_cmd_await_connected(unsigned timeout);</div><div class='ctx'> </div><div class='ctx'> int32_t</div><div class='del'>-cli_cmd_await_connected ();</div><div class='add'>+cli_cmd_broadcast_connected(gf_boolean_t status);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+cli_rpc_notify(struct rpc_clnt *rpc, void *mydata, rpc_clnt_event_t event,</div><div class='add'>+               void *data);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+cli_cmd_volume_profile_parse(const char **words, int wordcount,</div><div class='add'>+                             dict_t **options);</div><div class='add'>+int32_t</div><div class='add'>+cli_cmd_volume_top_parse(const char **words, int wordcount, dict_t **options);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+cli_cmd_log_level_parse(const char **words, int wordcount, dict_t **options);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+cli_cmd_volume_status_parse(const char **words, int wordcount,</div><div class='add'>+                            dict_t **options);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+cli_cmd_volume_heal_options_parse(const char **words, int wordcount,</div><div class='add'>+                                  dict_t **options);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+cli_cmd_volume_defrag_parse(const char **words, int wordcount,</div><div class='add'>+                            dict_t **options);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+cli_print_brick_status(cli_volume_status_t *status);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+cli_print_detailed_status(cli_volume_status_t *status);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+cli_get_detail_status(dict_t *dict, int i, cli_volume_status_t *status);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+cli_print_line(int len);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+cli_xml_output_str(char *op, char *str, int op_ret, int op_errno,</div><div class='add'>+                   char *op_errstr);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+cli_xml_output_dict(char *op, dict_t *dict, int op_ret, int op_errno,</div><div class='add'>+                    char *op_errstr);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+cli_xml_output_vol_top(dict_t *dict, int op_ret, int op_errno, char *op_errstr);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+cli_xml_output_vol_profile(dict_t *dict, int op_ret, int op_errno,</div><div class='add'>+                           char *op_errstr);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+cli_xml_output_vol_status_begin(cli_local_t *local, int op_ret, int op_errno,</div><div class='add'>+                                char *op_errstr);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+cli_xml_output_vol_status_end(cli_local_t *local);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+cli_xml_output_vol_status(cli_local_t *local, dict_t *dict);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+cli_xml_output_vol_list(dict_t *dict, int op_ret, int op_errno,</div><div class='add'>+                        char *op_errstr);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+cli_xml_output_vol_info_begin(cli_local_t *local, int op_ret, int op_errno,</div><div class='add'>+                              char *op_errstr);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+cli_xml_output_vol_info_end(cli_local_t *local);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+cli_xml_output_vol_info(cli_local_t *local, dict_t *dict);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+cli_xml_output_vol_quota_limit_list_begin(cli_local_t *local, int op_ret,</div><div class='add'>+                                          int op_errno, char *op_errstr);</div><div class='add'>+int</div><div class='add'>+cli_xml_output_vol_quota_limit_list_end(cli_local_t *local);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+cli_quota_list_xml_error(cli_local_t *local, char *path, char *errstr);</div><div class='ctx'> </div><div class='add'>+int</div><div class='add'>+cli_quota_xml_output(cli_local_t *local, char *path, int64_t hl_str,</div><div class='add'>+                     char *sl_final, int64_t sl_num, int64_t used,</div><div class='add'>+                     int64_t avail, char *sl, char *hl, gf_boolean_t limit_set);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+cli_quota_object_xml_output(cli_local_t *local, char *path, char *sl_str,</div><div class='add'>+                            int64_t sl_val, quota_limits_t *limits,</div><div class='add'>+                            quota_meta_t *used_space, int64_t avail, char *sl,</div><div class='add'>+                            char *hl, gf_boolean_t limit_set);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+cli_xml_output_peer_status(dict_t *dict, int op_ret, int op_errno,</div><div class='add'>+                           char *op_errstr);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+cli_xml_output_vol_rebalance(gf_cli_defrag_type op, dict_t *dict, int op_ret,</div><div class='add'>+                             int op_errno, char *op_errstr);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+cli_xml_output_vol_remove_brick(gf_boolean_t status_op, dict_t *dict,</div><div class='add'>+                                int op_ret, int op_errno, char *op_errstr,</div><div class='add'>+                                const char *op);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+cli_xml_output_vol_replace_brick(dict_t *dict, int op_ret, int op_errno,</div><div class='add'>+                                 char *op_errstr);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+cli_xml_output_vol_create(dict_t *dict, int op_ret, int op_errno,</div><div class='add'>+                          char *op_errstr);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+cli_xml_output_generic_volume(char *op, dict_t *dict, int op_ret, int op_errno,</div><div class='add'>+                              char *op_errstr);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+cli_xml_output_vol_gsync(dict_t *dict, int op_ret, int op_errno,</div><div class='add'>+                         char *op_errstr);</div><div class='add'>+int</div><div class='add'>+cli_xml_output_vol_status_tasks_detail(cli_local_t *local, dict_t *dict);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+cli_xml_snapshot_delete(cli_local_t *local, dict_t *dict, gf_cli_rsp *rsp);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+cli_xml_snapshot_begin_composite_op(cli_local_t *local);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+cli_xml_snapshot_end_composite_op(cli_local_t *local);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+cli_xml_output_snap_delete_begin(cli_local_t *local, int op_ret, int op_errno,</div><div class='add'>+                                 char *op_errstr);</div><div class='add'>+int</div><div class='add'>+cli_xml_output_snap_delete_end(cli_local_t *local);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+cli_xml_output_snap_status_begin(cli_local_t *local, int op_ret, int op_errno,</div><div class='add'>+                                 char *op_errstr);</div><div class='add'>+int</div><div class='add'>+cli_xml_output_snap_status_end(cli_local_t *local);</div><div class='add'>+int</div><div class='add'>+cli_xml_output_snapshot(int cmd_type, dict_t *dict, int op_ret, int op_errno,</div><div class='add'>+                        char *op_errstr);</div><div class='add'>+int</div><div class='add'>+cli_xml_snapshot_status_single_snap(cli_local_t *local, dict_t *dict,</div><div class='add'>+                                    char *key);</div><div class='ctx'> int32_t</div><div class='del'>-cli_cmd_broadcast_connected ();</div><div class='add'>+cli_cmd_snapshot_parse(const char **words, int wordcount, dict_t **options,</div><div class='add'>+                       struct cli_state *state);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+cli_xml_output_vol_getopts(dict_t *dict, int op_ret, int op_errno,</div><div class='add'>+                           char *op_errstr);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+print_quota_list_header(int type);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+print_quota_list_empty(char *path, int type);</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-cli_rpc_notify (struct rpc_clnt *rpc, void *mydata, rpc_clnt_event_t event,</div><div class='del'>-                void *data);</div><div class='add'>+gf_gsync_status_t_comparator(const void *p, const void *q);</div><div class='ctx'> #endif /* __CLI_H__ */</div><div class='head'>diff --git a/cli/src/cli3_1-cops.c b/cli/src/cli3_1-cops.c<br/>deleted file mode 100644<br/>index 1485e3a2ed9..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/cli/src/cli3_1-cops.c?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>cli/src/cli3_1-cops.c</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,1802 +0,0 @@</div><div class='del'>-/*</div><div class='del'>-  Copyright (c) 2010 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='del'>-  This file is part of GlusterFS.</div><div class='del'>-</div><div class='del'>-  GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-  it under the terms of the GNU Affero General Public License as published</div><div class='del'>-  by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-  or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-  GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-  WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-  Affero General Public License for more details.</div><div class='del'>-</div><div class='del'>-  You should have received a copy of the GNU Affero General Public License</div><div class='del'>-  along with this program.  If not, see</div><div class='del'>-  &lt;http://www.gnu.org/licenses/&gt;.</div><div class='del'>-*/</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-#ifndef _CONFIG_H</div><div class='del'>-#define _CONFIG_H</div><div class='del'>-#include "config.h"</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-#include "cli.h"</div><div class='del'>-#include "compat-errno.h"</div><div class='del'>-#include "cli-cmd.h"</div><div class='del'>-#include &lt;sys/uio.h&gt;</div><div class='del'>-</div><div class='del'>-#include "cli1-xdr.h"</div><div class='del'>-#include "cli1.h"</div><div class='del'>-#include "protocol-common.h"</div><div class='del'>-#include "cli-mem-types.h"</div><div class='del'>-#include "compat.h"</div><div class='del'>-</div><div class='del'>-extern rpc_clnt_prog_t *cli_rpc_prog;</div><div class='del'>-extern int      cli_op_ret;</div><div class='del'>-</div><div class='del'>-char *cli_volume_type[] = {"Distribute",</div><div class='del'>-                           "Stripe",</div><div class='del'>-                           "Replicate"</div><div class='del'>-};</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-char *cli_volume_status[] = {"Created",</div><div class='del'>-                             "Started",</div><div class='del'>-                             "Stopped"</div><div class='del'>-};</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-gf_cli3_1_get_volume (call_frame_t *frame, xlator_t *this,</div><div class='del'>-                      void *data);</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-gf_cli3_1_probe_cbk (struct rpc_req *req, struct iovec *iov,</div><div class='del'>-                        int count, void *myframe)</div><div class='del'>-{</div><div class='del'>-        gf1_cli_probe_rsp    rsp   = {0,};</div><div class='del'>-        int                   ret   = 0;</div><div class='del'>-</div><div class='del'>-        if (-1 == req-&gt;rpc_status) {</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        ret = gf_xdr_to_cli_probe_rsp (*iov, &amp;rsp);</div><div class='del'>-        if (ret &lt; 0) {</div><div class='del'>-                gf_log ("", GF_LOG_ERROR, "error");</div><div class='del'>-                //rsp.op_ret   = -1;</div><div class='del'>-                //rsp.op_errno = EINVAL;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        gf_log ("cli", GF_LOG_NORMAL, "Received resp to probe");</div><div class='del'>-	 if (!rsp.op_ret) {</div><div class='del'>-	 	switch (rsp.op_errno) {</div><div class='del'>-		 	case GF_PROBE_SUCCESS:</div><div class='del'>-		      		cli_out ("Probe successful");</div><div class='del'>-		      		break;</div><div class='del'>-	 	 	case GF_PROBE_LOCALHOST:</div><div class='del'>-		      		cli_out ("Probe on localhost not needed");</div><div class='del'>-		      		break;</div><div class='del'>-			case GF_PROBE_FRIEND:</div><div class='del'>-				cli_out ("Probe on host %s port %d already"</div><div class='del'>-					 " a friend",rsp.hostname, rsp.port);</div><div class='del'>-				break;</div><div class='del'>-		 	default:</div><div class='del'>-		      		cli_out ("Probe returned with unknown errno %d",</div><div class='del'>-					rsp.op_errno);</div><div class='del'>-		      		break;</div><div class='del'>-	 	}</div><div class='del'>-	 }</div><div class='del'>-	 if (rsp.op_ret) {</div><div class='del'>-		 cli_out ("Probe unsuccessfull"); 		</div><div class='del'>-		 gf_log ("glusterd",GF_LOG_ERROR,"Probe failed with op_ret %d"</div><div class='del'>-			 " and op_errno %d", rsp.op_ret, rsp.op_errno);</div><div class='del'>-	 }</div><div class='del'>-        ret = rsp.op_ret;</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        cli_cmd_broadcast_response (ret);</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-gf_cli3_1_deprobe_cbk (struct rpc_req *req, struct iovec *iov,</div><div class='del'>-                       int count, void *myframe)</div><div class='del'>-{</div><div class='del'>-        gf1_cli_deprobe_rsp    rsp   = {0,};</div><div class='del'>-        int                   ret   = 0;</div><div class='del'>-</div><div class='del'>-        if (-1 == req-&gt;rpc_status) {</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        ret = gf_xdr_to_cli_deprobe_rsp (*iov, &amp;rsp);</div><div class='del'>-        if (ret &lt; 0) {</div><div class='del'>-                gf_log ("", GF_LOG_ERROR, "error");</div><div class='del'>-                //rsp.op_ret   = -1;</div><div class='del'>-                //rsp.op_errno = EINVAL;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        gf_log ("cli", GF_LOG_NORMAL, "Received resp to deprobe");</div><div class='del'>-        cli_out ("Detach %s", (rsp.op_ret) ? "unsuccessful": "successful");</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-        ret = rsp.op_ret;</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        cli_cmd_broadcast_response (ret);</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-gf_cli3_1_list_friends_cbk (struct rpc_req *req, struct iovec *iov,</div><div class='del'>-                             int count, void *myframe)</div><div class='del'>-{</div><div class='del'>-        gf1_cli_peer_list_rsp      rsp   = {0,};</div><div class='del'>-        int                        ret   = 0;</div><div class='del'>-        dict_t                     *dict = NULL;</div><div class='del'>-        char                       *uuid_buf = NULL;</div><div class='del'>-        char                       *hostname_buf = NULL;</div><div class='del'>-        int32_t                    i = 1;</div><div class='del'>-        char                       key[256] = {0,};</div><div class='del'>-        int32_t                    state = 0;</div><div class='del'>-        int32_t                    port = 0;</div><div class='del'>-</div><div class='del'>-        if (-1 == req-&gt;rpc_status) {</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        ret = gf_xdr_to_cli_peer_list_rsp (*iov, &amp;rsp);</div><div class='del'>-        if (ret &lt; 0) {</div><div class='del'>-                gf_log ("", GF_LOG_ERROR, "error");</div><div class='del'>-                //rsp.op_ret   = -1;</div><div class='del'>-                //rsp.op_errno = EINVAL;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-        gf_log ("cli", GF_LOG_NORMAL, "Received resp to list: %d",</div><div class='del'>-                rsp.op_ret);</div><div class='del'>-</div><div class='del'>-        ret = rsp.op_ret;</div><div class='del'>-</div><div class='del'>-        if (!rsp.op_ret) {</div><div class='del'>-</div><div class='del'>-                if (!rsp.friends.friends_len) {</div><div class='del'>-                        cli_out ("No peers present");</div><div class='del'>-                        ret = 0;</div><div class='del'>-                        goto out;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                dict = dict_new ();</div><div class='del'>-</div><div class='del'>-                if (!dict) {</div><div class='del'>-                        ret = -1;</div><div class='del'>-                        goto out;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                ret = dict_unserialize (rsp.friends.friends_val,</div><div class='del'>-                                        rsp.friends.friends_len,</div><div class='del'>-                                        &amp;dict);</div><div class='del'>-</div><div class='del'>-                if (ret) {</div><div class='del'>-                        gf_log ("", GF_LOG_ERROR,</div><div class='del'>-                                        "Unable to allocate memory");</div><div class='del'>-                        goto out;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                ret = dict_get_int32 (dict, "count", &amp;count);</div><div class='del'>-</div><div class='del'>-                if (ret) {</div><div class='del'>-                        goto out;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                cli_out ("Number of Peers: %d", count);</div><div class='del'>-</div><div class='del'>-                while ( i &lt;= count) {</div><div class='del'>-                        snprintf (key, 256, "friend%d.uuid", i);</div><div class='del'>-                        ret = dict_get_str (dict, key, &amp;uuid_buf);</div><div class='del'>-                        if (ret)</div><div class='del'>-                                goto out;</div><div class='del'>-</div><div class='del'>-                        snprintf (key, 256, "friend%d.hostname", i);</div><div class='del'>-                        ret = dict_get_str (dict, key, &amp;hostname_buf);</div><div class='del'>-                        if (ret)</div><div class='del'>-                                goto out;</div><div class='del'>-</div><div class='del'>-                        snprintf (key, 256, "friend%d.port", i);</div><div class='del'>-                        ret = dict_get_int32 (dict, key, &amp;port);</div><div class='del'>-                        if (ret)</div><div class='del'>-                                goto out;</div><div class='del'>-</div><div class='del'>-                        snprintf (key, 256, "friend%d.state", i);</div><div class='del'>-                        ret = dict_get_int32 (dict, key, &amp;state);</div><div class='del'>-                        if (ret)</div><div class='del'>-                                goto out;</div><div class='del'>-</div><div class='del'>-                        if (!port) {</div><div class='del'>-                                cli_out ("hostname:%s, uuid:%s, state:%d",</div><div class='del'>-                                         hostname_buf, uuid_buf, state);</div><div class='del'>-                        } else {</div><div class='del'>-                                cli_out ("hostname:%s, port:%d, uuid:%s, state:%d",</div><div class='del'>-                                         hostname_buf, port, uuid_buf, state);</div><div class='del'>-                        }</div><div class='del'>-                        i++;</div><div class='del'>-                }</div><div class='del'>-        } else {</div><div class='del'>-                ret = -1;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-        ret = 0;</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        cli_cmd_broadcast_response (ret);</div><div class='del'>-        if (ret)</div><div class='del'>-                cli_out ("Command Execution Failed");</div><div class='del'>-</div><div class='del'>-        if (dict)</div><div class='del'>-                dict_destroy (dict);</div><div class='del'>-</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-gf_cli3_1_get_volume_cbk (struct rpc_req *req, struct iovec *iov,</div><div class='del'>-                             int count, void *myframe)</div><div class='del'>-{</div><div class='del'>-        gf1_cli_get_vol_rsp        rsp   = {0,};</div><div class='del'>-        int                        ret   = 0;</div><div class='del'>-        dict_t                     *dict = NULL;</div><div class='del'>-        char                       *volname = NULL;</div><div class='del'>-        int32_t                    i = 0;</div><div class='del'>-        char                       key[1024] = {0,};</div><div class='del'>-        int32_t                    status = 0;</div><div class='del'>-        int32_t                    type = 0;</div><div class='del'>-        int32_t                    brick_count = 0;</div><div class='del'>-        char                       *brick = NULL;</div><div class='del'>-        int32_t                    j = 1;</div><div class='del'>-        cli_local_t                *local = NULL;</div><div class='del'>-        int32_t                    transport = 0;</div><div class='del'>-</div><div class='del'>-        if (-1 == req-&gt;rpc_status) {</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        ret = gf_xdr_to_cli_get_vol_rsp (*iov, &amp;rsp);</div><div class='del'>-        if (ret &lt; 0) {</div><div class='del'>-                gf_log ("", GF_LOG_ERROR, "error");</div><div class='del'>-                //rsp.op_ret   = -1;</div><div class='del'>-                //rsp.op_errno = EINVAL;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-        gf_log ("cli", GF_LOG_NORMAL, "Received resp to get vol: %d",</div><div class='del'>-                rsp.op_ret);</div><div class='del'>-</div><div class='del'>-        if (!rsp.op_ret) {</div><div class='del'>-</div><div class='del'>-                if (!rsp.volumes.volumes_len) {</div><div class='del'>-                        cli_out ("No volumes present");</div><div class='del'>-                        ret = 0;</div><div class='del'>-                        goto out;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                dict = dict_new ();</div><div class='del'>-</div><div class='del'>-                if (!dict) {</div><div class='del'>-                        ret = -1;</div><div class='del'>-                        goto out;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                ret = dict_unserialize (rsp.volumes.volumes_val,</div><div class='del'>-                                        rsp.volumes.volumes_len,</div><div class='del'>-                                        &amp;dict);</div><div class='del'>-</div><div class='del'>-                if (ret) {</div><div class='del'>-                        gf_log ("", GF_LOG_ERROR,</div><div class='del'>-                                        "Unable to allocate memory");</div><div class='del'>-                        goto out;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                ret = dict_get_int32 (dict, "count", &amp;count);</div><div class='del'>-</div><div class='del'>-                if (ret) {</div><div class='del'>-                        goto out;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                local = ((call_frame_t *)myframe)-&gt;local;</div><div class='del'>-                //cli_out ("Number of Volumes: %d", count);</div><div class='del'>-</div><div class='del'>-                if (!count &amp;&amp; (local-&gt;u.get_vol.flags ==</div><div class='del'>-                                        GF_CLI_GET_NEXT_VOLUME)) {</div><div class='del'>-                        local-&gt;u.get_vol.volname = NULL;</div><div class='del'>-                        ret = 0;</div><div class='del'>-                        goto out;</div><div class='del'>-                } else if (!count &amp;&amp; (local-&gt;u.get_vol.flags ==</div><div class='del'>-                                        GF_CLI_GET_VOLUME)) {</div><div class='del'>-                        cli_out ("Volume %s not present",</div><div class='del'>-                                  local-&gt;u.get_vol.volname);</div><div class='del'>-                        ret = 0;</div><div class='del'>-                        goto out;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                while ( i &lt; count) {</div><div class='del'>-                        cli_out ("");</div><div class='del'>-                        snprintf (key, 256, "volume%d.name", i);</div><div class='del'>-                        ret = dict_get_str (dict, key, &amp;volname);</div><div class='del'>-                        if (ret)</div><div class='del'>-                                goto out;</div><div class='del'>-</div><div class='del'>-                        snprintf (key, 256, "volume%d.type", i);</div><div class='del'>-                        ret = dict_get_int32 (dict, key, &amp;type);</div><div class='del'>-                        if (ret)</div><div class='del'>-                                goto out;</div><div class='del'>-</div><div class='del'>-                        snprintf (key, 256, "volume%d.status", i);</div><div class='del'>-                        ret = dict_get_int32 (dict, key, &amp;status);</div><div class='del'>-                        if (ret)</div><div class='del'>-                                goto out;</div><div class='del'>-</div><div class='del'>-                        snprintf (key, 256, "volume%d.brick_count", i);</div><div class='del'>-                        ret = dict_get_int32 (dict, key, &amp;brick_count);</div><div class='del'>-                        if (ret)</div><div class='del'>-                                goto out;</div><div class='del'>-</div><div class='del'>-                        snprintf (key, 256, "volume%d.transport", i);</div><div class='del'>-                        ret = dict_get_int32 (dict, key, &amp;transport);</div><div class='del'>-                        if (ret)</div><div class='del'>-                                goto out;</div><div class='del'>-</div><div class='del'>-                        cli_out ("Volume Name: %s", volname);</div><div class='del'>-                        cli_out ("Type: %s", cli_volume_type[type]);</div><div class='del'>-                        cli_out ("Status: %s", cli_volume_status[status], brick_count);</div><div class='del'>-                        cli_out ("Number of Bricks: %d", brick_count);</div><div class='del'>-                        cli_out ("Transport-type: %s", ((transport == 0)?</div><div class='del'>-                                 "tcp" : "rdma"));</div><div class='del'>-                        j = 1;</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-                        GF_FREE (local-&gt;u.get_vol.volname);</div><div class='del'>-                        local-&gt;u.get_vol.volname = gf_strdup (volname);</div><div class='del'>-</div><div class='del'>-                        if (brick_count)</div><div class='del'>-                                cli_out ("Bricks:");</div><div class='del'>-</div><div class='del'>-                        while ( j &lt;= brick_count) {</div><div class='del'>-                                snprintf (key, 1024, "volume%d.brick%d",</div><div class='del'>-                                          i, j);</div><div class='del'>-                                ret = dict_get_str (dict, key, &amp;brick);</div><div class='del'>-                                if (ret)</div><div class='del'>-                                        goto out;</div><div class='del'>-                                cli_out ("Brick%d: %s", j, brick);</div><div class='del'>-                                j++;</div><div class='del'>-                        }</div><div class='del'>-                        i++;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-        } else {</div><div class='del'>-                ret = -1;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-        ret = 0;</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        cli_cmd_broadcast_response (ret);</div><div class='del'>-        if (ret)</div><div class='del'>-                cli_out ("Command Execution Failed");</div><div class='del'>-</div><div class='del'>-        if (dict)</div><div class='del'>-                dict_destroy (dict);</div><div class='del'>-</div><div class='del'>-        gf_log ("", GF_LOG_NORMAL, "Returning: %d", ret);</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-gf_cli3_1_create_volume_cbk (struct rpc_req *req, struct iovec *iov,</div><div class='del'>-                             int count, void *myframe)</div><div class='del'>-{</div><div class='del'>-        gf1_cli_create_vol_rsp  rsp   = {0,};</div><div class='del'>-        int                     ret   = 0;</div><div class='del'>-        cli_local_t             *local = NULL;</div><div class='del'>-        char                    *volname = NULL;</div><div class='del'>-        dict_t                  *dict = NULL;</div><div class='del'>-</div><div class='del'>-        if (-1 == req-&gt;rpc_status) {</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        ret = gf_xdr_to_cli_create_vol_rsp (*iov, &amp;rsp);</div><div class='del'>-        if (ret &lt; 0) {</div><div class='del'>-                gf_log ("", GF_LOG_ERROR, "error");</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        local = ((call_frame_t *) (myframe))-&gt;local;</div><div class='del'>-</div><div class='del'>-        dict = local-&gt;u.create_vol.dict;</div><div class='del'>-</div><div class='del'>-        ret = dict_get_str (dict, "volname", &amp;volname);</div><div class='del'>-</div><div class='del'>-        gf_log ("cli", GF_LOG_NORMAL, "Received resp to create volume");</div><div class='del'>-        cli_out ("Creation of volume %s has been %s", volname,</div><div class='del'>-                        (rsp.op_ret) ? "unsuccessful": "successful");</div><div class='del'>-	 if (rsp.op_ret &amp;&amp; rsp.op_errstr)</div><div class='del'>-		 cli_out ("%s", rsp.op_errstr);</div><div class='del'>-</div><div class='del'>-        ret = rsp.op_ret;</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        cli_cmd_broadcast_response (ret);</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-gf_cli3_1_delete_volume_cbk (struct rpc_req *req, struct iovec *iov,</div><div class='del'>-                             int count, void *myframe)</div><div class='del'>-{</div><div class='del'>-        gf1_cli_delete_vol_rsp  rsp   = {0,};</div><div class='del'>-        int                     ret   = 0;</div><div class='del'>-        cli_local_t             *local = NULL;</div><div class='del'>-        char                    *volname = NULL;</div><div class='del'>-        call_frame_t            *frame = NULL;</div><div class='del'>-</div><div class='del'>-        if (-1 == req-&gt;rpc_status) {</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        ret = gf_xdr_to_cli_delete_vol_rsp (*iov, &amp;rsp);</div><div class='del'>-        if (ret &lt; 0) {</div><div class='del'>-                gf_log ("", GF_LOG_ERROR, "error");</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        frame = myframe;</div><div class='del'>-        local = frame-&gt;local;</div><div class='del'>-</div><div class='del'>-        if (local)</div><div class='del'>-                volname = local-&gt;u.delete_vol.volname;</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-        gf_log ("cli", GF_LOG_NORMAL, "Received resp to delete volume");</div><div class='del'>-        cli_out ("Deleting volume %s has been %s", volname,</div><div class='del'>-                 (rsp.op_ret) ? "unsuccessful": "successful");</div><div class='del'>-</div><div class='del'>-        ret = rsp.op_ret;</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        cli_cmd_broadcast_response (ret);</div><div class='del'>-        gf_log ("", GF_LOG_NORMAL, "Returning with %d", ret);</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-gf_cli3_1_start_volume_cbk (struct rpc_req *req, struct iovec *iov,</div><div class='del'>-                             int count, void *myframe)</div><div class='del'>-{</div><div class='del'>-        gf1_cli_start_vol_rsp   rsp   = {0,};</div><div class='del'>-        int                     ret   = 0;</div><div class='del'>-        cli_local_t             *local = NULL;</div><div class='del'>-        char                    *volname = NULL;</div><div class='del'>-        call_frame_t            *frame = NULL;</div><div class='del'>-</div><div class='del'>-        if (-1 == req-&gt;rpc_status) {</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        ret = gf_xdr_to_cli_start_vol_rsp (*iov, &amp;rsp);</div><div class='del'>-        if (ret &lt; 0) {</div><div class='del'>-                gf_log ("", GF_LOG_ERROR, "error");</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        frame = myframe;</div><div class='del'>-</div><div class='del'>-        if (frame)</div><div class='del'>-                local = frame-&gt;local;</div><div class='del'>-</div><div class='del'>-        if (local)</div><div class='del'>-                volname = local-&gt;u.start_vol.volname;</div><div class='del'>-</div><div class='del'>-        gf_log ("cli", GF_LOG_NORMAL, "Received resp to start volume");</div><div class='del'>-        cli_out ("Starting volume %s has been %s", volname,</div><div class='del'>-                (rsp.op_ret) ? "unsuccessful": "successful");</div><div class='del'>-</div><div class='del'>-        ret = rsp.op_ret;</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        cli_cmd_broadcast_response (ret);</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-gf_cli3_1_stop_volume_cbk (struct rpc_req *req, struct iovec *iov,</div><div class='del'>-                             int count, void *myframe)</div><div class='del'>-{</div><div class='del'>-        gf1_cli_stop_vol_rsp  rsp   = {0,};</div><div class='del'>-        int                   ret   = 0;</div><div class='del'>-        cli_local_t           *local = NULL;</div><div class='del'>-        char                  *volname = NULL;</div><div class='del'>-        call_frame_t          *frame = NULL;</div><div class='del'>-</div><div class='del'>-        if (-1 == req-&gt;rpc_status) {</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        ret = gf_xdr_to_cli_stop_vol_rsp (*iov, &amp;rsp);</div><div class='del'>-        if (ret &lt; 0) {</div><div class='del'>-                gf_log ("", GF_LOG_ERROR, "error");</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        frame = myframe;</div><div class='del'>-</div><div class='del'>-        if (frame)</div><div class='del'>-                local = frame-&gt;local;</div><div class='del'>-</div><div class='del'>-        if (local)</div><div class='del'>-                volname = local-&gt;u.start_vol.volname;</div><div class='del'>-</div><div class='del'>-        gf_log ("cli", GF_LOG_NORMAL, "Received resp to stop volume");</div><div class='del'>-        cli_out ("Stopping volume %s has been %s", volname,</div><div class='del'>-                (rsp.op_ret) ? "unsuccessful": "successful");</div><div class='del'>-</div><div class='del'>-        ret = rsp.op_ret;</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        cli_cmd_broadcast_response (ret);</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-gf_cli3_1_defrag_volume_cbk (struct rpc_req *req, struct iovec *iov,</div><div class='del'>-                             int count, void *myframe)</div><div class='del'>-{</div><div class='del'>-        gf1_cli_defrag_vol_rsp  rsp     = {0,};</div><div class='del'>-        cli_local_t            *local   = NULL;</div><div class='del'>-        char                   *volname = NULL;</div><div class='del'>-        call_frame_t           *frame   = NULL;</div><div class='del'>-        int                     cmd     = 0;</div><div class='del'>-        int                     ret     = 0;</div><div class='del'>-</div><div class='del'>-        if (-1 == req-&gt;rpc_status) {</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        ret = gf_xdr_to_cli_defrag_vol_rsp (*iov, &amp;rsp);</div><div class='del'>-        if (ret &lt; 0) {</div><div class='del'>-                gf_log ("", GF_LOG_ERROR, "error");</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        frame = myframe;</div><div class='del'>-</div><div class='del'>-        if (frame)</div><div class='del'>-                local = frame-&gt;local;</div><div class='del'>-</div><div class='del'>-        if (local) {</div><div class='del'>-                volname = local-&gt;u.defrag_vol.volname;</div><div class='del'>-                cmd = local-&gt;u.defrag_vol.cmd;</div><div class='del'>-        }</div><div class='del'>-        if (cmd == GF_DEFRAG_CMD_START) {</div><div class='del'>-                cli_out ("starting defrag on volume %s has been %s", volname,</div><div class='del'>-                         (rsp.op_ret) ? "unsuccessful": "successful");</div><div class='del'>-        }</div><div class='del'>-        if (cmd == GF_DEFRAG_CMD_STOP) {</div><div class='del'>-                if (rsp.op_ret == -1)</div><div class='del'>-                        cli_out ("'defrag volume %s stop' failed", volname);</div><div class='del'>-                else</div><div class='del'>-                        cli_out ("stopped defrag process of volume %s \n"</div><div class='del'>-                                 "(after rebalancing %"PRId64" files totaling "</div><div class='del'>-                                 "%"PRId64" bytes)", volname, rsp.files, rsp.size);</div><div class='del'>-        }</div><div class='del'>-        if (cmd == GF_DEFRAG_CMD_STATUS) {</div><div class='del'>-                if (rsp.op_ret == -1)</div><div class='del'>-                        cli_out ("failed to get the status of defrag process");</div><div class='del'>-                else {</div><div class='del'>-                        char *status = "unknown";</div><div class='del'>-                        if (rsp.op_errno == 0)</div><div class='del'>-                                status = "not started";</div><div class='del'>-                        if (rsp.op_errno == 1)</div><div class='del'>-                                status = "in progress";</div><div class='del'>-                        if (rsp.op_errno == 2)</div><div class='del'>-                                status = "stopped";</div><div class='del'>-                        if (rsp.op_errno == 3)</div><div class='del'>-                                status = "completed";</div><div class='del'>-                        if (rsp.op_errno == 4)</div><div class='del'>-                                status = "failed";</div><div class='del'>-</div><div class='del'>-                        if (rsp.files) {</div><div class='del'>-                                cli_out ("rebalance %s: rebalanced %"PRId64</div><div class='del'>-                                         " files of size %"PRId64" (total files"</div><div class='del'>-                                         " scanned %"PRId64")", status,</div><div class='del'>-                                         rsp.files, rsp.size, rsp.lookedup_files);</div><div class='del'>-                        } else {</div><div class='del'>-                                cli_out ("rebalance %s", status);</div><div class='del'>-                        }</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (volname)</div><div class='del'>-                GF_FREE (volname);</div><div class='del'>-</div><div class='del'>-        ret = rsp.op_ret;</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        cli_cmd_broadcast_response (ret);</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-gf_cli3_1_rename_volume_cbk (struct rpc_req *req, struct iovec *iov,</div><div class='del'>-                             int count, void *myframe)</div><div class='del'>-{</div><div class='del'>-        gf1_cli_rename_vol_rsp  rsp   = {0,};</div><div class='del'>-        int                     ret   = 0;</div><div class='del'>-</div><div class='del'>-        if (-1 == req-&gt;rpc_status) {</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        ret = gf_xdr_to_cli_rename_vol_rsp (*iov, &amp;rsp);</div><div class='del'>-        if (ret &lt; 0) {</div><div class='del'>-                gf_log ("", GF_LOG_ERROR, "error");</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-        gf_log ("cli", GF_LOG_NORMAL, "Received resp to probe");</div><div class='del'>-        cli_out ("Rename volume %s", (rsp.op_ret) ? "unsuccessful":</div><div class='del'>-                                        "successful");</div><div class='del'>-</div><div class='del'>-        ret = rsp.op_ret;</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        cli_cmd_broadcast_response (ret);</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-gf_cli3_1_set_volume_cbk (struct rpc_req *req, struct iovec *iov,</div><div class='del'>-                             int count, void *myframe)</div><div class='del'>-{</div><div class='del'>-        gf1_cli_set_vol_rsp  rsp   = {0,};</div><div class='del'>-        int                  ret   = 0;</div><div class='del'>-</div><div class='del'>-        if (-1 == req-&gt;rpc_status) {</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        ret = gf_xdr_to_cli_set_vol_rsp (*iov, &amp;rsp);</div><div class='del'>-        if (ret &lt; 0) {</div><div class='del'>-                gf_log ("", GF_LOG_ERROR, "error");</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-        gf_log ("cli", GF_LOG_NORMAL, "Received resp to set");</div><div class='del'>-        cli_out ("Set volume %s", (rsp.op_ret) ? "unsuccessful":</div><div class='del'>-                                        "successful");</div><div class='del'>-</div><div class='del'>-        ret = rsp.op_ret;</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        cli_cmd_broadcast_response (ret);</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-gf_cli3_1_add_brick_cbk (struct rpc_req *req, struct iovec *iov,</div><div class='del'>-                             int count, void *myframe)</div><div class='del'>-{</div><div class='del'>-        gf1_cli_add_brick_rsp       rsp   = {0,};</div><div class='del'>-        int                         ret   = 0;</div><div class='del'>-</div><div class='del'>-        if (-1 == req-&gt;rpc_status) {</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        ret = gf_xdr_to_cli_add_brick_rsp (*iov, &amp;rsp);</div><div class='del'>-        if (ret &lt; 0) {</div><div class='del'>-                gf_log ("", GF_LOG_ERROR, "error");</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-        gf_log ("cli", GF_LOG_NORMAL, "Received resp to add brick");</div><div class='del'>-        cli_out ("Add Brick %s", (rsp.op_ret) ? "unsuccessful":</div><div class='del'>-                                        "successful");</div><div class='del'>-</div><div class='del'>-        if (rsp.op_ret &amp;&amp; rsp.op_errstr)</div><div class='del'>-                cli_out ("%s", rsp.op_errstr);</div><div class='del'>-        ret = rsp.op_ret;</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        cli_cmd_broadcast_response (ret);</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-gf_cli3_1_remove_brick_cbk (struct rpc_req *req, struct iovec *iov,</div><div class='del'>-                             int count, void *myframe)</div><div class='del'>-{</div><div class='del'>-        gf1_cli_remove_brick_rsp        rsp   = {0,};</div><div class='del'>-        int                             ret   = 0;</div><div class='del'>-</div><div class='del'>-        if (-1 == req-&gt;rpc_status) {</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        ret = gf_xdr_to_cli_remove_brick_rsp (*iov, &amp;rsp);</div><div class='del'>-        if (ret &lt; 0) {</div><div class='del'>-                gf_log ("", GF_LOG_ERROR, "error");</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        gf_log ("cli", GF_LOG_NORMAL, "Received resp to remove brick");</div><div class='del'>-        cli_out ("Remove Brick %s", (rsp.op_ret) ? "unsuccessful":</div><div class='del'>-                                        "successful");</div><div class='del'>-        if (rsp.op_ret &amp;&amp; rsp.op_errstr)</div><div class='del'>-                cli_out ("%s", rsp.op_errstr);</div><div class='del'>-</div><div class='del'>-        ret = rsp.op_ret;</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        cli_cmd_broadcast_response (ret);</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-gf_cli3_1_replace_brick_cbk (struct rpc_req *req, struct iovec *iov,</div><div class='del'>-                             int count, void *myframe)</div><div class='del'>-{</div><div class='del'>-        gf1_cli_replace_brick_rsp        rsp              = {0,};</div><div class='del'>-        int                              ret              = 0;</div><div class='del'>-        cli_local_t                     *local            = NULL;</div><div class='del'>-        call_frame_t                    *frame            = NULL;</div><div class='del'>-        dict_t                          *dict             = NULL;</div><div class='del'>-        char                            *src_brick        = NULL;</div><div class='del'>-        char                            *dst_brick        = NULL;</div><div class='del'>-        char                            *status_reply     = NULL;</div><div class='del'>-        gf1_cli_replace_op               replace_op       = 0;</div><div class='del'>-        char                            *rb_operation_str = NULL;</div><div class='del'>-        char                             cmd_str[8192]    = {0,};</div><div class='del'>-</div><div class='del'>-        if (-1 == req-&gt;rpc_status) {</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        frame = (call_frame_t *) myframe;</div><div class='del'>-</div><div class='del'>-        ret = gf_xdr_to_cli_replace_brick_rsp (*iov, &amp;rsp);</div><div class='del'>-        if (ret &lt; 0) {</div><div class='del'>-                gf_log ("", GF_LOG_ERROR, "error");</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        local = frame-&gt;local;</div><div class='del'>-        GF_ASSERT (local);</div><div class='del'>-        dict = local-&gt;u.replace_brick.dict;</div><div class='del'>-</div><div class='del'>-        ret = dict_get_int32 (dict, "operation", (int32_t *)&amp;replace_op);</div><div class='del'>-        if (ret) {</div><div class='del'>-                gf_log ("", GF_LOG_DEBUG,</div><div class='del'>-                        "dict_get on operation failed");</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        switch (replace_op) {</div><div class='del'>-        case GF_REPLACE_OP_START:</div><div class='del'>-                if (rsp.op_ret)</div><div class='del'>-                        rb_operation_str = "replace-brick failed to start";</div><div class='del'>-                else</div><div class='del'>-                        rb_operation_str = "replace-brick started successfully";</div><div class='del'>-                break;</div><div class='del'>-</div><div class='del'>-        case GF_REPLACE_OP_STATUS:</div><div class='del'>-</div><div class='del'>-                status_reply = rsp.status;</div><div class='del'>-                if (rsp.op_ret || ret)</div><div class='del'>-                        rb_operation_str = "replace-brick status unknown";</div><div class='del'>-                else</div><div class='del'>-                        rb_operation_str = status_reply;</div><div class='del'>-</div><div class='del'>-                break;</div><div class='del'>-</div><div class='del'>-        case GF_REPLACE_OP_PAUSE:</div><div class='del'>-                if (rsp.op_ret)</div><div class='del'>-                        rb_operation_str = "replace-brick pause failed";</div><div class='del'>-                else</div><div class='del'>-                        rb_operation_str = "replace-brick paused successfully";</div><div class='del'>-                break;</div><div class='del'>-</div><div class='del'>-        case GF_REPLACE_OP_ABORT:</div><div class='del'>-                if (rsp.op_ret)</div><div class='del'>-                        rb_operation_str = "replace-brick abort failed";</div><div class='del'>-                else</div><div class='del'>-                        rb_operation_str = "replace-brick aborted successfully";</div><div class='del'>-                break;</div><div class='del'>-</div><div class='del'>-        case GF_REPLACE_OP_COMMIT:</div><div class='del'>-                ret = dict_get_str (dict, "src-brick", &amp;src_brick);</div><div class='del'>-                if (ret) {</div><div class='del'>-                        gf_log ("", GF_LOG_DEBUG,</div><div class='del'>-                                "dict_get on src-brick failed");</div><div class='del'>-                        goto out;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                ret = dict_get_str (dict, "dst-brick", &amp;dst_brick);</div><div class='del'>-                if (ret) {</div><div class='del'>-                        gf_log ("", GF_LOG_DEBUG,</div><div class='del'>-                                "dict_get on dst-brick failed");</div><div class='del'>-                        goto out;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                snprintf (cmd_str, 4096, "gluster volume replace-brick %s %s %s abort &gt;/dev/null",</div><div class='del'>-                          local-&gt;u.replace_brick.volname, src_brick, dst_brick);</div><div class='del'>-</div><div class='del'>-                ret = system (cmd_str);</div><div class='del'>-                if (ret) {</div><div class='del'>-                        gf_log ("", GF_LOG_DEBUG,</div><div class='del'>-                                "add brick failed");</div><div class='del'>-                        goto out;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                snprintf (cmd_str, 4096, "gluster volume add-brick %s %s &gt;/dev/null",</div><div class='del'>-                          local-&gt;u.replace_brick.volname, dst_brick);</div><div class='del'>-</div><div class='del'>-                ret = system (cmd_str);</div><div class='del'>-                if (ret) {</div><div class='del'>-                        gf_log ("", GF_LOG_DEBUG,</div><div class='del'>-                                "add brick failed");</div><div class='del'>-                        goto out;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                snprintf (cmd_str, 4096, "gluster mode script volume remove-brick %s %s &gt;/dev/null",</div><div class='del'>-                          local-&gt;u.replace_brick.volname, src_brick);</div><div class='del'>-</div><div class='del'>-                ret = system (cmd_str);</div><div class='del'>-                if (ret) {</div><div class='del'>-                        gf_log ("", GF_LOG_DEBUG,</div><div class='del'>-                                "remove brick failed");</div><div class='del'>-                        goto out;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                if (rsp.op_ret || ret)</div><div class='del'>-                        rb_operation_str = "replace-brick commit failed";</div><div class='del'>-                else</div><div class='del'>-                        rb_operation_str = "replace-brick commit successful";</div><div class='del'>-</div><div class='del'>-                break;</div><div class='del'>-</div><div class='del'>-        default:</div><div class='del'>-                gf_log ("", GF_LOG_DEBUG,</div><div class='del'>-                        "Unknown operation");</div><div class='del'>-                break;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-        gf_log ("cli", GF_LOG_NORMAL, "Received resp to replace brick");</div><div class='del'>-        cli_out ("%s",</div><div class='del'>-                 rb_operation_str ? rb_operation_str : "Unknown operation");</div><div class='del'>-</div><div class='del'>-        ret = rsp.op_ret;</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        if (local) {</div><div class='del'>-                dict_unref (local-&gt;u.replace_brick.dict);</div><div class='del'>-                GF_FREE (local-&gt;u.replace_brick.volname);</div><div class='del'>-                cli_local_wipe (local);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        cli_cmd_broadcast_response (ret);</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-static int</div><div class='del'>-gf_cli3_1_log_filename_cbk (struct rpc_req *req, struct iovec *iov,</div><div class='del'>-                            int count, void *myframe)</div><div class='del'>-{</div><div class='del'>-        gf1_cli_log_filename_rsp        rsp   = {0,};</div><div class='del'>-        int                             ret   = -1;</div><div class='del'>-</div><div class='del'>-        if (-1 == req-&gt;rpc_status) {</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        ret = gf_xdr_to_cli_log_filename_rsp (*iov, &amp;rsp);</div><div class='del'>-        if (ret &lt; 0) {</div><div class='del'>-                gf_log ("", GF_LOG_ERROR, "error");</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        gf_log ("cli", GF_LOG_DEBUG, "Received resp to log filename");</div><div class='del'>-        cli_out ("log filename : %s",</div><div class='del'>-                 (rsp.op_ret) ? "unsuccessful": "successful");</div><div class='del'>-</div><div class='del'>-        ret = rsp.op_ret;</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        cli_cmd_broadcast_response (ret);</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-static int</div><div class='del'>-gf_cli3_1_log_locate_cbk (struct rpc_req *req, struct iovec *iov,</div><div class='del'>-                          int count, void *myframe)</div><div class='del'>-{</div><div class='del'>-        gf1_cli_log_locate_rsp rsp   = {0,};</div><div class='del'>-        int                    ret   = -1;</div><div class='del'>-</div><div class='del'>-        if (-1 == req-&gt;rpc_status) {</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        ret = gf_xdr_to_cli_log_locate_rsp (*iov, &amp;rsp);</div><div class='del'>-        if (ret &lt; 0) {</div><div class='del'>-                gf_log ("", GF_LOG_ERROR, "error");</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        gf_log ("cli", GF_LOG_DEBUG, "Received resp to log locate");</div><div class='del'>-        cli_out ("log file location: %s", rsp.path);</div><div class='del'>-</div><div class='del'>-        ret = rsp.op_ret;</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        cli_cmd_broadcast_response (ret);</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-static int</div><div class='del'>-gf_cli3_1_log_rotate_cbk (struct rpc_req *req, struct iovec *iov,</div><div class='del'>-                          int count, void *myframe)</div><div class='del'>-{</div><div class='del'>-        gf1_cli_log_rotate_rsp rsp   = {0,};</div><div class='del'>-        int                    ret   = -1;</div><div class='del'>-</div><div class='del'>-        if (-1 == req-&gt;rpc_status) {</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        ret = gf_xdr_to_cli_log_rotate_rsp (*iov, &amp;rsp);</div><div class='del'>-        if (ret &lt; 0) {</div><div class='del'>-                gf_log ("", GF_LOG_ERROR, "error");</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        gf_log ("cli", GF_LOG_DEBUG, "Received resp to log rotate");</div><div class='del'>-        cli_out ("log rotate %s", (rsp.op_ret) ? "unsuccessful": "successful");</div><div class='del'>-</div><div class='del'>-        ret = rsp.op_ret;</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        cli_cmd_broadcast_response (ret);</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-gf_cli3_1_probe (call_frame_t *frame, xlator_t *this,</div><div class='del'>-                 void *data)</div><div class='del'>-{</div><div class='del'>-        gf1_cli_probe_req  req      = {0,};</div><div class='del'>-        int                ret      = 0;</div><div class='del'>-        dict_t            *dict     = NULL;</div><div class='del'>-        char              *hostname = NULL;</div><div class='del'>-        int                port     = 0;</div><div class='del'>-</div><div class='del'>-        if (!frame || !this ||  !data) {</div><div class='del'>-                ret = -1;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        dict = data;</div><div class='del'>-        ret = dict_get_str (dict, "hostname", &amp;hostname);</div><div class='del'>-        if (ret)</div><div class='del'>-                goto out;</div><div class='del'>-</div><div class='del'>-        ret = dict_get_int32 (dict, "port", &amp;port);</div><div class='del'>-        if (ret)</div><div class='del'>-                port = CLI_GLUSTERD_PORT;</div><div class='del'>-</div><div class='del'>-        req.hostname = hostname;</div><div class='del'>-        req.port     = port;</div><div class='del'>-</div><div class='del'>-        ret = cli_cmd_submit (&amp;req, frame, cli_rpc_prog,</div><div class='del'>-                              GD_MGMT_CLI_PROBE, NULL, gf_xdr_from_cli_probe_req,</div><div class='del'>-                              this, gf_cli3_1_probe_cbk);</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        gf_log ("cli", GF_LOG_DEBUG, "Returning %d", ret);</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-gf_cli3_1_deprobe (call_frame_t *frame, xlator_t *this,</div><div class='del'>-                   void *data)</div><div class='del'>-{</div><div class='del'>-        gf1_cli_deprobe_req  req      = {0,};</div><div class='del'>-        int                  ret      = 0;</div><div class='del'>-        dict_t              *dict     = NULL;</div><div class='del'>-        char                *hostname = NULL;</div><div class='del'>-        int                  port     = 0;</div><div class='del'>-</div><div class='del'>-        if (!frame || !this ||  !data) {</div><div class='del'>-                ret = -1;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        dict = data;</div><div class='del'>-        ret = dict_get_str (dict, "hostname", &amp;hostname);</div><div class='del'>-        if (ret)</div><div class='del'>-                goto out;</div><div class='del'>-</div><div class='del'>-        ret = dict_get_int32 (dict, "port", &amp;port);</div><div class='del'>-        if (ret)</div><div class='del'>-                port = CLI_GLUSTERD_PORT;</div><div class='del'>-</div><div class='del'>-        req.hostname = hostname;</div><div class='del'>-        req.port     = port;</div><div class='del'>-</div><div class='del'>-        ret = cli_cmd_submit (&amp;req, frame, cli_rpc_prog,</div><div class='del'>-                              GD_MGMT_CLI_DEPROBE, NULL,</div><div class='del'>-                              gf_xdr_from_cli_deprobe_req,</div><div class='del'>-                              this, gf_cli3_1_deprobe_cbk);</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        gf_log ("cli", GF_LOG_DEBUG, "Returning %d", ret);</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-gf_cli3_1_list_friends (call_frame_t *frame, xlator_t *this,</div><div class='del'>-                        void *data)</div><div class='del'>-{</div><div class='del'>-        gf1_cli_peer_list_req   req = {0,};</div><div class='del'>-        int                     ret = 0;</div><div class='del'>-</div><div class='del'>-        if (!frame || !this) {</div><div class='del'>-                ret = -1;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        req.flags = GF_CLI_LIST_ALL;</div><div class='del'>-</div><div class='del'>-        ret = cli_cmd_submit (&amp;req, frame, cli_rpc_prog,</div><div class='del'>-                              GD_MGMT_CLI_LIST_FRIENDS, NULL,</div><div class='del'>-                              gf_xdr_from_cli_peer_list_req,</div><div class='del'>-                              this, gf_cli3_1_list_friends_cbk);</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        gf_log ("cli", GF_LOG_DEBUG, "Returning %d", ret);</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-gf_cli3_1_get_next_volume (call_frame_t *frame, xlator_t *this,</div><div class='del'>-                           void *data)</div><div class='del'>-{</div><div class='del'>-</div><div class='del'>-        int                             ret = 0;</div><div class='del'>-        cli_cmd_volume_get_ctx_t        *ctx = NULL;</div><div class='del'>-        cli_local_t                     *local = NULL;</div><div class='del'>-</div><div class='del'>-        if (!frame || !this || !data) {</div><div class='del'>-                ret = -1;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        ctx = data;</div><div class='del'>-</div><div class='del'>-        ret = gf_cli3_1_get_volume (frame, this, data);</div><div class='del'>-</div><div class='del'>-        local = frame-&gt;local;</div><div class='del'>-</div><div class='del'>-        if (!local || !local-&gt;u.get_vol.volname) {</div><div class='del'>-                cli_out ("No volumes present");</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        ctx-&gt;volname = local-&gt;u.get_vol.volname;</div><div class='del'>-</div><div class='del'>-        while (ctx-&gt;volname) {</div><div class='del'>-                ret = gf_cli3_1_get_volume (frame, this, ctx);</div><div class='del'>-                if (ret)</div><div class='del'>-                        goto out;</div><div class='del'>-                ctx-&gt;volname = local-&gt;u.get_vol.volname;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-gf_cli3_1_get_volume (call_frame_t *frame, xlator_t *this,</div><div class='del'>-                      void *data)</div><div class='del'>-{</div><div class='del'>-        gf1_cli_get_vol_req             req = {0,};</div><div class='del'>-        int                             ret = 0;</div><div class='del'>-        cli_cmd_volume_get_ctx_t        *ctx = NULL;</div><div class='del'>-        dict_t                          *dict = NULL;</div><div class='del'>-</div><div class='del'>-        if (!frame || !this || !data) {</div><div class='del'>-                ret = -1;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        ctx = data;</div><div class='del'>-        req.flags = ctx-&gt;flags;</div><div class='del'>-</div><div class='del'>-        dict = dict_new ();</div><div class='del'>-        if (!dict)</div><div class='del'>-                goto out;</div><div class='del'>-</div><div class='del'>-        if (ctx-&gt;volname) {</div><div class='del'>-                ret = dict_set_str (dict, "volname", ctx-&gt;volname);</div><div class='del'>-                if (ret)</div><div class='del'>-                        goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        ret = dict_allocate_and_serialize (dict,</div><div class='del'>-                                           &amp;req.dict.dict_val,</div><div class='del'>-                                           (size_t *)&amp;req.dict.dict_len);</div><div class='del'>-</div><div class='del'>-        ret = cli_cmd_submit (&amp;req, frame, cli_rpc_prog,</div><div class='del'>-                              GD_MGMT_CLI_GET_VOLUME, NULL,</div><div class='del'>-                              gf_xdr_from_cli_get_vol_req,</div><div class='del'>-                              this, gf_cli3_1_get_volume_cbk);</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        gf_log ("cli", GF_LOG_DEBUG, "Returning %d", ret);</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-gf_cli3_1_create_volume (call_frame_t *frame, xlator_t *this,</div><div class='del'>-                         void *data)</div><div class='del'>-{</div><div class='del'>-        gf1_cli_create_vol_req  req = {0,};</div><div class='del'>-        int                     ret = 0;</div><div class='del'>-        dict_t                  *dict = NULL;</div><div class='del'>-        cli_local_t             *local = NULL;</div><div class='del'>-</div><div class='del'>-        if (!frame || !this ||  !data) {</div><div class='del'>-                ret = -1;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        dict = dict_ref ((dict_t *)data);</div><div class='del'>-</div><div class='del'>-        ret = dict_get_str (dict, "volname", &amp;req.volname);</div><div class='del'>-</div><div class='del'>-        if (ret)</div><div class='del'>-                goto out;</div><div class='del'>-</div><div class='del'>-        ret = dict_get_int32 (dict, "type", (int32_t *)&amp;req.type);</div><div class='del'>-</div><div class='del'>-        if (ret)</div><div class='del'>-                goto out;</div><div class='del'>-</div><div class='del'>-        ret = dict_get_int32 (dict, "count", &amp;req.count);</div><div class='del'>-        if (ret)</div><div class='del'>-                goto out;</div><div class='del'>-</div><div class='del'>-        ret = dict_allocate_and_serialize (dict,</div><div class='del'>-                                           &amp;req.bricks.bricks_val,</div><div class='del'>-                                           (size_t *)&amp;req.bricks.bricks_len);</div><div class='del'>-        if (ret &lt; 0) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-                        "failed to get serialized length of dict");</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        local = cli_local_get ();</div><div class='del'>-</div><div class='del'>-        if (local) {</div><div class='del'>-                local-&gt;u.create_vol.dict = dict_ref (dict);</div><div class='del'>-                frame-&gt;local = local;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        ret = cli_cmd_submit (&amp;req, frame, cli_rpc_prog,</div><div class='del'>-                              GD_MGMT_CLI_CREATE_VOLUME, NULL,</div><div class='del'>-                              gf_xdr_from_cli_create_vol_req,</div><div class='del'>-                              this, gf_cli3_1_create_volume_cbk);</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        gf_log ("cli", GF_LOG_DEBUG, "Returning %d", ret);</div><div class='del'>-</div><div class='del'>-        if (req.bricks.bricks_val) {</div><div class='del'>-                GF_FREE (req.bricks.bricks_val);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-gf_cli3_1_delete_volume (call_frame_t *frame, xlator_t *this,</div><div class='del'>-                         void *data)</div><div class='del'>-{</div><div class='del'>-        gf1_cli_delete_vol_req  req = {0,};</div><div class='del'>-        int                     ret = 0;</div><div class='del'>-        cli_local_t             *local = NULL;</div><div class='del'>-</div><div class='del'>-        if (!frame || !this ||  !data) {</div><div class='del'>-                ret = -1;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        local = cli_local_get ();</div><div class='del'>-</div><div class='del'>-        if (local) {</div><div class='del'>-                local-&gt;u.delete_vol.volname = data;</div><div class='del'>-                frame-&gt;local = local;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        req.volname = data;</div><div class='del'>-</div><div class='del'>-        ret = cli_cmd_submit (&amp;req, frame, cli_rpc_prog,</div><div class='del'>-                              GD_MGMT_CLI_DELETE_VOLUME, NULL,</div><div class='del'>-                              gf_xdr_from_cli_delete_vol_req,</div><div class='del'>-                              this, gf_cli3_1_delete_volume_cbk);</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        gf_log ("cli", GF_LOG_DEBUG, "Returning %d", ret);</div><div class='del'>-</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-gf_cli3_1_start_volume (call_frame_t *frame, xlator_t *this,</div><div class='del'>-                         void *data)</div><div class='del'>-{</div><div class='del'>-        gf1_cli_start_vol_req   req = {0,};</div><div class='del'>-        int                     ret = 0;</div><div class='del'>-        cli_local_t             *local = NULL;</div><div class='del'>-</div><div class='del'>-        if (!frame || !this ||  !data) {</div><div class='del'>-                ret = -1;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        local = cli_local_get ();</div><div class='del'>-</div><div class='del'>-        if (local) {</div><div class='del'>-                local-&gt;u.start_vol.volname = data;</div><div class='del'>-                frame-&gt;local = local;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        req.volname = data;</div><div class='del'>-</div><div class='del'>-        ret = cli_cmd_submit (&amp;req, frame, cli_rpc_prog,</div><div class='del'>-                              GD_MGMT_CLI_START_VOLUME, NULL,</div><div class='del'>-                              gf_xdr_from_cli_start_vol_req,</div><div class='del'>-                              this, gf_cli3_1_start_volume_cbk);</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        gf_log ("cli", GF_LOG_DEBUG, "Returning %d", ret);</div><div class='del'>-</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-gf_cli3_1_stop_volume (call_frame_t *frame, xlator_t *this,</div><div class='del'>-                         void *data)</div><div class='del'>-{</div><div class='del'>-        gf1_cli_stop_vol_req   req = {0,};</div><div class='del'>-        int                    ret = 0;</div><div class='del'>-        cli_local_t            *local = NULL;</div><div class='del'>-</div><div class='del'>-        if (!frame || !this ||  !data) {</div><div class='del'>-                ret = -1;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        req = *((gf1_cli_stop_vol_req*)data);</div><div class='del'>-        local = cli_local_get ();</div><div class='del'>-</div><div class='del'>-        if (local) {</div><div class='del'>-                local-&gt;u.stop_vol.volname = req.volname;</div><div class='del'>-                local-&gt;u.stop_vol.flags = req.flags;</div><div class='del'>-                frame-&gt;local = local;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        ret = cli_cmd_submit (&amp;req, frame, cli_rpc_prog,</div><div class='del'>-                              GD_MGMT_CLI_STOP_VOLUME, NULL,</div><div class='del'>-                              gf_xdr_from_cli_stop_vol_req,</div><div class='del'>-                              this, gf_cli3_1_stop_volume_cbk);</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        gf_log ("cli", GF_LOG_DEBUG, "Returning %d", ret);</div><div class='del'>-</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-gf_cli3_1_defrag_volume (call_frame_t *frame, xlator_t *this,</div><div class='del'>-                         void *data)</div><div class='del'>-{</div><div class='del'>-        gf1_cli_defrag_vol_req  req     = {0,};</div><div class='del'>-        int                     ret     = 0;</div><div class='del'>-        cli_local_t            *local   = NULL;</div><div class='del'>-        char                   *volname = NULL;</div><div class='del'>-        char                   *cmd_str = NULL;</div><div class='del'>-        dict_t                 *dict    = NULL;</div><div class='del'>-</div><div class='del'>-        if (!frame || !this ||  !data) {</div><div class='del'>-                ret = -1;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        dict = data;</div><div class='del'>-</div><div class='del'>-        ret = dict_get_str (dict, "volname", &amp;volname);</div><div class='del'>-        if (ret)</div><div class='del'>-                gf_log ("", GF_LOG_DEBUG, "error");</div><div class='del'>-</div><div class='del'>-        ret = dict_get_str (dict, "command", &amp;cmd_str);</div><div class='del'>-        if (ret) {</div><div class='del'>-                gf_log ("", GF_LOG_DEBUG, "error");</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (strncasecmp (cmd_str, "start", 6) == 0) {</div><div class='del'>-                req.cmd = GF_DEFRAG_CMD_START;</div><div class='del'>-        } else if (strncasecmp (cmd_str, "stop", 5) == 0) {</div><div class='del'>-                req.cmd = GF_DEFRAG_CMD_STOP;</div><div class='del'>-        } else if (strncasecmp (cmd_str, "status", 7) == 0) {</div><div class='del'>-                req.cmd = GF_DEFRAG_CMD_STATUS;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-        local = cli_local_get ();</div><div class='del'>-</div><div class='del'>-        if (local) {</div><div class='del'>-                local-&gt;u.defrag_vol.volname = gf_strdup (volname);</div><div class='del'>-                local-&gt;u.defrag_vol.cmd = req.cmd;</div><div class='del'>-                frame-&gt;local = local;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        req.volname = volname;</div><div class='del'>-</div><div class='del'>-        ret = cli_cmd_submit (&amp;req, frame, cli_rpc_prog,</div><div class='del'>-                              GD_MGMT_CLI_DEFRAG_VOLUME, NULL,</div><div class='del'>-                              gf_xdr_from_cli_defrag_vol_req,</div><div class='del'>-                              this, gf_cli3_1_defrag_volume_cbk);</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        gf_log ("cli", GF_LOG_DEBUG, "Returning %d", ret);</div><div class='del'>-</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-gf_cli3_1_rename_volume (call_frame_t *frame, xlator_t *this,</div><div class='del'>-                         void *data)</div><div class='del'>-{</div><div class='del'>-        gf1_cli_rename_vol_req  req = {0,};</div><div class='del'>-        int                     ret = 0;</div><div class='del'>-        dict_t                  *dict = NULL;</div><div class='del'>-</div><div class='del'>-        if (!frame || !this ||  !data) {</div><div class='del'>-                ret = -1;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        dict = data;</div><div class='del'>-</div><div class='del'>-        ret = dict_get_str (dict, "old-volname", &amp;req.old_volname);</div><div class='del'>-</div><div class='del'>-        if (ret)</div><div class='del'>-                goto out;</div><div class='del'>-</div><div class='del'>-        ret = dict_get_str (dict, "new-volname", &amp;req.new_volname);</div><div class='del'>-</div><div class='del'>-        if (ret)</div><div class='del'>-                goto out;</div><div class='del'>-</div><div class='del'>-        ret = cli_cmd_submit (&amp;req, frame, cli_rpc_prog,</div><div class='del'>-                              GD_MGMT_CLI_RENAME_VOLUME, NULL,</div><div class='del'>-                              gf_xdr_from_cli_rename_vol_req,</div><div class='del'>-                              this, gf_cli3_1_rename_volume_cbk);</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        gf_log ("cli", GF_LOG_DEBUG, "Returning %d", ret);</div><div class='del'>-</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-gf_cli3_1_set_volume (call_frame_t *frame, xlator_t *this,</div><div class='del'>-                         void *data)</div><div class='del'>-{</div><div class='del'>-        gf1_cli_set_vol_req     req = {0,};</div><div class='del'>-        int                     ret = 0;</div><div class='del'>-        dict_t                  *dict = NULL;</div><div class='del'>-</div><div class='del'>-        if (!frame || !this ||  !data) {</div><div class='del'>-                ret = -1;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        dict = data;</div><div class='del'>-</div><div class='del'>-        ret = dict_get_str (dict, "volname", &amp;req.volname);</div><div class='del'>-</div><div class='del'>-        if (ret)</div><div class='del'>-                goto out;</div><div class='del'>-</div><div class='del'>-        ret = dict_allocate_and_serialize (dict,</div><div class='del'>-                                           &amp;req.dict.dict_val,</div><div class='del'>-                                           (size_t *)&amp;req.dict.dict_len);</div><div class='del'>-        if (ret &lt; 0) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-                        "failed to get serialized length of dict");</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-        ret = cli_cmd_submit (&amp;req, frame, cli_rpc_prog,</div><div class='del'>-                              GD_MGMT_CLI_SET_VOLUME, NULL,</div><div class='del'>-                              gf_xdr_from_cli_set_vol_req,</div><div class='del'>-                              this, gf_cli3_1_set_volume_cbk);</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        gf_log ("cli", GF_LOG_DEBUG, "Returning %d", ret);</div><div class='del'>-</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-gf_cli3_1_add_brick (call_frame_t *frame, xlator_t *this,</div><div class='del'>-                         void *data)</div><div class='del'>-{</div><div class='del'>-        gf1_cli_add_brick_req  req = {0,};</div><div class='del'>-        int                     ret = 0;</div><div class='del'>-        dict_t                  *dict = NULL;</div><div class='del'>-</div><div class='del'>-        if (!frame || !this ||  !data) {</div><div class='del'>-                ret = -1;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        dict = data;</div><div class='del'>-</div><div class='del'>-        ret = dict_get_str (dict, "volname", &amp;req.volname);</div><div class='del'>-</div><div class='del'>-        if (ret)</div><div class='del'>-                goto out;</div><div class='del'>-</div><div class='del'>-        ret = dict_get_int32 (dict, "count", &amp;req.count);</div><div class='del'>-        if (ret)</div><div class='del'>-                goto out;</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-        ret = dict_allocate_and_serialize (dict,</div><div class='del'>-                                           &amp;req.bricks.bricks_val,</div><div class='del'>-                                           (size_t *)&amp;req.bricks.bricks_len);</div><div class='del'>-        if (ret &lt; 0) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-                        "failed to get serialized length of dict");</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        ret = cli_cmd_submit (&amp;req, frame, cli_rpc_prog,</div><div class='del'>-                              GD_MGMT_CLI_ADD_BRICK, NULL,</div><div class='del'>-                              gf_xdr_from_cli_add_brick_req,</div><div class='del'>-                              this, gf_cli3_1_add_brick_cbk);</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        gf_log ("cli", GF_LOG_DEBUG, "Returning %d", ret);</div><div class='del'>-</div><div class='del'>-        if (req.bricks.bricks_val) {</div><div class='del'>-                GF_FREE (req.bricks.bricks_val);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-gf_cli3_1_remove_brick (call_frame_t *frame, xlator_t *this,</div><div class='del'>-                         void *data)</div><div class='del'>-{</div><div class='del'>-        gf1_cli_remove_brick_req  req = {0,};</div><div class='del'>-        int                       ret = 0;</div><div class='del'>-        dict_t                    *dict = NULL;</div><div class='del'>-</div><div class='del'>-        if (!frame || !this ||  !data) {</div><div class='del'>-                ret = -1;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        dict = data;</div><div class='del'>-</div><div class='del'>-        ret = dict_get_str (dict, "volname", &amp;req.volname);</div><div class='del'>-</div><div class='del'>-        if (ret)</div><div class='del'>-                goto out;</div><div class='del'>-</div><div class='del'>-        ret = dict_get_int32 (dict, "type", (int32_t *)&amp;req.type);</div><div class='del'>-</div><div class='del'>-        if (ret)</div><div class='del'>-                goto out;</div><div class='del'>-</div><div class='del'>-        ret = dict_get_int32 (dict, "count", &amp;req.count);</div><div class='del'>-</div><div class='del'>-        if (ret)</div><div class='del'>-                goto out;</div><div class='del'>-</div><div class='del'>-        ret = dict_allocate_and_serialize (dict,</div><div class='del'>-                                           &amp;req.bricks.bricks_val,</div><div class='del'>-                                           (size_t *)&amp;req.bricks.bricks_len);</div><div class='del'>-        if (ret &lt; 0) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-                        "failed to get serialized length of dict");</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        ret = cli_cmd_submit (&amp;req, frame, cli_rpc_prog,</div><div class='del'>-                              GD_MGMT_CLI_REMOVE_BRICK, NULL,</div><div class='del'>-                              gf_xdr_from_cli_remove_brick_req,</div><div class='del'>-                              this, gf_cli3_1_remove_brick_cbk);</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        gf_log ("cli", GF_LOG_DEBUG, "Returning %d", ret);</div><div class='del'>-</div><div class='del'>-        if (req.bricks.bricks_val) {</div><div class='del'>-                GF_FREE (req.bricks.bricks_val);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-gf_cli3_1_replace_brick (call_frame_t *frame, xlator_t *this,</div><div class='del'>-                         void *data)</div><div class='del'>-{</div><div class='del'>-        gf1_cli_replace_brick_req   req        = {0,};</div><div class='del'>-        int                         ret        = 0;</div><div class='del'>-        cli_local_t                *local      = NULL;</div><div class='del'>-        dict_t                     *dict       = NULL;</div><div class='del'>-        char                       *src_brick  = NULL;</div><div class='del'>-        char                       *dst_brick  = NULL;</div><div class='del'>-</div><div class='del'>-        if (!frame || !this ||  !data) {</div><div class='del'>-                ret = -1;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-	dict = data;</div><div class='del'>-</div><div class='del'>-        local = cli_local_get ();</div><div class='del'>-        if (!local) {</div><div class='del'>-                ret = -1;</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-                        "Out of memory");</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        local-&gt;u.replace_brick.dict = dict_ref (dict);</div><div class='del'>-        frame-&gt;local                = local;</div><div class='del'>-</div><div class='del'>-        ret = dict_get_int32 (dict, "operation", (int32_t *)&amp;req.op);</div><div class='del'>-        if (ret) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-                        "dict_get on operation failed");</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-        ret = dict_get_str (dict, "volname", &amp;req.volname);</div><div class='del'>-        if (ret) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-                        "dict_get on volname failed");</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        local-&gt;u.replace_brick.volname = gf_strdup (req.volname);</div><div class='del'>-        if (!local-&gt;u.replace_brick.volname) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-                        "Out of memory");</div><div class='del'>-                ret = -1;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        ret = dict_get_str (dict, "src-brick", &amp;src_brick);</div><div class='del'>-        if (ret) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-                        "dict_get on src-brick failed");</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        ret = dict_get_str (dict, "dst-brick", &amp;dst_brick);</div><div class='del'>-        if (ret) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-                        "dict_get on dst-brick failed");</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-                "Recevied command replace-brick %s with "</div><div class='del'>-                "%s with operation=%d", src_brick,</div><div class='del'>-                dst_brick, req.op);</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-        ret = dict_allocate_and_serialize (dict,</div><div class='del'>-                                           &amp;req.bricks.bricks_val,</div><div class='del'>-                                           (size_t *)&amp;req.bricks.bricks_len);</div><div class='del'>-        if (ret &lt; 0) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-                        "failed to get serialized length of dict");</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        ret = cli_cmd_submit (&amp;req, frame, cli_rpc_prog,</div><div class='del'>-                              GD_MGMT_CLI_REPLACE_BRICK, NULL,</div><div class='del'>-                              gf_xdr_from_cli_replace_brick_req,</div><div class='del'>-                              this, gf_cli3_1_replace_brick_cbk);</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        gf_log ("cli", GF_LOG_DEBUG, "Returning %d", ret);</div><div class='del'>-</div><div class='del'>-        if (req.bricks.bricks_val) {</div><div class='del'>-                GF_FREE (req.bricks.bricks_val);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-gf_cli3_1_log_filename (call_frame_t *frame, xlator_t *this,</div><div class='del'>-                        void *data)</div><div class='del'>-{</div><div class='del'>-        gf1_cli_log_filename_req  req = {0,};</div><div class='del'>-        int                       ret = 0;</div><div class='del'>-        dict_t                   *dict = NULL;</div><div class='del'>-</div><div class='del'>-        if (!frame || !this ||  !data) {</div><div class='del'>-                ret = -1;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        dict = data;</div><div class='del'>-</div><div class='del'>-        ret = dict_get_str (dict, "volname", &amp;req.volname);</div><div class='del'>-        if (ret)</div><div class='del'>-                goto out;</div><div class='del'>-</div><div class='del'>-        ret = dict_get_str (dict, "brick", &amp;req.brick);</div><div class='del'>-        if (ret)</div><div class='del'>-                req.brick = "";</div><div class='del'>-</div><div class='del'>-        ret = dict_get_str (dict, "path", &amp;req.path);</div><div class='del'>-        if (ret)</div><div class='del'>-                goto out;</div><div class='del'>-</div><div class='del'>-        ret = cli_cmd_submit (&amp;req, frame, cli_rpc_prog,</div><div class='del'>-                              GD_MGMT_CLI_LOG_FILENAME, NULL,</div><div class='del'>-                              gf_xdr_from_cli_log_filename_req,</div><div class='del'>-                              this, gf_cli3_1_log_filename_cbk);</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        gf_log ("cli", GF_LOG_DEBUG, "Returning %d", ret);</div><div class='del'>-</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-gf_cli3_1_log_locate (call_frame_t *frame, xlator_t *this,</div><div class='del'>-                      void *data)</div><div class='del'>-{</div><div class='del'>-        gf1_cli_log_locate_req  req = {0,};</div><div class='del'>-        int                     ret = 0;</div><div class='del'>-        dict_t                 *dict = NULL;</div><div class='del'>-</div><div class='del'>-        if (!frame || !this ||  !data) {</div><div class='del'>-                ret = -1;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        dict = data;</div><div class='del'>-</div><div class='del'>-        ret = dict_get_str (dict, "volname", &amp;req.volname);</div><div class='del'>-        if (ret)</div><div class='del'>-                goto out;</div><div class='del'>-</div><div class='del'>-        ret = dict_get_str (dict, "brick", &amp;req.brick);</div><div class='del'>-        if (ret)</div><div class='del'>-                req.brick = "";</div><div class='del'>-</div><div class='del'>-        ret = cli_cmd_submit (&amp;req, frame, cli_rpc_prog,</div><div class='del'>-                              GD_MGMT_CLI_LOG_LOCATE, NULL,</div><div class='del'>-                              gf_xdr_from_cli_log_locate_req,</div><div class='del'>-                              this, gf_cli3_1_log_locate_cbk);</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        gf_log ("cli", GF_LOG_DEBUG, "Returning %d", ret);</div><div class='del'>-</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-gf_cli3_1_log_rotate (call_frame_t *frame, xlator_t *this,</div><div class='del'>-                      void *data)</div><div class='del'>-{</div><div class='del'>-        gf1_cli_log_locate_req  req = {0,};</div><div class='del'>-        int                       ret = 0;</div><div class='del'>-        dict_t                   *dict = NULL;</div><div class='del'>-</div><div class='del'>-        if (!frame || !this ||  !data) {</div><div class='del'>-                ret = -1;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        dict = data;</div><div class='del'>-</div><div class='del'>-        ret = dict_get_str (dict, "volname", &amp;req.volname);</div><div class='del'>-        if (ret)</div><div class='del'>-                goto out;</div><div class='del'>-</div><div class='del'>-        ret = dict_get_str (dict, "brick", &amp;req.brick);</div><div class='del'>-        if (ret)</div><div class='del'>-                req.brick = "";</div><div class='del'>-</div><div class='del'>-        ret = cli_cmd_submit (&amp;req, frame, cli_rpc_prog,</div><div class='del'>-                              GD_MGMT_CLI_LOG_ROTATE, NULL,</div><div class='del'>-                              gf_xdr_from_cli_log_rotate_req,</div><div class='del'>-                              this, gf_cli3_1_log_rotate_cbk);</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        gf_log ("cli", GF_LOG_DEBUG, "Returning %d", ret);</div><div class='del'>-</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-struct rpc_clnt_procedure gluster3_1_cli_actors[GF1_CLI_MAXVALUE] = {</div><div class='del'>-        [GF1_CLI_NULL]        = {"NULL", NULL },</div><div class='del'>-        [GF1_CLI_PROBE]  = { "PROBE_QUERY",  gf_cli3_1_probe},</div><div class='del'>-        [GF1_CLI_DEPROBE]  = { "DEPROBE_QUERY",  gf_cli3_1_deprobe},</div><div class='del'>-        [GF1_CLI_LIST_FRIENDS]  = { "LIST_FRIENDS",  gf_cli3_1_list_friends},</div><div class='del'>-        [GF1_CLI_CREATE_VOLUME] = {"CREATE_VOLUME", gf_cli3_1_create_volume},</div><div class='del'>-        [GF1_CLI_DELETE_VOLUME] = {"DELETE_VOLUME", gf_cli3_1_delete_volume},</div><div class='del'>-        [GF1_CLI_START_VOLUME] = {"START_VOLUME", gf_cli3_1_start_volume},</div><div class='del'>-        [GF1_CLI_STOP_VOLUME] = {"STOP_VOLUME", gf_cli3_1_stop_volume},</div><div class='del'>-        [GF1_CLI_RENAME_VOLUME] = {"RENAME_VOLUME", gf_cli3_1_rename_volume},</div><div class='del'>-        [GF1_CLI_DEFRAG_VOLUME] = {"DEFRAG_VOLUME", gf_cli3_1_defrag_volume},</div><div class='del'>-        [GF1_CLI_GET_VOLUME] = {"GET_VOLUME", gf_cli3_1_get_volume},</div><div class='del'>-        [GF1_CLI_GET_NEXT_VOLUME] = {"GET_NEXT_VOLUME", gf_cli3_1_get_next_volume},</div><div class='del'>-        [GF1_CLI_SET_VOLUME] = {"SET_VOLUME", gf_cli3_1_set_volume},</div><div class='del'>-        [GF1_CLI_ADD_BRICK] = {"ADD_BRICK", gf_cli3_1_add_brick},</div><div class='del'>-        [GF1_CLI_REMOVE_BRICK] = {"REMOVE_BRICK", gf_cli3_1_remove_brick},</div><div class='del'>-        [GF1_CLI_REPLACE_BRICK] = {"REPLACE_BRICK", gf_cli3_1_replace_brick},</div><div class='del'>-        [GF1_CLI_LOG_FILENAME] = {"LOG FILENAME", gf_cli3_1_log_filename},</div><div class='del'>-        [GF1_CLI_LOG_LOCATE] = {"LOG LOCATE", gf_cli3_1_log_locate},</div><div class='del'>-        [GF1_CLI_LOG_ROTATE] = {"LOG ROTATE", gf_cli3_1_log_rotate},</div><div class='del'>-};</div><div class='del'>-</div><div class='del'>-struct rpc_clnt_program cli3_1_prog = {</div><div class='del'>-        .progname = "CLI 3.1",</div><div class='del'>-        .prognum  = GLUSTER3_1_CLI_PROGRAM,</div><div class='del'>-        .progver  = GLUSTER3_1_CLI_VERSION,</div><div class='del'>-        .proctable  = gluster3_1_cli_actors,</div><div class='del'>-        .numproc  = GLUSTER3_1_CLI_PROCCNT,</div><div class='del'>-};</div><div class='head'>diff --git a/cli/src/input.c b/cli/src/input.c<br/>index 2c67b354d4c..5ac1a20edb1 100644<br/>--- a/<a href='/cgit/glusterfs.git/tree/cli/src/input.c?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>cli/src/input.c</a><br/>+++ b/<a href='/cgit/glusterfs.git/tree/cli/src/input.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>cli/src/input.c</a></div><div class='hunk'>@@ -1,117 +1,93 @@</div><div class='ctx'> /*</div><div class='del'>-  Copyright (c) 2010 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='del'>-  This file is part of GlusterFS.</div><div class='del'>-</div><div class='del'>-  GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-  it under the terms of the GNU Affero General Public License as published</div><div class='del'>-  by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-  or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-  GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-  WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-  Affero General Public License for more details.</div><div class='del'>-</div><div class='del'>-  You should have received a copy of the GNU Affero General Public License</div><div class='del'>-  along with this program.  If not, see</div><div class='del'>-  &lt;http://www.gnu.org/licenses/&gt;.</div><div class='del'>-*/</div><div class='add'>+   Copyright (c) 2010-2012 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+   This file is part of GlusterFS.</div><div class='ctx'> </div><div class='add'>+   This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+   General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+   later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+   cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='ctx'> #include &lt;stdio.h&gt;</div><div class='ctx'> #include &lt;string.h&gt;</div><div class='ctx'> #include &lt;stdlib.h&gt;</div><div class='ctx'> #include &lt;stdint.h&gt;</div><div class='ctx'> #include &lt;pthread.h&gt;</div><div class='ctx'> </div><div class='del'>-#ifndef _CONFIG_H</div><div class='del'>-#define _CONFIG_H</div><div class='del'>-#include "config.h"</div><div class='del'>-#endif</div><div class='del'>-</div><div class='ctx'> #include "cli.h"</div><div class='ctx'> #include "cli-mem-types.h"</div><div class='ctx'> </div><div class='ctx'> #define CMDBUFSIZ 1024</div><div class='ctx'> </div><div class='ctx'> void *</div><div class='del'>-cli_batch (void *d)</div><div class='add'>+cli_batch(void *d)</div><div class='ctx'> {</div><div class='del'>-        struct cli_state *state = NULL;</div><div class='del'>-        int               ret = 0;</div><div class='add'>+    struct cli_state *state = NULL;</div><div class='add'>+    int ret = 0;</div><div class='ctx'> </div><div class='del'>-        state = d;</div><div class='add'>+    state = d;</div><div class='ctx'> </div><div class='del'>-        if (state-&gt;mode == GLUSTER_MODE_SCRIPT)</div><div class='del'>-                ret = cli_cmd_process (state, state-&gt;argc - 2, state-&gt;argv + 2);</div><div class='del'>-        else</div><div class='del'>-                ret = cli_cmd_process (state, state-&gt;argc, state-&gt;argv);</div><div class='add'>+    ret = cli_cmd_process(state, state-&gt;argc, state-&gt;argv);</div><div class='ctx'> </div><div class='del'>-        gf_log ("", GF_LOG_NORMAL, "Exiting with: %d", ret);</div><div class='del'>-        exit (ret);</div><div class='add'>+    gf_log("", GF_LOG_INFO, "Exiting with: %d", ret);</div><div class='add'>+    exit(-ret);</div><div class='ctx'> </div><div class='del'>-        return NULL;</div><div class='add'>+    return NULL;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> void *</div><div class='del'>-cli_input (void *d)</div><div class='add'>+cli_input(void *d)</div><div class='ctx'> {</div><div class='del'>-        struct cli_state *state = NULL;</div><div class='del'>-        int               ret = 0;</div><div class='del'>-        char              cmdbuf[CMDBUFSIZ];</div><div class='del'>-        char             *cmd = NULL;</div><div class='del'>-        size_t            len = 0;</div><div class='del'>-</div><div class='del'>-        state = d;</div><div class='del'>-</div><div class='del'>-        for (;;) {</div><div class='del'>-                printf ("%s", state-&gt;prompt);</div><div class='del'>-</div><div class='del'>-                cmd = fgets (cmdbuf, CMDBUFSIZ, stdin);</div><div class='del'>-                if (!cmd)</div><div class='del'>-                        break;</div><div class='del'>-                len = strlen(cmd);</div><div class='del'>-                if (len &gt; 0 &amp;&amp; cmd[len - 1] == '\n') //strip trailing \n</div><div class='del'>-                        cmd[len - 1] = '\0';</div><div class='del'>-                ret = cli_cmd_process_line (state, cmd);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        exit (ret);</div><div class='del'>-</div><div class='del'>-        return NULL;</div><div class='add'>+    struct cli_state *state = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    char cmdbuf[CMDBUFSIZ];</div><div class='add'>+    char *cmd = NULL;</div><div class='add'>+    size_t len = 0;</div><div class='add'>+</div><div class='add'>+    state = d;</div><div class='add'>+</div><div class='add'>+    fprintf(stderr,</div><div class='add'>+            "Welcome to gluster prompt, type 'help' to see the available "</div><div class='add'>+            "commands.\n");</div><div class='add'>+    for (;;) {</div><div class='add'>+        printf("%s", state-&gt;prompt);</div><div class='add'>+</div><div class='add'>+        cmd = fgets(cmdbuf, CMDBUFSIZ, stdin);</div><div class='add'>+        if (!cmd)</div><div class='add'>+            break;</div><div class='add'>+        len = strlen(cmd);</div><div class='add'>+        if (len &gt; 0 &amp;&amp; cmd[len - 1] == '\n')  // strip trailing \n</div><div class='add'>+            cmd[len - 1] = '\0';</div><div class='add'>+        ret = cli_cmd_process_line(state, cmd);</div><div class='add'>+        if (ret != 0 &amp;&amp; state-&gt;mode &amp; GLUSTER_MODE_ERR_FATAL)</div><div class='add'>+            break;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    exit(-ret);</div><div class='add'>+</div><div class='add'>+    return NULL;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-cli_input_init (struct cli_state *state)</div><div class='add'>+cli_input_init(struct cli_state *state)</div><div class='ctx'> {</div><div class='del'>-        int  ret = 0;</div><div class='del'>-        gf_boolean_t  is_batch = _gf_false;</div><div class='del'>-</div><div class='del'>-        if (1 &lt; state-&gt;argc) {</div><div class='del'>-                if (!strcmp ("mode", state-&gt;argv[0]) &amp;&amp;</div><div class='del'>-                    !strcmp ("script", state-&gt;argv[1])) {</div><div class='del'>-                        state-&gt;mode = GLUSTER_MODE_SCRIPT;</div><div class='del'>-                        if (2 &lt; state-&gt;argc)</div><div class='del'>-                                is_batch = _gf_true;</div><div class='del'>-                } else {</div><div class='del'>-                        is_batch = _gf_true;</div><div class='del'>-                }</div><div class='del'>-        } else if (1 == state-&gt;argc) {</div><div class='del'>-                is_batch = _gf_true;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (is_batch) {</div><div class='del'>-                ret = pthread_create (&amp;state-&gt;input, NULL, cli_batch, state);</div><div class='del'>-                return ret;</div><div class='del'>-        }</div><div class='add'>+    int ret = 0;</div><div class='ctx'> </div><div class='add'>+    if (state-&gt;argc) {</div><div class='add'>+        ret = pthread_create(&amp;state-&gt;input, NULL, cli_batch, state);</div><div class='add'>+        return ret;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (isatty(STDIN_FILENO)) {</div><div class='ctx'>         state-&gt;prompt = "gluster&gt; ";</div><div class='ctx'> </div><div class='del'>-        cli_rl_enable (state);</div><div class='add'>+        cli_rl_enable(state);</div><div class='add'>+    } else {</div><div class='add'>+        state-&gt;prompt = "";</div><div class='add'>+        state-&gt;mode |= GLUSTER_MODE_SCRIPT | GLUSTER_MODE_ERR_FATAL;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        if (!state-&gt;rl_enabled)</div><div class='del'>-                ret = pthread_create (&amp;state-&gt;input, NULL, cli_input, state);</div><div class='add'>+    if (!state-&gt;rl_enabled)</div><div class='add'>+        ret = pthread_create(&amp;state-&gt;input, NULL, cli_input, state);</div><div class='ctx'> </div><div class='del'>-        return ret;</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='head'>diff --git a/cli/src/registry.c b/cli/src/registry.c<br/>index c3634d974de..85f7686ade1 100644<br/>--- a/<a href='/cgit/glusterfs.git/tree/cli/src/registry.c?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>cli/src/registry.c</a><br/>+++ b/<a href='/cgit/glusterfs.git/tree/cli/src/registry.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>cli/src/registry.c</a></div><div class='hunk'>@@ -1,27 +1,12 @@</div><div class='ctx'> /*</div><div class='del'>-  Copyright (c) 2010 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='del'>-  This file is part of GlusterFS.</div><div class='del'>-</div><div class='del'>-  GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-  it under the terms of the GNU Affero General Public License as published</div><div class='del'>-  by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-  or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-  GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-  WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-  Affero General Public License for more details.</div><div class='del'>-</div><div class='del'>-  You should have received a copy of the GNU Affero General Public License</div><div class='del'>-  along with this program.  If not, see</div><div class='del'>-  &lt;http://www.gnu.org/licenses/&gt;.</div><div class='del'>-*/</div><div class='del'>-</div><div class='add'>+   Copyright (c) 2010-2012 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+   This file is part of GlusterFS.</div><div class='ctx'> </div><div class='del'>-#ifndef _CONFIG_H</div><div class='del'>-#define _CONFIG_H</div><div class='del'>-#include "config.h"</div><div class='del'>-#endif</div><div class='add'>+   This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+   General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+   later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+   cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='ctx'> </div><div class='ctx'> #include &lt;stdio.h&gt;</div><div class='ctx'> #include &lt;string.h&gt;</div><div class='hunk'>@@ -30,20 +15,18 @@</div><div class='ctx'> #include "cli.h"</div><div class='ctx'> #include "cli-cmd.h"</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> static int</div><div class='del'>-__is_spc (int ch)</div><div class='add'>+__is_spc(int ch)</div><div class='ctx'> {</div><div class='del'>-        if (ch == ' ')</div><div class='del'>-                return 1;</div><div class='del'>-        return 0;</div><div class='add'>+    if (ch == ' ')</div><div class='add'>+        return 1;</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> static int</div><div class='del'>-__is_div (int ch)</div><div class='add'>+__is_div(int ch)</div><div class='ctx'> {</div><div class='del'>-        switch (ch) {</div><div class='add'>+    switch (ch) {</div><div class='ctx'>         case '(':</div><div class='ctx'>         case ')':</div><div class='ctx'>         case '&lt;':</div><div class='hunk'>@@ -53,336 +36,356 @@ __is_div (int ch)</div><div class='ctx'>         case '{':</div><div class='ctx'>         case '}':</div><div class='ctx'>         case '|':</div><div class='del'>-                return 1;</div><div class='del'>-        }</div><div class='add'>+            return 1;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        return 0;</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> static int</div><div class='del'>-__is_word (const char *word)</div><div class='add'>+__is_word(const char *word)</div><div class='ctx'> {</div><div class='del'>-        return (!__is_div (*word) &amp;&amp; !__is_spc (*word));</div><div class='add'>+    return (!__is_div(*word) &amp;&amp; !__is_spc(*word));</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-counter_char (int ch)</div><div class='add'>+counter_char(int ch)</div><div class='ctx'> {</div><div class='del'>-        switch (ch) {</div><div class='add'>+    switch (ch) {</div><div class='ctx'>         case '(':</div><div class='del'>-                return ')';</div><div class='add'>+            return ')';</div><div class='ctx'>         case '&lt;':</div><div class='del'>-                return '&gt;';</div><div class='add'>+            return '&gt;';</div><div class='ctx'>         case '[':</div><div class='del'>-                return ']';</div><div class='add'>+            return ']';</div><div class='ctx'>         case '{':</div><div class='del'>-                return '}';</div><div class='del'>-        }</div><div class='add'>+            return '}';</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        return -1;</div><div class='add'>+    return -1;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> const char *</div><div class='del'>-__is_template_balanced (const char *template)</div><div class='add'>+__is_template_balanced(const char *template)</div><div class='ctx'> {</div><div class='del'>-        const char *trav = NULL;</div><div class='del'>-        int   ch = 0;</div><div class='del'>-</div><div class='del'>-        trav = template;</div><div class='del'>-</div><div class='del'>-        while (*trav) {</div><div class='del'>-                ch = *trav;</div><div class='del'>-</div><div class='del'>-                switch (ch) {</div><div class='del'>-                case '&lt;':</div><div class='del'>-                case '(':</div><div class='del'>-                case '[':</div><div class='del'>-                        trav = __is_template_balanced (trav+1);</div><div class='del'>-                        if (!trav)</div><div class='del'>-                                return NULL;</div><div class='del'>-                        if (*trav != counter_char (ch))</div><div class='del'>-                                return NULL;</div><div class='del'>-                        break;</div><div class='del'>-                case '&gt;':</div><div class='del'>-                case ')':</div><div class='del'>-                case ']':</div><div class='del'>-                        return trav;</div><div class='del'>-                }</div><div class='add'>+    const char *trav = NULL;</div><div class='add'>+    int ch = 0;</div><div class='add'>+</div><div class='add'>+    trav = template;</div><div class='add'>+</div><div class='add'>+    while (*trav) {</div><div class='add'>+        ch = *trav;</div><div class='ctx'> </div><div class='del'>-                trav++;</div><div class='add'>+        switch (ch) {</div><div class='add'>+            case '&lt;':</div><div class='add'>+            case '(':</div><div class='add'>+            case '[':</div><div class='add'>+                trav = __is_template_balanced(trav + 1);</div><div class='add'>+                if (!trav)</div><div class='add'>+                    return NULL;</div><div class='add'>+                if (*trav != counter_char(ch))</div><div class='add'>+                    return NULL;</div><div class='add'>+                break;</div><div class='add'>+            case '&gt;':</div><div class='add'>+            case ')':</div><div class='add'>+            case ']':</div><div class='add'>+                return trav;</div><div class='ctx'>         }</div><div class='ctx'> </div><div class='del'>-        return trav;</div><div class='del'>-}</div><div class='add'>+        trav++;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='add'>+    return trav;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-is_template_balanced (const char *template)</div><div class='add'>+is_template_balanced(const char *template)</div><div class='ctx'> {</div><div class='del'>-        const char *trav = NULL;</div><div class='add'>+    const char *trav = NULL;</div><div class='ctx'> </div><div class='del'>-        trav = __is_template_balanced (template);</div><div class='del'>-        if (!trav || *trav)</div><div class='del'>-                return -1;</div><div class='add'>+    trav = __is_template_balanced(template);</div><div class='add'>+    if (!trav || *trav)</div><div class='add'>+        return -1;</div><div class='ctx'> </div><div class='del'>-        return 0;</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-cli_cmd_token_count (const char *template)</div><div class='add'>+cli_cmd_token_count(const char *template)</div><div class='ctx'> {</div><div class='del'>-        int         count = 0;</div><div class='del'>-        const char *trav = NULL;</div><div class='del'>-        int         is_alnum = 0;</div><div class='del'>-</div><div class='del'>-        for (trav = template; *trav; trav++) {</div><div class='del'>-                switch (*trav) {</div><div class='del'>-                case '&lt;':</div><div class='del'>-                case '&gt;':</div><div class='del'>-                case '(':</div><div class='del'>-                case ')':</div><div class='del'>-                case '[':</div><div class='del'>-                case ']':</div><div class='del'>-                case '{':</div><div class='del'>-                case '}':</div><div class='del'>-                case '|':</div><div class='del'>-                        count++;</div><div class='del'>-                        /* fall through */</div><div class='del'>-                case ' ':</div><div class='del'>-                        is_alnum = 0;</div><div class='del'>-                        break;</div><div class='del'>-                default:</div><div class='del'>-                        if (!is_alnum) {</div><div class='del'>-                                is_alnum = 1;</div><div class='del'>-                                count++;</div><div class='del'>-                        }</div><div class='add'>+    int count = 0;</div><div class='add'>+    const char *trav = NULL;</div><div class='add'>+    int is_alnum = 0;</div><div class='add'>+</div><div class='add'>+    for (trav = template; *trav; trav++) {</div><div class='add'>+        switch (*trav) {</div><div class='add'>+            case '&lt;':</div><div class='add'>+            case '&gt;':</div><div class='add'>+            case '(':</div><div class='add'>+            case ')':</div><div class='add'>+            case '[':</div><div class='add'>+            case ']':</div><div class='add'>+            case '{':</div><div class='add'>+            case '}':</div><div class='add'>+            case '|':</div><div class='add'>+                count++;</div><div class='add'>+                /* fall through */</div><div class='add'>+            case ' ':</div><div class='add'>+                is_alnum = 0;</div><div class='add'>+                break;</div><div class='add'>+            default:</div><div class='add'>+                if (!is_alnum) {</div><div class='add'>+                    is_alnum = 1;</div><div class='add'>+                    count++;</div><div class='ctx'>                 }</div><div class='ctx'>         }</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        return count + 1;</div><div class='add'>+    return count + 1;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> void</div><div class='del'>-cli_cmd_tokens_destroy (char **tokens)</div><div class='add'>+cli_cmd_tokens_destroy(char **tokens)</div><div class='ctx'> {</div><div class='del'>-        char **tokenp = NULL;</div><div class='add'>+    char **tokenp = NULL;</div><div class='ctx'> </div><div class='del'>-        if (!tokens)</div><div class='del'>-                return;</div><div class='add'>+    if (!tokens)</div><div class='add'>+        return;</div><div class='ctx'> </div><div class='del'>-        tokenp = tokens;</div><div class='del'>-        while (*tokenp) {</div><div class='del'>-                free (*tokenp);</div><div class='del'>-                tokenp++;</div><div class='del'>-        }</div><div class='add'>+    tokenp = tokens;</div><div class='add'>+    while (*tokenp) {</div><div class='add'>+        free(*tokenp);</div><div class='add'>+        tokenp++;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        free (tokens);</div><div class='add'>+    free(tokens);</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-cli_cmd_tokens_fill (char **tokens, const char *template)</div><div class='add'>+cli_cmd_tokens_fill(char **tokens, const char *template)</div><div class='ctx'> {</div><div class='del'>-        const char  *trav = NULL;</div><div class='del'>-        char       **tokenp = NULL;</div><div class='del'>-        char        *token = NULL;</div><div class='del'>-        int          ret = 0;</div><div class='del'>-        int          ch = 0;</div><div class='add'>+    const char *trav = NULL;</div><div class='add'>+    char **tokenp = NULL;</div><div class='add'>+    char *token = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    int ch = 0;</div><div class='ctx'> </div><div class='del'>-        tokenp = tokens;</div><div class='add'>+    tokenp = tokens;</div><div class='ctx'> </div><div class='del'>-        for (trav = template; *trav; trav++) {</div><div class='del'>-                ch = *trav;</div><div class='add'>+    for (trav = template; *trav; trav++) {</div><div class='add'>+        ch = *trav;</div><div class='ctx'> </div><div class='del'>-                if (__is_spc (ch))</div><div class='del'>-                        continue;</div><div class='add'>+        if (__is_spc(ch))</div><div class='add'>+            continue;</div><div class='ctx'> </div><div class='del'>-                if (__is_div (ch)) {</div><div class='del'>-                        token = calloc (2, 1);</div><div class='del'>-                        if (!token)</div><div class='del'>-                                return -1;</div><div class='del'>-                        token[0] = ch;</div><div class='add'>+        if (__is_div(ch)) {</div><div class='add'>+            token = calloc(2, 1);</div><div class='add'>+            if (!token)</div><div class='add'>+                return -1;</div><div class='add'>+            token[0] = ch;</div><div class='ctx'> </div><div class='del'>-                        *tokenp = token;</div><div class='del'>-                        tokenp++;</div><div class='add'>+            *tokenp = token;</div><div class='add'>+            tokenp++;</div><div class='ctx'> </div><div class='del'>-                        continue;</div><div class='del'>-                }</div><div class='add'>+            continue;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-                token = strdup (trav);</div><div class='del'>-                *tokenp = token;</div><div class='del'>-                tokenp++;</div><div class='add'>+        token = strdup(trav);</div><div class='add'>+        *tokenp = token;</div><div class='add'>+        tokenp++;</div><div class='ctx'> </div><div class='del'>-                for (token++; *token; token++) {</div><div class='del'>-                        if (__is_spc (*token) || __is_div (*token)) {</div><div class='del'>-                                *token = 0;</div><div class='del'>-                                break;</div><div class='del'>-                        }</div><div class='del'>-                        trav++;</div><div class='del'>-                }</div><div class='add'>+        for (token++; *token; token++) {</div><div class='add'>+            if (__is_spc(*token) || __is_div(*token)) {</div><div class='add'>+                *token = 0;</div><div class='add'>+                break;</div><div class='add'>+            }</div><div class='add'>+            trav++;</div><div class='ctx'>         }</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        return ret;</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> char **</div><div class='del'>-cli_cmd_tokenize (const char *template)</div><div class='add'>+cli_cmd_tokenize(const char *template)</div><div class='ctx'> {</div><div class='del'>-        char **tokens = NULL;</div><div class='del'>-        int    ret = 0;</div><div class='del'>-        int    count = 0;</div><div class='add'>+    char **tokens = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    int count = 0;</div><div class='ctx'> </div><div class='del'>-        ret = is_template_balanced (template);</div><div class='del'>-        if (ret)</div><div class='del'>-                return NULL;</div><div class='add'>+    ret = is_template_balanced(template);</div><div class='add'>+    if (ret)</div><div class='add'>+        return NULL;</div><div class='ctx'> </div><div class='del'>-        count = cli_cmd_token_count (template);</div><div class='del'>-        if (count &lt;= 0)</div><div class='del'>-                return NULL;</div><div class='add'>+    count = cli_cmd_token_count(template);</div><div class='add'>+    if (count &lt;= 0)</div><div class='add'>+        return NULL;</div><div class='ctx'> </div><div class='del'>-        tokens = calloc (count + 1, sizeof (char *));</div><div class='del'>-        if (!tokens)</div><div class='del'>-                return NULL;</div><div class='add'>+    tokens = calloc(count + 1, sizeof(char *));</div><div class='add'>+    if (!tokens)</div><div class='add'>+        return NULL;</div><div class='ctx'> </div><div class='del'>-        ret = cli_cmd_tokens_fill (tokens, template);</div><div class='del'>-        if (ret)</div><div class='del'>-                goto err;</div><div class='add'>+    ret = cli_cmd_tokens_fill(tokens, template);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto err;</div><div class='ctx'> </div><div class='del'>-        return tokens;</div><div class='add'>+    return tokens;</div><div class='ctx'> err:</div><div class='del'>-        cli_cmd_tokens_destroy (tokens);</div><div class='del'>-        return NULL;</div><div class='add'>+    cli_cmd_tokens_destroy(tokens);</div><div class='add'>+    return NULL;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='del'>-struct cli_cmd_word *</div><div class='del'>-cli_cmd_nextword (struct cli_cmd_word *word, const char *token)</div><div class='add'>+void *</div><div class='add'>+cli_getunamb(const char *tok, void **choices, cli_selector_t sel)</div><div class='ctx'> {</div><div class='del'>-        struct cli_cmd_word    *next = NULL;</div><div class='del'>-        struct cli_cmd_word   **trav = NULL;</div><div class='del'>-        int                     ret = 0;</div><div class='del'>-</div><div class='del'>-        if (!word-&gt;nextwords)</div><div class='del'>-                return NULL;</div><div class='del'>-</div><div class='del'>-        for (trav = word-&gt;nextwords; (next = *trav); trav++) {</div><div class='del'>-                if (next-&gt;match) {</div><div class='del'>-//                        ret = next-&gt;match ();</div><div class='del'>-                } else {</div><div class='del'>-                        ret = strcmp (next-&gt;word, token);</div><div class='del'>-                }</div><div class='add'>+    void **wcon = NULL;</div><div class='add'>+    char *w = NULL;</div><div class='add'>+    unsigned mn = 0;</div><div class='add'>+    void *ret = NULL;</div><div class='ctx'> </div><div class='del'>-                if (ret == 0)</div><div class='del'>-                        break;</div><div class='del'>-        }</div><div class='add'>+    if (!choices || !tok || !*tok)</div><div class='add'>+        return NULL;</div><div class='ctx'> </div><div class='del'>-        return next;</div><div class='add'>+    for (wcon = choices; *wcon; wcon++) {</div><div class='add'>+        w = strtail((char *)sel(*wcon), tok);</div><div class='add'>+        if (!w)</div><div class='add'>+            /* no match */</div><div class='add'>+            continue;</div><div class='add'>+        if (!*w)</div><div class='add'>+            /* exact match */</div><div class='add'>+            return *wcon;</div><div class='add'>+</div><div class='add'>+        ret = *wcon;</div><div class='add'>+        mn++;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+#ifdef FORCE_MATCH_EXACT</div><div class='add'>+    return NULL;</div><div class='add'>+#else</div><div class='add'>+    return (mn == 1) ? ret : NULL;</div><div class='add'>+#endif</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+static const char *</div><div class='add'>+sel_cmd_word(void *wcon)</div><div class='add'>+{</div><div class='add'>+    return ((struct cli_cmd_word *)wcon)-&gt;word;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> struct cli_cmd_word *</div><div class='del'>-cli_cmd_newword (struct cli_cmd_word *word, const char *token)</div><div class='add'>+cli_cmd_nextword(struct cli_cmd_word *word, const char *token)</div><div class='ctx'> {</div><div class='del'>-        struct cli_cmd_word **nextwords = NULL;</div><div class='del'>-        struct cli_cmd_word  *nextword = NULL;</div><div class='add'>+    return (struct cli_cmd_word *)cli_getunamb(token, (void **)word-&gt;nextwords,</div><div class='add'>+                                               sel_cmd_word);</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        nextwords = realloc (word-&gt;nextwords,</div><div class='del'>-                             (word-&gt;nextwords_cnt + 2) * sizeof (*nextwords));</div><div class='del'>-        if (!nextwords)</div><div class='del'>-                return NULL;</div><div class='add'>+struct cli_cmd_word *</div><div class='add'>+cli_cmd_newword(struct cli_cmd_word *word, const char *token)</div><div class='add'>+{</div><div class='add'>+    struct cli_cmd_word **nextwords = NULL;</div><div class='add'>+    struct cli_cmd_word *nextword = NULL;</div><div class='ctx'> </div><div class='del'>-        word-&gt;nextwords = nextwords;</div><div class='add'>+    nextwords = realloc(word-&gt;nextwords,</div><div class='add'>+                        (word-&gt;nextwords_cnt + 2) * sizeof(*nextwords));</div><div class='add'>+    if (!nextwords)</div><div class='add'>+        return NULL;</div><div class='ctx'> </div><div class='del'>-        nextword = calloc (1, sizeof (*nextword));</div><div class='del'>-        if (!nextword)</div><div class='del'>-                return NULL;</div><div class='add'>+    word-&gt;nextwords = nextwords;</div><div class='ctx'> </div><div class='del'>-        nextword-&gt;word = strdup (token);</div><div class='del'>-        if (!nextword-&gt;word) {</div><div class='del'>-                free (nextword);</div><div class='del'>-                return NULL;</div><div class='del'>-        }</div><div class='add'>+    nextword = calloc(1, sizeof(*nextword));</div><div class='add'>+    if (!nextword)</div><div class='add'>+        return NULL;</div><div class='ctx'> </div><div class='del'>-        nextword-&gt;tree = word-&gt;tree;</div><div class='del'>-        nextwords[word-&gt;nextwords_cnt++] = nextword;</div><div class='del'>-        nextwords[word-&gt;nextwords_cnt] = NULL;</div><div class='add'>+    nextword-&gt;word = strdup(token);</div><div class='add'>+    if (!nextword-&gt;word) {</div><div class='add'>+        free(nextword);</div><div class='add'>+        return NULL;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        return nextword;</div><div class='del'>-}</div><div class='add'>+    nextword-&gt;tree = word-&gt;tree;</div><div class='add'>+    nextwords[word-&gt;nextwords_cnt++] = nextword;</div><div class='add'>+    nextwords[word-&gt;nextwords_cnt] = NULL;</div><div class='ctx'> </div><div class='add'>+    return nextword;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-cli_cmd_ingest (struct cli_cmd_tree *tree, char **tokens, cli_cmd_cbk_t *cbkfn,</div><div class='del'>-                const char *desc)</div><div class='add'>+cli_cmd_ingest(struct cli_cmd_tree *tree, char **tokens, cli_cmd_cbk_t *cbkfn,</div><div class='add'>+               const char *desc, const char *pattern)</div><div class='ctx'> {</div><div class='del'>-        int                    ret = 0;</div><div class='del'>-        char                 **tokenp = NULL;</div><div class='del'>-        char                  *token = NULL;</div><div class='del'>-        struct cli_cmd_word   *word = NULL;</div><div class='del'>-        struct cli_cmd_word   *next = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    char **tokenp = NULL;</div><div class='add'>+    char *token = NULL;</div><div class='add'>+    struct cli_cmd_word *word = NULL;</div><div class='add'>+    struct cli_cmd_word *next = NULL;</div><div class='ctx'> </div><div class='del'>-        word = &amp;tree-&gt;root;</div><div class='add'>+    word = &amp;tree-&gt;root;</div><div class='ctx'> </div><div class='del'>-        for (tokenp = tokens; (token = *tokenp); tokenp++) {</div><div class='del'>-                if (!__is_word (token))</div><div class='del'>-                        break;</div><div class='add'>+    for (tokenp = tokens; (token = *tokenp); tokenp++) {</div><div class='add'>+        if (!__is_word(token))</div><div class='add'>+            break;</div><div class='ctx'> </div><div class='del'>-                next = cli_cmd_nextword (word, token);</div><div class='del'>-                if (!next)</div><div class='del'>-                        next = cli_cmd_newword (word, token);</div><div class='del'>-</div><div class='del'>-                word = next;</div><div class='del'>-                if (!word)</div><div class='del'>-                        break;</div><div class='del'>-        }</div><div class='add'>+        next = cli_cmd_nextword(word, token);</div><div class='add'>+        if (!next)</div><div class='add'>+            next = cli_cmd_newword(word, token);</div><div class='ctx'> </div><div class='add'>+        word = next;</div><div class='ctx'>         if (!word)</div><div class='del'>-                return -1;</div><div class='add'>+            break;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        if (word-&gt;cbkfn) {</div><div class='del'>-                /* warning - command already registered */</div><div class='del'>-        }</div><div class='add'>+    if (!word)</div><div class='add'>+        return -1;</div><div class='ctx'> </div><div class='del'>-        word-&gt;cbkfn = cbkfn;</div><div class='del'>-        word-&gt;desc  = desc;</div><div class='add'>+    if (word-&gt;cbkfn) {</div><div class='add'>+        /* warning - command already registered */</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        /* end of static strings in command template */</div><div class='add'>+    word-&gt;cbkfn = cbkfn;</div><div class='add'>+    word-&gt;desc = desc;</div><div class='add'>+    word-&gt;pattern = pattern;</div><div class='ctx'> </div><div class='del'>-        /* TODO: autocompletion beyond this point is just "nice to have" */</div><div class='add'>+    /* end of static strings in command template */</div><div class='ctx'> </div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='add'>+    /* TODO: autocompletion beyond this point is just "nice to have" */</div><div class='ctx'> </div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-cli_cmd_register (struct cli_cmd_tree *tree, const char *template,</div><div class='del'>-                  cli_cmd_cbk_t cbk, const char *desc)</div><div class='add'>+cli_cmd_register(struct cli_cmd_tree *tree, struct cli_cmd *cmd)</div><div class='ctx'> {</div><div class='del'>-        char **tokens = NULL;</div><div class='del'>-        int    ret = 0;</div><div class='add'>+    char **tokens = NULL;</div><div class='add'>+    int ret = 0;</div><div class='ctx'> </div><div class='del'>-        if (!template)</div><div class='del'>-                return -1;</div><div class='add'>+    GF_ASSERT(cmd);</div><div class='ctx'> </div><div class='del'>-        tokens = cli_cmd_tokenize (template);</div><div class='del'>-        if (!tokens)</div><div class='del'>-                return -1;</div><div class='add'>+    if (cmd-&gt;reg_cbk)</div><div class='add'>+        cmd-&gt;reg_cbk(cmd);</div><div class='ctx'> </div><div class='del'>-        ret = cli_cmd_ingest (tree, tokens, cbk, desc);</div><div class='del'>-        if (ret)</div><div class='del'>-                goto err;</div><div class='add'>+    if (cmd-&gt;disable) {</div><div class='add'>+        ret = 0;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        return 0;</div><div class='del'>-err:</div><div class='del'>-        if (tokens)</div><div class='del'>-                cli_cmd_tokens_destroy (tokens);</div><div class='add'>+    tokens = cli_cmd_tokenize(cmd-&gt;pattern);</div><div class='add'>+    if (!tokens) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='add'>+    ret = cli_cmd_ingest(tree, tokens, cmd-&gt;cbk, cmd-&gt;desc, cmd-&gt;pattern);</div><div class='add'>+    if (ret) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='ctx'> </div><div class='add'>+out:</div><div class='add'>+    if (tokens)</div><div class='add'>+        cli_cmd_tokens_destroy(tokens);</div><div class='add'>+</div><div class='add'>+    gf_log("cli", GF_LOG_DEBUG, "Returning %d", ret);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='head'>diff --git a/commit.sh b/commit.sh<br/>deleted file mode 100755<br/>index 9cc55c52e8d..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/commit.sh?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>commit.sh</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,4 +0,0 @@</div><div class='del'>-#!/bin/sh</div><div class='del'>-</div><div class='del'>-export EDITOR="emacs"</div><div class='del'>-git commit -a -e "$@"</div><div class='head'>diff --git a/configure.ac b/configure.ac<br/>index 81f58317d3c..e2d6fd66cec 100644<br/>--- a/<a href='/cgit/glusterfs.git/tree/configure.ac?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>configure.ac</a><br/>+++ b/<a href='/cgit/glusterfs.git/tree/configure.ac?id=d1d7a6f35c816822fab51c820e25023863c239c1'>configure.ac</a></div><div class='hunk'>@@ -1,133 +1,455 @@</div><div class='del'>-dnl Copyright (c) 2006-2009 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='del'>-dnl This file is part of GlusterFS.</div><div class='add'>+dnl  Copyright (c) 2006-2016 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+dnl  This file is part of GlusterFS.</div><div class='ctx'> dnl</div><div class='del'>-dnl GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-dnl it under the terms of the GNU General Public License as published by</div><div class='del'>-dnl the Free Software Foundation; either version 3 of the License, or</div><div class='del'>-dnl (at your option) any later version.</div><div class='del'>-dnl</div><div class='del'>-dnl GlusterFS is distributed in the hope that it will be useful,</div><div class='del'>-dnl but WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the</div><div class='del'>-dnl GNU General Public License for more details.</div><div class='del'>-dnl</div><div class='del'>-dnl You should have received a copy of the GNU General Public License</div><div class='del'>-dnl along with this program.  If not, see &lt;http://www.gnu.org/licenses/&gt;.</div><div class='add'>+dnl  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+dnl  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+dnl  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+dnl  cases as published by the Free Software Foundation.</div><div class='add'>+</div><div class='add'>+AC_INIT([glusterfs],</div><div class='add'>+        [m4_esyscmd([build-aux/pkg-version --version])],</div><div class='add'>+        [gluster-users@gluster.org],,[https://github.com/gluster/glusterfs.git])</div><div class='add'>+</div><div class='add'>+AC_SUBST([PACKAGE_RELEASE],</div><div class='add'>+         [m4_esyscmd([build-aux/pkg-version --release])])</div><div class='ctx'> </div><div class='del'>-AC_INIT([glusterfs],[3.1.0git],[gluster-users@gluster.org])</div><div class='add'>+AM_INIT_AUTOMAKE([tar-pax foreign])</div><div class='ctx'> </div><div class='del'>-AM_INIT_AUTOMAKE</div><div class='add'>+# Removes warnings when using automake 1.14 around (...but option 'subdir-objects' is disabled )</div><div class='add'>+#but libglusterfs fails to build with contrib (Then are not set up that way?)</div><div class='add'>+#AM_INIT_AUTOMAKE([subdir-objects])</div><div class='ctx'> </div><div class='del'>-AM_CONFIG_HEADER([config.h])</div><div class='add'>+m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES(yes)])</div><div class='add'>+</div><div class='add'>+AC_CONFIG_HEADERS([config.h site.h])</div><div class='ctx'> </div><div class='ctx'> AC_CONFIG_FILES([Makefile</div><div class='del'>-		libglusterfs/Makefile </div><div class='del'>-		libglusterfs/src/Makefile</div><div class='del'>-		glusterfsd/Makefile</div><div class='del'>-		glusterfsd/src/Makefile</div><div class='add'>+                libglusterfs/Makefile</div><div class='add'>+                libglusterfs/src/Makefile</div><div class='add'>+                libglusterd/Makefile</div><div class='add'>+                libglusterd/src/Makefile</div><div class='add'>+                geo-replication/src/peer_gsec_create</div><div class='add'>+                geo-replication/src/peer_mountbroker</div><div class='add'>+                geo-replication/src/peer_mountbroker.py</div><div class='add'>+                geo-replication/src/peer_georep-sshkey.py</div><div class='add'>+                extras/peer_add_secret_pub</div><div class='add'>+                geo-replication/syncdaemon/conf.py</div><div class='add'>+                geo-replication/gsyncd.conf</div><div class='add'>+                extras/snap_scheduler/conf.py</div><div class='add'>+                glusterfsd/Makefile</div><div class='add'>+                glusterfsd/src/Makefile</div><div class='ctx'>                 rpc/Makefile</div><div class='ctx'>                 rpc/rpc-lib/Makefile</div><div class='ctx'>                 rpc/rpc-lib/src/Makefile</div><div class='ctx'>                 rpc/rpc-transport/Makefile</div><div class='ctx'>                 rpc/rpc-transport/socket/Makefile</div><div class='ctx'>                 rpc/rpc-transport/socket/src/Makefile</div><div class='del'>-                rpc/rpc-transport/rdma/Makefile</div><div class='del'>-                rpc/rpc-transport/rdma/src/Makefile</div><div class='ctx'>                 rpc/xdr/Makefile</div><div class='ctx'>                 rpc/xdr/src/Makefile</div><div class='del'>-		xlators/Makefile</div><div class='del'>-		xlators/mount/Makefile</div><div class='del'>-		xlators/mount/fuse/Makefile</div><div class='del'>-		xlators/mount/fuse/src/Makefile</div><div class='del'>-		xlators/mount/fuse/utils/mount.glusterfs</div><div class='del'>-		xlators/mount/fuse/utils/mount_glusterfs</div><div class='del'>-		xlators/mount/fuse/utils/Makefile</div><div class='del'>-		xlators/storage/Makefile</div><div class='del'>-		xlators/storage/posix/Makefile</div><div class='del'>-		xlators/storage/posix/src/Makefile</div><div class='del'>-		xlators/cluster/Makefile</div><div class='del'>-		xlators/cluster/afr/Makefile</div><div class='del'>-		xlators/cluster/afr/src/Makefile</div><div class='del'>-		xlators/cluster/stripe/Makefile</div><div class='del'>-		xlators/cluster/stripe/src/Makefile</div><div class='del'>-		xlators/cluster/dht/Makefile</div><div class='del'>-		xlators/cluster/dht/src/Makefile</div><div class='del'>-		xlators/performance/Makefile</div><div class='del'>-		xlators/performance/write-behind/Makefile</div><div class='del'>-		xlators/performance/write-behind/src/Makefile</div><div class='del'>-		xlators/performance/read-ahead/Makefile</div><div class='del'>-		xlators/performance/read-ahead/src/Makefile</div><div class='del'>-		xlators/performance/io-threads/Makefile</div><div class='del'>-		xlators/performance/io-threads/src/Makefile</div><div class='del'>-		xlators/performance/io-cache/Makefile</div><div class='del'>-		xlators/performance/io-cache/src/Makefile</div><div class='del'>-		xlators/performance/symlink-cache/Makefile</div><div class='del'>-		xlators/performance/symlink-cache/src/Makefile</div><div class='del'>-		xlators/performance/quick-read/Makefile</div><div class='del'>-		xlators/performance/quick-read/src/Makefile</div><div class='del'>-                xlators/performance/stat-prefetch/Makefile</div><div class='del'>-                xlators/performance/stat-prefetch/src/Makefile</div><div class='del'>-		xlators/debug/Makefile</div><div class='del'>-		xlators/debug/trace/Makefile</div><div class='del'>-		xlators/debug/trace/src/Makefile</div><div class='del'>-		xlators/debug/error-gen/Makefile</div><div class='del'>-		xlators/debug/error-gen/src/Makefile</div><div class='del'>-		xlators/debug/io-stats/Makefile</div><div class='del'>-		xlators/debug/io-stats/src/Makefile</div><div class='del'>-		xlators/protocol/Makefile</div><div class='del'>-		xlators/protocol/auth/Makefile</div><div class='del'>-		xlators/protocol/auth/addr/Makefile</div><div class='del'>-		xlators/protocol/auth/addr/src/Makefile</div><div class='del'>-		xlators/protocol/auth/login/Makefile</div><div class='del'>-		xlators/protocol/auth/login/src/Makefile</div><div class='del'>-		xlators/protocol/client/Makefile</div><div class='del'>-		xlators/protocol/client/src/Makefile</div><div class='del'>-		xlators/protocol/server/Makefile</div><div class='del'>-		xlators/protocol/server/src/Makefile</div><div class='del'>-		xlators/features/Makefile</div><div class='del'>-		xlators/features/locks/Makefile</div><div class='del'>-		xlators/features/locks/src/Makefile</div><div class='del'>-		xlators/features/trash/Makefile</div><div class='del'>-		xlators/features/trash/src/Makefile</div><div class='del'>-		xlators/features/quota/Makefile</div><div class='del'>-		xlators/features/quota/src/Makefile</div><div class='del'>-		xlators/features/read-only/Makefile</div><div class='del'>-		xlators/features/read-only/src/Makefile</div><div class='del'>-		xlators/features/mac-compat/Makefile</div><div class='del'>-		xlators/features/mac-compat/src/Makefile</div><div class='del'>-		xlators/encryption/Makefile</div><div class='del'>-		xlators/encryption/rot-13/Makefile</div><div class='del'>-		xlators/encryption/rot-13/src/Makefile</div><div class='del'>-                cli/Makefile</div><div class='del'>-                cli/src/Makefile</div><div class='del'>-		doc/Makefile</div><div class='del'>-		doc/examples/Makefile</div><div class='del'>-		doc/hacker-guide/Makefile</div><div class='del'>-		extras/Makefile</div><div class='del'>-                extras/glusterfs-defrag</div><div class='del'>-		extras/init.d/Makefile</div><div class='del'>-		extras/init.d/glusterfs-server.plist</div><div class='del'>-                extras/init.d/glusterfsd-Debian</div><div class='del'>-                extras/init.d/glusterfsd-Redhat</div><div class='del'>-                extras/init.d/glusterfsd-SuSE</div><div class='del'>-		extras/benchmarking/Makefile</div><div class='del'>-                extras/volgen/Makefile</div><div class='del'>-                extras/volgen/glusterfs-volgen</div><div class='del'>-		contrib/fuse-util/Makefile</div><div class='del'>-                xlators/features/access-control/Makefile</div><div class='del'>-                xlators/features/access-control/src/Makefile</div><div class='add'>+                xlators/Makefile</div><div class='add'>+                xlators/meta/Makefile</div><div class='add'>+                xlators/meta/src/Makefile</div><div class='add'>+                xlators/mount/Makefile</div><div class='add'>+                xlators/mount/fuse/Makefile</div><div class='add'>+                xlators/mount/fuse/src/Makefile</div><div class='add'>+                xlators/mount/fuse/utils/mount.glusterfs</div><div class='add'>+                xlators/mount/fuse/utils/mount_glusterfs</div><div class='add'>+                xlators/mount/fuse/utils/Makefile</div><div class='add'>+                xlators/storage/Makefile</div><div class='add'>+                xlators/storage/posix/Makefile</div><div class='add'>+                xlators/storage/posix/src/Makefile</div><div class='add'>+                xlators/cluster/Makefile</div><div class='add'>+                xlators/cluster/afr/Makefile</div><div class='add'>+                xlators/cluster/afr/src/Makefile</div><div class='add'>+                xlators/cluster/dht/Makefile</div><div class='add'>+                xlators/cluster/dht/src/Makefile</div><div class='add'>+                xlators/cluster/ec/Makefile</div><div class='add'>+                xlators/cluster/ec/src/Makefile</div><div class='add'>+                xlators/performance/Makefile</div><div class='add'>+                xlators/performance/write-behind/Makefile</div><div class='add'>+                xlators/performance/write-behind/src/Makefile</div><div class='add'>+                xlators/performance/read-ahead/Makefile</div><div class='add'>+                xlators/performance/read-ahead/src/Makefile</div><div class='add'>+                xlators/performance/readdir-ahead/Makefile</div><div class='add'>+                xlators/performance/readdir-ahead/src/Makefile</div><div class='add'>+                xlators/performance/io-threads/Makefile</div><div class='add'>+                xlators/performance/io-threads/src/Makefile</div><div class='add'>+                xlators/performance/io-cache/Makefile</div><div class='add'>+                xlators/performance/io-cache/src/Makefile</div><div class='add'>+                xlators/performance/quick-read/Makefile</div><div class='add'>+                xlators/performance/quick-read/src/Makefile</div><div class='add'>+                xlators/performance/open-behind/Makefile</div><div class='add'>+                xlators/performance/open-behind/src/Makefile</div><div class='add'>+                xlators/performance/md-cache/Makefile</div><div class='add'>+                xlators/performance/md-cache/src/Makefile</div><div class='add'>+                xlators/performance/nl-cache/Makefile</div><div class='add'>+                xlators/performance/nl-cache/src/Makefile</div><div class='add'>+                xlators/debug/Makefile</div><div class='add'>+                xlators/debug/sink/Makefile</div><div class='add'>+                xlators/debug/sink/src/Makefile</div><div class='add'>+                xlators/debug/trace/Makefile</div><div class='add'>+                xlators/debug/trace/src/Makefile</div><div class='add'>+                xlators/debug/error-gen/Makefile</div><div class='add'>+                xlators/debug/error-gen/src/Makefile</div><div class='add'>+                xlators/debug/delay-gen/Makefile</div><div class='add'>+                xlators/debug/delay-gen/src/Makefile</div><div class='add'>+                xlators/debug/io-stats/Makefile</div><div class='add'>+                xlators/debug/io-stats/src/Makefile</div><div class='add'>+                xlators/protocol/Makefile</div><div class='add'>+                xlators/protocol/auth/Makefile</div><div class='add'>+                xlators/protocol/auth/addr/Makefile</div><div class='add'>+                xlators/protocol/auth/addr/src/Makefile</div><div class='add'>+                xlators/protocol/auth/login/Makefile</div><div class='add'>+                xlators/protocol/auth/login/src/Makefile</div><div class='add'>+                xlators/protocol/client/Makefile</div><div class='add'>+                xlators/protocol/client/src/Makefile</div><div class='add'>+                xlators/protocol/server/Makefile</div><div class='add'>+                xlators/protocol/server/src/Makefile</div><div class='add'>+                xlators/features/Makefile</div><div class='add'>+                xlators/features/arbiter/Makefile</div><div class='add'>+                xlators/features/arbiter/src/Makefile</div><div class='add'>+                xlators/features/thin-arbiter/Makefile</div><div class='add'>+                xlators/features/thin-arbiter/src/Makefile</div><div class='add'>+                xlators/features/changelog/Makefile</div><div class='add'>+                xlators/features/changelog/src/Makefile</div><div class='add'>+                xlators/features/changelog/lib/Makefile</div><div class='add'>+                xlators/features/changelog/lib/src/Makefile</div><div class='add'>+                xlators/features/locks/Makefile</div><div class='add'>+                xlators/features/locks/src/Makefile</div><div class='add'>+                xlators/features/quota/Makefile</div><div class='add'>+                xlators/features/quota/src/Makefile</div><div class='add'>+                xlators/features/marker/Makefile</div><div class='add'>+                xlators/features/marker/src/Makefile</div><div class='add'>+                xlators/features/selinux/Makefile</div><div class='add'>+                xlators/features/selinux/src/Makefile</div><div class='add'>+                xlators/features/sdfs/Makefile</div><div class='add'>+                xlators/features/sdfs/src/Makefile</div><div class='add'>+                xlators/features/read-only/Makefile</div><div class='add'>+                xlators/features/read-only/src/Makefile</div><div class='add'>+                xlators/features/compress/Makefile</div><div class='add'>+                xlators/features/compress/src/Makefile</div><div class='add'>+                xlators/features/namespace/Makefile</div><div class='add'>+                xlators/features/namespace/src/Makefile</div><div class='add'>+                xlators/features/quiesce/Makefile</div><div class='add'>+                xlators/features/quiesce/src/Makefile</div><div class='add'>+                xlators/features/barrier/Makefile</div><div class='add'>+                xlators/features/barrier/src/Makefile</div><div class='add'>+                xlators/features/index/Makefile</div><div class='add'>+                xlators/features/index/src/Makefile</div><div class='add'>+                xlators/features/gfid-access/Makefile</div><div class='add'>+                xlators/features/gfid-access/src/Makefile</div><div class='add'>+                xlators/features/trash/Makefile</div><div class='add'>+                xlators/features/trash/src/Makefile</div><div class='add'>+                xlators/features/snapview-server/Makefile</div><div class='add'>+                xlators/features/snapview-server/src/Makefile</div><div class='add'>+                xlators/features/snapview-client/Makefile</div><div class='add'>+                xlators/features/snapview-client/src/Makefile</div><div class='add'>+                xlators/features/upcall/Makefile</div><div class='add'>+                xlators/features/upcall/src/Makefile</div><div class='add'>+                xlators/features/shard/Makefile</div><div class='add'>+                xlators/features/shard/src/Makefile</div><div class='add'>+                xlators/features/bit-rot/Makefile</div><div class='add'>+                xlators/features/bit-rot/src/Makefile</div><div class='add'>+                xlators/features/bit-rot/src/stub/Makefile</div><div class='add'>+                xlators/features/bit-rot/src/bitd/Makefile</div><div class='add'>+                xlators/features/leases/Makefile</div><div class='add'>+                xlators/features/leases/src/Makefile</div><div class='add'>+                xlators/features/cloudsync/Makefile</div><div class='add'>+                xlators/features/cloudsync/src/Makefile</div><div class='add'>+                xlators/features/utime/Makefile</div><div class='add'>+                xlators/features/utime/src/Makefile</div><div class='add'>+                xlators/features/cloudsync/src/cloudsync-plugins/Makefile</div><div class='add'>+                xlators/features/cloudsync/src/cloudsync-plugins/src/Makefile</div><div class='add'>+                xlators/features/cloudsync/src/cloudsync-plugins/src/cloudsyncs3/Makefile</div><div class='add'>+                xlators/features/cloudsync/src/cloudsync-plugins/src/cloudsyncs3/src/Makefile</div><div class='add'>+                xlators/features/cloudsync/src/cloudsync-plugins/src/cvlt/Makefile</div><div class='add'>+                xlators/features/cloudsync/src/cloudsync-plugins/src/cvlt/src/Makefile</div><div class='add'>+                xlators/features/metadisp/Makefile</div><div class='add'>+                xlators/features/metadisp/src/Makefile</div><div class='add'>+                xlators/playground/Makefile</div><div class='add'>+                xlators/playground/template/Makefile</div><div class='add'>+                xlators/playground/template/src/Makefile</div><div class='add'>+                xlators/system/Makefile</div><div class='add'>+                xlators/system/posix-acl/Makefile</div><div class='add'>+                xlators/system/posix-acl/src/Makefile</div><div class='ctx'>                 xlators/nfs/Makefile</div><div class='ctx'>                 xlators/nfs/server/Makefile</div><div class='ctx'>                 xlators/nfs/server/src/Makefile</div><div class='ctx'>                 xlators/mgmt/Makefile</div><div class='ctx'>                 xlators/mgmt/glusterd/Makefile</div><div class='ctx'>                 xlators/mgmt/glusterd/src/Makefile</div><div class='del'>-		glusterfs.spec])</div><div class='add'>+                cli/Makefile</div><div class='add'>+                cli/src/Makefile</div><div class='add'>+                doc/Makefile</div><div class='add'>+                extras/Makefile</div><div class='add'>+                extras/glusterd.vol</div><div class='add'>+                extras/cliutils/Makefile</div><div class='add'>+                extras/init.d/Makefile</div><div class='add'>+                extras/init.d/glusterd.plist</div><div class='add'>+                extras/init.d/glusterd-Debian</div><div class='add'>+                extras/init.d/glusterd-Redhat</div><div class='add'>+                extras/init.d/glusterd-FreeBSD</div><div class='add'>+                extras/init.d/glusterd-SuSE</div><div class='add'>+                extras/init.d/glustereventsd-Debian</div><div class='add'>+                extras/init.d/glustereventsd-Redhat</div><div class='add'>+                extras/init.d/glustereventsd-FreeBSD</div><div class='add'>+                extras/ganesha/Makefile</div><div class='add'>+                extras/ganesha/config/Makefile</div><div class='add'>+                extras/ganesha/scripts/Makefile</div><div class='add'>+                extras/ganesha/ocf/Makefile</div><div class='add'>+                extras/systemd/Makefile</div><div class='add'>+                extras/systemd/glusterd.service</div><div class='add'>+                extras/systemd/glustereventsd.service</div><div class='add'>+                extras/systemd/glusterfssharedstorage.service</div><div class='add'>+                extras/systemd/gluster-ta-volume.service</div><div class='add'>+                extras/run-gluster.tmpfiles</div><div class='add'>+                extras/benchmarking/Makefile</div><div class='add'>+                extras/hook-scripts/Makefile</div><div class='add'>+                extras/ocf/Makefile</div><div class='add'>+                extras/ocf/glusterd</div><div class='add'>+                extras/ocf/volume</div><div class='add'>+                extras/LinuxRPM/Makefile</div><div class='add'>+                extras/geo-rep/Makefile</div><div class='add'>+                extras/geo-rep/schedule_georep.py</div><div class='add'>+                extras/firewalld/Makefile</div><div class='add'>+                extras/hook-scripts/add-brick/Makefile</div><div class='add'>+                extras/hook-scripts/add-brick/pre/Makefile</div><div class='add'>+                extras/hook-scripts/add-brick/post/Makefile</div><div class='add'>+                extras/hook-scripts/create/Makefile</div><div class='add'>+                extras/hook-scripts/create/post/Makefile</div><div class='add'>+                extras/hook-scripts/delete/Makefile</div><div class='add'>+                extras/hook-scripts/delete/pre/Makefile</div><div class='add'>+                extras/hook-scripts/start/Makefile</div><div class='add'>+                extras/hook-scripts/start/post/Makefile</div><div class='add'>+                extras/hook-scripts/set/Makefile</div><div class='add'>+                extras/hook-scripts/set/post/Makefile</div><div class='add'>+                extras/hook-scripts/stop/Makefile</div><div class='add'>+                extras/hook-scripts/stop/pre/Makefile</div><div class='add'>+                extras/hook-scripts/reset/Makefile</div><div class='add'>+                extras/hook-scripts/reset/post/Makefile</div><div class='add'>+                extras/hook-scripts/reset/pre/Makefile</div><div class='add'>+                extras/python/Makefile</div><div class='add'>+                extras/snap_scheduler/Makefile</div><div class='add'>+                events/Makefile</div><div class='add'>+                events/src/Makefile</div><div class='add'>+                events/src/eventsapiconf.py</div><div class='add'>+                events/tools/Makefile</div><div class='add'>+                contrib/fuse-util/Makefile</div><div class='add'>+                contrib/umountd/Makefile</div><div class='add'>+                glusterfs-api.pc</div><div class='add'>+                libgfchangelog.pc</div><div class='add'>+                api/Makefile</div><div class='add'>+                api/src/Makefile</div><div class='add'>+                api/examples/Makefile</div><div class='add'>+                geo-replication/Makefile</div><div class='add'>+                geo-replication/src/Makefile</div><div class='add'>+                geo-replication/syncdaemon/Makefile</div><div class='add'>+                tools/Makefile</div><div class='add'>+                tools/gfind_missing_files/Makefile</div><div class='add'>+                heal/Makefile</div><div class='add'>+                heal/src/Makefile</div><div class='add'>+                glusterfs.spec</div><div class='add'>+                tools/glusterfind/src/tool.conf</div><div class='add'>+                tools/glusterfind/glusterfind</div><div class='add'>+                tools/glusterfind/Makefile</div><div class='add'>+                tools/glusterfind/src/Makefile</div><div class='add'>+                tools/setgfid2path/Makefile</div><div class='add'>+                tools/setgfid2path/src/Makefile])</div><div class='ctx'> </div><div class='ctx'> AC_CANONICAL_HOST</div><div class='ctx'> </div><div class='ctx'> AC_PROG_CC</div><div class='add'>+AC_DISABLE_STATIC</div><div class='ctx'> AC_PROG_LIBTOOL</div><div class='add'>+AC_SUBST([shrext_cmds])</div><div class='add'>+</div><div class='add'>+AC_CHECK_PROG([RPCGEN], [rpcgen], [yes], [no])</div><div class='add'>+</div><div class='add'>+if test "x$RPCGEN" = "xno"; then</div><div class='add'>+   AC_MSG_ERROR([`rpcgen` not found, glusterfs needs `rpcgen` exiting..])</div><div class='add'>+fi</div><div class='add'>+</div><div class='add'>+# Initialize CFLAGS before usage</div><div class='add'>+AC_ARG_ENABLE([debug],</div><div class='add'>+              AC_HELP_STRING([--enable-debug],</div><div class='add'>+                             [Enable debug build options.]))</div><div class='add'>+if test "x$enable_debug" = "xyes"; then</div><div class='add'>+        BUILD_DEBUG=yes</div><div class='add'>+        GF_CFLAGS="${GF_CFLAGS} -g -O0 -DDEBUG"</div><div class='add'>+else</div><div class='add'>+        BUILD_DEBUG=no</div><div class='add'>+fi</div><div class='add'>+</div><div class='add'>+SANITIZER=none</div><div class='add'>+</div><div class='add'>+AC_ARG_ENABLE([asan],</div><div class='add'>+              AC_HELP_STRING([--enable-asan],</div><div class='add'>+                             [Enable Address Sanitizer support]))</div><div class='add'>+if test "x$enable_asan" = "xyes"; then</div><div class='add'>+        SANITIZER=asan</div><div class='add'>+        AC_CHECK_LIB([asan], [__asan_init], ,</div><div class='add'>+                [AC_MSG_ERROR([--enable-asan requires libasan.so, exiting])])</div><div class='add'>+        GF_CFLAGS="${GF_CFLAGS} -O2 -g -fsanitize=address -fno-omit-frame-pointer"</div><div class='add'>+        GF_LDFLAGS="${GF_LDFLAGS} -lasan"</div><div class='add'>+fi</div><div class='add'>+</div><div class='add'>+AC_ARG_ENABLE([tsan],</div><div class='add'>+              AC_HELP_STRING([--enable-tsan],</div><div class='add'>+                             [Enable Thread Sanitizer support]))</div><div class='add'>+if test "x$enable_tsan" = "xyes"; then</div><div class='add'>+        if test "x$SANITIZER" != "xnone"; then</div><div class='add'>+                AC_MSG_ERROR([only one sanitizer can be enabled at once])</div><div class='add'>+        fi</div><div class='add'>+        SANITIZER=tsan</div><div class='add'>+        AC_CHECK_LIB([tsan], [__tsan_init], ,</div><div class='add'>+                [AC_MSG_ERROR([--enable-tsan requires libtsan.so, exiting])])</div><div class='add'>+        if test "x$ac_cv_lib_tsan___tsan_init" = xyes; then</div><div class='add'>+                AC_MSG_CHECKING([whether tsan API can be used])</div><div class='add'>+                saved_CFLAGS=${CFLAGS}</div><div class='add'>+                CFLAGS="${CFLAGS} -fsanitize=thread"</div><div class='add'>+                AC_COMPILE_IFELSE(</div><div class='add'>+                [AC_LANG_PROGRAM([</div><div class='add'>+                   [#include &lt;sanitizer/tsan_interface.h&gt;]],</div><div class='add'>+                   [[__tsan_create_fiber(0)]])],</div><div class='add'>+                   [TSAN_API=yes], [TSAN_API=no])</div><div class='add'>+                AC_MSG_RESULT([$TSAN_API])</div><div class='add'>+                if test x$TSAN_API = "xyes"; then</div><div class='add'>+                   AC_DEFINE(HAVE_TSAN_API, 1, [Define if tsan API can be used.])</div><div class='add'>+                fi</div><div class='add'>+                CFLAGS=${saved_CFLAGS}</div><div class='add'>+        fi</div><div class='add'>+        GF_CFLAGS="${GF_CFLAGS} -O2 -g -fsanitize=thread -fno-omit-frame-pointer"</div><div class='add'>+        GF_LDFLAGS="${GF_LDFLAGS} -ltsan"</div><div class='add'>+fi</div><div class='add'>+</div><div class='add'>+AC_ARG_ENABLE([ubsan],</div><div class='add'>+              AC_HELP_STRING([--enable-ubsan],</div><div class='add'>+                             [Enable Undefined Behavior Sanitizer support]))</div><div class='add'>+if test "x$enable_ubsan" = "xyes"; then</div><div class='add'>+        if test "x$SANITIZER" != "xnone"; then</div><div class='add'>+                AC_MSG_ERROR([only one sanitizer can be enabled at once])</div><div class='add'>+        fi</div><div class='add'>+        SANITIZER=ubsan</div><div class='add'>+        AC_CHECK_LIB([ubsan], [__ubsan_default_options], ,</div><div class='add'>+                [AC_MSG_ERROR([--enable-ubsan requires libubsan.so, exiting])])</div><div class='add'>+        GF_CFLAGS="${GF_CFLAGS} -O2 -g -fsanitize=undefined -fno-omit-frame-pointer"</div><div class='add'>+        GF_LDFLAGS="${GF_LDFLAGS} -lubsan"</div><div class='add'>+fi</div><div class='add'>+</div><div class='add'>+# Initialize CFLAGS before usage</div><div class='add'>+BUILD_TCMALLOC=no</div><div class='add'>+AC_ARG_ENABLE([tcmalloc],</div><div class='add'>+              AC_HELP_STRING([--enable-tcmalloc],</div><div class='add'>+                             [Enable linking with tcmalloc library.]))</div><div class='add'>+if test "x$enable_tcmalloc" = "xyes"; then</div><div class='add'>+    BUILD_TCMALLOC=yes</div><div class='add'>+    GF_CFLAGS="${GF_CFLAGS} -fno-builtin-malloc -fno-builtin-calloc -fno-builtin-realloc -fno-builtin-free"</div><div class='add'>+    AC_CHECK_LIB([tcmalloc], [malloc], [],</div><div class='add'>+                 [AC_MSG_ERROR([when --enable-tcmalloc is used, tcmalloc library needs to be present])])</div><div class='add'>+    GF_LDFLAGS="-ltcmalloc ${GF_LDFLAGS}"</div><div class='add'>+fi</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+dnl When possible, prefer libtirpc over glibc rpc.</div><div class='add'>+dnl</div><div class='add'>+dnl On newer linux with only libtirpc, use libtirpc. (Specifying</div><div class='add'>+dnl --without-libtirpc is an error.)</div><div class='add'>+dnl</div><div class='add'>+dnl on older linux with glibc rpc and WITH libtirpc, use libtirpc</div><div class='add'>+dnl by default except when configured with --without-libtirpc.</div><div class='add'>+dnl</div><div class='add'>+dnl on old linux with glibc rpc and WITHOUT libtirpc, default to</div><div class='add'>+dnl use glibc rpc.</div><div class='add'>+dnl</div><div class='add'>+AC_ARG_WITH([libtirpc],</div><div class='add'>+        [AC_HELP_STRING([--without-libtirpc], [Use legacy glibc RPC.])],</div><div class='add'>+        [with_libtirpc="no"], [with_libtirpc="yes"])</div><div class='add'>+</div><div class='add'>+dnl ipv6-default is off by default</div><div class='add'>+dnl</div><div class='add'>+dnl ipv6-default requires libtirpc. (glibc rpc does not support IPv6.)</div><div class='add'>+dnl ipv6-default can only be enabled if libtipc is enabled.</div><div class='add'>+dnl</div><div class='add'>+AC_ARG_WITH([ipv6-default],</div><div class='add'>+        AC_HELP_STRING([--with-ipv6-default], [Set IPv6 as default.]),</div><div class='add'>+        [with_ipv6_default=${with_libtirpc}], [with_ipv6_default="no"])</div><div class='add'>+</div><div class='add'>+AC_CHECK_FILE([/etc/centos-release])</div><div class='add'>+if test "x$ac_cv_file__etc_centos_release" = "xyes"; then</div><div class='add'>+        if grep "release 6" /etc/centos-release; then</div><div class='add'>+                with_ipv6_default="no"</div><div class='add'>+        fi</div><div class='add'>+fi</div><div class='add'>+</div><div class='add'>+dnl On some distributions '-ldl' isn't automatically added to LIBS</div><div class='add'>+AC_CHECK_LIB([dl], [dlopen], [LIB_DL=-ldl])</div><div class='add'>+AC_SUBST(LIB_DL)</div><div class='add'>+</div><div class='add'>+AC_ARG_ENABLE([privport_tracking],</div><div class='add'>+              AC_HELP_STRING([--disable-privport_tracking],</div><div class='add'>+                             [Disable internal tracking of privileged ports.]))</div><div class='add'>+TRACK_PRIVPORTS="yes"</div><div class='add'>+if test x"$enable_privport_tracking" = x"no"; then</div><div class='add'>+        TRACK_PRIVPORTS="no"</div><div class='add'>+        AC_DEFINE(GF_DISABLE_PRIVPORT_TRACKING, 1,</div><div class='add'>+                  [Disable internal tracking of privileged ports.])</div><div class='add'>+fi</div><div class='add'>+</div><div class='add'>+case $host_os in</div><div class='add'>+  darwin*)</div><div class='add'>+    if ! test "`/usr/bin/sw_vers | grep ProductVersion: | cut -f 2 | cut -d. -f2`" -ge 7; then</div><div class='add'>+       AC_MSG_ERROR([You need at least OS X 10.7 (Lion) to build Glusterfs])</div><div class='add'>+    fi</div><div class='add'>+    # OSX version lesser than 9 has llvm/clang optimization issues which leads to various segfaults</div><div class='add'>+    if test "`/usr/bin/sw_vers | grep ProductVersion: | cut -f 2 | cut -d. -f2`" -lt 9; then</div><div class='add'>+       GF_CFLAGS="${GF_CFLAGS} -g -O0 -DDEBUG"</div><div class='add'>+    fi</div><div class='add'>+    ;;</div><div class='add'>+esac</div><div class='add'>+</div><div class='add'>+# --enable-valgrind prevents calling dlclose(), this leaks memory</div><div class='add'>+AC_ARG_ENABLE([valgrind],</div><div class='add'>+              AC_HELP_STRING([--enable-valgrind@&lt;:@=memcheck,drd@:&gt;@],</div><div class='add'>+                             [Enable valgrind for resource leak (memcheck, which is</div><div class='add'>+                              the default) or thread synchronization (drd) debugging.]))</div><div class='add'>+case x$enable_valgrind in</div><div class='add'>+  xmemcheck|xyes)</div><div class='add'>+    AC_DEFINE(RUN_WITH_MEMCHECK, 1,</div><div class='add'>+              [Define if all processes should run under 'valgrind --tool=memcheck'.])</div><div class='add'>+    VALGRIND_TOOL=memcheck</div><div class='add'>+    ;;</div><div class='add'>+  xdrd)</div><div class='add'>+    AC_DEFINE(RUN_WITH_DRD, 1,</div><div class='add'>+              [Define if all processes should run under 'valgrind --tool=drd'.])</div><div class='add'>+    VALGRIND_TOOL=drd</div><div class='add'>+    ;;</div><div class='add'>+  x|xno)</div><div class='add'>+    VALGRIND_TOOL=no</div><div class='add'>+    ;;</div><div class='add'>+  *)</div><div class='add'>+    AC_MSG_ERROR([Please specify --enable-valgrind@&lt;:@=memcheck,drd@:&gt;@])</div><div class='add'>+    ;;</div><div class='add'>+esac</div><div class='add'>+</div><div class='add'>+AC_ARG_WITH([previous-options],</div><div class='add'>+        [AS_HELP_STRING([--with-previous-options],</div><div class='add'>+                        [read config.status for configure options])</div><div class='add'>+        ],</div><div class='add'>+        [ if test -r ./config.status &amp;&amp; \</div><div class='add'>+             args=$(grep 'ac_cs_config=' config.status | \</div><div class='add'>+                    sed -e 's/.*"\(.*\)".*/\1/' -e "s/'//g" -e "s/--with-previous-options//g") ; then</div><div class='add'>+            echo "###"</div><div class='add'>+            echo "### Rerunning as '$0 $args'"</div><div class='add'>+            echo "###"</div><div class='add'>+            exec $0 $args</div><div class='add'>+          fi</div><div class='add'>+        ])</div><div class='add'>+</div><div class='add'>+AC_ARG_WITH(pkgconfigdir,</div><div class='add'>+            [  --with-pkgconfigdir=DIR      pkgconfig file in DIR @&lt;:@LIBDIR/pkgconfig@:&gt;@],</div><div class='add'>+            [pkgconfigdir=$withval],</div><div class='add'>+            [pkgconfigdir='${libdir}/pkgconfig'])</div><div class='add'>+AC_SUBST(pkgconfigdir)</div><div class='ctx'> </div><div class='ctx'> AC_ARG_WITH(mountutildir,</div><div class='ctx'>             [  --with-mountutildir=DIR mount helper utility in DIR @&lt;:@/sbin@:&gt;@],</div><div class='hunk'>@@ -135,6 +457,13 @@ AC_ARG_WITH(mountutildir,</div><div class='ctx'>             [mountutildir='/sbin'])</div><div class='ctx'> AC_SUBST(mountutildir)</div><div class='ctx'> </div><div class='add'>+AC_ARG_WITH(systemddir,</div><div class='add'>+            [  --with-systemddir=DIR systemd service files in DIR @&lt;:@PREFIX/lib/systemd/system@:&gt;@],</div><div class='add'>+            [systemddir=$withval],</div><div class='add'>+            [systemddir='${prefix}/lib/systemd/system'])</div><div class='add'>+AC_SUBST(systemddir)</div><div class='add'>+AM_CONDITIONAL([USE_SYSTEMD], test [ -d '/usr/lib/systemd/system' ])</div><div class='add'>+</div><div class='ctx'> AC_ARG_WITH(initdir,</div><div class='ctx'>             [  --with-initdir=DIR init.d scripts in DIR @&lt;:@/etc/init.d@:&gt;@],</div><div class='ctx'>             [initdir=$withval],</div><div class='hunk'>@@ -147,12 +476,49 @@ AC_ARG_WITH(launchddir,</div><div class='ctx'>             [launchddir='/Library/LaunchDaemons'])</div><div class='ctx'> AC_SUBST(launchddir)</div><div class='ctx'> </div><div class='add'>+AC_ARG_WITH(tmpfilesdir,</div><div class='add'>+            AC_HELP_STRING([--with-tmpfilesdir=DIR],</div><div class='add'>+                           [tmpfiles config in DIR, disabled by default]),</div><div class='add'>+            [tmpfilesdir=$withval],</div><div class='add'>+            [tmpfilesdir=''])</div><div class='add'>+AC_SUBST(tmpfilesdir)</div><div class='add'>+</div><div class='add'>+AC_ARG_WITH([ocf],</div><div class='add'>+            [AS_HELP_STRING([--without-ocf], [build OCF-compliant cluster resource agents])],</div><div class='add'>+            ,</div><div class='add'>+            [OCF_SUBDIR='ocf'],</div><div class='add'>+            )</div><div class='add'>+AC_SUBST(OCF_SUBDIR)</div><div class='add'>+</div><div class='add'>+AC_ARG_WITH([server],</div><div class='add'>+            [AS_HELP_STRING([--without-server], [do not build server components])],</div><div class='add'>+            [with_server='no'],</div><div class='add'>+            [with_server='yes'],</div><div class='add'>+            )</div><div class='add'>+AM_CONDITIONAL([WITH_SERVER], [test x$with_server = xyes])</div><div class='add'>+</div><div class='ctx'> # LEX needs a check</div><div class='ctx'> AC_PROG_LEX</div><div class='ctx'> if test  "x${LEX}" != "xflex" -a "x${FLEX}" != "xlex"; then</div><div class='ctx'>    AC_MSG_ERROR([Flex or lex required to build glusterfs.])</div><div class='ctx'> fi</div><div class='ctx'> </div><div class='add'>+dnl</div><div class='add'>+dnl Word sizes...</div><div class='add'>+dnl</div><div class='add'>+AC_CHECK_SIZEOF(short)</div><div class='add'>+AC_CHECK_SIZEOF(int)</div><div class='add'>+AC_CHECK_SIZEOF(long)</div><div class='add'>+AC_CHECK_SIZEOF(long long)</div><div class='add'>+SIZEOF_SHORT=$ac_cv_sizeof_short</div><div class='add'>+SIZEOF_INT=$ac_cv_sizeof_int</div><div class='add'>+SIZEOF_LONG=$ac_cv_sizeof_long</div><div class='add'>+SIZEOF_LONG_LONG=$ac_cv_sizeof_long_long</div><div class='add'>+AC_SUBST(SIZEOF_SHORT)</div><div class='add'>+AC_SUBST(SIZEOF_INT)</div><div class='add'>+AC_SUBST(SIZEOF_LONG)</div><div class='add'>+AC_SUBST(SIZEOF_LONG_LONG)</div><div class='add'>+</div><div class='ctx'> # YACC needs a check</div><div class='ctx'> AC_PROG_YACC</div><div class='ctx'> if test "x${YACC}" = "xbyacc" -o "x${YACC}" = "xyacc" -o "x${YACC}" = "x"; then</div><div class='hunk'>@@ -161,22 +527,116 @@ fi</div><div class='ctx'> </div><div class='ctx'> AC_CHECK_TOOL([LD],[ld])</div><div class='ctx'> </div><div class='add'>+AC_CHECK_LIB([crypto], [MD5], , AC_MSG_ERROR([OpenSSL crypto library is required to build glusterfs]))</div><div class='add'>+</div><div class='ctx'> AC_CHECK_LIB([pthread], [pthread_mutex_init], , AC_MSG_ERROR([Posix threads library is required to build glusterfs]))</div><div class='del'>-		 </div><div class='add'>+</div><div class='ctx'> AC_CHECK_FUNC([dlopen], [has_dlopen=yes], AC_CHECK_LIB([dl], [dlopen], , AC_MSG_ERROR([Dynamic linking library required to build glusterfs])))</div><div class='ctx'> </div><div class='add'>+AC_CHECK_LIB([readline], [rl_do_undo], [RL_UNDO="yes"], [RL_UNDO="no"])</div><div class='add'>+</div><div class='add'>+AC_CHECK_LIB([intl], [gettext])</div><div class='ctx'> </div><div class='ctx'> AC_CHECK_HEADERS([sys/xattr.h])</div><div class='ctx'> </div><div class='add'>+AC_CHECK_HEADERS([sys/ioctl.h], AC_DEFINE(HAVE_IOCTL_IN_SYS_IOCTL_H, 1, [have sys/ioctl.h]))</div><div class='add'>+</div><div class='ctx'> AC_CHECK_HEADERS([sys/extattr.h])</div><div class='ctx'> </div><div class='add'>+AC_CHECK_HEADERS([openssl/dh.h])</div><div class='add'>+</div><div class='add'>+AC_CHECK_HEADERS([openssl/ecdh.h])</div><div class='add'>+</div><div class='add'>+AC_CHECK_LIB([ssl], [SSL_CTX_get0_param], [AC_DEFINE([HAVE_SSL_CTX_GET0_PARAM], [1], [define if found OpenSSL SSL_CTX_get0_param])])</div><div class='add'>+</div><div class='add'>+dnl Math library</div><div class='add'>+AC_CHECK_LIB([m], [pow], [MATH_LIB='-lm'], [MATH_LIB=''])</div><div class='add'>+AC_SUBST(MATH_LIB)</div><div class='add'>+</div><div class='add'>+dnl depend on libuuid.so</div><div class='add'>+PKG_CHECK_MODULES([UUID], [uuid],</div><div class='add'>+        [have_uuid=yes</div><div class='add'>+         AC_DEFINE(HAVE_LIBUUID, 1, [have libuuid.so])</div><div class='add'>+         PKGCONFIG_UUID=uuid],</div><div class='add'>+        [have_uuid=no])</div><div class='add'>+AM_CONDITIONAL([HAVE_LIBUUID], [test x$have_uuid = xyes])</div><div class='add'>+</div><div class='add'>+dnl older version of libuuid (from e2fsprogs) require including uuid/uuid.h</div><div class='add'>+saved_CFLAGS=${CFLAGS}</div><div class='add'>+CFLAGS="${CFLAGS} ${UUID_CFLAGS}"</div><div class='add'>+AC_CHECK_HEADER([uuid.h], [], [AC_CHECK_HEADER([uuid/uuid.h])],</div><div class='add'>+                [[#if HAVE_UUID_H</div><div class='add'>+                  #include &lt;uuid.h&gt;</div><div class='add'>+                  #endif</div><div class='add'>+                ]])</div><div class='add'>+CFLAGS=${saved_CFLAGS}</div><div class='add'>+if test "x$ac_cv_header_uuid_uuid_h" = "xyes"; then</div><div class='add'>+    UUID_CFLAGS="${UUID_CFLAGS} -I$(pkg-config --variable=includedir uuid)/uuid"</div><div class='add'>+    have_uuid=yes</div><div class='add'>+fi</div><div class='add'>+</div><div class='add'>+if test "x$have_uuid" != "xyes"; then</div><div class='add'>+    case $host_os in</div><div class='add'>+        *freebsd*)</div><div class='add'>+            AC_MSG_ERROR([e2fsprogs-libuuid is required to build glusterfs])</div><div class='add'>+            ;;</div><div class='add'>+        linux*)</div><div class='add'>+            AC_MSG_ERROR([libuuid is required to build glusterfs])</div><div class='add'>+            ;;</div><div class='add'>+        *)</div><div class='add'>+            AC_MSG_ERROR([a Linux compatible libuuid is required to build glusterfs])</div><div class='add'>+            ;;</div><div class='add'>+    esac</div><div class='add'>+fi</div><div class='add'>+</div><div class='add'>+dnl libglusterfs needs uuid.h, practically everything depends on it</div><div class='add'>+GF_CFLAGS="${GF_CFLAGS} ${UUID_CFLAGS}"</div><div class='add'>+dnl PKGCONFIG_UUID is used for the dependency in *.pc.in files</div><div class='add'>+AC_SUBST(PKGCONFIG_UUID)</div><div class='add'>+</div><div class='add'>+dnl NetBSD does not support POSIX ACLs :-(</div><div class='ctx'> case $host_os in</div><div class='del'>-  darwin*)</div><div class='del'>-    if ! test "`/usr/bin/sw_vers | grep ProductVersion: | cut -f 2 | cut -d. -f2`" -ge 5; then</div><div class='del'>-      AC_MSG_ERROR([You need at least OS X 10.5 (Leopard) to build Glusterfs])</div><div class='del'>-    fi</div><div class='del'>-    ;;</div><div class='add'>+     *netbsd* | darwin*)</div><div class='add'>+        AC_MSG_WARN([platform does not support POSIX ACLs... disabling them])</div><div class='add'>+        ACL_LIBS=''</div><div class='add'>+        USE_POSIX_ACLS='0'</div><div class='add'>+        BUILD_POSIX_ACLS='no'</div><div class='add'>+        ;;</div><div class='add'>+     *)</div><div class='add'>+        AC_CHECK_HEADERS([sys/acl.h], ,</div><div class='add'>+                         AC_MSG_ERROR([Support for POSIX ACLs is required]))</div><div class='add'>+        USE_POSIX_ACLS='1'</div><div class='add'>+        BUILD_POSIX_ACLS='yes'</div><div class='add'>+        case $host_os in</div><div class='add'>+             linux*)</div><div class='add'>+                ACL_LIBS='-lacl'</div><div class='add'>+                ;;</div><div class='add'>+             solaris*)</div><div class='add'>+                ACL_LIBS='-lsec'</div><div class='add'>+                ;;</div><div class='add'>+             *freebsd*)</div><div class='add'>+                ACL_LIBS='-lc'</div><div class='add'>+                ;;</div><div class='add'>+             darwin*)</div><div class='add'>+                ACL_LIBS='-lc'</div><div class='add'>+                ;;</div><div class='add'>+        esac</div><div class='add'>+        if test "x${ACL_LIBS}" = "x-lacl"; then</div><div class='add'>+          AC_CHECK_HEADERS([acl/libacl.h], , AC_MSG_ERROR([libacl is required for building on ${host_os}]))</div><div class='add'>+        fi</div><div class='add'>+        ;;</div><div class='ctx'> esac</div><div class='add'>+AC_SUBST(ACL_LIBS)</div><div class='add'>+AC_SUBST(USE_POSIX_ACLS)</div><div class='add'>+</div><div class='add'>+# libglusterfs/checksum</div><div class='add'>+AC_CHECK_HEADERS([openssl/md5.h])</div><div class='add'>+AC_CHECK_LIB([z], [adler32], [ZLIB_LIBS="-lz"], AC_MSG_ERROR([zlib is required to build glusterfs]))</div><div class='add'>+AC_SUBST(ZLIB_LIBS)</div><div class='add'>+</div><div class='add'>+AC_CHECK_HEADERS([linux/falloc.h])</div><div class='add'>+</div><div class='add'>+AC_CHECK_HEADERS([linux/oom.h], AC_DEFINE(HAVE_LINUX_OOM_H, 1, [have linux/oom.h]))</div><div class='ctx'> </div><div class='ctx'> dnl Mac OS X does not have spinlocks</div><div class='ctx'> AC_CHECK_FUNC([pthread_spin_init], [have_spinlock=yes])</div><div class='hunk'>@@ -200,11 +660,68 @@ if test "x${have_setfsuid}" = "xyes" -a "x${have_setfsgid}" = "xyes"; then</div><div class='ctx'>   AC_DEFINE(HAVE_SET_FSID, 1, [define if found setfsuid setfsgid])</div><div class='ctx'> fi</div><div class='ctx'> </div><div class='add'>+dnl test umount2 function</div><div class='add'>+AC_CHECK_FUNC([umount2], [have_umount2=yes])</div><div class='add'>+</div><div class='add'>+if test "x${have_umount2}" = "xyes"; then</div><div class='add'>+   AC_DEFINE(HAVE_UMOUNT2, 1, [define if found umount2])</div><div class='add'>+fi</div><div class='add'>+</div><div class='add'>+dnl Check Python Availability</div><div class='add'>+have_python=no</div><div class='add'>+dnl if the user has not specified a python, pick one</div><div class='add'>+if test -z "${PYTHON}"; then</div><div class='add'>+  case $host_os in</div><div class='add'>+    freebsd*)</div><div class='add'>+      if test -x /usr/local/bin/python3; then</div><div class='add'>+        PYTHON=/usr/local/bin/python3</div><div class='add'>+      else</div><div class='add'>+        PYTHON=/usr/local/bin/python2</div><div class='add'>+      fi</div><div class='add'>+      ;;</div><div class='add'>+    *)</div><div class='add'>+      if test -x /usr/bin/python3; then</div><div class='add'>+        PYTHON=/usr/bin/python3</div><div class='add'>+      else</div><div class='add'>+        PYTHON=/usr/bin/python2</div><div class='add'>+      fi</div><div class='add'>+      ;;</div><div class='add'>+  esac</div><div class='add'>+fi</div><div class='add'>+AM_PATH_PYTHON([2.6],,[:])</div><div class='add'>+if test -n "${PYTHON}"; then</div><div class='add'>+   have_python=yes</div><div class='add'>+fi</div><div class='add'>+AM_CONDITIONAL(HAVE_PYTHON, test "x$have_python" = "xyes")</div><div class='add'>+</div><div class='add'>+dnl Use pkg-config to get runtime search path missing from ${PYTHON}-config</div><div class='add'>+dnl Just do "true" on failure so that configure does not bail out</div><div class='add'>+dnl Note: python 2.6's devel pkg (e.g. in CentOS/RHEL 6) does not have</div><div class='add'>+dnl pkg-config files, so this work-around instead</div><div class='add'>+if test "x${PYTHON_VERSION}" = "x2.6"; then</div><div class='add'>+  PYTHON_CFLAGS=$(python-config --includes)</div><div class='add'>+  PYTHON_LIBS=$(python-config --libs)</div><div class='add'>+else</div><div class='add'>+  PKG_CHECK_MODULES([PYTHON], "python-${PYTHON_VERSION}",,true)</div><div class='add'>+fi</div><div class='add'>+</div><div class='add'>+PYTHON_CFLAGS=$(echo ${PYTHON_CFLAGS} | sed -e 's|-I|-isystem |')</div><div class='add'>+</div><div class='add'>+BUILD_PYTHON_SITE_PACKAGES=${pythondir}</div><div class='add'>+AC_SUBST(BUILD_PYTHON_SITE_PACKAGES)</div><div class='add'>+</div><div class='add'>+# Eval two times to expand fully. First eval replaces $exec_prefix into $prefix</div><div class='add'>+# Second eval will expand $prefix</div><div class='add'>+build_python_site_packages_temp="${pythondir}"</div><div class='add'>+eval build_python_site_packages_temp=\"${build_python_site_packages_temp}\"</div><div class='add'>+eval build_python_site_packages_temp=\"${build_python_site_packages_temp}\"</div><div class='add'>+BUILD_PYTHON_SITE_PACKAGES_EXPANDED=${build_python_site_packages_temp}</div><div class='add'>+AC_SUBST(BUILD_PYTHON_SITE_PACKAGES_EXPANDED)</div><div class='ctx'> </div><div class='ctx'> # FUSE section</div><div class='ctx'> AC_ARG_ENABLE([fuse-client],</div><div class='del'>-	      AC_HELP_STRING([--disable-fuse-client],</div><div class='del'>-			     [Do not build the fuse client. NOTE: you cannot mount glusterfs without the client]))</div><div class='add'>+              AC_HELP_STRING([--disable-fuse-client],</div><div class='add'>+                             [Do not build the fuse client. NOTE: you cannot mount glusterfs without the client]))</div><div class='ctx'> </div><div class='ctx'> BUILD_FUSE_CLIENT=no</div><div class='ctx'> if test "x$enable_fuse_client" != "xno"; then</div><div class='hunk'>@@ -213,106 +730,339 @@ if test "x$enable_fuse_client" != "xno"; then</div><div class='ctx'> fi</div><div class='ctx'> </div><div class='ctx'> AC_SUBST(FUSE_CLIENT_SUBDIR)</div><div class='add'>+</div><div class='add'>+AC_ARG_ENABLE([fuse-notifications],</div><div class='add'>+  AS_HELP_STRING([--disable-fuse-notifications], [Disable FUSE notifications]))</div><div class='add'>+</div><div class='add'>+AS_IF([test "x$enable_fuse_notifications" != "xno"], [</div><div class='add'>+  AC_DEFINE([HAVE_FUSE_NOTIFICATIONS], [1], [Use FUSE notifications])</div><div class='add'>+])</div><div class='add'>+</div><div class='ctx'> # end FUSE section</div><div class='ctx'> </div><div class='ctx'> </div><div class='add'>+AC_CHECK_LIB([ssl], TLS_method, [HAVE_OPENSSL_1_1="yes"], [HAVE_OPENSSL_1_1="no"])</div><div class='add'>+if test "x$HAVE_OPENSSL_1_1" = "xyes"; then</div><div class='add'>+    AC_DEFINE([HAVE_TLS_METHOD], [1], [Using OpenSSL-1.1 TLS_method])</div><div class='add'>+else</div><div class='add'>+    AC_CHECK_LIB([ssl], TLSv1_2_method, [AC_DEFINE([HAVE_TLSV1_2_METHOD], [1], [Using OpenSSL-1.0 TLSv1_2_method])])</div><div class='add'>+fi</div><div class='add'>+</div><div class='add'>+</div><div class='ctx'> # FUSERMOUNT section</div><div class='ctx'> AC_ARG_ENABLE([fusermount],</div><div class='del'>-              AC_HELP_STRING([--enable-fusermount],</div><div class='del'>-                             [Build fusermount]))</div><div class='del'>-</div><div class='del'>-BUILD_FUSERMOUNT="no"</div><div class='del'>-if test "x$enable_fusermount" = "xyes"; then</div><div class='del'>-  FUSERMOUNT_SUBDIR="contrib/fuse-util"</div><div class='del'>-  BUILD_FUSERMOUNT="yes"</div><div class='del'>-  AC_DEFINE(GF_FUSERMOUNT, 1, [Use our own fusermount])</div><div class='add'>+              AC_HELP_STRING([--disable-fusermount],</div><div class='add'>+                             [Use system's fusermount]))</div><div class='add'>+</div><div class='add'>+BUILD_FUSERMOUNT="yes"</div><div class='add'>+if test "x$enable_fusermount" = "xno"; then</div><div class='add'>+   BUILD_FUSERMOUNT="no"</div><div class='add'>+else</div><div class='add'>+   AC_DEFINE(GF_FUSERMOUNT, 1, [Use our own fusermount])</div><div class='add'>+   FUSERMOUNT_SUBDIR="contrib/fuse-util"</div><div class='ctx'> fi</div><div class='ctx'> </div><div class='ctx'> AC_SUBST(FUSERMOUNT_SUBDIR)</div><div class='ctx'> #end FUSERMOUNT section</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> # EPOLL section</div><div class='ctx'> AC_ARG_ENABLE([epoll],</div><div class='del'>-	      AC_HELP_STRING([--disable-epoll],</div><div class='del'>-			     [Use poll instead of epoll.]))</div><div class='add'>+              AC_HELP_STRING([--disable-epoll],</div><div class='add'>+                             [Use poll instead of epoll.]))</div><div class='ctx'> </div><div class='ctx'> BUILD_EPOLL=no</div><div class='ctx'> if test "x$enable_epoll" != "xno"; then</div><div class='ctx'>    AC_CHECK_HEADERS([sys/epoll.h],</div><div class='ctx'>                     [BUILD_EPOLL=yes],</div><div class='del'>-		    [BUILD_EPOLL=no])</div><div class='add'>+                    [BUILD_EPOLL=no])</div><div class='ctx'> fi</div><div class='ctx'> # end EPOLL section</div><div class='ctx'> </div><div class='add'>+# SYNCDAEMON section</div><div class='add'>+AC_ARG_ENABLE([georeplication],</div><div class='add'>+              AC_HELP_STRING([--disable-georeplication],</div><div class='add'>+                             [Do not install georeplication components]))</div><div class='ctx'> </div><div class='del'>-# IBVERBS section</div><div class='del'>-AC_ARG_ENABLE([ibverbs],</div><div class='del'>-	      AC_HELP_STRING([--disable-ibverbs],</div><div class='del'>-			     [Do not build the ibverbs transport]))</div><div class='del'>-</div><div class='del'>-if test "x$enable_ibverbs" != "xno"; then</div><div class='del'>-  AC_CHECK_LIB([ibverbs],</div><div class='del'>-               [ibv_get_device_list],</div><div class='del'>-	       [HAVE_LIBIBVERBS="yes"],</div><div class='del'>-	       [HAVE_LIBIBVERBS="no"])</div><div class='add'>+BUILD_SYNCDAEMON=no</div><div class='add'>+case $host_os in</div><div class='add'>+     freebsd*)</div><div class='add'>+#do nothing</div><div class='add'>+       ;;</div><div class='add'>+     linux*)</div><div class='add'>+#do nothing</div><div class='add'>+       ;;</div><div class='add'>+     netbsd*)</div><div class='add'>+#do nothing</div><div class='add'>+       ;;</div><div class='add'>+     *)</div><div class='add'>+#disabling geo replication for non-linux platforms</div><div class='add'>+        enable_georeplication=no</div><div class='add'>+        ;;</div><div class='add'>+esac</div><div class='add'>+SYNCDAEMON_COMPILE=0</div><div class='add'>+if test "x${with_server}" = "xyes" -a "x${enable_georeplication}" != "xno"; then</div><div class='add'>+  if test "x${have_python}" = "xno" ; then</div><div class='add'>+    AC_MSG_ERROR([only python 2 and 3 are supported])</div><div class='add'>+  else</div><div class='add'>+    SYNCDAEMON_SUBDIR=geo-replication</div><div class='add'>+    SYNCDAEMON_COMPILE=1</div><div class='add'>+</div><div class='add'>+    BUILD_SYNCDAEMON="yes"</div><div class='add'>+    AC_MSG_CHECKING([if python has ctypes support...])</div><div class='add'>+    if "${PYTHON}" -c 'import ctypes' 2&gt;/dev/null; then</div><div class='add'>+      AC_MSG_RESULT("yes")</div><div class='add'>+    else</div><div class='add'>+      AC_MSG_ERROR([python does not have ctypes support])</div><div class='add'>+    fi</div><div class='add'>+  fi</div><div class='ctx'> fi</div><div class='add'>+AC_SUBST(SYNCDAEMON_COMPILE)</div><div class='add'>+AC_SUBST(SYNCDAEMON_SUBDIR)</div><div class='add'>+# end SYNCDAEMON section</div><div class='ctx'> </div><div class='del'>-if test "x$enable_ibverbs" = "xyes" -a "x$HAVE_LIBIBVERBS" = "xno"; then</div><div class='del'>-   echo "ibverbs requested but not found."</div><div class='del'>-   exit 1</div><div class='add'>+# only install scripts from extras/geo-rep when enabled</div><div class='add'>+if test "x${with_server}" = "xyes" -a "x$enable_georeplication" != "xno"; then</div><div class='add'>+  GEOREP_EXTRAS_SUBDIR=geo-rep</div><div class='ctx'> fi</div><div class='del'>-</div><div class='del'>-BUILD_RDMA=no</div><div class='del'>-BUILD_IBVERBS=no</div><div class='del'>-if test "x$enable_ibverbs" != "xno" -a "x$HAVE_LIBIBVERBS" = "xyes"; then</div><div class='del'>-  IBVERBS_SUBDIR=ib-verbs</div><div class='del'>-  BUILD_IBVERBS=yes</div><div class='del'>-  RDMA_SUBDIR=rdma</div><div class='del'>-  BUILD_RDMA=yes</div><div class='add'>+AC_SUBST(GEOREP_EXTRAS_SUBDIR)</div><div class='add'>+AM_CONDITIONAL(USE_GEOREP, test "x$enable_georeplication" != "xno")</div><div class='add'>+</div><div class='add'>+# METADISP section</div><div class='add'>+AC_ARG_ENABLE([metadisp],</div><div class='add'>+              AC_HELP_STRING([--enable-metadisp],</div><div class='add'>+                             [Enable the metadata dispersal xlator]))</div><div class='add'>+BUILD_METADISP=no</div><div class='add'>+if test "x${enable_metadisp}" = "xyes"; then</div><div class='add'>+  BUILD_METADISP=yes</div><div class='ctx'> fi</div><div class='add'>+AM_CONDITIONAL([BUILD_METADISP], [test "x$BUILD_METADISP" = "xyes"])</div><div class='add'>+# end METADISP section</div><div class='add'>+</div><div class='add'>+# Events section</div><div class='add'>+AC_ARG_ENABLE([events],</div><div class='add'>+              AC_HELP_STRING([--disable-events],</div><div class='add'>+                             [Do not install Events components]))</div><div class='add'>+</div><div class='add'>+BUILD_EVENTS=no</div><div class='add'>+EVENTS_ENABLED=0</div><div class='add'>+EVENTS_SUBDIR=</div><div class='add'>+if test "x$enable_events" != "xno"; then</div><div class='add'>+  EVENTS_SUBDIR=events</div><div class='add'>+  EVENTS_ENABLED=1</div><div class='add'>+</div><div class='add'>+  BUILD_EVENTS="yes"</div><div class='add'>+</div><div class='add'>+  if test "x${have_python}" = "xno"; then</div><div class='add'>+     if test "x${enable_events}" = "xyes"; then</div><div class='add'>+        AC_MSG_ERROR([python 2 or 3 required. exiting.])</div><div class='add'>+     fi</div><div class='add'>+     AC_MSG_WARN([python not found, disabling events])</div><div class='add'>+     EVENTS_SUBDIR=</div><div class='add'>+     EVENTS_ENABLED=0</div><div class='add'>+     BUILD_EVENTS="no"</div><div class='add'>+  else</div><div class='add'>+    AC_DEFINE(USE_EVENTS, 1, [define if events enabled])</div><div class='add'>+  fi</div><div class='add'>+fi</div><div class='add'>+AC_SUBST(EVENTS_ENABLED)</div><div class='add'>+AC_SUBST(EVENTS_SUBDIR)</div><div class='add'>+AM_CONDITIONAL([BUILD_EVENTS], [test "x${BUILD_EVENTS}" = "xyes"])</div><div class='add'>+# end Events section</div><div class='add'>+</div><div class='add'>+# CDC xlator - check if libz is present if so enable HAVE_LIB_Z</div><div class='add'>+BUILD_CDC=yes</div><div class='add'>+PKG_CHECK_MODULES([ZLIB], [zlib &gt;= 1.2.0],,</div><div class='add'>+                  [AC_CHECK_LIB([z], [deflate], [ZLIB_LIBS="-lz"],</div><div class='add'>+                                [BUILD_CDC=no])])</div><div class='add'>+echo -n "features requiring zlib enabled: "</div><div class='add'>+if test "x$BUILD_CDC" = "xyes" ; then</div><div class='add'>+  echo "yes"</div><div class='add'>+  AC_DEFINE(HAVE_LIB_Z, 1, [define if zlib is present])</div><div class='add'>+else</div><div class='add'>+  echo "no"</div><div class='add'>+fi</div><div class='add'>+AC_SUBST(ZLIB_CFLAGS)</div><div class='add'>+AC_SUBST(ZLIB_LIBS)</div><div class='add'>+# end CDC xlator secion</div><div class='add'>+</div><div class='add'>+#start firewalld section</div><div class='add'>+BUILD_FIREWALLD="no"</div><div class='add'>+AC_ARG_ENABLE([firewalld],</div><div class='add'>+              AC_HELP_STRING([--enable-firewalld],</div><div class='add'>+                             [enable installation configuration for firewalld]),</div><div class='add'>+              [BUILD_FIREWALLD="${enableval}"], [BUILD_FIREWALLD="no"])</div><div class='add'>+</div><div class='add'>+if test "x${with_server}" = "xyes" -a "x${BUILD_FIREWALLD}" = "xyes"; then</div><div class='add'>+        if !(test -d /usr/lib/firewalld/services 1&gt;/dev/null 2&gt;&amp;1) ; then</div><div class='add'>+                BUILD_FIREWALLD="no (firewalld not installed)"</div><div class='add'>+        fi</div><div class='add'>+fi</div><div class='add'>+AM_CONDITIONAL([USE_FIREWALLD],test ["x${BUILD_FIREWALLD}" =  "xyes"])</div><div class='add'>+</div><div class='add'>+#endof firewald section</div><div class='add'>+</div><div class='add'>+# xml-output</div><div class='add'>+AC_ARG_ENABLE([xml-output],</div><div class='add'>+              AC_HELP_STRING([--disable-xml-output],</div><div class='add'>+                             [Disable the xml output]))</div><div class='add'>+BUILD_XML_OUTPUT="yes"</div><div class='add'>+if test "x$enable_xml_output" != "xno"; then</div><div class='add'>+    PKG_CHECK_MODULES([XML], [libxml-2.0], [], [no_xml="yes"])</div><div class='add'>+    if test "x${no_xml}" = "x"; then</div><div class='add'>+        AC_DEFINE([HAVE_LIB_XML], [1], [Define to 1 if using libxml2.])</div><div class='add'>+    else</div><div class='add'>+        if test "x$enable_georeplication" != "xno"; then</div><div class='add'>+           AC_MSG_ERROR([libxml2 devel libraries not found])</div><div class='add'>+        else</div><div class='add'>+           AC_MSG_WARN([libxml2 devel libraries not found disabling XML support])</div><div class='add'>+           BUILD_XML_OUTPUT="no"</div><div class='add'>+        fi</div><div class='ctx'> </div><div class='del'>-AC_SUBST(IBVERBS_SUBDIR)</div><div class='del'>-AC_SUBST(RDMA_SUBDIR)</div><div class='del'>-# end IBVERBS section</div><div class='del'>-</div><div class='add'>+    fi</div><div class='add'>+else</div><div class='add'>+    if test "x$enable_georeplication" != "xno"; then</div><div class='add'>+       AC_MSG_ERROR([geo-replication requires xml output])</div><div class='add'>+    fi</div><div class='add'>+    BUILD_XML_OUTPUT="no"</div><div class='add'>+fi</div><div class='add'>+# end of xml-output</div><div class='ctx'> </div><div class='del'>-dnl FreeBSD &gt; 5 has execinfo as a Ported library for giving a workaround</div><div class='del'>-dnl solution to GCC backtrace functionality</div><div class='add'>+dnl cloudsync section</div><div class='add'>+BUILD_CLOUDSYNC="no"</div><div class='add'>+AC_CHECK_LIB([curl], [curl_easy_setopt], [LIBCURL="-lcurl"])</div><div class='add'>+if test -n "$LIBCURL";then</div><div class='add'>+        HAVE_LIBCURL="yes"</div><div class='add'>+fi</div><div class='add'>+AC_CHECK_HEADERS([openssl/hmac.h openssl/evp.h openssl/bio.h openssl/buffer.h], [HAVE_OPENSSL="yes"])</div><div class='add'>+if test "x$HAVE_LIBCURL" = "xyes" -a "x$HAVE_OPENSSL" = "xyes";then</div><div class='add'>+   HAVE_AMAZONS3="yes"</div><div class='add'>+fi</div><div class='add'>+AM_CONDITIONAL([BUILD_AMAZONS3_PLUGIN], [test "x$HAVE_AMAZONS3" = "xyes"])</div><div class='add'>+if test "x$HAVE_AMAZONS3" = "xyes";then</div><div class='add'>+   BUILD_CLOUDSYNC="yes"</div><div class='add'>+fi</div><div class='add'>+BUILD_CVLT_PLUGIN="no"</div><div class='add'>+case $host_os in</div><div class='add'>+#enable cvlt plugin only for linux platforms</div><div class='add'>+     linux*)</div><div class='add'>+       BUILD_CVLT_PLUGIN="yes"</div><div class='add'>+       BUILD_CLOUDSYNC="yes"</div><div class='add'>+       ;;</div><div class='add'>+     *)</div><div class='add'>+       ;;</div><div class='add'>+esac</div><div class='add'>+AM_CONDITIONAL([BUILD_CVLT_PLUGIN], [test "x$BUILD_CVLT_PLUGIN" = "xyes"])</div><div class='add'>+AM_CONDITIONAL([BUILD_CLOUDSYNC], [test "x$BUILD_CLOUDSYNC" = "xyes"])</div><div class='add'>+dnl end cloudsync section</div><div class='ctx'> </div><div class='del'>-AC_CHECK_HEADERS([execinfo.h], [have_backtrace=yes],</div><div class='del'>-               AC_CHECK_LIB([execinfo], [backtrace], [have_backtrace=yes]))</div><div class='del'>-dnl               AC_MSG_ERROR([libexecinfo not found libexecinfo required.])))</div><div class='add'>+dnl SELinux feature enablement</div><div class='add'>+case $host_os in</div><div class='add'>+  linux*)</div><div class='add'>+    AC_ARG_ENABLE([selinux],</div><div class='add'>+                  AC_HELP_STRING([--disable-selinux],</div><div class='add'>+                                 [Disable SELinux features]),</div><div class='add'>+                  [USE_SELINUX="${enableval}"], [USE_SELINUX="yes"])</div><div class='add'>+    ;;</div><div class='add'>+  *)</div><div class='add'>+    USE_SELINUX=no</div><div class='add'>+    ;;</div><div class='add'>+esac</div><div class='add'>+AM_CONDITIONAL(USE_SELINUX, test "x${USE_SELINUX}" = "xyes")</div><div class='add'>+dnl end of SELinux feature enablement</div><div class='ctx'> </div><div class='add'>+AC_CHECK_HEADERS([execinfo.h], [have_backtrace=yes])</div><div class='ctx'> if test "x${have_backtrace}" = "xyes"; then</div><div class='ctx'>    AC_DEFINE(HAVE_BACKTRACE, 1, [define if found backtrace])</div><div class='ctx'> fi</div><div class='ctx'> AC_SUBST(HAVE_BACKTRACE)</div><div class='ctx'> </div><div class='add'>+dnl Old (before C11) compiler can compile (but not link) this:</div><div class='add'>+dnl</div><div class='add'>+dnl int main () {</div><div class='add'>+dnl     _Static_assert(1, "True");</div><div class='add'>+dnl     return 0;</div><div class='add'>+dnl }</div><div class='add'>+dnl</div><div class='add'>+dnl assuming that _Static_assert is an implicitly declared function. So</div><div class='add'>+dnl we're trying to link just to make sure that this is not the case.</div><div class='add'>+</div><div class='add'>+AC_MSG_CHECKING([whether $CC supports C11 _Static_assert])</div><div class='add'>+AC_TRY_LINK([], [_Static_assert(1, "True");],</div><div class='add'>+            [STATIC_ASSERT=yes], [STATIC_ASSERT=no])</div><div class='add'>+</div><div class='add'>+AC_MSG_RESULT([$STATIC_ASSERT])</div><div class='add'>+if test x$STATIC_ASSERT = "xyes"; then</div><div class='add'>+   AC_DEFINE(HAVE_STATIC_ASSERT, 1, [Define if C11 _Static_assert is supported.])</div><div class='add'>+fi</div><div class='add'>+</div><div class='add'>+if test "x${have_backtrace}" != "xyes"; then</div><div class='add'>+AC_TRY_COMPILE([#include &lt;math.h&gt;], [double x=0.0; x=ceil(0.0);],</div><div class='add'>+   [],</div><div class='add'>+   AC_MSG_ERROR([need math library for libexecinfo]))</div><div class='add'>+fi</div><div class='add'>+</div><div class='ctx'> dnl glusterfs prints memory usage to stderr by sending it SIGUSR1</div><div class='del'>-AC_CHECK_FUNC([malloc_stats], [have_malloc_stats=yes])</div><div class='del'>-if test "x${have_malloc_stats}" = "xyes"; then</div><div class='del'>-   AC_DEFINE(HAVE_MALLOC_STATS, 1, [define if found malloc_stats])</div><div class='add'>+AC_CHECK_FUNC([mallinfo], [have_mallinfo=yes])</div><div class='add'>+if test "x${have_mallinfo}" = "xyes"; then</div><div class='add'>+   AC_DEFINE(HAVE_MALLINFO, 1, [define if found mallinfo])</div><div class='ctx'> fi</div><div class='del'>-AC_SUBST(HAVE_MALLOC_STATS)</div><div class='add'>+AC_SUBST(HAVE_MALLINFO)</div><div class='ctx'> </div><div class='ctx'> dnl Linux, Solaris, Cygwin</div><div class='ctx'> AC_CHECK_MEMBERS([struct stat.st_atim.tv_nsec])</div><div class='ctx'> dnl FreeBSD, NetBSD</div><div class='ctx'> AC_CHECK_MEMBERS([struct stat.st_atimespec.tv_nsec])</div><div class='add'>+case $host_os in</div><div class='add'>+        *netbsd*)</div><div class='add'>+        GF_CFLAGS="${GF_CFLAGS} -D_INCOMPLETE_XOPEN_C063 -DCONFIG_MACHINE_BSWAP_H"</div><div class='add'>+        ;;</div><div class='add'>+esac</div><div class='add'>+AC_CHECK_FUNC([linkat], [have_linkat=yes])</div><div class='add'>+if test "x${have_linkat}" = "xyes"; then</div><div class='add'>+   AC_DEFINE(HAVE_LINKAT, 1, [define if found linkat])</div><div class='add'>+fi</div><div class='add'>+AC_SUBST(HAVE_LINKAT)</div><div class='ctx'> </div><div class='del'>-dnl Check for argp</div><div class='add'>+dnl check for Monotonic clock</div><div class='add'>+AC_CHECK_LIB([rt], [clock_gettime], ,</div><div class='add'>+             AC_MSG_WARN([System doesn't have monotonic clock using contrib]))</div><div class='add'>+</div><div class='add'>+dnl check for argp, FreeBSD has the header in /usr/local/include</div><div class='add'>+case $host_os in</div><div class='add'>+    *freebsd*)</div><div class='add'>+    CFLAGS="${CFLAGS} -isystem /usr/local/include"</div><div class='add'>+    ARGP_LDADD=-largp</div><div class='add'>+    ;;</div><div class='add'>+    *netbsd*)</div><div class='add'>+    ARGP_LDADD=-largp</div><div class='add'>+    ;;</div><div class='add'>+esac</div><div class='add'>+dnl argp-standalone does not provide a pkg-config file</div><div class='ctx'> AC_CHECK_HEADER([argp.h], AC_DEFINE(HAVE_ARGP, 1, [have argp]))</div><div class='del'>-AC_CONFIG_SUBDIRS(argp-standalone)</div><div class='del'>-BUILD_ARGP_STANDALONE=no</div><div class='del'>-if test "x${ac_cv_header_argp_h}" = "xno"; then </div><div class='del'>-   BUILD_ARGP_STANDALONE=yes</div><div class='del'>-   ARGP_STANDALONE_CPPFLAGS='-I${top_srcdir}/argp-standalone'</div><div class='del'>-   ARGP_STANDALONE_LDADD='${top_builddir}/argp-standalone/libargp.a'</div><div class='add'>+if test "x$ac_cv_header_argp_h" != "xyes"; then</div><div class='add'>+    AC_MSG_ERROR([argp.h not found, install libargp or argp-standalone])</div><div class='ctx'> fi</div><div class='del'>-</div><div class='del'>-AC_SUBST(ARGP_STANDALONE_CPPFLAGS)</div><div class='del'>-AC_SUBST(ARGP_STANDALONE_LDADD)</div><div class='add'>+AC_SUBST(ARGP_LDADD)</div><div class='add'>+</div><div class='add'>+dnl Check for atomic operation support</div><div class='add'>+AC_MSG_CHECKING([for gcc __atomic builtins])</div><div class='add'>+AC_TRY_LINK([], [int v; __atomic_load_n(&amp;v, __ATOMIC_ACQUIRE);],</div><div class='add'>+            [have_atomic_builtins=yes], [have_atomic_builtins=no])</div><div class='add'>+if test "x${have_atomic_builtins}" = "xyes"; then</div><div class='add'>+   AC_DEFINE(HAVE_ATOMIC_BUILTINS, 1, [define if __atomic_*() builtins are available])</div><div class='add'>+fi</div><div class='add'>+AC_SUBST(HAVE_ATOMIC_BUILTINS)</div><div class='add'>+AC_MSG_RESULT([$have_atomic_builtins])</div><div class='add'>+</div><div class='add'>+dnl __sync_*() will not be needed if __atomic_*() is available</div><div class='add'>+AC_MSG_CHECKING([for gcc __sync builtins])</div><div class='add'>+AC_TRY_LINK([], [__sync_synchronize();],</div><div class='add'>+            [have_sync_builtins=yes], [have_sync_builtins=no])</div><div class='add'>+if test "x${have_sync_builtins}" = "xyes"; then</div><div class='add'>+   AC_DEFINE(HAVE_SYNC_BUILTINS, 1, [define if __sync_*() builtins are available])</div><div class='add'>+fi</div><div class='add'>+AC_SUBST(HAVE_SYNC_BUILTINS)</div><div class='add'>+AC_MSG_RESULT([$have_sync_builtins])</div><div class='ctx'> </div><div class='ctx'> AC_CHECK_HEADER([malloc.h], AC_DEFINE(HAVE_MALLOC_H, 1, [have malloc.h]))</div><div class='ctx'> </div><div class='hunk'>@@ -321,12 +1071,79 @@ if test "x${have_llistxattr}" = "xyes"; then</div><div class='ctx'>    AC_DEFINE(HAVE_LLISTXATTR, 1, [define if llistxattr exists])</div><div class='ctx'> fi</div><div class='ctx'> </div><div class='del'>-AC_CHECK_FUNC([fdatasync], [have_fdatasync=yes])</div><div class='add'>+AC_CHECK_FUNC([fdatasync], [have_fdatasync=no])</div><div class='ctx'> if test "x${have_fdatasync}" = "xyes"; then</div><div class='ctx'>    AC_DEFINE(HAVE_FDATASYNC, 1, [define if fdatasync exists])</div><div class='ctx'> fi</div><div class='ctx'> </div><div class='del'>-# Check the distribution where you are compiling glusterfs on </div><div class='add'>+AC_CHECK_FUNC([fallocate], [have_fallocate=yes])</div><div class='add'>+if test "x${have_fallocate}" = "xyes"; then</div><div class='add'>+   AC_DEFINE(HAVE_FALLOCATE, 1, [define if fallocate exists])</div><div class='add'>+fi</div><div class='add'>+</div><div class='add'>+AC_CHECK_FUNC([posix_fallocate], [have_posix_fallocate=yes])</div><div class='add'>+if test "x${have_posix_fallocate}" = "xyes"; then</div><div class='add'>+   AC_DEFINE(HAVE_POSIX_FALLOCATE, 1, [define if posix_fallocate exists])</div><div class='add'>+fi</div><div class='add'>+</div><div class='add'>+# On fedora-29, copy_file_range syscall and the libc API both are present.</div><div class='add'>+# Whereas, on some machines such as centos-7, RHEL-7, the API is not there.</div><div class='add'>+# Only the system call is present. So, this change is to determine whether</div><div class='add'>+# the API is present or not. If not, then check whether the system call is</div><div class='add'>+# present or not. Accordingly sys_copy_file_range function will first call</div><div class='add'>+# the API if it is there. Otherwise it will call syscall(SYS_copy_file_range).</div><div class='add'>+AC_CHECK_FUNC([copy_file_range], [have_copy_file_range=yes])</div><div class='add'>+if test "x${have_copy_file_range}" = "xyes"; then</div><div class='add'>+   AC_DEFINE(HAVE_COPY_FILE_RANGE, 1, [define if copy_file_range exists])</div><div class='add'>+else</div><div class='add'>+   OLD_CFLAGS=${CFLAGS}</div><div class='add'>+   CFLAGS="-D_GNU_SOURCE"</div><div class='add'>+   AC_CHECK_DECL([SYS_copy_file_range], , , [#include &lt;sys/syscall.h&gt;])</div><div class='add'>+   if test "x${ac_cv_have_decl_SYS_copy_file_range}" = "xyes"; then</div><div class='add'>+      AC_DEFINE(HAVE_COPY_FILE_RANGE_SYS, 1, [define if SYS_copy_file_range is available])</div><div class='add'>+   fi</div><div class='add'>+   CFLAGS=${OLD_CFLAGS}</div><div class='add'>+fi</div><div class='add'>+</div><div class='add'>+AC_CHECK_FUNC([syncfs], [have_syncfs=yes])</div><div class='add'>+if test "x${have_syncfs}" = "xyes"; then</div><div class='add'>+   AC_DEFINE(HAVE_SYNCFS, 1, [define if syncfs exists])</div><div class='add'>+else</div><div class='add'>+   OLD_CFLAGS=${CFLAGS}</div><div class='add'>+   CFLAGS="-D_GNU_SOURCE"</div><div class='add'>+   AC_CHECK_DECL([SYS_syncfs], , , [#include &lt;sys/syscall.h&gt;])</div><div class='add'>+   if test "x${ac_cv_have_decl_SYS_syncfs}" = "xyes"; then</div><div class='add'>+      AC_DEFINE(HAVE_SYNCFS_SYS, 1, [define if SYS_syncfs is available])</div><div class='add'>+   fi</div><div class='add'>+   CFLAGS=${OLD_CFLAGS}</div><div class='add'>+fi</div><div class='add'>+</div><div class='add'>+BUILD_NANOSECOND_TIMESTAMPS=no</div><div class='add'>+AC_CHECK_FUNC([utimensat], [have_utimensat=yes])</div><div class='add'>+if test "x${have_utimensat}" = "xyes"; then</div><div class='add'>+   BUILD_NANOSECOND_TIMESTAMPS=yes</div><div class='add'>+   AC_DEFINE(HAVE_UTIMENSAT, 1, [define if utimensat exists])</div><div class='add'>+fi</div><div class='add'>+</div><div class='add'>+OLD_CFLAGS=${CFLAGS}</div><div class='add'>+CFLAGS="-D_GNU_SOURCE"</div><div class='add'>+AC_CHECK_DECL([SEEK_HOLE], , , [#include &lt;unistd.h&gt;])</div><div class='add'>+if test "x${ac_cv_have_decl_SEEK_HOLE}" = "xyes"; then</div><div class='add'>+   AC_DEFINE(HAVE_SEEK_HOLE, 1, [define if SEEK_HOLE is available])</div><div class='add'>+fi</div><div class='add'>+CFLAGS=${OLD_CFLAGS}</div><div class='add'>+</div><div class='add'>+AC_CHECK_FUNC([accept4], [have_accept4=yes])</div><div class='add'>+if test "x${have_accept4}" = "xyes"; then</div><div class='add'>+   AC_DEFINE(HAVE_ACCEPT4, 1, [define if accept4 exists])</div><div class='add'>+fi</div><div class='add'>+</div><div class='add'>+AC_CHECK_FUNC([paccept], [have_paccept=yes])</div><div class='add'>+if test "x${have_paccept}" = "xyes"; then</div><div class='add'>+AC_DEFINE(HAVE_PACCEPT, 1, [define if paccept exists])</div><div class='add'>+fi</div><div class='add'>+</div><div class='add'>+# Check the distribution where you are compiling glusterfs on</div><div class='ctx'> </div><div class='ctx'> GF_DISTRIBUTION=</div><div class='ctx'> AC_CHECK_FILE([/etc/debian_version])</div><div class='hunk'>@@ -346,84 +1163,555 @@ fi</div><div class='ctx'> AC_SUBST(GF_DISTRIBUTION)</div><div class='ctx'> </div><div class='ctx'> GF_HOST_OS=""</div><div class='del'>-GF_LDFLAGS="-rdynamic"</div><div class='add'>+GF_LDFLAGS="${GF_LDFLAGS} -rdynamic"</div><div class='add'>+</div><div class='add'>+dnl see --with-libtirpc option check above, libtirpc(-devel) is required for</div><div class='add'>+dnl ipv6-default</div><div class='add'>+if test "x${with_libtirpc}" = "xyes" || test "x${with_ipv6_default}" = "xyes" ; then</div><div class='add'>+    PKG_CHECK_MODULES([TIRPC], [libtirpc],</div><div class='add'>+       [with_libtirpc="yes"; GF_CFLAGS="$GF_CFLAGS $TIRPC_CFLAGS"; GF_LDFLAGS="$GF_LDFLAGS $TIRPC_LIBS";],</div><div class='add'>+       [with_libtirpc="missing"; with_ipv6_default="no"])</div><div class='add'>+fi</div><div class='add'>+</div><div class='add'>+if test "x${with_libtirpc}" = "xmissing" ; then</div><div class='add'>+    AC_CHECK_HEADERS([rpc/rpc.h],[</div><div class='add'>+        AC_MSG_WARN([</div><div class='add'>+            ---------------------------------------------------------------------------------</div><div class='add'>+            libtirpc (and/or ipv6-default) were enabled but libtirpc-devel is not installed.</div><div class='add'>+            Disabling libtirpc and ipv6-default and falling back to legacy glibc rpc headers.</div><div class='add'>+            This is a transitional warning message. Eventually it will be an error message.</div><div class='add'>+            ---------------------------------------------------------------------------------])],[</div><div class='add'>+        AC_MSG_ERROR([</div><div class='add'>+            ---------------------------------------------------------------------------------</div><div class='add'>+            libtirpc (and/or ipv6-default) were enabled but libtirpc-devel is not installed</div><div class='add'>+            and there were no legacy glibc rpc headers and library to fall back to.</div><div class='add'>+            ---------------------------------------------------------------------------------])])</div><div class='add'>+fi</div><div class='add'>+</div><div class='add'>+if test "x$with_ipv6_default" = "xyes" ; then</div><div class='add'>+   GF_CFLAGS="$GF_CFLAGS -DIPV6_DEFAULT"</div><div class='add'>+fi</div><div class='add'>+</div><div class='add'>+dnl check for gcc -Werror=format-security</div><div class='add'>+saved_CFLAGS=$CFLAGS</div><div class='add'>+CFLAGS="-Wformat -Werror=format-security"</div><div class='add'>+AC_MSG_CHECKING([whether $CC accepts -Werror=format-security])</div><div class='add'>+AC_COMPILE_IFELSE([AC_LANG_PROGRAM()], [cc_werror_format_security=yes], [cc_werror_format_security=no])</div><div class='add'>+echo $cc_werror_format_security</div><div class='add'>+if test "x$cc_werror_format_security" = "xyes"; then</div><div class='add'>+    GF_CFLAGS="$GF_CFLAGS ${CFLAGS}"</div><div class='add'>+fi</div><div class='add'>+CFLAGS="$saved_CFLAGS"</div><div class='add'>+</div><div class='add'>+dnl check for gcc -Werror=implicit-function-declaration</div><div class='add'>+saved_CFLAGS=$CFLAGS</div><div class='add'>+CFLAGS="-Werror=implicit-function-declaration"</div><div class='add'>+AC_MSG_CHECKING([whether $CC accepts -Werror=implicit-function-declaration])</div><div class='add'>+AC_COMPILE_IFELSE([AC_LANG_PROGRAM()], [cc_werror_implicit=yes], [cc_werror_implicit=no])</div><div class='add'>+echo $cc_werror_implicit</div><div class='add'>+if test "x$cc_werror_implicit" = "xyes"; then</div><div class='add'>+    GF_CFLAGS="${GF_CFLAGS} ${CFLAGS}"</div><div class='add'>+fi</div><div class='add'>+CFLAGS="$saved_CFLAGS"</div><div class='add'>+</div><div class='add'>+dnl clang is mostly GCC-compatible, but its version is much lower,</div><div class='add'>+dnl so we have to check for it.</div><div class='add'>+AC_MSG_CHECKING([if compiling with clang])</div><div class='add'>+</div><div class='add'>+AC_COMPILE_IFELSE(</div><div class='add'>+[AC_LANG_PROGRAM([], [[</div><div class='add'>+#ifndef __clang__</div><div class='add'>+       not clang</div><div class='add'>+#endif</div><div class='add'>+]])],</div><div class='add'>+[CLANG=yes], [CLANG=no])</div><div class='add'>+</div><div class='add'>+AC_MSG_RESULT([$CLANG])</div><div class='add'>+</div><div class='add'>+if test "x$CLANG" = "xyes"; then</div><div class='add'>+   GF_CFLAGS="${GF_CFLAGS} -Wno-gnu"</div><div class='add'>+fi</div><div class='add'>+</div><div class='add'>+if test "x$ac_cv_header_execinfo_h" = "xno"; then</div><div class='add'>+   # The reason is that __builtin_frame_address(n) for n &gt; 0 seems</div><div class='add'>+   # to just crash on most platforms when -fomit-stack-pointer is</div><div class='add'>+   # specified, which seems to be the default for many platforms on</div><div class='add'>+   # -O2. The documentation says that __builtin_frame_address()</div><div class='add'>+   # should return NULL in case it can't get the frame, but it</div><div class='add'>+   # seems to crash instead.</div><div class='add'>+</div><div class='add'>+   # execinfo.c in ./contrib/libexecinfo uses __builtin_frame_address(n)</div><div class='add'>+   # for providing cross platform backtrace*() functions.</div><div class='add'>+   if test "x$CLANG" = "xno"; then</div><div class='add'>+      GF_CFLAGS="${GF_CFLAGS} -fno-omit-frame-pointer"</div><div class='add'>+   fi</div><div class='add'>+fi</div><div class='add'>+</div><div class='add'>+old_prefix=$prefix</div><div class='add'>+if test "x$prefix" = xNONE; then</div><div class='add'>+        prefix=$ac_default_prefix</div><div class='add'>+fi</div><div class='add'>+old_exec_prefix=$exec_prefix</div><div class='add'>+if test "x$exec_prefix" = xNONE; then</div><div class='add'>+        exec_prefix="$(eval echo $prefix)"</div><div class='add'>+fi</div><div class='add'>+GLUSTERFS_LIBEXECDIR="$(eval echo $libexecdir)/glusterfs"</div><div class='add'>+prefix=$old_prefix</div><div class='add'>+exec_prefix=$old_exec_prefix</div><div class='add'>+</div><div class='add'>+### Dirty hacky stuff to make LOCALSTATEDIR work</div><div class='add'>+if test "x$prefix" = xNONE; then</div><div class='add'>+   test $localstatedir = '${prefix}/var' &amp;&amp; localstatedir=$ac_default_prefix/var</div><div class='add'>+   localstatedir=/var</div><div class='add'>+fi</div><div class='add'>+localstatedir="$(eval echo ${localstatedir})"</div><div class='add'>+LOCALSTATEDIR=$localstatedir</div><div class='add'>+</div><div class='add'>+GLUSTERFSD_MISCDIR="$(eval echo ${localstatedir})/lib/misc/glusterfsd"</div><div class='add'>+</div><div class='add'>+old_prefix=$prefix</div><div class='add'>+if test "x$prefix" = xNONE; then</div><div class='add'>+    prefix=$ac_default_prefix</div><div class='add'>+fi</div><div class='add'>+GLUSTERD_VOLFILE="$(eval echo ${sysconfdir})/glusterfs/glusterd.vol"</div><div class='add'>+prefix=$old_prefix</div><div class='ctx'> </div><div class='del'>-GF_FUSE_LDADD="-lfuse"</div><div class='add'>+</div><div class='add'>+GFAPI_EXTRA_LDFLAGS='-Wl,--version-script=$(top_srcdir)/api/src/gfapi.map'</div><div class='ctx'> case $host_os in</div><div class='ctx'>      linux*)</div><div class='del'>-     dnl	GF_LINUX_HOST_OS=1</div><div class='ctx'>         GF_HOST_OS="GF_LINUX_HOST_OS"</div><div class='del'>-	GF_CFLAGS="${ARGP_STANDALONE_CPPFLAGS}"</div><div class='del'>-	GF_GLUSTERFS_CFLAGS="${GF_CFLAGS}"</div><div class='del'>-	GF_LDADD="${ARGP_STANDALONE_LDADD}"</div><div class='del'>-	GF_FUSE_CFLAGS="-DFUSERMOUNT_DIR=\\\"\$(bindir)\\\""</div><div class='del'>-	;;</div><div class='add'>+        GF_FUSE_CFLAGS="-DFUSERMOUNT_DIR=\\\"\$(bindir)\\\""</div><div class='add'>+        GLUSTERD_WORKDIR="${LOCALSTATEDIR}/lib/glusterd"</div><div class='add'>+        ;;</div><div class='ctx'>      solaris*)</div><div class='ctx'>         GF_HOST_OS="GF_SOLARIS_HOST_OS"</div><div class='del'>-	GF_CFLAGS="${ARGP_STANDALONE_CPPFLAGS} -D_REENTRANT -D_POSIX_PTHREAD_SEMANTICS"</div><div class='del'>-	GF_LDFLAGS=""</div><div class='del'>-	GF_GLUSTERFS_CFLAGS="${GF_CFLAGS}"</div><div class='del'>-	GF_LDADD="${ARGP_STANDALONE_LDADD}"</div><div class='del'>-	GF_GLUSTERFS_LDFLAGS="-lnsl -lresolv -lsocket"</div><div class='add'>+        GF_CFLAGS="${GF_CFLAGS} -D_REENTRANT -D_POSIX_PTHREAD_SEMANTICS -m64"</div><div class='ctx'>         BUILD_FUSE_CLIENT=no</div><div class='ctx'>         FUSE_CLIENT_SUBDIR=""</div><div class='del'>-	;;</div><div class='del'>-     *bsd*)</div><div class='add'>+        GLUSTERD_WORKDIR="${LOCALSTATEDIR}/lib/glusterd"</div><div class='add'>+        ;;</div><div class='add'>+     *netbsd*)</div><div class='add'>+        GF_HOST_OS="GF_BSD_HOST_OS"</div><div class='add'>+        GF_CFLAGS="${GF_CFLAGS} -D_INCOMPLETE_XOPEN_C063"</div><div class='add'>+        GF_CFLAGS="${GF_CFLAGS} -DTHREAD_UNSAFE_BASENAME"</div><div class='add'>+        GF_CFLAGS="${GF_CFLAGS} -DTHREAD_UNSAFE_DIRNAME"</div><div class='add'>+        GF_FUSE_CFLAGS="-DFUSERMOUNT_DIR=\\\"\$(sbindir)\\\""</div><div class='add'>+        GF_LDADD="${ARGP_LDADD}"</div><div class='add'>+        if test "x$ac_cv_header_execinfo_h" = "xyes"; then</div><div class='add'>+           GF_LDFLAGS="${GF_LDFLAGS} -lexecinfo"</div><div class='add'>+        fi</div><div class='add'>+        GF_FUSE_LDADD="-lperfuse"</div><div class='add'>+        BUILD_FUSE_CLIENT=yes</div><div class='add'>+        LEXLIB=""</div><div class='add'>+        BUILD_FUSERMOUNT=no</div><div class='add'>+        FUSERMOUNT_SUBDIR=""</div><div class='add'>+        GLUSTERD_WORKDIR="${LOCALSTATEDIR}/db/glusterd"</div><div class='add'>+        ;;</div><div class='add'>+     *freebsd*)</div><div class='ctx'>         GF_HOST_OS="GF_BSD_HOST_OS"</div><div class='del'>-	GF_CFLAGS="${ARGP_STANDALONE_CPPFLAGS}"</div><div class='del'>-	GF_GLUSTERFS_CFLAGS="${GF_CFLAGS}"</div><div class='del'>-	GF_LDADD="${ARGP_STANDALONE_LDADD}"</div><div class='del'>-	if test "x$ac_cv_header_execinfo_h" = "xyes"; then</div><div class='del'>-	   GF_GLUSTERFS_LDFLAGS="-lexecinfo"</div><div class='del'>-	fi				      </div><div class='del'>-	BUILD_FUSE_CLIENT=no</div><div class='del'>-	;;</div><div class='add'>+        GF_CFLAGS="${GF_CFLAGS} -DO_DSYNC=0"</div><div class='add'>+        GF_CFLAGS="${GF_CFLAGS} -Dxdr_quad_t=xdr_longlong_t"</div><div class='add'>+        GF_CFLAGS="${GF_CFLAGS} -Dxdr_u_quad_t=xdr_u_longlong_t"</div><div class='add'>+        GF_FUSE_CFLAGS="-DFUSERMOUNT_DIR=\\\"\$(sbindir)\\\""</div><div class='add'>+        GF_LDADD="${ARGP_LDADD}"</div><div class='add'>+        if test "x$ac_cv_header_execinfo_h" = "xyes"; then</div><div class='add'>+           GF_LDFLAGS="${GF_LDFLAGS} -lexecinfo"</div><div class='add'>+        fi</div><div class='add'>+        BUILD_FUSE_CLIENT=yes</div><div class='add'>+        BUILD_FUSERMOUNT=no</div><div class='add'>+        FUSERMOUNT_SUBDIR=""</div><div class='add'>+        GLUSTERD_WORKDIR="${LOCALSTATEDIR}/db/glusterd"</div><div class='add'>+        ;;</div><div class='ctx'>      darwin*)</div><div class='ctx'>         GF_HOST_OS="GF_DARWIN_HOST_OS"</div><div class='del'>-	LIBTOOL=glibtool</div><div class='del'>-	GF_CFLAGS="${ARGP_STANDALONE_CPPFLAGS} -D__DARWIN_64_BIT_INO_T -bundle -undefined suppress -flat_namespace -D_XOPEN_SOURCE"</div><div class='del'>-	GF_GLUSTERFS_CFLAGS="${ARGP_STANDALONE_CPPFLAGS} -D__DARWIN_64_BIT_INO_T -undefined suppress -flat_namespace"</div><div class='del'>-	GF_LDADD="${ARGP_STANDALONE_LDADD}"</div><div class='del'>-	GF_FUSE_CFLAGS="-I\$(CONTRIBDIR)/macfuse"</div><div class='del'>-	;;</div><div class='add'>+        LIBTOOL=glibtool</div><div class='add'>+        GF_CFLAGS="${GF_CFLAGS} -D_REENTRANT -D_XOPEN_SOURCE "</div><div class='add'>+        GF_CFLAGS="${GF_CFLAGS} -D_DARWIN_USE_64_BIT_INODE "</div><div class='add'>+        GF_CFLAGS="${GF_CFLAGS} -DTHREAD_UNSAFE_BASENAME"</div><div class='add'>+        GF_CFLAGS="${GF_CFLAGS} -DTHREAD_UNSAFE_DIRNAME"</div><div class='add'>+        GF_LDADD="${ARGP_LDADD}"</div><div class='add'>+        GF_LDFLAGS="${GF_LDFLAGS}"</div><div class='add'>+        GF_FUSE_CFLAGS="-I\$(CONTRIBDIR)/macfuse"</div><div class='add'>+        BUILD_FUSERMOUNT="no"</div><div class='add'>+        FUSERMOUNT_SUBDIR=""</div><div class='add'>+        GLUSTERD_WORKDIR="${LOCALSTATEDIR}/db/glusterd"</div><div class='add'>+        GFAPI_EXTRA_LDFLAGS='-Wl,-alias_list,$(top_srcdir)/api/src/gfapi.aliases'</div><div class='add'>+        ;;</div><div class='ctx'> esac</div><div class='ctx'> </div><div class='add'>+# Default value for sbindir</div><div class='add'>+prefix_temp=$prefix</div><div class='add'>+exec_prefix_temp=$exec_prefix</div><div class='add'>+</div><div class='add'>+test "${prefix}" = "NONE" &amp;&amp; prefix="${ac_default_prefix}"</div><div class='add'>+test "${exec_prefix}" = "NONE" &amp;&amp; exec_prefix='${prefix}'</div><div class='add'>+sbintemp="${sbindir}"</div><div class='add'>+eval sbintemp=\"${sbintemp}\"</div><div class='add'>+eval sbintemp=\"${sbintemp}\"</div><div class='add'>+SBIN_DIR=${sbintemp}</div><div class='add'>+</div><div class='add'>+sysconfdirtemp="${sysconfdir}"</div><div class='add'>+eval sysconfdirtemp=\"${sysconfdirtemp}\"</div><div class='add'>+SYSCONF_DIR=${sysconfdirtemp}</div><div class='add'>+</div><div class='add'>+prefix=$prefix_temp</div><div class='add'>+exec_prefix=$exec_prefix_temp</div><div class='add'>+</div><div class='add'>+AC_SUBST(SBIN_DIR)</div><div class='add'>+AC_SUBST(SYSCONF_DIR)</div><div class='add'>+</div><div class='add'>+# lazy umount emulation</div><div class='add'>+UMOUNTD_SUBDIR=""</div><div class='add'>+if test "x${GF_HOST_OS}" != "xGF_LINUX_HOST_OS" ; then</div><div class='add'>+        UMOUNTD_SUBDIR="contrib/umountd"</div><div class='add'>+fi</div><div class='add'>+AC_SUBST(UMOUNTD_SUBDIR)</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+# enable debug section</div><div class='add'>+AC_ARG_ENABLE([debug],</div><div class='add'>+              AC_HELP_STRING([--enable-debug],</div><div class='add'>+                             [Enable debug build options.]))</div><div class='add'>+</div><div class='add'>+AC_ARG_ENABLE([mempool],</div><div class='add'>+              AC_HELP_STRING([--disable-mempool],</div><div class='add'>+                             [Disable the Gluster memory pooler.]))</div><div class='add'>+</div><div class='add'>+USE_MEMPOOL="yes"</div><div class='add'>+if test "x$enable_mempool" = "xno"; then</div><div class='add'>+        USE_MEMPOOL="no"</div><div class='add'>+        AC_DEFINE(GF_DISABLE_MEMPOOL, 1, [Disable the Gluster memory pooler.])</div><div class='add'>+fi</div><div class='add'>+</div><div class='add'>+# syslog section</div><div class='add'>+AC_ARG_ENABLE([syslog],</div><div class='add'>+              AC_HELP_STRING([--disable-syslog],</div><div class='add'>+                             [Disable syslog for logging]))</div><div class='add'>+</div><div class='add'>+USE_SYSLOG="yes"</div><div class='add'>+if test "x$enable_syslog" != "xno"; then</div><div class='add'>+  AC_DEFINE(GF_USE_SYSLOG, 1, [Use syslog for logging])</div><div class='add'>+else</div><div class='add'>+  USE_SYSLOG="no"</div><div class='add'>+fi</div><div class='add'>+AM_CONDITIONAL([ENABLE_SYSLOG], [test x$USE_SYSLOG = xyes])</div><div class='add'>+#end syslog section</div><div class='add'>+</div><div class='ctx'> BUILD_READLINE=no</div><div class='ctx'> AC_CHECK_LIB([readline -lcurses],[readline],[RLLIBS="-lreadline -lcurses"])</div><div class='ctx'> AC_CHECK_LIB([readline -ltermcap],[readline],[RLLIBS="-lreadline -ltermcap"])</div><div class='ctx'> AC_CHECK_LIB([readline -lncurses],[readline],[RLLIBS="-lreadline -lncurses"])</div><div class='ctx'> </div><div class='del'>-if test "x$RLLIBS" != "x"; then</div><div class='del'>-   AC_DEFINE(HAVE_READLINE, 1, [readline enabled CLI])</div><div class='del'>-   BUILD_READLINE=yes</div><div class='add'>+if test -n "$RLLIBS"; then</div><div class='add'>+   if test "x$RL_UNDO" = "xyes"; then</div><div class='add'>+      AC_DEFINE(HAVE_READLINE, 1, [readline enabled CLI])</div><div class='add'>+      BUILD_READLINE=yes</div><div class='add'>+   else</div><div class='add'>+      BUILD_READLINE="no (present but missing undo)"</div><div class='add'>+   fi</div><div class='add'>+</div><div class='add'>+fi</div><div class='add'>+</div><div class='add'>+BUILD_LIBAIO=no</div><div class='add'>+AC_CHECK_LIB([aio],[io_setup],[LIBAIO="-laio"])</div><div class='add'>+</div><div class='add'>+if test -n "$LIBAIO"; then</div><div class='add'>+   AC_DEFINE(HAVE_LIBAIO, 1, [libaio based POSIX enabled])</div><div class='add'>+   BUILD_LIBAIO=yes</div><div class='add'>+fi</div><div class='add'>+</div><div class='add'>+dnl gnfs section</div><div class='add'>+BUILD_GNFS="no"</div><div class='add'>+RPCBIND_SERVICE=""</div><div class='add'>+AC_ARG_ENABLE([gnfs],</div><div class='add'>+              AC_HELP_STRING([--enable-gnfs],</div><div class='add'>+                             [Enable legacy gnfs server xlator.]))</div><div class='add'>+if test "x${with_server}" = "xyes" -a "x$enable_gnfs" = "xyes"; then</div><div class='add'>+    BUILD_GNFS="yes"</div><div class='add'>+    GF_CFLAGS="$GF_CFLAGS -DBUILD_GNFS"</div><div class='add'>+    RPCBIND_SERVICE="rpcbind.service"</div><div class='add'>+fi</div><div class='add'>+AM_CONDITIONAL([BUILD_GNFS], [test x$BUILD_GNFS = xyes])</div><div class='add'>+AC_SUBST(BUILD_GNFS)</div><div class='add'>+AC_SUBST(RPCBIND_SERVICE)</div><div class='add'>+dnl end gnfs section</div><div class='add'>+</div><div class='add'>+dnl Check for userspace-rcu</div><div class='add'>+PKG_CHECK_MODULES([URCU], [liburcu-bp], [],</div><div class='add'>+  [AC_CHECK_HEADERS([urcu-bp.h],</div><div class='add'>+     [URCU_LIBS='-lurcu-bp'],</div><div class='add'>+     AC_MSG_ERROR([liburcu-bp not found]))])</div><div class='add'>+PKG_CHECK_MODULES([URCU_CDS], [liburcu-cds &gt;= 0.8], [],</div><div class='add'>+  [PKG_CHECK_MODULES([URCU_CDS], [liburcu-cds &gt;= 0.7],</div><div class='add'>+    [AC_DEFINE(URCU_OLD, 1, [Define if liburcu 0.6 or 0.7 is found])</div><div class='add'>+     USE_CONTRIB_URCU='yes'],</div><div class='add'>+    [AC_CHECK_HEADERS([urcu/cds.h],</div><div class='add'>+      [AC_DEFINE(URCU_OLD, 1, [Define if liburcu 0.6 or 0.7 is found])</div><div class='add'>+       URCU_CDS_LIBS='-lurcu-cds'</div><div class='add'>+       USE_CONTRIB_URCU='yes'],</div><div class='add'>+      [AC_MSG_ERROR([liburcu-cds not found])])])])</div><div class='add'>+</div><div class='add'>+BUILD_UNITTEST="no"</div><div class='add'>+AC_ARG_ENABLE([cmocka],</div><div class='add'>+              AC_HELP_STRING([--enable-cmocka],</div><div class='add'>+                             [Enable cmocka build options.]))</div><div class='add'>+if test "x$enable_cmocka" = "xyes"; then</div><div class='add'>+    BUILD_UNITTEST="yes"</div><div class='add'>+    PKG_CHECK_MODULES([UNITTEST], [cmocka &gt;= 1.0.1], [BUILD_UNITTEST="yes"],</div><div class='add'>+        [AC_MSG_ERROR([cmocka library is required to build glusterfs])]</div><div class='add'>+    )</div><div class='add'>+fi</div><div class='add'>+AM_CONDITIONAL([UNITTEST], [test x$BUILD_UNITTEST = xyes])</div><div class='add'>+</div><div class='add'>+dnl Define UNIT_TESTING only for building cmocka binaries.</div><div class='add'>+UNITTEST_CFLAGS="${UNITTEST_CFLAGS} -DUNIT_TESTING=1"</div><div class='add'>+</div><div class='add'>+dnl Add cmocka for unit tests</div><div class='add'>+case $host_os in</div><div class='add'>+  freebsd*)</div><div class='add'>+    dnl remove --coverage on FreeBSD due to a known llvm packaging bug</div><div class='add'>+    UNITTEST_CFLAGS="${UNITTEST_CPPFLAGS} ${UNITTEST_CFLAGS} -g -DDEBUG -O0"</div><div class='add'>+    UNITTEST_LDFLAGS="${UNITTEST_LIBS} ${UNITTEST_LDFLAGS}"</div><div class='add'>+    ;;</div><div class='add'>+  *)</div><div class='add'>+    UNITTEST_CFLAGS="${UNITTEST_CPPFLAGS} ${UNITTEST_CFLAGS} -g -DDEBUG -O0 --coverage"</div><div class='add'>+    UNITTEST_LDFLAGS="${UNITTEST_LIBS} ${UNITTEST_LDFLAGS}"</div><div class='add'>+    ;;</div><div class='add'>+esac</div><div class='add'>+</div><div class='add'>+AC_SUBST(UNITTEST_CFLAGS)</div><div class='add'>+AC_SUBST(UNITTEST_LDFLAGS)</div><div class='add'>+</div><div class='add'>+AC_SUBST(CFLAGS)</div><div class='add'>+# end enable debug section</div><div class='add'>+</div><div class='add'>+# EC dynamic code generation section</div><div class='add'>+</div><div class='add'>+EC_DYNAMIC_SUPPORT="none"</div><div class='add'>+EC_DYNAMIC_ARCH="none"</div><div class='add'>+</div><div class='add'>+AC_ARG_ENABLE([ec-dynamic],</div><div class='add'>+              AC_HELP_STRING([--disable-ec-dynamic],</div><div class='add'>+                             [Disable all dynamic code generation extensions for EC module]))</div><div class='add'>+</div><div class='add'>+AC_ARG_ENABLE([ec-dynamic-intel],</div><div class='add'>+              AC_HELP_STRING([--disable-ec-dynamic-intel],</div><div class='add'>+                             [Disable all INTEL dynamic code generation extensions for EC module]))</div><div class='add'>+</div><div class='add'>+AC_ARG_ENABLE([ec-dynamic-arm],</div><div class='add'>+              AC_HELP_STRING([--disable-ec-dynamic-arm],</div><div class='add'>+                             [Disable all ARM dynamic code generation extensions for EC module]))</div><div class='add'>+</div><div class='add'>+AC_ARG_ENABLE([ec-dynamic-x64],</div><div class='add'>+              AC_HELP_STRING([--disable-ec-dynamic-x64],</div><div class='add'>+                             [Disable dynamic INTEL x64 code generation for EC module]))</div><div class='add'>+</div><div class='add'>+AC_ARG_ENABLE([ec-dynamic-sse],</div><div class='add'>+              AC_HELP_STRING([--disable-ec-dynamic-sse],</div><div class='add'>+                             [Disable dynamic INTEL SSE code generation for EC module]))</div><div class='add'>+</div><div class='add'>+AC_ARG_ENABLE([ec-dynamic-avx],</div><div class='add'>+              AC_HELP_STRING([--disable-ec-dynamic-avx],</div><div class='add'>+                             [Disable dynamic INTEL AVX code generation for EC module]))</div><div class='add'>+</div><div class='add'>+AC_ARG_ENABLE([ec-dynamic-neon],</div><div class='add'>+              AC_HELP_STRING([--disable-ec-dynamic-neon],</div><div class='add'>+                             [Disable dynamic ARM NEON code generation for EC module]))</div><div class='add'>+</div><div class='add'>+if test "x$enable_ec_dynamic" != "xno"; then</div><div class='add'>+  case $host in</div><div class='add'>+    x86_64*)</div><div class='add'>+      if test "x$enable_ec_dynamic_intel" != "xno"; then</div><div class='add'>+        if test "x$enable_ec_dynamic_x64" != "xno"; then</div><div class='add'>+          EC_DYNAMIC_SUPPORT="$EC_DYNAMIC_SUPPORT x64"</div><div class='add'>+          AC_DEFINE(USE_EC_DYNAMIC_X64, 1, [Defined if using dynamic INTEL x64 code])</div><div class='add'>+        fi</div><div class='add'>+        if test "x$enable_ec_dynamic_sse" != "xno"; then</div><div class='add'>+          EC_DYNAMIC_SUPPORT="$EC_DYNAMIC_SUPPORT sse"</div><div class='add'>+          AC_DEFINE(USE_EC_DYNAMIC_SSE, 1, [Defined if using dynamic INTEL SSE code])</div><div class='add'>+        fi</div><div class='add'>+        if test "x$enable_ec_dynamic_avx" != "xno"; then</div><div class='add'>+          EC_DYNAMIC_SUPPORT="$EC_DYNAMIC_SUPPORT avx"</div><div class='add'>+          AC_DEFINE(USE_EC_DYNAMIC_AVX, 1, [Defined if using dynamic INTEL AVX code])</div><div class='add'>+        fi</div><div class='add'>+</div><div class='add'>+        if test "x$EC_DYNAMIC_SUPPORT" != "xnone"; then</div><div class='add'>+          EC_DYNAMIC_ARCH="intel"</div><div class='add'>+        fi</div><div class='add'>+      fi</div><div class='add'>+      ;;</div><div class='add'>+    arm*)</div><div class='add'>+      if test "x$enable_ec_dynamic_arm" != "xno"; then</div><div class='add'>+        if test "x$enable_ec_dynamic_neon" != "xno"; then</div><div class='add'>+          EC_DYNAMIC_SUPPORT="$EC_DYNAMIC_SUPPORT neon"</div><div class='add'>+          AC_DEFINE(USE_EC_DYNAMIC_NEON, 1, [Defined if using dynamic ARM NEON code])</div><div class='add'>+        fi</div><div class='add'>+</div><div class='add'>+        if test "x$EC_DYNAMIC_SUPPORT" != "xnone"; then</div><div class='add'>+          EC_DYNAMIC_ARCH="arm"</div><div class='add'>+        fi</div><div class='add'>+      fi</div><div class='add'>+      ;;</div><div class='add'>+  esac</div><div class='add'>+</div><div class='add'>+  EC_DYNAMIC_SUPPORT="${EC_DYNAMIC_SUPPORT#none }"</div><div class='ctx'> fi</div><div class='ctx'> </div><div class='add'>+AM_CONDITIONAL([ENABLE_EC_DYNAMIC_INTEL], [test "x$EC_DYNAMIC_ARCH" = "xintel"])</div><div class='add'>+AM_CONDITIONAL([ENABLE_EC_DYNAMIC_ARM], [test "x$EC_DYNAMIC_ARCH" = "xarm"])</div><div class='add'>+</div><div class='add'>+AM_CONDITIONAL([ENABLE_EC_DYNAMIC_X64], [test "x${EC_DYNAMIC_SUPPORT##*x64*}" = "x"])</div><div class='add'>+AM_CONDITIONAL([ENABLE_EC_DYNAMIC_SSE], [test "x${EC_DYNAMIC_SUPPORT##*sse*}" = "x"])</div><div class='add'>+AM_CONDITIONAL([ENABLE_EC_DYNAMIC_AVX], [test "x${EC_DYNAMIC_SUPPORT##*avx*}" = "x"])</div><div class='add'>+AM_CONDITIONAL([ENABLE_EC_DYNAMIC_NEON], [test "x${EC_DYNAMIC_SUPPORT##*neon*}" = "x"])</div><div class='add'>+</div><div class='add'>+AC_SUBST(USE_EC_DYNAMIC_X64)</div><div class='add'>+AC_SUBST(USE_EC_DYNAMIC_SSE)</div><div class='add'>+AC_SUBST(USE_EC_DYNAMIC_AVX)</div><div class='add'>+AC_SUBST(USE_EC_DYNAMIC_NEON)</div><div class='add'>+</div><div class='add'>+# end EC dynamic code generation section</div><div class='add'>+</div><div class='add'>+dnl libglusterfs.so uses math functions</div><div class='add'>+GF_LDADD="${GF_LDADD} ${MATH_LIB}"</div><div class='add'>+</div><div class='add'>+case $host_os in</div><div class='add'>+  dnl Can't use libtool's portable "-no-undefined" as it seems to be ignored on Linux</div><div class='add'>+  linux*)</div><div class='add'>+    GF_NO_UNDEFINED='-Wl,--no-undefined'</div><div class='add'>+    ;;</div><div class='add'>+  darwin*)</div><div class='add'>+    GF_NO_UNDEFINED='-Wl,-undefined'</div><div class='add'>+    ;;</div><div class='add'>+  *)</div><div class='add'>+  dnl There's an issue on FreeBSD with reference to __progname used in some parts of code</div><div class='add'>+    GF_NO_UNDEFINED=''</div><div class='add'>+    ;;</div><div class='add'>+esac</div><div class='add'>+dnl GF_XLATOR_DEFAULT_LDFLAGS is for most xlators that expose a common set of symbols</div><div class='add'>+GF_XLATOR_DEFAULT_LDFLAGS='-avoid-version -export-symbols $(top_srcdir)/xlators/xlator.sym $(UUID_LIBS) $(GF_NO_UNDEFINED) $(TIRPC_LIBS)'</div><div class='add'>+dnl GF_XLATOR_LDFLAGS is for xlators that expose extra symbols, e.g. dht</div><div class='add'>+GF_XLATOR_LDFLAGS='-avoid-version $(UUID_LIBS) $(GF_NO_UNDEFINED) $(TIRPC_LIBS)'</div><div class='add'>+</div><div class='ctx'> AC_SUBST(GF_HOST_OS)</div><div class='del'>-AC_SUBST(GF_GLUSTERFS_LDFLAGS)</div><div class='del'>-AC_SUBST(GF_GLUSTERFS_CFLAGS)</div><div class='ctx'> AC_SUBST(GF_CFLAGS)</div><div class='ctx'> AC_SUBST(GF_LDFLAGS)</div><div class='ctx'> AC_SUBST(GF_LDADD)</div><div class='add'>+AC_SUBST(GF_FUSE_LDADD)</div><div class='ctx'> AC_SUBST(GF_FUSE_CFLAGS)</div><div class='ctx'> AC_SUBST(RLLIBS)</div><div class='add'>+AC_SUBST(LIBAIO)</div><div class='add'>+AC_SUBST(AM_MAKEFLAGS)</div><div class='add'>+AC_SUBST(AM_LIBTOOLFLAGS)</div><div class='add'>+AC_SUBST(GF_NO_UNDEFINED)</div><div class='add'>+AC_SUBST(GF_XLATOR_DEFAULT_LDFLAGS)</div><div class='add'>+AC_SUBST(GF_XLATOR_LDFLAGS)</div><div class='add'>+AC_SUBST(GF_XLATOR_MGNT_LIBADD)</div><div class='add'>+</div><div class='add'>+case $host_os in</div><div class='add'>+     *freebsd*)</div><div class='add'>+        GF_XLATOR_MGNT_LIBADD="-lutil -lprocstat"</div><div class='add'>+        ;;</div><div class='add'>+esac</div><div class='ctx'> </div><div class='ctx'> CONTRIBDIR='$(top_srcdir)/contrib'</div><div class='ctx'> AC_SUBST(CONTRIBDIR)</div><div class='ctx'> </div><div class='del'>-INCLUDES='-I$(top_srcdir)/libglusterfs/src -I$(CONTRIBDIR)/uuid'</div><div class='del'>-AC_SUBST(INCLUDES)</div><div class='add'>+GF_CPPDEFINES='-D_FILE_OFFSET_BITS=64 -D_GNU_SOURCE -D$(GF_HOST_OS)'</div><div class='add'>+GF_CPPINCLUDES='-include $(top_builddir)/config.h -include $(top_builddir)/site.h -I$(top_srcdir)/libglusterfs/src -I$(top_builddir)/libglusterfs/src'</div><div class='add'>+if test "x${USE_CONTRIB_URCU}" = "xyes"; then</div><div class='add'>+    GF_CPPINCLUDES="${GF_CPPINCLUDES} -I\$(CONTRIBDIR)/userspace-rcu"</div><div class='add'>+fi</div><div class='add'>+GF_CPPFLAGS="$GF_CPPFLAGS $GF_CPPDEFINES $GF_CPPINCLUDES"</div><div class='add'>+AC_SUBST([GF_CPPFLAGS])</div><div class='add'>+</div><div class='add'>+AM_CONDITIONAL([GF_LINUX_HOST_OS], test "${GF_HOST_OS}" = "GF_LINUX_HOST_OS")</div><div class='add'>+AM_CONDITIONAL([GF_DARWIN_HOST_OS], test "${GF_HOST_OS}" = "GF_DARWIN_HOST_OS")</div><div class='add'>+AM_CONDITIONAL([GF_BSD_HOST_OS], test "${GF_HOST_OS}" = "GF_BSD_HOST_OS")</div><div class='add'>+if  test "${GF_HOST_OS}" = "GF_BSD_HOST_OS"; then</div><div class='add'>+    AC_DEFINE(GF_BSD_HOST_OS, 1, [This is a BSD compatible OS.])</div><div class='add'>+fi</div><div class='add'>+</div><div class='add'>+AC_SUBST(GLUSTERD_WORKDIR)</div><div class='add'>+AM_CONDITIONAL([GF_INSTALL_GLUSTERD_WORKDIR], test ! -d ${GLUSTERD_WORKDIR} &amp;&amp; test -d ${sysconfdir}/glusterd )</div><div class='add'>+AC_SUBST(GLUSTERD_VOLFILE)</div><div class='add'>+AC_SUBST(GLUSTERFS_LIBEXECDIR)</div><div class='add'>+AC_SUBST(GLUSTERFSD_MISCDIR)</div><div class='ctx'> </div><div class='del'>-AM_CONDITIONAL([GF_DARWIN_HOST_OS], test "${GF_HOST_OS}" = "GF_DARWIN_HOST_OS")	</div><div class='add'>+dnl pkg-config versioning</div><div class='add'>+dnl</div><div class='add'>+dnl Once we released gluster-api.pc with version=7. Since then we undid the</div><div class='add'>+dnl library versioning and replaced it with symbol-versioning. The current</div><div class='add'>+dnl libgfapi.so has version 0, but the symbols have the version from the main</div><div class='add'>+dnl package at the time they were added.</div><div class='add'>+dnl</div><div class='add'>+dnl Because other packages (like samba) use the pkg-config version, we can not</div><div class='add'>+dnl drop it, or decrease the version easily. The simplest solution is to keep</div><div class='add'>+dnl the version=7 and add sub-digits for the actual package/symbol versions.</div><div class='add'>+GFAPI_VERSION="7."${PACKAGE_VERSION}</div><div class='add'>+LIBGFCHANGELOG_VERSION="0.0.1"</div><div class='add'>+AC_SUBST(GFAPI_VERSION)</div><div class='add'>+AC_SUBST(LIBGFCHANGELOG_VERSION)</div><div class='add'>+</div><div class='add'>+dnl libtool versioning</div><div class='add'>+LIBGFXDR_LT_VERSION="0:1:0"</div><div class='add'>+LIBGFRPC_LT_VERSION="0:1:0"</div><div class='add'>+LIBGLUSTERFS_LT_VERSION="0:1:0"</div><div class='add'>+LIBGFCHANGELOG_LT_VERSION="0:1:0"</div><div class='add'>+GFAPI_LT_VERSION="0:0:0"</div><div class='add'>+AC_SUBST(LIBGFXDR_LT_VERSION)</div><div class='add'>+AC_SUBST(LIBGFRPC_LT_VERSION)</div><div class='add'>+AC_SUBST(LIBGLUSTERFS_LT_VERSION)</div><div class='add'>+AC_SUBST(LIBGFCHANGELOG_LT_VERSION)</div><div class='add'>+AC_SUBST(GFAPI_LT_VERSION)</div><div class='add'>+AC_SUBST(GFAPI_EXTRA_LDFLAGS)</div><div class='add'>+</div><div class='add'>+GFAPI_LIBS="${ACL_LIBS}"</div><div class='add'>+AC_SUBST(GFAPI_LIBS)</div><div class='add'>+</div><div class='add'>+dnl this change necessary for run-tests.sh</div><div class='add'>+AC_CONFIG_FILES([tests/env.rc],[ln -s ${ac_abs_builddir}/env.rc ${ac_abs_srcdir}/env.rc 2&gt;/dev/null])</div><div class='ctx'> </div><div class='ctx'> AC_OUTPUT</div><div class='ctx'> </div><div class='ctx'> echo</div><div class='ctx'> echo "GlusterFS configure summary"</div><div class='ctx'> echo "==========================="</div><div class='del'>-echo "FUSE client        : $BUILD_FUSE_CLIENT"</div><div class='del'>-echo "Infiniband verbs   : $BUILD_IBVERBS"</div><div class='del'>-echo "epoll IO multiplex : $BUILD_EPOLL"</div><div class='del'>-echo "argp-standalone    : $BUILD_ARGP_STANDALONE"</div><div class='del'>-echo "fusermount         : $BUILD_FUSERMOUNT"</div><div class='del'>-echo "readline           : $BUILD_READLINE"</div><div class='add'>+echo "FUSE client          : $BUILD_FUSE_CLIENT"</div><div class='add'>+echo "epoll IO multiplex   : $BUILD_EPOLL"</div><div class='add'>+echo "fusermount           : $BUILD_FUSERMOUNT"</div><div class='add'>+echo "readline             : $BUILD_READLINE"</div><div class='add'>+echo "georeplication       : $BUILD_SYNCDAEMON"</div><div class='add'>+echo "Linux-AIO            : $BUILD_LIBAIO"</div><div class='add'>+echo "Enable Debug         : $BUILD_DEBUG"</div><div class='add'>+echo "Run with Valgrind    : $VALGRIND_TOOL"</div><div class='add'>+echo "Sanitizer enabled    : $SANITIZER"</div><div class='add'>+echo "Use syslog           : $USE_SYSLOG"</div><div class='add'>+echo "XML output           : $BUILD_XML_OUTPUT"</div><div class='add'>+echo "Unit Tests           : $BUILD_UNITTEST"</div><div class='add'>+echo "Track priv ports     : $TRACK_PRIVPORTS"</div><div class='add'>+echo "POSIX ACLs           : $BUILD_POSIX_ACLS"</div><div class='add'>+echo "SELinux features     : $USE_SELINUX"</div><div class='add'>+echo "firewalld-config     : $BUILD_FIREWALLD"</div><div class='add'>+echo "Events               : $BUILD_EVENTS"</div><div class='add'>+echo "EC dynamic support   : $EC_DYNAMIC_SUPPORT"</div><div class='add'>+echo "Use memory pools     : $USE_MEMPOOL"</div><div class='add'>+echo "Nanosecond m/atimes  : $BUILD_NANOSECOND_TIMESTAMPS"</div><div class='add'>+echo "Server components    : $with_server"</div><div class='add'>+echo "Legacy gNFS server   : $BUILD_GNFS"</div><div class='add'>+echo "IPV6 default         : $with_ipv6_default"</div><div class='add'>+echo "Use TIRPC            : $with_libtirpc"</div><div class='add'>+echo "With Python          : ${PYTHON_VERSION}"</div><div class='add'>+echo "Cloudsync            : $BUILD_CLOUDSYNC"</div><div class='add'>+echo "Metadata dispersal   : $BUILD_METADISP"</div><div class='add'>+echo "Link with TCMALLOC   : $BUILD_TCMALLOC"</div><div class='ctx'> echo</div><div class='add'>+</div><div class='add'>+# dnl Note: ${X^^} capitalization assumes bash &gt;= 4.x</div><div class='add'>+if test "x$SANITIZER" != "xnone"; then</div><div class='add'>+        echo "Note: since glusterfs processes are daemon processes, use"</div><div class='add'>+        echo "'export ${SANITIZER^^}_OPTIONS=log_path=/path/to/xxx.log' to collect"</div><div class='add'>+        echo "sanitizer output. Further details and more options can be"</div><div class='add'>+        echo "found at https://github.com/google/sanitizers."</div><div class='add'>+fi</div><div class='head'>diff --git a/contrib/aclocal/mkdirp.m4 b/contrib/aclocal/mkdirp.m4<br/>new file mode 100644<br/>index 00000000000..d2f7edd5ccd<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/contrib/aclocal/mkdirp.m4?id=d1d7a6f35c816822fab51c820e25023863c239c1'>contrib/aclocal/mkdirp.m4</a></div><div class='hunk'>@@ -0,0 +1,146 @@</div><div class='add'>+# Excerpt from autoconf/autoconf/programs.m4</div><div class='add'>+# This file is part of Autoconf.                       -*- Autoconf -*-</div><div class='add'>+# Checking for programs.</div><div class='add'>+</div><div class='add'>+# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,</div><div class='add'>+# 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free Software</div><div class='add'>+# Foundation, Inc.</div><div class='add'>+</div><div class='add'>+# This file is part of Autoconf.  This program is free</div><div class='add'>+# software; you can redistribute it and/or modify it under the</div><div class='add'>+# terms of the GNU General Public License as published by the</div><div class='add'>+# Free Software Foundation, either version 3 of the License, or</div><div class='add'>+# (at your option) any later version.</div><div class='add'>+#</div><div class='add'>+# This program is distributed in the hope that it will be useful,</div><div class='add'>+# but WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='add'>+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the</div><div class='add'>+# GNU General Public License for more details.</div><div class='add'>+#</div><div class='add'>+# Under Section 7 of GPL version 3, you are granted additional</div><div class='add'>+# permissions described in the Autoconf Configure Script Exception,</div><div class='add'>+# version 3.0, as published by the Free Software Foundation.</div><div class='add'>+#</div><div class='add'>+# You should have received a copy of the GNU General Public License</div><div class='add'>+# and a copy of the Autoconf Configure Script Exception along with</div><div class='add'>+# this program; see the files COPYINGv3 and COPYING.EXCEPTION</div><div class='add'>+# respectively.  If not, see &lt;http://www.gnu.org/licenses/&gt;.</div><div class='add'>+</div><div class='add'>+# Written by David MacKenzie, with help from</div><div class='add'>+# Franc,ois Pinard, Karl Berry, Richard Pixley, Ian Lance Taylor,</div><div class='add'>+# Roland McGrath, Noah Friedman, david d zuhn, and many others.</div><div class='add'>+</div><div class='add'>+# AC_PROG_MKDIR_P</div><div class='add'>+# ---------------</div><div class='add'>+# Check whether `mkdir -p' is known to be thread-safe, and fall back to</div><div class='add'>+# install-sh -d otherwise.</div><div class='add'>+#</div><div class='add'>+# Automake 1.8 used `mkdir -m 0755 -p --' to ensure that directories</div><div class='add'>+# created by `make install' are always world readable, even if the</div><div class='add'>+# installer happens to have an overly restrictive umask (e.g. 077).</div><div class='add'>+# This was a mistake.  There are at least two reasons why we must not</div><div class='add'>+# use `-m 0755':</div><div class='add'>+#   - it causes special bits like SGID to be ignored,</div><div class='add'>+#   - it may be too restrictive (some setups expect 775 directories).</div><div class='add'>+#</div><div class='add'>+# Do not use -m 0755 and let people choose whatever they expect by</div><div class='add'>+# setting umask.</div><div class='add'>+#</div><div class='add'>+# We cannot accept any implementation of `mkdir' that recognizes `-p'.</div><div class='add'>+# Some implementations (such as Solaris 8's) are vulnerable to race conditions:</div><div class='add'>+# if a parallel make tries to run `mkdir -p a/b' and `mkdir -p a/c'</div><div class='add'>+# concurrently, both version can detect that a/ is missing, but only</div><div class='add'>+# one can create it and the other will error out.  Consequently we</div><div class='add'>+# restrict ourselves to known race-free implementations.</div><div class='add'>+#</div><div class='add'>+# Automake used to define mkdir_p as `mkdir -p .', in order to</div><div class='add'>+# allow $(mkdir_p) to be used without argument.  As in</div><div class='add'>+#   $(mkdir_p) $(somedir)</div><div class='add'>+# where $(somedir) is conditionally defined.  However we don't do</div><div class='add'>+# that for MKDIR_P.</div><div class='add'>+#  1. before we restricted the check to GNU mkdir, `mkdir -p .' was</div><div class='add'>+#     reported to fail in read-only directories.  The system where this</div><div class='add'>+#     happened has been forgotten.</div><div class='add'>+#  2. in practice we call $(MKDIR_P) on directories such as</div><div class='add'>+#       $(MKDIR_P) "$(DESTDIR)$(somedir)"</div><div class='add'>+#     and we don't want to create $(DESTDIR) if $(somedir) is empty.</div><div class='add'>+#     To support the latter case, we have to write</div><div class='add'>+#       test -z "$(somedir)" || $(MKDIR_P) "$(DESTDIR)$(somedir)"</div><div class='add'>+#     so $(MKDIR_P) always has an argument.</div><div class='add'>+#     We will have better chances of detecting a missing test if</div><div class='add'>+#     $(MKDIR_P) complains about missing arguments.</div><div class='add'>+#  3. $(MKDIR_P) is named after `mkdir -p' and we don't expect this</div><div class='add'>+#     to accept no argument.</div><div class='add'>+#  4. having something like `mkdir .' in the output is unsightly.</div><div class='add'>+#</div><div class='add'>+# On NextStep and OpenStep, the `mkdir' command does not</div><div class='add'>+# recognize any option.  It will interpret all options as</div><div class='add'>+# directories to create.</div><div class='add'>+AN_MAKEVAR([MKDIR_P], [AC_PROG_MKDIR_P])</div><div class='add'>+AC_DEFUN_ONCE([AC_PROG_MKDIR_P],</div><div class='add'>+[AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl</div><div class='add'>+</div><div class='add'>+AC_MSG_CHECKING([for a thread-safe mkdir -p])</div><div class='add'>+if test -z "$MKDIR_P"; then</div><div class='add'>+  AC_CACHE_VAL([ac_cv_path_mkdir],</div><div class='add'>+    [_AS_PATH_WALK([$PATH$PATH_SEPARATOR/opt/sfw/bin],</div><div class='add'>+      [for ac_prog in mkdir gmkdir; do</div><div class='add'>+	 for ac_exec_ext in '' $ac_executable_extensions; do</div><div class='add'>+	   AS_EXECUTABLE_P(["$as_dir/$ac_prog$ac_exec_ext"]) || continue</div><div class='add'>+	   case `"$as_dir/$ac_prog$ac_exec_ext" --version 2&gt;&amp;1` in #(</div><div class='add'>+	     'mkdir (GNU coreutils) '* | \</div><div class='add'>+	     'mkdir (coreutils) '* | \</div><div class='add'>+	     'mkdir (fileutils) '4.1*)</div><div class='add'>+	       ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext</div><div class='add'>+	       break 3;;</div><div class='add'>+	   esac</div><div class='add'>+	 done</div><div class='add'>+       done])])</div><div class='add'>+  test -d ./--version &amp;&amp; rmdir ./--version</div><div class='add'>+  if test "${ac_cv_path_mkdir+set}" = set; then</div><div class='add'>+    MKDIR_P="$ac_cv_path_mkdir -p"</div><div class='add'>+  else</div><div class='add'>+    # As a last resort, use the slow shell script.  Don't cache a</div><div class='add'>+    # value for MKDIR_P within a source directory, because that will</div><div class='add'>+    # break other packages using the cache if that directory is</div><div class='add'>+    # removed, or if the value is a relative name.</div><div class='add'>+    MKDIR_P="$ac_install_sh -d"</div><div class='add'>+  fi</div><div class='add'>+fi</div><div class='add'>+dnl status.m4 does special magic for MKDIR_P instead of AC_SUBST,</div><div class='add'>+dnl to get relative names right.  However, also AC_SUBST here so</div><div class='add'>+dnl that Automake versions before 1.10 will pick it up (they do not</div><div class='add'>+dnl trace AC_SUBST_TRACE).</div><div class='add'>+dnl FIXME: Remove this once we drop support for Automake &lt; 1.10.</div><div class='add'>+AC_SUBST([MKDIR_P])dnl</div><div class='add'>+AC_MSG_RESULT([$MKDIR_P])</div><div class='add'>+])# AC_PROG_MKDIR_P</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+# From automake/m4/mkdirp.m4</div><div class='add'>+##                                                          -*- Autoconf -*-</div><div class='add'>+# Copyright (C) 2003, 2004, 2005, 2006  Free Software Foundation, Inc.</div><div class='add'>+#</div><div class='add'>+# This file is free software; the Free Software Foundation</div><div class='add'>+# gives unlimited permission to copy and/or distribute it,</div><div class='add'>+# with or without modifications, as long as this notice is preserved.</div><div class='add'>+</div><div class='add'>+# AM_PROG_MKDIR_P</div><div class='add'>+# ---------------</div><div class='add'>+# Check for `mkdir -p'.</div><div class='add'>+AC_DEFUN([AM_PROG_MKDIR_P],</div><div class='add'>+[</div><div class='add'>+AC_REQUIRE([AC_PROG_MKDIR_P])dnl</div><div class='add'>+dnl Automake 1.8 to 1.9.6 used to define mkdir_p.  We now use MKDIR_P,</div><div class='add'>+dnl while keeping a definition of mkdir_p for backward compatibility.</div><div class='add'>+dnl @MKDIR_P@ is magic: AC_OUTPUT adjusts its value for each Makefile.</div><div class='add'>+dnl However we cannot define mkdir_p as $(MKDIR_P) for the sake of</div><div class='add'>+dnl Makefile.ins that do not define MKDIR_P, so we do our own</div><div class='add'>+dnl adjustment using top_builddir (which is defined more often than</div><div class='add'>+dnl MKDIR_P).</div><div class='add'>+AC_SUBST([mkdir_p], ["$MKDIR_P"])dnl</div><div class='add'>+case $mkdir_p in</div><div class='add'>+  [[\\/$]]* | ?:[[\\/]]*) ;;</div><div class='add'>+  */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;;</div><div class='add'>+esac</div><div class='add'>+])</div><div class='head'>diff --git a/contrib/aclocal/python.m4 b/contrib/aclocal/python.m4<br/>new file mode 100644<br/>index 00000000000..a39a9009046<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/contrib/aclocal/python.m4?id=d1d7a6f35c816822fab51c820e25023863c239c1'>contrib/aclocal/python.m4</a></div><div class='hunk'>@@ -0,0 +1,209 @@</div><div class='add'>+## ------------------------                                 -*- Autoconf -*-</div><div class='add'>+## Python file handling</div><div class='add'>+## From Andrew Dalke</div><div class='add'>+## Updated by James Henstridge</div><div class='add'>+## ------------------------</div><div class='add'>+# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2008, 2009</div><div class='add'>+# Free Software Foundation, Inc.</div><div class='add'>+#</div><div class='add'>+# This file is free software; the Free Software Foundation</div><div class='add'>+# gives unlimited permission to copy and/or distribute it,</div><div class='add'>+# with or without modifications, as long as this notice is preserved.</div><div class='add'>+</div><div class='add'>+# AM_PATH_PYTHON([MINIMUM-VERSION], [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND])</div><div class='add'>+# ---------------------------------------------------------------------------</div><div class='add'>+# Adds support for distributing Python modules and packages.  To</div><div class='add'>+# install modules, copy them to $(pythondir), using the python_PYTHON</div><div class='add'>+# automake variable.  To install a package with the same name as the</div><div class='add'>+# automake package, install to $(pkgpythondir), or use the</div><div class='add'>+# pkgpython_PYTHON automake variable.</div><div class='add'>+#</div><div class='add'>+# The variables $(pyexecdir) and $(pkgpyexecdir) are provided as</div><div class='add'>+# locations to install python extension modules (shared libraries).</div><div class='add'>+# Another macro is required to find the appropriate flags to compile</div><div class='add'>+# extension modules.</div><div class='add'>+#</div><div class='add'>+# If your package is configured with a different prefix to python,</div><div class='add'>+# users will have to add the install directory to the PYTHONPATH</div><div class='add'>+# environment variable, or create a .pth file (see the python</div><div class='add'>+# documentation for details).</div><div class='add'>+#</div><div class='add'>+# If the MINIMUM-VERSION argument is passed, AM_PATH_PYTHON will</div><div class='add'>+# cause an error if the version of python installed on the system</div><div class='add'>+# doesn't meet the requirement.  MINIMUM-VERSION should consist of</div><div class='add'>+# numbers and dots only.</div><div class='add'>+AC_DEFUN([AM_PATH_PYTHON],</div><div class='add'>+ [</div><div class='add'>+  dnl Find a Python interpreter.  Python versions prior to 2.0 are not</div><div class='add'>+  dnl supported. (2.0 was released on October 16, 2000).</div><div class='add'>+  m4_define_default([_AM_PYTHON_INTERPRETER_LIST],</div><div class='add'>+                    [python python2 python3 python3.2 python3.1 python3.0 python2.7 python2.6 python2.5 python2.4 python2.3 python2.2 dnl</div><div class='add'>+python2.1 python2.0])</div><div class='add'>+</div><div class='add'>+  m4_if([$1],[],[</div><div class='add'>+    dnl No version check is needed.</div><div class='add'>+    # Find any Python interpreter.</div><div class='add'>+    if test -z "$PYTHON"; then</div><div class='add'>+      AC_PATH_PROGS([PYTHON], _AM_PYTHON_INTERPRETER_LIST, :)</div><div class='add'>+    fi</div><div class='add'>+    am_display_PYTHON=python</div><div class='add'>+  ], [</div><div class='add'>+    dnl A version check is needed.</div><div class='add'>+    if test -n "$PYTHON"; then</div><div class='add'>+      # If the user set $PYTHON, use it and don't search something else.</div><div class='add'>+      AC_MSG_CHECKING([whether $PYTHON version &gt;= $1])</div><div class='add'>+      AM_PYTHON_CHECK_VERSION([$PYTHON], [$1],</div><div class='add'>+			      [AC_MSG_RESULT(yes)],</div><div class='add'>+			      [AC_MSG_ERROR(too old)])</div><div class='add'>+      am_display_PYTHON=$PYTHON</div><div class='add'>+    else</div><div class='add'>+      # Otherwise, try each interpreter until we find one that satisfies</div><div class='add'>+      # VERSION.</div><div class='add'>+      AC_CACHE_CHECK([for a Python interpreter with version &gt;= $1],</div><div class='add'>+	[am_cv_pathless_PYTHON],[</div><div class='add'>+	for am_cv_pathless_PYTHON in _AM_PYTHON_INTERPRETER_LIST none; do</div><div class='add'>+	  test "$am_cv_pathless_PYTHON" = none &amp;&amp; break</div><div class='add'>+	  AM_PYTHON_CHECK_VERSION([$am_cv_pathless_PYTHON], [$1], [break])</div><div class='add'>+	done])</div><div class='add'>+      # Set $PYTHON to the absolute path of $am_cv_pathless_PYTHON.</div><div class='add'>+      if test "$am_cv_pathless_PYTHON" = none; then</div><div class='add'>+	PYTHON=:</div><div class='add'>+      else</div><div class='add'>+        AC_PATH_PROG([PYTHON], [$am_cv_pathless_PYTHON])</div><div class='add'>+      fi</div><div class='add'>+      am_display_PYTHON=$am_cv_pathless_PYTHON</div><div class='add'>+    fi</div><div class='add'>+  ])</div><div class='add'>+</div><div class='add'>+  if test "$PYTHON" = :; then</div><div class='add'>+  dnl Run any user-specified action, or abort.</div><div class='add'>+    m4_default([$3], [AC_MSG_ERROR([no suitable Python interpreter found])])</div><div class='add'>+  else</div><div class='add'>+</div><div class='add'>+  dnl Query Python for its version number.  Getting [:3] seems to be</div><div class='add'>+  dnl the best way to do this; it's what "site.py" does in the standard</div><div class='add'>+  dnl library.</div><div class='add'>+</div><div class='add'>+  AC_CACHE_CHECK([for $am_display_PYTHON version], [am_cv_python_version],</div><div class='add'>+    [am_cv_python_version=`$PYTHON -c "import sys; sys.stdout.write(sys.version[[:3]])"`])</div><div class='add'>+  AC_SUBST([PYTHON_VERSION], [$am_cv_python_version])</div><div class='add'>+</div><div class='add'>+  dnl Use the values of $prefix and $exec_prefix for the corresponding</div><div class='add'>+  dnl values of PYTHON_PREFIX and PYTHON_EXEC_PREFIX.  These are made</div><div class='add'>+  dnl distinct variables so they can be overridden if need be.  However,</div><div class='add'>+  dnl general consensus is that you shouldn't need this ability.</div><div class='add'>+</div><div class='add'>+  AC_SUBST([PYTHON_PREFIX], ['${prefix}'])</div><div class='add'>+  AC_SUBST([PYTHON_EXEC_PREFIX], ['${exec_prefix}'])</div><div class='add'>+</div><div class='add'>+  dnl At times (like when building shared libraries) you may want</div><div class='add'>+  dnl to know which OS platform Python thinks this is.</div><div class='add'>+</div><div class='add'>+  AC_CACHE_CHECK([for $am_display_PYTHON platform], [am_cv_python_platform],</div><div class='add'>+    [am_cv_python_platform=`$PYTHON -c "import sys; sys.stdout.write(sys.platform)"`])</div><div class='add'>+  AC_SUBST([PYTHON_PLATFORM], [$am_cv_python_platform])</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+  dnl Set up 4 directories:</div><div class='add'>+</div><div class='add'>+  dnl pythondir -- where to install python scripts.  This is the</div><div class='add'>+  dnl   site-packages directory, not the python standard library</div><div class='add'>+  dnl   directory like in previous automake betas.  This behavior</div><div class='add'>+  dnl   is more consistent with lispdir.m4 for example.</div><div class='add'>+  dnl Query distutils for this directory.  distutils does not exist in</div><div class='add'>+  dnl Python 1.5, so we fall back to the hardcoded directory if it</div><div class='add'>+  dnl doesn't work.</div><div class='add'>+  AC_CACHE_CHECK([for $am_display_PYTHON script directory],</div><div class='add'>+    [am_cv_python_pythondir],</div><div class='add'>+    [if test "x$prefix" = xNONE</div><div class='add'>+     then</div><div class='add'>+       am_py_prefix=$ac_default_prefix</div><div class='add'>+     else</div><div class='add'>+       am_py_prefix=$prefix</div><div class='add'>+     fi</div><div class='add'>+     am_cv_python_pythondir=`$PYTHON -c "import sys; from distutils import sysconfig; sys.stdout.write(sysconfig.get_python_lib(0,0,prefix='$am_py_prefix'))" 2&gt;/dev/null ||</div><div class='add'>+     echo "$PYTHON_PREFIX/lib/python$PYTHON_VERSION/site-packages"`</div><div class='add'>+     case $am_cv_python_pythondir in</div><div class='add'>+     $am_py_prefix*)</div><div class='add'>+       am__strip_prefix=`echo "$am_py_prefix" | sed 's|.|.|g'`</div><div class='add'>+       am_cv_python_pythondir=`echo "$am_cv_python_pythondir" | sed "s,^$am__strip_prefix,$PYTHON_PREFIX,"`</div><div class='add'>+       ;;</div><div class='add'>+     *)</div><div class='add'>+       case $am_py_prefix in</div><div class='add'>+         /usr|/System*) ;;</div><div class='add'>+         *)</div><div class='add'>+	  am_cv_python_pythondir=$PYTHON_PREFIX/lib/python$PYTHON_VERSION/site-packages</div><div class='add'>+	  ;;</div><div class='add'>+       esac</div><div class='add'>+       ;;</div><div class='add'>+     esac</div><div class='add'>+    ])</div><div class='add'>+  AC_SUBST([pythondir], [$am_cv_python_pythondir])</div><div class='add'>+</div><div class='add'>+  dnl pkgpythondir -- $PACKAGE directory under pythondir.  Was</div><div class='add'>+  dnl   PYTHON_SITE_PACKAGE in previous betas, but this naming is</div><div class='add'>+  dnl   more consistent with the rest of automake.</div><div class='add'>+</div><div class='add'>+  AC_SUBST([pkgpythondir], [\${pythondir}/$PACKAGE])</div><div class='add'>+</div><div class='add'>+  dnl pyexecdir -- directory for installing python extension modules</div><div class='add'>+  dnl   (shared libraries)</div><div class='add'>+  dnl Query distutils for this directory.  distutils does not exist in</div><div class='add'>+  dnl Python 1.5, so we fall back to the hardcoded directory if it</div><div class='add'>+  dnl doesn't work.</div><div class='add'>+  AC_CACHE_CHECK([for $am_display_PYTHON extension module directory],</div><div class='add'>+    [am_cv_python_pyexecdir],</div><div class='add'>+    [if test "x$exec_prefix" = xNONE</div><div class='add'>+     then</div><div class='add'>+       am_py_exec_prefix=$am_py_prefix</div><div class='add'>+     else</div><div class='add'>+       am_py_exec_prefix=$exec_prefix</div><div class='add'>+     fi</div><div class='add'>+     am_cv_python_pyexecdir=`$PYTHON -c "import sys; from distutils import sysconfig; sys.stdout.write(sysconfig.get_python_lib(1,0,prefix='$am_py_exec_prefix'))" 2&gt;/dev/null ||</div><div class='add'>+     echo "$PYTHON_EXEC_PREFIX/lib/python$PYTHON_VERSION/site-packages"`</div><div class='add'>+     case $am_cv_python_pyexecdir in</div><div class='add'>+     $am_py_exec_prefix*)</div><div class='add'>+       am__strip_prefix=`echo "$am_py_exec_prefix" | sed 's|.|.|g'`</div><div class='add'>+       am_cv_python_pyexecdir=`echo "$am_cv_python_pyexecdir" | sed "s,^$am__strip_prefix,$PYTHON_EXEC_PREFIX,"`</div><div class='add'>+       ;;</div><div class='add'>+     *)</div><div class='add'>+       case $am_py_exec_prefix in</div><div class='add'>+         /usr|/System*) ;;</div><div class='add'>+         *)</div><div class='add'>+	   am_cv_python_pyexecdir=$PYTHON_EXEC_PREFIX/lib/python$PYTHON_VERSION/site-packages</div><div class='add'>+	   ;;</div><div class='add'>+       esac</div><div class='add'>+       ;;</div><div class='add'>+     esac</div><div class='add'>+    ])</div><div class='add'>+  AC_SUBST([pyexecdir], [$am_cv_python_pyexecdir])</div><div class='add'>+</div><div class='add'>+  dnl pkgpyexecdir -- $(pyexecdir)/$(PACKAGE)</div><div class='add'>+</div><div class='add'>+  AC_SUBST([pkgpyexecdir], [\${pyexecdir}/$PACKAGE])</div><div class='add'>+</div><div class='add'>+  dnl Run any user-specified action.</div><div class='add'>+  $2</div><div class='add'>+  fi</div><div class='add'>+</div><div class='add'>+])</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+# AM_PYTHON_CHECK_VERSION(PROG, VERSION, [ACTION-IF-TRUE], [ACTION-IF-FALSE])</div><div class='add'>+# ---------------------------------------------------------------------------</div><div class='add'>+# Run ACTION-IF-TRUE if the Python interpreter PROG has version &gt;= VERSION.</div><div class='add'>+# Run ACTION-IF-FALSE otherwise.</div><div class='add'>+# This test uses sys.hexversion instead of the string equivalent (first</div><div class='add'>+# word of sys.version), in order to cope with versions such as 2.2c1.</div><div class='add'>+# This supports Python 2.0 or higher. (2.0 was released on October 16, 2000).</div><div class='add'>+AC_DEFUN([AM_PYTHON_CHECK_VERSION],</div><div class='add'>+ [prog="import sys</div><div class='add'>+# split strings by '.' and convert to numeric.  Append some zeros</div><div class='add'>+# because we need at least 4 digits for the hex conversion.</div><div class='add'>+# map returns an iterator in Python 3.0 and a list in 2.x</div><div class='add'>+minver = list(map(int, '$2'.split('.'))) + [[0, 0, 0]]</div><div class='add'>+minverhex = 0</div><div class='add'>+# xrange is not present in Python 3.0 and range returns an iterator</div><div class='add'>+for i in list(range(0, 4)): minverhex = (minverhex &lt;&lt; 8) + minver[[i]]</div><div class='add'>+sys.exit(sys.hexversion &lt; minverhex)"</div><div class='add'>+  AS_IF([AM_RUN_LOG([$1 -c "$prog"])], [$3], [$4])])</div><div class='head'>diff --git a/contrib/apple/daemon.c b/contrib/apple/daemon.c<br/>deleted file mode 100644<br/>index 9389201a1af..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/contrib/apple/daemon.c?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>contrib/apple/daemon.c</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,92 +0,0 @@</div><div class='del'>-/*</div><div class='del'>-   Copyright (c) 2010 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='del'>-</div><div class='del'>-   Based on http://www.opensource.apple.com/source/Libc/Libc-583/gen/FreeBSD/daemon.c</div><div class='del'>- */</div><div class='del'>-</div><div class='del'>-/*-</div><div class='del'>- * Copyright (c) 1990, 1993</div><div class='del'>- *	The Regents of the University of California.  All rights reserved.</div><div class='del'>- *</div><div class='del'>- * Redistribution and use in source and binary forms, with or without</div><div class='del'>- * modification, are permitted provided that the following conditions</div><div class='del'>- * are met:</div><div class='del'>- * 1. Redistributions of source code must retain the above copyright</div><div class='del'>- *    notice, this list of conditions and the following disclaimer.</div><div class='del'>- * 2. Redistributions in binary form must reproduce the above copyright</div><div class='del'>- *    notice, this list of conditions and the following disclaimer in the</div><div class='del'>- *    documentation and/or other materials provided with the distribution.</div><div class='del'>- * 3. All advertising materials mentioning features or use of this software</div><div class='del'>- *    must display the following acknowledgement:</div><div class='del'>- *	This product includes software developed by the University of</div><div class='del'>- *	California, Berkeley and its contributors.</div><div class='del'>- * 4. Neither the name of the University nor the names of its contributors</div><div class='del'>- *    may be used to endorse or promote products derived from this software</div><div class='del'>- *    without specific prior written permission.</div><div class='del'>- *</div><div class='del'>- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND</div><div class='del'>- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE</div><div class='del'>- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE</div><div class='del'>- * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE</div><div class='del'>- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL</div><div class='del'>- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS</div><div class='del'>- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)</div><div class='del'>- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT</div><div class='del'>- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY</div><div class='del'>- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF</div><div class='del'>- * SUCH DAMAGE.</div><div class='del'>- */</div><div class='del'>-</div><div class='del'>-#include &lt;errno.h&gt;</div><div class='del'>-#include &lt;fcntl.h&gt;</div><div class='del'>-#include &lt;paths.h&gt;</div><div class='del'>-#include &lt;signal.h&gt;</div><div class='del'>-#include &lt;unistd.h&gt;</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-os_daemon(nochdir, noclose)</div><div class='del'>-	int nochdir, noclose;</div><div class='del'>-{</div><div class='del'>-	struct sigaction osa, sa;</div><div class='del'>-	int fd;</div><div class='del'>-	pid_t newgrp;</div><div class='del'>-	int oerrno;</div><div class='del'>-	int osa_ok;</div><div class='del'>-</div><div class='del'>-	/* A SIGHUP may be thrown when the parent exits below. */</div><div class='del'>-	sigemptyset(&amp;sa.sa_mask);</div><div class='del'>-	sa.sa_handler = SIG_IGN;</div><div class='del'>-	sa.sa_flags = 0;</div><div class='del'>-	osa_ok = sigaction(SIGHUP, &amp;sa, &amp;osa);</div><div class='del'>-</div><div class='del'>-	switch (fork()) {</div><div class='del'>-	case -1:</div><div class='del'>-		return (-1);</div><div class='del'>-	case 0:</div><div class='del'>-		break;</div><div class='del'>-	default:</div><div class='del'>-		_exit(0);</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	newgrp = setsid();</div><div class='del'>-	oerrno = errno;</div><div class='del'>-	if (osa_ok != -1)</div><div class='del'>-		sigaction(SIGHUP, &amp;osa, NULL);</div><div class='del'>-</div><div class='del'>-	if (newgrp == -1) {</div><div class='del'>-		errno = oerrno;</div><div class='del'>-		return (-1);</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	if (!nochdir)</div><div class='del'>-		(void)chdir("/");</div><div class='del'>-</div><div class='del'>-	if (!noclose &amp;&amp; (fd = open(_PATH_DEVNULL, O_RDWR, 0)) != -1) {</div><div class='del'>-		(void)dup2(fd, STDIN_FILENO);</div><div class='del'>-		(void)dup2(fd, STDOUT_FILENO);</div><div class='del'>-		(void)dup2(fd, STDERR_FILENO);</div><div class='del'>-		if (fd &gt; 2)</div><div class='del'>-			(void)close(fd);</div><div class='del'>-	}</div><div class='del'>-	return (0);</div><div class='del'>-}</div><div class='head'>diff --git a/contrib/apple/daemon.h b/contrib/apple/daemon.h<br/>deleted file mode 100644<br/>index 7a2824b6a47..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/contrib/apple/daemon.h?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>contrib/apple/daemon.h</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,20 +0,0 @@</div><div class='del'>-/*</div><div class='del'>-   Copyright (c) 2010 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='del'>-   This file is part of GlusterFS.</div><div class='del'>-</div><div class='del'>-   GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-   it under the terms of the GNU General Public License as published</div><div class='del'>-   by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-   or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-   GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-   WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-   General Public License for more details.</div><div class='del'>-</div><div class='del'>-   You should have received a copy of the GNU General Public License</div><div class='del'>-   along with this program.  If not, see</div><div class='del'>-   &lt;http://www.gnu.org/licenses/&gt;.</div><div class='del'>-*/</div><div class='del'>-</div><div class='del'>-int os_daemon(int nochdir, int noclose);</div><div class='head'>diff --git a/contrib/fuse-include/fuse-misc.h b/contrib/fuse-include/fuse-misc.h<br/>index 16b47347262..f905215b0a1 100644<br/>--- a/<a href='/cgit/glusterfs.git/tree/contrib/fuse-include/fuse-misc.h?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>contrib/fuse-include/fuse-misc.h</a><br/>+++ b/<a href='/cgit/glusterfs.git/tree/contrib/fuse-include/fuse-misc.h?id=d1d7a6f35c816822fab51c820e25023863c239c1'>contrib/fuse-include/fuse-misc.h</a></div><div class='hunk'>@@ -10,4 +10,5 @@</div><div class='ctx'> </div><div class='ctx'> unsigned long calc_timeout_sec (double t);</div><div class='ctx'> unsigned int calc_timeout_nsec (double t);</div><div class='del'>-void convert_fuse_file_lock (struct fuse_file_lock *fl, struct flock *flock);</div><div class='add'>+void convert_fuse_file_lock (struct fuse_file_lock *fl, struct gf_flock *flock,</div><div class='add'>+                             uint64_t lk_owner);</div><div class='head'>diff --git a/contrib/fuse-include/fuse-mount.h b/contrib/fuse-include/fuse-mount.h<br/>index 6aaab01aac6..7d28462de47 100644<br/>--- a/<a href='/cgit/glusterfs.git/tree/contrib/fuse-include/fuse-mount.h?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>contrib/fuse-include/fuse-mount.h</a><br/>+++ b/<a href='/cgit/glusterfs.git/tree/contrib/fuse-include/fuse-mount.h?id=d1d7a6f35c816822fab51c820e25023863c239c1'>contrib/fuse-include/fuse-mount.h</a></div><div class='hunk'>@@ -1,11 +1,13 @@</div><div class='ctx'> /*</div><div class='ctx'>   FUSE: Filesystem in Userspace</div><div class='ctx'>   Copyright (C) 2001-2007  Miklos Szeredi &lt;miklos@szeredi.hu&gt;</div><div class='del'>-  Copyright (c) 2009 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='add'>+  Copyright (c) 2010 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='ctx'> </div><div class='ctx'>   This program can be distributed under the terms of the GNU LGPLv2.</div><div class='ctx'>   See the file COPYING.LIB.</div><div class='ctx'> */</div><div class='ctx'> </div><div class='ctx'> void gf_fuse_unmount (const char *mountpoint, int fd);</div><div class='del'>-int gf_fuse_mount (const char *mountpoint, char *fsname, char *mnt_param);</div><div class='add'>+int gf_fuse_unmount_daemon (const char *mountpoint, int fd);</div><div class='add'>+int gf_fuse_mount (const char *mountpoint, char *fsname, char *mnt_param,</div><div class='add'>+                   pid_t *mtab_pid, int status_fd);</div><div class='head'>diff --git a/contrib/fuse-include/fuse_kernel.h b/contrib/fuse-include/fuse_kernel.h<br/>index 9ae25d6f9c0..1e41e237e6f 100644<br/>--- a/<a href='/cgit/glusterfs.git/tree/contrib/fuse-include/fuse_kernel.h?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>contrib/fuse-include/fuse_kernel.h</a><br/>+++ b/<a href='/cgit/glusterfs.git/tree/contrib/fuse-include/fuse_kernel.h?id=d1d7a6f35c816822fab51c820e25023863c239c1'>contrib/fuse-include/fuse_kernel.h</a></div><div class='hunk'>@@ -60,23 +60,87 @@</div><div class='ctx'>  * 7.13</div><div class='ctx'>  *  - make max number of background requests and congestion threshold</div><div class='ctx'>  *    tunables</div><div class='add'>+ *</div><div class='add'>+ * 7.14</div><div class='add'>+ *  - add splice support to fuse device</div><div class='add'>+ *</div><div class='add'>+ * 7.15</div><div class='add'>+ *  - add store notify</div><div class='add'>+ *  - add retrieve notify</div><div class='add'>+ *</div><div class='add'>+ * 7.16</div><div class='add'>+ *  - add BATCH_FORGET request</div><div class='add'>+ *  - FUSE_IOCTL_UNRESTRICTED shall now return with array of 'struct</div><div class='add'>+ *    fuse_ioctl_iovec' instead of ambiguous 'struct iovec'</div><div class='add'>+ *  - add FUSE_IOCTL_32BIT flag</div><div class='add'>+ *</div><div class='add'>+ * 7.17</div><div class='add'>+ *  - add FUSE_FLOCK_LOCKS and FUSE_RELEASE_FLOCK_UNLOCK</div><div class='add'>+ *</div><div class='add'>+ * 7.18</div><div class='add'>+ *  - add FUSE_IOCTL_DIR flag</div><div class='add'>+ *  - add FUSE_NOTIFY_DELETE</div><div class='add'>+ *</div><div class='add'>+ * 7.19</div><div class='add'>+ *  - add FUSE_FALLOCATE</div><div class='add'>+ *</div><div class='add'>+ * 7.20</div><div class='add'>+ *  - add FUSE_AUTO_INVAL_DATA</div><div class='add'>+ *</div><div class='add'>+ * 7.21</div><div class='add'>+ *  - add FUSE_READDIRPLUS</div><div class='add'>+ *  - send the requested events in POLL request</div><div class='add'>+ *</div><div class='add'>+ * 7.22</div><div class='add'>+ *  - add FUSE_ASYNC_DIO</div><div class='add'>+ *</div><div class='add'>+ * 7.23</div><div class='add'>+ *  - add FUSE_WRITEBACK_CACHE</div><div class='add'>+ *  - add time_gran to fuse_init_out</div><div class='add'>+ *  - add reserved space to fuse_init_out</div><div class='add'>+ *  - add FATTR_CTIME</div><div class='add'>+ *  - add ctime and ctimensec to fuse_setattr_in</div><div class='add'>+ *  - add FUSE_RENAME2 request</div><div class='add'>+ *  - add FUSE_NO_OPEN_SUPPORT flag</div><div class='add'>+ *</div><div class='add'>+ *  7.24</div><div class='add'>+ *  - add FUSE_LSEEK for SEEK_HOLE and SEEK_DATA support</div><div class='ctx'>  */</div><div class='ctx'> </div><div class='ctx'> #ifndef _LINUX_FUSE_H</div><div class='ctx'> #define _LINUX_FUSE_H</div><div class='ctx'> </div><div class='del'>-#include &lt;sys/types.h&gt;</div><div class='del'>-#define __u64 uint64_t</div><div class='del'>-#define __s64 int64_t</div><div class='del'>-#define __u32 uint32_t</div><div class='del'>-#define __s32 int32_t</div><div class='del'>-#define __u16 uint16_t</div><div class='add'>+#ifdef __KERNEL__</div><div class='add'>+#include &lt;linux/types.h&gt;</div><div class='add'>+#else</div><div class='add'>+#include &lt;stdint.h&gt;</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+ * Version negotiation:</div><div class='add'>+ *</div><div class='add'>+ * Both the kernel and userspace send the version they support in the</div><div class='add'>+ * INIT request and reply respectively.</div><div class='add'>+ *</div><div class='add'>+ * If the major versions match then both shall use the smallest</div><div class='add'>+ * of the two minor versions for communication.</div><div class='add'>+ *</div><div class='add'>+ * If the kernel supports a larger major version, then userspace shall</div><div class='add'>+ * reply with the major version it supports, ignore the rest of the</div><div class='add'>+ * INIT message and expect a new INIT message from the kernel with a</div><div class='add'>+ * matching major version.</div><div class='add'>+ *</div><div class='add'>+ * If the library supports a larger major version, then it shall fall</div><div class='add'>+ * back to the major protocol version sent by the kernel for</div><div class='add'>+ * communication and reply with that major version (and an arbitrary</div><div class='add'>+ * supported minor version).</div><div class='add'>+ */</div><div class='ctx'> </div><div class='ctx'> /** Version number of this interface */</div><div class='ctx'> #define FUSE_KERNEL_VERSION 7</div><div class='ctx'> </div><div class='ctx'> /** Minor version number of this interface */</div><div class='del'>-#define FUSE_KERNEL_MINOR_VERSION 13</div><div class='add'>+#define FUSE_KERNEL_MINOR_VERSION 24</div><div class='ctx'> </div><div class='ctx'> /** The node ID of the root inode */</div><div class='ctx'> #define FUSE_ROOT_ID 1</div><div class='hunk'>@@ -85,42 +149,42 @@</div><div class='ctx'>    userspace works under 64bit kernels */</div><div class='ctx'> </div><div class='ctx'> struct fuse_attr {</div><div class='del'>-	__u64	ino;</div><div class='del'>-	__u64	size;</div><div class='del'>-	__u64	blocks;</div><div class='del'>-	__u64	atime;</div><div class='del'>-	__u64	mtime;</div><div class='del'>-	__u64	ctime;</div><div class='del'>-	__u32	atimensec;</div><div class='del'>-	__u32	mtimensec;</div><div class='del'>-	__u32	ctimensec;</div><div class='del'>-	__u32	mode;</div><div class='del'>-	__u32	nlink;</div><div class='del'>-	__u32	uid;</div><div class='del'>-	__u32	gid;</div><div class='del'>-	__u32	rdev;</div><div class='del'>-	__u32	blksize;</div><div class='del'>-	__u32	padding;</div><div class='add'>+	uint64_t	ino;</div><div class='add'>+	uint64_t	size;</div><div class='add'>+	uint64_t	blocks;</div><div class='add'>+	uint64_t	atime;</div><div class='add'>+	uint64_t	mtime;</div><div class='add'>+	uint64_t	ctime;</div><div class='add'>+	uint32_t	atimensec;</div><div class='add'>+	uint32_t	mtimensec;</div><div class='add'>+	uint32_t	ctimensec;</div><div class='add'>+	uint32_t	mode;</div><div class='add'>+	uint32_t	nlink;</div><div class='add'>+	uint32_t	uid;</div><div class='add'>+	uint32_t	gid;</div><div class='add'>+	uint32_t	rdev;</div><div class='add'>+	uint32_t	blksize;</div><div class='add'>+	uint32_t	padding;</div><div class='ctx'> };</div><div class='ctx'> </div><div class='ctx'> struct fuse_kstatfs {</div><div class='del'>-	__u64	blocks;</div><div class='del'>-	__u64	bfree;</div><div class='del'>-	__u64	bavail;</div><div class='del'>-	__u64	files;</div><div class='del'>-	__u64	ffree;</div><div class='del'>-	__u32	bsize;</div><div class='del'>-	__u32	namelen;</div><div class='del'>-	__u32	frsize;</div><div class='del'>-	__u32	padding;</div><div class='del'>-	__u32	spare[6];</div><div class='add'>+	uint64_t	blocks;</div><div class='add'>+	uint64_t	bfree;</div><div class='add'>+	uint64_t	bavail;</div><div class='add'>+	uint64_t	files;</div><div class='add'>+	uint64_t	ffree;</div><div class='add'>+	uint32_t	bsize;</div><div class='add'>+	uint32_t	namelen;</div><div class='add'>+	uint32_t	frsize;</div><div class='add'>+	uint32_t	padding;</div><div class='add'>+	uint32_t	spare[6];</div><div class='ctx'> };</div><div class='ctx'> </div><div class='ctx'> struct fuse_file_lock {</div><div class='del'>-	__u64	start;</div><div class='del'>-	__u64	end;</div><div class='del'>-	__u32	type;</div><div class='del'>-	__u32	pid; /* tgid */</div><div class='add'>+	uint64_t	start;</div><div class='add'>+	uint64_t	end;</div><div class='add'>+	uint32_t	type;</div><div class='add'>+	uint32_t	pid; /* tgid */</div><div class='ctx'> };</div><div class='ctx'> </div><div class='ctx'> /**</div><div class='hunk'>@@ -136,6 +200,7 @@ struct fuse_file_lock {</div><div class='ctx'> #define FATTR_ATIME_NOW	(1 &lt;&lt; 7)</div><div class='ctx'> #define FATTR_MTIME_NOW	(1 &lt;&lt; 8)</div><div class='ctx'> #define FATTR_LOCKOWNER	(1 &lt;&lt; 9)</div><div class='add'>+#define FATTR_CTIME	(1 &lt;&lt; 10)</div><div class='ctx'> </div><div class='ctx'> /**</div><div class='ctx'>  * Flags returned by the OPEN request</div><div class='hunk'>@@ -151,8 +216,24 @@ struct fuse_file_lock {</div><div class='ctx'> /**</div><div class='ctx'>  * INIT request/reply flags</div><div class='ctx'>  *</div><div class='add'>+ * FUSE_ASYNC_READ: asynchronous read requests</div><div class='add'>+ * FUSE_POSIX_LOCKS: remote locking for POSIX file locks</div><div class='add'>+ * FUSE_FILE_OPS: kernel sends file handle for fstat, etc... (not yet supported)</div><div class='add'>+ * FUSE_ATOMIC_O_TRUNC: handles the O_TRUNC open flag in the filesystem</div><div class='ctx'>  * FUSE_EXPORT_SUPPORT: filesystem handles lookups of "." and ".."</div><div class='add'>+ * FUSE_BIG_WRITES: filesystem can handle write size larger than 4kB</div><div class='ctx'>  * FUSE_DONT_MASK: don't apply umask to file mode on create operations</div><div class='add'>+ * FUSE_SPLICE_WRITE: kernel supports splice write on the device</div><div class='add'>+ * FUSE_SPLICE_MOVE: kernel supports splice move on the device</div><div class='add'>+ * FUSE_SPLICE_READ: kernel supports splice read on the device</div><div class='add'>+ * FUSE_FLOCK_LOCKS: remote locking for BSD style file locks</div><div class='add'>+ * FUSE_HAS_IOCTL_DIR: kernel supports ioctl on directories</div><div class='add'>+ * FUSE_AUTO_INVAL_DATA: automatically invalidate cached pages</div><div class='add'>+ * FUSE_DO_READDIRPLUS: do READDIRPLUS (READDIR+LOOKUP in one)</div><div class='add'>+ * FUSE_READDIRPLUS_AUTO: adaptive readdirplus</div><div class='add'>+ * FUSE_ASYNC_DIO: asynchronous direct I/O submission</div><div class='add'>+ * FUSE_WRITEBACK_CACHE: use writeback cache for buffered writes</div><div class='add'>+ * FUSE_NO_OPEN_SUPPORT: kernel supports zero-message opens</div><div class='ctx'>  */</div><div class='ctx'> #define FUSE_ASYNC_READ		(1 &lt;&lt; 0)</div><div class='ctx'> #define FUSE_POSIX_LOCKS	(1 &lt;&lt; 1)</div><div class='hunk'>@@ -161,6 +242,17 @@ struct fuse_file_lock {</div><div class='ctx'> #define FUSE_EXPORT_SUPPORT	(1 &lt;&lt; 4)</div><div class='ctx'> #define FUSE_BIG_WRITES		(1 &lt;&lt; 5)</div><div class='ctx'> #define FUSE_DONT_MASK		(1 &lt;&lt; 6)</div><div class='add'>+#define FUSE_SPLICE_WRITE	(1 &lt;&lt; 7)</div><div class='add'>+#define FUSE_SPLICE_MOVE	(1 &lt;&lt; 8)</div><div class='add'>+#define FUSE_SPLICE_READ	(1 &lt;&lt; 9)</div><div class='add'>+#define FUSE_FLOCK_LOCKS	(1 &lt;&lt; 10)</div><div class='add'>+#define FUSE_HAS_IOCTL_DIR	(1 &lt;&lt; 11)</div><div class='add'>+#define FUSE_AUTO_INVAL_DATA	(1 &lt;&lt; 12)</div><div class='add'>+#define FUSE_DO_READDIRPLUS	(1 &lt;&lt; 13)</div><div class='add'>+#define FUSE_READDIRPLUS_AUTO	(1 &lt;&lt; 14)</div><div class='add'>+#define FUSE_ASYNC_DIO		(1 &lt;&lt; 15)</div><div class='add'>+#define FUSE_WRITEBACK_CACHE	(1 &lt;&lt; 16)</div><div class='add'>+#define FUSE_NO_OPEN_SUPPORT	(1 &lt;&lt; 17)</div><div class='ctx'> </div><div class='ctx'> /**</div><div class='ctx'>  * CUSE INIT request/reply flags</div><div class='hunk'>@@ -173,6 +265,7 @@ struct fuse_file_lock {</div><div class='ctx'>  * Release flags</div><div class='ctx'>  */</div><div class='ctx'> #define FUSE_RELEASE_FLUSH	(1 &lt;&lt; 0)</div><div class='add'>+#define FUSE_RELEASE_FLOCK_UNLOCK	(1 &lt;&lt; 1)</div><div class='ctx'> </div><div class='ctx'> /**</div><div class='ctx'>  * Getattr flags</div><div class='hunk'>@@ -204,12 +297,16 @@ struct fuse_file_lock {</div><div class='ctx'>  * FUSE_IOCTL_COMPAT: 32bit compat ioctl on 64bit machine</div><div class='ctx'>  * FUSE_IOCTL_UNRESTRICTED: not restricted to well-formed ioctls, retry allowed</div><div class='ctx'>  * FUSE_IOCTL_RETRY: retry with new iovecs</div><div class='add'>+ * FUSE_IOCTL_32BIT: 32bit ioctl</div><div class='add'>+ * FUSE_IOCTL_DIR: is a directory</div><div class='ctx'>  *</div><div class='ctx'>  * FUSE_IOCTL_MAX_IOV: maximum of in_iovecs + out_iovecs</div><div class='ctx'>  */</div><div class='ctx'> #define FUSE_IOCTL_COMPAT	(1 &lt;&lt; 0)</div><div class='ctx'> #define FUSE_IOCTL_UNRESTRICTED	(1 &lt;&lt; 1)</div><div class='ctx'> #define FUSE_IOCTL_RETRY	(1 &lt;&lt; 2)</div><div class='add'>+#define FUSE_IOCTL_32BIT	(1 &lt;&lt; 3)</div><div class='add'>+#define FUSE_IOCTL_DIR		(1 &lt;&lt; 4)</div><div class='ctx'> </div><div class='ctx'> #define FUSE_IOCTL_MAX_IOV	256</div><div class='ctx'> </div><div class='hunk'>@@ -259,6 +356,12 @@ enum fuse_opcode {</div><div class='ctx'> 	FUSE_DESTROY       = 38,</div><div class='ctx'> 	FUSE_IOCTL         = 39,</div><div class='ctx'> 	FUSE_POLL          = 40,</div><div class='add'>+	FUSE_NOTIFY_REPLY  = 41,</div><div class='add'>+	FUSE_BATCH_FORGET  = 42,</div><div class='add'>+	FUSE_FALLOCATE     = 43,</div><div class='add'>+	FUSE_READDIRPLUS   = 44,</div><div class='add'>+	FUSE_RENAME2       = 45,</div><div class='add'>+	FUSE_LSEEK         = 46,</div><div class='ctx'> </div><div class='ctx'> 	/* CUSE specific operations */</div><div class='ctx'> 	CUSE_INIT          = 4096,</div><div class='hunk'>@@ -268,6 +371,9 @@ enum fuse_notify_code {</div><div class='ctx'> 	FUSE_NOTIFY_POLL   = 1,</div><div class='ctx'> 	FUSE_NOTIFY_INVAL_INODE = 2,</div><div class='ctx'> 	FUSE_NOTIFY_INVAL_ENTRY = 3,</div><div class='add'>+	FUSE_NOTIFY_STORE = 4,</div><div class='add'>+	FUSE_NOTIFY_RETRIEVE = 5,</div><div class='add'>+	FUSE_NOTIFY_DELETE = 6,</div><div class='ctx'> 	FUSE_NOTIFY_CODE_MAX,</div><div class='ctx'> };</div><div class='ctx'> </div><div class='hunk'>@@ -277,133 +383,149 @@ enum fuse_notify_code {</div><div class='ctx'> #define FUSE_COMPAT_ENTRY_OUT_SIZE 120</div><div class='ctx'> </div><div class='ctx'> struct fuse_entry_out {</div><div class='del'>-	__u64	nodeid;		/* Inode ID */</div><div class='del'>-	__u64	generation;	/* Inode generation: nodeid:gen must</div><div class='del'>-				   be unique for the fs's lifetime */</div><div class='del'>-	__u64	entry_valid;	/* Cache timeout for the name */</div><div class='del'>-	__u64	attr_valid;	/* Cache timeout for the attributes */</div><div class='del'>-	__u32	entry_valid_nsec;</div><div class='del'>-	__u32	attr_valid_nsec;</div><div class='add'>+	uint64_t	nodeid;		/* Inode ID */</div><div class='add'>+	uint64_t	generation;	/* Inode generation: nodeid:gen must</div><div class='add'>+					   be unique for the fs's lifetime */</div><div class='add'>+	uint64_t	entry_valid;	/* Cache timeout for the name */</div><div class='add'>+	uint64_t	attr_valid;	/* Cache timeout for the attributes */</div><div class='add'>+	uint32_t	entry_valid_nsec;</div><div class='add'>+	uint32_t	attr_valid_nsec;</div><div class='ctx'> 	struct fuse_attr attr;</div><div class='ctx'> };</div><div class='ctx'> </div><div class='ctx'> struct fuse_forget_in {</div><div class='del'>-	__u64	nlookup;</div><div class='add'>+	uint64_t	nlookup;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct fuse_forget_one {</div><div class='add'>+	uint64_t	nodeid;</div><div class='add'>+	uint64_t	nlookup;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct fuse_batch_forget_in {</div><div class='add'>+	uint32_t	count;</div><div class='add'>+	uint32_t	dummy;</div><div class='ctx'> };</div><div class='ctx'> </div><div class='ctx'> struct fuse_getattr_in {</div><div class='del'>-	__u32	getattr_flags;</div><div class='del'>-	__u32	dummy;</div><div class='del'>-	__u64	fh;</div><div class='add'>+	uint32_t	getattr_flags;</div><div class='add'>+	uint32_t	dummy;</div><div class='add'>+	uint64_t	fh;</div><div class='ctx'> };</div><div class='ctx'> </div><div class='ctx'> #define FUSE_COMPAT_ATTR_OUT_SIZE 96</div><div class='ctx'> </div><div class='ctx'> struct fuse_attr_out {</div><div class='del'>-	__u64	attr_valid;	/* Cache timeout for the attributes */</div><div class='del'>-	__u32	attr_valid_nsec;</div><div class='del'>-	__u32	dummy;</div><div class='add'>+	uint64_t	attr_valid;	/* Cache timeout for the attributes */</div><div class='add'>+	uint32_t	attr_valid_nsec;</div><div class='add'>+	uint32_t	dummy;</div><div class='ctx'> 	struct fuse_attr attr;</div><div class='ctx'> };</div><div class='ctx'> </div><div class='ctx'> #define FUSE_COMPAT_MKNOD_IN_SIZE 8</div><div class='ctx'> </div><div class='ctx'> struct fuse_mknod_in {</div><div class='del'>-	__u32	mode;</div><div class='del'>-	__u32	rdev;</div><div class='del'>-	__u32	umask;</div><div class='del'>-	__u32	padding;</div><div class='add'>+	uint32_t	mode;</div><div class='add'>+	uint32_t	rdev;</div><div class='add'>+	uint32_t	umask;</div><div class='add'>+	uint32_t	padding;</div><div class='ctx'> };</div><div class='ctx'> </div><div class='ctx'> struct fuse_mkdir_in {</div><div class='del'>-	__u32	mode;</div><div class='del'>-	__u32	umask;</div><div class='add'>+	uint32_t	mode;</div><div class='add'>+	uint32_t	umask;</div><div class='ctx'> };</div><div class='ctx'> </div><div class='ctx'> struct fuse_rename_in {</div><div class='del'>-	__u64	newdir;</div><div class='add'>+	uint64_t	newdir;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct fuse_rename2_in {</div><div class='add'>+	uint64_t	newdir;</div><div class='add'>+	uint32_t	flags;</div><div class='add'>+	uint32_t	padding;</div><div class='ctx'> };</div><div class='ctx'> </div><div class='ctx'> struct fuse_link_in {</div><div class='del'>-	__u64	oldnodeid;</div><div class='add'>+	uint64_t	oldnodeid;</div><div class='ctx'> };</div><div class='ctx'> </div><div class='ctx'> struct fuse_setattr_in {</div><div class='del'>-	__u32	valid;</div><div class='del'>-	__u32	padding;</div><div class='del'>-	__u64	fh;</div><div class='del'>-	__u64	size;</div><div class='del'>-	__u64	lock_owner;</div><div class='del'>-	__u64	atime;</div><div class='del'>-	__u64	mtime;</div><div class='del'>-	__u64	unused2;</div><div class='del'>-	__u32	atimensec;</div><div class='del'>-	__u32	mtimensec;</div><div class='del'>-	__u32	unused3;</div><div class='del'>-	__u32	mode;</div><div class='del'>-	__u32	unused4;</div><div class='del'>-	__u32	uid;</div><div class='del'>-	__u32	gid;</div><div class='del'>-	__u32	unused5;</div><div class='add'>+	uint32_t	valid;</div><div class='add'>+	uint32_t	padding;</div><div class='add'>+	uint64_t	fh;</div><div class='add'>+	uint64_t	size;</div><div class='add'>+	uint64_t	lock_owner;</div><div class='add'>+	uint64_t	atime;</div><div class='add'>+	uint64_t	mtime;</div><div class='add'>+	uint64_t	ctime;</div><div class='add'>+	uint32_t	atimensec;</div><div class='add'>+	uint32_t	mtimensec;</div><div class='add'>+	uint32_t	ctimensec;</div><div class='add'>+	uint32_t	mode;</div><div class='add'>+	uint32_t	unused4;</div><div class='add'>+	uint32_t	uid;</div><div class='add'>+	uint32_t	gid;</div><div class='add'>+	uint32_t	unused5;</div><div class='ctx'> };</div><div class='ctx'> </div><div class='ctx'> struct fuse_open_in {</div><div class='del'>-	__u32	flags;</div><div class='del'>-	__u32	unused;</div><div class='add'>+	uint32_t	flags;</div><div class='add'>+	uint32_t	unused;</div><div class='ctx'> };</div><div class='ctx'> </div><div class='ctx'> struct fuse_create_in {</div><div class='del'>-	__u32	flags;</div><div class='del'>-	__u32	mode;</div><div class='del'>-	__u32	umask;</div><div class='del'>-	__u32	padding;</div><div class='add'>+	uint32_t	flags;</div><div class='add'>+	uint32_t	mode;</div><div class='add'>+	uint32_t	umask;</div><div class='add'>+	uint32_t	padding;</div><div class='ctx'> };</div><div class='ctx'> </div><div class='ctx'> struct fuse_open_out {</div><div class='del'>-	__u64	fh;</div><div class='del'>-	__u32	open_flags;</div><div class='del'>-	__u32	padding;</div><div class='add'>+	uint64_t	fh;</div><div class='add'>+	uint32_t	open_flags;</div><div class='add'>+	uint32_t	padding;</div><div class='ctx'> };</div><div class='ctx'> </div><div class='ctx'> struct fuse_release_in {</div><div class='del'>-	__u64	fh;</div><div class='del'>-	__u32	flags;</div><div class='del'>-	__u32	release_flags;</div><div class='del'>-	__u64	lock_owner;</div><div class='add'>+	uint64_t	fh;</div><div class='add'>+	uint32_t	flags;</div><div class='add'>+	uint32_t	release_flags;</div><div class='add'>+	uint64_t	lock_owner;</div><div class='ctx'> };</div><div class='ctx'> </div><div class='ctx'> struct fuse_flush_in {</div><div class='del'>-	__u64	fh;</div><div class='del'>-	__u32	unused;</div><div class='del'>-	__u32	padding;</div><div class='del'>-	__u64	lock_owner;</div><div class='add'>+	uint64_t	fh;</div><div class='add'>+	uint32_t	unused;</div><div class='add'>+	uint32_t	padding;</div><div class='add'>+	uint64_t	lock_owner;</div><div class='ctx'> };</div><div class='ctx'> </div><div class='ctx'> struct fuse_read_in {</div><div class='del'>-	__u64	fh;</div><div class='del'>-	__u64	offset;</div><div class='del'>-	__u32	size;</div><div class='del'>-	__u32	read_flags;</div><div class='del'>-	__u64	lock_owner;</div><div class='del'>-	__u32	flags;</div><div class='del'>-	__u32	padding;</div><div class='add'>+	uint64_t	fh;</div><div class='add'>+	uint64_t	offset;</div><div class='add'>+	uint32_t	size;</div><div class='add'>+	uint32_t	read_flags;</div><div class='add'>+	uint64_t	lock_owner;</div><div class='add'>+	uint32_t	flags;</div><div class='add'>+	uint32_t	padding;</div><div class='ctx'> };</div><div class='ctx'> </div><div class='ctx'> #define FUSE_COMPAT_WRITE_IN_SIZE 24</div><div class='ctx'> </div><div class='ctx'> struct fuse_write_in {</div><div class='del'>-	__u64	fh;</div><div class='del'>-	__u64	offset;</div><div class='del'>-	__u32	size;</div><div class='del'>-	__u32	write_flags;</div><div class='del'>-	__u64	lock_owner;</div><div class='del'>-	__u32	flags;</div><div class='del'>-	__u32	padding;</div><div class='add'>+	uint64_t	fh;</div><div class='add'>+	uint64_t	offset;</div><div class='add'>+	uint32_t	size;</div><div class='add'>+	uint32_t	write_flags;</div><div class='add'>+	uint64_t	lock_owner;</div><div class='add'>+	uint32_t	flags;</div><div class='add'>+	uint32_t	padding;</div><div class='ctx'> };</div><div class='ctx'> </div><div class='ctx'> struct fuse_write_out {</div><div class='del'>-	__u32	size;</div><div class='del'>-	__u32	padding;</div><div class='add'>+	uint32_t	size;</div><div class='add'>+	uint32_t	padding;</div><div class='ctx'> };</div><div class='ctx'> </div><div class='ctx'> #define FUSE_COMPAT_STATFS_SIZE 48</div><div class='hunk'>@@ -413,32 +535,32 @@ struct fuse_statfs_out {</div><div class='ctx'> };</div><div class='ctx'> </div><div class='ctx'> struct fuse_fsync_in {</div><div class='del'>-	__u64	fh;</div><div class='del'>-	__u32	fsync_flags;</div><div class='del'>-	__u32	padding;</div><div class='add'>+	uint64_t	fh;</div><div class='add'>+	uint32_t	fsync_flags;</div><div class='add'>+	uint32_t	padding;</div><div class='ctx'> };</div><div class='ctx'> </div><div class='ctx'> struct fuse_setxattr_in {</div><div class='del'>-	__u32	size;</div><div class='del'>-	__u32	flags;</div><div class='add'>+	uint32_t	size;</div><div class='add'>+	uint32_t	flags;</div><div class='ctx'> };</div><div class='ctx'> </div><div class='ctx'> struct fuse_getxattr_in {</div><div class='del'>-	__u32	size;</div><div class='del'>-	__u32	padding;</div><div class='add'>+	uint32_t	size;</div><div class='add'>+	uint32_t	padding;</div><div class='ctx'> };</div><div class='ctx'> </div><div class='ctx'> struct fuse_getxattr_out {</div><div class='del'>-	__u32	size;</div><div class='del'>-	__u32	padding;</div><div class='add'>+	uint32_t	size;</div><div class='add'>+	uint32_t	padding;</div><div class='ctx'> };</div><div class='ctx'> </div><div class='ctx'> struct fuse_lk_in {</div><div class='del'>-	__u64	fh;</div><div class='del'>-	__u64	owner;</div><div class='add'>+	uint64_t	fh;</div><div class='add'>+	uint64_t	owner;</div><div class='ctx'> 	struct fuse_file_lock lk;</div><div class='del'>-	__u32	lk_flags;</div><div class='del'>-	__u32	padding;</div><div class='add'>+	uint32_t	lk_flags;</div><div class='add'>+	uint32_t	padding;</div><div class='ctx'> };</div><div class='ctx'> </div><div class='ctx'> struct fuse_lk_out {</div><div class='hunk'>@@ -446,134 +568,206 @@ struct fuse_lk_out {</div><div class='ctx'> };</div><div class='ctx'> </div><div class='ctx'> struct fuse_access_in {</div><div class='del'>-	__u32	mask;</div><div class='del'>-	__u32	padding;</div><div class='add'>+	uint32_t	mask;</div><div class='add'>+	uint32_t	padding;</div><div class='ctx'> };</div><div class='ctx'> </div><div class='ctx'> struct fuse_init_in {</div><div class='del'>-	__u32	major;</div><div class='del'>-	__u32	minor;</div><div class='del'>-	__u32	max_readahead;</div><div class='del'>-	__u32	flags;</div><div class='add'>+	uint32_t	major;</div><div class='add'>+	uint32_t	minor;</div><div class='add'>+	uint32_t	max_readahead;</div><div class='add'>+	uint32_t	flags;</div><div class='ctx'> };</div><div class='ctx'> </div><div class='add'>+#define FUSE_COMPAT_INIT_OUT_SIZE 8</div><div class='add'>+#define FUSE_COMPAT_22_INIT_OUT_SIZE 24</div><div class='add'>+</div><div class='ctx'> struct fuse_init_out {</div><div class='del'>-	__u32	major;</div><div class='del'>-	__u32	minor;</div><div class='del'>-	__u32	max_readahead;</div><div class='del'>-	__u32	flags;</div><div class='del'>-	__u16   max_background;</div><div class='del'>-	__u16   congestion_threshold;</div><div class='del'>-	__u32	max_write;</div><div class='add'>+	uint32_t	major;</div><div class='add'>+	uint32_t	minor;</div><div class='add'>+	uint32_t	max_readahead;</div><div class='add'>+	uint32_t	flags;</div><div class='add'>+	uint16_t	max_background;</div><div class='add'>+	uint16_t	congestion_threshold;</div><div class='add'>+	uint32_t	max_write;</div><div class='add'>+	uint32_t	time_gran;</div><div class='add'>+	uint32_t	unused[9];</div><div class='ctx'> };</div><div class='ctx'> </div><div class='ctx'> #define CUSE_INIT_INFO_MAX 4096</div><div class='ctx'> </div><div class='ctx'> struct cuse_init_in {</div><div class='del'>-	__u32	major;</div><div class='del'>-	__u32	minor;</div><div class='del'>-	__u32	unused;</div><div class='del'>-	__u32	flags;</div><div class='add'>+	uint32_t	major;</div><div class='add'>+	uint32_t	minor;</div><div class='add'>+	uint32_t	unused;</div><div class='add'>+	uint32_t	flags;</div><div class='ctx'> };</div><div class='ctx'> </div><div class='ctx'> struct cuse_init_out {</div><div class='del'>-	__u32	major;</div><div class='del'>-	__u32	minor;</div><div class='del'>-	__u32	unused;</div><div class='del'>-	__u32	flags;</div><div class='del'>-	__u32	max_read;</div><div class='del'>-	__u32	max_write;</div><div class='del'>-	__u32	dev_major;		/* chardev major */</div><div class='del'>-	__u32	dev_minor;		/* chardev minor */</div><div class='del'>-	__u32	spare[10];</div><div class='add'>+	uint32_t	major;</div><div class='add'>+	uint32_t	minor;</div><div class='add'>+	uint32_t	unused;</div><div class='add'>+	uint32_t	flags;</div><div class='add'>+	uint32_t	max_read;</div><div class='add'>+	uint32_t	max_write;</div><div class='add'>+	uint32_t	dev_major;		/* chardev major */</div><div class='add'>+	uint32_t	dev_minor;		/* chardev minor */</div><div class='add'>+	uint32_t	spare[10];</div><div class='ctx'> };</div><div class='ctx'> </div><div class='ctx'> struct fuse_interrupt_in {</div><div class='del'>-	__u64	unique;</div><div class='add'>+	uint64_t	unique;</div><div class='ctx'> };</div><div class='ctx'> </div><div class='ctx'> struct fuse_bmap_in {</div><div class='del'>-	__u64	block;</div><div class='del'>-	__u32	blocksize;</div><div class='del'>-	__u32	padding;</div><div class='add'>+	uint64_t	block;</div><div class='add'>+	uint32_t	blocksize;</div><div class='add'>+	uint32_t	padding;</div><div class='ctx'> };</div><div class='ctx'> </div><div class='ctx'> struct fuse_bmap_out {</div><div class='del'>-	__u64	block;</div><div class='add'>+	uint64_t	block;</div><div class='ctx'> };</div><div class='ctx'> </div><div class='ctx'> struct fuse_ioctl_in {</div><div class='del'>-	__u64	fh;</div><div class='del'>-	__u32	flags;</div><div class='del'>-	__u32	cmd;</div><div class='del'>-	__u64	arg;</div><div class='del'>-	__u32	in_size;</div><div class='del'>-	__u32	out_size;</div><div class='add'>+	uint64_t	fh;</div><div class='add'>+	uint32_t	flags;</div><div class='add'>+	uint32_t	cmd;</div><div class='add'>+	uint64_t	arg;</div><div class='add'>+	uint32_t	in_size;</div><div class='add'>+	uint32_t	out_size;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct fuse_ioctl_iovec {</div><div class='add'>+	uint64_t	base;</div><div class='add'>+	uint64_t	len;</div><div class='ctx'> };</div><div class='ctx'> </div><div class='ctx'> struct fuse_ioctl_out {</div><div class='del'>-	__s32	result;</div><div class='del'>-	__u32	flags;</div><div class='del'>-	__u32	in_iovs;</div><div class='del'>-	__u32	out_iovs;</div><div class='add'>+	int32_t		result;</div><div class='add'>+	uint32_t	flags;</div><div class='add'>+	uint32_t	in_iovs;</div><div class='add'>+	uint32_t	out_iovs;</div><div class='ctx'> };</div><div class='ctx'> </div><div class='ctx'> struct fuse_poll_in {</div><div class='del'>-	__u64	fh;</div><div class='del'>-	__u64	kh;</div><div class='del'>-	__u32	flags;</div><div class='del'>-	__u32   padding;</div><div class='add'>+	uint64_t	fh;</div><div class='add'>+	uint64_t	kh;</div><div class='add'>+	uint32_t	flags;</div><div class='add'>+	uint32_t	events;</div><div class='ctx'> };</div><div class='ctx'> </div><div class='ctx'> struct fuse_poll_out {</div><div class='del'>-	__u32	revents;</div><div class='del'>-	__u32	padding;</div><div class='add'>+	uint32_t	revents;</div><div class='add'>+	uint32_t	padding;</div><div class='ctx'> };</div><div class='ctx'> </div><div class='ctx'> struct fuse_notify_poll_wakeup_out {</div><div class='del'>-	__u64	kh;</div><div class='add'>+	uint64_t	kh;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct fuse_fallocate_in {</div><div class='add'>+	uint64_t	fh;</div><div class='add'>+	uint64_t	offset;</div><div class='add'>+	uint64_t	length;</div><div class='add'>+	uint32_t	mode;</div><div class='add'>+	uint32_t	padding;</div><div class='ctx'> };</div><div class='ctx'> </div><div class='ctx'> struct fuse_in_header {</div><div class='del'>-	__u32	len;</div><div class='del'>-	__u32	opcode;</div><div class='del'>-	__u64	unique;</div><div class='del'>-	__u64	nodeid;</div><div class='del'>-	__u32	uid;</div><div class='del'>-	__u32	gid;</div><div class='del'>-	__u32	pid;</div><div class='del'>-	__u32	padding;</div><div class='add'>+	uint32_t	len;</div><div class='add'>+	uint32_t	opcode;</div><div class='add'>+	uint64_t	unique;</div><div class='add'>+	uint64_t	nodeid;</div><div class='add'>+	uint32_t	uid;</div><div class='add'>+	uint32_t	gid;</div><div class='add'>+	uint32_t	pid;</div><div class='add'>+	uint32_t	padding;</div><div class='ctx'> };</div><div class='ctx'> </div><div class='ctx'> struct fuse_out_header {</div><div class='del'>-	__u32	len;</div><div class='del'>-	__s32	error;</div><div class='del'>-	__u64	unique;</div><div class='add'>+	uint32_t	len;</div><div class='add'>+	int32_t		error;</div><div class='add'>+	uint64_t	unique;</div><div class='ctx'> };</div><div class='ctx'> </div><div class='ctx'> struct fuse_dirent {</div><div class='del'>-	__u64	ino;</div><div class='del'>-	__u64	off;</div><div class='del'>-	__u32	namelen;</div><div class='del'>-	__u32	type;</div><div class='del'>-	char name[0];</div><div class='add'>+	uint64_t	ino;</div><div class='add'>+	uint64_t	off;</div><div class='add'>+	uint32_t	namelen;</div><div class='add'>+	uint32_t	type;</div><div class='add'>+	char name[];</div><div class='ctx'> };</div><div class='ctx'> </div><div class='ctx'> #define FUSE_NAME_OFFSET offsetof(struct fuse_dirent, name)</div><div class='del'>-#define FUSE_DIRENT_ALIGN(x) (((x) + sizeof(__u64) - 1) &amp; ~(sizeof(__u64) - 1))</div><div class='add'>+#define FUSE_DIRENT_ALIGN(x) \</div><div class='add'>+	(((x) + sizeof(uint64_t) - 1) &amp; ~(sizeof(uint64_t) - 1))</div><div class='ctx'> #define FUSE_DIRENT_SIZE(d) \</div><div class='ctx'> 	FUSE_DIRENT_ALIGN(FUSE_NAME_OFFSET + (d)-&gt;namelen)</div><div class='ctx'> </div><div class='add'>+struct fuse_direntplus {</div><div class='add'>+	struct fuse_entry_out entry_out;</div><div class='add'>+	struct fuse_dirent dirent;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+#define FUSE_NAME_OFFSET_DIRENTPLUS \</div><div class='add'>+	offsetof(struct fuse_direntplus, dirent.name)</div><div class='add'>+#define FUSE_DIRENTPLUS_SIZE(d) \</div><div class='add'>+	FUSE_DIRENT_ALIGN(FUSE_NAME_OFFSET_DIRENTPLUS + (d)-&gt;dirent.namelen)</div><div class='add'>+</div><div class='ctx'> struct fuse_notify_inval_inode_out {</div><div class='del'>-	__u64	ino;</div><div class='del'>-	__s64	off;</div><div class='del'>-	__s64	len;</div><div class='add'>+	uint64_t	ino;</div><div class='add'>+	int64_t		off;</div><div class='add'>+	int64_t		len;</div><div class='ctx'> };</div><div class='ctx'> </div><div class='ctx'> struct fuse_notify_inval_entry_out {</div><div class='del'>-	__u64	parent;</div><div class='del'>-	__u32	namelen;</div><div class='del'>-	__u32	padding;</div><div class='add'>+	uint64_t	parent;</div><div class='add'>+	uint32_t	namelen;</div><div class='add'>+	uint32_t	padding;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct fuse_notify_delete_out {</div><div class='add'>+	uint64_t	parent;</div><div class='add'>+	uint64_t	child;</div><div class='add'>+	uint32_t	namelen;</div><div class='add'>+	uint32_t	padding;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct fuse_notify_store_out {</div><div class='add'>+	uint64_t	nodeid;</div><div class='add'>+	uint64_t	offset;</div><div class='add'>+	uint32_t	size;</div><div class='add'>+	uint32_t	padding;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct fuse_notify_retrieve_out {</div><div class='add'>+	uint64_t	notify_unique;</div><div class='add'>+	uint64_t	nodeid;</div><div class='add'>+	uint64_t	offset;</div><div class='add'>+	uint32_t	size;</div><div class='add'>+	uint32_t	padding;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+/* Matches the size of fuse_write_in */</div><div class='add'>+struct fuse_notify_retrieve_in {</div><div class='add'>+	uint64_t	dummy1;</div><div class='add'>+	uint64_t	offset;</div><div class='add'>+	uint32_t	size;</div><div class='add'>+	uint32_t	dummy2;</div><div class='add'>+	uint64_t	dummy3;</div><div class='add'>+	uint64_t	dummy4;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct fuse_lseek_in {</div><div class='add'>+	uint64_t	fh;</div><div class='add'>+	uint64_t	offset;</div><div class='add'>+	int32_t		whence;</div><div class='add'>+	uint32_t	padding;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct fuse_lseek_out {</div><div class='add'>+	uint64_t	offset;</div><div class='ctx'> };</div><div class='ctx'> </div><div class='ctx'> #endif /* _LINUX_FUSE_H */</div><div class='head'>diff --git a/contrib/fuse-include/fuse_kernel_macfuse.h b/contrib/fuse-include/fuse_kernel_macfuse.h<br/>index 3fbf24f70aa..31bc495a552 100644<br/>--- a/<a href='/cgit/glusterfs.git/tree/contrib/fuse-include/fuse_kernel_macfuse.h?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>contrib/fuse-include/fuse_kernel_macfuse.h</a><br/>+++ b/<a href='/cgit/glusterfs.git/tree/contrib/fuse-include/fuse_kernel_macfuse.h?id=d1d7a6f35c816822fab51c820e25023863c239c1'>contrib/fuse-include/fuse_kernel_macfuse.h</a></div><div class='hunk'>@@ -61,67 +61,59 @@</div><div class='ctx'>    userspace works under 64bit kernels */</div><div class='ctx'> </div><div class='ctx'> struct fuse_attr {</div><div class='del'>-	__u64	ino;</div><div class='del'>-	__u64	size;</div><div class='del'>-	__u64	blocks;</div><div class='del'>-	__u64	atime;</div><div class='del'>-	__u64	mtime;</div><div class='del'>-	__u64	ctime;</div><div class='del'>-#if (__FreeBSD__ &gt;= 10)</div><div class='del'>-	__u64	crtime;</div><div class='del'>-#endif /* __FreeBSD__ &gt;= 10 */</div><div class='del'>-	__u32	atimensec;</div><div class='del'>-	__u32	mtimensec;</div><div class='del'>-	__u32	ctimensec;</div><div class='del'>-#if (__FreeBSD__ &gt;= 10)</div><div class='del'>-	__u32	crtimensec;</div><div class='del'>-#endif /* __FreeBSD__ &gt;= 10 */</div><div class='del'>-	__u32	mode;</div><div class='del'>-	__u32	nlink;</div><div class='del'>-	__u32	uid;</div><div class='del'>-	__u32	gid;</div><div class='del'>-	__u32	rdev;</div><div class='del'>-#if (__FreeBSD__ &gt;= 10)</div><div class='del'>-	__u32	flags; /* file flags; see chflags(2) */</div><div class='del'>-#endif /* __FreeBSD__ &gt;= 10 */</div><div class='add'>+        __u64  ino;</div><div class='add'>+        __u64  size;</div><div class='add'>+        __u64  blocks;</div><div class='add'>+        __u64  atime;</div><div class='add'>+        __u64  mtime;</div><div class='add'>+        __u64  ctime;</div><div class='add'>+        __u64  crtime;</div><div class='add'>+        __u32  atimensec;</div><div class='add'>+        __u32  mtimensec;</div><div class='add'>+        __u32  ctimensec;</div><div class='add'>+        __u32  crtimensec;</div><div class='add'>+        __u32  mode;</div><div class='add'>+        __u32  nlink;</div><div class='add'>+        __u32  uid;</div><div class='add'>+        __u32  gid;</div><div class='add'>+        __u32  rdev;</div><div class='add'>+        __u32  flags; /* file flags; see chflags(2) */</div><div class='ctx'> };</div><div class='ctx'> </div><div class='ctx'> struct fuse_kstatfs {</div><div class='del'>-	__u64	blocks;</div><div class='del'>-	__u64	bfree;</div><div class='del'>-	__u64	bavail;</div><div class='del'>-	__u64	files;</div><div class='del'>-	__u64	ffree;</div><div class='del'>-	__u32	bsize;</div><div class='del'>-	__u32	namelen;</div><div class='del'>-	__u32	frsize;</div><div class='del'>-	__u32	padding;</div><div class='del'>-	__u32	spare[6];</div><div class='add'>+        __u64   blocks;</div><div class='add'>+        __u64   bfree;</div><div class='add'>+        __u64   bavail;</div><div class='add'>+        __u64   files;</div><div class='add'>+        __u64   ffree;</div><div class='add'>+        __u32   bsize;</div><div class='add'>+        __u32   namelen;</div><div class='add'>+        __u32   frsize;</div><div class='add'>+        __u32   padding;</div><div class='add'>+        __u32   spare[6];</div><div class='ctx'> };</div><div class='ctx'> </div><div class='ctx'> struct fuse_file_lock {</div><div class='del'>-	__u64	start;</div><div class='del'>-	__u64	end;</div><div class='del'>-	__u32	type;</div><div class='del'>-	__u32	pid; /* tgid */</div><div class='add'>+        __u64   start;</div><div class='add'>+        __u64   end;</div><div class='add'>+        __u32   type;</div><div class='add'>+        __u32   pid; /* tgid */</div><div class='ctx'> };</div><div class='ctx'> </div><div class='ctx'> /**</div><div class='ctx'>  * Bitmasks for fuse_setattr_in.valid</div><div class='ctx'>  */</div><div class='del'>-#define FATTR_MODE	(1 &lt;&lt; 0)</div><div class='del'>-#define FATTR_UID	(1 &lt;&lt; 1)</div><div class='del'>-#define FATTR_GID	(1 &lt;&lt; 2)</div><div class='del'>-#define FATTR_SIZE	(1 &lt;&lt; 3)</div><div class='del'>-#define FATTR_ATIME	(1 &lt;&lt; 4)</div><div class='del'>-#define FATTR_MTIME	(1 &lt;&lt; 5)</div><div class='del'>-#define FATTR_FH	(1 &lt;&lt; 6)</div><div class='del'>-#if (__FreeBSD__ &gt;= 10)</div><div class='del'>-#define FATTR_CRTIME	(1 &lt;&lt; 28)</div><div class='del'>-#define FATTR_CHGTIME	(1 &lt;&lt; 29)</div><div class='del'>-#define FATTR_BKUPTIME	(1 &lt;&lt; 30)</div><div class='del'>-#define FATTR_FLAGS	(1 &lt;&lt; 31)</div><div class='del'>-#endif /* __FreeBSD__ &gt;= 10 */</div><div class='add'>+#define FATTR_MODE      (1 &lt;&lt; 0)</div><div class='add'>+#define FATTR_UID       (1 &lt;&lt; 1)</div><div class='add'>+#define FATTR_GID       (1 &lt;&lt; 2)</div><div class='add'>+#define FATTR_SIZE      (1 &lt;&lt; 3)</div><div class='add'>+#define FATTR_ATIME     (1 &lt;&lt; 4)</div><div class='add'>+#define FATTR_MTIME     (1 &lt;&lt; 5)</div><div class='add'>+#define FATTR_FH        (1 &lt;&lt; 6)</div><div class='add'>+#define FATTR_CRTIME    (1 &lt;&lt; 28)</div><div class='add'>+#define FATTR_CHGTIME   (1 &lt;&lt; 29)</div><div class='add'>+#define FATTR_BKUPTIME  (1 &lt;&lt; 30)</div><div class='add'>+#define FATTR_FLAGS     (1 &lt;&lt; 31)</div><div class='ctx'> </div><div class='ctx'> /**</div><div class='ctx'>  * Flags returned by the OPEN request</div><div class='hunk'>@@ -129,311 +121,304 @@ struct fuse_file_lock {</div><div class='ctx'>  * FOPEN_DIRECT_IO: bypass page cache for this open file</div><div class='ctx'>  * FOPEN_KEEP_CACHE: don't invalidate the data cache on open</div><div class='ctx'>  */</div><div class='del'>-#define FOPEN_DIRECT_IO		(1 &lt;&lt; 0)</div><div class='del'>-#define FOPEN_KEEP_CACHE	(1 &lt;&lt; 1)</div><div class='del'>-#if (__FreeBSD__ &gt;= 10)</div><div class='del'>-#define FOPEN_PURGE_ATTR	(1 &lt;&lt; 30)</div><div class='del'>-#define FOPEN_PURGE_UBC		(1 &lt;&lt; 31)</div><div class='del'>-#endif</div><div class='add'>+#define FOPEN_DIRECT_IO         (1 &lt;&lt; 0)</div><div class='add'>+#define FOPEN_KEEP_CACHE        (1 &lt;&lt; 1)</div><div class='add'>+#define FOPEN_PURGE_ATTR        (1 &lt;&lt; 30)</div><div class='add'>+#define FOPEN_PURGE_UBC         (1 &lt;&lt; 31)</div><div class='ctx'> </div><div class='ctx'> /**</div><div class='ctx'>  * INIT request/reply flags</div><div class='ctx'>  */</div><div class='del'>-#define FUSE_ASYNC_READ		(1 &lt;&lt; 0)</div><div class='del'>-#define FUSE_POSIX_LOCKS	(1 &lt;&lt; 1)</div><div class='del'>-#if (__FreeBSD__ &gt;= 10)</div><div class='del'>-#define FUSE_CASE_INSENSITIVE	(1 &lt;&lt; 29)</div><div class='del'>-#define FUSE_VOL_RENAME		(1 &lt;&lt; 30)</div><div class='del'>-#define FUSE_XTIMES		(1 &lt;&lt; 31)</div><div class='del'>-#endif /* __FreeBSD__ &gt;= 10 */</div><div class='add'>+#define FUSE_ASYNC_READ         (1 &lt;&lt; 0)</div><div class='add'>+#define FUSE_POSIX_LOCKS        (1 &lt;&lt; 1)</div><div class='add'>+#define FUSE_CASE_INSENSITIVE   (1 &lt;&lt; 29)</div><div class='add'>+#define FUSE_VOL_RENAME         (1 &lt;&lt; 30)</div><div class='add'>+#define FUSE_XTIMES             (1 &lt;&lt; 31)</div><div class='ctx'> </div><div class='ctx'> /**</div><div class='ctx'>  * Release flags</div><div class='ctx'>  */</div><div class='del'>-#define FUSE_RELEASE_FLUSH	(1 &lt;&lt; 0)</div><div class='add'>+#define FUSE_RELEASE_FLUSH      (1 &lt;&lt; 0)</div><div class='ctx'> </div><div class='ctx'> enum fuse_opcode {</div><div class='del'>-	FUSE_LOOKUP	   = 1,</div><div class='del'>-	FUSE_FORGET	   = 2,  /* no reply */</div><div class='del'>-	FUSE_GETATTR	   = 3,</div><div class='del'>-	FUSE_SETATTR	   = 4,</div><div class='del'>-	FUSE_READLINK	   = 5,</div><div class='del'>-	FUSE_SYMLINK	   = 6,</div><div class='del'>-	FUSE_MKNOD	   = 8,</div><div class='del'>-	FUSE_MKDIR	   = 9,</div><div class='del'>-	FUSE_UNLINK	   = 10,</div><div class='del'>-	FUSE_RMDIR	   = 11,</div><div class='del'>-	FUSE_RENAME	   = 12,</div><div class='del'>-	FUSE_LINK	   = 13,</div><div class='del'>-	FUSE_OPEN	   = 14,</div><div class='del'>-	FUSE_READ	   = 15,</div><div class='del'>-	FUSE_WRITE	   = 16,</div><div class='del'>-	FUSE_STATFS	   = 17,</div><div class='del'>-	FUSE_RELEASE       = 18,</div><div class='del'>-	FUSE_FSYNC         = 20,</div><div class='del'>-	FUSE_SETXATTR      = 21,</div><div class='del'>-	FUSE_GETXATTR      = 22,</div><div class='del'>-	FUSE_LISTXATTR     = 23,</div><div class='del'>-	FUSE_REMOVEXATTR   = 24,</div><div class='del'>-	FUSE_FLUSH         = 25,</div><div class='del'>-	FUSE_INIT          = 26,</div><div class='del'>-	FUSE_OPENDIR       = 27,</div><div class='del'>-	FUSE_READDIR       = 28,</div><div class='del'>-	FUSE_RELEASEDIR    = 29,</div><div class='del'>-	FUSE_FSYNCDIR      = 30,</div><div class='del'>-	FUSE_GETLK         = 31,</div><div class='del'>-	FUSE_SETLK         = 32,</div><div class='del'>-	FUSE_SETLKW        = 33,</div><div class='del'>-	FUSE_ACCESS        = 34,</div><div class='del'>-	FUSE_CREATE        = 35,</div><div class='del'>-	FUSE_INTERRUPT     = 36,</div><div class='del'>-	FUSE_BMAP          = 37,</div><div class='del'>-	FUSE_DESTROY       = 38,</div><div class='del'>-#if (__FreeBSD__ &gt;= 10)</div><div class='add'>+        FUSE_LOOKUP        = 1,</div><div class='add'>+        FUSE_FORGET        = 2,  /* no reply */</div><div class='add'>+        FUSE_GETATTR       = 3,</div><div class='add'>+        FUSE_SETATTR       = 4,</div><div class='add'>+        FUSE_READLINK      = 5,</div><div class='add'>+        FUSE_SYMLINK       = 6,</div><div class='add'>+        FUSE_MKNOD         = 8,</div><div class='add'>+        FUSE_MKDIR         = 9,</div><div class='add'>+        FUSE_UNLINK        = 10,</div><div class='add'>+        FUSE_RMDIR         = 11,</div><div class='add'>+        FUSE_RENAME        = 12,</div><div class='add'>+        FUSE_LINK          = 13,</div><div class='add'>+        FUSE_OPEN          = 14,</div><div class='add'>+        FUSE_READ          = 15,</div><div class='add'>+        FUSE_WRITE         = 16,</div><div class='add'>+        FUSE_STATFS        = 17,</div><div class='add'>+        FUSE_RELEASE       = 18,</div><div class='add'>+        FUSE_FSYNC         = 20,</div><div class='add'>+        FUSE_SETXATTR      = 21,</div><div class='add'>+        FUSE_GETXATTR      = 22,</div><div class='add'>+        FUSE_LISTXATTR     = 23,</div><div class='add'>+        FUSE_REMOVEXATTR   = 24,</div><div class='add'>+        FUSE_FLUSH         = 25,</div><div class='add'>+        FUSE_INIT          = 26,</div><div class='add'>+        FUSE_OPENDIR       = 27,</div><div class='add'>+        FUSE_READDIR       = 28,</div><div class='add'>+        FUSE_RELEASEDIR    = 29,</div><div class='add'>+        FUSE_FSYNCDIR      = 30,</div><div class='add'>+        FUSE_GETLK         = 31,</div><div class='add'>+        FUSE_SETLK         = 32,</div><div class='add'>+        FUSE_SETLKW        = 33,</div><div class='add'>+        FUSE_ACCESS        = 34,</div><div class='add'>+        FUSE_CREATE        = 35,</div><div class='add'>+        FUSE_INTERRUPT     = 36,</div><div class='add'>+        FUSE_BMAP          = 37,</div><div class='add'>+        FUSE_DESTROY       = 38,</div><div class='add'>+        /*</div><div class='add'>+        FUSE_IOCTL         = 39,</div><div class='add'>+        FUSE_POLL          = 40,</div><div class='add'>+        FUSE_NOTIFY_REPLY  = 41,</div><div class='add'>+        FUSE_BATCH_FORGET  = 42,</div><div class='add'>+        FUSE_FALLOCATE     = 43,</div><div class='add'>+        FUSE_READDIRPLUS   = 44,</div><div class='add'>+        */</div><div class='add'>+</div><div class='ctx'>         FUSE_SETVOLNAME    = 61,</div><div class='del'>-	FUSE_GETXTIMES     = 62,</div><div class='del'>-	FUSE_EXCHANGE      = 63,</div><div class='del'>-#endif /* __FreeBSD__ &gt;= 10 */</div><div class='add'>+        FUSE_GETXTIMES     = 62,</div><div class='add'>+        FUSE_EXCHANGE      = 63,</div><div class='ctx'> };</div><div class='ctx'> </div><div class='ctx'> /* The read buffer is required to be at least 8k, but may be much larger */</div><div class='ctx'> #define FUSE_MIN_READ_BUFFER 8192</div><div class='ctx'> </div><div class='ctx'> struct fuse_entry_out {</div><div class='del'>-	__u64	nodeid;		/* Inode ID */</div><div class='del'>-	__u64	generation;	/* Inode generation: nodeid:gen must</div><div class='del'>-				   be unique for the fs's lifetime */</div><div class='del'>-	__u64	entry_valid;	/* Cache timeout for the name */</div><div class='del'>-	__u64	attr_valid;	/* Cache timeout for the attributes */</div><div class='del'>-	__u32	entry_valid_nsec;</div><div class='del'>-	__u32	attr_valid_nsec;</div><div class='del'>-	struct fuse_attr attr;</div><div class='add'>+        __u64   nodeid;         /* Inode ID */</div><div class='add'>+        __u64   generation;     /* Inode generation: nodeid:gen must</div><div class='add'>+                                   be unique for the fs's lifetime */</div><div class='add'>+        __u64   entry_valid;    /* Cache timeout for the name */</div><div class='add'>+        __u64   attr_valid;     /* Cache timeout for the attributes */</div><div class='add'>+        __u32   entry_valid_nsec;</div><div class='add'>+        __u32   attr_valid_nsec;</div><div class='add'>+        struct fuse_attr attr;</div><div class='ctx'> };</div><div class='ctx'> </div><div class='ctx'> struct fuse_forget_in {</div><div class='del'>-	__u64	nlookup;</div><div class='add'>+        __u64   nlookup;</div><div class='ctx'> };</div><div class='ctx'> </div><div class='ctx'> struct fuse_attr_out {</div><div class='del'>-	__u64	attr_valid;	/* Cache timeout for the attributes */</div><div class='del'>-	__u32	attr_valid_nsec;</div><div class='del'>-	__u32	dummy;</div><div class='del'>-	struct fuse_attr attr;</div><div class='add'>+        __u64   attr_valid;     /* Cache timeout for the attributes */</div><div class='add'>+        __u32   attr_valid_nsec;</div><div class='add'>+        __u32   dummy;</div><div class='add'>+        struct fuse_attr attr;</div><div class='ctx'> };</div><div class='ctx'> </div><div class='del'>-#if (__FreeBSD__ &gt;= 10)</div><div class='ctx'> struct fuse_getxtimes_out {</div><div class='del'>-	__u64	bkuptime;</div><div class='del'>-	__u64	crtime;</div><div class='del'>-	__u32	bkuptimensec;</div><div class='del'>-	__u32	crtimensec;</div><div class='add'>+        __u64   bkuptime;</div><div class='add'>+        __u64   crtime;</div><div class='add'>+        __u32   bkuptimensec;</div><div class='add'>+        __u32   crtimensec;</div><div class='ctx'> };</div><div class='del'>-#endif /* __FreeBSD__ &gt;= 10 */</div><div class='ctx'> </div><div class='ctx'> struct fuse_mknod_in {</div><div class='del'>-	__u32	mode;</div><div class='del'>-	__u32	rdev;</div><div class='add'>+        __u32   mode;</div><div class='add'>+        __u32   rdev;</div><div class='ctx'> };</div><div class='ctx'> </div><div class='ctx'> struct fuse_mkdir_in {</div><div class='del'>-	__u32	mode;</div><div class='del'>-	__u32	padding;</div><div class='add'>+        __u32   mode;</div><div class='add'>+        __u32   padding;</div><div class='ctx'> };</div><div class='ctx'> </div><div class='ctx'> struct fuse_rename_in {</div><div class='del'>-	__u64	newdir;</div><div class='add'>+        __u64   newdir;</div><div class='ctx'> };</div><div class='ctx'> </div><div class='del'>-#if (__FreeBSD__ &gt;= 10)</div><div class='ctx'> struct fuse_exchange_in {</div><div class='del'>-	__u64	olddir;</div><div class='del'>-	__u64	newdir;</div><div class='del'>-	__u64	options;</div><div class='add'>+        __u64   olddir;</div><div class='add'>+        __u64   newdir;</div><div class='add'>+        __u64   options;</div><div class='ctx'> };</div><div class='del'>-#endif /* __FreeBSD__ &gt;= 10 */</div><div class='ctx'> </div><div class='ctx'> struct fuse_link_in {</div><div class='del'>-	__u64	oldnodeid;</div><div class='add'>+        __u64   oldnodeid;</div><div class='ctx'> };</div><div class='ctx'> </div><div class='ctx'> struct fuse_setattr_in {</div><div class='del'>-	__u32	valid;</div><div class='del'>-	__u32	padding;</div><div class='del'>-	__u64	fh;</div><div class='del'>-	__u64	size;</div><div class='del'>-	__u64	unused1;</div><div class='del'>-	__u64	atime;</div><div class='del'>-	__u64	mtime;</div><div class='del'>-	__u64	unused2;</div><div class='del'>-	__u32	atimensec;</div><div class='del'>-	__u32	mtimensec;</div><div class='del'>-	__u32	unused3;</div><div class='del'>-	__u32	mode;</div><div class='del'>-	__u32	unused4;</div><div class='del'>-	__u32	uid;</div><div class='del'>-	__u32	gid;</div><div class='del'>-	__u32	unused5;</div><div class='del'>-#if (__FreeBSD__ &gt;= 10)</div><div class='del'>-	__u64	bkuptime;</div><div class='del'>-	__u64	chgtime;</div><div class='del'>-	__u64	crtime;</div><div class='del'>-	__u32	bkuptimensec;</div><div class='del'>-	__u32	chgtimensec;</div><div class='del'>-	__u32	crtimensec;</div><div class='del'>-	__u32	flags; /* file flags; see chflags(2) */</div><div class='del'>-#endif /* __FreeBSD__ &gt;= 10 */</div><div class='add'>+        __u32   valid;</div><div class='add'>+        __u32   padding;</div><div class='add'>+        __u64   fh;</div><div class='add'>+        __u64   size;</div><div class='add'>+        __u64   unused1;</div><div class='add'>+        __u64   atime;</div><div class='add'>+        __u64   mtime;</div><div class='add'>+        __u64   unused2;</div><div class='add'>+        __u32   atimensec;</div><div class='add'>+        __u32   mtimensec;</div><div class='add'>+        __u32   unused3;</div><div class='add'>+        __u32   mode;</div><div class='add'>+        __u32   unused4;</div><div class='add'>+        __u32   uid;</div><div class='add'>+        __u32   gid;</div><div class='add'>+        __u32   unused5;</div><div class='add'>+        __u64   bkuptime;</div><div class='add'>+        __u64   chgtime;</div><div class='add'>+        __u64   crtime;</div><div class='add'>+        __u32   bkuptimensec;</div><div class='add'>+        __u32   chgtimensec;</div><div class='add'>+        __u32   crtimensec;</div><div class='add'>+        __u32   flags; /* file flags; see chflags(2) */</div><div class='ctx'> };</div><div class='ctx'> </div><div class='ctx'> struct fuse_open_in {</div><div class='del'>-	__u32	flags;</div><div class='del'>-	__u32	mode;</div><div class='add'>+        __u32   flags;</div><div class='add'>+        __u32   mode;</div><div class='ctx'> };</div><div class='ctx'> </div><div class='ctx'> struct fuse_open_out {</div><div class='del'>-	__u64	fh;</div><div class='del'>-	__u32	open_flags;</div><div class='del'>-	__u32	padding;</div><div class='add'>+        __u64   fh;</div><div class='add'>+        __u32   open_flags;</div><div class='add'>+        __u32   padding;</div><div class='ctx'> };</div><div class='ctx'> </div><div class='ctx'> struct fuse_release_in {</div><div class='del'>-	__u64	fh;</div><div class='del'>-	__u32	flags;</div><div class='del'>-	__u32	release_flags;</div><div class='del'>-	__u64	lock_owner;</div><div class='add'>+        __u64   fh;</div><div class='add'>+        __u32   flags;</div><div class='add'>+        __u32   release_flags;</div><div class='add'>+        __u64   lock_owner;</div><div class='ctx'> };</div><div class='ctx'> </div><div class='ctx'> struct fuse_flush_in {</div><div class='del'>-	__u64	fh;</div><div class='del'>-	__u32	unused;</div><div class='del'>-	__u32	padding;</div><div class='del'>-	__u64	lock_owner;</div><div class='add'>+        __u64   fh;</div><div class='add'>+        __u32   unused;</div><div class='add'>+        __u32   padding;</div><div class='add'>+        __u64   lock_owner;</div><div class='ctx'> };</div><div class='ctx'> </div><div class='ctx'> struct fuse_read_in {</div><div class='del'>-	__u64	fh;</div><div class='del'>-	__u64	offset;</div><div class='del'>-	__u32	size;</div><div class='del'>-	__u32	padding;</div><div class='add'>+        __u64   fh;</div><div class='add'>+        __u64   offset;</div><div class='add'>+        __u32   size;</div><div class='add'>+        __u32   padding;</div><div class='ctx'> };</div><div class='ctx'> </div><div class='ctx'> struct fuse_write_in {</div><div class='del'>-	__u64	fh;</div><div class='del'>-	__u64	offset;</div><div class='del'>-	__u32	size;</div><div class='del'>-	__u32	write_flags;</div><div class='add'>+        __u64   fh;</div><div class='add'>+        __u64   offset;</div><div class='add'>+        __u32   size;</div><div class='add'>+        __u32   write_flags;</div><div class='ctx'> };</div><div class='ctx'> </div><div class='ctx'> struct fuse_write_out {</div><div class='del'>-	__u32	size;</div><div class='del'>-	__u32	padding;</div><div class='add'>+        __u32   size;</div><div class='add'>+        __u32   padding;</div><div class='ctx'> };</div><div class='ctx'> </div><div class='ctx'> #define FUSE_COMPAT_STATFS_SIZE 48</div><div class='ctx'> </div><div class='ctx'> struct fuse_statfs_out {</div><div class='del'>-	struct fuse_kstatfs st;</div><div class='add'>+        struct fuse_kstatfs st;</div><div class='ctx'> };</div><div class='ctx'> </div><div class='ctx'> struct fuse_fsync_in {</div><div class='del'>-	__u64	fh;</div><div class='del'>-	__u32	fsync_flags;</div><div class='del'>-	__u32	padding;</div><div class='add'>+        __u64   fh;</div><div class='add'>+        __u32   fsync_flags;</div><div class='add'>+        __u32   padding;</div><div class='ctx'> };</div><div class='ctx'> </div><div class='ctx'> struct fuse_setxattr_in {</div><div class='del'>-	__u32	size;</div><div class='del'>-	__u32	flags;</div><div class='del'>-#if (__FreeBSD__ &gt;= 10)</div><div class='del'>-	__u32	position;</div><div class='del'>-	__u32	padding;</div><div class='del'>-#endif /* __FreeBSD__ &gt;= 10 */</div><div class='add'>+        __u32   size;</div><div class='add'>+        __u32   flags;</div><div class='add'>+        __u32   position;</div><div class='add'>+        __u32   padding;</div><div class='ctx'> };</div><div class='ctx'> </div><div class='ctx'> struct fuse_getxattr_in {</div><div class='del'>-	__u32	size;</div><div class='del'>-	__u32	padding;</div><div class='del'>-#if (__FreeBSD__ &gt;= 10)</div><div class='del'>-	__u32	position;</div><div class='del'>-	__u32	padding2;</div><div class='del'>-#endif /* __FreeBSD__ &gt;= 10 */</div><div class='add'>+        __u32   size;</div><div class='add'>+        __u32   padding;</div><div class='add'>+        __u32   position;</div><div class='add'>+        __u32   padding2;</div><div class='ctx'> };</div><div class='ctx'> </div><div class='ctx'> struct fuse_getxattr_out {</div><div class='del'>-	__u32	size;</div><div class='del'>-	__u32	padding;</div><div class='add'>+        __u32   size;</div><div class='add'>+        __u32   padding;</div><div class='ctx'> };</div><div class='ctx'> </div><div class='ctx'> struct fuse_lk_in {</div><div class='del'>-	__u64	fh;</div><div class='del'>-	__u64	owner;</div><div class='del'>-	struct fuse_file_lock lk;</div><div class='add'>+        __u64   fh;</div><div class='add'>+        __u64   owner;</div><div class='add'>+        struct fuse_file_lock lk;</div><div class='ctx'> };</div><div class='ctx'> </div><div class='ctx'> struct fuse_lk_out {</div><div class='del'>-	struct fuse_file_lock lk;</div><div class='add'>+        struct fuse_file_lock lk;</div><div class='ctx'> };</div><div class='ctx'> </div><div class='ctx'> struct fuse_access_in {</div><div class='del'>-	__u32	mask;</div><div class='del'>-	__u32	padding;</div><div class='add'>+        __u32   mask;</div><div class='add'>+        __u32   padding;</div><div class='ctx'> };</div><div class='ctx'> </div><div class='ctx'> struct fuse_init_in {</div><div class='del'>-	__u32	major;</div><div class='del'>-	__u32	minor;</div><div class='del'>-	__u32	max_readahead;</div><div class='del'>-	__u32	flags;</div><div class='add'>+        __u32   major;</div><div class='add'>+        __u32   minor;</div><div class='add'>+        __u32   max_readahead;</div><div class='add'>+        __u32   flags;</div><div class='ctx'> };</div><div class='ctx'> </div><div class='ctx'> struct fuse_init_out {</div><div class='del'>-	__u32	major;</div><div class='del'>-	__u32	minor;</div><div class='del'>-	__u32	max_readahead;</div><div class='del'>-	__u32	flags;</div><div class='del'>-	__u32	unused;</div><div class='del'>-	__u32	max_write;</div><div class='add'>+        __u32   major;</div><div class='add'>+        __u32   minor;</div><div class='add'>+        __u32   max_readahead;</div><div class='add'>+        __u32   flags;</div><div class='add'>+        __u32   unused;</div><div class='add'>+        __u32   max_write;</div><div class='ctx'> };</div><div class='ctx'> </div><div class='ctx'> struct fuse_interrupt_in {</div><div class='del'>-	__u64	unique;</div><div class='add'>+        __u64   unique;</div><div class='ctx'> };</div><div class='ctx'> </div><div class='ctx'> struct fuse_bmap_in {</div><div class='del'>-	__u64	block;</div><div class='del'>-	__u32	blocksize;</div><div class='del'>-	__u32	padding;</div><div class='add'>+        __u64   block;</div><div class='add'>+        __u32   blocksize;</div><div class='add'>+        __u32   padding;</div><div class='ctx'> };</div><div class='ctx'> </div><div class='ctx'> struct fuse_bmap_out {</div><div class='del'>-	__u64	block;</div><div class='add'>+        __u64   block;</div><div class='ctx'> };</div><div class='ctx'> </div><div class='ctx'> struct fuse_in_header {</div><div class='del'>-	__u32	len;</div><div class='del'>-	__u32	opcode;</div><div class='del'>-	__u64	unique;</div><div class='del'>-	__u64	nodeid;</div><div class='del'>-	__u32	uid;</div><div class='del'>-	__u32	gid;</div><div class='del'>-	__u32	pid;</div><div class='del'>-	__u32	padding;</div><div class='add'>+        __u32   len;</div><div class='add'>+        __u32   opcode;</div><div class='add'>+        __u64   unique;</div><div class='add'>+        __u64   nodeid;</div><div class='add'>+        __u32   uid;</div><div class='add'>+        __u32   gid;</div><div class='add'>+        __u32   pid;</div><div class='add'>+        __u32   padding;</div><div class='ctx'> };</div><div class='ctx'> </div><div class='ctx'> struct fuse_out_header {</div><div class='del'>-	__u32	len;</div><div class='del'>-	__s32	error;</div><div class='del'>-	__u64	unique;</div><div class='add'>+        __u32   len;</div><div class='add'>+        __s32   error;</div><div class='add'>+        __u64   unique;</div><div class='ctx'> };</div><div class='ctx'> </div><div class='ctx'> struct fuse_dirent {</div><div class='del'>-	__u64	ino;</div><div class='del'>-	__u64	off;</div><div class='del'>-	__u32	namelen;</div><div class='del'>-	__u32	type;</div><div class='del'>-	char name[0];</div><div class='add'>+        __u64   ino;</div><div class='add'>+        __u64   off;</div><div class='add'>+        __u32   namelen;</div><div class='add'>+        __u32   type;</div><div class='add'>+        char name[0];</div><div class='ctx'> };</div><div class='ctx'> </div><div class='ctx'> #define FUSE_NAME_OFFSET offsetof(struct fuse_dirent, name)</div><div class='ctx'> #define FUSE_DIRENT_ALIGN(x) (((x) + sizeof(__u64) - 1) &amp; ~(sizeof(__u64) - 1))</div><div class='ctx'> #define FUSE_DIRENT_SIZE(d) \</div><div class='del'>-	FUSE_DIRENT_ALIGN(FUSE_NAME_OFFSET + (d)-&gt;namelen)</div><div class='add'>+        FUSE_DIRENT_ALIGN(FUSE_NAME_OFFSET + (d)-&gt;namelen)</div><div class='head'>diff --git a/contrib/fuse-util/mount_util.h b/contrib/fuse-include/mount_util.h<br/>index f392f99f17a..f392f99f17a 100644<br/>--- a/<a href='/cgit/glusterfs.git/tree/contrib/fuse-util/mount_util.h?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>contrib/fuse-util/mount_util.h</a><br/>+++ b/<a href='/cgit/glusterfs.git/tree/contrib/fuse-include/mount_util.h?id=d1d7a6f35c816822fab51c820e25023863c239c1'>contrib/fuse-include/mount_util.h</a></div><div class='head'>diff --git a/contrib/fuse-lib/misc.c b/contrib/fuse-lib/misc.c<br/>index 877c3880de0..1a9b418e511 100644<br/>--- a/<a href='/cgit/glusterfs.git/tree/contrib/fuse-lib/misc.c?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>contrib/fuse-lib/misc.c</a><br/>+++ b/<a href='/cgit/glusterfs.git/tree/contrib/fuse-lib/misc.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>contrib/fuse-lib/misc.c</a></div><div class='hunk'>@@ -10,6 +10,7 @@</div><div class='ctx'> #include &lt;string.h&gt;</div><div class='ctx'> #include &lt;limits.h&gt;</div><div class='ctx'> #include &lt;fcntl.h&gt;</div><div class='add'>+#include "glusterfs/glusterfs.h"</div><div class='ctx'> #include "fuse_kernel.h"</div><div class='ctx'> #include "fuse-misc.h"</div><div class='ctx'> </div><div class='hunk'>@@ -37,9 +38,9 @@ calc_timeout_nsec (double t)</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> void</div><div class='del'>-convert_fuse_file_lock (struct fuse_file_lock *fl, struct flock *flock)</div><div class='add'>+convert_fuse_file_lock (struct fuse_file_lock *fl, struct gf_flock *flock,</div><div class='add'>+                        uint64_t lk_owner)</div><div class='ctx'> {</div><div class='del'>-        memset (flock, 0, sizeof (struct flock));</div><div class='ctx'>         flock-&gt;l_type = fl-&gt;type;</div><div class='ctx'>         flock-&gt;l_whence = SEEK_SET;</div><div class='ctx'>         flock-&gt;l_start = fl-&gt;start;</div><div class='hunk'>@@ -48,4 +49,5 @@ convert_fuse_file_lock (struct fuse_file_lock *fl, struct flock *flock)</div><div class='ctx'>         else</div><div class='ctx'>                 flock-&gt;l_len = fl-&gt;end - fl-&gt;start + 1;</div><div class='ctx'>         flock-&gt;l_pid = fl-&gt;pid;</div><div class='add'>+        set_lk_owner_from_uint64 (&amp;flock-&gt;l_owner, lk_owner);</div><div class='ctx'> }</div><div class='head'>diff --git a/contrib/fuse-lib/mount-common.c b/contrib/fuse-lib/mount-common.c<br/>new file mode 100644<br/>index 00000000000..cffd4c01ed5<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/contrib/fuse-lib/mount-common.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>contrib/fuse-lib/mount-common.c</a></div><div class='hunk'>@@ -0,0 +1,282 @@</div><div class='add'>+/*</div><div class='add'>+  FUSE: Filesystem in Userspace</div><div class='add'>+  Copyright (C) 2001-2007  Miklos Szeredi &lt;miklos@szeredi.hu&gt;</div><div class='add'>+  Copyright (c) 2010 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='add'>+</div><div class='add'>+  This program can be distributed under the terms of the GNU LGPLv2.</div><div class='add'>+  See the file COPYING.LIB.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#include "mount-gluster-compat.h"</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+ * These functions (and gf_fuse_umount() in mount.c)</div><div class='add'>+ * were originally taken from libfuse as of commit 7960e99e</div><div class='add'>+ * (http://fuse.git.sourceforge.net/git/gitweb.cgi?p=fuse/fuse;a=commit;h=7960e99e)</div><div class='add'>+ * almost verbatim. What has been changed upon adoption:</div><div class='add'>+ * - style adopted to that of glusterfs</div><div class='add'>+ * - s/fprintf/gf_log/</div><div class='add'>+ * - s/free/FREE/, s/malloc/MALLOC/</div><div class='add'>+ * - there are some other minor things</div><div class='add'>+ *</div><div class='add'>+ * For changes that were made later and syncs with upstream,</div><div class='add'>+ * see the commit log and per-function comments.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+#ifdef GF_LINUX_HOST_OS</div><div class='add'>+/* FUSE: cherry-picked bd99f9cf */</div><div class='add'>+static int</div><div class='add'>+mtab_needs_update (const char *mnt)</div><div class='add'>+{</div><div class='add'>+        int res;</div><div class='add'>+        struct stat stbuf;</div><div class='add'>+</div><div class='add'>+        /* If mtab is within new mount, don't touch it */</div><div class='add'>+        if (strncmp (mnt, _PATH_MOUNTED, sizeof (_PATH_MOUNTED) - 1) == 0 &amp;&amp;</div><div class='add'>+            _PATH_MOUNTED[strlen (mnt)] == '/')</div><div class='add'>+                return 0;</div><div class='add'>+</div><div class='add'>+        /*</div><div class='add'>+         * Skip mtab update if /etc/mtab:</div><div class='add'>+         *</div><div class='add'>+         *  - doesn't exist,</div><div class='add'>+         *  - is a symlink,</div><div class='add'>+         *  - is on a read-only filesystem.</div><div class='add'>+         */</div><div class='add'>+        res = lstat (_PATH_MOUNTED, &amp;stbuf);</div><div class='add'>+        if (res == -1) {</div><div class='add'>+                if (errno == ENOENT)</div><div class='add'>+                        return 0;</div><div class='add'>+        } else {</div><div class='add'>+                uid_t ruid;</div><div class='add'>+                int err;</div><div class='add'>+</div><div class='add'>+                if (S_ISLNK (stbuf.st_mode))</div><div class='add'>+                        return 0;</div><div class='add'>+</div><div class='add'>+                ruid = getuid ();</div><div class='add'>+                if (ruid != 0)</div><div class='add'>+                        setreuid (0, -1);</div><div class='add'>+</div><div class='add'>+                res = access (_PATH_MOUNTED, W_OK);</div><div class='add'>+                err = (res == -1) ? errno : 0;</div><div class='add'>+                if (ruid != 0)</div><div class='add'>+                        setreuid (ruid, -1);</div><div class='add'>+</div><div class='add'>+                if (err == EROFS)</div><div class='add'>+                        return 0;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        return 1;</div><div class='add'>+}</div><div class='add'>+#else /* GF_LINUX_HOST_OS */</div><div class='add'>+#define mtab_needs_update(x) 1</div><div class='add'>+#endif /* GF_LINUX_HOST_OS */</div><div class='add'>+</div><div class='add'>+/* FUSE: called add_mount_legacy(); R.I.P. as of cbd3a2a8 */</div><div class='add'>+int</div><div class='add'>+fuse_mnt_add_mount (const char *progname, const char *fsname,</div><div class='add'>+                    const char *mnt, const char *type, const char *opts)</div><div class='add'>+{</div><div class='add'>+        int res;</div><div class='add'>+        int status;</div><div class='add'>+        sigset_t blockmask;</div><div class='add'>+        sigset_t oldmask;</div><div class='add'>+</div><div class='add'>+        if (!mtab_needs_update (mnt))</div><div class='add'>+                return 0;</div><div class='add'>+</div><div class='add'>+        sigemptyset (&amp;blockmask);</div><div class='add'>+        sigaddset (&amp;blockmask, SIGCHLD);</div><div class='add'>+        res = sigprocmask (SIG_BLOCK, &amp;blockmask, &amp;oldmask);</div><div class='add'>+        if (res == -1) {</div><div class='add'>+                GFFUSE_LOGERR ("%s: sigprocmask: %s",</div><div class='add'>+                               progname, strerror (errno));</div><div class='add'>+                return -1;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        res = fork ();</div><div class='add'>+        if (res == -1) {</div><div class='add'>+                GFFUSE_LOGERR ("%s: fork: %s", progname, strerror (errno));</div><div class='add'>+                goto out_restore;</div><div class='add'>+        }</div><div class='add'>+        if (res == 0) {</div><div class='add'>+                char templ[] = "/tmp/fusermountXXXXXX";</div><div class='add'>+                char *tmp;</div><div class='add'>+</div><div class='add'>+                sigprocmask (SIG_SETMASK, &amp;oldmask, NULL);</div><div class='add'>+                res = setuid (geteuid ());</div><div class='add'>+                if (res != 0) {</div><div class='add'>+                        GFFUSE_LOGERR ("%s: setuid: %s", progname, strerror (errno));</div><div class='add'>+                        exit (1);</div><div class='add'>+                }</div><div class='add'>+</div><div class='add'>+                /*</div><div class='add'>+                 * hide in a directory, where mount isn't able to resolve</div><div class='add'>+                 * fsname as a valid path</div><div class='add'>+                 */</div><div class='add'>+                tmp = mkdtemp (templ);</div><div class='add'>+                if (!tmp) {</div><div class='add'>+                        GFFUSE_LOGERR ("%s: failed to create temporary directory",</div><div class='add'>+                                       progname);</div><div class='add'>+                        exit (1);</div><div class='add'>+                }</div><div class='add'>+                if (chdir (tmp)) {</div><div class='add'>+                        GFFUSE_LOGERR ("%s: failed to chdir to %s: %s",</div><div class='add'>+                                       progname, tmp, strerror (errno));</div><div class='add'>+                        exit (1);</div><div class='add'>+                }</div><div class='add'>+                rmdir (tmp);</div><div class='add'>+                execl (_PATH_MOUNT, _PATH_MOUNT, "-i", "-f", "-t", type,</div><div class='add'>+                       "-o", opts, fsname, mnt, NULL);</div><div class='add'>+                GFFUSE_LOGERR ("%s: failed to execute %s: %s",</div><div class='add'>+                               progname, _PATH_MOUNT, strerror (errno));</div><div class='add'>+                exit (1);</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        res = waitpid (res, &amp;status, 0);</div><div class='add'>+        if (res == -1)</div><div class='add'>+                GFFUSE_LOGERR ("%s: waitpid: %s", progname, strerror (errno));</div><div class='add'>+        res = (res != -1 &amp;&amp; status == 0) ? 0 : -1;</div><div class='add'>+</div><div class='add'>+ out_restore:</div><div class='add'>+        sigprocmask (SIG_SETMASK, &amp;oldmask, NULL);</div><div class='add'>+        return res;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+char *</div><div class='add'>+fuse_mnt_resolve_path (const char *progname, const char *orig)</div><div class='add'>+{</div><div class='add'>+        char buf[PATH_MAX];</div><div class='add'>+        char *copy;</div><div class='add'>+        char *dst;</div><div class='add'>+        char *end;</div><div class='add'>+        char *lastcomp;</div><div class='add'>+        const char *toresolv;</div><div class='add'>+</div><div class='add'>+        if (!orig[0]) {</div><div class='add'>+                GFFUSE_LOGERR ("%s: invalid mountpoint '%s'", progname, orig);</div><div class='add'>+                return NULL;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        copy = strdup (orig);</div><div class='add'>+        if (copy == NULL) {</div><div class='add'>+                GFFUSE_LOGERR ("%s: failed to allocate memory", progname);</div><div class='add'>+                return NULL;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        toresolv = copy;</div><div class='add'>+        lastcomp = NULL;</div><div class='add'>+        for (end = copy + strlen (copy) - 1; end &gt; copy &amp;&amp; *end == '/'; end --);</div><div class='add'>+        if (end[0] != '/') {</div><div class='add'>+                char *tmp;</div><div class='add'>+                end[1] = '\0';</div><div class='add'>+                tmp = strrchr (copy, '/');</div><div class='add'>+                if (tmp == NULL) {</div><div class='add'>+                        lastcomp = copy;</div><div class='add'>+                        toresolv = ".";</div><div class='add'>+                } else {</div><div class='add'>+                        lastcomp = tmp + 1;</div><div class='add'>+                        if (tmp == copy)</div><div class='add'>+                                toresolv = "/";</div><div class='add'>+                }</div><div class='add'>+                if (strcmp (lastcomp, ".") == 0 || strcmp (lastcomp, "..") == 0) {</div><div class='add'>+                        lastcomp = NULL;</div><div class='add'>+                        toresolv = copy;</div><div class='add'>+                }</div><div class='add'>+                else if (tmp)</div><div class='add'>+                        tmp[0] = '\0';</div><div class='add'>+        }</div><div class='add'>+        if (realpath (toresolv, buf) == NULL) {</div><div class='add'>+                GFFUSE_LOGERR ("%s: bad mount point %s: %s", progname, orig,</div><div class='add'>+                               strerror (errno));</div><div class='add'>+                FREE (copy);</div><div class='add'>+                return NULL;</div><div class='add'>+        }</div><div class='add'>+        if (lastcomp == NULL)</div><div class='add'>+                dst = strdup (buf);</div><div class='add'>+        else {</div><div class='add'>+                dst = (char *) MALLOC (strlen (buf) + 1 + strlen (lastcomp) + 1);</div><div class='add'>+                if (dst) {</div><div class='add'>+                        unsigned buflen = strlen (buf);</div><div class='add'>+                        if (buflen &amp;&amp; buf[buflen-1] == '/')</div><div class='add'>+                                sprintf (dst, "%s%s", buf, lastcomp);</div><div class='add'>+                        else</div><div class='add'>+                                sprintf (dst, "%s/%s", buf, lastcomp);</div><div class='add'>+                }</div><div class='add'>+        }</div><div class='add'>+        FREE (copy);</div><div class='add'>+        if (dst == NULL)</div><div class='add'>+                GFFUSE_LOGERR ("%s: failed to allocate memory", progname);</div><div class='add'>+        return dst;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* FUSE: to support some changes that were reverted since</div><div class='add'>+ * then, it was split in two (fuse_mnt_umount() and</div><div class='add'>+ * exec_umount()); however the actual code is same as here</div><div class='add'>+ * since 0197ce40</div><div class='add'>+ */</div><div class='add'>+int</div><div class='add'>+fuse_mnt_umount (const char *progname, const char *abs_mnt,</div><div class='add'>+                 const char *rel_mnt, int lazy)</div><div class='add'>+{</div><div class='add'>+        int res;</div><div class='add'>+        int status;</div><div class='add'>+        sigset_t blockmask;</div><div class='add'>+        sigset_t oldmask;</div><div class='add'>+</div><div class='add'>+        if (!mtab_needs_update (abs_mnt)) {</div><div class='add'>+                res = umount2 (rel_mnt, lazy ? 2 : 0);</div><div class='add'>+                if (res == -1)</div><div class='add'>+                        GFFUSE_LOGERR ("%s: failed to unmount %s: %s",</div><div class='add'>+                                       progname, abs_mnt, strerror (errno));</div><div class='add'>+                return res;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        sigemptyset (&amp;blockmask);</div><div class='add'>+        sigaddset (&amp;blockmask, SIGCHLD);</div><div class='add'>+        res = sigprocmask (SIG_BLOCK, &amp;blockmask, &amp;oldmask);</div><div class='add'>+        if (res == -1) {</div><div class='add'>+                GFFUSE_LOGERR ("%s: sigprocmask: %s", progname,</div><div class='add'>+                               strerror (errno));</div><div class='add'>+                return -1;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        res = fork ();</div><div class='add'>+        if (res == -1) {</div><div class='add'>+                GFFUSE_LOGERR ("%s: fork: %s", progname, strerror (errno));</div><div class='add'>+                goto out_restore;</div><div class='add'>+        }</div><div class='add'>+        if (res == 0) {</div><div class='add'>+                sigprocmask (SIG_SETMASK, &amp;oldmask, NULL);</div><div class='add'>+                res = setuid (geteuid ());</div><div class='add'>+                if (res != 0) {</div><div class='add'>+                        GFFUSE_LOGERR ("%s: setuid: %s", progname, strerror (errno));</div><div class='add'>+                        exit (1);</div><div class='add'>+                }</div><div class='add'>+#ifdef GF_LINUX_HOST_OS</div><div class='add'>+                execl ("umount", "umount", "-i", rel_mnt,</div><div class='add'>+                       lazy ? "-l" : NULL, NULL);</div><div class='add'>+                GFFUSE_LOGERR ("%s: failed to execute umount: %s",</div><div class='add'>+                               progname, strerror (errno));</div><div class='add'>+#elif __NetBSD__</div><div class='add'>+                /* exitting the filesystem causes the umount */</div><div class='add'>+                exit (0);</div><div class='add'>+#else</div><div class='add'>+                execl ("umount", "umount", "-f", rel_mnt, NULL);</div><div class='add'>+                GFFUSE_LOGERR ("%s: failed to execute umount: %s",</div><div class='add'>+                               progname, strerror (errno));</div><div class='add'>+#endif /* GF_LINUX_HOST_OS */</div><div class='add'>+                exit (1);</div><div class='add'>+        }</div><div class='add'>+        res = waitpid (res, &amp;status, 0);</div><div class='add'>+        if (res == -1)</div><div class='add'>+                GFFUSE_LOGERR ("%s: waitpid: %s", progname, strerror (errno));</div><div class='add'>+</div><div class='add'>+        if (status != 0)</div><div class='add'>+                res = -1;</div><div class='add'>+</div><div class='add'>+ out_restore:</div><div class='add'>+        sigprocmask (SIG_SETMASK, &amp;oldmask, NULL);</div><div class='add'>+        return res;</div><div class='add'>+}</div><div class='head'>diff --git a/contrib/fuse-lib/mount-gluster-compat.h b/contrib/fuse-lib/mount-gluster-compat.h<br/>new file mode 100644<br/>index 00000000000..d3646d08d8e<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/contrib/fuse-lib/mount-gluster-compat.h?id=d1d7a6f35c816822fab51c820e25023863c239c1'>contrib/fuse-lib/mount-gluster-compat.h</a></div><div class='hunk'>@@ -0,0 +1,105 @@</div><div class='add'>+/*</div><div class='add'>+  FUSE: Filesystem in Userspace</div><div class='add'>+  Copyright (C) 2001-2007  Miklos Szeredi &lt;miklos@szeredi.hu&gt;</div><div class='add'>+  Copyright (c) 2010 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='add'>+</div><div class='add'>+  This program can be distributed under the terms of the GNU LGPLv2.</div><div class='add'>+  See the file COPYING.LIB.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#ifndef _CONFIG_H</div><div class='add'>+#define _CONFIG_H</div><div class='add'>+#include "config.h"</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#include &lt;stdio.h&gt;</div><div class='add'>+#include &lt;stdlib.h&gt;</div><div class='add'>+#include &lt;unistd.h&gt;</div><div class='add'>+#include &lt;stddef.h&gt;</div><div class='add'>+#include &lt;limits.h&gt;</div><div class='add'>+#include &lt;fcntl.h&gt;</div><div class='add'>+#include &lt;errno.h&gt;</div><div class='add'>+#include &lt;dirent.h&gt;</div><div class='add'>+#include &lt;signal.h&gt;</div><div class='add'>+#if defined(GF_LINUX_HOST_OS)</div><div class='add'>+#include &lt;mntent.h&gt;</div><div class='add'>+#endif /* GF_LINUX_HOST_OS */</div><div class='add'>+#include &lt;sys/stat.h&gt;</div><div class='add'>+#include &lt;sys/poll.h&gt;</div><div class='add'>+#include &lt;sys/un.h&gt;</div><div class='add'>+#include &lt;sys/wait.h&gt;</div><div class='add'>+#include &lt;sys/mount.h&gt;</div><div class='add'>+</div><div class='add'>+#ifdef GF_LINUX_HOST_OS</div><div class='add'>+typedef unsigned long mount_flag_t;</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#if defined(__NetBSD__)</div><div class='add'>+#include &lt;perfuse.h&gt;</div><div class='add'>+#define umount2(dir, flags) unmount(dir, ((flags) != 0) ? MNT_FORCE : 0)</div><div class='add'>+#define MS_RDONLY MNT_RDONLY</div><div class='add'>+#define MS_NOSUID MNT_NOSUID</div><div class='add'>+#define MS_NODEV  MNT_NODEV</div><div class='add'>+#define MS_NOATIME MNT_NOATIME</div><div class='add'>+#define MS_NOEXEC MNT_NOEXEC</div><div class='add'>+typedef int mount_flag_t;</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#if defined(GF_DARWIN_HOST_OS) || defined(__FreeBSD__)</div><div class='add'>+#include &lt;sys/param.h&gt;</div><div class='add'>+#include &lt;sys/mount.h&gt;</div><div class='add'>+#define umount2(dir, flags) unmount(dir, ((flags) != 0) ? MNT_FORCE : 0)</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#if defined(__FreeBSD__)</div><div class='add'>+#define MS_RDONLY MNT_RDONLY</div><div class='add'>+#define MS_NOSUID MNT_NOSUID</div><div class='add'>+/* "nodev"/MNT_NODEV was removed from FreBSD, as it became unneeded because "As</div><div class='add'>+ * of FreeBSD 6.0 device nodes may be created in regular file systems but such</div><div class='add'>+ * nodes cannot be used to access devices." (See</div><div class='add'>+ * https://freebsd.org/cgi/man.cgi?query=mknod&amp;sektion=8 .</div><div class='add'>+ * Also see:</div><div class='add'>+ * - https://github.com/freebsd/freebsd/commit/266790a</div><div class='add'>+ * - https://github.com/freebsd/freebsd/commit/a5e716d</div><div class='add'>+ * - 700008 in</div><div class='add'>+ *   https://www.freebsd.org/doc/en/books/porters-handbook/versions-7.html .)</div><div class='add'>+ */</div><div class='add'>+#if __FreeBSD_version &lt; 700008</div><div class='add'>+#define MS_NODEV  MNT_NODEV</div><div class='add'>+#else</div><div class='add'>+#define MS_NODEV  0</div><div class='add'>+#endif</div><div class='add'>+#define MS_NOATIME MNT_NOATIME</div><div class='add'>+#define MS_NOEXEC MNT_NOEXEC</div><div class='add'>+#if __FreeBSD_version &lt; 1000715</div><div class='add'>+typedef int  mount_flag_t;</div><div class='add'>+#else</div><div class='add'>+/* __FreeBSD_version was not bumped for this type change. Anyway, see</div><div class='add'>+ * https://github.com/freebsd/freebsd/commit/e8d76f8</div><div class='add'>+ * and respective __FreeBSD_version:</div><div class='add'>+ * https://github.com/freebsd/freebsd/blob/e8d76f8/sys/sys/param.h#L61 .</div><div class='add'>+ * We use the subsequent value, 1000715, to switch. (Also see:</div><div class='add'>+ * https://www.freebsd.org/doc/en/books/porters-handbook/versions-10.html .)</div><div class='add'>+ */</div><div class='add'>+typedef long long mount_flag_t;</div><div class='add'>+#endif</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#ifdef GF_LINUX_HOST_OS</div><div class='add'>+#define _PATH_MOUNT "/bin/mount"</div><div class='add'>+#else /* FreeBSD, NetBSD, MacOS X */</div><div class='add'>+#define _PATH_MOUNT "/sbin/mount"</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#ifdef FUSE_UTIL</div><div class='add'>+#define MALLOC(size) malloc (size)</div><div class='add'>+#define FREE(ptr) free (ptr)</div><div class='add'>+#define GFFUSE_LOGERR(...) fprintf (stderr, ## __VA_ARGS__)</div><div class='add'>+#else /* FUSE_UTIL */</div><div class='add'>+#include "glusterfs/glusterfs.h"</div><div class='add'>+#include "glusterfs/logging.h"</div><div class='add'>+#include "glusterfs/common-utils.h"</div><div class='add'>+</div><div class='add'>+#define GFFUSE_LOGERR(...) \</div><div class='add'>+        gf_log ("glusterfs-fuse", GF_LOG_ERROR, ## __VA_ARGS__)</div><div class='add'>+#endif /* !FUSE_UTIL */</div><div class='head'>diff --git a/contrib/fuse-lib/mount.c b/contrib/fuse-lib/mount.c<br/>index e88293b38c7..06ff191f542 100644<br/>--- a/<a href='/cgit/glusterfs.git/tree/contrib/fuse-lib/mount.c?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>contrib/fuse-lib/mount.c</a><br/>+++ b/<a href='/cgit/glusterfs.git/tree/contrib/fuse-lib/mount.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>contrib/fuse-lib/mount.c</a></div><div class='hunk'>@@ -1,317 +1,203 @@</div><div class='ctx'> /*</div><div class='ctx'>   FUSE: Filesystem in Userspace</div><div class='ctx'>   Copyright (C) 2001-2007  Miklos Szeredi &lt;miklos@szeredi.hu&gt;</div><div class='del'>-  Copyright (c) 2009 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='add'>+  Copyright (c) 2010 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='ctx'> </div><div class='ctx'>   This program can be distributed under the terms of the GNU LGPLv2.</div><div class='ctx'>   See the file COPYING.LIB.</div><div class='ctx'> */</div><div class='ctx'> </div><div class='del'>-#ifndef _CONFIG_H</div><div class='del'>-#define _CONFIG_H</div><div class='del'>-#include "config.h"</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-#include &lt;stdio.h&gt;</div><div class='del'>-#include &lt;stdlib.h&gt;</div><div class='del'>-#include &lt;unistd.h&gt;</div><div class='del'>-#include &lt;stddef.h&gt;</div><div class='del'>-#include &lt;limits.h&gt;</div><div class='del'>-#include &lt;fcntl.h&gt;</div><div class='del'>-#include &lt;errno.h&gt;</div><div class='del'>-#include &lt;dirent.h&gt;</div><div class='del'>-#include &lt;mntent.h&gt;</div><div class='del'>-#include &lt;sys/stat.h&gt;</div><div class='del'>-#include &lt;sys/poll.h&gt;</div><div class='del'>-#include &lt;sys/socket.h&gt;</div><div class='del'>-#include &lt;sys/un.h&gt;</div><div class='del'>-#include &lt;sys/wait.h&gt;</div><div class='del'>-#include &lt;sys/mount.h&gt;</div><div class='del'>-</div><div class='del'>-#ifdef FUSE_UTIL</div><div class='del'>-#define MALLOC(size) malloc (size)</div><div class='del'>-#define FREE(ptr) free (ptr)</div><div class='del'>-#define GFFUSE_LOGERR(...) fprintf (stderr, ## __VA_ARGS__)</div><div class='del'>-#else /* FUSE_UTIL */</div><div class='del'>-#include "glusterfs.h"</div><div class='del'>-#include "logging.h"</div><div class='del'>-#include "common-utils.h"</div><div class='add'>+#include "mount_util.h"</div><div class='add'>+#include "mount-gluster-compat.h"</div><div class='ctx'> </div><div class='ctx'> #ifdef GF_FUSERMOUNT</div><div class='ctx'> #define FUSERMOUNT_PROG FUSERMOUNT_DIR "/fusermount-glusterfs"</div><div class='ctx'> #else</div><div class='ctx'> #define FUSERMOUNT_PROG "fusermount"</div><div class='ctx'> #endif</div><div class='del'>-#define FUSE_COMMFD_ENV "_FUSE_COMMFD"</div><div class='del'>-</div><div class='del'>-#define GFFUSE_LOGERR(...) \</div><div class='del'>-        gf_log ("glusterfs-fuse", GF_LOG_ERROR, ## __VA_ARGS__)</div><div class='del'>-#endif /* !FUSE_UTIL */</div><div class='add'>+#define FUSE_DEVFD_ENV "_FUSE_DEVFD"</div><div class='ctx'> </div><div class='del'>-/*</div><div class='del'>- * Functions below, until following note, were taken from libfuse</div><div class='del'>- * (http://git.gluster.com/?p=users/csaba/fuse.git;a=commit;h=b988bbf9)</div><div class='del'>- * almost verbatim. What has been changed:</div><div class='del'>- * - style adopted to that of glusterfs</div><div class='del'>- * - s/fprintf/gf_log/</div><div class='del'>- * - s/free/FREE/, s/malloc/MALLOC/</div><div class='del'>- * - there are some other minor things</div><div class='del'>- */</div><div class='add'>+#ifdef __FreeBSD__</div><div class='add'>+#include &lt;sys/types.h&gt;</div><div class='add'>+#include &lt;sys/uio.h&gt;</div><div class='add'>+#include &lt;unistd.h&gt;</div><div class='add'>+#endif /* __FreeBSD__ */</div><div class='ctx'> </div><div class='del'>-static int</div><div class='del'>-mtab_needs_update (const char *mnt)</div><div class='add'>+/* FUSE: function is called fuse_kern_unmount() */</div><div class='add'>+void</div><div class='add'>+gf_fuse_unmount (const char *mountpoint, int fd)</div><div class='ctx'> {</div><div class='ctx'>         int res;</div><div class='del'>-        struct stat stbuf;</div><div class='del'>-</div><div class='del'>-        /* If mtab is within new mount, don't touch it */</div><div class='del'>-        if (strncmp (mnt, _PATH_MOUNTED, strlen (mnt)) == 0 &amp;&amp;</div><div class='del'>-            _PATH_MOUNTED[strlen (mnt)] == '/')</div><div class='del'>-                return 0;</div><div class='del'>-</div><div class='del'>-        /*</div><div class='del'>-         * Skip mtab update if /etc/mtab:</div><div class='del'>-         *</div><div class='del'>-         *  - doesn't exist,</div><div class='del'>-         *  - is a symlink,</div><div class='del'>-         *  - is on a read-only filesystem.</div><div class='del'>-         */</div><div class='del'>-        res = lstat (_PATH_MOUNTED, &amp;stbuf);</div><div class='del'>-        if (res == -1) {</div><div class='del'>-                if (errno == ENOENT)</div><div class='del'>-                        return 0;</div><div class='del'>-        } else {</div><div class='del'>-                if (S_ISLNK (stbuf.st_mode))</div><div class='del'>-                        return 0;</div><div class='add'>+        int pid;</div><div class='add'>+</div><div class='add'>+        if (!mountpoint)</div><div class='add'>+                return;</div><div class='add'>+</div><div class='add'>+        if (fd != -1) {</div><div class='add'>+                struct pollfd pfd;</div><div class='add'>+</div><div class='add'>+                pfd.fd = fd;</div><div class='add'>+                pfd.events = 0;</div><div class='add'>+                res = poll (&amp;pfd, 1, 0);</div><div class='add'>+                /* If file poll returns POLLERR on the device file descriptor,</div><div class='add'>+                   then the filesystem is already unmounted */</div><div class='add'>+                if (res == 1 &amp;&amp; (pfd.revents &amp; POLLERR))</div><div class='add'>+                        return;</div><div class='ctx'> </div><div class='del'>-                res = access (_PATH_MOUNTED, W_OK);</div><div class='del'>-                if (res == -1 &amp;&amp; errno == EROFS)</div><div class='del'>-                        return 0;</div><div class='add'>+                /* Need to close file descriptor, otherwise synchronous umount</div><div class='add'>+                   would recurse into filesystem, and deadlock */</div><div class='add'>+                close (fd);</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        if (geteuid () == 0) {</div><div class='add'>+                fuse_mnt_umount ("fuse", mountpoint, mountpoint, 1);</div><div class='add'>+                return;</div><div class='add'>+        } else {</div><div class='add'>+            GFFUSE_LOGERR ("fuse: Effective-uid: %d", geteuid());</div><div class='ctx'>         }</div><div class='ctx'> </div><div class='del'>-        return 1;</div><div class='add'>+        res = umount2 (mountpoint, 2);</div><div class='add'>+        if (res == 0)</div><div class='add'>+                return;</div><div class='add'>+</div><div class='add'>+        GFFUSE_LOGERR ("fuse: failed to unmount %s: %s",</div><div class='add'>+                       mountpoint, strerror (errno));</div><div class='add'>+        pid = fork ();</div><div class='add'>+        if (pid == -1)</div><div class='add'>+                return;</div><div class='add'>+</div><div class='add'>+        if (pid == 0) {</div><div class='add'>+                const char *argv[] = { FUSERMOUNT_PROG, "-u", "-q", "-z",</div><div class='add'>+                                       "--", mountpoint, NULL };</div><div class='add'>+</div><div class='add'>+                execvp (FUSERMOUNT_PROG, (char **)argv);</div><div class='add'>+                GFFUSE_LOGERR ("fuse: failed to execute fuserumount: %s",</div><div class='add'>+                               strerror (errno));</div><div class='add'>+                _exit (1);</div><div class='add'>+        }</div><div class='add'>+        waitpid (pid, NULL, 0);</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-#ifndef FUSE_UTIL</div><div class='del'>-static</div><div class='del'>-#endif</div><div class='add'>+</div><div class='add'>+/* gluster-specific routines */</div><div class='add'>+</div><div class='add'>+/* Unmounting in a daemon that lurks 'till main process exits */</div><div class='ctx'> int</div><div class='del'>-fuse_mnt_add_mount (const char *progname, const char *fsname,</div><div class='del'>-                    const char *mnt, const char *type, const char *opts)</div><div class='add'>+gf_fuse_unmount_daemon (const char *mountpoint, int fd)</div><div class='ctx'> {</div><div class='del'>-        int res;</div><div class='del'>-        int status;</div><div class='del'>-        sigset_t blockmask;</div><div class='del'>-        sigset_t oldmask;</div><div class='del'>-</div><div class='del'>-        if (!mtab_needs_update (mnt))</div><div class='del'>-                return 0;</div><div class='del'>-</div><div class='del'>-        sigemptyset (&amp;blockmask);</div><div class='del'>-        sigaddset (&amp;blockmask, SIGCHLD);</div><div class='del'>-        res = sigprocmask (SIG_BLOCK, &amp;blockmask, &amp;oldmask);</div><div class='del'>-        if (res == -1) {</div><div class='del'>-                GFFUSE_LOGERR ("%s: sigprocmask: %s",</div><div class='del'>-                               progname, strerror (errno));</div><div class='add'>+        int   ret = -1;</div><div class='add'>+        pid_t pid = -1;</div><div class='add'>+</div><div class='add'>+        if (fd == -1)</div><div class='ctx'>                 return -1;</div><div class='del'>-        }</div><div class='ctx'> </div><div class='del'>-        res = fork ();</div><div class='del'>-        if (res == -1) {</div><div class='del'>-                GFFUSE_LOGERR ("%s: fork: %s", progname, strerror (errno));</div><div class='del'>-                goto out_restore;</div><div class='del'>-        }</div><div class='del'>-        if (res == 0) {</div><div class='del'>-                char templ[] = "/tmp/fusermountXXXXXX";</div><div class='del'>-                char *tmp;</div><div class='del'>-</div><div class='del'>-                /* mtab update done async, just log if fails */</div><div class='del'>-                res = fork ();</div><div class='del'>-                if (res)</div><div class='del'>-                        exit (res == -1 ? 1 : 0);</div><div class='del'>-                res = fork ();</div><div class='del'>-                if (res) {</div><div class='del'>-                        if (res != -1)</div><div class='del'>-                                res = waitpid (res, &amp;status, 0);</div><div class='del'>-                        if (res == -1)</div><div class='del'>-                                GFFUSE_LOGERR ("%s: /etc/mtab update failed",</div><div class='del'>-                                               progname);</div><div class='del'>-</div><div class='del'>-                        exit (0);</div><div class='del'>-                }</div><div class='add'>+        int ump[2] = {0,};</div><div class='ctx'> </div><div class='del'>-                sigprocmask (SIG_SETMASK, &amp;oldmask, NULL);</div><div class='del'>-                setuid (geteuid ());</div><div class='del'>-</div><div class='del'>-                /*</div><div class='del'>-                 * hide in a directory, where mount isn't able to resolve</div><div class='del'>-                 * fsname as a valid path</div><div class='del'>-                 */</div><div class='del'>-                tmp = mkdtemp (templ);</div><div class='del'>-                if (!tmp) {</div><div class='del'>-                        GFFUSE_LOGERR ("%s: failed to create temporary directory",</div><div class='del'>-                                       progname);</div><div class='del'>-                        exit (1);</div><div class='del'>-                }</div><div class='del'>-                if (chdir (tmp)) {</div><div class='del'>-                        GFFUSE_LOGERR ("%s: failed to chdir to %s: %s",</div><div class='del'>-                                       progname, tmp, strerror (errno));</div><div class='del'>-                        exit (1);</div><div class='del'>-                }</div><div class='del'>-                rmdir (tmp);</div><div class='del'>-                execl ("/bin/mount", "/bin/mount", "-i", "-f", "-t", type,</div><div class='del'>-                       "-o", opts, fsname, mnt, NULL);</div><div class='del'>-                GFFUSE_LOGERR ("%s: failed to execute /bin/mount: %s",</div><div class='del'>-                               progname, strerror (errno));</div><div class='del'>-                exit (1);</div><div class='add'>+        ret = pipe(ump);</div><div class='add'>+        if (ret == -1) {</div><div class='add'>+                close (fd);</div><div class='add'>+                return -1;</div><div class='ctx'>         }</div><div class='del'>-        res = waitpid (res, &amp;status, 0);</div><div class='del'>-        if (res == -1)</div><div class='del'>-                GFFUSE_LOGERR ("%s: waitpid: %s", progname, strerror (errno));</div><div class='ctx'> </div><div class='del'>-        if (status != 0)</div><div class='del'>-                res = -1;</div><div class='add'>+        pid = fork ();</div><div class='add'>+        switch (pid) {</div><div class='add'>+        case 0:</div><div class='add'>+        {</div><div class='add'>+                char c = 0;</div><div class='add'>+                sigset_t sigset;</div><div class='ctx'> </div><div class='del'>- out_restore:</div><div class='del'>-        sigprocmask (SIG_SETMASK, &amp;oldmask, NULL);</div><div class='del'>-        return res;</div><div class='del'>-}</div><div class='add'>+                close_fds_except (ump, 1);</div><div class='ctx'> </div><div class='del'>-#ifndef FUSE_UTIL</div><div class='del'>-static</div><div class='del'>-#endif</div><div class='del'>-char</div><div class='del'>-*fuse_mnt_resolve_path (const char *progname, const char *orig)</div><div class='del'>-{</div><div class='del'>-        char buf[PATH_MAX];</div><div class='del'>-        char *copy;</div><div class='del'>-        char *dst;</div><div class='del'>-        char *end;</div><div class='del'>-        char *lastcomp;</div><div class='del'>-        const char *toresolv;</div><div class='del'>-</div><div class='del'>-        if (!orig[0]) {</div><div class='del'>-                GFFUSE_LOGERR ("%s: invalid mountpoint '%s'", progname, orig);</div><div class='del'>-                return NULL;</div><div class='del'>-        }</div><div class='add'>+                setsid();</div><div class='add'>+                (void)chdir("/");</div><div class='add'>+                sigfillset(&amp;sigset);</div><div class='add'>+                sigprocmask(SIG_BLOCK, &amp;sigset, NULL);</div><div class='ctx'> </div><div class='del'>-        copy = strdup (orig);</div><div class='del'>-        if (copy == NULL) {</div><div class='del'>-                GFFUSE_LOGERR ("%s: failed to allocate memory", progname);</div><div class='del'>-                return NULL;</div><div class='del'>-        }</div><div class='add'>+                read (ump[0], &amp;c, 1);</div><div class='ctx'> </div><div class='del'>-        toresolv = copy;</div><div class='del'>-        lastcomp = NULL;</div><div class='del'>-        for (end = copy + strlen (copy) - 1; end &gt; copy &amp;&amp; *end == '/'; end --);</div><div class='del'>-        if (end[0] != '/') {</div><div class='del'>-                char *tmp;</div><div class='del'>-                end[1] = '\0';</div><div class='del'>-                tmp = strrchr (copy, '/');</div><div class='del'>-                if (tmp == NULL) {</div><div class='del'>-                        lastcomp = copy;</div><div class='del'>-                        toresolv = ".";</div><div class='del'>-                } else {</div><div class='del'>-                        lastcomp = tmp + 1;</div><div class='del'>-                        if (tmp == copy)</div><div class='del'>-                                toresolv = "/";</div><div class='del'>-                }</div><div class='del'>-                if (strcmp (lastcomp, ".") == 0 || strcmp (lastcomp, "..") == 0) {</div><div class='del'>-                        lastcomp = NULL;</div><div class='del'>-                        toresolv = copy;</div><div class='del'>-                }</div><div class='del'>-                else if (tmp)</div><div class='del'>-                        tmp[0] = '\0';</div><div class='add'>+                gf_fuse_unmount (mountpoint, fd);</div><div class='add'>+                exit (0);</div><div class='ctx'>         }</div><div class='del'>-        if (realpath (toresolv, buf) == NULL) {</div><div class='del'>-                GFFUSE_LOGERR ("%s: bad mount point %s: %s", progname, orig,</div><div class='del'>-                               strerror (errno));</div><div class='del'>-                FREE (copy);</div><div class='del'>-                return NULL;</div><div class='del'>-        }</div><div class='del'>-        if (lastcomp == NULL)</div><div class='del'>-                dst = strdup (buf);</div><div class='del'>-        else {</div><div class='del'>-                dst = (char *) MALLOC (strlen (buf) + 1 + strlen (lastcomp) + 1);</div><div class='del'>-                if (dst) {</div><div class='del'>-                        unsigned buflen = strlen (buf);</div><div class='del'>-                        if (buflen &amp;&amp; buf[buflen-1] == '/')</div><div class='del'>-                                sprintf (dst, "%s%s", buf, lastcomp);</div><div class='del'>-                        else</div><div class='del'>-                                sprintf (dst, "%s/%s", buf, lastcomp);</div><div class='del'>-                }</div><div class='add'>+        case -1:</div><div class='add'>+                close (fd);</div><div class='add'>+                fd = -1;</div><div class='add'>+                ret = -1;</div><div class='add'>+                close (ump[1]);</div><div class='ctx'>         }</div><div class='del'>-        FREE (copy);</div><div class='del'>-        if (dst == NULL)</div><div class='del'>-                GFFUSE_LOGERR ("%s: failed to allocate memory", progname);</div><div class='del'>-        return dst;</div><div class='add'>+        close (ump[0]);</div><div class='add'>+</div><div class='add'>+        return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-#ifndef FUSE_UTIL</div><div class='del'>-/* return value:</div><div class='del'>- * &gt;= 0         =&gt; fd</div><div class='del'>- * -1         =&gt; error</div><div class='del'>- */</div><div class='del'>-static int</div><div class='del'>-receive_fd (int fd)</div><div class='add'>+static char *</div><div class='add'>+escape (char *s)</div><div class='ctx'> {</div><div class='del'>-        struct msghdr msg;</div><div class='del'>-        struct iovec iov;</div><div class='del'>-        char buf[1];</div><div class='del'>-        int rv;</div><div class='del'>-        size_t ccmsg[CMSG_SPACE (sizeof (int)) / sizeof (size_t)];</div><div class='del'>-        struct cmsghdr *cmsg;</div><div class='del'>-</div><div class='del'>-        iov.iov_base = buf;</div><div class='del'>-        iov.iov_len = 1;</div><div class='del'>-</div><div class='del'>-        msg.msg_name = 0;</div><div class='del'>-        msg.msg_namelen = 0;</div><div class='del'>-        msg.msg_iov = &amp;iov;</div><div class='del'>-        msg.msg_iovlen = 1;</div><div class='del'>-        /* old BSD implementations should use msg_accrights instead of</div><div class='del'>-         * msg_control; the interface is different. */</div><div class='del'>-        msg.msg_control = ccmsg;</div><div class='del'>-        msg.msg_controllen = sizeof (ccmsg);</div><div class='del'>-</div><div class='del'>-        while (((rv = recvmsg (fd, &amp;msg, 0)) == -1) &amp;&amp; errno == EINTR);</div><div class='del'>-        if (rv == -1) {</div><div class='del'>-                GFFUSE_LOGERR ("recvmsg failed: %s", strerror (errno));</div><div class='del'>-                return -1;</div><div class='del'>-        }</div><div class='del'>-        if (!rv) {</div><div class='del'>-                /* EOF */</div><div class='del'>-                return -1;</div><div class='add'>+        size_t len = 0;</div><div class='add'>+        char *p = NULL;</div><div class='add'>+        char *q = NULL;</div><div class='add'>+        char *e = NULL;</div><div class='add'>+</div><div class='add'>+        for (p = s; *p; p++) {</div><div class='add'>+                if (*p == ',')</div><div class='add'>+                       len++;</div><div class='add'>+                len++;</div><div class='ctx'>         }</div><div class='ctx'> </div><div class='del'>-        cmsg = CMSG_FIRSTHDR (&amp;msg);</div><div class='del'>-        if (!cmsg-&gt;cmsg_type == SCM_RIGHTS) {</div><div class='del'>-                GFFUSE_LOGERR ("got control message of unknown type %d",</div><div class='del'>-                               cmsg-&gt;cmsg_type);</div><div class='del'>-                return -1;</div><div class='add'>+        e = CALLOC (1, len + 1);</div><div class='add'>+        if (!e)</div><div class='add'>+                return NULL;</div><div class='add'>+</div><div class='add'>+        for (p = s, q = e; *p; p++, q++) {</div><div class='add'>+                if (*p == ',') {</div><div class='add'>+                        *q = '\\';</div><div class='add'>+                        q++;</div><div class='add'>+                }</div><div class='add'>+                *q = *p;</div><div class='ctx'>         }</div><div class='del'>-        return *(int*)CMSG_DATA (cmsg);</div><div class='add'>+</div><div class='add'>+        return e;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> static int</div><div class='del'>-fuse_mount_fusermount (const char *mountpoint, const char *opts)</div><div class='add'>+fuse_mount_fusermount (const char *mountpoint, char *fsname,</div><div class='add'>+                       char *mnt_param, int fd)</div><div class='ctx'> {</div><div class='del'>-        int fds[2], pid;</div><div class='del'>-        int res;</div><div class='del'>-        int rv;</div><div class='add'>+        int  pid = -1;</div><div class='add'>+        int  res = 0;</div><div class='add'>+        int  ret = -1;</div><div class='add'>+        char *fm_mnt_params = NULL;</div><div class='add'>+        char *efsname = NULL;</div><div class='add'>+</div><div class='add'>+#ifndef GF_FUSERMOUNT</div><div class='add'>+        GFFUSE_LOGERR ("Mounting via helper utility "</div><div class='add'>+                       "(unprivileged mounting) is supported "</div><div class='add'>+                       "only if glusterfs is compiled with "</div><div class='add'>+                       "--enable-fusermount");</div><div class='add'>+        return -1;</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+        efsname = escape (fsname);</div><div class='add'>+        if (!efsname) {</div><div class='add'>+                GFFUSE_LOGERR ("Out of memory");</div><div class='ctx'> </div><div class='del'>-        res = socketpair (PF_UNIX, SOCK_STREAM, 0, fds);</div><div class='del'>-        if (res == -1) {</div><div class='del'>-                GFFUSE_LOGERR ("socketpair() failed: %s", strerror (errno));</div><div class='ctx'>                 return -1;</div><div class='ctx'>         }</div><div class='add'>+        ret = asprintf (&amp;fm_mnt_params,</div><div class='add'>+                        "%s,fsname=%s,nonempty,subtype=glusterfs",</div><div class='add'>+                        mnt_param, efsname);</div><div class='add'>+        FREE (efsname);</div><div class='add'>+        if (ret == -1) {</div><div class='add'>+                GFFUSE_LOGERR ("Out of memory");</div><div class='ctx'> </div><div class='add'>+                goto out;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        /* fork to exec fusermount */</div><div class='ctx'>         pid = fork ();</div><div class='ctx'>         if (pid == -1) {</div><div class='ctx'>                 GFFUSE_LOGERR ("fork() failed: %s", strerror (errno));</div><div class='del'>-                close (fds[0]);</div><div class='del'>-                close (fds[1]);</div><div class='del'>-                return -1;</div><div class='add'>+                ret = -1;</div><div class='add'>+                goto out;</div><div class='ctx'>         }</div><div class='ctx'> </div><div class='ctx'>         if (pid == 0) {</div><div class='hunk'>@@ -320,224 +206,197 @@ fuse_mount_fusermount (const char *mountpoint, const char *opts)</div><div class='ctx'>                 int a = 0;</div><div class='ctx'> </div><div class='ctx'>                 argv[a++] = FUSERMOUNT_PROG;</div><div class='del'>-                if (opts) {</div><div class='del'>-                        argv[a++] = "-o";</div><div class='del'>-                        argv[a++] = opts;</div><div class='del'>-                }</div><div class='add'>+                argv[a++] = "-o";</div><div class='add'>+                argv[a++] = fm_mnt_params;</div><div class='ctx'>                 argv[a++] = "--";</div><div class='ctx'>                 argv[a++] = mountpoint;</div><div class='ctx'>                 argv[a++] = NULL;</div><div class='ctx'> </div><div class='del'>-                close (fds[1]);</div><div class='del'>-                fcntl (fds[0], F_SETFD, 0);</div><div class='del'>-                snprintf (env, sizeof (env), "%i", fds[0]);</div><div class='del'>-                setenv (FUSE_COMMFD_ENV, env, 1);</div><div class='add'>+                snprintf (env, sizeof (env), "%i", fd);</div><div class='add'>+                setenv (FUSE_DEVFD_ENV, env, 1);</div><div class='ctx'>                 execvp (FUSERMOUNT_PROG, (char **)argv);</div><div class='ctx'>                 GFFUSE_LOGERR ("failed to exec fusermount: %s",</div><div class='ctx'>                                strerror (errno));</div><div class='ctx'>                 _exit (1);</div><div class='ctx'>         }</div><div class='ctx'> </div><div class='del'>-        close (fds[0]);</div><div class='del'>-        rv = receive_fd (fds[1]);</div><div class='del'>-        close (fds[1]);</div><div class='del'>-        waitpid (pid, NULL, 0); /* bury zombie */</div><div class='del'>-</div><div class='del'>-        return rv;</div><div class='add'>+        ret = waitpid (pid, &amp;res, 0);</div><div class='add'>+        ret = (ret == pid &amp;&amp; res == 0) ? 0 : -1;</div><div class='add'>+ out:</div><div class='add'>+        FREE (fm_mnt_params);</div><div class='add'>+        return ret;</div><div class='ctx'> }</div><div class='del'>-#endif</div><div class='ctx'> </div><div class='del'>-#ifndef FUSE_UTIL</div><div class='del'>-static</div><div class='del'>-#endif</div><div class='del'>-int</div><div class='del'>-fuse_mnt_umount (const char *progname, const char *abs_mnt,</div><div class='del'>-                 const char *rel_mnt, int lazy)</div><div class='add'>+#if defined(__FreeBSD__)</div><div class='add'>+void</div><div class='add'>+build_iovec(struct iovec **iov, int *iovlen, const char *name, void *val,</div><div class='add'>+            size_t len)</div><div class='ctx'> {</div><div class='del'>-        int res;</div><div class='del'>-        int status;</div><div class='del'>-        sigset_t blockmask;</div><div class='del'>-        sigset_t oldmask;</div><div class='del'>-</div><div class='del'>-        if (!mtab_needs_update (abs_mnt)) {</div><div class='del'>-                res = umount2 (rel_mnt, lazy ? 2 : 0);</div><div class='del'>-                if (res == -1)</div><div class='del'>-                        GFFUSE_LOGERR ("%s: failed to unmount %s: %s",</div><div class='del'>-                                       progname, abs_mnt, strerror (errno));</div><div class='del'>-                return res;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        sigemptyset (&amp;blockmask);</div><div class='del'>-        sigaddset (&amp;blockmask, SIGCHLD);</div><div class='del'>-        res = sigprocmask (SIG_BLOCK, &amp;blockmask, &amp;oldmask);</div><div class='del'>-        if (res == -1) {</div><div class='del'>-                GFFUSE_LOGERR ("%s: sigprocmask: %s", progname,</div><div class='del'>-                               strerror (errno));</div><div class='del'>-                return -1;</div><div class='del'>-        }</div><div class='add'>+        int i;</div><div class='add'>+        if (*iovlen &lt; 0)</div><div class='add'>+                return;</div><div class='add'>+        i = *iovlen;</div><div class='ctx'> </div><div class='del'>-        res = fork ();</div><div class='del'>-        if (res == -1) {</div><div class='del'>-                GFFUSE_LOGERR ("%s: fork: %s", progname, strerror (errno));</div><div class='del'>-                goto out_restore;</div><div class='del'>-        }</div><div class='del'>-        if (res == 0) {</div><div class='del'>-                sigprocmask (SIG_SETMASK, &amp;oldmask, NULL);</div><div class='del'>-                setuid (geteuid ());</div><div class='del'>-                execl ("/bin/umount", "/bin/umount", "-i", rel_mnt,</div><div class='del'>-                      lazy ? "-l" : NULL, NULL);</div><div class='del'>-                GFFUSE_LOGERR ("%s: failed to execute /bin/umount: %s",</div><div class='del'>-                               progname, strerror (errno));</div><div class='del'>-                exit (1);</div><div class='add'>+        *iov = realloc(*iov, sizeof **iov * (i + 2));</div><div class='add'>+        if (*iov == NULL) {</div><div class='add'>+                *iovlen = -1;</div><div class='add'>+                return;</div><div class='ctx'>         }</div><div class='del'>-        res = waitpid (res, &amp;status, 0);</div><div class='del'>-        if (res == -1)</div><div class='del'>-                GFFUSE_LOGERR ("%s: waitpid: %s", progname, strerror (errno));</div><div class='ctx'> </div><div class='del'>-        if (status != 0)</div><div class='del'>-                res = -1;</div><div class='add'>+        (*iov)[i].iov_base = strdup(name);</div><div class='add'>+        (*iov)[i].iov_len = strlen(name) + 1;</div><div class='ctx'> </div><div class='del'>- out_restore:</div><div class='del'>-        sigprocmask (SIG_SETMASK, &amp;oldmask, NULL);</div><div class='del'>-        return res;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-#ifdef FUSE_UTIL</div><div class='del'>-int</div><div class='del'>-fuse_mnt_check_empty (const char *progname, const char *mnt,</div><div class='del'>-                      mode_t rootmode, off_t rootsize)</div><div class='del'>-{</div><div class='del'>-        int isempty = 1;</div><div class='del'>-</div><div class='del'>-        if (S_ISDIR (rootmode)) {</div><div class='del'>-                struct dirent *ent;</div><div class='del'>-                DIR *dp = opendir (mnt);</div><div class='del'>-                if (dp == NULL) {</div><div class='del'>-                        fprintf (stderr,</div><div class='del'>-                                 "%s: failed to open mountpoint for reading: %s\n",</div><div class='del'>-                                 progname, strerror (errno));</div><div class='del'>-                        return -1;</div><div class='del'>-                }</div><div class='del'>-                while ((ent = readdir (dp)) != NULL) {</div><div class='del'>-                        if (strcmp (ent-&gt;d_name, ".") != 0 &amp;&amp;</div><div class='del'>-                            strcmp (ent-&gt;d_name, "..") != 0) {</div><div class='del'>-                                isempty = 0;</div><div class='del'>-                                break;</div><div class='del'>-                        }</div><div class='del'>-                }</div><div class='del'>-                closedir (dp);</div><div class='del'>-        } else if (rootsize)</div><div class='del'>-                isempty = 0;</div><div class='del'>-</div><div class='del'>-        if (!isempty) {</div><div class='del'>-                fprintf (stderr, "%s: mountpoint is not empty\n", progname);</div><div class='del'>-                fprintf (stderr, "%s: if you are sure this is safe, "</div><div class='del'>-                         "use the 'nonempty' mount option\n", progname);</div><div class='del'>-                return -1;</div><div class='add'>+        i++;</div><div class='add'>+        (*iov)[i].iov_base = val;</div><div class='add'>+        if (len == (size_t) -1) {</div><div class='add'>+                if (val != NULL)</div><div class='add'>+                        len = strlen(val) + 1;</div><div class='add'>+                else</div><div class='add'>+                        len = 0;</div><div class='ctx'>         }</div><div class='del'>-        return 0;</div><div class='add'>+        (*iov)[i].iov_len = (int)len;</div><div class='add'>+        *iovlen = ++i;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-fuse_mnt_check_fuseblk (void)</div><div class='add'>+/*</div><div class='add'>+ * This function is needed for compatibility with parameters</div><div class='add'>+ * which used to use the mount_argf() command for the old mount() syscall.</div><div class='add'>+ */</div><div class='add'>+void</div><div class='add'>+build_iovec_argf(struct iovec **iov, int *iovlen, const char *name,</div><div class='add'>+                 const char *fmt, ...)</div><div class='ctx'> {</div><div class='del'>-        char buf[256];</div><div class='del'>-        FILE *f = fopen ("/proc/filesystems", "r");</div><div class='del'>-        if (!f)</div><div class='del'>-                return 1;</div><div class='del'>-</div><div class='del'>-        while (fgets (buf, sizeof (buf), f))</div><div class='del'>-                if (strstr (buf, "fuseblk\n")) {</div><div class='del'>-                        fclose (f);</div><div class='del'>-                        return 1;</div><div class='del'>-                }</div><div class='add'>+        va_list ap;</div><div class='add'>+        char val[255] = { 0 };</div><div class='ctx'> </div><div class='del'>-        fclose (f);</div><div class='del'>-        return 0;</div><div class='add'>+        va_start(ap, fmt);</div><div class='add'>+        vsnprintf(val, sizeof(val), fmt, ap);</div><div class='add'>+        va_end(ap);</div><div class='add'>+        build_iovec(iov, iovlen, name, strdup(val), (size_t)-1);</div><div class='ctx'> }</div><div class='add'>+#endif /* __FreeBSD__ */</div><div class='add'>+</div><div class='add'>+struct mount_flags {</div><div class='add'>+        const char *opt;</div><div class='add'>+        mount_flag_t flag;</div><div class='add'>+        int on;</div><div class='add'>+} mount_flags[] = {</div><div class='add'>+        /* We provide best effort cross platform support for mount flags by</div><div class='add'>+         * defining the ones which are commonly used in Unix-like OS-es.</div><div class='add'>+         */</div><div class='add'>+        {"ro",      MS_RDONLY,      1},</div><div class='add'>+        {"nosuid",  MS_NOSUID,      1},</div><div class='add'>+        {"nodev",   MS_NODEV,       1},</div><div class='add'>+        {"noatime", MS_NOATIME,     1},</div><div class='add'>+        {"noexec",  MS_NOEXEC,      1},</div><div class='add'>+#ifdef GF_LINUX_HOST_OS</div><div class='add'>+        {"rw",      MS_RDONLY,      0},</div><div class='add'>+        {"suid",    MS_NOSUID,      0},</div><div class='add'>+        {"dev",     MS_NODEV,       0},</div><div class='add'>+        {"exec",    MS_NOEXEC,      0},</div><div class='add'>+        {"async",   MS_SYNCHRONOUS, 0},</div><div class='add'>+        {"sync",    MS_SYNCHRONOUS, 1},</div><div class='add'>+        {"atime",   MS_NOATIME,     0},</div><div class='add'>+        {"dirsync", MS_DIRSYNC,     1},</div><div class='ctx'> #endif</div><div class='add'>+        {NULL,      0,              0}</div><div class='add'>+};</div><div class='ctx'> </div><div class='del'>-#ifndef FUSE_UTIL</div><div class='del'>-void</div><div class='del'>-gf_fuse_unmount (const char *mountpoint, int fd)</div><div class='add'>+static int</div><div class='add'>+mount_param_to_flag (char *mnt_param, mount_flag_t *mntflags,</div><div class='add'>+                     char **mnt_param_new)</div><div class='ctx'> {</div><div class='del'>-        int res;</div><div class='del'>-        int pid;</div><div class='del'>-</div><div class='del'>-        if (!mountpoint)</div><div class='del'>-                return;</div><div class='del'>-</div><div class='del'>-        if (fd != -1) {</div><div class='del'>-                struct pollfd pfd;</div><div class='add'>+        gf_boolean_t found = _gf_false;</div><div class='add'>+        struct mount_flags *flag = NULL;</div><div class='add'>+        char *param_tok = NULL;</div><div class='add'>+        token_iter_t tit = {0,};</div><div class='add'>+        gf_boolean_t iter_end = _gf_false;</div><div class='add'>+</div><div class='add'>+        /* Allocate a buffer that will hold the mount parameters remaining</div><div class='add'>+         * after the ones corresponding to mount flags are processed and</div><div class='add'>+         * removed.The length of the original params are a good upper bound</div><div class='add'>+         * of the size needed.</div><div class='add'>+         */</div><div class='add'>+        *mnt_param_new = strdup (mnt_param);</div><div class='add'>+        if (!*mnt_param_new)</div><div class='add'>+                return -1;</div><div class='ctx'> </div><div class='del'>-                pfd.fd = fd;</div><div class='del'>-                pfd.events = 0;</div><div class='del'>-                res = poll (&amp;pfd, 1, 0);</div><div class='del'>-                /* If file poll returns POLLERR on the device file descriptor,</div><div class='del'>-                   then the filesystem is already unmounted */</div><div class='del'>-                if (res == 1 &amp;&amp; (pfd.revents &amp; POLLERR))</div><div class='del'>-                        return;</div><div class='add'>+        for (param_tok = token_iter_init (*mnt_param_new, ',', &amp;tit) ;;) {</div><div class='add'>+                iter_end = next_token (&amp;param_tok, &amp;tit);</div><div class='add'>+</div><div class='add'>+                found = _gf_false;</div><div class='add'>+                for (flag = mount_flags; flag-&gt;opt; flag++) {</div><div class='add'>+                        /* Compare the mount flag name to the param</div><div class='add'>+                         * name at hand.</div><div class='add'>+                         */</div><div class='add'>+                        if (strcmp (flag-&gt;opt, param_tok) == 0) {</div><div class='add'>+                                /* If there is a match, adjust mntflags</div><div class='add'>+                                 * accordingly and break.</div><div class='add'>+                                 */</div><div class='add'>+                                if (flag-&gt;on) {</div><div class='add'>+                                        *mntflags |= flag-&gt;flag;</div><div class='add'>+                                } else {</div><div class='add'>+                                        *mntflags &amp;= ~flag-&gt;flag;</div><div class='add'>+                                }</div><div class='add'>+                                found = _gf_true;</div><div class='add'>+                                break;</div><div class='add'>+                        }</div><div class='add'>+                }</div><div class='add'>+                /* Exclude flag names from new parameter list. */</div><div class='add'>+                if (found)</div><div class='add'>+                        drop_token (param_tok, &amp;tit);</div><div class='ctx'> </div><div class='del'>-                /* Need to close file descriptor, otherwise synchronous umount</div><div class='del'>-                   would recurse into filesystem, and deadlock */</div><div class='del'>-                close (fd);</div><div class='add'>+                if (iter_end)</div><div class='add'>+                        break;</div><div class='ctx'>         }</div><div class='ctx'> </div><div class='del'>-        if (geteuid () == 0) {</div><div class='del'>-                fuse_mnt_umount ("fuse", mountpoint, mountpoint, 1);</div><div class='del'>-                return;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        res = umount2 (mountpoint, 2);</div><div class='del'>-        if (res == 0)</div><div class='del'>-                return;</div><div class='del'>-</div><div class='del'>-        pid = fork ();</div><div class='del'>-        if (pid == -1)</div><div class='del'>-                return;</div><div class='del'>-</div><div class='del'>-        if (pid == 0) {</div><div class='del'>-                const char *argv[] = { FUSERMOUNT_PROG, "-u", "-q", "-z",</div><div class='del'>-                                       "--", mountpoint, NULL };</div><div class='del'>-</div><div class='del'>-                execvp (FUSERMOUNT_PROG, (char **)argv);</div><div class='del'>-                _exit (1);</div><div class='del'>-        }</div><div class='del'>-        waitpid (pid, NULL, 0);</div><div class='add'>+        return 0;</div><div class='ctx'> }</div><div class='del'>-#endif</div><div class='ctx'> </div><div class='del'>-/*</div><div class='del'>- * Functions below are loosely modelled after similar functions of libfuse</div><div class='del'>- */</div><div class='del'>-</div><div class='del'>-#ifndef FUSE_UTIL</div><div class='ctx'> static int</div><div class='del'>-fuse_mount_sys (const char *mountpoint, char *fsname, char *mnt_param)</div><div class='add'>+fuse_mount_sys (const char *mountpoint, char *fsname,</div><div class='add'>+                char *mnt_param, int fd)</div><div class='ctx'> {</div><div class='del'>-        int fd = -1, ret = -1;</div><div class='add'>+        int ret = -1;</div><div class='ctx'>         unsigned mounted = 0;</div><div class='ctx'>         char *mnt_param_mnt = NULL;</div><div class='ctx'>         char *fstype = "fuse.glusterfs";</div><div class='ctx'>         char *source = fsname;</div><div class='del'>-</div><div class='del'>-        fd = open ("/dev/fuse", O_RDWR);</div><div class='del'>-        if (fd == -1) {</div><div class='del'>-                GFFUSE_LOGERR ("cannot open /dev/fuse (%s)", strerror (errno));</div><div class='del'>-</div><div class='del'>-                return -1;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        ret = asprintf (&amp;mnt_param_mnt,</div><div class='del'>-                        "%s,fd=%i,rootmode=%o,user_id=%i,group_id=%i",</div><div class='del'>-                        mnt_param, fd, S_IFDIR, getuid (), getgid ());</div><div class='add'>+        mount_flag_t mountflags = 0;</div><div class='add'>+        char *mnt_param_new = NULL;</div><div class='add'>+</div><div class='add'>+        ret = mount_param_to_flag (mnt_param, &amp;mountflags, &amp;mnt_param_new);</div><div class='add'>+        if (ret == 0)</div><div class='add'>+                ret = asprintf (&amp;mnt_param_mnt,</div><div class='add'>+                                "%s,fd=%i,rootmode=%o,user_id=%i,group_id=%i",</div><div class='add'>+                                mnt_param_new, fd, S_IFDIR, getuid (),</div><div class='add'>+                                getgid ());</div><div class='ctx'>         if (ret == -1) {</div><div class='ctx'>                 GFFUSE_LOGERR ("Out of memory");</div><div class='ctx'> </div><div class='ctx'>                 goto out;</div><div class='ctx'>         }</div><div class='del'>-        ret = mount (source, mountpoint, fstype, 0,</div><div class='add'>+</div><div class='add'>+#ifdef __FreeBSD__</div><div class='add'>+        struct iovec *iov = NULL;</div><div class='add'>+        int iovlen = 0;</div><div class='add'>+        char fdstr[15];</div><div class='add'>+        sprintf (fdstr, "%d", fd);</div><div class='add'>+</div><div class='add'>+        build_iovec (&amp;iov, &amp;iovlen, "fstype", "fusefs", -1);</div><div class='add'>+        build_iovec (&amp;iov, &amp;iovlen, "subtype", "glusterfs", -1);</div><div class='add'>+        build_iovec (&amp;iov, &amp;iovlen, "fspath", __DECONST(void *, mountpoint),</div><div class='add'>+                     -1);</div><div class='add'>+        build_iovec (&amp;iov, &amp;iovlen, "from", "/dev/fuse", -1);</div><div class='add'>+        build_iovec (&amp;iov, &amp;iovlen, "volname", source, -1);</div><div class='add'>+        build_iovec (&amp;iov, &amp;iovlen, "fd", fdstr, -1);</div><div class='add'>+        build_iovec (&amp;iov, &amp;iovlen, "allow_other", NULL, -1);</div><div class='add'>+        ret = nmount (iov, iovlen, mountflags);</div><div class='add'>+#else</div><div class='add'>+        ret = mount (source, mountpoint, fstype, mountflags,</div><div class='ctx'>                      mnt_param_mnt);</div><div class='add'>+#endif /* __FreeBSD__ */</div><div class='add'>+#ifdef GF_LINUX_HOST_OS</div><div class='ctx'>         if (ret == -1 &amp;&amp; errno == ENODEV) {</div><div class='ctx'>                 /* fs subtype support was added by 79c0b2df aka</div><div class='ctx'>                    v2.6.21-3159-g79c0b2d. Probably we have an</div><div class='hunk'>@@ -549,16 +408,19 @@ fuse_mount_sys (const char *mountpoint, char *fsname, char *mnt_param)</div><div class='ctx'> </div><div class='ctx'>                         goto out;</div><div class='ctx'>                 }</div><div class='del'>-                ret = mount (source, mountpoint, fstype, 0,</div><div class='add'>+                ret = mount (source, mountpoint, fstype, mountflags,</div><div class='ctx'>                              mnt_param_mnt);</div><div class='ctx'>         }</div><div class='add'>+#endif /* GF_LINUX_HOST_OS */</div><div class='ctx'>         if (ret == -1)</div><div class='ctx'>                 goto out;</div><div class='ctx'>         else</div><div class='ctx'>                 mounted = 1;</div><div class='ctx'> </div><div class='add'>+#ifdef GF_LINUX_HOST_OS</div><div class='ctx'>         if (geteuid () == 0) {</div><div class='ctx'>                 char *newmnt = fuse_mnt_resolve_path ("fuse", mountpoint);</div><div class='add'>+                char *mnt_param_mtab = NULL;</div><div class='ctx'> </div><div class='ctx'>                 if (!newmnt) {</div><div class='ctx'>                         ret = -1;</div><div class='hunk'>@@ -566,8 +428,17 @@ fuse_mount_sys (const char *mountpoint, char *fsname, char *mnt_param)</div><div class='ctx'>                         goto out;</div><div class='ctx'>                 }</div><div class='ctx'> </div><div class='del'>-                ret = fuse_mnt_add_mount ("fuse", source, newmnt, fstype,</div><div class='del'>-                                          mnt_param);</div><div class='add'>+                ret = asprintf (&amp;mnt_param_mtab, "%s%s",</div><div class='add'>+                                mountflags &amp; MS_RDONLY ? "ro," : "",</div><div class='add'>+                                mnt_param_new);</div><div class='add'>+                if (ret == -1)</div><div class='add'>+                        GFFUSE_LOGERR ("Out of memory");</div><div class='add'>+                else {</div><div class='add'>+                        ret = fuse_mnt_add_mount ("fuse", source, newmnt,</div><div class='add'>+                                                  fstype, mnt_param_mtab);</div><div class='add'>+                        FREE (mnt_param_mtab);</div><div class='add'>+                }</div><div class='add'>+</div><div class='ctx'>                 FREE (newmnt);</div><div class='ctx'>                 if (ret == -1) {</div><div class='ctx'>                         GFFUSE_LOGERR ("failed to add mtab entry");</div><div class='hunk'>@@ -575,58 +446,81 @@ fuse_mount_sys (const char *mountpoint, char *fsname, char *mnt_param)</div><div class='ctx'>                         goto out;</div><div class='ctx'>                 }</div><div class='ctx'>         }</div><div class='add'>+#endif /* GF_LINUX_HOST_OS */</div><div class='ctx'> </div><div class='del'>- out:</div><div class='add'>+out:</div><div class='ctx'>         if (ret == -1) {</div><div class='add'>+                GFFUSE_LOGERR("ret = -1\n");</div><div class='ctx'>                 if (mounted)</div><div class='ctx'>                         umount2 (mountpoint, 2); /* lazy umount */</div><div class='del'>-                close (fd);</div><div class='del'>-                fd = -1;</div><div class='ctx'>         }</div><div class='ctx'>         FREE (mnt_param_mnt);</div><div class='add'>+        FREE (mnt_param_new);</div><div class='ctx'>         if (source != fsname)</div><div class='ctx'>                 FREE (source);</div><div class='del'>-        return fd;</div><div class='add'>+</div><div class='add'>+        return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-gf_fuse_mount (const char *mountpoint, char *fsname, char *mnt_param)</div><div class='add'>+gf_fuse_mount (const char *mountpoint, char *fsname,</div><div class='add'>+               char *mnt_param, pid_t *mnt_pid, int status_fd)</div><div class='ctx'> {</div><div class='del'>-        int fd = -1, rv = -1;</div><div class='del'>-        char *fm_mnt_params = NULL, *p = NULL;</div><div class='add'>+        int   fd  = -1;</div><div class='add'>+        pid_t pid = -1;</div><div class='add'>+        int   ret = -1;</div><div class='ctx'> </div><div class='del'>-        fd = fuse_mount_sys (mountpoint, fsname, mnt_param);</div><div class='add'>+        fd = open ("/dev/fuse", O_RDWR);</div><div class='ctx'>         if (fd == -1) {</div><div class='del'>-                gf_log ("glusterfs-fuse", GF_LOG_NORMAL,</div><div class='del'>-                        "direct mount failed (%s), "</div><div class='del'>-                        "retry to mount via fusermount",</div><div class='del'>-                        strerror (errno));</div><div class='del'>-</div><div class='del'>-                rv = asprintf (&amp;fm_mnt_params,</div><div class='del'>-                               "%s,fsname=%s,nonempty,subtype=glusterfs",</div><div class='del'>-                               mnt_param, fsname);</div><div class='del'>-</div><div class='del'>-                if (rv == -1) {</div><div class='del'>-                        GFFUSE_LOGERR ("Out of memory");</div><div class='add'>+                GFFUSE_LOGERR ("cannot open /dev/fuse (%s)",</div><div class='add'>+                                strerror (errno));</div><div class='add'>+                return -1;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-                        return -1;</div><div class='add'>+        /* start mount agent */</div><div class='add'>+        pid = fork();</div><div class='add'>+        switch (pid) {</div><div class='add'>+        case 0:</div><div class='add'>+                /* hello it's mount agent */</div><div class='add'>+                if (!mnt_pid) {</div><div class='add'>+                        /* daemonize mount agent, caller is</div><div class='add'>+                         * not interested in waiting for it</div><div class='add'>+                         */</div><div class='add'>+                        pid = fork ();</div><div class='add'>+                        if (pid)</div><div class='add'>+                                exit (pid == -1 ? 1 : 0);</div><div class='ctx'>                 }</div><div class='ctx'> </div><div class='del'>-                fd = fuse_mount_fusermount (mountpoint, fm_mnt_params);</div><div class='del'>-                if (fd == -1) {</div><div class='del'>-                        p = fm_mnt_params + strlen (fm_mnt_params);</div><div class='del'>-                        while (*--p != ',');</div><div class='del'>-                        *p = '\0';</div><div class='add'>+                ret = fuse_mount_sys (mountpoint, fsname, mnt_param, fd);</div><div class='add'>+                if (ret == -1) {</div><div class='add'>+                        gf_log ("glusterfs-fuse", GF_LOG_INFO,</div><div class='add'>+                                "direct mount failed (%s) errno %d",</div><div class='add'>+                                strerror (errno), errno);</div><div class='ctx'> </div><div class='del'>-                        fd = fuse_mount_fusermount (mountpoint, fm_mnt_params);</div><div class='add'>+                        if (errno == EPERM) {</div><div class='add'>+                                gf_log ("glusterfs-fuse", GF_LOG_INFO,</div><div class='add'>+                                        "retry to mount via fusermount");</div><div class='add'>+</div><div class='add'>+                                ret = fuse_mount_fusermount (mountpoint, fsname,</div><div class='add'>+                                                             mnt_param, fd);</div><div class='add'>+                        }</div><div class='ctx'>                 }</div><div class='ctx'> </div><div class='del'>-                FREE (fm_mnt_params);</div><div class='add'>+                if (ret == -1)</div><div class='add'>+                        GFFUSE_LOGERR ("mount of %s to %s (%s) failed",</div><div class='add'>+                                       fsname, mountpoint, mnt_param);</div><div class='ctx'> </div><div class='del'>-                if (fd == -1)</div><div class='del'>-                       GFFUSE_LOGERR ("mount failed");</div><div class='add'>+                if (status_fd &gt;= 0)</div><div class='add'>+                        (void)write (status_fd, &amp;ret, sizeof (ret));</div><div class='add'>+                exit (!!ret);</div><div class='add'>+                /* bye mount agent */</div><div class='add'>+        case -1:</div><div class='add'>+                close (fd);</div><div class='add'>+                fd = -1;</div><div class='ctx'>         }</div><div class='ctx'> </div><div class='add'>+        if (mnt_pid)</div><div class='add'>+               *mnt_pid = pid;</div><div class='add'>+</div><div class='ctx'>         return fd;</div><div class='ctx'> }</div><div class='del'>-#endif</div><div class='head'>diff --git a/contrib/fuse-util/Makefile.am b/contrib/fuse-util/Makefile.am<br/>index 42609a6883d..abbc10eb6d9 100644<br/>--- a/<a href='/cgit/glusterfs.git/tree/contrib/fuse-util/Makefile.am?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>contrib/fuse-util/Makefile.am</a><br/>+++ b/<a href='/cgit/glusterfs.git/tree/contrib/fuse-util/Makefile.am?id=d1d7a6f35c816822fab51c820e25023863c239c1'>contrib/fuse-util/Makefile.am</a></div><div class='hunk'>@@ -1,9 +1,11 @@</div><div class='ctx'> bin_PROGRAMS = fusermount-glusterfs</div><div class='ctx'> </div><div class='del'>-fusermount_glusterfs_SOURCES = fusermount.c $(CONTRIBDIR)/fuse-lib/mount.c</div><div class='del'>-noinst_HEADERS = mount_util.h</div><div class='add'>+fusermount_glusterfs_SOURCES = fusermount.c mount_util.c $(CONTRIBDIR)/fuse-lib/mount-common.c</div><div class='add'>+noinst_HEADERS = $(CONTRIBDIR)/fuse-include/mount_util.h</div><div class='ctx'> </div><div class='del'>-AM_CFLAGS = -Wall -D_FILE_OFFSET_BITS=64 -DFUSE_UTIL $(GF_CFLAGS)</div><div class='add'>+AM_CPPFLAGS = $(GF_CPPFLAGS) -DFUSE_UTIL -I$(CONTRIBDIR)/fuse-include -I$(CONTRIBDIR)/fuse-lib</div><div class='add'>+</div><div class='add'>+AM_CFLAGS = -Wall $(GF_CFLAGS)</div><div class='ctx'> </div><div class='ctx'> install-exec-hook:</div><div class='ctx'> 	-chown root $(DESTDIR)$(bindir)/fusermount-glusterfs</div><div class='head'>diff --git a/contrib/fuse-util/fusermount.c b/contrib/fuse-util/fusermount.c<br/>index ae779d3fb21..ff743f75a21 100644<br/>--- a/<a href='/cgit/glusterfs.git/tree/contrib/fuse-util/fusermount.c?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>contrib/fuse-util/fusermount.c</a><br/>+++ b/<a href='/cgit/glusterfs.git/tree/contrib/fuse-util/fusermount.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>contrib/fuse-util/fusermount.c</a></div><div class='hunk'>@@ -10,6 +10,11 @@</div><div class='ctx'> #include &lt;config.h&gt;</div><div class='ctx'> </div><div class='ctx'> #include "mount_util.h"</div><div class='add'>+</div><div class='add'>+#ifndef HAVE_UMOUNT2</div><div class='add'>+#include "mount-gluster-compat.h"</div><div class='add'>+#endif</div><div class='add'>+</div><div class='ctx'> #include &lt;stdio.h&gt;</div><div class='ctx'> #include &lt;stdlib.h&gt;</div><div class='ctx'> #include &lt;string.h&gt;</div><div class='hunk'>@@ -19,15 +24,24 @@</div><div class='ctx'> #include &lt;errno.h&gt;</div><div class='ctx'> #include &lt;fcntl.h&gt;</div><div class='ctx'> #include &lt;pwd.h&gt;</div><div class='add'>+#include &lt;limits.h&gt;</div><div class='add'>+#if !defined(__NetBSD__) &amp;&amp; !defined(GF_DARWIN_HOST_OS)</div><div class='ctx'> #include &lt;mntent.h&gt;</div><div class='add'>+#endif /* __NetBSD__ */</div><div class='ctx'> #include &lt;sys/wait.h&gt;</div><div class='ctx'> #include &lt;sys/stat.h&gt;</div><div class='del'>-#include &lt;sys/mount.h&gt;</div><div class='add'>+#ifdef HAVE_SET_FSID</div><div class='ctx'> #include &lt;sys/fsuid.h&gt;</div><div class='add'>+#endif</div><div class='add'>+#ifdef GF_DARWIN_HOST_OS</div><div class='add'>+#include &lt;sys/param.h&gt;</div><div class='add'>+#endif</div><div class='add'>+#include &lt;sys/mount.h&gt;</div><div class='ctx'> #include &lt;sys/socket.h&gt;</div><div class='ctx'> #include &lt;sys/utsname.h&gt;</div><div class='ctx'> #include &lt;sched.h&gt;</div><div class='ctx'> </div><div class='add'>+#define FUSE_DEVFD_ENV		"_FUSE_DEVFD"</div><div class='ctx'> #define FUSE_COMMFD_ENV		"_FUSE_COMMFD"</div><div class='ctx'> </div><div class='ctx'> #define FUSE_DEV_OLD "/proc/fs/fuse/dev"</div><div class='hunk'>@@ -61,22 +75,32 @@ static const char *get_user_name(void)</div><div class='ctx'> 	}</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+#ifdef HAVE_SET_FSID</div><div class='ctx'> static uid_t oldfsuid;</div><div class='ctx'> static gid_t oldfsgid;</div><div class='add'>+#endif</div><div class='ctx'> </div><div class='ctx'> static void drop_privs(void)</div><div class='ctx'> {</div><div class='ctx'> 	if (getuid() != 0) {</div><div class='add'>+#ifdef HAVE_SET_FSID</div><div class='ctx'> 		oldfsuid = setfsuid(getuid());</div><div class='ctx'> 		oldfsgid = setfsgid(getgid());</div><div class='add'>+#else</div><div class='add'>+		fprintf(stderr, "%s: Implement alternative setfsuid/gid \n", progname);</div><div class='add'>+#endif</div><div class='ctx'> 	}</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> static void restore_privs(void)</div><div class='ctx'> {</div><div class='ctx'> 	if (getuid() != 0) {</div><div class='add'>+#ifdef HAVE_SET_FSID</div><div class='ctx'> 		setfsuid(oldfsuid);</div><div class='ctx'> 		setfsgid(oldfsgid);</div><div class='add'>+#else</div><div class='add'>+		fprintf(stderr, "%s: Implement alternative setfsuid/gid \n", progname);</div><div class='add'>+#endif</div><div class='ctx'> 	}</div><div class='ctx'> }</div><div class='ctx'> </div><div class='hunk'>@@ -114,8 +138,16 @@ static int lock_umount(void)</div><div class='ctx'> </div><div class='ctx'> static void unlock_umount(int mtablock)</div><div class='ctx'> {</div><div class='del'>-	lockf(mtablock, F_ULOCK, 0);</div><div class='del'>-	close(mtablock);</div><div class='add'>+	if (mtablock &gt;= 0) {</div><div class='add'>+		int res;</div><div class='add'>+</div><div class='add'>+		res = lockf(mtablock, F_ULOCK, 0);</div><div class='add'>+		if (res &lt; 0) {</div><div class='add'>+			fprintf(stderr, "%s: error releasing lock: %s\n",</div><div class='add'>+				progname, strerror(errno));</div><div class='add'>+		}</div><div class='add'>+		close(mtablock);</div><div class='add'>+	}</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> static int add_mount(const char *source, const char *mnt, const char *type,</div><div class='hunk'>@@ -238,7 +270,7 @@ static int check_is_mount_child(void *p)</div><div class='ctx'> 	}</div><div class='ctx'> </div><div class='ctx'> 	count = 0;</div><div class='del'>-	while ((entp = getmntent(fp)) != NULL)</div><div class='add'>+	while (getmntent(fp) != NULL)</div><div class='ctx'> 		count++;</div><div class='ctx'> 	endmntent(fp);</div><div class='ctx'> </div><div class='hunk'>@@ -325,7 +357,7 @@ static int check_is_mount(const char *last, const char *mnt)</div><div class='ctx'> 	return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-static int chdir_to_parent(char *copy, const char **lastp, int *currdir_fd)</div><div class='add'>+static int chdir_to_parent(char *copy, const char **lastp)</div><div class='ctx'> {</div><div class='ctx'> 	char *tmp;</div><div class='ctx'> 	const char *parent;</div><div class='hunk'>@@ -350,14 +382,6 @@ static int chdir_to_parent(char *copy, const char **lastp, int *currdir_fd)</div><div class='ctx'> 		parent = "/";</div><div class='ctx'> 	}</div><div class='ctx'> </div><div class='del'>-	*currdir_fd = open(".", O_RDONLY);</div><div class='del'>-	if (*currdir_fd == -1) {</div><div class='del'>-		fprintf(stderr,</div><div class='del'>-			"%s: failed to open current directory: %s\n",</div><div class='del'>-			progname, strerror(errno));</div><div class='del'>-		return -1;</div><div class='del'>-	}</div><div class='del'>-</div><div class='ctx'> 	res = chdir(parent);</div><div class='ctx'> 	if (res == -1) {</div><div class='ctx'> 		fprintf(stderr, "%s: failed to chdir to %s: %s\n",</div><div class='hunk'>@@ -382,7 +406,6 @@ static int chdir_to_parent(char *copy, const char **lastp, int *currdir_fd)</div><div class='ctx'> </div><div class='ctx'> static int unmount_fuse_locked(const char *mnt, int quiet, int lazy)</div><div class='ctx'> {</div><div class='del'>-	int currdir_fd = -1;</div><div class='ctx'> 	char *copy;</div><div class='ctx'> 	const char *last;</div><div class='ctx'> 	int res;</div><div class='hunk'>@@ -399,7 +422,7 @@ static int unmount_fuse_locked(const char *mnt, int quiet, int lazy)</div><div class='ctx'> 		return -1;</div><div class='ctx'> 	}</div><div class='ctx'> </div><div class='del'>-	res = chdir_to_parent(copy, &amp;last, &amp;currdir_fd);</div><div class='add'>+	res = chdir_to_parent(copy, &amp;last);</div><div class='ctx'> 	if (res == -1)</div><div class='ctx'> 		goto out;</div><div class='ctx'> </div><div class='hunk'>@@ -411,10 +434,6 @@ static int unmount_fuse_locked(const char *mnt, int quiet, int lazy)</div><div class='ctx'> </div><div class='ctx'> out:</div><div class='ctx'> 	free(copy);</div><div class='del'>-	if (currdir_fd != -1) {</div><div class='del'>-		fchdir(currdir_fd);</div><div class='del'>-		close(currdir_fd);</div><div class='del'>-	}</div><div class='ctx'> </div><div class='ctx'> 	return res;</div><div class='ctx'> }</div><div class='hunk'>@@ -501,20 +520,22 @@ static void parse_line(char *line, int linenum)</div><div class='ctx'> </div><div class='ctx'> static void read_conf(void)</div><div class='ctx'> {</div><div class='add'>+	int  len;</div><div class='ctx'> 	FILE *fp = fopen(FUSE_CONF, "r");</div><div class='ctx'> 	if (fp != NULL) {</div><div class='ctx'> 		int linenum = 1;</div><div class='ctx'> 		char line[256];</div><div class='ctx'> 		int isnewline = 1;</div><div class='ctx'> 		while (fgets(line, sizeof(line), fp) != NULL) {</div><div class='add'>+			len = strlen (line);</div><div class='ctx'> 			if (isnewline) {</div><div class='del'>-				if (line[strlen(line)-1] == '\n') {</div><div class='add'>+				if (len &amp;&amp; line[len-1] == '\n') {</div><div class='ctx'> 					strip_line(line);</div><div class='ctx'> 					parse_line(line, linenum);</div><div class='ctx'> 				} else {</div><div class='ctx'> 					isnewline = 0;</div><div class='ctx'> 				}</div><div class='del'>-			} else if(line[strlen(line)-1] == '\n') {</div><div class='add'>+			} else if (len &amp;&amp; line[len-1] == '\n') {</div><div class='ctx'> 				fprintf(stderr, "%s: reading %s: line %i too long\n", progname, FUSE_CONF, linenum);</div><div class='ctx'> </div><div class='ctx'> 				isnewline = 1;</div><div class='hunk'>@@ -609,7 +630,7 @@ static int add_option(char **optsp, const char *opt, unsigned expand)</div><div class='ctx'> static int get_mnt_opts(int flags, char *opts, char **mnt_optsp)</div><div class='ctx'> {</div><div class='ctx'> 	int i;</div><div class='del'>-	int l;</div><div class='add'>+	size_t l;</div><div class='ctx'> </div><div class='ctx'> 	if (!(flags &amp; MS_RDONLY) &amp;&amp; add_option(mnt_optsp, "rw", 0) == -1)</div><div class='ctx'> 		return -1;</div><div class='hunk'>@@ -624,7 +645,7 @@ static int get_mnt_opts(int flags, char *opts, char **mnt_optsp)</div><div class='ctx'> 		return -1;</div><div class='ctx'> 	/* remove comma from end of opts*/</div><div class='ctx'> 	l = strlen(*mnt_optsp);</div><div class='del'>-	if ((*mnt_optsp)[l-1] == ',')</div><div class='add'>+	if (l &amp;&amp; (*mnt_optsp)[l-1] == ',')</div><div class='ctx'> 		(*mnt_optsp)[l-1] = '\0';</div><div class='ctx'> 	if (getuid() != 0) {</div><div class='ctx'> 		const char *user = get_user_name();</div><div class='hunk'>@@ -649,18 +670,26 @@ static int opt_eq(const char *s, unsigned len, const char *opt)</div><div class='ctx'> static int get_string_opt(const char *s, unsigned len, const char *opt,</div><div class='ctx'> 			  char **val)</div><div class='ctx'> {</div><div class='add'>+	int i;</div><div class='ctx'> 	unsigned opt_len = strlen(opt);</div><div class='add'>+	char *d;</div><div class='ctx'> </div><div class='del'>-	if (*val)</div><div class='del'>-		free(*val);</div><div class='add'>+	free(*val);</div><div class='ctx'> 	*val = (char *) malloc(len - opt_len + 1);</div><div class='ctx'> 	if (!*val) {</div><div class='ctx'> 		fprintf(stderr, "%s: failed to allocate memory\n", progname);</div><div class='ctx'> 		return 0;</div><div class='ctx'> 	}</div><div class='ctx'> </div><div class='del'>-	memcpy(*val, s + opt_len, len - opt_len);</div><div class='del'>-	(*val)[len - opt_len] = '\0';</div><div class='add'>+	d = *val;</div><div class='add'>+	s += opt_len;</div><div class='add'>+	len -= opt_len;</div><div class='add'>+	for (i = 0; i &lt; len; i++) {</div><div class='add'>+		if (s[i] == '\\' &amp;&amp; i + 1 &lt; len)</div><div class='add'>+			i++;</div><div class='add'>+		*d++ = s[i];</div><div class='add'>+	}</div><div class='add'>+	*d = '\0';</div><div class='ctx'> 	return 1;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='hunk'>@@ -691,7 +720,12 @@ static int do_mount(const char *mnt, char **typep, mode_t rootmode,</div><div class='ctx'> 		unsigned len;</div><div class='ctx'> 		const char *fsname_str = "fsname=";</div><div class='ctx'> 		const char *subtype_str = "subtype=";</div><div class='del'>-		for (len = 0; s[len] &amp;&amp; s[len] != ','; len++);</div><div class='add'>+		for (len = 0; s[len]; len++) {</div><div class='add'>+			if (s[len] == '\\' &amp;&amp; s[len + 1])</div><div class='add'>+				len++;</div><div class='add'>+			else if (s[len] == ',')</div><div class='add'>+				break;</div><div class='add'>+		}</div><div class='ctx'> 		if (begins_with(s, fsname_str)) {</div><div class='ctx'> 			if (!get_string_opt(s, len, fsname_str, &amp;fsname))</div><div class='ctx'> 				goto err;</div><div class='hunk'>@@ -809,15 +843,14 @@ static int do_mount(const char *mnt, char **typep, mode_t rootmode,</div><div class='ctx'> 			fprintf(stderr, "%s: mount failed: %s\n", progname,</div><div class='ctx'> 				strerror(errno_save));</div><div class='ctx'> 		goto err;</div><div class='del'>-	} else {</div><div class='del'>-		*sourcep = source;</div><div class='del'>-		*typep = type;</div><div class='del'>-		*mnt_optsp = mnt_opts;</div><div class='ctx'> 	}</div><div class='add'>+	*sourcep = source;</div><div class='add'>+	*typep = type;</div><div class='add'>+	*mnt_optsp = mnt_opts;</div><div class='ctx'> 	free(fsname);</div><div class='ctx'> 	free(optbuf);</div><div class='ctx'> </div><div class='del'>-	return res;</div><div class='add'>+	return 0;</div><div class='ctx'> </div><div class='ctx'> err:</div><div class='ctx'> 	free(fsname);</div><div class='hunk'>@@ -860,8 +893,7 @@ static int check_version(const char *dev)</div><div class='ctx'> 	return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-static int check_perm(const char **mntp, struct stat *stbuf, int *currdir_fd,</div><div class='del'>-		      int *mountpoint_fd)</div><div class='add'>+static int check_perm(const char **mntp, struct stat *stbuf, int *mountpoint_fd)</div><div class='ctx'> {</div><div class='ctx'> 	int res;</div><div class='ctx'> 	const char *mnt = *mntp;</div><div class='hunk'>@@ -879,13 +911,6 @@ static int check_perm(const char **mntp, struct stat *stbuf, int *currdir_fd,</div><div class='ctx'> 		return 0;</div><div class='ctx'> </div><div class='ctx'> 	if (S_ISDIR(stbuf-&gt;st_mode)) {</div><div class='del'>-		*currdir_fd = open(".", O_RDONLY);</div><div class='del'>-		if (*currdir_fd == -1) {</div><div class='del'>-			fprintf(stderr,</div><div class='del'>-				"%s: failed to open current directory: %s\n",</div><div class='del'>-				progname, strerror(errno));</div><div class='del'>-			return -1;</div><div class='del'>-		}</div><div class='ctx'> 		res = chdir(mnt);</div><div class='ctx'> 		if (res == -1) {</div><div class='ctx'> 			fprintf(stderr,</div><div class='hunk'>@@ -1002,8 +1027,36 @@ static int open_fuse_device(char **devp)</div><div class='ctx'> 	return -1;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+static int check_fuse_device(char *devfd, char **devp)</div><div class='add'>+{</div><div class='add'>+	int res;</div><div class='add'>+	char *devlink;</div><div class='ctx'> </div><div class='del'>-static int mount_fuse(const char *mnt, const char *opts)</div><div class='add'>+	res = asprintf(&amp;devlink, "/proc/self/fd/%s", devfd);</div><div class='add'>+	if (res == -1) {</div><div class='add'>+		fprintf(stderr, "%s: failed to allocate memory\n", progname);</div><div class='add'>+		return -1;</div><div class='add'>+	}</div><div class='add'>+</div><div class='add'>+	*devp = (char *) calloc(1, PATH_MAX + 1);</div><div class='add'>+	if (!*devp) {</div><div class='add'>+		fprintf(stderr, "%s: failed to allocate memory\n", progname);</div><div class='add'>+		free(devlink);</div><div class='add'>+		return -1;</div><div class='add'>+	}</div><div class='add'>+</div><div class='add'>+	res = readlink (devlink, *devp, PATH_MAX);</div><div class='add'>+	free (devlink);</div><div class='add'>+	if (res == -1) {</div><div class='add'>+		fprintf(stderr, "%s: specified fuse fd is invalid\n",</div><div class='add'>+			progname);</div><div class='add'>+		return -1;</div><div class='add'>+	}</div><div class='add'>+</div><div class='add'>+	return atoi(devfd);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int mount_fuse(const char *mnt, const char *opts, char *devfd)</div><div class='ctx'> {</div><div class='ctx'> 	int res;</div><div class='ctx'> 	int fd;</div><div class='hunk'>@@ -1013,10 +1066,9 @@ static int mount_fuse(const char *mnt, const char *opts)</div><div class='ctx'> 	char *source = NULL;</div><div class='ctx'> 	char *mnt_opts = NULL;</div><div class='ctx'> 	const char *real_mnt = mnt;</div><div class='del'>-	int currdir_fd = -1;</div><div class='ctx'> 	int mountpoint_fd = -1;</div><div class='ctx'> </div><div class='del'>-	fd = open_fuse_device(&amp;dev);</div><div class='add'>+	fd = devfd ? check_fuse_device(devfd, &amp;dev) : open_fuse_device(&amp;dev);</div><div class='ctx'> 	if (fd == -1)</div><div class='ctx'> 		return -1;</div><div class='ctx'> </div><div class='hunk'>@@ -1027,15 +1079,13 @@ static int mount_fuse(const char *mnt, const char *opts)</div><div class='ctx'> 		int mount_count = count_fuse_fs();</div><div class='ctx'> 		if (mount_count &gt;= mount_max) {</div><div class='ctx'> 			fprintf(stderr, "%s: too many FUSE filesystems mounted; mount_max=N can be set in /etc/fuse.conf\n", progname);</div><div class='del'>-			close(fd);</div><div class='del'>-			return -1;</div><div class='add'>+			goto fail_close_fd;</div><div class='ctx'> 		}</div><div class='ctx'> 	}</div><div class='ctx'> </div><div class='ctx'> 	res = check_version(dev);</div><div class='ctx'> 	if (res != -1) {</div><div class='del'>-		res = check_perm(&amp;real_mnt, &amp;stbuf, &amp;currdir_fd,</div><div class='del'>-				 &amp;mountpoint_fd);</div><div class='add'>+		res = check_perm(&amp;real_mnt, &amp;stbuf, &amp;mountpoint_fd);</div><div class='ctx'> 		restore_privs();</div><div class='ctx'> 		if (res != -1)</div><div class='ctx'> 			res = do_mount(real_mnt, &amp;type, stbuf.st_mode &amp; S_IFMT,</div><div class='hunk'>@@ -1044,33 +1094,38 @@ static int mount_fuse(const char *mnt, const char *opts)</div><div class='ctx'> 	} else</div><div class='ctx'> 		restore_privs();</div><div class='ctx'> </div><div class='del'>-	if (currdir_fd != -1) {</div><div class='del'>-		fchdir(currdir_fd);</div><div class='del'>-		close(currdir_fd);</div><div class='del'>-	}</div><div class='ctx'> 	if (mountpoint_fd != -1)</div><div class='ctx'> 		close(mountpoint_fd);</div><div class='ctx'> </div><div class='add'>+	if (res == -1)</div><div class='add'>+		goto fail_close_fd;</div><div class='add'>+</div><div class='add'>+	res = chdir("/");</div><div class='ctx'> 	if (res == -1) {</div><div class='del'>-		close(fd);</div><div class='del'>-		return -1;</div><div class='add'>+		fprintf(stderr, "%s: failed to chdir to '/'\n", progname);</div><div class='add'>+		goto fail_close_fd;</div><div class='ctx'> 	}</div><div class='ctx'> </div><div class='ctx'> 	if (geteuid() == 0) {</div><div class='ctx'> 		res = add_mount(source, mnt, type, mnt_opts);</div><div class='ctx'> 		if (res == -1) {</div><div class='del'>-			umount2(mnt, 2); /* lazy umount */</div><div class='del'>-			close(fd);</div><div class='del'>-			return -1;</div><div class='add'>+			/* Can't clean up mount in a non-racy way */</div><div class='add'>+			goto fail_close_fd;</div><div class='ctx'> 		}</div><div class='ctx'> 	}</div><div class='ctx'> </div><div class='add'>+out_free:</div><div class='ctx'> 	free(source);</div><div class='ctx'> 	free(type);</div><div class='ctx'> 	free(mnt_opts);</div><div class='ctx'> 	free(dev);</div><div class='ctx'> </div><div class='ctx'> 	return fd;</div><div class='add'>+</div><div class='add'>+fail_close_fd:</div><div class='add'>+	close(fd);</div><div class='add'>+	fd = -1;</div><div class='add'>+	goto out_free;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> static int send_fd(int sock_fd, int fd)</div><div class='hunk'>@@ -1140,6 +1195,7 @@ int main(int argc, char *argv[])</div><div class='ctx'> 	static int unmount = 0;</div><div class='ctx'> 	static int lazy = 0;</div><div class='ctx'> 	static int quiet = 0;</div><div class='add'>+	char *devfd;</div><div class='ctx'> 	char *commfd;</div><div class='ctx'> 	int cfd;</div><div class='ctx'> 	const char *opts = "";</div><div class='hunk'>@@ -1208,6 +1264,13 @@ int main(int argc, char *argv[])</div><div class='ctx'> </div><div class='ctx'> 	drop_privs();</div><div class='ctx'> 	mnt = fuse_mnt_resolve_path(progname, origmnt);</div><div class='add'>+	if (mnt != NULL) {</div><div class='add'>+		res = chdir("/");</div><div class='add'>+		if (res == -1) {</div><div class='add'>+			fprintf(stderr, "%s: failed to chdir to '/'\n", progname);</div><div class='add'>+			exit(1);</div><div class='add'>+		}</div><div class='add'>+	}</div><div class='ctx'> 	restore_privs();</div><div class='ctx'> 	if (mnt == NULL)</div><div class='ctx'> 		exit(1);</div><div class='hunk'>@@ -1228,21 +1291,26 @@ int main(int argc, char *argv[])</div><div class='ctx'> 		return 0;</div><div class='ctx'> 	}</div><div class='ctx'> </div><div class='del'>-	commfd = getenv(FUSE_COMMFD_ENV);</div><div class='del'>-	if (commfd == NULL) {</div><div class='del'>-		fprintf(stderr, "%s: old style mounting not supported\n",</div><div class='del'>-			progname);</div><div class='del'>-		exit(1);</div><div class='add'>+	devfd = getenv(FUSE_DEVFD_ENV);</div><div class='add'>+	if (devfd == NULL) {</div><div class='add'>+		commfd = getenv(FUSE_COMMFD_ENV);</div><div class='add'>+		if (commfd == NULL) {</div><div class='add'>+			fprintf(stderr, "%s: old style mounting not supported\n",</div><div class='add'>+				progname);</div><div class='add'>+			exit(1);</div><div class='add'>+		}</div><div class='ctx'> 	}</div><div class='ctx'> </div><div class='del'>-	fd = mount_fuse(mnt, opts);</div><div class='add'>+	fd = mount_fuse(mnt, opts, devfd);</div><div class='ctx'> 	if (fd == -1)</div><div class='ctx'> 		exit(1);</div><div class='ctx'> </div><div class='del'>-	cfd = atoi(commfd);</div><div class='del'>-	res = send_fd(cfd, fd);</div><div class='del'>-	if (res == -1)</div><div class='del'>-		exit(1);</div><div class='add'>+	if (devfd == NULL) {</div><div class='add'>+		cfd = atoi(commfd);</div><div class='add'>+		res = send_fd(cfd, fd);</div><div class='add'>+		if (res == -1)</div><div class='add'>+			exit(1);</div><div class='add'>+	}</div><div class='ctx'> </div><div class='ctx'> 	return 0;</div><div class='ctx'> }</div><div class='head'>diff --git a/contrib/fuse-util/mount_util.c b/contrib/fuse-util/mount_util.c<br/>new file mode 100644<br/>index 00000000000..911b84445e9<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/contrib/fuse-util/mount_util.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>contrib/fuse-util/mount_util.c</a></div><div class='hunk'>@@ -0,0 +1,64 @@</div><div class='add'>+/*</div><div class='add'>+  FUSE: Filesystem in Userspace</div><div class='add'>+  Copyright (C) 2001-2007  Miklos Szeredi &lt;miklos@szeredi.hu&gt;</div><div class='add'>+</div><div class='add'>+  This program can be distributed under the terms of the GNU LGPLv2.</div><div class='add'>+  See the file COPYING.LIB.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#include &lt;dirent.h&gt;</div><div class='add'>+#include &lt;stdio.h&gt;</div><div class='add'>+#include &lt;string.h&gt;</div><div class='add'>+#include &lt;errno.h&gt;</div><div class='add'>+#include &lt;sys/types.h&gt;</div><div class='add'>+#include &lt;sys/stat.h&gt;</div><div class='add'>+</div><div class='add'>+int fuse_mnt_check_empty(const char *progname, const char *mnt,</div><div class='add'>+			 mode_t rootmode, off_t rootsize)</div><div class='add'>+{</div><div class='add'>+	int isempty = 1;</div><div class='add'>+</div><div class='add'>+	if (S_ISDIR(rootmode)) {</div><div class='add'>+		struct dirent *ent;</div><div class='add'>+		DIR *dp = opendir(mnt);</div><div class='add'>+		if (dp == NULL) {</div><div class='add'>+			fprintf(stderr,</div><div class='add'>+				"%s: failed to open mountpoint for reading: %s\n",</div><div class='add'>+				progname, strerror(errno));</div><div class='add'>+			return -1;</div><div class='add'>+		}</div><div class='add'>+		while ((ent = readdir(dp)) != NULL) {</div><div class='add'>+			if (strcmp(ent-&gt;d_name, ".") != 0 &amp;&amp;</div><div class='add'>+			    strcmp(ent-&gt;d_name, "..") != 0) {</div><div class='add'>+				isempty = 0;</div><div class='add'>+				break;</div><div class='add'>+			}</div><div class='add'>+		}</div><div class='add'>+		closedir(dp);</div><div class='add'>+	} else if (rootsize)</div><div class='add'>+		isempty = 0;</div><div class='add'>+</div><div class='add'>+	if (!isempty) {</div><div class='add'>+		fprintf(stderr, "%s: mountpoint is not empty\n", progname);</div><div class='add'>+		fprintf(stderr, "%s: if you are sure this is safe, use the 'nonempty' mount option\n", progname);</div><div class='add'>+		return -1;</div><div class='add'>+	}</div><div class='add'>+	return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int fuse_mnt_check_fuseblk(void)</div><div class='add'>+{</div><div class='add'>+	char buf[256];</div><div class='add'>+	FILE *f = fopen("/proc/filesystems", "r");</div><div class='add'>+	if (!f)</div><div class='add'>+		return 1;</div><div class='add'>+</div><div class='add'>+	while (fgets(buf, sizeof(buf), f))</div><div class='add'>+		if (strstr(buf, "fuseblk\n")) {</div><div class='add'>+			fclose(f);</div><div class='add'>+			return 1;</div><div class='add'>+		}</div><div class='add'>+</div><div class='add'>+	fclose(f);</div><div class='add'>+	return 0;</div><div class='add'>+}</div><div class='head'>diff --git a/contrib/libexecinfo/execinfo.c b/contrib/libexecinfo/execinfo.c<br/>new file mode 100644<br/>index 00000000000..03500257788<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/contrib/libexecinfo/execinfo.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>contrib/libexecinfo/execinfo.c</a></div><div class='hunk'>@@ -0,0 +1,442 @@</div><div class='add'>+/*</div><div class='add'>+ * Copyright (c) 2003 Maxim Sobolev &lt;sobomax@FreeBSD.org&gt;</div><div class='add'>+ * All rights reserved.</div><div class='add'>+ *</div><div class='add'>+ * Redistribution and use in source and binary forms, with or without</div><div class='add'>+ * modification, are permitted provided that the following conditions</div><div class='add'>+ * are met:</div><div class='add'>+ * 1. Redistributions of source code must retain the above copyright</div><div class='add'>+ *    notice, this list of conditions and the following disclaimer.</div><div class='add'>+ * 2. Redistributions in binary form must reproduce the above copyright</div><div class='add'>+ *    notice, this list of conditions and the following disclaimer in the</div><div class='add'>+ *    documentation and/or other materials provided with the distribution.</div><div class='add'>+ *</div><div class='add'>+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND</div><div class='add'>+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE</div><div class='add'>+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE</div><div class='add'>+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE</div><div class='add'>+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL</div><div class='add'>+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS</div><div class='add'>+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)</div><div class='add'>+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT</div><div class='add'>+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY</div><div class='add'>+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF</div><div class='add'>+ * SUCH DAMAGE.</div><div class='add'>+ *</div><div class='add'>+ * $Id: execinfo.c,v 1.3 2004/07/19 05:21:09 sobomax Exp $</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+#ifndef _CONFIG_H</div><div class='add'>+#define _CONFIG_H</div><div class='add'>+#include "config.h"</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#ifndef HAVE_BACKTRACE</div><div class='add'>+#include &lt;sys/types.h&gt;</div><div class='add'>+#include &lt;sys/uio.h&gt;</div><div class='add'>+#include &lt;dlfcn.h&gt;</div><div class='add'>+#include &lt;math.h&gt;</div><div class='add'>+#include &lt;stddef.h&gt;</div><div class='add'>+#include &lt;stdio.h&gt;</div><div class='add'>+#include &lt;stdlib.h&gt;</div><div class='add'>+#include &lt;string.h&gt;</div><div class='add'>+#include &lt;unistd.h&gt;</div><div class='add'>+#include &lt;stddef.h&gt;</div><div class='add'>+</div><div class='add'>+#include "execinfo_compat.h"</div><div class='add'>+</div><div class='add'>+#define D10(x) ceil(log10(((x) == 0) ? 2 : ((x) + 1)))</div><div class='add'>+</div><div class='add'>+static void *</div><div class='add'>+getreturnaddr(int level)</div><div class='add'>+{</div><div class='add'>+        switch (level) {</div><div class='add'>+        case 0: return __builtin_return_address(1);</div><div class='add'>+        case 1: return __builtin_return_address(2);</div><div class='add'>+        case 2: return __builtin_return_address(3);</div><div class='add'>+        case 3: return __builtin_return_address(4);</div><div class='add'>+        case 4: return __builtin_return_address(5);</div><div class='add'>+        case 5: return __builtin_return_address(6);</div><div class='add'>+        case 6: return __builtin_return_address(7);</div><div class='add'>+        case 7: return __builtin_return_address(8);</div><div class='add'>+        case 8: return __builtin_return_address(9);</div><div class='add'>+        case 9: return __builtin_return_address(10);</div><div class='add'>+        case 10: return __builtin_return_address(11);</div><div class='add'>+        case 11: return __builtin_return_address(12);</div><div class='add'>+        case 12: return __builtin_return_address(13);</div><div class='add'>+        case 13: return __builtin_return_address(14);</div><div class='add'>+        case 14: return __builtin_return_address(15);</div><div class='add'>+        case 15: return __builtin_return_address(16);</div><div class='add'>+        case 16: return __builtin_return_address(17);</div><div class='add'>+        case 17: return __builtin_return_address(18);</div><div class='add'>+        case 18: return __builtin_return_address(19);</div><div class='add'>+        case 19: return __builtin_return_address(20);</div><div class='add'>+        case 20: return __builtin_return_address(21);</div><div class='add'>+        case 21: return __builtin_return_address(22);</div><div class='add'>+        case 22: return __builtin_return_address(23);</div><div class='add'>+        case 23: return __builtin_return_address(24);</div><div class='add'>+        case 24: return __builtin_return_address(25);</div><div class='add'>+        case 25: return __builtin_return_address(26);</div><div class='add'>+        case 26: return __builtin_return_address(27);</div><div class='add'>+        case 27: return __builtin_return_address(28);</div><div class='add'>+        case 28: return __builtin_return_address(29);</div><div class='add'>+        case 29: return __builtin_return_address(30);</div><div class='add'>+        case 30: return __builtin_return_address(31);</div><div class='add'>+        case 31: return __builtin_return_address(32);</div><div class='add'>+        case 32: return __builtin_return_address(33);</div><div class='add'>+        case 33: return __builtin_return_address(34);</div><div class='add'>+        case 34: return __builtin_return_address(35);</div><div class='add'>+        case 35: return __builtin_return_address(36);</div><div class='add'>+        case 36: return __builtin_return_address(37);</div><div class='add'>+        case 37: return __builtin_return_address(38);</div><div class='add'>+        case 38: return __builtin_return_address(39);</div><div class='add'>+        case 39: return __builtin_return_address(40);</div><div class='add'>+        case 40: return __builtin_return_address(41);</div><div class='add'>+        case 41: return __builtin_return_address(42);</div><div class='add'>+        case 42: return __builtin_return_address(43);</div><div class='add'>+        case 43: return __builtin_return_address(44);</div><div class='add'>+        case 44: return __builtin_return_address(45);</div><div class='add'>+        case 45: return __builtin_return_address(46);</div><div class='add'>+        case 46: return __builtin_return_address(47);</div><div class='add'>+        case 47: return __builtin_return_address(48);</div><div class='add'>+        case 48: return __builtin_return_address(49);</div><div class='add'>+        case 49: return __builtin_return_address(50);</div><div class='add'>+        case 50: return __builtin_return_address(51);</div><div class='add'>+        case 51: return __builtin_return_address(52);</div><div class='add'>+        case 52: return __builtin_return_address(53);</div><div class='add'>+        case 53: return __builtin_return_address(54);</div><div class='add'>+        case 54: return __builtin_return_address(55);</div><div class='add'>+        case 55: return __builtin_return_address(56);</div><div class='add'>+        case 56: return __builtin_return_address(57);</div><div class='add'>+        case 57: return __builtin_return_address(58);</div><div class='add'>+        case 58: return __builtin_return_address(59);</div><div class='add'>+        case 59: return __builtin_return_address(60);</div><div class='add'>+        case 60: return __builtin_return_address(61);</div><div class='add'>+        case 61: return __builtin_return_address(62);</div><div class='add'>+        case 62: return __builtin_return_address(63);</div><div class='add'>+        case 63: return __builtin_return_address(64);</div><div class='add'>+        case 64: return __builtin_return_address(65);</div><div class='add'>+        case 65: return __builtin_return_address(66);</div><div class='add'>+        case 66: return __builtin_return_address(67);</div><div class='add'>+        case 67: return __builtin_return_address(68);</div><div class='add'>+        case 68: return __builtin_return_address(69);</div><div class='add'>+        case 69: return __builtin_return_address(70);</div><div class='add'>+        case 70: return __builtin_return_address(71);</div><div class='add'>+        case 71: return __builtin_return_address(72);</div><div class='add'>+        case 72: return __builtin_return_address(73);</div><div class='add'>+        case 73: return __builtin_return_address(74);</div><div class='add'>+        case 74: return __builtin_return_address(75);</div><div class='add'>+        case 75: return __builtin_return_address(76);</div><div class='add'>+        case 76: return __builtin_return_address(77);</div><div class='add'>+        case 77: return __builtin_return_address(78);</div><div class='add'>+        case 78: return __builtin_return_address(79);</div><div class='add'>+        case 79: return __builtin_return_address(80);</div><div class='add'>+        case 80: return __builtin_return_address(81);</div><div class='add'>+        case 81: return __builtin_return_address(82);</div><div class='add'>+        case 82: return __builtin_return_address(83);</div><div class='add'>+        case 83: return __builtin_return_address(84);</div><div class='add'>+        case 84: return __builtin_return_address(85);</div><div class='add'>+        case 85: return __builtin_return_address(86);</div><div class='add'>+        case 86: return __builtin_return_address(87);</div><div class='add'>+        case 87: return __builtin_return_address(88);</div><div class='add'>+        case 88: return __builtin_return_address(89);</div><div class='add'>+        case 89: return __builtin_return_address(90);</div><div class='add'>+        case 90: return __builtin_return_address(91);</div><div class='add'>+        case 91: return __builtin_return_address(92);</div><div class='add'>+        case 92: return __builtin_return_address(93);</div><div class='add'>+        case 93: return __builtin_return_address(94);</div><div class='add'>+        case 94: return __builtin_return_address(95);</div><div class='add'>+        case 95: return __builtin_return_address(96);</div><div class='add'>+        case 96: return __builtin_return_address(97);</div><div class='add'>+        case 97: return __builtin_return_address(98);</div><div class='add'>+        case 98: return __builtin_return_address(99);</div><div class='add'>+        case 99: return __builtin_return_address(100);</div><div class='add'>+        case 100: return __builtin_return_address(101);</div><div class='add'>+        case 101: return __builtin_return_address(102);</div><div class='add'>+        case 102: return __builtin_return_address(103);</div><div class='add'>+        case 103: return __builtin_return_address(104);</div><div class='add'>+        case 104: return __builtin_return_address(105);</div><div class='add'>+        case 105: return __builtin_return_address(106);</div><div class='add'>+        case 106: return __builtin_return_address(107);</div><div class='add'>+        case 107: return __builtin_return_address(108);</div><div class='add'>+        case 108: return __builtin_return_address(109);</div><div class='add'>+        case 109: return __builtin_return_address(110);</div><div class='add'>+        case 110: return __builtin_return_address(111);</div><div class='add'>+        case 111: return __builtin_return_address(112);</div><div class='add'>+        case 112: return __builtin_return_address(113);</div><div class='add'>+        case 113: return __builtin_return_address(114);</div><div class='add'>+        case 114: return __builtin_return_address(115);</div><div class='add'>+        case 115: return __builtin_return_address(116);</div><div class='add'>+        case 116: return __builtin_return_address(117);</div><div class='add'>+        case 117: return __builtin_return_address(118);</div><div class='add'>+        case 118: return __builtin_return_address(119);</div><div class='add'>+        case 119: return __builtin_return_address(120);</div><div class='add'>+        case 120: return __builtin_return_address(121);</div><div class='add'>+        case 121: return __builtin_return_address(122);</div><div class='add'>+        case 122: return __builtin_return_address(123);</div><div class='add'>+        case 123: return __builtin_return_address(124);</div><div class='add'>+        case 124: return __builtin_return_address(125);</div><div class='add'>+        case 125: return __builtin_return_address(126);</div><div class='add'>+        case 126: return __builtin_return_address(127);</div><div class='add'>+        case 127: return __builtin_return_address(128);</div><div class='add'>+        default: return NULL;</div><div class='add'>+        }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void *</div><div class='add'>+getframeaddr(int level)</div><div class='add'>+{</div><div class='add'>+</div><div class='add'>+        switch (level) {</div><div class='add'>+        case 0: return __builtin_frame_address(1);</div><div class='add'>+        case 1: return __builtin_frame_address(2);</div><div class='add'>+        case 2: return __builtin_frame_address(3);</div><div class='add'>+        case 3: return __builtin_frame_address(4);</div><div class='add'>+        case 4: return __builtin_frame_address(5);</div><div class='add'>+        case 5: return __builtin_frame_address(6);</div><div class='add'>+        case 6: return __builtin_frame_address(7);</div><div class='add'>+        case 7: return __builtin_frame_address(8);</div><div class='add'>+        case 8: return __builtin_frame_address(9);</div><div class='add'>+        case 9: return __builtin_frame_address(10);</div><div class='add'>+        case 10: return __builtin_frame_address(11);</div><div class='add'>+        case 11: return __builtin_frame_address(12);</div><div class='add'>+        case 12: return __builtin_frame_address(13);</div><div class='add'>+        case 13: return __builtin_frame_address(14);</div><div class='add'>+        case 14: return __builtin_frame_address(15);</div><div class='add'>+        case 15: return __builtin_frame_address(16);</div><div class='add'>+        case 16: return __builtin_frame_address(17);</div><div class='add'>+        case 17: return __builtin_frame_address(18);</div><div class='add'>+        case 18: return __builtin_frame_address(19);</div><div class='add'>+        case 19: return __builtin_frame_address(20);</div><div class='add'>+        case 20: return __builtin_frame_address(21);</div><div class='add'>+        case 21: return __builtin_frame_address(22);</div><div class='add'>+        case 22: return __builtin_frame_address(23);</div><div class='add'>+        case 23: return __builtin_frame_address(24);</div><div class='add'>+        case 24: return __builtin_frame_address(25);</div><div class='add'>+        case 25: return __builtin_frame_address(26);</div><div class='add'>+        case 26: return __builtin_frame_address(27);</div><div class='add'>+        case 27: return __builtin_frame_address(28);</div><div class='add'>+        case 28: return __builtin_frame_address(29);</div><div class='add'>+        case 29: return __builtin_frame_address(30);</div><div class='add'>+        case 30: return __builtin_frame_address(31);</div><div class='add'>+        case 31: return __builtin_frame_address(32);</div><div class='add'>+        case 32: return __builtin_frame_address(33);</div><div class='add'>+        case 33: return __builtin_frame_address(34);</div><div class='add'>+        case 34: return __builtin_frame_address(35);</div><div class='add'>+        case 35: return __builtin_frame_address(36);</div><div class='add'>+        case 36: return __builtin_frame_address(37);</div><div class='add'>+        case 37: return __builtin_frame_address(38);</div><div class='add'>+        case 38: return __builtin_frame_address(39);</div><div class='add'>+        case 39: return __builtin_frame_address(40);</div><div class='add'>+        case 40: return __builtin_frame_address(41);</div><div class='add'>+        case 41: return __builtin_frame_address(42);</div><div class='add'>+        case 42: return __builtin_frame_address(43);</div><div class='add'>+        case 43: return __builtin_frame_address(44);</div><div class='add'>+        case 44: return __builtin_frame_address(45);</div><div class='add'>+        case 45: return __builtin_frame_address(46);</div><div class='add'>+        case 46: return __builtin_frame_address(47);</div><div class='add'>+        case 47: return __builtin_frame_address(48);</div><div class='add'>+        case 48: return __builtin_frame_address(49);</div><div class='add'>+        case 49: return __builtin_frame_address(50);</div><div class='add'>+        case 50: return __builtin_frame_address(51);</div><div class='add'>+        case 51: return __builtin_frame_address(52);</div><div class='add'>+        case 52: return __builtin_frame_address(53);</div><div class='add'>+        case 53: return __builtin_frame_address(54);</div><div class='add'>+        case 54: return __builtin_frame_address(55);</div><div class='add'>+        case 55: return __builtin_frame_address(56);</div><div class='add'>+        case 56: return __builtin_frame_address(57);</div><div class='add'>+        case 57: return __builtin_frame_address(58);</div><div class='add'>+        case 58: return __builtin_frame_address(59);</div><div class='add'>+        case 59: return __builtin_frame_address(60);</div><div class='add'>+        case 60: return __builtin_frame_address(61);</div><div class='add'>+        case 61: return __builtin_frame_address(62);</div><div class='add'>+        case 62: return __builtin_frame_address(63);</div><div class='add'>+        case 63: return __builtin_frame_address(64);</div><div class='add'>+        case 64: return __builtin_frame_address(65);</div><div class='add'>+        case 65: return __builtin_frame_address(66);</div><div class='add'>+        case 66: return __builtin_frame_address(67);</div><div class='add'>+        case 67: return __builtin_frame_address(68);</div><div class='add'>+        case 68: return __builtin_frame_address(69);</div><div class='add'>+        case 69: return __builtin_frame_address(70);</div><div class='add'>+        case 70: return __builtin_frame_address(71);</div><div class='add'>+        case 71: return __builtin_frame_address(72);</div><div class='add'>+        case 72: return __builtin_frame_address(73);</div><div class='add'>+        case 73: return __builtin_frame_address(74);</div><div class='add'>+        case 74: return __builtin_frame_address(75);</div><div class='add'>+        case 75: return __builtin_frame_address(76);</div><div class='add'>+        case 76: return __builtin_frame_address(77);</div><div class='add'>+        case 77: return __builtin_frame_address(78);</div><div class='add'>+        case 78: return __builtin_frame_address(79);</div><div class='add'>+        case 79: return __builtin_frame_address(80);</div><div class='add'>+        case 80: return __builtin_frame_address(81);</div><div class='add'>+        case 81: return __builtin_frame_address(82);</div><div class='add'>+        case 82: return __builtin_frame_address(83);</div><div class='add'>+        case 83: return __builtin_frame_address(84);</div><div class='add'>+        case 84: return __builtin_frame_address(85);</div><div class='add'>+        case 85: return __builtin_frame_address(86);</div><div class='add'>+        case 86: return __builtin_frame_address(87);</div><div class='add'>+        case 87: return __builtin_frame_address(88);</div><div class='add'>+        case 88: return __builtin_frame_address(89);</div><div class='add'>+        case 89: return __builtin_frame_address(90);</div><div class='add'>+        case 90: return __builtin_frame_address(91);</div><div class='add'>+        case 91: return __builtin_frame_address(92);</div><div class='add'>+        case 92: return __builtin_frame_address(93);</div><div class='add'>+        case 93: return __builtin_frame_address(94);</div><div class='add'>+        case 94: return __builtin_frame_address(95);</div><div class='add'>+        case 95: return __builtin_frame_address(96);</div><div class='add'>+        case 96: return __builtin_frame_address(97);</div><div class='add'>+        case 97: return __builtin_frame_address(98);</div><div class='add'>+        case 98: return __builtin_frame_address(99);</div><div class='add'>+        case 99: return __builtin_frame_address(100);</div><div class='add'>+        case 100: return __builtin_frame_address(101);</div><div class='add'>+        case 101: return __builtin_frame_address(102);</div><div class='add'>+        case 102: return __builtin_frame_address(103);</div><div class='add'>+        case 103: return __builtin_frame_address(104);</div><div class='add'>+        case 104: return __builtin_frame_address(105);</div><div class='add'>+        case 105: return __builtin_frame_address(106);</div><div class='add'>+        case 106: return __builtin_frame_address(107);</div><div class='add'>+        case 107: return __builtin_frame_address(108);</div><div class='add'>+        case 108: return __builtin_frame_address(109);</div><div class='add'>+        case 109: return __builtin_frame_address(110);</div><div class='add'>+        case 110: return __builtin_frame_address(111);</div><div class='add'>+        case 111: return __builtin_frame_address(112);</div><div class='add'>+        case 112: return __builtin_frame_address(113);</div><div class='add'>+        case 113: return __builtin_frame_address(114);</div><div class='add'>+        case 114: return __builtin_frame_address(115);</div><div class='add'>+        case 115: return __builtin_frame_address(116);</div><div class='add'>+        case 116: return __builtin_frame_address(117);</div><div class='add'>+        case 117: return __builtin_frame_address(118);</div><div class='add'>+        case 118: return __builtin_frame_address(119);</div><div class='add'>+        case 119: return __builtin_frame_address(120);</div><div class='add'>+        case 120: return __builtin_frame_address(121);</div><div class='add'>+        case 121: return __builtin_frame_address(122);</div><div class='add'>+        case 122: return __builtin_frame_address(123);</div><div class='add'>+        case 123: return __builtin_frame_address(124);</div><div class='add'>+        case 124: return __builtin_frame_address(125);</div><div class='add'>+        case 125: return __builtin_frame_address(126);</div><div class='add'>+        case 126: return __builtin_frame_address(127);</div><div class='add'>+        case 127: return __builtin_frame_address(128);</div><div class='add'>+        default: return NULL;</div><div class='add'>+        }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static inline void *</div><div class='add'>+realloc_safe(void *ptr, size_t size)</div><div class='add'>+{</div><div class='add'>+        void *nptr;</div><div class='add'>+</div><div class='add'>+        nptr = realloc (ptr, size);</div><div class='add'>+        if (nptr == NULL)</div><div class='add'>+                free (ptr);</div><div class='add'>+        return nptr;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+backtrace(void **buffer, int size)</div><div class='add'>+{</div><div class='add'>+        int i;</div><div class='add'>+</div><div class='add'>+        for (i = 1; getframeaddr(i + 1) != NULL &amp;&amp; i != size + 1; i++) {</div><div class='add'>+                buffer[i - 1] = getreturnaddr(i);</div><div class='add'>+                if (buffer[i - 1] == NULL)</div><div class='add'>+                        break;</div><div class='add'>+        }</div><div class='add'>+        return i - 1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+char **</div><div class='add'>+backtrace_symbols(void *const *buffer, int size)</div><div class='add'>+{</div><div class='add'>+        size_t clen, alen;</div><div class='add'>+        int i, offset;</div><div class='add'>+        char **rval;</div><div class='add'>+        Dl_info info;</div><div class='add'>+</div><div class='add'>+        clen = size * sizeof(char *);</div><div class='add'>+        rval = malloc(clen);</div><div class='add'>+        if (rval == NULL)</div><div class='add'>+                return NULL;</div><div class='add'>+        for (i = 0; i &lt; size; i++) {</div><div class='add'>+                if (dladdr(buffer[i], &amp;info) != 0) {</div><div class='add'>+                        if (info.dli_sname == NULL)</div><div class='add'>+                                info.dli_sname = "???";</div><div class='add'>+                        if (info.dli_saddr == NULL)</div><div class='add'>+                                info.dli_saddr = buffer[i];</div><div class='add'>+                        offset = buffer[i] - info.dli_saddr;</div><div class='add'>+                        /* "0x01234567 &lt;function+offset&gt; at filename" */</div><div class='add'>+                        alen = 2 +                      /* "0x" */</div><div class='add'>+                                (sizeof(void *) * 2) +   /* "01234567" */</div><div class='add'>+                                2 +                      /* " &lt;" */</div><div class='add'>+                                strlen(info.dli_sname) + /* "function" */</div><div class='add'>+                                1 +                      /* "+" */</div><div class='add'>+                                10 +                     /* "offset */</div><div class='add'>+                                5 +                      /* "&gt; at " */</div><div class='add'>+                                strlen(info.dli_fname) + /* "filename" */</div><div class='add'>+                                1;                       /* "\0" */</div><div class='add'>+                        rval = realloc_safe(rval, clen + alen);</div><div class='add'>+                        if (rval == NULL)</div><div class='add'>+                                return NULL;</div><div class='add'>+                        snprintf((char *) rval + clen, alen, "%p &lt;%s+%d&gt; at %s",</div><div class='add'>+                                 buffer[i], info.dli_sname, offset, info.dli_fname);</div><div class='add'>+                } else {</div><div class='add'>+                        alen = 2 +                      /* "0x" */</div><div class='add'>+                                (sizeof(void *) * 2) +   /* "01234567" */</div><div class='add'>+                                1;                       /* "\0" */</div><div class='add'>+                        rval = realloc_safe(rval, clen + alen);</div><div class='add'>+                        if (rval == NULL)</div><div class='add'>+                                return NULL;</div><div class='add'>+                        snprintf((char *) rval + clen, alen, "%p", buffer[i]);</div><div class='add'>+                }</div><div class='add'>+                rval[i] = (char *) clen;</div><div class='add'>+                clen += alen;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        for (i = 0; i &lt; size; i++)</div><div class='add'>+                rval[i] += (long) rval;</div><div class='add'>+</div><div class='add'>+        return rval;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+backtrace_symbols_fd(void *const *buffer, int size, int fd)</div><div class='add'>+{</div><div class='add'>+        int i, len, offset;</div><div class='add'>+        char *buf;</div><div class='add'>+        Dl_info info;</div><div class='add'>+</div><div class='add'>+        for (i = 0; i &lt; size; i++) {</div><div class='add'>+                if (dladdr(buffer[i], &amp;info) != 0) {</div><div class='add'>+                        if (info.dli_sname == NULL)</div><div class='add'>+                                info.dli_sname = "???";</div><div class='add'>+                        if (info.dli_saddr == NULL)</div><div class='add'>+                                info.dli_saddr = buffer[i];</div><div class='add'>+                        offset = buffer[i] - info.dli_saddr;</div><div class='add'>+                        /* "0x01234567 &lt;function+offset&gt; at filename" */</div><div class='add'>+                        len = 2 +                      /* "0x" */</div><div class='add'>+                                (sizeof(void *) * 2) +   /* "01234567" */</div><div class='add'>+                                2 +                      /* " &lt;" */</div><div class='add'>+                                strlen(info.dli_sname) + /* "function" */</div><div class='add'>+                                1 +                      /* "+" */</div><div class='add'>+                                D10(offset) +            /* "offset */</div><div class='add'>+                                5 +                      /* "&gt; at " */</div><div class='add'>+                                strlen(info.dli_fname) + /* "filename" */</div><div class='add'>+                                2;                       /* "\n\0" */</div><div class='add'>+                        buf = alloca(len);</div><div class='add'>+                        if (buf == NULL)</div><div class='add'>+                                return;</div><div class='add'>+                        snprintf(buf, len, "%p &lt;%s+%d&gt; at %s\n",</div><div class='add'>+                                 buffer[i], info.dli_sname, offset, info.dli_fname);</div><div class='add'>+                } else {</div><div class='add'>+                        len = 2 +                      /* "0x" */</div><div class='add'>+                                (sizeof(void *) * 2) +   /* "01234567" */</div><div class='add'>+                                2;                       /* "\n\0" */</div><div class='add'>+                        buf = alloca(len);</div><div class='add'>+                        if (buf == NULL)</div><div class='add'>+                                return;</div><div class='add'>+                        snprintf(buf, len, "%p\n", buffer[i]);</div><div class='add'>+                }</div><div class='add'>+                if (write(fd, buf, strlen(buf)) == -1)</div><div class='add'>+                        return;</div><div class='add'>+        }</div><div class='add'>+}</div><div class='add'>+#endif</div><div class='head'>diff --git a/contrib/libexecinfo/execinfo_compat.h b/contrib/libexecinfo/execinfo_compat.h<br/>new file mode 100644<br/>index 00000000000..ae84cfb1f35<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/contrib/libexecinfo/execinfo_compat.h?id=d1d7a6f35c816822fab51c820e25023863c239c1'>contrib/libexecinfo/execinfo_compat.h</a></div><div class='hunk'>@@ -0,0 +1,51 @@</div><div class='add'>+/*</div><div class='add'>+ * Copyright (c) 2003 Maxim Sobolev &lt;sobomax@FreeBSD.org&gt;</div><div class='add'>+ * All rights reserved.</div><div class='add'>+ *</div><div class='add'>+ * Redistribution and use in source and binary forms, with or without</div><div class='add'>+ * modification, are permitted provided that the following conditions</div><div class='add'>+ * are met:</div><div class='add'>+ * 1. Redistributions of source code must retain the above copyright</div><div class='add'>+ *    notice, this list of conditions and the following disclaimer.</div><div class='add'>+ * 2. Redistributions in binary form must reproduce the above copyright</div><div class='add'>+ *    notice, this list of conditions and the following disclaimer in the</div><div class='add'>+ *    documentation and/or other materials provided with the distribution.</div><div class='add'>+ *</div><div class='add'>+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND</div><div class='add'>+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE</div><div class='add'>+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE</div><div class='add'>+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE</div><div class='add'>+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL</div><div class='add'>+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS</div><div class='add'>+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)</div><div class='add'>+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT</div><div class='add'>+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY</div><div class='add'>+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF</div><div class='add'>+ * SUCH DAMAGE.</div><div class='add'>+ *</div><div class='add'>+ * $Id: execinfo.h,v 1.2 2004/07/19 05:20:29 sobomax Exp $</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+#ifndef _EXECINFO_H_</div><div class='add'>+#define _EXECINFO_H_</div><div class='add'>+</div><div class='add'>+#ifndef _CONFIG_H</div><div class='add'>+#define _CONFIG_H</div><div class='add'>+#include "config.h"</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#ifndef HAVE_BACKTRACE</div><div class='add'>+#ifdef __cplusplus</div><div class='add'>+extern "C" {</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+extern int   backtrace(void **, int);</div><div class='add'>+extern char  **backtrace_symbols(void *const *, int);</div><div class='add'>+extern void  backtrace_symbols_fd(void *const *, int, int);</div><div class='add'>+</div><div class='add'>+#ifdef __cplusplus</div><div class='add'>+}</div><div class='add'>+#endif</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#endif /* _EXECINFO_H_ */</div><div class='head'>diff --git a/contrib/libgen/basename_r.c b/contrib/libgen/basename_r.c<br/>new file mode 100644<br/>index 00000000000..2c3a87afe1c<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/contrib/libgen/basename_r.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>contrib/libgen/basename_r.c</a></div><div class='hunk'>@@ -0,0 +1,40 @@</div><div class='add'>+/*</div><div class='add'>+ * borrowed from glibc-2.12.1/string/basename.c</div><div class='add'>+ * Modified to return "." for NULL or "", as required for SUSv2.</div><div class='add'>+ */</div><div class='add'>+#include &lt;string.h&gt;</div><div class='add'>+#include &lt;stdlib.h&gt;</div><div class='add'>+#ifdef THREAD_UNSAFE_BASENAME</div><div class='add'>+</div><div class='add'>+/* Return the name-within-directory of a file name.</div><div class='add'>+   Copyright (C) 1996,97,98,2002 Free Software Foundation, Inc.</div><div class='add'>+   This file is part of the GNU C Library.</div><div class='add'>+</div><div class='add'>+   The GNU C Library is free software; you can redistribute it and/or</div><div class='add'>+   modify it under the terms of the GNU Lesser General Public</div><div class='add'>+   License as published by the Free Software Foundation; either</div><div class='add'>+   version 2.1 of the License, or (at your option) any later version.</div><div class='add'>+</div><div class='add'>+   The GNU C Library is distributed in the hope that it will be useful,</div><div class='add'>+   but WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='add'>+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='add'>+   Lesser General Public License for more details.</div><div class='add'>+</div><div class='add'>+   You should have received a copy of the GNU Lesser General Public</div><div class='add'>+   License along with the GNU C Library; if not, write to the Free</div><div class='add'>+   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA</div><div class='add'>+   02111-1307 USA.  */</div><div class='add'>+</div><div class='add'>+char *</div><div class='add'>+basename_r (filename)</div><div class='add'>+     const char *filename;</div><div class='add'>+{</div><div class='add'>+  char *p;</div><div class='add'>+</div><div class='add'>+  if ((filename == NULL) || (*filename == '\0'))</div><div class='add'>+    return ".";</div><div class='add'>+</div><div class='add'>+  p = strrchr (filename, '/');</div><div class='add'>+  return p ? p + 1 : (char *) filename;</div><div class='add'>+}</div><div class='add'>+#endif /* THREAD_UNSAFE_BASENAME */</div><div class='head'>diff --git a/contrib/libgen/dirname_r.c b/contrib/libgen/dirname_r.c<br/>new file mode 100644<br/>index 00000000000..131cbcf2a96<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/contrib/libgen/dirname_r.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>contrib/libgen/dirname_r.c</a></div><div class='hunk'>@@ -0,0 +1,243 @@</div><div class='add'>+/*</div><div class='add'>+ * Borrowed from glibc-2.12.1/string/memrchr.c</div><div class='add'>+ * Based on strlen implementation by Torbjorn Granlund (tege@sics.se),</div><div class='add'>+ * Removed code for long bigger than 32 bytes, renamed __ptr_t as void *</div><div class='add'>+ * changed reg_char type to char.</div><div class='add'>+ */</div><div class='add'>+#include &lt;string.h&gt;</div><div class='add'>+#include &lt;stdlib.h&gt;</div><div class='add'>+#ifdef THREAD_UNSAFE_DIRNAME</div><div class='add'>+</div><div class='add'>+/* memrchr -- find the last occurrence of a byte in a memory block</div><div class='add'>+   Copyright (C) 1991, 93, 96, 97, 99, 2000 Free Software Foundation, Inc.</div><div class='add'>+   This file is part of the GNU C Library.</div><div class='add'>+   Based on strlen implementation by Torbjorn Granlund (tege@sics.se),</div><div class='add'>+   with help from Dan Sahlin (dan@sics.se) and</div><div class='add'>+   commentary by Jim Blandy (jimb@ai.mit.edu);</div><div class='add'>+   adaptation to memchr suggested by Dick Karpinski (dick@cca.ucsf.edu),</div><div class='add'>+   and implemented by Roland McGrath (roland@ai.mit.edu).</div><div class='add'>+</div><div class='add'>+   The GNU C Library is free software; you can redistribute it and/or</div><div class='add'>+   modify it under the terms of the GNU Lesser General Public</div><div class='add'>+   License as published by the Free Software Foundation; either</div><div class='add'>+   version 2.1 of the License, or (at your option) any later version.</div><div class='add'>+</div><div class='add'>+   The GNU C Library is distributed in the hope that it will be useful,</div><div class='add'>+   but WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='add'>+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='add'>+   Lesser General Public License for more details.</div><div class='add'>+</div><div class='add'>+   You should have received a copy of the GNU Lesser General Public</div><div class='add'>+   License along with the GNU C Library; if not, write to the Free</div><div class='add'>+   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA</div><div class='add'>+   02111-1307 USA.  */</div><div class='add'>+</div><div class='add'>+void *</div><div class='add'>+__memrchr (s, c_in, n)</div><div class='add'>+     const void * s;</div><div class='add'>+     int c_in;</div><div class='add'>+     size_t n;</div><div class='add'>+{</div><div class='add'>+  const unsigned char *char_ptr;</div><div class='add'>+  const unsigned long int *longword_ptr;</div><div class='add'>+  unsigned long int longword, magic_bits, charmask;</div><div class='add'>+  unsigned char c;</div><div class='add'>+</div><div class='add'>+  c = (unsigned char) c_in;</div><div class='add'>+</div><div class='add'>+  /* Handle the last few characters by reading one character at a time.</div><div class='add'>+     Do this until CHAR_PTR is aligned on a longword boundary.  */</div><div class='add'>+  for (char_ptr = (const unsigned char *) s + n;</div><div class='add'>+       n &gt; 0 &amp;&amp; ((unsigned long int) char_ptr</div><div class='add'>+		 &amp; (sizeof (longword) - 1)) != 0;</div><div class='add'>+       --n)</div><div class='add'>+    if (*--char_ptr == c)</div><div class='add'>+      return (void *) char_ptr;</div><div class='add'>+</div><div class='add'>+  /* All these elucidatory comments refer to 4-byte longwords,</div><div class='add'>+     but the theory applies equally well to 8-byte longwords.  */</div><div class='add'>+</div><div class='add'>+  longword_ptr = (const unsigned long int *) char_ptr;</div><div class='add'>+</div><div class='add'>+  /* Bits 31, 24, 16, and 8 of this number are zero.  Call these bits</div><div class='add'>+     the "holes."  Note that there is a hole just to the left of</div><div class='add'>+     each byte, with an extra at the end:</div><div class='add'>+</div><div class='add'>+     bits:  01111110 11111110 11111110 11111111</div><div class='add'>+     bytes: AAAAAAAA BBBBBBBB CCCCCCCC DDDDDDDD</div><div class='add'>+</div><div class='add'>+     The 1-bits make sure that carries propagate to the next 0-bit.</div><div class='add'>+     The 0-bits provide holes for carries to fall into.  */</div><div class='add'>+</div><div class='add'>+  if (sizeof (longword) != 4 &amp;&amp; sizeof (longword) != 8)</div><div class='add'>+    abort ();</div><div class='add'>+</div><div class='add'>+  magic_bits = 0x7efefeff;</div><div class='add'>+</div><div class='add'>+  /* Set up a longword, each of whose bytes is C.  */</div><div class='add'>+  charmask = c | (c &lt;&lt; 8);</div><div class='add'>+  charmask |= charmask &lt;&lt; 16;</div><div class='add'>+</div><div class='add'>+  /* Instead of the traditional loop which tests each character,</div><div class='add'>+     we will test a longword at a time.  The tricky part is testing</div><div class='add'>+     if *any of the four* bytes in the longword in question are zero.  */</div><div class='add'>+  while (n &gt;= sizeof (longword))</div><div class='add'>+    {</div><div class='add'>+      /* We tentatively exit the loop if adding MAGIC_BITS to</div><div class='add'>+	 LONGWORD fails to change any of the hole bits of LONGWORD.</div><div class='add'>+</div><div class='add'>+	 1) Is this safe?  Will it catch all the zero bytes?</div><div class='add'>+	 Suppose there is a byte with all zeros.  Any carry bits</div><div class='add'>+	 propagating from its left will fall into the hole at its</div><div class='add'>+	 least significant bit and stop.  Since there will be no</div><div class='add'>+	 carry from its most significant bit, the LSB of the</div><div class='add'>+	 byte to the left will be unchanged, and the zero will be</div><div class='add'>+	 detected.</div><div class='add'>+</div><div class='add'>+	 2) Is this worthwhile?  Will it ignore everything except</div><div class='add'>+	 zero bytes?  Suppose every byte of LONGWORD has a bit set</div><div class='add'>+	 somewhere.  There will be a carry into bit 8.  If bit 8</div><div class='add'>+	 is set, this will carry into bit 16.  If bit 8 is clear,</div><div class='add'>+	 one of bits 9-15 must be set, so there will be a carry</div><div class='add'>+	 into bit 16.  Similarly, there will be a carry into bit</div><div class='add'>+	 24.  If one of bits 24-30 is set, there will be a carry</div><div class='add'>+	 into bit 31, so all of the hole bits will be changed.</div><div class='add'>+</div><div class='add'>+	 The one misfire occurs when bits 24-30 are clear and bit</div><div class='add'>+	 31 is set; in this case, the hole at bit 31 is not</div><div class='add'>+	 changed.  If we had access to the processor carry flag,</div><div class='add'>+	 we could close this loophole by putting the fourth hole</div><div class='add'>+	 at bit 32!</div><div class='add'>+</div><div class='add'>+	 So it ignores everything except 128's, when they're aligned</div><div class='add'>+	 properly.</div><div class='add'>+</div><div class='add'>+	 3) But wait!  Aren't we looking for C, not zero?</div><div class='add'>+	 Good point.  So what we do is XOR LONGWORD with a longword,</div><div class='add'>+	 each of whose bytes is C.  This turns each byte that is C</div><div class='add'>+	 into a zero.  */</div><div class='add'>+</div><div class='add'>+      longword = *--longword_ptr ^ charmask;</div><div class='add'>+</div><div class='add'>+      /* Add MAGIC_BITS to LONGWORD.  */</div><div class='add'>+      if ((((longword + magic_bits)</div><div class='add'>+</div><div class='add'>+	    /* Set those bits that were unchanged by the addition.  */</div><div class='add'>+	    ^ ~longword)</div><div class='add'>+</div><div class='add'>+	   /* Look at only the hole bits.  If any of the hole bits</div><div class='add'>+	      are unchanged, most likely one of the bytes was a</div><div class='add'>+	      zero.  */</div><div class='add'>+	   &amp; ~magic_bits) != 0)</div><div class='add'>+	{</div><div class='add'>+	  /* Which of the bytes was C?  If none of them were, it was</div><div class='add'>+	     a misfire; continue the search.  */</div><div class='add'>+</div><div class='add'>+	  const unsigned char *cp = (const unsigned char *) longword_ptr;</div><div class='add'>+</div><div class='add'>+	  if (cp[3] == c)</div><div class='add'>+	    return (void *) &amp;cp[3];</div><div class='add'>+	  if (cp[2] == c)</div><div class='add'>+	    return (void *) &amp;cp[2];</div><div class='add'>+	  if (cp[1] == c)</div><div class='add'>+	    return (void *) &amp;cp[1];</div><div class='add'>+	  if (cp[0] == c)</div><div class='add'>+	    return (void *) cp;</div><div class='add'>+	}</div><div class='add'>+</div><div class='add'>+      n -= sizeof (longword);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+  char_ptr = (const unsigned char *) longword_ptr;</div><div class='add'>+</div><div class='add'>+  while (n-- &gt; 0)</div><div class='add'>+    {</div><div class='add'>+      if (*--char_ptr == c)</div><div class='add'>+	return (void *) char_ptr;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+  return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+ * Borrowed from glibc-2.12.1/misc/dirname.c</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+/* dirname - return directory part of PATH.</div><div class='add'>+   Copyright (C) 1996, 2000, 2001, 2002 Free Software Foundation, Inc.</div><div class='add'>+   This file is part of the GNU C Library.</div><div class='add'>+   Contributed by Ulrich Drepper &lt;drepper@cygnus.com&gt;, 1996.</div><div class='add'>+</div><div class='add'>+   The GNU C Library is free software; you can redistribute it and/or</div><div class='add'>+   modify it under the terms of the GNU Lesser General Public</div><div class='add'>+   License as published by the Free Software Foundation; either</div><div class='add'>+   version 2.1 of the License, or (at your option) any later version.</div><div class='add'>+</div><div class='add'>+   The GNU C Library is distributed in the hope that it will be useful,</div><div class='add'>+   but WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='add'>+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='add'>+   Lesser General Public License for more details.</div><div class='add'>+</div><div class='add'>+   You should have received a copy of the GNU Lesser General Public</div><div class='add'>+   License along with the GNU C Library; if not, write to the Free</div><div class='add'>+   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA</div><div class='add'>+   02111-1307 USA.  */</div><div class='add'>+</div><div class='add'>+char *</div><div class='add'>+dirname_r (char *path)</div><div class='add'>+{</div><div class='add'>+  static const char dot[] = ".";</div><div class='add'>+  char *last_slash;</div><div class='add'>+</div><div class='add'>+  /* Find last '/'.  */</div><div class='add'>+  last_slash = path != NULL ? strrchr (path, '/') : NULL;</div><div class='add'>+</div><div class='add'>+  if (last_slash != NULL &amp;&amp; last_slash != path &amp;&amp; last_slash[1] == '\0')</div><div class='add'>+    {</div><div class='add'>+      /* Determine whether all remaining characters are slashes.  */</div><div class='add'>+      char *runp;</div><div class='add'>+</div><div class='add'>+      for (runp = last_slash; runp != path; --runp)</div><div class='add'>+        if (runp[-1] != '/')</div><div class='add'>+          break;</div><div class='add'>+</div><div class='add'>+      /* The '/' is the last character, we have to look further.  */</div><div class='add'>+      if (runp != path)</div><div class='add'>+        last_slash = __memrchr (path, '/', runp - path);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+  if (last_slash != NULL)</div><div class='add'>+    {</div><div class='add'>+      /* Determine whether all remaining characters are slashes.  */</div><div class='add'>+      char *runp;</div><div class='add'>+</div><div class='add'>+      for (runp = last_slash; runp != path; --runp)</div><div class='add'>+        if (runp[-1] != '/')</div><div class='add'>+          break;</div><div class='add'>+</div><div class='add'>+      /* Terminate the path.  */</div><div class='add'>+      if (runp == path)</div><div class='add'>+        {</div><div class='add'>+          /* The last slash is the first character in the string.  We have to</div><div class='add'>+             return "/".  As a special case we have to return "//" if there</div><div class='add'>+             are exactly two slashes at the beginning of the string.  See</div><div class='add'>+             XBD 4.10 Path Name Resolution for more information.  */</div><div class='add'>+          if (last_slash == path + 1)</div><div class='add'>+            ++last_slash;</div><div class='add'>+          else</div><div class='add'>+            last_slash = path + 1;</div><div class='add'>+        }</div><div class='add'>+      else</div><div class='add'>+        last_slash = runp;</div><div class='add'>+</div><div class='add'>+      last_slash[0] = '\0';</div><div class='add'>+    }</div><div class='add'>+  else</div><div class='add'>+    /* This assignment is ill-designed but the XPG specs require to</div><div class='add'>+       return a string containing "." in any case no directory part is</div><div class='add'>+       found and so a static and constant string is required.  */</div><div class='add'>+    path = (char *) dot;</div><div class='add'>+</div><div class='add'>+  return path;</div><div class='add'>+}</div><div class='add'>+#endif /* THREAD_UNSAFE_DIRNAME */</div><div class='head'>diff --git a/contrib/macfuse/fuse_param.h b/contrib/macfuse/fuse_param.h<br/>index 81d753c6cd7..347db9464bc 100644<br/>--- a/<a href='/cgit/glusterfs.git/tree/contrib/macfuse/fuse_param.h?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>contrib/macfuse/fuse_param.h</a><br/>+++ b/<a href='/cgit/glusterfs.git/tree/contrib/macfuse/fuse_param.h?id=d1d7a6f35c816822fab51c820e25023863c239c1'>contrib/macfuse/fuse_param.h</a></div><div class='hunk'>@@ -1,4 +1,9 @@</div><div class='ctx'> /*</div><div class='add'>+ * 'rebel' branch modifications:</div><div class='add'>+ *     Copyright (C) 2010 Tuxera. All Rights Reserved.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+/*</div><div class='ctx'>  * Copyright (C) 2006-2008 Google. All Rights Reserved.</div><div class='ctx'>  * Amit Singh &lt;singh@&gt;</div><div class='ctx'>  */</div><div class='hunk'>@@ -6,69 +11,81 @@</div><div class='ctx'> #ifndef _FUSE_PARAM_H_</div><div class='ctx'> #define _FUSE_PARAM_H_</div><div class='ctx'> </div><div class='del'>-/* Compile-time tunables (M_MACFUSE*) */</div><div class='del'>-</div><div class='del'>-#define M_MACFUSE_ENABLE_FIFOFS            0</div><div class='del'>-#define M_MACFUSE_ENABLE_INTERRUPT         1</div><div class='del'>-#define M_MACFUSE_ENABLE_SPECFS            0</div><div class='del'>-#define M_MACFUSE_ENABLE_TSLOCKING         0</div><div class='del'>-#define M_MACFUSE_ENABLE_UNSUPPORTED       1</div><div class='del'>-#define M_MACFUSE_ENABLE_XATTR             1</div><div class='del'>-</div><div class='del'>-#if M_MACFUSE_ENABLE_UNSUPPORTED</div><div class='del'>-  #define M_MACFUSE_ENABLE_DSELECT         0</div><div class='del'>-  #define M_MACFUSE_ENABLE_EXCHANGE        1</div><div class='del'>-  #define M_MACFUSE_ENABLE_KQUEUE          1</div><div class='del'>-  #define M_MACFUSE_ENABLE_KUNC            0</div><div class='del'>-#if __LP64__</div><div class='del'>-    #define M_MACFUSE_ENABLE_INTERIM_FSNODE_LOCK 1</div><div class='del'>-#endif /* __LP64__ */</div><div class='del'>-#endif /* M_MACFUSE_ENABLE_UNSUPPORTED */</div><div class='del'>-</div><div class='del'>-#if M_MACFUSE_ENABLE_INTERIM_FSNODE_LOCK</div><div class='del'>-#define FUSE_VNOP_EXPORT __private_extern__</div><div class='add'>+#include &lt;AvailabilityMacros.h&gt;</div><div class='add'>+</div><div class='add'>+/* Compile-time tunables (M_OSXFUSE*) */</div><div class='add'>+</div><div class='add'>+#define M_OSXFUSE_ENABLE_FIFOFS                0</div><div class='add'>+#define M_OSXFUSE_ENABLE_INTERRUPT             1</div><div class='add'>+#define M_OSXFUSE_ENABLE_SPECFS                0</div><div class='add'>+#define M_OSXFUSE_ENABLE_TSLOCKING             1</div><div class='add'>+#define M_OSXFUSE_ENABLE_UNSUPPORTED           1</div><div class='add'>+#define M_OSXFUSE_ENABLE_XATTR                 1</div><div class='add'>+#define M_OSXFUSE_ENABLE_DSELECT               1</div><div class='add'>+</div><div class='add'>+#if M_OSXFUSE_ENABLE_UNSUPPORTED</div><div class='add'>+#  define M_OSXFUSE_ENABLE_EXCHANGE            1</div><div class='add'>+#  define M_OSXFUSE_ENABLE_KUNC                0</div><div class='add'>+#  define M_OSXFUSE_ENABLE_INTERIM_FSNODE_LOCK 1</div><div class='add'>+#endif /* M_OSXFUSE_ENABLE_UNSUPPORTED */</div><div class='add'>+</div><div class='add'>+#if MAC_OS_X_VERSION_MIN_REQUIRED &lt; 1060</div><div class='add'>+#  if M_OSXFUSE_ENABLE_UNSUPPORTED</div><div class='add'>+     /*</div><div class='add'>+      * In Mac OS X 10.5 the file system implementation is responsible for</div><div class='add'>+      * posting kqueue events. Starting with Mac OS X 10.6 VFS took over that</div><div class='add'>+      * job.</div><div class='add'>+      */</div><div class='add'>+#    define M_OSXFUSE_ENABLE_KQUEUE            1</div><div class='add'>+#  endif</div><div class='add'>+#endif /* MAC_OS_X_VERSION_MIN_REQUIRED &lt; 1060 */</div><div class='add'>+</div><div class='add'>+#if M_OSXFUSE_ENABLE_INTERIM_FSNODE_LOCK</div><div class='add'>+#  define M_OSXFUSE_ENABLE_HUGE_LOCK           0</div><div class='add'>+#  define M_OSXFUSE_ENABLE_LOCK_LOGGING        0</div><div class='add'>+#  define FUSE_VNOP_EXPORT __private_extern__</div><div class='ctx'> #else</div><div class='del'>-#define FUSE_VNOP_EXPORT static</div><div class='del'>-#endif /* M_MACFUSE_ENABLE_INTERIM_FSNODE_LOCK */</div><div class='add'>+#  define FUSE_VNOP_EXPORT static</div><div class='add'>+#endif /* M_OSXFUSE_ENABLE_INTERIM_FSNODE_LOCK */</div><div class='ctx'> </div><div class='ctx'> /* User Control */</div><div class='ctx'> </div><div class='del'>-#define MACFUSE_POSTUNMOUNT_SIGNAL         SIGKILL</div><div class='add'>+#define OSXFUSE_POSTUNMOUNT_SIGNAL         SIGKILL</div><div class='ctx'> </div><div class='ctx'> #define MACOSX_ADMIN_GROUP_NAME            "admin"</div><div class='ctx'> </div><div class='del'>-#define SYSCTL_MACFUSE_TUNABLES_ADMIN      "macfuse.tunables.admin_group"</div><div class='del'>-#define SYSCTL_MACFUSE_VERSION_NUMBER      "macfuse.version.number"</div><div class='add'>+#define SYSCTL_OSXFUSE_TUNABLES_ADMIN      "osxfuse.tunables.admin_group"</div><div class='add'>+#define SYSCTL_OSXFUSE_VERSION_NUMBER      "osxfuse.version.number"</div><div class='ctx'> </div><div class='ctx'> /* Paths */</div><div class='ctx'> </div><div class='del'>-#define MACFUSE_BUNDLE_PATH "/Library/Filesystems/fusefs.fs"</div><div class='del'>-#define MACFUSE_KEXT        MACFUSE_BUNDLE_PATH "/Support/fusefs.kext"</div><div class='del'>-#define MACFUSE_LOAD_PROG   MACFUSE_BUNDLE_PATH "/Support/load_fusefs"</div><div class='del'>-#define MACFUSE_MOUNT_PROG  MACFUSE_BUNDLE_PATH "/Support/mount_fusefs"</div><div class='add'>+#define OSXFUSE_BUNDLE_PATH "/Library/Filesystems/osxfusefs.fs"</div><div class='add'>+#define OSXFUSE_KEXT        OSXFUSE_BUNDLE_PATH "/Support/osxfusefs.kext"</div><div class='add'>+#define OSXFUSE_LOAD_PROG   OSXFUSE_BUNDLE_PATH "/Support/load_osxfusefs"</div><div class='add'>+#define OSXFUSE_MOUNT_PROG  OSXFUSE_BUNDLE_PATH "/Support/mount_osxfusefs"</div><div class='ctx'> #define SYSTEM_KEXTLOAD     "/sbin/kextload"</div><div class='ctx'> #define SYSTEM_KEXTUNLOAD   "/sbin/kextunload"</div><div class='ctx'> </div><div class='ctx'> /* Compatible API version */</div><div class='ctx'> </div><div class='del'>-#define MACFUSE_MIN_USER_VERSION_MAJOR     7</div><div class='del'>-#define MACFUSE_MIN_USER_VERSION_MINOR     5</div><div class='add'>+#define OSXFUSE_MIN_USER_VERSION_MAJOR     7</div><div class='add'>+#define OSXFUSE_MIN_USER_VERSION_MINOR     5</div><div class='ctx'> </div><div class='ctx'> /* Device Interface */</div><div class='ctx'> </div><div class='ctx'> /*</div><div class='del'>- * This is the prefix ("fuse" by default) of the name of a FUSE device node</div><div class='del'>- * in devfs. The suffix is the device number. "/dev/fuse0" is the first FUSE</div><div class='add'>+ * This is the prefix ("osxfuse" by default) of the name of a FUSE device node</div><div class='add'>+ * in devfs. The suffix is the device number. "/dev/osxfuse0" is the first FUSE</div><div class='ctx'>  * device by default. If you change the prefix from the default to something</div><div class='ctx'>  * else, the user-space FUSE library will need to know about it too.</div><div class='ctx'>  */</div><div class='del'>-#define MACFUSE_DEVICE_BASENAME            "fuse"</div><div class='add'>+#define OSXFUSE_DEVICE_BASENAME            "osxfuse"</div><div class='ctx'> </div><div class='ctx'> /*</div><div class='del'>- * This is the number of /dev/fuse&lt;n&gt; nodes we will create. &lt;n&gt; goes from</div><div class='del'>- * 0 to (FUSE_NDEVICES - 1).</div><div class='add'>+ * This is the number of /dev/osxfuse&lt;n&gt; nodes we will create. &lt;n&gt; goes from</div><div class='add'>+ * 0 to (OSXFUSE_NDEVICES - 1).</div><div class='ctx'>  */</div><div class='del'>-#define MACFUSE_NDEVICES                   24</div><div class='add'>+#define OSXFUSE_NDEVICES                   24</div><div class='ctx'> </div><div class='ctx'> /*</div><div class='ctx'>  * This is the default block size of the virtual storage devices that are</div><div class='hunk'>@@ -131,13 +148,13 @@</div><div class='ctx'> /* User-Kernel IPC Buffer */</div><div class='ctx'> </div><div class='ctx'> #define FUSE_MIN_USERKERNEL_BUFSIZE        (128  * 1024)</div><div class='del'>-#define FUSE_MAX_USERKERNEL_BUFSIZE        (4096 * 1024)</div><div class='add'>+#define FUSE_MAX_USERKERNEL_BUFSIZE        (16   * 1024 * 1024)</div><div class='ctx'> </div><div class='ctx'> #define FUSE_REASONABLE_XATTRSIZE          FUSE_MIN_USERKERNEL_BUFSIZE</div><div class='ctx'> </div><div class='ctx'> #endif /* KERNEL */</div><div class='ctx'> </div><div class='del'>-#define FUSE_DEFAULT_USERKERNEL_BUFSIZE    (4096 * 1024)</div><div class='add'>+#define FUSE_DEFAULT_USERKERNEL_BUFSIZE    (16   * 1024 * 1024)</div><div class='ctx'> </div><div class='ctx'> #define FUSE_LINK_MAX                      LINK_MAX</div><div class='ctx'> #define FUSE_UIO_BACKUP_MAX                8</div><div class='head'>diff --git a/contrib/macfuse/mount_darwin.c b/contrib/macfuse/mount_darwin.c<br/>index 9d87fca3596..d1d1c34e761 100644<br/>--- a/<a href='/cgit/glusterfs.git/tree/contrib/macfuse/mount_darwin.c?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>contrib/macfuse/mount_darwin.c</a><br/>+++ b/<a href='/cgit/glusterfs.git/tree/contrib/macfuse/mount_darwin.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>contrib/macfuse/mount_darwin.c</a></div><div class='hunk'>@@ -1,5 +1,5 @@</div><div class='ctx'> /*</div><div class='del'>- * Derived from mount_bsd.c from the fuse distribution.</div><div class='add'>+ *  Derived from mount_bsd.c from the fuse distribution.</div><div class='ctx'>  *</div><div class='ctx'>  *  FUSE: Filesystem in Userspace</div><div class='ctx'>  *  Copyright (C) 2005-2006 Csaba Henk &lt;csaba.henk@creo.hu&gt;</div><div class='hunk'>@@ -34,323 +34,231 @@</div><div class='ctx'> #include "fuse_param.h"</div><div class='ctx'> #include "fuse_ioctl.h"</div><div class='ctx'> </div><div class='del'>-#include "glusterfs.h"</div><div class='del'>-#include "logging.h"</div><div class='del'>-#include "common-utils.h"</div><div class='add'>+#include "glusterfs/glusterfs.h"</div><div class='add'>+#include "glusterfs/logging.h"</div><div class='add'>+#include "glusterfs/common-utils.h"</div><div class='ctx'> </div><div class='ctx'> #define GFFUSE_LOGERR(...) \</div><div class='ctx'>         gf_log ("glusterfs-fuse", GF_LOG_ERROR, ## __VA_ARGS__)</div><div class='ctx'> </div><div class='del'>-static long</div><div class='del'>-fuse_os_version_major_np(void)</div><div class='del'>-{</div><div class='del'>-    int ret = 0;</div><div class='del'>-    long major = 0;</div><div class='del'>-    char *c = NULL;</div><div class='del'>-    struct utsname u;</div><div class='del'>-    size_t oldlen;</div><div class='del'>-</div><div class='del'>-    oldlen = sizeof(u.release);</div><div class='del'>-</div><div class='del'>-    ret = sysctlbyname("kern.osrelease", u.release, &amp;oldlen, NULL, 0);</div><div class='del'>-    if (ret != 0) {</div><div class='del'>-        return -1;</div><div class='del'>-    }</div><div class='del'>-</div><div class='del'>-    c = strchr(u.release, '.');</div><div class='del'>-    if (c == NULL) {</div><div class='del'>-        return -1;</div><div class='del'>-    }</div><div class='del'>-</div><div class='del'>-    *c = '\0';</div><div class='del'>-</div><div class='del'>-    errno = 0;</div><div class='del'>-    major = strtol(u.release, NULL, 10);</div><div class='del'>-    if ((errno == EINVAL) || (errno == ERANGE)) {</div><div class='del'>-        return -1;</div><div class='del'>-    }</div><div class='del'>-</div><div class='del'>-    return major;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-static int</div><div class='del'>-fuse_running_under_rosetta(void)</div><div class='del'>-{</div><div class='del'>-    int result = 0;</div><div class='del'>-    int is_native = 1;</div><div class='del'>-    size_t sz = sizeof(result);</div><div class='del'>-</div><div class='del'>-    int ret = sysctlbyname("sysctl.proc_native", &amp;result, &amp;sz, NULL, (size_t)0);</div><div class='del'>-    if ((ret == 0) &amp;&amp; !result) {</div><div class='del'>-        is_native = 0;</div><div class='del'>-    }</div><div class='del'>-</div><div class='del'>-    return !is_native;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-static int</div><div class='del'>-loadkmod(void)</div><div class='del'>-{</div><div class='del'>-    int result = -1;</div><div class='del'>-    int pid, terminated_pid;</div><div class='del'>-    union wait status;</div><div class='del'>-    long major;</div><div class='del'>-</div><div class='del'>-    major = fuse_os_version_major_np();</div><div class='del'>-</div><div class='del'>-    if (major &lt; 9) { /* not Mac OS X 10.5+ */</div><div class='del'>-        return EINVAL;</div><div class='del'>-    }</div><div class='del'>-</div><div class='del'>-    pid = fork();</div><div class='del'>-</div><div class='del'>-    if (pid == 0) {</div><div class='del'>-        execl(MACFUSE_LOAD_PROG, MACFUSE_LOAD_PROG, NULL);</div><div class='del'>-</div><div class='del'>-        /* exec failed */</div><div class='del'>-        exit(ENOENT);</div><div class='del'>-    }</div><div class='del'>-</div><div class='del'>-    require_action(pid != -1, Return, result = errno);</div><div class='del'>-</div><div class='del'>-    while ((terminated_pid = wait4(pid, (int *)&amp;status, 0, NULL)) &lt; 0) {</div><div class='del'>-        /* retry if EINTR, else break out with error */</div><div class='del'>-        if (errno != EINTR) {</div><div class='del'>-            break;</div><div class='del'>-        }</div><div class='del'>-    }</div><div class='del'>-</div><div class='del'>-    if ((terminated_pid == pid) &amp;&amp; (WIFEXITED(status))) {</div><div class='del'>-        result = WEXITSTATUS(status);</div><div class='del'>-    } else {</div><div class='del'>-        result = -1;</div><div class='del'>-    }</div><div class='del'>-</div><div class='del'>-Return:</div><div class='del'>-    check_noerr_string(result, strerror(errno));</div><div class='del'>-</div><div class='del'>-    return result;</div><div class='del'>-}</div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-gf_fuse_mount (const char *mountpoint, char *fsname, char *mnt_param)</div><div class='add'>+gf_fuse_mount (const char *mountpoint, char *fsname, char *mnt_param,</div><div class='add'>+               pid_t *mnt_pid, int status_fd) /* Not used on OS X */</div><div class='ctx'> {</div><div class='del'>-    int fd, pid;</div><div class='del'>-    int result;</div><div class='del'>-    char *fdnam, *dev;</div><div class='del'>-    const char *mountprog = MACFUSE_MOUNT_PROG;</div><div class='del'>-    sig_t chldf;</div><div class='add'>+        int fd       = 0;</div><div class='add'>+        int pid      = 0;</div><div class='add'>+        int ret      = 0;</div><div class='add'>+        char *fdnam  = NULL;</div><div class='add'>+        char *dev    = NULL;</div><div class='add'>+        char vstr[4];</div><div class='add'>+        unsigned vval = 0;</div><div class='add'>+        int i        = 0;</div><div class='add'>+</div><div class='add'>+        const char *mountprog              = OSXFUSE_MOUNT_PROG;</div><div class='add'>+        sig_t chldf                        = SIG_ERR;</div><div class='add'>+        char   version[MAXHOSTNAMELEN + 1] = { 0 };</div><div class='add'>+        size_t version_len                 = MAXHOSTNAMELEN;</div><div class='add'>+        size_t version_len_desired         = 0;</div><div class='add'>+        int r                              = 0;</div><div class='add'>+        char devpath[MAXPATHLEN]           = { 0 };;</div><div class='add'>+</div><div class='add'>+        if (!mountpoint) {</div><div class='add'>+                gf_log ("glustefs-fuse", GF_LOG_ERROR,</div><div class='add'>+                        "missing or invalid mount point");</div><div class='add'>+                goto err;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-    /* mount_fusefs should not try to spawn the daemon */</div><div class='del'>-    setenv("MOUNT_FUSEFS_SAFE", "1", 1);</div><div class='add'>+        /* mount_fusefs should not try to spawn the daemon */</div><div class='add'>+        setenv("MOUNT_FUSEFS_SAFE", "1", 1);</div><div class='ctx'> </div><div class='del'>-    /* to notify mount_fusefs it's called from lib */</div><div class='del'>-    setenv("MOUNT_FUSEFS_CALL_BY_LIB", "1", 1);</div><div class='add'>+        /* to notify mount_fusefs it's called from lib */</div><div class='add'>+        setenv("MOUNT_FUSEFS_CALL_BY_LIB", "1", 1);</div><div class='ctx'> </div><div class='del'>-    if (!mountpoint) {</div><div class='del'>-        fprintf(stderr, "missing or invalid mount point\n");</div><div class='del'>-        return -1;</div><div class='del'>-    }</div><div class='add'>+        chldf = signal(SIGCHLD, SIG_DFL); /* So that we can wait4() below. */</div><div class='ctx'> </div><div class='del'>-    if (fuse_running_under_rosetta()) {</div><div class='del'>-        fprintf(stderr, "MacFUSE does not work under Rosetta\n");</div><div class='del'>-        return -1;</div><div class='del'>-    }</div><div class='add'>+        if (chldf == SIG_ERR) {</div><div class='add'>+                gf_log ("glusterfs-fuse", GF_LOG_ERROR,</div><div class='add'>+                        "signal() returned SIG_ERR: %s",</div><div class='add'>+                        strerror(errno));</div><div class='add'>+                goto err;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-    chldf = signal(SIGCHLD, SIG_DFL); /* So that we can wait4() below. */</div><div class='add'>+        /* check for user&lt;-&gt;kernel match. */</div><div class='add'>+        ret = sysctlbyname(SYSCTL_OSXFUSE_VERSION_NUMBER, version,</div><div class='add'>+                              &amp;version_len, NULL, (size_t)0);</div><div class='add'>+        if (ret != 0) {</div><div class='add'>+                gf_log ("glustefs-fuse", GF_LOG_ERROR,</div><div class='add'>+                        "sysctlbyname() returned error: %s",</div><div class='add'>+                        strerror(errno));</div><div class='add'>+                goto err;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-    result = loadkmod();</div><div class='del'>-    if (result == EINVAL)</div><div class='del'>-        GFFUSE_LOGERR("OS X &gt;= 10.5 (at least Leopard) required");</div><div class='del'>-    else if (result == 0 || result == ENOENT || result == EBUSY) {</div><div class='del'>-        /* Module loaded, but now need to check for user&lt;-&gt;kernel match. */</div><div class='add'>+        /* sysctlbyname() includes the trailing '\0' in version_len */</div><div class='add'>+        version_len_desired = sizeof ("2.x.y");</div><div class='ctx'> </div><div class='del'>-        char   version[MAXHOSTNAMELEN + 1] = { 0 };</div><div class='del'>-        size_t version_len = MAXHOSTNAMELEN;</div><div class='del'>-        size_t version_len_desired = 0;</div><div class='add'>+        if (version_len != version_len_desired) {</div><div class='add'>+                gf_log ("glusterfs-fuse", GF_LOG_ERROR,</div><div class='add'>+                        "version length mismatch for OSXFUSE %s",</div><div class='add'>+                        version);</div><div class='add'>+                ret = -1;</div><div class='add'>+                goto err;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-        result = sysctlbyname(SYSCTL_MACFUSE_VERSION_NUMBER, version,</div><div class='del'>-                              &amp;version_len, NULL, (size_t)0);</div><div class='del'>-        if (result == 0) {</div><div class='del'>-            /* sysctlbyname() includes the trailing '\0' in version_len */</div><div class='del'>-            version_len_desired = strlen("2.x.y") + 1;</div><div class='del'>-</div><div class='del'>-            if (version_len != version_len_desired)</div><div class='del'>-                result = -1;</div><div class='del'>-        } else</div><div class='del'>-            strcpy(version, "?.?.?");</div><div class='del'>-        if (result == 0) {</div><div class='del'>-            char *ep;</div><div class='del'>-            char vstr[4];</div><div class='del'>-            unsigned vval;</div><div class='del'>-            int i;</div><div class='del'>-</div><div class='del'>-            for (i = 0; i &lt; 3; i++)</div><div class='add'>+        for (i = 0; i &lt; 3; i++)</div><div class='ctx'>                 vstr[i] = version[2*i];</div><div class='del'>-            vstr[3] = '\0';</div><div class='del'>-</div><div class='del'>-            vval = strtoul(vstr, &amp;ep, 10);</div><div class='del'>-            if (*ep || vval &lt; 203 || vval &gt; 217)</div><div class='del'>-                result = -1;</div><div class='del'>-            else</div><div class='del'>-                gf_log("glusterfs-fuse", GF_LOG_INFO,</div><div class='del'>-                       "MacFUSE kext version %s", version);</div><div class='del'>-        }</div><div class='del'>-        if (result != 0)</div><div class='del'>-            GFFUSE_LOGERR("MacFUSE version %s is not supported", version);</div><div class='del'>-    } else</div><div class='del'>-        GFFUSE_LOGERR("cannot load MacFUSE kext");</div><div class='del'>-    if (result != 0)</div><div class='del'>-        return -1;</div><div class='del'>-</div><div class='del'>-    fdnam = getenv("FUSE_DEV_FD");</div><div class='del'>-</div><div class='del'>-    if (fdnam) {</div><div class='del'>-        char *ep;</div><div class='del'>-</div><div class='del'>-        fd = strtol(fdnam, &amp;ep, 10);</div><div class='del'>-        if (*ep != '\0' || fd &lt; 0) {</div><div class='del'>-            GFFUSE_LOGERR("invalid value given in FUSE_DEV_FD");</div><div class='del'>-            return -1;</div><div class='add'>+        vstr[3] = '\0';</div><div class='add'>+</div><div class='add'>+        vval = strtoul(vstr, NULL, 10);</div><div class='add'>+        if (vval &lt; 264) {</div><div class='add'>+                GFFUSE_LOGERR("OSXFUSE version %s is not supported", version);</div><div class='add'>+                ret = -1;</div><div class='add'>+                goto err;</div><div class='ctx'>         }</div><div class='ctx'> </div><div class='del'>-        goto mount;</div><div class='del'>-    }</div><div class='add'>+        gf_log("glusterfs-fuse", GF_LOG_INFO,</div><div class='add'>+               "OSXFUSE kext version supported %s", version);</div><div class='ctx'> </div><div class='del'>-    dev = getenv("FUSE_DEV_NAME");</div><div class='del'>-    if (dev) {</div><div class='del'>-        if ((fd = open(dev, O_RDWR)) &lt; 0) {</div><div class='del'>-            GFFUSE_LOGERR("failed to open device (%s)", strerror(errno));</div><div class='del'>-            return -1;</div><div class='add'>+        fdnam = getenv("FUSE_DEV_FD");</div><div class='add'>+        if (fdnam) {</div><div class='add'>+                fd = strtol(fdnam, NULL, 10);</div><div class='add'>+                if (fd &lt; 0) {</div><div class='add'>+                        GFFUSE_LOGERR("invalid value given in FUSE_DEV_FD");</div><div class='add'>+                        ret = -1;</div><div class='add'>+                        goto err;</div><div class='add'>+                }</div><div class='add'>+                goto mount;</div><div class='ctx'>         }</div><div class='del'>-    } else {</div><div class='del'>-        int r, devidx = -1;</div><div class='del'>-        char devpath[MAXPATHLEN];</div><div class='del'>-</div><div class='del'>-        for (r = 0; r &lt; MACFUSE_NDEVICES; r++) {</div><div class='del'>-            snprintf(devpath, MAXPATHLEN - 1,</div><div class='del'>-                     _PATH_DEV MACFUSE_DEVICE_BASENAME "%d", r);</div><div class='del'>-            fd = open(devpath, O_RDWR);</div><div class='del'>-            if (fd &gt;= 0) {</div><div class='del'>-                dev = devpath;</div><div class='del'>-                devidx = r;</div><div class='del'>-                break;</div><div class='del'>-            }</div><div class='add'>+</div><div class='add'>+        dev = getenv("FUSE_DEV_NAME");</div><div class='add'>+        if (!dev) {</div><div class='add'>+                for (r = 0; r &lt; OSXFUSE_NDEVICES; r++) {</div><div class='add'>+                        snprintf(devpath, MAXPATHLEN - 1,</div><div class='add'>+                                 _PATH_DEV OSXFUSE_DEVICE_BASENAME "%d", r);</div><div class='add'>+                        if ((fd = open(devpath, O_RDWR)) &lt; 0) {</div><div class='add'>+                                GFFUSE_LOGERR("failed to open device %s (%s)",</div><div class='add'>+                                              devpath,</div><div class='add'>+                                              strerror(errno));</div><div class='add'>+                                goto err;</div><div class='add'>+                        }</div><div class='add'>+                        dev = devpath;</div><div class='add'>+                        goto mount;</div><div class='add'>+                }</div><div class='ctx'>         }</div><div class='del'>-        if (devidx == -1) {</div><div class='del'>-            GFFUSE_LOGERR("failed to open device (%s)", strerror(errno));</div><div class='del'>-            return -1;</div><div class='add'>+</div><div class='add'>+        fd = open(dev, O_RDWR);</div><div class='add'>+        if (fd &lt; 0) {</div><div class='add'>+                GFFUSE_LOGERR("failed to open device %s (%s)", dev,</div><div class='add'>+                              strerror(errno));</div><div class='add'>+                ret = -1;</div><div class='add'>+                goto err;</div><div class='ctx'>         }</div><div class='del'>-    }</div><div class='ctx'> </div><div class='ctx'> mount:</div><div class='del'>-    if (getenv("FUSE_NO_MOUNT") || ! mountpoint)</div><div class='del'>-        goto out;</div><div class='del'>-</div><div class='del'>-    signal(SIGCHLD, chldf);</div><div class='del'>-</div><div class='del'>-    pid = fork();</div><div class='del'>-</div><div class='del'>-    if (pid == -1) {</div><div class='del'>-        GFFUSE_LOGERR("fork() failed (%s)", strerror(errno));</div><div class='del'>-        close(fd);</div><div class='del'>-        return -1;</div><div class='del'>-    }</div><div class='del'>-</div><div class='del'>-    if (pid == 0) {</div><div class='add'>+        signal(SIGCHLD, chldf);</div><div class='ctx'> </div><div class='ctx'>         pid = fork();</div><div class='ctx'>         if (pid == -1) {</div><div class='del'>-            GFFUSE_LOGERR("fork() failed (%s)", strerror(errno));</div><div class='del'>-            close(fd);</div><div class='del'>-            exit(1);</div><div class='add'>+                GFFUSE_LOGERR("fork() failed (%s)", strerror(errno));</div><div class='add'>+                ret = -1;</div><div class='add'>+                goto err;</div><div class='ctx'>         }</div><div class='ctx'> </div><div class='ctx'>         if (pid == 0) {</div><div class='del'>-            const char *argv[32];</div><div class='del'>-            int a = 0;</div><div class='del'>-            char *opts = NULL;</div><div class='del'>-</div><div class='del'>-            if (asprintf(&amp;opts, "%s,fssubtype=glusterfs", mnt_param) == -1) {</div><div class='del'>-                GFFUSE_LOGERR("Out of memory");</div><div class='del'>-		exit(1);</div><div class='del'>-            }</div><div class='del'>-</div><div class='del'>-            if (! fdnam)</div><div class='del'>-                asprintf(&amp;fdnam, "%d", fd);</div><div class='del'>-</div><div class='del'>-            argv[a++] = mountprog;</div><div class='del'>-            if (opts) {</div><div class='del'>-                argv[a++] = "-o";</div><div class='del'>-                argv[a++] = opts;</div><div class='del'>-            }</div><div class='del'>-            argv[a++] = fdnam;</div><div class='del'>-            argv[a++] = mountpoint;</div><div class='del'>-            argv[a++] = NULL;</div><div class='del'>-</div><div class='del'>-            {</div><div class='del'>-                char title[MAXPATHLEN + 1] = { 0 };</div><div class='del'>-                u_int32_t len = MAXPATHLEN;</div><div class='del'>-                int ret = proc_pidpath(getpid(), title, len);</div><div class='del'>-                if (ret) {</div><div class='del'>-                    setenv("MOUNT_FUSEFS_DAEMON_PATH", title, 1);</div><div class='add'>+                pid = fork();</div><div class='add'>+                if (pid == -1) {</div><div class='add'>+                        GFFUSE_LOGERR("fork() failed (%s)", strerror(errno));</div><div class='add'>+                        ret = -1;</div><div class='add'>+                        goto err;</div><div class='ctx'>                 }</div><div class='del'>-            }</div><div class='del'>-            execvp(mountprog, (char **) argv);</div><div class='del'>-            GFFUSE_LOGERR("MacFUSE: failed to exec mount program (%s)", strerror(errno));</div><div class='del'>-            exit(1);</div><div class='del'>-        }</div><div class='ctx'> </div><div class='del'>-        _exit(0);</div><div class='del'>-    }</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-    return fd;</div><div class='add'>+                if (pid == 0) {</div><div class='add'>+                        const char *argv[32];</div><div class='add'>+                        int a = 0;</div><div class='add'>+                        char *opts = NULL;</div><div class='add'>+</div><div class='add'>+                        if (asprintf(&amp;opts, "%s,fssubtype=glusterfs",</div><div class='add'>+                                     mnt_param) == -1) {</div><div class='add'>+                                GFFUSE_LOGERR("asprintf() error: %s",</div><div class='add'>+                                              strerror(errno));</div><div class='add'>+                                ret = -1;</div><div class='add'>+                                goto err;</div><div class='add'>+                        }</div><div class='add'>+</div><div class='add'>+                        if (!fdnam)</div><div class='add'>+                                asprintf(&amp;fdnam, "%d", fd);</div><div class='add'>+</div><div class='add'>+                        argv[a++] = mountprog;</div><div class='add'>+                        if (opts) {</div><div class='add'>+                                argv[a++] = "-o";</div><div class='add'>+                                argv[a++] = opts;</div><div class='add'>+                        }</div><div class='add'>+                        argv[a++] = fdnam;</div><div class='add'>+                        argv[a++] = mountpoint;</div><div class='add'>+                        argv[a++] = NULL;</div><div class='add'>+</div><div class='add'>+                        {</div><div class='add'>+                                char title[MAXPATHLEN + 1] = { 0 };</div><div class='add'>+                                u_int32_t len = MAXPATHLEN;</div><div class='add'>+                                int ret = proc_pidpath(getpid(), title, len);</div><div class='add'>+                                if (ret) {</div><div class='add'>+                                        setenv("MOUNT_FUSEFS_DAEMON_PATH",</div><div class='add'>+                                               title, 1);</div><div class='add'>+                                }</div><div class='add'>+                        }</div><div class='add'>+                        execvp(mountprog, (char **) argv);</div><div class='add'>+                        GFFUSE_LOGERR("OSXFUSE: failed to exec mount"</div><div class='add'>+                                      " program (%s)", strerror(errno));</div><div class='add'>+                        _exit(1);</div><div class='add'>+                }</div><div class='add'>+                _exit(0);</div><div class='add'>+        }</div><div class='add'>+        ret = fd;</div><div class='add'>+err:</div><div class='add'>+        if (ret == -1) {</div><div class='add'>+                if (fd &gt; 0) {</div><div class='add'>+                        close(fd);</div><div class='add'>+                }</div><div class='add'>+        }</div><div class='add'>+        return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> void</div><div class='ctx'> gf_fuse_unmount(const char *mountpoint, int fd)</div><div class='ctx'> {</div><div class='del'>-    int ret;</div><div class='del'>-    struct stat sbuf;</div><div class='del'>-    char dev[128];</div><div class='del'>-    char resolved_path[PATH_MAX];</div><div class='del'>-    char *ep, *rp = NULL;</div><div class='del'>-</div><div class='del'>-    unsigned int hs_complete = 0;</div><div class='add'>+        int ret;</div><div class='add'>+        struct stat sbuf;</div><div class='add'>+        char dev[128];</div><div class='add'>+        char resolved_path[PATH_MAX];</div><div class='add'>+        char *ep, *rp = NULL;</div><div class='ctx'> </div><div class='del'>-    ret = ioctl(fd, FUSEDEVIOCGETHANDSHAKECOMPLETE, &amp;hs_complete);</div><div class='del'>-    if (ret || !hs_complete) {</div><div class='del'>-        return;</div><div class='del'>-    }</div><div class='del'>-    /* XXX does this have any use here? */</div><div class='del'>-    ret = ioctl(fd,  FUSEDEVIOCSETDAEMONDEAD, &amp;fd);</div><div class='del'>-    if (ret) {</div><div class='del'>-        return;</div><div class='del'>-    }</div><div class='add'>+        unsigned int hs_complete = 0;</div><div class='ctx'> </div><div class='del'>-    if (fstat(fd, &amp;sbuf) == -1) {</div><div class='del'>-        return;</div><div class='del'>-    }</div><div class='add'>+        ret = ioctl(fd, FUSEDEVIOCGETHANDSHAKECOMPLETE, &amp;hs_complete);</div><div class='add'>+        if (ret || !hs_complete) {</div><div class='add'>+                return;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-    devname_r(sbuf.st_rdev, S_IFCHR, dev, 128);</div><div class='add'>+        if (fstat(fd, &amp;sbuf) == -1) {</div><div class='add'>+                return;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-    if (strncmp(dev, MACFUSE_DEVICE_BASENAME,</div><div class='del'>-                sizeof(MACFUSE_DEVICE_BASENAME) - 1)) {</div><div class='del'>-        return;</div><div class='del'>-    }</div><div class='add'>+        devname_r(sbuf.st_rdev, S_IFCHR, dev, 128);</div><div class='ctx'> </div><div class='del'>-    strtol(dev + 4, &amp;ep, 10);</div><div class='del'>-    if (*ep != '\0') {</div><div class='del'>-        return;</div><div class='del'>-    }</div><div class='add'>+        if (strncmp(dev, OSXFUSE_DEVICE_BASENAME,</div><div class='add'>+                    sizeof(OSXFUSE_DEVICE_BASENAME) - 1)) {</div><div class='add'>+                return;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-    rp = realpath(mountpoint, resolved_path);</div><div class='del'>-    if (rp) {</div><div class='del'>-        ret = unmount(resolved_path, 0);</div><div class='del'>-    }</div><div class='add'>+        strtol(dev + sizeof(OSXFUSE_DEVICE_BASENAME) - 1, &amp;ep, 10);</div><div class='add'>+        if (*ep != '\0') {</div><div class='add'>+                return;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-    close(fd);</div><div class='add'>+        rp = realpath(mountpoint, resolved_path);</div><div class='add'>+        if (rp) {</div><div class='add'>+                ret = unmount(resolved_path, 0);</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-    return;</div><div class='add'>+        close(fd);</div><div class='add'>+        return;</div><div class='ctx'> }</div><div class='head'>diff --git a/contrib/md5/md5.c b/contrib/md5/md5.c<br/>deleted file mode 100644<br/>index 5f0d0d157bf..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/contrib/md5/md5.c?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>contrib/md5/md5.c</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,310 +0,0 @@</div><div class='del'>-/*</div><div class='del'>- * RFC 1321 compliant MD5 implementation</div><div class='del'>- *</div><div class='del'>- * Copyright (C) 2001-2003 Christophe Devine</div><div class='del'>- *</div><div class='del'>- * This program is free software; you can redistribute it and/or modify</div><div class='del'>- * it under the terms of the GNU General Public License as published by</div><div class='del'>- * the Free Software Foundation; either version 3 of the License, or</div><div class='del'>- * (at your option) any later version.</div><div class='del'>- *</div><div class='del'>- * This program is distributed in the hope that it will be useful,</div><div class='del'>- * but WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the</div><div class='del'>- * GNU General Public License for more details.</div><div class='del'>- *</div><div class='del'>- * You should have received a copy of the GNU General Public License along</div><div class='del'>- * with this program; if not, visit the http://fsf.org website.</div><div class='del'>- */</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-#include &lt;inttypes.h&gt;</div><div class='del'>-#include &lt;string.h&gt;</div><div class='del'>-</div><div class='del'>-#include "md5.h"</div><div class='del'>-</div><div class='del'>-void md5_begin(md_context *ctx)</div><div class='del'>-{</div><div class='del'>-	ctx-&gt;A = 0x67452301;</div><div class='del'>-	ctx-&gt;B = 0xEFCDAB89;</div><div class='del'>-	ctx-&gt;C = 0x98BADCFE;</div><div class='del'>-	ctx-&gt;D = 0x10325476;</div><div class='del'>-</div><div class='del'>-	ctx-&gt;totalN = ctx-&gt;totalN2 = 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-static void md5_process(md_context *ctx, const uint8_t data[CSUM_CHUNK])</div><div class='del'>-{</div><div class='del'>-	uint32_t X[16], A, B, C, D;</div><div class='del'>-</div><div class='del'>-	A = ctx-&gt;A;</div><div class='del'>-	B = ctx-&gt;B;</div><div class='del'>-	C = ctx-&gt;C;</div><div class='del'>-	D = ctx-&gt;D;</div><div class='del'>-</div><div class='del'>-	X[0] = IVAL(data, 0);</div><div class='del'>-	X[1] = IVAL(data, 4);</div><div class='del'>-	X[2] = IVAL(data, 8);</div><div class='del'>-	X[3] = IVAL(data, 12);</div><div class='del'>-	X[4] = IVAL(data, 16);</div><div class='del'>-	X[5] = IVAL(data, 20);</div><div class='del'>-	X[6] = IVAL(data, 24);</div><div class='del'>-	X[7] = IVAL(data, 28);</div><div class='del'>-	X[8] = IVAL(data, 32);</div><div class='del'>-	X[9] = IVAL(data, 36);</div><div class='del'>-	X[10] = IVAL(data, 40);</div><div class='del'>-	X[11] = IVAL(data, 44);</div><div class='del'>-	X[12] = IVAL(data, 48);</div><div class='del'>-	X[13] = IVAL(data, 52);</div><div class='del'>-	X[14] = IVAL(data, 56);</div><div class='del'>-	X[15] = IVAL(data, 60);</div><div class='del'>-</div><div class='del'>-#define S(x,n) ((x &lt;&lt; n) | ((x &amp; 0xFFFFFFFF) &gt;&gt; (32 - n)))</div><div class='del'>-</div><div class='del'>-#define P(a,b,c,d,k,s,t) a += F(b,c,d) + X[k] + t, a = S(a,s) + b</div><div class='del'>-</div><div class='del'>-#define F(x,y,z) (z ^ (x &amp; (y ^ z)))</div><div class='del'>-</div><div class='del'>-	P(A, B, C, D,  0,  7, 0xD76AA478);</div><div class='del'>-	P(D, A, B, C,  1, 12, 0xE8C7B756);</div><div class='del'>-	P(C, D, A, B,  2, 17, 0x242070DB);</div><div class='del'>-	P(B, C, D, A,  3, 22, 0xC1BDCEEE);</div><div class='del'>-	P(A, B, C, D,  4,  7, 0xF57C0FAF);</div><div class='del'>-	P(D, A, B, C,  5, 12, 0x4787C62A);</div><div class='del'>-	P(C, D, A, B,  6, 17, 0xA8304613);</div><div class='del'>-	P(B, C, D, A,  7, 22, 0xFD469501);</div><div class='del'>-	P(A, B, C, D,  8,  7, 0x698098D8);</div><div class='del'>-	P(D, A, B, C,  9, 12, 0x8B44F7AF);</div><div class='del'>-	P(C, D, A, B, 10, 17, 0xFFFF5BB1);</div><div class='del'>-	P(B, C, D, A, 11, 22, 0x895CD7BE);</div><div class='del'>-	P(A, B, C, D, 12,  7, 0x6B901122);</div><div class='del'>-	P(D, A, B, C, 13, 12, 0xFD987193);</div><div class='del'>-	P(C, D, A, B, 14, 17, 0xA679438E);</div><div class='del'>-	P(B, C, D, A, 15, 22, 0x49B40821);</div><div class='del'>-</div><div class='del'>-#undef F</div><div class='del'>-#define F(x,y,z) (y ^ (z &amp; (x ^ y)))</div><div class='del'>-</div><div class='del'>-	P(A, B, C, D,  1,  5, 0xF61E2562);</div><div class='del'>-	P(D, A, B, C,  6,  9, 0xC040B340);</div><div class='del'>-	P(C, D, A, B, 11, 14, 0x265E5A51);</div><div class='del'>-	P(B, C, D, A,  0, 20, 0xE9B6C7AA);</div><div class='del'>-	P(A, B, C, D,  5,  5, 0xD62F105D);</div><div class='del'>-	P(D, A, B, C, 10,  9, 0x02441453);</div><div class='del'>-	P(C, D, A, B, 15, 14, 0xD8A1E681);</div><div class='del'>-	P(B, C, D, A,  4, 20, 0xE7D3FBC8);</div><div class='del'>-	P(A, B, C, D,  9,  5, 0x21E1CDE6);</div><div class='del'>-	P(D, A, B, C, 14,  9, 0xC33707D6);</div><div class='del'>-	P(C, D, A, B,  3, 14, 0xF4D50D87);</div><div class='del'>-	P(B, C, D, A,  8, 20, 0x455A14ED);</div><div class='del'>-	P(A, B, C, D, 13,  5, 0xA9E3E905);</div><div class='del'>-	P(D, A, B, C,  2,  9, 0xFCEFA3F8);</div><div class='del'>-	P(C, D, A, B,  7, 14, 0x676F02D9);</div><div class='del'>-	P(B, C, D, A, 12, 20, 0x8D2A4C8A);</div><div class='del'>-</div><div class='del'>-#undef F</div><div class='del'>-#define F(x,y,z) (x ^ y ^ z)</div><div class='del'>-</div><div class='del'>-	P(A, B, C, D,  5,  4, 0xFFFA3942);</div><div class='del'>-	P(D, A, B, C,  8, 11, 0x8771F681);</div><div class='del'>-	P(C, D, A, B, 11, 16, 0x6D9D6122);</div><div class='del'>-	P(B, C, D, A, 14, 23, 0xFDE5380C);</div><div class='del'>-	P(A, B, C, D,  1,  4, 0xA4BEEA44);</div><div class='del'>-	P(D, A, B, C,  4, 11, 0x4BDECFA9);</div><div class='del'>-	P(C, D, A, B,  7, 16, 0xF6BB4B60);</div><div class='del'>-	P(B, C, D, A, 10, 23, 0xBEBFBC70);</div><div class='del'>-	P(A, B, C, D, 13,  4, 0x289B7EC6);</div><div class='del'>-	P(D, A, B, C,  0, 11, 0xEAA127FA);</div><div class='del'>-	P(C, D, A, B,  3, 16, 0xD4EF3085);</div><div class='del'>-	P(B, C, D, A,  6, 23, 0x04881D05);</div><div class='del'>-	P(A, B, C, D,  9,  4, 0xD9D4D039);</div><div class='del'>-	P(D, A, B, C, 12, 11, 0xE6DB99E5);</div><div class='del'>-	P(C, D, A, B, 15, 16, 0x1FA27CF8);</div><div class='del'>-	P(B, C, D, A,  2, 23, 0xC4AC5665);</div><div class='del'>-</div><div class='del'>-#undef F</div><div class='del'>-#define F(x,y,z) (y ^ (x | ~z))</div><div class='del'>-</div><div class='del'>-	P(A, B, C, D,  0,  6, 0xF4292244);</div><div class='del'>-	P(D, A, B, C,  7, 10, 0x432AFF97);</div><div class='del'>-	P(C, D, A, B, 14, 15, 0xAB9423A7);</div><div class='del'>-	P(B, C, D, A,  5, 21, 0xFC93A039);</div><div class='del'>-	P(A, B, C, D, 12,  6, 0x655B59C3);</div><div class='del'>-	P(D, A, B, C,  3, 10, 0x8F0CCC92);</div><div class='del'>-	P(C, D, A, B, 10, 15, 0xFFEFF47D);</div><div class='del'>-	P(B, C, D, A,  1, 21, 0x85845DD1);</div><div class='del'>-	P(A, B, C, D,  8,  6, 0x6FA87E4F);</div><div class='del'>-	P(D, A, B, C, 15, 10, 0xFE2CE6E0);</div><div class='del'>-	P(C, D, A, B,  6, 15, 0xA3014314);</div><div class='del'>-	P(B, C, D, A, 13, 21, 0x4E0811A1);</div><div class='del'>-	P(A, B, C, D,  4,  6, 0xF7537E82);</div><div class='del'>-	P(D, A, B, C, 11, 10, 0xBD3AF235);</div><div class='del'>-	P(C, D, A, B,  2, 15, 0x2AD7D2BB);</div><div class='del'>-	P(B, C, D, A,  9, 21, 0xEB86D391);</div><div class='del'>-</div><div class='del'>-#undef F</div><div class='del'>-</div><div class='del'>-	ctx-&gt;A += A;</div><div class='del'>-	ctx-&gt;B += B;</div><div class='del'>-	ctx-&gt;C += C;</div><div class='del'>-	ctx-&gt;D += D;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-void md5_update(md_context *ctx, const uint8_t *input, uint32_t length)</div><div class='del'>-{</div><div class='del'>-	uint32_t left, fill;</div><div class='del'>-</div><div class='del'>-	if (!length)</div><div class='del'>-		return;</div><div class='del'>-</div><div class='del'>-	left = ctx-&gt;totalN &amp; 0x3F;</div><div class='del'>-	fill = CSUM_CHUNK - left;</div><div class='del'>-</div><div class='del'>-	ctx-&gt;totalN += length;</div><div class='del'>-	ctx-&gt;totalN &amp;= 0xFFFFFFFF;</div><div class='del'>-</div><div class='del'>-	if (ctx-&gt;totalN &lt; length)</div><div class='del'>-		ctx-&gt;totalN2++;</div><div class='del'>-</div><div class='del'>-	if (left &amp;&amp; length &gt;= fill) {</div><div class='del'>-		memcpy(ctx-&gt;buffer + left, input, fill);</div><div class='del'>-		md5_process(ctx, ctx-&gt;buffer);</div><div class='del'>-		length -= fill;</div><div class='del'>-		input  += fill;</div><div class='del'>-		left = 0;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	while (length &gt;= CSUM_CHUNK) {</div><div class='del'>-		md5_process(ctx, input);</div><div class='del'>-		length -= CSUM_CHUNK;</div><div class='del'>-		input  += CSUM_CHUNK;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	if (length)</div><div class='del'>-		memcpy(ctx-&gt;buffer + left, input, length);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-static uint8_t md5_padding[CSUM_CHUNK] = { 0x80 };</div><div class='del'>-</div><div class='del'>-void md5_result(md_context *ctx, uint8_t digest[MD5_DIGEST_LEN])</div><div class='del'>-{</div><div class='del'>-	uint32_t last, padn;</div><div class='del'>-	uint32_t high, low;</div><div class='del'>-	uint8_t msglen[8];</div><div class='del'>-</div><div class='del'>-	high = (ctx-&gt;totalN &gt;&gt; 29)</div><div class='del'>-	     | (ctx-&gt;totalN2 &lt;&lt;  3);</div><div class='del'>-	low  = (ctx-&gt;totalN &lt;&lt;  3);</div><div class='del'>-</div><div class='del'>-	SIVAL(msglen, 0, low);</div><div class='del'>-	SIVAL(msglen, 4, high);</div><div class='del'>-</div><div class='del'>-	last = ctx-&gt;totalN &amp; 0x3F;</div><div class='del'>-	padn = last &lt; 56 ? 56 - last : 120 - last;</div><div class='del'>-</div><div class='del'>-	md5_update(ctx, md5_padding, padn);</div><div class='del'>-	md5_update(ctx, msglen, 8);</div><div class='del'>-</div><div class='del'>-	SIVAL(digest, 0, ctx-&gt;A);</div><div class='del'>-	SIVAL(digest, 4, ctx-&gt;B);</div><div class='del'>-	SIVAL(digest, 8, ctx-&gt;C);</div><div class='del'>-	SIVAL(digest, 12, ctx-&gt;D);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-void get_md5(uint8_t *out, const uint8_t *input, int n)</div><div class='del'>-{</div><div class='del'>-	md_context ctx;</div><div class='del'>-	md5_begin(&amp;ctx);</div><div class='del'>-	md5_update(&amp;ctx, input, n);</div><div class='del'>-	md5_result(&amp;ctx, out);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-#ifdef TEST_MD5</div><div class='del'>-</div><div class='del'>-#include &lt;stdlib.h&gt;</div><div class='del'>-#include &lt;stdio.h&gt;</div><div class='del'>-</div><div class='del'>-/*</div><div class='del'>- * those are the standard RFC 1321 test vectors</div><div class='del'>- */</div><div class='del'>-</div><div class='del'>-static struct {</div><div class='del'>-    char *str, *md5;</div><div class='del'>-} tests[] = {</div><div class='del'>- { "",</div><div class='del'>-   "d41d8cd98f00b204e9800998ecf8427e" },</div><div class='del'>- { "a",</div><div class='del'>-   "0cc175b9c0f1b6a831c399e269772661" },</div><div class='del'>- { "abc",</div><div class='del'>-   "900150983cd24fb0d6963f7d28e17f72" },</div><div class='del'>- { "message digest",</div><div class='del'>-   "f96b697d7cb7938d525a2f31aaf161d0" },</div><div class='del'>- { "abcdefghijklmnopqrstuvwxyz",</div><div class='del'>-   "c3fcd3d76192e4007dfb496cca67e13b" },</div><div class='del'>- { "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789",</div><div class='del'>-   "d174ab98d277d9f5a5611c2c9f419d9f" },</div><div class='del'>- { "12345678901234567890123456789012345678901234567890123456789012345678901234567890",</div><div class='del'>-   "57edf4a22be3c955ac49da2e2107b67a" },</div><div class='del'>- { NULL, NULL }</div><div class='del'>-};</div><div class='del'>-</div><div class='del'>-int main(int argc, char *argv[])</div><div class='del'>-{</div><div class='del'>-	FILE *f;</div><div class='del'>-	int i, j;</div><div class='del'>-	char output[33];</div><div class='del'>-	md_context ctx;</div><div class='del'>-	uint8_t buf[1000];</div><div class='del'>-	uint8_t md5sum[MD5_DIGEST_LEN];</div><div class='del'>-</div><div class='del'>-	if (argc &lt; 2) {</div><div class='del'>-		printf("\nMD5 Validation Tests:\n\n");</div><div class='del'>-</div><div class='del'>-		for (i = 0; tests[i].str; i++) {</div><div class='del'>-			char *str = tests[i].str;</div><div class='del'>-			char *chk = tests[i].md5;</div><div class='del'>-</div><div class='del'>-			printf("  Test %d ", i + 1);</div><div class='del'>-</div><div class='del'>-			get_md5(md5sum, str, strlen(str));</div><div class='del'>-</div><div class='del'>-			for (j = 0; j &lt; MD5_DIGEST_LEN; j++)</div><div class='del'>-				sprintf(output + j * 2, "%02x", md5sum[j]);</div><div class='del'>-</div><div class='del'>-			if (memcmp(output, chk, 32)) {</div><div class='del'>-				printf("failed!\n");</div><div class='del'>-				return 1;</div><div class='del'>-			}</div><div class='del'>-</div><div class='del'>-			printf("passed.\n");</div><div class='del'>-		}</div><div class='del'>-</div><div class='del'>-		printf("\n");</div><div class='del'>-		return 0;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	while (--argc) {</div><div class='del'>-		if (!(f = fopen(*++argv, "rb"))) {</div><div class='del'>-			perror("fopen");</div><div class='del'>-			return 1;</div><div class='del'>-		}</div><div class='del'>-</div><div class='del'>-		md5_begin(&amp;ctx);</div><div class='del'>-</div><div class='del'>-		while ((i = fread(buf, 1, sizeof buf, f)) &gt; 0)</div><div class='del'>-			md5_update(&amp;ctx, buf, i);</div><div class='del'>-</div><div class='del'>-		fclose(f);</div><div class='del'>-</div><div class='del'>-		md5_result(&amp;ctx, md5sum);</div><div class='del'>-</div><div class='del'>-		for (j = 0; j &lt; MD5_DIGEST_LEN; j++)</div><div class='del'>-			printf("%02x", md5sum[j]);</div><div class='del'>-</div><div class='del'>-		printf("  %s\n", *argv);</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-#endif</div><div class='head'>diff --git a/contrib/md5/md5.h b/contrib/md5/md5.h<br/>deleted file mode 100644<br/>index ba8f08dbcfa..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/contrib/md5/md5.h?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>contrib/md5/md5.h</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,78 +0,0 @@</div><div class='del'>-/* rsync-3.0.6/byteorder.h */</div><div class='del'>-</div><div class='del'>-/*</div><div class='del'>- * Simple byteorder handling.</div><div class='del'>- *</div><div class='del'>- * Copyright (C) 1992-1995 Andrew Tridgell</div><div class='del'>- * Copyright (C) 2007-2008 Wayne Davison</div><div class='del'>- *</div><div class='del'>- * This program is free software; you can redistribute it and/or modify</div><div class='del'>- * it under the terms of the GNU General Public License as published by</div><div class='del'>- * the Free Software Foundation; either version 3 of the License, or</div><div class='del'>- * (at your option) any later version.</div><div class='del'>- *</div><div class='del'>- * This program is distributed in the hope that it will be useful,</div><div class='del'>- * but WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the</div><div class='del'>- * GNU General Public License for more details.</div><div class='del'>- *</div><div class='del'>- * You should have received a copy of the GNU General Public License along</div><div class='del'>- * with this program; if not, visit the http://fsf.org website.</div><div class='del'>- */</div><div class='del'>-</div><div class='del'>-#undef CAREFUL_ALIGNMENT</div><div class='del'>-</div><div class='del'>-/* We know that the x86 can handle misalignment and has the same</div><div class='del'>- * byte order (LSB-first) as the 32-bit numbers we transmit. */</div><div class='del'>-</div><div class='del'>-#ifdef __i386__</div><div class='del'>-#define CAREFUL_ALIGNMENT 0</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-#ifndef CAREFUL_ALIGNMENT</div><div class='del'>-#define CAREFUL_ALIGNMENT 1</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-#define CVAL(buf,pos) (((unsigned char *)(buf))[pos])</div><div class='del'>-#define UVAL(buf,pos) ((uint32_t)CVAL(buf,pos))</div><div class='del'>-#define SCVAL(buf,pos,val) (CVAL(buf,pos) = (val))</div><div class='del'>-</div><div class='del'>-#if CAREFUL_ALIGNMENT</div><div class='del'>-#define PVAL(buf,pos) (UVAL(buf,pos)|UVAL(buf,(pos)+1)&lt;&lt;8)</div><div class='del'>-#define IVAL(buf,pos) (PVAL(buf,pos)|PVAL(buf,(pos)+2)&lt;&lt;16)</div><div class='del'>-#define SSVALX(buf,pos,val) (CVAL(buf,pos)=(val)&amp;0xFF,CVAL(buf,pos+1)=(val)&gt;&gt;8)</div><div class='del'>-#define SIVALX(buf,pos,val) (SSVALX(buf,pos,val&amp;0xFFFF),SSVALX(buf,pos+2,val&gt;&gt;16))</div><div class='del'>-#define SIVAL(buf,pos,val) SIVALX((buf),(pos),((uint32_t)(val)))</div><div class='del'>-#else</div><div class='del'>-</div><div class='del'>-/* this handles things for architectures like the 386 that can handle</div><div class='del'>-   alignment errors */</div><div class='del'>-</div><div class='del'>-/*</div><div class='del'>-   WARNING: This section is dependent on the length of int32</div><div class='del'>-   being correct. set CAREFUL_ALIGNMENT if it is not.</div><div class='del'>-*/</div><div class='del'>-</div><div class='del'>-#define IVAL(buf,pos) (*(uint32_t *)((char *)(buf) + (pos)))</div><div class='del'>-#define SIVAL(buf,pos,val) IVAL(buf,pos)=((uint32_t)(val))</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-/* The include file for both the MD4 and MD5 routines. */</div><div class='del'>-</div><div class='del'>-#define MD5_DIGEST_LEN 16</div><div class='del'>-#define MAX_DIGEST_LEN MD5_DIGEST_LEN</div><div class='del'>-</div><div class='del'>-#define CSUM_CHUNK 64</div><div class='del'>-</div><div class='del'>-typedef struct {</div><div class='del'>-	uint32_t A, B, C, D;</div><div class='del'>-	uint32_t totalN;          /* bit count, lower 32 bits */</div><div class='del'>-	uint32_t totalN2;         /* bit count, upper 32 bits */</div><div class='del'>-	uint8_t buffer[CSUM_CHUNK];</div><div class='del'>-} md_context;</div><div class='del'>-</div><div class='del'>-void md5_begin(md_context *ctx);</div><div class='del'>-void md5_update(md_context *ctx, const uint8_t *input, uint32_t length);</div><div class='del'>-void md5_result(md_context *ctx, uint8_t digest[MD5_DIGEST_LEN]);</div><div class='del'>-</div><div class='del'>-void get_md5(uint8_t digest[MD5_DIGEST_LEN], const uint8_t *input, int n);</div><div class='head'>diff --git a/contrib/mount/mntent.c b/contrib/mount/mntent.c<br/>new file mode 100644<br/>index 00000000000..9a7e5f39bdb<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/contrib/mount/mntent.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>contrib/mount/mntent.c</a></div><div class='hunk'>@@ -0,0 +1,260 @@</div><div class='add'>+/*</div><div class='add'>+ * Copyright (c) 1980, 1989, 1993, 1994</div><div class='add'>+ *      The Regents of the University of California.  All rights reserved.</div><div class='add'>+ * Copyright (c) 2001</div><div class='add'>+ *      David Rufino &lt;daverufino@btinternet.com&gt;</div><div class='add'>+ * Copyright (c) 2014</div><div class='add'>+ *      Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+ *</div><div class='add'>+ * Redistribution and use in source and binary forms, with or without</div><div class='add'>+ * modification, are permitted provided that the following conditions</div><div class='add'>+ * are met:</div><div class='add'>+ * 1. Redistributions of source code must retain the above copyright</div><div class='add'>+ *    notice, this list of conditions and the following disclaimer.</div><div class='add'>+ * 2. Redistributions in binary form must reproduce the above copyright</div><div class='add'>+ *    notice, this list of conditions and the following disclaimer in the</div><div class='add'>+ *    documentation and/or other materials provided with the distribution.</div><div class='add'>+ * 3. All advertising materials mentioning features or use of this software</div><div class='add'>+ *    must display the following acknowledgement:</div><div class='add'>+ *      This product includes software developed by the University of</div><div class='add'>+ *      California, Berkeley and its contributors.</div><div class='add'>+ * 4. Neither the name of the University nor the names of its contributors</div><div class='add'>+ *    may be used to endorse or promote products derived from this software</div><div class='add'>+ *    without specific prior written permission.</div><div class='add'>+ *</div><div class='add'>+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND</div><div class='add'>+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE</div><div class='add'>+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE</div><div class='add'>+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE</div><div class='add'>+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL</div><div class='add'>+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS</div><div class='add'>+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)</div><div class='add'>+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT</div><div class='add'>+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY</div><div class='add'>+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF</div><div class='add'>+ * SUCH DAMAGE.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+#if !defined(GF_LINUX_HOST_OS)</div><div class='add'>+</div><div class='add'>+#include &lt;stdlib.h&gt;</div><div class='add'>+#include &lt;string.h&gt;</div><div class='add'>+#include &lt;sys/param.h&gt;</div><div class='add'>+#include &lt;sys/ucred.h&gt;</div><div class='add'>+#include &lt;sys/mount.h&gt;</div><div class='add'>+#include "mntent_compat.h"</div><div class='add'>+</div><div class='add'>+#ifdef __NetBSD__</div><div class='add'>+typedef struct statvfs gf_statfs_t;</div><div class='add'>+#else</div><div class='add'>+typedef struct statfs gf_statfs_t;</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+typedef struct _mntent_state {</div><div class='add'>+        struct mntent  mntent;</div><div class='add'>+        gf_statfs_t   *statfs;</div><div class='add'>+        int            count;</div><div class='add'>+        int            pos;</div><div class='add'>+        /* A buffer big enough to store all defined flags as a string.</div><div class='add'>+         * Increase it if necessary when more flags are defined. */</div><div class='add'>+        char           buf[256];</div><div class='add'>+} mntent_state_t;</div><div class='add'>+</div><div class='add'>+typedef struct _mntflag {</div><div class='add'>+        unsigned long  value;</div><div class='add'>+        const char    *on;</div><div class='add'>+        const char    *off;</div><div class='add'>+} mntflag_t;</div><div class='add'>+</div><div class='add'>+static mntflag_t mntflags[] = {</div><div class='add'>+        { MNT_RDONLY,      "ro",          "rw" },</div><div class='add'>+        { MNT_SYNCHRONOUS, "sync",        NULL },</div><div class='add'>+        { MNT_NOEXEC,      "noexec",      NULL },</div><div class='add'>+        { MNT_NOSUID,      "nosuid",      NULL },</div><div class='add'>+#if !defined(__FreeBSD__)</div><div class='add'>+        { MNT_NODEV,       "nodev",       NULL },</div><div class='add'>+#endif /* __FreeBSD__ */</div><div class='add'>+        { MNT_UNION,       "union",       NULL },</div><div class='add'>+        { MNT_ASYNC,       "async",       NULL },</div><div class='add'>+#if !defined(GF_DARWIN_HOST_OS)</div><div class='add'>+        { MNT_NOATIME,     "noatime",     NULL },</div><div class='add'>+#if !defined(__NetBSD__)</div><div class='add'>+        { MNT_NOCLUSTERR,  "noclusterr",  NULL },</div><div class='add'>+        { MNT_NOCLUSTERW,  "noclusterw",  NULL },</div><div class='add'>+        { MNT_NOSYMFOLLOW, "nosymfollow", NULL },</div><div class='add'>+        { MNT_SUIDDIR,     "suiddir",     NULL },</div><div class='add'>+#endif /* !__NetBSD__ */</div><div class='add'>+#endif /* !GF_DARWIN_HOST_OS */</div><div class='add'>+        { 0,               NULL,          NULL }</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+char *</div><div class='add'>+hasmntopt (const struct mntent *mnt, const char *option)</div><div class='add'>+{</div><div class='add'>+        char *opt, *optbuf;</div><div class='add'>+        int len;</div><div class='add'>+</div><div class='add'>+        optbuf = strdup(mnt-&gt;mnt_opts);</div><div class='add'>+        if (optbuf == NULL) {</div><div class='add'>+                return NULL;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        opt = optbuf;</div><div class='add'>+        len = 0;</div><div class='add'>+        while (*opt) {</div><div class='add'>+                while (opt[len] != 0) {</div><div class='add'>+                        if (opt[len] == ' ') {</div><div class='add'>+                                opt[len++] = 0;</div><div class='add'>+                                break;</div><div class='add'>+                        }</div><div class='add'>+                        len++;</div><div class='add'>+                }</div><div class='add'>+                if ((*opt != 0) &amp;&amp; (strcasecmp(opt, option) == 0)) {</div><div class='add'>+                        break;</div><div class='add'>+                }</div><div class='add'>+                opt += len;</div><div class='add'>+                len = 0;</div><div class='add'>+        }</div><div class='add'>+        free(optbuf);</div><div class='add'>+        if (len == 0) {</div><div class='add'>+                return NULL;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        return opt - optbuf + mnt-&gt;mnt_opts;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+writeopt(const char *text, char *buf, int buflen, int pos)</div><div class='add'>+{</div><div class='add'>+        int len;</div><div class='add'>+</div><div class='add'>+        /* buflen must be &gt; 0 */</div><div class='add'>+</div><div class='add'>+        if (text == NULL) {</div><div class='add'>+                return pos;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        buf += pos;</div><div class='add'>+        if (pos &gt; 0) {</div><div class='add'>+                /* We are sure we have at least one byte to store the space.</div><div class='add'>+                 * We don't need to check buflen here. */</div><div class='add'>+                *buf++ = ' ';</div><div class='add'>+                pos++;</div><div class='add'>+        }</div><div class='add'>+        len = strlen(text) + 1;</div><div class='add'>+        pos += len;</div><div class='add'>+        if (pos &gt;= buflen) {</div><div class='add'>+                /* There won't be enough space for the text and the</div><div class='add'>+                 * terminating null character. We copy as much as we can</div><div class='add'>+                 * of the text and mark the end of the string with '...' */</div><div class='add'>+                memcpy(buf, text, buflen - pos + len);</div><div class='add'>+                if (buflen &gt; 3) {</div><div class='add'>+                        strcpy(buf + buflen - 4, "...");</div><div class='add'>+                } else {</div><div class='add'>+                        strncpy(buf, "...", buflen - 1);</div><div class='add'>+                        buf[buflen - 1] = 0;</div><div class='add'>+                }</div><div class='add'>+                pos = buflen;</div><div class='add'>+        } else {</div><div class='add'>+                memcpy(buf, text, len);</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        return pos;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static char *</div><div class='add'>+flags2opts (int flags, char *buf, int buflen)</div><div class='add'>+{</div><div class='add'>+        char other[16];</div><div class='add'>+        mntflag_t *flg;</div><div class='add'>+        int pos;</div><div class='add'>+</div><div class='add'>+        if (buflen == 0) {</div><div class='add'>+                return NULL;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        pos = 0;</div><div class='add'>+        for (flg = mntflags; flg-&gt;value != 0; flg++) {</div><div class='add'>+                pos = writeopt((flags &amp; flg-&gt;value) == 0 ? flg-&gt;off : flg-&gt;on,</div><div class='add'>+                               buf, buflen, pos);</div><div class='add'>+                flags &amp;= ~flg-&gt;value;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        if (flags != 0) {</div><div class='add'>+                sprintf(other, "[0x%x]", flags);</div><div class='add'>+                writeopt(other, buf, buflen, pos);</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        return buf;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+statfs_to_mntent (struct mntent *mntent, gf_statfs_t *mntbuf, char *buf,</div><div class='add'>+                  int buflen)</div><div class='add'>+{</div><div class='add'>+        int f_flags;</div><div class='add'>+</div><div class='add'>+        mntent-&gt;mnt_fsname = mntbuf-&gt;f_mntfromname;</div><div class='add'>+        mntent-&gt;mnt_dir = mntbuf-&gt;f_mntonname;</div><div class='add'>+        mntent-&gt;mnt_type = mntbuf-&gt;f_fstypename;</div><div class='add'>+</div><div class='add'>+#ifdef __NetBSD__</div><div class='add'>+        f_flags = mntbuf-&gt;f_flag;</div><div class='add'>+#else</div><div class='add'>+        f_flags = mntbuf-&gt;f_flags;</div><div class='add'>+#endif</div><div class='add'>+        mntent-&gt;mnt_opts = flags2opts (f_flags, buf, buflen);</div><div class='add'>+</div><div class='add'>+        mntent-&gt;mnt_freq = mntent-&gt;mnt_passno = 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+struct mntent *</div><div class='add'>+getmntent_r (FILE *fp, struct mntent *mntent, char *buf, int buflen)</div><div class='add'>+{</div><div class='add'>+        mntent_state_t *state = (mntent_state_t *)fp;</div><div class='add'>+</div><div class='add'>+        if (state-&gt;pos &gt;= state-&gt;count) {</div><div class='add'>+                return NULL;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        statfs_to_mntent(mntent, &amp;state-&gt;statfs[state-&gt;pos++], buf, buflen);</div><div class='add'>+</div><div class='add'>+        return mntent;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+struct mntent *</div><div class='add'>+getmntent (FILE *fp)</div><div class='add'>+{</div><div class='add'>+        mntent_state_t *state = (mntent_state_t *)fp;</div><div class='add'>+</div><div class='add'>+        return getmntent_r(fp, &amp;state-&gt;mntent, state-&gt;buf,</div><div class='add'>+                           sizeof(state-&gt;buf));</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+FILE *</div><div class='add'>+setmntent (const char *filename, const char *type)</div><div class='add'>+{</div><div class='add'>+        mntent_state_t *state;</div><div class='add'>+</div><div class='add'>+        /* We don't really need to access any file so we'll use the FILE* as</div><div class='add'>+         * a fake file to store state information.</div><div class='add'>+         */</div><div class='add'>+</div><div class='add'>+        state = malloc(sizeof(mntent_state_t));</div><div class='add'>+        if (state != NULL) {</div><div class='add'>+                state-&gt;pos = 0;</div><div class='add'>+                state-&gt;count = getmntinfo(&amp;state-&gt;statfs, MNT_NOWAIT);</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        return (FILE *)state;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+endmntent (FILE *fp)</div><div class='add'>+{</div><div class='add'>+        free(fp);</div><div class='add'>+</div><div class='add'>+        return 1; /* endmntent() always returns 1 */</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#endif /* !GF_LINUX_HOST_OS */</div><div class='head'>diff --git a/contrib/mount/mntent_compat.h b/contrib/mount/mntent_compat.h<br/>new file mode 100644<br/>index 00000000000..ca82e9aa60f<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/contrib/mount/mntent_compat.h?id=d1d7a6f35c816822fab51c820e25023863c239c1'>contrib/mount/mntent_compat.h</a></div><div class='hunk'>@@ -0,0 +1,37 @@</div><div class='add'>+/*</div><div class='add'>+  Copyright (c) 2014 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#ifndef _MNTENT_H</div><div class='add'>+#define _MNTENT_H</div><div class='add'>+</div><div class='add'>+#if !defined(GF_LINUX_HOST_OS)</div><div class='add'>+#include &lt;stdio.h&gt;</div><div class='add'>+</div><div class='add'>+struct mntent {</div><div class='add'>+        char *mnt_fsname;</div><div class='add'>+        char *mnt_dir;</div><div class='add'>+        char *mnt_type;</div><div class='add'>+        char *mnt_opts;</div><div class='add'>+        int mnt_freq;</div><div class='add'>+        int mnt_passno;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct mntent *getmntent (FILE *fp);</div><div class='add'>+struct mntent *getmntent_r (FILE *fp, struct mntent *result,</div><div class='add'>+                            char *buffer, int bufsize);</div><div class='add'>+FILE *setmntent (const char *filename, const char *type);</div><div class='add'>+int endmntent(FILE *fp);</div><div class='add'>+char * hasmntopt (const struct mntent *mnt, const char *option);</div><div class='add'>+</div><div class='add'>+/* Dummy - /etc/mtab has no meaning on OSX platform */</div><div class='add'>+#define _PATH_MOUNTED "/etc/mtab"</div><div class='add'>+</div><div class='add'>+#endif /* GF_DARWIN_HOST_OS || __NetBSD__ */</div><div class='add'>+#endif /* _MNTENT_H */</div><div class='head'>diff --git a/contrib/rbtree/rb.c b/contrib/rbtree/rb.c<br/>index d1339b97d0a..6184c507e72 100644<br/>--- a/<a href='/cgit/glusterfs.git/tree/contrib/rbtree/rb.c?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>contrib/rbtree/rb.c</a><br/>+++ b/<a href='/cgit/glusterfs.git/tree/contrib/rbtree/rb.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>contrib/rbtree/rb.c</a></div><div class='hunk'>@@ -1,26 +1,30 @@</div><div class='ctx'> /* Produced by texiweb from libavl.w. */</div><div class='ctx'> </div><div class='ctx'> /* libavl - library for manipulation of binary trees.</div><div class='del'>-   Copyright (C) 1998-2002, 2004 Free Software Foundation, Inc.</div><div class='add'>+   Copyright (C) 1998, 1999, 2000, 2001, 2002, 2004 Free Software</div><div class='add'>+   Foundation, Inc.</div><div class='add'>+</div><div class='add'>+   This library is free software; you can redistribute it and/or</div><div class='add'>+   modify it under the terms of the GNU Lesser General Public</div><div class='add'>+   License as published by the Free Software Foundation; either</div><div class='add'>+   version 3 of the License, or (at your option) any later version.</div><div class='add'>+</div><div class='add'>+   This library is distributed in the hope that it will be useful,</div><div class='add'>+   but WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='add'>+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='add'>+   Lesser General Public License for more details.</div><div class='add'>+</div><div class='add'>+   You should have received a copy of the GNU Lesser General Public</div><div class='add'>+   License along with this library; if not, write to the Free Software</div><div class='add'>+   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA</div><div class='add'>+   02110-1301 USA.</div><div class='add'>+</div><div class='add'>+   This code is also covered by the following earlier license notice:</div><div class='ctx'> </div><div class='ctx'>    This program is free software; you can redistribute it and/or</div><div class='ctx'>    modify it under the terms of the GNU General Public License as</div><div class='ctx'>    published by the Free Software Foundation; either version 2 of the</div><div class='ctx'>    License, or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-   This program is distributed in the hope that it will be useful, but</div><div class='del'>-   WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.</div><div class='del'>-   See the GNU General Public License for more details.</div><div class='del'>-</div><div class='del'>-   You should have received a copy of the GNU General Public License</div><div class='del'>-   along with this program; if not, write to the Free Software</div><div class='del'>-   Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA</div><div class='del'>-   02111-1307, USA.</div><div class='del'>-</div><div class='del'>-   The author may be contacted at &lt;blp@gnu.org&gt; on the Internet, or</div><div class='del'>-   write to Ben Pfaff, Stanford University, Computer Science Dept., 353</div><div class='del'>-   Serra Mall, Stanford CA 94305, USA.</div><div class='ctx'> */</div><div class='ctx'> </div><div class='ctx'> #include &lt;assert.h&gt;</div><div class='head'>diff --git a/contrib/rbtree/rb.h b/contrib/rbtree/rb.h<br/>index c8858b55682..97b44cfd412 100644<br/>--- a/<a href='/cgit/glusterfs.git/tree/contrib/rbtree/rb.h?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>contrib/rbtree/rb.h</a><br/>+++ b/<a href='/cgit/glusterfs.git/tree/contrib/rbtree/rb.h?id=d1d7a6f35c816822fab51c820e25023863c239c1'>contrib/rbtree/rb.h</a></div><div class='hunk'>@@ -1,26 +1,30 @@</div><div class='ctx'> /* Produced by texiweb from libavl.w. */</div><div class='ctx'> </div><div class='ctx'> /* libavl - library for manipulation of binary trees.</div><div class='del'>-   Copyright (C) 1998-2002, 2004 Free Software Foundation, Inc.</div><div class='add'>+   Copyright (C) 1998, 1999, 2000, 2001, 2002, 2004 Free Software</div><div class='add'>+   Foundation, Inc.</div><div class='add'>+</div><div class='add'>+   This library is free software; you can redistribute it and/or</div><div class='add'>+   modify it under the terms of the GNU Lesser General Public</div><div class='add'>+   License as published by the Free Software Foundation; either</div><div class='add'>+   version 3 of the License, or (at your option) any later version.</div><div class='add'>+</div><div class='add'>+   This library is distributed in the hope that it will be useful,</div><div class='add'>+   but WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='add'>+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='add'>+   Lesser General Public License for more details.</div><div class='add'>+</div><div class='add'>+   You should have received a copy of the GNU Lesser General Public</div><div class='add'>+   License along with this library; if not, write to the Free Software</div><div class='add'>+   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA</div><div class='add'>+   02110-1301 USA.</div><div class='add'>+</div><div class='add'>+   This code is also covered by the following earlier license notice:</div><div class='ctx'> </div><div class='ctx'>    This program is free software; you can redistribute it and/or</div><div class='ctx'>    modify it under the terms of the GNU General Public License as</div><div class='ctx'>    published by the Free Software Foundation; either version 2 of the</div><div class='ctx'>    License, or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-   This program is distributed in the hope that it will be useful, but</div><div class='del'>-   WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.</div><div class='del'>-   See the GNU General Public License for more details.</div><div class='del'>-</div><div class='del'>-   You should have received a copy of the GNU General Public License</div><div class='del'>-   along with this program; if not, write to the Free Software</div><div class='del'>-   Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA</div><div class='del'>-   02111-1307, USA.</div><div class='del'>-</div><div class='del'>-   The author may be contacted at &lt;blp@gnu.org&gt; on the Internet, or</div><div class='del'>-   write to Ben Pfaff, Stanford University, Computer Science Dept., 353</div><div class='del'>-   Serra Mall, Stanford CA 94305, USA.</div><div class='ctx'> */</div><div class='ctx'> </div><div class='ctx'> #ifndef RB_H</div><div class='hunk'>@@ -51,7 +55,7 @@ void rb_free (struct libavl_allocator *, void *);</div><div class='ctx'> </div><div class='ctx'> /* Maximum RB height. */</div><div class='ctx'> #ifndef RB_MAX_HEIGHT</div><div class='del'>-#define RB_MAX_HEIGHT 48</div><div class='add'>+#define RB_MAX_HEIGHT 128</div><div class='ctx'> #endif</div><div class='ctx'> </div><div class='ctx'> /* Tree data structure. */</div><div class='head'>diff --git a/contrib/timer-wheel/find_last_bit.c b/contrib/timer-wheel/find_last_bit.c<br/>new file mode 100644<br/>index 00000000000..192fee802a8<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/contrib/timer-wheel/find_last_bit.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>contrib/timer-wheel/find_last_bit.c</a></div><div class='hunk'>@@ -0,0 +1,61 @@</div><div class='add'>+/* bit search implementation</div><div class='add'>+ *</div><div class='add'>+ * Copyright (C) 2004 Red Hat, Inc. All Rights Reserved.</div><div class='add'>+ * Written by David Howells (dhowells@redhat.com)</div><div class='add'>+ *</div><div class='add'>+ * Copyright (C) 2008 IBM Corporation</div><div class='add'>+ * 'find_last_bit' is written by Rusty Russell &lt;rusty@rustcorp.com.au&gt;</div><div class='add'>+ * (Inspired by David Howell's find_next_bit implementation)</div><div class='add'>+ *</div><div class='add'>+ * Rewritten by Yury Norov &lt;yury.norov@gmail.com&gt; to decrease</div><div class='add'>+ * size and improve performance, 2015.</div><div class='add'>+ *</div><div class='add'>+ * This program is free software; you can redistribute it and/or</div><div class='add'>+ * modify it under the terms of the GNU General Public License</div><div class='add'>+ * as published by the Free Software Foundation; either version</div><div class='add'>+ * 2 of the License, or (at your option) any later version.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+/**</div><div class='add'>+ * @find_last_bit</div><div class='add'>+ * optimized implementation of find last bit in</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+#ifndef BITS_PER_LONG</div><div class='add'>+#ifdef __LP64__</div><div class='add'>+#define BITS_PER_LONG 64</div><div class='add'>+#else</div><div class='add'>+#define BITS_PER_LONG 32</div><div class='add'>+#endif</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+unsigned long gw_tw_fls (unsigned long word)</div><div class='add'>+{</div><div class='add'>+        int num = BITS_PER_LONG;</div><div class='add'>+</div><div class='add'>+#if BITS_PER_LONG == 64</div><div class='add'>+        if (!(word &amp; (~0ul &lt;&lt; 32))) {</div><div class='add'>+                num -= 32;</div><div class='add'>+                word &lt;&lt;= 32;</div><div class='add'>+        }</div><div class='add'>+#endif</div><div class='add'>+        if (!(word &amp; (~0ul &lt;&lt; (BITS_PER_LONG-16)))) {</div><div class='add'>+                num -= 16;</div><div class='add'>+                word &lt;&lt;= 16;</div><div class='add'>+        }</div><div class='add'>+        if (!(word &amp; (~0ul &lt;&lt; (BITS_PER_LONG-8)))) {</div><div class='add'>+                num -= 8;</div><div class='add'>+                word &lt;&lt;= 8;</div><div class='add'>+        }</div><div class='add'>+        if (!(word &amp; (~0ul &lt;&lt; (BITS_PER_LONG-4)))) {</div><div class='add'>+                num -= 4;</div><div class='add'>+                word &lt;&lt;= 4;</div><div class='add'>+        }</div><div class='add'>+        if (!(word &amp; (~0ul &lt;&lt; (BITS_PER_LONG-2)))) {</div><div class='add'>+                num -= 2;</div><div class='add'>+                word &lt;&lt;= 2;</div><div class='add'>+        }</div><div class='add'>+        if (!(word &amp; (~0ul &lt;&lt; (BITS_PER_LONG-1))))</div><div class='add'>+                num -= 1;</div><div class='add'>+        return num;</div><div class='add'>+}</div><div class='head'>diff --git a/contrib/timer-wheel/timer-wheel.c b/contrib/timer-wheel/timer-wheel.c<br/>new file mode 100644<br/>index 00000000000..58e0607bf0c<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/contrib/timer-wheel/timer-wheel.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>contrib/timer-wheel/timer-wheel.c</a></div><div class='hunk'>@@ -0,0 +1,374 @@</div><div class='add'>+/*</div><div class='add'>+ *  linux/kernel/timer.c</div><div class='add'>+ *</div><div class='add'>+ *  Kernel internal timers</div><div class='add'>+ *</div><div class='add'>+ *  Copyright (C) 1991, 1992  Linus Torvalds</div><div class='add'>+ *</div><div class='add'>+ */</div><div class='add'>+/*</div><div class='add'>+  This program is free software; you can redistribute it and/or modify</div><div class='add'>+  it under the terms of the GNU General Public License as published by</div><div class='add'>+  the Free Software Foundation; either version 2 of the License, or</div><div class='add'>+  (at your option) any later version.</div><div class='add'>+</div><div class='add'>+  This program is distributed in the hope that it will be useful,</div><div class='add'>+  but WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='add'>+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the</div><div class='add'>+  GNU General Public License for more details.</div><div class='add'>+</div><div class='add'>+  You should have received a copy of the GNU General Public License along</div><div class='add'>+  with this program; if not, write to the Free Software Foundation, Inc.,</div><div class='add'>+  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#include &lt;stdio.h&gt;</div><div class='add'>+#include &lt;stdlib.h&gt;</div><div class='add'>+#include &lt;sys/time.h&gt;</div><div class='add'>+#include &lt;sys/types.h&gt;</div><div class='add'>+#include &lt;unistd.h&gt;</div><div class='add'>+#include &lt;sys/select.h&gt;</div><div class='add'>+</div><div class='add'>+#include "timer-wheel.h"</div><div class='add'>+</div><div class='add'>+static inline void</div><div class='add'>+__gf_tw_add_timer (struct tvec_base *base, struct gf_tw_timer_list *timer)</div><div class='add'>+{</div><div class='add'>+        int i;</div><div class='add'>+        unsigned long idx;</div><div class='add'>+        unsigned long expires;</div><div class='add'>+        struct list_head *vec;</div><div class='add'>+</div><div class='add'>+        expires = timer-&gt;expires;</div><div class='add'>+</div><div class='add'>+        idx = expires - base-&gt;timer_sec;</div><div class='add'>+</div><div class='add'>+        if (idx &lt; TVR_SIZE) {</div><div class='add'>+                i = expires &amp; TVR_MASK;</div><div class='add'>+                vec = base-&gt;tv1.vec + i;</div><div class='add'>+        } else if (idx &lt; 1 &lt;&lt; (TVR_BITS + TVN_BITS)) {</div><div class='add'>+                i = (expires &gt;&gt; TVR_BITS) &amp; TVN_MASK;</div><div class='add'>+                vec = base-&gt;tv2.vec + i;</div><div class='add'>+        } else if (idx &lt; 1 &lt;&lt; (TVR_BITS + 2*TVN_BITS)) {</div><div class='add'>+                i = (expires &gt;&gt; (TVR_BITS + TVN_BITS)) &amp; TVN_MASK;</div><div class='add'>+                vec = base-&gt;tv3.vec + i;</div><div class='add'>+        } else if (idx &lt; 1 &lt;&lt; (TVR_BITS + 3*TVN_BITS)) {</div><div class='add'>+                i = (expires &gt;&gt; (TVR_BITS + 2*TVN_BITS)) &amp; TVN_MASK;</div><div class='add'>+                vec = base-&gt;tv4.vec + i;</div><div class='add'>+        } else if (idx &lt; 0) {</div><div class='add'>+                vec = base-&gt;tv1.vec + (base-&gt;timer_sec &amp; TVR_MASK);</div><div class='add'>+        } else {</div><div class='add'>+                i = (expires &gt;&gt; (TVR_BITS + 3*TVN_BITS)) &amp; TVN_MASK;</div><div class='add'>+                vec = base-&gt;tv5.vec + i;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        list_add_tail (&amp;timer-&gt;entry, vec);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+unsigned long gf_tw_find_last_bit(const unsigned long *, unsigned long);</div><div class='add'>+</div><div class='add'>+#if defined(__GNUC__) || defined(__clang__)</div><div class='add'>+static inline unsigned long gf_tw_fls (unsigned long word)</div><div class='add'>+{</div><div class='add'>+        return BITS_PER_LONG - __builtin_clzl(word);</div><div class='add'>+}</div><div class='add'>+#else</div><div class='add'>+extern unsigned long gf_tw_fls (unsigned long);</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+static inline unsigned long</div><div class='add'>+apply_slack(struct tvec_base *base, struct gf_tw_timer_list *timer)</div><div class='add'>+{</div><div class='add'>+        long delta;</div><div class='add'>+        unsigned long mask, expires, expires_limit;</div><div class='add'>+</div><div class='add'>+        expires = timer-&gt;expires;</div><div class='add'>+</div><div class='add'>+        delta = expires - base-&gt;timer_sec;</div><div class='add'>+        if (delta &lt; 256)</div><div class='add'>+                return expires;</div><div class='add'>+</div><div class='add'>+        expires_limit = expires + delta / 256;</div><div class='add'>+        mask = expires ^ expires_limit;</div><div class='add'>+        if (mask == 0)</div><div class='add'>+                return expires;</div><div class='add'>+</div><div class='add'>+        int bit = gf_tw_fls (mask);</div><div class='add'>+        mask = (1UL &lt;&lt; bit) - 1;</div><div class='add'>+</div><div class='add'>+        expires_limit = expires_limit &amp; ~(mask);</div><div class='add'>+        return expires_limit;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static inline void</div><div class='add'>+__gf_tw_detach_timer (struct gf_tw_timer_list *timer)</div><div class='add'>+{</div><div class='add'>+        struct list_head *entry = &amp;timer-&gt;entry;</div><div class='add'>+</div><div class='add'>+        list_del (entry);</div><div class='add'>+        entry-&gt;next = NULL;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static inline int</div><div class='add'>+cascade (struct tvec_base *base, struct tvec *tv, int index)</div><div class='add'>+{</div><div class='add'>+        struct gf_tw_timer_list *timer, *tmp;</div><div class='add'>+        struct list_head tv_list;</div><div class='add'>+</div><div class='add'>+        list_replace_init (tv-&gt;vec + index, &amp;tv_list);</div><div class='add'>+</div><div class='add'>+        list_for_each_entry_safe (timer, tmp, &amp;tv_list, entry) {</div><div class='add'>+                __gf_tw_add_timer (base, timer);</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        return index;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#define INDEX(N)  ((base-&gt;timer_sec &gt;&gt; (TVR_BITS + N * TVN_BITS)) &amp; TVN_MASK)</div><div class='add'>+</div><div class='add'>+/**</div><div class='add'>+ * run expired timers</div><div class='add'>+ */</div><div class='add'>+static inline void</div><div class='add'>+run_timers (struct tvec_base *base)</div><div class='add'>+{</div><div class='add'>+        unsigned long index, call_time;</div><div class='add'>+        struct gf_tw_timer_list *timer;</div><div class='add'>+</div><div class='add'>+        struct list_head work_list;</div><div class='add'>+        struct list_head *head = &amp;work_list;</div><div class='add'>+</div><div class='add'>+        pthread_spin_lock (&amp;base-&gt;lock);</div><div class='add'>+        {</div><div class='add'>+                index  = base-&gt;timer_sec &amp; TVR_MASK;</div><div class='add'>+</div><div class='add'>+                if (!index &amp;&amp;</div><div class='add'>+                    (!cascade (base, &amp;base-&gt;tv2, INDEX(0))) &amp;&amp;</div><div class='add'>+                    (!cascade (base, &amp;base-&gt;tv3, INDEX(1))) &amp;&amp;</div><div class='add'>+                    (!cascade (base, &amp;base-&gt;tv4, INDEX(2))))</div><div class='add'>+                        cascade (base, &amp;base-&gt;tv5, INDEX(3));</div><div class='add'>+</div><div class='add'>+                call_time = base-&gt;timer_sec++;</div><div class='add'>+                list_replace_init (base-&gt;tv1.vec + index, head);</div><div class='add'>+                while (!list_empty(head)) {</div><div class='add'>+                        void (*fn)(struct gf_tw_timer_list *, void *, unsigned long);</div><div class='add'>+                        void *data;</div><div class='add'>+</div><div class='add'>+                        timer = list_first_entry (head, struct gf_tw_timer_list, entry);</div><div class='add'>+                        fn = timer-&gt;function;</div><div class='add'>+                        data = timer-&gt;data;</div><div class='add'>+</div><div class='add'>+                        __gf_tw_detach_timer (timer);</div><div class='add'>+                        pthread_spin_unlock(&amp;base-&gt;lock);</div><div class='add'>+                        {</div><div class='add'>+                            /* It is required to run the actual function outside</div><div class='add'>+                               of the locked zone, so we don't bother about</div><div class='add'>+                               locked operations inside that function */</div><div class='add'>+                            fn(timer, data, call_time);</div><div class='add'>+                        }</div><div class='add'>+                        pthread_spin_lock(&amp;base-&gt;lock);</div><div class='add'>+                }</div><div class='add'>+        }</div><div class='add'>+        pthread_spin_unlock (&amp;base-&gt;lock);</div><div class='add'>+</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void *runner (void *arg)</div><div class='add'>+{</div><div class='add'>+        struct timeval tv = {0,};</div><div class='add'>+        struct tvec_base *base = arg;</div><div class='add'>+</div><div class='add'>+        while (1) {</div><div class='add'>+                run_timers (base);</div><div class='add'>+</div><div class='add'>+                tv.tv_sec  = 1;</div><div class='add'>+                tv.tv_usec = 0;</div><div class='add'>+                (void) select (0, NULL, NULL, NULL, &amp;tv);</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        return NULL;</div><div class='add'>+</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static inline int timer_pending (struct gf_tw_timer_list *timer)</div><div class='add'>+{</div><div class='add'>+        struct list_head *entry = &amp;timer-&gt;entry;</div><div class='add'>+</div><div class='add'>+        return (entry-&gt;next != NULL);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static inline int __detach_if_pending (struct gf_tw_timer_list *timer)</div><div class='add'>+{</div><div class='add'>+        if (!timer_pending (timer))</div><div class='add'>+                return 0;</div><div class='add'>+</div><div class='add'>+        __gf_tw_detach_timer (timer);</div><div class='add'>+        return 1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static inline int __mod_timer (struct tvec_base *base,</div><div class='add'>+                               struct gf_tw_timer_list *timer, int pending_only)</div><div class='add'>+{</div><div class='add'>+        int ret = 0;</div><div class='add'>+</div><div class='add'>+        ret = __detach_if_pending (timer);</div><div class='add'>+        if (!ret &amp;&amp; pending_only)</div><div class='add'>+                goto done;</div><div class='add'>+</div><div class='add'>+        ret = 1;</div><div class='add'>+        __gf_tw_add_timer (base, timer);</div><div class='add'>+</div><div class='add'>+ done:</div><div class='add'>+        return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* interface */</div><div class='add'>+</div><div class='add'>+/**</div><div class='add'>+ * Add a timer in the timer wheel</div><div class='add'>+ */</div><div class='add'>+void gf_tw_add_timer (struct tvec_base *base, struct gf_tw_timer_list *timer)</div><div class='add'>+{</div><div class='add'>+        pthread_spin_lock (&amp;base-&gt;lock);</div><div class='add'>+        {</div><div class='add'>+                timer-&gt;expires += base-&gt;timer_sec;</div><div class='add'>+                timer-&gt;expires = apply_slack (base, timer);</div><div class='add'>+                __gf_tw_add_timer (base, timer);</div><div class='add'>+        }</div><div class='add'>+        pthread_spin_unlock (&amp;base-&gt;lock);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/**</div><div class='add'>+ * Remove a timer from the timer wheel</div><div class='add'>+ */</div><div class='add'>+int gf_tw_del_timer (struct tvec_base *base, struct gf_tw_timer_list *timer)</div><div class='add'>+{</div><div class='add'>+        int ret = 0;</div><div class='add'>+</div><div class='add'>+        pthread_spin_lock (&amp;base-&gt;lock);</div><div class='add'>+        {</div><div class='add'>+                if (timer_pending (timer)) {</div><div class='add'>+                        ret = 1;</div><div class='add'>+                        __gf_tw_detach_timer (timer);</div><div class='add'>+                }</div><div class='add'>+        }</div><div class='add'>+        pthread_spin_unlock (&amp;base-&gt;lock);</div><div class='add'>+</div><div class='add'>+        return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int gf_tw_mod_timer_pending (struct tvec_base *base,</div><div class='add'>+                             struct gf_tw_timer_list *timer,</div><div class='add'>+                             unsigned long expires)</div><div class='add'>+{</div><div class='add'>+        int ret = 1;</div><div class='add'>+</div><div class='add'>+        pthread_spin_lock (&amp;base-&gt;lock);</div><div class='add'>+        {</div><div class='add'>+                timer-&gt;expires = expires + base-&gt;timer_sec;</div><div class='add'>+                timer-&gt;expires = apply_slack (base, timer);</div><div class='add'>+</div><div class='add'>+                ret = __mod_timer (base, timer, 1);</div><div class='add'>+        }</div><div class='add'>+        pthread_spin_unlock (&amp;base-&gt;lock);</div><div class='add'>+</div><div class='add'>+        return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int gf_tw_mod_timer (struct tvec_base *base,</div><div class='add'>+                     struct gf_tw_timer_list *timer, unsigned long expires)</div><div class='add'>+{</div><div class='add'>+        int ret = 1;</div><div class='add'>+</div><div class='add'>+        pthread_spin_lock (&amp;base-&gt;lock);</div><div class='add'>+        {</div><div class='add'>+                /* fast path optimization */</div><div class='add'>+                if (timer_pending (timer) &amp;&amp; timer-&gt;expires == expires)</div><div class='add'>+                        goto unblock;</div><div class='add'>+</div><div class='add'>+                timer-&gt;expires = expires + base-&gt;timer_sec;</div><div class='add'>+                timer-&gt;expires = apply_slack (base, timer);</div><div class='add'>+</div><div class='add'>+                ret = __mod_timer (base, timer, 0);</div><div class='add'>+        }</div><div class='add'>+ unblock:</div><div class='add'>+        pthread_spin_unlock (&amp;base-&gt;lock);</div><div class='add'>+</div><div class='add'>+        return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int gf_tw_cleanup_timers (struct tvec_base *base)</div><div class='add'>+{</div><div class='add'>+        int ret = 0;</div><div class='add'>+        void *res = NULL;</div><div class='add'>+</div><div class='add'>+        /* terminate runner */</div><div class='add'>+        ret = pthread_cancel (base-&gt;runner);</div><div class='add'>+        if (ret != 0)</div><div class='add'>+                goto error_return;</div><div class='add'>+        ret = pthread_join (base-&gt;runner, &amp;res);</div><div class='add'>+        if (ret != 0)</div><div class='add'>+                goto error_return;</div><div class='add'>+        if (res != PTHREAD_CANCELED)</div><div class='add'>+                goto error_return;</div><div class='add'>+</div><div class='add'>+        /* destroy lock */</div><div class='add'>+        ret = pthread_spin_destroy (&amp;base-&gt;lock);</div><div class='add'>+        if (ret != 0)</div><div class='add'>+                goto error_return;</div><div class='add'>+</div><div class='add'>+        /* deallocated timer base */</div><div class='add'>+        free (base);</div><div class='add'>+        return 0;</div><div class='add'>+</div><div class='add'>+ error_return:</div><div class='add'>+        return -1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/**</div><div class='add'>+ * Initialize various timer wheel lists and spawn a thread that</div><div class='add'>+ * invokes run_timers()</div><div class='add'>+ */</div><div class='add'>+struct tvec_base *gf_tw_init_timers ()</div><div class='add'>+{</div><div class='add'>+        int               j    = 0;</div><div class='add'>+        int               ret  = 0;</div><div class='add'>+        struct timeval    tv   = {0,};</div><div class='add'>+        struct tvec_base *base = NULL;</div><div class='add'>+</div><div class='add'>+        base = malloc (sizeof (*base));</div><div class='add'>+        if (!base)</div><div class='add'>+                goto error_return;</div><div class='add'>+</div><div class='add'>+        ret = pthread_spin_init (&amp;base-&gt;lock, 0);</div><div class='add'>+        if (ret != 0)</div><div class='add'>+                goto error_dealloc;</div><div class='add'>+</div><div class='add'>+        for (j = 0; j &lt; TVN_SIZE; j++) {</div><div class='add'>+                INIT_LIST_HEAD (base-&gt;tv5.vec + j);</div><div class='add'>+                INIT_LIST_HEAD (base-&gt;tv4.vec + j);</div><div class='add'>+                INIT_LIST_HEAD (base-&gt;tv3.vec + j);</div><div class='add'>+                INIT_LIST_HEAD (base-&gt;tv2.vec + j);</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        for (j = 0; j &lt; TVR_SIZE; j++) {</div><div class='add'>+                INIT_LIST_HEAD (base-&gt;tv1.vec + j);</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        ret = gettimeofday (&amp;tv, 0);</div><div class='add'>+        if (ret &lt; 0)</div><div class='add'>+                goto destroy_lock;</div><div class='add'>+        base-&gt;timer_sec = tv.tv_sec;</div><div class='add'>+</div><div class='add'>+        ret = pthread_create (&amp;base-&gt;runner, NULL, runner, base);</div><div class='add'>+        if (ret != 0)</div><div class='add'>+                goto destroy_lock;</div><div class='add'>+        return base;</div><div class='add'>+</div><div class='add'>+ destroy_lock:</div><div class='add'>+        (void) pthread_spin_destroy (&amp;base-&gt;lock);</div><div class='add'>+ error_dealloc:</div><div class='add'>+        free (base);</div><div class='add'>+ error_return:</div><div class='add'>+        return NULL;</div><div class='add'>+}</div><div class='head'>diff --git a/contrib/timer-wheel/timer-wheel.h b/contrib/timer-wheel/timer-wheel.h<br/>new file mode 100644<br/>index 00000000000..5637735ec22<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/contrib/timer-wheel/timer-wheel.h?id=d1d7a6f35c816822fab51c820e25023863c239c1'>contrib/timer-wheel/timer-wheel.h</a></div><div class='hunk'>@@ -0,0 +1,77 @@</div><div class='add'>+/*</div><div class='add'>+  This program is free software; you can redistribute it and/or modify</div><div class='add'>+  it under the terms of the GNU General Public License as published by</div><div class='add'>+  the Free Software Foundation; either version 2 of the License, or</div><div class='add'>+  (at your option) any later version.</div><div class='add'>+</div><div class='add'>+  This program is distributed in the hope that it will be useful,</div><div class='add'>+  but WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='add'>+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the</div><div class='add'>+  GNU General Public License for more details.</div><div class='add'>+</div><div class='add'>+  You should have received a copy of the GNU General Public License along</div><div class='add'>+  with this program; if not, write to the Free Software Foundation, Inc.,</div><div class='add'>+  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#ifndef __TIMER_WHEEL_H</div><div class='add'>+#define __TIMER_WHEEL_H</div><div class='add'>+</div><div class='add'>+#include "glusterfs/locking.h"</div><div class='add'>+</div><div class='add'>+#include "glusterfs/list.h"</div><div class='add'>+</div><div class='add'>+#define TVR_BITS  8</div><div class='add'>+#define TVN_BITS  6</div><div class='add'>+#define TVR_SIZE  (1 &lt;&lt; TVR_BITS)</div><div class='add'>+#define TVN_SIZE  (1 &lt;&lt; TVN_BITS)</div><div class='add'>+#define TVR_MASK  (TVR_SIZE - 1)</div><div class='add'>+#define TVN_MASK  (TVN_SIZE - 1)</div><div class='add'>+</div><div class='add'>+#define BITS_PER_LONG  64</div><div class='add'>+</div><div class='add'>+struct tvec {</div><div class='add'>+        struct list_head vec[TVN_SIZE];</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct tvec_root {</div><div class='add'>+        struct list_head vec[TVR_SIZE];</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct tvec_base {</div><div class='add'>+        pthread_spinlock_t lock;      /* base lock */</div><div class='add'>+</div><div class='add'>+        pthread_t runner;             /* run_timer() */</div><div class='add'>+</div><div class='add'>+        unsigned long timer_sec;      /* time counter */</div><div class='add'>+</div><div class='add'>+        struct tvec_root tv1;</div><div class='add'>+        struct tvec tv2;</div><div class='add'>+        struct tvec tv3;</div><div class='add'>+        struct tvec tv4;</div><div class='add'>+        struct tvec tv5;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct gf_tw_timer_list {</div><div class='add'>+        void *data;</div><div class='add'>+        unsigned long expires;</div><div class='add'>+</div><div class='add'>+        /** callback routine */</div><div class='add'>+        void (*function)(struct gf_tw_timer_list *, void *, unsigned long);</div><div class='add'>+</div><div class='add'>+        struct list_head entry;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+/** The API! */</div><div class='add'>+struct tvec_base *gf_tw_init_timers ();</div><div class='add'>+int gf_tw_cleanup_timers (struct tvec_base *);</div><div class='add'>+void gf_tw_add_timer (struct tvec_base *, struct gf_tw_timer_list *);</div><div class='add'>+int gf_tw_del_timer (struct tvec_base *, struct gf_tw_timer_list *);</div><div class='add'>+</div><div class='add'>+int gf_tw_mod_timer_pending (struct tvec_base *,</div><div class='add'>+                             struct gf_tw_timer_list *, unsigned long);</div><div class='add'>+</div><div class='add'>+int gf_tw_mod_timer (struct tvec_base *,</div><div class='add'>+                     struct gf_tw_timer_list *, unsigned long);</div><div class='add'>+</div><div class='add'>+#endif</div><div class='head'>diff --git a/contrib/umountd/Makefile.am b/contrib/umountd/Makefile.am<br/>new file mode 100644<br/>index 00000000000..b39e000f5aa<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/contrib/umountd/Makefile.am?id=d1d7a6f35c816822fab51c820e25023863c239c1'>contrib/umountd/Makefile.am</a></div><div class='hunk'>@@ -0,0 +1,11 @@</div><div class='add'>+sbin_PROGRAMS = umountd</div><div class='add'>+umountd_SOURCES = umountd.c</div><div class='add'>+umountd_CFLAGS = $(GF_CFLAGS) -DDATADIR=\"$(localstatedir)\"</div><div class='add'>+umountd_LDADD = $(top_builddir)/libglusterfs/src/libglusterfs.la ${GF_LDADD}</div><div class='add'>+umountd_LDFLAGS = $(GF_LDFLAGS)</div><div class='add'>+</div><div class='add'>+AM_CPPFLAGS = $(GF_CPPFLAGS) -I$(top_srcdir)/libglusterfs/src \</div><div class='add'>+	-I$(top_srcdir)/rpc/xdr/src -I$(top_builddir)/rpc/xdr/src</div><div class='add'>+AM_CFLAGS = -Wall $(GF_CFLAGS)</div><div class='add'>+</div><div class='add'>+CLEANFILES =</div><div class='head'>diff --git a/contrib/umountd/umountd.c b/contrib/umountd/umountd.c<br/>new file mode 100644<br/>index 00000000000..3f933ecb554<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/contrib/umountd/umountd.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>contrib/umountd/umountd.c</a></div><div class='hunk'>@@ -0,0 +1,255 @@</div><div class='add'>+/*</div><div class='add'>+  Copyright (c) 2008-2012 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#ifndef _CONFIG_H</div><div class='add'>+#define _CONFIG_H</div><div class='add'>+#include "config.h"</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#include &lt;stdlib.h&gt;</div><div class='add'>+#include &lt;stdio.h&gt;</div><div class='add'>+#include &lt;unistd.h&gt;</div><div class='add'>+#include &lt;errno.h&gt;</div><div class='add'>+#include &lt;dirent.h&gt;</div><div class='add'>+#include &lt;limits.h&gt;</div><div class='add'>+#include &lt;sys/types.h&gt;</div><div class='add'>+#include &lt;sys/stat.h&gt;</div><div class='add'>+#include &lt;sys/mount.h&gt;</div><div class='add'>+</div><div class='add'>+#include "glusterfs/glusterfs.h"</div><div class='add'>+#include "glusterfs/globals.h"</div><div class='add'>+#include "glusterfs/logging.h"</div><div class='add'>+#include "glusterfs/syscall.h"</div><div class='add'>+#include "glusterfs/mem-types.h"</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+usage (void)</div><div class='add'>+{</div><div class='add'>+        fprintf (stderr, "Usage: umountd [-d dev] [-t timeout] [-r] path\n");</div><div class='add'>+        exit (EXIT_FAILURE);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+sanity_check (char *path, dev_t *devp)</div><div class='add'>+{</div><div class='add'>+        struct stat st;</div><div class='add'>+        struct stat parent_st;</div><div class='add'>+        int ret;</div><div class='add'>+        char pathtmp[PATH_MAX];</div><div class='add'>+        char *parent;</div><div class='add'>+</div><div class='add'>+        if (path == NULL)</div><div class='add'>+                usage ();</div><div class='add'>+</div><div class='add'>+        if ((ret = stat (path, &amp;st)) != 0) {</div><div class='add'>+                switch (errno) {</div><div class='add'>+                case ENOTCONN:</div><div class='add'>+                        /* volume is stopped */</div><div class='add'>+                        break;</div><div class='add'>+                default:</div><div class='add'>+                        gf_log ("umountd", GF_LOG_ERROR,</div><div class='add'>+                                "Cannot access %s: %s\n",</div><div class='add'>+                                path, strerror (errno));</div><div class='add'>+                        goto out;</div><div class='add'>+                }</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        /* If dev was not specified, get it from path */</div><div class='add'>+        if (*devp == -1 &amp;&amp; ret == 0)</div><div class='add'>+                *devp = st.st_dev;</div><div class='add'>+</div><div class='add'>+        snprintf (pathtmp, PATH_MAX, "%s", path);</div><div class='add'>+        parent = dirname (pathtmp);</div><div class='add'>+</div><div class='add'>+        if (stat (parent, &amp;parent_st) != 0) {</div><div class='add'>+                gf_log ("umountd", GF_LOG_ERROR,</div><div class='add'>+                        "Cannot access %s: %s\n",</div><div class='add'>+                        parent, strerror (errno));</div><div class='add'>+                goto out;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        if (st.st_dev == parent_st.st_dev) {</div><div class='add'>+                gf_log ("umountd", GF_LOG_ERROR,</div><div class='add'>+                        "No filesystem mounted on %s\n", path);</div><div class='add'>+                goto out;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        ret = 0;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+        return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+log_rotate (int signum)</div><div class='add'>+{</div><div class='add'>+        gf_log_logrotate (1);</div><div class='add'>+</div><div class='add'>+        if (signal (SIGHUP, *log_rotate) == SIG_ERR) {</div><div class='add'>+                gf_log ("umountd", GF_LOG_ERROR, "signal () failed");</div><div class='add'>+                exit (EXIT_FAILURE);</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        return;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+logging_init (void)</div><div class='add'>+{</div><div class='add'>+        glusterfs_ctx_t *ctx;</div><div class='add'>+        char log_file[PATH_MAX];</div><div class='add'>+        int ret = -1;</div><div class='add'>+</div><div class='add'>+        ctx = glusterfs_ctx_new ();</div><div class='add'>+        if (!ctx) {</div><div class='add'>+                fprintf (stderr, "glusterfs_ctx_new failed\n");</div><div class='add'>+                goto out;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        ret = glusterfs_globals_init (ctx);</div><div class='add'>+        if (ret) {</div><div class='add'>+                fprintf (stderr, "glusterfs_globals_init failed\n");</div><div class='add'>+                goto out;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        THIS-&gt;ctx = ctx;</div><div class='add'>+        xlator_mem_acct_init (THIS, gf_common_mt_end);</div><div class='add'>+</div><div class='add'>+        snprintf (log_file, PATH_MAX,</div><div class='add'>+                  "%s/umountd.log", DEFAULT_LOG_FILE_DIRECTORY);</div><div class='add'>+</div><div class='add'>+        ret = gf_log_init (ctx, log_file, "umountd");</div><div class='add'>+        if (ret) {</div><div class='add'>+                fprintf (stderr, "gf_log_init failed\n");</div><div class='add'>+                goto out;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        if (signal (SIGHUP, *log_rotate) == SIG_ERR) {</div><div class='add'>+                gf_log ("umountd", GF_LOG_ERROR, "signal () failed");</div><div class='add'>+                goto out;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        ret = 0;</div><div class='add'>+out:</div><div class='add'>+        return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+umountd_async (char *path, dev_t dev, int frmdir, int timeout)</div><div class='add'>+{</div><div class='add'>+        int                   ret        = -1;</div><div class='add'>+        struct stat           stbuf      = {0, };</div><div class='add'>+        int                       unmount_ret = 0;</div><div class='add'>+</div><div class='add'>+        do {</div><div class='add'>+                unmount_ret = unmount (path, 0);</div><div class='add'>+                if (unmount_ret == 0)</div><div class='add'>+                        gf_log ("umountd", GF_LOG_INFO, "Unmounted %s", path);</div><div class='add'>+</div><div class='add'>+                if (unmount_ret != 0 &amp;&amp; errno != EBUSY) {</div><div class='add'>+                               gf_log ("umountd", GF_LOG_WARNING,</div><div class='add'>+                                      "umount %s failed: %s",</div><div class='add'>+                                path, strerror (errno));</div><div class='add'>+                }</div><div class='add'>+</div><div class='add'>+                ret = sys_lstat (path, &amp;stbuf);</div><div class='add'>+                if (ret != 0) {</div><div class='add'>+                        gf_log ("umountd", GF_LOG_WARNING,</div><div class='add'>+                                      "Cannot stat device from %s",</div><div class='add'>+                                path, strerror (errno));</div><div class='add'>+                        break;</div><div class='add'>+                }</div><div class='add'>+</div><div class='add'>+                if (stbuf.st_dev != dev) {</div><div class='add'>+                        if (unmount_ret != 0)</div><div class='add'>+                                gf_log ("umountd", GF_LOG_INFO,</div><div class='add'>+                                        "device mismatch "</div><div class='add'>+                                        "(expect %lld, found %lld), "</div><div class='add'>+                                        "someone else unmounted %s",</div><div class='add'>+                                        dev, stbuf.st_dev, path);</div><div class='add'>+                        ret = 0;</div><div class='add'>+                        break;</div><div class='add'>+                }</div><div class='add'>+</div><div class='add'>+                sleep (timeout);</div><div class='add'>+        } while (1/*CONSTCOND*/);</div><div class='add'>+</div><div class='add'>+        if (ret) {</div><div class='add'>+                gf_log ("umountd", GF_LOG_ERROR,</div><div class='add'>+                        "Asynchronous unmount of %s failed: %s",</div><div class='add'>+                        path, strerror (errno));</div><div class='add'>+        } else {</div><div class='add'>+                if (frmdir) {</div><div class='add'>+                        ret = rmdir (path);</div><div class='add'>+                        if (ret)</div><div class='add'>+                                gf_log ("umountd", GF_LOG_WARNING,</div><div class='add'>+                                         "rmdir %s failed: %s",</div><div class='add'>+                                         path, strerror (errno));</div><div class='add'>+                        else</div><div class='add'>+                                gf_log ("umountd", GF_LOG_INFO,</div><div class='add'>+                                         "Removed %s", path);</div><div class='add'>+                }</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+main (int argc, char **argv)</div><div class='add'>+{</div><div class='add'>+        char *path = NULL;</div><div class='add'>+        dev_t dev = -1;</div><div class='add'>+        int frmdir = 0;</div><div class='add'>+        int timeout = 30;</div><div class='add'>+        int f;</div><div class='add'>+</div><div class='add'>+        while ((f = getopt (argc, argv, "d:rt:")) != -1) {</div><div class='add'>+                switch (f) {</div><div class='add'>+                case 'p':</div><div class='add'>+                        path = optarg;</div><div class='add'>+                        break;</div><div class='add'>+                case 'd':</div><div class='add'>+                        dev = strtoll (optarg, NULL, 10);</div><div class='add'>+                        break;</div><div class='add'>+                case 't':</div><div class='add'>+                        timeout = atoi (optarg);</div><div class='add'>+                        break;</div><div class='add'>+                case 'r':</div><div class='add'>+                        frmdir = 1;</div><div class='add'>+                        break;</div><div class='add'>+                default:</div><div class='add'>+                        usage ();</div><div class='add'>+                        break;</div><div class='add'>+                }</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        argc -= optind;</div><div class='add'>+        argv += optind;</div><div class='add'>+</div><div class='add'>+        if (argc != 1)</div><div class='add'>+                usage ();</div><div class='add'>+</div><div class='add'>+        path = argv[0];</div><div class='add'>+</div><div class='add'>+        if (logging_init () != 0)</div><div class='add'>+                exit (EXIT_FAILURE);</div><div class='add'>+</div><div class='add'>+        if (sanity_check (path, &amp;dev) != 0)</div><div class='add'>+                exit (EXIT_FAILURE);</div><div class='add'>+</div><div class='add'>+        if (daemon (0, 0) != 0)</div><div class='add'>+                exit (EXIT_FAILURE);</div><div class='add'>+</div><div class='add'>+        if (umountd_async (path, dev, frmdir, timeout) != 0)</div><div class='add'>+                exit (EXIT_FAILURE);</div><div class='add'>+</div><div class='add'>+        return EXIT_SUCCESS;</div><div class='add'>+}</div><div class='head'>diff --git a/contrib/userspace-rcu/rculist-extra.h b/contrib/userspace-rcu/rculist-extra.h<br/>new file mode 100644<br/>index 00000000000..274cf9f9d7a<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/contrib/userspace-rcu/rculist-extra.h?id=d1d7a6f35c816822fab51c820e25023863c239c1'>contrib/userspace-rcu/rculist-extra.h</a></div><div class='hunk'>@@ -0,0 +1,42 @@</div><div class='add'>+/*</div><div class='add'>+ * Copyright (C) 2002 Free Software Foundation, Inc.</div><div class='add'>+ * (originally part of the GNU C Library)</div><div class='add'>+ * Contributed by Ulrich Drepper &lt;drepper@redhat.com&gt;, 2002.</div><div class='add'>+ *</div><div class='add'>+ * Copyright (C) 2009 Pierre-Marc Fournier</div><div class='add'>+ * Conversion to RCU list.</div><div class='add'>+ * Copyright (C) 2010 Mathieu Desnoyers &lt;mathieu.desnoyers@efficios.com&gt;</div><div class='add'>+ *</div><div class='add'>+ * This library is free software; you can redistribute it and/or</div><div class='add'>+ * modify it under the terms of the GNU Lesser General Public</div><div class='add'>+ * License as published by the Free Software Foundation; either</div><div class='add'>+ * version 2.1 of the License, or (at your option) any later version.</div><div class='add'>+ *</div><div class='add'>+ * This library is distributed in the hope that it will be useful,</div><div class='add'>+ * but WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='add'>+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='add'>+ * Lesser General Public License for more details.</div><div class='add'>+ *</div><div class='add'>+ * You should have received a copy of the GNU Lesser General Public</div><div class='add'>+ * License along with this library; if not, write to the Free Software</div><div class='add'>+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+#ifndef URCU_RCULIST_EXTRA_H</div><div class='add'>+#define URCU_RCULIST_EXTRA_H</div><div class='add'>+/* Copying this definition from liburcu-0.8 as liburcu-0.7 does not have this</div><div class='add'>+ * particular list api</div><div class='add'>+ */</div><div class='add'>+/* Add new element at the tail of the list. */</div><div class='add'>+</div><div class='add'>+static inline</div><div class='add'>+void cds_list_add_tail_rcu(struct cds_list_head *newp,</div><div class='add'>+                struct cds_list_head *head)</div><div class='add'>+{</div><div class='add'>+        newp-&gt;next = head;</div><div class='add'>+        newp-&gt;prev = head-&gt;prev;</div><div class='add'>+        rcu_assign_pointer(head-&gt;prev-&gt;next, newp);</div><div class='add'>+        head-&gt;prev = newp;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#endif</div><div class='head'>diff --git a/contrib/userspace-rcu/static-wfcqueue.h b/contrib/userspace-rcu/static-wfcqueue.h<br/>new file mode 100644<br/>index 00000000000..37d14ad674b<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/contrib/userspace-rcu/static-wfcqueue.h?id=d1d7a6f35c816822fab51c820e25023863c239c1'>contrib/userspace-rcu/static-wfcqueue.h</a></div><div class='hunk'>@@ -0,0 +1,685 @@</div><div class='add'>+#ifndef _URCU_WFCQUEUE_STATIC_H</div><div class='add'>+#define _URCU_WFCQUEUE_STATIC_H</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+ * urcu/static/wfcqueue.h</div><div class='add'>+ *</div><div class='add'>+ * Userspace RCU library - Concurrent Queue with Wait-Free Enqueue/Blocking Dequeue</div><div class='add'>+ *</div><div class='add'>+ * TO BE INCLUDED ONLY IN LGPL-COMPATIBLE CODE. See urcu/wfcqueue.h for</div><div class='add'>+ * linking dynamically with the userspace rcu library.</div><div class='add'>+ *</div><div class='add'>+ * Copyright 2010-2012 - Mathieu Desnoyers &lt;mathieu.desnoyers@efficios.com&gt;</div><div class='add'>+ * Copyright 2011-2012 - Lai Jiangshan &lt;laijs@cn.fujitsu.com&gt;</div><div class='add'>+ *</div><div class='add'>+ * This library is free software; you can redistribute it and/or</div><div class='add'>+ * modify it under the terms of the GNU Lesser General Public</div><div class='add'>+ * License as published by the Free Software Foundation; either</div><div class='add'>+ * version 2.1 of the License, or (at your option) any later version.</div><div class='add'>+ *</div><div class='add'>+ * This library is distributed in the hope that it will be useful,</div><div class='add'>+ * but WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='add'>+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='add'>+ * Lesser General Public License for more details.</div><div class='add'>+ *</div><div class='add'>+ * You should have received a copy of the GNU Lesser General Public</div><div class='add'>+ * License along with this library; if not, write to the Free Software</div><div class='add'>+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+/* Copied from userspace-rcu 0.10 because version 0.7 doesn't contain it. */</div><div class='add'>+</div><div class='add'>+#include &lt;pthread.h&gt;</div><div class='add'>+#include &lt;assert.h&gt;</div><div class='add'>+#include &lt;poll.h&gt;</div><div class='add'>+#include &lt;stdbool.h&gt;</div><div class='add'>+#include &lt;urcu/compiler.h&gt;</div><div class='add'>+#include &lt;urcu/uatomic.h&gt;</div><div class='add'>+</div><div class='add'>+#ifdef __cplusplus</div><div class='add'>+extern "C" {</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+ * Concurrent queue with wait-free enqueue/blocking dequeue.</div><div class='add'>+ *</div><div class='add'>+ * This queue has been designed and implemented collaboratively by</div><div class='add'>+ * Mathieu Desnoyers and Lai Jiangshan. Inspired from</div><div class='add'>+ * half-wait-free/half-blocking queue implementation done by Paul E.</div><div class='add'>+ * McKenney.</div><div class='add'>+ *</div><div class='add'>+ * Mutual exclusion of cds_wfcq_* / __cds_wfcq_* API</div><div class='add'>+ *</div><div class='add'>+ * Synchronization table:</div><div class='add'>+ *</div><div class='add'>+ * External synchronization techniques described in the API below is</div><div class='add'>+ * required between pairs marked with "X". No external synchronization</div><div class='add'>+ * required between pairs marked with "-".</div><div class='add'>+ *</div><div class='add'>+ * Legend:</div><div class='add'>+ * [1] cds_wfcq_enqueue</div><div class='add'>+ * [2] __cds_wfcq_splice (destination queue)</div><div class='add'>+ * [3] __cds_wfcq_dequeue</div><div class='add'>+ * [4] __cds_wfcq_splice (source queue)</div><div class='add'>+ * [5] __cds_wfcq_first</div><div class='add'>+ * [6] __cds_wfcq_next</div><div class='add'>+ *</div><div class='add'>+ *     [1] [2] [3] [4] [5] [6]</div><div class='add'>+ * [1]  -   -   -   -   -   -</div><div class='add'>+ * [2]  -   -   -   -   -   -</div><div class='add'>+ * [3]  -   -   X   X   X   X</div><div class='add'>+ * [4]  -   -   X   -   X   X</div><div class='add'>+ * [5]  -   -   X   X   -   -</div><div class='add'>+ * [6]  -   -   X   X   -   -</div><div class='add'>+ *</div><div class='add'>+ * Mutual exclusion can be ensured by holding cds_wfcq_dequeue_lock().</div><div class='add'>+ *</div><div class='add'>+ * For convenience, cds_wfcq_dequeue_blocking() and</div><div class='add'>+ * cds_wfcq_splice_blocking() hold the dequeue lock.</div><div class='add'>+ *</div><div class='add'>+ * Besides locking, mutual exclusion of dequeue, splice and iteration</div><div class='add'>+ * can be ensured by performing all of those operations from a single</div><div class='add'>+ * thread, without requiring any lock.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+#define WFCQ_ADAPT_ATTEMPTS		10	/* Retry if being set */</div><div class='add'>+#define WFCQ_WAIT			10	/* Wait 10 ms if being set */</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+ * cds_wfcq_node_init: initialize wait-free queue node.</div><div class='add'>+ */</div><div class='add'>+static inline void _cds_wfcq_node_init(struct cds_wfcq_node *node)</div><div class='add'>+{</div><div class='add'>+	node-&gt;next = NULL;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+ * cds_wfcq_init: initialize wait-free queue (with lock). Pair with</div><div class='add'>+ * cds_wfcq_destroy().</div><div class='add'>+ */</div><div class='add'>+static inline void _cds_wfcq_init(struct cds_wfcq_head *head,</div><div class='add'>+		struct cds_wfcq_tail *tail)</div><div class='add'>+{</div><div class='add'>+	int ret;</div><div class='add'>+</div><div class='add'>+	/* Set queue head and tail */</div><div class='add'>+	_cds_wfcq_node_init(&amp;head-&gt;node);</div><div class='add'>+	tail-&gt;p = &amp;head-&gt;node;</div><div class='add'>+	ret = pthread_mutex_init(&amp;head-&gt;lock, NULL);</div><div class='add'>+	assert(!ret);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+ * cds_wfcq_destroy: destroy wait-free queue (with lock). Pair with</div><div class='add'>+ * cds_wfcq_init().</div><div class='add'>+ */</div><div class='add'>+static inline void _cds_wfcq_destroy(struct cds_wfcq_head *head,</div><div class='add'>+		struct cds_wfcq_tail *tail)</div><div class='add'>+{</div><div class='add'>+	int ret = pthread_mutex_destroy(&amp;head-&gt;lock);</div><div class='add'>+	assert(!ret);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+ * __cds_wfcq_init: initialize wait-free queue (without lock). Don't</div><div class='add'>+ * pair with any destroy function.</div><div class='add'>+ */</div><div class='add'>+static inline void ___cds_wfcq_init(struct __cds_wfcq_head *head,</div><div class='add'>+		struct cds_wfcq_tail *tail)</div><div class='add'>+{</div><div class='add'>+	/* Set queue head and tail */</div><div class='add'>+	_cds_wfcq_node_init(&amp;head-&gt;node);</div><div class='add'>+	tail-&gt;p = &amp;head-&gt;node;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+ * cds_wfcq_empty: return whether wait-free queue is empty.</div><div class='add'>+ *</div><div class='add'>+ * No memory barrier is issued. No mutual exclusion is required.</div><div class='add'>+ *</div><div class='add'>+ * We perform the test on head-&gt;node.next to check if the queue is</div><div class='add'>+ * possibly empty, but we confirm this by checking if the tail pointer</div><div class='add'>+ * points to the head node because the tail pointer is the linearisation</div><div class='add'>+ * point of the enqueuers. Just checking the head next pointer could</div><div class='add'>+ * make a queue appear empty if an enqueuer is preempted for a long time</div><div class='add'>+ * between xchg() and setting the previous node's next pointer.</div><div class='add'>+ */</div><div class='add'>+static inline bool _cds_wfcq_empty(cds_wfcq_head_ptr_t u_head,</div><div class='add'>+		struct cds_wfcq_tail *tail)</div><div class='add'>+{</div><div class='add'>+	struct __cds_wfcq_head *head = u_head._h;</div><div class='add'>+	/*</div><div class='add'>+	 * Queue is empty if no node is pointed by head-&gt;node.next nor</div><div class='add'>+	 * tail-&gt;p. Even though the tail-&gt;p check is sufficient to find</div><div class='add'>+	 * out of the queue is empty, we first check head-&gt;node.next as a</div><div class='add'>+	 * common case to ensure that dequeuers do not frequently access</div><div class='add'>+	 * enqueuer's tail-&gt;p cache line.</div><div class='add'>+	 */</div><div class='add'>+	return CMM_LOAD_SHARED(head-&gt;node.next) == NULL</div><div class='add'>+		&amp;&amp; CMM_LOAD_SHARED(tail-&gt;p) == &amp;head-&gt;node;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static inline void _cds_wfcq_dequeue_lock(struct cds_wfcq_head *head,</div><div class='add'>+		struct cds_wfcq_tail *tail)</div><div class='add'>+{</div><div class='add'>+	int ret;</div><div class='add'>+</div><div class='add'>+	ret = pthread_mutex_lock(&amp;head-&gt;lock);</div><div class='add'>+	assert(!ret);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static inline void _cds_wfcq_dequeue_unlock(struct cds_wfcq_head *head,</div><div class='add'>+		struct cds_wfcq_tail *tail)</div><div class='add'>+{</div><div class='add'>+	int ret;</div><div class='add'>+</div><div class='add'>+	ret = pthread_mutex_unlock(&amp;head-&gt;lock);</div><div class='add'>+	assert(!ret);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static inline bool ___cds_wfcq_append(cds_wfcq_head_ptr_t u_head,</div><div class='add'>+		struct cds_wfcq_tail *tail,</div><div class='add'>+		struct cds_wfcq_node *new_head,</div><div class='add'>+		struct cds_wfcq_node *new_tail)</div><div class='add'>+{</div><div class='add'>+	struct __cds_wfcq_head *head = u_head._h;</div><div class='add'>+	struct cds_wfcq_node *old_tail;</div><div class='add'>+</div><div class='add'>+	/*</div><div class='add'>+	 * Implicit memory barrier before uatomic_xchg() orders earlier</div><div class='add'>+	 * stores to data structure containing node and setting</div><div class='add'>+	 * node-&gt;next to NULL before publication.</div><div class='add'>+	 */</div><div class='add'>+	old_tail = uatomic_xchg(&amp;tail-&gt;p, new_tail);</div><div class='add'>+</div><div class='add'>+	/*</div><div class='add'>+	 * Implicit memory barrier after uatomic_xchg() orders store to</div><div class='add'>+	 * q-&gt;tail before store to old_tail-&gt;next.</div><div class='add'>+	 *</div><div class='add'>+	 * At this point, dequeuers see a NULL tail-&gt;p-&gt;next, which</div><div class='add'>+	 * indicates that the queue is being appended to. The following</div><div class='add'>+	 * store will append "node" to the queue from a dequeuer</div><div class='add'>+	 * perspective.</div><div class='add'>+	 */</div><div class='add'>+	CMM_STORE_SHARED(old_tail-&gt;next, new_head);</div><div class='add'>+	/*</div><div class='add'>+	 * Return false if queue was empty prior to adding the node,</div><div class='add'>+	 * else return true.</div><div class='add'>+	 */</div><div class='add'>+	return old_tail != &amp;head-&gt;node;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+ * cds_wfcq_enqueue: enqueue a node into a wait-free queue.</div><div class='add'>+ *</div><div class='add'>+ * Issues a full memory barrier before enqueue. No mutual exclusion is</div><div class='add'>+ * required.</div><div class='add'>+ *</div><div class='add'>+ * Returns false if the queue was empty prior to adding the node.</div><div class='add'>+ * Returns true otherwise.</div><div class='add'>+ */</div><div class='add'>+static inline bool _cds_wfcq_enqueue(cds_wfcq_head_ptr_t head,</div><div class='add'>+		struct cds_wfcq_tail *tail,</div><div class='add'>+		struct cds_wfcq_node *new_tail)</div><div class='add'>+{</div><div class='add'>+	return ___cds_wfcq_append(head, tail, new_tail, new_tail);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+ * CDS_WFCQ_WAIT_SLEEP:</div><div class='add'>+ *</div><div class='add'>+ * By default, this sleeps for the given @msec milliseconds.</div><div class='add'>+ * This is a macro which LGPL users may #define themselves before</div><div class='add'>+ * including wfcqueue.h to override the default behavior (e.g.</div><div class='add'>+ * to log a warning or perform other background work).</div><div class='add'>+ */</div><div class='add'>+#ifndef CDS_WFCQ_WAIT_SLEEP</div><div class='add'>+#define CDS_WFCQ_WAIT_SLEEP(msec) ___cds_wfcq_wait_sleep(msec)</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+static inline void ___cds_wfcq_wait_sleep(int msec)</div><div class='add'>+{</div><div class='add'>+	(void) poll(NULL, 0, msec);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+ * ___cds_wfcq_busy_wait: adaptative busy-wait.</div><div class='add'>+ *</div><div class='add'>+ * Returns 1 if nonblocking and needs to block, 0 otherwise.</div><div class='add'>+ */</div><div class='add'>+static inline bool</div><div class='add'>+___cds_wfcq_busy_wait(int *attempt, int blocking)</div><div class='add'>+{</div><div class='add'>+	if (!blocking)</div><div class='add'>+		return 1;</div><div class='add'>+	if (++(*attempt) &gt;= WFCQ_ADAPT_ATTEMPTS) {</div><div class='add'>+		CDS_WFCQ_WAIT_SLEEP(WFCQ_WAIT);		/* Wait for 10ms */</div><div class='add'>+		*attempt = 0;</div><div class='add'>+	} else {</div><div class='add'>+		caa_cpu_relax();</div><div class='add'>+	}</div><div class='add'>+	return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+ * Waiting for enqueuer to complete enqueue and return the next node.</div><div class='add'>+ */</div><div class='add'>+static inline struct cds_wfcq_node *</div><div class='add'>+___cds_wfcq_node_sync_next(struct cds_wfcq_node *node, int blocking)</div><div class='add'>+{</div><div class='add'>+	struct cds_wfcq_node *next;</div><div class='add'>+	int attempt = 0;</div><div class='add'>+</div><div class='add'>+	/*</div><div class='add'>+	 * Adaptative busy-looping waiting for enqueuer to complete enqueue.</div><div class='add'>+	 */</div><div class='add'>+	while ((next = CMM_LOAD_SHARED(node-&gt;next)) == NULL) {</div><div class='add'>+		if (___cds_wfcq_busy_wait(&amp;attempt, blocking))</div><div class='add'>+			return CDS_WFCQ_WOULDBLOCK;</div><div class='add'>+	}</div><div class='add'>+</div><div class='add'>+	return next;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static inline struct cds_wfcq_node *</div><div class='add'>+___cds_wfcq_first(cds_wfcq_head_ptr_t u_head,</div><div class='add'>+		struct cds_wfcq_tail *tail,</div><div class='add'>+		int blocking)</div><div class='add'>+{</div><div class='add'>+	struct __cds_wfcq_head *head = u_head._h;</div><div class='add'>+	struct cds_wfcq_node *node;</div><div class='add'>+</div><div class='add'>+	if (_cds_wfcq_empty(__cds_wfcq_head_cast(head), tail))</div><div class='add'>+		return NULL;</div><div class='add'>+	node = ___cds_wfcq_node_sync_next(&amp;head-&gt;node, blocking);</div><div class='add'>+	/* Load head-&gt;node.next before loading node's content */</div><div class='add'>+	cmm_smp_read_barrier_depends();</div><div class='add'>+	return node;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+ * __cds_wfcq_first_blocking: get first node of a queue, without dequeuing.</div><div class='add'>+ *</div><div class='add'>+ * Content written into the node before enqueue is guaranteed to be</div><div class='add'>+ * consistent, but no other memory ordering is ensured.</div><div class='add'>+ * Dequeue/splice/iteration mutual exclusion should be ensured by the</div><div class='add'>+ * caller.</div><div class='add'>+ *</div><div class='add'>+ * Used by for-like iteration macros in urcu/wfqueue.h:</div><div class='add'>+ * __cds_wfcq_for_each_blocking()</div><div class='add'>+ * __cds_wfcq_for_each_blocking_safe()</div><div class='add'>+ *</div><div class='add'>+ * Returns NULL if queue is empty, first node otherwise.</div><div class='add'>+ */</div><div class='add'>+static inline struct cds_wfcq_node *</div><div class='add'>+___cds_wfcq_first_blocking(cds_wfcq_head_ptr_t head,</div><div class='add'>+		struct cds_wfcq_tail *tail)</div><div class='add'>+{</div><div class='add'>+	return ___cds_wfcq_first(head, tail, 1);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+ * __cds_wfcq_first_nonblocking: get first node of a queue, without dequeuing.</div><div class='add'>+ *</div><div class='add'>+ * Same as __cds_wfcq_first_blocking, but returns CDS_WFCQ_WOULDBLOCK if</div><div class='add'>+ * it needs to block.</div><div class='add'>+ */</div><div class='add'>+static inline struct cds_wfcq_node *</div><div class='add'>+___cds_wfcq_first_nonblocking(cds_wfcq_head_ptr_t head,</div><div class='add'>+		struct cds_wfcq_tail *tail)</div><div class='add'>+{</div><div class='add'>+	return ___cds_wfcq_first(head, tail, 0);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static inline struct cds_wfcq_node *</div><div class='add'>+___cds_wfcq_next(cds_wfcq_head_ptr_t head,</div><div class='add'>+		struct cds_wfcq_tail *tail,</div><div class='add'>+		struct cds_wfcq_node *node,</div><div class='add'>+		int blocking)</div><div class='add'>+{</div><div class='add'>+	struct cds_wfcq_node *next;</div><div class='add'>+</div><div class='add'>+	/*</div><div class='add'>+	 * Even though the following tail-&gt;p check is sufficient to find</div><div class='add'>+	 * out if we reached the end of the queue, we first check</div><div class='add'>+	 * node-&gt;next as a common case to ensure that iteration on nodes</div><div class='add'>+	 * do not frequently access enqueuer's tail-&gt;p cache line.</div><div class='add'>+	 */</div><div class='add'>+	if ((next = CMM_LOAD_SHARED(node-&gt;next)) == NULL) {</div><div class='add'>+		/* Load node-&gt;next before tail-&gt;p */</div><div class='add'>+		cmm_smp_rmb();</div><div class='add'>+		if (CMM_LOAD_SHARED(tail-&gt;p) == node)</div><div class='add'>+			return NULL;</div><div class='add'>+		next = ___cds_wfcq_node_sync_next(node, blocking);</div><div class='add'>+	}</div><div class='add'>+	/* Load node-&gt;next before loading next's content */</div><div class='add'>+	cmm_smp_read_barrier_depends();</div><div class='add'>+	return next;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+ * __cds_wfcq_next_blocking: get next node of a queue, without dequeuing.</div><div class='add'>+ *</div><div class='add'>+ * Content written into the node before enqueue is guaranteed to be</div><div class='add'>+ * consistent, but no other memory ordering is ensured.</div><div class='add'>+ * Dequeue/splice/iteration mutual exclusion should be ensured by the</div><div class='add'>+ * caller.</div><div class='add'>+ *</div><div class='add'>+ * Used by for-like iteration macros in urcu/wfqueue.h:</div><div class='add'>+ * __cds_wfcq_for_each_blocking()</div><div class='add'>+ * __cds_wfcq_for_each_blocking_safe()</div><div class='add'>+ *</div><div class='add'>+ * Returns NULL if reached end of queue, non-NULL next queue node</div><div class='add'>+ * otherwise.</div><div class='add'>+ */</div><div class='add'>+static inline struct cds_wfcq_node *</div><div class='add'>+___cds_wfcq_next_blocking(cds_wfcq_head_ptr_t head,</div><div class='add'>+		struct cds_wfcq_tail *tail,</div><div class='add'>+		struct cds_wfcq_node *node)</div><div class='add'>+{</div><div class='add'>+	return ___cds_wfcq_next(head, tail, node, 1);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+ * __cds_wfcq_next_blocking: get next node of a queue, without dequeuing.</div><div class='add'>+ *</div><div class='add'>+ * Same as __cds_wfcq_next_blocking, but returns CDS_WFCQ_WOULDBLOCK if</div><div class='add'>+ * it needs to block.</div><div class='add'>+ */</div><div class='add'>+static inline struct cds_wfcq_node *</div><div class='add'>+___cds_wfcq_next_nonblocking(cds_wfcq_head_ptr_t head,</div><div class='add'>+		struct cds_wfcq_tail *tail,</div><div class='add'>+		struct cds_wfcq_node *node)</div><div class='add'>+{</div><div class='add'>+	return ___cds_wfcq_next(head, tail, node, 0);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static inline struct cds_wfcq_node *</div><div class='add'>+___cds_wfcq_dequeue_with_state(cds_wfcq_head_ptr_t u_head,</div><div class='add'>+		struct cds_wfcq_tail *tail,</div><div class='add'>+		int *state,</div><div class='add'>+		int blocking)</div><div class='add'>+{</div><div class='add'>+	struct __cds_wfcq_head *head = u_head._h;</div><div class='add'>+	struct cds_wfcq_node *node, *next;</div><div class='add'>+</div><div class='add'>+	if (state)</div><div class='add'>+		*state = 0;</div><div class='add'>+</div><div class='add'>+	if (_cds_wfcq_empty(__cds_wfcq_head_cast(head), tail)) {</div><div class='add'>+		return NULL;</div><div class='add'>+	}</div><div class='add'>+</div><div class='add'>+	node = ___cds_wfcq_node_sync_next(&amp;head-&gt;node, blocking);</div><div class='add'>+	if (!blocking &amp;&amp; node == CDS_WFCQ_WOULDBLOCK) {</div><div class='add'>+		return CDS_WFCQ_WOULDBLOCK;</div><div class='add'>+	}</div><div class='add'>+</div><div class='add'>+	if ((next = CMM_LOAD_SHARED(node-&gt;next)) == NULL) {</div><div class='add'>+		/*</div><div class='add'>+		 * @node is probably the only node in the queue.</div><div class='add'>+		 * Try to move the tail to &amp;q-&gt;head.</div><div class='add'>+		 * q-&gt;head.next is set to NULL here, and stays</div><div class='add'>+		 * NULL if the cmpxchg succeeds. Should the</div><div class='add'>+		 * cmpxchg fail due to a concurrent enqueue, the</div><div class='add'>+		 * q-&gt;head.next will be set to the next node.</div><div class='add'>+		 * The implicit memory barrier before</div><div class='add'>+		 * uatomic_cmpxchg() orders load node-&gt;next</div><div class='add'>+		 * before loading q-&gt;tail.</div><div class='add'>+		 * The implicit memory barrier before uatomic_cmpxchg</div><div class='add'>+		 * orders load q-&gt;head.next before loading node's</div><div class='add'>+		 * content.</div><div class='add'>+		 */</div><div class='add'>+		_cds_wfcq_node_init(&amp;head-&gt;node);</div><div class='add'>+		if (uatomic_cmpxchg(&amp;tail-&gt;p, node, &amp;head-&gt;node) == node) {</div><div class='add'>+			if (state)</div><div class='add'>+				*state |= CDS_WFCQ_STATE_LAST;</div><div class='add'>+			return node;</div><div class='add'>+		}</div><div class='add'>+		next = ___cds_wfcq_node_sync_next(node, blocking);</div><div class='add'>+		/*</div><div class='add'>+		 * In nonblocking mode, if we would need to block to</div><div class='add'>+		 * get node's next, set the head next node pointer</div><div class='add'>+		 * (currently NULL) back to its original value.</div><div class='add'>+		 */</div><div class='add'>+		if (!blocking &amp;&amp; next == CDS_WFCQ_WOULDBLOCK) {</div><div class='add'>+			head-&gt;node.next = node;</div><div class='add'>+			return CDS_WFCQ_WOULDBLOCK;</div><div class='add'>+		}</div><div class='add'>+	}</div><div class='add'>+</div><div class='add'>+	/*</div><div class='add'>+	 * Move queue head forward.</div><div class='add'>+	 */</div><div class='add'>+	head-&gt;node.next = next;</div><div class='add'>+</div><div class='add'>+	/* Load q-&gt;head.next before loading node's content */</div><div class='add'>+	cmm_smp_read_barrier_depends();</div><div class='add'>+	return node;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+ * __cds_wfcq_dequeue_with_state_blocking: dequeue node from queue, with state.</div><div class='add'>+ *</div><div class='add'>+ * Content written into the node before enqueue is guaranteed to be</div><div class='add'>+ * consistent, but no other memory ordering is ensured.</div><div class='add'>+ * It is valid to reuse and free a dequeued node immediately.</div><div class='add'>+ * Dequeue/splice/iteration mutual exclusion should be ensured by the</div><div class='add'>+ * caller.</div><div class='add'>+ */</div><div class='add'>+static inline struct cds_wfcq_node *</div><div class='add'>+___cds_wfcq_dequeue_with_state_blocking(cds_wfcq_head_ptr_t head,</div><div class='add'>+		struct cds_wfcq_tail *tail, int *state)</div><div class='add'>+{</div><div class='add'>+	return ___cds_wfcq_dequeue_with_state(head, tail, state, 1);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+ * ___cds_wfcq_dequeue_blocking: dequeue node from queue.</div><div class='add'>+ *</div><div class='add'>+ * Same as __cds_wfcq_dequeue_with_state_blocking, but without saving</div><div class='add'>+ * state.</div><div class='add'>+ */</div><div class='add'>+static inline struct cds_wfcq_node *</div><div class='add'>+___cds_wfcq_dequeue_blocking(cds_wfcq_head_ptr_t head,</div><div class='add'>+		struct cds_wfcq_tail *tail)</div><div class='add'>+{</div><div class='add'>+	return ___cds_wfcq_dequeue_with_state_blocking(head, tail, NULL);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+ * __cds_wfcq_dequeue_with_state_nonblocking: dequeue node, with state.</div><div class='add'>+ *</div><div class='add'>+ * Same as __cds_wfcq_dequeue_blocking, but returns CDS_WFCQ_WOULDBLOCK</div><div class='add'>+ * if it needs to block.</div><div class='add'>+ */</div><div class='add'>+static inline struct cds_wfcq_node *</div><div class='add'>+___cds_wfcq_dequeue_with_state_nonblocking(cds_wfcq_head_ptr_t head,</div><div class='add'>+		struct cds_wfcq_tail *tail, int *state)</div><div class='add'>+{</div><div class='add'>+	return ___cds_wfcq_dequeue_with_state(head, tail, state, 0);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+ * ___cds_wfcq_dequeue_nonblocking: dequeue node from queue.</div><div class='add'>+ *</div><div class='add'>+ * Same as __cds_wfcq_dequeue_with_state_nonblocking, but without saving</div><div class='add'>+ * state.</div><div class='add'>+ */</div><div class='add'>+static inline struct cds_wfcq_node *</div><div class='add'>+___cds_wfcq_dequeue_nonblocking(cds_wfcq_head_ptr_t head,</div><div class='add'>+		struct cds_wfcq_tail *tail)</div><div class='add'>+{</div><div class='add'>+	return ___cds_wfcq_dequeue_with_state_nonblocking(head, tail, NULL);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+ * __cds_wfcq_splice: enqueue all src_q nodes at the end of dest_q.</div><div class='add'>+ *</div><div class='add'>+ * Dequeue all nodes from src_q.</div><div class='add'>+ * dest_q must be already initialized.</div><div class='add'>+ * Mutual exclusion for src_q should be ensured by the caller as</div><div class='add'>+ * specified in the "Synchronisation table".</div><div class='add'>+ * Returns enum cds_wfcq_ret which indicates the state of the src or</div><div class='add'>+ * dest queue.</div><div class='add'>+ */</div><div class='add'>+static inline enum cds_wfcq_ret</div><div class='add'>+___cds_wfcq_splice(</div><div class='add'>+		cds_wfcq_head_ptr_t u_dest_q_head,</div><div class='add'>+		struct cds_wfcq_tail *dest_q_tail,</div><div class='add'>+		cds_wfcq_head_ptr_t u_src_q_head,</div><div class='add'>+		struct cds_wfcq_tail *src_q_tail,</div><div class='add'>+		int blocking)</div><div class='add'>+{</div><div class='add'>+	struct __cds_wfcq_head *dest_q_head = u_dest_q_head._h;</div><div class='add'>+	struct __cds_wfcq_head *src_q_head = u_src_q_head._h;</div><div class='add'>+	struct cds_wfcq_node *head, *tail;</div><div class='add'>+	int attempt = 0;</div><div class='add'>+</div><div class='add'>+	/*</div><div class='add'>+	 * Initial emptiness check to speed up cases where queue is</div><div class='add'>+	 * empty: only require loads to check if queue is empty.</div><div class='add'>+	 */</div><div class='add'>+	if (_cds_wfcq_empty(__cds_wfcq_head_cast(src_q_head), src_q_tail))</div><div class='add'>+		return CDS_WFCQ_RET_SRC_EMPTY;</div><div class='add'>+</div><div class='add'>+	for (;;) {</div><div class='add'>+		/*</div><div class='add'>+		 * Open-coded _cds_wfcq_empty() by testing result of</div><div class='add'>+		 * uatomic_xchg, as well as tail pointer vs head node</div><div class='add'>+		 * address.</div><div class='add'>+		 */</div><div class='add'>+		head = uatomic_xchg(&amp;src_q_head-&gt;node.next, NULL);</div><div class='add'>+		if (head)</div><div class='add'>+			break;	/* non-empty */</div><div class='add'>+		if (CMM_LOAD_SHARED(src_q_tail-&gt;p) == &amp;src_q_head-&gt;node)</div><div class='add'>+			return CDS_WFCQ_RET_SRC_EMPTY;</div><div class='add'>+		if (___cds_wfcq_busy_wait(&amp;attempt, blocking))</div><div class='add'>+			return CDS_WFCQ_RET_WOULDBLOCK;</div><div class='add'>+	}</div><div class='add'>+</div><div class='add'>+	/*</div><div class='add'>+	 * Memory barrier implied before uatomic_xchg() orders store to</div><div class='add'>+	 * src_q-&gt;head before store to src_q-&gt;tail. This is required by</div><div class='add'>+	 * concurrent enqueue on src_q, which exchanges the tail before</div><div class='add'>+	 * updating the previous tail's next pointer.</div><div class='add'>+	 */</div><div class='add'>+	tail = uatomic_xchg(&amp;src_q_tail-&gt;p, &amp;src_q_head-&gt;node);</div><div class='add'>+</div><div class='add'>+	/*</div><div class='add'>+	 * Append the spliced content of src_q into dest_q. Does not</div><div class='add'>+	 * require mutual exclusion on dest_q (wait-free).</div><div class='add'>+	 */</div><div class='add'>+	if (___cds_wfcq_append(__cds_wfcq_head_cast(dest_q_head), dest_q_tail,</div><div class='add'>+			head, tail))</div><div class='add'>+		return CDS_WFCQ_RET_DEST_NON_EMPTY;</div><div class='add'>+	else</div><div class='add'>+		return CDS_WFCQ_RET_DEST_EMPTY;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+ * __cds_wfcq_splice_blocking: enqueue all src_q nodes at the end of dest_q.</div><div class='add'>+ *</div><div class='add'>+ * Dequeue all nodes from src_q.</div><div class='add'>+ * dest_q must be already initialized.</div><div class='add'>+ * Mutual exclusion for src_q should be ensured by the caller as</div><div class='add'>+ * specified in the "Synchronisation table".</div><div class='add'>+ * Returns enum cds_wfcq_ret which indicates the state of the src or</div><div class='add'>+ * dest queue. Never returns CDS_WFCQ_RET_WOULDBLOCK.</div><div class='add'>+ */</div><div class='add'>+static inline enum cds_wfcq_ret</div><div class='add'>+___cds_wfcq_splice_blocking(</div><div class='add'>+		cds_wfcq_head_ptr_t dest_q_head,</div><div class='add'>+		struct cds_wfcq_tail *dest_q_tail,</div><div class='add'>+		cds_wfcq_head_ptr_t src_q_head,</div><div class='add'>+		struct cds_wfcq_tail *src_q_tail)</div><div class='add'>+{</div><div class='add'>+	return ___cds_wfcq_splice(dest_q_head, dest_q_tail,</div><div class='add'>+		src_q_head, src_q_tail, 1);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+ * __cds_wfcq_splice_nonblocking: enqueue all src_q nodes at the end of dest_q.</div><div class='add'>+ *</div><div class='add'>+ * Same as __cds_wfcq_splice_blocking, but returns</div><div class='add'>+ * CDS_WFCQ_RET_WOULDBLOCK if it needs to block.</div><div class='add'>+ */</div><div class='add'>+static inline enum cds_wfcq_ret</div><div class='add'>+___cds_wfcq_splice_nonblocking(</div><div class='add'>+		cds_wfcq_head_ptr_t dest_q_head,</div><div class='add'>+		struct cds_wfcq_tail *dest_q_tail,</div><div class='add'>+		cds_wfcq_head_ptr_t src_q_head,</div><div class='add'>+		struct cds_wfcq_tail *src_q_tail)</div><div class='add'>+{</div><div class='add'>+	return ___cds_wfcq_splice(dest_q_head, dest_q_tail,</div><div class='add'>+		src_q_head, src_q_tail, 0);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+ * cds_wfcq_dequeue_with_state_blocking: dequeue a node from a wait-free queue.</div><div class='add'>+ *</div><div class='add'>+ * Content written into the node before enqueue is guaranteed to be</div><div class='add'>+ * consistent, but no other memory ordering is ensured.</div><div class='add'>+ * Mutual exclusion with cds_wfcq_splice_blocking and dequeue lock is</div><div class='add'>+ * ensured.</div><div class='add'>+ * It is valid to reuse and free a dequeued node immediately.</div><div class='add'>+ */</div><div class='add'>+static inline struct cds_wfcq_node *</div><div class='add'>+_cds_wfcq_dequeue_with_state_blocking(struct cds_wfcq_head *head,</div><div class='add'>+		struct cds_wfcq_tail *tail, int *state)</div><div class='add'>+{</div><div class='add'>+	struct cds_wfcq_node *retval;</div><div class='add'>+</div><div class='add'>+	_cds_wfcq_dequeue_lock(head, tail);</div><div class='add'>+	retval = ___cds_wfcq_dequeue_with_state_blocking(cds_wfcq_head_cast(head),</div><div class='add'>+			tail, state);</div><div class='add'>+	_cds_wfcq_dequeue_unlock(head, tail);</div><div class='add'>+	return retval;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+ * cds_wfcq_dequeue_blocking: dequeue node from queue.</div><div class='add'>+ *</div><div class='add'>+ * Same as cds_wfcq_dequeue_blocking, but without saving state.</div><div class='add'>+ */</div><div class='add'>+static inline struct cds_wfcq_node *</div><div class='add'>+_cds_wfcq_dequeue_blocking(struct cds_wfcq_head *head,</div><div class='add'>+		struct cds_wfcq_tail *tail)</div><div class='add'>+{</div><div class='add'>+	return _cds_wfcq_dequeue_with_state_blocking(head, tail, NULL);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+ * cds_wfcq_splice_blocking: enqueue all src_q nodes at the end of dest_q.</div><div class='add'>+ *</div><div class='add'>+ * Dequeue all nodes from src_q.</div><div class='add'>+ * dest_q must be already initialized.</div><div class='add'>+ * Content written into the node before enqueue is guaranteed to be</div><div class='add'>+ * consistent, but no other memory ordering is ensured.</div><div class='add'>+ * Mutual exclusion with cds_wfcq_dequeue_blocking and dequeue lock is</div><div class='add'>+ * ensured.</div><div class='add'>+ * Returns enum cds_wfcq_ret which indicates the state of the src or</div><div class='add'>+ * dest queue. Never returns CDS_WFCQ_RET_WOULDBLOCK.</div><div class='add'>+ */</div><div class='add'>+static inline enum cds_wfcq_ret</div><div class='add'>+_cds_wfcq_splice_blocking(</div><div class='add'>+		struct cds_wfcq_head *dest_q_head,</div><div class='add'>+		struct cds_wfcq_tail *dest_q_tail,</div><div class='add'>+		struct cds_wfcq_head *src_q_head,</div><div class='add'>+		struct cds_wfcq_tail *src_q_tail)</div><div class='add'>+{</div><div class='add'>+	enum cds_wfcq_ret ret;</div><div class='add'>+</div><div class='add'>+	_cds_wfcq_dequeue_lock(src_q_head, src_q_tail);</div><div class='add'>+	ret = ___cds_wfcq_splice_blocking(cds_wfcq_head_cast(dest_q_head), dest_q_tail,</div><div class='add'>+			cds_wfcq_head_cast(src_q_head), src_q_tail);</div><div class='add'>+	_cds_wfcq_dequeue_unlock(src_q_head, src_q_tail);</div><div class='add'>+	return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#ifdef __cplusplus</div><div class='add'>+}</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#endif /* _URCU_WFCQUEUE_STATIC_H */</div><div class='head'>diff --git a/contrib/userspace-rcu/static-wfstack.h b/contrib/userspace-rcu/static-wfstack.h<br/>new file mode 100644<br/>index 00000000000..29b81c3aac3<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/contrib/userspace-rcu/static-wfstack.h?id=d1d7a6f35c816822fab51c820e25023863c239c1'>contrib/userspace-rcu/static-wfstack.h</a></div><div class='hunk'>@@ -0,0 +1,455 @@</div><div class='add'>+#ifndef _URCU_STATIC_WFSTACK_H</div><div class='add'>+#define _URCU_STATIC_WFSTACK_H</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+ * urcu/static/wfstack.h</div><div class='add'>+ *</div><div class='add'>+ * Userspace RCU library - Stack with with wait-free push, blocking traversal.</div><div class='add'>+ *</div><div class='add'>+ * TO BE INCLUDED ONLY IN LGPL-COMPATIBLE CODE. See urcu/wfstack.h for</div><div class='add'>+ * linking dynamically with the userspace rcu library.</div><div class='add'>+ *</div><div class='add'>+ * Copyright 2010-2012 - Mathieu Desnoyers &lt;mathieu.desnoyers@efficios.com&gt;</div><div class='add'>+ *</div><div class='add'>+ * This library is free software; you can redistribute it and/or</div><div class='add'>+ * modify it under the terms of the GNU Lesser General Public</div><div class='add'>+ * License as published by the Free Software Foundation; either</div><div class='add'>+ * version 2.1 of the License, or (at your option) any later version.</div><div class='add'>+ *</div><div class='add'>+ * This library is distributed in the hope that it will be useful,</div><div class='add'>+ * but WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='add'>+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='add'>+ * Lesser General Public License for more details.</div><div class='add'>+ *</div><div class='add'>+ * You should have received a copy of the GNU Lesser General Public</div><div class='add'>+ * License along with this library; if not, write to the Free Software</div><div class='add'>+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+/* Adapted from userspace-rcu 0.10 because version 0.7 doesn't support a stack</div><div class='add'>+ * without mutex. */</div><div class='add'>+</div><div class='add'>+#include &lt;pthread.h&gt;</div><div class='add'>+#include &lt;assert.h&gt;</div><div class='add'>+#include &lt;poll.h&gt;</div><div class='add'>+#include &lt;stdbool.h&gt;</div><div class='add'>+#include &lt;urcu/compiler.h&gt;</div><div class='add'>+#include &lt;urcu/uatomic.h&gt;</div><div class='add'>+</div><div class='add'>+#ifdef __cplusplus</div><div class='add'>+extern "C" {</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#define CDS_WFS_END			((void *) 0x1UL)</div><div class='add'>+#define CDS_WFS_ADAPT_ATTEMPTS		10	/* Retry if being set */</div><div class='add'>+#define CDS_WFS_WAIT			10	/* Wait 10 ms if being set */</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+ * Stack with wait-free push, blocking traversal.</div><div class='add'>+ *</div><div class='add'>+ * Stack implementing push, pop, pop_all operations, as well as iterator</div><div class='add'>+ * on the stack head returned by pop_all.</div><div class='add'>+ *</div><div class='add'>+ * Wait-free operations: cds_wfs_push, __cds_wfs_pop_all, cds_wfs_empty,</div><div class='add'>+ *                       cds_wfs_first.</div><div class='add'>+ * Blocking operations: cds_wfs_pop, cds_wfs_pop_all, cds_wfs_next,</div><div class='add'>+ *                      iteration on stack head returned by pop_all.</div><div class='add'>+ *</div><div class='add'>+ * Synchronization table:</div><div class='add'>+ *</div><div class='add'>+ * External synchronization techniques described in the API below is</div><div class='add'>+ * required between pairs marked with "X". No external synchronization</div><div class='add'>+ * required between pairs marked with "-".</div><div class='add'>+ *</div><div class='add'>+ *                      cds_wfs_push  __cds_wfs_pop  __cds_wfs_pop_all</div><div class='add'>+ * cds_wfs_push               -              -                  -</div><div class='add'>+ * __cds_wfs_pop              -              X                  X</div><div class='add'>+ * __cds_wfs_pop_all          -              X                  -</div><div class='add'>+ *</div><div class='add'>+ * cds_wfs_pop and cds_wfs_pop_all use an internal mutex to provide</div><div class='add'>+ * synchronization.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+ * cds_wfs_node_init: initialize wait-free stack node.</div><div class='add'>+ */</div><div class='add'>+static inline</div><div class='add'>+void _cds_wfs_node_init(struct cds_wfs_node *node)</div><div class='add'>+{</div><div class='add'>+	node-&gt;next = NULL;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+ * __cds_wfs_init: initialize wait-free stack. Don't pair with</div><div class='add'>+ * any destroy function.</div><div class='add'>+ */</div><div class='add'>+static inline void ___cds_wfs_init(struct __cds_wfs_stack *s)</div><div class='add'>+{</div><div class='add'>+	s-&gt;head = CDS_WFS_END;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+ * cds_wfs_init: initialize wait-free stack. Pair with</div><div class='add'>+ * cds_wfs_destroy().</div><div class='add'>+ */</div><div class='add'>+static inline</div><div class='add'>+void _cds_wfs_init(struct cds_wfs_stack *s)</div><div class='add'>+{</div><div class='add'>+	int ret;</div><div class='add'>+</div><div class='add'>+	s-&gt;head = CDS_WFS_END;</div><div class='add'>+	ret = pthread_mutex_init(&amp;s-&gt;lock, NULL);</div><div class='add'>+	assert(!ret);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+ * cds_wfs_destroy: destroy wait-free stack. Pair with</div><div class='add'>+ * cds_wfs_init().</div><div class='add'>+ */</div><div class='add'>+static inline</div><div class='add'>+void _cds_wfs_destroy(struct cds_wfs_stack *s)</div><div class='add'>+{</div><div class='add'>+	int ret = pthread_mutex_destroy(&amp;s-&gt;lock);</div><div class='add'>+	assert(!ret);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static inline bool ___cds_wfs_end(void *node)</div><div class='add'>+{</div><div class='add'>+	return node == CDS_WFS_END;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+ * cds_wfs_empty: return whether wait-free stack is empty.</div><div class='add'>+ *</div><div class='add'>+ * No memory barrier is issued. No mutual exclusion is required.</div><div class='add'>+ */</div><div class='add'>+static inline bool _cds_wfs_empty(cds_wfs_stack_ptr_t u_stack)</div><div class='add'>+{</div><div class='add'>+	struct __cds_wfs_stack *s = u_stack._s;</div><div class='add'>+</div><div class='add'>+	return ___cds_wfs_end(CMM_LOAD_SHARED(s-&gt;head));</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+ * cds_wfs_push: push a node into the stack.</div><div class='add'>+ *</div><div class='add'>+ * Issues a full memory barrier before push. No mutual exclusion is</div><div class='add'>+ * required.</div><div class='add'>+ *</div><div class='add'>+ * Returns 0 if the stack was empty prior to adding the node.</div><div class='add'>+ * Returns non-zero otherwise.</div><div class='add'>+ */</div><div class='add'>+static inline</div><div class='add'>+int _cds_wfs_push(cds_wfs_stack_ptr_t u_stack, struct cds_wfs_node *node)</div><div class='add'>+{</div><div class='add'>+	struct __cds_wfs_stack *s = u_stack._s;</div><div class='add'>+	struct cds_wfs_head *old_head, *new_head;</div><div class='add'>+</div><div class='add'>+	assert(node-&gt;next == NULL);</div><div class='add'>+	new_head = caa_container_of(node, struct cds_wfs_head, node);</div><div class='add'>+	/*</div><div class='add'>+	 * uatomic_xchg() implicit memory barrier orders earlier stores</div><div class='add'>+	 * to node (setting it to NULL) before publication.</div><div class='add'>+	 */</div><div class='add'>+	old_head = uatomic_xchg(&amp;s-&gt;head, new_head);</div><div class='add'>+	/*</div><div class='add'>+	 * At this point, dequeuers see a NULL node-&gt;next, they should</div><div class='add'>+	 * busy-wait until node-&gt;next is set to old_head.</div><div class='add'>+	 */</div><div class='add'>+	CMM_STORE_SHARED(node-&gt;next, &amp;old_head-&gt;node);</div><div class='add'>+	return !___cds_wfs_end(old_head);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+ * Waiting for push to complete enqueue and return the next node.</div><div class='add'>+ */</div><div class='add'>+static inline struct cds_wfs_node *</div><div class='add'>+___cds_wfs_node_sync_next(struct cds_wfs_node *node, int blocking)</div><div class='add'>+{</div><div class='add'>+	struct cds_wfs_node *next;</div><div class='add'>+	int attempt = 0;</div><div class='add'>+</div><div class='add'>+	/*</div><div class='add'>+	 * Adaptative busy-looping waiting for push to complete.</div><div class='add'>+	 */</div><div class='add'>+	while ((next = CMM_LOAD_SHARED(node-&gt;next)) == NULL) {</div><div class='add'>+		if (!blocking)</div><div class='add'>+			return CDS_WFS_WOULDBLOCK;</div><div class='add'>+		if (++attempt &gt;= CDS_WFS_ADAPT_ATTEMPTS) {</div><div class='add'>+			(void) poll(NULL, 0, CDS_WFS_WAIT);	/* Wait for 10ms */</div><div class='add'>+			attempt = 0;</div><div class='add'>+		} else {</div><div class='add'>+			caa_cpu_relax();</div><div class='add'>+		}</div><div class='add'>+	}</div><div class='add'>+</div><div class='add'>+	return next;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static inline</div><div class='add'>+struct cds_wfs_node *</div><div class='add'>+___cds_wfs_pop(cds_wfs_stack_ptr_t u_stack, int *state, int blocking)</div><div class='add'>+{</div><div class='add'>+	struct cds_wfs_head *head, *new_head;</div><div class='add'>+	struct cds_wfs_node *next;</div><div class='add'>+	struct __cds_wfs_stack *s = u_stack._s;</div><div class='add'>+</div><div class='add'>+	if (state)</div><div class='add'>+		*state = 0;</div><div class='add'>+	for (;;) {</div><div class='add'>+		head = CMM_LOAD_SHARED(s-&gt;head);</div><div class='add'>+		if (___cds_wfs_end(head)) {</div><div class='add'>+			return NULL;</div><div class='add'>+		}</div><div class='add'>+		next = ___cds_wfs_node_sync_next(&amp;head-&gt;node, blocking);</div><div class='add'>+		if (!blocking &amp;&amp; next == CDS_WFS_WOULDBLOCK) {</div><div class='add'>+			return CDS_WFS_WOULDBLOCK;</div><div class='add'>+		}</div><div class='add'>+		new_head = caa_container_of(next, struct cds_wfs_head, node);</div><div class='add'>+		if (uatomic_cmpxchg(&amp;s-&gt;head, head, new_head) == head) {</div><div class='add'>+			if (state &amp;&amp; ___cds_wfs_end(new_head))</div><div class='add'>+				*state |= CDS_WFS_STATE_LAST;</div><div class='add'>+			return &amp;head-&gt;node;</div><div class='add'>+		}</div><div class='add'>+		if (!blocking) {</div><div class='add'>+			return CDS_WFS_WOULDBLOCK;</div><div class='add'>+		}</div><div class='add'>+		/* busy-loop if head changed under us */</div><div class='add'>+	}</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+ * __cds_wfs_pop_with_state_blocking: pop a node from the stack, with state.</div><div class='add'>+ *</div><div class='add'>+ * Returns NULL if stack is empty.</div><div class='add'>+ *</div><div class='add'>+ * __cds_wfs_pop_blocking needs to be synchronized using one of the</div><div class='add'>+ * following techniques:</div><div class='add'>+ *</div><div class='add'>+ * 1) Calling __cds_wfs_pop_blocking under rcu read lock critical</div><div class='add'>+ *    section. The caller must wait for a grace period to pass before</div><div class='add'>+ *    freeing the returned node or modifying the cds_wfs_node structure.</div><div class='add'>+ * 2) Using mutual exclusion (e.g. mutexes) to protect</div><div class='add'>+ *     __cds_wfs_pop_blocking and __cds_wfs_pop_all callers.</div><div class='add'>+ * 3) Ensuring that only ONE thread can call __cds_wfs_pop_blocking()</div><div class='add'>+ *    and __cds_wfs_pop_all(). (multi-provider/single-consumer scheme).</div><div class='add'>+ *</div><div class='add'>+ * "state" saves state flags atomically sampled with pop operation.</div><div class='add'>+ */</div><div class='add'>+static inline</div><div class='add'>+struct cds_wfs_node *</div><div class='add'>+___cds_wfs_pop_with_state_blocking(cds_wfs_stack_ptr_t u_stack, int *state)</div><div class='add'>+{</div><div class='add'>+	return ___cds_wfs_pop(u_stack, state, 1);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static inline</div><div class='add'>+struct cds_wfs_node *</div><div class='add'>+___cds_wfs_pop_blocking(cds_wfs_stack_ptr_t u_stack)</div><div class='add'>+{</div><div class='add'>+	return ___cds_wfs_pop_with_state_blocking(u_stack, NULL);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+ * __cds_wfs_pop_with_state_nonblocking: pop a node from the stack.</div><div class='add'>+ *</div><div class='add'>+ * Same as __cds_wfs_pop_with_state_blocking, but returns</div><div class='add'>+ * CDS_WFS_WOULDBLOCK if it needs to block.</div><div class='add'>+ *</div><div class='add'>+ * "state" saves state flags atomically sampled with pop operation.</div><div class='add'>+ */</div><div class='add'>+static inline</div><div class='add'>+struct cds_wfs_node *</div><div class='add'>+___cds_wfs_pop_with_state_nonblocking(cds_wfs_stack_ptr_t u_stack, int *state)</div><div class='add'>+{</div><div class='add'>+	return ___cds_wfs_pop(u_stack, state, 0);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+ * __cds_wfs_pop_nonblocking: pop a node from the stack.</div><div class='add'>+ *</div><div class='add'>+ * Same as __cds_wfs_pop_blocking, but returns CDS_WFS_WOULDBLOCK if</div><div class='add'>+ * it needs to block.</div><div class='add'>+ */</div><div class='add'>+static inline</div><div class='add'>+struct cds_wfs_node *</div><div class='add'>+___cds_wfs_pop_nonblocking(cds_wfs_stack_ptr_t u_stack)</div><div class='add'>+{</div><div class='add'>+	return ___cds_wfs_pop_with_state_nonblocking(u_stack, NULL);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+ * __cds_wfs_pop_all: pop all nodes from a stack.</div><div class='add'>+ *</div><div class='add'>+ * __cds_wfs_pop_all does not require any synchronization with other</div><div class='add'>+ * push, nor with other __cds_wfs_pop_all, but requires synchronization</div><div class='add'>+ * matching the technique used to synchronize __cds_wfs_pop_blocking:</div><div class='add'>+ *</div><div class='add'>+ * 1) If __cds_wfs_pop_blocking is called under rcu read lock critical</div><div class='add'>+ *    section, both __cds_wfs_pop_blocking and cds_wfs_pop_all callers</div><div class='add'>+ *    must wait for a grace period to pass before freeing the returned</div><div class='add'>+ *    node or modifying the cds_wfs_node structure. However, no RCU</div><div class='add'>+ *    read-side critical section is needed around __cds_wfs_pop_all.</div><div class='add'>+ * 2) Using mutual exclusion (e.g. mutexes) to protect</div><div class='add'>+ *     __cds_wfs_pop_blocking and __cds_wfs_pop_all callers.</div><div class='add'>+ * 3) Ensuring that only ONE thread can call __cds_wfs_pop_blocking()</div><div class='add'>+ *    and __cds_wfs_pop_all(). (multi-provider/single-consumer scheme).</div><div class='add'>+ */</div><div class='add'>+static inline</div><div class='add'>+struct cds_wfs_head *</div><div class='add'>+___cds_wfs_pop_all(cds_wfs_stack_ptr_t u_stack)</div><div class='add'>+{</div><div class='add'>+	struct __cds_wfs_stack *s = u_stack._s;</div><div class='add'>+	struct cds_wfs_head *head;</div><div class='add'>+</div><div class='add'>+	/*</div><div class='add'>+	 * Implicit memory barrier after uatomic_xchg() matches implicit</div><div class='add'>+	 * memory barrier before uatomic_xchg() in cds_wfs_push. It</div><div class='add'>+	 * ensures that all nodes of the returned list are consistent.</div><div class='add'>+	 * There is no need to issue memory barriers when iterating on</div><div class='add'>+	 * the returned list, because the full memory barrier issued</div><div class='add'>+	 * prior to each uatomic_cmpxchg, which each write to head, are</div><div class='add'>+	 * taking care to order writes to each node prior to the full</div><div class='add'>+	 * memory barrier after this uatomic_xchg().</div><div class='add'>+	 */</div><div class='add'>+	head = uatomic_xchg(&amp;s-&gt;head, CDS_WFS_END);</div><div class='add'>+	if (___cds_wfs_end(head))</div><div class='add'>+		return NULL;</div><div class='add'>+	return head;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+ * cds_wfs_pop_lock: lock stack pop-protection mutex.</div><div class='add'>+ */</div><div class='add'>+static inline void _cds_wfs_pop_lock(struct cds_wfs_stack *s)</div><div class='add'>+{</div><div class='add'>+	int ret;</div><div class='add'>+</div><div class='add'>+	ret = pthread_mutex_lock(&amp;s-&gt;lock);</div><div class='add'>+	assert(!ret);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+ * cds_wfs_pop_unlock: unlock stack pop-protection mutex.</div><div class='add'>+ */</div><div class='add'>+static inline void _cds_wfs_pop_unlock(struct cds_wfs_stack *s)</div><div class='add'>+{</div><div class='add'>+	int ret;</div><div class='add'>+</div><div class='add'>+	ret = pthread_mutex_unlock(&amp;s-&gt;lock);</div><div class='add'>+	assert(!ret);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+ * Call __cds_wfs_pop_with_state_blocking with an internal pop mutex held.</div><div class='add'>+ */</div><div class='add'>+static inline</div><div class='add'>+struct cds_wfs_node *</div><div class='add'>+_cds_wfs_pop_with_state_blocking(struct cds_wfs_stack *s, int *state)</div><div class='add'>+{</div><div class='add'>+	struct cds_wfs_node *retnode;</div><div class='add'>+</div><div class='add'>+	_cds_wfs_pop_lock(s);</div><div class='add'>+	retnode = ___cds_wfs_pop_with_state_blocking(s, state);</div><div class='add'>+	_cds_wfs_pop_unlock(s);</div><div class='add'>+	return retnode;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+ * Call _cds_wfs_pop_with_state_blocking without saving any state.</div><div class='add'>+ */</div><div class='add'>+static inline</div><div class='add'>+struct cds_wfs_node *</div><div class='add'>+_cds_wfs_pop_blocking(struct cds_wfs_stack *s)</div><div class='add'>+{</div><div class='add'>+	return _cds_wfs_pop_with_state_blocking(s, NULL);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+ * Call __cds_wfs_pop_all with an internal pop mutex held.</div><div class='add'>+ */</div><div class='add'>+static inline</div><div class='add'>+struct cds_wfs_head *</div><div class='add'>+_cds_wfs_pop_all_blocking(struct cds_wfs_stack *s)</div><div class='add'>+{</div><div class='add'>+	struct cds_wfs_head *rethead;</div><div class='add'>+</div><div class='add'>+	_cds_wfs_pop_lock(s);</div><div class='add'>+	rethead = ___cds_wfs_pop_all(s);</div><div class='add'>+	_cds_wfs_pop_unlock(s);</div><div class='add'>+	return rethead;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+ * cds_wfs_first: get first node of a popped stack.</div><div class='add'>+ *</div><div class='add'>+ * Content written into the node before enqueue is guaranteed to be</div><div class='add'>+ * consistent, but no other memory ordering is ensured.</div><div class='add'>+ *</div><div class='add'>+ * Used by for-like iteration macros in urcu/wfstack.h:</div><div class='add'>+ * cds_wfs_for_each_blocking()</div><div class='add'>+ * cds_wfs_for_each_blocking_safe()</div><div class='add'>+ *</div><div class='add'>+ * Returns NULL if popped stack is empty, top stack node otherwise.</div><div class='add'>+ */</div><div class='add'>+static inline struct cds_wfs_node *</div><div class='add'>+_cds_wfs_first(struct cds_wfs_head *head)</div><div class='add'>+{</div><div class='add'>+	if (___cds_wfs_end(head))</div><div class='add'>+		return NULL;</div><div class='add'>+	return &amp;head-&gt;node;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static inline struct cds_wfs_node *</div><div class='add'>+___cds_wfs_next(struct cds_wfs_node *node, int blocking)</div><div class='add'>+{</div><div class='add'>+	struct cds_wfs_node *next;</div><div class='add'>+</div><div class='add'>+	next = ___cds_wfs_node_sync_next(node, blocking);</div><div class='add'>+	/*</div><div class='add'>+	 * CDS_WFS_WOULDBLOCK != CSD_WFS_END, so we can check for end</div><div class='add'>+	 * even if ___cds_wfs_node_sync_next returns CDS_WFS_WOULDBLOCK,</div><div class='add'>+	 * and still return CDS_WFS_WOULDBLOCK.</div><div class='add'>+	 */</div><div class='add'>+	if (___cds_wfs_end(next))</div><div class='add'>+		return NULL;</div><div class='add'>+	return next;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+ * cds_wfs_next_blocking: get next node of a popped stack.</div><div class='add'>+ *</div><div class='add'>+ * Content written into the node before enqueue is guaranteed to be</div><div class='add'>+ * consistent, but no other memory ordering is ensured.</div><div class='add'>+ *</div><div class='add'>+ * Used by for-like iteration macros in urcu/wfstack.h:</div><div class='add'>+ * cds_wfs_for_each_blocking()</div><div class='add'>+ * cds_wfs_for_each_blocking_safe()</div><div class='add'>+ *</div><div class='add'>+ * Returns NULL if reached end of popped stack, non-NULL next stack</div><div class='add'>+ * node otherwise.</div><div class='add'>+ */</div><div class='add'>+static inline struct cds_wfs_node *</div><div class='add'>+_cds_wfs_next_blocking(struct cds_wfs_node *node)</div><div class='add'>+{</div><div class='add'>+	return ___cds_wfs_next(node, 1);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+ * cds_wfs_next_nonblocking: get next node of a popped stack.</div><div class='add'>+ *</div><div class='add'>+ * Same as cds_wfs_next_blocking, but returns CDS_WFS_WOULDBLOCK if it</div><div class='add'>+ * needs to block.</div><div class='add'>+ */</div><div class='add'>+static inline struct cds_wfs_node *</div><div class='add'>+_cds_wfs_next_nonblocking(struct cds_wfs_node *node)</div><div class='add'>+{</div><div class='add'>+	return ___cds_wfs_next(node, 0);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#ifdef __cplusplus</div><div class='add'>+}</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#endif /* _URCU_STATIC_WFSTACK_H */</div><div class='head'>diff --git a/contrib/userspace-rcu/wfcqueue.h b/contrib/userspace-rcu/wfcqueue.h<br/>new file mode 100644<br/>index 00000000000..0292585ac79<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/contrib/userspace-rcu/wfcqueue.h?id=d1d7a6f35c816822fab51c820e25023863c239c1'>contrib/userspace-rcu/wfcqueue.h</a></div><div class='hunk'>@@ -0,0 +1,216 @@</div><div class='add'>+#ifndef _URCU_WFCQUEUE_H</div><div class='add'>+#define _URCU_WFCQUEUE_H</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+ * urcu/wfcqueue.h</div><div class='add'>+ *</div><div class='add'>+ * Userspace RCU library - Concurrent Queue with Wait-Free Enqueue/Blocking Dequeue</div><div class='add'>+ *</div><div class='add'>+ * Copyright 2010-2012 - Mathieu Desnoyers &lt;mathieu.desnoyers@efficios.com&gt;</div><div class='add'>+ * Copyright 2011-2012 - Lai Jiangshan &lt;laijs@cn.fujitsu.com&gt;</div><div class='add'>+ *</div><div class='add'>+ * This library is free software; you can redistribute it and/or</div><div class='add'>+ * modify it under the terms of the GNU Lesser General Public</div><div class='add'>+ * License as published by the Free Software Foundation; either</div><div class='add'>+ * version 2.1 of the License, or (at your option) any later version.</div><div class='add'>+ *</div><div class='add'>+ * This library is distributed in the hope that it will be useful,</div><div class='add'>+ * but WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='add'>+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='add'>+ * Lesser General Public License for more details.</div><div class='add'>+ *</div><div class='add'>+ * You should have received a copy of the GNU Lesser General Public</div><div class='add'>+ * License along with this library; if not, write to the Free Software</div><div class='add'>+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+/* Adapted from userspace-rcu 0.10 because version 0.7 doesn't contain it.</div><div class='add'>+ * The non-LGPL section has been removed. */</div><div class='add'>+</div><div class='add'>+#include &lt;pthread.h&gt;</div><div class='add'>+#include &lt;assert.h&gt;</div><div class='add'>+#include &lt;stdbool.h&gt;</div><div class='add'>+#include &lt;urcu/compiler.h&gt;</div><div class='add'>+#include &lt;urcu/arch.h&gt;</div><div class='add'>+</div><div class='add'>+#ifdef __cplusplus</div><div class='add'>+extern "C" {</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+ * Concurrent queue with wait-free enqueue/blocking dequeue.</div><div class='add'>+ *</div><div class='add'>+ * This queue has been designed and implemented collaboratively by</div><div class='add'>+ * Mathieu Desnoyers and Lai Jiangshan. Inspired from</div><div class='add'>+ * half-wait-free/half-blocking queue implementation done by Paul E.</div><div class='add'>+ * McKenney.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+#define CDS_WFCQ_WOULDBLOCK	((struct cds_wfcq_node *) -1UL)</div><div class='add'>+</div><div class='add'>+enum cds_wfcq_ret {</div><div class='add'>+	CDS_WFCQ_RET_WOULDBLOCK =	-1,</div><div class='add'>+	CDS_WFCQ_RET_DEST_EMPTY =	0,</div><div class='add'>+	CDS_WFCQ_RET_DEST_NON_EMPTY =	1,</div><div class='add'>+	CDS_WFCQ_RET_SRC_EMPTY = 	2,</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+enum cds_wfcq_state {</div><div class='add'>+	CDS_WFCQ_STATE_LAST =		(1U &lt;&lt; 0),</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct cds_wfcq_node {</div><div class='add'>+	struct cds_wfcq_node *next;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+ * Do not put head and tail on the same cache-line if concurrent</div><div class='add'>+ * enqueue/dequeue are expected from many CPUs. This eliminates</div><div class='add'>+ * false-sharing between enqueue and dequeue.</div><div class='add'>+ */</div><div class='add'>+struct __cds_wfcq_head {</div><div class='add'>+	struct cds_wfcq_node node;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct cds_wfcq_head {</div><div class='add'>+	struct cds_wfcq_node node;</div><div class='add'>+	pthread_mutex_t lock;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+#ifndef __cplusplus</div><div class='add'>+/*</div><div class='add'>+ * The transparent union allows calling functions that work on both</div><div class='add'>+ * struct cds_wfcq_head and struct __cds_wfcq_head on any of those two</div><div class='add'>+ * types.</div><div class='add'>+ */</div><div class='add'>+typedef union {</div><div class='add'>+	struct __cds_wfcq_head *_h;</div><div class='add'>+	struct cds_wfcq_head *h;</div><div class='add'>+} __attribute__((__transparent_union__)) cds_wfcq_head_ptr_t;</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+ * This static inline is only present for compatibility with C++. It is</div><div class='add'>+ * effect-less in C.</div><div class='add'>+ */</div><div class='add'>+static inline struct __cds_wfcq_head *__cds_wfcq_head_cast(struct __cds_wfcq_head *head)</div><div class='add'>+{</div><div class='add'>+	return head;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+ * This static inline is only present for compatibility with C++. It is</div><div class='add'>+ * effect-less in C.</div><div class='add'>+ */</div><div class='add'>+static inline struct cds_wfcq_head *cds_wfcq_head_cast(struct cds_wfcq_head *head)</div><div class='add'>+{</div><div class='add'>+	return head;</div><div class='add'>+}</div><div class='add'>+#else /* #ifndef __cplusplus */</div><div class='add'>+</div><div class='add'>+/* C++ ignores transparent union. */</div><div class='add'>+typedef union {</div><div class='add'>+	struct __cds_wfcq_head *_h;</div><div class='add'>+	struct cds_wfcq_head *h;</div><div class='add'>+} cds_wfcq_head_ptr_t;</div><div class='add'>+</div><div class='add'>+/* C++ ignores transparent union. Requires an explicit conversion. */</div><div class='add'>+static inline cds_wfcq_head_ptr_t __cds_wfcq_head_cast(struct __cds_wfcq_head *head)</div><div class='add'>+{</div><div class='add'>+	cds_wfcq_head_ptr_t ret = { ._h = head };</div><div class='add'>+	return ret;</div><div class='add'>+}</div><div class='add'>+/* C++ ignores transparent union. Requires an explicit conversion. */</div><div class='add'>+static inline cds_wfcq_head_ptr_t cds_wfcq_head_cast(struct cds_wfcq_head *head)</div><div class='add'>+{</div><div class='add'>+	cds_wfcq_head_ptr_t ret = { .h = head };</div><div class='add'>+	return ret;</div><div class='add'>+}</div><div class='add'>+#endif /* #else #ifndef __cplusplus */</div><div class='add'>+</div><div class='add'>+struct cds_wfcq_tail {</div><div class='add'>+	struct cds_wfcq_node *p;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+#include "static-wfcqueue.h"</div><div class='add'>+</div><div class='add'>+#define cds_wfcq_node_init		_cds_wfcq_node_init</div><div class='add'>+#define cds_wfcq_init			_cds_wfcq_init</div><div class='add'>+#define __cds_wfcq_init			___cds_wfcq_init</div><div class='add'>+#define cds_wfcq_destroy		_cds_wfcq_destroy</div><div class='add'>+#define cds_wfcq_empty			_cds_wfcq_empty</div><div class='add'>+#define cds_wfcq_enqueue		_cds_wfcq_enqueue</div><div class='add'>+</div><div class='add'>+/* Dequeue locking */</div><div class='add'>+#define cds_wfcq_dequeue_lock		_cds_wfcq_dequeue_lock</div><div class='add'>+#define cds_wfcq_dequeue_unlock		_cds_wfcq_dequeue_unlock</div><div class='add'>+</div><div class='add'>+/* Locking performed within cds_wfcq calls. */</div><div class='add'>+#define cds_wfcq_dequeue_blocking	_cds_wfcq_dequeue_blocking</div><div class='add'>+#define cds_wfcq_dequeue_with_state_blocking	\</div><div class='add'>+					_cds_wfcq_dequeue_with_state_blocking</div><div class='add'>+#define cds_wfcq_splice_blocking	_cds_wfcq_splice_blocking</div><div class='add'>+#define cds_wfcq_first_blocking		_cds_wfcq_first_blocking</div><div class='add'>+#define cds_wfcq_next_blocking		_cds_wfcq_next_blocking</div><div class='add'>+</div><div class='add'>+/* Locking ensured by caller by holding cds_wfcq_dequeue_lock() */</div><div class='add'>+#define __cds_wfcq_dequeue_blocking	___cds_wfcq_dequeue_blocking</div><div class='add'>+#define __cds_wfcq_dequeue_with_state_blocking	\</div><div class='add'>+					___cds_wfcq_dequeue_with_state_blocking</div><div class='add'>+#define __cds_wfcq_splice_blocking	___cds_wfcq_splice_blocking</div><div class='add'>+#define __cds_wfcq_first_blocking	___cds_wfcq_first_blocking</div><div class='add'>+#define __cds_wfcq_next_blocking	___cds_wfcq_next_blocking</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+ * Locking ensured by caller by holding cds_wfcq_dequeue_lock().</div><div class='add'>+ * Non-blocking: deque, first, next return CDS_WFCQ_WOULDBLOCK if they</div><div class='add'>+ * need to block. splice returns nonzero if it needs to block.</div><div class='add'>+ */</div><div class='add'>+#define __cds_wfcq_dequeue_nonblocking	___cds_wfcq_dequeue_nonblocking</div><div class='add'>+#define __cds_wfcq_dequeue_with_state_nonblocking	\</div><div class='add'>+				___cds_wfcq_dequeue_with_state_nonblocking</div><div class='add'>+#define __cds_wfcq_splice_nonblocking	___cds_wfcq_splice_nonblocking</div><div class='add'>+#define __cds_wfcq_first_nonblocking	___cds_wfcq_first_nonblocking</div><div class='add'>+#define __cds_wfcq_next_nonblocking	___cds_wfcq_next_nonblocking</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+ * __cds_wfcq_for_each_blocking: Iterate over all nodes in a queue,</div><div class='add'>+ * without dequeuing them.</div><div class='add'>+ * @head: head of the queue (struct cds_wfcq_head or __cds_wfcq_head pointer).</div><div class='add'>+ * @tail: tail of the queue (struct cds_wfcq_tail pointer).</div><div class='add'>+ * @node: iterator on the queue (struct cds_wfcq_node pointer).</div><div class='add'>+ *</div><div class='add'>+ * Content written into each node before enqueue is guaranteed to be</div><div class='add'>+ * consistent, but no other memory ordering is ensured.</div><div class='add'>+ * Dequeue/splice/iteration mutual exclusion should be ensured by the</div><div class='add'>+ * caller.</div><div class='add'>+ */</div><div class='add'>+#define __cds_wfcq_for_each_blocking(head, tail, node)		\</div><div class='add'>+	for (node = __cds_wfcq_first_blocking(head, tail);	\</div><div class='add'>+		node != NULL;					\</div><div class='add'>+		node = __cds_wfcq_next_blocking(head, tail, node))</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+ * __cds_wfcq_for_each_blocking_safe: Iterate over all nodes in a queue,</div><div class='add'>+ * without dequeuing them. Safe against deletion.</div><div class='add'>+ * @head: head of the queue (struct cds_wfcq_head or __cds_wfcq_head pointer).</div><div class='add'>+ * @tail: tail of the queue (struct cds_wfcq_tail pointer).</div><div class='add'>+ * @node: iterator on the queue (struct cds_wfcq_node pointer).</div><div class='add'>+ * @n: struct cds_wfcq_node pointer holding the next pointer (used</div><div class='add'>+ *     internally).</div><div class='add'>+ *</div><div class='add'>+ * Content written into each node before enqueue is guaranteed to be</div><div class='add'>+ * consistent, but no other memory ordering is ensured.</div><div class='add'>+ * Dequeue/splice/iteration mutual exclusion should be ensured by the</div><div class='add'>+ * caller.</div><div class='add'>+ */</div><div class='add'>+#define __cds_wfcq_for_each_blocking_safe(head, tail, node, n)		       \</div><div class='add'>+	for (node = __cds_wfcq_first_blocking(head, tail),		       \</div><div class='add'>+			n = (node ? __cds_wfcq_next_blocking(head, tail, node) : NULL); \</div><div class='add'>+		node != NULL;						       \</div><div class='add'>+		node = n, n = (node ? __cds_wfcq_next_blocking(head, tail, node) : NULL))</div><div class='add'>+</div><div class='add'>+#ifdef __cplusplus</div><div class='add'>+}</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#endif /* _URCU_WFCQUEUE_H */</div><div class='head'>diff --git a/contrib/userspace-rcu/wfstack.h b/contrib/userspace-rcu/wfstack.h<br/>new file mode 100644<br/>index 00000000000..738fd1cfd33<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/contrib/userspace-rcu/wfstack.h?id=d1d7a6f35c816822fab51c820e25023863c239c1'>contrib/userspace-rcu/wfstack.h</a></div><div class='hunk'>@@ -0,0 +1,178 @@</div><div class='add'>+#ifndef _URCU_WFSTACK_H</div><div class='add'>+#define _URCU_WFSTACK_H</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+ * urcu/wfstack.h</div><div class='add'>+ *</div><div class='add'>+ * Userspace RCU library - Stack with wait-free push, blocking traversal.</div><div class='add'>+ *</div><div class='add'>+ * Copyright 2010-2012 - Mathieu Desnoyers &lt;mathieu.desnoyers@efficios.com&gt;</div><div class='add'>+ *</div><div class='add'>+ * This library is free software; you can redistribute it and/or</div><div class='add'>+ * modify it under the terms of the GNU Lesser General Public</div><div class='add'>+ * License as published by the Free Software Foundation; either</div><div class='add'>+ * version 2.1 of the License, or (at your option) any later version.</div><div class='add'>+ *</div><div class='add'>+ * This library is distributed in the hope that it will be useful,</div><div class='add'>+ * but WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='add'>+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='add'>+ * Lesser General Public License for more details.</div><div class='add'>+ *</div><div class='add'>+ * You should have received a copy of the GNU Lesser General Public</div><div class='add'>+ * License along with this library; if not, write to the Free Software</div><div class='add'>+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+/* Adapted from userspace-rcu 0.10 because version 0.7 doesn't support a stack</div><div class='add'>+ * without mutex. The non-LGPL section has been removed. */</div><div class='add'>+</div><div class='add'>+#include &lt;pthread.h&gt;</div><div class='add'>+#include &lt;assert.h&gt;</div><div class='add'>+#include &lt;stdbool.h&gt;</div><div class='add'>+#include &lt;urcu/compiler.h&gt;</div><div class='add'>+</div><div class='add'>+#ifdef __cplusplus</div><div class='add'>+extern "C" {</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+ * Stack with wait-free push, blocking traversal.</div><div class='add'>+ *</div><div class='add'>+ * Stack implementing push, pop, pop_all operations, as well as iterator</div><div class='add'>+ * on the stack head returned by pop_all.</div><div class='add'>+ *</div><div class='add'>+ * Wait-free operations: cds_wfs_push, __cds_wfs_pop_all, cds_wfs_empty,</div><div class='add'>+ *                       cds_wfs_first.</div><div class='add'>+ * Blocking operations: cds_wfs_pop, cds_wfs_pop_all, cds_wfs_next,</div><div class='add'>+ *                      iteration on stack head returned by pop_all.</div><div class='add'>+ *</div><div class='add'>+ * Synchronization table:</div><div class='add'>+ *</div><div class='add'>+ * External synchronization techniques described in the API below is</div><div class='add'>+ * required between pairs marked with "X". No external synchronization</div><div class='add'>+ * required between pairs marked with "-".</div><div class='add'>+ *</div><div class='add'>+ *                      cds_wfs_push  __cds_wfs_pop  __cds_wfs_pop_all</div><div class='add'>+ * cds_wfs_push               -              -                  -</div><div class='add'>+ * __cds_wfs_pop              -              X                  X</div><div class='add'>+ * __cds_wfs_pop_all          -              X                  -</div><div class='add'>+ *</div><div class='add'>+ * cds_wfs_pop and cds_wfs_pop_all use an internal mutex to provide</div><div class='add'>+ * synchronization.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+#define CDS_WFS_WOULDBLOCK	((void *) -1UL)</div><div class='add'>+</div><div class='add'>+enum cds_wfs_state {</div><div class='add'>+	CDS_WFS_STATE_LAST =		(1U &lt;&lt; 0),</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+ * struct cds_wfs_node is returned by __cds_wfs_pop, and also used as</div><div class='add'>+ * iterator on stack. It is not safe to dereference the node next</div><div class='add'>+ * pointer when returned by __cds_wfs_pop_blocking.</div><div class='add'>+ */</div><div class='add'>+struct cds_wfs_node {</div><div class='add'>+	struct cds_wfs_node *next;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+ * struct cds_wfs_head is returned by __cds_wfs_pop_all, and can be used</div><div class='add'>+ * to begin iteration on the stack. "node" needs to be the first field of</div><div class='add'>+ * cds_wfs_head, so the end-of-stack pointer value can be used for both</div><div class='add'>+ * types.</div><div class='add'>+ */</div><div class='add'>+struct cds_wfs_head {</div><div class='add'>+	struct cds_wfs_node node;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct __cds_wfs_stack {</div><div class='add'>+	struct cds_wfs_head *head;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct cds_wfs_stack {</div><div class='add'>+	struct cds_wfs_head *head;</div><div class='add'>+	pthread_mutex_t lock;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+ * The transparent union allows calling functions that work on both</div><div class='add'>+ * struct cds_wfs_stack and struct __cds_wfs_stack on any of those two</div><div class='add'>+ * types.</div><div class='add'>+ */</div><div class='add'>+typedef union {</div><div class='add'>+	struct __cds_wfs_stack *_s;</div><div class='add'>+	struct cds_wfs_stack *s;</div><div class='add'>+} __attribute__((__transparent_union__)) cds_wfs_stack_ptr_t;</div><div class='add'>+</div><div class='add'>+#include "static-wfstack.h"</div><div class='add'>+</div><div class='add'>+#define cds_wfs_node_init		_cds_wfs_node_init</div><div class='add'>+#define cds_wfs_init			_cds_wfs_init</div><div class='add'>+#define cds_wfs_destroy			_cds_wfs_destroy</div><div class='add'>+#define __cds_wfs_init			___cds_wfs_init</div><div class='add'>+#define cds_wfs_empty			_cds_wfs_empty</div><div class='add'>+#define cds_wfs_push			_cds_wfs_push</div><div class='add'>+</div><div class='add'>+/* Locking performed internally */</div><div class='add'>+#define cds_wfs_pop_blocking		_cds_wfs_pop_blocking</div><div class='add'>+#define cds_wfs_pop_with_state_blocking	_cds_wfs_pop_with_state_blocking</div><div class='add'>+#define cds_wfs_pop_all_blocking	_cds_wfs_pop_all_blocking</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+ * For iteration on cds_wfs_head returned by __cds_wfs_pop_all or</div><div class='add'>+ * cds_wfs_pop_all_blocking.</div><div class='add'>+ */</div><div class='add'>+#define cds_wfs_first			_cds_wfs_first</div><div class='add'>+#define cds_wfs_next_blocking		_cds_wfs_next_blocking</div><div class='add'>+#define cds_wfs_next_nonblocking	_cds_wfs_next_nonblocking</div><div class='add'>+</div><div class='add'>+/* Pop locking with internal mutex */</div><div class='add'>+#define cds_wfs_pop_lock		_cds_wfs_pop_lock</div><div class='add'>+#define cds_wfs_pop_unlock		_cds_wfs_pop_unlock</div><div class='add'>+</div><div class='add'>+/* Synchronization ensured by the caller. See synchronization table. */</div><div class='add'>+#define __cds_wfs_pop_blocking		___cds_wfs_pop_blocking</div><div class='add'>+#define __cds_wfs_pop_with_state_blocking	\</div><div class='add'>+					___cds_wfs_pop_with_state_blocking</div><div class='add'>+#define __cds_wfs_pop_nonblocking	___cds_wfs_pop_nonblocking</div><div class='add'>+#define __cds_wfs_pop_with_state_nonblocking	\</div><div class='add'>+					___cds_wfs_pop_with_state_nonblocking</div><div class='add'>+#define __cds_wfs_pop_all		___cds_wfs_pop_all</div><div class='add'>+</div><div class='add'>+#ifdef __cplusplus</div><div class='add'>+}</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+ * cds_wfs_for_each_blocking: Iterate over all nodes returned by</div><div class='add'>+ * __cds_wfs_pop_all().</div><div class='add'>+ * @head: head of the queue (struct cds_wfs_head pointer).</div><div class='add'>+ * @node: iterator (struct cds_wfs_node pointer).</div><div class='add'>+ *</div><div class='add'>+ * Content written into each node before enqueue is guaranteed to be</div><div class='add'>+ * consistent, but no other memory ordering is ensured.</div><div class='add'>+ */</div><div class='add'>+#define cds_wfs_for_each_blocking(head, node)			\</div><div class='add'>+	for (node = cds_wfs_first(head);			\</div><div class='add'>+		node != NULL;					\</div><div class='add'>+		node = cds_wfs_next_blocking(node))</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+ * cds_wfs_for_each_blocking_safe: Iterate over all nodes returned by</div><div class='add'>+ * __cds_wfs_pop_all(). Safe against deletion.</div><div class='add'>+ * @head: head of the queue (struct cds_wfs_head pointer).</div><div class='add'>+ * @node: iterator (struct cds_wfs_node pointer).</div><div class='add'>+ * @n: struct cds_wfs_node pointer holding the next pointer (used</div><div class='add'>+ *     internally).</div><div class='add'>+ *</div><div class='add'>+ * Content written into each node before enqueue is guaranteed to be</div><div class='add'>+ * consistent, but no other memory ordering is ensured.</div><div class='add'>+ */</div><div class='add'>+#define cds_wfs_for_each_blocking_safe(head, node, n)			   \</div><div class='add'>+	for (node = cds_wfs_first(head),				   \</div><div class='add'>+			n = (node ? cds_wfs_next_blocking(node) : NULL);   \</div><div class='add'>+		node != NULL;						   \</div><div class='add'>+		node = n, n = (node ? cds_wfs_next_blocking(node) : NULL))</div><div class='add'>+</div><div class='add'>+#endif /* _URCU_WFSTACK_H */</div><div class='head'>diff --git a/contrib/uuid/clear.c b/contrib/uuid/clear.c<br/>deleted file mode 100644<br/>index 2d91fee9399..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/contrib/uuid/clear.c?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>contrib/uuid/clear.c</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,43 +0,0 @@</div><div class='del'>-/*</div><div class='del'>- * clear.c -- Clear a UUID</div><div class='del'>- *</div><div class='del'>- * Copyright (C) 1996, 1997 Theodore Ts'o.</div><div class='del'>- *</div><div class='del'>- * %Begin-Header%</div><div class='del'>- * Redistribution and use in source and binary forms, with or without</div><div class='del'>- * modification, are permitted provided that the following conditions</div><div class='del'>- * are met:</div><div class='del'>- * 1. Redistributions of source code must retain the above copyright</div><div class='del'>- *    notice, and the entire permission notice in its entirety,</div><div class='del'>- *    including the disclaimer of warranties.</div><div class='del'>- * 2. Redistributions in binary form must reproduce the above copyright</div><div class='del'>- *    notice, this list of conditions and the following disclaimer in the</div><div class='del'>- *    documentation and/or other materials provided with the distribution.</div><div class='del'>- * 3. The name of the author may not be used to endorse or promote</div><div class='del'>- *    products derived from this software without specific prior</div><div class='del'>- *    written permission.</div><div class='del'>- *</div><div class='del'>- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED</div><div class='del'>- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES</div><div class='del'>- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ALL OF</div><div class='del'>- * WHICH ARE HEREBY DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE</div><div class='del'>- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR</div><div class='del'>- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT</div><div class='del'>- * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR</div><div class='del'>- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF</div><div class='del'>- * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT</div><div class='del'>- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE</div><div class='del'>- * USE OF THIS SOFTWARE, EVEN IF NOT ADVISED OF THE POSSIBILITY OF SUCH</div><div class='del'>- * DAMAGE.</div><div class='del'>- * %End-Header%</div><div class='del'>- */</div><div class='del'>-</div><div class='del'>-#include "string.h"</div><div class='del'>-</div><div class='del'>-#include "uuidP.h"</div><div class='del'>-</div><div class='del'>-void uuid_clear(uuid_t uu)</div><div class='del'>-{</div><div class='del'>-	memset(uu, 0, 16);</div><div class='del'>-}</div><div class='del'>-</div><div class='head'>diff --git a/contrib/uuid/compare.c b/contrib/uuid/compare.c<br/>deleted file mode 100644<br/>index f28a72678cf..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/contrib/uuid/compare.c?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>contrib/uuid/compare.c</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,55 +0,0 @@</div><div class='del'>-/*</div><div class='del'>- * compare.c --- compare whether or not two UUID's are the same</div><div class='del'>- *</div><div class='del'>- * Returns 0 if the two UUID's are different, and 1 if they are the same.</div><div class='del'>- *</div><div class='del'>- * Copyright (C) 1996, 1997 Theodore Ts'o.</div><div class='del'>- *</div><div class='del'>- * %Begin-Header%</div><div class='del'>- * Redistribution and use in source and binary forms, with or without</div><div class='del'>- * modification, are permitted provided that the following conditions</div><div class='del'>- * are met:</div><div class='del'>- * 1. Redistributions of source code must retain the above copyright</div><div class='del'>- *    notice, and the entire permission notice in its entirety,</div><div class='del'>- *    including the disclaimer of warranties.</div><div class='del'>- * 2. Redistributions in binary form must reproduce the above copyright</div><div class='del'>- *    notice, this list of conditions and the following disclaimer in the</div><div class='del'>- *    documentation and/or other materials provided with the distribution.</div><div class='del'>- * 3. The name of the author may not be used to endorse or promote</div><div class='del'>- *    products derived from this software without specific prior</div><div class='del'>- *    written permission.</div><div class='del'>- *</div><div class='del'>- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED</div><div class='del'>- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES</div><div class='del'>- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ALL OF</div><div class='del'>- * WHICH ARE HEREBY DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE</div><div class='del'>- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR</div><div class='del'>- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT</div><div class='del'>- * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR</div><div class='del'>- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF</div><div class='del'>- * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT</div><div class='del'>- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE</div><div class='del'>- * USE OF THIS SOFTWARE, EVEN IF NOT ADVISED OF THE POSSIBILITY OF SUCH</div><div class='del'>- * DAMAGE.</div><div class='del'>- * %End-Header%</div><div class='del'>- */</div><div class='del'>-</div><div class='del'>-#include "uuidP.h"</div><div class='del'>-#include &lt;string.h&gt;</div><div class='del'>-</div><div class='del'>-#define UUCMP(u1,u2) if (u1 != u2) return((u1 &lt; u2) ? -1 : 1);</div><div class='del'>-</div><div class='del'>-int uuid_compare(const uuid_t uu1, const uuid_t uu2)</div><div class='del'>-{</div><div class='del'>-	struct uuid	uuid1, uuid2;</div><div class='del'>-</div><div class='del'>-	uuid_unpack(uu1, &amp;uuid1);</div><div class='del'>-	uuid_unpack(uu2, &amp;uuid2);</div><div class='del'>-</div><div class='del'>-	UUCMP(uuid1.time_low, uuid2.time_low);</div><div class='del'>-	UUCMP(uuid1.time_mid, uuid2.time_mid);</div><div class='del'>-	UUCMP(uuid1.time_hi_and_version, uuid2.time_hi_and_version);</div><div class='del'>-	UUCMP(uuid1.clock_seq, uuid2.clock_seq);</div><div class='del'>-	return memcmp(uuid1.node, uuid2.node, 6);</div><div class='del'>-}</div><div class='del'>-</div><div class='head'>diff --git a/contrib/uuid/copy.c b/contrib/uuid/copy.c<br/>deleted file mode 100644<br/>index ead33aa26e8..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/contrib/uuid/copy.c?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>contrib/uuid/copy.c</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,45 +0,0 @@</div><div class='del'>-/*</div><div class='del'>- * copy.c --- copy UUIDs</div><div class='del'>- *</div><div class='del'>- * Copyright (C) 1996, 1997 Theodore Ts'o.</div><div class='del'>- *</div><div class='del'>- * %Begin-Header%</div><div class='del'>- * Redistribution and use in source and binary forms, with or without</div><div class='del'>- * modification, are permitted provided that the following conditions</div><div class='del'>- * are met:</div><div class='del'>- * 1. Redistributions of source code must retain the above copyright</div><div class='del'>- *    notice, and the entire permission notice in its entirety,</div><div class='del'>- *    including the disclaimer of warranties.</div><div class='del'>- * 2. Redistributions in binary form must reproduce the above copyright</div><div class='del'>- *    notice, this list of conditions and the following disclaimer in the</div><div class='del'>- *    documentation and/or other materials provided with the distribution.</div><div class='del'>- * 3. The name of the author may not be used to endorse or promote</div><div class='del'>- *    products derived from this software without specific prior</div><div class='del'>- *    written permission.</div><div class='del'>- *</div><div class='del'>- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED</div><div class='del'>- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES</div><div class='del'>- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ALL OF</div><div class='del'>- * WHICH ARE HEREBY DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE</div><div class='del'>- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR</div><div class='del'>- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT</div><div class='del'>- * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR</div><div class='del'>- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF</div><div class='del'>- * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT</div><div class='del'>- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE</div><div class='del'>- * USE OF THIS SOFTWARE, EVEN IF NOT ADVISED OF THE POSSIBILITY OF SUCH</div><div class='del'>- * DAMAGE.</div><div class='del'>- * %End-Header%</div><div class='del'>- */</div><div class='del'>-</div><div class='del'>-#include "uuidP.h"</div><div class='del'>-</div><div class='del'>-void uuid_copy(uuid_t dst, const uuid_t src)</div><div class='del'>-{</div><div class='del'>-	unsigned char		*cp1;</div><div class='del'>-	const unsigned char	*cp2;</div><div class='del'>-	int			i;</div><div class='del'>-</div><div class='del'>-	for (i=0, cp1 = dst, cp2 = src; i &lt; 16; i++)</div><div class='del'>-		*cp1++ = *cp2++;</div><div class='del'>-}</div><div class='head'>diff --git a/contrib/uuid/gen_uuid.c b/contrib/uuid/gen_uuid.c<br/>deleted file mode 100644<br/>index b3eda9de387..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/contrib/uuid/gen_uuid.c?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>contrib/uuid/gen_uuid.c</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,679 +0,0 @@</div><div class='del'>-/*</div><div class='del'>- * gen_uuid.c --- generate a DCE-compatible uuid</div><div class='del'>- *</div><div class='del'>- * Copyright (C) 1996, 1997, 1998, 1999 Theodore Ts'o.</div><div class='del'>- *</div><div class='del'>- * %Begin-Header%</div><div class='del'>- * Redistribution and use in source and binary forms, with or without</div><div class='del'>- * modification, are permitted provided that the following conditions</div><div class='del'>- * are met:</div><div class='del'>- * 1. Redistributions of source code must retain the above copyright</div><div class='del'>- *    notice, and the entire permission notice in its entirety,</div><div class='del'>- *    including the disclaimer of warranties.</div><div class='del'>- * 2. Redistributions in binary form must reproduce the above copyright</div><div class='del'>- *    notice, this list of conditions and the following disclaimer in the</div><div class='del'>- *    documentation and/or other materials provided with the distribution.</div><div class='del'>- * 3. The name of the author may not be used to endorse or promote</div><div class='del'>- *    products derived from this software without specific prior</div><div class='del'>- *    written permission.</div><div class='del'>- *</div><div class='del'>- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED</div><div class='del'>- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES</div><div class='del'>- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ALL OF</div><div class='del'>- * WHICH ARE HEREBY DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE</div><div class='del'>- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR</div><div class='del'>- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT</div><div class='del'>- * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR</div><div class='del'>- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF</div><div class='del'>- * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT</div><div class='del'>- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE</div><div class='del'>- * USE OF THIS SOFTWARE, EVEN IF NOT ADVISED OF THE POSSIBILITY OF SUCH</div><div class='del'>- * DAMAGE.</div><div class='del'>- * %End-Header%</div><div class='del'>- */</div><div class='del'>-</div><div class='del'>-/*</div><div class='del'>- * Force inclusion of SVID stuff since we need it if we're compiling in</div><div class='del'>- * gcc-wall wall mode</div><div class='del'>- */</div><div class='del'>-#define _SVID_SOURCE</div><div class='del'>-</div><div class='del'>-#include "config.h"</div><div class='del'>-#ifdef _WIN32</div><div class='del'>-#define _WIN32_WINNT 0x0500</div><div class='del'>-#include &lt;windows.h&gt;</div><div class='del'>-#define UUID MYUUID</div><div class='del'>-#endif</div><div class='del'>-#include &lt;stdio.h&gt;</div><div class='del'>-#ifdef HAVE_UNISTD_H</div><div class='del'>-#include &lt;unistd.h&gt;</div><div class='del'>-#endif</div><div class='del'>-#ifdef HAVE_STDLIB_H</div><div class='del'>-#include &lt;stdlib.h&gt;</div><div class='del'>-#endif</div><div class='del'>-#include &lt;string.h&gt;</div><div class='del'>-#include &lt;fcntl.h&gt;</div><div class='del'>-#include &lt;errno.h&gt;</div><div class='del'>-#include &lt;sys/types.h&gt;</div><div class='del'>-#ifdef HAVE_SYS_TIME_H</div><div class='del'>-#include &lt;sys/time.h&gt;</div><div class='del'>-#endif</div><div class='del'>-#include &lt;sys/wait.h&gt;</div><div class='del'>-#include &lt;sys/stat.h&gt;</div><div class='del'>-#ifdef HAVE_SYS_FILE_H</div><div class='del'>-#include &lt;sys/file.h&gt;</div><div class='del'>-#endif</div><div class='del'>-#ifdef HAVE_SYS_IOCTL_H</div><div class='del'>-#include &lt;sys/ioctl.h&gt;</div><div class='del'>-#endif</div><div class='del'>-#ifdef HAVE_SYS_SOCKET_H</div><div class='del'>-#include &lt;sys/socket.h&gt;</div><div class='del'>-#endif</div><div class='del'>-#ifdef HAVE_SYS_UN_H</div><div class='del'>-#include &lt;sys/un.h&gt;</div><div class='del'>-#endif</div><div class='del'>-#ifdef HAVE_SYS_SOCKIO_H</div><div class='del'>-#include &lt;sys/sockio.h&gt;</div><div class='del'>-#endif</div><div class='del'>-#ifdef HAVE_NET_IF_H</div><div class='del'>-#include &lt;net/if.h&gt;</div><div class='del'>-#endif</div><div class='del'>-#ifdef HAVE_NETINET_IN_H</div><div class='del'>-#include &lt;netinet/in.h&gt;</div><div class='del'>-#endif</div><div class='del'>-#ifdef HAVE_NET_IF_DL_H</div><div class='del'>-#include &lt;net/if_dl.h&gt;</div><div class='del'>-#endif</div><div class='del'>-#if defined(__linux__) &amp;&amp; defined(HAVE_SYS_SYSCALL_H)</div><div class='del'>-#include &lt;sys/syscall.h&gt;</div><div class='del'>-#endif</div><div class='del'>-#ifdef HAVE_SYS_RESOURCE_H</div><div class='del'>-#include &lt;sys/resource.h&gt;</div><div class='del'>-#endif</div><div class='del'>-#include &lt;limits.h&gt;</div><div class='del'>-</div><div class='del'>-#include "uuidP.h"</div><div class='del'>-#include "uuidd.h"</div><div class='del'>-</div><div class='del'>-#ifdef HAVE_SRANDOM</div><div class='del'>-#define srand(x) 	srandom(x)</div><div class='del'>-#define rand() 		random()</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-#ifdef TLS</div><div class='del'>-#define THREAD_LOCAL static TLS</div><div class='del'>-#else</div><div class='del'>-#define THREAD_LOCAL static</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-#if defined(__linux__) &amp;&amp; defined(__NR_gettid) &amp;&amp; defined(HAVE_JRAND48)</div><div class='del'>-#define DO_JRAND_MIX</div><div class='del'>-THREAD_LOCAL unsigned short jrand_seed[3];</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-#ifndef OPEN_MAX</div><div class='del'>-#define OPEN_MAX 1024</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-#ifdef _WIN32</div><div class='del'>-static void gettimeofday (struct timeval *tv, void *dummy)</div><div class='del'>-{</div><div class='del'>-	FILETIME	ftime;</div><div class='del'>-	uint64_t	n;</div><div class='del'>-</div><div class='del'>-	GetSystemTimeAsFileTime (&amp;ftime);</div><div class='del'>-	n = (((uint64_t) ftime.dwHighDateTime &lt;&lt; 32)</div><div class='del'>-	     + (uint64_t) ftime.dwLowDateTime);</div><div class='del'>-	if (n) {</div><div class='del'>-		n /= 10;</div><div class='del'>-		n -= ((369 * 365 + 89) * (uint64_t) 86400) * 1000000;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	tv-&gt;tv_sec = n / 1000000;</div><div class='del'>-	tv-&gt;tv_usec = n % 1000000;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-static int getuid (void)</div><div class='del'>-{</div><div class='del'>-	return 1;</div><div class='del'>-}</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-static int get_random_fd(void)</div><div class='del'>-{</div><div class='del'>-	struct timeval	tv;</div><div class='del'>-	static int	fd = -2;</div><div class='del'>-	int		i;</div><div class='del'>-</div><div class='del'>-	if (fd == -2) {</div><div class='del'>-		gettimeofday(&amp;tv, 0);</div><div class='del'>-#ifndef _WIN32</div><div class='del'>-		fd = open("/dev/urandom", O_RDONLY);</div><div class='del'>-		if (fd == -1)</div><div class='del'>-			fd = open("/dev/random", O_RDONLY | O_NONBLOCK);</div><div class='del'>-		if (fd &gt;= 0) {</div><div class='del'>-			i = fcntl(fd, F_GETFD);</div><div class='del'>-			if (i &gt;= 0)</div><div class='del'>-				fcntl(fd, F_SETFD, i | FD_CLOEXEC);</div><div class='del'>-		}</div><div class='del'>-#endif</div><div class='del'>-		srand((getpid() &lt;&lt; 16) ^ getuid() ^ tv.tv_sec ^ tv.tv_usec);</div><div class='del'>-#ifdef DO_JRAND_MIX</div><div class='del'>-		jrand_seed[0] = getpid() ^ (tv.tv_sec &amp; 0xFFFF);</div><div class='del'>-		jrand_seed[1] = getppid() ^ (tv.tv_usec &amp; 0xFFFF);</div><div class='del'>-		jrand_seed[2] = (tv.tv_sec ^ tv.tv_usec) &gt;&gt; 16;</div><div class='del'>-#endif</div><div class='del'>-	}</div><div class='del'>-	/* Crank the random number generator a few times */</div><div class='del'>-	gettimeofday(&amp;tv, 0);</div><div class='del'>-	for (i = (tv.tv_sec ^ tv.tv_usec) &amp; 0x1F; i &gt; 0; i--)</div><div class='del'>-		rand();</div><div class='del'>-	return fd;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-/*</div><div class='del'>- * Generate a series of random bytes.  Use /dev/urandom if possible,</div><div class='del'>- * and if not, use srandom/random.</div><div class='del'>- */</div><div class='del'>-static void get_random_bytes(void *buf, int nbytes)</div><div class='del'>-{</div><div class='del'>-	int i, n = nbytes, fd = get_random_fd();</div><div class='del'>-	int lose_counter = 0;</div><div class='del'>-	unsigned char *cp = (unsigned char *) buf;</div><div class='del'>-#ifdef DO_JRAND_MIX</div><div class='del'>-	unsigned short tmp_seed[3];</div><div class='del'>-#endif</div><div class='del'>-	if (fd &gt;= 0) {</div><div class='del'>-		while (n &gt; 0) {</div><div class='del'>-			i = read(fd, cp, n);</div><div class='del'>-			if (i &lt;= 0) {</div><div class='del'>-				if (lose_counter++ &gt; 16)</div><div class='del'>-					break;</div><div class='del'>-				continue;</div><div class='del'>-			}</div><div class='del'>-			n -= i;</div><div class='del'>-			cp += i;</div><div class='del'>-			lose_counter = 0;</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	/*</div><div class='del'>-	 * We do this all the time, but this is the only source of</div><div class='del'>-	 * randomness if /dev/random/urandom is out to lunch.</div><div class='del'>-	 */</div><div class='del'>-	for (cp = buf, i = 0; i &lt; nbytes; i++)</div><div class='del'>-		*cp++ ^= (rand() &gt;&gt; 7) &amp; 0xFF;</div><div class='del'>-#ifdef DO_JRAND_MIX</div><div class='del'>-	memcpy(tmp_seed, jrand_seed, sizeof(tmp_seed));</div><div class='del'>-	jrand_seed[2] = jrand_seed[2] ^ syscall(__NR_gettid);</div><div class='del'>-	for (cp = buf, i = 0; i &lt; nbytes; i++)</div><div class='del'>-		*cp++ ^= (jrand48(tmp_seed) &gt;&gt; 7) &amp; 0xFF;</div><div class='del'>-	memcpy(jrand_seed, tmp_seed,</div><div class='del'>-	       sizeof(jrand_seed)-sizeof(unsigned short));</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-	return;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-/*</div><div class='del'>- * Get the ethernet hardware address, if we can find it...</div><div class='del'>- *</div><div class='del'>- * XXX for a windows version, probably should use GetAdaptersInfo:</div><div class='del'>- * http://www.codeguru.com/cpp/i-n/network/networkinformation/article.php/c5451</div><div class='del'>- * commenting out get_node_id just to get gen_uuid to compile under windows</div><div class='del'>- * is not the right way to go!</div><div class='del'>- */</div><div class='del'>-static int get_node_id(unsigned char *node_id)</div><div class='del'>-{</div><div class='del'>-#ifdef HAVE_NET_IF_H</div><div class='del'>-	int 		sd;</div><div class='del'>-	struct ifreq 	ifr, *ifrp;</div><div class='del'>-	struct ifconf 	ifc;</div><div class='del'>-	char buf[1024];</div><div class='del'>-	int		n, i;</div><div class='del'>-	unsigned char 	*a;</div><div class='del'>-#ifdef HAVE_NET_IF_DL_H</div><div class='del'>-	struct sockaddr_dl *sdlp;</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-/*</div><div class='del'>- * BSD 4.4 defines the size of an ifreq to be</div><div class='del'>- * max(sizeof(ifreq), sizeof(ifreq.ifr_name)+ifreq.ifr_addr.sa_len</div><div class='del'>- * However, under earlier systems, sa_len isn't present, so the size is</div><div class='del'>- * just sizeof(struct ifreq)</div><div class='del'>- */</div><div class='del'>-#ifdef HAVE_SA_LEN</div><div class='del'>-#ifndef max</div><div class='del'>-#define max(a,b) ((a) &gt; (b) ? (a) : (b))</div><div class='del'>-#endif</div><div class='del'>-#define ifreq_size(i) max(sizeof(struct ifreq),\</div><div class='del'>-     sizeof((i).ifr_name)+(i).ifr_addr.sa_len)</div><div class='del'>-#else</div><div class='del'>-#define ifreq_size(i) sizeof(struct ifreq)</div><div class='del'>-#endif /* HAVE_SA_LEN*/</div><div class='del'>-</div><div class='del'>-	sd = socket(AF_INET, SOCK_DGRAM, IPPROTO_IP);</div><div class='del'>-	if (sd &lt; 0) {</div><div class='del'>-		return -1;</div><div class='del'>-	}</div><div class='del'>-	memset(buf, 0, sizeof(buf));</div><div class='del'>-	ifc.ifc_len = sizeof(buf);</div><div class='del'>-	ifc.ifc_buf = buf;</div><div class='del'>-	if (ioctl (sd, SIOCGIFCONF, (char *)&amp;ifc) &lt; 0) {</div><div class='del'>-		close(sd);</div><div class='del'>-		return -1;</div><div class='del'>-	}</div><div class='del'>-	n = ifc.ifc_len;</div><div class='del'>-	for (i = 0; i &lt; n; i+= ifreq_size(*ifrp) ) {</div><div class='del'>-		ifrp = (struct ifreq *)((char *) ifc.ifc_buf+i);</div><div class='del'>-		strncpy(ifr.ifr_name, ifrp-&gt;ifr_name, IFNAMSIZ);</div><div class='del'>-#ifdef SIOCGIFHWADDR</div><div class='del'>-		if (ioctl(sd, SIOCGIFHWADDR, &amp;ifr) &lt; 0)</div><div class='del'>-			continue;</div><div class='del'>-		a = (unsigned char *) &amp;ifr.ifr_hwaddr.sa_data;</div><div class='del'>-#else</div><div class='del'>-#ifdef SIOCGENADDR</div><div class='del'>-		if (ioctl(sd, SIOCGENADDR, &amp;ifr) &lt; 0)</div><div class='del'>-			continue;</div><div class='del'>-		a = (unsigned char *) ifr.ifr_enaddr;</div><div class='del'>-#else</div><div class='del'>-#ifdef HAVE_NET_IF_DL_H</div><div class='del'>-		sdlp = (struct sockaddr_dl *) &amp;ifrp-&gt;ifr_addr;</div><div class='del'>-		if ((sdlp-&gt;sdl_family != AF_LINK) || (sdlp-&gt;sdl_alen != 6))</div><div class='del'>-			continue;</div><div class='del'>-		a = (unsigned char *) &amp;sdlp-&gt;sdl_data[sdlp-&gt;sdl_nlen];</div><div class='del'>-#else</div><div class='del'>-		/*</div><div class='del'>-		 * XXX we don't have a way of getting the hardware</div><div class='del'>-		 * address</div><div class='del'>-		 */</div><div class='del'>-		close(sd);</div><div class='del'>-		return 0;</div><div class='del'>-#endif /* HAVE_NET_IF_DL_H */</div><div class='del'>-#endif /* SIOCGENADDR */</div><div class='del'>-#endif /* SIOCGIFHWADDR */</div><div class='del'>-		if (!a[0] &amp;&amp; !a[1] &amp;&amp; !a[2] &amp;&amp; !a[3] &amp;&amp; !a[4] &amp;&amp; !a[5])</div><div class='del'>-			continue;</div><div class='del'>-		if (node_id) {</div><div class='del'>-			memcpy(node_id, a, 6);</div><div class='del'>-			close(sd);</div><div class='del'>-			return 1;</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='del'>-	close(sd);</div><div class='del'>-#endif</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-/* Assume that the gettimeofday() has microsecond granularity */</div><div class='del'>-#define MAX_ADJUSTMENT 10</div><div class='del'>-</div><div class='del'>-static int get_clock(uint32_t *clock_high, uint32_t *clock_low,</div><div class='del'>-		     uint16_t *ret_clock_seq, int *num)</div><div class='del'>-{</div><div class='del'>-	THREAD_LOCAL int		adjustment = 0;</div><div class='del'>-	THREAD_LOCAL struct timeval	last = {0, 0};</div><div class='del'>-	THREAD_LOCAL int		state_fd = -2;</div><div class='del'>-	THREAD_LOCAL FILE		*state_f;</div><div class='del'>-	THREAD_LOCAL uint16_t		clock_seq;</div><div class='del'>-	struct timeval 			tv;</div><div class='del'>-	struct flock			fl;</div><div class='del'>-	uint64_t			clock_reg;</div><div class='del'>-	mode_t				save_umask;</div><div class='del'>-	int				len;</div><div class='del'>-</div><div class='del'>-	if (state_fd == -2) {</div><div class='del'>-		save_umask = umask(0);</div><div class='del'>-		state_fd = open("/var/lib/libuuid/clock.txt",</div><div class='del'>-				O_RDWR|O_CREAT, 0660);</div><div class='del'>-		(void) umask(save_umask);</div><div class='del'>-		state_f = fdopen(state_fd, "r+");</div><div class='del'>-		if (!state_f) {</div><div class='del'>-			close(state_fd);</div><div class='del'>-			state_fd = -1;</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='del'>-	fl.l_type = F_WRLCK;</div><div class='del'>-	fl.l_whence = SEEK_SET;</div><div class='del'>-	fl.l_start = 0;</div><div class='del'>-	fl.l_len = 0;</div><div class='del'>-	fl.l_pid = 0;</div><div class='del'>-	if (state_fd &gt;= 0) {</div><div class='del'>-		rewind(state_f);</div><div class='del'>-		while (fcntl(state_fd, F_SETLKW, &amp;fl) &lt; 0) {</div><div class='del'>-			if ((errno == EAGAIN) || (errno == EINTR))</div><div class='del'>-				continue;</div><div class='del'>-			fclose(state_f);</div><div class='del'>-			close(state_fd);</div><div class='del'>-			state_fd = -1;</div><div class='del'>-			break;</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='del'>-	if (state_fd &gt;= 0) {</div><div class='del'>-		unsigned int cl;</div><div class='del'>-		unsigned long tv1, tv2;</div><div class='del'>-		int a;</div><div class='del'>-</div><div class='del'>-		if (fscanf(state_f, "clock: %04x tv: %lu %lu adj: %d\n",</div><div class='del'>-			   &amp;cl, &amp;tv1, &amp;tv2, &amp;a) == 4) {</div><div class='del'>-			clock_seq = cl &amp; 0x3FFF;</div><div class='del'>-			last.tv_sec = tv1;</div><div class='del'>-			last.tv_usec = tv2;</div><div class='del'>-			adjustment = a;</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	if ((last.tv_sec == 0) &amp;&amp; (last.tv_usec == 0)) {</div><div class='del'>-		get_random_bytes(&amp;clock_seq, sizeof(clock_seq));</div><div class='del'>-		clock_seq &amp;= 0x3FFF;</div><div class='del'>-		gettimeofday(&amp;last, 0);</div><div class='del'>-		last.tv_sec--;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-try_again:</div><div class='del'>-	gettimeofday(&amp;tv, 0);</div><div class='del'>-	if ((tv.tv_sec &lt; last.tv_sec) ||</div><div class='del'>-	    ((tv.tv_sec == last.tv_sec) &amp;&amp;</div><div class='del'>-	     (tv.tv_usec &lt; last.tv_usec))) {</div><div class='del'>-		clock_seq = (clock_seq+1) &amp; 0x3FFF;</div><div class='del'>-		adjustment = 0;</div><div class='del'>-		last = tv;</div><div class='del'>-	} else if ((tv.tv_sec == last.tv_sec) &amp;&amp;</div><div class='del'>-	    (tv.tv_usec == last.tv_usec)) {</div><div class='del'>-		if (adjustment &gt;= MAX_ADJUSTMENT)</div><div class='del'>-			goto try_again;</div><div class='del'>-		adjustment++;</div><div class='del'>-	} else {</div><div class='del'>-		adjustment = 0;</div><div class='del'>-		last = tv;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	clock_reg = tv.tv_usec*10 + adjustment;</div><div class='del'>-	clock_reg += ((uint64_t) tv.tv_sec)*10000000;</div><div class='del'>-	clock_reg += (((uint64_t) 0x01B21DD2) &lt;&lt; 32) + 0x13814000;</div><div class='del'>-</div><div class='del'>-	if (num &amp;&amp; (*num &gt; 1)) {</div><div class='del'>-		adjustment += *num - 1;</div><div class='del'>-		last.tv_usec += adjustment / 10;</div><div class='del'>-		adjustment = adjustment % 10;</div><div class='del'>-		last.tv_sec += last.tv_usec / 1000000;</div><div class='del'>-		last.tv_usec = last.tv_usec % 1000000;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	if (state_fd &gt; 0) {</div><div class='del'>-		rewind(state_f);</div><div class='del'>-		len = fprintf(state_f, </div><div class='del'>-			      "clock: %04x tv: %016lu %08lu adj: %08d\n",</div><div class='del'>-			      clock_seq, last.tv_sec, last.tv_usec, adjustment);</div><div class='del'>-		fflush(state_f);</div><div class='del'>-		if (ftruncate(state_fd, len) &lt; 0) {</div><div class='del'>-			fprintf(state_f, "                   \n");</div><div class='del'>-			fflush(state_f);</div><div class='del'>-		}</div><div class='del'>-		rewind(state_f);</div><div class='del'>-		fl.l_type = F_UNLCK;</div><div class='del'>-		fcntl(state_fd, F_SETLK, &amp;fl);</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	*clock_high = clock_reg &gt;&gt; 32;</div><div class='del'>-	*clock_low = clock_reg;</div><div class='del'>-	*ret_clock_seq = clock_seq;</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-#if defined(USE_UUIDD) &amp;&amp; defined(HAVE_SYS_UN_H)</div><div class='del'>-static ssize_t read_all(int fd, char *buf, size_t count)</div><div class='del'>-{</div><div class='del'>-	ssize_t ret;</div><div class='del'>-	ssize_t c = 0;</div><div class='del'>-	int tries = 0;</div><div class='del'>-</div><div class='del'>-	memset(buf, 0, count);</div><div class='del'>-	while (count &gt; 0) {</div><div class='del'>-		ret = read(fd, buf, count);</div><div class='del'>-		if (ret &lt;= 0) {</div><div class='del'>-			if ((errno == EAGAIN || errno == EINTR || ret == 0) &amp;&amp;</div><div class='del'>-			    (tries++ &lt; 5))</div><div class='del'>-				continue;</div><div class='del'>-			return c ? c : -1;</div><div class='del'>-		}</div><div class='del'>-		if (ret &gt; 0)</div><div class='del'>-			tries = 0;</div><div class='del'>-		count -= ret;</div><div class='del'>-		buf += ret;</div><div class='del'>-		c += ret;</div><div class='del'>-	}</div><div class='del'>-	return c;</div><div class='del'>-}</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-/*</div><div class='del'>- * Close all file descriptors</div><div class='del'>- */</div><div class='del'>-#if defined(USE_UUIDD) &amp;&amp; defined(HAVE_SYS_UN_H)</div><div class='del'>-static void close_all_fds(void)</div><div class='del'>-{</div><div class='del'>-	int i, max;</div><div class='del'>-</div><div class='del'>-#if defined(HAVE_SYSCONF) &amp;&amp; defined(_SC_OPEN_MAX)</div><div class='del'>-	max = sysconf(_SC_OPEN_MAX);</div><div class='del'>-#elif defined(HAVE_GETDTABLESIZE)</div><div class='del'>-	max = getdtablesize();</div><div class='del'>-#elif defined(HAVE_GETRLIMIT) &amp;&amp; defined(RLIMIT_NOFILE)</div><div class='del'>-	struct rlimit rl;</div><div class='del'>-</div><div class='del'>-	getrlimit(RLIMIT_NOFILE, &amp;rl);</div><div class='del'>-	max = rl.rlim_cur;</div><div class='del'>-#else</div><div class='del'>-	max = OPEN_MAX;</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-	for (i=0; i &lt; max; i++) {</div><div class='del'>-		close(i);</div><div class='del'>-		if (i &lt;= 2)</div><div class='del'>-			open("/dev/null", O_RDWR);</div><div class='del'>-	}</div><div class='del'>-}</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-/*</div><div class='del'>- * Try using the uuidd daemon to generate the UUID</div><div class='del'>- *</div><div class='del'>- * Returns 0 on success, non-zero on failure.</div><div class='del'>- */</div><div class='del'>-static int get_uuid_via_daemon(int op, uuid_t out, int *num)</div><div class='del'>-{</div><div class='del'>-#if defined(USE_UUIDD) &amp;&amp; defined(HAVE_SYS_UN_H)</div><div class='del'>-	char op_buf[64];</div><div class='del'>-	int op_len;</div><div class='del'>-	int s;</div><div class='del'>-	ssize_t ret;</div><div class='del'>-	int32_t reply_len = 0, expected = 16;</div><div class='del'>-	struct sockaddr_un srv_addr;</div><div class='del'>-	struct stat st;</div><div class='del'>-	pid_t pid;</div><div class='del'>-	static const char *uuidd_path = UUIDD_PATH;</div><div class='del'>-	static int access_ret = -2;</div><div class='del'>-	static int start_attempts = 0;</div><div class='del'>-</div><div class='del'>-	if ((s = socket(AF_UNIX, SOCK_STREAM, 0)) &lt; 0)</div><div class='del'>-		return -1;</div><div class='del'>-</div><div class='del'>-	srv_addr.sun_family = AF_UNIX;</div><div class='del'>-	strcpy(srv_addr.sun_path, UUIDD_SOCKET_PATH);</div><div class='del'>-</div><div class='del'>-	if (connect(s, (const struct sockaddr *) &amp;srv_addr,</div><div class='del'>-		    sizeof(struct sockaddr_un)) &lt; 0) {</div><div class='del'>-		if (access_ret == -2)</div><div class='del'>-			access_ret = access(uuidd_path, X_OK);</div><div class='del'>-		if (access_ret == 0)</div><div class='del'>-			access_ret = stat(uuidd_path, &amp;st);</div><div class='del'>-		if (access_ret == 0 &amp;&amp; (st.st_mode &amp; (S_ISUID | S_ISGID)) == 0)</div><div class='del'>-			access_ret = access(UUIDD_DIR, W_OK);</div><div class='del'>-		if (access_ret == 0 &amp;&amp; start_attempts++ &lt; 5) {</div><div class='del'>-			if ((pid = fork()) == 0) {</div><div class='del'>-				close_all_fds();</div><div class='del'>-				execl(uuidd_path, "uuidd", "-qT", "300",</div><div class='del'>-				      (char *) NULL);</div><div class='del'>-				exit(1);</div><div class='del'>-			}</div><div class='del'>-			(void) waitpid(pid, 0, 0);</div><div class='del'>-			if (connect(s, (const struct sockaddr *) &amp;srv_addr,</div><div class='del'>-				    sizeof(struct sockaddr_un)) &lt; 0)</div><div class='del'>-				goto fail;</div><div class='del'>-		} else</div><div class='del'>-			goto fail;</div><div class='del'>-	}</div><div class='del'>-	op_buf[0] = op;</div><div class='del'>-	op_len = 1;</div><div class='del'>-	if (op == UUIDD_OP_BULK_TIME_UUID) {</div><div class='del'>-		memcpy(op_buf+1, num, sizeof(*num));</div><div class='del'>-		op_len += sizeof(*num);</div><div class='del'>-		expected += sizeof(*num);</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	ret = write(s, op_buf, op_len);</div><div class='del'>-	if (ret &lt; 1)</div><div class='del'>-		goto fail;</div><div class='del'>-</div><div class='del'>-	ret = read_all(s, (char *) &amp;reply_len, sizeof(reply_len));</div><div class='del'>-	if (ret &lt; 0)</div><div class='del'>-		goto fail;</div><div class='del'>-</div><div class='del'>-	if (reply_len != expected)</div><div class='del'>-		goto fail;</div><div class='del'>-</div><div class='del'>-	ret = read_all(s, op_buf, reply_len);</div><div class='del'>-</div><div class='del'>-	if (op == UUIDD_OP_BULK_TIME_UUID)</div><div class='del'>-		memcpy(op_buf+16, num, sizeof(int));</div><div class='del'>-</div><div class='del'>-	memcpy(out, op_buf, 16);</div><div class='del'>-</div><div class='del'>-	close(s);</div><div class='del'>-	return ((ret == expected) ? 0 : -1);</div><div class='del'>-</div><div class='del'>-fail:</div><div class='del'>-	close(s);</div><div class='del'>-#endif</div><div class='del'>-	return -1;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-void uuid__generate_time(uuid_t out, int *num)</div><div class='del'>-{</div><div class='del'>-	static unsigned char node_id[6];</div><div class='del'>-	static int has_init = 0;</div><div class='del'>-	struct uuid uu;</div><div class='del'>-	uint32_t	clock_mid;</div><div class='del'>-</div><div class='del'>-	if (!has_init) {</div><div class='del'>-		if (get_node_id(node_id) &lt;= 0) {</div><div class='del'>-			get_random_bytes(node_id, 6);</div><div class='del'>-			/*</div><div class='del'>-			 * Set multicast bit, to prevent conflicts</div><div class='del'>-			 * with IEEE 802 addresses obtained from</div><div class='del'>-			 * network cards</div><div class='del'>-			 */</div><div class='del'>-			node_id[0] |= 0x01;</div><div class='del'>-		}</div><div class='del'>-		has_init = 1;</div><div class='del'>-	}</div><div class='del'>-	get_clock(&amp;clock_mid, &amp;uu.time_low, &amp;uu.clock_seq, num);</div><div class='del'>-	uu.clock_seq |= 0x8000;</div><div class='del'>-	uu.time_mid = (uint16_t) clock_mid;</div><div class='del'>-	uu.time_hi_and_version = ((clock_mid &gt;&gt; 16) &amp; 0x0FFF) | 0x1000;</div><div class='del'>-	memcpy(uu.node, node_id, 6);</div><div class='del'>-	uuid_pack(&amp;uu, out);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-void uuid_generate_time(uuid_t out)</div><div class='del'>-{</div><div class='del'>-#ifdef TLS</div><div class='del'>-	THREAD_LOCAL int		num = 0;</div><div class='del'>-	THREAD_LOCAL struct uuid	uu;</div><div class='del'>-	THREAD_LOCAL time_t		last_time = 0;</div><div class='del'>-	time_t				now;</div><div class='del'>-</div><div class='del'>-	if (num &gt; 0) {</div><div class='del'>-		now = time(0);</div><div class='del'>-		if (now &gt; last_time+1)</div><div class='del'>-			num = 0;</div><div class='del'>-	}</div><div class='del'>-	if (num &lt;= 0) {</div><div class='del'>-		num = 1000;</div><div class='del'>-		if (get_uuid_via_daemon(UUIDD_OP_BULK_TIME_UUID,</div><div class='del'>-					out, &amp;num) == 0) {</div><div class='del'>-			last_time = time(0);</div><div class='del'>-			uuid_unpack(out, &amp;uu);</div><div class='del'>-			num--;</div><div class='del'>-			return;</div><div class='del'>-		}</div><div class='del'>-		num = 0;</div><div class='del'>-	}</div><div class='del'>-	if (num &gt; 0) {</div><div class='del'>-		uu.time_low++;</div><div class='del'>-		if (uu.time_low == 0) {</div><div class='del'>-			uu.time_mid++;</div><div class='del'>-			if (uu.time_mid == 0)</div><div class='del'>-				uu.time_hi_and_version++;</div><div class='del'>-		}</div><div class='del'>-		num--;</div><div class='del'>-		uuid_pack(&amp;uu, out);</div><div class='del'>-		return;</div><div class='del'>-	}</div><div class='del'>-#else</div><div class='del'>-	if (get_uuid_via_daemon(UUIDD_OP_TIME_UUID, out, 0) == 0)</div><div class='del'>-		return;</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-	uuid__generate_time(out, 0);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-void uuid__generate_random(uuid_t out, int *num)</div><div class='del'>-{</div><div class='del'>-	uuid_t	buf;</div><div class='del'>-	struct uuid uu;</div><div class='del'>-	int i, n;</div><div class='del'>-</div><div class='del'>-	if (!num || !*num)</div><div class='del'>-		n = 1;</div><div class='del'>-	else</div><div class='del'>-		n = *num;</div><div class='del'>-</div><div class='del'>-	for (i = 0; i &lt; n; i++) {</div><div class='del'>-		get_random_bytes(buf, sizeof(buf));</div><div class='del'>-		uuid_unpack(buf, &amp;uu);</div><div class='del'>-</div><div class='del'>-		uu.clock_seq = (uu.clock_seq &amp; 0x3FFF) | 0x8000;</div><div class='del'>-		uu.time_hi_and_version = (uu.time_hi_and_version &amp; 0x0FFF)</div><div class='del'>-			| 0x4000;</div><div class='del'>-		uuid_pack(&amp;uu, out);</div><div class='del'>-		out += sizeof(uuid_t);</div><div class='del'>-	}</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-void uuid_generate_random(uuid_t out)</div><div class='del'>-{</div><div class='del'>-	int	num = 1;</div><div class='del'>-	/* No real reason to use the daemon for random uuid's -- yet */</div><div class='del'>-</div><div class='del'>-	uuid__generate_random(out, &amp;num);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-/*</div><div class='del'>- * This is the generic front-end to uuid_generate_random and</div><div class='del'>- * uuid_generate_time.  It uses uuid_generate_random only if</div><div class='del'>- * /dev/urandom is available, since otherwise we won't have</div><div class='del'>- * high-quality randomness.</div><div class='del'>- */</div><div class='del'>-void uuid_generate(uuid_t out)</div><div class='del'>-{</div><div class='del'>-	if (get_random_fd() &gt;= 0)</div><div class='del'>-		uuid_generate_random(out);</div><div class='del'>-	else</div><div class='del'>-		uuid_generate_time(out);</div><div class='del'>-}</div><div class='head'>diff --git a/contrib/uuid/gen_uuid_nt.c b/contrib/uuid/gen_uuid_nt.c<br/>deleted file mode 100644<br/>index aa44bfd3d7d..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/contrib/uuid/gen_uuid_nt.c?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>contrib/uuid/gen_uuid_nt.c</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,92 +0,0 @@</div><div class='del'>-/*</div><div class='del'>- * gen_uuid_nt.c -- Use NT api to generate uuid</div><div class='del'>- *</div><div class='del'>- * Written by Andrey Shedel (andreys@ns.cr.cyco.com)</div><div class='del'>- */</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-#include "uuidP.h"</div><div class='del'>-</div><div class='del'>-#pragma warning(push,4)</div><div class='del'>-</div><div class='del'>-#pragma comment(lib, "ntdll.lib")</div><div class='del'>-</div><div class='del'>-//</div><div class='del'>-// Here is a nice example why it's not a good idea</div><div class='del'>-// to use native API in ordinary applications.</div><div class='del'>-// Number of parameters in function below was changed from 3 to 4</div><div class='del'>-// for NT5.</div><div class='del'>-//</div><div class='del'>-//</div><div class='del'>-// NTSYSAPI</div><div class='del'>-// NTSTATUS</div><div class='del'>-// NTAPI</div><div class='del'>-// NtAllocateUuids(</div><div class='del'>-//     OUT PULONG p1,</div><div class='del'>-//     OUT PULONG p2,</div><div class='del'>-//     OUT PULONG p3,</div><div class='del'>-//     OUT PUCHAR Seed // 6 bytes</div><div class='del'>-//   );</div><div class='del'>-//</div><div class='del'>-//</div><div class='del'>-</div><div class='del'>-unsigned long</div><div class='del'>-__stdcall</div><div class='del'>-NtAllocateUuids(</div><div class='del'>-   void* p1,  // 8 bytes</div><div class='del'>-   void* p2,  // 4 bytes</div><div class='del'>-   void* p3   // 4 bytes</div><div class='del'>-   );</div><div class='del'>-</div><div class='del'>-typedef</div><div class='del'>-unsigned long</div><div class='del'>-(__stdcall*</div><div class='del'>-NtAllocateUuids_2000)(</div><div class='del'>-   void* p1,  // 8 bytes</div><div class='del'>-   void* p2,  // 4 bytes</div><div class='del'>-   void* p3,  // 4 bytes</div><div class='del'>-   void* seed // 6 bytes</div><div class='del'>-   );</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-//</div><div class='del'>-// Nice, but instead of including ntddk.h ot winnt.h</div><div class='del'>-// I should define it here because they MISSED __stdcall in those headers.</div><div class='del'>-//</div><div class='del'>-</div><div class='del'>-__declspec(dllimport)</div><div class='del'>-struct _TEB*</div><div class='del'>-__stdcall</div><div class='del'>-NtCurrentTeb(void);</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-//</div><div class='del'>-// The only way to get version information from the system is to examine</div><div class='del'>-// one stored in PEB. But it's pretty dangerouse because this value could</div><div class='del'>-// be altered in image header.</div><div class='del'>-//</div><div class='del'>-</div><div class='del'>-static</div><div class='del'>-int</div><div class='del'>-Nt5(void)</div><div class='del'>-{</div><div class='del'>-	//return NtCuttentTeb()-&gt;Peb-&gt;OSMajorVersion &gt;= 5;</div><div class='del'>-	return (int)*(int*)((char*)(int)(*(int*)((char*)NtCurrentTeb() + 0x30)) + 0xA4) &gt;= 5;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-void uuid_generate(uuid_t out)</div><div class='del'>-{</div><div class='del'>-	if(Nt5())</div><div class='del'>-	{</div><div class='del'>-		unsigned char seed[6];</div><div class='del'>-		((NtAllocateUuids_2000)NtAllocateUuids)(out, ((char*)out)+8, ((char*)out)+12, &amp;seed[0] );</div><div class='del'>-	}</div><div class='del'>-	else</div><div class='del'>-	{</div><div class='del'>-		NtAllocateUuids(out, ((char*)out)+8, ((char*)out)+12);</div><div class='del'>-	}</div><div class='del'>-}</div><div class='head'>diff --git a/contrib/uuid/isnull.c b/contrib/uuid/isnull.c<br/>deleted file mode 100644<br/>index 931e7e7dba2..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/contrib/uuid/isnull.c?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>contrib/uuid/isnull.c</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,48 +0,0 @@</div><div class='del'>-/*</div><div class='del'>- * isnull.c --- Check whether or not the UUID is null</div><div class='del'>- *</div><div class='del'>- * Copyright (C) 1996, 1997 Theodore Ts'o.</div><div class='del'>- *</div><div class='del'>- * %Begin-Header%</div><div class='del'>- * Redistribution and use in source and binary forms, with or without</div><div class='del'>- * modification, are permitted provided that the following conditions</div><div class='del'>- * are met:</div><div class='del'>- * 1. Redistributions of source code must retain the above copyright</div><div class='del'>- *    notice, and the entire permission notice in its entirety,</div><div class='del'>- *    including the disclaimer of warranties.</div><div class='del'>- * 2. Redistributions in binary form must reproduce the above copyright</div><div class='del'>- *    notice, this list of conditions and the following disclaimer in the</div><div class='del'>- *    documentation and/or other materials provided with the distribution.</div><div class='del'>- * 3. The name of the author may not be used to endorse or promote</div><div class='del'>- *    products derived from this software without specific prior</div><div class='del'>- *    written permission.</div><div class='del'>- *</div><div class='del'>- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED</div><div class='del'>- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES</div><div class='del'>- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ALL OF</div><div class='del'>- * WHICH ARE HEREBY DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE</div><div class='del'>- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR</div><div class='del'>- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT</div><div class='del'>- * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR</div><div class='del'>- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF</div><div class='del'>- * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT</div><div class='del'>- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE</div><div class='del'>- * USE OF THIS SOFTWARE, EVEN IF NOT ADVISED OF THE POSSIBILITY OF SUCH</div><div class='del'>- * DAMAGE.</div><div class='del'>- * %End-Header%</div><div class='del'>- */</div><div class='del'>-</div><div class='del'>-#include "uuidP.h"</div><div class='del'>-</div><div class='del'>-/* Returns 1 if the uuid is the NULL uuid */</div><div class='del'>-int uuid_is_null(const uuid_t uu)</div><div class='del'>-{</div><div class='del'>-	const unsigned char 	*cp;</div><div class='del'>-	int			i;</div><div class='del'>-</div><div class='del'>-	for (i=0, cp = uu; i &lt; 16; i++)</div><div class='del'>-		if (*cp++)</div><div class='del'>-			return 0;</div><div class='del'>-	return 1;</div><div class='del'>-}</div><div class='del'>-</div><div class='head'>diff --git a/contrib/uuid/pack.c b/contrib/uuid/pack.c<br/>deleted file mode 100644<br/>index 097516d2e2f..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/contrib/uuid/pack.c?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>contrib/uuid/pack.c</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,69 +0,0 @@</div><div class='del'>-/*</div><div class='del'>- * Internal routine for packing UUID's</div><div class='del'>- *</div><div class='del'>- * Copyright (C) 1996, 1997 Theodore Ts'o.</div><div class='del'>- *</div><div class='del'>- * %Begin-Header%</div><div class='del'>- * Redistribution and use in source and binary forms, with or without</div><div class='del'>- * modification, are permitted provided that the following conditions</div><div class='del'>- * are met:</div><div class='del'>- * 1. Redistributions of source code must retain the above copyright</div><div class='del'>- *    notice, and the entire permission notice in its entirety,</div><div class='del'>- *    including the disclaimer of warranties.</div><div class='del'>- * 2. Redistributions in binary form must reproduce the above copyright</div><div class='del'>- *    notice, this list of conditions and the following disclaimer in the</div><div class='del'>- *    documentation and/or other materials provided with the distribution.</div><div class='del'>- * 3. The name of the author may not be used to endorse or promote</div><div class='del'>- *    products derived from this software without specific prior</div><div class='del'>- *    written permission.</div><div class='del'>- *</div><div class='del'>- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED</div><div class='del'>- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES</div><div class='del'>- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ALL OF</div><div class='del'>- * WHICH ARE HEREBY DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE</div><div class='del'>- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR</div><div class='del'>- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT</div><div class='del'>- * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR</div><div class='del'>- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF</div><div class='del'>- * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT</div><div class='del'>- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE</div><div class='del'>- * USE OF THIS SOFTWARE, EVEN IF NOT ADVISED OF THE POSSIBILITY OF SUCH</div><div class='del'>- * DAMAGE.</div><div class='del'>- * %End-Header%</div><div class='del'>- */</div><div class='del'>-</div><div class='del'>-#include &lt;string.h&gt;</div><div class='del'>-#include "uuidP.h"</div><div class='del'>-</div><div class='del'>-void uuid_pack(const struct uuid *uu, uuid_t ptr)</div><div class='del'>-{</div><div class='del'>-	uint32_t	tmp;</div><div class='del'>-	unsigned char	*out = ptr;</div><div class='del'>-</div><div class='del'>-	tmp = uu-&gt;time_low;</div><div class='del'>-	out[3] = (unsigned char) tmp;</div><div class='del'>-	tmp &gt;&gt;= 8;</div><div class='del'>-	out[2] = (unsigned char) tmp;</div><div class='del'>-	tmp &gt;&gt;= 8;</div><div class='del'>-	out[1] = (unsigned char) tmp;</div><div class='del'>-	tmp &gt;&gt;= 8;</div><div class='del'>-	out[0] = (unsigned char) tmp;</div><div class='del'>-</div><div class='del'>-	tmp = uu-&gt;time_mid;</div><div class='del'>-	out[5] = (unsigned char) tmp;</div><div class='del'>-	tmp &gt;&gt;= 8;</div><div class='del'>-	out[4] = (unsigned char) tmp;</div><div class='del'>-</div><div class='del'>-	tmp = uu-&gt;time_hi_and_version;</div><div class='del'>-	out[7] = (unsigned char) tmp;</div><div class='del'>-	tmp &gt;&gt;= 8;</div><div class='del'>-	out[6] = (unsigned char) tmp;</div><div class='del'>-</div><div class='del'>-	tmp = uu-&gt;clock_seq;</div><div class='del'>-	out[9] = (unsigned char) tmp;</div><div class='del'>-	tmp &gt;&gt;= 8;</div><div class='del'>-	out[8] = (unsigned char) tmp;</div><div class='del'>-</div><div class='del'>-	memcpy(out+10, uu-&gt;node, 6);</div><div class='del'>-}</div><div class='del'>-</div><div class='head'>diff --git a/contrib/uuid/parse.c b/contrib/uuid/parse.c<br/>deleted file mode 100644<br/>index 074383efae7..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/contrib/uuid/parse.c?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>contrib/uuid/parse.c</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,79 +0,0 @@</div><div class='del'>-/*</div><div class='del'>- * parse.c --- UUID parsing</div><div class='del'>- *</div><div class='del'>- * Copyright (C) 1996, 1997 Theodore Ts'o.</div><div class='del'>- *</div><div class='del'>- * %Begin-Header%</div><div class='del'>- * Redistribution and use in source and binary forms, with or without</div><div class='del'>- * modification, are permitted provided that the following conditions</div><div class='del'>- * are met:</div><div class='del'>- * 1. Redistributions of source code must retain the above copyright</div><div class='del'>- *    notice, and the entire permission notice in its entirety,</div><div class='del'>- *    including the disclaimer of warranties.</div><div class='del'>- * 2. Redistributions in binary form must reproduce the above copyright</div><div class='del'>- *    notice, this list of conditions and the following disclaimer in the</div><div class='del'>- *    documentation and/or other materials provided with the distribution.</div><div class='del'>- * 3. The name of the author may not be used to endorse or promote</div><div class='del'>- *    products derived from this software without specific prior</div><div class='del'>- *    written permission.</div><div class='del'>- *</div><div class='del'>- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED</div><div class='del'>- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES</div><div class='del'>- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ALL OF</div><div class='del'>- * WHICH ARE HEREBY DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE</div><div class='del'>- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR</div><div class='del'>- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT</div><div class='del'>- * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR</div><div class='del'>- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF</div><div class='del'>- * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT</div><div class='del'>- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE</div><div class='del'>- * USE OF THIS SOFTWARE, EVEN IF NOT ADVISED OF THE POSSIBILITY OF SUCH</div><div class='del'>- * DAMAGE.</div><div class='del'>- * %End-Header%</div><div class='del'>- */</div><div class='del'>-</div><div class='del'>-#include &lt;stdlib.h&gt;</div><div class='del'>-#include &lt;stdio.h&gt;</div><div class='del'>-#include &lt;ctype.h&gt;</div><div class='del'>-#include &lt;string.h&gt;</div><div class='del'>-</div><div class='del'>-#include "uuidP.h"</div><div class='del'>-</div><div class='del'>-int uuid_parse(const char *in, uuid_t uu)</div><div class='del'>-{</div><div class='del'>-	struct uuid	uuid;</div><div class='del'>-	int 		i;</div><div class='del'>-	const char	*cp;</div><div class='del'>-	char		buf[3];</div><div class='del'>-</div><div class='del'>-	if (strlen(in) != 36)</div><div class='del'>-		return -1;</div><div class='del'>-	for (i=0, cp = in; i &lt;= 36; i++,cp++) {</div><div class='del'>-		if ((i == 8) || (i == 13) || (i == 18) ||</div><div class='del'>-		    (i == 23)) {</div><div class='del'>-			if (*cp == '-')</div><div class='del'>-				continue;</div><div class='del'>-			else</div><div class='del'>-				return -1;</div><div class='del'>-		}</div><div class='del'>-		if (i== 36)</div><div class='del'>-			if (*cp == 0)</div><div class='del'>-				continue;</div><div class='del'>-		if (!isxdigit(*cp))</div><div class='del'>-			return -1;</div><div class='del'>-	}</div><div class='del'>-	uuid.time_low = strtoul(in, NULL, 16);</div><div class='del'>-	uuid.time_mid = strtoul(in+9, NULL, 16);</div><div class='del'>-	uuid.time_hi_and_version = strtoul(in+14, NULL, 16);</div><div class='del'>-	uuid.clock_seq = strtoul(in+19, NULL, 16);</div><div class='del'>-	cp = in+24;</div><div class='del'>-	buf[2] = 0;</div><div class='del'>-	for (i=0; i &lt; 6; i++) {</div><div class='del'>-		buf[0] = *cp++;</div><div class='del'>-		buf[1] = *cp++;</div><div class='del'>-		uuid.node[i] = strtoul(buf, NULL, 16);</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	uuid_pack(&amp;uuid, uu);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='head'>diff --git a/contrib/uuid/tst_uuid.c b/contrib/uuid/tst_uuid.c<br/>deleted file mode 100644<br/>index e03138f7d18..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/contrib/uuid/tst_uuid.c?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>contrib/uuid/tst_uuid.c</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,180 +0,0 @@</div><div class='del'>-/*</div><div class='del'>- * tst_uuid.c --- test program from the UUID library</div><div class='del'>- *</div><div class='del'>- * Copyright (C) 1996, 1997, 1998 Theodore Ts'o.</div><div class='del'>- *</div><div class='del'>- * %Begin-Header%</div><div class='del'>- * Redistribution and use in source and binary forms, with or without</div><div class='del'>- * modification, are permitted provided that the following conditions</div><div class='del'>- * are met:</div><div class='del'>- * 1. Redistributions of source code must retain the above copyright</div><div class='del'>- *    notice, and the entire permission notice in its entirety,</div><div class='del'>- *    including the disclaimer of warranties.</div><div class='del'>- * 2. Redistributions in binary form must reproduce the above copyright</div><div class='del'>- *    notice, this list of conditions and the following disclaimer in the</div><div class='del'>- *    documentation and/or other materials provided with the distribution.</div><div class='del'>- * 3. The name of the author may not be used to endorse or promote</div><div class='del'>- *    products derived from this software without specific prior</div><div class='del'>- *    written permission.</div><div class='del'>- *</div><div class='del'>- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED</div><div class='del'>- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES</div><div class='del'>- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ALL OF</div><div class='del'>- * WHICH ARE HEREBY DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE</div><div class='del'>- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR</div><div class='del'>- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT</div><div class='del'>- * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR</div><div class='del'>- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF</div><div class='del'>- * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT</div><div class='del'>- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE</div><div class='del'>- * USE OF THIS SOFTWARE, EVEN IF NOT ADVISED OF THE POSSIBILITY OF SUCH</div><div class='del'>- * DAMAGE.</div><div class='del'>- * %End-Header%</div><div class='del'>- */</div><div class='del'>-</div><div class='del'>-#ifdef _WIN32</div><div class='del'>-#define _WIN32_WINNT 0x0500</div><div class='del'>-#include &lt;windows.h&gt;</div><div class='del'>-#define UUID MYUUID</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-#include &lt;stdio.h&gt;</div><div class='del'>-#include &lt;stdlib.h&gt;</div><div class='del'>-</div><div class='del'>-#include "uuid.h"</div><div class='del'>-</div><div class='del'>-static int test_uuid(const char * uuid, int isValid)</div><div class='del'>-{</div><div class='del'>-	static const char * validStr[2] = {"invalid", "valid"};</div><div class='del'>-	uuid_t uuidBits;</div><div class='del'>-	int parsedOk;</div><div class='del'>-</div><div class='del'>-	parsedOk = uuid_parse(uuid, uuidBits) == 0;</div><div class='del'>-</div><div class='del'>-	printf("%s is %s", uuid, validStr[isValid]);</div><div class='del'>-	if (parsedOk != isValid) {</div><div class='del'>-		printf(" but uuid_parse says %s\n", validStr[parsedOk]);</div><div class='del'>-		return 1;</div><div class='del'>-	}</div><div class='del'>-	printf(", OK\n");</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-#ifdef __GNUC__</div><div class='del'>-#define ATTR(x) __attribute__(x)</div><div class='del'>-#else</div><div class='del'>-#define ATTR(x)</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-main(int argc ATTR((unused)) , char **argv ATTR((unused)))</div><div class='del'>-{</div><div class='del'>-	uuid_t		buf, tst;</div><div class='del'>-	char		str[100];</div><div class='del'>-	struct timeval	tv;</div><div class='del'>-	time_t		time_reg;</div><div class='del'>-	unsigned char	*cp;</div><div class='del'>-	int i;</div><div class='del'>-	int failed = 0;</div><div class='del'>-	int type, variant;</div><div class='del'>-</div><div class='del'>-	uuid_generate(buf);</div><div class='del'>-	uuid_unparse(buf, str);</div><div class='del'>-	printf("UUID generate = %s\n", str);</div><div class='del'>-	printf("UUID: ");</div><div class='del'>-	for (i=0, cp = (unsigned char *) &amp;buf; i &lt; 16; i++) {</div><div class='del'>-		printf("%02x", *cp++);</div><div class='del'>-	}</div><div class='del'>-	printf("\n");</div><div class='del'>-	type = uuid_type(buf); 	variant = uuid_variant(buf);</div><div class='del'>-	printf("UUID type = %d, UUID variant = %d\n", type, variant);</div><div class='del'>-	if (variant != UUID_VARIANT_DCE) {</div><div class='del'>-		printf("Incorrect UUID Variant; was expecting DCE!\n");</div><div class='del'>-		failed++;</div><div class='del'>-	}</div><div class='del'>-	printf("\n");</div><div class='del'>-</div><div class='del'>-	uuid_generate_random(buf);</div><div class='del'>-	uuid_unparse(buf, str);</div><div class='del'>-	printf("UUID random string = %s\n", str);</div><div class='del'>-	printf("UUID: ");</div><div class='del'>-	for (i=0, cp = (unsigned char *) &amp;buf; i &lt; 16; i++) {</div><div class='del'>-		printf("%02x", *cp++);</div><div class='del'>-	}</div><div class='del'>-	printf("\n");</div><div class='del'>-	type = uuid_type(buf); 	variant = uuid_variant(buf);</div><div class='del'>-	printf("UUID type = %d, UUID variant = %d\n", type, variant);</div><div class='del'>-	if (variant != UUID_VARIANT_DCE) {</div><div class='del'>-		printf("Incorrect UUID Variant; was expecting DCE!\n");</div><div class='del'>-		failed++;</div><div class='del'>-	}</div><div class='del'>-	if (type != 4) {</div><div class='del'>-		printf("Incorrect UUID type; was expecting "</div><div class='del'>-		       "4 (random type)!\n");</div><div class='del'>-		failed++;</div><div class='del'>-	}</div><div class='del'>-	printf("\n");</div><div class='del'>-</div><div class='del'>-	uuid_generate_time(buf);</div><div class='del'>-	uuid_unparse(buf, str);</div><div class='del'>-	printf("UUID string = %s\n", str);</div><div class='del'>-	printf("UUID time: ");</div><div class='del'>-	for (i=0, cp = (unsigned char *) &amp;buf; i &lt; 16; i++) {</div><div class='del'>-		printf("%02x", *cp++);</div><div class='del'>-	}</div><div class='del'>-	printf("\n");</div><div class='del'>-	type = uuid_type(buf); 	variant = uuid_variant(buf);</div><div class='del'>-	printf("UUID type = %d, UUID variant = %d\n", type, variant);</div><div class='del'>-	if (variant != UUID_VARIANT_DCE) {</div><div class='del'>-		printf("Incorrect UUID Variant; was expecting DCE!\n");</div><div class='del'>-		failed++;</div><div class='del'>-	}</div><div class='del'>-	if (type != 1) {</div><div class='del'>-		printf("Incorrect UUID type; was expecting "</div><div class='del'>-		       "1 (time-based type)!\\n");</div><div class='del'>-		failed++;</div><div class='del'>-	}</div><div class='del'>-	tv.tv_sec = 0;</div><div class='del'>-	tv.tv_usec = 0;</div><div class='del'>-	time_reg = uuid_time(buf, &amp;tv);</div><div class='del'>-	printf("UUID time is: (%ld, %ld): %s\n", tv.tv_sec, tv.tv_usec,</div><div class='del'>-	       ctime(&amp;time_reg));</div><div class='del'>-	uuid_parse(str, tst);</div><div class='del'>-	if (!uuid_compare(buf, tst))</div><div class='del'>-		printf("UUID parse and compare succeeded.\n");</div><div class='del'>-	else {</div><div class='del'>-		printf("UUID parse and compare failed!\n");</div><div class='del'>-		failed++;</div><div class='del'>-	}</div><div class='del'>-	uuid_clear(tst);</div><div class='del'>-	if (uuid_is_null(tst))</div><div class='del'>-		printf("UUID clear and is null succeeded.\n");</div><div class='del'>-	else {</div><div class='del'>-		printf("UUID clear and is null failed!\n");</div><div class='del'>-		failed++;</div><div class='del'>-	}</div><div class='del'>-	uuid_copy(buf, tst);</div><div class='del'>-	if (!uuid_compare(buf, tst))</div><div class='del'>-		printf("UUID copy and compare succeeded.\n");</div><div class='del'>-	else {</div><div class='del'>-		printf("UUID copy and compare failed!\n");</div><div class='del'>-		failed++;</div><div class='del'>-	}</div><div class='del'>-	failed += test_uuid("84949cc5-4701-4a84-895b-354c584a981b", 1);</div><div class='del'>-	failed += test_uuid("84949CC5-4701-4A84-895B-354C584A981B", 1);</div><div class='del'>-	failed += test_uuid("84949cc5-4701-4a84-895b-354c584a981bc", 0);</div><div class='del'>-	failed += test_uuid("84949cc5-4701-4a84-895b-354c584a981", 0);</div><div class='del'>-	failed += test_uuid("84949cc5x4701-4a84-895b-354c584a981b", 0);</div><div class='del'>-	failed += test_uuid("84949cc504701-4a84-895b-354c584a981b", 0);</div><div class='del'>-	failed += test_uuid("84949cc5-470104a84-895b-354c584a981b", 0);</div><div class='del'>-	failed += test_uuid("84949cc5-4701-4a840895b-354c584a981b", 0);</div><div class='del'>-	failed += test_uuid("84949cc5-4701-4a84-895b0354c584a981b", 0);</div><div class='del'>-	failed += test_uuid("g4949cc5-4701-4a84-895b-354c584a981b", 0);</div><div class='del'>-	failed += test_uuid("84949cc5-4701-4a84-895b-354c584a981g", 0);</div><div class='del'>-</div><div class='del'>-	if (failed) {</div><div class='del'>-		printf("%d failures.\n", failed);</div><div class='del'>-		exit(1);</div><div class='del'>-	}</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='head'>diff --git a/contrib/uuid/unpack.c b/contrib/uuid/unpack.c<br/>deleted file mode 100644<br/>index beaaff3ca8a..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/contrib/uuid/unpack.c?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>contrib/uuid/unpack.c</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,63 +0,0 @@</div><div class='del'>-/*</div><div class='del'>- * Internal routine for unpacking UUID</div><div class='del'>- *</div><div class='del'>- * Copyright (C) 1996, 1997 Theodore Ts'o.</div><div class='del'>- *</div><div class='del'>- * %Begin-Header%</div><div class='del'>- * Redistribution and use in source and binary forms, with or without</div><div class='del'>- * modification, are permitted provided that the following conditions</div><div class='del'>- * are met:</div><div class='del'>- * 1. Redistributions of source code must retain the above copyright</div><div class='del'>- *    notice, and the entire permission notice in its entirety,</div><div class='del'>- *    including the disclaimer of warranties.</div><div class='del'>- * 2. Redistributions in binary form must reproduce the above copyright</div><div class='del'>- *    notice, this list of conditions and the following disclaimer in the</div><div class='del'>- *    documentation and/or other materials provided with the distribution.</div><div class='del'>- * 3. The name of the author may not be used to endorse or promote</div><div class='del'>- *    products derived from this software without specific prior</div><div class='del'>- *    written permission.</div><div class='del'>- *</div><div class='del'>- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED</div><div class='del'>- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES</div><div class='del'>- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ALL OF</div><div class='del'>- * WHICH ARE HEREBY DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE</div><div class='del'>- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR</div><div class='del'>- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT</div><div class='del'>- * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR</div><div class='del'>- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF</div><div class='del'>- * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT</div><div class='del'>- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE</div><div class='del'>- * USE OF THIS SOFTWARE, EVEN IF NOT ADVISED OF THE POSSIBILITY OF SUCH</div><div class='del'>- * DAMAGE.</div><div class='del'>- * %End-Header%</div><div class='del'>- */</div><div class='del'>-</div><div class='del'>-#include &lt;string.h&gt;</div><div class='del'>-#include "uuidP.h"</div><div class='del'>-</div><div class='del'>-void uuid_unpack(const uuid_t in, struct uuid *uu)</div><div class='del'>-{</div><div class='del'>-	const uint8_t	*ptr = in;</div><div class='del'>-	uint32_t		tmp;</div><div class='del'>-</div><div class='del'>-	tmp = *ptr++;</div><div class='del'>-	tmp = (tmp &lt;&lt; 8) | *ptr++;</div><div class='del'>-	tmp = (tmp &lt;&lt; 8) | *ptr++;</div><div class='del'>-	tmp = (tmp &lt;&lt; 8) | *ptr++;</div><div class='del'>-	uu-&gt;time_low = tmp;</div><div class='del'>-</div><div class='del'>-	tmp = *ptr++;</div><div class='del'>-	tmp = (tmp &lt;&lt; 8) | *ptr++;</div><div class='del'>-	uu-&gt;time_mid = tmp;</div><div class='del'>-</div><div class='del'>-	tmp = *ptr++;</div><div class='del'>-	tmp = (tmp &lt;&lt; 8) | *ptr++;</div><div class='del'>-	uu-&gt;time_hi_and_version = tmp;</div><div class='del'>-</div><div class='del'>-	tmp = *ptr++;</div><div class='del'>-	tmp = (tmp &lt;&lt; 8) | *ptr++;</div><div class='del'>-	uu-&gt;clock_seq = tmp;</div><div class='del'>-</div><div class='del'>-	memcpy(uu-&gt;node, ptr, 6);</div><div class='del'>-}</div><div class='del'>-</div><div class='head'>diff --git a/contrib/uuid/unparse.c b/contrib/uuid/unparse.c<br/>deleted file mode 100644<br/>index a95bbb04258..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/contrib/uuid/unparse.c?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>contrib/uuid/unparse.c</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,76 +0,0 @@</div><div class='del'>-/*</div><div class='del'>- * unparse.c -- convert a UUID to string</div><div class='del'>- *</div><div class='del'>- * Copyright (C) 1996, 1997 Theodore Ts'o.</div><div class='del'>- *</div><div class='del'>- * %Begin-Header%</div><div class='del'>- * Redistribution and use in source and binary forms, with or without</div><div class='del'>- * modification, are permitted provided that the following conditions</div><div class='del'>- * are met:</div><div class='del'>- * 1. Redistributions of source code must retain the above copyright</div><div class='del'>- *    notice, and the entire permission notice in its entirety,</div><div class='del'>- *    including the disclaimer of warranties.</div><div class='del'>- * 2. Redistributions in binary form must reproduce the above copyright</div><div class='del'>- *    notice, this list of conditions and the following disclaimer in the</div><div class='del'>- *    documentation and/or other materials provided with the distribution.</div><div class='del'>- * 3. The name of the author may not be used to endorse or promote</div><div class='del'>- *    products derived from this software without specific prior</div><div class='del'>- *    written permission.</div><div class='del'>- *</div><div class='del'>- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED</div><div class='del'>- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES</div><div class='del'>- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ALL OF</div><div class='del'>- * WHICH ARE HEREBY DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE</div><div class='del'>- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR</div><div class='del'>- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT</div><div class='del'>- * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR</div><div class='del'>- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF</div><div class='del'>- * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT</div><div class='del'>- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE</div><div class='del'>- * USE OF THIS SOFTWARE, EVEN IF NOT ADVISED OF THE POSSIBILITY OF SUCH</div><div class='del'>- * DAMAGE.</div><div class='del'>- * %End-Header%</div><div class='del'>- */</div><div class='del'>-</div><div class='del'>-#include &lt;stdio.h&gt;</div><div class='del'>-</div><div class='del'>-#include "uuidP.h"</div><div class='del'>-</div><div class='del'>-static const char *fmt_lower =</div><div class='del'>-	"%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x";</div><div class='del'>-</div><div class='del'>-static const char *fmt_upper =</div><div class='del'>-	"%08X-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X";</div><div class='del'>-</div><div class='del'>-#ifdef UUID_UNPARSE_DEFAULT_UPPER</div><div class='del'>-#define FMT_DEFAULT fmt_upper</div><div class='del'>-#else</div><div class='del'>-#define FMT_DEFAULT fmt_lower</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-static void uuid_unparse_x(const uuid_t uu, char *out, const char *fmt)</div><div class='del'>-{</div><div class='del'>-	struct uuid uuid;</div><div class='del'>-</div><div class='del'>-	uuid_unpack(uu, &amp;uuid);</div><div class='del'>-	sprintf(out, fmt,</div><div class='del'>-		uuid.time_low, uuid.time_mid, uuid.time_hi_and_version,</div><div class='del'>-		uuid.clock_seq &gt;&gt; 8, uuid.clock_seq &amp; 0xFF,</div><div class='del'>-		uuid.node[0], uuid.node[1], uuid.node[2],</div><div class='del'>-		uuid.node[3], uuid.node[4], uuid.node[5]);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-void uuid_unparse_lower(const uuid_t uu, char *out)</div><div class='del'>-{</div><div class='del'>-	uuid_unparse_x(uu, out,	fmt_lower);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-void uuid_unparse_upper(const uuid_t uu, char *out)</div><div class='del'>-{</div><div class='del'>-	uuid_unparse_x(uu, out,	fmt_upper);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-void uuid_unparse(const uuid_t uu, char *out)</div><div class='del'>-{</div><div class='del'>-	uuid_unparse_x(uu, out, FMT_DEFAULT);</div><div class='del'>-}</div><div class='head'>diff --git a/contrib/uuid/uuid.h b/contrib/uuid/uuid.h<br/>deleted file mode 100644<br/>index ab006652fc0..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/contrib/uuid/uuid.h?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>contrib/uuid/uuid.h</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,104 +0,0 @@</div><div class='del'>-/*</div><div class='del'>- * Public include file for the UUID library</div><div class='del'>- *</div><div class='del'>- * Copyright (C) 1996, 1997, 1998 Theodore Ts'o.</div><div class='del'>- *</div><div class='del'>- * %Begin-Header%</div><div class='del'>- * Redistribution and use in source and binary forms, with or without</div><div class='del'>- * modification, are permitted provided that the following conditions</div><div class='del'>- * are met:</div><div class='del'>- * 1. Redistributions of source code must retain the above copyright</div><div class='del'>- *    notice, and the entire permission notice in its entirety,</div><div class='del'>- *    including the disclaimer of warranties.</div><div class='del'>- * 2. Redistributions in binary form must reproduce the above copyright</div><div class='del'>- *    notice, this list of conditions and the following disclaimer in the</div><div class='del'>- *    documentation and/or other materials provided with the distribution.</div><div class='del'>- * 3. The name of the author may not be used to endorse or promote</div><div class='del'>- *    products derived from this software without specific prior</div><div class='del'>- *    written permission.</div><div class='del'>- *</div><div class='del'>- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED</div><div class='del'>- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES</div><div class='del'>- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ALL OF</div><div class='del'>- * WHICH ARE HEREBY DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE</div><div class='del'>- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR</div><div class='del'>- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT</div><div class='del'>- * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR</div><div class='del'>- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF</div><div class='del'>- * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT</div><div class='del'>- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE</div><div class='del'>- * USE OF THIS SOFTWARE, EVEN IF NOT ADVISED OF THE POSSIBILITY OF SUCH</div><div class='del'>- * DAMAGE.</div><div class='del'>- * %End-Header%</div><div class='del'>- */</div><div class='del'>-</div><div class='del'>-#ifndef _UUID_UUID_H</div><div class='del'>-#define _UUID_UUID_H</div><div class='del'>-</div><div class='del'>-#include "config.h"</div><div class='del'>-#include &lt;sys/types.h&gt;</div><div class='del'>-#ifndef _WIN32</div><div class='del'>-#include &lt;sys/time.h&gt;</div><div class='del'>-#endif</div><div class='del'>-#include &lt;time.h&gt;</div><div class='del'>-</div><div class='del'>-typedef unsigned char uuid_t[16];</div><div class='del'>-</div><div class='del'>-/* UUID Variant definitions */</div><div class='del'>-#define UUID_VARIANT_NCS 	0</div><div class='del'>-#define UUID_VARIANT_DCE 	1</div><div class='del'>-#define UUID_VARIANT_MICROSOFT	2</div><div class='del'>-#define UUID_VARIANT_OTHER	3</div><div class='del'>-</div><div class='del'>-/* UUID Type definitions */</div><div class='del'>-#define UUID_TYPE_DCE_TIME   1</div><div class='del'>-#define UUID_TYPE_DCE_RANDOM 4</div><div class='del'>-</div><div class='del'>-/* Allow UUID constants to be defined */</div><div class='del'>-#ifdef __GNUC__</div><div class='del'>-#define UUID_DEFINE(name,u0,u1,u2,u3,u4,u5,u6,u7,u8,u9,u10,u11,u12,u13,u14,u15) \</div><div class='del'>-	static const uuid_t name __attribute__ ((unused)) = {u0,u1,u2,u3,u4,u5,u6,u7,u8,u9,u10,u11,u12,u13,u14,u15}</div><div class='del'>-#else</div><div class='del'>-#define UUID_DEFINE(name,u0,u1,u2,u3,u4,u5,u6,u7,u8,u9,u10,u11,u12,u13,u14,u15) \</div><div class='del'>-	static const uuid_t name = {u0,u1,u2,u3,u4,u5,u6,u7,u8,u9,u10,u11,u12,u13,u14,u15}</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-#ifdef __cplusplus</div><div class='del'>-extern "C" {</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-/* clear.c */</div><div class='del'>-void uuid_clear(uuid_t uu);</div><div class='del'>-</div><div class='del'>-/* compare.c */</div><div class='del'>-int uuid_compare(const uuid_t uu1, const uuid_t uu2);</div><div class='del'>-</div><div class='del'>-/* copy.c */</div><div class='del'>-void uuid_copy(uuid_t dst, const uuid_t src);</div><div class='del'>-</div><div class='del'>-/* gen_uuid.c */</div><div class='del'>-void uuid_generate(uuid_t out);</div><div class='del'>-void uuid_generate_random(uuid_t out);</div><div class='del'>-void uuid_generate_time(uuid_t out);</div><div class='del'>-</div><div class='del'>-/* isnull.c */</div><div class='del'>-int uuid_is_null(const uuid_t uu);</div><div class='del'>-</div><div class='del'>-/* parse.c */</div><div class='del'>-int uuid_parse(const char *in, uuid_t uu);</div><div class='del'>-</div><div class='del'>-/* unparse.c */</div><div class='del'>-void uuid_unparse(const uuid_t uu, char *out);</div><div class='del'>-void uuid_unparse_lower(const uuid_t uu, char *out);</div><div class='del'>-void uuid_unparse_upper(const uuid_t uu, char *out);</div><div class='del'>-</div><div class='del'>-/* uuid_time.c */</div><div class='del'>-time_t uuid_time(const uuid_t uu, struct timeval *ret_tv);</div><div class='del'>-int uuid_type(const uuid_t uu);</div><div class='del'>-int uuid_variant(const uuid_t uu);</div><div class='del'>-</div><div class='del'>-#ifdef __cplusplus</div><div class='del'>-}</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-#endif /* _UUID_UUID_H */</div><div class='head'>diff --git a/contrib/uuid/uuidP.h b/contrib/uuid/uuidP.h<br/>deleted file mode 100644<br/>index 9a2de6132fe..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/contrib/uuid/uuidP.h?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>contrib/uuid/uuidP.h</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,63 +0,0 @@</div><div class='del'>-/*</div><div class='del'>- * uuid.h -- private header file for uuids</div><div class='del'>- *</div><div class='del'>- * Copyright (C) 1996, 1997 Theodore Ts'o.</div><div class='del'>- *</div><div class='del'>- * %Begin-Header%</div><div class='del'>- * Redistribution and use in source and binary forms, with or without</div><div class='del'>- * modification, are permitted provided that the following conditions</div><div class='del'>- * are met:</div><div class='del'>- * 1. Redistributions of source code must retain the above copyright</div><div class='del'>- *    notice, and the entire permission notice in its entirety,</div><div class='del'>- *    including the disclaimer of warranties.</div><div class='del'>- * 2. Redistributions in binary form must reproduce the above copyright</div><div class='del'>- *    notice, this list of conditions and the following disclaimer in the</div><div class='del'>- *    documentation and/or other materials provided with the distribution.</div><div class='del'>- * 3. The name of the author may not be used to endorse or promote</div><div class='del'>- *    products derived from this software without specific prior</div><div class='del'>- *    written permission.</div><div class='del'>- *</div><div class='del'>- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED</div><div class='del'>- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES</div><div class='del'>- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ALL OF</div><div class='del'>- * WHICH ARE HEREBY DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE</div><div class='del'>- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR</div><div class='del'>- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT</div><div class='del'>- * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR</div><div class='del'>- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF</div><div class='del'>- * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT</div><div class='del'>- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE</div><div class='del'>- * USE OF THIS SOFTWARE, EVEN IF NOT ADVISED OF THE POSSIBILITY OF SUCH</div><div class='del'>- * DAMAGE.</div><div class='del'>- * %End-Header%</div><div class='del'>- */</div><div class='del'>-</div><div class='del'>-#include "uuid.h"</div><div class='del'>-#ifdef HAVE_INTTYPES_H</div><div class='del'>-#include &lt;inttypes.h&gt;</div><div class='del'>-#else</div><div class='del'>-#include "uuid_types.h"</div><div class='del'>-#endif</div><div class='del'>-#include &lt;sys/types.h&gt;</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-/*</div><div class='del'>- * Offset between 15-Oct-1582 and 1-Jan-70</div><div class='del'>- */</div><div class='del'>-#define TIME_OFFSET_HIGH 0x01B21DD2</div><div class='del'>-#define TIME_OFFSET_LOW  0x13814000</div><div class='del'>-</div><div class='del'>-struct uuid {</div><div class='del'>-	uint32_t	time_low;</div><div class='del'>-	uint16_t	time_mid;</div><div class='del'>-	uint16_t	time_hi_and_version;</div><div class='del'>-	uint16_t	clock_seq;</div><div class='del'>-	uint8_t	node[6];</div><div class='del'>-};</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-/*</div><div class='del'>- * prototypes</div><div class='del'>- */</div><div class='del'>-void uuid_pack(const struct uuid *uu, uuid_t ptr);</div><div class='del'>-void uuid_unpack(const uuid_t in, struct uuid *uu);</div><div class='head'>diff --git a/contrib/uuid/uuid_time.c b/contrib/uuid/uuid_time.c<br/>deleted file mode 100644<br/>index f25f5c90fe5..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/contrib/uuid/uuid_time.c?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>contrib/uuid/uuid_time.c</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,171 +0,0 @@</div><div class='del'>-/*</div><div class='del'>- * uuid_time.c --- Interpret the time field from a uuid.  This program</div><div class='del'>- * 	violates the UUID abstraction barrier by reaching into the guts</div><div class='del'>- *	of a UUID and interpreting it.</div><div class='del'>- *</div><div class='del'>- * Copyright (C) 1998, 1999 Theodore Ts'o.</div><div class='del'>- *</div><div class='del'>- * %Begin-Header%</div><div class='del'>- * Redistribution and use in source and binary forms, with or without</div><div class='del'>- * modification, are permitted provided that the following conditions</div><div class='del'>- * are met:</div><div class='del'>- * 1. Redistributions of source code must retain the above copyright</div><div class='del'>- *    notice, and the entire permission notice in its entirety,</div><div class='del'>- *    including the disclaimer of warranties.</div><div class='del'>- * 2. Redistributions in binary form must reproduce the above copyright</div><div class='del'>- *    notice, this list of conditions and the following disclaimer in the</div><div class='del'>- *    documentation and/or other materials provided with the distribution.</div><div class='del'>- * 3. The name of the author may not be used to endorse or promote</div><div class='del'>- *    products derived from this software without specific prior</div><div class='del'>- *    written permission.</div><div class='del'>- *</div><div class='del'>- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED</div><div class='del'>- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES</div><div class='del'>- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ALL OF</div><div class='del'>- * WHICH ARE HEREBY DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE</div><div class='del'>- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR</div><div class='del'>- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT</div><div class='del'>- * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR</div><div class='del'>- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF</div><div class='del'>- * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT</div><div class='del'>- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE</div><div class='del'>- * USE OF THIS SOFTWARE, EVEN IF NOT ADVISED OF THE POSSIBILITY OF SUCH</div><div class='del'>- * DAMAGE.</div><div class='del'>- * %End-Header%</div><div class='del'>- */</div><div class='del'>-</div><div class='del'>-#ifdef _WIN32</div><div class='del'>-#define _WIN32_WINNT 0x0500</div><div class='del'>-#include &lt;windows.h&gt;</div><div class='del'>-#define UUID MYUUID</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-#include &lt;stdio.h&gt;</div><div class='del'>-#ifdef HAVE_UNISTD_H</div><div class='del'>-#include &lt;unistd.h&gt;</div><div class='del'>-#endif</div><div class='del'>-#include &lt;stdlib.h&gt;</div><div class='del'>-#include &lt;sys/types.h&gt;</div><div class='del'>-#ifdef HAVE_SYS_TIME_H</div><div class='del'>-#include &lt;sys/time.h&gt;</div><div class='del'>-#endif</div><div class='del'>-#include &lt;time.h&gt;</div><div class='del'>-</div><div class='del'>-#include "uuidP.h"</div><div class='del'>-</div><div class='del'>-time_t uuid_time(const uuid_t uu, struct timeval *ret_tv)</div><div class='del'>-{</div><div class='del'>-	struct timeval		tv;</div><div class='del'>-	struct uuid		uuid;</div><div class='del'>-	uint32_t		high;</div><div class='del'>-	uint64_t		clock_reg;</div><div class='del'>-</div><div class='del'>-	uuid_unpack(uu, &amp;uuid);</div><div class='del'>-</div><div class='del'>-	high = uuid.time_mid | ((uuid.time_hi_and_version &amp; 0xFFF) &lt;&lt; 16);</div><div class='del'>-	clock_reg = uuid.time_low | ((uint64_t) high &lt;&lt; 32);</div><div class='del'>-</div><div class='del'>-	clock_reg -= (((uint64_t) 0x01B21DD2) &lt;&lt; 32) + 0x13814000;</div><div class='del'>-	tv.tv_sec = clock_reg / 10000000;</div><div class='del'>-	tv.tv_usec = (clock_reg % 10000000) / 10;</div><div class='del'>-</div><div class='del'>-	if (ret_tv)</div><div class='del'>-		*ret_tv = tv;</div><div class='del'>-</div><div class='del'>-	return tv.tv_sec;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int uuid_type(const uuid_t uu)</div><div class='del'>-{</div><div class='del'>-	struct uuid		uuid;</div><div class='del'>-</div><div class='del'>-	uuid_unpack(uu, &amp;uuid);</div><div class='del'>-	return ((uuid.time_hi_and_version &gt;&gt; 12) &amp; 0xF);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int uuid_variant(const uuid_t uu)</div><div class='del'>-{</div><div class='del'>-	struct uuid		uuid;</div><div class='del'>-	int			var;</div><div class='del'>-</div><div class='del'>-	uuid_unpack(uu, &amp;uuid);</div><div class='del'>-	var = uuid.clock_seq;</div><div class='del'>-</div><div class='del'>-	if ((var &amp; 0x8000) == 0)</div><div class='del'>-		return UUID_VARIANT_NCS;</div><div class='del'>-	if ((var &amp; 0x4000) == 0)</div><div class='del'>-		return UUID_VARIANT_DCE;</div><div class='del'>-	if ((var &amp; 0x2000) == 0)</div><div class='del'>-		return UUID_VARIANT_MICROSOFT;</div><div class='del'>-	return UUID_VARIANT_OTHER;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-#ifdef DEBUG</div><div class='del'>-static const char *variant_string(int variant)</div><div class='del'>-{</div><div class='del'>-	switch (variant) {</div><div class='del'>-	case UUID_VARIANT_NCS:</div><div class='del'>-		return "NCS";</div><div class='del'>-	case UUID_VARIANT_DCE:</div><div class='del'>-		return "DCE";</div><div class='del'>-	case UUID_VARIANT_MICROSOFT:</div><div class='del'>-		return "Microsoft";</div><div class='del'>-	default:</div><div class='del'>-		return "Other";</div><div class='del'>-	}</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-main(int argc, char **argv)</div><div class='del'>-{</div><div class='del'>-	uuid_t		buf;</div><div class='del'>-	time_t		time_reg;</div><div class='del'>-	struct timeval	tv;</div><div class='del'>-	int		type, variant;</div><div class='del'>-</div><div class='del'>-	if (argc != 2) {</div><div class='del'>-		fprintf(stderr, "Usage: %s uuid\n", argv[0]);</div><div class='del'>-		exit(1);</div><div class='del'>-	}</div><div class='del'>-	if (uuid_parse(argv[1], buf)) {</div><div class='del'>-		fprintf(stderr, "Invalid UUID: %s\n", argv[1]);</div><div class='del'>-		exit(1);</div><div class='del'>-	}</div><div class='del'>-	variant = uuid_variant(buf);</div><div class='del'>-	type = uuid_type(buf);</div><div class='del'>-	time_reg = uuid_time(buf, &amp;tv);</div><div class='del'>-</div><div class='del'>-	printf("UUID variant is %d (%s)\n", variant, variant_string(variant));</div><div class='del'>-	if (variant != UUID_VARIANT_DCE) {</div><div class='del'>-		printf("Warning: This program only knows how to interpret "</div><div class='del'>-		       "DCE UUIDs.\n\tThe rest of the output is likely "</div><div class='del'>-		       "to be incorrect!!\n");</div><div class='del'>-	}</div><div class='del'>-	printf("UUID type is %d", type);</div><div class='del'>-	switch (type) {</div><div class='del'>-	case 1:</div><div class='del'>-		printf(" (time based)\n");</div><div class='del'>-		break;</div><div class='del'>-	case 2:</div><div class='del'>-		printf(" (DCE)\n");</div><div class='del'>-		break;</div><div class='del'>-	case 3:</div><div class='del'>-		printf(" (name-based)\n");</div><div class='del'>-		break;</div><div class='del'>-	case 4:</div><div class='del'>-		printf(" (random)\n");</div><div class='del'>-		break;</div><div class='del'>-	default:</div><div class='del'>-		printf("\n");</div><div class='del'>-	}</div><div class='del'>-	if (type != 1) {</div><div class='del'>-		printf("Warning: not a time-based UUID, so UUID time "</div><div class='del'>-		       "decoding will likely not work!\n");</div><div class='del'>-	}</div><div class='del'>-	printf("UUID time is: (%ld, %ld): %s\n", tv.tv_sec, tv.tv_usec,</div><div class='del'>-	       ctime(&amp;time_reg));</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-#endif</div><div class='head'>diff --git a/contrib/uuid/uuid_types.h b/contrib/uuid/uuid_types.h<br/>deleted file mode 100644<br/>index 3e2290b4682..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/contrib/uuid/uuid_types.h?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>contrib/uuid/uuid_types.h</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,50 +0,0 @@</div><div class='del'>-/* </div><div class='del'>- * If linux/types.h is already been included, assume it has defined</div><div class='del'>- * everything we need.  (cross fingers)  Other header files may have </div><div class='del'>- * also defined the types that we need.</div><div class='del'>- */</div><div class='del'>-#if (!defined(_STDINT_H) &amp;&amp; !defined(_UUID_STDINT_H))</div><div class='del'>-#define _UUID_STDINT_H</div><div class='del'>-</div><div class='del'>-typedef unsigned char uint8_t;</div><div class='del'>-typedef signed char int8_t;</div><div class='del'>-</div><div class='del'>-#if (4 == 8)</div><div class='del'>-typedef int		int64_t;</div><div class='del'>-typedef unsigned int	uint64_t;</div><div class='del'>-#elif (8 == 8)</div><div class='del'>-typedef long		int64_t;</div><div class='del'>-typedef unsigned long	uint64_t;</div><div class='del'>-#elif (8 == 8)</div><div class='del'>-#if defined(__GNUC__)</div><div class='del'>-typedef __signed__ long long 	int64_t;</div><div class='del'>-#else</div><div class='del'>-typedef signed long long 	int64_t;</div><div class='del'>-#endif</div><div class='del'>-typedef unsigned long long	uint64_t;</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-#if (4 == 2)</div><div class='del'>-typedef	int		int16_t;</div><div class='del'>-typedef	unsigned int	uint16_t;</div><div class='del'>-#elif (2 == 2)</div><div class='del'>-typedef	short		int16_t;</div><div class='del'>-typedef	unsigned short	uint16_t;</div><div class='del'>-#else</div><div class='del'>-  ?==error: undefined 16 bit type</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-#if (4 == 4)</div><div class='del'>-typedef	int		int32_t;</div><div class='del'>-typedef	unsigned int	uint32_t;</div><div class='del'>-#elif (8 == 4)</div><div class='del'>-typedef	long		int32_t;</div><div class='del'>-typedef	unsigned long	uint32_t;</div><div class='del'>-#elif (2 == 4)</div><div class='del'>-typedef	short		int32_t;</div><div class='del'>-typedef	unsigned short	uint32_t;</div><div class='del'>-#else</div><div class='del'>- ?== error: undefined 32 bit type</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-#endif</div><div class='head'>diff --git a/contrib/uuid/uuidd.h b/contrib/uuid/uuidd.h<br/>deleted file mode 100644<br/>index c71f4b78835..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/contrib/uuid/uuidd.h?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>contrib/uuid/uuidd.h</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,54 +0,0 @@</div><div class='del'>-/*</div><div class='del'>- * Definitions used by the uuidd daemon</div><div class='del'>- *</div><div class='del'>- * Copyright (C) 2007 Theodore Ts'o.</div><div class='del'>- *</div><div class='del'>- * %Begin-Header%</div><div class='del'>- * Redistribution and use in source and binary forms, with or without</div><div class='del'>- * modification, are permitted provided that the following conditions</div><div class='del'>- * are met:</div><div class='del'>- * 1. Redistributions of source code must retain the above copyright</div><div class='del'>- *    notice, and the entire permission notice in its entirety,</div><div class='del'>- *    including the disclaimer of warranties.</div><div class='del'>- * 2. Redistributions in binary form must reproduce the above copyright</div><div class='del'>- *    notice, this list of conditions and the following disclaimer in the</div><div class='del'>- *    documentation and/or other materials provided with the distribution.</div><div class='del'>- * 3. The name of the author may not be used to endorse or promote</div><div class='del'>- *    products derived from this software without specific prior</div><div class='del'>- *    written permission.</div><div class='del'>- *</div><div class='del'>- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED</div><div class='del'>- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES</div><div class='del'>- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ALL OF</div><div class='del'>- * WHICH ARE HEREBY DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE</div><div class='del'>- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR</div><div class='del'>- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT</div><div class='del'>- * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR</div><div class='del'>- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF</div><div class='del'>- * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT</div><div class='del'>- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE</div><div class='del'>- * USE OF THIS SOFTWARE, EVEN IF NOT ADVISED OF THE POSSIBILITY OF SUCH</div><div class='del'>- * DAMAGE.</div><div class='del'>- * %End-Header%</div><div class='del'>- */</div><div class='del'>-</div><div class='del'>-#ifndef _UUID_UUIDD_H</div><div class='del'>-#define _UUID_UUIDD_H</div><div class='del'>-</div><div class='del'>-#define UUIDD_DIR		"/var/lib/libuuid"</div><div class='del'>-#define UUIDD_SOCKET_PATH	UUIDD_DIR "/request"</div><div class='del'>-#define UUIDD_PIDFILE_PATH	UUIDD_DIR "/uuidd.pid"</div><div class='del'>-#define UUIDD_PATH		"/usr/sbin/uuidd"</div><div class='del'>-</div><div class='del'>-#define UUIDD_OP_GETPID			0</div><div class='del'>-#define UUIDD_OP_GET_MAXOP		1</div><div class='del'>-#define UUIDD_OP_TIME_UUID		2</div><div class='del'>-#define UUIDD_OP_RANDOM_UUID		3</div><div class='del'>-#define UUIDD_OP_BULK_TIME_UUID		4</div><div class='del'>-#define UUIDD_OP_BULK_RANDOM_UUID	5</div><div class='del'>-#define UUIDD_MAX_OP			UUIDD_OP_BULK_RANDOM_UUID</div><div class='del'>-</div><div class='del'>-extern void uuid__generate_time(uuid_t out, int *num);</div><div class='del'>-extern void uuid__generate_random(uuid_t out, int *num);</div><div class='del'>-</div><div class='del'>-#endif /* _UUID_UUID_H */</div><div class='head'>diff --git a/contrib/xxhash/xxhash.c b/contrib/xxhash/xxhash.c<br/>new file mode 100644<br/>index 00000000000..56f80f8811d<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/contrib/xxhash/xxhash.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>contrib/xxhash/xxhash.c</a></div><div class='hunk'>@@ -0,0 +1,1029 @@</div><div class='add'>+/*</div><div class='add'>+*  xxHash - Fast Hash algorithm</div><div class='add'>+*  Copyright (C) 2012-2016, Yann Collet</div><div class='add'>+*</div><div class='add'>+*  BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php)</div><div class='add'>+*</div><div class='add'>+*  Redistribution and use in source and binary forms, with or without</div><div class='add'>+*  modification, are permitted provided that the following conditions are</div><div class='add'>+*  met:</div><div class='add'>+*</div><div class='add'>+*  * Redistributions of source code must retain the above copyright</div><div class='add'>+*  notice, this list of conditions and the following disclaimer.</div><div class='add'>+*  * Redistributions in binary form must reproduce the above</div><div class='add'>+*  copyright notice, this list of conditions and the following disclaimer</div><div class='add'>+*  in the documentation and/or other materials provided with the</div><div class='add'>+*  distribution.</div><div class='add'>+*</div><div class='add'>+*  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS</div><div class='add'>+*  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT</div><div class='add'>+*  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR</div><div class='add'>+*  A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT</div><div class='add'>+*  OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,</div><div class='add'>+*  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT</div><div class='add'>+*  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,</div><div class='add'>+*  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY</div><div class='add'>+*  THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT</div><div class='add'>+*  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE</div><div class='add'>+*  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.</div><div class='add'>+*</div><div class='add'>+*  You can contact the author at :</div><div class='add'>+*  - xxHash homepage: http://www.xxhash.com</div><div class='add'>+*  - xxHash source repository : https://github.com/Cyan4973/xxHash</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+/* *************************************</div><div class='add'>+*  Tuning parameters</div><div class='add'>+***************************************/</div><div class='add'>+/*!XXH_FORCE_MEMORY_ACCESS :</div><div class='add'>+ * By default, access to unaligned memory is controlled by `memcpy()`, which is safe and portable.</div><div class='add'>+ * Unfortunately, on some target/compiler combinations, the generated assembly is sub-optimal.</div><div class='add'>+ * The below switch allow to select different access method for improved performance.</div><div class='add'>+ * Method 0 (default) : use `memcpy()`. Safe and portable.</div><div class='add'>+ * Method 1 : `__packed` statement. It depends on compiler extension (ie, not portable).</div><div class='add'>+ *            This method is safe if your compiler supports it, and *generally* as fast or faster than `memcpy`.</div><div class='add'>+ * Method 2 : direct access. This method doesn't depend on compiler but violate C standard.</div><div class='add'>+ *            It can generate buggy code on targets which do not support unaligned memory accesses.</div><div class='add'>+ *            But in some circumstances, it's the only known way to get the most performance (ie GCC + ARMv6)</div><div class='add'>+ * See http://stackoverflow.com/a/32095106/646947 for details.</div><div class='add'>+ * Prefer these methods in priority order (0 &gt; 1 &gt; 2)</div><div class='add'>+ */</div><div class='add'>+#ifndef XXH_FORCE_MEMORY_ACCESS   /* can be defined externally, on command line for example */</div><div class='add'>+#  if defined(__GNUC__) &amp;&amp; ( defined(__ARM_ARCH_6__) || defined(__ARM_ARCH_6J__) \</div><div class='add'>+                        || defined(__ARM_ARCH_6K__) || defined(__ARM_ARCH_6Z__) \</div><div class='add'>+                        || defined(__ARM_ARCH_6ZK__) || defined(__ARM_ARCH_6T2__) )</div><div class='add'>+#    define XXH_FORCE_MEMORY_ACCESS 2</div><div class='add'>+#  elif (defined(__INTEL_COMPILER) &amp;&amp; !defined(_WIN32)) || \</div><div class='add'>+  (defined(__GNUC__) &amp;&amp; ( defined(__ARM_ARCH_7__) || defined(__ARM_ARCH_7A__) \</div><div class='add'>+                    || defined(__ARM_ARCH_7R__) || defined(__ARM_ARCH_7M__) \</div><div class='add'>+                    || defined(__ARM_ARCH_7S__) ))</div><div class='add'>+#    define XXH_FORCE_MEMORY_ACCESS 1</div><div class='add'>+#  endif</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+/*!XXH_ACCEPT_NULL_INPUT_POINTER :</div><div class='add'>+ * If input pointer is NULL, xxHash default behavior is to dereference it, triggering a segfault.</div><div class='add'>+ * When this macro is enabled, xxHash actively checks input for null pointer.</div><div class='add'>+ * It it is, result for null input pointers is the same as a null-length input.</div><div class='add'>+ */</div><div class='add'>+#ifndef XXH_ACCEPT_NULL_INPUT_POINTER   /* can be defined externally */</div><div class='add'>+#  define XXH_ACCEPT_NULL_INPUT_POINTER 0</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+/*!XXH_FORCE_NATIVE_FORMAT :</div><div class='add'>+ * By default, xxHash library provides endian-independent Hash values, based on little-endian convention.</div><div class='add'>+ * Results are therefore identical for little-endian and big-endian CPU.</div><div class='add'>+ * This comes at a performance cost for big-endian CPU, since some swapping is required to emulate little-endian format.</div><div class='add'>+ * Should endian-independence be of no importance for your application, you may set the #define below to 1,</div><div class='add'>+ * to improve speed for Big-endian CPU.</div><div class='add'>+ * This option has no impact on Little_Endian CPU.</div><div class='add'>+ */</div><div class='add'>+#ifndef XXH_FORCE_NATIVE_FORMAT   /* can be defined externally */</div><div class='add'>+#  define XXH_FORCE_NATIVE_FORMAT 0</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+/*!XXH_FORCE_ALIGN_CHECK :</div><div class='add'>+ * This is a minor performance trick, only useful with lots of very small keys.</div><div class='add'>+ * It means : check for aligned/unaligned input.</div><div class='add'>+ * The check costs one initial branch per hash;</div><div class='add'>+ * set it to 0 when the input is guaranteed to be aligned,</div><div class='add'>+ * or when alignment doesn't matter for performance.</div><div class='add'>+ */</div><div class='add'>+#ifndef XXH_FORCE_ALIGN_CHECK /* can be defined externally */</div><div class='add'>+#  if defined(__i386) || defined(_M_IX86) || defined(__x86_64__) || defined(_M_X64)</div><div class='add'>+#    define XXH_FORCE_ALIGN_CHECK 0</div><div class='add'>+#  else</div><div class='add'>+#    define XXH_FORCE_ALIGN_CHECK 1</div><div class='add'>+#  endif</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+/* *************************************</div><div class='add'>+*  Includes &amp; Memory related functions</div><div class='add'>+***************************************/</div><div class='add'>+/*! Modify the local functions below should you wish to use some other memory routines</div><div class='add'>+*   for malloc(), free() */</div><div class='add'>+#include &lt;stdlib.h&gt;</div><div class='add'>+static void* XXH_malloc(size_t s) { return malloc(s); }</div><div class='add'>+static void  XXH_free  (void* p)  { free(p); }</div><div class='add'>+/*! and for memcpy() */</div><div class='add'>+#include &lt;string.h&gt;</div><div class='add'>+static void* XXH_memcpy(void* dest, const void* src, size_t size) { return memcpy(dest,src,size); }</div><div class='add'>+</div><div class='add'>+#include &lt;assert.h&gt;   /* assert */</div><div class='add'>+</div><div class='add'>+#define XXH_STATIC_LINKING_ONLY</div><div class='add'>+#include "xxhash.h"</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+/* *************************************</div><div class='add'>+*  Compiler Specific Options</div><div class='add'>+***************************************/</div><div class='add'>+#ifdef _MSC_VER    /* Visual Studio */</div><div class='add'>+#  pragma warning(disable : 4127)      /* disable: C4127: conditional expression is constant */</div><div class='add'>+#  define FORCE_INLINE static __forceinline</div><div class='add'>+#else</div><div class='add'>+#  if defined (__cplusplus) || defined (__STDC_VERSION__) &amp;&amp; __STDC_VERSION__ &gt;= 199901L   /* C99 */</div><div class='add'>+#    ifdef __GNUC__</div><div class='add'>+#      define FORCE_INLINE static inline __attribute__((always_inline))</div><div class='add'>+#    else</div><div class='add'>+#      define FORCE_INLINE static inline</div><div class='add'>+#    endif</div><div class='add'>+#  else</div><div class='add'>+#    define FORCE_INLINE static</div><div class='add'>+#  endif /* __STDC_VERSION__ */</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+/* *************************************</div><div class='add'>+*  Basic Types</div><div class='add'>+***************************************/</div><div class='add'>+#ifndef MEM_MODULE</div><div class='add'>+# if !defined (__VMS) \</div><div class='add'>+  &amp;&amp; (defined (__cplusplus) \</div><div class='add'>+  || (defined (__STDC_VERSION__) &amp;&amp; (__STDC_VERSION__ &gt;= 199901L) /* C99 */) )</div><div class='add'>+#   include &lt;stdint.h&gt;</div><div class='add'>+    typedef uint8_t  BYTE;</div><div class='add'>+    typedef uint16_t U16;</div><div class='add'>+    typedef uint32_t U32;</div><div class='add'>+# else</div><div class='add'>+    typedef unsigned char      BYTE;</div><div class='add'>+    typedef unsigned short     U16;</div><div class='add'>+    typedef unsigned int       U32;</div><div class='add'>+# endif</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#if (defined(XXH_FORCE_MEMORY_ACCESS) &amp;&amp; (XXH_FORCE_MEMORY_ACCESS==2))</div><div class='add'>+</div><div class='add'>+/* Force direct memory access. Only works on CPU which support unaligned memory access in hardware */</div><div class='add'>+static U32 XXH_read32(const void* memPtr) { return *(const U32*) memPtr; }</div><div class='add'>+</div><div class='add'>+#elif (defined(XXH_FORCE_MEMORY_ACCESS) &amp;&amp; (XXH_FORCE_MEMORY_ACCESS==1))</div><div class='add'>+</div><div class='add'>+/* __pack instructions are safer, but compiler specific, hence potentially problematic for some compilers */</div><div class='add'>+/* currently only defined for gcc and icc */</div><div class='add'>+typedef union { U32 u32; } __attribute__((packed)) unalign;</div><div class='add'>+static U32 XXH_read32(const void* ptr) { return ((const unalign*)ptr)-&gt;u32; }</div><div class='add'>+</div><div class='add'>+#else</div><div class='add'>+</div><div class='add'>+/* portable and safe solution. Generally efficient.</div><div class='add'>+ * see : http://stackoverflow.com/a/32095106/646947</div><div class='add'>+ */</div><div class='add'>+static U32 XXH_read32(const void* memPtr)</div><div class='add'>+{</div><div class='add'>+    U32 val;</div><div class='add'>+    memcpy(&amp;val, memPtr, sizeof(val));</div><div class='add'>+    return val;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#endif   /* XXH_FORCE_DIRECT_MEMORY_ACCESS */</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+/* ****************************************</div><div class='add'>+*  Compiler-specific Functions and Macros</div><div class='add'>+******************************************/</div><div class='add'>+#define GCC_VERSION (__GNUC__ * 100 + __GNUC_MINOR__)</div><div class='add'>+</div><div class='add'>+/* Note : although _rotl exists for minGW (GCC under windows), performance seems poor */</div><div class='add'>+#if defined(_MSC_VER)</div><div class='add'>+#  define XXH_rotl32(x,r) _rotl(x,r)</div><div class='add'>+#  define XXH_rotl64(x,r) _rotl64(x,r)</div><div class='add'>+#else</div><div class='add'>+#  define XXH_rotl32(x,r) ((x &lt;&lt; r) | (x &gt;&gt; (32 - r)))</div><div class='add'>+#  define XXH_rotl64(x,r) ((x &lt;&lt; r) | (x &gt;&gt; (64 - r)))</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#if defined(_MSC_VER)     /* Visual Studio */</div><div class='add'>+#  define XXH_swap32 _byteswap_ulong</div><div class='add'>+#elif GCC_VERSION &gt;= 403</div><div class='add'>+#  define XXH_swap32 __builtin_bswap32</div><div class='add'>+#else</div><div class='add'>+static U32 XXH_swap32 (U32 x)</div><div class='add'>+{</div><div class='add'>+    return  ((x &lt;&lt; 24) &amp; 0xff000000 ) |</div><div class='add'>+            ((x &lt;&lt;  8) &amp; 0x00ff0000 ) |</div><div class='add'>+            ((x &gt;&gt;  8) &amp; 0x0000ff00 ) |</div><div class='add'>+            ((x &gt;&gt; 24) &amp; 0x000000ff );</div><div class='add'>+}</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+/* *************************************</div><div class='add'>+*  Architecture Macros</div><div class='add'>+***************************************/</div><div class='add'>+typedef enum { XXH_bigEndian=0, XXH_littleEndian=1 } XXH_endianess;</div><div class='add'>+</div><div class='add'>+/* XXH_CPU_LITTLE_ENDIAN can be defined externally, for example on the compiler command line */</div><div class='add'>+#ifndef XXH_CPU_LITTLE_ENDIAN</div><div class='add'>+static int XXH_isLittleEndian(void)</div><div class='add'>+{</div><div class='add'>+    const union { U32 u; BYTE c[4]; } one = { 1 };   /* don't use static : performance detrimental  */</div><div class='add'>+    return one.c[0];</div><div class='add'>+}</div><div class='add'>+#   define XXH_CPU_LITTLE_ENDIAN   XXH_isLittleEndian()</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+/* ***************************</div><div class='add'>+*  Memory reads</div><div class='add'>+*****************************/</div><div class='add'>+typedef enum { XXH_aligned, XXH_unaligned } XXH_alignment;</div><div class='add'>+</div><div class='add'>+FORCE_INLINE U32 XXH_readLE32_align(const void* ptr, XXH_endianess endian, XXH_alignment align)</div><div class='add'>+{</div><div class='add'>+    if (align==XXH_unaligned)</div><div class='add'>+        return endian==XXH_littleEndian ? XXH_read32(ptr) : XXH_swap32(XXH_read32(ptr));</div><div class='add'>+    else</div><div class='add'>+        return endian==XXH_littleEndian ? *(const U32*)ptr : XXH_swap32(*(const U32*)ptr);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+FORCE_INLINE U32 XXH_readLE32(const void* ptr, XXH_endianess endian)</div><div class='add'>+{</div><div class='add'>+    return XXH_readLE32_align(ptr, endian, XXH_unaligned);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static U32 XXH_readBE32(const void* ptr)</div><div class='add'>+{</div><div class='add'>+    return XXH_CPU_LITTLE_ENDIAN ? XXH_swap32(XXH_read32(ptr)) : XXH_read32(ptr);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+/* *************************************</div><div class='add'>+*  Macros</div><div class='add'>+***************************************/</div><div class='add'>+#define XXH_STATIC_ASSERT(c)  { enum { XXH_sa = 1/(int)(!!(c)) }; }  /* use after variable declarations */</div><div class='add'>+XXH_PUBLIC_API unsigned XXH_versionNumber (void) { return XXH_VERSION_NUMBER; }</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+/* *******************************************************************</div><div class='add'>+*  32-bit hash functions</div><div class='add'>+*********************************************************************/</div><div class='add'>+static const U32 PRIME32_1 = 2654435761U;</div><div class='add'>+static const U32 PRIME32_2 = 2246822519U;</div><div class='add'>+static const U32 PRIME32_3 = 3266489917U;</div><div class='add'>+static const U32 PRIME32_4 =  668265263U;</div><div class='add'>+static const U32 PRIME32_5 =  374761393U;</div><div class='add'>+</div><div class='add'>+static U32 XXH32_round(U32 seed, U32 input)</div><div class='add'>+{</div><div class='add'>+    seed += input * PRIME32_2;</div><div class='add'>+    seed  = XXH_rotl32(seed, 13);</div><div class='add'>+    seed *= PRIME32_1;</div><div class='add'>+    return seed;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* mix all bits */</div><div class='add'>+static U32 XXH32_avalanche(U32 h32)</div><div class='add'>+{</div><div class='add'>+    h32 ^= h32 &gt;&gt; 15;</div><div class='add'>+    h32 *= PRIME32_2;</div><div class='add'>+    h32 ^= h32 &gt;&gt; 13;</div><div class='add'>+    h32 *= PRIME32_3;</div><div class='add'>+    h32 ^= h32 &gt;&gt; 16;</div><div class='add'>+    return(h32);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#define XXH_get32bits(p) XXH_readLE32_align(p, endian, align)</div><div class='add'>+</div><div class='add'>+static U32</div><div class='add'>+XXH32_finalize(U32 h32, const void* ptr, size_t len,</div><div class='add'>+                XXH_endianess endian, XXH_alignment align)</div><div class='add'>+</div><div class='add'>+{</div><div class='add'>+    const BYTE* p = (const BYTE*)ptr;</div><div class='add'>+#define PROCESS1             \</div><div class='add'>+    h32 += (*p) * PRIME32_5; \</div><div class='add'>+    p++;                     \</div><div class='add'>+    h32 = XXH_rotl32(h32, 11) * PRIME32_1 ;</div><div class='add'>+</div><div class='add'>+#define PROCESS4                         \</div><div class='add'>+    h32 += XXH_get32bits(p) * PRIME32_3; \</div><div class='add'>+    p+=4;                                \</div><div class='add'>+    h32  = XXH_rotl32(h32, 17) * PRIME32_4 ;</div><div class='add'>+</div><div class='add'>+    switch(len&amp;15)  /* or switch(bEnd - p) */</div><div class='add'>+    {</div><div class='add'>+      case 12:      PROCESS4;</div><div class='add'>+                    /* fallthrough */</div><div class='add'>+      case 8:       PROCESS4;</div><div class='add'>+                    /* fallthrough */</div><div class='add'>+      case 4:       PROCESS4;</div><div class='add'>+                    return XXH32_avalanche(h32);</div><div class='add'>+</div><div class='add'>+      case 13:      PROCESS4;</div><div class='add'>+                    /* fallthrough */</div><div class='add'>+      case 9:       PROCESS4;</div><div class='add'>+                    /* fallthrough */</div><div class='add'>+      case 5:       PROCESS4;</div><div class='add'>+                    PROCESS1;</div><div class='add'>+                    return XXH32_avalanche(h32);</div><div class='add'>+</div><div class='add'>+      case 14:      PROCESS4;</div><div class='add'>+                    /* fallthrough */</div><div class='add'>+      case 10:      PROCESS4;</div><div class='add'>+                    /* fallthrough */</div><div class='add'>+      case 6:       PROCESS4;</div><div class='add'>+                    PROCESS1;</div><div class='add'>+                    PROCESS1;</div><div class='add'>+                    return XXH32_avalanche(h32);</div><div class='add'>+</div><div class='add'>+      case 15:      PROCESS4;</div><div class='add'>+                    /* fallthrough */</div><div class='add'>+      case 11:      PROCESS4;</div><div class='add'>+                    /* fallthrough */</div><div class='add'>+      case 7:       PROCESS4;</div><div class='add'>+                    /* fallthrough */</div><div class='add'>+      case 3:       PROCESS1;</div><div class='add'>+                    /* fallthrough */</div><div class='add'>+      case 2:       PROCESS1;</div><div class='add'>+                    /* fallthrough */</div><div class='add'>+      case 1:       PROCESS1;</div><div class='add'>+                    /* fallthrough */</div><div class='add'>+      case 0:       return XXH32_avalanche(h32);</div><div class='add'>+    }</div><div class='add'>+    assert(0);</div><div class='add'>+    return h32;   /* reaching this point is deemed impossible */</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+FORCE_INLINE U32</div><div class='add'>+XXH32_endian_align(const void* input, size_t len, U32 seed,</div><div class='add'>+                    XXH_endianess endian, XXH_alignment align)</div><div class='add'>+{</div><div class='add'>+    const BYTE* p = (const BYTE*)input;</div><div class='add'>+    const BYTE* bEnd = p + len;</div><div class='add'>+    U32 h32;</div><div class='add'>+</div><div class='add'>+#if defined(XXH_ACCEPT_NULL_INPUT_POINTER) &amp;&amp; (XXH_ACCEPT_NULL_INPUT_POINTER&gt;=1)</div><div class='add'>+    if (p==NULL) {</div><div class='add'>+        len=0;</div><div class='add'>+        bEnd=p=(const BYTE*)(size_t)16;</div><div class='add'>+    }</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+    if (len&gt;=16) {</div><div class='add'>+        const BYTE* const limit = bEnd - 15;</div><div class='add'>+        U32 v1 = seed + PRIME32_1 + PRIME32_2;</div><div class='add'>+        U32 v2 = seed + PRIME32_2;</div><div class='add'>+        U32 v3 = seed + 0;</div><div class='add'>+        U32 v4 = seed - PRIME32_1;</div><div class='add'>+</div><div class='add'>+        do {</div><div class='add'>+            v1 = XXH32_round(v1, XXH_get32bits(p)); p+=4;</div><div class='add'>+            v2 = XXH32_round(v2, XXH_get32bits(p)); p+=4;</div><div class='add'>+            v3 = XXH32_round(v3, XXH_get32bits(p)); p+=4;</div><div class='add'>+            v4 = XXH32_round(v4, XXH_get32bits(p)); p+=4;</div><div class='add'>+        } while (p &lt; limit);</div><div class='add'>+</div><div class='add'>+        h32 = XXH_rotl32(v1, 1)  + XXH_rotl32(v2, 7)</div><div class='add'>+            + XXH_rotl32(v3, 12) + XXH_rotl32(v4, 18);</div><div class='add'>+    } else {</div><div class='add'>+        h32  = seed + PRIME32_5;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    h32 += (U32)len;</div><div class='add'>+</div><div class='add'>+    return XXH32_finalize(h32, p, len&amp;15, endian, align);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+XXH_PUBLIC_API unsigned int XXH32 (const void* input, size_t len, unsigned int seed)</div><div class='add'>+{</div><div class='add'>+#if 0</div><div class='add'>+    /* Simple version, good for code maintenance, but unfortunately slow for small inputs */</div><div class='add'>+    XXH32_state_t state;</div><div class='add'>+    XXH32_reset(&amp;state, seed);</div><div class='add'>+    XXH32_update(&amp;state, input, len);</div><div class='add'>+    return XXH32_digest(&amp;state);</div><div class='add'>+#else</div><div class='add'>+    XXH_endianess endian_detected = (XXH_endianess)XXH_CPU_LITTLE_ENDIAN;</div><div class='add'>+</div><div class='add'>+    if (XXH_FORCE_ALIGN_CHECK) {</div><div class='add'>+        if ((((size_t)input) &amp; 3) == 0) {   /* Input is 4-bytes aligned, leverage the speed benefit */</div><div class='add'>+            if ((endian_detected==XXH_littleEndian) || XXH_FORCE_NATIVE_FORMAT)</div><div class='add'>+                return XXH32_endian_align(input, len, seed, XXH_littleEndian, XXH_aligned);</div><div class='add'>+            else</div><div class='add'>+                return XXH32_endian_align(input, len, seed, XXH_bigEndian, XXH_aligned);</div><div class='add'>+    }   }</div><div class='add'>+</div><div class='add'>+    if ((endian_detected==XXH_littleEndian) || XXH_FORCE_NATIVE_FORMAT)</div><div class='add'>+        return XXH32_endian_align(input, len, seed, XXH_littleEndian, XXH_unaligned);</div><div class='add'>+    else</div><div class='add'>+        return XXH32_endian_align(input, len, seed, XXH_bigEndian, XXH_unaligned);</div><div class='add'>+#endif</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+/*======   Hash streaming   ======*/</div><div class='add'>+</div><div class='add'>+XXH_PUBLIC_API XXH32_state_t* XXH32_createState(void)</div><div class='add'>+{</div><div class='add'>+    return (XXH32_state_t*)XXH_malloc(sizeof(XXH32_state_t));</div><div class='add'>+}</div><div class='add'>+XXH_PUBLIC_API XXH_errorcode XXH32_freeState(XXH32_state_t* statePtr)</div><div class='add'>+{</div><div class='add'>+    XXH_free(statePtr);</div><div class='add'>+    return XXH_OK;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+XXH_PUBLIC_API void XXH32_copyState(XXH32_state_t* dstState, const XXH32_state_t* srcState)</div><div class='add'>+{</div><div class='add'>+    memcpy(dstState, srcState, sizeof(*dstState));</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+XXH_PUBLIC_API XXH_errorcode XXH32_reset(XXH32_state_t* statePtr, unsigned int seed)</div><div class='add'>+{</div><div class='add'>+    XXH32_state_t state;   /* using a local state to memcpy() in order to avoid strict-aliasing warnings */</div><div class='add'>+    memset(&amp;state, 0, sizeof(state));</div><div class='add'>+    state.v1 = seed + PRIME32_1 + PRIME32_2;</div><div class='add'>+    state.v2 = seed + PRIME32_2;</div><div class='add'>+    state.v3 = seed + 0;</div><div class='add'>+    state.v4 = seed - PRIME32_1;</div><div class='add'>+    /* do not write into reserved, planned to be removed in a future version */</div><div class='add'>+    memcpy(statePtr, &amp;state, sizeof(state) - sizeof(state.reserved));</div><div class='add'>+    return XXH_OK;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+FORCE_INLINE</div><div class='add'>+XXH_errorcode XXH32_update_endian (XXH32_state_t* state, const void* input, size_t len, XXH_endianess endian)</div><div class='add'>+{</div><div class='add'>+    const BYTE* p = (const BYTE*)input;</div><div class='add'>+    const BYTE* const bEnd = p + len;</div><div class='add'>+</div><div class='add'>+    if (input==NULL)</div><div class='add'>+#if defined(XXH_ACCEPT_NULL_INPUT_POINTER) &amp;&amp; (XXH_ACCEPT_NULL_INPUT_POINTER&gt;=1)</div><div class='add'>+        return XXH_OK;</div><div class='add'>+#else</div><div class='add'>+        return XXH_ERROR;</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+    state-&gt;total_len_32 += (unsigned)len;</div><div class='add'>+    state-&gt;large_len |= (len&gt;=16) | (state-&gt;total_len_32&gt;=16);</div><div class='add'>+</div><div class='add'>+    if (state-&gt;memsize + len &lt; 16)  {   /* fill in tmp buffer */</div><div class='add'>+        XXH_memcpy((BYTE*)(state-&gt;mem32) + state-&gt;memsize, input, len);</div><div class='add'>+        state-&gt;memsize += (unsigned)len;</div><div class='add'>+        return XXH_OK;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (state-&gt;memsize) {   /* some data left from previous update */</div><div class='add'>+        XXH_memcpy((BYTE*)(state-&gt;mem32) + state-&gt;memsize, input, 16-state-&gt;memsize);</div><div class='add'>+        {   const U32* p32 = state-&gt;mem32;</div><div class='add'>+            state-&gt;v1 = XXH32_round(state-&gt;v1, XXH_readLE32(p32, endian)); p32++;</div><div class='add'>+            state-&gt;v2 = XXH32_round(state-&gt;v2, XXH_readLE32(p32, endian)); p32++;</div><div class='add'>+            state-&gt;v3 = XXH32_round(state-&gt;v3, XXH_readLE32(p32, endian)); p32++;</div><div class='add'>+            state-&gt;v4 = XXH32_round(state-&gt;v4, XXH_readLE32(p32, endian));</div><div class='add'>+        }</div><div class='add'>+        p += 16-state-&gt;memsize;</div><div class='add'>+        state-&gt;memsize = 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (p &lt;= bEnd-16) {</div><div class='add'>+        const BYTE* const limit = bEnd - 16;</div><div class='add'>+        U32 v1 = state-&gt;v1;</div><div class='add'>+        U32 v2 = state-&gt;v2;</div><div class='add'>+        U32 v3 = state-&gt;v3;</div><div class='add'>+        U32 v4 = state-&gt;v4;</div><div class='add'>+</div><div class='add'>+        do {</div><div class='add'>+            v1 = XXH32_round(v1, XXH_readLE32(p, endian)); p+=4;</div><div class='add'>+            v2 = XXH32_round(v2, XXH_readLE32(p, endian)); p+=4;</div><div class='add'>+            v3 = XXH32_round(v3, XXH_readLE32(p, endian)); p+=4;</div><div class='add'>+            v4 = XXH32_round(v4, XXH_readLE32(p, endian)); p+=4;</div><div class='add'>+        } while (p&lt;=limit);</div><div class='add'>+</div><div class='add'>+        state-&gt;v1 = v1;</div><div class='add'>+        state-&gt;v2 = v2;</div><div class='add'>+        state-&gt;v3 = v3;</div><div class='add'>+        state-&gt;v4 = v4;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (p &lt; bEnd) {</div><div class='add'>+        XXH_memcpy(state-&gt;mem32, p, (size_t)(bEnd-p));</div><div class='add'>+        state-&gt;memsize = (unsigned)(bEnd-p);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return XXH_OK;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+XXH_PUBLIC_API XXH_errorcode XXH32_update (XXH32_state_t* state_in, const void* input, size_t len)</div><div class='add'>+{</div><div class='add'>+    XXH_endianess endian_detected = (XXH_endianess)XXH_CPU_LITTLE_ENDIAN;</div><div class='add'>+</div><div class='add'>+    if ((endian_detected==XXH_littleEndian) || XXH_FORCE_NATIVE_FORMAT)</div><div class='add'>+        return XXH32_update_endian(state_in, input, len, XXH_littleEndian);</div><div class='add'>+    else</div><div class='add'>+        return XXH32_update_endian(state_in, input, len, XXH_bigEndian);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+FORCE_INLINE U32</div><div class='add'>+XXH32_digest_endian (const XXH32_state_t* state, XXH_endianess endian)</div><div class='add'>+{</div><div class='add'>+    U32 h32;</div><div class='add'>+</div><div class='add'>+    if (state-&gt;large_len) {</div><div class='add'>+        h32 = XXH_rotl32(state-&gt;v1, 1)</div><div class='add'>+            + XXH_rotl32(state-&gt;v2, 7)</div><div class='add'>+            + XXH_rotl32(state-&gt;v3, 12)</div><div class='add'>+            + XXH_rotl32(state-&gt;v4, 18);</div><div class='add'>+    } else {</div><div class='add'>+        h32 = state-&gt;v3 /* == seed */ + PRIME32_5;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    h32 += state-&gt;total_len_32;</div><div class='add'>+</div><div class='add'>+    return XXH32_finalize(h32, state-&gt;mem32, state-&gt;memsize, endian, XXH_aligned);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+XXH_PUBLIC_API unsigned int XXH32_digest (const XXH32_state_t* state_in)</div><div class='add'>+{</div><div class='add'>+    XXH_endianess endian_detected = (XXH_endianess)XXH_CPU_LITTLE_ENDIAN;</div><div class='add'>+</div><div class='add'>+    if ((endian_detected==XXH_littleEndian) || XXH_FORCE_NATIVE_FORMAT)</div><div class='add'>+        return XXH32_digest_endian(state_in, XXH_littleEndian);</div><div class='add'>+    else</div><div class='add'>+        return XXH32_digest_endian(state_in, XXH_bigEndian);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+/*======   Canonical representation   ======*/</div><div class='add'>+</div><div class='add'>+/*! Default XXH result types are basic unsigned 32 and 64 bits.</div><div class='add'>+*   The canonical representation follows human-readable write convention, aka big-endian (large digits first).</div><div class='add'>+*   These functions allow transformation of hash result into and from its canonical format.</div><div class='add'>+*   This way, hash values can be written into a file or buffer, remaining comparable across different systems.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+XXH_PUBLIC_API void XXH32_canonicalFromHash(XXH32_canonical_t* dst, XXH32_hash_t hash)</div><div class='add'>+{</div><div class='add'>+    XXH_STATIC_ASSERT(sizeof(XXH32_canonical_t) == sizeof(XXH32_hash_t));</div><div class='add'>+    if (XXH_CPU_LITTLE_ENDIAN) hash = XXH_swap32(hash);</div><div class='add'>+    memcpy(dst, &amp;hash, sizeof(*dst));</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+XXH_PUBLIC_API XXH32_hash_t XXH32_hashFromCanonical(const XXH32_canonical_t* src)</div><div class='add'>+{</div><div class='add'>+    return XXH_readBE32(src);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+#ifndef XXH_NO_LONG_LONG</div><div class='add'>+</div><div class='add'>+/* *******************************************************************</div><div class='add'>+*  64-bit hash functions</div><div class='add'>+*********************************************************************/</div><div class='add'>+</div><div class='add'>+/*======   Memory access   ======*/</div><div class='add'>+</div><div class='add'>+#ifndef MEM_MODULE</div><div class='add'>+# define MEM_MODULE</div><div class='add'>+# if !defined (__VMS) \</div><div class='add'>+  &amp;&amp; (defined (__cplusplus) \</div><div class='add'>+  || (defined (__STDC_VERSION__) &amp;&amp; (__STDC_VERSION__ &gt;= 199901L) /* C99 */) )</div><div class='add'>+#   include &lt;stdint.h&gt;</div><div class='add'>+    typedef uint64_t U64;</div><div class='add'>+# else</div><div class='add'>+    /* if compiler doesn't support unsigned long long, replace by another 64-bit type */</div><div class='add'>+    typedef unsigned long long U64;</div><div class='add'>+# endif</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+#if (defined(XXH_FORCE_MEMORY_ACCESS) &amp;&amp; (XXH_FORCE_MEMORY_ACCESS==2))</div><div class='add'>+</div><div class='add'>+/* Force direct memory access. Only works on CPU which support unaligned memory access in hardware */</div><div class='add'>+static U64 XXH_read64(const void* memPtr) { return *(const U64*) memPtr; }</div><div class='add'>+</div><div class='add'>+#elif (defined(XXH_FORCE_MEMORY_ACCESS) &amp;&amp; (XXH_FORCE_MEMORY_ACCESS==1))</div><div class='add'>+</div><div class='add'>+/* __pack instructions are safer, but compiler specific, hence potentially problematic for some compilers */</div><div class='add'>+/* currently only defined for gcc and icc */</div><div class='add'>+typedef union { U32 u32; U64 u64; } __attribute__((packed)) unalign64;</div><div class='add'>+static U64 XXH_read64(const void* ptr) { return ((const unalign64*)ptr)-&gt;u64; }</div><div class='add'>+</div><div class='add'>+#else</div><div class='add'>+</div><div class='add'>+/* portable and safe solution. Generally efficient.</div><div class='add'>+ * see : http://stackoverflow.com/a/32095106/646947</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+static U64 XXH_read64(const void* memPtr)</div><div class='add'>+{</div><div class='add'>+    U64 val;</div><div class='add'>+    memcpy(&amp;val, memPtr, sizeof(val));</div><div class='add'>+    return val;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#endif   /* XXH_FORCE_DIRECT_MEMORY_ACCESS */</div><div class='add'>+</div><div class='add'>+#if defined(_MSC_VER)     /* Visual Studio */</div><div class='add'>+#  define XXH_swap64 _byteswap_uint64</div><div class='add'>+#elif GCC_VERSION &gt;= 403</div><div class='add'>+#  define XXH_swap64 __builtin_bswap64</div><div class='add'>+#else</div><div class='add'>+static U64 XXH_swap64 (U64 x)</div><div class='add'>+{</div><div class='add'>+    return  ((x &lt;&lt; 56) &amp; 0xff00000000000000ULL) |</div><div class='add'>+            ((x &lt;&lt; 40) &amp; 0x00ff000000000000ULL) |</div><div class='add'>+            ((x &lt;&lt; 24) &amp; 0x0000ff0000000000ULL) |</div><div class='add'>+            ((x &lt;&lt; 8)  &amp; 0x000000ff00000000ULL) |</div><div class='add'>+            ((x &gt;&gt; 8)  &amp; 0x00000000ff000000ULL) |</div><div class='add'>+            ((x &gt;&gt; 24) &amp; 0x0000000000ff0000ULL) |</div><div class='add'>+            ((x &gt;&gt; 40) &amp; 0x000000000000ff00ULL) |</div><div class='add'>+            ((x &gt;&gt; 56) &amp; 0x00000000000000ffULL);</div><div class='add'>+}</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+FORCE_INLINE U64 XXH_readLE64_align(const void* ptr, XXH_endianess endian, XXH_alignment align)</div><div class='add'>+{</div><div class='add'>+    if (align==XXH_unaligned)</div><div class='add'>+        return endian==XXH_littleEndian ? XXH_read64(ptr) : XXH_swap64(XXH_read64(ptr));</div><div class='add'>+    else</div><div class='add'>+        return endian==XXH_littleEndian ? *(const U64*)ptr : XXH_swap64(*(const U64*)ptr);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+FORCE_INLINE U64 XXH_readLE64(const void* ptr, XXH_endianess endian)</div><div class='add'>+{</div><div class='add'>+    return XXH_readLE64_align(ptr, endian, XXH_unaligned);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static U64 XXH_readBE64(const void* ptr)</div><div class='add'>+{</div><div class='add'>+    return XXH_CPU_LITTLE_ENDIAN ? XXH_swap64(XXH_read64(ptr)) : XXH_read64(ptr);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+/*======   xxh64   ======*/</div><div class='add'>+</div><div class='add'>+static const U64 PRIME64_1 = 11400714785074694791ULL;</div><div class='add'>+static const U64 PRIME64_2 = 14029467366897019727ULL;</div><div class='add'>+static const U64 PRIME64_3 =  1609587929392839161ULL;</div><div class='add'>+static const U64 PRIME64_4 =  9650029242287828579ULL;</div><div class='add'>+static const U64 PRIME64_5 =  2870177450012600261ULL;</div><div class='add'>+</div><div class='add'>+static U64 XXH64_round(U64 acc, U64 input)</div><div class='add'>+{</div><div class='add'>+    acc += input * PRIME64_2;</div><div class='add'>+    acc  = XXH_rotl64(acc, 31);</div><div class='add'>+    acc *= PRIME64_1;</div><div class='add'>+    return acc;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static U64 XXH64_mergeRound(U64 acc, U64 val)</div><div class='add'>+{</div><div class='add'>+    val  = XXH64_round(0, val);</div><div class='add'>+    acc ^= val;</div><div class='add'>+    acc  = acc * PRIME64_1 + PRIME64_4;</div><div class='add'>+    return acc;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static U64 XXH64_avalanche(U64 h64)</div><div class='add'>+{</div><div class='add'>+    h64 ^= h64 &gt;&gt; 33;</div><div class='add'>+    h64 *= PRIME64_2;</div><div class='add'>+    h64 ^= h64 &gt;&gt; 29;</div><div class='add'>+    h64 *= PRIME64_3;</div><div class='add'>+    h64 ^= h64 &gt;&gt; 32;</div><div class='add'>+    return h64;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+#define XXH_get64bits(p) XXH_readLE64_align(p, endian, align)</div><div class='add'>+</div><div class='add'>+static U64</div><div class='add'>+XXH64_finalize(U64 h64, const void* ptr, size_t len,</div><div class='add'>+               XXH_endianess endian, XXH_alignment align)</div><div class='add'>+{</div><div class='add'>+    const BYTE* p = (const BYTE*)ptr;</div><div class='add'>+</div><div class='add'>+#define PROCESS1_64          \</div><div class='add'>+    h64 ^= (*p) * PRIME64_5; \</div><div class='add'>+    p++;                     \</div><div class='add'>+    h64 = XXH_rotl64(h64, 11) * PRIME64_1;</div><div class='add'>+</div><div class='add'>+#define PROCESS4_64          \</div><div class='add'>+    h64 ^= (U64)(XXH_get32bits(p)) * PRIME64_1; \</div><div class='add'>+    p+=4;                    \</div><div class='add'>+    h64 = XXH_rotl64(h64, 23) * PRIME64_2 + PRIME64_3;</div><div class='add'>+</div><div class='add'>+#define PROCESS8_64 {        \</div><div class='add'>+    U64 const k1 = XXH64_round(0, XXH_get64bits(p)); \</div><div class='add'>+    p+=8;                    \</div><div class='add'>+    h64 ^= k1;               \</div><div class='add'>+    h64  = XXH_rotl64(h64,27) * PRIME64_1 + PRIME64_4; \</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+    switch(len&amp;31) {</div><div class='add'>+      case 24: PROCESS8_64;</div><div class='add'>+                    /* fallthrough */</div><div class='add'>+      case 16: PROCESS8_64;</div><div class='add'>+                    /* fallthrough */</div><div class='add'>+      case  8: PROCESS8_64;</div><div class='add'>+               return XXH64_avalanche(h64);</div><div class='add'>+</div><div class='add'>+      case 28: PROCESS8_64;</div><div class='add'>+                    /* fallthrough */</div><div class='add'>+      case 20: PROCESS8_64;</div><div class='add'>+                    /* fallthrough */</div><div class='add'>+      case 12: PROCESS8_64;</div><div class='add'>+                    /* fallthrough */</div><div class='add'>+      case  4: PROCESS4_64;</div><div class='add'>+               return XXH64_avalanche(h64);</div><div class='add'>+</div><div class='add'>+      case 25: PROCESS8_64;</div><div class='add'>+                    /* fallthrough */</div><div class='add'>+      case 17: PROCESS8_64;</div><div class='add'>+                    /* fallthrough */</div><div class='add'>+      case  9: PROCESS8_64;</div><div class='add'>+               PROCESS1_64;</div><div class='add'>+               return XXH64_avalanche(h64);</div><div class='add'>+</div><div class='add'>+      case 29: PROCESS8_64;</div><div class='add'>+                    /* fallthrough */</div><div class='add'>+      case 21: PROCESS8_64;</div><div class='add'>+                    /* fallthrough */</div><div class='add'>+      case 13: PROCESS8_64;</div><div class='add'>+                    /* fallthrough */</div><div class='add'>+      case  5: PROCESS4_64;</div><div class='add'>+               PROCESS1_64;</div><div class='add'>+               return XXH64_avalanche(h64);</div><div class='add'>+</div><div class='add'>+      case 26: PROCESS8_64;</div><div class='add'>+                    /* fallthrough */</div><div class='add'>+      case 18: PROCESS8_64;</div><div class='add'>+                    /* fallthrough */</div><div class='add'>+      case 10: PROCESS8_64;</div><div class='add'>+               PROCESS1_64;</div><div class='add'>+               PROCESS1_64;</div><div class='add'>+               return XXH64_avalanche(h64);</div><div class='add'>+</div><div class='add'>+      case 30: PROCESS8_64;</div><div class='add'>+                    /* fallthrough */</div><div class='add'>+      case 22: PROCESS8_64;</div><div class='add'>+                    /* fallthrough */</div><div class='add'>+      case 14: PROCESS8_64;</div><div class='add'>+                    /* fallthrough */</div><div class='add'>+      case  6: PROCESS4_64;</div><div class='add'>+               PROCESS1_64;</div><div class='add'>+               PROCESS1_64;</div><div class='add'>+               return XXH64_avalanche(h64);</div><div class='add'>+</div><div class='add'>+      case 27: PROCESS8_64;</div><div class='add'>+                    /* fallthrough */</div><div class='add'>+      case 19: PROCESS8_64;</div><div class='add'>+                    /* fallthrough */</div><div class='add'>+      case 11: PROCESS8_64;</div><div class='add'>+               PROCESS1_64;</div><div class='add'>+               PROCESS1_64;</div><div class='add'>+               PROCESS1_64;</div><div class='add'>+               return XXH64_avalanche(h64);</div><div class='add'>+</div><div class='add'>+      case 31: PROCESS8_64;</div><div class='add'>+                    /* fallthrough */</div><div class='add'>+      case 23: PROCESS8_64;</div><div class='add'>+                    /* fallthrough */</div><div class='add'>+      case 15: PROCESS8_64;</div><div class='add'>+                    /* fallthrough */</div><div class='add'>+      case  7: PROCESS4_64;</div><div class='add'>+                    /* fallthrough */</div><div class='add'>+      case  3: PROCESS1_64;</div><div class='add'>+                    /* fallthrough */</div><div class='add'>+      case  2: PROCESS1_64;</div><div class='add'>+                    /* fallthrough */</div><div class='add'>+      case  1: PROCESS1_64;</div><div class='add'>+                    /* fallthrough */</div><div class='add'>+      case  0: return XXH64_avalanche(h64);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* impossible to reach */</div><div class='add'>+    assert(0);</div><div class='add'>+    return 0;  /* unreachable, but some compilers complain without it */</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+FORCE_INLINE U64</div><div class='add'>+XXH64_endian_align(const void* input, size_t len, U64 seed,</div><div class='add'>+                XXH_endianess endian, XXH_alignment align)</div><div class='add'>+{</div><div class='add'>+    const BYTE* p = (const BYTE*)input;</div><div class='add'>+    const BYTE* bEnd = p + len;</div><div class='add'>+    U64 h64;</div><div class='add'>+</div><div class='add'>+#if defined(XXH_ACCEPT_NULL_INPUT_POINTER) &amp;&amp; (XXH_ACCEPT_NULL_INPUT_POINTER&gt;=1)</div><div class='add'>+    if (p==NULL) {</div><div class='add'>+        len=0;</div><div class='add'>+        bEnd=p=(const BYTE*)(size_t)32;</div><div class='add'>+    }</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+    if (len&gt;=32) {</div><div class='add'>+        const BYTE* const limit = bEnd - 32;</div><div class='add'>+        U64 v1 = seed + PRIME64_1 + PRIME64_2;</div><div class='add'>+        U64 v2 = seed + PRIME64_2;</div><div class='add'>+        U64 v3 = seed + 0;</div><div class='add'>+        U64 v4 = seed - PRIME64_1;</div><div class='add'>+</div><div class='add'>+        do {</div><div class='add'>+            v1 = XXH64_round(v1, XXH_get64bits(p)); p+=8;</div><div class='add'>+            v2 = XXH64_round(v2, XXH_get64bits(p)); p+=8;</div><div class='add'>+            v3 = XXH64_round(v3, XXH_get64bits(p)); p+=8;</div><div class='add'>+            v4 = XXH64_round(v4, XXH_get64bits(p)); p+=8;</div><div class='add'>+        } while (p&lt;=limit);</div><div class='add'>+</div><div class='add'>+        h64 = XXH_rotl64(v1, 1) + XXH_rotl64(v2, 7) + XXH_rotl64(v3, 12) + XXH_rotl64(v4, 18);</div><div class='add'>+        h64 = XXH64_mergeRound(h64, v1);</div><div class='add'>+        h64 = XXH64_mergeRound(h64, v2);</div><div class='add'>+        h64 = XXH64_mergeRound(h64, v3);</div><div class='add'>+        h64 = XXH64_mergeRound(h64, v4);</div><div class='add'>+</div><div class='add'>+    } else {</div><div class='add'>+        h64  = seed + PRIME64_5;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    h64 += (U64) len;</div><div class='add'>+</div><div class='add'>+    return XXH64_finalize(h64, p, len, endian, align);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+XXH_PUBLIC_API unsigned long long XXH64 (const void* input, size_t len, unsigned long long seed)</div><div class='add'>+{</div><div class='add'>+#if 0</div><div class='add'>+    /* Simple version, good for code maintenance, but unfortunately slow for small inputs */</div><div class='add'>+    XXH64_state_t state;</div><div class='add'>+    XXH64_reset(&amp;state, seed);</div><div class='add'>+    XXH64_update(&amp;state, input, len);</div><div class='add'>+    return XXH64_digest(&amp;state);</div><div class='add'>+#else</div><div class='add'>+    XXH_endianess endian_detected = (XXH_endianess)XXH_CPU_LITTLE_ENDIAN;</div><div class='add'>+</div><div class='add'>+    if (XXH_FORCE_ALIGN_CHECK) {</div><div class='add'>+        if ((((size_t)input) &amp; 7)==0) {  /* Input is aligned, let's leverage the speed advantage */</div><div class='add'>+            if ((endian_detected==XXH_littleEndian) || XXH_FORCE_NATIVE_FORMAT)</div><div class='add'>+                return XXH64_endian_align(input, len, seed, XXH_littleEndian, XXH_aligned);</div><div class='add'>+            else</div><div class='add'>+                return XXH64_endian_align(input, len, seed, XXH_bigEndian, XXH_aligned);</div><div class='add'>+    }   }</div><div class='add'>+</div><div class='add'>+    if ((endian_detected==XXH_littleEndian) || XXH_FORCE_NATIVE_FORMAT)</div><div class='add'>+        return XXH64_endian_align(input, len, seed, XXH_littleEndian, XXH_unaligned);</div><div class='add'>+    else</div><div class='add'>+        return XXH64_endian_align(input, len, seed, XXH_bigEndian, XXH_unaligned);</div><div class='add'>+#endif</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*======   Hash Streaming   ======*/</div><div class='add'>+</div><div class='add'>+XXH_PUBLIC_API XXH64_state_t* XXH64_createState(void)</div><div class='add'>+{</div><div class='add'>+    return (XXH64_state_t*)XXH_malloc(sizeof(XXH64_state_t));</div><div class='add'>+}</div><div class='add'>+XXH_PUBLIC_API XXH_errorcode XXH64_freeState(XXH64_state_t* statePtr)</div><div class='add'>+{</div><div class='add'>+    XXH_free(statePtr);</div><div class='add'>+    return XXH_OK;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+XXH_PUBLIC_API void XXH64_copyState(XXH64_state_t* dstState, const XXH64_state_t* srcState)</div><div class='add'>+{</div><div class='add'>+    memcpy(dstState, srcState, sizeof(*dstState));</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+XXH_PUBLIC_API XXH_errorcode XXH64_reset(XXH64_state_t* statePtr, unsigned long long seed)</div><div class='add'>+{</div><div class='add'>+    XXH64_state_t state;   /* using a local state to memcpy() in order to avoid strict-aliasing warnings */</div><div class='add'>+    memset(&amp;state, 0, sizeof(state));</div><div class='add'>+    state.v1 = seed + PRIME64_1 + PRIME64_2;</div><div class='add'>+    state.v2 = seed + PRIME64_2;</div><div class='add'>+    state.v3 = seed + 0;</div><div class='add'>+    state.v4 = seed - PRIME64_1;</div><div class='add'>+     /* do not write into reserved, planned to be removed in a future version */</div><div class='add'>+    memcpy(statePtr, &amp;state, sizeof(state) - sizeof(state.reserved));</div><div class='add'>+    return XXH_OK;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+FORCE_INLINE</div><div class='add'>+XXH_errorcode XXH64_update_endian (XXH64_state_t* state, const void* input, size_t len, XXH_endianess endian)</div><div class='add'>+{</div><div class='add'>+    const BYTE* p = (const BYTE*)input;</div><div class='add'>+    const BYTE* const bEnd = p + len;</div><div class='add'>+</div><div class='add'>+    if (input==NULL)</div><div class='add'>+#if defined(XXH_ACCEPT_NULL_INPUT_POINTER) &amp;&amp; (XXH_ACCEPT_NULL_INPUT_POINTER&gt;=1)</div><div class='add'>+        return XXH_OK;</div><div class='add'>+#else</div><div class='add'>+        return XXH_ERROR;</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+    state-&gt;total_len += len;</div><div class='add'>+</div><div class='add'>+    if (state-&gt;memsize + len &lt; 32) {  /* fill in tmp buffer */</div><div class='add'>+        XXH_memcpy(((BYTE*)state-&gt;mem64) + state-&gt;memsize, input, len);</div><div class='add'>+        state-&gt;memsize += (U32)len;</div><div class='add'>+        return XXH_OK;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (state-&gt;memsize) {   /* tmp buffer is full */</div><div class='add'>+        XXH_memcpy(((BYTE*)state-&gt;mem64) + state-&gt;memsize, input, 32-state-&gt;memsize);</div><div class='add'>+        state-&gt;v1 = XXH64_round(state-&gt;v1, XXH_readLE64(state-&gt;mem64+0, endian));</div><div class='add'>+        state-&gt;v2 = XXH64_round(state-&gt;v2, XXH_readLE64(state-&gt;mem64+1, endian));</div><div class='add'>+        state-&gt;v3 = XXH64_round(state-&gt;v3, XXH_readLE64(state-&gt;mem64+2, endian));</div><div class='add'>+        state-&gt;v4 = XXH64_round(state-&gt;v4, XXH_readLE64(state-&gt;mem64+3, endian));</div><div class='add'>+        p += 32-state-&gt;memsize;</div><div class='add'>+        state-&gt;memsize = 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (p+32 &lt;= bEnd) {</div><div class='add'>+        const BYTE* const limit = bEnd - 32;</div><div class='add'>+        U64 v1 = state-&gt;v1;</div><div class='add'>+        U64 v2 = state-&gt;v2;</div><div class='add'>+        U64 v3 = state-&gt;v3;</div><div class='add'>+        U64 v4 = state-&gt;v4;</div><div class='add'>+</div><div class='add'>+        do {</div><div class='add'>+            v1 = XXH64_round(v1, XXH_readLE64(p, endian)); p+=8;</div><div class='add'>+            v2 = XXH64_round(v2, XXH_readLE64(p, endian)); p+=8;</div><div class='add'>+            v3 = XXH64_round(v3, XXH_readLE64(p, endian)); p+=8;</div><div class='add'>+            v4 = XXH64_round(v4, XXH_readLE64(p, endian)); p+=8;</div><div class='add'>+        } while (p&lt;=limit);</div><div class='add'>+</div><div class='add'>+        state-&gt;v1 = v1;</div><div class='add'>+        state-&gt;v2 = v2;</div><div class='add'>+        state-&gt;v3 = v3;</div><div class='add'>+        state-&gt;v4 = v4;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (p &lt; bEnd) {</div><div class='add'>+        XXH_memcpy(state-&gt;mem64, p, (size_t)(bEnd-p));</div><div class='add'>+        state-&gt;memsize = (unsigned)(bEnd-p);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return XXH_OK;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+XXH_PUBLIC_API XXH_errorcode XXH64_update (XXH64_state_t* state_in, const void* input, size_t len)</div><div class='add'>+{</div><div class='add'>+    XXH_endianess endian_detected = (XXH_endianess)XXH_CPU_LITTLE_ENDIAN;</div><div class='add'>+</div><div class='add'>+    if ((endian_detected==XXH_littleEndian) || XXH_FORCE_NATIVE_FORMAT)</div><div class='add'>+        return XXH64_update_endian(state_in, input, len, XXH_littleEndian);</div><div class='add'>+    else</div><div class='add'>+        return XXH64_update_endian(state_in, input, len, XXH_bigEndian);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+FORCE_INLINE U64 XXH64_digest_endian (const XXH64_state_t* state, XXH_endianess endian)</div><div class='add'>+{</div><div class='add'>+    U64 h64;</div><div class='add'>+</div><div class='add'>+    if (state-&gt;total_len &gt;= 32) {</div><div class='add'>+        U64 const v1 = state-&gt;v1;</div><div class='add'>+        U64 const v2 = state-&gt;v2;</div><div class='add'>+        U64 const v3 = state-&gt;v3;</div><div class='add'>+        U64 const v4 = state-&gt;v4;</div><div class='add'>+</div><div class='add'>+        h64 = XXH_rotl64(v1, 1) + XXH_rotl64(v2, 7) + XXH_rotl64(v3, 12) + XXH_rotl64(v4, 18);</div><div class='add'>+        h64 = XXH64_mergeRound(h64, v1);</div><div class='add'>+        h64 = XXH64_mergeRound(h64, v2);</div><div class='add'>+        h64 = XXH64_mergeRound(h64, v3);</div><div class='add'>+        h64 = XXH64_mergeRound(h64, v4);</div><div class='add'>+    } else {</div><div class='add'>+        h64  = state-&gt;v3 /*seed*/ + PRIME64_5;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    h64 += (U64) state-&gt;total_len;</div><div class='add'>+</div><div class='add'>+    return XXH64_finalize(h64, state-&gt;mem64, (size_t)state-&gt;total_len, endian, XXH_aligned);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+XXH_PUBLIC_API unsigned long long XXH64_digest (const XXH64_state_t* state_in)</div><div class='add'>+{</div><div class='add'>+    XXH_endianess endian_detected = (XXH_endianess)XXH_CPU_LITTLE_ENDIAN;</div><div class='add'>+</div><div class='add'>+    if ((endian_detected==XXH_littleEndian) || XXH_FORCE_NATIVE_FORMAT)</div><div class='add'>+        return XXH64_digest_endian(state_in, XXH_littleEndian);</div><div class='add'>+    else</div><div class='add'>+        return XXH64_digest_endian(state_in, XXH_bigEndian);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+/*====== Canonical representation   ======*/</div><div class='add'>+</div><div class='add'>+XXH_PUBLIC_API void XXH64_canonicalFromHash(XXH64_canonical_t* dst, XXH64_hash_t hash)</div><div class='add'>+{</div><div class='add'>+    XXH_STATIC_ASSERT(sizeof(XXH64_canonical_t) == sizeof(XXH64_hash_t));</div><div class='add'>+    if (XXH_CPU_LITTLE_ENDIAN) hash = XXH_swap64(hash);</div><div class='add'>+    memcpy(dst, &amp;hash, sizeof(*dst));</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+XXH_PUBLIC_API XXH64_hash_t XXH64_hashFromCanonical(const XXH64_canonical_t* src)</div><div class='add'>+{</div><div class='add'>+    return XXH_readBE64(src);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#endif  /* XXH_NO_LONG_LONG */</div><div class='head'>diff --git a/contrib/xxhash/xxhash.h b/contrib/xxhash/xxhash.h<br/>new file mode 100644<br/>index 00000000000..d6bad943358<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/contrib/xxhash/xxhash.h?id=d1d7a6f35c816822fab51c820e25023863c239c1'>contrib/xxhash/xxhash.h</a></div><div class='hunk'>@@ -0,0 +1,328 @@</div><div class='add'>+/*</div><div class='add'>+   xxHash - Extremely Fast Hash algorithm</div><div class='add'>+   Header File</div><div class='add'>+   Copyright (C) 2012-2016, Yann Collet.</div><div class='add'>+</div><div class='add'>+   BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php)</div><div class='add'>+</div><div class='add'>+   Redistribution and use in source and binary forms, with or without</div><div class='add'>+   modification, are permitted provided that the following conditions are</div><div class='add'>+   met:</div><div class='add'>+</div><div class='add'>+       * Redistributions of source code must retain the above copyright</div><div class='add'>+   notice, this list of conditions and the following disclaimer.</div><div class='add'>+       * Redistributions in binary form must reproduce the above</div><div class='add'>+   copyright notice, this list of conditions and the following disclaimer</div><div class='add'>+   in the documentation and/or other materials provided with the</div><div class='add'>+   distribution.</div><div class='add'>+</div><div class='add'>+   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS</div><div class='add'>+   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT</div><div class='add'>+   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR</div><div class='add'>+   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT</div><div class='add'>+   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,</div><div class='add'>+   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT</div><div class='add'>+   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,</div><div class='add'>+   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY</div><div class='add'>+   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT</div><div class='add'>+   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE</div><div class='add'>+   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.</div><div class='add'>+</div><div class='add'>+   You can contact the author at :</div><div class='add'>+   - xxHash source repository : https://github.com/Cyan4973/xxHash</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+/* Notice extracted from xxHash homepage :</div><div class='add'>+</div><div class='add'>+xxHash is an extremely fast Hash algorithm, running at RAM speed limits.</div><div class='add'>+It also successfully passes all tests from the SMHasher suite.</div><div class='add'>+</div><div class='add'>+Comparison (single thread, Windows Seven 32 bits, using SMHasher on a Core 2 Duo @3GHz)</div><div class='add'>+</div><div class='add'>+Name            Speed       Q.Score   Author</div><div class='add'>+xxHash          5.4 GB/s     10</div><div class='add'>+CrapWow         3.2 GB/s      2       Andrew</div><div class='add'>+MumurHash 3a    2.7 GB/s     10       Austin Appleby</div><div class='add'>+SpookyHash      2.0 GB/s     10       Bob Jenkins</div><div class='add'>+SBox            1.4 GB/s      9       Bret Mulvey</div><div class='add'>+Lookup3         1.2 GB/s      9       Bob Jenkins</div><div class='add'>+SuperFastHash   1.2 GB/s      1       Paul Hsieh</div><div class='add'>+CityHash64      1.05 GB/s    10       Pike &amp; Alakuijala</div><div class='add'>+FNV             0.55 GB/s     5       Fowler, Noll, Vo</div><div class='add'>+CRC32           0.43 GB/s     9</div><div class='add'>+MD5-32          0.33 GB/s    10       Ronald L. Rivest</div><div class='add'>+SHA1-32         0.28 GB/s    10</div><div class='add'>+</div><div class='add'>+Q.Score is a measure of quality of the hash function.</div><div class='add'>+It depends on successfully passing SMHasher test set.</div><div class='add'>+10 is a perfect score.</div><div class='add'>+</div><div class='add'>+A 64-bit version, named XXH64, is available since r35.</div><div class='add'>+It offers much better speed, but for 64-bit applications only.</div><div class='add'>+Name     Speed on 64 bits    Speed on 32 bits</div><div class='add'>+XXH64       13.8 GB/s            1.9 GB/s</div><div class='add'>+XXH32        6.8 GB/s            6.0 GB/s</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#ifndef XXHASH_H_5627135585666179</div><div class='add'>+#define XXHASH_H_5627135585666179 1</div><div class='add'>+</div><div class='add'>+#if defined (__cplusplus)</div><div class='add'>+extern "C" {</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+/* ****************************</div><div class='add'>+*  Definitions</div><div class='add'>+******************************/</div><div class='add'>+#include &lt;stddef.h&gt;   /* size_t */</div><div class='add'>+typedef enum { XXH_OK=0, XXH_ERROR } XXH_errorcode;</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+/* ****************************</div><div class='add'>+ *  API modifier</div><div class='add'>+ ******************************/</div><div class='add'>+/** XXH_INLINE_ALL (and XXH_PRIVATE_API)</div><div class='add'>+ *  This is useful to include xxhash functions in `static` mode</div><div class='add'>+ *  in order to inline them, and remove their symbol from the public list.</div><div class='add'>+ *  Inlining can offer dramatic performance improvement on small keys.</div><div class='add'>+ *  Methodology :</div><div class='add'>+ *     #define XXH_INLINE_ALL</div><div class='add'>+ *     #include "xxhash.h"</div><div class='add'>+ * `xxhash.c` is automatically included.</div><div class='add'>+ *  It's not useful to compile and link it as a separate module.</div><div class='add'>+ */</div><div class='add'>+#if defined(XXH_INLINE_ALL) || defined(XXH_PRIVATE_API)</div><div class='add'>+#  ifndef XXH_STATIC_LINKING_ONLY</div><div class='add'>+#    define XXH_STATIC_LINKING_ONLY</div><div class='add'>+#  endif</div><div class='add'>+#  if defined(__GNUC__)</div><div class='add'>+#    define XXH_PUBLIC_API static __inline __attribute__((unused))</div><div class='add'>+#  elif defined (__cplusplus) || (defined (__STDC_VERSION__) &amp;&amp; (__STDC_VERSION__ &gt;= 199901L) /* C99 */)</div><div class='add'>+#    define XXH_PUBLIC_API static inline</div><div class='add'>+#  elif defined(_MSC_VER)</div><div class='add'>+#    define XXH_PUBLIC_API static __inline</div><div class='add'>+#  else</div><div class='add'>+     /* this version may generate warnings for unused static functions */</div><div class='add'>+#    define XXH_PUBLIC_API static</div><div class='add'>+#  endif</div><div class='add'>+#else</div><div class='add'>+#  define XXH_PUBLIC_API   /* do nothing */</div><div class='add'>+#endif /* XXH_INLINE_ALL || XXH_PRIVATE_API */</div><div class='add'>+</div><div class='add'>+/*! XXH_NAMESPACE, aka Namespace Emulation :</div><div class='add'>+ *</div><div class='add'>+ * If you want to include _and expose_ xxHash functions from within your own library,</div><div class='add'>+ * but also want to avoid symbol collisions with other libraries which may also include xxHash,</div><div class='add'>+ *</div><div class='add'>+ * you can use XXH_NAMESPACE, to automatically prefix any public symbol from xxhash library</div><div class='add'>+ * with the value of XXH_NAMESPACE (therefore, avoid NULL and numeric values).</div><div class='add'>+ *</div><div class='add'>+ * Note that no change is required within the calling program as long as it includes `xxhash.h` :</div><div class='add'>+ * regular symbol name will be automatically translated by this header.</div><div class='add'>+ */</div><div class='add'>+#ifdef XXH_NAMESPACE</div><div class='add'>+#  define XXH_CAT(A,B) A##B</div><div class='add'>+#  define XXH_NAME2(A,B) XXH_CAT(A,B)</div><div class='add'>+#  define XXH_versionNumber XXH_NAME2(XXH_NAMESPACE, XXH_versionNumber)</div><div class='add'>+#  define XXH32 XXH_NAME2(XXH_NAMESPACE, XXH32)</div><div class='add'>+#  define XXH32_createState XXH_NAME2(XXH_NAMESPACE, XXH32_createState)</div><div class='add'>+#  define XXH32_freeState XXH_NAME2(XXH_NAMESPACE, XXH32_freeState)</div><div class='add'>+#  define XXH32_reset XXH_NAME2(XXH_NAMESPACE, XXH32_reset)</div><div class='add'>+#  define XXH32_update XXH_NAME2(XXH_NAMESPACE, XXH32_update)</div><div class='add'>+#  define XXH32_digest XXH_NAME2(XXH_NAMESPACE, XXH32_digest)</div><div class='add'>+#  define XXH32_copyState XXH_NAME2(XXH_NAMESPACE, XXH32_copyState)</div><div class='add'>+#  define XXH32_canonicalFromHash XXH_NAME2(XXH_NAMESPACE, XXH32_canonicalFromHash)</div><div class='add'>+#  define XXH32_hashFromCanonical XXH_NAME2(XXH_NAMESPACE, XXH32_hashFromCanonical)</div><div class='add'>+#  define XXH64 XXH_NAME2(XXH_NAMESPACE, XXH64)</div><div class='add'>+#  define XXH64_createState XXH_NAME2(XXH_NAMESPACE, XXH64_createState)</div><div class='add'>+#  define XXH64_freeState XXH_NAME2(XXH_NAMESPACE, XXH64_freeState)</div><div class='add'>+#  define XXH64_reset XXH_NAME2(XXH_NAMESPACE, XXH64_reset)</div><div class='add'>+#  define XXH64_update XXH_NAME2(XXH_NAMESPACE, XXH64_update)</div><div class='add'>+#  define XXH64_digest XXH_NAME2(XXH_NAMESPACE, XXH64_digest)</div><div class='add'>+#  define XXH64_copyState XXH_NAME2(XXH_NAMESPACE, XXH64_copyState)</div><div class='add'>+#  define XXH64_canonicalFromHash XXH_NAME2(XXH_NAMESPACE, XXH64_canonicalFromHash)</div><div class='add'>+#  define XXH64_hashFromCanonical XXH_NAME2(XXH_NAMESPACE, XXH64_hashFromCanonical)</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+/* *************************************</div><div class='add'>+*  Version</div><div class='add'>+***************************************/</div><div class='add'>+#define XXH_VERSION_MAJOR    0</div><div class='add'>+#define XXH_VERSION_MINOR    6</div><div class='add'>+#define XXH_VERSION_RELEASE  5</div><div class='add'>+#define XXH_VERSION_NUMBER  (XXH_VERSION_MAJOR *100*100 + XXH_VERSION_MINOR *100 + XXH_VERSION_RELEASE)</div><div class='add'>+XXH_PUBLIC_API unsigned XXH_versionNumber (void);</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+/*-**********************************************************************</div><div class='add'>+*  32-bit hash</div><div class='add'>+************************************************************************/</div><div class='add'>+typedef unsigned int XXH32_hash_t;</div><div class='add'>+</div><div class='add'>+/*! XXH32() :</div><div class='add'>+    Calculate the 32-bit hash of sequence "length" bytes stored at memory address "input".</div><div class='add'>+    The memory between input &amp; input+length must be valid (allocated and read-accessible).</div><div class='add'>+    "seed" can be used to alter the result predictably.</div><div class='add'>+    Speed on Core 2 Duo @ 3 GHz (single thread, SMHasher benchmark) : 5.4 GB/s */</div><div class='add'>+XXH_PUBLIC_API XXH32_hash_t XXH32 (const void* input, size_t length, unsigned int seed);</div><div class='add'>+</div><div class='add'>+/*======   Streaming   ======*/</div><div class='add'>+typedef struct XXH32_state_s XXH32_state_t;   /* incomplete type */</div><div class='add'>+XXH_PUBLIC_API XXH32_state_t* XXH32_createState(void);</div><div class='add'>+XXH_PUBLIC_API XXH_errorcode  XXH32_freeState(XXH32_state_t* statePtr);</div><div class='add'>+XXH_PUBLIC_API void XXH32_copyState(XXH32_state_t* dst_state, const XXH32_state_t* src_state);</div><div class='add'>+</div><div class='add'>+XXH_PUBLIC_API XXH_errorcode XXH32_reset  (XXH32_state_t* statePtr, unsigned int seed);</div><div class='add'>+XXH_PUBLIC_API XXH_errorcode XXH32_update (XXH32_state_t* statePtr, const void* input, size_t length);</div><div class='add'>+XXH_PUBLIC_API XXH32_hash_t  XXH32_digest (const XXH32_state_t* statePtr);</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+ * Streaming functions generate the xxHash of an input provided in multiple segments.</div><div class='add'>+ * Note that, for small input, they are slower than single-call functions, due to state management.</div><div class='add'>+ * For small inputs, prefer `XXH32()` and `XXH64()`, which are better optimized.</div><div class='add'>+ *</div><div class='add'>+ * XXH state must first be allocated, using XXH*_createState() .</div><div class='add'>+ *</div><div class='add'>+ * Start a new hash by initializing state with a seed, using XXH*_reset().</div><div class='add'>+ *</div><div class='add'>+ * Then, feed the hash state by calling XXH*_update() as many times as necessary.</div><div class='add'>+ * The function returns an error code, with 0 meaning OK, and any other value meaning there is an error.</div><div class='add'>+ *</div><div class='add'>+ * Finally, a hash value can be produced anytime, by using XXH*_digest().</div><div class='add'>+ * This function returns the nn-bits hash as an int or long long.</div><div class='add'>+ *</div><div class='add'>+ * It's still possible to continue inserting input into the hash state after a digest,</div><div class='add'>+ * and generate some new hashes later on, by calling again XXH*_digest().</div><div class='add'>+ *</div><div class='add'>+ * When done, free XXH state space if it was allocated dynamically.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+/*======   Canonical representation   ======*/</div><div class='add'>+</div><div class='add'>+typedef struct { unsigned char digest[4]; } XXH32_canonical_t;</div><div class='add'>+XXH_PUBLIC_API void XXH32_canonicalFromHash(XXH32_canonical_t* dst, XXH32_hash_t hash);</div><div class='add'>+XXH_PUBLIC_API XXH32_hash_t XXH32_hashFromCanonical(const XXH32_canonical_t* src);</div><div class='add'>+</div><div class='add'>+/* Default result type for XXH functions are primitive unsigned 32 and 64 bits.</div><div class='add'>+ * The canonical representation uses human-readable write convention, aka big-endian (large digits first).</div><div class='add'>+ * These functions allow transformation of hash result into and from its canonical format.</div><div class='add'>+ * This way, hash values can be written into a file / memory, and remain comparable on different systems and programs.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+#ifndef XXH_NO_LONG_LONG</div><div class='add'>+/*-**********************************************************************</div><div class='add'>+*  64-bit hash</div><div class='add'>+************************************************************************/</div><div class='add'>+typedef unsigned long long XXH64_hash_t;</div><div class='add'>+</div><div class='add'>+/*! XXH64() :</div><div class='add'>+    Calculate the 64-bit hash of sequence of length "len" stored at memory address "input".</div><div class='add'>+    "seed" can be used to alter the result predictably.</div><div class='add'>+    This function runs faster on 64-bit systems, but slower on 32-bit systems (see benchmark).</div><div class='add'>+*/</div><div class='add'>+XXH_PUBLIC_API XXH64_hash_t XXH64 (const void* input, size_t length, unsigned long long seed);</div><div class='add'>+</div><div class='add'>+/*======   Streaming   ======*/</div><div class='add'>+typedef struct XXH64_state_s XXH64_state_t;   /* incomplete type */</div><div class='add'>+XXH_PUBLIC_API XXH64_state_t* XXH64_createState(void);</div><div class='add'>+XXH_PUBLIC_API XXH_errorcode  XXH64_freeState(XXH64_state_t* statePtr);</div><div class='add'>+XXH_PUBLIC_API void XXH64_copyState(XXH64_state_t* dst_state, const XXH64_state_t* src_state);</div><div class='add'>+</div><div class='add'>+XXH_PUBLIC_API XXH_errorcode XXH64_reset  (XXH64_state_t* statePtr, unsigned long long seed);</div><div class='add'>+XXH_PUBLIC_API XXH_errorcode XXH64_update (XXH64_state_t* statePtr, const void* input, size_t length);</div><div class='add'>+XXH_PUBLIC_API XXH64_hash_t  XXH64_digest (const XXH64_state_t* statePtr);</div><div class='add'>+</div><div class='add'>+/*======   Canonical representation   ======*/</div><div class='add'>+typedef struct { unsigned char digest[8]; } XXH64_canonical_t;</div><div class='add'>+XXH_PUBLIC_API void XXH64_canonicalFromHash(XXH64_canonical_t* dst, XXH64_hash_t hash);</div><div class='add'>+XXH_PUBLIC_API XXH64_hash_t XXH64_hashFromCanonical(const XXH64_canonical_t* src);</div><div class='add'>+#endif  /* XXH_NO_LONG_LONG */</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+#ifdef XXH_STATIC_LINKING_ONLY</div><div class='add'>+</div><div class='add'>+/* ================================================================================================</div><div class='add'>+   This section contains declarations which are not guaranteed to remain stable.</div><div class='add'>+   They may change in future versions, becoming incompatible with a different version of the library.</div><div class='add'>+   These declarations should only be used with static linking.</div><div class='add'>+   Never use them in association with dynamic linking !</div><div class='add'>+=================================================================================================== */</div><div class='add'>+</div><div class='add'>+/* These definitions are only present to allow</div><div class='add'>+ * static allocation of XXH state, on stack or in a struct for example.</div><div class='add'>+ * Never **ever** use members directly. */</div><div class='add'>+</div><div class='add'>+#if !defined (__VMS) \</div><div class='add'>+  &amp;&amp; (defined (__cplusplus) \</div><div class='add'>+  || (defined (__STDC_VERSION__) &amp;&amp; (__STDC_VERSION__ &gt;= 199901L) /* C99 */) )</div><div class='add'>+#   include &lt;stdint.h&gt;</div><div class='add'>+</div><div class='add'>+struct XXH32_state_s {</div><div class='add'>+   uint32_t total_len_32;</div><div class='add'>+   uint32_t large_len;</div><div class='add'>+   uint32_t v1;</div><div class='add'>+   uint32_t v2;</div><div class='add'>+   uint32_t v3;</div><div class='add'>+   uint32_t v4;</div><div class='add'>+   uint32_t mem32[4];</div><div class='add'>+   uint32_t memsize;</div><div class='add'>+   uint32_t reserved;   /* never read nor write, might be removed in a future version */</div><div class='add'>+};   /* typedef'd to XXH32_state_t */</div><div class='add'>+</div><div class='add'>+struct XXH64_state_s {</div><div class='add'>+   uint64_t total_len;</div><div class='add'>+   uint64_t v1;</div><div class='add'>+   uint64_t v2;</div><div class='add'>+   uint64_t v3;</div><div class='add'>+   uint64_t v4;</div><div class='add'>+   uint64_t mem64[4];</div><div class='add'>+   uint32_t memsize;</div><div class='add'>+   uint32_t reserved[2];          /* never read nor write, might be removed in a future version */</div><div class='add'>+};   /* typedef'd to XXH64_state_t */</div><div class='add'>+</div><div class='add'>+# else</div><div class='add'>+</div><div class='add'>+struct XXH32_state_s {</div><div class='add'>+   unsigned total_len_32;</div><div class='add'>+   unsigned large_len;</div><div class='add'>+   unsigned v1;</div><div class='add'>+   unsigned v2;</div><div class='add'>+   unsigned v3;</div><div class='add'>+   unsigned v4;</div><div class='add'>+   unsigned mem32[4];</div><div class='add'>+   unsigned memsize;</div><div class='add'>+   unsigned reserved;   /* never read nor write, might be removed in a future version */</div><div class='add'>+};   /* typedef'd to XXH32_state_t */</div><div class='add'>+</div><div class='add'>+#   ifndef XXH_NO_LONG_LONG  /* remove 64-bit support */</div><div class='add'>+struct XXH64_state_s {</div><div class='add'>+   unsigned long long total_len;</div><div class='add'>+   unsigned long long v1;</div><div class='add'>+   unsigned long long v2;</div><div class='add'>+   unsigned long long v3;</div><div class='add'>+   unsigned long long v4;</div><div class='add'>+   unsigned long long mem64[4];</div><div class='add'>+   unsigned memsize;</div><div class='add'>+   unsigned reserved[2];     /* never read nor write, might be removed in a future version */</div><div class='add'>+};   /* typedef'd to XXH64_state_t */</div><div class='add'>+#    endif</div><div class='add'>+</div><div class='add'>+# endif</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+#if defined(XXH_INLINE_ALL) || defined(XXH_PRIVATE_API)</div><div class='add'>+#  include "xxhash.c"   /* include xxhash function bodies as `static`, for inlining */</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#endif /* XXH_STATIC_LINKING_ONLY */</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+#if defined (__cplusplus)</div><div class='add'>+}</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#endif /* XXHASH_H_5627135585666179 */</div><div class='head'>diff --git a/contrib/xxhash/xxhsum.c b/contrib/xxhash/xxhsum.c<br/>new file mode 100644<br/>index 00000000000..69931f727f0<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/contrib/xxhash/xxhsum.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>contrib/xxhash/xxhsum.c</a></div><div class='hunk'>@@ -0,0 +1,1301 @@</div><div class='add'>+/*</div><div class='add'>+*  xxhsum - Command line interface for xxhash algorithms</div><div class='add'>+*  Copyright (C) Yann Collet 2012-2016</div><div class='add'>+*</div><div class='add'>+*  GPL v2 License</div><div class='add'>+*</div><div class='add'>+*  This program is free software; you can redistribute it and/or modify</div><div class='add'>+*  it under the terms of the GNU General Public License as published by</div><div class='add'>+*  the Free Software Foundation; either version 2 of the License, or</div><div class='add'>+*  (at your option) any later version.</div><div class='add'>+*</div><div class='add'>+*  This program is distributed in the hope that it will be useful,</div><div class='add'>+*  but WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='add'>+*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the</div><div class='add'>+*  GNU General Public License for more details.</div><div class='add'>+*</div><div class='add'>+*  You should have received a copy of the GNU General Public License along</div><div class='add'>+*  with this program; if not, write to the Free Software Foundation, Inc.,</div><div class='add'>+*  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.</div><div class='add'>+*</div><div class='add'>+*  You can contact the author at :</div><div class='add'>+*  - xxHash homepage : http://www.xxhash.com</div><div class='add'>+*  - xxHash source repository : https://github.com/Cyan4973/xxHash</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+/* xxhsum :</div><div class='add'>+ * Provides hash value of a file content, or a list of files, or stdin</div><div class='add'>+ * Display convention is Big Endian, for both 32 and 64 bits algorithms</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+#ifndef XXHASH_C_2097394837</div><div class='add'>+#define XXHASH_C_2097394837</div><div class='add'>+</div><div class='add'>+/* ************************************</div><div class='add'>+ *  Compiler Options</div><div class='add'>+ **************************************/</div><div class='add'>+/* MS Visual */</div><div class='add'>+#if defined(_MSC_VER) || defined(_WIN32)</div><div class='add'>+#  define _CRT_SECURE_NO_WARNINGS   /* removes visual warnings */</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+/* Under Linux at least, pull in the *64 commands */</div><div class='add'>+#ifndef _LARGEFILE64_SOURCE</div><div class='add'>+#  define _LARGEFILE64_SOURCE</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+/* ************************************</div><div class='add'>+ *  Includes</div><div class='add'>+ **************************************/</div><div class='add'>+#include &lt;stdlib.h&gt;     /* malloc, calloc, free, exit */</div><div class='add'>+#include &lt;stdio.h&gt;      /* fprintf, fopen, ftello64, fread, stdin, stdout, _fileno (when present) */</div><div class='add'>+#include &lt;string.h&gt;     /* strcmp */</div><div class='add'>+#include &lt;sys/types.h&gt;  /* stat, stat64, _stat64 */</div><div class='add'>+#include &lt;sys/stat.h&gt;   /* stat, stat64, _stat64 */</div><div class='add'>+#include &lt;time.h&gt;       /* clock_t, clock, CLOCKS_PER_SEC */</div><div class='add'>+#include &lt;assert.h&gt;     /* assert */</div><div class='add'>+</div><div class='add'>+#define XXH_STATIC_LINKING_ONLY   /* *_state_t */</div><div class='add'>+#include "xxhash.h"</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+/* ************************************</div><div class='add'>+ *  OS-Specific Includes</div><div class='add'>+ **************************************/</div><div class='add'>+#if defined(MSDOS) || defined(OS2) || defined(WIN32) || defined(_WIN32) || defined(__CYGWIN__)</div><div class='add'>+#  include &lt;fcntl.h&gt;    /* _O_BINARY */</div><div class='add'>+#  include &lt;io.h&gt;       /* _setmode, _isatty */</div><div class='add'>+#  define SET_BINARY_MODE(file) _setmode(_fileno(file), _O_BINARY)</div><div class='add'>+#  define IS_CONSOLE(stdStream) _isatty(_fileno(stdStream))</div><div class='add'>+#else</div><div class='add'>+#  include &lt;unistd.h&gt;   /* isatty, STDIN_FILENO */</div><div class='add'>+#  define SET_BINARY_MODE(file)</div><div class='add'>+#  define IS_CONSOLE(stdStream) isatty(STDIN_FILENO)</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#if !defined(S_ISREG)</div><div class='add'>+#  define S_ISREG(x) (((x) &amp; S_IFMT) == S_IFREG)</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+/* ************************************</div><div class='add'>+*  Basic Types</div><div class='add'>+**************************************/</div><div class='add'>+#ifndef MEM_MODULE</div><div class='add'>+# define MEM_MODULE</div><div class='add'>+# if defined (__STDC_VERSION__) &amp;&amp; __STDC_VERSION__ &gt;= 199901L   /* C99 */</div><div class='add'>+#   include &lt;stdint.h&gt;</div><div class='add'>+    typedef uint8_t  BYTE;</div><div class='add'>+    typedef uint16_t U16;</div><div class='add'>+    typedef uint32_t U32;</div><div class='add'>+    typedef  int32_t S32;</div><div class='add'>+    typedef uint64_t U64;</div><div class='add'>+#  else</div><div class='add'>+    typedef unsigned char      BYTE;</div><div class='add'>+    typedef unsigned short     U16;</div><div class='add'>+    typedef unsigned int       U32;</div><div class='add'>+    typedef   signed int       S32;</div><div class='add'>+    typedef unsigned long long U64;</div><div class='add'>+#  endif</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+static unsigned BMK_isLittleEndian(void)</div><div class='add'>+{</div><div class='add'>+    const union { U32 u; BYTE c[4]; } one = { 1 };   /* don't use static : performance detrimental  */</div><div class='add'>+    return one.c[0];</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+/* *************************************</div><div class='add'>+ *  Constants</div><div class='add'>+ ***************************************/</div><div class='add'>+#define LIB_VERSION XXH_VERSION_MAJOR.XXH_VERSION_MINOR.XXH_VERSION_RELEASE</div><div class='add'>+#define QUOTE(str) #str</div><div class='add'>+#define EXPAND_AND_QUOTE(str) QUOTE(str)</div><div class='add'>+#define PROGRAM_VERSION EXPAND_AND_QUOTE(LIB_VERSION)</div><div class='add'>+static const int g_nbBits = (int)(sizeof(void*)*8);</div><div class='add'>+static const char g_lename[] = "little endian";</div><div class='add'>+static const char g_bename[] = "big endian";</div><div class='add'>+#define ENDIAN_NAME (BMK_isLittleEndian() ? g_lename : g_bename)</div><div class='add'>+static const char author[] = "Yann Collet";</div><div class='add'>+#define WELCOME_MESSAGE(exename) "%s %s (%i-bits %s), by %s \n", \</div><div class='add'>+                    exename, PROGRAM_VERSION, g_nbBits, ENDIAN_NAME, author</div><div class='add'>+</div><div class='add'>+#define KB *( 1&lt;&lt;10)</div><div class='add'>+#define MB *( 1&lt;&lt;20)</div><div class='add'>+#define GB *(1U&lt;&lt;30)</div><div class='add'>+</div><div class='add'>+static size_t XXH_DEFAULT_SAMPLE_SIZE = 100 KB;</div><div class='add'>+#define NBLOOPS    3                              /* Default number of benchmark iterations */</div><div class='add'>+#define TIMELOOP_S 1</div><div class='add'>+#define TIMELOOP  (TIMELOOP_S * CLOCKS_PER_SEC)   /* Minimum timing per iteration */</div><div class='add'>+#define XXHSUM32_DEFAULT_SEED 0                   /* Default seed for algo_xxh32 */</div><div class='add'>+#define XXHSUM64_DEFAULT_SEED 0                   /* Default seed for algo_xxh64 */</div><div class='add'>+</div><div class='add'>+#define MAX_MEM    (2 GB - 64 MB)</div><div class='add'>+</div><div class='add'>+static const char stdinName[] = "-";</div><div class='add'>+typedef enum { algo_xxh32, algo_xxh64 } algoType;</div><div class='add'>+static const algoType g_defaultAlgo = algo_xxh64;    /* required within main() &amp; usage() */</div><div class='add'>+</div><div class='add'>+/* &lt;16 hex char&gt; &lt;SPC&gt; &lt;SPC&gt; &lt;filename&gt; &lt;'\0'&gt;</div><div class='add'>+ * '4096' is typical Linux PATH_MAX configuration. */</div><div class='add'>+#define DEFAULT_LINE_LENGTH (sizeof(XXH64_hash_t) * 2 + 2 + 4096 + 1)</div><div class='add'>+</div><div class='add'>+/* Maximum acceptable line length. */</div><div class='add'>+#define MAX_LINE_LENGTH (32 KB)</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+/* ************************************</div><div class='add'>+ *  Display macros</div><div class='add'>+ **************************************/</div><div class='add'>+#define DISPLAY(...)         fprintf(stderr, __VA_ARGS__)</div><div class='add'>+#define DISPLAYRESULT(...)   fprintf(stdout, __VA_ARGS__)</div><div class='add'>+#define DISPLAYLEVEL(l, ...) do { if (g_displayLevel&gt;=l) DISPLAY(__VA_ARGS__); } while (0)</div><div class='add'>+static int g_displayLevel = 2;</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+/* ************************************</div><div class='add'>+ *  Local variables</div><div class='add'>+ **************************************/</div><div class='add'>+static U32 g_nbIterations = NBLOOPS;</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+/* ************************************</div><div class='add'>+ *  Benchmark Functions</div><div class='add'>+ **************************************/</div><div class='add'>+static clock_t BMK_clockSpan( clock_t start )</div><div class='add'>+{</div><div class='add'>+    return clock() - start;   /* works even if overflow; Typical max span ~ 30 mn */</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+static size_t BMK_findMaxMem(U64 requiredMem)</div><div class='add'>+{</div><div class='add'>+    size_t const step = 64 MB;</div><div class='add'>+    void* testmem = NULL;</div><div class='add'>+</div><div class='add'>+    requiredMem = (((requiredMem &gt;&gt; 26) + 1) &lt;&lt; 26);</div><div class='add'>+    requiredMem += 2*step;</div><div class='add'>+    if (requiredMem &gt; MAX_MEM) requiredMem = MAX_MEM;</div><div class='add'>+</div><div class='add'>+    while (!testmem) {</div><div class='add'>+        if (requiredMem &gt; step) requiredMem -= step;</div><div class='add'>+        else requiredMem &gt;&gt;= 1;</div><div class='add'>+        testmem = malloc ((size_t)requiredMem);</div><div class='add'>+    }</div><div class='add'>+    free (testmem);</div><div class='add'>+</div><div class='add'>+    /* keep some space available */</div><div class='add'>+    if (requiredMem &gt; step) requiredMem -= step;</div><div class='add'>+    else requiredMem &gt;&gt;= 1;</div><div class='add'>+</div><div class='add'>+    return (size_t)requiredMem;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+static U64 BMK_GetFileSize(const char* infilename)</div><div class='add'>+{</div><div class='add'>+    int r;</div><div class='add'>+#if defined(_MSC_VER)</div><div class='add'>+    struct _stat64 statbuf;</div><div class='add'>+    r = _stat64(infilename, &amp;statbuf);</div><div class='add'>+#else</div><div class='add'>+    struct stat statbuf;</div><div class='add'>+    r = stat(infilename, &amp;statbuf);</div><div class='add'>+#endif</div><div class='add'>+    if (r || !S_ISREG(statbuf.st_mode)) return 0;   /* No good... */</div><div class='add'>+    return (U64)statbuf.st_size;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+typedef U32 (*hashFunction)(const void* buffer, size_t bufferSize, U32 seed);</div><div class='add'>+</div><div class='add'>+static U32 localXXH32(const void* buffer, size_t bufferSize, U32 seed) { return XXH32(buffer, bufferSize, seed); }</div><div class='add'>+</div><div class='add'>+static U32 localXXH64(const void* buffer, size_t bufferSize, U32 seed) { return (U32)XXH64(buffer, bufferSize, seed); }</div><div class='add'>+</div><div class='add'>+static void BMK_benchHash(hashFunction h, const char* hName, const void* buffer, size_t bufferSize)</div><div class='add'>+{</div><div class='add'>+    U32 nbh_perIteration = ((300 MB) / (bufferSize+1)) + 1;  /* first loop conservatively aims for 300 MB/s */</div><div class='add'>+    U32 iterationNb;</div><div class='add'>+    double fastestH = 100000000.;</div><div class='add'>+</div><div class='add'>+    DISPLAYLEVEL(2, "\r%70s\r", "");       /* Clean display line */</div><div class='add'>+    if (g_nbIterations&lt;1) g_nbIterations=1;</div><div class='add'>+    for (iterationNb = 1; iterationNb &lt;= g_nbIterations; iterationNb++) {</div><div class='add'>+        U32 r=0;</div><div class='add'>+        clock_t cStart;</div><div class='add'>+</div><div class='add'>+        DISPLAYLEVEL(2, "%1i-%-17.17s : %10u -&gt;\r", iterationNb, hName, (U32)bufferSize);</div><div class='add'>+        cStart = clock();</div><div class='add'>+        while (clock() == cStart);   /* starts clock() at its exact beginning */</div><div class='add'>+        cStart = clock();</div><div class='add'>+</div><div class='add'>+        {   U32 i;</div><div class='add'>+            for (i=0; i&lt;nbh_perIteration; i++)</div><div class='add'>+                r += h(buffer, bufferSize, i);</div><div class='add'>+        }</div><div class='add'>+        if (r==0) DISPLAYLEVEL(3,".\r");  /* do something with r to avoid compiler "optimizing" away hash function */</div><div class='add'>+        {   double const timeS = ((double)BMK_clockSpan(cStart) / CLOCKS_PER_SEC) / nbh_perIteration;</div><div class='add'>+            if (timeS &lt; fastestH) fastestH = timeS;</div><div class='add'>+            DISPLAYLEVEL(2, "%1i-%-17.17s : %10u -&gt; %8.0f it/s (%7.1f MB/s) \r",</div><div class='add'>+                    iterationNb, hName, (U32)bufferSize,</div><div class='add'>+                    (double)1 / fastestH,</div><div class='add'>+                    ((double)bufferSize / (1&lt;&lt;20)) / fastestH );</div><div class='add'>+        }</div><div class='add'>+        assert(fastestH &gt; 1./2000000000);  /* avoid U32 overflow */</div><div class='add'>+        nbh_perIteration = (U32)(1 / fastestH) + 1;  /* adjust nbh_perIteration to last roughtly one second */</div><div class='add'>+    }</div><div class='add'>+    DISPLAYLEVEL(1, "%-19.19s : %10u -&gt; %8.0f it/s (%7.1f MB/s) \n", hName, (U32)bufferSize,</div><div class='add'>+        (double)1 / fastestH,</div><div class='add'>+        ((double)bufferSize / (1&lt;&lt;20)) / fastestH);</div><div class='add'>+    if (g_displayLevel&lt;1)</div><div class='add'>+        DISPLAYLEVEL(0, "%u, ", (U32)((double)1 / fastestH));</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+/* BMK_benchMem():</div><div class='add'>+ * specificTest : 0 == run all tests, 1+ run only specific test</div><div class='add'>+ * buffer : is supposed 8-bytes aligned (if malloc'ed, it should be)</div><div class='add'>+ * the real allocated size of buffer is supposed to be &gt;= (bufferSize+3).</div><div class='add'>+ * @return : 0 on success, 1 if error (invalid mode selected) */</div><div class='add'>+static int BMK_benchMem(const void* buffer, size_t bufferSize, U32 specificTest)</div><div class='add'>+{</div><div class='add'>+    assert((((size_t)buffer) &amp; 8) == 0);  /* ensure alignment */</div><div class='add'>+</div><div class='add'>+    /* XXH32 bench */</div><div class='add'>+    if ((specificTest==0) | (specificTest==1))</div><div class='add'>+        BMK_benchHash(localXXH32, "XXH32", buffer, bufferSize);</div><div class='add'>+</div><div class='add'>+    /* Bench XXH32 on Unaligned input */</div><div class='add'>+    if ((specificTest==0) | (specificTest==2))</div><div class='add'>+        BMK_benchHash(localXXH32, "XXH32 unaligned", ((const char*)buffer)+1, bufferSize);</div><div class='add'>+</div><div class='add'>+    /* Bench XXH64 */</div><div class='add'>+    if ((specificTest==0) | (specificTest==3))</div><div class='add'>+        BMK_benchHash(localXXH64, "XXH64", buffer, bufferSize);</div><div class='add'>+</div><div class='add'>+    /* Bench XXH64 on Unaligned input */</div><div class='add'>+    if ((specificTest==0) | (specificTest==4))</div><div class='add'>+        BMK_benchHash(localXXH64, "XXH64 unaligned", ((const char*)buffer)+3, bufferSize);</div><div class='add'>+</div><div class='add'>+    if (specificTest &gt; 4) {</div><div class='add'>+        DISPLAY("benchmark mode invalid \n");</div><div class='add'>+        return 1;</div><div class='add'>+    }</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+static size_t BMK_selectBenchedSize(const char* fileName)</div><div class='add'>+{   U64 const inFileSize = BMK_GetFileSize(fileName);</div><div class='add'>+    size_t benchedSize = (size_t) BMK_findMaxMem(inFileSize);</div><div class='add'>+    if ((U64)benchedSize &gt; inFileSize) benchedSize = (size_t)inFileSize;</div><div class='add'>+    if (benchedSize &lt; inFileSize) {</div><div class='add'>+        DISPLAY("Not enough memory for '%s' full size; testing %i MB only...\n", fileName, (int)(benchedSize&gt;&gt;20));</div><div class='add'>+    }</div><div class='add'>+    return benchedSize;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+static int BMK_benchFiles(const char** fileNamesTable, int nbFiles, U32 specificTest)</div><div class='add'>+{</div><div class='add'>+    int result = 0;</div><div class='add'>+    int fileIdx;</div><div class='add'>+</div><div class='add'>+    for (fileIdx=0; fileIdx&lt;nbFiles; fileIdx++) {</div><div class='add'>+        const char* const inFileName = fileNamesTable[fileIdx];</div><div class='add'>+        FILE* const inFile = fopen( inFileName, "rb" );</div><div class='add'>+        size_t const benchedSize = BMK_selectBenchedSize(inFileName);</div><div class='add'>+        char* const buffer = (char*)calloc(benchedSize+16+3, 1);</div><div class='add'>+        void* const alignedBuffer = (buffer+15) - (((size_t)(buffer+15)) &amp; 0xF);  /* align on next 16 bytes */</div><div class='add'>+</div><div class='add'>+        /* Checks */</div><div class='add'>+        if ((inFile==NULL) || (inFileName==NULL)) {</div><div class='add'>+            DISPLAY("Pb opening %s\n", inFileName);</div><div class='add'>+            free(buffer);</div><div class='add'>+            return 11;</div><div class='add'>+        }</div><div class='add'>+        if(!buffer) {</div><div class='add'>+            DISPLAY("\nError: not enough memory!\n");</div><div class='add'>+            fclose(inFile);</div><div class='add'>+            return 12;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        /* Fill input buffer */</div><div class='add'>+        DISPLAYLEVEL(1, "\rLoading %s...        \n", inFileName);</div><div class='add'>+        {   size_t const readSize = fread(alignedBuffer, 1, benchedSize, inFile);</div><div class='add'>+            fclose(inFile);</div><div class='add'>+            if(readSize != benchedSize) {</div><div class='add'>+                DISPLAY("\nError: problem reading file '%s' !!    \n", inFileName);</div><div class='add'>+                free(buffer);</div><div class='add'>+                return 13;</div><div class='add'>+        }   }</div><div class='add'>+</div><div class='add'>+        /* bench */</div><div class='add'>+        result |= BMK_benchMem(alignedBuffer, benchedSize, specificTest);</div><div class='add'>+</div><div class='add'>+        free(buffer);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return result;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+static int BMK_benchInternal(size_t keySize, int specificTest)</div><div class='add'>+{</div><div class='add'>+    void* const buffer = calloc(keySize+16+3, 1);</div><div class='add'>+    void* const alignedBuffer = ((char*)buffer+15) - (((size_t)((char*)buffer+15)) &amp; 0xF);  /* align on next 16 bytes */</div><div class='add'>+    if(!buffer) {</div><div class='add'>+        DISPLAY("\nError: not enough memory!\n");</div><div class='add'>+        return 12;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* bench */</div><div class='add'>+    DISPLAYLEVEL(1, "Sample of ");</div><div class='add'>+    if (keySize &gt; 10 KB) {</div><div class='add'>+        DISPLAYLEVEL(1, "%u KB", (U32)(keySize &gt;&gt; 10));</div><div class='add'>+    } else {</div><div class='add'>+        DISPLAYLEVEL(1, "%u bytes", (U32)keySize);</div><div class='add'>+    }</div><div class='add'>+    DISPLAYLEVEL(1, "...        \n");</div><div class='add'>+</div><div class='add'>+    {   int const result = BMK_benchMem(alignedBuffer, keySize, specificTest);</div><div class='add'>+        free(buffer);</div><div class='add'>+        return result;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+static void BMK_checkResult(U32 r1, U32 r2)</div><div class='add'>+{</div><div class='add'>+    static int nbTests = 1;</div><div class='add'>+    if (r1==r2) {</div><div class='add'>+        DISPLAYLEVEL(3, "\rTest%3i : %08X == %08X   ok   ", nbTests, r1, r2);</div><div class='add'>+    } else {</div><div class='add'>+        DISPLAY("\rERROR : Test%3i : %08X &lt;&gt; %08X   !!!!!   \n", nbTests, r1, r2);</div><div class='add'>+        exit(1);</div><div class='add'>+    }</div><div class='add'>+    nbTests++;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+static void BMK_checkResult64(U64 r1, U64 r2)</div><div class='add'>+{</div><div class='add'>+    static int nbTests = 1;</div><div class='add'>+    if (r1!=r2) {</div><div class='add'>+        DISPLAY("\rERROR : Test%3i : 64-bit values non equals   !!!!!   \n", nbTests);</div><div class='add'>+        DISPLAY("\r %08X%08X != %08X%08X \n", (U32)(r1&gt;&gt;32), (U32)r1, (U32)(r2&gt;&gt;32), (U32)r2);</div><div class='add'>+        exit(1);</div><div class='add'>+    }</div><div class='add'>+    nbTests++;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+static void BMK_testSequence64(void* sentence, size_t len, U64 seed, U64 Nresult)</div><div class='add'>+{</div><div class='add'>+    XXH64_state_t state;</div><div class='add'>+    U64 Dresult;</div><div class='add'>+    size_t pos;</div><div class='add'>+</div><div class='add'>+    Dresult = XXH64(sentence, len, seed);</div><div class='add'>+    BMK_checkResult64(Dresult, Nresult);</div><div class='add'>+</div><div class='add'>+    XXH64_reset(&amp;state, seed);</div><div class='add'>+    XXH64_update(&amp;state, sentence, len);</div><div class='add'>+    Dresult = XXH64_digest(&amp;state);</div><div class='add'>+    BMK_checkResult64(Dresult, Nresult);</div><div class='add'>+</div><div class='add'>+    XXH64_reset(&amp;state, seed);</div><div class='add'>+    for (pos=0; pos&lt;len; pos++)</div><div class='add'>+        XXH64_update(&amp;state, ((char*)sentence)+pos, 1);</div><div class='add'>+    Dresult = XXH64_digest(&amp;state);</div><div class='add'>+    BMK_checkResult64(Dresult, Nresult);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+static void BMK_testSequence(const void* sequence, size_t len, U32 seed, U32 Nresult)</div><div class='add'>+{</div><div class='add'>+    XXH32_state_t state;</div><div class='add'>+    U32 Dresult;</div><div class='add'>+    size_t pos;</div><div class='add'>+</div><div class='add'>+    Dresult = XXH32(sequence, len, seed);</div><div class='add'>+    BMK_checkResult(Dresult, Nresult);</div><div class='add'>+</div><div class='add'>+    XXH32_reset(&amp;state, seed);</div><div class='add'>+    XXH32_update(&amp;state, sequence, len);</div><div class='add'>+    Dresult = XXH32_digest(&amp;state);</div><div class='add'>+    BMK_checkResult(Dresult, Nresult);</div><div class='add'>+</div><div class='add'>+    XXH32_reset(&amp;state, seed);</div><div class='add'>+    for (pos=0; pos&lt;len; pos++)</div><div class='add'>+        XXH32_update(&amp;state, ((const char*)sequence)+pos, 1);</div><div class='add'>+    Dresult = XXH32_digest(&amp;state);</div><div class='add'>+    BMK_checkResult(Dresult, Nresult);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+#define SANITY_BUFFER_SIZE 101</div><div class='add'>+static void BMK_sanityCheck(void)</div><div class='add'>+{</div><div class='add'>+    static const U32 prime = 2654435761U;</div><div class='add'>+    BYTE sanityBuffer[SANITY_BUFFER_SIZE];</div><div class='add'>+    U32 byteGen = prime;</div><div class='add'>+</div><div class='add'>+    int i;</div><div class='add'>+    for (i=0; i&lt;SANITY_BUFFER_SIZE; i++) {</div><div class='add'>+        sanityBuffer[i] = (BYTE)(byteGen&gt;&gt;24);</div><div class='add'>+        byteGen *= byteGen;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    BMK_testSequence(NULL,          0, 0,     0x02CC5D05);</div><div class='add'>+    BMK_testSequence(NULL,          0, prime, 0x36B78AE7);</div><div class='add'>+    BMK_testSequence(sanityBuffer,  1, 0,     0xB85CBEE5);</div><div class='add'>+    BMK_testSequence(sanityBuffer,  1, prime, 0xD5845D64);</div><div class='add'>+    BMK_testSequence(sanityBuffer, 14, 0,     0xE5AA0AB4);</div><div class='add'>+    BMK_testSequence(sanityBuffer, 14, prime, 0x4481951D);</div><div class='add'>+    BMK_testSequence(sanityBuffer, SANITY_BUFFER_SIZE, 0,     0x1F1AA412);</div><div class='add'>+    BMK_testSequence(sanityBuffer, SANITY_BUFFER_SIZE, prime, 0x498EC8E2);</div><div class='add'>+</div><div class='add'>+    BMK_testSequence64(NULL        ,  0, 0,     0xEF46DB3751D8E999ULL);</div><div class='add'>+    BMK_testSequence64(NULL        ,  0, prime, 0xAC75FDA2929B17EFULL);</div><div class='add'>+    BMK_testSequence64(sanityBuffer,  1, 0,     0x4FCE394CC88952D8ULL);</div><div class='add'>+    BMK_testSequence64(sanityBuffer,  1, prime, 0x739840CB819FA723ULL);</div><div class='add'>+    BMK_testSequence64(sanityBuffer, 14, 0,     0xCFFA8DB881BC3A3DULL);</div><div class='add'>+    BMK_testSequence64(sanityBuffer, 14, prime, 0x5B9611585EFCC9CBULL);</div><div class='add'>+    BMK_testSequence64(sanityBuffer, SANITY_BUFFER_SIZE, 0,     0x0EAB543384F878ADULL);</div><div class='add'>+    BMK_testSequence64(sanityBuffer, SANITY_BUFFER_SIZE, prime, 0xCAA65939306F1E21ULL);</div><div class='add'>+</div><div class='add'>+    DISPLAYLEVEL(3, "\r%70s\r", "");       /* Clean display line */</div><div class='add'>+    DISPLAYLEVEL(3, "Sanity check -- all tests ok\n");</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+/* ********************************************************</div><div class='add'>+*  File Hashing</div><div class='add'>+**********************************************************/</div><div class='add'>+</div><div class='add'>+static void BMK_display_LittleEndian(const void* ptr, size_t length)</div><div class='add'>+{</div><div class='add'>+    const BYTE* p = (const BYTE*)ptr;</div><div class='add'>+    size_t idx;</div><div class='add'>+    for (idx=length-1; idx&lt;length; idx--)    /* intentional underflow to negative to detect end */</div><div class='add'>+        DISPLAYRESULT("%02x", p[idx]);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void BMK_display_BigEndian(const void* ptr, size_t length)</div><div class='add'>+{</div><div class='add'>+    const BYTE* p = (const BYTE*)ptr;</div><div class='add'>+    size_t idx;</div><div class='add'>+    for (idx=0; idx&lt;length; idx++)</div><div class='add'>+        DISPLAYRESULT("%02x", p[idx]);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void BMK_hashStream(void* xxhHashValue, const algoType hashType, FILE* inFile, void* buffer, size_t blockSize)</div><div class='add'>+{</div><div class='add'>+    XXH64_state_t state64;</div><div class='add'>+    XXH32_state_t state32;</div><div class='add'>+    size_t readSize;</div><div class='add'>+</div><div class='add'>+    /* Init */</div><div class='add'>+    XXH32_reset(&amp;state32, XXHSUM32_DEFAULT_SEED);</div><div class='add'>+    XXH64_reset(&amp;state64, XXHSUM64_DEFAULT_SEED);</div><div class='add'>+</div><div class='add'>+    /* Load file &amp; update hash */</div><div class='add'>+    readSize = 1;</div><div class='add'>+    while (readSize) {</div><div class='add'>+        readSize = fread(buffer, 1, blockSize, inFile);</div><div class='add'>+        switch(hashType)</div><div class='add'>+        {</div><div class='add'>+        case algo_xxh32:</div><div class='add'>+            XXH32_update(&amp;state32, buffer, readSize);</div><div class='add'>+            break;</div><div class='add'>+        case algo_xxh64:</div><div class='add'>+            XXH64_update(&amp;state64, buffer, readSize);</div><div class='add'>+            break;</div><div class='add'>+        default:</div><div class='add'>+            break;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    switch(hashType)</div><div class='add'>+    {</div><div class='add'>+    case algo_xxh32:</div><div class='add'>+        {   U32 const h32 = XXH32_digest(&amp;state32);</div><div class='add'>+            memcpy(xxhHashValue, &amp;h32, sizeof(h32));</div><div class='add'>+            break;</div><div class='add'>+        }</div><div class='add'>+    case algo_xxh64:</div><div class='add'>+        {   U64 const h64 = XXH64_digest(&amp;state64);</div><div class='add'>+            memcpy(xxhHashValue, &amp;h64, sizeof(h64));</div><div class='add'>+            break;</div><div class='add'>+        }</div><div class='add'>+    default:</div><div class='add'>+            break;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+typedef enum { big_endian, little_endian} endianess;</div><div class='add'>+</div><div class='add'>+static int BMK_hash(const char* fileName,</div><div class='add'>+                    const algoType hashType,</div><div class='add'>+                    const endianess displayEndianess)</div><div class='add'>+{</div><div class='add'>+    FILE*  inFile;</div><div class='add'>+    size_t const blockSize = 64 KB;</div><div class='add'>+    void*  buffer;</div><div class='add'>+    U32    h32 = 0;</div><div class='add'>+    U64    h64 = 0;</div><div class='add'>+</div><div class='add'>+    /* Check file existence */</div><div class='add'>+    if (fileName == stdinName) {</div><div class='add'>+        inFile = stdin;</div><div class='add'>+        SET_BINARY_MODE(stdin);</div><div class='add'>+    }</div><div class='add'>+    else</div><div class='add'>+        inFile = fopen( fileName, "rb" );</div><div class='add'>+    if (inFile==NULL) {</div><div class='add'>+        DISPLAY( "Pb opening %s\n", fileName);</div><div class='add'>+        return 1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Memory allocation &amp; restrictions */</div><div class='add'>+    buffer = malloc(blockSize);</div><div class='add'>+    if(!buffer) {</div><div class='add'>+        DISPLAY("\nError: not enough memory!\n");</div><div class='add'>+        fclose(inFile);</div><div class='add'>+        return 1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* loading notification */</div><div class='add'>+    {   const size_t fileNameSize = strlen(fileName);</div><div class='add'>+        const char* const fileNameEnd = fileName + fileNameSize;</div><div class='add'>+        const int maxInfoFilenameSize = (int)(fileNameSize &gt; 30 ? 30 : fileNameSize);</div><div class='add'>+        int infoFilenameSize = 1;</div><div class='add'>+        while ((infoFilenameSize &lt; maxInfoFilenameSize)</div><div class='add'>+            &amp;&amp; (fileNameEnd[-1-infoFilenameSize] != '/')</div><div class='add'>+            &amp;&amp; (fileNameEnd[-1-infoFilenameSize] != '\\') )</div><div class='add'>+              infoFilenameSize++;</div><div class='add'>+        DISPLAY("\rLoading %s...  \r", fileNameEnd - infoFilenameSize);</div><div class='add'>+</div><div class='add'>+        /* Load file &amp; update hash */</div><div class='add'>+        switch(hashType)</div><div class='add'>+        {</div><div class='add'>+        case algo_xxh32:</div><div class='add'>+            BMK_hashStream(&amp;h32, algo_xxh32, inFile, buffer, blockSize);</div><div class='add'>+            break;</div><div class='add'>+        case algo_xxh64:</div><div class='add'>+            BMK_hashStream(&amp;h64, algo_xxh64, inFile, buffer, blockSize);</div><div class='add'>+            break;</div><div class='add'>+        default:</div><div class='add'>+            break;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        fclose(inFile);</div><div class='add'>+        free(buffer);</div><div class='add'>+        DISPLAY("%s             \r", fileNameEnd - infoFilenameSize);  /* erase line */</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* display Hash */</div><div class='add'>+    switch(hashType)</div><div class='add'>+    {</div><div class='add'>+    case algo_xxh32:</div><div class='add'>+        {   XXH32_canonical_t hcbe32;</div><div class='add'>+            XXH32_canonicalFromHash(&amp;hcbe32, h32);</div><div class='add'>+            displayEndianess==big_endian ?</div><div class='add'>+                BMK_display_BigEndian(&amp;hcbe32, sizeof(hcbe32)) : BMK_display_LittleEndian(&amp;hcbe32, sizeof(hcbe32));</div><div class='add'>+            DISPLAYRESULT("  %s\n", fileName);</div><div class='add'>+            break;</div><div class='add'>+        }</div><div class='add'>+    case algo_xxh64:</div><div class='add'>+        {   XXH64_canonical_t hcbe64;</div><div class='add'>+            XXH64_canonicalFromHash(&amp;hcbe64, h64);</div><div class='add'>+            displayEndianess==big_endian ?</div><div class='add'>+                BMK_display_BigEndian(&amp;hcbe64, sizeof(hcbe64)) : BMK_display_LittleEndian(&amp;hcbe64, sizeof(hcbe64));</div><div class='add'>+            DISPLAYRESULT("  %s\n", fileName);</div><div class='add'>+            break;</div><div class='add'>+        }</div><div class='add'>+    default:</div><div class='add'>+            break;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+static int BMK_hashFiles(const char** fnList, int fnTotal,</div><div class='add'>+                         algoType hashType, endianess displayEndianess)</div><div class='add'>+{</div><div class='add'>+    int fnNb;</div><div class='add'>+    int result = 0;</div><div class='add'>+</div><div class='add'>+    if (fnTotal==0)</div><div class='add'>+        return BMK_hash(stdinName, hashType, displayEndianess);</div><div class='add'>+</div><div class='add'>+    for (fnNb=0; fnNb&lt;fnTotal; fnNb++)</div><div class='add'>+        result += BMK_hash(fnList[fnNb], hashType, displayEndianess);</div><div class='add'>+    DISPLAY("\r%70s\r", "");</div><div class='add'>+    return result;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+typedef enum {</div><div class='add'>+    GetLine_ok,</div><div class='add'>+    GetLine_eof,</div><div class='add'>+    GetLine_exceedMaxLineLength,</div><div class='add'>+    GetLine_outOfMemory,</div><div class='add'>+} GetLineResult;</div><div class='add'>+</div><div class='add'>+typedef enum {</div><div class='add'>+    CanonicalFromString_ok,</div><div class='add'>+    CanonicalFromString_invalidFormat,</div><div class='add'>+} CanonicalFromStringResult;</div><div class='add'>+</div><div class='add'>+typedef enum {</div><div class='add'>+    ParseLine_ok,</div><div class='add'>+    ParseLine_invalidFormat,</div><div class='add'>+} ParseLineResult;</div><div class='add'>+</div><div class='add'>+typedef enum {</div><div class='add'>+    LineStatus_hashOk,</div><div class='add'>+    LineStatus_hashFailed,</div><div class='add'>+    LineStatus_failedToOpen,</div><div class='add'>+} LineStatus;</div><div class='add'>+</div><div class='add'>+typedef union {</div><div class='add'>+    XXH32_canonical_t xxh32;</div><div class='add'>+    XXH64_canonical_t xxh64;</div><div class='add'>+} Canonical;</div><div class='add'>+</div><div class='add'>+typedef struct {</div><div class='add'>+    Canonical   canonical;</div><div class='add'>+    const char* filename;</div><div class='add'>+    int         xxhBits;    /* canonical type : 32:xxh32, 64:xxh64 */</div><div class='add'>+} ParsedLine;</div><div class='add'>+</div><div class='add'>+typedef struct {</div><div class='add'>+    unsigned long   nProperlyFormattedLines;</div><div class='add'>+    unsigned long   nImproperlyFormattedLines;</div><div class='add'>+    unsigned long   nMismatchedChecksums;</div><div class='add'>+    unsigned long   nOpenOrReadFailures;</div><div class='add'>+    unsigned long   nMixedFormatLines;</div><div class='add'>+    int             xxhBits;</div><div class='add'>+    int             quit;</div><div class='add'>+} ParseFileReport;</div><div class='add'>+</div><div class='add'>+typedef struct {</div><div class='add'>+    const char*     inFileName;</div><div class='add'>+    FILE*           inFile;</div><div class='add'>+    int             lineMax;</div><div class='add'>+    char*           lineBuf;</div><div class='add'>+    size_t          blockSize;</div><div class='add'>+    char*           blockBuf;</div><div class='add'>+    int             strictMode;</div><div class='add'>+    int             statusOnly;</div><div class='add'>+    int             warn;</div><div class='add'>+    int             quiet;</div><div class='add'>+    ParseFileReport report;</div><div class='add'>+} ParseFileArg;</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+/*  Read line from stream.</div><div class='add'>+    Returns GetLine_ok, if it reads line successfully.</div><div class='add'>+    Returns GetLine_eof, if stream reaches EOF.</div><div class='add'>+    Returns GetLine_exceedMaxLineLength, if line length is longer than MAX_LINE_LENGTH.</div><div class='add'>+    Returns GetLine_outOfMemory, if line buffer memory allocation failed.</div><div class='add'>+ */</div><div class='add'>+static GetLineResult getLine(char** lineBuf, int* lineMax, FILE* inFile)</div><div class='add'>+{</div><div class='add'>+    GetLineResult result = GetLine_ok;</div><div class='add'>+    int len = 0;</div><div class='add'>+</div><div class='add'>+    if ((*lineBuf == NULL) || (*lineMax&lt;1)) {</div><div class='add'>+        free(*lineBuf);  /* in case it's != NULL */</div><div class='add'>+        *lineMax = 0;</div><div class='add'>+        *lineBuf = (char*)malloc(DEFAULT_LINE_LENGTH);</div><div class='add'>+        if(*lineBuf == NULL) return GetLine_outOfMemory;</div><div class='add'>+        *lineMax = DEFAULT_LINE_LENGTH;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    for (;;) {</div><div class='add'>+        const int c = fgetc(inFile);</div><div class='add'>+        if (c == EOF) {</div><div class='add'>+            /* If we meet EOF before first character, returns GetLine_eof,</div><div class='add'>+             * otherwise GetLine_ok.</div><div class='add'>+             */</div><div class='add'>+            if (len == 0) result = GetLine_eof;</div><div class='add'>+            break;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        /* Make enough space for len+1 (for final NUL) bytes. */</div><div class='add'>+        if (len+1 &gt;= *lineMax) {</div><div class='add'>+            char* newLineBuf = NULL;</div><div class='add'>+            int newBufSize = *lineMax;</div><div class='add'>+</div><div class='add'>+            newBufSize += (newBufSize/2) + 1; /* x 1.5 */</div><div class='add'>+            if (newBufSize &gt; MAX_LINE_LENGTH) newBufSize = MAX_LINE_LENGTH;</div><div class='add'>+            if (len+1 &gt;= newBufSize) return GetLine_exceedMaxLineLength;</div><div class='add'>+</div><div class='add'>+            newLineBuf = (char*) realloc(*lineBuf, newBufSize);</div><div class='add'>+            if (newLineBuf == NULL) return GetLine_outOfMemory;</div><div class='add'>+</div><div class='add'>+            *lineBuf = newLineBuf;</div><div class='add'>+            *lineMax = newBufSize;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        if (c == '\n') break;</div><div class='add'>+        (*lineBuf)[len++] = (char) c;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    (*lineBuf)[len] = '\0';</div><div class='add'>+    return result;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+/*  Converts one hexadecimal character to integer.</div><div class='add'>+ *  Returns -1, if given character is not hexadecimal.</div><div class='add'>+ */</div><div class='add'>+static int charToHex(char c)</div><div class='add'>+{</div><div class='add'>+    int result = -1;</div><div class='add'>+    if (c &gt;= '0' &amp;&amp; c &lt;= '9') {</div><div class='add'>+        result = (int) (c - '0');</div><div class='add'>+    } else if (c &gt;= 'A' &amp;&amp; c &lt;= 'F') {</div><div class='add'>+        result = (int) (c - 'A') + 0x0a;</div><div class='add'>+    } else if (c &gt;= 'a' &amp;&amp; c &lt;= 'f') {</div><div class='add'>+        result = (int) (c - 'a') + 0x0a;</div><div class='add'>+    }</div><div class='add'>+    return result;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+/*  Converts XXH32 canonical hexadecimal string hashStr to big endian unsigned char array dst.</div><div class='add'>+ *  Returns CANONICAL_FROM_STRING_INVALID_FORMAT, if hashStr is not well formatted.</div><div class='add'>+ *  Returns CANONICAL_FROM_STRING_OK, if hashStr is parsed successfully.</div><div class='add'>+ */</div><div class='add'>+static CanonicalFromStringResult canonicalFromString(unsigned char* dst,</div><div class='add'>+                                                     size_t dstSize,</div><div class='add'>+                                                     const char* hashStr)</div><div class='add'>+{</div><div class='add'>+    size_t i;</div><div class='add'>+    for (i = 0; i &lt; dstSize; ++i) {</div><div class='add'>+        int h0, h1;</div><div class='add'>+</div><div class='add'>+        h0 = charToHex(hashStr[i*2 + 0]);</div><div class='add'>+        if (h0 &lt; 0) return CanonicalFromString_invalidFormat;</div><div class='add'>+</div><div class='add'>+        h1 = charToHex(hashStr[i*2 + 1]);</div><div class='add'>+        if (h1 &lt; 0) return CanonicalFromString_invalidFormat;</div><div class='add'>+</div><div class='add'>+        dst[i] = (unsigned char) ((h0 &lt;&lt; 4) | h1);</div><div class='add'>+    }</div><div class='add'>+    return CanonicalFromString_ok;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+/*  Parse single line of xxHash checksum file.</div><div class='add'>+ *  Returns PARSE_LINE_ERROR_INVALID_FORMAT, if line is not well formatted.</div><div class='add'>+ *  Returns PARSE_LINE_OK if line is parsed successfully.</div><div class='add'>+ *  And members of parseLine will be filled by parsed values.</div><div class='add'>+ *</div><div class='add'>+ *  - line must be ended with '\0'.</div><div class='add'>+ *  - Since parsedLine.filename will point within given argument `line`,</div><div class='add'>+ *    users must keep `line`s content during they are using parsedLine.</div><div class='add'>+ *</div><div class='add'>+ *  Given xxHash checksum line should have the following format:</div><div class='add'>+ *</div><div class='add'>+ *      &lt;8 or 16 hexadecimal char&gt; &lt;space&gt; &lt;space&gt; &lt;filename...&gt; &lt;'\0'&gt;</div><div class='add'>+ */</div><div class='add'>+static ParseLineResult parseLine(ParsedLine* parsedLine, const char* line)</div><div class='add'>+{</div><div class='add'>+    const char* const firstSpace = strchr(line, ' ');</div><div class='add'>+    const char* const secondSpace = firstSpace + 1;</div><div class='add'>+</div><div class='add'>+    parsedLine-&gt;filename = NULL;</div><div class='add'>+    parsedLine-&gt;xxhBits = 0;</div><div class='add'>+</div><div class='add'>+    if (firstSpace == NULL || *secondSpace != ' ') return ParseLine_invalidFormat;</div><div class='add'>+</div><div class='add'>+    switch (firstSpace - line)</div><div class='add'>+    {</div><div class='add'>+    case 8:</div><div class='add'>+        {   XXH32_canonical_t* xxh32c = &amp;parsedLine-&gt;canonical.xxh32;</div><div class='add'>+            if (canonicalFromString(xxh32c-&gt;digest, sizeof(xxh32c-&gt;digest), line)</div><div class='add'>+                != CanonicalFromString_ok) {</div><div class='add'>+                return ParseLine_invalidFormat;</div><div class='add'>+            }</div><div class='add'>+            parsedLine-&gt;xxhBits = 32;</div><div class='add'>+            break;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+    case 16:</div><div class='add'>+        {   XXH64_canonical_t* xxh64c = &amp;parsedLine-&gt;canonical.xxh64;</div><div class='add'>+            if (canonicalFromString(xxh64c-&gt;digest, sizeof(xxh64c-&gt;digest), line)</div><div class='add'>+                != CanonicalFromString_ok) {</div><div class='add'>+                return ParseLine_invalidFormat;</div><div class='add'>+            }</div><div class='add'>+            parsedLine-&gt;xxhBits = 64;</div><div class='add'>+            break;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+    default:</div><div class='add'>+            return ParseLine_invalidFormat;</div><div class='add'>+            break;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    parsedLine-&gt;filename = secondSpace + 1;</div><div class='add'>+    return ParseLine_ok;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+/*!  Parse xxHash checksum file.</div><div class='add'>+ */</div><div class='add'>+static void parseFile1(ParseFileArg* parseFileArg)</div><div class='add'>+{</div><div class='add'>+    const char* const inFileName = parseFileArg-&gt;inFileName;</div><div class='add'>+    ParseFileReport* const report = &amp;parseFileArg-&gt;report;</div><div class='add'>+</div><div class='add'>+    unsigned long lineNumber = 0;</div><div class='add'>+    memset(report, 0, sizeof(*report));</div><div class='add'>+</div><div class='add'>+    while (!report-&gt;quit) {</div><div class='add'>+        FILE* fp = NULL;</div><div class='add'>+        LineStatus lineStatus = LineStatus_hashFailed;</div><div class='add'>+        GetLineResult getLineResult;</div><div class='add'>+        ParsedLine parsedLine;</div><div class='add'>+        memset(&amp;parsedLine, 0, sizeof(parsedLine));</div><div class='add'>+</div><div class='add'>+        lineNumber++;</div><div class='add'>+        if (lineNumber == 0) {</div><div class='add'>+            /* This is unlikely happen, but md5sum.c has this</div><div class='add'>+             * error check. */</div><div class='add'>+            DISPLAY("%s : too many checksum lines\n", inFileName);</div><div class='add'>+            report-&gt;quit = 1;</div><div class='add'>+            break;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        getLineResult = getLine(&amp;parseFileArg-&gt;lineBuf, &amp;parseFileArg-&gt;lineMax,</div><div class='add'>+                                parseFileArg-&gt;inFile);</div><div class='add'>+        if (getLineResult != GetLine_ok) {</div><div class='add'>+            if (getLineResult == GetLine_eof) break;</div><div class='add'>+</div><div class='add'>+            switch (getLineResult)</div><div class='add'>+            {</div><div class='add'>+            case GetLine_ok:</div><div class='add'>+            case GetLine_eof:</div><div class='add'>+                /* These cases never happen.  See above getLineResult related "if"s.</div><div class='add'>+                   They exist just for make gcc's -Wswitch-enum happy. */</div><div class='add'>+                break;</div><div class='add'>+</div><div class='add'>+            default:</div><div class='add'>+                DISPLAY("%s : %lu: unknown error\n", inFileName, lineNumber);</div><div class='add'>+                break;</div><div class='add'>+</div><div class='add'>+            case GetLine_exceedMaxLineLength:</div><div class='add'>+                DISPLAY("%s : %lu: too long line\n", inFileName, lineNumber);</div><div class='add'>+                break;</div><div class='add'>+</div><div class='add'>+            case GetLine_outOfMemory:</div><div class='add'>+                DISPLAY("%s : %lu: out of memory\n", inFileName, lineNumber);</div><div class='add'>+                break;</div><div class='add'>+            }</div><div class='add'>+            report-&gt;quit = 1;</div><div class='add'>+            break;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        if (parseLine(&amp;parsedLine, parseFileArg-&gt;lineBuf) != ParseLine_ok) {</div><div class='add'>+            report-&gt;nImproperlyFormattedLines++;</div><div class='add'>+            if (parseFileArg-&gt;warn) {</div><div class='add'>+                DISPLAY("%s : %lu: improperly formatted XXHASH checksum line\n"</div><div class='add'>+                    , inFileName, lineNumber);</div><div class='add'>+            }</div><div class='add'>+            continue;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        if (report-&gt;xxhBits != 0 &amp;&amp; report-&gt;xxhBits != parsedLine.xxhBits) {</div><div class='add'>+            /* Don't accept xxh32/xxh64 mixed file */</div><div class='add'>+            report-&gt;nImproperlyFormattedLines++;</div><div class='add'>+            report-&gt;nMixedFormatLines++;</div><div class='add'>+            if (parseFileArg-&gt;warn) {</div><div class='add'>+                DISPLAY("%s : %lu: improperly formatted XXHASH checksum line (XXH32/64)\n"</div><div class='add'>+                    , inFileName, lineNumber);</div><div class='add'>+            }</div><div class='add'>+            continue;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        report-&gt;nProperlyFormattedLines++;</div><div class='add'>+        if (report-&gt;xxhBits == 0) {</div><div class='add'>+            report-&gt;xxhBits = parsedLine.xxhBits;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        fp = fopen(parsedLine.filename, "rb");</div><div class='add'>+        if (fp == NULL) {</div><div class='add'>+            lineStatus = LineStatus_failedToOpen;</div><div class='add'>+        } else {</div><div class='add'>+            lineStatus = LineStatus_hashFailed;</div><div class='add'>+            switch (parsedLine.xxhBits)</div><div class='add'>+            {</div><div class='add'>+            case 32:</div><div class='add'>+                {   XXH32_hash_t xxh;</div><div class='add'>+                    BMK_hashStream(&amp;xxh, algo_xxh32, fp, parseFileArg-&gt;blockBuf, parseFileArg-&gt;blockSize);</div><div class='add'>+                    if (xxh == XXH32_hashFromCanonical(&amp;parsedLine.canonical.xxh32)) {</div><div class='add'>+                        lineStatus = LineStatus_hashOk;</div><div class='add'>+                }   }</div><div class='add'>+                break;</div><div class='add'>+</div><div class='add'>+            case 64:</div><div class='add'>+                {   XXH64_hash_t xxh;</div><div class='add'>+                    BMK_hashStream(&amp;xxh, algo_xxh64, fp, parseFileArg-&gt;blockBuf, parseFileArg-&gt;blockSize);</div><div class='add'>+                    if (xxh == XXH64_hashFromCanonical(&amp;parsedLine.canonical.xxh64)) {</div><div class='add'>+                        lineStatus = LineStatus_hashOk;</div><div class='add'>+                }   }</div><div class='add'>+                break;</div><div class='add'>+</div><div class='add'>+            default:</div><div class='add'>+                break;</div><div class='add'>+            }</div><div class='add'>+            fclose(fp);</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        switch (lineStatus)</div><div class='add'>+        {</div><div class='add'>+        default:</div><div class='add'>+            DISPLAY("%s : unknown error\n", inFileName);</div><div class='add'>+            report-&gt;quit = 1;</div><div class='add'>+            break;</div><div class='add'>+</div><div class='add'>+        case LineStatus_failedToOpen:</div><div class='add'>+            report-&gt;nOpenOrReadFailures++;</div><div class='add'>+            if (!parseFileArg-&gt;statusOnly) {</div><div class='add'>+                DISPLAYRESULT("%s : %lu: FAILED open or read %s\n"</div><div class='add'>+                    , inFileName, lineNumber, parsedLine.filename);</div><div class='add'>+            }</div><div class='add'>+            break;</div><div class='add'>+</div><div class='add'>+        case LineStatus_hashOk:</div><div class='add'>+        case LineStatus_hashFailed:</div><div class='add'>+            {   int b = 1;</div><div class='add'>+                if (lineStatus == LineStatus_hashOk) {</div><div class='add'>+                    /* If --quiet is specified, don't display "OK" */</div><div class='add'>+                    if (parseFileArg-&gt;quiet) b = 0;</div><div class='add'>+                } else {</div><div class='add'>+                    report-&gt;nMismatchedChecksums++;</div><div class='add'>+                }</div><div class='add'>+</div><div class='add'>+                if (b &amp;&amp; !parseFileArg-&gt;statusOnly) {</div><div class='add'>+                    DISPLAYRESULT("%s: %s\n", parsedLine.filename</div><div class='add'>+                        , lineStatus == LineStatus_hashOk ? "OK" : "FAILED");</div><div class='add'>+            }   }</div><div class='add'>+            break;</div><div class='add'>+        }</div><div class='add'>+    }   /* while (!report-&gt;quit) */</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+/*  Parse xxHash checksum file.</div><div class='add'>+ *  Returns 1, if all procedures were succeeded.</div><div class='add'>+ *  Returns 0, if any procedures was failed.</div><div class='add'>+ *</div><div class='add'>+ *  If strictMode != 0, return error code if any line is invalid.</div><div class='add'>+ *  If statusOnly != 0, don't generate any output.</div><div class='add'>+ *  If warn != 0, print a warning message to stderr.</div><div class='add'>+ *  If quiet != 0, suppress "OK" line.</div><div class='add'>+ *</div><div class='add'>+ *  "All procedures are succeeded" means:</div><div class='add'>+ *    - Checksum file contains at least one line and less than SIZE_T_MAX lines.</div><div class='add'>+ *    - All files are properly opened and read.</div><div class='add'>+ *    - All hash values match with its content.</div><div class='add'>+ *    - (strict mode) All lines in checksum file are consistent and well formatted.</div><div class='add'>+ *</div><div class='add'>+ */</div><div class='add'>+static int checkFile(const char* inFileName,</div><div class='add'>+                     const endianess displayEndianess,</div><div class='add'>+                     U32 strictMode,</div><div class='add'>+                     U32 statusOnly,</div><div class='add'>+                     U32 warn,</div><div class='add'>+                     U32 quiet)</div><div class='add'>+{</div><div class='add'>+    int result = 0;</div><div class='add'>+    FILE* inFile = NULL;</div><div class='add'>+    ParseFileArg parseFileArgBody;</div><div class='add'>+    ParseFileArg* const parseFileArg = &amp;parseFileArgBody;</div><div class='add'>+    ParseFileReport* const report = &amp;parseFileArg-&gt;report;</div><div class='add'>+</div><div class='add'>+    if (displayEndianess != big_endian) {</div><div class='add'>+        /* Don't accept little endian */</div><div class='add'>+        DISPLAY( "Check file mode doesn't support little endian\n" );</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* note : stdinName is special constant pointer.  It is not a string. */</div><div class='add'>+    if (inFileName == stdinName) {</div><div class='add'>+        /* note : Since we expect text input for xxhash -c mode,</div><div class='add'>+         * Don't set binary mode for stdin */</div><div class='add'>+        inFile = stdin;</div><div class='add'>+    } else {</div><div class='add'>+        inFile = fopen( inFileName, "rt" );</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (inFile == NULL) {</div><div class='add'>+        DISPLAY( "Pb opening %s\n", inFileName);</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    parseFileArg-&gt;inFileName    = inFileName;</div><div class='add'>+    parseFileArg-&gt;inFile        = inFile;</div><div class='add'>+    parseFileArg-&gt;lineMax       = DEFAULT_LINE_LENGTH;</div><div class='add'>+    parseFileArg-&gt;lineBuf       = (char*) malloc((size_t) parseFileArg-&gt;lineMax);</div><div class='add'>+    parseFileArg-&gt;blockSize     = 64 * 1024;</div><div class='add'>+    parseFileArg-&gt;blockBuf      = (char*) malloc(parseFileArg-&gt;blockSize);</div><div class='add'>+    parseFileArg-&gt;strictMode    = strictMode;</div><div class='add'>+    parseFileArg-&gt;statusOnly    = statusOnly;</div><div class='add'>+    parseFileArg-&gt;warn          = warn;</div><div class='add'>+    parseFileArg-&gt;quiet         = quiet;</div><div class='add'>+</div><div class='add'>+    parseFile1(parseFileArg);</div><div class='add'>+</div><div class='add'>+    free(parseFileArg-&gt;blockBuf);</div><div class='add'>+    free(parseFileArg-&gt;lineBuf);</div><div class='add'>+</div><div class='add'>+    if (inFile != stdin) fclose(inFile);</div><div class='add'>+</div><div class='add'>+    /* Show error/warning messages.  All messages are copied from md5sum.c</div><div class='add'>+     */</div><div class='add'>+    if (report-&gt;nProperlyFormattedLines == 0) {</div><div class='add'>+        DISPLAY("%s: no properly formatted XXHASH checksum lines found\n", inFileName);</div><div class='add'>+    } else if (!statusOnly) {</div><div class='add'>+        if (report-&gt;nImproperlyFormattedLines) {</div><div class='add'>+            DISPLAYRESULT("%lu lines are improperly formatted\n"</div><div class='add'>+                , report-&gt;nImproperlyFormattedLines);</div><div class='add'>+        }</div><div class='add'>+        if (report-&gt;nOpenOrReadFailures) {</div><div class='add'>+            DISPLAYRESULT("%lu listed files could not be read\n"</div><div class='add'>+                , report-&gt;nOpenOrReadFailures);</div><div class='add'>+        }</div><div class='add'>+        if (report-&gt;nMismatchedChecksums) {</div><div class='add'>+            DISPLAYRESULT("%lu computed checksums did NOT match\n"</div><div class='add'>+                , report-&gt;nMismatchedChecksums);</div><div class='add'>+    }   }</div><div class='add'>+</div><div class='add'>+    /* Result (exit) code logic is copied from</div><div class='add'>+     * gnu coreutils/src/md5sum.c digest_check() */</div><div class='add'>+    result =   report-&gt;nProperlyFormattedLines != 0</div><div class='add'>+            &amp;&amp; report-&gt;nMismatchedChecksums == 0</div><div class='add'>+            &amp;&amp; report-&gt;nOpenOrReadFailures == 0</div><div class='add'>+            &amp;&amp; (!strictMode || report-&gt;nImproperlyFormattedLines == 0)</div><div class='add'>+            &amp;&amp; report-&gt;quit == 0;</div><div class='add'>+    return result;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+static int checkFiles(const char** fnList, int fnTotal,</div><div class='add'>+                      const endianess displayEndianess,</div><div class='add'>+                      U32 strictMode,</div><div class='add'>+                      U32 statusOnly,</div><div class='add'>+                      U32 warn,</div><div class='add'>+                      U32 quiet)</div><div class='add'>+{</div><div class='add'>+    int ok = 1;</div><div class='add'>+</div><div class='add'>+    /* Special case for stdinName "-",</div><div class='add'>+     * note: stdinName is not a string.  It's special pointer. */</div><div class='add'>+    if (fnTotal==0) {</div><div class='add'>+        ok &amp;= checkFile(stdinName, displayEndianess, strictMode, statusOnly, warn, quiet);</div><div class='add'>+    } else {</div><div class='add'>+        int fnNb;</div><div class='add'>+        for (fnNb=0; fnNb&lt;fnTotal; fnNb++)</div><div class='add'>+            ok &amp;= checkFile(fnList[fnNb], displayEndianess, strictMode, statusOnly, warn, quiet);</div><div class='add'>+    }</div><div class='add'>+    return ok ? 0 : 1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+/* ********************************************************</div><div class='add'>+*  Main</div><div class='add'>+**********************************************************/</div><div class='add'>+</div><div class='add'>+static int usage(const char* exename)</div><div class='add'>+{</div><div class='add'>+    DISPLAY( WELCOME_MESSAGE(exename) );</div><div class='add'>+    DISPLAY( "Usage :\n");</div><div class='add'>+    DISPLAY( "      %s [arg] [filenames]\n", exename);</div><div class='add'>+    DISPLAY( "When no filename provided, or - provided : use stdin as input\n");</div><div class='add'>+    DISPLAY( "Arguments :\n");</div><div class='add'>+    DISPLAY( " -H# : hash selection : 0=32bits, 1=64bits (default: %i)\n", (int)g_defaultAlgo);</div><div class='add'>+    DISPLAY( " -c  : read xxHash sums from the [filenames] and check them\n");</div><div class='add'>+    DISPLAY( " -h  : help \n");</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+static int usage_advanced(const char* exename)</div><div class='add'>+{</div><div class='add'>+    usage(exename);</div><div class='add'>+    DISPLAY( "Advanced :\n");</div><div class='add'>+    DISPLAY( " --little-endian : hash printed using little endian convention (default: big endian)\n");</div><div class='add'>+    DISPLAY( " -V, --version   : display version\n");</div><div class='add'>+    DISPLAY( " -h, --help      : display long help and exit\n");</div><div class='add'>+    DISPLAY( " -b  : benchmark mode \n");</div><div class='add'>+    DISPLAY( " -i# : number of iterations (benchmark mode; default %i)\n", g_nbIterations);</div><div class='add'>+    DISPLAY( "\n");</div><div class='add'>+    DISPLAY( "The following four options are useful only when verifying checksums (-c):\n");</div><div class='add'>+    DISPLAY( "--strict : don't print OK for each successfully verified file\n");</div><div class='add'>+    DISPLAY( "--status : don't output anything, status code shows success\n");</div><div class='add'>+    DISPLAY( "--quiet  : exit non-zero for improperly formatted checksum lines\n");</div><div class='add'>+    DISPLAY( "--warn   : warn about improperly formatted checksum lines\n");</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int badusage(const char* exename)</div><div class='add'>+{</div><div class='add'>+    DISPLAY("Wrong parameters\n");</div><div class='add'>+    usage(exename);</div><div class='add'>+    return 1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*! readU32FromChar() :</div><div class='add'>+   @return : unsigned integer value read from input in `char` format,</div><div class='add'>+             0 is no figure at *stringPtr position.</div><div class='add'>+    Interprets K, KB, KiB, M, MB and MiB suffix.</div><div class='add'>+    Modifies `*stringPtr`, advancing it to position where reading stopped.</div><div class='add'>+    Note : function result can overflow if digit string &gt; MAX_UINT */</div><div class='add'>+static unsigned readU32FromChar(const char** stringPtr)</div><div class='add'>+{</div><div class='add'>+    unsigned result = 0;</div><div class='add'>+    while ((**stringPtr &gt;='0') &amp;&amp; (**stringPtr &lt;='9'))</div><div class='add'>+        result *= 10, result += **stringPtr - '0', (*stringPtr)++ ;</div><div class='add'>+    if ((**stringPtr=='K') || (**stringPtr=='M')) {</div><div class='add'>+        result &lt;&lt;= 10;</div><div class='add'>+        if (**stringPtr=='M') result &lt;&lt;= 10;</div><div class='add'>+        (*stringPtr)++ ;</div><div class='add'>+        if (**stringPtr=='i') (*stringPtr)++;</div><div class='add'>+        if (**stringPtr=='B') (*stringPtr)++;</div><div class='add'>+    }</div><div class='add'>+    return result;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int main(int argc, const char** argv)</div><div class='add'>+{</div><div class='add'>+    int i, filenamesStart = 0;</div><div class='add'>+    const char* const exename = argv[0];</div><div class='add'>+    U32 benchmarkMode = 0;</div><div class='add'>+    U32 fileCheckMode = 0;</div><div class='add'>+    U32 strictMode    = 0;</div><div class='add'>+    U32 statusOnly    = 0;</div><div class='add'>+    U32 warn          = 0;</div><div class='add'>+    U32 quiet         = 0;</div><div class='add'>+    U32 specificTest  = 0;</div><div class='add'>+    size_t keySize    = XXH_DEFAULT_SAMPLE_SIZE;</div><div class='add'>+    algoType algo     = g_defaultAlgo;</div><div class='add'>+    endianess displayEndianess = big_endian;</div><div class='add'>+</div><div class='add'>+    /* special case : xxh32sum default to 32 bits checksum */</div><div class='add'>+    if (strstr(exename, "xxh32sum") != NULL) algo = algo_xxh32;</div><div class='add'>+</div><div class='add'>+    for(i=1; i&lt;argc; i++) {</div><div class='add'>+        const char* argument = argv[i];</div><div class='add'>+</div><div class='add'>+        if(!argument) continue;   /* Protection, if argument empty */</div><div class='add'>+</div><div class='add'>+        if (!strcmp(argument, "--little-endian")) { displayEndianess = little_endian; continue; }</div><div class='add'>+        if (!strcmp(argument, "--check")) { fileCheckMode = 1; continue; }</div><div class='add'>+        if (!strcmp(argument, "--strict")) { strictMode = 1; continue; }</div><div class='add'>+        if (!strcmp(argument, "--status")) { statusOnly = 1; continue; }</div><div class='add'>+        if (!strcmp(argument, "--quiet")) { quiet = 1; continue; }</div><div class='add'>+        if (!strcmp(argument, "--warn")) { warn = 1; continue; }</div><div class='add'>+        if (!strcmp(argument, "--help")) { return usage_advanced(exename); }</div><div class='add'>+        if (!strcmp(argument, "--version")) { DISPLAY(WELCOME_MESSAGE(exename)); return 0; }</div><div class='add'>+</div><div class='add'>+        if (*argument!='-') {</div><div class='add'>+            if (filenamesStart==0) filenamesStart=i;   /* only supports a continuous list of filenames */</div><div class='add'>+            continue;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        /* command selection */</div><div class='add'>+        argument++;   /* note : *argument=='-' */</div><div class='add'>+</div><div class='add'>+        while (*argument!=0) {</div><div class='add'>+            switch(*argument)</div><div class='add'>+            {</div><div class='add'>+            /* Display version */</div><div class='add'>+            case 'V':</div><div class='add'>+                DISPLAY(WELCOME_MESSAGE(exename)); return 0;</div><div class='add'>+</div><div class='add'>+            /* Display help on usage */</div><div class='add'>+            case 'h':</div><div class='add'>+                return usage_advanced(exename);</div><div class='add'>+</div><div class='add'>+            /* select hash algorithm */</div><div class='add'>+            case 'H':</div><div class='add'>+                algo = (algoType)(argument[1] - '0');</div><div class='add'>+                argument+=2;</div><div class='add'>+                break;</div><div class='add'>+</div><div class='add'>+            /* File check mode */</div><div class='add'>+            case 'c':</div><div class='add'>+                fileCheckMode=1;</div><div class='add'>+                argument++;</div><div class='add'>+                break;</div><div class='add'>+</div><div class='add'>+            /* Warning mode (file check mode only, alias of "--warning") */</div><div class='add'>+            case 'w':</div><div class='add'>+                warn=1;</div><div class='add'>+                argument++;</div><div class='add'>+                break;</div><div class='add'>+</div><div class='add'>+            /* Trigger benchmark mode */</div><div class='add'>+            case 'b':</div><div class='add'>+                argument++;</div><div class='add'>+                benchmarkMode = 1;</div><div class='add'>+                specificTest = readU32FromChar(&amp;argument);   /* select one specific test (hidden option) */</div><div class='add'>+                break;</div><div class='add'>+</div><div class='add'>+            /* Modify Nb Iterations (benchmark only) */</div><div class='add'>+            case 'i':</div><div class='add'>+                argument++;</div><div class='add'>+                g_nbIterations = readU32FromChar(&amp;argument);</div><div class='add'>+                break;</div><div class='add'>+</div><div class='add'>+            /* Modify Block size (benchmark only) */</div><div class='add'>+            case 'B':</div><div class='add'>+                argument++;</div><div class='add'>+                keySize = readU32FromChar(&amp;argument);</div><div class='add'>+                break;</div><div class='add'>+</div><div class='add'>+            /* Modify verbosity of benchmark output (hidden option) */</div><div class='add'>+            case 'q':</div><div class='add'>+                argument++;</div><div class='add'>+                g_displayLevel--;</div><div class='add'>+                break;</div><div class='add'>+</div><div class='add'>+            default:</div><div class='add'>+                return badusage(exename);</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+    }   /* for(i=1; i&lt;argc; i++) */</div><div class='add'>+</div><div class='add'>+    /* Check benchmark mode */</div><div class='add'>+    if (benchmarkMode) {</div><div class='add'>+        DISPLAYLEVEL(2, WELCOME_MESSAGE(exename) );</div><div class='add'>+        BMK_sanityCheck();</div><div class='add'>+        if (filenamesStart==0) return BMK_benchInternal(keySize, specificTest);</div><div class='add'>+        return BMK_benchFiles(argv+filenamesStart, argc-filenamesStart, specificTest);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Check if input is defined as console; trigger an error in this case */</div><div class='add'>+    if ( (filenamesStart==0) &amp;&amp; IS_CONSOLE(stdin) ) return badusage(exename);</div><div class='add'>+</div><div class='add'>+    if (filenamesStart==0) filenamesStart = argc;</div><div class='add'>+    if (fileCheckMode) {</div><div class='add'>+        return checkFiles(argv+filenamesStart, argc-filenamesStart,</div><div class='add'>+                          displayEndianess, strictMode, statusOnly, warn, quiet);</div><div class='add'>+    } else {</div><div class='add'>+        return BMK_hashFiles(argv+filenamesStart, argc-filenamesStart, algo, displayEndianess);</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#endif /* XXHASH_C_2097394837 */</div><div class='head'>diff --git a/doc/Makefile.am b/doc/Makefile.am<br/>index 0eb348c189d..de68c20b4d7 100644<br/>--- a/<a href='/cgit/glusterfs.git/tree/doc/Makefile.am?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>doc/Makefile.am</a><br/>+++ b/<a href='/cgit/glusterfs.git/tree/doc/Makefile.am?id=d1d7a6f35c816822fab51c820e25023863c239c1'>doc/Makefile.am</a></div><div class='hunk'>@@ -1,13 +1,9 @@</div><div class='del'>-EXTRA_DIST = glusterfs.vol.sample glusterfsd.vol.sample glusterfs.8 mount.glusterfs.8\</div><div class='del'>-	porting_guide.txt authentication.txt coding-standard.pdf get_put_api_using_xattr.txt \</div><div class='del'>-	translator-options.txt mac-related-xattrs.txt replicate.pdf glusterd.vol gluster.8 \</div><div class='del'>-        glusterd.8 glusterfs-volgen.8</div><div class='add'>+EXTRA_DIST = glusterfs.8 mount.glusterfs.8 gluster.8 \</div><div class='add'>+			glusterd.8 glusterfsd.8</div><div class='ctx'> </div><div class='del'>-SUBDIRS = examples hacker-guide</div><div class='add'>+man8_MANS = glusterfs.8 mount.glusterfs.8 gluster.8</div><div class='add'>+if WITH_SERVER</div><div class='add'>+man8_MANS += glusterd.8 glusterfsd.8</div><div class='add'>+endif</div><div class='ctx'> </div><div class='del'>-voldir = $(sysconfdir)/glusterfs</div><div class='del'>-vol_DATA = glusterfs.vol.sample glusterfsd.vol.sample glusterd.vol</div><div class='del'>-</div><div class='del'>-man8_MANS = glusterfs.8 mount.glusterfs.8 gluster.8 glusterd.8 glusterfs-volgen.8</div><div class='del'>-</div><div class='del'>-CLEANFILES = </div><div class='add'>+CLEANFILES =</div><div class='head'>diff --git a/doc/README.md b/doc/README.md<br/>new file mode 100644<br/>index 00000000000..6aa28642ef4<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/doc/README.md?id=d1d7a6f35c816822fab51c820e25023863c239c1'>doc/README.md</a></div><div class='hunk'>@@ -0,0 +1,26 @@</div><div class='add'>+## Developer Guide</div><div class='add'>+</div><div class='add'>+Gluster's contributors can check about the internals by visiting [Developer Guide Section](developer-guide). While it is not 'comprehensive', it can help you to get started.</div><div class='add'>+</div><div class='add'>+Also while coding, keep [Coding Standard](developer-guide/coding-standard.md) in mind.</div><div class='add'>+</div><div class='add'>+When you are ready to commit the changes, make sure you meet our [Commit message standard](developer-guide/commit-guidelines.md).</div><div class='add'>+</div><div class='add'>+## Admin Guide ##</div><div class='add'>+</div><div class='add'>+The gluster administration guide is maintained at [github](https://github.com/gluster/glusterdocs). The browsable admin guide can be found [here](http://docs.gluster.org/en/latest/Administrator%20Guide/).</div><div class='add'>+</div><div class='add'>+The doc patch has to be sent against the above mentioned repository.</div><div class='add'>+</div><div class='add'>+## Features/Spec ##</div><div class='add'>+</div><div class='add'>+The Gluster features which are 'in progress' or implemented can be found at [github](https://github.com/gluster/glusterfs-specs).</div><div class='add'>+</div><div class='add'>+## Upgrade Guide ##</div><div class='add'>+</div><div class='add'>+The gluster upgrade guide is maintained at [github](https://github.com/gluster/glusterdocs). The browsable upgrade guide can be found [here](http://docs.gluster.org/en/latest/Upgrade-Guide)</div><div class='add'>+</div><div class='add'>+The doc patch has to be sent against the above mentioned repository.</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+For more details about the docuemntation workflow please refer [this discussion](https://www.mail-archive.com/gluster-users@gluster.org/msg21168.html)</div><div class='head'>diff --git a/doc/authentication.txt b/doc/authentication.txt<br/>deleted file mode 100644<br/>index 70aafd93334..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/doc/authentication.txt?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>doc/authentication.txt</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,112 +0,0 @@</div><div class='del'>-</div><div class='del'>-* Authentication is provided by two modules addr and login. Login based authentication uses username/password from client for authentication. Each module returns either ACCEPT, REJCET or DONT_CARE. DONT_CARE is returned if the input authentication information to the module is not concerned to its working. The theory behind authentication is that "none of the auth modules should return REJECT and atleast one of them should return ACCEPT"</div><div class='del'>-</div><div class='del'>-* Currently all the authentication related information is passed un-encrypted over the network from client to server.</div><div class='del'>-</div><div class='del'>-----------------------------------------------------------------------------------------------------</div><div class='del'>-* options provided in protocol/client:</div><div class='del'>-	* for username/password based authentication:</div><div class='del'>-	      option username &lt;username&gt;</div><div class='del'>-	      option password &lt;password&gt;</div><div class='del'>-	* client can have only one set of username/password</div><div class='del'>-	* for addr based authentication:</div><div class='del'>-	      * no options required in protocol/client. Client has to bind to privileged port (port &lt; 1024 ) which means the process in which protocol/client is loaded has to be run as root.</div><div class='del'>-</div><div class='del'>-----------------------------------------------------------------------------------------------------</div><div class='del'>-* options provided in protocol/server:</div><div class='del'>-	* for username/password based authentication:</div><div class='del'>-	      option auth.login.&lt;brick&gt;.allow [comma seperated list of usernames using which clients can connect to volume &lt;brick&gt;]</div><div class='del'>-	      option auth.login.&lt;username&gt;.password &lt;password&gt; #specify password &lt;password&gt; for username &lt;username&gt;</div><div class='del'>-	* for addr based authentication:</div><div class='del'>-	      option auth.addr.&lt;brick&gt;.allow [comma seperated list of ip-addresses/unix-paths from which clients are allowed to connect to volume &lt;brick&gt;]</div><div class='del'>-	      option auth.addr.&lt;brick&gt;.reject [comma seperated list of ip-addresses/unix-paths from which clients are not allowed to connect to volume &lt;brick&gt;]</div><div class='del'>-	* negation operator '!' is used to invert the sense of matching.</div><div class='del'>-	  Eg., option auth.addr.brick.allow !a.b.c.d #do not allow client from a.b.c.d to connect to volume brick</div><div class='del'>-	       option auth.addr.brick.reject !w.x.y.z #allow client from w.x.y.z to connect to volume brick</div><div class='del'>-	* wildcard '*' can be used to match any ip-address/unix-path</div><div class='del'>-</div><div class='del'>-----------------------------------------------------------------------------------------------------</div><div class='del'>-</div><div class='del'>-* Usecases:</div><div class='del'>-</div><div class='del'>-* username/password based authentication only</div><div class='del'>-      protocol/client:</div><div class='del'>-	option username foo</div><div class='del'>-	option password foo-password</div><div class='del'>-	option remote-subvolume foo-brick</div><div class='del'>-</div><div class='del'>-      protocol/server:</div><div class='del'>-	option auth.login.foo-brick.allow foo,who #,other users allowed to connect to foo-brick</div><div class='del'>-	option auth.login.foo.password foo-password</div><div class='del'>-	option auth.login.who.password who-password</div><div class='del'>-</div><div class='del'>-      * in protocol/server, dont specify ip from which client is connecting in auth.addr.foo-brick.reject list</div><div class='del'>-</div><div class='del'>-****************************************************************************************************</div><div class='del'>-</div><div class='del'>-* ip based authentication only</div><div class='del'>-      protocol/client:</div><div class='del'>-	option remote-subvolume foo-brick</div><div class='del'>-	* Client is connecting from a.b.c.d</div><div class='del'>-      </div><div class='del'>-      protocol/server:</div><div class='del'>-	option auth.addr.foo-brick.allow a.b.c.d,e.f.g.h,i.j.k.l #, other ip addresses from which clients are allowed to connect to foo-brick</div><div class='del'>-</div><div class='del'>-****************************************************************************************************</div><div class='del'>-* ip and username/password based authentication</div><div class='del'>-  * allow only "user foo from a.b.c.d"</div><div class='del'>-    protocol/client:</div><div class='del'>-	option username foo</div><div class='del'>-	option password foo-password</div><div class='del'>-	option remote-subvolume foo-brick</div><div class='del'>-</div><div class='del'>-    protocol/server:</div><div class='del'>-	option auth.login.foo-brick.allow foo</div><div class='del'>-	option auth.login.foo.password foo-password</div><div class='del'>-	option auth.addr.foo-brick.reject !a.b.c.d</div><div class='del'>-</div><div class='del'>-  * allow only "user foo" from a.b.c.d i.e., only user foo is allowed from a.b.c.d, but anyone is allowed from ip addresses other than a.b.c.d</div><div class='del'>-    protocol/client:</div><div class='del'>-	option username foo</div><div class='del'>-	option password foo-password</div><div class='del'>-	option remote-subvolume foo-brick</div><div class='del'>-</div><div class='del'>-    protocol/server:</div><div class='del'>-	option auth.login.foo-brick.allow foo</div><div class='del'>-	option auth.login.foo.password foo-password</div><div class='del'>-	option auth.addr.foo-brick.allow !a.b.c.d</div><div class='del'>-</div><div class='del'>-  * reject only "user shoo from a.b.c.d"</div><div class='del'>-    protcol/client:</div><div class='del'>-	option remote-subvolume shoo-brick</div><div class='del'>-    </div><div class='del'>-    protocol/server:</div><div class='del'>-	# observe that no "option auth.login.shoo-brick.allow shoo" given</div><div class='del'>-	# Also other users from a.b.c.d have to be explicitly allowed using auth.login.shoo-brick.allow ...</div><div class='del'>-	option auth.addr.shoo-brick.allow !a.b.c.d</div><div class='del'>-</div><div class='del'>-  * reject only "user shoo" from a.b.c.d i.e., user shoo from a.b.c.d has to be rejected. </div><div class='del'>-    * same as reject only "user shoo from a.b.c.d" above, but rules have to be added whether to allow ip addresses (and users from those ips) other than a.b.c.d</div><div class='del'>-</div><div class='del'>-****************************************************************************************************</div><div class='del'>-</div><div class='del'>-* ip or username/password based authentication</div><div class='del'>-  </div><div class='del'>-  * allow user foo or clients from a.b.c.d</div><div class='del'>-    protocol/client:</div><div class='del'>-	option remote-subvolume foo-brick</div><div class='del'>-</div><div class='del'>-    protocol/server:</div><div class='del'>-	option auth.login.foo-brick.allow foo</div><div class='del'>-	option auth.login.foo.password foo-password</div><div class='del'>-	option auth.addr.foo-brick.allow a.b.c.d</div><div class='del'>-</div><div class='del'>-  * reject user shoo or clients from a.b.c.d</div><div class='del'>-    protocol/client:</div><div class='del'>-	option remote-subvolume shoo-brick</div><div class='del'>-   </div><div class='del'>-    protocol/server:</div><div class='del'>-	option auth.login.shoo-brick.allow &lt;usernames other than shoo&gt;</div><div class='del'>-	#for each username mentioned in the above &lt;usernames other than shoo&gt; list, specify password as below</div><div class='del'>-	option auth.login.&lt;username other than shoo&gt;.password password</div><div class='del'>-	option auth.addr.shoo-brick.reject a.b.c.d</div><div class='head'>diff --git a/doc/booster.txt b/doc/booster.txt<br/>deleted file mode 100644<br/>index 684ac8965c4..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/doc/booster.txt?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>doc/booster.txt</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,54 +0,0 @@</div><div class='del'>-Introduction</div><div class='del'>-============</div><div class='del'>-* booster is a LD_PRELOADable library which boosts read/write performance by bypassing fuse for </div><div class='del'>-  read() and write() calls.</div><div class='del'>-</div><div class='del'>-Requirements</div><div class='del'>-============</div><div class='del'>-* fetch volfile from glusterfs.</div><div class='del'>-* identify whether multiple files are from the same mount point. If so, use only one context.</div><div class='del'>-</div><div class='del'>-Design</div><div class='del'>-======</div><div class='del'>-* for a getxattr, along with other attributes, fuse returns following attributes.</div><div class='del'>-  * contents of client volume-file.</div><div class='del'>-  * mount point.</div><div class='del'>-</div><div class='del'>-* LD_PRELOADed booster.so maintains an hash table storing mount-points and libglusterfsclient handles </div><div class='del'>-  so that handles are reused for files from same mount point. </div><div class='del'>-</div><div class='del'>-* it also maintains a fdtable. fdtable maps the fd (integer) returned to application to fd (pointer to fd struct)</div><div class='del'>-  used by libglusterfsclient. application is returned the same fd as the one returned from libc apis.</div><div class='del'>-</div><div class='del'>-* During fork, these tables are overwritten to enable creation of fresh glusterfs context in child.</div><div class='del'>- </div><div class='del'>-Working</div><div class='del'>-=======</div><div class='del'>-* application willing to use booster LD_PRELOADs booster.so which is a wrapper library implementing </div><div class='del'>-  open, read and write.</div><div class='del'>-</div><div class='del'>-* application should specify the path to logfile through the environment variable GLFS_BOOSTER_LOGFILE. If </div><div class='del'>-  not specified, logging is done to /dev/stderr.</div><div class='del'>-</div><div class='del'>-* open call does,</div><div class='del'>-  * real_open on the file.</div><div class='del'>-  * fgetxattr(fd).</div><div class='del'>-  * store the volume-file content got in the dictionary to a temparory file.</div><div class='del'>-  * look in the hashtable for the mount-point, if already present get the libglusterfsclient handle from the </div><div class='del'>-    hashtable. Otherwise get a new handle from libglusterfsclient (be careful about mount point not present in </div><div class='del'>-    the hashtable and multiple glusterfs_inits running simultaneously for the same mount-point there by using </div><div class='del'>-    multiple handles for the same mount point).</div><div class='del'>-  * real_close (fd).</div><div class='del'>-  * delete temporary volume-volfile.</div><div class='del'>-  * glusterfs_open (handle, path, mode).</div><div class='del'>-  * store the fd returned by glusterfs_open in the fdtable at the same index as the fd returned by real_open.</div><div class='del'>-  * return the index as fd.</div><div class='del'>-</div><div class='del'>-* read/write calls do,</div><div class='del'>-  * get the libglusterfsclient fd from fdtable.</div><div class='del'>-  * if found use glusterfs_read/glusterfs_write, else use real_read/real_write.</div><div class='del'>-</div><div class='del'>-* close call does,</div><div class='del'>-  * remove the fd from the fdtable.</div><div class='del'>-</div><div class='del'>-* other calls use real_calls. </div><div class='head'>diff --git a/doc/coding-standard.pdf b/doc/coding-standard.pdf<br/>deleted file mode 100644<br/>index bc9cb56202c..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/doc/coding-standard.pdf?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>doc/coding-standard.pdf</a><br/>+++ /dev/null</div>Binary files differ<div class='head'>diff --git a/doc/coding-standard.tex b/doc/coding-standard.tex<br/>deleted file mode 100644<br/>index 92f799c013f..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/doc/coding-standard.tex?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>doc/coding-standard.tex</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,385 +0,0 @@</div><div class='del'>-\documentclass{article}[12pt]</div><div class='del'>-\usepackage{color}</div><div class='del'>-</div><div class='del'>-\begin{document}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-\hrule</div><div class='del'>-\begin{center}\textbf{\Large{GlusterFS Coding Standards}}\end{center}</div><div class='del'>-\begin{center}\textbf{\large{\textcolor{red}{Z} Research}}\end{center}</div><div class='del'>-\begin{center}{July 14, 2008}\end{center}</div><div class='del'>-\hrule</div><div class='del'>-</div><div class='del'>-\vspace{8ex}</div><div class='del'>-</div><div class='del'>-\section*{$\bullet$ Structure definitions should have a comment per member}</div><div class='del'>-</div><div class='del'>-Every member in a structure definition must have a comment about its</div><div class='del'>-purpose. The comment should be descriptive without being overly verbose.</div><div class='del'>-</div><div class='del'>-\vspace{2ex}</div><div class='del'>-\textsl{Bad}:</div><div class='del'>-</div><div class='del'>-\begin{verbatim}</div><div class='del'>-        gf_lock_t   lock;           /* lock */</div><div class='del'>-\end{verbatim}</div><div class='del'>-</div><div class='del'>-\textsl{Good}:</div><div class='del'>-</div><div class='del'>-\begin{verbatim}</div><div class='del'>-        DBTYPE      access_mode;    /* access mode for accessing </div><div class='del'>-                                     * the databases, can be</div><div class='del'>-                                     * DB_HASH, DB_BTREE</div><div class='del'>-                                     * (option access-mode &lt;mode&gt;)</div><div class='del'>-                                     */</div><div class='del'>-\end{verbatim}</div><div class='del'>-</div><div class='del'>-\section*{$\bullet$ Declare all variables at the beginning of the function}</div><div class='del'>-All local variables in a function must be declared immediately after the</div><div class='del'>-opening brace. This makes it easy to keep track of memory that needs to be freed</div><div class='del'>-during exit. It also helps debugging, since gdb cannot handle variables</div><div class='del'>-declared inside loops or other such blocks.</div><div class='del'>-</div><div class='del'>-\section*{$\bullet$ Always initialize local variables}</div><div class='del'>-Every local variable should be initialized to a sensible default value</div><div class='del'>-at the point of its declaration. All pointers should be initialized to NULL,</div><div class='del'>-and all integers should be zero or (if it makes sense) an error value.</div><div class='del'>-</div><div class='del'>-\vspace{2ex}</div><div class='del'>-</div><div class='del'>-\textsl{Good}:</div><div class='del'>-</div><div class='del'>-\begin{verbatim}</div><div class='del'>-        int ret       = 0;</div><div class='del'>-        char *databuf = NULL;</div><div class='del'>-        int _fd       = -1;</div><div class='del'>-\end{verbatim}</div><div class='del'>-</div><div class='del'>-\section*{$\bullet$ Initialization should always be done with a constant value}</div><div class='del'>-Never use a non-constant expression as the initialization value for a variable.</div><div class='del'>-</div><div class='del'>-\vspace{2ex}</div><div class='del'>-</div><div class='del'>-\textsl{Bad}:</div><div class='del'>-</div><div class='del'>-\begin{verbatim}</div><div class='del'>-        pid_t pid     = frame-&gt;root-&gt;pid;</div><div class='del'>-        char *databuf = malloc (1024);</div><div class='del'>-\end{verbatim}</div><div class='del'>-</div><div class='del'>-\section*{$\bullet$ Validate all arguments to a function}</div><div class='del'>-All pointer arguments to a function must be checked for \texttt{NULL}.</div><div class='del'>-A macro named \texttt{VALIDATE} (in \texttt{common-utils.h}) </div><div class='del'>-takes one argument, and if it is \texttt{NULL}, writes a log message and</div><div class='del'>-jumps to a label called \texttt{err} after setting op\_ret and op\_errno</div><div class='del'>-appropriately. It is recommended to use this template.</div><div class='del'>-</div><div class='del'>-\vspace{2ex}</div><div class='del'>-</div><div class='del'>-\textsl{Good}:</div><div class='del'>-</div><div class='del'>-\begin{verbatim}</div><div class='del'>-        VALIDATE(frame);</div><div class='del'>-        VALIDATE(this);</div><div class='del'>-        VALIDATE(inode);</div><div class='del'>-\end{verbatim}</div><div class='del'>-</div><div class='del'>-\section*{$\bullet$ Never rely on precedence of operators}</div><div class='del'>-Never write code that relies on the precedence of operators to execute</div><div class='del'>-correctly.  Such code can be hard to read and someone else might not</div><div class='del'>-know the precedence of operators as accurately as you do.</div><div class='del'>-\vspace{2ex}</div><div class='del'>-</div><div class='del'>-\textsl{Bad}:</div><div class='del'>-</div><div class='del'>-\begin{verbatim}</div><div class='del'>-        if (op_ret == -1 &amp;&amp; errno != ENOENT)</div><div class='del'>-\end{verbatim}</div><div class='del'>-</div><div class='del'>-\textsl{Good}:</div><div class='del'>-</div><div class='del'>-\begin{verbatim}</div><div class='del'>-        if ((op_ret == -1) &amp;&amp; (errno != ENOENT))</div><div class='del'>-\end{verbatim}</div><div class='del'>-</div><div class='del'>-\section*{$\bullet$ Use exactly matching types}</div><div class='del'>-Use a variable of the exact type declared in the manual to hold the</div><div class='del'>-return value of a function. Do not use an ``equivalent'' type.</div><div class='del'>-</div><div class='del'>-\vspace{2ex}</div><div class='del'>-</div><div class='del'>-\textsl{Bad}:</div><div class='del'>-</div><div class='del'>-\begin{verbatim}</div><div class='del'>-        int len = strlen (path);</div><div class='del'>-\end{verbatim}</div><div class='del'>-</div><div class='del'>-\textsl{Good}:</div><div class='del'>-</div><div class='del'>-\begin{verbatim}</div><div class='del'>-        size_t len = strlen (path);</div><div class='del'>-\end{verbatim}</div><div class='del'>-</div><div class='del'>-\section*{$\bullet$ Never write code such as \texttt{foo-&gt;bar-&gt;baz}; check every pointer}</div><div class='del'>-Do not write code that blindly follows a chain of pointer</div><div class='del'>-references. Any pointer in the chain may be \texttt{NULL} and thus</div><div class='del'>-cause a crash. Verify that each pointer is non-null before following</div><div class='del'>-it.</div><div class='del'>-</div><div class='del'>-\section*{$\bullet$ Check return value of all functions and system calls}</div><div class='del'>-The return value of all system calls and API functions must be checked</div><div class='del'>-for success or failure.</div><div class='del'>-</div><div class='del'>-\vspace{2ex}</div><div class='del'>-\textsl{Bad}:</div><div class='del'>-</div><div class='del'>-\begin{verbatim}</div><div class='del'>-        close (fd);</div><div class='del'>-\end{verbatim}</div><div class='del'>-</div><div class='del'>-\textsl{Good}:</div><div class='del'>-</div><div class='del'>-\begin{verbatim}</div><div class='del'>-        op_ret = close (_fd);</div><div class='del'>-        if (op_ret == -1) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_ERROR, </div><div class='del'>-                        "close on file %s failed (%s)", real_path, </div><div class='del'>-                        strerror (errno));</div><div class='del'>-                op_errno = errno;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-\end{verbatim}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-\section*{$\bullet$ Gracefully handle failure of malloc}</div><div class='del'>-GlusterFS should never crash or exit due to lack of memory. If a</div><div class='del'>-memory allocation fails, the call should be unwound and an error</div><div class='del'>-returned to the user.</div><div class='del'>-</div><div class='del'>-\section*{$\bullet$ Use result args and reserve the return value to indicate success or failure}</div><div class='del'>-The return value of every functions must indicate success or failure (unless </div><div class='del'>-it is impossible for the function to fail --- e.g., boolean functions). If </div><div class='del'>-the function needs to return additional data, it must be returned using a </div><div class='del'>-result (pointer) argument.</div><div class='del'>-</div><div class='del'>-\vspace{2ex}</div><div class='del'>-\textsl{Bad}:</div><div class='del'>-</div><div class='del'>-\begin{verbatim}</div><div class='del'>-        int32_t dict_get_int32 (dict_t *this, char *key);</div><div class='del'>-\end{verbatim}</div><div class='del'>-</div><div class='del'>-\textsl{Good}:</div><div class='del'>-</div><div class='del'>-\begin{verbatim}</div><div class='del'>-        int dict_get_int32 (dict_t *this, char *key, int32_t *val);</div><div class='del'>-\end{verbatim}</div><div class='del'>-</div><div class='del'>-\section*{$\bullet$ Always use the `n' versions of string functions}</div><div class='del'>-Unless impossible, use the length-limited versions of the string functions.</div><div class='del'>-</div><div class='del'>-\vspace{2ex}</div><div class='del'>-\textsl{Bad}:</div><div class='del'>-</div><div class='del'>-\begin{verbatim}</div><div class='del'>-        strcpy (entry_path, real_path);</div><div class='del'>-\end{verbatim}</div><div class='del'>-</div><div class='del'>-\textsl{Good}:</div><div class='del'>-</div><div class='del'>-\begin{verbatim}</div><div class='del'>-        strncpy (entry_path, real_path, entry_path_len);</div><div class='del'>-\end{verbatim}</div><div class='del'>-</div><div class='del'>-\section*{$\bullet$ No dead or commented code}</div><div class='del'>-There must be no dead code (code to which control can never be passed) or </div><div class='del'>-commented out code in the codebase.</div><div class='del'>-</div><div class='del'>-\section*{$\bullet$ Only one unwind and return per function}</div><div class='del'>-There must be only one exit out of a function. \texttt{UNWIND} and return </div><div class='del'>-should happen at only point in the function.</div><div class='del'>-</div><div class='del'>-\section*{$\bullet$ Function length or Keep functions small}</div><div class='del'>-We live in the UNIX-world where modules do one thing and do it well.</div><div class='del'>-This rule should apply to our functions also. If a function is very long, try splitting it</div><div class='del'>-into many little helper functions. The question is, in a coding</div><div class='del'>-spree, how do we know a function is long and unreadable. One rule of</div><div class='del'>-thumb given by Linus Torvalds is that, a function should be broken-up</div><div class='del'>-if you have 4 or more levels of indentation going on for more than 3-4</div><div class='del'>-lines.</div><div class='del'>-</div><div class='del'>-\vspace{2ex}</div><div class='del'>-\textsl{Example for a helper function}:</div><div class='del'>-\begin{verbatim}</div><div class='del'>-        static int</div><div class='del'>-        same_owner (posix_lock_t *l1, posix_lock_t *l2)</div><div class='del'>-        {</div><div class='del'>-                return ((l1-&gt;client_pid == l2-&gt;client_pid) &amp;&amp;</div><div class='del'>-                       (l1-&gt;transport  == l2-&gt;transport));</div><div class='del'>-        }</div><div class='del'>-\end{verbatim}</div><div class='del'>-</div><div class='del'>-\section*{$\bullet$ Defining functions as static}</div><div class='del'>-Define internal functions as static only if you're</div><div class='del'>-very sure that there will not be a crash(..of any kind..) emanating in</div><div class='del'>-that function. If there is even a remote possibility, perhaps due to</div><div class='del'>-pointer derefering, etc, declare the function as non-static. This</div><div class='del'>-ensures that when a crash does happen, the function name shows up the</div><div class='del'>-in the back-trace generated by libc. However, doing so has potential</div><div class='del'>-for polluting the function namespace, so to avoid conflicts with other</div><div class='del'>-components in other parts, ensure that the function names are</div><div class='del'>-prepended with a prefix that identify the component to which it</div><div class='del'>-belongs. For eg. non-static functions in io-threads translator start</div><div class='del'>-with iot\_.</div><div class='del'>-</div><div class='del'>-\section*{$\bullet$ Ensure function calls wrap around after</div><div class='del'>-80-columns.}</div><div class='del'>-Place remaining arguments on the next line if needed.</div><div class='del'>-</div><div class='del'>-\section*{$\bullet$ Functions arguments and function definition}</div><div class='del'>-Place all the arguments of a function definition on the same line</div><div class='del'>-until the line goes beyond 80-cols. Arguments that extend beyind</div><div class='del'>-80-cols should be placed on the next line.</div><div class='del'>-</div><div class='del'>-\section*{Style issues}</div><div class='del'>-</div><div class='del'>-\subsection*{Brace placement}</div><div class='del'>-Use K\&amp;R/Linux style of brace placement for blocks.</div><div class='del'>-</div><div class='del'>-\textsl{Example}:</div><div class='del'>-\begin{verbatim}</div><div class='del'>-        int some_function (...)</div><div class='del'>-        {</div><div class='del'>-                if (...) {</div><div class='del'>-                        /* ... */</div><div class='del'>-                } else if (...) {</div><div class='del'>-                        /* ... */</div><div class='del'>-                } else {</div><div class='del'>-                        /* ... */</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                do {</div><div class='del'>-                        /* ... */</div><div class='del'>-                } while (cond);</div><div class='del'>-        }</div><div class='del'>-\end{verbatim}</div><div class='del'>-</div><div class='del'>-\subsection*{Indentation}</div><div class='del'>-Use \textbf{eight} spaces for indenting blocks. Ensure that your</div><div class='del'>-file contains only spaces and not tab characters. You can do this</div><div class='del'>-in Emacs by selecting the entire file (\texttt{C-x h}) and</div><div class='del'>-running \texttt{M-x untabify}.</div><div class='del'>-</div><div class='del'>-To make Emacs indent lines automatically by eight spaces, add this</div><div class='del'>-line to your \texttt{.emacs}:</div><div class='del'>-</div><div class='del'>-\begin{verbatim}</div><div class='del'>-        (add-hook 'c-mode-hook (lambda () (c-set-style "linux")))</div><div class='del'>-\end{verbatim}</div><div class='del'>-</div><div class='del'>-\subsection*{Comments}</div><div class='del'>-Write a comment before every function describing its purpose (one-line),</div><div class='del'>-its arguments, and its return value. Mention whether it is an internal</div><div class='del'>-function or an exported function.</div><div class='del'>-</div><div class='del'>-Write a comment before every structure describing its purpose, and</div><div class='del'>-write comments about each of its members.</div><div class='del'>-</div><div class='del'>-Follow the style shown below for comments, since such comments</div><div class='del'>-can then be automatically extracted by doxygen to generate</div><div class='del'>-documentation.</div><div class='del'>-</div><div class='del'>-\textsl{Example}:</div><div class='del'>-\begin{verbatim}</div><div class='del'>-/**</div><div class='del'>- * hash_name -hash function for filenames</div><div class='del'>- * @par:  parent inode number</div><div class='del'>- * @name: basename of inode</div><div class='del'>- * @mod:  number of buckets in the hashtable</div><div class='del'>- *</div><div class='del'>- * @return: success: bucket number</div><div class='del'>- *          failure: -1</div><div class='del'>- *</div><div class='del'>- * Not for external use.</div><div class='del'>- */</div><div class='del'>-\end{verbatim}</div><div class='del'>-</div><div class='del'>-\subsection*{Indicating critical sections}</div><div class='del'>-To clearly show regions of code which execute with locks held, use </div><div class='del'>-the following format:</div><div class='del'>-</div><div class='del'>-\begin{verbatim}</div><div class='del'>-        pthread_mutex_lock (&amp;mutex);</div><div class='del'>-        {</div><div class='del'>-                /* code */</div><div class='del'>-        }</div><div class='del'>-        pthread_mutex_unlock (&amp;mutex);</div><div class='del'>-\end{verbatim}</div><div class='del'>-</div><div class='del'>-\section*{A skeleton fop function}</div><div class='del'>-This is the recommended template for any fop. In the beginning come</div><div class='del'>-the initializations. After that, the `success' control flow should be</div><div class='del'>-linear.  Any error conditions should cause a \texttt{goto} to a single</div><div class='del'>-point, \texttt{out}.  At that point, the code should detect the error</div><div class='del'>-that has occured and do appropriate cleanup.</div><div class='del'>-</div><div class='del'>-\begin{verbatim}</div><div class='del'>-int32_t </div><div class='del'>-sample_fop (call_frame_t *frame, xlator_t *this, ...)</div><div class='del'>-{</div><div class='del'>-        char *            var1     = NULL;</div><div class='del'>-        int32_t           op_ret   = -1;</div><div class='del'>-        int32_t           op_errno = 0;</div><div class='del'>-        DIR *             dir      = NULL;</div><div class='del'>-        struct posix_fd * pfd      = NULL;</div><div class='del'>-</div><div class='del'>-        VALIDATE_OR_GOTO (frame, out);</div><div class='del'>-        VALIDATE_OR_GOTO (this, out);</div><div class='del'>-</div><div class='del'>-        /* other validations */</div><div class='del'>-        </div><div class='del'>-        dir = opendir (...);</div><div class='del'>-</div><div class='del'>-        if (dir == NULL) {</div><div class='del'>-                op_errno = errno;</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_ERROR, </div><div class='del'>-                        "opendir failed on %s (%s)", loc-&gt;path, </div><div class='del'>-                        strerror (op_errno));</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        /* another system call */</div><div class='del'>-        if (...) {</div><div class='del'>-                op_errno = ENOMEM;</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-                        "out of memory :(");</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        /* ... */</div><div class='del'>-</div><div class='del'>- out:</div><div class='del'>-        if (op_ret == -1) {</div><div class='del'>-</div><div class='del'>-          /* check for all the cleanup that needs to be</div><div class='del'>-             done */</div><div class='del'>-</div><div class='del'>-                if (dir) {</div><div class='del'>-                        closedir (dir);</div><div class='del'>-                        dir = NULL;</div><div class='del'>-                }     </div><div class='del'>-        </div><div class='del'>-                if (pfd) {</div><div class='del'>-                        if (pfd-&gt;path)</div><div class='del'>-                                FREE (pfd-&gt;path);</div><div class='del'>-                        FREE (pfd);</div><div class='del'>-                        pfd = NULL;</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        STACK_UNWIND (frame, op_ret, op_errno, fd);</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-\end{verbatim}</div><div class='del'>-</div><div class='del'>-\end{document}</div><div class='head'>diff --git a/doc/debugging/analyzing-regression-cores.md b/doc/debugging/analyzing-regression-cores.md<br/>new file mode 100644<br/>index 00000000000..5e10f41c6eb<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/doc/debugging/analyzing-regression-cores.md?id=d1d7a6f35c816822fab51c820e25023863c239c1'>doc/debugging/analyzing-regression-cores.md</a></div><div class='hunk'>@@ -0,0 +1,54 @@</div><div class='add'>+# Analyzing Regression Cores</div><div class='add'>+This document explains how to analyze core-dumps obtained from regression machines, with examples.</div><div class='add'>+1. Download the core-tarball and extract it.</div><div class='add'>+2. `cd` into directory where the tarball is extracted.</div><div class='add'>+```</div><div class='add'>+[sh]# pwd</div><div class='add'>+/home/user/Downloads</div><div class='add'>+[sh]# ls</div><div class='add'>+build  build-install-20150625_05_42_39.tar.bz2  lib64  usr</div><div class='add'>+```</div><div class='add'>+3. Determine the core file you need to examine. There can be more than one core file. You can list them from './build/install/cores' directory.</div><div class='add'>+```</div><div class='add'>+[sh]# ls build/install/cores/</div><div class='add'>+core.9341  liblist.txt  liblist.txt.tmp</div><div class='add'>+```</div><div class='add'>+In case you are unsure which binary generated the core-file, executing 'file' command on it will help.</div><div class='add'>+```</div><div class='add'>+[sh]# file ./build/install/cores/core.9341 </div><div class='add'>+./build/install/cores/core.9341: ELF 64-bit LSB core file x86-64, version 1 (SYSV), SVR4-style, from '/build/install/sbin/glusterfsd -s slave26.cloud.gluster.org --volfile-id patchy'</div><div class='add'>+```</div><div class='add'>+As seen, the core file was generated by glusterfsd binary, and path to it is provided (/build/install/sbin/glusterfsd).</div><div class='add'>+</div><div class='add'>+4. Now, run the following command on the core:</div><div class='add'>+```</div><div class='add'>+gdb -ex 'set sysroot ./' -ex 'core-file ./build/install/cores/core.xxx' &lt;target, say ./build/install/sbin/glusterd&gt;</div><div class='add'>+In this case,</div><div class='add'>+gdb -ex 'set sysroot ./' -ex 'core-file ./build/install/cores/core.9341' ./build/install/sbin/glusterfsd</div><div class='add'>+```</div><div class='add'>+5. You can cross check if all shared libraries are available and loaded by using 'info sharedlibrary' command from inside gdb.</div><div class='add'>+6. Once verified, usual gdb commands based on requirement can be used to debug the core.</div><div class='add'>+   `bt` or `backtrace` from gdb of core used in examples:</div><div class='add'>+```</div><div class='add'>+Core was generated by `/build/install/sbin/glusterfsd -s slave26.cloud.gluster.org --volfile-id patchy'.</div><div class='add'>+Program terminated with signal SIGABRT, Aborted.</div><div class='add'>+#0  0x00007f512a54e625 in raise () from ./lib64/libc.so.6</div><div class='add'>+(gdb) bt</div><div class='add'>+#0  0x00007f512a54e625 in raise () from ./lib64/libc.so.6</div><div class='add'>+#1  0x00007f512a54fe05 in abort () from ./lib64/libc.so.6</div><div class='add'>+#2  0x00007f512a54774e in __assert_fail_base () from ./lib64/libc.so.6</div><div class='add'>+#3  0x00007f512a547810 in __assert_fail () from ./lib64/libc.so.6</div><div class='add'>+#4  0x00007f512b9fc434 in __gf_free (free_ptr=0x7f50f4000e50) at /home/jenkins/root/workspace/rackspace-regression-2GB-triggered/libglusterfs/src/mem-pool.c:304</div><div class='add'>+#5  0x00007f512b9b6657 in loc_wipe (loc=0x7f510c20d1a0) at /home/jenkins/root/workspace/rackspace-regression-2GB-triggered/libglusterfs/src/xlator.c:685</div><div class='add'>+#6  0x00007f511cb8201d in mq_start_quota_txn_v2 (this=0x7f5118019b60, loc=0x7f510c20d2b8, ctx=0x7f50f4000bf0, contri=0x7f50f4000d60)</div><div class='add'>+    at /home/jenkins/root/workspace/rackspace-regression-2GB-triggered/xlators/features/marker/src/marker-quota.c:2921</div><div class='add'>+#7  0x00007f511cb82c55 in mq_initiate_quota_task (opaque=0x7f510c20d2b0) at /home/jenkins/root/workspace/rackspace-regression-2GB-triggered/xlators/features/marker/src/marker-quota.c:3199</div><div class='add'>+#8  0x00007f511cb81820 in mq_synctask (this=0x7f5118019b60, task=0x7f511cb829fa &lt;mq_initiate_quota_task&gt;, spawn=_gf_false, loc=0x7f510c20d430, dict=0x0, buf=0x0, contri=0)</div><div class='add'>+    at /home/jenkins/root/workspace/rackspace-regression-2GB-triggered/xlators/features/marker/src/marker-quota.c:2789</div><div class='add'>+#9  0x00007f511cb82f82 in mq_initiate_quota_blocking_txn (this=0x7f5118019b60, loc=0x7f510c20d430) at /home/jenkins/root/workspace/rackspace-regression-2GB-triggered/xlators/features/marker/src/marker-quota.c:3230</div><div class='add'>+#10 0x00007f511cb82844 in mq_reduce_parent_size_task (opaque=0x7f510c000df0) at /home/jenkins/root/workspace/rackspace-regression-2GB-triggered/xlators/features/marker/src/marker-quota.c:3117</div><div class='add'>+#11 0x00007f512ba0f9dc in synctask_wrap (old_task=0x7f510c0053e0) at /home/jenkins/root/workspace/rackspace-regression-2GB-triggered/libglusterfs/src/syncop.c:370</div><div class='add'>+#12 0x00007f512a55f8f0 in ?? () from ./lib64/libc.so.6</div><div class='add'>+#13 0x0000000000000000 in ?? ()</div><div class='add'>+(gdb) </div><div class='add'>+```</div><div class='head'>diff --git a/doc/debugging/gfid-to-path.md b/doc/debugging/gfid-to-path.md<br/>new file mode 100644<br/>index 00000000000..1917bf2cca1<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/doc/debugging/gfid-to-path.md?id=d1d7a6f35c816822fab51c820e25023863c239c1'>doc/debugging/gfid-to-path.md</a></div><div class='hunk'>@@ -0,0 +1,68 @@</div><div class='add'>+# Convert GFID to Path</div><div class='add'>+</div><div class='add'>+GlusterFS internal file identifier (GFID) is a uuid that is unique to each</div><div class='add'>+file across the entire cluster. This is analogous to inode number in a</div><div class='add'>+normal filesystem. The GFID of a file is stored in its xattr named</div><div class='add'>+`trusted.gfid`.</div><div class='add'>+</div><div class='add'>+#### Special mount using [gfid-access translator][1]:</div><div class='add'>+```</div><div class='add'>+mount -t glusterfs -o aux-gfid-mount vm1:test /mnt/testvol</div><div class='add'>+```</div><div class='add'>+</div><div class='add'>+Assuming, you have `GFID` of a file from changelog (or somewhere else).</div><div class='add'>+For trying this out, you can get `GFID` of a file from mountpoint:</div><div class='add'>+```</div><div class='add'>+getfattr -n glusterfs.gfid.string /mnt/testvol/dir/file</div><div class='add'>+```</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+---</div><div class='add'>+### Get file path from GFID (Method 1):</div><div class='add'>+**(Lists hardlinks delimited by `:`, returns path as seen from mountpoint)**</div><div class='add'>+</div><div class='add'>+#### Turn on build-pgfid option</div><div class='add'>+```</div><div class='add'>+gluster volume set test build-pgfid on</div><div class='add'>+```</div><div class='add'>+Read virtual xattr `glusterfs.ancestry.path` which contains the file path</div><div class='add'>+```</div><div class='add'>+getfattr -n glusterfs.ancestry.path -e text /mnt/testvol/.gfid/&lt;GFID&gt;</div><div class='add'>+```</div><div class='add'>+</div><div class='add'>+**Example:**</div><div class='add'>+```</div><div class='add'>+[root@vm1 glusterfs]# ls -il /mnt/testvol/dir/</div><div class='add'>+total 1</div><div class='add'>+10610563327990022372 -rw-r--r--. 2 root root 3 Jul 17 18:05 file</div><div class='add'>+10610563327990022372 -rw-r--r--. 2 root root 3 Jul 17 18:05 file3</div><div class='add'>+</div><div class='add'>+[root@vm1 glusterfs]# getfattr -n glusterfs.gfid.string /mnt/testvol/dir/file</div><div class='add'>+getfattr: Removing leading '/' from absolute path names</div><div class='add'>+# file: mnt/testvol/dir/file</div><div class='add'>+glusterfs.gfid.string="11118443-1894-4273-9340-4b212fa1c0e4"</div><div class='add'>+</div><div class='add'>+[root@vm1 glusterfs]# getfattr -n glusterfs.ancestry.path -e text /mnt/testvol/.gfid/11118443-1894-4273-9340-4b212fa1c0e4</div><div class='add'>+getfattr: Removing leading '/' from absolute path names</div><div class='add'>+# file: mnt/testvol/.gfid/11118443-1894-4273-9340-4b212fa1c0e4</div><div class='add'>+glusterfs.ancestry.path="/dir/file:/dir/file3"</div><div class='add'>+```</div><div class='add'>+</div><div class='add'>+---</div><div class='add'>+### Get file path from GFID (Method 2):</div><div class='add'>+**(Does not list all hardlinks, returns backend brick path)**</div><div class='add'>+```</div><div class='add'>+getfattr -n trusted.glusterfs.pathinfo -e text /mnt/testvol/.gfid/&lt;GFID&gt;</div><div class='add'>+```</div><div class='add'>+</div><div class='add'>+**Example:**</div><div class='add'>+```</div><div class='add'>+[root@vm1 glusterfs]# getfattr -n trusted.glusterfs.pathinfo -e text /mnt/testvol/.gfid/11118443-1894-4273-9340-4b212fa1c0e4</div><div class='add'>+getfattr: Removing leading '/' from absolute path names</div><div class='add'>+# file: mnt/testvol/.gfid/11118443-1894-4273-9340-4b212fa1c0e4</div><div class='add'>+trusted.glusterfs.pathinfo="(&lt;DISTRIBUTE:test-dht&gt; &lt;POSIX(/mnt/brick-test/b):vm1:/mnt/brick-test/b/dir//file3&gt;)"</div><div class='add'>+```</div><div class='add'>+</div><div class='add'>+---</div><div class='add'>+#### References and links:</div><div class='add'>+[posix: placeholders for GFID to path conversion](http://review.gluster.org/5951)</div><div class='head'>diff --git a/doc/debugging/mem-alloc-list.md b/doc/debugging/mem-alloc-list.md<br/>new file mode 100644<br/>index 00000000000..1c68e65d323<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/doc/debugging/mem-alloc-list.md?id=d1d7a6f35c816822fab51c820e25023863c239c1'>doc/debugging/mem-alloc-list.md</a></div><div class='hunk'>@@ -0,0 +1,19 @@</div><div class='add'>+## Viewing Memory Allocations</div><div class='add'>+</div><div class='add'>+While statedumps provide stats of the number of allocations, size etc for a</div><div class='add'>+particular mem type, there is no easy way to examine all the allocated objects of that type</div><div class='add'>+in memory.Being able to view this information could help with determining how an object is used,</div><div class='add'>+and if there are any memory leaks.</div><div class='add'>+</div><div class='add'>+The mem_acct_rec structures have been updated to include lists to which the allocated object is</div><div class='add'>+added. These can be examined in gdb using simple scripts.</div><div class='add'>+</div><div class='add'>+`gdb&gt; plist xl-&gt;mem_acct.rec[$type]-&gt;obj_list`</div><div class='add'>+</div><div class='add'>+will print out the pointers of all allocations of $type.</div><div class='add'>+</div><div class='add'>+These changes are primarily targeted at developers and need to enabled</div><div class='add'>+at compile-time using `configure --enable-debug`.</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+</div><div class='head'>diff --git a/doc/debugging/split-brain.md b/doc/debugging/split-brain.md<br/>new file mode 100644<br/>index 00000000000..6b122c40551<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/doc/debugging/split-brain.md?id=d1d7a6f35c816822fab51c820e25023863c239c1'>doc/debugging/split-brain.md</a></div><div class='hunk'>@@ -0,0 +1,264 @@</div><div class='add'>+# Steps to recover from File split-brain</div><div class='add'>+This document contains steps to recover from a file split-brain.</div><div class='add'>+## Quick Start:</div><div class='add'>+### Step 1. Get the path of the file that is in split-brain:</div><div class='add'>+It can be obtained either by</div><div class='add'>+1. The command `gluster volume heal info split-brain`.</div><div class='add'>+2. Identify the files for which file operations performed from the client keep failing with Input/Output error.</div><div class='add'>+</div><div class='add'>+### Step 2. Close the applications that opened this file from the mount point.</div><div class='add'>+In case of VMs, they need to be powered-off.</div><div class='add'>+</div><div class='add'>+### Step 3. Decide on the correct copy:  </div><div class='add'>+This is done by observing the afr changelog extended attributes of the file on</div><div class='add'>+the bricks using the getfattr command; then identifying the type of split-brain </div><div class='add'>+(data split-brain, metadata split-brain, entry split-brain or split-brain due to</div><div class='add'>+gfid-mismatch); and finally determining which of the bricks contains the 'good copy'</div><div class='add'>+of the file.  </div><div class='add'>+```</div><div class='add'>+getfattr -d -m . -e hex &lt;file-path-on-brick&gt;</div><div class='add'>+```</div><div class='add'>+  </div><div class='add'>+It is also possible that one brick might contain the correct data while the</div><div class='add'>+other might contain the correct metadata.</div><div class='add'>+</div><div class='add'>+### Step 4. Reset the relevant extended attribute on the brick(s) that contains the 'bad copy' of the file data/metadata using the setfattr command.  </div><div class='add'>+```</div><div class='add'>+setfattr -n &lt;attribute-name&gt; -v &lt;attribute-value&gt; &lt;file-path-on-brick&gt;</div><div class='add'>+```</div><div class='add'>+</div><div class='add'>+### Step 5. Trigger self-heal on the file by performing lookup from the client:  </div><div class='add'>+```</div><div class='add'>+ls -l &lt;file-path-on-gluster-mount&gt;</div><div class='add'>+```</div><div class='add'>+</div><div class='add'>+Detailed Instructions for steps 3 through 5:  </div><div class='add'>+===========================================</div><div class='add'>+To understand how to resolve split-brain we need to know how to interpret the</div><div class='add'>+afr changelog extended attributes.</div><div class='add'>+</div><div class='add'>+Execute `getfattr -d -m . -e hex &lt;file-path-on-brick&gt;`</div><div class='add'>+</div><div class='add'>+Example:  </div><div class='add'>+```</div><div class='add'>+[root@store3 ~]# getfattr -d -e hex -m. brick-a/file.txt  </div><div class='add'>+\#file: brick-a/file.txt  </div><div class='add'>+security.selinux=0x726f6f743a6f626a6563745f723a66696c655f743a733000  </div><div class='add'>+trusted.afr.vol-client-2=0x000000000000000000000000  </div><div class='add'>+trusted.afr.vol-client-3=0x000000000200000000000000  </div><div class='add'>+trusted.gfid=0x307a5c9efddd4e7c96e94fd4bcdcbd1b  </div><div class='add'>+```</div><div class='add'>+</div><div class='add'>+The extended attributes with `trusted.afr.&lt;volname&gt;-client-&lt;subvolume-index&gt;`</div><div class='add'>+are used by afr to maintain changelog of the file.The values of the</div><div class='add'>+`trusted.afr.&lt;volname&gt;-client-&lt;subvolume-index&gt;` are calculated by the glusterfs</div><div class='add'>+client (fuse or nfs-server) processes. When the glusterfs client modifies a file</div><div class='add'>+or directory, the client contacts each brick and updates the changelog extended </div><div class='add'>+attribute according to the response of the brick.</div><div class='add'>+</div><div class='add'>+`subvolume-index` is nothing but (brick number - 1) in</div><div class='add'>+`gluster volume info &lt;volname&gt;` output.</div><div class='add'>+</div><div class='add'>+Example:</div><div class='add'>+```</div><div class='add'>+[root@pranithk-laptop ~]# gluster volume info vol  </div><div class='add'>+ Volume Name: vol  </div><div class='add'>+ Type: Distributed-Replicate  </div><div class='add'>+ Volume ID: 4f2d7849-fbd6-40a2-b346-d13420978a01  </div><div class='add'>+ Status: Created  </div><div class='add'>+ Number of Bricks: 4 x 2 = 8  </div><div class='add'>+ Transport-type: tcp  </div><div class='add'>+ Bricks:  </div><div class='add'>+ brick-a: pranithk-laptop:/gfs/brick-a  </div><div class='add'>+ brick-b: pranithk-laptop:/gfs/brick-b  </div><div class='add'>+ brick-c: pranithk-laptop:/gfs/brick-c  </div><div class='add'>+ brick-d: pranithk-laptop:/gfs/brick-d  </div><div class='add'>+ brick-e: pranithk-laptop:/gfs/brick-e  </div><div class='add'>+ brick-f: pranithk-laptop:/gfs/brick-f  </div><div class='add'>+ brick-g: pranithk-laptop:/gfs/brick-g  </div><div class='add'>+ brick-h: pranithk-laptop:/gfs/brick-h  </div><div class='add'>+```</div><div class='add'>+</div><div class='add'>+In the example above:  </div><div class='add'>+```</div><div class='add'>+Brick             |    Replica set        |    Brick subvolume index</div><div class='add'>+----------------------------------------------------------------------------</div><div class='add'>+-/gfs/brick-a     |       0               |       0</div><div class='add'>+-/gfs/brick-b     |       0               |       1</div><div class='add'>+-/gfs/brick-c     |       1               |       2</div><div class='add'>+-/gfs/brick-d     |       1               |       3</div><div class='add'>+-/gfs/brick-e     |       2               |       4</div><div class='add'>+-/gfs/brick-f     |       2               |       5</div><div class='add'>+-/gfs/brick-g     |       3               |       6</div><div class='add'>+-/gfs/brick-h     |       3               |       7</div><div class='add'>+```</div><div class='add'>+</div><div class='add'>+Each file in a brick maintains the changelog of itself and that of the files</div><div class='add'>+present in all the other bricks in it's replica set as seen by that brick.</div><div class='add'>+</div><div class='add'>+In the example volume given above, all files in brick-a will have 2 entries, </div><div class='add'>+one for itself and the other for the file present in it's replica pair, i.e.brick-b:  </div><div class='add'>+```</div><div class='add'>+trusted.afr.vol-client-0=0x000000000000000000000000 --&gt;changelog for itself (brick-a)  </div><div class='add'>+trusted.afr.vol-client-1=0x000000000000000000000000 --&gt;changelog for brick-b as seen by brick-a  </div><div class='add'>+```</div><div class='add'>+Likewise, all files in brick-b will have:  </div><div class='add'>+```</div><div class='add'>+trusted.afr.vol-client-0=0x000000000000000000000000 --&gt;changelog for brick-a as seen by brick-b  </div><div class='add'>+trusted.afr.vol-client-1=0x000000000000000000000000 --&gt;changelog for itself (brick-b)  </div><div class='add'>+```</div><div class='add'>+</div><div class='add'>+The same can be extended for other replica pairs.  </div><div class='add'>+</div><div class='add'>+Interpreting Changelog (roughly pending operation count) Value:  </div><div class='add'>+Each extended attribute has a value which is 24 hexa decimal digits.  </div><div class='add'>+First 8 digits represent changelog of data. Second 8 digits represent changelog</div><div class='add'>+of metadata. Last 8 digits represent Changelog of directory entries.  </div><div class='add'>+</div><div class='add'>+Pictorially representing the same, we have:</div><div class='add'>+```</div><div class='add'>+0x 000003d7 00000001 00000000</div><div class='add'>+        |      |       |</div><div class='add'>+        |      |        \_ changelog of directory entries</div><div class='add'>+        |       \_ changelog of metadata</div><div class='add'>+         \ _ changelog of data</div><div class='add'>+```</div><div class='add'>+         </div><div class='add'>+</div><div class='add'>+For Directories metadata and entry changelogs are valid.</div><div class='add'>+For regular files data and metadata changelogs are valid.</div><div class='add'>+For special files like device files etc metadata changelog is valid.</div><div class='add'>+When a file split-brain happens it could be either data split-brain or</div><div class='add'>+meta-data split-brain or both. When a split-brain happens the changelog of the</div><div class='add'>+file would be something like this:  </div><div class='add'>+</div><div class='add'>+Example:(Lets consider both data, metadata split-brain on same file).  </div><div class='add'>+```</div><div class='add'>+[root@pranithk-laptop vol]# getfattr -d -m . -e hex /gfs/brick-?/a  </div><div class='add'>+getfattr: Removing leading '/' from absolute path names  </div><div class='add'>+\#file: gfs/brick-a/a  </div><div class='add'>+trusted.afr.vol-client-0=0x000000000000000000000000  </div><div class='add'>+trusted.afr.vol-client-1=0x000003d70000000100000000  </div><div class='add'>+trusted.gfid=0x80acdbd886524f6fbefa21fc356fed57   </div><div class='add'>+\#file: gfs/brick-b/a  </div><div class='add'>+trusted.afr.vol-client-0=0x000003b00000000100000000  </div><div class='add'>+trusted.afr.vol-client-1=0x000000000000000000000000  </div><div class='add'>+trusted.gfid=0x80acdbd886524f6fbefa21fc356fed57  </div><div class='add'>+```</div><div class='add'>+</div><div class='add'>+### Observations:</div><div class='add'>+</div><div class='add'>+#### According to changelog extended attributes on file /gfs/brick-a/a:  </div><div class='add'>+The first 8 digits of trusted.afr.vol-client-0 are all</div><div class='add'>+zeros (0x00000000................), and the first 8 digits of</div><div class='add'>+trusted.afr.vol-client-1 are not all zeros (0x000003d7................).</div><div class='add'>+So the changelog on /gfs/brick-a/a implies that some data operations succeeded</div><div class='add'>+on itself but failed on /gfs/brick-b/a.</div><div class='add'>+</div><div class='add'>+The second 8 digits of trusted.afr.vol-client-0 are</div><div class='add'>+all zeros (0x........00000000........), and the second 8 digits of</div><div class='add'>+trusted.afr.vol-client-1 are not all zeros (0x........00000001........).</div><div class='add'>+So the changelog on /gfs/brick-a/a implies that some metadata operations succeeded </div><div class='add'>+on itself but failed on /gfs/brick-b/a.</div><div class='add'>+</div><div class='add'>+#### According to Changelog extended attributes on file /gfs/brick-b/a:  </div><div class='add'>+The first 8 digits of trusted.afr.vol-client-0 are not all</div><div class='add'>+zeros (0x000003b0................), and the first 8 digits of</div><div class='add'>+trusted.afr.vol-client-1 are all zeros (0x00000000................).</div><div class='add'>+So the changelog on /gfs/brick-b/a implies that some data operations succeeded</div><div class='add'>+on itself but failed on /gfs/brick-a/a.</div><div class='add'>+</div><div class='add'>+The second 8 digits of trusted.afr.vol-client-0 are not</div><div class='add'>+all zeros (0x........00000001........), and the second 8 digits of</div><div class='add'>+trusted.afr.vol-client-1 are all zeros (0x........00000000........).</div><div class='add'>+So the changelog on /gfs/brick-b/a implies that some metadata operations succeeded</div><div class='add'>+on itself but failed on /gfs/brick-a/a.</div><div class='add'>+</div><div class='add'>+Since both the copies have data, metadata changes that are not on the other</div><div class='add'>+file, it is in both data and metadata split-brain.</div><div class='add'>+</div><div class='add'>+Deciding on the correct copy:  </div><div class='add'>+-----------------------------</div><div class='add'>+The user may have to inspect stat,getfattr output of the files to decide which </div><div class='add'>+metadata to retain and contents of the file to decide which data to retain.</div><div class='add'>+Continuing with the example above, lets say we want to retain the data</div><div class='add'>+of /gfs/brick-a/a and metadata of /gfs/brick-b/a.</div><div class='add'>+</div><div class='add'>+Resetting the relevant changelogs to resolve the split-brain:  </div><div class='add'>+-------------------------------------------------------------</div><div class='add'>+For resolving data-split-brain:  </div><div class='add'>+We need to change the changelog extended attributes on the files as if some data</div><div class='add'>+operations succeeded on /gfs/brick-a/a but failed on /gfs/brick-b/a. But</div><div class='add'>+/gfs/brick-b/a should NOT have any changelog which says some data operations</div><div class='add'>+succeeded on /gfs/brick-b/a but failed on /gfs/brick-a/a. We need to reset the</div><div class='add'>+data part of the changelog on trusted.afr.vol-client-0 of /gfs/brick-b/a.</div><div class='add'>+</div><div class='add'>+For resolving metadata-split-brain:  </div><div class='add'>+We need to change the changelog extended attributes on the files as if some</div><div class='add'>+metadata operations succeeded on /gfs/brick-b/a but failed on /gfs/brick-a/a.</div><div class='add'>+But /gfs/brick-a/a should NOT have any changelog which says some metadata</div><div class='add'>+operations succeeded on /gfs/brick-a/a but failed on /gfs/brick-b/a.</div><div class='add'>+We need to reset metadata part of the changelog on</div><div class='add'>+trusted.afr.vol-client-1 of /gfs/brick-a/a</div><div class='add'>+</div><div class='add'>+So, the intended changes are:  </div><div class='add'>+On /gfs/brick-b/a:  </div><div class='add'>+For trusted.afr.vol-client-0  </div><div class='add'>+0x000003b00000000100000000 to 0x000000000000000100000000  </div><div class='add'>+(Note that the metadata part is still not all zeros)  </div><div class='add'>+Hence execute</div><div class='add'>+`setfattr -n trusted.afr.vol-client-0 -v 0x000000000000000100000000 /gfs/brick-b/a`</div><div class='add'>+</div><div class='add'>+On /gfs/brick-a/a:  </div><div class='add'>+For trusted.afr.vol-client-1  </div><div class='add'>+0x0000000000000000ffffffff to 0x000003d70000000000000000  </div><div class='add'>+(Note that the data part is still not all zeros)  </div><div class='add'>+Hence execute  </div><div class='add'>+`setfattr -n trusted.afr.vol-client-1 -v 0x000003d70000000000000000 /gfs/brick-a/a`</div><div class='add'>+</div><div class='add'>+Thus after the above operations are done, the changelogs look like this:  </div><div class='add'>+```</div><div class='add'>+[root@pranithk-laptop vol]# getfattr -d -m . -e hex /gfs/brick-?/a  </div><div class='add'>+getfattr: Removing leading '/' from absolute path names  </div><div class='add'>+\#file: gfs/brick-a/a  </div><div class='add'>+trusted.afr.vol-client-0=0x000000000000000000000000  </div><div class='add'>+trusted.afr.vol-client-1=0x000003d70000000000000000  </div><div class='add'>+trusted.gfid=0x80acdbd886524f6fbefa21fc356fed57  </div><div class='add'>+</div><div class='add'>+\#file: gfs/brick-b/a  </div><div class='add'>+trusted.afr.vol-client-0=0x000000000000000100000000  </div><div class='add'>+trusted.afr.vol-client-1=0x000000000000000000000000  </div><div class='add'>+trusted.gfid=0x80acdbd886524f6fbefa21fc356fed57  </div><div class='add'>+```</div><div class='add'>+</div><div class='add'>+Triggering Self-heal:</div><div class='add'>+---------------------</div><div class='add'>+Perform `ls -l &lt;file-path-on-gluster-mount&gt;` to trigger healing.</div><div class='add'>+</div><div class='add'>+Fixing Directory entry split-brain:</div><div class='add'>+----------------------------------</div><div class='add'>+Afr has the ability to conservatively merge different entries in the directories</div><div class='add'>+when there is a split-brain on directory.</div><div class='add'>+If on one brick directory 'd' has entries '1', '2' and has entries '3', '4' on</div><div class='add'>+the other brick then afr will merge all of the entries in the directory to have</div><div class='add'>+'1', '2', '3', '4' entries in the same directory.</div><div class='add'>+(Note: this may result in deleted files to re-appear in case the split-brain</div><div class='add'>+happens because of deletion of files on the directory)</div><div class='add'>+Split-brain resolution needs human intervention when there is at least one entry</div><div class='add'>+which has same file name but different gfid in that directory.</div><div class='add'>+Example:  </div><div class='add'>+On brick-a the directory has entries '1' (with gfid g1), '2' and on brick-b</div><div class='add'>+directory has entries '1' (with gfid g2) and '3'.</div><div class='add'>+These kinds of directory split-brains need human intervention to resolve.</div><div class='add'>+The user needs to remove either file '1' on brick-a or the file '1' on brick-b</div><div class='add'>+to resolve the split-brain. In addition, the corresponding gfid-link file also</div><div class='add'>+needs to be removed.The gfid-link files are present in the .glusterfs folder</div><div class='add'>+in the top-level directory of the brick. If the gfid of the file is</div><div class='add'>+0x307a5c9efddd4e7c96e94fd4bcdcbd1b (the trusted.gfid extended attribute got</div><div class='add'>+from the getfattr command earlier),the gfid-link file can be found at</div><div class='add'>+`/gfs/brick-a/.glusterfs/30/7a/307a5c9efddd4e7c96e94fd4bcdcbd1b`</div><div class='add'>+</div><div class='add'>+#### Word of caution:</div><div class='add'>+Before deleting the gfid-link, we have to ensure that there are no hard links</div><div class='add'>+to the file present on that brick. If hard-links exist,they must be deleted as</div><div class='add'>+well.</div><div class='head'>diff --git a/doc/debugging/statedump.md b/doc/debugging/statedump.md<br/>new file mode 100644<br/>index 00000000000..9dfdce15fad<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/doc/debugging/statedump.md?id=d1d7a6f35c816822fab51c820e25023863c239c1'>doc/debugging/statedump.md</a></div><div class='hunk'>@@ -0,0 +1,414 @@</div><div class='add'>+# Statedump</div><div class='add'>+Statedump is a file generated by glusterfs process with different data structure state which may contain the active inodes, fds, mempools, iobufs, memory allocation stats of different types of datastructures per xlator etc.</div><div class='add'>+</div><div class='add'>+## How to generate statedump</div><div class='add'>+We can find the directory where statedump files are created using `gluster --print-statedumpdir` command.</div><div class='add'>+Create that directory if not already present based on the type of installation.</div><div class='add'>+Lets call this directory `statedump-directory`.</div><div class='add'>+</div><div class='add'>+We can generate statedump using `kill -USR1 &lt;pid-of-gluster-process&gt;`.</div><div class='add'>+gluster-process is nothing but glusterd/glusterfs/glusterfsd process.</div><div class='add'>+</div><div class='add'>+There are also commands to generate statedumps for brick processes/nfs server/quotad</div><div class='add'>+</div><div class='add'>+For bricks: </div><div class='add'>+```</div><div class='add'>+gluster volume statedump &lt;volname&gt;</div><div class='add'>+```</div><div class='add'>+</div><div class='add'>+For nfs server:</div><div class='add'>+```</div><div class='add'>+gluster volume statedump &lt;volname&gt; nfs</div><div class='add'>+```</div><div class='add'>+</div><div class='add'>+For quotad:</div><div class='add'>+```</div><div class='add'>+gluster volume statedump &lt;volname&gt; quotad</div><div class='add'>+```</div><div class='add'>+</div><div class='add'>+For brick-processes files will be created in `statedump-directory` with name of the file as `hyphenated-brick-path.&lt;pid&gt;.dump.timestamp`. For all other processes it will be `glusterdump.&lt;pid&gt;.dump.timestamp`.</div><div class='add'>+</div><div class='add'>+For applications using libgfapi, `SIGUSR1` cannot be used, eg: smbd/libvirtd</div><div class='add'>+processes could have used the `SIGUSR1` signal already for other purposes.</div><div class='add'>+To generate statedump for the processes, using libgfapi, below command can be</div><div class='add'>+executed from one of the nodes in the gluster cluster to which the libgfapi</div><div class='add'>+application is connected to.</div><div class='add'>+```</div><div class='add'>+gluster volume statedump &lt;volname&gt; client &lt;hostname&gt;:&lt;process id&gt;</div><div class='add'>+```</div><div class='add'>+The statedumps can be found in the `statedump-directory`, the name of the</div><div class='add'>+statedumps being `glusterdump.&lt;pid&gt;.dump.timestamp`. For a process there can be</div><div class='add'>+multiple such files created depending on the number of times the volume is</div><div class='add'>+accessed by the process (related to the number of `glfs_init()` calls).</div><div class='add'>+</div><div class='add'>+## How to read statedump</div><div class='add'>+We shall see snippets of each type of statedump.</div><div class='add'>+</div><div class='add'>+First and last lines of the file have starting and ending time of writing the statedump file. Times will be in UTC timezone.</div><div class='add'>+</div><div class='add'>+mallinfo return status is printed in the following format. Please read man mallinfo for more information about what each field means.</div><div class='add'>+### Mallinfo</div><div class='add'>+```</div><div class='add'>+[mallinfo]</div><div class='add'>+mallinfo_arena=100020224 /* Non-mmapped space allocated (bytes) */</div><div class='add'>+mallinfo_ordblks=69467 /* Number of free chunks */</div><div class='add'>+mallinfo_smblks=449 /* Number of free fastbin blocks */</div><div class='add'>+mallinfo_hblks=13 /* Number of mmapped regions */</div><div class='add'>+mallinfo_hblkhd=20144128 /* Space allocated in mmapped regions (bytes) */</div><div class='add'>+mallinfo_usmblks=0 /* Maximum total allocated space (bytes) */</div><div class='add'>+mallinfo_fsmblks=39264 /* Space in freed fastbin blocks (bytes) */</div><div class='add'>+mallinfo_uordblks=96710112 /* Total allocated space (bytes) */</div><div class='add'>+mallinfo_fordblks=3310112 /* Total free space (bytes) */</div><div class='add'>+mallinfo_keepcost=133712 /* Top-most, releasable space (bytes) */</div><div class='add'>+```</div><div class='add'>+</div><div class='add'>+### Data structure allocation stats</div><div class='add'>+For every xlator data structure memory per translator loaded in the call-graph is displayed in the following format:</div><div class='add'>+</div><div class='add'>+For xlator with name: glusterfs</div><div class='add'>+```</div><div class='add'>+[global.glusterfs - Memory usage] #[global.xlator-name - Memory usage]</div><div class='add'>+num_types=119 #It shows the number of data types it is using</div><div class='add'>+```</div><div class='add'>+</div><div class='add'>+Now for each data-type it prints the memory usage.</div><div class='add'>+</div><div class='add'>+```</div><div class='add'>+[global.glusterfs - usage-type gf_common_mt_gf_timer_t memusage]</div><div class='add'>+#[global.xlator-name - usage-type &lt;tag associated with the data-type&gt; memusage]</div><div class='add'>+size=112 #num_allocs times the sizeof(data-type) i.e. num_allocs * sizeof (data-type)</div><div class='add'>+num_allocs=2 #Number of allocations of the data-type which are active at the time of taking statedump.</div><div class='add'>+max_size=168 #max_num_allocs times the sizeof(data-type) i.e. max_num_allocs * sizeof (data-type)</div><div class='add'>+max_num_allocs=3 #Maximum number of active allocations at any point in the life of the process.</div><div class='add'>+total_allocs=7 #Number of times this data is allocated in the life of the process.</div><div class='add'>+```</div><div class='add'>+</div><div class='add'>+### Mempools</div><div class='add'>+</div><div class='add'>+Mempools are optimization to reduce the number of allocations of a data type. If we create a mem-pool of lets say 1024 elements for a data-type, new elements will be allocated from heap using syscalls like calloc, only if all the 1024 elements in the pool are in active use.</div><div class='add'>+</div><div class='add'>+Memory pool allocated by each xlator is displayed in the following format:</div><div class='add'>+</div><div class='add'>+```</div><div class='add'>+[mempool] #Section name</div><div class='add'>+-----=-----</div><div class='add'>+pool-name=fuse:fd_t #pool-name=&lt;xlator-name&gt;:&lt;data-type&gt;</div><div class='add'>+hot-count=1 #number of mempool elements that are in active use. i.e. for this pool it is the number of 'fd_t' s in active use.</div><div class='add'>+cold-count=1023 #number of mempool elements that are not in use. If a new allocation is required it will be served from here until all the elements in the pool are in use i.e. cold-count becomes 0.</div><div class='add'>+padded_sizeof=108 #Each mempool element is padded with a doubly-linked-list + ptr of mempool + is-in-use info to operate the pool of elements, this size is the element-size after padding</div><div class='add'>+pool-misses=0 #Number of times the element had to be allocated from heap because all elements from the pool are in active use.</div><div class='add'>+alloc-count=314 #Number of times this type of data is allocated through out the life of this process. This may include pool-misses as well.</div><div class='add'>+max-alloc=3 #Maximum number of elements from the pool in active use at any point in the life of the process. This does *not* include pool-misses.</div><div class='add'>+cur-stdalloc=0 #Denotes the number of allocations made from heap once cold-count reaches 0, that are yet to be released via mem_put().</div><div class='add'>+max-stdalloc=0 #Maximum number of allocations from heap that are in active use at any point in the life of the process.</div><div class='add'>+```</div><div class='add'>+</div><div class='add'>+### Iobufs</div><div class='add'>+```</div><div class='add'>+[iobuf.global]</div><div class='add'>+iobuf_pool=0x1f0d970 #The memory pool for iobufs</div><div class='add'>+iobuf_pool.default_page_size=131072 #The default size of iobuf (if no iobuf size is specified the default size is allocated)</div><div class='add'>+#iobuf_arena: One arena represents a group of iobufs of a particular size</div><div class='add'>+iobuf_pool.arena_size=12976128 # The initial size of the iobuf pool (doesn't include the stdalloc'd memory or the newly added arenas)</div><div class='add'>+iobuf_pool.arena_cnt=8 #Total number of arenas in the pool</div><div class='add'>+iobuf_pool.request_misses=0 #The number of iobufs that were stdalloc'd (as they exceeded the default max page size provided by iobuf_pool).</div><div class='add'>+```</div><div class='add'>+</div><div class='add'>+There are 3 lists of arenas:</div><div class='add'>+</div><div class='add'>+1. Arena list: arenas allocated during iobuf pool creation and the arenas that are in use(active_cnt != 0) will be part of this list.</div><div class='add'>+2. Purge list: arenas that can be purged(no active iobufs, active_cnt == 0).</div><div class='add'>+3. Filled list: arenas without free iobufs.</div><div class='add'>+</div><div class='add'>+```</div><div class='add'>+[purge.1] #purge.&lt;S.No.&gt;</div><div class='add'>+purge.1.mem_base=0x7fc47b35f000 #The address of the arena structure</div><div class='add'>+purge.1.active_cnt=0 #The number of iobufs active in that arena</div><div class='add'>+purge.1.passive_cnt=1024 #The number of unused iobufs in the arena</div><div class='add'>+purge.1.alloc_cnt=22853 #Total allocs in this pool(number of times the iobuf was allocated from this arena)</div><div class='add'>+purge.1.max_active=7 #Max active iobufs from this arena, at any point in the life of this process.</div><div class='add'>+purge.1.page_size=128 #Size of all the iobufs in this arena.</div><div class='add'>+</div><div class='add'>+[arena.5] #arena.&lt;S.No.&gt;</div><div class='add'>+arena.5.mem_base=0x7fc47af1f000</div><div class='add'>+arena.5.active_cnt=0</div><div class='add'>+arena.5.passive_cnt=64</div><div class='add'>+arena.5.alloc_cnt=0</div><div class='add'>+arena.5.max_active=0</div><div class='add'>+arena.5.page_size=32768</div><div class='add'>+```</div><div class='add'>+</div><div class='add'>+If the active_cnt of any arena is non zero, then the statedump will also have the iobuf list.</div><div class='add'>+```</div><div class='add'>+[arena.6.active_iobuf.1] #arena.&lt;S.No&gt;.active_iobuf.&lt;iobuf.S.No.&gt;</div><div class='add'>+arena.6.active_iobuf.1.ref=1 #refcount of the iobuf</div><div class='add'>+arena.6.active_iobuf.1.ptr=0x7fdb921a9000 #address of the iobuf</div><div class='add'>+</div><div class='add'>+[arena.6.active_iobuf.2]</div><div class='add'>+arena.6.active_iobuf.2.ref=1</div><div class='add'>+arena.6.active_iobuf.2.ptr=0x7fdb92189000</div><div class='add'>+```</div><div class='add'>+</div><div class='add'>+At any given point in time if there are lots of filled arenas then that could be a sign of iobuf leaks.</div><div class='add'>+</div><div class='add'>+### Call stack</div><div class='add'>+All the fops received by gluster are handled using call-stacks. Call stack contains the information about uid/gid/pid etc of the process that is executing the fop. Each call-stack contains different call-frames per xlator which handles that fop.</div><div class='add'>+</div><div class='add'>+```</div><div class='add'>+[global.callpool.stack.3] #global.callpool.stack.&lt;Serial-Number&gt;</div><div class='add'>+stack=0x7fc47a44bbe0 #Stack address</div><div class='add'>+uid=0 #Uid of the process which is executing the fop</div><div class='add'>+gid=0 #Gid of the process which is executing the fop</div><div class='add'>+pid=6223 #Pid of the process which is executing the fop</div><div class='add'>+unique=2778 #Xlators like afr do copy_frame and perform the operation in a different stack, this id is useful to find out the stacks that are inter-related because of copy-frame</div><div class='add'>+lk-owner=0000000000000000 #Some of the fuse fops have lk-owner.</div><div class='add'>+op=LOOKUP #Fop</div><div class='add'>+type=1 #Type of the op i.e. FOP/MGMT-OP</div><div class='add'>+cnt=9 #Number of frames in this stack.</div><div class='add'>+```</div><div class='add'>+### Call-frame</div><div class='add'>+Each frame will have information about which xlator the frame belongs to, what is the function it wound to/from and will be unwind to. It also mentions if the unwind happened or not. If we observe hangs in the system and want to find out which xlator is causing it. Take a statedump and see what is the final xlator which is yet to be unwound.</div><div class='add'>+</div><div class='add'>+```</div><div class='add'>+[global.callpool.stack.3.frame.2]#global.callpool.stack.&lt;stack-serial-number&gt;.frame.&lt;frame-serial-number&gt;</div><div class='add'>+frame=0x7fc47a611dbc #Frame address</div><div class='add'>+ref_count=0 #Incremented at the time of wind and decremented at the time of unwind.</div><div class='add'>+translator=r2-client-1 #Xlator this frame belongs to</div><div class='add'>+complete=0 #if this value is 1 that means this frame is already unwound. 0 if it is yet to unwind.</div><div class='add'>+parent=r2-replicate-0 #Parent xlator of this frame</div><div class='add'>+wind_from=afr_lookup #Parent xlator function from which the wind happened</div><div class='add'>+wind_to=priv-&gt;children[i]-&gt;fops-&gt;lookup</div><div class='add'>+unwind_to=afr_lookup_cbk #Parent xlator function to which unwind happened</div><div class='add'>+```</div><div class='add'>+</div><div class='add'>+### History of operations in Fuse</div><div class='add'>+</div><div class='add'>+Fuse maintains history of operations that happened in fuse.</div><div class='add'>+</div><div class='add'>+```</div><div class='add'>+[xlator.mount.fuse.history]</div><div class='add'>+TIME=2014-07-09 16:44:57.523364</div><div class='add'>+message=[0] fuse_release: RELEASE(): 4590:, fd: 0x1fef0d8, gfid: 3afb4968-5100-478d-91e9-76264e634c9f</div><div class='add'>+</div><div class='add'>+TIME=2014-07-09 16:44:57.523373</div><div class='add'>+message=[0] send_fuse_err: Sending Success for operation 18 on inode 3afb4968-5100-478d-91e9-76264e634c9f</div><div class='add'>+</div><div class='add'>+TIME=2014-07-09 16:44:57.523394</div><div class='add'>+message=[0] fuse_getattr_resume: 4591, STAT, path: (/iozone.tmp), gfid: (3afb4968-5100-478d-91e9-76264e634c9f)</div><div class='add'>+```</div><div class='add'>+</div><div class='add'>+### Xlator configuration</div><div class='add'>+```</div><div class='add'>+[cluster/replicate.r2-replicate-0] #Xlator type, name information</div><div class='add'>+child_count=2 #Number of children to the xlator</div><div class='add'>+#Xlator specific configuration below</div><div class='add'>+child_up[0]=1</div><div class='add'>+pending_key[0]=trusted.afr.r2-client-0</div><div class='add'>+child_up[1]=1</div><div class='add'>+pending_key[1]=trusted.afr.r2-client-1</div><div class='add'>+data_self_heal=on</div><div class='add'>+metadata_self_heal=1</div><div class='add'>+entry_self_heal=1</div><div class='add'>+data_change_log=1</div><div class='add'>+metadata_change_log=1</div><div class='add'>+entry-change_log=1</div><div class='add'>+read_child=1</div><div class='add'>+favorite_child=-1</div><div class='add'>+wait_count=1</div><div class='add'>+```</div><div class='add'>+</div><div class='add'>+### Graph/inode table</div><div class='add'>+```</div><div class='add'>+[active graph - 1]</div><div class='add'>+</div><div class='add'>+conn.1.bound_xl./data/brick01a/homegfs.hashsize=14057</div><div class='add'>+conn.1.bound_xl./data/brick01a/homegfs.name=/data/brick01a/homegfs/inode</div><div class='add'>+conn.1.bound_xl./data/brick01a/homegfs.lru_limit=16384 #Least recently used size limit</div><div class='add'>+conn.1.bound_xl./data/brick01a/homegfs.active_size=690 #Number of inodes undergoing some kind of fop to be precise on which there is at least one ref.</div><div class='add'>+conn.1.bound_xl./data/brick01a/homegfs.lru_size=183 #Number of inodes present in lru list</div><div class='add'>+conn.1.bound_xl./data/brick01a/homegfs.purge_size=0 #Number of inodes present in purge list</div><div class='add'>+```</div><div class='add'>+</div><div class='add'>+### Inode</div><div class='add'>+```</div><div class='add'>+[conn.1.bound_xl./data/brick01a/homegfs.active.324] #324th inode in active inode list</div><div class='add'>+gfid=e6d337cf-97eb-44b3-9492-379ba3f6ad42 #Gfid of the inode</div><div class='add'>+nlookup=13 #Number of times lookups happened from the client or from fuse kernel</div><div class='add'>+fd-count=4 #Number of fds opened on the inode</div><div class='add'>+ref=11 #Number of refs taken on the inode</div><div class='add'>+ia_type=1 #Type of the inode. This should be changed to some string :-(</div><div class='add'>+Ref by xl:.patchy-md-cache=11 #Further this there will be a list of xlators, and the ref count taken by each of them on this inode at the time of statedump</div><div class='add'>+</div><div class='add'>+[conn.1.bound_xl./data/brick01a/homegfs.lru.1] #1st inode in lru list. Note that ref count is zero for these inodes.</div><div class='add'>+gfid=5114574e-69bc-412b-9e52-f13ff087c6fc</div><div class='add'>+nlookup=5</div><div class='add'>+fd-count=0</div><div class='add'>+ref=0</div><div class='add'>+ia_type=2</div><div class='add'>+Ref by xl:.fuse=1</div><div class='add'>+Ref by xl:.patchy-client-0=-1</div><div class='add'>+```</div><div class='add'>+### Inode context</div><div class='add'>+For each inode per xlator some context could be stored. This context can also be printed in the statedump. Here is the inode ctx of locks xlator</div><div class='add'>+```</div><div class='add'>+[xlator.features.locks.homegfs-locks.inode]</div><div class='add'>+path=/homegfs/users/dfrobins/gfstest/r4/SCRATCH/fort.5102 - path of the file</div><div class='add'>+mandatory=0</div><div class='add'>+inodelk-count=5 #Number of inode locks</div><div class='add'>+lock-dump.domain.domain=homegfs-replicate-0:self-heal #Domain name where self-heals take locks to prevent more than one heal on the same file</div><div class='add'>+inodelk.inodelk[0](ACTIVE)=type=WRITE, whence=0, start=0, len=0, pid = 18446744073709551615, owner=080b1ada117f0000, client=0xb7fc30, connection-id=compute-30-029.com-3505-2014/06/29-14:46:12:477358-homegfs-client-0-0-1, granted at Sun Jun 29 11:01:00 2014 #Active lock information</div><div class='add'>+</div><div class='add'>+inodelk.inodelk[1](BLOCKED)=type=WRITE, whence=0, start=0, len=0, pid = 18446744073709551615, owner=c0cb091a277f0000, client=0xad4f10, connection-id=gfs01a.com-4080-2014/06/29-14:41:36:917768-homegfs-client-0-0-0, blocked at Sun Jun 29 11:04:44 2014 #Blocked lock information</div><div class='add'>+</div><div class='add'>+lock-dump.domain.domain=homegfs-replicate-0:metadata #Domain name where metadata operations take locks to maintain replication consistency</div><div class='add'>+lock-dump.domain.domain=homegfs-replicate-0 #Domain name where entry/data operations take locks to maintain replication consistency</div><div class='add'>+inodelk.inodelk[0](ACTIVE)=type=WRITE, whence=0, start=11141120, len=131072, pid = 18446744073709551615, owner=080b1ada117f0000, client=0xb7fc30, connection-id=compute-30-029.com-3505-2014/06/29-14:46:12:477358-homegfs-client-0-0-1, granted at Sun Jun 29 11:10:36 2014 #Active lock information</div><div class='add'>+```</div><div class='add'>+</div><div class='add'>+## FAQ</div><div class='add'>+### How to debug Memory leaks using statedump?</div><div class='add'>+</div><div class='add'>+#### Using memory accounting feature:</div><div class='add'>+</div><div class='add'>+[Bug 1120151](https://bugzilla.redhat.com/show_bug.cgi?id=1120151) is one of the bugs which was debugged using statedump to see which data-structure is leaking. Here is the process used to find what the leak is using statedump. According to the bug the observation is that the process memory usage is increasing whenever one of the bricks is wiped in a replicate volume and a `full` self-heal is invoked to heal the contents. Statedump of the process is taken using `kill -USR1 &lt;pid-of-gluster-self-heal-daemon&gt;`.</div><div class='add'>+```</div><div class='add'>+grep -w num_allocs glusterdump.5225.dump.1405493251</div><div class='add'>+num_allocs=77078</div><div class='add'>+num_allocs=87070</div><div class='add'>+num_allocs=117376</div><div class='add'>+....</div><div class='add'>+</div><div class='add'>+grep hot-count glusterdump.5225.dump.1405493251</div><div class='add'>+hot-count=16384</div><div class='add'>+hot-count=16384</div><div class='add'>+hot-count=4095</div><div class='add'>+....</div><div class='add'>+</div><div class='add'>+Find the occurrences in the statedump file to figure out the tags.</div><div class='add'>+```</div><div class='add'>+grep of the statedump revealed too many allocations for the following data-types under replicate,</div><div class='add'>+</div><div class='add'>+1. gf_common_mt_asprintf</div><div class='add'>+2. gf_common_mt_char</div><div class='add'>+3. gf_common_mt_mem_pool.</div><div class='add'>+</div><div class='add'>+After checking afr-code for allocations with tag `gf_common_mt_char` found `data-self-heal` code path does not free one such allocated memory. `gf_common_mt_mem_pool` suggests that there is a leak in pool memory. `replicate-0:dict_t`, `glusterfs:data_t` and `glusterfs:data_pair_t` pools are using lot of memory, i.e. cold_count is `0` and too many allocations. Checking source code of dict.c revealed that `key` in `dict` is allocated with `gf_common_mt_char` i.e. `2.` tag and value is created using gf_asprintf which in-turn uses `gf_common_mt_asprintf` i.e. `1.`. Browsing the code for leak in self-heal code paths lead to a line which over-writes a variable with new dictionary even when it was already holding a reference to another dictionary. After fixing these leaks, ran the same test to verify that none of the `num_allocs` are increasing even after healing 10,000 files directory hierarchy in statedump of self-heal daemon.</div><div class='add'>+Please check this [patch](http://review.gluster.org/8316) for more info about the fix.</div><div class='add'>+</div><div class='add'>+#### Debugging leaks in memory pools:</div><div class='add'>+Statedump output of memory pools was used to test and verify the fixes to [Bug 1134221](https://bugzilla.redhat.com/show_bug.cgi?id=1134221). On code analysis, dict_t objects were found to be leaking (in terms of not being unref'd enough number of times, during name self-heal. The test involved creating 100 files on plain replicate volume, removing them from one of the brick's backend, and then triggering lookup on them from the mount point. Statedump of the mount process was taken before executing the test case and after it, after compiling glusterfs with -DDEBUG flags (to have cold count set to 0 by default).</div><div class='add'>+</div><div class='add'>+Statedump output of the fuse mount process before the test case was executed:</div><div class='add'>+</div><div class='add'>+```</div><div class='add'>+</div><div class='add'>+pool-name=glusterfs:dict_t</div><div class='add'>+hot-count=0</div><div class='add'>+cold-count=0</div><div class='add'>+padded_sizeof=140</div><div class='add'>+alloc-count=33</div><div class='add'>+max-alloc=0</div><div class='add'>+pool-misses=33</div><div class='add'>+cur-stdalloc=14</div><div class='add'>+max-stdalloc=18</div><div class='add'>+</div><div class='add'>+```</div><div class='add'>+Statedump output of the fuse mount process after the test case was executed:</div><div class='add'>+</div><div class='add'>+```</div><div class='add'>+</div><div class='add'>+pool-name=glusterfs:dict_t</div><div class='add'>+hot-count=0</div><div class='add'>+cold-count=0</div><div class='add'>+padded_sizeof=140</div><div class='add'>+alloc-count=2841</div><div class='add'>+max-alloc=0</div><div class='add'>+pool-misses=2841</div><div class='add'>+cur-stdalloc=214</div><div class='add'>+max-stdalloc=220</div><div class='add'>+</div><div class='add'>+```</div><div class='add'>+Here, with cold count being 0 by default, `cur-stdalloc` indicated the number of `dict_t` objects that were allocated in heap using `mem_get()`, and yet to be freed using `mem_put()` (refer to this [page](../developer-guide/datastructure-mem-pool.md) for more details on how mempool works). After the test case (name selfheal of 100 files), there was a rise in the cur-stdalloc value (from 14 to 214) for `dict_t`.</div><div class='add'>+</div><div class='add'>+After these leaks were fixed, glusterfs was again compiled with -DDEBUG flags, and the same steps were performed again and statedump was taken before and after executing the test case, of the mount. This was done to ascertain the validity of the fix. And the following are the results:</div><div class='add'>+</div><div class='add'>+Statedump output of the fuse mount process before executing the test case:</div><div class='add'>+</div><div class='add'>+```</div><div class='add'>+pool-name=glusterfs:dict_t</div><div class='add'>+hot-count=0</div><div class='add'>+cold-count=0</div><div class='add'>+padded_sizeof=140</div><div class='add'>+alloc-count=33</div><div class='add'>+max-alloc=0</div><div class='add'>+pool-misses=33</div><div class='add'>+cur-stdalloc=14</div><div class='add'>+max-stdalloc=18</div><div class='add'>+</div><div class='add'>+```</div><div class='add'>+Statedump output of the fuse mount process after executing the test case:</div><div class='add'>+</div><div class='add'>+```</div><div class='add'>+pool-name=glusterfs:dict_t</div><div class='add'>+hot-count=0</div><div class='add'>+cold-count=0</div><div class='add'>+padded_sizeof=140</div><div class='add'>+alloc-count=2837</div><div class='add'>+max-alloc=0</div><div class='add'>+pool-misses=2837</div><div class='add'>+cur-stdalloc=14</div><div class='add'>+max-stdalloc=119</div><div class='add'>+</div><div class='add'>+```</div><div class='add'>+The value of cur-stdalloc remained 14 before and after the test, indicating that the fix indeed does what it's supposed to do.</div><div class='add'>+</div><div class='add'>+### How to debug hangs because of frame-loss?</div><div class='add'>+[Bug 994959](https://bugzilla.redhat.com/show_bug.cgi?id=994959) is one of the bugs where statedump was helpful in finding where the frame was lost. Here is the process used to find where the hang is using statedump.</div><div class='add'>+When the hang was observed, statedumps are taken for all the processes. On mount's statedump the following stack is shown:</div><div class='add'>+```</div><div class='add'>+[global.callpool.stack.1.frame.1]</div><div class='add'>+ref_count=1</div><div class='add'>+translator=fuse</div><div class='add'>+complete=0</div><div class='add'>+</div><div class='add'>+[global.callpool.stack.1.frame.2]</div><div class='add'>+ref_count=0</div><div class='add'>+translator=r2-client-1</div><div class='add'>+complete=1 &lt;&lt;----- Client xlator completed the readdirp call and unwound to afr</div><div class='add'>+parent=r2-replicate-0</div><div class='add'>+wind_from=afr_do_readdir</div><div class='add'>+wind_to=children[call_child]-&gt;fops-&gt;readdirp</div><div class='add'>+unwind_from=client3_3_readdirp_cbk</div><div class='add'>+unwind_to=afr_readdirp_cbk</div><div class='add'>+</div><div class='add'>+[global.callpool.stack.1.frame.3]</div><div class='add'>+ref_count=0</div><div class='add'>+translator=r2-replicate-0</div><div class='add'>+complete=0 &lt;&lt;---- Afr xlator is not unwinding for some reason.</div><div class='add'>+parent=r2-dht</div><div class='add'>+wind_from=dht_do_readdir</div><div class='add'>+wind_to=xvol-&gt;fops-&gt;readdirp</div><div class='add'>+unwind_to=dht_readdirp_cbk</div><div class='add'>+</div><div class='add'>+[global.callpool.stack.1.frame.4]</div><div class='add'>+ref_count=1</div><div class='add'>+translator=r2-dht</div><div class='add'>+complete=0</div><div class='add'>+parent=r2-io-cache</div><div class='add'>+wind_from=ioc_readdirp</div><div class='add'>+wind_to=FIRST_CHILD(this)-&gt;fops-&gt;readdirp</div><div class='add'>+unwind_to=ioc_readdirp_cbk</div><div class='add'>+</div><div class='add'>+[global.callpool.stack.1.frame.5]</div><div class='add'>+ref_count=1</div><div class='add'>+translator=r2-io-cache</div><div class='add'>+complete=0</div><div class='add'>+parent=r2-quick-read</div><div class='add'>+wind_from=qr_readdirp</div><div class='add'>+wind_to=FIRST_CHILD (this)-&gt;fops-&gt;readdirp</div><div class='add'>+unwind_to=qr_readdirp_cbk</div><div class='add'>+</div><div class='add'>+```</div><div class='add'>+`unwind_to` shows that call was unwound to `afr_readdirp_cbk` from client xlator.</div><div class='add'>+Inspecting that function revealed that afr is not unwinding the stack when fop failed.</div><div class='add'>+Check this [patch](http://review.gluster.org/5531) for more info about the fix.</div><div class='head'>diff --git a/doc/developer-guide/Language-Bindings.md b/doc/developer-guide/Language-Bindings.md<br/>new file mode 100644<br/>index 00000000000..951f5fae2f6<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/doc/developer-guide/Language-Bindings.md?id=d1d7a6f35c816822fab51c820e25023863c239c1'>doc/developer-guide/Language-Bindings.md</a></div><div class='hunk'>@@ -0,0 +1,45 @@</div><div class='add'>+# Language Bindings</div><div class='add'>+GlusterFS 3.4 introduced the libgfapi client API for C programs. This</div><div class='add'>+page lists bindings to the libgfapi C library from other languages.</div><div class='add'>+</div><div class='add'>+Go</div><div class='add'>+--</div><div class='add'>+</div><div class='add'>+-   [gogfapi](https://github.com/gluster/gogfapi) - Go language bindings</div><div class='add'>+    for libgfapi, aiming to provide an api consistent with the default</div><div class='add'>+    Go file apis.</div><div class='add'>+</div><div class='add'>+Java</div><div class='add'>+----</div><div class='add'>+</div><div class='add'>+-   [libgfapi-jni](https://github.com/semiosis/libgfapi-jni/) - Low</div><div class='add'>+    level JNI binding for libgfapi</div><div class='add'>+-   [glusterfs-java-filesystem](https://github.com/semiosis/glusterfs-java-filesystem)</div><div class='add'>+    - High level NIO.2 FileSystem Provider implementation for the Java</div><div class='add'>+    platform</div><div class='add'>+-   [libgfapi-java-io](https://github.com/gluster/libgfapi-java-io) -</div><div class='add'>+    Java bindings for libgfapi, similar to java.io</div><div class='add'>+</div><div class='add'>+Python</div><div class='add'>+------</div><div class='add'>+</div><div class='add'>+-   [libgfapi-python](https://github.com/gluster/libgfapi-python) -</div><div class='add'>+    Libgfapi bindings for Python</div><div class='add'>+</div><div class='add'>+Ruby</div><div class='add'>+----</div><div class='add'>+</div><div class='add'>+-   [libgfapi-ruby](https://github.com/spajus/libgfapi-ruby) - Libgfapi</div><div class='add'>+    bindings for Ruby using FFI</div><div class='add'>+</div><div class='add'>+Rust</div><div class='add'>+----</div><div class='add'>+</div><div class='add'>+-   [gfapi-sys](https://github.com/cholcombe973/Gfapi-sys) - Libgfapi</div><div class='add'>+    bindings for Rust using FFI</div><div class='add'>+</div><div class='add'>+Perl</div><div class='add'>+----</div><div class='add'>+</div><div class='add'>+-   [libgfapi-perl](https://github.com/gluster/libgfapi-perl) - Libgfapi</div><div class='add'>+    bindings for Perl using FFI</div><div class='head'>diff --git a/doc/developer-guide/README.md b/doc/developer-guide/README.md<br/>new file mode 100644<br/>index 00000000000..aaf9c7476b0<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/doc/developer-guide/README.md?id=d1d7a6f35c816822fab51c820e25023863c239c1'>doc/developer-guide/README.md</a></div><div class='hunk'>@@ -0,0 +1,81 @@</div><div class='add'>+Developers</div><div class='add'>+==========</div><div class='add'>+</div><div class='add'>+### From GlusterDocumentation</div><div class='add'>+</div><div class='add'>+Contributing to the Gluster community</div><div class='add'>+-------------------------------------</div><div class='add'>+</div><div class='add'>+Are you itching to send in patches and participate as a developer in the</div><div class='add'>+Gluster community? Here are a number of starting points for getting</div><div class='add'>+involved. We don't require a signed contributor license agreement or</div><div class='add'>+copyright assignment, but we do require a "signed-off-by" line on each</div><div class='add'>+code check-in.</div><div class='add'>+</div><div class='add'>+-   [License</div><div class='add'>+    Change](http://www.gluster.org/2012/05/glusterfs-license-change/) -</div><div class='add'>+    we recently changed the client library code to a dual license under</div><div class='add'>+    the GPL v2 and the LGPL v3 or later</div><div class='add'>+-   [GlusterFS Coding Standards](./coding-standard.md)</div><div class='add'>+</div><div class='add'>+-   If you are not sure of where to start, and what to do, we have a small</div><div class='add'>+    write-up on what you can pick. [Check it out](./options-to-contribute.md)</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+Adding File operations</div><div class='add'>+----------------------</div><div class='add'>+</div><div class='add'>+-   [Steps to be followed when adding a new FOP to GlusterFS ](./adding-fops.md)</div><div class='add'>+</div><div class='add'>+Automatic File Replication</div><div class='add'>+--------------------------</div><div class='add'>+</div><div class='add'>+-   [Cluster/afr translator](./afr.md)</div><div class='add'>+-   [History of Locking in AFR](./afr-locks-evolution.md)</div><div class='add'>+-   [Self heal Daemon](./afr-self-heal-daemon.md)</div><div class='add'>+</div><div class='add'>+Data Structures</div><div class='add'>+---------------</div><div class='add'>+</div><div class='add'>+-   [inode data structure](./datastructure-inode.md)</div><div class='add'>+-   [iobuf data structure](./datastructure-iobuf.md)</div><div class='add'>+-   [mem-pool data structure](./datastructure-mem-pool.md)</div><div class='add'>+</div><div class='add'>+Find the gfapi symbol versions [here](./gfapi-symbol-versions.md)</div><div class='add'>+</div><div class='add'>+Daemon Management Framework</div><div class='add'>+---------------------------</div><div class='add'>+</div><div class='add'>+-   [How to introduce new daemons using daemon management framework](./daemon-management-framework.md)</div><div class='add'>+</div><div class='add'>+Translators</div><div class='add'>+-----------</div><div class='add'>+</div><div class='add'>+-   [Performance/write-Behind Translator](./write-behind.md)</div><div class='add'>+-   [Translator Development](./translator-development.md)</div><div class='add'>+-   [Storage/posix Translator](./posix.md)</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+Brick multiplex</div><div class='add'>+---------------</div><div class='add'>+</div><div class='add'>+-   [Brick mux resource reduction](./brickmux-thread-reduction.md)</div><div class='add'>+</div><div class='add'>+Fuse</div><div class='add'>+----</div><div class='add'>+</div><div class='add'>+-   [Interrupt handling](./fuse-interrupt.md)</div><div class='add'>+</div><div class='add'>+Testing/Debugging</div><div class='add'>+-----------------</div><div class='add'>+</div><div class='add'>+-   [Unit Tests in GlusterFS](./unittest.md)</div><div class='add'>+-   [Using the Gluster Test</div><div class='add'>+    Framework](./Using-Gluster-Test-Framework.md) - Step by</div><div class='add'>+    step instructions for running the Gluster Test Framework</div><div class='add'>+-   [Coredump Analysis](../debugging/analyzing-regression-cores.md) - Steps to analize coredumps generated by regression machines.</div><div class='add'>+-   [Identifying Resource Leaks](./identifying-resource-leaks.md)</div><div class='add'>+</div><div class='add'>+Release Process</div><div class='add'>+---------------</div><div class='add'>+-   [Versioning](./versioning.md)</div><div class='head'>diff --git a/doc/developer-guide/Using-Gluster-Test-Framework.md b/doc/developer-guide/Using-Gluster-Test-Framework.md<br/>new file mode 100644<br/>index 00000000000..d2bb1c391da<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/doc/developer-guide/Using-Gluster-Test-Framework.md?id=d1d7a6f35c816822fab51c820e25023863c239c1'>doc/developer-guide/Using-Gluster-Test-Framework.md</a></div><div class='hunk'>@@ -0,0 +1,271 @@</div><div class='add'>+# USing Gluster Test Framwork</div><div class='add'>+Description</div><div class='add'>+-----------</div><div class='add'>+</div><div class='add'>+The Gluster Test Framework, is a suite of scripts used for regression</div><div class='add'>+testing of Gluster.</div><div class='add'>+</div><div class='add'>+It runs well on RHEL and CentOS (possibly Fedora too, presently being</div><div class='add'>+tested), and is automatically run against every patch submitted to</div><div class='add'>+Gluster [for review](http://review.gluster.org).</div><div class='add'>+</div><div class='add'>+The Gluster Test Framework is part of the main Gluster code base, living</div><div class='add'>+under the "tests" subdirectory:</div><div class='add'>+</div><div class='add'>+		http://git.gluster.org/?p=glusterfs.git;a=summary</div><div class='add'>+</div><div class='add'>+WARNING</div><div class='add'>+-------</div><div class='add'>+</div><div class='add'>+Running the Gluster Test Framework deletes â€œ/var/lib/glusterd/\*â€.</div><div class='add'>+</div><div class='add'>+**DO NOT run it on a server with any data.**</div><div class='add'>+</div><div class='add'>+Preparation steps for Ubuntu 14.04 LTS</div><div class='add'>+--------------------------------------</div><div class='add'>+</div><div class='add'>+â€‹1. \# apt-get install dbench git libacl1-dev mock nfs-common</div><div class='add'>+nfs-kernel-server libtest-harness-perl libyajl-dev xfsprogs psmisc attr</div><div class='add'>+acl lvm2 rpm</div><div class='add'>+</div><div class='add'>+â€‹2. \# apt-get install python-webob python-paste python-sphinx</div><div class='add'>+</div><div class='add'>+â€‹3. \# apt-get install autoconf automake bison dos2unix flex libfuse-dev</div><div class='add'>+libaio-dev libibverbs-dev librdmacm-dev libtool libxml2-dev</div><div class='add'>+libxml2-utils liblvm2-dev make libssl-dev pkg-config libpython-dev</div><div class='add'>+python-eventlet python-netifaces python-simplejson python-pyxattr</div><div class='add'>+libreadline-dev tar</div><div class='add'>+</div><div class='add'>+â€‹4) Install cmockery2 from github (https://github.com/lpabon/cmockery2)</div><div class='add'>+and compile and make install as in Readme</div><div class='add'>+</div><div class='add'>+5)</div><div class='add'>+</div><div class='add'>+		sudoÂ groupaddÂ mock</div><div class='add'>+		sudoÂ useraddÂ -gÂ mockÂ mock</div><div class='add'>+</div><div class='add'>+â€‹6) mkdir /var/run/gluster</div><div class='add'>+</div><div class='add'>+**Note**: redhat-rpm-config package is not found in ubuntu</div><div class='add'>+</div><div class='add'>+Preparation steps for CentOS 7 (only)</div><div class='add'>+-------------------------------------</div><div class='add'>+</div><div class='add'>+â€‹1. Install EPEL:</div><div class='add'>+</div><div class='add'>+		$Â sudoÂ yumÂ installÂ -yÂ http://epel.mirror.net.in/epel/7/x86_64/e/epel-release-7-1.noarch.rpm</div><div class='add'>+</div><div class='add'>+â€‹2. Install the CentOS 7.x dependencies:</div><div class='add'>+</div><div class='add'>+		$Â sudoÂ yumÂ installÂ -yÂ --enablerepo=epelÂ cmockery2-develÂ dbenchÂ gitÂ libacl-develÂ mockÂ nfs-utilsÂ perl-Test-HarnessÂ yajlÂ xfsprogsÂ psmisc</div><div class='add'>+</div><div class='add'>+		$Â sudoÂ yumÂ installÂ -yÂ --enablerepo=epelÂ python-webob1.0Â python-paste-deploy1.5Â python-sphinx10Â redhat-rpm-config</div><div class='add'>+</div><div class='add'>+==\&gt; Despite below missing packages it worked for me</div><div class='add'>+</div><div class='add'>+		NoÂ packageÂ python-webob1.0Â available.</div><div class='add'>+		NoÂ packageÂ python-paste-deploy1.5Â available.</div><div class='add'>+		NoÂ packageÂ python-sphinx10Â available.</div><div class='add'>+</div><div class='add'>+		$Â sudoÂ yumÂ installÂ -yÂ --enablerepo=epelÂ autoconfÂ automakeÂ bisonÂ dos2unixÂ flexÂ fuse-develÂ libaio-develÂ libibverbs-develÂ \</div><div class='add'>+		Â librdmacm-develÂ libtoolÂ libxml2-develÂ lvm2-develÂ makeÂ openssl-develÂ pkgconfigÂ \</div><div class='add'>+		Â python-develÂ python-eventletÂ python-netifacesÂ python-paste-deployÂ \</div><div class='add'>+		Â python-simplejsonÂ python-sphinxÂ python-webobÂ pyxattrÂ readline-develÂ rpm-buildÂ \</div><div class='add'>+		Â tar</div><div class='add'>+</div><div class='add'>+â€‹3. Create the mock user</div><div class='add'>+</div><div class='add'>+		$Â sudoÂ useraddÂ -gÂ mockÂ mock</div><div class='add'>+</div><div class='add'>+Preparation steps for CentOS 6.3+ (only)</div><div class='add'>+----------------------------------------</div><div class='add'>+</div><div class='add'>+â€‹1. Install EPEL:</div><div class='add'>+</div><div class='add'>+		$Â sudoÂ yumÂ installÂ -yÂ http://download.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm</div><div class='add'>+</div><div class='add'>+â€‹2. Install the CentOS 6.x dependencies:</div><div class='add'>+</div><div class='add'>+		$Â sudoÂ yumÂ installÂ -yÂ --enablerepo=epelÂ cmockery2-develÂ dbenchÂ gitÂ libacl-develÂ mockÂ nfs-utilsÂ perl-Test-HarnessÂ yajlÂ xfsprogs</div><div class='add'>+		$Â sudoÂ yumÂ installÂ -yÂ --enablerepo=epelÂ python-webob1.0Â python-paste-deploy1.5Â python-sphinx10Â redhat-rpm-config</div><div class='add'>+		$Â sudoÂ yumÂ installÂ -yÂ --enablerepo=epelÂ autoconfÂ automakeÂ bisonÂ dos2unixÂ flexÂ fuse-develÂ libaio-develÂ libibverbs-develÂ \</div><div class='add'>+		Â Â librdmacm-develÂ libtoolÂ libxml2-develÂ lvm2-develÂ makeÂ openssl-develÂ pkgconfigÂ \</div><div class='add'>+		Â Â python-develÂ python-eventletÂ python-netifacesÂ python-paste-deployÂ \</div><div class='add'>+		Â Â python-simplejsonÂ python-sphinxÂ python-webobÂ pyxattrÂ readline-develÂ rpm-buildÂ \</div><div class='add'>+		Â Â tar</div><div class='add'>+</div><div class='add'>+â€‹3. Create the mock user</div><div class='add'>+</div><div class='add'>+		$Â sudoÂ useraddÂ -gÂ mockÂ mock</div><div class='add'>+</div><div class='add'>+Preparation steps for RHEL 6.3+ (only)</div><div class='add'>+--------------------------------------</div><div class='add'>+</div><div class='add'>+â€‹1. Ensure you have the "Scalable Filesystem Support" group installed</div><div class='add'>+</div><div class='add'>+This provides the xfsprogs package, which is required by the test</div><div class='add'>+framework.</div><div class='add'>+</div><div class='add'>+â€‹2. Install EPEL:</div><div class='add'>+</div><div class='add'>+		$Â sudoÂ yumÂ installÂ -yÂ http://download.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm</div><div class='add'>+</div><div class='add'>+â€‹3. Install the CentOS 6.x dependencies:</div><div class='add'>+</div><div class='add'>+		$Â sudoÂ yumÂ installÂ -yÂ --enablerepo=epelÂ cmockery2-develÂ dbenchÂ gitÂ libacl-develÂ mockÂ nfs-utilsÂ yajlÂ perl-Test-Harness</div><div class='add'>+		$Â sudoÂ yumÂ installÂ -yÂ --enablerepo=rhel-6-server-optional-rpmsÂ python-webob1.0Â python-paste-deploy1.5Â python-sphinx10Â redhat-rpm-config</div><div class='add'>+		$Â sudoÂ yumÂ installÂ -yÂ --disablerepo=rhs*Â --enablerepo=*optional-rpmsÂ autoconfÂ \</div><div class='add'>+		Â Â automakeÂ bisonÂ dos2unixÂ flexÂ fuse-develÂ libaio-develÂ libibverbs-develÂ \</div><div class='add'>+		Â Â librdmacm-develÂ libtoolÂ libxml2-develÂ lvm2-develÂ makeÂ openssl-develÂ pkgconfigÂ \</div><div class='add'>+		Â Â python-develÂ python-eventletÂ python-netifacesÂ python-paste-deployÂ \</div><div class='add'>+		Â Â python-simplejsonÂ python-sphinxÂ python-webobÂ pyxattrÂ readline-develÂ rpm-buildÂ \</div><div class='add'>+		Â Â tar</div><div class='add'>+</div><div class='add'>+â€‹4. Create the mock user</div><div class='add'>+</div><div class='add'>+		$Â sudoÂ useraddÂ -gÂ mockÂ mock</div><div class='add'>+</div><div class='add'>+Preparation steps for Fedora 16-19 (only)</div><div class='add'>+-----------------------------------------</div><div class='add'>+</div><div class='add'>+**Still in development**</div><div class='add'>+</div><div class='add'>+â€‹1. Install the Fedora dependencies:</div><div class='add'>+</div><div class='add'>+		$Â sudoÂ yumÂ installÂ -yÂ attrÂ cmockery2-develÂ dbenchÂ gitÂ mockÂ nfs-utilsÂ perl-Test-HarnessÂ psmiscÂ xfsprogs</div><div class='add'>+		$Â sudoÂ yumÂ installÂ -yÂ python-webob1.0Â python-paste-deploy1.5Â python-sphinx10Â redhat-rpm-config</div><div class='add'>+		$Â sudoÂ yumÂ installÂ -yÂ autoconfÂ automakeÂ bisonÂ dos2unixÂ flexÂ fuse-develÂ libaio-develÂ libibverbs-develÂ \</div><div class='add'>+		Â Â librdmacm-develÂ libtoolÂ libxml2-develÂ lvm2-develÂ makeÂ openssl-develÂ pkgconfigÂ \</div><div class='add'>+		Â Â python-develÂ python-eventletÂ python-netifacesÂ python-paste-deployÂ \</div><div class='add'>+		Â Â python-simplejsonÂ python-sphinxÂ python-webobÂ pyxattrÂ readline-develÂ rpm-buildÂ \</div><div class='add'>+		Â Â tar</div><div class='add'>+</div><div class='add'>+â€‹3. Create the mock user</div><div class='add'>+</div><div class='add'>+		$Â sudoÂ useraddÂ -gÂ mockÂ mock</div><div class='add'>+</div><div class='add'>+Common steps</div><div class='add'>+------------</div><div class='add'>+</div><div class='add'>+â€‹1. Ensure DNS for your server is working</div><div class='add'>+</div><div class='add'>+The Gluster Test Framework fails miserably if the full domain name for</div><div class='add'>+your server doesn't resolve back to itself.</div><div class='add'>+</div><div class='add'>+If you don't have a working DNS infrastructure in place, adding an entry</div><div class='add'>+for your server to its /etc/hosts file will work.</div><div class='add'>+</div><div class='add'>+â€‹2. Install the version of Gluster you are testing</div><div class='add'>+</div><div class='add'>+Either install an existing set of rpms:</div><div class='add'>+</div><div class='add'>+		$Â sudoÂ yumÂ installÂ [yourÂ glusterÂ rpmsÂ here]</div><div class='add'>+</div><div class='add'>+Or compile your own ones (fairly easy):</div><div class='add'>+</div><div class='add'>+	http://www.gluster.org/community/documentation/index.php/CompilingRPMS</div><div class='add'>+</div><div class='add'>+â€‹3. Clone the GlusterFS git repository</div><div class='add'>+</div><div class='add'>+		$Â gitÂ cloneÂ git://git.gluster.org/glusterfs</div><div class='add'>+		$Â cdÂ glusterfs</div><div class='add'>+</div><div class='add'>+Ensure mock can access the directory</div><div class='add'>+------------------------------------</div><div class='add'>+</div><div class='add'>+Some tests run as the user "mock". If the mock user can't access the</div><div class='add'>+tests subdirectory directory, these tests fail. (rpm.t is one such test)</div><div class='add'>+</div><div class='add'>+This is a known gotcha when the git repo is cloned to your home</div><div class='add'>+directory. Home directories generally don't have world readable</div><div class='add'>+permissions. You can fix this by adjusting your home directory</div><div class='add'>+permissions, or placing the git repo somewhere else (with access for the</div><div class='add'>+mock user).</div><div class='add'>+</div><div class='add'>+Running the tests</div><div class='add'>+-----------------</div><div class='add'>+</div><div class='add'>+The tests need to run as root, so they can mount volumes and manage</div><div class='add'>+gluster processes as needed.</div><div class='add'>+</div><div class='add'>+It's also best to run them directly as the root user, instead of through</div><div class='add'>+sudo. Strange things sporadicly happen (for me) when using the full test</div><div class='add'>+framework through sudo, that haven't happened (yet) when running</div><div class='add'>+directly as root. Hangs in dbench particularly, which are part of at</div><div class='add'>+least one test.</div><div class='add'>+</div><div class='add'>+		#Â ./run-tests.sh</div><div class='add'>+</div><div class='add'>+The test framework takes just over 45 minutes to run in a VM here (4</div><div class='add'>+cpu's assigned, 8GB ram, SSD storage). It may take significantly more or</div><div class='add'>+less time for you, depending on the hardware and software you're using.</div><div class='add'>+</div><div class='add'>+Showing debug information</div><div class='add'>+-------------------------</div><div class='add'>+</div><div class='add'>+To display verbose information while the tests are running, set the</div><div class='add'>+DEBUG environment variable to 1 prior to running the tests.</div><div class='add'>+</div><div class='add'>+		#Â DEBUG=1Â ./run-tests.sh</div><div class='add'>+</div><div class='add'>+Log files</div><div class='add'>+---------</div><div class='add'>+</div><div class='add'>+Verbose output from the rpm.t test goes into "rpmbuild-mock.log",</div><div class='add'>+located in the same directory the test is run from.</div><div class='add'>+</div><div class='add'>+Reporting bugs</div><div class='add'>+--------------</div><div class='add'>+</div><div class='add'>+If you hit a bug when running the test framework, **please** create a</div><div class='add'>+bug report for it on Bugzilla so it gets fixed:</div><div class='add'>+</div><div class='add'>+	https://bugzilla.redhat.com/enter_bug.cgi?product=GlusterFS&amp;component=tests</div><div class='add'>+</div><div class='add'>+Creating your own tests</div><div class='add'>+-----------------------</div><div class='add'>+</div><div class='add'>+The test scripts are written in bash, with their filenames ending in .t</div><div class='add'>+instead of .sh.</div><div class='add'>+</div><div class='add'>+When creating your own test scripts, create them in an appropriate</div><div class='add'>+subdirectory under "tests" (eg "bugs" or "features") and use descriptive</div><div class='add'>+names like "bug-XXXXXXX-checking-feature-X.t"</div><div class='add'>+</div><div class='add'>+Also include the "include.rc" file, which defines the test types and</div><div class='add'>+host/brick/volume defaults:</div><div class='add'>+</div><div class='add'>+		.Â $(dirnameÂ $0)/../include.rc</div><div class='add'>+</div><div class='add'>+There are 5 test types available at present, but feel free to add more</div><div class='add'>+if you need something that doesn't yet exist. The test types are</div><div class='add'>+explained in more detail below.</div><div class='add'>+</div><div class='add'>+Also essential is the "cleanup" command, which removes any existing</div><div class='add'>+Gluster configuration (**without backing it up**), and also kills any</div><div class='add'>+running gluster processes.</div><div class='add'>+</div><div class='add'>+There is a basic test template you can copy, named bug-000000.t in the</div><div class='add'>+bugs subdirectory:</div><div class='add'>+</div><div class='add'>+		$Â cpÂ bugs/bug-000000.tÂ somedir/descriptive-name.t</div><div class='add'>+</div><div class='add'>+### TEST</div><div class='add'>+</div><div class='add'>+-   Example of usage in basic/volume.t</div><div class='add'>+</div><div class='add'>+### TEST\_IN\_LOOP</div><div class='add'>+</div><div class='add'>+-   Example of usage in basic/rpm.t</div><div class='add'>+</div><div class='add'>+### EXPECT</div><div class='add'>+</div><div class='add'>+-   Example of usage in basic/volume.t</div><div class='add'>+</div><div class='add'>+### EXPECT\_WITHIN</div><div class='add'>+</div><div class='add'>+-   Example of usage in basic/volume-status.t</div><div class='add'>+</div><div class='add'>+### EXPECT\_KEYWORD</div><div class='add'>+</div><div class='add'>+-   Defined in include.rc, but seems to be unused?</div><div class='head'>diff --git a/doc/developer-guide/adding-fops.md b/doc/developer-guide/adding-fops.md<br/>new file mode 100644<br/>index 00000000000..3f72ed3e23a<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/doc/developer-guide/adding-fops.md?id=d1d7a6f35c816822fab51c820e25023863c239c1'>doc/developer-guide/adding-fops.md</a></div><div class='hunk'>@@ -0,0 +1,18 @@</div><div class='add'>+Adding a new FOP</div><div class='add'>+================</div><div class='add'>+</div><div class='add'>+Steps to be followed when adding a new FOP to GlusterFS:</div><div class='add'>+</div><div class='add'>+1. Edit `glusterfs.h` and add a `GF_FOP_*` constant.</div><div class='add'>+2. Edit `xlator.[ch]` and:</div><div class='add'>+    * add the new prototype for fop and callback.</div><div class='add'>+    * edit `xlator_fops` structure.</div><div class='add'>+3. Edit `xlator.c` and add to fill_defaults.</div><div class='add'>+4. Edit `protocol.h` and add struct necessary for the new FOP.</div><div class='add'>+5. Edit `defaults.[ch]` and provide default implementation.</div><div class='add'>+6. Edit `call-stub.[ch]` and provide stub implementation.</div><div class='add'>+7. Edit `common-utils.c` and add to gf_global_variable_init().</div><div class='add'>+8. Edit client-protocol and add your FOP.</div><div class='add'>+9. Edit server-protocol and add your FOP.</div><div class='add'>+10. Implement your FOP in any translator for which the default implementation</div><div class='add'>+    is not sufficient.</div><div class='head'>diff --git a/doc/developer-guide/afr-locks-evolution.md b/doc/developer-guide/afr-locks-evolution.md<br/>new file mode 100644<br/>index 00000000000..2dabbcfeb13<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/doc/developer-guide/afr-locks-evolution.md?id=d1d7a6f35c816822fab51c820e25023863c239c1'>doc/developer-guide/afr-locks-evolution.md</a></div><div class='hunk'>@@ -0,0 +1,91 @@</div><div class='add'>+History of locking in AFR</div><div class='add'>+--------------------------</div><div class='add'>+</div><div class='add'>+GlusterFS has **locks** translator which provides the following internal locking operations called `inodelk`, `entrylk` which are used by afr to achieve synchronization of operations on files or directories that conflict with each other.</div><div class='add'>+</div><div class='add'>+`Inodelk` gives the facility for translators in GlusterFS to obtain range (denoted by tuple with **offset**, **length**) locks in a given **domain** for an inode.</div><div class='add'>+Full file lock is denoted by the tuple (offset: `0`, length: `0`) i.e. length `0` is considered as infinity.</div><div class='add'>+</div><div class='add'>+`Entrylk` enables translators of GlusterFS to obtain locks on `name` in a given **domain** for an inode, typically a directory.</div><div class='add'>+</div><div class='add'>+The **locks** translator provides both *blocking* and *nonblocking* variants and of these locks.</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+AFR makes use of locks xlator extensively:</div><div class='add'>+</div><div class='add'>+1)For FOPS (from clients)</div><div class='add'>+-----------------------</div><div class='add'>+* Data transactions take inode locks on data domain, Let's refer to this domain name as DATA_DOMAIN.</div><div class='add'>+</div><div class='add'>+  So locking for writes would be something like this:`inodelk(offset,length, DATA_DOMAIN)`</div><div class='add'>+  For truncating a file to zero, it would be `inodelk(0,0,DATA_DOMAIN)`</div><div class='add'>+</div><div class='add'>+* Metadata transactions (chown/chmod) also take inode locks but on a special range on metadata domain,</div><div class='add'>+  i.e.`(LLONG_MAX-1 , 0, METADATA_DOMAIN).`</div><div class='add'>+</div><div class='add'>+* Entry transactions (create, mkdir, rmdir,unlink, symlink, link,rename) take entrylk on `(name, parent inode)`.</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+2)For self heal:</div><div class='add'>+-------------</div><div class='add'>+* For Metadata self-heal, it is the same.  i.e.`inodelk(LLONG_MAX-1 , 0, METADATA_DOMAIN)`.</div><div class='add'>+* For Entry self-heal, it is `entrylk(NULL name, parent inode)`. Specifying NULL for the name takes full lock on the directory referred to by the inode.</div><div class='add'>+* For data self-heal, there is a bit of history as to how locks evolved:</div><div class='add'>+</div><div class='add'>+### Initial version (say version 1) :</div><div class='add'>+There was no concept of selfheal daemon (shd). Only client lookups triggered heals. so AFR always took `inodelk(0,0,DATA_DOMAIN)` for healing. The issue with this approach was that when heal was in progress, I/O from clients was blocked .</div><div class='add'>+</div><div class='add'>+### version 2:</div><div class='add'>+shd was introduced. We needed to allow I/O to go through when heal was going,provided the ranges did not overlap. To that extent, the following approach was adopted:</div><div class='add'>+</div><div class='add'>++ 1.shd takes (full inodelk in DATA_DOMAIN). Thus client FOPS are blocked and cannot modify changelog-xattrs</div><div class='add'>++ 2.shd inspects xattrs to determine source/sink</div><div class='add'>++ 3.shd takes a chunk inodelk(0-128kb) again in DATA_DOMAIN (locks xlator allows overlapping locks if lock owner is the same).</div><div class='add'>++ 4.unlock full lock</div><div class='add'>++ 5.heal</div><div class='add'>++ 6.take next chunk lock(129-256kb)</div><div class='add'>++ 7.unlock 1st chunk lock, heal the second chunk and so on.</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+Thus after 4, any client FOP could write to regions that was not currently under heal. The exception was truncate (to size 0) because it needs full file lock and will always block because some chunk is always under lock by the shd until heal completes.</div><div class='add'>+</div><div class='add'>+Another issue was that 2 shds could run in parallel. Say SHD1 and SHD2 compete for step 1. Let SHD1 win. It proceeds and completes step 4. Now SHD2 also succeeds in step 1, continues all steps. Thus at the end both shds will decrement the changelog leading to negative values in it)  </div><div class='add'>+</div><div class='add'>+### version 3</div><div class='add'>+To prevent parallel self heals, another domain was introduced, let us call it SELF_HEAL_DOMAIN. With this domain, the following approach was adopted and is **the approach currently in use**:</div><div class='add'>+</div><div class='add'>++ 1.shd takes (full inodelk on SELF_HEAL_DOMAIN)</div><div class='add'>++ 2.shd takes (full inodelk on DATA_DOMAIN)</div><div class='add'>++ 3.shd inspects xattrs  to determine source/sink</div><div class='add'>++ 4.unlock full lock on DATA_DOMAIN</div><div class='add'>++ 5.take chunk lock(0-128kb) on DATA_DOMAIN</div><div class='add'>++ 6.heal</div><div class='add'>++ 7.take next chunk lock(129-256kb) on DATA_DOMAIN</div><div class='add'>++ 8.unlock 1st chunk lock, heal and so on.</div><div class='add'>++ 9.Finally release full lock on SELF_HEAL_DOMAIN</div><div class='add'>+</div><div class='add'>+Thus until one shd completes step 9, another shd cannot start step 1, solving the problem of simultaneous heals.</div><div class='add'>+Note that the issue of truncate (to zero) FOP hanging still remains.</div><div class='add'>+Also there are multiple network calls involved in this scheme. (lock,heal(ie read+write), unlock) per chunk. i.e 4 calls per chunk.</div><div class='add'>+</div><div class='add'>+### version 4 (ToDo)</div><div class='add'>+Some improvements that need to be made in version 3:</div><div class='add'>+* Reduce network calls using piggy backing.</div><div class='add'>+* After taking chunk lock and healing, we need to unlock the lock before locking the next chunk. This gives a window for any pending truncate FOPs to succeed. If truncate succeeds, the heal of next chunk will fail (read returns zero)</div><div class='add'>+and heal is stopped. *BUT* there is **yet another** issue:</div><div class='add'>+</div><div class='add'>+* shd does steps 1 to 4. Let's assume source is brick b1, sink is brick b2 . i.e xattrs are (0,1) and (0,0) on b1 and b2 respectively. Now before shd takes (0-128kb) lock, a client FOP takes it.</div><div class='add'>+It modifies data but the FOP succeeds only on brick 2. writev returns success, and the attrs now read (0,1) (1,0). SHD takes over and heals. It had observed (0,1),(0,0) earlier</div><div class='add'>+and thus goes ahead and copies stale 128Kb from brick 1 to brick2. Thus as far as application is concerned, `writev` returned success but bricks have stale data.</div><div class='add'>+What needs to be done is `writev` must return success only if it succeeded on atleast one source brick (brick b1 in this case). Otherwise  The heal still happens in reverse direction but as far as the application is concerned, it received an error.  </div><div class='add'>+</div><div class='add'>+### Note on lock **domains**</div><div class='add'>+We have used conceptual names in this document like DATA_DOMAIN/ METADATA_DOMAIN/ SELF_HEAL_DOMAIN. In the code, these are mapped to strings that are based on the AFR xlator name like so:</div><div class='add'>+</div><div class='add'>+DATA_DOMAIN     ---&gt;"vol_name-replicate-n"</div><div class='add'>+</div><div class='add'>+METADATA_DOMAIN  ---&gt;"vol_name-replicate-n:metadata"</div><div class='add'>+</div><div class='add'>+SELF_HEAL_DOMAIN --&gt;"vol_name-replicate-n:self-heal"</div><div class='add'>+</div><div class='add'>+where vol_name is the name of the volume and 'n' is the replica subvolume index (starting from 0).</div><div class='head'>diff --git a/doc/developer-guide/afr-self-heal-daemon.md b/doc/developer-guide/afr-self-heal-daemon.md<br/>new file mode 100644<br/>index 00000000000..65940d420b7<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/doc/developer-guide/afr-self-heal-daemon.md?id=d1d7a6f35c816822fab51c820e25023863c239c1'>doc/developer-guide/afr-self-heal-daemon.md</a></div><div class='hunk'>@@ -0,0 +1,92 @@</div><div class='add'>+Self-Heal Daemon</div><div class='add'>+================</div><div class='add'>+The self-heal daemon (shd) is a glusterfs process that is responsible for healing files in a replicate/ disperse gluster volume.</div><div class='add'>+Every server (brick) node of the volume runs one instance of the shd. So even if one node contains replicate/ disperse bricks of</div><div class='add'>+multiple volumes, it would be healed by the same shd.</div><div class='add'>+</div><div class='add'>+This document only describes how the shd works for replicate (AFR) volumes.</div><div class='add'>+</div><div class='add'>+The shd is launched by glusterd when the volume starts (only if the volume includes a replicate configuration). The graph</div><div class='add'>+of the shd process in every node contains the following: The io-stats which is the top most xlator, its children being the</div><div class='add'>+replicate xlators (subvolumes) of *only* the bricks present in that particular node, and finally *all* the client xlators that are the children of the replicate xlators.</div><div class='add'>+</div><div class='add'>+The shd does two types of self-heal crawls: Index heal and Full heal. For both these types of crawls, the basic idea is the same:  </div><div class='add'>+For each file encountered while crawling, perform metadata, data and entry heals under appropriate locks.  </div><div class='add'>+* An overview of how each of these heals is performed is detailed in the 'Self-healing' section of *doc/features/afr-v1.md*</div><div class='add'>+* The different file locks which the shd takes for each of these heals is detailed in *doc/developer</div><div class='add'>+-guide/afr-locks-evolution.md*</div><div class='add'>+</div><div class='add'>+Metadata heal refers to healing extended attributes, mode and permissions of a file or directory.</div><div class='add'>+Data heal refers to healing the file contents.</div><div class='add'>+Entry self-heal refers to healing entries inside a directory.</div><div class='add'>+</div><div class='add'>+Index heal</div><div class='add'>+==========</div><div class='add'>+The index heal is done:  </div><div class='add'>+  a) Every 600 seconds (can be changed via the `cluster.heal-timeout` volume option)  </div><div class='add'>+  b) When it is explicitly triggered via the `gluster vol heal &lt;VOLNAME&gt;` command  </div><div class='add'>+  c) Whenever a replica brick that was down comes back up.  </div><div class='add'>+  </div><div class='add'>+Only one heal can be in progress at one time, irrespective of reason why it was triggered. If another heal is triggered before the first one completes, it will be queued.</div><div class='add'>+Only one heal can be queued while the first one is running. If an Index heal is queued, it can be overridden by queuing a Full heal and not vice-versa.  Also, before processing</div><div class='add'>+each entry in index heal, a check is made if a full heal is queued. If it is, then the index heal is aborted so that the full heal can proceed. </div><div class='add'>+</div><div class='add'>+In index heal, each shd reads the entries present inside .glusterfs/indices/xattrop/ folder and triggers heal on each entry with appropriate locks.</div><div class='add'>+The .glusterfs/indices/xattrop/ directory contains a base entry of the name "xattrop-&lt;virtual-gfid-string&gt;". All other entries are hardlinks to the base entry. The</div><div class='add'>+*names* of the hardlinks are the gfid strings of the files that may need heal. </div><div class='add'>+</div><div class='add'>+When a client (mount) performs an operation on the file, the index xlator present in each brick process adds the hardlinks in the pre-op phase of the FOP's transaction</div><div class='add'>+and removes it in post-op phase if the operation is successful. Thus if an entry is present inside the .glusterfs/indices/xattrop/ directory when there is no I/O </div><div class='add'>+happening on the file, it means the file needs healing (or atleast an examination if the brick crashed after the post-op completed but just before the removal of the hardlink).</div><div class='add'>+</div><div class='add'>+#### Index heal steps:</div><div class='add'>+&lt;pre&gt;&lt;code&gt;</div><div class='add'>+In shd process of *each node* {</div><div class='add'>+        opendir +readdir (.glusterfs/indices/xattrop/)</div><div class='add'>+        for each entry inside it {</div><div class='add'>+                self_heal_entry() //Explained below.</div><div class='add'>+        }</div><div class='add'>+}</div><div class='add'>+&lt;/code&gt;&lt;/pre&gt;</div><div class='add'>+</div><div class='add'>+&lt;pre&gt;&lt;code&gt;</div><div class='add'>+self_heal_entry() {</div><div class='add'>+        Call syncop_lookup(replicae subvolume) which eventually does {</div><div class='add'>+                take appropriate locks</div><div class='add'>+                determine source and sinks from AFR changelog xattrs	</div><div class='add'>+                perform whatever heal is needed (any of metadata, data and entry heal in that order)</div><div class='add'>+                clear changelog xattrs and hardlink inside .glusterfs/indices/xattrop/</div><div class='add'>+        }</div><div class='add'>+}</div><div class='add'>+&lt;/code&gt;&lt;/pre&gt;</div><div class='add'>+</div><div class='add'>+Note:</div><div class='add'>+* If the gfid hardlink is present in the .glusterfs/indices/xattrop/ of both replica bricks, then each shd will try to heal the file but only one of them will be able to proceed due to the self-heal domain lock.</div><div class='add'>+</div><div class='add'>+* While processing entries inside .glusterfs/indices/xattrop/, if shd encounters an entry whose parent is yet to be healed, it will skip it and it will be picked up in the next crawl.</div><div class='add'>+</div><div class='add'>+* If a file is in data/ metadata split-brain, it will not be healed.</div><div class='add'>+</div><div class='add'>+* If a directory is in entry split-brain, a conservative merge will be performed, wherein after the merge, the entries of the directory will be a union of the entries in the replica pairs.</div><div class='add'>+</div><div class='add'>+Full heal</div><div class='add'>+=========</div><div class='add'>+A full heal is triggered by running `gluster vol heal &lt;VOLNAME&gt; full`. This command is usually run in disk replacement scenarios where the entire data is to be copied from one of the healthy bricks of the replica to the brick that was just replaced.</div><div class='add'>+</div><div class='add'>+Unlike the index heal which runs on the shd of every node in a replicate subvolume, the full heal is run only on the shd of one node per replicate subvolume: the node having the highest UUID.</div><div class='add'>+i.e In a 2x2 volume made of 4 nodes N1, N2, N3 and N4, If UUID of N1&gt;N2 and UUID N4 &gt;N3, then the full crawl is carried out by the shds of N1 and N4.(Node UUID can be found in `/var/lib/glusterd/glusterd.info`)</div><div class='add'>+</div><div class='add'>+The full heal steps are almost identical to the index heal, except the heal is performed on each replica starting from the root of the volume:</div><div class='add'>+&lt;pre&gt;&lt;code&gt;</div><div class='add'>+In shd process of *highest UUID node per replica* {</div><div class='add'>+        opendir +readdir ("/")</div><div class='add'>+        for each entry inside it {</div><div class='add'>+                self_heal_entry()</div><div class='add'>+                if (entry == directory) {</div><div class='add'>+                        /* Recurse*/</div><div class='add'>+                        again opendir+readdir (directory) followed by self_heal_entry() of each entry.</div><div class='add'>+                }</div><div class='add'>+                </div><div class='add'>+        }</div><div class='add'>+}</div><div class='add'>+&lt;/code&gt;&lt;/pre&gt;</div><div class='head'>diff --git a/doc/developer-guide/afr.md b/doc/developer-guide/afr.md<br/>new file mode 100644<br/>index 00000000000..566573a4e26<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/doc/developer-guide/afr.md?id=d1d7a6f35c816822fab51c820e25023863c239c1'>doc/developer-guide/afr.md</a></div><div class='hunk'>@@ -0,0 +1,191 @@</div><div class='add'>+cluster/afr translator</div><div class='add'>+======================</div><div class='add'>+</div><div class='add'>+Locking</div><div class='add'>+-------</div><div class='add'>+</div><div class='add'>+Before understanding replicate, one must understand two internal FOPs:</div><div class='add'>+</div><div class='add'>+### `GF_FILE_LK`</div><div class='add'>+</div><div class='add'>+This is exactly like `fcntl(2)` locking, except the locks are in a</div><div class='add'>+separate domain from locks held by applications.</div><div class='add'>+</div><div class='add'>+### `GF_DIR_LK (loc_t *loc, char *basename)`</div><div class='add'>+</div><div class='add'>+This allows one to lock a name under a directory. For example,</div><div class='add'>+to lock /mnt/glusterfs/foo, one would use the call:</div><div class='add'>+</div><div class='add'>+```</div><div class='add'>+GF_DIR_LK ({loc_t for "/mnt/glusterfs"}, "foo")</div><div class='add'>+```</div><div class='add'>+</div><div class='add'>+If one wishes to lock *all* the names under a particular directory,</div><div class='add'>+supply the basename argument as `NULL`.</div><div class='add'>+</div><div class='add'>+The locks can either be read locks or write locks; consult the</div><div class='add'>+function prototype for more details.</div><div class='add'>+</div><div class='add'>+Both these operations are implemented by the features/locks (earlier</div><div class='add'>+known as posix-locks) translator.</div><div class='add'>+</div><div class='add'>+Basic design</div><div class='add'>+------------</div><div class='add'>+</div><div class='add'>+All FOPs can be classified into four major groups:</div><div class='add'>+</div><div class='add'>+### inode-read</div><div class='add'>+</div><div class='add'>+Operations that read an inode's data (file contents) or metadata (perms, etc.).</div><div class='add'>+</div><div class='add'>+access, getxattr, fstat, readlink, readv, stat.</div><div class='add'>+</div><div class='add'>+### inode-write</div><div class='add'>+</div><div class='add'>+Operations that modify an inode's data or metadata.</div><div class='add'>+</div><div class='add'>+chmod, chown, truncate, writev, utimens.</div><div class='add'>+</div><div class='add'>+### dir-read</div><div class='add'>+</div><div class='add'>+Operations that read a directory's contents or metadata.</div><div class='add'>+</div><div class='add'>+readdir, getdents, checksum.</div><div class='add'>+</div><div class='add'>+### dir-write</div><div class='add'>+</div><div class='add'>+Operations that modify a directory's contents or metadata.</div><div class='add'>+</div><div class='add'>+create, link, mkdir, mknod, rename, rmdir, symlink, unlink.</div><div class='add'>+</div><div class='add'>+Some of these make a subgroup in that they modify *two* different entries:</div><div class='add'>+link, rename, symlink.</div><div class='add'>+</div><div class='add'>+### Others</div><div class='add'>+</div><div class='add'>+Other operations.</div><div class='add'>+</div><div class='add'>+flush, lookup, open, opendir, statfs.</div><div class='add'>+</div><div class='add'>+Algorithms</div><div class='add'>+----------</div><div class='add'>+</div><div class='add'>+Each of the four major groups has its own algorithm:</div><div class='add'>+</div><div class='add'>+### inode-read, dir-read</div><div class='add'>+</div><div class='add'>+1. Send a request to the first child that is up:</div><div class='add'>+    * if it fails:</div><div class='add'>+        * try the next available child</div><div class='add'>+    * if we have exhausted all children:</div><div class='add'>+        * return failure</div><div class='add'>+</div><div class='add'>+### inode-write</div><div class='add'>+</div><div class='add'>+ All operations are done in parallel unless specified otherwise.</div><div class='add'>+</div><div class='add'>+1. Send a ``GF_FILE_LK`` request on all children for a write lock on the </div><div class='add'>+   appropriate region</div><div class='add'>+   (for metadata operations: entire file (0, 0) for writev:</div><div class='add'>+   (offset, offset+size of buffer))</div><div class='add'>+    * If a lock request fails on a child:</div><div class='add'>+        * unlock all children</div><div class='add'>+        * try to acquire a blocking lock (`F_SETLKW`) on each child, serially.</div><div class='add'>+	  If this fails (due to `ENOTCONN` or `EINVAL`):</div><div class='add'>+          Consider this child as dead for rest of transaction.</div><div class='add'>+2. Mark all children as "pending" on all (alive) children (see below for </div><div class='add'>+meaning of "pending").</div><div class='add'>+    * If it fails on any child:</div><div class='add'>+        * mark it as dead (in transaction local state).</div><div class='add'>+3. Perform operation on all (alive) children.</div><div class='add'>+    * If it fails on any child:</div><div class='add'>+        * mark it as dead (in transaction local state).</div><div class='add'>+4. Unmark all successful children as not "pending" on all nodes.</div><div class='add'>+5. Unlock region on all (alive) children.</div><div class='add'>+</div><div class='add'>+### dir-write</div><div class='add'>+</div><div class='add'>+ The algorithm for dir-write is same as above except instead of holding</div><div class='add'>+ `GF_FILE_LK` locks we hold a GF_DIR_LK lock on the name being operated upon.</div><div class='add'>+ In case of link-type calls, we hold locks on both the operand names.</div><div class='add'>+</div><div class='add'>+"pending"</div><div class='add'>+---------</div><div class='add'>+</div><div class='add'>+The "pending" number is like a journal entry. A pending entry is an</div><div class='add'>+array of 32-bit integers stored in network byte-order as the extended</div><div class='add'>+attribute of an inode (which can be a directory as well).</div><div class='add'>+</div><div class='add'>+There are three keys corresponding to three types of pending operations:</div><div class='add'>+</div><div class='add'>+### `AFR_METADATA_PENDING`</div><div class='add'>+</div><div class='add'>+There are some metadata operations pending on this inode (perms, ctime/mtime,</div><div class='add'>+xattr, etc.).</div><div class='add'>+</div><div class='add'>+### `AFR_DATA_PENDING`</div><div class='add'>+</div><div class='add'>+There is some data pending on this inode (writev).</div><div class='add'>+</div><div class='add'>+### `AFR_ENTRY_PENDING`</div><div class='add'>+</div><div class='add'>+There are some directory operations pending on this directory</div><div class='add'>+(create, unlink, etc.).</div><div class='add'>+</div><div class='add'>+Self heal</div><div class='add'>+---------</div><div class='add'>+</div><div class='add'>+* On lookup, gather extended attribute data:</div><div class='add'>+    * If entry is a regular file:</div><div class='add'>+        * If an entry is present on one child and not on others:</div><div class='add'>+            * create entry on others.</div><div class='add'>+        * If entries exist but have different metadata (perms, etc.):</div><div class='add'>+            * consider the entry with the highest `AFR_METADATA_PENDING` number as</div><div class='add'>+              definitive and replicate its attributes on children.</div><div class='add'>+    * If entry is a directory:</div><div class='add'>+        * Consider the entry with the highest `AFR_ENTRY_PENDING` number as</div><div class='add'>+          definitive and replicate its contents on all children.</div><div class='add'>+    * If any two entries have non-matching types (i.e., one is file and</div><div class='add'>+      other is directory):</div><div class='add'>+        * Announce to the user via log that a split-brain situation has been</div><div class='add'>+          detected, and do nothing.</div><div class='add'>+* On open, gather extended attribute data:</div><div class='add'>+    * Consider the file with the highest `AFR_DATA_PENDING` number as</div><div class='add'>+      the definitive one and replicate its contents on all other</div><div class='add'>+      children.</div><div class='add'>+</div><div class='add'>+During all self heal operations, appropriate locks must be held on all</div><div class='add'>+regions/entries being affected.</div><div class='add'>+</div><div class='add'>+Inode scaling</div><div class='add'>+-------------</div><div class='add'>+</div><div class='add'>+Inode scaling is necessary because if a situation arises where an inode number </div><div class='add'>+is returned for a directory (by lookup) which was previously the inode number </div><div class='add'>+of a file (as per FUSE's table), then FUSE gets horribly confused (consult a </div><div class='add'>+FUSE expert for more details).</div><div class='add'>+</div><div class='add'>+To avoid such a situation, we distribute the 64-bit inode space equally</div><div class='add'>+among all children of replicate.</div><div class='add'>+</div><div class='add'>+To illustrate:</div><div class='add'>+</div><div class='add'>+If c1, c2, c3 are children of replicate, they each get 1/3 of the available</div><div class='add'>+inode space:</div><div class='add'>+</div><div class='add'>+-------------  --  --  --  --  --  --  --  --  --  --  --  ---</div><div class='add'>+Child:         c1  c2  c3  c1  c2  c3  c1  c2  c3  c1  c2  ...</div><div class='add'>+Inode number:  1    2   3   4   5   6   7   8   9  10  11  ...</div><div class='add'>+-------------  --  --  --  --  --  --  --  --  --  --  --  ---</div><div class='add'>+</div><div class='add'>+Thus, if lookup on c1 returns an inode number "2", it is scaled to "4"</div><div class='add'>+(which is the second inode number in c1's space).</div><div class='add'>+</div><div class='add'>+This way we ensure that there is never a collision of inode numbers from</div><div class='add'>+two different children.</div><div class='add'>+</div><div class='add'>+This reduction of inode space doesn't really reduce the usability of</div><div class='add'>+replicate since even if we assume replicate has 1024 children (which would be a</div><div class='add'>+highly unusual scenario), each child still has a 54-bit inode space:</div><div class='add'>+$2^{54} \sim 1.8 \times 10^{16}$, which is much larger than any real</div><div class='add'>+world requirement.</div><div class='head'>diff --git a/doc/developer-guide/brickmux-thread-reduction.md b/doc/developer-guide/brickmux-thread-reduction.md<br/>new file mode 100644<br/>index 00000000000..7d76e8ff579<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/doc/developer-guide/brickmux-thread-reduction.md?id=d1d7a6f35c816822fab51c820e25023863c239c1'>doc/developer-guide/brickmux-thread-reduction.md</a></div><div class='hunk'>@@ -0,0 +1,64 @@</div><div class='add'>+# Resource usage reduction in brick multiplexing</div><div class='add'>+</div><div class='add'>+Each brick is regresented with a graph of translators in a brick process.</div><div class='add'>+Each translator in the graph has its own set of threads and mem pools</div><div class='add'>+and other system resources allocations. Most of the times all these</div><div class='add'>+resources are not put to full use. Reducing the resource consumption</div><div class='add'>+of each brick is a problem in itself that needs to be addressed. The other</div><div class='add'>+aspect to it is, sharing of resources across brick graph, this becomes</div><div class='add'>+critical in brick multiplexing scenario. In this document we will be discussing</div><div class='add'>+only about the threads.</div><div class='add'>+</div><div class='add'>+If a brick mux process hosts 50 bricks there are atleast 600+ threads created</div><div class='add'>+in that process. Some of these are global threads that are shared by all the</div><div class='add'>+brick graphs, and others are per translator threads. The global threads like</div><div class='add'>+synctask threads, timer threads, sigwaiter, poller etc. are configurable and</div><div class='add'>+do not needs to be reduced. The per translator threads keeps growing as the</div><div class='add'>+number of bricks in the process increases. Each brick spawns atleast 10+</div><div class='add'>+threads:</div><div class='add'>+- io-threads</div><div class='add'>+- posix threads:</div><div class='add'>+     1. Janitor</div><div class='add'>+     2. Fsyncer</div><div class='add'>+     3. Helper</div><div class='add'>+     4. aio-thread</div><div class='add'>+- changelog and bitrot threads(even when the features are not enabled)</div><div class='add'>+</div><div class='add'>+## io-threads</div><div class='add'>+</div><div class='add'>+io-threads should be made global to the process, having 16+ threads for</div><div class='add'>+each brick does not make sense. But io-thread translator is loaded in</div><div class='add'>+the graph, and the position of io-thread translator decides from when</div><div class='add'>+the fops will be parallelised across threads. We cannot entirely move</div><div class='add'>+the io-threads to libglusterfs and say the multiplexing happens from</div><div class='add'>+the master translator or so. Hence, the io-thread orchestrator code</div><div class='add'>+is moved to libglusterfs, which ensures there is only one set of</div><div class='add'>+io-threads that is shared among the io-threads translator in each brick.</div><div class='add'>+This poses performance issues due to lock-contention in the io-threds</div><div class='add'>+layer. This also shall be addressed by having multiple locks instead of</div><div class='add'>+one global lock for io-threads.</div><div class='add'>+</div><div class='add'>+## Posix threads</div><div class='add'>+Most of the posix threads execute tasks in a timely manner, hence it can be</div><div class='add'>+replaced with a timer whose handler register a task to synctask framework, once</div><div class='add'>+the task is complete, the timer is registered again. With this we can eliminate</div><div class='add'>+the need of one thread for each task. The problem with using synctasks is</div><div class='add'>+the performance impact it will have due to make/swapcontext. For task that</div><div class='add'>+does not involve network wait, we need not do makecontext, instead the task</div><div class='add'>+function with arg can be stored and executed when a synctask thread is free.</div><div class='add'>+We need to implement an api in synctask to execute atomic tasks(no network wait)</div><div class='add'>+without the overhead of make/swapcontext. This will solve the performance</div><div class='add'>+impact associated with using synctask framework.</div><div class='add'>+</div><div class='add'>+And the other challenge, is to cancel all the tasks pending from a translator.</div><div class='add'>+This is important to cleanly detach brick. For this, we need to implement an</div><div class='add'>+api in synctask that can cancel all the tasks from a given translator.</div><div class='add'>+</div><div class='add'>+For future, this will be replced to use global thread-pool(once implemented).</div><div class='add'>+</div><div class='add'>+## Changelog and bitrot threads</div><div class='add'>+</div><div class='add'>+In the initial implementation, the threads are not created if the feature is</div><div class='add'>+not enabled. We need to share threads across changelog instances if we plan</div><div class='add'>+to enable these features in brick mux scenario.</div><div class='add'>+</div><div class='head'>diff --git a/doc/developer-guide/coding-standard.md b/doc/developer-guide/coding-standard.md<br/>new file mode 100644<br/>index 00000000000..031c6c0da99<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/doc/developer-guide/coding-standard.md?id=d1d7a6f35c816822fab51c820e25023863c239c1'>doc/developer-guide/coding-standard.md</a></div><div class='hunk'>@@ -0,0 +1,697 @@</div><div class='add'>+GlusterFS Coding Standards</div><div class='add'>+==========================</div><div class='add'>+</div><div class='add'>+Before you get started</div><div class='add'>+----------------------</div><div class='add'>+Before starting with other part of coding standard, install `clang-format`</div><div class='add'>+</div><div class='add'>+On Fedora:</div><div class='add'>+```</div><div class='add'>+$ dnf install clang</div><div class='add'>+```</div><div class='add'>+On debian/Ubuntu:</div><div class='add'>+```</div><div class='add'>+$ apt-get install clang</div><div class='add'>+```</div><div class='add'>+Once you are done with all the local changes, you need to run below set of commands,</div><div class='add'>+before submitting the patch for review.</div><div class='add'>+```</div><div class='add'>+$ git add $file # if any</div><div class='add'>+$ git commit -a -s -m "commit message"</div><div class='add'>+$ git show --pretty="format:" --name-only | grep -v "contrib/" | egrep "*\.[ch]$" | xargs clang-format -i</div><div class='add'>+$ git diff # see if there are any changes</div><div class='add'>+$ git commit -a --amend # get the format changes done</div><div class='add'>+$ ./submit-for-review.sh</div><div class='add'>+```</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+Structure definitions should have a comment per member</div><div class='add'>+------------------------------------------------------</div><div class='add'>+</div><div class='add'>+Every member in a structure definition must have a comment about its purpose.</div><div class='add'>+The comment should be descriptive without being overly verbose.  For pointer</div><div class='add'>+members, lifecycle concerns for the pointed-to object should be noted.  For lock</div><div class='add'>+members, the relationship between the lock member and the other members it</div><div class='add'>+protects should be explicit.</div><div class='add'>+</div><div class='add'>+*Bad:*</div><div class='add'>+</div><div class='add'>+```</div><div class='add'>+gf_lock_t   lock;           /* lock */</div><div class='add'>+```</div><div class='add'>+</div><div class='add'>+*Good:*</div><div class='add'>+</div><div class='add'>+```</div><div class='add'>+DBTYPE      access_mode;    /* access mode for accessing</div><div class='add'>+                             * the databases, can be</div><div class='add'>+                             * DB_HASH, DB_BTREE</div><div class='add'>+                             * (option access-mode &lt;mode&gt;)</div><div class='add'>+                             */</div><div class='add'>+```</div><div class='add'>+</div><div class='add'>+Structure members should be aligned based on the padding requirements</div><div class='add'>+---------------------------------------------------------------------</div><div class='add'>+</div><div class='add'>+The compiler will make sure that structure members have optimum alignment,</div><div class='add'>+but at the expense of suboptimal padding. More important is to optimize the</div><div class='add'>+padding. The compiler won't do that for you.</div><div class='add'>+</div><div class='add'>+This also will help utilize the memory better</div><div class='add'>+</div><div class='add'>+*Bad:*</div><div class='add'>+```</div><div class='add'>+struct bad {</div><div class='add'>+    bool  b; /* 0 */</div><div class='add'>+             /* 1..7 pad */</div><div class='add'>+    void *p; /* 8..15 */</div><div class='add'>+    char  c; /* 16 */</div><div class='add'>+    char  a[16]; /* 17..33 */</div><div class='add'>+             /* 34..39 pad */</div><div class='add'>+    int64_t ii; /* 40..47 */</div><div class='add'>+    int32_t i; /* 48..51 */</div><div class='add'>+             /* 52..55 pad */</div><div class='add'>+    int64_t iii; /* 56..63 */</div><div class='add'>+};</div><div class='add'>+```</div><div class='add'>+</div><div class='add'>+*Good:*</div><div class='add'>+```</div><div class='add'>+struct good {</div><div class='add'>+   int64_t ii; /* explicit 64-bit types */</div><div class='add'>+   void *p; /* may be 64- or 32-bit */</div><div class='add'>+   long  l;   /* may be 64- or 32-bit */</div><div class='add'>+   int   i;   /* 32-bit */</div><div class='add'>+   short s;   /* 16-bit */</div><div class='add'>+   char  c;   /* 8-bit */</div><div class='add'>+   bool  b;   /* 8-bit */</div><div class='add'>+   char  a[1024];</div><div class='add'>+);</div><div class='add'>+```</div><div class='add'>+Make sure the items with the most stringent alignment requirements will need</div><div class='add'>+to come earliest (ie, pointers and  perhaps uint64_t etc), and those with less</div><div class='add'>+stringent alignment requirements at the end (uint16/uint8 and char). Also note</div><div class='add'>+that the long array (if any) should be at the end of the structure, regardless</div><div class='add'>+of the type.</div><div class='add'>+</div><div class='add'>+Also note, if your structure's overall size is crossing 1k-4k limit, it is</div><div class='add'>+recommended to mention the reason why the particular structure needs so much</div><div class='add'>+memory as a comment at the top.</div><div class='add'>+</div><div class='add'>+Use \_typename for struct tags and typename\_t for typedefs</div><div class='add'>+---------------------------------------------------------</div><div class='add'>+</div><div class='add'>+Being consistent here makes it possible to automate navigation from use of a</div><div class='add'>+type to its true definition (not just the typedef).</div><div class='add'>+</div><div class='add'>+*Bad:*</div><div class='add'>+</div><div class='add'>+```</div><div class='add'>+struct thing {...};</div><div class='add'>+struct thing_t {...};</div><div class='add'>+typedef struct _thing thing;</div><div class='add'>+```</div><div class='add'>+</div><div class='add'>+*Good:*</div><div class='add'>+</div><div class='add'>+```</div><div class='add'>+typedef struct _thing {...} thing_t;</div><div class='add'>+```</div><div class='add'>+</div><div class='add'>+No double underscores</div><div class='add'>+---------------------</div><div class='add'>+</div><div class='add'>+Identifiers beginning with double underscores are supposed to reserved for the</div><div class='add'>+compiler.</div><div class='add'>+</div><div class='add'>+http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf</div><div class='add'>+</div><div class='add'>+When you need to define inner/outer functions, use a different prefix/suffix.</div><div class='add'>+</div><div class='add'>+*Bad:*</div><div class='add'>+</div><div class='add'>+```</div><div class='add'>+void __do_something (void);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+do_something (void)</div><div class='add'>+{</div><div class='add'>+        LOCK ();</div><div class='add'>+        __do_something ();</div><div class='add'>+        UNLOCK ();</div><div class='add'>+}</div><div class='add'>+```</div><div class='add'>+</div><div class='add'>+*Good:*</div><div class='add'>+</div><div class='add'>+```</div><div class='add'>+void do_something_locked (void);</div><div class='add'>+```</div><div class='add'>+</div><div class='add'>+Only use safe pointers in initializers</div><div class='add'>+----------------------------------------------------------</div><div class='add'>+</div><div class='add'>+Some pointers, such as `this` in a fop function, can be assumed to be non-NULL.</div><div class='add'>+However, other parameters and further-derived values might be NULL.</div><div class='add'>+</div><div class='add'>+*Good:*</div><div class='add'>+</div><div class='add'>+```</div><div class='add'>+pid_t pid     = frame-&gt;root-&gt;pid;</div><div class='add'>+```</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+*Bad:*</div><div class='add'>+</div><div class='add'>+```</div><div class='add'>+data_t *my_data = dict_get (xdata, "fubar");</div><div class='add'>+```</div><div class='add'>+</div><div class='add'>+No giant stack allocations</div><div class='add'>+--------------------------</div><div class='add'>+</div><div class='add'>+Synctasks have small finite stacks.  To avoid overflowing these stacks, avoid</div><div class='add'>+allocating any large data structures on the stack.  Use dynamic allocation</div><div class='add'>+instead.</div><div class='add'>+</div><div class='add'>+*Bad:*</div><div class='add'>+</div><div class='add'>+```</div><div class='add'>+gf_boolean_t port_inuse[65536]; /* 256KB, this actually happened */</div><div class='add'>+```</div><div class='add'>+</div><div class='add'>+NOTE: Ideal is to limit the stack array to less than 256 bytes.</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+Character array initializing</div><div class='add'>+----------------------------</div><div class='add'>+</div><div class='add'>+It is recommended to keep the character array initializing to empty string.</div><div class='add'>+</div><div class='add'>+*Good:*</div><div class='add'>+```</div><div class='add'>+char msg[1024] = "";</div><div class='add'>+```</div><div class='add'>+</div><div class='add'>+Not so much recommended, even though it means the same.</div><div class='add'>+</div><div class='add'>+```</div><div class='add'>+char msg[1024] = {0,};</div><div class='add'>+```</div><div class='add'>+</div><div class='add'>+We recommend above to structure initialization.</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+Validate all arguments to a function</div><div class='add'>+------------------------------------</div><div class='add'>+</div><div class='add'>+All pointer arguments to a function must be checked for `NULL`.</div><div class='add'>+A macro named `GF_VALIDATE_OR_GOTO` (in `common-utils.h`)</div><div class='add'>+takes two arguments; if the first is `NULL`, it writes a log message and</div><div class='add'>+jumps to a label specified by the second aergument after setting errno</div><div class='add'>+appropriately. There are several variants of this function for more</div><div class='add'>+specific purposes, and their use is recommended.</div><div class='add'>+</div><div class='add'>+*Bad:*</div><div class='add'>+</div><div class='add'>+```</div><div class='add'>+/* top of function */</div><div class='add'>+ret = dict_get (xdata, ...)</div><div class='add'>+```</div><div class='add'>+</div><div class='add'>+*Good:*</div><div class='add'>+</div><div class='add'>+```</div><div class='add'>+/* top of function */</div><div class='add'>+GF_VALIDATE_OR_GOTO(xdata,out);</div><div class='add'>+ret = dict_get (xdata, ...)</div><div class='add'>+```</div><div class='add'>+</div><div class='add'>+Never rely on precedence of operators</div><div class='add'>+-------------------------------------</div><div class='add'>+</div><div class='add'>+Never write code that relies on the precedence of operators to execute</div><div class='add'>+correctly.  Such code can be hard to read and someone else might not</div><div class='add'>+know the precedence of operators as accurately as you do.  This includes</div><div class='add'>+precedence of increment/decrement vs. field/subscript.  The only exceptions are</div><div class='add'>+arithmetic operators (which have had defined precedence since before computers</div><div class='add'>+even existed) and boolean negation.</div><div class='add'>+</div><div class='add'>+*Bad:*</div><div class='add'>+</div><div class='add'>+```</div><div class='add'>+if (op_ret == -1 &amp;&amp; errno != ENOENT)</div><div class='add'>+++foo-&gt;bar      /* incrementing foo, or incrementing foo-&gt;bar? */</div><div class='add'>+a &amp;&amp; b || !c</div><div class='add'>+```</div><div class='add'>+</div><div class='add'>+*Good:*</div><div class='add'>+</div><div class='add'>+```</div><div class='add'>+if ((op_ret == -1) &amp;&amp; (errno != ENOENT))</div><div class='add'>+(++foo)-&gt;bar</div><div class='add'>+++(foo-&gt;bar)</div><div class='add'>+(a &amp;&amp; b) || !c</div><div class='add'>+a &amp;&amp; (b || !c)</div><div class='add'>+```</div><div class='add'>+</div><div class='add'>+Use exactly matching types</div><div class='add'>+--------------------------</div><div class='add'>+</div><div class='add'>+Use a variable of the exact type declared in the manual to hold the</div><div class='add'>+return value of a function. Do not use an 'equivalent' type.</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+*Bad:*</div><div class='add'>+</div><div class='add'>+```</div><div class='add'>+int len = strlen (path);</div><div class='add'>+```</div><div class='add'>+</div><div class='add'>+*Good:*</div><div class='add'>+</div><div class='add'>+```</div><div class='add'>+size_t len = strlen (path);</div><div class='add'>+```</div><div class='add'>+</div><div class='add'>+Avoid code such as `foo-&gt;bar-&gt;baz`; check every pointer</div><div class='add'>+-------------------------------------------------------------</div><div class='add'>+</div><div class='add'>+Do not write code that blindly follows a chain of pointer references. Any</div><div class='add'>+pointer in the chain may be `NULL` and thus cause a crash. Verify that each</div><div class='add'>+pointer is non-null before following it.  Even if `foo-&gt;bar` has been checked</div><div class='add'>+and is known safe, repeating it can make code more verbose and less clear.</div><div class='add'>+</div><div class='add'>+This rule includes `[]` as well as `-&gt;` because both dereference pointers.</div><div class='add'>+</div><div class='add'>+*Bad:*</div><div class='add'>+</div><div class='add'>+```</div><div class='add'>+foo-&gt;bar-&gt;field1 = value1;</div><div class='add'>+xyz = foo-&gt;bar-&gt;field2 + foo-&gt;bar-&gt;field3 * foo-&gt;bar-&gt;field4;</div><div class='add'>+foo-&gt;bar[5].baz</div><div class='add'>+```</div><div class='add'>+</div><div class='add'>+*Good:*</div><div class='add'>+</div><div class='add'>+```</div><div class='add'>+my_bar = foo-&gt;bar;</div><div class='add'>+if (!my_bar) ... return;</div><div class='add'>+my_bar-&gt;field1 = value1;</div><div class='add'>+xyz = my_bar-&gt;field2 + my_bar-&gt;field3 * my_bar-&gt;field4;</div><div class='add'>+```</div><div class='add'>+</div><div class='add'>+Document unchecked return values</div><div class='add'>+----------------------------------------------------</div><div class='add'>+</div><div class='add'>+In general, return values should be checked.  If a function is being called</div><div class='add'>+for its side effects and the return value really doesn't matter, an explicit</div><div class='add'>+cast to void is required (to keep static analyzers happy) and a comment is</div><div class='add'>+recommended.</div><div class='add'>+</div><div class='add'>+*Bad:*</div><div class='add'>+</div><div class='add'>+```</div><div class='add'>+close (fd);</div><div class='add'>+do_important_thing ();</div><div class='add'>+```</div><div class='add'>+</div><div class='add'>+*Good (or at least OK):*</div><div class='add'>+</div><div class='add'>+```</div><div class='add'>+(void) sleep (1);</div><div class='add'>+```</div><div class='add'>+</div><div class='add'>+Gracefully handle failure of malloc (and other allocation functions)</div><div class='add'>+--------------------------------------------------------------------</div><div class='add'>+</div><div class='add'>+GlusterFS should never crash or exit due to lack of memory. If a</div><div class='add'>+memory allocation fails, the call should be unwound and an error</div><div class='add'>+returned to the user.</div><div class='add'>+</div><div class='add'>+*Use result args and reserve the return value to indicate success or failure:*</div><div class='add'>+</div><div class='add'>+The return value of every functions must indicate success or failure (unless</div><div class='add'>+it is impossible for the function to fail --- e.g., boolean functions). If</div><div class='add'>+the function needs to return additional data, it must be returned using a</div><div class='add'>+result (pointer) argument.</div><div class='add'>+</div><div class='add'>+*Bad:*</div><div class='add'>+</div><div class='add'>+```</div><div class='add'>+int32_t dict_get_int32 (dict_t *this, char *key);</div><div class='add'>+```</div><div class='add'>+</div><div class='add'>+*Good:*</div><div class='add'>+</div><div class='add'>+```</div><div class='add'>+int dict_get_int32 (dict_t *this, char *key, int32_t *val);</div><div class='add'>+```</div><div class='add'>+</div><div class='add'>+Always use the 'n' versions of string functions</div><div class='add'>+-----------------------------------------------</div><div class='add'>+</div><div class='add'>+Unless impossible, use the length-limited versions of the string functions.</div><div class='add'>+</div><div class='add'>+*Bad:*</div><div class='add'>+</div><div class='add'>+```</div><div class='add'>+strcpy (entry_path, real_path);</div><div class='add'>+```</div><div class='add'>+</div><div class='add'>+*Good:*</div><div class='add'>+</div><div class='add'>+```</div><div class='add'>+strncpy (entry_path, real_path, entry_path_len);</div><div class='add'>+```</div><div class='add'>+</div><div class='add'>+Do not use memset prior to sprintf/snprintf/vsnprintf etc...</div><div class='add'>+------------------------------------------------------------</div><div class='add'>+snprintf(and other similar string functions) terminates the buffer with a</div><div class='add'>+'\0'(null character). Hence, there is no need to do a memset before using</div><div class='add'>+snprintf. (Of course you need to account one extra byte for the null character</div><div class='add'>+in your allocation).</div><div class='add'>+</div><div class='add'>+Note: Similarly if you are doing pre-memory allocation for the buffer, use</div><div class='add'>+GF_MALLOC instead of GF_CALLOC, since the later is bit costlier.</div><div class='add'>+</div><div class='add'>+*Bad:*</div><div class='add'>+</div><div class='add'>+```</div><div class='add'>+char buffer[x];</div><div class='add'>+memset (buffer, 0, x);</div><div class='add'>+bytes_read = snprintf (buffer, sizeof buffer, "bad standard");</div><div class='add'>+```</div><div class='add'>+</div><div class='add'>+*Good:*</div><div class='add'>+```</div><div class='add'>+char buffer[x];</div><div class='add'>+bytes_read = snprintf (buffer, sizeof (buffer), "good standard");</div><div class='add'>+```</div><div class='add'>+</div><div class='add'>+And it is always to good initialize the char array if the string is static.</div><div class='add'>+</div><div class='add'>+E.g.</div><div class='add'>+```</div><div class='add'>+char buffer[] = "good standard";</div><div class='add'>+```</div><div class='add'>+</div><div class='add'>+No dead or commented code</div><div class='add'>+-------------------------</div><div class='add'>+</div><div class='add'>+There must be no dead code (code to which control can never be passed) or</div><div class='add'>+commented out code in the codebase.</div><div class='add'>+</div><div class='add'>+Function length or Keep functions small</div><div class='add'>+---------------------------------------</div><div class='add'>+</div><div class='add'>+We live in the UNIX-world where modules do one thing and do it well.</div><div class='add'>+This rule should apply to our functions also. If a function is very long, try splitting it</div><div class='add'>+into many little helper functions. The question is, in a coding</div><div class='add'>+spree, how do we know a function is long and unreadable. One rule of</div><div class='add'>+thumb given by Linus Torvalds is that, a function should be broken-up</div><div class='add'>+if you have 4 or more levels of indentation going on for more than 3-4</div><div class='add'>+lines.</div><div class='add'>+</div><div class='add'>+*Example for a helper function:*</div><div class='add'>+```</div><div class='add'>+static int</div><div class='add'>+same_owner (posix_lock_t *l1, posix_lock_t *l2)</div><div class='add'>+{</div><div class='add'>+        return ((l1-&gt;client_pid == l2-&gt;client_pid) &amp;&amp;</div><div class='add'>+               (l1-&gt;transport  == l2-&gt;transport));</div><div class='add'>+}</div><div class='add'>+```</div><div class='add'>+</div><div class='add'>+Define functions as static</div><div class='add'>+--------------------------</div><div class='add'>+</div><div class='add'>+Declare functions as static unless they're exposed via a module-level API for</div><div class='add'>+use from other modules.</div><div class='add'>+</div><div class='add'>+No nested functions</div><div class='add'>+-------------------</div><div class='add'>+</div><div class='add'>+Nested functions have proven unreliable, e.g. as callbacks in code that uses</div><div class='add'>+ucontext (green) threads,</div><div class='add'>+</div><div class='add'>+Use inline functions instead of macros whenever possible</div><div class='add'>+--------------------------------------------------------</div><div class='add'>+</div><div class='add'>+Inline functions enforce type safety; macros do not.  Use macros only for things</div><div class='add'>+that explicitly need to be type-agnostic (e.g. cases where one might use</div><div class='add'>+generics or templates in other languages), or that use other preprocessor</div><div class='add'>+features such as `#` for stringification or `##` for token pasting.  In general,</div><div class='add'>+"static inline" is the preferred form.</div><div class='add'>+</div><div class='add'>+Avoid copypasta</div><div class='add'>+---------------</div><div class='add'>+</div><div class='add'>+Code that is copied and then pasted into multiple functions often creates</div><div class='add'>+maintenance problems later, e.g. updating all but one instance for a subsequent</div><div class='add'>+change.  If you find yourself copying the same "boilerplate" many places,</div><div class='add'>+consider refactoring to use helper functions (including inline) or macros, or</div><div class='add'>+code generation.</div><div class='add'>+</div><div class='add'>+Ensure function calls wrap around after 80-columns</div><div class='add'>+--------------------------------------------------</div><div class='add'>+</div><div class='add'>+Place remaining arguments on the next line if needed.</div><div class='add'>+</div><div class='add'>+Functions arguments and function definition</div><div class='add'>+-------------------------------------------</div><div class='add'>+</div><div class='add'>+Place all the arguments of a function definition on the same line</div><div class='add'>+until the line goes beyond 80-cols. Arguments that extend beyind</div><div class='add'>+80-cols should be placed on the next line.</div><div class='add'>+</div><div class='add'>+Style issues</div><div class='add'>+------------</div><div class='add'>+</div><div class='add'>+### Brace placement</div><div class='add'>+</div><div class='add'>+Use K&amp;R/Linux style of brace placement for blocks.</div><div class='add'>+</div><div class='add'>+*Good:*</div><div class='add'>+</div><div class='add'>+```</div><div class='add'>+int some_function (...)</div><div class='add'>+{</div><div class='add'>+        if (...) {</div><div class='add'>+                /* ... */</div><div class='add'>+        } else if (...) {</div><div class='add'>+                /* ... */</div><div class='add'>+        } else {</div><div class='add'>+                /* ... */</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        do {</div><div class='add'>+                /* ... */</div><div class='add'>+        } while (cond);</div><div class='add'>+}</div><div class='add'>+```</div><div class='add'>+</div><div class='add'>+### Indentation</div><div class='add'>+</div><div class='add'>+Use *eight* spaces for indenting blocks. Ensure that your</div><div class='add'>+file contains only spaces and not tab characters. You can do this</div><div class='add'>+in Emacs by selecting the entire file (`C-x h`) and</div><div class='add'>+running `M-x untabify`.</div><div class='add'>+</div><div class='add'>+To make Emacs indent lines automatically by eight spaces, add this</div><div class='add'>+line to your `.emacs`:</div><div class='add'>+</div><div class='add'>+```</div><div class='add'>+(add-hook 'c-mode-hook (lambda () (c-set-style "linux")))</div><div class='add'>+```</div><div class='add'>+</div><div class='add'>+### Comments</div><div class='add'>+</div><div class='add'>+Write a comment before every function describing its purpose (one-line),</div><div class='add'>+its arguments, and its return value. Mention whether it is an internal</div><div class='add'>+function or an exported function.</div><div class='add'>+</div><div class='add'>+Write a comment before every structure describing its purpose, and</div><div class='add'>+write comments about each of its members.</div><div class='add'>+</div><div class='add'>+Follow the style shown below for comments, since such comments</div><div class='add'>+can then be automatically extracted by doxygen to generate</div><div class='add'>+documentation.</div><div class='add'>+</div><div class='add'>+*Good:*</div><div class='add'>+</div><div class='add'>+```</div><div class='add'>+/**</div><div class='add'>+* hash_name -hash function for filenames</div><div class='add'>+* @par:  parent inode number</div><div class='add'>+* @name: basename of inode</div><div class='add'>+* @mod:  number of buckets in the hashtable</div><div class='add'>+*</div><div class='add'>+* @return: success: bucket number</div><div class='add'>+*          failure: -1</div><div class='add'>+*</div><div class='add'>+* Not for external use.</div><div class='add'>+*/</div><div class='add'>+```</div><div class='add'>+</div><div class='add'>+### Indicating critical sections</div><div class='add'>+</div><div class='add'>+To clearly show regions of code which execute with locks held, use</div><div class='add'>+the following format:</div><div class='add'>+</div><div class='add'>+```</div><div class='add'>+pthread_mutex_lock (&amp;mutex);</div><div class='add'>+{</div><div class='add'>+        /* code */</div><div class='add'>+}</div><div class='add'>+pthread_mutex_unlock (&amp;mutex);</div><div class='add'>+```</div><div class='add'>+</div><div class='add'>+### Always use braces</div><div class='add'>+</div><div class='add'>+Even around single statements.</div><div class='add'>+</div><div class='add'>+*Bad:*</div><div class='add'>+</div><div class='add'>+```</div><div class='add'>+if (condition) action ();</div><div class='add'>+</div><div class='add'>+if (condition)</div><div class='add'>+        action ();</div><div class='add'>+```</div><div class='add'>+</div><div class='add'>+*Good:*</div><div class='add'>+</div><div class='add'>+```</div><div class='add'>+if (condition) {</div><div class='add'>+        action ();</div><div class='add'>+}</div><div class='add'>+```</div><div class='add'>+</div><div class='add'>+### Avoid multi-line conditionals</div><div class='add'>+</div><div class='add'>+These can be hard to read and even harder to modify later.  Predicate functions</div><div class='add'>+and helper variables are always better for maintainability.</div><div class='add'>+</div><div class='add'>+*Bad:*</div><div class='add'>+</div><div class='add'>+```</div><div class='add'>+if ((thing1 &amp;&amp; other_complex_condition (thing1, lots, of, args))</div><div class='add'>+    || (!thing2 || even_more_complex_condition (thing2))</div><div class='add'>+    || all_sorts_of_stuff_with_thing3) {</div><div class='add'>+    return;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+```</div><div class='add'>+</div><div class='add'>+*Better:*</div><div class='add'>+</div><div class='add'>+```</div><div class='add'>+thing1_ok = predicate1 (thing1, lots, of, args</div><div class='add'>+thing2_ok = predicate2 (thing2);</div><div class='add'>+thing3_ok = predicate3 (thing3);</div><div class='add'>+</div><div class='add'>+if (!thing1_ok || !thing2_ok || !thing3_ok) {</div><div class='add'>+        return;</div><div class='add'>+}</div><div class='add'>+```</div><div class='add'>+</div><div class='add'>+*Best:*</div><div class='add'>+</div><div class='add'>+```</div><div class='add'>+if (thing1 &amp;&amp; other_complex_condition (thing1, lots, of, args)) {</div><div class='add'>+        return;</div><div class='add'>+}</div><div class='add'>+if (!thing2 || even_more_complex_condition (thing2)) {</div><div class='add'>+        /* Note potential for a different message here. */</div><div class='add'>+        return;</div><div class='add'>+}</div><div class='add'>+if (all_sorts_of_stuff_with_thing3) {</div><div class='add'>+        /* And here too. */</div><div class='add'>+        return;</div><div class='add'>+}</div><div class='add'>+```</div><div class='add'>+</div><div class='add'>+### Use 'const' liberally</div><div class='add'>+</div><div class='add'>+If a value isn't supposed/expected to change, there's no cost to adding a</div><div class='add'>+'const' keyword and it will help prevent violation of expectations.</div><div class='add'>+</div><div class='add'>+### Avoid global variables (including 'static' auto variables)</div><div class='add'>+Almost all state in Gluster is contextual and should be contained in the</div><div class='add'>+appropriate structure reflecting its scope (e.g. `call\_frame\_t`, `call\_stack\_t`,</div><div class='add'>+`xlator\_t`, `glusterfs\_ctx\_t`).  With dynamic loading and graph switches in play,</div><div class='add'>+each global requires careful consideration of when it should be initialized or</div><div class='add'>+reinitialized, when it might _accidentally_ be reinitialized, when its value</div><div class='add'>+might become stale, and so on.  A few global variables are needed to serve as</div><div class='add'>+'anchor points' for these structures, and more exceptions to the rule might be</div><div class='add'>+approved in the future, but new globals should not be added to the codebase</div><div class='add'>+without explicit approval.</div><div class='add'>+</div><div class='add'>+## A skeleton fop function</div><div class='add'>+</div><div class='add'>+This is the recommended template for any fop. In the beginning come the</div><div class='add'>+initializations. After that, the 'success' control flow should be linear.  Any</div><div class='add'>+error conditions should cause a `goto` to a label at the end.  By convention</div><div class='add'>+this is 'out' if there is only one such label, but a cascade of such labels is</div><div class='add'>+allowable to support multi-stage cleanup.  At that point, the code should detect</div><div class='add'>+the error that has occurred and do appropriate cleanup.</div><div class='add'>+</div><div class='add'>+```</div><div class='add'>+int32_t</div><div class='add'>+sample_fop (call_frame_t *frame, xlator_t *this, ...)</div><div class='add'>+{</div><div class='add'>+        char *            var1     = NULL;</div><div class='add'>+        int32_t           op_ret   = -1;</div><div class='add'>+        int32_t           op_errno = 0;</div><div class='add'>+        DIR *             dir      = NULL;</div><div class='add'>+        struct posix_fd * pfd      = NULL;</div><div class='add'>+</div><div class='add'>+        VALIDATE_OR_GOTO (frame, out);</div><div class='add'>+        VALIDATE_OR_GOTO (this, out);</div><div class='add'>+</div><div class='add'>+        /* other validations */</div><div class='add'>+</div><div class='add'>+        dir = opendir (...);</div><div class='add'>+</div><div class='add'>+        if (dir == NULL) {</div><div class='add'>+                op_errno = errno;</div><div class='add'>+                gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='add'>+                        "opendir failed on %s (%s)", loc-&gt;path,</div><div class='add'>+                        strerror (op_errno));</div><div class='add'>+                goto out;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        /* another system call */</div><div class='add'>+        if (...) {</div><div class='add'>+                op_errno = ENOMEM;</div><div class='add'>+                gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='add'>+                        "out of memory :(");</div><div class='add'>+                goto out;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        /* ... */</div><div class='add'>+</div><div class='add'>+ out:</div><div class='add'>+        if (op_ret == -1) {</div><div class='add'>+</div><div class='add'>+          /* check for all the cleanup that needs to be</div><div class='add'>+             done */</div><div class='add'>+</div><div class='add'>+                if (dir) {</div><div class='add'>+                        closedir (dir);</div><div class='add'>+                        dir = NULL;</div><div class='add'>+                }</div><div class='add'>+</div><div class='add'>+                if (pfd) {</div><div class='add'>+                        FREE (pfd-&gt;path);</div><div class='add'>+                        FREE (pfd);</div><div class='add'>+                        pfd = NULL;</div><div class='add'>+                }</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        STACK_UNWIND (frame, op_ret, op_errno, fd);</div><div class='add'>+        return 0;</div><div class='add'>+}</div><div class='add'>+```</div><div class='head'>diff --git a/doc/developer-guide/commit-guidelines.md b/doc/developer-guide/commit-guidelines.md<br/>new file mode 100644<br/>index 00000000000..38bbe525cbd<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/doc/developer-guide/commit-guidelines.md?id=d1d7a6f35c816822fab51c820e25023863c239c1'>doc/developer-guide/commit-guidelines.md</a></div><div class='hunk'>@@ -0,0 +1,136 @@</div><div class='add'>+## Git Commit Good Practice</div><div class='add'>+</div><div class='add'>+The following document is based on experience doing code development, bug troubleshooting and code review across a number of projects using Git. The document is mostly borrowed from [Open Stack](https://wiki.openstack.org/wiki/GitCommitMessages), but made more meaningful in the context of GlusterFS project.</div><div class='add'>+</div><div class='add'>+This topic can be split into two areas of concern</div><div class='add'>+</div><div class='add'>+* The structured set/split of the code changes</div><div class='add'>+* The information provided in the commit message</div><div class='add'>+</div><div class='add'>+### Executive Summary</div><div class='add'>+The points and examples that will be raised in this document ought to clearly demonstrate the value in splitting up changes into a sequence of individual commits, and the importance in writing good commit messages to go along with them. If these guidelines were widely applied it would result in a significant improvement in the quality of the GlusterFS Git history. Both a carrot &amp; stick will be required to effect changes. This document intends to be the carrot by alerting people to the benefits, while anyone doing Gerrit code review can act as the stick ;-P</div><div class='add'>+</div><div class='add'>+In other words, when reviewing a change in Gerrit:</div><div class='add'>+* Do not simply look at the correctness of the code.</div><div class='add'>+* Review the commit message itself and request improvements to its content.</div><div class='add'>+* Look out for commits which are mixing multiple logical changes and require the submitter to split them into separate commits.</div><div class='add'>+* Ensure whitespace changes are not mixed in with functional changes.</div><div class='add'>+* Ensure no-op code refactoring is done separately from functional changes.</div><div class='add'>+</div><div class='add'>+And so on.</div><div class='add'>+</div><div class='add'>+It might be mentioned that Gerrit's handling of patch series is not entirely perfect. Let that not become a valid reason to avoid creating patch series. The tools being used should be subservient to developers needs, and since they are open source they can be fixed / improved. Software source code is "read mostly, write occassionally" and thus the most important criteria is to improve the long term maintainability by the large pool of developers in the community, and not to sacrifice too much for the sake of the single author who may never touch the code again.</div><div class='add'>+</div><div class='add'>+And now the long detailed guidelines &amp; examples of good &amp; bad practice</div><div class='add'>+</div><div class='add'>+### Structural split of changes</div><div class='add'>+The cardinal rule for creating good commits is to ensure there is only one "logical change" per commit. There are many reasons why this is an important rule:</div><div class='add'>+</div><div class='add'>+* The smaller the amount of code being changed, the quicker &amp; easier it is to review &amp; identify potential flaws.</div><div class='add'>+* If a change is found to be flawed later, it may be necessary to revert the broken commit. This is much easier to do if there are not other unrelated code changes entangled with the original commit.</div><div class='add'>+* When troubleshooting problems using Git's bisect capability, small well defined changes will aid in isolating exactly where the code problem was introduced.</div><div class='add'>+* When browsing history using Git annotate/blame, small well defined changes also aid in isolating exactly where &amp; why a piece of code came from.</div><div class='add'>+</div><div class='add'>+#### Things to avoid when creating commits</div><div class='add'>+With the above points in mind, there are some commonly encountered examples of bad things to avoid</div><div class='add'>+</div><div class='add'>+* Mixing whitespace changes with functional code changes.</div><div class='add'>+</div><div class='add'>+The whitespace changes will obscure the important functional changes, making it harder for a reviewer to correctly determine whether the change is correct. Solution: Create 2 commits, one with the whitespace changes, one with the functional changes. Typically the whitespace change would be done first, but that need not be a hard rule.</div><div class='add'>+</div><div class='add'>+* Mixing two unrelated functional changes.</div><div class='add'>+</div><div class='add'>+Again the reviewer will find it harder to identify flaws if two unrelated changes are mixed together. If it becomes necessary to later revert a broken commit, the two unrelated changes will need to be untangled, with further risk of bug creation.</div><div class='add'>+</div><div class='add'>+* Sending large new features in a single giant commit.</div><div class='add'>+</div><div class='add'>+It may well be the case that the code for a new feature is only useful when all of it is present. This does not, however, imply that the entire feature should be provided in a single commit. New features often entail refactoring existing code. It is highly desirable that any refactoring is done in commits which are separate from those implementing the new feature. This helps reviewers and test suites validate that the refactoring has no unintentional functional changes.</div><div class='add'>+</div><div class='add'>+Even the newly written code can often be split up into multiple pieces that can be independently reviewed. For example, changes which add new internal fops or library functions, can be in self-contained commits. Again this leads to easier code review. It also allows other developers to cherry-pick small parts of the work, if the entire new feature is not immediately ready for merge. This will encourage the author &amp; reviewers to think about the generic library functions' design, and not simply pick a design that is easier for their currently chosen internal implementation.</div><div class='add'>+</div><div class='add'>+The basic rule to follow is</div><div class='add'>+</div><div class='add'>+If a code change can be split into a sequence of patches/commits, then it should be split. Less is not more. More is more.</div><div class='add'>+</div><div class='add'>+##### Examples of bad practice</div><div class='add'>+</div><div class='add'>+TODO: Pick glusterfs specific example.</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+##### Examples of good practice</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+### Information in commit messages</div><div class='add'>+As important as the content of the change, is the content of the commit message describing it. When writing a commit message there are some important things to remember</div><div class='add'>+</div><div class='add'>+* Do not assume the reviewer understands what the original problem was.</div><div class='add'>+</div><div class='add'>+When reading bug reports, after a number of back &amp; forth comments, it is often as clear as mud, what the root cause problem is. The commit message should have a clear statement as to what the original problem is. The bug is merely interesting historical background on /how/ the problem was identified. It should be possible to review a proposed patch for correctness without needing to read the bug ticket.</div><div class='add'>+</div><div class='add'>+* Do not assume the reviewer has access to external web services/site.</div><div class='add'>+</div><div class='add'>+In 6 months time when someone is on a train/plane/coach/beach/pub troubleshooting a problem &amp; browsing Git history, there is no guarantee they will have access to the online bug tracker, or online blueprint documents. The great step forward with distributed SCM is that you no longer need to be "online" to have access to all information about the code repository. The commit message should be totally self-contained, to maintain that benefit.</div><div class='add'>+</div><div class='add'>+* Do not assume the code is self-evident/self-documenting.</div><div class='add'>+</div><div class='add'>+What is self-evident to one person, might be clear as mud to another person. Always document what the original problem was and how it is being fixed, for any change except the most obvious typos, or whitespace only commits.</div><div class='add'>+</div><div class='add'>+* Describe why a change is being made.</div><div class='add'>+</div><div class='add'>+A common mistake is to just document how the code has been written, without describing /why/ the developer chose to do it that way. By all means describe the overall code structure, particularly for large changes, but more importantly describe the intent/motivation behind the changes.</div><div class='add'>+</div><div class='add'>+* Read the commit message to see if it hints at improved code structure.</div><div class='add'>+</div><div class='add'>+Often when describing a large commit message, it becomes obvious that a commit should have in fact been split into 2 or more parts. Don't be afraid to go back and rebase the change to split it up into separate commits.</div><div class='add'>+</div><div class='add'>+* Ensure sufficient information to decide whether to review.</div><div class='add'>+</div><div class='add'>+When Gerrit sends out email alerts for new patch submissions there is minimal information included, principally the commit message and the list of files changes. Given the high volume of patches, it is not reasonable to expect all reviewers to examine the patches in detail. The commit message must thus contain sufficient information to alert the potential reviewers to the fact that this is a patch they need to look at.</div><div class='add'>+</div><div class='add'>+* The first commit line is the most important.</div><div class='add'>+</div><div class='add'>+In Git commits the first line of the commit message has special significance. It is used as email subject line, git annotate messages, gitk viewer annotations, merge commit messages and many more places where space is at a premium. As well as summarizing the change itself, it should take care to detail what part of the code is affected. eg if it is 'afr', 'dht' or any translator. Or in some cases, it can be touching all these components, but the commit message can be 'coverity:', 'txn-framework:', 'new-fop: ', etc.</div><div class='add'>+</div><div class='add'>+* Describe any limitations of the current code.</div><div class='add'>+</div><div class='add'>+If the code being changed still has future scope for improvements, or any known limitations then mention these in the commit message. This demonstrates to the reviewer that the broader picture has been considered and what tradeoffs have been done in terms of short term goals vs. long term wishes.</div><div class='add'>+</div><div class='add'>+* Do not include patch set-specific comments.</div><div class='add'>+</div><div class='add'>+In other words, if you rebase your change please don't add "Patch set 2: rebased" to your commit message. That isn't going to be relevant once your change has merged. Please do make a note of that in Gerrit as a comment on your change, however. It helps reviewers know what changed between patch sets. This also applies to comments such as "Added unit tests", "Fixed localization problems", or any other such patch set to patch set changes that don't affect the overall intent of your commit.</div><div class='add'>+</div><div class='add'>+**The main rule to follow is:**</div><div class='add'>+</div><div class='add'>+The commit message must contain all the information required to fully understand &amp; review the patch for correctness. Less is not more. More is more.</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+#### Including external references</div><div class='add'>+</div><div class='add'>+The commit message is primarily targeted towards human interpretation, but there is always some metadata provided for machine use. In the case of GlusterFS this includes at least the 'Change-id', "bug"/"feature" ID references and "Signed-off-by" tag (generated by 'git commit -s').</div><div class='add'>+</div><div class='add'>+The 'Change-id' line is a unique hash describing the change, which is generated by a Git commit hook. This should not be changed when rebasing a commit following review feedback, since it is used by Gerrit, to track versions of a patch.</div><div class='add'>+</div><div class='add'>+The 'bug' line can reference a bug in a few ways. Gerrit creates a link to the bug when viewing the patch on review.gluster.org so that reviewers can quickly access the bug/issue on Bugzilla or Github.</div><div class='add'>+</div><div class='add'>+**Fixes: bz#1601166** -- use 'Fixes: bz#NNNNN' if the commit is intended to fully fix and close the bug being referenced.</div><div class='add'>+**Fixes: #411** -- use 'Fixes: #NNN' if the patch fixes the github issue completely.</div><div class='add'>+</div><div class='add'>+**Updates: bz#1193929** -- use 'Updates: bz#NNNN' if the commit is only a partial fix and more work is needed.</div><div class='add'>+**Updates: #175** -- use 'Updates: #NNNN' if the commit is only a partial fix and more work is needed for the feature completion.</div><div class='add'>+</div><div class='add'>+We encourage the use of `Co-Authored-By: name &lt;name@example.com&gt;` in commit messages to indicate people who worked on a particular patch. It's a convention for recognizing multiple authors, and our projects would encourage the stats tools to observe it when collecting statistics.</div><div class='add'>+</div><div class='add'>+### Summary of Git commit message structure</div><div class='add'>+</div><div class='add'>+* Provide a brief description of the change in the first line.</div><div class='add'>+* The first line should be limited to 50 characters and should not end with a period.</div><div class='add'>+</div><div class='add'>+* Insert a single blank line after the first line.</div><div class='add'>+</div><div class='add'>+* Provide a detailed description of the change in the following lines, breaking paragraphs where needed.</div><div class='add'>+</div><div class='add'>+* Subsequent lines should be wrapped at 72 characters.</div><div class='add'>+</div><div class='add'>+Put the 'Change-id', 'Fixes bz#NNNNN' and 'Signed-off-by: &lt;&gt;' lines at the very end.</div><div class='add'>+</div><div class='add'>+TODO: Add good examples</div><div class='head'>diff --git a/doc/developer-guide/daemon-management-framework.md b/doc/developer-guide/daemon-management-framework.md<br/>new file mode 100644<br/>index 00000000000..592192e665d<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/doc/developer-guide/daemon-management-framework.md?id=d1d7a6f35c816822fab51c820e25023863c239c1'>doc/developer-guide/daemon-management-framework.md</a></div><div class='hunk'>@@ -0,0 +1,38 @@</div><div class='add'>+</div><div class='add'>+How to introduce new daemons using daemon management framework</div><div class='add'>+==============================================================</div><div class='add'>+Glusterd manages GlusterFS daemons providing services like NFS, Proactive</div><div class='add'>+self-heal, Quota, User servicable snapshots etc. Following are some of the</div><div class='add'>+aspects that come under daemon management.</div><div class='add'>+</div><div class='add'>+Data members &amp; functions of different management objects</div><div class='add'>+</div><div class='add'>+- **Connection Management**</div><div class='add'>+    - unix domain sockets based channel for internal communication</div><div class='add'>+    - rpc connection for the communication</div><div class='add'>+    - frame timeout value for UDS</div><div class='add'>+    - Methods - notify</div><div class='add'>+    - init, connect, termination, disconnect APIs can be invoked using the</div><div class='add'>+      connection management object</div><div class='add'>+</div><div class='add'>+- **Process Management**</div><div class='add'>+    - Name of the process</div><div class='add'>+    - pidfile to detect if the daemon is running</div><div class='add'>+    - loggging directory, log file, volfile, volfileserver &amp; volfileid</div><div class='add'>+    - init, stop APIs can be invoked using the process management object</div><div class='add'>+</div><div class='add'>+- **Service Management**</div><div class='add'>+    - connection object</div><div class='add'>+    - process object</div><div class='add'>+    - online status</div><div class='add'>+    - Methods - manager, start, stop which can be abstracted as a common methods</div><div class='add'>+      or specific to service requirements</div><div class='add'>+    - init API can be invoked using the service management object</div><div class='add'>+</div><div class='add'>+ The above structures defines the skeleton of the daemon management framework.</div><div class='add'>+ Introduction of new daemons in GlusterFS needs to inherit these properties. Any</div><div class='add'>+ requirement specific to a daemon needs to be implemented in its own service</div><div class='add'>+ (for eg : snapd defines its own type glusterd_snapdsvc_t using glusterd_svc_t</div><div class='add'>+ and snapd specific data). New daemons will need to have its own service specific</div><div class='add'>+ code written in glusterd-&lt;feature&gt;-svc.h{c} and need to reuse the existing</div><div class='add'>+ framework.</div><div class='head'>diff --git a/doc/developer-guide/datastructure-inode.md b/doc/developer-guide/datastructure-inode.md<br/>new file mode 100644<br/>index 00000000000..45d7a941e5f<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/doc/developer-guide/datastructure-inode.md?id=d1d7a6f35c816822fab51c820e25023863c239c1'>doc/developer-guide/datastructure-inode.md</a></div><div class='hunk'>@@ -0,0 +1,221 @@</div><div class='add'>+# Inode and dentry management in GlusterFS:</div><div class='add'>+</div><div class='add'>+## Background</div><div class='add'>+Filesystems internally refer to files and directories via inodes. Inodes</div><div class='add'>+are unique identifiers of the entities stored in a filesystem. Whenever an</div><div class='add'>+application has to operate on a file/directory (read/modify), the filesystem</div><div class='add'>+maps that file/directory to the right inode and start referring to that inode</div><div class='add'>+whenever an operation has to be performed on the file/directory.</div><div class='add'>+</div><div class='add'>+In GlusterFS a new inode gets created whenever a new file/directory is created</div><div class='add'>+OR when a successful lookup is done on a file/directory for the first time.</div><div class='add'>+Inodes in GlusterFS are maintained by the inode table which gets initiated when</div><div class='add'>+the filesystem daemon is started (both for the brick process as well as the</div><div class='add'>+mount process). Below are some important data structures for inode management.</div><div class='add'>+</div><div class='add'>+## Data-structure (inode-table)</div><div class='add'>+```</div><div class='add'>+struct _inode_table {</div><div class='add'>+        pthread_mutex_t    lock;</div><div class='add'>+        size_t             hashsize;    /* bucket size of inode hash and dentry hash */</div><div class='add'>+        char              *name;        /* name of the inode table, just for gf_log() */</div><div class='add'>+        inode_t           *root;        /* root directory inode, with inode</div><div class='add'>+        number and gfid 1 */</div><div class='add'>+        xlator_t          *xl;          /* xlator to be called to do purge and</div><div class='add'>+        the xlator which maintains the inode table*/</div><div class='add'>+        uint32_t           lru_limit;   /* maximum LRU cache size */</div><div class='add'>+        struct list_head  *inode_hash;  /* buckets for inode hash table */</div><div class='add'>+        struct list_head  *name_hash;   /* buckets for dentry hash table */</div><div class='add'>+        struct list_head   active;      /* list of inodes currently active (in an fop) */</div><div class='add'>+        uint32_t           active_size; /* count of inodes in active list */</div><div class='add'>+        struct list_head   lru;         /* list of inodes recently used.</div><div class='add'>+                                           lru.next most recent */</div><div class='add'>+        uint32_t           lru_size;    /* count of inodes in lru list  */</div><div class='add'>+        struct list_head   purge;       /* list of inodes to be purged soon */</div><div class='add'>+        uint32_t           purge_size;  /* count of inodes in purge list */</div><div class='add'>+</div><div class='add'>+        struct mem_pool   *inode_pool;  /* memory pool for inodes */</div><div class='add'>+        struct mem_pool   *dentry_pool; /* memory pool for dentrys */</div><div class='add'>+        struct mem_pool   *fd_mem_pool; /* memory pool for fd_t */</div><div class='add'>+        int                ctxcount;    /* number of slots in inode-&gt;ctx */</div><div class='add'>+};</div><div class='add'>+```</div><div class='add'>+</div><div class='add'>+# Life-cycle</div><div class='add'>+```</div><div class='add'>+inode_table_new (size_t lru_limit, xlator_t *xl)</div><div class='add'>+```</div><div class='add'>+This is a function which allocates a new inode table. Usually the top xlators in</div><div class='add'>+the graph such as protocol/server (for bricks), fuse and nfs (for fuse and nfs</div><div class='add'>+mounts) and libgfapi do inode managements. Hence they are the ones which will</div><div class='add'>+allocate a new inode table by calling the above function.</div><div class='add'>+</div><div class='add'>+Each xlator graph in glusterfs maintains an inode table. So in fuse clients,</div><div class='add'>+whenever there is a graph change due to add brick/remove brick or</div><div class='add'>+addition/removal of some other xlators, a new graph is created which creates a</div><div class='add'>+new inode table.</div><div class='add'>+</div><div class='add'>+Thus an allocated inode table is destroyed only when the filesystem daemon is</div><div class='add'>+killed or unmounted.</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+# what it contains.</div><div class='add'>+Inode table in glusterfs mainly contains a hash table for maintaining inodes.</div><div class='add'>+In general a file/directory is considered to be existing if there is a</div><div class='add'>+corresponding inode present in the inode table. If a inode for a file/directory</div><div class='add'>+cannot be found in the inode table, glusterfs tries to resolve it by sending a</div><div class='add'>+lookup on the entry for which the inode is needed. If lookup is successful, then</div><div class='add'>+a new inode correponding to the entry is added to the hash table present in the</div><div class='add'>+inode table. Thus an inode present in the hash-table means, its an existing</div><div class='add'>+file/directory within the filesystem. The inode table also contains the hash</div><div class='add'>+size of the hash table (as of now it is hard coded to 14057. The hash value of</div><div class='add'>+a inode is calculated using its gfid).</div><div class='add'>+</div><div class='add'>+Apart from the hash table, inode table also maintains 3 important list of inodes</div><div class='add'>+1. Active list:</div><div class='add'>+Active list contains all the active inodes (i.e inodes which are currently part</div><div class='add'>+of some fop).</div><div class='add'>+2. Lru list:</div><div class='add'>+Least recently used inodes list. A limit can be set for the size of the lru</div><div class='add'>+list. For bricks it is 16384 and for clients it is infinity.</div><div class='add'>+3. Purge list:</div><div class='add'>+List of all the inodes which have to be purged (i.e inodes which have to be</div><div class='add'>+deleted from the inode table due to unlink/rmdir/forget).</div><div class='add'>+</div><div class='add'>+And at last it also contains the mem-pool for allocating inodes, dentries so</div><div class='add'>+that frequent malloc/calloc and free of the data structures can be avoided.</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+# Data structure (inode)</div><div class='add'>+```</div><div class='add'>+struct _inode {</div><div class='add'>+        inode_table_t       *table;         /* the table this inode belongs to */</div><div class='add'>+        uuid_t               gfid;          /* unique identifier of the inode */</div><div class='add'>+        gf_lock_t            lock;</div><div class='add'>+        uint64_t             nlookup;</div><div class='add'>+        uint32_t             fd_count;      /* Open fd count */</div><div class='add'>+        uint32_t             ref;           /* reference count on this inode */</div><div class='add'>+        ia_type_t            ia_type;       /* what kind of file */</div><div class='add'>+        struct list_head     fd_list;       /* list of open files on this inode */</div><div class='add'>+        struct list_head     dentry_list;   /* list of directory entries for this inode */</div><div class='add'>+        struct list_head     hash;          /* hash table pointers */</div><div class='add'>+        struct list_head     list;          /* active/lru/purge */</div><div class='add'>+</div><div class='add'>+        struct _inode_ctx   *_ctx;          /* place holder for keeping the</div><div class='add'>+        information about the inode by different xlators */</div><div class='add'>+};</div><div class='add'>+```</div><div class='add'>+As said above, inodes are internal way of identifying the files/directories. A</div><div class='add'>+inode uniquely represents a file/directory. A new inode is created whenever a</div><div class='add'>+create/mkdir/symlink/mknod operations are performed. Apart from that a new inode</div><div class='add'>+is created upon the successful fresh lookup of a file/directory. Say the</div><div class='add'>+filesystem contained some file "a" within root and the filesystem was</div><div class='add'>+unmounted. Now when glusterfs is mounted and some operation is perfomed on "/a",</div><div class='add'>+glusterfs tries to get the inode for the entry "a" with parent inode as</div><div class='add'>+root. But, since glusterfs just came up, it will not be able to find the inode</div><div class='add'>+for "a" and will send a lookup on "/a". If the lookup operation succeeds (i.e.</div><div class='add'>+the root of glusterfs contains an entry called "a"), then a new inode for "/a"</div><div class='add'>+is created and added to the inode table.</div><div class='add'>+</div><div class='add'>+Depending upon the situation, an inode can be in one of the 3 lists maintained</div><div class='add'>+by the inode table. If some fop is happening on the inode, then the inode will</div><div class='add'>+be present in the active inodes list maintained by the inode table. Active</div><div class='add'>+inodes are those inodes whose refcount is greater than zero. Whenever some</div><div class='add'>+operation comes on a file/directory, and the resolver tries to find the inode</div><div class='add'>+for it, it increments the refcount of the inode before returning the inode. The</div><div class='add'>+refcount of an inode can be incremented by calling the below function</div><div class='add'>+```</div><div class='add'>+inode_ref (inode_t *inode)</div><div class='add'>+```</div><div class='add'>+Any xlator which wants to operate on a inode as part of some fop (or wants the</div><div class='add'>+inode in the callback), should hold a ref on the inode.</div><div class='add'>+Once the fop is completed before sending the reply of the fop to the above</div><div class='add'>+layers , the inode has to be unrefed. When the refcount of an inode becomes</div><div class='add'>+zero, it is removed from the active inodes list and put into LRU list maintained</div><div class='add'>+by the inode table. Thus in short if some fop is happening on a file/directory,</div><div class='add'>+the corresponding inode will be in the active list or it will be in the LRU</div><div class='add'>+list.</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+# Life Cycle</div><div class='add'>+</div><div class='add'>+A new inode is created whenever a new file/directory/symlink is created OR a</div><div class='add'>+successful lookup of an existing entry is done. The xlators which does inode</div><div class='add'>+management (as of now protocol/server, fuse, nfs, gfapi) will perform inode_link</div><div class='add'>+operation upon successful lookup or successful creation of a new entry.</div><div class='add'>+```</div><div class='add'>+inode_link (inode_t *inode, inode_t *parent, const char *name,</div><div class='add'>+            struct iatt *buf);</div><div class='add'>+```</div><div class='add'>+inode_link actually adds the inode to the inode table (to be precise it adds</div><div class='add'>+the inode to the hash table maintained by the inode table. The hash value is</div><div class='add'>+calculated based on the gfid). Copies the gfid to the inode (the gfid is</div><div class='add'>+present in the iatt structure). Creates a dentry with the new name.</div><div class='add'>+</div><div class='add'>+A inode is removed from the inode table and eventually destroyed when unlink</div><div class='add'>+or rmdir operation is performed on a file/directory, or the the lru limit of</div><div class='add'>+the inode table has been exceeded.</div><div class='add'>+</div><div class='add'>+# Data structure (dentry)</div><div class='add'>+```</div><div class='add'>+</div><div class='add'>+struct _dentry {</div><div class='add'>+        struct list_head   inode_list;   /* list of dentries of inode */</div><div class='add'>+        struct list_head   hash;         /* hash table pointers */</div><div class='add'>+        inode_t           *inode;        /* inode of this directory entry */</div><div class='add'>+        char              *name;         /* name of the directory entry */</div><div class='add'>+        inode_t           *parent;       /* directory of the entry */</div><div class='add'>+};</div><div class='add'>+```</div><div class='add'>+A dentry is the presence of an entry for a file/directory within its parent</div><div class='add'>+directory. A dentry usually points to the inode to which it belongs to. In</div><div class='add'>+glusterfs a dentry contains the following fields.</div><div class='add'>+1. a hook using which it can add itself to the list of</div><div class='add'>+the dentries maintained by the inode to which it points to.</div><div class='add'>+2. A hash table pointer.</div><div class='add'>+3. Pointer to the inode to which it belongs to.</div><div class='add'>+4. Name of the dentry</div><div class='add'>+5. Pointer to the inode of the parent directory in which the dentry is present</div><div class='add'>+</div><div class='add'>+A new dentry is created when a new file/directory/symlink is created or a hard</div><div class='add'>+link to an existing file is created.</div><div class='add'>+```</div><div class='add'>+__dentry_create (inode_t *inode, inode_t *parent, const char *name);</div><div class='add'>+```</div><div class='add'>+A dentry holds a refcount on the parent</div><div class='add'>+directory so that the parent inode is never removed from the active inode's list</div><div class='add'>+and put to the lru list (If the lru limit of the lru list is exceeded, there is</div><div class='add'>+a chance of parent inode being destroyed. To avoid it, the dentries hold a</div><div class='add'>+reference to the parent inode). A dentry is removed whenevern a unlink/rmdir</div><div class='add'>+is perfomed on a file/directory. Or when the lru limit has been exceeded, the</div><div class='add'>+oldest inodes are purged out of the inode table, during which all the dentries</div><div class='add'>+of the inode are removed.</div><div class='add'>+</div><div class='add'>+Whenever a unlink/rmdir comes on a file/directory, the corresponding inode</div><div class='add'>+should be removed from the inode table. So upon unlink/rmdir, the inode will</div><div class='add'>+be moved to the purge list maintained by the inode table and from there it is</div><div class='add'>+destroyed. To be more specific, if a inode has to be destroyed, its refcount</div><div class='add'>+and nlookup count both should become 0. For refcount to become 0, the inode</div><div class='add'>+should not be part of any fop (there should not be any open fds). Or if the</div><div class='add'>+inode belongs to a directory, then there should not be any fop happening on the</div><div class='add'>+directory and it should not contain any dentries within it. For nlookup count to</div><div class='add'>+become zero, a forget has to be sent on the inode with nlookup count set to 0 as</div><div class='add'>+an argument. For fuse clients, forget is sent by the kernel itself whenever a</div><div class='add'>+unlink/rmdir is performed. But for brick processes, upon unlink/rmdir, the</div><div class='add'>+protocol/server itself has to do inode_forget. Whenever the inode has to be</div><div class='add'>+deleted due to file removal or lru limit being exceeded  the inode is retired</div><div class='add'>+(i.e. all the dentries of the inode are deleted and the inode is moved to the</div><div class='add'>+purge list maintained by the inode table), the nlookup count is set to 0 via</div><div class='add'>+inode_forget api. The inode table, then prunes all the inodes from the purge</div><div class='add'>+list by destroying the inode contexts maintained by each xlator.</div><div class='add'>+```</div><div class='add'>+unlinking of the dentry is done via inode_unlink;</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+inode_unlink (inode_t *inode, inode_t *parent, const char *name);</div><div class='add'>+```</div><div class='add'>+If the inode has multiple hard links, then the unlink operation performed by</div><div class='add'>+the application results just in the removal of the dentry with the name provided</div><div class='add'>+by the application. For the inode to be removed, all the dentries of the inode</div><div class='add'>+should be unlinked.</div><div class='add'>+</div><div class='head'>diff --git a/doc/developer-guide/datastructure-iobuf.md b/doc/developer-guide/datastructure-iobuf.md<br/>new file mode 100644<br/>index 00000000000..03604e3672c<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/doc/developer-guide/datastructure-iobuf.md?id=d1d7a6f35c816822fab51c820e25023863c239c1'>doc/developer-guide/datastructure-iobuf.md</a></div><div class='hunk'>@@ -0,0 +1,259 @@</div><div class='add'>+# Iobuf-pool</div><div class='add'>+## Datastructures</div><div class='add'>+### iobuf</div><div class='add'>+Short for IO Buffer. It is one allocatable unit for the consumers of the IOBUF</div><div class='add'>+API, each unit hosts @page_size(defined in arena structure) bytes of memory. As</div><div class='add'>+initial step of processing a fop, the IO buffer passed onto GlusterFS by the</div><div class='add'>+other applications (FUSE VFS/ Applications using gfapi) is copied into GlusterFS</div><div class='add'>+space i.e. iobufs. Hence Iobufs are mostly allocated/deallocated in Fuse, gfapi,</div><div class='add'>+protocol xlators, and also in performance xlators to cache the IO buffers etc.</div><div class='add'>+```</div><div class='add'>+struct iobuf {</div><div class='add'>+        union {</div><div class='add'>+                struct list_head      list;</div><div class='add'>+                struct {</div><div class='add'>+                        struct iobuf *next;</div><div class='add'>+                        struct iobuf *prev;</div><div class='add'>+                };</div><div class='add'>+        };</div><div class='add'>+        struct iobuf_arena  *iobuf_arena;</div><div class='add'>+</div><div class='add'>+        gf_lock_t            lock; /* for -&gt;ptr and -&gt;ref */</div><div class='add'>+        int                  ref;  /* 0 == passive, &gt;0 == active */</div><div class='add'>+</div><div class='add'>+        void                *ptr;  /* usable memory region by the consumer */</div><div class='add'>+</div><div class='add'>+        void                *free_ptr; /* in case of stdalloc, this is the</div><div class='add'>+                                          one to be freed not the *ptr */</div><div class='add'>+};</div><div class='add'>+```</div><div class='add'>+</div><div class='add'>+### iobref</div><div class='add'>+There may be need of multiple iobufs for a single fop, like in vectored read/write.</div><div class='add'>+Hence multiple iobufs(default 16) are encapsulated under one iobref.</div><div class='add'>+```</div><div class='add'>+struct iobref {</div><div class='add'>+        gf_lock_t          lock;</div><div class='add'>+        int                ref;</div><div class='add'>+        struct iobuf     **iobrefs; /* list of iobufs */</div><div class='add'>+        int                alloced; /* 16 by default, grows as required */</div><div class='add'>+        int                used;    /* number of iobufs added to this iobref */</div><div class='add'>+};</div><div class='add'>+```</div><div class='add'>+### iobuf_arenas</div><div class='add'>+One region of memory MMAPed from the operating system. Each region MMAPs</div><div class='add'>+@arena_size bytes of memory, and hosts @arena_size / @page_size IOBUFs.</div><div class='add'>+The same sized iobufs are grouped into one arena, for sanity of access.</div><div class='add'>+</div><div class='add'>+```</div><div class='add'>+struct iobuf_arena {</div><div class='add'>+        union {</div><div class='add'>+                struct list_head            list;</div><div class='add'>+                struct {</div><div class='add'>+                        struct iobuf_arena *next;</div><div class='add'>+                        struct iobuf_arena *prev;</div><div class='add'>+                };</div><div class='add'>+        };</div><div class='add'>+</div><div class='add'>+        size_t              page_size;  /* size of all iobufs in this arena */</div><div class='add'>+        size_t              arena_size; /* this is equal to</div><div class='add'>+                                           (iobuf_pool-&gt;arena_size / page_size)</div><div class='add'>+                                           * page_size */</div><div class='add'>+        size_t              page_count;</div><div class='add'>+</div><div class='add'>+        struct iobuf_pool  *iobuf_pool;</div><div class='add'>+</div><div class='add'>+        void               *mem_base;</div><div class='add'>+        struct iobuf       *iobufs;     /* allocated iobufs list */</div><div class='add'>+</div><div class='add'>+        int                 active_cnt;</div><div class='add'>+        struct iobuf        active;     /* head node iobuf</div><div class='add'>+                                           (unused by itself) */</div><div class='add'>+        int                 passive_cnt;</div><div class='add'>+        struct iobuf        passive;    /* head node iobuf</div><div class='add'>+                                           (unused by itself) */</div><div class='add'>+        uint64_t            alloc_cnt;  /* total allocs in this pool */</div><div class='add'>+        int                 max_active; /* max active buffers at a given time */</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+```</div><div class='add'>+### iobuf_pool</div><div class='add'>+Pool of Iobufs. As there may be many Io buffers required by the filesystem,</div><div class='add'>+a pool of iobufs are preallocated and kept, if these preallocated ones are</div><div class='add'>+exhausted only then the standard malloc/free is called, thus improving the</div><div class='add'>+performance. Iobuf pool is generally one per process, allocated during</div><div class='add'>+glusterfs_ctx_t init (glusterfs_ctx_defaults_init), currently the preallocated</div><div class='add'>+iobuf pool memory is freed on process exit. Iobuf pool is globally accessible</div><div class='add'>+across GlusterFs, hence iobufs allocated by any xlator can be accessed by any</div><div class='add'>+other xlators(unless iobuf is not passed).</div><div class='add'>+```</div><div class='add'>+struct iobuf_pool {</div><div class='add'>+        pthread_mutex_t     mutex;</div><div class='add'>+        size_t              arena_size; /* size of memory region in</div><div class='add'>+                                           arena */</div><div class='add'>+        size_t              default_page_size; /* default size of iobuf */</div><div class='add'>+</div><div class='add'>+        int                 arena_cnt;</div><div class='add'>+        struct list_head    arenas[GF_VARIABLE_IOBUF_COUNT];</div><div class='add'>+        /* array of arenas. Each element of the array is a list of arenas</div><div class='add'>+           holding iobufs of particular page_size */</div><div class='add'>+</div><div class='add'>+        struct list_head    filled[GF_VARIABLE_IOBUF_COUNT];</div><div class='add'>+        /* array of arenas without free iobufs */</div><div class='add'>+</div><div class='add'>+        struct list_head    purge[GF_VARIABLE_IOBUF_COUNT];</div><div class='add'>+        /* array of of arenas which can be purged */</div><div class='add'>+</div><div class='add'>+        uint64_t            request_misses; /* mostly the requests for higher</div><div class='add'>+                                               value of iobufs */</div><div class='add'>+};</div><div class='add'>+```</div><div class='add'>+~~~</div><div class='add'>+The default size of the iobuf_pool(as of yet):</div><div class='add'>+1024 iobufs of 128Bytes = 128KB</div><div class='add'>+512  iobufs of 512Bytes = 256KB</div><div class='add'>+512  iobufs of 2KB      = 1MB</div><div class='add'>+128  iobufs of 8KB      = 1MB</div><div class='add'>+64   iobufs of 32KB     = 2MB</div><div class='add'>+32   iobufs of 128KB    = 4MB</div><div class='add'>+8    iobufs of 256KB    = 2MB</div><div class='add'>+2    iobufs of 1MB      = 2MB</div><div class='add'>+Total ~13MB</div><div class='add'>+~~~</div><div class='add'>+As seen in the datastructure iobuf_pool has 3 arena lists.</div><div class='add'>+</div><div class='add'>+- arenas:  </div><div class='add'>+The arenas allocated during iobuf_pool create, are part of this list. This list</div><div class='add'>+also contains arenas that are partially filled i.e. contain few active and few</div><div class='add'>+passive iobufs (passive_cnt !=0, active_cnt!=0 except for initially allocated</div><div class='add'>+arenas). There will be by default 8 arenas of the sizes mentioned above.</div><div class='add'>+- filled:  </div><div class='add'>+If all the iobufs in the arena are filled(passive_cnt = 0), the arena is moved</div><div class='add'>+to the filled list. If any of the iobufs from the filled arena is iobuf_put,</div><div class='add'>+then the arena moves back to the 'arenas' list.</div><div class='add'>+- purge:  </div><div class='add'>+If there are no active iobufs in the arena(active_cnt = 0), the arena is moved</div><div class='add'>+to purge list. iobuf_put() triggers destruction of the arenas in this list. The</div><div class='add'>+arenas in the purge list are destroyed only if there is  atleast one arena in</div><div class='add'>+'arenas' list, that way there won't be spurious mmap/unmap of buffers.</div><div class='add'>+(e.g: If there is an arena (page_size=128KB, count=32) in purge list, this arena</div><div class='add'>+is destroyed(munmap) only if there is an arena in 'arenas' list with page_size=128KB).</div><div class='add'>+</div><div class='add'>+## APIs</div><div class='add'>+### iobuf_get</div><div class='add'>+</div><div class='add'>+```</div><div class='add'>+struct iobuf *iobuf_get (struct iobuf_pool *iobuf_pool);</div><div class='add'>+```</div><div class='add'>+Creates a new iobuf of the default page size(128KB hard coded as of yet).</div><div class='add'>+Also takes a reference(increments ref count), hence no need of doing it</div><div class='add'>+explicitly after getting iobuf.</div><div class='add'>+</div><div class='add'>+### iobuf_get2</div><div class='add'>+</div><div class='add'>+```</div><div class='add'>+struct iobuf * iobuf_get2 (struct iobuf_pool *iobuf_pool, size_t page_size);</div><div class='add'>+```</div><div class='add'>+Creates a new iobuf of a specified page size, if page_size=0 default page size</div><div class='add'>+is considered.</div><div class='add'>+```</div><div class='add'>+if (requested iobuf size &gt; Max iobuf size in the pool(1MB as of yet))</div><div class='add'>+  {</div><div class='add'>+     Perform standard allocation(CALLOC) of the requested size and</div><div class='add'>+     add it to the list iobuf_pool-&gt;arenas[IOBUF_ARENA_MAX_INDEX].</div><div class='add'>+  }</div><div class='add'>+  else</div><div class='add'>+  {</div><div class='add'>+     -Round the page size to match the stndard sizes in iobuf pool.</div><div class='add'>+     (eg: if 3KB is requested, it is rounded to 8KB).</div><div class='add'>+     -Select the arena list corresponding to the rounded size</div><div class='add'>+     (eg: select 8KB arena)</div><div class='add'>+     If the selected arena has passive count &gt; 0, then return the</div><div class='add'>+     iobuf from this arena, set the counters(passive/active/etc.)</div><div class='add'>+     appropriately.</div><div class='add'>+     else the arena is full, allocate new arena with rounded size</div><div class='add'>+     and standard page numbers and add to the arena list</div><div class='add'>+     (eg: 128 iobufs of 8KB is allocated).</div><div class='add'>+  }</div><div class='add'>+```</div><div class='add'>+Also takes a reference(increments ref count), hence no need of doing it</div><div class='add'>+explicitly after getting iobuf.</div><div class='add'>+</div><div class='add'>+### iobuf_ref</div><div class='add'>+</div><div class='add'>+```</div><div class='add'>+struct iobuf *iobuf_ref (struct iobuf *iobuf);</div><div class='add'>+```</div><div class='add'>+  Take a reference on the iobuf. If using an iobuf allocated by some other</div><div class='add'>+xlator/function/, its a good practice to take a reference so that iobuf is not</div><div class='add'>+deleted by the allocator.</div><div class='add'>+</div><div class='add'>+### iobuf_unref</div><div class='add'>+```</div><div class='add'>+void iobuf_unref (struct iobuf *iobuf);</div><div class='add'>+```</div><div class='add'>+Unreference the iobuf, if the ref count is zero iobuf is considered free.</div><div class='add'>+</div><div class='add'>+```</div><div class='add'>+  -Delete the iobuf, if allocated from standard alloc and return.  </div><div class='add'>+  -set the active/passive count appropriately.  </div><div class='add'>+  -if passive count &gt; 0 then add the arena to 'arena' list.  </div><div class='add'>+  -if active count = 0 then add the arena to 'purge' list.  </div><div class='add'>+```</div><div class='add'>+Every iobuf_ref should have a corresponding iobuf_unref, and also every</div><div class='add'>+iobuf_get/2 should have a correspondning iobuf_unref.</div><div class='add'>+</div><div class='add'>+### iobref_new</div><div class='add'>+```</div><div class='add'>+struct iobref *iobref_new ();</div><div class='add'>+```</div><div class='add'>+Creates a new iobref structure and returns its pointer.</div><div class='add'>+</div><div class='add'>+### iobref_ref</div><div class='add'>+```</div><div class='add'>+struct iobref *iobref_ref (struct iobref *iobref);</div><div class='add'>+```</div><div class='add'>+Take a reference on the iobref.</div><div class='add'>+</div><div class='add'>+### iobref_unref</div><div class='add'>+```</div><div class='add'>+void iobref_unref (struct iobref *iobref);</div><div class='add'>+```</div><div class='add'>+Decrements the reference count of the iobref. If the ref count is 0, then unref</div><div class='add'>+all the iobufs(iobuf_unref) in the iobref, and destroy the iobref.</div><div class='add'>+</div><div class='add'>+### iobref_add</div><div class='add'>+```</div><div class='add'>+int iobref_add (struct iobref *iobref, struct iobuf *iobuf);</div><div class='add'>+```</div><div class='add'>+Adds the given iobuf into the iobref, it takes a ref on the iobuf before adding</div><div class='add'>+it, hence explicit iobuf_ref is not required if adding to the iobref.</div><div class='add'>+</div><div class='add'>+### iobref_merge</div><div class='add'>+```</div><div class='add'>+int iobref_merge (struct iobref *to, struct iobref *from);</div><div class='add'>+```</div><div class='add'>+Adds all the iobufs in the 'from' iobref to the 'to' iobref. Merge will not</div><div class='add'>+cause the delete of the 'from' iobref, therefore it will result in another ref</div><div class='add'>+on all the iobufs added to the 'to' iobref. Hence iobref_unref should be</div><div class='add'>+performed both on 'from' and 'to' iobrefs (performing iobref_unref only on 'to'</div><div class='add'>+will not free the iobufs and may result in leak).</div><div class='add'>+</div><div class='add'>+### iobref_clear</div><div class='add'>+```</div><div class='add'>+void iobref_clear (struct iobref *iobref);</div><div class='add'>+```</div><div class='add'>+Unreference all the iobufs in the iobref, and also unref the iobref.</div><div class='add'>+</div><div class='add'>+## Iobuf Leaks</div><div class='add'>+If all iobuf_refs/iobuf_new do not have correspondning iobuf_unref, then the</div><div class='add'>+iobufs are not freed and recurring execution of such code path may lead to huge</div><div class='add'>+memory leaks. The easiest way to identify if a memory leak is caused by iobufs</div><div class='add'>+is to take a statedump. If the statedump shows a lot of filled arenas then it is</div><div class='add'>+a sure sign of leak. Refer doc/debugging/statedump.md for more details.</div><div class='add'>+</div><div class='add'>+If iobufs are leaking, the next step is to find where the iobuf_unref went</div><div class='add'>+missing. There is no standard/easy way of debugging this, code reading and logs</div><div class='add'>+are the only ways. If there is a liberty to reproduce the memory leak at will,</div><div class='add'>+then logs(gf_callinginfo) in iobuf_ref/unref might help.  </div><div class='add'>+TODO: A easier way to debug iobuf leaks.</div><div class='head'>diff --git a/doc/developer-guide/datastructure-mem-pool.md b/doc/developer-guide/datastructure-mem-pool.md<br/>new file mode 100644<br/>index 00000000000..225567cbf9f<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/doc/developer-guide/datastructure-mem-pool.md?id=d1d7a6f35c816822fab51c820e25023863c239c1'>doc/developer-guide/datastructure-mem-pool.md</a></div><div class='hunk'>@@ -0,0 +1,124 @@</div><div class='add'>+# Mem-pool</div><div class='add'>+## Background</div><div class='add'>+There was a time when every fop in glusterfs used to incur cost of allocations/de-allocations for every stack wind/unwind between xlators because stack/frame/*_localt_t in every wind/unwind was allocated and de-allocated. Because of all these system calls in the fop path there was lot of latency and the worst part is that most of the times the number of frames/stacks active at any time wouldn't cross a threshold. So it was decided that this threshold number of frames/stacks would be allocated in the beginning of the process only once. Get one of them from the pool of stacks/frames whenever `STACK_WIND` is performed and put it back into the pool in `STACK_UNWIND`/`STACK_DESTROY` without incurring any extra system calls. The data structures are allocated only when threshold number of such items are in active use i.e. pool is in complete use.% increase in the performance once this was added to all the common data structures (inode/fd/dict etc) in xlators throughout the stack was tremendous.</div><div class='add'>+</div><div class='add'>+## Data structure</div><div class='add'>+```</div><div class='add'>+struct mem_pool {</div><div class='add'>+        struct list_head  list; /*Each member in the mempool is element padded with a doubly-linked-list + ptr of mempool + is-in</div><div class='add'>+-use info. This list is used to add the element to the list of free members in the mem-pool*/</div><div class='add'>+        int               hot_count;/*number of mempool elements that are in active use*/</div><div class='add'>+        int               cold_count;/*number of mempool elements that are not in use. If a new allocation is required it</div><div class='add'>+will be served from here until all the elements in the pool are in use i.e. cold-count becomes 0.*/</div><div class='add'>+        gf_lock_t         lock;/*synchronization mechanism*/</div><div class='add'>+        unsigned long     padded_sizeof_type;/*Each mempool element is padded with a doubly-linked-list + ptr of mempool + is-in</div><div class='add'>+-use info to operate the pool of elements, this size is the element-size after padding*/</div><div class='add'>+        void             *pool;/*Starting address of pool*/</div><div class='add'>+        void             *pool_end;/*Ending address of pool*/</div><div class='add'>+/* If an element address is in the range between pool, pool_end addresses  then it is alloced from the pool otherwise it is 'calloced' this is very useful for functions like 'mem_put'*/</div><div class='add'>+        int               real_sizeof_type;/* size of just the element without any padding*/</div><div class='add'>+        uint64_t          alloc_count; /*Number of times this type of data is allocated through out the life of this process. This may include calloced elements as well*/</div><div class='add'>+        uint64_t          pool_misses; /*Number of times the element had to be allocated from heap because all elements from the pool are in active use.*/</div><div class='add'>+        int               max_alloc; /*Maximum number of elements from the pool in active use at any point in the life of the process. This does *not* include calloced elements*/</div><div class='add'>+        int               curr_stdalloc;/*Number of elements that are allocated from heap at the moment because the pool is in completed use. It should be '0' when pool is not in complete use*/</div><div class='add'>+        int               max_stdalloc;/*Maximum number of allocations from heap after the pool is completely used that are in active use at any point in the life of the process.*/</div><div class='add'>+        char             *name; /*Contains xlator-name:data-type as a string</div><div class='add'>+        struct list_head  global_list;/*This is used to insert it into the global_list of mempools maintained in 'glusterfs-ctx'</div><div class='add'>+};</div><div class='add'>+```</div><div class='add'>+</div><div class='add'>+## Life-cycle</div><div class='add'>+```</div><div class='add'>+mem_pool_new (data_type, unsigned long count)</div><div class='add'>+</div><div class='add'>+This is a macro which expands to mem_pool_new_fn (sizeof (data_type), count, string-rep-of-data_type)</div><div class='add'>+</div><div class='add'>+struct mem_pool *</div><div class='add'>+mem_pool_new_fn (unsigned long sizeof_type, unsigned long count, char *name)</div><div class='add'>+</div><div class='add'>+Padded-element:</div><div class='add'>+ ----------------------------------------</div><div class='add'>+|list-ptr|mem-pool-address|in-use|Element|</div><div class='add'>+ ----------------------------------------</div><div class='add'>+ ```</div><div class='add'>+</div><div class='add'>+This function allocates the `mem-pool` structure and sets up the pool for use.</div><div class='add'>+`name` parameter above is the `string` containing type of the datatype. This `name` is appended to `xlator-name + ':'` so that it can be easily identified in things like statedump. `count` is the number of elements that need to be allocated. `sizeof_type` is the size of each element. Ideally `('sizeof_type'*'count')` should be the size of the total pool. But to manage the pool using `mem_get`/`mem_put` (will be explained after this section) each element needs to be padded in the front with a `('list', 'mem-pool-address', 'in_use')`. So the actual size of the pool it allocates will be `('padded_sizeof_type'*'count')`. Why these extra elements are needed will be evident after understanding how `mem_get` and `mem_put` are implemented. In this function it just initializes all the `list` structures in front of each element and adds them to the `mem_pool-&gt;list` which represent the list of `cold` elements which can be allocated whenever `mem_get` is called on this mem_pool. It remembers mem_pool's start and end addresses in `mem_pool-&gt;pool`, `mem_pool-&gt;pool_end` respectively. Initializes `mem_pool-&gt;cold_count` to `count` and `mem_pool-&gt;hot_count` to `0`. This mem-pool will be added to the list of `global_list` maintained in `glusterfs-ctx`</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+```</div><div class='add'>+void* mem_get (struct mem_pool *mem_pool)</div><div class='add'>+</div><div class='add'>+Initial-list before mem-get</div><div class='add'>+----------------</div><div class='add'>+|     Pool       |</div><div class='add'>+|   -----------  |       ----------------------------------------       ----------------------------------------</div><div class='add'>+|  | pool-list | |&lt;---&gt; |list-ptr|mem-pool-address|in-use|Element|&lt;---&gt;|list-ptr|mem-pool-address|in-use|Element|</div><div class='add'>+|   -----------  |       ----------------------------------------       ----------------------------------------</div><div class='add'>+----------------</div><div class='add'>+</div><div class='add'>+list after mem-get from the pool</div><div class='add'>+----------------</div><div class='add'>+|     Pool       |</div><div class='add'>+|   -----------  |      ----------------------------------------</div><div class='add'>+|  | pool-list | |&lt;---&gt;|list-ptr|mem-pool-address|in-use|Element|</div><div class='add'>+|   -----------  |      ----------------------------------------</div><div class='add'>+----------------</div><div class='add'>+</div><div class='add'>+List when the pool is full:</div><div class='add'>+ ----------------</div><div class='add'>+|     Pool       |       extra element that is allocated</div><div class='add'>+|   -----------  |      ----------------------------------------</div><div class='add'>+|  | pool-list | |     |list-ptr|mem-pool-address|in-use|Element|</div><div class='add'>+|   -----------  |      ----------------------------------------</div><div class='add'>+ ----------------</div><div class='add'>+```</div><div class='add'>+</div><div class='add'>+This function is similar to `malloc()` but it gives memory of type `element` of this pool. When this function is called it increments `mem_pool-&gt;alloc_count`, checks if there are any free elements in the pool that can be returned by inspecting `mem_pool-&gt;cold_count`. If `mem_pool-&gt;cold_count` is non-zero then it means there are elements in the pool which are not in active use. It deletes one element from the list of free elements and decrements `mem_pool-&gt;cold_count` and increments `mem_pool-&gt;hot_count` to indicate there is one more element in active use. Updates `mem_pool-&gt;max_alloc` accordingly. Sets `element-&gt;in_use` in the padded memory to `1`. Sets `element-&gt;mem_pool` address to this mem_pool also in the padded memory(It is useful for mem_put). Returns the address of the memory after the padded boundary to the caller of this function. In the cases where all the elements in the pool are in active use it `callocs` the element with padded size and sets mem_pool address in the padded memory. To indicate the pool-miss and give useful accounting information of the pool-usage it increments `mem_pool-&gt;pool_misses`, `mem_pool-&gt;curr_stdalloc`. Updates `mem_pool-&gt;max_stdalloc` accordingly.</div><div class='add'>+</div><div class='add'>+```</div><div class='add'>+void* mem_get0 (struct mem_pool *mem_pool)</div><div class='add'>+```</div><div class='add'>+Just like `calloc` is to `malloc`, `mem_get0` is to `mem_get`. It memsets the memory to all '0' before returning the element.</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+```</div><div class='add'>+void mem_put (void *ptr)</div><div class='add'>+</div><div class='add'>+list before mem-put from the pool</div><div class='add'>+ ----------------</div><div class='add'>+|     Pool       |</div><div class='add'>+|   -----------  |      ----------------------------------------</div><div class='add'>+|  | pool-list | |&lt;---&gt;|list-ptr|mem-pool-address|in-use|Element|</div><div class='add'>+|   -----------  |      ----------------------------------------</div><div class='add'>+ ----------------</div><div class='add'>+</div><div class='add'>+list after mem-put to the pool</div><div class='add'>+ ----------------</div><div class='add'>+|     Pool       |</div><div class='add'>+|   -----------  |       ----------------------------------------       ----------------------------------------</div><div class='add'>+|  | pool-list | |&lt;---&gt; |list-ptr|mem-pool-address|in-use|Element|&lt;---&gt;|list-ptr|mem-pool-address|in-use|Element|</div><div class='add'>+|   -----------  |       ----------------------------------------       ----------------------------------------</div><div class='add'>+ ----------------</div><div class='add'>+</div><div class='add'>+If mem_put is putting an element not from pool then it is just freed so</div><div class='add'>+no change to the pool</div><div class='add'>+ ----------------</div><div class='add'>+|     Pool       |</div><div class='add'>+|   -----------  |</div><div class='add'>+|  | pool-list | |</div><div class='add'>+|   -----------  |</div><div class='add'>+ ----------------</div><div class='add'>+```</div><div class='add'>+</div><div class='add'>+This function is similar to `free()`. Remember that ptr passed to this function is the address of the element, so this function gets the ptr to its head of the padding in front of it. If this memory falls in bettween `mem_pool-&gt;pool`, `mem_pool-&gt;pool_end` then the memory is part of the 'pool' memory that is allocated so it does some sanity checks to see if the memory is indeed head of the element by checking if `in_use` is set to `1`. It resets `in_use`  to `0`. It gets the mem_pool address stored in the padded region and adds this element to the list of free elements. Decreases `mem_pool-&gt;hot_count` increases `mem_pool-&gt;cold_count`. In the case where padded-element address does not fall in the range of `mem_pool-&gt;pool`, `mem_pool-&gt;pool_end` it just frees the element and decreases `mem_pool-&gt;curr_stdalloc`.</div><div class='add'>+</div><div class='add'>+```</div><div class='add'>+void</div><div class='add'>+mem_pool_destroy (struct mem_pool *pool)</div><div class='add'>+```</div><div class='add'>+Deletes this pool from the `global_list` maintained by `glusterfs-ctx` and frees all the memory allocated in `mem_pool_new`.</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+### How to pick pool-size</div><div class='add'>+This varies from work-load to work-load. Create the mem-pool with some random size and run the work-load. Take the statedump after the work-load is complete. In the statedump if `max_alloc` is always less than `cold_count` may be reduce the size of the pool closer to `max_alloc`. On the otherhand if there are lots of `pool-misses` then increase the `pool_size` by `max_stdalloc` to achieve better 'hit-rate' of the pool.</div><div class='head'>diff --git a/doc/developer-guide/dirops-transactions-in-dht.md b/doc/developer-guide/dirops-transactions-in-dht.md<br/>new file mode 100644<br/>index 00000000000..909a97001aa<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/doc/developer-guide/dirops-transactions-in-dht.md?id=d1d7a6f35c816822fab51c820e25023863c239c1'>doc/developer-guide/dirops-transactions-in-dht.md</a></div><div class='hunk'>@@ -0,0 +1,273 @@</div><div class='add'>+# dirops transactions in dht</div><div class='add'>+Need for transactions during operations on directories arise from two</div><div class='add'>+basic design elements of DHT:</div><div class='add'>+</div><div class='add'>+ 1. A directory is created on all subvolumes of dht. Since glusterfs</div><div class='add'>+ associates each file-system object with an unique gfid, every</div><div class='add'>+ subvolume should have the same unique mapping of (path of directory,</div><div class='add'>+ gfid). To elaborate,</div><div class='add'>+    * Each subvolume should've same gfid associated with a path to</div><div class='add'>+ directory.</div><div class='add'>+    * A gfid should not be associated with more than one path in any</div><div class='add'>+ subvolume.</div><div class='add'>+</div><div class='add'>+ So, entire operations like mkdir, renamedir, rmdir and creation of</div><div class='add'>+ directories during self-heal need to be atomic in dht. In other words,</div><div class='add'>+ any of these operations shouldn't begin on an inode if one of them is</div><div class='add'>+ already in progress on the same inode, till it completes on all</div><div class='add'>+ subvolumes of dht. If not, more than one of these operations</div><div class='add'>+ happening in parallel can break any or all of the two requirements</div><div class='add'>+ listed above. This is referred in the rest of the document by the</div><div class='add'>+ name _Atomicity during namespace operations_.</div><div class='add'>+   </div><div class='add'>+ 2. Each directory has an independent layout persisted on</div><div class='add'>+ subvolumes. Each subvolume contains only part of the layout relevant</div><div class='add'>+ to it. For performance reasons _and_ since _only_ dht has aggregated</div><div class='add'>+ view, this layout is cached in memory of client. To make sure dht</div><div class='add'>+ reads or modifies a single complete layout while parallel modifications of    the layout are in progress, we need atomicity during layout modification and reading. This is referred in the rest of the document as  _Atomicity during layout modification and reading_.</div><div class='add'>+</div><div class='add'>+Rest of the document explains how atomicity is achieved for each of</div><div class='add'>+the case above.</div><div class='add'>+</div><div class='add'>+**Atomicity during layout modification and reading**</div><div class='add'>+File operations a.k.a fops can be classified into two categories based on how they consume layout.</div><div class='add'>+</div><div class='add'>+ - Layout writer. Setting of layout during selfheal of a directory is</div><div class='add'>+ layout writer of _that_ directory. </div><div class='add'>+ - Layout reader. </div><div class='add'>+     * Any entry fop like create, unlink, rename, link, symlink,</div><div class='add'>+ unlink, mknod, rename, mkdir, rmdir, renamedir which needs layout of the parent directory. Each of these fops are readers of layout on parent directory.</div><div class='add'>+     *  setting of layout during mkdir of a directory is considered as</div><div class='add'>+ a reader of the same directory's layout. The reason for this is that</div><div class='add'>+ only a parallel lookup on that directory can be a competing fop that modifies the layout (Other fops need gfid of the directory which can be got only after either lookup or mkdir completes). However, healing of layout is considered as a writer and a single writer blocks all readers.</div><div class='add'>+ </div><div class='add'>+*Algorithm*</div><div class='add'>+Atomicity is achieved by locking on the inode of directory whose</div><div class='add'>+layout is being modified or read. The fop used is inodelk.</div><div class='add'>+ -  Writer acquires blocking inodelk (directory-inode, write-lock) on</div><div class='add'>+ all subvolumes serially. The order of subvols in which they are</div><div class='add'>+ locked by different clients remains constant for a directory. If locking fails on any subvolume, layout modification is abandoned.</div><div class='add'>+ - Reader acquires an inodelk (directory-inode, read-lock) on _any_</div><div class='add'>+ one subvolume. If locking fails on a subvolume (say with</div><div class='add'>+ ESTALE/ENOTCONN error), locking can be tried on other subvolumes till</div><div class='add'>+ we get one lock. If we cannot get lock on at least one subvolume,</div><div class='add'>+ consistency of layout is not guaranteed. Based on the consistency</div><div class='add'>+ requirements of fops, they can be failed or continued.</div><div class='add'>+</div><div class='add'>+Reasons why writer has to lock on _all_ subvols:</div><div class='add'>+</div><div class='add'>+ - DHT don't have a metadata server and locking is implemented by brick. So, there is no well-defined subvol/brick that can be used as an arbitrator by different clients while acquiring locks.</div><div class='add'>+ - readers should acquire as minimum number of locks as possible. In</div><div class='add'>+ other words, the algorithm aims to have less synchronization cost to</div><div class='add'>+ readers.</div><div class='add'>+ - The subvolume to which a directory hashes could be used as a</div><div class='add'>+ lock server. However, in the case of an entry fop like create</div><div class='add'>+ (/a/b/c) where we want to block modification of layout of b for the</div><div class='add'>+ duration of create, we would be required to acquire lock on the</div><div class='add'>+ subvol to which /a/b hashes. To find out the hashed-subvol of</div><div class='add'>+ /a/b, we would need layout of /a. Note that how there is a dependency</div><div class='add'>+ of locking the layouts of ancestors all the way to root. So this</div><div class='add'>+ locking is not preferred. Also, note that only the immediate parent</div><div class='add'>+ inode is available in arguments of a fop like create.</div><div class='add'>+</div><div class='add'>+**Atomicity during namespace operations**</div><div class='add'>+</div><div class='add'>+ -  We use locks on inode of parent directory in the namespace of</div><div class='add'>+ _"basename"_  during mkdir, rmdir, renamedir and directory</div><div class='add'>+ creation phase of self-heal. The exact fop we use is _entrylk</div><div class='add'>+ (parent-inode, "basename")_.</div><div class='add'>+ - refresh in-memory layout of parent-inode from values stored on backend</div><div class='add'>+ -  _entrylk (parent-inode, "basename")_ is done on subvolume to which</div><div class='add'>+ _"basename" hashes_. So, this operation is a _reader_ of the</div><div class='add'>+ layout on _parent-inode_. Which means an _inodelk (parent-inode,</div><div class='add'>+ read-lock)_ has to be completed before _entrylk (parent-inode,</div><div class='add'>+ "basename")_ is issued. Both the locks have to be held till the</div><div class='add'>+ operation is tried on all subvolumes. If acquiring of any/all of</div><div class='add'>+ these locks fail, the operation should be failed.</div><div class='add'>+</div><div class='add'>+With the above details, algorithms for mkdir, rmdir, renamedir,</div><div class='add'>+self-heal of directory are explicitly detailed below.</div><div class='add'>+</div><div class='add'>+**Self-heal of a directory**</div><div class='add'>+  </div><div class='add'>+ -  creation of directories on subvolumes is done only during</div><div class='add'>+ _named-lookup_ of a directory as we need &lt; parent-inode,</div><div class='add'>+ "basename" &gt;.</div><div class='add'>+ -  If a directory is missing on one or more subvolumes,</div><div class='add'>+    *  acquire _inodelk (parent-inode, read-lock)_ on _any one_ of the</div><div class='add'>+ subvolumes.</div><div class='add'>+    * refresh the in-memory layout of parent-inode from values stored on backend</div><div class='add'>+    *  acquire _entrylk (parent-inode, "basename")_ on the subvolume</div><div class='add'>+ to which _"basename"_ hashes.</div><div class='add'>+    *  If any/all of the locks fail, self-heal is aborted.</div><div class='add'>+    *  create directories on missing subvolumes.</div><div class='add'>+    *  release _entrylk (parent-inode, "basename")_.</div><div class='add'>+    *  release _inodelk (parent-inode, read-lock)_.</div><div class='add'>+    </div><div class='add'>+ -  If layout of a directory needs healing</div><div class='add'>+     * acquire _inodelk (directory-inode, write-lock)_ on _all_ the</div><div class='add'>+ subvolumes. If locking fails on any of the subvolumes,</div><div class='add'>+ self-heal is aborted. Blocking Locks are acquired serially across subvolumes in a _well-defined_ order which is _constant_ across all the healers of a directory. One order could be the order in which subvolumes are stored in the array _children_ of dht xlator.</div><div class='add'>+     *  heal the layout.</div><div class='add'>+     *  release _inodelk (directory-inode, write-lock)_ on _all_ the</div><div class='add'>+ subvolumes in parallel.</div><div class='add'>+     *  Note that healing of layout can be done in both _named_ and</div><div class='add'>+ _nameless_ lookups of a directory as _only directory-inode_ is needed</div><div class='add'>+ for healing and it is available during both.</div><div class='add'>+</div><div class='add'>+**mkdir (parent-inode, "basename")**</div><div class='add'>+</div><div class='add'>+* while creating directory across subvolumes,</div><div class='add'>+</div><div class='add'>+ - acquire _inodelk (parent-inode, read-lock)_ on _any one_ of the</div><div class='add'>+ subvolumes.</div><div class='add'>+ - refresh in-memory layout of parent-inode from values stored on backend</div><div class='add'>+ - acquire _entrylk (parent-inode, "basename")_ on the subvolume to</div><div class='add'>+ which _"basename"_ hashes.</div><div class='add'>+ -  If any/all of the above two locks fail, release the locks that</div><div class='add'>+ were acquired successfully and mkdir should be failed (as perceived by application).</div><div class='add'>+ - do _mkdir (parent-inode, "basename")_ on the subvolume to which</div><div class='add'>+ _"basename"_ hashes. If this mkdir fails, mkdir is failed.</div><div class='add'>+ - do _mkdir (parent-inode, "basename")_ on the remaining subvolumes.</div><div class='add'>+ - release _entrylk (parent-inode, "basename")_.</div><div class='add'>+ - release _inodelk (parent-inode, "read-lock")_.</div><div class='add'>+*  while setting the layout of a directory,</div><div class='add'>+ - acquire _inodelk (directory-inode, read-lock)_ on _any one_ of the</div><div class='add'>+ subvolumes.</div><div class='add'>+ -  If locking fails, cleanup the locks that were acquired</div><div class='add'>+ successfully and abort layout setting. Note that we'll have a</div><div class='add'>+ directory without a layout till a lookup happens on the</div><div class='add'>+ directory. This means entry operations within this directory fail</div><div class='add'>+ in this time window. We can also consider failing mkdir. The</div><div class='add'>+ problem of dealing with a directory without layout is out of the</div><div class='add'>+ scope of this document. </div><div class='add'>+ -  set the layout on _directory-inode_.</div><div class='add'>+ -  release _inodelk (directory-inode, read-lock)_.</div><div class='add'>+* Note that during layout setting we consider mkdir as a  _reader_ not</div><div class='add'>+ _writer_, though it is setting the layout. Reasons are:</div><div class='add'>+ - Before any of other readers like create, link etc that operate on</div><div class='add'>+ this directory to happen, _gfid_ of this directory has to be</div><div class='add'>+ resolved. But _gfid_ is only available only if either of following</div><div class='add'>+ conditions are true: </div><div class='add'>+      * after mkdir is complete.</div><div class='add'>+      * a lookup on the same path happens parallel to in-progress</div><div class='add'>+ mkdir.</div><div class='add'>+</div><div class='add'>+     But, on completion of any of the above two operations, layout</div><div class='add'>+     will be healed. So, none of the _readers_ will happen on a</div><div class='add'>+     directory with partial layout.</div><div class='add'>+</div><div class='add'>+* Note that since we've an _entrylk (parent-inode, "basename")_ for</div><div class='add'>+   the entire duration of (attempting) creating directories, parallel</div><div class='add'>+   mkdirs will no longer contend on _mkdir_ on subvolume _to which  "basename"  hashes_. But instead, contend on _entrylk (parent-inode, "basename")_ on the subvolume _to which "basename" hashes_. So, we can attempt the _mkdir_ in _parallel_ on all subvolumes instead of two stage mkdir on hashed first and the rest of them in parallel later. However, we need to make sure that mkdir is successful on the subvolume _to which "basename" hashes_ for mkdir to be successful (as perceived by application). In the case of failed mkdir (as perceived by application), a cleanup should be performed on all the subvolumes before _entrylk (parent-inode, "basename")_ is released.</div><div class='add'>+</div><div class='add'>+**rmdir (parent-inode, "basename", directory-inode)**</div><div class='add'>+</div><div class='add'>+ -  acquire _inodelk (parent-inode, read-lock)_ on _any one_</div><div class='add'>+ subvolume.</div><div class='add'>+ -  refresh in-memory layout of parent-inode from values stored on backend</div><div class='add'>+ -  acquire _entrylk (parent-inode, "basename")_ on the subvolume to</div><div class='add'>+ which _"basename" hashes_.</div><div class='add'>+ -  If any/all of the above locks fail, rmdir is failed after cleanup</div><div class='add'>+ of the locks that were acquired successfully.</div><div class='add'>+ -  do _rmdir (parent-inode, "basename")_ on the subvolumes to which</div><div class='add'>+ _"basename" doesn't hash to_.</div><div class='add'>+    * If successful, continue. </div><div class='add'>+    * Else,</div><div class='add'>+     *  recreate directories on those subvolumes where rmdir</div><div class='add'>+  succeeded.</div><div class='add'>+     *  heal the layout of _directory-inode_. Note that this will have</div><div class='add'>+  same synchronization requirements as discussed during layout</div><div class='add'>+  healing part of the section "Directoy self-heal" above.</div><div class='add'>+     *  release _entrylk (parent-inode, "basename")_.</div><div class='add'>+     *  release _inodelk (parent-inode, read-lock)_.</div><div class='add'>+     *  fail _rmdir (parent-inode, "basename")_ to application.</div><div class='add'>+ - do _rmdir (parent-inode, "basename")_ on the subvolume to which</div><div class='add'>+ _"basename" hashes_. </div><div class='add'>+ - If successful, continue.</div><div class='add'>+ -  Else, Go to the failure part of _rmdir (parent-inode, "basename")_</div><div class='add'>+ on subvolumes to which "basename" _doesn't hash to_. </div><div class='add'>+ - release _entrylk (parent-inode, "basename")_.</div><div class='add'>+ - release _inodelk (parent-inode, read-lock)_.</div><div class='add'>+ - return success to application.</div><div class='add'>+ </div><div class='add'>+**renamedir (src-parent-inode, "src-basename", src-directory-inode, dst-parent-inode, "dst-basename", dst-directory-inode)**</div><div class='add'>+</div><div class='add'>+ -  requirement is to prevent any operation in both _src-namespace_</div><div class='add'>+ and _dst-namespace_. So, we need to acquire locks on both</div><div class='add'>+ namespaces.We also need to have constant ordering while acquiring</div><div class='add'>+ locks during parallel renames of the form _rename (src, dst)_ and</div><div class='add'>+ _rename (dst, src)_ to prevent deadlocks. We can sort gfids of</div><div class='add'>+ _src-parent-inode_ and _dst-parent-inode_ and use that order to</div><div class='add'>+ acquire locks. For the sake of explanation lets say we ended up</div><div class='add'>+ with order of _src_ followed by _dst_.</div><div class='add'>+ -  acquire _inodelk (src-parent-inode, read-lock)_.</div><div class='add'>+ -  refresh in-memory layout of src-parent-inode from values stored on backend</div><div class='add'>+ -  acquire _entrylk (src-parent-inode, "src-basename")_.</div><div class='add'>+ -  acquire _inodelk (dst-parent-inode, read-lock)_.</div><div class='add'>+ -  refresh in-memory layout of dst-parent-inode from values stored on backend</div><div class='add'>+ -  acquire _entrylk (dst-parent-inode, "dst-basename")_.</div><div class='add'>+ - If acquiring any/all of the locks above fail,</div><div class='add'>+      * release the locks that were successfully acquired.</div><div class='add'>+      * fail the renamedir operation to application</div><div class='add'>+      *  done</div><div class='add'>+ - do _renamedir ("src", "dst")_ on the subvolume _to which "dst-basename" hashes_.</div><div class='add'>+    *  If failure, Goto point _If acquiring any/all of the locks above fail_.</div><div class='add'>+    *  else, continue.</div><div class='add'>+ - do _renamedir ("src", "dst")_ on rest of the subvolumes.</div><div class='add'>+    *  If there is any failure, </div><div class='add'>+      * revert the successful renames.</div><div class='add'>+      *  Goto to point  _If acquiring any/all of the locks above fail_.</div><div class='add'>+    *  else,</div><div class='add'>+        -  release all the locks acquired.</div><div class='add'>+        -  return renamedir as success to application.</div><div class='add'>+</div><div class='add'>+**Some examples of races**</div><div class='add'>+This section gives concrete examples of races that can result in inconsistencies explained in the beginning of the document. </div><div class='add'>+</div><div class='add'>+Some assumptions are:</div><div class='add'>+</div><div class='add'>+*  We consider an example distribute of three subvols s1, s2 and s3.</div><div class='add'>+*  For examples of renamedir ("src", "dst"), _src_ hashes to s1 and _dst_ hashes to s2. _src_ and _dst_ are associated with _gfid-src_ and _gfid-dst_ respectively</div><div class='add'>+*  For non renamedir examples, _dir_ is the name of directory and it hashes to s1.</div><div class='add'>+</div><div class='add'>+And the examples are:  </div><div class='add'>+</div><div class='add'>+ -  mkdir vs rmdir - inconsistency in namespace.</div><div class='add'>+   *  mkdir ("dir", gfid1) is complete on s1</div><div class='add'>+   *  rmdir is issued on same directory. Note that, since rmdir needs a gfid, a lookup should be complete before rmdir. lookup creates the directory on rest of the subvols as part of self-heal.</div><div class='add'>+   *  rmdir (gfid1) deletes directory from all subvols.</div><div class='add'>+   *  A new mkdir ("dir", gfid2) is issued. It is successful on s1 associating "dir" with gfid2.</div><div class='add'>+   *  mkdir ("dir", gfid1) resumes and creates directory on s2 and s3 associating "dir" with gfid1.</div><div class='add'>+   *  mkdir ("dir", gfid2) fails with EEXIST on s2 and s3. Since, EEXIST errors are ignored, mkdir is considered successful to application.</div><div class='add'>+   *  In this example we have multiple inconsitencies</div><div class='add'>+      *  "dir" is associated with gfid1 on s2, s3 and with gfid2 on s1</div><div class='add'>+      *  Even if mkdir ("dir", gfid2) was not issued, we would've a case of a directory magically reappearing after a successful rmdir.</div><div class='add'>+ -  lookup heal vs rmdir</div><div class='add'>+   * rmdir ("dir", gfid1) is issued. It is successful on s2 and s3 (non-hashed subvols for name "dir")</div><div class='add'>+   *  lookup ("dir") is issued. Since directory is present on s1 yet, it is created on s2 and s3 associating with gfid1 as part of self-heal</div><div class='add'>+   *  rmdir ("dir", gfid1) is complete on s1 and it is successful</div><div class='add'>+   *  Another lookup ("dir") creates the directory on s1 too</div><div class='add'>+   *  "dir" magically reappears after a successful rmdir</div><div class='add'>+ - lookup heal (src) vs renamedir ("src", "dst")</div><div class='add'>+   *  renamedir ("src", "dst") complete on s2</div><div class='add'>+   *  lookup ("src") recreates _src_ with _gfid-src_ on s2</div><div class='add'>+   *  renamedir ("src", "dst") completes on s1, s3. After rename is complete path _dst_ will be associated with gfid _gfid-src_</div><div class='add'>+   *  Another lookup ("src") recreates _src_ on subvols s1 and s3, associating it with gfid _gfid-src_</div><div class='add'>+   *  Inconsistencies are</div><div class='add'>+      * after a successful renamedir ("src", "dst"), both src and dst exist</div><div class='add'>+      *  Two directories - src and dst - are associated with same gfid. One common symptom is that some entries (of the earlier _src_ and current _dst_ directory) being missed out in readdir listing as the gfid handle might be pointing to the empty healed directory than the actual directory containing entries</div><div class='add'>+ - lookup heal (dst) vs renamedir ("src", "dst")</div><div class='add'>+   *  dst exists and empty when renamdir started</div><div class='add'>+   *  dst doesn't exist when renamedir started</div><div class='add'>+      -  renamedir ("src", "dst") complete on s2 and s3</div><div class='add'>+      -  lookup ("dst") creates _dst_ associating it with _gfid-src_ on s1</div><div class='add'>+      -  An entry is created in _dst_ on either s1</div><div class='add'>+      -  renamedir ("src", "dst") on s1 will result in a directory _dst/dst_ as _dst_ is no longer empty and _man 2 rename_ states that if _dst_ is not empty, _src_ is renamed _as a subdirectory of dst_</div><div class='add'>+      -  A lookup ( _dst/dst_) creates _dst/dst_ on s2 and s3 associating with _gfid-src_ as part of self-heal</div><div class='add'>+      -  Inconsistencies are:</div><div class='add'>+         * Two directories - _dst_ and _dst/dst_ - exist even though both of them didn't exist at the beginning of renamedir</div><div class='add'>+         *  Both _dst_ and _dst/dst_ have same gfid - _gfid-src_. As observed earlier, symptom might be directory listing being incomplete</div><div class='add'>+ - mkdir (dst) vs renamedir ("src", "dst")</div><div class='add'>+ - rmdir (src) vs renamedir ("src", "dst")</div><div class='add'>+ - rmdir (dst) vs renamedir ("src", "dst")</div><div class='head'>diff --git a/doc/developer-guide/ec-implementation.md b/doc/developer-guide/ec-implementation.md<br/>new file mode 100644<br/>index 00000000000..77e62583caa<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/doc/developer-guide/ec-implementation.md?id=d1d7a6f35c816822fab51c820e25023863c239c1'>doc/developer-guide/ec-implementation.md</a></div><div class='hunk'>@@ -0,0 +1,588 @@</div><div class='add'>+Erasure coding implementation</div><div class='add'>+=============================</div><div class='add'>+</div><div class='add'>+This document provides information about how [erasure code][1] has</div><div class='add'>+been implemented into ec translator. It describes the algorithm used</div><div class='add'>+and the optimizations made, but it doesn't contain a full description</div><div class='add'>+of the mathematical background needed to understand erasure coding in</div><div class='add'>+general. It either describes the other parts of ec not directly</div><div class='add'>+related to the encoding/decoding procedure, like synchronization or</div><div class='add'>+fop management.</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+Introduction</div><div class='add'>+------------</div><div class='add'>+</div><div class='add'>+EC is based on [Reed-Solomon][2] erasure code. It's a very old code.</div><div class='add'>+It's not considered the best one nowadays, but is good enough and it's</div><div class='add'>+one of the few codes that is not covered by any patent and can be</div><div class='add'>+freely used.</div><div class='add'>+</div><div class='add'>+To define the Reed-Solomon code we use 3 parameters:</div><div class='add'>+</div><div class='add'>+  * __Key fragments (K)__  </div><div class='add'>+    It represents the minimum number of healthy fragments that will be</div><div class='add'>+    needed to be able to recover the original data. Any subset of K</div><div class='add'>+    out of the total number of fragments will serve.</div><div class='add'>+</div><div class='add'>+  * __Redundancy fragments (R)__  </div><div class='add'>+    It represents the number of extra fragments to compute for each</div><div class='add'>+    original data block. This value determines how many fragments can</div><div class='add'>+    be lost before being unable to recover the original data.</div><div class='add'>+</div><div class='add'>+  * __Fragment size (S)__  </div><div class='add'>+    This determines the size of each fragment. The original data</div><div class='add'>+    block size is computed as S * K. Currently this values is fixed</div><div class='add'>+    to 512 bytes.</div><div class='add'>+</div><div class='add'>+  * __Total number of fragments (N = K + R)__  </div><div class='add'>+    This isn't a real parameter but it will be useful to simplify</div><div class='add'>+    the following descriptions.</div><div class='add'>+</div><div class='add'>+From the point of view of the implementation, it only consists on</div><div class='add'>+matrix multiplications. There are two kinds of matrices to use for</div><div class='add'>+Reed-Solomon:</div><div class='add'>+</div><div class='add'>+  * __[Systematic][3]__  </div><div class='add'>+    This kind of matrix has the particularity that K of the encoded</div><div class='add'>+    fragments are simply a copy of the original data, divided into K</div><div class='add'>+    pieces. Thus no real encoding needs to be done for them and only</div><div class='add'>+    the R redundancy fragments need to be computed.</div><div class='add'>+</div><div class='add'>+    This kind of matrices contain one KxK submatrix that is the</div><div class='add'>+    [identity matrix][4].</div><div class='add'>+</div><div class='add'>+  * __Non-systematic__  </div><div class='add'>+    This kind of matrix doesn't contain an identity submatrix. This</div><div class='add'>+    means that all of the N fragments need to be encoded, requiring</div><div class='add'>+    more computation. On the other hand, these matrices have some nice</div><div class='add'>+    properties that allow faster implementations of some algorithms,</div><div class='add'>+    like the matrix inversion used to decode the data.</div><div class='add'>+</div><div class='add'>+    Another advantage of non-systematic matrices is that the decoding</div><div class='add'>+    time is constant, independently of how many fragments are lost,</div><div class='add'>+    while systematic approach can suffer from performance degradation</div><div class='add'>+    when one fragment is lost.</div><div class='add'>+</div><div class='add'>+All non-systematic matrices can be converted to systematic ones, but</div><div class='add'>+then we lose the good properties of the non-systematic. We have to</div><div class='add'>+choose betwee best peek performance (systematic) and performance</div><div class='add'>+stability (non-systematic).</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+Encoding procedure</div><div class='add'>+------------------</div><div class='add'>+</div><div class='add'>+To encode a block of data we need a KxN matrix where each subset of K</div><div class='add'>+rows is [linearly independent][5]. In other words, the determinant of</div><div class='add'>+each KxK submatrix is not 0.</div><div class='add'>+</div><div class='add'>+There are some known ways to obtain this kind of matrices. EC uses a</div><div class='add'>+small variation of a matrix known as [Vandermonde Matrix][6] where</div><div class='add'>+each element of the matrix is defined as:</div><div class='add'>+</div><div class='add'>+    a(i, j) = i ^ (K - j)</div><div class='add'>+</div><div class='add'>+    where i is the row from 1 to N, and j is the column from 1 to K.</div><div class='add'>+</div><div class='add'>+This is exactly the Vandermonde Matrix but with the elements of each</div><div class='add'>+row in reverse order. This change is made to be able to implement a</div><div class='add'>+small optimization in the matrix multiplication.</div><div class='add'>+</div><div class='add'>+Once we have the matrix, we only need to compute the multiplication</div><div class='add'>+of this matrix by a vector composed of K elements of data coming from</div><div class='add'>+the original data block.</div><div class='add'>+</div><div class='add'>+     /                 \             /                               \</div><div class='add'>+    |    1   1  1  1  1 |    / \    |     a +    b +   c +  d + e = t |</div><div class='add'>+    |   16   8  4  2  1 |   | a |   |   16a +   8b +  4c + 2d + e = u |</div><div class='add'>+    |   81  27  9  3  1 |   | b | = |   81a +  27b +  9c + 3d + e = v |</div><div class='add'>+    |  256  64 16  4  1 | * | c |   |  256a +  64b + 16c + 4d + e = w |</div><div class='add'>+    |  625 125 25  5  1 |   | d |   |  625a + 125b + 25c + 5d + e = x |</div><div class='add'>+    | 1296 216 36  6  1 |   | e |   | 1296a + 216b + 36c + 6d + e = y |</div><div class='add'>+    | 2401 343 49  7  1 |    \ /    | 2401a + 343b + 49c + 7d + e = z |</div><div class='add'>+     \                 /             \                               /</div><div class='add'>+</div><div class='add'>+The optimization that can be done here is this:</div><div class='add'>+</div><div class='add'>+    16a + 8b + 4c + 2d + e = 2(2(2(2a + b) + c) + d) + e</div><div class='add'>+</div><div class='add'>+So all the multiplications are always by the number of the row (2 in</div><div class='add'>+this case) and we don't need temporal storage for intermediate</div><div class='add'>+results:</div><div class='add'>+</div><div class='add'>+    a *= 2</div><div class='add'>+    a += b</div><div class='add'>+    a *= 2</div><div class='add'>+    a += c</div><div class='add'>+    a *= 2</div><div class='add'>+    a += d</div><div class='add'>+    a *= 2</div><div class='add'>+    a += e</div><div class='add'>+</div><div class='add'>+Once we have the result vector, each element is a fragment that needs</div><div class='add'>+to be stored in a separate place.</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+Decoding procedure</div><div class='add'>+------------------</div><div class='add'>+</div><div class='add'>+To recover the data we need exactly K of the fragments. We need to</div><div class='add'>+know which K fragments we have (i.e. the original row number from</div><div class='add'>+which each fragment was calculated). Once we have this data we build</div><div class='add'>+a square KxK matrix composed by the rows corresponding to the given</div><div class='add'>+fragments and invert it.</div><div class='add'>+</div><div class='add'>+With the inverted matrix, we can recover the original data by</div><div class='add'>+multiplying it with the vector composed by the K fragments.</div><div class='add'>+</div><div class='add'>+In our previous example, if we consider that we have recovered</div><div class='add'>+fragments t, u, v, x and z, corresponding to rows 1, 2, 3, 5 and 7,</div><div class='add'>+we can build the following matrix:</div><div class='add'>+</div><div class='add'>+     /                 \</div><div class='add'>+    |    1   1  1  1  1 |</div><div class='add'>+    |   16   8  4  2  1 |</div><div class='add'>+    |   81  27  9  3  1 |</div><div class='add'>+    |  625 125 25  5  1 |</div><div class='add'>+    | 2401 343 49  7  1 |</div><div class='add'>+     \                 /</div><div class='add'>+</div><div class='add'>+And invert it:</div><div class='add'>+</div><div class='add'>+     /                                     \</div><div class='add'>+    |    1/48  -1/15    1/16  -1/48   1/240 |</div><div class='add'>+    |  -17/48  16/15  -15/16  13/48 -11/240 |</div><div class='add'>+    |  101/48 -86/15   73/16 -53/48  41/240 |</div><div class='add'>+    | -247/48 176/15 -129/16  83/48 -61/240 |</div><div class='add'>+    |   35/8   -7      35/8   -7/8    1/8   |</div><div class='add'>+     \                                     /</div><div class='add'>+</div><div class='add'>+Multiplying it by the vector (t, u, v, x, z) we recover the original</div><div class='add'>+data (a, b, c, d, e):</div><div class='add'>+</div><div class='add'>+     /                                     \     / \     / \</div><div class='add'>+    |    1/48  -1/15    1/16  -1/48   1/240 |   | t |   | a |</div><div class='add'>+    |  -17/48  16/15  -15/16  13/48 -11/240 |   | u |   | b |</div><div class='add'>+    |  101/48 -86/15   73/16 -53/48  41/240 | * | v | = | c |</div><div class='add'>+    | -247/48 176/15 -129/16  83/48 -61/240 |   | x |   | d |</div><div class='add'>+    |   35/8   -7      35/8   -7/8    1/8   |   | z |   | e |</div><div class='add'>+     \                                     /     \ /     \ /</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+Galois Field</div><div class='add'>+------------</div><div class='add'>+</div><div class='add'>+This encoding/decoding procedure is quite complex to compute using</div><div class='add'>+regular mathematical operations and it's not well suited for what</div><div class='add'>+we want to do (note that matrix elements can grow unboundly).</div><div class='add'>+</div><div class='add'>+To solve this problem, exactly the same procedure is done inside a</div><div class='add'>+[Galois Field][7] of characteristic 2, which is a finite field with</div><div class='add'>+some interesting properties that make it specially useful for fast</div><div class='add'>+operations using computers.</div><div class='add'>+</div><div class='add'>+There are two main differences when we use this specific Galois Field:</div><div class='add'>+</div><div class='add'>+  * __All regular additions are replaced by bitwise xor's__  </div><div class='add'>+    For todays computers it's not really faster to execute an xor</div><div class='add'>+    compared to an addition, however replacing additions by xor's</div><div class='add'>+    inside a multiplication has many advantages (we will make use of</div><div class='add'>+    this to optimize the multiplication).</div><div class='add'>+</div><div class='add'>+    Another consequence of this change is that additions and</div><div class='add'>+    substractions are really the same xor operation.</div><div class='add'>+</div><div class='add'>+  * __The elements of the matrix are bounded__  </div><div class='add'>+    The field uses a modulus that keep all possible elements inside</div><div class='add'>+    a delimited region, avoiding really big numbers and fixing the</div><div class='add'>+    number of bits needed to represent each value.</div><div class='add'>+</div><div class='add'>+    In the current implementation EC uses 8 bits per field element.</div><div class='add'>+</div><div class='add'>+It's very important to understand how multiplications are computed</div><div class='add'>+inside a Galois Field to be able to understand how has it been</div><div class='add'>+optimized.</div><div class='add'>+</div><div class='add'>+We'll start with a simple 'old school' multiplication but in base 2.</div><div class='add'>+For example, if we want to multiply 7 * 5 (111b * 101b in binary), we</div><div class='add'>+do the following:</div><div class='add'>+</div><div class='add'>+          1 1 1 (= 7)</div><div class='add'>+    *     1 0 1 (= 5)</div><div class='add'>+    -----------</div><div class='add'>+          1 1 1 (= 7)</div><div class='add'>+    +   0 0 0   (= 0)</div><div class='add'>+    + 1 1 1     (= 7)</div><div class='add'>+    -----------</div><div class='add'>+    1 0 0 0 1 1 (= 35)</div><div class='add'>+</div><div class='add'>+This is quite simple. Note that the addition of the third column</div><div class='add'>+generates a carry that is propagated to all the other left columns.</div><div class='add'>+</div><div class='add'>+The next step is to define the modulus of the field. Suppose we use</div><div class='add'>+11 as the modulus. Then we convert the result into an element of the</div><div class='add'>+field by dividing by the modulus and taking the residue. We also use</div><div class='add'>+the 'old school' method in binary:</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+      1 0 0 0 1 1 (= 35) | 1 0 1 1 (= 11)</div><div class='add'>+    - 0 0 0 0            ----------------</div><div class='add'>+    ---------              0 1 1 (= 3)</div><div class='add'>+      1 0 0 0 1</div><div class='add'>+    -   1 0 1 1</div><div class='add'>+    -----------</div><div class='add'>+      0 0 1 1 0 1</div><div class='add'>+    -     1 0 1 1</div><div class='add'>+    -------------</div><div class='add'>+          0 0 1 0 (= 2)</div><div class='add'>+</div><div class='add'>+So, 7 * 5 in a field with modulus 11 is 2. Note that the main</div><div class='add'>+objective in each iteration of the division is to make higher bits</div><div class='add'>+equal to 0 when possible (if it's not possible in one iteration, it</div><div class='add'>+will be zeroed on the next).</div><div class='add'>+</div><div class='add'>+If we do the same but changing additions with xors we get this:</div><div class='add'>+</div><div class='add'>+          1 1 1 (= 7)</div><div class='add'>+    *     1 0 1 (= 5)</div><div class='add'>+    -----------</div><div class='add'>+          1 1 1 (= 7)</div><div class='add'>+    x   0 0 0   (= 0)</div><div class='add'>+    x 1 1 1     (= 7)</div><div class='add'>+    -----------</div><div class='add'>+      1 1 0 1 1 (= 27)</div><div class='add'>+</div><div class='add'>+In this case, the xor of the third column doesn't generate any carry.</div><div class='add'>+</div><div class='add'>+Now we need to divide by the modulus. We can also use 11 as the</div><div class='add'>+modulus since it still satisfies the needed conditions to work on a</div><div class='add'>+Galois Field of characteristic 2 with 3 bits:</div><div class='add'>+</div><div class='add'>+      1 1 0 1 1 (= 27) | 1 0 1 1 (= 11)</div><div class='add'>+    x 1 0 1 1          ----------------</div><div class='add'>+    ---------            1 1 1 (= 7)</div><div class='add'>+      0 1 1 0 1</div><div class='add'>+    x   1 0 1 1</div><div class='add'>+    -----------</div><div class='add'>+        0 1 1 0 1</div><div class='add'>+    x     1 0 1 1</div><div class='add'>+    -------------</div><div class='add'>+          0 1 1 0 (= 6)</div><div class='add'>+</div><div class='add'>+Note that, in this case, to make zero the higher bit we need to</div><div class='add'>+consider the result of the xor operation, not the addition operation.</div><div class='add'>+</div><div class='add'>+So, 7 * 5 in a Galois Field of 3 bits with modulus 11 is 6.</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+Optimization</div><div class='add'>+------------</div><div class='add'>+</div><div class='add'>+To compute all these operations in a fast way some methods have been</div><div class='add'>+traditionally used. Maybe the most common is the [lookup table][8].</div><div class='add'>+</div><div class='add'>+The problem with this method is that it requires 3 lookups for each</div><div class='add'>+byte multiplication, greatly amplifying the needed memory bandwidth</div><div class='add'>+and making it difficult to take advantage of any SIMD support on the</div><div class='add'>+processor.</div><div class='add'>+</div><div class='add'>+What EC does to improve the performance is based on the following</div><div class='add'>+property (using the 3 bits Galois Field of the last example):</div><div class='add'>+</div><div class='add'>+    A * B mod N = (A * b{2} * 4 mod N) x</div><div class='add'>+                  (A * b{1} * 2 mod N) x</div><div class='add'>+                  (A * b{0} mod N)</div><div class='add'>+</div><div class='add'>+This is basically a rewrite of the steps made in the previous example</div><div class='add'>+to multiply two numbers but moving the modulus calculation inside each</div><div class='add'>+intermediate result. What we can see here is that each term of the</div><div class='add'>+xor can be zeroed if the corresponding bit of B is 0, so we can ignore</div><div class='add'>+that factor. If the bit is 1, we need to compute A multiplied by a</div><div class='add'>+power of two and take the residue of the division by the modulus. We</div><div class='add'>+can precompute these values:</div><div class='add'>+</div><div class='add'>+    A0 = A (we don't need to compute the modulus here)</div><div class='add'>+    A1 = A0 * 2 mod N</div><div class='add'>+    A2 = A1 * 2 mod N</div><div class='add'>+</div><div class='add'>+Having these values we only need to add those corresponding to bits</div><div class='add'>+set to 1 in B. Using our previous example:</div><div class='add'>+</div><div class='add'>+    A = 1 1 1 (= 7)</div><div class='add'>+    B = 1 0 1 (= 5)</div><div class='add'>+</div><div class='add'>+    A0 = 1 1 1 (= 7)</div><div class='add'>+    A1 = 1 1 1 * 1 0 mod 1 0 1 1 = 1 0 1 (= 5)</div><div class='add'>+    A2 = 1 0 1 * 1 0 mod 1 0 1 1 = 0 0 1 (= 1)</div><div class='add'>+</div><div class='add'>+    Since only bits 0 and 2 are 1 in B, we add A0 and A2:</div><div class='add'>+</div><div class='add'>+    A0 + A2 = 1 1 1 x 0 0 1 = 1 1 0 (= 6)</div><div class='add'>+</div><div class='add'>+If we carefully look at what we are doing when computing each Ax, we</div><div class='add'>+see that we do two basic things:</div><div class='add'>+</div><div class='add'>+  - Shift the original value one bit to the left</div><div class='add'>+  - If the highest bit is 1, xor with the modulus</div><div class='add'>+</div><div class='add'>+Let's write this in a detailed way (representing each bit):</div><div class='add'>+</div><div class='add'>+    Original value:      a{2} a{1} a{0}</div><div class='add'>+    Shift 1 bit:    a{2} a{1} a{0}  0</div><div class='add'>+</div><div class='add'>+    If a{2} is 0 we already have the result:</div><div class='add'>+        a{1} a{0} 0</div><div class='add'>+</div><div class='add'>+    If a{2} is 1 we need to xor with the modulus:</div><div class='add'>+        1 a{1} a{0} 0 x 1 0 1 1 = a{1} (a{0} x 1) 1</div><div class='add'>+</div><div class='add'>+An important thing to see here is that if a{2} is 0, we can get the</div><div class='add'>+same result by xoring with all 0 instead of the modulus. For this</div><div class='add'>+reason we can rewrite the modulus as this:</div><div class='add'>+</div><div class='add'>+    Modulus: a{2} 0 a{2} a{2}</div><div class='add'>+</div><div class='add'>+This means that the modulus will be 0 0 0 0 is a{2} is 0, so the value</div><div class='add'>+won't change, and it will be 1 0 1 1 if a{2} is 1, giving the correct</div><div class='add'>+result. So, the computation is simply:</div><div class='add'>+</div><div class='add'>+    Original value:      a{2} a{1} a{0}</div><div class='add'>+    Shift 1 bit:    a{2} a{1} a{0}  0</div><div class='add'>+    Apply modulus:  a{1} (a{0} x a{2}) a{2}</div><div class='add'>+</div><div class='add'>+We can compute all Ax using this method. We'll get this:</div><div class='add'>+</div><div class='add'>+    A0 = a{2} a{1} a{0}</div><div class='add'>+    A1 = a{1} (a{0} x a{2}) a{2}</div><div class='add'>+    A2 = (a{0} x a{2}) (a{1} x a{2}) a{1}</div><div class='add'>+</div><div class='add'>+Once we have all terms, we xor the ones corresponding to the bits set</div><div class='add'>+to 1 in B. In out example this will be A0 and A2:</div><div class='add'>+</div><div class='add'>+   Result: (a{2} x a{0} x a{2}) (a{1} x a{1} x a{2}) (a{0} x a{1})</div><div class='add'>+</div><div class='add'>+We can easily see that we can remove some redundant factors:</div><div class='add'>+</div><div class='add'>+   Result: a{0} a{2} (a{0} x a{1})</div><div class='add'>+</div><div class='add'>+This way we have come up with a simply set of equations to compute the</div><div class='add'>+multiplication of any number by 5. If A is 1 1 1 (= 7), the result</div><div class='add'>+must be 1 1 0 (= 6) using the equations, as we expected. If we try</div><div class='add'>+another numbe for A, like 0 1 0 (= 2), the result must be 0 0 1 (= 1).</div><div class='add'>+</div><div class='add'>+This seems a really fast way to compute the multiplication without</div><div class='add'>+using any table lookup. The problem is that this is only valid for</div><div class='add'>+B = 5. For other values of B another set of equations will be found.</div><div class='add'>+To solve this problem we can pregenerate the equations for all</div><div class='add'>+possible values of B. Since the Galois Field we use is small, this is</div><div class='add'>+feasible.</div><div class='add'>+</div><div class='add'>+One thing to be aware of is that, in general, two equations for</div><div class='add'>+different bits of the same B can share common subexpressions. This</div><div class='add'>+gives space for further optimizations to reduce the total number of</div><div class='add'>+xors used in the final equations for a given B. However this is not</div><div class='add'>+easy to find, since finding the smallest number of xors that give the</div><div class='add'>+correct result is an NP-Problem. For EC an exhaustive search has been</div><div class='add'>+made to find the best combinations for each possible value.</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+Implementation</div><div class='add'>+--------------</div><div class='add'>+</div><div class='add'>+All this seems great from the hardware point of view, but implementing</div><div class='add'>+this using normal processor instructions is not so easy because we</div><div class='add'>+would need a lot of shifts, ands, xors and ors to move the bits of</div><div class='add'>+each number to the correct position to compute the equation and then</div><div class='add'>+another shift to put each bit back to its final place.</div><div class='add'>+</div><div class='add'>+For example, to implement the functions to multiply by 5, we would</div><div class='add'>+need something like this:</div><div class='add'>+</div><div class='add'>+    Bit 2:  T2 = (A &amp; 1) &lt;&lt; 2</div><div class='add'>+    Bit 1:  T1 = (A &amp; 4) &gt;&gt; 1</div><div class='add'>+    Bit 0:  T0 = ((A &gt;&gt; 1) x A) &amp; 1</div><div class='add'>+    Result: T2 + T1 + T0</div><div class='add'>+</div><div class='add'>+This doesn't look good. So here we make a change in the way we get</div><div class='add'>+and process the data: instead of reading full numbers into variables</div><div class='add'>+and operate with them afterwards, we use a single independent variable</div><div class='add'>+for each bit of the number.</div><div class='add'>+</div><div class='add'>+Assume that we can read and write independent bits from memory (later</div><div class='add'>+we'll see how to solve this problem when this is not possible). In</div><div class='add'>+this case, the code would look something like this:</div><div class='add'>+</div><div class='add'>+    Bit 2:        T2 = Mem[2]</div><div class='add'>+    Bit 1:        T1 = Mem[1]</div><div class='add'>+    Bit 0:        T0 = Mem[0]</div><div class='add'>+    Computation:  T1 ^= T0</div><div class='add'>+    Store result: Mem[2] = T0</div><div class='add'>+                  Mem[1] = T2</div><div class='add'>+                  Mem[0] = T1</div><div class='add'>+</div><div class='add'>+Note that in this case we handle the final reordering of bits simply</div><div class='add'>+by storing the right variable to the right place, without any shifts,</div><div class='add'>+ands nor ors. In fact we only have memory loads, memory stores and</div><div class='add'>+xors. Note also that we can do all the computations directly using the</div><div class='add'>+variables themselves, without additional storage. This true for most</div><div class='add'>+of the values, but in some cases an additional one or two temporal</div><div class='add'>+variables will be needed to store intermediate results.</div><div class='add'>+</div><div class='add'>+The drawback of this approach is that additions, that are simply a</div><div class='add'>+xor of two numbers will need as many xors as bits are in each number.</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+SIMD optimization</div><div class='add'>+-----------------</div><div class='add'>+</div><div class='add'>+So we have a good way to compute the multiplications, but even using</div><div class='add'>+this we'll need several operations for each byte of the original data.</div><div class='add'>+We can improve this by doing multiple multiplications using the same</div><div class='add'>+set of instructions.</div><div class='add'>+</div><div class='add'>+With the approach taken in the implementation section, we can see that</div><div class='add'>+in fact it's really easy to add SIMD support to this method. We only</div><div class='add'>+need to store in each variable one bit from multiple numbers. For</div><div class='add'>+example, when we load T2 from memory, instead of reading the bit 2 of</div><div class='add'>+the first number, we can read the bit 2 of the first, second, third,</div><div class='add'>+fourth, ... numbers. The same can be done when loading T1 and T0.</div><div class='add'>+</div><div class='add'>+Obviously this needs to have a special encoding of the numbers into</div><div class='add'>+memory to be able to do that in a single operation, but since we can</div><div class='add'>+choose whatever encoding we want for EC, we have chosen to have</div><div class='add'>+exactly that. We interpret the original data as a stream of bits, and</div><div class='add'>+we split it into subsequences of length L, each containing one bit of</div><div class='add'>+a number. Every S subsequences form a set of numbers of S bits that</div><div class='add'>+are encoded and decoded as a single group. This repeats for any</div><div class='add'>+remaining data.</div><div class='add'>+</div><div class='add'>+For example, in a simple case with L = 8 and S = 3, the original data</div><div class='add'>+would contain something like this (interpreted as a sequence of bits,</div><div class='add'>+offsets are also bit-based):</div><div class='add'>+</div><div class='add'>+    Offset  0: a{0} b{0} c{0} d{0} e{0} f{0} g{0} h{0}</div><div class='add'>+    Offset  8: a{1} b{1} c{1} d{1} e{1} f{1} g{1} h{1}</div><div class='add'>+    Offset 16: a{2} b{2} c{2} d{2} e{2} f{2} g{2} h{2}</div><div class='add'>+    Offset 24: i{0} j{0} k{0} l{0} m{0} n{0} o{0} p{0}</div><div class='add'>+    Offset 32: i{1} j{1} k{1} l{1} m{1} n{1} o{1} p{1}</div><div class='add'>+    Offset 40: i{2} j{2} k{2} l{2} m{2} n{2} o{2} p{2}</div><div class='add'>+</div><div class='add'>+Note: If the input file is not a multiple of S * L, 0-padding is done.</div><div class='add'>+</div><div class='add'>+Here we have 16 numbers encoded, from A to P. This way we can easily</div><div class='add'>+see that reading the first byte of the file will read all bits 0 of</div><div class='add'>+number A, B, C, D, E, F, G and H. The same happens with bits 1 and 2</div><div class='add'>+when we read the second and third bytes respectively. Using this</div><div class='add'>+encoding and the implementation described above, we can see that the</div><div class='add'>+same set of instructions will be computing the multiplication of 8</div><div class='add'>+numbers at the same time.</div><div class='add'>+</div><div class='add'>+This can be further improved if we use L = 64 with 64 bits variables</div><div class='add'>+on 64-bits processor. It's even faster if we use L = 128 using SSE</div><div class='add'>+registers or L = 256 using AVX registers on Intel processors.</div><div class='add'>+</div><div class='add'>+Currently EC uses L = 512 and S = 8. This means that numbers are</div><div class='add'>+packed in blocks of 512 bytes and gives space for even bigger</div><div class='add'>+processor registers up to 512 bits.</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+Conclusions</div><div class='add'>+-----------</div><div class='add'>+</div><div class='add'>+This method requires a single variable/processor register for each</div><div class='add'>+bit. This can be challenging if we want to avoid additional memory</div><div class='add'>+accesses, even if we use modern processors that have many registers.</div><div class='add'>+However, the implementation we chose for the Vandermonde Matrix</div><div class='add'>+doesn't require temporary storage, so we don't need a full set of 8</div><div class='add'>+new registers (one for each bit) to store partial computations.</div><div class='add'>+Additionally, the computation of the multiplications requires, at</div><div class='add'>+most, 2 extra registers, but this is afordable.</div><div class='add'>+</div><div class='add'>+Xors are a really fast operation in modern processors. Intel CPU's</div><div class='add'>+can dispatch up to 3 xors per CPU cycle if there are no dependencies</div><div class='add'>+with ongoing previous instructions. Worst case is 1 xor per cycle. So,</div><div class='add'>+in some configurations, this method could be very near to the memory</div><div class='add'>+speed.</div><div class='add'>+</div><div class='add'>+Another interesting thing of this method is that all data it needs to</div><div class='add'>+operate is packed in small sequential blocks of memory, meaning that</div><div class='add'>+it can take advantage of the faster internal CPU caches.</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+Results</div><div class='add'>+-------</div><div class='add'>+</div><div class='add'>+For the particular case of 8 bits, EC can compute each multiplication</div><div class='add'>+using 12.8 xors on average (without counting 0 and 1 that do not</div><div class='add'>+require any xor). Some numbers require less, like 2 that only requires</div><div class='add'>+3 xors.</div><div class='add'>+</div><div class='add'>+Having all this, we can check some numbers to see the performance of</div><div class='add'>+this method.</div><div class='add'>+</div><div class='add'>+Maybe the most interesting thing is the average number of xors needed</div><div class='add'>+to encode a single byte of data. To compute this we'll need to define</div><div class='add'>+some variables:</div><div class='add'>+</div><div class='add'>+  * K: Number of data fragments  </div><div class='add'>+  * R: Number of redundancy fragments  </div><div class='add'>+  * N: K + R  </div><div class='add'>+  * B: Number of bits per number  </div><div class='add'>+  * A: Average number of xors per number  </div><div class='add'>+  * Z: Bits per CPU register (can be up to 256 for AVX registers)  </div><div class='add'>+  * X: Average number of xors per CPU cycle  </div><div class='add'>+  * L: Average cycles per load  </div><div class='add'>+  * S: Average cycles per store  </div><div class='add'>+  * G: Core speed in Hz  </div><div class='add'>+</div><div class='add'>+_Total number of bytes processed for a single matrix multiplication_:</div><div class='add'>+</div><div class='add'>+  * __Read__:    K * B * Z / 8  </div><div class='add'>+  * __Written__: N * B * Z / 8  </div><div class='add'>+</div><div class='add'>+_Total number of memory accesses_:</div><div class='add'>+</div><div class='add'>+  * __Loads__:  K * B * N  </div><div class='add'>+  * __Stores__: B * N  </div><div class='add'>+</div><div class='add'>+&gt;  We need to read the same K * B * Z bits, in registers of Z bits, N</div><div class='add'>+&gt;  times, one for each row of the matrix. However the last N - 1 reads</div><div class='add'>+&gt;  could be made from the internal CPU caches if conditions are good.</div><div class='add'>+</div><div class='add'>+_Total number of operations_:</div><div class='add'>+</div><div class='add'>+  * __Additions__:       (K - 1) * N  </div><div class='add'>+  * __Multiplications__: K * N  </div><div class='add'>+</div><div class='add'>+__Total number of xors__: B * (K - 1) * N + A * K * N =</div><div class='add'>+                          N * ((A + B) * K - B)</div><div class='add'>+</div><div class='add'>+__Xors per byte__: 8 * N * ((A + B) * K - B) / (K * B * Z)</div><div class='add'>+</div><div class='add'>+__CPU cycles per byte__: 8 * N * ((A + B) * K - B) / (K * B * Z * X) +</div><div class='add'>+                         8 * L * N / Z +      (loads)</div><div class='add'>+                         8 * S * N / (K * Z)  (stores)</div><div class='add'>+</div><div class='add'>+__Bytes per second__: G / {CPU cycles per byte}</div><div class='add'>+</div><div class='add'>+Some xors per byte numbers for specific configurations (B=8):</div><div class='add'>+</div><div class='add'>+              Z=64  Z=128  Z=256</div><div class='add'>+    K=2/R=1   0.79  0.39   0.20</div><div class='add'>+    K=4/R=2   1.76  0.88   0.44</div><div class='add'>+    K=4/R=3   2.06  1.03   0.51</div><div class='add'>+    K=8/R=3   3.40  1.70   0.85</div><div class='add'>+    K=8/R=4   3.71  1.86   0.93</div><div class='add'>+    K=16/R=4  6.34  3.17   1.59</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+[1]: https://en.wikipedia.org/wiki/Erasure_code</div><div class='add'>+[2]: https://en.wikipedia.org/wiki/Reed%E2%80%93Solomon_error_correction</div><div class='add'>+[3]: https://en.wikipedia.org/wiki/Systematic_code</div><div class='add'>+[4]: https://en.wikipedia.org/wiki/Identity_matrix</div><div class='add'>+[5]: https://en.wikipedia.org/wiki/Linear_independence</div><div class='add'>+[6]: https://en.wikipedia.org/wiki/Vandermonde_matrix</div><div class='add'>+[7]: https://en.wikipedia.org/wiki/Finite_field</div><div class='add'>+[8]: https://en.wikipedia.org/wiki/Finite_field_arithmetic#Implementation_tricks</div><div class='head'>diff --git a/doc/developer-guide/fuse-interrupt.md b/doc/developer-guide/fuse-interrupt.md<br/>new file mode 100644<br/>index 00000000000..ec991b81ec5<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/doc/developer-guide/fuse-interrupt.md?id=d1d7a6f35c816822fab51c820e25023863c239c1'>doc/developer-guide/fuse-interrupt.md</a></div><div class='hunk'>@@ -0,0 +1,211 @@</div><div class='add'>+# Fuse interrupt handling</div><div class='add'>+</div><div class='add'>+## Conventions followed</div><div class='add'>+</div><div class='add'>+- *FUSE* refers to the "wire protocol" between kernel and userspace and</div><div class='add'>+  related specifications.</div><div class='add'>+- *fuse* refers to the kernel subsystem and also to the GlusterFs translator.</div><div class='add'>+</div><div class='add'>+## FUSE interrupt handling spec</div><div class='add'>+</div><div class='add'>+The [Linux kernel FUSE documentation](https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/Documentation/filesystems/fuse.txt?h=v4.18#n148)</div><div class='add'>+desrcibes how interrupt handling happens in fuse.</div><div class='add'>+</div><div class='add'>+## Interrupt handling in the fuse translator</div><div class='add'>+</div><div class='add'>+### Declarations</div><div class='add'>+</div><div class='add'>+This document describes the internal API in the fuse translator with which</div><div class='add'>+interrupt can be handled.</div><div class='add'>+</div><div class='add'>+The API being internal (to be used only in fuse-bridge.c; the functions are</div><div class='add'>+not exported to a header file).</div><div class='add'>+</div><div class='add'>+```</div><div class='add'>+enum fuse_interrupt_state {</div><div class='add'>+    /* ... */</div><div class='add'>+    INTERRUPT_SQUELCHED,</div><div class='add'>+    INTERRUPT_HANDLED,</div><div class='add'>+    /* ... */</div><div class='add'>+};</div><div class='add'>+typedef enum fuse_interrupt_state fuse_interrupt_state_t;</div><div class='add'>+struct fuse_interrupt_record;</div><div class='add'>+typedef struct fuse_interrupt_record fuse_interrupt_record_t;</div><div class='add'>+typedef void (*fuse_interrupt_handler_t)(xlator_t *this,</div><div class='add'>+                                         fuse_interrupt_record_t *);</div><div class='add'>+struct fuse_interrupt_record {</div><div class='add'>+    fuse_in_header_t fuse_in_header;</div><div class='add'>+    void *data;</div><div class='add'>+    /*</div><div class='add'>+       ...</div><div class='add'>+     */</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+fuse_interrupt_record_t *</div><div class='add'>+fuse_interrupt_record_new(fuse_in_header_t *finh,</div><div class='add'>+                          fuse_interrupt_handler_t handler);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+fuse_interrupt_record_insert(xlator_t *this, fuse_interrupt_record_t *fir);</div><div class='add'>+</div><div class='add'>+gf_boolean_t</div><div class='add'>+fuse_interrupt_finish_fop(call_frame_t *frame, xlator_t *this,</div><div class='add'>+                          gf_boolean_t sync, void **datap);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+fuse_interrupt_finish_interrupt(xlator_t *this, fuse_interrupt_record_t *fir,</div><div class='add'>+                                fuse_interrupt_state_t intstat,</div><div class='add'>+                                gf_boolean_t sync, void **datap);</div><div class='add'>+```</div><div class='add'>+</div><div class='add'>+The code demonstrates the usage of the API through `fuse_flush()`. (It's a</div><div class='add'>+dummy implementation only for demonstration purposes.) Flush is chosen</div><div class='add'>+because a `FLUSH` interrupt is easy to trigger (see</div><div class='add'>+*tests/features/interrupt.t*). Interrupt handling for flush is switched on</div><div class='add'>+by `--fuse-flush-handle-interrupt` (a hidden glusterfs command line flag).</div><div class='add'>+The implementation of flush interrupt is contained in the</div><div class='add'>+`fuse_flush_interrupt_handler()` function and blocks guarded by the</div><div class='add'>+</div><div class='add'>+```</div><div class='add'>+if (priv-&gt;flush_handle_interrupt) { ...</div><div class='add'>+```</div><div class='add'>+</div><div class='add'>+conditional (where `priv` is a `*fuse_private_t`).</div><div class='add'>+</div><div class='add'>+### Overview</div><div class='add'>+</div><div class='add'>+"Regular" fuse fops and interrupt handlers interact via a list containing</div><div class='add'>+interrupt records.</div><div class='add'>+</div><div class='add'>+If a fop wishes to have its interrupts handled, it needs to set up an</div><div class='add'>+interrupt record and insert it into the list; also when it's to finish</div><div class='add'>+(ie. in its "cbk" stage) it needs to delete the record from the list.</div><div class='add'>+</div><div class='add'>+If no interrupt happens, basically that's all to it - a list insertion</div><div class='add'>+and deletion.</div><div class='add'>+</div><div class='add'>+However, if an interrupt comes for the fop, the interrupt FUSE request</div><div class='add'>+will carry the data identifying an ongoing fop (that is, its `unique`),</div><div class='add'>+and based on that, the interrupt record will be looked up in the list, and</div><div class='add'>+the specific interrupt handler (a member of the interrupt record) will be</div><div class='add'>+called.</div><div class='add'>+</div><div class='add'>+Usually the fop needs to share some data with the interrupt handler to</div><div class='add'>+enable it to perform its task (also shared via the interrupt record).</div><div class='add'>+The interrupt API offers two approaches to manage shared data:</div><div class='add'>+- _Async or reference-counting strategy_: from the point on when the interrupt</div><div class='add'>+  record is inserted to the list, it's owned jointly by the regular fop and</div><div class='add'>+  the prospective interrupt handler. Both of them need to check before they</div><div class='add'>+  return if the other is still holding a reference; if not, then they are</div><div class='add'>+  responsible for reclaiming the shared data.</div><div class='add'>+- _Sync or borrow strategy_: the interrupt handler is considered a borrower</div><div class='add'>+  of the shared data. The interrupt handler should not reclaim the shared</div><div class='add'>+  data. The fop will wait for the interrupt handler to finish (ie., the borrow</div><div class='add'>+  to be returned), then it has to reclaim the shared data.</div><div class='add'>+</div><div class='add'>+The user of the interrupt API need to call the following functions to</div><div class='add'>+instrument this control flow:</div><div class='add'>+- `fuse_interrupt_record_insert()` in the fop to insert the interrupt record to</div><div class='add'>+   the list;</div><div class='add'>+- `fuse_interrupt_finish_fop()`in the fop (cbk) and</div><div class='add'>+- `fuse_interrupt_finish_interrupt()`in the interrupt handler</div><div class='add'>+</div><div class='add'>+to perform needed synchronization at the end their tenure. The data management</div><div class='add'>+strategies are implemented by the `fuse_interrupt_finish_*()` functions (which</div><div class='add'>+have an argument to specify which strategy to use); these routines take care</div><div class='add'>+of freeing the interrupt record itself, while the reclamation of the shared data</div><div class='add'>+is left to the API user.</div><div class='add'>+</div><div class='add'>+### Usage</div><div class='add'>+</div><div class='add'>+A given FUSE fop can be enabled to handle interrupts via the following</div><div class='add'>+steps:</div><div class='add'>+</div><div class='add'>+- Define a handler function (of type `fuse_interrupt_handler_t`).</div><div class='add'>+  It should implement the interrupt handling logic and in the end</div><div class='add'>+  call (directly or as async callback) `fuse_interrupt_finish_interrupt()`.</div><div class='add'>+  The `intstat` argument to `fuse_interrupt_finish_interrupt` should be</div><div class='add'>+  either `INTERRUPT_SQUELCHED` or `INTERRUPT_HANDLED`.</div><div class='add'>+    - `INTERRUPT_SQUELCHED` means that the interrupt could not be delivered</div><div class='add'>+      and the fop is going on uninterrupted.</div><div class='add'>+    - `INTERRUPT_HANDLED` means that the interrupt was actually handled. In</div><div class='add'>+      this case the fop will be answered from interrupt context with errno</div><div class='add'>+      `EINTR` (that is, the fop should not send a response to the kernel).</div><div class='add'>+</div><div class='add'>+  (the enum `fuse_interrupt_state` includes further members, which are reserved</div><div class='add'>+  for internal use).</div><div class='add'>+</div><div class='add'>+  We return to the `sync` and `datap` arguments later.</div><div class='add'>+- In the `fuse_&lt;FOP&gt;` function create an interrupt record using</div><div class='add'>+  `fuse_interrupt_record_new()`, passing the incoming `fuse_in_header` and</div><div class='add'>+  the above handler function to it.</div><div class='add'>+    - Arbitrary further data can be referred to via the `data` member of the</div><div class='add'>+      interrupt record that is to be passed on from fop context to</div><div class='add'>+      interrupt context.</div><div class='add'>+- When it's set up, pass the interrupt record to</div><div class='add'>+  `fuse_interrupt_record_insert()`.</div><div class='add'>+- In `fuse_&lt;FOP&gt;_cbk` call `fuse_interrupt_finish_fop()`.</div><div class='add'>+    - `fuse_interrupt_finish_fop()` returns a Boolean according to whether the</div><div class='add'>+      interrupt was handled. If it was, then the FUSE request is already</div><div class='add'>+      answered and the stack gets destroyed in `fuse_interrupt_finish_fop` so</div><div class='add'>+      `fuse_&lt;FOP&gt;_cbk()` can just return (zero). Otherwise follow the standard</div><div class='add'>+      cbk logic (answer the FUSE request and destroy the stack -- these are</div><div class='add'>+      typically accomplished by `fuse_err_cbk()`).</div><div class='add'>+- The last two argument of `fuse_interrupt_finish_fop()` and</div><div class='add'>+  `fuse_interrupt_finish_interrupt()` are `gf_boolean_t sync` and</div><div class='add'>+  `void **datap`.</div><div class='add'>+    - `sync` represents the strategy for freeing the interrupt record. The</div><div class='add'>+      interrupt handler and the fop handler are in race to get at the interrupt</div><div class='add'>+      record first (interrupt handler for purposes of doing the interrupt</div><div class='add'>+      handling, fop handler for purposes of deactivating the interrupt record</div><div class='add'>+      upon completion of the fop handling).</div><div class='add'>+        - If `sync` is true, then the fop handler will wait for the interrupt</div><div class='add'>+          handler to finish and it takes care of freeing.</div><div class='add'>+        - If `sync` is false, the loser of the above race will perform freeing.</div><div class='add'>+</div><div class='add'>+      Freeing is done within the respective interrupt finish routines, except</div><div class='add'>+      for the `data` field of the interrupt record; with respect to that, see</div><div class='add'>+      the discussion of the `datap` parameter below. The strategy has to be</div><div class='add'>+      consensual, that is, `fuse_interrupt_finish_fop()` and</div><div class='add'>+      `fuse_interrupt_finish_interrupt()` must pass the same value for `sync`.</div><div class='add'>+      If dismantling the resources associated with the interrupt record is</div><div class='add'>+      simple, `sync = _gf_false` is the suggested choice; `sync = _gf_true` can</div><div class='add'>+      be useful in the opposite case, when dismantling those resources would</div><div class='add'>+      be inconvenient to implement in two places or to enact in non-fop context.</div><div class='add'>+    - If `datap` is `NULL`, the `data` member of the interrupt record will be</div><div class='add'>+      freed within the interrupt finish routine.  If it points to a valid</div><div class='add'>+      `void *` pointer, and if caller is doing the cleanup (see `sync` above),</div><div class='add'>+      then that pointer will be directed to the `data` member of the interrupt</div><div class='add'>+      record and it's up to the caller what it's doing with it.</div><div class='add'>+        - If `sync` is true, interrupt handler can use `datap = NULL`, and</div><div class='add'>+          fop handler will have `datap` point to a valid pointer.</div><div class='add'>+        - If `sync` is false, and handlers pass a pointer to a pointer for</div><div class='add'>+          `datap`, they should check if the pointed pointer is NULL before</div><div class='add'>+          attempting to deal with the data.</div><div class='add'>+</div><div class='add'>+### FUSE answer for the interrupted fop</div><div class='add'>+</div><div class='add'>+The kernel acknowledges a successful interruption for a given FUSE request</div><div class='add'>+if the filesystem daemon answers it with errno EINTR; upon that, the syscall</div><div class='add'>+which induced the request will be abruptly terminated with an interrupt, rather</div><div class='add'>+than returning a value.</div><div class='add'>+</div><div class='add'>+In glusterfs, this can be arranged in two ways.</div><div class='add'>+</div><div class='add'>+- If the interrupt handler wins the race for the interrupt record, ie.</div><div class='add'>+  `fuse_interrupt_finish_fop()` returns true to `fuse_&lt;FOP&gt;_cbk()`, then, as</div><div class='add'>+  said above, `fuse_&lt;FOP&gt;_cbk()` does not need to answer the FUSE request.</div><div class='add'>+  That's because then the interrupt handler will take care about answering</div><div class='add'>+  it (with errno EINTR).</div><div class='add'>+- If `fuse_interrupt_finish_fop()` returns false to `fuse_&lt;FOP&gt;_cbk()`, then</div><div class='add'>+  this return value does not inform the fop handler whether there was an interrupt</div><div class='add'>+  or not. This return value occurs both when fop handler won the race for the</div><div class='add'>+  interrupt record against the interrupt handler, and when there was no interrupt</div><div class='add'>+  at all.</div><div class='add'>+</div><div class='add'>+  However, the internal logic of the fop handler might detect from other</div><div class='add'>+  circumstances that an interrupt was delivered. For example, the fop handler</div><div class='add'>+  might be sleeping, waiting for some data to arrive, so that a premature</div><div class='add'>+  wakeup (with no data present) occurs if the interrupt handler intervenes. In</div><div class='add'>+  such cases it's the responsibility of the fop handler to reply the FUSE</div><div class='add'>+  request with errro EINTR.</div><div class='head'>diff --git a/doc/developer-guide/gfapi-symbol-versions.md b/doc/developer-guide/gfapi-symbol-versions.md<br/>new file mode 100644<br/>index 00000000000..e4f4fe9f052<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/doc/developer-guide/gfapi-symbol-versions.md?id=d1d7a6f35c816822fab51c820e25023863c239c1'>doc/developer-guide/gfapi-symbol-versions.md</a></div><div class='hunk'>@@ -0,0 +1,270 @@</div><div class='add'>+</div><div class='add'>+## Symbol Versions and SO_NAMEs</div><div class='add'>+</div><div class='add'>+  In general, adding new APIs to a shared library does not require that</div><div class='add'>+symbol versions be used or the the SO_NAME be "bumped." These actions</div><div class='add'>+are usually reserved for when a major change is introduced, e.g. many</div><div class='add'>+APIs change or a signficant change in the functionality occurs.</div><div class='add'>+</div><div class='add'>+  Over the normal lifetime of a When a new API is added, the library is</div><div class='add'>+recompiled, consumers of the new API are able to do so, and existing,</div><div class='add'>+legacy consumers of the original API continue as before. If by some</div><div class='add'>+chance an old copy of the library is installed on a system, it's unlikely</div><div class='add'>+that most applications will be affected. New applications that use the</div><div class='add'>+new API will incur a run-time error terminate.</div><div class='add'>+</div><div class='add'>+  Bumping the SO_NAME, i.e. changing the shared lib's file name, e.g.</div><div class='add'>+from libfoo.so.0 to libfoo.so.1, which also changes the ELF SO_NAME</div><div class='add'>+attribute inside the file, works a little differently. libfoo.so.0</div><div class='add'>+contains only the old APIs. libfoo.so.1 contains both the old and new</div><div class='add'>+APIs. Legacy software that was linked with libfoo.so.0 continues to work</div><div class='add'>+as libfoo.so.0 is usually left installed on the system. New software that</div><div class='add'>+uses the new APIs is linked with libfoo.so.1, and works as long as</div><div class='add'>+long as libfoo.so.1 is installed on the system. Accidentally (re)installing</div><div class='add'>+libfoo.so.0 doesn't break new software as long as reinstalling doesn't</div><div class='add'>+erase libfoo.so.1.</div><div class='add'>+</div><div class='add'>+  Using symbol versions is somewhere in the middle. The shared library</div><div class='add'>+file remains libfoo.so.0 forever. Legacy APIs may or may not have an</div><div class='add'>+associated symbol version. New APIs may or may not have an associated</div><div class='add'>+symbol version either. In general symbol versions are reserved for APIs</div><div class='add'>+that have changed. Either the function's signature has changed, i.e. the</div><div class='add'>+return time or the number of paramaters, and/or the parameter types have</div><div class='add'>+changed. Another reason for using symbol versions on an API is when the</div><div class='add'>+behaviour or functionality of the API changes dramatically. As with a</div><div class='add'>+library that doesn't use versioned symbols, old and new applications</div><div class='add'>+either find or don't find the versioned symbols they need. If the versioned</div><div class='add'>+symbol doesn't exist in the installed library, the application incurs a</div><div class='add'>+run-time error and terminates.</div><div class='add'>+</div><div class='add'>+  GlusterFS wanted to keep tight control over the APIs in libgfapi.</div><div class='add'>+Originally bumping the SO_NAME was considered, and GlusterFS-3.6.0 was</div><div class='add'>+released with libgfapi.so.7. Not only was "7" a mistake (it should have</div><div class='add'>+been "6"), but it was quickly pointed out that many dependent packages</div><div class='add'>+that use libgfapi would be forced to be recompiled/relinked. Thus no</div><div class='add'>+packages of 3.6.0 were ever released and 3.6.1 was quickly released with</div><div class='add'>+libgfapi.so.0, but with symbol versions. There's no strong technical</div><div class='add'>+reason for either; the APIs have not changed, only new APIs have been</div><div class='add'>+added. It's merely being done in anticipation that some APIs might change</div><div class='add'>+sometime in the future.</div><div class='add'>+</div><div class='add'>+  Enough about that now, let's get into the nitty grittyâ€”â€”</div><div class='add'>+</div><div class='add'>+## Adding new APIs</div><div class='add'>+</div><div class='add'>+### Adding a public API.</div><div class='add'>+</div><div class='add'>+  This is the default, and the easiest thing to do. Public APIs have</div><div class='add'>+declarations in either glfs.h, glfs-handles.h, or, at your discretion,</div><div class='add'>+in a new header file intended for consumption by other developers.</div><div class='add'>+</div><div class='add'>+Here's what you need to do to add a new public API:</div><div class='add'>+</div><div class='add'>++ Write the declaration, e.g. in glfs.h:</div><div class='add'>+</div><div class='add'>+```C</div><div class='add'>+    int glfs_dtrt (const char *volname, void *stuff) __THROW</div><div class='add'>+```</div><div class='add'>+</div><div class='add'>++ Write the definition, e.g. in glfs-dtrt.c:</div><div class='add'>+</div><div class='add'>+```C</div><div class='add'>+   int</div><div class='add'>+   pub_glfs_dtrt (const char *volname, void *stuff)</div><div class='add'>+   {</div><div class='add'>+       ...</div><div class='add'>+       return 0;</div><div class='add'>+   }</div><div class='add'>+```</div><div class='add'>+</div><div class='add'>++ Add the symbol version magic for ELF, gnu toolchain to the definition.</div><div class='add'>+</div><div class='add'>+  following the definition of your new function in glfs-dtrtops.c, add a</div><div class='add'>+  line like this:</div><div class='add'>+</div><div class='add'>+```C</div><div class='add'>+  GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_dtrt, 3.7.0)</div><div class='add'>+```</div><div class='add'>+</div><div class='add'>+  The whole thing should look like:</div><div class='add'>+</div><div class='add'>+```C</div><div class='add'>+      int</div><div class='add'>+      pub_glfs_dtrt (const char *volname, void *stuff)</div><div class='add'>+      {</div><div class='add'>+           ...</div><div class='add'>+      }</div><div class='add'>+      GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_dtrt, 3.7.0);</div><div class='add'>+```</div><div class='add'>+</div><div class='add'>+  In this example, 3.7.0 refers to the Version the symbol will first</div><div class='add'>+  appear in. There's nothing magic about it, it's just a string token.</div><div class='add'>+  The current versions we have are 3.4.0, 3.4.2, 3.5.0, 3.5.1, and 3.6.0.</div><div class='add'>+  They are to be considered locked or closed. You can not, must not add</div><div class='add'>+  any new APIs and use these versions. Most new APIs will use 3.7.0. If</div><div class='add'>+  you add a new API appearing in 3.6.2 (and mainline) then you would use</div><div class='add'>+  3.6.2.</div><div class='add'>+</div><div class='add'>++ Add the symbol version magic for OS X to the declaration.</div><div class='add'>+</div><div class='add'>+  following the declaration in glfs.h, add a line like this:</div><div class='add'>+</div><div class='add'>+```C</div><div class='add'>+  GFAPI_PUBLIC(glfs_dtrt, 3.7.0)</div><div class='add'>+```</div><div class='add'>+</div><div class='add'>+  The whole thing should look like:</div><div class='add'>+</div><div class='add'>+```C</div><div class='add'>+     int glfs_dtrt (const char *volname, void *stuff) __THROW</div><div class='add'>+              GFAPI_PUBLIC(glfs_dtrt, 3.7.0);</div><div class='add'>+```</div><div class='add'>+</div><div class='add'>+  The version here must match the version associated with the definition.</div><div class='add'>+</div><div class='add'>++ Add the new API to the ELF, gnu toolchain link map file, gfapi.map</div><div class='add'>+</div><div class='add'>+  Most new public APIs will probably be added to a new section that</div><div class='add'>+  looks like this:</div><div class='add'>+</div><div class='add'>+```</div><div class='add'>+  GFAPI_3.7.0 {</div><div class='add'>+          global:</div><div class='add'>+                  glfs_dtrt;</div><div class='add'>+  } GFAPI_PRIVATE_3.7.0;</div><div class='add'>+```</div><div class='add'>+</div><div class='add'>+  if you're adding your new API to, e.g. 3.6.2, it'll look like this:</div><div class='add'>+</div><div class='add'>+```</div><div class='add'>+  GFAPI_3.6.2 {</div><div class='add'>+          global:</div><div class='add'>+                  glfs_dtrt;</div><div class='add'>+  } GFAPI_3.6.0;</div><div class='add'>+```</div><div class='add'>+</div><div class='add'>+  and you must change the</div><div class='add'>+```</div><div class='add'>+    GFAPI_PRIVATE_3.7.0 { ...} GFAPI_3.6.0;</div><div class='add'>+```</div><div class='add'>+  section to:</div><div class='add'>+```</div><div class='add'>+    GFAPI_PRIVATE_3.7.0 { ...} GFAPI_3.6.2;</div><div class='add'>+```</div><div class='add'>+</div><div class='add'>++ Add the new API to the OS X alias list file, gfapi.aliases.</div><div class='add'>+</div><div class='add'>+  Most new APIs will use a line that looks like this:</div><div class='add'>+</div><div class='add'>+```C</div><div class='add'>+ _pub_glfs_dtrt _glfs_dtrt$GFAPI_3.7.0</div><div class='add'>+```</div><div class='add'>+</div><div class='add'>+  if you're adding your new API to, e.g. 3.6.2, it'll look like this:</div><div class='add'>+</div><div class='add'>+```C</div><div class='add'>+ _pub_glfs_dtrt _glfs_dtrt$GFAPI_3.6.2</div><div class='add'>+```</div><div class='add'>+</div><div class='add'>+And that's it.</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+### Adding a private API.</div><div class='add'>+</div><div class='add'>+  If you're thinking about adding a private API that isn't declared in</div><div class='add'>+one of the header files, then you should seriously rethink what you're</div><div class='add'>+doing and figure out how to put it in libglusterfs instead.</div><div class='add'>+</div><div class='add'>+If that hasn't convinced you, follow the instructions above, but use the</div><div class='add'>+_PRIVATE versions of macros, symbol versions, and aliases. If you're 1337</div><div class='add'>+enough to ignore this advice, then you're 1337 enough to figure out how</div><div class='add'>+to do it.</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+## Changing an API.</div><div class='add'>+</div><div class='add'>+### Changing a public API.</div><div class='add'>+</div><div class='add'>+  There are two ways an API might change, 1) its signature has changed, or</div><div class='add'>+2) its new functionality or behavior is substantially different than the</div><div class='add'>+old. An APIs signature consists of the function return type, and the number</div><div class='add'>+and/or type of its parameters. E.g. the original API:</div><div class='add'>+</div><div class='add'>+```C</div><div class='add'>+   int glfs_dtrt (const char *volname, void *stuff);</div><div class='add'>+```</div><div class='add'>+</div><div class='add'>+and the changed API:</div><div class='add'>+</div><div class='add'>+```C</div><div class='add'>+   void *glfs_dtrt (const char *volname, glfs_t *ctx, void *stuff);</div><div class='add'>+```</div><div class='add'>+</div><div class='add'>+  One way to avoid a change like this, and which is preferable in many</div><div class='add'>+ways, is to leave the legacy glfs_dtrt() function alone, document it as</div><div class='add'>+deprecated, and simply add a new API, e.g. glfs_dtrt2(). Practically</div><div class='add'>+speaking, that's effectively what we'll be doing anyway, the difference</div><div class='add'>+is only that we'll use a versioned symbol to do it.</div><div class='add'>+</div><div class='add'>+  On the assumption that adding a new API is undesirable for some reason,</div><div class='add'>+perhaps the use of glfs_gnu() is just so pervasive that we really don't</div><div class='add'>+want to add glfs_gnu2().</div><div class='add'>+</div><div class='add'>++ change the declaration in glfs.h:</div><div class='add'>+</div><div class='add'>+```C</div><div class='add'>+  glfs_t *glfs_gnu (const char *volname, void *stuff) __THROW</div><div class='add'>+          GFAPI_PUBLIC(glfs_gnu, 3.7.0);</div><div class='add'>+````</div><div class='add'>+</div><div class='add'>+Note that there is only the single, new declaration.</div><div class='add'>+</div><div class='add'>++ change the old definition of glfs_gnu() in glfs.c:</div><div class='add'>+</div><div class='add'>+```C</div><div class='add'>+    struct glfs *</div><div class='add'>+    pub_glfs_gnu340 (const char * volname)</div><div class='add'>+    {</div><div class='add'>+        ...</div><div class='add'>+    }</div><div class='add'>+    GFAPI_SYMVER_PUBLIC(glfs_gnu340, glfs_gnu, 3.4.0);</div><div class='add'>+```</div><div class='add'>+</div><div class='add'>++ create the new definition of glfs_gnu in glfs.c:</div><div class='add'>+</div><div class='add'>+```C</div><div class='add'>+    struct glfs *</div><div class='add'>+    pub_glfs_gnu (const char * volname, void *stuff)</div><div class='add'>+    {</div><div class='add'>+        ...</div><div class='add'>+    }</div><div class='add'>+    GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_gnu, 3.7.0);</div><div class='add'>+```</div><div class='add'>+</div><div class='add'>++ Add the new API to the ELF, gnu toolchain link map file, gfapi.map</div><div class='add'>+</div><div class='add'>+```</div><div class='add'>+  GFAPI_3.7.0 {</div><div class='add'>+          global:</div><div class='add'>+                  glfs_gnu;</div><div class='add'>+  } GFAPI_PRIVATE_3.7.0;</div><div class='add'>+```</div><div class='add'>+</div><div class='add'>++ Update the OS X alias list file, gfapi.aliases, for both versions:</div><div class='add'>+</div><div class='add'>+Change the old line:</div><div class='add'>+```C</div><div class='add'>+  _pub_glfs_gnu _glfs_gnu$GFAPI_3.4.0</div><div class='add'>+```</div><div class='add'>+to:</div><div class='add'>+```C</div><div class='add'>+  _pub_glfs_gnu340 _glfs_gnu$GFAPI_3.4.0</div><div class='add'>+```</div><div class='add'>+</div><div class='add'>+Add a new line:</div><div class='add'>+```C</div><div class='add'>+  _pub_glfs_gnu _glfs_gnu$GFAPI_3.7.0</div><div class='add'>+```</div><div class='add'>+</div><div class='add'>++ Lastly, change all gfapi internal calls glfs_gnu to the new API.</div><div class='add'>+</div><div class='head'>diff --git a/doc/developer-guide/identifying-resource-leaks.md b/doc/developer-guide/identifying-resource-leaks.md<br/>new file mode 100644<br/>index 00000000000..950cae79b0a<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/doc/developer-guide/identifying-resource-leaks.md?id=d1d7a6f35c816822fab51c820e25023863c239c1'>doc/developer-guide/identifying-resource-leaks.md</a></div><div class='hunk'>@@ -0,0 +1,200 @@</div><div class='add'>+# Identifying Resource Leaks</div><div class='add'>+</div><div class='add'>+Like most other pieces of software, GlusterFS is not perfect in how it manages</div><div class='add'>+its resources like memory, threads and the like. Gluster developers try hard to</div><div class='add'>+prevent leaking resources but releasing and unallocating the used structures.</div><div class='add'>+Unfortunately every now and then some resource leaks are unintentionally added.</div><div class='add'>+</div><div class='add'>+This document tries to explain a few helpful tricks to identify resource leaks</div><div class='add'>+so that they can be addressed.</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+## Debug Builds</div><div class='add'>+</div><div class='add'>+There are certain techniques used in GlusterFS that make it difficult to use</div><div class='add'>+tools like Valgrind for memory leak detection. There are some build options</div><div class='add'>+that make it more practical to use Valgrind and other tools. When running</div><div class='add'>+Valgrind, it is important to have GlusterFS builds that contain the</div><div class='add'>+debuginfo/symbols. Some distributions (try to) strip the debuginfo to get</div><div class='add'>+smaller executables. Fedora and RHEL based distributions have sub-packages</div><div class='add'>+called ...-debuginfo that need to be installed for symbol resolving.</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+### Memory Pools</div><div class='add'>+</div><div class='add'>+By using memory pools, there are no allocation/freeing of single structures</div><div class='add'>+needed. This improves performance, but also makes it impossible to track the</div><div class='add'>+allocation and freeing of srtuctures.</div><div class='add'>+</div><div class='add'>+It is possible to disable the use of memory pools, and use standard `malloc()`</div><div class='add'>+and `free()` functions provided by the C library. Valgrind is then able to</div><div class='add'>+track the allocated areas and verify if they have been free'd. In order to</div><div class='add'>+disable memory pools, the Gluster sources needs to be configured with the</div><div class='add'>+`--enable-debug` option:</div><div class='add'>+</div><div class='add'>+```shell</div><div class='add'>+./configure --enable-debug</div><div class='add'>+```</div><div class='add'>+</div><div class='add'>+When building RPMs, the `.spec` handles the `--with=debug` option too:</div><div class='add'>+</div><div class='add'>+```shell</div><div class='add'>+make dist</div><div class='add'>+rpmbuild -ta --with=debug glusterfs-....tar.gz</div><div class='add'>+```</div><div class='add'>+</div><div class='add'>+### Dynamically Loaded xlators</div><div class='add'>+</div><div class='add'>+Valgrind tracks the call chain of functions that do memory allocations. The</div><div class='add'>+addresses of the functions are stored and before Valgrind exits the addresses</div><div class='add'>+are resolved into human readable function names and offsets (line numbers in</div><div class='add'>+source files). Because Gluster loads xlators dynamically, and unloads then</div><div class='add'>+before exiting, Valgrind is not able to resolve the function addresses into</div><div class='add'>+symbols anymore. Whenever this happend, Valgrind shows `???` in the output,</div><div class='add'>+like</div><div class='add'>+</div><div class='add'>+```</div><div class='add'>+  ==25170== 344 bytes in 1 blocks are definitely lost in loss record 233 of 324</div><div class='add'>+  ==25170==    at 0x4C29975: calloc (vg_replace_malloc.c:711)</div><div class='add'>+  ==25170==    by 0x52C7C0B: __gf_calloc (mem-pool.c:117)</div><div class='add'>+  ==25170==    by 0x12B0638A: ???</div><div class='add'>+  ==25170==    by 0x528FCE6: __xlator_init (xlator.c:472)</div><div class='add'>+  ==25170==    by 0x528FE16: xlator_init (xlator.c:498)</div><div class='add'>+  ...</div><div class='add'>+```</div><div class='add'>+</div><div class='add'>+These `???` can be prevented by not calling `dlclose()` for unloading the</div><div class='add'>+xlator. This will cause a small leak of the handle that was returned with</div><div class='add'>+`dlopen()`, but for improved debugging this can be acceptible. For this and</div><div class='add'>+other Valgrind features, a `--enable-valgrind` option is available to</div><div class='add'>+`./configure`. When GlusterFS is built with this option, Valgrind will be able</div><div class='add'>+to resolve the symbol names of the functions that do memory allocations inside</div><div class='add'>+xlators.</div><div class='add'>+</div><div class='add'>+```shell</div><div class='add'>+./configure --enable-valgrind</div><div class='add'>+```</div><div class='add'>+</div><div class='add'>+When building RPMs, the `.spec` handles the `--with=valgrind` option too:</div><div class='add'>+</div><div class='add'>+```shell</div><div class='add'>+make dist</div><div class='add'>+rpmbuild -ta --with=valgrind glusterfs-....tar.gz</div><div class='add'>+```</div><div class='add'>+</div><div class='add'>+## Running Valgrind against a single xlator</div><div class='add'>+</div><div class='add'>+Debugging a single xlator is not trivial. But there are some tools to make it</div><div class='add'>+easier. The `sink` xlator does not do any memory allocations itself, but</div><div class='add'>+contains just enough functionality to mount a volume with only the `sink`</div><div class='add'>+xlator. There is a little gfapi application under `tests/basic/gfapi/` in the</div><div class='add'>+GlusterFS sources that can be used to run only gfapi and the core GlusterFS</div><div class='add'>+infrastructure with the `sink` xlator. By extending the `.vol` file to load</div><div class='add'>+more xlators, each xlator can be debugged pretty much separately (as long as</div><div class='add'>+the xlators have no dependencies on each other). A basic Valgrind run with the</div><div class='add'>+suitable configure options looks like this:</div><div class='add'>+</div><div class='add'>+```shell</div><div class='add'>+./autogen.sh</div><div class='add'>+./configure --enable-debug --enable-valgrind</div><div class='add'>+make &amp;&amp; make install</div><div class='add'>+cd tests/basic/gfapi/</div><div class='add'>+make gfapi-load-volfile</div><div class='add'>+valgrind ./gfapi-load-volfile sink.vol</div><div class='add'>+```</div><div class='add'>+</div><div class='add'>+Combined with other very useful options to Valgrind, the following execution</div><div class='add'>+shows many more useful details:</div><div class='add'>+</div><div class='add'>+```shell</div><div class='add'>+valgrind \</div><div class='add'>+        --fullpath-after= --leak-check=full --show-leak-kinds=all \</div><div class='add'>+        ./gfapi-load-volfile sink.vol</div><div class='add'>+```</div><div class='add'>+</div><div class='add'>+Note that the `--fullpath-after=` option is left empty, this makes Valgrind</div><div class='add'>+print the full path and filename that contains the functions:</div><div class='add'>+</div><div class='add'>+```</div><div class='add'>+==2450== 80 bytes in 1 blocks are definitely lost in loss record 8 of 60</div><div class='add'>+==2450==    at 0x4C29975: calloc (/builddir/build/BUILD/valgrind-3.11.0/coregrind/m_replacemalloc/vg_replace_malloc.c:711)</div><div class='add'>+==2450==    by 0x52C6F73: __gf_calloc (/usr/src/debug/glusterfs-3.11dev/libglusterfs/src/mem-pool.c:117)</div><div class='add'>+==2450==    by 0x12F10CDA: init (/usr/src/debug/glusterfs-3.11dev/xlators/meta/src/meta.c:231)</div><div class='add'>+==2450==    by 0x528EFD5: __xlator_init (/usr/src/debug/glusterfs-3.11dev/libglusterfs/src/xlator.c:472)</div><div class='add'>+==2450==    by 0x528F105: xlator_init (/usr/src/debug/glusterfs-3.11dev/libglusterfs/src/xlator.c:498)</div><div class='add'>+==2450==    by 0x52D9D8B: glusterfs_graph_init (/usr/src/debug/glusterfs-3.11dev/libglusterfs/src/graph.c:321)</div><div class='add'>+...</div><div class='add'>+```</div><div class='add'>+</div><div class='add'>+In the above example, the `init` function in `xlators/meta/src/meta.c` does a</div><div class='add'>+memory allocation on line 231. This memory is never free'd again, and hence</div><div class='add'>+Valgrind logs this call stack. When looking in the code, it seems that the</div><div class='add'>+allocation of `priv` is assigned to the `this-&gt;private` member of the</div><div class='add'>+`xlator_t` structure. Because the allocation is done in `init()`, free'ing is</div><div class='add'>+expected to happen in `fini()`. Both functions are shown below, with the</div><div class='add'>+inclusion of the empty `fini()`:</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+```</div><div class='add'>+226 int</div><div class='add'>+227 init (xlator_t *this)</div><div class='add'>+228 {</div><div class='add'>+229         meta_priv_t *priv = NULL;</div><div class='add'>+230 </div><div class='add'>+231         priv = GF_CALLOC (sizeof(*priv), 1, gf_meta_mt_priv_t);</div><div class='add'>+232         if (!priv)</div><div class='add'>+233                 return -1;</div><div class='add'>+234 </div><div class='add'>+235         GF_OPTION_INIT ("meta-dir-name", priv-&gt;meta_dir_name, str, out);</div><div class='add'>+236 </div><div class='add'>+237         this-&gt;private = priv;</div><div class='add'>+238 out:</div><div class='add'>+239         return 0;</div><div class='add'>+240 }</div><div class='add'>+241 </div><div class='add'>+242 </div><div class='add'>+243 int</div><div class='add'>+244 fini (xlator_t *this)</div><div class='add'>+245 {</div><div class='add'>+246         return 0;</div><div class='add'>+247 }</div><div class='add'>+```</div><div class='add'>+</div><div class='add'>+In this case, the resource leak can be addressed by adding a single line to the</div><div class='add'>+`fini()` function:</div><div class='add'>+</div><div class='add'>+```</div><div class='add'>+243 int</div><div class='add'>+244 fini (xlator_t *this)</div><div class='add'>+245 {</div><div class='add'>+246         GF_FREE (this-&gt;private);</div><div class='add'>+247         return 0;</div><div class='add'>+248 }</div><div class='add'>+```</div><div class='add'>+</div><div class='add'>+Running the same Valgrind command and comparing the output will show that the</div><div class='add'>+memory leak in `xlators/meta/src/meta.c:init` is not reported anymore.</div><div class='add'>+</div><div class='add'>+### Running DRD, the Valgrind thread error detector</div><div class='add'>+</div><div class='add'>+When configuring GlusterFS with:</div><div class='add'>+</div><div class='add'>+```shell</div><div class='add'>+./configure --enable-valgrind</div><div class='add'>+```</div><div class='add'>+</div><div class='add'>+the default Valgrind tool (Memcheck) is enabled. But it's also possble to select</div><div class='add'>+one of Memcheck or DRD by using:</div><div class='add'>+</div><div class='add'>+```shell</div><div class='add'>+./configure --enable-valgrind=memcheck</div><div class='add'>+```</div><div class='add'>+</div><div class='add'>+or:</div><div class='add'>+</div><div class='add'>+```shell</div><div class='add'>+./configure --enable-valgrind=drd</div><div class='add'>+```</div><div class='add'>+</div><div class='add'>+respectively. When using DRD, it's recommended to consult</div><div class='add'>+https://valgrind.org/docs/manual/drd-manual.html before running.</div><div class='head'>diff --git a/doc/developer-guide/logging-guidelines.md b/doc/developer-guide/logging-guidelines.md<br/>new file mode 100644<br/>index 00000000000..0e6b2588535<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/doc/developer-guide/logging-guidelines.md?id=d1d7a6f35c816822fab51c820e25023863c239c1'>doc/developer-guide/logging-guidelines.md</a></div><div class='hunk'>@@ -0,0 +1,132 @@</div><div class='add'>+Guidelines on using the logging framework within a component</div><div class='add'>+============================================================</div><div class='add'>+Gluster library libglusterfs.so provides message logging abstractions that</div><div class='add'>+are intended to be used across all code/components within gluster.</div><div class='add'>+</div><div class='add'>+There could be potentially 2 major cases how the logging infrastructure is</div><div class='add'>+used,</div><div class='add'>+  - A new gluster service daemon or end point is created</div><div class='add'>+    - The service daemon infrastructure itself initlializes the logging</div><div class='add'>+    infrastructure (i.e calling gf_log_init and related set functions)</div><div class='add'>+      - See, glusterfsd.c:logging_init</div><div class='add'>+    - Alternatively there could be a case where an end point service (say</div><div class='add'>+    gfapi) may need to do the required initialization</div><div class='add'>+    - This document does not (yet?) cover guidelines for these cases. Best</div><div class='add'>+    bet would be to look at code in glusterfsd.c:logging_init (or equivalent)</div><div class='add'>+    in case a need arises and you reach this document.</div><div class='add'>+  - A new xlator or subcomponent is written as a part of the stack</div><div class='add'>+    - Primarily in this case, the consumer of the logging APIs would only</div><div class='add'>+    invoke an API to *log* a particular message at a certain severity</div><div class='add'>+    - This document elaborates on this use of the message logging framework</div><div class='add'>+    in this context</div><div class='add'>+</div><div class='add'>+There are 2 interfaces provided to log messages,</div><div class='add'>+1. The older gf_log* interface</div><div class='add'>+2. The newer gf_msg* interface</div><div class='add'>+</div><div class='add'>+1. Older _to_be_deprecated_ gf_log* interface</div><div class='add'>+  - Not much documentation is provided for this interface here, as these are</div><div class='add'>+  meant to be deprecated and all code should be moved to the newer gf_msg*</div><div class='add'>+  interface</div><div class='add'>+</div><div class='add'>+2. New gf_msg* interface</div><div class='add'>+  - The set of interfaces provided by gf_msg are,</div><div class='add'>+    - NOTE: It is best to consult logging.h for the latest interfaces, as</div><div class='add'>+    this document may get out of sync with the code</div><div class='add'>+</div><div class='add'>+    *gf_msg(dom, levl, errnum, msgid, fmt...)*</div><div class='add'>+      - Used predominantly to log a message above TRACE and DEBUG levels</div><div class='add'>+      - See further guidelines below</div><div class='add'>+</div><div class='add'>+    *gf_msg_debug(dom, errnum, fmt...)*</div><div class='add'>+    *gf_msg_trace(dom, errnum, fmt...)*</div><div class='add'>+      - Above are handy shortcuts for TRACE and DEBUG level messages</div><div class='add'>+      - See further guidelines below</div><div class='add'>+</div><div class='add'>+    *gf_msg_callingfn(dom, levl, errnum, msgid, fmt...)*</div><div class='add'>+      - Useful function when a backtrace to detect calling routines that</div><div class='add'>+      reached this execution point needs to be logged in addition to the</div><div class='add'>+      message</div><div class='add'>+      - This is very handy for framework libraries or code, as there could</div><div class='add'>+      be many callers to the same, and the real failure would need the call</div><div class='add'>+      stack to determine who the caller actually was</div><div class='add'>+      - A good example is the dict interfaces using this function to log who</div><div class='add'>+      called, when a particular error/warning needs to be displayed</div><div class='add'>+      - See further guidelines below</div><div class='add'>+</div><div class='add'>+    *gf_msg_plain(levl, fmt...)*</div><div class='add'>+    *gf_msg_plain_nomem(levl, msg)*</div><div class='add'>+    *gf_msg_vplain(levl, fmt, va)*</div><div class='add'>+    *gf_msg_backtrace_nomem*</div><div class='add'>+      - The above interfaces are provided to log messages without any typical</div><div class='add'>+      headers (like the time stamp, dom, errnum etc.). The primary users of</div><div class='add'>+      the above interfaces are, when printing the final graph, or printing</div><div class='add'>+      the configuration when a process is about dump core or abort, or</div><div class='add'>+      printing the backtrace when a process receives a critical signal</div><div class='add'>+      - These interfaces should not be used outside the scope of the users</div><div class='add'>+      above, unless you know what you are doing</div><div class='add'>+</div><div class='add'>+    *gf_msg_nomem(dom, levl, size)*</div><div class='add'>+      - Very crisp messages, throwing out file, function, line numbers, in</div><div class='add'>+      addition to the passed in size</div><div class='add'>+      - These are used in the memory allocation abstractions interfaces in</div><div class='add'>+      gluster, when the allocation fails (hence a no-mem log message, so that</div><div class='add'>+      further allocation is not attempted by the logging infrastructure)</div><div class='add'>+      - If you are contemplating using these, then you know why and how</div><div class='add'>+</div><div class='add'>+  - Guidelines for the various arguments to the interfaces</div><div class='add'>+    **dom**</div><div class='add'>+      - The domain from which this message appears, IOW for xlators it should</div><div class='add'>+      be the name of the xlator (as in this-&gt;name)</div><div class='add'>+</div><div class='add'>+      - The intention of this string is to distinguish from which</div><div class='add'>+      component/xlator the message is being printed</div><div class='add'>+</div><div class='add'>+      - This information can also be gleaned from the FILE:LINE:FUNCTION</div><div class='add'>+      information printed in the message anyway, but is retained to provide</div><div class='add'>+      backward compatability to the messages as seen by admins earlier</div><div class='add'>+</div><div class='add'>+    **levl**</div><div class='add'>+      - Consult logging.h:gf_loglevel_t for logging levels (they pretty much</div><div class='add'>+      map to syslog levels)</div><div class='add'>+</div><div class='add'>+    **errnum**</div><div class='add'>+      - errno should be passed in here, if available, 0 otherwise. This auto</div><div class='add'>+      enables the logging infrastructure to print (man 3) strerror form of the</div><div class='add'>+      same at the end of the message in a consistent format</div><div class='add'>+</div><div class='add'>+      - If any message is already adding the strerror as a parameter to the</div><div class='add'>+      message, it is suggested/encouraged to remove the same and pass it as</div><div class='add'>+      errnum</div><div class='add'>+</div><div class='add'>+      - The intention is that, if all messages did this using errnum and not</div><div class='add'>+      as a part of their own argument list, the output would look consistent</div><div class='add'>+      for the admin and cross component developers when reading logs</div><div class='add'>+</div><div class='add'>+    **msgid**</div><div class='add'>+      - This is a unique message ID per message (which now is more a message</div><div class='add'>+      ID per group of messages in the implementation)</div><div class='add'>+</div><div class='add'>+      - Rules for generating this ID can be found in dht-messages.h (it used</div><div class='add'>+      to be template-common-messages.h, but that template is not updated,</div><div class='add'>+      this comment should be changed once that is done) and glfs-message-id.h</div><div class='add'>+</div><div class='add'>+      - Every message that is *above* TRACE and DEBUG should get a message</div><div class='add'>+      ID, as this helps generating message catalogs that can help admins to</div><div class='add'>+      understand the context of messages better. Another intention is that</div><div class='add'>+      automated message parsers could detect a class of message IDs and send</div><div class='add'>+      out notifications on the same, rather than parse the message string</div><div class='add'>+      itself (which if it changes, the input to the parser has to change, etc.</div><div class='add'>+      and hence is better to retain message IDs)</div><div class='add'>+</div><div class='add'>+      - Ok so if intention is not yet clear, look at journald MESSAGE ID</div><div class='add'>+      motivation, as that coupled with ident/dom above is expected to provide</div><div class='add'>+      us with similar advantages</div><div class='add'>+</div><div class='add'>+      - Bottomline: Every message gets its own ID, in case a message is</div><div class='add'>+      *not* DEBUG or TRACE and still is developer centric, a generic message</div><div class='add'>+      ID per component *maybe* assigned to the same to provide ease of use</div><div class='add'>+      of the API</div><div class='add'>+</div><div class='add'>+    **fmt**</div><div class='add'>+      - As in format argument of (man 3) printf</div><div class='head'>diff --git a/doc/developer-guide/network_compression.md b/doc/developer-guide/network_compression.md<br/>new file mode 100644<br/>index 00000000000..1222a765276<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/doc/developer-guide/network_compression.md?id=d1d7a6f35c816822fab51c820e25023863c239c1'>doc/developer-guide/network_compression.md</a></div><div class='hunk'>@@ -0,0 +1,71 @@</div><div class='add'>+# On-Wire Compression + Decompression</div><div class='add'>+</div><div class='add'>+The 'compression translator' compresses and decompresses data in-flight</div><div class='add'>+between client and bricks.</div><div class='add'>+</div><div class='add'>+### Working</div><div class='add'>+When a writev call occurs, the client compresses the data before sending it to</div><div class='add'>+brick. On the brick, compressed data is decompressed. Similarly, when a readv</div><div class='add'>+call occurs, the brick compresses the data before sending it to client. On the</div><div class='add'>+client, the compressed data is decompressed. Thus, the amount of data sent over</div><div class='add'>+the wire is minimized. Compression/Decompression is done using Zlib library.</div><div class='add'>+</div><div class='add'>+During normal operation, this is the format of data sent over wire:</div><div class='add'>+</div><div class='add'>+~~~</div><div class='add'>+&lt;compressed-data&gt; + trailer(8 bytes)</div><div class='add'>+~~~</div><div class='add'>+</div><div class='add'>+The trailer contains the CRC32 checksum and length of original uncompressed</div><div class='add'>+data. This is used for validation.</div><div class='add'>+</div><div class='add'>+### Usage</div><div class='add'>+</div><div class='add'>+Turning on compression xlator:</div><div class='add'>+</div><div class='add'>+~~~</div><div class='add'>+gluster volume set &lt;vol_name&gt; network.compression on</div><div class='add'>+~~~</div><div class='add'>+</div><div class='add'>+### Configurable parameters (optional)</div><div class='add'>+</div><div class='add'>+**Compression level**</div><div class='add'>+~~~</div><div class='add'>+gluster volume set &lt;vol_name&gt; network.compression.compression-level 8</div><div class='add'>+~~~</div><div class='add'>+</div><div class='add'>+~~~</div><div class='add'>+ 0  : no compression</div><div class='add'>+ 1  : best speed</div><div class='add'>+ 9  : best compression</div><div class='add'>+-1  : default compression</div><div class='add'>+~~~</div><div class='add'>+</div><div class='add'>+**Minimum file size**</div><div class='add'>+</div><div class='add'>+~~~</div><div class='add'>+gluster volume set &lt;vol_name&gt; network.compression.min-size 50</div><div class='add'>+~~~</div><div class='add'>+</div><div class='add'>+Data is compressed only when its size exceeds the above value in bytes.</div><div class='add'>+</div><div class='add'>+**Other paramaters**</div><div class='add'>+</div><div class='add'>+Other less frequently used parameters include `network.compression.mem-level`</div><div class='add'>+and `network.compression.window-size`. More details can about these options</div><div class='add'>+can be found by running `gluster volume set help` command.</div><div class='add'>+</div><div class='add'>+### Known Issues and Limitations</div><div class='add'>+</div><div class='add'>+* Compression translator cannot work with striped volumes.</div><div class='add'>+* Mount point hangs when writing a file with write-behind xlator turned on. To</div><div class='add'>+overcome this, turn off `performance.write-behind` entirely OR</div><div class='add'>+set`performance.strict-write-ordering` to on.</div><div class='add'>+* For glusterfs versions &lt;= 3.5, compression traslator can ONLY work with pure</div><div class='add'>+distribute volumes. This limitation is caused by AFR not being able to</div><div class='add'>+propagate xdata. This issue has been fixed in glusterfs versions &gt; 3.5</div><div class='add'>+</div><div class='add'>+### TODO</div><div class='add'>+Although zlib offers high compression ratio, it is very slow. We can make the</div><div class='add'>+translator pluggable to add support for other compression methods such as</div><div class='add'>+[lz4 compression](https://code.google.com/p/lz4/)</div><div class='head'>diff --git a/doc/developer-guide/options-to-contribute.md b/doc/developer-guide/options-to-contribute.md<br/>new file mode 100644<br/>index 00000000000..3f0d84e7645<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/doc/developer-guide/options-to-contribute.md?id=d1d7a6f35c816822fab51c820e25023863c239c1'>doc/developer-guide/options-to-contribute.md</a></div><div class='hunk'>@@ -0,0 +1,212 @@</div><div class='add'>+# A guide for contributors</div><div class='add'>+</div><div class='add'>+While you have gone through 'how to contribute' guides, if you are</div><div class='add'>+not sure what to work on, but really want to help the project, you</div><div class='add'>+have now landed on the right document :-)</div><div class='add'>+</div><div class='add'>+### Basic</div><div class='add'>+</div><div class='add'>+Instead of planning to fix **all** the below issues in one patch,</div><div class='add'>+we recommend you to have a a constant, continuous flow of improvements</div><div class='add'>+for the project. We recommend you to pick 1 file (or just few files) at</div><div class='add'>+a time to address below issues.</div><div class='add'>+Pick any `.c` (or `.h`) file, and you can send a patch which fixes **any**</div><div class='add'>+of the below themes. Ideally, fix all such occurrences in the file, even</div><div class='add'>+though, the reviewers would review even a single line change patch</div><div class='add'>+from you.</div><div class='add'>+</div><div class='add'>+1. Check for variable definitions, and if there is an array definition,</div><div class='add'>+which is very large at the top of the function, see if you can re-scope</div><div class='add'>+the variable to relevant sections (if it helps).</div><div class='add'>+</div><div class='add'>+Most of the time, some of these arrays may be used for 'error' handling,</div><div class='add'>+and it is possible to use them only in that scope.</div><div class='add'>+</div><div class='add'>+Reference: https://review.gluster.org/20846/</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+2. Check for complete string initialization at the beginning of a function.</div><div class='add'>+Ideally, there is no reason to initialize a string. Fix it across the file.</div><div class='add'>+</div><div class='add'>+Example:</div><div class='add'>+</div><div class='add'>+`char new_path_name[PATH_MAX] = {0};` to `char new_path_name[PATH_MAX];`</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+3. Change `calloc()` to `malloc()` wherever it makes sense.</div><div class='add'>+</div><div class='add'>+In a case of allocating a structures, where you expect certain (or most of)</div><div class='add'>+variables to be 0 (or NULL), it makes sense to use calloc(). But otherwise,</div><div class='add'>+there is an extra cost to `memset()` the whole object after allocating it.</div><div class='add'>+While it is not a significant improvement in performance, code which gets</div><div class='add'>+hit 1000s of times in a second, it would add some value.</div><div class='add'>+</div><div class='add'>+Reference: https://review.gluster.org/20878/</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+4. You can consider using `snprintf()`, instead of `strncpy()` while dealing</div><div class='add'>+with strings.</div><div class='add'>+</div><div class='add'>+strncpy() won't null terminate if the dest buffer isn't big enough; snprintf()</div><div class='add'>+does. While most of the string operations in the code is on array, and larger</div><div class='add'>+size than required, strncpy() does an extra copy of 0s at the end of</div><div class='add'>+string till the size of the array. It makes sense to use `snprintf()`,</div><div class='add'>+which doesn't suffer from that behavior.</div><div class='add'>+</div><div class='add'>+Also check the return value from snprintf() for buffer overflow and handle</div><div class='add'>+accordingly</div><div class='add'>+</div><div class='add'>+Reference: https://review.gluster.org/20925/</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+5. Now, pick a `.h` file, and see if a structure is very large, and see</div><div class='add'>+if re-aligning them as per [coding-standard](./coding-standard.md) gives any size benefit,</div><div class='add'>+if yes, go ahead and change it. Make sure you check all the structures</div><div class='add'>+in the file for similar pattern.</div><div class='add'>+</div><div class='add'>+Reference: [Check this section](https://github.com/gluster/glusterfs/blob/master/doc/developer-guide/coding-standard.md#structure-members-should-be-aligned-based-on-the-padding-requirements</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+### If you are up for more :-)</div><div class='add'>+</div><div class='add'>+Good progress! Glad you are interested to know more. We are surely interested</div><div class='add'>+in next level of contributions from you!</div><div class='add'>+</div><div class='add'>+#### Coverity</div><div class='add'>+</div><div class='add'>+Visit [Coverity Dashboard](https://scan.coverity.com/projects/gluster-glusterfs?tab=overview).</div><div class='add'>+</div><div class='add'>+Now, if the number of defect is not 0, you have an opportunity to contribute.</div><div class='add'>+</div><div class='add'>+You get all the detail on why the particular defect is mentioned there, and</div><div class='add'>+most probable hint on how to fix it. Do it!</div><div class='add'>+</div><div class='add'>+Reference: https://review.gluster.org/21394/</div><div class='add'>+</div><div class='add'>+Use the same reference Id (789278) as the patch, so we can capture it is in</div><div class='add'>+single bugzilla.</div><div class='add'>+</div><div class='add'>+#### Clang-Scan</div><div class='add'>+</div><div class='add'>+Clang-Scan is a tool which scans the .c files and reports the possible issues,</div><div class='add'>+similar to coverity, but a different tool. Over the years we have seen, they</div><div class='add'>+both report very different set of issues, and hence there is a value in fixing it.</div><div class='add'>+</div><div class='add'>+GlusterFS project gets tested with clang-scan job every night, and the report is</div><div class='add'>+posted in the [job details page](https://build.gluster.org/job/clang-scan/lastCompletedBuild/clangScanBuildBugs/).</div><div class='add'>+As long as the number is not 0 in the report here, you have an opportunity to</div><div class='add'>+contribute! Similar to coverity dashboard, click on 'Details' to find out the</div><div class='add'>+reason behind that report, and send a patch.</div><div class='add'>+</div><div class='add'>+Reference: https://review.gluster.org/21025</div><div class='add'>+</div><div class='add'>+Again, you can use reference Id (1622665) for these patches!</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+### I am good with programming, I would like to do more than above!</div><div class='add'>+</div><div class='add'>+#### Locked regions / Critical sections</div><div class='add'>+</div><div class='add'>+In the file you open, see if the lock is taken only to increment or decrement</div><div class='add'>+a flag, counter etc. If yes, then recommend you to convert it to ATOMIC locks.</div><div class='add'>+It is simple activity, but, if you know programing, you would know the benefit</div><div class='add'>+here.</div><div class='add'>+</div><div class='add'>+NOTE: There may not always a possibility to do this! You may have to check</div><div class='add'>+with developers first before going ahead.</div><div class='add'>+</div><div class='add'>+Reference: https://review.gluster.org/21221/</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+#### ASan (address sanitizer)</div><div class='add'>+</div><div class='add'>+[The job](https://build.gluster.org/job/asan/) runs regression with asan builds,</div><div class='add'>+and you can also run glusterfs with asan on your workload to identify the leaks.</div><div class='add'>+If there are any leaks reported, feel free to check it, and send us patch.</div><div class='add'>+</div><div class='add'>+You can also run `valgrind` and let us know what it reports.</div><div class='add'>+</div><div class='add'>+Reference: https://review.gluster.org/21397</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+#### Porting to different architecture</div><div class='add'>+</div><div class='add'>+This is something which we are not focusing right now, happy to collaborate!</div><div class='add'>+</div><div class='add'>+Reference: https://review.gluster.org/21276</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+#### Fix 'TODO/FIXME' in codebase</div><div class='add'>+</div><div class='add'>+There are few cases of pending features, or pending validations, which are</div><div class='add'>+pending from sometime. You can pick them in the given file, and choose to</div><div class='add'>+fix it.</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+### I don't know C, but I am interested to contribute in some way!</div><div class='add'>+</div><div class='add'>+You are most welcome! Our community is open for your contribution! First thing</div><div class='add'>+which comes to our mind is **documentation**. Next is, **testing** or validation.</div><div class='add'>+</div><div class='add'>+If you have some hardware, and want to run some performance comparisons with</div><div class='add'>+different version, or options, and help us to tune better is also a great help.</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+#### Documentation</div><div class='add'>+</div><div class='add'>+1. We have some documentation in [glusterfs repo](../), go through these, and</div><div class='add'>+see if you can help us to keep up-to-date.</div><div class='add'>+</div><div class='add'>+2. The https://docs.gluster.org is powered by https://github.com/gluster/glusterdocs</div><div class='add'>+repo. You can check out the repo, and help in keeping that up-to-date.</div><div class='add'>+</div><div class='add'>+3. [Our website](https://gluster.org) is maintained by https://github.com/gluster/glusterweb</div><div class='add'>+repo. Help us to keep this up-to-date, and add content there.</div><div class='add'>+</div><div class='add'>+4. Write blogs about Gluster, and your experience, and make world know little</div><div class='add'>+more about Gluster, and your use-case, and how it helped to solve the problem.</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+#### Testing</div><div class='add'>+</div><div class='add'>+1. There is a regression test suite in glusterfs, which runs with every patch, and is</div><div class='add'>+triggered by just running `./run-tests.sh` from the root of the project repo.</div><div class='add'>+</div><div class='add'>+You can add more test case to match your use-case, and send it as a patch, so you</div><div class='add'>+can make sure all future patches in glusterfs would keep your usecase intact.</div><div class='add'>+</div><div class='add'>+2. [Glusto-Tests](https://github.com/gluster/glusto-tests): This is another testing</div><div class='add'>+framework written for gluster, and makes use of clustered setup to test different</div><div class='add'>+use-cases, and helps to validate many bugs.</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+#### Ansible</div><div class='add'>+</div><div class='add'>+Gluster Organization has rich set of ansible roles, which are actively maintained.</div><div class='add'>+Feel free to check them out here - https://github.com/gluster/gluster-ansible</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+#### Monitoring</div><div class='add'>+</div><div class='add'>+We have prometheus repo, and are actively working on adding more metrics. Add what</div><div class='add'>+you need @ https://github.com/gluster/gluster-prometheus</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+#### Health-Report</div><div class='add'>+</div><div class='add'>+This is a project, where at any given point in time, you want to run some set of</div><div class='add'>+commands locally, and get an output to analyze the status, it can be added.</div><div class='add'>+Contribute @ https://github.com/gluster/gluster-health-report</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+### All these C/bash/python is old-school, I want something in containers.</div><div class='add'>+</div><div class='add'>+We have something for you too :-)</div><div class='add'>+</div><div class='add'>+Please visit our https://github.com/gluster/gcs repo for checking how you can help,</div><div class='add'>+and how gluster can help you in container world.</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+### Note</div><div class='add'>+</div><div class='add'>+For any queries, best way is to contact us through mailing-list, &lt;mailto:gluster-devel@gluster.org&gt;</div><div class='head'>diff --git a/doc/developer-guide/posix.md b/doc/developer-guide/posix.md<br/>new file mode 100644<br/>index 00000000000..84c813e55a2<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/doc/developer-guide/posix.md?id=d1d7a6f35c816822fab51c820e25023863c239c1'>doc/developer-guide/posix.md</a></div><div class='hunk'>@@ -0,0 +1,59 @@</div><div class='add'>+storage/posix translator</div><div class='add'>+========================</div><div class='add'>+</div><div class='add'>+Notes</div><div class='add'>+-----</div><div class='add'>+</div><div class='add'>+### `SET_FS_ID`</div><div class='add'>+</div><div class='add'>+This is so that all filesystem checks are done with the user's</div><div class='add'>+uid/gid and not GlusterFS's uid/gid.</div><div class='add'>+</div><div class='add'>+### `MAKE_REAL_PATH`</div><div class='add'>+</div><div class='add'>+This macro concatenates the base directory of the posix volume</div><div class='add'>+('option directory') with the given path.</div><div class='add'>+</div><div class='add'>+### `need_xattr` in lookup</div><div class='add'>+</div><div class='add'>+If this flag is passed, lookup returns a xattr dictionary that contains</div><div class='add'>+the file's create time, the file's contents, and the version number</div><div class='add'>+of the file.</div><div class='add'>+</div><div class='add'>+This is a hack to increase small file performance. If an application</div><div class='add'>+wants to read a small file, it can finish its job with just a lookup</div><div class='add'>+call instead of a lookup followed by read.</div><div class='add'>+</div><div class='add'>+### `getdents`/`setdents`</div><div class='add'>+</div><div class='add'>+These are used by unify to set and get directory entries.</div><div class='add'>+</div><div class='add'>+### `ALIGN_BUF`</div><div class='add'>+</div><div class='add'>+Macro to align an address to a page boundary (4K).</div><div class='add'>+</div><div class='add'>+### `priv-&gt;export_statfs`</div><div class='add'>+</div><div class='add'>+In some cases, two exported volumes may reside on the same</div><div class='add'>+partition on the server. Sending statvfs info for both</div><div class='add'>+the volumes will lead to erroneous df output at the client,</div><div class='add'>+since free space on the partition will be counted twice.</div><div class='add'>+</div><div class='add'>+In such cases, user can disable exporting statvfs info</div><div class='add'>+on one of the volumes by setting this option.</div><div class='add'>+</div><div class='add'>+### `xattrop`</div><div class='add'>+</div><div class='add'>+This fop is used by replicate to set version numbers on files.</div><div class='add'>+</div><div class='add'>+### `getxattr`/`setxattr` hack to read/write files</div><div class='add'>+</div><div class='add'>+A key, `GLUSTERFS_FILE_CONTENT_STRING`, is handled in a special way by</div><div class='add'>+`getxattr`/`setxattr`. A getxattr with the key will return the entire</div><div class='add'>+content of the file as the value. A `setxattr` with the key will write</div><div class='add'>+the value as the entire content of the file.</div><div class='add'>+</div><div class='add'>+### `posix_checksum`</div><div class='add'>+</div><div class='add'>+This calculates a simple XOR checksum on all entry names in a</div><div class='add'>+directory that is used by unify to compare directory contents.</div><div class='head'>diff --git a/doc/rpc-for-glusterfs.changes-done.txt b/doc/developer-guide/rpc-for-glusterfs.changes-done.txt<br/>index 6bbbca78826..6bbbca78826 100644<br/>--- a/<a href='/cgit/glusterfs.git/tree/doc/rpc-for-glusterfs.changes-done.txt?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>doc/rpc-for-glusterfs.changes-done.txt</a><br/>+++ b/<a href='/cgit/glusterfs.git/tree/doc/developer-guide/rpc-for-glusterfs.changes-done.txt?id=d1d7a6f35c816822fab51c820e25023863c239c1'>doc/developer-guide/rpc-for-glusterfs.changes-done.txt</a></div><div class='head'>diff --git a/doc/developer-guide/rpc-for-glusterfs.new-versions.md b/doc/developer-guide/rpc-for-glusterfs.new-versions.md<br/>new file mode 100644<br/>index 00000000000..e3da5efa4a2<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/doc/developer-guide/rpc-for-glusterfs.new-versions.md?id=d1d7a6f35c816822fab51c820e25023863c239c1'>doc/developer-guide/rpc-for-glusterfs.new-versions.md</a></div><div class='hunk'>@@ -0,0 +1,32 @@</div><div class='add'>+# GlusterFS RPC program versions</div><div class='add'>+</div><div class='add'>+## Compatibility</div><div class='add'>+</div><div class='add'>+RPC layer of glusterfs is implemented with possible changes over the protocol layers in mind. If there are any changes in the FOPs from what is assumed to be client side, and whats in serverside, they are to be added as a separate program table.</div><div class='add'>+</div><div class='add'>+### Program tables and Versions</div><div class='add'>+</div><div class='add'>+A given RPC program has a specific Task, and Version along with actors belonging to the program. In any of the programs, if a new actor is added, it is very important to define one more program with different version, and then keep both, if both are supported. Or else, it is important to handle the 'handshake' properly.</div><div class='add'>+</div><div class='add'>+#### Server details</div><div class='add'>+</div><div class='add'>+More info on RPC program is at `rpc/rpc-lib/src/rpcsvc.h` and check for structure `rpcsvc_actor_t` and `struct rpcsvc_program`. For usage, check `xlators/protocol/server/src/server-rpc-fops.c`</div><div class='add'>+</div><div class='add'>+#### Client details</div><div class='add'>+</div><div class='add'>+For details on client structures check `rpc/rpc-lib/src/rpc-clnt.h` for `rpc_clnt_procedure_t` and `rpc_clnt_program_t`. For usage, check `xlators/protocol/client/src/client-rpc-fops.c`</div><div class='add'>+</div><div class='add'>+## Protocol</div><div class='add'>+</div><div class='add'>+A protocol is what is agreed between two parties. In glusterfs, a RPC protocol is defined as .x file, which then gets converted to .c/.h file using `rpcgen`. There are different protocols defined for communication between `xlators/mgmt/glusterd &lt;==&gt; glusterfsd`, `gluster CLI &lt;==&gt; glusterd`, and `client-protocol &lt;==&gt; server-protocol`</div><div class='add'>+</div><div class='add'>+Once a protocol is defined and a release is made with that protocol, make sure no one changes it. Any edits to a given structure there should be a new version of the structure, and also it should get used in new actor, and thus new program version.</div><div class='add'>+</div><div class='add'>+## Server and Client Handshake</div><div class='add'>+</div><div class='add'>+When a client succeeds to establish a connect (it can be any transport, socket, ib-verbs or unix), client sends a dump (GF_DUMP_DUMP) request to server, which will respond back with all the supported versions of the server RPC (the supported programs which are registered with `rpcsvc_program_register()`).</div><div class='add'>+</div><div class='add'>+A client which expects certain programs to be present in server, it should be taking care of looking for it in the handshake methods, and take appropriate action depending on what to do next. In general a compatibility issue should be handled at handshake level itself, thus we can clearly let user/admin know of any 'in-compatibilities'. </div><div class='add'>+As a developer of GlusterFS protocol layer, one just has to make sure *never to make changes to existing program structures*, but they have to add new programs if required. New programs can have the same actors as present in existing, and also little more. Or it can even have same actor behave differently, take different parameter.</div><div class='add'>+</div><div class='add'>+If this is followed properly, there would be smooth upgrade / downgrade of versions. If not, technically, it is 100% guarantee of getting compatibility related issues.</div><div class='head'>diff --git a/doc/developer-guide/syncop.md b/doc/developer-guide/syncop.md<br/>new file mode 100644<br/>index 00000000000..bcc8bd08e01<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/doc/developer-guide/syncop.md?id=d1d7a6f35c816822fab51c820e25023863c239c1'>doc/developer-guide/syncop.md</a></div><div class='hunk'>@@ -0,0 +1,72 @@</div><div class='add'>+# syncop framework</div><div class='add'>+A coroutines-based, cooperative multi-tasking framework.</div><div class='add'>+</div><div class='add'>+## Topics</div><div class='add'>+</div><div class='add'>+- Glossary</div><div class='add'>+- Lifecycle of a synctask</div><div class='add'>+- Existing usage</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+## Glossary</div><div class='add'>+</div><div class='add'>+### syncenv</div><div class='add'>+</div><div class='add'>+syncenv is an object that provides access to a pool of worker threads.</div><div class='add'>+synctasks execute in a syncenv.</div><div class='add'>+</div><div class='add'>+### synctask</div><div class='add'>+</div><div class='add'>+synctask can be informally defined as a pair of function pointers, namely _the</div><div class='add'>+call_ and _the callback_ (see syncop.h for more details).</div><div class='add'>+</div><div class='add'>+        synctask_fn_t - 'the call'</div><div class='add'>+        synctask_cbk_t - 'the callback'</div><div class='add'>+</div><div class='add'>+synctask has two modes of operation,</div><div class='add'>+</div><div class='add'>+1. The calling thread waits for the synctask to complete.</div><div class='add'>+2. The calling thread schedules the synctask and continues.</div><div class='add'>+</div><div class='add'>+synctask guarantees that the callback is called _after_ the call completes.</div><div class='add'>+</div><div class='add'>+### Lifecycle of a synctask</div><div class='add'>+</div><div class='add'>+A synctask could go into the following stages while in execution.</div><div class='add'>+</div><div class='add'>+- CREATED  - On calling synctask_create/synctask_new.</div><div class='add'>+</div><div class='add'>+- RUNNABLE - synctask is queued in env-&gt;runq.</div><div class='add'>+</div><div class='add'>+- RUNNING  - When one of syncenv's worker threads calls synctask_switch_to.</div><div class='add'>+</div><div class='add'>+- WAITING  - When a synctask calls synctask_yield.</div><div class='add'>+</div><div class='add'>+- DONE     - When a synctask has run to completion.</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+                                +-------------------------------+</div><div class='add'>+                                |            CREATED            |</div><div class='add'>+                                +-------------------------------+</div><div class='add'>+                                  |</div><div class='add'>+                                  | synctask_new/synctask_create</div><div class='add'>+                                  v</div><div class='add'>+                                +-------------------------------+</div><div class='add'>+                                |    RUNNABLE (in env-&gt;runq)    | &lt;+</div><div class='add'>+                                +-------------------------------+  |</div><div class='add'>+                                  |                                |</div><div class='add'>+                                  | synctask_switch_to             |</div><div class='add'>+                                  v                                |</div><div class='add'>+ +------+  on task completion   +-------------------------------+  |</div><div class='add'>+ | DONE | &lt;-------------------- |            RUNNING            |  | synctask_wake/wake</div><div class='add'>+ +------+                       +-------------------------------+  |</div><div class='add'>+                                  |                                |</div><div class='add'>+                                  | synctask_yield/yield           |</div><div class='add'>+                                  v                                |</div><div class='add'>+                                +-------------------------------+  |</div><div class='add'>+                                |    WAITING (in env-&gt;waitq)    | -+</div><div class='add'>+                                +-------------------------------+</div><div class='add'>+</div><div class='add'>+Note: A synctask is not guaranteed to run on the same thread throughout its</div><div class='add'>+lifetime. Every time a synctask yields, it is possible for it to run on a</div><div class='add'>+different thread.</div><div class='head'>diff --git a/doc/developer-guide/thread-naming.md b/doc/developer-guide/thread-naming.md<br/>new file mode 100644<br/>index 00000000000..513140d4437<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/doc/developer-guide/thread-naming.md?id=d1d7a6f35c816822fab51c820e25023863c239c1'>doc/developer-guide/thread-naming.md</a></div><div class='hunk'>@@ -0,0 +1,104 @@</div><div class='add'>+Thread Naming</div><div class='add'>+================</div><div class='add'>+Gluster processes spawn many threads; some threads are created by libglusterfs</div><div class='add'>+library, while others are created by xlators. When gfapi library is used in an</div><div class='add'>+application, some threads belong to the application and some are spawned by</div><div class='add'>+gluster libraries. We also have features where n number of threads are spawned</div><div class='add'>+to act as worker threads for same operation.</div><div class='add'>+</div><div class='add'>+In all the above cases, it is useful to be able to determine the list of threads</div><div class='add'>+that exist in runtime. Naming threads when you create them is the easiest way to</div><div class='add'>+provide that information to kernel so that it can then be queried by any means.</div><div class='add'>+</div><div class='add'>+How to name threads</div><div class='add'>+-------------------</div><div class='add'>+We have two wrapper functions in libglusterfs for creating threads. They take</div><div class='add'>+name as an argument and set thread name after its creation.</div><div class='add'>+</div><div class='add'>+```C</div><div class='add'>+gf_thread_create (pthread_t *thread, const pthread_attr_t *attr,</div><div class='add'>+                  void *(*start_routine)(void *), void *arg, const char *name)</div><div class='add'>+```</div><div class='add'>+</div><div class='add'>+```C</div><div class='add'>+gf_thread_create_detached (pthread_t *thread,</div><div class='add'>+                           void *(*start_routine)(void *), void *arg,</div><div class='add'>+                           const char *name)</div><div class='add'>+```</div><div class='add'>+</div><div class='add'>+As max name length for a thread in POSIX is only 16 characters including the</div><div class='add'>+'\0' character, you have to be a little creative with naming. Also, it is</div><div class='add'>+important that all Gluster threads have common prefix. Considering these</div><div class='add'>+conditions, we have "glfs_" as prefix for all the threads created by these</div><div class='add'>+wrapper functions. It is responsibility of the owner of thread to provide the</div><div class='add'>+suffix part of the name. It does not have to be a descriptive name, as it has</div><div class='add'>+only 10 letters to work with. However, it should be unique enough such that it</div><div class='add'>+can be matched with a table which describes it.</div><div class='add'>+</div><div class='add'>+If n number of threads are spwaned to perform same function, it is must that the</div><div class='add'>+threads are numbered.</div><div class='add'>+</div><div class='add'>+Table of thread names</div><div class='add'>+---------------------</div><div class='add'>+Thread names don't have to be a descriptive; however, it should be unique enough</div><div class='add'>+such that it can be matched with a table below without ambiguity.</div><div class='add'>+</div><div class='add'>+- bdaio    - block device aio</div><div class='add'>+- brfsscan - bit rot fs scanner</div><div class='add'>+- brhevent - bit rot event handler</div><div class='add'>+- brmon    - bit rot monitor</div><div class='add'>+- brosign  - bit rot one shot signer</div><div class='add'>+- brpobj   - bit rot object processor</div><div class='add'>+- brsproc  - bit rot scrubber</div><div class='add'>+- brssign  - bit rot stub signer</div><div class='add'>+- brswrker - bit rot worker</div><div class='add'>+- clogc    - changelog consumer</div><div class='add'>+- clogcbki - changelog callback invoker</div><div class='add'>+- clogd    - changelog dispatcher</div><div class='add'>+- clogecon - changelog reverse connection</div><div class='add'>+- clogfsyn - changelog fsync</div><div class='add'>+- cloghcon - changelog history consumer</div><div class='add'>+- clogjan  - changelog janitor</div><div class='add'>+- clogpoll - changelog poller</div><div class='add'>+- clogproc - changelog process</div><div class='add'>+- clogro   - changelog rollover</div><div class='add'>+- ctrcomp  - change time recorder compaction</div><div class='add'>+- dhtdf    - dht defrag task</div><div class='add'>+- dhtdg    - dht defrag start</div><div class='add'>+- dhtfcnt  - dht rebalance file counter</div><div class='add'>+- ecshd    - ec heal daemon</div><div class='add'>+- epollN   -  epoll thread</div><div class='add'>+- fdlwrker - fdl worker</div><div class='add'>+- fusenoti - fuse notify</div><div class='add'>+- fuseproc - fuse main thread</div><div class='add'>+- gdhooks  - glusterd hooks</div><div class='add'>+- glfspoll -  gfapi poller thread</div><div class='add'>+- idxwrker - index worker</div><div class='add'>+- iosdump  - io stats dump</div><div class='add'>+- iotwr    - io thread worker</div><div class='add'>+- jbrflush - jbr flush</div><div class='add'>+- leasercl - lease recall</div><div class='add'>+- memsweep - sweeper thread for mem pools</div><div class='add'>+- nfsauth  - nfs auth</div><div class='add'>+- nfsnsm   - nfs nsm</div><div class='add'>+- nfsudp   - nfs udp mount</div><div class='add'>+- nlmmon   - nfs nlm/nsm mon</div><div class='add'>+- posixaio - posix aio</div><div class='add'>+- posixfsy - posix fsync</div><div class='add'>+- posixhc  - posix heal</div><div class='add'>+- posixjan - posix janitor</div><div class='add'>+- posixrsv - posix reserve</div><div class='add'>+- quiesce  - quiesce dequeue</div><div class='add'>+- rdmaAsyn - rdma async event handler</div><div class='add'>+- rdmaehan - rdma completion handler</div><div class='add'>+- rdmarcom - rdma receive completion handler</div><div class='add'>+- rdmascom - rdma send completion handler</div><div class='add'>+- rpcsvcrh - rpcsvc request handler</div><div class='add'>+- scleanup - socket cleanup</div><div class='add'>+- shdheal  - self heal daemon</div><div class='add'>+- sigwait  -  glusterfsd sigwaiter</div><div class='add'>+- spoller  - socket poller</div><div class='add'>+- sprocN   - syncop worker thread</div><div class='add'>+- tbfclock - token bucket filter token generator thread</div><div class='add'>+- timer    - timer thread</div><div class='add'>+- upreaper - upcall reaper</div><div class='head'>diff --git a/doc/developer-guide/translator-development.md b/doc/developer-guide/translator-development.md<br/>new file mode 100644<br/>index 00000000000..f75935519f6<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/doc/developer-guide/translator-development.md?id=d1d7a6f35c816822fab51c820e25023863c239c1'>doc/developer-guide/translator-development.md</a></div><div class='hunk'>@@ -0,0 +1,683 @@</div><div class='add'>+Translator development</div><div class='add'>+======================</div><div class='add'>+</div><div class='add'>+Setting the Stage</div><div class='add'>+-----------------</div><div class='add'>+</div><div class='add'>+This is the first post in a series that will explain some of the details of</div><div class='add'>+writing a GlusterFS translator, using some actual code to illustrate.</div><div class='add'>+</div><div class='add'>+Before we begin, a word about environments. GlusterFS is over 300K lines of</div><div class='add'>+code spread across a few hundred files. That's no Linux kernel or anything, but</div><div class='add'>+ you're still going to be navigating through a lot of code in every</div><div class='add'>+code-editing session, so some kind of cross-referencing is *essential*. I use</div><div class='add'>+cscope with the vim bindings, and if I couldn't do Crtl+G and such to jump</div><div class='add'>+between definitions all the time my productivity would be cut in half. You may</div><div class='add'>+prefer different tools, but as I go through these examples you'll need</div><div class='add'>+something functionally similar to follow on. OK, on with the show.</div><div class='add'>+</div><div class='add'>+The first thing you need to know is that translators are not just bags of</div><div class='add'>+functions and variables. They need to have a very definite internal structure</div><div class='add'>+so that the translator-loading code can figure out where all the pieces are.</div><div class='add'>+The way it does this is to use dlsym to look for specific names within your</div><div class='add'>+shared-object file, as follow (from `xlator.c`):</div><div class='add'>+</div><div class='add'>+```</div><div class='add'>+if (!(xl-&gt;fops = dlsym (handle, "fops"))) {</div><div class='add'>+    gf_log ("xlator", GF_LOG_WARNING, "dlsym(fops) on %s",</div><div class='add'>+        dlerror ());</div><div class='add'>+    goto out;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+if (!(xl-&gt;cbks = dlsym (handle, "cbks"))) {</div><div class='add'>+    gf_log ("xlator", GF_LOG_WARNING, "dlsym(cbks) on %s",</div><div class='add'>+        dlerror ());</div><div class='add'>+    goto out;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+if (!(xl-&gt;init = dlsym (handle, "init"))) {</div><div class='add'>+    gf_log ("xlator", GF_LOG_WARNING, "dlsym(init) on %s",</div><div class='add'>+        dlerror ());</div><div class='add'>+    goto out;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+if (!(xl-&gt;fini = dlsym (handle, "fini"))) {</div><div class='add'>+    gf_log ("xlator", GF_LOG_WARNING, "dlsym(fini) on %s",</div><div class='add'>+        dlerror ());</div><div class='add'>+    goto out;</div><div class='add'>+}</div><div class='add'>+```</div><div class='add'>+</div><div class='add'>+In this example, `xl` is a pointer to the in-memory object for the translator</div><div class='add'>+we're loading. As you can see, it's looking up various symbols *by name* in the</div><div class='add'>+ shared object it just loaded, and storing pointers to those symbols. Some of</div><div class='add'>+them (e.g. init) are functions, while others (e.g. fops) are dispatch tables</div><div class='add'>+containing pointers to many functions. Together, these make up the translator's</div><div class='add'>+ public interface.</div><div class='add'>+</div><div class='add'>+Most of this glue or boilerplate can easily be found at the bottom of one of</div><div class='add'>+the source files that make up each translator. We're going to use the `rot-13`</div><div class='add'>+translator just for fun, so in this case you'd look in `rot-13.c` to see this:</div><div class='add'>+</div><div class='add'>+```</div><div class='add'>+struct xlator_fops fops = {</div><div class='add'>+    .readv          = rot13_readv,</div><div class='add'>+    .writev         = rot13_writev</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct xlator_cbks cbks = {</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct volume_options options[] = {</div><div class='add'>+{ .key    = {"encrypt-write"},</div><div class='add'>+  .type = GF_OPTION_TYPE_BOOL</div><div class='add'>+},</div><div class='add'>+{ .key    = {"decrypt-read"},</div><div class='add'>+  .type = GF_OPTION_TYPE_BOOL</div><div class='add'>+},</div><div class='add'>+{ .key    = {NULL} },</div><div class='add'>+};</div><div class='add'>+```</div><div class='add'>+</div><div class='add'>+The `fops` table, defined in `xlator.h`, is one of the most important pieces.</div><div class='add'>+This table contains a pointer to each of the filesystem functions that your</div><div class='add'>+translator might implement -- `open`, `read`, `stat`, `chmod`, and so on. There</div><div class='add'>+are 82 such functions in all, but don't worry; any that you don't specify here</div><div class='add'>+will be see as null and filled with defaults from `defaults.c` when your</div><div class='add'>+translator is loaded. In this particular example, since `rot-13` is an</div><div class='add'>+exceptionally simple translator, we only fill in two entries for `readv` and</div><div class='add'>+`writev`.</div><div class='add'>+</div><div class='add'>+There are actually two other tables, also required to have predefined names,</div><div class='add'>+that are also used to find translator functions: `cbks` (which is empty in this</div><div class='add'>+ snippet) and `dumpops` (which is missing entirely). The first of these specify</div><div class='add'>+ entry points for when inodes are forgotten or file descriptors are released.</div><div class='add'>+In other words, they're destructors for objects in which your translator might</div><div class='add'>+ have an interest. Mostly you can ignore them, because the default behavior</div><div class='add'>+handles even the simpler cases of translator-specific inode/fd context</div><div class='add'>+automatically. However, if the context you attach is a complex structure</div><div class='add'>+requiring complex cleanup, you'll need to supply these functions. As for</div><div class='add'>+dumpops, that's just used if you want to provide functions to pretty-print</div><div class='add'>+various structures in logs. I've never used it myself, though I probably</div><div class='add'>+should. What's noteworthy here is that we don't even define dumpops. That's</div><div class='add'>+because all of the functions that might use these dispatch functions will check</div><div class='add'>+ for `xl-&gt;dumpops` being `NULL` before calling through it. This is in sharp</div><div class='add'>+contrast to the behavior for `fops` and `cbks`, which *must* be present. If</div><div class='add'>+they're not, translator loading will fail because these pointers are not</div><div class='add'>+checked every time and if they're `NULL` then we'll segfault. That's why we</div><div class='add'>+provide an empty definition for cbks; it's OK for the individual function</div><div class='add'>+pointers to be NULL, but not for the whole table to be absent.</div><div class='add'>+</div><div class='add'>+The last piece I'll cover today is options. As you can see, this is a table of</div><div class='add'>+translator-specific option names and some information about their types.</div><div class='add'>+GlusterFS actually provides a pretty rich set of types (`volume_option_type_t`</div><div class='add'>+in `options.`h) which includes paths, translator names, percentages, and times</div><div class='add'>+in addition to the obvious integers and strings. Also, the `volume_option_t`</div><div class='add'>+structure can include information about alternate names, min/max/default</div><div class='add'>+values, enumerated string values, and descriptions. We don't see any of these</div><div class='add'>+here, so let's take a quick look at some more complex examples from afr.c and</div><div class='add'>+then come back to `rot-13`.</div><div class='add'>+</div><div class='add'>+```</div><div class='add'>+{ .key  = {"data-self-heal-algorithm"},</div><div class='add'>+  .type = GF_OPTION_TYPE_STR,</div><div class='add'>+  .default_value = "",</div><div class='add'>+  .description   = "Select between \"full\", \"diff\". The "</div><div class='add'>+           "\"full\" algorithm copies the entire file from "</div><div class='add'>+           "source to sink. The \"diff\" algorithm copies to "</div><div class='add'>+           "sink only those blocks whose checksums don't match "</div><div class='add'>+           "with those of source.",</div><div class='add'>+  .value = { "diff", "full", "" }</div><div class='add'>+},</div><div class='add'>+{ .key  = {"data-self-heal-window-size"},</div><div class='add'>+  .type = GF_OPTION_TYPE_INT,</div><div class='add'>+  .min  = 1,</div><div class='add'>+  .max  = 1024,</div><div class='add'>+  .default_value = "1",</div><div class='add'>+  .description = "Maximum number blocks per file for which "</div><div class='add'>+         "self-heal process would be applied simultaneously."</div><div class='add'>+},</div><div class='add'>+```</div><div class='add'>+</div><div class='add'>+When your translator is loaded, all of this information is used to parse the</div><div class='add'>+options actually provided in the volfile, and then the result is turned into a</div><div class='add'>+dictionary and stored as `xl-&gt;options`. This dictionary is then processed by</div><div class='add'>+your init function, which you can see being looked up in the first code</div><div class='add'>+fragment above. We're only going to look at a small part of the `rot-13`'s</div><div class='add'>+init for now.</div><div class='add'>+</div><div class='add'>+```</div><div class='add'>+priv-&gt;decrypt_read = 1;</div><div class='add'>+priv-&gt;encrypt_write = 1;</div><div class='add'>+</div><div class='add'>+data = dict_get (this-&gt;options, "encrypt-write");</div><div class='add'>+if (data) {</div><div class='add'>+    if (gf_string2boolean (data-&gt;data, &amp;priv-&gt;encrypt_write</div><div class='add'>+        == -1) {</div><div class='add'>+        gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='add'>+            "encrypt-write takes only boolean options");</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+```</div><div class='add'>+</div><div class='add'>+What we can see here is that we're setting some defaults in our priv structure,</div><div class='add'>+then looking to see if an `encrypt-write` option was actually provided. If so,</div><div class='add'>+we convert and store it. This is a pretty classic use of dict_get to fetch a</div><div class='add'>+field from a dictionary, and of using one of many conversion functions in</div><div class='add'>+`common-utils.c` to convert `data-&gt;data` into something we can use.</div><div class='add'>+</div><div class='add'>+So far we've covered the basic of how a translator gets loaded, how we find its</div><div class='add'>+various parts, and how we process its options. In my next Translator 101 post,</div><div class='add'>+we'll go a little deeper into other things that init and its companion fini</div><div class='add'>+might do, and how some other fields in our `xlator_t` structure (commonly</div><div class='add'>+referred to as this) are commonly used.</div><div class='add'>+</div><div class='add'>+`init`, `fini`, and private context</div><div class='add'>+-----------------------------------</div><div class='add'>+</div><div class='add'>+In the previous Translator 101 post, we looked at some of the dispatch tables</div><div class='add'>+and options processing in a translator. This time we're going to cover the rest</div><div class='add'>+ of the "shell" of a translator -- i.e. the other global parts not specific to</div><div class='add'>+handling a particular request.</div><div class='add'>+</div><div class='add'>+Let's start by looking at the relationship between a translator and its shared</div><div class='add'>+library. At a first approximation, this is the relationship between an object</div><div class='add'>+and a class in just about any object-oriented programming language. The class</div><div class='add'>+defines behaviors, but has to be instantiated as an object to have any kind of</div><div class='add'>+existence. In our case the object is an `xlator_t`. Several of these might be</div><div class='add'>+created within the same daemon, sharing all of the same code through init/fini</div><div class='add'>+and dispatch tables, but sharing *no data*. You could implement shared data (as</div><div class='add'>+ static variables in your shared libraries) but that's strongly discouraged.</div><div class='add'>+Every function in your shared library will get an `xlator_t` as an argument,</div><div class='add'>+and should use it. This lack of class-level data is one of the points where</div><div class='add'>+the analogy to common OOP systems starts to break down. Another place is the</div><div class='add'>+complete lack of inheritance. Translators inherit behavior (code) from exactly</div><div class='add'>+one shared library -- looked up and loaded using the `type` field in a volfile</div><div class='add'>+`volume ... end-volume` block -- and that's it -- not even single inheritance,</div><div class='add'>+no subclasses or superclasses, no mixins or prototypes, just the relationship</div><div class='add'>+between an object and its class. With that in mind, let's turn to the init</div><div class='add'>+function that we just barely touched on last time.</div><div class='add'>+</div><div class='add'>+```</div><div class='add'>+int32_t</div><div class='add'>+init (xlator_t *this)</div><div class='add'>+{</div><div class='add'>+    data_t *data = NULL;</div><div class='add'>+    rot_13_private_t *priv = NULL;</div><div class='add'>+</div><div class='add'>+    if (!this-&gt;children || this-&gt;children-&gt;next) {</div><div class='add'>+        gf_log ("rot13", GF_LOG_ERROR,</div><div class='add'>+            "FATAL: rot13 should have exactly one child");</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (!this-&gt;parents) {</div><div class='add'>+        gf_log (this-&gt;name, GF_LOG_WARNING,</div><div class='add'>+            "dangling volume. check volfile ");</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    priv = GF_CALLOC (sizeof (rot_13_private_t), 1, 0);</div><div class='add'>+    if (!priv)</div><div class='add'>+        return -1;</div><div class='add'>+```</div><div class='add'>+</div><div class='add'>+At the very top, we see the function signature -- we get a pointer to the</div><div class='add'>+`xlator_t` object that we're initializing, and we return an `int32_t` status.</div><div class='add'>+As with most functions in the translator API, this should be zero to indicate</div><div class='add'>+success. In this case it's safe to return -1 for failure, but watch out: in</div><div class='add'>+dispatch-table functions, the return value means the status of the *function</div><div class='add'>+call* rather than the *request*. A request error should be reflected as a</div><div class='add'>+callback with a non-zero `op_re`t value, but the dispatch function itself</div><div class='add'>+should still return zero. In fact, the handling of a non-zero return from a</div><div class='add'>+dispatch function is not all that robust (we recently had a bug report in</div><div class='add'>+HekaFS related to this) so it's something you should probably avoid</div><div class='add'>+altogether. This only underscores the difference between dispatch functions</div><div class='add'>+and `init`/`fini` functions, where non-zero returns *are* expected and handled</div><div class='add'>+logically by aborting the translator setup. We can see that down at the</div><div class='add'>+bottom, where we return -1 to indicate that we couldn't allocate our</div><div class='add'>+private-data area (more about that later).</div><div class='add'>+</div><div class='add'>+The first thing this init function does is check that the translator is being</div><div class='add'>+set up in the right kind of environment. Translators are called by parents and</div><div class='add'>+in turn call children. Some translators are "initial" translators that inject</div><div class='add'>+requests into the system from elsewhere -- e.g. mount/fuse injecting requests</div><div class='add'>+from the kernel, protocol/server injecting requests from the network. Those</div><div class='add'>+translators don't need parents, but `rot-13` does and so we check for that.</div><div class='add'>+Similarly, some translators are "final" translators that (from the perspective</div><div class='add'>+of the current process) terminate requests instead of passing them on -- e.g.</div><div class='add'>+`protocol/client` passing them to another node, `storage/posix` passing them to</div><div class='add'>+a local filesystem. Other translators "multiplex" between multiple children --</div><div class='add'>+ passing each parent request on to one (`cluster/dht`), some</div><div class='add'>+(`cluster/stripe`), or all (`cluster/afr`) of those children. `rot-13` fits</div><div class='add'>+into none of those categories either, so it checks that it has *exactly one*</div><div class='add'>+child. It might be more convenient or robust if translator shared libraries</div><div class='add'>+had standard variables describing these requirements, to be checked in a</div><div class='add'>+consistent way by the translator-loading infrastructure itself instead of by</div><div class='add'>+each separate init function, but this is the way translators work today.</div><div class='add'>+</div><div class='add'>+The last thing we see in this fragment is allocating our private data area.</div><div class='add'>+This can literally be anything we want; the infrastructure just provides the</div><div class='add'>+priv pointer as a convenience but takes no responsibility for how it's used. In</div><div class='add'>+ this case we're using `GF_CALLOC` to allocate our own `rot_13_private_t`</div><div class='add'>+structure. This gets us all the benefits of GlusterFS's memory-leak detection</div><div class='add'>+infrastructure, but the way we're calling it is not quite ideal. For one thing,</div><div class='add'>+ the first two arguments -- from `calloc(3)` -- are kind of reversed. For</div><div class='add'>+another, notice how the last argument is zero. That can actually be an</div><div class='add'>+enumerated value, to tell the GlusterFS allocator *what* type we're</div><div class='add'>+allocating. This can be very useful information for memory profiling and leak</div><div class='add'>+detection, so it's recommended that you follow the example of any</div><div class='add'>+x`xx-mem-types.h` file elsewhere in the source tree instead of just passing</div><div class='add'>+zero here (even though that works).</div><div class='add'>+</div><div class='add'>+To finish our tour of standard initialization/termination, let's look at the</div><div class='add'>+end of `init` and the beginning of `fini`:</div><div class='add'>+</div><div class='add'>+```</div><div class='add'>+    this-&gt;private = priv;</div><div class='add'>+    gf_log ("rot13", GF_LOG_DEBUG, "rot13 xlator loaded");</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+fini (xlator_t *this)</div><div class='add'>+{</div><div class='add'>+    rot_13_private_t *priv = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    if (!priv)</div><div class='add'>+        return;</div><div class='add'>+    this-&gt;private = NULL;</div><div class='add'>+    GF_FREE (priv);</div><div class='add'>+```</div><div class='add'>+</div><div class='add'>+At the end of init we're just storing our private-data pointer in the `priv`</div><div class='add'>+field of our `xlator_t`, then returning zero to indicate that initialization</div><div class='add'>+succeeded. As is usually the case, our fini is even simpler. All it really has</div><div class='add'>+to do is `GF_FREE` our private-data pointer, which we do in a slightly</div><div class='add'>+roundabout way here. Notice how we don't even have a return value here, since</div><div class='add'>+there's nothing obvious and useful that the infrastructure could do if `fini`</div><div class='add'>+failed.</div><div class='add'>+</div><div class='add'>+That's practically everything we need to know to get our translator through</div><div class='add'>+loading, initialization, options processing, and termination. If we had defined</div><div class='add'>+ no dispatch functions, we could actually configure a daemon to use our</div><div class='add'>+translator and it would work as a basic pass-through from its parent to a</div><div class='add'>+single child. In the next post I'll cover how to build the translator and</div><div class='add'>+configure a daemon to use it, so that we can actually step through it in a</div><div class='add'>+debugger and see how it all fits together before we actually start adding</div><div class='add'>+functionality.</div><div class='add'>+</div><div class='add'>+This Time For Real</div><div class='add'>+------------------</div><div class='add'>+</div><div class='add'>+In the first two parts of this series, we learned how to write a basic</div><div class='add'>+translator skeleton that can get through loading, initialization, and option</div><div class='add'>+processing. This time we'll cover how to build that translator, configure a</div><div class='add'>+volume to use it, and run the glusterfs daemon in debug mode.</div><div class='add'>+</div><div class='add'>+Unfortunately, there's not much direct support for writing new translators. You</div><div class='add'>+can check out a GlusterFS tree and splice in your own translator directory, but</div><div class='add'>+ that's a bit painful because you'll have to update multiple makefiles plus a</div><div class='add'>+bunch of autoconf garbage. As part of the HekaFS project, I basically reverse</div><div class='add'>+engineered the truly necessary parts of the translator-building process and</div><div class='add'>+then pestered one of the Fedora glusterfs package maintainers (thanks</div><div class='add'>+daMaestro!) to add a `glusterfs-devel` package with the required headers. Since</div><div class='add'>+ then the complexity level in the HekaFS tree has crept back up a bit, but I</div><div class='add'>+still remember the simple method and still consider it the easiest way to get</div><div class='add'>+started on a new translator. For the sake of those not using Fedora, I'm going</div><div class='add'>+to describe a method that doesn't depend on that header package. What it does</div><div class='add'>+depend on is a GlusterFS source tree, much as you might have cloned from GitHub</div><div class='add'>+ or the Gluster review site. This tree doesn't have to be fully built, but you</div><div class='add'>+do need to run `autogen.sh` and configure in it. Then you can take the</div><div class='add'>+following simple makefile and put it in a directory with your actual source.</div><div class='add'>+</div><div class='add'>+```</div><div class='add'>+# Change these to match your source code.</div><div class='add'>+TARGET  = rot-13.so</div><div class='add'>+OBJECTS = rot-13.o</div><div class='add'>+</div><div class='add'>+# Change these to match your environment.</div><div class='add'>+GLFS_SRC = /srv/glusterfs</div><div class='add'>+GLFS_LIB = /usr/lib64</div><div class='add'>+HOST_OS  = GF_LINUX_HOST_OS</div><div class='add'>+</div><div class='add'>+# You shouldn't need to change anything below here.</div><div class='add'>+</div><div class='add'>+CFLAGS  = -fPIC -Wall -O0 -g \</div><div class='add'>+      -DHAVE_CONFIG_H -D_FILE_OFFSET_BITS=64 -D_GNU_SOURCE \</div><div class='add'>+      -D$(HOST_OS) -I$(GLFS_SRC) -I$(GLFS_SRC)/contrib/uuid \</div><div class='add'>+      -I$(GLFS_SRC)/libglusterfs/src</div><div class='add'>+LDFLAGS = -shared -nostartfiles -L$(GLFS_LIB)</div><div class='add'>+LIBS = -lglusterfs -lpthread</div><div class='add'>+</div><div class='add'>+$(TARGET): $(OBJECTS)</div><div class='add'>+    $(CC) $(OBJECTS) $(LDFLAGS) -o $(TARGET) $(OBJECTS) $(LIBS)</div><div class='add'>+```</div><div class='add'>+</div><div class='add'>+Yes, it's still Linux-specific. Mea culpa. As you can see, we're sticking with</div><div class='add'>+the `rot-13` example, so you can just copy the files from</div><div class='add'>+`xlators/encryption/rot-13/src` in your GlusterFS tree to follow on. Type</div><div class='add'>+`make` and you should be rewarded with a nice little `.so` file.</div><div class='add'>+</div><div class='add'>+```</div><div class='add'>+xlator_example$ ls -l rot-13.so</div><div class='add'>+-rwxr-xr-x. 1 jeff jeff 40784 Nov 16 16:41 rot-13.so</div><div class='add'>+```</div><div class='add'>+</div><div class='add'>+Notice that we've built with optimization level zero and debugging symbols</div><div class='add'>+included, which would not typically be the case for a packaged version of</div><div class='add'>+GlusterFS. Let's put our version of `rot-13.so` into a slightly different file</div><div class='add'>+on our system, so that it doesn't stomp on the installed version (not that</div><div class='add'>+you'd ever want to use that anyway).</div><div class='add'>+</div><div class='add'>+```</div><div class='add'>+xlator_example# ls /usr/lib64/glusterfs/3git/xlator/encryption/</div><div class='add'>+crypt.so crypt.so.0 crypt.so.0.0.0 rot-13.so rot-13.so.0</div><div class='add'>+rot-13.so.0.0.0</div><div class='add'>+xlator_example# cp rot-13.so \</div><div class='add'>+    /usr/lib64/glusterfs/3git/xlator/encryption/my-rot-13.so</div><div class='add'>+```</div><div class='add'>+</div><div class='add'>+These paths represent the current Gluster filesystem layout, which is likely to</div><div class='add'>+be deprecated in favor of the Fedora layout; your paths may vary. At this point</div><div class='add'>+ we're ready to configure a volume using our new translator. To do that, I'm</div><div class='add'>+going to suggest something that's strongly discouraged except during</div><div class='add'>+development (the Gluster guys are going to hate me for this): write our own</div><div class='add'>+volfile. Here's just about the simplest volfile you'll ever see.</div><div class='add'>+</div><div class='add'>+```</div><div class='add'>+volume my-posix</div><div class='add'>+    type storage/posix</div><div class='add'>+    option directory /srv/export</div><div class='add'>+end-volume</div><div class='add'>+</div><div class='add'>+volume my-rot13</div><div class='add'>+    type encryption/my-rot-13</div><div class='add'>+    subvolumes my-posix</div><div class='add'>+end-volume</div><div class='add'>+```</div><div class='add'>+</div><div class='add'>+All we have here is a basic brick using `/srv/export` for its data, and then</div><div class='add'>+an instance of our translator layered on top -- no client or server is</div><div class='add'>+necessary for what we're doing, and the system will automatically push a</div><div class='add'>+mount/fuse translator on top if there's no server translator. To try this out,</div><div class='add'>+all we need is the following command (assuming the directories involved already</div><div class='add'>+ exist).</div><div class='add'>+</div><div class='add'>+```</div><div class='add'>+xlator_example$ glusterfs --debug -f my.vol /srv/import</div><div class='add'>+```</div><div class='add'>+</div><div class='add'>+You should be rewarded with a whole lot of log output, including the text of</div><div class='add'>+the volfile (this is very useful for debugging problems in the field). If you</div><div class='add'>+go to another window on the same machine, you can see that you have a new</div><div class='add'>+filesystem mounted.</div><div class='add'>+</div><div class='add'>+```</div><div class='add'>+~$ df /srv/import</div><div class='add'>+Filesystem   1K-blocks     Used    Available Use% Mounted on</div><div class='add'>+/srv/xlator_example/my.vol</div><div class='add'>+             114506240     2706176 105983488   3% /srv/import</div><div class='add'>+```</div><div class='add'>+</div><div class='add'>+Just for fun, write something into a file in `/srv/import`, then look at the</div><div class='add'>+corresponding file in `/srv/export` to see it all `rot-13`'ed for you.</div><div class='add'>+</div><div class='add'>+```</div><div class='add'>+~$ echo hello &gt; /srv/import/a_file</div><div class='add'>+~$ cat /srv/export/a_file</div><div class='add'>+uryyb</div><div class='add'>+```</div><div class='add'>+</div><div class='add'>+There you have it -- functionality you control, implemented easily, layered on</div><div class='add'>+top of local storage. Now you could start adding functionality -- real</div><div class='add'>+encryption, perhaps -- and inevitably having to debug it. You could do that the</div><div class='add'>+ old-school way, with `gf_log` (preferred) or even plain old `printf`, or you</div><div class='add'>+could  run daemons under `gdb` instead. Alternatively, you could wait for the</div><div class='add'>+next  Translator 101 post, where we'll be doing exactly that.</div><div class='add'>+</div><div class='add'>+Debugging a Translator</div><div class='add'>+----------------------</div><div class='add'>+</div><div class='add'>+Now that we've learned what a translator looks like and how to build one, it's</div><div class='add'>+time to run one and actually watch it work. The best way to do this is good</div><div class='add'>+old-fashioned `gdb`, as follows (using some of the examples from last time).</div><div class='add'>+</div><div class='add'>+```</div><div class='add'>+xlator_example# gdb glusterfs</div><div class='add'>+GNU gdb (GDB) Red Hat Enterprise Linux (7.2-50.el6)</div><div class='add'>+...</div><div class='add'>+(gdb) r --debug -f my.vol /srv/import</div><div class='add'>+Starting program: /usr/sbin/glusterfs --debug -f my.vol /srv/import</div><div class='add'>+...</div><div class='add'>+[2011-11-23 11:23:16.495516] I [fuse-bridge.c:2971:fuse_init]</div><div class='add'>+    0-glusterfs-fuse: FUSE inited with protocol versions:</div><div class='add'>+    glusterfs 7.13 kernel 7.13</div><div class='add'>+```</div><div class='add'>+</div><div class='add'>+If you get to this point, your glusterfs client process is already running. You</div><div class='add'>+can go to another window to see the mountpoint, do file operations, etc.</div><div class='add'>+</div><div class='add'>+```</div><div class='add'>+~# df /srv/import</div><div class='add'>+Filesystem   1K-blocks     Used    Available Use% Mounted on</div><div class='add'>+/root/xlator_example/my.vol</div><div class='add'>+             114506240     2643968 106045568   3% /srv/import</div><div class='add'>+~# ls /srv/import</div><div class='add'>+a_file</div><div class='add'>+~# cat /srv/import/a_file</div><div class='add'>+hello</div><div class='add'>+```</div><div class='add'>+</div><div class='add'>+Now let's interrupt the process and see where we are.</div><div class='add'>+</div><div class='add'>+```</div><div class='add'>+</div><div class='add'>+Program received signal SIGINT, Interrupt.</div><div class='add'>+0x0000003a0060b3dc in pthread_cond_wait@@GLIBC_2.3.2 ()</div><div class='add'>+                   from /lib64/libpthread.so.0</div><div class='add'>+(gdb) info threads</div><div class='add'>+  5 Thread 0x7fffeffff700 (LWP 27206)  0x0000003a002dd8c7</div><div class='add'>+    in readv ()</div><div class='add'>+    from /lib64/libc.so.6</div><div class='add'>+  4 Thread 0x7ffff50e3700 (LWP 27205)  0x0000003a0060b75b</div><div class='add'>+    in pthread_cond_timedwait@@GLIBC_2.3.2 ()</div><div class='add'>+    from /lib64/libpthread.so.0</div><div class='add'>+  3 Thread 0x7ffff5f02700 (LWP 27204)  0x0000003a0060b3dc</div><div class='add'>+    in pthread_cond_wait@@GLIBC_2.3.2 ()</div><div class='add'>+    from /lib64/libpthread.so.0</div><div class='add'>+  2 Thread 0x7ffff6903700 (LWP 27203)  0x0000003a0060f245</div><div class='add'>+    in sigwait ()</div><div class='add'>+    from /lib64/libpthread.so.0</div><div class='add'>+* 1 Thread 0x7ffff7957700 (LWP 27196)  0x0000003a0060b3dc</div><div class='add'>+    in pthread_cond_wait@@GLIBC_2.3.2 ()</div><div class='add'>+    from /lib64/libpthread.so.0</div><div class='add'>+```</div><div class='add'>+</div><div class='add'>+Like any non-toy server, this one has multiple threads. What are they all</div><div class='add'>+doing? Honestly, even I don't know. Thread 1 turns out to be in</div><div class='add'>+`event_dispatch_epoll`, which means it's the one handling all of our network</div><div class='add'>+I/O. Note that with socket multi-threading patch this will change, with one</div><div class='add'>+thread in `socket_poller` per connection. Thread 2 is in `glusterfs_sigwaiter`</div><div class='add'>+which means signals will be isolated to that thread. Thread 3 is in</div><div class='add'>+`syncenv_task`, so it's a worker process for synchronous requests such as</div><div class='add'>+those used by the rebalance and repair code. Thread 4 is in</div><div class='add'>+`janitor_get_next_fd`, so it's waiting for a chance to close no-longer-needed</div><div class='add'>+file descriptors on the local filesystem. (I admit I had to look that one up,</div><div class='add'>+BTW.) Lastly, thread 5 is in `fuse_thread_proc`, so it's the one fetching</div><div class='add'>+requests from our FUSE interface. You'll often see many more threads than</div><div class='add'>+this, but it's a pretty good basic set. Now, let's set a breakpoint so we can</div><div class='add'>+actually watch a request.</div><div class='add'>+</div><div class='add'>+```</div><div class='add'>+(gdb) b rot13_writev</div><div class='add'>+Breakpoint 1 at 0x7ffff50e4f0b: file rot-13.c, line 119.</div><div class='add'>+(gdb) c</div><div class='add'>+Continuing.</div><div class='add'>+```</div><div class='add'>+</div><div class='add'>+At this point we go into our other window and do something that will involve a write.</div><div class='add'>+</div><div class='add'>+```</div><div class='add'>+~# echo goodbye &gt; /srv/import/another_file</div><div class='add'>+(back to the first window)</div><div class='add'>+[Switching to Thread 0x7fffeffff700 (LWP 27206)]</div><div class='add'>+</div><div class='add'>+Breakpoint 1, rot13_writev (frame=0x7ffff6e4402c, this=0x638440,</div><div class='add'>+    fd=0x7ffff409802c, vector=0x7fffe8000cd8, count=1, offset=0,</div><div class='add'>+    iobref=0x7fffe8001070) at rot-13.c:119</div><div class='add'>+119   rot_13_private_t *priv = (rot_13_private_t *)this-&gt;private;</div><div class='add'>+```</div><div class='add'>+</div><div class='add'>+Remember how we built with debugging symbols enabled and no optimization? That</div><div class='add'>+will be pretty important for the next few steps. As you can see, we're in</div><div class='add'>+`rot13_writev`, with several parameters.</div><div class='add'>+</div><div class='add'>+* `frame` is our always-present frame pointer for this request. Also,</div><div class='add'>+  `frame-&gt;local` will point to any local data we created and attached to the</div><div class='add'>+  request ourselves.</div><div class='add'>+* `this` is a pointer to our instance of the `rot-13` translator. You can examine</div><div class='add'>+  it if you like to see the name, type, options, parent/children, inode table,</div><div class='add'>+  and other stuff associated with it.</div><div class='add'>+* `fd` is a pointer to a file-descriptor *object* (`fd_t`, not just a</div><div class='add'>+  file-descriptor index which is what most people use "fd" for). This in turn</div><div class='add'>+  points to an inode object (`inode_t`) and we can associate our own</div><div class='add'>+  `rot-13`-specific data with either of these.</div><div class='add'>+* `vector` and `count` together describe the data buffers for this write, which</div><div class='add'>+  we'll get to in a moment.</div><div class='add'>+* `offset` is the offset into the file at which we're writing.</div><div class='add'>+* `iobref` is a buffer-reference object, which is used to track the life cycle</div><div class='add'>+  of buffers containing read/write data. If you look closely, you'll notice that</div><div class='add'>+  `vector[0].iov_base` points to the same address as `iobref-&gt;iobrefs[0].ptr`, which</div><div class='add'>+  should give you some idea of the inter-relationships between vector and iobref.</div><div class='add'>+</div><div class='add'>+OK, now what about that `vector`? We can use it to examine the data being</div><div class='add'>+written, like this.</div><div class='add'>+</div><div class='add'>+```</div><div class='add'>+(gdb) p vector[0]</div><div class='add'>+$2 = {iov_base = 0x7ffff7936000, iov_len = 8}</div><div class='add'>+(gdb) x/s 0x7ffff7936000</div><div class='add'>+0x7ffff7936000:     "goodbye\n"</div><div class='add'>+```</div><div class='add'>+</div><div class='add'>+It's not always safe to view this data as a string, because it might just as</div><div class='add'>+well be binary data, but since we're generating the write this time it's safe</div><div class='add'>+and convenient. With that knowledge, let's step through things a bit.</div><div class='add'>+</div><div class='add'>+```</div><div class='add'>+(gdb) s</div><div class='add'>+120        if (priv-&gt;encrypt_write)</div><div class='add'>+(gdb)</div><div class='add'>+121            rot13_iovec (vector, count);</div><div class='add'>+(gdb)</div><div class='add'>+rot13_iovec (vector=0x7fffe8000cd8, count=1) at rot-13.c:57</div><div class='add'>+57        for (i = 0; i &lt; count; i++) {</div><div class='add'>+(gdb)</div><div class='add'>+58            rot13 (vector[i].iov_base, vector[i].iov_len);</div><div class='add'>+(gdb)</div><div class='add'>+rot13 (buf=0x7ffff7936000 "goodbye\n", len=8) at rot-13.c:45</div><div class='add'>+45        for (i = 0; i &lt; len; i++) {</div><div class='add'>+(gdb)</div><div class='add'>+46            if (buf[i] &gt;= 'a' &amp;&amp; buf[i] &lt;= 'z')</div><div class='add'>+(gdb)</div><div class='add'>+47                buf[i] = 'a' + ((buf[i] - 'a' + 13) % 26);</div><div class='add'>+```</div><div class='add'>+</div><div class='add'>+Here we've stepped into `rot13_iovec`, which iterates through our vector</div><div class='add'>+calling `rot13`, which in turn iterates through the characters in that chunk</div><div class='add'>+doing the  `rot-13` operation if/as appropriate. This is pretty straightforward</div><div class='add'>+stuff, so  let's skip to the next interesting bit.</div><div class='add'>+</div><div class='add'>+```</div><div class='add'>+(gdb) fin</div><div class='add'>+Run till exit from #0  rot13 (buf=0x7ffff7936000 "goodbye\n",</div><div class='add'>+    len=8) at rot-13.c:47</div><div class='add'>+rot13_iovec (vector=0x7fffe8000cd8, count=1) at rot-13.c:57</div><div class='add'>+57        for (i = 0; i &lt; count; i++) {</div><div class='add'>+(gdb) fin</div><div class='add'>+Run till exit from #0  rot13_iovec (vector=0x7fffe8000cd8,</div><div class='add'>+    count=1) at rot-13.c:57</div><div class='add'>+rot13_writev (frame=0x7ffff6e4402c, this=0x638440,</div><div class='add'>+    fd=0x7ffff409802c, vector=0x7fffe8000cd8, count=1,</div><div class='add'>+    offset=0, iobref=0x7fffe8001070) at rot-13.c:123</div><div class='add'>+123        STACK_WIND (frame,</div><div class='add'>+(gdb) b 129</div><div class='add'>+Breakpoint 2 at 0x7ffff50e4f35: file rot-13.c, line 129.</div><div class='add'>+(gdb) b rot13_writev_cbk</div><div class='add'>+Breakpoint 3 at 0x7ffff50e4db3: file rot-13.c, line 106.</div><div class='add'>+(gdb) c</div><div class='add'>+```</div><div class='add'>+</div><div class='add'>+So we've set breakpoints on both the callback and the statement following the</div><div class='add'>+`STACK_WIND`. Which one will we hit first?</div><div class='add'>+</div><div class='add'>+```</div><div class='add'>+Breakpoint 3, rot13_writev_cbk (frame=0x7ffff6e4402c,</div><div class='add'>+    cookie=0x7ffff6e440d8, this=0x638440, op_ret=8, op_errno=0,</div><div class='add'>+    prebuf=0x7fffefffeca0, postbuf=0x7fffefffec30)</div><div class='add'>+    at rot-13.c:106</div><div class='add'>+106  STACK_UNWIND_STRICT (writev, frame, op_ret, op_errno,</div><div class='add'>+                          prebuf, postbuf);</div><div class='add'>+(gdb) bt</div><div class='add'>+#0  rot13_writev_cbk (frame=0x7ffff6e4402c,</div><div class='add'>+    cookie=0x7ffff6e440d8, this=0x638440, op_ret=8, op_errno=0,</div><div class='add'>+    prebuf=0x7fffefffeca0, postbuf=0x7fffefffec30)</div><div class='add'>+    at rot-13.c:106</div><div class='add'>+#1  0x00007ffff52f1b37 in posix_writev (frame=0x7ffff6e440d8,</div><div class='add'>+    this=&lt;value optimized out&gt;, fd=&lt;value optimized out&gt;,</div><div class='add'>+    vector=&lt;value optimized out&gt;, count=1,</div><div class='add'>+    offset=&lt;value optimized out&gt;, iobref=0x7fffe8001070)</div><div class='add'>+    at posix.c:2217</div><div class='add'>+#2  0x00007ffff50e513e in rot13_writev (frame=0x7ffff6e4402c,</div><div class='add'>+    this=0x638440, fd=0x7ffff409802c, vector=0x7fffe8000cd8,</div><div class='add'>+    count=1, offset=0, iobref=0x7fffe8001070) at rot-13.c:123</div><div class='add'>+```</div><div class='add'>+</div><div class='add'>+Surprise! We're in `rot13_writev_cbk` now, called (indirectly) while we're</div><div class='add'>+still in `rot13_writev` before `STACK_WIND` returns (still at rot-13.c:123). If</div><div class='add'>+ you did any request cleanup here, then you need to be careful about what you</div><div class='add'>+do in the remainder of `rot13_writev` because data may have been freed etc.</div><div class='add'>+It's tempting to say you should just do the cleanup in `rot13_writev` after</div><div class='add'>+the `STACK_WIND,` but that's not valid because it's also possible that some</div><div class='add'>+other translator returned without calling `STACK_UNWIND` -- i.e. before</div><div class='add'>+`rot13_writev` is called, so then it would be the one getting null-pointer</div><div class='add'>+errors instead. To put it another way, the callback and the return from</div><div class='add'>+`STACK_WIND` can occur in either order or even simultaneously on different</div><div class='add'>+threads. Even if you were to use reference counts, you'd have to make sure to</div><div class='add'>+use locking or atomic operations to avoid races, and it's not worth it. Unless</div><div class='add'>+you *really* understand the possible flows of control and know what you're</div><div class='add'>+doing, it's better to do cleanup in the callback and nothing after</div><div class='add'>+`STACK_WIND.`</div><div class='add'>+</div><div class='add'>+At this point all that's left is a `STACK_UNWIND` and a return. The</div><div class='add'>+`STACK_UNWIND` invokes our parent's completion callback, and in this case our</div><div class='add'>+parent is FUSE so at that point the VFS layer is notified of the write being</div><div class='add'>+complete. Finally, we return through several levels of normal function calls</div><div class='add'>+until we come back to fuse_thread_proc, which waits for the next request.</div><div class='add'>+</div><div class='add'>+So that's it. For extra fun, you might want to repeat this exercise by stepping</div><div class='add'>+through some other call -- stat or setxattr might be good choices -- but you'll</div><div class='add'>+ have to use a translator that actually implements those calls to see much</div><div class='add'>+that's interesting. Then you'll pretty much know everything I knew when I</div><div class='add'>+started writing my first for-real translators, and probably even a bit more. I</div><div class='add'>+hope you've enjoyed this series, or at least found it useful, and if you have</div><div class='add'>+any suggestions for other topics I should cover please let me know (via</div><div class='add'>+comments or email, IRC or Twitter).</div><div class='add'>+</div><div class='add'>+Other versions</div><div class='add'>+--------------</div><div class='add'>+</div><div class='add'>+Original author's site:</div><div class='add'>+</div><div class='add'>+ * [Translator 101 - Setting the Stage](http://pl.atyp.us/hekafs.org/index.php/2011/11/translator-101-class-1-setting-the-stage/)</div><div class='add'>+</div><div class='add'>+ * [Translator 101 - Init, Fini and Private Context](http://pl.atyp.us/hekafs.org/index.php/2011/11/translator-101-lesson-2-init-fini-and-private-context/)</div><div class='add'>+</div><div class='add'>+ * [Translator 101 - This Time for Real](http://pl.atyp.us/hekafs.org/index.php/2011/11/translator-101-lesson-3-this-time-for-real/)</div><div class='add'>+</div><div class='add'>+ * [Translator 101 - Debugging a Translator](http://pl.atyp.us/hekafs.org/index.php/2011/11/translator-101-lesson-4-debugging-a-translator/)</div><div class='add'>+</div><div class='add'>+Gluster community site:</div><div class='add'>+</div><div class='add'>+ * [Translators](https://docs.gluster.org/en/latest/Quick-Start-Guide/Architecture/#translators)</div><div class='head'>diff --git a/doc/developer-guide/unittest.md b/doc/developer-guide/unittest.md<br/>new file mode 100644<br/>index 00000000000..5c6c0a8a039<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/doc/developer-guide/unittest.md?id=d1d7a6f35c816822fab51c820e25023863c239c1'>doc/developer-guide/unittest.md</a></div><div class='hunk'>@@ -0,0 +1,228 @@</div><div class='add'>+# Unit Tests in GlusterFS</div><div class='add'>+</div><div class='add'>+## Overview</div><div class='add'>+[Art-of-unittesting][definitionofunittest] provides a good definition for unit tests.  A good unit test is:</div><div class='add'>+</div><div class='add'>+* Able to be fully automated</div><div class='add'>+* Has full control over all the pieces running (Use mocks or stubs to achieve this isolation when needed)</div><div class='add'>+* Can be run in any order  if part of many other tests</div><div class='add'>+* Runs in memory (no DB or File access, for example)</div><div class='add'>+* Consistently returns the same result (You always run the same test, so no random numbers, for example. save those for integration or range tests)</div><div class='add'>+* Runs fast</div><div class='add'>+* Tests a single logical concept in the system</div><div class='add'>+* Readable</div><div class='add'>+* Maintainable</div><div class='add'>+* Trustworthy (when you see its result, you donâ€™t need to debug the code just to be sure)</div><div class='add'>+</div><div class='add'>+## cmocka</div><div class='add'>+GlusterFS unit test framework is based on [cmocka][].  cmocka provides</div><div class='add'>+developers with methods to isolate and test modules written in C language.  It</div><div class='add'>+also provides integration with Jenkins by providing JUnit XML compliant unit</div><div class='add'>+test results.</div><div class='add'>+</div><div class='add'>+cmocka</div><div class='add'>+</div><div class='add'>+## Running Unit Tests</div><div class='add'>+To execute the unit tests, all you need is to type `make check`.  Here is a step-by-step example assuming you just cloned a GlusterFS tree:</div><div class='add'>+</div><div class='add'>+```</div><div class='add'>+$ ./autogen.sh</div><div class='add'>+$ ./configure --enable-debug</div><div class='add'>+$ make check</div><div class='add'>+```</div><div class='add'>+</div><div class='add'>+Sample output:</div><div class='add'>+</div><div class='add'>+```</div><div class='add'>+PASS: mem_pool_unittest</div><div class='add'>+============================================================================</div><div class='add'>+Testsuite summary for glusterfs 3git</div><div class='add'>+============================================================================</div><div class='add'>+# TOTAL: 1</div><div class='add'>+# PASS:  1</div><div class='add'>+# SKIP:  0</div><div class='add'>+# XFAIL: 0</div><div class='add'>+# FAIL:  0</div><div class='add'>+# XPASS: 0</div><div class='add'>+# ERROR: 0</div><div class='add'>+============================================================================</div><div class='add'>+```</div><div class='add'>+</div><div class='add'>+In this example, `mem_pool_unittest` has multiple tests inside, but `make check` assumes that the program itself is the test, and that is why it only shows one test.  Here is the output when we run `mem_pool_unittest` directly:</div><div class='add'>+</div><div class='add'>+```</div><div class='add'>+$ ./libglusterfs/src/mem_pool_unittest</div><div class='add'>+[==========] Running 10 test(s).</div><div class='add'>+[ RUN      ] test_gf_mem_acct_enable_set</div><div class='add'>+Expected assertion data != ((void *)0) occurred</div><div class='add'>+[       OK ] test_gf_mem_acct_enable_set</div><div class='add'>+[ RUN      ] test_gf_mem_set_acct_info_asserts</div><div class='add'>+Expected assertion xl != ((void *)0) occurred</div><div class='add'>+Expected assertion size &gt; ((4 + sizeof (size_t) + sizeof (xlator_t *) + 4 + 8) + 8) occurred</div><div class='add'>+Expected assertion type &lt;= xl-&gt;mem_acct.num_types occurred</div><div class='add'>+[       OK ] test_gf_mem_set_acct_info_asserts</div><div class='add'>+[ RUN      ] test_gf_mem_set_acct_info_memory</div><div class='add'>+[       OK ] test_gf_mem_set_acct_info_memory</div><div class='add'>+[ RUN      ] test_gf_calloc_default_calloc</div><div class='add'>+[       OK ] test_gf_calloc_default_calloc</div><div class='add'>+[ RUN      ] test_gf_calloc_mem_acct_enabled</div><div class='add'>+[       OK ] test_gf_calloc_mem_acct_enabled</div><div class='add'>+[ RUN      ] test_gf_malloc_default_malloc</div><div class='add'>+[       OK ] test_gf_malloc_default_malloc</div><div class='add'>+[ RUN      ] test_gf_malloc_mem_acct_enabled</div><div class='add'>+[       OK ] test_gf_malloc_mem_acct_enabled</div><div class='add'>+[ RUN      ] test_gf_realloc_default_realloc</div><div class='add'>+[       OK ] test_gf_realloc_default_realloc</div><div class='add'>+[ RUN      ] test_gf_realloc_mem_acct_enabled</div><div class='add'>+[       OK ] test_gf_realloc_mem_acct_enabled</div><div class='add'>+[ RUN      ] test_gf_realloc_ptr</div><div class='add'>+Expected assertion ((void *)0) != ptr occurred</div><div class='add'>+[       OK ] test_gf_realloc_ptr</div><div class='add'>+[==========] 10 test(s) run.</div><div class='add'>+[  PASSED  ] 10 test(s).</div><div class='add'>+[  FAILED  ] 0 test(s).</div><div class='add'>+[  REPORT  ] Created libglusterfs_mem_pool_xunit.xml report</div><div class='add'>+```</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+## Writing Unit Tests</div><div class='add'>+</div><div class='add'>+### Enhancing your C functions</div><div class='add'>+</div><div class='add'>+#### Programming by Contract</div><div class='add'>+Add the following to your C file:</div><div class='add'>+</div><div class='add'>+```c</div><div class='add'>+#include &lt;cmocka_pbc.h&gt;</div><div class='add'>+```</div><div class='add'>+</div><div class='add'>+```c</div><div class='add'>+/*</div><div class='add'>+ * Programming by Contract is a programming methodology</div><div class='add'>+ * which binds the caller and the function called to a</div><div class='add'>+ * contract. The contract is represented using Hoare Triple:</div><div class='add'>+ *      {P} C {Q}</div><div class='add'>+ * where {P} is the precondition before executing command C,</div><div class='add'>+ * and {Q} is the postcondition.</div><div class='add'>+ *</div><div class='add'>+ * See also:</div><div class='add'>+ * http://en.wikipedia.org/wiki/Design_by_contract</div><div class='add'>+ * http://en.wikipedia.org/wiki/Hoare_logic</div><div class='add'>+ * http://dlang.org/dbc.html</div><div class='add'>+ */</div><div class='add'>+ #ifndef CMOCKERY_PBC_H_</div><div class='add'>+#define CMOCKERY_PBC_H_</div><div class='add'>+</div><div class='add'>+#if defined(UNIT_TESTING) || defined (DEBUG)</div><div class='add'>+</div><div class='add'>+#include &lt;assert.h&gt;</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+ * Checks caller responsibility against contract</div><div class='add'>+ */</div><div class='add'>+#define REQUIRE(cond) assert(cond)</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+ * Checks function reponsability against contract.</div><div class='add'>+ */</div><div class='add'>+#define ENSURE(cond) assert(cond)</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+ * While REQUIRE and ENSURE apply to functions, INVARIANT</div><div class='add'>+ * applies to classes/structs.  It ensures that intances</div><div class='add'>+ * of the class/struct are consistent. In other words,</div><div class='add'>+ * that the instance has not been corrupted.</div><div class='add'>+ */</div><div class='add'>+#define INVARIANT(invariant_fnc) do{ (invariant_fnc) } while (0);</div><div class='add'>+</div><div class='add'>+#else</div><div class='add'>+#define REQUIRE(cond) do { } while (0);</div><div class='add'>+#define ENSURE(cond) do { } while (0);</div><div class='add'>+#define INVARIANT(invariant_fnc) do{ } while (0);</div><div class='add'>+</div><div class='add'>+#endif /* defined(UNIT_TESTING) || defined (DEBUG) */</div><div class='add'>+#endif /* CMOCKERY_PBC_H_ */</div><div class='add'>+```</div><div class='add'>+</div><div class='add'>+##### Example</div><div class='add'>+This is an _extremely_ simple example:</div><div class='add'>+</div><div class='add'>+```c</div><div class='add'>+int divide (int n, int d)</div><div class='add'>+{</div><div class='add'>+    int ans;</div><div class='add'>+</div><div class='add'>+    REQUIRE(d != 0);</div><div class='add'>+</div><div class='add'>+    ans = n / d;</div><div class='add'>+</div><div class='add'>+    // As code is added to this function throughout its lifetime,</div><div class='add'>+    // ENSURE will assert that data will be returned</div><div class='add'>+    // according to the contract.  Again this is an</div><div class='add'>+    // extremely simple example. :-D</div><div class='add'>+    ENSURE( ans == (n / d) );</div><div class='add'>+</div><div class='add'>+    return ans;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+```</div><div class='add'>+</div><div class='add'>+##### Important Note</div><div class='add'>+`REQUIRE`, `ENSURE`, and `INVARIANT` are only available when `DEBUG` or `UNIT_TESTING` are set in the CFLAGS.  You must pass `--enable-debug` to `./configure` to enable PBC on your non-unittest builds.</div><div class='add'>+</div><div class='add'>+#### Overriding functions</div><div class='add'>+Cmockery2 provides its own memory allocation functions which check for buffer overrun and memory leaks.  The following header file must be included **last** to be able to override any of the memory allocation functions:</div><div class='add'>+</div><div class='add'>+```c</div><div class='add'>+#include &lt;cmocka.h&gt;</div><div class='add'>+```</div><div class='add'>+</div><div class='add'>+This file will only take effect with the `UNIT_TESTING` CFLAG is set.</div><div class='add'>+</div><div class='add'>+### Creating a unit test</div><div class='add'>+Once you identify the C file you would like to test, first create a `unittest` directory under the directory where the C file is located.  This will isolate the unittests to a different directory.</div><div class='add'>+</div><div class='add'>+Next, you need to edit the `Makefile.am` file in the directory where your C file is located.  Initialize the</div><div class='add'>+`Makefile.am` if it does not already have the following sections:</div><div class='add'>+</div><div class='add'>+```</div><div class='add'>+#### UNIT TESTS #####</div><div class='add'>+CLEANFILES += *.gcda *.gcno *_xunit.xml</div><div class='add'>+noinst_PROGRAMS =</div><div class='add'>+TESTS =</div><div class='add'>+```</div><div class='add'>+</div><div class='add'>+Now you can add the following for each of the unit tests that you would like to build:</div><div class='add'>+</div><div class='add'>+```</div><div class='add'>+### UNIT TEST xxx_unittest ###</div><div class='add'>+xxx_unittest_CPPFLAGS = $(xxx_CPPFLAGS)</div><div class='add'>+xxx_unittest_SOURCES = xxx.c \</div><div class='add'>+                       unittest/xxx_unittest.c</div><div class='add'>+xxx_unittest_CFLAGS = $(UNITTEST_CFLAGS)</div><div class='add'>+xxx_unittest_LDFLAGS = $(UNITTEST_LDFLAGS)</div><div class='add'>+noinst_PROGRAMS += xxx_unittest</div><div class='add'>+TESTS += xxx_unittest</div><div class='add'>+```</div><div class='add'>+</div><div class='add'>+Where `xxx` is the name of your C file. For example, look at `libglusterfs/src/Makefile.am`.</div><div class='add'>+</div><div class='add'>+Copy the simple unit test from the [cmocka API][cmockaapi] to `unittest/xxx_unittest.c`.  If you would like to see an example of a unit test, please refer to `libglusterfs/src/unittest/mem_pool_unittest.c`.</div><div class='add'>+</div><div class='add'>+#### Mocking</div><div class='add'>+You may see that the linker will complain about missing functions needed by the C file you would like to test.  Identify the required functions, then place their stubs in a file called `unittest/xxx_mock.c`, then include this file in `Makefile.am` in `xxx_unittest_SOURCES`.  This will allow you to you Cmockery2's mocking functions.</div><div class='add'>+</div><div class='add'>+#### Running the unit test</div><div class='add'>+You can type `make` in the directory where the C file is located.  Once you built it and there are no errors, you can execute the test either by directly executing the program (in our example above it is called `xxx_unittest` ), or by running `make check`.</div><div class='add'>+</div><div class='add'>+#### Debugging</div><div class='add'>+Sometimes you may need to debug your unit test.  To do that, you will have to point `gdb` to the binary which is located in the same directory as the source.  For example, you can do the following from the root of the source tree to debug `mem_pool_unittest`:</div><div class='add'>+</div><div class='add'>+```</div><div class='add'>+$ gdb libglusterfs/src/mem_pool_unittest</div><div class='add'>+```</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+[cmocka]: https://cmocka.org</div><div class='add'>+[definitionofunittest]: http://artofunittesting.com/definition-of-a-unit-test/</div><div class='add'>+[cmockapi]: https://api.cmocka.org</div><div class='head'>diff --git a/doc/developer-guide/versioning.md b/doc/developer-guide/versioning.md<br/>new file mode 100644<br/>index 00000000000..10c1511b79b<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/doc/developer-guide/versioning.md?id=d1d7a6f35c816822fab51c820e25023863c239c1'>doc/developer-guide/versioning.md</a></div><div class='hunk'>@@ -0,0 +1,44 @@</div><div class='add'>+Versioning</div><div class='add'>+==========</div><div class='add'>+</div><div class='add'>+### current</div><div class='add'>+</div><div class='add'>+The number of the current interface exported by the library. A current value</div><div class='add'>+of '1', means that you are calling the interface exported by this library</div><div class='add'>+interface 1.</div><div class='add'>+</div><div class='add'>+### revision</div><div class='add'>+</div><div class='add'>+The implementation number of the most recent interface exported by this library.</div><div class='add'>+In this case, a revision value of `0` means that this is the first</div><div class='add'>+implementation of the interface.</div><div class='add'>+</div><div class='add'>+If the next release of this library exports the same interface, but has a</div><div class='add'>+different implementation (perhaps some bugs have been fixed), the revision</div><div class='add'>+number will be higher, but current number will be the same. In that case, when</div><div class='add'>+given a choice, the library with the highest revision will always be used by</div><div class='add'>+the runtime loader.</div><div class='add'>+</div><div class='add'>+### age</div><div class='add'>+</div><div class='add'>+The number of previous additional interfaces supported by this library. If age</div><div class='add'>+were '2', then this library can be linked into executables which were built with</div><div class='add'>+a release of this library that exported the current interface number, current,</div><div class='add'>+or any of the previous two interfaces. By definition age must be less than or</div><div class='add'>+equal to current. At the outset, only the first ever interface is implemented,</div><div class='add'>+so age can only be `0'.</div><div class='add'>+</div><div class='add'>+For every release of the library `-version-info` argument needs to be set</div><div class='add'>+correctly depending on any interface changes you have made.</div><div class='add'>+</div><div class='add'>+This is quite straightforward when you understand what the three numbers mean:</div><div class='add'>+</div><div class='add'>+If you have changed any of the sources for this library, the revision number</div><div class='add'>+must be incremented. This is a new revision of the current interface. If the</div><div class='add'>+interface has changed, then current must be incremented, and revision reset</div><div class='add'>+to '0'.</div><div class='add'>+</div><div class='add'>+This is the first revision of a new interface. If the new interface is a</div><div class='add'>+superset of the previous interface (that is, if the previous interface has not</div><div class='add'>+been broken by the changes in this new release), then age must be incremented.</div><div class='add'>+This release is backwards compatible with the previous release.</div><div class='head'>diff --git a/doc/developer-guide/write-behind.md b/doc/developer-guide/write-behind.md<br/>new file mode 100644<br/>index 00000000000..0d78964fa20<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/doc/developer-guide/write-behind.md?id=d1d7a6f35c816822fab51c820e25023863c239c1'>doc/developer-guide/write-behind.md</a></div><div class='hunk'>@@ -0,0 +1,56 @@</div><div class='add'>+performance/write-behind translator</div><div class='add'>+===================================</div><div class='add'>+</div><div class='add'>+Basic working</div><div class='add'>+--------------</div><div class='add'>+</div><div class='add'>+Write behind is basically a translator to lie to the application that the </div><div class='add'>+write-requests are finished, even before it is actually finished.</div><div class='add'>+</div><div class='add'>+On a regular translator tree without write-behind, control flow is like this:</div><div class='add'>+</div><div class='add'>+1. application makes a `write()` system call.</div><div class='add'>+2. VFS ==&gt; FUSE ==&gt; `/dev/fuse`.</div><div class='add'>+3. fuse-bridge initiates a glusterfs `writev()` call.</div><div class='add'>+4. `writev()` is `STACK_WIND()`ed up to client-protocol or storage translator.</div><div class='add'>+5. client-protocol, on receiving reply from server, starts `STACK_UNWIND()` towards the fuse-bridge.</div><div class='add'>+</div><div class='add'>+On a translator tree with write-behind, control flow is like this:</div><div class='add'>+</div><div class='add'>+1. application makes a `write()` system call.</div><div class='add'>+2. VFS ==&gt; FUSE ==&gt; `/dev/fuse`.</div><div class='add'>+3. fuse-bridge initiates a glusterfs `writev()` call.</div><div class='add'>+4. `writev()` is `STACK_WIND()`ed up to write-behind translator.</div><div class='add'>+5. write-behind adds the write buffer to its internal queue and does a `STACK_UNWIND()` towards the fuse-bridge.</div><div class='add'>+</div><div class='add'>+write call is completed in application's percepective. after </div><div class='add'>+`STACK_UNWIND()`ing towards the fuse-bridge, write-behind initiates a fresh </div><div class='add'>+writev() call to its child translator, whose replies will be consumed by </div><div class='add'>+write-behind itself. Write-behind _doesn't_ cache the write buffer, unless </div><div class='add'>+`option flush-behind on` is specified in volume specification file.</div><div class='add'>+</div><div class='add'>+Windowing</div><div class='add'>+---------</div><div class='add'>+</div><div class='add'>+With respect to write-behind, each write-buffer has three flags: `stack_wound`, `write_behind` and `got_reply`.</div><div class='add'>+</div><div class='add'>+* `stack_wound`: if set, indicates that write-behind has initiated `STACK_WIND()` towards child translator.</div><div class='add'>+* `write_behind`: if set, indicates that write-behind has done `STACK_UNWIND()` towards fuse-bridge.</div><div class='add'>+* `got_reply`: if set, indicates that write-behind has received reply from child translator for a `writev()` `STACK_WIND()`. a request will be destroyed by write-behind only if this flag is set.</div><div class='add'>+</div><div class='add'>+Currently pending write requests = aggregate size of requests with write_behind = 1 and got_reply = 0.</div><div class='add'>+</div><div class='add'>+window size limits the aggregate size of currently pending write requests. once </div><div class='add'>+the pending requests' size has reached the window size, write-behind blocks  </div><div class='add'>+writev() calls from fuse-bridge. Blocking is only from application's </div><div class='add'>+perspective. Write-behind does `STACK_WIND()` to child translator </div><div class='add'>+straight-away, but hold behind the `STACK_UNWIND()` towards fuse-bridge. </div><div class='add'>+`STACK_UNWIND()` is done only once write-behind gets enough replies to </div><div class='add'>+accommodate for currently blocked request.</div><div class='add'>+</div><div class='add'>+Flush behind</div><div class='add'>+------------</div><div class='add'>+</div><div class='add'>+If `option flush-behind on` is specified in volume specification file, then </div><div class='add'>+write-behind sends aggregate write requests to child translator, instead of </div><div class='add'>+regular per request `STACK_WIND()`s.</div><div class='head'>diff --git a/doc/developer-guide/writing-a-cloudsync-plugin.md b/doc/developer-guide/writing-a-cloudsync-plugin.md<br/>new file mode 100644<br/>index 00000000000..907860aaed8<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/doc/developer-guide/writing-a-cloudsync-plugin.md?id=d1d7a6f35c816822fab51c820e25023863c239c1'>doc/developer-guide/writing-a-cloudsync-plugin.md</a></div><div class='hunk'>@@ -0,0 +1,164 @@</div><div class='add'>+## How to write your Cloudsync Plugin</div><div class='add'>+</div><div class='add'>+### Background</div><div class='add'>+</div><div class='add'>+Cloudsync translator is part of the archival feature in Gluster. This translator</div><div class='add'>+does the retrieval/download part. Each cold  file will be archived to a remote</div><div class='add'>+storage (public or private cloud). On future access to the file, it will be</div><div class='add'>+retrieved from the remote storage by Cloudsync translator. Each remote storage</div><div class='add'>+would need a unique plugin. Cloudsync translator will load this plugin and</div><div class='add'>+call the necessary plugin functions.</div><div class='add'>+</div><div class='add'>+Upload can be done by a script or program. There are some basic mandatory steps</div><div class='add'>+for uploading the data. There is a sample script for crawl and upload given at</div><div class='add'>+the end of this guide.</div><div class='add'>+</div><div class='add'>+### Necessary changes to create a plugin</div><div class='add'>+</div><div class='add'>+1. Define store_methods:</div><div class='add'>+</div><div class='add'>+* This structure is the container of basic functions that will be called by</div><div class='add'>+  cloudsync xlator.</div><div class='add'>+</div><div class='add'>+        typedef struct store_methodds {</div><div class='add'>+                int (*fop_download) (call_frame_t *frame, void *config);</div><div class='add'>+                /* return type should be the store config */</div><div class='add'>+                void *(*fop_init) (xlator_t *this);</div><div class='add'>+                int (*fop_reconfigure) (xlator_t *this, dict_t *options);</div><div class='add'>+                void (*fop_fini) (void *config);</div><div class='add'>+        } store_methods_t;</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+        Member details:</div><div class='add'>+        fop_download:</div><div class='add'>+                This is the download function pointer.</div><div class='add'>+</div><div class='add'>+                frame: This will have the fd to write data downloaded from</div><div class='add'>+                       cloud to GlusterFS.(frame-&gt;local-&gt;fd)</div><div class='add'>+</div><div class='add'>+                config: This is the plugin configuration variable.</div><div class='add'>+</div><div class='add'>+                Note: Structure cs_local_t has member dlfd and dloffset which</div><div class='add'>+                      can be used to manage the writes to Glusterfs.</div><div class='add'>+                      Include cloudsync-common.h to access these structures.</div><div class='add'>+</div><div class='add'>+        fop_init:</div><div class='add'>+                This is similar to xlator init. But here the return value is</div><div class='add'>+                the plugin configuration pointer. This pointer will be stored</div><div class='add'>+                in the cloudsync private object (priv-&gt;stores-&gt;config). And</div><div class='add'>+                the cloudsync private object can be accessed by "this-&gt;private"</div><div class='add'>+                where "this" is of type xlator_t.</div><div class='add'>+</div><div class='add'>+        fop_reconfigure:</div><div class='add'>+                This is similar to xlator_reconfigure.</div><div class='add'>+</div><div class='add'>+        fop_fini:</div><div class='add'>+                Free plugin resources.</div><div class='add'>+</div><div class='add'>+        Note: Store_methods_t is part of cs_private_t which in turn part of</div><div class='add'>+              xlator_t. Create a store_methods_t object named "store_ops" in</div><div class='add'>+              your plugin. For example</div><div class='add'>+</div><div class='add'>+              store_methods_t store_ops = {</div><div class='add'>+                .fop_download = aws_download_s3,</div><div class='add'>+                .fop_init     = aws_init,</div><div class='add'>+                .fop_reconfigure = aws_reconfigure,</div><div class='add'>+                .fop_fini     = aws_fini,</div><div class='add'>+              };</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+2 - Making Cloudsync xlator aware of the plugin:</div><div class='add'>+</div><div class='add'>+        Add an entry in to the cs_plugin structure. For example</div><div class='add'>+        struct cs_plugin plugins[] = {</div><div class='add'>+                {</div><div class='add'>+                  .name = "amazons3",</div><div class='add'>+                  .library = "libamazons3.so",</div><div class='add'>+                  .description = "amazon s3 store."</div><div class='add'>+                },</div><div class='add'>+</div><div class='add'>+                {.name = NULL},</div><div class='add'>+        };</div><div class='add'>+</div><div class='add'>+        Description about individual members:</div><div class='add'>+                name: name of the plugin</div><div class='add'>+                library: This is the shared object created. Cloudsync will load</div><div class='add'>+                         this library during init.</div><div class='add'>+                description: Describe about the plugin.</div><div class='add'>+</div><div class='add'>+3- Makefile Changes in Cloudsync:</div><div class='add'>+</div><div class='add'>+		Add &lt;plugin.la&gt; to cloudsync_la_LIBADD variable.</div><div class='add'>+</div><div class='add'>+4 - Configure.ac changes:</div><div class='add'>+</div><div class='add'>+                In cloudsync section add the necessary dependency checks for</div><div class='add'>+                the plugin.</div><div class='add'>+</div><div class='add'>+5 - Export symbols:</div><div class='add'>+</div><div class='add'>+        Cloudsync needs "store_ops" to resolve all plugin functions.</div><div class='add'>+        Create a file &lt;plugin&gt;.sym and add write "store_ops" to it.</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+### Sample script for upload</div><div class='add'>+This script assumes amazon s3 is the target cloud and bucket name is</div><div class='add'>+gluster-bucket. User can do necessary aws configuration using command</div><div class='add'>+"aws configure". Currently for amazons3 there are four gluster settings</div><div class='add'>+available.</div><div class='add'>+1- features.s3plugin-seckey -&gt; s3 secret key</div><div class='add'>+2- features.s3plugin-keyid -&gt; s3 key id</div><div class='add'>+3- features.s3plugin-bucketid -&gt; bucketid</div><div class='add'>+4- features.s3plugin-hostname -&gt; hostname e.g. s3.amazonaws.com</div><div class='add'>+</div><div class='add'>+Additionally set cloudsync storetype to amazons3.</div><div class='add'>+</div><div class='add'>+gluster v set &lt;VOLNAME&gt; cloudsync-storetype amazons3</div><div class='add'>+</div><div class='add'>+Now create a mount dedicated for this upload task.</div><div class='add'>+</div><div class='add'>+That covers necessary configurations needed.</div><div class='add'>+</div><div class='add'>+Below is the sample script for upload. The script will crawl directly on the</div><div class='add'>+brick and will upload those files which are not modified for last one month.</div><div class='add'>+It needs two arguments.</div><div class='add'>+1st arguement - Gluster Brick path</div><div class='add'>+2nd arguement - coldness that is how many days since the file was modified.</div><div class='add'>+3rd argument - dedicated gluster mount point created for uploading.</div><div class='add'>+</div><div class='add'>+Once the cloud setup is done, run the following script on individual bricks.</div><div class='add'>+Note: For an AFR volume, pick only the fully synchronized brick among the</div><div class='add'>+replica bricks.</div><div class='add'>+</div><div class='add'>+```</div><div class='add'>+target_folder=$1</div><div class='add'>+coldness=$2</div><div class='add'>+mnt=$3</div><div class='add'>+</div><div class='add'>+cd $target_folder</div><div class='add'>+for i in `find . -type f  | grep -v "glusterfs" | sed 's/..//'`</div><div class='add'>+do</div><div class='add'>+        echo "processing $mnt/$i"</div><div class='add'>+</div><div class='add'>+        #check whether the file is already archived</div><div class='add'>+        getfattr -n trusted.glusterfs.cs.remote $i &amp;&gt; /dev/null</div><div class='add'>+        if [ $? -eq 0 ]</div><div class='add'>+        then</div><div class='add'>+                echo "file $mnt/$i is already archived"</div><div class='add'>+        else</div><div class='add'>+                #upload to cloud</div><div class='add'>+                aws s3 cp $mnt/$i s3://gluster-bucket/</div><div class='add'>+                mtime=`stat -c "%Y" $mnt/$i`</div><div class='add'>+</div><div class='add'>+                #post processing of upload</div><div class='add'>+                setfattr -n trusted.glusterfs.csou.complete -v $mtime $mnt/$i</div><div class='add'>+                if [ $? -ne 0 ]</div><div class='add'>+                then</div><div class='add'>+                        echo "archiving of file $mnt/$i failed"</div><div class='add'>+                else</div><div class='add'>+                        echo "archiving of file $mnt/$i succeeded"</div><div class='add'>+                fi</div><div class='add'>+</div><div class='add'>+        fi</div><div class='add'>+done</div><div class='add'>+```</div><div class='head'>diff --git a/doc/developer-guide/xlator-classification.md b/doc/developer-guide/xlator-classification.md<br/>new file mode 100644<br/>index 00000000000..6073df9375f<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/doc/developer-guide/xlator-classification.md?id=d1d7a6f35c816822fab51c820e25023863c239c1'>doc/developer-guide/xlator-classification.md</a></div><div class='hunk'>@@ -0,0 +1,221 @@</div><div class='add'>+# xlator categories and expectations</div><div class='add'>+</div><div class='add'>+The purpose of the document is to define a category for various xlators</div><div class='add'>+and expectations around what each category means from a perspective of</div><div class='add'>+health and maintenance of a xlator.</div><div class='add'>+</div><div class='add'>+The need to do this is to ensure certain categories are kept in good</div><div class='add'>+health, and helps the community and contributors focus their efforts around the</div><div class='add'>+same.</div><div class='add'>+</div><div class='add'>+This document also provides implementation details for xlator developers to</div><div class='add'>+declare a category for any xlator.</div><div class='add'>+</div><div class='add'>+## Table of contents</div><div class='add'>+1. Audience</div><div class='add'>+2. Categories (and expectations of each category)</div><div class='add'>+3. Implementation and usage details</div><div class='add'>+</div><div class='add'>+## Audience</div><div class='add'>+</div><div class='add'>+This document is intended for the following community participants,</div><div class='add'>+- New xlator contributors</div><div class='add'>+- Existing xlator maintainers</div><div class='add'>+- Packaging and gluster management stack maintainers</div><div class='add'>+</div><div class='add'>+For a more user facing understanding it is recommended to read section (TBD)</div><div class='add'>+in the gluster documentation.</div><div class='add'>+</div><div class='add'>+## Categories</div><div class='add'>+1. Experimental (E)</div><div class='add'>+2. TechPreview  (TP)</div><div class='add'>+3. Maintained (M)</div><div class='add'>+4. Deprecated (D)</div><div class='add'>+5. Obsolete (O)</div><div class='add'>+</div><div class='add'>+### Experimental (E)</div><div class='add'>+</div><div class='add'>+Developed in the experimental branch, for exploring new features. These xlators</div><div class='add'>+are NEVER packaged as a part of releases, interested users and contributors can</div><div class='add'>+build and work with these from sources. In the future, these maybe available as</div><div class='add'>+an package based on a weekly build of the same.</div><div class='add'>+</div><div class='add'>+#### Quality expectations</div><div class='add'>+- Compiles or passes smoke tests</div><div class='add'>+- Does not break nightly experimental regressions</div><div class='add'>+  - NOTE: If a nightly is broken, then all patches that were merged are reverted</div><div class='add'>+  till the errant patch is found and subsequently fixed</div><div class='add'>+</div><div class='add'>+### TechPreview (TP)</div><div class='add'>+</div><div class='add'>+Xlators in master or release branches that are not deemed fit to be in</div><div class='add'>+production deployments, but are feature complete to invite feedback and host</div><div class='add'>+user data.</div><div class='add'>+</div><div class='add'>+These xlators will be worked upon with priority by maintainers/authors who are</div><div class='add'>+involved in making them more stable than xlators in the Experimental/Deprecated/</div><div class='add'>+Obsolete categories.</div><div class='add'>+</div><div class='add'>+There is no guarantee that these xlators will move to the Maintained state, and</div><div class='add'>+may just get Obsoleted based on feedback, or other project goals or technical</div><div class='add'>+alternatives.</div><div class='add'>+</div><div class='add'>+#### Quality expectations</div><div class='add'>+- Same as Maintained, minus</div><div class='add'>+  - Performance, Scale, other(?)</div><div class='add'>+  - *TBD* *NOTE* Need inputs, Intention is all quality goals as in Maintained,</div><div class='add'>+  other than the list above (which for now has scale and performance)</div><div class='add'>+</div><div class='add'>+### Maintained (M)</div><div class='add'>+</div><div class='add'>+These xltors are part of the core Gluster functionality and are maintained</div><div class='add'>+actively. These are part of master and release branches and are higher in</div><div class='add'>+priority of maintainers and other interested contributors.</div><div class='add'>+</div><div class='add'>+#### Quality expectations</div><div class='add'>+</div><div class='add'>+NOTE: A short note on what each of these mean are added here, details to follow.</div><div class='add'>+</div><div class='add'>+NOTE: Out of the gate all of the following are not mandated, consider the</div><div class='add'>+following a desirable state to reach as we progress on each</div><div class='add'>+</div><div class='add'>+- Bug backlog: Actively address bug backlog</div><div class='add'>+- Enhancement backlog: Actively maintain outstanding enhancement backlog (need</div><div class='add'>+        not be acted on, but should be visible to all)</div><div class='add'>+- Review backlog: Actively keep this below desired counts and states</div><div class='add'>+- Static code health:  Actively meet near-zero issues in this regard</div><div class='add'>+  - Coverity, spellcheck and other checks</div><div class='add'>+- Runtime code health: Actively meet defined coverage levels in this regard</div><div class='add'>+  - Coverage, others?</div><div class='add'>+  - Per-patch regressions</div><div class='add'>+  - Glusto runs</div><div class='add'>+  - Performance</div><div class='add'>+  - Scalability</div><div class='add'>+- Technical specifications: Implementation details should be documented and</div><div class='add'>+        updated at regular cadence (even per patch that change assumptions in</div><div class='add'>+        here)</div><div class='add'>+- User documentation: User facing details should be maintained to current</div><div class='add'>+        status in the documentation</div><div class='add'>+- Debuggability: Steps, tools, procedures should be documented and maintained</div><div class='add'>+        each release/patch as applicable</div><div class='add'>+- Troubleshooting: Steps, tools, procedures should be documented and maintained</div><div class='add'>+        each release/patch as applicable</div><div class='add'>+  - Steps/guides for self service</div><div class='add'>+  - Knowledge base for problems</div><div class='add'>+- Other common criteria that will apply: Required metrics/desired states to be</div><div class='add'>+        defined per criteria</div><div class='add'>+  - Monitoring, usability, statedump, and other such xlator expectations</div><div class='add'>+</div><div class='add'>+### Deprecated (D)</div><div class='add'>+</div><div class='add'>+Xlators on master or release branches that would be obsoleted and/or replaced</div><div class='add'>+with similar or other functionality in the next major release.</div><div class='add'>+</div><div class='add'>+#### Quality expectations</div><div class='add'>+- Retain status-quo when moved to this state, till it is moved to obsoleted</div><div class='add'>+- Provide migration steps if feature provided by the xlator is replaced with</div><div class='add'>+other xlators</div><div class='add'>+</div><div class='add'>+### Obsolete (O)</div><div class='add'>+</div><div class='add'>+Xlator/code still in tree, but not packaged or shipped or maintained in any</div><div class='add'>+form. This is noted as a category till the code is removed from the tree.</div><div class='add'>+</div><div class='add'>+These xlators and their corresponding code and test health will not be executed.</div><div class='add'>+</div><div class='add'>+#### Quality expectations</div><div class='add'>+- None</div><div class='add'>+</div><div class='add'>+## Implementation and usage details</div><div class='add'>+</div><div class='add'>+### How to specify an xlators category</div><div class='add'>+</div><div class='add'>+While defining 'xlator_api_t' structure for the corresponding xlator, add a</div><div class='add'>+flag like below:</div><div class='add'>+</div><div class='add'>+```</div><div class='add'>+diff --git a/xlators/performance/nl-cache/src/nl-cache.c b/xlators/performance/nl-cache/src/nl-cache.c</div><div class='add'>+index 0f0e53bac2..8267d6897c 100644</div><div class='add'>+--- a/xlators/performance/nl-cache/src/nl-cache.c</div><div class='add'>++++ b/xlators/performance/nl-cache/src/nl-cache.c</div><div class='add'>+@@ -869,4 +869,5 @@ xlator_api_t xlator_api = {</div><div class='add'>+         .cbks          = &amp;nlc_cbks,</div><div class='add'>+         .options       = nlc_options,</div><div class='add'>+         .identifier    = "nl-cache",</div><div class='add'>++        .category      = GF_TECH_PREVIEW,</div><div class='add'>+ };</div><div class='add'>+diff --git a/xlators/performance/quick-read/src/quick-read.c b/xlators/performance/quick-read/src/quick-read.c</div><div class='add'>+index 8d39720e7f..235de27c19 100644</div><div class='add'>+--- a/xlators/performance/quick-read/src/quick-read.c</div><div class='add'>++++ b/xlators/performance/quick-read/src/quick-read.c</div><div class='add'>+@@ -1702,4 +1702,5 @@ xlator_api_t xlator_api = {</div><div class='add'>+         .cbks          = &amp;qr_cbks,</div><div class='add'>+         .options       = qr_options,</div><div class='add'>+         .identifier    = "quick-read",</div><div class='add'>++        .category      = GF_MAINTAINED,</div><div class='add'>+ };</div><div class='add'>+```</div><div class='add'>+</div><div class='add'>+Similarly, if a particular option is in different state other than</div><div class='add'>+the xlator state, one can add the same flag in options structure too.</div><div class='add'>+</div><div class='add'>+```</div><div class='add'>+diff --git a/xlators/cluster/afr/src/afr.c b/xlators/cluster/afr/src/afr.c</div><div class='add'>+index 0e86e33d03..81996743d1 100644</div><div class='add'>+--- a/xlators/cluster/afr/src/afr.c</div><div class='add'>++++ b/xlators/cluster/afr/src/afr.c</div><div class='add'>+@@ -772,6 +772,7 @@ struct volume_options options[] = {</div><div class='add'>+           .description = "Maximum latency for shd halo replication in msec."</div><div class='add'>+         },</div><div class='add'>+         { .key   = {"halo-enabled"},</div><div class='add'>++          .category = GF_TECH_PREVIEW,</div><div class='add'>+           .type  = GF_OPTION_TYPE_BOOL,</div><div class='add'>+           .default_value = "False",</div><div class='add'>+</div><div class='add'>+```</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+### User experience using the categories</div><div class='add'>+</div><div class='add'>+#### Ability to use a category</div><div class='add'>+</div><div class='add'>+This section details which category of xlators can be used when and specifics</div><div class='add'>+around when each category is enabled.</div><div class='add'>+</div><div class='add'>+1. Maintained category xlators can be used by default, this implies, volumes</div><div class='add'>+created with these xlators enabled will throw no warnings, or need no user</div><div class='add'>+intervention to use the xlator.</div><div class='add'>+</div><div class='add'>+2. Tech Preview category xlators needs cluster configuration changes to allow</div><div class='add'>+these xlatorss to be used in volumes, further, logs will contain a message</div><div class='add'>+stating TP xlators are in use. Without the cluster configured to allow TP</div><div class='add'>+xlators, volumes created or edited to use such xlators would result in errors.</div><div class='add'>+  - (TBD) Cluster configuration option</div><div class='add'>+  - (TBD) Warning message</div><div class='add'>+  - (TBD) Code mechanics on how this is achieved</div><div class='add'>+</div><div class='add'>+3. Deprecated category xlators can be used by default, but will throw a warning</div><div class='add'>+in the logs that such are in use and will be deprecated in the future.</div><div class='add'>+  - (TBD) Warning message</div><div class='add'>+</div><div class='add'>+4. Obsolete category xlators will not be packaged and hence cannot be used from</div><div class='add'>+release builds.</div><div class='add'>+</div><div class='add'>+5. Experimental category xlators will not be packaged and hence cannot be used</div><div class='add'>+from release builds, if running experimental (weekly or other such) builds,</div><div class='add'>+these will throw a warning in the logs stating experimental xlators are in use.</div><div class='add'>+  - (TBD) Warning message</div><div class='add'>+</div><div class='add'>+#### Ability to query xlator category</div><div class='add'>+</div><div class='add'>+(TBD) Need to provide the ability to query xlator categories, or list xlators</div><div class='add'>+and their respective categories.</div><div class='add'>+</div><div class='add'>+#### User facing changes</div><div class='add'>+</div><div class='add'>+User facing changes that are expected due to this change include the following,</div><div class='add'>+- Cluster wide option to enable TP xlators, or more generically a category</div><div class='add'>+level of xlators</div><div class='add'>+- Errors in commands that fail due to invalid categories</div><div class='add'>+- Warning messages in logs to denote certain categories of xlators are in use</div><div class='add'>+- (TBD) Ability to query xlators and their respective categories</div><div class='head'>diff --git a/doc/errno.list.bsd.txt b/doc/errno.list.bsd.txt<br/>deleted file mode 100644<br/>index 350af25e4ab..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/doc/errno.list.bsd.txt?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>doc/errno.list.bsd.txt</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,376 +0,0 @@</div><div class='del'>-/*-</div><div class='del'>- * Copyright (c) 1982, 1986, 1989, 1993</div><div class='del'>- *	The Regents of the University of California.  All rights reserved.</div><div class='del'>- * (c) UNIX System Laboratories, Inc.</div><div class='del'>- * All or some portions of this file are derived from material licensed</div><div class='del'>- * to the University of California by American Telephone and Telegraph</div><div class='del'>- * Co. or Unix System Laboratories, Inc. and are reproduced herein with</div><div class='del'>- * the permission of UNIX System Laboratories, Inc.</div><div class='del'>- *</div><div class='del'>- * Redistribution and use in source and binary forms, with or without</div><div class='del'>- * modification, are permitted provided that the following conditions</div><div class='del'>- * are met:</div><div class='del'>- * 1. Redistributions of source code must retain the above copyright</div><div class='del'>- *    notice, this list of conditions and the following disclaimer.</div><div class='del'>- * 2. Redistributions in binary form must reproduce the above copyright</div><div class='del'>- *    notice, this list of conditions and the following disclaimer in the</div><div class='del'>- *    documentation and/or other materials provided with the distribution.</div><div class='del'>- * 4. Neither the name of the University nor the names of its contributors</div><div class='del'>- *    may be used to endorse or promote products derived from this software</div><div class='del'>- *    without specific prior written permission.</div><div class='del'>- *</div><div class='del'>- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND</div><div class='del'>- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE</div><div class='del'>- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE</div><div class='del'>- * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE</div><div class='del'>- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL</div><div class='del'>- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS</div><div class='del'>- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)</div><div class='del'>- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT</div><div class='del'>- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY</div><div class='del'>- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF</div><div class='del'>- * SUCH DAMAGE.</div><div class='del'>- *</div><div class='del'>- *	@(#)errno.h	8.5 (Berkeley) 1/21/94</div><div class='del'>- * $FreeBSD: src/sys/sys/errno.h,v 1.28 2005/04/02 12:33:28 das Exp $</div><div class='del'>- */</div><div class='del'>-</div><div class='del'>-#ifndef _SYS_ERRNO_H_</div><div class='del'>-#define _SYS_ERRNO_H_</div><div class='del'>-</div><div class='del'>-#ifndef _KERNEL</div><div class='del'>-#include &lt;sys/cdefs.h&gt;</div><div class='del'>-__BEGIN_DECLS</div><div class='del'>-int *	__error(void);</div><div class='del'>-__END_DECLS</div><div class='del'>-#define	errno		(* __error())</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-#define	EPERM		1		/* Operation not permitted */</div><div class='del'>-#define	ENOENT		2		/* No such file or directory */</div><div class='del'>-#define	ESRCH		3		/* No such process */</div><div class='del'>-#define	EINTR		4		/* Interrupted system call */</div><div class='del'>-#define	EIO		5		/* Input/output error */</div><div class='del'>-#define	ENXIO		6		/* Device not configured */</div><div class='del'>-#define	E2BIG		7		/* Argument list too long */</div><div class='del'>-#define	ENOEXEC		8		/* Exec format error */</div><div class='del'>-#define	EBADF		9		/* Bad file descriptor */</div><div class='del'>-#define	ECHILD		10		/* No child processes */</div><div class='del'>-#define	EDEADLK		11		/* Resource deadlock avoided */</div><div class='del'>-					/* 11 was EAGAIN */</div><div class='del'>-#define	ENOMEM		12		/* Cannot allocate memory */</div><div class='del'>-#define	EACCES		13		/* Permission denied */</div><div class='del'>-#define	EFAULT		14		/* Bad address */</div><div class='del'>-#ifndef _POSIX_SOURCE</div><div class='del'>-#define	ENOTBLK		15		/* Block device required */</div><div class='del'>-#endif</div><div class='del'>-#define	EBUSY		16		/* Device busy */</div><div class='del'>-#define	EEXIST		17		/* File exists */</div><div class='del'>-#define	EXDEV		18		/* Cross-device link */</div><div class='del'>-#define	ENODEV		19		/* Operation not supported by device */</div><div class='del'>-#define	ENOTDIR		20		/* Not a directory */</div><div class='del'>-#define	EISDIR		21		/* Is a directory */</div><div class='del'>-#define	EINVAL		22		/* Invalid argument */</div><div class='del'>-#define	ENFILE		23		/* Too many open files in system */</div><div class='del'>-#define	EMFILE		24		/* Too many open files */</div><div class='del'>-#define	ENOTTY		25		/* Inappropriate ioctl for device */</div><div class='del'>-#ifndef _POSIX_SOURCE</div><div class='del'>-#define	ETXTBSY		26		/* Text file busy */</div><div class='del'>-#endif</div><div class='del'>-#define	EFBIG		27		/* File too large */</div><div class='del'>-#define	ENOSPC		28		/* No space left on device */</div><div class='del'>-#define	ESPIPE		29		/* Illegal seek */</div><div class='del'>-#define	EROFS		30		/* Read-only filesystem */</div><div class='del'>-#define	EMLINK		31		/* Too many links */</div><div class='del'>-#define	EPIPE		32		/* Broken pipe */</div><div class='del'>-</div><div class='del'>-/* math software */</div><div class='del'>-#define	EDOM		33		/* Numerical argument out of domain */</div><div class='del'>-#define	ERANGE		34		/* Result too large */</div><div class='del'>-</div><div class='del'>-/* non-blocking and interrupt i/o */</div><div class='del'>-#define	EAGAIN		35		/* Resource temporarily unavailable */</div><div class='del'>-#ifndef _POSIX_SOURCE</div><div class='del'>-#define	EWOULDBLOCK	EAGAIN		/* Operation would block */</div><div class='del'>-#define	EINPROGRESS	36		/* Operation now in progress */</div><div class='del'>-#define	EALREADY	37		/* Operation already in progress */</div><div class='del'>-</div><div class='del'>-/* ipc/network software -- argument errors */</div><div class='del'>-#define	ENOTSOCK	38		/* Socket operation on non-socket */</div><div class='del'>-#define	EDESTADDRREQ	39		/* Destination address required */</div><div class='del'>-#define	EMSGSIZE	40		/* Message too long */</div><div class='del'>-#define	EPROTOTYPE	41		/* Protocol wrong type for socket */</div><div class='del'>-#define	ENOPROTOOPT	42		/* Protocol not available */</div><div class='del'>-#define	EPROTONOSUPPORT	43		/* Protocol not supported */</div><div class='del'>-#define	ESOCKTNOSUPPORT	44		/* Socket type not supported */</div><div class='del'>-#define	EOPNOTSUPP	45		/* Operation not supported */</div><div class='del'>-#define	ENOTSUP		EOPNOTSUPP	/* Operation not supported */</div><div class='del'>-#define	EPFNOSUPPORT	46		/* Protocol family not supported */</div><div class='del'>-#define	EAFNOSUPPORT	47		/* Address family not supported by protocol family */</div><div class='del'>-#define	EADDRINUSE	48		/* Address already in use */</div><div class='del'>-#define	EADDRNOTAVAIL	49		/* Can't assign requested address */</div><div class='del'>-</div><div class='del'>-/* ipc/network software -- operational errors */</div><div class='del'>-#define	ENETDOWN	50		/* Network is down */</div><div class='del'>-#define	ENETUNREACH	51		/* Network is unreachable */</div><div class='del'>-#define	ENETRESET	52		/* Network dropped connection on reset */</div><div class='del'>-#define	ECONNABORTED	53		/* Software caused connection abort */</div><div class='del'>-#define	ECONNRESET	54		/* Connection reset by peer */</div><div class='del'>-#define	ENOBUFS		55		/* No buffer space available */</div><div class='del'>-#define	EISCONN		56		/* Socket is already connected */</div><div class='del'>-#define	ENOTCONN	57		/* Socket is not connected */</div><div class='del'>-#define	ESHUTDOWN	58		/* Can't send after socket shutdown */</div><div class='del'>-#define	ETOOMANYREFS	59		/* Too many references: can't splice */</div><div class='del'>-#define	ETIMEDOUT	60		/* Operation timed out */</div><div class='del'>-#define	ECONNREFUSED	61		/* Connection refused */</div><div class='del'>-</div><div class='del'>-#define	ELOOP		62		/* Too many levels of symbolic links */</div><div class='del'>-#endif /* _POSIX_SOURCE */</div><div class='del'>-#define	ENAMETOOLONG	63		/* File name too long */</div><div class='del'>-</div><div class='del'>-/* should be rearranged */</div><div class='del'>-#ifndef _POSIX_SOURCE</div><div class='del'>-#define	EHOSTDOWN	64		/* Host is down */</div><div class='del'>-#define	EHOSTUNREACH	65		/* No route to host */</div><div class='del'>-#endif /* _POSIX_SOURCE */</div><div class='del'>-#define	ENOTEMPTY	66		/* Directory not empty */</div><div class='del'>-</div><div class='del'>-/* quotas &amp; mush */</div><div class='del'>-#ifndef _POSIX_SOURCE</div><div class='del'>-#define	EPROCLIM	67		/* Too many processes */</div><div class='del'>-#define	EUSERS		68		/* Too many users */</div><div class='del'>-#define	EDQUOT		69		/* Disc quota exceeded */</div><div class='del'>-</div><div class='del'>-/* Network File System */</div><div class='del'>-#define	ESTALE		70		/* Stale NFS file handle */</div><div class='del'>-#define	EREMOTE		71		/* Too many levels of remote in path */</div><div class='del'>-#define	EBADRPC		72		/* RPC struct is bad */</div><div class='del'>-#define	ERPCMISMATCH	73		/* RPC version wrong */</div><div class='del'>-#define	EPROGUNAVAIL	74		/* RPC prog. not avail */</div><div class='del'>-#define	EPROGMISMATCH	75		/* Program version wrong */</div><div class='del'>-#define	EPROCUNAVAIL	76		/* Bad procedure for program */</div><div class='del'>-#endif /* _POSIX_SOURCE */</div><div class='del'>-</div><div class='del'>-#define	ENOLCK		77		/* No locks available */</div><div class='del'>-#define	ENOSYS		78		/* Function not implemented */</div><div class='del'>-</div><div class='del'>-#ifndef _POSIX_SOURCE</div><div class='del'>-#define	EFTYPE		79		/* Inappropriate file type or format */</div><div class='del'>-#define	EAUTH		80		/* Authentication error */</div><div class='del'>-#define	ENEEDAUTH	81		/* Need authenticator */</div><div class='del'>-#define	EIDRM		82		/* Identifier removed */</div><div class='del'>-#define	ENOMSG		83		/* No message of desired type */</div><div class='del'>-#define	EOVERFLOW	84		/* Value too large to be stored in data type */</div><div class='del'>-#define	ECANCELED	85		/* Operation canceled */</div><div class='del'>-#define	EILSEQ		86		/* Illegal byte sequence */</div><div class='del'>-#define	ENOATTR		87		/* Attribute not found */</div><div class='del'>-</div><div class='del'>-#define EDOOFUS		88		/* Programming error */</div><div class='del'>-#endif /* _POSIX_SOURCE */</div><div class='del'>-</div><div class='del'>-#define	EBADMSG		89		/* Bad message */</div><div class='del'>-#define	EMULTIHOP	90		/* Multihop attempted */</div><div class='del'>-#define	ENOLINK		91		/* Link has been severed */</div><div class='del'>-#define	EPROTO		92		/* Protocol error */</div><div class='del'>-</div><div class='del'>-#ifndef _POSIX_SOURCE</div><div class='del'>-#define	ELAST		92		/* Must be equal largest errno */</div><div class='del'>-#endif /* _POSIX_SOURCE */</div><div class='del'>-</div><div class='del'>-#ifdef _KERNEL</div><div class='del'>-/* pseudo-errors returned inside kernel to modify return to process */</div><div class='del'>-#define	ERESTART	(-1)		/* restart syscall */</div><div class='del'>-#define	EJUSTRETURN	(-2)		/* don't modify regs, just return */</div><div class='del'>-#define	ENOIOCTL	(-3)		/* ioctl not handled by this layer */</div><div class='del'>-#define	EDIRIOCTL	(-4)		/* do direct ioctl in GEOM */</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-#endif</div><div class='del'>-/*-</div><div class='del'>- * Copyright (c) 1982, 1986, 1989, 1993</div><div class='del'>- *	The Regents of the University of California.  All rights reserved.</div><div class='del'>- * (c) UNIX System Laboratories, Inc.</div><div class='del'>- * All or some portions of this file are derived from material licensed</div><div class='del'>- * to the University of California by American Telephone and Telegraph</div><div class='del'>- * Co. or Unix System Laboratories, Inc. and are reproduced herein with</div><div class='del'>- * the permission of UNIX System Laboratories, Inc.</div><div class='del'>- *</div><div class='del'>- * Redistribution and use in source and binary forms, with or without</div><div class='del'>- * modification, are permitted provided that the following conditions</div><div class='del'>- * are met:</div><div class='del'>- * 1. Redistributions of source code must retain the above copyright</div><div class='del'>- *    notice, this list of conditions and the following disclaimer.</div><div class='del'>- * 2. Redistributions in binary form must reproduce the above copyright</div><div class='del'>- *    notice, this list of conditions and the following disclaimer in the</div><div class='del'>- *    documentation and/or other materials provided with the distribution.</div><div class='del'>- * 4. Neither the name of the University nor the names of its contributors</div><div class='del'>- *    may be used to endorse or promote products derived from this software</div><div class='del'>- *    without specific prior written permission.</div><div class='del'>- *</div><div class='del'>- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND</div><div class='del'>- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE</div><div class='del'>- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE</div><div class='del'>- * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE</div><div class='del'>- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL</div><div class='del'>- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS</div><div class='del'>- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)</div><div class='del'>- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT</div><div class='del'>- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY</div><div class='del'>- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF</div><div class='del'>- * SUCH DAMAGE.</div><div class='del'>- *</div><div class='del'>- *	@(#)errno.h	8.5 (Berkeley) 1/21/94</div><div class='del'>- * $FreeBSD: src/sys/sys/errno.h,v 1.28 2005/04/02 12:33:28 das Exp $</div><div class='del'>- */</div><div class='del'>-</div><div class='del'>-#ifndef _SYS_ERRNO_H_</div><div class='del'>-#define _SYS_ERRNO_H_</div><div class='del'>-</div><div class='del'>-#ifndef _KERNEL</div><div class='del'>-#include &lt;sys/cdefs.h&gt;</div><div class='del'>-__BEGIN_DECLS</div><div class='del'>-int *	__error(void);</div><div class='del'>-__END_DECLS</div><div class='del'>-#define	errno		(* __error())</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-#define	EPERM		1		/* Operation not permitted */</div><div class='del'>-#define	ENOENT		2		/* No such file or directory */</div><div class='del'>-#define	ESRCH		3		/* No such process */</div><div class='del'>-#define	EINTR		4		/* Interrupted system call */</div><div class='del'>-#define	EIO		5		/* Input/output error */</div><div class='del'>-#define	ENXIO		6		/* Device not configured */</div><div class='del'>-#define	E2BIG		7		/* Argument list too long */</div><div class='del'>-#define	ENOEXEC		8		/* Exec format error */</div><div class='del'>-#define	EBADF		9		/* Bad file descriptor */</div><div class='del'>-#define	ECHILD		10		/* No child processes */</div><div class='del'>-#define	EDEADLK		11		/* Resource deadlock avoided */</div><div class='del'>-					/* 11 was EAGAIN */</div><div class='del'>-#define	ENOMEM		12		/* Cannot allocate memory */</div><div class='del'>-#define	EACCES		13		/* Permission denied */</div><div class='del'>-#define	EFAULT		14		/* Bad address */</div><div class='del'>-#ifndef _POSIX_SOURCE</div><div class='del'>-#define	ENOTBLK		15		/* Block device required */</div><div class='del'>-#endif</div><div class='del'>-#define	EBUSY		16		/* Device busy */</div><div class='del'>-#define	EEXIST		17		/* File exists */</div><div class='del'>-#define	EXDEV		18		/* Cross-device link */</div><div class='del'>-#define	ENODEV		19		/* Operation not supported by device */</div><div class='del'>-#define	ENOTDIR		20		/* Not a directory */</div><div class='del'>-#define	EISDIR		21		/* Is a directory */</div><div class='del'>-#define	EINVAL		22		/* Invalid argument */</div><div class='del'>-#define	ENFILE		23		/* Too many open files in system */</div><div class='del'>-#define	EMFILE		24		/* Too many open files */</div><div class='del'>-#define	ENOTTY		25		/* Inappropriate ioctl for device */</div><div class='del'>-#ifndef _POSIX_SOURCE</div><div class='del'>-#define	ETXTBSY		26		/* Text file busy */</div><div class='del'>-#endif</div><div class='del'>-#define	EFBIG		27		/* File too large */</div><div class='del'>-#define	ENOSPC		28		/* No space left on device */</div><div class='del'>-#define	ESPIPE		29		/* Illegal seek */</div><div class='del'>-#define	EROFS		30		/* Read-only filesystem */</div><div class='del'>-#define	EMLINK		31		/* Too many links */</div><div class='del'>-#define	EPIPE		32		/* Broken pipe */</div><div class='del'>-</div><div class='del'>-/* math software */</div><div class='del'>-#define	EDOM		33		/* Numerical argument out of domain */</div><div class='del'>-#define	ERANGE		34		/* Result too large */</div><div class='del'>-</div><div class='del'>-/* non-blocking and interrupt i/o */</div><div class='del'>-#define	EAGAIN		35		/* Resource temporarily unavailable */</div><div class='del'>-#ifndef _POSIX_SOURCE</div><div class='del'>-#define	EWOULDBLOCK	EAGAIN		/* Operation would block */</div><div class='del'>-#define	EINPROGRESS	36		/* Operation now in progress */</div><div class='del'>-#define	EALREADY	37		/* Operation already in progress */</div><div class='del'>-</div><div class='del'>-/* ipc/network software -- argument errors */</div><div class='del'>-#define	ENOTSOCK	38		/* Socket operation on non-socket */</div><div class='del'>-#define	EDESTADDRREQ	39		/* Destination address required */</div><div class='del'>-#define	EMSGSIZE	40		/* Message too long */</div><div class='del'>-#define	EPROTOTYPE	41		/* Protocol wrong type for socket */</div><div class='del'>-#define	ENOPROTOOPT	42		/* Protocol not available */</div><div class='del'>-#define	EPROTONOSUPPORT	43		/* Protocol not supported */</div><div class='del'>-#define	ESOCKTNOSUPPORT	44		/* Socket type not supported */</div><div class='del'>-#define	EOPNOTSUPP	45		/* Operation not supported */</div><div class='del'>-#define	ENOTSUP		EOPNOTSUPP	/* Operation not supported */</div><div class='del'>-#define	EPFNOSUPPORT	46		/* Protocol family not supported */</div><div class='del'>-#define	EAFNOSUPPORT	47		/* Address family not supported by protocol family */</div><div class='del'>-#define	EADDRINUSE	48		/* Address already in use */</div><div class='del'>-#define	EADDRNOTAVAIL	49		/* Can't assign requested address */</div><div class='del'>-</div><div class='del'>-/* ipc/network software -- operational errors */</div><div class='del'>-#define	ENETDOWN	50		/* Network is down */</div><div class='del'>-#define	ENETUNREACH	51		/* Network is unreachable */</div><div class='del'>-#define	ENETRESET	52		/* Network dropped connection on reset */</div><div class='del'>-#define	ECONNABORTED	53		/* Software caused connection abort */</div><div class='del'>-#define	ECONNRESET	54		/* Connection reset by peer */</div><div class='del'>-#define	ENOBUFS		55		/* No buffer space available */</div><div class='del'>-#define	EISCONN		56		/* Socket is already connected */</div><div class='del'>-#define	ENOTCONN	57		/* Socket is not connected */</div><div class='del'>-#define	ESHUTDOWN	58		/* Can't send after socket shutdown */</div><div class='del'>-#define	ETOOMANYREFS	59		/* Too many references: can't splice */</div><div class='del'>-#define	ETIMEDOUT	60		/* Operation timed out */</div><div class='del'>-#define	ECONNREFUSED	61		/* Connection refused */</div><div class='del'>-</div><div class='del'>-#define	ELOOP		62		/* Too many levels of symbolic links */</div><div class='del'>-#endif /* _POSIX_SOURCE */</div><div class='del'>-#define	ENAMETOOLONG	63		/* File name too long */</div><div class='del'>-</div><div class='del'>-/* should be rearranged */</div><div class='del'>-#ifndef _POSIX_SOURCE</div><div class='del'>-#define	EHOSTDOWN	64		/* Host is down */</div><div class='del'>-#define	EHOSTUNREACH	65		/* No route to host */</div><div class='del'>-#endif /* _POSIX_SOURCE */</div><div class='del'>-#define	ENOTEMPTY	66		/* Directory not empty */</div><div class='del'>-</div><div class='del'>-/* quotas &amp; mush */</div><div class='del'>-#ifndef _POSIX_SOURCE</div><div class='del'>-#define	EPROCLIM	67		/* Too many processes */</div><div class='del'>-#define	EUSERS		68		/* Too many users */</div><div class='del'>-#define	EDQUOT		69		/* Disc quota exceeded */</div><div class='del'>-</div><div class='del'>-/* Network File System */</div><div class='del'>-#define	ESTALE		70		/* Stale NFS file handle */</div><div class='del'>-#define	EREMOTE		71		/* Too many levels of remote in path */</div><div class='del'>-#define	EBADRPC		72		/* RPC struct is bad */</div><div class='del'>-#define	ERPCMISMATCH	73		/* RPC version wrong */</div><div class='del'>-#define	EPROGUNAVAIL	74		/* RPC prog. not avail */</div><div class='del'>-#define	EPROGMISMATCH	75		/* Program version wrong */</div><div class='del'>-#define	EPROCUNAVAIL	76		/* Bad procedure for program */</div><div class='del'>-#endif /* _POSIX_SOURCE */</div><div class='del'>-</div><div class='del'>-#define	ENOLCK		77		/* No locks available */</div><div class='del'>-#define	ENOSYS		78		/* Function not implemented */</div><div class='del'>-</div><div class='del'>-#ifndef _POSIX_SOURCE</div><div class='del'>-#define	EFTYPE		79		/* Inappropriate file type or format */</div><div class='del'>-#define	EAUTH		80		/* Authentication error */</div><div class='del'>-#define	ENEEDAUTH	81		/* Need authenticator */</div><div class='del'>-#define	EIDRM		82		/* Identifier removed */</div><div class='del'>-#define	ENOMSG		83		/* No message of desired type */</div><div class='del'>-#define	EOVERFLOW	84		/* Value too large to be stored in data type */</div><div class='del'>-#define	ECANCELED	85		/* Operation canceled */</div><div class='del'>-#define	EILSEQ		86		/* Illegal byte sequence */</div><div class='del'>-#define	ENOATTR		87		/* Attribute not found */</div><div class='del'>-</div><div class='del'>-#define EDOOFUS		88		/* Programming error */</div><div class='del'>-#endif /* _POSIX_SOURCE */</div><div class='del'>-</div><div class='del'>-#define	EBADMSG		89		/* Bad message */</div><div class='del'>-#define	EMULTIHOP	90		/* Multihop attempted */</div><div class='del'>-#define	ENOLINK		91		/* Link has been severed */</div><div class='del'>-#define	EPROTO		92		/* Protocol error */</div><div class='del'>-</div><div class='del'>-#ifndef _POSIX_SOURCE</div><div class='del'>-#define	ELAST		92		/* Must be equal largest errno */</div><div class='del'>-#endif /* _POSIX_SOURCE */</div><div class='del'>-</div><div class='del'>-#ifdef _KERNEL</div><div class='del'>-/* pseudo-errors returned inside kernel to modify return to process */</div><div class='del'>-#define	ERESTART	(-1)		/* restart syscall */</div><div class='del'>-#define	EJUSTRETURN	(-2)		/* don't modify regs, just return */</div><div class='del'>-#define	ENOIOCTL	(-3)		/* ioctl not handled by this layer */</div><div class='del'>-#define	EDIRIOCTL	(-4)		/* do direct ioctl in GEOM */</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-#endif</div><div class='head'>diff --git a/doc/errno.list.linux.txt b/doc/errno.list.linux.txt<br/>deleted file mode 100644<br/>index baa50792d4d..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/doc/errno.list.linux.txt?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>doc/errno.list.linux.txt</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,1586 +0,0 @@</div><div class='del'>-#define ICONV_SUPPORTS_ERRNO 1</div><div class='del'>-#include &lt;errno.h&gt;</div><div class='del'>-/* Error constants.  Linux specific version.</div><div class='del'>-   Copyright (C) 1996, 1997, 1998, 1999, 2005 Free Software Foundation, Inc.</div><div class='del'>-   This file is part of the GNU C Library.</div><div class='del'>-</div><div class='del'>-   The GNU C Library is free software; you can redistribute it and/or</div><div class='del'>-   modify it under the terms of the GNU Lesser General Public</div><div class='del'>-   License as published by the Free Software Foundation; either</div><div class='del'>-   version 2.1 of the License, or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-   The GNU C Library is distributed in the hope that it will be useful,</div><div class='del'>-   but WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-   Lesser General Public License for more details.</div><div class='del'>-</div><div class='del'>-   You should have received a copy of the GNU Lesser General Public</div><div class='del'>-   License along with the GNU C Library; if not, write to the Free</div><div class='del'>-   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA</div><div class='del'>-   02111-1307 USA.  */</div><div class='del'>-</div><div class='del'>-#ifdef _ERRNO_H</div><div class='del'>-</div><div class='del'>-# undef EDOM</div><div class='del'>-# undef EILSEQ</div><div class='del'>-# undef ERANGE</div><div class='del'>-# include &lt;linux/errno.h&gt;</div><div class='del'>-</div><div class='del'>-/* Linux has no ENOTSUP error code.  */</div><div class='del'>-# define ENOTSUP EOPNOTSUPP</div><div class='del'>-</div><div class='del'>-/* Older Linux versions also had no ECANCELED error code.  */</div><div class='del'>-# ifndef ECANCELED</div><div class='del'>-#  define ECANCELED	125</div><div class='del'>-# endif</div><div class='del'>-</div><div class='del'>-/* Support for error codes to support robust mutexes was added later, too.  */</div><div class='del'>-# ifndef EOWNERDEAD</div><div class='del'>-#  define EOWNERDEAD		130</div><div class='del'>-#  define ENOTRECOVERABLE	131</div><div class='del'>-# endif</div><div class='del'>-</div><div class='del'>-# ifndef __ASSEMBLER__</div><div class='del'>-/* Function to get address of global `errno' variable.  */</div><div class='del'>-extern int *__errno_location (void) __THROW __attribute__ ((__const__));</div><div class='del'>-</div><div class='del'>-#  if !defined _LIBC || defined _LIBC_REENTRANT</div><div class='del'>-/* When using threads, errno is a per-thread value.  */</div><div class='del'>-#   define errno (*__errno_location ())</div><div class='del'>-#  endif</div><div class='del'>-# endif /* !__ASSEMBLER__ */</div><div class='del'>-#endif /* _ERRNO_H */</div><div class='del'>-</div><div class='del'>-#if !defined _ERRNO_H &amp;&amp; defined __need_Emath</div><div class='del'>-/* This is ugly but the kernel header is not clean enough.  We must</div><div class='del'>-   define only the values EDOM, EILSEQ and ERANGE in case __need_Emath is</div><div class='del'>-   defined.  */</div><div class='del'>-# define EDOM	33	/* Math argument out of domain of function.  */</div><div class='del'>-# define EILSEQ	84	/* Illegal byte sequence.  */</div><div class='del'>-# define ERANGE	34	/* Math result not representable.  */</div><div class='del'>-#endif /* !_ERRNO_H &amp;&amp; __need_Emath */</div><div class='del'>-/* Licensed to the Apache Software Foundation (ASF) under one or more</div><div class='del'>- * contributor license agreements.  See the NOTICE file distributed with</div><div class='del'>- * this work for additional information regarding copyright ownership.</div><div class='del'>- * The ASF licenses this file to You under the Apache License, Version 2.0</div><div class='del'>- * (the "License"); you may not use this file except in compliance with</div><div class='del'>- * the License.  You may obtain a copy of the License at</div><div class='del'>- *</div><div class='del'>- *     http://www.apache.org/licenses/LICENSE-2.0</div><div class='del'>- *</div><div class='del'>- * Unless required by applicable law or agreed to in writing, software</div><div class='del'>- * distributed under the License is distributed on an "AS IS" BASIS,</div><div class='del'>- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.</div><div class='del'>- * See the License for the specific language governing permissions and</div><div class='del'>- * limitations under the License.</div><div class='del'>- */</div><div class='del'>-</div><div class='del'>-#ifndef APR_ERRNO_H</div><div class='del'>-#define APR_ERRNO_H</div><div class='del'>-</div><div class='del'>-/**</div><div class='del'>- * @file apr_errno.h</div><div class='del'>- * @brief APR Error Codes</div><div class='del'>- */</div><div class='del'>-</div><div class='del'>-#include "apr.h"</div><div class='del'>-</div><div class='del'>-#if APR_HAVE_ERRNO_H</div><div class='del'>-#include &lt;errno.h&gt;</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-#ifdef __cplusplus</div><div class='del'>-extern "C" {</div><div class='del'>-#endif /* __cplusplus */</div><div class='del'>-</div><div class='del'>-/**</div><div class='del'>- * @defgroup apr_errno Error Codes</div><div class='del'>- * @ingroup APR </div><div class='del'>- * @{</div><div class='del'>- */</div><div class='del'>-</div><div class='del'>-/**</div><div class='del'>- * Type for specifying an error or status code.</div><div class='del'>- */</div><div class='del'>-typedef int apr_status_t;</div><div class='del'>-</div><div class='del'>-/**</div><div class='del'>- * Return a human readable string describing the specified error.</div><div class='del'>- * @param statcode The error code the get a string for.</div><div class='del'>- * @param buf A buffer to hold the error string.</div><div class='del'>- * @param bufsize Size of the buffer to hold the string.</div><div class='del'>- */</div><div class='del'>-APR_DECLARE(char *) apr_strerror(apr_status_t statcode, char *buf, </div><div class='del'>-                                 apr_size_t bufsize);</div><div class='del'>-</div><div class='del'>-#if defined(DOXYGEN)</div><div class='del'>-/**</div><div class='del'>- * @def APR_FROM_OS_ERROR(os_err_type syserr)</div><div class='del'>- * Fold a platform specific error into an apr_status_t code.</div><div class='del'>- * @return apr_status_t</div><div class='del'>- * @param e The platform os error code.</div><div class='del'>- * @warning  macro implementation; the syserr argument may be evaluated</div><div class='del'>- *      multiple times.</div><div class='del'>- */</div><div class='del'>-#define APR_FROM_OS_ERROR(e) (e == 0 ? APR_SUCCESS : e + APR_OS_START_SYSERR)</div><div class='del'>-</div><div class='del'>-/**</div><div class='del'>- * @def APR_TO_OS_ERROR(apr_status_t statcode)</div><div class='del'>- * @return os_err_type</div><div class='del'>- * Fold an apr_status_t code back to the native platform defined error.</div><div class='del'>- * @param e The apr_status_t folded platform os error code.</div><div class='del'>- * @warning  macro implementation; the statcode argument may be evaluated</div><div class='del'>- *      multiple times.  If the statcode was not created by apr_get_os_error </div><div class='del'>- *      or APR_FROM_OS_ERROR, the results are undefined.</div><div class='del'>- */</div><div class='del'>-#define APR_TO_OS_ERROR(e) (e == 0 ? APR_SUCCESS : e - APR_OS_START_SYSERR)</div><div class='del'>-</div><div class='del'>-/** @def apr_get_os_error()</div><div class='del'>- * @return apr_status_t the last platform error, folded into apr_status_t, on most platforms</div><div class='del'>- * @remark This retrieves errno, or calls a GetLastError() style function, and</div><div class='del'>- *      folds it with APR_FROM_OS_ERROR.  Some platforms (such as OS2) have no</div><div class='del'>- *      such mechanism, so this call may be unsupported.  Do NOT use this</div><div class='del'>- *      call for socket errors from socket, send, recv etc!</div><div class='del'>- */</div><div class='del'>-</div><div class='del'>-/** @def apr_set_os_error(e)</div><div class='del'>- * Reset the last platform error, unfolded from an apr_status_t, on some platforms</div><div class='del'>- * @param e The OS error folded in a prior call to APR_FROM_OS_ERROR()</div><div class='del'>- * @warning This is a macro implementation; the statcode argument may be evaluated</div><div class='del'>- *      multiple times.  If the statcode was not created by apr_get_os_error</div><div class='del'>- *      or APR_FROM_OS_ERROR, the results are undefined.  This macro sets</div><div class='del'>- *      errno, or calls a SetLastError() style function, unfolding statcode</div><div class='del'>- *      with APR_TO_OS_ERROR.  Some platforms (such as OS2) have no such</div><div class='del'>- *      mechanism, so this call may be unsupported.</div><div class='del'>- */</div><div class='del'>-</div><div class='del'>-/** @def apr_get_netos_error()</div><div class='del'>- * Return the last socket error, folded into apr_status_t, on all platforms</div><div class='del'>- * @remark This retrieves errno or calls a GetLastSocketError() style function,</div><div class='del'>- *      and folds it with APR_FROM_OS_ERROR.</div><div class='del'>- */</div><div class='del'>-</div><div class='del'>-/** @def apr_set_netos_error(e)</div><div class='del'>- * Reset the last socket error, unfolded from an apr_status_t</div><div class='del'>- * @param e The socket error folded in a prior call to APR_FROM_OS_ERROR()</div><div class='del'>- * @warning This is a macro implementation; the statcode argument may be evaluated</div><div class='del'>- *      multiple times.  If the statcode was not created by apr_get_os_error</div><div class='del'>- *      or APR_FROM_OS_ERROR, the results are undefined.  This macro sets</div><div class='del'>- *      errno, or calls a WSASetLastError() style function, unfolding </div><div class='del'>- *      socketcode with APR_TO_OS_ERROR.</div><div class='del'>- */</div><div class='del'>-</div><div class='del'>-#endif /* defined(DOXYGEN) */</div><div class='del'>-</div><div class='del'>-/**</div><div class='del'>- * APR_OS_START_ERROR is where the APR specific error values start.</div><div class='del'>- */</div><div class='del'>-#define APR_OS_START_ERROR     20000</div><div class='del'>-/**</div><div class='del'>- * APR_OS_ERRSPACE_SIZE is the maximum number of errors you can fit</div><div class='del'>- *    into one of the error/status ranges below -- except for</div><div class='del'>- *    APR_OS_START_USERERR, which see.</div><div class='del'>- */</div><div class='del'>-#define APR_OS_ERRSPACE_SIZE 50000</div><div class='del'>-/**</div><div class='del'>- * APR_OS_START_STATUS is where the APR specific status codes start.</div><div class='del'>- */</div><div class='del'>-#define APR_OS_START_STATUS    (APR_OS_START_ERROR + APR_OS_ERRSPACE_SIZE)</div><div class='del'>-/**</div><div class='del'>- * APR_OS_START_USERERR are reserved for applications that use APR that</div><div class='del'>- *     layer their own error codes along with APR's.  Note that the</div><div class='del'>- *     error immediately following this one is set ten times farther</div><div class='del'>- *     away than usual, so that users of apr have a lot of room in</div><div class='del'>- *     which to declare custom error codes.</div><div class='del'>- */</div><div class='del'>-#define APR_OS_START_USERERR    (APR_OS_START_STATUS + APR_OS_ERRSPACE_SIZE)</div><div class='del'>-/**</div><div class='del'>- * APR_OS_START_USEERR is obsolete, defined for compatibility only.</div><div class='del'>- * Use APR_OS_START_USERERR instead.</div><div class='del'>- */</div><div class='del'>-#define APR_OS_START_USEERR     APR_OS_START_USERERR</div><div class='del'>-/**</div><div class='del'>- * APR_OS_START_CANONERR is where APR versions of errno values are defined</div><div class='del'>- *     on systems which don't have the corresponding errno.</div><div class='del'>- */</div><div class='del'>-#define APR_OS_START_CANONERR  (APR_OS_START_USERERR \</div><div class='del'>-                                 + (APR_OS_ERRSPACE_SIZE * 10))</div><div class='del'>-/**</div><div class='del'>- * APR_OS_START_EAIERR folds EAI_ error codes from getaddrinfo() into </div><div class='del'>- *     apr_status_t values.</div><div class='del'>- */</div><div class='del'>-#define APR_OS_START_EAIERR    (APR_OS_START_CANONERR + APR_OS_ERRSPACE_SIZE)</div><div class='del'>-/**</div><div class='del'>- * APR_OS_START_SYSERR folds platform-specific system error values into </div><div class='del'>- *     apr_status_t values.</div><div class='del'>- */</div><div class='del'>-#define APR_OS_START_SYSERR    (APR_OS_START_EAIERR + APR_OS_ERRSPACE_SIZE)</div><div class='del'>-</div><div class='del'>-/** no error. */</div><div class='del'>-#define APR_SUCCESS 0</div><div class='del'>-</div><div class='del'>-/** </div><div class='del'>- * @defgroup APR_Error APR Error Values</div><div class='del'>- * &lt;PRE&gt;</div><div class='del'>- * &lt;b&gt;APR ERROR VALUES&lt;/b&gt;</div><div class='del'>- * APR_ENOSTAT      APR was unable to perform a stat on the file </div><div class='del'>- * APR_ENOPOOL      APR was not provided a pool with which to allocate memory</div><div class='del'>- * APR_EBADDATE     APR was given an invalid date </div><div class='del'>- * APR_EINVALSOCK   APR was given an invalid socket</div><div class='del'>- * APR_ENOPROC      APR was not given a process structure</div><div class='del'>- * APR_ENOTIME      APR was not given a time structure</div><div class='del'>- * APR_ENODIR       APR was not given a directory structure</div><div class='del'>- * APR_ENOLOCK      APR was not given a lock structure</div><div class='del'>- * APR_ENOPOLL      APR was not given a poll structure</div><div class='del'>- * APR_ENOSOCKET    APR was not given a socket</div><div class='del'>- * APR_ENOTHREAD    APR was not given a thread structure</div><div class='del'>- * APR_ENOTHDKEY    APR was not given a thread key structure</div><div class='del'>- * APR_ENOSHMAVAIL  There is no more shared memory available</div><div class='del'>- * APR_EDSOOPEN     APR was unable to open the dso object.  For more </div><div class='del'>- *                  information call apr_dso_error().</div><div class='del'>- * APR_EGENERAL     General failure (specific information not available)</div><div class='del'>- * APR_EBADIP       The specified IP address is invalid</div><div class='del'>- * APR_EBADMASK     The specified netmask is invalid</div><div class='del'>- * APR_ESYMNOTFOUND Could not find the requested symbol</div><div class='del'>- * &lt;/PRE&gt;</div><div class='del'>- *</div><div class='del'>- * &lt;PRE&gt;</div><div class='del'>- * &lt;b&gt;APR STATUS VALUES&lt;/b&gt;</div><div class='del'>- * APR_INCHILD        Program is currently executing in the child</div><div class='del'>- * APR_INPARENT       Program is currently executing in the parent</div><div class='del'>- * APR_DETACH         The thread is detached</div><div class='del'>- * APR_NOTDETACH      The thread is not detached</div><div class='del'>- * APR_CHILD_DONE     The child has finished executing</div><div class='del'>- * APR_CHILD_NOTDONE  The child has not finished executing</div><div class='del'>- * APR_TIMEUP         The operation did not finish before the timeout</div><div class='del'>- * APR_INCOMPLETE     The operation was incomplete although some processing</div><div class='del'>- *                    was performed and the results are partially valid</div><div class='del'>- * APR_BADCH          Getopt found an option not in the option string</div><div class='del'>- * APR_BADARG         Getopt found an option that is missing an argument </div><div class='del'>- *                    and an argument was specified in the option string</div><div class='del'>- * APR_EOF            APR has encountered the end of the file</div><div class='del'>- * APR_NOTFOUND       APR was unable to find the socket in the poll structure</div><div class='del'>- * APR_ANONYMOUS      APR is using anonymous shared memory</div><div class='del'>- * APR_FILEBASED      APR is using a file name as the key to the shared memory</div><div class='del'>- * APR_KEYBASED       APR is using a shared key as the key to the shared memory</div><div class='del'>- * APR_EINIT          Ininitalizer value.  If no option has been found, but </div><div class='del'>- *                    the status variable requires a value, this should be used</div><div class='del'>- * APR_ENOTIMPL       The APR function has not been implemented on this </div><div class='del'>- *                    platform, either because nobody has gotten to it yet, </div><div class='del'>- *                    or the function is impossible on this platform.</div><div class='del'>- * APR_EMISMATCH      Two passwords do not match.</div><div class='del'>- * APR_EABSOLUTE      The given path was absolute.</div><div class='del'>- * APR_ERELATIVE      The given path was relative.</div><div class='del'>- * APR_EINCOMPLETE    The given path was neither relative nor absolute.</div><div class='del'>- * APR_EABOVEROOT     The given path was above the root path.</div><div class='del'>- * APR_EBUSY          The given lock was busy.</div><div class='del'>- * APR_EPROC_UNKNOWN  The given process wasn't recognized by APR</div><div class='del'>- * &lt;/PRE&gt;</div><div class='del'>- * @{</div><div class='del'>- */</div><div class='del'>-/** @see APR_STATUS_IS_ENOSTAT */</div><div class='del'>-#define APR_ENOSTAT        (APR_OS_START_ERROR + 1)</div><div class='del'>-/** @see APR_STATUS_IS_ENOPOOL */</div><div class='del'>-#define APR_ENOPOOL        (APR_OS_START_ERROR + 2)</div><div class='del'>-/* empty slot: +3 */</div><div class='del'>-/** @see APR_STATUS_IS_EBADDATE */</div><div class='del'>-#define APR_EBADDATE       (APR_OS_START_ERROR + 4)</div><div class='del'>-/** @see APR_STATUS_IS_EINVALSOCK */</div><div class='del'>-#define APR_EINVALSOCK     (APR_OS_START_ERROR + 5)</div><div class='del'>-/** @see APR_STATUS_IS_ENOPROC */</div><div class='del'>-#define APR_ENOPROC        (APR_OS_START_ERROR + 6)</div><div class='del'>-/** @see APR_STATUS_IS_ENOTIME */</div><div class='del'>-#define APR_ENOTIME        (APR_OS_START_ERROR + 7)</div><div class='del'>-/** @see APR_STATUS_IS_ENODIR */</div><div class='del'>-#define APR_ENODIR         (APR_OS_START_ERROR + 8)</div><div class='del'>-/** @see APR_STATUS_IS_ENOLOCK */</div><div class='del'>-#define APR_ENOLOCK        (APR_OS_START_ERROR + 9)</div><div class='del'>-/** @see APR_STATUS_IS_ENOPOLL */</div><div class='del'>-#define APR_ENOPOLL        (APR_OS_START_ERROR + 10)</div><div class='del'>-/** @see APR_STATUS_IS_ENOSOCKET */</div><div class='del'>-#define APR_ENOSOCKET      (APR_OS_START_ERROR + 11)</div><div class='del'>-/** @see APR_STATUS_IS_ENOTHREAD */</div><div class='del'>-#define APR_ENOTHREAD      (APR_OS_START_ERROR + 12)</div><div class='del'>-/** @see APR_STATUS_IS_ENOTHDKEY */</div><div class='del'>-#define APR_ENOTHDKEY      (APR_OS_START_ERROR + 13)</div><div class='del'>-/** @see APR_STATUS_IS_EGENERAL */</div><div class='del'>-#define APR_EGENERAL       (APR_OS_START_ERROR + 14)</div><div class='del'>-/** @see APR_STATUS_IS_ENOSHMAVAIL */</div><div class='del'>-#define APR_ENOSHMAVAIL    (APR_OS_START_ERROR + 15)</div><div class='del'>-/** @see APR_STATUS_IS_EBADIP */</div><div class='del'>-#define APR_EBADIP         (APR_OS_START_ERROR + 16)</div><div class='del'>-/** @see APR_STATUS_IS_EBADMASK */</div><div class='del'>-#define APR_EBADMASK       (APR_OS_START_ERROR + 17)</div><div class='del'>-/* empty slot: +18 */</div><div class='del'>-/** @see APR_STATUS_IS_EDSOPEN */</div><div class='del'>-#define APR_EDSOOPEN       (APR_OS_START_ERROR + 19)</div><div class='del'>-/** @see APR_STATUS_IS_EABSOLUTE */</div><div class='del'>-#define APR_EABSOLUTE      (APR_OS_START_ERROR + 20)</div><div class='del'>-/** @see APR_STATUS_IS_ERELATIVE */</div><div class='del'>-#define APR_ERELATIVE      (APR_OS_START_ERROR + 21)</div><div class='del'>-/** @see APR_STATUS_IS_EINCOMPLETE */</div><div class='del'>-#define APR_EINCOMPLETE    (APR_OS_START_ERROR + 22)</div><div class='del'>-/** @see APR_STATUS_IS_EABOVEROOT */</div><div class='del'>-#define APR_EABOVEROOT     (APR_OS_START_ERROR + 23)</div><div class='del'>-/** @see APR_STATUS_IS_EBADPATH */</div><div class='del'>-#define APR_EBADPATH       (APR_OS_START_ERROR + 24)</div><div class='del'>-/** @see APR_STATUS_IS_EPATHWILD */</div><div class='del'>-#define APR_EPATHWILD      (APR_OS_START_ERROR + 25)</div><div class='del'>-/** @see APR_STATUS_IS_ESYMNOTFOUND */</div><div class='del'>-#define APR_ESYMNOTFOUND   (APR_OS_START_ERROR + 26)</div><div class='del'>-/** @see APR_STATUS_IS_EPROC_UNKNOWN */</div><div class='del'>-#define APR_EPROC_UNKNOWN  (APR_OS_START_ERROR + 27)</div><div class='del'>-/** @see APR_STATUS_IS_ENOTENOUGHENTROPY */</div><div class='del'>-#define APR_ENOTENOUGHENTROPY (APR_OS_START_ERROR + 28)</div><div class='del'>-/** @} */</div><div class='del'>-</div><div class='del'>-/** </div><div class='del'>- * @defgroup APR_STATUS_IS Status Value Tests</div><div class='del'>- * @warning For any particular error condition, more than one of these tests</div><div class='del'>- *      may match. This is because platform-specific error codes may not</div><div class='del'>- *      always match the semantics of the POSIX codes these tests (and the</div><div class='del'>- *      corresponding APR error codes) are named after. A notable example</div><div class='del'>- *      are the APR_STATUS_IS_ENOENT and APR_STATUS_IS_ENOTDIR tests on</div><div class='del'>- *      Win32 platforms. The programmer should always be aware of this and</div><div class='del'>- *      adjust the order of the tests accordingly.</div><div class='del'>- * @{</div><div class='del'>- */</div><div class='del'>-/** </div><div class='del'>- * APR was unable to perform a stat on the file </div><div class='del'>- * @warning always use this test, as platform-specific variances may meet this</div><div class='del'>- * more than one error code </div><div class='del'>- */</div><div class='del'>-#define APR_STATUS_IS_ENOSTAT(s)        ((s) == APR_ENOSTAT)</div><div class='del'>-/** </div><div class='del'>- * APR was not provided a pool with which to allocate memory </div><div class='del'>- * @warning always use this test, as platform-specific variances may meet this</div><div class='del'>- * more than one error code </div><div class='del'>- */</div><div class='del'>-#define APR_STATUS_IS_ENOPOOL(s)        ((s) == APR_ENOPOOL)</div><div class='del'>-/** APR was given an invalid date  */</div><div class='del'>-#define APR_STATUS_IS_EBADDATE(s)       ((s) == APR_EBADDATE)</div><div class='del'>-/** APR was given an invalid socket */</div><div class='del'>-#define APR_STATUS_IS_EINVALSOCK(s)     ((s) == APR_EINVALSOCK)</div><div class='del'>-/** APR was not given a process structure */</div><div class='del'>-#define APR_STATUS_IS_ENOPROC(s)        ((s) == APR_ENOPROC)</div><div class='del'>-/** APR was not given a time structure */</div><div class='del'>-#define APR_STATUS_IS_ENOTIME(s)        ((s) == APR_ENOTIME)</div><div class='del'>-/** APR was not given a directory structure */</div><div class='del'>-#define APR_STATUS_IS_ENODIR(s)         ((s) == APR_ENODIR)</div><div class='del'>-/** APR was not given a lock structure */</div><div class='del'>-#define APR_STATUS_IS_ENOLOCK(s)        ((s) == APR_ENOLOCK)</div><div class='del'>-/** APR was not given a poll structure */</div><div class='del'>-#define APR_STATUS_IS_ENOPOLL(s)        ((s) == APR_ENOPOLL)</div><div class='del'>-/** APR was not given a socket */</div><div class='del'>-#define APR_STATUS_IS_ENOSOCKET(s)      ((s) == APR_ENOSOCKET)</div><div class='del'>-/** APR was not given a thread structure */</div><div class='del'>-#define APR_STATUS_IS_ENOTHREAD(s)      ((s) == APR_ENOTHREAD)</div><div class='del'>-/** APR was not given a thread key structure */</div><div class='del'>-#define APR_STATUS_IS_ENOTHDKEY(s)      ((s) == APR_ENOTHDKEY)</div><div class='del'>-/** Generic Error which can not be put into another spot */</div><div class='del'>-#define APR_STATUS_IS_EGENERAL(s)       ((s) == APR_EGENERAL)</div><div class='del'>-/** There is no more shared memory available */</div><div class='del'>-#define APR_STATUS_IS_ENOSHMAVAIL(s)    ((s) == APR_ENOSHMAVAIL)</div><div class='del'>-/** The specified IP address is invalid */</div><div class='del'>-#define APR_STATUS_IS_EBADIP(s)         ((s) == APR_EBADIP)</div><div class='del'>-/** The specified netmask is invalid */</div><div class='del'>-#define APR_STATUS_IS_EBADMASK(s)       ((s) == APR_EBADMASK)</div><div class='del'>-/* empty slot: +18 */</div><div class='del'>-/** </div><div class='del'>- * APR was unable to open the dso object.  </div><div class='del'>- * For more information call apr_dso_error().</div><div class='del'>- */</div><div class='del'>-#if defined(WIN32)</div><div class='del'>-#define APR_STATUS_IS_EDSOOPEN(s)       ((s) == APR_EDSOOPEN \</div><div class='del'>-                       || APR_TO_OS_ERROR(s) == ERROR_MOD_NOT_FOUND)</div><div class='del'>-#else</div><div class='del'>-#define APR_STATUS_IS_EDSOOPEN(s)       ((s) == APR_EDSOOPEN)</div><div class='del'>-#endif</div><div class='del'>-/** The given path was absolute. */</div><div class='del'>-#define APR_STATUS_IS_EABSOLUTE(s)      ((s) == APR_EABSOLUTE)</div><div class='del'>-/** The given path was relative. */</div><div class='del'>-#define APR_STATUS_IS_ERELATIVE(s)      ((s) == APR_ERELATIVE)</div><div class='del'>-/** The given path was neither relative nor absolute. */</div><div class='del'>-#define APR_STATUS_IS_EINCOMPLETE(s)    ((s) == APR_EINCOMPLETE)</div><div class='del'>-/** The given path was above the root path. */</div><div class='del'>-#define APR_STATUS_IS_EABOVEROOT(s)     ((s) == APR_EABOVEROOT)</div><div class='del'>-/** The given path was bad. */</div><div class='del'>-#define APR_STATUS_IS_EBADPATH(s)       ((s) == APR_EBADPATH)</div><div class='del'>-/** The given path contained wildcards. */</div><div class='del'>-#define APR_STATUS_IS_EPATHWILD(s)      ((s) == APR_EPATHWILD)</div><div class='del'>-/** Could not find the requested symbol.</div><div class='del'>- * For more information call apr_dso_error().</div><div class='del'>- */</div><div class='del'>-#if defined(WIN32)</div><div class='del'>-#define APR_STATUS_IS_ESYMNOTFOUND(s)   ((s) == APR_ESYMNOTFOUND \</div><div class='del'>-                       || APR_TO_OS_ERROR(s) == ERROR_PROC_NOT_FOUND)</div><div class='del'>-#else</div><div class='del'>-#define APR_STATUS_IS_ESYMNOTFOUND(s)   ((s) == APR_ESYMNOTFOUND)</div><div class='del'>-#endif</div><div class='del'>-/** The given process was not recognized by APR. */</div><div class='del'>-#define APR_STATUS_IS_EPROC_UNKNOWN(s)  ((s) == APR_EPROC_UNKNOWN)</div><div class='del'>-</div><div class='del'>-/** APR could not gather enough entropy to continue. */</div><div class='del'>-#define APR_STATUS_IS_ENOTENOUGHENTROPY(s) ((s) == APR_ENOTENOUGHENTROPY)</div><div class='del'>-</div><div class='del'>-/** @} */</div><div class='del'>-</div><div class='del'>-/** </div><div class='del'>- * @addtogroup APR_Error</div><div class='del'>- * @{</div><div class='del'>- */</div><div class='del'>-/** @see APR_STATUS_IS_INCHILD */</div><div class='del'>-#define APR_INCHILD        (APR_OS_START_STATUS + 1)</div><div class='del'>-/** @see APR_STATUS_IS_INPARENT */</div><div class='del'>-#define APR_INPARENT       (APR_OS_START_STATUS + 2)</div><div class='del'>-/** @see APR_STATUS_IS_DETACH */</div><div class='del'>-#define APR_DETACH         (APR_OS_START_STATUS + 3)</div><div class='del'>-/** @see APR_STATUS_IS_NOTDETACH */</div><div class='del'>-#define APR_NOTDETACH      (APR_OS_START_STATUS + 4)</div><div class='del'>-/** @see APR_STATUS_IS_CHILD_DONE */</div><div class='del'>-#define APR_CHILD_DONE     (APR_OS_START_STATUS + 5)</div><div class='del'>-/** @see APR_STATUS_IS_CHILD_NOTDONE */</div><div class='del'>-#define APR_CHILD_NOTDONE  (APR_OS_START_STATUS + 6)</div><div class='del'>-/** @see APR_STATUS_IS_TIMEUP */</div><div class='del'>-#define APR_TIMEUP         (APR_OS_START_STATUS + 7)</div><div class='del'>-/** @see APR_STATUS_IS_INCOMPLETE */</div><div class='del'>-#define APR_INCOMPLETE     (APR_OS_START_STATUS + 8)</div><div class='del'>-/* empty slot: +9 */</div><div class='del'>-/* empty slot: +10 */</div><div class='del'>-/* empty slot: +11 */</div><div class='del'>-/** @see APR_STATUS_IS_BADCH */</div><div class='del'>-#define APR_BADCH          (APR_OS_START_STATUS + 12)</div><div class='del'>-/** @see APR_STATUS_IS_BADARG */</div><div class='del'>-#define APR_BADARG         (APR_OS_START_STATUS + 13)</div><div class='del'>-/** @see APR_STATUS_IS_EOF */</div><div class='del'>-#define APR_EOF            (APR_OS_START_STATUS + 14)</div><div class='del'>-/** @see APR_STATUS_IS_NOTFOUND */</div><div class='del'>-#define APR_NOTFOUND       (APR_OS_START_STATUS + 15)</div><div class='del'>-/* empty slot: +16 */</div><div class='del'>-/* empty slot: +17 */</div><div class='del'>-/* empty slot: +18 */</div><div class='del'>-/** @see APR_STATUS_IS_ANONYMOUS */</div><div class='del'>-#define APR_ANONYMOUS      (APR_OS_START_STATUS + 19)</div><div class='del'>-/** @see APR_STATUS_IS_FILEBASED */</div><div class='del'>-#define APR_FILEBASED      (APR_OS_START_STATUS + 20)</div><div class='del'>-/** @see APR_STATUS_IS_KEYBASED */</div><div class='del'>-#define APR_KEYBASED       (APR_OS_START_STATUS + 21)</div><div class='del'>-/** @see APR_STATUS_IS_EINIT */</div><div class='del'>-#define APR_EINIT          (APR_OS_START_STATUS + 22)  </div><div class='del'>-/** @see APR_STATUS_IS_ENOTIMPL */</div><div class='del'>-#define APR_ENOTIMPL       (APR_OS_START_STATUS + 23)</div><div class='del'>-/** @see APR_STATUS_IS_EMISMATCH */</div><div class='del'>-#define APR_EMISMATCH      (APR_OS_START_STATUS + 24)</div><div class='del'>-/** @see APR_STATUS_IS_EBUSY */</div><div class='del'>-#define APR_EBUSY          (APR_OS_START_STATUS + 25)</div><div class='del'>-/** @} */</div><div class='del'>-</div><div class='del'>-/** </div><div class='del'>- * @addtogroup APR_STATUS_IS</div><div class='del'>- * @{</div><div class='del'>- */</div><div class='del'>-/** </div><div class='del'>- * Program is currently executing in the child </div><div class='del'>- * @warning</div><div class='del'>- * always use this test, as platform-specific variances may meet this</div><div class='del'>- * more than one error code */</div><div class='del'>-#define APR_STATUS_IS_INCHILD(s)        ((s) == APR_INCHILD)</div><div class='del'>-/** </div><div class='del'>- * Program is currently executing in the parent </div><div class='del'>- * @warning</div><div class='del'>- * always use this test, as platform-specific variances may meet this</div><div class='del'>- * more than one error code </div><div class='del'>- */</div><div class='del'>-#define APR_STATUS_IS_INPARENT(s)       ((s) == APR_INPARENT)</div><div class='del'>-/** </div><div class='del'>- * The thread is detached </div><div class='del'>- * @warning</div><div class='del'>- * always use this test, as platform-specific variances may meet this</div><div class='del'>- * more than one error code </div><div class='del'>- */</div><div class='del'>-#define APR_STATUS_IS_DETACH(s)         ((s) == APR_DETACH)</div><div class='del'>-/** </div><div class='del'>- * The thread is not detached </div><div class='del'>- * @warning</div><div class='del'>- * always use this test, as platform-specific variances may meet this</div><div class='del'>- * more than one error code </div><div class='del'>- */</div><div class='del'>-#define APR_STATUS_IS_NOTDETACH(s)      ((s) == APR_NOTDETACH)</div><div class='del'>-/** </div><div class='del'>- * The child has finished executing</div><div class='del'>- * @warning</div><div class='del'>- * always use this test, as platform-specific variances may meet this</div><div class='del'>- * more than one error code </div><div class='del'>- */</div><div class='del'>-#define APR_STATUS_IS_CHILD_DONE(s)     ((s) == APR_CHILD_DONE)</div><div class='del'>-/** </div><div class='del'>- * The child has not finished executing</div><div class='del'>- * @warning</div><div class='del'>- * always use this test, as platform-specific variances may meet this</div><div class='del'>- * more than one error code </div><div class='del'>- */</div><div class='del'>-#define APR_STATUS_IS_CHILD_NOTDONE(s)  ((s) == APR_CHILD_NOTDONE)</div><div class='del'>-/** </div><div class='del'>- * The operation did not finish before the timeout</div><div class='del'>- * @warning</div><div class='del'>- * always use this test, as platform-specific variances may meet this</div><div class='del'>- * more than one error code </div><div class='del'>- */</div><div class='del'>-#define APR_STATUS_IS_TIMEUP(s)         ((s) == APR_TIMEUP)</div><div class='del'>-/** </div><div class='del'>- * The operation was incomplete although some processing was performed</div><div class='del'>- * and the results are partially valid.</div><div class='del'>- * @warning</div><div class='del'>- * always use this test, as platform-specific variances may meet this</div><div class='del'>- * more than one error code </div><div class='del'>- */</div><div class='del'>-#define APR_STATUS_IS_INCOMPLETE(s)     ((s) == APR_INCOMPLETE)</div><div class='del'>-/* empty slot: +9 */</div><div class='del'>-/* empty slot: +10 */</div><div class='del'>-/* empty slot: +11 */</div><div class='del'>-/** </div><div class='del'>- * Getopt found an option not in the option string</div><div class='del'>- * @warning</div><div class='del'>- * always use this test, as platform-specific variances may meet this</div><div class='del'>- * more than one error code </div><div class='del'>- */</div><div class='del'>-#define APR_STATUS_IS_BADCH(s)          ((s) == APR_BADCH)</div><div class='del'>-/** </div><div class='del'>- * Getopt found an option not in the option string and an argument was </div><div class='del'>- * specified in the option string</div><div class='del'>- * @warning</div><div class='del'>- * always use this test, as platform-specific variances may meet this</div><div class='del'>- * more than one error code </div><div class='del'>- */</div><div class='del'>-#define APR_STATUS_IS_BADARG(s)         ((s) == APR_BADARG)</div><div class='del'>-/** </div><div class='del'>- * APR has encountered the end of the file</div><div class='del'>- * @warning</div><div class='del'>- * always use this test, as platform-specific variances may meet this</div><div class='del'>- * more than one error code </div><div class='del'>- */</div><div class='del'>-#define APR_STATUS_IS_EOF(s)            ((s) == APR_EOF)</div><div class='del'>-/** </div><div class='del'>- * APR was unable to find the socket in the poll structure</div><div class='del'>- * @warning</div><div class='del'>- * always use this test, as platform-specific variances may meet this</div><div class='del'>- * more than one error code </div><div class='del'>- */</div><div class='del'>-#define APR_STATUS_IS_NOTFOUND(s)       ((s) == APR_NOTFOUND)</div><div class='del'>-/* empty slot: +16 */</div><div class='del'>-/* empty slot: +17 */</div><div class='del'>-/* empty slot: +18 */</div><div class='del'>-/** </div><div class='del'>- * APR is using anonymous shared memory</div><div class='del'>- * @warning</div><div class='del'>- * always use this test, as platform-specific variances may meet this</div><div class='del'>- * more than one error code </div><div class='del'>- */</div><div class='del'>-#define APR_STATUS_IS_ANONYMOUS(s)      ((s) == APR_ANONYMOUS)</div><div class='del'>-/** </div><div class='del'>- * APR is using a file name as the key to the shared memory</div><div class='del'>- * @warning</div><div class='del'>- * always use this test, as platform-specific variances may meet this</div><div class='del'>- * more than one error code </div><div class='del'>- */</div><div class='del'>-#define APR_STATUS_IS_FILEBASED(s)      ((s) == APR_FILEBASED)</div><div class='del'>-/** </div><div class='del'>- * APR is using a shared key as the key to the shared memory</div><div class='del'>- * @warning</div><div class='del'>- * always use this test, as platform-specific variances may meet this</div><div class='del'>- * more than one error code </div><div class='del'>- */</div><div class='del'>-#define APR_STATUS_IS_KEYBASED(s)       ((s) == APR_KEYBASED)</div><div class='del'>-/** </div><div class='del'>- * Ininitalizer value.  If no option has been found, but </div><div class='del'>- * the status variable requires a value, this should be used</div><div class='del'>- * @warning</div><div class='del'>- * always use this test, as platform-specific variances may meet this</div><div class='del'>- * more than one error code </div><div class='del'>- */</div><div class='del'>-#define APR_STATUS_IS_EINIT(s)          ((s) == APR_EINIT)</div><div class='del'>-/** </div><div class='del'>- * The APR function has not been implemented on this </div><div class='del'>- * platform, either because nobody has gotten to it yet, </div><div class='del'>- * or the function is impossible on this platform.</div><div class='del'>- * @warning</div><div class='del'>- * always use this test, as platform-specific variances may meet this</div><div class='del'>- * more than one error code </div><div class='del'>- */</div><div class='del'>-#define APR_STATUS_IS_ENOTIMPL(s)       ((s) == APR_ENOTIMPL)</div><div class='del'>-/** </div><div class='del'>- * Two passwords do not match.</div><div class='del'>- * @warning</div><div class='del'>- * always use this test, as platform-specific variances may meet this</div><div class='del'>- * more than one error code </div><div class='del'>- */</div><div class='del'>-#define APR_STATUS_IS_EMISMATCH(s)      ((s) == APR_EMISMATCH)</div><div class='del'>-/** </div><div class='del'>- * The given lock was busy</div><div class='del'>- * @warning always use this test, as platform-specific variances may meet this</div><div class='del'>- * more than one error code </div><div class='del'>- */</div><div class='del'>-#define APR_STATUS_IS_EBUSY(s)          ((s) == APR_EBUSY)</div><div class='del'>-</div><div class='del'>-/** @} */</div><div class='del'>-</div><div class='del'>-/** </div><div class='del'>- * @addtogroup APR_Error APR Error Values</div><div class='del'>- * @{</div><div class='del'>- */</div><div class='del'>-/* APR CANONICAL ERROR VALUES */</div><div class='del'>-/** @see APR_STATUS_IS_EACCES */</div><div class='del'>-#ifdef EACCES</div><div class='del'>-#define APR_EACCES EACCES</div><div class='del'>-#else</div><div class='del'>-#define APR_EACCES         (APR_OS_START_CANONERR + 1)</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-/** @see APR_STATUS_IS_EXIST */</div><div class='del'>-#ifdef EEXIST</div><div class='del'>-#define APR_EEXIST EEXIST</div><div class='del'>-#else</div><div class='del'>-#define APR_EEXIST         (APR_OS_START_CANONERR + 2)</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-/** @see APR_STATUS_IS_ENAMETOOLONG */</div><div class='del'>-#ifdef ENAMETOOLONG</div><div class='del'>-#define APR_ENAMETOOLONG ENAMETOOLONG</div><div class='del'>-#else</div><div class='del'>-#define APR_ENAMETOOLONG   (APR_OS_START_CANONERR + 3)</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-/** @see APR_STATUS_IS_ENOENT */</div><div class='del'>-#ifdef ENOENT</div><div class='del'>-#define APR_ENOENT ENOENT</div><div class='del'>-#else</div><div class='del'>-#define APR_ENOENT         (APR_OS_START_CANONERR + 4)</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-/** @see APR_STATUS_IS_ENOTDIR */</div><div class='del'>-#ifdef ENOTDIR</div><div class='del'>-#define APR_ENOTDIR ENOTDIR</div><div class='del'>-#else</div><div class='del'>-#define APR_ENOTDIR        (APR_OS_START_CANONERR + 5)</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-/** @see APR_STATUS_IS_ENOSPC */</div><div class='del'>-#ifdef ENOSPC</div><div class='del'>-#define APR_ENOSPC ENOSPC</div><div class='del'>-#else</div><div class='del'>-#define APR_ENOSPC         (APR_OS_START_CANONERR + 6)</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-/** @see APR_STATUS_IS_ENOMEM */</div><div class='del'>-#ifdef ENOMEM</div><div class='del'>-#define APR_ENOMEM ENOMEM</div><div class='del'>-#else</div><div class='del'>-#define APR_ENOMEM         (APR_OS_START_CANONERR + 7)</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-/** @see APR_STATUS_IS_EMFILE */</div><div class='del'>-#ifdef EMFILE</div><div class='del'>-#define APR_EMFILE EMFILE</div><div class='del'>-#else</div><div class='del'>-#define APR_EMFILE         (APR_OS_START_CANONERR + 8)</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-/** @see APR_STATUS_IS_ENFILE */</div><div class='del'>-#ifdef ENFILE</div><div class='del'>-#define APR_ENFILE ENFILE</div><div class='del'>-#else</div><div class='del'>-#define APR_ENFILE         (APR_OS_START_CANONERR + 9)</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-/** @see APR_STATUS_IS_EBADF */</div><div class='del'>-#ifdef EBADF</div><div class='del'>-#define APR_EBADF EBADF</div><div class='del'>-#else</div><div class='del'>-#define APR_EBADF          (APR_OS_START_CANONERR + 10)</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-/** @see APR_STATUS_IS_EINVAL */</div><div class='del'>-#ifdef EINVAL</div><div class='del'>-#define APR_EINVAL EINVAL</div><div class='del'>-#else</div><div class='del'>-#define APR_EINVAL         (APR_OS_START_CANONERR + 11)</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-/** @see APR_STATUS_IS_ESPIPE */</div><div class='del'>-#ifdef ESPIPE</div><div class='del'>-#define APR_ESPIPE ESPIPE</div><div class='del'>-#else</div><div class='del'>-#define APR_ESPIPE         (APR_OS_START_CANONERR + 12)</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-/** </div><div class='del'>- * @see APR_STATUS_IS_EAGAIN </div><div class='del'>- * @warning use APR_STATUS_IS_EAGAIN instead of just testing this value</div><div class='del'>- */</div><div class='del'>-#ifdef EAGAIN</div><div class='del'>-#define APR_EAGAIN EAGAIN</div><div class='del'>-#elif defined(EWOULDBLOCK)</div><div class='del'>-#define APR_EAGAIN EWOULDBLOCK</div><div class='del'>-#else</div><div class='del'>-#define APR_EAGAIN         (APR_OS_START_CANONERR + 13)</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-/** @see APR_STATUS_IS_EINTR */</div><div class='del'>-#ifdef EINTR</div><div class='del'>-#define APR_EINTR EINTR</div><div class='del'>-#else</div><div class='del'>-#define APR_EINTR          (APR_OS_START_CANONERR + 14)</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-/** @see APR_STATUS_IS_ENOTSOCK */</div><div class='del'>-#ifdef ENOTSOCK</div><div class='del'>-#define APR_ENOTSOCK ENOTSOCK</div><div class='del'>-#else</div><div class='del'>-#define APR_ENOTSOCK       (APR_OS_START_CANONERR + 15)</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-/** @see APR_STATUS_IS_ECONNREFUSED */</div><div class='del'>-#ifdef ECONNREFUSED</div><div class='del'>-#define APR_ECONNREFUSED ECONNREFUSED</div><div class='del'>-#else</div><div class='del'>-#define APR_ECONNREFUSED   (APR_OS_START_CANONERR + 16)</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-/** @see APR_STATUS_IS_EINPROGRESS */</div><div class='del'>-#ifdef EINPROGRESS</div><div class='del'>-#define APR_EINPROGRESS EINPROGRESS</div><div class='del'>-#else</div><div class='del'>-#define APR_EINPROGRESS    (APR_OS_START_CANONERR + 17)</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-/** </div><div class='del'>- * @see APR_STATUS_IS_ECONNABORTED</div><div class='del'>- * @warning use APR_STATUS_IS_ECONNABORTED instead of just testing this value</div><div class='del'>- */</div><div class='del'>-</div><div class='del'>-#ifdef ECONNABORTED</div><div class='del'>-#define APR_ECONNABORTED ECONNABORTED</div><div class='del'>-#else</div><div class='del'>-#define APR_ECONNABORTED   (APR_OS_START_CANONERR + 18)</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-/** @see APR_STATUS_IS_ECONNRESET */</div><div class='del'>-#ifdef ECONNRESET</div><div class='del'>-#define APR_ECONNRESET ECONNRESET</div><div class='del'>-#else</div><div class='del'>-#define APR_ECONNRESET     (APR_OS_START_CANONERR + 19)</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-/** @see APR_STATUS_IS_ETIMEDOUT </div><div class='del'>- *  @deprecated */</div><div class='del'>-#ifdef ETIMEDOUT</div><div class='del'>-#define APR_ETIMEDOUT ETIMEDOUT</div><div class='del'>-#else</div><div class='del'>-#define APR_ETIMEDOUT      (APR_OS_START_CANONERR + 20)</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-/** @see APR_STATUS_IS_EHOSTUNREACH */</div><div class='del'>-#ifdef EHOSTUNREACH</div><div class='del'>-#define APR_EHOSTUNREACH EHOSTUNREACH</div><div class='del'>-#else</div><div class='del'>-#define APR_EHOSTUNREACH   (APR_OS_START_CANONERR + 21)</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-/** @see APR_STATUS_IS_ENETUNREACH */</div><div class='del'>-#ifdef ENETUNREACH</div><div class='del'>-#define APR_ENETUNREACH ENETUNREACH</div><div class='del'>-#else</div><div class='del'>-#define APR_ENETUNREACH    (APR_OS_START_CANONERR + 22)</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-/** @see APR_STATUS_IS_EFTYPE */</div><div class='del'>-#ifdef EFTYPE</div><div class='del'>-#define APR_EFTYPE EFTYPE</div><div class='del'>-#else</div><div class='del'>-#define APR_EFTYPE        (APR_OS_START_CANONERR + 23)</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-/** @see APR_STATUS_IS_EPIPE */</div><div class='del'>-#ifdef EPIPE</div><div class='del'>-#define APR_EPIPE EPIPE</div><div class='del'>-#else</div><div class='del'>-#define APR_EPIPE         (APR_OS_START_CANONERR + 24)</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-/** @see APR_STATUS_IS_EXDEV */</div><div class='del'>-#ifdef EXDEV</div><div class='del'>-#define APR_EXDEV EXDEV</div><div class='del'>-#else</div><div class='del'>-#define APR_EXDEV         (APR_OS_START_CANONERR + 25)</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-/** @see APR_STATUS_IS_ENOTEMPTY */</div><div class='del'>-#ifdef ENOTEMPTY</div><div class='del'>-#define APR_ENOTEMPTY ENOTEMPTY</div><div class='del'>-#else</div><div class='del'>-#define APR_ENOTEMPTY     (APR_OS_START_CANONERR + 26)</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-/** @} */</div><div class='del'>-</div><div class='del'>-#if defined(OS2) &amp;&amp; !defined(DOXYGEN)</div><div class='del'>-</div><div class='del'>-#define APR_FROM_OS_ERROR(e) (e == 0 ? APR_SUCCESS : e + APR_OS_START_SYSERR)</div><div class='del'>-#define APR_TO_OS_ERROR(e)   (e == 0 ? APR_SUCCESS : e - APR_OS_START_SYSERR)</div><div class='del'>-</div><div class='del'>-#define INCL_DOSERRORS</div><div class='del'>-#define INCL_DOS</div><div class='del'>-</div><div class='del'>-/* Leave these undefined.</div><div class='del'>- * OS2 doesn't rely on the errno concept.</div><div class='del'>- * The API calls always return a result codes which</div><div class='del'>- * should be filtered through APR_FROM_OS_ERROR().</div><div class='del'>- *</div><div class='del'>- * #define apr_get_os_error()   (APR_FROM_OS_ERROR(GetLastError()))</div><div class='del'>- * #define apr_set_os_error(e)  (SetLastError(APR_TO_OS_ERROR(e)))</div><div class='del'>- */</div><div class='del'>-</div><div class='del'>-/* A special case, only socket calls require this;</div><div class='del'>- */</div><div class='del'>-#define apr_get_netos_error()   (APR_FROM_OS_ERROR(errno))</div><div class='del'>-#define apr_set_netos_error(e)  (errno = APR_TO_OS_ERROR(e))</div><div class='del'>-</div><div class='del'>-/* And this needs to be greped away for good:</div><div class='del'>- */</div><div class='del'>-#define APR_OS2_STATUS(e) (APR_FROM_OS_ERROR(e))</div><div class='del'>-</div><div class='del'>-/* These can't sit in a private header, so in spite of the extra size, </div><div class='del'>- * they need to be made available here.</div><div class='del'>- */</div><div class='del'>-#define SOCBASEERR              10000</div><div class='del'>-#define SOCEPERM                (SOCBASEERR+1)             /* Not owner */</div><div class='del'>-#define SOCESRCH                (SOCBASEERR+3)             /* No such process */</div><div class='del'>-#define SOCEINTR                (SOCBASEERR+4)             /* Interrupted system call */</div><div class='del'>-#define SOCENXIO                (SOCBASEERR+6)             /* No such device or address */</div><div class='del'>-#define SOCEBADF                (SOCBASEERR+9)             /* Bad file number */</div><div class='del'>-#define SOCEACCES               (SOCBASEERR+13)            /* Permission denied */</div><div class='del'>-#define SOCEFAULT               (SOCBASEERR+14)            /* Bad address */</div><div class='del'>-#define SOCEINVAL               (SOCBASEERR+22)            /* Invalid argument */</div><div class='del'>-#define SOCEMFILE               (SOCBASEERR+24)            /* Too many open files */</div><div class='del'>-#define SOCEPIPE                (SOCBASEERR+32)            /* Broken pipe */</div><div class='del'>-#define SOCEOS2ERR              (SOCBASEERR+100)           /* OS/2 Error */</div><div class='del'>-#define SOCEWOULDBLOCK          (SOCBASEERR+35)            /* Operation would block */</div><div class='del'>-#define SOCEINPROGRESS          (SOCBASEERR+36)            /* Operation now in progress */</div><div class='del'>-#define SOCEALREADY             (SOCBASEERR+37)            /* Operation already in progress */</div><div class='del'>-#define SOCENOTSOCK             (SOCBASEERR+38)            /* Socket operation on non-socket */</div><div class='del'>-#define SOCEDESTADDRREQ         (SOCBASEERR+39)            /* Destination address required */</div><div class='del'>-#define SOCEMSGSIZE             (SOCBASEERR+40)            /* Message too long */</div><div class='del'>-#define SOCEPROTOTYPE           (SOCBASEERR+41)            /* Protocol wrong type for socket */</div><div class='del'>-#define SOCENOPROTOOPT          (SOCBASEERR+42)            /* Protocol not available */</div><div class='del'>-#define SOCEPROTONOSUPPORT      (SOCBASEERR+43)            /* Protocol not supported */</div><div class='del'>-#define SOCESOCKTNOSUPPORT      (SOCBASEERR+44)            /* Socket type not supported */</div><div class='del'>-#define SOCEOPNOTSUPP           (SOCBASEERR+45)            /* Operation not supported on socket */</div><div class='del'>-#define SOCEPFNOSUPPORT         (SOCBASEERR+46)            /* Protocol family not supported */</div><div class='del'>-#define SOCEAFNOSUPPORT         (SOCBASEERR+47)            /* Address family not supported by protocol family */</div><div class='del'>-#define SOCEADDRINUSE           (SOCBASEERR+48)            /* Address already in use */</div><div class='del'>-#define SOCEADDRNOTAVAIL        (SOCBASEERR+49)            /* Can't assign requested address */</div><div class='del'>-#define SOCENETDOWN             (SOCBASEERR+50)            /* Network is down */</div><div class='del'>-#define SOCENETUNREACH          (SOCBASEERR+51)            /* Network is unreachable */</div><div class='del'>-#define SOCENETRESET            (SOCBASEERR+52)            /* Network dropped connection on reset */</div><div class='del'>-#define SOCECONNABORTED         (SOCBASEERR+53)            /* Software caused connection abort */</div><div class='del'>-#define SOCECONNRESET           (SOCBASEERR+54)            /* Connection reset by peer */</div><div class='del'>-#define SOCENOBUFS              (SOCBASEERR+55)            /* No buffer space available */</div><div class='del'>-#define SOCEISCONN              (SOCBASEERR+56)            /* Socket is already connected */</div><div class='del'>-#define SOCENOTCONN             (SOCBASEERR+57)            /* Socket is not connected */</div><div class='del'>-#define SOCESHUTDOWN            (SOCBASEERR+58)            /* Can't send after socket shutdown */</div><div class='del'>-#define SOCETOOMANYREFS         (SOCBASEERR+59)            /* Too many references: can't splice */</div><div class='del'>-#define SOCETIMEDOUT            (SOCBASEERR+60)            /* Connection timed out */</div><div class='del'>-#define SOCECONNREFUSED         (SOCBASEERR+61)            /* Connection refused */</div><div class='del'>-#define SOCELOOP                (SOCBASEERR+62)            /* Too many levels of symbolic links */</div><div class='del'>-#define SOCENAMETOOLONG         (SOCBASEERR+63)            /* File name too long */</div><div class='del'>-#define SOCEHOSTDOWN            (SOCBASEERR+64)            /* Host is down */</div><div class='del'>-#define SOCEHOSTUNREACH         (SOCBASEERR+65)            /* No route to host */</div><div class='del'>-#define SOCENOTEMPTY            (SOCBASEERR+66)            /* Directory not empty */</div><div class='del'>-</div><div class='del'>-/* APR CANONICAL ERROR TESTS */</div><div class='del'>-#define APR_STATUS_IS_EACCES(s)         ((s) == APR_EACCES \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + ERROR_ACCESS_DENIED \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + ERROR_SHARING_VIOLATION)</div><div class='del'>-#define APR_STATUS_IS_EEXIST(s)         ((s) == APR_EEXIST \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + ERROR_OPEN_FAILED \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + ERROR_FILE_EXISTS \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + ERROR_ALREADY_EXISTS \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + ERROR_ACCESS_DENIED)</div><div class='del'>-#define APR_STATUS_IS_ENAMETOOLONG(s)   ((s) == APR_ENAMETOOLONG \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + ERROR_FILENAME_EXCED_RANGE \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + SOCENAMETOOLONG)</div><div class='del'>-#define APR_STATUS_IS_ENOENT(s)         ((s) == APR_ENOENT \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + ERROR_FILE_NOT_FOUND \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + ERROR_PATH_NOT_FOUND \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + ERROR_NO_MORE_FILES \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + ERROR_OPEN_FAILED)</div><div class='del'>-#define APR_STATUS_IS_ENOTDIR(s)        ((s) == APR_ENOTDIR)</div><div class='del'>-#define APR_STATUS_IS_ENOSPC(s)         ((s) == APR_ENOSPC \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + ERROR_DISK_FULL)</div><div class='del'>-#define APR_STATUS_IS_ENOMEM(s)         ((s) == APR_ENOMEM)</div><div class='del'>-#define APR_STATUS_IS_EMFILE(s)         ((s) == APR_EMFILE \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + ERROR_TOO_MANY_OPEN_FILES)</div><div class='del'>-#define APR_STATUS_IS_ENFILE(s)         ((s) == APR_ENFILE)</div><div class='del'>-#define APR_STATUS_IS_EBADF(s)          ((s) == APR_EBADF \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + ERROR_INVALID_HANDLE)</div><div class='del'>-#define APR_STATUS_IS_EINVAL(s)         ((s) == APR_EINVAL \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + ERROR_INVALID_PARAMETER \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + ERROR_INVALID_FUNCTION)</div><div class='del'>-#define APR_STATUS_IS_ESPIPE(s)         ((s) == APR_ESPIPE \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + ERROR_NEGATIVE_SEEK)</div><div class='del'>-#define APR_STATUS_IS_EAGAIN(s)         ((s) == APR_EAGAIN \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + ERROR_NO_DATA \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + SOCEWOULDBLOCK \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + ERROR_LOCK_VIOLATION)</div><div class='del'>-#define APR_STATUS_IS_EINTR(s)          ((s) == APR_EINTR \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + SOCEINTR)</div><div class='del'>-#define APR_STATUS_IS_ENOTSOCK(s)       ((s) == APR_ENOTSOCK \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + SOCENOTSOCK)</div><div class='del'>-#define APR_STATUS_IS_ECONNREFUSED(s)   ((s) == APR_ECONNREFUSED \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + SOCECONNREFUSED)</div><div class='del'>-#define APR_STATUS_IS_EINPROGRESS(s)    ((s) == APR_EINPROGRESS \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + SOCEINPROGRESS)</div><div class='del'>-#define APR_STATUS_IS_ECONNABORTED(s)   ((s) == APR_ECONNABORTED \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + SOCECONNABORTED)</div><div class='del'>-#define APR_STATUS_IS_ECONNRESET(s)     ((s) == APR_ECONNRESET \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + SOCECONNRESET)</div><div class='del'>-/* XXX deprecated */</div><div class='del'>-#define APR_STATUS_IS_ETIMEDOUT(s)         ((s) == APR_ETIMEDOUT \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + SOCETIMEDOUT)    </div><div class='del'>-#undef APR_STATUS_IS_TIMEUP</div><div class='del'>-#define APR_STATUS_IS_TIMEUP(s)         ((s) == APR_TIMEUP \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + SOCETIMEDOUT)    </div><div class='del'>-#define APR_STATUS_IS_EHOSTUNREACH(s)   ((s) == APR_EHOSTUNREACH \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + SOCEHOSTUNREACH)</div><div class='del'>-#define APR_STATUS_IS_ENETUNREACH(s)    ((s) == APR_ENETUNREACH \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + SOCENETUNREACH)</div><div class='del'>-#define APR_STATUS_IS_EFTYPE(s)         ((s) == APR_EFTYPE)</div><div class='del'>-#define APR_STATUS_IS_EPIPE(s)          ((s) == APR_EPIPE \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + ERROR_BROKEN_PIPE \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + SOCEPIPE)</div><div class='del'>-#define APR_STATUS_IS_EXDEV(s)          ((s) == APR_EXDEV \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + ERROR_NOT_SAME_DEVICE)</div><div class='del'>-#define APR_STATUS_IS_ENOTEMPTY(s)      ((s) == APR_ENOTEMPTY \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + ERROR_DIR_NOT_EMPTY \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + ERROR_ACCESS_DENIED)</div><div class='del'>-</div><div class='del'>-/*</div><div class='del'>-    Sorry, too tired to wrap this up for OS2... feel free to</div><div class='del'>-    fit the following into their best matches.</div><div class='del'>-</div><div class='del'>-    { ERROR_NO_SIGNAL_SENT,     ESRCH           },</div><div class='del'>-    { SOCEALREADY,              EALREADY        },</div><div class='del'>-    { SOCEDESTADDRREQ,          EDESTADDRREQ    },</div><div class='del'>-    { SOCEMSGSIZE,              EMSGSIZE        },</div><div class='del'>-    { SOCEPROTOTYPE,            EPROTOTYPE      },</div><div class='del'>-    { SOCENOPROTOOPT,           ENOPROTOOPT     },</div><div class='del'>-    { SOCEPROTONOSUPPORT,       EPROTONOSUPPORT },</div><div class='del'>-    { SOCESOCKTNOSUPPORT,       ESOCKTNOSUPPORT },</div><div class='del'>-    { SOCEOPNOTSUPP,            EOPNOTSUPP      },</div><div class='del'>-    { SOCEPFNOSUPPORT,          EPFNOSUPPORT    },</div><div class='del'>-    { SOCEAFNOSUPPORT,          EAFNOSUPPORT    },</div><div class='del'>-    { SOCEADDRINUSE,            EADDRINUSE      },</div><div class='del'>-    { SOCEADDRNOTAVAIL,         EADDRNOTAVAIL   },</div><div class='del'>-    { SOCENETDOWN,              ENETDOWN        },</div><div class='del'>-    { SOCENETRESET,             ENETRESET       },</div><div class='del'>-    { SOCENOBUFS,               ENOBUFS         },</div><div class='del'>-    { SOCEISCONN,               EISCONN         },</div><div class='del'>-    { SOCENOTCONN,              ENOTCONN        },</div><div class='del'>-    { SOCESHUTDOWN,             ESHUTDOWN       },</div><div class='del'>-    { SOCETOOMANYREFS,          ETOOMANYREFS    },</div><div class='del'>-    { SOCELOOP,                 ELOOP           },</div><div class='del'>-    { SOCEHOSTDOWN,             EHOSTDOWN       },</div><div class='del'>-    { SOCENOTEMPTY,             ENOTEMPTY       },</div><div class='del'>-    { SOCEPIPE,                 EPIPE           }</div><div class='del'>-*/</div><div class='del'>-</div><div class='del'>-#elif defined(WIN32) &amp;&amp; !defined(DOXYGEN) /* !defined(OS2) */</div><div class='del'>-</div><div class='del'>-#define APR_FROM_OS_ERROR(e) (e == 0 ? APR_SUCCESS : e + APR_OS_START_SYSERR)</div><div class='del'>-#define APR_TO_OS_ERROR(e)   (e == 0 ? APR_SUCCESS : e - APR_OS_START_SYSERR)</div><div class='del'>-</div><div class='del'>-#define apr_get_os_error()   (APR_FROM_OS_ERROR(GetLastError()))</div><div class='del'>-#define apr_set_os_error(e)  (SetLastError(APR_TO_OS_ERROR(e)))</div><div class='del'>-</div><div class='del'>-/* A special case, only socket calls require this:</div><div class='del'>- */</div><div class='del'>-#define apr_get_netos_error()   (APR_FROM_OS_ERROR(WSAGetLastError()))</div><div class='del'>-#define apr_set_netos_error(e)   (WSASetLastError(APR_TO_OS_ERROR(e)))</div><div class='del'>-</div><div class='del'>-/* APR CANONICAL ERROR TESTS */</div><div class='del'>-#define APR_STATUS_IS_EACCES(s)         ((s) == APR_EACCES \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + ERROR_ACCESS_DENIED \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + ERROR_CANNOT_MAKE \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + ERROR_CURRENT_DIRECTORY \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + ERROR_DRIVE_LOCKED \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + ERROR_FAIL_I24 \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + ERROR_LOCK_VIOLATION \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + ERROR_LOCK_FAILED \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + ERROR_NOT_LOCKED \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + ERROR_NETWORK_ACCESS_DENIED \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + ERROR_SHARING_VIOLATION)</div><div class='del'>-#define APR_STATUS_IS_EEXIST(s)         ((s) == APR_EEXIST \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + ERROR_FILE_EXISTS \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + ERROR_ALREADY_EXISTS)</div><div class='del'>-#define APR_STATUS_IS_ENAMETOOLONG(s)   ((s) == APR_ENAMETOOLONG \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + ERROR_FILENAME_EXCED_RANGE \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + WSAENAMETOOLONG)</div><div class='del'>-#define APR_STATUS_IS_ENOENT(s)         ((s) == APR_ENOENT \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + ERROR_FILE_NOT_FOUND \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + ERROR_PATH_NOT_FOUND \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + ERROR_OPEN_FAILED \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + ERROR_NO_MORE_FILES)</div><div class='del'>-#define APR_STATUS_IS_ENOTDIR(s)        ((s) == APR_ENOTDIR \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + ERROR_PATH_NOT_FOUND \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + ERROR_BAD_NETPATH \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + ERROR_BAD_NET_NAME \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + ERROR_BAD_PATHNAME \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + ERROR_INVALID_DRIVE)</div><div class='del'>-#define APR_STATUS_IS_ENOSPC(s)         ((s) == APR_ENOSPC \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + ERROR_DISK_FULL)</div><div class='del'>-#define APR_STATUS_IS_ENOMEM(s)         ((s) == APR_ENOMEM \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + ERROR_ARENA_TRASHED \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + ERROR_NOT_ENOUGH_MEMORY \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + ERROR_INVALID_BLOCK \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + ERROR_NOT_ENOUGH_QUOTA \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + ERROR_OUTOFMEMORY)</div><div class='del'>-#define APR_STATUS_IS_EMFILE(s)         ((s) == APR_EMFILE \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + ERROR_TOO_MANY_OPEN_FILES)</div><div class='del'>-#define APR_STATUS_IS_ENFILE(s)         ((s) == APR_ENFILE)</div><div class='del'>-#define APR_STATUS_IS_EBADF(s)          ((s) == APR_EBADF \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + ERROR_INVALID_HANDLE \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + ERROR_INVALID_TARGET_HANDLE)</div><div class='del'>-#define APR_STATUS_IS_EINVAL(s)         ((s) == APR_EINVAL \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + ERROR_INVALID_ACCESS \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + ERROR_INVALID_DATA \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + ERROR_INVALID_FUNCTION \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + ERROR_INVALID_HANDLE \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + ERROR_INVALID_PARAMETER \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + ERROR_NEGATIVE_SEEK)</div><div class='del'>-#define APR_STATUS_IS_ESPIPE(s)         ((s) == APR_ESPIPE \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + ERROR_SEEK_ON_DEVICE \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + ERROR_NEGATIVE_SEEK)</div><div class='del'>-#define APR_STATUS_IS_EAGAIN(s)         ((s) == APR_EAGAIN \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + ERROR_NO_DATA \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + ERROR_NO_PROC_SLOTS \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + ERROR_NESTING_NOT_ALLOWED \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + ERROR_MAX_THRDS_REACHED \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + ERROR_LOCK_VIOLATION \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + WSAEWOULDBLOCK)</div><div class='del'>-#define APR_STATUS_IS_EINTR(s)          ((s) == APR_EINTR \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + WSAEINTR)</div><div class='del'>-#define APR_STATUS_IS_ENOTSOCK(s)       ((s) == APR_ENOTSOCK \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + WSAENOTSOCK)</div><div class='del'>-#define APR_STATUS_IS_ECONNREFUSED(s)   ((s) == APR_ECONNREFUSED \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + WSAECONNREFUSED)</div><div class='del'>-#define APR_STATUS_IS_EINPROGRESS(s)    ((s) == APR_EINPROGRESS \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + WSAEINPROGRESS)</div><div class='del'>-#define APR_STATUS_IS_ECONNABORTED(s)   ((s) == APR_ECONNABORTED \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + WSAECONNABORTED)</div><div class='del'>-#define APR_STATUS_IS_ECONNRESET(s)     ((s) == APR_ECONNRESET \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + ERROR_NETNAME_DELETED \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + WSAECONNRESET)</div><div class='del'>-/* XXX deprecated */</div><div class='del'>-#define APR_STATUS_IS_ETIMEDOUT(s)         ((s) == APR_ETIMEDOUT \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + WSAETIMEDOUT \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + WAIT_TIMEOUT)</div><div class='del'>-#undef APR_STATUS_IS_TIMEUP</div><div class='del'>-#define APR_STATUS_IS_TIMEUP(s)         ((s) == APR_TIMEUP \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + WSAETIMEDOUT \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + WAIT_TIMEOUT)</div><div class='del'>-#define APR_STATUS_IS_EHOSTUNREACH(s)   ((s) == APR_EHOSTUNREACH \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + WSAEHOSTUNREACH)</div><div class='del'>-#define APR_STATUS_IS_ENETUNREACH(s)    ((s) == APR_ENETUNREACH \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + WSAENETUNREACH)</div><div class='del'>-#define APR_STATUS_IS_EFTYPE(s)         ((s) == APR_EFTYPE \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + ERROR_EXE_MACHINE_TYPE_MISMATCH \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + ERROR_INVALID_DLL \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + ERROR_INVALID_MODULETYPE \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + ERROR_BAD_EXE_FORMAT \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + ERROR_INVALID_EXE_SIGNATURE \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + ERROR_FILE_CORRUPT \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + ERROR_BAD_FORMAT)</div><div class='del'>-#define APR_STATUS_IS_EPIPE(s)          ((s) == APR_EPIPE \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + ERROR_BROKEN_PIPE)</div><div class='del'>-#define APR_STATUS_IS_EXDEV(s)          ((s) == APR_EXDEV \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + ERROR_NOT_SAME_DEVICE)</div><div class='del'>-#define APR_STATUS_IS_ENOTEMPTY(s)      ((s) == APR_ENOTEMPTY \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + ERROR_DIR_NOT_EMPTY)</div><div class='del'>-</div><div class='del'>-#elif defined(NETWARE) &amp;&amp; defined(USE_WINSOCK) &amp;&amp; !defined(DOXYGEN) /* !defined(OS2) &amp;&amp; !defined(WIN32) */</div><div class='del'>-</div><div class='del'>-#define APR_FROM_OS_ERROR(e) (e == 0 ? APR_SUCCESS : e + APR_OS_START_SYSERR)</div><div class='del'>-#define APR_TO_OS_ERROR(e)   (e == 0 ? APR_SUCCESS : e - APR_OS_START_SYSERR)</div><div class='del'>-</div><div class='del'>-#define apr_get_os_error()    (errno)</div><div class='del'>-#define apr_set_os_error(e)   (errno = (e))</div><div class='del'>-</div><div class='del'>-/* A special case, only socket calls require this: */</div><div class='del'>-#define apr_get_netos_error()   (APR_FROM_OS_ERROR(WSAGetLastError()))</div><div class='del'>-#define apr_set_netos_error(e)  (WSASetLastError(APR_TO_OS_ERROR(e)))</div><div class='del'>-</div><div class='del'>-/* APR CANONICAL ERROR TESTS */</div><div class='del'>-#define APR_STATUS_IS_EACCES(s)         ((s) == APR_EACCES)</div><div class='del'>-#define APR_STATUS_IS_EEXIST(s)         ((s) == APR_EEXIST)</div><div class='del'>-#define APR_STATUS_IS_ENAMETOOLONG(s)   ((s) == APR_ENAMETOOLONG)</div><div class='del'>-#define APR_STATUS_IS_ENOENT(s)         ((s) == APR_ENOENT)</div><div class='del'>-#define APR_STATUS_IS_ENOTDIR(s)        ((s) == APR_ENOTDIR)</div><div class='del'>-#define APR_STATUS_IS_ENOSPC(s)         ((s) == APR_ENOSPC)</div><div class='del'>-#define APR_STATUS_IS_ENOMEM(s)         ((s) == APR_ENOMEM)</div><div class='del'>-#define APR_STATUS_IS_EMFILE(s)         ((s) == APR_EMFILE)</div><div class='del'>-#define APR_STATUS_IS_ENFILE(s)         ((s) == APR_ENFILE)</div><div class='del'>-#define APR_STATUS_IS_EBADF(s)          ((s) == APR_EBADF)</div><div class='del'>-#define APR_STATUS_IS_EINVAL(s)         ((s) == APR_EINVAL)</div><div class='del'>-#define APR_STATUS_IS_ESPIPE(s)         ((s) == APR_ESPIPE)</div><div class='del'>-</div><div class='del'>-#define APR_STATUS_IS_EAGAIN(s)         ((s) == APR_EAGAIN \</div><div class='del'>-                || (s) ==                       EWOULDBLOCK \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + WSAEWOULDBLOCK)</div><div class='del'>-#define APR_STATUS_IS_EINTR(s)          ((s) == APR_EINTR \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + WSAEINTR)</div><div class='del'>-#define APR_STATUS_IS_ENOTSOCK(s)       ((s) == APR_ENOTSOCK \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + WSAENOTSOCK)</div><div class='del'>-#define APR_STATUS_IS_ECONNREFUSED(s)   ((s) == APR_ECONNREFUSED \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + WSAECONNREFUSED)</div><div class='del'>-#define APR_STATUS_IS_EINPROGRESS(s)    ((s) == APR_EINPROGRESS \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + WSAEINPROGRESS)</div><div class='del'>-#define APR_STATUS_IS_ECONNABORTED(s)   ((s) == APR_ECONNABORTED \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + WSAECONNABORTED)</div><div class='del'>-#define APR_STATUS_IS_ECONNRESET(s)     ((s) == APR_ECONNRESET \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + WSAECONNRESET)</div><div class='del'>-/* XXX deprecated */</div><div class='del'>-#define APR_STATUS_IS_ETIMEDOUT(s)       ((s) == APR_ETIMEDOUT \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + WSAETIMEDOUT \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + WAIT_TIMEOUT)</div><div class='del'>-#undef APR_STATUS_IS_TIMEUP</div><div class='del'>-#define APR_STATUS_IS_TIMEUP(s)         ((s) == APR_TIMEUP \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + WSAETIMEDOUT \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + WAIT_TIMEOUT)</div><div class='del'>-#define APR_STATUS_IS_EHOSTUNREACH(s)   ((s) == APR_EHOSTUNREACH \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + WSAEHOSTUNREACH)</div><div class='del'>-#define APR_STATUS_IS_ENETUNREACH(s)    ((s) == APR_ENETUNREACH \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + WSAENETUNREACH)</div><div class='del'>-#define APR_STATUS_IS_ENETDOWN(s)       ((s) == APR_OS_START_SYSERR + WSAENETDOWN)</div><div class='del'>-#define APR_STATUS_IS_EFTYPE(s)         ((s) == APR_EFTYPE)</div><div class='del'>-#define APR_STATUS_IS_EPIPE(s)          ((s) == APR_EPIPE)</div><div class='del'>-#define APR_STATUS_IS_EXDEV(s)          ((s) == APR_EXDEV)</div><div class='del'>-#define APR_STATUS_IS_ENOTEMPTY(s)      ((s) == APR_ENOTEMPTY)</div><div class='del'>-</div><div class='del'>-#else /* !defined(NETWARE) &amp;&amp; !defined(OS2) &amp;&amp; !defined(WIN32) */</div><div class='del'>-</div><div class='del'>-/*</div><div class='del'>- *  os error codes are clib error codes</div><div class='del'>- */</div><div class='del'>-#define APR_FROM_OS_ERROR(e)  (e)</div><div class='del'>-#define APR_TO_OS_ERROR(e)    (e)</div><div class='del'>-</div><div class='del'>-#define apr_get_os_error()    (errno)</div><div class='del'>-#define apr_set_os_error(e)   (errno = (e))</div><div class='del'>-</div><div class='del'>-/* A special case, only socket calls require this:</div><div class='del'>- */</div><div class='del'>-#define apr_get_netos_error() (errno)</div><div class='del'>-#define apr_set_netos_error(e) (errno = (e))</div><div class='del'>-</div><div class='del'>-/** </div><div class='del'>- * @addtogroup APR_STATUS_IS</div><div class='del'>- * @{</div><div class='del'>- */</div><div class='del'>-</div><div class='del'>-/** permission denied */</div><div class='del'>-#define APR_STATUS_IS_EACCES(s)         ((s) == APR_EACCES)</div><div class='del'>-/** file exists */</div><div class='del'>-#define APR_STATUS_IS_EEXIST(s)         ((s) == APR_EEXIST)</div><div class='del'>-/** path name is too long */</div><div class='del'>-#define APR_STATUS_IS_ENAMETOOLONG(s)   ((s) == APR_ENAMETOOLONG)</div><div class='del'>-/**</div><div class='del'>- * no such file or directory</div><div class='del'>- * @remark</div><div class='del'>- * EMVSCATLG can be returned by the automounter on z/OS for</div><div class='del'>- * paths which do not exist.</div><div class='del'>- */</div><div class='del'>-#ifdef EMVSCATLG</div><div class='del'>-#define APR_STATUS_IS_ENOENT(s)         ((s) == APR_ENOENT \</div><div class='del'>-                                      || (s) == EMVSCATLG)</div><div class='del'>-#else</div><div class='del'>-#define APR_STATUS_IS_ENOENT(s)         ((s) == APR_ENOENT)</div><div class='del'>-#endif</div><div class='del'>-/** not a directory */</div><div class='del'>-#define APR_STATUS_IS_ENOTDIR(s)        ((s) == APR_ENOTDIR)</div><div class='del'>-/** no space left on device */</div><div class='del'>-#ifdef EDQUOT</div><div class='del'>-#define APR_STATUS_IS_ENOSPC(s)         ((s) == APR_ENOSPC \</div><div class='del'>-                                      || (s) == EDQUOT)</div><div class='del'>-#else</div><div class='del'>-#define APR_STATUS_IS_ENOSPC(s)         ((s) == APR_ENOSPC)</div><div class='del'>-#endif</div><div class='del'>-/** not enough memory */</div><div class='del'>-#define APR_STATUS_IS_ENOMEM(s)         ((s) == APR_ENOMEM)</div><div class='del'>-/** too many open files */</div><div class='del'>-#define APR_STATUS_IS_EMFILE(s)         ((s) == APR_EMFILE)</div><div class='del'>-/** file table overflow */</div><div class='del'>-#define APR_STATUS_IS_ENFILE(s)         ((s) == APR_ENFILE)</div><div class='del'>-/** bad file # */</div><div class='del'>-#define APR_STATUS_IS_EBADF(s)          ((s) == APR_EBADF)</div><div class='del'>-/** invalid argument */</div><div class='del'>-#define APR_STATUS_IS_EINVAL(s)         ((s) == APR_EINVAL)</div><div class='del'>-/** illegal seek */</div><div class='del'>-#define APR_STATUS_IS_ESPIPE(s)         ((s) == APR_ESPIPE)</div><div class='del'>-</div><div class='del'>-/** operation would block */</div><div class='del'>-#if !defined(EWOULDBLOCK) || !defined(EAGAIN)</div><div class='del'>-#define APR_STATUS_IS_EAGAIN(s)         ((s) == APR_EAGAIN)</div><div class='del'>-#elif (EWOULDBLOCK == EAGAIN)</div><div class='del'>-#define APR_STATUS_IS_EAGAIN(s)         ((s) == APR_EAGAIN)</div><div class='del'>-#else</div><div class='del'>-#define APR_STATUS_IS_EAGAIN(s)         ((s) == APR_EAGAIN \</div><div class='del'>-                                      || (s) == EWOULDBLOCK)</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-/** interrupted system call */</div><div class='del'>-#define APR_STATUS_IS_EINTR(s)          ((s) == APR_EINTR)</div><div class='del'>-/** socket operation on a non-socket */</div><div class='del'>-#define APR_STATUS_IS_ENOTSOCK(s)       ((s) == APR_ENOTSOCK)</div><div class='del'>-/** Connection Refused */</div><div class='del'>-#define APR_STATUS_IS_ECONNREFUSED(s)   ((s) == APR_ECONNREFUSED)</div><div class='del'>-/** operation now in progress */</div><div class='del'>-#define APR_STATUS_IS_EINPROGRESS(s)    ((s) == APR_EINPROGRESS)</div><div class='del'>-</div><div class='del'>-/** </div><div class='del'>- * Software caused connection abort </div><div class='del'>- * @remark</div><div class='del'>- * EPROTO on certain older kernels really means ECONNABORTED, so we need to </div><div class='del'>- * ignore it for them.  See discussion in new-httpd archives nh.9701 &amp; nh.9603</div><div class='del'>- *</div><div class='del'>- * There is potentially a bug in Solaris 2.x x&lt;6, and other boxes that </div><div class='del'>- * implement tcp sockets in userland (i.e. on top of STREAMS).  On these</div><div class='del'>- * systems, EPROTO can actually result in a fatal loop.  See PR#981 for </div><div class='del'>- * example.  It's hard to handle both uses of EPROTO.</div><div class='del'>- */</div><div class='del'>-#ifdef EPROTO</div><div class='del'>-#define APR_STATUS_IS_ECONNABORTED(s)    ((s) == APR_ECONNABORTED \</div><div class='del'>-                                       || (s) == EPROTO)</div><div class='del'>-#else</div><div class='del'>-#define APR_STATUS_IS_ECONNABORTED(s)    ((s) == APR_ECONNABORTED)</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-/** Connection Reset by peer */</div><div class='del'>-#define APR_STATUS_IS_ECONNRESET(s)      ((s) == APR_ECONNRESET)</div><div class='del'>-/** Operation timed out</div><div class='del'>- *  @deprecated */</div><div class='del'>-#define APR_STATUS_IS_ETIMEDOUT(s)      ((s) == APR_ETIMEDOUT)</div><div class='del'>-/** no route to host */</div><div class='del'>-#define APR_STATUS_IS_EHOSTUNREACH(s)    ((s) == APR_EHOSTUNREACH)</div><div class='del'>-/** network is unreachable */</div><div class='del'>-#define APR_STATUS_IS_ENETUNREACH(s)     ((s) == APR_ENETUNREACH)</div><div class='del'>-/** inappropiate file type or format */</div><div class='del'>-#define APR_STATUS_IS_EFTYPE(s)          ((s) == APR_EFTYPE)</div><div class='del'>-/** broken pipe */</div><div class='del'>-#define APR_STATUS_IS_EPIPE(s)           ((s) == APR_EPIPE)</div><div class='del'>-/** cross device link */</div><div class='del'>-#define APR_STATUS_IS_EXDEV(s)           ((s) == APR_EXDEV)</div><div class='del'>-/** Directory Not Empty */</div><div class='del'>-#define APR_STATUS_IS_ENOTEMPTY(s)       ((s) == APR_ENOTEMPTY || \</div><div class='del'>-                                          (s) == APR_EEXIST)</div><div class='del'>-/** @} */</div><div class='del'>-</div><div class='del'>-#endif /* !defined(NETWARE) &amp;&amp; !defined(OS2) &amp;&amp; !defined(WIN32) */</div><div class='del'>-</div><div class='del'>-/** @} */</div><div class='del'>-</div><div class='del'>-#ifdef __cplusplus</div><div class='del'>-}</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-#endif  /* ! APR_ERRNO_H */</div><div class='del'>-#ifndef _LINUX_ERRNO_H</div><div class='del'>-#define _LINUX_ERRNO_H</div><div class='del'>-</div><div class='del'>-#include &lt;asm/errno.h&gt;</div><div class='del'>-</div><div class='del'>-#ifdef __KERNEL__</div><div class='del'>-</div><div class='del'>-/* Should never be seen by user programs */</div><div class='del'>-#define ERESTARTSYS	512</div><div class='del'>-#define ERESTARTNOINTR	513</div><div class='del'>-#define ERESTARTNOHAND	514	/* restart if no handler.. */</div><div class='del'>-#define ENOIOCTLCMD	515	/* No ioctl command */</div><div class='del'>-#define ERESTART_RESTARTBLOCK 516 /* restart by calling sys_restart_syscall */</div><div class='del'>-</div><div class='del'>-/* Defined for the NFSv3 protocol */</div><div class='del'>-#define EBADHANDLE	521	/* Illegal NFS file handle */</div><div class='del'>-#define ENOTSYNC	522	/* Update synchronization mismatch */</div><div class='del'>-#define EBADCOOKIE	523	/* Cookie is stale */</div><div class='del'>-#define ENOTSUPP	524	/* Operation is not supported */</div><div class='del'>-#define ETOOSMALL	525	/* Buffer or request is too small */</div><div class='del'>-#define ESERVERFAULT	526	/* An untranslatable error occurred */</div><div class='del'>-#define EBADTYPE	527	/* Type not supported by server */</div><div class='del'>-#define EJUKEBOX	528	/* Request initiated, but will not complete before timeout */</div><div class='del'>-#define EIOCBQUEUED	529	/* iocb queued, will get completion event */</div><div class='del'>-#define EIOCBRETRY	530	/* iocb queued, will trigger a retry */</div><div class='del'>-</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-#endif</div><div class='del'>-// Copyright (c) 1994 James Clark</div><div class='del'>-// See the file COPYING for copying permission.</div><div class='del'>-</div><div class='del'>-#ifndef ErrnoMessageArg_INCLUDED</div><div class='del'>-#define ErrnoMessageArg_INCLUDED 1</div><div class='del'>-</div><div class='del'>-#include "MessageArg.h"</div><div class='del'>-#include "rtti.h"</div><div class='del'>-</div><div class='del'>-#ifdef SP_NAMESPACE</div><div class='del'>-namespace SP_NAMESPACE {</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-class SP_API ErrnoMessageArg : public OtherMessageArg {</div><div class='del'>-  RTTI_CLASS</div><div class='del'>-public:</div><div class='del'>-  ErrnoMessageArg(int errnum) : errno_(errnum) { }</div><div class='del'>-  MessageArg *copy() const;</div><div class='del'>-  // errno might be a macro so we must use a different name</div><div class='del'>-  int errnum() const;</div><div class='del'>-private:</div><div class='del'>-  int errno_;</div><div class='del'>-};</div><div class='del'>-</div><div class='del'>-inline</div><div class='del'>-int ErrnoMessageArg::errnum() const</div><div class='del'>-{</div><div class='del'>-  return errno_;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-#ifdef SP_NAMESPACE</div><div class='del'>-}</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-#endif /* not ErrnoMessageArg_INCLUDED */</div><div class='del'>-/* Copyright (C) 1991,92,93,94,95,96,97,2002 Free Software Foundation, Inc.</div><div class='del'>-   This file is part of the GNU C Library.</div><div class='del'>-</div><div class='del'>-   The GNU C Library is free software; you can redistribute it and/or</div><div class='del'>-   modify it under the terms of the GNU Lesser General Public</div><div class='del'>-   License as published by the Free Software Foundation; either</div><div class='del'>-   version 2.1 of the License, or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-   The GNU C Library is distributed in the hope that it will be useful,</div><div class='del'>-   but WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-   Lesser General Public License for more details.</div><div class='del'>-</div><div class='del'>-   You should have received a copy of the GNU Lesser General Public</div><div class='del'>-   License along with the GNU C Library; if not, write to the Free</div><div class='del'>-   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA</div><div class='del'>-   02111-1307 USA.  */</div><div class='del'>-</div><div class='del'>-/*</div><div class='del'>- *	ISO C99 Standard: 7.5 Errors	&lt;errno.h&gt;</div><div class='del'>- */</div><div class='del'>-</div><div class='del'>-#ifndef	_ERRNO_H</div><div class='del'>-</div><div class='del'>-/* The includer defined __need_Emath if he wants only the definitions</div><div class='del'>-   of EDOM and ERANGE, and not everything else.  */</div><div class='del'>-#ifndef	__need_Emath</div><div class='del'>-# define _ERRNO_H	1</div><div class='del'>-# include &lt;features.h&gt;</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-__BEGIN_DECLS</div><div class='del'>-</div><div class='del'>-/* Get the error number constants from the system-specific file.</div><div class='del'>-   This file will test __need_Emath and _ERRNO_H.  */</div><div class='del'>-#include &lt;bits/errno.h&gt;</div><div class='del'>-#undef	__need_Emath</div><div class='del'>-</div><div class='del'>-#ifdef	_ERRNO_H</div><div class='del'>-</div><div class='del'>-/* Declare the `errno' variable, unless it's defined as a macro by</div><div class='del'>-   bits/errno.h.  This is the case in GNU, where it is a per-thread</div><div class='del'>-   variable.  This redeclaration using the macro still works, but it</div><div class='del'>-   will be a function declaration without a prototype and may trigger</div><div class='del'>-   a -Wstrict-prototypes warning.  */</div><div class='del'>-#ifndef	errno</div><div class='del'>-extern int errno;</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-#ifdef __USE_GNU</div><div class='del'>-</div><div class='del'>-/* The full and simple forms of the name with which the program was</div><div class='del'>-   invoked.  These variables are set up automatically at startup based on</div><div class='del'>-   the value of ARGV[0] (this works only if you use GNU ld).  */</div><div class='del'>-extern char *program_invocation_name, *program_invocation_short_name;</div><div class='del'>-#endif /* __USE_GNU */</div><div class='del'>-#endif /* _ERRNO_H */</div><div class='del'>-</div><div class='del'>-__END_DECLS</div><div class='del'>-</div><div class='del'>-#endif /* _ERRNO_H */</div><div class='del'>-</div><div class='del'>-/* The Hurd &lt;bits/errno.h&gt; defines `error_t' as an enumerated type so</div><div class='del'>-   that printing `error_t' values in the debugger shows the names.  We</div><div class='del'>-   might need this definition sometimes even if this file was included</div><div class='del'>-   before.  */</div><div class='del'>-#if defined __USE_GNU || defined __need_error_t</div><div class='del'>-# ifndef __error_t_defined</div><div class='del'>-typedef int error_t;</div><div class='del'>-#  define __error_t_defined	1</div><div class='del'>-# endif</div><div class='del'>-# undef __need_error_t</div><div class='del'>-#endif</div><div class='del'>-#ifndef _I386_ERRNO_H</div><div class='del'>-#define _I386_ERRNO_H</div><div class='del'>-</div><div class='del'>-#include &lt;asm-generic/errno.h&gt;</div><div class='del'>-</div><div class='del'>-#endif</div><div class='del'>-#ifndef _ASM_GENERIC_ERRNO_BASE_H</div><div class='del'>-#define _ASM_GENERIC_ERRNO_BASE_H</div><div class='del'>-</div><div class='del'>-#define	EPERM		 1	/* Operation not permitted */</div><div class='del'>-#define	ENOENT		 2	/* No such file or directory */</div><div class='del'>-#define	ESRCH		 3	/* No such process */</div><div class='del'>-#define	EINTR		 4	/* Interrupted system call */</div><div class='del'>-#define	EIO		 5	/* I/O error */</div><div class='del'>-#define	ENXIO		 6	/* No such device or address */</div><div class='del'>-#define	E2BIG		 7	/* Argument list too long */</div><div class='del'>-#define	ENOEXEC		 8	/* Exec format error */</div><div class='del'>-#define	EBADF		 9	/* Bad file number */</div><div class='del'>-#define	ECHILD		10	/* No child processes */</div><div class='del'>-#define	EAGAIN		11	/* Try again */</div><div class='del'>-#define	ENOMEM		12	/* Out of memory */</div><div class='del'>-#define	EACCES		13	/* Permission denied */</div><div class='del'>-#define	EFAULT		14	/* Bad address */</div><div class='del'>-#define	ENOTBLK		15	/* Block device required */</div><div class='del'>-#define	EBUSY		16	/* Device or resource busy */</div><div class='del'>-#define	EEXIST		17	/* File exists */</div><div class='del'>-#define	EXDEV		18	/* Cross-device link */</div><div class='del'>-#define	ENODEV		19	/* No such device */</div><div class='del'>-#define	ENOTDIR		20	/* Not a directory */</div><div class='del'>-#define	EISDIR		21	/* Is a directory */</div><div class='del'>-#define	EINVAL		22	/* Invalid argument */</div><div class='del'>-#define	ENFILE		23	/* File table overflow */</div><div class='del'>-#define	EMFILE		24	/* Too many open files */</div><div class='del'>-#define	ENOTTY		25	/* Not a typewriter */</div><div class='del'>-#define	ETXTBSY		26	/* Text file busy */</div><div class='del'>-#define	EFBIG		27	/* File too large */</div><div class='del'>-#define	ENOSPC		28	/* No space left on device */</div><div class='del'>-#define	ESPIPE		29	/* Illegal seek */</div><div class='del'>-#define	EROFS		30	/* Read-only file system */</div><div class='del'>-#define	EMLINK		31	/* Too many links */</div><div class='del'>-#define	EPIPE		32	/* Broken pipe */</div><div class='del'>-#define	EDOM		33	/* Math argument out of domain of func */</div><div class='del'>-#define	ERANGE		34	/* Math result not representable */</div><div class='del'>-</div><div class='del'>-#endif</div><div class='del'>-#ifndef _ASM_GENERIC_ERRNO_H</div><div class='del'>-#define _ASM_GENERIC_ERRNO_H</div><div class='del'>-</div><div class='del'>-#include &lt;asm-generic/errno-base.h&gt;</div><div class='del'>-</div><div class='del'>-#define	EDEADLK		35	/* Resource deadlock would occur */</div><div class='del'>-#define	ENAMETOOLONG	36	/* File name too long */</div><div class='del'>-#define	ENOLCK		37	/* No record locks available */</div><div class='del'>-#define	ENOSYS		38	/* Function not implemented */</div><div class='del'>-#define	ENOTEMPTY	39	/* Directory not empty */</div><div class='del'>-#define	ELOOP		40	/* Too many symbolic links encountered */</div><div class='del'>-#define	EWOULDBLOCK	EAGAIN	/* Operation would block */</div><div class='del'>-#define	ENOMSG		42	/* No message of desired type */</div><div class='del'>-#define	EIDRM		43	/* Identifier removed */</div><div class='del'>-#define	ECHRNG		44	/* Channel number out of range */</div><div class='del'>-#define	EL2NSYNC	45	/* Level 2 not synchronized */</div><div class='del'>-#define	EL3HLT		46	/* Level 3 halted */</div><div class='del'>-#define	EL3RST		47	/* Level 3 reset */</div><div class='del'>-#define	ELNRNG		48	/* Link number out of range */</div><div class='del'>-#define	EUNATCH		49	/* Protocol driver not attached */</div><div class='del'>-#define	ENOCSI		50	/* No CSI structure available */</div><div class='del'>-#define	EL2HLT		51	/* Level 2 halted */</div><div class='del'>-#define	EBADE		52	/* Invalid exchange */</div><div class='del'>-#define	EBADR		53	/* Invalid request descriptor */</div><div class='del'>-#define	EXFULL		54	/* Exchange full */</div><div class='del'>-#define	ENOANO		55	/* No anode */</div><div class='del'>-#define	EBADRQC		56	/* Invalid request code */</div><div class='del'>-#define	EBADSLT		57	/* Invalid slot */</div><div class='del'>-</div><div class='del'>-#define	EDEADLOCK	EDEADLK</div><div class='del'>-</div><div class='del'>-#define	EBFONT		59	/* Bad font file format */</div><div class='del'>-#define	ENOSTR		60	/* Device not a stream */</div><div class='del'>-#define	ENODATA		61	/* No data available */</div><div class='del'>-#define	ETIME		62	/* Timer expired */</div><div class='del'>-#define	ENOSR		63	/* Out of streams resources */</div><div class='del'>-#define	ENONET		64	/* Machine is not on the network */</div><div class='del'>-#define	ENOPKG		65	/* Package not installed */</div><div class='del'>-#define	EREMOTE		66	/* Object is remote */</div><div class='del'>-#define	ENOLINK		67	/* Link has been severed */</div><div class='del'>-#define	EADV		68	/* Advertise error */</div><div class='del'>-#define	ESRMNT		69	/* Srmount error */</div><div class='del'>-#define	ECOMM		70	/* Communication error on send */</div><div class='del'>-#define	EPROTO		71	/* Protocol error */</div><div class='del'>-#define	EMULTIHOP	72	/* Multihop attempted */</div><div class='del'>-#define	EDOTDOT		73	/* RFS specific error */</div><div class='del'>-#define	EBADMSG		74	/* Not a data message */</div><div class='del'>-#define	EOVERFLOW	75	/* Value too large for defined data type */</div><div class='del'>-#define	ENOTUNIQ	76	/* Name not unique on network */</div><div class='del'>-#define	EBADFD		77	/* File descriptor in bad state */</div><div class='del'>-#define	EREMCHG		78	/* Remote address changed */</div><div class='del'>-#define	ELIBACC		79	/* Can not access a needed shared library */</div><div class='del'>-#define	ELIBBAD		80	/* Accessing a corrupted shared library */</div><div class='del'>-#define	ELIBSCN		81	/* .lib section in a.out corrupted */</div><div class='del'>-#define	ELIBMAX		82	/* Attempting to link in too many shared libraries */</div><div class='del'>-#define	ELIBEXEC	83	/* Cannot exec a shared library directly */</div><div class='del'>-#define	EILSEQ		84	/* Illegal byte sequence */</div><div class='del'>-#define	ERESTART	85	/* Interrupted system call should be restarted */</div><div class='del'>-#define	ESTRPIPE	86	/* Streams pipe error */</div><div class='del'>-#define	EUSERS		87	/* Too many users */</div><div class='del'>-#define	ENOTSOCK	88	/* Socket operation on non-socket */</div><div class='del'>-#define	EDESTADDRREQ	89	/* Destination address required */</div><div class='del'>-#define	EMSGSIZE	90	/* Message too long */</div><div class='del'>-#define	EPROTOTYPE	91	/* Protocol wrong type for socket */</div><div class='del'>-#define	ENOPROTOOPT	92	/* Protocol not available */</div><div class='del'>-#define	EPROTONOSUPPORT	93	/* Protocol not supported */</div><div class='del'>-#define	ESOCKTNOSUPPORT	94	/* Socket type not supported */</div><div class='del'>-#define	EOPNOTSUPP	95	/* Operation not supported on transport endpoint */</div><div class='del'>-#define	EPFNOSUPPORT	96	/* Protocol family not supported */</div><div class='del'>-#define	EAFNOSUPPORT	97	/* Address family not supported by protocol */</div><div class='del'>-#define	EADDRINUSE	98	/* Address already in use */</div><div class='del'>-#define	EADDRNOTAVAIL	99	/* Cannot assign requested address */</div><div class='del'>-#define	ENETDOWN	100	/* Network is down */</div><div class='del'>-#define	ENETUNREACH	101	/* Network is unreachable */</div><div class='del'>-#define	ENETRESET	102	/* Network dropped connection because of reset */</div><div class='del'>-#define	ECONNABORTED	103	/* Software caused connection abort */</div><div class='del'>-#define	ECONNRESET	104	/* Connection reset by peer */</div><div class='del'>-#define	ENOBUFS		105	/* No buffer space available */</div><div class='del'>-#define	EISCONN		106	/* Transport endpoint is already connected */</div><div class='del'>-#define	ENOTCONN	107	/* Transport endpoint is not connected */</div><div class='del'>-#define	ESHUTDOWN	108	/* Cannot send after transport endpoint shutdown */</div><div class='del'>-#define	ETOOMANYREFS	109	/* Too many references: cannot splice */</div><div class='del'>-#define	ETIMEDOUT	110	/* Connection timed out */</div><div class='del'>-#define	ECONNREFUSED	111	/* Connection refused */</div><div class='del'>-#define	EHOSTDOWN	112	/* Host is down */</div><div class='del'>-#define	EHOSTUNREACH	113	/* No route to host */</div><div class='del'>-#define	EALREADY	114	/* Operation already in progress */</div><div class='del'>-#define	EINPROGRESS	115	/* Operation now in progress */</div><div class='del'>-#define	ESTALE		116	/* Stale NFS file handle */</div><div class='del'>-#define	EUCLEAN		117	/* Structure needs cleaning */</div><div class='del'>-#define	ENOTNAM		118	/* Not a XENIX named type file */</div><div class='del'>-#define	ENAVAIL		119	/* No XENIX semaphores available */</div><div class='del'>-#define	EISNAM		120	/* Is a named type file */</div><div class='del'>-#define	EREMOTEIO	121	/* Remote I/O error */</div><div class='del'>-#define	EDQUOT		122	/* Quota exceeded */</div><div class='del'>-</div><div class='del'>-#define	ENOMEDIUM	123	/* No medium found */</div><div class='del'>-#define	EMEDIUMTYPE	124	/* Wrong medium type */</div><div class='del'>-#define	ECANCELED	125	/* Operation Canceled */</div><div class='del'>-#define	ENOKEY		126	/* Required key not available */</div><div class='del'>-#define	EKEYEXPIRED	127	/* Key has expired */</div><div class='del'>-#define	EKEYREVOKED	128	/* Key has been revoked */</div><div class='del'>-#define	EKEYREJECTED	129	/* Key was rejected by service */</div><div class='del'>-</div><div class='del'>-/* for robust mutexes */</div><div class='del'>-#define	EOWNERDEAD	130	/* Owner died */</div><div class='del'>-#define	ENOTRECOVERABLE	131	/* State not recoverable */</div><div class='del'>-</div><div class='del'>-#endif</div><div class='head'>diff --git a/doc/errno.list.macosx.txt b/doc/errno.list.macosx.txt<br/>deleted file mode 100644<br/>index 728753ac793..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/doc/errno.list.macosx.txt?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>doc/errno.list.macosx.txt</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,1513 +0,0 @@</div><div class='del'>-/* Copyright 2000-2005 The Apache Software Foundation or its licensors, as</div><div class='del'>- * applicable.</div><div class='del'>- *</div><div class='del'>- * Licensed under the Apache License, Version 2.0 (the "License");</div><div class='del'>- * you may not use this file except in compliance with the License.</div><div class='del'>- * You may obtain a copy of the License at</div><div class='del'>- *</div><div class='del'>- *     http://www.apache.org/licenses/LICENSE-2.0</div><div class='del'>- *</div><div class='del'>- * Unless required by applicable law or agreed to in writing, software</div><div class='del'>- * distributed under the License is distributed on an "AS IS" BASIS,</div><div class='del'>- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.</div><div class='del'>- * See the License for the specific language governing permissions and</div><div class='del'>- * limitations under the License.</div><div class='del'>- */</div><div class='del'>-</div><div class='del'>-#ifndef APR_ERRNO_H</div><div class='del'>-#define APR_ERRNO_H</div><div class='del'>-</div><div class='del'>-/**</div><div class='del'>- * @file apr_errno.h</div><div class='del'>- * @brief APR Error Codes</div><div class='del'>- */</div><div class='del'>-</div><div class='del'>-#include "apr.h"</div><div class='del'>-</div><div class='del'>-#if APR_HAVE_ERRNO_H</div><div class='del'>-#include &lt;errno.h&gt;</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-#ifdef __cplusplus</div><div class='del'>-extern "C" {</div><div class='del'>-#endif /* __cplusplus */</div><div class='del'>-</div><div class='del'>-/**</div><div class='del'>- * @defgroup apr_errno Error Codes</div><div class='del'>- * @ingroup APR </div><div class='del'>- * @{</div><div class='del'>- */</div><div class='del'>-</div><div class='del'>-/**</div><div class='del'>- * Type for specifying an error or status code.</div><div class='del'>- */</div><div class='del'>-typedef int apr_status_t;</div><div class='del'>-</div><div class='del'>-/**</div><div class='del'>- * Return a human readable string describing the specified error.</div><div class='del'>- * @param statcode The error code the get a string for.</div><div class='del'>- * @param buf A buffer to hold the error string.</div><div class='del'>- * @param bufsize Size of the buffer to hold the string.</div><div class='del'>- */</div><div class='del'>-APR_DECLARE(char *) apr_strerror(apr_status_t statcode, char *buf, </div><div class='del'>-                                 apr_size_t bufsize);</div><div class='del'>-</div><div class='del'>-#if defined(DOXYGEN)</div><div class='del'>-/**</div><div class='del'>- * @def APR_FROM_OS_ERROR(os_err_type syserr)</div><div class='del'>- * Fold a platform specific error into an apr_status_t code.</div><div class='del'>- * @return apr_status_t</div><div class='del'>- * @param e The platform os error code.</div><div class='del'>- * @warning  macro implementation; the syserr argument may be evaluated</div><div class='del'>- *      multiple times.</div><div class='del'>- */</div><div class='del'>-#define APR_FROM_OS_ERROR(e) (e == 0 ? APR_SUCCESS : e + APR_OS_START_SYSERR)</div><div class='del'>-</div><div class='del'>-/**</div><div class='del'>- * @def APR_TO_OS_ERROR(apr_status_t statcode)</div><div class='del'>- * @return os_err_type</div><div class='del'>- * Fold an apr_status_t code back to the native platform defined error.</div><div class='del'>- * @param e The apr_status_t folded platform os error code.</div><div class='del'>- * @warning  macro implementation; the statcode argument may be evaluated</div><div class='del'>- *      multiple times.  If the statcode was not created by apr_get_os_error </div><div class='del'>- *      or APR_FROM_OS_ERROR, the results are undefined.</div><div class='del'>- */</div><div class='del'>-#define APR_TO_OS_ERROR(e) (e == 0 ? APR_SUCCESS : e - APR_OS_START_SYSERR)</div><div class='del'>-</div><div class='del'>-/** @def apr_get_os_error()</div><div class='del'>- * @return apr_status_t the last platform error, folded into apr_status_t, on most platforms</div><div class='del'>- * @remark This retrieves errno, or calls a GetLastError() style function, and</div><div class='del'>- *      folds it with APR_FROM_OS_ERROR.  Some platforms (such as OS2) have no</div><div class='del'>- *      such mechanism, so this call may be unsupported.  Do NOT use this</div><div class='del'>- *      call for socket errors from socket, send, recv etc!</div><div class='del'>- */</div><div class='del'>-</div><div class='del'>-/** @def apr_set_os_error(e)</div><div class='del'>- * Reset the last platform error, unfolded from an apr_status_t, on some platforms</div><div class='del'>- * @param e The OS error folded in a prior call to APR_FROM_OS_ERROR()</div><div class='del'>- * @warning This is a macro implementation; the statcode argument may be evaluated</div><div class='del'>- *      multiple times.  If the statcode was not created by apr_get_os_error</div><div class='del'>- *      or APR_FROM_OS_ERROR, the results are undefined.  This macro sets</div><div class='del'>- *      errno, or calls a SetLastError() style function, unfolding statcode</div><div class='del'>- *      with APR_TO_OS_ERROR.  Some platforms (such as OS2) have no such</div><div class='del'>- *      mechanism, so this call may be unsupported.</div><div class='del'>- */</div><div class='del'>-</div><div class='del'>-/** @def apr_get_netos_error()</div><div class='del'>- * Return the last socket error, folded into apr_status_t, on all platforms</div><div class='del'>- * @remark This retrieves errno or calls a GetLastSocketError() style function,</div><div class='del'>- *      and folds it with APR_FROM_OS_ERROR.</div><div class='del'>- */</div><div class='del'>-</div><div class='del'>-/** @def apr_set_netos_error(e)</div><div class='del'>- * Reset the last socket error, unfolded from an apr_status_t</div><div class='del'>- * @param e The socket error folded in a prior call to APR_FROM_OS_ERROR()</div><div class='del'>- * @warning This is a macro implementation; the statcode argument may be evaluated</div><div class='del'>- *      multiple times.  If the statcode was not created by apr_get_os_error</div><div class='del'>- *      or APR_FROM_OS_ERROR, the results are undefined.  This macro sets</div><div class='del'>- *      errno, or calls a WSASetLastError() style function, unfolding </div><div class='del'>- *      socketcode with APR_TO_OS_ERROR.</div><div class='del'>- */</div><div class='del'>-</div><div class='del'>-#endif /* defined(DOXYGEN) */</div><div class='del'>-</div><div class='del'>-/**</div><div class='del'>- * APR_OS_START_ERROR is where the APR specific error values start.</div><div class='del'>- */</div><div class='del'>-#define APR_OS_START_ERROR     20000</div><div class='del'>-/**</div><div class='del'>- * APR_OS_ERRSPACE_SIZE is the maximum number of errors you can fit</div><div class='del'>- *    into one of the error/status ranges below -- except for</div><div class='del'>- *    APR_OS_START_USERERR, which see.</div><div class='del'>- */</div><div class='del'>-#define APR_OS_ERRSPACE_SIZE 50000</div><div class='del'>-/**</div><div class='del'>- * APR_OS_START_STATUS is where the APR specific status codes start.</div><div class='del'>- */</div><div class='del'>-#define APR_OS_START_STATUS    (APR_OS_START_ERROR + APR_OS_ERRSPACE_SIZE)</div><div class='del'>-/**</div><div class='del'>- * APR_OS_START_USERERR are reserved for applications that use APR that</div><div class='del'>- *     layer their own error codes along with APR's.  Note that the</div><div class='del'>- *     error immediately following this one is set ten times farther</div><div class='del'>- *     away than usual, so that users of apr have a lot of room in</div><div class='del'>- *     which to declare custom error codes.</div><div class='del'>- */</div><div class='del'>-#define APR_OS_START_USERERR    (APR_OS_START_STATUS + APR_OS_ERRSPACE_SIZE)</div><div class='del'>-/**</div><div class='del'>- * APR_OS_START_USEERR is obsolete, defined for compatibility only.</div><div class='del'>- * Use APR_OS_START_USERERR instead.</div><div class='del'>- */</div><div class='del'>-#define APR_OS_START_USEERR     APR_OS_START_USERERR</div><div class='del'>-/**</div><div class='del'>- * APR_OS_START_CANONERR is where APR versions of errno values are defined</div><div class='del'>- *     on systems which don't have the corresponding errno.</div><div class='del'>- */</div><div class='del'>-#define APR_OS_START_CANONERR  (APR_OS_START_USERERR \</div><div class='del'>-                                 + (APR_OS_ERRSPACE_SIZE * 10))</div><div class='del'>-/**</div><div class='del'>- * APR_OS_START_EAIERR folds EAI_ error codes from getaddrinfo() into </div><div class='del'>- *     apr_status_t values.</div><div class='del'>- */</div><div class='del'>-#define APR_OS_START_EAIERR    (APR_OS_START_CANONERR + APR_OS_ERRSPACE_SIZE)</div><div class='del'>-/**</div><div class='del'>- * APR_OS_START_SYSERR folds platform-specific system error values into </div><div class='del'>- *     apr_status_t values.</div><div class='del'>- */</div><div class='del'>-#define APR_OS_START_SYSERR    (APR_OS_START_EAIERR + APR_OS_ERRSPACE_SIZE)</div><div class='del'>-</div><div class='del'>-/** no error. */</div><div class='del'>-#define APR_SUCCESS 0</div><div class='del'>-</div><div class='del'>-/** </div><div class='del'>- * @defgroup APR_Error APR Error Values</div><div class='del'>- * &lt;PRE&gt;</div><div class='del'>- * &lt;b&gt;APR ERROR VALUES&lt;/b&gt;</div><div class='del'>- * APR_ENOSTAT      APR was unable to perform a stat on the file </div><div class='del'>- * APR_ENOPOOL      APR was not provided a pool with which to allocate memory</div><div class='del'>- * APR_EBADDATE     APR was given an invalid date </div><div class='del'>- * APR_EINVALSOCK   APR was given an invalid socket</div><div class='del'>- * APR_ENOPROC      APR was not given a process structure</div><div class='del'>- * APR_ENOTIME      APR was not given a time structure</div><div class='del'>- * APR_ENODIR       APR was not given a directory structure</div><div class='del'>- * APR_ENOLOCK      APR was not given a lock structure</div><div class='del'>- * APR_ENOPOLL      APR was not given a poll structure</div><div class='del'>- * APR_ENOSOCKET    APR was not given a socket</div><div class='del'>- * APR_ENOTHREAD    APR was not given a thread structure</div><div class='del'>- * APR_ENOTHDKEY    APR was not given a thread key structure</div><div class='del'>- * APR_ENOSHMAVAIL  There is no more shared memory available</div><div class='del'>- * APR_EDSOOPEN     APR was unable to open the dso object.  For more </div><div class='del'>- *                  information call apr_dso_error().</div><div class='del'>- * APR_EGENERAL     General failure (specific information not available)</div><div class='del'>- * APR_EBADIP       The specified IP address is invalid</div><div class='del'>- * APR_EBADMASK     The specified netmask is invalid</div><div class='del'>- * APR_ESYMNOTFOUND Could not find the requested symbol</div><div class='del'>- * &lt;/PRE&gt;</div><div class='del'>- *</div><div class='del'>- * &lt;PRE&gt;</div><div class='del'>- * &lt;b&gt;APR STATUS VALUES&lt;/b&gt;</div><div class='del'>- * APR_INCHILD        Program is currently executing in the child</div><div class='del'>- * APR_INPARENT       Program is currently executing in the parent</div><div class='del'>- * APR_DETACH         The thread is detached</div><div class='del'>- * APR_NOTDETACH      The thread is not detached</div><div class='del'>- * APR_CHILD_DONE     The child has finished executing</div><div class='del'>- * APR_CHILD_NOTDONE  The child has not finished executing</div><div class='del'>- * APR_TIMEUP         The operation did not finish before the timeout</div><div class='del'>- * APR_INCOMPLETE     The operation was incomplete although some processing</div><div class='del'>- *                    was performed and the results are partially valid</div><div class='del'>- * APR_BADCH          Getopt found an option not in the option string</div><div class='del'>- * APR_BADARG         Getopt found an option that is missing an argument </div><div class='del'>- *                    and an argument was specified in the option string</div><div class='del'>- * APR_EOF            APR has encountered the end of the file</div><div class='del'>- * APR_NOTFOUND       APR was unable to find the socket in the poll structure</div><div class='del'>- * APR_ANONYMOUS      APR is using anonymous shared memory</div><div class='del'>- * APR_FILEBASED      APR is using a file name as the key to the shared memory</div><div class='del'>- * APR_KEYBASED       APR is using a shared key as the key to the shared memory</div><div class='del'>- * APR_EINIT          Ininitalizer value.  If no option has been found, but </div><div class='del'>- *                    the status variable requires a value, this should be used</div><div class='del'>- * APR_ENOTIMPL       The APR function has not been implemented on this </div><div class='del'>- *                    platform, either because nobody has gotten to it yet, </div><div class='del'>- *                    or the function is impossible on this platform.</div><div class='del'>- * APR_EMISMATCH      Two passwords do not match.</div><div class='del'>- * APR_EABSOLUTE      The given path was absolute.</div><div class='del'>- * APR_ERELATIVE      The given path was relative.</div><div class='del'>- * APR_EINCOMPLETE    The given path was neither relative nor absolute.</div><div class='del'>- * APR_EABOVEROOT     The given path was above the root path.</div><div class='del'>- * APR_EBUSY          The given lock was busy.</div><div class='del'>- * APR_EPROC_UNKNOWN  The given process wasn't recognized by APR</div><div class='del'>- * &lt;/PRE&gt;</div><div class='del'>- * @{</div><div class='del'>- */</div><div class='del'>-/** @see APR_STATUS_IS_ENOSTAT */</div><div class='del'>-#define APR_ENOSTAT        (APR_OS_START_ERROR + 1)</div><div class='del'>-/** @see APR_STATUS_IS_ENOPOOL */</div><div class='del'>-#define APR_ENOPOOL        (APR_OS_START_ERROR + 2)</div><div class='del'>-/* empty slot: +3 */</div><div class='del'>-/** @see APR_STATUS_IS_EBADDATE */</div><div class='del'>-#define APR_EBADDATE       (APR_OS_START_ERROR + 4)</div><div class='del'>-/** @see APR_STATUS_IS_EINVALSOCK */</div><div class='del'>-#define APR_EINVALSOCK     (APR_OS_START_ERROR + 5)</div><div class='del'>-/** @see APR_STATUS_IS_ENOPROC */</div><div class='del'>-#define APR_ENOPROC        (APR_OS_START_ERROR + 6)</div><div class='del'>-/** @see APR_STATUS_IS_ENOTIME */</div><div class='del'>-#define APR_ENOTIME        (APR_OS_START_ERROR + 7)</div><div class='del'>-/** @see APR_STATUS_IS_ENODIR */</div><div class='del'>-#define APR_ENODIR         (APR_OS_START_ERROR + 8)</div><div class='del'>-/** @see APR_STATUS_IS_ENOLOCK */</div><div class='del'>-#define APR_ENOLOCK        (APR_OS_START_ERROR + 9)</div><div class='del'>-/** @see APR_STATUS_IS_ENOPOLL */</div><div class='del'>-#define APR_ENOPOLL        (APR_OS_START_ERROR + 10)</div><div class='del'>-/** @see APR_STATUS_IS_ENOSOCKET */</div><div class='del'>-#define APR_ENOSOCKET      (APR_OS_START_ERROR + 11)</div><div class='del'>-/** @see APR_STATUS_IS_ENOTHREAD */</div><div class='del'>-#define APR_ENOTHREAD      (APR_OS_START_ERROR + 12)</div><div class='del'>-/** @see APR_STATUS_IS_ENOTHDKEY */</div><div class='del'>-#define APR_ENOTHDKEY      (APR_OS_START_ERROR + 13)</div><div class='del'>-/** @see APR_STATUS_IS_EGENERAL */</div><div class='del'>-#define APR_EGENERAL       (APR_OS_START_ERROR + 14)</div><div class='del'>-/** @see APR_STATUS_IS_ENOSHMAVAIL */</div><div class='del'>-#define APR_ENOSHMAVAIL    (APR_OS_START_ERROR + 15)</div><div class='del'>-/** @see APR_STATUS_IS_EBADIP */</div><div class='del'>-#define APR_EBADIP         (APR_OS_START_ERROR + 16)</div><div class='del'>-/** @see APR_STATUS_IS_EBADMASK */</div><div class='del'>-#define APR_EBADMASK       (APR_OS_START_ERROR + 17)</div><div class='del'>-/* empty slot: +18 */</div><div class='del'>-/** @see APR_STATUS_IS_EDSOPEN */</div><div class='del'>-#define APR_EDSOOPEN       (APR_OS_START_ERROR + 19)</div><div class='del'>-/** @see APR_STATUS_IS_EABSOLUTE */</div><div class='del'>-#define APR_EABSOLUTE      (APR_OS_START_ERROR + 20)</div><div class='del'>-/** @see APR_STATUS_IS_ERELATIVE */</div><div class='del'>-#define APR_ERELATIVE      (APR_OS_START_ERROR + 21)</div><div class='del'>-/** @see APR_STATUS_IS_EINCOMPLETE */</div><div class='del'>-#define APR_EINCOMPLETE    (APR_OS_START_ERROR + 22)</div><div class='del'>-/** @see APR_STATUS_IS_EABOVEROOT */</div><div class='del'>-#define APR_EABOVEROOT     (APR_OS_START_ERROR + 23)</div><div class='del'>-/** @see APR_STATUS_IS_EBADPATH */</div><div class='del'>-#define APR_EBADPATH       (APR_OS_START_ERROR + 24)</div><div class='del'>-/** @see APR_STATUS_IS_EPATHWILD */</div><div class='del'>-#define APR_EPATHWILD      (APR_OS_START_ERROR + 25)</div><div class='del'>-/** @see APR_STATUS_IS_ESYMNOTFOUND */</div><div class='del'>-#define APR_ESYMNOTFOUND   (APR_OS_START_ERROR + 26)</div><div class='del'>-/** @see APR_STATUS_IS_EPROC_UNKNOWN */</div><div class='del'>-#define APR_EPROC_UNKNOWN  (APR_OS_START_ERROR + 27)</div><div class='del'>-/** @see APR_STATUS_IS_ENOTENOUGHENTROPY */</div><div class='del'>-#define APR_ENOTENOUGHENTROPY (APR_OS_START_ERROR + 28)</div><div class='del'>-/** @} */</div><div class='del'>-</div><div class='del'>-/** </div><div class='del'>- * @defgroup APR_STATUS_IS Status Value Tests</div><div class='del'>- * @warning For any particular error condition, more than one of these tests</div><div class='del'>- *      may match. This is because platform-specific error codes may not</div><div class='del'>- *      always match the semantics of the POSIX codes these tests (and the</div><div class='del'>- *      corresponding APR error codes) are named after. A notable example</div><div class='del'>- *      are the APR_STATUS_IS_ENOENT and APR_STATUS_IS_ENOTDIR tests on</div><div class='del'>- *      Win32 platforms. The programmer should always be aware of this and</div><div class='del'>- *      adjust the order of the tests accordingly.</div><div class='del'>- * @{</div><div class='del'>- */</div><div class='del'>-/** </div><div class='del'>- * APR was unable to perform a stat on the file </div><div class='del'>- * @warning always use this test, as platform-specific variances may meet this</div><div class='del'>- * more than one error code </div><div class='del'>- */</div><div class='del'>-#define APR_STATUS_IS_ENOSTAT(s)        ((s) == APR_ENOSTAT)</div><div class='del'>-/** </div><div class='del'>- * APR was not provided a pool with which to allocate memory </div><div class='del'>- * @warning always use this test, as platform-specific variances may meet this</div><div class='del'>- * more than one error code </div><div class='del'>- */</div><div class='del'>-#define APR_STATUS_IS_ENOPOOL(s)        ((s) == APR_ENOPOOL)</div><div class='del'>-/** APR was given an invalid date  */</div><div class='del'>-#define APR_STATUS_IS_EBADDATE(s)       ((s) == APR_EBADDATE)</div><div class='del'>-/** APR was given an invalid socket */</div><div class='del'>-#define APR_STATUS_IS_EINVALSOCK(s)     ((s) == APR_EINVALSOCK)</div><div class='del'>-/** APR was not given a process structure */</div><div class='del'>-#define APR_STATUS_IS_ENOPROC(s)        ((s) == APR_ENOPROC)</div><div class='del'>-/** APR was not given a time structure */</div><div class='del'>-#define APR_STATUS_IS_ENOTIME(s)        ((s) == APR_ENOTIME)</div><div class='del'>-/** APR was not given a directory structure */</div><div class='del'>-#define APR_STATUS_IS_ENODIR(s)         ((s) == APR_ENODIR)</div><div class='del'>-/** APR was not given a lock structure */</div><div class='del'>-#define APR_STATUS_IS_ENOLOCK(s)        ((s) == APR_ENOLOCK)</div><div class='del'>-/** APR was not given a poll structure */</div><div class='del'>-#define APR_STATUS_IS_ENOPOLL(s)        ((s) == APR_ENOPOLL)</div><div class='del'>-/** APR was not given a socket */</div><div class='del'>-#define APR_STATUS_IS_ENOSOCKET(s)      ((s) == APR_ENOSOCKET)</div><div class='del'>-/** APR was not given a thread structure */</div><div class='del'>-#define APR_STATUS_IS_ENOTHREAD(s)      ((s) == APR_ENOTHREAD)</div><div class='del'>-/** APR was not given a thread key structure */</div><div class='del'>-#define APR_STATUS_IS_ENOTHDKEY(s)      ((s) == APR_ENOTHDKEY)</div><div class='del'>-/** Generic Error which can not be put into another spot */</div><div class='del'>-#define APR_STATUS_IS_EGENERAL(s)       ((s) == APR_EGENERAL)</div><div class='del'>-/** There is no more shared memory available */</div><div class='del'>-#define APR_STATUS_IS_ENOSHMAVAIL(s)    ((s) == APR_ENOSHMAVAIL)</div><div class='del'>-/** The specified IP address is invalid */</div><div class='del'>-#define APR_STATUS_IS_EBADIP(s)         ((s) == APR_EBADIP)</div><div class='del'>-/** The specified netmask is invalid */</div><div class='del'>-#define APR_STATUS_IS_EBADMASK(s)       ((s) == APR_EBADMASK)</div><div class='del'>-/* empty slot: +18 */</div><div class='del'>-/** </div><div class='del'>- * APR was unable to open the dso object.  </div><div class='del'>- * For more information call apr_dso_error().</div><div class='del'>- */</div><div class='del'>-#if defined(WIN32)</div><div class='del'>-#define APR_STATUS_IS_EDSOOPEN(s)       ((s) == APR_EDSOOPEN \</div><div class='del'>-                       || APR_TO_OS_ERROR(s) == ERROR_MOD_NOT_FOUND)</div><div class='del'>-#else</div><div class='del'>-#define APR_STATUS_IS_EDSOOPEN(s)       ((s) == APR_EDSOOPEN)</div><div class='del'>-#endif</div><div class='del'>-/** The given path was absolute. */</div><div class='del'>-#define APR_STATUS_IS_EABSOLUTE(s)      ((s) == APR_EABSOLUTE)</div><div class='del'>-/** The given path was relative. */</div><div class='del'>-#define APR_STATUS_IS_ERELATIVE(s)      ((s) == APR_ERELATIVE)</div><div class='del'>-/** The given path was neither relative nor absolute. */</div><div class='del'>-#define APR_STATUS_IS_EINCOMPLETE(s)    ((s) == APR_EINCOMPLETE)</div><div class='del'>-/** The given path was above the root path. */</div><div class='del'>-#define APR_STATUS_IS_EABOVEROOT(s)     ((s) == APR_EABOVEROOT)</div><div class='del'>-/** The given path was bad. */</div><div class='del'>-#define APR_STATUS_IS_EBADPATH(s)       ((s) == APR_EBADPATH)</div><div class='del'>-/** The given path contained wildcards. */</div><div class='del'>-#define APR_STATUS_IS_EPATHWILD(s)      ((s) == APR_EPATHWILD)</div><div class='del'>-/** Could not find the requested symbol.</div><div class='del'>- * For more information call apr_dso_error().</div><div class='del'>- */</div><div class='del'>-#if defined(WIN32)</div><div class='del'>-#define APR_STATUS_IS_ESYMNOTFOUND(s)   ((s) == APR_ESYMNOTFOUND \</div><div class='del'>-                       || APR_TO_OS_ERROR(s) == ERROR_PROC_NOT_FOUND)</div><div class='del'>-#else</div><div class='del'>-#define APR_STATUS_IS_ESYMNOTFOUND(s)   ((s) == APR_ESYMNOTFOUND)</div><div class='del'>-#endif</div><div class='del'>-/** The given process was not recognized by APR. */</div><div class='del'>-#define APR_STATUS_IS_EPROC_UNKNOWN(s)  ((s) == APR_EPROC_UNKNOWN)</div><div class='del'>-</div><div class='del'>-/** APR could not gather enough entropy to continue. */</div><div class='del'>-#define APR_STATUS_IS_ENOTENOUGHENTROPY(s) ((s) == APR_ENOTENOUGHENTROPY)</div><div class='del'>-</div><div class='del'>-/** @} */</div><div class='del'>-</div><div class='del'>-/** </div><div class='del'>- * @addtogroup APR_Error</div><div class='del'>- * @{</div><div class='del'>- */</div><div class='del'>-/** @see APR_STATUS_IS_INCHILD */</div><div class='del'>-#define APR_INCHILD        (APR_OS_START_STATUS + 1)</div><div class='del'>-/** @see APR_STATUS_IS_INPARENT */</div><div class='del'>-#define APR_INPARENT       (APR_OS_START_STATUS + 2)</div><div class='del'>-/** @see APR_STATUS_IS_DETACH */</div><div class='del'>-#define APR_DETACH         (APR_OS_START_STATUS + 3)</div><div class='del'>-/** @see APR_STATUS_IS_NOTDETACH */</div><div class='del'>-#define APR_NOTDETACH      (APR_OS_START_STATUS + 4)</div><div class='del'>-/** @see APR_STATUS_IS_CHILD_DONE */</div><div class='del'>-#define APR_CHILD_DONE     (APR_OS_START_STATUS + 5)</div><div class='del'>-/** @see APR_STATUS_IS_CHILD_NOTDONE */</div><div class='del'>-#define APR_CHILD_NOTDONE  (APR_OS_START_STATUS + 6)</div><div class='del'>-/** @see APR_STATUS_IS_TIMEUP */</div><div class='del'>-#define APR_TIMEUP         (APR_OS_START_STATUS + 7)</div><div class='del'>-/** @see APR_STATUS_IS_INCOMPLETE */</div><div class='del'>-#define APR_INCOMPLETE     (APR_OS_START_STATUS + 8)</div><div class='del'>-/* empty slot: +9 */</div><div class='del'>-/* empty slot: +10 */</div><div class='del'>-/* empty slot: +11 */</div><div class='del'>-/** @see APR_STATUS_IS_BADCH */</div><div class='del'>-#define APR_BADCH          (APR_OS_START_STATUS + 12)</div><div class='del'>-/** @see APR_STATUS_IS_BADARG */</div><div class='del'>-#define APR_BADARG         (APR_OS_START_STATUS + 13)</div><div class='del'>-/** @see APR_STATUS_IS_EOF */</div><div class='del'>-#define APR_EOF            (APR_OS_START_STATUS + 14)</div><div class='del'>-/** @see APR_STATUS_IS_NOTFOUND */</div><div class='del'>-#define APR_NOTFOUND       (APR_OS_START_STATUS + 15)</div><div class='del'>-/* empty slot: +16 */</div><div class='del'>-/* empty slot: +17 */</div><div class='del'>-/* empty slot: +18 */</div><div class='del'>-/** @see APR_STATUS_IS_ANONYMOUS */</div><div class='del'>-#define APR_ANONYMOUS      (APR_OS_START_STATUS + 19)</div><div class='del'>-/** @see APR_STATUS_IS_FILEBASED */</div><div class='del'>-#define APR_FILEBASED      (APR_OS_START_STATUS + 20)</div><div class='del'>-/** @see APR_STATUS_IS_KEYBASED */</div><div class='del'>-#define APR_KEYBASED       (APR_OS_START_STATUS + 21)</div><div class='del'>-/** @see APR_STATUS_IS_EINIT */</div><div class='del'>-#define APR_EINIT          (APR_OS_START_STATUS + 22)  </div><div class='del'>-/** @see APR_STATUS_IS_ENOTIMPL */</div><div class='del'>-#define APR_ENOTIMPL       (APR_OS_START_STATUS + 23)</div><div class='del'>-/** @see APR_STATUS_IS_EMISMATCH */</div><div class='del'>-#define APR_EMISMATCH      (APR_OS_START_STATUS + 24)</div><div class='del'>-/** @see APR_STATUS_IS_EBUSY */</div><div class='del'>-#define APR_EBUSY          (APR_OS_START_STATUS + 25)</div><div class='del'>-/** @} */</div><div class='del'>-</div><div class='del'>-/** </div><div class='del'>- * @addtogroup APR_STATUS_IS</div><div class='del'>- * @{</div><div class='del'>- */</div><div class='del'>-/** </div><div class='del'>- * Program is currently executing in the child </div><div class='del'>- * @warning</div><div class='del'>- * always use this test, as platform-specific variances may meet this</div><div class='del'>- * more than one error code */</div><div class='del'>-#define APR_STATUS_IS_INCHILD(s)        ((s) == APR_INCHILD)</div><div class='del'>-/** </div><div class='del'>- * Program is currently executing in the parent </div><div class='del'>- * @warning</div><div class='del'>- * always use this test, as platform-specific variances may meet this</div><div class='del'>- * more than one error code </div><div class='del'>- */</div><div class='del'>-#define APR_STATUS_IS_INPARENT(s)       ((s) == APR_INPARENT)</div><div class='del'>-/** </div><div class='del'>- * The thread is detached </div><div class='del'>- * @warning</div><div class='del'>- * always use this test, as platform-specific variances may meet this</div><div class='del'>- * more than one error code </div><div class='del'>- */</div><div class='del'>-#define APR_STATUS_IS_DETACH(s)         ((s) == APR_DETACH)</div><div class='del'>-/** </div><div class='del'>- * The thread is not detached </div><div class='del'>- * @warning</div><div class='del'>- * always use this test, as platform-specific variances may meet this</div><div class='del'>- * more than one error code </div><div class='del'>- */</div><div class='del'>-#define APR_STATUS_IS_NOTDETACH(s)      ((s) == APR_NOTDETACH)</div><div class='del'>-/** </div><div class='del'>- * The child has finished executing</div><div class='del'>- * @warning</div><div class='del'>- * always use this test, as platform-specific variances may meet this</div><div class='del'>- * more than one error code </div><div class='del'>- */</div><div class='del'>-#define APR_STATUS_IS_CHILD_DONE(s)     ((s) == APR_CHILD_DONE)</div><div class='del'>-/** </div><div class='del'>- * The child has not finished executing</div><div class='del'>- * @warning</div><div class='del'>- * always use this test, as platform-specific variances may meet this</div><div class='del'>- * more than one error code </div><div class='del'>- */</div><div class='del'>-#define APR_STATUS_IS_CHILD_NOTDONE(s)  ((s) == APR_CHILD_NOTDONE)</div><div class='del'>-/** </div><div class='del'>- * The operation did not finish before the timeout</div><div class='del'>- * @warning</div><div class='del'>- * always use this test, as platform-specific variances may meet this</div><div class='del'>- * more than one error code </div><div class='del'>- */</div><div class='del'>-#define APR_STATUS_IS_TIMEUP(s)         ((s) == APR_TIMEUP)</div><div class='del'>-/** </div><div class='del'>- * The operation was incomplete although some processing was performed</div><div class='del'>- * and the results are partially valid.</div><div class='del'>- * @warning</div><div class='del'>- * always use this test, as platform-specific variances may meet this</div><div class='del'>- * more than one error code </div><div class='del'>- */</div><div class='del'>-#define APR_STATUS_IS_INCOMPLETE(s)     ((s) == APR_INCOMPLETE)</div><div class='del'>-/* empty slot: +9 */</div><div class='del'>-/* empty slot: +10 */</div><div class='del'>-/* empty slot: +11 */</div><div class='del'>-/** </div><div class='del'>- * Getopt found an option not in the option string</div><div class='del'>- * @warning</div><div class='del'>- * always use this test, as platform-specific variances may meet this</div><div class='del'>- * more than one error code </div><div class='del'>- */</div><div class='del'>-#define APR_STATUS_IS_BADCH(s)          ((s) == APR_BADCH)</div><div class='del'>-/** </div><div class='del'>- * Getopt found an option not in the option string and an argument was </div><div class='del'>- * specified in the option string</div><div class='del'>- * @warning</div><div class='del'>- * always use this test, as platform-specific variances may meet this</div><div class='del'>- * more than one error code </div><div class='del'>- */</div><div class='del'>-#define APR_STATUS_IS_BADARG(s)         ((s) == APR_BADARG)</div><div class='del'>-/** </div><div class='del'>- * APR has encountered the end of the file</div><div class='del'>- * @warning</div><div class='del'>- * always use this test, as platform-specific variances may meet this</div><div class='del'>- * more than one error code </div><div class='del'>- */</div><div class='del'>-#define APR_STATUS_IS_EOF(s)            ((s) == APR_EOF)</div><div class='del'>-/** </div><div class='del'>- * APR was unable to find the socket in the poll structure</div><div class='del'>- * @warning</div><div class='del'>- * always use this test, as platform-specific variances may meet this</div><div class='del'>- * more than one error code </div><div class='del'>- */</div><div class='del'>-#define APR_STATUS_IS_NOTFOUND(s)       ((s) == APR_NOTFOUND)</div><div class='del'>-/* empty slot: +16 */</div><div class='del'>-/* empty slot: +17 */</div><div class='del'>-/* empty slot: +18 */</div><div class='del'>-/** </div><div class='del'>- * APR is using anonymous shared memory</div><div class='del'>- * @warning</div><div class='del'>- * always use this test, as platform-specific variances may meet this</div><div class='del'>- * more than one error code </div><div class='del'>- */</div><div class='del'>-#define APR_STATUS_IS_ANONYMOUS(s)      ((s) == APR_ANONYMOUS)</div><div class='del'>-/** </div><div class='del'>- * APR is using a file name as the key to the shared memory</div><div class='del'>- * @warning</div><div class='del'>- * always use this test, as platform-specific variances may meet this</div><div class='del'>- * more than one error code </div><div class='del'>- */</div><div class='del'>-#define APR_STATUS_IS_FILEBASED(s)      ((s) == APR_FILEBASED)</div><div class='del'>-/** </div><div class='del'>- * APR is using a shared key as the key to the shared memory</div><div class='del'>- * @warning</div><div class='del'>- * always use this test, as platform-specific variances may meet this</div><div class='del'>- * more than one error code </div><div class='del'>- */</div><div class='del'>-#define APR_STATUS_IS_KEYBASED(s)       ((s) == APR_KEYBASED)</div><div class='del'>-/** </div><div class='del'>- * Ininitalizer value.  If no option has been found, but </div><div class='del'>- * the status variable requires a value, this should be used</div><div class='del'>- * @warning</div><div class='del'>- * always use this test, as platform-specific variances may meet this</div><div class='del'>- * more than one error code </div><div class='del'>- */</div><div class='del'>-#define APR_STATUS_IS_EINIT(s)          ((s) == APR_EINIT)</div><div class='del'>-/** </div><div class='del'>- * The APR function has not been implemented on this </div><div class='del'>- * platform, either because nobody has gotten to it yet, </div><div class='del'>- * or the function is impossible on this platform.</div><div class='del'>- * @warning</div><div class='del'>- * always use this test, as platform-specific variances may meet this</div><div class='del'>- * more than one error code </div><div class='del'>- */</div><div class='del'>-#define APR_STATUS_IS_ENOTIMPL(s)       ((s) == APR_ENOTIMPL)</div><div class='del'>-/** </div><div class='del'>- * Two passwords do not match.</div><div class='del'>- * @warning</div><div class='del'>- * always use this test, as platform-specific variances may meet this</div><div class='del'>- * more than one error code </div><div class='del'>- */</div><div class='del'>-#define APR_STATUS_IS_EMISMATCH(s)      ((s) == APR_EMISMATCH)</div><div class='del'>-/** </div><div class='del'>- * The given lock was busy</div><div class='del'>- * @warning always use this test, as platform-specific variances may meet this</div><div class='del'>- * more than one error code </div><div class='del'>- */</div><div class='del'>-#define APR_STATUS_IS_EBUSY(s)          ((s) == APR_EBUSY)</div><div class='del'>-</div><div class='del'>-/** @} */</div><div class='del'>-</div><div class='del'>-/** </div><div class='del'>- * @addtogroup APR_Error APR Error Values</div><div class='del'>- * @{</div><div class='del'>- */</div><div class='del'>-/* APR CANONICAL ERROR VALUES */</div><div class='del'>-/** @see APR_STATUS_IS_EACCES */</div><div class='del'>-#ifdef EACCES</div><div class='del'>-#define APR_EACCES EACCES</div><div class='del'>-#else</div><div class='del'>-#define APR_EACCES         (APR_OS_START_CANONERR + 1)</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-/** @see APR_STATUS_IS_EXIST */</div><div class='del'>-#ifdef EEXIST</div><div class='del'>-#define APR_EEXIST EEXIST</div><div class='del'>-#else</div><div class='del'>-#define APR_EEXIST         (APR_OS_START_CANONERR + 2)</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-/** @see APR_STATUS_IS_ENAMETOOLONG */</div><div class='del'>-#ifdef ENAMETOOLONG</div><div class='del'>-#define APR_ENAMETOOLONG ENAMETOOLONG</div><div class='del'>-#else</div><div class='del'>-#define APR_ENAMETOOLONG   (APR_OS_START_CANONERR + 3)</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-/** @see APR_STATUS_IS_ENOENT */</div><div class='del'>-#ifdef ENOENT</div><div class='del'>-#define APR_ENOENT ENOENT</div><div class='del'>-#else</div><div class='del'>-#define APR_ENOENT         (APR_OS_START_CANONERR + 4)</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-/** @see APR_STATUS_IS_ENOTDIR */</div><div class='del'>-#ifdef ENOTDIR</div><div class='del'>-#define APR_ENOTDIR ENOTDIR</div><div class='del'>-#else</div><div class='del'>-#define APR_ENOTDIR        (APR_OS_START_CANONERR + 5)</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-/** @see APR_STATUS_IS_ENOSPC */</div><div class='del'>-#ifdef ENOSPC</div><div class='del'>-#define APR_ENOSPC ENOSPC</div><div class='del'>-#else</div><div class='del'>-#define APR_ENOSPC         (APR_OS_START_CANONERR + 6)</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-/** @see APR_STATUS_IS_ENOMEM */</div><div class='del'>-#ifdef ENOMEM</div><div class='del'>-#define APR_ENOMEM ENOMEM</div><div class='del'>-#else</div><div class='del'>-#define APR_ENOMEM         (APR_OS_START_CANONERR + 7)</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-/** @see APR_STATUS_IS_EMFILE */</div><div class='del'>-#ifdef EMFILE</div><div class='del'>-#define APR_EMFILE EMFILE</div><div class='del'>-#else</div><div class='del'>-#define APR_EMFILE         (APR_OS_START_CANONERR + 8)</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-/** @see APR_STATUS_IS_ENFILE */</div><div class='del'>-#ifdef ENFILE</div><div class='del'>-#define APR_ENFILE ENFILE</div><div class='del'>-#else</div><div class='del'>-#define APR_ENFILE         (APR_OS_START_CANONERR + 9)</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-/** @see APR_STATUS_IS_EBADF */</div><div class='del'>-#ifdef EBADF</div><div class='del'>-#define APR_EBADF EBADF</div><div class='del'>-#else</div><div class='del'>-#define APR_EBADF          (APR_OS_START_CANONERR + 10)</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-/** @see APR_STATUS_IS_EINVAL */</div><div class='del'>-#ifdef EINVAL</div><div class='del'>-#define APR_EINVAL EINVAL</div><div class='del'>-#else</div><div class='del'>-#define APR_EINVAL         (APR_OS_START_CANONERR + 11)</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-/** @see APR_STATUS_IS_ESPIPE */</div><div class='del'>-#ifdef ESPIPE</div><div class='del'>-#define APR_ESPIPE ESPIPE</div><div class='del'>-#else</div><div class='del'>-#define APR_ESPIPE         (APR_OS_START_CANONERR + 12)</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-/** </div><div class='del'>- * @see APR_STATUS_IS_EAGAIN </div><div class='del'>- * @warning use APR_STATUS_IS_EAGAIN instead of just testing this value</div><div class='del'>- */</div><div class='del'>-#ifdef EAGAIN</div><div class='del'>-#define APR_EAGAIN EAGAIN</div><div class='del'>-#elif defined(EWOULDBLOCK)</div><div class='del'>-#define APR_EAGAIN EWOULDBLOCK</div><div class='del'>-#else</div><div class='del'>-#define APR_EAGAIN         (APR_OS_START_CANONERR + 13)</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-/** @see APR_STATUS_IS_EINTR */</div><div class='del'>-#ifdef EINTR</div><div class='del'>-#define APR_EINTR EINTR</div><div class='del'>-#else</div><div class='del'>-#define APR_EINTR          (APR_OS_START_CANONERR + 14)</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-/** @see APR_STATUS_IS_ENOTSOCK */</div><div class='del'>-#ifdef ENOTSOCK</div><div class='del'>-#define APR_ENOTSOCK ENOTSOCK</div><div class='del'>-#else</div><div class='del'>-#define APR_ENOTSOCK       (APR_OS_START_CANONERR + 15)</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-/** @see APR_STATUS_IS_ECONNREFUSED */</div><div class='del'>-#ifdef ECONNREFUSED</div><div class='del'>-#define APR_ECONNREFUSED ECONNREFUSED</div><div class='del'>-#else</div><div class='del'>-#define APR_ECONNREFUSED   (APR_OS_START_CANONERR + 16)</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-/** @see APR_STATUS_IS_EINPROGRESS */</div><div class='del'>-#ifdef EINPROGRESS</div><div class='del'>-#define APR_EINPROGRESS EINPROGRESS</div><div class='del'>-#else</div><div class='del'>-#define APR_EINPROGRESS    (APR_OS_START_CANONERR + 17)</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-/** </div><div class='del'>- * @see APR_STATUS_IS_ECONNABORTED</div><div class='del'>- * @warning use APR_STATUS_IS_ECONNABORTED instead of just testing this value</div><div class='del'>- */</div><div class='del'>-</div><div class='del'>-#ifdef ECONNABORTED</div><div class='del'>-#define APR_ECONNABORTED ECONNABORTED</div><div class='del'>-#else</div><div class='del'>-#define APR_ECONNABORTED   (APR_OS_START_CANONERR + 18)</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-/** @see APR_STATUS_IS_ECONNRESET */</div><div class='del'>-#ifdef ECONNRESET</div><div class='del'>-#define APR_ECONNRESET ECONNRESET</div><div class='del'>-#else</div><div class='del'>-#define APR_ECONNRESET     (APR_OS_START_CANONERR + 19)</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-/** @see APR_STATUS_IS_ETIMEDOUT </div><div class='del'>- *  @deprecated */</div><div class='del'>-#ifdef ETIMEDOUT</div><div class='del'>-#define APR_ETIMEDOUT ETIMEDOUT</div><div class='del'>-#else</div><div class='del'>-#define APR_ETIMEDOUT      (APR_OS_START_CANONERR + 20)</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-/** @see APR_STATUS_IS_EHOSTUNREACH */</div><div class='del'>-#ifdef EHOSTUNREACH</div><div class='del'>-#define APR_EHOSTUNREACH EHOSTUNREACH</div><div class='del'>-#else</div><div class='del'>-#define APR_EHOSTUNREACH   (APR_OS_START_CANONERR + 21)</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-/** @see APR_STATUS_IS_ENETUNREACH */</div><div class='del'>-#ifdef ENETUNREACH</div><div class='del'>-#define APR_ENETUNREACH ENETUNREACH</div><div class='del'>-#else</div><div class='del'>-#define APR_ENETUNREACH    (APR_OS_START_CANONERR + 22)</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-/** @see APR_STATUS_IS_EFTYPE */</div><div class='del'>-#ifdef EFTYPE</div><div class='del'>-#define APR_EFTYPE EFTYPE</div><div class='del'>-#else</div><div class='del'>-#define APR_EFTYPE        (APR_OS_START_CANONERR + 23)</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-/** @see APR_STATUS_IS_EPIPE */</div><div class='del'>-#ifdef EPIPE</div><div class='del'>-#define APR_EPIPE EPIPE</div><div class='del'>-#else</div><div class='del'>-#define APR_EPIPE         (APR_OS_START_CANONERR + 24)</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-/** @see APR_STATUS_IS_EXDEV */</div><div class='del'>-#ifdef EXDEV</div><div class='del'>-#define APR_EXDEV EXDEV</div><div class='del'>-#else</div><div class='del'>-#define APR_EXDEV         (APR_OS_START_CANONERR + 25)</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-/** @see APR_STATUS_IS_ENOTEMPTY */</div><div class='del'>-#ifdef ENOTEMPTY</div><div class='del'>-#define APR_ENOTEMPTY ENOTEMPTY</div><div class='del'>-#else</div><div class='del'>-#define APR_ENOTEMPTY     (APR_OS_START_CANONERR + 26)</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-/** @} */</div><div class='del'>-</div><div class='del'>-#if defined(OS2) &amp;&amp; !defined(DOXYGEN)</div><div class='del'>-</div><div class='del'>-#define APR_FROM_OS_ERROR(e) (e == 0 ? APR_SUCCESS : e + APR_OS_START_SYSERR)</div><div class='del'>-#define APR_TO_OS_ERROR(e)   (e == 0 ? APR_SUCCESS : e - APR_OS_START_SYSERR)</div><div class='del'>-</div><div class='del'>-#define INCL_DOSERRORS</div><div class='del'>-#define INCL_DOS</div><div class='del'>-</div><div class='del'>-/* Leave these undefined.</div><div class='del'>- * OS2 doesn't rely on the errno concept.</div><div class='del'>- * The API calls always return a result codes which</div><div class='del'>- * should be filtered through APR_FROM_OS_ERROR().</div><div class='del'>- *</div><div class='del'>- * #define apr_get_os_error()   (APR_FROM_OS_ERROR(GetLastError()))</div><div class='del'>- * #define apr_set_os_error(e)  (SetLastError(APR_TO_OS_ERROR(e)))</div><div class='del'>- */</div><div class='del'>-</div><div class='del'>-/* A special case, only socket calls require this;</div><div class='del'>- */</div><div class='del'>-#define apr_get_netos_error()   (APR_FROM_OS_ERROR(errno))</div><div class='del'>-#define apr_set_netos_error(e)  (errno = APR_TO_OS_ERROR(e))</div><div class='del'>-</div><div class='del'>-/* And this needs to be greped away for good:</div><div class='del'>- */</div><div class='del'>-#define APR_OS2_STATUS(e) (APR_FROM_OS_ERROR(e))</div><div class='del'>-</div><div class='del'>-/* These can't sit in a private header, so in spite of the extra size, </div><div class='del'>- * they need to be made available here.</div><div class='del'>- */</div><div class='del'>-#define SOCBASEERR              10000</div><div class='del'>-#define SOCEPERM                (SOCBASEERR+1)             /* Not owner */</div><div class='del'>-#define SOCESRCH                (SOCBASEERR+3)             /* No such process */</div><div class='del'>-#define SOCEINTR                (SOCBASEERR+4)             /* Interrupted system call */</div><div class='del'>-#define SOCENXIO                (SOCBASEERR+6)             /* No such device or address */</div><div class='del'>-#define SOCEBADF                (SOCBASEERR+9)             /* Bad file number */</div><div class='del'>-#define SOCEACCES               (SOCBASEERR+13)            /* Permission denied */</div><div class='del'>-#define SOCEFAULT               (SOCBASEERR+14)            /* Bad address */</div><div class='del'>-#define SOCEINVAL               (SOCBASEERR+22)            /* Invalid argument */</div><div class='del'>-#define SOCEMFILE               (SOCBASEERR+24)            /* Too many open files */</div><div class='del'>-#define SOCEPIPE                (SOCBASEERR+32)            /* Broken pipe */</div><div class='del'>-#define SOCEOS2ERR              (SOCBASEERR+100)           /* OS/2 Error */</div><div class='del'>-#define SOCEWOULDBLOCK          (SOCBASEERR+35)            /* Operation would block */</div><div class='del'>-#define SOCEINPROGRESS          (SOCBASEERR+36)            /* Operation now in progress */</div><div class='del'>-#define SOCEALREADY             (SOCBASEERR+37)            /* Operation already in progress */</div><div class='del'>-#define SOCENOTSOCK             (SOCBASEERR+38)            /* Socket operation on non-socket */</div><div class='del'>-#define SOCEDESTADDRREQ         (SOCBASEERR+39)            /* Destination address required */</div><div class='del'>-#define SOCEMSGSIZE             (SOCBASEERR+40)            /* Message too long */</div><div class='del'>-#define SOCEPROTOTYPE           (SOCBASEERR+41)            /* Protocol wrong type for socket */</div><div class='del'>-#define SOCENOPROTOOPT          (SOCBASEERR+42)            /* Protocol not available */</div><div class='del'>-#define SOCEPROTONOSUPPORT      (SOCBASEERR+43)            /* Protocol not supported */</div><div class='del'>-#define SOCESOCKTNOSUPPORT      (SOCBASEERR+44)            /* Socket type not supported */</div><div class='del'>-#define SOCEOPNOTSUPP           (SOCBASEERR+45)            /* Operation not supported on socket */</div><div class='del'>-#define SOCEPFNOSUPPORT         (SOCBASEERR+46)            /* Protocol family not supported */</div><div class='del'>-#define SOCEAFNOSUPPORT         (SOCBASEERR+47)            /* Address family not supported by protocol family */</div><div class='del'>-#define SOCEADDRINUSE           (SOCBASEERR+48)            /* Address already in use */</div><div class='del'>-#define SOCEADDRNOTAVAIL        (SOCBASEERR+49)            /* Can't assign requested address */</div><div class='del'>-#define SOCENETDOWN             (SOCBASEERR+50)            /* Network is down */</div><div class='del'>-#define SOCENETUNREACH          (SOCBASEERR+51)            /* Network is unreachable */</div><div class='del'>-#define SOCENETRESET            (SOCBASEERR+52)            /* Network dropped connection on reset */</div><div class='del'>-#define SOCECONNABORTED         (SOCBASEERR+53)            /* Software caused connection abort */</div><div class='del'>-#define SOCECONNRESET           (SOCBASEERR+54)            /* Connection reset by peer */</div><div class='del'>-#define SOCENOBUFS              (SOCBASEERR+55)            /* No buffer space available */</div><div class='del'>-#define SOCEISCONN              (SOCBASEERR+56)            /* Socket is already connected */</div><div class='del'>-#define SOCENOTCONN             (SOCBASEERR+57)            /* Socket is not connected */</div><div class='del'>-#define SOCESHUTDOWN            (SOCBASEERR+58)            /* Can't send after socket shutdown */</div><div class='del'>-#define SOCETOOMANYREFS         (SOCBASEERR+59)            /* Too many references: can't splice */</div><div class='del'>-#define SOCETIMEDOUT            (SOCBASEERR+60)            /* Connection timed out */</div><div class='del'>-#define SOCECONNREFUSED         (SOCBASEERR+61)            /* Connection refused */</div><div class='del'>-#define SOCELOOP                (SOCBASEERR+62)            /* Too many levels of symbolic links */</div><div class='del'>-#define SOCENAMETOOLONG         (SOCBASEERR+63)            /* File name too long */</div><div class='del'>-#define SOCEHOSTDOWN            (SOCBASEERR+64)            /* Host is down */</div><div class='del'>-#define SOCEHOSTUNREACH         (SOCBASEERR+65)            /* No route to host */</div><div class='del'>-#define SOCENOTEMPTY            (SOCBASEERR+66)            /* Directory not empty */</div><div class='del'>-</div><div class='del'>-/* APR CANONICAL ERROR TESTS */</div><div class='del'>-#define APR_STATUS_IS_EACCES(s)         ((s) == APR_EACCES \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + ERROR_ACCESS_DENIED \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + ERROR_SHARING_VIOLATION)</div><div class='del'>-#define APR_STATUS_IS_EEXIST(s)         ((s) == APR_EEXIST \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + ERROR_OPEN_FAILED \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + ERROR_FILE_EXISTS \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + ERROR_ALREADY_EXISTS \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + ERROR_ACCESS_DENIED)</div><div class='del'>-#define APR_STATUS_IS_ENAMETOOLONG(s)   ((s) == APR_ENAMETOOLONG \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + ERROR_FILENAME_EXCED_RANGE \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + SOCENAMETOOLONG)</div><div class='del'>-#define APR_STATUS_IS_ENOENT(s)         ((s) == APR_ENOENT \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + ERROR_FILE_NOT_FOUND \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + ERROR_PATH_NOT_FOUND \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + ERROR_NO_MORE_FILES \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + ERROR_OPEN_FAILED)</div><div class='del'>-#define APR_STATUS_IS_ENOTDIR(s)        ((s) == APR_ENOTDIR)</div><div class='del'>-#define APR_STATUS_IS_ENOSPC(s)         ((s) == APR_ENOSPC \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + ERROR_DISK_FULL)</div><div class='del'>-#define APR_STATUS_IS_ENOMEM(s)         ((s) == APR_ENOMEM)</div><div class='del'>-#define APR_STATUS_IS_EMFILE(s)         ((s) == APR_EMFILE \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + ERROR_TOO_MANY_OPEN_FILES)</div><div class='del'>-#define APR_STATUS_IS_ENFILE(s)         ((s) == APR_ENFILE)</div><div class='del'>-#define APR_STATUS_IS_EBADF(s)          ((s) == APR_EBADF \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + ERROR_INVALID_HANDLE)</div><div class='del'>-#define APR_STATUS_IS_EINVAL(s)         ((s) == APR_EINVAL \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + ERROR_INVALID_PARAMETER \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + ERROR_INVALID_FUNCTION)</div><div class='del'>-#define APR_STATUS_IS_ESPIPE(s)         ((s) == APR_ESPIPE \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + ERROR_NEGATIVE_SEEK)</div><div class='del'>-#define APR_STATUS_IS_EAGAIN(s)         ((s) == APR_EAGAIN \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + ERROR_NO_DATA \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + SOCEWOULDBLOCK \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + ERROR_LOCK_VIOLATION)</div><div class='del'>-#define APR_STATUS_IS_EINTR(s)          ((s) == APR_EINTR \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + SOCEINTR)</div><div class='del'>-#define APR_STATUS_IS_ENOTSOCK(s)       ((s) == APR_ENOTSOCK \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + SOCENOTSOCK)</div><div class='del'>-#define APR_STATUS_IS_ECONNREFUSED(s)   ((s) == APR_ECONNREFUSED \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + SOCECONNREFUSED)</div><div class='del'>-#define APR_STATUS_IS_EINPROGRESS(s)    ((s) == APR_EINPROGRESS \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + SOCEINPROGRESS)</div><div class='del'>-#define APR_STATUS_IS_ECONNABORTED(s)   ((s) == APR_ECONNABORTED \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + SOCECONNABORTED)</div><div class='del'>-#define APR_STATUS_IS_ECONNRESET(s)     ((s) == APR_ECONNRESET \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + SOCECONNRESET)</div><div class='del'>-/* XXX deprecated */</div><div class='del'>-#define APR_STATUS_IS_ETIMEDOUT(s)         ((s) == APR_ETIMEDOUT \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + SOCETIMEDOUT)    </div><div class='del'>-#undef APR_STATUS_IS_TIMEUP</div><div class='del'>-#define APR_STATUS_IS_TIMEUP(s)         ((s) == APR_TIMEUP \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + SOCETIMEDOUT)    </div><div class='del'>-#define APR_STATUS_IS_EHOSTUNREACH(s)   ((s) == APR_EHOSTUNREACH \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + SOCEHOSTUNREACH)</div><div class='del'>-#define APR_STATUS_IS_ENETUNREACH(s)    ((s) == APR_ENETUNREACH \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + SOCENETUNREACH)</div><div class='del'>-#define APR_STATUS_IS_EFTYPE(s)         ((s) == APR_EFTYPE)</div><div class='del'>-#define APR_STATUS_IS_EPIPE(s)          ((s) == APR_EPIPE \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + ERROR_BROKEN_PIPE \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + SOCEPIPE)</div><div class='del'>-#define APR_STATUS_IS_EXDEV(s)          ((s) == APR_EXDEV \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + ERROR_NOT_SAME_DEVICE)</div><div class='del'>-#define APR_STATUS_IS_ENOTEMPTY(s)      ((s) == APR_ENOTEMPTY \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + ERROR_DIR_NOT_EMPTY \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + ERROR_ACCESS_DENIED)</div><div class='del'>-</div><div class='del'>-/*</div><div class='del'>-    Sorry, too tired to wrap this up for OS2... feel free to</div><div class='del'>-    fit the following into their best matches.</div><div class='del'>-</div><div class='del'>-    { ERROR_NO_SIGNAL_SENT,     ESRCH           },</div><div class='del'>-    { SOCEALREADY,              EALREADY        },</div><div class='del'>-    { SOCEDESTADDRREQ,          EDESTADDRREQ    },</div><div class='del'>-    { SOCEMSGSIZE,              EMSGSIZE        },</div><div class='del'>-    { SOCEPROTOTYPE,            EPROTOTYPE      },</div><div class='del'>-    { SOCENOPROTOOPT,           ENOPROTOOPT     },</div><div class='del'>-    { SOCEPROTONOSUPPORT,       EPROTONOSUPPORT },</div><div class='del'>-    { SOCESOCKTNOSUPPORT,       ESOCKTNOSUPPORT },</div><div class='del'>-    { SOCEOPNOTSUPP,            EOPNOTSUPP      },</div><div class='del'>-    { SOCEPFNOSUPPORT,          EPFNOSUPPORT    },</div><div class='del'>-    { SOCEAFNOSUPPORT,          EAFNOSUPPORT    },</div><div class='del'>-    { SOCEADDRINUSE,            EADDRINUSE      },</div><div class='del'>-    { SOCEADDRNOTAVAIL,         EADDRNOTAVAIL   },</div><div class='del'>-    { SOCENETDOWN,              ENETDOWN        },</div><div class='del'>-    { SOCENETRESET,             ENETRESET       },</div><div class='del'>-    { SOCENOBUFS,               ENOBUFS         },</div><div class='del'>-    { SOCEISCONN,               EISCONN         },</div><div class='del'>-    { SOCENOTCONN,              ENOTCONN        },</div><div class='del'>-    { SOCESHUTDOWN,             ESHUTDOWN       },</div><div class='del'>-    { SOCETOOMANYREFS,          ETOOMANYREFS    },</div><div class='del'>-    { SOCELOOP,                 ELOOP           },</div><div class='del'>-    { SOCEHOSTDOWN,             EHOSTDOWN       },</div><div class='del'>-    { SOCENOTEMPTY,             ENOTEMPTY       },</div><div class='del'>-    { SOCEPIPE,                 EPIPE           }</div><div class='del'>-*/</div><div class='del'>-</div><div class='del'>-#elif defined(WIN32) &amp;&amp; !defined(DOXYGEN) /* !defined(OS2) */</div><div class='del'>-</div><div class='del'>-#define APR_FROM_OS_ERROR(e) (e == 0 ? APR_SUCCESS : e + APR_OS_START_SYSERR)</div><div class='del'>-#define APR_TO_OS_ERROR(e)   (e == 0 ? APR_SUCCESS : e - APR_OS_START_SYSERR)</div><div class='del'>-</div><div class='del'>-#define apr_get_os_error()   (APR_FROM_OS_ERROR(GetLastError()))</div><div class='del'>-#define apr_set_os_error(e)  (SetLastError(APR_TO_OS_ERROR(e)))</div><div class='del'>-</div><div class='del'>-/* A special case, only socket calls require this:</div><div class='del'>- */</div><div class='del'>-#define apr_get_netos_error()   (APR_FROM_OS_ERROR(WSAGetLastError()))</div><div class='del'>-#define apr_set_netos_error(e)   (WSASetLastError(APR_TO_OS_ERROR(e)))</div><div class='del'>-</div><div class='del'>-/* APR CANONICAL ERROR TESTS */</div><div class='del'>-#define APR_STATUS_IS_EACCES(s)         ((s) == APR_EACCES \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + ERROR_ACCESS_DENIED \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + ERROR_CANNOT_MAKE \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + ERROR_CURRENT_DIRECTORY \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + ERROR_DRIVE_LOCKED \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + ERROR_FAIL_I24 \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + ERROR_LOCK_VIOLATION \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + ERROR_LOCK_FAILED \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + ERROR_NOT_LOCKED \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + ERROR_NETWORK_ACCESS_DENIED \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + ERROR_SHARING_VIOLATION)</div><div class='del'>-#define APR_STATUS_IS_EEXIST(s)         ((s) == APR_EEXIST \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + ERROR_FILE_EXISTS \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + ERROR_ALREADY_EXISTS)</div><div class='del'>-#define APR_STATUS_IS_ENAMETOOLONG(s)   ((s) == APR_ENAMETOOLONG \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + ERROR_FILENAME_EXCED_RANGE \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + WSAENAMETOOLONG)</div><div class='del'>-#define APR_STATUS_IS_ENOENT(s)         ((s) == APR_ENOENT \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + ERROR_FILE_NOT_FOUND \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + ERROR_PATH_NOT_FOUND \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + ERROR_OPEN_FAILED \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + ERROR_NO_MORE_FILES)</div><div class='del'>-#define APR_STATUS_IS_ENOTDIR(s)        ((s) == APR_ENOTDIR \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + ERROR_PATH_NOT_FOUND \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + ERROR_BAD_NETPATH \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + ERROR_BAD_NET_NAME \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + ERROR_BAD_PATHNAME \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + ERROR_INVALID_DRIVE)</div><div class='del'>-#define APR_STATUS_IS_ENOSPC(s)         ((s) == APR_ENOSPC \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + ERROR_DISK_FULL)</div><div class='del'>-#define APR_STATUS_IS_ENOMEM(s)         ((s) == APR_ENOMEM \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + ERROR_ARENA_TRASHED \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + ERROR_NOT_ENOUGH_MEMORY \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + ERROR_INVALID_BLOCK \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + ERROR_NOT_ENOUGH_QUOTA \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + ERROR_OUTOFMEMORY)</div><div class='del'>-#define APR_STATUS_IS_EMFILE(s)         ((s) == APR_EMFILE \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + ERROR_TOO_MANY_OPEN_FILES)</div><div class='del'>-#define APR_STATUS_IS_ENFILE(s)         ((s) == APR_ENFILE)</div><div class='del'>-#define APR_STATUS_IS_EBADF(s)          ((s) == APR_EBADF \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + ERROR_INVALID_HANDLE \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + ERROR_INVALID_TARGET_HANDLE)</div><div class='del'>-#define APR_STATUS_IS_EINVAL(s)         ((s) == APR_EINVAL \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + ERROR_INVALID_ACCESS \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + ERROR_INVALID_DATA \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + ERROR_INVALID_FUNCTION \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + ERROR_INVALID_HANDLE \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + ERROR_INVALID_PARAMETER \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + ERROR_NEGATIVE_SEEK)</div><div class='del'>-#define APR_STATUS_IS_ESPIPE(s)         ((s) == APR_ESPIPE \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + ERROR_SEEK_ON_DEVICE \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + ERROR_NEGATIVE_SEEK)</div><div class='del'>-#define APR_STATUS_IS_EAGAIN(s)         ((s) == APR_EAGAIN \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + ERROR_NO_DATA \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + ERROR_NO_PROC_SLOTS \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + ERROR_NESTING_NOT_ALLOWED \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + ERROR_MAX_THRDS_REACHED \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + ERROR_LOCK_VIOLATION \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + WSAEWOULDBLOCK)</div><div class='del'>-#define APR_STATUS_IS_EINTR(s)          ((s) == APR_EINTR \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + WSAEINTR)</div><div class='del'>-#define APR_STATUS_IS_ENOTSOCK(s)       ((s) == APR_ENOTSOCK \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + WSAENOTSOCK)</div><div class='del'>-#define APR_STATUS_IS_ECONNREFUSED(s)   ((s) == APR_ECONNREFUSED \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + WSAECONNREFUSED)</div><div class='del'>-#define APR_STATUS_IS_EINPROGRESS(s)    ((s) == APR_EINPROGRESS \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + WSAEINPROGRESS)</div><div class='del'>-#define APR_STATUS_IS_ECONNABORTED(s)   ((s) == APR_ECONNABORTED \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + WSAECONNABORTED)</div><div class='del'>-#define APR_STATUS_IS_ECONNRESET(s)     ((s) == APR_ECONNRESET \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + ERROR_NETNAME_DELETED \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + WSAECONNRESET)</div><div class='del'>-/* XXX deprecated */</div><div class='del'>-#define APR_STATUS_IS_ETIMEDOUT(s)         ((s) == APR_ETIMEDOUT \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + WSAETIMEDOUT \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + WAIT_TIMEOUT)</div><div class='del'>-#undef APR_STATUS_IS_TIMEUP</div><div class='del'>-#define APR_STATUS_IS_TIMEUP(s)         ((s) == APR_TIMEUP \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + WSAETIMEDOUT \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + WAIT_TIMEOUT)</div><div class='del'>-#define APR_STATUS_IS_EHOSTUNREACH(s)   ((s) == APR_EHOSTUNREACH \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + WSAEHOSTUNREACH)</div><div class='del'>-#define APR_STATUS_IS_ENETUNREACH(s)    ((s) == APR_ENETUNREACH \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + WSAENETUNREACH)</div><div class='del'>-#define APR_STATUS_IS_EFTYPE(s)         ((s) == APR_EFTYPE \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + ERROR_EXE_MACHINE_TYPE_MISMATCH \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + ERROR_INVALID_DLL \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + ERROR_INVALID_MODULETYPE \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + ERROR_BAD_EXE_FORMAT \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + ERROR_INVALID_EXE_SIGNATURE \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + ERROR_FILE_CORRUPT \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + ERROR_BAD_FORMAT)</div><div class='del'>-#define APR_STATUS_IS_EPIPE(s)          ((s) == APR_EPIPE \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + ERROR_BROKEN_PIPE)</div><div class='del'>-#define APR_STATUS_IS_EXDEV(s)          ((s) == APR_EXDEV \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + ERROR_NOT_SAME_DEVICE)</div><div class='del'>-#define APR_STATUS_IS_ENOTEMPTY(s)      ((s) == APR_ENOTEMPTY \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + ERROR_DIR_NOT_EMPTY)</div><div class='del'>-</div><div class='del'>-#elif defined(NETWARE) &amp;&amp; defined(USE_WINSOCK) &amp;&amp; !defined(DOXYGEN) /* !defined(OS2) &amp;&amp; !defined(WIN32) */</div><div class='del'>-</div><div class='del'>-#define APR_FROM_OS_ERROR(e) (e == 0 ? APR_SUCCESS : e + APR_OS_START_SYSERR)</div><div class='del'>-#define APR_TO_OS_ERROR(e)   (e == 0 ? APR_SUCCESS : e - APR_OS_START_SYSERR)</div><div class='del'>-</div><div class='del'>-#define apr_get_os_error()    (errno)</div><div class='del'>-#define apr_set_os_error(e)   (errno = (e))</div><div class='del'>-</div><div class='del'>-/* A special case, only socket calls require this: */</div><div class='del'>-#define apr_get_netos_error()   (APR_FROM_OS_ERROR(WSAGetLastError()))</div><div class='del'>-#define apr_set_netos_error(e)  (WSASetLastError(APR_TO_OS_ERROR(e)))</div><div class='del'>-</div><div class='del'>-/* APR CANONICAL ERROR TESTS */</div><div class='del'>-#define APR_STATUS_IS_EACCES(s)         ((s) == APR_EACCES)</div><div class='del'>-#define APR_STATUS_IS_EEXIST(s)         ((s) == APR_EEXIST)</div><div class='del'>-#define APR_STATUS_IS_ENAMETOOLONG(s)   ((s) == APR_ENAMETOOLONG)</div><div class='del'>-#define APR_STATUS_IS_ENOENT(s)         ((s) == APR_ENOENT)</div><div class='del'>-#define APR_STATUS_IS_ENOTDIR(s)        ((s) == APR_ENOTDIR)</div><div class='del'>-#define APR_STATUS_IS_ENOSPC(s)         ((s) == APR_ENOSPC)</div><div class='del'>-#define APR_STATUS_IS_ENOMEM(s)         ((s) == APR_ENOMEM)</div><div class='del'>-#define APR_STATUS_IS_EMFILE(s)         ((s) == APR_EMFILE)</div><div class='del'>-#define APR_STATUS_IS_ENFILE(s)         ((s) == APR_ENFILE)</div><div class='del'>-#define APR_STATUS_IS_EBADF(s)          ((s) == APR_EBADF)</div><div class='del'>-#define APR_STATUS_IS_EINVAL(s)         ((s) == APR_EINVAL)</div><div class='del'>-#define APR_STATUS_IS_ESPIPE(s)         ((s) == APR_ESPIPE)</div><div class='del'>-</div><div class='del'>-#define APR_STATUS_IS_EAGAIN(s)         ((s) == APR_EAGAIN \</div><div class='del'>-                || (s) ==                       EWOULDBLOCK \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + WSAEWOULDBLOCK)</div><div class='del'>-#define APR_STATUS_IS_EINTR(s)          ((s) == APR_EINTR \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + WSAEINTR)</div><div class='del'>-#define APR_STATUS_IS_ENOTSOCK(s)       ((s) == APR_ENOTSOCK \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + WSAENOTSOCK)</div><div class='del'>-#define APR_STATUS_IS_ECONNREFUSED(s)   ((s) == APR_ECONNREFUSED \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + WSAECONNREFUSED)</div><div class='del'>-#define APR_STATUS_IS_EINPROGRESS(s)    ((s) == APR_EINPROGRESS \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + WSAEINPROGRESS)</div><div class='del'>-#define APR_STATUS_IS_ECONNABORTED(s)   ((s) == APR_ECONNABORTED \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + WSAECONNABORTED)</div><div class='del'>-#define APR_STATUS_IS_ECONNRESET(s)     ((s) == APR_ECONNRESET \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + WSAECONNRESET)</div><div class='del'>-/* XXX deprecated */</div><div class='del'>-#define APR_STATUS_IS_ETIMEDOUT(s)       ((s) == APR_ETIMEDOUT \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + WSAETIMEDOUT \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + WAIT_TIMEOUT)</div><div class='del'>-#undef APR_STATUS_IS_TIMEUP</div><div class='del'>-#define APR_STATUS_IS_TIMEUP(s)         ((s) == APR_TIMEUP \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + WSAETIMEDOUT \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + WAIT_TIMEOUT)</div><div class='del'>-#define APR_STATUS_IS_EHOSTUNREACH(s)   ((s) == APR_EHOSTUNREACH \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + WSAEHOSTUNREACH)</div><div class='del'>-#define APR_STATUS_IS_ENETUNREACH(s)    ((s) == APR_ENETUNREACH \</div><div class='del'>-                || (s) == APR_OS_START_SYSERR + WSAENETUNREACH)</div><div class='del'>-#define APR_STATUS_IS_ENETDOWN(s)       ((s) == APR_OS_START_SYSERR + WSAENETDOWN)</div><div class='del'>-#define APR_STATUS_IS_EFTYPE(s)         ((s) == APR_EFTYPE)</div><div class='del'>-#define APR_STATUS_IS_EPIPE(s)          ((s) == APR_EPIPE)</div><div class='del'>-#define APR_STATUS_IS_EXDEV(s)          ((s) == APR_EXDEV)</div><div class='del'>-#define APR_STATUS_IS_ENOTEMPTY(s)      ((s) == APR_ENOTEMPTY)</div><div class='del'>-</div><div class='del'>-#else /* !defined(NETWARE) &amp;&amp; !defined(OS2) &amp;&amp; !defined(WIN32) */</div><div class='del'>-</div><div class='del'>-/*</div><div class='del'>- *  os error codes are clib error codes</div><div class='del'>- */</div><div class='del'>-#define APR_FROM_OS_ERROR(e)  (e)</div><div class='del'>-#define APR_TO_OS_ERROR(e)    (e)</div><div class='del'>-</div><div class='del'>-#define apr_get_os_error()    (errno)</div><div class='del'>-#define apr_set_os_error(e)   (errno = (e))</div><div class='del'>-</div><div class='del'>-/* A special case, only socket calls require this:</div><div class='del'>- */</div><div class='del'>-#define apr_get_netos_error() (errno)</div><div class='del'>-#define apr_set_netos_error(e) (errno = (e))</div><div class='del'>-</div><div class='del'>-/** </div><div class='del'>- * @addtogroup APR_STATUS_IS</div><div class='del'>- * @{</div><div class='del'>- */</div><div class='del'>-</div><div class='del'>-/** permission denied */</div><div class='del'>-#define APR_STATUS_IS_EACCES(s)         ((s) == APR_EACCES)</div><div class='del'>-/** file exists */</div><div class='del'>-#define APR_STATUS_IS_EEXIST(s)         ((s) == APR_EEXIST)</div><div class='del'>-/** path name is too long */</div><div class='del'>-#define APR_STATUS_IS_ENAMETOOLONG(s)   ((s) == APR_ENAMETOOLONG)</div><div class='del'>-/**</div><div class='del'>- * no such file or directory</div><div class='del'>- * @remark</div><div class='del'>- * EMVSCATLG can be returned by the automounter on z/OS for</div><div class='del'>- * paths which do not exist.</div><div class='del'>- */</div><div class='del'>-#ifdef EMVSCATLG</div><div class='del'>-#define APR_STATUS_IS_ENOENT(s)         ((s) == APR_ENOENT \</div><div class='del'>-                                      || (s) == EMVSCATLG)</div><div class='del'>-#else</div><div class='del'>-#define APR_STATUS_IS_ENOENT(s)         ((s) == APR_ENOENT)</div><div class='del'>-#endif</div><div class='del'>-/** not a directory */</div><div class='del'>-#define APR_STATUS_IS_ENOTDIR(s)        ((s) == APR_ENOTDIR)</div><div class='del'>-/** no space left on device */</div><div class='del'>-#ifdef EDQUOT</div><div class='del'>-#define APR_STATUS_IS_ENOSPC(s)         ((s) == APR_ENOSPC \</div><div class='del'>-                                      || (s) == EDQUOT)</div><div class='del'>-#else</div><div class='del'>-#define APR_STATUS_IS_ENOSPC(s)         ((s) == APR_ENOSPC)</div><div class='del'>-#endif</div><div class='del'>-/** not enough memory */</div><div class='del'>-#define APR_STATUS_IS_ENOMEM(s)         ((s) == APR_ENOMEM)</div><div class='del'>-/** too many open files */</div><div class='del'>-#define APR_STATUS_IS_EMFILE(s)         ((s) == APR_EMFILE)</div><div class='del'>-/** file table overflow */</div><div class='del'>-#define APR_STATUS_IS_ENFILE(s)         ((s) == APR_ENFILE)</div><div class='del'>-/** bad file # */</div><div class='del'>-#define APR_STATUS_IS_EBADF(s)          ((s) == APR_EBADF)</div><div class='del'>-/** invalid argument */</div><div class='del'>-#define APR_STATUS_IS_EINVAL(s)         ((s) == APR_EINVAL)</div><div class='del'>-/** illegal seek */</div><div class='del'>-#define APR_STATUS_IS_ESPIPE(s)         ((s) == APR_ESPIPE)</div><div class='del'>-</div><div class='del'>-/** operation would block */</div><div class='del'>-#if !defined(EWOULDBLOCK) || !defined(EAGAIN)</div><div class='del'>-#define APR_STATUS_IS_EAGAIN(s)         ((s) == APR_EAGAIN)</div><div class='del'>-#elif (EWOULDBLOCK == EAGAIN)</div><div class='del'>-#define APR_STATUS_IS_EAGAIN(s)         ((s) == APR_EAGAIN)</div><div class='del'>-#else</div><div class='del'>-#define APR_STATUS_IS_EAGAIN(s)         ((s) == APR_EAGAIN \</div><div class='del'>-                                      || (s) == EWOULDBLOCK)</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-/** interrupted system call */</div><div class='del'>-#define APR_STATUS_IS_EINTR(s)          ((s) == APR_EINTR)</div><div class='del'>-/** socket operation on a non-socket */</div><div class='del'>-#define APR_STATUS_IS_ENOTSOCK(s)       ((s) == APR_ENOTSOCK)</div><div class='del'>-/** Connection Refused */</div><div class='del'>-#define APR_STATUS_IS_ECONNREFUSED(s)   ((s) == APR_ECONNREFUSED)</div><div class='del'>-/** operation now in progress */</div><div class='del'>-#define APR_STATUS_IS_EINPROGRESS(s)    ((s) == APR_EINPROGRESS)</div><div class='del'>-</div><div class='del'>-/** </div><div class='del'>- * Software caused connection abort </div><div class='del'>- * @remark</div><div class='del'>- * EPROTO on certain older kernels really means ECONNABORTED, so we need to </div><div class='del'>- * ignore it for them.  See discussion in new-httpd archives nh.9701 &amp; nh.9603</div><div class='del'>- *</div><div class='del'>- * There is potentially a bug in Solaris 2.x x&lt;6, and other boxes that </div><div class='del'>- * implement tcp sockets in userland (i.e. on top of STREAMS).  On these</div><div class='del'>- * systems, EPROTO can actually result in a fatal loop.  See PR#981 for </div><div class='del'>- * example.  It's hard to handle both uses of EPROTO.</div><div class='del'>- */</div><div class='del'>-#ifdef EPROTO</div><div class='del'>-#define APR_STATUS_IS_ECONNABORTED(s)    ((s) == APR_ECONNABORTED \</div><div class='del'>-                                       || (s) == EPROTO)</div><div class='del'>-#else</div><div class='del'>-#define APR_STATUS_IS_ECONNABORTED(s)    ((s) == APR_ECONNABORTED)</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-/** Connection Reset by peer */</div><div class='del'>-#define APR_STATUS_IS_ECONNRESET(s)      ((s) == APR_ECONNRESET)</div><div class='del'>-/** Operation timed out</div><div class='del'>- *  @deprecated */</div><div class='del'>-#define APR_STATUS_IS_ETIMEDOUT(s)      ((s) == APR_ETIMEDOUT)</div><div class='del'>-/** no route to host */</div><div class='del'>-#define APR_STATUS_IS_EHOSTUNREACH(s)    ((s) == APR_EHOSTUNREACH)</div><div class='del'>-/** network is unreachable */</div><div class='del'>-#define APR_STATUS_IS_ENETUNREACH(s)     ((s) == APR_ENETUNREACH)</div><div class='del'>-/** inappropiate file type or format */</div><div class='del'>-#define APR_STATUS_IS_EFTYPE(s)          ((s) == APR_EFTYPE)</div><div class='del'>-/** broken pipe */</div><div class='del'>-#define APR_STATUS_IS_EPIPE(s)           ((s) == APR_EPIPE)</div><div class='del'>-/** cross device link */</div><div class='del'>-#define APR_STATUS_IS_EXDEV(s)           ((s) == APR_EXDEV)</div><div class='del'>-/** Directory Not Empty */</div><div class='del'>-#define APR_STATUS_IS_ENOTEMPTY(s)       ((s) == APR_ENOTEMPTY || \</div><div class='del'>-                                          (s) == APR_EEXIST)</div><div class='del'>-/** @} */</div><div class='del'>-</div><div class='del'>-#endif /* !defined(NETWARE) &amp;&amp; !defined(OS2) &amp;&amp; !defined(WIN32) */</div><div class='del'>-</div><div class='del'>-/** @} */</div><div class='del'>-</div><div class='del'>-#ifdef __cplusplus</div><div class='del'>-}</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-#endif  /* ! APR_ERRNO_H */</div><div class='del'>-/*</div><div class='del'>- * Copyright (c) 2000 Apple Computer, Inc. All rights reserved.</div><div class='del'>- *</div><div class='del'>- * @APPLE_LICENSE_HEADER_START@</div><div class='del'>- * </div><div class='del'>- * This file contains Original Code and/or Modifications of Original Code</div><div class='del'>- * as defined in and that are subject to the Apple Public Source License</div><div class='del'>- * Version 2.0 (the 'License'). You may not use this file except in</div><div class='del'>- * compliance with the License. Please obtain a copy of the License at</div><div class='del'>- * http://www.opensource.apple.com/apsl/ and read it before using this</div><div class='del'>- * file.</div><div class='del'>- * </div><div class='del'>- * The Original Code and all software distributed under the License are</div><div class='del'>- * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER</div><div class='del'>- * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,</div><div class='del'>- * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,</div><div class='del'>- * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.</div><div class='del'>- * Please see the License for the specific language governing rights and</div><div class='del'>- * limitations under the License.</div><div class='del'>- * </div><div class='del'>- * @APPLE_LICENSE_HEADER_END@</div><div class='del'>- */</div><div class='del'>-#include &lt;sys/errno.h&gt;</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-/*</div><div class='del'>- * Copyright (c) 2000-2002 Apple Computer, Inc. All rights reserved.</div><div class='del'>- *</div><div class='del'>- * @APPLE_OSREFERENCE_LICENSE_HEADER_START@</div><div class='del'>- * </div><div class='del'>- * This file contains Original Code and/or Modifications of Original Code</div><div class='del'>- * as defined in and that are subject to the Apple Public Source License</div><div class='del'>- * Version 2.0 (the 'License'). You may not use this file except in</div><div class='del'>- * compliance with the License. The rights granted to you under the License</div><div class='del'>- * may not be used to create, or enable the creation or redistribution of,</div><div class='del'>- * unlawful or unlicensed copies of an Apple operating system, or to</div><div class='del'>- * circumvent, violate, or enable the circumvention or violation of, any</div><div class='del'>- * terms of an Apple operating system software license agreement.</div><div class='del'>- * </div><div class='del'>- * Please obtain a copy of the License at</div><div class='del'>- * http://www.opensource.apple.com/apsl/ and read it before using this file.</div><div class='del'>- * </div><div class='del'>- * The Original Code and all software distributed under the License are</div><div class='del'>- * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER</div><div class='del'>- * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,</div><div class='del'>- * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,</div><div class='del'>- * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.</div><div class='del'>- * Please see the License for the specific language governing rights and</div><div class='del'>- * limitations under the License.</div><div class='del'>- * </div><div class='del'>- * @APPLE_OSREFERENCE_LICENSE_HEADER_END@</div><div class='del'>- */</div><div class='del'>-/* Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved */</div><div class='del'>-/*</div><div class='del'>- * Copyright (c) 1982, 1986, 1989, 1993</div><div class='del'>- *	The Regents of the University of California.  All rights reserved.</div><div class='del'>- * (c) UNIX System Laboratories, Inc.</div><div class='del'>- * All or some portions of this file are derived from material licensed</div><div class='del'>- * to the University of California by American Telephone and Telegraph</div><div class='del'>- * Co. or Unix System Laboratories, Inc. and are reproduced herein with</div><div class='del'>- * the permission of UNIX System Laboratories, Inc.</div><div class='del'>- *</div><div class='del'>- * Redistribution and use in source and binary forms, with or without</div><div class='del'>- * modification, are permitted provided that the following conditions</div><div class='del'>- * are met:</div><div class='del'>- * 1. Redistributions of source code must retain the above copyright</div><div class='del'>- *    notice, this list of conditions and the following disclaimer.</div><div class='del'>- * 2. Redistributions in binary form must reproduce the above copyright</div><div class='del'>- *    notice, this list of conditions and the following disclaimer in the</div><div class='del'>- *    documentation and/or other materials provided with the distribution.</div><div class='del'>- * 3. All advertising materials mentioning features or use of this software</div><div class='del'>- *    must display the following acknowledgement:</div><div class='del'>- *	This product includes software developed by the University of</div><div class='del'>- *	California, Berkeley and its contributors.</div><div class='del'>- * 4. Neither the name of the University nor the names of its contributors</div><div class='del'>- *    may be used to endorse or promote products derived from this software</div><div class='del'>- *    without specific prior written permission.</div><div class='del'>- *</div><div class='del'>- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND</div><div class='del'>- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE</div><div class='del'>- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE</div><div class='del'>- * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE</div><div class='del'>- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL</div><div class='del'>- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS</div><div class='del'>- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)</div><div class='del'>- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT</div><div class='del'>- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY</div><div class='del'>- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF</div><div class='del'>- * SUCH DAMAGE.</div><div class='del'>- *</div><div class='del'>- *	@(#)errno.h	8.5 (Berkeley) 1/21/94</div><div class='del'>- */</div><div class='del'>-</div><div class='del'>-#ifndef	_SYS_ERRNO_H_</div><div class='del'>-#define	_SYS_ERRNO_H_</div><div class='del'>-</div><div class='del'>-#include &lt;sys/cdefs.h&gt;</div><div class='del'>-__BEGIN_DECLS</div><div class='del'>-extern int * __error(void);</div><div class='del'>-#define errno (*__error())</div><div class='del'>-__END_DECLS</div><div class='del'>-</div><div class='del'>-/*</div><div class='del'>- * Error codes</div><div class='del'>- */</div><div class='del'>-</div><div class='del'>-#define	EPERM		1		/* Operation not permitted */</div><div class='del'>-#define	ENOENT		2		/* No such file or directory */</div><div class='del'>-#define	ESRCH		3		/* No such process */</div><div class='del'>-#define	EINTR		4		/* Interrupted system call */</div><div class='del'>-#define	EIO		5		/* Input/output error */</div><div class='del'>-#define	ENXIO		6		/* Device not configured */</div><div class='del'>-#define	E2BIG		7		/* Argument list too long */</div><div class='del'>-#define	ENOEXEC		8		/* Exec format error */</div><div class='del'>-#define	EBADF		9		/* Bad file descriptor */</div><div class='del'>-#define	ECHILD		10		/* No child processes */</div><div class='del'>-#define	EDEADLK		11		/* Resource deadlock avoided */</div><div class='del'>-					/* 11 was EAGAIN */</div><div class='del'>-#define	ENOMEM		12		/* Cannot allocate memory */</div><div class='del'>-#define	EACCES		13		/* Permission denied */</div><div class='del'>-#define	EFAULT		14		/* Bad address */</div><div class='del'>-#if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE)</div><div class='del'>-#define	ENOTBLK		15		/* Block device required */</div><div class='del'>-#endif</div><div class='del'>-#define	EBUSY		16		/* Device / Resource busy */</div><div class='del'>-#define	EEXIST		17		/* File exists */</div><div class='del'>-#define	EXDEV		18		/* Cross-device link */</div><div class='del'>-#define	ENODEV		19		/* Operation not supported by device */</div><div class='del'>-#define	ENOTDIR		20		/* Not a directory */</div><div class='del'>-#define	EISDIR		21		/* Is a directory */</div><div class='del'>-#define	EINVAL		22		/* Invalid argument */</div><div class='del'>-#define	ENFILE		23		/* Too many open files in system */</div><div class='del'>-#define	EMFILE		24		/* Too many open files */</div><div class='del'>-#define	ENOTTY		25		/* Inappropriate ioctl for device */</div><div class='del'>-#define	ETXTBSY		26		/* Text file busy */</div><div class='del'>-#define	EFBIG		27		/* File too large */</div><div class='del'>-#define	ENOSPC		28		/* No space left on device */</div><div class='del'>-#define	ESPIPE		29		/* Illegal seek */</div><div class='del'>-#define	EROFS		30		/* Read-only file system */</div><div class='del'>-#define	EMLINK		31		/* Too many links */</div><div class='del'>-#define	EPIPE		32		/* Broken pipe */</div><div class='del'>-</div><div class='del'>-/* math software */</div><div class='del'>-#define	EDOM		33		/* Numerical argument out of domain */</div><div class='del'>-#define	ERANGE		34		/* Result too large */</div><div class='del'>-</div><div class='del'>-/* non-blocking and interrupt i/o */</div><div class='del'>-#define	EAGAIN		35		/* Resource temporarily unavailable */</div><div class='del'>-#define	EWOULDBLOCK	EAGAIN		/* Operation would block */</div><div class='del'>-#define	EINPROGRESS	36		/* Operation now in progress */</div><div class='del'>-#define	EALREADY	37		/* Operation already in progress */</div><div class='del'>-</div><div class='del'>-/* ipc/network software -- argument errors */</div><div class='del'>-#define	ENOTSOCK	38		/* Socket operation on non-socket */</div><div class='del'>-#define	EDESTADDRREQ	39		/* Destination address required */</div><div class='del'>-#define	EMSGSIZE	40		/* Message too long */</div><div class='del'>-#define	EPROTOTYPE	41		/* Protocol wrong type for socket */</div><div class='del'>-#define	ENOPROTOOPT	42		/* Protocol not available */</div><div class='del'>-#define	EPROTONOSUPPORT	43		/* Protocol not supported */</div><div class='del'>-#if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE)</div><div class='del'>-#define	ESOCKTNOSUPPORT	44		/* Socket type not supported */</div><div class='del'>-#endif /* (!_POSIX_C_SOURCE || _DARWIN_C_SOURCE) */</div><div class='del'>-#define ENOTSUP		45		/* Operation not supported */</div><div class='del'>-#if !__DARWIN_UNIX03 &amp;&amp; !defined(KERNEL)</div><div class='del'>-/*</div><div class='del'>- * This is the same for binary and source copmpatability, unless compiling</div><div class='del'>- * the kernel itself, or compiling __DARWIN_UNIX03; if compiling for the</div><div class='del'>- * kernel, the correct value will be returned.  If compiling non-POSIX</div><div class='del'>- * source, the kernel return value will be converted by a stub in libc, and</div><div class='del'>- * if compiling source with __DARWIN_UNIX03, the conversion in libc is not</div><div class='del'>- * done, and the caller gets the expected (discrete) value.</div><div class='del'>- */</div><div class='del'>-#define	EOPNOTSUPP	 ENOTSUP	/* Operation not supported on socket */</div><div class='del'>-#endif /* !__DARWIN_UNIX03 &amp;&amp; !KERNEL */</div><div class='del'>-</div><div class='del'>-#if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE)</div><div class='del'>-#define	EPFNOSUPPORT	46		/* Protocol family not supported */</div><div class='del'>-#endif /* (_POSIX_C_SOURCE &amp;&amp; !_DARWIN_C_SOURCE) */</div><div class='del'>-#define	EAFNOSUPPORT	47		/* Address family not supported by protocol family */</div><div class='del'>-#define	EADDRINUSE	48		/* Address already in use */</div><div class='del'>-#define	EADDRNOTAVAIL	49		/* Can't assign requested address */</div><div class='del'>-</div><div class='del'>-/* ipc/network software -- operational errors */</div><div class='del'>-#define	ENETDOWN	50		/* Network is down */</div><div class='del'>-#define	ENETUNREACH	51		/* Network is unreachable */</div><div class='del'>-#define	ENETRESET	52		/* Network dropped connection on reset */</div><div class='del'>-#define	ECONNABORTED	53		/* Software caused connection abort */</div><div class='del'>-#define	ECONNRESET	54		/* Connection reset by peer */</div><div class='del'>-#define	ENOBUFS		55		/* No buffer space available */</div><div class='del'>-#define	EISCONN		56		/* Socket is already connected */</div><div class='del'>-#define	ENOTCONN	57		/* Socket is not connected */</div><div class='del'>-#if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE)</div><div class='del'>-#define	ESHUTDOWN	58		/* Can't send after socket shutdown */</div><div class='del'>-#define	ETOOMANYREFS	59		/* Too many references: can't splice */</div><div class='del'>-#endif /* (_POSIX_C_SOURCE &amp;&amp; !_DARWIN_C_SOURCE) */</div><div class='del'>-#define	ETIMEDOUT	60		/* Operation timed out */</div><div class='del'>-#define	ECONNREFUSED	61		/* Connection refused */</div><div class='del'>-</div><div class='del'>-#define	ELOOP		62		/* Too many levels of symbolic links */</div><div class='del'>-#define	ENAMETOOLONG	63		/* File name too long */</div><div class='del'>-</div><div class='del'>-/* should be rearranged */</div><div class='del'>-#if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE)</div><div class='del'>-#define	EHOSTDOWN	64		/* Host is down */</div><div class='del'>-#endif /* (_POSIX_C_SOURCE &amp;&amp; !_DARWIN_C_SOURCE) */</div><div class='del'>-#define	EHOSTUNREACH	65		/* No route to host */</div><div class='del'>-#define	ENOTEMPTY	66		/* Directory not empty */</div><div class='del'>-</div><div class='del'>-/* quotas &amp; mush */</div><div class='del'>-#if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE)</div><div class='del'>-#define	EPROCLIM	67		/* Too many processes */</div><div class='del'>-#define	EUSERS		68		/* Too many users */</div><div class='del'>-#endif /* (_POSIX_C_SOURCE &amp;&amp; !_DARWIN_C_SOURCE) */</div><div class='del'>-#define	EDQUOT		69		/* Disc quota exceeded */</div><div class='del'>-</div><div class='del'>-/* Network File System */</div><div class='del'>-#define	ESTALE		70		/* Stale NFS file handle */</div><div class='del'>-#if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE)</div><div class='del'>-#define	EREMOTE		71		/* Too many levels of remote in path */</div><div class='del'>-#define	EBADRPC		72		/* RPC struct is bad */</div><div class='del'>-#define	ERPCMISMATCH	73		/* RPC version wrong */</div><div class='del'>-#define	EPROGUNAVAIL	74		/* RPC prog. not avail */</div><div class='del'>-#define	EPROGMISMATCH	75		/* Program version wrong */</div><div class='del'>-#define	EPROCUNAVAIL	76		/* Bad procedure for program */</div><div class='del'>-#endif /* (_POSIX_C_SOURCE &amp;&amp; !_DARWIN_C_SOURCE) */</div><div class='del'>-</div><div class='del'>-#define	ENOLCK		77		/* No locks available */</div><div class='del'>-#define	ENOSYS		78		/* Function not implemented */</div><div class='del'>-</div><div class='del'>-#if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE)</div><div class='del'>-#define	EFTYPE		79		/* Inappropriate file type or format */</div><div class='del'>-#define	EAUTH		80		/* Authentication error */</div><div class='del'>-#define	ENEEDAUTH	81		/* Need authenticator */</div><div class='del'>-</div><div class='del'>-/* Intelligent device errors */</div><div class='del'>-#define	EPWROFF		82	/* Device power is off */</div><div class='del'>-#define	EDEVERR		83	/* Device error, e.g. paper out */</div><div class='del'>-#endif /* (_POSIX_C_SOURCE &amp;&amp; !_DARWIN_C_SOURCE) */</div><div class='del'>-</div><div class='del'>-#define	EOVERFLOW	84		/* Value too large to be stored in data type */</div><div class='del'>-</div><div class='del'>-/* Program loading errors */</div><div class='del'>-#if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE)</div><div class='del'>-#define EBADEXEC	85	/* Bad executable */</div><div class='del'>-#define EBADARCH	86	/* Bad CPU type in executable */</div><div class='del'>-#define ESHLIBVERS	87	/* Shared library version mismatch */</div><div class='del'>-#define EBADMACHO	88	/* Malformed Macho file */</div><div class='del'>-#endif /* (_POSIX_C_SOURCE &amp;&amp; !_DARWIN_C_SOURCE) */</div><div class='del'>-</div><div class='del'>-#define	ECANCELED	89		/* Operation canceled */</div><div class='del'>-</div><div class='del'>-#define EIDRM		90		/* Identifier removed */</div><div class='del'>-#define ENOMSG		91		/* No message of desired type */   </div><div class='del'>-#define EILSEQ		92		/* Illegal byte sequence */</div><div class='del'>-#if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE)</div><div class='del'>-#define ENOATTR		93		/* Attribute not found */</div><div class='del'>-#endif /* (_POSIX_C_SOURCE &amp;&amp; !_DARWIN_C_SOURCE) */</div><div class='del'>-</div><div class='del'>-#define EBADMSG		94		/* Bad message */</div><div class='del'>-#define EMULTIHOP	95		/* Reserved */</div><div class='del'>-#define	ENODATA		96		/* No message available on STREAM */</div><div class='del'>-#define ENOLINK		97		/* Reserved */</div><div class='del'>-#define ENOSR		98		/* No STREAM resources */</div><div class='del'>-#define ENOSTR		99		/* Not a STREAM */</div><div class='del'>-#define	EPROTO		100		/* Protocol error */</div><div class='del'>-#define ETIME		101		/* STREAM ioctl timeout */</div><div class='del'>-</div><div class='del'>-#if __DARWIN_UNIX03 || defined(KERNEL)</div><div class='del'>-/* This value is only discrete when compiling __DARWIN_UNIX03, or KERNEL */</div><div class='del'>-#define	EOPNOTSUPP	102		/* Operation not supported on socket */</div><div class='del'>-#endif /* __DARWIN_UNIX03 || KERNEL */</div><div class='del'>-</div><div class='del'>-#define ENOPOLICY	103		/* No such policy registered */</div><div class='del'>-</div><div class='del'>-#if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE)</div><div class='del'>-#define	ELAST		103		/* Must be equal largest errno */</div><div class='del'>-#endif /* (_POSIX_C_SOURCE &amp;&amp; !_DARWIN_C_SOURCE) */</div><div class='del'>-</div><div class='del'>-#endif /* _SYS_ERRNO_H_ */</div><div class='head'>diff --git a/doc/errno.list.solaris.txt b/doc/errno.list.solaris.txt<br/>deleted file mode 100644<br/>index 23601e9d374..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/doc/errno.list.solaris.txt?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>doc/errno.list.solaris.txt</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,206 +0,0 @@</div><div class='del'>-/*</div><div class='del'>- * CDDL HEADER START</div><div class='del'>- *</div><div class='del'>- * The contents of this file are subject to the terms of the</div><div class='del'>- * Common Development and Distribution License, Version 1.0 only</div><div class='del'>- * (the "License").  You may not use this file except in compliance</div><div class='del'>- * with the License.</div><div class='del'>- *</div><div class='del'>- * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE</div><div class='del'>- * or http://www.opensolaris.org/os/licensing.</div><div class='del'>- * See the License for the specific language governing permissions</div><div class='del'>- * and limitations under the License.</div><div class='del'>- *</div><div class='del'>- * When distributing Covered Code, include this CDDL HEADER in each</div><div class='del'>- * file and include the License file at usr/src/OPENSOLARIS.LICENSE.</div><div class='del'>- * If applicable, add the following below this CDDL HEADER, with the</div><div class='del'>- * fields enclosed by brackets "[]" replaced with your own identifying</div><div class='del'>- * information: Portions Copyright [yyyy] [name of copyright owner]</div><div class='del'>- *</div><div class='del'>- * CDDL HEADER END</div><div class='del'>- */</div><div class='del'>-/*</div><div class='del'>- * Copyright 2000 Sun Microsystems, Inc.  All rights reserved.</div><div class='del'>- * Use is subject to license terms.</div><div class='del'>- */</div><div class='del'>-</div><div class='del'>-/*	Copyright (c) 1983, 1984, 1985, 1986, 1987, 1988, 1989 AT&amp;T	*/</div><div class='del'>-/*	  All Rights Reserved  	*/</div><div class='del'>-</div><div class='del'>-/*</div><div class='del'>- * University Copyright- Copyright (c) 1982, 1986, 1988</div><div class='del'>- * The Regents of the University of California</div><div class='del'>- * All Rights Reserved</div><div class='del'>- *</div><div class='del'>- * University Acknowledgment- Portions of this document are derived from</div><div class='del'>- * software developed by the University of California, Berkeley, and its</div><div class='del'>- * contributors.</div><div class='del'>- */</div><div class='del'>-</div><div class='del'>-#ifndef _SYS_ERRNO_H</div><div class='del'>-#define	_SYS_ERRNO_H</div><div class='del'>-</div><div class='del'>-#pragma ident	"@(#)errno.h	1.22	05/06/08 SMI"</div><div class='del'>-</div><div class='del'>-#ifdef	__cplusplus</div><div class='del'>-extern "C" {</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-/*</div><div class='del'>- * Error codes</div><div class='del'>- */</div><div class='del'>-</div><div class='del'>-#define	EPERM	1	/* Not super-user			*/</div><div class='del'>-#define	ENOENT	2	/* No such file or directory		*/</div><div class='del'>-#define	ESRCH	3	/* No such process			*/</div><div class='del'>-#define	EINTR	4	/* interrupted system call		*/</div><div class='del'>-#define	EIO	5	/* I/O error				*/</div><div class='del'>-#define	ENXIO	6	/* No such device or address		*/</div><div class='del'>-#define	E2BIG	7	/* Arg list too long			*/</div><div class='del'>-#define	ENOEXEC	8	/* Exec format error			*/</div><div class='del'>-#define	EBADF	9	/* Bad file number			*/</div><div class='del'>-#define	ECHILD	10	/* No children				*/</div><div class='del'>-#define	EAGAIN	11	/* Resource temporarily unavailable	*/</div><div class='del'>-#define	ENOMEM	12	/* Not enough core			*/</div><div class='del'>-#define	EACCES	13	/* Permission denied			*/</div><div class='del'>-#define	EFAULT	14	/* Bad address				*/</div><div class='del'>-#define	ENOTBLK	15	/* Block device required		*/</div><div class='del'>-#define	EBUSY	16	/* Mount device busy			*/</div><div class='del'>-#define	EEXIST	17	/* File exists				*/</div><div class='del'>-#define	EXDEV	18	/* Cross-device link			*/</div><div class='del'>-#define	ENODEV	19	/* No such device			*/</div><div class='del'>-#define	ENOTDIR	20	/* Not a directory			*/</div><div class='del'>-#define	EISDIR	21	/* Is a directory			*/</div><div class='del'>-#define	EINVAL	22	/* Invalid argument			*/</div><div class='del'>-#define	ENFILE	23	/* File table overflow			*/</div><div class='del'>-#define	EMFILE	24	/* Too many open files			*/</div><div class='del'>-#define	ENOTTY	25	/* Inappropriate ioctl for device	*/</div><div class='del'>-#define	ETXTBSY	26	/* Text file busy			*/</div><div class='del'>-#define	EFBIG	27	/* File too large			*/</div><div class='del'>-#define	ENOSPC	28	/* No space left on device		*/</div><div class='del'>-#define	ESPIPE	29	/* Illegal seek				*/</div><div class='del'>-#define	EROFS	30	/* Read only file system		*/</div><div class='del'>-#define	EMLINK	31	/* Too many links			*/</div><div class='del'>-#define	EPIPE	32	/* Broken pipe				*/</div><div class='del'>-#define	EDOM	33	/* Math arg out of domain of func	*/</div><div class='del'>-#define	ERANGE	34	/* Math result not representable	*/</div><div class='del'>-#define	ENOMSG	35	/* No message of desired type		*/</div><div class='del'>-#define	EIDRM	36	/* Identifier removed			*/</div><div class='del'>-#define	ECHRNG	37	/* Channel number out of range		*/</div><div class='del'>-#define	EL2NSYNC 38	/* Level 2 not synchronized		*/</div><div class='del'>-#define	EL3HLT	39	/* Level 3 halted			*/</div><div class='del'>-#define	EL3RST	40	/* Level 3 reset			*/</div><div class='del'>-#define	ELNRNG	41	/* Link number out of range		*/</div><div class='del'>-#define	EUNATCH 42	/* Protocol driver not attached		*/</div><div class='del'>-#define	ENOCSI	43	/* No CSI structure available		*/</div><div class='del'>-#define	EL2HLT	44	/* Level 2 halted			*/</div><div class='del'>-#define	EDEADLK	45	/* Deadlock condition.			*/</div><div class='del'>-#define	ENOLCK	46	/* No record locks available.		*/</div><div class='del'>-#define	ECANCELED 47	/* Operation canceled			*/</div><div class='del'>-#define	ENOTSUP	48	/* Operation not supported		*/</div><div class='del'>-</div><div class='del'>-/* Filesystem Quotas */</div><div class='del'>-#define	EDQUOT	49	/* Disc quota exceeded			*/</div><div class='del'>-</div><div class='del'>-/* Convergent Error Returns */</div><div class='del'>-#define	EBADE	50	/* invalid exchange			*/</div><div class='del'>-#define	EBADR	51	/* invalid request descriptor		*/</div><div class='del'>-#define	EXFULL	52	/* exchange full			*/</div><div class='del'>-#define	ENOANO	53	/* no anode				*/</div><div class='del'>-#define	EBADRQC	54	/* invalid request code			*/</div><div class='del'>-#define	EBADSLT	55	/* invalid slot				*/</div><div class='del'>-#define	EDEADLOCK 56	/* file locking deadlock error		*/</div><div class='del'>-</div><div class='del'>-#define	EBFONT	57	/* bad font file fmt			*/</div><div class='del'>-</div><div class='del'>-/* Interprocess Robust Locks */</div><div class='del'>-#define	EOWNERDEAD	58	/* process died with the lock */</div><div class='del'>-#define	ENOTRECOVERABLE	59	/* lock is not recoverable */</div><div class='del'>-</div><div class='del'>-/* stream problems */</div><div class='del'>-#define	ENOSTR	60	/* Device not a stream			*/</div><div class='del'>-#define	ENODATA	61	/* no data (for no delay io)		*/</div><div class='del'>-#define	ETIME	62	/* timer expired			*/</div><div class='del'>-#define	ENOSR	63	/* out of streams resources		*/</div><div class='del'>-</div><div class='del'>-#define	ENONET	64	/* Machine is not on the network	*/</div><div class='del'>-#define	ENOPKG	65	/* Package not installed		*/</div><div class='del'>-#define	EREMOTE	66	/* The object is remote			*/</div><div class='del'>-#define	ENOLINK	67	/* the link has been severed		*/</div><div class='del'>-#define	EADV	68	/* advertise error			*/</div><div class='del'>-#define	ESRMNT	69	/* srmount error			*/</div><div class='del'>-</div><div class='del'>-#define	ECOMM	70	/* Communication error on send		*/</div><div class='del'>-#define	EPROTO	71	/* Protocol error			*/</div><div class='del'>-</div><div class='del'>-/* Interprocess Robust Locks */</div><div class='del'>-#define	ELOCKUNMAPPED	72	/* locked lock was unmapped */</div><div class='del'>-</div><div class='del'>-#define	ENOTACTIVE 73	/* Facility is not active		*/</div><div class='del'>-#define	EMULTIHOP 74	/* multihop attempted			*/</div><div class='del'>-#define	EBADMSG 77	/* trying to read unreadable message	*/</div><div class='del'>-#define	ENAMETOOLONG 78	/* path name is too long		*/</div><div class='del'>-#define	EOVERFLOW 79	/* value too large to be stored in data type */</div><div class='del'>-#define	ENOTUNIQ 80	/* given log. name not unique		*/</div><div class='del'>-#define	EBADFD	81	/* f.d. invalid for this operation	*/</div><div class='del'>-#define	EREMCHG	82	/* Remote address changed		*/</div><div class='del'>-</div><div class='del'>-/* shared library problems */</div><div class='del'>-#define	ELIBACC	83	/* Can't access a needed shared lib.	*/</div><div class='del'>-#define	ELIBBAD	84	/* Accessing a corrupted shared lib.	*/</div><div class='del'>-#define	ELIBSCN	85	/* .lib section in a.out corrupted.	*/</div><div class='del'>-#define	ELIBMAX	86	/* Attempting to link in too many libs.	*/</div><div class='del'>-#define	ELIBEXEC 87	/* Attempting to exec a shared library.	*/</div><div class='del'>-#define	EILSEQ	88	/* Illegal byte sequence.		*/</div><div class='del'>-#define	ENOSYS	89	/* Unsupported file system operation	*/</div><div class='del'>-#define	ELOOP	90	/* Symbolic link loop			*/</div><div class='del'>-#define	ERESTART 91	/* Restartable system call		*/</div><div class='del'>-#define	ESTRPIPE 92	/* if pipe/FIFO, don't sleep in stream head */</div><div class='del'>-#define	ENOTEMPTY 93	/* directory not empty			*/</div><div class='del'>-#define	EUSERS	94	/* Too many users (for UFS)		*/</div><div class='del'>-</div><div class='del'>-/* BSD Networking Software */</div><div class='del'>-	/* argument errors */</div><div class='del'>-#define	ENOTSOCK	95	/* Socket operation on non-socket */</div><div class='del'>-#define	EDESTADDRREQ	96	/* Destination address required */</div><div class='del'>-#define	EMSGSIZE	97	/* Message too long */</div><div class='del'>-#define	EPROTOTYPE	98	/* Protocol wrong type for socket */</div><div class='del'>-#define	ENOPROTOOPT	99	/* Protocol not available */</div><div class='del'>-#define	EPROTONOSUPPORT	120	/* Protocol not supported */</div><div class='del'>-#define	ESOCKTNOSUPPORT	121	/* Socket type not supported */</div><div class='del'>-#define	EOPNOTSUPP	122	/* Operation not supported on socket */</div><div class='del'>-#define	EPFNOSUPPORT	123	/* Protocol family not supported */</div><div class='del'>-#define	EAFNOSUPPORT	124	/* Address family not supported by */</div><div class='del'>-				/* protocol family */</div><div class='del'>-#define	EADDRINUSE	125	/* Address already in use */</div><div class='del'>-#define	EADDRNOTAVAIL	126	/* Can't assign requested address */</div><div class='del'>-	/* operational errors */</div><div class='del'>-#define	ENETDOWN	127	/* Network is down */</div><div class='del'>-#define	ENETUNREACH	128	/* Network is unreachable */</div><div class='del'>-#define	ENETRESET	129	/* Network dropped connection because */</div><div class='del'>-				/* of reset */</div><div class='del'>-#define	ECONNABORTED	130	/* Software caused connection abort */</div><div class='del'>-#define	ECONNRESET	131	/* Connection reset by peer */</div><div class='del'>-#define	ENOBUFS		132	/* No buffer space available */</div><div class='del'>-#define	EISCONN		133	/* Socket is already connected */</div><div class='del'>-#define	ENOTCONN	134	/* Socket is not connected */</div><div class='del'>-/* XENIX has 135 - 142 */</div><div class='del'>-#define	ESHUTDOWN	143	/* Can't send after socket shutdown */</div><div class='del'>-#define	ETOOMANYREFS	144	/* Too many references: can't splice */</div><div class='del'>-#define	ETIMEDOUT	145	/* Connection timed out */</div><div class='del'>-#define	ECONNREFUSED	146	/* Connection refused */</div><div class='del'>-#define	EHOSTDOWN	147	/* Host is down */</div><div class='del'>-#define	EHOSTUNREACH	148	/* No route to host */</div><div class='del'>-#define	EWOULDBLOCK	EAGAIN</div><div class='del'>-#define	EALREADY	149	/* operation already in progress */</div><div class='del'>-#define	EINPROGRESS	150	/* operation now in progress */</div><div class='del'>-</div><div class='del'>-/* SUN Network File System */</div><div class='del'>-#define	ESTALE		151	/* Stale NFS file handle */</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-#ifdef	__cplusplus</div><div class='del'>-}</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-#endif	/* _SYS_ERRNO_H */</div><div class='head'>diff --git a/doc/examples/Makefile.am b/doc/examples/Makefile.am<br/>deleted file mode 100644<br/>index b4c93f4c90b..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/doc/examples/Makefile.am?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>doc/examples/Makefile.am</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,8 +0,0 @@</div><div class='del'>-EXTRA = README unify.vol replicate.vol stripe.vol protocol-client.vol protocol-server.vol posix-locks.vol trash.vol write-behind.vol io-threads.vol io-cache.vol read-ahead.vol filter.vol trace.vol</div><div class='del'>-EXTRA_DIST = $(EXTRA)</div><div class='del'>-</div><div class='del'>-docdir = $(datadir)/doc/$(PACKAGE_NAME)</div><div class='del'>-Examplesdir = $(docdir)/examples</div><div class='del'>-Examples_DATA = $(EXTRA)</div><div class='del'>-</div><div class='del'>-CLEANFILES = </div><div class='head'>diff --git a/doc/examples/README b/doc/examples/README<br/>deleted file mode 100644<br/>index 4d472ac086e..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/doc/examples/README?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>doc/examples/README</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,13 +0,0 @@</div><div class='del'>-GlusterFS's translator feature is very flexible and there are quite a lot of ways one </div><div class='del'>-can configure their filesystem to behave like. </div><div class='del'>-</div><div class='del'>-Volume Specification is a way in which GlusterFS understands how it has to work, based </div><div class='del'>-on what is written there. </div><div class='del'>-</div><div class='del'>-Going through the following URLs may give you more idea about all these.</div><div class='del'>-</div><div class='del'>-* http://www.gluster.org/docs/index.php/GlusterFS</div><div class='del'>-* http://www.gluster.org/docs/index.php/GlusterFS_Volume_Specification</div><div class='del'>-* http://www.gluster.org/docs/index.php/GlusterFS_Translators</div><div class='del'>-</div><div class='del'>-Mail us any doubts, suggestions on 'gluster-devel(at)nongnu.org'</div><div class='head'>diff --git a/doc/examples/filter.vol b/doc/examples/filter.vol<br/>deleted file mode 100644<br/>index ca5c5983779..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/doc/examples/filter.vol?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>doc/examples/filter.vol</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,23 +0,0 @@</div><div class='del'>-volume client</div><div class='del'>-  type protocol/client</div><div class='del'>-  option transport-type tcp     # for TCP/IP transport</div><div class='del'>-  option remote-host 192.168.1.10      # IP address of the remote brick</div><div class='del'>-  option remote-subvolume brick        # name of the remote volume</div><div class='del'>-end-volume</div><div class='del'>-</div><div class='del'>-## In normal clustered storage type, any of the cluster translators can come here.</div><div class='del'>-#</div><div class='del'>-# Definition of other clients</div><div class='del'>-# </div><div class='del'>-# Definition of cluster translator (may be unify, afr, or unify over afr)</div><div class='del'>-# </div><div class='del'>-</div><div class='del'>-### 'Filter' translator is used on client side (or server side according to needs). This traslator makes all the below translators, (or say volumes) as read-only. Hence if one wants a 'read-only' filesystem, using filter as the top most volume will make it really fast as the fops are returned from this level itself.</div><div class='del'>-</div><div class='del'>-volume filter-ro</div><div class='del'>- type features/filter</div><div class='del'>- option root-squashing enable</div><div class='del'>-# option completely-read-only yes</div><div class='del'>-# translate-uid 1-99=0</div><div class='del'>- subvolumes client</div><div class='del'>-end-volume
\ No newline at end of file</div><div class='head'>diff --git a/doc/examples/io-cache.vol b/doc/examples/io-cache.vol<br/>deleted file mode 100644<br/>index 5f3eca4c527..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/doc/examples/io-cache.vol?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>doc/examples/io-cache.vol</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,25 +0,0 @@</div><div class='del'>-volume client</div><div class='del'>-  type protocol/client</div><div class='del'>-  option transport-type tcp     # for TCP/IP transport</div><div class='del'>-  option remote-host 192.168.1.10      # IP address of the remote brick</div><div class='del'>-  option remote-subvolume brick        # name of the remote volume</div><div class='del'>-end-volume</div><div class='del'>-</div><div class='del'>-## In normal clustered storage type, any of the cluster translators can come here.</div><div class='del'>-#</div><div class='del'>-# Definition of other clients</div><div class='del'>-# </div><div class='del'>-# Definition of cluster translator (may be unify, replicate, or unify over replicate)</div><div class='del'>-# </div><div class='del'>-</div><div class='del'>-### 'IO-Cache' translator is best used on client side when a filesystem has file which are not modified frequently but read several times. For example, while compiling a kernel, *.h files are read while compiling every *.c file, in these case, io-cache translator comes very handy, as it keeps the whole file content in the cache, and serves from the cache.</div><div class='del'>-# One can provide the priority of the cache too.</div><div class='del'>-</div><div class='del'>-volume ioc</div><div class='del'>-  type performance/io-cache</div><div class='del'>-  subvolumes client         # In this example it is 'client' you may have to change it according to your spec file.</div><div class='del'>-  option page-size 1MB      # 128KB is default</div><div class='del'>-  option cache-size 64MB    # 32MB is default</div><div class='del'>-  option force-revalidate-timeout 5 # 1second is default </div><div class='del'>-  option priority *.html:2,*:1 # default is *:0</div><div class='del'>-end-volume</div><div class='head'>diff --git a/doc/examples/io-threads.vol b/doc/examples/io-threads.vol<br/>deleted file mode 100644<br/>index 9954724e1fe..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/doc/examples/io-threads.vol?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>doc/examples/io-threads.vol</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,21 +0,0 @@</div><div class='del'>-</div><div class='del'>-volume brick</div><div class='del'>-  type storage/posix                   # POSIX FS translator</div><div class='del'>-  option directory /home/export        # Export this directory</div><div class='del'>-end-volume</div><div class='del'>-</div><div class='del'>-###  'IO-threads' translator gives a threading behaviour to File I/O calls. All other normal fops are having default behaviour. Loading this on server side helps to reduce the contension of network. (Which is assumed as a GlusterFS hang). </div><div class='del'>-# One can load it in client side to reduce the latency involved in case of a slow network, when loaded below write-behind.</div><div class='del'>-volume iot</div><div class='del'>-  type performance/io-threads</div><div class='del'>-  subvolumes brick</div><div class='del'>-  option thread-count 4 # default value is 1</div><div class='del'>-end-volume</div><div class='del'>-</div><div class='del'>-volume server</div><div class='del'>-  type protocol/server</div><div class='del'>-  subvolumes iot brick</div><div class='del'>-  option transport-type tcp     # For TCP/IP transport</div><div class='del'>-  option auth.addr.brick.allow 192.168.* # Allow access to "brick" volume</div><div class='del'>-  option auth.addr.iot.allow 192.168.* # Allow access to "p-locks" volume</div><div class='del'>-end-volume</div><div class='head'>diff --git a/doc/examples/posix-locks.vol b/doc/examples/posix-locks.vol<br/>deleted file mode 100644<br/>index b9c9e7a6481..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/doc/examples/posix-locks.vol?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>doc/examples/posix-locks.vol</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,20 +0,0 @@</div><div class='del'>-</div><div class='del'>-volume brick</div><div class='del'>-  type storage/posix                   # POSIX FS translator</div><div class='del'>-  option directory /home/export        # Export this directory</div><div class='del'>-end-volume</div><div class='del'>-</div><div class='del'>-### 'Posix-locks' feature should be added on the server side (as posix volume as subvolume) because it contains the actual file. </div><div class='del'>-volume p-locks</div><div class='del'>-  type features/posix-locks</div><div class='del'>-  subvolumes brick</div><div class='del'>-  option mandatory on</div><div class='del'>-end-volume</div><div class='del'>-</div><div class='del'>-volume server</div><div class='del'>-  type protocol/server</div><div class='del'>-  subvolumes p-locks brick</div><div class='del'>-  option transport-type tcp</div><div class='del'>-  option auth.addr.brick.allow 192.168.* # Allow access to "brick" volume</div><div class='del'>-  option auth.addr.p-locks.allow 192.168.* # Allow access to "p-locks" volume</div><div class='del'>-end-volume</div><div class='head'>diff --git a/doc/examples/protocol-client.vol b/doc/examples/protocol-client.vol<br/>deleted file mode 100644<br/>index 43108f2c2c1..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/doc/examples/protocol-client.vol?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>doc/examples/protocol-client.vol</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,17 +0,0 @@</div><div class='del'>-volume client</div><div class='del'>-  type protocol/client</div><div class='del'>-  option transport-type tcp     # for TCP/IP transport</div><div class='del'>-# option transport-type ib-sdp  # for Infiniband transport</div><div class='del'>-  option remote-host 192.168.1.10      # IP address of the remote brick</div><div class='del'>-# option transport.socket.remote-port 6996              # default server port is 6996</div><div class='del'>-</div><div class='del'>-# option transport-type ib-verbs # for Infiniband verbs transport</div><div class='del'>-# option transport.ib-verbs.work-request-send-size  1048576</div><div class='del'>-# option transport.ib-verbs.work-request-send-count 16</div><div class='del'>-# option transport.ib-verbs.work-request-recv-size  1048576</div><div class='del'>-# option transport.ib-verbs.work-request-recv-count 16</div><div class='del'>-# option transport.ib-verbs.remote-port 6996              # default server port is 6996</div><div class='del'>-</div><div class='del'>-  option remote-subvolume brick        # name of the remote volume</div><div class='del'>-# option transport-timeout 30          # default value is 120seconds </div><div class='del'>-end-volume</div><div class='head'>diff --git a/doc/examples/protocol-server.vol b/doc/examples/protocol-server.vol<br/>deleted file mode 100644<br/>index 88477511f55..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/doc/examples/protocol-server.vol?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>doc/examples/protocol-server.vol</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,25 +0,0 @@</div><div class='del'>-</div><div class='del'>-### Export volume "brick" with the contents of "/home/export" directory.</div><div class='del'>-volume brick</div><div class='del'>-  type storage/posix                   # POSIX FS translator</div><div class='del'>-  option directory /home/export        # Export this directory</div><div class='del'>-end-volume</div><div class='del'>-</div><div class='del'>-### Add network serving capability to above brick.</div><div class='del'>-volume server</div><div class='del'>-  type protocol/server</div><div class='del'>-  option transport-type tcp      # For TCP/IP transport</div><div class='del'>-# option transport.socket.listen-port 6996              # Default is 6996</div><div class='del'>-</div><div class='del'>-# option transport-type ib-verbs # For Infiniband Verbs transport</div><div class='del'>-# option transport.ib-verbs.work-request-send-size  131072</div><div class='del'>-# option transport.ib-verbs.work-request-send-count 64</div><div class='del'>-# option transport.ib-verbs.work-request-recv-size  131072</div><div class='del'>-# option transport.ib-verbs.work-request-recv-count 64</div><div class='del'>-# option transport.ib-verbs.listen-port 6996              # Default is 6996</div><div class='del'>-</div><div class='del'>-# option bind-address 192.168.1.10     # Default is to listen on all interfaces</div><div class='del'>-# option client-volume-filename /etc/glusterfs/glusterfs-client.vol</div><div class='del'>-  subvolumes brick </div><div class='del'>-  option auth.addr.brick.allow 192.168.* # Allow access to "brick" volume</div><div class='del'>-end-volume</div><div class='head'>diff --git a/doc/examples/read-ahead.vol b/doc/examples/read-ahead.vol<br/>deleted file mode 100644<br/>index 3ce0d95aca7..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/doc/examples/read-ahead.vol?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>doc/examples/read-ahead.vol</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,22 +0,0 @@</div><div class='del'>-volume client</div><div class='del'>-  type protocol/client</div><div class='del'>-  option transport-type tcp     # for TCP/IP transport</div><div class='del'>-  option remote-host 192.168.1.10      # IP address of the remote brick</div><div class='del'>-  option remote-subvolume brick        # name of the remote volume</div><div class='del'>-end-volume</div><div class='del'>-</div><div class='del'>-## In normal clustered storage type, any of the cluster translators can come here.</div><div class='del'>-#</div><div class='del'>-# Definition of other clients</div><div class='del'>-# </div><div class='del'>-# Definition of cluster translator (may be unify, replicate, or unify over replicate)</div><div class='del'>-# </div><div class='del'>-</div><div class='del'>-### 'Read-Ahead' translator is best utilized on client side, as it prefetches the file contents when the first read() call is issued. </div><div class='del'>-volume ra</div><div class='del'>-  type performance/read-ahead</div><div class='del'>-  subvolumes client            # In this example it is 'client' you may have to change it according to your spec file.</div><div class='del'>-  option page-size 1MB         # default is 256KB</div><div class='del'>-  option page-count 4          # default is 2</div><div class='del'>-  option force-atime-update no # defalut is 'no'</div><div class='del'>-end-volume</div><div class='head'>diff --git a/doc/examples/replicate.vol b/doc/examples/replicate.vol<br/>deleted file mode 100644<br/>index 8c9541444f8..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/doc/examples/replicate.vol?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>doc/examples/replicate.vol</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,119 +0,0 @@</div><div class='del'>-### 'NOTE'</div><div class='del'>-# This file has both server spec and client spec to get an understanding of stripe's spec file. Hence can't be used as it is, as a GlusterFS spec file. </div><div class='del'>-# One need to seperate out server spec and client spec to get it working.</div><div class='del'>-</div><div class='del'>-#=========================================================================</div><div class='del'>-</div><div class='del'>-# **** server1 spec file ****</div><div class='del'>-</div><div class='del'>-### Export volume "brick" with the contents of "/home/export" directory.</div><div class='del'>-volume posix1</div><div class='del'>-  type storage/posix                    # POSIX FS translator</div><div class='del'>-  option directory /home/export1        # Export this directory</div><div class='del'>-end-volume</div><div class='del'>-</div><div class='del'>-### Add POSIX record locking support to the storage brick</div><div class='del'>-volume brick1</div><div class='del'>-  type features/posix-locks</div><div class='del'>-  option mandatory on          # enables mandatory locking on all files</div><div class='del'>-  subvolumes posix1</div><div class='del'>-end-volume</div><div class='del'>-</div><div class='del'>-### Add network serving capability to above brick.</div><div class='del'>-volume server</div><div class='del'>-  type protocol/server</div><div class='del'>-  option transport-type tcp                      # For TCP/IP transport</div><div class='del'>-  option transport.socket.listen-port 6996       # Default is 6996</div><div class='del'>-# option client-volume-filename /etc/glusterfs/glusterfs-client.vol</div><div class='del'>-  subvolumes brick1</div><div class='del'>-  option auth.addr.brick1.allow * 		# access to "brick" volume</div><div class='del'>-end-volume</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-#=========================================================================</div><div class='del'>-</div><div class='del'>-# **** server2 spec file ****</div><div class='del'>-volume posix2</div><div class='del'>-  type storage/posix                    # POSIX FS translator</div><div class='del'>-  option directory /home/export2        # Export this directory</div><div class='del'>-end-volume</div><div class='del'>-</div><div class='del'>-### Add POSIX record locking support to the storage brick</div><div class='del'>-volume brick2</div><div class='del'>-  type features/posix-locks</div><div class='del'>-  option mandatory on          # enables mandatory locking on all files</div><div class='del'>-  subvolumes posix2</div><div class='del'>-end-volume</div><div class='del'>-</div><div class='del'>-### Add network serving capability to above brick.</div><div class='del'>-volume server</div><div class='del'>-  type protocol/server</div><div class='del'>-  option transport-type tcp                  # For TCP/IP transport</div><div class='del'>-  option transport.socket.listen-port 6997   # Default is 6996</div><div class='del'>-  subvolumes brick2</div><div class='del'>-  option auth.addr.brick2.allow * # Allow access to "brick" volume</div><div class='del'>-end-volume</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-#=========================================================================</div><div class='del'>-</div><div class='del'>-# **** server3 spec file ****</div><div class='del'>-</div><div class='del'>-volume posix3</div><div class='del'>-  type storage/posix                    # POSIX FS translator</div><div class='del'>-  option directory /home/export3        # Export this directory</div><div class='del'>-end-volume</div><div class='del'>-</div><div class='del'>-### Add POSIX record locking support to the storage brick</div><div class='del'>-volume brick3</div><div class='del'>-  type features/posix-locks</div><div class='del'>-  option mandatory on          # enables mandatory locking on all files</div><div class='del'>-  subvolumes posix3</div><div class='del'>-end-volume</div><div class='del'>-</div><div class='del'>-### Add network serving capability to above brick.</div><div class='del'>-volume server</div><div class='del'>-  type protocol/server</div><div class='del'>-  option transport-type tcp                 # For TCP/IP transport</div><div class='del'>-  option transport.socket.listen-port 6998  # Default is 6996</div><div class='del'>-  subvolumes brick3</div><div class='del'>-  option auth.addr.brick3.allow * 		# access to "brick" volume</div><div class='del'>-end-volume</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-#=========================================================================</div><div class='del'>-</div><div class='del'>-# **** Clustered Client config file ****</div><div class='del'>-</div><div class='del'>-### Add client feature and attach to remote subvolume of server1</div><div class='del'>-volume client1</div><div class='del'>-  type protocol/client</div><div class='del'>-  option transport-type tcp     # for TCP/IP transport</div><div class='del'>-  option remote-host 127.0.0.1      # IP address of the remote brick</div><div class='del'>-  option transport.socket.remote-port 6996              # default server port is 6996</div><div class='del'>-  option remote-subvolume brick1        # name of the remote volume</div><div class='del'>-end-volume</div><div class='del'>-</div><div class='del'>-### Add client feature and attach to remote subvolume of server2</div><div class='del'>-volume client2</div><div class='del'>-  type protocol/client</div><div class='del'>-  option transport-type tcp     # for TCP/IP transport</div><div class='del'>-  option remote-host 127.0.0.1      # IP address of the remote brick</div><div class='del'>-  option transport.socket.remote-port 6997              # default server port is 6996</div><div class='del'>-  option remote-subvolume brick2        # name of the remote volume</div><div class='del'>-end-volume</div><div class='del'>-</div><div class='del'>-volume client3</div><div class='del'>-  type protocol/client</div><div class='del'>-  option transport-type tcp     # for TCP/IP transport</div><div class='del'>-  option remote-host 127.0.0.1      # IP address of the remote brick</div><div class='del'>-  option transport.socket.remote-port 6998              # default server port is 6996</div><div class='del'>-  option remote-subvolume brick3        # name of the remote volume</div><div class='del'>-end-volume</div><div class='del'>-</div><div class='del'>-## Add replicate feature.</div><div class='del'>-volume replicate</div><div class='del'>-  type cluster/replicate</div><div class='del'>-  subvolumes client1 client2 client3</div><div class='del'>-end-volume</div><div class='del'>-</div><div class='head'>diff --git a/doc/examples/stripe.vol b/doc/examples/stripe.vol<br/>deleted file mode 100644<br/>index ea24cf86038..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/doc/examples/stripe.vol?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>doc/examples/stripe.vol</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,121 +0,0 @@</div><div class='del'>-</div><div class='del'>-### 'NOTE'</div><div class='del'>-# This file has both server spec and client spec to get an understanding of stripe's spec file. Hence can't be used as it is, as a GlusterFS spec file. </div><div class='del'>-# One need to seperate out server spec and client spec to get it working.</div><div class='del'>-</div><div class='del'>-#=========================================================================</div><div class='del'>-</div><div class='del'>-# **** server1 spec file ****</div><div class='del'>-</div><div class='del'>-### Export volume "brick" with the contents of "/home/export" directory.</div><div class='del'>-volume posix1</div><div class='del'>-  type storage/posix                    # POSIX FS translator</div><div class='del'>-  option directory /home/export1        # Export this directory</div><div class='del'>-end-volume</div><div class='del'>-</div><div class='del'>-### Add POSIX record locking support to the storage brick</div><div class='del'>-volume brick1</div><div class='del'>-  type features/posix-locks</div><div class='del'>-  option mandatory on          # enables mandatory locking on all files</div><div class='del'>-  subvolumes posix1</div><div class='del'>-end-volume</div><div class='del'>-</div><div class='del'>-### Add network serving capability to above brick.</div><div class='del'>-volume server</div><div class='del'>-  type protocol/server</div><div class='del'>-  option transport-type tcp     # For TCP/IP transport</div><div class='del'>-  option transport.socket.listen-port 6996              # Default is 6996</div><div class='del'>-# option client-volume-filename /etc/glusterfs/glusterfs-client.vol</div><div class='del'>-  subvolumes brick1</div><div class='del'>-  option auth.addr.brick1.allow * 		# access to "brick" volume</div><div class='del'>-end-volume</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-#=========================================================================</div><div class='del'>-</div><div class='del'>-# **** server2 spec file ****</div><div class='del'>-volume posix2</div><div class='del'>-  type storage/posix                    # POSIX FS translator</div><div class='del'>-  option directory /home/export2        # Export this directory</div><div class='del'>-end-volume</div><div class='del'>-</div><div class='del'>-### Add POSIX record locking support to the storage brick</div><div class='del'>-volume brick2</div><div class='del'>-  type features/posix-locks</div><div class='del'>-  option mandatory on          # enables mandatory locking on all files</div><div class='del'>-  subvolumes posix2</div><div class='del'>-end-volume</div><div class='del'>-</div><div class='del'>-### Add network serving capability to above brick.</div><div class='del'>-volume server</div><div class='del'>-  type protocol/server</div><div class='del'>-  option transport-type tcp     # For TCP/IP transport</div><div class='del'>-  option transport.socket.listen-port 6997              # Default is 6996</div><div class='del'>-  subvolumes brick2</div><div class='del'>-  option auth.addr.brick2.allow * # Allow access to "brick" volume</div><div class='del'>-end-volume</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-#=========================================================================</div><div class='del'>-</div><div class='del'>-# **** server3 spec file ****</div><div class='del'>-</div><div class='del'>-volume posix3</div><div class='del'>-  type storage/posix                    # POSIX FS translator</div><div class='del'>-  option directory /home/export3        # Export this directory</div><div class='del'>-end-volume</div><div class='del'>-</div><div class='del'>-### Add POSIX record locking support to the storage brick</div><div class='del'>-volume brick3</div><div class='del'>-  type features/posix-locks</div><div class='del'>-  option mandatory on          # enables mandatory locking on all files</div><div class='del'>-  subvolumes posix3</div><div class='del'>-end-volume</div><div class='del'>-</div><div class='del'>-### Add network serving capability to above brick.</div><div class='del'>-volume server</div><div class='del'>-  type protocol/server</div><div class='del'>-  option transport-type tcp     # For TCP/IP transport</div><div class='del'>-  option transport.socket.listen-port 6998              # Default is 6996</div><div class='del'>-  subvolumes brick3</div><div class='del'>-  option auth.addr.brick3.allow * 		# access to "brick" volume</div><div class='del'>-end-volume</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-#=========================================================================</div><div class='del'>-</div><div class='del'>-# **** Clustered Client config file ****</div><div class='del'>-</div><div class='del'>-### Add client feature and attach to remote subvolume of server1</div><div class='del'>-volume client1</div><div class='del'>-  type protocol/client</div><div class='del'>-  option transport-type tcp     # for TCP/IP transport</div><div class='del'>-  option remote-host 127.0.0.1      # IP address of the remote brick</div><div class='del'>-  option transport.socket.remote-port 6996              # default server port is 6996</div><div class='del'>-  option remote-subvolume brick1        # name of the remote volume</div><div class='del'>-end-volume</div><div class='del'>-</div><div class='del'>-### Add client feature and attach to remote subvolume of server2</div><div class='del'>-volume client2</div><div class='del'>-  type protocol/client</div><div class='del'>-  option transport-type tcp     # for TCP/IP transport</div><div class='del'>-  option remote-host 127.0.0.1      # IP address of the remote brick</div><div class='del'>-  option transport.socket.remote-port 6997              # default server port is 6996</div><div class='del'>-  option remote-subvolume brick2        # name of the remote volume</div><div class='del'>-end-volume</div><div class='del'>-</div><div class='del'>-volume client3</div><div class='del'>-  type protocol/client</div><div class='del'>-  option transport-type tcp     # for TCP/IP transport</div><div class='del'>-  option remote-host 127.0.0.1      # IP address of the remote brick</div><div class='del'>-  option transport.socket.remote-port 6998              # default server port is 6996</div><div class='del'>-  option remote-subvolume brick3        # name of the remote volume</div><div class='del'>-end-volume</div><div class='del'>-</div><div class='del'>-## Add Stripe Feature.</div><div class='del'>-volume stripe</div><div class='del'>-  type cluster/stripe</div><div class='del'>-  subvolumes client1 client2 client3</div><div class='del'>-  option block-size 1MB</div><div class='del'>-end-volume</div><div class='del'>-</div><div class='head'>diff --git a/doc/examples/trace.vol b/doc/examples/trace.vol<br/>deleted file mode 100644<br/>index 3f4864db496..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/doc/examples/trace.vol?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>doc/examples/trace.vol</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,16 +0,0 @@</div><div class='del'>-volume client</div><div class='del'>-  type protocol/client</div><div class='del'>-  option transport-type tcp     # for TCP/IP transport</div><div class='del'>-  option remote-host 192.168.1.10      # IP address of the remote brick</div><div class='del'>-  option remote-subvolume brick        # name of the remote volume</div><div class='del'>-end-volume</div><div class='del'>-</div><div class='del'>-### 'Trace' translator is a very handy debug tool for GlusterFS, as it can be loaded between any of the two volumes without changing the behaviour of the filesystem. </div><div class='del'>-# On client side it can be the top most volume in spec (like now) to understand what calls are made on FUSE filesystem, when a mounted filesystem is accessed.</div><div class='del'>-</div><div class='del'>-volume trace</div><div class='del'>-  type debug/trace</div><div class='del'>-  subvolumes client</div><div class='del'>-end-volume</div><div class='del'>-</div><div class='del'>-# 'NOTE:' By loading 'debug/trace' translator, filesystem will be very slow as it logs each and every calls to the log file.</div><div class='head'>diff --git a/doc/examples/trash.vol b/doc/examples/trash.vol<br/>deleted file mode 100644<br/>index 16e71be3232..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/doc/examples/trash.vol?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>doc/examples/trash.vol</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,20 +0,0 @@</div><div class='del'>-</div><div class='del'>-volume brick</div><div class='del'>-  type storage/posix                   # POSIX FS translator</div><div class='del'>-  option directory /home/export        # Export this directory</div><div class='del'>-end-volume</div><div class='del'>-</div><div class='del'>-### 'Trash' translator is best used on server side as it just renames the deleted file inside 'trash-dir', and it makes 4 seperate fops for one unlink call.  </div><div class='del'>-volume trashcan</div><div class='del'>-  type features/trash</div><div class='del'>-  subvolumes brick</div><div class='del'>-  option trash-dir /.trashcan</div><div class='del'>-end-volume</div><div class='del'>-</div><div class='del'>-volume server</div><div class='del'>-  type protocol/server</div><div class='del'>-  subvolumes trashcan brick</div><div class='del'>-  option transport-type tcp     # For TCP/IP transport</div><div class='del'>-  option auth.addr.brick.allow 192.168.* # Allow access to "brick" volume</div><div class='del'>-  option auth.addr.trashcan.allow 192.168.* # Allow access to "p-locks" volume</div><div class='del'>-end-volume</div><div class='head'>diff --git a/doc/examples/unify.vol b/doc/examples/unify.vol<br/>deleted file mode 100644<br/>index 4f7415a2369..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/doc/examples/unify.vol?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>doc/examples/unify.vol</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,178 +0,0 @@</div><div class='del'>-### 'NOTE'</div><div class='del'>-# This file has both server spec and client spec to get an understanding of stripe's spec file. Hence can't be used as it is, as a GlusterFS spec file. </div><div class='del'>-# One need to seperate out server spec and client spec to get it working.</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-#=========================================================================</div><div class='del'>-</div><div class='del'>-# **** server1 spec file ****</div><div class='del'>-</div><div class='del'>-### Export volume "brick" with the contents of "/home/export" directory.</div><div class='del'>-volume posix1</div><div class='del'>-  type storage/posix                    # POSIX FS translator</div><div class='del'>-  option directory /home/export1        # Export this directory</div><div class='del'>-end-volume</div><div class='del'>-</div><div class='del'>-### Add POSIX record locking support to the storage brick</div><div class='del'>-volume brick1</div><div class='del'>-  type features/posix-locks</div><div class='del'>-  option mandatory on          # enables mandatory locking on all files</div><div class='del'>-  subvolumes posix1</div><div class='del'>-end-volume</div><div class='del'>-</div><div class='del'>-### Add network serving capability to above brick.</div><div class='del'>-volume server</div><div class='del'>-  type protocol/server</div><div class='del'>-  option transport-type tcp     # For TCP/IP transport</div><div class='del'>-  option transport.socket.listen-port 6996              # Default is 6996</div><div class='del'>-# option client-volume-filename /etc/glusterfs/glusterfs-client.vol</div><div class='del'>-  subvolumes brick1</div><div class='del'>-  option auth.addr.brick1.allow * 		# access to "brick" volume</div><div class='del'>-end-volume</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-#=========================================================================</div><div class='del'>-</div><div class='del'>-# **** server2 spec file ****</div><div class='del'>-volume posix2</div><div class='del'>-  type storage/posix                    # POSIX FS translator</div><div class='del'>-  option directory /home/export2        # Export this directory</div><div class='del'>-end-volume</div><div class='del'>-</div><div class='del'>-### Add POSIX record locking support to the storage brick</div><div class='del'>-volume brick2</div><div class='del'>-  type features/posix-locks</div><div class='del'>-  option mandatory on          # enables mandatory locking on all files</div><div class='del'>-  subvolumes posix2</div><div class='del'>-end-volume</div><div class='del'>-</div><div class='del'>-### Add network serving capability to above brick.</div><div class='del'>-volume server</div><div class='del'>-  type protocol/server</div><div class='del'>-  option transport-type tcp     # For TCP/IP transport</div><div class='del'>-  option transport.socket.listen-port 6997              # Default is 6996</div><div class='del'>-  subvolumes brick2</div><div class='del'>-  option auth.addr.brick2.allow * # Allow access to "brick" volume</div><div class='del'>-end-volume</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-#=========================================================================</div><div class='del'>-</div><div class='del'>-# **** server3 spec file ****</div><div class='del'>-</div><div class='del'>-volume posix3</div><div class='del'>-  type storage/posix                    # POSIX FS translator</div><div class='del'>-  option directory /home/export3        # Export this directory</div><div class='del'>-end-volume</div><div class='del'>-</div><div class='del'>-### Add POSIX record locking support to the storage brick</div><div class='del'>-volume brick3</div><div class='del'>-  type features/posix-locks</div><div class='del'>-  option mandatory on          # enables mandatory locking on all files</div><div class='del'>-  subvolumes posix3</div><div class='del'>-end-volume</div><div class='del'>-</div><div class='del'>-### Add network serving capability to above brick.</div><div class='del'>-volume server</div><div class='del'>-  type protocol/server</div><div class='del'>-  option transport-type tcp     # For TCP/IP transport</div><div class='del'>-  option transport.socket.listen-port 6998              # Default is 6996</div><div class='del'>-  subvolumes brick3</div><div class='del'>-  option auth.addr.brick3.allow * 		# access to "brick" volume</div><div class='del'>-end-volume</div><div class='del'>-</div><div class='del'>-#=========================================================================</div><div class='del'>-</div><div class='del'>-# *** server for namespace *** </div><div class='del'>-### Export volume "brick" with the contents of "/home/export" directory.</div><div class='del'>-volume brick-ns</div><div class='del'>-  type storage/posix                    # POSIX FS translator</div><div class='del'>-  option directory /home/export-ns      # Export this directory</div><div class='del'>-end-volume</div><div class='del'>-</div><div class='del'>-volume server</div><div class='del'>-  type protocol/server</div><div class='del'>-  option transport-type tcp     # For TCP/IP transport</div><div class='del'>-  option transport.socket.listen-port 6999              # Default is 6996</div><div class='del'>-  subvolumes brick-ns</div><div class='del'>-  option auth.addr.brick-ns.allow * 		# access to "brick" volume</div><div class='del'>-end-volume</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-#=========================================================================</div><div class='del'>-</div><div class='del'>-# **** Clustered Client config file ****</div><div class='del'>-</div><div class='del'>-### Add client feature and attach to remote subvolume of server1</div><div class='del'>-volume client1</div><div class='del'>-  type protocol/client</div><div class='del'>-  option transport-type tcp     # for TCP/IP transport</div><div class='del'>-# option transport-type ib-sdp  # for Infiniband transport</div><div class='del'>-  option remote-host 127.0.0.1      # IP address of the remote brick</div><div class='del'>-  option transport.socket.remote-port 6996              # default server port is 6996</div><div class='del'>-  option remote-subvolume brick1        # name of the remote volume</div><div class='del'>-end-volume</div><div class='del'>-</div><div class='del'>-### Add client feature and attach to remote subvolume of server2</div><div class='del'>-volume client2</div><div class='del'>-  type protocol/client</div><div class='del'>-  option transport-type tcp     # for TCP/IP transport</div><div class='del'>-# option transport-type ib-sdp  # for Infiniband transport</div><div class='del'>-  option remote-host 127.0.0.1      # IP address of the remote brick</div><div class='del'>-  option transport.socket.remote-port 6997              # default server port is 6996</div><div class='del'>-  option remote-subvolume brick2        # name of the remote volume</div><div class='del'>-end-volume</div><div class='del'>-</div><div class='del'>-volume client3</div><div class='del'>-  type protocol/client</div><div class='del'>-  option transport-type tcp     # for TCP/IP transport</div><div class='del'>-# option transport-type ib-sdp  # for Infiniband transport</div><div class='del'>-  option remote-host 127.0.0.1      # IP address of the remote brick</div><div class='del'>-  option transport.socket.remote-port 6998              # default server port is 6996</div><div class='del'>-  option remote-subvolume brick3        # name of the remote volume</div><div class='del'>-end-volume</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-volume client-ns</div><div class='del'>-  type protocol/client</div><div class='del'>-  option transport-type tcp     # for TCP/IP transport</div><div class='del'>-# option transport-type ib-sdp  # for Infiniband transport</div><div class='del'>-  option remote-host 127.0.0.1         # IP address of the remote brick</div><div class='del'>-  option transport.socket.remote-port 6999              # default server port is 6996</div><div class='del'>-  option remote-subvolume brick-ns     # name of the remote volume</div><div class='del'>-end-volume</div><div class='del'>-</div><div class='del'>-### Add unify feature to cluster the servers. Associate an</div><div class='del'>-### appropriate scheduler that matches your I/O demand.</div><div class='del'>-volume bricks</div><div class='del'>-  type cluster/unify</div><div class='del'>-  option namespace client-ns # this will not be storage child of unify.</div><div class='del'>-  subvolumes client1 client2 client3</div><div class='del'>-### ** ALU Scheduler Option **</div><div class='del'>-  option self-heal background # foreground off # default is foreground</div><div class='del'>-  option scheduler alu</div><div class='del'>-  option alu.limits.min-free-disk  5% #%</div><div class='del'>-  option alu.limits.max-open-files 10000</div><div class='del'>-  option alu.order disk-usage:read-usage:write-usage:open-files-usage:disk-speed-usage</div><div class='del'>-  option alu.disk-usage.entry-threshold 2GB</div><div class='del'>-  option alu.disk-usage.exit-threshold  128MB</div><div class='del'>-  option alu.open-files-usage.entry-threshold 1024</div><div class='del'>-  option alu.open-files-usage.exit-threshold 32</div><div class='del'>-  option alu.read-usage.entry-threshold 20 #%</div><div class='del'>-  option alu.read-usage.exit-threshold 4 #%</div><div class='del'>-  option alu.write-usage.entry-threshold 20 #%</div><div class='del'>-  option alu.write-usage.exit-threshold 4 #%</div><div class='del'>-  option alu.disk-speed-usage.entry-threshold 0 # DO NOT SET IT. SPEED IS CONSTANT!!!.</div><div class='del'>-  option alu.disk-speed-usage.exit-threshold 0 # DO NOT SET IT. SPEED IS CONSTANT!!!.</div><div class='del'>-  option alu.stat-refresh.interval 10sec</div><div class='del'>-  option alu.stat-refresh.num-file-create 10</div><div class='del'>-### ** Random Scheduler **</div><div class='del'>-# option scheduler random</div><div class='del'>-### ** NUFA Scheduler **</div><div class='del'>-# option scheduler nufa</div><div class='del'>-# option nufa.local-volume-name posix1</div><div class='del'>-### ** Round Robin (RR) Scheduler **</div><div class='del'>-# option scheduler rr</div><div class='del'>-# option rr.limits.min-free-disk 5% #%</div><div class='del'>-end-volume</div><div class='del'>-</div><div class='head'>diff --git a/doc/examples/write-behind.vol b/doc/examples/write-behind.vol<br/>deleted file mode 100644<br/>index 9c6bae11c53..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/doc/examples/write-behind.vol?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>doc/examples/write-behind.vol</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,26 +0,0 @@</div><div class='del'>-volume client</div><div class='del'>-  type protocol/client</div><div class='del'>-  option transport-type tcp     # for TCP/IP transport</div><div class='del'>-  option remote-host 192.168.1.10      # IP address of the remote brick</div><div class='del'>-  option remote-subvolume brick        # name of the remote volume</div><div class='del'>-end-volume</div><div class='del'>-</div><div class='del'>-## In normal clustered storage type, any of the cluster translators can come here.</div><div class='del'>-#</div><div class='del'>-# Definition of other clients</div><div class='del'>-# </div><div class='del'>-# Definition of cluster translator (may be unify, replicate, or unify over replicate)</div><div class='del'>-# </div><div class='del'>-</div><div class='del'>-</div><div class='del'>-### 'Write-behind' translator is a performance booster for write operation. Best used on client side, as its main intension is to reduce the network latency caused for each write operation.</div><div class='del'>-</div><div class='del'>-volume wb</div><div class='del'>-  type performance/write-behind</div><div class='del'>-  subvolumes client         # In this example it is 'client' you may have to change it according to your spec file.</div><div class='del'>-  option flush-behind on    # default value is 'off'</div><div class='del'>-  option window-size 2MB</div><div class='del'>-  option aggregate-size 1MB # default value is 0</div><div class='del'>-  option enable_O_SYNC no  # default is no</div><div class='del'>-  option disable-for-first-nbytes 128KB #default is 1 </div><div class='del'>-end-volume</div><div class='head'>diff --git a/doc/features/ctime.md b/doc/features/ctime.md<br/>new file mode 100644<br/>index 00000000000..74a77abed4b<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/doc/features/ctime.md?id=d1d7a6f35c816822fab51c820e25023863c239c1'>doc/features/ctime.md</a></div><div class='hunk'>@@ -0,0 +1,68 @@</div><div class='add'>+# Consistent time attributes in gluster across replica/distribute</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+#### Problem:</div><div class='add'>+Traditionally gluster has been using time attributes (ctime, atime, mtime) of files/dirs from bricks. The problem with this approach is that, it is not consisteant  across replica and distribute bricks. And applications which depend on it breaks as replica  might not  always return time attributes from same brick.</div><div class='add'>+</div><div class='add'>+Tar especially gives "file changed as we read it" whenever it detects ctime differences when stat is served from  different bricks. The way we have been trying to solve it is to serve  the stat structures from same brick in afr, max-time in dht. But it doesn't avoid the problem completely. Because there is no way to change ctime at the moment(lutimes() only allows mtime, atime), there is little we can do to make sure ctimes match after self-heals/xattr updates/rebalance.</div><div class='add'>+</div><div class='add'>+#### Solution Proposed:</div><div class='add'>+Store time attribues (ctime, mtime, atime) as an xattr of the file. The xattr is updated based</div><div class='add'>+on the fop. If a filesystem fop changes only mtime and ctime, update only those in xattr for</div><div class='add'>+that file.</div><div class='add'>+</div><div class='add'>+#### Design Overview:</div><div class='add'>+1) As part of each fop, top layer will generate a time stamp and pass it to the down along</div><div class='add'>+ with other information</div><div class='add'>+  - This will bring a dependency for NTP synced clients along with servers</div><div class='add'>+  - There can be a diff in time if the fop stuck in the xlator for various reason,</div><div class='add'>+for ex: because of locks.</div><div class='add'>+</div><div class='add'>+ 2)  On the server, posix layer stores the value in the memory (inode ctx) and will sync the data periodically to the disk as an extended attr</div><div class='add'>+  -  Of course sync call also will force it. And fop comes for an inode which is not linked, we do the sync immediately.</div><div class='add'>+</div><div class='add'>+ 3)  Each time when inodes are created or initialized it read the data from disk and store in inode ctx.</div><div class='add'>+</div><div class='add'>+ 4)  Before setting to inode_ctx we compare the timestamp stored and the timestamp received, and only store if the stored value is lesser than the current value.</div><div class='add'>+</div><div class='add'>+ 5)  So in best case data will be stored and retrieved from the memory. We replace the values in iatt with the values in inode_ctx.</div><div class='add'>+</div><div class='add'>+ 6)  File ops that changes the parent directory attr time need to be consistent across all the distributed directories across the subvolumes. (for eg: a create call will change ctime and mtime of parent dir)</div><div class='add'>+</div><div class='add'>+  - This has to handle separately because we only send the fop to the hashed subvolume.</div><div class='add'>+  - We can asynchronously send the timeupdate setattr fop to the other subvoumes and change the values for parent directory if the file fops is successful on hashed subvolume.</div><div class='add'>+  -  This will have a window where the times are inconsistent across dht subvolume (Please provide your suggestions)</div><div class='add'>+</div><div class='add'>+7)  Currently we have couple of mount options for time attributes like noatime, relatime , nodiratime etc. But we are not explicitly handled those options even if it is given as mount option when gluster mount.</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+#### Implementation Overview:</div><div class='add'>+This features involves changes in following xlators.</div><div class='add'>+ - utime xlator</div><div class='add'>+ - posix xlator</div><div class='add'>+</div><div class='add'>+##### utime xlator:</div><div class='add'>+This is a new client side xlator which does following tasks.</div><div class='add'>+</div><div class='add'>+1. It will generate a time stamp and passes it down in frame-&gt;root-&gt;ctime  and over the network.</div><div class='add'>+2.  Based on fop, it also decides the time attributes to be updated and this passed using "frame-&gt;root-&gt;flags"</div><div class='add'>+</div><div class='add'>+    Patches:</div><div class='add'>+    1. https://review.gluster.org/#/c/19857/</div><div class='add'>+</div><div class='add'>+##### posix xlator:</div><div class='add'>+Following tasks are done in posix xlator:</div><div class='add'>+</div><div class='add'>+1. Provides APIs to set and get the xattr from backend. It also caches the xattr in inode context. During get, it updates time attributes stored in xattr into iatt structure.</div><div class='add'>+2. Based on the flags from utime xlator, relevant fops update the time attributes in the xattr.</div><div class='add'>+</div><div class='add'>+    Patches:</div><div class='add'>+    1. https://review.gluster.org/#/c/19267/</div><div class='add'>+    2. https://review.gluster.org/#/c/19795/</div><div class='add'>+    3. https://review.gluster.org/#/c/19796/</div><div class='add'>+</div><div class='add'>+#### Pending Work:</div><div class='add'>+1. Handling of time related mount options (noatime, realatime,etc)</div><div class='add'>+2. flag based create (depending on flags in open, create behaviour might change)</div><div class='add'>+3. Changes in dht for direcotory sync acrosss multiple subvolumes</div><div class='add'>+4. readdirp stat need to be worked on.</div><div class='head'>diff --git a/doc/features/ganesha-ha.md b/doc/features/ganesha-ha.md<br/>new file mode 100644<br/>index 00000000000..4b226a22ccf<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/doc/features/ganesha-ha.md?id=d1d7a6f35c816822fab51c820e25023863c239c1'>doc/features/ganesha-ha.md</a></div><div class='hunk'>@@ -0,0 +1,43 @@</div><div class='add'>+# Overview of Ganesha HA Resource Agents in GlusterFS 3.7</div><div class='add'>+</div><div class='add'>+The ganesha_mon RA monitors its ganesha.nfsd daemon. While the</div><div class='add'>+daemon is running, it creates two attributes: ganesha-active and</div><div class='add'>+grace-active. When the daemon stops for any reason, the attributes</div><div class='add'>+are deleted. Deleting the ganesha-active attribute triggers the</div><div class='add'>+failover of the virtual IP (the IPaddr RA) to another node â€”</div><div class='add'>+according to constraint location rules â€” where ganesha.nfsd is</div><div class='add'>+still running.</div><div class='add'>+</div><div class='add'>+The ganesha_grace RA monitors the grace-active attribute. When</div><div class='add'>+the grace-active attibute is deleted, the ganesha_grace RA stops,</div><div class='add'>+and will not restart. This triggers pacemaker to invoke the notify</div><div class='add'>+action in the ganesha_grace RAs on the other nodes in the cluster;</div><div class='add'>+which send a DBUS message to their respective ganesha.nfsd.</div><div class='add'>+</div><div class='add'>+(N.B. grace-active is a bit of a misnomer. while the grace-active</div><div class='add'>+attribute exists, everything is normal and healthy. Deleting the</div><div class='add'>+attribute triggers putting the surviving ganesha.nfsds into GRACE.)</div><div class='add'>+</div><div class='add'>+To ensure that the remaining/surviving ganesha.nfsds are put into</div><div class='add'>+ NFS-GRACE before the IPaddr (virtual IP) fails over there is a</div><div class='add'>+short delay (sleep) between deleting the grace-active attribute</div><div class='add'>+and the ganesha-active attribute. To summarize, e.g. in a four</div><div class='add'>+node cluster:</div><div class='add'>+</div><div class='add'>+1. on node 2 ganesha_mon::monitor notices that ganesha.nfsd has died</div><div class='add'>+</div><div class='add'>+2. on node 2 ganesha_mon::monitor deletes its grace-active attribute</div><div class='add'>+</div><div class='add'>+3. on node 2 ganesha_grace::monitor notices that grace-active is gone</div><div class='add'>+and returns OCF_ERR_GENERIC, a.k.a. new error. When pacemaker tries</div><div class='add'>+to (re)start ganesha_grace, its start action will return</div><div class='add'>+OCF_NOT_RUNNING, a.k.a. known error, don't attempt further restarts.</div><div class='add'>+</div><div class='add'>+4. on nodes 1, 3, and 4, ganesha_grace::notify receives a post-stop</div><div class='add'>+notification indicating that node 2 is gone, and sends a DBUS message</div><div class='add'>+to its ganesha.nfsd, putting it into NFS-GRACE.</div><div class='add'>+</div><div class='add'>+5. on node 2 ganesha_mon::monitor waits a short period, then deletes</div><div class='add'>+its ganesha-active attribute. This triggers the IPaddr (virt IP)</div><div class='add'>+failover according to constraint location rules.</div><div class='add'>+</div><div class='head'>diff --git a/doc/get_put_api_using_xattr.txt b/doc/get_put_api_using_xattr.txt<br/>deleted file mode 100644<br/>index 58951f5bf4f..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/doc/get_put_api_using_xattr.txt?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>doc/get_put_api_using_xattr.txt</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,22 +0,0 @@</div><div class='del'>-GlusterFS get/put API interface provided through extended attributes:</div><div class='del'>-</div><div class='del'>-API usage:</div><div class='del'>-  int put(dirpath/filename, data): setfattr -n glusterfs.file.&lt;filename&gt; -v &lt;data&gt; &lt;dirpath&gt;</div><div class='del'>-  void *get(dirpath/filename):  getfattr -n glusterfs.file.&lt;filename&gt; &lt;dirpath&gt;</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-internals:</div><div class='del'>-* unify handling setxattr/getxattr</div><div class='del'>-  - setxattr</div><div class='del'>-     unify's setxattr forwards setxattr call to all the child nodes with XATTR_REPLACE flag, except namespace. setxattr will succeeds only on the child node on which the file already exists. if the setxattr operation fails on all child nodes, it indicates that the file does not already exist on any of the child nodes. unify follows the same rules as it follows for create, but using setxattr call itself with XATTR_CREATE flag. unify sends a setxattr to namespace first, with zero length data. if namespace setxattr succeeds, unify schedules setxattr to one of the child nodes.</div><div class='del'>-</div><div class='del'>-   - getxattr</div><div class='del'>-      unify's getxattr forwards getxattr call to all the child nodes. wait for completion of operation on all the child nodes, and returns success if getxattr succeeded one child node.</div><div class='del'>-</div><div class='del'>-* posix handling setxattr/getxattr</div><div class='del'>-  - setxattr</div><div class='del'>-     posix setxattr does a open with O_CREAT|O_TRUNC on the &lt;path&gt;/&lt;name&gt;, writes value of the setxattr as data into the file and closes the file. when data is null, posix setxattr avoids doing write. file is closed after write.</div><div class='del'>-     </div><div class='del'>-  - getxattr</div><div class='del'>-     posix getxattr does open with O_RDONLY on the &lt;path&gt;/&lt;name&gt;, reads the complete content of the file. file is closed after read.</div><div class='del'>-</div><div class='head'>diff --git a/doc/gluster.8 b/doc/gluster.8<br/>index f1dccf6497d..ba595edca15 100644<br/>--- a/<a href='/cgit/glusterfs.git/tree/doc/gluster.8?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>doc/gluster.8</a><br/>+++ b/<a href='/cgit/glusterfs.git/tree/doc/gluster.8?id=d1d7a6f35c816822fab51c820e25023863c239c1'>doc/gluster.8</a></div><div class='hunk'>@@ -1,133 +1,360 @@</div><div class='del'>-.\"</div><div class='del'>-.\"  Copyright (c) 2006-2009 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='add'>+</div><div class='add'>+.\"  Copyright (c) 2006-2012 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='ctx'> .\"  This file is part of GlusterFS.</div><div class='ctx'> .\"</div><div class='del'>-.\"  GlusterFS is GF_FREE software; you can redistribute it and/or modify</div><div class='del'>-.\"  it under the terms of the GNU Affero General Public License as published</div><div class='del'>-.\"  by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-.\"  or (at your option) any later version.</div><div class='del'>-.\"</div><div class='del'>-.\"  GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-.\"  WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-.\"  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-.\"  Affero General Public License for more details.</div><div class='del'>-.\"</div><div class='del'>-.\"  You should have received a copy of the GNU Affero General Public License</div><div class='del'>-.\"  along with this program.  If not, see</div><div class='del'>-.\"  &lt;http://www.gnu.org/licenses/&gt;.</div><div class='add'>+.\"  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+.\"  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+.\"  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+.\"  cases as published by the Free Software Foundation.</div><div class='ctx'> .\"</div><div class='ctx'> .\"</div><div class='del'>-.TH Gluster 8 "Gluster command line tool" "9 September 2010" "Gluster Inc."</div><div class='add'>+.TH Gluster 8 "Gluster command line utility" "07 March 2011" "Gluster Inc."</div><div class='ctx'> .SH NAME</div><div class='del'>-Gluster \- Gluster command line tool.</div><div class='add'>+gluster - Gluster Console Manager (command line utility)</div><div class='ctx'> .SH SYNOPSIS</div><div class='ctx'> .B gluster</div><div class='ctx'> .PP</div><div class='del'>-To enter gluster prompt </div><div class='add'>+To run the program and display gluster prompt:</div><div class='add'>+.PP</div><div class='add'>+.B gluster [--remote-host=&lt;gluster_node&gt;] [--mode=script] [--xml]</div><div class='ctx'> .PP</div><div class='ctx'> (or)</div><div class='del'>-.pp</div><div class='del'>-</div><div class='del'>-.B gluster</div><div class='del'>-.I [commands] [options]</div><div class='ctx'> .PP</div><div class='del'>-Gluster is a command line tool for dynamic volume management for glusterfs.</div><div class='add'>+To specify a command directly:</div><div class='add'>+.PP</div><div class='add'>+.B gluster</div><div class='add'>+.I  [commands] [options] [--remote-host=&lt;gluster_node&gt;] [--mode=script] [--xml]</div><div class='ctx'> .SH DESCRIPTION</div><div class='del'>-Gluster command line tool is used for dynamic volume management. </div><div class='del'>-The tool must be executed on any of the export servers. The cli gives an easy way to perform cloud operations such as volume create, volume expand, volume shrink, volume migrate, volume rebalance without the necessity of scheduling downtimes. </div><div class='add'>+The Gluster Console Manager is a command line utility for elastic volume management. You can run the gluster command on any export server. The command enables administrators to perform cloud operations, such as creating, expanding, shrinking, rebalancing, and migrating volumes without needing to schedule server downtime.</div><div class='ctx'> .SH COMMANDS</div><div class='del'>-.PP</div><div class='del'>-Mandatory or optional arguments to long options are also mandatory or optional</div><div class='del'>-for any corresponding short options.</div><div class='del'>-.SS "Basic commands"</div><div class='add'>+</div><div class='add'>+.SS "Volume Commands"</div><div class='ctx'> .PP</div><div class='ctx'> .TP</div><div class='ctx'> </div><div class='ctx'> \fB\ volume info [all|&lt;VOLNAME&gt;] \fR</div><div class='del'>-list information of all volumes</div><div class='add'>+Display information about all volumes, or the specified volume.</div><div class='ctx'> .TP</div><div class='del'>-\fB\ volume create &lt;NEW-VOLNAME&gt; [stripe &lt;COUNT&gt;] [replica &lt;COUNT&gt;] [transport &lt;tcp|rdma&gt;] &lt;NEW-BRICK&gt; ... \fR</div><div class='del'>-create a new volume of specified type with mentioned bricks, with specified transport-type [default:tcp]</div><div class='add'>+\fB\ volume list \fR</div><div class='add'>+List all volumes in cluster</div><div class='add'>+.TP</div><div class='add'>+\fB\ volume status [all | &lt;VOLNAME&gt; [nfs|shd|&lt;BRICK&gt;|quotad]] [detail|clients|mem|inode|fd|callpool|tasks|client-list] \fR</div><div class='add'>+Display status of all or specified volume(s)/brick</div><div class='add'>+.TP</div><div class='add'>+\fB\ volume create &lt;NEW-VOLNAME&gt; [stripe &lt;COUNT&gt;] [[replica &lt;COUNT&gt; [arbiter &lt;COUNT&gt;]]|[replica 2 thin-arbiter 1]] [disperse [&lt;COUNT&gt;]] [disperse-data &lt;COUNT&gt;] [redundancy &lt;COUNT&gt;] [transport &lt;tcp|rdma|tcp,rdma&gt;] &lt;NEW-BRICK&gt; ... &lt;TA-BRICK&gt; \fR</div><div class='add'>+Create a new volume of the specified type using the specified bricks and transport type (the default transport type is tcp).</div><div class='add'>+To create a volume with both transports (tcp and rdma), give 'transport tcp,rdma' as an option.</div><div class='ctx'> .TP</div><div class='ctx'> \fB\ volume delete &lt;VOLNAME&gt; \fR</div><div class='del'>-delete volume specified by \fB\&lt;VOLNAME&gt;\fR</div><div class='add'>+Delete the specified volume.</div><div class='ctx'> .TP</div><div class='ctx'> \fB\ volume start &lt;VOLNAME&gt; \fR</div><div class='del'>-start volume specified by \fB\&lt;VOLNAME&gt;\fR</div><div class='add'>+Start the specified volume.</div><div class='ctx'> .TP</div><div class='ctx'> \fB\ volume stop &lt;VOLNAME&gt; [force] \fR</div><div class='del'>-stop volume specified by \fB\&lt;VOLNAME&gt;\fR</div><div class='add'>+Stop the specified volume.</div><div class='add'>+.TP</div><div class='add'>+\fB\ volume set &lt;VOLNAME&gt; &lt;OPTION&gt; &lt;PARAMETER&gt; [&lt;OPTION&gt; &lt;PARAMETER&gt;] ... \fR</div><div class='add'>+Set the volume options.</div><div class='ctx'> .TP</div><div class='del'>-\fB\ volume rename &lt;VOLNAME&gt; &lt;NEW-VOLNAME&gt; \fR</div><div class='del'>-rename volume \fB\&lt;VOLNAME&gt;\fR to \fB\&lt;NEW-VOLNAME&gt;\fR</div><div class='add'>+\fB\ volume get &lt;VOLNAME/all&gt; &lt;OPTION/all&gt; \fR</div><div class='add'>+Get the value of the all options or given option for volume &lt;VOLNAME&gt; or all option. gluster volume get all all is to get all global options</div><div class='ctx'> .TP</div><div class='del'>-\fB\ volume add-brick &lt;VOLNAME&gt; [(replica &lt;COUNT&gt;)|(stripe &lt;COUNT&gt;)] &lt;NEW-BRICK&gt; ... \fR</div><div class='del'>-add brick to volume \fB\&lt;VOLNAME&gt;\fR</div><div class='add'>+\fB\ volume reset &lt;VOLNAME&gt; [option] [force] \fR</div><div class='add'>+Reset all the reconfigured options</div><div class='ctx'> .TP</div><div class='del'>-\fB\ volume remove-brick &lt;VOLNAME&gt; [(replica &lt;COUNT&gt;)|(stripe &lt;COUNT&gt;)] &lt;BRICK&gt; ... \fR</div><div class='del'>-remove brick from volume \fB\&lt;VOLNAME&gt;\fR</div><div class='add'>+\fB\ volume barrier &lt;VOLNAME&gt; {enable|disable} \fR</div><div class='add'>+Barrier/unbarrier file operations on a volume</div><div class='add'>+.TP</div><div class='add'>+\fB\ volume clear-locks &lt;VOLNAME&gt; &lt;path&gt; kind {blocked|granted|all}{inode [range]|entry [basename]|posix [range]} \fR</div><div class='add'>+Clear locks held on path</div><div class='add'>+.TP</div><div class='add'>+\fB\ volume help \fR</div><div class='add'>+Display help for the volume command.</div><div class='add'>+.SS "Brick Commands"</div><div class='add'>+.PP</div><div class='add'>+.TP</div><div class='add'>+\fB\ volume add-brick &lt;VOLNAME&gt; &lt;NEW-BRICK&gt; ... \fR</div><div class='add'>+Add the specified brick to the specified volume.</div><div class='add'>+.TP</div><div class='add'>+\fB\ volume remove-brick &lt;VOLNAME&gt; &lt;BRICK&gt; ... \fR</div><div class='add'>+Remove the specified brick from the specified volume.</div><div class='add'>+.IP</div><div class='add'>+.B Note:</div><div class='add'>+If you remove the brick, the data stored in that brick will not be available. You can migrate data from one brick to another using</div><div class='add'>+.B replace-brick</div><div class='add'>+option.</div><div class='add'>+.TP</div><div class='add'>+\fB\ volume reset-brick &lt;VOLNAME&gt; &lt;SOURCE-BRICK&gt; {{start} | {&lt;NEW-BRICK&gt; commit}} \fR</div><div class='add'>+Brings down or replaces the specified source brick with the new brick.</div><div class='add'>+.TP</div><div class='add'>+\fB\ volume replace-brick &lt;VOLNAME&gt; &lt;SOURCE-BRICK&gt; &lt;NEW-BRICK&gt; commit force \fR</div><div class='add'>+Replace the specified source brick with a new brick.</div><div class='ctx'> .TP</div><div class='ctx'> \fB\ volume rebalance &lt;VOLNAME&gt; start \fR</div><div class='del'>-start rebalance of volume \fB\&lt;VOLNAME&gt;\fR</div><div class='add'>+Start rebalancing the specified volume.</div><div class='ctx'> .TP</div><div class='ctx'> \fB\ volume rebalance &lt;VOLNAME&gt; stop \fR</div><div class='del'>-stop rebalance of volume \fB\&lt;VOLNAME&gt;\fR</div><div class='add'>+Stop rebalancing the specified volume.</div><div class='ctx'> .TP</div><div class='ctx'> \fB\ volume rebalance &lt;VOLNAME&gt; status \fR</div><div class='del'>-rebalance status of volume \fB&lt;VOLNAME&gt;\fR</div><div class='add'>+Display the rebalance status of the specified volume.</div><div class='add'>+.SS "Log Commands"</div><div class='ctx'> .TP</div><div class='del'>-\fB\ volume replace-brick &lt;VOLNAME&gt; (&lt;BRICK&gt; &lt;NEW-BRICK&gt;) start|pause|abort|status \fR</div><div class='del'>-replace-brick operations</div><div class='add'>+\fB\ volume log filename &lt;VOLNAME&gt; [BRICK] &lt;DIRECTORY&gt; \fB</div><div class='add'>+Set the log directory for the corresponding volume/brick.</div><div class='ctx'> .TP</div><div class='del'>-\fB\ volume set-transport &lt;VOLNAME&gt; &lt;TRANSPORT-TYPE&gt; [&lt;TRANSPORT-TYPE&gt;] ... \fR</div><div class='del'>-set transport type for volume \fB\&lt;VOLNAME&gt;\fR</div><div class='add'>+\fB\ volume log locate &lt;VOLNAME&gt; [BRICK] \fB</div><div class='add'>+Locate the log file for corresponding volume/brick.</div><div class='ctx'> .TP</div><div class='del'>-\fB\ volume set-transport &lt;VOLNAME&gt; &lt;TRANSPORT-TYPE&gt; [&lt;TRANSPORT-TYPE&gt;] ... \fR</div><div class='del'>-set transport type for volume \fB\&lt;VOLNAME&gt;\fR</div><div class='del'>-\fR</div><div class='add'>+\fB\ volume log rotate &lt;VOLNAME&gt; [BRICK] \fB</div><div class='add'>+Rotate the log file for corresponding volume/brick.</div><div class='ctx'> .TP</div><div class='del'>-\fB\ volume help \fB</div><div class='del'>-display help for the volume command</div><div class='add'>+\fB\ volume profile &lt;VOLNAME&gt; {start|info [peek|incremental [peek]|cumulative|clear]|stop} [nfs] \fR</div><div class='add'>+Profile operations on the volume. Once started, volume profile &lt;volname&gt; info provides cumulative statistics of the FOPs performed.</div><div class='ctx'> .TP</div><div class='del'>-\fB\ volume log filename &lt;VOLNAME&gt; [BRICK] &lt;PATH&gt; \fB</div><div class='del'>-set the log file for corresponding volume/brick</div><div class='add'>+\fB\ volume top &lt;VOLNAME&gt; {open|read|write|opendir|readdir|clear} [nfs|brick &lt;brick&gt;] [list-cnt &lt;value&gt;] | {read-perf|write-perf} [bs &lt;size&gt; count &lt;count&gt;] [brick &lt;brick&gt;] [list-cnt &lt;value&gt;] \fR</div><div class='add'>+Generates a profile of a volume representing the performance and bottlenecks/hotspots of each brick.</div><div class='ctx'> .TP</div><div class='del'>-\fB\ volume log locate &lt;VOLNAME&gt; [BRICK] \fB</div><div class='del'>-locate the log file for corresponding volume/brick</div><div class='add'>+\fB\ volume statedump &lt;VOLNAME&gt; [[nfs|quotad] [all|mem|iobuf|callpool|priv|fd|inode|history]... | [client &lt;hostname:process-id&gt;]] \fR</div><div class='add'>+Dumps the in memory state of the specified process or the bricks of the volume.</div><div class='ctx'> .TP</div><div class='del'>-\fB\ volume log rotate &lt;VOLNAME&gt; [BRICK] \fB</div><div class='del'>-rotate the log file for corresponding volume/brick</div><div class='add'>+\fB\ volume sync &lt;HOSTNAME&gt; [all|&lt;VOLNAME&gt;] \fR</div><div class='add'>+Sync the volume information from a peer</div><div class='add'>+.SS "Peer Commands"</div><div class='ctx'> .TP</div><div class='ctx'> \fB\ peer probe &lt;HOSTNAME&gt; \fR</div><div class='del'>-probe peer specified by \fB\&lt;HOSTNAME&gt;\fR</div><div class='add'>+Probe the specified peer. In case the &lt;HOSTNAME&gt; given belongs to an already probed peer, the peer probe command will add the hostname to the peer if required.</div><div class='ctx'> .TP</div><div class='ctx'> \fB\ peer detach &lt;HOSTNAME&gt; \fR</div><div class='del'>-detach peer specified by \fB\&lt;HOSTNAME&gt;\fR</div><div class='add'>+Detach the specified peer.</div><div class='ctx'> .TP</div><div class='ctx'> \fB\ peer status \fR</div><div class='del'>-list status of peers</div><div class='add'>+Display the status of peers.</div><div class='add'>+.TP</div><div class='add'>+\fB\ pool list \fR</div><div class='add'>+List all the nodes in the pool (including localhost)</div><div class='ctx'> .TP</div><div class='ctx'> \fB\ peer help \fR</div><div class='del'>-Help command for peer </div><div class='add'>+Display help for the peer command.</div><div class='add'>+.SS "Quota Commands"</div><div class='add'>+.TP</div><div class='add'>+\fB\ volume quota &lt;VOLNAME&gt; enable \fR</div><div class='add'>+Enable quota on the specified volume. This will cause all the directories in the filesystem hierarchy to be accounted and updated thereafter on each operation in the the filesystem. To kick start this accounting, a crawl is done over the hierarchy with an auxiliary client.</div><div class='add'>+.TP</div><div class='add'>+\fB\ volume quota &lt;VOLNAME&gt; disable \fR</div><div class='add'>+Disable quota on the volume. This will disable enforcement and accounting in the filesystem. Any configured limits will be lost.</div><div class='add'>+.TP</div><div class='add'>+\fB\ volume quota &lt;VOLNAME&gt; limit-usage &lt;PATH&gt; &lt;SIZE&gt; [&lt;PERCENT&gt;] \fR</div><div class='add'>+Set a usage  limit on the given path. Any previously set limit is overridden to the new value. The soft limit can optionally be specified (as a percentage of hard limit). If soft limit percentage is not provided the default soft limit value for the volume is used to decide the soft limit.</div><div class='add'>+.TP</div><div class='add'>+\fB\ volume quota &lt;VOLNAME&gt; limit-objects &lt;PATH&gt; &lt;SIZE&gt; [&lt;PERCENT&gt;] \fR</div><div class='add'>+Set an inode limit on the given path. Any previously set limit is overridden to the new value. The soft limit can optionally be specified (as a percentage of hard limit). If soft limit percentage is not provided the default soft limit value for the volume is used to decide the soft limit.</div><div class='add'>+.TP</div><div class='add'>+NOTE: valid units of SIZE are : B, KB, MB, GB, TB, PB. If no unit is specified, the unit defaults to bytes.</div><div class='add'>+.TP</div><div class='add'>+\fB\ volume quota &lt;VOLNAME&gt; remove &lt;PATH&gt; \fR</div><div class='add'>+Remove any usage limit configured on the specified directory. Note that if any limit is configured on the ancestors of this directory (previous directories along the path), they will still be honored and enforced.</div><div class='add'>+.TP</div><div class='add'>+\fB\ volume quota &lt;VOLNAME&gt; remove-objects &lt;PATH&gt; \fR</div><div class='add'>+Remove any inode limit configured on the specified directory. Note that if any limit is configured on the ancestors of this directory (previous directories along the path), they will still be honored and enforced.</div><div class='add'>+.TP</div><div class='add'>+\fB\ volume quota &lt;VOLNAME&gt; list &lt;PATH&gt; \fR</div><div class='add'>+Lists the  usage and limits configured on directory(s). If a path is given only the limit that has been configured on the directory(if any) is displayed along with the directory's usage. If no path is given, usage and limits are displayed for all directories that has limits configured.</div><div class='add'>+.TP</div><div class='add'>+\fB\ volume quota &lt;VOLNAME&gt; list-objects &lt;PATH&gt; \fR</div><div class='add'>+Lists the inode usage and inode limits configured on directory(s). If a path is given only the limit that has been configured on the directory(if any) is displayed along with the directory's inode usage. If no path is given, usage and limits are displayed for all directories that has limits configured.</div><div class='add'>+.TP</div><div class='add'>+\fB\ volume quota &lt;VOLNAME&gt; default-soft-limit &lt;PERCENT&gt; \fR</div><div class='add'>+Set the percentage value for default soft limit for the volume.</div><div class='add'>+.TP</div><div class='add'>+\fB\ volume quota &lt;VOLNAME&gt; soft-timeout &lt;TIME&gt; \fR</div><div class='add'>+Set the soft timeout for the volume. The interval in which limits are retested before the soft limit is breached.</div><div class='add'>+.TP</div><div class='add'>+\fB\ volume quota &lt;VOLNAME&gt; hard-timeout &lt;TIME&gt; \fR</div><div class='add'>+Set the hard timeout for the volume. The interval in which limits are retested after the soft limit is breached.</div><div class='add'>+.TP</div><div class='add'>+\fB\ volume quota &lt;VOLNAME&gt; alert-time &lt;TIME&gt; \fR</div><div class='add'>+Set the frequency in which warning messages need to be logged (in the brick logs) once soft limit is breached.</div><div class='add'>+.TP</div><div class='add'>+\fB\ volume inode-quota &lt;VOLNAME&gt; enable/disable \fR</div><div class='add'>+Enable/disable inode-quota for &lt;VOLNAME&gt;</div><div class='add'>+.TP</div><div class='add'>+\fB\ volume quota help \fR</div><div class='add'>+Display help for volume quota commands</div><div class='add'>+.TP</div><div class='add'>+NOTE: valid units of time and their symbols are : hours(h/hr), minutes(m/min), seconds(s/sec), weeks(w/wk), Days(d/days).</div><div class='add'>+.SS "Geo-replication Commands"</div><div class='add'>+.TP</div><div class='add'>+\fI\ Note\fR: password-less ssh, from the master node (where these commands are executed) to the slave node &lt;SLAVE_HOST&gt;, is a prerequisite for the geo-replication commands.</div><div class='add'>+.TP</div><div class='add'>+\fB\ system:: execute gsec_create\fR</div><div class='add'>+Generates pem keys which are required for push-pem</div><div class='add'>+.TP</div><div class='add'>+\fB\ volume geo-replication &lt;MASTER_VOL&gt; &lt;SLAVE_HOST&gt;::&lt;SLAVE_VOL&gt; create [[ssh-port n][[no-verify]|[push-pem]]] [force]\fR</div><div class='add'>+Create a new geo-replication session from &lt;MASTER_VOL&gt; to &lt;SLAVE_HOST&gt; host machine having &lt;SLAVE_VOL&gt;.</div><div class='add'>+Use ssh-port n if custom SSH port is configured in slave nodes.</div><div class='add'>+Use no-verify if the rsa-keys of nodes in master volume is distributed to slave nodes through an external agent.</div><div class='add'>+Use push-pem to push the keys automatically.</div><div class='add'>+.TP</div><div class='add'>+\fB\ volume geo-replication &lt;MASTER_VOL&gt; &lt;SLAVE_HOST&gt;::&lt;SLAVE_VOL&gt; {start|stop} [force] \fR</div><div class='add'>+Start/stop the geo-replication session from &lt;MASTER_VOL&gt; to &lt;SLAVE_HOST&gt; host machine having &lt;SLAVE_VOL&gt;.</div><div class='add'>+.TP</div><div class='add'>+\fB\ volume geo-replication [&lt;MASTER_VOL&gt; [&lt;SLAVE_HOST&gt;::&lt;SLAVE_VOL&gt;]] status [detail] \fR</div><div class='add'>+Query status of the geo-replication session from &lt;MASTER_VOL&gt; to &lt;SLAVE_HOST&gt; host machine having &lt;SLAVE_VOL&gt;.</div><div class='add'>+.TP</div><div class='add'>+\fB\ volume geo-replication &lt;MASTER_VOL&gt; &lt;SLAVE_HOST&gt;::&lt;SLAVE_VOL&gt; {pause|resume} [force] \fR</div><div class='add'>+Pause/resume the geo-replication session from &lt;MASTER_VOL&gt; to &lt;SLAVE_HOST&gt; host machine having &lt;SLAVE_VOL&gt;.</div><div class='add'>+.TP</div><div class='add'>+\fB\ volume geo-replication &lt;MASTER_VOL&gt; &lt;SLAVE_HOST&gt;::&lt;SLAVE_VOL&gt; delete [reset-sync-time]\fR</div><div class='add'>+Delete the geo-replication session from &lt;MASTER_VOL&gt; to &lt;SLAVE_HOST&gt; host machine having &lt;SLAVE_VOL&gt;.</div><div class='add'>+Optionally you can also reset the sync time in case you need to resync the entire volume on session recreate.</div><div class='add'>+.TP</div><div class='add'>+\fB\ volume geo-replication &lt;MASTER_VOL&gt; &lt;SLAVE_HOST&gt;::&lt;SLAVE_VOL&gt; config [[!]&lt;options&gt; [&lt;value&gt;]] \fR</div><div class='add'>+View (when no option provided) or set configuration for this geo-replication session.</div><div class='add'>+Use "!&lt;OPTION&gt;" to reset option &lt;OPTION&gt; to default value.</div><div class='add'>+.SS "Bitrot Commands"</div><div class='add'>+.TP</div><div class='add'>+\fB\ volume bitrot &lt;VOLNAME&gt; {enable|disable} \fR</div><div class='add'>+Enable/disable bitrot for volume &lt;VOLNAME&gt;</div><div class='add'>+.TP</div><div class='add'>+\fB\ volume bitrot &lt;VOLNAME&gt; signing-time &lt;time-in-secs&gt; \fR</div><div class='add'>+Waiting time for an object after last fd is closed to start signing process.</div><div class='add'>+.TP</div><div class='add'>+\fB\ volume bitrot &lt;VOLNAME&gt; signer-threads &lt;count&gt; \fR</div><div class='add'>+Number of signing process threads. Usually set to number of available cores.</div><div class='add'>+.TP</div><div class='add'>+\fB\ volume bitrot &lt;VOLNAME&gt; scrub-throttle {lazy|normal|aggressive} \fR</div><div class='add'>+Scrub-throttle value is a measure of how fast or slow the scrubber scrubs the filesystem for volume &lt;VOLNAME&gt;</div><div class='add'>+.TP</div><div class='add'>+\fB\ volume bitrot &lt;VOLNAME&gt; scrub-frequency {hourly|daily|weekly|biweekly|monthly} \fR</div><div class='add'>+Scrub frequency for volume &lt;VOLNAME&gt;</div><div class='add'>+.TP</div><div class='add'>+\fB\ volume bitrot &lt;VOLNAME&gt; scrub {pause|resume|status|ondemand} \fR</div><div class='add'>+Pause/Resume scrub. Upon resume, scrubber continues where it left off. status option shows the statistics of scrubber. ondemand option starts the scrubbing immediately if the scrubber is not paused or already running.</div><div class='add'>+.TP</div><div class='add'>+\fB\ volume bitrot help \fR</div><div class='add'>+Display help for volume bitrot commands</div><div class='add'>+.TP</div><div class='add'>+.SS "Snapshot Commands"</div><div class='add'>+.TP</div><div class='add'>+\fB\ snapshot create &lt;snapname&gt; &lt;volname&gt; [no-timestamp] [description &lt;description&gt;] [force] \fR</div><div class='add'>+Creates a snapshot of a GlusterFS volume. User can provide a snap-name and a description to identify the snap. Snap will be created by appending timestamp in GMT. User can override this behaviour using "no-timestamp" option. The description cannot be more than 1024 characters. To be able to take a snapshot, volume should be present and it should be in started state.</div><div class='add'>+.TP</div><div class='add'>+\fB\ snapshot restore &lt;snapname&gt; \fR</div><div class='add'>+Restores an already taken snapshot of a GlusterFS volume. Snapshot restore is an offline activity therefore if the volume is online (in started state) then the restore operation will fail. Once the snapshot is restored it will not be available in the list of snapshots.</div><div class='add'>+.TP</div><div class='add'>+\fB\ snapshot clone &lt;clonename&gt; &lt;snapname&gt; \fR</div><div class='add'>+Create a clone of a snapshot volume, the resulting volume will be GlusterFS volume. User can provide a clone-name. To be able to take a clone, snapshot should be present and it should be in activated state.</div><div class='add'>+.TP</div><div class='add'>+\fB\ snapshot delete ( all | &lt;snapname&gt; | volume &lt;volname&gt; ) \fR</div><div class='add'>+If snapname is specified then mentioned snapshot is deleted. If volname is specified then all snapshots belonging to that particular volume is deleted. If keyword *all* is used then all snapshots belonging to the system is deleted.</div><div class='add'>+.TP</div><div class='add'>+\fB\ snapshot list [volname] \fR</div><div class='add'>+Lists all snapshots taken. If volname is provided, then only the snapshots belonging to that particular volume is listed.</div><div class='add'>+.TP</div><div class='add'>+\fB\ snapshot info [snapname | (volume &lt;volname&gt;)] \fR</div><div class='add'>+This command gives information such as snapshot name, snapshot UUID, time at which snapshot was created, and it lists down the snap-volume-name, number of snapshots already taken and number of snapshots still available for that particular volume, and the state of the snapshot. If snapname is specified then info of the  mentioned  snapshot is  displayed.  If volname is specified then info of all snapshots belonging to that volume is displayed.  If  both  snapname and  volname  is  not specified then info of all the snapshots present in the system are displayed.</div><div class='add'>+.TP</div><div class='add'>+\fB\ snapshot status [snapname | (volume &lt;volname&gt;)] \fR</div><div class='add'>+This command gives status of the snapshot. The details included are snapshot brick path, volume group(LVM details), status of the snapshot bricks, PID of the bricks, data percentage filled for that particular volume group to which the snapshots belong to, and total size of the logical volume.</div><div class='add'>+</div><div class='add'>+If snapname is specified then status of the mentioned snapshot is displayed. If volname is specified then status of all snapshots belonging to that volume is displayed. If both snapname and volname is not specified then status of all the snapshots present in the system are displayed.</div><div class='add'>+.TP</div><div class='add'>+\fB\ snapshot config [volname] ([snap-max-hard-limit &lt;count&gt;] [snap-max-soft-limit &lt;percent&gt;]) | ([auto-delete &lt;enable|disable&gt;]) | ([activate-on-create &lt;enable|disable&gt;])</div><div class='add'>+Displays and sets the snapshot config values.</div><div class='add'>+</div><div class='add'>+snapshot config without any keywords displays the snapshot config values of all volumes in the system. If volname is provided, then the snapshot config values of that volume is displayed.</div><div class='add'>+</div><div class='add'>+Snapshot config command along with keywords can be used to change the existing config values. If volname is provided then config value of that volume is changed, else it will set/change the system limit.</div><div class='add'>+</div><div class='add'>+snap-max-soft-limit and auto-delete are global options, that will be inherited by all volumes in the system and cannot be set to individual volumes.</div><div class='add'>+</div><div class='add'>+snap-max-hard-limit can be set globally, as well as per volume. The lowest limit between the global system limit and the volume specific limit, becomes the</div><div class='add'>+"Effective snap-max-hard-limit" for a volume.</div><div class='add'>+</div><div class='add'>+snap-max-soft-limit is a percentage value, which is applied on the "Effective snap-max-hard-limit" to get the "Effective snap-max-soft-limit".</div><div class='add'>+</div><div class='add'>+When auto-delete feature is enabled, then upon reaching the "Effective snap-max-soft-limit", with every successful snapshot creation, the oldest snapshot will be deleted.</div><div class='add'>+</div><div class='add'>+When auto-delete feature is disabled, then upon reaching the "Effective snap-max-soft-limit", the user gets a warning with every successful snapshot creation.</div><div class='add'>+</div><div class='add'>+When auto-delete feature is disabled, then upon reaching the "Effective snap-max-hard-limit", further  snapshot  creations  will not be allowed.</div><div class='add'>+</div><div class='add'>+activate-on-create is disabled by default. If you enable activate-on-create, then further snapshot will be activated during the time of snapshot creation.</div><div class='add'>+.TP</div><div class='add'>+\fB\ snapshot activate &lt;snapname&gt; \fR</div><div class='add'>+Activates the mentioned snapshot.</div><div class='add'>+</div><div class='add'>+Note : By default the snapshot is activated during snapshot creation.</div><div class='add'>+.TP</div><div class='add'>+\fB\ snapshot deactivate &lt;snapname&gt; \fR</div><div class='add'>+Deactivates the mentioned snapshot.</div><div class='add'>+.TP</div><div class='add'>+\fB\ snapshot help \fR</div><div class='add'>+Display help for the snapshot commands.</div><div class='add'>+.SS "Self-heal Commands"</div><div class='add'>+.TP</div><div class='add'>+\fB\ volume heal &lt;VOLNAME&gt;\fR</div><div class='add'>+Triggers index self heal for the files that need healing.</div><div class='add'>+</div><div class='add'>+.TP</div><div class='add'>+\fB\ volume heal  &lt;VOLNAME&gt; [enable | disable]\fR</div><div class='add'>+Enable/disable self-heal-daemon for volume &lt;VOLNAME&gt;.</div><div class='add'>+</div><div class='add'>+.TP</div><div class='add'>+\fB\ volume heal &lt;VOLNAME&gt; full\fR</div><div class='add'>+Triggers self heal on all the files.</div><div class='add'>+</div><div class='add'>+.TP</div><div class='add'>+\fB\ volume heal &lt;VOLNAME&gt; info \fR</div><div class='add'>+Lists the files that need healing.</div><div class='add'>+</div><div class='add'>+.TP</div><div class='add'>+\fB\ volume heal &lt;VOLNAME&gt; info split-brain \fR</div><div class='add'>+Lists the files which are in split-brain state.</div><div class='add'>+</div><div class='add'>+.TP</div><div class='add'>+\fB\ volume heal &lt;VOLNAME&gt; statistics \fR</div><div class='add'>+Lists the crawl statistics.</div><div class='add'>+</div><div class='add'>+.TP</div><div class='add'>+\fB\ volume heal &lt;VOLNAME&gt; statistics heal-count \fR</div><div class='add'>+Displays the count of files to be healed.</div><div class='add'>+</div><div class='add'>+.TP</div><div class='add'>+\fB\ volume heal &lt;VOLNAME&gt; statistics heal-count replica &lt;HOSTNAME:BRICKNAME&gt; \fR</div><div class='add'>+Displays the number of files to be healed from a particular replica subvolume to which the brick &lt;HOSTNAME:BRICKNAME&gt; belongs.</div><div class='add'>+</div><div class='add'>+.TP</div><div class='add'>+\fB\ volume heal &lt;VOLNAME&gt; split-brain bigger-file &lt;FILE&gt; \fR</div><div class='add'>+Performs healing of &lt;FILE&gt; which is in split-brain by choosing the bigger file in the replica as source.</div><div class='add'>+</div><div class='add'>+.TP</div><div class='add'>+\fB\ volume heal &lt;VOLNAME&gt; split-brain source-brick &lt;HOSTNAME:BRICKNAME&gt; \fR</div><div class='add'>+Selects &lt;HOSTNAME:BRICKNAME&gt; as the source for all the files that are in split-brain in that replica and heals them.</div><div class='add'>+</div><div class='add'>+.TP</div><div class='add'>+\fB\ volume heal &lt;VOLNAME&gt; split-brain source-brick &lt;HOSTNAME:BRICKNAME&gt; &lt;FILE&gt; \fR</div><div class='add'>+Selects the split-brained &lt;FILE&gt; present in &lt;HOSTNAME:BRICKNAME&gt; as source and completes heal.</div><div class='add'>+.SS "Other Commands"</div><div class='add'>+.TP</div><div class='add'>+\fB\ get-state [&lt;daemon&gt;] [[odir &lt;/path/to/output/dir/&gt;] [file &lt;filename&gt;]] [detail|volumeoptions] \fR</div><div class='add'>+Get local state representation of mentioned daemon and store data in provided path information</div><div class='ctx'> .TP</div><div class='ctx'> \fB\ help \fR</div><div class='del'>-display command options</div><div class='add'>+Display the command options.</div><div class='ctx'> .TP</div><div class='ctx'> \fB\ quit \fR</div><div class='del'>-quit</div><div class='del'>-.TP</div><div class='del'>-.PP</div><div class='del'>-.SH FILES</div><div class='del'>-/etc/glusterd/*</div><div class='add'>+Exit the gluster command line interface.</div><div class='ctx'> </div><div class='add'>+.SH FILES</div><div class='add'>+/var/lib/glusterd/*</div><div class='ctx'> .SH SEE ALSO</div><div class='ctx'> .nf</div><div class='del'>-\fBfusermount\fR(1), \fBmount.glusterfs\fR(8), \fBglusterfs-volgen\fR(8)</div><div class='del'>-\fBglusterfs\fR(8), \fBglusterd\fR(8)</div><div class='add'>+\fBfusermount\fR(1), \fBmount.glusterfs\fR(8), \fBglusterfs\fR(8), \fBglusterd\fR(8)</div><div class='ctx'> \fR</div><div class='ctx'> .fi</div><div class='ctx'> .SH COPYRIGHT</div><div class='ctx'> .nf</div><div class='del'>-Copyright(c) 2006-2010  Gluster, Inc.  &lt;http://www.gluster.com&gt;</div><div class='del'>-</div><div class='del'>-.fi</div><div class='add'>+Copyright(c) 2006-2011  Gluster, Inc.  &lt;http://www.gluster.com&gt;</div><div class='head'>diff --git a/doc/glusterd.8 b/doc/glusterd.8<br/>index 5a78c897a6b..e3768c78761 100644<br/>--- a/<a href='/cgit/glusterfs.git/tree/doc/glusterd.8?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>doc/glusterd.8</a><br/>+++ b/<a href='/cgit/glusterfs.git/tree/doc/glusterd.8?id=d1d7a6f35c816822fab51c820e25023863c239c1'>doc/glusterd.8</a></div><div class='hunk'>@@ -1,85 +1,67 @@</div><div class='ctx'> .\"</div><div class='del'>-.\"  Copyright (c) 2006-2009 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='add'>+.\"  Copyright (c) 2006-2012 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='ctx'> .\"  This file is part of GlusterFS.</div><div class='ctx'> .\"</div><div class='del'>-.\"  GlusterFS is GF_FREE software; you can redistribute it and/or modify</div><div class='del'>-.\"  it under the terms of the GNU Affero General Public License as published</div><div class='del'>-.\"  by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-.\"  or (at your option) any later version.</div><div class='del'>-.\"</div><div class='del'>-.\"  GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-.\"  WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-.\"  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-.\"  Affero General Public License for more details.</div><div class='del'>-.\"</div><div class='del'>-.\"  You should have received a copy of the GNU Affero General Public License</div><div class='del'>-.\"  along with this program.  If not, see</div><div class='del'>-.\"  &lt;http://www.gnu.org/licenses/&gt;.</div><div class='add'>+.\"  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+.\"  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+.\"  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+.\"  cases as published by the Free Software Foundation.</div><div class='ctx'> .\"</div><div class='ctx'> .\"</div><div class='ctx'> </div><div class='del'>-.TH Glusterd 8 "Gluster dynamic volume management Daemon" "9 September 2010" "Gluster Inc." </div><div class='add'>+.TH Glusterd 8 "Gluster elastic volume management daemon" "07 March 2011" "Gluster Inc."</div><div class='ctx'> .SH NAME</div><div class='del'>-Glusterd \- Gluster dynamic volume management Daemon.</div><div class='add'>+Glusterd \- Gluster elastic volume management daemon</div><div class='ctx'> .SH SYNOPSIS</div><div class='ctx'> .B glusterd</div><div class='del'>-.PP</div><div class='del'>-(or)</div><div class='del'>-.B glusterd</div><div class='ctx'> .I [OPTION...]</div><div class='del'>-.PP</div><div class='del'>-Glusterd is a daemon for dynamic volume management for glusterfs.</div><div class='ctx'> .SH DESCRIPTION</div><div class='del'>-Gluster daemon is used for dynamic volume management.</div><div class='del'>-The daemon must be executed on all of the export servers.</div><div class='add'>+The glusterd daemon is used for elastic volume management. The daemon must be run on all export servers.</div><div class='ctx'> </div><div class='ctx'> .SH OPTIONS</div><div class='del'>-.PP</div><div class='del'>-Mandatory or optional arguments to long options are also mandatory or optional</div><div class='del'>-for any corresponding short options.</div><div class='add'>+</div><div class='ctx'> .SS "Basic options"</div><div class='ctx'> .PP</div><div class='ctx'> .TP</div><div class='ctx'> </div><div class='del'>-\fB\-l, \fB\-\-log\-file=LOGFILE\fR</div><div class='del'>-File to use for logging [default:/usr/local/var/log/glusterfs/glusterfs.log]</div><div class='add'>+\fB\-l &lt;LOGFILE&gt;, \fB\-\-log\-file=&lt;LOGFILE&gt;\fR</div><div class='add'>+File to use for logging.</div><div class='add'>+.TP</div><div class='add'>+\fB\-L &lt;LOGLEVEL&gt;, \fB\-\-log\-level=&lt;LOGLEVEL&gt;\fR</div><div class='add'>+Logging severity.  Valid options are TRACE, DEBUG, INFO, WARNING, ERROR and CRITICAL (the default is INFO).</div><div class='ctx'> .TP</div><div class='del'>-\fB\-L, \fB\-\-log\-level=LOGLEVEL\fR</div><div class='del'>-Logging severity.  Valid options are TRACE, DEBUG, NORMAL, WARNING,</div><div class='del'>-ERROR and CRITICAL [default: NORMAL]</div><div class='add'>+\fB\-\-localtime\-logging\fR</div><div class='add'>+Enable localtime log timestamps.</div><div class='ctx'> .TP</div><div class='ctx'> \fB\-\-debug\fR</div><div class='del'>-Run in debug mode.  This option sets \fB\-\-no\-daemon\fR, \fB\-\-log\-level\fR to DEBUG</div><div class='del'>-and \fB\-\-log\-file\fR to console</div><div class='add'>+Run the program in debug mode. This option sets \fB\-\-no\-daemon\fR, \fB\-\-log\-level\fR to DEBUG</div><div class='add'>+and \fB\-\-log\-file\fR to console.</div><div class='ctx'> .TP</div><div class='ctx'> \fB\-N, \fB\-\-no\-daemon\fR</div><div class='del'>-Run in foreground</div><div class='del'>-.TP</div><div class='add'>+Run the program in the foreground.</div><div class='ctx'> </div><div class='del'>-.TP</div><div class='del'>-.SS  Miscellaneous Options:</div><div class='add'>+.SS "Miscellaneous Options:"</div><div class='ctx'> .TP</div><div class='ctx'> \fB\-?, \fB\-\-help\fR</div><div class='del'>-Give this help list</div><div class='add'>+Display this help.</div><div class='ctx'> .TP</div><div class='ctx'> \fB\-\-usage\fR</div><div class='del'>-Give a short usage message</div><div class='add'>+Display a short usage message.</div><div class='ctx'> .TP</div><div class='ctx'> \fB\-V, \fB\-\-version\fR</div><div class='del'>-Print program version</div><div class='add'>+Print the program version.</div><div class='ctx'> </div><div class='ctx'> .PP</div><div class='ctx'> .SH FILES</div><div class='del'>-/etc/glusterd/*</div><div class='add'>+/var/lib/glusterd/*</div><div class='ctx'> </div><div class='ctx'> .SH SEE ALSO</div><div class='ctx'> .nf</div><div class='del'>-\fBfusermount\fR(1), \fBmount.glusterfs\fR(8), \fBglusterfs-volgen\fR(8)</div><div class='del'>-\fBglusterfs\fR(8), \fBgluster\fR(8)</div><div class='add'>+\fBfusermount\fR(1), \fBmount.glusterfs\fR(8), \fBglusterfs\fR(8), \fBgluster\fR(8)</div><div class='ctx'> \fR</div><div class='ctx'> .fi</div><div class='ctx'> .SH COPYRIGHT</div><div class='ctx'> .nf</div><div class='del'>-Copyright(c) 2006-2010  Gluster, Inc.  &lt;http://www.gluster.com&gt;</div><div class='add'>+Copyright(c) 2006-2011  Gluster, Inc.  &lt;http://www.gluster.com&gt;</div><div class='ctx'> \fR</div><div class='ctx'> .fi</div><div class='head'>diff --git a/doc/glusterd.vol b/doc/glusterd.vol<br/>deleted file mode 100644<br/>index 48cad9579a2..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/doc/glusterd.vol?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>doc/glusterd.vol</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,9 +0,0 @@</div><div class='del'>-volume management</div><div class='del'>-    type mgmt/glusterd</div><div class='del'>-    option working-directory /etc/glusterd</div><div class='del'>-    option transport-type socket,rdma</div><div class='del'>-    option transport.socket.listen-port 6969</div><div class='del'>-    option transport.rdma.listen-port 6968</div><div class='del'>-    # option listen-port 6969</div><div class='del'>-end-volume</div><div class='del'>-</div><div class='head'>diff --git a/doc/glusterfs-volgen.8 b/doc/glusterfs-volgen.8<br/>deleted file mode 100644<br/>index c1881a28ac1..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/doc/glusterfs-volgen.8?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>doc/glusterfs-volgen.8</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,82 +0,0 @@</div><div class='del'>-.\"  Copyright (c) 2009-2010 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='del'>-.\"  This file is part of GlusterFS.</div><div class='del'>-.\"</div><div class='del'>-.\"  GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-.\"  it under the terms of the GNU General Public License as published</div><div class='del'>-.\"  by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-.\"  or (at your option) any later version.</div><div class='del'>-.\"</div><div class='del'>-.\"  GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-.\"  WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-.\"  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-.\"  General Public License for more details.</div><div class='del'>-.\"</div><div class='del'>-.\"  You should have received a copy of the GNU General Public License</div><div class='del'>-.\"  long with this program.  If not, see</div><div class='del'>-.\"  &lt;http://www.gnu.org/licenses/&gt;.</div><div class='del'>-.\"</div><div class='del'>-.\"</div><div class='del'>-.\"</div><div class='del'>-.TH GlusterFS 8 "Cluster Filesystem" "19 March 2010" "Gluster Inc."</div><div class='del'>-.SH NAME</div><div class='del'>-glusterfs-volgen  \- Tool to generate GlusterFS volume files</div><div class='del'>-.SH SYNOPSIS</div><div class='del'>-.B glusterfs-volgen --name &lt;volumename&gt;</div><div class='del'>-.I [options] &lt;server1:/export/directory&gt; &lt;server1:/export/directory&gt; ...</div><div class='del'>-.PP</div><div class='del'>-.SH DESCRIPTION</div><div class='del'>-glusterfs-volgen tool is used to generate glusterfs volume files as per the</div><div class='del'>-options given.</div><div class='del'>-</div><div class='del'>-GlusterFS volume files are very important component of gluster filesystem,</div><div class='del'>-using which \fBglusterfs\fR(8) will behave as a client component or a server</div><div class='del'>-component. Each glusterfs modules (in technical terms, a translator) is defined</div><div class='del'>-in this volume files in certain order to achieve the required behavior from</div><div class='del'>-filesystem.</div><div class='del'>-</div><div class='del'>-glusterfs-volgen tool abstracts the complexities of volumefile logic into a</div><div class='del'>-simple command line tool, which based on user's requirement (by options</div><div class='del'>-provided) generates the corresponding error-free volume file.</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-.SH OPTIONS</div><div class='del'>-.PP</div><div class='del'>-</div><div class='del'>-\fB\-n \-\-name\fR=VOLUME-NAME</div><div class='del'>-This is a mandatory argument required for glusterfs-volgen.</div><div class='del'>-.TP</div><div class='del'>-\fB\-r \-\-raid\fR=[0|1]</div><div class='del'>-Supported options are 0 (stripe), 1 (mirror). If this option is not used,</div><div class='del'>-distribute is used without replicate or stripe.</div><div class='del'>-.TP</div><div class='del'>-\fB\-t \-\-transport\fR=[tcp|ib-verbs|tcp,ib-verbs]</div><div class='del'>-Supported types are 'tcp' and 'ib-verbs'. This option can take both types</div><div class='del'>-together like 'tcp,ib-verbs'. [default is 'tcp']</div><div class='del'>-.TP</div><div class='del'>-\fB\-p \-\-port\fR=PORT</div><div class='del'>-The port number to use in volume files.</div><div class='del'>-[default is 6996 for tcp, 6997 for ib-verbs]</div><div class='del'>-.TP</div><div class='del'>-\fB\-a \-\-auth\fR=AUTH_PARAMS</div><div class='del'>-Authentication parameters (comma seperated) to use in server volume.</div><div class='del'>-[default is '*', ie allow everyone]</div><div class='del'>-.TP</div><div class='del'>-\fB\-c \-\-conf-dir\fR=CONF_DIR</div><div class='del'>-Directory where the output volume files are generated. [default is</div><div class='del'>-${prefix}/etc/glusterfs]</div><div class='del'>-</div><div class='del'>-.PP</div><div class='del'>-.SH FILES</div><div class='del'>-</div><div class='del'>-${CONF_DIR}/*.vol</div><div class='del'>-</div><div class='del'>-.SH SEE ALSO</div><div class='del'>-.nf</div><div class='del'>-\fB\fBmount.glusterfs\fR(8)</div><div class='del'>-\fR</div><div class='del'>-.fi</div><div class='del'>-.SH COPYRIGHT</div><div class='del'>-.nf</div><div class='del'>-Copyright(c) 2009-2010  Gluster, Inc.  &lt;http://www.gluster.com&gt;</div><div class='del'>-\fR</div><div class='del'>-.fi</div><div class='head'>diff --git a/doc/glusterfs.8 b/doc/glusterfs.8<br/>index 93777541d68..3d359ea85e4 100644<br/>--- a/<a href='/cgit/glusterfs.git/tree/doc/glusterfs.8?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>doc/glusterfs.8</a><br/>+++ b/<a href='/cgit/glusterfs.git/tree/doc/glusterfs.8?id=d1d7a6f35c816822fab51c820e25023863c239c1'>doc/glusterfs.8</a></div><div class='hunk'>@@ -1,137 +1,181 @@</div><div class='del'>-.\"  Copyright (c) 2008-2010 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='add'>+.\"  Copyright (c) 2008-2012 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='ctx'> .\"  This file is part of GlusterFS.</div><div class='ctx'> .\"</div><div class='del'>-.\"  GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-.\"  it under the terms of the GNU General Public License as published</div><div class='del'>-.\"  by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-.\"  or (at your option) any later version.</div><div class='add'>+.\"  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+.\"  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+.\"  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+.\"  cases as published by the Free Software Foundation.</div><div class='ctx'> .\"</div><div class='del'>-.\"  GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-.\"  WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-.\"  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-.\"  General Public License for more details.</div><div class='ctx'> .\"</div><div class='del'>-.\"  You should have received a copy of the GNU General Public License</div><div class='del'>-.\"  long with this program.  If not, see</div><div class='del'>-.\"  &lt;http://www.gnu.org/licenses/&gt;.</div><div class='ctx'> .\"</div><div class='del'>-.\"</div><div class='del'>-.\"</div><div class='del'>-.TH GlusterFS 8 "Cluster Filesystem" "19 March 2010" "Gluster Inc."</div><div class='add'>+.TH GlusterFS 8 "Clustered File System" "07 March 2011" "Gluster Inc."</div><div class='ctx'> .SH NAME</div><div class='del'>-GlusterFS \- Clustered Filesystem.</div><div class='add'>+GlusterFS \- clustered file system</div><div class='ctx'> .SH SYNOPSIS</div><div class='ctx'> .B glusterfs</div><div class='ctx'> .I [options] [mountpoint]</div><div class='ctx'> .PP</div><div class='ctx'> .SH DESCRIPTION</div><div class='del'>-GlusterFS is a clustered file-system capable of scaling to several peta-bytes.</div><div class='del'>-It aggregates various storage bricks over Infiniband RDMA or TCP/IP</div><div class='add'>+GlusterFS is a clustered file system, capable of scaling to several peta-bytes.</div><div class='add'>+It aggregates various storage bricks over Infiniband RDMA or TCP/IP and</div><div class='ctx'> interconnect into one large parallel network file system. Storage bricks can</div><div class='del'>-be made of any commodity hardware such as x86-64 server with SATA-II RAID and</div><div class='add'>+be made of any commodity hardware, such as x86-64 server with SATA-II RAID and</div><div class='ctx'> Infiniband HBA.</div><div class='ctx'> </div><div class='del'>-GlusterFS is fully POSIX compliant FileSystem. On client side, it has dependency</div><div class='del'>-on FUSE package, on server side, it works seemlessly on different OSes.</div><div class='del'>-(Currently supported on GNU/Linux, Solaris).</div><div class='add'>+GlusterFS is fully POSIX compliant file system. On client side, it has dependency</div><div class='add'>+on FUSE package, on server side, it works seemlessly on different operating systems.</div><div class='add'>+Currently supported on GNU/Linux and Solaris.</div><div class='ctx'> </div><div class='ctx'> .SH OPTIONS</div><div class='del'>-.PP</div><div class='del'>-Mandatory or optional arguments to long options are also mandatory or optional</div><div class='del'>-for any corresponding short options.</div><div class='add'>+</div><div class='ctx'> .SS "Basic options"</div><div class='ctx'> .PP</div><div class='ctx'> .TP</div><div class='del'>-</div><div class='ctx'> \fB\-f, \fB\-\-volfile=VOLUME-FILE\fR</div><div class='del'>-File to use as VOLUME-FILE [default:/etc/glusterfs/glusterfs.vol]</div><div class='add'>+File to use as VOLUME-FILE.</div><div class='ctx'> .TP</div><div class='ctx'> \fB\-l, \fB\-\-log\-file=LOGFILE\fR</div><div class='del'>-File to use for logging [default:/var/log/glusterfs/glusterfs.log]</div><div class='add'>+File to use for logging (the default is &lt;INSTALL-DIR&gt;/var/log/glusterfs/&lt;MOUNT-POINT&gt;.log).</div><div class='ctx'> .TP</div><div class='ctx'> \fB\-L, \fB\-\-log\-level=LOGLEVEL\fR</div><div class='del'>-Logging severity.  Valid options are TRACE, DEBUG, NORMAL, WARNING, ERROR and</div><div class='del'>-CRITICAL [default: WARNING]</div><div class='add'>+Logging severity.  Valid options are TRACE, DEBUG, INFO, WARNING, ERROR and CRITICAL (the default is INFO).</div><div class='ctx'> .TP</div><div class='ctx'> \fB\-s, \fB\-\-volfile\-server=SERVER\fR</div><div class='del'>-Server to get the volume from.  This option overrides \fB\-\-volfile option</div><div class='add'>+Server to get the volume from.  This option overrides \fB\-\-volfile \fR option.</div><div class='ctx'> .TP</div><div class='del'>-\fB\-\-log\-server=LOG\-SERVER\fR</div><div class='del'>-Server to use as the central log server.</div><div class='add'>+\fB\-\-volfile\-max\-fetch\-attempts=MAX\-ATTEMPTS\fR</div><div class='add'>+Maximum number of connect attempts to server. This option should be provided with</div><div class='add'>+\fB\-\-volfile\-server\fR option (the default is 1).</div><div class='ctx'> </div><div class='ctx'> .SS "Advanced options"</div><div class='ctx'> .PP</div><div class='ctx'> .TP</div><div class='del'>-</div><div class='add'>+\fB\-\-acl\fR</div><div class='add'>+Mount the filesystem with POSIX ACL support.</div><div class='add'>+.TP</div><div class='add'>+\fB\-\-localtime\-logging\fR</div><div class='add'>+Enable localtime log timestamps.</div><div class='add'>+.TP</div><div class='ctx'> \fB\-\-debug\fR</div><div class='del'>-Run in debug mode.  This option sets \fB\-\-no\-daemon\fR, \fB\-\-log\-level\fR to DEBUG</div><div class='del'>-and \fB\-\-log\-file\fR to console</div><div class='add'>+Run in debug mode.  This option sets \fB\-\-no\-daemon\fR, \fB\-\-log\-level\fR to DEBUG,</div><div class='add'>+and \fB\-\-log\-file\fR to console.</div><div class='add'>+.TP</div><div class='add'>+\fB\-\-enable\-ino32=BOOL\fR</div><div class='add'>+Use 32-bit inodes when mounting to workaround application that doesn't support 64-bit inodes.</div><div class='add'>+.TP</div><div class='add'>+\fB\-\-fopen\-keep\-cache[=BOOL]\fR</div><div class='add'>+Do not purge the cache on file open (default: false).</div><div class='add'>+.TP</div><div class='add'>+\fB\-\-mac\-compat=BOOL\fR</div><div class='add'>+Provide stubs for attributes needed for seamless operation on Macs (the default is off).</div><div class='ctx'> .TP</div><div class='ctx'> \fB\-N, \fB\-\-no\-daemon\fR</div><div class='del'>-Run in foreground</div><div class='add'>+Run in the foreground.</div><div class='add'>+.TP</div><div class='add'>+\fB\-p, \fB\-\-pid\-file=PIDFILE\fR</div><div class='add'>+File to use as PID file.</div><div class='ctx'> .TP</div><div class='ctx'> \fB\-\-read\-only\fR</div><div class='del'>-Makes the filesystem read-only</div><div class='add'>+Mount the file system in 'read-only' mode.</div><div class='ctx'> .TP</div><div class='del'>-\fB\-p, \fB\-\-pid\-file=PIDFILE\fR</div><div class='del'>-File to use as pid file</div><div class='add'>+\fB\-\-selinux\fR</div><div class='add'>+Enable SELinux label (extended attributes) support on inodes.</div><div class='add'>+.TP</div><div class='add'>+\fB\-S, \fB\-\-socket\-file=SOCKFILE\fR</div><div class='add'>+File to use as unix-socket.</div><div class='ctx'> .TP</div><div class='ctx'> \fB\-\-volfile\-id=KEY\fR</div><div class='del'>-KEY of the volume file to be fetched from server</div><div class='add'>+Key of the volume file to be fetched from the server.</div><div class='ctx'> .TP</div><div class='ctx'> \fB\-\-volfile\-server\-port=PORT\fR</div><div class='del'>-Port number of volfile server</div><div class='add'>+Port number of volfile server.</div><div class='ctx'> .TP</div><div class='ctx'> \fB\-\-volfile\-server\-transport=TRANSPORT\fR</div><div class='del'>-Transport type to get volume file from server [default: socket]</div><div class='add'>+Transport type to get volume file from server (the default is tcp).</div><div class='ctx'> .TP</div><div class='ctx'> \fB\-\-volume\-name=VOLUME\-NAME\fR</div><div class='del'>-Volume name to be used for MOUNT-POINT [default: top most volume in</div><div class='del'>-VOLUME-FILE]</div><div class='add'>+Volume name to be used for MOUNT-POINT (the default is top most volume in VOLUME-FILE).</div><div class='add'>+.TP</div><div class='add'>+\fB\-\-worm\fR</div><div class='add'>+Mount the filesystem in 'worm' mode.</div><div class='ctx'> .TP</div><div class='ctx'> \fB\-\-xlator\-option=VOLUME\-NAME.OPTION=VALUE\fR</div><div class='del'>-Add/override a translator option for a volume with the specified value</div><div class='add'>+Add/Override a translator option for a volume with the specified value.</div><div class='ctx'> .TP</div><div class='del'>-\fB\-\-log\-server\-port=PORT\fR</div><div class='del'>-Listening port number of log server</div><div class='add'>+\fB\-\-subdir\-mount=SUBDIR\-MOUNT\-PATH\fR</div><div class='add'>+Mount subdirectory instead of the '/' of volume.</div><div class='ctx'> </div><div class='ctx'> .SS "Fuse options"</div><div class='ctx'> .PP</div><div class='ctx'> .TP</div><div class='ctx'> </div><div class='add'>+\fB\-\-attr\-times\-granularity=NANOSECONDS\fR</div><div class='add'>+Declare supported granularity of file attribute times (default is 0 which kernel handles as unspecified; valid real values are between 1 and 1000000000).</div><div class='add'>+.TP</div><div class='ctx'> \fB\-\-attribute\-timeout=SECONDS\fR</div><div class='del'>-Set attribute timeout to SECONDS for inodes in fuse kernel module [default: 1]</div><div class='add'>+Set attribute timeout to SECONDS for inodes in fuse kernel module (the default is 1).</div><div class='add'>+.TP</div><div class='add'>+\fB\-\-background\-qlen=N\fR</div><div class='add'>+Set fuse module's background queue length to N (the default is 64).</div><div class='add'>+.TP</div><div class='add'>+\fB\-\-congestion\-threshold=N\fR</div><div class='add'>+Set fuse module's congestion threshold to N (the default is 48).</div><div class='add'>+.TP</div><div class='add'>+\fB\-\-direct\-io\-mode=BOOL|auto\fR</div><div class='add'>+Specify fuse direct I/O strategy (the default is auto).</div><div class='add'>+.TP</div><div class='add'>+\fB\-\-dump-fuse=PATH\f\R</div><div class='add'>+Dump fuse traffic to PATH</div><div class='ctx'> .TP</div><div class='ctx'> \fB\-\-entry\-timeout=SECONDS\fR</div><div class='del'>-Set entry timeout to SECONDS in fuse kernel module [default: 1]</div><div class='add'>+Set entry timeout to SECONDS in fuse kernel module (the default is 1).</div><div class='add'>+.TP</div><div class='add'>+\fB\-\-gid\-timeout=SECONDS\fR</div><div class='add'>+Set auxiliary group list timeout to SECONDS for fuse translator (the default is 0).</div><div class='add'>+.TP</div><div class='add'>+\fB\-\-kernel-writeback-cache=BOOL\fR</div><div class='add'>+Enable fuse in-kernel writeback cache.</div><div class='ctx'> .TP</div><div class='del'>-\fB\-\-disable\-direct\-io\-mode\fR</div><div class='del'>-Disable direct I/O mode in fuse kernel module</div><div class='add'>+\fB\-\-negative\-timeout=SECONDS\fR</div><div class='add'>+Set negative timeout to SECONDS in fuse kernel module (the default is 0).</div><div class='add'>+.TP</div><div class='add'>+\fB\-\-auto\-invalidation=BOOL\fR</div><div class='add'>+controls whether fuse-kernel can auto-invalidate attribute, dentry and</div><div class='add'>+page-cache. Disable this only if same files/directories are not</div><div class='add'>+accessed across two different mounts concurrently [default: on].</div><div class='add'>+.TP</div><div class='add'>+\fB\-\-volfile-check\fR</div><div class='add'>+Enable strict volume file checking.</div><div class='ctx'> </div><div class='ctx'> .SS "Miscellaneous Options"</div><div class='ctx'> .PP</div><div class='ctx'> .TP</div><div class='ctx'> </div><div class='ctx'> \fB\-?, \fB\-\-help\fR</div><div class='del'>-Give this help list</div><div class='add'>+Display this help.</div><div class='ctx'> .TP</div><div class='ctx'> \fB\-\-usage\fR</div><div class='del'>-Give a short usage message</div><div class='add'>+Display a short usage message.</div><div class='ctx'> .TP</div><div class='ctx'> \fB\-V, \fB\-\-version\fR</div><div class='del'>-Print program version</div><div class='add'>+Print the program version.</div><div class='ctx'> </div><div class='ctx'> .PP</div><div class='ctx'> .SH FILES</div><div class='del'>-/etc/glusterfs/*.vol</div><div class='add'>+/var/lib/glusterd/vols/*/*.vol</div><div class='add'>+.SH EXAMPLES</div><div class='add'>+mount a volume named foo on server bar with log level DEBUG on mount point</div><div class='add'>+/mnt/foo</div><div class='add'>+</div><div class='add'>+# glusterfs \-\-log\-level=DEBUG \-\-volfile\-id=foo \-\-volfile\-server=bar /mnt/foo</div><div class='ctx'> </div><div class='ctx'> .SH SEE ALSO</div><div class='ctx'> .nf</div><div class='del'>-\fBfusermount\fR(1), \fBmount.glusterfs\fR(8), \fBglusterfs-volgen\fR(8)</div><div class='add'>+\fBfusermount\fR(1), \fBmount.glusterfs\fR(8), \fBgluster\fR(8)</div><div class='ctx'> \fR</div><div class='ctx'> .fi</div><div class='ctx'> .SH COPYRIGHT</div><div class='ctx'> .nf</div><div class='del'>-Copyright(c) 2006-2010  Gluster, Inc.  &lt;http://www.gluster.com&gt;</div><div class='add'>+Copyright(c) 2006-2011  Red Hat, Inc.  &lt;http://www.redhat.com&gt;</div><div class='ctx'> \fR</div><div class='ctx'> .fi</div><div class='head'>diff --git a/doc/glusterfs.vol.sample b/doc/glusterfs.vol.sample<br/>deleted file mode 100644<br/>index e126f66b3dc..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/doc/glusterfs.vol.sample?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>doc/glusterfs.vol.sample</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,61 +0,0 @@</div><div class='del'>-### file: client-volume.vol.sample</div><div class='del'>-</div><div class='del'>-#####################################</div><div class='del'>-###  GlusterFS Client Volume File  ##</div><div class='del'>-#####################################</div><div class='del'>-</div><div class='del'>-#### CONFIG FILE RULES:</div><div class='del'>-### "#" is comment character.</div><div class='del'>-### - Config file is case sensitive</div><div class='del'>-### - Options within a volume block can be in any order.</div><div class='del'>-### - Spaces or tabs are used as delimitter within a line. </div><div class='del'>-### - Each option should end within a line.</div><div class='del'>-### - Missing or commented fields will assume default values.</div><div class='del'>-### - Blank/commented lines are allowed.</div><div class='del'>-### - Sub-volumes should already be defined above before referring.</div><div class='del'>-</div><div class='del'>-### Add client feature and attach to remote subvolume</div><div class='del'>-volume client</div><div class='del'>-  type protocol/client</div><div class='del'>-  option transport-type tcp</div><div class='del'>-# option transport-type unix</div><div class='del'>-# option transport-type ib-sdp</div><div class='del'>-  option remote-host 127.0.0.1         # IP address of the remote brick</div><div class='del'>-# option transport.socket.remote-port 6996              # default server port is 6996</div><div class='del'>-</div><div class='del'>-# option transport-type ib-verbs</div><div class='del'>-# option transport.ib-verbs.remote-port 6996              # default server port is 6996</div><div class='del'>-# option transport.ib-verbs.work-request-send-size  1048576</div><div class='del'>-# option transport.ib-verbs.work-request-send-count 16</div><div class='del'>-# option transport.ib-verbs.work-request-recv-size  1048576</div><div class='del'>-# option transport.ib-verbs.work-request-recv-count 16</div><div class='del'>-</div><div class='del'>-# option transport-timeout 30          # seconds to wait for a reply</div><div class='del'>-                                       # from server for each request</div><div class='del'>-  option remote-subvolume brick        # name of the remote volume</div><div class='del'>-end-volume</div><div class='del'>-</div><div class='del'>-### Add readahead feature</div><div class='del'>-#volume readahead</div><div class='del'>-#  type performance/read-ahead</div><div class='del'>-#  option page-size 1MB     # unit in bytes</div><div class='del'>-#  option page-count 2       # cache per file  = (page-count x page-size)</div><div class='del'>-#  subvolumes client</div><div class='del'>-#end-volume</div><div class='del'>-</div><div class='del'>-### Add IO-Cache feature</div><div class='del'>-#volume iocache</div><div class='del'>-#  type performance/io-cache</div><div class='del'>-#  option page-size 256KB</div><div class='del'>-#  option page-count 2</div><div class='del'>-#  subvolumes readahead</div><div class='del'>-#end-volume</div><div class='del'>-</div><div class='del'>-### Add writeback feature</div><div class='del'>-#volume writeback</div><div class='del'>-#  type performance/write-behind</div><div class='del'>-#  option aggregate-size 1MB</div><div class='del'>-#  option window-size 2MB</div><div class='del'>-#  option flush-behind off</div><div class='del'>-#  subvolumes iocache   </div><div class='del'>-#end-volume</div><div class='head'>diff --git a/doc/glusterfsd.8 b/doc/glusterfsd.8<br/>new file mode 100644<br/>index 00000000000..bc1de2a8c80<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/doc/glusterfsd.8?id=d1d7a6f35c816822fab51c820e25023863c239c1'>doc/glusterfsd.8</a></div><div class='hunk'>@@ -0,0 +1,147 @@</div><div class='add'>+.\"  Copyright (c) 20088888888-2012 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+.\"  This file is part of GlusterFS.</div><div class='add'>+.\"</div><div class='add'>+.\"  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+.\"  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+.\"  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+.\"  cases as published by the Free Software Foundation.</div><div class='add'>+.\"</div><div class='add'>+.\"</div><div class='add'>+.\"</div><div class='add'>+.TH GlusterFS 8 "Cluster Filesystem" "19 March 2010" "Gluster Inc."</div><div class='add'>+.SH NAME</div><div class='add'>+GlusterFS \- Clustered Filesystem.</div><div class='add'>+.SH SYNOPSIS</div><div class='add'>+.B glusterfsd</div><div class='add'>+.I [options] [mountpoint]</div><div class='add'>+.PP</div><div class='add'>+.SH DESCRIPTION</div><div class='add'>+GlusterFS is a clustered file-system capable of scaling to several peta-bytes.</div><div class='add'>+It aggregates various storage bricks over Infiniband RDMA or TCP/IP</div><div class='add'>+interconnect into one large parallel network file system. Storage bricks can</div><div class='add'>+be made of any commodity hardware such as x86-64 server with SATA-II RAID and</div><div class='add'>+Infiniband HBA.</div><div class='add'>+</div><div class='add'>+GlusterFS is fully POSIX compliant FileSystem. On client side, it has dependency</div><div class='add'>+on FUSE package, on server side, it works seemlessly on different OSes.</div><div class='add'>+(Currently supported on GNU/Linux, Solaris).</div><div class='add'>+</div><div class='add'>+.SH OPTIONS</div><div class='add'>+.PP</div><div class='add'>+Mandatory or optional arguments to long options are also mandatory or optional</div><div class='add'>+for any corresponding short options.</div><div class='add'>+.SS "Basic options"</div><div class='add'>+.PP</div><div class='add'>+.TP</div><div class='add'>+</div><div class='add'>+\fB\-f, \fB\-\-volfile=VOLUME-FILE\fR</div><div class='add'>+File to use as VOLUME-FILE [default:/etc/glusterfs/glusterfs.vol]</div><div class='add'>+.TP</div><div class='add'>+\fB\-l, \fB\-\-log\-file=LOGFILE\fR</div><div class='add'>+File to use for logging [default:/var/log/glusterfs/glusterfs.log]</div><div class='add'>+.TP</div><div class='add'>+\fB\-L, \fB\-\-log\-level=LOGLEVEL\fR</div><div class='add'>+Logging severity.  Valid options are TRACE, DEBUG, INFO, WARNING, ERROR and</div><div class='add'>+CRITICAL [default: WARNING]</div><div class='add'>+.TP</div><div class='add'>+\fB\-s, \fB\-\-volfile\-server=SERVER\fR</div><div class='add'>+Server to get the volume from.  This option overrides \fB\-\-volfile option</div><div class='add'>+</div><div class='add'>+.SS "Advanced options"</div><div class='add'>+.PP</div><div class='add'>+.TP</div><div class='add'>+</div><div class='add'>+\fB\-\-localtime\-logging\fR</div><div class='add'>+Enable localtime log timestamps.</div><div class='add'>+.TP</div><div class='add'>+\fB\-\-debug\fR</div><div class='add'>+Run in debug mode.  This option sets \fB\-\-no\-daemon\fR, \fB\-\-log\-level\fR to DEBUG</div><div class='add'>+and \fB\-\-log\-file\fR to console</div><div class='add'>+.TP</div><div class='add'>+\fB\-N, \fB\-\-no\-daemon\fR</div><div class='add'>+Run in foreground</div><div class='add'>+.TP</div><div class='add'>+\fB\-\-read\-only\fR</div><div class='add'>+Makes the filesystem read-only</div><div class='add'>+.TP</div><div class='add'>+\fB\-p, \fB\-\-pid\-file=PIDFILE\fR</div><div class='add'>+File to use as pid file</div><div class='add'>+.TP</div><div class='add'>+\fB\-S SOCKFILE</div><div class='add'>+Socket file to used for inter-process communication</div><div class='add'>+.TP</div><div class='add'>+\fB\-\-brick\-name DIRECTORY</div><div class='add'>+Directory to be used as export directory for GlusterFS</div><div class='add'>+.TP</div><div class='add'>+\fB\-\-brick\-port PORT</div><div class='add'>+Brick Port to be registered with Gluster portmapper</div><div class='add'>+.TP</div><div class='add'>+\fB\-\-volfile\-id=KEY\fR</div><div class='add'>+KEY of the volume file to be fetched from server</div><div class='add'>+.TP</div><div class='add'>+\fB\-\-volfile\-server\-port=PORT\fR</div><div class='add'>+Port number of volfile server</div><div class='add'>+.TP</div><div class='add'>+\fB\-\-volfile\-server\-transport=TRANSPORT\fR</div><div class='add'>+Transport type to get volume file from server [default: tcp]</div><div class='add'>+.TP</div><div class='add'>+\fB\-\-volume\-name=VOLUME\-NAME\fR</div><div class='add'>+Volume name to be used for MOUNT-POINT [default: top most volume in</div><div class='add'>+VOLUME-FILE]</div><div class='add'>+.TP</div><div class='add'>+\fB\-\-xlator\-option=VOLUME\-NAME.OPTION=VALUE\fR</div><div class='add'>+Add/override a translator option for a volume with the specified value</div><div class='add'>+</div><div class='add'>+.SS "Fuse options"</div><div class='add'>+.PP</div><div class='add'>+.TP</div><div class='add'>+</div><div class='add'>+\fB\-\-attribute\-timeout=SECONDS\fR</div><div class='add'>+Set attribute timeout to SECONDS for inodes in fuse kernel module [default: 1]</div><div class='add'>+.TP</div><div class='add'>+\fB\-\-entry\-timeout=SECONDS\fR</div><div class='add'>+Set entry timeout to SECONDS in fuse kernel module [default: 1]</div><div class='add'>+.TP</div><div class='add'>+\fB\-\-direct\-io\-mode=BOOL\fR</div><div class='add'>+Enable/Disable direct-io mode in fuse module [default: enable]</div><div class='add'>+.TP</div><div class='add'>+\fB\-\-resolve-gids\fR</div><div class='add'>+Resolve all auxiliary groups in fuse translator (max 32 otherwise)</div><div class='add'>+.TP</div><div class='add'>+\fB\-\-auto\-invalidation=BOOL\fR</div><div class='add'>+controls whether fuse-kernel can auto-invalidate attribute, dentry and</div><div class='add'>+page-cache. Disable this only if same files/directories are not</div><div class='add'>+accessed across two different mounts concurrently [default: on]</div><div class='add'>+</div><div class='add'>+.SS "Miscellaneous Options"</div><div class='add'>+.PP</div><div class='add'>+.TP</div><div class='add'>+</div><div class='add'>+\fB\-?, \fB\-\-help\fR</div><div class='add'>+Give this help list</div><div class='add'>+.TP</div><div class='add'>+\fB\-\-usage\fR</div><div class='add'>+Give a short usage message</div><div class='add'>+.TP</div><div class='add'>+\fB\-V, \fB\-\-version\fR</div><div class='add'>+Print program version</div><div class='add'>+</div><div class='add'>+.PP</div><div class='add'>+.SH FILES</div><div class='add'>+/etc/glusterfs/*.vol</div><div class='add'>+</div><div class='add'>+.SH EXAMPLES</div><div class='add'>+Start a GlusterFS server on localhost with volume name foo</div><div class='add'>+</div><div class='add'>+glusterfsd \-s localhost \-\-volfile\-id foo.server.media-disk\-1 \-p /var/lib/glusterd/vols/foo/run/server\-media\-disk\-1.pid \-S /tmp/&lt;uniqueid&gt;.socket \-\-brick-name /media/disk\-1 \-l /var/log/glusterfs/bricks/media\-disk\-1.log \-\-brick\-port 24009 \-\-xlator\-option foo\-server.listen-port=24009</div><div class='add'>+</div><div class='add'>+.SH SEE ALSO</div><div class='add'>+.nf</div><div class='add'>+\fBfusermount\fR(1), \fBmount.glusterfs\fR(8), \fBgluster\fR(8)</div><div class='add'>+\fR</div><div class='add'>+.fi</div><div class='add'>+.SH COPYRIGHT</div><div class='add'>+.nf</div><div class='add'>+Copyright(c) 2006-2011  Gluster, Inc.  &lt;http://www.gluster.com&gt;</div><div class='add'>+\fR</div><div class='add'>+.fi</div><div class='head'>diff --git a/doc/glusterfsd.vol.sample b/doc/glusterfsd.vol.sample<br/>deleted file mode 100644<br/>index b6d8a158072..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/doc/glusterfsd.vol.sample?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>doc/glusterfsd.vol.sample</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,47 +0,0 @@</div><div class='del'>-### file: server-volume.vol.sample</div><div class='del'>-</div><div class='del'>-#####################################</div><div class='del'>-###  GlusterFS Server Volume File  ##</div><div class='del'>-#####################################</div><div class='del'>-</div><div class='del'>-#### CONFIG FILE RULES:</div><div class='del'>-### "#" is comment character.</div><div class='del'>-### - Config file is case sensitive</div><div class='del'>-### - Options within a volume block can be in any order.</div><div class='del'>-### - Spaces or tabs are used as delimitter within a line. </div><div class='del'>-### - Multiple values to options will be : delimitted.</div><div class='del'>-### - Each option should end within a line.</div><div class='del'>-### - Missing or commented fields will assume default values.</div><div class='del'>-### - Blank/commented lines are allowed.</div><div class='del'>-### - Sub-volumes should already be defined above before referring.</div><div class='del'>-</div><div class='del'>-### Export volume "brick" with the contents of "/home/export" directory.</div><div class='del'>-volume brick</div><div class='del'>-  type storage/posix                   # POSIX FS translator</div><div class='del'>-  option directory /home/export        # Export this directory</div><div class='del'>-end-volume</div><div class='del'>-</div><div class='del'>-### Add network serving capability to above brick.</div><div class='del'>-volume server</div><div class='del'>-  type protocol/server</div><div class='del'>-  option transport-type tcp</div><div class='del'>-# option transport-type unix</div><div class='del'>-# option transport-type ib-sdp</div><div class='del'>-# option transport.socket.bind-address 192.168.1.10     # Default is to listen on all interfaces</div><div class='del'>-# option transport.socket.listen-port 6996              # Default is 6996</div><div class='del'>-</div><div class='del'>-# option transport-type ib-verbs</div><div class='del'>-# option transport.ib-verbs.bind-address 192.168.1.10     # Default is to listen on all interfaces</div><div class='del'>-# option transport.ib-verbs.listen-port 6996              # Default is 6996</div><div class='del'>-# option transport.ib-verbs.work-request-send-size  131072</div><div class='del'>-# option transport.ib-verbs.work-request-send-count 64</div><div class='del'>-# option transport.ib-verbs.work-request-recv-size  131072</div><div class='del'>-# option transport.ib-verbs.work-request-recv-count 64</div><div class='del'>-</div><div class='del'>-# option client-volume-filename /etc/glusterfs/glusterfs-client.vol</div><div class='del'>-  subvolumes brick</div><div class='del'>-# NOTE: Access to any volume through protocol/server is denied by</div><div class='del'>-# default. You need to explicitly grant access through # "auth"</div><div class='del'>-# option.</div><div class='del'>-  option auth.addr.brick.allow * # Allow access to "brick" volume</div><div class='del'>-end-volume</div><div class='head'>diff --git a/doc/hacker-guide/Makefile.am b/doc/hacker-guide/Makefile.am<br/>deleted file mode 100644<br/>index 65c92ac235e..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/doc/hacker-guide/Makefile.am?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>doc/hacker-guide/Makefile.am</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,8 +0,0 @@</div><div class='del'>-EXTRA_DIST = replicate.txt bdb.txt posix.txt call-stub.txt write-behind.txt</div><div class='del'>-</div><div class='del'>-#EXTRA_DIST = hacker-guide.tex afr.txt bdb.txt posix.txt call-stub.txt write-behind.txt</div><div class='del'>-#hacker_guidedir = $(docdir)</div><div class='del'>-#hacker_guide_DATA = hacker-guide.pdf</div><div class='del'>-</div><div class='del'>-#hacker-guide.pdf: $(EXTRA_DIST)</div><div class='del'>-#	pdflatex $(srcdir)/hacker-guide.tex</div><div class='head'>diff --git a/doc/hacker-guide/adding-fops.txt b/doc/hacker-guide/adding-fops.txt<br/>deleted file mode 100644<br/>index e70dbbdc829..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/doc/hacker-guide/adding-fops.txt?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>doc/hacker-guide/adding-fops.txt</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,33 +0,0 @@</div><div class='del'>-		  HOW TO ADD A NEW FOP TO GlusterFS</div><div class='del'>-		  =================================</div><div class='del'>-</div><div class='del'>-Steps to be followed when adding a new FOP to GlusterFS:</div><div class='del'>-</div><div class='del'>-1. Edit glusterfs.h and add a GF_FOP_* constant.</div><div class='del'>-</div><div class='del'>-2. Edit xlator.[ch] and:</div><div class='del'>-   2a. add the new prototype for fop and callback.</div><div class='del'>-   2b. edit xlator_fops structure.</div><div class='del'>-</div><div class='del'>-3. Edit xlator.c and add to fill_defaults.</div><div class='del'>-</div><div class='del'>-4. Edit protocol.h and add struct necessary for the new FOP.</div><div class='del'>-</div><div class='del'>-5. Edit defaults.[ch] and provide default implementation.</div><div class='del'>-</div><div class='del'>-6. Edit call-stub.[ch] and provide stub implementation.</div><div class='del'>-</div><div class='del'>-7. Edit common-utils.c and add to gf_global_variable_init().</div><div class='del'>-</div><div class='del'>-8. Edit client-protocol and add your FOP.</div><div class='del'>-</div><div class='del'>-9. Edit server-protocol and add your FOP.</div><div class='del'>-</div><div class='del'>-10. Implement your FOP in any translator for which the default implementation</div><div class='del'>-    is not sufficient.</div><div class='del'>-</div><div class='del'>-==========================================</div><div class='del'>-Last updated: Mon Oct 27 21:35:49 IST 2008</div><div class='del'>-</div><div class='del'>-Author: Vikas Gorur &lt;vikas@gluster.com&gt;</div><div class='del'>-==========================================</div><div class='head'>diff --git a/doc/hacker-guide/bdb.txt b/doc/hacker-guide/bdb.txt<br/>deleted file mode 100644<br/>index fd0bd365206..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/doc/hacker-guide/bdb.txt?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>doc/hacker-guide/bdb.txt</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,70 +0,0 @@</div><div class='del'>-</div><div class='del'>-* How does file translates to key/value pair?</div><div class='del'>----------------------------------------------</div><div class='del'>-</div><div class='del'>-  in bdb a file is identified by key (obtained by taking basename() of the path of</div><div class='del'>-the file) and file contents are stored as value corresponding to the key in database</div><div class='del'>-file (defaults to glusterfs_storage.db under dirname() directory).</div><div class='del'>-</div><div class='del'>-* symlinks, directories</div><div class='del'>------------------------</div><div class='del'>-</div><div class='del'>-  symlinks and directories are stored as is.</div><div class='del'>-</div><div class='del'>-* db (database) files</div><div class='del'>----------------------</div><div class='del'>-</div><div class='del'>-  every directory, including root directory, contains a database file called</div><div class='del'>-glusterfs_storage.db. all the regular files contained in the directory are stored</div><div class='del'>-as key/value pair inside the glusterfs_storage.db.</div><div class='del'>-</div><div class='del'>-* internal data cache</div><div class='del'>----------------------</div><div class='del'>-</div><div class='del'>-  db does not provide a way to find out the size of the value corresponding to a key. </div><div class='del'>-so, bdb makes DB-&gt;get() call for key and takes the length of the value returned. </div><div class='del'>-since DB-&gt;get() also returns file contents for key, bdb maintains an internal cache and</div><div class='del'>-stores the file contents in the cache.</div><div class='del'>-  every directory maintains a seperate cache.</div><div class='del'>-  </div><div class='del'>-* inode number transformation</div><div class='del'>------------------------------</div><div class='del'>-</div><div class='del'>-  bdb allocates a inode number to each file and directory on its own. bdb maintains a </div><div class='del'>-global counter and increments it after allocating inode number for each file</div><div class='del'>-(regular, symlink or directory). NOTE: bdb does not guarantee persistent inode numbers.</div><div class='del'>-</div><div class='del'>-* checkpoint thread</div><div class='del'>--------------------</div><div class='del'>-</div><div class='del'>-  bdb creates a checkpoint thread at the time of init(). checkpoint thread does a </div><div class='del'>-periodic checkpoint on the DB_ENV. checkpoint is the mechanism, provided by db, to </div><div class='del'>-forcefully commit the logged transactions to the storage.</div><div class='del'>-</div><div class='del'>-NOTES ABOUT FOPS:</div><div class='del'>------------------</div><div class='del'>-</div><div class='del'>-lookup() -</div><div class='del'>- 1&gt; do lstat() on the path, if lstat fails, we assume that the file being looked up</div><div class='del'>-    is either a regular file or doesn't exist.</div><div class='del'>- 2&gt; lookup in the DB of parent directory for key corresponding to path. if key exists,</div><div class='del'>-    return key, with. </div><div class='del'>-    NOTE: 'struct stat' stat()ed from DB file is used as a container for 'struct stat'</div><div class='del'>-           of the regular file. st_ino, st_size, st_blocks are updated with file's values.</div><div class='del'>-</div><div class='del'>-readv() -</div><div class='del'>- 1&gt; do a lookup in bctx cache. if successful, return the requested data from cache.</div><div class='del'>- 2&gt; if cache missed, do a DB-&gt;get() the entire file content and insert to cache.</div><div class='del'>-</div><div class='del'>-writev():</div><div class='del'>- 1&gt; flush any cached content of this file.</div><div class='del'>- 2&gt; do a DB-&gt;put(), with DB_DBT_PARTIAL flag. </div><div class='del'>-    NOTE: DB_DBT_PARTIAL is used to do partial update of a value in DB.</div><div class='del'>-</div><div class='del'>-readdir():</div><div class='del'>- 1&gt; regular readdir() in a loop, and vomit all DB_ENV log files and DB files that</div><div class='del'>-    we encounter.</div><div class='del'>- 2&gt; if the readdir() buffer still has space, open a DB cursor and do a sequential</div><div class='del'>-    DBC-&gt;get() to fill the reaadir buffer.</div><div class='del'>-</div><div class='del'>-</div><div class='head'>diff --git a/doc/hacker-guide/call-stub.txt b/doc/hacker-guide/call-stub.txt<br/>deleted file mode 100644<br/>index bca1579b22d..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/doc/hacker-guide/call-stub.txt?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>doc/hacker-guide/call-stub.txt</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,1033 +0,0 @@</div><div class='del'>-creating a call stub and pausing a call</div><div class='del'>----------------------------------------</div><div class='del'>-libglusterfs provides seperate API to pause each of the fop. parameters to each API is</div><div class='del'>-@frame - call frame which has to be used to resume the call at call_resume().</div><div class='del'>-@fn    - procedure to call during call_resume(). </div><div class='del'>-       NOTE: @fn should exactly take the same type and number of parameters that </div><div class='del'>-             the corresponding regular fop takes.</div><div class='del'>-rest will be the regular parameters to corresponding fop.</div><div class='del'>-</div><div class='del'>-NOTE: @frame can never be NULL. fop_&lt;operation&gt;_stub() fails with errno</div><div class='del'>-      set to EINVAL, if @frame is NULL. also wherever @loc is applicable,</div><div class='del'>-      @loc cannot be NULL.</div><div class='del'>-</div><div class='del'>-refer to individual stub creation API to know about call-stub creation's behaviour with</div><div class='del'>-specific parameters.</div><div class='del'>-</div><div class='del'>-here is the list of stub creation APIs for xlator fops.</div><div class='del'>-</div><div class='del'>-@frame     - call frame which has to be used to resume the call at call_resume().</div><div class='del'>-@fn        - procedure to call during call_resume(). </div><div class='del'>-@loc       - pointer to location structure.</div><div class='del'>-             NOTE: @loc will be copied to a different location, with inode_ref() to</div><div class='del'>-	           @loc-&gt;inode and @loc-&gt;parent, if not NULL. also @loc-&gt;path will be</div><div class='del'>-		   copied to a different location.</div><div class='del'>-@need_xattr - flag to specify if xattr should be returned or not.</div><div class='del'>-call_stub_t *</div><div class='del'>-fop_lookup_stub (call_frame_t *frame,</div><div class='del'>-		 fop_lookup_t fn,</div><div class='del'>-		 loc_t *loc,</div><div class='del'>-		 int32_t need_xattr);</div><div class='del'>-</div><div class='del'>-@frame - call frame which has to be used to resume the call at call_resume().</div><div class='del'>-@fn    - procedure to call during call_resume(). </div><div class='del'>-@loc   - pointer to location structure.</div><div class='del'>-         NOTE: @loc will be copied to a different location, with inode_ref() to</div><div class='del'>-	       @loc-&gt;inode and @loc-&gt;parent, if not NULL. also @loc-&gt;path will be</div><div class='del'>-	       copied to a different location.</div><div class='del'>-call_stub_t *</div><div class='del'>-fop_stat_stub (call_frame_t *frame,</div><div class='del'>-	       fop_stat_t fn,</div><div class='del'>-	       loc_t *loc);</div><div class='del'>-</div><div class='del'>-@frame - call frame which has to be used to resume the call at call_resume().</div><div class='del'>-@fn    - procedure to call during call_resume(). </div><div class='del'>-@fd    - file descriptor parameter to lk fop.</div><div class='del'>-         NOTE: @fd is stored with a fd_ref().</div><div class='del'>-call_stub_t *</div><div class='del'>-fop_fstat_stub (call_frame_t *frame,</div><div class='del'>-		fop_fstat_t fn,</div><div class='del'>-		fd_t *fd);</div><div class='del'>-</div><div class='del'>-@frame - call frame which has to be used to resume the call at call_resume().</div><div class='del'>-@fn    - procedure to call during call_resume(). </div><div class='del'>-@loc   - pointer to location structure.</div><div class='del'>-         NOTE: @loc will be copied to a different location, with inode_ref() to @loc-&gt;inode and</div><div class='del'>-	       @loc-&gt;parent, if not NULL. also @loc-&gt;path will be copied to a different location.</div><div class='del'>-@mode  - mode parameter to chmod.</div><div class='del'>-call_stub_t *</div><div class='del'>-fop_chmod_stub (call_frame_t *frame,</div><div class='del'>-		fop_chmod_t fn,</div><div class='del'>-		loc_t *loc,</div><div class='del'>-		mode_t mode);</div><div class='del'>-</div><div class='del'>-@frame - call frame which has to be used to resume the call at call_resume().</div><div class='del'>-@fn    - procedure to call during call_resume(). </div><div class='del'>-@fd    - file descriptor parameter to lk fop.</div><div class='del'>-         NOTE: @fd is stored with a fd_ref().</div><div class='del'>-@mode  - mode parameter for fchmod fop.</div><div class='del'>-call_stub_t *</div><div class='del'>-fop_fchmod_stub (call_frame_t *frame,</div><div class='del'>-		 fop_fchmod_t fn,</div><div class='del'>-		 fd_t *fd,</div><div class='del'>-		 mode_t mode);</div><div class='del'>-</div><div class='del'>-@frame - call frame which has to be used to resume the call at call_resume().</div><div class='del'>-@fn    - procedure to call during call_resume(). </div><div class='del'>-@loc   - pointer to location structure.</div><div class='del'>-         NOTE: @loc will be copied to a different location, with inode_ref() to @loc-&gt;inode and</div><div class='del'>-	       @loc-&gt;parent, if not NULL. also @loc-&gt;path will be copied to a different location.</div><div class='del'>-@uid   - uid parameter to chown.</div><div class='del'>-@gid   - gid parameter to chown.</div><div class='del'>-call_stub_t *</div><div class='del'>-fop_chown_stub (call_frame_t *frame,</div><div class='del'>-		fop_chown_t fn,</div><div class='del'>-		loc_t *loc,</div><div class='del'>-		uid_t uid,</div><div class='del'>-		gid_t gid);</div><div class='del'>-</div><div class='del'>-@frame - call frame which has to be used to resume the call at call_resume().</div><div class='del'>-@fn    - procedure to call during call_resume(). </div><div class='del'>-@fd    - file descriptor parameter to lk fop.</div><div class='del'>-         NOTE: @fd is stored with a fd_ref().</div><div class='del'>-@uid   - uid parameter to fchown.</div><div class='del'>-@gid   - gid parameter to fchown.</div><div class='del'>-call_stub_t *</div><div class='del'>-fop_fchown_stub (call_frame_t *frame,</div><div class='del'>-		 fop_fchown_t fn,</div><div class='del'>-		 fd_t *fd,</div><div class='del'>-		 uid_t uid,</div><div class='del'>-		 gid_t gid);</div><div class='del'>-</div><div class='del'>-@frame - call frame which has to be used to resume the call at call_resume().</div><div class='del'>-@fn    - procedure to call during call_resume(). </div><div class='del'>-@loc   - pointer to location structure.</div><div class='del'>-         NOTE: @loc will be copied to a different location, with inode_ref() to</div><div class='del'>-	       @loc-&gt;inode and @loc-&gt;parent, if not NULL. also @loc-&gt;path will be</div><div class='del'>-	       copied to a different location, if not NULL.</div><div class='del'>-@off   - offset parameter to truncate fop.</div><div class='del'>-call_stub_t *</div><div class='del'>-fop_truncate_stub (call_frame_t *frame,</div><div class='del'>-		   fop_truncate_t fn,</div><div class='del'>-		   loc_t *loc,</div><div class='del'>-		   off_t off);</div><div class='del'>-</div><div class='del'>-@frame - call frame which has to be used to resume the call at call_resume().</div><div class='del'>-@fn    - procedure to call during call_resume(). </div><div class='del'>-@fd    - file descriptor parameter to lk fop.</div><div class='del'>-         NOTE: @fd is stored with a fd_ref().</div><div class='del'>-@off   - offset parameter to ftruncate fop.</div><div class='del'>-call_stub_t *</div><div class='del'>-fop_ftruncate_stub (call_frame_t *frame,</div><div class='del'>-		    fop_ftruncate_t fn,</div><div class='del'>-		    fd_t *fd,</div><div class='del'>-		    off_t off);</div><div class='del'>-</div><div class='del'>-@frame - call frame which has to be used to resume the call at call_resume().</div><div class='del'>-@fn    - procedure to call during call_resume(). </div><div class='del'>-@loc   - pointer to location structure.</div><div class='del'>-         NOTE: @loc will be copied to a different location, with inode_ref() to</div><div class='del'>-	       @loc-&gt;inode and @loc-&gt;parent, if not NULL. also @loc-&gt;path will be</div><div class='del'>-	       copied to a different location.</div><div class='del'>-@tv    - tv parameter to utimens fop.</div><div class='del'>-call_stub_t *</div><div class='del'>-fop_utimens_stub (call_frame_t *frame,</div><div class='del'>-		  fop_utimens_t fn,</div><div class='del'>-		  loc_t *loc,</div><div class='del'>-		  struct timespec tv[2]);</div><div class='del'>-</div><div class='del'>-@frame - call frame which has to be used to resume the call at call_resume().</div><div class='del'>-@fn    - procedure to call during call_resume(). </div><div class='del'>-@loc   - pointer to location structure.</div><div class='del'>-         NOTE: @loc will be copied to a different location, with inode_ref() to</div><div class='del'>-	       @loc-&gt;inode and @loc-&gt;parent, if not NULL. also @loc-&gt;path will be</div><div class='del'>-	       copied to a different location.</div><div class='del'>-@mask  - mask parameter for access fop.</div><div class='del'>-call_stub_t *</div><div class='del'>-fop_access_stub (call_frame_t *frame,</div><div class='del'>-		 fop_access_t fn,</div><div class='del'>-		 loc_t *loc,</div><div class='del'>-		 int32_t mask);</div><div class='del'>-</div><div class='del'>-@frame - call frame which has to be used to resume the call at call_resume().</div><div class='del'>-@fn    - procedure to call during call_resume(). </div><div class='del'>-@loc   - pointer to location structure.</div><div class='del'>-         NOTE: @loc will be copied to a different location, with inode_ref() to</div><div class='del'>-	       @loc-&gt;inode and @loc-&gt;parent, if not NULL. also @loc-&gt;path will be</div><div class='del'>-	       copied to a different location.</div><div class='del'>-@size  - size parameter to readlink fop.</div><div class='del'>-call_stub_t *</div><div class='del'>-fop_readlink_stub (call_frame_t *frame,</div><div class='del'>-		   fop_readlink_t fn,</div><div class='del'>-		   loc_t *loc,</div><div class='del'>-		   size_t size);</div><div class='del'>-</div><div class='del'>-@frame - call frame which has to be used to resume the call at call_resume().</div><div class='del'>-@fn    - procedure to call during call_resume(). </div><div class='del'>-@loc   - pointer to location structure.</div><div class='del'>-         NOTE: @loc will be copied to a different location, with inode_ref() to</div><div class='del'>-	       @loc-&gt;inode and @loc-&gt;parent, if not NULL. also @loc-&gt;path will be</div><div class='del'>-	       copied to a different location.</div><div class='del'>-@mode  - mode parameter to mknod fop.</div><div class='del'>-@rdev  - rdev parameter to mknod fop.</div><div class='del'>-call_stub_t *</div><div class='del'>-fop_mknod_stub (call_frame_t *frame,</div><div class='del'>-		fop_mknod_t fn,</div><div class='del'>-		loc_t *loc,</div><div class='del'>-		mode_t mode,</div><div class='del'>-		dev_t rdev);</div><div class='del'>-</div><div class='del'>-@frame - call frame which has to be used to resume the call at call_resume().</div><div class='del'>-@fn    - procedure to call during call_resume(). </div><div class='del'>-@loc   - pointer to location structure.</div><div class='del'>-         NOTE: @loc will be copied to a different location, with inode_ref() to</div><div class='del'>-	       @loc-&gt;inode and @loc-&gt;parent, if not NULL. also @loc-&gt;path will be</div><div class='del'>-	       copied to a different location.</div><div class='del'>-@mode  - mode parameter to mkdir fop.</div><div class='del'>-call_stub_t *</div><div class='del'>-fop_mkdir_stub (call_frame_t *frame,</div><div class='del'>-		fop_mkdir_t fn,</div><div class='del'>-		loc_t *loc,</div><div class='del'>-		mode_t mode);</div><div class='del'>-</div><div class='del'>-@frame - call frame which has to be used to resume the call at call_resume().</div><div class='del'>-@fn    - procedure to call during call_resume(). </div><div class='del'>-@loc   - pointer to location structure.</div><div class='del'>-         NOTE: @loc will be copied to a different location, with inode_ref() to</div><div class='del'>-	       @loc-&gt;inode and @loc-&gt;parent, if not NULL. also @loc-&gt;path will be</div><div class='del'>-	       copied to a different location.</div><div class='del'>-call_stub_t *</div><div class='del'>-fop_unlink_stub (call_frame_t *frame,</div><div class='del'>-		 fop_unlink_t fn,</div><div class='del'>-		 loc_t *loc);</div><div class='del'>-</div><div class='del'>-@frame - call frame which has to be used to resume the call at call_resume().</div><div class='del'>-@fn    - procedure to call during call_resume(). </div><div class='del'>-@loc   - pointer to location structure.</div><div class='del'>-         NOTE: @loc will be copied to a different location, with inode_ref() to</div><div class='del'>-	       @loc-&gt;inode and @loc-&gt;parent, if not NULL. also @loc-&gt;path will be</div><div class='del'>-	       copied to a different location.</div><div class='del'>-call_stub_t *</div><div class='del'>-fop_rmdir_stub (call_frame_t *frame,</div><div class='del'>-		fop_rmdir_t fn,</div><div class='del'>-		loc_t *loc);</div><div class='del'>-</div><div class='del'>-@frame    - call frame which has to be used to resume the call at call_resume().</div><div class='del'>-@fn       - procedure to call during call_resume(). </div><div class='del'>-@linkname - linkname parameter to symlink fop.</div><div class='del'>-@loc      - pointer to location structure.</div><div class='del'>-            NOTE: @loc will be copied to a different location, with inode_ref() to</div><div class='del'>-	          @loc-&gt;inode and @loc-&gt;parent, if not NULL. also @loc-&gt;path will be</div><div class='del'>-		  copied to a different location.</div><div class='del'>-call_stub_t *</div><div class='del'>-fop_symlink_stub (call_frame_t *frame,</div><div class='del'>-		  fop_symlink_t fn,</div><div class='del'>-		  const char *linkname,</div><div class='del'>-		  loc_t *loc);</div><div class='del'>-</div><div class='del'>-@frame    - call frame which has to be used to resume the call at call_resume().</div><div class='del'>-@fn       - procedure to call during call_resume(). </div><div class='del'>-@oldloc   - pointer to location structure.</div><div class='del'>-            NOTE: @oldloc will be copied to a different location, with inode_ref() to </div><div class='del'>-	          @oldloc-&gt;inode and @oldloc-&gt;parent, if not NULL. also @oldloc-&gt;path will </div><div class='del'>-		  be copied to a different location, if not NULL.</div><div class='del'>-@newloc   - pointer to location structure.</div><div class='del'>-            NOTE: @newloc will be copied to a different location, with inode_ref() to</div><div class='del'>-	          @newloc-&gt;inode and @newloc-&gt;parent, if not NULL. also @newloc-&gt;path will</div><div class='del'>-		  be copied to a different location, if not NULL.</div><div class='del'>-call_stub_t *</div><div class='del'>-fop_rename_stub (call_frame_t *frame,</div><div class='del'>-		 fop_rename_t fn,</div><div class='del'>-		 loc_t *oldloc,</div><div class='del'>-		 loc_t *newloc);</div><div class='del'>-</div><div class='del'>-@frame - call frame which has to be used to resume the call at call_resume().</div><div class='del'>-@fn    - procedure to call during call_resume(). </div><div class='del'>-@loc     - pointer to location structure.</div><div class='del'>-           NOTE: @loc will be copied to a different location, with inode_ref() to</div><div class='del'>-	         @loc-&gt;inode and @loc-&gt;parent, if not NULL. also @loc-&gt;path will be</div><div class='del'>-		 copied to a different location.</div><div class='del'>-@newpath - newpath parameter to link fop.</div><div class='del'>-call_stub_t *</div><div class='del'>-fop_link_stub (call_frame_t *frame,</div><div class='del'>-	       fop_link_t fn,</div><div class='del'>-	       loc_t *oldloc,</div><div class='del'>-	       const char *newpath);</div><div class='del'>-</div><div class='del'>-@frame - call frame which has to be used to resume the call at call_resume().</div><div class='del'>-@fn    - procedure to call during call_resume(). </div><div class='del'>-@loc   - pointer to location structure.</div><div class='del'>-         NOTE: @loc will be copied to a different location, with inode_ref() to</div><div class='del'>-	       @loc-&gt;inode and @loc-&gt;parent, if not NULL. also @loc-&gt;path will be</div><div class='del'>-	       copied to a different location.</div><div class='del'>-@flags - flags parameter to create fop.</div><div class='del'>-@mode  - mode parameter to create fop.</div><div class='del'>-@fd    - file descriptor parameter to create fop.</div><div class='del'>-         NOTE: @fd is stored with a fd_ref().</div><div class='del'>-call_stub_t *</div><div class='del'>-fop_create_stub (call_frame_t *frame,</div><div class='del'>-		 fop_create_t fn,</div><div class='del'>-		 loc_t *loc,</div><div class='del'>-		 int32_t flags,</div><div class='del'>-		 mode_t mode, fd_t *fd);</div><div class='del'>-</div><div class='del'>-@frame - call frame which has to be used to resume the call at call_resume().</div><div class='del'>-@fn    - procedure to call during call_resume(). </div><div class='del'>-@flags - flags parameter to open fop.</div><div class='del'>-@loc   - pointer to location structure.</div><div class='del'>-         NOTE: @loc will be copied to a different location, with inode_ref() to</div><div class='del'>-	       @loc-&gt;inode and @loc-&gt;parent, if not NULL. also @loc-&gt;path will be</div><div class='del'>-	       copied to a different location.</div><div class='del'>-call_stub_t *</div><div class='del'>-fop_open_stub (call_frame_t *frame,</div><div class='del'>-	       fop_open_t fn,</div><div class='del'>-	       loc_t *loc,</div><div class='del'>-	       int32_t flags,</div><div class='del'>-	       fd_t *fd);</div><div class='del'>-</div><div class='del'>-@frame - call frame which has to be used to resume the call at call_resume().</div><div class='del'>-@fn    - procedure to call during call_resume(). </div><div class='del'>-@fd    - file descriptor parameter to lk fop.</div><div class='del'>-         NOTE: @fd is stored with a fd_ref().</div><div class='del'>-@size  - size parameter to readv fop.</div><div class='del'>-@off   - offset parameter to readv fop.</div><div class='del'>-call_stub_t *</div><div class='del'>-fop_readv_stub (call_frame_t *frame,</div><div class='del'>-		fop_readv_t fn,</div><div class='del'>-		fd_t *fd,</div><div class='del'>-		size_t size,</div><div class='del'>-		off_t off);</div><div class='del'>-</div><div class='del'>-@frame  - call frame which has to be used to resume the call at call_resume().</div><div class='del'>-@fn     - procedure to call during call_resume(). </div><div class='del'>-@fd     - file descriptor parameter to lk fop.</div><div class='del'>-          NOTE: @fd is stored with a fd_ref().</div><div class='del'>-@vector - vector parameter to writev fop. </div><div class='del'>-	  NOTE: @vector is iov_dup()ed while creating stub. and frame-&gt;root-&gt;req_refs</div><div class='del'>-                dictionary is dict_ref()ed.</div><div class='del'>-@count  - count parameter to writev fop.</div><div class='del'>-@off    - off parameter to writev fop.</div><div class='del'>-call_stub_t *</div><div class='del'>-fop_writev_stub (call_frame_t *frame,</div><div class='del'>-		 fop_writev_t fn,</div><div class='del'>-		 fd_t *fd,</div><div class='del'>-		 struct iovec *vector,</div><div class='del'>-		 int32_t count,</div><div class='del'>-		 off_t off);</div><div class='del'>-</div><div class='del'>-@frame - call frame which has to be used to resume the call at call_resume().</div><div class='del'>-@fn    - procedure to call during call_resume(). </div><div class='del'>-@fd    - file descriptor parameter to flush fop.</div><div class='del'>-         NOTE: @fd is stored with a fd_ref().</div><div class='del'>-call_stub_t *</div><div class='del'>-fop_flush_stub (call_frame_t *frame,</div><div class='del'>-		fop_flush_t fn,</div><div class='del'>-		fd_t *fd);</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-@frame    - call frame which has to be used to resume the call at call_resume().</div><div class='del'>-@fn       - procedure to call during call_resume(). </div><div class='del'>-@fd       - file descriptor parameter to lk fop.</div><div class='del'>-            NOTE: @fd is stored with a fd_ref().</div><div class='del'>-@datasync - datasync parameter to fsync fop.</div><div class='del'>-call_stub_t *</div><div class='del'>-fop_fsync_stub (call_frame_t *frame,</div><div class='del'>-		fop_fsync_t fn,</div><div class='del'>-		fd_t *fd,</div><div class='del'>-		int32_t datasync);</div><div class='del'>-</div><div class='del'>-@frame - call frame which has to be used to resume the call at call_resume().</div><div class='del'>-@fn    - procedure to call during call_resume(). </div><div class='del'>-@loc   - pointer to location structure.</div><div class='del'>-         NOTE: @loc will be copied to a different location, with inode_ref() to @loc-&gt;inode and</div><div class='del'>-	       @loc-&gt;parent, if not NULL. also @loc-&gt;path will be copied to a different location.</div><div class='del'>-@fd    - file descriptor parameter to opendir fop.</div><div class='del'>-         NOTE: @fd is stored with a fd_ref().</div><div class='del'>-call_stub_t *</div><div class='del'>-fop_opendir_stub (call_frame_t *frame,</div><div class='del'>-		  fop_opendir_t fn,</div><div class='del'>-		  loc_t *loc, </div><div class='del'>-		  fd_t *fd);</div><div class='del'>-</div><div class='del'>-@frame - call frame which has to be used to resume the call at call_resume().</div><div class='del'>-@fn    - procedure to call during call_resume(). </div><div class='del'>-@fd    - file descriptor parameter to getdents fop.</div><div class='del'>-         NOTE: @fd is stored with a fd_ref().</div><div class='del'>-@size  - size parameter to getdents fop.</div><div class='del'>-@off   - off parameter to getdents fop.</div><div class='del'>-@flags - flags parameter to getdents fop.</div><div class='del'>-call_stub_t *</div><div class='del'>-fop_getdents_stub (call_frame_t *frame,</div><div class='del'>-		   fop_getdents_t fn,</div><div class='del'>-		   fd_t *fd,</div><div class='del'>-		   size_t size,</div><div class='del'>-		   off_t off,</div><div class='del'>-		   int32_t flag);</div><div class='del'>-</div><div class='del'>-@frame   - call frame which has to be used to resume the call at call_resume().</div><div class='del'>-@fn      - procedure to call during call_resume(). </div><div class='del'>-@fd      - file descriptor parameter to setdents fop.</div><div class='del'>-           NOTE: @fd is stored with a fd_ref().</div><div class='del'>-@flags   - flags parameter to setdents fop.</div><div class='del'>-@entries - entries parameter to setdents fop.</div><div class='del'>-call_stub_t *</div><div class='del'>-fop_setdents_stub (call_frame_t *frame,</div><div class='del'>-		   fop_setdents_t fn,</div><div class='del'>-		   fd_t *fd,</div><div class='del'>-		   int32_t flags,</div><div class='del'>-		   dir_entry_t *entries,</div><div class='del'>-		   int32_t count);</div><div class='del'>-</div><div class='del'>-@frame    - call frame which has to be used to resume the call at call_resume().</div><div class='del'>-@fn       - procedure to call during call_resume(). </div><div class='del'>-@fd       - file descriptor parameter to setdents fop.</div><div class='del'>-            NOTE: @fd is stored with a fd_ref().</div><div class='del'>-@datasync - datasync parameter to fsyncdir fop.</div><div class='del'>-call_stub_t *</div><div class='del'>-fop_fsyncdir_stub (call_frame_t *frame,</div><div class='del'>-		   fop_fsyncdir_t fn,</div><div class='del'>-		   fd_t *fd,</div><div class='del'>-		   int32_t datasync);</div><div class='del'>-</div><div class='del'>-@frame - call frame which has to be used to resume the call at call_resume().</div><div class='del'>-@fn    - procedure to call during call_resume(). </div><div class='del'>-@loc   - pointer to location structure.</div><div class='del'>-         NOTE: @loc will be copied to a different location, with inode_ref() to</div><div class='del'>-	       @loc-&gt;inode and @loc-&gt;parent, if not NULL. also @loc-&gt;path will be</div><div class='del'>-	       copied to a different location.</div><div class='del'>-call_stub_t *</div><div class='del'>-fop_statfs_stub (call_frame_t *frame,</div><div class='del'>-		 fop_statfs_t fn,</div><div class='del'>-		 loc_t *loc);</div><div class='del'>-</div><div class='del'>-@frame - call frame which has to be used to resume the call at call_resume().</div><div class='del'>-@fn    - procedure to call during call_resume(). </div><div class='del'>-@loc   - pointer to location structure.</div><div class='del'>-         NOTE: @loc will be copied to a different location, with inode_ref() to </div><div class='del'>-	       @loc-&gt;inode and @loc-&gt;parent, if not NULL. also @loc-&gt;path will be</div><div class='del'>-	       copied to a different location.</div><div class='del'>-@dict  - dict parameter to setxattr fop.</div><div class='del'>-         NOTE: stub creation procedure stores @dict pointer with dict_ref() to it.</div><div class='del'>-call_stub_t *</div><div class='del'>-fop_setxattr_stub (call_frame_t *frame,</div><div class='del'>-		   fop_setxattr_t fn,</div><div class='del'>-		   loc_t *loc,</div><div class='del'>-		   dict_t *dict,</div><div class='del'>-		   int32_t flags);</div><div class='del'>-</div><div class='del'>-@frame - call frame which has to be used to resume the call at call_resume().</div><div class='del'>-@fn    - procedure to call during call_resume(). </div><div class='del'>-@loc   - pointer to location structure.</div><div class='del'>-         NOTE: @loc will be copied to a different location, with inode_ref() to</div><div class='del'>-	       @loc-&gt;inode and @loc-&gt;parent, if not NULL. also @loc-&gt;path will be</div><div class='del'>-	       copied to a different location.</div><div class='del'>-@name  - name parameter to getxattr fop.</div><div class='del'>-call_stub_t *</div><div class='del'>-fop_getxattr_stub (call_frame_t *frame,</div><div class='del'>-		   fop_getxattr_t fn,</div><div class='del'>-		   loc_t *loc,</div><div class='del'>-		   const char *name);</div><div class='del'>-</div><div class='del'>-@frame - call frame which has to be used to resume the call at call_resume().</div><div class='del'>-@fn    - procedure to call during call_resume(). </div><div class='del'>-@loc   - pointer to location structure.</div><div class='del'>-         NOTE: @loc will be copied to a different location, with inode_ref() to</div><div class='del'>-	       @loc-&gt;inode and @loc-&gt;parent, if not NULL. also @loc-&gt;path will be</div><div class='del'>-	       copied to a different location.</div><div class='del'>-@name  - name parameter to removexattr fop.</div><div class='del'>-         NOTE: name string will be copied to a different location while creating stub.</div><div class='del'>-call_stub_t *</div><div class='del'>-fop_removexattr_stub (call_frame_t *frame,</div><div class='del'>-		      fop_removexattr_t fn,</div><div class='del'>-		      loc_t *loc,</div><div class='del'>-		      const char *name);</div><div class='del'>-</div><div class='del'>-@frame - call frame which has to be used to resume the call at call_resume().</div><div class='del'>-@fn    - procedure to call during call_resume(). </div><div class='del'>-@fd    - file descriptor parameter to lk fop.</div><div class='del'>-         NOTE: @fd is stored with a fd_ref().</div><div class='del'>-@cmd   - command parameter to lk fop.</div><div class='del'>-@lock  - lock parameter to lk fop.</div><div class='del'>-         NOTE: lock will be copied to a different location while creating stub.</div><div class='del'>-call_stub_t *</div><div class='del'>-fop_lk_stub (call_frame_t *frame,</div><div class='del'>-	     fop_lk_t fn,</div><div class='del'>-	     fd_t *fd,</div><div class='del'>-	     int32_t cmd,</div><div class='del'>-	     struct flock *lock);</div><div class='del'>-</div><div class='del'>-@frame    - call frame which has to be used to resume the call at call_resume().</div><div class='del'>-@fn       - procedure to call during call_resume(). </div><div class='del'>-@fd       - fd parameter to gf_lk fop.</div><div class='del'>-	    NOTE: @fd is fd_ref()ed while creating stub, if not NULL.</div><div class='del'>-@cmd      - cmd parameter to gf_lk fop.</div><div class='del'>-@lock     - lock paramater to gf_lk fop.</div><div class='del'>-	    NOTE: @lock is copied to a different memory location while creating</div><div class='del'>-	          stub. </div><div class='del'>-call_stub_t *</div><div class='del'>-fop_gf_lk_stub (call_frame_t *frame,</div><div class='del'>-		fop_gf_lk_t fn,</div><div class='del'>-		fd_t *fd,</div><div class='del'>-		int32_t cmd,</div><div class='del'>-		struct flock *lock);</div><div class='del'>-</div><div class='del'>-@frame - call frame which has to be used to resume the call at call_resume().</div><div class='del'>-@fn    - procedure to call during call_resume(). </div><div class='del'>-@fd    - file descriptor parameter to readdir fop.</div><div class='del'>-         NOTE: @fd is stored with a fd_ref().</div><div class='del'>-@size  - size parameter to readdir fop.</div><div class='del'>-@off   - offset parameter to readdir fop.</div><div class='del'>-call_stub_t *</div><div class='del'>-fop_readdir_stub (call_frame_t *frame,</div><div class='del'>-		  fop_readdir_t fn,</div><div class='del'>-		  fd_t *fd,</div><div class='del'>-		  size_t size,</div><div class='del'>-		  off_t off);</div><div class='del'>-</div><div class='del'>-@frame - call frame which has to be used to resume the call at call_resume().</div><div class='del'>-@fn    - procedure to call during call_resume(). </div><div class='del'>-@loc   - pointer to location structure.</div><div class='del'>-         NOTE: @loc will be copied to a different location, with inode_ref() to</div><div class='del'>-	       @loc-&gt;inode and @loc-&gt;parent, if not NULL. also @loc-&gt;path will be</div><div class='del'>-	       copied to a different location.</div><div class='del'>-@flags - flags parameter to checksum fop.</div><div class='del'>-call_stub_t *</div><div class='del'>-fop_checksum_stub (call_frame_t *frame,</div><div class='del'>-		   fop_checksum_t fn,</div><div class='del'>-		   loc_t *loc,</div><div class='del'>-		   int32_t flags);</div><div class='del'>-</div><div class='del'>-@frame     - call frame which has to be used to resume the call at call_resume().</div><div class='del'>-@fn        - procedure to call during call_resume(). </div><div class='del'>-@op_ret    - op_ret parameter to @fn.</div><div class='del'>-@op_errno  - op_errno parameter to @fn.</div><div class='del'>-@inode     - inode parameter to @fn.</div><div class='del'>-	     NOTE: @inode pointer is stored with a inode_ref().</div><div class='del'>-@buf       - buf parameter to @fn.</div><div class='del'>-	     NOTE: @buf is copied to a different memory location, if not NULL.</div><div class='del'>-@dict      - dict parameter to @fn.</div><div class='del'>-	     NOTE: @dict pointer is stored with dict_ref().</div><div class='del'>-call_stub_t *</div><div class='del'>-fop_lookup_cbk_stub (call_frame_t *frame,</div><div class='del'>-		     fop_lookup_cbk_t fn,</div><div class='del'>-		     int32_t op_ret,</div><div class='del'>-		     int32_t op_errno,</div><div class='del'>-		     inode_t *inode,</div><div class='del'>-		     struct stat *buf,</div><div class='del'>-		     dict_t *dict);</div><div class='del'>-@frame     - call frame which has to be used to resume the call at call_resume().</div><div class='del'>-@fn        - procedure to call during call_resume(). </div><div class='del'>-@op_ret    - op_ret parameter to @fn.</div><div class='del'>-@op_errno  - op_errno parameter to @fn.</div><div class='del'>-@buf       - buf parameter to @fn.</div><div class='del'>-	     NOTE: @buf is copied to a different memory location, if not NULL.</div><div class='del'>-call_stub_t *</div><div class='del'>-fop_stat_cbk_stub (call_frame_t *frame,</div><div class='del'>-		   fop_stat_cbk_t fn,</div><div class='del'>-		   int32_t op_ret,</div><div class='del'>-		   int32_t op_errno,</div><div class='del'>-		   struct stat *buf);</div><div class='del'>-</div><div class='del'>-@frame     - call frame which has to be used to resume the call at call_resume().</div><div class='del'>-@fn        - procedure to call during call_resume(). </div><div class='del'>-@op_ret    - op_ret parameter to @fn.</div><div class='del'>-@op_errno  - op_errno parameter to @fn.</div><div class='del'>-@buf       - buf parameter to @fn.</div><div class='del'>-	     NOTE: @buf is copied to a different memory location, if not NULL.</div><div class='del'>-call_stub_t *</div><div class='del'>-fop_fstat_cbk_stub (call_frame_t *frame,</div><div class='del'>-		    fop_fstat_cbk_t fn,</div><div class='del'>-		    int32_t op_ret,</div><div class='del'>-		    int32_t op_errno,</div><div class='del'>-		    struct stat *buf);</div><div class='del'>-</div><div class='del'>-@frame     - call frame which has to be used to resume the call at call_resume().</div><div class='del'>-@fn        - procedure to call during call_resume(). </div><div class='del'>-@op_ret    - op_ret parameter to @fn.</div><div class='del'>-@op_errno  - op_errno parameter to @fn.</div><div class='del'>-@buf       - buf parameter to @fn.</div><div class='del'>-	     NOTE: @buf is copied to a different memory location, if not NULL.</div><div class='del'>-call_stub_t *</div><div class='del'>-fop_chmod_cbk_stub (call_frame_t *frame,</div><div class='del'>-		    fop_chmod_cbk_t fn,</div><div class='del'>-		    int32_t op_ret,</div><div class='del'>-		    int32_t op_errno,</div><div class='del'>-		    struct stat *buf);</div><div class='del'>-</div><div class='del'>-@frame     - call frame which has to be used to resume the call at call_resume().</div><div class='del'>-@fn        - procedure to call during call_resume(). </div><div class='del'>-@op_ret    - op_ret parameter to @fn.</div><div class='del'>-@op_errno  - op_errno parameter to @fn.</div><div class='del'>-@buf       - buf parameter to @fn.</div><div class='del'>-	     NOTE: @buf is copied to a different memory location, if not NULL.</div><div class='del'>-call_stub_t *</div><div class='del'>-fop_fchmod_cbk_stub (call_frame_t *frame,</div><div class='del'>-		     fop_fchmod_cbk_t fn,</div><div class='del'>-		     int32_t op_ret,</div><div class='del'>-		     int32_t op_errno,</div><div class='del'>-		     struct stat *buf);</div><div class='del'>-</div><div class='del'>-@frame     - call frame which has to be used to resume the call at call_resume().</div><div class='del'>-@fn        - procedure to call during call_resume(). </div><div class='del'>-@op_ret    - op_ret parameter to @fn.</div><div class='del'>-@op_errno  - op_errno parameter to @fn.</div><div class='del'>-@buf       - buf parameter to @fn.</div><div class='del'>-	     NOTE: @buf is copied to a different memory location, if not NULL.</div><div class='del'>-call_stub_t *</div><div class='del'>-fop_chown_cbk_stub (call_frame_t *frame,</div><div class='del'>-		    fop_chown_cbk_t fn,</div><div class='del'>-		    int32_t op_ret,</div><div class='del'>-		    int32_t op_errno,</div><div class='del'>-		    struct stat *buf);</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-@frame     - call frame which has to be used to resume the call at call_resume().</div><div class='del'>-@fn        - procedure to call during call_resume(). </div><div class='del'>-@op_ret    - op_ret parameter to @fn.</div><div class='del'>-@op_errno  - op_errno parameter to @fn.</div><div class='del'>-@buf       - buf parameter to @fn.</div><div class='del'>-	     NOTE: @buf is copied to a different memory location, if not NULL.</div><div class='del'>-call_stub_t *</div><div class='del'>-fop_fchown_cbk_stub (call_frame_t *frame,</div><div class='del'>-		     fop_fchown_cbk_t fn,</div><div class='del'>-		     int32_t op_ret,</div><div class='del'>-		     int32_t op_errno,</div><div class='del'>-		     struct stat *buf);</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-@frame     - call frame which has to be used to resume the call at call_resume().</div><div class='del'>-@fn        - procedure to call during call_resume(). </div><div class='del'>-@op_ret    - op_ret parameter to @fn.</div><div class='del'>-@op_errno  - op_errno parameter to @fn.</div><div class='del'>-@buf       - buf parameter to @fn.</div><div class='del'>-	     NOTE: @buf is copied to a different memory location, if not NULL.</div><div class='del'>-call_stub_t *</div><div class='del'>-fop_truncate_cbk_stub (call_frame_t *frame,</div><div class='del'>-		       fop_truncate_cbk_t fn,</div><div class='del'>-		       int32_t op_ret,</div><div class='del'>-		       int32_t op_errno,</div><div class='del'>-		       struct stat *buf);</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-@frame     - call frame which has to be used to resume the call at call_resume().</div><div class='del'>-@fn        - procedure to call during call_resume(). </div><div class='del'>-@op_ret    - op_ret parameter to @fn.</div><div class='del'>-@op_errno  - op_errno parameter to @fn.</div><div class='del'>-@buf       - buf parameter to @fn.</div><div class='del'>-	     NOTE: @buf is copied to a different memory location, if not NULL.</div><div class='del'>-call_stub_t *</div><div class='del'>-fop_ftruncate_cbk_stub (call_frame_t *frame,</div><div class='del'>-			fop_ftruncate_cbk_t fn,</div><div class='del'>-			int32_t op_ret,</div><div class='del'>-			int32_t op_errno,</div><div class='del'>-			struct stat *buf);</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-@frame     - call frame which has to be used to resume the call at call_resume().</div><div class='del'>-@fn        - procedure to call during call_resume(). </div><div class='del'>-@op_ret    - op_ret parameter to @fn.</div><div class='del'>-@op_errno  - op_errno parameter to @fn.</div><div class='del'>-@buf       - buf parameter to @fn.</div><div class='del'>-	     NOTE: @buf is copied to a different memory location, if not NULL.</div><div class='del'>-call_stub_t *</div><div class='del'>-fop_utimens_cbk_stub (call_frame_t *frame,</div><div class='del'>-		      fop_utimens_cbk_t fn,</div><div class='del'>-		      int32_t op_ret,</div><div class='del'>-		      int32_t op_errno,</div><div class='del'>-		      struct stat *buf);</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-@frame     - call frame which has to be used to resume the call at call_resume().</div><div class='del'>-@fn        - procedure to call during call_resume(). </div><div class='del'>-@op_ret    - op_ret parameter to @fn.</div><div class='del'>-@op_errno  - op_errno parameter to @fn.</div><div class='del'>-call_stub_t *</div><div class='del'>-fop_access_cbk_stub (call_frame_t *frame,</div><div class='del'>-		     fop_access_cbk_t fn,</div><div class='del'>-		     int32_t op_ret,</div><div class='del'>-		     int32_t op_errno);</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-@frame     - call frame which has to be used to resume the call at call_resume().</div><div class='del'>-@fn        - procedure to call during call_resume(). </div><div class='del'>-@op_ret    - op_ret parameter to @fn.</div><div class='del'>-@op_errno  - op_errno parameter to @fn.</div><div class='del'>-@path      - path parameter to @fn.</div><div class='del'>-	     NOTE: @path is copied to a different memory location, if not NULL.</div><div class='del'>-call_stub_t *</div><div class='del'>-fop_readlink_cbk_stub (call_frame_t *frame,</div><div class='del'>-		       fop_readlink_cbk_t fn,</div><div class='del'>-		       int32_t op_ret,</div><div class='del'>-		       int32_t op_errno,</div><div class='del'>-		       const char *path);</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-@frame     - call frame which has to be used to resume the call at call_resume().</div><div class='del'>-@fn        - procedure to call during call_resume(). </div><div class='del'>-@op_ret    - op_ret parameter to @fn.</div><div class='del'>-@op_errno  - op_errno parameter to @fn.</div><div class='del'>-@inode     - inode parameter to @fn.</div><div class='del'>-	     NOTE: @inode pointer is stored with a inode_ref().</div><div class='del'>-@buf       - buf parameter to @fn.</div><div class='del'>-	     NOTE: @buf is copied to a different memory location, if not NULL.</div><div class='del'>-call_stub_t *</div><div class='del'>-fop_mknod_cbk_stub (call_frame_t *frame,</div><div class='del'>-		    fop_mknod_cbk_t fn,</div><div class='del'>-		    int32_t op_ret,</div><div class='del'>-		    int32_t op_errno,</div><div class='del'>-		    inode_t *inode,</div><div class='del'>-		    struct stat *buf);</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-@frame     - call frame which has to be used to resume the call at call_resume().</div><div class='del'>-@fn        - procedure to call during call_resume(). </div><div class='del'>-@op_ret    - op_ret parameter to @fn.</div><div class='del'>-@op_errno  - op_errno parameter to @fn.</div><div class='del'>-@inode     - inode parameter to @fn.</div><div class='del'>-	     NOTE: @inode pointer is stored with a inode_ref().</div><div class='del'>-@buf       - buf parameter to @fn.</div><div class='del'>-	     NOTE: @buf is copied to a different memory location, if not NULL.</div><div class='del'>-call_stub_t *</div><div class='del'>-fop_mkdir_cbk_stub (call_frame_t *frame,</div><div class='del'>-		    fop_mkdir_cbk_t fn,</div><div class='del'>-		    int32_t op_ret,</div><div class='del'>-		    int32_t op_errno,</div><div class='del'>-		    inode_t *inode,</div><div class='del'>-		    struct stat *buf);</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-@frame     - call frame which has to be used to resume the call at call_resume().</div><div class='del'>-@fn        - procedure to call during call_resume(). </div><div class='del'>-@op_ret    - op_ret parameter to @fn.</div><div class='del'>-@op_errno  - op_errno parameter to @fn.</div><div class='del'>-call_stub_t *</div><div class='del'>-fop_unlink_cbk_stub (call_frame_t *frame,</div><div class='del'>-		     fop_unlink_cbk_t fn,</div><div class='del'>-		     int32_t op_ret,</div><div class='del'>-		     int32_t op_errno);</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-@frame     - call frame which has to be used to resume the call at call_resume().</div><div class='del'>-@fn        - procedure to call during call_resume(). </div><div class='del'>-@op_ret    - op_ret parameter to @fn.</div><div class='del'>-@op_errno  - op_errno parameter to @fn.</div><div class='del'>-call_stub_t *</div><div class='del'>-fop_rmdir_cbk_stub (call_frame_t *frame,</div><div class='del'>-		    fop_rmdir_cbk_t fn,</div><div class='del'>-		    int32_t op_ret,</div><div class='del'>-		    int32_t op_errno);</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-@frame     - call frame which has to be used to resume the call at call_resume().</div><div class='del'>-@fn        - procedure to call during call_resume(). </div><div class='del'>-@op_ret    - op_ret parameter to @fn.</div><div class='del'>-@op_errno  - op_errno parameter to @fn.</div><div class='del'>-@inode     - inode parameter to @fn.</div><div class='del'>-	     NOTE: @inode pointer is stored with a inode_ref().</div><div class='del'>-@buf       - buf parameter to @fn.</div><div class='del'>-	     NOTE: @buf is copied to a different memory location, if not NULL.</div><div class='del'>-call_stub_t *</div><div class='del'>-fop_symlink_cbk_stub (call_frame_t *frame,</div><div class='del'>-		      fop_symlink_cbk_t fn,</div><div class='del'>-		      int32_t op_ret,</div><div class='del'>-		      int32_t op_errno,</div><div class='del'>-		      inode_t *inode,</div><div class='del'>-		      struct stat *buf);</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-@frame     - call frame which has to be used to resume the call at call_resume().</div><div class='del'>-@fn        - procedure to call during call_resume(). </div><div class='del'>-@op_ret    - op_ret parameter to @fn.</div><div class='del'>-@op_errno  - op_errno parameter to @fn.</div><div class='del'>-@buf       - buf parameter to @fn.</div><div class='del'>-	     NOTE: @buf is copied to a different memory location, if not NULL.</div><div class='del'>-call_stub_t *</div><div class='del'>-fop_rename_cbk_stub (call_frame_t *frame,</div><div class='del'>-		     fop_rename_cbk_t fn,</div><div class='del'>-		     int32_t op_ret,</div><div class='del'>-		     int32_t op_errno,</div><div class='del'>-		     struct stat *buf);</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-@frame     - call frame which has to be used to resume the call at call_resume().</div><div class='del'>-@fn        - procedure to call during call_resume(). </div><div class='del'>-@op_ret    - op_ret parameter to @fn.</div><div class='del'>-@op_errno  - op_errno parameter to @fn.</div><div class='del'>-@inode     - inode parameter to @fn.</div><div class='del'>-	     NOTE: @inode pointer is stored with a inode_ref().</div><div class='del'>-@buf       - buf parameter to @fn.</div><div class='del'>-	     NOTE: @buf is copied to a different memory location, if not NULL.</div><div class='del'>-call_stub_t *</div><div class='del'>-fop_link_cbk_stub (call_frame_t *frame,</div><div class='del'>-		   fop_link_cbk_t fn,</div><div class='del'>-		   int32_t op_ret,</div><div class='del'>-		   int32_t op_errno,</div><div class='del'>-		   inode_t *inode,</div><div class='del'>-		   struct stat *buf);</div><div class='del'>-</div><div class='del'>-@frame     - call frame which has to be used to resume the call at call_resume().</div><div class='del'>-@fn        - procedure to call during call_resume(). </div><div class='del'>-@op_ret    - op_ret parameter to @fn.</div><div class='del'>-@op_errno  - op_errno parameter to @fn.</div><div class='del'>-@fd        - fd parameter to @fn.</div><div class='del'>-	     NOTE: @fd pointer is stored with a fd_ref().</div><div class='del'>-@inode     - inode parameter to @fn.</div><div class='del'>-	     NOTE: @inode pointer is stored with a inode_ref().</div><div class='del'>-@buf       - buf parameter to @fn.</div><div class='del'>-	     NOTE: @buf is copied to a different memory location, if not NULL.</div><div class='del'>-call_stub_t *</div><div class='del'>-fop_create_cbk_stub (call_frame_t *frame,</div><div class='del'>-		     fop_create_cbk_t fn,</div><div class='del'>-		     int32_t op_ret,</div><div class='del'>-		     int32_t op_errno,</div><div class='del'>-		     fd_t *fd,</div><div class='del'>-		     inode_t *inode,</div><div class='del'>-		     struct stat *buf);</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-@frame     - call frame which has to be used to resume the call at call_resume().</div><div class='del'>-@fn        - procedure to call during call_resume(). </div><div class='del'>-@op_ret    - op_ret parameter to @fn.</div><div class='del'>-@op_errno  - op_errno parameter to @fn.</div><div class='del'>-@fd        - fd parameter to @fn.</div><div class='del'>-	     NOTE: @fd pointer is stored with a fd_ref().</div><div class='del'>-call_stub_t *</div><div class='del'>-fop_open_cbk_stub (call_frame_t *frame,</div><div class='del'>-		   fop_open_cbk_t fn,</div><div class='del'>-		   int32_t op_ret,</div><div class='del'>-		   int32_t op_errno,</div><div class='del'>-		   fd_t *fd);</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-@frame     - call frame which has to be used to resume the call at call_resume().</div><div class='del'>-@fn        - procedure to call during call_resume(). </div><div class='del'>-@op_ret    - op_ret parameter to @fn.</div><div class='del'>-@op_errno  - op_errno parameter to @fn.</div><div class='del'>-@vector    - vector parameter to @fn.	</div><div class='del'>-	     NOTE: @vector is copied to a different memory location, if not NULL. also</div><div class='del'>-	           frame-&gt;root-&gt;rsp_refs is dict_ref()ed.</div><div class='del'>-@stbuf     - stbuf parameter to @fn.</div><div class='del'>-	     NOTE: @stbuf is copied to a different memory location, if not NULL.</div><div class='del'>-call_stub_t *</div><div class='del'>-fop_readv_cbk_stub (call_frame_t *frame,</div><div class='del'>-		    fop_readv_cbk_t fn,</div><div class='del'>-		    int32_t op_ret,</div><div class='del'>-		    int32_t op_errno,</div><div class='del'>-		    struct iovec *vector,</div><div class='del'>-		    int32_t count,</div><div class='del'>-		    struct stat *stbuf);</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-@frame     - call frame which has to be used to resume the call at call_resume().</div><div class='del'>-@fn        - procedure to call during call_resume(). </div><div class='del'>-@op_ret    - op_ret parameter to @fn.</div><div class='del'>-@op_errno  - op_errno parameter to @fn.</div><div class='del'>-@stbuf     - stbuf parameter to @fn.</div><div class='del'>-	     NOTE: @stbuf is copied to a different memory location, if not NULL.</div><div class='del'>-call_stub_t *</div><div class='del'>-fop_writev_cbk_stub (call_frame_t *frame,</div><div class='del'>-		     fop_writev_cbk_t fn,</div><div class='del'>-		     int32_t op_ret,</div><div class='del'>-		     int32_t op_errno,</div><div class='del'>-		     struct stat *stbuf);</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-@frame     - call frame which has to be used to resume the call at call_resume().</div><div class='del'>-@fn        - procedure to call during call_resume(). </div><div class='del'>-@op_ret    - op_ret parameter to @fn.</div><div class='del'>-@op_errno  - op_errno parameter to @fn.</div><div class='del'>-call_stub_t *</div><div class='del'>-fop_flush_cbk_stub (call_frame_t *frame,</div><div class='del'>-		    fop_flush_cbk_t fn,</div><div class='del'>-		    int32_t op_ret,</div><div class='del'>-		    int32_t op_errno);</div><div class='del'>-</div><div class='del'>-@frame     - call frame which has to be used to resume the call at call_resume().</div><div class='del'>-@fn        - procedure to call during call_resume(). </div><div class='del'>-@op_ret    - op_ret parameter to @fn.</div><div class='del'>-@op_errno  - op_errno parameter to @fn.</div><div class='del'>-call_stub_t *</div><div class='del'>-fop_fsync_cbk_stub (call_frame_t *frame,</div><div class='del'>-		    fop_fsync_cbk_t fn,</div><div class='del'>-		    int32_t op_ret,</div><div class='del'>-		    int32_t op_errno);</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-@frame     - call frame which has to be used to resume the call at call_resume().</div><div class='del'>-@fn        - procedure to call during call_resume(). </div><div class='del'>-@op_ret    - op_ret parameter to @fn.</div><div class='del'>-@op_errno  - op_errno parameter to @fn.</div><div class='del'>-@fd        - fd parameter to @fn.</div><div class='del'>-	     NOTE: @fd pointer is stored with a fd_ref().</div><div class='del'>-call_stub_t *</div><div class='del'>-fop_opendir_cbk_stub (call_frame_t *frame,</div><div class='del'>-		      fop_opendir_cbk_t fn,</div><div class='del'>-		      int32_t op_ret,</div><div class='del'>-		      int32_t op_errno,</div><div class='del'>-		      fd_t *fd);</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-@frame     - call frame which has to be used to resume the call at call_resume().</div><div class='del'>-@fn        - procedure to call during call_resume(). </div><div class='del'>-@op_ret    - op_ret parameter to @fn.</div><div class='del'>-@op_errno  - op_errno parameter to @fn.</div><div class='del'>-@entries   - entries parameter to @fn.</div><div class='del'>-@count     - count parameter to @fn.</div><div class='del'>-call_stub_t *</div><div class='del'>-fop_getdents_cbk_stub (call_frame_t *frame,</div><div class='del'>-		      fop_getdents_cbk_t fn,</div><div class='del'>-		      int32_t op_ret,</div><div class='del'>-		      int32_t op_errno,</div><div class='del'>-		      dir_entry_t *entries,</div><div class='del'>-		      int32_t count);</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-@frame     - call frame which has to be used to resume the call at call_resume().</div><div class='del'>-@fn        - procedure to call during call_resume(). </div><div class='del'>-@op_ret    - op_ret parameter to @fn.</div><div class='del'>-@op_errno  - op_errno parameter to @fn.</div><div class='del'>-call_stub_t *</div><div class='del'>-fop_setdents_cbk_stub (call_frame_t *frame,</div><div class='del'>-		       fop_setdents_cbk_t fn,</div><div class='del'>-		       int32_t op_ret,</div><div class='del'>-		       int32_t op_errno);</div><div class='del'>-</div><div class='del'>-@frame     - call frame which has to be used to resume the call at call_resume().</div><div class='del'>-@fn        - procedure to call during call_resume(). </div><div class='del'>-@op_ret    - op_ret parameter to @fn.</div><div class='del'>-@op_errno  - op_errno parameter to @fn.</div><div class='del'>-call_stub_t *</div><div class='del'>-fop_fsyncdir_cbk_stub (call_frame_t *frame,</div><div class='del'>-		       fop_fsyncdir_cbk_t fn,</div><div class='del'>-		       int32_t op_ret,</div><div class='del'>-		       int32_t op_errno);</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-@frame     - call frame which has to be used to resume the call at call_resume().</div><div class='del'>-@fn        - procedure to call during call_resume(). </div><div class='del'>-@op_ret    - op_ret parameter to @fn.</div><div class='del'>-@op_errno  - op_errno parameter to @fn.</div><div class='del'>-@buf       - buf parameter to @fn.</div><div class='del'>-	     NOTE: @buf is copied to a different memory location, if not NULL.</div><div class='del'>-call_stub_t *</div><div class='del'>-fop_statfs_cbk_stub (call_frame_t *frame,</div><div class='del'>-		     fop_statfs_cbk_t fn,</div><div class='del'>-		     int32_t op_ret,</div><div class='del'>-		     int32_t op_errno,</div><div class='del'>-		     struct statvfs *buf);</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-@frame     - call frame which has to be used to resume the call at call_resume().</div><div class='del'>-@fn        - procedure to call during call_resume(). </div><div class='del'>-@op_ret    - op_ret parameter to @fn.</div><div class='del'>-@op_errno  - op_errno parameter to @fn.</div><div class='del'>-call_stub_t *</div><div class='del'>-fop_setxattr_cbk_stub (call_frame_t *frame,</div><div class='del'>-		       fop_setxattr_cbk_t fn,</div><div class='del'>-		       int32_t op_ret,</div><div class='del'>-		       int32_t op_errno);</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-@frame     - call frame which has to be used to resume the call at call_resume().</div><div class='del'>-@fn        - procedure to call during call_resume(). </div><div class='del'>-@op_ret    - op_ret parameter to @fn.</div><div class='del'>-@op_errno  - op_errno parameter to @fn.</div><div class='del'>-@value     - value dictionary parameter to @fn.</div><div class='del'>-	     NOTE: @value pointer is stored with a dict_ref().</div><div class='del'>-call_stub_t *</div><div class='del'>-fop_getxattr_cbk_stub (call_frame_t *frame,</div><div class='del'>-		       fop_getxattr_cbk_t fn,</div><div class='del'>-		       int32_t op_ret,</div><div class='del'>-		       int32_t op_errno,</div><div class='del'>-		       dict_t *value);</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-@frame     - call frame which has to be used to resume the call at call_resume().</div><div class='del'>-@fn        - procedure to call during call_resume(). </div><div class='del'>-@op_ret    - op_ret parameter to @fn.</div><div class='del'>-@op_errno  - op_errno parameter to @fn.</div><div class='del'>-call_stub_t *</div><div class='del'>-fop_removexattr_cbk_stub (call_frame_t *frame,</div><div class='del'>-			  fop_removexattr_cbk_t fn,</div><div class='del'>-			  int32_t op_ret,</div><div class='del'>-			  int32_t op_errno);</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-@frame    - call frame which has to be used to resume the call at call_resume().</div><div class='del'>-@fn       - procedure to call during call_resume(). </div><div class='del'>-@op_ret   - op_ret parameter to @fn.</div><div class='del'>-@op_errno - op_errno parameter to @fn.</div><div class='del'>-@lock     - lock parameter to @fn.</div><div class='del'>-	    NOTE: @lock is copied to a different memory location while creating</div><div class='del'>-	          stub. </div><div class='del'>-call_stub_t *</div><div class='del'>-fop_lk_cbk_stub (call_frame_t *frame,</div><div class='del'>-		 fop_lk_cbk_t fn,</div><div class='del'>-		 int32_t op_ret,</div><div class='del'>-		 int32_t op_errno,</div><div class='del'>-		 struct flock *lock);</div><div class='del'>-</div><div class='del'>-@frame    - call frame which has to be used to resume the call at call_resume().</div><div class='del'>-@fn       - procedure to call during call_resume(). </div><div class='del'>-@op_ret   - op_ret parameter to @fn.</div><div class='del'>-@op_errno - op_errno parameter to @fn.</div><div class='del'>-@lock     - lock parameter to @fn.</div><div class='del'>-	    NOTE: @lock is copied to a different memory location while creating</div><div class='del'>-	          stub. </div><div class='del'>-call_stub_t *</div><div class='del'>-fop_gf_lk_cbk_stub (call_frame_t *frame,</div><div class='del'>-		    fop_gf_lk_cbk_t fn,</div><div class='del'>-		    int32_t op_ret,</div><div class='del'>-		    int32_t op_errno,</div><div class='del'>-		    struct flock *lock);</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-@frame    - call frame which has to be used to resume the call at call_resume().</div><div class='del'>-@fn       - procedure to call during call_resume(). </div><div class='del'>-@op_ret   - op_ret parameter to @fn.</div><div class='del'>-@op_errno - op_errno parameter to @fn.</div><div class='del'>-@entries  - entries parameter to @fn.</div><div class='del'>-call_stub_t *</div><div class='del'>-fop_readdir_cbk_stub (call_frame_t *frame,</div><div class='del'>-		      fop_readdir_cbk_t fn,</div><div class='del'>-		      int32_t op_ret,</div><div class='del'>-		      int32_t op_errno,</div><div class='del'>-		      gf_dirent_t *entries);</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-@frame         - call frame which has to be used to resume the call at call_resume().</div><div class='del'>-@fn            - procedure to call during call_resume(). </div><div class='del'>-@op_ret        - op_ret parameter to @fn.</div><div class='del'>-@op_errno      - op_errno parameter to @fn.</div><div class='del'>-@file_checksum - file_checksum parameter to @fn.</div><div class='del'>-                 NOTE: file_checksum will be copied to a different memory location </div><div class='del'>-		       while creating stub.</div><div class='del'>-@dir_checksum  - dir_checksum parameter to @fn.</div><div class='del'>-                 NOTE: file_checksum will be copied to a different memory location </div><div class='del'>-		       while creating stub.</div><div class='del'>-call_stub_t *</div><div class='del'>-fop_checksum_cbk_stub (call_frame_t *frame,</div><div class='del'>-		       fop_checksum_cbk_t fn,</div><div class='del'>-		       int32_t op_ret,</div><div class='del'>-		       int32_t op_errno,</div><div class='del'>-		       uint8_t *file_checksum,</div><div class='del'>-		       uint8_t *dir_checksum);</div><div class='del'>-</div><div class='del'>-resuming a call:</div><div class='del'>----------------</div><div class='del'>-  call can be resumed using call stub through call_resume API.</div><div class='del'>-</div><div class='del'>-  void call_resume (call_stub_t *stub);</div><div class='del'>-</div><div class='del'>-  stub - call stub created during pausing a call.</div><div class='del'>-</div><div class='del'>-  NOTE: call_resume() will decrease reference count of any fd_t, dict_t and inode_t that it finds</div><div class='del'>-        in  stub-&gt;args.&lt;operation&gt;.&lt;fd_t-or-inode_t-or-dict_t&gt;. so, if any fd_t, dict_t or</div><div class='del'>-	inode_t pointers are assigned at stub-&gt;args.&lt;operation&gt;.&lt;fd_t-or-inode_t-or-dict_t&gt; after</div><div class='del'>-	fop_&lt;operation&gt;_stub() call, they must be &lt;fd_t-or-inode_t-or-dict_t&gt;_ref()ed.</div><div class='del'>-	</div><div class='del'>-	call_resume does not STACK_DESTROY() for any fop.</div><div class='del'>-	</div><div class='del'>-  if stub-&gt;fn is NULL, call_resume does STACK_WIND() or STACK_UNWIND() using the stub-&gt;frame.</div><div class='del'>-</div><div class='del'>-  return - call resume fails only if stub is NULL. call resume fails with errno set to EINVAL.</div><div class='head'>diff --git a/doc/hacker-guide/hacker-guide.tex b/doc/hacker-guide/hacker-guide.tex<br/>deleted file mode 100644<br/>index 1330536f35c..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/doc/hacker-guide/hacker-guide.tex?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>doc/hacker-guide/hacker-guide.tex</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,309 +0,0 @@</div><div class='del'>-\documentclass{book}[12pt]</div><div class='del'>-\usepackage{graphicx}</div><div class='del'>-% \usepackage{fancyhdr}</div><div class='del'>-</div><div class='del'>-% \pagestyle{fancy}</div><div class='del'>-\begin{document}</div><div class='del'>-</div><div class='del'>-% \headheight 117pt</div><div class='del'>-% \rhead{\includegraphics{zr-logo.eps}}</div><div class='del'>-</div><div class='del'>-\author{Gluster}</div><div class='del'>-\title{GlusterFS 1.3 Hacker's Guide}</div><div class='del'>-\date{June 1, 2007}</div><div class='del'>-</div><div class='del'>-\maketitle</div><div class='del'>-\frontmatter</div><div class='del'>-\tableofcontents</div><div class='del'>-</div><div class='del'>-\mainmatter</div><div class='del'>-\chapter{Introduction}</div><div class='del'>-</div><div class='del'>-\section{Coding guidelines}</div><div class='del'>-GlusterFS uses Git for version control. To get the latest source do:</div><div class='del'>-\begin{verbatim}</div><div class='del'>-  $ git clone git://git.sv.gnu.org/gluster.git glusterfs</div><div class='del'>-\end{verbatim}</div><div class='del'>-\noindent</div><div class='del'>-GlusterFS follows the GNU coding</div><div class='del'>-standards\footnote{http://www.gnu.org/prep/standards\_toc.html} for the</div><div class='del'>-most part.</div><div class='del'>-</div><div class='del'>-\chapter{Major components}</div><div class='del'>-\section{libglusterfs}</div><div class='del'>-\texttt{libglusterfs} contains supporting code used by all the other components. </div><div class='del'>-The important files here are:</div><div class='del'>-</div><div class='del'>-\texttt{dict.c}: This is an implementation of a serializable dictionary type. It is</div><div class='del'>-used by the protocol code to send requests and replies. It is also used to pass options</div><div class='del'>-to translators.</div><div class='del'>-</div><div class='del'>-\texttt{logging.c}: This is a thread-safe logging library. The log messages go to a</div><div class='del'>-file (default \texttt{/usr/local/var/log/glusterfs/*}).</div><div class='del'>-</div><div class='del'>-\texttt{protocol.c}: This file implements the GlusterFS on-the-wire</div><div class='del'>-protocol. The protocol itself is a simple ASCII protocol, designed to</div><div class='del'>-be easy to parse and be human readable.</div><div class='del'>-</div><div class='del'>-A sample GlusterFS protocol block looks like this:</div><div class='del'>-\begin{verbatim}</div><div class='del'>-  Block Start                            header</div><div class='del'>-  0000000000000023                       callid</div><div class='del'>-  00000001                               type</div><div class='del'>-  00000016                               op</div><div class='del'>-  xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx       human-readable name</div><div class='del'>-  00000000000000000000000000000ac3       block size</div><div class='del'>-  &lt;...&gt;                                  block</div><div class='del'>-  Block End</div><div class='del'>-\end{verbatim}</div><div class='del'>-</div><div class='del'>-\texttt{stack.h}: This file defines the \texttt{STACK\_WIND} and</div><div class='del'>-\texttt{STACK\_UNWIND} macros which are used to implement the parallel</div><div class='del'>-stack that is maintained for inter-xlator calls. See the \textsl{Taking control</div><div class='del'>-of the stack} section below for more details.</div><div class='del'>-</div><div class='del'>-\texttt{spec.y}: This contains the Yacc grammar for the GlusterFS</div><div class='del'>-specification file, and the parsing code.</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-Draw diagrams of trees</div><div class='del'>-Two rules:</div><div class='del'>-(1) directory structure is same</div><div class='del'>-(2) file can exist only on one node</div><div class='del'>-</div><div class='del'>-\section{glusterfs-fuse}</div><div class='del'>-\section{glusterfsd}</div><div class='del'>-\section{transport}</div><div class='del'>-\section{scheduler}</div><div class='del'>-\section{xlator}</div><div class='del'>-</div><div class='del'>-\chapter{xlators}</div><div class='del'>-\section{Taking control of the stack}</div><div class='del'>-One can think of STACK\_WIND/UNWIND as a very specific RPC mechanism.</div><div class='del'>-</div><div class='del'>-% \includegraphics{stack.eps}</div><div class='del'>-</div><div class='del'>-\section{Overview of xlators}</div><div class='del'>-</div><div class='del'>-\flushleft{\LARGE\texttt{cluster/}}</div><div class='del'>-\vskip 2ex</div><div class='del'>-\flushleft{\Large\texttt{afr}}</div><div class='del'>-\vskip 2ex</div><div class='del'>-\flushleft{\Large\texttt{stripe}}</div><div class='del'>-\vskip 2ex</div><div class='del'>-\flushleft{\Large\texttt{unify}}</div><div class='del'>-</div><div class='del'>-\vskip 4ex</div><div class='del'>-\flushleft{\LARGE\texttt{debug/}}</div><div class='del'>-\vskip 2ex</div><div class='del'>-\flushleft{\Large\texttt{trace}}</div><div class='del'>-\vskip 2ex</div><div class='del'>-The trace xlator simply logs all fops and mops, and passes them through to its child.</div><div class='del'>-</div><div class='del'>-\vskip 4ex</div><div class='del'>-\flushleft{\LARGE\texttt{features/}}</div><div class='del'>-\flushleft{\Large\texttt{posix-locks}}</div><div class='del'>-\vskip 2ex</div><div class='del'>-This xlator implements \textsc{posix} record locking semantics over</div><div class='del'>-any kind of storage.</div><div class='del'>-</div><div class='del'>-\vskip 4ex</div><div class='del'>-\flushleft{\LARGE\texttt{performance/}}</div><div class='del'>-</div><div class='del'>-\flushleft{\Large\texttt{io-threads}}</div><div class='del'>-\vskip 2ex</div><div class='del'>-\flushleft{\Large\texttt{read-ahead}}</div><div class='del'>-\vskip 2ex</div><div class='del'>-\flushleft{\Large\texttt{stat-prefetch}}</div><div class='del'>-\vskip 2ex</div><div class='del'>-\flushleft{\Large\texttt{write-behind}}</div><div class='del'>-\vskip 2ex</div><div class='del'>-</div><div class='del'>-\vskip 4ex</div><div class='del'>-\flushleft{\LARGE\texttt{protocol/}}</div><div class='del'>-\vskip 2ex</div><div class='del'>-</div><div class='del'>-\flushleft{\Large\texttt{client}}</div><div class='del'>-\vskip 2ex</div><div class='del'>-</div><div class='del'>-\flushleft{\Large\texttt{server}}</div><div class='del'>-\vskip 2ex</div><div class='del'>-</div><div class='del'>-\vskip 4ex</div><div class='del'>-\flushleft{\LARGE\texttt{storage/}}</div><div class='del'>-\flushleft{\Large\texttt{posix}}</div><div class='del'>-\vskip 2ex</div><div class='del'>-The \texttt{posix} xlator is the one which actually makes calls to the</div><div class='del'>-on-disk filesystem. Currently this is the only storage xlator available. However,</div><div class='del'>-plans to develop other storage xlators, such as one for Amazon's S3 service, are</div><div class='del'>-on the roadmap.</div><div class='del'>-</div><div class='del'>-\chapter{Writing a simple xlator}</div><div class='del'>-\noindent</div><div class='del'>-In this section we're going to write a rot13 xlator. ``Rot13'' is a</div><div class='del'>-simple substitution cipher which obscures a text by replacing each</div><div class='del'>-letter with the letter thirteen places down the alphabet. So `a' (0)</div><div class='del'>-would become `n' (12), `b' would be 'm', and so on.  Rot13 applied to</div><div class='del'>-a piece of ciphertext yields the plaintext again, because rot13 is its</div><div class='del'>-own inverse, since:</div><div class='del'>-</div><div class='del'>-\[</div><div class='del'>-x_c = x + 13\; (mod\; 26)</div><div class='del'>-\]</div><div class='del'>-\[</div><div class='del'>-x_c + 13\; (mod\; 26) = x + 13 + 13\; (mod\; 26) = x</div><div class='del'>-\]</div><div class='del'>-</div><div class='del'>-First we include the requisite headers.</div><div class='del'>-</div><div class='del'>-\begin{verbatim}</div><div class='del'>-#include &lt;ctype.h&gt;</div><div class='del'>-#include &lt;sys/uio.h&gt;</div><div class='del'>-</div><div class='del'>-#include "glusterfs.h"</div><div class='del'>-#include "xlator.h"</div><div class='del'>-#include "logging.h"</div><div class='del'>-</div><div class='del'>-/*</div><div class='del'>- * This is a rot13 ``encryption'' xlator. It rot13's data when </div><div class='del'>- * writing to disk and rot13's it back when reading it. </div><div class='del'>- * This xlator is meant as an example, not for production</div><div class='del'>- *  use ;) (hence no error-checking)</div><div class='del'>- */</div><div class='del'>-</div><div class='del'>-\end{verbatim}</div><div class='del'>-</div><div class='del'>-Then we write the rot13 function itself. For simplicity, we only transform lower case</div><div class='del'>-letters. Any other byte is passed through as it is.</div><div class='del'>-</div><div class='del'>-\begin{verbatim}</div><div class='del'>-/* We only handle lower case letters for simplicity */</div><div class='del'>-static void </div><div class='del'>-rot13 (char *buf, int len)</div><div class='del'>-{</div><div class='del'>-  int i;</div><div class='del'>-  for (i = 0; i &lt; len; i++) {</div><div class='del'>-    if (isalpha (buf[i]))</div><div class='del'>-      buf[i] = (buf[i] - 'a' + 13) % 26;</div><div class='del'>-    else if (buf[i] &lt;= 26)</div><div class='del'>-      buf[i] = (buf[i] + 13) % 26 + 'a';</div><div class='del'>-  }</div><div class='del'>-}</div><div class='del'>-\end{verbatim}</div><div class='del'>-</div><div class='del'>-Next comes a utility function whose purpose will be clear after looking at the code</div><div class='del'>-below.</div><div class='del'>-</div><div class='del'>-\begin{verbatim}</div><div class='del'>-static void</div><div class='del'>-rot13_iovec (struct iovec *vector, int count)</div><div class='del'>-{</div><div class='del'>-  int i;</div><div class='del'>-  for (i = 0; i &lt; count; i++) {</div><div class='del'>-    rot13 (vector[i].iov_base, vector[i].iov_len);</div><div class='del'>-  }</div><div class='del'>-}</div><div class='del'>-\end{verbatim}</div><div class='del'>-</div><div class='del'>-\begin{verbatim}</div><div class='del'>-static int32_t</div><div class='del'>-rot13_readv_cbk (call_frame_t *frame,</div><div class='del'>-                 call_frame_t *prev_frame,</div><div class='del'>-                 xlator_t *this,</div><div class='del'>-                 int32_t op_ret,</div><div class='del'>-                 int32_t op_errno,</div><div class='del'>-                 struct iovec *vector,</div><div class='del'>-                 int32_t count)</div><div class='del'>-{</div><div class='del'>-  rot13_iovec (vector, count);</div><div class='del'>-</div><div class='del'>-  STACK_UNWIND (frame, op_ret, op_errno, vector, count);</div><div class='del'>-  return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-static int32_t</div><div class='del'>-rot13_readv (call_frame_t *frame,</div><div class='del'>-             xlator_t *this,</div><div class='del'>-             dict_t *ctx,</div><div class='del'>-             size_t size,</div><div class='del'>-             off_t offset)</div><div class='del'>-{</div><div class='del'>-  STACK_WIND (frame,</div><div class='del'>-              rot13_readv_cbk,</div><div class='del'>-              FIRST_CHILD (this),</div><div class='del'>-              FIRST_CHILD (this)-&gt;fops-&gt;readv,</div><div class='del'>-              ctx, size, offset);</div><div class='del'>-  return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-static int32_t</div><div class='del'>-rot13_writev_cbk (call_frame_t *frame,</div><div class='del'>-                  call_frame_t *prev_frame,</div><div class='del'>-                  xlator_t *this,</div><div class='del'>-                  int32_t op_ret,</div><div class='del'>-                  int32_t op_errno)</div><div class='del'>-{</div><div class='del'>-  STACK_UNWIND (frame, op_ret, op_errno);</div><div class='del'>-  return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-static int32_t</div><div class='del'>-rot13_writev (call_frame_t *frame,</div><div class='del'>-              xlator_t *this,</div><div class='del'>-              dict_t *ctx,</div><div class='del'>-              struct iovec *vector,</div><div class='del'>-              int32_t count, </div><div class='del'>-              off_t offset)</div><div class='del'>-{</div><div class='del'>-  rot13_iovec (vector, count);</div><div class='del'>-</div><div class='del'>-  STACK_WIND (frame, </div><div class='del'>-              rot13_writev_cbk,</div><div class='del'>-              FIRST_CHILD (this),</div><div class='del'>-              FIRST_CHILD (this)-&gt;fops-&gt;writev,</div><div class='del'>-              ctx, vector, count, offset);</div><div class='del'>-  return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-\end{verbatim}</div><div class='del'>-</div><div class='del'>-Every xlator must define two functions and two external symbols. The functions are </div><div class='del'>-\texttt{init} and \texttt{fini}, and the symbols are \texttt{fops} and \texttt{mops}.</div><div class='del'>-The \texttt{init} function is called when the xlator is loaded by GlusterFS, and </div><div class='del'>-contains code for the xlator to initialize itself. Note that if an xlator is present</div><div class='del'>-multiple times in the spec tree, the \texttt{init} function will be called each time</div><div class='del'>-the xlator is loaded.</div><div class='del'>-</div><div class='del'>-\begin{verbatim}</div><div class='del'>-int32_t</div><div class='del'>-init (xlator_t *this)</div><div class='del'>-{</div><div class='del'>-  if (!this-&gt;children) {</div><div class='del'>-    gf_log ("rot13", GF_LOG_ERROR, </div><div class='del'>-            "FATAL: rot13 should have exactly one child");</div><div class='del'>-    return -1;</div><div class='del'>-  }</div><div class='del'>-</div><div class='del'>-  gf_log ("rot13", GF_LOG_DEBUG, "rot13 xlator loaded");</div><div class='del'>-  return 0;</div><div class='del'>-}</div><div class='del'>-\end{verbatim}</div><div class='del'>-</div><div class='del'>-\begin{verbatim}</div><div class='del'>-</div><div class='del'>-void </div><div class='del'>-fini (xlator_t *this)</div><div class='del'>-{</div><div class='del'>-  return;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-struct xlator_fops fops = {</div><div class='del'>-  .readv        = rot13_readv,</div><div class='del'>-  .writev       = rot13_writev</div><div class='del'>-};</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-\end{verbatim}</div><div class='del'>-</div><div class='del'>-\end{document}</div><div class='del'>-</div><div class='head'>diff --git a/doc/hacker-guide/lock-ahead.txt b/doc/hacker-guide/lock-ahead.txt<br/>deleted file mode 100644<br/>index 63392b7fa2c..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/doc/hacker-guide/lock-ahead.txt?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>doc/hacker-guide/lock-ahead.txt</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,80 +0,0 @@</div><div class='del'>-			Lock-ahead translator</div><div class='del'>-                        ---------------------</div><div class='del'>-</div><div class='del'>-The objective of the lock-ahead translator is to speculatively</div><div class='del'>-hold locks (inodelk and entrylk) on the universal set (0 - infinity</div><div class='del'>-in case of inodelk and all basenames in case of entrylk) even</div><div class='del'>-when a lock is requested only on a subset, in anticipation that</div><div class='del'>-further locks will be requested within the same universal set.</div><div class='del'>-</div><div class='del'>-So, for example, when cluster/replicate locks a region before</div><div class='del'>-writing to it, lock-ahead would instead lock the entire file.</div><div class='del'>-On further writes, lock-ahead can immediately return success for </div><div class='del'>-the lock requests, since the entire file has been previously locked.</div><div class='del'>-</div><div class='del'>-To avoid starvation of other clients/mountpoints, we employ a</div><div class='del'>-notify mechanism, described below.</div><div class='del'>-</div><div class='del'>-typedef struct {</div><div class='del'>-        struct list_head subset_locks;</div><div class='del'>-} la_universal_lock_t;</div><div class='del'>-</div><div class='del'>-Universal lock structure is stored in the inode context.</div><div class='del'>-</div><div class='del'>-typedef struct {</div><div class='del'>-	enum {LOCK_AHEAD_ENTRYLK, LOCK_AHEAD_FENTRYLK,</div><div class='del'>-              LOCK_AHEAD_INODELK, LOCK_AHEAD_FINODELK};</div><div class='del'>-</div><div class='del'>-        union {</div><div class='del'>-	      fd_t *fd;</div><div class='del'>-              loc_t loc;</div><div class='del'>-	};</div><div class='del'>-</div><div class='del'>-	off_t l_start;</div><div class='del'>-        off_t l_len;</div><div class='del'>-</div><div class='del'>-	const char *basename;</div><div class='del'>-</div><div class='del'>-	struct list_head universal_lock;</div><div class='del'>-} la_subset_lock_t;</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-fops implemented:</div><div class='del'>-</div><div class='del'>-* inodelk/finodelk/entrylk/fentrylk:</div><div class='del'>-</div><div class='del'>-lock:</div><div class='del'>-  if universal lock held:</div><div class='del'>-    add subset to it (save loc_t or fd) and return success</div><div class='del'>-  else:</div><div class='del'>-    send lock-notify fop</div><div class='del'>-    hold universal lock and return</div><div class='del'>-      (set inode context, add subset to it, save loc_t or fd)</div><div class='del'>-    </div><div class='del'>-    if this fails:</div><div class='del'>-      forward the lock request</div><div class='del'>-</div><div class='del'>-unlock:</div><div class='del'>-  if subset exists in universal lock:</div><div class='del'>-    delete subset lock from list</div><div class='del'>-  else:</div><div class='del'>-    forward it</div><div class='del'>-</div><div class='del'>-* release:</div><div class='del'>-    hold subset locks (each subset lock using the saved loc_t or fd)</div><div class='del'>-    and release universal lock</div><div class='del'>-</div><div class='del'>-* lock-notify (on unwind) (new fop)</div><div class='del'>-    hold subset locks and release universal lock</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-lock-notify in locks translator:</div><div class='del'>-</div><div class='del'>-if a subset lock in entrylk/inodelk cannot be satisfied</div><div class='del'>-because of a universal lock held by someone else:</div><div class='del'>-    unwind the lock-notify fop</div><div class='del'>-</div><div class='del'>-==============================================</div><div class='del'>-$ Last updated: Tue Feb 17 11:31:18 IST 2009 $</div><div class='del'>-$ Author: Vikas Gorur &lt;vikas@gluster.com&gt;  $</div><div class='del'>-==============================================</div><div class='head'>diff --git a/doc/hacker-guide/posix.txt b/doc/hacker-guide/posix.txt<br/>deleted file mode 100644<br/>index d0132abfedc..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/doc/hacker-guide/posix.txt?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>doc/hacker-guide/posix.txt</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,59 +0,0 @@</div><div class='del'>----------------</div><div class='del'>-* storage/posix</div><div class='del'>----------------</div><div class='del'>-</div><div class='del'>-- SET_FS_ID</div><div class='del'>-</div><div class='del'>-  This is so that all filesystem checks are done with the user's </div><div class='del'>-  uid/gid and not GlusterFS's uid/gid.</div><div class='del'>-</div><div class='del'>-- MAKE_REAL_PATH</div><div class='del'>- </div><div class='del'>-  This macro concatenates the base directory of the posix volume</div><div class='del'>-  ('option directory') with the given path.</div><div class='del'>-</div><div class='del'>-- need_xattr in lookup</div><div class='del'>-</div><div class='del'>-  If this flag is passed, lookup returns a xattr dictionary that contains</div><div class='del'>-  the file's create time, the file's contents, and the version number</div><div class='del'>-  of the file.</div><div class='del'>-</div><div class='del'>-  This is a hack to increase small file performance. If an application </div><div class='del'>-  wants to read a small file, it can finish its job with just a lookup </div><div class='del'>-  call instead of a lookup followed by read.</div><div class='del'>-</div><div class='del'>-- getdents/setdents</div><div class='del'>-</div><div class='del'>-  These are used by unify to set and get directory entries.</div><div class='del'>-</div><div class='del'>-- ALIGN_BUF</div><div class='del'>-  </div><div class='del'>-  Macro to align an address to a page boundary (4K).</div><div class='del'>-</div><div class='del'>-- priv-&gt;export_statfs</div><div class='del'>-</div><div class='del'>-  In some cases, two exported volumes may reside on the same</div><div class='del'>-  partition on the server. Sending statvfs info for both</div><div class='del'>-  the volumes will lead to erroneous df output at the client,</div><div class='del'>-  since free space on the partition will be counted twice.</div><div class='del'>-</div><div class='del'>-  In such cases, user can disable exporting statvfs info</div><div class='del'>-  on one of the volumes by setting this option.</div><div class='del'>-</div><div class='del'>-- xattrop</div><div class='del'>-</div><div class='del'>-  This fop is used by replicate to set version numbers on files. </div><div class='del'>-</div><div class='del'>-- getxattr/setxattr hack to read/write files</div><div class='del'>-</div><div class='del'>-  A key, GLUSTERFS_FILE_CONTENT_STRING, is handled in a special way by</div><div class='del'>-  getxattr/setxattr. A getxattr with the key will return the entire</div><div class='del'>-  content of the file as the value. A setxattr with the key will write</div><div class='del'>-  the value as the entire content of the file.</div><div class='del'>-</div><div class='del'>-- posix_checksum</div><div class='del'>-  </div><div class='del'>-  This calculates a simple XOR checksum on all entry names in a</div><div class='del'>-  directory that is used by unify to compare directory contents.</div><div class='del'>-</div><div class='del'>-</div><div class='head'>diff --git a/doc/hacker-guide/replicate.txt b/doc/hacker-guide/replicate.txt<br/>deleted file mode 100644<br/>index fd1ef2747f0..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/doc/hacker-guide/replicate.txt?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>doc/hacker-guide/replicate.txt</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,206 +0,0 @@</div><div class='del'>----------------</div><div class='del'>-* cluster/replicate</div><div class='del'>----------------</div><div class='del'>-</div><div class='del'>-Before understanding replicate, one must understand two internal FOPs:</div><div class='del'>-</div><div class='del'>-GF_FILE_LK:</div><div class='del'>-  This is exactly like fcntl(2) locking, except the locks are in a </div><div class='del'>-  separate domain from locks held by applications.</div><div class='del'>-</div><div class='del'>-GF_DIR_LK (loc_t *loc, char *basename):</div><div class='del'>-  This allows one to lock a name under a directory. For example,</div><div class='del'>-  to lock /mnt/glusterfs/foo, one would use the call:</div><div class='del'>-</div><div class='del'>-  GF_DIR_LK ({loc_t for "/mnt/glusterfs"}, "foo")</div><div class='del'>-</div><div class='del'>-  If one wishes to lock *all* the names under a particular directory,</div><div class='del'>-  supply the basename argument as NULL.</div><div class='del'>-</div><div class='del'>-  The locks can either be read locks or write locks; consult the </div><div class='del'>-  function prototype for more details.</div><div class='del'>-</div><div class='del'>-Both these operations are implemented by the features/locks (earlier</div><div class='del'>-known as posix-locks) translator.</div><div class='del'>-</div><div class='del'>---------------</div><div class='del'>-* Basic design</div><div class='del'>---------------</div><div class='del'>-</div><div class='del'>-All FOPs can be classified into four major groups:</div><div class='del'>-</div><div class='del'>- - inode-read</div><div class='del'>-   Operations that read an inode's data (file contents) or metadata (perms, etc.).</div><div class='del'>-</div><div class='del'>-   access, getxattr, fstat, readlink, readv, stat.</div><div class='del'>-</div><div class='del'>- - inode-write</div><div class='del'>-   Operations that modify an inode's data or metadata.</div><div class='del'>-</div><div class='del'>-   chmod, chown, truncate, writev, utimens.</div><div class='del'>-</div><div class='del'>- - dir-read</div><div class='del'>-   Operations that read a directory's contents or metadata.</div><div class='del'>-</div><div class='del'>-   readdir, getdents, checksum.</div><div class='del'>-</div><div class='del'>- - dir-write</div><div class='del'>-   Operations that modify a directory's contents or metadata.</div><div class='del'>-</div><div class='del'>-   create, link, mkdir, mknod, rename, rmdir, symlink, unlink.</div><div class='del'>-</div><div class='del'>-   Some of these make a subgroup in that they modify *two* different entries:</div><div class='del'>-        link, rename, symlink.</div><div class='del'>-</div><div class='del'>- - Others</div><div class='del'>-   Other operations.</div><div class='del'>-</div><div class='del'>-   flush, lookup, open, opendir, statfs.</div><div class='del'>-</div><div class='del'>-------------</div><div class='del'>-* Algorithms</div><div class='del'>-------------</div><div class='del'>-</div><div class='del'>-Each of the four major groups has its own algorithm:</div><div class='del'>-</div><div class='del'>- ----------------------</div><div class='del'>- - inode-read, dir-read</div><div class='del'>- ----------------------</div><div class='del'>-</div><div class='del'>- = Send a request to the first child that is up:</div><div class='del'>-   - if it fails:</div><div class='del'>-       try the next available child</div><div class='del'>-   - if we have exhausted all children:</div><div class='del'>-       return failure</div><div class='del'>-</div><div class='del'>- -------------</div><div class='del'>- - inode-write</div><div class='del'>- -------------</div><div class='del'>-</div><div class='del'>- All operations are done in parallel unless specified otherwise.</div><div class='del'>-</div><div class='del'>- (1) Send a GF_FILE_LK request on all children for a write lock on </div><div class='del'>-     the appropriate region</div><div class='del'>-            (for metadata operations: entire file (0, 0)</div><div class='del'>-             for writev: (offset, offset+size of buffer))</div><div class='del'>-</div><div class='del'>-     - If a lock request fails on a child:</div><div class='del'>-         unlock all children</div><div class='del'>-         try to acquire a blocking lock (F_SETLKW) on each child, serially.</div><div class='del'>-	 </div><div class='del'>-	 If this fails (due to ENOTCONN or EINVAL):</div><div class='del'>-           Consider this child as dead for rest of transaction.</div><div class='del'>-</div><div class='del'>- (2) Mark all children as "pending" on all (alive) children </div><div class='del'>-     (see below for meaning of "pending").</div><div class='del'>-</div><div class='del'>-     - If it fails on any child:</div><div class='del'>-         mark it as dead (in transaction local state).</div><div class='del'>-</div><div class='del'>- (3) Perform operation on all (alive) children.</div><div class='del'>-</div><div class='del'>-     - If it fails on any child:</div><div class='del'>-         mark it as dead (in transaction local state).</div><div class='del'>-</div><div class='del'>- (4) Unmark all successful children as not "pending" on all nodes.</div><div class='del'>-</div><div class='del'>- (5) Unlock region on all (alive) children.</div><div class='del'>-     </div><div class='del'>- -----------</div><div class='del'>- - dir-write</div><div class='del'>- -----------</div><div class='del'>-</div><div class='del'>- The algorithm for dir-write is same as above except instead of holding</div><div class='del'>- GF_FILE_LK locks we hold a GF_DIR_LK lock on the name being operated upon.</div><div class='del'>- In case of link-type calls, we hold locks on both the operand names.</div><div class='del'>-</div><div class='del'>------------</div><div class='del'>-* "pending"</div><div class='del'>------------</div><div class='del'>-</div><div class='del'>- The "pending" number is like a journal entry. A pending entry is an</div><div class='del'>- array of 32-bit integers stored in network byte-order as the extended</div><div class='del'>- attribute of an inode (which can be a directory as well).</div><div class='del'>- </div><div class='del'>- There are three keys corresponding to three types of pending operations:</div><div class='del'>-</div><div class='del'>- - AFR_METADATA_PENDING</div><div class='del'>-     There are some metadata operations pending on this inode (perms, ctime/mtime, </div><div class='del'>-     xattr, etc.).</div><div class='del'>-</div><div class='del'>- - AFR_DATA_PENDING</div><div class='del'>-     There is some data pending on this inode (writev).</div><div class='del'>-</div><div class='del'>- - AFR_ENTRY_PENDING</div><div class='del'>-     There are some directory operations pending on this directory</div><div class='del'>-     (create, unlink, etc.).</div><div class='del'>-    </div><div class='del'>------------</div><div class='del'>-* Self heal</div><div class='del'>------------</div><div class='del'>-</div><div class='del'>- - On lookup, gather extended attribute data:</div><div class='del'>-   - If entry is a regular file:</div><div class='del'>-     - If an entry is present on one child and not on others:</div><div class='del'>-       - create entry on others.</div><div class='del'>-     - If entries exist but have different metadata (perms, etc.):</div><div class='del'>-       - consider the entry with the highest AFR_METADATA_PENDING number as</div><div class='del'>-         definitive and replicate its attributes on children.</div><div class='del'>-</div><div class='del'>-   - If entry is a directory:</div><div class='del'>-     - Consider the entry with the higest AFR_ENTRY_PENDING number as</div><div class='del'>-       definitive and replicate its contents on all children.</div><div class='del'>-</div><div class='del'>-   - If any two entries have non-matching types (i.e., one is file and</div><div class='del'>-     other is directory):</div><div class='del'>-     - Announce to the user via log that a split-brain situation has been</div><div class='del'>-       detected, and do nothing.</div><div class='del'>- </div><div class='del'>- - On open, gather extended attribute data:</div><div class='del'>-   - Consider the file with the highest AFR_DATA_PENDING number as</div><div class='del'>-     the definitive one and replicate its contents on all other</div><div class='del'>-     children.</div><div class='del'>-</div><div class='del'>- During all self heal operations, appropriate locks must be held on all</div><div class='del'>- regions/entries being affected.</div><div class='del'>-</div><div class='del'>----------------</div><div class='del'>-* Inode scaling</div><div class='del'>----------------</div><div class='del'>-</div><div class='del'>-Inode scaling is necessary because if a situation arises where:</div><div class='del'>-  - An inode number is returned for a directory (by lookup) which was</div><div class='del'>-    previously the inode number of a file (as per FUSE's table), then</div><div class='del'>-    FUSE gets horribly confused (consult a FUSE expert for more details).</div><div class='del'>-</div><div class='del'>-To avoid such a situation, we distribute the 64-bit inode space equally</div><div class='del'>-among all children of replicate.</div><div class='del'>-</div><div class='del'>-To illustrate:</div><div class='del'>-</div><div class='del'>-If c1, c2, c3 are children of replicate, they each get 1/3 of the available</div><div class='del'>-inode space:</div><div class='del'>-</div><div class='del'>-Child:        c1   c2   c3   c1   c2   c3   c1   c2   c3   c1   c2 ...</div><div class='del'>-Inode number: 1    2    3    4    5    6    7    8    9    10   11 ...</div><div class='del'>-</div><div class='del'>-Thus, if lookup on c1 returns an inode number "2", it is scaled to "4"</div><div class='del'>-(which is the second inode number in c1's space).</div><div class='del'>-</div><div class='del'>-This way we ensure that there is never a collision of inode numbers from</div><div class='del'>-two different children.</div><div class='del'>-</div><div class='del'>-This reduction of inode space doesn't really reduce the usability of </div><div class='del'>-replicate since even if we assume replicate has 1024 children (which would be a</div><div class='del'>-highly unusual scenario), each child still has a 54-bit inode space.</div><div class='del'>-</div><div class='del'>-2^54 ~ 1.8 * 10^16</div><div class='del'>-</div><div class='del'>-which is much larger than any real world requirement.</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-==============================================</div><div class='del'>-$ Last updated: Sun Oct 12 23:17:01 IST 2008 $</div><div class='del'>-$ Author: Vikas Gorur &lt;vikas@gluster.com&gt;  $</div><div class='del'>-==============================================</div><div class='del'>-</div><div class='head'>diff --git a/doc/hacker-guide/write-behind.txt b/doc/hacker-guide/write-behind.txt<br/>deleted file mode 100644<br/>index 498e95480ae..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/doc/hacker-guide/write-behind.txt?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>doc/hacker-guide/write-behind.txt</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,45 +0,0 @@</div><div class='del'>-basic working</div><div class='del'>---------------</div><div class='del'>-</div><div class='del'>-  write behind is basically a translator to lie to the application that the write-requests are finished, even before it is actually finished.</div><div class='del'>-</div><div class='del'>-  on a regular translator tree without write-behind, control flow is like this:</div><div class='del'>-  </div><div class='del'>-  1. application makes a write() system call.</div><div class='del'>-  2. VFS ==&gt; FUSE ==&gt; /dev/fuse.</div><div class='del'>-  3. fuse-bridge initiates a glusterfs writev() call.</div><div class='del'>-  4. writev() is STACK_WIND()ed upto client-protocol or storage translator.</div><div class='del'>-  5. client-protocol, on recieving reply from server, starts STACK_UNWIND() towards the fuse-bridge.</div><div class='del'>-</div><div class='del'>-  on a translator tree with write-behind, control flow is like this:</div><div class='del'>-  </div><div class='del'>-  1. application makes a write() system call.</div><div class='del'>-  2. VFS ==&gt; FUSE ==&gt; /dev/fuse.</div><div class='del'>-  3. fuse-bridge initiates a glusterfs writev() call.</div><div class='del'>-  4. writev() is STACK_WIND()ed upto write-behind translator.</div><div class='del'>-  5. write-behind adds the write buffer to its internal queue and does a STACK_UNWIND() towards the fuse-bridge.</div><div class='del'>-  </div><div class='del'>-  write call is completed in application's percepective. after STACK_UNWIND()ing towards the fuse-bridge, write-behind initiates a fresh writev() call to its child translator, whose replies will be consumed by write-behind itself. write-behind _doesn't_ cache the write buffer, unless 'option flush-behind on' is specified in volume specification file.</div><div class='del'>-</div><div class='del'>-windowing</div><div class='del'>----------</div><div class='del'>-</div><div class='del'>-  write respect to write-behind, each write-buffer has three flags: 'stack_wound', 'write_behind' and 'got_reply'.</div><div class='del'>-</div><div class='del'>-  stack_wound: if set, indicates that write-behind has initiated STACK_WIND() towards child translator. </div><div class='del'>-</div><div class='del'>-  write_behind: if set, indicates that write-behind has done STACK_UNWIND() towards fuse-bridge.</div><div class='del'>-</div><div class='del'>-  got_reply: if set, indicates that write-behind has recieved reply from child translator for a writev() STACK_WIND(). a request will be destroyed by write-behind only if this flag is set.</div><div class='del'>-</div><div class='del'>-  currently pending write requests = aggregate size of requests with write_behind = 1 and got_reply = 0.</div><div class='del'>-  </div><div class='del'>-  window size limits the aggregate size of currently pending write requests. once the pending requests' size has reached the window size, write-behind blocks  writev() calls from fuse-bridge. </div><div class='del'>-  blocking is only from application's perspective. write-behind does STACK_WIND() to child translator straight-away, but hold behind the STACK_UNWIND() towards fuse-bridge. STACK_UNWIND() is done only once write-behind gets enough replies to accomodate for currently blocked request.</div><div class='del'>-  </div><div class='del'>-flush behind</div><div class='del'>-------------</div><div class='del'>-</div><div class='del'>-  if 'option flush-behind on' is specified in volume specification file, then write-behind sends aggregate write requests to child translator, instead of regular per request STACK_WIND()s.</div><div class='del'>-  </div><div class='del'>-</div><div class='head'>diff --git a/doc/handling-options.txt b/doc/handling-options.txt<br/>deleted file mode 100644<br/>index cac1fe93947..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/doc/handling-options.txt?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>doc/handling-options.txt</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,13 +0,0 @@</div><div class='del'>-</div><div class='del'>-How to add a new option to a given volume ?</div><div class='del'>-===========================================</div><div class='del'>-</div><div class='del'>-* Add a entry in 'struct volume_options options[]' with your key, what is </div><div class='del'>-  the type of the 'key', etc.</div><div class='del'>-</div><div class='del'>-* The 'key' and corresponding 'value' given for the same by user are validated </div><div class='del'>-  before calling init() of the translator/transport/scheduler/auth-module.</div><div class='del'>-</div><div class='del'>-* Once the complete init() is successful, user will get a warning if he has </div><div class='del'>-  given a 'key' which is not defined in these modules.</div><div class='del'>-</div><div class='head'>diff --git a/doc/mac-related-xattrs.txt b/doc/mac-related-xattrs.txt<br/>deleted file mode 100644<br/>index 805658334e6..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/doc/mac-related-xattrs.txt?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>doc/mac-related-xattrs.txt</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,21 +0,0 @@</div><div class='del'>-</div><div class='del'>-This document is intended to briefly explain how the Extended Attributes on </div><div class='del'>-Darwin 10.5.x releases works</div><div class='del'>-----</div><div class='del'>-</div><div class='del'>-On Darwin other than all the normal filesystem operations, 'Finder' (like </div><div class='del'>-Explorer in Windows but a little more) keeps its information in two extended </div><div class='del'>-attributes named 'com.apple.FinderInfo' and 'com.apple.ResourceFork'. If these </div><div class='del'>-xattrs are not implemented the filesystem won't be shown on Finder, and if they </div><div class='del'>-are not implemented properly there may be issues when some of the file operations </div><div class='del'>-are done through GUI of Finder. But when a filesystem is used over mountpoint in a </div><div class='del'>-terminal, everything is fine and these xattrs are not required. </div><div class='del'>-</div><div class='del'>-Currently the way these xattrs are implemented is simple. All the xattr calls </div><div class='del'>-(getxattr, setxattr, listxattr, removexattr) are passed down to underlaying filesystem,</div><div class='del'>-most of the cases when exported FS is on MacOS X itself, these keys are supported, hence</div><div class='del'>-the fops succeed. But in the case of using exports of different OS on Darwin the issue is </div><div class='del'>-extended attribute prefix like 'com.apple.' may not be supported, hence the problem with </div><div class='del'>-Finder. To solve this issue, GlusterFS returns virtual default values to these keys, which</div><div class='del'>-works fine on most of the cases.</div><div class='del'>-</div><div class='head'>diff --git a/doc/mount.glusterfs.8 b/doc/mount.glusterfs.8<br/>index 49deda80560..ce16e9e40b7 100644<br/>--- a/<a href='/cgit/glusterfs.git/tree/doc/mount.glusterfs.8?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>doc/mount.glusterfs.8</a><br/>+++ b/<a href='/cgit/glusterfs.git/tree/doc/mount.glusterfs.8?id=d1d7a6f35c816822fab51c820e25023863c239c1'>doc/mount.glusterfs.8</a></div><div class='hunk'>@@ -1,37 +1,31 @@</div><div class='del'>-.\"  Copyright (c) 2008-2010 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='add'>+.\"  Copyright (c) 2008-2013 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='ctx'> .\"  This file is part of GlusterFS.</div><div class='ctx'> .\"</div><div class='del'>-.\"  GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-.\"  it under the terms of the GNU General Public License as published</div><div class='del'>-.\"  by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-.\"  or (at your option) any later version.</div><div class='add'>+.\"  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+.\"  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+.\"  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+.\"  cases as published by the Free Software Foundation.</div><div class='ctx'> .\"</div><div class='del'>-.\"  GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-.\"  WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-.\"  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-.\"  General Public License for more details.</div><div class='ctx'> .\"</div><div class='del'>-.\"  You should have received a copy of the GNU General Public License</div><div class='del'>-.\"  long with this program.  If not, see</div><div class='del'>-.\"  &lt;http://www.gnu.org/licenses/&gt;.</div><div class='ctx'> .\"</div><div class='del'>-.\"</div><div class='del'>-.\"</div><div class='del'>-.TH GlusterFS 8 "Cluster Filesystem" "18 March 2010" "Gluster Inc."</div><div class='add'>+.TH GlusterFS 8 "Cluster Filesystem" "14 September 2013" "Red Hat, Inc."</div><div class='ctx'> .SH NAME</div><div class='del'>-mount.glusterfs - script to mount native GlusterFS volume</div><div class='add'>+.B mount.glusterfs - script to mount native GlusterFS volume</div><div class='ctx'> .SH SYNOPSIS</div><div class='del'>-.B mount -t glusterfs</div><div class='del'>-.I [-o &lt;options&gt;] &lt;volumeserver&gt;:&lt;volumeid/volumeport&gt; &lt;mountpoint&gt;</div><div class='add'>+.B mount -t glusterfs [-o &lt;options&gt;] &lt;volumeserver&gt;:/&lt;volume&gt;[/&lt;subdir&gt;]</div><div class='add'>+.B         &lt;mountpoint&gt;</div><div class='add'>+.TP</div><div class='add'>+.B mount -t glusterfs [-o &lt;options&gt;] &lt;server1&gt;,&lt;server2&gt;,</div><div class='add'>+.B        &lt;server3&gt;,..&lt;serverN&gt;:/&lt;volname&gt;[/&lt;subdir&gt;] &lt;mount_point&gt;</div><div class='ctx'> .TP</div><div class='del'>-.B mount -t glusterfs</div><div class='del'>-.I [-o &lt;options&gt;] &lt;path/to/volumefile&gt; &lt;mountpoint&gt;</div><div class='add'>+.TP</div><div class='add'>+.B mount -t glusterfs [-o &lt;options&gt;] &lt;path/to/volumefile&gt; &lt;mountpoint&gt;</div><div class='ctx'> .PP</div><div class='ctx'> .SH DESCRIPTION</div><div class='ctx'> This tool is part of \fBglusterfs\fR(8) package, which is used to mount using</div><div class='ctx'> GlusterFS native binary.</div><div class='ctx'> </div><div class='del'>-\fBmount.glusterfs\fR  is meant to be used by the mount(8) command for mounting</div><div class='add'>+\fBmount.glusterfs\fR is meant to be used by the mount(8) command for mounting</div><div class='ctx'> native GlusterFS client. This subcommand, however, can also be used as a</div><div class='ctx'> standalone command with limited functionality.</div><div class='ctx'> </div><div class='hunk'>@@ -45,46 +39,139 @@ File to use for logging [default:/var/log/glusterfs/glusterfs.log]</div><div class='ctx'> .TP</div><div class='ctx'> \fBlog\-level=\fRLOG-LEVEL</div><div class='ctx'> Logging severity.  Valid options are TRACE, DEBUG, WARNING, ERROR, CRITICAL</div><div class='del'>-NORMAL and NONE [default: NORMAL]</div><div class='add'>+INFO and NONE [default: INFO]</div><div class='add'>+.TP</div><div class='add'>+\fBacl</div><div class='add'>+Mount the filesystem with POSIX ACL support</div><div class='add'>+.TP</div><div class='add'>+\fBfopen\-keep\-cache[=BOOL]</div><div class='add'>+Do not purge the cache on file open (default: false)</div><div class='add'>+.TP</div><div class='add'>+\fBworm</div><div class='add'>+Mount the filesystem in 'worm' mode</div><div class='add'>+.TP</div><div class='add'>+\fBaux\-gfid\-mount</div><div class='add'>+Enable access to filesystem through gfid directly</div><div class='ctx'> .TP</div><div class='ctx'> \fBro\fR</div><div class='ctx'> Mount the filesystem read-only</div><div class='add'>+.TP</div><div class='add'>+\fBenable\-ino32=\fRBOOL</div><div class='add'>+Use 32-bit inodes when mounting to workaround broken applications that don't</div><div class='add'>+support 64-bit inodes</div><div class='add'>+.TP</div><div class='add'>+\fBmem\-accounting</div><div class='add'>+Enable internal memory accounting</div><div class='add'>+.TP</div><div class='add'>+\fBcapability</div><div class='add'>+Enable file capability setting and retrival</div><div class='add'>+.TP</div><div class='add'>+\fBthin-client</div><div class='add'>+Enables thin mount and connects via gfproxyd daemon</div><div class='add'>+</div><div class='ctx'> .PP</div><div class='ctx'> .SS "Advanced options"</div><div class='ctx'> .PP</div><div class='ctx'> .TP</div><div class='del'>-\fBvolfile\-id=\fRKEY</div><div class='del'>-Volume key or name of the volume file to be fetched from server</div><div class='add'>+\fBattribute\-timeout=\fRSECONDS</div><div class='add'>+Set attribute timeout to SECONDS for inodes in fuse kernel module [default: 1]</div><div class='add'>+.TP</div><div class='add'>+\fBentry\-timeout=\fRSECONDS</div><div class='add'>+Set entry timeout to SECONDS in fuse kernel module [default: 1]</div><div class='add'>+.TP</div><div class='add'>+\fBbackground\-qlen=\fRN</div><div class='add'>+Set fuse module's background queue length to N [default: 64]</div><div class='ctx'> .TP</div><div class='del'>-\fBserver\-port=\fRPORT</div><div class='del'>-Port number of volfile server [default: 6996]</div><div class='add'>+\fBgid\-timeout=\fRSECONDS</div><div class='add'>+Set auxiliary group list timeout to SECONDS for fuse translator [default: 0]</div><div class='ctx'> .TP</div><div class='del'>-\fBtransport=\fRTRANSPORT-TYPE</div><div class='del'>-Transport type to get volume file from server [default: socket]</div><div class='add'>+\fBnegative\-timeout=\fRSECONDS</div><div class='add'>+Set negative timeout to SECONDS in fuse kernel module [default: 0]</div><div class='ctx'> .TP</div><div class='ctx'> \fBvolume\-name=\fRVOLUME-NAME</div><div class='ctx'> Volume name to be used for MOUNT-POINT [default: top most volume in</div><div class='ctx'> VOLUME-FILE]</div><div class='ctx'> .TP</div><div class='del'>-\fBdirect\-io\-mode=\fRdisable</div><div class='del'>-Disable direct I/O mode in fuse kernel module</div><div class='add'>+\fBdirect\-io\-mode=\fRBOOL|auto</div><div class='add'>+Specify fuse direct I/O strategy [default: auto]</div><div class='add'>+.TP</div><div class='add'>+\fBcongestion\-threshold=\fRN</div><div class='add'>+Set fuse module's congestion threshold to N [default: 48]</div><div class='add'>+.TP</div><div class='add'>+\fsubdir\-mount=\fRN</div><div class='add'>+Set the subdirectory mount option [default: NULL, ie, no subdirectory mount]</div><div class='add'>+.TP</div><div class='add'>+.TP</div><div class='add'>+\fBbackup\-volfile\-servers=\fRSERVERLIST</div><div class='add'>+Provide list of backup volfile servers in the following format [default: None]</div><div class='add'>+</div><div class='add'>+\fB$ mount \-t glusterfs \-obackup\-volfile\-servers=&lt;server2&gt;:\fR</div><div class='add'>+\fB       &lt;server3&gt;:...:&lt;serverN&gt; &lt;server1&gt;:/&lt;volname&gt; &lt;mount_point&gt;\fR</div><div class='add'>+</div><div class='add'>+.TP</div><div class='add'>+.TP</div><div class='add'>+\fBbackupvolfile\-server=\fRSERVER</div><div class='add'>+Provide list of backup volfile servers in the following format [default: None]</div><div class='add'>+</div><div class='add'>+\fB $ mount \-t glusterfs \-obackupvolfile\-server=&lt;server2&gt;</div><div class='add'>+\fB         &lt;server1&gt;:/&lt;volname&gt; &lt;mount_point&gt;</div><div class='add'>+</div><div class='add'>+.TP</div><div class='add'>+.TP</div><div class='add'>+\fBfetch-attempts=\fRN</div><div class='add'>+\fBDeprecated\fR option - placed here for backward compatibility [default: 1]</div><div class='add'>+.TP</div><div class='add'>+.TP</div><div class='add'>+\fBlru-limit=\fRN</div><div class='add'>+Set fuse module's limit for number of inodes kept in LRU list to N [default: 65536]</div><div class='add'>+.TP</div><div class='add'>+.TP</div><div class='add'>+\fBinvalidate-limit=\fRN</div><div class='add'>+Suspend fuse invalidations implied by 'lru-limit' if  number of outstanding</div><div class='add'>+invalidations reaches N</div><div class='add'>+.TP</div><div class='add'>+.TP</div><div class='add'>+\fBbackground-qlen=\fRN</div><div class='add'>+Set fuse module's background queue length to N [default: 64]</div><div class='add'>+.TP</div><div class='add'>+\fBno\-root\-squash=\fRBOOL</div><div class='add'>+disable root squashing for the trusted client [default: off]</div><div class='add'>+.TP</div><div class='add'>+\fBroot\-squash=\fRBOOL</div><div class='add'>+enable root squashing for the trusted client [default: on]</div><div class='add'>+.TP</div><div class='add'>+\fBuse\-readdirp=\fRBOOL</div><div class='add'>+Use readdirp() mode in fuse kernel module [default: on]</div><div class='add'>+.TP</div><div class='add'>+\fBdump\-fuse=\fRPATH</div><div class='add'>+Dump fuse traffic to PATH</div><div class='add'>+.TP</div><div class='add'>+\fBkernel\-writeback\-cache=\fRBOOL</div><div class='add'>+Enable fuse in-kernel writeback cache [default: off]</div><div class='add'>+.TP</div><div class='add'>+\fBattr\-times\-granularity=\fRNS</div><div class='add'>+Declare supported granularity of file attribute [default: 0]</div><div class='ctx'> .TP</div><div class='add'>+\fBauto\-invalidation=\fRBOOL</div><div class='add'>+controls whether fuse-kernel can auto-invalidate attribute, dentry and</div><div class='add'>+page-cache. Disable this only if same files/directories are not</div><div class='add'>+accessed across two different mounts concurrently [default: on]</div><div class='ctx'> .PP</div><div class='ctx'> .SH FILES</div><div class='ctx'> .TP</div><div class='ctx'> .I /etc/fstab</div><div class='ctx'> A typical GlusterFS entry in /etc/fstab looks like below</div><div class='ctx'> </div><div class='del'>-server1.gluster.com:mirror  /mnt/mirror  glusterfs  log-file=/var/log/mirror.vol,ro,defaults   0  0</div><div class='add'>+\fBserver1:/mirror  /mnt/mirror  glusterfs log-file=/var/log/mirror.log,acl   0  0\fR</div><div class='ctx'> </div><div class='ctx'> .TP</div><div class='del'>-.I /etc/mtab</div><div class='del'>-An example entry of a GlusterFS mountpoint in /etc/mtab looks like below</div><div class='add'>+.I /proc/mounts</div><div class='add'>+An example entry of a GlusterFS mountpoint in /proc/mounts looks like below</div><div class='ctx'> </div><div class='del'>-mirror.vol /mnt/glusterfs fuse.glusterfs rw,allow_other,default_permissions,max_read=131072 0 0</div><div class='add'>+\fBserver1:/mirror /mnt/glusterfs fuse.glusterfs rw,allow_other,default_permissions,max_read=131072 0 0\fR</div><div class='ctx'> </div><div class='ctx'> .SH SEE ALSO</div><div class='del'>-\fBglusterfs\fR(8), \fBmount\fR(8)</div><div class='add'>+\fBglusterfs\fR(8), \fBmount\fR(8), \fBgluster\fR(8)</div><div class='ctx'> </div><div class='ctx'> .SH COPYRIGHT</div><div class='del'>-Copyright(c) 2006-2010   Gluster, Inc.   &lt;http://www.gluster.com&gt;</div><div class='add'>+Copyright(c) 2006-2013   Red Hat, Inc.   &lt;http://www.redhat.com&gt;</div><div class='head'>diff --git a/doc/porting_guide.txt b/doc/porting_guide.txt<br/>deleted file mode 100644<br/>index 905bb422858..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/doc/porting_guide.txt?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>doc/porting_guide.txt</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,45 +0,0 @@</div><div class='del'>-		       GlusterFS Porting Guide</div><div class='del'>-                       -----------------------</div><div class='del'>-</div><div class='del'>-* General setup</div><div class='del'>-</div><div class='del'>-The configure script will detect the target platform for the build. </div><div class='del'>-All platform-specific CFLAGS, macro definitions should be done</div><div class='del'>-in configure.ac</div><div class='del'>-</div><div class='del'>-Platform-specific code can be written like this:</div><div class='del'>-</div><div class='del'>-#ifdef GF_DARWIN_HOST_OS</div><div class='del'>-  /* some code specific to Darwin */</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-* Coding guidelines</div><div class='del'>-</div><div class='del'>-In general, avoid glibc extensions. For example, nested functions don't work </div><div class='del'>-on Mac OS X. It is best to stick to C99.</div><div class='del'>-</div><div class='del'>-When using library calls and system calls, pay attention to the</div><div class='del'>-portability notes. As far as possible stick to POSIX-specified behavior. </div><div class='del'>-Do not use anything expressly permitted by the specification. For example,</div><div class='del'>-some fields in structures may be present only on certain platforms. Avoid</div><div class='del'>-use of such things.</div><div class='del'>-</div><div class='del'>-Do not pass values of constants such as F_*, O_*, errno values, etc. across</div><div class='del'>-platforms.</div><div class='del'>-</div><div class='del'>-Please refer compat-errno.h for more details about errno handling inside </div><div class='del'>-glusterfs for cross platform. </div><div class='del'>-</div><div class='del'>-* Specific issues</div><div class='del'>-</div><div class='del'>-- The argp library is available only on Linux through glibc, but for other</div><div class='del'>-  platforms glusterfs has already included argp-standalone library which will</div><div class='del'>-  statically linked during the glusterfs build. </div><div class='del'>-</div><div class='del'>-- Extended attribute calls (setxattr, listxattr, etc.) have differing prototypes</div><div class='del'>-  on different platforms. See compat.h for macro definitions to resolve this, also</div><div class='del'>-  read out the specific extended attribute documentation for your platforms.</div><div class='del'>-</div><div class='del'>-------------------------------------------</div><div class='del'>-Last revised: Thu Feb 28 13:58:07 IST 2008</div><div class='del'>-------------------------------------------</div><div class='head'>diff --git a/doc/qa/qa-client.vol b/doc/qa/qa-client.vol<br/>deleted file mode 100644<br/>index 176dda5892a..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/doc/qa/qa-client.vol?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>doc/qa/qa-client.vol</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,170 +0,0 @@</div><div class='del'>-# This spec file should be used for testing before any release</div><div class='del'>-# </div><div class='del'>-</div><div class='del'>-# 1st client</div><div class='del'>-volume client1</div><div class='del'>-  type protocol/client</div><div class='del'>-  option transport-type tcp     # for TCP/IP transport</div><div class='del'>-# option transport-type ib-sdp  # for Infiniband transport</div><div class='del'>-# option transport-type ib-verbs # for ib-verbs transport </div><div class='del'>-# option transport.ib-verbs.work-request-send-size  131072</div><div class='del'>-# option transport.ib-verbs.work-request-send-count 64</div><div class='del'>-# option transport.ib-verbs.work-request-recv-size  131072</div><div class='del'>-# option transport.ib-verbs.work-request-recv-count 64</div><div class='del'>-  option remote-host 127.0.0.1 </div><div class='del'>-  option remote-subvolume ra1</div><div class='del'>-end-volume</div><div class='del'>-</div><div class='del'>-# 2nd client</div><div class='del'>-volume client2</div><div class='del'>-  type protocol/client</div><div class='del'>-  option transport-type tcp     # for TCP/IP transport</div><div class='del'>-# option transport-type ib-sdp  # for Infiniband transport</div><div class='del'>-# option transport-type ib-verbs # for ib-verbs transport </div><div class='del'>-  option remote-host 127.0.0.1 </div><div class='del'>-  option remote-subvolume ra2</div><div class='del'>-end-volume</div><div class='del'>-</div><div class='del'>-# 3rd client</div><div class='del'>-volume client3</div><div class='del'>-  type protocol/client</div><div class='del'>-  option transport-type tcp     # for TCP/IP transport</div><div class='del'>-# option transport-type ib-sdp  # for Infiniband transport</div><div class='del'>-# option transport-type ib-verbs # for ib-verbs transport </div><div class='del'>-  option remote-host 127.0.0.1 </div><div class='del'>-  option remote-subvolume ra3</div><div class='del'>-end-volume</div><div class='del'>-</div><div class='del'>-# 4th client</div><div class='del'>-volume client4</div><div class='del'>-  type protocol/client</div><div class='del'>-  option transport-type tcp     # for TCP/IP transport</div><div class='del'>-# option transport-type ib-sdp  # for Infiniband transport</div><div class='del'>-# option transport-type ib-verbs # for ib-verbs transport </div><div class='del'>-  option remote-host 127.0.0.1 </div><div class='del'>-  option remote-subvolume ra4</div><div class='del'>-end-volume</div><div class='del'>-</div><div class='del'>-# 5th client</div><div class='del'>-volume client5</div><div class='del'>-  type protocol/client</div><div class='del'>-  option transport-type tcp     # for TCP/IP transport</div><div class='del'>-# option transport-type ib-sdp  # for Infiniband transport</div><div class='del'>-# option transport-type ib-verbs # for ib-verbs transport </div><div class='del'>-  option remote-host 127.0.0.1 </div><div class='del'>-  option remote-subvolume ra5</div><div class='del'>-end-volume</div><div class='del'>-</div><div class='del'>-# 6th client</div><div class='del'>-volume client6</div><div class='del'>-  type protocol/client</div><div class='del'>-  option transport-type tcp     # for TCP/IP transport</div><div class='del'>-# option transport-type ib-sdp  # for Infiniband transport</div><div class='del'>-# option transport-type ib-verbs # for ib-verbs transport </div><div class='del'>-  option remote-host 127.0.0.1 </div><div class='del'>-  option remote-subvolume ra6</div><div class='del'>-end-volume</div><div class='del'>-</div><div class='del'>-# 7th client</div><div class='del'>-volume client7</div><div class='del'>-  type protocol/client</div><div class='del'>-  option transport-type tcp     # for TCP/IP transport</div><div class='del'>-# option transport-type ib-sdp  # for Infiniband transport</div><div class='del'>-# option transport-type ib-verbs # for ib-verbs transport </div><div class='del'>-  option remote-host 127.0.0.1 </div><div class='del'>-  option remote-subvolume ra7</div><div class='del'>-end-volume</div><div class='del'>-</div><div class='del'>-# 8th client </div><div class='del'>-volume client8</div><div class='del'>-  type protocol/client</div><div class='del'>-  option transport-type tcp     # for TCP/IP transport</div><div class='del'>-# option transport-type ib-sdp  # for Infiniband transport</div><div class='del'>-# option transport-type ib-verbs # for ib-verbs transport </div><div class='del'>-  option remote-host 127.0.0.1 </div><div class='del'>-  option remote-subvolume ra8</div><div class='del'>-end-volume</div><div class='del'>-</div><div class='del'>-# 1st Stripe (client1 client2)</div><div class='del'>-volume stripe1</div><div class='del'>-  type cluster/stripe</div><div class='del'>-  subvolumes client1 client2</div><div class='del'>-  option block-size 128KB  # all striped in 128kB block</div><div class='del'>-end-volume</div><div class='del'>-</div><div class='del'>-# 2st Stripe (client3 client4)</div><div class='del'>-volume stripe2</div><div class='del'>-  type cluster/stripe</div><div class='del'>-  subvolumes client3 client4</div><div class='del'>-  option block-size 128KB  # all striped in 128kB block</div><div class='del'>-end-volume</div><div class='del'>-</div><div class='del'>-# 3st Stripe (client5 client6)</div><div class='del'>-volume stripe3</div><div class='del'>-  type cluster/stripe</div><div class='del'>-  subvolumes client5 client6</div><div class='del'>-  option block-size 128KB  # all striped in 128kB block</div><div class='del'>-end-volume</div><div class='del'>-</div><div class='del'>-# 4st Stripe (client7 client8)</div><div class='del'>-volume stripe4</div><div class='del'>-  type cluster/stripe</div><div class='del'>-  subvolumes client7 client8</div><div class='del'>-  option block-size 128KB  # all striped in 128kB block</div><div class='del'>-end-volume</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-# 1st replicate</div><div class='del'>-volume replicate1</div><div class='del'>-  type cluster/replicate</div><div class='del'>-  subvolumes stripe1 stripe2</div><div class='del'>-end-volume</div><div class='del'>-</div><div class='del'>-# 2nd replicate</div><div class='del'>-volume replicate2</div><div class='del'>-  type cluster/replicate</div><div class='del'>-  subvolumes stripe3 stripe4</div><div class='del'>-end-volume</div><div class='del'>-</div><div class='del'>-volume ns</div><div class='del'>-  type protocol/client</div><div class='del'>-  option transport-type tcp</div><div class='del'>-  option remote-host 127.0.0.1</div><div class='del'>-  option remote-subvolume brick-ns</div><div class='del'>-end-volume</div><div class='del'>-</div><div class='del'>-# Unify</div><div class='del'>-volume unify0</div><div class='del'>-  type cluster/unify</div><div class='del'>-  subvolumes replicate1 replicate2</div><div class='del'>-#  subvolumes stripe1 stripe3</div><div class='del'>-  option namespace ns</div><div class='del'>-  option scheduler rr # random # alu # nufa</div><div class='del'>-  option rr.limits.min-free-disk 1GB</div><div class='del'>-# option alu.order x</div><div class='del'>-# option alu.x.entry-threshold</div><div class='del'>-# option alu.x.exit-threshold</div><div class='del'>-end-volume</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-# ==== Performance Translators ====</div><div class='del'>-# The default options for performance translators should be the best for 90+% of the cases</div><div class='del'>-volume iot</div><div class='del'>-  type performance/io-threads</div><div class='del'>-  subvolumes unify0</div><div class='del'>-end-volume</div><div class='del'>-</div><div class='del'>-volume wb</div><div class='del'>-  type performance/write-behind</div><div class='del'>-  subvolumes iot</div><div class='del'>-end-volume</div><div class='del'>-</div><div class='del'>-volume ioc</div><div class='del'>- type performance/io-cache</div><div class='del'>- subvolumes wb</div><div class='del'>-end-volume</div><div class='del'>-</div><div class='del'>-volume ra</div><div class='del'>-  type performance/read-ahead</div><div class='del'>-  subvolumes ioc</div><div class='del'>-end-volume</div><div class='head'>diff --git a/doc/qa/qa-high-avail-client.vol b/doc/qa/qa-high-avail-client.vol<br/>deleted file mode 100644<br/>index 69cb8dd30f1..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/doc/qa/qa-high-avail-client.vol?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>doc/qa/qa-high-avail-client.vol</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,17 +0,0 @@</div><div class='del'>-volume client</div><div class='del'>- type protocol/client</div><div class='del'>- option transport-type tcp</div><div class='del'>- option remote-host localhost</div><div class='del'>- option transport.socket.remote-port 7001</div><div class='del'>- option remote-subvolume server1-iot</div><div class='del'>-end-volume</div><div class='del'>-</div><div class='del'>-volume ra</div><div class='del'>- type performance/read-ahead</div><div class='del'>- subvolumes client</div><div class='del'>-end-volume</div><div class='del'>-</div><div class='del'>-volume wb</div><div class='del'>- type performance/write-behind</div><div class='del'>- subvolumes ra</div><div class='del'>-end-volume</div><div class='head'>diff --git a/doc/qa/qa-high-avail-server.vol b/doc/qa/qa-high-avail-server.vol<br/>deleted file mode 100644<br/>index 3556b9dae99..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/doc/qa/qa-high-avail-server.vol?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>doc/qa/qa-high-avail-server.vol</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,344 +0,0 @@</div><div class='del'>-</div><div class='del'>-# -- server 1 --</div><div class='del'>-volume server1-posix1</div><div class='del'>- type storage/posix</div><div class='del'>- option directory /tmp/ha-export1/</div><div class='del'>-end-volume</div><div class='del'>-</div><div class='del'>-volume server1-ns1</div><div class='del'>- type storage/posix</div><div class='del'>- option directory /tmp/ha-export-ns1/</div><div class='del'>-end-volume</div><div class='del'>-</div><div class='del'>-volume server1-client2</div><div class='del'>- type protocol/client</div><div class='del'>- option transport-type tcp</div><div class='del'>- option remote-host 127.0.0.1</div><div class='del'>- option transport.socket.remote-port 7002</div><div class='del'>- option remote-subvolume server2-posix2</div><div class='del'>-end-volume</div><div class='del'>-</div><div class='del'>-volume server1-ns2</div><div class='del'>- type protocol/client</div><div class='del'>- option transport-type tcp</div><div class='del'>- option remote-host 127.0.0.1</div><div class='del'>- option transport.socket.remote-port 7002</div><div class='del'>- option remote-subvolume server2-ns2</div><div class='del'>-end-volume</div><div class='del'>-</div><div class='del'>-volume server1-client3</div><div class='del'>- type protocol/client</div><div class='del'>- option transport-type tcp</div><div class='del'>- option remote-host 127.0.0.1</div><div class='del'>- option transport.socket.remote-port 7003</div><div class='del'>- option remote-subvolume server3-posix3</div><div class='del'>-end-volume</div><div class='del'>-</div><div class='del'>-volume server1-ns3</div><div class='del'>- type protocol/client</div><div class='del'>- option transport-type tcp</div><div class='del'>- option remote-host 127.0.0.1</div><div class='del'>- option transport.socket.remote-port 7003</div><div class='del'>- option remote-subvolume server3-ns3</div><div class='del'>-end-volume</div><div class='del'>-</div><div class='del'>-volume server1-io1</div><div class='del'>- type performance/io-threads</div><div class='del'>- option thread-count 8</div><div class='del'>- subvolumes server1-posix1</div><div class='del'>-end-volume</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-volume server1-io2</div><div class='del'>- type performance/io-threads</div><div class='del'>- option thread-count 8</div><div class='del'>- subvolumes server1-client2</div><div class='del'>-end-volume</div><div class='del'>-</div><div class='del'>-volume server1-io3</div><div class='del'>- type performance/io-threads</div><div class='del'>- option thread-count 8</div><div class='del'>- subvolumes server1-client3</div><div class='del'>-end-volume</div><div class='del'>-</div><div class='del'>-volume server1-ns-io1</div><div class='del'>- type performance/io-threads</div><div class='del'>- option thread-count 8</div><div class='del'>- subvolumes server1-ns1</div><div class='del'>-end-volume</div><div class='del'>-</div><div class='del'>-volume server1-ns-io2</div><div class='del'>- type performance/io-threads</div><div class='del'>- option thread-count 8</div><div class='del'>- subvolumes server1-ns2</div><div class='del'>-end-volume</div><div class='del'>-</div><div class='del'>-volume server1-ns-io3</div><div class='del'>- type performance/io-threads</div><div class='del'>- option thread-count 8</div><div class='del'>- subvolumes server1-ns3</div><div class='del'>-end-volume</div><div class='del'>-</div><div class='del'>-volume server1-ns-replicate</div><div class='del'>- type cluster/replicate</div><div class='del'>- subvolumes server1-ns-io1 server1-ns-io2 server1-ns-io3</div><div class='del'>-end-volume</div><div class='del'>-</div><div class='del'>-volume server1-storage-replicate</div><div class='del'>- type cluster/replicate</div><div class='del'>- subvolumes server1-io1 server1-io2 server1-io3</div><div class='del'>-end-volume</div><div class='del'>-</div><div class='del'>-volume server1-unify</div><div class='del'>- type cluster/unify</div><div class='del'>- #option self-heal off</div><div class='del'>- subvolumes server1-storage-replicate</div><div class='del'>- option namespace server1-ns-replicate</div><div class='del'>- option scheduler rr</div><div class='del'>-end-volume</div><div class='del'>-</div><div class='del'>-volume server1-iot</div><div class='del'>- type performance/io-threads</div><div class='del'>- option thread-count 8</div><div class='del'>- subvolumes server1-unify</div><div class='del'>-end-volume</div><div class='del'>-</div><div class='del'>-volume server1</div><div class='del'>- type protocol/server</div><div class='del'>- option transport-type tcp</div><div class='del'>- subvolumes server1-iot</div><div class='del'>- option transport.socket.listen-port 7001</div><div class='del'>- option auth.addr.server1-posix1.allow *</div><div class='del'>- option auth.addr.server1-ns1.allow *</div><div class='del'>- option auth.addr.server1-iot.allow * </div><div class='del'>-end-volume</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-# == Server2 ==</div><div class='del'>-volume server2-client1</div><div class='del'>- type protocol/client</div><div class='del'>- option transport-type tcp</div><div class='del'>- option remote-host 127.0.0.1</div><div class='del'>- option transport.socket.remote-port 7001</div><div class='del'>- option remote-subvolume server1-posix1</div><div class='del'>-end-volume</div><div class='del'>-</div><div class='del'>-volume server2-ns1</div><div class='del'>- type protocol/client</div><div class='del'>- option transport-type tcp</div><div class='del'>- option remote-host 127.0.0.1</div><div class='del'>- option transport.socket.remote-port 7001</div><div class='del'>- option remote-subvolume server1-ns1</div><div class='del'>-end-volume</div><div class='del'>-</div><div class='del'>-volume server2-posix2</div><div class='del'>- type storage/posix</div><div class='del'>- option directory /tmp/ha-export2/</div><div class='del'>-end-volume</div><div class='del'>-</div><div class='del'>-volume server2-ns2</div><div class='del'>- type storage/posix</div><div class='del'>- option directory /tmp/ha-export-ns2/</div><div class='del'>-end-volume</div><div class='del'>-</div><div class='del'>-volume server2-client3</div><div class='del'>- type protocol/client</div><div class='del'>- option transport-type tcp</div><div class='del'>- option remote-host 127.0.0.1</div><div class='del'>- option transport.socket.remote-port 7003</div><div class='del'>- option remote-subvolume server3-posix3</div><div class='del'>-end-volume</div><div class='del'>-</div><div class='del'>-volume server2-ns3</div><div class='del'>- type protocol/client</div><div class='del'>- option transport-type tcp</div><div class='del'>- option remote-host 127.0.0.1</div><div class='del'>- option transport.socket.remote-port 7003</div><div class='del'>- option remote-subvolume server3-ns3</div><div class='del'>-end-volume</div><div class='del'>-</div><div class='del'>-volume server2-io1</div><div class='del'>- type performance/io-threads</div><div class='del'>- option thread-count 8</div><div class='del'>- subvolumes server2-client1</div><div class='del'>-end-volume</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-volume server2-io2</div><div class='del'>- type performance/io-threads</div><div class='del'>- option thread-count 8</div><div class='del'>- subvolumes server2-posix2</div><div class='del'>-end-volume</div><div class='del'>-</div><div class='del'>-volume server2-io3</div><div class='del'>- type performance/io-threads</div><div class='del'>- option thread-count 8</div><div class='del'>- subvolumes server2-client3</div><div class='del'>-end-volume</div><div class='del'>-</div><div class='del'>-volume server2-ns-io1</div><div class='del'>- type performance/io-threads</div><div class='del'>- option thread-count 8</div><div class='del'>- subvolumes server2-ns1</div><div class='del'>-end-volume</div><div class='del'>-</div><div class='del'>-volume server2-ns-io2</div><div class='del'>- type performance/io-threads</div><div class='del'>- option thread-count 8</div><div class='del'>- subvolumes server2-ns2</div><div class='del'>-end-volume</div><div class='del'>-</div><div class='del'>-volume server2-ns-io3</div><div class='del'>- type performance/io-threads</div><div class='del'>- option thread-count 8</div><div class='del'>- subvolumes server2-ns3</div><div class='del'>-end-volume</div><div class='del'>-</div><div class='del'>-volume server2-ns-replicate</div><div class='del'>- type cluster/replicate</div><div class='del'>- subvolumes server2-ns-io1 server2-ns-io2 server2-ns-io3</div><div class='del'>-end-volume</div><div class='del'>-</div><div class='del'>-volume server2-storage-replicate</div><div class='del'>- type cluster/replicate</div><div class='del'>- subvolumes server2-io2 server2-io3 server2-io1</div><div class='del'>-end-volume</div><div class='del'>-</div><div class='del'>-volume server2-unify</div><div class='del'>- type cluster/unify</div><div class='del'>- option self-heal off</div><div class='del'>- subvolumes server2-storage-replicate</div><div class='del'>- option namespace server2-ns-replicate</div><div class='del'>- option scheduler rr</div><div class='del'>-end-volume</div><div class='del'>-</div><div class='del'>-volume server2-iot</div><div class='del'>- type performance/io-threads</div><div class='del'>- option thread-count 8</div><div class='del'>- subvolumes server2-unify</div><div class='del'>-end-volume</div><div class='del'>-</div><div class='del'>-volume server2</div><div class='del'>- type protocol/server</div><div class='del'>- option transport-type tcp</div><div class='del'>- subvolumes server2-iot</div><div class='del'>- option transport.socket.listen-port 7002</div><div class='del'>- option auth.addr.server2-posix2.allow *</div><div class='del'>- option auth.addr.server2-ns2.allow *</div><div class='del'>- option auth.addr.server2-iot.allow * </div><div class='del'>-end-volume</div><div class='del'>-</div><div class='del'>-# == server 3 ==</div><div class='del'>-volume server3-client1</div><div class='del'>- type protocol/client</div><div class='del'>- option transport-type tcp</div><div class='del'>- option remote-host 127.0.0.1</div><div class='del'>- option transport.socket.remote-port 7001</div><div class='del'>- option remote-subvolume server1-posix1</div><div class='del'>-end-volume</div><div class='del'>-</div><div class='del'>-volume server3-ns1</div><div class='del'>- type protocol/client</div><div class='del'>- option transport-type tcp</div><div class='del'>- option remote-host 127.0.0.1</div><div class='del'>- option transport.socket.remote-port 7001</div><div class='del'>- option remote-subvolume server1-ns1</div><div class='del'>-end-volume</div><div class='del'>-</div><div class='del'>-volume server3-client2</div><div class='del'>- type protocol/client</div><div class='del'>- option transport-type tcp</div><div class='del'>- option remote-host 127.0.0.1</div><div class='del'>- option transport.socket.remote-port 7002</div><div class='del'>- option remote-subvolume server2-posix2</div><div class='del'>-end-volume</div><div class='del'>-</div><div class='del'>-volume server3-ns2</div><div class='del'>- type protocol/client</div><div class='del'>- option transport-type tcp</div><div class='del'>- option remote-host 127.0.0.1</div><div class='del'>- option transport.socket.remote-port 7002</div><div class='del'>- option remote-subvolume server2-ns2</div><div class='del'>-end-volume</div><div class='del'>-</div><div class='del'>-volume server3-posix3</div><div class='del'>- type storage/posix</div><div class='del'>- option directory /tmp/ha-export3/</div><div class='del'>-end-volume</div><div class='del'>-</div><div class='del'>-volume server3-ns3</div><div class='del'>- type storage/posix</div><div class='del'>- option directory /tmp/ha-export-ns3/</div><div class='del'>-end-volume</div><div class='del'>-</div><div class='del'>-volume server3-io1</div><div class='del'>- type performance/io-threads</div><div class='del'>- option thread-count 8</div><div class='del'>- subvolumes server3-client1</div><div class='del'>-end-volume</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-volume server3-io2</div><div class='del'>- type performance/io-threads</div><div class='del'>- option thread-count 8</div><div class='del'>- subvolumes server3-client2</div><div class='del'>-end-volume</div><div class='del'>-</div><div class='del'>-volume server3-io3</div><div class='del'>- type performance/io-threads</div><div class='del'>- option thread-count 8</div><div class='del'>- subvolumes server3-posix3</div><div class='del'>-end-volume</div><div class='del'>-</div><div class='del'>-volume server3-ns-io1</div><div class='del'>- type performance/io-threads</div><div class='del'>- option thread-count 8</div><div class='del'>- subvolumes server3-ns1</div><div class='del'>-end-volume</div><div class='del'>-</div><div class='del'>-volume server3-ns-io2</div><div class='del'>- type performance/io-threads</div><div class='del'>- option thread-count 8</div><div class='del'>- subvolumes server3-ns2</div><div class='del'>-end-volume</div><div class='del'>-</div><div class='del'>-volume server3-ns-io3</div><div class='del'>- type performance/io-threads</div><div class='del'>- option thread-count 8</div><div class='del'>- subvolumes server3-ns3</div><div class='del'>-end-volume</div><div class='del'>-</div><div class='del'>-volume server3-ns-replicate</div><div class='del'>- type cluster/replicate</div><div class='del'>- subvolumes server3-ns-io1 server3-ns-io2 server3-ns-io3</div><div class='del'>-end-volume</div><div class='del'>-</div><div class='del'>-volume server3-storage-replicate</div><div class='del'>- type cluster/replicate</div><div class='del'>- subvolumes server3-io3 server3-io2 server3-io1</div><div class='del'>-end-volume</div><div class='del'>-</div><div class='del'>-volume server3-unify</div><div class='del'>- type cluster/unify</div><div class='del'>- option self-heal off</div><div class='del'>- subvolumes server3-storage-replicate</div><div class='del'>- option namespace server3-ns-replicate</div><div class='del'>- option scheduler rr</div><div class='del'>-end-volume</div><div class='del'>-</div><div class='del'>-volume server3-iot</div><div class='del'>- type performance/io-threads</div><div class='del'>- option thread-count 8</div><div class='del'>- subvolumes server3-unify</div><div class='del'>-end-volume</div><div class='del'>-</div><div class='del'>-volume server3</div><div class='del'>- type protocol/server</div><div class='del'>- option transport-type tcp</div><div class='del'>- subvolumes server3-iot</div><div class='del'>- option transport.socket.listen-port 7003</div><div class='del'>- option auth.addr.server3-posix3.allow *</div><div class='del'>- option auth.addr.server3-ns3.allow *</div><div class='del'>- option auth.addr.server3-iot.allow * </div><div class='del'>-end-volume</div><div class='del'>-</div><div class='head'>diff --git a/doc/qa/qa-server.vol b/doc/qa/qa-server.vol<br/>deleted file mode 100644<br/>index 1c245c324ad..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/doc/qa/qa-server.vol?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>doc/qa/qa-server.vol</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,284 +0,0 @@</div><div class='del'>-# This spec file should be used for testing before any release</div><div class='del'>-# </div><div class='del'>-</div><div class='del'>-# Namespace posix</div><div class='del'>-volume brick-ns</div><div class='del'>-  type storage/posix                   # POSIX FS translator</div><div class='del'>-  option directory /tmp/export-ns        # Export this directory</div><div class='del'>-end-volume</div><div class='del'>-</div><div class='del'>-# 1st server</div><div class='del'>-</div><div class='del'>-volume brick1</div><div class='del'>-  type storage/posix                   # POSIX FS translator</div><div class='del'>-  option directory /tmp/export1        # Export this directory</div><div class='del'>-end-volume</div><div class='del'>-</div><div class='del'>-# == Posix-Locks ==</div><div class='del'>- volume plocks1</div><div class='del'>-   type features/posix-locks</div><div class='del'>-#  option mandatory on</div><div class='del'>-   subvolumes brick1</div><div class='del'>- end-volume</div><div class='del'>-</div><div class='del'>-volume iot1</div><div class='del'>-  type performance/io-threads</div><div class='del'>-  subvolumes plocks1 # change properly if above commented volumes needs to be included</div><div class='del'>-# option &lt;key&gt; &lt;value&gt;</div><div class='del'>-end-volume</div><div class='del'>-</div><div class='del'>-volume wb1</div><div class='del'>-  type performance/write-behind</div><div class='del'>-  subvolumes iot1</div><div class='del'>-# option &lt;key&gt; &lt;value&gt;</div><div class='del'>-end-volume</div><div class='del'>-</div><div class='del'>-volume ra1</div><div class='del'>-  type performance/read-ahead</div><div class='del'>-  subvolumes wb1</div><div class='del'>-# option &lt;key&gt; &lt;value&gt;</div><div class='del'>-end-volume</div><div class='del'>-</div><div class='del'>-volume brick2</div><div class='del'>-  type storage/posix                   # POSIX FS translator</div><div class='del'>-  option directory /tmp/export2        # Export this directory</div><div class='del'>-end-volume</div><div class='del'>-</div><div class='del'>-# == TrashCan Translator ==</div><div class='del'>-# volume trash2</div><div class='del'>-#   type features/trash</div><div class='del'>-#   option trash-dir /.trashcan</div><div class='del'>-#   subvolumes brick2</div><div class='del'>-# end-volume</div><div class='del'>-</div><div class='del'>-# == Posix-Locks ==</div><div class='del'>-volume plocks2</div><div class='del'>-  type features/posix-locks</div><div class='del'>-#  option &lt;something&gt; &lt;something&gt;</div><div class='del'>-  subvolumes brick2</div><div class='del'>-end-volume</div><div class='del'>-</div><div class='del'>-volume iot2</div><div class='del'>-  type performance/io-threads</div><div class='del'>-  subvolumes plocks2 # change properly if above commented volumes needs to be included</div><div class='del'>-# option &lt;key&gt; &lt;value&gt;</div><div class='del'>-end-volume</div><div class='del'>-</div><div class='del'>-volume wb2</div><div class='del'>-  type performance/write-behind</div><div class='del'>-  subvolumes iot2</div><div class='del'>-# option &lt;key&gt; &lt;value&gt;</div><div class='del'>-end-volume</div><div class='del'>-</div><div class='del'>-volume ra2</div><div class='del'>-  type performance/read-ahead</div><div class='del'>-  subvolumes wb2</div><div class='del'>-# option &lt;key&gt; &lt;value&gt;</div><div class='del'>-end-volume</div><div class='del'>-</div><div class='del'>-volume brick3</div><div class='del'>-  type storage/posix                   # POSIX FS translator</div><div class='del'>-  option directory /tmp/export3        # Export this directory</div><div class='del'>-end-volume</div><div class='del'>-</div><div class='del'>-# == TrashCan Translator ==</div><div class='del'>-# volume trash3</div><div class='del'>-#   type features/trash</div><div class='del'>-#   option trash-dir /.trashcan</div><div class='del'>-#   subvolumes brick3</div><div class='del'>-# end-volume</div><div class='del'>-</div><div class='del'>-# == Posix-Locks ==</div><div class='del'>-volume plocks3</div><div class='del'>-  type features/posix-locks</div><div class='del'>-#  option &lt;something&gt; &lt;something&gt;</div><div class='del'>-  subvolumes brick3</div><div class='del'>-end-volume</div><div class='del'>-</div><div class='del'>-volume iot3</div><div class='del'>-  type performance/io-threads</div><div class='del'>-  subvolumes plocks3 # change properly if above commented volumes needs to be included</div><div class='del'>-# option &lt;key&gt; &lt;value&gt;</div><div class='del'>-end-volume</div><div class='del'>-</div><div class='del'>-volume wb3</div><div class='del'>-  type performance/write-behind</div><div class='del'>-  subvolumes iot3</div><div class='del'>-# option &lt;key&gt; &lt;value&gt;</div><div class='del'>-end-volume</div><div class='del'>-</div><div class='del'>-volume ra3</div><div class='del'>-  type performance/read-ahead</div><div class='del'>-  subvolumes wb3</div><div class='del'>-# option &lt;key&gt; &lt;value&gt;</div><div class='del'>-end-volume</div><div class='del'>-</div><div class='del'>-volume brick4</div><div class='del'>-  type storage/posix                   # POSIX FS translator</div><div class='del'>-  option directory /tmp/export4        # Export this directory</div><div class='del'>-end-volume</div><div class='del'>-</div><div class='del'>-# == Posix-Locks ==</div><div class='del'>-volume plocks4</div><div class='del'>-  type features/posix-locks</div><div class='del'>-# option &lt;something&gt; &lt;something&gt;</div><div class='del'>-  subvolumes brick4</div><div class='del'>-end-volume</div><div class='del'>-</div><div class='del'>-volume iot4</div><div class='del'>-  type performance/io-threads</div><div class='del'>-  subvolumes plocks4 # change properly if above commented volumes needs to be included</div><div class='del'>-# option &lt;key&gt; &lt;value&gt;</div><div class='del'>-end-volume</div><div class='del'>-</div><div class='del'>-volume wb4</div><div class='del'>-  type performance/write-behind</div><div class='del'>-  subvolumes iot4</div><div class='del'>-# option &lt;key&gt; &lt;value&gt;</div><div class='del'>-end-volume</div><div class='del'>-</div><div class='del'>-volume ra4</div><div class='del'>-  type performance/read-ahead</div><div class='del'>-  subvolumes wb4</div><div class='del'>-# option &lt;key&gt; &lt;value&gt;</div><div class='del'>-end-volume</div><div class='del'>-</div><div class='del'>-volume brick5</div><div class='del'>-  type storage/posix                   # POSIX FS translator</div><div class='del'>-  option directory /tmp/export5        # Export this directory</div><div class='del'>-end-volume</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-# == Posix-Locks ==</div><div class='del'>-volume plocks5</div><div class='del'>-  type features/posix-locks</div><div class='del'>-# option &lt;something&gt; &lt;something&gt;</div><div class='del'>-  subvolumes brick5</div><div class='del'>-end-volume</div><div class='del'>-</div><div class='del'>-volume iot5</div><div class='del'>-  type performance/io-threads</div><div class='del'>-  subvolumes plocks5 # change properly if above commented volumes needs to be included</div><div class='del'>-# option &lt;key&gt; &lt;value&gt;</div><div class='del'>-end-volume</div><div class='del'>-</div><div class='del'>-volume wb5</div><div class='del'>-  type performance/write-behind</div><div class='del'>-  subvolumes iot5</div><div class='del'>-# option &lt;key&gt; &lt;value&gt;</div><div class='del'>-end-volume</div><div class='del'>-</div><div class='del'>-volume ra5</div><div class='del'>-  type performance/read-ahead</div><div class='del'>-  subvolumes wb5</div><div class='del'>-# option &lt;key&gt; &lt;value&gt;</div><div class='del'>-end-volume</div><div class='del'>-</div><div class='del'>-volume brick6</div><div class='del'>-  type storage/posix                   # POSIX FS translator</div><div class='del'>-  option directory /tmp/export6        # Export this directory</div><div class='del'>-end-volume</div><div class='del'>-</div><div class='del'>-# == Posix-Locks ==</div><div class='del'>-volume plocks6</div><div class='del'>-  type features/posix-locks</div><div class='del'>-#   option &lt;something&gt; &lt;something&gt;</div><div class='del'>-  subvolumes brick6</div><div class='del'>-end-volume</div><div class='del'>-</div><div class='del'>-volume iot6</div><div class='del'>-  type performance/io-threads</div><div class='del'>-  subvolumes plocks6 # change properly if above commented volumes needs to be included</div><div class='del'>-# option &lt;key&gt; &lt;value&gt;</div><div class='del'>-end-volume</div><div class='del'>-</div><div class='del'>-volume wb6</div><div class='del'>-  type performance/write-behind</div><div class='del'>-  subvolumes iot6</div><div class='del'>-# option &lt;key&gt; &lt;value&gt;</div><div class='del'>-end-volume</div><div class='del'>-</div><div class='del'>-volume ra6</div><div class='del'>-  type performance/read-ahead</div><div class='del'>-  subvolumes wb6</div><div class='del'>-# option &lt;key&gt; &lt;value&gt;</div><div class='del'>-end-volume</div><div class='del'>-</div><div class='del'>-volume brick7</div><div class='del'>-  type storage/posix                   # POSIX FS translator</div><div class='del'>-  option directory /tmp/export7        # Export this directory</div><div class='del'>-end-volume</div><div class='del'>-</div><div class='del'>-# == Posix-Locks ==</div><div class='del'>-volume plocks7</div><div class='del'>-  type features/posix-locks</div><div class='del'>-#   option &lt;something&gt; &lt;something&gt;</div><div class='del'>-  subvolumes brick7</div><div class='del'>-end-volume</div><div class='del'>-</div><div class='del'>-volume iot7</div><div class='del'>-  type performance/io-threads</div><div class='del'>-  subvolumes plocks7 # change properly if above commented volumes needs to be included</div><div class='del'>-# option &lt;key&gt; &lt;value&gt;</div><div class='del'>-end-volume</div><div class='del'>-</div><div class='del'>-volume wb7</div><div class='del'>-  type performance/write-behind</div><div class='del'>-  subvolumes iot7</div><div class='del'>-# option &lt;key&gt; &lt;value&gt;</div><div class='del'>-end-volume</div><div class='del'>-</div><div class='del'>-volume ra7</div><div class='del'>-  type performance/read-ahead</div><div class='del'>-  subvolumes wb7</div><div class='del'>-# option &lt;key&gt; &lt;value&gt;</div><div class='del'>-end-volume</div><div class='del'>-</div><div class='del'>-volume brick8</div><div class='del'>-  type storage/posix                   # POSIX FS translator</div><div class='del'>-  option directory /tmp/export8        # Export this directory</div><div class='del'>-end-volume</div><div class='del'>-</div><div class='del'>-# == Posix-Locks ==</div><div class='del'>-volume plocks8</div><div class='del'>-  type features/posix-locks</div><div class='del'>-#   option &lt;something&gt; &lt;something&gt;</div><div class='del'>-  subvolumes brick8</div><div class='del'>-end-volume</div><div class='del'>-</div><div class='del'>-volume iot8</div><div class='del'>-  type performance/io-threads</div><div class='del'>-  subvolumes plocks8 # change properly if above commented volumes needs to be included</div><div class='del'>-# option &lt;key&gt; &lt;value&gt;</div><div class='del'>-end-volume</div><div class='del'>-</div><div class='del'>-volume wb8</div><div class='del'>-  type performance/write-behind</div><div class='del'>-  subvolumes iot8</div><div class='del'>-# option &lt;key&gt; &lt;value&gt;</div><div class='del'>-end-volume</div><div class='del'>-</div><div class='del'>-volume ra8</div><div class='del'>-  type performance/read-ahead</div><div class='del'>-  subvolumes wb8</div><div class='del'>-# option &lt;key&gt; &lt;value&gt;</div><div class='del'>-end-volume</div><div class='del'>-</div><div class='del'>-volume server8</div><div class='del'>-  type protocol/server</div><div class='del'>-  subvolumes ra8 ra1 ra2 ra3 ra4 ra5 ra6 ra7 brick-ns</div><div class='del'>-  option transport-type tcp     # For TCP/IP transport</div><div class='del'>-# option transport-type ib-sdp  # For Infiniband transport</div><div class='del'>-# option transport-type ib-verbs # For ib-verbs transport</div><div class='del'>-  option client-volume-filename /examples/qa-client.vol</div><div class='del'>-  option auth.addr.ra1.allow * # Allow access to "stat8" volume</div><div class='del'>-  option auth.addr.ra2.allow * # Allow access to "stat8" volume</div><div class='del'>-  option auth.addr.ra3.allow * # Allow access to "stat8" volume</div><div class='del'>-  option auth.addr.ra4.allow * # Allow access to "stat8" volume</div><div class='del'>-  option auth.addr.ra5.allow * # Allow access to "stat8" volume</div><div class='del'>-  option auth.addr.ra6.allow * # Allow access to "stat8" volume</div><div class='del'>-  option auth.addr.ra7.allow * # Allow access to "stat8" volume</div><div class='del'>-  option auth.addr.ra8.allow * # Allow access to "stat8" volume</div><div class='del'>-  option auth.addr.brick-ns.allow * # Allow access to "stat8" volume</div><div class='del'>-end-volume</div><div class='del'>-</div><div class='head'>diff --git a/doc/replicate.lyx b/doc/replicate.lyx<br/>deleted file mode 100644<br/>index d11a92beedd..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/doc/replicate.lyx?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>doc/replicate.lyx</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,797 +0,0 @@</div><div class='del'>-#LyX 1.4.2 created this file. For more info see http://www.lyx.org/</div><div class='del'>-\lyxformat 245</div><div class='del'>-\begin_document</div><div class='del'>-\begin_header</div><div class='del'>-\textclass article</div><div class='del'>-\language english</div><div class='del'>-\inputencoding auto</div><div class='del'>-\fontscheme default</div><div class='del'>-\graphics default</div><div class='del'>-\paperfontsize default</div><div class='del'>-\spacing single</div><div class='del'>-\papersize default</div><div class='del'>-\use_geometry false</div><div class='del'>-\use_amsmath 1</div><div class='del'>-\cite_engine basic</div><div class='del'>-\use_bibtopic false</div><div class='del'>-\paperorientation portrait</div><div class='del'>-\secnumdepth 3</div><div class='del'>-\tocdepth 3</div><div class='del'>-\paragraph_separation skip</div><div class='del'>-\defskip medskip</div><div class='del'>-\quotes_language english</div><div class='del'>-\papercolumns 1</div><div class='del'>-\papersides 1</div><div class='del'>-\paperpagestyle default</div><div class='del'>-\tracking_changes false</div><div class='del'>-\output_changes false</div><div class='del'>-\end_header</div><div class='del'>-</div><div class='del'>-\begin_body</div><div class='del'>-</div><div class='del'>-\begin_layout Title</div><div class='del'>-</div><div class='del'>-\size larger</div><div class='del'>-Automatic File Replication (replicate) in GlusterFS</div><div class='del'>-\end_layout</div><div class='del'>-</div><div class='del'>-\begin_layout Author</div><div class='del'>-Vikas Gorur </div><div class='del'>-\family typewriter</div><div class='del'>-\size larger</div><div class='del'>-&lt;vikas@gluster.com&gt;</div><div class='del'>-\end_layout</div><div class='del'>-</div><div class='del'>-\begin_layout Standard</div><div class='del'>-\begin_inset ERT</div><div class='del'>-status open</div><div class='del'>-</div><div class='del'>-\begin_layout Standard</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-\backslash</div><div class='del'>-hrule</div><div class='del'>-\end_layout</div><div class='del'>-</div><div class='del'>-\end_inset</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-\end_layout</div><div class='del'>-</div><div class='del'>-\begin_layout Section*</div><div class='del'>-Overview</div><div class='del'>-\end_layout</div><div class='del'>-</div><div class='del'>-\begin_layout Standard</div><div class='del'>-This document describes the design and usage of the replicate translator in GlusterFS.</div><div class='del'>- This document is valid for the 1.4.x releases, and not earlier ones.</div><div class='del'>-\end_layout</div><div class='del'>-</div><div class='del'>-\begin_layout Standard</div><div class='del'>-The replicate translator of GlusterFS aims to keep identical copies of a file</div><div class='del'>- on all its subvolumes, as far as possible.</div><div class='del'>- It tries to do this by performing all filesystem mutation operations (writing</div><div class='del'>- data, creating files, changing ownership, etc.) on all its subvolumes in</div><div class='del'>- such a way that if an operation succeeds on atleast one subvolume, all</div><div class='del'>- other subvolumes can later be brought up to date.</div><div class='del'>-\end_layout</div><div class='del'>-</div><div class='del'>-\begin_layout Standard</div><div class='del'>-In the rest of the document the terms </div><div class='del'>-\begin_inset Quotes eld</div><div class='del'>-\end_inset</div><div class='del'>-</div><div class='del'>-subvolume</div><div class='del'>-\begin_inset Quotes erd</div><div class='del'>-\end_inset</div><div class='del'>-</div><div class='del'>- and </div><div class='del'>-\begin_inset Quotes eld</div><div class='del'>-\end_inset</div><div class='del'>-</div><div class='del'>-server</div><div class='del'>-\begin_inset Quotes erd</div><div class='del'>-\end_inset</div><div class='del'>-</div><div class='del'>- are used interchangeably, trusting that it will cause no confusion to the</div><div class='del'>- reader.</div><div class='del'>-\end_layout</div><div class='del'>-</div><div class='del'>-\begin_layout Section*</div><div class='del'>-Usage</div><div class='del'>-\end_layout</div><div class='del'>-</div><div class='del'>-\begin_layout Standard</div><div class='del'>-A sample volume declaration for replicate looks like this:</div><div class='del'>-\end_layout</div><div class='del'>-</div><div class='del'>-\begin_layout Standard</div><div class='del'>-\begin_inset ERT</div><div class='del'>-status open</div><div class='del'>-</div><div class='del'>-\begin_layout Standard</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-\backslash</div><div class='del'>-begin{verbatim}</div><div class='del'>-\end_layout</div><div class='del'>-</div><div class='del'>-\begin_layout Standard</div><div class='del'>-</div><div class='del'>-volume replicate</div><div class='del'>-\end_layout</div><div class='del'>-</div><div class='del'>-\begin_layout Standard</div><div class='del'>-</div><div class='del'>- type cluster/replicate</div><div class='del'>-\end_layout</div><div class='del'>-</div><div class='del'>-\begin_layout Standard</div><div class='del'>-</div><div class='del'>- # options, see below for description</div><div class='del'>-\end_layout</div><div class='del'>-</div><div class='del'>-\begin_layout Standard</div><div class='del'>-</div><div class='del'>- subvolumes brick1 brick2</div><div class='del'>-\end_layout</div><div class='del'>-</div><div class='del'>-\begin_layout Standard</div><div class='del'>-</div><div class='del'>-end-volume</div><div class='del'>-\end_layout</div><div class='del'>-</div><div class='del'>-\begin_layout Standard</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-\backslash</div><div class='del'>-end{verbatim}</div><div class='del'>-\end_layout</div><div class='del'>-</div><div class='del'>-\begin_layout Standard</div><div class='del'>-</div><div class='del'>-\end_layout</div><div class='del'>-</div><div class='del'>-\begin_layout Standard</div><div class='del'>-</div><div class='del'>-\end_layout</div><div class='del'>-</div><div class='del'>-\begin_layout Standard</div><div class='del'>-</div><div class='del'>-\end_layout</div><div class='del'>-</div><div class='del'>-\end_inset</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-\end_layout</div><div class='del'>-</div><div class='del'>-\begin_layout Standard</div><div class='del'>-This defines an replicate volume with two subvolumes, brick1, and brick2.</div><div class='del'>- For replicate to work properly, it is essential that its subvolumes support </div><div class='del'>-\series bold</div><div class='del'>-extended attributes</div><div class='del'>-\series default</div><div class='del'>-.</div><div class='del'>- This means that you should choose a backend filesystem that supports extended</div><div class='del'>- attributes, like XFS, ReiserFS, or Ext3.</div><div class='del'>-\end_layout</div><div class='del'>-</div><div class='del'>-\begin_layout Standard</div><div class='del'>-The storage volumes used as backend for replicate </div><div class='del'>-\emph on</div><div class='del'>-must</div><div class='del'>-\emph default</div><div class='del'>- have a posix-locks volume loaded above them.</div><div class='del'>-\end_layout</div><div class='del'>-</div><div class='del'>-\begin_layout Standard</div><div class='del'>-\begin_inset ERT</div><div class='del'>-status open</div><div class='del'>-</div><div class='del'>-\begin_layout Standard</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-\backslash</div><div class='del'>-begin{verbatim}</div><div class='del'>-\end_layout</div><div class='del'>-</div><div class='del'>-\begin_layout Standard</div><div class='del'>-</div><div class='del'>-volume brick1</div><div class='del'>-\end_layout</div><div class='del'>-</div><div class='del'>-\begin_layout Standard</div><div class='del'>-</div><div class='del'>- type features/posix-locks</div><div class='del'>-\end_layout</div><div class='del'>-</div><div class='del'>-\begin_layout Standard</div><div class='del'>-</div><div class='del'>- subvolumes brick1-ds</div><div class='del'>-\end_layout</div><div class='del'>-</div><div class='del'>-\begin_layout Standard</div><div class='del'>-</div><div class='del'>-end-volume</div><div class='del'>-\end_layout</div><div class='del'>-</div><div class='del'>-\begin_layout Standard</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-\backslash</div><div class='del'>-end{verbatim}</div><div class='del'>-\end_layout</div><div class='del'>-</div><div class='del'>-\end_inset</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-\end_layout</div><div class='del'>-</div><div class='del'>-\begin_layout Section*</div><div class='del'>-Design</div><div class='del'>-\end_layout</div><div class='del'>-</div><div class='del'>-\begin_layout Subsection*</div><div class='del'>-Read algorithm</div><div class='del'>-\end_layout</div><div class='del'>-</div><div class='del'>-\begin_layout Standard</div><div class='del'>-All operations that do not modify the file or directory are sent to all</div><div class='del'>- the subvolumes and the first successful reply is returned to the application.</div><div class='del'>-\end_layout</div><div class='del'>-</div><div class='del'>-\begin_layout Standard</div><div class='del'>-The read() system call (reading data from a file) is an exception.</div><div class='del'>- For read() calls, replicate tries to do load balancing by sending all reads from</div><div class='del'>- a particular file to a particular server.</div><div class='del'>-\end_layout</div><div class='del'>-</div><div class='del'>-\begin_layout Standard</div><div class='del'>-The read algorithm is also affected by the option read-subvolume; see below</div><div class='del'>- for details.</div><div class='del'>-\end_layout</div><div class='del'>-</div><div class='del'>-\begin_layout Subsection*</div><div class='del'>-Classes of file operations</div><div class='del'>-\end_layout</div><div class='del'>-</div><div class='del'>-\begin_layout Standard</div><div class='del'>-replicate divides all filesystem write operations into three classes:</div><div class='del'>-\end_layout</div><div class='del'>-</div><div class='del'>-\begin_layout Itemize</div><div class='del'>-</div><div class='del'>-\series bold</div><div class='del'>-data: </div><div class='del'>-\series default</div><div class='del'>-Operations that modify the contents of a file (write, truncate).</div><div class='del'>-\end_layout</div><div class='del'>-</div><div class='del'>-\begin_layout Itemize</div><div class='del'>-</div><div class='del'>-\series bold</div><div class='del'>-metadata: </div><div class='del'>-\series default</div><div class='del'>-Operations that modify attributes of a file or directory (permissions, ownership</div><div class='del'>-, etc.).</div><div class='del'>-\end_layout</div><div class='del'>-</div><div class='del'>-\begin_layout Itemize</div><div class='del'>-</div><div class='del'>-\series bold</div><div class='del'>-entry: </div><div class='del'>-\series default</div><div class='del'>-Operations that create or delete directory entries (mkdir, create, rename,</div><div class='del'>- rmdir, unlink, etc.).</div><div class='del'>-\end_layout</div><div class='del'>-</div><div class='del'>-\begin_layout Subsection*</div><div class='del'>-Locking and Change Log</div><div class='del'>-\end_layout</div><div class='del'>-</div><div class='del'>-\begin_layout Standard</div><div class='del'>-To ensure consistency across subvolumes, replicate holds a lock whenever a modificatio</div><div class='del'>-n is being made to a file or directory.</div><div class='del'>- By default, replicate considers the first subvolume as the sole lock server.</div><div class='del'>- However, the number of lock servers can be increased upto the total number</div><div class='del'>- of subvolumes.</div><div class='del'>-\end_layout</div><div class='del'>-</div><div class='del'>-\begin_layout Standard</div><div class='del'>-The change log is a set of extended attributes associated with files and</div><div class='del'>- directories that replicate maintains.</div><div class='del'>- The change log keeps track of the changes made to files and directories</div><div class='del'>- (data, metadata, entry) so that the self-heal algorithm knows which copy</div><div class='del'>- of a file or directory is the most recent one.</div><div class='del'>-\end_layout</div><div class='del'>-</div><div class='del'>-\begin_layout Subsection*</div><div class='del'>-Write algorithm</div><div class='del'>-\end_layout</div><div class='del'>-</div><div class='del'>-\begin_layout Standard</div><div class='del'>-The algorithm for all write operations (data, metadata, entry) is:</div><div class='del'>-\end_layout</div><div class='del'>-</div><div class='del'>-\begin_layout Enumerate</div><div class='del'>-Lock the file (or directory) on all of the lock servers (see options below).</div><div class='del'>-\end_layout</div><div class='del'>-</div><div class='del'>-\begin_layout Enumerate</div><div class='del'>-Write change log entries on all servers.</div><div class='del'>-\end_layout</div><div class='del'>-</div><div class='del'>-\begin_layout Enumerate</div><div class='del'>-Perform the operation.</div><div class='del'>-\end_layout</div><div class='del'>-</div><div class='del'>-\begin_layout Enumerate</div><div class='del'>-Erase change log entries.</div><div class='del'>-\end_layout</div><div class='del'>-</div><div class='del'>-\begin_layout Enumerate</div><div class='del'>-Unlock the file (or directory) on all of the lock servers.</div><div class='del'>-\end_layout</div><div class='del'>-</div><div class='del'>-\begin_layout Standard</div><div class='del'>-The above algorithm is a simplified version intended for general users.</div><div class='del'>- Please refer to the source code for the full details.</div><div class='del'>-\end_layout</div><div class='del'>-</div><div class='del'>-\begin_layout Subsection*</div><div class='del'>-Self-Heal</div><div class='del'>-\end_layout</div><div class='del'>-</div><div class='del'>-\begin_layout Standard</div><div class='del'>-replicate automatically tries to fix any inconsistencies it detects among different</div><div class='del'>- copies of a file.</div><div class='del'>- It uses information in the change log to determine which copy is the </div><div class='del'>-\begin_inset Quotes eld</div><div class='del'>-\end_inset</div><div class='del'>-</div><div class='del'>-correct</div><div class='del'>-\begin_inset Quotes erd</div><div class='del'>-\end_inset</div><div class='del'>-</div><div class='del'>- version.</div><div class='del'>-\end_layout</div><div class='del'>-</div><div class='del'>-\begin_layout Standard</div><div class='del'>-Self-heal is triggered when a file or directory is first </div><div class='del'>-\begin_inset Quotes eld</div><div class='del'>-\end_inset</div><div class='del'>-</div><div class='del'>-accessed</div><div class='del'>-\begin_inset Quotes erd</div><div class='del'>-\end_inset</div><div class='del'>-</div><div class='del'>-, that is, the first time any operation is attempted on it.</div><div class='del'>- The self-heal algorithm does the following things:</div><div class='del'>-\end_layout</div><div class='del'>-</div><div class='del'>-\begin_layout Standard</div><div class='del'>-If the entry being accessed is a directory:</div><div class='del'>-\end_layout</div><div class='del'>-</div><div class='del'>-\begin_layout Itemize</div><div class='del'>-The contents of the </div><div class='del'>-\begin_inset Quotes eld</div><div class='del'>-\end_inset</div><div class='del'>-</div><div class='del'>-correct</div><div class='del'>-\begin_inset Quotes erd</div><div class='del'>-\end_inset</div><div class='del'>-</div><div class='del'>- version is replicated on all subvolumes, by deleting entries and creating</div><div class='del'>- entries as necessary.</div><div class='del'>-\end_layout</div><div class='del'>-</div><div class='del'>-\begin_layout Standard</div><div class='del'>-If the entry being accessed is a file:</div><div class='del'>-\end_layout</div><div class='del'>-</div><div class='del'>-\begin_layout Itemize</div><div class='del'>-If the file does not exist on some subvolumes, it is created.</div><div class='del'>-\end_layout</div><div class='del'>-</div><div class='del'>-\begin_layout Itemize</div><div class='del'>-If there is a mismatch in the size of the file, or ownership, or permission,</div><div class='del'>- it is fixed.</div><div class='del'>-\end_layout</div><div class='del'>-</div><div class='del'>-\begin_layout Itemize</div><div class='del'>-If the change log indicates that some copies need updating, they are updated.</div><div class='del'>-\end_layout</div><div class='del'>-</div><div class='del'>-\begin_layout Subsection*</div><div class='del'>-Split-brain</div><div class='del'>-\end_layout</div><div class='del'>-</div><div class='del'>-\begin_layout Standard</div><div class='del'>-It may happen that one replicate client can access only some of the servers in</div><div class='del'>- a cluster and another replicate client can access the remaining servers.</div><div class='del'>- Or it may happen that in a cluster of two servers, one server goes down</div><div class='del'>- and comes back up, but the other goes down immediately.</div><div class='del'>- Both these scenarios result in a </div><div class='del'>-\begin_inset Quotes eld</div><div class='del'>-\end_inset</div><div class='del'>-</div><div class='del'>-split-brain</div><div class='del'>-\begin_inset Quotes erd</div><div class='del'>-\end_inset</div><div class='del'>-</div><div class='del'>-.</div><div class='del'>-\end_layout</div><div class='del'>-</div><div class='del'>-\begin_layout Standard</div><div class='del'>-In a split-brain situation, there will be two or more copies of a file,</div><div class='del'>- all of which are </div><div class='del'>-\begin_inset Quotes eld</div><div class='del'>-\end_inset</div><div class='del'>-</div><div class='del'>-correct</div><div class='del'>-\begin_inset Quotes erd</div><div class='del'>-\end_inset</div><div class='del'>-</div><div class='del'>- in some sense.</div><div class='del'>- replicate without manual intervention has no way of knowing what to do, since</div><div class='del'>- it cannot consider any single copy as definitive, nor does it know of any</div><div class='del'>- meaningful way to merge the copies.</div><div class='del'>-\end_layout</div><div class='del'>-</div><div class='del'>-\begin_layout Standard</div><div class='del'>-If replicate detects that a split-brain has happened on a file, it disallows opening</div><div class='del'>- of that file.</div><div class='del'>- You will have to manually resolve the conflict by deleting all but one</div><div class='del'>- copy of the file.</div><div class='del'>- Alternatively you can set an automatic split-brain resolution policy by</div><div class='del'>- using the `favorite-child' option (see below).</div><div class='del'>-\end_layout</div><div class='del'>-</div><div class='del'>-\begin_layout Section*</div><div class='del'>-Translator Options</div><div class='del'>-\end_layout</div><div class='del'>-</div><div class='del'>-\begin_layout Standard</div><div class='del'>-replicate accepts the following options:</div><div class='del'>-\end_layout</div><div class='del'>-</div><div class='del'>-\begin_layout Subsection*</div><div class='del'>-read-subvolume (default: none)</div><div class='del'>-\end_layout</div><div class='del'>-</div><div class='del'>-\begin_layout Standard</div><div class='del'>-The value of this option must be the name of a subvolume.</div><div class='del'>- If given, all read operations are sent to only the specified subvolume,</div><div class='del'>- instead of being balanced across all subvolumes.</div><div class='del'>-\end_layout</div><div class='del'>-</div><div class='del'>-\begin_layout Subsection*</div><div class='del'>-favorite-child (default: none)</div><div class='del'>-\end_layout</div><div class='del'>-</div><div class='del'>-\begin_layout Standard</div><div class='del'>-The value of this option must be the name of a subvolume.</div><div class='del'>- If given, the specified subvolume will be preferentially used in resolving</div><div class='del'>- conflicts (</div><div class='del'>-\begin_inset Quotes eld</div><div class='del'>-\end_inset</div><div class='del'>-</div><div class='del'>-split-brain</div><div class='del'>-\begin_inset Quotes erd</div><div class='del'>-\end_inset</div><div class='del'>-</div><div class='del'>-).</div><div class='del'>- This means if a discrepancy is noticed in the attributes or content of</div><div class='del'>- a file, the copy on the `favorite-child' will be considered the definitive</div><div class='del'>- version and its contents will </div><div class='del'>-\emph on</div><div class='del'>-overwrite </div><div class='del'>-\emph default</div><div class='del'>-the contents of all other copies.</div><div class='del'>- Use this option with caution! It is possible to </div><div class='del'>-\emph on</div><div class='del'>-lose data</div><div class='del'>-\emph default</div><div class='del'>- with this option.</div><div class='del'>- If you are in doubt, do not specify this option.</div><div class='del'>-\end_layout</div><div class='del'>-</div><div class='del'>-\begin_layout Subsection*</div><div class='del'>-Self-heal options</div><div class='del'>-\end_layout</div><div class='del'>-</div><div class='del'>-\begin_layout Standard</div><div class='del'>-Setting any of these options to </div><div class='del'>-\begin_inset Quotes eld</div><div class='del'>-\end_inset</div><div class='del'>-</div><div class='del'>-off</div><div class='del'>-\begin_inset Quotes erd</div><div class='del'>-\end_inset</div><div class='del'>-</div><div class='del'>- prevents that kind of self-heal from being done on a file or directory.</div><div class='del'>- For example, if metadata self-heal is turned off, permissions and ownership</div><div class='del'>- are no longer fixed automatically.</div><div class='del'>-\end_layout</div><div class='del'>-</div><div class='del'>-\begin_layout Subsubsection*</div><div class='del'>-data-self-heal (default: on)</div><div class='del'>-\end_layout</div><div class='del'>-</div><div class='del'>-\begin_layout Standard</div><div class='del'>-Enable/disable self-healing of file contents.</div><div class='del'>-\end_layout</div><div class='del'>-</div><div class='del'>-\begin_layout Subsubsection*</div><div class='del'>-metadata-self-heal (default: off)</div><div class='del'>-\end_layout</div><div class='del'>-</div><div class='del'>-\begin_layout Standard</div><div class='del'>-Enable/disable self-healing of metadata (permissions, ownership, modification</div><div class='del'>- times).</div><div class='del'>-\end_layout</div><div class='del'>-</div><div class='del'>-\begin_layout Subsubsection*</div><div class='del'>-entry-self-heal (default: on)</div><div class='del'>-\end_layout</div><div class='del'>-</div><div class='del'>-\begin_layout Standard</div><div class='del'>-Enable/disable self-healing of directory entries.</div><div class='del'>-\end_layout</div><div class='del'>-</div><div class='del'>-\begin_layout Subsection*</div><div class='del'>-Change Log options</div><div class='del'>-\end_layout</div><div class='del'>-</div><div class='del'>-\begin_layout Standard</div><div class='del'>-If any of these options is turned off, it disables writing of change log</div><div class='del'>- entries for that class of file operations.</div><div class='del'>- That is, steps 2 and 4 of the write algorithm (see above) are not done.</div><div class='del'>- Note that if the change log is not written, the self-heal algorithm cannot</div><div class='del'>- determine the </div><div class='del'>-\begin_inset Quotes eld</div><div class='del'>-\end_inset</div><div class='del'>-</div><div class='del'>-correct</div><div class='del'>-\begin_inset Quotes erd</div><div class='del'>-\end_inset</div><div class='del'>-</div><div class='del'>- version of a file and hence self-heal will only be able to fix </div><div class='del'>-\begin_inset Quotes eld</div><div class='del'>-\end_inset</div><div class='del'>-</div><div class='del'>-obviously</div><div class='del'>-\begin_inset Quotes erd</div><div class='del'>-\end_inset</div><div class='del'>-</div><div class='del'>- wrong things (such as a file existing on only one node).</div><div class='del'>-\end_layout</div><div class='del'>-</div><div class='del'>-\begin_layout Subsubsection*</div><div class='del'>-data-change-log (default: on)</div><div class='del'>-\end_layout</div><div class='del'>-</div><div class='del'>-\begin_layout Standard</div><div class='del'>-Enable/disable writing of change log for data operations.</div><div class='del'>-\end_layout</div><div class='del'>-</div><div class='del'>-\begin_layout Subsubsection*</div><div class='del'>-metadata-change-log (default: on)</div><div class='del'>-\end_layout</div><div class='del'>-</div><div class='del'>-\begin_layout Standard</div><div class='del'>-Enable/disable writing of change log for metadata operations.</div><div class='del'>-\end_layout</div><div class='del'>-</div><div class='del'>-\begin_layout Subsubsection*</div><div class='del'>-entry-change-log (default: on)</div><div class='del'>-\end_layout</div><div class='del'>-</div><div class='del'>-\begin_layout Standard</div><div class='del'>-Enable/disable writing of change log for entry operations.</div><div class='del'>-\end_layout</div><div class='del'>-</div><div class='del'>-\begin_layout Subsection*</div><div class='del'>-Locking options</div><div class='del'>-\end_layout</div><div class='del'>-</div><div class='del'>-\begin_layout Standard</div><div class='del'>-These options let you specify the number of lock servers to use for each</div><div class='del'>- class of file operations.</div><div class='del'>- The default values are satisfactory in most cases.</div><div class='del'>- If you are extra paranoid, you may want to increase the values.</div><div class='del'>- However, be very cautious if you set the data- or entry- lock server counts</div><div class='del'>- to zero, since this can result in </div><div class='del'>-\emph on</div><div class='del'>-lost data.</div><div class='del'>-</div><div class='del'>-\emph default</div><div class='del'>- For example, if you set the data-lock-server-count to zero, and two application</div><div class='del'>-s write to the same region of a file, there is a possibility that none of</div><div class='del'>- your servers will have all the data.</div><div class='del'>- In other words, the copies will be </div><div class='del'>-\emph on</div><div class='del'>-inconsistent</div><div class='del'>-\emph default</div><div class='del'>-, and </div><div class='del'>-\emph on</div><div class='del'>-incomplete</div><div class='del'>-\emph default</div><div class='del'>-.</div><div class='del'>- Do not set data- and entry- lock server counts to zero unless you absolutely</div><div class='del'>- know what you are doing and agree to not hold GlusterFS responsible for</div><div class='del'>- any lost data.</div><div class='del'>-\end_layout</div><div class='del'>-</div><div class='del'>-\begin_layout Subsubsection*</div><div class='del'>-data-lock-server-count (default: 1)</div><div class='del'>-\end_layout</div><div class='del'>-</div><div class='del'>-\begin_layout Standard</div><div class='del'>-Number of lock servers to use for data operations.</div><div class='del'>-\end_layout</div><div class='del'>-</div><div class='del'>-\begin_layout Subsubsection*</div><div class='del'>-metadata-lock-server-count (default: 0)</div><div class='del'>-\end_layout</div><div class='del'>-</div><div class='del'>-\begin_layout Standard</div><div class='del'>-Number of lock servers to use for metadata operations.</div><div class='del'>-\end_layout</div><div class='del'>-</div><div class='del'>-\begin_layout Subsubsection*</div><div class='del'>-entry-lock-server-count (default: 1)</div><div class='del'>-\end_layout</div><div class='del'>-</div><div class='del'>-\begin_layout Standard</div><div class='del'>-Number of lock servers to use for entry operations.</div><div class='del'>-\end_layout</div><div class='del'>-</div><div class='del'>-\begin_layout Section*</div><div class='del'>-Known Issues</div><div class='del'>-\end_layout</div><div class='del'>-</div><div class='del'>-\begin_layout Subsection*</div><div class='del'>-Self-heal of file with more than one link (hard links):</div><div class='del'>-\end_layout</div><div class='del'>-</div><div class='del'>-\begin_layout Standard</div><div class='del'>-Consider two servers, A and B.</div><div class='del'>- Assume A is down, and the user creates a file `new' as a hard link to a</div><div class='del'>- file `old'.</div><div class='del'>- When A comes back up, replicate will see that the file `new' does not exist on</div><div class='del'>- A, and self-heal will create the file and copy the contents from B.</div><div class='del'>- However, now on server A the file `new' is not a link to the file `old'</div><div class='del'>- but an entirely different file.</div><div class='del'>-\end_layout</div><div class='del'>-</div><div class='del'>-\begin_layout Standard</div><div class='del'>-We know of no easy way to fix this problem, but we will try to fix it in</div><div class='del'>- forthcoming releases.</div><div class='del'>-\end_layout</div><div class='del'>-</div><div class='del'>-\begin_layout Subsection*</div><div class='del'>-File re-opening after a server comes back up:</div><div class='del'>-\end_layout</div><div class='del'>-</div><div class='del'>-\begin_layout Standard</div><div class='del'>-If a server A goes down and comes back up, any files which were opened while</div><div class='del'>- A was down and are still open will not have their writes replicated on</div><div class='del'>- A.</div><div class='del'>- In other words, data replication only happens on those servers which were</div><div class='del'>- alive when the file was opened.</div><div class='del'>-\end_layout</div><div class='del'>-</div><div class='del'>-\begin_layout Standard</div><div class='del'>-This is a rather tricky issue but we hope to fix it very soon.</div><div class='del'>-\end_layout</div><div class='del'>-</div><div class='del'>-\begin_layout Section*</div><div class='del'>-Frequently Asked Questions</div><div class='del'>-\end_layout</div><div class='del'>-</div><div class='del'>-\begin_layout Subsection*</div><div class='del'>-1.</div><div class='del'>- How can I force self-heal to happen?</div><div class='del'>-\end_layout</div><div class='del'>-</div><div class='del'>-\begin_layout Standard</div><div class='del'>-You can force self-heal to happen on your cluster by running a script or</div><div class='del'>- a command that accesses every file.</div><div class='del'>- A simple way to do it would be:</div><div class='del'>-\end_layout</div><div class='del'>-</div><div class='del'>-\begin_layout Standard</div><div class='del'>-\begin_inset ERT</div><div class='del'>-status open</div><div class='del'>-</div><div class='del'>-\begin_layout Standard</div><div class='del'>-</div><div class='del'>-\end_layout</div><div class='del'>-</div><div class='del'>-\begin_layout Standard</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-\backslash</div><div class='del'>-begin{verbatim}</div><div class='del'>-\end_layout</div><div class='del'>-</div><div class='del'>-\begin_layout Standard</div><div class='del'>-</div><div class='del'>-$ ls -lR</div><div class='del'>-\end_layout</div><div class='del'>-</div><div class='del'>-\begin_layout Standard</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-\backslash</div><div class='del'>-end{verbatim}</div><div class='del'>-\end_layout</div><div class='del'>-</div><div class='del'>-\begin_layout Standard</div><div class='del'>-</div><div class='del'>-\end_layout</div><div class='del'>-</div><div class='del'>-\end_inset</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-\end_layout</div><div class='del'>-</div><div class='del'>-\begin_layout Standard</div><div class='del'>-Run the command in all directories which you want to forcibly self-heal.</div><div class='del'>-\end_layout</div><div class='del'>-</div><div class='del'>-\begin_layout Subsection*</div><div class='del'>-2.</div><div class='del'>- Which backend filesystem should I use for replicate?</div><div class='del'>-\end_layout</div><div class='del'>-</div><div class='del'>-\begin_layout Standard</div><div class='del'>-You can use any backend filesystem that supports extended attributes.</div><div class='del'>- We know of users successfully using XFR, ReiserFS, and Ext3.</div><div class='del'>-\end_layout</div><div class='del'>-</div><div class='del'>-\begin_layout Subsection*</div><div class='del'>-3.</div><div class='del'>- What can I do to improve replicate performance?</div><div class='del'>-\end_layout</div><div class='del'>-</div><div class='del'>-\begin_layout Standard</div><div class='del'>-Try loading performance translators such as io-threads, write-behind, io-cache,</div><div class='del'>- and read-ahead depending on your workload.</div><div class='del'>- If you are willing to sacrifice correctness in corner cases, you can experiment</div><div class='del'>- with the lock-server-count and the change-log options (see above).</div><div class='del'>- As warned earlier, be very careful!</div><div class='del'>-\end_layout</div><div class='del'>-</div><div class='del'>-\begin_layout Subsection*</div><div class='del'>-4.</div><div class='del'>- How can I selectively replicate files?</div><div class='del'>-\end_layout</div><div class='del'>-</div><div class='del'>-\begin_layout Standard</div><div class='del'>-There is no support for selective replication in replicate itself.</div><div class='del'>- You can achieve selective replication by loading the unify translator over</div><div class='del'>- replicate, and using the switch scheduler.</div><div class='del'>- Configure unify with two subvolumes, one of them being replicate.</div><div class='del'>- Using the switch scheduler, schedule all files for which you need replication</div><div class='del'>- to the replicate subvolume.</div><div class='del'>- Consult unify and switch documentation for more details.</div><div class='del'>-\end_layout</div><div class='del'>-</div><div class='del'>-\begin_layout Section*</div><div class='del'>-Contact</div><div class='del'>-\end_layout</div><div class='del'>-</div><div class='del'>-\begin_layout Standard</div><div class='del'>-If you need more assistance on replicate, contact us on the mailing list &lt;gluster-user</div><div class='del'>-s@gluster.org&gt; (visit gluster.org for details on how to subscribe).</div><div class='del'>-\end_layout</div><div class='del'>-</div><div class='del'>-\begin_layout Standard</div><div class='del'>-Send you comments and suggestions about this document to &lt;vikas@gluster.com&gt;.</div><div class='del'>-\end_layout</div><div class='del'>-</div><div class='del'>-\end_body</div><div class='del'>-\end_document</div><div class='head'>diff --git a/doc/replicate.pdf b/doc/replicate.pdf<br/>deleted file mode 100644<br/>index b7212af2b4e..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/doc/replicate.pdf?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>doc/replicate.pdf</a><br/>+++ /dev/null</div>Binary files differ<div class='head'>diff --git a/doc/solaris-related-xattrs.txt b/doc/solaris-related-xattrs.txt<br/>deleted file mode 100644<br/>index e26efa5d189..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/doc/solaris-related-xattrs.txt?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>doc/solaris-related-xattrs.txt</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,44 +0,0 @@</div><div class='del'>-                   Solaris Extended Attributes</div><div class='del'>-</div><div class='del'>-In solaris extended attributes are logically supported as files</div><div class='del'>-within the filesystem.  The file system is therefore augmented </div><div class='del'>-with an orthogonal namespace of file attributes. Attribute values</div><div class='del'>-are accessed by file descriptors obtained through a special attribute</div><div class='del'>-interface. This type of logical view of "attributes as files" allows </div><div class='del'>-the leveraging of existing file system interface functionality to </div><div class='del'>-support the construction, deletion and manipulation of attributes. </div><div class='del'>-</div><div class='del'>-But as we have tested through this functionality provided by Solaris</div><div class='del'>-we have come accross two major issues as written below.</div><div class='del'>-</div><div class='del'>-1. Symlink XATTR_NOFOLLOW not present for creating extended attributes </div><div class='del'>-   directly on the symlinks like other platforms Linux,MAC-OSX,BSD etc.</div><div class='del'>-   An implementation is present for O_NOFOLLOW for "openat()" call sets </div><div class='del'>-   up errno ELOOP whenever encountered with a symlink and also another </div><div class='del'>-   implementation AT_SYMLINK_NOFOLLOW which is not present for calls like</div><div class='del'>-   "attropen(), openat()"</div><div class='del'>-</div><div class='del'>-   a snippet of test code which helped us understand this behaviour</div><div class='del'>-   --------------------------------------</div><div class='del'>-    attrfd = attropen (path, key, </div><div class='del'>-    flags|AT_SYMLINK_NOFOLLOW|O_CREAT|O_WRONLY|O_NOFOLLOW, 0777);</div><div class='del'>-    if (attrfd &gt;= 0) {</div><div class='del'>-      ftruncate (attrfd, 0);</div><div class='del'>-      ret = write (attrfd, value, size);</div><div class='del'>-      close (attrfd);</div><div class='del'>-    } else {</div><div class='del'>-       fprintf (stderr, "Couldn't set extended attribute for %s (%d)\n", </div><div class='del'>-       	        path, errno);</div><div class='del'>-    }		</div><div class='del'>-    --------------------------------------</div><div class='del'>-</div><div class='del'>-2. Extended attribute support for special files like device files, fifo files</div><div class='del'>-   is not supported under solaris. </div><div class='del'>-</div><div class='del'>-Apart from these glitches almost everything regarding porting functionality</div><div class='del'>-for extended attribute calls has been properly implemented in compat.c </div><div class='del'>-with writing wrapper around functions over</div><div class='del'>-"attropen()", "openat()", "unlinkat()"</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-</div><div class='head'>diff --git a/doc/stat-prefetch-design.txt b/doc/stat-prefetch-design.txt<br/>deleted file mode 100644<br/>index 06d0ad37e7d..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/doc/stat-prefetch-design.txt?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>doc/stat-prefetch-design.txt</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,154 +0,0 @@</div><div class='del'>-what is stat-prefetch?</div><div class='del'>-======================</div><div class='del'>-It is a translator which caches the dentries read in readdir. This dentry</div><div class='del'>-list is stored in the context of fd. Later when lookup happens on </div><div class='del'>-[parent-inode, basename (path)] combination, this list is searched for the</div><div class='del'>-basename. The dentry thus searched is used to fill up the stat corresponding</div><div class='del'>-to path being looked upon, thereby short-cutting lookup calls. This cache is</div><div class='del'>-preserved till closedir is called on the fd. The purpose of this translator </div><div class='del'>-is to optimize operations like 'ls -l', where a readdir is followed by </div><div class='del'>-lookup (stat) calls on each directory entry.</div><div class='del'>-</div><div class='del'>-1. stat-prefetch harnesses the efficiency of short lookup calls </div><div class='del'>-   (saves network roundtrip time for lookup calls from being accounted to </div><div class='del'>-   the stat call).</div><div class='del'>-2. To maintain the correctness, it does lookup-behind - lookup is winded to </div><div class='del'>-   underlying translators after it is unwound to upper translators. </div><div class='del'>-   lookup-behind is necessary as inode gets populated in server inode table</div><div class='del'>-   only in lookup-cbk and also because various translators store their </div><div class='del'>-   contexts in inode contexts during lookup calls.</div><div class='del'>-</div><div class='del'>-fops to be implemented:</div><div class='del'>-=======================</div><div class='del'>-* lookup</div><div class='del'>-  1. check the dentry cache stored in context of fds opened by the same process </div><div class='del'>-     on parent inode for basename. If found unwind with cached stat, else wind</div><div class='del'>-     the lookup call to underlying translators. </div><div class='del'>-  2. stat is stored in the context of inode if the path being looked upon </div><div class='del'>-     happens to be directory. This stat will be used to fill postparent stat</div><div class='del'>-     when lookup happens on any of the directory contents.</div><div class='del'>-</div><div class='del'>-* readdir</div><div class='del'>-  1. cache the direntries returned in readdir_cbk in the context of fd.</div><div class='del'>-  2. if the readdir is happening on non-expected offsets (means a seekdir/rewinddir </div><div class='del'>-     has happened), cache has to be flushed.</div><div class='del'>-  3. delete the entry corresponding to basename of path on which fd is opened </div><div class='del'>-     from cache stored in parent.</div><div class='del'>-</div><div class='del'>-* chmod/fchmod</div><div class='del'>-  delete the entry corresponding to basename from cache stored in context of</div><div class='del'>-  fds opened on parent inode, since these calls change st_mode and st_ctime of </div><div class='del'>-  stat.</div><div class='del'>- </div><div class='del'>-* chown/fchown</div><div class='del'>-  delete the entry corresponding to basename from cache stored in context of </div><div class='del'>-  fds opened on parent inode, since these calls change st_uid/st_gid and </div><div class='del'>-  st_ctime of stat.</div><div class='del'>-</div><div class='del'>-* truncate/ftruncate</div><div class='del'>-  delete the entry corresponding to basename from cache stored in context of </div><div class='del'>-  fds opened on parent inode, since these calls change st_size/st_mtime of stat.</div><div class='del'>-</div><div class='del'>-* utimens</div><div class='del'>-  delete the entry corresponding to basename from cache stored in context of </div><div class='del'>-  fds opened on parent inode, since this call changes st_atime/st_mtime of stat.</div><div class='del'>-</div><div class='del'>-* readlink</div><div class='del'>-  delete the entry corresponding to basename from cache stored in context of fds</div><div class='del'>-  opened on parent inode, since this call changes st_atime of stat.</div><div class='del'>- </div><div class='del'>-* unlink</div><div class='del'>-  1. delete the entry corresponding to basename from cache stored in context of </div><div class='del'>-     fds, opened on parent directory containing the file being unlinked.</div><div class='del'>-  2. delete the entry corresponding to basename of parent directory from cache</div><div class='del'>-     of grand-parent.</div><div class='del'>-</div><div class='del'>-* rmdir</div><div class='del'>-  1. delete the entry corresponding to basename from cache stored in context of</div><div class='del'>-     fds opened on parent inode.</div><div class='del'>-  2. remove the entire cache from all fds opened on inode corresponding to </div><div class='del'>-     directory being removed.</div><div class='del'>-  3. delete the entry correspondig to basename of parent from cache stored in</div><div class='del'>-     grand-parent.</div><div class='del'>-</div><div class='del'>-* readv</div><div class='del'>-  delete the entry corresponding to basename from cache stored in context of fds</div><div class='del'>-  opened on parent inode, since readv changes st_atime of file. </div><div class='del'>-</div><div class='del'>-* writev</div><div class='del'>-  delete the entry corresponding to basename from cache stored in context of fds</div><div class='del'>-  opened on parent inode, since writev can possibly change st_size and definitely</div><div class='del'>-  changes st_mtime of file.</div><div class='del'>-</div><div class='del'>-* fsync</div><div class='del'>-  there is a confusion here as to whether fsync updates mtime/ctimes. Disk based</div><div class='del'>-  filesystems (atleast ext2) just writes the times stored in inode to disk </div><div class='del'>-  during fsync and not the time at which fsync is being done. But in glusterfs, </div><div class='del'>-  a translator like write-behind actually sends writes during fsync which will </div><div class='del'>-  change mtime/ctime. Hence stat-prefetch implements fsync to delete the entry </div><div class='del'>-  corresponding to basename from cache stored in context of fds opened on parent</div><div class='del'>-  inode.</div><div class='del'>- </div><div class='del'>-* rename</div><div class='del'>-  1. remove entry corresponding to oldname from cache stored in fd contexts of </div><div class='del'>-     oldparent.</div><div class='del'>-  2. remove entry corresponding to newname from cache stored in fd contexts of</div><div class='del'>-     newparent. </div><div class='del'>-  3. remove entry corresponding to oldparent from cache stored in </div><div class='del'>-     old-grand-parent, since removing oldname changes st_mtime and st_ctime</div><div class='del'>-     of oldparent stat.</div><div class='del'>-  4. remove entry corresponding to newparent from cache stored in </div><div class='del'>-     new-grand-parent, since adding newname changes st_mtime and st_ctime</div><div class='del'>-     of newparent stat.</div><div class='del'>-  5. if oldname happens to be a directory, remove entire cache from all fds </div><div class='del'>-     opened on it.</div><div class='del'>-</div><div class='del'>-* create/mknod/mkdir/symlink/link</div><div class='del'>-  delete entry corresponding to basename of parent directory in which these </div><div class='del'>-  operations are happening, from cache stored in context of fds opened on</div><div class='del'>-  grand-parent, since adding a new entry to a directory changes st_mtime</div><div class='del'>-  and st_ctime of parent directory.</div><div class='del'>-</div><div class='del'>-* setxattr/removexattr</div><div class='del'>-  delete the entry corresponding to basename from cache stored in context of</div><div class='del'>-  fds opened on parent inode, since setxattr changes st_ctime of file.</div><div class='del'>-</div><div class='del'>-* setdents</div><div class='del'>-  1. remove entry corresponding to basename of path on which fd is opened from</div><div class='del'>-     cache stored in context of fds opened on parent.</div><div class='del'>-  2. for each of the entry in the direntry list, delete from cache stored in </div><div class='del'>-     context of fd, the entry corresponding to basename of path being passed.</div><div class='del'>-</div><div class='del'>-* getdents</div><div class='del'>-  1. remove entry corresponding to basename of path on which fd is opened from</div><div class='del'>-     cache stored in parent, since getdents changes st_atime. </div><div class='del'>-  2. remove entries corresponding to symbolic links from cache, since readlink </div><div class='del'>-     would've changed st_atime.</div><div class='del'>-</div><div class='del'>-* checksum</div><div class='del'>-  delete the entry corresponding to basename from cache stored in context of</div><div class='del'>-  fds opened on parent inode, since st_atime is changed during this call.</div><div class='del'>-</div><div class='del'>-* xattrop/fxattrop</div><div class='del'>-  delete the entry corresponding to basename from cache stored in context of fds</div><div class='del'>-  opened on parent inode, since these calls modify st_ctime of file.</div><div class='del'>-</div><div class='del'>-callbacks to be implemented:</div><div class='del'>-============================</div><div class='del'>-* releasedir</div><div class='del'>-  free the context stored in fd.</div><div class='del'>-</div><div class='del'>-* forget</div><div class='del'>-  dree the stat if the inode corresponds to a directory.</div><div class='del'>-</div><div class='del'>-limitations:</div><div class='del'>-============</div><div class='del'>-* since a readdir does not return extended attributes of file, if need_xattr is</div><div class='del'>-  set, short-cutting of lookup does not happen and lookup is passed to </div><div class='del'>-  underlying translators.</div><div class='del'>-</div><div class='del'>-* posix_readdir does not check whether the dentries are spanning across multiple</div><div class='del'>-  mount points. Hence it is not transforming inode numbers in stat buffers if </div><div class='del'>-  posix is configured to allow export directory spanning on multiple mountpoints.</div><div class='del'>-  This is a bug which needs to be fixed. posix_readdir should treat dentries the </div><div class='del'>-  same way as if lookup is happening on dentries.</div><div class='head'>diff --git a/doc/translator-options.txt b/doc/translator-options.txt<br/>deleted file mode 100644<br/>index 278ef5b0083..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/doc/translator-options.txt?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>doc/translator-options.txt</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,224 +0,0 @@</div><div class='del'>-mount/fuse:</div><div class='del'>-	* direct-io-mode            GF_OPTION_TYPE_BOOL   on|off|yes|no</div><div class='del'>-	* mount-point (mountpoint)  GF_OPTION_TYPE_PATH   &lt;any-posix-valid-path&gt;</div><div class='del'>-	* attribute-timeout         GF_OPTION_TYPE_DOUBLE   0.0 </div><div class='del'>-	* entry-timeout             GF_OPTION_TYPE_DOUBLE   0.0</div><div class='del'>-</div><div class='del'>-protocol/server:</div><div class='del'>- 	* transport-type            GF_OPTION_TYPE_STR    tcp|socket|ib-verbs|unix|ib-sdp|</div><div class='del'>-	  			    			  tcp/client|ib-verbs/client</div><div class='del'>-        * volume-filename.*         GF_OPTION_TYPE_PATH</div><div class='del'>-	* inode-lru-limit           GF_OPTION_TYPE_INT    0-(1 * GF_UNIT_MB)</div><div class='del'>-	* client-volume-filename    GF_OPTION_TYPE_PATH</div><div class='del'>-</div><div class='del'>-protocol/client:</div><div class='del'>-	* username                  GF_OPTION_TYPE_ANY</div><div class='del'>-	* password                  GF_OPTION_TYPE_ANY </div><div class='del'>-	* transport-type            GF_OPTION_TYPE_STR   tcp|socket|ib-verbs|unix|ib-sdp|</div><div class='del'>-	  			    			 tcp/client|ib-verbs/client</div><div class='del'>-	* remote-host               GF_OPTION_TYPE_ANY </div><div class='del'>-	* remote-subvolume          GF_OPTION_TYPE_ANY </div><div class='del'>-	* transport-timeout         GF_OPTION_TYPE_TIME  5-1013 </div><div class='del'>-</div><div class='del'>-cluster/replicate:</div><div class='del'>-	* read-subvolume	    GF_OPTION_TYPE_XLATOR</div><div class='del'>-	* favorite-child 	    GF_OPTION_TYPE_XLATOR</div><div class='del'>-	* data-self-heal 	    GF_OPTION_TYPE_BOOL </div><div class='del'>-	* metadata-self-heal 	    GF_OPTION_TYPE_BOOL</div><div class='del'>-	* entry-self-heal 	    GF_OPTION_TYPE_BOOL </div><div class='del'>-	* data-change-log 	    GF_OPTION_TYPE_BOOL </div><div class='del'>-	* metadata-change-log 	    GF_OPTION_TYPE_BOOL</div><div class='del'>-	* entry-change-log 	    GF_OPTION_TYPE_BOOL</div><div class='del'>-	* data-lock-server-count    GF_OPTION_TYPE_INT    0</div><div class='del'>-	* metadata-lock-server-count GF_OPTION_TYPE_INT   0</div><div class='del'>-	* entry-lock-server-count    GF_OPTION_TYPE_INT   0</div><div class='del'>-</div><div class='del'>-cluster/distribute:</div><div class='del'>-	* lookup-unhashed           GF_OPTION_TYPE_BOOL </div><div class='del'>-</div><div class='del'>-cluster/unify:</div><div class='del'>-	* namespace		    GF_OPTION_TYPE_XLATOR </div><div class='del'>-	* scheduler 		    GF_OPTION_TYPE_STR    alu|rr|random|nufa|switch </div><div class='del'>-	* self-heal 		    GF_OPTION_TYPE_STR    foreground|background|off</div><div class='del'>-	* optimist  		    GF_OPTION_TYPE_BOOL </div><div class='del'>-</div><div class='del'>-cluster/nufa:</div><div class='del'>-	local-volume-name           GF_OPTION_TYPE_XLATOR </div><div class='del'>-</div><div class='del'>-cluster/stripe:</div><div class='del'>-	* block-size		    GF_OPTION_TYPE_ANY </div><div class='del'>-	* use-xattr  		    GF_OPTION_TYPE_BOOL</div><div class='del'>-</div><div class='del'>-debug/trace:</div><div class='del'>-	* include-ops (include)     GF_OPTION_TYPE_STR</div><div class='del'>-	* exclude-ops (exclude)     GF_OPTION_TYPE_STR </div><div class='del'>-</div><div class='del'>-encryption/rot-13:</div><div class='del'>-	* encrypt-write             GF_OPTION_TYPE_BOOL</div><div class='del'>-	* decrypt-read  	    GF_OPTION_TYPE_BOOL </div><div class='del'>-</div><div class='del'>-features/path-convertor:</div><div class='del'>-	* start-offset              GF_OPTION_TYPE_INT     0-4095 </div><div class='del'>-	* end-offset 		    GF_OPTION_TYPE_INT	   1-4096 </div><div class='del'>-	* replace-with		    GF_OPTION_TYPE_ANY</div><div class='del'>-</div><div class='del'>-features/trash:</div><div class='del'>-	* trash-dir	            GF_OPTION_TYPE_PATH </div><div class='del'>-</div><div class='del'>-features/locks:</div><div class='del'>-	* mandatory-locks (mandatory) GF_OPTION_TYPE_BOOL </div><div class='del'>-</div><div class='del'>-features/filter:</div><div class='del'>-	* root-squashing	    GF_OPTION_TYPE_BOOL </div><div class='del'>-	* read-only                 GF_OPTION_TYPE_BOOL</div><div class='del'>-	* fixed-uid		    GF_OPTION_TYPE_INT</div><div class='del'>-	* fixed-gid		    GF_OPTION_TYPE_INT</div><div class='del'>-	* translate-uid             GF_OPTION_TYPE_ANY </div><div class='del'>-	* translate-gid		    GF_OPTION_TYPE_ANY</div><div class='del'>-	* filter-uid		    GF_OPTION_TYPE_ANY </div><div class='del'>-	* filter-gid		    GF_OPTION_TYPE_ANY </div><div class='del'>-</div><div class='del'>-features/quota:</div><div class='del'>-	* min-free-disk-limit	    GF_OPTION_TYPE_PERCENT</div><div class='del'>-	* refresh-interval	    GF_OPTION_TYPE_TIME</div><div class='del'>-	* disk-usage-limit	    GF_OPTION_TYPE_SIZET </div><div class='del'>-</div><div class='del'>-storage/posix:</div><div class='del'>-	* o-direct		    GF_OPTION_TYPE_BOOL</div><div class='del'>-	* directory		    GF_OPTION_TYPE_PATH</div><div class='del'>-	* export-statfs-size	    GF_OPTION_TYPE_BOOL</div><div class='del'>-	* mandate-attribute	    GF_OPTION_TYPE_BOOL</div><div class='del'>-</div><div class='del'>-storage/bdb:</div><div class='del'>-	* directory                 GF_OPTION_TYPE_PATH</div><div class='del'>-	* logdir		    GF_OPTION_TYPE_PATH</div><div class='del'>-	* errfile		    GF_OPTION_TYPE_PATH</div><div class='del'>-	* dir-mode		    GF_OPTION_TYPE_ANY</div><div class='del'>-	* file-mode		    GF_OPTION_TYPE_ANY</div><div class='del'>-	* page-size		    GF_OPTION_TYPE_SIZET</div><div class='del'>-	* lru-limit		    GF_OPTION_TYPE_INT</div><div class='del'>-	* lock-timeout		    GF_OPTION_TYPE_TIME</div><div class='del'>-	* checkpoint-timeout	    GF_OPTION_TYPE_TIME</div><div class='del'>-	* transaction-timeout	    GF_OPTION_TYPE_TIME</div><div class='del'>-	* mode			    GF_OPTION_TYPE_BOOL</div><div class='del'>-	* access-mode		    GF_OPTION_TYPE_STR</div><div class='del'>-</div><div class='del'>-performance/read-ahead:</div><div class='del'>-	* force-atime-update        GF_OPTION_TYPE_BOOL </div><div class='del'>-	* page-size		    GF_OPTION_TYPE_SIZET (64 * GF_UNIT_KB)-(2 * GF_UNIT_MB)</div><div class='del'>-	* page-count		    GF_OPTION_TYPE_INT   1-16 </div><div class='del'>-</div><div class='del'>-performance/write-behind:</div><div class='del'>-	* flush-behind		    GF_OPTION_TYPE_BOOL</div><div class='del'>-	* aggregate-size	    GF_OPTION_TYPE_SIZET  (128 * GF_UNIT_KB)-(4 * GF_UNIT_MB) </div><div class='del'>-	* window-size		    GF_OPTION_TYPE_SIZET  (512 * GF_UNIT_KB)-(1 * GF_UNIT_GB) </div><div class='del'>-	* enable-O_SYNC		    GF_OPTION_TYPE_BOOL  </div><div class='del'>-	* disable-for-first-nbytes  GF_OPTION_TYPE_SIZET  1 - (1 * GF_UNIT_MB) </div><div class='del'>-</div><div class='del'>-performance/symlink-cache:</div><div class='del'>-</div><div class='del'>-performance/io-threads:</div><div class='del'>-	* thread-count	            GF_OPTION_TYPE_INT    1-32</div><div class='del'>-</div><div class='del'>-performance/io-cache:</div><div class='del'>-	* priority	            GF_OPTION_TYPE_ANY </div><div class='del'>-	* cache-timeout (force-revalidate-timeout) GF_OPTION_TYPE_INT 0-60 </div><div class='del'>-	* page-size	            GF_OPTION_TYPE_SIZET  (16 * GF_UNIT_KB)-(4 * GF_UNIT_MB) </div><div class='del'>-        * cache-size                GF_OPTION_TYPE_SIZET  (4 * GF_UNIT_MB)-(6 * GF_UNIT_GB)</div><div class='del'>-</div><div class='del'>-performance/quick-read:</div><div class='del'>-        * cache-timeout             GF_OPTION_TYPE_INT    1-60</div><div class='del'>-        * max-file-size             GF_OPTION_TYPE_SIZET  0-(1000 * GF_UNIT_KB)</div><div class='del'>-</div><div class='del'>-auth:</div><div class='del'>-- addr:</div><div class='del'>-	* auth.addr.*.allow	    GF_OPTION_TYPE_ANY </div><div class='del'>-	* auth.addr.*.reject	    GF_OPTION_TYPE_ANY </div><div class='del'>-</div><div class='del'>-- login:</div><div class='del'>-	* auth.login.*.allow	    GF_OPTION_TYPE_ANY </div><div class='del'>-	* auth.login.*.password	    GF_OPTION_TYPE_ANY</div><div class='del'>-</div><div class='del'>-scheduler/alu:</div><div class='del'>-	* scheduler.alu.order (alu.order) </div><div class='del'>-	                            GF_OPTION_TYPE_ANY </div><div class='del'>-	* scheduler.alu.disk-usage.entry-threshold (alu.disk-usage.entry-threshold)</div><div class='del'>-	  			    GF_OPTION_TYPE_SIZET</div><div class='del'>-        * scheduler.alu.disk-usage.exit-threshold (alu.disk-usage.exit-threshold)</div><div class='del'>-                                    GF_OPTION_TYPE_SIZET</div><div class='del'>-        * scheduler.alu.write-usage.entry-threshold (alu.write-usage.entry-threshold)</div><div class='del'>-                                    GF_OPTION_TYPE_SIZET</div><div class='del'>-        * scheduler.alu.write-usage.exit-threshold (alu.write-usage.exit-threshold)</div><div class='del'>-                                    GF_OPTION_TYPE_SIZET </div><div class='del'>-        * scheduler.alu.read-usage.entry-threshold (alu.read-usage.entry-threshold)</div><div class='del'>-                                    GF_OPTION_TYPE_SIZET</div><div class='del'>-        * scheduler.alu.read-usage.exit-threshold (alu.read-usage.exit-threshold)</div><div class='del'>-                                    GF_OPTION_TYPE_SIZET </div><div class='del'>-        * scheduler.alu.open-files-usage.entry-threshold (alu.open-files-usage.entry-threshold)</div><div class='del'>-                                    GF_OPTION_TYPE_INT</div><div class='del'>-        * scheduler.alu.open-files-usage.exit-threshold (alu.open-files-usage.exit-threshold)</div><div class='del'>-                                    GF_OPTION_TYPE_INT </div><div class='del'>-        * scheduler.read-only-subvolumes (alu.read-only-subvolumes)</div><div class='del'>-                                    GF_OPTION_TYPE_ANY </div><div class='del'>-        * scheduler.refresh-interval (alu.refresh-interval)</div><div class='del'>-                                    GF_OPTION_TYPE_TIME</div><div class='del'>-        * scheduler.limits.min-free-disk (alu.limits.min-free-disk)</div><div class='del'>-                                    GF_OPTION_TYPE_PERCENT</div><div class='del'>-        * scheduler.alu.stat-refresh.num-file-create (alu.stat-refresh.num-file-create)</div><div class='del'>-                                    GF_OPTION_TYPE_INT</div><div class='del'>-</div><div class='del'>-scheduler/nufa:</div><div class='del'>-	* scheduler.refresh-interval (nufa.refresh-interval) </div><div class='del'>-	                            GF_OPTION_TYPE_TIME</div><div class='del'>-	* scheduler.limits.min-free-disk (nufa.limits.min-free-disk) </div><div class='del'>-	                            GF_OPTION_TYPE_PERCENT</div><div class='del'>-	* scheduler.local-volume-name (nufa.local-volume-name) </div><div class='del'>-	                            GF_OPTION_TYPE_XLATOR</div><div class='del'>-</div><div class='del'>-scheduler/random:</div><div class='del'>-	* scheduler.refresh-interval (random.refresh-interval) GF_OPTION_TYPE_TIME</div><div class='del'>-	* scheduler.limits.min-free-disk (random.limits.min-free-disk) GF_OPTION_TYPE_PERCENT</div><div class='del'>-</div><div class='del'>-scheduler/rr:</div><div class='del'>-	* scheduler.refresh-interval (rr.refresh-interval)  GF_OPTION_TYPE_TIME</div><div class='del'>-	* scheduler.limits.min-free-disk (rr.limits.min-free-disk) GF_OPTION_TYPE_PERCENT</div><div class='del'>-	* scheduler.read-only-subvolumes (rr.read-only-subvolumes) GF_OPTION_TYPE_ANY</div><div class='del'>-</div><div class='del'>-scheduler/switch:</div><div class='del'>-	* scheduler.read-only-subvolumes (switch.read-only-subvolumes) GF_OPTION_TYPE_ANY</div><div class='del'>-	* scheduler.local-volume-name (switch.nufa.local-volume-name) GF_OPTION_TYPE_XLATOR</div><div class='del'>-	* scheduler.switch.case (switch.case) GF_OPTION_TYPE_ANY</div><div class='del'>-</div><div class='del'>-transport/ib-verbs:</div><div class='del'>-	* transport.ib-verbs.port (ib-verbs-port) GF_OPTION_TYPE_INT 1-4</div><div class='del'>-	                         check the option by 'ibv_devinfo'</div><div class='del'>-        * transport.ib-verbs.mtu (ib-verbs-mtu) GF_OPTION_TYPE_INT</div><div class='del'>-	* transport.ib-verbs.device-name (ib-verbs-device-name) GF_OPTION_TYPE_ANY,</div><div class='del'>-                                 check by 'ibv_devinfo'</div><div class='del'>-        * transport.ib-verbs.work-request-send-size (ib-verbs-work-request-send-size)</div><div class='del'>-	                         GF_OPTION_TYPE_INT,</div><div class='del'>-        * transport.ib-verbs.work-request-recv-size (ib-verbs-work-request-recv-size)</div><div class='del'>-	                         GF_OPTION_TYPE_INT</div><div class='del'>-        * transport.ib-verbs.work-request-send-count (ib-verbs-work-request-send-count)</div><div class='del'>-                                 GF_OPTION_TYPE_INT</div><div class='del'>-        * transport.ib-verbs.work-request-recv-count (ib-verbs-work-request-recv-count)</div><div class='del'>-                                 GF_OPTION_TYPE_INT</div><div class='del'>-        * remote-port (transport.remote-port,transport.ib-verbs.remote-port)</div><div class='del'>-	                         GF_OPTION_TYPE_INT </div><div class='del'>-        * transport.ib-verbs.listen-port  GF_OPTION_TYPE_INT </div><div class='del'>-        * transport.ib-verbs.connect-path (connect-path) GF_OPTION_TYPE_ANY </div><div class='del'>-        * transport.ib-verbs.bind-path (bind-path) GF_OPTION_TYPE_ANY </div><div class='del'>-        * transport.ib-verbs.listen-path (listen-path) GF_OPTION_TYPE_ANY </div><div class='del'>-        * transport.address-family (address-family) GF_OPTION_TYPE_STR inet|inet6|inet/inet6|</div><div class='del'>-                                                                       inet6/inet|unix|inet-sdp</div><div class='del'>-</div><div class='del'>-transport/socket:</div><div class='del'>-	* transport.remote-port (remote-port,transport.socket.remote-port) GF_OPTION_TYPE_INT </div><div class='del'>-	* transport.socket.listen-port (listen-port) GF_OPTION_TYPE_INT </div><div class='del'>-	* transport.socket.bind-address (bind-address) GF_OPTION_TYPE_ANY </div><div class='del'>-	* transport.socket.connect-path (connect-path) GF_OPTION_TYPE_ANY </div><div class='del'>-	* transport.socket.bind-path (bind-path)       GF_OPTION_TYPE_ANY </div><div class='del'>-	* transport.socket.listen-path (listen-path)   GF_OPTION_TYPE_ANY</div><div class='del'>-	* transport.address-family (address-family)    GF_OPTION_TYPE_STR  inet|inet6|</div><div class='del'>-	  			   		       			   inet/inet6|inet6/inet|</div><div class='del'>-									   unix|inet-sdp</div><div class='head'>diff --git a/doc/user-guide/Makefile.am b/doc/user-guide/Makefile.am<br/>deleted file mode 100644<br/>index 800e7321d79..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/doc/user-guide/Makefile.am?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>doc/user-guide/Makefile.am</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,3 +0,0 @@</div><div class='del'>-info_TEXINFOS = user-guide.texi</div><div class='del'>-CLEANFILES = *~ </div><div class='del'>-DISTCLEANFILES = .deps/*.P *.info *vti</div><div class='head'>diff --git a/doc/user-guide/advanced-stripe.odg b/doc/user-guide/advanced-stripe.odg<br/>deleted file mode 100644<br/>index 7686d7091b2..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/doc/user-guide/advanced-stripe.odg?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>doc/user-guide/advanced-stripe.odg</a><br/>+++ /dev/null</div>Binary files differ<div class='head'>diff --git a/doc/user-guide/advanced-stripe.pdf b/doc/user-guide/advanced-stripe.pdf<br/>deleted file mode 100644<br/>index ec8b03dcfbb..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/doc/user-guide/advanced-stripe.pdf?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>doc/user-guide/advanced-stripe.pdf</a><br/>+++ /dev/null</div>Binary files differ<div class='head'>diff --git a/doc/user-guide/colonO-icon.jpg b/doc/user-guide/colonO-icon.jpg<br/>deleted file mode 100644<br/>index 3e66f7a2775..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/doc/user-guide/colonO-icon.jpg?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>doc/user-guide/colonO-icon.jpg</a><br/>+++ /dev/null</div>Binary files differ<div class='head'>diff --git a/doc/user-guide/fdl.texi b/doc/user-guide/fdl.texi<br/>deleted file mode 100644<br/>index e33c687cdfb..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/doc/user-guide/fdl.texi?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>doc/user-guide/fdl.texi</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,454 +0,0 @@</div><div class='del'>-</div><div class='del'>-@c @node GNU Free Documentation License</div><div class='del'>-@c @appendixsec GNU Free Documentation License</div><div class='del'>-</div><div class='del'>-@cindex FDL, GNU Free Documentation License</div><div class='del'>-@center Version 1.2, November 2002</div><div class='del'>-</div><div class='del'>-@display</div><div class='del'>-Copyright @copyright{} 2000,2001,2002 Free Software Foundation, Inc.</div><div class='del'>-59 Temple Place, Suite 330, Boston, MA  02111-1307, USA</div><div class='del'>-</div><div class='del'>-Everyone is permitted to copy and distribute verbatim copies</div><div class='del'>-of this license document, but changing it is not allowed.</div><div class='del'>-@end display</div><div class='del'>-</div><div class='del'>-@enumerate 0</div><div class='del'>-@item</div><div class='del'>-PREAMBLE</div><div class='del'>-</div><div class='del'>-The purpose of this License is to make a manual, textbook, or other</div><div class='del'>-functional and useful document @dfn{free} in the sense of freedom: to</div><div class='del'>-assure everyone the effective freedom to copy and redistribute it,</div><div class='del'>-with or without modifying it, either commercially or noncommercially.</div><div class='del'>-Secondarily, this License preserves for the author and publisher a way</div><div class='del'>-to get credit for their work, while not being considered responsible</div><div class='del'>-for modifications made by others.</div><div class='del'>-</div><div class='del'>-This License is a kind of ``copyleft'', which means that derivative</div><div class='del'>-works of the document must themselves be free in the same sense.  It</div><div class='del'>-complements the GNU General Public License, which is a copyleft</div><div class='del'>-license designed for free software.</div><div class='del'>-</div><div class='del'>-We have designed this License in order to use it for manuals for free</div><div class='del'>-software, because free software needs free documentation: a free</div><div class='del'>-program should come with manuals providing the same freedoms that the</div><div class='del'>-software does.  But this License is not limited to software manuals;</div><div class='del'>-it can be used for any textual work, regardless of subject matter or</div><div class='del'>-whether it is published as a printed book.  We recommend this License</div><div class='del'>-principally for works whose purpose is instruction or reference.</div><div class='del'>-</div><div class='del'>-@item</div><div class='del'>-APPLICABILITY AND DEFINITIONS</div><div class='del'>-</div><div class='del'>-This License applies to any manual or other work, in any medium, that</div><div class='del'>-contains a notice placed by the copyright holder saying it can be</div><div class='del'>-distributed under the terms of this License.  Such a notice grants a</div><div class='del'>-world-wide, royalty-free license, unlimited in duration, to use that</div><div class='del'>-work under the conditions stated herein.  The ``Document'', below,</div><div class='del'>-refers to any such manual or work.  Any member of the public is a</div><div class='del'>-licensee, and is addressed as ``you''.  You accept the license if you</div><div class='del'>-copy, modify or distribute the work in a way requiring permission</div><div class='del'>-under copyright law.</div><div class='del'>-</div><div class='del'>-A ``Modified Version'' of the Document means any work containing the</div><div class='del'>-Document or a portion of it, either copied verbatim, or with</div><div class='del'>-modifications and/or translated into another language.</div><div class='del'>-</div><div class='del'>-A ``Secondary Section'' is a named appendix or a front-matter section</div><div class='del'>-of the Document that deals exclusively with the relationship of the</div><div class='del'>-publishers or authors of the Document to the Document's overall</div><div class='del'>-subject (or to related matters) and contains nothing that could fall</div><div class='del'>-directly within that overall subject.  (Thus, if the Document is in</div><div class='del'>-part a textbook of mathematics, a Secondary Section may not explain</div><div class='del'>-any mathematics.)  The relationship could be a matter of historical</div><div class='del'>-connection with the subject or with related matters, or of legal,</div><div class='del'>-commercial, philosophical, ethical or political position regarding</div><div class='del'>-them.</div><div class='del'>-</div><div class='del'>-The ``Invariant Sections'' are certain Secondary Sections whose titles</div><div class='del'>-are designated, as being those of Invariant Sections, in the notice</div><div class='del'>-that says that the Document is released under this License.  If a</div><div class='del'>-section does not fit the above definition of Secondary then it is not</div><div class='del'>-allowed to be designated as Invariant.  The Document may contain zero</div><div class='del'>-Invariant Sections.  If the Document does not identify any Invariant</div><div class='del'>-Sections then there are none.</div><div class='del'>-</div><div class='del'>-The ``Cover Texts'' are certain short passages of text that are listed,</div><div class='del'>-as Front-Cover Texts or Back-Cover Texts, in the notice that says that</div><div class='del'>-the Document is released under this License.  A Front-Cover Text may</div><div class='del'>-be at most 5 words, and a Back-Cover Text may be at most 25 words.</div><div class='del'>-</div><div class='del'>-A ``Transparent'' copy of the Document means a machine-readable copy,</div><div class='del'>-represented in a format whose specification is available to the</div><div class='del'>-general public, that is suitable for revising the document</div><div class='del'>-straightforwardly with generic text editors or (for images composed of</div><div class='del'>-pixels) generic paint programs or (for drawings) some widely available</div><div class='del'>-drawing editor, and that is suitable for input to text formatters or</div><div class='del'>-for automatic translation to a variety of formats suitable for input</div><div class='del'>-to text formatters.  A copy made in an otherwise Transparent file</div><div class='del'>-format whose markup, or absence of markup, has been arranged to thwart</div><div class='del'>-or discourage subsequent modification by readers is not Transparent.</div><div class='del'>-An image format is not Transparent if used for any substantial amount</div><div class='del'>-of text.  A copy that is not ``Transparent'' is called ``Opaque''.</div><div class='del'>-</div><div class='del'>-Examples of suitable formats for Transparent copies include plain</div><div class='del'>-@sc{ascii} without markup, Texinfo input format, La@TeX{} input</div><div class='del'>-format, @acronym{SGML} or @acronym{XML} using a publicly available</div><div class='del'>-@acronym{DTD}, and standard-conforming simple @acronym{HTML},</div><div class='del'>-PostScript or @acronym{PDF} designed for human modification.  Examples</div><div class='del'>-of transparent image formats include @acronym{PNG}, @acronym{XCF} and</div><div class='del'>-@acronym{JPG}.  Opaque formats include proprietary formats that can be</div><div class='del'>-read and edited only by proprietary word processors, @acronym{SGML} or</div><div class='del'>-@acronym{XML} for which the @acronym{DTD} and/or processing tools are</div><div class='del'>-not generally available, and the machine-generated @acronym{HTML},</div><div class='del'>-PostScript or @acronym{PDF} produced by some word processors for</div><div class='del'>-output purposes only.</div><div class='del'>-</div><div class='del'>-The ``Title Page'' means, for a printed book, the title page itself,</div><div class='del'>-plus such following pages as are needed to hold, legibly, the material</div><div class='del'>-this License requires to appear in the title page.  For works in</div><div class='del'>-formats which do not have any title page as such, ``Title Page'' means</div><div class='del'>-the text near the most prominent appearance of the work's title,</div><div class='del'>-preceding the beginning of the body of the text.</div><div class='del'>-</div><div class='del'>-A section ``Entitled XYZ'' means a named subunit of the Document whose</div><div class='del'>-title either is precisely XYZ or contains XYZ in parentheses following</div><div class='del'>-text that translates XYZ in another language.  (Here XYZ stands for a</div><div class='del'>-specific section name mentioned below, such as ``Acknowledgements'',</div><div class='del'>-``Dedications'', ``Endorsements'', or ``History''.)  To ``Preserve the Title''</div><div class='del'>-of such a section when you modify the Document means that it remains a</div><div class='del'>-section ``Entitled XYZ'' according to this definition.</div><div class='del'>-</div><div class='del'>-The Document may include Warranty Disclaimers next to the notice which</div><div class='del'>-states that this License applies to the Document.  These Warranty</div><div class='del'>-Disclaimers are considered to be included by reference in this</div><div class='del'>-License, but only as regards disclaiming warranties: any other</div><div class='del'>-implication that these Warranty Disclaimers may have is void and has</div><div class='del'>-no effect on the meaning of this License.</div><div class='del'>-</div><div class='del'>-@item</div><div class='del'>-VERBATIM COPYING</div><div class='del'>-</div><div class='del'>-You may copy and distribute the Document in any medium, either</div><div class='del'>-commercially or noncommercially, provided that this License, the</div><div class='del'>-copyright notices, and the license notice saying this License applies</div><div class='del'>-to the Document are reproduced in all copies, and that you add no other</div><div class='del'>-conditions whatsoever to those of this License.  You may not use</div><div class='del'>-technical measures to obstruct or control the reading or further</div><div class='del'>-copying of the copies you make or distribute.  However, you may accept</div><div class='del'>-compensation in exchange for copies.  If you distribute a large enough</div><div class='del'>-number of copies you must also follow the conditions in section 3.</div><div class='del'>-</div><div class='del'>-You may also lend copies, under the same conditions stated above, and</div><div class='del'>-you may publicly display copies.</div><div class='del'>-</div><div class='del'>-@item</div><div class='del'>-COPYING IN QUANTITY</div><div class='del'>-</div><div class='del'>-If you publish printed copies (or copies in media that commonly have</div><div class='del'>-printed covers) of the Document, numbering more than 100, and the</div><div class='del'>-Document's license notice requires Cover Texts, you must enclose the</div><div class='del'>-copies in covers that carry, clearly and legibly, all these Cover</div><div class='del'>-Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on</div><div class='del'>-the back cover.  Both covers must also clearly and legibly identify</div><div class='del'>-you as the publisher of these copies.  The front cover must present</div><div class='del'>-the full title with all words of the title equally prominent and</div><div class='del'>-visible.  You may add other material on the covers in addition.</div><div class='del'>-Copying with changes limited to the covers, as long as they preserve</div><div class='del'>-the title of the Document and satisfy these conditions, can be treated</div><div class='del'>-as verbatim copying in other respects.</div><div class='del'>-</div><div class='del'>-If the required texts for either cover are too voluminous to fit</div><div class='del'>-legibly, you should put the first ones listed (as many as fit</div><div class='del'>-reasonably) on the actual cover, and continue the rest onto adjacent</div><div class='del'>-pages.</div><div class='del'>-</div><div class='del'>-If you publish or distribute Opaque copies of the Document numbering</div><div class='del'>-more than 100, you must either include a machine-readable Transparent</div><div class='del'>-copy along with each Opaque copy, or state in or with each Opaque copy</div><div class='del'>-a computer-network location from which the general network-using</div><div class='del'>-public has access to download using public-standard network protocols</div><div class='del'>-a complete Transparent copy of the Document, free of added material.</div><div class='del'>-If you use the latter option, you must take reasonably prudent steps,</div><div class='del'>-when you begin distribution of Opaque copies in quantity, to ensure</div><div class='del'>-that this Transparent copy will remain thus accessible at the stated</div><div class='del'>-location until at least one year after the last time you distribute an</div><div class='del'>-Opaque copy (directly or through your agents or retailers) of that</div><div class='del'>-edition to the public.</div><div class='del'>-</div><div class='del'>-It is requested, but not required, that you contact the authors of the</div><div class='del'>-Document well before redistributing any large number of copies, to give</div><div class='del'>-them a chance to provide you with an updated version of the Document.</div><div class='del'>-</div><div class='del'>-@item</div><div class='del'>-MODIFICATIONS</div><div class='del'>-</div><div class='del'>-You may copy and distribute a Modified Version of the Document under</div><div class='del'>-the conditions of sections 2 and 3 above, provided that you release</div><div class='del'>-the Modified Version under precisely this License, with the Modified</div><div class='del'>-Version filling the role of the Document, thus licensing distribution</div><div class='del'>-and modification of the Modified Version to whoever possesses a copy</div><div class='del'>-of it.  In addition, you must do these things in the Modified Version:</div><div class='del'>-</div><div class='del'>-@enumerate A</div><div class='del'>-@item</div><div class='del'>-Use in the Title Page (and on the covers, if any) a title distinct</div><div class='del'>-from that of the Document, and from those of previous versions</div><div class='del'>-(which should, if there were any, be listed in the History section</div><div class='del'>-of the Document).  You may use the same title as a previous version</div><div class='del'>-if the original publisher of that version gives permission.</div><div class='del'>-</div><div class='del'>-@item</div><div class='del'>-List on the Title Page, as authors, one or more persons or entities</div><div class='del'>-responsible for authorship of the modifications in the Modified</div><div class='del'>-Version, together with at least five of the principal authors of the</div><div class='del'>-Document (all of its principal authors, if it has fewer than five),</div><div class='del'>-unless they release you from this requirement.</div><div class='del'>-</div><div class='del'>-@item</div><div class='del'>-State on the Title page the name of the publisher of the</div><div class='del'>-Modified Version, as the publisher.</div><div class='del'>-</div><div class='del'>-@item</div><div class='del'>-Preserve all the copyright notices of the Document.</div><div class='del'>-</div><div class='del'>-@item</div><div class='del'>-Add an appropriate copyright notice for your modifications</div><div class='del'>-adjacent to the other copyright notices.</div><div class='del'>-</div><div class='del'>-@item</div><div class='del'>-Include, immediately after the copyright notices, a license notice</div><div class='del'>-giving the public permission to use the Modified Version under the</div><div class='del'>-terms of this License, in the form shown in the Addendum below.</div><div class='del'>-</div><div class='del'>-@item</div><div class='del'>-Preserve in that license notice the full lists of Invariant Sections</div><div class='del'>-and required Cover Texts given in the Document's license notice.</div><div class='del'>-</div><div class='del'>-@item</div><div class='del'>-Include an unaltered copy of this License.</div><div class='del'>-</div><div class='del'>-@item</div><div class='del'>-Preserve the section Entitled ``History'', Preserve its Title, and add</div><div class='del'>-to it an item stating at least the title, year, new authors, and</div><div class='del'>-publisher of the Modified Version as given on the Title Page.  If</div><div class='del'>-there is no section Entitled ``History'' in the Document, create one</div><div class='del'>-stating the title, year, authors, and publisher of the Document as</div><div class='del'>-given on its Title Page, then add an item describing the Modified</div><div class='del'>-Version as stated in the previous sentence.</div><div class='del'>-</div><div class='del'>-@item</div><div class='del'>-Preserve the network location, if any, given in the Document for</div><div class='del'>-public access to a Transparent copy of the Document, and likewise</div><div class='del'>-the network locations given in the Document for previous versions</div><div class='del'>-it was based on.  These may be placed in the ``History'' section.</div><div class='del'>-You may omit a network location for a work that was published at</div><div class='del'>-least four years before the Document itself, or if the original</div><div class='del'>-publisher of the version it refers to gives permission.</div><div class='del'>-</div><div class='del'>-@item</div><div class='del'>-For any section Entitled ``Acknowledgements'' or ``Dedications'', Preserve</div><div class='del'>-the Title of the section, and preserve in the section all the</div><div class='del'>-substance and tone of each of the contributor acknowledgements and/or</div><div class='del'>-dedications given therein.</div><div class='del'>-</div><div class='del'>-@item</div><div class='del'>-Preserve all the Invariant Sections of the Document,</div><div class='del'>-unaltered in their text and in their titles.  Section numbers</div><div class='del'>-or the equivalent are not considered part of the section titles.</div><div class='del'>-</div><div class='del'>-@item</div><div class='del'>-Delete any section Entitled ``Endorsements''.  Such a section</div><div class='del'>-may not be included in the Modified Version.</div><div class='del'>-</div><div class='del'>-@item</div><div class='del'>-Do not retitle any existing section to be Entitled ``Endorsements'' or</div><div class='del'>-to conflict in title with any Invariant Section.</div><div class='del'>-</div><div class='del'>-@item</div><div class='del'>-Preserve any Warranty Disclaimers.</div><div class='del'>-@end enumerate</div><div class='del'>-</div><div class='del'>-If the Modified Version includes new front-matter sections or</div><div class='del'>-appendices that qualify as Secondary Sections and contain no material</div><div class='del'>-copied from the Document, you may at your option designate some or all</div><div class='del'>-of these sections as invariant.  To do this, add their titles to the</div><div class='del'>-list of Invariant Sections in the Modified Version's license notice.</div><div class='del'>-These titles must be distinct from any other section titles.</div><div class='del'>-</div><div class='del'>-You may add a section Entitled ``Endorsements'', provided it contains</div><div class='del'>-nothing but endorsements of your Modified Version by various</div><div class='del'>-parties---for example, statements of peer review or that the text has</div><div class='del'>-been approved by an organization as the authoritative definition of a</div><div class='del'>-standard.</div><div class='del'>-</div><div class='del'>-You may add a passage of up to five words as a Front-Cover Text, and a</div><div class='del'>-passage of up to 25 words as a Back-Cover Text, to the end of the list</div><div class='del'>-of Cover Texts in the Modified Version.  Only one passage of</div><div class='del'>-Front-Cover Text and one of Back-Cover Text may be added by (or</div><div class='del'>-through arrangements made by) any one entity.  If the Document already</div><div class='del'>-includes a cover text for the same cover, previously added by you or</div><div class='del'>-by arrangement made by the same entity you are acting on behalf of,</div><div class='del'>-you may not add another; but you may replace the old one, on explicit</div><div class='del'>-permission from the previous publisher that added the old one.</div><div class='del'>-</div><div class='del'>-The author(s) and publisher(s) of the Document do not by this License</div><div class='del'>-give permission to use their names for publicity for or to assert or</div><div class='del'>-imply endorsement of any Modified Version.</div><div class='del'>-</div><div class='del'>-@item</div><div class='del'>-COMBINING DOCUMENTS</div><div class='del'>-</div><div class='del'>-You may combine the Document with other documents released under this</div><div class='del'>-License, under the terms defined in section 4 above for modified</div><div class='del'>-versions, provided that you include in the combination all of the</div><div class='del'>-Invariant Sections of all of the original documents, unmodified, and</div><div class='del'>-list them all as Invariant Sections of your combined work in its</div><div class='del'>-license notice, and that you preserve all their Warranty Disclaimers.</div><div class='del'>-</div><div class='del'>-The combined work need only contain one copy of this License, and</div><div class='del'>-multiple identical Invariant Sections may be replaced with a single</div><div class='del'>-copy.  If there are multiple Invariant Sections with the same name but</div><div class='del'>-different contents, make the title of each such section unique by</div><div class='del'>-adding at the end of it, in parentheses, the name of the original</div><div class='del'>-author or publisher of that section if known, or else a unique number.</div><div class='del'>-Make the same adjustment to the section titles in the list of</div><div class='del'>-Invariant Sections in the license notice of the combined work.</div><div class='del'>-</div><div class='del'>-In the combination, you must combine any sections Entitled ``History''</div><div class='del'>-in the various original documents, forming one section Entitled</div><div class='del'>-``History''; likewise combine any sections Entitled ``Acknowledgements'',</div><div class='del'>-and any sections Entitled ``Dedications''.  You must delete all</div><div class='del'>-sections Entitled ``Endorsements.''</div><div class='del'>-</div><div class='del'>-@item</div><div class='del'>-COLLECTIONS OF DOCUMENTS</div><div class='del'>-</div><div class='del'>-You may make a collection consisting of the Document and other documents</div><div class='del'>-released under this License, and replace the individual copies of this</div><div class='del'>-License in the various documents with a single copy that is included in</div><div class='del'>-the collection, provided that you follow the rules of this License for</div><div class='del'>-verbatim copying of each of the documents in all other respects.</div><div class='del'>-</div><div class='del'>-You may extract a single document from such a collection, and distribute</div><div class='del'>-it individually under this License, provided you insert a copy of this</div><div class='del'>-License into the extracted document, and follow this License in all</div><div class='del'>-other respects regarding verbatim copying of that document.</div><div class='del'>-</div><div class='del'>-@item</div><div class='del'>-AGGREGATION WITH INDEPENDENT WORKS</div><div class='del'>-</div><div class='del'>-A compilation of the Document or its derivatives with other separate</div><div class='del'>-and independent documents or works, in or on a volume of a storage or</div><div class='del'>-distribution medium, is called an ``aggregate'' if the copyright</div><div class='del'>-resulting from the compilation is not used to limit the legal rights</div><div class='del'>-of the compilation's users beyond what the individual works permit.</div><div class='del'>-When the Document is included in an aggregate, this License does not</div><div class='del'>-apply to the other works in the aggregate which are not themselves</div><div class='del'>-derivative works of the Document.</div><div class='del'>-</div><div class='del'>-If the Cover Text requirement of section 3 is applicable to these</div><div class='del'>-copies of the Document, then if the Document is less than one half of</div><div class='del'>-the entire aggregate, the Document's Cover Texts may be placed on</div><div class='del'>-covers that bracket the Document within the aggregate, or the</div><div class='del'>-electronic equivalent of covers if the Document is in electronic form.</div><div class='del'>-Otherwise they must appear on printed covers that bracket the whole</div><div class='del'>-aggregate.</div><div class='del'>-</div><div class='del'>-@item</div><div class='del'>-TRANSLATION</div><div class='del'>-</div><div class='del'>-Translation is considered a kind of modification, so you may</div><div class='del'>-distribute translations of the Document under the terms of section 4.</div><div class='del'>-Replacing Invariant Sections with translations requires special</div><div class='del'>-permission from their copyright holders, but you may include</div><div class='del'>-translations of some or all Invariant Sections in addition to the</div><div class='del'>-original versions of these Invariant Sections.  You may include a</div><div class='del'>-translation of this License, and all the license notices in the</div><div class='del'>-Document, and any Warranty Disclaimers, provided that you also include</div><div class='del'>-the original English version of this License and the original versions</div><div class='del'>-of those notices and disclaimers.  In case of a disagreement between</div><div class='del'>-the translation and the original version of this License or a notice</div><div class='del'>-or disclaimer, the original version will prevail.</div><div class='del'>-</div><div class='del'>-If a section in the Document is Entitled ``Acknowledgements'',</div><div class='del'>-``Dedications'', or ``History'', the requirement (section 4) to Preserve</div><div class='del'>-its Title (section 1) will typically require changing the actual</div><div class='del'>-title.</div><div class='del'>-</div><div class='del'>-@item</div><div class='del'>-TERMINATION</div><div class='del'>-</div><div class='del'>-You may not copy, modify, sublicense, or distribute the Document except</div><div class='del'>-as expressly provided for under this License.  Any other attempt to</div><div class='del'>-copy, modify, sublicense or distribute the Document is void, and will</div><div class='del'>-automatically terminate your rights under this License.  However,</div><div class='del'>-parties who have received copies, or rights, from you under this</div><div class='del'>-License will not have their licenses terminated so long as such</div><div class='del'>-parties remain in full compliance.</div><div class='del'>-</div><div class='del'>-@item</div><div class='del'>-FUTURE REVISIONS OF THIS LICENSE</div><div class='del'>-</div><div class='del'>-The Free Software Foundation may publish new, revised versions</div><div class='del'>-of the GNU Free Documentation License from time to time.  Such new</div><div class='del'>-versions will be similar in spirit to the present version, but may</div><div class='del'>-differ in detail to address new problems or concerns.  See</div><div class='del'>-@uref{http://www.gnu.org/copyleft/}.</div><div class='del'>-</div><div class='del'>-Each version of the License is given a distinguishing version number.</div><div class='del'>-If the Document specifies that a particular numbered version of this</div><div class='del'>-License ``or any later version'' applies to it, you have the option of</div><div class='del'>-following the terms and conditions either of that specified version or</div><div class='del'>-of any later version that has been published (not as a draft) by the</div><div class='del'>-Free Software Foundation.  If the Document does not specify a version</div><div class='del'>-number of this License, you may choose any version ever published (not</div><div class='del'>-as a draft) by the Free Software Foundation.</div><div class='del'>-@end enumerate</div><div class='del'>-</div><div class='del'>-@page</div><div class='del'>-@c @appendixsubsec ADDENDUM: How to use this License for your</div><div class='del'>-@c documents</div><div class='del'>-@subsection ADDENDUM: How to use this License for your documents</div><div class='del'>-</div><div class='del'>-To use this License in a document you have written, include a copy of</div><div class='del'>-the License in the document and put the following copyright and</div><div class='del'>-license notices just after the title page:</div><div class='del'>-</div><div class='del'>-@smallexample</div><div class='del'>-@group</div><div class='del'>-  Copyright (C)  @var{year}  @var{your name}.</div><div class='del'>-  Permission is granted to copy, distribute and/or modify this document</div><div class='del'>-  under the terms of the GNU Free Documentation License, Version 1.2</div><div class='del'>-  or any later version published by the Free Software Foundation;</div><div class='del'>-  with no Invariant Sections, no Front-Cover Texts, and no Back-Cover</div><div class='del'>-  Texts.  A copy of the license is included in the section entitled ``GNU</div><div class='del'>-  Free Documentation License''.</div><div class='del'>-@end group</div><div class='del'>-@end smallexample</div><div class='del'>-</div><div class='del'>-If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts,</div><div class='del'>-replace the ``with...Texts.'' line with this:</div><div class='del'>-</div><div class='del'>-@smallexample</div><div class='del'>-@group</div><div class='del'>-    with the Invariant Sections being @var{list their titles}, with</div><div class='del'>-    the Front-Cover Texts being @var{list}, and with the Back-Cover Texts</div><div class='del'>-    being @var{list}.</div><div class='del'>-@end group</div><div class='del'>-@end smallexample</div><div class='del'>-</div><div class='del'>-If you have Invariant Sections without Cover Texts, or some other</div><div class='del'>-combination of the three, merge those two alternatives to suit the</div><div class='del'>-situation.</div><div class='del'>-</div><div class='del'>-If your document contains nontrivial examples of program code, we</div><div class='del'>-recommend releasing these examples in parallel under your choice of</div><div class='del'>-free software license, such as the GNU General Public License,</div><div class='del'>-to permit their use in free software.</div><div class='del'>-</div><div class='del'>-@c Local Variables:</div><div class='del'>-@c ispell-local-pdict: "ispell-dict"</div><div class='del'>-@c End:</div><div class='del'>-</div><div class='head'>diff --git a/doc/user-guide/fuse.odg b/doc/user-guide/fuse.odg<br/>deleted file mode 100644<br/>index 61bd103c78b..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/doc/user-guide/fuse.odg?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>doc/user-guide/fuse.odg</a><br/>+++ /dev/null</div>Binary files differ<div class='head'>diff --git a/doc/user-guide/fuse.pdf b/doc/user-guide/fuse.pdf<br/>deleted file mode 100644<br/>index a7d13faff56..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/doc/user-guide/fuse.pdf?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>doc/user-guide/fuse.pdf</a><br/>+++ /dev/null</div>Binary files differ<div class='head'>diff --git a/doc/user-guide/ha.odg b/doc/user-guide/ha.odg<br/>deleted file mode 100644<br/>index e4b8b72d08b..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/doc/user-guide/ha.odg?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>doc/user-guide/ha.odg</a><br/>+++ /dev/null</div>Binary files differ<div class='head'>diff --git a/doc/user-guide/ha.pdf b/doc/user-guide/ha.pdf<br/>deleted file mode 100644<br/>index e372c0ab03e..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/doc/user-guide/ha.pdf?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>doc/user-guide/ha.pdf</a><br/>+++ /dev/null</div>Binary files differ<div class='head'>diff --git a/doc/user-guide/stripe.odg b/doc/user-guide/stripe.odg<br/>deleted file mode 100644<br/>index 79441bf1452..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/doc/user-guide/stripe.odg?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>doc/user-guide/stripe.odg</a><br/>+++ /dev/null</div>Binary files differ<div class='head'>diff --git a/doc/user-guide/stripe.pdf b/doc/user-guide/stripe.pdf<br/>deleted file mode 100644<br/>index b94446feb56..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/doc/user-guide/stripe.pdf?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>doc/user-guide/stripe.pdf</a><br/>+++ /dev/null</div>Binary files differ<div class='head'>diff --git a/doc/user-guide/unify.odg b/doc/user-guide/unify.odg<br/>deleted file mode 100644<br/>index ccaa9bf16f9..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/doc/user-guide/unify.odg?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>doc/user-guide/unify.odg</a><br/>+++ /dev/null</div>Binary files differ<div class='head'>diff --git a/doc/user-guide/unify.pdf b/doc/user-guide/unify.pdf<br/>deleted file mode 100644<br/>index c22027f66e7..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/doc/user-guide/unify.pdf?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>doc/user-guide/unify.pdf</a><br/>+++ /dev/null</div>Binary files differ<div class='head'>diff --git a/doc/user-guide/user-guide.info b/doc/user-guide/user-guide.info<br/>deleted file mode 100644<br/>index 10992d7e234..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/doc/user-guide/user-guide.info?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>doc/user-guide/user-guide.info</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,2697 +0,0 @@</div><div class='del'>-This is ../../../doc/user-guide/user-guide.info, produced by makeinfo version 4.13 from ../../../doc/user-guide/user-guide.texi.</div><div class='del'>-</div><div class='del'>-START-INFO-DIR-ENTRY</div><div class='del'>-* GlusterFS: (user-guide). GlusterFS distributed filesystem user guide</div><div class='del'>-END-INFO-DIR-ENTRY</div><div class='del'>-</div><div class='del'>-   This is the user manual for GlusterFS 2.0.</div><div class='del'>-</div><div class='del'>-   Copyright (C) 2007-2009 Gluster, Inc. Permission is granted to</div><div class='del'>-copy, distribute and/or modify this document under the terms of the GNU</div><div class='del'>-Free Documentation License, Version 1.2 or any later version published</div><div class='del'>-by the Free Software Foundation; with no Invariant Sections, no</div><div class='del'>-Front-Cover Texts, and no Back-Cover Texts. A copy of the license is</div><div class='del'>-included in the chapter entitled "GNU Free Documentation License".</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-File: user-guide.info,  Node: Top,  Next: Acknowledgements,  Up: (dir)</div><div class='del'>-</div><div class='del'>-GlusterFS 2.0 User Guide</div><div class='del'>-************************</div><div class='del'>-</div><div class='del'>-This is the user manual for GlusterFS 2.0.</div><div class='del'>-</div><div class='del'>-   Copyright (C) 2007-2009 Gluster, Inc. Permission is granted to</div><div class='del'>-copy, distribute and/or modify this document under the terms of the GNU</div><div class='del'>-Free Documentation License, Version 1.2 or any later version published</div><div class='del'>-by the Free Software Foundation; with no Invariant Sections, no</div><div class='del'>-Front-Cover Texts, and no Back-Cover Texts. A copy of the license is</div><div class='del'>-included in the chapter entitled "GNU Free Documentation License".</div><div class='del'>-</div><div class='del'>-* Menu:</div><div class='del'>-</div><div class='del'>-* Acknowledgements::</div><div class='del'>-* Introduction::</div><div class='del'>-* Installation and Invocation::</div><div class='del'>-* Concepts::</div><div class='del'>-* Translators::</div><div class='del'>-* Usage Scenarios::</div><div class='del'>-* Troubleshooting::</div><div class='del'>-* GNU Free Documentation Licence::</div><div class='del'>-* Index::</div><div class='del'>-</div><div class='del'>- --- The Detailed Node Listing ---</div><div class='del'>-</div><div class='del'>-Installation and Invocation</div><div class='del'>-</div><div class='del'>-* Pre requisites::</div><div class='del'>-* Getting GlusterFS::</div><div class='del'>-* Building::</div><div class='del'>-* Running GlusterFS::</div><div class='del'>-* A Tutorial Introduction::</div><div class='del'>-</div><div class='del'>-Running GlusterFS</div><div class='del'>-</div><div class='del'>-* Server::</div><div class='del'>-* Client::</div><div class='del'>-</div><div class='del'>-Concepts</div><div class='del'>-</div><div class='del'>-* Filesystems in Userspace::</div><div class='del'>-* Translator::</div><div class='del'>-* Volume specification file::</div><div class='del'>-</div><div class='del'>-Translators</div><div class='del'>-</div><div class='del'>-* Storage Translators::</div><div class='del'>-* Client and Server Translators::</div><div class='del'>-* Clustering Translators::</div><div class='del'>-* Performance Translators::</div><div class='del'>-* Features Translators::</div><div class='del'>-</div><div class='del'>-Storage Translators</div><div class='del'>-</div><div class='del'>-* POSIX::</div><div class='del'>-</div><div class='del'>-Client and Server Translators</div><div class='del'>-</div><div class='del'>-* Transport modules::</div><div class='del'>-* Client protocol::</div><div class='del'>-* Server protocol::</div><div class='del'>-</div><div class='del'>-Clustering Translators</div><div class='del'>-</div><div class='del'>-* Unify::</div><div class='del'>-* Replicate::</div><div class='del'>-* Stripe::</div><div class='del'>-</div><div class='del'>-Performance Translators</div><div class='del'>-</div><div class='del'>-* Read Ahead::</div><div class='del'>-* Write Behind::</div><div class='del'>-* IO Threads::</div><div class='del'>-* IO Cache::</div><div class='del'>-</div><div class='del'>-Features Translators</div><div class='del'>-</div><div class='del'>-* POSIX Locks::</div><div class='del'>-* Fixed ID::</div><div class='del'>-</div><div class='del'>-Miscellaneous Translators</div><div class='del'>-</div><div class='del'>-* ROT-13::</div><div class='del'>-* Trace::</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-File: user-guide.info,  Node: Acknowledgements,  Next: Introduction,  Prev: Top,  Up: Top</div><div class='del'>-</div><div class='del'>-Acknowledgements</div><div class='del'>-****************</div><div class='del'>-</div><div class='del'>-GlusterFS continues to be a wonderful and enriching experience for all</div><div class='del'>-of us involved.</div><div class='del'>-</div><div class='del'>-   GlusterFS development would not have been possible at this pace if</div><div class='del'>-not for our enthusiastic users. People from around the world have</div><div class='del'>-helped us with bug reports, performance numbers, and feature</div><div class='del'>-suggestions.  A huge thanks to them all.</div><div class='del'>-</div><div class='del'>-   Matthew Paine - for RPMs &amp; general enthu</div><div class='del'>-</div><div class='del'>-   Leonardo Rodrigues de Mello - for DEBs</div><div class='del'>-</div><div class='del'>-   Julian Perez &amp; Adam D'Auria - for multi-server tutorial</div><div class='del'>-</div><div class='del'>-   Paul England - for HA spec</div><div class='del'>-</div><div class='del'>-   Brent Nelson - for many bug reports</div><div class='del'>-</div><div class='del'>-   Jacques Mattheij - for Europe mirror.</div><div class='del'>-</div><div class='del'>-   Patrick Negri - for TCP non-blocking connect.</div><div class='del'>-        http://gluster.org/core-team.php (&lt;list-hacking@gluster.com&gt;)</div><div class='del'>-                                                          Gluster </div><div class='del'>-</div><div class='del'>-</div><div class='del'>-File: user-guide.info,  Node: Introduction,  Next: Installation and Invocation,  Prev: Acknowledgements,  Up: Top</div><div class='del'>-</div><div class='del'>-1 Introduction</div><div class='del'>-**************</div><div class='del'>-</div><div class='del'>-GlusterFS is a distributed filesystem. It works at the file level, not</div><div class='del'>-block level.</div><div class='del'>-</div><div class='del'>-   A network filesystem is one which allows us to access remote files. A</div><div class='del'>-distributed filesystem is one that stores data on multiple machines and</div><div class='del'>-makes them all appear to be a part of the same filesystem.</div><div class='del'>-</div><div class='del'>-   Need for distributed filesystems</div><div class='del'>-</div><div class='del'>-   * Scalability: A distributed filesystem allows us to store more data</div><div class='del'>-     than what can be stored on a single machine.</div><div class='del'>-</div><div class='del'>-   * Redundancy: We might want to replicate crucial data on to several</div><div class='del'>-     machines.</div><div class='del'>-</div><div class='del'>-   * Uniform access: One can mount a remote volume (for example your</div><div class='del'>-     home directory) from any machine and access the same data.</div><div class='del'>-</div><div class='del'>-1.1 Contacting us</div><div class='del'>-=================</div><div class='del'>-</div><div class='del'>-You can reach us through the mailing list *gluster-devel*</div><div class='del'>-(&lt;gluster-devel@nongnu.org&gt;).  </div><div class='del'>-</div><div class='del'>-   You can also find many of the developers on IRC, on the `#gluster'</div><div class='del'>-channel on Freenode (&lt;irc.freenode.net&gt;).  </div><div class='del'>-</div><div class='del'>-   The GlusterFS documentation wiki is also useful:</div><div class='del'>-&lt;http://gluster.org/docs/index.php/GlusterFS&gt;</div><div class='del'>-</div><div class='del'>-   For commercial support, you can contact Gluster at: </div><div class='del'>-</div><div class='del'>-     3194 Winding Vista Common</div><div class='del'>-     Fremont, CA 94539</div><div class='del'>-     USA.</div><div class='del'>-</div><div class='del'>-     Phone: +1 (510) 354 6801</div><div class='del'>-     Toll free: +1 (888) 813 6309</div><div class='del'>-     Fax: +1 (510) 372 0604</div><div class='del'>-</div><div class='del'>-   You can also email us at &lt;support@gluster.com&gt;.</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-File: user-guide.info,  Node: Installation and Invocation,  Next: Concepts,  Prev: Introduction,  Up: Top</div><div class='del'>-</div><div class='del'>-2 Installation and Invocation</div><div class='del'>-*****************************</div><div class='del'>-</div><div class='del'>-* Menu:</div><div class='del'>-</div><div class='del'>-* Pre requisites::</div><div class='del'>-* Getting GlusterFS::</div><div class='del'>-* Building::</div><div class='del'>-* Running GlusterFS::</div><div class='del'>-* A Tutorial Introduction::</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-File: user-guide.info,  Node: Pre requisites,  Next: Getting GlusterFS,  Up: Installation and Invocation</div><div class='del'>-</div><div class='del'>-2.1 Pre requisites</div><div class='del'>-==================</div><div class='del'>-</div><div class='del'>-Before installing GlusterFS make sure you have the following components</div><div class='del'>-installed.</div><div class='del'>-</div><div class='del'>-2.1.1 FUSE</div><div class='del'>-----------</div><div class='del'>-</div><div class='del'>-You'll need FUSE version 2.6.0 or higher to use GlusterFS. You can omit</div><div class='del'>-installing FUSE if you want to build _only_ the server. Note that you</div><div class='del'>-won't be able to mount a GlusterFS filesystem on a machine that does</div><div class='del'>-not have FUSE installed.</div><div class='del'>-</div><div class='del'>-   FUSE can be downloaded from: &lt;http://fuse.sourceforge.net/&gt;</div><div class='del'>-</div><div class='del'>-   To get the best performance from GlusterFS, however, it is</div><div class='del'>-recommended that you use our patched version of FUSE. See Patched FUSE</div><div class='del'>-for details.</div><div class='del'>-</div><div class='del'>-2.1.2 Patched FUSE</div><div class='del'>-------------------</div><div class='del'>-</div><div class='del'>-The GlusterFS project maintains a patched version of FUSE meant to be</div><div class='del'>-used with GlusterFS. The patches increase GlusterFS performance. It is</div><div class='del'>-recommended that all users use the patched FUSE.</div><div class='del'>-</div><div class='del'>-   The patched FUSE tarball can be downloaded from:</div><div class='del'>-</div><div class='del'>-   &lt;ftp://ftp.gluster.com/pub/gluster/glusterfs/fuse/&gt;</div><div class='del'>-</div><div class='del'>-   The specific changes made to FUSE are:</div><div class='del'>-</div><div class='del'>-   * The communication channel size between FUSE kernel module and</div><div class='del'>-     GlusterFS has been increased to 1MB, permitting large reads and</div><div class='del'>-     writes to be sent in bigger chunks.</div><div class='del'>-</div><div class='del'>-   * The kernel's read-ahead boundry has been extended upto 1MB.</div><div class='del'>-</div><div class='del'>-   * Block size returned in the `stat()'/`fstat()' calls tuned to 1MB,</div><div class='del'>-     to make cp and similar commands perform I/O using that block size.</div><div class='del'>-</div><div class='del'>-   * `flock()' locking support has been added (although some rework in</div><div class='del'>-     GlusterFS is needed for perfect compliance).</div><div class='del'>-</div><div class='del'>-2.1.3 libibverbs (optional)</div><div class='del'>----------------------------</div><div class='del'>-</div><div class='del'>-This is only needed if you want GlusterFS to use InfiniBand as the</div><div class='del'>-interconnect mechanism between server and client. You can get it from:</div><div class='del'>-</div><div class='del'>-   &lt;http://www.openfabrics.org/downloads.htm&gt;.</div><div class='del'>-</div><div class='del'>-2.1.4 Bison and Flex</div><div class='del'>---------------------</div><div class='del'>-</div><div class='del'>-These should be already installed on most Linux systems. If not, use</div><div class='del'>-your distribution's normal software installation procedures to install</div><div class='del'>-them. Make sure you install the relevant developer packages also.</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-File: user-guide.info,  Node: Getting GlusterFS,  Next: Building,  Prev: Pre requisites,  Up: Installation and Invocation</div><div class='del'>-</div><div class='del'>-2.2 Getting GlusterFS</div><div class='del'>-=====================</div><div class='del'>-</div><div class='del'>-There are many ways to get hold of GlusterFS. For a production</div><div class='del'>-deployment, the recommended method is to download the latest release</div><div class='del'>-tarball.  Release tarballs are available at:</div><div class='del'>-&lt;http://gluster.org/download.php&gt;.</div><div class='del'>-</div><div class='del'>-   If you want the bleeding edge development source, you can get them</div><div class='del'>-from the GNU Arch(1) repository. First you must install GNU Arch</div><div class='del'>-itself. Then register the GlusterFS archive by doing:</div><div class='del'>-</div><div class='del'>-     $ tla register-archive http://arch.sv.gnu.org/archives/gluster</div><div class='del'>-</div><div class='del'>-   Now you can check out the source itself:</div><div class='del'>-</div><div class='del'>-     $ tla get -A gluster@sv.gnu.org glusterfs--mainline--3.0</div><div class='del'>-</div><div class='del'>-   ---------- Footnotes ----------</div><div class='del'>-</div><div class='del'>-   (1) &lt;http://www.gnu.org/software/gnu-arch/&gt;</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-File: user-guide.info,  Node: Building,  Next: Running GlusterFS,  Prev: Getting GlusterFS,  Up: Installation and Invocation</div><div class='del'>-</div><div class='del'>-2.3 Building</div><div class='del'>-============</div><div class='del'>-</div><div class='del'>-You can skip this section if you're installing from RPMs or DEBs.</div><div class='del'>-</div><div class='del'>-   GlusterFS uses the Autotools mechanism to build. As such, the</div><div class='del'>-procedure is straight-forward. First, change into the GlusterFS source</div><div class='del'>-directory.</div><div class='del'>-</div><div class='del'>-     $ cd glusterfs-&lt;version&gt;</div><div class='del'>-</div><div class='del'>-   If you checked out the source from the Arch repository, you'll need</div><div class='del'>-to run `./autogen.sh' first. Note that you'll need to have Autoconf and</div><div class='del'>-Automake installed for this.</div><div class='del'>-</div><div class='del'>-   Run `configure'.</div><div class='del'>-</div><div class='del'>-     $ ./configure</div><div class='del'>-</div><div class='del'>-   The configure script accepts the following options:</div><div class='del'>-</div><div class='del'>-`--disable-ibverbs'</div><div class='del'>-     Disable the InfiniBand transport mechanism.</div><div class='del'>-</div><div class='del'>-`--disable-fuse-client'</div><div class='del'>-     Disable the FUSE client.</div><div class='del'>-</div><div class='del'>-`--disable-server'</div><div class='del'>-     Disable building of the GlusterFS server.</div><div class='del'>-</div><div class='del'>-`--disable-bdb'</div><div class='del'>-     Disable building of Berkeley DB based storage translator.</div><div class='del'>-</div><div class='del'>-`--disable-mod_glusterfs'</div><div class='del'>-     Disable building of Apache/lighttpd glusterfs plugins.</div><div class='del'>-</div><div class='del'>-`--disable-epoll'</div><div class='del'>-     Use poll instead of epoll.</div><div class='del'>-</div><div class='del'>-`--disable-libglusterfsclient'</div><div class='del'>-     Disable building of libglusterfsclient</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-   Build and install GlusterFS.</div><div class='del'>-</div><div class='del'>-     # make install</div><div class='del'>-</div><div class='del'>-   The binaries (`glusterfsd' and `glusterfs') will be by default</div><div class='del'>-installed in `/usr/local/sbin/'. Translator, scheduler, and transport</div><div class='del'>-shared libraries will be installed in</div><div class='del'>-`/usr/local/lib/glusterfs/&lt;version&gt;/'. Sample volume specification</div><div class='del'>-files will be in `/usr/local/etc/glusterfs/'.  This document itself can</div><div class='del'>-be found in `/usr/local/share/doc/glusterfs/'. If you passed the</div><div class='del'>-`--prefix' argument to the configure script, then replace `/usr/local'</div><div class='del'>-in the preceding paths with the prefix.</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-File: user-guide.info,  Node: Running GlusterFS,  Next: A Tutorial Introduction,  Prev: Building,  Up: Installation and Invocation</div><div class='del'>-</div><div class='del'>-2.4 Running GlusterFS</div><div class='del'>-=====================</div><div class='del'>-</div><div class='del'>-* Menu:</div><div class='del'>-</div><div class='del'>-* Server::</div><div class='del'>-* Client::</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-File: user-guide.info,  Node: Server,  Next: Client,  Up: Running GlusterFS</div><div class='del'>-</div><div class='del'>-2.4.1 Server</div><div class='del'>-------------</div><div class='del'>-</div><div class='del'>-The GlusterFS server is necessary to export storage volumes to remote</div><div class='del'>-clients (See *note Server protocol:: for more info). This section</div><div class='del'>-documents the invocation of the GlusterFS server program and all the</div><div class='del'>-command-line options accepted by it.</div><div class='del'>-</div><div class='del'>-     Basic Options</div><div class='del'>-</div><div class='del'>-`-f, --volfile=&lt;path&gt;'</div><div class='del'>-     Use the volume file as the volume specification.</div><div class='del'>-</div><div class='del'>-`-s, --volfile-server=&lt;hostname&gt;'</div><div class='del'>-     Server to get volume file from. This option overrides -volfile</div><div class='del'>-     option.</div><div class='del'>-</div><div class='del'>-`-l, --log-file=&lt;path&gt;'</div><div class='del'>-     Specify the path for the log file.</div><div class='del'>-</div><div class='del'>-`-L, --log-level=&lt;level&gt;'</div><div class='del'>-     Set the log level for the server. Log level should be one of DEBUG,</div><div class='del'>-     WARNING, ERROR, CRITICAL, or NONE.</div><div class='del'>-</div><div class='del'>-     Advanced Options</div><div class='del'>-</div><div class='del'>-`--debug'</div><div class='del'>-     Run in debug mode. This option sets -no-daemon, -log-level to</div><div class='del'>-     DEBUG and       -log-file to console.</div><div class='del'>-</div><div class='del'>-`-N, --no-daemon'</div><div class='del'>-     Run glusterfsd as a foreground process.</div><div class='del'>-</div><div class='del'>-`-p, --pid-file=&lt;path&gt;'</div><div class='del'>-     Path for the PID file.</div><div class='del'>-</div><div class='del'>-`--volfile-id=&lt;key&gt;'</div><div class='del'>-     'key' of the volfile to be fetched from server.</div><div class='del'>-</div><div class='del'>-`--volfile-server-port=&lt;port-number&gt;'</div><div class='del'>-     Listening port number of volfile server.</div><div class='del'>-</div><div class='del'>-`--volfile-server-transport=[socket|ib-verbs]'</div><div class='del'>-     Transport type to get volfile from server. [default: `socket']</div><div class='del'>-</div><div class='del'>-`--xlator-options=&lt;volume-name.option=value&gt;'</div><div class='del'>-     Add/override a translator option for a volume with specified value.</div><div class='del'>-</div><div class='del'>-     Miscellaneous Options</div><div class='del'>-</div><div class='del'>-`-?, --help'</div><div class='del'>-     Show this help text.</div><div class='del'>-</div><div class='del'>-`--usage'</div><div class='del'>-     Display a short usage message.</div><div class='del'>-</div><div class='del'>-`-V, --version'</div><div class='del'>-     Show version information.</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-File: user-guide.info,  Node: Client,  Prev: Server,  Up: Running GlusterFS</div><div class='del'>-</div><div class='del'>-2.4.2 Client</div><div class='del'>-------------</div><div class='del'>-</div><div class='del'>-The GlusterFS client process is necessary to access remote storage</div><div class='del'>-volumes and mount them locally using FUSE. This section documents the</div><div class='del'>-invocation of the client process and all its command-line arguments.</div><div class='del'>-</div><div class='del'>-       # glusterfs [options] &lt;mountpoint&gt;</div><div class='del'>-</div><div class='del'>-   The `mountpoint' is the directory where you want the GlusterFS</div><div class='del'>-filesystem to appear. Example:</div><div class='del'>-</div><div class='del'>-       # glusterfs -f /usr/local/etc/glusterfs-client.vol /mnt</div><div class='del'>-</div><div class='del'>-   The command-line options are detailed below.</div><div class='del'>-</div><div class='del'>-     Basic Options</div><div class='del'>-</div><div class='del'>-`-f, --volfile=&lt;path&gt;'</div><div class='del'>-     Use the volume file as the volume specification.</div><div class='del'>-</div><div class='del'>-`-s, --volfile-server=&lt;hostname&gt;'</div><div class='del'>-     Server to get volume file from. This option overrides -volfile</div><div class='del'>-     option.</div><div class='del'>-</div><div class='del'>-`-l, --log-file=&lt;path&gt;'</div><div class='del'>-     Specify the path for the log file.</div><div class='del'>-</div><div class='del'>-`-L, --log-level=&lt;level&gt;'</div><div class='del'>-     Set the log level for the server. Log level should be one of DEBUG,</div><div class='del'>-     WARNING, ERROR, CRITICAL, or NONE.</div><div class='del'>-</div><div class='del'>-     Advanced Options</div><div class='del'>-</div><div class='del'>-`--debug'</div><div class='del'>-     Run in debug mode. This option sets -no-daemon, -log-level to</div><div class='del'>-     DEBUG and       -log-file to console.</div><div class='del'>-</div><div class='del'>-`-N, --no-daemon'</div><div class='del'>-     Run `glusterfs' as a foreground process.</div><div class='del'>-</div><div class='del'>-`-p, --pid-file=&lt;path&gt;'</div><div class='del'>-     Path for the PID file.</div><div class='del'>-</div><div class='del'>-`--volfile-id=&lt;key&gt;'</div><div class='del'>-     'key' of the volfile to be fetched from server.</div><div class='del'>-</div><div class='del'>-`--volfile-server-port=&lt;port-number&gt;'</div><div class='del'>-     Listening port number of volfile server.</div><div class='del'>-</div><div class='del'>-`--volfile-server-transport=[socket|ib-verbs]'</div><div class='del'>-     Transport type to get volfile from server. [default: `socket']</div><div class='del'>-</div><div class='del'>-`--xlator-options=&lt;volume-name.option=value&gt;'</div><div class='del'>-     Add/override a translator option for a volume with specified value.</div><div class='del'>-</div><div class='del'>-`--volume-name=&lt;volume name&gt;'</div><div class='del'>-     Volume name in client spec to use. Defaults to the root volume.</div><div class='del'>-</div><div class='del'>-     FUSE Options</div><div class='del'>-</div><div class='del'>-`--attribute-timeout=&lt;n&gt;'</div><div class='del'>-     Attribute timeout for inodes in the kernel, in seconds. Defaults</div><div class='del'>-     to 1 second.</div><div class='del'>-</div><div class='del'>-`--disable-direct-io-mode'</div><div class='del'>-     Disable direct I/O mode in FUSE kernel module.</div><div class='del'>-</div><div class='del'>-`-e, --entry-timeout=&lt;n&gt;'</div><div class='del'>-     Entry timeout for directory entries in the kernel, in seconds.</div><div class='del'>-        Defaults to 1 second.</div><div class='del'>-</div><div class='del'>-     Missellaneous Options</div><div class='del'>-</div><div class='del'>-`-?, --help'</div><div class='del'>-     Show this help information.</div><div class='del'>-</div><div class='del'>-`-V, --version'</div><div class='del'>-     Show version information.</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-File: user-guide.info,  Node: A Tutorial Introduction,  Prev: Running GlusterFS,  Up: Installation and Invocation</div><div class='del'>-</div><div class='del'>-2.5 A Tutorial Introduction</div><div class='del'>-===========================</div><div class='del'>-</div><div class='del'>-This section will show you how to quickly get GlusterFS up and running.</div><div class='del'>-We'll configure GlusterFS as a simple network filesystem, with one</div><div class='del'>-server and one client.  In this mode of usage, GlusterFS can serve as a</div><div class='del'>-replacement for NFS.</div><div class='del'>-</div><div class='del'>-   We'll make use of two machines; call them _server_ and _client_ (If</div><div class='del'>-you don't want to setup two machines, just run everything that follows</div><div class='del'>-on the same machine).  In the examples that follow, the shell prompts</div><div class='del'>-will use these names to clarify the machine on which the command is</div><div class='del'>-being run. For example, a command that should be run on the server will</div><div class='del'>-be shown with the prompt:</div><div class='del'>-</div><div class='del'>-     [root@server]#</div><div class='del'>-</div><div class='del'>-   Our goal is to make a directory on the _server_ (say, `/export')</div><div class='del'>-accessible to the _client_.</div><div class='del'>-</div><div class='del'>-   First of all, get GlusterFS installed on both the machines, as</div><div class='del'>-described in the previous sections. Make sure you have the FUSE kernel</div><div class='del'>-module loaded. You can ensure this by running:</div><div class='del'>-</div><div class='del'>-     [root@server]# modprobe fuse</div><div class='del'>-</div><div class='del'>-   Before we can run the GlusterFS client or server programs, we need</div><div class='del'>-to write two files called _volume specifications_ (equivalently refered</div><div class='del'>-to as _volfiles_).  The volfile describes the _translator tree_ on a</div><div class='del'>-node. The next chapter will explain the concepts of `translator' and</div><div class='del'>-`volume specification' in detail. For now, just assume that the volfile</div><div class='del'>-is like an NFS `/etc/export' file.</div><div class='del'>-</div><div class='del'>-   On the server, create a text file somewhere (we'll assume the path</div><div class='del'>-`/tmp/glusterfsd.vol') with the following contents.</div><div class='del'>-</div><div class='del'>-     volume colon-o</div><div class='del'>-       type storage/posix</div><div class='del'>-       option directory /export</div><div class='del'>-     end-volume</div><div class='del'>-</div><div class='del'>-     volume server</div><div class='del'>-       type protocol/server</div><div class='del'>-       subvolumes colon-o</div><div class='del'>-       option transport-type tcp</div><div class='del'>-       option auth.addr.colon-o.allow *</div><div class='del'>-     end-volume</div><div class='del'>-</div><div class='del'>-   A brief explanation of the file's contents. The first section</div><div class='del'>-defines a storage volume, named "colon-o" (the volume names are</div><div class='del'>-arbitrary), which exports the `/export' directory. The second section</div><div class='del'>-defines options for the translator which will make the storage volume</div><div class='del'>-accessible remotely. It specifies `colon-o' as a subvolume. This</div><div class='del'>-defines the _translator tree_, about which more will be said in the</div><div class='del'>-next chapter. The two options specify that the TCP protocol is to be</div><div class='del'>-used (as opposed to InfiniBand, for example), and that access to the</div><div class='del'>-storage volume is to be provided to clients with any IP address at all.</div><div class='del'>-If you wanted to restrict access to this server to only your subnet for</div><div class='del'>-example, you'd specify something like `192.168.1.*' in the second</div><div class='del'>-option line.</div><div class='del'>-</div><div class='del'>-   On the client machine, create the following text file (again, we'll</div><div class='del'>-assume the path to be `/tmp/glusterfs-client.vol'). Replace</div><div class='del'>-_server-ip-address_ with the IP address of your server machine. If you</div><div class='del'>-are doing all this on a single machine, use `127.0.0.1'.</div><div class='del'>-</div><div class='del'>-     volume client</div><div class='del'>-       type protocol/client</div><div class='del'>-       option transport-type tcp</div><div class='del'>-       option remote-host _server-ip-address_</div><div class='del'>-       option remote-subvolume colon-o</div><div class='del'>-     end-volume</div><div class='del'>-</div><div class='del'>-   Now we need to start both the server and client programs. To start</div><div class='del'>-the server:</div><div class='del'>-</div><div class='del'>-     [root@server]# glusterfsd -f /tmp/glusterfs-server.vol</div><div class='del'>-</div><div class='del'>-   To start the client:</div><div class='del'>-</div><div class='del'>-     [root@client]# glusterfs -f /tmp/glusterfs-client.vol /mnt/glusterfs</div><div class='del'>-</div><div class='del'>-   You should now be able to see the files under the server's `/export'</div><div class='del'>-directory in the `/mnt/glusterfs' directory on the client. That's it;</div><div class='del'>-GlusterFS is now working as a network file system.</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-File: user-guide.info,  Node: Concepts,  Next: Translators,  Prev: Installation and Invocation,  Up: Top</div><div class='del'>-</div><div class='del'>-3 Concepts</div><div class='del'>-**********</div><div class='del'>-</div><div class='del'>-* Menu:</div><div class='del'>-</div><div class='del'>-* Filesystems in Userspace::</div><div class='del'>-* Translator::</div><div class='del'>-* Volume specification file::</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-File: user-guide.info,  Node: Filesystems in Userspace,  Next: Translator,  Up: Concepts</div><div class='del'>-</div><div class='del'>-3.1 Filesystems in Userspace</div><div class='del'>-============================</div><div class='del'>-</div><div class='del'>-A filesystem is usually implemented in kernel space. Kernel space</div><div class='del'>-development is much harder than userspace development. FUSE is a kernel</div><div class='del'>-module/library that allows us to write a filesystem completely in</div><div class='del'>-userspace.</div><div class='del'>-</div><div class='del'>-   FUSE consists of a kernel module which interacts with the userspace</div><div class='del'>-implementation using a device file `/dev/fuse'. When a process makes a</div><div class='del'>-syscall on a FUSE filesystem, VFS hands the request to the FUSE module,</div><div class='del'>-which writes the request to `/dev/fuse'. The userspace implementation</div><div class='del'>-polls `/dev/fuse', and when a request arrives, processes it and writes</div><div class='del'>-the result back to `/dev/fuse'. The kernel then reads from the device</div><div class='del'>-file and returns the result to the user process.</div><div class='del'>-</div><div class='del'>-   In case of GlusterFS, the userspace program is the GlusterFS client.</div><div class='del'>-The control flow is shown in the diagram below. The GlusterFS client</div><div class='del'>-services the request by sending it to the server, which in turn hands</div><div class='del'>-it to the local POSIX filesystem.</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-                   Fig 1. Control flow in GlusterFS</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-File: user-guide.info,  Node: Translator,  Next: Volume specification file,  Prev: Filesystems in Userspace,  Up: Concepts</div><div class='del'>-</div><div class='del'>-3.2 Translator</div><div class='del'>-==============</div><div class='del'>-</div><div class='del'>-The _translator_ is the most important concept in GlusterFS. In fact,</div><div class='del'>-GlusterFS is nothing but a collection of translators working together,</div><div class='del'>-forming a translator _tree_.</div><div class='del'>-</div><div class='del'>-   The idea of a translator is perhaps best understood using an</div><div class='del'>-analogy. Consider the VFS in the Linux kernel. The VFS abstracts the</div><div class='del'>-various filesystem implementations (such as EXT3, ReiserFS, XFS, etc.)</div><div class='del'>-supported by the kernel. When an application calls the kernel to</div><div class='del'>-perform an operation on a file, the kernel passes the request on to the</div><div class='del'>-appropriate filesystem implementation.</div><div class='del'>-</div><div class='del'>-   For example, let's say there are two partitions on a Linux machine:</div><div class='del'>-`/', which is an EXT3 partition, and `/usr', which is a ReiserFS</div><div class='del'>-partition. Now if an application wants to open a file called, say,</div><div class='del'>-`/etc/fstab', then the kernel will internally pass the request to the</div><div class='del'>-EXT3 implementation.  If on the other hand, an application wants to</div><div class='del'>-read a file called `/usr/src/linux/CREDITS', then the kernel will call</div><div class='del'>-upon the ReiserFS implementation to do the job.</div><div class='del'>-</div><div class='del'>-   The "filesystem implementation" objects are analogous to GlusterFS</div><div class='del'>-translators. A GlusterFS translator implements all the filesystem</div><div class='del'>-operations.  Whereas in VFS there is a two-level tree (with the kernel</div><div class='del'>-at the root and all the filesystem implementation as its children), in</div><div class='del'>-GlusterFS there exists a more elaborate tree structure.</div><div class='del'>-</div><div class='del'>-   We can now define translators more precisely. A GlusterFS translator</div><div class='del'>-is a shared object (`.so') that implements every filesystem call.</div><div class='del'>-GlusterFS translators can be arranged in an arbitrary tree structure</div><div class='del'>-(subject to constraints imposed by the translators). When GlusterFS</div><div class='del'>-receives a filesystem call, it passes it on to the translator at the</div><div class='del'>-root of the translator tree. The root translator may in turn pass it on</div><div class='del'>-to any or all of its children, and so on, until the leaf nodes are</div><div class='del'>-reached. The result of a filesystem call is communicated in the reverse</div><div class='del'>-fashion, from the leaf nodes up to the root node, and then on to the</div><div class='del'>-application.</div><div class='del'>-</div><div class='del'>-   So what might a translator tree look like?</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-                    Fig 2. A sample translator tree</div><div class='del'>-</div><div class='del'>-   The diagram depicts three servers and one GlusterFS client. It is</div><div class='del'>-important to note that conceptually, the translator tree spans machine</div><div class='del'>-boundaries.  Thus, the client machine in the diagram, `10.0.0.1', can</div><div class='del'>-access the aggregated storage of the filesystems on the server machines</div><div class='del'>-`10.0.0.2', `10.0.0.3', and `10.0.0.4'. The translator diagram will</div><div class='del'>-make more sense once you've read the next chapter and understood the</div><div class='del'>-functions of the various translators.</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-File: user-guide.info,  Node: Volume specification file,  Prev: Translator,  Up: Concepts</div><div class='del'>-</div><div class='del'>-3.3 Volume specification file</div><div class='del'>-=============================</div><div class='del'>-</div><div class='del'>-The volume specification file describes the translator tree for both the</div><div class='del'>-server and client programs.</div><div class='del'>-</div><div class='del'>-   A volume specification file is a sequence of volume definitions.</div><div class='del'>-The syntax of a volume definition is explained below:</div><div class='del'>-</div><div class='del'>-     *volume* _volume-name_</div><div class='del'>-       *type* _translator-name_</div><div class='del'>-       *option* _option-name_ _option-value_</div><div class='del'>-       ...</div><div class='del'>-       *subvolumes* _subvolume1_ _subvolume2_ ...</div><div class='del'>-     *end-volume*</div><div class='del'>-</div><div class='del'>-   ...</div><div class='del'>-</div><div class='del'>-_volume-name_</div><div class='del'>-     An identifier for the volume. This is just a human-readable name,</div><div class='del'>-     and can contain any alphanumeric character. For instance,</div><div class='del'>-     "storage-1", "colon-o", or "forty-two".</div><div class='del'>-</div><div class='del'>-_translator-name_</div><div class='del'>-     Name of one of the available translators. Example:</div><div class='del'>-     `protocol/client', `cluster/unify'.</div><div class='del'>-</div><div class='del'>-_option-name_</div><div class='del'>-     Name of a valid option for the translator.</div><div class='del'>-</div><div class='del'>-_option-value_</div><div class='del'>-     Value for the option. Everything following the "option" keyword to</div><div class='del'>-     the end of the line is considered the value; it is up to the</div><div class='del'>-     translator to parse it.</div><div class='del'>-</div><div class='del'>-_subvolume1_, _subvolume2_, ...</div><div class='del'>-     Volume names of sub-volumes. The sub-volumes must already have</div><div class='del'>-     been defined earlier in the file.</div><div class='del'>-</div><div class='del'>-   There are a few rules you must follow when writing a volume</div><div class='del'>-specification file:</div><div class='del'>-</div><div class='del'>-   * Everything following a ``#'' is considered a comment and is</div><div class='del'>-     ignored. Blank lines are also ignored.</div><div class='del'>-</div><div class='del'>-   * All names and keywords are case-sensitive.</div><div class='del'>-</div><div class='del'>-   * The order of options inside a volume definition does not matter.</div><div class='del'>-</div><div class='del'>-   * An option value may not span multiple lines.</div><div class='del'>-</div><div class='del'>-   * If an option is not specified, it will assume its default value.</div><div class='del'>-</div><div class='del'>-   * A sub-volume must have already been defined before it can be</div><div class='del'>-     referenced. This means you have to write the specification file</div><div class='del'>-     "bottom-up", starting from the leaf nodes of the translator tree</div><div class='del'>-     and moving up to the root.</div><div class='del'>-</div><div class='del'>-   A simple example volume specification file is shown below:</div><div class='del'>-</div><div class='del'>-     # This is a comment line</div><div class='del'>-     volume client</div><div class='del'>-      type protocol/client</div><div class='del'>-      option transport-type tcp</div><div class='del'>-      option remote-host localhost      # Also a comment</div><div class='del'>-      option remote-subvolume brick</div><div class='del'>-     # The subvolumes line may be absent</div><div class='del'>-     end-volume</div><div class='del'>-</div><div class='del'>-     volume iot</div><div class='del'>-      type performance/io-threads</div><div class='del'>-      option thread-count 4</div><div class='del'>-      subvolumes client</div><div class='del'>-     end-volume</div><div class='del'>-</div><div class='del'>-     volume wb</div><div class='del'>-      type performance/write-behind</div><div class='del'>-      subvolumes iot</div><div class='del'>-     end-volume</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-File: user-guide.info,  Node: Translators,  Next: Usage Scenarios,  Prev: Concepts,  Up: Top</div><div class='del'>-</div><div class='del'>-4 Translators</div><div class='del'>-*************</div><div class='del'>-</div><div class='del'>-* Menu:</div><div class='del'>-</div><div class='del'>-* Storage Translators::</div><div class='del'>-* Client and Server Translators::</div><div class='del'>-* Clustering Translators::</div><div class='del'>-* Performance Translators::</div><div class='del'>-* Features Translators::</div><div class='del'>-* Miscellaneous Translators::</div><div class='del'>-</div><div class='del'>-   This chapter documents all the available GlusterFS translators in</div><div class='del'>-detail.  Each translator section will show its name (for example,</div><div class='del'>-`cluster/unify'), briefly describe its purpose and workings, and list</div><div class='del'>-every option accepted by that translator and their meaning.</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-File: user-guide.info,  Node: Storage Translators,  Next: Client and Server Translators,  Up: Translators</div><div class='del'>-</div><div class='del'>-4.1 Storage Translators</div><div class='del'>-=======================</div><div class='del'>-</div><div class='del'>-The storage translators form the "backend" for GlusterFS. Currently,</div><div class='del'>-the only available storage translator is the POSIX translator, which</div><div class='del'>-stores files on a normal POSIX filesystem. A pleasant consequence of</div><div class='del'>-this is that your data will still be accessible if GlusterFS crashes or</div><div class='del'>-cannot be started.</div><div class='del'>-</div><div class='del'>-   Other storage backends are planned for the future. One of the</div><div class='del'>-possibilities is an Amazon S3 translator. Amazon S3 is an unlimited</div><div class='del'>-online storage service accessible through a web services API. The S3</div><div class='del'>-translator will allow you to access the storage as a normal POSIX</div><div class='del'>-filesystem.  (1)</div><div class='del'>-</div><div class='del'>-* Menu:</div><div class='del'>-</div><div class='del'>-* POSIX::</div><div class='del'>-* BDB::</div><div class='del'>-</div><div class='del'>-   ---------- Footnotes ----------</div><div class='del'>-</div><div class='del'>-   (1) Some more discussion about this can be found at:</div><div class='del'>-</div><div class='del'>-http://developer.amazonwebservices.com/connect/message.jspa?messageID=52873</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-File: user-guide.info,  Node: POSIX,  Next: BDB,  Up: Storage Translators</div><div class='del'>-</div><div class='del'>-4.1.1 POSIX</div><div class='del'>------------</div><div class='del'>-</div><div class='del'>-     type storage/posix</div><div class='del'>-</div><div class='del'>-   The `posix' translator uses a normal POSIX filesystem as its</div><div class='del'>-"backend" to actually store files and directories. This can be any</div><div class='del'>-filesystem that supports extended attributes (EXT3, ReiserFS, XFS,</div><div class='del'>-...). Extended attributes are used by some translators to store</div><div class='del'>-metadata, for example, by the replicate and stripe translators. See</div><div class='del'>-*note Replicate:: and *note Stripe::, respectively for details.</div><div class='del'>-</div><div class='del'>-`directory &lt;path&gt;'</div><div class='del'>-     The directory on the local filesystem which is to be used for</div><div class='del'>-     storage.</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-File: user-guide.info,  Node: BDB,  Prev: POSIX,  Up: Storage Translators</div><div class='del'>-</div><div class='del'>-4.1.2 BDB</div><div class='del'>----------</div><div class='del'>-</div><div class='del'>-     type storage/bdb</div><div class='del'>-</div><div class='del'>-   The `BDB' translator uses a Berkeley DB database as its "backend" to</div><div class='del'>-actually store files as key-value pair in the database and directories</div><div class='del'>-as regular POSIX directories. Note that BDB does not provide extended</div><div class='del'>-attribute support for regular files. Do not use BDB as storage</div><div class='del'>-translator while using any translator that demands extended attributes</div><div class='del'>-on "backend".</div><div class='del'>-</div><div class='del'>-`directory &lt;path&gt;'</div><div class='del'>-     The directory on the local filesystem which is to be used for</div><div class='del'>-     storage.</div><div class='del'>-</div><div class='del'>-`mode [cache|persistent] (cache)'</div><div class='del'>-     When BDB is run in `cache' mode, recovery of back-end is not</div><div class='del'>-     completely guaranteed. `persistent' guarantees that BDB can</div><div class='del'>-     recover back-end from Berkeley DB even if GlusterFS crashes.</div><div class='del'>-</div><div class='del'>-`errfile &lt;path&gt;'</div><div class='del'>-     The path of the file to be used as `errfile' for Berkeley DB to</div><div class='del'>-     report detailed error messages, if any. Note that all the contents</div><div class='del'>-     of this file will be written by Berkeley DB, not GlusterFS.</div><div class='del'>-</div><div class='del'>-`logdir &lt;path&gt;'</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-File: user-guide.info,  Node: Client and Server Translators,  Next: Clustering Translators,  Prev: Storage Translators,  Up: Translators</div><div class='del'>-</div><div class='del'>-4.2 Client and Server Translators</div><div class='del'>-=================================</div><div class='del'>-</div><div class='del'>-The client and server translator enable GlusterFS to export a</div><div class='del'>-translator tree over the network or access a remote GlusterFS server.</div><div class='del'>-These two translators implement GlusterFS's network protocol.</div><div class='del'>-</div><div class='del'>-* Menu:</div><div class='del'>-</div><div class='del'>-* Transport modules::</div><div class='del'>-* Client protocol::</div><div class='del'>-* Server protocol::</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-File: user-guide.info,  Node: Transport modules,  Next: Client protocol,  Up: Client and Server Translators</div><div class='del'>-</div><div class='del'>-4.2.1 Transport modules</div><div class='del'>------------------------</div><div class='del'>-</div><div class='del'>-The client and server translators are capable of using any of the</div><div class='del'>-pluggable transport modules. Currently available transport modules are</div><div class='del'>-`tcp', which uses a TCP connection between client and server to</div><div class='del'>-communicate; `ib-sdp', which uses a TCP connection over InfiniBand, and</div><div class='del'>-`ibverbs', which uses high-speed InfiniBand connections.</div><div class='del'>-</div><div class='del'>-   Each transport module comes in two different versions, one to be</div><div class='del'>-used on the server side and the other on the client side.</div><div class='del'>-</div><div class='del'>-4.2.1.1 TCP</div><div class='del'>-...........</div><div class='del'>-</div><div class='del'>-The TCP transport module uses a TCP/IP connection between the server</div><div class='del'>-and the client.</div><div class='del'>-</div><div class='del'>-       option transport-type tcp</div><div class='del'>-</div><div class='del'>-   The TCP client module accepts the following options:</div><div class='del'>-</div><div class='del'>-`non-blocking-connect [no|off|on|yes] (on)'</div><div class='del'>-     Whether to make the connection attempt asynchronous.</div><div class='del'>-</div><div class='del'>-`remote-port &lt;n&gt; (6996)'</div><div class='del'>-     Server port to connect to.  </div><div class='del'>-</div><div class='del'>-`remote-host &lt;hostname&gt; *'</div><div class='del'>-     Hostname or IP address of the server. If the host name resolves to</div><div class='del'>-     multiple IP addresses, all of them will be tried in a round-robin</div><div class='del'>-     fashion. This feature can be used to implement fail-over.</div><div class='del'>-</div><div class='del'>-   The TCP server module accepts the following options:</div><div class='del'>-</div><div class='del'>-`bind-address &lt;address&gt; (0.0.0.0)'</div><div class='del'>-     The local interface on which the server should listen to requests.</div><div class='del'>-     Default is to listen on all interfaces.</div><div class='del'>-</div><div class='del'>-`listen-port &lt;n&gt; (6996)'</div><div class='del'>-     The local port to listen on.</div><div class='del'>-</div><div class='del'>-4.2.1.2 IB-SDP</div><div class='del'>-..............</div><div class='del'>-</div><div class='del'>-       option transport-type ib-sdp</div><div class='del'>-</div><div class='del'>-   kernel implements socket interface for ib hardware. SDP is over</div><div class='del'>-ib-verbs.  This module accepts the same options as `tcp'</div><div class='del'>-</div><div class='del'>-4.2.1.3 ibverbs</div><div class='del'>-...............</div><div class='del'>-</div><div class='del'>-       option transport-type tcp</div><div class='del'>-</div><div class='del'>-   InfiniBand is a scalable switched fabric interconnect mechanism</div><div class='del'>-primarily used in high-performance computing. InfiniBand can deliver</div><div class='del'>-data throughput of the order of 10 Gbit/s, with latencies of 4-5 ms.</div><div class='del'>-</div><div class='del'>-   The `ib-verbs' transport accesses the InfiniBand hardware through</div><div class='del'>-the "verbs" API, which is the lowest level of software access possible</div><div class='del'>-and which gives the highest performance. On InfiniBand hardware, it is</div><div class='del'>-always best to use `ib-verbs'. Use `ib-sdp' only if you cannot get</div><div class='del'>-`ib-verbs' working for some reason.</div><div class='del'>-</div><div class='del'>-   The `ib-verbs' client module accepts the following options:</div><div class='del'>-</div><div class='del'>-`non-blocking-connect [no|off|on|yes] (on)'</div><div class='del'>-     Whether to make the connection attempt asynchronous.</div><div class='del'>-</div><div class='del'>-`remote-port &lt;n&gt; (6996)'</div><div class='del'>-     Server port to connect to.  </div><div class='del'>-</div><div class='del'>-`remote-host &lt;hostname&gt; *'</div><div class='del'>-     Hostname or IP address of the server. If the host name resolves to</div><div class='del'>-     multiple IP addresses, all of them will be tried in a round-robin</div><div class='del'>-     fashion. This feature can be used to implement fail-over.</div><div class='del'>-</div><div class='del'>-   The `ib-verbs' server module accepts the following options:</div><div class='del'>-</div><div class='del'>-`bind-address &lt;address&gt; (0.0.0.0)'</div><div class='del'>-     The local interface on which the server should listen to requests.</div><div class='del'>-     Default is to listen on all interfaces.</div><div class='del'>-</div><div class='del'>-`listen-port &lt;n&gt; (6996)'</div><div class='del'>-     The local port to listen on.</div><div class='del'>-</div><div class='del'>-   The following options are common to both the client and server</div><div class='del'>-modules:</div><div class='del'>-</div><div class='del'>-   If you are familiar with InfiniBand jargon, the mode is used by</div><div class='del'>-GlusterFS is "reliable connection-oriented channel transfer".</div><div class='del'>-</div><div class='del'>-`ib-verbs-work-request-send-count &lt;n&gt; (64)'</div><div class='del'>-     Length of the send queue in datagrams. [Reason to</div><div class='del'>-     increase/decrease?]</div><div class='del'>-</div><div class='del'>-`ib-verbs-work-request-recv-count &lt;n&gt; (64)'</div><div class='del'>-     Length of the receive queue in datagrams. [Reason to</div><div class='del'>-     increase/decrease?]</div><div class='del'>-</div><div class='del'>-`ib-verbs-work-request-send-size &lt;size&gt; (128KB)'</div><div class='del'>-     Size of each datagram that is sent. [Reason to increase/decrease?]</div><div class='del'>-</div><div class='del'>-`ib-verbs-work-request-recv-size &lt;size&gt; (128KB)'</div><div class='del'>-     Size of each datagram that is received. [Reason to</div><div class='del'>-     increase/decrease?]</div><div class='del'>-</div><div class='del'>-`ib-verbs-port &lt;n&gt; (1)'</div><div class='del'>-     Port number for ib-verbs.</div><div class='del'>-</div><div class='del'>-`ib-verbs-mtu [256|512|1024|2048|4096] (2048)'</div><div class='del'>-     The Maximum Transmission Unit [Reason to increase/decrease?]</div><div class='del'>-</div><div class='del'>-`ib-verbs-device-name &lt;device-name&gt; (first device in the list)'</div><div class='del'>-     InfiniBand device to be used.</div><div class='del'>-</div><div class='del'>-   For maximum performance, you should ensure that the send/receive</div><div class='del'>-counts on both the client and server are the same.</div><div class='del'>-</div><div class='del'>-   ib-verbs is preferred over ib-sdp.</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-File: user-guide.info,  Node: Client protocol,  Next: Server protocol,  Prev: Transport modules,  Up: Client and Server Translators</div><div class='del'>-</div><div class='del'>-4.2.2 Client</div><div class='del'>-------------</div><div class='del'>-</div><div class='del'>-     type procotol/client</div><div class='del'>-</div><div class='del'>-   The client translator enables the GlusterFS client to access a</div><div class='del'>-remote server's translator tree.</div><div class='del'>-</div><div class='del'>-`transport-type [tcp,ib-sdp,ib-verbs] (tcp)'</div><div class='del'>-     The transport type to use. You should use the client versions of</div><div class='del'>-     all the transport modules (`tcp', `ib-sdp', `ib-verbs').</div><div class='del'>-</div><div class='del'>-`remote-subvolume &lt;volume_name&gt; *'</div><div class='del'>-     The name of the volume on the remote host to attach to. Note that</div><div class='del'>-     this is _not_ the name of the `protocol/server' volume on the</div><div class='del'>-     server. It should be any volume under the server.</div><div class='del'>-</div><div class='del'>-`transport-timeout &lt;n&gt; (120- seconds)'</div><div class='del'>-     Inactivity timeout. If a reply is expected and no activity takes</div><div class='del'>-     place on the connection within this time, the transport connection</div><div class='del'>-     will be broken, and a new connection will be attempted.</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-File: user-guide.info,  Node: Server protocol,  Prev: Client protocol,  Up: Client and Server Translators</div><div class='del'>-</div><div class='del'>-4.2.3 Server</div><div class='del'>-------------</div><div class='del'>-</div><div class='del'>-     type protocol/server</div><div class='del'>-</div><div class='del'>-   The server translator exports a translator tree and makes it</div><div class='del'>-accessible to remote GlusterFS clients.</div><div class='del'>-</div><div class='del'>-`client-volume-filename &lt;path&gt; (&lt;CONFDIR&gt;/glusterfs-client.vol)'</div><div class='del'>-     The volume specification file to use for the client. This is the</div><div class='del'>-     file the client will receive when it is invoked with the</div><div class='del'>-     `--server' option (*note Client::).</div><div class='del'>-</div><div class='del'>-`transport-type [tcp,ib-verbs,ib-sdp] (tcp)'</div><div class='del'>-     The transport to use. You should use the server versions of all</div><div class='del'>-     the transport modules (`tcp', `ib-sdp', `ib-verbs').</div><div class='del'>-</div><div class='del'>-`auth.addr.&lt;volume name&gt;.allow &lt;IP address wildcard pattern&gt;'</div><div class='del'>-     IP addresses of the clients that are allowed to attach to the</div><div class='del'>-     specified volume.  This can be a wildcard. For example, a wildcard</div><div class='del'>-     of the form `192.168.*.*' allows any host in the `192.168.x.x'</div><div class='del'>-     subnet to connect to the server.</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-File: user-guide.info,  Node: Clustering Translators,  Next: Performance Translators,  Prev: Client and Server Translators,  Up: Translators</div><div class='del'>-</div><div class='del'>-4.3 Clustering Translators</div><div class='del'>-==========================</div><div class='del'>-</div><div class='del'>-The clustering translators are the most important GlusterFS</div><div class='del'>-translators, since it is these that make GlusterFS a cluster</div><div class='del'>-filesystem. These translators together enable GlusterFS to access an</div><div class='del'>-arbitrarily large amount of storage, and provide RAID-like redundancy</div><div class='del'>-and distribution over the entire cluster.</div><div class='del'>-</div><div class='del'>-   There are three clustering translators: *unify*, *replicate*, and</div><div class='del'>-*stripe*.  The unify translator aggregates storage from many server</div><div class='del'>-nodes. The replicate translator provides file replication. The stripe</div><div class='del'>-translator allows a file to be spread across many server nodes. The</div><div class='del'>-following sections look at each of these translators in detail.</div><div class='del'>-</div><div class='del'>-* Menu:</div><div class='del'>-</div><div class='del'>-* Unify::</div><div class='del'>-* Replicate::</div><div class='del'>-* Stripe::</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-File: user-guide.info,  Node: Unify,  Next: Replicate,  Up: Clustering Translators</div><div class='del'>-</div><div class='del'>-4.3.1 Unify</div><div class='del'>------------</div><div class='del'>-</div><div class='del'>-     type cluster/unify</div><div class='del'>-</div><div class='del'>-   The unify translator presents a `unified' view of all its</div><div class='del'>-sub-volumes. That is, it makes the union of all its sub-volumes appear</div><div class='del'>-as a single volume. It is the unify translator that gives GlusterFS the</div><div class='del'>-ability to access an arbitrarily large amount of storage.</div><div class='del'>-</div><div class='del'>-   For unify to work correctly, certain invariants need to be</div><div class='del'>-maintained across the entire network. These are:</div><div class='del'>-</div><div class='del'>-   * The directory structure of all the sub-volumes must be identical.</div><div class='del'>-</div><div class='del'>-   * A particular file can exist on only one of the sub-volumes.</div><div class='del'>-     Phrasing it in another way, a pathname such as</div><div class='del'>-     `/home/calvin/homework.txt') is unique across the entire cluster.</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-Looking at the second requirement, you might wonder how one can</div><div class='del'>-accomplish storing redundant copies of a file, if no file can exist</div><div class='del'>-multiple times.  To answer, we must remember that these invariants are</div><div class='del'>-from _unify's perspective_.  A translator such as replicate at a lower</div><div class='del'>-level in the translator tree than unify may subvert this picture.</div><div class='del'>-</div><div class='del'>-   The first invariant might seem quite tedious to ensure. We shall see</div><div class='del'>-later that this is not so, since unify's _self-heal_ mechanism takes</div><div class='del'>-care of maintaining it.</div><div class='del'>-</div><div class='del'>-   The second invariant implies that unify needs some way to decide</div><div class='del'>-which file goes where.  Unify makes use of _scheduler_ modules for this</div><div class='del'>-purpose.</div><div class='del'>-</div><div class='del'>-   When a file needs to be created, unify's scheduler decides upon the</div><div class='del'>-sub-volume to be used to store the file. There are many schedulers</div><div class='del'>-available, each using a different algorithm and suitable for different</div><div class='del'>-purposes.</div><div class='del'>-</div><div class='del'>-   The various schedulers are described in detail in the sections that</div><div class='del'>-follow.</div><div class='del'>-</div><div class='del'>-4.3.1.1 ALU</div><div class='del'>-...........</div><div class='del'>-</div><div class='del'>-       option scheduler alu</div><div class='del'>-</div><div class='del'>-   ALU stands for "Adaptive Least Usage". It is the most advanced</div><div class='del'>-scheduler available in GlusterFS. It balances the load across volumes</div><div class='del'>-taking several factors in account. It adapts itself to changing I/O</div><div class='del'>-patterns according to its configuration. When properly configured, it</div><div class='del'>-can eliminate the need for regular tuning of the filesystem to keep</div><div class='del'>-volume load nicely balanced.</div><div class='del'>-</div><div class='del'>-   The ALU scheduler is composed of multiple least-usage</div><div class='del'>-sub-schedulers. Each sub-scheduler keeps track of a certain type of</div><div class='del'>-load, for each of the sub-volumes, getting statistics from the</div><div class='del'>-sub-volumes themselves. The sub-schedulers are these:</div><div class='del'>-</div><div class='del'>-   * disk-usage: The used and free disk space on the volume.</div><div class='del'>-</div><div class='del'>-   * read-usage: The amount of reading done from this volume.</div><div class='del'>-</div><div class='del'>-   * write-usage: The amount of writing done to this volume.</div><div class='del'>-</div><div class='del'>-   * open-files-usage: The number of files currently open from this</div><div class='del'>-     volume.</div><div class='del'>-</div><div class='del'>-   * disk-speed-usage: The speed at which the disks are spinning. This</div><div class='del'>-     is a constant value and therefore not very useful.</div><div class='del'>-</div><div class='del'>-   The ALU scheduler needs to know which of these sub-schedulers to use,</div><div class='del'>-and in which order to evaluate them. This is done through the `option</div><div class='del'>-alu.order' configuration directive.</div><div class='del'>-</div><div class='del'>-   Each sub-scheduler needs to know two things: when to kick in (the</div><div class='del'>-entry-threshold), and how long to stay in control (the exit-threshold).</div><div class='del'>-For example: when unifying three disks of 100GB, keeping an exact</div><div class='del'>-balance of disk-usage is not necesary. Instead, there could be a 1GB</div><div class='del'>-margin, which can be used to nicely balance other factors, such as</div><div class='del'>-read-usage. The disk-usage scheduler can be told to kick in only when a</div><div class='del'>-certain threshold of discrepancy is passed, such as 1GB. When it</div><div class='del'>-assumes control under this condition, it will write all subsequent data</div><div class='del'>-to the least-used volume. If it is doing so, it is unwise to stop right</div><div class='del'>-after the values are below the entry-threshold again, since that would</div><div class='del'>-make it very likely that the situation will occur again very soon. Such</div><div class='del'>-a situation would cause the ALU to spend most of its time disk-usage</div><div class='del'>-scheduling, which is unfair to the other sub-schedulers. The</div><div class='del'>-exit-threshold therefore defines the amount of data that needs to be</div><div class='del'>-written to the least-used disk, before control is relinquished again.</div><div class='del'>-</div><div class='del'>-   In addition to the sub-schedulers, the ALU scheduler also has</div><div class='del'>-"limits" options. These can stop the creation of new files on a volume</div><div class='del'>-once values drop below a certain threshold. For example, setting</div><div class='del'>-`option alu.limits.min-free-disk 5GB' will stop the scheduling of files</div><div class='del'>-to volumes that have less than 5GB of free disk space, leaving the</div><div class='del'>-files on that disk some room to grow.</div><div class='del'>-</div><div class='del'>-   The actual values you assign to the thresholds for sub-schedulers and</div><div class='del'>-limits depend on your situation. If you have fast-growing files, you'll</div><div class='del'>-want to stop file-creation on a disk much earlier than when hardly any</div><div class='del'>-of your files are growing. If you care less about disk-usage balance</div><div class='del'>-than about read-usage balance, you'll want a bigger disk-usage</div><div class='del'>-scheduler entry-threshold and a smaller read-usage scheduler</div><div class='del'>-entry-threshold.</div><div class='del'>-</div><div class='del'>-   For thresholds defining a size, values specifying "KB", "MB" and "GB"</div><div class='del'>-are allowed. For example: `option alu.limits.min-free-disk 5GB'.</div><div class='del'>-</div><div class='del'>-`alu.order &lt;order&gt; * ("disk-usage:write-usage:read-usage:open-files-usage:disk-speed")'</div><div class='del'>-</div><div class='del'>-`alu.disk-usage.entry-threshold &lt;size&gt; (1GB)'</div><div class='del'>-</div><div class='del'>-`alu.disk-usage.exit-threshold &lt;size&gt; (512MB)'</div><div class='del'>-</div><div class='del'>-`alu.write-usage.entry-threshold &lt;%&gt; (25)'</div><div class='del'>-</div><div class='del'>-`alu.write-usage.exit-threshold &lt;%&gt; (5)'</div><div class='del'>-</div><div class='del'>-`alu.read-usage.entry-threshold &lt;%&gt; (25)'</div><div class='del'>-</div><div class='del'>-`alu.read-usage.exit-threshold &lt;%&gt; (5)'</div><div class='del'>-</div><div class='del'>-`alu.open-files-usage.entry-threshold &lt;n&gt; (1000)'</div><div class='del'>-</div><div class='del'>-`alu.open-files-usage.exit-threshold &lt;n&gt; (100)'</div><div class='del'>-</div><div class='del'>-`alu.limits.min-free-disk &lt;%&gt;'</div><div class='del'>-</div><div class='del'>-`alu.limits.max-open-files &lt;n&gt;'</div><div class='del'>-</div><div class='del'>-4.3.1.2 Round Robin (RR)</div><div class='del'>-........................</div><div class='del'>-</div><div class='del'>-       option scheduler rr</div><div class='del'>-</div><div class='del'>-   Round-Robin (RR) scheduler creates files in a round-robin fashion.</div><div class='del'>-Each client will have its own round-robin loop. When your files are</div><div class='del'>-mostly similar in size and I/O access pattern, this scheduler is a good</div><div class='del'>-choice. RR scheduler checks for free disk space on the server before</div><div class='del'>-scheduling, so you can know when to add another server node. The</div><div class='del'>-default value of min-free-disk is 5% and is checked on file creation</div><div class='del'>-calls, with atleast 10 seconds (by default) elapsing between two checks.</div><div class='del'>-</div><div class='del'>-   Options:</div><div class='del'>-`rr.limits.min-free-disk &lt;%&gt; (5)'</div><div class='del'>-     Minimum free disk space a node must have for RR to schedule a file</div><div class='del'>-     to it.</div><div class='del'>-</div><div class='del'>-`rr.refresh-interval &lt;t&gt; (10 seconds)'</div><div class='del'>-     Time between two successive free disk space checks.</div><div class='del'>-</div><div class='del'>-4.3.1.3 Random</div><div class='del'>-..............</div><div class='del'>-</div><div class='del'>-       option scheduler random</div><div class='del'>-</div><div class='del'>-   The random scheduler schedules file creation randomly among its</div><div class='del'>-child nodes.  Like the round-robin scheduler, it also checks for a</div><div class='del'>-minimum amount of free disk space before scheduling a file to a node.</div><div class='del'>-</div><div class='del'>-`random.limits.min-free-disk &lt;%&gt; (5)'</div><div class='del'>-     Minimum free disk space a node must have for random to schedule a</div><div class='del'>-     file to it.</div><div class='del'>-</div><div class='del'>-`random.refresh-interval &lt;t&gt; (10 seconds)'</div><div class='del'>-     Time between two successive free disk space checks.</div><div class='del'>-</div><div class='del'>-4.3.1.4 NUFA</div><div class='del'>-............</div><div class='del'>-</div><div class='del'>-       option scheduler nufa</div><div class='del'>-</div><div class='del'>-   It is common in many GlusterFS computing environments for all</div><div class='del'>-deployed machines to act as both servers and clients. For example, a</div><div class='del'>-research lab may have 40 workstations each with its own storage. All of</div><div class='del'>-these workstations might act as servers exporting a volume as well as</div><div class='del'>-clients accessing the entire cluster's storage.  In such a situation,</div><div class='del'>-it makes sense to store locally created files on the local workstation</div><div class='del'>-itself (assuming files are accessed most by the workstation that</div><div class='del'>-created them). The Non-Uniform File Allocation (NUFA) scheduler</div><div class='del'>-accomplishes that.</div><div class='del'>-</div><div class='del'>-   NUFA gives the local system first priority for file creation over</div><div class='del'>-other nodes. If the local volume does not have more free disk space</div><div class='del'>-than a specified amount (5% by default) then NUFA schedules files among</div><div class='del'>-the other child volumes in a round-robin fashion.</div><div class='del'>-</div><div class='del'>-   NUFA is named after the similar strategy used for memory access,</div><div class='del'>-NUMA(1).</div><div class='del'>-</div><div class='del'>-`nufa.limits.min-free-disk &lt;%&gt; (5)'</div><div class='del'>-     Minimum disk space that must be free (local or remote) for NUFA to</div><div class='del'>-     schedule a file to it.</div><div class='del'>-</div><div class='del'>-`nufa.refresh-interval &lt;t&gt; (10 seconds)'</div><div class='del'>-     Time between two successive free disk space checks.</div><div class='del'>-</div><div class='del'>-`nufa.local-volume-name &lt;volume&gt;'</div><div class='del'>-     The name of the volume corresponding to the local system. This</div><div class='del'>-     volume must be one of the children of the unify volume. This</div><div class='del'>-     option is mandatory.</div><div class='del'>-</div><div class='del'>-4.3.1.5 Namespace</div><div class='del'>-.................</div><div class='del'>-</div><div class='del'>-Namespace volume needed because:  - persistent inode numbers.   - file</div><div class='del'>-exists even when node is down.</div><div class='del'>-</div><div class='del'>-   namespace files are simply touched. on every lookup it is checked.</div><div class='del'>-</div><div class='del'>-`namespace &lt;volume&gt; *'</div><div class='del'>-     Name of the namespace volume (which should be one of the unify</div><div class='del'>-     volume's children).</div><div class='del'>-</div><div class='del'>-`self-heal [on|off] (on)'</div><div class='del'>-     Enable/disable self-heal. Unless you know what you are doing, do</div><div class='del'>-     not disable self-heal.</div><div class='del'>-</div><div class='del'>-4.3.1.6 Self Heal</div><div class='del'>-.................</div><div class='del'>-</div><div class='del'>-* When a 'lookup()/stat()' call is made on directory for the first</div><div class='del'>-time, a self-heal call is made, which checks for the consistancy of its</div><div class='del'>-child nodes. If an entry is present in storage node, but not in</div><div class='del'>-namespace, that entry is created in namespace, and vica-versa. There is</div><div class='del'>-an writedir() API introduced which is used for the same. It also checks</div><div class='del'>-for permissions, and uid/gid consistencies.</div><div class='del'>-</div><div class='del'>-   * This check is also done when an server goes down and comes up.</div><div class='del'>-</div><div class='del'>-   * If one starts with an empty namespace export, but has data in</div><div class='del'>-storage nodes, a 'find .&gt;/dev/null' or 'ls -lR &gt;/dev/null' should help</div><div class='del'>-to build namespace in one shot. Even otherwise, namespace is built on</div><div class='del'>-demand when a file is looked up for the first time.</div><div class='del'>-</div><div class='del'>-   NOTE: There are some issues (Kernel 'Oops' msgs) seen with</div><div class='del'>-fuse-2.6.3, when someone deletes namespace in backend, when glusterfs is</div><div class='del'>-running. But with fuse-2.6.5, this issue is not there.</div><div class='del'>-</div><div class='del'>-   ---------- Footnotes ----------</div><div class='del'>-</div><div class='del'>-   (1) Non-Uniform Memory Access:</div><div class='del'>-&lt;http://en.wikipedia.org/wiki/Non-Uniform_Memory_Access&gt;</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-File: user-guide.info,  Node: Replicate,  Next: Stripe,  Prev: Unify,  Up: Clustering Translators</div><div class='del'>-</div><div class='del'>-4.3.2 Replicate (formerly AFR)</div><div class='del'>-------------------------------</div><div class='del'>-</div><div class='del'>-     type cluster/replicate</div><div class='del'>-</div><div class='del'>-   Replicate provides RAID-1 like functionality for GlusterFS.</div><div class='del'>-Replicate replicates files and directories across the subvolumes. Hence</div><div class='del'>-if Replicate has four subvolumes, there will be four copies of all</div><div class='del'>-files and directories. Replicate provides high-availability, i.e., in</div><div class='del'>-case one of the subvolumes go down (e. g. server crash, network</div><div class='del'>-disconnection) Replicate will still service the requests using the</div><div class='del'>-redundant copies.</div><div class='del'>-</div><div class='del'>-   Replicate also provides self-heal functionality, i.e., in case the</div><div class='del'>-crashed servers come up, the outdated files and directories will be</div><div class='del'>-updated with the latest versions. Replicate uses extended attributes of</div><div class='del'>-the backend file system to track the versioning of files and</div><div class='del'>-directories and provide the self-heal feature.</div><div class='del'>-</div><div class='del'>-     volume replicate-example</div><div class='del'>-      type cluster/replicate</div><div class='del'>-      subvolumes brick1 brick2 brick3</div><div class='del'>-     end-volume</div><div class='del'>-</div><div class='del'>-   This sample configuration will replicate all directories and files on</div><div class='del'>-brick1, brick2 and brick3.</div><div class='del'>-</div><div class='del'>-   All the read operations happen from the first alive child. If all the</div><div class='del'>-three sub-volumes are up, reads will be done from brick1; if brick1 is</div><div class='del'>-down read will be done from brick2. In case read() was being done on</div><div class='del'>-brick1 and it goes down, replicate transparently falls back to brick2.</div><div class='del'>-</div><div class='del'>-   The next release of GlusterFS will add the following features:</div><div class='del'>-   * Ability to specify the sub-volume from which read operations are</div><div class='del'>-     to be done (this will help users who have one of the sub-volumes</div><div class='del'>-     as a local storage volume).</div><div class='del'>-</div><div class='del'>-   * Allow scheduling of read operations amongst the sub-volumes in a</div><div class='del'>-     round-robin fashion.</div><div class='del'>-</div><div class='del'>-   The order of the subvolumes list should be same across all the</div><div class='del'>-'replicate's as they will be used for locking purposes.</div><div class='del'>-</div><div class='del'>-4.3.2.1 Self Heal</div><div class='del'>-.................</div><div class='del'>-</div><div class='del'>-Replicate has self-heal feature, which updates the outdated file and</div><div class='del'>-directory copies by the most recent versions. For example consider the</div><div class='del'>-following config:</div><div class='del'>-</div><div class='del'>-     volume replicate-example</div><div class='del'>-      type cluster/replicate</div><div class='del'>-      subvolumes brick1 brick2</div><div class='del'>-     end-volume</div><div class='del'>-</div><div class='del'>-4.3.2.2 File self-heal</div><div class='del'>-......................</div><div class='del'>-</div><div class='del'>-Now if we create a file foo.txt on replicate-example, the file will be</div><div class='del'>-created on brick1 and brick2. The file will have two extended</div><div class='del'>-attributes associated with it in the backend filesystem. One is</div><div class='del'>-trusted.afr.createtime and the other is trusted.afr.version. The</div><div class='del'>-trusted.afr.createtime xattr has the create time (in terms of seconds</div><div class='del'>-since epoch) and trusted.afr.version is a number that is incremented</div><div class='del'>-each time a file is modified. This increment happens during close</div><div class='del'>-(incase any write was done before close).</div><div class='del'>-</div><div class='del'>-   If brick1 goes down, we edit foo.txt the version gets incremented.</div><div class='del'>-Now the brick1 comes back up, when we open() on foo.txt replicate will</div><div class='del'>-check if their versions are same. If they are not same, the outdated</div><div class='del'>-copy is replaced by the latest copy and its version is updated. After</div><div class='del'>-the sync the open() proceeds in the usual manner and the application</div><div class='del'>-calling open() can continue on its access to the file.</div><div class='del'>-</div><div class='del'>-   If brick1 goes down, we delete foo.txt and create a file with the</div><div class='del'>-same name again i.e foo.txt. Now brick1 comes back up, clearly there is</div><div class='del'>-a chance that the version on brick1 being more than the version on</div><div class='del'>-brick2, this is where createtime extended attribute helps in deciding</div><div class='del'>-which the outdated copy is. Hence we need to consider both createtime</div><div class='del'>-and version to decide on the latest copy.</div><div class='del'>-</div><div class='del'>-   The version attribute is incremented during the close() call. Version</div><div class='del'>-will not be incremented in case there was no write() done. In case the</div><div class='del'>-fd that the close() gets was got by create() call, we also create the</div><div class='del'>-createtime extended attribute.</div><div class='del'>-</div><div class='del'>-4.3.2.3 Directory self-heal</div><div class='del'>-...........................</div><div class='del'>-</div><div class='del'>-Suppose brick1 goes down, we delete foo.txt, brick1 comes back up, now</div><div class='del'>-we should not create foo.txt on brick2 but we should delete foo.txt on</div><div class='del'>-brick1. We handle this situation by having the createtime and version</div><div class='del'>-attribute on the directory similar to the file. when lookup() is done</div><div class='del'>-on the directory, we compare the createtime/version attributes of the</div><div class='del'>-copies and see which files needs to be deleted and delete those files</div><div class='del'>-and update the extended attributes of the outdated directory copy.</div><div class='del'>-Each time a directory is modified (a file or a subdirectory is created</div><div class='del'>-or deleted inside the directory) and one of the subvols is down, we</div><div class='del'>-increment the directory's version.</div><div class='del'>-</div><div class='del'>-   lookup() is a call initiated by the kernel on a file or directory</div><div class='del'>-just before any access to that file or directory. In glusterfs, by</div><div class='del'>-default, lookup() will not be called in case it was called in the past</div><div class='del'>-one second on that particular file or directory.</div><div class='del'>-</div><div class='del'>-   The extended attributes can be seen in the backend filesystem using</div><div class='del'>-the `getfattr' command. (`getfattr -n trusted.afr.version &lt;file&gt;')</div><div class='del'>-</div><div class='del'>-`debug [on|off]  (off)'</div><div class='del'>-</div><div class='del'>-`self-heal [on|off] (on)'</div><div class='del'>-</div><div class='del'>-`replicate &lt;pattern&gt; (*:1)'</div><div class='del'>-</div><div class='del'>-`lock-node &lt;child_volume&gt; (first child is used by default)'</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-File: user-guide.info,  Node: Stripe,  Prev: Replicate,  Up: Clustering Translators</div><div class='del'>-</div><div class='del'>-4.3.3 Stripe</div><div class='del'>-------------</div><div class='del'>-</div><div class='del'>-     type cluster/stripe</div><div class='del'>-</div><div class='del'>-   The stripe translator distributes the contents of a file over its</div><div class='del'>-sub-volumes.  It does this by creating a file equal in size to the</div><div class='del'>-total size of the file on each of its sub-volumes. It then writes only</div><div class='del'>-a part of the file to each sub-volume, leaving the rest of it empty.</div><div class='del'>-These empty regions are called `holes' in Unix terminology. The holes</div><div class='del'>-do not consume any disk space.</div><div class='del'>-</div><div class='del'>-   The diagram below makes this clear.</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-You can configure stripe so that only filenames matching a pattern are</div><div class='del'>-striped. You can also configure the size of the data to be stored on</div><div class='del'>-each sub-volume.</div><div class='del'>-</div><div class='del'>-`block-size &lt;pattern&gt;:&lt;size&gt;  (*:0 no striping)'</div><div class='del'>-     Distribute files matching `&lt;pattern&gt;' over the sub-volumes,</div><div class='del'>-     storing at least `&lt;size&gt;' on each sub-volume. For example,</div><div class='del'>-</div><div class='del'>-            option block-size *.mpg:1M</div><div class='del'>-</div><div class='del'>-     distributes all files ending in `.mpg', storing at least 1 MB on</div><div class='del'>-     each sub-volume.</div><div class='del'>-</div><div class='del'>-     Any number of `block-size' option lines may be present, specifying</div><div class='del'>-     different sizes for different file name patterns.</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-File: user-guide.info,  Node: Performance Translators,  Next: Features Translators,  Prev: Clustering Translators,  Up: Translators</div><div class='del'>-</div><div class='del'>-4.4 Performance Translators</div><div class='del'>-===========================</div><div class='del'>-</div><div class='del'>-* Menu:</div><div class='del'>-</div><div class='del'>-* Read Ahead::</div><div class='del'>-* Write Behind::</div><div class='del'>-* IO Threads::</div><div class='del'>-* IO Cache::</div><div class='del'>-* Booster::</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-File: user-guide.info,  Node: Read Ahead,  Next: Write Behind,  Up: Performance Translators</div><div class='del'>-</div><div class='del'>-4.4.1 Read Ahead</div><div class='del'>-----------------</div><div class='del'>-</div><div class='del'>-     type performance/read-ahead</div><div class='del'>-</div><div class='del'>-   The read-ahead translator pre-fetches data in advance on every read.</div><div class='del'>-This benefits applications that mostly process files in sequential</div><div class='del'>-order, since the next block of data will already be available by the</div><div class='del'>-time the application is done with the current one.</div><div class='del'>-</div><div class='del'>-   Additionally, the read-ahead translator also behaves as a</div><div class='del'>-read-aggregator.  Many small read operations are combined and issued as</div><div class='del'>-fewer, larger read requests to the server.</div><div class='del'>-</div><div class='del'>-   Read-ahead deals in "pages" as the unit of data fetched. The page</div><div class='del'>-size is configurable, as is the "page count", which is the number of</div><div class='del'>-pages that are pre-fetched.</div><div class='del'>-</div><div class='del'>-   Read-ahead is best used with InfiniBand (using the ib-verbs</div><div class='del'>-transport).  On FastEthernet and Gigabit Ethernet networks, GlusterFS</div><div class='del'>-can achieve the link-maximum throughput even without read-ahead, making</div><div class='del'>-it quite superflous.</div><div class='del'>-</div><div class='del'>-   Note that read-ahead only happens if the reads are perfectly</div><div class='del'>-sequential. If your application accesses data in a random fashion,</div><div class='del'>-using read-ahead might actually lead to a performance loss, since</div><div class='del'>-read-ahead will pointlessly fetch pages which won't be used by the</div><div class='del'>-application.</div><div class='del'>-</div><div class='del'>-   Options:</div><div class='del'>-`page-size &lt;n&gt; (256KB)'</div><div class='del'>-     The unit of data that is pre-fetched.</div><div class='del'>-</div><div class='del'>-`page-count &lt;n&gt; (2)'</div><div class='del'>-     The number of pages that are pre-fetched.</div><div class='del'>-</div><div class='del'>-`force-atime-update [on|off|yes|no] (off|no)'</div><div class='del'>-     Whether to force an access time (atime) update on the file on</div><div class='del'>-     every read. Without this, the atime will be slightly imprecise, as</div><div class='del'>-     it will reflect the time when the read-ahead translator read the</div><div class='del'>-     data, not when the application actually read it.</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-File: user-guide.info,  Node: Write Behind,  Next: IO Threads,  Prev: Read Ahead,  Up: Performance Translators</div><div class='del'>-</div><div class='del'>-4.4.2 Write Behind</div><div class='del'>-------------------</div><div class='del'>-</div><div class='del'>-     type performance/write-behind</div><div class='del'>-</div><div class='del'>-   The write-behind translator improves the latency of a write</div><div class='del'>-operation.  It does this by relegating the write operation to the</div><div class='del'>-background and returning to the application even as the write is in</div><div class='del'>-progress. Using the write-behind translator, successive write requests</div><div class='del'>-can be pipelined.  This mode of write-behind operation is best used on</div><div class='del'>-the client side, to enable decreased write latency for the application.</div><div class='del'>-</div><div class='del'>-   The write-behind translator can also aggregate write requests. If the</div><div class='del'>-`aggregate-size' option is specified, then successive writes upto that</div><div class='del'>-size are accumulated and written in a single operation. This mode of</div><div class='del'>-operation is best used on the server side, as this will decrease the</div><div class='del'>-disk's head movement when multiple files are being written to in</div><div class='del'>-parallel.</div><div class='del'>-</div><div class='del'>-   The `aggregate-size' option has a default value of 128KB. Although</div><div class='del'>-this works well for most users, you should always experiment with</div><div class='del'>-different values to determine the one that will deliver maximum</div><div class='del'>-performance. This is because the performance of write-behind depends on</div><div class='del'>-your interconnect, size of RAM, and the work load.</div><div class='del'>-</div><div class='del'>-`aggregate-size &lt;n&gt; (128KB)'</div><div class='del'>-     Amount of data to accumulate before doing a write</div><div class='del'>-</div><div class='del'>-`flush-behind [on|yes|off|no] (off|no)'</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-File: user-guide.info,  Node: IO Threads,  Next: IO Cache,  Prev: Write Behind,  Up: Performance Translators</div><div class='del'>-</div><div class='del'>-4.4.3 IO Threads</div><div class='del'>-----------------</div><div class='del'>-</div><div class='del'>-     type performance/io-threads</div><div class='del'>-</div><div class='del'>-   The IO threads translator is intended to increase the responsiveness</div><div class='del'>-of the server to metadata operations by doing file I/O (read, write) in</div><div class='del'>-a background thread.  Since the GlusterFS server is single-threaded,</div><div class='del'>-using the IO threads translator can significantly improve performance.</div><div class='del'>-This translator is best used on the server side, loaded just below the</div><div class='del'>-server protocol translator.</div><div class='del'>-</div><div class='del'>-   IO threads operates by handing out read and write requests to a</div><div class='del'>-separate thread.  The total number of threads in existence at a time is</div><div class='del'>-constant, and configurable.</div><div class='del'>-</div><div class='del'>-`thread-count &lt;n&gt; (1)'</div><div class='del'>-     Number of threads to use.</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-File: user-guide.info,  Node: IO Cache,  Next: Booster,  Prev: IO Threads,  Up: Performance Translators</div><div class='del'>-</div><div class='del'>-4.4.4 IO Cache</div><div class='del'>---------------</div><div class='del'>-</div><div class='del'>-     type performance/io-cache</div><div class='del'>-</div><div class='del'>-   The IO cache translator caches data that has been read. This is</div><div class='del'>-useful if many applications read the same data multiple times, and if</div><div class='del'>-reads are much more frequent than writes (for example, IO caching may be</div><div class='del'>-useful in a web hosting environment, where most clients will simply</div><div class='del'>-read some files and only a few will write to them).</div><div class='del'>-</div><div class='del'>-   The IO cache translator reads data from its child in `page-size'</div><div class='del'>-chunks.  It caches data upto `cache-size' bytes. The cache is</div><div class='del'>-maintained as a prioritized least-recently-used (LRU) list, with</div><div class='del'>-priorities determined by user-specified patterns to match filenames.</div><div class='del'>-</div><div class='del'>-   When the IO cache translator detects a write operation, the cache</div><div class='del'>-for that file is flushed.</div><div class='del'>-</div><div class='del'>-   The IO cache translator periodically verifies the consistency of</div><div class='del'>-cached data, using the modification times on the files. The</div><div class='del'>-verification timeout is configurable.</div><div class='del'>-</div><div class='del'>-`page-size &lt;n&gt; (128KB)'</div><div class='del'>-     Size of a page.</div><div class='del'>-</div><div class='del'>-`cache-size (n) (32MB)'</div><div class='del'>-     Total amount of data to be cached.</div><div class='del'>-</div><div class='del'>-`force-revalidate-timeout &lt;n&gt; (1)'</div><div class='del'>-     Timeout to force a cache consistency verification, in seconds.</div><div class='del'>-</div><div class='del'>-`priority &lt;pattern&gt; (*:0)'</div><div class='del'>-     Filename patterns listed in order of priority.</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-File: user-guide.info,  Node: Booster,  Prev: IO Cache,  Up: Performance Translators</div><div class='del'>-</div><div class='del'>-4.4.5 Booster</div><div class='del'>--------------</div><div class='del'>-</div><div class='del'>-       type performance/booster</div><div class='del'>-</div><div class='del'>-   The booster translator gives applications a faster path to</div><div class='del'>-communicate read and write requests to GlusterFS. Normally, all</div><div class='del'>-requests to GlusterFS from applications go through FUSE, as indicated</div><div class='del'>-in *note Filesystems in Userspace::.  Using the booster translator in</div><div class='del'>-conjunction with the GlusterFS booster shared library, an application</div><div class='del'>-can bypass the FUSE path and send read/write requests directly to the</div><div class='del'>-GlusterFS client process.</div><div class='del'>-</div><div class='del'>-   The booster mechanism consists of two parts: the booster translator,</div><div class='del'>-and the booster shared library. The booster translator is meant to be</div><div class='del'>-loaded on the client side, usually at the root of the translator tree.</div><div class='del'>-The booster shared library should be `LD_PRELOAD'ed with the</div><div class='del'>-application.</div><div class='del'>-</div><div class='del'>-   The booster translator when loaded opens a Unix domain socket and</div><div class='del'>-listens for read/write requests on it. The booster shared library</div><div class='del'>-intercepts read and write system calls and sends the requests to the</div><div class='del'>-GlusterFS process directly using the Unix domain socket, bypassing FUSE.</div><div class='del'>-This leads to superior performance.</div><div class='del'>-</div><div class='del'>-   Once you've loaded the booster translator in your volume</div><div class='del'>-specification file, you can start your application as:</div><div class='del'>-</div><div class='del'>-       $ LD_PRELOAD=/usr/local/bin/glusterfs-booster.so your_app</div><div class='del'>-</div><div class='del'>-   The booster translator accepts no options.</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-File: user-guide.info,  Node: Features Translators,  Next: Miscellaneous Translators,  Prev: Performance Translators,  Up: Translators</div><div class='del'>-</div><div class='del'>-4.5 Features Translators</div><div class='del'>-========================</div><div class='del'>-</div><div class='del'>-* Menu:</div><div class='del'>-</div><div class='del'>-* POSIX Locks::</div><div class='del'>-* Fixed ID::</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-File: user-guide.info,  Node: POSIX Locks,  Next: Fixed ID,  Up: Features Translators</div><div class='del'>-</div><div class='del'>-4.5.1 POSIX Locks</div><div class='del'>------------------</div><div class='del'>-</div><div class='del'>-     type features/posix-locks</div><div class='del'>-</div><div class='del'>-   This translator provides storage independent POSIX record locking</div><div class='del'>-support (`fcntl' locking). Typically you'll want to load this on the</div><div class='del'>-server side, just above the POSIX storage translator. Using this</div><div class='del'>-translator you can get both advisory locking and mandatory locking</div><div class='del'>-support.  It also handles `flock()' locks properly.</div><div class='del'>-</div><div class='del'>-   Caveat: Consider a file that does not have its mandatory locking bits</div><div class='del'>-(+setgid, -group execution) turned on. Assume that this file is now</div><div class='del'>-opened by a process on a client that has the write-behind xlator</div><div class='del'>-loaded. The write-behind xlator does not cache anything for files which</div><div class='del'>-have mandatory locking enabled, to avoid incoherence. Let's say that</div><div class='del'>-mandatory locking is now enabled on this file through another client.</div><div class='del'>-The former client will not know about this change, and write-behind may</div><div class='del'>-erroneously report a write as being successful when in fact it would</div><div class='del'>-fail due to the region it is writing to being locked.</div><div class='del'>-</div><div class='del'>-   There seems to be no easy way to fix this. To work around this</div><div class='del'>-problem, it is recommended that you never enable the mandatory bits on</div><div class='del'>-a file while it is open.</div><div class='del'>-</div><div class='del'>-`mandatory [on|off] (on)'</div><div class='del'>-     Turns mandatory locking on.</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-File: user-guide.info,  Node: Fixed ID,  Prev: POSIX Locks,  Up: Features Translators</div><div class='del'>-</div><div class='del'>-4.5.2 Fixed ID</div><div class='del'>---------------</div><div class='del'>-</div><div class='del'>-     type features/fixed-id</div><div class='del'>-</div><div class='del'>-   The fixed ID translator makes all filesystem requests from the client</div><div class='del'>-to appear to be coming from a fixed, specified UID/GID, regardless of</div><div class='del'>-which user actually initiated the request.</div><div class='del'>-</div><div class='del'>-`fixed-uid &lt;n&gt; [if not set, not used]'</div><div class='del'>-     The UID to send to the server</div><div class='del'>-</div><div class='del'>-`fixed-gid &lt;n&gt; [if not set, not used]'</div><div class='del'>-     The GID to send to the server</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-File: user-guide.info,  Node: Miscellaneous Translators,  Prev: Features Translators,  Up: Translators</div><div class='del'>-</div><div class='del'>-4.6 Miscellaneous Translators</div><div class='del'>-=============================</div><div class='del'>-</div><div class='del'>-* Menu:</div><div class='del'>-</div><div class='del'>-* ROT-13::</div><div class='del'>-* Trace::</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-File: user-guide.info,  Node: ROT-13,  Next: Trace,  Up: Miscellaneous Translators</div><div class='del'>-</div><div class='del'>-4.6.1 ROT-13</div><div class='del'>-------------</div><div class='del'>-</div><div class='del'>-     type encryption/rot-13</div><div class='del'>-</div><div class='del'>-   ROT-13 is a toy translator that can "encrypt" and "decrypt" file</div><div class='del'>-contents using the ROT-13 algorithm. ROT-13 is a trivial algorithm that</div><div class='del'>-rotates each alphabet by thirteen places. Thus, 'A' becomes 'N', 'B'</div><div class='del'>-becomes 'O', and 'Z' becomes 'M'.</div><div class='del'>-</div><div class='del'>-   It goes without saying that you shouldn't use this translator if you</div><div class='del'>-need _real_ encryption (a future release of GlusterFS will have real</div><div class='del'>-encryption translators).</div><div class='del'>-</div><div class='del'>-`encrypt-write [on|off] (on)'</div><div class='del'>-     Whether to encrypt on write</div><div class='del'>-</div><div class='del'>-`decrypt-read [on|off] (on)'</div><div class='del'>-     Whether to decrypt on read</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-File: user-guide.info,  Node: Trace,  Prev: ROT-13,  Up: Miscellaneous Translators</div><div class='del'>-</div><div class='del'>-4.6.2 Trace</div><div class='del'>------------</div><div class='del'>-</div><div class='del'>-     type debug/trace</div><div class='del'>-</div><div class='del'>-   The trace translator is intended for debugging purposes. When</div><div class='del'>-loaded, it logs all the system calls received by the server or client</div><div class='del'>-(wherever trace is loaded), their arguments, and the results. You must</div><div class='del'>-use a GlusterFS log level of DEBUG (See *note Running GlusterFS::) for</div><div class='del'>-trace to work.</div><div class='del'>-</div><div class='del'>-   Sample trace output (lines have been wrapped for readability):</div><div class='del'>-     2007-10-30 00:08:58 D [trace.c:1579:trace_opendir] trace: callid: 68</div><div class='del'>-     (*this=0x8059e40, loc=0x8091984 {path=/iozone3_283, inode=0x8091f00},</div><div class='del'>-      fd=0x8091d50)</div><div class='del'>-</div><div class='del'>-     2007-10-30 00:08:58 D [trace.c:630:trace_opendir_cbk] trace:</div><div class='del'>-     (*this=0x8059e40, op_ret=4, op_errno=1, fd=0x8091d50)</div><div class='del'>-</div><div class='del'>-     2007-10-30 00:08:58 D [trace.c:1602:trace_readdir] trace: callid: 69</div><div class='del'>-     (*this=0x8059e40, size=4096, offset=0 fd=0x8091d50)</div><div class='del'>-</div><div class='del'>-     2007-10-30 00:08:58 D [trace.c:215:trace_readdir_cbk] trace:</div><div class='del'>-     (*this=0x8059e40, op_ret=0, op_errno=0, count=4)</div><div class='del'>-</div><div class='del'>-     2007-10-30 00:08:58 D [trace.c:1624:trace_closedir] trace: callid: 71</div><div class='del'>-     (*this=0x8059e40, *fd=0x8091d50)</div><div class='del'>-</div><div class='del'>-     2007-10-30 00:08:58 D [trace.c:809:trace_closedir_cbk] trace:</div><div class='del'>-     (*this=0x8059e40, op_ret=0, op_errno=1)</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-File: user-guide.info,  Node: Usage Scenarios,  Next: Troubleshooting,  Prev: Translators,  Up: Top</div><div class='del'>-</div><div class='del'>-5 Usage Scenarios</div><div class='del'>-*****************</div><div class='del'>-</div><div class='del'>-5.1 Advanced Striping</div><div class='del'>-=====================</div><div class='del'>-</div><div class='del'>-This section is based on the Advanced Striping tutorial written by</div><div class='del'>-Anand Avati on the GlusterFS wiki (1).</div><div class='del'>-</div><div class='del'>-5.1.1 Mixed Storage Requirements</div><div class='del'>---------------------------------</div><div class='del'>-</div><div class='del'>-There are two ways of scheduling the I/O. One at file level (using</div><div class='del'>-unify translator) and other at block level (using stripe translator).</div><div class='del'>-Striped I/O is good for files that are potentially large and require</div><div class='del'>-high parallel throughput (for example, a single file of 400GB being</div><div class='del'>-accessed by 100s and 1000s of systems simultaneously and randomly). For</div><div class='del'>-most of the cases, file level scheduling works best.</div><div class='del'>-</div><div class='del'>-   In the real world, it is desirable to mix file level and block level</div><div class='del'>-scheduling on a single storage volume. Alternatively users can choose</div><div class='del'>-to have two separate volumes and hence two mount points, but the</div><div class='del'>-applications may demand a single storage system to host both.</div><div class='del'>-</div><div class='del'>-   This document explains how to mix file level scheduling with stripe.</div><div class='del'>-</div><div class='del'>-5.1.2 Configuration Brief</div><div class='del'>--------------------------</div><div class='del'>-</div><div class='del'>-This setup demonstrates how users can configure unify translator with</div><div class='del'>-appropriate I/O scheduler for file level scheduling and strip for only</div><div class='del'>-matching patterns. This way, GlusterFS chooses appropriate I/O profile</div><div class='del'>-and knows how to efficiently handle both the types of data.</div><div class='del'>-</div><div class='del'>-   A simple technique to achieve this effect is to create a stripe set</div><div class='del'>-of unify and stripe blocks, where unify is the first sub-volume. Files</div><div class='del'>-that do not match the stripe policy passed on to first unify sub-volume</div><div class='del'>-and inturn scheduled arcoss the cluster using its file level I/O</div><div class='del'>-scheduler.</div><div class='del'>-</div><div class='del'>- 5.1.3 Preparing GlusterFS Envoronment</div><div class='del'>--------------------------------------</div><div class='del'>-</div><div class='del'>-Create the directories /export/namespace, /export/unify and</div><div class='del'>-/export/stripe on all the storage bricks.</div><div class='del'>-</div><div class='del'>-   Place the following server and client volume spec file under</div><div class='del'>-/etc/glusterfs (or appropriate installed path) and replace the IP</div><div class='del'>-addresses / access control fields to match your environment.</div><div class='del'>-</div><div class='del'>-       ## file: /etc/glusterfs/glusterfsd.vol</div><div class='del'>-        volume posix-unify</div><div class='del'>-                type storage/posix</div><div class='del'>-                option directory /export/for-unify</div><div class='del'>-        end-volume</div><div class='del'>-</div><div class='del'>-        volume posix-stripe</div><div class='del'>-                type storage/posix</div><div class='del'>-                option directory /export/for-stripe</div><div class='del'>-        end-volume</div><div class='del'>-</div><div class='del'>-        volume posix-namespace</div><div class='del'>-                type storage/posix</div><div class='del'>-                option directory /export/for-namespace</div><div class='del'>-        end-volume</div><div class='del'>-</div><div class='del'>-        volume server</div><div class='del'>-                type protocol/server</div><div class='del'>-                option transport-type tcp</div><div class='del'>-                option auth.addr.posix-unify.allow 192.168.1.*</div><div class='del'>-                option auth.addr.posix-stripe.allow 192.168.1.*</div><div class='del'>-                option auth.addr.posix-namespace.allow 192.168.1.*</div><div class='del'>-                subvolumes posix-unify posix-stripe posix-namespace</div><div class='del'>-        end-volume</div><div class='del'>-</div><div class='del'>-      ## file: /etc/glusterfs/glusterfs.vol</div><div class='del'>-        volume client-namespace</div><div class='del'>-          type protocol/client</div><div class='del'>-          option transport-type tcp</div><div class='del'>-          option remote-host 192.168.1.1</div><div class='del'>-          option remote-subvolume posix-namespace</div><div class='del'>-        end-volume</div><div class='del'>-</div><div class='del'>-        volume client-unify-1</div><div class='del'>-          type protocol/client</div><div class='del'>-          option transport-type tcp</div><div class='del'>-          option remote-host 192.168.1.1</div><div class='del'>-          option remote-subvolume posix-unify</div><div class='del'>-        end-volume</div><div class='del'>-</div><div class='del'>-        volume client-unify-2</div><div class='del'>-          type protocol/client</div><div class='del'>-          option transport-type tcp</div><div class='del'>-          option remote-host 192.168.1.2</div><div class='del'>-          option remote-subvolume posix-unify</div><div class='del'>-        end-volume</div><div class='del'>-</div><div class='del'>-        volume client-unify-3</div><div class='del'>-          type protocol/client</div><div class='del'>-          option transport-type tcp</div><div class='del'>-          option remote-host 192.168.1.3</div><div class='del'>-          option remote-subvolume posix-unify</div><div class='del'>-        end-volume</div><div class='del'>-</div><div class='del'>-        volume client-unify-4</div><div class='del'>-          type protocol/client</div><div class='del'>-          option transport-type tcp</div><div class='del'>-          option remote-host 192.168.1.4</div><div class='del'>-          option remote-subvolume posix-unify</div><div class='del'>-        end-volume</div><div class='del'>-</div><div class='del'>-        volume client-stripe-1</div><div class='del'>-          type protocol/client</div><div class='del'>-          option transport-type tcp</div><div class='del'>-          option remote-host 192.168.1.1</div><div class='del'>-          option remote-subvolume posix-stripe</div><div class='del'>-        end-volume</div><div class='del'>-</div><div class='del'>-        volume client-stripe-2</div><div class='del'>-          type protocol/client</div><div class='del'>-          option transport-type tcp</div><div class='del'>-          option remote-host 192.168.1.2</div><div class='del'>-          option remote-subvolume posix-stripe</div><div class='del'>-        end-volume</div><div class='del'>-</div><div class='del'>-        volume client-stripe-3</div><div class='del'>-          type protocol/client</div><div class='del'>-          option transport-type tcp</div><div class='del'>-          option remote-host 192.168.1.3</div><div class='del'>-          option remote-subvolume posix-stripe</div><div class='del'>-        end-volume</div><div class='del'>-</div><div class='del'>-        volume client-stripe-4</div><div class='del'>-          type protocol/client</div><div class='del'>-          option transport-type tcp</div><div class='del'>-          option remote-host 192.168.1.4</div><div class='del'>-          option remote-subvolume posix-stripe</div><div class='del'>-        end-volume</div><div class='del'>-</div><div class='del'>-        volume unify</div><div class='del'>-          type cluster/unify</div><div class='del'>-          option scheduler rr</div><div class='del'>-          subvolumes cluster-unify-1 cluster-unify-2 cluster-unify-3 cluster-unify-4</div><div class='del'>-        end-volume</div><div class='del'>-</div><div class='del'>-        volume stripe</div><div class='del'>-          type cluster/stripe</div><div class='del'>-          option block-size *.img:2MB # All files ending with .img are striped with 2MB stripe block size.</div><div class='del'>-          subvolumes unify cluster-stripe-1 cluster-stripe-2 cluster-stripe-3 cluster-stripe-4</div><div class='del'>-        end-volume</div><div class='del'>-</div><div class='del'>-   Bring up the Storage</div><div class='del'>-</div><div class='del'>-   Starting GlusterFS Server: If you have installed through binary</div><div class='del'>-package, you can start the service through init.d startup script. If</div><div class='del'>-not:</div><div class='del'>-</div><div class='del'>-     [root@server]# glusterfsd</div><div class='del'>-</div><div class='del'>-   Mounting GlusterFS Volumes:</div><div class='del'>-</div><div class='del'>-     [root@client]# glusterfs -s [BRICK-IP-ADDRESS] /mnt/cluster</div><div class='del'>-</div><div class='del'>-   Improving upon this Setup</div><div class='del'>-</div><div class='del'>-   Infiniband Verbs RDMA transport is much faster than TCP/IP GigE</div><div class='del'>-transport.</div><div class='del'>-</div><div class='del'>-   Use of performance translators such as read-ahead, write-behind,</div><div class='del'>-io-cache, io-threads, booster is recommended.</div><div class='del'>-</div><div class='del'>-   Replace round-robin (rr) scheduler with ALU to handle more dynamic</div><div class='del'>-storage environments.</div><div class='del'>-</div><div class='del'>-   ---------- Footnotes ----------</div><div class='del'>-</div><div class='del'>-   (1)</div><div class='del'>-http://gluster.org/docs/index.php/Mixing_Striped_and_Regular_Files</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-File: user-guide.info,  Node: Troubleshooting,  Next: GNU Free Documentation Licence,  Prev: Usage Scenarios,  Up: Top</div><div class='del'>-</div><div class='del'>-6 Troubleshooting</div><div class='del'>-*****************</div><div class='del'>-</div><div class='del'>-This chapter is a general troubleshooting guide to GlusterFS. It lists</div><div class='del'>-common GlusterFS server and client error messages, debugging hints, and</div><div class='del'>-concludes with the suggested procedure to report bugs in GlusterFS.</div><div class='del'>-</div><div class='del'>-6.1 GlusterFS error messages</div><div class='del'>-============================</div><div class='del'>-</div><div class='del'>-6.1.1 Server errors</div><div class='del'>--------------------</div><div class='del'>-</div><div class='del'>-     glusterfsd: FATAL: could not open specfile:</div><div class='del'>-     '/etc/glusterfs/glusterfsd.vol'</div><div class='del'>-</div><div class='del'>-   The GlusterFS server expects the volume specification file to be at</div><div class='del'>-`/etc/glusterfs/glusterfsd.vol'. The example specification file will be</div><div class='del'>-installed as `/etc/glusterfs/glusterfsd.vol.sample'. You need to edit</div><div class='del'>-it and rename it, or provide a different specification file using the</div><div class='del'>-`--spec-file' command line option (See *note Server::).</div><div class='del'>-</div><div class='del'>-     gf_log_init: failed to open logfile "/usr/var/log/glusterfs/glusterfsd.log"</div><div class='del'>-                  (Permission denied)</div><div class='del'>-</div><div class='del'>-   You don't have permission to create files in the</div><div class='del'>-`/usr/var/log/glusterfs' directory. Make sure you are running GlusterFS</div><div class='del'>-as root. Alternatively, specify a different path for the log file using</div><div class='del'>-the `--log-file' option (See *note Server::).</div><div class='del'>-</div><div class='del'>-6.1.2 Client errors</div><div class='del'>--------------------</div><div class='del'>-</div><div class='del'>-     fusermount: failed to access mountpoint /mnt:</div><div class='del'>-                 Transport endpoint is not connected</div><div class='del'>-</div><div class='del'>-   A previous failed (or hung) mount of GlusterFS is preventing it from</div><div class='del'>-being mounted again in the same location. The fix is to do:</div><div class='del'>-</div><div class='del'>-     # umount /mnt</div><div class='del'>-</div><div class='del'>-   and try mounting again.</div><div class='del'>-</div><div class='del'>-   *"Transport endpoint is not connected".*</div><div class='del'>-</div><div class='del'>-   If you get this error when you try a command such as `ls' or `cat',</div><div class='del'>-it means the GlusterFS mount did not succeed. Try running GlusterFS in</div><div class='del'>-`DEBUG' logging level and study the log messages to discover the cause.</div><div class='del'>-</div><div class='del'>-   *"Connect to server failed", "SERVER-ADDRESS: Connection refused".*</div><div class='del'>-</div><div class='del'>-   GluserFS Server is not running or dead. Check your network</div><div class='del'>-connections and firewall settings. To check if the server is reachable,</div><div class='del'>-try:</div><div class='del'>-</div><div class='del'>-     telnet IP-ADDRESS 6996</div><div class='del'>-</div><div class='del'>-   If the server is accessible, your `telnet' command should connect and</div><div class='del'>-block. If not you will see an error message such as `telnet: Unable to</div><div class='del'>-connect to remote host: Connection refused'. 6996 is the default</div><div class='del'>-GlusterFS port. If you have changed it, then use the corresponding port</div><div class='del'>-instead.</div><div class='del'>-</div><div class='del'>-     gf_log_init: failed to open logfile "/usr/var/log/glusterfs/glusterfs.log"</div><div class='del'>-                  (Permission denied)</div><div class='del'>-</div><div class='del'>-   You don't have permission to create files in the</div><div class='del'>-`/usr/var/log/glusterfs' directory. Make sure you are running GlusterFS</div><div class='del'>-as root. Alternatively, specify a different path for the log file using</div><div class='del'>-the `--log-file' option (See *note Client::).</div><div class='del'>-</div><div class='del'>-6.2 FUSE error messages</div><div class='del'>-=======================</div><div class='del'>-</div><div class='del'>-`modprobe fuse' fails with: "Unknown symbol in module, or unknown</div><div class='del'>-parameter".  </div><div class='del'>-</div><div class='del'>-   If you are using fuse-2.6.x on Redhat Enterprise Linux Work Station 4</div><div class='del'>-and Advanced Server 4 with 2.6.9-42.ELlargesmp, 2.6.9-42.ELsmp,</div><div class='del'>-2.6.9-42.EL kernels and get this error while loading FUSE kernel</div><div class='del'>-module, you need to apply the following patch.</div><div class='del'>-</div><div class='del'>-   For fuse-2.6.2:</div><div class='del'>-</div><div class='del'>-&lt;http://ftp.gluster.com/pub/gluster/glusterfs/fuse/fuse-2.6.2-rhel-build.patch&gt;</div><div class='del'>-</div><div class='del'>-   For fuse-2.6.3:</div><div class='del'>-</div><div class='del'>-&lt;http://ftp.gluster.com/pub/gluster/glusterfs/fuse/fuse-2.6.3-rhel-build.patch&gt;</div><div class='del'>-</div><div class='del'>-6.3 AppArmour and GlusterFS</div><div class='del'>-===========================</div><div class='del'>-</div><div class='del'>-Under OpenSuSE GNU/Linux, the AppArmour security feature does not allow</div><div class='del'>-GlusterFS to create temporary files or network socket connections even</div><div class='del'>-while running as root. You will see error messages like `Unable to open</div><div class='del'>-log file: Operation not permitted' or `Connection refused'. Disabling</div><div class='del'>-AppArmour using YaST or properly configuring AppArmour to recognize</div><div class='del'>-`glusterfsd' or `glusterfs'/`fusermount' should solve the problem.</div><div class='del'>-</div><div class='del'>-6.4 Reporting a bug</div><div class='del'>-===================</div><div class='del'>-</div><div class='del'>-If you encounter a bug in GlusterFS, please follow the below guidelines</div><div class='del'>-when you report it to the mailing list. Be sure to report it! User</div><div class='del'>-feedback is crucial to the health of the project and we value it highly.</div><div class='del'>-</div><div class='del'>-6.4.1 General instructions</div><div class='del'>---------------------------</div><div class='del'>-</div><div class='del'>-When running GlusterFS in a non-production environment, be sure to</div><div class='del'>-build it with the following command:</div><div class='del'>-</div><div class='del'>-      $ make CFLAGS='-g -O0 -DDEBUG'</div><div class='del'>-</div><div class='del'>-   This includes debugging information which will be helpful in getting</div><div class='del'>-backtraces (see below) and also disable optimization. Enabling</div><div class='del'>-optimization can result in incorrect line numbers being reported to gdb.</div><div class='del'>-</div><div class='del'>-6.4.2 Volume specification files</div><div class='del'>---------------------------------</div><div class='del'>-</div><div class='del'>-Attach all relevant server and client spec files you were using when</div><div class='del'>-you encountered the bug. Also tell us details of your setup, i.e., how</div><div class='del'>-many clients and how many servers.</div><div class='del'>-</div><div class='del'>-6.4.3 Log files</div><div class='del'>----------------</div><div class='del'>-</div><div class='del'>-Set the loglevel of your client and server programs to DEBUG (by</div><div class='del'>-passing the -L DEBUG option) and attach the log files with your bug</div><div class='del'>-report. Obviously, if only the client is failing (for example), you</div><div class='del'>-only need to send us the client log file.</div><div class='del'>-</div><div class='del'>-6.4.4 Backtrace</div><div class='del'>----------------</div><div class='del'>-</div><div class='del'>-If GlusterFS has encountered a segmentation fault or has crashed for</div><div class='del'>-some other reason, include the backtrace with the bug report. You can</div><div class='del'>-get the backtrace using the following procedure.</div><div class='del'>-</div><div class='del'>-   Run the GlusterFS client or server inside gdb.</div><div class='del'>-</div><div class='del'>-      $ gdb ./glusterfs</div><div class='del'>-      (gdb) set args -f client.spec -N -l/path/to/log/file -LDEBUG /mnt/point</div><div class='del'>-      (gdb) run</div><div class='del'>-</div><div class='del'>-   Now when the process segfaults, you can get the backtrace by typing:</div><div class='del'>-</div><div class='del'>-      (gdb) bt</div><div class='del'>-</div><div class='del'>-   If the GlusterFS process has crashed and dumped a core file (you can</div><div class='del'>-find this in / if running as a daemon and in the current directory</div><div class='del'>-otherwise), you can do:</div><div class='del'>-</div><div class='del'>-      $ gdb /path/to/glusterfs /path/to/core.&lt;pid&gt;</div><div class='del'>-</div><div class='del'>-   and then get the backtrace.</div><div class='del'>-</div><div class='del'>-   If the GlusterFS server or client seems to be hung, then you can get</div><div class='del'>-the backtrace by attaching gdb to the process. First get the `PID' of</div><div class='del'>-the process (using ps), and then do:</div><div class='del'>-</div><div class='del'>-      $ gdb ./glusterfs &lt;pid&gt;</div><div class='del'>-</div><div class='del'>-   Press Ctrl-C to interrupt the process and then generate the</div><div class='del'>-backtrace.</div><div class='del'>-</div><div class='del'>-6.4.5 Reproducing the bug</div><div class='del'>--------------------------</div><div class='del'>-</div><div class='del'>-If the bug is reproducible, please include the steps necessary to do</div><div class='del'>-so. If the bug is not reproducible, send us the bug report anyway.</div><div class='del'>-</div><div class='del'>-6.4.6 Other information</div><div class='del'>------------------------</div><div class='del'>-</div><div class='del'>-If you think it is relevant, send us also the version of FUSE you're</div><div class='del'>-using, the kernel version, platform.</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-File: user-guide.info,  Node: GNU Free Documentation Licence,  Next: Index,  Prev: Troubleshooting,  Up: Top</div><div class='del'>-</div><div class='del'>-Appendix A GNU Free Documentation Licence</div><div class='del'>-*****************************************</div><div class='del'>-</div><div class='del'>-                      Version 1.2, November 2002</div><div class='del'>-</div><div class='del'>-     Copyright (C) 2000,2001,2002 Free Software Foundation, Inc.</div><div class='del'>-     59 Temple Place, Suite 330, Boston, MA  02111-1307, USA</div><div class='del'>-</div><div class='del'>-     Everyone is permitted to copy and distribute verbatim copies</div><div class='del'>-     of this license document, but changing it is not allowed.</div><div class='del'>-</div><div class='del'>-  0. PREAMBLE</div><div class='del'>-</div><div class='del'>-     The purpose of this License is to make a manual, textbook, or other</div><div class='del'>-     functional and useful document "free" in the sense of freedom: to</div><div class='del'>-     assure everyone the effective freedom to copy and redistribute it,</div><div class='del'>-     with or without modifying it, either commercially or</div><div class='del'>-     noncommercially.  Secondarily, this License preserves for the</div><div class='del'>-     author and publisher a way to get credit for their work, while not</div><div class='del'>-     being considered responsible for modifications made by others.</div><div class='del'>-</div><div class='del'>-     This License is a kind of "copyleft", which means that derivative</div><div class='del'>-     works of the document must themselves be free in the same sense.</div><div class='del'>-     It complements the GNU General Public License, which is a copyleft</div><div class='del'>-     license designed for free software.</div><div class='del'>-</div><div class='del'>-     We have designed this License in order to use it for manuals for</div><div class='del'>-     free software, because free software needs free documentation: a</div><div class='del'>-     free program should come with manuals providing the same freedoms</div><div class='del'>-     that the software does.  But this License is not limited to</div><div class='del'>-     software manuals; it can be used for any textual work, regardless</div><div class='del'>-     of subject matter or whether it is published as a printed book.</div><div class='del'>-     We recommend this License principally for works whose purpose is</div><div class='del'>-     instruction or reference.</div><div class='del'>-</div><div class='del'>-  1. APPLICABILITY AND DEFINITIONS</div><div class='del'>-</div><div class='del'>-     This License applies to any manual or other work, in any medium,</div><div class='del'>-     that contains a notice placed by the copyright holder saying it</div><div class='del'>-     can be distributed under the terms of this License.  Such a notice</div><div class='del'>-     grants a world-wide, royalty-free license, unlimited in duration,</div><div class='del'>-     to use that work under the conditions stated herein.  The</div><div class='del'>-     "Document", below, refers to any such manual or work.  Any member</div><div class='del'>-     of the public is a licensee, and is addressed as "you".  You</div><div class='del'>-     accept the license if you copy, modify or distribute the work in a</div><div class='del'>-     way requiring permission under copyright law.</div><div class='del'>-</div><div class='del'>-     A "Modified Version" of the Document means any work containing the</div><div class='del'>-     Document or a portion of it, either copied verbatim, or with</div><div class='del'>-     modifications and/or translated into another language.</div><div class='del'>-</div><div class='del'>-     A "Secondary Section" is a named appendix or a front-matter section</div><div class='del'>-     of the Document that deals exclusively with the relationship of the</div><div class='del'>-     publishers or authors of the Document to the Document's overall</div><div class='del'>-     subject (or to related matters) and contains nothing that could</div><div class='del'>-     fall directly within that overall subject.  (Thus, if the Document</div><div class='del'>-     is in part a textbook of mathematics, a Secondary Section may not</div><div class='del'>-     explain any mathematics.)  The relationship could be a matter of</div><div class='del'>-     historical connection with the subject or with related matters, or</div><div class='del'>-     of legal, commercial, philosophical, ethical or political position</div><div class='del'>-     regarding them.</div><div class='del'>-</div><div class='del'>-     The "Invariant Sections" are certain Secondary Sections whose</div><div class='del'>-     titles are designated, as being those of Invariant Sections, in</div><div class='del'>-     the notice that says that the Document is released under this</div><div class='del'>-     License.  If a section does not fit the above definition of</div><div class='del'>-     Secondary then it is not allowed to be designated as Invariant.</div><div class='del'>-     The Document may contain zero Invariant Sections.  If the Document</div><div class='del'>-     does not identify any Invariant Sections then there are none.</div><div class='del'>-</div><div class='del'>-     The "Cover Texts" are certain short passages of text that are</div><div class='del'>-     listed, as Front-Cover Texts or Back-Cover Texts, in the notice</div><div class='del'>-     that says that the Document is released under this License.  A</div><div class='del'>-     Front-Cover Text may be at most 5 words, and a Back-Cover Text may</div><div class='del'>-     be at most 25 words.</div><div class='del'>-</div><div class='del'>-     A "Transparent" copy of the Document means a machine-readable copy,</div><div class='del'>-     represented in a format whose specification is available to the</div><div class='del'>-     general public, that is suitable for revising the document</div><div class='del'>-     straightforwardly with generic text editors or (for images</div><div class='del'>-     composed of pixels) generic paint programs or (for drawings) some</div><div class='del'>-     widely available drawing editor, and that is suitable for input to</div><div class='del'>-     text formatters or for automatic translation to a variety of</div><div class='del'>-     formats suitable for input to text formatters.  A copy made in an</div><div class='del'>-     otherwise Transparent file format whose markup, or absence of</div><div class='del'>-     markup, has been arranged to thwart or discourage subsequent</div><div class='del'>-     modification by readers is not Transparent.  An image format is</div><div class='del'>-     not Transparent if used for any substantial amount of text.  A</div><div class='del'>-     copy that is not "Transparent" is called "Opaque".</div><div class='del'>-</div><div class='del'>-     Examples of suitable formats for Transparent copies include plain</div><div class='del'>-     ASCII without markup, Texinfo input format, LaTeX input format,</div><div class='del'>-     SGML or XML using a publicly available DTD, and</div><div class='del'>-     standard-conforming simple HTML, PostScript or PDF designed for</div><div class='del'>-     human modification.  Examples of transparent image formats include</div><div class='del'>-     PNG, XCF and JPG.  Opaque formats include proprietary formats that</div><div class='del'>-     can be read and edited only by proprietary word processors, SGML or</div><div class='del'>-     XML for which the DTD and/or processing tools are not generally</div><div class='del'>-     available, and the machine-generated HTML, PostScript or PDF</div><div class='del'>-     produced by some word processors for output purposes only.</div><div class='del'>-</div><div class='del'>-     The "Title Page" means, for a printed book, the title page itself,</div><div class='del'>-     plus such following pages as are needed to hold, legibly, the</div><div class='del'>-     material this License requires to appear in the title page.  For</div><div class='del'>-     works in formats which do not have any title page as such, "Title</div><div class='del'>-     Page" means the text near the most prominent appearance of the</div><div class='del'>-     work's title, preceding the beginning of the body of the text.</div><div class='del'>-</div><div class='del'>-     A section "Entitled XYZ" means a named subunit of the Document</div><div class='del'>-     whose title either is precisely XYZ or contains XYZ in parentheses</div><div class='del'>-     following text that translates XYZ in another language.  (Here XYZ</div><div class='del'>-     stands for a specific section name mentioned below, such as</div><div class='del'>-     "Acknowledgements", "Dedications", "Endorsements", or "History".)</div><div class='del'>-     To "Preserve the Title" of such a section when you modify the</div><div class='del'>-     Document means that it remains a section "Entitled XYZ" according</div><div class='del'>-     to this definition.</div><div class='del'>-</div><div class='del'>-     The Document may include Warranty Disclaimers next to the notice</div><div class='del'>-     which states that this License applies to the Document.  These</div><div class='del'>-     Warranty Disclaimers are considered to be included by reference in</div><div class='del'>-     this License, but only as regards disclaiming warranties: any other</div><div class='del'>-     implication that these Warranty Disclaimers may have is void and</div><div class='del'>-     has no effect on the meaning of this License.</div><div class='del'>-</div><div class='del'>-  2. VERBATIM COPYING</div><div class='del'>-</div><div class='del'>-     You may copy and distribute the Document in any medium, either</div><div class='del'>-     commercially or noncommercially, provided that this License, the</div><div class='del'>-     copyright notices, and the license notice saying this License</div><div class='del'>-     applies to the Document are reproduced in all copies, and that you</div><div class='del'>-     add no other conditions whatsoever to those of this License.  You</div><div class='del'>-     may not use technical measures to obstruct or control the reading</div><div class='del'>-     or further copying of the copies you make or distribute.  However,</div><div class='del'>-     you may accept compensation in exchange for copies.  If you</div><div class='del'>-     distribute a large enough number of copies you must also follow</div><div class='del'>-     the conditions in section 3.</div><div class='del'>-</div><div class='del'>-     You may also lend copies, under the same conditions stated above,</div><div class='del'>-     and you may publicly display copies.</div><div class='del'>-</div><div class='del'>-  3. COPYING IN QUANTITY</div><div class='del'>-</div><div class='del'>-     If you publish printed copies (or copies in media that commonly</div><div class='del'>-     have printed covers) of the Document, numbering more than 100, and</div><div class='del'>-     the Document's license notice requires Cover Texts, you must</div><div class='del'>-     enclose the copies in covers that carry, clearly and legibly, all</div><div class='del'>-     these Cover Texts: Front-Cover Texts on the front cover, and</div><div class='del'>-     Back-Cover Texts on the back cover.  Both covers must also clearly</div><div class='del'>-     and legibly identify you as the publisher of these copies.  The</div><div class='del'>-     front cover must present the full title with all words of the</div><div class='del'>-     title equally prominent and visible.  You may add other material</div><div class='del'>-     on the covers in addition.  Copying with changes limited to the</div><div class='del'>-     covers, as long as they preserve the title of the Document and</div><div class='del'>-     satisfy these conditions, can be treated as verbatim copying in</div><div class='del'>-     other respects.</div><div class='del'>-</div><div class='del'>-     If the required texts for either cover are too voluminous to fit</div><div class='del'>-     legibly, you should put the first ones listed (as many as fit</div><div class='del'>-     reasonably) on the actual cover, and continue the rest onto</div><div class='del'>-     adjacent pages.</div><div class='del'>-</div><div class='del'>-     If you publish or distribute Opaque copies of the Document</div><div class='del'>-     numbering more than 100, you must either include a</div><div class='del'>-     machine-readable Transparent copy along with each Opaque copy, or</div><div class='del'>-     state in or with each Opaque copy a computer-network location from</div><div class='del'>-     which the general network-using public has access to download</div><div class='del'>-     using public-standard network protocols a complete Transparent</div><div class='del'>-     copy of the Document, free of added material.  If you use the</div><div class='del'>-     latter option, you must take reasonably prudent steps, when you</div><div class='del'>-     begin distribution of Opaque copies in quantity, to ensure that</div><div class='del'>-     this Transparent copy will remain thus accessible at the stated</div><div class='del'>-     location until at least one year after the last time you</div><div class='del'>-     distribute an Opaque copy (directly or through your agents or</div><div class='del'>-     retailers) of that edition to the public.</div><div class='del'>-</div><div class='del'>-     It is requested, but not required, that you contact the authors of</div><div class='del'>-     the Document well before redistributing any large number of</div><div class='del'>-     copies, to give them a chance to provide you with an updated</div><div class='del'>-     version of the Document.</div><div class='del'>-</div><div class='del'>-  4. MODIFICATIONS</div><div class='del'>-</div><div class='del'>-     You may copy and distribute a Modified Version of the Document</div><div class='del'>-     under the conditions of sections 2 and 3 above, provided that you</div><div class='del'>-     release the Modified Version under precisely this License, with</div><div class='del'>-     the Modified Version filling the role of the Document, thus</div><div class='del'>-     licensing distribution and modification of the Modified Version to</div><div class='del'>-     whoever possesses a copy of it.  In addition, you must do these</div><div class='del'>-     things in the Modified Version:</div><div class='del'>-</div><div class='del'>-       A. Use in the Title Page (and on the covers, if any) a title</div><div class='del'>-          distinct from that of the Document, and from those of</div><div class='del'>-          previous versions (which should, if there were any, be listed</div><div class='del'>-          in the History section of the Document).  You may use the</div><div class='del'>-          same title as a previous version if the original publisher of</div><div class='del'>-          that version gives permission.</div><div class='del'>-</div><div class='del'>-       B. List on the Title Page, as authors, one or more persons or</div><div class='del'>-          entities responsible for authorship of the modifications in</div><div class='del'>-          the Modified Version, together with at least five of the</div><div class='del'>-          principal authors of the Document (all of its principal</div><div class='del'>-          authors, if it has fewer than five), unless they release you</div><div class='del'>-          from this requirement.</div><div class='del'>-</div><div class='del'>-       C. State on the Title page the name of the publisher of the</div><div class='del'>-          Modified Version, as the publisher.</div><div class='del'>-</div><div class='del'>-       D. Preserve all the copyright notices of the Document.</div><div class='del'>-</div><div class='del'>-       E. Add an appropriate copyright notice for your modifications</div><div class='del'>-          adjacent to the other copyright notices.</div><div class='del'>-</div><div class='del'>-       F. Include, immediately after the copyright notices, a license</div><div class='del'>-          notice giving the public permission to use the Modified</div><div class='del'>-          Version under the terms of this License, in the form shown in</div><div class='del'>-          the Addendum below.</div><div class='del'>-</div><div class='del'>-       G. Preserve in that license notice the full lists of Invariant</div><div class='del'>-          Sections and required Cover Texts given in the Document's</div><div class='del'>-          license notice.</div><div class='del'>-</div><div class='del'>-       H. Include an unaltered copy of this License.</div><div class='del'>-</div><div class='del'>-       I. Preserve the section Entitled "History", Preserve its Title,</div><div class='del'>-          and add to it an item stating at least the title, year, new</div><div class='del'>-          authors, and publisher of the Modified Version as given on</div><div class='del'>-          the Title Page.  If there is no section Entitled "History" in</div><div class='del'>-          the Document, create one stating the title, year, authors,</div><div class='del'>-          and publisher of the Document as given on its Title Page,</div><div class='del'>-          then add an item describing the Modified Version as stated in</div><div class='del'>-          the previous sentence.</div><div class='del'>-</div><div class='del'>-       J. Preserve the network location, if any, given in the Document</div><div class='del'>-          for public access to a Transparent copy of the Document, and</div><div class='del'>-          likewise the network locations given in the Document for</div><div class='del'>-          previous versions it was based on.  These may be placed in</div><div class='del'>-          the "History" section.  You may omit a network location for a</div><div class='del'>-          work that was published at least four years before the</div><div class='del'>-          Document itself, or if the original publisher of the version</div><div class='del'>-          it refers to gives permission.</div><div class='del'>-</div><div class='del'>-       K. For any section Entitled "Acknowledgements" or "Dedications",</div><div class='del'>-          Preserve the Title of the section, and preserve in the</div><div class='del'>-          section all the substance and tone of each of the contributor</div><div class='del'>-          acknowledgements and/or dedications given therein.</div><div class='del'>-</div><div class='del'>-       L. Preserve all the Invariant Sections of the Document,</div><div class='del'>-          unaltered in their text and in their titles.  Section numbers</div><div class='del'>-          or the equivalent are not considered part of the section</div><div class='del'>-          titles.</div><div class='del'>-</div><div class='del'>-       M. Delete any section Entitled "Endorsements".  Such a section</div><div class='del'>-          may not be included in the Modified Version.</div><div class='del'>-</div><div class='del'>-       N. Do not retitle any existing section to be Entitled</div><div class='del'>-          "Endorsements" or to conflict in title with any Invariant</div><div class='del'>-          Section.</div><div class='del'>-</div><div class='del'>-       O. Preserve any Warranty Disclaimers.</div><div class='del'>-</div><div class='del'>-     If the Modified Version includes new front-matter sections or</div><div class='del'>-     appendices that qualify as Secondary Sections and contain no</div><div class='del'>-     material copied from the Document, you may at your option</div><div class='del'>-     designate some or all of these sections as invariant.  To do this,</div><div class='del'>-     add their titles to the list of Invariant Sections in the Modified</div><div class='del'>-     Version's license notice.  These titles must be distinct from any</div><div class='del'>-     other section titles.</div><div class='del'>-</div><div class='del'>-     You may add a section Entitled "Endorsements", provided it contains</div><div class='del'>-     nothing but endorsements of your Modified Version by various</div><div class='del'>-     parties--for example, statements of peer review or that the text</div><div class='del'>-     has been approved by an organization as the authoritative</div><div class='del'>-     definition of a standard.</div><div class='del'>-</div><div class='del'>-     You may add a passage of up to five words as a Front-Cover Text,</div><div class='del'>-     and a passage of up to 25 words as a Back-Cover Text, to the end</div><div class='del'>-     of the list of Cover Texts in the Modified Version.  Only one</div><div class='del'>-     passage of Front-Cover Text and one of Back-Cover Text may be</div><div class='del'>-     added by (or through arrangements made by) any one entity.  If the</div><div class='del'>-     Document already includes a cover text for the same cover,</div><div class='del'>-     previously added by you or by arrangement made by the same entity</div><div class='del'>-     you are acting on behalf of, you may not add another; but you may</div><div class='del'>-     replace the old one, on explicit permission from the previous</div><div class='del'>-     publisher that added the old one.</div><div class='del'>-</div><div class='del'>-     The author(s) and publisher(s) of the Document do not by this</div><div class='del'>-     License give permission to use their names for publicity for or to</div><div class='del'>-     assert or imply endorsement of any Modified Version.</div><div class='del'>-</div><div class='del'>-  5. COMBINING DOCUMENTS</div><div class='del'>-</div><div class='del'>-     You may combine the Document with other documents released under</div><div class='del'>-     this License, under the terms defined in section 4 above for</div><div class='del'>-     modified versions, provided that you include in the combination</div><div class='del'>-     all of the Invariant Sections of all of the original documents,</div><div class='del'>-     unmodified, and list them all as Invariant Sections of your</div><div class='del'>-     combined work in its license notice, and that you preserve all</div><div class='del'>-     their Warranty Disclaimers.</div><div class='del'>-</div><div class='del'>-     The combined work need only contain one copy of this License, and</div><div class='del'>-     multiple identical Invariant Sections may be replaced with a single</div><div class='del'>-     copy.  If there are multiple Invariant Sections with the same name</div><div class='del'>-     but different contents, make the title of each such section unique</div><div class='del'>-     by adding at the end of it, in parentheses, the name of the</div><div class='del'>-     original author or publisher of that section if known, or else a</div><div class='del'>-     unique number.  Make the same adjustment to the section titles in</div><div class='del'>-     the list of Invariant Sections in the license notice of the</div><div class='del'>-     combined work.</div><div class='del'>-</div><div class='del'>-     In the combination, you must combine any sections Entitled</div><div class='del'>-     "History" in the various original documents, forming one section</div><div class='del'>-     Entitled "History"; likewise combine any sections Entitled</div><div class='del'>-     "Acknowledgements", and any sections Entitled "Dedications".  You</div><div class='del'>-     must delete all sections Entitled "Endorsements."</div><div class='del'>-</div><div class='del'>-  6. COLLECTIONS OF DOCUMENTS</div><div class='del'>-</div><div class='del'>-     You may make a collection consisting of the Document and other</div><div class='del'>-     documents released under this License, and replace the individual</div><div class='del'>-     copies of this License in the various documents with a single copy</div><div class='del'>-     that is included in the collection, provided that you follow the</div><div class='del'>-     rules of this License for verbatim copying of each of the</div><div class='del'>-     documents in all other respects.</div><div class='del'>-</div><div class='del'>-     You may extract a single document from such a collection, and</div><div class='del'>-     distribute it individually under this License, provided you insert</div><div class='del'>-     a copy of this License into the extracted document, and follow</div><div class='del'>-     this License in all other respects regarding verbatim copying of</div><div class='del'>-     that document.</div><div class='del'>-</div><div class='del'>-  7. AGGREGATION WITH INDEPENDENT WORKS</div><div class='del'>-</div><div class='del'>-     A compilation of the Document or its derivatives with other</div><div class='del'>-     separate and independent documents or works, in or on a volume of</div><div class='del'>-     a storage or distribution medium, is called an "aggregate" if the</div><div class='del'>-     copyright resulting from the compilation is not used to limit the</div><div class='del'>-     legal rights of the compilation's users beyond what the individual</div><div class='del'>-     works permit.  When the Document is included in an aggregate, this</div><div class='del'>-     License does not apply to the other works in the aggregate which</div><div class='del'>-     are not themselves derivative works of the Document.</div><div class='del'>-</div><div class='del'>-     If the Cover Text requirement of section 3 is applicable to these</div><div class='del'>-     copies of the Document, then if the Document is less than one half</div><div class='del'>-     of the entire aggregate, the Document's Cover Texts may be placed</div><div class='del'>-     on covers that bracket the Document within the aggregate, or the</div><div class='del'>-     electronic equivalent of covers if the Document is in electronic</div><div class='del'>-     form.  Otherwise they must appear on printed covers that bracket</div><div class='del'>-     the whole aggregate.</div><div class='del'>-</div><div class='del'>-  8. TRANSLATION</div><div class='del'>-</div><div class='del'>-     Translation is considered a kind of modification, so you may</div><div class='del'>-     distribute translations of the Document under the terms of section</div><div class='del'>-     4.  Replacing Invariant Sections with translations requires special</div><div class='del'>-     permission from their copyright holders, but you may include</div><div class='del'>-     translations of some or all Invariant Sections in addition to the</div><div class='del'>-     original versions of these Invariant Sections.  You may include a</div><div class='del'>-     translation of this License, and all the license notices in the</div><div class='del'>-     Document, and any Warranty Disclaimers, provided that you also</div><div class='del'>-     include the original English version of this License and the</div><div class='del'>-     original versions of those notices and disclaimers.  In case of a</div><div class='del'>-     disagreement between the translation and the original version of</div><div class='del'>-     this License or a notice or disclaimer, the original version will</div><div class='del'>-     prevail.</div><div class='del'>-</div><div class='del'>-     If a section in the Document is Entitled "Acknowledgements",</div><div class='del'>-     "Dedications", or "History", the requirement (section 4) to</div><div class='del'>-     Preserve its Title (section 1) will typically require changing the</div><div class='del'>-     actual title.</div><div class='del'>-</div><div class='del'>-  9. TERMINATION</div><div class='del'>-</div><div class='del'>-     You may not copy, modify, sublicense, or distribute the Document</div><div class='del'>-     except as expressly provided for under this License.  Any other</div><div class='del'>-     attempt to copy, modify, sublicense or distribute the Document is</div><div class='del'>-     void, and will automatically terminate your rights under this</div><div class='del'>-     License.  However, parties who have received copies, or rights,</div><div class='del'>-     from you under this License will not have their licenses</div><div class='del'>-     terminated so long as such parties remain in full compliance.</div><div class='del'>-</div><div class='del'>- 10. FUTURE REVISIONS OF THIS LICENSE</div><div class='del'>-</div><div class='del'>-     The Free Software Foundation may publish new, revised versions of</div><div class='del'>-     the GNU Free Documentation License from time to time.  Such new</div><div class='del'>-     versions will be similar in spirit to the present version, but may</div><div class='del'>-     differ in detail to address new problems or concerns.  See</div><div class='del'>-     `http://www.gnu.org/copyleft/'.</div><div class='del'>-</div><div class='del'>-     Each version of the License is given a distinguishing version</div><div class='del'>-     number.  If the Document specifies that a particular numbered</div><div class='del'>-     version of this License "or any later version" applies to it, you</div><div class='del'>-     have the option of following the terms and conditions either of</div><div class='del'>-     that specified version or of any later version that has been</div><div class='del'>-     published (not as a draft) by the Free Software Foundation.  If</div><div class='del'>-     the Document does not specify a version number of this License,</div><div class='del'>-     you may choose any version ever published (not as a draft) by the</div><div class='del'>-     Free Software Foundation.</div><div class='del'>-</div><div class='del'>-A.0.1 ADDENDUM: How to use this License for your documents</div><div class='del'>-----------------------------------------------------------</div><div class='del'>-</div><div class='del'>-To use this License in a document you have written, include a copy of</div><div class='del'>-the License in the document and put the following copyright and license</div><div class='del'>-notices just after the title page:</div><div class='del'>-</div><div class='del'>-       Copyright (C)  YEAR  YOUR NAME.</div><div class='del'>-       Permission is granted to copy, distribute and/or modify this document</div><div class='del'>-       under the terms of the GNU Free Documentation License, Version 1.2</div><div class='del'>-       or any later version published by the Free Software Foundation;</div><div class='del'>-       with no Invariant Sections, no Front-Cover Texts, and no Back-Cover</div><div class='del'>-       Texts.  A copy of the license is included in the section entitled ``GNU</div><div class='del'>-       Free Documentation License''.</div><div class='del'>-</div><div class='del'>-   If you have Invariant Sections, Front-Cover Texts and Back-Cover</div><div class='del'>-Texts, replace the "with...Texts." line with this:</div><div class='del'>-</div><div class='del'>-         with the Invariant Sections being LIST THEIR TITLES, with</div><div class='del'>-         the Front-Cover Texts being LIST, and with the Back-Cover Texts</div><div class='del'>-         being LIST.</div><div class='del'>-</div><div class='del'>-   If you have Invariant Sections without Cover Texts, or some other</div><div class='del'>-combination of the three, merge those two alternatives to suit the</div><div class='del'>-situation.</div><div class='del'>-</div><div class='del'>-   If your document contains nontrivial examples of program code, we</div><div class='del'>-recommend releasing these examples in parallel under your choice of</div><div class='del'>-free software license, such as the GNU General Public License, to</div><div class='del'>-permit their use in free software.</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-File: user-guide.info,  Node: Index,  Prev: GNU Free Documentation Licence,  Up: Top</div><div class='del'>-</div><div class='del'>-Index</div><div class='del'>-*****</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-* Menu:</div><div class='del'>-</div><div class='del'>-* alu (scheduler):                       Unify.               (line  49)</div><div class='del'>-* AppArmour:                             Troubleshooting.     (line  96)</div><div class='del'>-* arch:                                  Getting GlusterFS.   (line   6)</div><div class='del'>-* booster:                               Booster.             (line   6)</div><div class='del'>-* commercial support:                    Introduction.        (line  36)</div><div class='del'>-* DNS round robin:                       Transport modules.   (line  29)</div><div class='del'>-* fcntl:                                 POSIX Locks.         (line   6)</div><div class='del'>-* FDL, GNU Free Documentation License:   GNU Free Documentation Licence.</div><div class='del'>-                                                              (line   6)</div><div class='del'>-* fixed-id (translator):                 Fixed ID.            (line   6)</div><div class='del'>-* GlusterFS client:                      Client.              (line   6)</div><div class='del'>-* GlusterFS mailing list:                Introduction.        (line  28)</div><div class='del'>-* GlusterFS server:                      Server.              (line   6)</div><div class='del'>-* infiniband transport:                  Transport modules.   (line  58)</div><div class='del'>-* InfiniBand, installation:              Pre requisites.      (line  51)</div><div class='del'>-* io-cache (translator):                 IO Cache.            (line   6)</div><div class='del'>-* io-threads (translator):               IO Threads.          (line   6)</div><div class='del'>-* IRC channel, #gluster:                 Introduction.        (line  31)</div><div class='del'>-* libibverbs:                            Pre requisites.      (line  51)</div><div class='del'>-* namespace:                             Unify.               (line 207)</div><div class='del'>-* nufa (scheduler):                      Unify.               (line 175)</div><div class='del'>-* OpenSuSE:                              Troubleshooting.     (line  96)</div><div class='del'>-* posix-locks (translator):              POSIX Locks.         (line   6)</div><div class='del'>-* random (scheduler):                    Unify.               (line 159)</div><div class='del'>-* read-ahead (translator):               Read Ahead.          (line   6)</div><div class='del'>-* record locking:                        POSIX Locks.         (line   6)</div><div class='del'>-* Redhat Enterprise Linux:               Troubleshooting.     (line  78)</div><div class='del'>-* Replicate:                             Replicate.           (line   6)</div><div class='del'>-* rot-13 (translator):                   ROT-13.              (line   6)</div><div class='del'>-* rr (scheduler):                        Unify.               (line 138)</div><div class='del'>-* scheduler (unify):                     Unify.               (line   6)</div><div class='del'>-* self heal (replicate):                 Replicate.           (line  46)</div><div class='del'>-* self heal (unify):                     Unify.               (line 223)</div><div class='del'>-* stripe (translator):                   Stripe.              (line   6)</div><div class='del'>-* trace (translator):                    Trace.               (line   6)</div><div class='del'>-* unify (translator):                    Unify.               (line   6)</div><div class='del'>-* unify invariants:                      Unify.               (line  16)</div><div class='del'>-* write-behind (translator):             Write Behind.        (line   6)</div><div class='del'>-* Gluster, Inc.:                      Introduction.        (line  36)</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-Tag Table:</div><div class='del'>-Node: Top704</div><div class='del'>-Node: Acknowledgements2304</div><div class='del'>-Node: Introduction3214</div><div class='del'>-Node: Installation and Invocation4649</div><div class='del'>-Node: Pre requisites4933</div><div class='del'>-Node: Getting GlusterFS7023</div><div class='del'>-Ref: Getting GlusterFS-Footnote-17809</div><div class='del'>-Node: Building7857</div><div class='del'>-Node: Running GlusterFS9559</div><div class='del'>-Node: Server9770</div><div class='del'>-Node: Client11358</div><div class='del'>-Node: A Tutorial Introduction13564</div><div class='del'>-Node: Concepts17101</div><div class='del'>-Node: Filesystems in Userspace17316</div><div class='del'>-Node: Translator18457</div><div class='del'>-Node: Volume specification file21160</div><div class='del'>-Node: Translators23632</div><div class='del'>-Node: Storage Translators24201</div><div class='del'>-Ref: Storage Translators-Footnote-125008</div><div class='del'>-Node: POSIX25142</div><div class='del'>-Node: BDB25765</div><div class='del'>-Node: Client and Server Translators26822</div><div class='del'>-Node: Transport modules27298</div><div class='del'>-Node: Client protocol31445</div><div class='del'>-Node: Server protocol32384</div><div class='del'>-Node: Clustering Translators33373</div><div class='del'>-Node: Unify34260</div><div class='del'>-Ref: Unify-Footnote-143859</div><div class='del'>-Node: Replicate43951</div><div class='del'>-Node: Stripe49006</div><div class='del'>-Node: Performance Translators50164</div><div class='del'>-Node: Read Ahead50438</div><div class='del'>-Node: Write Behind52170</div><div class='del'>-Node: IO Threads53579</div><div class='del'>-Node: IO Cache54367</div><div class='del'>-Node: Booster55691</div><div class='del'>-Node: Features Translators57105</div><div class='del'>-Node: POSIX Locks57333</div><div class='del'>-Node: Fixed ID58650</div><div class='del'>-Node: Miscellaneous Translators59136</div><div class='del'>-Node: ROT-1359334</div><div class='del'>-Node: Trace60013</div><div class='del'>-Node: Usage Scenarios61282</div><div class='del'>-Ref: Usage Scenarios-Footnote-167215</div><div class='del'>-Node: Troubleshooting67290</div><div class='del'>-Node: GNU Free Documentation Licence73638</div><div class='del'>-Node: Index96087</div><div class='del'>-</div><div class='del'>-End Tag Table</div><div class='head'>diff --git a/doc/user-guide/user-guide.pdf b/doc/user-guide/user-guide.pdf<br/>deleted file mode 100644<br/>index ed7bd2a9907..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/doc/user-guide/user-guide.pdf?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>doc/user-guide/user-guide.pdf</a><br/>+++ /dev/null</div>Binary files differ<div class='head'>diff --git a/doc/user-guide/user-guide.texi b/doc/user-guide/user-guide.texi<br/>deleted file mode 100644<br/>index 9dce15be413..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/doc/user-guide/user-guide.texi?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>doc/user-guide/user-guide.texi</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,2246 +0,0 @@</div><div class='del'>-\input texinfo</div><div class='del'>-@setfilename user-guide.info</div><div class='del'>-@settitle GlusterFS 2.0 User Guide</div><div class='del'>-@afourpaper</div><div class='del'>-</div><div class='del'>-@direntry</div><div class='del'>-* GlusterFS: (user-guide). GlusterFS distributed filesystem user guide</div><div class='del'>-@end direntry</div><div class='del'>-</div><div class='del'>-@copying</div><div class='del'>-This is the user manual for GlusterFS 2.0.</div><div class='del'>-</div><div class='del'>-Copyright @copyright{} 2007-2009 @email{@b{Gluster}} , Inc. Permission is granted to</div><div class='del'>-copy, distribute and/or modify this document under the terms of the</div><div class='del'>-@acronym{GNU} Free Documentation License, Version 1.2 or any later</div><div class='del'>-version published by the Free Software Foundation; with no Invariant</div><div class='del'>-Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the</div><div class='del'>-license is included in the chapter entitled ``@acronym{GNU} Free</div><div class='del'>-Documentation License''.</div><div class='del'>-@end copying</div><div class='del'>-</div><div class='del'>-@titlepage</div><div class='del'>-@title GlusterFS 2.0 User Guide [DRAFT]</div><div class='del'>-@subtitle January 15, 2008</div><div class='del'>-@author http://gluster.org/core-team.php</div><div class='del'>-@author @email{@b{Gluster}} </div><div class='del'>-@page</div><div class='del'>-@vskip 0pt plus 1filll</div><div class='del'>-@insertcopying</div><div class='del'>-@end titlepage</div><div class='del'>-</div><div class='del'>-@c Info stuff</div><div class='del'>-@ifnottex</div><div class='del'>-@node Top</div><div class='del'>-@top GlusterFS 2.0 User Guide</div><div class='del'>-</div><div class='del'>-@insertcopying</div><div class='del'>-@menu</div><div class='del'>-* Acknowledgements::            </div><div class='del'>-* Introduction::                </div><div class='del'>-* Installation and Invocation::  </div><div class='del'>-* Concepts::                    </div><div class='del'>-* Translators::                 </div><div class='del'>-* Usage Scenarios::             </div><div class='del'>-* Troubleshooting::             </div><div class='del'>-* GNU Free Documentation Licence::  </div><div class='del'>-* Index::                       </div><div class='del'>-</div><div class='del'>-@detailmenu</div><div class='del'>- --- The Detailed Node Listing ---</div><div class='del'>-</div><div class='del'>-Installation and Invocation</div><div class='del'>-</div><div class='del'>-* Pre requisites::              </div><div class='del'>-* Getting GlusterFS::           </div><div class='del'>-* Building::                    </div><div class='del'>-* Running GlusterFS::           </div><div class='del'>-* A Tutorial Introduction::     </div><div class='del'>-</div><div class='del'>-Running GlusterFS</div><div class='del'>-</div><div class='del'>-* Server::                      </div><div class='del'>-* Client::                      </div><div class='del'>-</div><div class='del'>-Concepts</div><div class='del'>-</div><div class='del'>-* Filesystems in Userspace::                </div><div class='del'>-* Translator::                  </div><div class='del'>-* Volume specification file::   </div><div class='del'>-</div><div class='del'>-Translators</div><div class='del'>-</div><div class='del'>-* Storage Translators::         </div><div class='del'>-* Client and Server Translators::  </div><div class='del'>-* Clustering Translators::      </div><div class='del'>-* Performance Translators::     </div><div class='del'>-* Features Translators::        </div><div class='del'>-</div><div class='del'>-Storage Translators</div><div class='del'>-</div><div class='del'>-* POSIX::        </div><div class='del'>-</div><div class='del'>-Client and Server Translators</div><div class='del'>-</div><div class='del'>-* Transport modules::           </div><div class='del'>-* Client protocol::             </div><div class='del'>-* Server protocol::             </div><div class='del'>-</div><div class='del'>-Clustering Translators</div><div class='del'>-</div><div class='del'>-* Unify::                       </div><div class='del'>-* Replicate::  </div><div class='del'>-* Stripe::                      </div><div class='del'>-</div><div class='del'>-Performance Translators</div><div class='del'>-</div><div class='del'>-* Read Ahead::                  </div><div class='del'>-* Write Behind::                </div><div class='del'>-* IO Threads::                  </div><div class='del'>-* IO Cache::                    </div><div class='del'>-</div><div class='del'>-Features Translators </div><div class='del'>-</div><div class='del'>-* POSIX Locks::                 </div><div class='del'>-* Fixed ID::                    </div><div class='del'>-</div><div class='del'>-Miscellaneous Translators</div><div class='del'>-</div><div class='del'>-* ROT-13::                      </div><div class='del'>-* Trace::                       </div><div class='del'>-</div><div class='del'>-@end detailmenu</div><div class='del'>-@end menu</div><div class='del'>-</div><div class='del'>-@end ifnottex</div><div class='del'>-@c Info stuff end</div><div class='del'>-</div><div class='del'>-@contents</div><div class='del'>-</div><div class='del'>-@node Acknowledgements</div><div class='del'>-@unnumbered Acknowledgements</div><div class='del'>-GlusterFS continues to be a wonderful and enriching experience for all</div><div class='del'>-of us involved. </div><div class='del'>-</div><div class='del'>-GlusterFS development would not have been possible at this pace if</div><div class='del'>-not for our enthusiastic users. People from around the world have</div><div class='del'>-helped us with bug reports, performance numbers, and feature suggestions.</div><div class='del'>-A huge thanks to them all.</div><div class='del'>-</div><div class='del'>-Matthew Paine - for RPMs &amp; general enthu</div><div class='del'>-</div><div class='del'>-Leonardo Rodrigues de Mello - for DEBs</div><div class='del'>-</div><div class='del'>-Julian Perez &amp; Adam D'Auria - for multi-server tutorial</div><div class='del'>-</div><div class='del'>-Paul England - for HA spec</div><div class='del'>-</div><div class='del'>-Brent Nelson - for many bug reports</div><div class='del'>-</div><div class='del'>-Jacques Mattheij - for Europe mirror.</div><div class='del'>-</div><div class='del'>-Patrick Negri - for TCP non-blocking connect.</div><div class='del'>-@flushright</div><div class='del'>-http://gluster.org/core-team.php (@email{list-hacking@@gluster.com})</div><div class='del'>-@email{@b{Gluster}} </div><div class='del'>-@end flushright</div><div class='del'>-</div><div class='del'>-@node Introduction</div><div class='del'>-@chapter Introduction</div><div class='del'>-</div><div class='del'>-GlusterFS is a distributed filesystem. It works at the file level,</div><div class='del'>-not block level.</div><div class='del'>-</div><div class='del'>-A network filesystem is one which allows us to access remote files. A</div><div class='del'>-distributed filesystem is one that stores data on multiple machines</div><div class='del'>-and makes them all appear to be a part of the same filesystem.</div><div class='del'>-</div><div class='del'>-Need for distributed filesystems</div><div class='del'>-</div><div class='del'>-@itemize @bullet</div><div class='del'>-@item Scalability: A distributed filesystem allows us to store more data than what can be stored on a single machine.</div><div class='del'>-</div><div class='del'>-@item Redundancy: We might want to replicate crucial data on to several machines.</div><div class='del'>-</div><div class='del'>-@item Uniform access: One can mount a remote volume (for example your home directory) from any machine and access the same data.</div><div class='del'>-@end itemize</div><div class='del'>-</div><div class='del'>-@section Contacting us</div><div class='del'>-You can reach us through the mailing list @strong{gluster-devel} </div><div class='del'>-(@email{gluster-devel@@nongnu.org}).</div><div class='del'>-@cindex GlusterFS mailing list</div><div class='del'>-</div><div class='del'>-You can also find many of the developers on @acronym{IRC}, on the @code{#gluster}</div><div class='del'>-channel on Freenode (@indicateurl{irc.freenode.net}).</div><div class='del'>-@cindex IRC channel, #gluster</div><div class='del'>-</div><div class='del'>-The GlusterFS documentation wiki is also useful: @*</div><div class='del'>-@indicateurl{http://gluster.org/docs/index.php/GlusterFS}</div><div class='del'>-</div><div class='del'>-For commercial support, you can contact @email{@b{Gluster}} at:</div><div class='del'>-@cindex commercial support</div><div class='del'>-@cindex Gluster, Inc.</div><div class='del'>-</div><div class='del'>-@display</div><div class='del'>-3194 Winding Vista Common</div><div class='del'>-Fremont, CA 94539</div><div class='del'>-USA.</div><div class='del'>-</div><div class='del'>-Phone: +1 (510) 354 6801</div><div class='del'>-Toll free: +1 (888) 813 6309</div><div class='del'>-Fax: +1 (510) 372 0604</div><div class='del'>-@end display</div><div class='del'>-</div><div class='del'>-You can also email us at @email{support@@gluster.com}.</div><div class='del'>-</div><div class='del'>-@node Installation and Invocation</div><div class='del'>-@chapter Installation and Invocation</div><div class='del'>-</div><div class='del'>-@menu</div><div class='del'>-* Pre requisites::              </div><div class='del'>-* Getting GlusterFS::           </div><div class='del'>-* Building::                    </div><div class='del'>-* Running GlusterFS::           </div><div class='del'>-* A Tutorial Introduction::     </div><div class='del'>-@end menu</div><div class='del'>-</div><div class='del'>-@node Pre requisites</div><div class='del'>-@section Pre requisites</div><div class='del'>-</div><div class='del'>-Before installing GlusterFS make sure you have the</div><div class='del'>-following components installed.</div><div class='del'>-</div><div class='del'>-@subsection @acronym{FUSE}</div><div class='del'>-GlusterFS has now built-in support for the @acronym{FUSE} protocol.</div><div class='del'>-You need a kernel with @acronym{FUSE} support to mount GlusterFS.</div><div class='del'>-You do not need the @acronym{FUSE} package (library and utilities),</div><div class='del'>-but be aware of the following issues:</div><div class='del'>-</div><div class='del'>-@itemize</div><div class='del'>-@item If you want unprivileged users to be able to mount GlusterFS filesystems,</div><div class='del'>-you need a recent version of the @command{fusermount} utility. You already have</div><div class='del'>-it if you have @acronym{FUSE} version 2.7.0 or higher installed; if that's not</div><div class='del'>-the case, one will be compiled along with GlusterFS if you pass</div><div class='del'>-@command{--enable-fusermount} to the @command{configure} script.  @item You</div><div class='del'>-need to ensure @acronym{FUSE} support is configured properly on your system. In</div><div class='del'>-details:</div><div class='del'>-@itemize</div><div class='del'>-@item If your kernel has @acronym{FUSE} as a loadable module, make sure it's</div><div class='del'>-loaded.</div><div class='del'>-@item Create @command{/dev/fuse} (major 10, minor 229) either by means of udev</div><div class='del'>-rules or by hand.</div><div class='del'>-@item Optionally, if you want runtime control over your @acronym{FUSE} mounts,</div><div class='del'>-mount the fusectl auxiliary filesystem:</div><div class='del'>-</div><div class='del'>-@example</div><div class='del'>-# mount -t fusectl none /sys/fs/fuse/connections</div><div class='del'>-@end example</div><div class='del'>-@end itemize</div><div class='del'>-</div><div class='del'>-The @acronym{FUSE} packages shipped by the various distributions usually take care</div><div class='del'>-about these things, so the easiest way to get the above tasks handled is still</div><div class='del'>-installing the @acronym{FUSE} package(s).</div><div class='del'>-@end itemize</div><div class='del'>-</div><div class='del'>-To get the best performance from GlusterFS,it is recommended that you use</div><div class='del'>-our patched version of the @acronym{FUSE} kernel module. See Patched FUSE for details.</div><div class='del'>-</div><div class='del'>-@subsection Patched FUSE</div><div class='del'>-</div><div class='del'>-The GlusterFS project maintains a patched version of @acronym{FUSE} meant to be used </div><div class='del'>-with GlusterFS. The patches increase GlusterFS performance. It is recommended that</div><div class='del'>-all users use the patched @acronym{FUSE}.</div><div class='del'>-</div><div class='del'>-The patched @acronym{FUSE} tarball can be downloaded from:</div><div class='del'>-</div><div class='del'>-@indicateurl{ftp://ftp.gluster.com/pub/gluster/glusterfs/fuse/}</div><div class='del'>-</div><div class='del'>-The specific changes made to @acronym{FUSE} are:</div><div class='del'>-</div><div class='del'>-@itemize</div><div class='del'>-@item The communication channel size between @acronym{FUSE} kernel module and GlusterFS has been increased to 1MB, permitting large reads and writes to be sent in bigger chunks.</div><div class='del'>-</div><div class='del'>-@item The kernel's read-ahead boundry has been extended upto 1MB.</div><div class='del'>-</div><div class='del'>-@item Block size returned in the @command{stat()}/@command{fstat()} calls tuned to 1MB, to make cp and similar commands perform I/O using that block size.</div><div class='del'>-</div><div class='del'>-@item @command{flock()} locking support has been added (although some rework in GlusterFS is needed for perfect compliance).</div><div class='del'>-@end itemize</div><div class='del'>-</div><div class='del'>-@subsection libibverbs (optional)</div><div class='del'>-@cindex InfiniBand, installation</div><div class='del'>-@cindex libibverbs</div><div class='del'>-This is only needed if you want GlusterFS to use InfiniBand as the</div><div class='del'>-interconnect mechanism between server and client. You can get it from:</div><div class='del'>-</div><div class='del'>-@indicateurl{http://www.openfabrics.org/downloads.htm}.</div><div class='del'>-</div><div class='del'>-@subsection Bison and Flex</div><div class='del'>-These should be already installed on most Linux systems. If not, use your distribution's</div><div class='del'>-normal software installation procedures to install them. Make sure you install the</div><div class='del'>-relevant developer packages also.</div><div class='del'>-</div><div class='del'>-@node Getting GlusterFS</div><div class='del'>-@section Getting GlusterFS</div><div class='del'>-@cindex arch</div><div class='del'>-There are many ways to get hold of GlusterFS. For a production deployment,</div><div class='del'>-the recommended method is to download the latest release tarball.</div><div class='del'>-Release tarballs are available at: @indicateurl{http://gluster.org/download.php}.</div><div class='del'>-</div><div class='del'>-If you want the bleeding edge development source, you can get them</div><div class='del'>-from the Git</div><div class='del'>-@footnote{@indicateurl{http://git-scm.com}}</div><div class='del'>-repository. First you must install Git itself. Then</div><div class='del'>-you can check out the source</div><div class='del'>-</div><div class='del'>-@example</div><div class='del'>-$ git clone git://git.sv.gnu.org/gluster.git glusterfs</div><div class='del'>-@end example</div><div class='del'>-</div><div class='del'>-@node Building</div><div class='del'>-@section Building</div><div class='del'>-You can skip this section if you're installing from @acronym{RPM}s</div><div class='del'>-or @acronym{DEB}s.</div><div class='del'>-</div><div class='del'>-GlusterFS uses the Autotools mechanism to build. As such, the procedure</div><div class='del'>-is straight-forward. First, change into the GlusterFS source directory.</div><div class='del'>-</div><div class='del'>-@example</div><div class='del'>-$ cd glusterfs-&lt;version&gt;</div><div class='del'>-@end example</div><div class='del'>-</div><div class='del'>-If you checked out the source from the Arch repository, you'll need</div><div class='del'>-to run @command{./autogen.sh} first. Note that you'll need to have</div><div class='del'>-Autoconf and Automake installed for this. </div><div class='del'>-</div><div class='del'>-Run @command{configure}.</div><div class='del'>-</div><div class='del'>-@example</div><div class='del'>-$ ./configure</div><div class='del'>-@end example</div><div class='del'>-</div><div class='del'>-The configure script accepts the following options:</div><div class='del'>-</div><div class='del'>-@cartouche</div><div class='del'>-@table @code</div><div class='del'>-</div><div class='del'>-@item --disable-ibverbs</div><div class='del'>-Disable the InfiniBand transport mechanism.</div><div class='del'>-</div><div class='del'>-@item --disable-fuse-client</div><div class='del'>-Disable the @acronym{FUSE} client.</div><div class='del'>-</div><div class='del'>-@item --disable-server</div><div class='del'>-Disable building of the GlusterFS server.</div><div class='del'>-</div><div class='del'>-@item --disable-bdb</div><div class='del'>-Disable building of Berkeley DB based storage translator.</div><div class='del'>-</div><div class='del'>-@item --disable-mod_glusterfs</div><div class='del'>-Disable building of Apache/lighttpd glusterfs plugins.</div><div class='del'>-</div><div class='del'>-@item --disable-epoll</div><div class='del'>-Use poll instead of epoll.</div><div class='del'>-</div><div class='del'>-@item --disable-libglusterfsclient</div><div class='del'>-Disable building of libglusterfsclient</div><div class='del'>-</div><div class='del'>-@item --enable-fusermount</div><div class='del'>-Build fusermount</div><div class='del'>-</div><div class='del'>-@end table</div><div class='del'>-@end cartouche</div><div class='del'>-</div><div class='del'>-Build and install GlusterFS.</div><div class='del'>-</div><div class='del'>-@example</div><div class='del'>-# make install</div><div class='del'>-@end example</div><div class='del'>-</div><div class='del'>-The binaries (@command{glusterfsd} and @command{glusterfs}) will be by</div><div class='del'>-default installed in @command{/usr/local/sbin/}. Translator,</div><div class='del'>-scheduler, and transport shared libraries will be installed in</div><div class='del'>-@command{/usr/local/lib/glusterfs/&lt;version&gt;/}. Sample volume</div><div class='del'>-specification files will be in @command{/usr/local/etc/glusterfs/}.</div><div class='del'>-This document itself can be found in</div><div class='del'>-@command{/usr/local/share/doc/glusterfs/}. If you passed the @command{--prefix}</div><div class='del'>-argument to the configure script, then replace @command{/usr/local} in the preceding</div><div class='del'>-paths with the prefix.</div><div class='del'>-</div><div class='del'>-@node Running GlusterFS</div><div class='del'>-@section Running GlusterFS</div><div class='del'>-</div><div class='del'>-@menu</div><div class='del'>-* Server::                      </div><div class='del'>-* Client::                      </div><div class='del'>-@end menu</div><div class='del'>-</div><div class='del'>-@node Server</div><div class='del'>-@subsection Server</div><div class='del'>-@cindex GlusterFS server</div><div class='del'>-</div><div class='del'>-The GlusterFS server is necessary to export storage volumes to remote clients</div><div class='del'>-(See @ref{Server protocol} for more info). This section documents the invocation</div><div class='del'>-of the GlusterFS server program and all the command-line options accepted by it.</div><div class='del'>-</div><div class='del'>-@cartouche</div><div class='del'>-@table @code</div><div class='del'>-Basic Options</div><div class='del'>-@item -f, --volfile=&lt;path&gt;   </div><div class='del'>-      Use the volume file as the volume specification.</div><div class='del'>-</div><div class='del'>-@item -s, --volfile-server=&lt;hostname&gt;</div><div class='del'>-      Server to get volume file from. This option overrides --volfile option.</div><div class='del'>-</div><div class='del'>-@item -l, --log-file=&lt;path&gt;</div><div class='del'>-      Specify the path for the log file.</div><div class='del'>-</div><div class='del'>-@item -L, --log-level=&lt;level&gt;</div><div class='del'>-      Set the log level for the server. Log level should be one of @acronym{DEBUG}, </div><div class='del'>-@acronym{WARNING}, @acronym{ERROR}, @acronym{CRITICAL}, or @acronym{NONE}.</div><div class='del'>-</div><div class='del'>-Advanced Options</div><div class='del'>-@item --debug</div><div class='del'>-      Run in debug mode. This option sets --no-daemon, --log-level to DEBUG and</div><div class='del'>-      --log-file to console.</div><div class='del'>-</div><div class='del'>-@item  -N, --no-daemon            </div><div class='del'>-      Run glusterfsd as a foreground process.</div><div class='del'>-</div><div class='del'>-@item  -p, --pid-file=&lt;path&gt;      </div><div class='del'>-      Path for the @acronym{PID} file.</div><div class='del'>-</div><div class='del'>-@item --volfile-id=&lt;key&gt;</div><div class='del'>-      'key' of the volfile to be fetched from server.</div><div class='del'>-</div><div class='del'>-@item --volfile-server-port=&lt;port-number&gt;</div><div class='del'>-      Listening port number of volfile server.</div><div class='del'>-</div><div class='del'>-@item --volfile-server-transport=[socket|ib-verbs]</div><div class='del'>-      Transport type to get volfile from server. [default: @command{socket}]</div><div class='del'>-</div><div class='del'>-@item --xlator-options=&lt;volume-name.option=value&gt;</div><div class='del'>-      Add/override a translator option for a volume with specified value.</div><div class='del'>-</div><div class='del'>-Miscellaneous Options</div><div class='del'>-@item  -?, --help                 </div><div class='del'>-       Show this help text.</div><div class='del'>-</div><div class='del'>-@item  --usage                </div><div class='del'>-       Display a short usage message.</div><div class='del'>-</div><div class='del'>-@item  -V, --version              </div><div class='del'>-       Show version information.</div><div class='del'>-@end table</div><div class='del'>-@end cartouche</div><div class='del'>-</div><div class='del'>-@node Client</div><div class='del'>-@subsection Client</div><div class='del'>-@cindex GlusterFS client</div><div class='del'>-</div><div class='del'>-The GlusterFS client process is necessary to access remote storage volumes and</div><div class='del'>-mount them locally using @acronym{FUSE}. This section documents the invocation of the</div><div class='del'>-client process and all its command-line arguments.</div><div class='del'>-</div><div class='del'>-@example</div><div class='del'>-  # glusterfs [options] &lt;mountpoint&gt;</div><div class='del'>-@end example</div><div class='del'>-</div><div class='del'>-The @command{mountpoint} is the directory where you want the GlusterFS</div><div class='del'>-filesystem to appear. Example:</div><div class='del'>-</div><div class='del'>-@example</div><div class='del'>-  # glusterfs -f /usr/local/etc/glusterfs-client.vol /mnt</div><div class='del'>-@end example</div><div class='del'>-</div><div class='del'>-The command-line options are detailed below.</div><div class='del'>-</div><div class='del'>-@tex</div><div class='del'>-\vfill</div><div class='del'>-@end tex</div><div class='del'>-@page</div><div class='del'>-</div><div class='del'>-@cartouche</div><div class='del'>-@table @code</div><div class='del'>-</div><div class='del'>-Basic Options</div><div class='del'>-@item -f, --volfile=&lt;path&gt;   </div><div class='del'>-      Use the volume file as the volume specification.</div><div class='del'>-</div><div class='del'>-@item -s, --volfile-server=&lt;hostname&gt;</div><div class='del'>-      Server to get volume file from. This option overrides --volfile option.</div><div class='del'>-</div><div class='del'>-@item -l, --log-file=&lt;path&gt;</div><div class='del'>-      Specify the path for the log file.</div><div class='del'>-</div><div class='del'>-@item -L, --log-level=&lt;level&gt;</div><div class='del'>-      Set the log level for the server. Log level should be one of @acronym{DEBUG}, </div><div class='del'>-@acronym{WARNING}, @acronym{ERROR}, @acronym{CRITICAL}, or @acronym{NONE}.</div><div class='del'>-</div><div class='del'>-Advanced Options</div><div class='del'>-@item --debug</div><div class='del'>-      Run in debug mode. This option sets --no-daemon, --log-level to DEBUG and</div><div class='del'>-      --log-file to console.</div><div class='del'>-</div><div class='del'>-@item  -N, --no-daemon            </div><div class='del'>-      Run @command{glusterfs} as a foreground process.</div><div class='del'>-</div><div class='del'>-@item  -p, --pid-file=&lt;path&gt;      </div><div class='del'>-      Path for the @acronym{PID} file.</div><div class='del'>-</div><div class='del'>-@item --volfile-id=&lt;key&gt;</div><div class='del'>-      'key' of the volfile to be fetched from server.</div><div class='del'>-</div><div class='del'>-@item --volfile-server-port=&lt;port-number&gt;</div><div class='del'>-      Listening port number of volfile server.</div><div class='del'>-</div><div class='del'>-@item --volfile-server-transport=[socket|ib-verbs]</div><div class='del'>-      Transport type to get volfile from server. [default: @command{socket}]</div><div class='del'>-</div><div class='del'>-@item --xlator-options=&lt;volume-name.option=value&gt;</div><div class='del'>-      Add/override a translator option for a volume with specified value.</div><div class='del'>-</div><div class='del'>-@item  --volume-name=&lt;volume name&gt;</div><div class='del'>-      Volume name in client spec to use. Defaults to the root volume.</div><div class='del'>-</div><div class='del'>-@acronym{FUSE} Options</div><div class='del'>-@item  --attribute-timeout=&lt;n&gt;</div><div class='del'>-       Attribute timeout for inodes in the kernel, in seconds. Defaults to 1 second.</div><div class='del'>-</div><div class='del'>-@item  --disable-direct-io-mode</div><div class='del'>-       Disable direct @acronym{I/O} mode in @acronym{FUSE} kernel module. This is set</div><div class='del'>-       automatically if kernel supports big writes (&gt;= 2.6.26).</div><div class='del'>-</div><div class='del'>-@item  -e, --entry-timeout=&lt;n&gt;</div><div class='del'>-       Entry timeout for directory entries in the kernel, in seconds. </div><div class='del'>-       Defaults to 1 second.</div><div class='del'>-</div><div class='del'>-Missellaneous Options</div><div class='del'>-@item  -?, --help                 </div><div class='del'>-       Show this help information.</div><div class='del'>-</div><div class='del'>-@item  -V, --version              </div><div class='del'>-       Show version information.</div><div class='del'>-@end table</div><div class='del'>-@end cartouche</div><div class='del'>-</div><div class='del'>-@node A Tutorial Introduction</div><div class='del'>-@section A Tutorial Introduction</div><div class='del'>-</div><div class='del'>-This section will show you how to quickly get GlusterFS up and running. We'll </div><div class='del'>-configure GlusterFS as a simple network filesystem, with one server and one client.</div><div class='del'>-In this mode of usage, GlusterFS can serve as a replacement for NFS.</div><div class='del'>-</div><div class='del'>-We'll make use of two machines; call them @emph{server} and</div><div class='del'>-@emph{client} (If you don't want to setup two machines, just run</div><div class='del'>-everything that follows on the same machine).  In the examples that</div><div class='del'>-follow, the shell prompts will use these names to clarify the machine</div><div class='del'>-on which the command is being run. For example, a command that should</div><div class='del'>-be run on the server will be shown with the prompt:</div><div class='del'>-</div><div class='del'>-@example</div><div class='del'>-[root@@server]#</div><div class='del'>-@end example</div><div class='del'>-</div><div class='del'>-Our goal is to make a directory on the @emph{server} (say, @command{/export})</div><div class='del'>-accessible to the @emph{client}.</div><div class='del'>-</div><div class='del'>-First of all, get GlusterFS installed on both the machines, as described in the </div><div class='del'>-previous sections. Make sure you have the @acronym{FUSE} kernel module loaded. You</div><div class='del'>-can ensure this by running: </div><div class='del'>-</div><div class='del'>-@example</div><div class='del'>-[root@@server]# modprobe fuse</div><div class='del'>-@end example</div><div class='del'>-</div><div class='del'>-Before we can run the GlusterFS client or server programs, we need to write</div><div class='del'>-two files called @emph{volume specifications} (equivalently refered to as @emph{volfiles}). </div><div class='del'>-The volfile describes the @emph{translator tree} on a node. The next chapter will</div><div class='del'>-explain the concepts of `translator' and `volume specification' in detail. For now, </div><div class='del'>-just assume that the volfile is like an NFS @command{/etc/export} file.</div><div class='del'>-</div><div class='del'>-On the server, create a text file somewhere (we'll assume the path</div><div class='del'>-@command{/tmp/glusterfsd.vol}) with the following contents.</div><div class='del'>-</div><div class='del'>-@cartouche</div><div class='del'>-@example</div><div class='del'>-volume colon-o</div><div class='del'>-  type storage/posix</div><div class='del'>-  option directory /export</div><div class='del'>-end-volume</div><div class='del'>-</div><div class='del'>-volume server</div><div class='del'>-  type protocol/server</div><div class='del'>-  subvolumes colon-o</div><div class='del'>-  option transport-type tcp     </div><div class='del'>-  option auth.addr.colon-o.allow *</div><div class='del'>-end-volume</div><div class='del'>-@end example</div><div class='del'>-@end cartouche</div><div class='del'>-</div><div class='del'>-A brief explanation of the file's contents. The first section defines a storage</div><div class='del'>-volume, named ``colon-o'' (the volume names are arbitrary), which exports the</div><div class='del'>-@command{/export} directory. The second section defines options for the translator</div><div class='del'>-which will make the storage volume accessible remotely. It specifies @command{colon-o} as</div><div class='del'>-a subvolume. This defines the @emph{translator tree}, about which more will be said</div><div class='del'>-in the next chapter. The two options specify that the @acronym{TCP} protocol is to be</div><div class='del'>-used (as opposed to InfiniBand, for example), and that access to the storage volume</div><div class='del'>-is to be provided to clients with any @acronym{IP} address at all. If you wanted to</div><div class='del'>-restrict access to this server to only your subnet for example, you'd specify</div><div class='del'>-something like @command{192.168.1.*} in the second option line.</div><div class='del'>-</div><div class='del'>-On the client machine, create the following text file (again, we'll assume</div><div class='del'>-the path to be @command{/tmp/glusterfs-client.vol}). Replace</div><div class='del'>-@emph{server-ip-address} with the @acronym{IP} address of your server machine. If you</div><div class='del'>-are doing all this on a single machine, use @command{127.0.0.1}.</div><div class='del'>-</div><div class='del'>-@cartouche</div><div class='del'>-@example</div><div class='del'>-volume client</div><div class='del'>-  type protocol/client</div><div class='del'>-  option transport-type tcp</div><div class='del'>-  option remote-host @emph{server-ip-address}</div><div class='del'>-  option remote-subvolume colon-o</div><div class='del'>-end-volume</div><div class='del'>-@end example</div><div class='del'>-@end cartouche</div><div class='del'>-</div><div class='del'>-Now we need to start both the server and client programs. To start the server:</div><div class='del'>-</div><div class='del'>-@example</div><div class='del'>-[root@@server]# glusterfsd -f /tmp/glusterfs-server.vol</div><div class='del'>-@end example</div><div class='del'>-</div><div class='del'>-To start the client:</div><div class='del'>-</div><div class='del'>-@example</div><div class='del'>-[root@@client]# glusterfs -f /tmp/glusterfs-client.vol /mnt/glusterfs</div><div class='del'>-@end example</div><div class='del'>-</div><div class='del'>-You should now be able to see the files under the server's @command{/export} directory</div><div class='del'>-in the @command{/mnt/glusterfs} directory on the client. That's it; GlusterFS is now</div><div class='del'>-working as a network file system.</div><div class='del'>-</div><div class='del'>-@node Concepts</div><div class='del'>-@chapter Concepts</div><div class='del'>-</div><div class='del'>-@menu</div><div class='del'>-* Filesystems in Userspace::                </div><div class='del'>-* Translator::                  </div><div class='del'>-* Volume specification file::   </div><div class='del'>-@end menu</div><div class='del'>-</div><div class='del'>-@node Filesystems in Userspace</div><div class='del'>-@section Filesystems in Userspace</div><div class='del'>-</div><div class='del'>-A filesystem is usually implemented in kernel space. Kernel space</div><div class='del'>-development is much harder than userspace development. @acronym{FUSE}</div><div class='del'>-is a kernel module/library that allows us to write a filesystem</div><div class='del'>-completely in userspace.</div><div class='del'>-</div><div class='del'>-@acronym{FUSE} consists of a kernel module which interacts with the userspace</div><div class='del'>-implementation using a device file @code{/dev/fuse}. When a process </div><div class='del'>-makes a syscall on a @acronym{FUSE} filesystem, @acronym{VFS} hands the request to the</div><div class='del'>-@acronym{FUSE} module, which writes the request to @code{/dev/fuse}. The</div><div class='del'>-userspace implementation polls @code{/dev/fuse}, and when a request arrives,</div><div class='del'>-processes it and writes the result back to @code{/dev/fuse}. The kernel then</div><div class='del'>-reads from the device file and returns the result to the user process. </div><div class='del'>-</div><div class='del'>-In case of GlusterFS, the userspace program is the GlusterFS client.</div><div class='del'>-The control flow is shown in the diagram below. The GlusterFS client</div><div class='del'>-services the request by sending it to the server, which in turn </div><div class='del'>-hands it to the local @acronym{POSIX} filesystem.</div><div class='del'>-</div><div class='del'>-@center @image{fuse,44pc,,,.pdf}</div><div class='del'>-@center Fig 1. Control flow in GlusterFS</div><div class='del'>-</div><div class='del'>-@node Translator</div><div class='del'>-@section Translator</div><div class='del'>-</div><div class='del'>-The @emph{translator} is the most important concept in GlusterFS. In</div><div class='del'>-fact, GlusterFS is nothing but a collection of translators working</div><div class='del'>-together, forming a translator @emph{tree}.</div><div class='del'>-</div><div class='del'>-The idea of a translator is perhaps best understood using an</div><div class='del'>-analogy. Consider the @acronym{VFS} in the Linux kernel. The</div><div class='del'>-@acronym{VFS} abstracts the various filesystem implementations (such</div><div class='del'>-as @acronym{EXT3}, ReiserFS, @acronym{XFS}, etc.) supported by the</div><div class='del'>-kernel. When an application calls the kernel to perform an operation</div><div class='del'>-on a file, the kernel passes the request on to the appropriate</div><div class='del'>-filesystem implementation.</div><div class='del'>-</div><div class='del'>-For example, let's say there are two partitions on a Linux machine:</div><div class='del'>-@command{/}, which is an @acronym{EXT3} partition, and @command{/usr},</div><div class='del'>-which is a ReiserFS partition. Now if an application wants to open a</div><div class='del'>-file called, say, @command{/etc/fstab}, then the kernel will</div><div class='del'>-internally pass the request to the @acronym{EXT3} implementation.  If</div><div class='del'>-on the other hand, an application wants to read a file called</div><div class='del'>-@command{/usr/src/linux/CREDITS}, then the kernel will call upon the</div><div class='del'>-ReiserFS implementation to do the job.</div><div class='del'>-</div><div class='del'>-The ``filesystem implementation'' objects are analogous to GlusterFS</div><div class='del'>-translators. A GlusterFS translator implements all the filesystem</div><div class='del'>-operations.  Whereas in @acronym{VFS} there is a two-level tree (with</div><div class='del'>-the kernel at the root and all the filesystem implementation as its</div><div class='del'>-children), in GlusterFS there exists a more elaborate tree structure.</div><div class='del'>-</div><div class='del'>-We can now define translators more precisely. A GlusterFS translator</div><div class='del'>-is a shared object (@command{.so}) that implements every filesystem</div><div class='del'>-call. GlusterFS translators can be arranged in an arbitrary tree</div><div class='del'>-structure (subject to constraints imposed by the translators). When</div><div class='del'>-GlusterFS receives a filesystem call, it passes it on to the</div><div class='del'>-translator at the root of the translator tree. The root translator may</div><div class='del'>-in turn pass it on to any or all of its children, and so on, until the</div><div class='del'>-leaf nodes are reached. The result of a filesystem call is</div><div class='del'>-communicated in the reverse fashion, from the leaf nodes up to the</div><div class='del'>-root node, and then on to the application.</div><div class='del'>-</div><div class='del'>-So what might a translator tree look like?</div><div class='del'>-</div><div class='del'>-@tex</div><div class='del'>-\vfill</div><div class='del'>-@end tex</div><div class='del'>-@page</div><div class='del'>-</div><div class='del'>-@center @image{xlator,44pc,,,.pdf}</div><div class='del'>-@center Fig 2. A sample translator tree</div><div class='del'>-</div><div class='del'>-The diagram depicts three servers and one GlusterFS client. It is important</div><div class='del'>-to note that conceptually, the translator tree spans machine boundaries.</div><div class='del'>-Thus, the client machine in the diagram, @command{10.0.0.1}, can access</div><div class='del'>-the aggregated storage of the filesystems on the server machines @command{10.0.0.2},</div><div class='del'>-@command{10.0.0.3}, and @command{10.0.0.4}. The translator diagram will make more</div><div class='del'>-sense once you've read the next chapter and understood the functions of the</div><div class='del'>-various translators.</div><div class='del'>-</div><div class='del'>-@node Volume specification file</div><div class='del'>-@section Volume specification file</div><div class='del'>-The volume specification file describes the translator tree for both the</div><div class='del'>-server and client programs.</div><div class='del'>-</div><div class='del'>-A volume specification file is a sequence of volume definitions.</div><div class='del'>-The syntax of a volume definition is explained below:</div><div class='del'>-</div><div class='del'>-@cartouche</div><div class='del'>-@example</div><div class='del'>-@strong{volume} @emph{volume-name}</div><div class='del'>-  @strong{type} @emph{translator-name}</div><div class='del'>-  @strong{option} @emph{option-name} @emph{option-value}</div><div class='del'>-  @dots{}</div><div class='del'>-  @strong{subvolumes} @emph{subvolume1} @emph{subvolume2} @dots{}</div><div class='del'>-@strong{end-volume}</div><div class='del'>-@end example</div><div class='del'>-</div><div class='del'>-@dots{}</div><div class='del'>-@end cartouche</div><div class='del'>-</div><div class='del'>-@table @asis</div><div class='del'>-@item @emph{volume-name}</div><div class='del'>-  An identifier for the volume. This is just a human-readable name,</div><div class='del'>-and can contain any alphanumeric character. For instance, ``storage-1'', ``colon-o'',</div><div class='del'>-or ``forty-two''.</div><div class='del'>-</div><div class='del'>-@item @emph{translator-name}</div><div class='del'>-  Name of one of the available translators. Example: @command{protocol/client},</div><div class='del'>-@command{cluster/unify}.</div><div class='del'>-</div><div class='del'>-@item @emph{option-name}</div><div class='del'>-  Name of a valid option for the translator.</div><div class='del'>-</div><div class='del'>-@item @emph{option-value}</div><div class='del'>-  Value for the option. Everything following the ``option'' keyword to the end of the</div><div class='del'>-line is considered the value; it is up to the translator to parse it.</div><div class='del'>-</div><div class='del'>-@item @emph{subvolume1}, @emph{subvolume2}, @dots{}</div><div class='del'>-  Volume names of sub-volumes. The sub-volumes must already have been defined earlier </div><div class='del'>-in the file.</div><div class='del'>-@end table</div><div class='del'>-</div><div class='del'>-There are a few rules you must follow when writing a volume specification file:</div><div class='del'>-</div><div class='del'>-@itemize</div><div class='del'>-@item Everything following a `@command{#}' is considered a comment and is ignored. Blank lines are also ignored.</div><div class='del'>-@item All names and keywords are case-sensitive.</div><div class='del'>-@item The order of options inside a volume definition does not matter.</div><div class='del'>-@item An option value may not span multiple lines.</div><div class='del'>-@item If an option is not specified, it will assume its default value.</div><div class='del'>-@item A sub-volume must have already been defined before it can be referenced. This means you have to write the specification file ``bottom-up'', starting from the leaf nodes of the translator tree and moving up to the root.</div><div class='del'>-@end itemize</div><div class='del'>-</div><div class='del'>-A simple example volume specification file is shown below:</div><div class='del'>-</div><div class='del'>-@cartouche</div><div class='del'>-@example</div><div class='del'>-# This is a comment line</div><div class='del'>-volume client</div><div class='del'>- type protocol/client</div><div class='del'>- option transport-type tcp</div><div class='del'>- option remote-host localhost      # Also a comment</div><div class='del'>- option remote-subvolume brick</div><div class='del'>-# The subvolumes line may be absent</div><div class='del'>-end-volume</div><div class='del'>-</div><div class='del'>-volume iot</div><div class='del'>- type performance/io-threads</div><div class='del'>- option thread-count 4</div><div class='del'>- subvolumes client</div><div class='del'>-end-volume</div><div class='del'>-</div><div class='del'>-volume wb</div><div class='del'>- type performance/write-behind</div><div class='del'>- subvolumes iot</div><div class='del'>-end-volume</div><div class='del'>-@end example</div><div class='del'>-@end cartouche</div><div class='del'>-</div><div class='del'>-@node Translators</div><div class='del'>-@chapter Translators</div><div class='del'>-</div><div class='del'>-@menu</div><div class='del'>-* Storage Translators::         </div><div class='del'>-* Client and Server Translators::  </div><div class='del'>-* Clustering Translators::      </div><div class='del'>-* Performance Translators::     </div><div class='del'>-* Features Translators::        </div><div class='del'>-* Miscellaneous Translators::</div><div class='del'>-@end menu</div><div class='del'>-</div><div class='del'>-This chapter documents all the available GlusterFS translators in detail.</div><div class='del'>-Each translator section will show its name (for example, @command{cluster/unify}),</div><div class='del'>-briefly describe its purpose and workings, and list every option accepted by</div><div class='del'>-that translator and their meaning.</div><div class='del'>-</div><div class='del'>-@node Storage Translators</div><div class='del'>-@section Storage Translators</div><div class='del'>-</div><div class='del'>-The storage translators form the ``backend'' for GlusterFS. Currently,</div><div class='del'>-the only available storage translator is the @acronym{POSIX}</div><div class='del'>-translator, which stores files on a normal @acronym{POSIX}</div><div class='del'>-filesystem. A pleasant consequence of this is that your data will</div><div class='del'>-still be accessible if GlusterFS crashes or cannot be started.</div><div class='del'>-</div><div class='del'>-Other storage backends are planned for the future. One of the possibilities is an</div><div class='del'>-Amazon S3 translator. Amazon S3 is an unlimited online storage service accessible</div><div class='del'>-through a web services @acronym{API}. The S3 translator will allow you to access</div><div class='del'>-the storage as a normal @acronym{POSIX} filesystem.</div><div class='del'>-@footnote{Some more discussion about this can be found at: </div><div class='del'>-</div><div class='del'>-http://developer.amazonwebservices.com/connect/message.jspa?messageID=52873}</div><div class='del'>-</div><div class='del'>-@menu</div><div class='del'>-* POSIX::        </div><div class='del'>-* BDB::</div><div class='del'>-@end menu</div><div class='del'>-</div><div class='del'>-@node POSIX</div><div class='del'>-@subsection POSIX</div><div class='del'>-@example</div><div class='del'>-type storage/posix</div><div class='del'>-@end example</div><div class='del'>-</div><div class='del'>-The @command{posix} translator uses a normal @acronym{POSIX}</div><div class='del'>-filesystem as its ``backend'' to actually store files and</div><div class='del'>-directories. This can be any filesystem that supports extended</div><div class='del'>-attributes (@acronym{EXT3}, ReiserFS, @acronym{XFS}, ...). Extended</div><div class='del'>-attributes are used by some translators to store metadata, for</div><div class='del'>-example, by the replicate and stripe translators. See </div><div class='del'>-@ref{Replicate} and @ref{Stripe}, respectively for details.</div><div class='del'>-</div><div class='del'>-@cartouche</div><div class='del'>-@table @code</div><div class='del'>-@item directory &lt;path&gt;</div><div class='del'>-The directory on the local filesystem which is to be used for storage.</div><div class='del'>-@end table               </div><div class='del'>-@end cartouche</div><div class='del'>-</div><div class='del'>-@node BDB</div><div class='del'>-@subsection BDB</div><div class='del'>-@example</div><div class='del'>-type storage/bdb</div><div class='del'>-@end example</div><div class='del'>-</div><div class='del'>-The @command{BDB} translator uses a @acronym{Berkeley DB} database as its</div><div class='del'>-``backend'' to actually store files as key-value pair in the database and</div><div class='del'>-directories as regular @acronym{POSIX} directories. Note that @acronym{BDB}</div><div class='del'>-does not provide extended attribute support for regular files. Do not use </div><div class='del'>-@acronym{BDB} as storage translator while using any translator that demands</div><div class='del'>-extended attributes on ``backend''.</div><div class='del'>-</div><div class='del'>-@cartouche</div><div class='del'>-@table @code</div><div class='del'>-@item directory &lt;path&gt;</div><div class='del'>-The directory on the local filesystem which is to be used for storage.</div><div class='del'>-@item mode [cache|persistent] (cache)</div><div class='del'>-When @acronym{BDB} is run in @command{cache} mode, recovery of back-end is not completely</div><div class='del'>-guaranteed. @command{persistent} guarantees that @acronym{BDB} can recover back-end from</div><div class='del'>-@acronym{Berkeley DB} even if GlusterFS crashes.</div><div class='del'>-@item errfile &lt;path&gt;</div><div class='del'>-The path of the file to be used as @command{errfile} for @acronym{Berkeley DB} to report</div><div class='del'>-detailed error messages, if any. Note that all the contents of this file will be written</div><div class='del'>-by @acronym{Berkeley DB}, not GlusterFS.</div><div class='del'>-@item logdir &lt;path&gt;</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-@end table</div><div class='del'>-@end cartouche</div><div class='del'>-</div><div class='del'>-@node Client and Server Translators, Clustering Translators, Storage Translators, Translators</div><div class='del'>-@section Client and Server Translators</div><div class='del'>-</div><div class='del'>-The client and server translator enable GlusterFS to export a</div><div class='del'>-translator tree over the network or access a remote GlusterFS</div><div class='del'>-server. These two translators implement GlusterFS's network protocol.</div><div class='del'>-</div><div class='del'>-@menu</div><div class='del'>-* Transport modules::           </div><div class='del'>-* Client protocol::             </div><div class='del'>-* Server protocol::             </div><div class='del'>-@end menu</div><div class='del'>-</div><div class='del'>-@node Transport modules</div><div class='del'>-@subsection Transport modules</div><div class='del'>-The client and server translators are capable of using any of the</div><div class='del'>-pluggable transport modules. Currently available transport modules are</div><div class='del'>-@command{tcp}, which uses a @acronym{TCP} connection between client</div><div class='del'>-and server to communicate; @command{ib-sdp}, which uses a</div><div class='del'>-@acronym{TCP} connection over InfiniBand, and @command{ibverbs}, which</div><div class='del'>-uses high-speed InfiniBand connections.</div><div class='del'>-</div><div class='del'>-Each transport module comes in two different versions, one to be used on</div><div class='del'>-the server side and the other on the client side.</div><div class='del'>-</div><div class='del'>-@subsubsection TCP</div><div class='del'>-</div><div class='del'>-The @acronym{TCP} transport module uses a @acronym{TCP/IP} connection between</div><div class='del'>-the server and the client.</div><div class='del'>-</div><div class='del'>-@example</div><div class='del'>-  option transport-type tcp</div><div class='del'>-@end example</div><div class='del'>-</div><div class='del'>-The @acronym{TCP} client module accepts the following options:</div><div class='del'>-</div><div class='del'>-@cartouche</div><div class='del'>-@table @code</div><div class='del'>-@item non-blocking-connect [no|off|on|yes] (on)</div><div class='del'>-Whether to make the connection attempt asynchronous.</div><div class='del'>-@item remote-port &lt;n&gt; (6996)</div><div class='del'>-Server port to connect to.</div><div class='del'>-@cindex DNS round robin</div><div class='del'>-@item remote-host &lt;hostname&gt; *</div><div class='del'>-Hostname or @acronym{IP} address of the server. If the host name resolves to</div><div class='del'>-multiple IP addresses, all of them will be tried in a round-robin fashion. This</div><div class='del'>-feature can be used to implement fail-over.</div><div class='del'>-@end table</div><div class='del'>-@end cartouche</div><div class='del'>-</div><div class='del'>-The @acronym{TCP} server module accepts the following options:</div><div class='del'>-</div><div class='del'>-@cartouche</div><div class='del'>-@table @code</div><div class='del'>-@item bind-address &lt;address&gt; (0.0.0.0)</div><div class='del'>-The local interface on which the server should listen to requests. Default is to</div><div class='del'>-listen on all interfaces.</div><div class='del'>-@item listen-port &lt;n&gt; (6996)</div><div class='del'>-The local port to listen on.</div><div class='del'>-@end table</div><div class='del'>-@end cartouche</div><div class='del'>-</div><div class='del'>-@subsubsection IB-SDP</div><div class='del'>-@example</div><div class='del'>-  option transport-type ib-sdp</div><div class='del'>-@end example</div><div class='del'>-</div><div class='del'>-kernel implements socket interface for ib hardware. SDP is over ib-verbs.</div><div class='del'>-This module accepts the same options as @command{tcp}</div><div class='del'>-</div><div class='del'>-@subsubsection ibverbs</div><div class='del'>-</div><div class='del'>-@example</div><div class='del'>-  option transport-type tcp</div><div class='del'>-@end example</div><div class='del'>-</div><div class='del'>-@cindex infiniband transport</div><div class='del'>-</div><div class='del'>-InfiniBand is a scalable switched fabric interconnect mechanism </div><div class='del'>-primarily used in high-performance computing. InfiniBand can deliver</div><div class='del'>-data throughput of the order of 10 Gbit/s, with latencies of 4-5 ms.</div><div class='del'>-</div><div class='del'>-The @command{ib-verbs} transport accesses the InfiniBand hardware through</div><div class='del'>-the ``verbs'' @acronym{API}, which is the lowest level of software access possible</div><div class='del'>-and which gives the highest performance. On InfiniBand hardware, it is always</div><div class='del'>-best to use @command{ib-verbs}. Use @command{ib-sdp} only if you cannot get</div><div class='del'>-@command{ib-verbs} working for some reason. </div><div class='del'>-</div><div class='del'>-The @command{ib-verbs} client module accepts the following options:</div><div class='del'>-</div><div class='del'>-@cartouche</div><div class='del'>-@table @code</div><div class='del'>-@item non-blocking-connect [no|off|on|yes] (on)</div><div class='del'>-Whether to make the connection attempt asynchronous.</div><div class='del'>-@item remote-port &lt;n&gt; (6996)</div><div class='del'>-Server port to connect to.</div><div class='del'>-@cindex DNS round robin</div><div class='del'>-@item remote-host &lt;hostname&gt; *</div><div class='del'>-Hostname or @acronym{IP} address of the server. If the host name resolves to</div><div class='del'>-multiple IP addresses, all of them will be tried in a round-robin fashion. This</div><div class='del'>-feature can be used to implement fail-over.</div><div class='del'>-@end table</div><div class='del'>-@end cartouche</div><div class='del'>-</div><div class='del'>-The @command{ib-verbs} server module accepts the following options:</div><div class='del'>-</div><div class='del'>-@cartouche</div><div class='del'>-@table @code</div><div class='del'>-@item bind-address &lt;address&gt; (0.0.0.0)</div><div class='del'>-The local interface on which the server should listen to requests. Default is to</div><div class='del'>-listen on all interfaces.</div><div class='del'>-@item listen-port &lt;n&gt; (6996)</div><div class='del'>-The local port to listen on.</div><div class='del'>-@end table</div><div class='del'>-@end cartouche</div><div class='del'>-</div><div class='del'>-The following options are common to both the client and server modules:</div><div class='del'>-</div><div class='del'>-If you are familiar with InfiniBand jargon,</div><div class='del'>-the mode is used by GlusterFS is ``reliable connection-oriented channel transfer''.</div><div class='del'>-</div><div class='del'>-@cartouche</div><div class='del'>-@table @code</div><div class='del'>-@item ib-verbs-work-request-send-count &lt;n&gt; (64)</div><div class='del'>-Length of the send queue in datagrams. [Reason to increase/decrease?]</div><div class='del'>-</div><div class='del'>-@item ib-verbs-work-request-recv-count &lt;n&gt; (64)</div><div class='del'>-Length of the receive queue in datagrams. [Reason to increase/decrease?]</div><div class='del'>-</div><div class='del'>-@item ib-verbs-work-request-send-size &lt;size&gt; (128KB)</div><div class='del'>-Size of each datagram that is sent. [Reason to increase/decrease?]</div><div class='del'>-</div><div class='del'>-@item ib-verbs-work-request-recv-size &lt;size&gt; (128KB)</div><div class='del'>-Size of each datagram that is received. [Reason to increase/decrease?]</div><div class='del'>-</div><div class='del'>-@item ib-verbs-port &lt;n&gt; (1)</div><div class='del'>-Port number for ib-verbs.</div><div class='del'>-</div><div class='del'>-@item ib-verbs-mtu [256|512|1024|2048|4096] (2048)</div><div class='del'>-The Maximum Transmission Unit [Reason to increase/decrease?]</div><div class='del'>-</div><div class='del'>-@item ib-verbs-device-name &lt;device-name&gt; (first device in the list)</div><div class='del'>-InfiniBand device to be used.</div><div class='del'>-@end table</div><div class='del'>-@end cartouche</div><div class='del'>-</div><div class='del'>-For maximum performance, you should ensure that the send/receive counts on both</div><div class='del'>-the client and server are the same.</div><div class='del'>-</div><div class='del'>-ib-verbs is preferred over ib-sdp.</div><div class='del'>-</div><div class='del'>-@node Client protocol</div><div class='del'>-@subsection Client</div><div class='del'>-@example</div><div class='del'>-type procotol/client</div><div class='del'>-@end example</div><div class='del'>-</div><div class='del'>-The client translator enables the GlusterFS client to access a remote server's</div><div class='del'>-translator tree.</div><div class='del'>-</div><div class='del'>-@cartouche</div><div class='del'>-@table @code</div><div class='del'>-</div><div class='del'>-@item transport-type [tcp,ib-sdp,ib-verbs] (tcp)</div><div class='del'>-The transport type to use. You should use the client versions of all the</div><div class='del'>-transport modules (@command{tcp}, @command{ib-sdp}, </div><div class='del'>-@command{ib-verbs}).</div><div class='del'>-@item remote-subvolume &lt;volume_name&gt; *</div><div class='del'>-The name of the volume on the remote host to attach to. Note that</div><div class='del'>-this is @emph{not} the name of the @command{protocol/server} volume on the</div><div class='del'>-server. It should be any volume under the server.</div><div class='del'>-@item transport-timeout &lt;n&gt; (120- seconds)</div><div class='del'>-Inactivity timeout. If a reply is expected and no activity takes place</div><div class='del'>-on the connection within this time, the transport connection will be</div><div class='del'>-broken, and a new connection will be attempted.</div><div class='del'>-@end table</div><div class='del'>-@end cartouche</div><div class='del'>-</div><div class='del'>-@node Server protocol</div><div class='del'>-@subsection Server</div><div class='del'>-@example</div><div class='del'>-type protocol/server</div><div class='del'>-@end example</div><div class='del'>-</div><div class='del'>-The server translator exports a translator tree and makes it accessible to</div><div class='del'>-remote GlusterFS clients.</div><div class='del'>-</div><div class='del'>-@cartouche</div><div class='del'>-@table @code</div><div class='del'>-@item client-volume-filename &lt;path&gt; (&lt;CONFDIR&gt;/glusterfs-client.vol)</div><div class='del'>-The volume specification file to use for the client. This is the file the</div><div class='del'>-client will receive when it is invoked with the @command{--server} option </div><div class='del'>-(@ref{Client}).</div><div class='del'>-</div><div class='del'>-@item transport-type [tcp,ib-verbs,ib-sdp] (tcp)</div><div class='del'>-The transport to use. You should use the server versions of all the transport</div><div class='del'>-modules (@command{tcp}, @command{ib-sdp}, @command{ib-verbs}).</div><div class='del'>-</div><div class='del'>-@item auth.addr.&lt;volume name&gt;.allow &lt;IP address wildcard pattern&gt;</div><div class='del'>-IP addresses of the clients that are allowed to attach to the specified volume.</div><div class='del'>-This can be a wildcard. For example, a wildcard of the form @command{192.168.*.*}</div><div class='del'>-allows any host in the @command{192.168.x.x} subnet to connect to the server.</div><div class='del'>-</div><div class='del'>-@end table</div><div class='del'>-@end cartouche</div><div class='del'>-</div><div class='del'>-@node Clustering Translators</div><div class='del'>-@section Clustering Translators</div><div class='del'>-</div><div class='del'>-The clustering translators are the most important GlusterFS</div><div class='del'>-translators, since it is these that make GlusterFS a cluster</div><div class='del'>-filesystem. These translators together enable GlusterFS to access an</div><div class='del'>-arbitrarily large amount of storage, and provide @acronym{RAID}-like</div><div class='del'>-redundancy and distribution over the entire cluster.</div><div class='del'>-</div><div class='del'>-There are three clustering translators: @strong{unify}, @strong{replicate},</div><div class='del'>-and @strong{stripe}.  The unify translator aggregates storage from</div><div class='del'>-many server nodes. The replicate translator provides file replication. The stripe</div><div class='del'>-translator allows a file to be spread across many server nodes. The following sections</div><div class='del'>-look at each of these translators in detail.</div><div class='del'>-</div><div class='del'>-@menu</div><div class='del'>-* Unify::                       </div><div class='del'>-* Replicate::  </div><div class='del'>-* Stripe::                      </div><div class='del'>-@end menu</div><div class='del'>-</div><div class='del'>-@node Unify</div><div class='del'>-@subsection Unify</div><div class='del'>-@cindex unify (translator)</div><div class='del'>-@cindex scheduler (unify)</div><div class='del'>-@example</div><div class='del'>-type cluster/unify</div><div class='del'>-@end example</div><div class='del'>-</div><div class='del'>-The unify translator presents a `unified' view of all its sub-volumes. That is,</div><div class='del'>-it makes the union of all its sub-volumes appear as a single volume. It is the</div><div class='del'>-unify translator that gives GlusterFS the ability to access an arbitrarily </div><div class='del'>-large amount of storage.</div><div class='del'>-</div><div class='del'>-For unify to work correctly, certain invariants need to be maintained across</div><div class='del'>-the entire network. These are:</div><div class='del'>-</div><div class='del'>-@cindex unify invariants</div><div class='del'>-@itemize</div><div class='del'>-@item The directory structure of all the sub-volumes must be identical.</div><div class='del'>-@item A particular file can exist on only one of the sub-volumes. Phrasing it in another way, a pathname such as @command{/home/calvin/homework.txt}) is unique across the entire cluster.</div><div class='del'>-@end itemize</div><div class='del'>-</div><div class='del'>-@tex</div><div class='del'>-\vfill</div><div class='del'>-@end tex</div><div class='del'>-@page</div><div class='del'>-</div><div class='del'>-@center @image{unify,44pc,,,.pdf}</div><div class='del'>-</div><div class='del'>-Looking at the second requirement, you might wonder how one can</div><div class='del'>-accomplish storing redundant copies of a file, if no file can exist</div><div class='del'>-multiple times.  To answer, we must remember that these invariants are</div><div class='del'>-from @emph{unify's perspective}.  A translator such as replicate at a lower</div><div class='del'>-level in the translator tree than unify may subvert this picture. </div><div class='del'>-</div><div class='del'>-The first invariant might seem quite tedious to ensure. We shall see</div><div class='del'>-later that this is not so, since unify's @emph{self-heal} mechanism</div><div class='del'>-takes care of maintaining it.</div><div class='del'>-</div><div class='del'>-The second invariant implies that unify needs some way to decide which file goes where.</div><div class='del'>-Unify makes use of @emph{scheduler} modules for this purpose.</div><div class='del'>-</div><div class='del'>-When a file needs to be created, unify's scheduler decides upon the</div><div class='del'>-sub-volume to be used to store the file. There are many schedulers</div><div class='del'>-available, each using a different algorithm and suitable for different</div><div class='del'>-purposes.</div><div class='del'>-</div><div class='del'>-The various schedulers are described in detail in the sections that follow.</div><div class='del'>-</div><div class='del'>-@subsubsection ALU</div><div class='del'>-@cindex alu (scheduler)</div><div class='del'>-</div><div class='del'>-@example</div><div class='del'>-  option scheduler alu</div><div class='del'>-@end example</div><div class='del'>-</div><div class='del'>-ALU stands for "Adaptive Least Usage". It is the most advanced</div><div class='del'>-scheduler available in GlusterFS. It balances the load across volumes</div><div class='del'>-taking several factors in account. It adapts itself to changing I/O</div><div class='del'>-patterns according to its configuration. When properly configured, it</div><div class='del'>-can eliminate the need for regular tuning of the filesystem to keep</div><div class='del'>-volume load nicely balanced.</div><div class='del'>-</div><div class='del'>-The ALU scheduler is composed of multiple least-usage</div><div class='del'>-sub-schedulers. Each sub-scheduler keeps track of a certain type of</div><div class='del'>-load, for each of the sub-volumes, getting statistics from</div><div class='del'>-the sub-volumes themselves. The sub-schedulers are these:</div><div class='del'>-</div><div class='del'>-@itemize</div><div class='del'>-@item disk-usage: The used and free disk space on the volume.</div><div class='del'>-</div><div class='del'>-@item read-usage: The amount of reading done from this volume.</div><div class='del'>-</div><div class='del'>-@item write-usage: The amount of writing done to this volume.</div><div class='del'>-</div><div class='del'>-@item open-files-usage: The number of files currently open from this volume.</div><div class='del'>-</div><div class='del'>-@item disk-speed-usage: The speed at which the disks are spinning. This is a constant value and therefore not very useful.</div><div class='del'>-@end itemize</div><div class='del'>-</div><div class='del'>-The ALU scheduler needs to know which of these sub-schedulers to use,</div><div class='del'>-and in which order to evaluate them. This is done through the</div><div class='del'>-@command{option alu.order} configuration directive.</div><div class='del'>-</div><div class='del'>-Each sub-scheduler needs to know two things: when to kick in (the</div><div class='del'>-entry-threshold), and how long to stay in control (the</div><div class='del'>-exit-threshold). For example: when unifying three disks of 100GB,</div><div class='del'>-keeping an exact balance of disk-usage is not necesary. Instead, there</div><div class='del'>-could be a 1GB margin, which can be used to nicely balance other</div><div class='del'>-factors, such as read-usage. The disk-usage scheduler can be told to</div><div class='del'>-kick in only when a certain threshold of discrepancy is passed, such</div><div class='del'>-as 1GB. When it assumes control under this condition, it will write</div><div class='del'>-all subsequent data to the least-used volume. If it is doing so, it is</div><div class='del'>-unwise to stop right after the values are below the entry-threshold</div><div class='del'>-again, since that would make it very likely that the situation will</div><div class='del'>-occur again very soon. Such a situation would cause the ALU to spend</div><div class='del'>-most of its time disk-usage scheduling, which is unfair to the other</div><div class='del'>-sub-schedulers. The exit-threshold therefore defines the amount of</div><div class='del'>-data that needs to be written to the least-used disk, before control</div><div class='del'>-is relinquished again.</div><div class='del'>-</div><div class='del'>-In addition to the sub-schedulers, the ALU scheduler also has "limits"</div><div class='del'>-options. These can stop the creation of new files on a volume once</div><div class='del'>-values drop below a certain threshold. For example, setting</div><div class='del'>-@command{option alu.limits.min-free-disk 5GB} will stop the scheduling</div><div class='del'>-of files to volumes that have less than 5GB of free disk space,</div><div class='del'>-leaving the files on that disk some room to grow.</div><div class='del'>-</div><div class='del'>-The actual values you assign to the thresholds for sub-schedulers and</div><div class='del'>-limits depend on your situation. If you have fast-growing files,</div><div class='del'>-you'll want to stop file-creation on a disk much earlier than when</div><div class='del'>-hardly any of your files are growing. If you care less about</div><div class='del'>-disk-usage balance than about read-usage balance, you'll want a bigger</div><div class='del'>-disk-usage scheduler entry-threshold and a smaller read-usage</div><div class='del'>-scheduler entry-threshold.</div><div class='del'>-</div><div class='del'>-For thresholds defining a size, values specifying "KB", "MB" and "GB"</div><div class='del'>-are allowed. For example: @command{option alu.limits.min-free-disk 5GB}.</div><div class='del'>-</div><div class='del'>-@cartouche</div><div class='del'>-@table @code</div><div class='del'>-@item alu.order &lt;order&gt; * ("disk-usage:write-usage:read-usage:open-files-usage:disk-speed")</div><div class='del'>-@item alu.disk-usage.entry-threshold &lt;size&gt; (1GB)</div><div class='del'>-@item alu.disk-usage.exit-threshold &lt;size&gt; (512MB)</div><div class='del'>-@item alu.write-usage.entry-threshold &lt;%&gt; (25)</div><div class='del'>-@item alu.write-usage.exit-threshold &lt;%&gt; (5)</div><div class='del'>-@item alu.read-usage.entry-threshold &lt;%&gt; (25)</div><div class='del'>-@item alu.read-usage.exit-threshold &lt;%&gt; (5)</div><div class='del'>-@item alu.open-files-usage.entry-threshold &lt;n&gt; (1000)</div><div class='del'>-@item alu.open-files-usage.exit-threshold &lt;n&gt; (100)</div><div class='del'>-@item alu.limits.min-free-disk &lt;%&gt; </div><div class='del'>-@item alu.limits.max-open-files &lt;n&gt; </div><div class='del'>-@end table</div><div class='del'>-@end cartouche</div><div class='del'>-</div><div class='del'>-@subsubsection Round Robin (RR)</div><div class='del'>-@cindex rr (scheduler)</div><div class='del'>-</div><div class='del'>-@example</div><div class='del'>-  option scheduler rr</div><div class='del'>-@end example</div><div class='del'>-</div><div class='del'>-Round-Robin (RR) scheduler creates files in a round-robin</div><div class='del'>-fashion. Each client will have its own round-robin loop. When your</div><div class='del'>-files are mostly similar in size and I/O access pattern, this</div><div class='del'>-scheduler is a good choice. RR scheduler checks for free disk space</div><div class='del'>-on the server before scheduling, so you can know when to add</div><div class='del'>-another server node. The default value of min-free-disk is 5% and is</div><div class='del'>-checked on file creation calls, with atleast 10 seconds (by default) </div><div class='del'>-elapsing between two checks.</div><div class='del'>-</div><div class='del'>-Options:</div><div class='del'>-@cartouche</div><div class='del'>-@table @code</div><div class='del'>-@item rr.limits.min-free-disk &lt;%&gt; (5)</div><div class='del'>-Minimum free disk space a node must have for RR to schedule a file to it.</div><div class='del'>-@item rr.refresh-interval &lt;t&gt; (10 seconds)</div><div class='del'>-Time between two successive free disk space checks.</div><div class='del'>-@end table</div><div class='del'>-@end cartouche</div><div class='del'>-</div><div class='del'>-@subsubsection Random</div><div class='del'>-@cindex random (scheduler)</div><div class='del'>-</div><div class='del'>-@example</div><div class='del'>-  option scheduler random</div><div class='del'>-@end example</div><div class='del'>-</div><div class='del'>-The random scheduler schedules file creation randomly among its child nodes.</div><div class='del'>-Like the round-robin scheduler, it also checks for a minimum amount of free disk</div><div class='del'>-space before scheduling a file to a node.</div><div class='del'>-</div><div class='del'>-@cartouche</div><div class='del'>-@table @code</div><div class='del'>-@item random.limits.min-free-disk &lt;%&gt; (5)</div><div class='del'>-Minimum free disk space a node must have for random to schedule a file to it.</div><div class='del'>-@item random.refresh-interval &lt;t&gt; (10 seconds)</div><div class='del'>-Time between two successive free disk space checks.</div><div class='del'>-@end table</div><div class='del'>-@end cartouche</div><div class='del'>-</div><div class='del'>-@subsubsection NUFA</div><div class='del'>-@cindex nufa (scheduler)</div><div class='del'>-</div><div class='del'>-@example</div><div class='del'>-  option scheduler nufa</div><div class='del'>-@end example</div><div class='del'>-</div><div class='del'>-It is common in many GlusterFS computing environments for all deployed</div><div class='del'>-machines to act as both servers and clients. For example, a</div><div class='del'>-research lab may have 40 workstations each with its own storage. All</div><div class='del'>-of these workstations might act as servers exporting a volume as well</div><div class='del'>-as clients accessing the entire cluster's storage.  In such a</div><div class='del'>-situation, it makes sense to store locally created files on the local</div><div class='del'>-workstation itself (assuming files are accessed most by the</div><div class='del'>-workstation that created them). The Non-Uniform File Allocation (@acronym{NUFA})</div><div class='del'>-scheduler accomplishes that.</div><div class='del'>-</div><div class='del'>-@acronym{NUFA} gives the local system first priority for file creation</div><div class='del'>-over other nodes. If the local volume does not have more free disk space</div><div class='del'>-than a specified amount (5% by default) then @acronym{NUFA} schedules files</div><div class='del'>-among the other child volumes in a round-robin fashion.</div><div class='del'>-</div><div class='del'>-@acronym{NUFA} is named after the similar strategy used for memory access,</div><div class='del'>-@acronym{NUMA}@footnote{Non-Uniform Memory Access: </div><div class='del'>-@indicateurl{http://en.wikipedia.org/wiki/Non-Uniform_Memory_Access}}.</div><div class='del'>-</div><div class='del'>-@cartouche</div><div class='del'>-@table @code</div><div class='del'>-@item nufa.limits.min-free-disk &lt;%&gt; (5)</div><div class='del'>-Minimum disk space that must be free (local or remote) for @acronym{NUFA} to schedule a</div><div class='del'>-file to it.</div><div class='del'>-@item nufa.refresh-interval &lt;t&gt; (10 seconds)</div><div class='del'>-Time between two successive free disk space checks.</div><div class='del'>-@item nufa.local-volume-name &lt;volume&gt; </div><div class='del'>-The name of the volume corresponding to the local system. This volume must be</div><div class='del'>-one of the children of the unify volume. This option is mandatory.</div><div class='del'>-@end table</div><div class='del'>-@end cartouche</div><div class='del'>-</div><div class='del'>-@cindex namespace</div><div class='del'>-@subsubsection Namespace</div><div class='del'>-Namespace volume needed because:</div><div class='del'>- - persistent inode numbers.</div><div class='del'>- - file exists even when node is down.</div><div class='del'>-</div><div class='del'>-namespace files are simply touched. on every lookup it is checked.</div><div class='del'>-</div><div class='del'>-@cartouche</div><div class='del'>-@table @code</div><div class='del'>-@item namespace &lt;volume&gt; *</div><div class='del'>-Name of the namespace volume (which should be one of the unify volume's children).</div><div class='del'>-@item self-heal [on|off] (on)</div><div class='del'>-Enable/disable self-heal. Unless you know what you are doing, do not disable self-heal.</div><div class='del'>-@end table</div><div class='del'>-@end cartouche</div><div class='del'>-</div><div class='del'>-@cindex self heal (unify)</div><div class='del'>-@subsubsection Self Heal</div><div class='del'>-    * When a 'lookup()/stat()' call is made on directory for the first</div><div class='del'>-time, a self-heal call is made, which checks for the consistancy of</div><div class='del'>-its child nodes. If an entry is present in storage node, but not in</div><div class='del'>-namespace, that entry is created in namespace, and vica-versa. There</div><div class='del'>-is an writedir() API introduced which is used for the same. It also</div><div class='del'>-checks for permissions, and uid/gid consistencies.</div><div class='del'>-</div><div class='del'>-    * This check is also done when an server goes down and comes up.</div><div class='del'>-</div><div class='del'>-    * If one starts with an empty namespace export, but has data in</div><div class='del'>-storage nodes, a 'find .&gt;/dev/null' or 'ls -lR &gt;/dev/null' should help</div><div class='del'>-to build namespace in one shot. Even otherwise, namespace is built on</div><div class='del'>-demand when a file is looked up for the first time.</div><div class='del'>-</div><div class='del'>-NOTE: There are some issues (Kernel 'Oops' msgs) seen with fuse-2.6.3,</div><div class='del'>-when someone deletes namespace in backend, when glusterfs is</div><div class='del'>-running. But with fuse-2.6.5, this issue is not there.</div><div class='del'>-</div><div class='del'>-@node Replicate</div><div class='del'>-@subsection Replicate (formerly AFR)</div><div class='del'>-@cindex Replicate</div><div class='del'>-@example</div><div class='del'>-type cluster/replicate</div><div class='del'>-@end example</div><div class='del'>-</div><div class='del'>-Replicate provides @acronym{RAID}-1 like functionality for</div><div class='del'>-GlusterFS. Replicate replicates files and directories across the</div><div class='del'>-subvolumes. Hence if Replicate has four subvolumes, there will be</div><div class='del'>-four copies of all files and directories. Replicate provides</div><div class='del'>-high-availability, i.e., in case one of the subvolumes go down</div><div class='del'>-(e. g. server crash, network disconnection) Replicate will still</div><div class='del'>-service the requests using the redundant copies.</div><div class='del'>-</div><div class='del'>-Replicate also provides self-heal functionality, i.e., in case the</div><div class='del'>-crashed servers come up, the outdated files and directories will be</div><div class='del'>-updated with the latest versions. Replicate uses extended</div><div class='del'>-attributes of the backend file system to track the versioning of files</div><div class='del'>-and directories and provide the self-heal feature.</div><div class='del'>-</div><div class='del'>-@example</div><div class='del'>-volume replicate-example</div><div class='del'>- type cluster/replicate</div><div class='del'>- subvolumes brick1 brick2 brick3</div><div class='del'>-end-volume</div><div class='del'>-@end example</div><div class='del'>-</div><div class='del'>-This sample configuration will replicate all directories and files on</div><div class='del'>-brick1, brick2 and brick3. </div><div class='del'>-</div><div class='del'>-All the read operations happen from the first alive child. If all the</div><div class='del'>-three sub-volumes are up, reads will be done from brick1; if brick1 is</div><div class='del'>-down read will be done from brick2. In case read() was being done on</div><div class='del'>-brick1 and it goes down, replicate transparently falls back to</div><div class='del'>-brick2. </div><div class='del'>-</div><div class='del'>-The next release of GlusterFS will add the following features:</div><div class='del'>-@itemize</div><div class='del'>-@item Ability to specify the sub-volume from which read operations are to be done (this will help users who have one of the sub-volumes as a local storage volume).</div><div class='del'>-@item Allow scheduling of read operations amongst the sub-volumes in a round-robin fashion.</div><div class='del'>-@end itemize</div><div class='del'>-</div><div class='del'>-The order of the subvolumes list should be same across all the 'replicate's as</div><div class='del'>-they will be used for locking purposes.</div><div class='del'>-</div><div class='del'>-@cindex self heal (replicate)</div><div class='del'>-@subsubsection Self Heal</div><div class='del'>-Replicate has self-heal feature, which updates the outdated file and</div><div class='del'>-directory copies by the most recent versions. For example consider the</div><div class='del'>-following config:</div><div class='del'>-</div><div class='del'>-@example</div><div class='del'>-volume replicate-example</div><div class='del'>- type cluster/replicate</div><div class='del'>- subvolumes brick1 brick2</div><div class='del'>-end-volume</div><div class='del'>-@end example</div><div class='del'>-</div><div class='del'>-@subsubsection File self-heal</div><div class='del'>-</div><div class='del'>-Now if we create a file foo.txt on replicate-example, the file will be created</div><div class='del'>-on brick1 and brick2. The file will have two extended attributes associated</div><div class='del'>-with it in the backend filesystem. One is trusted.afr.createtime and the</div><div class='del'>-other is trusted.afr.version. The trusted.afr.createtime xattr has the</div><div class='del'>-create time (in terms of seconds since epoch) and trusted.afr.version</div><div class='del'>-is a number that is incremented each time a file is modified. This increment</div><div class='del'>-happens during close (incase any write was done before close).</div><div class='del'>-</div><div class='del'>-If brick1 goes down, we edit foo.txt the version gets incremented. Now</div><div class='del'>-the brick1 comes back up, when we open() on foo.txt replicate will check if</div><div class='del'>-their versions are same. If they are not same, the outdated copy is</div><div class='del'>-replaced by the latest copy and its version is updated. After the sync</div><div class='del'>-the open() proceeds in the usual manner and the application calling open()</div><div class='del'>-can continue on its access to the file.</div><div class='del'>-</div><div class='del'>-If brick1 goes down, we delete foo.txt and create a file with the same</div><div class='del'>-name again i.e foo.txt. Now brick1 comes back up, clearly there is a</div><div class='del'>-chance that the version on brick1 being more than the version on brick2,</div><div class='del'>-this is where createtime extended attribute helps in deciding which</div><div class='del'>-the outdated copy is. Hence we need to consider both createtime and</div><div class='del'>-version to decide on the latest copy.</div><div class='del'>-</div><div class='del'>-The version attribute is incremented during the close() call. Version</div><div class='del'>-will not be incremented in case there was no write() done. In case the</div><div class='del'>-fd that the close() gets was got by create() call, we also create</div><div class='del'>-the createtime extended attribute.</div><div class='del'>-</div><div class='del'>-@subsubsection Directory self-heal</div><div class='del'>-</div><div class='del'>-Suppose brick1 goes down, we delete foo.txt, brick1 comes back up, now</div><div class='del'>-we should not create foo.txt on brick2 but we should delete foo.txt</div><div class='del'>-on brick1. We handle this situation by having the createtime and version</div><div class='del'>-attribute on the directory similar to the file. when lookup() is done</div><div class='del'>-on the directory, we compare the createtime/version attributes of the</div><div class='del'>-copies and see which files needs to be deleted and delete those files</div><div class='del'>-and update the extended attributes of the outdated directory copy.</div><div class='del'>-Each time a directory is modified (a file or a subdirectory is created</div><div class='del'>-or deleted inside the directory) and one of the subvols is down, we</div><div class='del'>-increment the directory's version.</div><div class='del'>-</div><div class='del'>-lookup() is a call initiated by the kernel on a file or directory</div><div class='del'>-just before any access to that file or directory. In glusterfs, by</div><div class='del'>-default, lookup() will not be called in case it was called in the</div><div class='del'>-past one second on that particular file or directory.</div><div class='del'>-</div><div class='del'>-The extended attributes can be seen in the backend filesystem using</div><div class='del'>-the @command{getfattr} command. (@command{getfattr -n trusted.afr.version &lt;file&gt;})</div><div class='del'>-</div><div class='del'>-@cartouche</div><div class='del'>-@table @code</div><div class='del'>-@item debug [on|off]  (off)</div><div class='del'>-@item self-heal [on|off] (on)</div><div class='del'>-@item replicate &lt;pattern&gt; (*:1)</div><div class='del'>-@item lock-node &lt;child_volume&gt; (first child is used by default)</div><div class='del'>-@end table</div><div class='del'>-@end cartouche</div><div class='del'>-</div><div class='del'>-@node Stripe</div><div class='del'>-@subsection Stripe</div><div class='del'>-@cindex stripe (translator)</div><div class='del'>-@example</div><div class='del'>-type cluster/stripe</div><div class='del'>-@end example</div><div class='del'>-</div><div class='del'>-The stripe translator distributes the contents of a file over its</div><div class='del'>-sub-volumes.  It does this by creating a file equal in size to the</div><div class='del'>-total size of the file on each of its sub-volumes. It then writes only</div><div class='del'>-a part of the file to each sub-volume, leaving the rest of it empty. </div><div class='del'>-These empty regions are called `holes' in Unix terminology. The holes</div><div class='del'>-do not consume any disk space.</div><div class='del'>-</div><div class='del'>-The diagram below makes this clear.</div><div class='del'>-</div><div class='del'>-@center @image{stripe,44pc,,,.pdf}</div><div class='del'>-</div><div class='del'>-You can configure stripe so that only filenames matching a pattern </div><div class='del'>-are striped. You can also configure the size of the data to be stored </div><div class='del'>-on each sub-volume.</div><div class='del'>-</div><div class='del'>-@cartouche</div><div class='del'>-@table @code</div><div class='del'>-@item block-size &lt;pattern&gt;:&lt;size&gt;  (*:0 no striping)</div><div class='del'>-Distribute files matching @command{&lt;pattern&gt;} over the sub-volumes, </div><div class='del'>-storing at least @command{&lt;size&gt;} on each sub-volume. For example,</div><div class='del'>-</div><div class='del'>-@example</div><div class='del'>-  option block-size *.mpg:1M</div><div class='del'>-@end example</div><div class='del'>-</div><div class='del'>-distributes all files ending in @command{.mpg}, storing at least 1 MB on</div><div class='del'>-each sub-volume.</div><div class='del'>-</div><div class='del'>-Any number of @command{block-size} option lines may be present, specifying</div><div class='del'>-different sizes for different file name patterns.</div><div class='del'>-@end table</div><div class='del'>-@end cartouche</div><div class='del'>-</div><div class='del'>-@node Performance Translators</div><div class='del'>-@section Performance Translators</div><div class='del'>-</div><div class='del'>-@menu</div><div class='del'>-* Read Ahead::                  </div><div class='del'>-* Write Behind::                </div><div class='del'>-* IO Threads::                  </div><div class='del'>-* IO Cache::</div><div class='del'>-* Booster::</div><div class='del'>-@end menu</div><div class='del'>-</div><div class='del'>-@node Read Ahead</div><div class='del'>-@subsection Read Ahead</div><div class='del'>-@cindex read-ahead (translator)</div><div class='del'>-@example</div><div class='del'>-type performance/read-ahead</div><div class='del'>-@end example</div><div class='del'>-</div><div class='del'>-The read-ahead translator pre-fetches data in advance on every read.</div><div class='del'>-This benefits applications that mostly process files in sequential order,</div><div class='del'>-since the next block of data will already be available by the time the</div><div class='del'>-application is done with the current one. </div><div class='del'>-</div><div class='del'>-Additionally, the read-ahead translator also behaves as a read-aggregator. </div><div class='del'>-Many small read operations are combined and issued as fewer, larger read</div><div class='del'>-requests to the server.</div><div class='del'>-</div><div class='del'>-Read-ahead deals in ``pages'' as the unit of data fetched. The page size</div><div class='del'>-is configurable, as is the ``page count'', which is the number of pages</div><div class='del'>-that are pre-fetched.</div><div class='del'>-</div><div class='del'>-Read-ahead is best used with InfiniBand (using the ib-verbs transport). </div><div class='del'>-On FastEthernet and Gigabit Ethernet networks,</div><div class='del'>-GlusterFS can achieve the link-maximum throughput even without</div><div class='del'>-read-ahead, making it quite superflous.</div><div class='del'>-</div><div class='del'>-Note that read-ahead only happens if the reads are perfectly</div><div class='del'>-sequential. If your application accesses data in a random fashion,</div><div class='del'>-using read-ahead might actually lead to a performance loss, since</div><div class='del'>-read-ahead will pointlessly fetch pages which won't be used by the</div><div class='del'>-application.</div><div class='del'>-</div><div class='del'>-@cartouche</div><div class='del'>-Options:</div><div class='del'>-@table @code</div><div class='del'>-@item page-size &lt;n&gt; (256KB)</div><div class='del'>-The unit of data that is pre-fetched.</div><div class='del'>-@item page-count &lt;n&gt; (2)</div><div class='del'>-The number of pages that are pre-fetched.</div><div class='del'>-@item force-atime-update [on|off|yes|no] (off|no)</div><div class='del'>-Whether to force an access time (atime) update on the file on every read. Without</div><div class='del'>-this, the atime will be slightly imprecise, as it will reflect the time when </div><div class='del'>-the read-ahead translator read the data, not when the application actually read it.</div><div class='del'>-@end table</div><div class='del'>-@end cartouche</div><div class='del'>-</div><div class='del'>-@node Write Behind</div><div class='del'>-@subsection Write Behind</div><div class='del'>-@cindex write-behind (translator)</div><div class='del'>-@example</div><div class='del'>-type performance/write-behind</div><div class='del'>-@end example</div><div class='del'>-</div><div class='del'>-The write-behind translator improves the latency of a write operation.</div><div class='del'>-It does this by relegating the write operation to the background and</div><div class='del'>-returning to the application even as the write is in progress. Using the</div><div class='del'>-write-behind translator, successive write requests can be pipelined.</div><div class='del'>-This mode of write-behind operation is best used on the client side, to</div><div class='del'>-enable decreased write latency for the application.</div><div class='del'>-</div><div class='del'>-The write-behind translator can also aggregate write requests. If the </div><div class='del'>-@command{aggregate-size} option is specified, then successive writes upto that</div><div class='del'>-size are accumulated and written in a single operation. This mode of operation</div><div class='del'>-is best used on the server side, as this will decrease the disk's head movement</div><div class='del'>-when multiple files are being written to in parallel.</div><div class='del'>-</div><div class='del'>-The @command{aggregate-size} option has a default value of 128KB. Although</div><div class='del'>-this works well for most users, you should always experiment with different values</div><div class='del'>-to determine the one that will deliver maximum performance. This is because the</div><div class='del'>-performance of write-behind depends on your interconnect, size of RAM, and the</div><div class='del'>-work load.</div><div class='del'>-</div><div class='del'>-@cartouche</div><div class='del'>-@table @code</div><div class='del'>-@item aggregate-size &lt;n&gt; (128KB)</div><div class='del'>-Amount of data to accumulate before doing a write</div><div class='del'>-@item flush-behind [on|yes|off|no] (off|no)</div><div class='del'>-</div><div class='del'>-@end table</div><div class='del'>-@end cartouche</div><div class='del'>-</div><div class='del'>-@node IO Threads</div><div class='del'>-@subsection IO Threads</div><div class='del'>-@cindex io-threads (translator)</div><div class='del'>-@example</div><div class='del'>-type performance/io-threads</div><div class='del'>-@end example</div><div class='del'>-</div><div class='del'>-The IO threads translator is intended to increase the responsiveness</div><div class='del'>-of the server to metadata operations by doing file I/O (read, write)</div><div class='del'>-in a background thread.  Since the GlusterFS server is</div><div class='del'>-single-threaded, using the IO threads translator can significantly</div><div class='del'>-improve performance. This translator is best used on the server side,</div><div class='del'>-loaded just below the server protocol translator.</div><div class='del'>-</div><div class='del'>-IO threads operates by handing out read and write requests to a separate thread.</div><div class='del'>-The total number of threads in existence at a time is constant, and configurable.</div><div class='del'>-</div><div class='del'>-@cartouche</div><div class='del'>-@table @code</div><div class='del'>-@item thread-count &lt;n&gt; (1)</div><div class='del'>-Number of threads to use.</div><div class='del'>-@end table</div><div class='del'>-@end cartouche</div><div class='del'>-</div><div class='del'>-@node IO Cache</div><div class='del'>-@subsection IO Cache</div><div class='del'>-@cindex io-cache (translator)</div><div class='del'>-@example</div><div class='del'>-type performance/io-cache</div><div class='del'>-@end example</div><div class='del'>-</div><div class='del'>-The IO cache translator caches data that has been read. This is useful</div><div class='del'>-if many applications read the same data multiple times, and if reads</div><div class='del'>-are much more frequent than writes (for example, IO caching may be</div><div class='del'>-useful in a web hosting environment, where most clients will simply</div><div class='del'>-read some files and only a few will write to them).</div><div class='del'>-</div><div class='del'>-The IO cache translator reads data from its child in @command{page-size} chunks.</div><div class='del'>-It caches data upto @command{cache-size} bytes. The cache is maintained as</div><div class='del'>-a prioritized least-recently-used (@acronym{LRU}) list, with priorities determined</div><div class='del'>-by user-specified patterns to match filenames.</div><div class='del'>-</div><div class='del'>-When the IO cache translator detects a write operation, the </div><div class='del'>-cache for that file is flushed.</div><div class='del'>-</div><div class='del'>-The IO cache translator periodically verifies the consistency of</div><div class='del'>-cached data, using the modification times on the files. The verification timeout</div><div class='del'>-is configurable.</div><div class='del'>-</div><div class='del'>-@cartouche</div><div class='del'>-@table @code</div><div class='del'>-@item page-size &lt;n&gt; (128KB)</div><div class='del'>-Size of a page.</div><div class='del'>-@item cache-size (n) (32MB)</div><div class='del'>-Total amount of data to be cached.</div><div class='del'>-@item force-revalidate-timeout &lt;n&gt; (1)</div><div class='del'>-Timeout to force a cache consistency verification, in seconds.</div><div class='del'>-@item priority &lt;pattern&gt; (*:0)</div><div class='del'>-Filename patterns listed in order of priority.</div><div class='del'>-@end table</div><div class='del'>-@end cartouche</div><div class='del'>-</div><div class='del'>-@node Booster</div><div class='del'>-@subsection Booster</div><div class='del'>-@cindex booster</div><div class='del'>-@example</div><div class='del'>-  type performance/booster</div><div class='del'>-@end example</div><div class='del'>-</div><div class='del'>-The booster translator gives applications a faster path to communicate</div><div class='del'>-read and write requests to GlusterFS. Normally, all requests to GlusterFS from</div><div class='del'>-applications go through FUSE, as indicated in @ref{Filesystems in Userspace}.</div><div class='del'>-Using the booster translator in conjunction with the GlusterFS booster shared</div><div class='del'>-library, an application can bypass the FUSE path and send read/write requests</div><div class='del'>-directly to the GlusterFS client process.</div><div class='del'>-</div><div class='del'>-The booster mechanism consists of two parts: the booster translator,</div><div class='del'>-and the booster shared library. The booster translator is meant to be</div><div class='del'>-loaded on the client side, usually at the root of the translator tree.</div><div class='del'>-The booster shared library should be @command{LD_PRELOAD}ed with the</div><div class='del'>-application.</div><div class='del'>-</div><div class='del'>-The booster translator when loaded opens a Unix domain socket and</div><div class='del'>-listens for read/write requests on it. The booster shared library</div><div class='del'>-intercepts read and write system calls and sends the requests to the</div><div class='del'>-GlusterFS process directly using the Unix domain socket, bypassing FUSE.</div><div class='del'>-This leads to superior performance.</div><div class='del'>-</div><div class='del'>-Once you've loaded the booster translator in your volume specification file, you</div><div class='del'>-can start your application as:</div><div class='del'>-</div><div class='del'>-@example</div><div class='del'>-  $ LD_PRELOAD=/usr/local/bin/glusterfs-booster.so your_app</div><div class='del'>-@end example</div><div class='del'>-</div><div class='del'>-The booster translator accepts no options.</div><div class='del'>-</div><div class='del'>-@node Features Translators</div><div class='del'>-@section Features Translators </div><div class='del'>-</div><div class='del'>-@menu</div><div class='del'>-* POSIX Locks::                 </div><div class='del'>-* Fixed ID::                    </div><div class='del'>-@end menu</div><div class='del'>-</div><div class='del'>-@node POSIX Locks</div><div class='del'>-@subsection POSIX Locks</div><div class='del'>-@cindex record locking</div><div class='del'>-@cindex fcntl</div><div class='del'>-@cindex posix-locks (translator)</div><div class='del'>-@example</div><div class='del'>-type features/posix-locks</div><div class='del'>-@end example</div><div class='del'>-</div><div class='del'>-This translator provides storage independent POSIX record locking</div><div class='del'>-support (@command{fcntl} locking). Typically you'll want to load this on the</div><div class='del'>-server side, just above the @acronym{POSIX} storage translator. Using this</div><div class='del'>-translator you can get both advisory locking and mandatory locking</div><div class='del'>-support.  It also handles @command{flock()} locks properly.</div><div class='del'>-</div><div class='del'>-Caveat: Consider a file that does not have its mandatory locking bits</div><div class='del'>-(+setgid, -group execution) turned on. Assume that this file is now</div><div class='del'>-opened by a process on a client that has the write-behind xlator</div><div class='del'>-loaded. The write-behind xlator does not cache anything for files</div><div class='del'>-which have mandatory locking enabled, to avoid incoherence. Let's say</div><div class='del'>-that mandatory locking is now enabled on this file through another</div><div class='del'>-client. The former client will not know about this change, and</div><div class='del'>-write-behind may erroneously report a write as being successful when</div><div class='del'>-in fact it would fail due to the region it is writing to being locked.</div><div class='del'>-</div><div class='del'>-There seems to be no easy way to fix this. To work around this</div><div class='del'>-problem, it is recommended that you never enable the mandatory bits on</div><div class='del'>-a file while it is open.</div><div class='del'>-</div><div class='del'>-@cartouche</div><div class='del'>-@table @code</div><div class='del'>-@item mandatory [on|off] (on)</div><div class='del'>-Turns mandatory locking on.</div><div class='del'>-@end table</div><div class='del'>-@end cartouche</div><div class='del'>-</div><div class='del'>-@node Fixed ID</div><div class='del'>-@subsection Fixed ID</div><div class='del'>-@cindex fixed-id (translator)</div><div class='del'>-@example</div><div class='del'>-type features/fixed-id</div><div class='del'>-@end example</div><div class='del'>-</div><div class='del'>-The fixed ID translator makes all filesystem requests from the client</div><div class='del'>-to appear to be coming from a fixed, specified</div><div class='del'>-@acronym{UID}/@acronym{GID}, regardless of which user actually</div><div class='del'>-initiated the request.</div><div class='del'>-</div><div class='del'>-@cartouche</div><div class='del'>-@table @code</div><div class='del'>-@item fixed-uid &lt;n&gt; [if not set, not used]</div><div class='del'>-The @acronym{UID} to send to the server</div><div class='del'>-@item fixed-gid &lt;n&gt; [if not set, not used]</div><div class='del'>-The @acronym{GID} to send to the server</div><div class='del'>-@end table</div><div class='del'>-@end cartouche</div><div class='del'>-</div><div class='del'>-@node Miscellaneous Translators</div><div class='del'>-@section Miscellaneous Translators</div><div class='del'>-</div><div class='del'>-@menu</div><div class='del'>-* ROT-13::                      </div><div class='del'>-* Trace::                       </div><div class='del'>-@end menu</div><div class='del'>-</div><div class='del'>-@node ROT-13</div><div class='del'>-@subsection ROT-13</div><div class='del'>-@cindex rot-13 (translator)</div><div class='del'>-@example</div><div class='del'>-type encryption/rot-13</div><div class='del'>-@end example</div><div class='del'>-</div><div class='del'>-@acronym{ROT-13} is a toy translator that can ``encrypt'' and ``decrypt'' file</div><div class='del'>-contents using the @acronym{ROT-13} algorithm. @acronym{ROT-13} is a trivial</div><div class='del'>-algorithm that rotates each alphabet by thirteen places. Thus, 'A' becomes 'N',</div><div class='del'>-'B' becomes 'O', and 'Z' becomes 'M'.</div><div class='del'>-</div><div class='del'>-It goes without saying that you shouldn't use this translator if you need </div><div class='del'>-@emph{real} encryption (a future release of GlusterFS will have real encryption</div><div class='del'>-translators).</div><div class='del'>-</div><div class='del'>-@cartouche</div><div class='del'>-@table @code</div><div class='del'>-@item encrypt-write [on|off] (on)</div><div class='del'>-Whether to encrypt on write</div><div class='del'>-@item decrypt-read [on|off] (on)</div><div class='del'>-Whether to decrypt on read</div><div class='del'>-@end table</div><div class='del'>-@end cartouche</div><div class='del'>-</div><div class='del'>-@node Trace</div><div class='del'>-@subsection Trace</div><div class='del'>-@cindex trace (translator)</div><div class='del'>-@example</div><div class='del'>-type debug/trace     </div><div class='del'>-@end example</div><div class='del'>-</div><div class='del'>-The trace translator is intended for debugging purposes. When loaded, it</div><div class='del'>-logs all the system calls received by the server or client (wherever</div><div class='del'>-trace is loaded), their arguments, and the results. You must use a GlusterFS log</div><div class='del'>-level of DEBUG (See @ref{Running GlusterFS}) for trace to work.</div><div class='del'>-</div><div class='del'>-Sample trace output (lines have been wrapped for readability):</div><div class='del'>-@cartouche</div><div class='del'>-@example</div><div class='del'>-2007-10-30 00:08:58 D [trace.c:1579:trace_opendir] trace: callid: 68 </div><div class='del'>-(*this=0x8059e40, loc=0x8091984 @{path=/iozone3_283, inode=0x8091f00@}, </div><div class='del'>- fd=0x8091d50)</div><div class='del'>-</div><div class='del'>-2007-10-30 00:08:58 D [trace.c:630:trace_opendir_cbk] trace: </div><div class='del'>-(*this=0x8059e40, op_ret=4, op_errno=1, fd=0x8091d50)</div><div class='del'>-</div><div class='del'>-2007-10-30 00:08:58 D [trace.c:1602:trace_readdir] trace: callid: 69 </div><div class='del'>-(*this=0x8059e40, size=4096, offset=0 fd=0x8091d50)</div><div class='del'>-</div><div class='del'>-2007-10-30 00:08:58 D [trace.c:215:trace_readdir_cbk] trace: </div><div class='del'>-(*this=0x8059e40, op_ret=0, op_errno=0, count=4)</div><div class='del'>-</div><div class='del'>-2007-10-30 00:08:58 D [trace.c:1624:trace_closedir] trace: callid: 71 </div><div class='del'>-(*this=0x8059e40, *fd=0x8091d50)</div><div class='del'>-</div><div class='del'>-2007-10-30 00:08:58 D [trace.c:809:trace_closedir_cbk] trace: </div><div class='del'>-(*this=0x8059e40, op_ret=0, op_errno=1)</div><div class='del'>-@end example</div><div class='del'>-@end cartouche</div><div class='del'>-</div><div class='del'>-@node Usage Scenarios</div><div class='del'>-@chapter Usage Scenarios</div><div class='del'>-</div><div class='del'>-@section Advanced Striping</div><div class='del'>-</div><div class='del'>-This section is based on the Advanced Striping tutorial written by</div><div class='del'>-Anand Avati on the GlusterFS wiki</div><div class='del'>-@footnote{http://gluster.org/docs/index.php/Mixing_Striped_and_Regular_Files}.</div><div class='del'>-</div><div class='del'>-@subsection Mixed Storage Requirements</div><div class='del'>-</div><div class='del'>-There are two ways of scheduling the I/O. One at file level (using</div><div class='del'>-unify translator) and other at block level (using stripe</div><div class='del'>-translator). Striped I/O is good for files that are potentially large</div><div class='del'>-and require high parallel throughput (for example, a single file of</div><div class='del'>-400GB being accessed by 100s and 1000s of systems simultaneously and</div><div class='del'>-randomly). For most of the cases, file level scheduling works best.</div><div class='del'>-</div><div class='del'>-In the real world, it is desirable to mix file level and block level</div><div class='del'>-scheduling on a single storage volume. Alternatively users can choose</div><div class='del'>-to have two separate volumes and hence two mount points, but the</div><div class='del'>-applications may demand a single storage system to host both.</div><div class='del'>-</div><div class='del'>-This document explains how to mix file level scheduling with stripe. </div><div class='del'>-</div><div class='del'>-@subsection Configuration Brief</div><div class='del'>-</div><div class='del'>-This setup demonstrates how users can configure unify translator with</div><div class='del'>-appropriate I/O scheduler for file level scheduling and strip for only</div><div class='del'>-matching patterns. This way, GlusterFS chooses appropriate I/O profile</div><div class='del'>-and knows how to efficiently handle both the types of data.</div><div class='del'>-</div><div class='del'>-A simple technique to achieve this effect is to create a stripe set of</div><div class='del'>-unify and stripe blocks, where unify is the first sub-volume. Files</div><div class='del'>-that do not match the stripe policy passed on to first unify</div><div class='del'>-sub-volume and inturn scheduled arcoss the cluster using its file</div><div class='del'>-level I/O scheduler.</div><div class='del'>-</div><div class='del'>-@image{advanced-stripe,44pc,,,.pdf}</div><div class='del'>-</div><div class='del'>-@subsection Preparing GlusterFS Envoronment</div><div class='del'>-</div><div class='del'>-Create the directories /export/namespace, /export/unify and</div><div class='del'>-/export/stripe on all the storage bricks.</div><div class='del'>-</div><div class='del'>- Place the following server and client volume spec file under</div><div class='del'>-/etc/glusterfs (or appropriate installed path) and replace the IP</div><div class='del'>-addresses / access control fields to match your environment.</div><div class='del'>-</div><div class='del'>-@cartouche</div><div class='del'>-@example</div><div class='del'>-  ## file: /etc/glusterfs/glusterfsd.vol</div><div class='del'>-   volume posix-unify</div><div class='del'>-           type storage/posix</div><div class='del'>-           option directory /export/for-unify</div><div class='del'>-   end-volume</div><div class='del'>- </div><div class='del'>-   volume posix-stripe</div><div class='del'>-           type storage/posix</div><div class='del'>-           option directory /export/for-stripe</div><div class='del'>-   end-volume</div><div class='del'>- </div><div class='del'>-   volume posix-namespace</div><div class='del'>-           type storage/posix</div><div class='del'>-           option directory /export/for-namespace</div><div class='del'>-   end-volume</div><div class='del'>-  </div><div class='del'>-   volume server</div><div class='del'>-           type protocol/server</div><div class='del'>-           option transport-type tcp</div><div class='del'>-           option auth.addr.posix-unify.allow 192.168.1.*</div><div class='del'>-           option auth.addr.posix-stripe.allow 192.168.1.*</div><div class='del'>-           option auth.addr.posix-namespace.allow 192.168.1.*</div><div class='del'>-           subvolumes posix-unify posix-stripe posix-namespace</div><div class='del'>-   end-volume</div><div class='del'>-@end example</div><div class='del'>-@end cartouche</div><div class='del'>-</div><div class='del'>-@cartouche</div><div class='del'>-@example</div><div class='del'>- ## file: /etc/glusterfs/glusterfs.vol</div><div class='del'>-   volume client-namespace</div><div class='del'>-     type protocol/client</div><div class='del'>-     option transport-type tcp</div><div class='del'>-     option remote-host 192.168.1.1</div><div class='del'>-     option remote-subvolume posix-namespace</div><div class='del'>-   end-volume</div><div class='del'>-</div><div class='del'>-   volume client-unify-1</div><div class='del'>-     type protocol/client</div><div class='del'>-     option transport-type tcp</div><div class='del'>-     option remote-host 192.168.1.1</div><div class='del'>-     option remote-subvolume posix-unify</div><div class='del'>-   end-volume</div><div class='del'>-</div><div class='del'>-   volume client-unify-2</div><div class='del'>-     type protocol/client</div><div class='del'>-     option transport-type tcp</div><div class='del'>-     option remote-host 192.168.1.2</div><div class='del'>-     option remote-subvolume posix-unify</div><div class='del'>-   end-volume</div><div class='del'>-</div><div class='del'>-   volume client-unify-3</div><div class='del'>-     type protocol/client</div><div class='del'>-     option transport-type tcp</div><div class='del'>-     option remote-host 192.168.1.3</div><div class='del'>-     option remote-subvolume posix-unify</div><div class='del'>-   end-volume</div><div class='del'>-</div><div class='del'>-   volume client-unify-4</div><div class='del'>-     type protocol/client</div><div class='del'>-     option transport-type tcp</div><div class='del'>-     option remote-host 192.168.1.4</div><div class='del'>-     option remote-subvolume posix-unify</div><div class='del'>-   end-volume</div><div class='del'>- </div><div class='del'>-   volume client-stripe-1</div><div class='del'>-     type protocol/client</div><div class='del'>-     option transport-type tcp</div><div class='del'>-     option remote-host 192.168.1.1</div><div class='del'>-     option remote-subvolume posix-stripe</div><div class='del'>-   end-volume</div><div class='del'>-</div><div class='del'>-   volume client-stripe-2</div><div class='del'>-     type protocol/client</div><div class='del'>-     option transport-type tcp</div><div class='del'>-     option remote-host 192.168.1.2</div><div class='del'>-     option remote-subvolume posix-stripe</div><div class='del'>-   end-volume</div><div class='del'>-</div><div class='del'>-   volume client-stripe-3</div><div class='del'>-     type protocol/client</div><div class='del'>-     option transport-type tcp</div><div class='del'>-     option remote-host 192.168.1.3</div><div class='del'>-     option remote-subvolume posix-stripe</div><div class='del'>-   end-volume</div><div class='del'>-</div><div class='del'>-   volume client-stripe-4</div><div class='del'>-     type protocol/client</div><div class='del'>-     option transport-type tcp</div><div class='del'>-     option remote-host 192.168.1.4</div><div class='del'>-     option remote-subvolume posix-stripe</div><div class='del'>-   end-volume</div><div class='del'>-  </div><div class='del'>-   volume unify</div><div class='del'>-     type cluster/unify</div><div class='del'>-     option scheduler rr</div><div class='del'>-     subvolumes cluster-unify-1 cluster-unify-2 cluster-unify-3 cluster-unify-4</div><div class='del'>-   end-volume</div><div class='del'>- </div><div class='del'>-   volume stripe</div><div class='del'>-     type cluster/stripe</div><div class='del'>-     option block-size *.img:2MB # All files ending with .img are striped with 2MB stripe block size.</div><div class='del'>-     subvolumes unify cluster-stripe-1 cluster-stripe-2 cluster-stripe-3 cluster-stripe-4</div><div class='del'>-   end-volume</div><div class='del'>-@end example</div><div class='del'>-@end cartouche</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-Bring up the Storage</div><div class='del'>-</div><div class='del'>-Starting GlusterFS Server: If you have installed through binary</div><div class='del'>-package, you can start the service through init.d startup script. If</div><div class='del'>-not:</div><div class='del'>-</div><div class='del'>-@example</div><div class='del'>-[root@@server]# glusterfsd</div><div class='del'>-@end example</div><div class='del'>-</div><div class='del'>-Mounting GlusterFS Volumes:</div><div class='del'>-</div><div class='del'>-@example</div><div class='del'>-[root@@client]# glusterfs -s [BRICK-IP-ADDRESS] /mnt/cluster</div><div class='del'>-@end example</div><div class='del'>-</div><div class='del'>-Improving upon this Setup</div><div class='del'>-</div><div class='del'>-Infiniband Verbs RDMA transport is much faster than TCP/IP GigE</div><div class='del'>-transport.</div><div class='del'>-</div><div class='del'>-Use of performance translators such as read-ahead, write-behind,</div><div class='del'>-io-cache, io-threads, booster is recommended.</div><div class='del'>-</div><div class='del'>-Replace round-robin (rr) scheduler with ALU to handle more dynamic</div><div class='del'>-storage environments.</div><div class='del'>-</div><div class='del'>-@node Troubleshooting</div><div class='del'>-@chapter Troubleshooting</div><div class='del'>-</div><div class='del'>-This chapter is a general troubleshooting guide to GlusterFS. It lists</div><div class='del'>-common GlusterFS server and client error messages, debugging hints, and</div><div class='del'>-concludes with the suggested procedure to report bugs in GlusterFS.</div><div class='del'>-</div><div class='del'>-@section GlusterFS error messages</div><div class='del'>-</div><div class='del'>-@subsection Server errors</div><div class='del'>-</div><div class='del'>-@example</div><div class='del'>-glusterfsd: FATAL: could not open specfile: </div><div class='del'>-'/etc/glusterfs/glusterfsd.vol'</div><div class='del'>-@end example</div><div class='del'>-</div><div class='del'>-The GlusterFS server expects the volume specification file to be </div><div class='del'>-at @command{/etc/glusterfs/glusterfsd.vol}. The example</div><div class='del'>-specification file will be installed as </div><div class='del'>-@command{/etc/glusterfs/glusterfsd.vol.sample}. You need to edit</div><div class='del'>-it and rename it, or provide a different specification file using</div><div class='del'>-the @command{--spec-file} command line option (See @ref{Server}).</div><div class='del'>-</div><div class='del'>-@vskip 4ex</div><div class='del'>-</div><div class='del'>-@example</div><div class='del'>-gf_log_init: failed to open logfile "/usr/var/log/glusterfs/glusterfsd.log" </div><div class='del'>-             (Permission denied)</div><div class='del'>-@end example</div><div class='del'>-</div><div class='del'>-You don't have permission to create files in the</div><div class='del'>-@command{/usr/var/log/glusterfs} directory. Make sure you are running</div><div class='del'>-GlusterFS as root. Alternatively, specify a different path for the log</div><div class='del'>-file using the @command{--log-file} option (See @ref{Server}).</div><div class='del'>-</div><div class='del'>-@subsection Client errors</div><div class='del'>-</div><div class='del'>-@example</div><div class='del'>-fusermount: failed to access mountpoint /mnt: </div><div class='del'>-            Transport endpoint is not connected</div><div class='del'>-@end example</div><div class='del'>-</div><div class='del'>-A previous failed (or hung) mount of GlusterFS is preventing it from being</div><div class='del'>-mounted again in the same location. The fix is to do:</div><div class='del'>-</div><div class='del'>-@example</div><div class='del'>-# umount /mnt</div><div class='del'>-@end example</div><div class='del'>-</div><div class='del'>-and try mounting again.</div><div class='del'>-</div><div class='del'>-@vskip 4ex</div><div class='del'>-</div><div class='del'>-@strong{``Transport endpoint is not connected''.}</div><div class='del'>-</div><div class='del'>-If you get this error when you try a command such as @command{ls} or @command{cat},</div><div class='del'>-it means the GlusterFS mount did not succeed. Try running GlusterFS in @command{DEBUG}</div><div class='del'>-logging level and study the log messages to discover the cause.</div><div class='del'>-</div><div class='del'>-@vskip 4ex</div><div class='del'>-</div><div class='del'>-@strong{``Connect to server failed'', ``SERVER-ADDRESS: Connection refused''.}</div><div class='del'>-</div><div class='del'>-GluserFS Server is not running or dead. Check your network</div><div class='del'>-connections and firewall settings. To check if the server is reachable,</div><div class='del'>-try:</div><div class='del'>-</div><div class='del'>-@example</div><div class='del'>-telnet IP-ADDRESS 6996</div><div class='del'>-@end example</div><div class='del'>-</div><div class='del'>-If the server is accessible, your `telnet' command should connect and</div><div class='del'>-block. If not you will see an error message such as @command{telnet: Unable to</div><div class='del'>-connect to remote host: Connection refused}. 6996 is the default</div><div class='del'>-GlusterFS port. If you have changed it, then use the corresponding</div><div class='del'>-port instead.</div><div class='del'>-</div><div class='del'>-@vskip 4ex</div><div class='del'>-</div><div class='del'>-@example</div><div class='del'>-gf_log_init: failed to open logfile "/usr/var/log/glusterfs/glusterfs.log" </div><div class='del'>-             (Permission denied)</div><div class='del'>-@end example</div><div class='del'>-</div><div class='del'>-You don't have permission to create files in the</div><div class='del'>-@command{/usr/var/log/glusterfs} directory. Make sure you are running</div><div class='del'>-GlusterFS as root. Alternatively, specify a different path for the log</div><div class='del'>-file using the @command{--log-file} option (See @ref{Client}).</div><div class='del'>-</div><div class='del'>-@section FUSE error messages</div><div class='del'>-@command{modprobe fuse} fails with: ``Unknown symbol in module, or unknown parameter''.</div><div class='del'>-@cindex Redhat Enterprise Linux</div><div class='del'>-</div><div class='del'>-If you are using fuse-2.6.x on Redhat Enterprise Linux Work Station 4</div><div class='del'>-and Advanced Server 4 with 2.6.9-42.ELlargesmp, 2.6.9-42.ELsmp,</div><div class='del'>-2.6.9-42.EL kernels and get this error while loading @acronym{FUSE} kernel</div><div class='del'>-module, you need to apply the following patch.</div><div class='del'>-</div><div class='del'>-For fuse-2.6.2:</div><div class='del'>-</div><div class='del'>-@indicateurl{http://ftp.gluster.com/pub/gluster/glusterfs/fuse/fuse-2.6.2-rhel-build.patch}</div><div class='del'>-</div><div class='del'>-For fuse-2.6.3:</div><div class='del'>-</div><div class='del'>-@indicateurl{http://ftp.gluster.com/pub/gluster/glusterfs/fuse/fuse-2.6.3-rhel-build.patch}</div><div class='del'>-</div><div class='del'>-@section AppArmour and GlusterFS</div><div class='del'>-@cindex AppArmour</div><div class='del'>-@cindex OpenSuSE</div><div class='del'>-Under OpenSuSE GNU/Linux, the AppArmour security feature does not</div><div class='del'>-allow GlusterFS to create temporary files or network socket</div><div class='del'>-connections even while running as root. You will see error messages</div><div class='del'>-like `Unable to open log file: Operation not permitted' or `Connection</div><div class='del'>-refused'. Disabling AppArmour using YaST or properly configuring</div><div class='del'>-AppArmour to recognize @command{glusterfsd} or @command{glusterfs}/@command{fusermount}</div><div class='del'>-should solve the problem.</div><div class='del'>-</div><div class='del'>-@section Reporting a bug</div><div class='del'>-</div><div class='del'>-If you encounter a bug in GlusterFS, please follow the below</div><div class='del'>-guidelines when you report it to the mailing list. Be sure to report</div><div class='del'>-it! User feedback is crucial to the health of the project and we value</div><div class='del'>-it highly.</div><div class='del'>-</div><div class='del'>-@subsection General instructions</div><div class='del'>-</div><div class='del'>-When running GlusterFS in a non-production environment, be sure to</div><div class='del'>-build it with the following command:</div><div class='del'>-</div><div class='del'>-@example</div><div class='del'>- $ make CFLAGS='-g -O0 -DDEBUG'</div><div class='del'>-@end example</div><div class='del'>-</div><div class='del'>-This includes debugging information which will be helpful in getting</div><div class='del'>-backtraces (see below) and also disable optimization. Enabling</div><div class='del'>-optimization can result in incorrect line numbers being reported to</div><div class='del'>-gdb.</div><div class='del'>-</div><div class='del'>-@subsection Volume specification files</div><div class='del'>-</div><div class='del'>-Attach all relevant server and client spec files you were using when</div><div class='del'>-you encountered the bug. Also tell us details of your setup, i.e., how</div><div class='del'>-many clients and how many servers.</div><div class='del'>-</div><div class='del'>-@subsection Log files</div><div class='del'>-</div><div class='del'>-Set the loglevel of your client and server programs to @acronym{DEBUG} (by</div><div class='del'>-passing the -L @acronym{DEBUG} option) and attach the log files with your bug</div><div class='del'>-report. Obviously, if only the client is failing (for example), you</div><div class='del'>-only need to send us the client log file.</div><div class='del'>-</div><div class='del'>-@subsection Backtrace</div><div class='del'>-</div><div class='del'>-If GlusterFS has encountered a segmentation fault or has crashed for</div><div class='del'>-some other reason, include the backtrace with the bug report. You can</div><div class='del'>-get the backtrace using the following procedure.</div><div class='del'>-</div><div class='del'>-Run the GlusterFS client or server inside gdb.</div><div class='del'>-</div><div class='del'>-@example</div><div class='del'>- $ gdb ./glusterfs</div><div class='del'>- (gdb) set args -f client.spec -N -l/path/to/log/file -LDEBUG /mnt/point</div><div class='del'>- (gdb) run</div><div class='del'>-@end example</div><div class='del'>-</div><div class='del'>-Now when the process segfaults, you can get the backtrace by typing:</div><div class='del'>-</div><div class='del'>-@example</div><div class='del'>- (gdb) bt</div><div class='del'>-@end example</div><div class='del'>-</div><div class='del'>-If the GlusterFS process has crashed and dumped a core file (you can</div><div class='del'>-find this in / if running as a daemon and in the current directory</div><div class='del'>-otherwise), you can do:</div><div class='del'>-</div><div class='del'>-@example</div><div class='del'>- $ gdb /path/to/glusterfs /path/to/core.&lt;pid&gt;</div><div class='del'>-@end example</div><div class='del'>-</div><div class='del'>-and then get the backtrace.</div><div class='del'>-</div><div class='del'>-If the GlusterFS server or client seems to be hung, then you can get</div><div class='del'>-the backtrace by attaching gdb to the process. First get the @command{PID} of</div><div class='del'>-the process (using ps), and then do:</div><div class='del'>-</div><div class='del'>-@example</div><div class='del'>- $ gdb ./glusterfs &lt;pid&gt;</div><div class='del'>-@end example</div><div class='del'>-</div><div class='del'>-Press Ctrl-C to interrupt the process and then generate the backtrace.</div><div class='del'>-</div><div class='del'>-@subsection Reproducing the bug</div><div class='del'>-</div><div class='del'>-If the bug is reproducible, please include the steps necessary to do</div><div class='del'>-so. If the bug is not reproducible, send us the bug report anyway.</div><div class='del'>-</div><div class='del'>-@subsection Other information</div><div class='del'>-</div><div class='del'>-If you think it is relevant, send us also the version of @acronym{FUSE} you're</div><div class='del'>-using, the kernel version, platform.</div><div class='del'>-</div><div class='del'>-@node GNU Free Documentation Licence</div><div class='del'>-@appendix GNU Free Documentation Licence</div><div class='del'>-@include fdl.texi</div><div class='del'>-</div><div class='del'>-@node Index</div><div class='del'>-@unnumbered Index</div><div class='del'>-@printindex cp</div><div class='del'>-</div><div class='del'>-@bye</div><div class='head'>diff --git a/doc/user-guide/xlator.odg b/doc/user-guide/xlator.odg<br/>deleted file mode 100644<br/>index 179a65f6e26..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/doc/user-guide/xlator.odg?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>doc/user-guide/xlator.odg</a><br/>+++ /dev/null</div>Binary files differ<div class='head'>diff --git a/doc/user-guide/xlator.pdf b/doc/user-guide/xlator.pdf<br/>deleted file mode 100644<br/>index a07e14d67d2..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/doc/user-guide/xlator.pdf?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>doc/user-guide/xlator.pdf</a><br/>+++ /dev/null</div>Binary files differ<div class='head'>diff --git a/events/Makefile.am b/events/Makefile.am<br/>new file mode 100644<br/>index 00000000000..264bb742a80<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/events/Makefile.am?id=d1d7a6f35c816822fab51c820e25023863c239c1'>events/Makefile.am</a></div><div class='hunk'>@@ -0,0 +1,8 @@</div><div class='add'>+SUBDIRS = src tools</div><div class='add'>+EXTRA_DIST = eventskeygen.py</div><div class='add'>+noinst_PYTHON = eventskeygen.py</div><div class='add'>+</div><div class='add'>+if BUILD_EVENTS</div><div class='add'>+install-data-hook:</div><div class='add'>+	$(INSTALL) -d -m 755 $(DESTDIR)@GLUSTERD_WORKDIR@/events</div><div class='add'>+endif</div><div class='head'>diff --git a/events/eventskeygen.py b/events/eventskeygen.py<br/>new file mode 100644<br/>index 00000000000..e28ebe9b7e6<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/events/eventskeygen.py?id=d1d7a6f35c816822fab51c820e25023863c239c1'>events/eventskeygen.py</a></div><div class='hunk'>@@ -0,0 +1,243 @@</div><div class='add'>+#!/usr/bin/python3</div><div class='add'>+# -*- coding: utf-8 -*-</div><div class='add'>+#</div><div class='add'>+#  Copyright (c) 2016 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+#  This file is part of GlusterFS.</div><div class='add'>+#</div><div class='add'>+#  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+#  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+#  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+#  cases as published by the Free Software Foundation.</div><div class='add'>+#</div><div class='add'>+</div><div class='add'>+import os</div><div class='add'>+import sys</div><div class='add'>+</div><div class='add'>+GLUSTER_SRC_ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))</div><div class='add'>+eventtypes_h = os.path.join(GLUSTER_SRC_ROOT, "libglusterfs/src/eventtypes.h")</div><div class='add'>+eventtypes_py = os.path.join(GLUSTER_SRC_ROOT, "events/src/eventtypes.py")</div><div class='add'>+</div><div class='add'>+gen_header_type = sys.argv[1]</div><div class='add'>+</div><div class='add'>+# When adding new keys add it to the END</div><div class='add'>+keys = (</div><div class='add'>+    # user driven events</div><div class='add'>+    #peer and volume management events</div><div class='add'>+    "EVENT_PEER_ATTACH",</div><div class='add'>+    "EVENT_PEER_DETACH",</div><div class='add'>+    "EVENT_VOLUME_CREATE",</div><div class='add'>+    "EVENT_VOLUME_START",</div><div class='add'>+    "EVENT_VOLUME_STOP",</div><div class='add'>+    "EVENT_VOLUME_DELETE",</div><div class='add'>+    "EVENT_VOLUME_SET",</div><div class='add'>+    "EVENT_VOLUME_RESET",</div><div class='add'>+    "EVENT_BRICK_RESET_START",</div><div class='add'>+    "EVENT_BRICK_RESET_COMMIT",</div><div class='add'>+    "EVENT_BRICK_REPLACE",</div><div class='add'>+</div><div class='add'>+    #geo-rep events</div><div class='add'>+    "EVENT_GEOREP_CREATE",</div><div class='add'>+    "EVENT_GEOREP_START",</div><div class='add'>+    "EVENT_GEOREP_STOP",</div><div class='add'>+    "EVENT_GEOREP_PAUSE",</div><div class='add'>+    "EVENT_GEOREP_RESUME",</div><div class='add'>+    "EVENT_GEOREP_DELETE",</div><div class='add'>+    "EVENT_GEOREP_CONFIG_SET",</div><div class='add'>+    "EVENT_GEOREP_CONFIG_RESET",</div><div class='add'>+</div><div class='add'>+    #bitrot events</div><div class='add'>+    "EVENT_BITROT_ENABLE",</div><div class='add'>+    "EVENT_BITROT_DISABLE",</div><div class='add'>+    "EVENT_BITROT_SCRUB_THROTTLE",</div><div class='add'>+    "EVENT_BITROT_SCRUB_FREQ",</div><div class='add'>+    "EVENT_BITROT_SCRUB_OPTION",</div><div class='add'>+    "EVENT_BITROT_SCRUB_ONDEMAND",</div><div class='add'>+</div><div class='add'>+    #quota events</div><div class='add'>+    "EVENT_QUOTA_ENABLE",</div><div class='add'>+    "EVENT_QUOTA_DISABLE",</div><div class='add'>+    "EVENT_QUOTA_SET_USAGE_LIMIT",</div><div class='add'>+    "EVENT_QUOTA_SET_OBJECTS_LIMIT",</div><div class='add'>+    "EVENT_QUOTA_REMOVE_USAGE_LIMIT",</div><div class='add'>+    "EVENT_QUOTA_REMOVE_OBJECTS_LIMIT",</div><div class='add'>+    "EVENT_QUOTA_ALERT_TIME",</div><div class='add'>+    "EVENT_QUOTA_SOFT_TIMEOUT",</div><div class='add'>+    "EVENT_QUOTA_HARD_TIMEOUT",</div><div class='add'>+    "EVENT_QUOTA_DEFAULT_SOFT_LIMIT",</div><div class='add'>+</div><div class='add'>+    #snapshot events</div><div class='add'>+    "EVENT_SNAPSHOT_CREATED",</div><div class='add'>+    "EVENT_SNAPSHOT_CREATE_FAILED",</div><div class='add'>+    "EVENT_SNAPSHOT_ACTIVATED",</div><div class='add'>+    "EVENT_SNAPSHOT_ACTIVATE_FAILED",</div><div class='add'>+    "EVENT_SNAPSHOT_DEACTIVATED",</div><div class='add'>+    "EVENT_SNAPSHOT_DEACTIVATE_FAILED",</div><div class='add'>+    "EVENT_SNAPSHOT_SOFT_LIMIT_REACHED",</div><div class='add'>+    "EVENT_SNAPSHOT_HARD_LIMIT_REACHED",</div><div class='add'>+    "EVENT_SNAPSHOT_RESTORED",</div><div class='add'>+    "EVENT_SNAPSHOT_RESTORE_FAILED",</div><div class='add'>+    "EVENT_SNAPSHOT_DELETED",</div><div class='add'>+    "EVENT_SNAPSHOT_DELETE_FAILED",</div><div class='add'>+    "EVENT_SNAPSHOT_CLONED",</div><div class='add'>+    "EVENT_SNAPSHOT_CLONE_FAILED",</div><div class='add'>+    "EVENT_SNAPSHOT_CONFIG_UPDATED",</div><div class='add'>+    "EVENT_SNAPSHOT_CONFIG_UPDATE_FAILED",</div><div class='add'>+    "EVENT_SNAPSHOT_SCHEDULER_INITIALISED",</div><div class='add'>+    "EVENT_SNAPSHOT_SCHEDULER_INIT_FAILED",</div><div class='add'>+    "EVENT_SNAPSHOT_SCHEDULER_ENABLED",</div><div class='add'>+    "EVENT_SNAPSHOT_SCHEDULER_ENABLE_FAILED",</div><div class='add'>+    "EVENT_SNAPSHOT_SCHEDULER_DISABLED",</div><div class='add'>+    "EVENT_SNAPSHOT_SCHEDULER_DISABLE_FAILED",</div><div class='add'>+    "EVENT_SNAPSHOT_SCHEDULER_SCHEDULE_ADDED",</div><div class='add'>+    "EVENT_SNAPSHOT_SCHEDULER_SCHEDULE_ADD_FAILED",</div><div class='add'>+    "EVENT_SNAPSHOT_SCHEDULER_SCHEDULE_EDITED",</div><div class='add'>+    "EVENT_SNAPSHOT_SCHEDULER_SCHEDULE_EDIT_FAILED",</div><div class='add'>+    "EVENT_SNAPSHOT_SCHEDULER_SCHEDULE_DELETED",</div><div class='add'>+    "EVENT_SNAPSHOT_SCHEDULER_SCHEDULE_DELETE_FAILED",</div><div class='add'>+</div><div class='add'>+    #async events</div><div class='add'>+    #glusterd events</div><div class='add'>+    "EVENT_SVC_MANAGER_FAILED",</div><div class='add'>+    "EVENT_SVC_RECONFIGURE_FAILED",</div><div class='add'>+    "EVENT_SVC_CONNECTED",</div><div class='add'>+    "EVENT_SVC_DISCONNECTED",</div><div class='add'>+    "EVENT_PEER_STORE_FAILURE",</div><div class='add'>+    "EVENT_PEER_RPC_CREATE_FAILED",</div><div class='add'>+    "EVENT_PEER_REJECT",</div><div class='add'>+    "EVENT_PEER_CONNECT",</div><div class='add'>+    "EVENT_PEER_DISCONNECT",</div><div class='add'>+    "EVENT_PEER_NOT_FOUND",</div><div class='add'>+    "EVENT_UNKNOWN_PEER",</div><div class='add'>+    "EVENT_BRICK_START_FAILED",</div><div class='add'>+    "EVENT_BRICK_STOP_FAILED",</div><div class='add'>+    "EVENT_BRICK_DISCONNECTED",</div><div class='add'>+    "EVENT_BRICK_CONNECTED",</div><div class='add'>+    "EVENT_BRICKPATH_RESOLVE_FAILED",</div><div class='add'>+    "EVENT_NOTIFY_UNKNOWN_OP",</div><div class='add'>+    "EVENT_QUORUM_LOST",</div><div class='add'>+    "EVENT_QUORUM_REGAINED",</div><div class='add'>+    "EVENT_REBALANCE_START_FAILED",</div><div class='add'>+    "EVENT_REBALANCE_STATUS_UPDATE_FAILED",</div><div class='add'>+    "EVENT_IMPORT_QUOTA_CONF_FAILED",</div><div class='add'>+    "EVENT_IMPORT_VOLUME_FAILED",</div><div class='add'>+    "EVENT_IMPORT_BRICK_FAILED",</div><div class='add'>+    "EVENT_COMPARE_FRIEND_VOLUME_FAILED",</div><div class='add'>+    "EVENT_NFS_GANESHA_EXPORT_FAILED",</div><div class='add'>+    #ec events</div><div class='add'>+    "EVENT_EC_MIN_BRICKS_NOT_UP",</div><div class='add'>+    "EVENT_EC_MIN_BRICKS_UP",</div><div class='add'>+    #georep async events</div><div class='add'>+    "EVENT_GEOREP_FAULTY",</div><div class='add'>+    "EVENT_GEOREP_CHECKPOINT_COMPLETED",</div><div class='add'>+    "EVENT_GEOREP_ACTIVE",</div><div class='add'>+    "EVENT_GEOREP_PASSIVE",</div><div class='add'>+</div><div class='add'>+    #quota async events</div><div class='add'>+    "EVENT_QUOTA_CROSSED_SOFT_LIMIT",</div><div class='add'>+    #bitrot async events</div><div class='add'>+    "EVENT_BITROT_BAD_FILE",</div><div class='add'>+    #protocol-server events</div><div class='add'>+    "EVENT_CLIENT_CONNECT",</div><div class='add'>+    "EVENT_CLIENT_AUTH_REJECT",</div><div class='add'>+    "EVENT_CLIENT_DISCONNECT",</div><div class='add'>+    #posix events</div><div class='add'>+    "EVENT_POSIX_SAME_GFID",</div><div class='add'>+    "EVENT_POSIX_ALREADY_PART_OF_VOLUME",</div><div class='add'>+    "EVENT_POSIX_BRICK_NOT_IN_VOLUME",</div><div class='add'>+    "EVENT_POSIX_BRICK_VERIFICATION_FAILED",</div><div class='add'>+    "EVENT_POSIX_ACL_NOT_SUPPORTED",</div><div class='add'>+    "EVENT_POSIX_HEALTH_CHECK_FAILED",</div><div class='add'>+    #afr events</div><div class='add'>+    "EVENT_AFR_QUORUM_MET",</div><div class='add'>+    "EVENT_AFR_QUORUM_FAIL",</div><div class='add'>+    "EVENT_AFR_SUBVOL_UP",</div><div class='add'>+    "EVENT_AFR_SUBVOLS_DOWN",</div><div class='add'>+    "EVENT_AFR_SPLIT_BRAIN",</div><div class='add'>+</div><div class='add'>+    #tier events</div><div class='add'>+    "EVENT_TIER_ATTACH",</div><div class='add'>+    "EVENT_TIER_ATTACH_FORCE",</div><div class='add'>+    "EVENT_TIER_DETACH_START",</div><div class='add'>+    "EVENT_TIER_DETACH_STOP",</div><div class='add'>+    "EVENT_TIER_DETACH_COMMIT",</div><div class='add'>+    "EVENT_TIER_DETACH_FORCE",</div><div class='add'>+    "EVENT_TIER_PAUSE",</div><div class='add'>+    "EVENT_TIER_RESUME",</div><div class='add'>+    "EVENT_TIER_WATERMARK_HI",</div><div class='add'>+    "EVENT_TIER_WATERMARK_DROPPED_TO_MID",</div><div class='add'>+    "EVENT_TIER_WATERMARK_RAISED_TO_MID",</div><div class='add'>+    "EVENT_TIER_WATERMARK_DROPPED_TO_LOW",</div><div class='add'>+</div><div class='add'>+    #dht events</div><div class='add'>+    #add/remove brick events</div><div class='add'>+    "EVENT_VOLUME_ADD_BRICK",</div><div class='add'>+    "EVENT_VOLUME_ADD_BRICK_FAILED",</div><div class='add'>+    "EVENT_VOLUME_REMOVE_BRICK_START",</div><div class='add'>+    "EVENT_VOLUME_REMOVE_BRICK_START_FAILED",</div><div class='add'>+    "EVENT_VOLUME_REMOVE_BRICK_COMMIT",</div><div class='add'>+    "EVENT_VOLUME_REMOVE_BRICK_COMMIT_FAILED",</div><div class='add'>+    "EVENT_VOLUME_REMOVE_BRICK_STOP",</div><div class='add'>+    "EVENT_VOLUME_REMOVE_BRICK_STOP_FAILED",</div><div class='add'>+    "EVENT_VOLUME_REMOVE_BRICK_FORCE",</div><div class='add'>+    "EVENT_VOLUME_REMOVE_BRICK_FORCE_FAILED",</div><div class='add'>+    "EVENT_VOLUME_REMOVE_BRICK_FAILED",</div><div class='add'>+</div><div class='add'>+    #rebalance events</div><div class='add'>+    "EVENT_VOLUME_REBALANCE_START",</div><div class='add'>+    "EVENT_VOLUME_REBALANCE_STOP",</div><div class='add'>+    "EVENT_VOLUME_REBALANCE_FAILED",</div><div class='add'>+    "EVENT_VOLUME_REBALANCE_COMPLETE",</div><div class='add'>+</div><div class='add'>+    #tier events</div><div class='add'>+    "EVENT_TIER_START",</div><div class='add'>+    "EVENT_TIER_START_FORCE",</div><div class='add'>+</div><div class='add'>+    #brick/inodes events</div><div class='add'>+    "EVENT_DHT_DISK_USAGE",</div><div class='add'>+    "EVENT_DHT_INODES_USAGE",</div><div class='add'>+)</div><div class='add'>+</div><div class='add'>+LAST_EVENT = "EVENT_LAST"</div><div class='add'>+</div><div class='add'>+ERRORS = (</div><div class='add'>+    "EVENT_SEND_OK",</div><div class='add'>+    "EVENT_ERROR_INVALID_INPUTS",</div><div class='add'>+    "EVENT_ERROR_SOCKET",</div><div class='add'>+    "EVENT_ERROR_CONNECT",</div><div class='add'>+    "EVENT_ERROR_SEND",</div><div class='add'>+    "EVENT_ERROR_RESOLVE",</div><div class='add'>+    "EVENT_ERROR_MSG_FORMAT",</div><div class='add'>+)</div><div class='add'>+</div><div class='add'>+if gen_header_type == "C_HEADER":</div><div class='add'>+    # Generate eventtypes.h</div><div class='add'>+    with open(eventtypes_h, "w") as f:</div><div class='add'>+        f.write("#ifndef __EVENTTYPES_H__\n")</div><div class='add'>+        f.write("#define __EVENTTYPES_H__\n\n")</div><div class='add'>+        f.write("typedef enum {\n")</div><div class='add'>+        for k in ERRORS:</div><div class='add'>+            f.write("    {0},\n".format(k))</div><div class='add'>+        f.write("} event_errors_t;\n")</div><div class='add'>+</div><div class='add'>+        f.write("\n")</div><div class='add'>+</div><div class='add'>+        f.write("typedef enum {\n")</div><div class='add'>+        for k in keys:</div><div class='add'>+            f.write("    {0},\n".format(k))</div><div class='add'>+</div><div class='add'>+        f.write("    {0}\n".format(LAST_EVENT))</div><div class='add'>+        f.write("} eventtypes_t;\n")</div><div class='add'>+        f.write("\n#endif /* __EVENTTYPES_H__ */\n")</div><div class='add'>+</div><div class='add'>+if gen_header_type == "PY_HEADER":</div><div class='add'>+    # Generate eventtypes.py</div><div class='add'>+    with open(eventtypes_py, "w") as f:</div><div class='add'>+        f.write("# -*- coding: utf-8 -*-\n")</div><div class='add'>+        f.write("all_events = [\n")</div><div class='add'>+        for ev in keys:</div><div class='add'>+            f.write('    "{0}",\n'.format(ev))</div><div class='add'>+</div><div class='add'>+        f.write("]\n\n")</div><div class='add'>+</div><div class='add'>+        for idx, ev in enumerate(keys):</div><div class='add'>+            f.write("{0} = {1}\n".format(ev.replace("EVENT_", ""), idx))</div><div class='head'>diff --git a/events/src/Makefile.am b/events/src/Makefile.am<br/>new file mode 100644<br/>index 00000000000..3b229691897<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/events/src/Makefile.am?id=d1d7a6f35c816822fab51c820e25023863c239c1'>events/src/Makefile.am</a></div><div class='hunk'>@@ -0,0 +1,41 @@</div><div class='add'>+noinst_PYTHON = $(top_srcdir)/events/eventskeygen.py</div><div class='add'>+EXTRA_DIST = glustereventsd.py __init__.py  eventsapiconf.py.in \</div><div class='add'>+	handlers.py utils.py peer_eventsapi.py eventsconfig.json gf_event.py</div><div class='add'>+</div><div class='add'>+BUILT_SOURCES = eventtypes.py</div><div class='add'>+CLEANFILES = eventtypes.py</div><div class='add'>+</div><div class='add'>+eventsdir = $(GLUSTERFS_LIBEXECDIR)/gfevents</div><div class='add'>+if BUILD_EVENTS</div><div class='add'>+events_PYTHON = __init__.py gf_event.py eventsapiconf.py eventtypes.py \</div><div class='add'>+	utils.py</div><div class='add'>+endif</div><div class='add'>+# this does not work, see the Makefile.am in the root for a workaround</div><div class='add'>+#nodist_events_PYTHON = eventtypes.py</div><div class='add'>+</div><div class='add'>+eventtypes.py: $(top_srcdir)/events/eventskeygen.py</div><div class='add'>+	$(PYTHON) $(top_srcdir)/events/eventskeygen.py PY_HEADER</div><div class='add'>+</div><div class='add'>+if BUILD_EVENTS</div><div class='add'>+eventspeerscriptdir = $(GLUSTERFS_LIBEXECDIR)</div><div class='add'>+eventsconfdir = $(sysconfdir)/glusterfs</div><div class='add'>+eventsconf_DATA = eventsconfig.json</div><div class='add'>+</div><div class='add'>+events_PYTHON += handlers.py</div><div class='add'>+events_SCRIPTS = glustereventsd.py</div><div class='add'>+eventspeerscript_SCRIPTS = peer_eventsapi.py</div><div class='add'>+</div><div class='add'>+install-exec-hook:</div><div class='add'>+	$(mkdir_p) $(DESTDIR)$(sbindir)</div><div class='add'>+	rm -f $(DESTDIR)$(sbindir)/glustereventsd</div><div class='add'>+	ln -s $(GLUSTERFS_LIBEXECDIR)/gfevents/glustereventsd.py \</div><div class='add'>+		$(DESTDIR)$(sbindir)/glustereventsd</div><div class='add'>+	rm -f $(DESTDIR)$(sbindir)/gluster-eventsapi</div><div class='add'>+	ln -s $(GLUSTERFS_LIBEXECDIR)/peer_eventsapi.py \</div><div class='add'>+		$(DESTDIR)$(sbindir)/gluster-eventsapi</div><div class='add'>+</div><div class='add'>+uninstall-hook:</div><div class='add'>+	rm -f $(DESTDIR)$(sbindir)/glustereventsd</div><div class='add'>+	rm -f $(DESTDIR)$(sbindir)/gluster-eventsapi</div><div class='add'>+</div><div class='add'>+endif</div><div class='head'>diff --git a/events/src/__init__.py b/events/src/__init__.py<br/>new file mode 100644<br/>index 00000000000..f27c53a4df4<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/events/src/__init__.py?id=d1d7a6f35c816822fab51c820e25023863c239c1'>events/src/__init__.py</a></div><div class='hunk'>@@ -0,0 +1,10 @@</div><div class='add'>+# -*- coding: utf-8 -*-</div><div class='add'>+#</div><div class='add'>+#  Copyright (c) 2016 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+#  This file is part of GlusterFS.</div><div class='add'>+#</div><div class='add'>+#  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+#  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+#  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+#  cases as published by the Free Software Foundation.</div><div class='add'>+#</div><div class='head'>diff --git a/events/src/eventsapiconf.py.in b/events/src/eventsapiconf.py.in<br/>new file mode 100644<br/>index 00000000000..700093bee60<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/events/src/eventsapiconf.py.in?id=d1d7a6f35c816822fab51c820e25023863c239c1'>events/src/eventsapiconf.py.in</a></div><div class='hunk'>@@ -0,0 +1,59 @@</div><div class='add'>+# -*- coding: utf-8 -*-</div><div class='add'>+#</div><div class='add'>+#  Copyright (c) 2016 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+#  This file is part of GlusterFS.</div><div class='add'>+#</div><div class='add'>+#  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+#  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+#  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+#  cases as published by the Free Software Foundation.</div><div class='add'>+#</div><div class='add'>+</div><div class='add'>+import subprocess</div><div class='add'>+glusterd_workdir = None</div><div class='add'>+</div><div class='add'>+# Methods</div><div class='add'>+def get_glusterd_workdir():</div><div class='add'>+    global glusterd_workdir</div><div class='add'>+    if glusterd_workdir is not None:</div><div class='add'>+        return glusterd_workdir</div><div class='add'>+    proc = subprocess.Popen(["gluster", "system::", "getwd"],</div><div class='add'>+                            stdout=subprocess.PIPE, stderr=subprocess.PIPE,</div><div class='add'>+                            universal_newlines = True)</div><div class='add'>+    out, err = proc.communicate()</div><div class='add'>+    if proc.returncode == 0:</div><div class='add'>+        glusterd_workdir = out.strip()</div><div class='add'>+    else:</div><div class='add'>+        glusterd_workdir = "@GLUSTERD_WORKDIR@"</div><div class='add'>+    return glusterd_workdir</div><div class='add'>+</div><div class='add'>+SERVER_ADDRESS = "0.0.0.0"</div><div class='add'>+SERVER_ADDRESSv4 = "0.0.0.0"</div><div class='add'>+SERVER_ADDRESSv6 = "::1"</div><div class='add'>+DEFAULT_CONFIG_FILE = "@SYSCONF_DIR@/glusterfs/eventsconfig.json"</div><div class='add'>+CUSTOM_CONFIG_FILE_TO_SYNC = "/events/config.json"</div><div class='add'>+CUSTOM_CONFIG_FILE = get_glusterd_workdir() + CUSTOM_CONFIG_FILE_TO_SYNC</div><div class='add'>+WEBHOOKS_FILE_TO_SYNC = "/events/webhooks.json"</div><div class='add'>+WEBHOOKS_FILE = get_glusterd_workdir() + WEBHOOKS_FILE_TO_SYNC</div><div class='add'>+LOG_FILE = "@localstatedir@/log/glusterfs/events.log"</div><div class='add'>+EVENTSD = "glustereventsd"</div><div class='add'>+CONFIG_KEYS = ["log-level", "port", "disable-events-log"]</div><div class='add'>+BOOL_CONFIGS = ["disable-events-log"]</div><div class='add'>+INT_CONFIGS = ["port"]</div><div class='add'>+RESTART_CONFIGS = ["port"]</div><div class='add'>+EVENTS_ENABLED = @EVENTS_ENABLED@</div><div class='add'>+UUID_FILE = get_glusterd_workdir() + "/glusterd.info"</div><div class='add'>+PID_FILE = "@localstatedir@/run/glustereventsd.pid"</div><div class='add'>+AUTO_BOOL_ATTRIBUTES = ["force", "push-pem", "no-verify"]</div><div class='add'>+AUTO_INT_ATTRIBUTES = ["ssh-port"]</div><div class='add'>+CERTS_DIR = get_glusterd_workdir() + "/events"</div><div class='add'>+</div><div class='add'>+# Errors</div><div class='add'>+ERROR_SAME_CONFIG = 2</div><div class='add'>+ERROR_ALL_NODES_STATUS_NOT_OK = 3</div><div class='add'>+ERROR_PARTIAL_SUCCESS = 4</div><div class='add'>+ERROR_WEBHOOK_ALREADY_EXISTS = 5</div><div class='add'>+ERROR_WEBHOOK_NOT_EXISTS = 6</div><div class='add'>+ERROR_INVALID_CONFIG = 7</div><div class='add'>+ERROR_WEBHOOK_SYNC_FAILED = 8</div><div class='add'>+ERROR_CONFIG_SYNC_FAILED = 9</div><div class='head'>diff --git a/events/src/eventsconfig.json b/events/src/eventsconfig.json<br/>new file mode 100644<br/>index 00000000000..89e5b9c1d68<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/events/src/eventsconfig.json?id=d1d7a6f35c816822fab51c820e25023863c239c1'>events/src/eventsconfig.json</a></div><div class='hunk'>@@ -0,0 +1,5 @@</div><div class='add'>+{</div><div class='add'>+    "log-level": "INFO",</div><div class='add'>+    "port": 24009,</div><div class='add'>+    "disable-events-log": false</div><div class='add'>+}</div><div class='head'>diff --git a/events/src/gf_event.py b/events/src/gf_event.py<br/>new file mode 100644<br/>index 00000000000..260b0d9aa48<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/events/src/gf_event.py?id=d1d7a6f35c816822fab51c820e25023863c239c1'>events/src/gf_event.py</a></div><div class='hunk'>@@ -0,0 +1,60 @@</div><div class='add'>+# -*- coding: utf-8 -*-</div><div class='add'>+#</div><div class='add'>+#  Copyright (c) 2016 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+#  This file is part of GlusterFS.</div><div class='add'>+#</div><div class='add'>+#  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+#  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+#  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+#  cases as published by the Free Software Foundation.</div><div class='add'>+#</div><div class='add'>+</div><div class='add'>+import socket</div><div class='add'>+import time</div><div class='add'>+</div><div class='add'>+from gfevents.eventsapiconf import SERVER_ADDRESS, EVENTS_ENABLED</div><div class='add'>+from gfevents.eventtypes import all_events</div><div class='add'>+</div><div class='add'>+from gfevents.utils import logger, setup_logger, get_config</div><div class='add'>+</div><div class='add'>+# Run this when this lib loads</div><div class='add'>+setup_logger()</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def gf_event(event_type, **kwargs):</div><div class='add'>+    if EVENTS_ENABLED == 0:</div><div class='add'>+        return</div><div class='add'>+</div><div class='add'>+    if not isinstance(event_type, int) or event_type &gt;= len(all_events):</div><div class='add'>+        logger.error("Invalid Event Type: {0}".format(event_type))</div><div class='add'>+        return</div><div class='add'>+</div><div class='add'>+    try:</div><div class='add'>+        client = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)</div><div class='add'>+    except socket.error as e:</div><div class='add'>+        logger.error("Unable to connect to events Server: {0}".format(e))</div><div class='add'>+        return</div><div class='add'>+</div><div class='add'>+    port = get_config("port")</div><div class='add'>+    if port is None:</div><div class='add'>+        logger.error("Unable to get eventsd port details")</div><div class='add'>+        return</div><div class='add'>+</div><div class='add'>+    # Convert key value args into KEY1=VALUE1;KEY2=VALUE2;..</div><div class='add'>+    msg = ""</div><div class='add'>+    for k, v in kwargs.items():</div><div class='add'>+        msg += "{0}={1};".format(k, v)</div><div class='add'>+</div><div class='add'>+    # &lt;TIMESTAMP&gt; &lt;EVENT_TYPE&gt; &lt;MSG&gt;</div><div class='add'>+    msg = "{0} {1} {2}".format(int(time.time()), event_type, msg.strip(";")).encode()</div><div class='add'>+</div><div class='add'>+    try:</div><div class='add'>+        sent = client.sendto(msg, (SERVER_ADDRESS, port))</div><div class='add'>+        assert sent == len(msg)</div><div class='add'>+    except socket.error as e:</div><div class='add'>+        logger.error("Unable to Send message: {0}".format(e))</div><div class='add'>+    except AssertionError:</div><div class='add'>+        logger.error("Unable to send message. Sent: {0}, Actual: {1}".format(</div><div class='add'>+            sent, len(msg)))</div><div class='add'>+    finally:</div><div class='add'>+        client.close()</div><div class='head'>diff --git a/events/src/glustereventsd.py b/events/src/glustereventsd.py<br/>new file mode 100644<br/>index 00000000000..341a3b60947<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/events/src/glustereventsd.py?id=d1d7a6f35c816822fab51c820e25023863c239c1'>events/src/glustereventsd.py</a></div><div class='hunk'>@@ -0,0 +1,159 @@</div><div class='add'>+#!/usr/bin/python3</div><div class='add'>+# -*- coding: utf-8 -*-</div><div class='add'>+#</div><div class='add'>+#  Copyright (c) 2016 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+#  This file is part of GlusterFS.</div><div class='add'>+#</div><div class='add'>+#  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+#  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+#  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+#  cases as published by the Free Software Foundation.</div><div class='add'>+#</div><div class='add'>+</div><div class='add'>+from __future__ import print_function</div><div class='add'>+import sys</div><div class='add'>+import signal</div><div class='add'>+import threading</div><div class='add'>+try:</div><div class='add'>+    import socketserver</div><div class='add'>+except ImportError:</div><div class='add'>+    import SocketServer as socketserver</div><div class='add'>+import socket</div><div class='add'>+from argparse import ArgumentParser, RawDescriptionHelpFormatter</div><div class='add'>+</div><div class='add'>+from eventtypes import all_events</div><div class='add'>+import handlers</div><div class='add'>+import utils</div><div class='add'>+from eventsapiconf import SERVER_ADDRESSv4, SERVER_ADDRESSv6, PID_FILE</div><div class='add'>+from eventsapiconf import AUTO_BOOL_ATTRIBUTES, AUTO_INT_ATTRIBUTES</div><div class='add'>+from utils import logger, PidFile, PidFileLockFailed, boolify</div><div class='add'>+</div><div class='add'>+# Subclass so that specifically IPv4 packets are captured</div><div class='add'>+class UDPServerv4(socketserver.ThreadingUDPServer):</div><div class='add'>+    address_family = socket.AF_INET</div><div class='add'>+</div><div class='add'>+# Subclass so that specifically IPv6 packets are captured</div><div class='add'>+class UDPServerv6(socketserver.ThreadingUDPServer):</div><div class='add'>+    address_family = socket.AF_INET6</div><div class='add'>+</div><div class='add'>+class GlusterEventsRequestHandler(socketserver.BaseRequestHandler):</div><div class='add'>+</div><div class='add'>+    def handle(self):</div><div class='add'>+        data = self.request[0].strip()</div><div class='add'>+        if sys.version_info &gt;= (3,):</div><div class='add'>+            data = self.request[0].strip().decode("utf-8")</div><div class='add'>+</div><div class='add'>+        logger.debug("EVENT: {0} from {1}".format(repr(data),</div><div class='add'>+                                                  self.client_address[0]))</div><div class='add'>+        try:</div><div class='add'>+            # Event Format &lt;TIMESTAMP&gt; &lt;TYPE&gt; &lt;DETAIL&gt;</div><div class='add'>+            ts, key, value = data.split(" ", 2)</div><div class='add'>+        except ValueError:</div><div class='add'>+            logger.warn("Invalid Event Format {0}".format(data))</div><div class='add'>+            return</div><div class='add'>+</div><div class='add'>+        data_dict = {}</div><div class='add'>+        try:</div><div class='add'>+            # Format key=value;key=value</div><div class='add'>+            data_dict = dict(x.split('=') for x in value.split(';'))</div><div class='add'>+        except ValueError:</div><div class='add'>+            logger.warn("Unable to parse Event {0}".format(data))</div><div class='add'>+            return</div><div class='add'>+</div><div class='add'>+        for k, v in data_dict.items():</div><div class='add'>+            try:</div><div class='add'>+                if k in AUTO_BOOL_ATTRIBUTES:</div><div class='add'>+                    data_dict[k] = boolify(v)</div><div class='add'>+                if k in AUTO_INT_ATTRIBUTES:</div><div class='add'>+                    data_dict[k] = int(v)</div><div class='add'>+            except ValueError:</div><div class='add'>+                # Auto Conversion failed, Retain the old value</div><div class='add'>+                continue</div><div class='add'>+</div><div class='add'>+        try:</div><div class='add'>+            # Event Type to Function Map, Received event data will be in</div><div class='add'>+            # the form &lt;TIMESTAMP&gt; &lt;TYPE&gt; &lt;DETAIL&gt;, Get Event name for the</div><div class='add'>+            # received Type/Key and construct a function name starting with</div><div class='add'>+            # handle_ For example: handle_event_volume_create</div><div class='add'>+            func_name = "handle_" + all_events[int(key)].lower()</div><div class='add'>+        except IndexError:</div><div class='add'>+            # This type of Event is not handled?</div><div class='add'>+            logger.warn("Unhandled Event: {0}".format(key))</div><div class='add'>+            func_name = None</div><div class='add'>+</div><div class='add'>+        if func_name is not None:</div><div class='add'>+            # Get function from handlers module</div><div class='add'>+            func = getattr(handlers, func_name, None)</div><div class='add'>+            # If func is None, then handler unimplemented for that event.</div><div class='add'>+            if func is not None:</div><div class='add'>+                func(ts, int(key), data_dict)</div><div class='add'>+            else:</div><div class='add'>+                # Generic handler, broadcast whatever received</div><div class='add'>+                handlers.generic_handler(ts, int(key), data_dict)</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def signal_handler_sigusr2(sig, frame):</div><div class='add'>+    utils.load_all()</div><div class='add'>+    utils.restart_webhook_pool()</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def UDP_server_thread(sock):</div><div class='add'>+    sock.serve_forever()</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def init_event_server():</div><div class='add'>+    utils.setup_logger()</div><div class='add'>+    utils.load_all()</div><div class='add'>+    utils.init_webhook_pool()</div><div class='add'>+</div><div class='add'>+    port = utils.get_config("port")</div><div class='add'>+    if port is None:</div><div class='add'>+        sys.stderr.write("Unable to get Port details from Config\n")</div><div class='add'>+        sys.exit(1)</div><div class='add'>+</div><div class='add'>+    # Creating the Eventing Server, UDP Server for IPv4 packets</div><div class='add'>+    try:</div><div class='add'>+        serverv4 = UDPServerv4((SERVER_ADDRESSv4, port),</div><div class='add'>+                   GlusterEventsRequestHandler)</div><div class='add'>+    except socket.error as e:</div><div class='add'>+        sys.stderr.write("Failed to start Eventsd for IPv4: {0}\n".format(e))</div><div class='add'>+        sys.exit(1)</div><div class='add'>+    # Creating the Eventing Server, UDP Server for IPv6 packets</div><div class='add'>+    try:</div><div class='add'>+        serverv6 = UDPServerv6((SERVER_ADDRESSv6, port),</div><div class='add'>+                   GlusterEventsRequestHandler)</div><div class='add'>+    except socket.error as e:</div><div class='add'>+        sys.stderr.write("Failed to start Eventsd for IPv6: {0}\n".format(e))</div><div class='add'>+        sys.exit(1)</div><div class='add'>+    server_thread1 = threading.Thread(target=UDP_server_thread,</div><div class='add'>+                     args=(serverv4,))</div><div class='add'>+    server_thread2 = threading.Thread(target=UDP_server_thread,</div><div class='add'>+                     args=(serverv6,))</div><div class='add'>+    server_thread1.start()</div><div class='add'>+    server_thread2.start()</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def get_args():</div><div class='add'>+    parser = ArgumentParser(formatter_class=RawDescriptionHelpFormatter,</div><div class='add'>+                            description=__doc__)</div><div class='add'>+    parser.add_argument("-p", "--pid-file", help="PID File",</div><div class='add'>+                        default=PID_FILE)</div><div class='add'>+</div><div class='add'>+    return parser.parse_args()</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def main():</div><div class='add'>+    args = get_args()</div><div class='add'>+    try:</div><div class='add'>+        with PidFile(args.pid_file):</div><div class='add'>+            init_event_server()</div><div class='add'>+    except PidFileLockFailed as e:</div><div class='add'>+        sys.stderr.write("Failed to get lock for pid file({0}): {1}".format(</div><div class='add'>+            args.pid_file, e))</div><div class='add'>+    except KeyboardInterrupt:</div><div class='add'>+        sys.exit(1)</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+if __name__ == "__main__":</div><div class='add'>+    signal.signal(signal.SIGUSR2, signal_handler_sigusr2)</div><div class='add'>+    main()</div><div class='head'>diff --git a/events/src/handlers.py b/events/src/handlers.py<br/>new file mode 100644<br/>index 00000000000..7746d488bf3<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/events/src/handlers.py?id=d1d7a6f35c816822fab51c820e25023863c239c1'>events/src/handlers.py</a></div><div class='hunk'>@@ -0,0 +1,40 @@</div><div class='add'>+# -*- coding: utf-8 -*-</div><div class='add'>+#</div><div class='add'>+#  Copyright (c) 2016 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+#  This file is part of GlusterFS.</div><div class='add'>+#</div><div class='add'>+#  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+#  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+#  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+#  cases as published by the Free Software Foundation.</div><div class='add'>+#</div><div class='add'>+</div><div class='add'>+import utils</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def generic_handler(ts, key, data):</div><div class='add'>+    """</div><div class='add'>+    Generic handler to broadcast message to all peers, custom handlers</div><div class='add'>+    can be created by func name handler_&lt;event_name&gt;</div><div class='add'>+    Ex: handle_event_volume_create(ts, key, data)</div><div class='add'>+    """</div><div class='add'>+    utils.publish(ts, key, data)</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def handle_event_volume_set(ts, key, data):</div><div class='add'>+    """</div><div class='add'>+    Received data will have all the options as one string, split into</div><div class='add'>+    list of options. "key1,value1,key2,value2" into</div><div class='add'>+    [[key1, value1], [key2, value2]]</div><div class='add'>+    """</div><div class='add'>+    opts = data.get("options", "").strip(",").split(",")</div><div class='add'>+    data["options"] = []</div><div class='add'>+    for i, opt in enumerate(opts):</div><div class='add'>+        if i % 2 == 0:</div><div class='add'>+            # Add new array with key</div><div class='add'>+            data["options"].append([opt])</div><div class='add'>+        else:</div><div class='add'>+            # Add to the last added array</div><div class='add'>+            data["options"][-1].append(opt)</div><div class='add'>+</div><div class='add'>+    utils.publish(ts, key, data)</div><div class='head'>diff --git a/events/src/peer_eventsapi.py b/events/src/peer_eventsapi.py<br/>new file mode 100644<br/>index 00000000000..4d2e5f35b1c<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/events/src/peer_eventsapi.py?id=d1d7a6f35c816822fab51c820e25023863c239c1'>events/src/peer_eventsapi.py</a></div><div class='hunk'>@@ -0,0 +1,669 @@</div><div class='add'>+#!/usr/bin/python3</div><div class='add'>+# -*- coding: utf-8 -*-</div><div class='add'>+#</div><div class='add'>+#  Copyright (c) 2016 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+#  This file is part of GlusterFS.</div><div class='add'>+#</div><div class='add'>+#  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+#  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+#  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+#  cases as published by the Free Software Foundation.</div><div class='add'>+#</div><div class='add'>+</div><div class='add'>+from __future__ import print_function</div><div class='add'>+import os</div><div class='add'>+import json</div><div class='add'>+from errno import EEXIST</div><div class='add'>+import fcntl</div><div class='add'>+from errno import EACCES, EAGAIN</div><div class='add'>+import signal</div><div class='add'>+import sys</div><div class='add'>+import time</div><div class='add'>+</div><div class='add'>+import requests</div><div class='add'>+from prettytable import PrettyTable</div><div class='add'>+</div><div class='add'>+from gluster.cliutils import (Cmd, node_output_ok, node_output_notok,</div><div class='add'>+                              sync_file_to_peers, GlusterCmdException,</div><div class='add'>+                              output_error, execute_in_peers, runcli,</div><div class='add'>+                              set_common_args_func)</div><div class='add'>+from gfevents.utils import LockedOpen, get_jwt_token, save_https_cert</div><div class='add'>+</div><div class='add'>+from gfevents.eventsapiconf import (WEBHOOKS_FILE_TO_SYNC,</div><div class='add'>+                                    WEBHOOKS_FILE,</div><div class='add'>+                                    DEFAULT_CONFIG_FILE,</div><div class='add'>+                                    CUSTOM_CONFIG_FILE,</div><div class='add'>+                                    CUSTOM_CONFIG_FILE_TO_SYNC,</div><div class='add'>+                                    EVENTSD,</div><div class='add'>+                                    CONFIG_KEYS,</div><div class='add'>+                                    BOOL_CONFIGS,</div><div class='add'>+                                    INT_CONFIGS,</div><div class='add'>+                                    PID_FILE,</div><div class='add'>+                                    RESTART_CONFIGS,</div><div class='add'>+                                    ERROR_INVALID_CONFIG,</div><div class='add'>+                                    ERROR_WEBHOOK_NOT_EXISTS,</div><div class='add'>+                                    ERROR_CONFIG_SYNC_FAILED,</div><div class='add'>+                                    ERROR_WEBHOOK_ALREADY_EXISTS,</div><div class='add'>+                                    ERROR_PARTIAL_SUCCESS,</div><div class='add'>+                                    ERROR_ALL_NODES_STATUS_NOT_OK,</div><div class='add'>+                                    ERROR_SAME_CONFIG,</div><div class='add'>+                                    ERROR_WEBHOOK_SYNC_FAILED,</div><div class='add'>+                                    CERTS_DIR)</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def handle_output_error(err, errcode=1, json_output=False):</div><div class='add'>+    if json_output:</div><div class='add'>+        print (json.dumps({</div><div class='add'>+            "output": "",</div><div class='add'>+            "error": err</div><div class='add'>+            }))</div><div class='add'>+        sys.exit(errcode)</div><div class='add'>+    else:</div><div class='add'>+        output_error(err, errcode)</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def file_content_overwrite(fname, data):</div><div class='add'>+    with open(fname + ".tmp", "w") as f:</div><div class='add'>+        f.write(json.dumps(data))</div><div class='add'>+</div><div class='add'>+    os.rename(fname + ".tmp", fname)</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def create_custom_config_file_if_not_exists(args):</div><div class='add'>+    try:</div><div class='add'>+        config_dir = os.path.dirname(CUSTOM_CONFIG_FILE)</div><div class='add'>+        mkdirp(config_dir)</div><div class='add'>+    except OSError as e:</div><div class='add'>+        handle_output_error("Failed to create dir %s: %s" % (config_dir, e),</div><div class='add'>+                            json_output=args.json)</div><div class='add'>+</div><div class='add'>+    if not os.path.exists(CUSTOM_CONFIG_FILE):</div><div class='add'>+        with open(CUSTOM_CONFIG_FILE, "w") as f:</div><div class='add'>+            f.write("{}")</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def create_webhooks_file_if_not_exists(args):</div><div class='add'>+    try:</div><div class='add'>+        webhooks_dir = os.path.dirname(WEBHOOKS_FILE)</div><div class='add'>+        mkdirp(webhooks_dir)</div><div class='add'>+    except OSError as e:</div><div class='add'>+        handle_output_error("Failed to create dir %s: %s" % (webhooks_dir, e),</div><div class='add'>+                            json_output=args.json)</div><div class='add'>+</div><div class='add'>+    if not os.path.exists(WEBHOOKS_FILE):</div><div class='add'>+        with open(WEBHOOKS_FILE, "w") as f:</div><div class='add'>+            f.write("{}")</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def boolify(value):</div><div class='add'>+    val = False</div><div class='add'>+    if value.lower() in ["enabled", "true", "on", "yes"]:</div><div class='add'>+        val = True</div><div class='add'>+    return val</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def mkdirp(path, exit_on_err=False, logger=None):</div><div class='add'>+    """</div><div class='add'>+    Try creating required directory structure</div><div class='add'>+    ignore EEXIST and raise exception for rest of the errors.</div><div class='add'>+    Print error in stderr and exit</div><div class='add'>+    """</div><div class='add'>+    try:</div><div class='add'>+        os.makedirs(path)</div><div class='add'>+    except OSError as e:</div><div class='add'>+        if e.errno != EEXIST or not os.path.isdir(path):</div><div class='add'>+            raise</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def is_active():</div><div class='add'>+    state = False</div><div class='add'>+    try:</div><div class='add'>+        with open(PID_FILE, "a+") as f:</div><div class='add'>+            fcntl.flock(f.fileno(), fcntl.LOCK_EX | fcntl.LOCK_NB)</div><div class='add'>+            state = False</div><div class='add'>+    except (IOError, OSError) as e:</div><div class='add'>+        if e.errno in (EACCES, EAGAIN):</div><div class='add'>+            # cannot grab. so, process still running..move on</div><div class='add'>+            state = True</div><div class='add'>+        else:</div><div class='add'>+            state = False</div><div class='add'>+    return state</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def reload_service():</div><div class='add'>+    pid = None</div><div class='add'>+    if is_active():</div><div class='add'>+        with open(PID_FILE) as f:</div><div class='add'>+            try:</div><div class='add'>+                pid = int(f.read().strip())</div><div class='add'>+            except ValueError:</div><div class='add'>+                pid = None</div><div class='add'>+        if pid is not None:</div><div class='add'>+            os.kill(pid, signal.SIGUSR2)</div><div class='add'>+</div><div class='add'>+    return (0, "", "")</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def rows_to_json(json_out, column_name, rows):</div><div class='add'>+    num_ok_rows = 0</div><div class='add'>+    for row in rows:</div><div class='add'>+        num_ok_rows += 1 if row.ok else 0</div><div class='add'>+        json_out.append({</div><div class='add'>+            "node": row.hostname,</div><div class='add'>+            "node_status": "UP" if row.node_up else "DOWN",</div><div class='add'>+            column_name: "OK" if row.ok else "NOT OK",</div><div class='add'>+            "error": row.error</div><div class='add'>+        })</div><div class='add'>+    return num_ok_rows</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def rows_to_table(table, rows):</div><div class='add'>+    num_ok_rows = 0</div><div class='add'>+    for row in rows:</div><div class='add'>+        num_ok_rows += 1 if row.ok else 0</div><div class='add'>+        table.add_row([row.hostname,</div><div class='add'>+                       "UP" if row.node_up else "DOWN",</div><div class='add'>+                       "OK" if row.ok else "NOT OK: {0}".format(</div><div class='add'>+                           row.error)])</div><div class='add'>+    return num_ok_rows</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def sync_to_peers(args):</div><div class='add'>+    if os.path.exists(WEBHOOKS_FILE):</div><div class='add'>+        try:</div><div class='add'>+            sync_file_to_peers(WEBHOOKS_FILE_TO_SYNC)</div><div class='add'>+        except GlusterCmdException as e:</div><div class='add'>+            # Print stdout if stderr is empty</div><div class='add'>+            errmsg = e.message[2] if e.message[2] else e.message[1]</div><div class='add'>+            handle_output_error("Failed to sync Webhooks file: [Error: {0}]"</div><div class='add'>+                                "{1}".format(e.message[0], errmsg),</div><div class='add'>+                                errcode=ERROR_WEBHOOK_SYNC_FAILED,</div><div class='add'>+                                json_output=args.json)</div><div class='add'>+</div><div class='add'>+    if os.path.exists(CUSTOM_CONFIG_FILE):</div><div class='add'>+        try:</div><div class='add'>+            sync_file_to_peers(CUSTOM_CONFIG_FILE_TO_SYNC)</div><div class='add'>+        except GlusterCmdException as e:</div><div class='add'>+            # Print stdout if stderr is empty</div><div class='add'>+            errmsg = e.message[2] if e.message[2] else e.message[1]</div><div class='add'>+            handle_output_error("Failed to sync Config file: [Error: {0}]"</div><div class='add'>+                                "{1}".format(e.message[0], errmsg),</div><div class='add'>+                                errcode=ERROR_CONFIG_SYNC_FAILED,</div><div class='add'>+                                json_output=args.json)</div><div class='add'>+</div><div class='add'>+    out = execute_in_peers("node-reload")</div><div class='add'>+    if not args.json:</div><div class='add'>+        table = PrettyTable(["NODE", "NODE STATUS", "SYNC STATUS"])</div><div class='add'>+        table.align["NODE STATUS"] = "r"</div><div class='add'>+        table.align["SYNC STATUS"] = "r"</div><div class='add'>+</div><div class='add'>+    json_out = []</div><div class='add'>+    if args.json:</div><div class='add'>+        num_ok_rows = rows_to_json(json_out, "sync_status", out)</div><div class='add'>+    else:</div><div class='add'>+        num_ok_rows = rows_to_table(table, out)</div><div class='add'>+</div><div class='add'>+    ret = 0</div><div class='add'>+    if num_ok_rows == 0:</div><div class='add'>+        ret = ERROR_ALL_NODES_STATUS_NOT_OK</div><div class='add'>+    elif num_ok_rows != len(out):</div><div class='add'>+        ret = ERROR_PARTIAL_SUCCESS</div><div class='add'>+</div><div class='add'>+    if args.json:</div><div class='add'>+        print (json.dumps({</div><div class='add'>+            "output": json_out,</div><div class='add'>+            "error": ""</div><div class='add'>+        }))</div><div class='add'>+    else:</div><div class='add'>+        print (table)</div><div class='add'>+</div><div class='add'>+    # If sync status is not ok for any node set error code as partial success</div><div class='add'>+    sys.exit(ret)</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def node_output_handle(resp):</div><div class='add'>+    rc, out, err = resp</div><div class='add'>+    if rc == 0:</div><div class='add'>+        node_output_ok(out)</div><div class='add'>+    else:</div><div class='add'>+        node_output_notok(err)</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def action_handle(action, json_output=False):</div><div class='add'>+    out = execute_in_peers("node-" + action)</div><div class='add'>+    column_name = action.upper()</div><div class='add'>+    if action == "status":</div><div class='add'>+        column_name = EVENTSD.upper()</div><div class='add'>+</div><div class='add'>+    if not json_output:</div><div class='add'>+        table = PrettyTable(["NODE", "NODE STATUS", column_name + " STATUS"])</div><div class='add'>+        table.align["NODE STATUS"] = "r"</div><div class='add'>+        table.align[column_name + " STATUS"] = "r"</div><div class='add'>+</div><div class='add'>+    json_out = []</div><div class='add'>+    if json_output:</div><div class='add'>+        rows_to_json(json_out, column_name.lower() + "_status", out)</div><div class='add'>+    else:</div><div class='add'>+        rows_to_table(table, out)</div><div class='add'>+</div><div class='add'>+    return json_out if json_output else table</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+class NodeReload(Cmd):</div><div class='add'>+    name = "node-reload"</div><div class='add'>+</div><div class='add'>+    def run(self, args):</div><div class='add'>+        node_output_handle(reload_service())</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+class ReloadCmd(Cmd):</div><div class='add'>+    name = "reload"</div><div class='add'>+</div><div class='add'>+    def run(self, args):</div><div class='add'>+        out = action_handle("reload", args.json)</div><div class='add'>+        if args.json:</div><div class='add'>+            print (json.dumps({</div><div class='add'>+                "output": out,</div><div class='add'>+                "error": ""</div><div class='add'>+            }))</div><div class='add'>+        else:</div><div class='add'>+            print (out)</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+class NodeStatus(Cmd):</div><div class='add'>+    name = "node-status"</div><div class='add'>+</div><div class='add'>+    def run(self, args):</div><div class='add'>+        node_output_ok("UP" if is_active() else "DOWN")</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+class StatusCmd(Cmd):</div><div class='add'>+    name = "status"</div><div class='add'>+</div><div class='add'>+    def run(self, args):</div><div class='add'>+        webhooks = {}</div><div class='add'>+        if os.path.exists(WEBHOOKS_FILE):</div><div class='add'>+            webhooks = json.load(open(WEBHOOKS_FILE))</div><div class='add'>+</div><div class='add'>+        json_out = {"webhooks": [], "data": []}</div><div class='add'>+        if args.json:</div><div class='add'>+            json_out["webhooks"] = webhooks.keys()</div><div class='add'>+        else:</div><div class='add'>+            print ("Webhooks: " + ("" if webhooks else "None"))</div><div class='add'>+            for w in webhooks:</div><div class='add'>+                print (w)</div><div class='add'>+</div><div class='add'>+            print ()</div><div class='add'>+</div><div class='add'>+        out = action_handle("status", args.json)</div><div class='add'>+        if args.json:</div><div class='add'>+            json_out["data"] = out</div><div class='add'>+            print (json.dumps({</div><div class='add'>+                "output": json_out,</div><div class='add'>+                "error": ""</div><div class='add'>+            }))</div><div class='add'>+        else:</div><div class='add'>+            print (out)</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+class WebhookAddCmd(Cmd):</div><div class='add'>+    name = "webhook-add"</div><div class='add'>+</div><div class='add'>+    def args(self, parser):</div><div class='add'>+        parser.add_argument("url", help="URL of Webhook")</div><div class='add'>+        parser.add_argument("--bearer_token", "-t", help="Bearer Token",</div><div class='add'>+                            default="")</div><div class='add'>+        parser.add_argument("--secret", "-s",</div><div class='add'>+                            help="Secret to add JWT Bearer Token", default="")</div><div class='add'>+</div><div class='add'>+    def run(self, args):</div><div class='add'>+        create_webhooks_file_if_not_exists(args)</div><div class='add'>+</div><div class='add'>+        with LockedOpen(WEBHOOKS_FILE, 'r+'):</div><div class='add'>+            data = json.load(open(WEBHOOKS_FILE))</div><div class='add'>+            if data.get(args.url, None) is not None:</div><div class='add'>+                handle_output_error("Webhook already exists",</div><div class='add'>+                                    errcode=ERROR_WEBHOOK_ALREADY_EXISTS,</div><div class='add'>+                                    json_output=args.json)</div><div class='add'>+</div><div class='add'>+            data[args.url] = {"token": args.bearer_token,</div><div class='add'>+                              "secret": args.secret}</div><div class='add'>+            file_content_overwrite(WEBHOOKS_FILE, data)</div><div class='add'>+</div><div class='add'>+        sync_to_peers(args)</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+class WebhookModCmd(Cmd):</div><div class='add'>+    name = "webhook-mod"</div><div class='add'>+</div><div class='add'>+    def args(self, parser):</div><div class='add'>+        parser.add_argument("url", help="URL of Webhook")</div><div class='add'>+        parser.add_argument("--bearer_token", "-t", help="Bearer Token",</div><div class='add'>+                            default="")</div><div class='add'>+        parser.add_argument("--secret", "-s",</div><div class='add'>+                            help="Secret to add JWT Bearer Token", default="")</div><div class='add'>+</div><div class='add'>+    def run(self, args):</div><div class='add'>+        create_webhooks_file_if_not_exists(args)</div><div class='add'>+</div><div class='add'>+        with LockedOpen(WEBHOOKS_FILE, 'r+'):</div><div class='add'>+            data = json.load(open(WEBHOOKS_FILE))</div><div class='add'>+            if data.get(args.url, None) is None:</div><div class='add'>+                handle_output_error("Webhook does not exists",</div><div class='add'>+                                    errcode=ERROR_WEBHOOK_NOT_EXISTS,</div><div class='add'>+                                    json_output=args.json)</div><div class='add'>+</div><div class='add'>+            if isinstance(data[args.url], str):</div><div class='add'>+                data[args.url]["token"] = data[args.url]</div><div class='add'>+</div><div class='add'>+            if args.bearer_token != "":</div><div class='add'>+                data[args.url]["token"] = args.bearer_token</div><div class='add'>+</div><div class='add'>+            if args.secret != "":</div><div class='add'>+                data[args.url]["secret"] = args.secret</div><div class='add'>+</div><div class='add'>+            file_content_overwrite(WEBHOOKS_FILE, data)</div><div class='add'>+</div><div class='add'>+        sync_to_peers(args)</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+class WebhookDelCmd(Cmd):</div><div class='add'>+    name = "webhook-del"</div><div class='add'>+</div><div class='add'>+    def args(self, parser):</div><div class='add'>+        parser.add_argument("url", help="URL of Webhook")</div><div class='add'>+</div><div class='add'>+    def run(self, args):</div><div class='add'>+        create_webhooks_file_if_not_exists(args)</div><div class='add'>+</div><div class='add'>+        with LockedOpen(WEBHOOKS_FILE, 'r+'):</div><div class='add'>+            data = json.load(open(WEBHOOKS_FILE))</div><div class='add'>+            if data.get(args.url, None) is None:</div><div class='add'>+                handle_output_error("Webhook does not exists",</div><div class='add'>+                                    errcode=ERROR_WEBHOOK_NOT_EXISTS,</div><div class='add'>+                                    json_output=args.json)</div><div class='add'>+</div><div class='add'>+            del data[args.url]</div><div class='add'>+            file_content_overwrite(WEBHOOKS_FILE, data)</div><div class='add'>+</div><div class='add'>+        sync_to_peers(args)</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+class NodeWebhookTestCmd(Cmd):</div><div class='add'>+    name = "node-webhook-test"</div><div class='add'>+</div><div class='add'>+    def args(self, parser):</div><div class='add'>+        parser.add_argument("url")</div><div class='add'>+        parser.add_argument("bearer_token")</div><div class='add'>+        parser.add_argument("secret")</div><div class='add'>+</div><div class='add'>+    def run(self, args):</div><div class='add'>+        http_headers = {}</div><div class='add'>+        hashval = ""</div><div class='add'>+        if args.bearer_token != ".":</div><div class='add'>+            hashval = args.bearer_token</div><div class='add'>+</div><div class='add'>+        if args.secret != ".":</div><div class='add'>+            hashval = get_jwt_token(args.secret, "TEST", int(time.time()))</div><div class='add'>+</div><div class='add'>+        if hashval:</div><div class='add'>+            http_headers["Authorization"] = "Bearer " + hashval</div><div class='add'>+</div><div class='add'>+        urldata = requests.utils.urlparse(args.url)</div><div class='add'>+        parts = urldata.netloc.split(":")</div><div class='add'>+        domain = parts[0]</div><div class='add'>+        # Default https port if not specified</div><div class='add'>+        port = 443</div><div class='add'>+        if len(parts) == 2:</div><div class='add'>+            port = int(parts[1])</div><div class='add'>+</div><div class='add'>+        cert_path = os.path.join(CERTS_DIR, args.url.replace("/", "_").strip())</div><div class='add'>+        verify = True</div><div class='add'>+        while True:</div><div class='add'>+            try:</div><div class='add'>+                resp = requests.post(args.url, headers=http_headers,</div><div class='add'>+                                     verify=verify)</div><div class='add'>+                # Successful webhook push</div><div class='add'>+                break</div><div class='add'>+            except requests.exceptions.SSLError as e:</div><div class='add'>+                # If verify is equal to cert path, but still failed with</div><div class='add'>+                # SSLError, Looks like some issue with custom downloaded</div><div class='add'>+                # certificate, Try with verify = false</div><div class='add'>+                if verify == cert_path:</div><div class='add'>+                    verify = False</div><div class='add'>+                    continue</div><div class='add'>+</div><div class='add'>+                # If verify is instance of bool and True, then custom cert</div><div class='add'>+                # is required, download the cert and retry</div><div class='add'>+                try:</div><div class='add'>+                    save_https_cert(domain, port, cert_path)</div><div class='add'>+                    verify = cert_path</div><div class='add'>+                except Exception:</div><div class='add'>+                    verify = False</div><div class='add'>+</div><div class='add'>+                # Done with collecting cert, continue</div><div class='add'>+                continue</div><div class='add'>+            except Exception as e:</div><div class='add'>+                node_output_notok("{0}".format(e))</div><div class='add'>+                break</div><div class='add'>+</div><div class='add'>+        if resp.status_code != 200:</div><div class='add'>+            node_output_notok("{0}".format(resp.status_code))</div><div class='add'>+</div><div class='add'>+        node_output_ok()</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+class WebhookTestCmd(Cmd):</div><div class='add'>+    name = "webhook-test"</div><div class='add'>+</div><div class='add'>+    def args(self, parser):</div><div class='add'>+        parser.add_argument("url", help="URL of Webhook")</div><div class='add'>+        parser.add_argument("--bearer_token", "-t", help="Bearer Token")</div><div class='add'>+        parser.add_argument("--secret", "-s",</div><div class='add'>+                            help="Secret to generate Bearer Token")</div><div class='add'>+</div><div class='add'>+    def run(self, args):</div><div class='add'>+        url = args.url</div><div class='add'>+        bearer_token = args.bearer_token</div><div class='add'>+        secret = args.secret</div><div class='add'>+</div><div class='add'>+        if not args.url:</div><div class='add'>+            url = "."</div><div class='add'>+        if not args.bearer_token:</div><div class='add'>+            bearer_token = "."</div><div class='add'>+        if not args.secret:</div><div class='add'>+            secret = "."</div><div class='add'>+</div><div class='add'>+        out = execute_in_peers("node-webhook-test", [url, bearer_token,</div><div class='add'>+                                                     secret])</div><div class='add'>+</div><div class='add'>+        if not args.json:</div><div class='add'>+            table = PrettyTable(["NODE", "NODE STATUS", "WEBHOOK STATUS"])</div><div class='add'>+            table.align["NODE STATUS"] = "r"</div><div class='add'>+            table.align["WEBHOOK STATUS"] = "r"</div><div class='add'>+</div><div class='add'>+        num_ok_rows = 0</div><div class='add'>+        json_out = []</div><div class='add'>+        if args.json:</div><div class='add'>+            num_ok_rows = rows_to_json(json_out, "webhook_status", out)</div><div class='add'>+        else:</div><div class='add'>+            num_ok_rows = rows_to_table(table, out)</div><div class='add'>+</div><div class='add'>+        ret = 0</div><div class='add'>+        if num_ok_rows == 0:</div><div class='add'>+            ret = ERROR_ALL_NODES_STATUS_NOT_OK</div><div class='add'>+        elif num_ok_rows != len(out):</div><div class='add'>+            ret = ERROR_PARTIAL_SUCCESS</div><div class='add'>+</div><div class='add'>+        if args.json:</div><div class='add'>+            print (json.dumps({</div><div class='add'>+                "output": json_out,</div><div class='add'>+                "error": ""</div><div class='add'>+            }))</div><div class='add'>+        else:</div><div class='add'>+            print (table)</div><div class='add'>+</div><div class='add'>+        sys.exit(ret)</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+class ConfigGetCmd(Cmd):</div><div class='add'>+    name = "config-get"</div><div class='add'>+</div><div class='add'>+    def args(self, parser):</div><div class='add'>+        parser.add_argument("--name", help="Config Name")</div><div class='add'>+</div><div class='add'>+    def run(self, args):</div><div class='add'>+        data = json.load(open(DEFAULT_CONFIG_FILE))</div><div class='add'>+        if os.path.exists(CUSTOM_CONFIG_FILE):</div><div class='add'>+            data.update(json.load(open(CUSTOM_CONFIG_FILE)))</div><div class='add'>+</div><div class='add'>+        if args.name is not None and args.name not in CONFIG_KEYS:</div><div class='add'>+            handle_output_error("Invalid Config item",</div><div class='add'>+                                errcode=ERROR_INVALID_CONFIG,</div><div class='add'>+                                json_output=args.json)</div><div class='add'>+</div><div class='add'>+        if args.json:</div><div class='add'>+            json_out = {}</div><div class='add'>+            if args.name is None:</div><div class='add'>+                json_out = data</div><div class='add'>+            else:</div><div class='add'>+                json_out[args.name] = data[args.name]</div><div class='add'>+</div><div class='add'>+            print (json.dumps({</div><div class='add'>+                "output": json_out,</div><div class='add'>+                "error": ""</div><div class='add'>+            }))</div><div class='add'>+        else:</div><div class='add'>+            table = PrettyTable(["NAME", "VALUE"])</div><div class='add'>+            if args.name is None:</div><div class='add'>+                for k, v in data.items():</div><div class='add'>+                    table.add_row([k, v])</div><div class='add'>+            else:</div><div class='add'>+                table.add_row([args.name, data[args.name]])</div><div class='add'>+</div><div class='add'>+            print (table)</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def read_file_content_json(fname):</div><div class='add'>+    content = "{}"</div><div class='add'>+    with open(fname) as f:</div><div class='add'>+        content = f.read()</div><div class='add'>+        if content.strip() == "":</div><div class='add'>+            content = "{}"</div><div class='add'>+</div><div class='add'>+    return json.loads(content)</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+class ConfigSetCmd(Cmd):</div><div class='add'>+    name = "config-set"</div><div class='add'>+</div><div class='add'>+    def args(self, parser):</div><div class='add'>+        parser.add_argument("name", help="Config Name")</div><div class='add'>+        parser.add_argument("value", help="Config Value")</div><div class='add'>+</div><div class='add'>+    def run(self, args):</div><div class='add'>+        if args.name not in CONFIG_KEYS:</div><div class='add'>+            handle_output_error("Invalid Config item",</div><div class='add'>+                                errcode=ERROR_INVALID_CONFIG,</div><div class='add'>+                                json_output=args.json)</div><div class='add'>+</div><div class='add'>+        create_custom_config_file_if_not_exists(args)</div><div class='add'>+</div><div class='add'>+        with LockedOpen(CUSTOM_CONFIG_FILE, 'r+'):</div><div class='add'>+            data = json.load(open(DEFAULT_CONFIG_FILE))</div><div class='add'>+            if os.path.exists(CUSTOM_CONFIG_FILE):</div><div class='add'>+                config_json = read_file_content_json(CUSTOM_CONFIG_FILE)</div><div class='add'>+                data.update(config_json)</div><div class='add'>+</div><div class='add'>+            # Do Nothing if same as previous value</div><div class='add'>+            if data[args.name] == args.value:</div><div class='add'>+                handle_output_error("Config value not changed. Same config",</div><div class='add'>+                                    errcode=ERROR_SAME_CONFIG,</div><div class='add'>+                                    json_output=args.json)</div><div class='add'>+</div><div class='add'>+            # TODO: Validate Value</div><div class='add'>+            new_data = read_file_content_json(CUSTOM_CONFIG_FILE)</div><div class='add'>+</div><div class='add'>+            v = args.value</div><div class='add'>+            if args.name in BOOL_CONFIGS:</div><div class='add'>+                v = boolify(args.value)</div><div class='add'>+</div><div class='add'>+            if args.name in INT_CONFIGS:</div><div class='add'>+                v = int(args.value)</div><div class='add'>+</div><div class='add'>+            new_data[args.name] = v</div><div class='add'>+            file_content_overwrite(CUSTOM_CONFIG_FILE, new_data)</div><div class='add'>+</div><div class='add'>+            # If any value changed which requires restart of REST server</div><div class='add'>+            restart = False</div><div class='add'>+            if args.name in RESTART_CONFIGS:</div><div class='add'>+                restart = True</div><div class='add'>+</div><div class='add'>+            if restart:</div><div class='add'>+                print ("\nRestart glustereventsd in all nodes")</div><div class='add'>+</div><div class='add'>+            sync_to_peers(args)</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+class ConfigResetCmd(Cmd):</div><div class='add'>+    name = "config-reset"</div><div class='add'>+</div><div class='add'>+    def args(self, parser):</div><div class='add'>+        parser.add_argument("name", help="Config Name or all")</div><div class='add'>+</div><div class='add'>+    def run(self, args):</div><div class='add'>+        create_custom_config_file_if_not_exists(args)</div><div class='add'>+</div><div class='add'>+        with LockedOpen(CUSTOM_CONFIG_FILE, 'r+'):</div><div class='add'>+            changed_keys = []</div><div class='add'>+            data = {}</div><div class='add'>+            if os.path.exists(CUSTOM_CONFIG_FILE):</div><div class='add'>+                data = read_file_content_json(CUSTOM_CONFIG_FILE)</div><div class='add'>+</div><div class='add'>+            # If No data available in custom config or, the specific config</div><div class='add'>+            # item is not available in custom config</div><div class='add'>+            if not data or \</div><div class='add'>+               (args.name != "all" and data.get(args.name, None) is None):</div><div class='add'>+                handle_output_error("Config value not reset. Already "</div><div class='add'>+                                    "set to default value",</div><div class='add'>+                                    errcode=ERROR_SAME_CONFIG,</div><div class='add'>+                                    json_output=args.json)</div><div class='add'>+</div><div class='add'>+            if args.name.lower() == "all":</div><div class='add'>+                for k, v in data.items():</div><div class='add'>+                    changed_keys.append(k)</div><div class='add'>+</div><div class='add'>+                # Reset all keys</div><div class='add'>+                file_content_overwrite(CUSTOM_CONFIG_FILE, {})</div><div class='add'>+            else:</div><div class='add'>+                changed_keys.append(args.name)</div><div class='add'>+                del data[args.name]</div><div class='add'>+                file_content_overwrite(CUSTOM_CONFIG_FILE, data)</div><div class='add'>+</div><div class='add'>+            # If any value changed which requires restart of REST server</div><div class='add'>+            restart = False</div><div class='add'>+            for key in changed_keys:</div><div class='add'>+                if key in RESTART_CONFIGS:</div><div class='add'>+                    restart = True</div><div class='add'>+                    break</div><div class='add'>+</div><div class='add'>+            if restart:</div><div class='add'>+                print ("\nRestart glustereventsd in all nodes")</div><div class='add'>+</div><div class='add'>+            sync_to_peers(args)</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+class SyncCmd(Cmd):</div><div class='add'>+    name = "sync"</div><div class='add'>+</div><div class='add'>+    def run(self, args):</div><div class='add'>+        sync_to_peers(args)</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def common_args(parser):</div><div class='add'>+    parser.add_argument("--json", help="JSON Output", action="store_true")</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+if __name__ == "__main__":</div><div class='add'>+    set_common_args_func(common_args)</div><div class='add'>+    runcli()</div><div class='head'>diff --git a/events/src/utils.py b/events/src/utils.py<br/>new file mode 100644<br/>index 00000000000..6d4e0791a2b<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/events/src/utils.py?id=d1d7a6f35c816822fab51c820e25023863c239c1'>events/src/utils.py</a></div><div class='hunk'>@@ -0,0 +1,445 @@</div><div class='add'>+# -*- coding: utf-8 -*-</div><div class='add'>+#</div><div class='add'>+#  Copyright (c) 2016 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+#  This file is part of GlusterFS.</div><div class='add'>+#</div><div class='add'>+#  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+#  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+#  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+#  cases as published by the Free Software Foundation.</div><div class='add'>+#</div><div class='add'>+</div><div class='add'>+import sys</div><div class='add'>+import json</div><div class='add'>+import os</div><div class='add'>+import logging</div><div class='add'>+import logging.handlers</div><div class='add'>+import fcntl</div><div class='add'>+from errno import EBADF</div><div class='add'>+from threading import Thread</div><div class='add'>+import multiprocessing</div><div class='add'>+try:</div><div class='add'>+    from queue import Queue</div><div class='add'>+except ImportError:</div><div class='add'>+    from Queue import Queue</div><div class='add'>+from datetime import datetime, timedelta</div><div class='add'>+import base64</div><div class='add'>+import hmac</div><div class='add'>+from hashlib import sha256</div><div class='add'>+from calendar import timegm</div><div class='add'>+</div><div class='add'>+sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))</div><div class='add'>+</div><div class='add'>+from gfevents.eventsapiconf import (LOG_FILE,</div><div class='add'>+                                    WEBHOOKS_FILE,</div><div class='add'>+                                    DEFAULT_CONFIG_FILE,</div><div class='add'>+                                    CUSTOM_CONFIG_FILE,</div><div class='add'>+                                    UUID_FILE,</div><div class='add'>+                                    CERTS_DIR)</div><div class='add'>+from gfevents import eventtypes</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+# Webhooks list</div><div class='add'>+_webhooks = {}</div><div class='add'>+_webhooks_file_mtime = 0</div><div class='add'>+# Default Log Level</div><div class='add'>+_log_level = "INFO"</div><div class='add'>+# Config Object</div><div class='add'>+_config = {}</div><div class='add'>+</div><div class='add'>+# Init Logger instance</div><div class='add'>+logger = logging.getLogger(__name__)</div><div class='add'>+NodeID = None</div><div class='add'>+webhooks_pool = None</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def boolify(value):</div><div class='add'>+    value = str(value)</div><div class='add'>+    if value.lower() in ["1", "on", "true", "yes"]:</div><div class='add'>+        return True</div><div class='add'>+    else:</div><div class='add'>+        return False</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def log_event(data):</div><div class='add'>+    # Log all published events unless it is disabled</div><div class='add'>+    if not _config.get("disable-events-log", False):</div><div class='add'>+        logger.info(repr(data))</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def get_node_uuid():</div><div class='add'>+    val = None</div><div class='add'>+    with open(UUID_FILE) as f:</div><div class='add'>+        for line in f:</div><div class='add'>+            if line.startswith("UUID="):</div><div class='add'>+                val = line.strip().split("=")[-1]</div><div class='add'>+                break</div><div class='add'>+    return val</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def get_config(key, default_value=None):</div><div class='add'>+    if not _config:</div><div class='add'>+        load_config()</div><div class='add'>+    return _config.get(key, default_value)</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def get_event_type_name(idx):</div><div class='add'>+    """</div><div class='add'>+    Returns Event Type text from the index. For example, VOLUME_CREATE</div><div class='add'>+    """</div><div class='add'>+    return eventtypes.all_events[idx].replace("EVENT_", "")</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def setup_logger():</div><div class='add'>+    """</div><div class='add'>+    Logging initialization, Log level by default will be INFO, once config</div><div class='add'>+    file is read, respective log_level will be set.</div><div class='add'>+    """</div><div class='add'>+    global logger</div><div class='add'>+    logger.setLevel(logging.INFO)</div><div class='add'>+</div><div class='add'>+    # create the logging file handler</div><div class='add'>+    fh = logging.handlers.WatchedFileHandler(LOG_FILE)</div><div class='add'>+</div><div class='add'>+    formatter = logging.Formatter("[%(asctime)s] %(levelname)s "</div><div class='add'>+                                  "[%(module)s - %(lineno)s:%(funcName)s] "</div><div class='add'>+                                  "- %(message)s")</div><div class='add'>+</div><div class='add'>+    fh.setFormatter(formatter)</div><div class='add'>+</div><div class='add'>+    # add handler to logger object</div><div class='add'>+    logger.addHandler(fh)</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def load_config():</div><div class='add'>+    """</div><div class='add'>+    Load/Reload the config from REST Config files. This function will</div><div class='add'>+    be triggered during init and when SIGUSR2.</div><div class='add'>+    """</div><div class='add'>+    global _config</div><div class='add'>+    _config = {}</div><div class='add'>+    if os.path.exists(DEFAULT_CONFIG_FILE):</div><div class='add'>+        _config = json.load(open(DEFAULT_CONFIG_FILE))</div><div class='add'>+    if os.path.exists(CUSTOM_CONFIG_FILE):</div><div class='add'>+        _config.update(json.load(open(CUSTOM_CONFIG_FILE)))</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def load_log_level():</div><div class='add'>+    """</div><div class='add'>+    Reads log_level from Config file and sets accordingly. This function will</div><div class='add'>+    be triggered during init and when SIGUSR2.</div><div class='add'>+    """</div><div class='add'>+    global logger, _log_level</div><div class='add'>+    new_log_level = _config.get("log-level", "INFO")</div><div class='add'>+    if _log_level != new_log_level:</div><div class='add'>+        logger.setLevel(getattr(logging, new_log_level.upper()))</div><div class='add'>+        _log_level = new_log_level.upper()</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def load_webhooks():</div><div class='add'>+    """</div><div class='add'>+    Load/Reload the webhooks list. This function will</div><div class='add'>+    be triggered during init and when SIGUSR2.</div><div class='add'>+    """</div><div class='add'>+    global _webhooks, _webhooks_file_mtime</div><div class='add'>+    _webhooks = {}</div><div class='add'>+    if os.path.exists(WEBHOOKS_FILE):</div><div class='add'>+        _webhooks = json.load(open(WEBHOOKS_FILE))</div><div class='add'>+        st = os.lstat(WEBHOOKS_FILE)</div><div class='add'>+        _webhooks_file_mtime = st.st_mtime</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def load_all():</div><div class='add'>+    """</div><div class='add'>+    Wrapper function to call all load/reload functions. This function will</div><div class='add'>+    be triggered during init and when SIGUSR2.</div><div class='add'>+    """</div><div class='add'>+    load_config()</div><div class='add'>+    load_webhooks()</div><div class='add'>+    load_log_level()</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def publish(ts, event_key, data):</div><div class='add'>+    global NodeID</div><div class='add'>+    if NodeID is None:</div><div class='add'>+        NodeID = get_node_uuid()</div><div class='add'>+</div><div class='add'>+    autoload_webhooks()</div><div class='add'>+</div><div class='add'>+    message = {</div><div class='add'>+        "nodeid": NodeID,</div><div class='add'>+        "ts": int(ts),</div><div class='add'>+        "event": get_event_type_name(event_key),</div><div class='add'>+        "message": data</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    log_event(message)</div><div class='add'>+</div><div class='add'>+    if _webhooks:</div><div class='add'>+        plugin_webhook(message)</div><div class='add'>+    else:</div><div class='add'>+        # TODO: Default action?</div><div class='add'>+        pass</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def autoload_webhooks():</div><div class='add'>+    global _webhooks_file_mtime</div><div class='add'>+    try:</div><div class='add'>+        st = os.lstat(WEBHOOKS_FILE)</div><div class='add'>+    except OSError:</div><div class='add'>+        st = None</div><div class='add'>+</div><div class='add'>+    if st is not None:</div><div class='add'>+        # If Stat is available and mtime is not matching with</div><div class='add'>+        # previously recorded mtime, reload the webhooks file</div><div class='add'>+        if st.st_mtime != _webhooks_file_mtime:</div><div class='add'>+            load_webhooks()</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def base64_urlencode(inp):</div><div class='add'>+    return base64.urlsafe_b64encode(inp).replace("=", "").strip()</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def get_jwt_token(secret, event_type, event_ts, jwt_expiry_time_seconds=60):</div><div class='add'>+    exp = datetime.utcnow() + timedelta(seconds=jwt_expiry_time_seconds)</div><div class='add'>+    payload = {</div><div class='add'>+        "exp": timegm(exp.utctimetuple()),</div><div class='add'>+        "iss": "gluster",</div><div class='add'>+        "sub": event_type,</div><div class='add'>+        "iat": event_ts</div><div class='add'>+    }</div><div class='add'>+    header = '{"alg":"HS256","typ":"JWT"}'</div><div class='add'>+    payload = json.dumps(payload, separators=(',', ':'), sort_keys=True)</div><div class='add'>+    msg = base64_urlencode(header) + "." + base64_urlencode(payload)</div><div class='add'>+    return "%s.%s" % (</div><div class='add'>+        msg,</div><div class='add'>+        base64_urlencode(hmac.HMAC(str(secret), msg, sha256).digest())</div><div class='add'>+    )</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def save_https_cert(domain, port, cert_path):</div><div class='add'>+    import ssl</div><div class='add'>+</div><div class='add'>+    # Cert file already available for this URL</div><div class='add'>+    if os.path.exists(cert_path):</div><div class='add'>+        return</div><div class='add'>+</div><div class='add'>+    cert_data = ssl.get_server_certificate((domain, port))</div><div class='add'>+    with open(cert_path, "w") as f:</div><div class='add'>+        f.write(cert_data)</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def publish_to_webhook(url, token, secret, message_queue):</div><div class='add'>+    # Import requests here since not used in any other place</div><div class='add'>+    import requests</div><div class='add'>+</div><div class='add'>+    http_headers = {"Content-Type": "application/json"}</div><div class='add'>+    urldata = requests.utils.urlparse(url)</div><div class='add'>+    parts = urldata.netloc.split(":")</div><div class='add'>+    domain = parts[0]</div><div class='add'>+    # Default https port if not specified</div><div class='add'>+    port = 443</div><div class='add'>+    if len(parts) == 2:</div><div class='add'>+        port = int(parts[1])</div><div class='add'>+</div><div class='add'>+    cert_path = os.path.join(CERTS_DIR, url.replace("/", "_").strip())</div><div class='add'>+</div><div class='add'>+    while True:</div><div class='add'>+        hashval = ""</div><div class='add'>+        event_type, event_ts, message_json = message_queue.get()</div><div class='add'>+        if token != "" and token is not None:</div><div class='add'>+            hashval = token</div><div class='add'>+</div><div class='add'>+        if secret != "" and secret is not None:</div><div class='add'>+            hashval = get_jwt_token(secret, event_type, event_ts)</div><div class='add'>+</div><div class='add'>+        if hashval:</div><div class='add'>+            http_headers["Authorization"] = "Bearer " + hashval</div><div class='add'>+</div><div class='add'>+        verify = True</div><div class='add'>+        while True:</div><div class='add'>+            try:</div><div class='add'>+                resp = requests.post(url, headers=http_headers,</div><div class='add'>+                                     data=message_json,</div><div class='add'>+                                     verify=verify)</div><div class='add'>+                # Successful webhook push</div><div class='add'>+                message_queue.task_done()</div><div class='add'>+                if resp.status_code != 200:</div><div class='add'>+                    logger.warn("Event push failed to URL: {url}, "</div><div class='add'>+                                "Event: {event}, "</div><div class='add'>+                                "Status Code: {status_code}".format(</div><div class='add'>+                                    url=url,</div><div class='add'>+                                    event=message_json,</div><div class='add'>+                                    status_code=resp.status_code))</div><div class='add'>+                break</div><div class='add'>+            except requests.exceptions.SSLError as e:</div><div class='add'>+                # If verify is equal to cert path, but still failed with</div><div class='add'>+                # SSLError, Looks like some issue with custom downloaded</div><div class='add'>+                # certificate, Try with verify = false</div><div class='add'>+                if verify == cert_path:</div><div class='add'>+                    logger.warn("Event push failed with certificate, "</div><div class='add'>+                                "ignoring verification url={0} "</div><div class='add'>+                                "Error={1}".format(url, e))</div><div class='add'>+                    verify = False</div><div class='add'>+                    continue</div><div class='add'>+</div><div class='add'>+                # If verify is instance of bool and True, then custom cert</div><div class='add'>+                # is required, download the cert and retry</div><div class='add'>+                try:</div><div class='add'>+                    save_https_cert(domain, port, cert_path)</div><div class='add'>+                    verify = cert_path</div><div class='add'>+                except Exception as ex:</div><div class='add'>+                    verify = False</div><div class='add'>+                    logger.warn("Unable to get Server certificate, "</div><div class='add'>+                                "ignoring verification url={0} "</div><div class='add'>+                                "Error={1}".format(url, ex))</div><div class='add'>+</div><div class='add'>+                # Done with collecting cert, continue</div><div class='add'>+                continue</div><div class='add'>+            except Exception as e:</div><div class='add'>+                logger.warn("Event push failed to URL: {url}, "</div><div class='add'>+                            "Event: {event}, "</div><div class='add'>+                            "Status: {error}".format(</div><div class='add'>+                                url=url,</div><div class='add'>+                                event=message_json,</div><div class='add'>+                                error=e))</div><div class='add'>+                message_queue.task_done()</div><div class='add'>+                break</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def plugin_webhook(message):</div><div class='add'>+    message_json = json.dumps(message, sort_keys=True)</div><div class='add'>+    logger.debug("EVENT: {0}".format(message_json))</div><div class='add'>+    webhooks_pool.send(message["event"], message["ts"], message_json)</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+class LockedOpen(object):</div><div class='add'>+</div><div class='add'>+    def __init__(self, filename, *args, **kwargs):</div><div class='add'>+        self.filename = filename</div><div class='add'>+        self.open_args = args</div><div class='add'>+        self.open_kwargs = kwargs</div><div class='add'>+        self.fileobj = None</div><div class='add'>+</div><div class='add'>+    def __enter__(self):</div><div class='add'>+        """</div><div class='add'>+        If two processes compete to update a file, The first process</div><div class='add'>+        gets the lock and the second process is blocked in the fcntl.flock()</div><div class='add'>+        call. When first process replaces the file and releases the lock,</div><div class='add'>+        the already open file descriptor in the second process now points</div><div class='add'>+        to a  "ghost" file(not reachable by any path name) with old contents.</div><div class='add'>+        To avoid that conflict, check the fd already opened is same or</div><div class='add'>+        not. Open new one if not same</div><div class='add'>+        """</div><div class='add'>+        f = open(self.filename, *self.open_args, **self.open_kwargs)</div><div class='add'>+        while True:</div><div class='add'>+            fcntl.flock(f, fcntl.LOCK_EX)</div><div class='add'>+            fnew = open(self.filename, *self.open_args, **self.open_kwargs)</div><div class='add'>+            if os.path.sameopenfile(f.fileno(), fnew.fileno()):</div><div class='add'>+                fnew.close()</div><div class='add'>+                break</div><div class='add'>+            else:</div><div class='add'>+                f.close()</div><div class='add'>+                f = fnew</div><div class='add'>+        self.fileobj = f</div><div class='add'>+        return f</div><div class='add'>+</div><div class='add'>+    def __exit__(self, _exc_type, _exc_value, _traceback):</div><div class='add'>+        self.fileobj.close()</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+class PidFileLockFailed(Exception):</div><div class='add'>+    pass</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+class PidFile(object):</div><div class='add'>+    def __init__(self, filename):</div><div class='add'>+        self.filename = filename</div><div class='add'>+        self.pid = os.getpid()</div><div class='add'>+        self.fh = None</div><div class='add'>+</div><div class='add'>+    def cleanup(self, remove_file=True):</div><div class='add'>+        try:</div><div class='add'>+            if self.fh is not None:</div><div class='add'>+                self.fh.close()</div><div class='add'>+        except IOError as exc:</div><div class='add'>+            if exc.errno != EBADF:</div><div class='add'>+                raise</div><div class='add'>+        finally:</div><div class='add'>+            if os.path.isfile(self.filename) and remove_file:</div><div class='add'>+                os.remove(self.filename)</div><div class='add'>+</div><div class='add'>+    def __enter__(self):</div><div class='add'>+        self.fh = open(self.filename, 'a+')</div><div class='add'>+        try:</div><div class='add'>+            fcntl.flock(self.fh.fileno(), fcntl.LOCK_EX | fcntl.LOCK_NB)</div><div class='add'>+        except IOError as exc:</div><div class='add'>+            self.cleanup(remove_file=False)</div><div class='add'>+            raise PidFileLockFailed(exc)</div><div class='add'>+</div><div class='add'>+        self.fh.seek(0)</div><div class='add'>+        self.fh.truncate()</div><div class='add'>+        self.fh.write("%d\n" % self.pid)</div><div class='add'>+        self.fh.flush()</div><div class='add'>+        self.fh.seek(0)</div><div class='add'>+        return self</div><div class='add'>+</div><div class='add'>+    def __exit__(self, _exc_type, _exc_value, _traceback):</div><div class='add'>+        self.cleanup()</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def webhook_monitor(proc_queue, webhooks):</div><div class='add'>+    queues = {}</div><div class='add'>+    for url, data in webhooks.items():</div><div class='add'>+        if isinstance(data, str):</div><div class='add'>+            token = data</div><div class='add'>+            secret = None</div><div class='add'>+        else:</div><div class='add'>+            token = data["token"]</div><div class='add'>+            secret = data["secret"]</div><div class='add'>+</div><div class='add'>+        queues[url] = Queue()</div><div class='add'>+        t = Thread(target=publish_to_webhook, args=(url, token, secret,</div><div class='add'>+                                                    queues[url]))</div><div class='add'>+        t.start()</div><div class='add'>+</div><div class='add'>+    # Get the message sent to Process queue and distribute to all thread queues</div><div class='add'>+    while True:</div><div class='add'>+        message = proc_queue.get()</div><div class='add'>+        for _, q in queues.items():</div><div class='add'>+            q.put(message)</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+class WebhookThreadPool(object):</div><div class='add'>+    def start(self):</div><div class='add'>+        # Separate process to emit messages to webhooks</div><div class='add'>+        # which maintains one thread per webhook. Separate</div><div class='add'>+        # process is required since on reload we need to stop</div><div class='add'>+        # and start the thread pool. In Python Threads can't be stopped</div><div class='add'>+        # so terminate the process and start again. Note: In transit</div><div class='add'>+        # events will be missed during reload</div><div class='add'>+        self.queue = multiprocessing.Queue()</div><div class='add'>+        self.proc = multiprocessing.Process(target=webhook_monitor,</div><div class='add'>+                                            args=(self.queue, _webhooks))</div><div class='add'>+        self.proc.start()</div><div class='add'>+</div><div class='add'>+    def restart(self):</div><div class='add'>+        # In transit messages are skipped, since webhooks monitor process</div><div class='add'>+        # is terminated.</div><div class='add'>+        self.proc.terminate()</div><div class='add'>+        self.start()</div><div class='add'>+</div><div class='add'>+    def send(self, event_type, event_ts, message):</div><div class='add'>+        self.queue.put((event_type, event_ts, message))</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def init_webhook_pool():</div><div class='add'>+    global webhooks_pool</div><div class='add'>+    webhooks_pool = WebhookThreadPool()</div><div class='add'>+    webhooks_pool.start()</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def restart_webhook_pool():</div><div class='add'>+    global webhooks_pool</div><div class='add'>+    if webhooks_pool is not None:</div><div class='add'>+        webhooks_pool.restart()</div><div class='head'>diff --git a/events/tools/Makefile.am b/events/tools/Makefile.am<br/>new file mode 100644<br/>index 00000000000..fb6770cf070<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/events/tools/Makefile.am?id=d1d7a6f35c816822fab51c820e25023863c239c1'>events/tools/Makefile.am</a></div><div class='hunk'>@@ -0,0 +1,6 @@</div><div class='add'>+EXTRA_DIST = eventsdash.py</div><div class='add'>+</div><div class='add'>+if BUILD_EVENTS</div><div class='add'>+scriptsdir = $(datadir)/glusterfs/scripts</div><div class='add'>+scripts_SCRIPTS = eventsdash.py</div><div class='add'>+endif</div><div class='head'>diff --git a/events/tools/eventsdash.py b/events/tools/eventsdash.py<br/>new file mode 100644<br/>index 00000000000..6479ea59da6<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/events/tools/eventsdash.py?id=d1d7a6f35c816822fab51c820e25023863c239c1'>events/tools/eventsdash.py</a></div><div class='hunk'>@@ -0,0 +1,75 @@</div><div class='add'>+#!/usr/bin/python3</div><div class='add'>+# -*- coding: utf-8 -*-</div><div class='add'>+#</div><div class='add'>+#  Copyright (c) 2016 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+#  This file is part of GlusterFS.</div><div class='add'>+#</div><div class='add'>+#  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+#  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+#  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+#  cases as published by the Free Software Foundation.</div><div class='add'>+#</div><div class='add'>+</div><div class='add'>+from __future__ import print_function</div><div class='add'>+from argparse import ArgumentParser, RawDescriptionHelpFormatter</div><div class='add'>+import logging</div><div class='add'>+from datetime import datetime</div><div class='add'>+</div><div class='add'>+from flask import Flask, request</div><div class='add'>+</div><div class='add'>+app = Flask(__name__)</div><div class='add'>+app.logger.disabled = True</div><div class='add'>+log = logging.getLogger('werkzeug')</div><div class='add'>+log.disabled = True</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def human_time(ts):</div><div class='add'>+    return datetime.fromtimestamp(float(ts)).strftime("%Y-%m-%d %H:%M:%S")</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+@app.route("/")</div><div class='add'>+def home():</div><div class='add'>+    return "OK"</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+@app.route("/listen", methods=["POST"])</div><div class='add'>+def listen():</div><div class='add'>+    data = request.json</div><div class='add'>+    if data is None:</div><div class='add'>+        return "OK"</div><div class='add'>+</div><div class='add'>+    message = []</div><div class='add'>+    for k, v in data.get("message", {}).items():</div><div class='add'>+        message.append("{0}={1}".format(k, v))</div><div class='add'>+</div><div class='add'>+    print(("{0:20s} {1:20s} {2:36} {3}".format(</div><div class='add'>+        human_time(data.get("ts")),</div><div class='add'>+        data.get("event"),</div><div class='add'>+        data.get("nodeid"),</div><div class='add'>+        " ".join(message))))</div><div class='add'>+</div><div class='add'>+    return "OK"</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def main():</div><div class='add'>+    parser = ArgumentParser(formatter_class=RawDescriptionHelpFormatter,</div><div class='add'>+                            description=__doc__)</div><div class='add'>+    parser.add_argument("--port", type=int, help="Port", default=9000)</div><div class='add'>+    parser.add_argument("--debug", help="Run Server in debug mode",</div><div class='add'>+                        action="store_true")</div><div class='add'>+    args = parser.parse_args()</div><div class='add'>+</div><div class='add'>+    print(("{0:20s} {1:20s} {2:36} {3}".format(</div><div class='add'>+        "TIMESTAMP", "EVENT", "NODE ID", "MESSAGE"</div><div class='add'>+    )))</div><div class='add'>+    print(("{0:20s} {1:20s} {2:36} {3}".format(</div><div class='add'>+        "-"*20, "-"*20, "-"*36, "-"*20</div><div class='add'>+    )))</div><div class='add'>+    if args.debug:</div><div class='add'>+        app.debug = True</div><div class='add'>+</div><div class='add'>+    app.run(host="0.0.0.0", port=args.port)</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+if __name__ == "__main__":</div><div class='add'>+    main()</div><div class='head'>diff --git a/extras/LinuxRPM/Makefile.am b/extras/LinuxRPM/Makefile.am<br/>new file mode 100644<br/>index 00000000000..f02853798c0<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/extras/LinuxRPM/Makefile.am?id=d1d7a6f35c816822fab51c820e25023863c239c1'>extras/LinuxRPM/Makefile.am</a></div><div class='hunk'>@@ -0,0 +1,55 @@</div><div class='add'>+</div><div class='add'>+GFS_TAR = ../../glusterfs-$(VERSION).tar.gz</div><div class='add'>+</div><div class='add'>+.PHONY: all</div><div class='add'>+</div><div class='add'>+all:</div><div class='add'>+	@echo "To build RPMS run 'make glusterrpms'"</div><div class='add'>+</div><div class='add'>+.PHONY: glusterrpms glusterrpms_without_autogen</div><div class='add'>+.PHONY: autogen prep srcrpm testsrpm clean</div><div class='add'>+</div><div class='add'>+glusterrpms: autogen glusterrpms_without_autogen</div><div class='add'>+</div><div class='add'>+glusterrpms_without_autogen: prep srcrpm rpms</div><div class='add'>+	-rm -rf rpmbuild</div><div class='add'>+</div><div class='add'>+autogen:</div><div class='add'>+	cd ../.. &amp;&amp; \</div><div class='add'>+	rm -rf autom4te.cache &amp;&amp; \</div><div class='add'>+	./autogen.sh &amp;&amp; \</div><div class='add'>+	./configure --enable-gnfs --with-previous-options</div><div class='add'>+</div><div class='add'>+prep:</div><div class='add'>+	$(MAKE) -C ../.. dist;</div><div class='add'>+	-mkdir -p rpmbuild/BUILD</div><div class='add'>+	-mkdir -p rpmbuild/SPECS</div><div class='add'>+	-mkdir -p rpmbuild/RPMS</div><div class='add'>+	-mkdir -p rpmbuild/SRPMS</div><div class='add'>+	-mkdir -p rpmbuild/SOURCES</div><div class='add'>+	-rm -rf rpmbuild/SOURCES/*</div><div class='add'>+	cp ../../*.tar.gz ./rpmbuild/SOURCES</div><div class='add'>+	cp ../../glusterfs.spec ./rpmbuild/SPECS</div><div class='add'>+</div><div class='add'>+srcrpm:</div><div class='add'>+	rpmbuild --define '_topdir $(shell pwd)/rpmbuild' -bs rpmbuild/SPECS/glusterfs.spec</div><div class='add'>+	mv rpmbuild/SRPMS/* .</div><div class='add'>+</div><div class='add'>+rpms:</div><div class='add'>+	rpmbuild --define '_topdir $(shell pwd)/rpmbuild' --with gnfs -bb rpmbuild/SPECS/glusterfs.spec</div><div class='add'>+	mv rpmbuild/RPMS/*/* .</div><div class='add'>+</div><div class='add'>+# EPEL-5 does not like new versions of rpmbuild and requires some</div><div class='add'>+# _source_* defines</div><div class='add'>+</div><div class='add'>+testsrpm: prep</div><div class='add'>+	rpmbuild --define '_topdir $(shell pwd)/rpmbuild' \</div><div class='add'>+		--define '_source_payload w9.gzdio' \</div><div class='add'>+		--define '_source_filedigest_algorithm 1' \</div><div class='add'>+		-bs rpmbuild/SPECS/glusterfs.spec</div><div class='add'>+	mv rpmbuild/SRPMS/* ../..</div><div class='add'>+	-rm -rf rpmbuild</div><div class='add'>+</div><div class='add'>+clean:</div><div class='add'>+	-rm -rf rpmbuild</div><div class='add'>+	-rm -f *.rpm</div><div class='head'>diff --git a/extras/LinuxRPM/make_glusterrpms b/extras/LinuxRPM/make_glusterrpms<br/>new file mode 100755<br/>index 00000000000..3156af97870<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/extras/LinuxRPM/make_glusterrpms?id=d1d7a6f35c816822fab51c820e25023863c239c1'>extras/LinuxRPM/make_glusterrpms</a></div><div class='hunk'>@@ -0,0 +1,9 @@</div><div class='add'>+#!/bin/sh</div><div class='add'>+</div><div class='add'>+(</div><div class='add'>+    cd $(realpath $(dirname $0))/../.. || exit 1</div><div class='add'>+    rm -rf autom4te.cache</div><div class='add'>+    ./autogen.sh || exit 1</div><div class='add'>+    ./configure --with-previous-options || exit 1</div><div class='add'>+)</div><div class='add'>+make -C $(realpath $(dirname $0)) glusterrpms_without_autogen</div><div class='head'>diff --git a/extras/MacOSX/Portfile b/extras/MacOSX/Portfile<br/>deleted file mode 100644<br/>index 1262a44daea..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/extras/MacOSX/Portfile?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/MacOSX/Portfile</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,26 +0,0 @@</div><div class='del'>-# $Id$</div><div class='del'>-</div><div class='del'>-PortSystem          1.0</div><div class='del'>-</div><div class='del'>-name                glusterfs</div><div class='del'>-version             2.0.0rc8</div><div class='del'>-categories          fuse</div><div class='del'>-maintainers         amar@gluster.com</div><div class='del'>-description         GlusterFS</div><div class='del'>-long_description    GlusterFS is a cluster file system, flexible to tune it for your needs.</div><div class='del'>-homepage            http://www.gluster.org/</div><div class='del'>-platforms           darwin</div><div class='del'>-master_sites        http://ftp.gluster.com/pub/gluster/glusterfs/2.0/2.0.0</div><div class='del'>-</div><div class='del'>-configure.args      --disable-bdb</div><div class='del'>-checksums           md5 33c2d02344d4fab422e80cfb637e0b48</div><div class='del'>-</div><div class='del'>-post-destroot {</div><div class='del'>-    file mkdir ${destroot}/Library/LaunchDaemons/</div><div class='del'>-    file copy ${worksrcpath}/extras/glusterfs-server.plist \</div><div class='del'>-        ${destroot}/Library/LaunchDaemons/com.gluster.glusterfs.plist</div><div class='del'>-</div><div class='del'>-    file mkdir ${destroot}/sbin/</div><div class='del'>-    file copy ${worksrcpath}/xlators/mount/fuse/utils/mount_glusterfs \</div><div class='del'>-	${destroot}/sbin/</div><div class='del'>-}
\ No newline at end of file</div><div class='head'>diff --git a/extras/MacOSX/README.MacOSX b/extras/MacOSX/README.MacOSX<br/>deleted file mode 100644<br/>index ec7abc2cc78..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/extras/MacOSX/README.MacOSX?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/MacOSX/README.MacOSX</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,84 +0,0 @@</div><div class='del'>-</div><div class='del'>-Mostly the usage is over OS-X.</div><div class='del'>-</div><div class='del'>-Important links</div><div class='del'>-</div><div class='del'>-GlusterFS</div><div class='del'>-=========</div><div class='del'>-* http://www.gluster.org</div><div class='del'>-* http://gluster.org/docs/index.php/GlusterFS</div><div class='del'>-* http://gluster.org/docs/index.php/GlusterFS_on_MAC_OS_X</div><div class='del'>-</div><div class='del'>-MacFUSE</div><div class='del'>-=======</div><div class='del'>-* http://code.google.com/p/macfuse/</div><div class='del'>-* http://code.google.com/p/macfuse/wiki/FAQ</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-Important steps:</div><div class='del'>-================</div><div class='del'>-</div><div class='del'>-Make sure that there is no previous installation of MacFUSE exists in the </div><div class='del'>-system. Run,</div><div class='del'>-</div><div class='del'>-  bash# sudo /Library/Filesystems/fusefs.fs/Support/uninstall-macfuse-core.sh</div><div class='del'>-</div><div class='del'>-After this, install MacFUSE (mostly through .dmg available in macfuse homepage </div><div class='del'>-or if Gluster Inc provides any custom built .dmg)</div><div class='del'>-</div><div class='del'>-Make sure the .dmg of glusterfs is built against the installed MacFUSE version</div><div class='del'>-(if not, any operations over mountpoint gives EIO ie, Input/Output Error). If </div><div class='del'>-glusterfs tarball is used then compile it only after the MacFUSE installation </div><div class='del'>-is complete.</div><div class='del'>-</div><div class='del'>-To make an entry in /etc/fstab for glusterfs mount, use 'vifs' command</div><div class='del'>-</div><div class='del'>-   bash# sudo vifs</div><div class='del'>-</div><div class='del'>-after the entry is added in /etc/fstab, it can be mounted by 'mount' command.</div><div class='del'>-</div><div class='del'>-To start the server process one can use the 'launchd' mechanism. Follow below </div><div class='del'>-steps after installation</div><div class='del'>-</div><div class='del'>-   bash# launchctl load /Library/LaunchDaemons/com.gluster.glusterfs.plist</div><div class='del'>-   </div><div class='del'>-No need to run the command if the machine reboots, as it will be loaded </div><div class='del'>-automatically by launchd process.</div><div class='del'>-</div><div class='del'>-Now copy the server volume file in the proper path</div><div class='del'>-</div><div class='del'>-   bash# sudo vi /opt/local/etc/glusterfs/server.vol</div><div class='del'>-</div><div class='del'>-NOTE: (If glusterfs is installed in different path other than '/opt/local' </div><div class='del'>-      update the volume file at the corresponding  path, and  also need to </div><div class='del'>-      update the /Library/LaunchDaemons/com.gluster.glusterfs.plist with </div><div class='del'>-      the proper path)</div><div class='del'>-</div><div class='del'>-Once the volume file is updated, administrator can start the server process by</div><div class='del'>-running,</div><div class='del'>-</div><div class='del'>-  bash# launchctl start com.gluster.glusterfs</div><div class='del'>-</div><div class='del'>-and stop like</div><div class='del'>-</div><div class='del'>-  bash# launchctl stop com.gluster.glusterfs</div><div class='del'>-</div><div class='del'>-NOTE: To start the process by default when the loaded, one need to add the </div><div class='del'>-following lines to .plist file</div><div class='del'>-      -----</div><div class='del'>-      &lt;key&gt;KeepAlive&lt;/key&gt; </div><div class='del'>-      &lt;true/&gt;</div><div class='del'>-      -----</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-Install using .dmg in Terminal</div><div class='del'>-=================================</div><div class='del'>-</div><div class='del'>-  bash# hdiutil attach &lt;package&gt;.dmg</div><div class='del'>-  bash# cd /Volumes/&lt;package&gt;/</div><div class='del'>-  bash# installer -pkg &lt;package&gt;.pkg -installer /</div><div class='del'>-  bash# cd </div><div class='del'>-  bash# hdiutil detach /Volumes/&lt;package&gt;/</div><div class='del'>-</div><div class='head'>diff --git a/extras/Makefile.am b/extras/Makefile.am<br/>index 26e1e24b675..983f014cca6 100644<br/>--- a/<a href='/cgit/glusterfs.git/tree/extras/Makefile.am?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/Makefile.am</a><br/>+++ b/<a href='/cgit/glusterfs.git/tree/extras/Makefile.am?id=d1d7a6f35c816822fab51c820e25023863c239c1'>extras/Makefile.am</a></div><div class='hunk'>@@ -1,11 +1,77 @@</div><div class='add'>+addonexecdir = $(GLUSTERFS_LIBEXECDIR)</div><div class='add'>+addonexec_SCRIPTS =</div><div class='add'>+if WITH_SERVER</div><div class='add'>+addonexec_SCRIPTS += peer_add_secret_pub</div><div class='add'>+if USE_SYSTEMD</div><div class='add'>+addonexec_SCRIPTS += mount-shared-storage.sh</div><div class='add'>+endif</div><div class='add'>+endif</div><div class='ctx'> </div><div class='del'>-docdir = $(datadir)/doc/glusterfs/</div><div class='del'>-EditorModedir = $(docdir)/</div><div class='add'>+EditorModedir = $(docdir)</div><div class='ctx'> EditorMode_DATA = glusterfs-mode.el glusterfs.vim</div><div class='ctx'> </div><div class='del'>-dist_bin_SCRIPTS = glusterfs-defrag</div><div class='add'>+SUBDIRS = init.d systemd benchmarking hook-scripts $(OCF_SUBDIR) LinuxRPM \</div><div class='add'>+          $(GEOREP_EXTRAS_SUBDIR) snap_scheduler firewalld cliutils python \</div><div class='add'>+		  ganesha</div><div class='ctx'> </div><div class='del'>-SUBDIRS = init.d benchmarking volgen</div><div class='add'>+confdir = $(sysconfdir)/glusterfs</div><div class='add'>+if WITH_SERVER</div><div class='add'>+conf_DATA = glusterfs-logrotate gluster-rsyslog-7.2.conf gluster-rsyslog-5.8.conf \</div><div class='add'>+	    logger.conf.example glusterfs-georep-logrotate group-virt.example \</div><div class='add'>+	    group-metadata-cache group-gluster-block group-nl-cache \</div><div class='add'>+	    group-db-workload group-distributed-virt group-samba</div><div class='add'>+endif</div><div class='ctx'> </div><div class='del'>-EXTRA_DIST = specgen.scm MacOSX/Portfile glusterfs-mode.el glusterfs.vim migrate-unify-to-distribute.sh backend-xattr-sanitize.sh backend-cleanup.sh glusterfs-defrag disk_usage_sync.sh</div><div class='add'>+voldir = $(sysconfdir)/glusterfs</div><div class='add'>+vol_DATA = thin-arbiter/thin-arbiter.vol</div><div class='add'>+if WITH_SERVER</div><div class='add'>+vol_DATA += glusterd.vol</div><div class='add'>+endif</div><div class='ctx'> </div><div class='add'>+scriptsdir = $(datadir)/glusterfs/scripts</div><div class='add'>+scripts_SCRIPTS = thin-arbiter/setup-thin-arbiter.sh</div><div class='add'>+if WITH_SERVER</div><div class='add'>+scripts_SCRIPTS += post-upgrade-script-for-quota.sh \</div><div class='add'>+	pre-upgrade-script-for-quota.sh stop-all-gluster-processes.sh</div><div class='add'>+if USE_SYSTEMD</div><div class='add'>+scripts_SCRIPTS += control-cpu-load.sh</div><div class='add'>+scripts_SCRIPTS += control-mem.sh</div><div class='add'>+endif</div><div class='add'>+endif</div><div class='add'>+</div><div class='add'>+EXTRA_DIST = glusterfs-logrotate gluster-rsyslog-7.2.conf gluster-rsyslog-5.8.conf \</div><div class='add'>+	logger.conf.example glusterfs-georep-logrotate group-virt.example \</div><div class='add'>+	group-metadata-cache group-gluster-block group-nl-cache \</div><div class='add'>+	group-db-workload group-samba specgen.scm glusterfs-mode.el glusterfs.vim \</div><div class='add'>+	migrate-unify-to-distribute.sh backend-xattr-sanitize.sh \</div><div class='add'>+	backend-cleanup.sh disk_usage_sync.sh clear_xattrs.sh \</div><div class='add'>+	glusterd-sysconfig glusterd.vol post-upgrade-script-for-quota.sh \</div><div class='add'>+	pre-upgrade-script-for-quota.sh command-completion/gluster.bash \</div><div class='add'>+	command-completion/Makefile command-completion/README \</div><div class='add'>+	stop-all-gluster-processes.sh clang-checker.sh mount-shared-storage.sh \</div><div class='add'>+	control-cpu-load.sh control-mem.sh group-distributed-virt \</div><div class='add'>+	thin-arbiter/thin-arbiter.vol thin-arbiter/setup-thin-arbiter.sh</div><div class='add'>+</div><div class='add'>+if WITH_SERVER</div><div class='add'>+install-data-local:</div><div class='add'>+	if [ -n "$(tmpfilesdir)" ]; then \</div><div class='add'>+		$(mkdir_p) $(DESTDIR)$(tmpfilesdir); \</div><div class='add'>+		$(INSTALL_DATA) run-gluster.tmpfiles \</div><div class='add'>+			$(DESTDIR)$(tmpfilesdir)/gluster.conf; \</div><div class='add'>+	fi</div><div class='add'>+	$(mkdir_p) $(DESTDIR)$(GLUSTERD_WORKDIR)/groups</div><div class='add'>+	$(INSTALL_DATA) $(top_srcdir)/extras/group-virt.example \</div><div class='add'>+		$(DESTDIR)$(GLUSTERD_WORKDIR)/groups/virt</div><div class='add'>+	$(INSTALL_DATA) $(top_srcdir)/extras/group-metadata-cache \</div><div class='add'>+		$(DESTDIR)$(GLUSTERD_WORKDIR)/groups/metadata-cache</div><div class='add'>+	$(INSTALL_DATA) $(top_srcdir)/extras/group-gluster-block \</div><div class='add'>+		$(DESTDIR)$(GLUSTERD_WORKDIR)/groups/gluster-block</div><div class='add'>+	$(INSTALL_DATA) $(top_srcdir)/extras/group-nl-cache \</div><div class='add'>+		$(DESTDIR)$(GLUSTERD_WORKDIR)/groups/nl-cache</div><div class='add'>+	$(INSTALL_DATA) $(top_srcdir)/extras/group-db-workload \</div><div class='add'>+		$(DESTDIR)$(GLUSTERD_WORKDIR)/groups/db-workload</div><div class='add'>+	$(INSTALL_DATA) $(top_srcdir)/extras/group-distributed-virt \</div><div class='add'>+		$(DESTDIR)$(GLUSTERD_WORKDIR)/groups/distributed-virt</div><div class='add'>+	$(INSTALL_DATA) $(top_srcdir)/extras/group-samba \</div><div class='add'>+		$(DESTDIR)$(GLUSTERD_WORKDIR)/groups/samba</div><div class='add'>+endif</div><div class='head'>diff --git a/extras/Solaris/README.solaris b/extras/Solaris/README.solaris<br/>index ddb70c22c0e..5a4e4336d24 100644<br/>--- a/<a href='/cgit/glusterfs.git/tree/extras/Solaris/README.solaris?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/Solaris/README.solaris</a><br/>+++ b/<a href='/cgit/glusterfs.git/tree/extras/Solaris/README.solaris?id=d1d7a6f35c816822fab51c820e25023863c239c1'>extras/Solaris/README.solaris</a></div><div class='hunk'>@@ -10,7 +10,7 @@ $ which glusterfs</div><div class='ctx'> $ glusterfs --version</div><div class='ctx'> glusterfs 2.0.0rc1 built on Jan 16 2009 03:36:59</div><div class='ctx'> Repository revision: glusterfs--mainline--3.0--patch-844</div><div class='del'>-Copyright (c) 2006, 2007, 2008 Gluster Inc. &lt;http://www.gluster.com&gt;</div><div class='add'>+Copyright (c) 2006-2011 Gluster Inc. &lt;http://www.gluster.com&gt;</div><div class='ctx'> GlusterFS comes with ABSOLUTELY NO WARRANTY.</div><div class='ctx'> You may redistribute copies of GlusterFS under the terms of the GNU General Public License.</div><div class='ctx'> </div><div class='head'>diff --git a/extras/Ubuntu/README.Ubuntu b/extras/Ubuntu/README.Ubuntu<br/>new file mode 100644<br/>index 00000000000..890da3ca614<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/extras/Ubuntu/README.Ubuntu?id=d1d7a6f35c816822fab51c820e25023863c239c1'>extras/Ubuntu/README.Ubuntu</a></div><div class='hunk'>@@ -0,0 +1,26 @@</div><div class='add'>+Bug 765014 - Mounting from localhost in fstab fails at boot on ubuntu</div><div class='add'>+(original bug: https://bugzilla.redhat.com/show_bug.cgi?id=765014)</div><div class='add'>+(updated in: https://bugzilla.redhat.com/show_bug.cgi?id=1047007)</div><div class='add'>+(https://bugs.launchpad.net/ubuntu/+source/glusterfs/+bug/876648)</div><div class='add'>+</div><div class='add'>+Ubuntu uses upstart instead of init to bootstrap the system and it has a unique</div><div class='add'>+way of handling fstab, using a program called mountall(8).  As a result of using</div><div class='add'>+a debian initscript to start glusterd, glusterfs mounts in fstab are tried before</div><div class='add'>+the glusterd service is running.  In the case where the client is also a server</div><div class='add'>+and the volume is mounted from localhost, the mount fails at boot time.  To</div><div class='add'>+correct this we need to launch glusterd using upstart and block the glusterfs</div><div class='add'>+mounting event until glusterd is started.</div><div class='add'>+</div><div class='add'>+The glusterfs-server.conf file contains the necessary configuration for upstart to</div><div class='add'>+manage the glusterd service.  It should be placed in /etc/init/glusterfs-server.conf</div><div class='add'>+on Ubuntu systems, and then the old initscript /etc/init.d/glusterd can be</div><div class='add'>+removed.  An additional upstart job, mounting-glusterfs.conf, is also required</div><div class='add'>+to block mounting glusterfs volumes until the network interfaces are available.</div><div class='add'>+Both of these upstart jobs need to be placed in /etc/init to resolve the issue.</div><div class='add'>+</div><div class='add'>+Starting with Ubuntu 14.04, Trusty Tahr, these upstart jobs will be included </div><div class='add'>+with the glusterfs-server and glusterfs-client packages in the Ubuntu </div><div class='add'>+universe repository.</div><div class='add'>+</div><div class='add'>+This affects all versions of glusterfs on the Ubuntu platform since at least</div><div class='add'>+10.04, Lucid Lynx.</div><div class='head'>diff --git a/extras/Ubuntu/glusterfs-server.conf b/extras/Ubuntu/glusterfs-server.conf<br/>new file mode 100644<br/>index 00000000000..aa99502b0a7<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/extras/Ubuntu/glusterfs-server.conf?id=d1d7a6f35c816822fab51c820e25023863c239c1'>extras/Ubuntu/glusterfs-server.conf</a></div><div class='hunk'>@@ -0,0 +1,10 @@</div><div class='add'>+author "Louis Zuckerman &lt;me@louiszuckerman.com&gt;"</div><div class='add'>+description "GlusterFS Management Daemon"</div><div class='add'>+</div><div class='add'>+start on runlevel [2345]</div><div class='add'>+stop on runlevel [016]</div><div class='add'>+</div><div class='add'>+expect fork</div><div class='add'>+</div><div class='add'>+exec /usr/sbin/glusterd -p /var/run/glusterd.pid</div><div class='add'>+</div><div class='head'>diff --git a/extras/Ubuntu/mounting-glusterfs.conf b/extras/Ubuntu/mounting-glusterfs.conf<br/>new file mode 100644<br/>index 00000000000..786ef16df04<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/extras/Ubuntu/mounting-glusterfs.conf?id=d1d7a6f35c816822fab51c820e25023863c239c1'>extras/Ubuntu/mounting-glusterfs.conf</a></div><div class='hunk'>@@ -0,0 +1,6 @@</div><div class='add'>+author "Louis Zuckerman &lt;me@louiszuckerman.com&gt;"</div><div class='add'>+description "Block the mounting event for glusterfs filesystems until the network interfaces are running"</div><div class='add'>+</div><div class='add'>+start on mounting TYPE=glusterfs</div><div class='add'>+task</div><div class='add'>+exec start wait-for-state WAIT_FOR=static-network-up WAITER=mounting-glusterfs</div><div class='head'>diff --git a/extras/backend-cleanup.sh b/extras/backend-cleanup.sh<br/>index 755161f18c9..cb0a1d8871f 100644<br/>--- a/<a href='/cgit/glusterfs.git/tree/extras/backend-cleanup.sh?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/backend-cleanup.sh</a><br/>+++ b/<a href='/cgit/glusterfs.git/tree/extras/backend-cleanup.sh?id=d1d7a6f35c816822fab51c820e25023863c239c1'>extras/backend-cleanup.sh</a></div><div class='hunk'>@@ -7,7 +7,7 @@</div><div class='ctx'> # This script has to be run on the servers, which are exporting the data to </div><div class='ctx'> # GlusterFS</div><div class='ctx'> #</div><div class='del'>-# (c) 2009 Gluster Inc &lt;http://www.gluster.com/&gt; </div><div class='add'>+# (c) 2010 Gluster Inc &lt;http://www.gluster.com/&gt; </div><div class='ctx'> </div><div class='ctx'> set -e</div><div class='ctx'> </div><div class='hunk'>@@ -17,7 +17,7 @@ export_directory="/export/glusterfs"</div><div class='ctx'> clean_dir()</div><div class='ctx'> {</div><div class='ctx'>     # Clean the 'link' files on backend</div><div class='del'>-    find "${export_directory}" -type f -perm +01000 -exec rm -v '{}' \; </div><div class='add'>+    find "${export_directory}" -type f -perm /01000 -exec rm -v '{}' \;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> main()</div><div class='head'>diff --git a/extras/benchmarking/Makefile.am b/extras/benchmarking/Makefile.am<br/>index 04cc06182ab..bfcc59277a5 100644<br/>--- a/<a href='/cgit/glusterfs.git/tree/extras/benchmarking/Makefile.am?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/benchmarking/Makefile.am</a><br/>+++ b/<a href='/cgit/glusterfs.git/tree/extras/benchmarking/Makefile.am?id=d1d7a6f35c816822fab51c820e25023863c239c1'>extras/benchmarking/Makefile.am</a></div><div class='hunk'>@@ -1,7 +1,5 @@</div><div class='ctx'> </div><div class='del'>-docdir = $(datadir)/doc/$(PACKAGE_NAME)/benchmarking</div><div class='del'>-</div><div class='del'>-benchmarkingdir = $(docdir)</div><div class='add'>+benchmarkingdir = $(docdir)/benchmarking</div><div class='ctx'> </div><div class='ctx'> benchmarking_DATA = rdd.c glfs-bm.c README launch-script.sh local-script.sh</div><div class='ctx'> </div><div class='head'>diff --git a/extras/benchmarking/glfs-bm.c b/extras/benchmarking/glfs-bm.c<br/>index 42e367d7fa4..f7f5873f84d 100644<br/>--- a/<a href='/cgit/glusterfs.git/tree/extras/benchmarking/glfs-bm.c?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/benchmarking/glfs-bm.c</a><br/>+++ b/<a href='/cgit/glusterfs.git/tree/extras/benchmarking/glfs-bm.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>extras/benchmarking/glfs-bm.c</a></div><div class='hunk'>@@ -1,28 +1,18 @@</div><div class='del'>-/*                                                                  </div><div class='del'>-  Copyright (c) 2008-2009 Gluster, Inc. &lt;http://www.gluster.com&gt; </div><div class='del'>-  This file is part of GlusterFS.                             </div><div class='del'>-  GlusterFS is free software; you can redistribute it and/or modify </div><div class='del'>-  it under the terms of the GNU General Public License as published </div><div class='del'>-  by the Free Software Foundation; either version 3 of the License, </div><div class='del'>-  or (at your option) any later version.                            </div><div class='del'>-</div><div class='del'>-  GlusterFS is distributed in the hope that it will be useful, but </div><div class='del'>-  WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-  General Public License for more details. </div><div class='del'>-                                                                                   </div><div class='del'>-  You should have received a copy of the GNU General Public License </div><div class='del'>-  along with this program.  If not, see </div><div class='del'>-  &lt;http://www.gnu.org/licenses/&gt;.  </div><div class='add'>+/*</div><div class='add'>+   Copyright (c) 2008-2012 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+   This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+   This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+   General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+   later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+   cases as published by the Free Software Foundation.</div><div class='ctx'> */</div><div class='del'>-</div><div class='ctx'> #define _GNU_SOURCE</div><div class='ctx'> #define __USE_FILE_OFFSET64</div><div class='ctx'> #define _FILE_OFFSET_BITS 64</div><div class='ctx'> </div><div class='ctx'> #include &lt;stdio.h&gt;</div><div class='ctx'> #include &lt;argp.h&gt;</div><div class='del'>-#include &lt;libglusterfsclient.h&gt;</div><div class='ctx'> #include &lt;stdlib.h&gt;</div><div class='ctx'> #include &lt;unistd.h&gt;</div><div class='ctx'> #include &lt;sys/types.h&gt;</div><div class='hunk'>@@ -35,593 +25,338 @@</div><div class='ctx'> #include &lt;sys/time.h&gt;</div><div class='ctx'> </div><div class='ctx'> struct state {</div><div class='del'>-        char need_op_write:1;</div><div class='del'>-        char need_op_read:1;</div><div class='add'>+    char need_op_write : 1;</div><div class='add'>+    char need_op_read : 1;</div><div class='ctx'> </div><div class='del'>-        char need_iface_fileio:1;</div><div class='del'>-        char need_iface_xattr:1;</div><div class='add'>+    char need_iface_fileio : 1;</div><div class='add'>+    char need_iface_xattr : 1;</div><div class='ctx'> </div><div class='del'>-        char need_mode_posix:1;</div><div class='del'>-        char need_mode_libglusterfsclient:1;</div><div class='add'>+    char need_mode_posix : 1;</div><div class='ctx'> </div><div class='del'>-        char prefix[512];</div><div class='del'>-        long int count;</div><div class='add'>+    char prefix[512];</div><div class='add'>+    long int count;</div><div class='ctx'> </div><div class='del'>-        size_t block_size;</div><div class='add'>+    size_t block_size;</div><div class='ctx'> </div><div class='del'>-        char *specfile;</div><div class='del'>-        void *libglusterfsclient_context;</div><div class='add'>+    char *specfile;</div><div class='ctx'> </div><div class='del'>-        long int io_size;</div><div class='add'>+    long int io_size;</div><div class='ctx'> };</div><div class='ctx'> </div><div class='del'>-</div><div class='del'>-#define MEASURE(func, arg) measure (func, #func, arg)</div><div class='del'>-</div><div class='add'>+#define MEASURE(func, arg) measure(func, #func, arg)</div><div class='ctx'> </div><div class='ctx'> void</div><div class='del'>-tv_difference (struct timeval *tv_stop,</div><div class='del'>-               struct timeval *tv_start,</div><div class='del'>-               struct timeval *tv_diff)</div><div class='add'>+tv_difference(struct timeval *tv_stop, struct timeval *tv_start,</div><div class='add'>+              struct timeval *tv_diff)</div><div class='ctx'> {</div><div class='del'>-        if (tv_stop-&gt;tv_usec &lt; tv_start-&gt;tv_usec) {</div><div class='del'>-                tv_diff-&gt;tv_usec = (tv_stop-&gt;tv_usec + 1000000) - tv_start-&gt;tv_usec;</div><div class='del'>-                tv_diff-&gt;tv_sec = (tv_stop-&gt;tv_sec - 1 - tv_start-&gt;tv_sec);</div><div class='del'>-        } else {</div><div class='del'>-                tv_diff-&gt;tv_usec = tv_stop-&gt;tv_usec - tv_start-&gt;tv_usec;</div><div class='del'>-                tv_diff-&gt;tv_sec = tv_stop-&gt;tv_sec - tv_start-&gt;tv_sec;</div><div class='del'>-        }</div><div class='add'>+    if (tv_stop-&gt;tv_usec &lt; tv_start-&gt;tv_usec) {</div><div class='add'>+        tv_diff-&gt;tv_usec = (tv_stop-&gt;tv_usec + 1000000) - tv_start-&gt;tv_usec;</div><div class='add'>+        tv_diff-&gt;tv_sec = (tv_stop-&gt;tv_sec - 1 - tv_start-&gt;tv_sec);</div><div class='add'>+    } else {</div><div class='add'>+        tv_diff-&gt;tv_usec = tv_stop-&gt;tv_usec - tv_start-&gt;tv_usec;</div><div class='add'>+        tv_diff-&gt;tv_sec = tv_stop-&gt;tv_sec - tv_start-&gt;tv_sec;</div><div class='add'>+    }</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> void</div><div class='del'>-measure (int (*func)(struct state *state),</div><div class='del'>-         char *func_name, struct state *state)</div><div class='add'>+measure(int (*func)(struct state *state), char *func_name, struct state *state)</div><div class='ctx'> {</div><div class='del'>-        struct timeval tv_start, tv_stop, tv_diff;</div><div class='del'>-        state-&gt;io_size = 0;</div><div class='del'>-        long int count;</div><div class='add'>+    struct timeval tv_start, tv_stop, tv_diff;</div><div class='add'>+    state-&gt;io_size = 0;</div><div class='add'>+    long int count;</div><div class='ctx'> </div><div class='del'>-        gettimeofday (&amp;tv_start, NULL);</div><div class='del'>-        count = func (state);</div><div class='del'>-        gettimeofday (&amp;tv_stop, NULL);</div><div class='add'>+    gettimeofday(&amp;tv_start, NULL);</div><div class='add'>+    count = func(state);</div><div class='add'>+    gettimeofday(&amp;tv_stop, NULL);</div><div class='ctx'> </div><div class='del'>-        tv_difference (&amp;tv_stop, &amp;tv_start, &amp;tv_diff);</div><div class='add'>+    tv_difference(&amp;tv_stop, &amp;tv_start, &amp;tv_diff);</div><div class='ctx'> </div><div class='del'>-        fprintf (stdout, "%s: count=%ld, size=%ld, time=%ld:%ld\n",</div><div class='del'>-                 func_name, count, state-&gt;io_size,</div><div class='del'>-                 tv_diff.tv_sec, tv_diff.tv_usec);</div><div class='add'>+    fprintf(stdout, "%s: count=%ld, size=%ld, time=%ld:%ld\n", func_name, count,</div><div class='add'>+            state-&gt;io_size, tv_diff.tv_sec, tv_diff.tv_usec);</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> static error_t</div><div class='del'>-parse_opts (int key, char *arg,</div><div class='del'>-            struct argp_state *_state)</div><div class='add'>+parse_opts(int key, char *arg, struct argp_state *_state)</div><div class='ctx'> {</div><div class='del'>-        struct state *state = _state-&gt;input;</div><div class='add'>+    struct state *state = _state-&gt;input;</div><div class='ctx'> </div><div class='del'>-        switch (key)</div><div class='del'>-        {</div><div class='add'>+    switch (key) {</div><div class='ctx'>         case 'o':</div><div class='del'>-                if (strcasecmp (arg, "read") == 0) {</div><div class='del'>-                        state-&gt;need_op_write = 0;</div><div class='del'>-                        state-&gt;need_op_read = 1;</div><div class='del'>-                } else if (strcasecmp (arg, "write") == 0) {</div><div class='del'>-                        state-&gt;need_op_write = 1;</div><div class='del'>-                        state-&gt;need_op_read = 0;</div><div class='del'>-                } else if (strcasecmp (arg, "both") == 0) {</div><div class='del'>-                        state-&gt;need_op_write = 1;</div><div class='del'>-                        state-&gt;need_op_read = 1;</div><div class='del'>-                } else {</div><div class='del'>-                        fprintf (stderr, "unknown op: %s\n", arg);</div><div class='del'>-                        return -1;</div><div class='del'>-                }</div><div class='del'>-                break;</div><div class='add'>+            if (strcasecmp(arg, "read") == 0) {</div><div class='add'>+                state-&gt;need_op_write = 0;</div><div class='add'>+                state-&gt;need_op_read = 1;</div><div class='add'>+            } else if (strcasecmp(arg, "write") == 0) {</div><div class='add'>+                state-&gt;need_op_write = 1;</div><div class='add'>+                state-&gt;need_op_read = 0;</div><div class='add'>+            } else if (strcasecmp(arg, "both") == 0) {</div><div class='add'>+                state-&gt;need_op_write = 1;</div><div class='add'>+                state-&gt;need_op_read = 1;</div><div class='add'>+            } else {</div><div class='add'>+                fprintf(stderr, "unknown op: %s\n", arg);</div><div class='add'>+                return -1;</div><div class='add'>+            }</div><div class='add'>+            break;</div><div class='ctx'>         case 'i':</div><div class='del'>-                if (strcasecmp (arg, "fileio") == 0) {</div><div class='del'>-                        state-&gt;need_iface_fileio = 1;</div><div class='del'>-                        state-&gt;need_iface_xattr = 0;</div><div class='del'>-                } else if (strcasecmp (arg, "xattr") == 0) {</div><div class='del'>-                        state-&gt;need_iface_fileio = 0;</div><div class='del'>-                        state-&gt;need_iface_xattr = 1;</div><div class='del'>-                } else if (strcasecmp (arg, "both") == 0) {</div><div class='del'>-                        state-&gt;need_iface_fileio = 1;</div><div class='del'>-                        state-&gt;need_iface_xattr = 1;</div><div class='del'>-                } else {</div><div class='del'>-                        fprintf (stderr, "unknown interface: %s\n", arg);</div><div class='del'>-                        return -1;</div><div class='del'>-                }</div><div class='del'>-                break;</div><div class='del'>-        case 'm':</div><div class='del'>-                if (strcasecmp (arg, "posix") == 0) {</div><div class='del'>-                        state-&gt;need_mode_posix = 1;</div><div class='del'>-                        state-&gt;need_mode_libglusterfsclient = 0;</div><div class='del'>-                } else if (strcasecmp (arg, "libglusterfsclient") == 0) {</div><div class='del'>-                        state-&gt;need_mode_posix = 0;</div><div class='del'>-                        state-&gt;need_mode_libglusterfsclient = 1;</div><div class='del'>-                } else if (strcasecmp (arg, "both") == 0) {</div><div class='del'>-                        state-&gt;need_mode_posix = 1;</div><div class='del'>-                        state-&gt;need_mode_libglusterfsclient = 1;</div><div class='del'>-                } else {</div><div class='del'>-                        fprintf (stderr, "unknown mode: %s\n", arg);</div><div class='del'>-                        return -1;</div><div class='del'>-                }</div><div class='del'>-                break;</div><div class='del'>-        case 'b':</div><div class='del'>-        {</div><div class='del'>-                size_t block_size = atoi (arg);</div><div class='del'>-                if (!block_size) {</div><div class='del'>-                        fprintf (stderr, "incorrect size: %s\n", arg);</div><div class='del'>-                        return -1;</div><div class='del'>-                }</div><div class='del'>-                state-&gt;block_size = block_size;</div><div class='del'>-        }</div><div class='del'>-        break;</div><div class='add'>+            if (strcasecmp(arg, "fileio") == 0) {</div><div class='add'>+                state-&gt;need_iface_fileio = 1;</div><div class='add'>+                state-&gt;need_iface_xattr = 0;</div><div class='add'>+            } else if (strcasecmp(arg, "xattr") == 0) {</div><div class='add'>+                state-&gt;need_iface_fileio = 0;</div><div class='add'>+                state-&gt;need_iface_xattr = 1;</div><div class='add'>+            } else if (strcasecmp(arg, "both") == 0) {</div><div class='add'>+                state-&gt;need_iface_fileio = 1;</div><div class='add'>+                state-&gt;need_iface_xattr = 1;</div><div class='add'>+            } else {</div><div class='add'>+                fprintf(stderr, "unknown interface: %s\n", arg);</div><div class='add'>+                return -1;</div><div class='add'>+            }</div><div class='add'>+            break;</div><div class='add'>+        case 'b': {</div><div class='add'>+            size_t block_size = atoi(arg);</div><div class='add'>+            if (!block_size) {</div><div class='add'>+                fprintf(stderr, "incorrect size: %s\n", arg);</div><div class='add'>+                return -1;</div><div class='add'>+            }</div><div class='add'>+            state-&gt;block_size = block_size;</div><div class='add'>+        } break;</div><div class='ctx'>         case 's':</div><div class='del'>-                state-&gt;specfile = strdup (arg);</div><div class='del'>-                break;</div><div class='add'>+            state-&gt;specfile = strdup(arg);</div><div class='add'>+            break;</div><div class='ctx'>         case 'p':</div><div class='del'>-                fprintf (stderr, "using prefix: %s\n", arg);</div><div class='del'>-                strncpy (state-&gt;prefix, arg, 512);</div><div class='del'>-                break;</div><div class='del'>-        case 'c':</div><div class='del'>-        {</div><div class='del'>-                long count = atol (arg);</div><div class='del'>-                if (!count) {</div><div class='del'>-                        fprintf (stderr, "incorrect count: %s\n", arg);</div><div class='del'>-                        return -1;</div><div class='del'>-                }</div><div class='del'>-                state-&gt;count = count;</div><div class='del'>-        }</div><div class='del'>-        break;</div><div class='add'>+            fprintf(stderr, "using prefix: %s\n", arg);</div><div class='add'>+            strncpy(state-&gt;prefix, arg, 512);</div><div class='add'>+            break;</div><div class='add'>+        case 'c': {</div><div class='add'>+            long count = atol(arg);</div><div class='add'>+            if (!count) {</div><div class='add'>+                fprintf(stderr, "incorrect count: %s\n", arg);</div><div class='add'>+                return -1;</div><div class='add'>+            }</div><div class='add'>+            state-&gt;count = count;</div><div class='add'>+        } break;</div><div class='ctx'>         case ARGP_KEY_NO_ARGS:</div><div class='del'>-                break;</div><div class='add'>+            break;</div><div class='ctx'>         case ARGP_KEY_ARG:</div><div class='del'>-                break;</div><div class='del'>-        }</div><div class='add'>+            break;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        return 0;</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-do_mode_posix_iface_fileio_write (struct state *state)</div><div class='add'>+do_mode_posix_iface_fileio_write(struct state *state)</div><div class='ctx'> {</div><div class='del'>-        long int i;</div><div class='del'>-        int ret = -1;</div><div class='del'>-        char block[state-&gt;block_size];</div><div class='del'>-</div><div class='del'>-        for (i=0; i&lt;state-&gt;count; i++) {</div><div class='del'>-                int fd = -1;</div><div class='del'>-                char filename[512];</div><div class='del'>-</div><div class='del'>-                sprintf (filename, "%s.%06ld", state-&gt;prefix, i);</div><div class='del'>-</div><div class='del'>-                fd = open (filename, O_CREAT|O_WRONLY, 00600);</div><div class='del'>-                if (fd == -1) {</div><div class='del'>-                        fprintf (stderr, "open(%s) =&gt; %s\n", filename, strerror (errno));</div><div class='del'>-                        break;</div><div class='del'>-                }</div><div class='del'>-                ret = write (fd, block, state-&gt;block_size);</div><div class='del'>-                if (ret != state-&gt;block_size) {</div><div class='del'>-                        fprintf (stderr, "write (%s) =&gt; %d/%s\n", filename, ret,</div><div class='del'>-                                 strerror (errno));</div><div class='del'>-                        close (fd);</div><div class='del'>-                        break;</div><div class='del'>-                }</div><div class='del'>-                close (fd);</div><div class='del'>-                state-&gt;io_size += ret;</div><div class='del'>-        }</div><div class='add'>+    long int i;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    char block[state-&gt;block_size];</div><div class='ctx'> </div><div class='del'>-        return i;</div><div class='del'>-}</div><div class='add'>+    for (i = 0; i &lt; state-&gt;count; i++) {</div><div class='add'>+        int fd = -1;</div><div class='add'>+        char filename[512];</div><div class='ctx'> </div><div class='add'>+        sprintf(filename, "%s.%06ld", state-&gt;prefix, i);</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-do_mode_posix_iface_fileio_read (struct state *state)</div><div class='del'>-{</div><div class='del'>-        long int i;</div><div class='del'>-        int ret = -1;</div><div class='del'>-        char block[state-&gt;block_size];</div><div class='del'>-</div><div class='del'>-        for (i=0; i&lt;state-&gt;count; i++) {</div><div class='del'>-                int fd = -1;</div><div class='del'>-                char filename[512];</div><div class='del'>-</div><div class='del'>-                sprintf (filename, "%s.%06ld", state-&gt;prefix, i);</div><div class='del'>-</div><div class='del'>-                fd = open (filename, O_RDONLY);</div><div class='del'>-                if (fd == -1) {</div><div class='del'>-                        fprintf (stderr, "open(%s) =&gt; %s\n", filename, strerror (errno));</div><div class='del'>-                        break;</div><div class='del'>-                }</div><div class='del'>-                ret = read (fd, block, state-&gt;block_size);</div><div class='del'>-                if (ret == -1) {</div><div class='del'>-                        fprintf (stderr, "read(%s) =&gt; %d/%s\n", filename, ret, strerror (errno));</div><div class='del'>-                        close (fd);</div><div class='del'>-                        break;</div><div class='del'>-                }</div><div class='del'>-                close (fd);</div><div class='del'>-                state-&gt;io_size += ret;</div><div class='add'>+        fd = open(filename, O_CREAT | O_WRONLY, 00600);</div><div class='add'>+        if (fd == -1) {</div><div class='add'>+            fprintf(stderr, "open(%s) =&gt; %s\n", filename, strerror(errno));</div><div class='add'>+            break;</div><div class='ctx'>         }</div><div class='add'>+        ret = write(fd, block, state-&gt;block_size);</div><div class='add'>+        if (ret != state-&gt;block_size) {</div><div class='add'>+            fprintf(stderr, "write (%s) =&gt; %d/%s\n", filename, ret,</div><div class='add'>+                    strerror(errno));</div><div class='add'>+            close(fd);</div><div class='add'>+            break;</div><div class='add'>+        }</div><div class='add'>+        close(fd);</div><div class='add'>+        state-&gt;io_size += ret;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        return i;</div><div class='add'>+    return i;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-do_mode_posix_iface_fileio (struct state *state)</div><div class='add'>+do_mode_posix_iface_fileio_read(struct state *state)</div><div class='ctx'> {</div><div class='del'>-        if (state-&gt;need_op_write)</div><div class='del'>-                MEASURE (do_mode_posix_iface_fileio_write, state);</div><div class='add'>+    long int i;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    char block[state-&gt;block_size];</div><div class='ctx'> </div><div class='del'>-        if (state-&gt;need_op_read)</div><div class='del'>-                MEASURE (do_mode_posix_iface_fileio_read, state);</div><div class='del'>-</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='add'>+    for (i = 0; i &lt; state-&gt;count; i++) {</div><div class='add'>+        int fd = -1;</div><div class='add'>+        char filename[512];</div><div class='ctx'> </div><div class='add'>+        sprintf(filename, "%s.%06ld", state-&gt;prefix, i);</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-do_mode_posix_iface_xattr_write (struct state *state)</div><div class='del'>-{</div><div class='del'>-        long int i;</div><div class='del'>-        int ret = -1;</div><div class='del'>-        char block[state-&gt;block_size];</div><div class='del'>-        char *dname = NULL, *dirc = NULL;</div><div class='del'>-        char *bname = NULL, *basec = NULL;</div><div class='del'>-</div><div class='del'>-        dirc = strdup (state-&gt;prefix);</div><div class='del'>-        basec = strdup (state-&gt;prefix);</div><div class='del'>-        dname = dirname (dirc);</div><div class='del'>-        bname = basename (basec);</div><div class='del'>-</div><div class='del'>-        for (i=0; i&lt;state-&gt;count; i++) {</div><div class='del'>-                char key[512];</div><div class='del'>-</div><div class='del'>-                sprintf (key, "glusterfs.file.%s.%06ld", bname, i);</div><div class='del'>-</div><div class='del'>-                ret = lsetxattr (dname, key, block, state-&gt;block_size, 0);</div><div class='del'>-</div><div class='del'>-                if (ret != 0) {</div><div class='del'>-                        fprintf (stderr, "lsetxattr (%s, %s, %p) =&gt; %s\n",</div><div class='del'>-                                 dname, key, block, strerror (errno));</div><div class='del'>-                        break;</div><div class='del'>-                }</div><div class='del'>-                state-&gt;io_size += state-&gt;block_size;</div><div class='add'>+        fd = open(filename, O_RDONLY);</div><div class='add'>+        if (fd == -1) {</div><div class='add'>+            fprintf(stderr, "open(%s) =&gt; %s\n", filename, strerror(errno));</div><div class='add'>+            break;</div><div class='ctx'>         }</div><div class='del'>-</div><div class='del'>-        free (dirc);</div><div class='del'>-        free (basec);</div><div class='del'>-</div><div class='del'>-        return i;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-do_mode_posix_iface_xattr_read (struct state *state)</div><div class='del'>-{</div><div class='del'>-        long int i;</div><div class='del'>-        int ret = -1;</div><div class='del'>-        char block[state-&gt;block_size];</div><div class='del'>-        char *dname = NULL, *dirc = NULL;</div><div class='del'>-        char *bname = NULL, *basec = NULL;</div><div class='del'>-</div><div class='del'>-        dirc = strdup (state-&gt;prefix);</div><div class='del'>-        basec = strdup (state-&gt;prefix);</div><div class='del'>-        dname = dirname (dirc);</div><div class='del'>-        bname = basename (basec);</div><div class='del'>-</div><div class='del'>-        for (i=0; i&lt;state-&gt;count; i++) {</div><div class='del'>-                char key[512];</div><div class='del'>-</div><div class='del'>-                sprintf (key, "glusterfs.file.%s.%06ld", bname, i);</div><div class='del'>-</div><div class='del'>-                ret = lgetxattr (dname, key, block, state-&gt;block_size);</div><div class='del'>-</div><div class='del'>-                if (ret &lt; 0) {</div><div class='del'>-                        fprintf (stderr, "lgetxattr (%s, %s, %p) =&gt; %s\n",</div><div class='del'>-                                 dname, key, block, strerror (errno));</div><div class='del'>-                        break;</div><div class='del'>-                }</div><div class='del'>-                state-&gt;io_size += ret;</div><div class='add'>+        ret = read(fd, block, state-&gt;block_size);</div><div class='add'>+        if (ret == -1) {</div><div class='add'>+            fprintf(stderr, "read(%s) =&gt; %d/%s\n", filename, ret,</div><div class='add'>+                    strerror(errno));</div><div class='add'>+            close(fd);</div><div class='add'>+            break;</div><div class='ctx'>         }</div><div class='add'>+        close(fd);</div><div class='add'>+        state-&gt;io_size += ret;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        return i;</div><div class='add'>+    return i;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-do_mode_posix_iface_xattr (struct state *state)</div><div class='add'>+do_mode_posix_iface_fileio(struct state *state)</div><div class='ctx'> {</div><div class='del'>-        if (state-&gt;need_op_write)</div><div class='del'>-                MEASURE (do_mode_posix_iface_xattr_write, state);</div><div class='add'>+    if (state-&gt;need_op_write)</div><div class='add'>+        MEASURE(do_mode_posix_iface_fileio_write, state);</div><div class='ctx'> </div><div class='del'>-        if (state-&gt;need_op_read)</div><div class='del'>-                MEASURE (do_mode_posix_iface_xattr_read, state);</div><div class='add'>+    if (state-&gt;need_op_read)</div><div class='add'>+        MEASURE(do_mode_posix_iface_fileio_read, state);</div><div class='ctx'> </div><div class='del'>-        return 0;</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-do_mode_libglusterfsclient_iface_fileio_write (struct state *state)</div><div class='add'>+do_mode_posix_iface_xattr_write(struct state *state)</div><div class='ctx'> {</div><div class='del'>-        long int i;</div><div class='del'>-        int ret = -1;</div><div class='del'>-        char block[state-&gt;block_size];</div><div class='del'>-</div><div class='del'>-        for (i=0; i&lt;state-&gt;count; i++) {</div><div class='del'>-                glusterfs_file_t fd = 0;</div><div class='del'>-                char filename[512];</div><div class='del'>-</div><div class='del'>-                sprintf (filename, "/%s.%06ld", state-&gt;prefix, i);</div><div class='del'>-</div><div class='del'>-                fd = glusterfs_glh_open (state-&gt;libglusterfsclient_context,</div><div class='del'>-                                         filename, O_CREAT|O_WRONLY, 0);</div><div class='del'>-</div><div class='del'>-                if (fd == 0) {</div><div class='del'>-                        fprintf (stderr, "open(%s) =&gt; %s\n", filename, strerror (errno));</div><div class='del'>-                        break;</div><div class='del'>-                }</div><div class='del'>-                ret = glusterfs_write (fd, block, state-&gt;block_size);</div><div class='del'>-                if (ret == -1) {</div><div class='del'>-                        fprintf (stderr, "glusterfs_write(%s) =&gt; %s\n", filename, strerror (errno));</div><div class='del'>-                        glusterfs_close (fd);</div><div class='del'>-                        break;</div><div class='del'>-                }</div><div class='del'>-                glusterfs_close (fd);</div><div class='del'>-                state-&gt;io_size += ret;</div><div class='del'>-        }</div><div class='add'>+    long int i;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    char block[state-&gt;block_size];</div><div class='add'>+    char *dname = NULL, *dirc = NULL;</div><div class='add'>+    char *bname = NULL, *basec = NULL;</div><div class='ctx'> </div><div class='del'>-        return i;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-do_mode_libglusterfsclient_iface_fileio_read (struct state *state)</div><div class='del'>-{</div><div class='del'>-        long int i;</div><div class='del'>-        int ret = -1;</div><div class='del'>-        char block[state-&gt;block_size];</div><div class='del'>-</div><div class='del'>-        for (i=0; i&lt;state-&gt;count; i++) {</div><div class='del'>-                glusterfs_file_t fd = 0;</div><div class='del'>-                char filename[512];</div><div class='del'>-</div><div class='del'>-                sprintf (filename, "/%s.%06ld", state-&gt;prefix, i);</div><div class='del'>-</div><div class='del'>-                fd = glusterfs_glh_open (state-&gt;libglusterfsclient_context,</div><div class='del'>-                                         filename, O_RDONLY, 0);</div><div class='del'>-</div><div class='del'>-                if (fd == 0) {</div><div class='del'>-                        fprintf (stderr, "glusterfs_glh_open(%s) =&gt; %s\n",</div><div class='del'>-                                 filename, strerror (errno));</div><div class='del'>-                        break;</div><div class='del'>-                }</div><div class='del'>-                ret = glusterfs_read (fd, block, state-&gt;block_size);</div><div class='del'>-                if (ret == -1) {</div><div class='del'>-                        fprintf (stderr, "glusterfs_read(%s) =&gt; %s\n", filename,</div><div class='del'>-                                 strerror (errno));</div><div class='del'>-                        glusterfs_close (fd);</div><div class='del'>-                        break;</div><div class='del'>-                }</div><div class='del'>-                glusterfs_close (fd);</div><div class='del'>-                state-&gt;io_size += ret;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        return i;</div><div class='del'>-}</div><div class='add'>+    dirc = strdup(state-&gt;prefix);</div><div class='add'>+    basec = strdup(state-&gt;prefix);</div><div class='add'>+    dname = dirname(dirc);</div><div class='add'>+    bname = basename(basec);</div><div class='ctx'> </div><div class='add'>+    for (i = 0; i &lt; state-&gt;count; i++) {</div><div class='add'>+        char key[512];</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-do_mode_libglusterfsclient_iface_fileio (struct state *state)</div><div class='del'>-{</div><div class='del'>-        if (state-&gt;need_op_write)</div><div class='del'>-                MEASURE (do_mode_libglusterfsclient_iface_fileio_write, state);</div><div class='del'>-</div><div class='del'>-        if (state-&gt;need_op_read)</div><div class='del'>-                MEASURE (do_mode_libglusterfsclient_iface_fileio_read, state);</div><div class='del'>-</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='add'>+        sprintf(key, "glusterfs.file.%s.%06ld", bname, i);</div><div class='ctx'> </div><div class='add'>+        ret = lsetxattr(dname, key, block, state-&gt;block_size, 0);</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-do_mode_libglusterfsclient_iface_xattr_write (struct state *state)</div><div class='del'>-{</div><div class='del'>-        long int i;</div><div class='del'>-        int ret = -1;</div><div class='del'>-        char block[state-&gt;block_size];</div><div class='del'>-        char *dname = NULL, *dirc = NULL;</div><div class='del'>-        char *bname = NULL, *basec = NULL;</div><div class='del'>-</div><div class='del'>-        asprintf (&amp;dirc, "/%s", state-&gt;prefix);</div><div class='del'>-        asprintf (&amp;basec, "/%s", state-&gt;prefix);</div><div class='del'>-        dname = dirname (dirc);</div><div class='del'>-        bname = basename (basec);</div><div class='del'>-</div><div class='del'>-        for (i=0; i&lt;state-&gt;count; i++) {</div><div class='del'>-                char key[512];</div><div class='del'>-</div><div class='del'>-                sprintf (key, "glusterfs.file.%s.%06ld", bname, i);</div><div class='del'>-</div><div class='del'>-                ret = glusterfs_glh_setxattr (state-&gt;libglusterfsclient_context,</div><div class='del'>-                                              dname, key, block,</div><div class='del'>-                                              state-&gt;block_size, 0);</div><div class='del'>-</div><div class='del'>-                if (ret &lt; 0) {</div><div class='del'>-                        fprintf (stderr, "glusterfs_glh_setxattr (%s, %s, %p) "</div><div class='del'>-                                 "=&gt; %s\n", dname, key, block,</div><div class='del'>-                                 strerror (errno));</div><div class='del'>-                        break;</div><div class='del'>-                }</div><div class='del'>-                state-&gt;io_size += state-&gt;block_size;</div><div class='add'>+        if (ret != 0) {</div><div class='add'>+            fprintf(stderr, "lsetxattr (%s, %s, %p) =&gt; %s\n", dname, key, block,</div><div class='add'>+                    strerror(errno));</div><div class='add'>+            break;</div><div class='ctx'>         }</div><div class='add'>+        state-&gt;io_size += state-&gt;block_size;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        return i;</div><div class='add'>+    free(dirc);</div><div class='add'>+    free(basec);</div><div class='ctx'> </div><div class='add'>+    return i;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-do_mode_libglusterfsclient_iface_xattr_read (struct state *state)</div><div class='add'>+do_mode_posix_iface_xattr_read(struct state *state)</div><div class='ctx'> {</div><div class='del'>-        long int i;</div><div class='del'>-        int ret = -1;</div><div class='del'>-        char block[state-&gt;block_size];</div><div class='del'>-        char *dname = NULL, *dirc = NULL;</div><div class='del'>-        char *bname = NULL, *basec = NULL;</div><div class='del'>-</div><div class='del'>-        dirc = strdup (state-&gt;prefix);</div><div class='del'>-        basec = strdup (state-&gt;prefix);</div><div class='del'>-        dname = dirname (dirc);</div><div class='del'>-        bname = basename (basec);</div><div class='del'>-</div><div class='del'>-        for (i=0; i&lt;state-&gt;count; i++) {</div><div class='del'>-                char key[512];</div><div class='del'>-</div><div class='del'>-                sprintf (key, "glusterfs.file.%s.%06ld", bname, i);</div><div class='del'>-</div><div class='del'>-                ret = glusterfs_glh_getxattr (state-&gt;libglusterfsclient_context,</div><div class='del'>-                                              dname, key, block,</div><div class='del'>-                                              state-&gt;block_size);</div><div class='del'>-</div><div class='del'>-                if (ret &lt; 0) {</div><div class='del'>-                        fprintf (stderr, "glusterfs_glh_getxattr (%s, %s, %p) "</div><div class='del'>-                                 "=&gt; %s\n", dname, key, block,</div><div class='del'>-                                 strerror (errno));</div><div class='del'>-                        break;</div><div class='del'>-                }</div><div class='del'>-                state-&gt;io_size += ret;</div><div class='del'>-        }</div><div class='add'>+    long int i;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    char block[state-&gt;block_size];</div><div class='add'>+    char *dname = NULL, *dirc = NULL;</div><div class='add'>+    char *bname = NULL, *basec = NULL;</div><div class='ctx'> </div><div class='del'>-        return i;</div><div class='del'>-}</div><div class='add'>+    dirc = strdup(state-&gt;prefix);</div><div class='add'>+    basec = strdup(state-&gt;prefix);</div><div class='add'>+    dname = dirname(dirc);</div><div class='add'>+    bname = basename(basec);</div><div class='ctx'> </div><div class='add'>+    for (i = 0; i &lt; state-&gt;count; i++) {</div><div class='add'>+        char key[512];</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-do_mode_libglusterfsclient_iface_xattr (struct state *state)</div><div class='del'>-{</div><div class='del'>-        if (state-&gt;need_op_write)</div><div class='del'>-                MEASURE (do_mode_libglusterfsclient_iface_xattr_write, state);</div><div class='add'>+        sprintf(key, "glusterfs.file.%s.%06ld", bname, i);</div><div class='ctx'> </div><div class='del'>-        if (state-&gt;need_op_read)</div><div class='del'>-                MEASURE (do_mode_libglusterfsclient_iface_xattr_read, state);</div><div class='add'>+        ret = lgetxattr(dname, key, block, state-&gt;block_size);</div><div class='ctx'> </div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='add'>+        if (ret &lt; 0) {</div><div class='add'>+            fprintf(stderr, "lgetxattr (%s, %s, %p) =&gt; %s\n", dname, key, block,</div><div class='add'>+                    strerror(errno));</div><div class='add'>+            break;</div><div class='add'>+        }</div><div class='add'>+        state-&gt;io_size += ret;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='add'>+    return i;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-do_mode_posix (struct state *state)</div><div class='add'>+do_mode_posix_iface_xattr(struct state *state)</div><div class='ctx'> {</div><div class='del'>-        if (state-&gt;need_iface_fileio)</div><div class='del'>-                do_mode_posix_iface_fileio (state);</div><div class='add'>+    if (state-&gt;need_op_write)</div><div class='add'>+        MEASURE(do_mode_posix_iface_xattr_write, state);</div><div class='ctx'> </div><div class='del'>-        if (state-&gt;need_iface_xattr)</div><div class='del'>-                do_mode_posix_iface_xattr (state);</div><div class='add'>+    if (state-&gt;need_op_read)</div><div class='add'>+        MEASURE(do_mode_posix_iface_xattr_read, state);</div><div class='ctx'> </div><div class='del'>-        return 0;</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-do_mode_libglusterfsclient (struct state *state)</div><div class='add'>+do_mode_posix(struct state *state)</div><div class='ctx'> {</div><div class='del'>-        glusterfs_init_params_t ctx = {</div><div class='del'>-                .logfile = "/dev/stderr",</div><div class='del'>-                .loglevel = "error",</div><div class='del'>-                .lookup_timeout = 60,</div><div class='del'>-                .stat_timeout = 60,</div><div class='del'>-        };</div><div class='del'>-</div><div class='del'>-	ctx.specfile = state-&gt;specfile;</div><div class='del'>-        if (state-&gt;specfile) {</div><div class='del'>-                state-&gt;libglusterfsclient_context = glusterfs_init (&amp;ctx, 1);</div><div class='del'>-</div><div class='del'>-                if (!state-&gt;libglusterfsclient_context) {</div><div class='del'>-                        fprintf (stdout, "Unable to initialize glusterfs "</div><div class='del'>-                                 "context, skipping libglusterfsclient mode\n");</div><div class='del'>-                        return -1;</div><div class='del'>-                }</div><div class='del'>-        } else {</div><div class='del'>-                fprintf (stdout, "glusterfs volume specification file not "</div><div class='del'>-                         "provided, skipping libglusterfsclient mode\n");</div><div class='del'>-                return -1;</div><div class='del'>-        }</div><div class='add'>+    if (state-&gt;need_iface_fileio)</div><div class='add'>+        do_mode_posix_iface_fileio(state);</div><div class='ctx'> </div><div class='del'>-        if (state-&gt;need_iface_fileio)</div><div class='del'>-                do_mode_libglusterfsclient_iface_fileio (state);</div><div class='add'>+    if (state-&gt;need_iface_xattr)</div><div class='add'>+        do_mode_posix_iface_xattr(state);</div><div class='ctx'> </div><div class='del'>-        if (state-&gt;need_iface_xattr)</div><div class='del'>-                do_mode_libglusterfsclient_iface_xattr (state);</div><div class='del'>-</div><div class='del'>-        return 0;</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-do_actions (struct state *state)</div><div class='add'>+do_actions(struct state *state)</div><div class='ctx'> {</div><div class='del'>-        if (state-&gt;need_mode_libglusterfsclient)</div><div class='del'>-                do_mode_libglusterfsclient (state);</div><div class='add'>+    if (state-&gt;need_mode_posix)</div><div class='add'>+        do_mode_posix(state);</div><div class='ctx'> </div><div class='del'>-        if (state-&gt;need_mode_posix)</div><div class='del'>-                do_mode_posix (state);</div><div class='del'>-</div><div class='del'>-        return 0;</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> static struct argp_option options[] = {</div><div class='del'>-        {"op", 'o', "OPERATIONS", 0,</div><div class='del'>-         "WRITE|READ|BOTH - defaults to BOTH"},</div><div class='del'>-        {"iface", 'i', "INTERFACE", 0,</div><div class='del'>-         "FILEIO|XATTR|BOTH - defaults to FILEIO"},</div><div class='del'>-        {"mode", 'm', "MODE", 0,</div><div class='del'>-         "POSIX|LIBGLUSTERFSCLIENT|BOTH - defaults to POSIX"},</div><div class='del'>-        {"block", 'b', "BLOCKSIZE", 0,</div><div class='del'>-         "&lt;NUM&gt; - defaults to 4096"},</div><div class='del'>-        {"specfile", 's', "SPECFILE", 0,</div><div class='del'>-         "absolute path to specfile"},</div><div class='del'>-        {"prefix", 'p', "PREFIX", 0,</div><div class='del'>-         "filename prefix"},</div><div class='del'>-        {"count", 'c', "COUNT", 0,</div><div class='del'>-         "number of files"},</div><div class='del'>-        {0, 0, 0, 0, 0}</div><div class='del'>-};</div><div class='add'>+    {"op", 'o', "OPERATIONS", 0, "WRITE|READ|BOTH - defaults to BOTH"},</div><div class='add'>+    {"iface", 'i', "INTERFACE", 0, "FILEIO|XATTR|BOTH - defaults to FILEIO"},</div><div class='add'>+    {"block", 'b', "BLOCKSIZE", 0, "&lt;NUM&gt; - defaults to 4096"},</div><div class='add'>+    {"specfile", 's', "SPECFILE", 0, "absolute path to specfile"},</div><div class='add'>+    {"prefix", 'p', "PREFIX", 0, "filename prefix"},</div><div class='add'>+    {"count", 'c', "COUNT", 0, "number of files"},</div><div class='add'>+    {0, 0, 0, 0, 0}};</div><div class='ctx'> </div><div class='del'>-static struct argp argp = {</div><div class='del'>-        options,</div><div class='del'>-        parse_opts,</div><div class='del'>-        "tool",</div><div class='del'>-        "tool to benchmark small file performance"</div><div class='del'>-};</div><div class='add'>+static struct argp argp = {options, parse_opts, "tool",</div><div class='add'>+                           "tool to benchmark small file performance"};</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-main (int argc, char *argv[])</div><div class='add'>+main(int argc, char *argv[])</div><div class='ctx'> {</div><div class='del'>-        struct state state = {0, };</div><div class='add'>+    struct state state = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='ctx'> </div><div class='del'>-        state.need_op_write = 1;</div><div class='del'>-        state.need_op_read = 1;</div><div class='add'>+    state.need_op_write = 1;</div><div class='add'>+    state.need_op_read = 1;</div><div class='ctx'> </div><div class='del'>-        state.need_iface_fileio = 1;</div><div class='del'>-        state.need_iface_xattr = 0;</div><div class='add'>+    state.need_iface_fileio = 1;</div><div class='add'>+    state.need_iface_xattr = 0;</div><div class='ctx'> </div><div class='del'>-        state.need_mode_posix = 1;</div><div class='del'>-        state.need_mode_libglusterfsclient = 0;</div><div class='add'>+    state.need_mode_posix = 1;</div><div class='ctx'> </div><div class='del'>-        state.block_size = 4096;</div><div class='add'>+    state.block_size = 4096;</div><div class='ctx'> </div><div class='del'>-        strcpy (state.prefix, "tmpfile");</div><div class='del'>-        state.count = 1048576;</div><div class='add'>+    strcpy(state.prefix, "tmpfile");</div><div class='add'>+    state.count = 1048576;</div><div class='ctx'> </div><div class='del'>-        if (argp_parse (&amp;argp, argc, argv, 0, 0, &amp;state) != 0) {</div><div class='del'>-                fprintf (stderr, "argp_parse() failed\n");</div><div class='del'>-                return 1;</div><div class='del'>-        }</div><div class='add'>+    if (argp_parse(&amp;argp, argc, argv, 0, 0, &amp;state) != 0) {</div><div class='add'>+        fprintf(stderr, "argp_parse() failed\n");</div><div class='add'>+        return 1;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        do_actions (&amp;state);</div><div class='add'>+    do_actions(&amp;state);</div><div class='ctx'> </div><div class='del'>-        return 0;</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='head'>diff --git a/extras/benchmarking/rdd.c b/extras/benchmarking/rdd.c<br/>index dc7aafa76db..efc9d342a37 100644<br/>--- a/<a href='/cgit/glusterfs.git/tree/extras/benchmarking/rdd.c?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/benchmarking/rdd.c</a><br/>+++ b/<a href='/cgit/glusterfs.git/tree/extras/benchmarking/rdd.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>extras/benchmarking/rdd.c</a></div><div class='hunk'>@@ -1,22 +1,12 @@</div><div class='ctx'> /*</div><div class='del'>-  Copyright (c) 2008 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='del'>-  This file is part of GlusterFS.</div><div class='del'>-</div><div class='del'>-  GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-  it under the terms of the GNU General Public License as published</div><div class='del'>-  by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-  or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-  GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-  WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-  General Public License for more details.</div><div class='del'>-</div><div class='del'>-  You should have received a copy of the GNU General Public License</div><div class='del'>-  along with this program.  If not, see</div><div class='del'>-  &lt;http://www.gnu.org/licenses/&gt;.</div><div class='del'>-*/</div><div class='add'>+   Copyright (c) 2008-2012 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+   This file is part of GlusterFS.</div><div class='ctx'> </div><div class='add'>+   This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+   General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+   later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+   cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='ctx'> #include &lt;stdio.h&gt;</div><div class='ctx'> #include &lt;sys/stat.h&gt;</div><div class='ctx'> #include &lt;sys/types.h&gt;</div><div class='hunk'>@@ -30,463 +20,586 @@</div><div class='ctx'> </div><div class='ctx'> #define TWO_POWER(power) (2UL &lt;&lt; (power))</div><div class='ctx'> </div><div class='del'>-#define RDD_INTEGER_VALUE ((TWO_POWER ((sizeof (int) * 8))) - 1)</div><div class='add'>+#define RDD_INTEGER_VALUE ((TWO_POWER((sizeof(int) * 8))) - 1)</div><div class='ctx'> </div><div class='ctx'> #ifndef UNIX_PATH_MAX</div><div class='ctx'> #define UNIX_PATH_MAX 108</div><div class='ctx'> #endif</div><div class='ctx'> </div><div class='add'>+#define UNIT_KB 1024ULL</div><div class='add'>+#define UNIT_MB UNIT_KB * 1024ULL</div><div class='add'>+#define UNIT_GB UNIT_MB * 1024ULL</div><div class='add'>+#define UNIT_TB UNIT_GB * 1024ULL</div><div class='add'>+#define UNIT_PB UNIT_TB * 1024ULL</div><div class='add'>+</div><div class='add'>+#define UNIT_KB_STRING "KB"</div><div class='add'>+#define UNIT_MB_STRING "MB"</div><div class='add'>+#define UNIT_GB_STRING "GB"</div><div class='add'>+#define UNIT_TB_STRING "TB"</div><div class='add'>+#define UNIT_PB_STRING "PB"</div><div class='add'>+</div><div class='ctx'> struct rdd_file {</div><div class='del'>-	char path[UNIX_PATH_MAX];</div><div class='del'>-	struct stat st;</div><div class='del'>-	int fd;</div><div class='add'>+    char path[UNIX_PATH_MAX];</div><div class='add'>+    struct stat st;</div><div class='add'>+    int fd;</div><div class='ctx'> };</div><div class='del'>- </div><div class='add'>+</div><div class='ctx'> struct rdd_config {</div><div class='del'>-	long iters;</div><div class='del'>-	long max_ops_per_seq;</div><div class='del'>-	size_t max_bs;</div><div class='del'>-	size_t min_bs;</div><div class='del'>-	int thread_count;</div><div class='del'>-	pthread_t *threads;</div><div class='del'>-	pthread_barrier_t barrier;</div><div class='del'>-	pthread_mutex_t lock;</div><div class='del'>-	struct rdd_file in_file;</div><div class='del'>-	struct rdd_file out_file;</div><div class='add'>+    long iters;</div><div class='add'>+    long max_ops_per_seq;</div><div class='add'>+    size_t max_bs;</div><div class='add'>+    size_t min_bs;</div><div class='add'>+    int thread_count;</div><div class='add'>+    pthread_t *threads;</div><div class='add'>+    pthread_barrier_t barrier;</div><div class='add'>+    pthread_mutex_t lock;</div><div class='add'>+    struct rdd_file in_file;</div><div class='add'>+    struct rdd_file out_file;</div><div class='add'>+    ssize_t file_size;</div><div class='ctx'> };</div><div class='ctx'> static struct rdd_config rdd_config;</div><div class='ctx'> </div><div class='ctx'> enum rdd_keys {</div><div class='del'>-	RDD_MIN_BS_KEY = 1,</div><div class='del'>-	RDD_MAX_BS_KEY,</div><div class='add'>+    RDD_MIN_BS_KEY = 1,</div><div class='add'>+    RDD_MAX_BS_KEY,</div><div class='ctx'> };</div><div class='del'>- </div><div class='add'>+</div><div class='ctx'> static error_t</div><div class='del'>-rdd_parse_opts (int key, char *arg,</div><div class='del'>-		struct argp_state *_state)</div><div class='add'>+rdd_parse_opts(int key, char *arg, struct argp_state *_state)</div><div class='ctx'> {</div><div class='del'>-	switch (key) {</div><div class='del'>-	case 'o':</div><div class='del'>-	{</div><div class='del'>-		int len = 0;</div><div class='del'>-		len = strlen (arg);</div><div class='del'>-		if (len &gt; UNIX_PATH_MAX) {</div><div class='del'>-			fprintf (stderr, "output file name too long (%s)\n", </div><div class='del'>-                                 arg);</div><div class='del'>-			return -1;</div><div class='del'>-		}</div><div class='del'>-</div><div class='del'>-		strncpy (rdd_config.out_file.path, arg, len);</div><div class='del'>-	}</div><div class='del'>-	break;</div><div class='del'>-</div><div class='del'>-	case 'i':</div><div class='del'>-	{</div><div class='del'>-		int len = 0;</div><div class='del'>-		len = strlen (arg);</div><div class='del'>-		if (len &gt; UNIX_PATH_MAX) {</div><div class='del'>-			fprintf (stderr, "input file name too long (%s)\n", </div><div class='del'>-                                 arg);</div><div class='del'>-			return -1;</div><div class='del'>-		}</div><div class='del'>-</div><div class='del'>-		strncpy (rdd_config.in_file.path, arg, len);</div><div class='del'>-	}</div><div class='del'>-	break;</div><div class='del'>-</div><div class='del'>-	case RDD_MIN_BS_KEY:</div><div class='del'>-	{</div><div class='del'>-		char *tmp = NULL;</div><div class='del'>-		long bs = 0;</div><div class='del'>-		bs = strtol (arg, &amp;tmp, 10);</div><div class='del'>-		if ((bs == LONG_MAX) || (bs == LONG_MIN) || (tmp &amp;&amp; *tmp)) {</div><div class='del'>-			fprintf (stderr, "invalid argument for minimum block"</div><div class='del'>-                                 "size (%s)\n", arg);</div><div class='del'>-			return -1;</div><div class='del'>-		}</div><div class='del'>-</div><div class='del'>-		rdd_config.min_bs = bs;</div><div class='del'>-	}</div><div class='del'>-	break;</div><div class='del'>-</div><div class='del'>-	case RDD_MAX_BS_KEY:</div><div class='del'>-	{</div><div class='del'>-		char *tmp = NULL;</div><div class='del'>-		long bs = 0;</div><div class='del'>-		bs = strtol (arg, &amp;tmp, 10);</div><div class='del'>-		if ((bs == LONG_MAX) || (bs == LONG_MIN) || (tmp &amp;&amp; *tmp)) {</div><div class='del'>-			fprintf (stderr, "invalid argument for maximum block"</div><div class='del'>-                                 "size (%s)\n", arg);</div><div class='del'>-			return -1;</div><div class='del'>-		}</div><div class='del'>-</div><div class='del'>-		rdd_config.max_bs = bs;</div><div class='del'>-	}</div><div class='del'>-	break;</div><div class='del'>-</div><div class='del'>-	case 'r':</div><div class='del'>-	{</div><div class='del'>-		char *tmp = NULL;</div><div class='del'>-		long iters = 0;</div><div class='del'>-		iters = strtol (arg, &amp;tmp, 10);</div><div class='del'>-		if ((iters == LONG_MAX) || </div><div class='del'>-                    (iters == LONG_MIN) || </div><div class='del'>-                    (tmp &amp;&amp; *tmp)) {</div><div class='del'>-			fprintf (stderr, "invalid argument for iterations"</div><div class='del'>-                                 "(%s)\n", arg);</div><div class='del'>-			return -1;</div><div class='del'>-		}</div><div class='del'>-</div><div class='del'>-		rdd_config.iters = iters;</div><div class='del'>-	}</div><div class='del'>-	break;</div><div class='del'>-</div><div class='del'>-	case 'm':</div><div class='del'>-	{</div><div class='del'>-		char *tmp = NULL;</div><div class='del'>-		long max_ops = 0;</div><div class='del'>-		max_ops = strtol (arg, &amp;tmp, 10);</div><div class='del'>-		if ((max_ops == LONG_MAX) || </div><div class='del'>-                    (max_ops == LONG_MIN) || </div><div class='del'>-                    (tmp &amp;&amp; *tmp)) {</div><div class='del'>-			fprintf (stderr, "invalid argument for max-ops"</div><div class='del'>-                                 "(%s)\n", arg);</div><div class='del'>-			return -1;</div><div class='del'>-		}</div><div class='del'>-</div><div class='del'>-		rdd_config.max_ops_per_seq = max_ops;</div><div class='del'>-	}</div><div class='del'>-	break;</div><div class='del'>-</div><div class='del'>-	case 't':</div><div class='del'>-	{</div><div class='del'>-		char *tmp = NULL;</div><div class='del'>-		long threads = 0;</div><div class='del'>-		threads = strtol (arg, &amp;tmp, 10);</div><div class='del'>-		if ((threads == LONG_MAX) || </div><div class='del'>-                    (threads == LONG_MIN) || </div><div class='del'>-                    (tmp &amp;&amp; *tmp)) {</div><div class='del'>-			fprintf (stderr, "invalid argument for thread count"</div><div class='del'>-                                 "(%s)\n", arg);</div><div class='del'>-			return -1;</div><div class='del'>-		}</div><div class='del'>-</div><div class='del'>-		rdd_config.thread_count = threads;</div><div class='del'>-	}</div><div class='del'>-	break;</div><div class='del'>-</div><div class='del'>-	case ARGP_KEY_NO_ARGS:</div><div class='del'>-		break;</div><div class='del'>-	case ARGP_KEY_ARG:</div><div class='del'>-		break;</div><div class='del'>-	case ARGP_KEY_END:</div><div class='del'>-		if (_state-&gt;argc == 1) {</div><div class='del'>-			argp_usage (_state); </div><div class='del'>-		}</div><div class='del'>-</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='add'>+    switch (key) {</div><div class='add'>+        case 'o': {</div><div class='add'>+            int len = 0;</div><div class='add'>+            len = strlen(arg);</div><div class='add'>+            if (len &gt; UNIX_PATH_MAX) {</div><div class='add'>+                fprintf(stderr, "output file name too long (%s)\n", arg);</div><div class='add'>+                return -1;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            strncpy(rdd_config.out_file.path, arg, len);</div><div class='add'>+        } break;</div><div class='add'>+</div><div class='add'>+        case 'i': {</div><div class='add'>+            int len = 0;</div><div class='add'>+            len = strlen(arg);</div><div class='add'>+            if (len &gt; UNIX_PATH_MAX) {</div><div class='add'>+                fprintf(stderr, "input file name too long (%s)\n", arg);</div><div class='add'>+                return -1;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            strncpy(rdd_config.in_file.path, arg, len);</div><div class='add'>+            rdd_config.in_file.path[len] = '\0';</div><div class='add'>+        } break;</div><div class='add'>+</div><div class='add'>+        case 'f': {</div><div class='add'>+            char *tmp = NULL;</div><div class='add'>+            unsigned long long fs = 0;</div><div class='add'>+            if (string2bytesize(arg, &amp;fs) == -1) {</div><div class='add'>+                fprintf(stderr,</div><div class='add'>+                        "invalid argument for file size "</div><div class='add'>+                        "(%s)\n",</div><div class='add'>+                        arg);</div><div class='add'>+                return -1;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            rdd_config.file_size = fs;</div><div class='add'>+        } break;</div><div class='add'>+</div><div class='add'>+        case RDD_MIN_BS_KEY: {</div><div class='add'>+            char *tmp = NULL;</div><div class='add'>+            long bs = 0;</div><div class='add'>+            bs = strtol(arg, &amp;tmp, 10);</div><div class='add'>+            if ((bs == LONG_MAX) || (bs == LONG_MIN) || (tmp &amp;&amp; *tmp)) {</div><div class='add'>+                fprintf(stderr,</div><div class='add'>+                        "invalid argument for minimum block"</div><div class='add'>+                        "size (%s)\n",</div><div class='add'>+                        arg);</div><div class='add'>+                return -1;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            rdd_config.min_bs = bs;</div><div class='add'>+        } break;</div><div class='add'>+</div><div class='add'>+        case RDD_MAX_BS_KEY: {</div><div class='add'>+            char *tmp = NULL;</div><div class='add'>+            long bs = 0;</div><div class='add'>+            bs = strtol(arg, &amp;tmp, 10);</div><div class='add'>+            if ((bs == LONG_MAX) || (bs == LONG_MIN) || (tmp &amp;&amp; *tmp)) {</div><div class='add'>+                fprintf(stderr,</div><div class='add'>+                        "invalid argument for maximum block"</div><div class='add'>+                        "size (%s)\n",</div><div class='add'>+                        arg);</div><div class='add'>+                return -1;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            rdd_config.max_bs = bs;</div><div class='add'>+        } break;</div><div class='add'>+</div><div class='add'>+        case 'r': {</div><div class='add'>+            char *tmp = NULL;</div><div class='add'>+            long iters = 0;</div><div class='add'>+            iters = strtol(arg, &amp;tmp, 10);</div><div class='add'>+            if ((iters == LONG_MAX) || (iters == LONG_MIN) || (tmp &amp;&amp; *tmp)) {</div><div class='add'>+                fprintf(stderr,</div><div class='add'>+                        "invalid argument for iterations"</div><div class='add'>+                        "(%s)\n",</div><div class='add'>+                        arg);</div><div class='add'>+                return -1;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            rdd_config.iters = iters;</div><div class='add'>+        } break;</div><div class='add'>+</div><div class='add'>+        case 'm': {</div><div class='add'>+            char *tmp = NULL;</div><div class='add'>+            long max_ops = 0;</div><div class='add'>+            max_ops = strtol(arg, &amp;tmp, 10);</div><div class='add'>+            if ((max_ops == LONG_MAX) || (max_ops == LONG_MIN) ||</div><div class='add'>+                (tmp &amp;&amp; *tmp)) {</div><div class='add'>+                fprintf(stderr,</div><div class='add'>+                        "invalid argument for max-ops"</div><div class='add'>+                        "(%s)\n",</div><div class='add'>+                        arg);</div><div class='add'>+                return -1;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            rdd_config.max_ops_per_seq = max_ops;</div><div class='add'>+        } break;</div><div class='add'>+</div><div class='add'>+        case 't': {</div><div class='add'>+            char *tmp = NULL;</div><div class='add'>+            long threads = 0;</div><div class='add'>+            threads = strtol(arg, &amp;tmp, 10);</div><div class='add'>+            if ((threads == LONG_MAX) || (threads == LONG_MIN) ||</div><div class='add'>+                (tmp &amp;&amp; *tmp)) {</div><div class='add'>+                fprintf(stderr,</div><div class='add'>+                        "invalid argument for thread count"</div><div class='add'>+                        "(%s)\n",</div><div class='add'>+                        arg);</div><div class='add'>+                return -1;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            rdd_config.thread_count = threads;</div><div class='add'>+        } break;</div><div class='add'>+</div><div class='add'>+        case ARGP_KEY_NO_ARGS:</div><div class='add'>+            break;</div><div class='add'>+        case ARGP_KEY_ARG:</div><div class='add'>+            break;</div><div class='add'>+        case ARGP_KEY_END:</div><div class='add'>+            if (_state-&gt;argc == 1) {</div><div class='add'>+                argp_usage(_state);</div><div class='add'>+            }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+string2bytesize(const char *str, unsigned long long *n)</div><div class='add'>+{</div><div class='add'>+    unsigned long long value = 0ULL;</div><div class='add'>+    char *tail = NULL;</div><div class='add'>+    int old_errno = 0;</div><div class='add'>+    const char *s = NULL;</div><div class='add'>+</div><div class='add'>+    if (str == NULL || n == NULL) {</div><div class='add'>+        errno = EINVAL;</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    for (s = str; *s != '\0'; s++) {</div><div class='add'>+        if (isspace(*s)) {</div><div class='add'>+            continue;</div><div class='add'>+        }</div><div class='add'>+        if (*s == '-') {</div><div class='add'>+            return -1;</div><div class='add'>+        }</div><div class='add'>+        break;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    old_errno = errno;</div><div class='add'>+    errno = 0;</div><div class='add'>+    value = strtoull(str, &amp;tail, 10);</div><div class='add'>+</div><div class='add'>+    if (errno == ERANGE || errno == EINVAL) {</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (errno == 0) {</div><div class='add'>+        errno = old_errno;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (tail[0] != '\0') {</div><div class='add'>+        if (strcasecmp(tail, UNIT_KB_STRING) == 0) {</div><div class='add'>+            value *= UNIT_KB;</div><div class='add'>+        } else if (strcasecmp(tail, UNIT_MB_STRING) == 0) {</div><div class='add'>+            value *= UNIT_MB;</div><div class='add'>+        } else if (strcasecmp(tail, UNIT_GB_STRING) == 0) {</div><div class='add'>+            value *= UNIT_GB;</div><div class='add'>+        } else if (strcasecmp(tail, UNIT_TB_STRING) == 0) {</div><div class='add'>+            value *= UNIT_TB;</div><div class='add'>+        } else if (strcasecmp(tail, UNIT_PB_STRING) == 0) {</div><div class='add'>+            value *= UNIT_PB;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        else {</div><div class='add'>+            return -1;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    *n = value;</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> static struct argp_option rdd_options[] = {</div><div class='del'>-	{"if", 'i', "INPUT_FILE", 0, "input-file"},</div><div class='del'>-	{"of", 'o', "OUTPUT_FILE", 0, "output-file"},</div><div class='del'>-	{"threads", 't', "COUNT", 0, "number of threads to spawn (defaults to 2)"},</div><div class='del'>-	{"min-bs", RDD_MIN_BS_KEY, "MIN_BLOCK_SIZE", 0, </div><div class='del'>-	 "Minimum block size in bytes (defaults to 1024)"},</div><div class='del'>-	{"max-bs", RDD_MAX_BS_KEY, "MAX_BLOCK_SIZE", 0,</div><div class='del'>-	 "Maximum block size in bytes (defaults to 4096)"},</div><div class='del'>-	{"iters", 'r', "ITERS", 0,</div><div class='del'>-	 "Number of read-write sequences (defaults to 1000000)"},</div><div class='del'>-	{"max-ops", 'm', "MAXOPS", 0,</div><div class='del'>-	 "maximum number of read-writes to be performed in a sequence (defaults to 1)"},</div><div class='del'>-	{0, 0, 0, 0, 0}</div><div class='del'>-};</div><div class='add'>+    {"if", 'i', "INPUT_FILE", 0, "input-file"},</div><div class='add'>+    {"of", 'o', "OUTPUT_FILE", 0, "output-file"},</div><div class='add'>+    {"threads", 't', "COUNT", 0, "number of threads to spawn (defaults to 2)"},</div><div class='add'>+    {"min-bs", RDD_MIN_BS_KEY, "MIN_BLOCK_SIZE", 0,</div><div class='add'>+     "Minimum block size in bytes (defaults to 1024)"},</div><div class='add'>+    {"max-bs", RDD_MAX_BS_KEY, "MAX_BLOCK_SIZE", 0,</div><div class='add'>+     "Maximum block size in bytes (defaults to 4096)"},</div><div class='add'>+    {"iters", 'r', "ITERS", 0,</div><div class='add'>+     "Number of read-write sequences (defaults to 1000000)"},</div><div class='add'>+    {"max-ops", 'm', "MAXOPS", 0,</div><div class='add'>+     "maximum number of read-writes to be performed in a sequence (defaults to "</div><div class='add'>+     "1)"},</div><div class='add'>+    {"file-size", 'f', "FILESIZE", 0,</div><div class='add'>+     "the size of the file which will be created and upon it I/O will be done"</div><div class='add'>+     " (defaults to 100MB"},</div><div class='add'>+    {0, 0, 0, 0, 0}};</div><div class='ctx'> </div><div class='ctx'> static struct argp argp = {</div><div class='del'>-  rdd_options,</div><div class='del'>-  rdd_parse_opts,</div><div class='del'>-  "",</div><div class='del'>-  "random dd - tool to do a sequence of random block-sized continuous"</div><div class='del'>-  "read writes starting at a random offset"</div><div class='del'>-};</div><div class='del'>-</div><div class='add'>+    rdd_options, rdd_parse_opts, "",</div><div class='add'>+    "random dd - tool to do a sequence of random block-sized continuous"</div><div class='add'>+    "read writes starting at a random offset"};</div><div class='ctx'> </div><div class='ctx'> static void</div><div class='del'>-rdd_default_config (void)</div><div class='add'>+rdd_default_config(void)</div><div class='ctx'> {</div><div class='del'>-	rdd_config.thread_count = 2;</div><div class='del'>-	rdd_config.iters = 1000000;</div><div class='del'>-	rdd_config.max_bs = 4096;</div><div class='del'>-	rdd_config.min_bs = 1024;</div><div class='del'>-	rdd_config.in_file.fd = rdd_config.out_file.fd = -1;</div><div class='del'>-	rdd_config.max_ops_per_seq = 1;</div><div class='del'>-</div><div class='del'>-	return;</div><div class='add'>+    char *tmp_path = "rdd.in";</div><div class='add'>+</div><div class='add'>+    rdd_config.thread_count = 2;</div><div class='add'>+    rdd_config.iters = 1000000;</div><div class='add'>+    rdd_config.max_bs = 4096;</div><div class='add'>+    rdd_config.min_bs = 1024;</div><div class='add'>+    rdd_config.in_file.fd = rdd_config.out_file.fd = -1;</div><div class='add'>+    rdd_config.max_ops_per_seq = 1;</div><div class='add'>+    strncpy(rdd_config.in_file.path, tmp_path, strlen(tmp_path));</div><div class='add'>+    rdd_config.file_size = 104857600;</div><div class='add'>+</div><div class='add'>+    return;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> static char</div><div class='del'>-rdd_valid_config (void)</div><div class='add'>+rdd_valid_config(void)</div><div class='ctx'> {</div><div class='del'>-	char ret = 1;</div><div class='del'>-	int fd = -1;</div><div class='del'>-</div><div class='del'>-	fd = open (rdd_config.in_file.path, O_RDONLY);</div><div class='del'>-	if (fd == -1) {</div><div class='del'>-		ret = 0;</div><div class='del'>-		goto out;</div><div class='del'>-	}</div><div class='del'>-	close (fd);</div><div class='del'>-</div><div class='del'>-	if (rdd_config.min_bs &gt; rdd_config.max_bs) {</div><div class='del'>-		ret = 0;</div><div class='del'>-		goto out;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	if (strlen (rdd_config.out_file.path) == 0) {</div><div class='del'>-		sprintf (rdd_config.out_file.path, "%s.rddout", </div><div class='del'>-                         rdd_config.in_file.path);</div><div class='del'>-	}</div><div class='add'>+    char ret = 1;</div><div class='add'>+    int fd = -1;</div><div class='add'>+</div><div class='add'>+    fd = open(rdd_config.in_file.path, O_RDONLY);</div><div class='add'>+    if (fd == -1 &amp;&amp; (errno != ENOENT)) {</div><div class='add'>+        fprintf(stderr, "open: (%s)", strerror(errno));</div><div class='add'>+        ret = 0;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    close(fd);</div><div class='add'>+</div><div class='add'>+    if (rdd_config.min_bs &gt; rdd_config.max_bs) {</div><div class='add'>+        fprintf(stderr,</div><div class='add'>+                "minimum blocksize %ld is greater than the "</div><div class='add'>+                "maximum blocksize %ld",</div><div class='add'>+                rdd_config.min_bs, rdd_config.max_bs);</div><div class='add'>+        ret = 0;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (strlen(rdd_config.out_file.path) == 0) {</div><div class='add'>+        sprintf(rdd_config.out_file.path, "%s.rddout", rdd_config.in_file.path);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='ctx'> out:</div><div class='del'>-	return ret;</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> static void *</div><div class='del'>-rdd_read_write (void *arg)</div><div class='add'>+rdd_read_write(void *arg)</div><div class='ctx'> {</div><div class='del'>-	int i = 0, ret = 0;</div><div class='del'>-	size_t bs = 0;</div><div class='del'>-	off_t offset = 0;</div><div class='del'>-	long rand = 0;</div><div class='del'>-	long max_ops = 0;</div><div class='del'>-	char *buf = NULL;</div><div class='del'>-</div><div class='del'>-	buf = calloc (1, rdd_config.max_bs);</div><div class='del'>-	if (!buf) {</div><div class='del'>-		fprintf (stderr, "calloc failed (%s)\n", strerror (errno));</div><div class='del'>-		ret = -1;</div><div class='del'>-		goto out;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	for (i = 0; i &lt; rdd_config.iters; i++) </div><div class='del'>-	{</div><div class='del'>-		pthread_mutex_lock (&amp;rdd_config.lock);</div><div class='del'>-		{</div><div class='del'>-			int bytes = 0;</div><div class='del'>-			rand = random ();</div><div class='del'>-			</div><div class='del'>-			if (rdd_config.min_bs == rdd_config.max_bs) {</div><div class='del'>-				bs = rdd_config.max_bs;</div><div class='del'>-			} else {</div><div class='del'>-				bs = rdd_config.min_bs + </div><div class='del'>-                                        (rand % </div><div class='del'>-                                         (rdd_config.max_bs - </div><div class='del'>-                                          rdd_config.min_bs));</div><div class='del'>-			}</div><div class='del'>-			</div><div class='del'>-			offset = rand % rdd_config.in_file.st.st_size;</div><div class='del'>-			max_ops = rand % rdd_config.max_ops_per_seq;</div><div class='del'>-			if (!max_ops) {</div><div class='del'>-				max_ops ++;</div><div class='del'>-			}</div><div class='del'>-</div><div class='del'>-			ret = lseek (rdd_config.in_file.fd, offset, SEEK_SET);</div><div class='del'>-			if (ret != offset) {</div><div class='del'>-				fprintf (stderr, "lseek failed (%s)\n", </div><div class='del'>-                                         strerror (errno));</div><div class='del'>-				ret = -1;</div><div class='del'>-				goto unlock;</div><div class='del'>-			}</div><div class='del'>-</div><div class='del'>-			ret = lseek (rdd_config.out_file.fd, offset, SEEK_SET);</div><div class='del'>-			if (ret != offset) {</div><div class='del'>-				fprintf (stderr, "lseek failed (%s)\n", </div><div class='del'>-                                         strerror (errno));</div><div class='del'>-				ret = -1;</div><div class='del'>-				goto unlock;</div><div class='del'>-			}</div><div class='del'>-</div><div class='del'>-			while (max_ops--) </div><div class='del'>-			{ </div><div class='del'>-				bytes = read (rdd_config.in_file.fd, buf, bs);</div><div class='del'>-				if (!bytes) {</div><div class='del'>-					break;</div><div class='del'>-				}</div><div class='del'>-</div><div class='del'>-				if (bytes == -1) {</div><div class='del'>-					fprintf (stderr, "read failed (%s)\n", </div><div class='del'>-                                                 strerror (errno));</div><div class='del'>-					ret = -1;</div><div class='del'>-					goto unlock;</div><div class='del'>-				}</div><div class='del'>-</div><div class='del'>-				if (write (rdd_config.out_file.fd, buf, bytes) </div><div class='del'>-                                    != bytes) {</div><div class='del'>-					fprintf (stderr, "write failed (%s)\n", </div><div class='del'>-                                                 strerror (errno));</div><div class='del'>-					ret = -1;</div><div class='del'>-					goto unlock;</div><div class='del'>-				}</div><div class='del'>-			}</div><div class='del'>-		}</div><div class='del'>-	unlock:</div><div class='del'>-		pthread_mutex_unlock (&amp;rdd_config.lock);</div><div class='del'>-		if (ret == -1) {</div><div class='del'>-			goto out;</div><div class='del'>-		}</div><div class='del'>-		ret = 0;</div><div class='del'>-	}</div><div class='add'>+    int i = 0, ret = 0;</div><div class='add'>+    size_t bs = 0;</div><div class='add'>+    off_t offset = 0;</div><div class='add'>+    long rand = 0;</div><div class='add'>+    long max_ops = 0;</div><div class='add'>+    char *buf = NULL;</div><div class='add'>+</div><div class='add'>+    buf = calloc(1, rdd_config.max_bs);</div><div class='add'>+    if (!buf) {</div><div class='add'>+        fprintf(stderr, "calloc failed (%s)\n", strerror(errno));</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; rdd_config.iters; i++) {</div><div class='add'>+        pthread_mutex_lock(&amp;rdd_config.lock);</div><div class='add'>+        {</div><div class='add'>+            int bytes = 0;</div><div class='add'>+            rand = random();</div><div class='add'>+</div><div class='add'>+            if (rdd_config.min_bs == rdd_config.max_bs) {</div><div class='add'>+                bs = rdd_config.max_bs;</div><div class='add'>+            } else {</div><div class='add'>+                bs = rdd_config.min_bs +</div><div class='add'>+                     (rand % (rdd_config.max_bs - rdd_config.min_bs));</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            offset = rand % rdd_config.in_file.st.st_size;</div><div class='add'>+            max_ops = rand % rdd_config.max_ops_per_seq;</div><div class='add'>+            if (!max_ops) {</div><div class='add'>+                max_ops++;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            ret = lseek(rdd_config.in_file.fd, offset, SEEK_SET);</div><div class='add'>+            if (ret != offset) {</div><div class='add'>+                fprintf(stderr, "lseek failed (%s)\n", strerror(errno));</div><div class='add'>+                ret = -1;</div><div class='add'>+                goto unlock;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            ret = lseek(rdd_config.out_file.fd, offset, SEEK_SET);</div><div class='add'>+            if (ret != offset) {</div><div class='add'>+                fprintf(stderr, "lseek failed (%s)\n", strerror(errno));</div><div class='add'>+                ret = -1;</div><div class='add'>+                goto unlock;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            while (max_ops--) {</div><div class='add'>+                bytes = read(rdd_config.in_file.fd, buf, bs);</div><div class='add'>+                if (!bytes) {</div><div class='add'>+                    break;</div><div class='add'>+                }</div><div class='add'>+</div><div class='add'>+                if (bytes == -1) {</div><div class='add'>+                    fprintf(stderr, "read failed (%s)\n", strerror(errno));</div><div class='add'>+                    ret = -1;</div><div class='add'>+                    goto unlock;</div><div class='add'>+                }</div><div class='add'>+</div><div class='add'>+                if (write(rdd_config.out_file.fd, buf, bytes) != bytes) {</div><div class='add'>+                    fprintf(stderr, "write failed (%s)\n", strerror(errno));</div><div class='add'>+                    ret = -1;</div><div class='add'>+                    goto unlock;</div><div class='add'>+                }</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+    unlock:</div><div class='add'>+        pthread_mutex_unlock(&amp;rdd_config.lock);</div><div class='add'>+        if (ret == -1) {</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+        ret = 0;</div><div class='add'>+    }</div><div class='ctx'> out:</div><div class='del'>-	free (buf);</div><div class='del'>-	pthread_barrier_wait (&amp;rdd_config.barrier);</div><div class='add'>+    free(buf);</div><div class='add'>+    pthread_barrier_wait(&amp;rdd_config.barrier);</div><div class='ctx'> </div><div class='del'>-	return NULL;</div><div class='add'>+    return NULL;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+static void</div><div class='add'>+cleanup(void)</div><div class='add'>+{</div><div class='add'>+    close(rdd_config.in_file.fd);</div><div class='add'>+    close(rdd_config.out_file.fd);</div><div class='add'>+    rdd_config.in_file.fd = rdd_config.out_file.fd = -1;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> static int</div><div class='del'>-rdd_spawn_threads (void)</div><div class='add'>+check_and_create(void)</div><div class='ctx'> {</div><div class='del'>-	int i = 0, ret = -1, fd = -1;</div><div class='del'>-	char buf[4096]; </div><div class='del'>-</div><div class='del'>-	fd = open (rdd_config.in_file.path, O_RDONLY);</div><div class='del'>-	if (fd &lt; 0) {</div><div class='del'>-		fprintf (stderr, "cannot open %s (%s)\n", </div><div class='del'>-                         rdd_config.in_file.path, strerror (errno));</div><div class='del'>-		ret = -1;</div><div class='del'>-		goto out;</div><div class='del'>-	}</div><div class='del'>-	ret = fstat (fd, &amp;rdd_config.in_file.st);</div><div class='del'>-	if (ret != 0) {</div><div class='del'>-		close (fd);</div><div class='del'>-		fprintf (stderr, "cannot stat %s (%s)\n", </div><div class='del'>-                         rdd_config.in_file.path, strerror (errno));</div><div class='del'>-		ret = -1;</div><div class='del'>-		goto out;</div><div class='del'>-	}</div><div class='del'>-	rdd_config.in_file.fd = fd;</div><div class='del'>-</div><div class='del'>-	fd = open (rdd_config.out_file.path, O_WRONLY | O_CREAT, </div><div class='del'>-                   S_IRWXU | S_IROTH);</div><div class='del'>-	if (fd &lt; 0) {</div><div class='del'>-		close (rdd_config.in_file.fd);</div><div class='del'>-		rdd_config.in_file.fd = -1;</div><div class='del'>-		fprintf (stderr, "cannot open %s (%s)\n", </div><div class='del'>-                         rdd_config.out_file.path, strerror (errno));</div><div class='del'>-		ret = -1;</div><div class='del'>-		goto out;</div><div class='del'>-	}</div><div class='del'>-	rdd_config.out_file.fd = fd;</div><div class='del'>-</div><div class='del'>-	while ((ret = read (rdd_config.in_file.fd, buf, 4096)) &gt; 0) {</div><div class='del'>-		if (write (rdd_config.out_file.fd, buf, ret) != ret) {</div><div class='del'>-			fprintf (stderr, "write failed (%s)\n", </div><div class='del'>-                                 strerror (errno));</div><div class='del'>-			close (rdd_config.in_file.fd);</div><div class='del'>-			close (rdd_config.out_file.fd);</div><div class='del'>-			rdd_config.in_file.fd = rdd_config.out_file.fd = -1;</div><div class='del'>-			ret = -1;</div><div class='del'>-			goto out;</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	rdd_config.threads = calloc (rdd_config.thread_count, </div><div class='del'>-                                     sizeof (pthread_t));</div><div class='del'>-	if (rdd_config.threads == NULL) {</div><div class='del'>-		fprintf (stderr, "calloc() failed (%s)\n", strerror (errno));</div><div class='del'>-</div><div class='del'>-		ret = -1;</div><div class='del'>-		close (rdd_config.in_file.fd);</div><div class='del'>-		close (rdd_config.out_file.fd);</div><div class='del'>-		rdd_config.in_file.fd = rdd_config.out_file.fd = -1;</div><div class='del'>-		goto out;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	ret = pthread_barrier_init (&amp;rdd_config.barrier, NULL, </div><div class='del'>-                                    rdd_config.thread_count + 1);</div><div class='del'>-	if (ret != 0) {</div><div class='del'>-		fprintf (stderr, "pthread_barrier_init() failed (%s)\n", </div><div class='del'>-                         strerror (ret));</div><div class='del'>-</div><div class='del'>-		free (rdd_config.threads);</div><div class='del'>-		close (rdd_config.in_file.fd);</div><div class='del'>-		close (rdd_config.out_file.fd);</div><div class='del'>-		rdd_config.in_file.fd = rdd_config.out_file.fd = -1;</div><div class='del'>-		ret = -1;</div><div class='del'>-		goto out;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	ret = pthread_mutex_init (&amp;rdd_config.lock, NULL);</div><div class='del'>-	if (ret != 0) {</div><div class='del'>-		fprintf (stderr, "pthread_mutex_init() failed (%s)\n", </div><div class='del'>-                         strerror (ret));</div><div class='del'>-</div><div class='del'>-		free (rdd_config.threads);</div><div class='del'>-		pthread_barrier_destroy (&amp;rdd_config.barrier);</div><div class='del'>-		close (rdd_config.in_file.fd);</div><div class='del'>-		close (rdd_config.out_file.fd);</div><div class='del'>-		rdd_config.in_file.fd = rdd_config.out_file.fd = -1;</div><div class='del'>-		ret = -1;</div><div class='del'>-		goto out;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	for (i = 0; i &lt; rdd_config.thread_count; i++)</div><div class='del'>-	{</div><div class='del'>-		ret = pthread_create (&amp;rdd_config.threads[i], NULL, </div><div class='del'>-                                      rdd_read_write, NULL);</div><div class='del'>-		if (ret != 0) {</div><div class='del'>-			fprintf (stderr, "pthread_create failed (%s)\n", </div><div class='del'>-                                 strerror (errno));</div><div class='del'>-			exit (1);</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='add'>+    int ret = -1;</div><div class='add'>+    char buf[4096] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    struct stat stbuf = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int fd[2] = {</div><div class='add'>+        -1,</div><div class='add'>+    };</div><div class='add'>+    size_t total_size = -1;</div><div class='add'>+</div><div class='add'>+    total_size = rdd_config.file_size;</div><div class='add'>+</div><div class='add'>+    ret = stat(rdd_config.in_file.path, &amp;stbuf);</div><div class='add'>+    if (ret == -1 &amp;&amp; (errno != ENOENT))</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    fd[1] = open(rdd_config.in_file.path, O_CREAT | O_WRONLY | O_TRUNC);</div><div class='add'>+    if (fd[1] == -1)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    fd[0] = open("/dev/urandom", O_RDONLY);</div><div class='add'>+    if (fd[0] == -1)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    while (total_size &gt; 0) {</div><div class='add'>+        if (total_size &gt;= 4096) {</div><div class='add'>+            ret = read(fd[0], buf, 4096);</div><div class='add'>+            if (ret == -1)</div><div class='add'>+                goto out;</div><div class='add'>+            ret = write(fd[1], buf, 4096);</div><div class='add'>+            if (ret == -1)</div><div class='add'>+                goto out;</div><div class='add'>+            total_size = total_size - 4096;</div><div class='add'>+        } else {</div><div class='add'>+            ret = read(fd[0], buf, total_size);</div><div class='add'>+            if (ret == -1)</div><div class='add'>+                goto out;</div><div class='add'>+            ret = write(fd[1], buf, total_size);</div><div class='add'>+            if (ret == -1)</div><div class='add'>+                goto out;</div><div class='add'>+            total_size = total_size - total_size;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='ctx'> </div><div class='ctx'> out:</div><div class='del'>-	return ret;</div><div class='add'>+    if (fd[0] &gt; 0)</div><div class='add'>+        close(fd[0]);</div><div class='add'>+    if (fd[1] &gt; 0)</div><div class='add'>+        close(fd[1]);</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+static int</div><div class='add'>+rdd_spawn_threads(void)</div><div class='add'>+{</div><div class='add'>+    int i = 0, ret = -1, fd = -1;</div><div class='add'>+    char buf[4096];</div><div class='add'>+</div><div class='add'>+    ret = check_and_create();</div><div class='add'>+    if (ret == -1)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    fd = open(rdd_config.in_file.path, O_RDONLY);</div><div class='add'>+    if (fd &lt; 0) {</div><div class='add'>+        fprintf(stderr, "cannot open %s (%s)\n", rdd_config.in_file.path,</div><div class='add'>+                strerror(errno));</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    ret = fstat(fd, &amp;rdd_config.in_file.st);</div><div class='add'>+    if (ret != 0) {</div><div class='add'>+        close(fd);</div><div class='add'>+        fprintf(stderr, "cannot stat %s (%s)\n", rdd_config.in_file.path,</div><div class='add'>+                strerror(errno));</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    rdd_config.in_file.fd = fd;</div><div class='add'>+</div><div class='add'>+    fd = open(rdd_config.out_file.path, O_WRONLY | O_CREAT | O_TRUNC,</div><div class='add'>+              S_IRWXU | S_IROTH);</div><div class='add'>+    if (fd &lt; 0) {</div><div class='add'>+        close(rdd_config.in_file.fd);</div><div class='add'>+        rdd_config.in_file.fd = -1;</div><div class='add'>+        fprintf(stderr, "cannot open %s (%s)\n", rdd_config.out_file.path,</div><div class='add'>+                strerror(errno));</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    rdd_config.out_file.fd = fd;</div><div class='add'>+</div><div class='add'>+    while ((ret = read(rdd_config.in_file.fd, buf, 4096)) &gt; 0) {</div><div class='add'>+        if (write(rdd_config.out_file.fd, buf, ret) != ret) {</div><div class='add'>+            fprintf(stderr, "write failed (%s)\n", strerror(errno));</div><div class='add'>+            cleanup();</div><div class='add'>+            ret = -1;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    rdd_config.threads = calloc(rdd_config.thread_count, sizeof(pthread_t));</div><div class='add'>+    if (rdd_config.threads == NULL) {</div><div class='add'>+        fprintf(stderr, "calloc() failed (%s)\n", strerror(errno));</div><div class='add'>+</div><div class='add'>+        ret = -1;</div><div class='add'>+        cleanup();</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = pthread_barrier_init(&amp;rdd_config.barrier, NULL,</div><div class='add'>+                               rdd_config.thread_count + 1);</div><div class='add'>+    if (ret != 0) {</div><div class='add'>+        fprintf(stderr, "pthread_barrier_init() failed (%s)\n", strerror(ret));</div><div class='add'>+</div><div class='add'>+        free(rdd_config.threads);</div><div class='add'>+        cleanup();</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = pthread_mutex_init(&amp;rdd_config.lock, NULL);</div><div class='add'>+    if (ret != 0) {</div><div class='add'>+        fprintf(stderr, "pthread_mutex_init() failed (%s)\n", strerror(ret));</div><div class='add'>+</div><div class='add'>+        free(rdd_config.threads);</div><div class='add'>+        pthread_barrier_destroy(&amp;rdd_config.barrier);</div><div class='add'>+        cleanup();</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; rdd_config.thread_count; i++) {</div><div class='add'>+        ret = pthread_create(&amp;rdd_config.threads[i], NULL, rdd_read_write,</div><div class='add'>+                             NULL);</div><div class='add'>+        if (ret != 0) {</div><div class='add'>+            fprintf(stderr, "pthread_create failed (%s)\n", strerror(errno));</div><div class='add'>+            exit(1);</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> static void</div><div class='del'>-rdd_wait_for_completion (void)</div><div class='add'>+rdd_wait_for_completion(void)</div><div class='ctx'> {</div><div class='del'>-	pthread_barrier_wait (&amp;rdd_config.barrier);</div><div class='add'>+    pthread_barrier_wait(&amp;rdd_config.barrier);</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='del'>-int </div><div class='del'>-main (int argc, char *argv[])</div><div class='add'>+int</div><div class='add'>+main(int argc, char *argv[])</div><div class='ctx'> {</div><div class='del'>-	int ret = -1;</div><div class='add'>+    int ret = -1;</div><div class='ctx'> </div><div class='del'>-	rdd_default_config ();</div><div class='add'>+    rdd_default_config();</div><div class='ctx'> </div><div class='del'>-	ret = argp_parse (&amp;argp, argc, argv, 0, 0, NULL);</div><div class='del'>-	if (ret != 0) {</div><div class='del'>-		ret = -1;</div><div class='del'>-		fprintf (stderr, "%s: argp_parse() failed\n", argv[0]);</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='add'>+    ret = argp_parse(&amp;argp, argc, argv, 0, 0, NULL);</div><div class='add'>+    if (ret != 0) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        fprintf(stderr, "%s: argp_parse() failed\n", argv[0]);</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	if (!rdd_valid_config ()) {</div><div class='del'>-		ret = -1;</div><div class='del'>-		fprintf (stderr, "%s: configuration validation failed\n", </div><div class='del'>-                         argv[0]);</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='add'>+    if (!rdd_valid_config()) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        fprintf(stderr, "%s: configuration validation failed\n", argv[0]);</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	ret = rdd_spawn_threads ();</div><div class='del'>-	if (ret != 0) {</div><div class='del'>-		fprintf (stderr, "%s: spawning threads failed\n", argv[0]);</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='add'>+    ret = rdd_spawn_threads();</div><div class='add'>+    if (ret != 0) {</div><div class='add'>+        fprintf(stderr, "%s: spawning threads failed\n", argv[0]);</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	rdd_wait_for_completion ();</div><div class='add'>+    rdd_wait_for_completion();</div><div class='ctx'> </div><div class='ctx'> err:</div><div class='del'>-	return ret;</div><div class='del'>-} </div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='head'>diff --git a/extras/check_goto.pl b/extras/check_goto.pl<br/>new file mode 100755<br/>index 00000000000..fa71bfc6683<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/extras/check_goto.pl?id=d1d7a6f35c816822fab51c820e25023863c239c1'>extras/check_goto.pl</a></div><div class='hunk'>@@ -0,0 +1,45 @@</div><div class='add'>+#!/usr/bin/env perl</div><div class='add'>+</div><div class='add'>+use strict;</div><div class='add'>+use warnings;</div><div class='add'>+</div><div class='add'>+my @ignore_labels = qw (TODO retry fetch_data again try_again sp_state_read_proghdr redo disabled_loop fd_alloc_try_again);</div><div class='add'>+my @ignore_files  = qw (y.tab.c lex.c);</div><div class='add'>+my @c_files;</div><div class='add'>+my $line;</div><div class='add'>+my @labels;</div><div class='add'>+my $in_comments;</div><div class='add'>+</div><div class='add'>+{</div><div class='add'>+        local $" = "|";</div><div class='add'>+        my $cmd = "find . -type f -name '*.c' | grep -vE '(@ignore_files)'";</div><div class='add'>+        @c_files = `$cmd`;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+foreach my $file (@c_files) {</div><div class='add'>+        chomp ($file);</div><div class='add'>+        open FD, $file or die ("Failed to read file $file: $!");</div><div class='add'>+        @labels = ();</div><div class='add'>+        $in_comments = 0;</div><div class='add'>+        while ($line = &lt;FD&gt;) {</div><div class='add'>+                chomp ($line);</div><div class='add'>+</div><div class='add'>+                next if $line =~ /^\s*(#|\/\/)/;</div><div class='add'>+                $in_comments = 1 if ($line =~ /\/\*/);</div><div class='add'>+                $in_comments = 0 if ($line =~ /\*\//);</div><div class='add'>+</div><div class='add'>+                next if $in_comments;</div><div class='add'>+                if ($line =~ /^\s*(([a-zA-Z]|_)\w*)\s*:/) {</div><div class='add'>+                        push (@labels, $1) unless grep (/$1/, @ignore_labels);</div><div class='add'>+                }</div><div class='add'>+                @labels = () if $line =~ /^}/;</div><div class='add'>+</div><div class='add'>+                next unless @labels;</div><div class='add'>+                if ($line =~ /^\s*goto\s*(\w+)/) {</div><div class='add'>+                        print "$file:$.: $line\n" if grep /^$1$/, @labels;</div><div class='add'>+                }</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        close FD;</div><div class='add'>+}</div><div class='add'>+</div><div class='head'>diff --git a/extras/clang-checker.sh b/extras/clang-checker.sh<br/>new file mode 100755<br/>index 00000000000..4909d3adfcd<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/extras/clang-checker.sh?id=d1d7a6f35c816822fab51c820e25023863c239c1'>extras/clang-checker.sh</a></div><div class='hunk'>@@ -0,0 +1,301 @@</div><div class='add'>+#!/usr/bin/env bash</div><div class='add'>+#*******************************************************************************</div><div class='add'>+#                                                                              *</div><div class='add'>+#  Copyright (c) 2016 Red Hat, Inc. &lt;http://www.redhat.com&gt;                    *</div><div class='add'>+#  This file is part of GlusterFS.                                             *</div><div class='add'>+#                                                                              *</div><div class='add'>+#  This file is licensed to you under your choice of the GNU Lesser            *</div><div class='add'>+#  General Public License, version 3 or any later version (LGPLv3 or           *</div><div class='add'>+#  later), or the GNU General Public License, version 2 (GPLv2), in all        *</div><div class='add'>+#  cases as published by the Free Software Foundation.                         *</div><div class='add'>+#------------------------------------------------------------------------------*</div><div class='add'>+#                                                                              *</div><div class='add'>+# clang-checker.sh:  This script runs clang static analyzer using 'scan-build' *</div><div class='add'>+#                    a perl wrapper. After you commit your patch i.e. right    *</div><div class='add'>+#                    before executing rfc.sh in order to push the patch to     *</div><div class='add'>+#                    repository, it is recommended that you execute            *</div><div class='add'>+#                    clang-checker.sh to perform static analysis inorder to    *</div><div class='add'>+#                    check if there are any possible bugs in the code.         *</div><div class='add'>+#                                                                              *</div><div class='add'>+#                    This script performs the static analysis with and      *</div><div class='add'>+#                    without HEAD commit, it runs the analyzer only in the     *</div><div class='add'>+#                    directory where changes have been made and finally diff's *</div><div class='add'>+#                    the number of bugs using both cases (i.e. with and        *</div><div class='add'>+#                    without your commit) and gives a summary, which explain's *</div><div class='add'>+#                    about the eligibility of your patch.                      *</div><div class='add'>+#                                                                              *</div><div class='add'>+# Usage:             $ cd $PATH_TO_GLUSTERFS                                   *</div><div class='add'>+#                    $ extras/clang-checker.sh (or) $ make clang-check         *</div><div class='add'>+#                                                                              *</div><div class='add'>+# Author:            Prasanna Kumar Kalever &lt;prasanna.kalever@redhat.com&gt;      *</div><div class='add'>+#                                                                              *</div><div class='add'>+#*******************************************************************************</div><div class='add'>+</div><div class='add'>+REPORTS_DIR=$(pwd)</div><div class='add'>+BASELINE_DIR=${REPORTS_DIR}/baseline</div><div class='add'>+BRESULTS_DIR=${BASELINE_DIR}/results</div><div class='add'>+BBACKUP_DIR=${BASELINE_DIR}/backup</div><div class='add'>+TARGET_DIR=${REPORTS_DIR}/target</div><div class='add'>+TRESULTS_DIR=${TARGET_DIR}/results</div><div class='add'>+TBACKUP_DIR=${TARGET_DIR}/backup</div><div class='add'>+</div><div class='add'>+declare -A DICT_B</div><div class='add'>+declare -A DICT_T</div><div class='add'>+declare -A ARR</div><div class='add'>+declare -A FILES</div><div class='add'>+</div><div class='add'>+function identify_changes () {</div><div class='add'>+    MODIFIED_DATA=$(git show --name-status --oneline | tail -n +2)</div><div class='add'>+    FLAG=0</div><div class='add'>+    for i in ${MODIFIED_DATA}; do</div><div class='add'>+        if [ $FLAG -eq 1 ]; then</div><div class='add'>+            ARR+="$(dirname $i) ";</div><div class='add'>+            FLAG=0;</div><div class='add'>+        fi</div><div class='add'>+        if [ $i = 'M' ] || [ $i = 'A' ]; then</div><div class='add'>+            FLAG=1;</div><div class='add'>+        fi</div><div class='add'>+    done</div><div class='add'>+</div><div class='add'>+    MODIFIED_DIR=$(echo "${ARR[@]}" | tr ' ' '\n' | sort -u | tr '\n' ' ')</div><div class='add'>+    for i in $MODIFIED_DIR; do</div><div class='add'>+        # run only in directories which has Makefile</div><div class='add'>+        if [ $(find ./$i -iname "makefile*" | wc -c) -gt 0 ]; then</div><div class='add'>+            # skip 'doc' and '.'(top) directory</div><div class='add'>+            if [ "xx$i" != "xxdoc" ] &amp;&amp; [ "xx$i" != "xx." ]; then</div><div class='add'>+                FILES+="$i "</div><div class='add'>+            fi</div><div class='add'>+        fi</div><div class='add'>+    done</div><div class='add'>+    if [ -z $FILES ]; then</div><div class='add'>+        echo "Probably no changes made to 'c' files"</div><div class='add'>+        exit;</div><div class='add'>+    fi</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function check_prerequisites () {</div><div class='add'>+    if ! type "clang" 2&gt; /dev/null; then</div><div class='add'>+        echo -e "\ntry after installing clang and scan-build..."</div><div class='add'>+        echo    "useful info at http://clang-analyzer.llvm.org/installation.html\n"</div><div class='add'>+        echo -e "hint: 'dnf -y install clang-analyzer.noarch'\n"</div><div class='add'>+        exit 1;</div><div class='add'>+    elif ! type "scan-build" 2&gt; /dev/null; then</div><div class='add'>+        echo -e "\ntry after installing scan-build..."</div><div class='add'>+        echo    "useful info at http://clang-analyzer.llvm.org/installation.html"</div><div class='add'>+        echo -e "hint: 'dnf -y install clang-analyzer.noarch'\n"</div><div class='add'>+        exit 1;</div><div class='add'>+    fi</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function force_terminate () {</div><div class='add'>+    echo -e "\nreceived a signal to force terminate ..\n"</div><div class='add'>+    git am --abort 2&gt; /dev/null</div><div class='add'>+    git am ${PATCH_NAME}</div><div class='add'>+    rm -f ${REPORTS_DIR}/${PATCH_NAME}</div><div class='add'>+    exit 1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function run_scanbuild () {</div><div class='add'>+    local CLANG=$(which clang)</div><div class='add'>+    local SCAN_BUILD=$(which scan-build)</div><div class='add'>+    local ORIG_COMMIT=$(git rev-parse --verify HEAD^)</div><div class='add'>+    PATCH_NAME=$(git format-patch $ORIG_COMMIT)</div><div class='add'>+</div><div class='add'>+    echo -e "\n| Performing clang analysis on:" \</div><div class='add'>+            "$(git log --pretty=format:"%h - '%s' by %an" -1) ... |\n"</div><div class='add'>+    echo -e "Changes are identified in '${FILES[@]}' directorie[s]\n"</div><div class='add'>+</div><div class='add'>+    if [ -d "${BRESULTS_DIR}" ]; then</div><div class='add'>+        mkdir -p ${BBACKUP_DIR} ${TBACKUP_DIR}</div><div class='add'>+        mv ${BRESULTS_DIR} \</div><div class='add'>+           ${BBACKUP_DIR}/results_$(ls -l ${BBACKUP_DIR} | wc -l)</div><div class='add'>+        mv ${TRESULTS_DIR} \</div><div class='add'>+           ${TBACKUP_DIR}/results_$(ls -l ${TBACKUP_DIR} | wc -l)</div><div class='add'>+    fi</div><div class='add'>+    for DIR in ${FILES[@]}; do</div><div class='add'>+        mkdir -p ${BRESULTS_DIR}/$(echo ${DIR} | sed 's/\//_/g')</div><div class='add'>+        mkdir -p ${TRESULTS_DIR}/$(echo ${DIR} | sed 's/\//_/g')</div><div class='add'>+    done</div><div class='add'>+    # get nproc info</div><div class='add'>+    case $(uname -s) in</div><div class='add'>+    'Linux')</div><div class='add'>+        local NPROC=$(getconf _NPROCESSORS_ONLN)</div><div class='add'>+        ;;</div><div class='add'>+    'NetBSD')</div><div class='add'>+        local NPROC=$(getconf NPROCESSORS_ONLN)</div><div class='add'>+        ;;</div><div class='add'>+    esac</div><div class='add'>+</div><div class='add'>+    trap force_terminate INT TERM QUIT EXIT</div><div class='add'>+</div><div class='add'>+    git reset --hard HEAD^</div><div class='add'>+</div><div class='add'>+    # build complete source code for sake of dependencies</div><div class='add'>+    echo -e "\n# make -j${NPROC} ..."</div><div class='add'>+    make -j${NPROC} 1&gt;/dev/null</div><div class='add'>+</div><div class='add'>+    for DIR in ${FILES[@]}; do</div><div class='add'>+        if [ $(find ./$i -iname "makefile*" | wc -c) -gt 0 ]; then</div><div class='add'>+            make clean -C ${DIR} 1&gt;/dev/null</div><div class='add'>+            echo -e "\n| Analyzing ${DIR} without commit ... |\n"</div><div class='add'>+            # run only in directory where changes are made</div><div class='add'>+            ${SCAN_BUILD} -o ${BRESULTS_DIR}/$(echo ${DIR} | sed 's/\//_/g') \</div><div class='add'>+                          --use-analyzer=${CLANG} make -j${NPROC} -C ${DIR}</div><div class='add'>+        fi</div><div class='add'>+    done</div><div class='add'>+</div><div class='add'>+    echo -e "\n| Analyzing without commit complete ... |\n"</div><div class='add'>+</div><div class='add'>+    git am ${PATCH_NAME}</div><div class='add'>+    trap - INT TERM QUIT EXIT</div><div class='add'>+</div><div class='add'>+    # In case commit has changes to configure stuff ?</div><div class='add'>+    echo -e "\n# make clean ..."</div><div class='add'>+    make clean 1&gt;/dev/null</div><div class='add'>+    echo -e "\n# ./autogen.sh &amp;&amp; ./configure --with-previous-options ..."</div><div class='add'>+    ${REPORTS_DIR}/autogen.sh 2&gt;/dev/null</div><div class='add'>+    ${REPORTS_DIR}/configure  --with-previous-options 1&gt;/dev/null</div><div class='add'>+    echo -e "\n# make -j${NPROC} ..."</div><div class='add'>+    make -j${NPROC} 1&gt;/dev/null</div><div class='add'>+</div><div class='add'>+    for DIR in ${FILES[@]}; do</div><div class='add'>+        if [ $(find ./$i -iname "makefile*" | wc -c) -gt 0 ]; then</div><div class='add'>+            make clean -C ${DIR} 1&gt;/dev/null</div><div class='add'>+            echo -e "\n| Analyzing ${DIR} with commit ... |\n"</div><div class='add'>+            # run only in directory where changes are made</div><div class='add'>+            ${SCAN_BUILD} -o ${TRESULTS_DIR}/$(echo ${DIR} | sed 's/\//_/g') \</div><div class='add'>+                          --use-analyzer=${CLANG} make -j${NPROC} -C ${DIR}</div><div class='add'>+        fi</div><div class='add'>+    done</div><div class='add'>+</div><div class='add'>+    echo -e "\n| Analyzing with commit complete ... |\n"</div><div class='add'>+</div><div class='add'>+    rm -f ${REPORTS_DIR}/${PATCH_NAME}</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function count_for_baseline () {</div><div class='add'>+    for DIR in ${FILES[@]}; do</div><div class='add'>+        HTMLS_DIR=${BRESULTS_DIR}/$(echo ${DIR} |</div><div class='add'>+                    sed 's/\//_/g')/$(ls ${BRESULTS_DIR}/$(echo ${DIR} |</div><div class='add'>+                    sed 's/\//_/g')/);</div><div class='add'>+</div><div class='add'>+        local NAMES_OF_BUGS_B=$(grep -n "SUMM_DESC" ${HTMLS_DIR}/index.html |</div><div class='add'>+                                cut -d"&lt;" -f3 | cut -d"&gt;" -f2 |</div><div class='add'>+                                sed 's/[^a-zA-Z0]/_/g' | tr '\n' ' ')</div><div class='add'>+        local NO_OF_BUGS_B=$(grep -n "SUMM_DESC" ${HTMLS_DIR}/index.html |</div><div class='add'>+                             cut -d"&lt;" -f5 | cut -d"&gt;" -f2 | tr '\n' ' ')</div><div class='add'>+        local count_B=0;</div><div class='add'>+</div><div class='add'>+        read -a BUG_NAME_B &lt;&lt;&lt;$NAMES_OF_BUGS_B</div><div class='add'>+        read -a BUG_COUNT_B &lt;&lt;&lt;$NO_OF_BUGS_B</div><div class='add'>+        for i in ${BUG_NAME_B[@]};</div><div class='add'>+        do</div><div class='add'>+            if [ ! -z ${DICT_B[$i]} ]; then</div><div class='add'>+                DICT_B[$i]=$(expr ${BUG_COUNT_B[count_B]} + ${DICT_B[$i]});</div><div class='add'>+            else</div><div class='add'>+                DICT_B+=([$i]=${BUG_COUNT_B[count_B]});</div><div class='add'>+            fi</div><div class='add'>+            count_B=$(expr $count_B + 1)</div><div class='add'>+        done</div><div class='add'>+    done</div><div class='add'>+</div><div class='add'>+    echo -e "\nBASELINE BUGS LIST (before applying patch):"</div><div class='add'>+    echo "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"</div><div class='add'>+    for key_B in ${!DICT_B[@]}; do</div><div class='add'>+        echo "${key_B} --&gt; ${DICT_B[${key_B}]}" | sed 's/_/ /g' | tr -s ' '</div><div class='add'>+    done</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function count_for_target () {</div><div class='add'>+    for DIR in ${FILES[@]}; do</div><div class='add'>+        HTMLS_DIR=${TRESULTS_DIR}/$(echo ${DIR} |</div><div class='add'>+                    sed 's/\//_/g')/$(ls ${TRESULTS_DIR}/$(echo ${DIR} |</div><div class='add'>+                    sed 's/\//_/g')/);</div><div class='add'>+</div><div class='add'>+        local NAME_OF_BUGS_T=$(grep -n "SUMM_DESC" ${HTMLS_DIR}/index.html |</div><div class='add'>+                              cut -d"&lt;" -f3 | cut -d"&gt;" -f2 |</div><div class='add'>+                              sed 's/[^a-zA-Z0]/_/g'| tr '\n' ' ')</div><div class='add'>+        local NO_OF_BUGS_T=$(grep -n "SUMM_DESC" ${HTMLS_DIR}/index.html |</div><div class='add'>+                             cut -d"&lt;" -f5 | cut -d"&gt;" -f2 | tr '\n' ' ')</div><div class='add'>+        local count_T=0;</div><div class='add'>+</div><div class='add'>+        read -a BUG_NAME_T &lt;&lt;&lt;$NAME_OF_BUGS_T</div><div class='add'>+        read -a BUG_COUNT_T &lt;&lt;&lt;$NO_OF_BUGS_T</div><div class='add'>+</div><div class='add'>+        for i in ${BUG_NAME_T[@]};</div><div class='add'>+        do</div><div class='add'>+            if [ ! -z ${DICT_T[$i]} ]; then</div><div class='add'>+                DICT_T[$i]=$(expr ${BUG_COUNT_T[count_T]} + ${DICT_T[$i]});</div><div class='add'>+            else</div><div class='add'>+                DICT_T+=([$i]=${BUG_COUNT_T[count_T]});</div><div class='add'>+            fi</div><div class='add'>+            count_T=$(expr $count_T + 1)</div><div class='add'>+        done</div><div class='add'>+    done</div><div class='add'>+</div><div class='add'>+    echo -e "\nTARGET BUGS LIST (after applying patch):"</div><div class='add'>+    echo "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"</div><div class='add'>+    for key_T in ${!DICT_T[@]}; do</div><div class='add'>+        echo "${key_T} --&gt; ${DICT_T[${key_T}]}" | sed 's/_/ /g' | tr -s ' '</div><div class='add'>+    done</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function array_contains () {</div><div class='add'>+    local SEEKING=$1; shift</div><div class='add'>+    local IN=1</div><div class='add'>+    for ELEMENT; do</div><div class='add'>+        if [[ $ELEMENT == $SEEKING ]]; then</div><div class='add'>+            IN=0</div><div class='add'>+            break</div><div class='add'>+        fi</div><div class='add'>+    done</div><div class='add'>+    return $IN</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function main () {</div><div class='add'>+    echo -e "\n================ Clang analyzer in progress ================\n"</div><div class='add'>+    check_prerequisites</div><div class='add'>+    identify_changes</div><div class='add'>+    run_scanbuild</div><div class='add'>+    clear</div><div class='add'>+    count_for_baseline</div><div class='add'>+    count_for_target</div><div class='add'>+    echo -e "\nSUMMARY OF CLANG-ANALYZER:"</div><div class='add'>+    echo "~~~~~~~~~~~~~~~~~~~~~~~~~~"</div><div class='add'>+</div><div class='add'>+    FLAG=0</div><div class='add'>+    for BUG in ${!DICT_T[@]}; do</div><div class='add'>+        array_contains $BUG "${!DICT_B[@]}"</div><div class='add'>+        if [ $? -eq 1 ]; then</div><div class='add'>+            echo "New ${DICT_T[${BUG}]} Bug[s] introduced: $(echo $BUG |</div><div class='add'>+                                                            sed 's/_/ /g' |</div><div class='add'>+                                                            tr -s ' ')"</div><div class='add'>+            FLAG=1</div><div class='add'>+        else</div><div class='add'>+            if [ ${BUG} != "All_Bugs" ]; then</div><div class='add'>+                if [ ${DICT_B[${BUG}]} -lt            \</div><div class='add'>+                    ${DICT_T[${BUG}]} ]; then</div><div class='add'>+                    echo "Extra $(expr ${DICT_T[${BUG}]} - \</div><div class='add'>+                          ${DICT_B[${BUG}]}) Bug[s] Introduced in: $(echo $BUG |</div><div class='add'>+                          sed 's/_/ /g' | tr -s ' ')"</div><div class='add'>+                    FLAG=1</div><div class='add'>+                fi</div><div class='add'>+            fi</div><div class='add'>+        fi</div><div class='add'>+    done</div><div class='add'>+</div><div class='add'>+    echo</div><div class='add'>+    if [ $FLAG -eq 0 ]; then</div><div class='add'>+        echo -e "Patch Value given by Clang analyzer '+1'\n"</div><div class='add'>+    else</div><div class='add'>+        echo -e "Patch Value given by Clang analyzer '-1'\n"</div><div class='add'>+    fi</div><div class='add'>+    echo -e "\nExplore complete results at:"</div><div class='add'>+    find ${BRESULTS_DIR}/ -iname "index.html"</div><div class='add'>+    find ${TRESULTS_DIR}/ -iname "index.html"</div><div class='add'>+    echo -e "\n================= Done with Clang Analysis =================\n"</div><div class='add'>+</div><div class='add'>+    exit ${FLAG}</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+main</div><div class='head'>diff --git a/extras/clear_xattrs.sh b/extras/clear_xattrs.sh<br/>new file mode 100755<br/>index 00000000000..dd04731e8bd<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/extras/clear_xattrs.sh?id=d1d7a6f35c816822fab51c820e25023863c239c1'>extras/clear_xattrs.sh</a></div><div class='hunk'>@@ -0,0 +1,53 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+# Clear the trusted.gfid xattr in the brick tree</div><div class='add'>+</div><div class='add'>+# This script must be run only on a stopped brick/volume</div><div class='add'>+# Stop the volume to make sure no rebalance/replace-brick</div><div class='add'>+# operations are on-going</div><div class='add'>+</div><div class='add'>+# Not much error checking</div><div class='add'>+remove_xattrs ()</div><div class='add'>+{</div><div class='add'>+    find "$1" -exec setfattr -h -x "trusted.gfid" '{}' \;  &gt; /dev/null 2&gt;&amp;1;</div><div class='add'>+    find "$1" -exec setfattr -h -x "trusted.glusterfs.volume-id" '{}' \;  &gt; /dev/null 2&gt;&amp;1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+main ()</div><div class='add'>+{</div><div class='add'>+    if [ -z "$1" ]; then</div><div class='add'>+        echo "Usage: $0 &lt;brick_path(s)&gt;";</div><div class='add'>+        exit 1;</div><div class='add'>+    fi</div><div class='add'>+</div><div class='add'>+    export PATH;</div><div class='add'>+    which getfattr &gt; /dev/null 2&gt;&amp;1;</div><div class='add'>+    if [ $? -ne 0 ]; then</div><div class='add'>+        echo "attr package missing";</div><div class='add'>+        exit 2;</div><div class='add'>+    fi</div><div class='add'>+</div><div class='add'>+    which setfattr &gt; /dev/null 2&gt;&amp;1;</div><div class='add'>+    if [ $? -ne 0 ]; then</div><div class='add'>+        echo "attr package missing";</div><div class='add'>+        exit 2;</div><div class='add'>+    fi</div><div class='add'>+</div><div class='add'>+    for brick in "$@";</div><div class='add'>+    do</div><div class='add'>+        stat "$brick" &gt; /dev/null 2&gt;&amp;1;</div><div class='add'>+        if [ $? -ne 0 ]; then</div><div class='add'>+            echo "brick: $brick does not exist";</div><div class='add'>+            exit 3;</div><div class='add'>+        fi</div><div class='add'>+        if [ ! -d "$brick" ]; then</div><div class='add'>+            echo "$brick: not a directory";</div><div class='add'>+            exit 4;</div><div class='add'>+        fi</div><div class='add'>+        echo "xattr clean-up in progress: $brick";</div><div class='add'>+        remove_xattrs "$brick";</div><div class='add'>+        echo "$brick ready to be used as a glusterfs brick";</div><div class='add'>+    done;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+main "$@";
\ No newline at end of file</div><div class='head'>diff --git a/extras/cliutils/Makefile.am b/extras/cliutils/Makefile.am<br/>new file mode 100644<br/>index 00000000000..7039703e275<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/extras/cliutils/Makefile.am?id=d1d7a6f35c816822fab51c820e25023863c239c1'>extras/cliutils/Makefile.am</a></div><div class='hunk'>@@ -0,0 +1,4 @@</div><div class='add'>+EXTRA_DIST= cliutils.py __init__.py</div><div class='add'>+</div><div class='add'>+cliutilsdir = @BUILD_PYTHON_SITE_PACKAGES@/gluster/cliutils</div><div class='add'>+cliutils_PYTHON = cliutils.py __init__.py</div><div class='head'>diff --git a/extras/cliutils/README.md b/extras/cliutils/README.md<br/>new file mode 100644<br/>index 00000000000..309beb1ca25<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/extras/cliutils/README.md?id=d1d7a6f35c816822fab51c820e25023863c239c1'>extras/cliutils/README.md</a></div><div class='hunk'>@@ -0,0 +1,233 @@</div><div class='add'>+# CLI utility for creating Cluster aware CLI tools for Gluster</div><div class='add'>+cliutils is a Python library which provides wrapper around `gluster system::</div><div class='add'>+execute` command to extend the functionalities of Gluster.</div><div class='add'>+</div><div class='add'>+Example use cases:</div><div class='add'>+- Start a service in all peer nodes of Cluster</div><div class='add'>+- Collect the status of a service from all peer nodes</div><div class='add'>+- Collect the config values from each peer nodes and display latest</div><div class='add'>+  config based on version.</div><div class='add'>+- Copy a file present in GLUSTERD_WORKDIR from one peer node to all</div><div class='add'>+  other peer nodes.(Geo-replication create push-pem is using this to</div><div class='add'>+  distribute the SSH public keys from all master nodes to all slave</div><div class='add'>+  nodes)</div><div class='add'>+- Generate pem keys in all peer nodes and collect all the public keys</div><div class='add'>+  to one place(Geo-replication gsec_create is doing this)</div><div class='add'>+- Provide Config sync CLIs for new features like `gluster-eventsapi`,</div><div class='add'>+  `gluster-restapi`, `gluster-mountbroker` etc.</div><div class='add'>+</div><div class='add'>+## Introduction</div><div class='add'>+</div><div class='add'>+If a executable file present in `$GLUSTER_LIBEXEC` directory in all</div><div class='add'>+peer nodes(Filename startswith `peer_`) then it can be executed by</div><div class='add'>+running `gluster system:: execute` command from any one peer node.</div><div class='add'>+</div><div class='add'>+- This command will not copy any executables to peer nodes, Script</div><div class='add'>+  should exist in all peer nodes to use this infrastructure. Raises</div><div class='add'>+  error in case script not exists in any one of the peer node.</div><div class='add'>+- Filename should start with `peer_` and should exist in</div><div class='add'>+  `$GLUSTER_LIBEXEC` directory.</div><div class='add'>+- This command can not be called from outside the cluster.</div><div class='add'>+</div><div class='add'>+To understand the functionality, create a executable file `peer_hello`</div><div class='add'>+under $GLUSTER_LIBEXEC directory and copy to all peer nodes.</div><div class='add'>+</div><div class='add'>+    #!/usr/bin/env bash</div><div class='add'>+    echo "Hello from $(gluster system:: uuid get)"</div><div class='add'>+</div><div class='add'>+Now run the following command from any one gluster node,</div><div class='add'>+</div><div class='add'>+    gluster system:: execute hello</div><div class='add'>+</div><div class='add'>+**Note:** Gluster will not copy the executable script to all nodes,</div><div class='add'>+  copy `peer_hello` script to all peer nodes to use `gluster system::</div><div class='add'>+  execute` infrastructure.</div><div class='add'>+</div><div class='add'>+It will run `peer_hello` executable in all peer nodes and shows the</div><div class='add'>+output from each node(Below example shows output from my two nodes</div><div class='add'>+cluster)</div><div class='add'>+</div><div class='add'>+    Hello from UUID: e7a3c5c8-e7ad-47ad-aa9c-c13907c4da84</div><div class='add'>+    Hello from UUID: c680fc0a-01f9-4c93-a062-df91cc02e40f</div><div class='add'>+</div><div class='add'>+## cliutils</div><div class='add'>+A Python wrapper around `gluster system:: execute` command is created</div><div class='add'>+to address the following issues</div><div class='add'>+</div><div class='add'>+- If a node is down in the cluster, `system:: execute` just skips it</div><div class='add'>+  and runs only in up nodes.</div><div class='add'>+- `system:: execute` commands are not user friendly</div><div class='add'>+- It captures only stdout, so handling errors is tricky.</div><div class='add'>+</div><div class='add'>+**Advantages of cliutils:**</div><div class='add'>+</div><div class='add'>+- Single executable file will act as node component as well as User CLI.</div><div class='add'>+- `execute_in_peers` utility function will merge the `gluster system::</div><div class='add'>+  execute` output with `gluster peer status` to identify offline nodes.</div><div class='add'>+- Easy CLI Arguments handling.</div><div class='add'>+- If node component returns non zero return value then, `gluster</div><div class='add'>+  system:: execute` will fail to aggregate the output from other</div><div class='add'>+  nodes. `node_output_ok` or `node_output_notok` utility functions</div><div class='add'>+  returns zero both in case of success or error, but returns json</div><div class='add'>+  with ok: true or ok:false respectively.</div><div class='add'>+- Easy to iterate on the node outputs.</div><div class='add'>+- Better error handling - Geo-rep CLIs `gluster system:: execute</div><div class='add'>+  mountbroker`, `gluster system:: execute gsec_create` and `gluster</div><div class='add'>+  system:: add_secret_pub` are suffering from error handling. These</div><div class='add'>+  tools are not notifying user if any failures during execute or if a node</div><div class='add'>+  is down during execute.</div><div class='add'>+</div><div class='add'>+### Hello World</div><div class='add'>+Create a file in `$LIBEXEC/glusterfs/peer_message.py` with following</div><div class='add'>+content.</div><div class='add'>+</div><div class='add'>+    #!/usr/bin/python3</div><div class='add'>+    from gluster.cliutils import Cmd, runcli, execute_in_peers, node_output_ok</div><div class='add'>+</div><div class='add'>+    class NodeHello(Cmd):</div><div class='add'>+        name = "node-hello"</div><div class='add'>+</div><div class='add'>+        def run(self, args):</div><div class='add'>+            node_output_ok("Hello")</div><div class='add'>+</div><div class='add'>+    class Hello(Cmd):</div><div class='add'>+        name = "hello"</div><div class='add'>+</div><div class='add'>+        def run(self, args):</div><div class='add'>+            out = execute_in_peers("node-hello")</div><div class='add'>+            for row in out:</div><div class='add'>+                print ("{0} from {1}".format(row.output, row.hostname))</div><div class='add'>+</div><div class='add'>+    if __name__ == "__main__":</div><div class='add'>+        runcli()</div><div class='add'>+</div><div class='add'>+When we run `python peer_message.py`, it will have two subcommands,</div><div class='add'>+"node-hello" and "hello". This file should be copied to</div><div class='add'>+`$LIBEXEC/glusterfs` directory in all peer nodes. User will call</div><div class='add'>+subcommand "hello" from any one peer node, which internally call</div><div class='add'>+`gluster system:: execute message.py node-hello`(This runs in all peer</div><div class='add'>+nodes and collect the outputs)</div><div class='add'>+</div><div class='add'>+For node component do not print the output directly, use</div><div class='add'>+`node_output_ok` or `node_output_notok` functions. `node_output_ok`</div><div class='add'>+additionally collects the node UUID and prints in JSON</div><div class='add'>+format. `execute_in_peers` function will collect this output and</div><div class='add'>+merges with `peers list` so that we don't miss the node information if</div><div class='add'>+that node is offline.</div><div class='add'>+</div><div class='add'>+If you observed already, function `args` is optional, if you don't</div><div class='add'>+have arguments then no need to create a function. When we run the</div><div class='add'>+file, we will have two subcommands. For example,</div><div class='add'>+</div><div class='add'>+    python peer_message.py hello</div><div class='add'>+    python peer_message.py node-hello</div><div class='add'>+</div><div class='add'>+First subcommand calls second subcommand in all peer nodes. Basically</div><div class='add'>+`execute_in_peers(NAME, ARGS)` will be converted into</div><div class='add'>+</div><div class='add'>+    CMD_NAME = FILENAME without "peers_"</div><div class='add'>+    gluster system:: execute &lt;CMD_NAME&gt; &lt;SUBCOMMAND&gt; &lt;ARGS&gt;</div><div class='add'>+</div><div class='add'>+In our example,</div><div class='add'>+</div><div class='add'>+    filename = "peer_message.py"</div><div class='add'>+    cmd_name = "message.py"</div><div class='add'>+    gluster system:: execute ${cmd_name} node-hello</div><div class='add'>+</div><div class='add'>+Now create symlink in `/usr/bin` or `/usr/sbin` directory depending on</div><div class='add'>+the usecase.(Optional step for usability)</div><div class='add'>+</div><div class='add'>+    ln -s /usr/libexec/glusterfs/peer_message.py /usr/bin/gluster-message</div><div class='add'>+</div><div class='add'>+Now users can use `gluster-message` instead of calling</div><div class='add'>+`/usr/libexec/glusterfs/peer_message.py`</div><div class='add'>+</div><div class='add'>+    gluster-message hello</div><div class='add'>+</div><div class='add'>+### Showing CLI output as Table</div><div class='add'>+</div><div class='add'>+Following example uses prettytable library, which can be installed</div><div class='add'>+using `pip install prettytable` or `dnf install python-prettytable`</div><div class='add'>+</div><div class='add'>+    #!/usr/bin/python3</div><div class='add'>+    from prettytable import PrettyTable</div><div class='add'>+    from gluster.cliutils import Cmd, runcli, execute_in_peers, node_output_ok</div><div class='add'>+</div><div class='add'>+    class NodeHello(Cmd):</div><div class='add'>+        name = "node-hello"</div><div class='add'>+</div><div class='add'>+        def run(self, args):</div><div class='add'>+            node_output_ok("Hello")</div><div class='add'>+</div><div class='add'>+    class Hello(Cmd):</div><div class='add'>+        name = "hello"</div><div class='add'>+</div><div class='add'>+        def run(self, args):</div><div class='add'>+            out = execute_in_peers("node-hello")</div><div class='add'>+            # Initialize the CLI table</div><div class='add'>+            table = PrettyTable(["ID", "NODE", "NODE STATUS", "MESSAGE"])</div><div class='add'>+            table.align["NODE STATUS"] = "r"</div><div class='add'>+            for row in out:</div><div class='add'>+                table.add_row([row.nodeid,</div><div class='add'>+                               row.hostname,</div><div class='add'>+                               "UP" if row.node_up else "DOWN",</div><div class='add'>+                               row.output if row.ok else row.error])</div><div class='add'>+</div><div class='add'>+            print table</div><div class='add'>+</div><div class='add'>+    if __name__ == "__main__":</div><div class='add'>+        runcli()</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+Example output,</div><div class='add'>+</div><div class='add'>+    +--------------------------------------+-----------+-------------+---------+</div><div class='add'>+    |                  ID                  |    NODE   | NODE STATUS | MESSAGE |</div><div class='add'>+    +--------------------------------------+-----------+-------------+---------+</div><div class='add'>+    | e7a3c5c8-e7ad-47ad-aa9c-c13907c4da84 | localhost |          UP |  Hello  |</div><div class='add'>+    | bb57a4c4-86eb-4af5-865d-932148c2759b | vm2       |          UP |  Hello  |</div><div class='add'>+    | f69b918f-1ffa-4fe5-b554-ee10f051294e | vm3       |        DOWN |  N/A    |</div><div class='add'>+    +--------------------------------------+-----------+-------------+---------+</div><div class='add'>+</div><div class='add'>+## How to package in Gluster</div><div class='add'>+If the project is created in `$GLUSTER_SRC/tools/message`</div><div class='add'>+</div><div class='add'>+Add "message" to SUBDIRS list in `$GLUSTER_SRC/tools/Makefile.am`</div><div class='add'>+</div><div class='add'>+and then create a `Makefile.am` in `$GLUSTER_SRC/tools/message`</div><div class='add'>+directory with following content.</div><div class='add'>+</div><div class='add'>+    EXTRA_DIST = peer_message.py</div><div class='add'>+</div><div class='add'>+    peertoolsdir = $(libexecdir)/glusterfs/</div><div class='add'>+    peertools_SCRIPTS = peer_message.py</div><div class='add'>+</div><div class='add'>+    install-exec-hook:</div><div class='add'>+        $(mkdir_p) $(DESTDIR)$(bindir)</div><div class='add'>+        rm -f $(DESTDIR)$(bindir)/gluster-message</div><div class='add'>+        ln -s $(libexecdir)/glusterfs/peer_message.py \</div><div class='add'>+            $(DESTDIR)$(bindir)/gluster-message</div><div class='add'>+</div><div class='add'>+    uninstall-hook:</div><div class='add'>+        rm -f $(DESTDIR)$(bindir)/gluster-message</div><div class='add'>+</div><div class='add'>+Thats all. Add following files in `glusterfs.spec.in` if packaging is</div><div class='add'>+required.(Under `%files` section)</div><div class='add'>+</div><div class='add'>+    %{_libexecdir}/glusterfs/peer_message.py*</div><div class='add'>+    %{_bindir}/gluster-message</div><div class='add'>+</div><div class='add'>+## Who is using cliutils</div><div class='add'>+- gluster-mountbroker   http://review.gluster.org/14544</div><div class='add'>+- gluster-eventsapi     http://review.gluster.org/14248</div><div class='add'>+- gluster-georep-sshkey http://review.gluster.org/14732</div><div class='add'>+- gluster-restapi       https://github.com/gluster/restapi</div><div class='add'>+</div><div class='add'>+## Limitations/TODOs</div><div class='add'>+- Not yet possible to create CLI without any subcommand, For example</div><div class='add'>+  `gluster-message` without any arguments</div><div class='add'>+- Hiding node subcommands in `--help`(`gluster-message --help` will</div><div class='add'>+  show all subcommands including node subcommands)</div><div class='add'>+- Only positional arguments supported for node arguments, Optional</div><div class='add'>+  arguments can be used for other commands.</div><div class='add'>+- API documentation</div><div class='head'>diff --git a/extras/cliutils/__init__.py b/extras/cliutils/__init__.py<br/>new file mode 100644<br/>index 00000000000..8765cc85099<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/extras/cliutils/__init__.py?id=d1d7a6f35c816822fab51c820e25023863c239c1'>extras/cliutils/__init__.py</a></div><div class='hunk'>@@ -0,0 +1,31 @@</div><div class='add'>+# -*- coding: utf-8 -*-</div><div class='add'>+# Reexporting the utility funcs and classes</div><div class='add'>+from .cliutils import (runcli,</div><div class='add'>+                       sync_file_to_peers,</div><div class='add'>+                       execute_in_peers,</div><div class='add'>+                       execute,</div><div class='add'>+                       node_output_ok,</div><div class='add'>+                       node_output_notok,</div><div class='add'>+                       output_error,</div><div class='add'>+                       oknotok,</div><div class='add'>+                       yesno,</div><div class='add'>+                       get_node_uuid,</div><div class='add'>+                       Cmd,</div><div class='add'>+                       GlusterCmdException,</div><div class='add'>+                       set_common_args_func)</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+# This will be useful when `from cliutils import *`</div><div class='add'>+__all__ = ["runcli",</div><div class='add'>+           "sync_file_to_peers",</div><div class='add'>+           "execute_in_peers",</div><div class='add'>+           "execute",</div><div class='add'>+           "node_output_ok",</div><div class='add'>+           "node_output_notok",</div><div class='add'>+           "output_error",</div><div class='add'>+           "oknotok",</div><div class='add'>+           "yesno",</div><div class='add'>+           "get_node_uuid",</div><div class='add'>+           "Cmd",</div><div class='add'>+           "GlusterCmdException",</div><div class='add'>+           "set_common_args_func"]</div><div class='head'>diff --git a/extras/cliutils/cliutils.py b/extras/cliutils/cliutils.py<br/>new file mode 100644<br/>index 00000000000..55fbaf56704<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/extras/cliutils/cliutils.py?id=d1d7a6f35c816822fab51c820e25023863c239c1'>extras/cliutils/cliutils.py</a></div><div class='hunk'>@@ -0,0 +1,237 @@</div><div class='add'>+# -*- coding: utf-8 -*-</div><div class='add'>+from __future__ import print_function</div><div class='add'>+from argparse import ArgumentParser, RawDescriptionHelpFormatter</div><div class='add'>+import inspect</div><div class='add'>+import subprocess</div><div class='add'>+import os</div><div class='add'>+import xml.etree.cElementTree as etree</div><div class='add'>+import json</div><div class='add'>+import sys</div><div class='add'>+</div><div class='add'>+MY_UUID = None</div><div class='add'>+parser = ArgumentParser(formatter_class=RawDescriptionHelpFormatter,</div><div class='add'>+                        description=__doc__)</div><div class='add'>+subparsers = parser.add_subparsers(dest="mode")</div><div class='add'>+</div><div class='add'>+subcommands = {}</div><div class='add'>+cache_data = {}</div><div class='add'>+ParseError = etree.ParseError if hasattr(etree, 'ParseError') else SyntaxError</div><div class='add'>+_common_args_func = lambda p: True</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+class GlusterCmdException(Exception):</div><div class='add'>+    def __init__(self, message):</div><div class='add'>+        self.message = message</div><div class='add'>+        try:</div><div class='add'>+            # Python 3</div><div class='add'>+            super().__init__(message)</div><div class='add'>+        except TypeError:</div><div class='add'>+            # Python 2</div><div class='add'>+            super(GlusterCmdException, self).__init__(message)</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def get_node_uuid():</div><div class='add'>+    # Caches the Node UUID in global variable,</div><div class='add'>+    # Executes gluster system:: uuid get command only if</div><div class='add'>+    # calling this function for first time</div><div class='add'>+    global MY_UUID</div><div class='add'>+    if MY_UUID is not None:</div><div class='add'>+        return MY_UUID</div><div class='add'>+</div><div class='add'>+    cmd = ["gluster", "system::", "uuid", "get", "--xml"]</div><div class='add'>+    rc, out, err = execute(cmd)</div><div class='add'>+</div><div class='add'>+    if rc != 0:</div><div class='add'>+        return None</div><div class='add'>+</div><div class='add'>+    tree = etree.fromstring(out)</div><div class='add'>+    uuid_el = tree.find("uuidGenerate/uuid")</div><div class='add'>+    MY_UUID = uuid_el.text</div><div class='add'>+    return MY_UUID</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def yesno(flag):</div><div class='add'>+    return "Yes" if flag else "No"</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def oknotok(flag):</div><div class='add'>+    return "OK" if flag else "NOT OK"</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def output_error(message, errcode=1):</div><div class='add'>+    print (message, file=sys.stderr)</div><div class='add'>+    sys.exit(errcode)</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def node_output_ok(message=""):</div><div class='add'>+    # Prints Success JSON output and exits with returncode zero</div><div class='add'>+    out = {"ok": True, "nodeid": get_node_uuid(), "output": message}</div><div class='add'>+    print (json.dumps(out))</div><div class='add'>+    sys.exit(0)</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def node_output_notok(message):</div><div class='add'>+    # Prints Error JSON output and exits with returncode zero</div><div class='add'>+    out = {"ok": False, "nodeid": get_node_uuid(), "error": message}</div><div class='add'>+    print (json.dumps(out))</div><div class='add'>+    sys.exit(0)</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def execute(cmd):</div><div class='add'>+    p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE,</div><div class='add'>+                         universal_newlines=True)</div><div class='add'>+    out, err = p.communicate()</div><div class='add'>+    return p.returncode, out, err</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def get_pool_list():</div><div class='add'>+    cmd = ["gluster", "--mode=script", "pool", "list", "--xml"]</div><div class='add'>+    rc, out, err = execute(cmd)</div><div class='add'>+    if rc != 0:</div><div class='add'>+        output_error("Failed to get Pool Info: {0}".format(err))</div><div class='add'>+</div><div class='add'>+    tree = etree.fromstring(out)</div><div class='add'>+</div><div class='add'>+    pool = []</div><div class='add'>+    try:</div><div class='add'>+        for p in tree.findall('peerStatus/peer'):</div><div class='add'>+            pool.append({"nodeid": p.find("uuid").text,</div><div class='add'>+                         "hostname": p.find("hostname").text,</div><div class='add'>+                         "connected": (True if p.find("connected").text == "1"</div><div class='add'>+                                       else False)})</div><div class='add'>+    except (ParseError, AttributeError, ValueError) as e:</div><div class='add'>+        output_error("Failed to parse Pool Info: {0}".format(e))</div><div class='add'>+</div><div class='add'>+    return pool</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+class NodeOutput(object):</div><div class='add'>+    def __init__(self, **kwargs):</div><div class='add'>+        self.nodeid = kwargs.get("nodeid", "")</div><div class='add'>+        self.hostname = kwargs.get("hostname", "")</div><div class='add'>+        self.node_up = kwargs.get("node_up", False)</div><div class='add'>+        self.ok = kwargs.get("ok", False)</div><div class='add'>+        self.output = kwargs.get("output", "N/A")</div><div class='add'>+        self.error = kwargs.get("error", "N/A")</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def execute_in_peers(name, args=[]):</div><div class='add'>+    # Get the file name of Caller function, If the file name is peer_example.py</div><div class='add'>+    # then Gluster peer command will be gluster system:: execute example.py</div><div class='add'>+    # Command name is without peer_</div><div class='add'>+    frame = inspect.stack()[1]</div><div class='add'>+    module = inspect.getmodule(frame[0])</div><div class='add'>+    actual_file = module.__file__</div><div class='add'>+    # If file is symlink then find actual file</div><div class='add'>+    if os.path.islink(actual_file):</div><div class='add'>+        actual_file = os.readlink(actual_file)</div><div class='add'>+</div><div class='add'>+    # Get the name of file without peer_</div><div class='add'>+    cmd_name = os.path.basename(actual_file).replace("peer_", "")</div><div class='add'>+    cmd = ["gluster", "system::", "execute", cmd_name, name] + args</div><div class='add'>+    rc, out, err = execute(cmd)</div><div class='add'>+    if rc != 0:</div><div class='add'>+        raise GlusterCmdException((rc, out, err, " ".join(cmd)))</div><div class='add'>+</div><div class='add'>+    out = out.strip().splitlines()</div><div class='add'>+</div><div class='add'>+    # JSON decode each line and construct one object with node id as key</div><div class='add'>+    all_nodes_data = {}</div><div class='add'>+    for node_data in out:</div><div class='add'>+        data = json.loads(node_data)</div><div class='add'>+        all_nodes_data[data["nodeid"]] = {</div><div class='add'>+            "nodeid": data.get("nodeid"),</div><div class='add'>+            "ok": data.get("ok"),</div><div class='add'>+            "output": data.get("output", ""),</div><div class='add'>+            "error": data.get("error", "")}</div><div class='add'>+</div><div class='add'>+    # gluster pool list</div><div class='add'>+    pool_list = get_pool_list()</div><div class='add'>+</div><div class='add'>+    data_out = []</div><div class='add'>+    # Iterate pool_list and merge all_nodes_data collected above</div><div class='add'>+    # If a peer node is down then set node_up = False</div><div class='add'>+    for p in pool_list:</div><div class='add'>+        p_data = all_nodes_data.get(p.get("nodeid"), None)</div><div class='add'>+        row_data = NodeOutput(node_up=False,</div><div class='add'>+                              hostname=p.get("hostname"),</div><div class='add'>+                              nodeid=p.get("nodeid"),</div><div class='add'>+                              ok=False)</div><div class='add'>+</div><div class='add'>+        if p_data is not None:</div><div class='add'>+            # Node is UP</div><div class='add'>+            row_data.node_up = True</div><div class='add'>+            row_data.ok = p_data.get("ok")</div><div class='add'>+            row_data.output = p_data.get("output")</div><div class='add'>+            row_data.error = p_data.get("error")</div><div class='add'>+</div><div class='add'>+        data_out.append(row_data)</div><div class='add'>+</div><div class='add'>+    return data_out</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def sync_file_to_peers(fname):</div><div class='add'>+    # Copy file from current node to all peer nodes, fname</div><div class='add'>+    # is path after GLUSTERD_WORKDIR</div><div class='add'>+    cmd = ["gluster", "system::", "copy", "file", fname]</div><div class='add'>+    rc, out, err = execute(cmd)</div><div class='add'>+    if rc != 0:</div><div class='add'>+        raise GlusterCmdException((rc, out, err))</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+class Cmd(object):</div><div class='add'>+    name = ""</div><div class='add'>+</div><div class='add'>+    def run(self, args):</div><div class='add'>+        # Must required method. Raise NotImplementedError if derived class</div><div class='add'>+        # not implemented this method</div><div class='add'>+        raise NotImplementedError("\"run(self, args)\" method is "</div><div class='add'>+                                  "not implemented by \"{0}\"".format(</div><div class='add'>+                                      self.__class__.__name__))</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def runcli():</div><div class='add'>+    # Get list of Classes derived from class "Cmd" and create</div><div class='add'>+    # a subcommand as specified in the Class name. Call the args</div><div class='add'>+    # method by passing subcommand parser, Derived class can add</div><div class='add'>+    # arguments to the subcommand parser.</div><div class='add'>+    metavar_data = []</div><div class='add'>+    for c in Cmd.__subclasses__():</div><div class='add'>+        cls = c()</div><div class='add'>+        if getattr(cls, "name", "") == "":</div><div class='add'>+            raise NotImplementedError("\"name\" is not added "</div><div class='add'>+                                      "to \"{0}\"".format(</div><div class='add'>+                                          cls.__class__.__name__))</div><div class='add'>+</div><div class='add'>+        # Do not show in help message if subcommand starts with node-</div><div class='add'>+        if not cls.name.startswith("node-"):</div><div class='add'>+            metavar_data.append(cls.name)</div><div class='add'>+</div><div class='add'>+        p = subparsers.add_parser(cls.name)</div><div class='add'>+        args_func = getattr(cls, "args", None)</div><div class='add'>+        if args_func is not None:</div><div class='add'>+            args_func(p)</div><div class='add'>+</div><div class='add'>+        # Apply common args if any</div><div class='add'>+        _common_args_func(p)</div><div class='add'>+</div><div class='add'>+        # A dict to save subcommands, key is name of the subcommand</div><div class='add'>+        subcommands[cls.name] = cls</div><div class='add'>+</div><div class='add'>+    # Hide node commands in Help message</div><div class='add'>+    subparsers.metavar = "{" + ",".join(metavar_data) + "}"</div><div class='add'>+</div><div class='add'>+    # Get all parsed arguments</div><div class='add'>+    args = parser.parse_args()</div><div class='add'>+</div><div class='add'>+    # Get the subcommand to execute</div><div class='add'>+    cls = subcommands.get(args.mode, None)</div><div class='add'>+</div><div class='add'>+    # Run</div><div class='add'>+    if cls is not None:</div><div class='add'>+        cls.run(args)</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def set_common_args_func(func):</div><div class='add'>+    global _common_args_func</div><div class='add'>+    _common_args_func = func</div><div class='head'>diff --git a/extras/collect-system-stats.sh b/extras/collect-system-stats.sh<br/>new file mode 100755<br/>index 00000000000..865e70bbc11<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/extras/collect-system-stats.sh?id=d1d7a6f35c816822fab51c820e25023863c239c1'>extras/collect-system-stats.sh</a></div><div class='hunk'>@@ -0,0 +1,52 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+################################################################################</div><div class='add'>+# Usage: collect-system-stats.sh &lt;delay-in-seconds&gt;</div><div class='add'>+# This script starts sar/top/iostat/vmstat processes which collect system stats</div><div class='add'>+# with the interval &lt;delay-in-seconds&gt; given as argument to the script. When</div><div class='add'>+# the script is stopped either by entering any input or Ctrl+C the list of</div><div class='add'>+# files where output is captured will be printed on the screen which can be</div><div class='add'>+# observed to find any problems/bottlenecks.</div><div class='add'>+###############################################################################</div><div class='add'>+</div><div class='add'>+function stop_processes {</div><div class='add'>+        echo "Stopping the monitoring processes"</div><div class='add'>+        echo "sar pid:$sar_pid", "top pid: $top_pid", "iostat pid: $iostat_pid", "vmstat pid: $vmstat_pid"</div><div class='add'>+        kill "$sar_pid" "$top_pid" "$iostat_pid" "$vmstat_pid"</div><div class='add'>+        echo "Files created: ${timestamp}-network.out, ${timestamp}-top.out, ${timestamp}-iostat.out, ${timestamp}-vmstat.out"</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function check_dependent_commands_exist()</div><div class='add'>+{</div><div class='add'>+        declare -a arr=("sar" "top" "iostat" "vmstat")</div><div class='add'>+        for i in "${arr[@]}"</div><div class='add'>+        do</div><div class='add'>+                if ! command -v "$i" &gt; /dev/null 2&gt;&amp;1</div><div class='add'>+                then</div><div class='add'>+                        echo "ERROR: '$i' command is not found"</div><div class='add'>+                        exit 1</div><div class='add'>+                fi</div><div class='add'>+        done</div><div class='add'>+</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+case "$1" in</div><div class='add'>+    ''|*[!0-9]*) echo "Usage: $0 &lt;delay-between-successive-metrics-collection-in-seconds&gt;"; exit 1 ;;</div><div class='add'>+    *) interval="$1" ;;</div><div class='add'>+esac</div><div class='add'>+</div><div class='add'>+timestamp=$(date +"%s")</div><div class='add'>+</div><div class='add'>+check_dependent_commands_exist</div><div class='add'>+sar -n DEV "$interval" &gt; "${timestamp}"-network.out &amp;</div><div class='add'>+sar_pid="$!"</div><div class='add'>+top -bHd "$interval" &gt; "${timestamp}"-top.out &amp;</div><div class='add'>+top_pid="$!"</div><div class='add'>+iostat -Ntkdx "$interval" &gt; "${timestamp}"-iostat.out &amp;</div><div class='add'>+iostat_pid="$!"</div><div class='add'>+vmstat -t "$interval" &gt; "${timestamp}"-vmstat.out &amp;</div><div class='add'>+vmstat_pid="$!"</div><div class='add'>+echo "Started sar, vmstat, iostat, top for collecting stats"</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+trap stop_processes EXIT</div><div class='add'>+read -r -p "Press anything and ENTER to exit";</div><div class='head'>diff --git a/extras/command-completion/Makefile b/extras/command-completion/Makefile<br/>new file mode 100644<br/>index 00000000000..06cbfe0672f<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/extras/command-completion/Makefile?id=d1d7a6f35c816822fab51c820e25023863c239c1'>extras/command-completion/Makefile</a></div><div class='hunk'>@@ -0,0 +1,6 @@</div><div class='add'>+install:</div><div class='add'>+	mkdir -p /etc/bash_completion.d</div><div class='add'>+	cp gluster.bash /etc/bash_completion.d/gluster</div><div class='add'>+</div><div class='add'>+uninstall:</div><div class='add'>+	rm -f /etc/bash_completion.d/gluster</div><div class='head'>diff --git a/extras/command-completion/README b/extras/command-completion/README<br/>new file mode 100644<br/>index 00000000000..0acba38168f<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/extras/command-completion/README?id=d1d7a6f35c816822fab51c820e25023863c239c1'>extras/command-completion/README</a></div><div class='hunk'>@@ -0,0 +1,5 @@</div><div class='add'>+This file is not moved to /etc/bash_completion.d/ with the source installation.</div><div class='add'>+Please execute make install explicity from here to move this file to</div><div class='add'>+/etc/bash_completion.d</div><div class='add'>+</div><div class='add'>+Similarly, use make uninstall to remove it from /etc/bash_completion.d</div><div class='head'>diff --git a/extras/command-completion/gluster.bash b/extras/command-completion/gluster.bash<br/>new file mode 100644<br/>index 00000000000..73d16098875<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/extras/command-completion/gluster.bash?id=d1d7a6f35c816822fab51c820e25023863c239c1'>extras/command-completion/gluster.bash</a></div><div class='hunk'>@@ -0,0 +1,492 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+if pidof glusterd &gt; /dev/null 2&gt;&amp;1; then</div><div class='add'>+        GLUSTER_SET_OPTIONS="</div><div class='add'>+        $(for token in `gluster volume set help 2&gt;/dev/null | grep "^Option:" | cut -d ' ' -f 2`</div><div class='add'>+        do</div><div class='add'>+                echo "{$token},"</div><div class='add'>+        done)</div><div class='add'>+        "</div><div class='add'>+        GLUSTER_RESET_OPTIONS="$GLUSTER_SET_OPTIONS"</div><div class='add'>+fi</div><div class='add'>+</div><div class='add'>+GLUSTER_TOP_SUBOPTIONS1="</div><div class='add'>+        {nfs},</div><div class='add'>+        {brick},</div><div class='add'>+        {list-cnt}</div><div class='add'>+"</div><div class='add'>+GLUSTER_TOP_SUBOPTIONS2="</div><div class='add'>+        {bs</div><div class='add'>+                {__SIZE</div><div class='add'>+                        {count}</div><div class='add'>+                }</div><div class='add'>+        },</div><div class='add'>+        {brick},</div><div class='add'>+        {list-cnt}</div><div class='add'>+"</div><div class='add'>+GLUSTER_TOP_OPTIONS="</div><div class='add'>+        {open</div><div class='add'>+                [ $GLUSTER_TOP_SUBOPTIONS1 ]</div><div class='add'>+        },</div><div class='add'>+        {read</div><div class='add'>+                [ $GLUSTER_TOP_SUBOPTIONS1 ]</div><div class='add'>+        },</div><div class='add'>+        {write</div><div class='add'>+                [ $GLUSTER_TOP_SUBOPTIONS1 ]</div><div class='add'>+        },</div><div class='add'>+        {opendir</div><div class='add'>+                [ $GLUSTER_TOP_SUBOPTIONS1 ]</div><div class='add'>+        },</div><div class='add'>+        {readdir</div><div class='add'>+                [ $GLUSTER_TOP_SUBOPTIONS1 ]</div><div class='add'>+        },</div><div class='add'>+        {clear</div><div class='add'>+                [ $GLUSTER_TOP_SUBOPTIONS1 ]</div><div class='add'>+        },</div><div class='add'>+        {read-perf</div><div class='add'>+                [ $GLUSTER_TOP_SUBOPTIONS2 ]</div><div class='add'>+        },</div><div class='add'>+        {write-perf</div><div class='add'>+                [ $GLUSTER_TOP_SUBOPTIONS2 ]</div><div class='add'>+        }</div><div class='add'>+"</div><div class='add'>+</div><div class='add'>+GLUSTER_QUOTA_OPTIONS="</div><div class='add'>+        {enable},</div><div class='add'>+        {disable},</div><div class='add'>+        {list},</div><div class='add'>+        {remove},</div><div class='add'>+        {default-soft-limit},</div><div class='add'>+        {limit-usage},</div><div class='add'>+        {alert-time},</div><div class='add'>+        {soft-timeout},</div><div class='add'>+        {hard-timeout}</div><div class='add'>+"</div><div class='add'>+</div><div class='add'>+GLUSTER_PROFILE_OPTIONS="</div><div class='add'>+        {start},</div><div class='add'>+        {info [</div><div class='add'>+                {peek},</div><div class='add'>+                {incremental</div><div class='add'>+                        {peek}</div><div class='add'>+                },</div><div class='add'>+                {cumulative},</div><div class='add'>+                {clear},</div><div class='add'>+              ]</div><div class='add'>+        },</div><div class='add'>+        {stop}</div><div class='add'>+"</div><div class='add'>+</div><div class='add'>+GLUSTER_BARRIER_OPTIONS="</div><div class='add'>+        {enable},</div><div class='add'>+        {disable}</div><div class='add'>+"</div><div class='add'>+</div><div class='add'>+GLUSTER_GEO_REPLICATION_SUBOPTIONS="</div><div class='add'>+"</div><div class='add'>+GLUSTER_GEO_REPLICATION_OPTIONS="</div><div class='add'>+        {__VOLNAME [</div><div class='add'>+                {__SLAVEURL [</div><div class='add'>+                        {create [</div><div class='add'>+                                {push-pem</div><div class='add'>+                                        {force}</div><div class='add'>+                                },</div><div class='add'>+                                {force}</div><div class='add'>+                                ]</div><div class='add'>+                        },</div><div class='add'>+                        {start {force} },</div><div class='add'>+                        {status {detail} },</div><div class='add'>+                        {config},</div><div class='add'>+                        {pause {force} },</div><div class='add'>+                        {resume {force} },</div><div class='add'>+                        {stop {force} },</div><div class='add'>+                        {delete {force} }</div><div class='add'>+                            ]</div><div class='add'>+                },</div><div class='add'>+                {status}</div><div class='add'>+                   ]</div><div class='add'>+        },</div><div class='add'>+        {status}</div><div class='add'>+"</div><div class='add'>+</div><div class='add'>+GLUSTER_VOLUME_OPTIONS="</div><div class='add'>+        {volume [</div><div class='add'>+                {add-brick</div><div class='add'>+                        {__VOLNAME}</div><div class='add'>+                },</div><div class='add'>+                {barrier</div><div class='add'>+                        {__VOLNAME</div><div class='add'>+                                [ $GLUSTER_BARRIER_OPTIONS ]</div><div class='add'>+                        }</div><div class='add'>+                },</div><div class='add'>+                {clear-locks</div><div class='add'>+                        {__VOLNAME}</div><div class='add'>+                },</div><div class='add'>+                {create},</div><div class='add'>+                {delete</div><div class='add'>+                        {__VOLNAME}</div><div class='add'>+                },</div><div class='add'>+                {geo-replication</div><div class='add'>+                        [ $GLUSTER_GEO_REPLICATION_OPTIONS ]</div><div class='add'>+                },</div><div class='add'>+                {heal</div><div class='add'>+                        {__VOLNAME}</div><div class='add'>+                },</div><div class='add'>+                {help},</div><div class='add'>+                {info</div><div class='add'>+                        {__VOLNAME}</div><div class='add'>+                },</div><div class='add'>+                {list},</div><div class='add'>+                {log</div><div class='add'>+                        {__VOLNAME}</div><div class='add'>+                },</div><div class='add'>+                {profile</div><div class='add'>+                        {__VOLNAME</div><div class='add'>+                                [ $GLUSTER_PROFILE_OPTIONS ]</div><div class='add'>+                        }</div><div class='add'>+                },</div><div class='add'>+                {quota</div><div class='add'>+                        {__VOLNAME</div><div class='add'>+                                [ $GLUSTER_QUOTA_OPTIONS ]</div><div class='add'>+                        }</div><div class='add'>+                },</div><div class='add'>+                {rebalance</div><div class='add'>+                        {__VOLNAME}</div><div class='add'>+                },</div><div class='add'>+                {remove-brick</div><div class='add'>+                        {__VOLNAME}</div><div class='add'>+                },</div><div class='add'>+                {replace-brick</div><div class='add'>+                        {__VOLNAME}</div><div class='add'>+                },</div><div class='add'>+                {reset</div><div class='add'>+                        {__VOLNAME</div><div class='add'>+                                [ $GLUSTER_RESET_OPTIONS ]</div><div class='add'>+                        }</div><div class='add'>+                },</div><div class='add'>+                {set</div><div class='add'>+                        {__VOLNAME</div><div class='add'>+                                [ $GLUSTER_SET_OPTIONS ]</div><div class='add'>+                        }</div><div class='add'>+                },</div><div class='add'>+                {start</div><div class='add'>+                        {__VOLNAME</div><div class='add'>+                                {force}</div><div class='add'>+                        }</div><div class='add'>+                },</div><div class='add'>+                {statedump</div><div class='add'>+                        {__VOLNAME}</div><div class='add'>+                },</div><div class='add'>+                {status</div><div class='add'>+                        {__VOLNAME}</div><div class='add'>+                },</div><div class='add'>+                {stop</div><div class='add'>+                        {__VOLNAME</div><div class='add'>+                                {force}</div><div class='add'>+                        }</div><div class='add'>+                },</div><div class='add'>+                {sync</div><div class='add'>+                        {__HOSTNAME}</div><div class='add'>+                },</div><div class='add'>+                {top</div><div class='add'>+                        {__VOLNAME</div><div class='add'>+                                [ $GLUSTER_TOP_OPTIONS ]</div><div class='add'>+                        }</div><div class='add'>+                }</div><div class='add'>+                ]</div><div class='add'>+        }</div><div class='add'>+"</div><div class='add'>+</div><div class='add'>+GLUSTER_COMMAND_TREE="</div><div class='add'>+{gluster [</div><div class='add'>+        $GLUSTER_VOLUME_OPTIONS ,</div><div class='add'>+        {peer [</div><div class='add'>+              {probe</div><div class='add'>+                      {__HOSTNAME}</div><div class='add'>+              },</div><div class='add'>+              {detach</div><div class='add'>+                      {__HOSTNAME</div><div class='add'>+                                {force}</div><div class='add'>+                      }</div><div class='add'>+              },</div><div class='add'>+              {status}</div><div class='add'>+              ]</div><div class='add'>+        },</div><div class='add'>+        {pool</div><div class='add'>+                {list}</div><div class='add'>+        },</div><div class='add'>+        {help}</div><div class='add'>+        ]</div><div class='add'>+}"</div><div class='add'>+</div><div class='add'>+__SIZE ()</div><div class='add'>+{</div><div class='add'>+        return 0</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+__SLAVEURL ()</div><div class='add'>+{</div><div class='add'>+        return 0</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+__HOSTNAME ()</div><div class='add'>+{</div><div class='add'>+        local zero=0</div><div class='add'>+        local ret=0</div><div class='add'>+        local cur_word="$2"</div><div class='add'>+</div><div class='add'>+        if [ "$1" == "X" ]; then</div><div class='add'>+                return</div><div class='add'>+</div><div class='add'>+        elif [ "$1" == "match" ]; then</div><div class='add'>+                return 0</div><div class='add'>+</div><div class='add'>+        elif [ "$1" == "complete" ]; then</div><div class='add'>+                COMPREPLY=($(compgen -A hostname -- $cur_word))</div><div class='add'>+        fi</div><div class='add'>+        return 0</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+__VOLNAME ()</div><div class='add'>+{</div><div class='add'>+        local zero=0</div><div class='add'>+        local ret=0</div><div class='add'>+        local cur_word="$2"</div><div class='add'>+        local list=""</div><div class='add'>+</div><div class='add'>+        if [ "X$1" == "X" ]; then</div><div class='add'>+                return</div><div class='add'>+</div><div class='add'>+        elif [ "$1" == "match" ]; then</div><div class='add'>+                return 0</div><div class='add'>+</div><div class='add'>+        elif [ "$1" == "complete" ]; then</div><div class='add'>+                if ! pidof glusterd &gt; /dev/null 2&gt;&amp;1; then</div><div class='add'>+                        list='';</div><div class='add'>+</div><div class='add'>+                else</div><div class='add'>+                        list=`gluster volume list 2&gt; /dev/null`</div><div class='add'>+                fi</div><div class='add'>+</div><div class='add'>+        else</div><div class='add'>+                return 0</div><div class='add'>+        fi</div><div class='add'>+</div><div class='add'>+        COMPREPLY=($(compgen -W "$list" -- $cur_word))</div><div class='add'>+        return 0</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+_gluster_throw () {</div><div class='add'>+#echo $1 &gt;&amp;2</div><div class='add'>+        COMPREPLY=''</div><div class='add'>+        exit</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+declare GLUSTER_FINAL_LIST=''</div><div class='add'>+declare GLUSTER_LIST=''</div><div class='add'>+declare -i GLUSTER_TOP=0</div><div class='add'>+_gluster_push () {</div><div class='add'>+        GLUSTER_TOP=$((GLUSTER_TOP + 1))</div><div class='add'>+        return $GLUSTER_TOP</div><div class='add'>+}</div><div class='add'>+_gluster_pop () {</div><div class='add'>+        GLUSTER_TOP=$((GLUSTER_TOP - 1))</div><div class='add'>+        return $GLUSTER_TOP</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+_gluster_goto_end ()</div><div class='add'>+{</div><div class='add'>+        local prev_top=$1</div><div class='add'>+        local top=$1</div><div class='add'>+        local token=''</div><div class='add'>+</div><div class='add'>+        while [ $top -ge $prev_top ]; do</div><div class='add'>+                read -r token</div><div class='add'>+                case $token in</div><div class='add'>+                '{' | '[')</div><div class='add'>+                        _gluster_push</div><div class='add'>+                        top=$?</div><div class='add'>+                        ;;</div><div class='add'>+                '}' | ']')</div><div class='add'>+                        _gluster_pop</div><div class='add'>+                        top=$?</div><div class='add'>+                        ;;</div><div class='add'>+                esac</div><div class='add'>+        done</div><div class='add'>+</div><div class='add'>+        return</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+_gluster_form_list ()</div><div class='add'>+{</div><div class='add'>+        local token=''</div><div class='add'>+        local top=0</div><div class='add'>+        local comma=''</div><div class='add'>+        local cur_word="$1"</div><div class='add'>+</div><div class='add'>+        read -r token</div><div class='add'>+        case $token in</div><div class='add'>+        ']')</div><div class='add'>+                ;;</div><div class='add'>+        '{')</div><div class='add'>+                _gluster_push</div><div class='add'>+                top=$?</div><div class='add'>+                read -r key</div><div class='add'>+                if [ "X$cur_word" == "X" -o "${cur_word:0:1}" == "${key:0:1}" -o "${key:0:1}" == "_" ]; then</div><div class='add'>+                        GLUSTER_LIST="$GLUSTER_LIST $key"</div><div class='add'>+                fi</div><div class='add'>+</div><div class='add'>+                _gluster_goto_end $top</div><div class='add'>+                read -r comma</div><div class='add'>+                if [ "$comma" == "," ]; then</div><div class='add'>+                        _gluster_form_list $cur_word</div><div class='add'>+                fi</div><div class='add'>+                ;;</div><div class='add'>+        *)</div><div class='add'>+                _gluster_throw "Expected '{' but received $token"</div><div class='add'>+                ;;</div><div class='add'>+        esac</div><div class='add'>+</div><div class='add'>+        return</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+_gluster_goto_child ()</div><div class='add'>+{</div><div class='add'>+        local match_string="$1"</div><div class='add'>+        local token=''</div><div class='add'>+        local top=0</div><div class='add'>+        local comma=''</div><div class='add'>+</div><div class='add'>+        read -r token</div><div class='add'>+        case $token in</div><div class='add'>+        '{')</div><div class='add'>+                _gluster_push</div><div class='add'>+                top=$?</div><div class='add'>+                ;;</div><div class='add'>+        *)</div><div class='add'>+                _gluster_throw "Expected '{' but received $token"</div><div class='add'>+                ;;</div><div class='add'>+        esac</div><div class='add'>+</div><div class='add'>+        read -r token</div><div class='add'>+        case `echo $token` in</div><div class='add'>+        '[' | ']' | '{' | '}')</div><div class='add'>+                _gluster_throw "Expected string but received $token"</div><div class='add'>+                ;;</div><div class='add'>+        _*)</div><div class='add'>+                $token "match" $match_string</div><div class='add'>+                ret=$?</div><div class='add'>+                if [ $ret -eq 0 ]; then</div><div class='add'>+                        return</div><div class='add'>+                else</div><div class='add'>+                        _gluster_goto_end $top</div><div class='add'>+</div><div class='add'>+                        read -r comma</div><div class='add'>+                        if [ "$comma" == "," ]; then</div><div class='add'>+                                _gluster_goto_child $match_string</div><div class='add'>+                        fi</div><div class='add'>+                fi</div><div class='add'>+                ;;</div><div class='add'>+</div><div class='add'>+        "$match_string")</div><div class='add'>+                return</div><div class='add'>+                ;;</div><div class='add'>+        *)</div><div class='add'>+                _gluster_goto_end $top</div><div class='add'>+</div><div class='add'>+                read -r comma</div><div class='add'>+                if [ "$comma" == "," ]; then</div><div class='add'>+                        _gluster_goto_child $match_string</div><div class='add'>+                fi</div><div class='add'>+                ;;</div><div class='add'>+        esac</div><div class='add'>+</div><div class='add'>+        return</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+_gluster_does_match ()</div><div class='add'>+{</div><div class='add'>+        local token="$1"</div><div class='add'>+        local key="$2"</div><div class='add'>+</div><div class='add'>+        if [ "${token:0:1}" == "_" ]; then</div><div class='add'>+                $token $2</div><div class='add'>+                return $?</div><div class='add'>+        fi</div><div class='add'>+</div><div class='add'>+        [ "$token" == "$key" ] &amp;&amp; return 0</div><div class='add'>+</div><div class='add'>+        return 1</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+_gluster_parse ()</div><div class='add'>+{</div><div class='add'>+        local i=0</div><div class='add'>+        local token=''</div><div class='add'>+        local tmp_token=''</div><div class='add'>+        local word=''</div><div class='add'>+</div><div class='add'>+        while [ $i -lt $COMP_CWORD ]; do</div><div class='add'>+                read -r token</div><div class='add'>+                case $token in</div><div class='add'>+                '[')</div><div class='add'>+                        _gluster_push</div><div class='add'>+                        _gluster_goto_child ${COMP_WORDS[$i]}</div><div class='add'>+                        ;;</div><div class='add'>+                '{')</div><div class='add'>+                        _gluster_push</div><div class='add'>+                        read -r tmp_token</div><div class='add'>+                        _gluster_does_match $tmp_token ${COMP_WORDS[$i]}</div><div class='add'>+                        if [ $? -ne 0 ]; then</div><div class='add'>+                                _gluster_throw "No match"</div><div class='add'>+                        fi</div><div class='add'>+                        ;;</div><div class='add'>+                esac</div><div class='add'>+                i=$((i+1))</div><div class='add'>+        done</div><div class='add'>+</div><div class='add'>+        read -r token</div><div class='add'>+        if [ "$token" == '[' ]; then</div><div class='add'>+                _gluster_push</div><div class='add'>+                _gluster_form_list ${COMP_WORDS[COMP_CWORD]}</div><div class='add'>+</div><div class='add'>+        elif [ "$token" == '{' ]; then</div><div class='add'>+                read -r tmp_token</div><div class='add'>+                GLUSTER_LIST="$tmp_token"</div><div class='add'>+        fi</div><div class='add'>+</div><div class='add'>+        echo $GLUSTER_LIST</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+_gluster_handle_list ()</div><div class='add'>+{</div><div class='add'>+        local list="${!1}"</div><div class='add'>+        local cur_word=$2</div><div class='add'>+        local count=0</div><div class='add'>+        local i=0</div><div class='add'>+</div><div class='add'>+        for i in `echo $list`; do</div><div class='add'>+                count=$((count + 1))</div><div class='add'>+        done</div><div class='add'>+</div><div class='add'>+        if [ $count -eq 1 ] &amp;&amp; [ "${i:0:1}" == "_" ]; then</div><div class='add'>+                $i "complete" $cur_word</div><div class='add'>+        else</div><div class='add'>+                COMPREPLY=($(compgen -W "$list" -- $cur_word))</div><div class='add'>+        fi</div><div class='add'>+        return</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+_gluster_completion ()</div><div class='add'>+{</div><div class='add'>+        GLUSTER_FINAL_LIST=`echo $GLUSTER_COMMAND_TREE |                      \</div><div class='add'>+                egrep -ao --color=never "([A-Za-z0-9_.-]+)|[[:space:]]+|." |  \</div><div class='add'>+                        egrep -v --color=never "^[[:space:]]*$" |             \</div><div class='add'>+                                _gluster_parse`</div><div class='add'>+</div><div class='add'>+        ARG="GLUSTER_FINAL_LIST"</div><div class='add'>+        _gluster_handle_list $ARG ${COMP_WORDS[COMP_CWORD]}</div><div class='add'>+        return</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+complete -F _gluster_completion gluster</div><div class='head'>diff --git a/extras/control-cpu-load.sh b/extras/control-cpu-load.sh<br/>new file mode 100755<br/>index 00000000000..52dcf62fd9f<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/extras/control-cpu-load.sh?id=d1d7a6f35c816822fab51c820e25023863c239c1'>extras/control-cpu-load.sh</a></div><div class='hunk'>@@ -0,0 +1,116 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+USAGE="This script provides a utility to control CPU utilization for any</div><div class='add'>+gluster daemon.In this, we use cgroup framework to configure CPU quota</div><div class='add'>+for a process(like selfheal daemon). Before running this script, make</div><div class='add'>+sure that daemon is running.Every time daemon restarts, it is required</div><div class='add'>+to rerun this command to set CPU quota on new daemon process id.</div><div class='add'>+User can enter any value between 10 to 100 for CPU quota.</div><div class='add'>+Recommended value of quota period is 25. 25 means, kernel will allocate</div><div class='add'>+25 ms period to this group of tasks in every 100 ms period. This 25ms</div><div class='add'>+could be considered as the maximum percentage of CPU quota daemon can take.</div><div class='add'>+This value will be reflected on CPU usage of "top" command.If provided pid</div><div class='add'>+is the only process and no other process is in competition to get CPU, more</div><div class='add'>+ than 25% could be allocated to daemon to speed up the process."</div><div class='add'>+</div><div class='add'>+if [  $# -ge 1 ]; then</div><div class='add'>+  case $1 in</div><div class='add'>+    -h|--help) echo " " "$USAGE" | sed -r -e 's/^[ ]+//g'</div><div class='add'>+               exit 0;</div><div class='add'>+               ;;</div><div class='add'>+  *) echo "Please Provide correct input for script."</div><div class='add'>+     echo "For help correct options are -h or --help."</div><div class='add'>+     exit 1;</div><div class='add'>+               ;;</div><div class='add'>+  esac</div><div class='add'>+fi</div><div class='add'>+</div><div class='add'>+DIR_EXIST=0</div><div class='add'>+LOC="/sys/fs/cgroup/cpu,cpuacct/system.slice/glusterd.service"</div><div class='add'>+echo "Enter gluster daemon pid for which you want to control CPU."</div><div class='add'>+read daemon_pid</div><div class='add'>+</div><div class='add'>+if expr ${daemon_pid} + 0 &gt; /dev/null 2&gt;&amp;1 ;then</div><div class='add'>+  CHECK_PID=$(pgrep -f gluster | grep ${daemon_pid})</div><div class='add'>+  if [ -z "${CHECK_PID}" ]; then</div><div class='add'>+    echo "No daemon is running or pid ${daemon_pid} does not match."</div><div class='add'>+    echo "with running gluster processes."</div><div class='add'>+    exit 1</div><div class='add'>+  fi</div><div class='add'>+else</div><div class='add'>+  echo "Entered daemon_pid is not numeric so Rerun the script."</div><div class='add'>+  exit 1</div><div class='add'>+fi</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+if [ -f ${LOC}/tasks ];then</div><div class='add'>+  CHECK_CGROUP=$(grep ${daemon_pid} ${LOC}/tasks)</div><div class='add'>+  if [ ${CHECK_CGROUP} ]; then</div><div class='add'>+    echo "pid ${daemon_pid} is attached with glusterd.service cgroup."</div><div class='add'>+  fi</div><div class='add'>+fi</div><div class='add'>+</div><div class='add'>+cgroup_name=cgroup_gluster_${daemon_pid}</div><div class='add'>+if [ -f ${LOC}/${cgroup_name}/tasks ]; then</div><div class='add'>+  CHECK_CGROUP=$(grep ${daemon_pid} ${LOC}/${cgroup_name}/tasks)</div><div class='add'>+  if [ ${CHECK_CGROUP} ]; then</div><div class='add'>+    val=`cat ${LOC}/${cgroup_name}/cpu.cfs_quota_us`</div><div class='add'>+    qval=$((val / 1000))</div><div class='add'>+    echo "pid ${daemon_pid} is already attached ${cgroup_name} with quota value ${qval}."</div><div class='add'>+    echo "Press n if you don't want to reassign ${daemon_pid} with new quota value."</div><div class='add'>+    DIR_EXIST=1</div><div class='add'>+  else</div><div class='add'>+    echo "pid ${daemon_pid} is not attached with ${cgroup_name}."</div><div class='add'>+  fi</div><div class='add'>+fi</div><div class='add'>+</div><div class='add'>+read -p "If you want to continue the script to attach ${daemon_pid} with new ${cgroup_name} cgroup Press (y/n)?" choice</div><div class='add'>+case "$choice" in</div><div class='add'>+  y|Y ) echo "yes";;</div><div class='add'>+  n|N ) echo "no";exit;;</div><div class='add'>+  * ) echo "invalid";exit;;</div><div class='add'>+esac</div><div class='add'>+</div><div class='add'>+systemctl set-property glusterd.service CPUShares=1024</div><div class='add'>+</div><div class='add'>+if [ ${DIR_EXIST} -eq 0 ];then</div><div class='add'>+  echo "Creating child cgroup directory '${cgroup_name} cgroup' for glusterd.service."</div><div class='add'>+  mkdir -p ${LOC}/${cgroup_name}</div><div class='add'>+  if [ ! -f ${LOC}/${cgroup_name}/tasks ];then</div><div class='add'>+    echo "Not able to create ${cgroup_name} directory so exit."</div><div class='add'>+    exit 1</div><div class='add'>+  fi</div><div class='add'>+fi</div><div class='add'>+</div><div class='add'>+echo "Enter quota value in range [10,100]:  "</div><div class='add'>+</div><div class='add'>+read quota_value</div><div class='add'>+if expr ${quota_value} + 0 &gt; /dev/null 2&gt;&amp;1 ;then</div><div class='add'>+  if [ ${quota_value} -lt 10 ] || [ ${quota_value} -gt 100 ]; then</div><div class='add'>+    echo "Entered quota value is not correct,it should be in the range ."</div><div class='add'>+    echo "10-100. Ideal value is 25."</div><div class='add'>+    echo "Rerun the sript with correct value."</div><div class='add'>+    exit 1</div><div class='add'>+  else</div><div class='add'>+    echo "Entered quota value is $quota_value"</div><div class='add'>+  fi</div><div class='add'>+else</div><div class='add'>+  echo "Entered quota value is not numeric so Rerun the script."</div><div class='add'>+  exit 1</div><div class='add'>+fi</div><div class='add'>+</div><div class='add'>+quota_value=$((quota_value * 1000))</div><div class='add'>+echo "Setting $quota_value to cpu.cfs_quota_us for gluster_cgroup."</div><div class='add'>+echo ${quota_value} &gt; ${LOC}/${cgroup_name}/cpu.cfs_quota_us</div><div class='add'>+</div><div class='add'>+if ps -T -p ${daemon_pid} | grep gluster &gt; /dev/null; then</div><div class='add'>+  for thid in `ps -T -p ${daemon_pid} | grep -v SPID | awk -F " " '{print $2}'`;</div><div class='add'>+    do</div><div class='add'>+      echo ${thid} &gt; ${LOC}/${cgroup_name}/tasks ;</div><div class='add'>+    done</div><div class='add'>+  if cat /proc/${daemon_pid}/cgroup | grep -w ${cgroup_name} &gt; /dev/null; then</div><div class='add'>+    echo "Tasks are attached successfully specific to ${daemon_pid} to ${cgroup_name}."</div><div class='add'>+  else</div><div class='add'>+    echo "Tasks are not attached successfully."</div><div class='add'>+  fi</div><div class='add'>+fi</div><div class='head'>diff --git a/extras/control-mem.sh b/extras/control-mem.sh<br/>new file mode 100755<br/>index 00000000000..91b36f8107a<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/extras/control-mem.sh?id=d1d7a6f35c816822fab51c820e25023863c239c1'>extras/control-mem.sh</a></div><div class='hunk'>@@ -0,0 +1,128 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+USAGE="This commands provides a utility to control MEMORY utilization for any</div><div class='add'>+gluster daemon.In this, we use cgroup framework to configure MEMORY limit for</div><div class='add'>+a process. Before running this script, make sure that daemon is running.Every</div><div class='add'>+time daemon restarts, it is required to rerun this command to set memory limit</div><div class='add'>+(in bytes) on new daemon process id.User can enter any value between 100</div><div class='add'>+(in Mega bytes) to 8000000000000 for Memory limit in Mega bytes.</div><div class='add'>+Memory limit value is depends on how much maximum memory user wants to restrict</div><div class='add'>+for specific daemon process.If a process will try to consume memore more than</div><div class='add'>+configured value then cgroup will hang/sleep this task and to resume the task</div><div class='add'>+rerun the script with new increase memory limit value ."</div><div class='add'>+</div><div class='add'>+if [  $# -ge 1 ]; then</div><div class='add'>+  case $1 in</div><div class='add'>+    -h|--help) echo " " "$USAGE" | sed -r -e 's/^[ ]+//g'</div><div class='add'>+               exit 0;</div><div class='add'>+               ;;</div><div class='add'>+    *) echo "Please Provide correct input for script."</div><div class='add'>+       echo "For help correct options are -h of --help."</div><div class='add'>+       exit 1;</div><div class='add'>+               ;;</div><div class='add'>+  esac</div><div class='add'>+fi</div><div class='add'>+</div><div class='add'>+DIR_EXIST=0</div><div class='add'>+LOC="/sys/fs/cgroup/memory/system.slice/glusterd.service"</div><div class='add'>+echo "Enter Any gluster daemon pid for that you want to control MEMORY."</div><div class='add'>+read daemon_pid</div><div class='add'>+</div><div class='add'>+if expr ${daemon_pid} + 0 &gt; /dev/null 2&gt;&amp;1 ;then</div><div class='add'>+  CHECK_PID=$(pgrep -f gluster | grep ${daemon_pid})</div><div class='add'>+  if [ -z "${CHECK_PID}" ]; then</div><div class='add'>+    echo "No daemon is running or pid ${daemon_pid} does not match."</div><div class='add'>+    echo "with running gluster processes."</div><div class='add'>+    exit 1</div><div class='add'>+  fi</div><div class='add'>+else</div><div class='add'>+  echo "Entered daemon_pid is not numeric so Rerun the script."</div><div class='add'>+  exit 1</div><div class='add'>+fi</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+if [ -f ${LOC}/tasks ]; then</div><div class='add'>+  CHECK_CGROUP=$(grep ${daemon_pid} ${LOC}/tasks)</div><div class='add'>+  if [ ${CHECK_CGROUP} ] ;then</div><div class='add'>+    echo "pid ${daemon_pid} is attached with default glusterd.service cgroup."</div><div class='add'>+  fi</div><div class='add'>+fi</div><div class='add'>+</div><div class='add'>+cgroup_name=cgroup_gluster_${daemon_pid}</div><div class='add'>+if [ -f ${LOC}/${cgroup_name}/tasks ];then</div><div class='add'>+  CHECK_CGROUP=$(grep ${daemon_pid} ${LOC}/${cgroup_name}/tasks)</div><div class='add'>+  if [ ${CHECK_CGROUP} ]; then</div><div class='add'>+    val=`cat ${LOC}/${cgroup_name}/memory.limit_in_bytes`</div><div class='add'>+    mval=$((val / 1024 / 1024))</div><div class='add'>+    echo "pid ${daemon_pid} is already attached ${cgroup_name} with mem value ${mval}."</div><div class='add'>+    echo "Press n if you don't want to reassign ${daemon_pid} with new mem value."</div><div class='add'>+    DIR_EXIST=1</div><div class='add'>+  else</div><div class='add'>+    echo "pid ${daemon_pid} is not attached with ${cgroup_name}."</div><div class='add'>+  fi</div><div class='add'>+fi</div><div class='add'>+</div><div class='add'>+read -p "If you want to continue the script to attach daeomon with new cgroup. Press (y/n)?" choice</div><div class='add'>+case "$choice" in</div><div class='add'>+  y|Y ) echo "yes";;</div><div class='add'>+  n|N ) echo "no";exit;;</div><div class='add'>+  * ) echo "invalid";exit;;</div><div class='add'>+esac</div><div class='add'>+</div><div class='add'>+systemctl set-property glusterd.service CPUShares=1024</div><div class='add'>+</div><div class='add'>+if [ ${DIR_EXIST} -eq 0 ];then</div><div class='add'>+  echo "Creating child cgroup directory '${cgroup_name} cgroup' for glusterd.service."</div><div class='add'>+  mkdir -p ${LOC}/${cgroup_name}</div><div class='add'>+  if [ ! -f ${LOC}/${cgroup_name}/tasks ];then</div><div class='add'>+    echo "Not able to create ${LOC}/${cgroup_name} directory so exit."</div><div class='add'>+    exit 1</div><div class='add'>+  fi</div><div class='add'>+fi</div><div class='add'>+</div><div class='add'>+echo "Enter Memory value in Mega bytes [100,8000000000000]:  "</div><div class='add'>+</div><div class='add'>+read mem_value</div><div class='add'>+if expr ${mem_value} + 0 &gt; /dev/null 2&gt;&amp;1 ;then</div><div class='add'>+  if [ ${mem_value} -lt 100 ] || [ ${mem_value} -gt 8000000000000 ]; then</div><div class='add'>+    echo "Entered memory value is not correct,it should be in the range ."</div><div class='add'>+    echo "100-8000000000000, Rerun the script with correct value ."</div><div class='add'>+    exit 1</div><div class='add'>+  else</div><div class='add'>+    echo "Entered memory limit value is ${mem_value}."</div><div class='add'>+  fi</div><div class='add'>+else</div><div class='add'>+  echo "Entered memory value is not numeric so Rerun the script."</div><div class='add'>+  exit 1</div><div class='add'>+fi</div><div class='add'>+</div><div class='add'>+mem_value=$(($mem_value * 1024 * 1024))</div><div class='add'>+if [ ${DIR_EXIST} -eq 0 ];then</div><div class='add'>+  echo "Setting ${mem_value} to memory.limit_in_bytes for ${LOC}/${cgroup_name}."</div><div class='add'>+  echo ${mem_value} &gt; ${LOC}/${cgroup_name}/memory.limit_in_bytes</div><div class='add'>+  #Set memory value to memory.memsw.limit_in_bytes</div><div class='add'>+  echo ${mem_value} &gt; ${LOC}/${cgroup_name}/memory.memsw.limit_in_bytes</div><div class='add'>+  # disable oom_control so that kernel will not send kill signal to the</div><div class='add'>+  # task once limit has reached</div><div class='add'>+  echo 1 &gt; ${LOC}/${cgroup_name}/memory.oom_control</div><div class='add'>+else</div><div class='add'>+  #Increase mem_value to memory.memsw.limit_in_bytes</div><div class='add'>+  echo ${mem_value} &gt; ${LOC}/${cgroup_name}/memory.memsw.limit_in_bytes</div><div class='add'>+  echo "Increase ${mem_value} to memory.limit_in_bytes for ${LOC}/${cgroup_name}."</div><div class='add'>+  echo ${mem_value} &gt; ${LOC}/${cgroup_name}/memory.limit_in_bytes</div><div class='add'>+  # disable oom_control so that kernel will not send kill signal to the</div><div class='add'>+  # task once limit has reached</div><div class='add'>+  echo 1 &gt; ${LOC}/${cgroup_name}/memory.oom_control</div><div class='add'>+fi</div><div class='add'>+</div><div class='add'>+if ps -T -p ${daemon_pid} | grep gluster &gt; /dev/null; then</div><div class='add'>+  for thid in `ps -T -p ${daemon_pid} | grep -v SPID | awk -F " " '{print $2}'`;</div><div class='add'>+    do</div><div class='add'>+      echo ${thid} &gt; ${LOC}/${cgroup_name}/tasks ;</div><div class='add'>+    done</div><div class='add'>+  if cat /proc/${daemon_pid}/cgroup | grep -iw ${cgroup_name} &gt; /dev/null; then</div><div class='add'>+    echo "Tasks are attached successfully specific to ${daemon_pid} to ${cgroup_name}."</div><div class='add'>+  else</div><div class='add'>+    echo "Tasks are not attached successfully."</div><div class='add'>+  fi</div><div class='add'>+fi</div><div class='head'>diff --git a/extras/create_new_xlator/README.md b/extras/create_new_xlator/README.md<br/>new file mode 100644<br/>index 00000000000..fdc1ba00812<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/extras/create_new_xlator/README.md?id=d1d7a6f35c816822fab51c820e25023863c239c1'>extras/create_new_xlator/README.md</a></div><div class='hunk'>@@ -0,0 +1,24 @@</div><div class='add'>+####This document explains how to create a template for your new xlator.</div><div class='add'>+</div><div class='add'>+`$ python ./generate_xlator.py &lt;XLATOR_DIRECTORY&gt; &lt;XLATOR_NAME&gt; &lt;FOP_PREFIX&gt;`</div><div class='add'>+        * XLATOR_DIRECTORY: Directory path where the new xlator folder will reside</div><div class='add'>+        * XLATOR_NAME: Name of the xlator you wish to create</div><div class='add'>+        * FOP_PREFIX: This is the fop prefix that you wish to prefix every fop definition in your xlator, fop prefix is generally different than xlator name, if the xlator name is too long.</div><div class='add'>+</div><div class='add'>+Eg: `python ./generate_xlator.py /home/u1/glusterfs/xlators/features compression cmpr`</div><div class='add'>+This command will create the following files with some initial contents like copyright, fops definition etc.</div><div class='add'>+Note that there shouldn't be a "/" specified at the end of the &lt;XLATOR_DIRECTORY&gt;</div><div class='add'>+        `* /home/u1/glusterfs/xlators/features/compression/Makefile.am</div><div class='add'>+        * /home/u1/glusterfs/xlators/features/compression/src/Makefile.am</div><div class='add'>+        * /home/u1/glusterfs/xlators/features/compression/src/compression.c</div><div class='add'>+        * /home/u1/glusterfs/xlators/features/compression/src/compression.h</div><div class='add'>+        * /home/u1/glusterfs/xlators/features/compression/src/compression-mem-types.h</div><div class='add'>+        * /home/u1/glusterfs/xlators/features/compression/src/compression-messages.h`</div><div class='add'>+</div><div class='add'>+By default all the fops and functions are generated, if you wish to not implement certain fops and functions, comment those lines (by adding '#' at the start of the line) in libglusterfs/src/generate_xlator.py</div><div class='add'>+</div><div class='add'>+Few other manual steps required to get the new xlator completely functional:</div><div class='add'>+* Change configure.ac</div><div class='add'>+* Change `&lt;XLATOR_DIRECTORY&gt;/Makefile.am` to include the new xlator directory.</div><div class='add'>+  Eg:  `/home/u1/glusterfs/xlators/features/Makefile.am`</div><div class='add'>+* Change vol file or glusterd volgen to include the new xlator in volfile</div><div class='head'>diff --git a/extras/create_new_xlator/generate_xlator.py b/extras/create_new_xlator/generate_xlator.py<br/>new file mode 100755<br/>index 00000000000..983868c04db<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/extras/create_new_xlator/generate_xlator.py?id=d1d7a6f35c816822fab51c820e25023863c239c1'>extras/create_new_xlator/generate_xlator.py</a></div><div class='hunk'>@@ -0,0 +1,208 @@</div><div class='add'>+#!/usr/bin/python3</div><div class='add'>+</div><div class='add'>+from __future__ import print_function</div><div class='add'>+import os</div><div class='add'>+import re</div><div class='add'>+import sys</div><div class='add'>+import string</div><div class='add'>+import time</div><div class='add'>+path = os.path.abspath(os.path.dirname(__file__)) + '/../../libglusterfs/src'</div><div class='add'>+sys.path.append(path)</div><div class='add'>+from generator import ops, xlator_cbks, xlator_dumpops</div><div class='add'>+</div><div class='add'>+MAKEFILE_FMT = """</div><div class='add'>+xlator_LTLIBRARIES = @XL_NAME@.la</div><div class='add'>+xlatordir = $(libdir)/glusterfs/$(PACKAGE_VERSION)/xlator/@XL_TYPE@</div><div class='add'>+@XL_NAME_NO_HYPHEN@_la_LDFLAGS = -module $(GF_XLATOR_DEFAULT_LDFLAGS)</div><div class='add'>+@XL_NAME_NO_HYPHEN@_la_SOURCES = @XL_NAME@.c</div><div class='add'>+@XL_NAME_NO_HYPHEN@_la_LIBADD = $(top_builddir)/libglusterfs/src/libglusterfs.la</div><div class='add'>+noinst_HEADERS = @XL_NAME@.h @XL_NAME@-mem-types.h @XL_NAME@-messages.h</div><div class='add'>+AM_CPPFLAGS = $(GF_CPPFLAGS) -I$(top_srcdir)/libglusterfs/src \</div><div class='add'>+           -I$(top_srcdir)/rpc/xdr/src -I$(top_builddir)/rpc/xdr/src</div><div class='add'>+AM_CFLAGS = -Wall -fno-strict-aliasing $(GF_CFLAGS)</div><div class='add'>+CLEANFILES =</div><div class='add'>+"""</div><div class='add'>+</div><div class='add'>+fop_subs = {}</div><div class='add'>+cbk_subs = {}</div><div class='add'>+fn_subs = {}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def get_error_arg(type_str):</div><div class='add'>+        if type_str.find(" *") != -1:</div><div class='add'>+                return "NULL"</div><div class='add'>+        return "-1"</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def get_param(names, types):</div><div class='add'>+        # Convert two separate tuples to one of (name, type) sub-tuples.</div><div class='add'>+        as_tuples = list(zip(types, names))</div><div class='add'>+        # Convert each sub-tuple into a "type name" string.</div><div class='add'>+        as_strings = [' '.join(item) for item in as_tuples]</div><div class='add'>+        # Join all of those into one big string.</div><div class='add'>+        return ',\n\t'.join(as_strings)</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def generate(tmpl, name, table):</div><div class='add'>+        w_arg_names = [a[1] for a in table[name] if a[0] == 'fop-arg']</div><div class='add'>+        w_arg_types = [a[2] for a in table[name] if a[0] == 'fop-arg']</div><div class='add'>+        u_arg_names = [a[1] for a in table[name] if a[0] == 'cbk-arg']</div><div class='add'>+        u_arg_types = [a[2] for a in table[name] if a[0] == 'cbk-arg']</div><div class='add'>+        fn_arg_names = [a[1] for a in table[name] if a[0] == 'fn-arg']</div><div class='add'>+        fn_arg_types = [a[2] for a in table[name] if a[0] == 'fn-arg']</div><div class='add'>+        ret_type = [a[1] for a in table[name] if a[0] == 'ret-val']</div><div class='add'>+        ret_var = [a[2] for a in table[name] if a[0] == 'ret-val']</div><div class='add'>+</div><div class='add'>+        sdict = {}</div><div class='add'>+        #Parameters are (t1, var1), (t2, var2)...</div><div class='add'>+        #Args are (var1, var2,...)</div><div class='add'>+        sdict["@WIND_ARGS@"] = ', '.join(w_arg_names)</div><div class='add'>+        sdict["@UNWIND_ARGS@"] = ', '.join(u_arg_names)</div><div class='add'>+        sdict["@ERROR_ARGS@"] = ', '.join(list(map(get_error_arg, u_arg_types)))</div><div class='add'>+        sdict["@WIND_PARAMS@"] = get_param(w_arg_names, w_arg_types)</div><div class='add'>+        sdict["@UNWIND_PARAMS@"] = get_param(u_arg_names, u_arg_types)</div><div class='add'>+        sdict["@FUNC_PARAMS@"] = get_param(fn_arg_names, fn_arg_types)</div><div class='add'>+        sdict["@NAME@"] = name</div><div class='add'>+        sdict["@FOP_PREFIX@"] = fop_prefix</div><div class='add'>+        sdict["@RET_TYPE@"] = ''.join(ret_type)</div><div class='add'>+        sdict["@RET_VAR@"] = ''.join(ret_var)</div><div class='add'>+</div><div class='add'>+        for old, new in sdict.items():</div><div class='add'>+                tmpl = tmpl.replace(old, new)</div><div class='add'>+        # TBD: reindent/reformat the result for maximum readability.</div><div class='add'>+        return tmpl</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def gen_xlator():</div><div class='add'>+        xl = open(src_dir_path+"/"+xl_name+".c", 'w+')</div><div class='add'>+</div><div class='add'>+        print(COPYRIGHT, file=xl)</div><div class='add'>+        print(fragments["INCLUDE_IN_SRC_FILE"].replace("@XL_NAME@",</div><div class='add'>+                                                              xl_name), file=xl)</div><div class='add'>+</div><div class='add'>+        #Generate cbks and fops</div><div class='add'>+        for fop in ops:</div><div class='add'>+                print(generate(fragments["CBK_TEMPLATE"], fop, ops), file=xl)</div><div class='add'>+                print(generate(fragments["FOP_TEMPLATE"], fop, ops), file=xl)</div><div class='add'>+</div><div class='add'>+        for cbk in xlator_cbks:</div><div class='add'>+                print(generate(fragments["FUNC_TEMPLATE"], cbk,</div><div class='add'>+                                      xlator_cbks), file=xl)</div><div class='add'>+</div><div class='add'>+        for dops in xlator_dumpops:</div><div class='add'>+                print(generate(fragments["FUNC_TEMPLATE"], dops,</div><div class='add'>+                                      xlator_dumpops), file=xl)</div><div class='add'>+</div><div class='add'>+        #Generate fop table</div><div class='add'>+        print("struct xlator_fops fops = {", file=xl)</div><div class='add'>+        for fop in ops:</div><div class='add'>+                print("        .{0:20} = {1}_{2},".format(fop, fop_prefix, fop), file=xl)</div><div class='add'>+        print("};", file=xl)</div><div class='add'>+</div><div class='add'>+        #Generate xlator_cbks table</div><div class='add'>+        print("struct xlator_cbks cbks = {", file=xl)</div><div class='add'>+        for cbk in xlator_cbks:</div><div class='add'>+                print("        .{0:20} = {1}_{2},".format(cbk, fop_prefix, cbk), file=xl)</div><div class='add'>+        print("};", file=xl)</div><div class='add'>+</div><div class='add'>+        #Generate xlator_dumpops table</div><div class='add'>+        print("struct xlator_dumpops dumpops = {", file=xl)</div><div class='add'>+        for dops in xlator_dumpops:</div><div class='add'>+                print("        .{0:20} = {1}_{2},".format(dops, fop_prefix, dops), file=xl)</div><div class='add'>+        print("};", file=xl)</div><div class='add'>+</div><div class='add'>+        xlator_methods = fragments["XLATOR_METHODS"].replace("@XL_NAME@", xl_name)</div><div class='add'>+        xlator_methods = xlator_methods.replace("@FOP_PREFIX@", fop_prefix)</div><div class='add'>+        print(xlator_methods, file=xl)</div><div class='add'>+</div><div class='add'>+        xl.close()</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def create_dir_struct():</div><div class='add'>+        if not os.path.exists(dir_path+"/src"):</div><div class='add'>+                os.makedirs(dir_path+"/src")</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def gen_header_files():</div><div class='add'>+        upname = xl_name_no_hyphen.upper()</div><div class='add'>+        h = open(src_dir_path+"/"+xl_name+".h", 'w+')</div><div class='add'>+        print(COPYRIGHT, file=h)</div><div class='add'>+        txt = fragments["HEADER_FMT"].replace("@HFL_NAME@", upname)</div><div class='add'>+        txt = txt.replace("@XL_NAME@", xl_name)</div><div class='add'>+        print(txt, file=h)</div><div class='add'>+        h.close()</div><div class='add'>+</div><div class='add'>+        h = open(src_dir_path+"/"+xl_name+"-mem-types.h", 'w+')</div><div class='add'>+        print(COPYRIGHT, file=h)</div><div class='add'>+        txt = fragments["MEM_HEADER_FMT"].replace("@HFL_NAME@", upname+"_MEM_TYPES")</div><div class='add'>+        txt = txt.replace("@FOP_PREFIX@", fop_prefix)</div><div class='add'>+        print(txt, file=h)</div><div class='add'>+        h.close()</div><div class='add'>+</div><div class='add'>+        h = open(src_dir_path+"/"+xl_name+"-messages.h", 'w+')</div><div class='add'>+        print(COPYRIGHT, file=h)</div><div class='add'>+        txt = fragments["MSG_HEADER_FMT"].replace("@HFL_NAME@", upname+"_MESSAGES")</div><div class='add'>+        txt = txt.replace("@FOP_PREFIX@", fop_prefix.upper())</div><div class='add'>+        print(txt, file=h)</div><div class='add'>+        h.close()</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def gen_makefiles():</div><div class='add'>+        m = open(dir_path+"/Makefile.am", 'w+')</div><div class='add'>+        print("SUBDIRS = src\n\nCLEANFILES =", file=m)</div><div class='add'>+        m.close()</div><div class='add'>+</div><div class='add'>+        m = open(src_dir_path+"/Makefile.am", 'w+')</div><div class='add'>+        txt = MAKEFILE_FMT.replace("@XL_NAME@", xl_name)</div><div class='add'>+        txt = txt.replace("@XL_NAME_NO_HYPHEN@", xl_name_no_hyphen)</div><div class='add'>+        txt = txt.replace("@XL_TYPE@", xlator_type)</div><div class='add'>+        print(txt, file=m)</div><div class='add'>+        m.close()</div><div class='add'>+</div><div class='add'>+def get_copyright ():</div><div class='add'>+        return fragments["CP"].replace("@CURRENT_YEAR@",</div><div class='add'>+                                       time.strftime("%Y"))</div><div class='add'>+</div><div class='add'>+def load_fragments ():</div><div class='add'>+        pragma_re = re.compile('pragma fragment (.*)')</div><div class='add'>+        cur_symbol = None</div><div class='add'>+        cur_value = ""</div><div class='add'>+        result = {}</div><div class='add'>+        basepath = os.path.abspath(os.path.dirname(__file__))</div><div class='add'>+        fragpath = basepath + "/new-xlator.c.tmpl"</div><div class='add'>+        for line in open(fragpath, "r").readlines():</div><div class='add'>+                m = pragma_re.search(line)</div><div class='add'>+                if m:</div><div class='add'>+                        if cur_symbol:</div><div class='add'>+                                result[cur_symbol] = cur_value</div><div class='add'>+                        cur_symbol = m.group(1)</div><div class='add'>+                        cur_value = ""</div><div class='add'>+                else:</div><div class='add'>+                        cur_value += line</div><div class='add'>+        if cur_symbol:</div><div class='add'>+                result[cur_symbol] = cur_value</div><div class='add'>+        return result</div><div class='add'>+</div><div class='add'>+if __name__ == '__main__':</div><div class='add'>+</div><div class='add'>+        if len(sys.argv) &lt; 3:</div><div class='add'>+                print("USAGE: ./gen_xlator &lt;XLATOR_DIR&gt; &lt;XLATOR_NAME&gt; &lt;FOP_PREFIX&gt;")</div><div class='add'>+                sys.exit(0)</div><div class='add'>+</div><div class='add'>+        xl_name = sys.argv[2]</div><div class='add'>+        xl_name_no_hyphen = xl_name.replace("-", "_")</div><div class='add'>+        if sys.argv[1].endswith('/'):</div><div class='add'>+                dir_path = sys.argv[1] + xl_name</div><div class='add'>+        else:</div><div class='add'>+                dir_path = sys.argv[1] + "/" + xl_name</div><div class='add'>+        xlator_type = os.path.basename(sys.argv[1])</div><div class='add'>+        fop_prefix = sys.argv[3]</div><div class='add'>+        src_dir_path = dir_path + "/src"</div><div class='add'>+</div><div class='add'>+        fragments = load_fragments()</div><div class='add'>+</div><div class='add'>+        COPYRIGHT = get_copyright()</div><div class='add'>+        create_dir_struct()</div><div class='add'>+        gen_xlator()</div><div class='add'>+        gen_header_files()</div><div class='add'>+        gen_makefiles()</div><div class='head'>diff --git a/extras/create_new_xlator/new-xlator.c.tmpl b/extras/create_new_xlator/new-xlator.c.tmpl<br/>new file mode 100644<br/>index 00000000000..fe9735bfcf1<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/extras/create_new_xlator/new-xlator.c.tmpl?id=d1d7a6f35c816822fab51c820e25023863c239c1'>extras/create_new_xlator/new-xlator.c.tmpl</a></div><div class='hunk'>@@ -0,0 +1,151 @@</div><div class='add'>+#pragma fragment CBK_TEMPLATE</div><div class='add'>+int32_t @FOP_PREFIX@_@NAME@_cbk(call_frame_t *frame, void *cookie, xlator_t *this, int32_t op_ret,</div><div class='add'>+             int32_t op_errno, @UNWIND_PARAMS@)</div><div class='add'>+{</div><div class='add'>+    STACK_UNWIND_STRICT(@NAME@, frame, op_ret, op_errno, @UNWIND_ARGS@);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#pragma fragment COMMENT</div><div class='add'>+If you are generating the leaf xlators, remove the STACK_WIND and replace the</div><div class='add'>+    @ERROR_ARGS@ to @UNWIND_ARGS@ if necessary</div><div class='add'>+</div><div class='add'>+#pragma fragment FOP_TEMPLATE</div><div class='add'>+        int32_t @FOP_PREFIX@_@NAME@(call_frame_t *frame, xlator_t *this, @WIND_PARAMS@)</div><div class='add'>+{</div><div class='add'>+    STACK_WIND(frame, @FOP_PREFIX@_@NAME@_cbk, FIRST_CHILD(this),</div><div class='add'>+               FIRST_CHILD(this)-&gt;fops-&gt;@NAME@, @WIND_ARGS@);</div><div class='add'>+    return 0;</div><div class='add'>+err:</div><div class='add'>+    STACK_UNWIND_STRICT(@NAME@, frame, -1, errno, @ERROR_ARGS@);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#pragma fragment FUNC_TEMPLATE</div><div class='add'>+@RET_TYPE@ @FOP_PREFIX@_@NAME@(@FUNC_PARAMS@)</div><div class='add'>+{</div><div class='add'>+    return @RET_VAR@;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#pragma fragment CP</div><div class='add'>+/*</div><div class='add'>+ *   Copyright (c) @CURRENT_YEAR@ Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+ *   This file is part of GlusterFS.</div><div class='add'>+ *</div><div class='add'>+ *   This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+ *   General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+ *   later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+ *   cases as published by the Free Software Foundation.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+#pragma fragment INCLUDE_IN_SRC_FILE</div><div class='add'>+#include "@XL_NAME@.h"</div><div class='add'>+</div><div class='add'>+#pragma fragment XLATOR_METHODS</div><div class='add'>+</div><div class='add'>+static int32_t @FOP_PREFIX@_init(xlator_t *this)</div><div class='add'>+{</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void @FOP_PREFIX@_fini(xlator_t *this)</div><div class='add'>+{</div><div class='add'>+    return;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int32_t @FOP_PREFIX@_reconfigure(xlator_t *this, dict_t *dict)</div><div class='add'>+{</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int @FOP_PREFIX@_notify(xlator_t *this, int event, void *data, ...)</div><div class='add'>+{</div><div class='add'>+    return default_notify(this, event, data);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int32_t @FOP_PREFIX@_mem_acct_init(xlator_t *this)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    ret = xlator_mem_acct_init(this, gf_@FOP_PREFIX@_mt_end + 1);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int32_t @FOP_PREFIX@_dump_metrics(xlator_t *this, int fd)</div><div class='add'>+{</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+struct volume_options @FOP_PREFIX@_options[] = {</div><div class='add'>+    /*{ .key  = {""},</div><div class='add'>+      .type = GF_OPTION_TYPE_BOOL,</div><div class='add'>+      .default_value = "",</div><div class='add'>+      .op_version = {GD_OP_VERSION_},</div><div class='add'>+      .flags = OPT_FLAG_SETTABLE | OPT_FLAG_DOC | OPT_FLAG_CLIENT_OPT,</div><div class='add'>+      .tags = {""},</div><div class='add'>+      .description = "",</div><div class='add'>+      .category = GF_EXPERIMENTAL,</div><div class='add'>+    },</div><div class='add'>+    { .key = {NULL} },</div><div class='add'>+    */</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+xlator_api_t xlator_api = {</div><div class='add'>+    .init = @FOP_PREFIX@_init,</div><div class='add'>+    .fini = @FOP_PREFIX@_fini,</div><div class='add'>+    .notify = @FOP_PREFIX@_notify,</div><div class='add'>+    .reconfigure = @FOP_PREFIX@_reconfigure,</div><div class='add'>+    .mem_acct_init = @FOP_PREFIX@_mem_acct_init,</div><div class='add'>+    .dump_metrics = @FOP_PREFIX@_dump_metrics,</div><div class='add'>+    .op_version = {GD_OP_VERSION_},</div><div class='add'>+    .dumpops = &amp;@FOP_PREFIX@_dumpops,</div><div class='add'>+    .fops = &amp;@FOP_PREFIX@_fops,</div><div class='add'>+    .cbks = &amp;@FOP_PREFIX @_cbks,</div><div class='add'>+    .options = @FOP_PREFIX@_options,</div><div class='add'>+    .identifier = "@XL_NAME@",</div><div class='add'>+    .category = GF_EXPERIMENTAL,</div><div class='add'>+};</div><div class='add'>+#pragma fragment HEADER_FMT</div><div class='add'>+#ifndef __ @HFL_NAME@_H__</div><div class='add'>+#define __ @HFL_NAME@_H__</div><div class='add'>+</div><div class='add'>+#include "@XL_NAME@-mem-types.h"</div><div class='add'>+#include "@XL_NAME@-messages.h"</div><div class='add'>+#include &lt;glusterfs/glusterfs.h&gt;</div><div class='add'>+#include &lt;glusterfs/xlator.h&gt;</div><div class='add'>+#include &lt;glusterfs/defaults.h&gt;</div><div class='add'>+</div><div class='add'>+#endif /* __@HFL_NAME@_H__ */</div><div class='add'>+</div><div class='add'>+#pragma fragment MEM_HEADER_FMT</div><div class='add'>+#ifndef __ @HFL_NAME@_H__</div><div class='add'>+#define __ @HFL_NAME@_H__</div><div class='add'>+</div><div class='add'>+#include &lt;glusterfs/mem-types.h&gt;</div><div class='add'>+</div><div class='add'>+enum gf_mdc_mem_types_ {</div><div class='add'>+    gf_@FOP_PREFIX@_mt_ = gf_common_mt_end + 1,</div><div class='add'>+    gf_@FOP_PREFIX@_mt_end</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+#endif /* __@HFL_NAME@_H__ */</div><div class='add'>+</div><div class='add'>+#pragma fragment MSG_HEADER_FMT</div><div class='add'>+#ifndef __@HFL_NAME@_H__</div><div class='add'>+#define __@HFL_NAME@_H__</div><div class='add'>+</div><div class='add'>+#include &lt;glusterfs/glfs-message-id.h&gt;</div><div class='add'>+</div><div class='add'>+/* To add new message IDs, append new identifiers at the end of the list.</div><div class='add'>+ *</div><div class='add'>+ * Never remove a message ID. If it's not used anymore, you can rename it or</div><div class='add'>+ * leave it as it is, but not delete it. This is to prevent reutilization of</div><div class='add'>+ * IDs by other messages.</div><div class='add'>+ *</div><div class='add'>+ * The component name must match one of the entries defined in</div><div class='add'>+ * glfs-message-id.h.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+GLFS_MSGID(@FOP_PREFIX@, @FOP_PREFIX@_MSG_NO_MEMORY);</div><div class='add'>+</div><div class='add'>+#endif /* __@HFL_NAME@_H__ */</div><div class='head'>diff --git a/extras/devel-tools/devel-vagrant/Vagrantfile b/extras/devel-tools/devel-vagrant/Vagrantfile<br/>new file mode 100644<br/>index 00000000000..78dc29bdc68<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/extras/devel-tools/devel-vagrant/Vagrantfile?id=d1d7a6f35c816822fab51c820e25023863c239c1'>extras/devel-tools/devel-vagrant/Vagrantfile</a></div><div class='hunk'>@@ -0,0 +1,165 @@</div><div class='add'>+# -*- mode: ruby -*-</div><div class='add'>+# vi: set ft=ruby :</div><div class='add'>+#</div><div class='add'>+# Author: Rajesh Joseph (rjoseph@redhat.com)</div><div class='add'>+# Author: Christopher Blum (cblum@redhat.com)</div><div class='add'>+#</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+#Variables</div><div class='add'>+box_name = "gluster-dev-fedora"</div><div class='add'>+box_url = "http://download.gluster.org/pub/gluster/glusterfs/vagrant/gluster-dev-fedora/boxes/gluster-dev-fedora.json"</div><div class='add'>+node_count = 0</div><div class='add'>+disk_count = -1</div><div class='add'>+node_name = "Node"</div><div class='add'>+ipbase="192.168.99."</div><div class='add'>+source_path = "/source/glusterfs"</div><div class='add'>+target_path = "/mnt/src"</div><div class='add'>+</div><div class='add'>+if ARGV[0] == "up"</div><div class='add'>+        environment = open('vagrant_env.conf', 'w')</div><div class='add'>+</div><div class='add'>+        print "\n\e[1;37mEnter Node (or VM) Count? Default: 1 \e[32m"</div><div class='add'>+        while node_count &lt; 1 or node_count &gt; 99</div><div class='add'>+                node_count = $stdin.gets.strip.to_i</div><div class='add'>+                if node_count == 0 # The user pressed enter without input or we cannot parse the input to a number</div><div class='add'>+                        node_count = 1</div><div class='add'>+                elsif node_count &lt; 1</div><div class='add'>+                        print "\e[31mWe need at least 1 VM ;) Try again \e[32m"</div><div class='add'>+                elsif node_count &gt; 99</div><div class='add'>+                        print "\e[31mWe don't support more than 99 VMs - Try again \e[32m"</div><div class='add'>+                end</div><div class='add'>+        end</div><div class='add'>+</div><div class='add'>+        print "\e[1;37mEnter per Node Disc (Brick) Count? Default: 2 \e[32m"</div><div class='add'>+</div><div class='add'>+        while disk_count &lt; 1</div><div class='add'>+                disk_count = $stdin.gets.strip.to_i</div><div class='add'>+                if disk_count == 0 # The user pressed enter without input or we cannot parse the input to a number</div><div class='add'>+                        disk_count = 2</div><div class='add'>+                elsif disk_count &lt; 1</div><div class='add'>+                        print "\e[31mWe need at least 1 disk ;) Try again \e[32m"</div><div class='add'>+                end</div><div class='add'>+        end</div><div class='add'>+</div><div class='add'>+        print "\e[1;37mEnter GlusterFS source location? Default: \"#{source_path}\" : \e[32m"</div><div class='add'>+        tmploc = $stdin.gets.strip.to_s</div><div class='add'>+        if tmploc != ""</div><div class='add'>+                source_path = "#{tmploc}"</div><div class='add'>+        end</div><div class='add'>+</div><div class='add'>+        environment.puts("# BEWARE: Do NOT modify ANY settings in here or your vagrant environment will be messed up")</div><div class='add'>+        environment.puts(node_count.to_s)</div><div class='add'>+        environment.puts(disk_count.to_s)</div><div class='add'>+        environment.puts(source_path)</div><div class='add'>+</div><div class='add'>+        print "\e[32m\nOK I will provision #{node_count} VMs for you and each one will have #{disk_count} disks for bricks\e[37m\n\n"</div><div class='add'>+        system "sleep 1"</div><div class='add'>+else # So that we destroy and can connect to all VMs...</div><div class='add'>+        environment = open('vagrant_env.conf', 'r')</div><div class='add'>+</div><div class='add'>+        environment.readline # Skip the comment on top</div><div class='add'>+        node_count = environment.readline.to_i</div><div class='add'>+        disk_count = environment.readline.to_i</div><div class='add'>+        source_path = environment.readline.gsub(/\s+/, "")</div><div class='add'>+</div><div class='add'>+        if ARGV[0] != "ssh-config"</div><div class='add'>+                puts "Detected settings from previous vagrant up:"</div><div class='add'>+                puts "  We deployed #{node_count} VMs with each #{disk_count} disks"</div><div class='add'>+                puts ""</div><div class='add'>+        end</div><div class='add'>+end</div><div class='add'>+</div><div class='add'>+environment.close</div><div class='add'>+</div><div class='add'>+$ansivar = Hash.new{ |hash,key| hash[key] = [] }</div><div class='add'>+$devnamecreated = false</div><div class='add'>+</div><div class='add'>+#</div><div class='add'>+# Function to create and attach disks</div><div class='add'>+#</div><div class='add'>+def attachDisks(numDisk, provider)</div><div class='add'>+        suffix = "bcdefghijklmn".split("")</div><div class='add'>+        for i in 1..numDisk.to_i</div><div class='add'>+                devname = "vd" + (suffix[i-1]).to_s</div><div class='add'>+                if $devnamecreated == false</div><div class='add'>+                        $ansivar["device"].push "#{devname}"</div><div class='add'>+                end</div><div class='add'>+                provider.storage :file,</div><div class='add'>+                        :size           =&gt; '1G',</div><div class='add'>+                        :device         =&gt; "vd" + (suffix[i-1]).to_s,</div><div class='add'>+                        :type           =&gt; "qcow2",</div><div class='add'>+                        :bus            =&gt; "virtio",</div><div class='add'>+                        :cache          =&gt; "default"</div><div class='add'>+        end</div><div class='add'>+        $devnamecreated = true</div><div class='add'>+end</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+$ansivar["src_path"].push "#{source_path}"</div><div class='add'>+$ansivar["trg_path"].push "#{target_path}"</div><div class='add'>+</div><div class='add'>+groups = Hash.new{ |hash,key| hash[key] = [] }</div><div class='add'>+</div><div class='add'>+groups["origin"].push "#{node_name}1"</div><div class='add'>+groups["all"].push "#{node_name}1"</div><div class='add'>+</div><div class='add'>+(2..node_count).each do |num|</div><div class='add'>+        $ansivar["peer_nodes"].push "#{node_name}#{num}"</div><div class='add'>+        groups["all"].push "#{node_name}#{num}"</div><div class='add'>+end</div><div class='add'>+</div><div class='add'>+hostsFile = "\n"</div><div class='add'>+(1..node_count).each do |num|</div><div class='add'>+        hostsFile += "#{ipbase}#{( 100 + num).to_s} #{node_name}#{num.to_s}\n"</div><div class='add'>+end</div><div class='add'>+</div><div class='add'>+Vagrant.configure("2") do |config|</div><div class='add'>+    (1..node_count).each do |num|</div><div class='add'>+        config.vm.define "#{node_name}#{num}" do |node|</div><div class='add'>+            ip_addr = "#{ipbase}#{(100 + num).to_s}"</div><div class='add'>+            node.vm.network "private_network", ip: "#{ip_addr}"</div><div class='add'>+            node.vm.box = box_name</div><div class='add'>+            node.vm.box_url = box_url</div><div class='add'>+            node.vm.hostname = "#{node_name}#{num}"</div><div class='add'>+            node.ssh.insert_key = false</div><div class='add'>+            node.vm.synced_folder "#{source_path}", "#{target_path}", type: "nfs"</div><div class='add'>+</div><div class='add'>+            # Define basic config for VM, memory, cpu, storage pool</div><div class='add'>+            node.vm.provider "libvirt" do |virt|</div><div class='add'>+                virt.storage_pool_name = "default"</div><div class='add'>+                virt.memory = 1024</div><div class='add'>+                virt.cpus = 1</div><div class='add'>+</div><div class='add'>+                attachDisks( disk_count, virt )</div><div class='add'>+            end</div><div class='add'>+</div><div class='add'>+            node.vm.post_up_message = "\e[37mBuilding of this VM is finished \n"</div><div class='add'>+                                      "You can access it now with: \n"</div><div class='add'>+                                      "vagrant ssh #{node_name}#{num.to_s}\n\n"</div><div class='add'>+                                      "#{target_path} directory in VM #{node_name}#{num.to_s}"</div><div class='add'>+                                      "is synced with Host machine. \nSo any changes done in this"</div><div class='add'>+                                      "directory will be reflected in the host machine as well\n"</div><div class='add'>+                                      "Beware of this when you delete content from this directory\e[32m"</div><div class='add'>+</div><div class='add'>+            node.vm.provision :shell, path: "bootstrap.sh"</div><div class='add'>+</div><div class='add'>+            node.vm.provision "shell", inline: &lt;&lt;-SHELL</div><div class='add'>+                echo '#{hostsFile}' | sudo tee -a /etc/hosts</div><div class='add'>+            SHELL</div><div class='add'>+</div><div class='add'>+            if num == node_count</div><div class='add'>+                # Let's provision</div><div class='add'>+                node.vm.provision "ansible" do |setup|</div><div class='add'>+                    setup.verbose = "v"</div><div class='add'>+                    setup.playbook = "ansible/setup.yml"</div><div class='add'>+                    setup.limit = "all"</div><div class='add'>+                    setup.sudo = "true"</div><div class='add'>+                    setup.groups = groups</div><div class='add'>+                    setup.extra_vars = $ansivar</div><div class='add'>+                end</div><div class='add'>+            end</div><div class='add'>+</div><div class='add'>+        end</div><div class='add'>+    end</div><div class='add'>+end</div><div class='head'>diff --git a/extras/devel-tools/devel-vagrant/ansible/roles/cluster/tasks/main.yml b/extras/devel-tools/devel-vagrant/ansible/roles/cluster/tasks/main.yml<br/>new file mode 100644<br/>index 00000000000..3306c7a3dc2<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/extras/devel-tools/devel-vagrant/ansible/roles/cluster/tasks/main.yml?id=d1d7a6f35c816822fab51c820e25023863c239c1'>extras/devel-tools/devel-vagrant/ansible/roles/cluster/tasks/main.yml</a></div><div class='hunk'>@@ -0,0 +1,5 @@</div><div class='add'>+---</div><div class='add'>+- name: gluster peer probe</div><div class='add'>+  shell: gluster peer probe {{ item }}</div><div class='add'>+  with_items: "{{ peer_nodes | default([]) }}"</div><div class='add'>+</div><div class='head'>diff --git a/extras/devel-tools/devel-vagrant/ansible/roles/compile-gluster/tasks/main.yml b/extras/devel-tools/devel-vagrant/ansible/roles/compile-gluster/tasks/main.yml<br/>new file mode 100644<br/>index 00000000000..6ee258c7780<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/extras/devel-tools/devel-vagrant/ansible/roles/compile-gluster/tasks/main.yml?id=d1d7a6f35c816822fab51c820e25023863c239c1'>extras/devel-tools/devel-vagrant/ansible/roles/compile-gluster/tasks/main.yml</a></div><div class='hunk'>@@ -0,0 +1,29 @@</div><div class='add'>+---</div><div class='add'>+- name: autogen.sh</div><div class='add'>+  shell: chdir={{ item }} ./autogen.sh</div><div class='add'>+  with_items: "{{ trg_path }}"</div><div class='add'>+</div><div class='add'>+- name: configure</div><div class='add'>+  shell: chdir={{ item }} CFLAGS="-g -O0 -Werror -Wall -Wno-error=cpp -Wno-error=maybe-uninitialized" \</div><div class='add'>+        ./configure \</div><div class='add'>+        --prefix=/usr \</div><div class='add'>+        --exec-prefix=/usr \</div><div class='add'>+        --bindir=/usr/bin \</div><div class='add'>+        --sbindir=/usr/sbin \</div><div class='add'>+        --sysconfdir=/etc \</div><div class='add'>+        --datadir=/usr/share \</div><div class='add'>+        --includedir=/usr/include \</div><div class='add'>+        --libdir=/usr/lib64 \</div><div class='add'>+        --libexecdir=/usr/libexec \</div><div class='add'>+        --localstatedir=/var \</div><div class='add'>+        --sharedstatedir=/var/lib \</div><div class='add'>+        --mandir=/usr/share/man \</div><div class='add'>+        --infodir=/usr/share/info \</div><div class='add'>+        --libdir=/usr/lib64 \</div><div class='add'>+        --enable-debug</div><div class='add'>+  with_items: "{{ trg_path }}"</div><div class='add'>+</div><div class='add'>+- name: make install</div><div class='add'>+  shell: chdir={{ item }} make install</div><div class='add'>+  with_items: "{{ trg_path }}"</div><div class='add'>+</div><div class='head'>diff --git a/extras/devel-tools/devel-vagrant/ansible/roles/install-pkgs/tasks/main.yml b/extras/devel-tools/devel-vagrant/ansible/roles/install-pkgs/tasks/main.yml<br/>new file mode 100644<br/>index 00000000000..3944054dd25<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/extras/devel-tools/devel-vagrant/ansible/roles/install-pkgs/tasks/main.yml?id=d1d7a6f35c816822fab51c820e25023863c239c1'>extras/devel-tools/devel-vagrant/ansible/roles/install-pkgs/tasks/main.yml</a></div><div class='hunk'>@@ -0,0 +1,72 @@</div><div class='add'>+---</div><div class='add'>+- name: install deltarpm</div><div class='add'>+  dnf:  name=deltarpm state=present</div><div class='add'>+</div><div class='add'>+- name: update system</div><div class='add'>+  shell: dnf  update -y</div><div class='add'>+</div><div class='add'>+- name: install other packages</div><div class='add'>+  dnf:  name={{ item }} state=present</div><div class='add'>+  with_items:</div><div class='add'>+    - attr</div><div class='add'>+    - autoconf</div><div class='add'>+    - automake</div><div class='add'>+    - bison</div><div class='add'>+    - cifs-utils</div><div class='add'>+    - cscope</div><div class='add'>+    - ctags</div><div class='add'>+    - dbench</div><div class='add'>+    - dos2unix</div><div class='add'>+    - e2fsprogs</div><div class='add'>+    - findutils</div><div class='add'>+    - flex</div><div class='add'>+    - fuse-devel</div><div class='add'>+    - fuse-libs</div><div class='add'>+    - gcc</div><div class='add'>+    - gdb</div><div class='add'>+    - git</div><div class='add'>+    - glib2-devel</div><div class='add'>+    - hostname</div><div class='add'>+    - libacl-devel</div><div class='add'>+    - libaio-devel</div><div class='add'>+    - libattr-devel</div><div class='add'>+    - libibverbs-devel</div><div class='add'>+    - librdmacm-devel</div><div class='add'>+    - libtool</div><div class='add'>+    - libxml2-devel</div><div class='add'>+    - lvm2-devel</div><div class='add'>+    - make</div><div class='add'>+    - man-db</div><div class='add'>+    - mock</div><div class='add'>+    - net-tools</div><div class='add'>+    - nfs-utils</div><div class='add'>+    - openssh-server</div><div class='add'>+    - openssl-devel</div><div class='add'>+    - perl-Test-Harness</div><div class='add'>+    - pkgconfig</div><div class='add'>+    - procps-ng</div><div class='add'>+    - psmisc</div><div class='add'>+    - python-devel</div><div class='add'>+    - python-eventlet</div><div class='add'>+    - python-netifaces</div><div class='add'>+    - python-paste-deploy</div><div class='add'>+    - python-setuptools</div><div class='add'>+    - python-simplejson</div><div class='add'>+    - python-sphinx</div><div class='add'>+    - python-webob</div><div class='add'>+    - pyxattr</div><div class='add'>+    - readline-devel</div><div class='add'>+    - rpm-build</div><div class='add'>+    - screen</div><div class='add'>+    - strace</div><div class='add'>+    - supervisor</div><div class='add'>+    - systemtap-sdt-devel</div><div class='add'>+    - sqlite-devel</div><div class='add'>+    - samba*</div><div class='add'>+    - userspace-rcu-devel</div><div class='add'>+    - vim</div><div class='add'>+    - wget</div><div class='add'>+    - which</div><div class='add'>+    - xfsprogs</div><div class='add'>+    - yajl-devel</div><div class='add'>+</div><div class='head'>diff --git a/extras/devel-tools/devel-vagrant/ansible/roles/iptables/tasks/main.yml b/extras/devel-tools/devel-vagrant/ansible/roles/iptables/tasks/main.yml<br/>new file mode 100644<br/>index 00000000000..768cb0e8668<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/extras/devel-tools/devel-vagrant/ansible/roles/iptables/tasks/main.yml?id=d1d7a6f35c816822fab51c820e25023863c239c1'>extras/devel-tools/devel-vagrant/ansible/roles/iptables/tasks/main.yml</a></div><div class='hunk'>@@ -0,0 +1,3 @@</div><div class='add'>+---</div><div class='add'>+- name: disable iptables, need to add specific rules later</div><div class='add'>+  shell: iptables -F</div><div class='head'>diff --git a/extras/devel-tools/devel-vagrant/ansible/roles/prepare-brick/tasks/main.yml b/extras/devel-tools/devel-vagrant/ansible/roles/prepare-brick/tasks/main.yml<br/>new file mode 100644<br/>index 00000000000..a3a6c463468<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/extras/devel-tools/devel-vagrant/ansible/roles/prepare-brick/tasks/main.yml?id=d1d7a6f35c816822fab51c820e25023863c239c1'>extras/devel-tools/devel-vagrant/ansible/roles/prepare-brick/tasks/main.yml</a></div><div class='hunk'>@@ -0,0 +1,30 @@</div><div class='add'>+---</div><div class='add'>+- name: Create physical device</div><div class='add'>+  shell: pvcreate /dev/{{ item }}</div><div class='add'>+  with_items: "{{ device }}"</div><div class='add'>+</div><div class='add'>+- name: Create volume group</div><div class='add'>+  shell: vgcreate vg{{ item }} /dev/{{ item }}</div><div class='add'>+  with_items: "{{ device }}"</div><div class='add'>+</div><div class='add'>+- name: Create thin pool</div><div class='add'>+  shell: lvcreate -L 950M -T vg{{ item }}/thinpool</div><div class='add'>+  with_items: "{{ device }}"</div><div class='add'>+</div><div class='add'>+- name: Create thin volume</div><div class='add'>+  shell: lvcreate -V900M -T vg{{ item }}/thinpool -n thinp1</div><div class='add'>+  with_items: "{{ device }}"</div><div class='add'>+</div><div class='add'>+- name: Format backend</div><div class='add'>+  filesystem: fstype=xfs dev=/dev/vg{{ item }}/thinp1</div><div class='add'>+  with_items: "{{ device }}"</div><div class='add'>+</div><div class='add'>+- name: Create mount directory</div><div class='add'>+  file: path=/bricks/br{{ item }} state=directory recurse=yes</div><div class='add'>+  with_items: "{{ device }}"</div><div class='add'>+</div><div class='add'>+- name: Add entry to fstab and mount</div><div class='add'>+  mount: name=/bricks/br{{ item }} src=/dev/vg{{ item }}/thinp1 fstype=xfs state=mounted</div><div class='add'>+  with_items: "{{ device }}"</div><div class='add'>+</div><div class='add'>+</div><div class='head'>diff --git a/extras/devel-tools/devel-vagrant/ansible/roles/selinux/tasks/main.yml b/extras/devel-tools/devel-vagrant/ansible/roles/selinux/tasks/main.yml<br/>new file mode 100644<br/>index 00000000000..c9ba9618428<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/extras/devel-tools/devel-vagrant/ansible/roles/selinux/tasks/main.yml?id=d1d7a6f35c816822fab51c820e25023863c239c1'>extras/devel-tools/devel-vagrant/ansible/roles/selinux/tasks/main.yml</a></div><div class='hunk'>@@ -0,0 +1,3 @@</div><div class='add'>+---</div><div class='add'>+- name: Allow gfapi in Samba to bind to other ports than well known smb ports</div><div class='add'>+  seboolean: name=samba_load_libgfapi state=yes persistent=yes</div><div class='head'>diff --git a/extras/devel-tools/devel-vagrant/ansible/roles/service/tasks/main.yml b/extras/devel-tools/devel-vagrant/ansible/roles/service/tasks/main.yml<br/>new file mode 100644<br/>index 00000000000..ef78a125ae8<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/extras/devel-tools/devel-vagrant/ansible/roles/service/tasks/main.yml?id=d1d7a6f35c816822fab51c820e25023863c239c1'>extras/devel-tools/devel-vagrant/ansible/roles/service/tasks/main.yml</a></div><div class='hunk'>@@ -0,0 +1,21 @@</div><div class='add'>+---</div><div class='add'>+- name: disable kernel nfs</div><div class='add'>+  service: name=nfs-server enabled=no</div><div class='add'>+</div><div class='add'>+- name: stop kernel nfs</div><div class='add'>+  service: name=nfs-server state=stopped</div><div class='add'>+</div><div class='add'>+- name: enable rpcbind</div><div class='add'>+  service: name=rpcbind enabled=yes</div><div class='add'>+</div><div class='add'>+- name: start rpcbind</div><div class='add'>+  service: name=rpcbind state=started</div><div class='add'>+</div><div class='add'>+- name: enable glusterd</div><div class='add'>+  service: name=glusterd enabled=yes</div><div class='add'>+</div><div class='add'>+- name: start glusterd</div><div class='add'>+  service: name=glusterd state=started</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+</div><div class='head'>diff --git a/extras/devel-tools/devel-vagrant/ansible/setup.yml b/extras/devel-tools/devel-vagrant/ansible/setup.yml<br/>new file mode 100644<br/>index 00000000000..c26bd7d6051<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/extras/devel-tools/devel-vagrant/ansible/setup.yml?id=d1d7a6f35c816822fab51c820e25023863c239c1'>extras/devel-tools/devel-vagrant/ansible/setup.yml</a></div><div class='hunk'>@@ -0,0 +1,23 @@</div><div class='add'>+---</div><div class='add'>+- hosts: all</div><div class='add'>+  become: yes</div><div class='add'>+  become_method: sudo</div><div class='add'>+  roles:</div><div class='add'>+    - install-pkgs</div><div class='add'>+    - prepare-brick</div><div class='add'>+    - selinux</div><div class='add'>+    - iptables</div><div class='add'>+</div><div class='add'>+- hosts: all</div><div class='add'>+  become: yes</div><div class='add'>+  become_method: sudo</div><div class='add'>+  serial: 1</div><div class='add'>+  roles:</div><div class='add'>+    - compile-gluster</div><div class='add'>+    - service</div><div class='add'>+</div><div class='add'>+- hosts: origin</div><div class='add'>+  become: yes</div><div class='add'>+  become_method: sudo</div><div class='add'>+  roles:</div><div class='add'>+    - cluster</div><div class='head'>diff --git a/extras/devel-tools/devel-vagrant/bootstrap.sh b/extras/devel-tools/devel-vagrant/bootstrap.sh<br/>new file mode 100644<br/>index 00000000000..bbf9fa2c063<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/extras/devel-tools/devel-vagrant/bootstrap.sh?id=d1d7a6f35c816822fab51c820e25023863c239c1'>extras/devel-tools/devel-vagrant/bootstrap.sh</a></div><div class='hunk'>@@ -0,0 +1,3 @@</div><div class='add'>+dnf install -y nfs-utils</div><div class='add'>+dnf install -y vim</div><div class='add'>+dnf install -y python2 python2-dnf libselinux-python libsemanage-python</div><div class='head'>diff --git a/extras/devel-tools/devel-vagrant/up.sh b/extras/devel-tools/devel-vagrant/up.sh<br/>new file mode 100755<br/>index 00000000000..35cbe79d835<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/extras/devel-tools/devel-vagrant/up.sh?id=d1d7a6f35c816822fab51c820e25023863c239c1'>extras/devel-tools/devel-vagrant/up.sh</a></div><div class='hunk'>@@ -0,0 +1,4 @@</div><div class='add'>+#!/bin/sh</div><div class='add'>+</div><div class='add'>+vagrant up --no-provision $@</div><div class='add'>+vagrant provision</div><div class='head'>diff --git a/extras/devel-tools/gdb_macros b/extras/devel-tools/gdb_macros<br/>new file mode 100644<br/>index 00000000000..aae4ccb3b37<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/extras/devel-tools/gdb_macros?id=d1d7a6f35c816822fab51c820e25023863c239c1'>extras/devel-tools/gdb_macros</a></div><div class='hunk'>@@ -0,0 +1,84 @@</div><div class='add'>+</div><div class='add'>+#</div><div class='add'>+# gdb_macros is a gdb script file which can assist</div><div class='add'>+# developer in debugging. This script provides</div><div class='add'>+# following functions for debugging gluster processes</div><div class='add'>+# effectively:</div><div class='add'>+#</div><div class='add'>+# pdict : This function will iterate through all the</div><div class='add'>+#         dictionary (dict_t) members and print the</div><div class='add'>+#         key-value pair.</div><div class='add'>+#</div><div class='add'>+# plist : This function will print address of each member</div><div class='add'>+#         of gluster list (list_head).</div><div class='add'>+#</div><div class='add'>+# gdb script should be loaded in gdb before using these</div><div class='add'>+# functions. gdb script can be loaded on-demand or on gdb</div><div class='add'>+# start-up. Use the following command on gdb prompt for</div><div class='add'>+# loading it on-demand.</div><div class='add'>+#       source &lt;script filename&gt;</div><div class='add'>+# e.g.</div><div class='add'>+# (gdb) source /mnt/gdb_macros</div><div class='add'>+#</div><div class='add'>+# To automatically load gdb script on startup use .gdbinit</div><div class='add'>+# file. This file is automatically loaded by gdb on start.</div><div class='add'>+# Edit (or create) ~/.gdbinit file and add the following</div><div class='add'>+# entry:</div><div class='add'>+# source /mnt/gdb_macros</div><div class='add'>+#</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+# This is an internal helper function</div><div class='add'>+define _print_dict_data</div><div class='add'>+        set $data = ($arg0)</div><div class='add'>+        set $len = $data-&gt;len - 1</div><div class='add'>+        set $i = 0</div><div class='add'>+        set $ishex = 0</div><div class='add'>+        while ($i &lt; $len)</div><div class='add'>+                set $ch = $data-&gt;data [$i]</div><div class='add'>+</div><div class='add'>+                # Print only alpha-numeric values as char</div><div class='add'>+                # and remaining as hex value. This is done</div><div class='add'>+                # in this way because using %s screws up</div><div class='add'>+                # the display if the string has non-displayable</div><div class='add'>+                # characters</div><div class='add'>+                if ($ishex == 0) &amp;&amp; ($ch &gt; 31) &amp;&amp; ($ch &lt; 127)</div><div class='add'>+                        printf "%c", $ch</div><div class='add'>+                else</div><div class='add'>+                        printf "%x", ($ch &amp; 0xFF)</div><div class='add'>+                        set $ishex = 1</div><div class='add'>+                end</div><div class='add'>+                set $i = $i + 1</div><div class='add'>+        end</div><div class='add'>+end</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+define pdict</div><div class='add'>+        set $cnt = 1</div><div class='add'>+        set $temp = *($arg0-&gt;members)</div><div class='add'>+        while ($temp)</div><div class='add'>+                printf "[%d](%s::",$cnt, $temp-&gt;key</div><div class='add'>+                _print_dict_data ($temp)-&gt;value</div><div class='add'>+                printf ")\n"</div><div class='add'>+                set $temp = $temp-&gt;next</div><div class='add'>+                set $cnt = $cnt + 1</div><div class='add'>+        end</div><div class='add'>+        printf "Done\n"</div><div class='add'>+end</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+define plist</div><div class='add'>+        set $node = &amp;($arg0)</div><div class='add'>+        set $head = $node</div><div class='add'>+</div><div class='add'>+        printf "[0x%lx]", $node</div><div class='add'>+        set $node = $node-&gt;next</div><div class='add'>+</div><div class='add'>+        while ($node != $head)</div><div class='add'>+                printf "--&gt; [0x%lx]", $node</div><div class='add'>+                set $node = $node-&gt;next</div><div class='add'>+        end</div><div class='add'>+        printf "\n"</div><div class='add'>+end</div><div class='add'>+</div><div class='head'>diff --git a/extras/devel-tools/print-backtrace.sh b/extras/devel-tools/print-backtrace.sh<br/>new file mode 100755<br/>index 00000000000..33fbae288bc<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/extras/devel-tools/print-backtrace.sh?id=d1d7a6f35c816822fab51c820e25023863c239c1'>extras/devel-tools/print-backtrace.sh</a></div><div class='hunk'>@@ -0,0 +1,115 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+# sample unresolved backtrace lines picked up from a brick log that should go</div><div class='add'>+# into a backtrace file eg. bt-file.txt:</div><div class='add'>+# /usr/lib64/glusterfs/3.8.4/xlator/cluster/replicate.so(+0x3ec81)[0x7fe4bc271c81]</div><div class='add'>+# /usr/lib64/glusterfs/3.8.4/xlator/cluster/replicate.so(+0x3eecd)[0x7fe4bc271ecd]</div><div class='add'>+# /usr/lib64/glusterfs/3.8.4/xlator/cluster/replicate.so(+0x404cb)[0x7fe4bc2734cb]</div><div class='add'>+# /usr/lib64/glusterfs/3.8.4/xlator/cluster/replicate.so(+0x3d2b6)[0x7fe4bc2702b6]</div><div class='add'>+# /usr/lib64/glusterfs/3.8.4/xlator/cluster/replicate.so(+0x3d323)[0x7fe4bc270323]</div><div class='add'>+#</div><div class='add'>+# following is the output of the script for the above backtrace lines:</div><div class='add'>+# /usr/lib64/glusterfs/3.8.4/xlator/cluster/replicate.so(+0x3ec81)[0x7fe4bc271c81] __afr_selfheal_data_finalize_source inlined at /usr/src/debug/glusterfs-3.8.4/xlators/cluster/afr/src/afr-self-heal-data.c:684 in __afr_selfheal_data_prepare /usr/src/debug/glusterfs-3.8.4/xlators/cluster/afr/src/afr-self-heal-data.c:603</div><div class='add'>+# /usr/lib64/glusterfs/3.8.4/xlator/cluster/replicate.so(+0x3eecd)[0x7fe4bc271ecd] __afr_selfheal_data /usr/src/debug/glusterfs-3.8.4/xlators/cluster/afr/src/afr-self-heal-data.c:740</div><div class='add'>+# /usr/lib64/glusterfs/3.8.4/xlator/cluster/replicate.so(+0x404cb)[0x7fe4bc2734cb] afr_selfheal_data /usr/src/debug/glusterfs-3.8.4/xlators/cluster/afr/src/afr-self-heal-data.c:883</div><div class='add'>+# /usr/lib64/glusterfs/3.8.4/xlator/cluster/replicate.so(+0x3d2b6)[0x7fe4bc2702b6] afr_selfheal_do /usr/src/debug/glusterfs-3.8.4/xlators/cluster/afr/src/afr-self-heal-common.c:1968</div><div class='add'>+# /usr/lib64/glusterfs/3.8.4/xlator/cluster/replicate.so(+0x3d323)[0x7fe4bc270323] afr_selfheal /usr/src/debug/glusterfs-3.8.4/xlators/cluster/afr/src/afr-self-heal-common.c:2015</div><div class='add'>+#</div><div class='add'>+# Usage with debuginfo RPM:</div><div class='add'>+# print-backtrace.sh $HOME/Downloads/glusterfs-debuginfo-3.8.4-10.el7.x86_64.rpm bt-file.txt</div><div class='add'>+#</div><div class='add'>+# Usage with source install:</div><div class='add'>+# print-packtrace.sh none bt-file.txt</div><div class='add'>+</div><div class='add'>+function version_compare() { test $(echo $1|awk -F '.' '{print $1 $2 $3}') -gt $(echo $2|awk -F '.' '{print $1 $2 $3}'); }</div><div class='add'>+</div><div class='add'>+function Usage()</div><div class='add'>+{</div><div class='add'>+        echo -e "Usage:\n\t$0 { none | &lt;debuginfo-rpm&gt; } &lt;backtrace-file&gt;"</div><div class='add'>+        echo "none: implies we don't have a debuginfo rpm but want to resolve"</div><div class='add'>+        echo "      against a source install which already has the debuginfo"</div><div class='add'>+        echo "      NOTE: in this case you should have configured the build"</div><div class='add'>+        echo "            with --enable-debug and the linker options should"</div><div class='add'>+        echo "            have the option -rdynamic"</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+debuginfo_rpm=$1</div><div class='add'>+backtrace_file=$2</div><div class='add'>+</div><div class='add'>+if [ ! $debuginfo_rpm ] || [ ! $backtrace_file ]; then</div><div class='add'>+        Usage</div><div class='add'>+        exit 1</div><div class='add'>+fi</div><div class='add'>+</div><div class='add'>+if [ $debuginfo_rpm != "none" ]; then</div><div class='add'>+        if [ ! -f $debuginfo_rpm ]; then</div><div class='add'>+                echo "no such rpm file: $debuginfo_rpm"</div><div class='add'>+                exit 1</div><div class='add'>+        fi</div><div class='add'>+fi</div><div class='add'>+</div><div class='add'>+if [ ! -f $backtrace_file ]; then</div><div class='add'>+        echo "no such backtrace file: $backtrace_file"</div><div class='add'>+        exit 1</div><div class='add'>+fi</div><div class='add'>+</div><div class='add'>+if [ "$debuginfo_rpm" != "none" ]; then</div><div class='add'>+        if ! file $debuginfo_rpm | grep RPM &gt;/dev/null 2&gt;&amp;1 ; then</div><div class='add'>+                echo "file does not look like an rpm: $debuginfo_rpm"</div><div class='add'>+                exit 1</div><div class='add'>+        fi</div><div class='add'>+fi</div><div class='add'>+</div><div class='add'>+cpio_version=$(cpio --version|grep cpio|cut -f 2 -d ')'|sed -e 's/^[[:space:]]*//')</div><div class='add'>+rpm_name=""</div><div class='add'>+debuginfo_path=""</div><div class='add'>+debuginfo_extension=""</div><div class='add'>+</div><div class='add'>+if [ $debuginfo_rpm != "none" ]; then</div><div class='add'>+        # extract the gluster debuginfo rpm to resolve the symbols against</div><div class='add'>+        rpm_name=$(basename $debuginfo_rpm '.rpm')</div><div class='add'>+        if [ -d $rpm_name ]; then</div><div class='add'>+                echo "directory already exists: $rpm_name"</div><div class='add'>+                echo "please remove/move it and reattempt"</div><div class='add'>+                exit 1</div><div class='add'>+        fi</div><div class='add'>+        mkdir -p $rpm_name</div><div class='add'>+        if version_compare $cpio_version "2.11"; then</div><div class='add'>+                rpm2cpio $debuginfo_rpm | cpio --quiet --extract --make-directories --preserve-modification-time --directory=$rpm_name</div><div class='add'>+                ret=$?</div><div class='add'>+        else</div><div class='add'>+                current_dir="$PWD"</div><div class='add'>+                cd $rpm_name</div><div class='add'>+                rpm2cpio $debuginfo_rpm | cpio --quiet --extract --make-directories --preserve-modification-time</div><div class='add'>+                ret=$?</div><div class='add'>+                cd $current_dir</div><div class='add'>+        fi</div><div class='add'>+        if [ $ret -eq 1 ]; then</div><div class='add'>+                echo "failed to extract rpm $debuginfo_rpm to $PWD/$rpm_name directory"</div><div class='add'>+                rm -rf $rpm_name</div><div class='add'>+                exit 1</div><div class='add'>+        fi</div><div class='add'>+        debuginfo_path="$PWD/$rpm_name/usr/lib/debug"</div><div class='add'>+        debuginfo_extension=".debug"</div><div class='add'>+else</div><div class='add'>+        debuginfo_path=""</div><div class='add'>+        debuginfo_extension=""</div><div class='add'>+fi</div><div class='add'>+</div><div class='add'>+# NOTE: backtrace file should contain only the lines which need to be resolved</div><div class='add'>+for bt in $(cat $backtrace_file)</div><div class='add'>+do</div><div class='add'>+        libname=$(echo $bt | cut -f 1 -d '(')</div><div class='add'>+        addr=$(echo $bt | cut -f 2 -d '(' | cut -f 1 -d ')')</div><div class='add'>+        libpath=${debuginfo_path}${libname}${debuginfo_extension}</div><div class='add'>+        if [ ! -f $libpath ]; then</div><div class='add'>+                continue</div><div class='add'>+        fi</div><div class='add'>+        newbt=( $(eu-addr2line --functions --exe=$libpath $addr) )</div><div class='add'>+        echo "$bt ${newbt[*]}"</div><div class='add'>+done</div><div class='add'>+</div><div class='add'>+# remove the temporary directory</div><div class='add'>+if [ -d $rpm_name ]; then</div><div class='add'>+        rm -rf $rpm_name</div><div class='add'>+fi</div><div class='add'>+</div><div class='head'>diff --git a/extras/devel-tools/strace-brick.sh b/extras/devel-tools/strace-brick.sh<br/>new file mode 100755<br/>index 00000000000..a140729111c<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/extras/devel-tools/strace-brick.sh?id=d1d7a6f35c816822fab51c820e25023863c239c1'>extras/devel-tools/strace-brick.sh</a></div><div class='hunk'>@@ -0,0 +1,55 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+# Usage:</div><div class='add'>+# nice -n -19 strace-brick.sh glusterfsd 50</div><div class='add'>+</div><div class='add'>+brick_process_name=$1</div><div class='add'>+min_watch_cpu=$2</div><div class='add'>+if [ ! $brick_process_name ]; then</div><div class='add'>+        brick_process_name=glusterfsd</div><div class='add'>+fi</div><div class='add'>+</div><div class='add'>+if [ ! $min_watch_cpu ]; then</div><div class='add'>+        min_watch_cpu=50</div><div class='add'>+fi</div><div class='add'>+</div><div class='add'>+echo "min_watch_cpu: $min_watch_cpu"</div><div class='add'>+</div><div class='add'>+break=false</div><div class='add'>+</div><div class='add'>+while ! $break;</div><div class='add'>+do</div><div class='add'>+        mypids=( $(pgrep $brick_process_name) )</div><div class='add'>+        echo "mypids: ${mypids[*]}"</div><div class='add'>+</div><div class='add'>+        pid_args=$(echo ${mypids[*]} | sed -e 's/ / -p /g;s/^/-p /')</div><div class='add'>+        echo "pid_args: $pid_args"</div><div class='add'>+</div><div class='add'>+        pcpu=( $(ps $pid_args -o pcpu -h ) )</div><div class='add'>+        echo "pcpu: ${pcpu[*]}"</div><div class='add'>+</div><div class='add'>+        wait_longer=false</div><div class='add'>+</div><div class='add'>+        for i in $( seq 0 $((${#pcpu[*]} - 1)) )</div><div class='add'>+        do</div><div class='add'>+                echo "i: $i"</div><div class='add'>+                echo "mypids[$i]: ${mypids[$i]}"</div><div class='add'>+</div><div class='add'>+                int_pcpu=$(echo ${pcpu[$i]} | cut -f 1 -d '.')</div><div class='add'>+                echo "int_pcpu: $int_pcpu"</div><div class='add'>+                if [ ! $int_pcpu ] || [ ! $min_watch_cpu ]; then</div><div class='add'>+                        break=true</div><div class='add'>+                        echo "breaking"</div><div class='add'>+                fi</div><div class='add'>+                if [ $int_pcpu -ge $min_watch_cpu ]; then</div><div class='add'>+                        wait_longer=true</div><div class='add'>+                        mydirname="${brick_process_name}-${mypids[$i]}-$(date --utc +'%Y%m%d-%H%M%S.%N')"</div><div class='add'>+                        $(mkdir $mydirname &amp;&amp; cd $mydirname &amp;&amp; timeout --kill-after=5 --signal=KILL 60 nice -n -19 strace -p ${mypids[$i]} -ff -tt -T -o $brick_process_name) &amp;</div><div class='add'>+                fi</div><div class='add'>+        done</div><div class='add'>+</div><div class='add'>+        if $wait_longer; then</div><div class='add'>+                sleep 90</div><div class='add'>+        else</div><div class='add'>+                sleep 15</div><div class='add'>+        fi</div><div class='add'>+done</div><div class='head'>diff --git a/extras/distributed-testing/README b/extras/distributed-testing/README<br/>new file mode 100644<br/>index 00000000000..928d943f211<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/extras/distributed-testing/README?id=d1d7a6f35c816822fab51c820e25023863c239c1'>extras/distributed-testing/README</a></div><div class='hunk'>@@ -0,0 +1,28 @@</div><div class='add'>+PROBLEM</div><div class='add'>+</div><div class='add'>+The testing methodology of Gluster is extremely slow. It takes a very long time (6+ hrs) to run the basic tests on a single machine. It takes about 20+ hours to run code analysis version of tests like valgrind, asan, tsan etc.</div><div class='add'>+</div><div class='add'>+SOLUTION</div><div class='add'>+</div><div class='add'>+The fundamental problem is that the tests cannot be parallelized on a single machine. The natural solution is to run these tests on a cluster of machines. In a nutshell, apply map-reduce to run unit tests.</div><div class='add'>+</div><div class='add'>+WORK @ Facebook</div><div class='add'>+</div><div class='add'>+At Facebook we have applied the map-reduce approach to testing and have observed 10X improvements.</div><div class='add'>+</div><div class='add'>+The solution supports the following</div><div class='add'>+</div><div class='add'>+Distribute tests across machines, collect results/logs</div><div class='add'>+Share worker pool across different testers</div><div class='add'>+Try failure 3 times on 3 different machines before calling it a failure</div><div class='add'>+Support running asan, valgrind, asan-noleaks</div><div class='add'>+Self management of worker pools. The clients will manage the worker pool including version update, no manual maintenance required</div><div class='add'>+WORK</div><div class='add'>+</div><div class='add'>+Port the code from gluster-fb-3.8 to gluster master</div><div class='add'>+</div><div class='add'>+HOW TO RUN</div><div class='add'>+</div><div class='add'>+./extras/distributed-testing/distributed-test.sh --hosts '&lt;h1&gt; &lt;h2&gt; &lt;h3&gt;'</div><div class='add'>+</div><div class='add'>+All hosts should have no password for ssh via root. This can be achieved with keys setup on the client and the server machines.</div><div class='head'>diff --git a/extras/distributed-testing/distributed-test-build-env b/extras/distributed-testing/distributed-test-build-env<br/>new file mode 100644<br/>index 00000000000..cd68ff717da<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/extras/distributed-testing/distributed-test-build-env?id=d1d7a6f35c816822fab51c820e25023863c239c1'>extras/distributed-testing/distributed-test-build-env</a></div><div class='hunk'>@@ -0,0 +1,20 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+GF_CONF_OPTS="--localstatedir=/var --sysconfdir /var/lib --prefix /usr --libdir /usr/lib64 \</div><div class='add'>+            --enable-bd-xlator=yes --enable-debug --enable-gnfs"</div><div class='add'>+</div><div class='add'>+if [ -x /usr/lib/rpm/redhat/dist.sh ]; then</div><div class='add'>+  REDHAT_MAJOR=$(/usr/lib/rpm/redhat/dist.sh --distnum)</div><div class='add'>+else</div><div class='add'>+  REDHAT_MAJOR=0</div><div class='add'>+fi</div><div class='add'>+</div><div class='add'>+ASAN_ENABLED=${ASAN_ENABLED:=0}</div><div class='add'>+if [ "$ASAN_ENABLED" -eq "1" ]; then</div><div class='add'>+    GF_CONF_OPTS="$GF_CONF_OPTS --with-asan"</div><div class='add'>+fi</div><div class='add'>+</div><div class='add'>+GF_CONF_OPTS="$GF_CONF_OPTS --with-systemd"</div><div class='add'>+export GF_CONF_OPTS</div><div class='add'>+</div><div class='add'>+export CFLAGS="-O0 -ggdb -fPIC -Wall"</div><div class='head'>diff --git a/extras/distributed-testing/distributed-test-build.sh b/extras/distributed-testing/distributed-test-build.sh<br/>new file mode 100755<br/>index 00000000000..e8910d8425c<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/extras/distributed-testing/distributed-test-build.sh?id=d1d7a6f35c816822fab51c820e25023863c239c1'>extras/distributed-testing/distributed-test-build.sh</a></div><div class='hunk'>@@ -0,0 +1,27 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+set -e</div><div class='add'>+</div><div class='add'>+EXTRA_CONFIGURE_ARGS="$@"</div><div class='add'>+ASAN_REQUESTED=false</div><div class='add'>+for arg in $EXTRA_CONFIGURE_ARGS; do</div><div class='add'>+  if [ $arg == "--with-asan" ]; then</div><div class='add'>+    echo "Requested ASAN, cleaning build first."</div><div class='add'>+    make -j distclean || true</div><div class='add'>+    touch .with_asan</div><div class='add'>+    ASAN_REQUESTED=true</div><div class='add'>+  fi</div><div class='add'>+done</div><div class='add'>+</div><div class='add'>+if [ $ASAN_REQUESTED == false ]; then</div><div class='add'>+  if [ -f .with_asan ]; then</div><div class='add'>+    echo "Previous build was with ASAN, cleaning build first."</div><div class='add'>+    make -j distclean || true</div><div class='add'>+    rm -v .with_asan</div><div class='add'>+  fi</div><div class='add'>+fi</div><div class='add'>+</div><div class='add'>+source extras/distributed-testing/distributed-test-build-env</div><div class='add'>+./autogen.sh</div><div class='add'>+./configure $GF_CONF_OPTS $EXTRA_CONFIGURE_ARGS</div><div class='add'>+make -j</div><div class='head'>diff --git a/extras/distributed-testing/distributed-test-env b/extras/distributed-testing/distributed-test-env<br/>new file mode 100644<br/>index 00000000000..36fdd82e5dd<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/extras/distributed-testing/distributed-test-env?id=d1d7a6f35c816822fab51c820e25023863c239c1'>extras/distributed-testing/distributed-test-env</a></div><div class='hunk'>@@ -0,0 +1,48 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+SMOKE_TESTS="\</div><div class='add'>+    tests/basic/*.t\</div><div class='add'>+    tests/basic/afr/*.t\</div><div class='add'>+    tests/basic/distribute/*.t\</div><div class='add'>+    tests/bugs/fb*.t\</div><div class='add'>+    tests/features/brick-min-free-space.t\</div><div class='add'>+"</div><div class='add'>+</div><div class='add'>+KNOWN_FLAKY_TESTS="\</div><div class='add'>+"</div><div class='add'>+</div><div class='add'>+BROKEN_TESTS="\</div><div class='add'>+  tests/features/lock_revocation.t\</div><div class='add'>+  tests/features/recon.t\</div><div class='add'>+  tests/features/fdl-overflow.t\</div><div class='add'>+  tests/features/fdl.t\</div><div class='add'>+  tests/features/ipc.t\</div><div class='add'>+  tests/bugs/distribute/bug-1247563.t\</div><div class='add'>+  tests/bugs/distribute/bug-1543279.t\</div><div class='add'>+  tests/bugs/distribute/bug-1066798.t\</div><div class='add'>+  tests/bugs/ec/bug-1304988.t\</div><div class='add'>+  tests/bugs/unclassified/bug-1357397.t\</div><div class='add'>+  tests/bugs/quota/bug-1235182.t\</div><div class='add'>+  tests/bugs/fuse/bug-1309462.t\</div><div class='add'>+  tests/bugs/glusterd/bug-1238706-daemons-stop-on-peer-cleanup.t\</div><div class='add'>+  tests/bugs/stripe/bug-1002207.t\</div><div class='add'>+  tests/bugs/stripe/bug-1111454.t\</div><div class='add'>+  tests/bugs/snapshot/bug-1140162-file-snapshot-features-encrypt-opts-validation.t\</div><div class='add'>+  tests/bugs/write-behind/bug-1279730.t\</div><div class='add'>+  tests/bugs/gfapi/bug-1093594.t\</div><div class='add'>+  tests/bugs/replicate/bug-1473026.t\</div><div class='add'>+  tests/bugs/replicate/bug-802417.t\</div><div class='add'>+  tests/basic/inode-leak.t\</div><div class='add'>+  tests/basic/distribute/force-migration.t\</div><div class='add'>+  tests/basic/ec/heal-info.t\</div><div class='add'>+  tests/basic/ec/ec-seek.t\</div><div class='add'>+  tests/basic/jbr/jbr-volgen.t\</div><div class='add'>+  tests/basic/jbr/jbr.t\</div><div class='add'>+  tests/basic/afr/tarissue.t\</div><div class='add'>+  tests/basic/tier/tierd_check.t\</div><div class='add'>+  tests/basic/gfapi/bug1291259.t\</div><div class='add'>+"</div><div class='add'>+</div><div class='add'>+SMOKE_TESTS=$(echo $SMOKE_TESTS | tr -s ' ' ' ')</div><div class='add'>+KNOWN_FLAKY_TESTS=$(echo $KNOWN_FLAKY_TESTS | tr -s ' ' ' ')</div><div class='add'>+BROKEN_TESTS=$(echo $BROKEN_TESTS | tr -s ' ' ' ')</div><div class='head'>diff --git a/extras/distributed-testing/distributed-test-runner.py b/extras/distributed-testing/distributed-test-runner.py<br/>new file mode 100755<br/>index 00000000000..5a07e2feab1<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/extras/distributed-testing/distributed-test-runner.py?id=d1d7a6f35c816822fab51c820e25023863c239c1'>extras/distributed-testing/distributed-test-runner.py</a></div><div class='hunk'>@@ -0,0 +1,859 @@</div><div class='add'>+#!/usr/bin/python3</div><div class='add'>+</div><div class='add'>+from __future__ import absolute_import</div><div class='add'>+from __future__ import division</div><div class='add'>+from __future__ import unicode_literals</div><div class='add'>+from __future__ import print_function</div><div class='add'>+import re</div><div class='add'>+import sys</div><div class='add'>+import fcntl</div><div class='add'>+import base64</div><div class='add'>+import threading</div><div class='add'>+import socket</div><div class='add'>+import os</div><div class='add'>+import shlex</div><div class='add'>+import argparse</div><div class='add'>+import subprocess</div><div class='add'>+import time</div><div class='add'>+import SimpleXMLRPCServer</div><div class='add'>+import xmlrpclib</div><div class='add'>+import md5</div><div class='add'>+import httplib</div><div class='add'>+import uuid</div><div class='add'>+</div><div class='add'>+DEFAULT_PORT = 9999</div><div class='add'>+TEST_TIMEOUT_S = 15 * 60</div><div class='add'>+CLIENT_CONNECT_TIMEOUT_S = 10</div><div class='add'>+CLIENT_TIMEOUT_S = 60</div><div class='add'>+PATCH_FILE_UID = str(uuid.uuid4())</div><div class='add'>+SSH_TIMEOUT_S = 10</div><div class='add'>+MAX_ATTEMPTS = 3</div><div class='add'>+ADDRESS_FAMILY = 'IPv4'</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def socket_instance(address_family):</div><div class='add'>+    if address_family.upper() == 'ipv4'.upper():</div><div class='add'>+        return socket.socket(socket.AF_INET, socket.SOCK_STREAM)</div><div class='add'>+    elif address_family.upper() == 'ipv6'.upper():</div><div class='add'>+        return socket.socket(socket.AF_INET6, socket.SOCK_STREAM)</div><div class='add'>+    else:</div><div class='add'>+        Log.error("Invalid IP address family")</div><div class='add'>+        sys.exit(1)</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def patch_file():</div><div class='add'>+    return "/tmp/%s-patch.tar.gz" % PATCH_FILE_UID</div><div class='add'>+</div><div class='add'>+# ..............................................................................</div><div class='add'>+# SimpleXMLRPCServer IPvX Wrapper</div><div class='add'>+# ..............................................................................</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+class GeneralXMLRPCServer(SimpleXMLRPCServer.SimpleXMLRPCServer):</div><div class='add'>+    def __init__(self, addr):</div><div class='add'>+        SimpleXMLRPCServer.SimpleXMLRPCServer.__init__(self, addr)</div><div class='add'>+</div><div class='add'>+    def server_bind(self):</div><div class='add'>+        if self.socket:</div><div class='add'>+            self.socket.close()</div><div class='add'>+        self.socket = socket_instance(args.address_family)</div><div class='add'>+        self.socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)</div><div class='add'>+        SimpleXMLRPCServer.SimpleXMLRPCServer.server_bind(self)</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+class HTTPConnection(httplib.HTTPConnection):</div><div class='add'>+    def __init__(self, host):</div><div class='add'>+        self.host = host</div><div class='add'>+        httplib.HTTPConnection.__init__(self, host)</div><div class='add'>+</div><div class='add'>+    def connect(self):</div><div class='add'>+        old_timeout = socket.getdefaulttimeout()</div><div class='add'>+        self.sock = socket.create_connection((self.host, self.port),</div><div class='add'>+                                             timeout=CLIENT_CONNECT_TIMEOUT_S)</div><div class='add'>+        self.sock.settimeout(old_timeout)</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+class IPTransport(xmlrpclib.Transport):</div><div class='add'>+    def __init__(self, *args, **kwargs):</div><div class='add'>+        xmlrpclib.Transport.__init__(self, *args, **kwargs)</div><div class='add'>+</div><div class='add'>+    def make_connection(self, host):</div><div class='add'>+        return HTTPConnection(host)</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+# ..............................................................................</div><div class='add'>+# Common</div><div class='add'>+# ..............................................................................</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+class Timer:</div><div class='add'>+    def __init__(self):</div><div class='add'>+        self.start = time.time()</div><div class='add'>+</div><div class='add'>+    def elapsed_s(self):</div><div class='add'>+        return int(time.time() - self.start)</div><div class='add'>+</div><div class='add'>+    def reset(self):</div><div class='add'>+        ret = self.elapsed_s()</div><div class='add'>+        self.start = time.time()</div><div class='add'>+        return ret</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def encode(buf):</div><div class='add'>+    return base64.b16encode(buf)</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def decode(buf):</div><div class='add'>+    return base64.b16decode(buf)</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def get_file_content(path):</div><div class='add'>+    with open(path, "r") as f:</div><div class='add'>+        return f.read()</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def write_to_file(path, data):</div><div class='add'>+    with open(path, "w") as f:</div><div class='add'>+        f.write(data)</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def failsafe(fn, args=()):</div><div class='add'>+    try:</div><div class='add'>+        return (True, fn(*args))</div><div class='add'>+    except (xmlrpclib.Fault, xmlrpclib.ProtocolError, xmlrpclib.ResponseError,</div><div class='add'>+            Exception) as err:</div><div class='add'>+        Log.debug(str(err))</div><div class='add'>+    return (False, None)</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+class LogLevel:</div><div class='add'>+    DEBUG = 2</div><div class='add'>+    ERROR = 1</div><div class='add'>+    CLI = 0</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+class Log:</div><div class='add'>+    LOGLEVEL = LogLevel.ERROR</div><div class='add'>+</div><div class='add'>+    @staticmethod</div><div class='add'>+    def _normalize(msg):</div><div class='add'>+        return msg[:100]</div><div class='add'>+</div><div class='add'>+    @staticmethod</div><div class='add'>+    def debug(msg):</div><div class='add'>+        if Log.LOGLEVEL &gt;= LogLevel.DEBUG:</div><div class='add'>+            sys.stdout.write("&lt;debug&gt; %s\n" % Log._normalize(msg))</div><div class='add'>+            sys.stdout.flush()</div><div class='add'>+</div><div class='add'>+    @staticmethod</div><div class='add'>+    def error(msg):</div><div class='add'>+        sys.stderr.write("&lt;error&gt; %s\n" % Log._normalize(msg))</div><div class='add'>+</div><div class='add'>+    @staticmethod</div><div class='add'>+    def header(msg):</div><div class='add'>+        sys.stderr.write("* %s *\n" % Log._normalize(msg))</div><div class='add'>+</div><div class='add'>+    @staticmethod</div><div class='add'>+    def cli(msg):</div><div class='add'>+        sys.stderr.write("%s\n" % msg)</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+class Shell:</div><div class='add'>+    def __init__(self, cwd=None, logpath=None):</div><div class='add'>+        self.cwd = cwd</div><div class='add'>+        self.shell = True</div><div class='add'>+        self.redirect = open(os.devnull if not logpath else logpath, "wr+")</div><div class='add'>+</div><div class='add'>+    def __del__(self):</div><div class='add'>+        self.redirect.close()</div><div class='add'>+</div><div class='add'>+    def cd(self, cwd):</div><div class='add'>+        Log.debug("cd %s" % cwd)</div><div class='add'>+        self.cwd = cwd</div><div class='add'>+</div><div class='add'>+    def truncate(self):</div><div class='add'>+        self.redirect.truncate(0)</div><div class='add'>+</div><div class='add'>+    def read_logs(self):</div><div class='add'>+        self.redirect.seek(0)</div><div class='add'>+        return self.redirect.read()</div><div class='add'>+</div><div class='add'>+    def check_call(self, cmd):</div><div class='add'>+        status = self.call(cmd)</div><div class='add'>+        if status:</div><div class='add'>+            raise Exception("Error running command %s. status=%s"</div><div class='add'>+                            % (cmd, status))</div><div class='add'>+</div><div class='add'>+    def call(self, cmd):</div><div class='add'>+        if isinstance(cmd, list):</div><div class='add'>+            return self._calls(cmd)</div><div class='add'>+</div><div class='add'>+        return self._call(cmd)</div><div class='add'>+</div><div class='add'>+    def ssh(self, hostname, cmd, id_rsa=None):</div><div class='add'>+        flags = "" if not id_rsa else "-i " + id_rsa</div><div class='add'>+        return self.call("timeout %s ssh %s root@%s \"%s\"" %</div><div class='add'>+                            (SSH_TIMEOUT_S, flags, hostname, cmd))</div><div class='add'>+</div><div class='add'>+    def scp(self, hostname, src, dest, id_rsa=None):</div><div class='add'>+        flags = "" if not id_rsa else "-i " + id_rsa</div><div class='add'>+        return self.call("timeout %s scp %s %s root@%s:%s" %</div><div class='add'>+                            (SSH_TIMEOUT_S, flags, src, hostname, dest))</div><div class='add'>+</div><div class='add'>+    def output(self, cmd, cwd=None):</div><div class='add'>+        Log.debug("%s&gt; %s" % (cwd, cmd))</div><div class='add'>+        return subprocess.check_output(shlex.split(cmd), cwd=self.cwd)</div><div class='add'>+</div><div class='add'>+    def _calls(self, cmds):</div><div class='add'>+        Log.debug("Running commands. %s" % cmds)</div><div class='add'>+        for c in cmds:</div><div class='add'>+            status = self.call(c)</div><div class='add'>+            if status:</div><div class='add'>+                Log.error("Commands failed with %s" % status)</div><div class='add'>+                return status</div><div class='add'>+        return 0</div><div class='add'>+</div><div class='add'>+    def _call(self, cmd):</div><div class='add'>+        if not self.shell:</div><div class='add'>+            cmd = shlex.split(cmd)</div><div class='add'>+</div><div class='add'>+        Log.debug("%s&gt; %s" % (self.cwd, cmd))</div><div class='add'>+</div><div class='add'>+        status = subprocess.call(cmd, cwd=self.cwd, shell=self.shell,</div><div class='add'>+                                 stdout=self.redirect, stderr=self.redirect)</div><div class='add'>+</div><div class='add'>+        Log.debug("return %s" % status)</div><div class='add'>+        return status</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+# ..............................................................................</div><div class='add'>+# Server role</div><div class='add'>+# ..............................................................................</div><div class='add'>+</div><div class='add'>+class TestServer:</div><div class='add'>+    def __init__(self, port, scratchdir):</div><div class='add'>+        self.port = port</div><div class='add'>+        self.scratchdir = scratchdir</div><div class='add'>+        self.shell = Shell()</div><div class='add'>+        self.rpc = None</div><div class='add'>+        self.pidf = None</div><div class='add'>+</div><div class='add'>+        self.shell.check_call("mkdir -p %s" % self.scratchdir)</div><div class='add'>+        self._process_lock()</div><div class='add'>+</div><div class='add'>+    def __del__(self):</div><div class='add'>+        if self.pidf:</div><div class='add'>+            self.pidf.close()</div><div class='add'>+</div><div class='add'>+    def init(self):</div><div class='add'>+        Log.debug("Starting xmlrpc server on port %s" % self.port)</div><div class='add'>+        self.rpc = GeneralXMLRPCServer(("", self.port))</div><div class='add'>+        self.rpc.register_instance(Handlers(self.scratchdir))</div><div class='add'>+</div><div class='add'>+    def serve(self):</div><div class='add'>+        (status, _) = failsafe(self.rpc.serve_forever)</div><div class='add'>+        Log.cli("== End ==")</div><div class='add'>+</div><div class='add'>+    def _process_lock(self):</div><div class='add'>+        pid_filename = os.path.basename(__file__).replace("/", "-")</div><div class='add'>+        pid_filepath = "%s/%s.pid" % (self.scratchdir, pid_filename)</div><div class='add'>+        self.pidf = open(pid_filepath, "w")</div><div class='add'>+        try:</div><div class='add'>+            fcntl.lockf(self.pidf, fcntl.LOCK_EX | fcntl.LOCK_NB)</div><div class='add'>+            # We have the lock, kick anybody listening on this port</div><div class='add'>+            self.shell.call("kill $(lsof -t -i:%s)" % self.port)</div><div class='add'>+        except IOError:</div><div class='add'>+            Log.error("Another process instance is running")</div><div class='add'>+            sys.exit(0)</div><div class='add'>+</div><div class='add'>+#</div><div class='add'>+# Server Handler</div><div class='add'>+#</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+handler_lock = threading.Lock()</div><div class='add'>+handler_serving_since = Timer()</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def synchronized(func):</div><div class='add'>+    def decorator(*args, **kws):</div><div class='add'>+        handler_lock.acquire()</div><div class='add'>+        h = args[0]</div><div class='add'>+        try:</div><div class='add'>+            h.shell.truncate()</div><div class='add'>+            ret = func(*args, **kws)</div><div class='add'>+            return ret</div><div class='add'>+        except Exception() as err:</div><div class='add'>+            Log.error(str(err))</div><div class='add'>+            Log.error(decode(h._log_content()))</div><div class='add'>+            raise</div><div class='add'>+        finally:</div><div class='add'>+            handler_lock.release()</div><div class='add'>+            handler_serving_since.reset()</div><div class='add'>+</div><div class='add'>+    return decorator</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+class Handlers:</div><div class='add'>+    def __init__(self, scratchdir):</div><div class='add'>+        self.client_id = None</div><div class='add'>+        self.scratchdir = scratchdir</div><div class='add'>+        self.gluster_root = "%s/glusterfs" % self.scratchdir</div><div class='add'>+        self.shell = Shell(logpath="%s/test-handlers.log" % self.scratchdir)</div><div class='add'>+</div><div class='add'>+    def hello(self, id):</div><div class='add'>+        if not handler_lock.acquire(False):</div><div class='add'>+            return False</div><div class='add'>+        try:</div><div class='add'>+            return self._hello_locked(id)</div><div class='add'>+        finally:</div><div class='add'>+            handler_lock.release()</div><div class='add'>+</div><div class='add'>+    def _hello_locked(self, id):</div><div class='add'>+        if handler_serving_since.elapsed_s() &gt; CLIENT_TIMEOUT_S:</div><div class='add'>+            Log.debug("Disconnected client %s" % self.client_id)</div><div class='add'>+            self.client_id = None</div><div class='add'>+</div><div class='add'>+        if not self.client_id:</div><div class='add'>+            self.client_id = id</div><div class='add'>+            handler_serving_since.reset()</div><div class='add'>+            return True</div><div class='add'>+</div><div class='add'>+        return (id == self.client_id)</div><div class='add'>+</div><div class='add'>+    @synchronized</div><div class='add'>+    def ping(self, id=None):</div><div class='add'>+        if id:</div><div class='add'>+            return id == self.client_id</div><div class='add'>+        return True</div><div class='add'>+</div><div class='add'>+    @synchronized</div><div class='add'>+    def bye(self, id):</div><div class='add'>+        assert id == self.client_id</div><div class='add'>+        self.client_id = None</div><div class='add'>+        handler_serving_since.reset()</div><div class='add'>+        return True</div><div class='add'>+</div><div class='add'>+    @synchronized</div><div class='add'>+    def cleanup(self, id):</div><div class='add'>+        assert id == self.client_id</div><div class='add'>+        self.shell.cd(self.gluster_root)</div><div class='add'>+        self.shell.check_call("PATH=.:$PATH; sudo ./clean_gfs_devserver.sh")</div><div class='add'>+        return True</div><div class='add'>+</div><div class='add'>+    @synchronized</div><div class='add'>+    def copy(self, id, name, content):</div><div class='add'>+        with open("%s/%s" % (self.scratchdir, name), "w+") as f:</div><div class='add'>+            f.write(decode(content))</div><div class='add'>+        return True</div><div class='add'>+</div><div class='add'>+    @synchronized</div><div class='add'>+    def copygzip(self, id, content):</div><div class='add'>+        assert id == self.client_id</div><div class='add'>+        gzipfile = "%s/tmp.tar.gz" % self.scratchdir</div><div class='add'>+        tarfile = "%s/tmp.tar" % self.scratchdir</div><div class='add'>+        self.shell.check_call("rm -f %s" % gzipfile)</div><div class='add'>+        self.shell.check_call("rm -f %s" % tarfile)</div><div class='add'>+        write_to_file(gzipfile, decode(content))</div><div class='add'>+</div><div class='add'>+        self.shell.cd(self.scratchdir)</div><div class='add'>+        self.shell.check_call("rm -r -f %s" % self.gluster_root)</div><div class='add'>+        self.shell.check_call("mkdir -p %s" % self.gluster_root)</div><div class='add'>+</div><div class='add'>+        self.shell.cd(self.gluster_root)</div><div class='add'>+        cmds = [</div><div class='add'>+            "gunzip -f -q %s" % gzipfile,</div><div class='add'>+            "tar -xvf %s" % tarfile</div><div class='add'>+        ]</div><div class='add'>+        return self.shell.call(cmds) == 0</div><div class='add'>+</div><div class='add'>+    @synchronized</div><div class='add'>+    def build(self, id, asan=False):</div><div class='add'>+        assert id == self.client_id</div><div class='add'>+        self.shell.cd(self.gluster_root)</div><div class='add'>+        self.shell.call("make clean")</div><div class='add'>+        env = "ASAN_ENABLED=1" if asan else ""</div><div class='add'>+        return self.shell.call(</div><div class='add'>+		"%s ./extras/distributed-testing/distributed-test-build.sh" % env) == 0</div><div class='add'>+</div><div class='add'>+    @synchronized</div><div class='add'>+    def install(self, id):</div><div class='add'>+        assert id == self.client_id</div><div class='add'>+        self.shell.cd(self.gluster_root)</div><div class='add'>+        return self.shell.call("make install") == 0</div><div class='add'>+</div><div class='add'>+    @synchronized</div><div class='add'>+    def prove(self, id, test, timeout, valgrind="no", asan_noleaks=True):</div><div class='add'>+        assert id == self.client_id</div><div class='add'>+        self.shell.cd(self.gluster_root)</div><div class='add'>+        env = "DEBUG=1 "</div><div class='add'>+        if valgrind == "memcheck" or valgrind == "yes":</div><div class='add'>+            cmd = "valgrind"</div><div class='add'>+            cmd += " --tool=memcheck --leak-check=full --track-origins=yes"</div><div class='add'>+            cmd += " --show-leak-kinds=all -v prove -v"</div><div class='add'>+        elif valgrind == "drd":</div><div class='add'>+            cmd = "valgrind"</div><div class='add'>+            cmd += " --tool=drd -v prove -v"</div><div class='add'>+        elif asan_noleaks:</div><div class='add'>+            cmd = "prove -v"</div><div class='add'>+            env += "ASAN_OPTIONS=detect_leaks=0 "</div><div class='add'>+        else:</div><div class='add'>+            cmd = "prove -v"</div><div class='add'>+</div><div class='add'>+        status = self.shell.call(</div><div class='add'>+		"%s timeout %s %s %s" % (env, timeout, cmd, test))</div><div class='add'>+</div><div class='add'>+        if status != 0:</div><div class='add'>+            return (False, self._log_content())</div><div class='add'>+        return (True, "")</div><div class='add'>+</div><div class='add'>+    def _log_content(self):</div><div class='add'>+        return encode(self.shell.read_logs())</div><div class='add'>+</div><div class='add'>+# ..............................................................................</div><div class='add'>+# Cli role</div><div class='add'>+# ..............................................................................</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+class RPCConnection((threading.Thread)):</div><div class='add'>+    def __init__(self, host, port, path, cb):</div><div class='add'>+        threading.Thread.__init__(self)</div><div class='add'>+        self.host = host</div><div class='add'>+        self.port = port</div><div class='add'>+        self.path = path</div><div class='add'>+        self.shell = Shell()</div><div class='add'>+        self.cb = cb</div><div class='add'>+        self.stop = False</div><div class='add'>+        self.proxy = None</div><div class='add'>+        self.logid = "%s:%s" % (self.host, self.port)</div><div class='add'>+</div><div class='add'>+    def connect(self):</div><div class='add'>+        (status, ret) = failsafe(self._connect)</div><div class='add'>+        return (status and ret)</div><div class='add'>+</div><div class='add'>+    def _connect(self):</div><div class='add'>+        url = "http://%s:%s" % (self.host, self.port)</div><div class='add'>+        self.proxy = xmlrpclib.ServerProxy(url, transport=IPTransport())</div><div class='add'>+        return self.proxy.hello(self.cb.id)</div><div class='add'>+</div><div class='add'>+    def disconnect(self):</div><div class='add'>+        self.stop = True</div><div class='add'>+</div><div class='add'>+    def ping(self):</div><div class='add'>+        return self.proxy.ping()</div><div class='add'>+</div><div class='add'>+    def init(self):</div><div class='add'>+        return self._copy() and self._compile_and_install()</div><div class='add'>+</div><div class='add'>+    def run(self):</div><div class='add'>+        (status, ret) = failsafe(self.init)</div><div class='add'>+        if not status:</div><div class='add'>+            self.cb.note_lost_connection(self)</div><div class='add'>+            return</div><div class='add'>+        elif not ret:</div><div class='add'>+            self.cb.note_setup_failed(self)</div><div class='add'>+            return</div><div class='add'>+</div><div class='add'>+        while not self.stop:</div><div class='add'>+            (status, ret) = failsafe(self._run)</div><div class='add'>+            if not status or not ret:</div><div class='add'>+                self.cb.note_lost_connection(self)</div><div class='add'>+                break</div><div class='add'>+            time.sleep(0)</div><div class='add'>+</div><div class='add'>+        failsafe(self.proxy.bye, (self.cb.id,))</div><div class='add'>+        Log.debug("%s connection thread stopped" % self.host)</div><div class='add'>+</div><div class='add'>+    def _run(self):</div><div class='add'>+        test = self.cb.next_test()</div><div class='add'>+        (status, _) = failsafe(self._execute_next, (test,))</div><div class='add'>+        if not status:</div><div class='add'>+            self.cb.note_retry(test)</div><div class='add'>+            return False</div><div class='add'>+        return True</div><div class='add'>+</div><div class='add'>+    def _execute_next(self, test):</div><div class='add'>+        if not test:</div><div class='add'>+            time.sleep(1)</div><div class='add'>+            return</div><div class='add'>+</div><div class='add'>+        (status, error) = self.proxy.prove(self.cb.id, test,</div><div class='add'>+                                           self.cb.test_timeout,</div><div class='add'>+                                           self.cb.valgrind,</div><div class='add'>+                                           self.cb.asan_noleaks)</div><div class='add'>+        if status:</div><div class='add'>+            self.cb.note_done(test)</div><div class='add'>+        else:</div><div class='add'>+            self.cb.note_error(test, error)</div><div class='add'>+</div><div class='add'>+    def _compile_and_install(self):</div><div class='add'>+        Log.debug("&lt;%s&gt; Build " % self.logid)</div><div class='add'>+        asan = self.cb.asan or self.cb.asan_noleaks</div><div class='add'>+        return (self.proxy.build(self.cb.id, asan) and</div><div class='add'>+                self.proxy.install(self.cb.id))</div><div class='add'>+</div><div class='add'>+    def _copy(self):</div><div class='add'>+        return self._copy_gzip()</div><div class='add'>+</div><div class='add'>+    def _copy_gzip(self):</div><div class='add'>+        Log.cli("&lt;%s&gt; copying and compiling %s to remote" %</div><div class='add'>+                 (self.logid, self.path))</div><div class='add'>+        data = encode(get_file_content(patch_file()))</div><div class='add'>+        Log.debug("GZIP size = %s B" % len(data))</div><div class='add'>+        return self.proxy.copygzip(self.cb.id, data)</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+class RPCConnectionPool:</div><div class='add'>+    def __init__(self, gluster_path, hosts, n, id_rsa):</div><div class='add'>+        self.gluster_path = gluster_path</div><div class='add'>+        self.hosts = hosts</div><div class='add'>+        self.conns = []</div><div class='add'>+        self.faulty = []</div><div class='add'>+        self.n = int(len(hosts) / 2) + 1 if not n else n</div><div class='add'>+        self.id_rsa = id_rsa</div><div class='add'>+        self.stop = False</div><div class='add'>+        self.scanner = threading.Thread(target=self._scan_hosts_loop)</div><div class='add'>+        self.kicker = threading.Thread(target=self._kick_hosts_loop)</div><div class='add'>+        self.shell = Shell()</div><div class='add'>+        self.since_start = Timer()</div><div class='add'>+</div><div class='add'>+        self.shell.check_call("rm -f %s" % patch_file())</div><div class='add'>+        self.shell.check_call("tar -zcvf %s ." % patch_file())</div><div class='add'>+        self.id = md5.new(get_file_content(patch_file())).hexdigest()</div><div class='add'>+        Log.cli("client UID %s" % self.id)</div><div class='add'>+        Log.cli("patch UID %s" % PATCH_FILE_UID)</div><div class='add'>+</div><div class='add'>+    def __del__(self):</div><div class='add'>+        self.shell.check_call("rm -f %s" % patch_file())</div><div class='add'>+</div><div class='add'>+    def pool_status(self):</div><div class='add'>+        elapsed_m = int(self.since_start.elapsed_s() / 60)</div><div class='add'>+        return "%s/%s connected, %smin elapsed" % (len(self.conns), self.n,</div><div class='add'>+                                                   elapsed_m)</div><div class='add'>+</div><div class='add'>+    def connect(self):</div><div class='add'>+        Log.debug("Starting scanner")</div><div class='add'>+        self.scanner.start()</div><div class='add'>+        self.kicker.start()</div><div class='add'>+</div><div class='add'>+    def disconnect(self):</div><div class='add'>+        self.stop = True</div><div class='add'>+        for conn in self.conns:</div><div class='add'>+            conn.disconnect()</div><div class='add'>+</div><div class='add'>+    def note_lost_connection(self, conn):</div><div class='add'>+        Log.cli("lost connection to %s" % conn.host)</div><div class='add'>+        self.conns.remove(conn)</div><div class='add'>+        self.hosts.append((conn.host, conn.port))</div><div class='add'>+</div><div class='add'>+    def note_setup_failed(self, conn):</div><div class='add'>+        Log.error("Setup failed on %s:%s" % (conn.host, conn.port))</div><div class='add'>+        self.conns.remove(conn)</div><div class='add'>+        self.faulty.append((conn.host, conn.port))</div><div class='add'>+</div><div class='add'>+    def _scan_hosts_loop(self):</div><div class='add'>+        Log.debug("Scanner thread started")</div><div class='add'>+        while not self.stop:</div><div class='add'>+            failsafe(self._scan_hosts)</div><div class='add'>+            time.sleep(5)</div><div class='add'>+</div><div class='add'>+    def _scan_hosts(self):</div><div class='add'>+        if len(self.hosts) == 0 and len(self.conns) == 0:</div><div class='add'>+            Log.error("no more hosts available to loadbalance")</div><div class='add'>+            sys.exit(1)</div><div class='add'>+</div><div class='add'>+        for (host, port) in self.hosts:</div><div class='add'>+            if (len(self.conns) &gt;= self.n) or self.stop:</div><div class='add'>+                break</div><div class='add'>+            self._scan_host(host, port)</div><div class='add'>+</div><div class='add'>+    def _scan_host(self, host, port):</div><div class='add'>+        Log.debug("scanning %s:%s" % (host, port))</div><div class='add'>+        c = RPCConnection(host, port, self.gluster_path, self)</div><div class='add'>+        (status, result) = failsafe(c.connect)</div><div class='add'>+        if status and result:</div><div class='add'>+            self.hosts.remove((host, port))</div><div class='add'>+            Log.debug("Connected to %s:%s" % (host, port))</div><div class='add'>+            self.conns.append(c)</div><div class='add'>+            c.start()</div><div class='add'>+            Log.debug("%s / %s connected" % (len(self.conns), self.n))</div><div class='add'>+        else:</div><div class='add'>+            Log.debug("Failed to connect to %s:%s" % (host, port))</div><div class='add'>+</div><div class='add'>+    def _kick_hosts_loop(self):</div><div class='add'>+        Log.debug("Kick thread started")</div><div class='add'>+        while not self.stop:</div><div class='add'>+            time.sleep(10)</div><div class='add'>+            failsafe(self._kick_hosts)</div><div class='add'>+</div><div class='add'>+        Log.debug("Kick thread stopped")</div><div class='add'>+</div><div class='add'>+    def _is_pingable(self, host, port):</div><div class='add'>+        c = RPCConnection(host, port, self.gluster_path, self)</div><div class='add'>+        failsafe(c.connect)</div><div class='add'>+        (status, result) = failsafe(c.ping)</div><div class='add'>+        return status and result</div><div class='add'>+</div><div class='add'>+    def _kick_hosts(self):</div><div class='add'>+        # Do not kick hosts if we have the optimal number of connections</div><div class='add'>+        if (len(self.conns) &gt;= self.n) or self.stop:</div><div class='add'>+            Log.debug("Skip kicking hosts")</div><div class='add'>+            return</div><div class='add'>+</div><div class='add'>+        # Check and if dead kick all hosts</div><div class='add'>+        for (host, port) in self.hosts:</div><div class='add'>+            if self.stop:</div><div class='add'>+                Log.debug("Break kicking hosts")</div><div class='add'>+                break</div><div class='add'>+</div><div class='add'>+            if self._is_pingable(host, port):</div><div class='add'>+                Log.debug("Host=%s is alive. Won't kick" % host)</div><div class='add'>+                continue</div><div class='add'>+</div><div class='add'>+            Log.debug("Kicking %s" % host)</div><div class='add'>+            mypath = sys.argv[0]</div><div class='add'>+            myname = os.path.basename(mypath)</div><div class='add'>+            destpath = "/tmp/%s" % myname</div><div class='add'>+            sh = Shell()</div><div class='add'>+            sh.scp(host, mypath, destpath, self.id_rsa)</div><div class='add'>+            sh.ssh(host, "nohup %s --server &amp;&gt;&gt; %s.log &amp;" %</div><div class='add'>+                         (destpath, destpath), self.id_rsa)</div><div class='add'>+</div><div class='add'>+    def join(self):</div><div class='add'>+        self.scanner.join()</div><div class='add'>+        self.kicker.join()</div><div class='add'>+        for c in self.conns:</div><div class='add'>+            c.join()</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+# ..............................................................................</div><div class='add'>+# test role</div><div class='add'>+# ..............................................................................</div><div class='add'>+</div><div class='add'>+class TestRunner(RPCConnectionPool):</div><div class='add'>+    def __init__(self, gluster_path, hosts, n, tests, flaky_tests, valgrind,</div><div class='add'>+                 asan, asan_noleaks, id_rsa, test_timeout):</div><div class='add'>+        RPCConnectionPool.__init__(self, gluster_path, self._parse_hosts(hosts),</div><div class='add'>+                                   n, id_rsa)</div><div class='add'>+        self.flaky_tests = flaky_tests.split(" ")</div><div class='add'>+        self.pending = []</div><div class='add'>+        self.done = []</div><div class='add'>+        self.error = []</div><div class='add'>+        self.retry = {}</div><div class='add'>+        self.error_logs = []</div><div class='add'>+        self.stats_timer = Timer()</div><div class='add'>+        self.valgrind = valgrind</div><div class='add'>+        self.asan = asan</div><div class='add'>+        self.asan_noleaks = asan_noleaks</div><div class='add'>+        self.test_timeout = test_timeout</div><div class='add'>+</div><div class='add'>+        self.tests = self._get_tests(tests)</div><div class='add'>+</div><div class='add'>+        Log.debug("tests: %s" % self.tests)</div><div class='add'>+</div><div class='add'>+    def _get_tests(self, tests):</div><div class='add'>+        if not tests or tests == "all":</div><div class='add'>+            return self._not_flaky(self._all())</div><div class='add'>+        elif tests == "flaky":</div><div class='add'>+            return self.flaky_tests</div><div class='add'>+        else:</div><div class='add'>+            return self._not_flaky(tests.strip().split(" "))</div><div class='add'>+</div><div class='add'>+    def run(self):</div><div class='add'>+        self.connect()</div><div class='add'>+        self.join()</div><div class='add'>+        return len(self.error)</div><div class='add'>+</div><div class='add'>+    def _pretty_print(self, data):</div><div class='add'>+        if isinstance(data, list):</div><div class='add'>+            str = ""</div><div class='add'>+            for i in data:</div><div class='add'>+                str = "%s %s" % (str, i)</div><div class='add'>+            return str</div><div class='add'>+        return "%s" % data</div><div class='add'>+</div><div class='add'>+    def print_result(self):</div><div class='add'>+        Log.cli("== RESULTS ==")</div><div class='add'>+        Log.cli("SUCCESS  : %s" % len(self.done))</div><div class='add'>+        Log.cli("ERRORS   : %s" % len(self.error))</div><div class='add'>+        Log.cli("== ERRORS ==")</div><div class='add'>+        Log.cli(self._pretty_print(self.error))</div><div class='add'>+        Log.cli("== LOGS ==")</div><div class='add'>+        Log.cli(self._pretty_print(self.error_logs))</div><div class='add'>+        Log.cli("== END ==")</div><div class='add'>+</div><div class='add'>+    def next_test(self):</div><div class='add'>+        if len(self.tests):</div><div class='add'>+            test = self.tests.pop()</div><div class='add'>+            self.pending.append(test)</div><div class='add'>+            return test</div><div class='add'>+</div><div class='add'>+        if not len(self.pending):</div><div class='add'>+            self.disconnect()</div><div class='add'>+</div><div class='add'>+        return None</div><div class='add'>+</div><div class='add'>+    def _pct_completed(self):</div><div class='add'>+        total = len(self.tests) + len(self.pending) + len(self.done)</div><div class='add'>+        total += len(self.error)</div><div class='add'>+        completed = len(self.done) + len(self.error)</div><div class='add'>+        return 0 if not total else int(completed / total * 100)</div><div class='add'>+</div><div class='add'>+    def note_done(self, test):</div><div class='add'>+        Log.cli("%s PASS (%s%% done) (%s)" % (test, self._pct_completed(),</div><div class='add'>+                                              self.pool_status()))</div><div class='add'>+        self.pending.remove(test)</div><div class='add'>+        self.done.append(test)</div><div class='add'>+        if test in self.retry:</div><div class='add'>+            del self.retry[test]</div><div class='add'>+</div><div class='add'>+    def note_error(self, test, errstr):</div><div class='add'>+        Log.cli("%s FAIL" % test)</div><div class='add'>+        self.pending.remove(test)</div><div class='add'>+        if test not in self.retry:</div><div class='add'>+            self.retry[test] = 1</div><div class='add'>+</div><div class='add'>+        if errstr:</div><div class='add'>+            path = "%s/%s-%s.log" % ("/tmp", test.replace("/", "-"),</div><div class='add'>+                                     self.retry[test])</div><div class='add'>+            failsafe(write_to_file, (path, decode(errstr),))</div><div class='add'>+            self.error_logs.append(path)</div><div class='add'>+</div><div class='add'>+        if self.retry[test] &lt; MAX_ATTEMPTS:</div><div class='add'>+            self.retry[test] += 1</div><div class='add'>+            Log.debug("retry test %s attempt %s" % (test, self.retry[test]))</div><div class='add'>+            self.tests.append(test)</div><div class='add'>+        else:</div><div class='add'>+            Log.debug("giveup attempt test %s" % test)</div><div class='add'>+            del self.retry[test]</div><div class='add'>+            self.error.append(test)</div><div class='add'>+</div><div class='add'>+    def note_retry(self, test):</div><div class='add'>+        Log.cli("retry %s on another host" % test)</div><div class='add'>+        self.pending.remove(test)</div><div class='add'>+        self.tests.append(test)</div><div class='add'>+</div><div class='add'>+    #</div><div class='add'>+    # test classifications</div><div class='add'>+    #</div><div class='add'>+    def _all(self):</div><div class='add'>+        return self._list_tests(["tests"], recursive=True)</div><div class='add'>+</div><div class='add'>+    def _not_flaky(self, tests):</div><div class='add'>+        for t in self.flaky_tests:</div><div class='add'>+            if t in tests:</div><div class='add'>+                tests.remove(t)</div><div class='add'>+        return tests</div><div class='add'>+</div><div class='add'>+    def _list_tests(self, prefixes, recursive=False, ignore_ifnotexist=False):</div><div class='add'>+        tests = []</div><div class='add'>+        for prefix in prefixes:</div><div class='add'>+            real_path = "%s/%s" % (self.gluster_path, prefix)</div><div class='add'>+            if not os.path.exists(real_path) and ignore_ifnotexist:</div><div class='add'>+                continue</div><div class='add'>+            for f in os.listdir(real_path):</div><div class='add'>+                if os.path.isdir(real_path + "/" + f):</div><div class='add'>+                    if recursive:</div><div class='add'>+                        tests += self._list_tests([prefix + "/" + f], recursive)</div><div class='add'>+                else:</div><div class='add'>+                    if re.match(r".*\.t$", f):</div><div class='add'>+                        tests += [prefix + "/" + f]</div><div class='add'>+        return tests</div><div class='add'>+</div><div class='add'>+    def _parse_hosts(self, hosts):</div><div class='add'>+        ret = []</div><div class='add'>+        for h in args.hosts.split(" "):</div><div class='add'>+            ret.append((h, DEFAULT_PORT))</div><div class='add'>+        Log.debug(ret)</div><div class='add'>+        return ret</div><div class='add'>+</div><div class='add'>+# ..............................................................................</div><div class='add'>+# Roles entry point</div><div class='add'>+# ..............................................................................</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def run_as_server(args):</div><div class='add'>+    if not args.server_path:</div><div class='add'>+        Log.error("please provide server path")</div><div class='add'>+        return 1</div><div class='add'>+</div><div class='add'>+    server = TestServer(args.port, args.server_path)</div><div class='add'>+    server.init()</div><div class='add'>+    server.serve()</div><div class='add'>+    return 0</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def run_as_tester(args):</div><div class='add'>+    Log.header("GLUSTER TEST CLI")</div><div class='add'>+</div><div class='add'>+    Log.debug("args = %s" % args)</div><div class='add'>+</div><div class='add'>+    tests = TestRunner(args.gluster_path, args.hosts, args.n, args.tests,</div><div class='add'>+                       args.flaky_tests, valgrind=args.valgrind,</div><div class='add'>+                       asan=args.asan, asan_noleaks=args.asan_noleaks,</div><div class='add'>+                       id_rsa=args.id_rsa, test_timeout=args.test_timeout)</div><div class='add'>+    result = tests.run()</div><div class='add'>+    tests.print_result()</div><div class='add'>+    return result</div><div class='add'>+</div><div class='add'>+# ..............................................................................</div><div class='add'>+# main</div><div class='add'>+# ..............................................................................</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def main(args):</div><div class='add'>+    if args.v:</div><div class='add'>+        Log.LOGLEVEL = LogLevel.DEBUG</div><div class='add'>+</div><div class='add'>+    if args.server and args.tester:</div><div class='add'>+        Log.error("Invalid arguments. More than one role specified")</div><div class='add'>+        sys.exit(1)</div><div class='add'>+</div><div class='add'>+    if args.server:</div><div class='add'>+        sys.exit(run_as_server(args))</div><div class='add'>+    elif args.tester:</div><div class='add'>+        sys.exit(run_as_tester(args))</div><div class='add'>+    else:</div><div class='add'>+        Log.error("please specify a mode for CI")</div><div class='add'>+        parser.print_help()</div><div class='add'>+        sys.exit(1)</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+parser = argparse.ArgumentParser(description="Gluster CI")</div><div class='add'>+</div><div class='add'>+# server role</div><div class='add'>+parser.add_argument("--server", help="start server", action="store_true")</div><div class='add'>+parser.add_argument("--server_path", help="server scratch space",</div><div class='add'>+                    default="/tmp/gluster-test")</div><div class='add'>+parser.add_argument("--host", help="server address to listen", default="")</div><div class='add'>+parser.add_argument("--port", help="server port to listen",</div><div class='add'>+                    type=int, default=DEFAULT_PORT)</div><div class='add'>+# test role</div><div class='add'>+parser.add_argument("--tester", help="start tester", action="store_true")</div><div class='add'>+parser.add_argument("--valgrind[=memcheck,drd]",</div><div class='add'>+                    help="run tests with valgrind tool 'memcheck' or 'drd'",</div><div class='add'>+                    default="no")</div><div class='add'>+parser.add_argument("--asan", help="test with asan enabled",</div><div class='add'>+                    action="store_true")</div><div class='add'>+parser.add_argument("--asan-noleaks", help="test with asan but no mem leaks",</div><div class='add'>+                    action="store_true")</div><div class='add'>+parser.add_argument("--tests", help="all/flaky/list of tests", default=None)</div><div class='add'>+parser.add_argument("--flaky_tests", help="list of flaky tests", default=None)</div><div class='add'>+parser.add_argument("--n", help="max number of machines to use", type=int,</div><div class='add'>+                    default=0)</div><div class='add'>+parser.add_argument("--hosts", help="list of worker machines")</div><div class='add'>+parser.add_argument("--gluster_path", help="gluster path to test",</div><div class='add'>+                    default=os.getcwd())</div><div class='add'>+parser.add_argument("--id-rsa", help="private key to use for ssh",</div><div class='add'>+                    default=None)</div><div class='add'>+parser.add_argument("--test-timeout",</div><div class='add'>+                    help="test timeout in sec (default 15min)",</div><div class='add'>+                    default=TEST_TIMEOUT_S)</div><div class='add'>+# general</div><div class='add'>+parser.add_argument("-v", help="verbose", action="store_true")</div><div class='add'>+parser.add_argument("--address_family", help="IPv6 or IPv4 to use",</div><div class='add'>+                    default=ADDRESS_FAMILY)</div><div class='add'>+</div><div class='add'>+args = parser.parse_args()</div><div class='add'>+</div><div class='add'>+main(args)</div><div class='head'>diff --git a/extras/distributed-testing/distributed-test.sh b/extras/distributed-testing/distributed-test.sh<br/>new file mode 100755<br/>index 00000000000..8f1e0310f33<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/extras/distributed-testing/distributed-test.sh?id=d1d7a6f35c816822fab51c820e25023863c239c1'>extras/distributed-testing/distributed-test.sh</a></div><div class='hunk'>@@ -0,0 +1,95 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+source ./extras/distributed-testing/distributed-test-env</div><div class='add'>+</div><div class='add'>+N=0</div><div class='add'>+TESTS='all'</div><div class='add'>+FLAKY=$KNOWN_FLAKY_TESTS</div><div class='add'>+BROKEN=$BROKEN_TESTS</div><div class='add'>+TEST_TIMEOUT_S=900</div><div class='add'>+ADDRESS_FAMILY='IPv4'</div><div class='add'>+</div><div class='add'>+FLAGS=""</div><div class='add'>+</div><div class='add'>+function print_env {</div><div class='add'>+    echo "Settings:"</div><div class='add'>+    echo "N=$N"</div><div class='add'>+    echo -e "-------\nHOSTS\n$HOSTS\n-------"</div><div class='add'>+    echo -e "TESTS\n$TESTS\n-------"</div><div class='add'>+    echo -e "SKIP\n$FLAKY $BROKEN\n-------"</div><div class='add'>+    echo -e "TEST_TIMEOUT_S=$TEST_TIMEOUT_S s\n"</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function cleanup {</div><div class='add'>+    rm -f /tmp/test*.log</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function usage {</div><div class='add'>+    echo "Usage: $0 [-h or --help] [-v or --verbose]</div><div class='add'>+             [--all] [--flaky] [--smoke] [--broken]</div><div class='add'>+             [--valgrind] [--asan] [--asan-noleaks]</div><div class='add'>+             [--hosts &lt;hosts&gt;] [-n &lt;parallelism&gt;]</div><div class='add'>+             [--tests &lt;tests&gt;]</div><div class='add'>+             [--id-rsa &lt;ssh private key&gt;]</div><div class='add'>+             [--address_family &lt;IPv4 or IPv6&gt;]</div><div class='add'>+    "</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function parse_args () {</div><div class='add'>+    args=`getopt \</div><div class='add'>+            -o hvn: \</div><div class='add'>+            --long help,verbose,address_family:,valgrind,asan,asan-noleaks,all,\</div><div class='add'>+smoke,flaky,broken,hosts:,tests:,id-rsa:,test-timeout: \</div><div class='add'>+            -n 'fb-remote-test.sh' --  "$@"`</div><div class='add'>+</div><div class='add'>+    if [ $? != 0 ]; then</div><div class='add'>+        echo "Error parsing getopt"</div><div class='add'>+        exit 1</div><div class='add'>+    fi</div><div class='add'>+</div><div class='add'>+    eval set -- "$args"</div><div class='add'>+</div><div class='add'>+    while true; do</div><div class='add'>+        case "$1" in</div><div class='add'>+            -h | --help) usage ; exit 1 ;;</div><div class='add'>+            -v | --verbose) FLAGS="$FLAGS -v" ; shift ;;</div><div class='add'>+            --address_family) ADDRESS_FAMILY=$2; shift 2 ;;</div><div class='add'>+            --valgrind) FLAGS="$FLAGS --valgrind" ; shift ;;</div><div class='add'>+            --asan-noleaks) FLAGS="$FLAGS --asan-noleaks"; shift ;;</div><div class='add'>+            --asan) FLAGS="$FLAGS --asan" ; shift ;;</div><div class='add'>+            --hosts) HOSTS=$2; shift 2 ;;</div><div class='add'>+            --tests) TESTS=$2; FLAKY= ; BROKEN= ; shift 2 ;;</div><div class='add'>+            --test-timeout) TEST_TIMEOUT_S=$2; shift 2 ;;</div><div class='add'>+            --all) TESTS='all' ; shift 1 ;;</div><div class='add'>+            --flaky) TESTS=$FLAKY; FLAKY= ; shift 1 ;;</div><div class='add'>+            --smoke) TESTS=$SMOKE_TESTS; shift 1 ;;</div><div class='add'>+            --broken) TESTS=$BROKEN_TESTS; FLAKY= ; BROKEN= ; shift 1 ;;</div><div class='add'>+            --id-rsa) FLAGS="$FLAGS --id-rsa $2" ; shift 2 ;;</div><div class='add'>+            -n) N=$2; shift 2 ;;</div><div class='add'>+            *) break ;;</div><div class='add'>+            esac</div><div class='add'>+        done</div><div class='add'>+        run_tests_args="$@"</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function main {</div><div class='add'>+    parse_args "$@"</div><div class='add'>+</div><div class='add'>+    if [ -z "$HOSTS" ]; then</div><div class='add'>+        echo "Please provide hosts to run the tests in"</div><div class='add'>+	exit -1</div><div class='add'>+    fi</div><div class='add'>+</div><div class='add'>+    print_env</div><div class='add'>+</div><div class='add'>+    cleanup</div><div class='add'>+</div><div class='add'>+    "extras/distributed-testing/distributed-test-runner.py" $FLAGS --tester \</div><div class='add'>+        --n "$N" --hosts "$HOSTS" --tests "$TESTS" \</div><div class='add'>+        --flaky_tests "$FLAKY $BROKEN" --test-timeout "$TEST_TIMEOUT_S" \</div><div class='add'>+        --address_family "$ADDRESS_FAMILY"</div><div class='add'>+</div><div class='add'>+    exit $?</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+main "$@"</div><div class='head'>diff --git a/extras/ec-heal-script/README.md b/extras/ec-heal-script/README.md<br/>new file mode 100644<br/>index 00000000000..aaefd6681f6<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/extras/ec-heal-script/README.md?id=d1d7a6f35c816822fab51c820e25023863c239c1'>extras/ec-heal-script/README.md</a></div><div class='hunk'>@@ -0,0 +1,69 @@</div><div class='add'>+# gluster-heal-scripts</div><div class='add'>+Scripts to correct extended attributes of fragments of files to make them healble.</div><div class='add'>+</div><div class='add'>+Following are the guidelines/suggestions to use these scripts.</div><div class='add'>+</div><div class='add'>+1 - Passwordless ssh should be setup for all the nodes of the cluster.</div><div class='add'>+</div><div class='add'>+2 - Scripts should be executed from one of these nodes.</div><div class='add'>+</div><div class='add'>+3 - Make sure NO "IO" is going on for the files for which we are running</div><div class='add'>+these two scripts.</div><div class='add'>+</div><div class='add'>+4 - There should be no heal going on for the file for which xattrs are being</div><div class='add'>+set by correct_pending_heals.sh. Disable the self heal while running this script.</div><div class='add'>+</div><div class='add'>+5 - All the bricks of the volume should be UP to identify good and bad fragments</div><div class='add'>+and to decide if an entry is healble or not.</div><div class='add'>+</div><div class='add'>+6 - If correct_pending_heals.sh is stopped in the middle while it was processing</div><div class='add'>+healble entries, it is suggested to re-run gfid_needing_heal_parallel.sh to create</div><div class='add'>+latest list of healble and non healble entries and "potential_heal" "can_not_heal" files.</div><div class='add'>+</div><div class='add'>+7 - Based on the number of entries, these files might take time to get and set the</div><div class='add'>+stats and xattrs of entries.</div><div class='add'>+</div><div class='add'>+8 - A backup of the fragments will be taken on &lt;brick path&gt;/.glusterfs/correct_pending_heals</div><div class='add'>+    directory with a file name same as gfid.</div><div class='add'>+</div><div class='add'>+9 - Once the correctness of the file gets verified by user, these backup should be removed.</div><div class='add'>+</div><div class='add'>+10 - Make sure we have enough space on bricks to take these backups.</div><div class='add'>+</div><div class='add'>+11 - At the end this will create two files -</div><div class='add'>+     1 - modified_and_backedup_files - Contains list of files which have been modified and should be healed.</div><div class='add'>+     2 - can_not_heal - Contains list of files which can not be healed.</div><div class='add'>+</div><div class='add'>+12 - It is suggested that the integrity of the data of files, which were modified and healed,</div><div class='add'>+     should be checked by the user.</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+Usage:</div><div class='add'>+</div><div class='add'>+Following are the sequence of steps to use these scripts -</div><div class='add'>+</div><div class='add'>+1 - ./gfid_needing_heal_parallel.sh &lt;volume name&gt;</div><div class='add'>+</div><div class='add'>+    Execute gfid_needing_heal_parallel.sh with volume name to create list of files which could</div><div class='add'>+    be healed and can not be healed. It creates "potential_heal" and "can_not_heal" files.</div><div class='add'>+    During execution, it also displays the list of files on consol with the verdict.</div><div class='add'>+</div><div class='add'>+2 - ./correct_pending_heals.sh</div><div class='add'>+</div><div class='add'>+    Execute correct_pending_heals.sh without any argument. This script processes entries present</div><div class='add'>+    in "heal" file. It asks user to enter how many files we want to process in one attempt.</div><div class='add'>+    Once the count is provided, this script will fetch the entries one by one from "potential_heal" file and takes necessary action.</div><div class='add'>+    If at this point also a file can not be healed, it will be pushed to "can_not_heal" file.</div><div class='add'>+    If a file can be healed, this script will modify the xattrs of that file fragments and create an entry in "modified_and_backedup_files" file</div><div class='add'>+</div><div class='add'>+3 - At the end, all the entries of "potential_heal" will be processed and based on the processing only two files will be left.</div><div class='add'>+</div><div class='add'>+     1 - modified_and_backedup_files - Contains list of files which have been modified and should be healed.</div><div class='add'>+     2 - can_not_heal - Contains list of files which can not be healed.</div><div class='add'>+</div><div class='add'>+Logs and other files -</div><div class='add'>+</div><div class='add'>+1 - modified_and_backedup_files  - It contains all the files which could be healed and the location of backup of each fragments.</div><div class='add'>+2 - can_not_heal - It contains all the files which can not be healed.</div><div class='add'>+3 - potential_heal - List of files which could be healed and should be processed by "correct_pending_heals.sh"</div><div class='add'>+4 - /var/log/glusterfs/ec-heal-script.log - It contains logs of both the files.</div><div class='head'>diff --git a/extras/ec-heal-script/correct_pending_heals.sh b/extras/ec-heal-script/correct_pending_heals.sh<br/>new file mode 100755<br/>index 00000000000..c9f19dd7c89<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/extras/ec-heal-script/correct_pending_heals.sh?id=d1d7a6f35c816822fab51c820e25023863c239c1'>extras/ec-heal-script/correct_pending_heals.sh</a></div><div class='hunk'>@@ -0,0 +1,415 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+#  Copyright (c) 2019-2020 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+#  This file is part of GlusterFS.</div><div class='add'>+#</div><div class='add'>+#  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+#  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+#  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+#  cases as published by the Free Software Foundation.</div><div class='add'>+</div><div class='add'>+# This script finally resets the xattrs of all the fragments of a file</div><div class='add'>+# which can be healed as per gfid_needing_heal_parallel.sh.</div><div class='add'>+# gfid_needing_heal_parallel.sh will produce two files, potential_heal and can_not_heal.</div><div class='add'>+# This script takes potential_heal as input and resets xattrs of all the fragments</div><div class='add'>+# of those files present in this file and which could be healed as per</div><div class='add'>+# trusted.ec.size xattar of the file else it will place the entry in can_not_heal</div><div class='add'>+# file.  Those entries which must be healed will be place in must_heal file</div><div class='add'>+# after setting xattrs so that user can track those files.</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+MOD_BACKUP_FILES="modified_and_backedup_files"</div><div class='add'>+CAN_NOT_HEAL="can_not_heal"</div><div class='add'>+LOG_DIR="/var/log/glusterfs"</div><div class='add'>+LOG_FILE="$LOG_DIR/ec-heal-script.log"</div><div class='add'>+LINE_SEP="==================================================="</div><div class='add'>+</div><div class='add'>+function heal_log()</div><div class='add'>+{</div><div class='add'>+    echo "$1" &gt;&gt; "$LOG_FILE"</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function desc ()</div><div class='add'>+{</div><div class='add'>+    echo ""</div><div class='add'>+    echo "This script finally resets the xattrs of all the fragments of a file</div><div class='add'>+which can be healed as per gfid_needing_heal_parallel.sh.</div><div class='add'>+gfid_needing_heal_parallel.sh will produce two files, potential_heal and can_not_heal.</div><div class='add'>+This script takes potential_heal as input and resets xattrs of all the fragments</div><div class='add'>+of those files present in this file and which could be healed as per</div><div class='add'>+trusted.ec.size xattar of the file else it will place the entry in can_not_heal</div><div class='add'>+file.  Those entries which must be healed will be place in must_heal file</div><div class='add'>+after setting xattrs so that user can track those files."</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function _init ()</div><div class='add'>+{</div><div class='add'>+    if [ $# -ne 0 ]</div><div class='add'>+    then</div><div class='add'>+        echo "usage: $0"</div><div class='add'>+        desc</div><div class='add'>+        exit 2</div><div class='add'>+    fi</div><div class='add'>+</div><div class='add'>+    if [ ! -f "potential_heal" ]</div><div class='add'>+    then</div><div class='add'>+        echo "Nothing to correct. File "potential_heal" does not exist"</div><div class='add'>+        echo ""</div><div class='add'>+        desc</div><div class='add'>+        exit 2</div><div class='add'>+    fi</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function total_file_size_in_hex()</div><div class='add'>+{</div><div class='add'>+    local frag_size=$1</div><div class='add'>+    local size=0</div><div class='add'>+    local hex_size=""</div><div class='add'>+</div><div class='add'>+    size=$((frag_size * 4))</div><div class='add'>+    hex_size=$(printf '0x%016x' $size)</div><div class='add'>+    echo "$hex_size"</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function backup_file_fragment()</div><div class='add'>+{</div><div class='add'>+    local file_host=$1</div><div class='add'>+    local file_entry=$2</div><div class='add'>+    local gfid_actual_paths=$3</div><div class='add'>+    local brick_root=""</div><div class='add'>+    local temp=""</div><div class='add'>+    local backup_dir=""</div><div class='add'>+    local cmd=""</div><div class='add'>+    local gfid=""</div><div class='add'>+</div><div class='add'>+    brick_root=$(echo "$file_entry" | cut -d "#" -f 1)</div><div class='add'>+    temp=$(echo "$(basename "$BASH_SOURCE")" | cut -d '.' -f 1)</div><div class='add'>+    backup_dir=$(echo "${brick_root}/.glusterfs/${temp}")</div><div class='add'>+    file_entry=${file_entry//#}</div><div class='add'>+</div><div class='add'>+    gfid=$(echo "${gfid_actual_paths}" | cut -d '|' -f 1 | cut -d '/' -f 5)</div><div class='add'>+    echo "${file_host}:${backup_dir}/${gfid}" &gt;&gt; "$MOD_BACKUP_FILES"</div><div class='add'>+</div><div class='add'>+    cmd="mkdir -p ${backup_dir} &amp;&amp; yes | cp -af ${file_entry} ${backup_dir}/${gfid} 2&gt;/dev/null"</div><div class='add'>+    ssh -n "${file_host}" "${cmd}"</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function set_frag_xattr ()</div><div class='add'>+{</div><div class='add'>+    local file_host=$1</div><div class='add'>+    local file_entry=$2</div><div class='add'>+    local good=$3</div><div class='add'>+    local cmd1=""</div><div class='add'>+    local cmd2=""</div><div class='add'>+    local cmd=""</div><div class='add'>+    local version="0x00000000000000010000000000000001"</div><div class='add'>+    local dirty="0x00000000000000010000000000000001"</div><div class='add'>+</div><div class='add'>+    if [[ $good -eq 0 ]]</div><div class='add'>+    then</div><div class='add'>+            version="0x00000000000000000000000000000000"</div><div class='add'>+    fi</div><div class='add'>+</div><div class='add'>+    cmd1=" setfattr -n trusted.ec.version -v ${version} ${file_entry} &amp;&amp;"</div><div class='add'>+    cmd2=" setfattr -n trusted.ec.dirty -v ${dirty} ${file_entry}"</div><div class='add'>+    cmd=${cmd1}${cmd2}</div><div class='add'>+    ssh -n "${file_host}" "${cmd}"</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function set_version_dirty_xattr ()</div><div class='add'>+{</div><div class='add'>+    local file_paths=$1</div><div class='add'>+    local good=$2</div><div class='add'>+    local gfid_actual_paths=$3</div><div class='add'>+    local file_entry=""</div><div class='add'>+    local file_host=""</div><div class='add'>+    local bpath=""</div><div class='add'>+</div><div class='add'>+    for bpath in ${file_paths//,/ }</div><div class='add'>+    do</div><div class='add'>+        file_host=$(echo "$bpath" | cut -d ":" -f 1)</div><div class='add'>+        file_entry=$(echo "$bpath" | cut -d ":" -f 2)</div><div class='add'>+        backup_file_fragment "$file_host" "$file_entry" "$gfid_actual_paths"</div><div class='add'>+        file_entry=${file_entry//#}</div><div class='add'>+        set_frag_xattr "$file_host" "$file_entry" "$good"</div><div class='add'>+    done</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function match_size_xattr_quorum ()</div><div class='add'>+{</div><div class='add'>+    local file_paths=$1</div><div class='add'>+    local file_entry=""</div><div class='add'>+    local file_host=""</div><div class='add'>+    local cmd=""</div><div class='add'>+    local size_xattr=""</div><div class='add'>+    local bpath=""</div><div class='add'>+    declare -A xattr_count</div><div class='add'>+</div><div class='add'>+    for bpath in ${file_paths//,/ }</div><div class='add'>+    do</div><div class='add'>+        size_xattr=""</div><div class='add'>+        file_host=$(echo "$bpath" | cut -d ":" -f 1)</div><div class='add'>+        file_entry=$(echo "$bpath" | cut -d ":" -f 2)</div><div class='add'>+        file_entry=${file_entry//#}</div><div class='add'>+</div><div class='add'>+        cmd="getfattr -n trusted.ec.size -d -e hex ${file_entry} 2&gt;/dev/null | grep -w "trusted.ec.size" | cut -d '=' -f 2"</div><div class='add'>+        size_xattr=$(ssh -n "${file_host}" "${cmd}")</div><div class='add'>+        if [[ -n $size_xattr ]]</div><div class='add'>+        then</div><div class='add'>+            count=$((xattr_count["$size_xattr"] + 1))</div><div class='add'>+            xattr_count["$size_xattr"]=${count}</div><div class='add'>+            if [[ $count -ge 4 ]]</div><div class='add'>+            then</div><div class='add'>+                echo "${size_xattr}"</div><div class='add'>+                return</div><div class='add'>+            fi</div><div class='add'>+        fi</div><div class='add'>+    done</div><div class='add'>+    echo "False"</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function match_version_xattr ()</div><div class='add'>+{</div><div class='add'>+    local file_paths=$1</div><div class='add'>+    local file_entry=""</div><div class='add'>+    local file_host=""</div><div class='add'>+    local cmd=""</div><div class='add'>+    local version=""</div><div class='add'>+    local bpath=""</div><div class='add'>+    declare -A ver_count</div><div class='add'>+</div><div class='add'>+    for bpath in ${file_paths//,/ }</div><div class='add'>+    do</div><div class='add'>+        version=""</div><div class='add'>+        file_host=$(echo "$bpath" | cut -d ":" -f 1)</div><div class='add'>+        file_entry=$(echo "$bpath" | cut -d ":" -f 2)</div><div class='add'>+        file_entry=${file_entry//#}</div><div class='add'>+</div><div class='add'>+        cmd="getfattr -n trusted.ec.version -d -e hex ${file_entry} 2&gt;/dev/null | grep -w "trusted.ec.version" | cut -d '=' -f 2"</div><div class='add'>+        version=$(ssh -n "${file_host}" "${cmd}")</div><div class='add'>+        ver_count["$version"]=$((ver_count["$version"] + 1))</div><div class='add'>+    done</div><div class='add'>+    for key in "${ver_count[@]}"</div><div class='add'>+    do</div><div class='add'>+        if [[ $key -ge 4 ]]</div><div class='add'>+        then</div><div class='add'>+            echo "True"</div><div class='add'>+            return</div><div class='add'>+        else</div><div class='add'>+            echo "False"</div><div class='add'>+            return</div><div class='add'>+        fi</div><div class='add'>+    done</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function match_stat_size_with_xattr ()</div><div class='add'>+{</div><div class='add'>+    local bpath=$1</div><div class='add'>+    local size=$2</div><div class='add'>+    local file_stat=$3</div><div class='add'>+    local xattr=$4</div><div class='add'>+    local file_entry=""</div><div class='add'>+    local file_host=""</div><div class='add'>+    local cmd=""</div><div class='add'>+    local stat_output=""</div><div class='add'>+    local hex_size=""</div><div class='add'>+</div><div class='add'>+    file_host=$(echo "$bpath" | cut -d ":" -f 1)</div><div class='add'>+    file_entry=$(echo "$bpath" | cut -d ":" -f 2)</div><div class='add'>+</div><div class='add'>+    file_entry=${file_entry//#}</div><div class='add'>+    cmd="stat --format=%F:%B:%s $file_entry 2&gt;/dev/null"</div><div class='add'>+    stat_output=$(ssh -n "${file_host}" "${cmd}")</div><div class='add'>+    echo "$stat_output" | grep -w "${file_stat}" &gt; /dev/null</div><div class='add'>+</div><div class='add'>+    if [[ $? -eq 0 ]]</div><div class='add'>+    then</div><div class='add'>+        cmd="getfattr -n trusted.ec.size -d -e hex ${file_entry} 2&gt;/dev/null | grep -w "trusted.ec.size" | cut -d '=' -f 2"</div><div class='add'>+        hex_size=$(ssh -n "${file_host}" "${cmd}")</div><div class='add'>+</div><div class='add'>+        if [[ -z $hex_size || "$hex_size" != "$xattr" ]]</div><div class='add'>+        then</div><div class='add'>+            echo "False"</div><div class='add'>+            return</div><div class='add'>+        fi</div><div class='add'>+        size_diff=$(printf '%d' $(( size - hex_size )))</div><div class='add'>+        if [[ $size_diff -gt 2047 ]]</div><div class='add'>+        then</div><div class='add'>+            echo "False"</div><div class='add'>+            return</div><div class='add'>+        else</div><div class='add'>+            echo "True"</div><div class='add'>+            return</div><div class='add'>+        fi</div><div class='add'>+    else</div><div class='add'>+        echo "False"</div><div class='add'>+        return</div><div class='add'>+    fi</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function find_file_paths ()</div><div class='add'>+{</div><div class='add'>+    local bpath=$1</div><div class='add'>+    local file_entry=""</div><div class='add'>+    local file_host=""</div><div class='add'>+    local cmd=""</div><div class='add'>+    local brick_root=""</div><div class='add'>+    local gfid=""</div><div class='add'>+    local actual_path=""</div><div class='add'>+    local gfid_path=""</div><div class='add'>+</div><div class='add'>+    file_host=$(echo "$bpath" | cut -d ":" -f 1)</div><div class='add'>+    file_entry=$(echo "$bpath" | cut -d ":" -f 2)</div><div class='add'>+    brick_root=$(echo "$file_entry" | cut -d "#" -f 1)</div><div class='add'>+</div><div class='add'>+    gfid=$(echo "${file_entry}" | grep ".glusterfs")</div><div class='add'>+    if [[ -n "$gfid" ]]</div><div class='add'>+    then</div><div class='add'>+        gfid_path=$(echo "$file_entry" | cut -d "#" -f 2)</div><div class='add'>+        file_entry=${file_entry//#}</div><div class='add'>+        cmd="find -L '$brick_root' -samefile '$file_entry' 2&gt;/dev/null | grep -v '.glusterfs' "</div><div class='add'>+        actual_path=$(ssh -n "${file_host}" "${cmd}")</div><div class='add'>+        #removing absolute path so that user can refer this from mount point</div><div class='add'>+        actual_path=${actual_path#"$brick_root"}</div><div class='add'>+    else</div><div class='add'>+        actual_path=$(echo "$file_entry" | cut -d "#" -f 2)</div><div class='add'>+        file_entry=${file_entry//#}</div><div class='add'>+        cmd="find -L '$brick_root' -samefile '$file_entry' 2&gt;/dev/null | grep '.glusterfs' "</div><div class='add'>+        gfid_path=$(ssh -n "${file_host}" "${cmd}")</div><div class='add'>+        gfid_path=${gfid_path#"$brick_root"}</div><div class='add'>+    fi</div><div class='add'>+</div><div class='add'>+    echo "${gfid_path}|${actual_path}"</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function log_can_not_heal ()</div><div class='add'>+{</div><div class='add'>+    local gfid_actual_paths=$1</div><div class='add'>+    local file_paths=$2</div><div class='add'>+    file_paths=${file_paths//#}</div><div class='add'>+</div><div class='add'>+    echo "${LINE_SEP}" &gt;&gt; "$CAN_NOT_HEAL"</div><div class='add'>+    echo "Can Not Heal : $(echo "$gfid_actual_paths" | cut -d '|' -f 2)" &gt;&gt; "$CAN_NOT_HEAL"</div><div class='add'>+    for bpath in ${file_paths//,/ }</div><div class='add'>+    do</div><div class='add'>+        echo "${bpath}" &gt;&gt; "$CAN_NOT_HEAL"</div><div class='add'>+    done</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function check_all_frag_and_set_xattr ()</div><div class='add'>+{</div><div class='add'>+    local file_paths=$1</div><div class='add'>+    local total_size=$2</div><div class='add'>+    local file_stat=$3</div><div class='add'>+    local bpath=""</div><div class='add'>+    local healthy_count=0</div><div class='add'>+    local match="False"</div><div class='add'>+    local matching_bricks=""</div><div class='add'>+    local bad_bricks=""</div><div class='add'>+    local gfid_actual_paths=""</div><div class='add'>+</div><div class='add'>+    for bpath in ${file_paths//,/ }</div><div class='add'>+    do</div><div class='add'>+        if [[ -n "$gfid_actual_paths" ]]</div><div class='add'>+        then</div><div class='add'>+            break</div><div class='add'>+        fi</div><div class='add'>+        gfid_actual_paths=$(find_file_paths "$bpath")</div><div class='add'>+    done</div><div class='add'>+</div><div class='add'>+   match=$(match_size_xattr_quorum "$file_paths")</div><div class='add'>+</div><div class='add'>+#   echo "${match} : $bpath" &gt;&gt; "$MOD_BACKUP_FILES"</div><div class='add'>+</div><div class='add'>+    if [[ "$match" != "False" ]]</div><div class='add'>+    then</div><div class='add'>+        xattr="$match"</div><div class='add'>+        for bpath in ${file_paths//,/ }</div><div class='add'>+        do</div><div class='add'>+            match="False"</div><div class='add'>+            match=$(match_stat_size_with_xattr "$bpath" "$total_size" "$file_stat" "$xattr")</div><div class='add'>+            if [[ "$match" == "True" ]]</div><div class='add'>+            then</div><div class='add'>+                matching_bricks="${bpath},${matching_bricks}"</div><div class='add'>+                healthy_count=$((healthy_count + 1))</div><div class='add'>+            else</div><div class='add'>+                bad_bricks="${bpath},${bad_bricks}"</div><div class='add'>+            fi</div><div class='add'>+        done</div><div class='add'>+    fi</div><div class='add'>+</div><div class='add'>+    if [[ $healthy_count -ge 4 ]]</div><div class='add'>+    then</div><div class='add'>+        match="True"</div><div class='add'>+        echo "${LINE_SEP}" &gt;&gt; "$MOD_BACKUP_FILES"</div><div class='add'>+        echo "Modified : $(echo "$gfid_actual_paths" | cut -d '|' -f 2)" &gt;&gt; "$MOD_BACKUP_FILES"</div><div class='add'>+        set_version_dirty_xattr  "$matching_bricks" 1 "$gfid_actual_paths"</div><div class='add'>+        set_version_dirty_xattr  "$bad_bricks" 0 "$gfid_actual_paths"</div><div class='add'>+    else</div><div class='add'>+        log_can_not_heal "$gfid_actual_paths" "${file_paths}"</div><div class='add'>+    fi</div><div class='add'>+</div><div class='add'>+    echo "$match"</div><div class='add'>+}</div><div class='add'>+function set_xattr()</div><div class='add'>+{</div><div class='add'>+    local count=$1</div><div class='add'>+    local heal_entry=""</div><div class='add'>+    local file_stat=""</div><div class='add'>+    local frag_size=""</div><div class='add'>+    local total_size=""</div><div class='add'>+    local file_paths=""</div><div class='add'>+    local num=""</div><div class='add'>+    local can_heal_count=0</div><div class='add'>+</div><div class='add'>+    heal_log "Started $(basename $BASH_SOURCE) on $(date) "</div><div class='add'>+</div><div class='add'>+    while read -r heal_entry</div><div class='add'>+    do</div><div class='add'>+        heal_log "$LINE_SEP"</div><div class='add'>+        heal_log "${heal_entry}"</div><div class='add'>+</div><div class='add'>+        file_stat=$(echo "$heal_entry" | cut -d "|" -f 1)</div><div class='add'>+        frag_size=$(echo "$file_stat" | rev | cut -d ":" -f 1 | rev)</div><div class='add'>+        total_size="$(total_file_size_in_hex "$frag_size")"</div><div class='add'>+        file_paths=$(echo "$heal_entry" | cut -d "|" -f 2)</div><div class='add'>+        match=$(check_all_frag_and_set_xattr "$file_paths" "$total_size" "$file_stat")</div><div class='add'>+        if [[ "$match" == "True" ]]</div><div class='add'>+        then</div><div class='add'>+            can_heal_count=$((can_heal_count + 1))</div><div class='add'>+        fi</div><div class='add'>+</div><div class='add'>+        sed -i '1d' potential_heal</div><div class='add'>+        count=$((count - 1))</div><div class='add'>+        if [ $count == 0 ]</div><div class='add'>+        then</div><div class='add'>+            num=$(cat potential_heal | wc -l)</div><div class='add'>+            heal_log "$LINE_SEP"</div><div class='add'>+            heal_log "${1} : Processed"</div><div class='add'>+            heal_log "${can_heal_count} : Modified to Heal"</div><div class='add'>+            heal_log "$((${1} - can_heal_count)) : Moved to can_not_heal."</div><div class='add'>+            heal_log "${num} : Pending as Potential Heal"</div><div class='add'>+            exit 0</div><div class='add'>+        fi</div><div class='add'>+</div><div class='add'>+    done &lt; potential_heal</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function main ()</div><div class='add'>+{</div><div class='add'>+    local count=0</div><div class='add'>+</div><div class='add'>+    read -p "Number of files to correct: [choose between 1-1000] (0 for All):" count</div><div class='add'>+    if [[ $count -lt 0 || $count -gt 1000 ]]</div><div class='add'>+    then</div><div class='add'>+        echo "Provide correct value:"</div><div class='add'>+        exit 2</div><div class='add'>+    fi</div><div class='add'>+</div><div class='add'>+    if [[ $count -eq 0 ]]</div><div class='add'>+    then</div><div class='add'>+        count=$(cat potential_heal | wc -l)</div><div class='add'>+    fi</div><div class='add'>+    set_xattr "$count"</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+_init "$@" &amp;&amp; main "$@"</div><div class='head'>diff --git a/extras/ec-heal-script/gfid_needing_heal_parallel.sh b/extras/ec-heal-script/gfid_needing_heal_parallel.sh<br/>new file mode 100755<br/>index 00000000000..d7f53c97c33<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/extras/ec-heal-script/gfid_needing_heal_parallel.sh?id=d1d7a6f35c816822fab51c820e25023863c239c1'>extras/ec-heal-script/gfid_needing_heal_parallel.sh</a></div><div class='hunk'>@@ -0,0 +1,278 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+#  Copyright (c) 2019-2020 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+#  This file is part of GlusterFS.</div><div class='add'>+#</div><div class='add'>+#  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+#  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+#  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+#  cases as published by the Free Software Foundation.</div><div class='add'>+</div><div class='add'>+# This script provides a list of all the files which can be healed or not healed.</div><div class='add'>+# It also generates two files, potential_heal and can_not_heal, which contains the information</div><div class='add'>+# of all theose files. These files could be used by correct_pending_heals.sh to correct</div><div class='add'>+# the fragmnets so that files could be healed by shd.</div><div class='add'>+</div><div class='add'>+CAN_NOT_HEAL="can_not_heal"</div><div class='add'>+CAN_HEAL="potential_heal"</div><div class='add'>+LINE_SEP="==================================================="</div><div class='add'>+LOG_DIR="/var/log/glusterfs"</div><div class='add'>+LOG_FILE="$LOG_DIR/ec-heal-script.log"</div><div class='add'>+</div><div class='add'>+function heal_log()</div><div class='add'>+{</div><div class='add'>+    echo "$1" &gt;&gt; "$LOG_FILE"</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function _init ()</div><div class='add'>+{</div><div class='add'>+    if [ $# -ne 1 ]; then</div><div class='add'>+    echo "usage: $0 &lt;gluster volume name&gt;";</div><div class='add'>+    echo "This script provides a list of all the files which can be healed or not healed.</div><div class='add'>+It also generates two files, potential_heal and can_not_heal, which contains the information</div><div class='add'>+of all theose files. These files could be used by correct_pending_heals.sh to correct</div><div class='add'>+the fragmnets so that files could be healed by shd."</div><div class='add'>+    exit 2;</div><div class='add'>+    fi</div><div class='add'>+</div><div class='add'>+    volume=$1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function get_pending_entries ()</div><div class='add'>+{</div><div class='add'>+    local volume_name=$1</div><div class='add'>+</div><div class='add'>+    gluster volume heal "$volume_name" info | grep -v ":/" | grep -v "Number of entries" | grep -v "Status:" | sort -u | sed '/^$/d'</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function get_entry_path_on_brick()</div><div class='add'>+{</div><div class='add'>+    local path="$1"</div><div class='add'>+    local gfid_string=""</div><div class='add'>+    if [[ "${path:0:1}" == "/" ]];</div><div class='add'>+    then</div><div class='add'>+        echo "$path"</div><div class='add'>+    else</div><div class='add'>+        gfid_string="$(echo "$path" | cut -f2 -d':' | cut -f1 -d '&gt;')"</div><div class='add'>+        echo "/.glusterfs/${gfid_string:0:2}/${gfid_string:2:2}/$gfid_string"</div><div class='add'>+    fi</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function run_command_on_server()</div><div class='add'>+{</div><div class='add'>+	local subvolume="$1"</div><div class='add'>+	local host="$2"</div><div class='add'>+	local cmd="$3"</div><div class='add'>+	local output</div><div class='add'>+        output=$(ssh -n "${host}" "${cmd}")</div><div class='add'>+	if [ -n "$output" ]</div><div class='add'>+	then</div><div class='add'>+            echo "$subvolume:$output"</div><div class='add'>+	fi</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function get_entry_path_all_bricks ()</div><div class='add'>+{</div><div class='add'>+    local entry="$1"</div><div class='add'>+    local bricks="$2"</div><div class='add'>+    local cmd=""</div><div class='add'>+    for brick in $bricks</div><div class='add'>+    do</div><div class='add'>+	    echo "${brick}#$(get_entry_path_on_brick "$entry")"</div><div class='add'>+    done | tr '\n' ','</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function get_stat_for_entry_from_all_bricks ()</div><div class='add'>+{</div><div class='add'>+    local entry="$1"</div><div class='add'>+    local bricks="$2"</div><div class='add'>+    local subvolume=0</div><div class='add'>+    local host=""</div><div class='add'>+    local bpath=""</div><div class='add'>+    local cmd=""</div><div class='add'>+</div><div class='add'>+    for brick in $bricks</div><div class='add'>+    do</div><div class='add'>+        if [[ "$((subvolume % 6))" == "0" ]]</div><div class='add'>+        then</div><div class='add'>+            subvolume=$((subvolume+1))</div><div class='add'>+        fi</div><div class='add'>+        host=$(echo "$brick" | cut -f1 -d':')</div><div class='add'>+        bpath=$(echo "$brick" | cut -f2 -d':')</div><div class='add'>+</div><div class='add'>+	cmd="stat --format=%F:%B:%s $bpath$(get_entry_path_on_brick "$entry") 2&gt;/dev/null"</div><div class='add'>+    run_command_on_server "$subvolume" "${host}" "${cmd}" &amp;</div><div class='add'>+    done | sort | uniq -c | sort -rnk1</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function get_bricks_from_volume()</div><div class='add'>+{</div><div class='add'>+    local v=$1</div><div class='add'>+    gluster volume info "$v" | grep -E "^Brick[0-9][0-9]*:" | cut -f2- -d':'</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function print_entry_gfid()</div><div class='add'>+{</div><div class='add'>+    local host="$1"</div><div class='add'>+    local dirpath="$2"</div><div class='add'>+    local entry="$3"</div><div class='add'>+    local gfid</div><div class='add'>+    gfid="$(ssh -n "${host}" "getfattr -d -m. -e hex $dirpath/$entry 2&gt;/dev/null | grep trusted.gfid=|cut -f2 -d'='")"</div><div class='add'>+    echo "$entry" - "$gfid"</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function print_brick_directory_info()</div><div class='add'>+{</div><div class='add'>+    local h="$1"</div><div class='add'>+    local dirpath="$2"</div><div class='add'>+    while read -r e</div><div class='add'>+    do</div><div class='add'>+        print_entry_gfid "${h}" "${dirpath}" "${e}"</div><div class='add'>+    done &lt; &lt;(ssh -n "${h}" "ls $dirpath 2&gt;/dev/null")</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function print_directory_info()</div><div class='add'>+{</div><div class='add'>+    local entry="$1"</div><div class='add'>+    local bricks="$2"</div><div class='add'>+    local h</div><div class='add'>+    local b</div><div class='add'>+    local gfid</div><div class='add'>+    for brick in $bricks;</div><div class='add'>+    do</div><div class='add'>+        h="$(echo "$brick" | cut -f1 -d':')"</div><div class='add'>+        b="$(echo "$brick" | cut -f2 -d':')"</div><div class='add'>+        dirpath="$b$(get_entry_path_on_brick "$entry")"</div><div class='add'>+	print_brick_directory_info "${h}" "${dirpath}" &amp;</div><div class='add'>+    done | sort | uniq -c</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function print_entries_needing_heal()</div><div class='add'>+{</div><div class='add'>+    local quorum=0</div><div class='add'>+    local entry="$1"</div><div class='add'>+    local bricks="$2"</div><div class='add'>+    while read -r line</div><div class='add'>+    do</div><div class='add'>+        quorum=$(echo "$line" | awk '{print $1}')</div><div class='add'>+        if [[ "$quorum" -lt 4 ]]</div><div class='add'>+        then</div><div class='add'>+            echo "$line - Not in Quorum"</div><div class='add'>+        else</div><div class='add'>+            echo "$line - In Quorum"</div><div class='add'>+        fi</div><div class='add'>+    done &lt; &lt;(print_directory_info "$entry" "$bricks")</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function find_file_paths ()</div><div class='add'>+{</div><div class='add'>+    local bpath=$1</div><div class='add'>+    local file_entry=""</div><div class='add'>+    local file_host=""</div><div class='add'>+    local cmd=""</div><div class='add'>+    local brick_root=""</div><div class='add'>+    local gfid=""</div><div class='add'>+    local actual_path=""</div><div class='add'>+    local gfid_path=""</div><div class='add'>+</div><div class='add'>+    file_host=$(echo "$bpath" | cut -d ":" -f 1)</div><div class='add'>+    file_entry=$(echo "$bpath" | cut -d ":" -f 2)</div><div class='add'>+    brick_root=$(echo "$file_entry" | cut -d "#" -f 1)</div><div class='add'>+</div><div class='add'>+    gfid=$(echo "${file_entry}" | grep ".glusterfs")</div><div class='add'>+</div><div class='add'>+    if [[ -n "$gfid" ]]</div><div class='add'>+    then</div><div class='add'>+        gfid_path=$(echo "$file_entry" | cut -d "#" -f 2)</div><div class='add'>+        file_entry=${file_entry//#}</div><div class='add'>+        cmd="find -L '$brick_root' -samefile '$file_entry' 2&gt;/dev/null | grep -v '.glusterfs' "</div><div class='add'>+        actual_path=$(ssh -n "${file_host}" "${cmd}")</div><div class='add'>+        #removing absolute path so that user can refer this from mount point</div><div class='add'>+        actual_path=${actual_path#"$brick_root"}</div><div class='add'>+    else</div><div class='add'>+        actual_path=$(echo "$file_entry" | cut -d "#" -f 2)</div><div class='add'>+        file_entry=${file_entry//#}</div><div class='add'>+        cmd="find -L '$brick_root' -samefile '$file_entry' 2&gt;/dev/null | grep '.glusterfs' "</div><div class='add'>+        gfid_path=$(ssh -n "${file_host}" "${cmd}")</div><div class='add'>+        gfid_path=${gfid_path#"$brick_root"}</div><div class='add'>+    fi</div><div class='add'>+</div><div class='add'>+    echo "${gfid_path}|${actual_path}"</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function log_can_not_heal ()</div><div class='add'>+{</div><div class='add'>+    local gfid_actual_paths=$1</div><div class='add'>+    local file_paths=$2</div><div class='add'>+    file_paths=${file_paths//#}</div><div class='add'>+</div><div class='add'>+    echo "${LINE_SEP}" &gt;&gt; "$CAN_NOT_HEAL"</div><div class='add'>+    echo "Can Not Heal : $(echo "$gfid_actual_paths" | cut -d '|' -f 2)" &gt;&gt; "$CAN_NOT_HEAL"</div><div class='add'>+    for bpath in ${file_paths//,/ }</div><div class='add'>+    do</div><div class='add'>+        echo "${bpath}" &gt;&gt; "$CAN_NOT_HEAL"</div><div class='add'>+    done</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function main ()</div><div class='add'>+{</div><div class='add'>+    local bricks=""</div><div class='add'>+    local quorum=0</div><div class='add'>+    local stat_info=""</div><div class='add'>+    local file_type=""</div><div class='add'>+    local gfid_actual_paths=""</div><div class='add'>+    local bpath=""</div><div class='add'>+    local file_paths=""</div><div class='add'>+    local good=0</div><div class='add'>+    local bad=0</div><div class='add'>+    bricks=$(get_bricks_from_volume "$volume")</div><div class='add'>+    rm -f "$CAN_HEAL"</div><div class='add'>+    rm -f "$CAN_NOT_HEAL"</div><div class='add'>+    mkdir "$LOG_DIR" -p</div><div class='add'>+</div><div class='add'>+    heal_log "Started $(basename "$BASH_SOURCE") on $(date) "</div><div class='add'>+    while read -r heal_entry</div><div class='add'>+    do</div><div class='add'>+        heal_log "------------------------------------------------------------------"</div><div class='add'>+        heal_log "$heal_entry"</div><div class='add'>+</div><div class='add'>+        gfid_actual_paths=""</div><div class='add'>+        file_paths="$(get_entry_path_all_bricks "$heal_entry" "$bricks")"</div><div class='add'>+        stat_info="$(get_stat_for_entry_from_all_bricks "$heal_entry" "$bricks")"</div><div class='add'>+        heal_log "$stat_info"</div><div class='add'>+</div><div class='add'>+        quorum=$(echo "$stat_info" | head -1 | awk '{print $1}')</div><div class='add'>+        good_stat=$(echo "$stat_info" | head -1 | awk '{print $3}')</div><div class='add'>+        file_type="$(echo "$stat_info" | head -1 | cut -f2 -d':')"</div><div class='add'>+        if [[ "$file_type" == "directory" ]]</div><div class='add'>+        then</div><div class='add'>+            print_entries_needing_heal "$heal_entry" "$bricks"</div><div class='add'>+        else</div><div class='add'>+            if [[ "$quorum" -ge 4 ]]</div><div class='add'>+            then</div><div class='add'>+                good=$((good + 1))</div><div class='add'>+                heal_log "Verdict: Healable"</div><div class='add'>+</div><div class='add'>+                echo "${good_stat}|$file_paths" &gt;&gt; "$CAN_HEAL"</div><div class='add'>+            else</div><div class='add'>+                bad=$((bad + 1))</div><div class='add'>+                heal_log "Verdict: Not Healable"</div><div class='add'>+                for bpath in ${file_paths//,/ }</div><div class='add'>+                do</div><div class='add'>+                    if [[ -z "$gfid_actual_paths" ]]</div><div class='add'>+                    then</div><div class='add'>+                        gfid_actual_paths=$(find_file_paths "$bpath")</div><div class='add'>+                    else</div><div class='add'>+                        break</div><div class='add'>+                    fi</div><div class='add'>+                done</div><div class='add'>+                log_can_not_heal "$gfid_actual_paths" "${file_paths}"</div><div class='add'>+            fi</div><div class='add'>+        fi</div><div class='add'>+    done &lt; &lt;(get_pending_entries "$volume")</div><div class='add'>+    heal_log "========================================="</div><div class='add'>+    heal_log "Total number of  potential heal : ${good}"</div><div class='add'>+    heal_log "Total number of can not heal    : ${bad}"</div><div class='add'>+    heal_log "========================================="</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+_init "$@" &amp;&amp; main "$@"</div><div class='head'>diff --git a/extras/failed-tests.py b/extras/failed-tests.py<br/>new file mode 100755<br/>index 00000000000..f7f110246b5<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/extras/failed-tests.py?id=d1d7a6f35c816822fab51c820e25023863c239c1'>extras/failed-tests.py</a></div><div class='hunk'>@@ -0,0 +1,180 @@</div><div class='add'>+#!/usr/bin/python3</div><div class='add'>+</div><div class='add'>+from __future__ import print_function</div><div class='add'>+import blessings</div><div class='add'>+import requests</div><div class='add'>+from requests.packages.urllib3.exceptions import InsecureRequestWarning</div><div class='add'>+import re</div><div class='add'>+import argparse</div><div class='add'>+from collections import defaultdict</div><div class='add'>+from datetime import timedelta, datetime</div><div class='add'>+from pystache import render</div><div class='add'>+</div><div class='add'>+# This tool goes though the Gluster regression links and checks for failures</div><div class='add'>+</div><div class='add'>+BASE = 'https://build.gluster.org'</div><div class='add'>+TERM = blessings.Terminal()</div><div class='add'>+MAX_BUILDS = 1000</div><div class='add'>+summary = defaultdict(list)</div><div class='add'>+VERBOSE = None</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def process_failure(url, node):</div><div class='add'>+    text = requests.get(url, verify=False).text</div><div class='add'>+    accum = []</div><div class='add'>+    for t in text.split('\n'):</div><div class='add'>+        if t.find("Result: FAIL") != -1:</div><div class='add'>+            for t2 in accum:</div><div class='add'>+                if VERBOSE:</div><div class='add'>+                    print(t2.encode('utf-8'))</div><div class='add'>+                if t2.find("Wstat") != -1:</div><div class='add'>+                    test_case = re.search('\./tests/.*\.t', t2)</div><div class='add'>+                    if test_case:</div><div class='add'>+                        summary[test_case.group()].append((url, node))</div><div class='add'>+            accum = []</div><div class='add'>+        elif t.find("cur_cores=/") != -1:</div><div class='add'>+            summary["core"].append([t.split("/")[1]])</div><div class='add'>+            summary["core"].append(url)</div><div class='add'>+        else:</div><div class='add'>+            accum.append(t)</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def print_summary(failed_builds, total_builds, html=False):</div><div class='add'>+    # All the templates</div><div class='add'>+    count = [</div><div class='add'>+            '{{failed}} of {{total}} regressions failed',</div><div class='add'>+            '&lt;p&gt;&lt;b&gt;{{failed}}&lt;/b&gt; of &lt;b&gt;{{total}}&lt;/b&gt; regressions failed&lt;/p&gt;'</div><div class='add'>+    ]</div><div class='add'>+    regression_link = [</div><div class='add'>+            '\tRegression Link: {{link}}\n'</div><div class='add'>+            '\tNode: {{node}}',</div><div class='add'>+            '&lt;p&gt;&amp;emsp;Regression Link: {{link}}&lt;/p&gt;'</div><div class='add'>+            '&lt;p&gt;&amp;emsp;Node: {{node}}&lt;/p&gt;'</div><div class='add'>+    ]</div><div class='add'>+    component = [</div><div class='add'>+            '\tComponent: {{comp}}',</div><div class='add'>+            '&lt;p&gt;&amp;emsp;Component: {{comp}}&lt;/p&gt;'</div><div class='add'>+    ]</div><div class='add'>+    failure_count = [</div><div class='add'>+            ''.join([</div><div class='add'>+                TERM.red,</div><div class='add'>+                '{{test}} ; Failed {{count}} times',</div><div class='add'>+                TERM.normal</div><div class='add'>+            ]),</div><div class='add'>+            (</div><div class='add'>+                '&lt;p&gt;&lt;font color="red"&gt;&lt;b&gt;{{test}};&lt;/b&gt; Failed &lt;b&gt;{{count}}'</div><div class='add'>+                '&lt;/b&gt; times&lt;/font&gt;&lt;/p&gt;'</div><div class='add'>+            )</div><div class='add'>+    ]</div><div class='add'>+</div><div class='add'>+    template = 0</div><div class='add'>+    if html:</div><div class='add'>+        template = 1</div><div class='add'>+    print(render(</div><div class='add'>+            count[template],</div><div class='add'>+            {'failed': failed_builds, 'total': total_builds}</div><div class='add'>+    ))</div><div class='add'>+    for k, v in summary.items():</div><div class='add'>+        if k == 'core':</div><div class='add'>+            print(''.join([TERM.red, "Found cores:", TERM.normal]))</div><div class='add'>+            for comp, link in zip(v[::2], v[1::2]):</div><div class='add'>+                print(render(component[template], {'comp': comp}))</div><div class='add'>+                print(render(</div><div class='add'>+                        regression_link[template],</div><div class='add'>+                        {'link': link[0], 'node': link[1]}</div><div class='add'>+                ))</div><div class='add'>+        else:</div><div class='add'>+            print(render(failure_count[template], {'test': k, 'count': len(v)}))</div><div class='add'>+            for link in v:</div><div class='add'>+                print(render(</div><div class='add'>+                        regression_link[template],</div><div class='add'>+                        {'link': link[0], 'node': link[1]}</div><div class='add'>+                ))</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def get_summary(cut_off_date, reg_link):</div><div class='add'>+    '''</div><div class='add'>+    Get links to the failed jobs</div><div class='add'>+    '''</div><div class='add'>+    success_count = 0</div><div class='add'>+    failure_count = 0</div><div class='add'>+    for page in range(0, MAX_BUILDS, 100):</div><div class='add'>+        build_info = requests.get(''.join([</div><div class='add'>+                BASE,</div><div class='add'>+                reg_link,</div><div class='add'>+                'api/json?depth=1&amp;tree=allBuilds'</div><div class='add'>+                '[url,result,timestamp,builtOn]',</div><div class='add'>+                '{{{0},{1}}}'.format(page, page+100)</div><div class='add'>+        ]), verify=False).json()</div><div class='add'>+        for build in build_info.get('allBuilds'):</div><div class='add'>+            if datetime.fromtimestamp(build['timestamp']/1000) &lt; cut_off_date:</div><div class='add'>+                # stop when timestamp older than cut off date</div><div class='add'>+                return failure_count, failure_count + success_count</div><div class='add'>+            if build['result'] in [None, 'SUCCESS']:</div><div class='add'>+                # pass when build is a success or ongoing</div><div class='add'>+                success_count += 1</div><div class='add'>+                continue</div><div class='add'>+            if VERBOSE:</div><div class='add'>+                print(''.join([</div><div class='add'>+                    TERM.red,</div><div class='add'>+                    'FAILURE on {0}'.format(build['url']),</div><div class='add'>+                    TERM.normal</div><div class='add'>+                ]))</div><div class='add'>+            url = ''.join([build['url'], 'consoleText'])</div><div class='add'>+            failure_count += 1</div><div class='add'>+            process_failure(url, build['builtOn'])</div><div class='add'>+    return failure_count, failure_count + success_count</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def main(num_days, regression_link, html_report):</div><div class='add'>+    cut_off_date = datetime.today() - timedelta(days=num_days)</div><div class='add'>+    failure = 0</div><div class='add'>+    total = 0</div><div class='add'>+    for reg in regression_link:</div><div class='add'>+        if reg == 'centos':</div><div class='add'>+            reg_link = '/job/centos6-regression/'</div><div class='add'>+        elif reg == 'netbsd':</div><div class='add'>+            reg_link = '/job/netbsd7-regression/'</div><div class='add'>+        else:</div><div class='add'>+            reg_link = reg</div><div class='add'>+        counts = get_summary(cut_off_date, reg_link)</div><div class='add'>+        failure += counts[0]</div><div class='add'>+        total += counts[1]</div><div class='add'>+    print_summary(failure, total, html_report)</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+if __name__ == '__main__':</div><div class='add'>+    requests.packages.urllib3.disable_warnings(InsecureRequestWarning)</div><div class='add'>+    parser = argparse.ArgumentParser()</div><div class='add'>+    parser.add_argument("get-summary")</div><div class='add'>+    parser.add_argument(</div><div class='add'>+            "last_no_of_days",</div><div class='add'>+            default=1,</div><div class='add'>+            type=int,</div><div class='add'>+            help="Regression summary of last number of days"</div><div class='add'>+    )</div><div class='add'>+    parser.add_argument(</div><div class='add'>+            "regression_link",</div><div class='add'>+            default="centos",</div><div class='add'>+            nargs='+',</div><div class='add'>+            help="\"centos\" | \"netbsd\" | any other regression link"</div><div class='add'>+    )</div><div class='add'>+    parser.add_argument(</div><div class='add'>+            "--verbose",</div><div class='add'>+            default=False,</div><div class='add'>+            action="store_true",</div><div class='add'>+            help="Print a detailed report of each test case that is failed"</div><div class='add'>+    )</div><div class='add'>+    parser.add_argument(</div><div class='add'>+            "--html-report",</div><div class='add'>+            default=False,</div><div class='add'>+            action="store_true",</div><div class='add'>+            help="Print a brief report of failed regressions in html format"</div><div class='add'>+    )</div><div class='add'>+    args = parser.parse_args()</div><div class='add'>+    VERBOSE = args.verbose</div><div class='add'>+    main(</div><div class='add'>+        num_days=args.last_no_of_days,</div><div class='add'>+        regression_link=args.regression_link,</div><div class='add'>+        html_report=args.html_report</div><div class='add'>+    )</div><div class='head'>diff --git a/extras/file_size_contri.sh b/extras/file_size_contri.sh<br/>new file mode 100755<br/>index 00000000000..4f52a9a89b4<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/extras/file_size_contri.sh?id=d1d7a6f35c816822fab51c820e25023863c239c1'>extras/file_size_contri.sh</a></div><div class='hunk'>@@ -0,0 +1,17 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+# This script checks whether the contribution and disk-usage of a file is same.</div><div class='add'>+</div><div class='add'>+CONTRIBUTION_HEX=`getfattr -h -e hex -d -m trusted.glusterfs.quota.*.contri $1 2&gt;&amp;1 | sed -e '/^#/d' | sed -e '/^getfattr/d' | sed -e '/^$/d' | cut -d'=' -f 2`</div><div class='add'>+</div><div class='add'>+BLOCKS=`stat -c %b $1`</div><div class='add'>+SIZE=$(($BLOCKS * 512))</div><div class='add'>+</div><div class='add'>+CONTRIBUTION=`printf "%d" $CONTRIBUTION_HEX`</div><div class='add'>+</div><div class='add'>+if [ $CONTRIBUTION -ne $SIZE ]; then</div><div class='add'>+    printf "contribution of %s:%d\n" $1 $CONTRIBUTION</div><div class='add'>+    echo "size of $1: $SIZE"</div><div class='add'>+    echo "==================================================="</div><div class='add'>+fi</div><div class='add'>+ </div><div class='head'>diff --git a/extras/firewalld/Makefile.am b/extras/firewalld/Makefile.am<br/>new file mode 100644<br/>index 00000000000..530881fb8eb<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/extras/firewalld/Makefile.am?id=d1d7a6f35c816822fab51c820e25023863c239c1'>extras/firewalld/Makefile.am</a></div><div class='hunk'>@@ -0,0 +1,8 @@</div><div class='add'>+EXTRA_DIST = glusterfs.xml</div><div class='add'>+</div><div class='add'>+if USE_FIREWALLD</div><div class='add'>+if WITH_SERVER</div><div class='add'>+staticdir = /usr/lib/firewalld/services/</div><div class='add'>+static_DATA = glusterfs.xml</div><div class='add'>+endif</div><div class='add'>+endif</div><div class='head'>diff --git a/extras/firewalld/glusterfs.xml b/extras/firewalld/glusterfs.xml<br/>new file mode 100644<br/>index 00000000000..7e176442f5b<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/extras/firewalld/glusterfs.xml?id=d1d7a6f35c816822fab51c820e25023863c239c1'>extras/firewalld/glusterfs.xml</a></div><div class='hunk'>@@ -0,0 +1,14 @@</div><div class='add'>+&lt;?xml version="1.0" encoding="utf-8"?&gt;</div><div class='add'>+&lt;service&gt;</div><div class='add'>+&lt;short&gt;glusterfs-static&lt;/short&gt;</div><div class='add'>+&lt;description&gt;Default ports for gluster-distributed storage&lt;/description&gt;</div><div class='add'>+&lt;port protocol="tcp" port="24007"/&gt;    &lt;!--For glusterd --&gt;</div><div class='add'>+&lt;port protocol="tcp" port="24008"/&gt;    &lt;!--For glusterd RDMA port management --&gt;</div><div class='add'>+&lt;port protocol="tcp" port="24009"/&gt;    &lt;!--For glustereventsd --&gt;</div><div class='add'>+&lt;port protocol="tcp" port="38465"/&gt;    &lt;!--Gluster NFS service --&gt;</div><div class='add'>+&lt;port protocol="tcp" port="38466"/&gt;    &lt;!--Gluster NFS service --&gt;</div><div class='add'>+&lt;port protocol="tcp" port="38467"/&gt;    &lt;!--Gluster NFS service --&gt;</div><div class='add'>+&lt;port protocol="tcp" port="38468"/&gt;    &lt;!--Gluster NFS service --&gt;</div><div class='add'>+&lt;port protocol="tcp" port="38469"/&gt;    &lt;!--Gluster NFS service --&gt;</div><div class='add'>+&lt;port protocol="tcp" port="49152-49664"/&gt;  &lt;!--512 ports for bricks --&gt;</div><div class='add'>+&lt;/service&gt;</div><div class='head'>diff --git a/extras/ganesha/Makefile.am b/extras/ganesha/Makefile.am<br/>new file mode 100644<br/>index 00000000000..9eaa401b6c8<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/extras/ganesha/Makefile.am?id=d1d7a6f35c816822fab51c820e25023863c239c1'>extras/ganesha/Makefile.am</a></div><div class='hunk'>@@ -0,0 +1,2 @@</div><div class='add'>+SUBDIRS = scripts config ocf</div><div class='add'>+CLEANFILES =</div><div class='head'>diff --git a/extras/ganesha/config/Makefile.am b/extras/ganesha/config/Makefile.am<br/>new file mode 100644<br/>index 00000000000..c729273096e<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/extras/ganesha/config/Makefile.am?id=d1d7a6f35c816822fab51c820e25023863c239c1'>extras/ganesha/config/Makefile.am</a></div><div class='hunk'>@@ -0,0 +1,4 @@</div><div class='add'>+EXTRA_DIST= ganesha-ha.conf.sample</div><div class='add'>+</div><div class='add'>+confdir = $(sysconfdir)/ganesha</div><div class='add'>+conf_DATA = ganesha-ha.conf.sample</div><div class='head'>diff --git a/extras/ganesha/config/ganesha-ha.conf.sample b/extras/ganesha/config/ganesha-ha.conf.sample<br/>new file mode 100644<br/>index 00000000000..c22892bde56<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/extras/ganesha/config/ganesha-ha.conf.sample?id=d1d7a6f35c816822fab51c820e25023863c239c1'>extras/ganesha/config/ganesha-ha.conf.sample</a></div><div class='hunk'>@@ -0,0 +1,19 @@</div><div class='add'>+# Name of the HA cluster created.</div><div class='add'>+# must be unique within the subnet</div><div class='add'>+HA_NAME="ganesha-ha-360"</div><div class='add'>+#</div><div class='add'>+# N.B. you may use short names or long names; you may not use IP addrs.</div><div class='add'>+# Once you select one, stay with it as it will be mildly unpleasant to</div><div class='add'>+# clean up if you switch later on. Ensure that all names - short and/or</div><div class='add'>+# long - are in DNS or /etc/hosts on all machines in the cluster.</div><div class='add'>+#</div><div class='add'>+# The subset of nodes of the Gluster Trusted Pool that form the ganesha</div><div class='add'>+# HA cluster. Hostname is specified.</div><div class='add'>+HA_CLUSTER_NODES="server1,server2,..."</div><div class='add'>+#HA_CLUSTER_NODES="server1.lab.redhat.com,server2.lab.redhat.com,..."</div><div class='add'>+#</div><div class='add'>+# Virtual IPs for each of the nodes specified above.</div><div class='add'>+VIP_server1="10.0.2.1"</div><div class='add'>+VIP_server2="10.0.2.2"</div><div class='add'>+#VIP_server1_lab_redhat_com="10.0.2.1"</div><div class='add'>+#VIP_server2_lab_redhat_com="10.0.2.2"</div><div class='head'>diff --git a/extras/ganesha/ocf/Makefile.am b/extras/ganesha/ocf/Makefile.am<br/>new file mode 100644<br/>index 00000000000..990a609f254<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/extras/ganesha/ocf/Makefile.am?id=d1d7a6f35c816822fab51c820e25023863c239c1'>extras/ganesha/ocf/Makefile.am</a></div><div class='hunk'>@@ -0,0 +1,11 @@</div><div class='add'>+EXTRA_DIST= ganesha_grace ganesha_mon ganesha_nfsd</div><div class='add'>+</div><div class='add'>+# The root of the OCF resource agent hierarchy</div><div class='add'>+# Per the OCF standard, it's always "lib",</div><div class='add'>+# not "lib64" (even on 64-bit platforms).</div><div class='add'>+ocfdir = $(prefix)/lib/ocf</div><div class='add'>+</div><div class='add'>+# The provider directory</div><div class='add'>+radir = $(ocfdir)/resource.d/heartbeat</div><div class='add'>+</div><div class='add'>+ra_SCRIPTS = ganesha_grace ganesha_mon ganesha_nfsd</div><div class='head'>diff --git a/extras/ganesha/ocf/ganesha_grace b/extras/ganesha/ocf/ganesha_grace<br/>new file mode 100644<br/>index 00000000000..825f7164597<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/extras/ganesha/ocf/ganesha_grace?id=d1d7a6f35c816822fab51c820e25023863c239c1'>extras/ganesha/ocf/ganesha_grace</a></div><div class='hunk'>@@ -0,0 +1,221 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+#</div><div class='add'>+# Copyright (c) 2014 Anand Subramanian anands@redhat.com</div><div class='add'>+# Copyright (c) 2015 Red Hat Inc.</div><div class='add'>+#                    All Rights Reserved.</div><div class='add'>+#</div><div class='add'>+# This program is free software; you can redistribute it and/or modify</div><div class='add'>+# it under the terms of version 2 of the GNU General Public License as</div><div class='add'>+# published by the Free Software Foundation.</div><div class='add'>+#</div><div class='add'>+# This program is distributed in the hope that it would be useful, but</div><div class='add'>+# WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='add'>+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.</div><div class='add'>+#</div><div class='add'>+# Further, this software is distributed without any warranty that it is</div><div class='add'>+# free of the rightful claim of any third person regarding infringement</div><div class='add'>+# or the like.  Any license provided herein, whether implied or</div><div class='add'>+# otherwise, applies only to this software file.  Patent licenses, if</div><div class='add'>+# any, provided herein do not apply to combinations of this program with</div><div class='add'>+# other software, or any other product whatsoever.</div><div class='add'>+#</div><div class='add'>+# You should have received a copy of the GNU General Public License</div><div class='add'>+# along with this program; if not, write the Free Software Foundation,</div><div class='add'>+# Inc., 59 Temple Place - Suite 330, Boston MA 02111-1307, USA.</div><div class='add'>+#</div><div class='add'>+#</div><div class='add'>+</div><div class='add'>+# Initialization:</div><div class='add'>+: ${OCF_FUNCTIONS_DIR=${OCF_ROOT}/lib/heartbeat}</div><div class='add'>+. ${OCF_FUNCTIONS_DIR}/ocf-shellfuncs</div><div class='add'>+</div><div class='add'>+if [ -n "$OCF_DEBUG_LIBRARY" ]; then</div><div class='add'>+	. $OCF_DEBUG_LIBRARY</div><div class='add'>+else</div><div class='add'>+	: ${OCF_FUNCTIONS_DIR=${OCF_ROOT}/lib/heartbeat}</div><div class='add'>+	. ${OCF_FUNCTIONS_DIR}/ocf-shellfuncs</div><div class='add'>+fi</div><div class='add'>+</div><div class='add'>+OCF_RESKEY_grace_active_default="grace-active"</div><div class='add'>+: ${OCF_RESKEY_grace_active=${OCF_RESKEY_grace_active_default}}</div><div class='add'>+</div><div class='add'>+ganesha_meta_data() {</div><div class='add'>+	cat &lt;&lt;END</div><div class='add'>+&lt;?xml version="1.0"?&gt;</div><div class='add'>+&lt;!DOCTYPE resource-agent SYSTEM "ra-api-1.dtd"&gt;</div><div class='add'>+&lt;resource-agent name="ganesha_grace"&gt;</div><div class='add'>+&lt;version&gt;1.0&lt;/version&gt;</div><div class='add'>+</div><div class='add'>+&lt;longdesc lang="en"&gt;</div><div class='add'>+This Linux-specific resource agent acts as a dummy</div><div class='add'>+resource agent for nfs-ganesha.</div><div class='add'>+&lt;/longdesc&gt;</div><div class='add'>+</div><div class='add'>+&lt;shortdesc lang="en"&gt;Manages the user-space nfs-ganesha NFS server&lt;/shortdesc&gt;</div><div class='add'>+</div><div class='add'>+&lt;parameters&gt;</div><div class='add'>+&lt;parameter name="grace_active"&gt;</div><div class='add'>+&lt;longdesc lang="en"&gt;NFS-Ganesha grace active attribute&lt;/longdesc&gt;</div><div class='add'>+&lt;shortdesc lang="en"&gt;NFS-Ganesha grace active attribute&lt;/shortdesc&gt;</div><div class='add'>+&lt;content type="string" default="grace-active" /&gt;</div><div class='add'>+&lt;/parameter&gt;</div><div class='add'>+&lt;/parameters&gt;</div><div class='add'>+</div><div class='add'>+&lt;actions&gt;</div><div class='add'>+&lt;action name="start"   timeout="40s" /&gt;</div><div class='add'>+&lt;action name="stop"    timeout="40s" /&gt;</div><div class='add'>+&lt;action name="status"  timeout="20s" interval="60s" /&gt;</div><div class='add'>+&lt;action name="monitor" depth="0" timeout="10s" interval="5s" /&gt;</div><div class='add'>+&lt;action name="notify"  timeout="10s" /&gt;</div><div class='add'>+&lt;action name="meta-data"  timeout="20s" /&gt;</div><div class='add'>+&lt;/actions&gt;</div><div class='add'>+&lt;/resource-agent&gt;</div><div class='add'>+END</div><div class='add'>+</div><div class='add'>+return ${OCF_SUCCESS}</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+ganesha_grace_usage() {</div><div class='add'>+	echo "ganesha.nfsd USAGE"</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+# Make sure meta-data and usage always succeed</div><div class='add'>+case $__OCF_ACTION in</div><div class='add'>+	meta-data)	ganesha_meta_data</div><div class='add'>+			exit ${OCF_SUCCESS}</div><div class='add'>+			;;</div><div class='add'>+	usage|help)	ganesha_usage</div><div class='add'>+			exit ${OCF_SUCCESS}</div><div class='add'>+			;;</div><div class='add'>+	*)</div><div class='add'>+			;;</div><div class='add'>+esac</div><div class='add'>+</div><div class='add'>+ganesha_grace_start()</div><div class='add'>+{</div><div class='add'>+	local rc=${OCF_ERR_GENERIC}</div><div class='add'>+	local host=$(hostname -s)</div><div class='add'>+</div><div class='add'>+	ocf_log debug "ganesha_grace_start()"</div><div class='add'>+	# give ganesha_mon RA a chance to set the crm_attr first</div><div class='add'>+	# I mislike the sleep, but it's not clear that looping</div><div class='add'>+	# with a small sleep is necessarily better</div><div class='add'>+	# start has a 40sec timeout, so a 5sec sleep here is okay</div><div class='add'>+        sleep 5</div><div class='add'>+	attr=$(crm_attribute --query --node=${host} --name=${OCF_RESKEY_grace_active} 2&gt; /dev/null)</div><div class='add'>+        if [ $? -ne 0 ]; then</div><div class='add'>+		host=$(hostname)</div><div class='add'>+		attr=$(crm_attribute --query --node=${host} --name=${OCF_RESKEY_grace_active} 2&gt; /dev/null )</div><div class='add'>+                if [ $? -ne 0 ]; then</div><div class='add'>+	                ocf_log info "grace start: crm_attribute --query --node=${host} --name=${OCF_RESKEY_grace_active} failed"</div><div class='add'>+                fi</div><div class='add'>+        fi</div><div class='add'>+</div><div class='add'>+	# Three possibilities:</div><div class='add'>+	# 1. There is no attribute at all and attr_updater returns</div><div class='add'>+	#    a zero length string. This happens when</div><div class='add'>+	#    ganesha_mon::monitor hasn't run at least once to set</div><div class='add'>+	#    the attribute. The assumption here is that the system</div><div class='add'>+	#    is coming up. We pretend, for now, that the node is</div><div class='add'>+	#    healthy, to allow the system to continue coming up.</div><div class='add'>+	#    It will cure itself in a few seconds</div><div class='add'>+	# 2. There is an attribute, and it has the value "1"; this</div><div class='add'>+	#    node is healthy.</div><div class='add'>+	# 3. There is an attribute, but it has no value or the value</div><div class='add'>+	#    "0"; this node is not healthy.</div><div class='add'>+</div><div class='add'>+	# case 1</div><div class='add'>+	if [[ -z "${attr}" ]]; then</div><div class='add'>+		return ${OCF_SUCCESS}</div><div class='add'>+	fi</div><div class='add'>+</div><div class='add'>+	# case 2</div><div class='add'>+	if [[ "${attr}" = *"value=1" ]]; then</div><div class='add'>+		return ${OCF_SUCCESS}</div><div class='add'>+	fi</div><div class='add'>+</div><div class='add'>+	# case 3</div><div class='add'>+	return ${OCF_NOT_RUNNING}</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+ganesha_grace_stop()</div><div class='add'>+{</div><div class='add'>+</div><div class='add'>+	ocf_log debug "ganesha_grace_stop()"</div><div class='add'>+	return ${OCF_SUCCESS}</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+ganesha_grace_notify()</div><div class='add'>+{</div><div class='add'>+        # since this is a clone RA we should only ever see pre-start</div><div class='add'>+        # or post-stop</div><div class='add'>+	mode="${OCF_RESKEY_CRM_meta_notify_type}-${OCF_RESKEY_CRM_meta_notify_operation}"</div><div class='add'>+	case "${mode}" in</div><div class='add'>+	pre-start | post-stop)</div><div class='add'>+		dbus-send --print-reply --system --dest=org.ganesha.nfsd /org/ganesha/nfsd/admin org.ganesha.nfsd.admin.grace string:${OCF_RESKEY_CRM_meta_notify_stop_uname}</div><div class='add'>+		if [ $? -ne 0 ]; then</div><div class='add'>+			ocf_log info "dbus-send --print-reply --system --dest=org.ganesha.nfsd /org/ganesha/nfsd/admin org.ganesha.nfsd.admin.grace string:${OCF_RESKEY_CRM_meta_notify_stop_uname} failed"</div><div class='add'>+		fi</div><div class='add'>+		;;</div><div class='add'>+	esac</div><div class='add'>+</div><div class='add'>+	return ${OCF_SUCCESS}</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+ganesha_grace_monitor()</div><div class='add'>+{</div><div class='add'>+	local host=$(hostname -s)</div><div class='add'>+</div><div class='add'>+	ocf_log debug "monitor"</div><div class='add'>+</div><div class='add'>+	attr=$(crm_attribute --query --node=${host} --name=${OCF_RESKEY_grace_active} 2&gt; /dev/null)</div><div class='add'>+        if [ $? -ne 0 ]; then</div><div class='add'>+		host=$(hostname)</div><div class='add'>+	        attr=$(crm_attribute --query --node=${host} --name=${OCF_RESKEY_grace_active} 2&gt; /dev/null)</div><div class='add'>+                if [ $? -ne 0 ]; then</div><div class='add'>+	                ocf_log info "crm_attribute --query --node=${host} --name=${OCF_RESKEY_grace_active} failed"</div><div class='add'>+                fi</div><div class='add'>+        fi</div><div class='add'>+</div><div class='add'>+	# if there is no attribute (yet), maybe it's because</div><div class='add'>+	# this RA started before ganesha_mon (nfs-mon) has had</div><div class='add'>+	# chance to create it. In which case we'll pretend</div><div class='add'>+	# everything is okay this time around</div><div class='add'>+	if [[ -z "${attr}" ]]; then</div><div class='add'>+		return ${OCF_SUCCESS}</div><div class='add'>+	fi</div><div class='add'>+</div><div class='add'>+	if [[ "${attr}" = *"value=1" ]]; then</div><div class='add'>+		return ${OCF_SUCCESS}</div><div class='add'>+	fi</div><div class='add'>+</div><div class='add'>+	return ${OCF_NOT_RUNNING}</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+ganesha_grace_validate()</div><div class='add'>+{</div><div class='add'>+	return ${OCF_SUCCESS}</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+ganesha_grace_validate</div><div class='add'>+</div><div class='add'>+# Translate each action into the appropriate function call</div><div class='add'>+case $__OCF_ACTION in</div><div class='add'>+start)          ganesha_grace_start</div><div class='add'>+		;;</div><div class='add'>+stop)           ganesha_grace_stop</div><div class='add'>+		;;</div><div class='add'>+status|monitor) ganesha_grace_monitor</div><div class='add'>+		;;</div><div class='add'>+notify)         ganesha_grace_notify</div><div class='add'>+		;;</div><div class='add'>+*)              ganesha_grace_usage</div><div class='add'>+		exit ${OCF_ERR_UNIMPLEMENTED}</div><div class='add'>+		;;</div><div class='add'>+esac</div><div class='add'>+</div><div class='add'>+rc=$?</div><div class='add'>+</div><div class='add'>+# The resource agent may optionally log a debug message</div><div class='add'>+ocf_log debug "${OCF_RESOURCE_INSTANCE} ${__OCF_ACTION} returned $rc"</div><div class='add'>+exit $rc</div><div class='head'>diff --git a/extras/ganesha/ocf/ganesha_mon b/extras/ganesha/ocf/ganesha_mon<br/>new file mode 100644<br/>index 00000000000..2b4a9d6da84<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/extras/ganesha/ocf/ganesha_mon?id=d1d7a6f35c816822fab51c820e25023863c239c1'>extras/ganesha/ocf/ganesha_mon</a></div><div class='hunk'>@@ -0,0 +1,234 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+#</div><div class='add'>+# Copyright (c) 2014 Anand Subramanian anands@redhat.com</div><div class='add'>+# Copyright (c) 2015 Red Hat Inc.</div><div class='add'>+#                    All Rights Reserved.</div><div class='add'>+#</div><div class='add'>+# This program is free software; you can redistribute it and/or modify</div><div class='add'>+# it under the terms of version 2 of the GNU General Public License as</div><div class='add'>+# published by the Free Software Foundation.</div><div class='add'>+#</div><div class='add'>+# This program is distributed in the hope that it would be useful, but</div><div class='add'>+# WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='add'>+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.</div><div class='add'>+#</div><div class='add'>+# Further, this software is distributed without any warranty that it is</div><div class='add'>+# free of the rightful claim of any third person regarding infringement</div><div class='add'>+# or the like.  Any license provided herein, whether implied or</div><div class='add'>+# otherwise, applies only to this software file.  Patent licenses, if</div><div class='add'>+# any, provided herein do not apply to combinations of this program with</div><div class='add'>+# other software, or any other product whatsoever.</div><div class='add'>+#</div><div class='add'>+# You should have received a copy of the GNU General Public License</div><div class='add'>+# along with this program; if not, write the Free Software Foundation,</div><div class='add'>+# Inc., 59 Temple Place - Suite 330, Boston MA 02111-1307, USA.</div><div class='add'>+#</div><div class='add'>+#</div><div class='add'>+</div><div class='add'>+# Initialization:</div><div class='add'>+: ${OCF_FUNCTIONS_DIR=${OCF_ROOT}/lib/heartbeat}</div><div class='add'>+. ${OCF_FUNCTIONS_DIR}/ocf-shellfuncs</div><div class='add'>+</div><div class='add'>+if [ -n "${OCF_DEBUG_LIBRARY}" ]; then</div><div class='add'>+	. ${OCF_DEBUG_LIBRARY}</div><div class='add'>+else</div><div class='add'>+	: ${OCF_FUNCTIONS_DIR=${OCF_ROOT}/lib/heartbeat}</div><div class='add'>+	. ${OCF_FUNCTIONS_DIR}/ocf-shellfuncs</div><div class='add'>+fi</div><div class='add'>+</div><div class='add'>+# Defaults</div><div class='add'>+OCF_RESKEY_ganesha_active_default="ganesha-active"</div><div class='add'>+OCF_RESKEY_grace_active_default="grace-active"</div><div class='add'>+OCF_RESKEY_grace_delay_default="5"</div><div class='add'>+</div><div class='add'>+: ${OCF_RESKEY_ganesha_active=${OCF_RESKEY_ganesha_active_default}}</div><div class='add'>+: ${OCF_RESKEY_grace_active=${OCF_RESKEY_grace_active_default}}</div><div class='add'>+: ${OCF_RESKEY_grace_delay=${OCF_RESKEY_grace_delay_default}}</div><div class='add'>+</div><div class='add'>+ganesha_meta_data() {</div><div class='add'>+	cat &lt;&lt;END</div><div class='add'>+&lt;?xml version="1.0"?&gt;</div><div class='add'>+&lt;!DOCTYPE resource-agent SYSTEM "ra-api-1.dtd"&gt;</div><div class='add'>+&lt;resource-agent name="ganesha_mon"&gt;</div><div class='add'>+&lt;version&gt;1.0&lt;/version&gt;</div><div class='add'>+</div><div class='add'>+&lt;longdesc lang="en"&gt;</div><div class='add'>+This Linux-specific resource agent acts as a dummy</div><div class='add'>+resource agent for nfs-ganesha.</div><div class='add'>+&lt;/longdesc&gt;</div><div class='add'>+</div><div class='add'>+&lt;shortdesc lang="en"&gt;Manages the user-space nfs-ganesha NFS server&lt;/shortdesc&gt;</div><div class='add'>+</div><div class='add'>+&lt;parameters&gt;</div><div class='add'>+&lt;parameter name="ganesha_active"&gt;</div><div class='add'>+&lt;longdesc lang="en"&gt;NFS-Ganesha daemon active attribute&lt;/longdesc&gt;</div><div class='add'>+&lt;shortdesc lang="en"&gt;NFS-Ganesha daemon active attribute&lt;/shortdesc&gt;</div><div class='add'>+&lt;content type="string" default="ganesha-active" /&gt;</div><div class='add'>+&lt;/parameter&gt;</div><div class='add'>+&lt;parameter name="grace_active"&gt;</div><div class='add'>+&lt;longdesc lang="en"&gt;NFS-Ganesha grace active attribute&lt;/longdesc&gt;</div><div class='add'>+&lt;shortdesc lang="en"&gt;NFS-Ganesha grace active attribute&lt;/shortdesc&gt;</div><div class='add'>+&lt;content type="string" default="grace-active" /&gt;</div><div class='add'>+&lt;/parameter&gt;</div><div class='add'>+&lt;parameter name="grace_delay"&gt;</div><div class='add'>+&lt;longdesc lang="en"&gt;</div><div class='add'>+NFS-Ganesha grace delay.</div><div class='add'>+When changing this, adjust the ganesha_grace RA's monitor interval to match.</div><div class='add'>+&lt;/longdesc&gt;</div><div class='add'>+&lt;shortdesc lang="en"&gt;NFS-Ganesha grace delay&lt;/shortdesc&gt;</div><div class='add'>+&lt;content type="string" default="5" /&gt;</div><div class='add'>+&lt;/parameter&gt;</div><div class='add'>+&lt;/parameters&gt;</div><div class='add'>+</div><div class='add'>+&lt;actions&gt;</div><div class='add'>+&lt;action name="start"   timeout="40s" /&gt;</div><div class='add'>+&lt;action name="stop"    timeout="40s" /&gt;</div><div class='add'>+&lt;action name="status"  timeout="20s" interval="60s" /&gt;</div><div class='add'>+&lt;action name="monitor" depth="0"  timeout="10s" interval="10s" /&gt;</div><div class='add'>+&lt;action name="meta-data"  timeout="20s" /&gt;</div><div class='add'>+&lt;/actions&gt;</div><div class='add'>+&lt;/resource-agent&gt;</div><div class='add'>+END</div><div class='add'>+</div><div class='add'>+return ${OCF_SUCCESS}</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+ganesha_mon_usage() {</div><div class='add'>+	echo "ganesha.nfsd USAGE"</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+# Make sure meta-data and usage always succeed</div><div class='add'>+case ${__OCF_ACTION} in</div><div class='add'>+	meta-data)	ganesha_meta_data</div><div class='add'>+			exit ${OCF_SUCCESS}</div><div class='add'>+			;;</div><div class='add'>+	usage|help)	ganesha_usage</div><div class='add'>+			exit ${OCF_SUCCESS}</div><div class='add'>+			;;</div><div class='add'>+	*)</div><div class='add'>+			;;</div><div class='add'>+esac</div><div class='add'>+</div><div class='add'>+ganesha_mon_start()</div><div class='add'>+{</div><div class='add'>+	ocf_log debug "ganesha_mon_start"</div><div class='add'>+	ganesha_mon_monitor</div><div class='add'>+	return $OCF_SUCCESS</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+ganesha_mon_stop()</div><div class='add'>+{</div><div class='add'>+	ocf_log debug "ganesha_mon_stop"</div><div class='add'>+	return $OCF_SUCCESS</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+ganesha_mon_monitor()</div><div class='add'>+{</div><div class='add'>+	local host=$(hostname -s)</div><div class='add'>+	local pid_file="/var/run/ganesha.pid"</div><div class='add'>+	local rhel6_pid_file="/var/run/ganesha.nfsd.pid"</div><div class='add'>+	local proc_pid="/proc/"</div><div class='add'>+</div><div class='add'>+	# RHEL6 /etc/init.d/nfs-ganesha adds -p /var/run/ganesha.nfsd.pid</div><div class='add'>+	# RHEL7 systemd does not. Would be nice if all distros used the</div><div class='add'>+	# same pid file.</div><div class='add'>+	if [ -e ${rhel6_pid_file} ]; then</div><div class='add'>+		pid_file=${rhel6_pid_file}</div><div class='add'>+	fi</div><div class='add'>+	if [ -e ${pid_file} ]; then</div><div class='add'>+		proc_pid="${proc_pid}$(cat ${pid_file})"</div><div class='add'>+	fi</div><div class='add'>+</div><div class='add'>+	if [ "x${proc_pid}" != "x/proc/" -a -d ${proc_pid} ]; then</div><div class='add'>+</div><div class='add'>+		attrd_updater -n ${OCF_RESKEY_ganesha_active} -v 1</div><div class='add'>+		if [ $? -ne 0 ]; then</div><div class='add'>+			ocf_log info "warning: attrd_updater -n ${OCF_RESKEY_ganesha_active} -v 1 failed"</div><div class='add'>+		fi</div><div class='add'>+</div><div class='add'>+		# ganesha_grace (nfs-grace) RA follows grace-active attr</div><div class='add'>+		# w/ constraint location</div><div class='add'>+		attrd_updater -n ${OCF_RESKEY_grace_active} -v 1</div><div class='add'>+		if [ $? -ne 0 ]; then</div><div class='add'>+			ocf_log info "warning: attrd_updater -n ${OCF_RESKEY_grace_active} -v 1 failed"</div><div class='add'>+		fi</div><div class='add'>+</div><div class='add'>+		# ganesha_mon (nfs-mon) and ganesha_grace (nfs-grace)</div><div class='add'>+		# track grace-active crm_attr (attr != crm_attr)</div><div class='add'>+		# we can't just use the attr as there's no way to query</div><div class='add'>+		# its value in RHEL6 pacemaker</div><div class='add'>+</div><div class='add'>+		crm_attribute --node=${host} --lifetime=forever --name=${OCF_RESKEY_grace_active} --update=1 2&gt; /dev/null</div><div class='add'>+		if [ $? -ne 0 ]; then</div><div class='add'>+			host=$(hostname)</div><div class='add'>+			crm_attribute --node=${host} --lifetime=forever --name=${OCF_RESKEY_grace_active} --update=1 2&gt; /dev/null</div><div class='add'>+			if [ $? -ne 0 ]; then</div><div class='add'>+				ocf_log info "mon monitor warning: crm_attribute --node=${host} --lifetime=forever --name=${OCF_RESKEY_grace_active} --update=1 failed"</div><div class='add'>+			fi</div><div class='add'>+		fi</div><div class='add'>+</div><div class='add'>+		return ${OCF_SUCCESS}</div><div class='add'>+	fi</div><div class='add'>+</div><div class='add'>+	# VIP fail-over is triggered by clearing the</div><div class='add'>+	# ganesha-active node attribute on this node.</div><div class='add'>+	#</div><div class='add'>+	# Meanwhile the ganesha_grace notify() runs when its</div><div class='add'>+	# nfs-grace resource is disabled on a node; which</div><div class='add'>+	# is triggered by clearing the grace-active attribute</div><div class='add'>+	# on this node.</div><div class='add'>+	#</div><div class='add'>+	# We need to allow time for it to run and put</div><div class='add'>+	# the remaining ganesha.nfsds into grace before</div><div class='add'>+	# initiating the VIP fail-over.</div><div class='add'>+</div><div class='add'>+	attrd_updater -D -n ${OCF_RESKEY_grace_active}</div><div class='add'>+	if [ $? -ne 0 ]; then</div><div class='add'>+		ocf_log info "warning: attrd_updater -D -n ${OCF_RESKEY_grace_active} failed"</div><div class='add'>+	fi</div><div class='add'>+</div><div class='add'>+	host=$(hostname -s)</div><div class='add'>+	crm_attribute --node=${host} --name=${OCF_RESKEY_grace_active} --update=0 2&gt; /dev/null</div><div class='add'>+	if [ $? -ne 0 ]; then</div><div class='add'>+		host=$(hostname)</div><div class='add'>+		crm_attribute --node=${host} --name=${OCF_RESKEY_grace_active} --update=0 2&gt; /dev/null</div><div class='add'>+		if [ $? -ne 0 ]; then</div><div class='add'>+			ocf_log info "mon monitor warning: crm_attribute --node=${host} --name=${OCF_RESKEY_grace_active} --update=0 failed"</div><div class='add'>+		fi</div><div class='add'>+	fi</div><div class='add'>+</div><div class='add'>+	sleep ${OCF_RESKEY_grace_delay}</div><div class='add'>+</div><div class='add'>+	attrd_updater -D -n ${OCF_RESKEY_ganesha_active}</div><div class='add'>+	if [ $? -ne 0 ]; then</div><div class='add'>+		ocf_log info "warning: attrd_updater -D -n ${OCF_RESKEY_ganesha_active} failed"</div><div class='add'>+	fi</div><div class='add'>+</div><div class='add'>+	return ${OCF_SUCCESS}</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+ganesha_mon_validate()</div><div class='add'>+{</div><div class='add'>+	return ${OCF_SUCCESS}</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+ganesha_mon_validate</div><div class='add'>+</div><div class='add'>+# Translate each action into the appropriate function call</div><div class='add'>+case ${__OCF_ACTION} in</div><div class='add'>+start)          ganesha_mon_start</div><div class='add'>+		;;</div><div class='add'>+stop)           ganesha_mon_stop</div><div class='add'>+		;;</div><div class='add'>+status|monitor) ganesha_mon_monitor</div><div class='add'>+		;;</div><div class='add'>+*)              ganesha_mon_usage</div><div class='add'>+		exit ${OCF_ERR_UNIMPLEMENTED}</div><div class='add'>+		;;</div><div class='add'>+esac</div><div class='add'>+</div><div class='add'>+rc=$?</div><div class='add'>+</div><div class='add'>+# The resource agent may optionally log a debug message</div><div class='add'>+ocf_log debug "${OCF_RESOURCE_INSTANCE} ${__OCF_ACTION} returned $rc"</div><div class='add'>+exit $rc</div><div class='head'>diff --git a/extras/ganesha/ocf/ganesha_nfsd b/extras/ganesha/ocf/ganesha_nfsd<br/>new file mode 100644<br/>index 00000000000..f91e8b6b8f7<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/extras/ganesha/ocf/ganesha_nfsd?id=d1d7a6f35c816822fab51c820e25023863c239c1'>extras/ganesha/ocf/ganesha_nfsd</a></div><div class='hunk'>@@ -0,0 +1,167 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+#</div><div class='add'>+# Copyright (c) 2014 Anand Subramanian anands@redhat.com</div><div class='add'>+# Copyright (c) 2015 Red Hat Inc.</div><div class='add'>+#                    All Rights Reserved.</div><div class='add'>+#</div><div class='add'>+# This program is free software; you can redistribute it and/or modify</div><div class='add'>+# it under the terms of version 2 of the GNU General Public License as</div><div class='add'>+# published by the Free Software Foundation.</div><div class='add'>+#</div><div class='add'>+# This program is distributed in the hope that it would be useful, but</div><div class='add'>+# WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='add'>+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.</div><div class='add'>+#</div><div class='add'>+# Further, this software is distributed without any warranty that it is</div><div class='add'>+# free of the rightful claim of any third person regarding infringement</div><div class='add'>+# or the like.  Any license provided herein, whether implied or</div><div class='add'>+# otherwise, applies only to this software file.  Patent licenses, if</div><div class='add'>+# any, provided herein do not apply to combinations of this program with</div><div class='add'>+# other software, or any other product whatsoever.</div><div class='add'>+#</div><div class='add'>+# You should have received a copy of the GNU General Public License</div><div class='add'>+# along with this program; if not, write the Free Software Foundation,</div><div class='add'>+# Inc., 59 Temple Place - Suite 330, Boston MA 02111-1307, USA.</div><div class='add'>+#</div><div class='add'>+#</div><div class='add'>+</div><div class='add'>+# Initialization:</div><div class='add'>+: ${OCF_FUNCTIONS_DIR=${OCF_ROOT}/lib/heartbeat}</div><div class='add'>+. ${OCF_FUNCTIONS_DIR}/ocf-shellfuncs</div><div class='add'>+</div><div class='add'>+if [ -n "${OCF_DEBUG_LIBRARY}" ]; then</div><div class='add'>+	. ${OCF_DEBUG_LIBRARY}</div><div class='add'>+else</div><div class='add'>+	: ${OCF_FUNCTIONS_DIR=${OCF_ROOT}/lib/heartbeat}</div><div class='add'>+	. ${OCF_FUNCTIONS_DIR}/ocf-shellfuncs</div><div class='add'>+fi</div><div class='add'>+</div><div class='add'>+OCF_RESKEY_ha_vol_mnt_default="/run/gluster/shared_storage"</div><div class='add'>+: ${OCF_RESKEY_ha_vol_mnt=${OCF_RESKEY_ha_vol_mnt_default}}</div><div class='add'>+</div><div class='add'>+ganesha_meta_data() {</div><div class='add'>+	cat &lt;&lt;END</div><div class='add'>+&lt;?xml version="1.0"?&gt;</div><div class='add'>+&lt;!DOCTYPE resource-agent SYSTEM "ra-api-1.dtd"&gt;</div><div class='add'>+&lt;resource-agent name="ganesha_nfsd"&gt;</div><div class='add'>+&lt;version&gt;1.0&lt;/version&gt;</div><div class='add'>+</div><div class='add'>+&lt;longdesc lang="en"&gt;</div><div class='add'>+This Linux-specific resource agent acts as a dummy</div><div class='add'>+resource agent for nfs-ganesha.</div><div class='add'>+&lt;/longdesc&gt;</div><div class='add'>+</div><div class='add'>+&lt;shortdesc lang="en"&gt;Manages the user-space nfs-ganesha NFS server&lt;/shortdesc&gt;</div><div class='add'>+</div><div class='add'>+&lt;parameters&gt;</div><div class='add'>+&lt;parameter name="ha_vol_mnt"&gt;</div><div class='add'>+&lt;longdesc lang="en"&gt;HA State Volume Mount Point&lt;/longdesc&gt;</div><div class='add'>+&lt;shortdesc lang="en"&gt;HA_State Volume Mount Point&lt;/shortdesc&gt;</div><div class='add'>+&lt;content type="string" default="" /&gt;</div><div class='add'>+&lt;/parameter&gt;</div><div class='add'>+&lt;/parameters&gt;</div><div class='add'>+</div><div class='add'>+&lt;actions&gt;</div><div class='add'>+&lt;action name="start"   timeout="5s" /&gt;</div><div class='add'>+&lt;action name="stop"    timeout="5s" /&gt;</div><div class='add'>+&lt;action name="status" depth="0"  timeout="5s" interval="0" /&gt;</div><div class='add'>+&lt;action name="monitor" depth="0"  timeout="5s" interval="0" /&gt;</div><div class='add'>+&lt;action name="meta-data"  timeout="20s" /&gt;</div><div class='add'>+&lt;/actions&gt;</div><div class='add'>+&lt;/resource-agent&gt;</div><div class='add'>+END</div><div class='add'>+</div><div class='add'>+return ${OCF_SUCCESS}</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+ganesha_nfsd_usage() {</div><div class='add'>+	echo "ganesha.nfsd USAGE"</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+# Make sure meta-data and usage always succeed</div><div class='add'>+case $__OCF_ACTION in</div><div class='add'>+	meta-data)	ganesha_meta_data</div><div class='add'>+			exit ${OCF_SUCCESS}</div><div class='add'>+			;;</div><div class='add'>+	usage|help)	ganesha_usage</div><div class='add'>+			exit ${OCF_SUCCESS}</div><div class='add'>+			;;</div><div class='add'>+	*)</div><div class='add'>+			;;</div><div class='add'>+esac</div><div class='add'>+</div><div class='add'>+ganesha_nfsd_start()</div><div class='add'>+{</div><div class='add'>+	local long_host=$(hostname)</div><div class='add'>+</div><div class='add'>+	if [[ -d /var/lib/nfs ]]; then</div><div class='add'>+		mv /var/lib/nfs /var/lib/nfs.backup</div><div class='add'>+		if [ $? -ne 0 ]; then</div><div class='add'>+			ocf_log notice "mv /var/lib/nfs /var/lib/nfs.backup failed"</div><div class='add'>+		fi</div><div class='add'>+		ln -s ${OCF_RESKEY_ha_vol_mnt}/nfs-ganesha/${long_host}/nfs /var/lib/nfs</div><div class='add'>+		if [ $? -ne 0 ]; then</div><div class='add'>+			ocf_log notice "ln -s ${OCF_RESKEY_ha_vol_mnt}/nfs-ganesha/${long_host}/nfs /var/lib/nfs failed"</div><div class='add'>+		fi</div><div class='add'>+	fi</div><div class='add'>+</div><div class='add'>+	return ${OCF_SUCCESS}</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+ganesha_nfsd_stop()</div><div class='add'>+{</div><div class='add'>+</div><div class='add'>+	if [ -L /var/lib/nfs -a -d /var/lib/nfs.backup ]; then</div><div class='add'>+		rm -f /var/lib/nfs</div><div class='add'>+		if [ $? -ne 0 ]; then</div><div class='add'>+			ocf_log notice "rm -f /var/lib/nfs failed"</div><div class='add'>+		fi</div><div class='add'>+		mv /var/lib/nfs.backup /var/lib/nfs</div><div class='add'>+		if [ $? -ne 0 ]; then</div><div class='add'>+			ocf_log notice "mv /var/lib/nfs.backup /var/lib/nfs failed"</div><div class='add'>+		fi</div><div class='add'>+	fi</div><div class='add'>+</div><div class='add'>+	return ${OCF_SUCCESS}</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+ganesha_nfsd_monitor()</div><div class='add'>+{</div><div class='add'>+	# pacemaker checks to see if RA is already running before starting it.</div><div class='add'>+	# if we return success, then it's presumed it's already running and</div><div class='add'>+	# doesn't need to be started, i.e. invoke the start action.</div><div class='add'>+	# return something other than success to make pacemaker invoke the</div><div class='add'>+	# start action</div><div class='add'>+	if [[ -L /var/lib/nfs ]]; then</div><div class='add'>+		return ${OCF_SUCCESS}</div><div class='add'>+	fi</div><div class='add'>+	return ${OCF_NOT_RUNNING}</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+ganesha_nfsd_validate()</div><div class='add'>+{</div><div class='add'>+	return ${OCF_SUCCESS}</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+ganesha_nfsd_validate</div><div class='add'>+</div><div class='add'>+# ocf_log notice "ganesha_nfsd ${OCF_RESOURCE_INSTANCE} $__OCF_ACTION"</div><div class='add'>+</div><div class='add'>+# Translate each action into the appropriate function call</div><div class='add'>+case $__OCF_ACTION in</div><div class='add'>+start)          ganesha_nfsd_start</div><div class='add'>+		;;</div><div class='add'>+stop)           ganesha_nfsd_stop</div><div class='add'>+		;;</div><div class='add'>+status|monitor) ganesha_nfsd_monitor</div><div class='add'>+		;;</div><div class='add'>+*)              ganesha_nfsd_usage</div><div class='add'>+		exit ${OCF_ERR_UNIMPLEMENTED}</div><div class='add'>+		;;</div><div class='add'>+esac</div><div class='add'>+</div><div class='add'>+rc=$?</div><div class='add'>+</div><div class='add'>+# The resource agent may optionally log a debug message</div><div class='add'>+ocf_log debug "${OCF_RESOURCE_INSTANCE} ${__OCF_ACTION} returned $rc"</div><div class='add'>+exit $rc</div><div class='head'>diff --git a/extras/ganesha/scripts/Makefile.am b/extras/ganesha/scripts/Makefile.am<br/>new file mode 100644<br/>index 00000000000..7e345fd5f19<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/extras/ganesha/scripts/Makefile.am?id=d1d7a6f35c816822fab51c820e25023863c239c1'>extras/ganesha/scripts/Makefile.am</a></div><div class='hunk'>@@ -0,0 +1,6 @@</div><div class='add'>+EXTRA_DIST= create-export-ganesha.sh generate-epoch.py dbus-send.sh \</div><div class='add'>+			ganesha-ha.sh</div><div class='add'>+</div><div class='add'>+scriptsdir = $(libexecdir)/ganesha</div><div class='add'>+scripts_SCRIPTS = create-export-ganesha.sh dbus-send.sh generate-epoch.py \</div><div class='add'>+				  ganesha-ha.sh</div><div class='head'>diff --git a/extras/ganesha/scripts/create-export-ganesha.sh b/extras/ganesha/scripts/create-export-ganesha.sh<br/>new file mode 100755<br/>index 00000000000..3040e8138b0<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/extras/ganesha/scripts/create-export-ganesha.sh?id=d1d7a6f35c816822fab51c820e25023863c239c1'>extras/ganesha/scripts/create-export-ganesha.sh</a></div><div class='hunk'>@@ -0,0 +1,92 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+#This script is called by glusterd when the user</div><div class='add'>+#tries to export a volume via NFS-Ganesha.</div><div class='add'>+#An export file specific to a volume</div><div class='add'>+#is created in GANESHA_DIR/exports.</div><div class='add'>+</div><div class='add'>+# Try loading the config from any of the distro</div><div class='add'>+# specific configuration locations</div><div class='add'>+if [ -f /etc/sysconfig/ganesha ]</div><div class='add'>+        then</div><div class='add'>+        . /etc/sysconfig/ganesha</div><div class='add'>+fi</div><div class='add'>+if [ -f /etc/conf.d/ganesha ]</div><div class='add'>+        then</div><div class='add'>+        . /etc/conf.d/ganesha</div><div class='add'>+fi</div><div class='add'>+if [ -f /etc/default/ganesha ]</div><div class='add'>+        then</div><div class='add'>+        . /etc/default/ganesha</div><div class='add'>+fi</div><div class='add'>+</div><div class='add'>+GANESHA_DIR=${1%/}</div><div class='add'>+OPTION=$2</div><div class='add'>+VOL=$3</div><div class='add'>+CONF=$GANESHA_DIR"/ganesha.conf"</div><div class='add'>+declare -i EXPORT_ID</div><div class='add'>+</div><div class='add'>+function check_cmd_status()</div><div class='add'>+{</div><div class='add'>+        if [ "$1" != "0" ]</div><div class='add'>+                 then</div><div class='add'>+                 rm -rf $GANESHA_DIR/exports/export.$VOL.conf</div><div class='add'>+                 sed -i /$VOL.conf/d $CONF</div><div class='add'>+                 exit 1</div><div class='add'>+        fi</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+if [ ! -d "$GANESHA_DIR/exports" ];</div><div class='add'>+        then</div><div class='add'>+        mkdir $GANESHA_DIR/exports</div><div class='add'>+        check_cmd_status `echo $?`</div><div class='add'>+fi</div><div class='add'>+</div><div class='add'>+function write_conf()</div><div class='add'>+{</div><div class='add'>+echo -e "# WARNING : Using Gluster CLI will overwrite manual</div><div class='add'>+# changes made to this file. To avoid it, edit the</div><div class='add'>+# file and run ganesha-ha.sh --refresh-config."</div><div class='add'>+</div><div class='add'>+echo "EXPORT{"</div><div class='add'>+echo "      Export_Id = 2;"</div><div class='add'>+echo "      Path = \"/$VOL\";"</div><div class='add'>+echo "      FSAL {"</div><div class='add'>+echo "           name = "GLUSTER";"</div><div class='add'>+echo "           hostname=\"localhost\";"</div><div class='add'>+echo  "          volume=\"$VOL\";"</div><div class='add'>+echo "           }"</div><div class='add'>+echo "      Access_type = RW;"</div><div class='add'>+echo "      Disable_ACL = true;"</div><div class='add'>+echo '      Squash="No_root_squash";'</div><div class='add'>+echo "      Pseudo=\"/$VOL\";"</div><div class='add'>+echo '      Protocols = "3", "4" ;'</div><div class='add'>+echo '      Transports = "UDP","TCP";'</div><div class='add'>+echo '      SecType = "sys";'</div><div class='add'>+echo '      Security_Label = False;'</div><div class='add'>+echo "     }"</div><div class='add'>+}</div><div class='add'>+if [ "$OPTION" = "on" ];</div><div class='add'>+then</div><div class='add'>+        if ! (cat $CONF | grep  $VOL.conf\"$ )</div><div class='add'>+        then</div><div class='add'>+                write_conf $@ &gt; $GANESHA_DIR/exports/export.$VOL.conf</div><div class='add'>+                echo "%include \"$GANESHA_DIR/exports/export.$VOL.conf\"" &gt;&gt; $CONF</div><div class='add'>+                count=`ls -l $GANESHA_DIR/exports/*.conf | wc -l`</div><div class='add'>+                if [ "$count" = "1" ] ; then</div><div class='add'>+                        EXPORT_ID=2</div><div class='add'>+                else</div><div class='add'>+                        EXPORT_ID=`cat $GANESHA_DIR/.export_added`</div><div class='add'>+                        check_cmd_status `echo $?`</div><div class='add'>+                        EXPORT_ID=EXPORT_ID+1</div><div class='add'>+                        sed -i s/Export_Id.*/"Export_Id= $EXPORT_ID ;"/ \</div><div class='add'>+                        $GANESHA_DIR/exports/export.$VOL.conf</div><div class='add'>+                        check_cmd_status `echo $?`</div><div class='add'>+                fi</div><div class='add'>+                echo $EXPORT_ID &gt; $GANESHA_DIR/.export_added</div><div class='add'>+        fi</div><div class='add'>+else</div><div class='add'>+        rm -rf $GANESHA_DIR/exports/export.$VOL.conf</div><div class='add'>+        sed -i /$VOL.conf/d $CONF</div><div class='add'>+fi</div><div class='head'>diff --git a/extras/ganesha/scripts/dbus-send.sh b/extras/ganesha/scripts/dbus-send.sh<br/>new file mode 100755<br/>index 00000000000..9d613a0e7ad<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/extras/ganesha/scripts/dbus-send.sh?id=d1d7a6f35c816822fab51c820e25023863c239c1'>extras/ganesha/scripts/dbus-send.sh</a></div><div class='hunk'>@@ -0,0 +1,70 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+# Try loading the config from any of the distro</div><div class='add'>+# specific configuration locations</div><div class='add'>+if [ -f /etc/sysconfig/ganesha ]</div><div class='add'>+        then</div><div class='add'>+        . /etc/sysconfig/ganesha</div><div class='add'>+fi</div><div class='add'>+if [ -f /etc/conf.d/ganesha ]</div><div class='add'>+        then</div><div class='add'>+        . /etc/conf.d/ganesha</div><div class='add'>+fi</div><div class='add'>+if [ -f /etc/default/ganesha ]</div><div class='add'>+        then</div><div class='add'>+        . /etc/default/ganesha</div><div class='add'>+fi</div><div class='add'>+</div><div class='add'>+GANESHA_DIR=${1%/}</div><div class='add'>+OPTION=$2</div><div class='add'>+VOL=$3</div><div class='add'>+CONF=$GANESHA_DIR"/ganesha.conf"</div><div class='add'>+</div><div class='add'>+function check_cmd_status()</div><div class='add'>+{</div><div class='add'>+        if [ "$1" != "0" ]</div><div class='add'>+        then</div><div class='add'>+                logger "dynamic export failed on node :${hostname -s}"</div><div class='add'>+        fi</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#This function keeps track of export IDs and increments it with every new entry</div><div class='add'>+function dynamic_export_add()</div><div class='add'>+{</div><div class='add'>+        dbus-send  --system \</div><div class='add'>+--dest=org.ganesha.nfsd  /org/ganesha/nfsd/ExportMgr \</div><div class='add'>+org.ganesha.nfsd.exportmgr.AddExport  string:$GANESHA_DIR/exports/export.$VOL.conf \</div><div class='add'>+string:"EXPORT(Path=/$VOL)"</div><div class='add'>+        check_cmd_status `echo $?`</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#This function removes an export dynamically(uses the export_id of the export)</div><div class='add'>+function dynamic_export_remove()</div><div class='add'>+{</div><div class='add'>+        # Below bash fetch all the export from ShowExport command and search</div><div class='add'>+        # export entry based on path and then get its export entry.</div><div class='add'>+        # There are two possiblities for path, either entire volume will be</div><div class='add'>+        # exported or subdir. It handles both cases. But it remove only first</div><div class='add'>+        # entry from the list based on assumption that entry exported via cli</div><div class='add'>+        # has lowest export id value</div><div class='add'>+	removed_id=$(dbus-send --type=method_call --print-reply --system \</div><div class='add'>+                    --dest=org.ganesha.nfsd /org/ganesha/nfsd/ExportMgr \</div><div class='add'>+                    org.ganesha.nfsd.exportmgr.ShowExports | grep -B 1 -we \</div><div class='add'>+                    "/"$VOL -e "/"$VOL"/" | grep uint16 | awk '{print $2}' \</div><div class='add'>+		    | head -1)</div><div class='add'>+</div><div class='add'>+        dbus-send --print-reply --system \</div><div class='add'>+--dest=org.ganesha.nfsd /org/ganesha/nfsd/ExportMgr \</div><div class='add'>+org.ganesha.nfsd.exportmgr.RemoveExport uint16:$removed_id</div><div class='add'>+        check_cmd_status `echo $?`</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+if [ "$OPTION" = "on" ];</div><div class='add'>+then</div><div class='add'>+        dynamic_export_add $@</div><div class='add'>+fi</div><div class='add'>+</div><div class='add'>+if [ "$OPTION" = "off" ];</div><div class='add'>+then</div><div class='add'>+        dynamic_export_remove $@</div><div class='add'>+fi</div><div class='head'>diff --git a/extras/ganesha/scripts/ganesha-ha.sh b/extras/ganesha/scripts/ganesha-ha.sh<br/>new file mode 100644<br/>index 00000000000..9790a719e10<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/extras/ganesha/scripts/ganesha-ha.sh?id=d1d7a6f35c816822fab51c820e25023863c239c1'>extras/ganesha/scripts/ganesha-ha.sh</a></div><div class='hunk'>@@ -0,0 +1,1199 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+# Copyright 2015-2016 Red Hat Inc.  All Rights Reserved</div><div class='add'>+#</div><div class='add'>+# Pacemaker+Corosync High Availability for NFS-Ganesha</div><div class='add'>+#</div><div class='add'>+# setup, teardown, add, delete, refresh-config, and status</div><div class='add'>+#</div><div class='add'>+# Each participating node in the cluster is assigned a virtual IP (VIP)</div><div class='add'>+# which fails over to another node when its associated ganesha.nfsd dies</div><div class='add'>+# for any reason. After the VIP is moved to another node all the</div><div class='add'>+# ganesha.nfsds are send a signal using DBUS to put them into NFS GRACE.</div><div class='add'>+#</div><div class='add'>+# There are six resource agent types used: ganesha_mon, ganesha_grace,</div><div class='add'>+# ganesha_nfsd, IPaddr, and Dummy. ganesha_mon is used to monitor the</div><div class='add'>+# ganesha.nfsd. ganesha_grace is used to send the DBUS signal to put</div><div class='add'>+# the remaining ganesha.nfsds into grace. ganesha_nfsd is used to start</div><div class='add'>+# and stop the ganesha.nfsd during setup and teardown. IPaddr manages</div><div class='add'>+# the VIP. A Dummy resource named $hostname-trigger_ip-1 is used to</div><div class='add'>+# ensure that the NFS GRACE DBUS signal is sent after the VIP moves to</div><div class='add'>+# the new host.</div><div class='add'>+</div><div class='add'>+GANESHA_HA_SH=$(realpath $0)</div><div class='add'>+HA_NUM_SERVERS=0</div><div class='add'>+HA_SERVERS=""</div><div class='add'>+HA_VOL_NAME="gluster_shared_storage"</div><div class='add'>+HA_VOL_MNT="/run/gluster/shared_storage"</div><div class='add'>+HA_CONFDIR=$HA_VOL_MNT"/nfs-ganesha"</div><div class='add'>+SERVICE_MAN="DISTRO_NOT_FOUND"</div><div class='add'>+</div><div class='add'>+# rhel, fedora id, version</div><div class='add'>+ID=""</div><div class='add'>+VERSION_ID=""</div><div class='add'>+</div><div class='add'>+PCS9OR10_PCS_CNAME_OPTION=""</div><div class='add'>+PCS9OR10_PCS_CLONE_OPTION="clone"</div><div class='add'>+SECRET_PEM="/var/lib/glusterd/nfs/secret.pem"</div><div class='add'>+</div><div class='add'>+# UNBLOCK RA uses shared_storage which may become unavailable</div><div class='add'>+# during any of the nodes reboot. Hence increase timeout value.</div><div class='add'>+PORTBLOCK_UNBLOCK_TIMEOUT="60s"</div><div class='add'>+</div><div class='add'>+# Try loading the config from any of the distro</div><div class='add'>+# specific configuration locations</div><div class='add'>+if [ -f /etc/sysconfig/ganesha ]</div><div class='add'>+        then</div><div class='add'>+        . /etc/sysconfig/ganesha</div><div class='add'>+fi</div><div class='add'>+if [ -f /etc/conf.d/ganesha ]</div><div class='add'>+        then</div><div class='add'>+        . /etc/conf.d/ganesha</div><div class='add'>+fi</div><div class='add'>+if [ -f /etc/default/ganesha ]</div><div class='add'>+        then</div><div class='add'>+        . /etc/default/ganesha</div><div class='add'>+fi</div><div class='add'>+</div><div class='add'>+GANESHA_CONF=</div><div class='add'>+</div><div class='add'>+function find_rhel7_conf</div><div class='add'>+{</div><div class='add'>+ while [[ $# &gt; 0 ]]</div><div class='add'>+        do</div><div class='add'>+                key="$1"</div><div class='add'>+                case $key in</div><div class='add'>+                        -f)</div><div class='add'>+                         CONFFILE="$2"</div><div class='add'>+                         break;</div><div class='add'>+                         ;;</div><div class='add'>+                         *)</div><div class='add'>+                         ;;</div><div class='add'>+                 esac</div><div class='add'>+                 shift</div><div class='add'>+         done</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+if [ -z ${CONFFILE} ]</div><div class='add'>+        then</div><div class='add'>+        find_rhel7_conf ${OPTIONS}</div><div class='add'>+</div><div class='add'>+fi</div><div class='add'>+</div><div class='add'>+GANESHA_CONF=${CONFFILE:-/etc/ganesha/ganesha.conf}</div><div class='add'>+</div><div class='add'>+usage() {</div><div class='add'>+</div><div class='add'>+        echo "Usage      : add|delete|refresh-config|status"</div><div class='add'>+        echo "Add-node   : ganesha-ha.sh --add &lt;HA_CONF_DIR&gt; \</div><div class='add'>+&lt;NODE-HOSTNAME&gt;  &lt;NODE-VIP&gt;"</div><div class='add'>+        echo "Delete-node: ganesha-ha.sh --delete &lt;HA_CONF_DIR&gt; \</div><div class='add'>+&lt;NODE-HOSTNAME&gt;"</div><div class='add'>+        echo "Refresh-config : ganesha-ha.sh --refresh-config &lt;HA_CONFDIR&gt; \</div><div class='add'>+&lt;volume&gt;"</div><div class='add'>+        echo "Status : ganesha-ha.sh --status &lt;HA_CONFDIR&gt;"</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+determine_service_manager () {</div><div class='add'>+</div><div class='add'>+        if [ -e "/bin/systemctl" ];</div><div class='add'>+        then</div><div class='add'>+                SERVICE_MAN="/bin/systemctl"</div><div class='add'>+        elif [ -e "/sbin/invoke-rc.d" ];</div><div class='add'>+        then</div><div class='add'>+                SERVICE_MAN="/sbin/invoke-rc.d"</div><div class='add'>+        elif [ -e "/sbin/service" ];</div><div class='add'>+        then</div><div class='add'>+                SERVICE_MAN="/sbin/service"</div><div class='add'>+        fi</div><div class='add'>+        if [[ "${SERVICE_MAN}X" == "DISTRO_NOT_FOUNDX" ]]</div><div class='add'>+        then</div><div class='add'>+                logger "Service manager not recognized, exiting"</div><div class='add'>+                exit 1</div><div class='add'>+        fi</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+manage_service ()</div><div class='add'>+{</div><div class='add'>+        local action=${1}</div><div class='add'>+        local new_node=${2}</div><div class='add'>+        local option=</div><div class='add'>+</div><div class='add'>+        if [[ "${action}" == "start" ]]; then</div><div class='add'>+                option="yes"</div><div class='add'>+        else</div><div class='add'>+                option="no"</div><div class='add'>+        fi</div><div class='add'>+        ssh -oPasswordAuthentication=no -oStrictHostKeyChecking=no -i \</div><div class='add'>+${SECRET_PEM} root@${new_node} "${GANESHA_HA_SH} --setup-ganesha-conf-files $HA_CONFDIR $option"</div><div class='add'>+</div><div class='add'>+        if [[ "${SERVICE_MAN}" == "/bin/systemctl" ]]</div><div class='add'>+        then</div><div class='add'>+                ssh -oPasswordAuthentication=no -oStrictHostKeyChecking=no -i \</div><div class='add'>+${SECRET_PEM} root@${new_node} "${SERVICE_MAN}  ${action} nfs-ganesha"</div><div class='add'>+        else</div><div class='add'>+                ssh -oPasswordAuthentication=no -oStrictHostKeyChecking=no -i \</div><div class='add'>+${SECRET_PEM} root@${new_node} "${SERVICE_MAN} nfs-ganesha ${action}"</div><div class='add'>+        fi</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+check_cluster_exists()</div><div class='add'>+{</div><div class='add'>+    local name=${1}</div><div class='add'>+    local cluster_name=""</div><div class='add'>+</div><div class='add'>+    if [ -e /var/run/corosync.pid ]; then</div><div class='add'>+        cluster_name=$(pcs status | grep "Cluster name:" | cut -d ' ' -f 3)</div><div class='add'>+        if [[ "${cluster_name}X" == "${name}X" ]]; then</div><div class='add'>+            logger "$name already exists, exiting"</div><div class='add'>+            exit 0</div><div class='add'>+        fi</div><div class='add'>+    fi</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+determine_servers()</div><div class='add'>+{</div><div class='add'>+    local cmd=${1}</div><div class='add'>+    local num_servers=0</div><div class='add'>+    local tmp_ifs=${IFS}</div><div class='add'>+    local ha_servers=""</div><div class='add'>+</div><div class='add'>+    if [ "${cmd}X" != "setupX" -a "${cmd}X" != "statusX" ]; then</div><div class='add'>+        ha_servers=$(pcs status | grep "Online:" | grep -o '\[.*\]' | sed -e 's/\[//' | sed -e 's/\]//')</div><div class='add'>+        IFS=$' '</div><div class='add'>+        for server in ${ha_servers} ; do</div><div class='add'>+            num_servers=$(expr ${num_servers} + 1)</div><div class='add'>+        done</div><div class='add'>+        IFS=${tmp_ifs}</div><div class='add'>+        HA_NUM_SERVERS=${num_servers}</div><div class='add'>+        HA_SERVERS="${ha_servers}"</div><div class='add'>+    else</div><div class='add'>+        IFS=$','</div><div class='add'>+        for server in ${HA_CLUSTER_NODES} ; do</div><div class='add'>+            num_servers=$(expr ${num_servers} + 1)</div><div class='add'>+        done</div><div class='add'>+        IFS=${tmp_ifs}</div><div class='add'>+        HA_NUM_SERVERS=${num_servers}</div><div class='add'>+        HA_SERVERS="${HA_CLUSTER_NODES//,/ }"</div><div class='add'>+    fi</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+stop_ganesha_all()</div><div class='add'>+{</div><div class='add'>+    local serverlist=${1}</div><div class='add'>+    for node in ${serverlist} ; do</div><div class='add'>+        manage_service "stop" ${node}</div><div class='add'>+    done</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+setup_cluster()</div><div class='add'>+{</div><div class='add'>+    local name=${1}</div><div class='add'>+    local num_servers=${2}</div><div class='add'>+    local servers=${3}</div><div class='add'>+    local unclean=""</div><div class='add'>+    local quorum_policy="stop"</div><div class='add'>+</div><div class='add'>+    logger "setting up cluster ${name} with the following ${servers}"</div><div class='add'>+</div><div class='add'>+    # pcs cluster setup --force ${PCS9OR10_PCS_CNAME_OPTION} ${name} ${servers}</div><div class='add'>+    pcs cluster setup --force ${PCS9OR10_PCS_CNAME_OPTION} ${name} --enable ${servers}</div><div class='add'>+    if [ $? -ne 0 ]; then</div><div class='add'>+        logger "pcs cluster setup ${PCS9OR10_PCS_CNAME_OPTION} ${name} --enable ${servers} failed, shutting down ganesha and bailing out"</div><div class='add'>+        #set up failed stop all ganesha process and clean up symlinks in cluster</div><div class='add'>+        stop_ganesha_all "${servers}"</div><div class='add'>+        exit 1;</div><div class='add'>+    fi</div><div class='add'>+</div><div class='add'>+    # pcs cluster auth ${servers}</div><div class='add'>+    pcs cluster auth</div><div class='add'>+    if [ $? -ne 0 ]; then</div><div class='add'>+        logger "pcs cluster auth failed"</div><div class='add'>+    fi</div><div class='add'>+</div><div class='add'>+    pcs cluster start --all</div><div class='add'>+    if [ $? -ne 0 ]; then</div><div class='add'>+        logger "pcs cluster start failed"</div><div class='add'>+        exit 1;</div><div class='add'>+    fi</div><div class='add'>+</div><div class='add'>+    sleep 1</div><div class='add'>+    # wait for the cluster to elect a DC before querying or writing</div><div class='add'>+    # to the CIB. BZ 1334092</div><div class='add'>+    crmadmin --dc_lookup --timeout=5000 &gt; /dev/null 2&gt;&amp;1</div><div class='add'>+    while [ $? -ne 0 ]; do</div><div class='add'>+        crmadmin --dc_lookup --timeout=5000 &gt; /dev/null 2&gt;&amp;1</div><div class='add'>+    done</div><div class='add'>+</div><div class='add'>+    unclean=$(pcs status | grep -u "UNCLEAN")</div><div class='add'>+    while [[ "${unclean}X" == "UNCLEANX" ]]; do</div><div class='add'>+         sleep 1</div><div class='add'>+         unclean=$(pcs status | grep -u "UNCLEAN")</div><div class='add'>+    done</div><div class='add'>+    sleep 1</div><div class='add'>+</div><div class='add'>+    if [ ${num_servers} -lt 3 ]; then</div><div class='add'>+        quorum_policy="ignore"</div><div class='add'>+    fi</div><div class='add'>+    pcs property set no-quorum-policy=${quorum_policy}</div><div class='add'>+    if [ $? -ne 0 ]; then</div><div class='add'>+        logger "warning: pcs property set no-quorum-policy=${quorum_policy} failed"</div><div class='add'>+    fi</div><div class='add'>+</div><div class='add'>+    pcs property set stonith-enabled=false</div><div class='add'>+    if [ $? -ne 0 ]; then</div><div class='add'>+        logger "warning: pcs property set stonith-enabled=false failed"</div><div class='add'>+    fi</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+setup_finalize_ha()</div><div class='add'>+{</div><div class='add'>+    local cibfile=${1}</div><div class='add'>+    local stopped=""</div><div class='add'>+</div><div class='add'>+    stopped=$(pcs status | grep -u "Stopped")</div><div class='add'>+    while [[ "${stopped}X" == "StoppedX" ]]; do</div><div class='add'>+         sleep 1</div><div class='add'>+         stopped=$(pcs status | grep -u "Stopped")</div><div class='add'>+    done</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+refresh_config ()</div><div class='add'>+{</div><div class='add'>+        local short_host=$(hostname -s)</div><div class='add'>+        local VOL=${1}</div><div class='add'>+        local HA_CONFDIR=${2}</div><div class='add'>+        local short_host=$(hostname -s)</div><div class='add'>+</div><div class='add'>+        local export_id=$(grep ^[[:space:]]*Export_Id $HA_CONFDIR/exports/export.$VOL.conf |\</div><div class='add'>+                          awk -F"[=,;]" '{print $2}' | tr -d '[[:space:]]')</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+        if [ -e ${SECRET_PEM} ]; then</div><div class='add'>+        while [[ ${3} ]]; do</div><div class='add'>+            current_host=`echo ${3} | cut -d "." -f 1`</div><div class='add'>+            if [[ ${short_host} != ${current_host} ]]; then</div><div class='add'>+                output=$(ssh -oPasswordAuthentication=no \</div><div class='add'>+-oStrictHostKeyChecking=no -i ${SECRET_PEM} root@${current_host} \</div><div class='add'>+"dbus-send --print-reply --system --dest=org.ganesha.nfsd \</div><div class='add'>+/org/ganesha/nfsd/ExportMgr org.ganesha.nfsd.exportmgr.UpdateExport \</div><div class='add'>+string:$HA_CONFDIR/exports/export.$VOL.conf \</div><div class='add'>+string:\"EXPORT(Export_Id=$export_id)\" 2&gt;&amp;1")</div><div class='add'>+                ret=$?</div><div class='add'>+                logger &lt;&lt;&lt; "${output}"</div><div class='add'>+                if [ ${ret} -ne 0 ]; then</div><div class='add'>+                        echo "Refresh-config failed on ${current_host}. Please check logs on ${current_host}"</div><div class='add'>+                else</div><div class='add'>+                        echo "Refresh-config completed on ${current_host}."</div><div class='add'>+                fi</div><div class='add'>+</div><div class='add'>+          fi</div><div class='add'>+          shift</div><div class='add'>+        done</div><div class='add'>+    else</div><div class='add'>+        echo "Error: refresh-config failed. Passwordless ssh is not enabled."</div><div class='add'>+        exit 1</div><div class='add'>+    fi</div><div class='add'>+</div><div class='add'>+    # Run the same command on the localhost,</div><div class='add'>+        output=$(dbus-send --print-reply --system --dest=org.ganesha.nfsd \</div><div class='add'>+/org/ganesha/nfsd/ExportMgr org.ganesha.nfsd.exportmgr.UpdateExport \</div><div class='add'>+string:$HA_CONFDIR/exports/export.$VOL.conf \</div><div class='add'>+string:"EXPORT(Export_Id=$export_id)" 2&gt;&amp;1)</div><div class='add'>+        ret=$?</div><div class='add'>+        logger &lt;&lt;&lt; "${output}"</div><div class='add'>+        if [ ${ret} -ne 0 ] ; then</div><div class='add'>+                echo "Refresh-config failed on localhost."</div><div class='add'>+        else</div><div class='add'>+                echo "Success: refresh-config completed."</div><div class='add'>+        fi</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+teardown_cluster()</div><div class='add'>+{</div><div class='add'>+    local name=${1}</div><div class='add'>+</div><div class='add'>+    for server in ${HA_SERVERS} ; do</div><div class='add'>+        if [[ ${HA_CLUSTER_NODES} != *${server}* ]]; then</div><div class='add'>+            logger "info: ${server} is not in config, removing"</div><div class='add'>+</div><div class='add'>+            pcs cluster stop ${server} --force</div><div class='add'>+            if [ $? -ne 0 ]; then</div><div class='add'>+                logger "warning: pcs cluster stop ${server} failed"</div><div class='add'>+            fi</div><div class='add'>+</div><div class='add'>+            pcs cluster node remove ${server}</div><div class='add'>+            if [ $? -ne 0 ]; then</div><div class='add'>+                logger "warning: pcs cluster node remove ${server} failed"</div><div class='add'>+            fi</div><div class='add'>+        fi</div><div class='add'>+    done</div><div class='add'>+</div><div class='add'>+    # BZ 1193433 - pcs doesn't reload cluster.conf after modification</div><div class='add'>+    # after teardown completes, a subsequent setup will appear to have</div><div class='add'>+    # 'remembered' the deleted node. You can work around this by</div><div class='add'>+    # issuing another `pcs cluster node remove $node`,</div><div class='add'>+    # `crm_node -f -R $server`, or</div><div class='add'>+    # `cibadmin --delete --xml-text '&lt;node id="$server"</div><div class='add'>+    # uname="$server"/&gt;'</div><div class='add'>+</div><div class='add'>+    pcs cluster stop --all</div><div class='add'>+    if [ $? -ne 0 ]; then</div><div class='add'>+        logger "warning pcs cluster stop --all failed"</div><div class='add'>+    fi</div><div class='add'>+</div><div class='add'>+    pcs cluster destroy</div><div class='add'>+    if [ $? -ne 0 ]; then</div><div class='add'>+        logger "error pcs cluster destroy failed"</div><div class='add'>+        exit 1</div><div class='add'>+    fi</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+cleanup_ganesha_config ()</div><div class='add'>+{</div><div class='add'>+    rm -f /etc/corosync/corosync.conf</div><div class='add'>+    rm -rf /etc/cluster/cluster.conf*</div><div class='add'>+    rm -rf /var/lib/pacemaker/cib/*</div><div class='add'>+    sed -r -i -e '/^%include[[:space:]]+".+\.conf"$/d'  $HA_CONFDIR/ganesha.conf</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+do_create_virt_ip_constraints()</div><div class='add'>+{</div><div class='add'>+    local cibfile=${1}; shift</div><div class='add'>+    local primary=${1}; shift</div><div class='add'>+    local weight="1000"</div><div class='add'>+</div><div class='add'>+    # first a constraint location rule that says the VIP must be where</div><div class='add'>+    # there's a ganesha.nfsd running</div><div class='add'>+    pcs -f ${cibfile} constraint location ${primary}-group rule score=-INFINITY ganesha-active ne 1</div><div class='add'>+    if [ $? -ne 0 ]; then</div><div class='add'>+        logger "warning: pcs constraint location ${primary}-group rule score=-INFINITY ganesha-active ne 1 failed"</div><div class='add'>+    fi</div><div class='add'>+</div><div class='add'>+    # then a set of constraint location prefers to set the prefered order</div><div class='add'>+    # for where a VIP should move</div><div class='add'>+    while [[ ${1} ]]; do</div><div class='add'>+        pcs -f ${cibfile} constraint location ${primary}-group prefers ${1}=${weight}</div><div class='add'>+        if [ $? -ne 0 ]; then</div><div class='add'>+            logger "warning: pcs constraint location ${primary}-group prefers ${1}=${weight} failed"</div><div class='add'>+        fi</div><div class='add'>+        weight=$(expr ${weight} + 1000)</div><div class='add'>+        shift</div><div class='add'>+    done</div><div class='add'>+    # and finally set the highest preference for the VIP to its home node</div><div class='add'>+    # default weight when created is/was 100.</div><div class='add'>+    # on Fedora setting appears to be additive, so to get the desired</div><div class='add'>+    # value we adjust the weight</div><div class='add'>+    # weight=$(expr ${weight} - 100)</div><div class='add'>+    pcs -f ${cibfile} constraint location ${primary}-group prefers ${primary}=${weight}</div><div class='add'>+    if [ $? -ne 0 ]; then</div><div class='add'>+        logger "warning: pcs constraint location ${primary}-group prefers ${primary}=${weight} failed"</div><div class='add'>+    fi</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+wrap_create_virt_ip_constraints()</div><div class='add'>+{</div><div class='add'>+    local cibfile=${1}; shift</div><div class='add'>+    local primary=${1}; shift</div><div class='add'>+    local head=""</div><div class='add'>+    local tail=""</div><div class='add'>+</div><div class='add'>+    # build a list of peers, e.g. for a four node cluster, for node1,</div><div class='add'>+    # the result is "node2 node3 node4"; for node2, "node3 node4 node1"</div><div class='add'>+    # and so on.</div><div class='add'>+    while [[ ${1} ]]; do</div><div class='add'>+        if [[ ${1} == ${primary} ]]; then</div><div class='add'>+            shift</div><div class='add'>+            while [[ ${1} ]]; do</div><div class='add'>+                tail=${tail}" "${1}</div><div class='add'>+                shift</div><div class='add'>+            done</div><div class='add'>+        else</div><div class='add'>+            head=${head}" "${1}</div><div class='add'>+        fi</div><div class='add'>+        shift</div><div class='add'>+    done</div><div class='add'>+    do_create_virt_ip_constraints ${cibfile} ${primary} ${tail} ${head}</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+create_virt_ip_constraints()</div><div class='add'>+{</div><div class='add'>+    local cibfile=${1}; shift</div><div class='add'>+</div><div class='add'>+    while [[ ${1} ]]; do</div><div class='add'>+        wrap_create_virt_ip_constraints ${cibfile} ${1} ${HA_SERVERS}</div><div class='add'>+        shift</div><div class='add'>+    done</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+setup_create_resources()</div><div class='add'>+{</div><div class='add'>+    local cibfile=$(mktemp -u)</div><div class='add'>+</div><div class='add'>+    # fixup /var/lib/nfs</div><div class='add'>+    logger "pcs resource create nfs_setup ocf:heartbeat:ganesha_nfsd ha_vol_mnt=${HA_VOL_MNT} ${PCS9OR10_PCS_CLONE_OPTION}"</div><div class='add'>+    pcs resource create nfs_setup ocf:heartbeat:ganesha_nfsd ha_vol_mnt=${HA_VOL_MNT} ${PCS9OR10_PCS_CLONE_OPTION}</div><div class='add'>+    if [ $? -ne 0 ]; then</div><div class='add'>+        logger "warning: pcs resource create nfs_setup ocf:heartbeat:ganesha_nfsd ha_vol_mnt=${HA_VOL_MNT} ${PCS9OR10_PCS_CLONE_OPTION} failed"</div><div class='add'>+    fi</div><div class='add'>+</div><div class='add'>+    pcs resource create nfs-mon ocf:heartbeat:ganesha_mon ${PCS9OR10_PCS_CLONE_OPTION}</div><div class='add'>+    if [ $? -ne 0 ]; then</div><div class='add'>+        logger "warning: pcs resource create nfs-mon ocf:heartbeat:ganesha_mon ${PCS9OR10_PCS_CLONE_OPTION} failed"</div><div class='add'>+    fi</div><div class='add'>+</div><div class='add'>+    # see comment in (/usr/lib/ocf/resource.d/heartbeat/ganesha_grace</div><div class='add'>+    # start method. Allow time for ganesha_mon to start and set the</div><div class='add'>+    # ganesha-active crm_attribute</div><div class='add'>+    sleep 5</div><div class='add'>+</div><div class='add'>+    pcs resource create nfs-grace ocf:heartbeat:ganesha_grace ${PCS9OR10_PCS_CLONE_OPTION} notify=true</div><div class='add'>+    if [ $? -ne 0 ]; then</div><div class='add'>+        logger "warning: pcs resource create nfs-grace ocf:heartbeat:ganesha_grace ${PCS9OR10_PCS_CLONE_OPTION} failed"</div><div class='add'>+    fi</div><div class='add'>+</div><div class='add'>+    pcs constraint location nfs-grace-clone rule score=-INFINITY grace-active ne 1</div><div class='add'>+    if [ $? -ne 0 ]; then</div><div class='add'>+        logger "warning: pcs constraint location nfs-grace-clone rule score=-INFINITY grace-active ne 1"</div><div class='add'>+    fi</div><div class='add'>+</div><div class='add'>+    pcs cluster cib ${cibfile}</div><div class='add'>+</div><div class='add'>+    while [[ ${1} ]]; do</div><div class='add'>+</div><div class='add'>+        # this is variable indirection</div><div class='add'>+        # from a nvs like 'VIP_host1=10.7.6.5' or 'VIP_host1="10.7.6.5"'</div><div class='add'>+        # (or VIP_host-1=..., or VIP_host-1.my.domain.name=...)</div><div class='add'>+        # a variable 'clean_name' is created (e.g. w/ value 'VIP_host_1')</div><div class='add'>+        # and a clean nvs (e.g. w/ value 'VIP_host_1="10_7_6_5"')</div><div class='add'>+        # after the `eval ${clean_nvs}` there is a variable VIP_host_1</div><div class='add'>+        # with the value '10_7_6_5', and the following \$$ magic to</div><div class='add'>+        # reference it, i.e. `eval tmp_ipaddr=\$${clean_name}` gives us</div><div class='add'>+        # ${tmp_ipaddr} with 10_7_6_5 and then convert the _s back to .s</div><div class='add'>+        # to give us ipaddr="10.7.6.5". whew!</div><div class='add'>+        name="VIP_${1}"</div><div class='add'>+        clean_name=${name//[-.]/_}</div><div class='add'>+        nvs=$(grep "^${name}=" ${HA_CONFDIR}/ganesha-ha.conf)</div><div class='add'>+        clean_nvs=${nvs//[-.]/_}</div><div class='add'>+        eval ${clean_nvs}</div><div class='add'>+        eval tmp_ipaddr=\$${clean_name}</div><div class='add'>+        ipaddr=${tmp_ipaddr//_/.}</div><div class='add'>+</div><div class='add'>+        pcs -f ${cibfile} resource create ${1}-nfs_block ocf:heartbeat:portblock protocol=tcp \</div><div class='add'>+        portno=2049 action=block ip=${ipaddr} --group ${1}-group</div><div class='add'>+        if [ $? -ne 0 ]; then</div><div class='add'>+            logger "warning pcs resource create ${1}-nfs_block failed"</div><div class='add'>+        fi</div><div class='add'>+        pcs -f ${cibfile} resource create ${1}-cluster_ip-1 ocf:heartbeat:IPaddr ip=${ipaddr} \</div><div class='add'>+        cidr_netmask=32 op monitor interval=15s --group ${1}-group --after ${1}-nfs_block</div><div class='add'>+        if [ $? -ne 0 ]; then</div><div class='add'>+            logger "warning pcs resource create ${1}-cluster_ip-1 ocf:heartbeat:IPaddr ip=${ipaddr} \</div><div class='add'>+            cidr_netmask=32 op monitor interval=15s failed"</div><div class='add'>+        fi</div><div class='add'>+</div><div class='add'>+        pcs -f ${cibfile} constraint order nfs-grace-clone then ${1}-cluster_ip-1</div><div class='add'>+        if [ $? -ne 0 ]; then</div><div class='add'>+            logger "warning: pcs constraint order nfs-grace-clone then ${1}-cluster_ip-1 failed"</div><div class='add'>+        fi</div><div class='add'>+</div><div class='add'>+        pcs -f ${cibfile} resource create ${1}-nfs_unblock ocf:heartbeat:portblock protocol=tcp \</div><div class='add'>+        portno=2049 action=unblock ip=${ipaddr} reset_local_on_unblock_stop=true \</div><div class='add'>+        tickle_dir=${HA_VOL_MNT}/nfs-ganesha/tickle_dir/ --group ${1}-group --after ${1}-cluster_ip-1 \</div><div class='add'>+        op stop timeout=${PORTBLOCK_UNBLOCK_TIMEOUT} op start timeout=${PORTBLOCK_UNBLOCK_TIMEOUT} \</div><div class='add'>+        op monitor interval=10s timeout=${PORTBLOCK_UNBLOCK_TIMEOUT}</div><div class='add'>+        if [ $? -ne 0 ]; then</div><div class='add'>+            logger "warning pcs resource create ${1}-nfs_unblock failed"</div><div class='add'>+        fi</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+        shift</div><div class='add'>+    done</div><div class='add'>+</div><div class='add'>+    create_virt_ip_constraints ${cibfile} ${HA_SERVERS}</div><div class='add'>+</div><div class='add'>+    pcs cluster cib-push ${cibfile}</div><div class='add'>+    if [ $? -ne 0 ]; then</div><div class='add'>+        logger "warning pcs cluster cib-push ${cibfile} failed"</div><div class='add'>+    fi</div><div class='add'>+    rm -f ${cibfile}</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+teardown_resources()</div><div class='add'>+{</div><div class='add'>+    # local mntpt=$(grep ha-vol-mnt ${HA_CONFIG_FILE} | cut -d = -f 2)</div><div class='add'>+</div><div class='add'>+    # restore /var/lib/nfs</div><div class='add'>+    logger "notice: pcs resource delete nfs_setup-clone"</div><div class='add'>+    pcs resource delete nfs_setup-clone</div><div class='add'>+    if [ $? -ne 0 ]; then</div><div class='add'>+        logger "warning: pcs resource delete nfs_setup-clone failed"</div><div class='add'>+    fi</div><div class='add'>+</div><div class='add'>+    # delete -clone resource agents</div><div class='add'>+    # in particular delete the ganesha monitor so we don't try to</div><div class='add'>+    # trigger anything when we shut down ganesha next.</div><div class='add'>+    pcs resource delete nfs-mon-clone</div><div class='add'>+    if [ $? -ne 0 ]; then</div><div class='add'>+        logger "warning: pcs resource delete nfs-mon-clone failed"</div><div class='add'>+    fi</div><div class='add'>+</div><div class='add'>+    pcs resource delete nfs-grace-clone</div><div class='add'>+    if [ $? -ne 0 ]; then</div><div class='add'>+        logger "warning: pcs resource delete nfs-grace-clone failed"</div><div class='add'>+    fi</div><div class='add'>+</div><div class='add'>+    while [[ ${1} ]]; do</div><div class='add'>+        pcs resource delete ${1}-group</div><div class='add'>+        if [ $? -ne 0 ]; then</div><div class='add'>+            logger "warning: pcs resource delete ${1}-group failed"</div><div class='add'>+        fi</div><div class='add'>+        shift</div><div class='add'>+    done</div><div class='add'>+</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+recreate_resources()</div><div class='add'>+{</div><div class='add'>+    local cibfile=${1}; shift</div><div class='add'>+</div><div class='add'>+    while [[ ${1} ]]; do</div><div class='add'>+        # this is variable indirection</div><div class='add'>+        # see the comment on the same a few lines up</div><div class='add'>+        name="VIP_${1}"</div><div class='add'>+        clean_name=${name//[-.]/_}</div><div class='add'>+        nvs=$(grep "^${name}=" ${HA_CONFDIR}/ganesha-ha.conf)</div><div class='add'>+        clean_nvs=${nvs//[-.]/_}</div><div class='add'>+        eval ${clean_nvs}</div><div class='add'>+        eval tmp_ipaddr=\$${clean_name}</div><div class='add'>+        ipaddr=${tmp_ipaddr//_/.}</div><div class='add'>+</div><div class='add'>+        pcs -f ${cibfile} resource create ${1}-nfs_block ocf:heartbeat:portblock protocol=tcp \</div><div class='add'>+        portno=2049 action=block ip=${ipaddr} --group ${1}-group</div><div class='add'>+        if [ $? -ne 0 ]; then</div><div class='add'>+            logger "warning pcs resource create ${1}-nfs_block failed"</div><div class='add'>+        fi</div><div class='add'>+        pcs -f ${cibfile} resource create ${1}-cluster_ip-1 ocf:heartbeat:IPaddr ip=${ipaddr} \</div><div class='add'>+        cidr_netmask=32 op monitor interval=15s --group ${1}-group --after ${1}-nfs_block</div><div class='add'>+        if [ $? -ne 0 ]; then</div><div class='add'>+            logger "warning pcs resource create ${1}-cluster_ip-1 ocf:heartbeat:IPaddr ip=${ipaddr} \</div><div class='add'>+            cidr_netmask=32 op monitor interval=15s failed"</div><div class='add'>+        fi</div><div class='add'>+</div><div class='add'>+        pcs -f ${cibfile} constraint order nfs-grace-clone then ${1}-cluster_ip-1</div><div class='add'>+        if [ $? -ne 0 ]; then</div><div class='add'>+            logger "warning: pcs constraint order nfs-grace-clone then ${1}-cluster_ip-1 failed"</div><div class='add'>+        fi</div><div class='add'>+</div><div class='add'>+        pcs -f ${cibfile} resource create ${1}-nfs_unblock ocf:heartbeat:portblock protocol=tcp \</div><div class='add'>+        portno=2049 action=unblock ip=${ipaddr} reset_local_on_unblock_stop=true \</div><div class='add'>+        tickle_dir=${HA_VOL_MNT}/nfs-ganesha/tickle_dir/ --group ${1}-group --after ${1}-cluster_ip-1 \</div><div class='add'>+        op stop timeout=${PORTBLOCK_UNBLOCK_TIMEOUT} op start timeout=${PORTBLOCK_UNBLOCK_TIMEOUT} \</div><div class='add'>+        op monitor interval=10s timeout=${PORTBLOCK_UNBLOCK_TIMEOUT}</div><div class='add'>+        if [ $? -ne 0 ]; then</div><div class='add'>+            logger "warning pcs resource create ${1}-nfs_unblock failed"</div><div class='add'>+        fi</div><div class='add'>+</div><div class='add'>+        shift</div><div class='add'>+    done</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+addnode_recreate_resources()</div><div class='add'>+{</div><div class='add'>+    local cibfile=${1}; shift</div><div class='add'>+    local add_node=${1}; shift</div><div class='add'>+    local add_vip=${1}; shift</div><div class='add'>+</div><div class='add'>+    recreate_resources ${cibfile} ${HA_SERVERS}</div><div class='add'>+</div><div class='add'>+    pcs -f ${cibfile} resource create ${add_node}-nfs_block ocf:heartbeat:portblock \</div><div class='add'>+    protocol=tcp portno=2049 action=block ip=${add_vip} --group ${add_node}-group</div><div class='add'>+    if [ $? -ne 0 ]; then</div><div class='add'>+        logger "warning pcs resource create ${add_node}-nfs_block failed"</div><div class='add'>+    fi</div><div class='add'>+    pcs -f ${cibfile} resource create ${add_node}-cluster_ip-1 ocf:heartbeat:IPaddr \</div><div class='add'>+    ip=${add_vip} cidr_netmask=32 op monitor interval=15s --group ${add_node}-group \</div><div class='add'>+    --after ${add_node}-nfs_block</div><div class='add'>+    if [ $? -ne 0 ]; then</div><div class='add'>+        logger "warning pcs resource create ${add_node}-cluster_ip-1 ocf:heartbeat:IPaddr \</div><div class='add'>+        ip=${add_vip} cidr_netmask=32 op monitor interval=15s failed"</div><div class='add'>+    fi</div><div class='add'>+</div><div class='add'>+    pcs -f ${cibfile} constraint order nfs-grace-clone then ${add_node}-cluster_ip-1</div><div class='add'>+    if [ $? -ne 0 ]; then</div><div class='add'>+        logger "warning: pcs constraint order nfs-grace-clone then ${add_node}-cluster_ip-1 failed"</div><div class='add'>+    fi</div><div class='add'>+    pcs -f ${cibfile} resource create ${add_node}-nfs_unblock ocf:heartbeat:portblock \</div><div class='add'>+    protocol=tcp portno=2049 action=unblock ip=${add_vip} reset_local_on_unblock_stop=true \</div><div class='add'>+    tickle_dir=${HA_VOL_MNT}/nfs-ganesha/tickle_dir/ --group ${add_node}-group --after \</div><div class='add'>+    ${add_node}-cluster_ip-1 op stop timeout=${PORTBLOCK_UNBLOCK_TIMEOUT} op start \</div><div class='add'>+    timeout=${PORTBLOCK_UNBLOCK_TIMEOUT} op monitor interval=10s \</div><div class='add'>+    timeout=${PORTBLOCK_UNBLOCK_TIMEOUT}</div><div class='add'>+    if [ $? -ne 0 ]; then</div><div class='add'>+        logger "warning pcs resource create ${add_node}-nfs_unblock failed"</div><div class='add'>+    fi</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+clear_resources()</div><div class='add'>+{</div><div class='add'>+    local cibfile=${1}; shift</div><div class='add'>+</div><div class='add'>+    while [[ ${1} ]]; do</div><div class='add'>+        pcs -f ${cibfile} resource delete ${1}-group</div><div class='add'>+        if [ $? -ne 0 ]; then</div><div class='add'>+            logger "warning: pcs -f ${cibfile} resource delete ${1}-group"</div><div class='add'>+        fi</div><div class='add'>+</div><div class='add'>+        shift</div><div class='add'>+    done</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+addnode_create_resources()</div><div class='add'>+{</div><div class='add'>+    local add_node=${1}; shift</div><div class='add'>+    local add_vip=${1}; shift</div><div class='add'>+    local cibfile=$(mktemp -u)</div><div class='add'>+</div><div class='add'>+    # start HA on the new node</div><div class='add'>+    pcs cluster start ${add_node}</div><div class='add'>+    if [ $? -ne 0 ]; then</div><div class='add'>+       logger "warning: pcs cluster start ${add_node} failed"</div><div class='add'>+    fi</div><div class='add'>+</div><div class='add'>+    pcs cluster cib ${cibfile}</div><div class='add'>+    if [ $? -ne 0 ]; then</div><div class='add'>+        logger "warning: pcs cluster cib ${cibfile} failed"</div><div class='add'>+    fi</div><div class='add'>+</div><div class='add'>+    # delete all the -cluster_ip-1 resources, clearing</div><div class='add'>+    # their constraints, then create them again so we can</div><div class='add'>+    # recompute their constraints</div><div class='add'>+    clear_resources ${cibfile} ${HA_SERVERS}</div><div class='add'>+    addnode_recreate_resources ${cibfile} ${add_node} ${add_vip}</div><div class='add'>+</div><div class='add'>+    HA_SERVERS="${HA_SERVERS} ${add_node}"</div><div class='add'>+    create_virt_ip_constraints ${cibfile} ${HA_SERVERS}</div><div class='add'>+</div><div class='add'>+    pcs cluster cib-push ${cibfile}</div><div class='add'>+    if [ $? -ne 0 ]; then</div><div class='add'>+        logger "warning: pcs cluster cib-push ${cibfile} failed"</div><div class='add'>+    fi</div><div class='add'>+    rm -f ${cibfile}</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+deletenode_delete_resources()</div><div class='add'>+{</div><div class='add'>+    local node=${1}; shift</div><div class='add'>+    local ha_servers=$(echo "${HA_SERVERS}" | sed s/${node}//)</div><div class='add'>+    local cibfile=$(mktemp -u)</div><div class='add'>+</div><div class='add'>+    pcs cluster cib ${cibfile}</div><div class='add'>+    if [ $? -ne 0 ]; then</div><div class='add'>+        logger "warning: pcs cluster cib ${cibfile} failed"</div><div class='add'>+    fi</div><div class='add'>+</div><div class='add'>+    # delete all the -cluster_ip-1 and -trigger_ip-1 resources,</div><div class='add'>+    # clearing their constraints, then create them again so we can</div><div class='add'>+    # recompute their constraints</div><div class='add'>+    clear_resources ${cibfile} ${HA_SERVERS}</div><div class='add'>+    recreate_resources ${cibfile} ${ha_servers}</div><div class='add'>+    HA_SERVERS=$(echo "${ha_servers}" | sed -e "s/  / /")</div><div class='add'>+</div><div class='add'>+    create_virt_ip_constraints ${cibfile} ${HA_SERVERS}</div><div class='add'>+</div><div class='add'>+    pcs cluster cib-push ${cibfile}</div><div class='add'>+    if [ $? -ne 0 ]; then</div><div class='add'>+        logger "warning: pcs cluster cib-push ${cibfile} failed"</div><div class='add'>+    fi</div><div class='add'>+    rm -f ${cibfile}</div><div class='add'>+</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+deletenode_update_haconfig()</div><div class='add'>+{</div><div class='add'>+    local name="VIP_${1}"</div><div class='add'>+    local clean_name=${name//[-.]/_}</div><div class='add'>+</div><div class='add'>+    ha_servers=$(echo ${HA_SERVERS} | sed -e "s/ /,/")</div><div class='add'>+    sed -i -e "s/^HA_CLUSTER_NODES=.*$/HA_CLUSTER_NODES=\"${ha_servers// /,}\"/" -e "s/^${name}=.*$//" -e "/^$/d" ${HA_CONFDIR}/ganesha-ha.conf</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+setup_state_volume()</div><div class='add'>+{</div><div class='add'>+    local mnt=${HA_VOL_MNT}</div><div class='add'>+    local longname=""</div><div class='add'>+    local shortname=""</div><div class='add'>+    local dname=""</div><div class='add'>+    local dirname=""</div><div class='add'>+</div><div class='add'>+    longname=$(hostname)</div><div class='add'>+    dname=${longname#$(hostname -s)}</div><div class='add'>+</div><div class='add'>+    while [[ ${1} ]]; do</div><div class='add'>+</div><div class='add'>+        if [[ ${1} == *${dname} ]]; then</div><div class='add'>+            dirname=${1}</div><div class='add'>+        else</div><div class='add'>+            dirname=${1}${dname}</div><div class='add'>+        fi</div><div class='add'>+</div><div class='add'>+        if [ ! -d ${mnt}/nfs-ganesha/tickle_dir ]; then</div><div class='add'>+            mkdir ${mnt}/nfs-ganesha/tickle_dir</div><div class='add'>+        fi</div><div class='add'>+        if [ ! -d ${mnt}/nfs-ganesha/${dirname} ]; then</div><div class='add'>+            mkdir ${mnt}/nfs-ganesha/${dirname}</div><div class='add'>+        fi</div><div class='add'>+        if [ ! -d ${mnt}/nfs-ganesha/${dirname}/nfs ]; then</div><div class='add'>+            mkdir ${mnt}/nfs-ganesha/${dirname}/nfs</div><div class='add'>+        fi</div><div class='add'>+        if [ ! -d ${mnt}/nfs-ganesha/${dirname}/nfs/ganesha ]; then</div><div class='add'>+            mkdir ${mnt}/nfs-ganesha/${dirname}/nfs/ganesha</div><div class='add'>+        fi</div><div class='add'>+        if [ ! -d ${mnt}/nfs-ganesha/${dirname}/nfs/statd ]; then</div><div class='add'>+            mkdir ${mnt}/nfs-ganesha/${dirname}/nfs/statd</div><div class='add'>+            chown rpcuser:rpcuser ${mnt}/nfs-ganesha/${dirname}/nfs/statd</div><div class='add'>+        fi</div><div class='add'>+        if [ ! -e ${mnt}/nfs-ganesha/${dirname}/nfs/state ]; then</div><div class='add'>+            touch ${mnt}/nfs-ganesha/${dirname}/nfs/state</div><div class='add'>+            chown rpcuser:rpcuser ${mnt}/nfs-ganesha/${dirname}/nfs/state</div><div class='add'>+        fi</div><div class='add'>+        if [ ! -d ${mnt}/nfs-ganesha/${dirname}/nfs/ganesha/v4recov ]; then</div><div class='add'>+            mkdir ${mnt}/nfs-ganesha/${dirname}/nfs/ganesha/v4recov</div><div class='add'>+        fi</div><div class='add'>+        if [ ! -d ${mnt}/nfs-ganesha/${dirname}/nfs/ganesha/v4old ]; then</div><div class='add'>+            mkdir ${mnt}/nfs-ganesha/${dirname}/nfs/ganesha/v4old</div><div class='add'>+        fi</div><div class='add'>+        if [ ! -d ${mnt}/nfs-ganesha/${dirname}/nfs/statd/sm ]; then</div><div class='add'>+            mkdir ${mnt}/nfs-ganesha/${dirname}/nfs/statd/sm</div><div class='add'>+            chown rpcuser:rpcuser ${mnt}/nfs-ganesha/${dirname}/nfs/statd/sm</div><div class='add'>+        fi</div><div class='add'>+        if [ ! -d ${mnt}/nfs-ganesha/${dirname}/nfs/statd/sm.bak ]; then</div><div class='add'>+            mkdir ${mnt}/nfs-ganesha/${dirname}/nfs/statd/sm.bak</div><div class='add'>+            chown rpcuser:rpcuser ${mnt}/nfs-ganesha/${dirname}/nfs/statd/sm.bak</div><div class='add'>+        fi</div><div class='add'>+        if [ ! -e ${mnt}/nfs-ganesha/${dirname}/nfs/statd/state ]; then</div><div class='add'>+            touch ${mnt}/nfs-ganesha/${dirname}/nfs/statd/state</div><div class='add'>+        fi</div><div class='add'>+        for server in ${HA_SERVERS} ; do</div><div class='add'>+            if [[ ${server} != ${dirname} ]]; then</div><div class='add'>+                ln -s ${mnt}/nfs-ganesha/${server}/nfs/ganesha ${mnt}/nfs-ganesha/${dirname}/nfs/ganesha/${server}</div><div class='add'>+                ln -s ${mnt}/nfs-ganesha/${server}/nfs/statd ${mnt}/nfs-ganesha/${dirname}/nfs/statd/${server}</div><div class='add'>+            fi</div><div class='add'>+        done</div><div class='add'>+        shift</div><div class='add'>+    done</div><div class='add'>+</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+enable_pacemaker()</div><div class='add'>+{</div><div class='add'>+    while [[ ${1} ]]; do</div><div class='add'>+        if [[ "${SERVICE_MAN}" == "/bin/systemctl" ]]; then</div><div class='add'>+            ssh -oPasswordAuthentication=no -oStrictHostKeyChecking=no -i \</div><div class='add'>+${SECRET_PEM} root@${1} "${SERVICE_MAN} enable pacemaker"</div><div class='add'>+        else</div><div class='add'>+            ssh -oPasswordAuthentication=no -oStrictHostKeyChecking=no -i \</div><div class='add'>+${SECRET_PEM} root@${1} "${SERVICE_MAN} pacemaker enable"</div><div class='add'>+        fi</div><div class='add'>+        shift</div><div class='add'>+    done</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+addnode_state_volume()</div><div class='add'>+{</div><div class='add'>+    local newnode=${1}; shift</div><div class='add'>+    local mnt=${HA_VOL_MNT}</div><div class='add'>+    local longname=""</div><div class='add'>+    local dname=""</div><div class='add'>+    local dirname=""</div><div class='add'>+</div><div class='add'>+    longname=$(hostname)</div><div class='add'>+    dname=${longname#$(hostname -s)}</div><div class='add'>+</div><div class='add'>+    if [[ ${newnode} == *${dname} ]]; then</div><div class='add'>+        dirname=${newnode}</div><div class='add'>+    else</div><div class='add'>+        dirname=${newnode}${dname}</div><div class='add'>+    fi</div><div class='add'>+</div><div class='add'>+    if [ ! -d ${mnt}/nfs-ganesha/${dirname} ]; then</div><div class='add'>+        mkdir ${mnt}/nfs-ganesha/${dirname}</div><div class='add'>+    fi</div><div class='add'>+    if [ ! -d ${mnt}/nfs-ganesha/${dirname}/nfs ]; then</div><div class='add'>+        mkdir ${mnt}/nfs-ganesha/${dirname}/nfs</div><div class='add'>+    fi</div><div class='add'>+    if [ ! -d ${mnt}/nfs-ganesha/${dirname}/nfs/ganesha ]; then</div><div class='add'>+        mkdir ${mnt}/nfs-ganesha/${dirname}/nfs/ganesha</div><div class='add'>+    fi</div><div class='add'>+    if [ ! -d ${mnt}/nfs-ganesha/${dirname}/nfs/statd ]; then</div><div class='add'>+        mkdir ${mnt}/nfs-ganesha/${dirname}/nfs/statd</div><div class='add'>+        chown rpcuser:rpcuser ${mnt}/nfs-ganesha/${dirname}/nfs/statd</div><div class='add'>+    fi</div><div class='add'>+    if [ ! -e ${mnt}/nfs-ganesha/${dirname}/nfs/state ]; then</div><div class='add'>+        touch ${mnt}/nfs-ganesha/${dirname}/nfs/state</div><div class='add'>+        chown rpcuser:rpcuser ${mnt}/nfs-ganesha/${dirname}/nfs/state</div><div class='add'>+    fi</div><div class='add'>+    if [ ! -d ${mnt}/nfs-ganesha/${dirname}/nfs/ganesha/v4recov ]; then</div><div class='add'>+        mkdir ${mnt}/nfs-ganesha/${dirname}/nfs/ganesha/v4recov</div><div class='add'>+    fi</div><div class='add'>+    if [ ! -d ${mnt}/nfs-ganesha/${dirname}/nfs/ganesha/v4old ]; then</div><div class='add'>+        mkdir ${mnt}/nfs-ganesha/${dirname}/nfs/ganesha/v4old</div><div class='add'>+    fi</div><div class='add'>+    if [ ! -d ${mnt}/nfs-ganesha/${dirname}/nfs/statd/sm ]; then</div><div class='add'>+        mkdir ${mnt}/nfs-ganesha/${dirname}/nfs/statd/sm</div><div class='add'>+        chown rpcuser:rpcuser ${mnt}/nfs-ganesha/${dirname}/nfs/statd/sm</div><div class='add'>+    fi</div><div class='add'>+    if [ ! -d ${mnt}/nfs-ganesha/${dirname}/nfs/statd/sm.bak ]; then</div><div class='add'>+        mkdir ${mnt}/nfs-ganesha/${dirname}/nfs/statd/sm.bak</div><div class='add'>+        chown rpcuser:rpcuser ${mnt}/nfs-ganesha/${dirname}/nfs/statd/sm.bak</div><div class='add'>+    fi</div><div class='add'>+    if [ ! -e ${mnt}/nfs-ganesha/${dirname}/nfs/statd/state ]; then</div><div class='add'>+        touch ${mnt}/nfs-ganesha/${dirname}/nfs/statd/state</div><div class='add'>+    fi</div><div class='add'>+</div><div class='add'>+    for server in ${HA_SERVERS} ; do</div><div class='add'>+</div><div class='add'>+        if [[ ${server} != ${dirname} ]]; then</div><div class='add'>+            ln -s ${mnt}/nfs-ganesha/${server}/nfs/ganesha ${mnt}/nfs-ganesha/${dirname}/nfs/ganesha/${server}</div><div class='add'>+            ln -s ${mnt}/nfs-ganesha/${server}/nfs/statd ${mnt}/nfs-ganesha/${dirname}/nfs/statd/${server}</div><div class='add'>+</div><div class='add'>+            ln -s ${mnt}/nfs-ganesha/${dirname}/nfs/ganesha ${mnt}/nfs-ganesha/${server}/nfs/ganesha/${dirname}</div><div class='add'>+            ln -s ${mnt}/nfs-ganesha/${dirname}/nfs/statd ${mnt}/nfs-ganesha/${server}/nfs/statd/${dirname}</div><div class='add'>+        fi</div><div class='add'>+    done</div><div class='add'>+</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+delnode_state_volume()</div><div class='add'>+{</div><div class='add'>+    local delnode=${1}; shift</div><div class='add'>+    local mnt=${HA_VOL_MNT}</div><div class='add'>+    local longname=""</div><div class='add'>+    local dname=""</div><div class='add'>+    local dirname=""</div><div class='add'>+</div><div class='add'>+    longname=$(hostname)</div><div class='add'>+    dname=${longname#$(hostname -s)}</div><div class='add'>+</div><div class='add'>+    if [[ ${delnode} == *${dname} ]]; then</div><div class='add'>+        dirname=${delnode}</div><div class='add'>+    else</div><div class='add'>+        dirname=${delnode}${dname}</div><div class='add'>+    fi</div><div class='add'>+</div><div class='add'>+    rm -rf ${mnt}/nfs-ganesha/${dirname}</div><div class='add'>+</div><div class='add'>+    for server in ${HA_SERVERS} ; do</div><div class='add'>+        if [[ ${server} != ${dirname} ]]; then</div><div class='add'>+            rm -f ${mnt}/nfs-ganesha/${server}/nfs/ganesha/${dirname}</div><div class='add'>+            rm -f ${mnt}/nfs-ganesha/${server}/nfs/statd/${dirname}</div><div class='add'>+        fi</div><div class='add'>+    done</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+status()</div><div class='add'>+{</div><div class='add'>+    local scratch=$(mktemp)</div><div class='add'>+    local regex_str="^${1}-cluster_ip-1"</div><div class='add'>+    local healthy=0</div><div class='add'>+    local index=1</div><div class='add'>+    local nodes</div><div class='add'>+</div><div class='add'>+    # change tabs to spaces, strip leading spaces, including any </div><div class='add'>+    # new '*' at the beginning of a line introduced in pcs-0.10.x</div><div class='add'>+    pcs status | sed -e "s/\t/ /g" -e "s/^[ ]*\*//" -e "s/^[ ]*//" &gt; ${scratch}</div><div class='add'>+</div><div class='add'>+    nodes[0]=${1}; shift</div><div class='add'>+</div><div class='add'>+    # make a regex of the configured nodes</div><div class='add'>+    # and initalize the nodes array for later</div><div class='add'>+    while [[ ${1} ]]; do</div><div class='add'>+</div><div class='add'>+        regex_str="${regex_str}|^${1}-cluster_ip-1"</div><div class='add'>+        nodes[${index}]=${1}</div><div class='add'>+        ((index++))</div><div class='add'>+        shift</div><div class='add'>+    done</div><div class='add'>+</div><div class='add'>+    # print the nodes that are expected to be online</div><div class='add'>+    grep -E "Online:" ${scratch}</div><div class='add'>+</div><div class='add'>+    echo</div><div class='add'>+</div><div class='add'>+    # print the VIPs and which node they are on</div><div class='add'>+    grep -E "${regex_str}" &lt; ${scratch} | cut -d ' ' -f 1,4</div><div class='add'>+</div><div class='add'>+    echo</div><div class='add'>+</div><div class='add'>+    # check if the VIP and port block/unblock RAs are on the expected nodes</div><div class='add'>+    for n in ${nodes[*]}; do</div><div class='add'>+</div><div class='add'>+        grep -E -x "${n}-nfs_block \(ocf::heartbeat:portblock\): Started ${n}" &gt; /dev/null 2&gt;&amp;1 ${scratch}</div><div class='add'>+        result=$?</div><div class='add'>+        ((healthy+=${result}))</div><div class='add'>+        grep -E -x "${n}-cluster_ip-1 \(ocf::heartbeat:IPaddr\): Started ${n}" &gt; /dev/null 2&gt;&amp;1 ${scratch}</div><div class='add'>+        result=$?</div><div class='add'>+        ((healthy+=${result}))</div><div class='add'>+        grep -E -x "${n}-nfs_unblock \(ocf::heartbeat:portblock\): Started ${n}" &gt; /dev/null 2&gt;&amp;1 ${scratch}</div><div class='add'>+        result=$?</div><div class='add'>+        ((healthy+=${result}))</div><div class='add'>+    done</div><div class='add'>+</div><div class='add'>+    grep -E "\):\ Stopped|FAILED" &gt; /dev/null 2&gt;&amp;1 ${scratch}</div><div class='add'>+    result=$?</div><div class='add'>+</div><div class='add'>+    if [ ${result} -eq 0 ]; then</div><div class='add'>+        echo "Cluster HA Status: BAD"</div><div class='add'>+    elif [ ${healthy} -eq 0 ]; then</div><div class='add'>+        echo "Cluster HA Status: HEALTHY"</div><div class='add'>+    else</div><div class='add'>+        echo "Cluster HA Status: FAILOVER"</div><div class='add'>+    fi</div><div class='add'>+</div><div class='add'>+    rm -f ${scratch}</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+create_ganesha_conf_file()</div><div class='add'>+{</div><div class='add'>+        if [[ "$1" == "yes" ]];</div><div class='add'>+        then</div><div class='add'>+                if [  -e $GANESHA_CONF ];</div><div class='add'>+                then</div><div class='add'>+                        rm -rf $GANESHA_CONF</div><div class='add'>+                fi</div><div class='add'>+        # The symlink /etc/ganesha/ganesha.conf need to be</div><div class='add'>+        # created using ganesha conf file mentioned in the</div><div class='add'>+        # shared storage. Every node will only have this</div><div class='add'>+        # link and actual file will stored in shared storage,</div><div class='add'>+        # so that ganesha conf editing of ganesha conf will</div><div class='add'>+        # be easy as well as it become more consistent.</div><div class='add'>+</div><div class='add'>+                ln -s $HA_CONFDIR/ganesha.conf $GANESHA_CONF</div><div class='add'>+        else</div><div class='add'>+        # Restoring previous file</div><div class='add'>+                rm -rf $GANESHA_CONF</div><div class='add'>+                cp $HA_CONFDIR/ganesha.conf $GANESHA_CONF</div><div class='add'>+                sed -r -i -e '/^%include[[:space:]]+".+\.conf"$/d' $GANESHA_CONF</div><div class='add'>+        fi</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+set_quorum_policy()</div><div class='add'>+{</div><div class='add'>+    local quorum_policy="stop"</div><div class='add'>+    local num_servers=${1}</div><div class='add'>+</div><div class='add'>+    if [ ${num_servers} -lt 3 ]; then</div><div class='add'>+        quorum_policy="ignore"</div><div class='add'>+    fi</div><div class='add'>+    pcs property set no-quorum-policy=${quorum_policy}</div><div class='add'>+    if [ $? -ne 0 ]; then</div><div class='add'>+        logger "warning: pcs property set no-quorum-policy=${quorum_policy} failed"</div><div class='add'>+    fi</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+main()</div><div class='add'>+{</div><div class='add'>+</div><div class='add'>+    local cmd=${1}; shift</div><div class='add'>+    if [[ ${cmd} == *help ]]; then</div><div class='add'>+        usage</div><div class='add'>+        exit 0</div><div class='add'>+    fi</div><div class='add'>+</div><div class='add'>+    if (selinuxenabled) ;then</div><div class='add'>+     semanage boolean -m gluster_use_execmem --on</div><div class='add'>+    fi</div><div class='add'>+</div><div class='add'>+    local osid=""</div><div class='add'>+</div><div class='add'>+    osid=$(grep ^ID= /etc/os-release)</div><div class='add'>+    eval $(echo ${osid} | grep -F ID=)</div><div class='add'>+    osid=$(grep ^VERSION_ID= /etc/os-release)</div><div class='add'>+    eval $(echo ${osid} | grep -F VERSION_ID=)</div><div class='add'>+</div><div class='add'>+    HA_CONFDIR=${1%/}; shift</div><div class='add'>+    local ha_conf=${HA_CONFDIR}/ganesha-ha.conf</div><div class='add'>+    local node=""</div><div class='add'>+    local vip=""</div><div class='add'>+</div><div class='add'>+    # ignore any comment lines</div><div class='add'>+    cfgline=$(grep  ^HA_NAME= ${ha_conf})</div><div class='add'>+    eval $(echo ${cfgline} | grep -F HA_NAME=)</div><div class='add'>+    cfgline=$(grep  ^HA_CLUSTER_NODES= ${ha_conf})</div><div class='add'>+    eval $(echo ${cfgline} | grep -F HA_CLUSTER_NODES=)</div><div class='add'>+</div><div class='add'>+    case "${cmd}" in</div><div class='add'>+</div><div class='add'>+    setup | --setup)</div><div class='add'>+        logger "setting up ${HA_NAME}"</div><div class='add'>+</div><div class='add'>+        check_cluster_exists ${HA_NAME}</div><div class='add'>+</div><div class='add'>+        determine_servers "setup"</div><div class='add'>+</div><div class='add'>+        # Fedora 29+ and rhel/centos 8 has PCS-0.10.x</div><div class='add'>+        # default is pcs-0.10.x options but check for</div><div class='add'>+        # rhel/centos 7 (pcs-0.9.x) and adjust accordingly</div><div class='add'>+        if [[ ! ${ID} =~ {rhel,centos} ]]; then</div><div class='add'>+            if [[ ${VERSION_ID} == 7.* ]]; then</div><div class='add'>+                PCS9OR10_PCS_CNAME_OPTION="--name"</div><div class='add'>+                PCS9OR10_PCS_CLONE_OPTION="--clone"</div><div class='add'>+            fi</div><div class='add'>+        fi</div><div class='add'>+</div><div class='add'>+        if [[ "${HA_NUM_SERVERS}X" != "1X" ]]; then</div><div class='add'>+</div><div class='add'>+            determine_service_manager</div><div class='add'>+</div><div class='add'>+            setup_cluster ${HA_NAME} ${HA_NUM_SERVERS} "${HA_SERVERS}"</div><div class='add'>+</div><div class='add'>+            setup_create_resources ${HA_SERVERS}</div><div class='add'>+</div><div class='add'>+            setup_finalize_ha</div><div class='add'>+</div><div class='add'>+            setup_state_volume ${HA_SERVERS}</div><div class='add'>+</div><div class='add'>+            enable_pacemaker ${HA_SERVERS}</div><div class='add'>+</div><div class='add'>+        else</div><div class='add'>+</div><div class='add'>+            logger "insufficient servers for HA, aborting"</div><div class='add'>+        fi</div><div class='add'>+        ;;</div><div class='add'>+</div><div class='add'>+    teardown | --teardown)</div><div class='add'>+        logger "tearing down ${HA_NAME}"</div><div class='add'>+</div><div class='add'>+        determine_servers "teardown"</div><div class='add'>+</div><div class='add'>+        teardown_resources ${HA_SERVERS}</div><div class='add'>+</div><div class='add'>+        teardown_cluster ${HA_NAME}</div><div class='add'>+</div><div class='add'>+        cleanup_ganesha_config ${HA_CONFDIR}</div><div class='add'>+        ;;</div><div class='add'>+</div><div class='add'>+    cleanup | --cleanup)</div><div class='add'>+        cleanup_ganesha_config ${HA_CONFDIR}</div><div class='add'>+        ;;</div><div class='add'>+</div><div class='add'>+    add | --add)</div><div class='add'>+        node=${1}; shift</div><div class='add'>+        vip=${1}; shift</div><div class='add'>+</div><div class='add'>+        logger "adding ${node} with ${vip} to ${HA_NAME}"</div><div class='add'>+</div><div class='add'>+        determine_service_manager</div><div class='add'>+</div><div class='add'>+        manage_service "start" ${node}</div><div class='add'>+</div><div class='add'>+        determine_servers "add"</div><div class='add'>+</div><div class='add'>+        pcs cluster node add ${node}</div><div class='add'>+        if [ $? -ne 0 ]; then</div><div class='add'>+            logger "warning: pcs cluster node add ${node} failed"</div><div class='add'>+        fi</div><div class='add'>+</div><div class='add'>+        addnode_create_resources ${node} ${vip}</div><div class='add'>+        # Subsequent add-node recreates resources for all the nodes</div><div class='add'>+        # that already exist in the cluster. The nodes are picked up</div><div class='add'>+        # from the entries in the ganesha-ha.conf file. Adding the</div><div class='add'>+        # newly added node to the file so that the resources specfic</div><div class='add'>+        # to this node is correctly recreated in the future.</div><div class='add'>+        clean_node=${node//[-.]/_}</div><div class='add'>+        echo "VIP_${node}=\"${vip}\"" &gt;&gt; ${HA_CONFDIR}/ganesha-ha.conf</div><div class='add'>+</div><div class='add'>+        NEW_NODES="$HA_CLUSTER_NODES,${node}"</div><div class='add'>+</div><div class='add'>+        sed -i s/HA_CLUSTER_NODES.*/"HA_CLUSTER_NODES=\"$NEW_NODES\""/ \</div><div class='add'>+$HA_CONFDIR/ganesha-ha.conf</div><div class='add'>+</div><div class='add'>+        addnode_state_volume ${node}</div><div class='add'>+</div><div class='add'>+        # addnode_create_resources() already appended ${node} to</div><div class='add'>+        # HA_SERVERS, so only need to increment HA_NUM_SERVERS</div><div class='add'>+        # and set quorum policy</div><div class='add'>+        HA_NUM_SERVERS=$(expr ${HA_NUM_SERVERS} + 1)</div><div class='add'>+        set_quorum_policy ${HA_NUM_SERVERS}</div><div class='add'>+        ;;</div><div class='add'>+</div><div class='add'>+    delete | --delete)</div><div class='add'>+        node=${1}; shift</div><div class='add'>+</div><div class='add'>+        logger "deleting ${node} from ${HA_NAME}"</div><div class='add'>+</div><div class='add'>+        determine_servers "delete"</div><div class='add'>+</div><div class='add'>+        deletenode_delete_resources ${node}</div><div class='add'>+</div><div class='add'>+        pcs cluster node remove ${node}</div><div class='add'>+        if [ $? -ne 0 ]; then</div><div class='add'>+            logger "warning: pcs cluster node remove ${node} failed"</div><div class='add'>+        fi</div><div class='add'>+</div><div class='add'>+        deletenode_update_haconfig ${node}</div><div class='add'>+</div><div class='add'>+        delnode_state_volume ${node}</div><div class='add'>+</div><div class='add'>+        determine_service_manager</div><div class='add'>+</div><div class='add'>+        manage_service "stop" ${node}</div><div class='add'>+</div><div class='add'>+        HA_NUM_SERVERS=$(expr ${HA_NUM_SERVERS} - 1)</div><div class='add'>+        set_quorum_policy ${HA_NUM_SERVERS}</div><div class='add'>+        ;;</div><div class='add'>+</div><div class='add'>+    status | --status)</div><div class='add'>+        determine_servers "status"</div><div class='add'>+</div><div class='add'>+        status ${HA_SERVERS}</div><div class='add'>+        ;;</div><div class='add'>+</div><div class='add'>+    refresh-config | --refresh-config)</div><div class='add'>+        VOL=${1}</div><div class='add'>+</div><div class='add'>+        determine_servers "refresh-config"</div><div class='add'>+</div><div class='add'>+        refresh_config ${VOL} ${HA_CONFDIR} ${HA_SERVERS}</div><div class='add'>+        ;;</div><div class='add'>+</div><div class='add'>+    setup-ganesha-conf-files | --setup-ganesha-conf-files)</div><div class='add'>+</div><div class='add'>+        create_ganesha_conf_file ${1}</div><div class='add'>+        ;;</div><div class='add'>+</div><div class='add'>+    *)</div><div class='add'>+        # setup and teardown are not intended to be used by a</div><div class='add'>+        # casual user</div><div class='add'>+        usage</div><div class='add'>+        logger "Usage: ganesha-ha.sh add|delete|status"</div><div class='add'>+        ;;</div><div class='add'>+</div><div class='add'>+    esac</div><div class='add'>+</div><div class='add'>+    if (selinuxenabled) ;then</div><div class='add'>+     semanage boolean -m gluster_use_execmem --off</div><div class='add'>+    fi</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+main $*</div><div class='head'>diff --git a/extras/ganesha/scripts/generate-epoch.py b/extras/ganesha/scripts/generate-epoch.py<br/>new file mode 100755<br/>index 00000000000..77af014bab9<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/extras/ganesha/scripts/generate-epoch.py?id=d1d7a6f35c816822fab51c820e25023863c239c1'>extras/ganesha/scripts/generate-epoch.py</a></div><div class='hunk'>@@ -0,0 +1,48 @@</div><div class='add'>+#!/usr/bin/python3</div><div class='add'>+#</div><div class='add'>+# Copyright (c) 2016 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+# This file is part of GlusterFS.</div><div class='add'>+#</div><div class='add'>+# This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+# General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+# later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+# cases as published by the Free Software Foundation.</div><div class='add'>+#</div><div class='add'>+# Generates unique epoch value on each gluster node to be used by</div><div class='add'>+# nfs-ganesha service on that node.</div><div class='add'>+#</div><div class='add'>+# Configure 'EPOCH_EXEC' option to this script path in</div><div class='add'>+# '/etc/sysconfig/ganesha' file used by nfs-ganesha service.</div><div class='add'>+#</div><div class='add'>+# Construct epoch as follows -</div><div class='add'>+#        first 32-bit contains the now() time</div><div class='add'>+#        rest 32-bit value contains the local glusterd node uuid</div><div class='add'>+</div><div class='add'>+import time</div><div class='add'>+import binascii</div><div class='add'>+</div><div class='add'>+# Calculate the now() time into a 64-bit integer value</div><div class='add'>+def epoch_now():</div><div class='add'>+        epoch_time = int(time.mktime(time.localtime())) &lt;&lt; 32</div><div class='add'>+        return epoch_time</div><div class='add'>+</div><div class='add'>+# Read glusterd UUID and extract first 32-bit of it</div><div class='add'>+def epoch_uuid():</div><div class='add'>+        file_name = '/var/lib/glusterd/glusterd.info'</div><div class='add'>+</div><div class='add'>+        for line in open(file_name):</div><div class='add'>+                if "UUID" in line:</div><div class='add'>+                        glusterd_uuid = line.split('=')[1].strip()</div><div class='add'>+</div><div class='add'>+        uuid_bin = binascii.unhexlify(glusterd_uuid.replace("-",""))</div><div class='add'>+</div><div class='add'>+        epoch_uuid = int(binascii.hexlify(uuid_bin), 32) &amp; 0xFFFF0000</div><div class='add'>+        return epoch_uuid</div><div class='add'>+</div><div class='add'>+# Construct epoch as follows -</div><div class='add'>+#        first 32-bit contains the now() time</div><div class='add'>+#        rest 32-bit value contains the local glusterd node uuid</div><div class='add'>+epoch = (epoch_now() | epoch_uuid())</div><div class='add'>+print((str(epoch)))</div><div class='add'>+</div><div class='add'>+exit(0)</div><div class='head'>diff --git a/extras/geo-rep/Makefile.am b/extras/geo-rep/Makefile.am<br/>new file mode 100644<br/>index 00000000000..09eff308ac4<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/extras/geo-rep/Makefile.am?id=d1d7a6f35c816822fab51c820e25023863c239c1'>extras/geo-rep/Makefile.am</a></div><div class='hunk'>@@ -0,0 +1,16 @@</div><div class='add'>+scriptsdir = $(libexecdir)/glusterfs/scripts</div><div class='add'>+scripts_SCRIPTS =  gsync-upgrade.sh generate-gfid-file.sh get-gfid.sh \</div><div class='add'>+	slave-upgrade.sh schedule_georep.py</div><div class='add'>+</div><div class='add'>+scripts_PROGRAMS = gsync-sync-gfid</div><div class='add'>+gsync_sync_gfid_CFLAGS = $(GF_CFLAGS) -Wall -I$(top_srcdir)/libglusterfs/src</div><div class='add'>+gsync_sync_gfid_LDFLAGS = $(GF_LDFLAGS)</div><div class='add'>+gsync_sync_gfid_LDADD = $(GF_LDADD) $(top_builddir)/libglusterfs/src/libglusterfs.la</div><div class='add'>+gsync_sync_gfid_SOURCES = gsync-sync-gfid.c</div><div class='add'>+gsync_sync_gfid_CPPFLAGS = $(GF_CPPFLAGS) -I$(top_srcdir)/libglusterfs/src \</div><div class='add'>+	-I$(top_srcdir)/rpc/xdr/src -I$(top_builddir)/rpc/xdr/src</div><div class='add'>+</div><div class='add'>+EXTRA_DIST = gsync-sync-gfid.c gsync-upgrade.sh generate-gfid-file.sh \</div><div class='add'>+	get-gfid.sh slave-upgrade.sh schedule_georep.py.in</div><div class='add'>+</div><div class='add'>+CLEANFILES = schedule_georep.py</div><div class='head'>diff --git a/extras/geo-rep/generate-gfid-file.sh b/extras/geo-rep/generate-gfid-file.sh<br/>new file mode 100644<br/>index 00000000000..14f104b986d<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/extras/geo-rep/generate-gfid-file.sh?id=d1d7a6f35c816822fab51c820e25023863c239c1'>extras/geo-rep/generate-gfid-file.sh</a></div><div class='hunk'>@@ -0,0 +1,70 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+#Usage: generate-gfid-file.sh &lt;master-volfile-server:master-volume&gt; &lt;path-to-get-gfid.sh&gt; &lt;output-file&gt; [dirs-list-file]</div><div class='add'>+</div><div class='add'>+function get_gfids()</div><div class='add'>+{</div><div class='add'>+    GET_GFID_CMD=$1</div><div class='add'>+    OUTPUT_FILE=$2</div><div class='add'>+    DIR_PATH=$3</div><div class='add'>+    find "$DIR_PATH" -exec $GET_GFID_CMD {} \; &gt;&gt; $OUTPUT_FILE</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function mount_client()</div><div class='add'>+{</div><div class='add'>+    local T; # temporary mount</div><div class='add'>+    local i; # inode number</div><div class='add'>+</div><div class='add'>+    VOLFILE_SERVER=$1;</div><div class='add'>+    VOLUME=$2;</div><div class='add'>+    GFID_CMD=$3;</div><div class='add'>+    OUTPUT=$4;</div><div class='add'>+</div><div class='add'>+    T=$(mktemp -d -t ${0##*/}.XXXXXX);</div><div class='add'>+</div><div class='add'>+    glusterfs -s $VOLFILE_SERVER --volfile-id $VOLUME $T;</div><div class='add'>+</div><div class='add'>+    i=$(stat -c '%i' $T);</div><div class='add'>+</div><div class='add'>+    [ "x$i" = "x1" ] || fatal "could not mount volume $MASTER on $T";</div><div class='add'>+</div><div class='add'>+    cd $T;</div><div class='add'>+    rm -f $OUTPUT;</div><div class='add'>+    touch $OUTPUT;</div><div class='add'>+</div><div class='add'>+    if [ "$DIRS_FILE" = "." ]</div><div class='add'>+    then</div><div class='add'>+        get_gfids $GFID_CMD $OUTPUT "."</div><div class='add'>+    else</div><div class='add'>+        while read line</div><div class='add'>+        do</div><div class='add'>+            get_gfids $GFID_CMD $OUTPUT "$line"</div><div class='add'>+        done &lt; $DIRS_FILE</div><div class='add'>+    fi;</div><div class='add'>+</div><div class='add'>+    cd -;</div><div class='add'>+</div><div class='add'>+    umount $T || fatal "could not umount $MASTER from $T";</div><div class='add'>+</div><div class='add'>+    rmdir $T || warn "rmdir of $T failed";</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+function main()</div><div class='add'>+{</div><div class='add'>+    SLAVE=$1</div><div class='add'>+    GET_GFID_CMD=$2</div><div class='add'>+    OUTPUT=$3</div><div class='add'>+</div><div class='add'>+    VOLFILE_SERVER=`echo $SLAVE | sed -e 's/\(.*\):.*/\1/'`</div><div class='add'>+    VOLUME_NAME=`echo $SLAVE | sed -e 's/.*:\(.*\)/\1/'`</div><div class='add'>+</div><div class='add'>+    if [ "$#" -lt 4 ]</div><div class='add'>+    then</div><div class='add'>+        DIRS_FILE="."</div><div class='add'>+    else</div><div class='add'>+        DIRS_FILE=$4</div><div class='add'>+    fi</div><div class='add'>+    mount_client $VOLFILE_SERVER $VOLUME_NAME $GET_GFID_CMD $OUTPUT $DIRS_FILE</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+main "$@";</div><div class='head'>diff --git a/extras/geo-rep/get-gfid.sh b/extras/geo-rep/get-gfid.sh<br/>new file mode 100755<br/>index 00000000000..a4d609b0bc5<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/extras/geo-rep/get-gfid.sh?id=d1d7a6f35c816822fab51c820e25023863c239c1'>extras/geo-rep/get-gfid.sh</a></div><div class='hunk'>@@ -0,0 +1,7 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+ATTR_STR=`getfattr -h $1 -n glusterfs.gfid.string`</div><div class='add'>+GLFS_PATH=`echo $ATTR_STR | sed -e 's/# file: \(.*\) glusterfs.gfid.string*/\1/g'`</div><div class='add'>+GFID=`echo $ATTR_STR | sed -e 's/.*glusterfs.gfid.string="\(.*\)"/\1/g'`</div><div class='add'>+</div><div class='add'>+echo "$GFID $GLFS_PATH"</div><div class='head'>diff --git a/extras/geo-rep/gsync-sync-gfid.c b/extras/geo-rep/gsync-sync-gfid.c<br/>new file mode 100644<br/>index 00000000000..47dca0413e9<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/extras/geo-rep/gsync-sync-gfid.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>extras/geo-rep/gsync-sync-gfid.c</a></div><div class='hunk'>@@ -0,0 +1,109 @@</div><div class='add'>+</div><div class='add'>+#include &lt;stdio.h&gt;</div><div class='add'>+#include &lt;errno.h&gt;</div><div class='add'>+#include &lt;string.h&gt;</div><div class='add'>+#include &lt;limits.h&gt;</div><div class='add'>+#include &lt;sys/types.h&gt;</div><div class='add'>+#include &lt;libgen.h&gt;</div><div class='add'>+#include &lt;ctype.h&gt;</div><div class='add'>+#include &lt;stdlib.h&gt;</div><div class='add'>+#include &lt;glusterfs/glusterfs.h&gt;</div><div class='add'>+#include &lt;glusterfs/syscall.h&gt;</div><div class='add'>+</div><div class='add'>+#ifndef UUID_CANONICAL_FORM_LEN</div><div class='add'>+#define UUID_CANONICAL_FORM_LEN 36</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#ifndef GF_FUSE_AUX_GFID_HEAL</div><div class='add'>+#define GF_FUSE_AUX_GFID_HEAL "glusterfs.gfid.heal"</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#define GLFS_LINE_MAX (PATH_MAX + (2 * UUID_CANONICAL_FORM_LEN))</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+main(int argc, char *argv[])</div><div class='add'>+{</div><div class='add'>+    char *file = NULL;</div><div class='add'>+    char *tmp = NULL;</div><div class='add'>+    char *tmp1 = NULL;</div><div class='add'>+    char *parent_dir = NULL;</div><div class='add'>+    char *gfid = NULL;</div><div class='add'>+    char *bname = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int len = 0;</div><div class='add'>+    FILE *fp = NULL;</div><div class='add'>+    char line[GLFS_LINE_MAX] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    char *path = NULL;</div><div class='add'>+    void *blob = NULL;</div><div class='add'>+    void *tmp_blob = NULL;</div><div class='add'>+</div><div class='add'>+    if (argc != 2) {</div><div class='add'>+        /* each line in the file has the following format</div><div class='add'>+         * uuid-in-canonical-form path-relative-to-gluster-mount.</div><div class='add'>+         * Both uuid and relative path are from master mount.</div><div class='add'>+         */</div><div class='add'>+        fprintf(stderr, "usage: %s &lt;file-of-paths-to-be-synced&gt;\n", argv[0]);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    file = argv[1];</div><div class='add'>+</div><div class='add'>+    fp = fopen(file, "r");</div><div class='add'>+    if (fp == NULL) {</div><div class='add'>+        fprintf(stderr, "cannot open %s for reading (%s)\n", file,</div><div class='add'>+                strerror(errno));</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    while (fgets(line, GLFS_LINE_MAX, fp) != NULL) {</div><div class='add'>+        tmp = line;</div><div class='add'>+        path = gfid = line;</div><div class='add'>+</div><div class='add'>+        path += UUID_CANONICAL_FORM_LEN + 1;</div><div class='add'>+</div><div class='add'>+        while (isspace(*path))</div><div class='add'>+            path++;</div><div class='add'>+</div><div class='add'>+        len = strlen(line);</div><div class='add'>+        if ((len &lt; GLFS_LINE_MAX) &amp;&amp; (line[len - 1] == '\n'))</div><div class='add'>+            line[len - 1] = '\0';</div><div class='add'>+</div><div class='add'>+        line[UUID_CANONICAL_FORM_LEN] = '\0';</div><div class='add'>+</div><div class='add'>+        tmp = strdup(path);</div><div class='add'>+        tmp1 = strdup(path);</div><div class='add'>+        parent_dir = dirname(tmp);</div><div class='add'>+        bname = basename(tmp1);</div><div class='add'>+</div><div class='add'>+        /* gfid + '\0' + bname + '\0' */</div><div class='add'>+        len = UUID_CANONICAL_FORM_LEN + 1 + strlen(bname) + 1;</div><div class='add'>+</div><div class='add'>+        blob = malloc(len);</div><div class='add'>+</div><div class='add'>+        memcpy(blob, gfid, UUID_CANONICAL_FORM_LEN);</div><div class='add'>+</div><div class='add'>+        tmp_blob = blob + UUID_CANONICAL_FORM_LEN + 1;</div><div class='add'>+</div><div class='add'>+        memcpy(tmp_blob, bname, strlen(bname));</div><div class='add'>+</div><div class='add'>+        ret = sys_lsetxattr(parent_dir, GF_FUSE_AUX_GFID_HEAL, blob, len, 0);</div><div class='add'>+        if (ret &lt; 0) {</div><div class='add'>+            fprintf(stderr, "setxattr on %s/%s failed (%s)\n", parent_dir,</div><div class='add'>+                    bname, strerror(errno));</div><div class='add'>+        }</div><div class='add'>+        memset(line, 0, GLFS_LINE_MAX);</div><div class='add'>+</div><div class='add'>+        free(blob);</div><div class='add'>+        free(tmp);</div><div class='add'>+        free(tmp1);</div><div class='add'>+        blob = NULL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+out:</div><div class='add'>+    if (fp)</div><div class='add'>+        fclose(fp);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='head'>diff --git a/extras/geo-rep/gsync-upgrade.sh b/extras/geo-rep/gsync-upgrade.sh<br/>new file mode 100644<br/>index 00000000000..0f73a33884b<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/extras/geo-rep/gsync-upgrade.sh?id=d1d7a6f35c816822fab51c820e25023863c239c1'>extras/geo-rep/gsync-upgrade.sh</a></div><div class='hunk'>@@ -0,0 +1,123 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+#usage: gsync-upgrade.sh &lt;slave-volfile-server:slave-volume&gt; &lt;gfid-file&gt;</div><div class='add'>+#                        &lt;path-to-gsync-sync-gfid&gt; &lt;ssh-identity-file&gt;</div><div class='add'>+#&lt;slave-volfile-server&gt;: a machine on which gluster cli can fetch slave volume info.</div><div class='add'>+#                        slave-volfile-server defaults to localhost.</div><div class='add'>+#</div><div class='add'>+#&lt;gfid-file&gt;: a file containing paths and their associated gfids</div><div class='add'>+#            on master. The paths are relative to master mount point</div><div class='add'>+#            (not absolute). An example extract of &lt;gfid-file&gt; can be,</div><div class='add'>+#</div><div class='add'>+#            &lt;extract&gt;</div><div class='add'>+#            22114455-57c5-46e9-a783-c40f83a72b09 /dir</div><div class='add'>+#            25772386-3eb8-4550-a802-c3fdc938ca80 /dir/file</div><div class='add'>+#            &lt;/extract&gt;</div><div class='add'>+#</div><div class='add'>+#&lt;ssh-identity-file&gt;: file from which the identity (private key) for public key authentication is read.</div><div class='add'>+</div><div class='add'>+SLAVE_MOUNT='/tmp/glfs_slave'</div><div class='add'>+</div><div class='add'>+function SSH()</div><div class='add'>+{</div><div class='add'>+    HOST=$1</div><div class='add'>+    SSHKEY=$2</div><div class='add'>+</div><div class='add'>+    shift 2</div><div class='add'>+</div><div class='add'>+    ssh -qi $SSHKEY \</div><div class='add'>+        -oPasswordAuthentication=no \</div><div class='add'>+        -oStrictHostKeyChecking=no \</div><div class='add'>+        "$HOST" "$@";</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function get_bricks()</div><div class='add'>+{</div><div class='add'>+    SSHKEY=$3</div><div class='add'>+</div><div class='add'>+    SSH $1 $SSHKEY "gluster volume info $2" | grep -E 'Brick[0-9]+' | sed -e 's/[^:]*:\(.*\)/\1/g'</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function cleanup_brick()</div><div class='add'>+{</div><div class='add'>+    HOST=$1</div><div class='add'>+    BRICK=$2</div><div class='add'>+    SSHKEY=$3</div><div class='add'>+</div><div class='add'>+    # TODO: write a C program to receive a list of files and does cleanup on</div><div class='add'>+    # them instead of spawning a new setfattr process for each file if</div><div class='add'>+    # performance is bad.</div><div class='add'>+    SSH -i $SSHKEY $HOST  "rm -rf $BRICK/.glusterfs/* &amp;&amp; find $BRICK -exec setfattr -x trusted.gfid {} \;"</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function cleanup_slave()</div><div class='add'>+{</div><div class='add'>+    SSHKEY=$2</div><div class='add'>+</div><div class='add'>+    VOLFILE_SERVER=`echo $1 | sed -e 's/\(.*\):.*/\1/'`</div><div class='add'>+    VOLUME_NAME=`echo $1 | sed -e 's/.*:\(.*\)/\1/'`</div><div class='add'>+</div><div class='add'>+    BRICKS=`get_bricks $VOLFILE_SERVER $VOLUME_NAME $SSHKEY`</div><div class='add'>+</div><div class='add'>+    for i in $BRICKS; do</div><div class='add'>+	HOST=`echo $i | sed -e 's/\(.*\):.*/\1/'`</div><div class='add'>+	BRICK=`echo $i | sed -e 's/.*:\(.*\)/\1/'`</div><div class='add'>+	cleanup_brick $HOST $BRICK $SSHKEY</div><div class='add'>+    done</div><div class='add'>+</div><div class='add'>+    SSH -i $SSHKEY $VOLFILE_SERVER "gluster --mode=script volume stop $VOLUME_NAME; gluster volume start $VOLUME_NAME";</div><div class='add'>+</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function mount_client()</div><div class='add'>+{</div><div class='add'>+    local T; # temporary mount</div><div class='add'>+    local i; # inode number</div><div class='add'>+    GFID_FILE=$3</div><div class='add'>+    SYNC_CMD=$4</div><div class='add'>+</div><div class='add'>+    T=$(mktemp -d -t ${0##*/}.XXXXXX);</div><div class='add'>+</div><div class='add'>+    glusterfs --aux-gfid-mount -s $1 --volfile-id $2 $T;</div><div class='add'>+</div><div class='add'>+    i=$(stat -c '%i' $T);</div><div class='add'>+</div><div class='add'>+    [ "x$i" = "x1" ] || fatal "could not mount volume $MASTER on $T";</div><div class='add'>+</div><div class='add'>+    cd $T;</div><div class='add'>+</div><div class='add'>+    $SYNC_CMD $GFID_FILE</div><div class='add'>+</div><div class='add'>+    cd -;</div><div class='add'>+</div><div class='add'>+    umount -l $T || fatal "could not umount $MASTER from $T";</div><div class='add'>+</div><div class='add'>+    rmdir $T || warn "rmdir of $T failed";</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function sync_gfids()</div><div class='add'>+{</div><div class='add'>+    SLAVE=$1</div><div class='add'>+    GFID_FILE=$2</div><div class='add'>+</div><div class='add'>+    SLAVE_VOLFILE_SERVER=`echo $SLAVE | sed -e 's/\(.*\):.*/\1/'`</div><div class='add'>+    SLAVE_VOLUME_NAME=`echo $SLAVE | sed -e 's/.*:\(.*\)/\1/'`</div><div class='add'>+</div><div class='add'>+    if [ "x$SLAVE_VOLFILE_SERVER" = "x" ]; then</div><div class='add'>+        SLAVE_VOLFILE_SERVER="localhost"</div><div class='add'>+    fi</div><div class='add'>+</div><div class='add'>+    mount_client $SLAVE_VOLFILE_SERVER $SLAVE_VOLUME_NAME $GFID_FILE $3</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function upgrade()</div><div class='add'>+{</div><div class='add'>+    SLAVE=$1</div><div class='add'>+    GFID_FILE=$2</div><div class='add'>+    SYNC_CMD=$3</div><div class='add'>+    SSHKEY=$4</div><div class='add'>+</div><div class='add'>+    cleanup_slave $SLAVE $SSHKEY</div><div class='add'>+    sync_gfids $SLAVE $GFID_FILE $SYNC_CMD</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+upgrade "$@"</div><div class='head'>diff --git a/extras/geo-rep/schedule_georep.py.in b/extras/geo-rep/schedule_georep.py.in<br/>new file mode 100644<br/>index 00000000000..48b2b507060<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/extras/geo-rep/schedule_georep.py.in?id=d1d7a6f35c816822fab51c820e25023863c239c1'>extras/geo-rep/schedule_georep.py.in</a></div><div class='hunk'>@@ -0,0 +1,492 @@</div><div class='add'>+#!/usr/bin/python3</div><div class='add'>+"""</div><div class='add'>+Schedule Geo-replication</div><div class='add'>+------------------------</div><div class='add'>+A tool to run Geo-replication when required. This can be used to</div><div class='add'>+schedule the Geo-replication to run once in a day using</div><div class='add'>+</div><div class='add'>+   # Run daily at 08:30pm</div><div class='add'>+   30 20 * * * root python /usr/share/glusterfs/scripts/schedule_georep.py \\</div><div class='add'>+      --no-color gv1 fvm1 gv2 &gt;&gt; /var/log/glusterfs/schedule_georep.log 2&gt;&amp;1</div><div class='add'>+</div><div class='add'>+This tool does the following,</div><div class='add'>+</div><div class='add'>+1. Stop Geo-replication if Started</div><div class='add'>+2. Start Geo-replication</div><div class='add'>+3. Set Checkpoint</div><div class='add'>+4. Check the Status and see Checkpoint is Complete.(LOOP)</div><div class='add'>+5. If checkpoint complete, Stop Geo-replication</div><div class='add'>+</div><div class='add'>+Usage:</div><div class='add'>+</div><div class='add'>+    python /usr/share/glusterfs/scripts/schedule_georep.py &lt;MASTERVOL&gt; \\</div><div class='add'>+         &lt;SLAVEHOST&gt; &lt;SLAVEVOL&gt;</div><div class='add'>+</div><div class='add'>+For example,</div><div class='add'>+</div><div class='add'>+    python /usr/share/glusterfs/scripts/schedule_georep.py gv1 fvm1 gv2</div><div class='add'>+</div><div class='add'>+"""</div><div class='add'>+import subprocess</div><div class='add'>+import time</div><div class='add'>+import xml.etree.cElementTree as etree</div><div class='add'>+import sys</div><div class='add'>+from contextlib import contextmanager</div><div class='add'>+import tempfile</div><div class='add'>+import os</div><div class='add'>+from argparse import ArgumentParser, RawDescriptionHelpFormatter</div><div class='add'>+</div><div class='add'>+ParseError = etree.ParseError if hasattr(etree, 'ParseError') else SyntaxError</div><div class='add'>+cache_data = {}</div><div class='add'>+</div><div class='add'>+SESSION_MOUNT_LOG_FILE = ("/var/log/glusterfs/geo-replication"</div><div class='add'>+                          "/schedule_georep.mount.log")</div><div class='add'>+</div><div class='add'>+USE_CLI_COLOR = True</div><div class='add'>+mnt_list = []</div><div class='add'>+</div><div class='add'>+class GlusterBadXmlFormat(Exception):</div><div class='add'>+    """</div><div class='add'>+    Exception class for XML Parse Errors</div><div class='add'>+    """</div><div class='add'>+    pass</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def output_notok(msg, err="", exitcode=1):</div><div class='add'>+    if USE_CLI_COLOR:</div><div class='add'>+        out = "\033[31m[NOT OK]\033[0m {0}\n{1}\n"</div><div class='add'>+    else:</div><div class='add'>+        out = "[NOT OK] {0}\n{1}\n"</div><div class='add'>+    sys.stderr.write(out.format(msg, err))</div><div class='add'>+    sys.exit(exitcode)</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def output_warning(msg):</div><div class='add'>+    if USE_CLI_COLOR:</div><div class='add'>+        out = "\033[33m[  WARN]\033[0m {0}\n"</div><div class='add'>+    else:</div><div class='add'>+        out = "[  WARN] {0}\n"</div><div class='add'>+    sys.stderr.write(out.format(msg))</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def output_ok(msg):</div><div class='add'>+    if USE_CLI_COLOR:</div><div class='add'>+        out = "\033[32m[    OK]\033[0m {0}\n"</div><div class='add'>+    else:</div><div class='add'>+        out = "[    OK] {0}\n"</div><div class='add'>+    sys.stderr.write(out.format(msg))</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def execute(cmd, success_msg="", failure_msg="", exitcode=-1):</div><div class='add'>+    """</div><div class='add'>+    Generic wrapper to execute the CLI commands. Returns Output if success.</div><div class='add'>+    On success it can print message in stdout if specified.</div><div class='add'>+    On failure, exits after writing to stderr.</div><div class='add'>+    """</div><div class='add'>+    p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True)</div><div class='add'>+    out, err = p.communicate()</div><div class='add'>+    if p.returncode == 0:</div><div class='add'>+        if success_msg:</div><div class='add'>+            output_ok(success_msg)</div><div class='add'>+        return out</div><div class='add'>+    else:</div><div class='add'>+        if exitcode == 0:</div><div class='add'>+            return</div><div class='add'>+        err_msg = err if err else out</div><div class='add'>+        output_notok(failure_msg, err=err_msg, exitcode=exitcode)</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def cache_output_with_args(func):</div><div class='add'>+    """</div><div class='add'>+    Decorator function to remember the output of any function</div><div class='add'>+    """</div><div class='add'>+    def wrapper(*args, **kwargs):</div><div class='add'>+        global cache_data</div><div class='add'>+        key = "_".join([func.func_name] + list(args))</div><div class='add'>+        if cache_data.get(key, None) is None:</div><div class='add'>+            cache_data[key] = func(*args, **kwargs)</div><div class='add'>+</div><div class='add'>+        return cache_data[key]</div><div class='add'>+    return wrapper</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def cleanup(hostname, volname, mnt):</div><div class='add'>+    """</div><div class='add'>+    Unmount the Volume and Remove the temporary directory</div><div class='add'>+    """</div><div class='add'>+    execute(["umount", "-l", mnt],</div><div class='add'>+            failure_msg="Unable to Unmount Gluster Volume "</div><div class='add'>+            "{0}:{1}(Mounted at {2})".format(hostname, volname, mnt))</div><div class='add'>+    execute(["rmdir", mnt],</div><div class='add'>+            failure_msg="Unable to Remove temp directory "</div><div class='add'>+            "{0}".format(mnt), exitcode=0)</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+@contextmanager</div><div class='add'>+def glustermount(hostname, volname):</div><div class='add'>+    """</div><div class='add'>+    Context manager for Mounting Gluster Volume</div><div class='add'>+    Use as</div><div class='add'>+        with glustermount(HOSTNAME, VOLNAME) as MNT:</div><div class='add'>+            # Do your stuff</div><div class='add'>+    Automatically unmounts it in case of Exceptions/out of context</div><div class='add'>+    """</div><div class='add'>+    mnt = tempfile.mkdtemp(prefix="georepsetup_")</div><div class='add'>+    mnt_list.append(mnt)</div><div class='add'>+    execute(["@SBIN_DIR@/glusterfs",</div><div class='add'>+             "--volfile-server", hostname,</div><div class='add'>+             "--volfile-id", volname,</div><div class='add'>+             "-l", SESSION_MOUNT_LOG_FILE,</div><div class='add'>+             mnt],</div><div class='add'>+            failure_msg="Unable to Mount Gluster Volume "</div><div class='add'>+            "{0}:{1}".format(hostname, volname))</div><div class='add'>+    if os.path.ismount(mnt):</div><div class='add'>+        yield mnt</div><div class='add'>+    else:</div><div class='add'>+        output_notok("Unable to Mount Gluster Volume "</div><div class='add'>+                     "{0}:{1}".format(hostname, volname))</div><div class='add'>+    cleanup(hostname, volname, mnt)</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+@cache_output_with_args</div><div class='add'>+def get_bricks(volname):</div><div class='add'>+    """</div><div class='add'>+    Returns Bricks list, caches the Bricks list for a volume once</div><div class='add'>+    parsed.</div><div class='add'>+    """</div><div class='add'>+    value = []</div><div class='add'>+    cmd = ["@SBIN_DIR@/gluster", "volume", "info", volname, "--xml"]</div><div class='add'>+    info = execute(cmd)</div><div class='add'>+    try:</div><div class='add'>+        tree = etree.fromstring(info)</div><div class='add'>+        volume_el = tree.find('volInfo/volumes/volume')</div><div class='add'>+        for b in volume_el.findall('bricks/brick'):</div><div class='add'>+            value.append({"name": b.find("name").text,</div><div class='add'>+                          "hostUuid": b.find("hostUuid").text})</div><div class='add'>+    except ParseError:</div><div class='add'>+        raise GlusterBadXmlFormat("Bad XML Format: %s" % " ".join(cmd))</div><div class='add'>+</div><div class='add'>+    return value</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def get_georep_status(mastervol, slave):</div><div class='add'>+    session_keys = set()</div><div class='add'>+    out = {}</div><div class='add'>+    cmd = ["@SBIN_DIR@/gluster", "volume", "geo-replication"]</div><div class='add'>+    if mastervol is not None:</div><div class='add'>+        cmd += [mastervol]</div><div class='add'>+        if slave:</div><div class='add'>+            cmd += [slave]</div><div class='add'>+</div><div class='add'>+    cmd += ["status", "--xml"]</div><div class='add'>+    info = execute(cmd)</div><div class='add'>+</div><div class='add'>+    try:</div><div class='add'>+        tree = etree.fromstring(info)</div><div class='add'>+        # Get All Sessions</div><div class='add'>+        for volume_el in tree.findall("geoRep/volume"):</div><div class='add'>+            sessions_el = volume_el.find("sessions")</div><div class='add'>+            # Master Volume name if multiple Volumes</div><div class='add'>+            mvol = volume_el.find("name").text</div><div class='add'>+</div><div class='add'>+            # For each session, collect the details</div><div class='add'>+            for session in sessions_el.findall("session"):</div><div class='add'>+                session_slave = "{0}:{1}".format(mvol, session.find(</div><div class='add'>+                    "session_slave").text)</div><div class='add'>+                session_keys.add(session_slave)</div><div class='add'>+                out[session_slave] = {}</div><div class='add'>+</div><div class='add'>+                for pair in session.findall('pair'):</div><div class='add'>+                    master_brick = "{0}:{1}".format(</div><div class='add'>+                        pair.find("master_node").text,</div><div class='add'>+                        pair.find("master_brick").text</div><div class='add'>+                    )</div><div class='add'>+</div><div class='add'>+                    out[session_slave][master_brick] = {</div><div class='add'>+                        "mastervol": mvol,</div><div class='add'>+                        "slavevol": pair.find("slave").text.split("::")[-1],</div><div class='add'>+                        "master_node": pair.find("master_node").text,</div><div class='add'>+                        "master_brick": pair.find("master_brick").text,</div><div class='add'>+                        "slave_user": pair.find("slave_user").text,</div><div class='add'>+                        "slave": pair.find("slave").text,</div><div class='add'>+                        "slave_node": pair.find("slave_node").text,</div><div class='add'>+                        "status": pair.find("status").text,</div><div class='add'>+                        "crawl_status": pair.find("crawl_status").text,</div><div class='add'>+                        "entry": pair.find("entry").text,</div><div class='add'>+                        "data": pair.find("data").text,</div><div class='add'>+                        "meta": pair.find("meta").text,</div><div class='add'>+                        "failures": pair.find("failures").text,</div><div class='add'>+                        "checkpoint_completed": pair.find(</div><div class='add'>+                            "checkpoint_completed").text,</div><div class='add'>+                        "master_node_uuid": pair.find("master_node_uuid").text,</div><div class='add'>+                        "last_synced": pair.find("last_synced").text,</div><div class='add'>+                        "checkpoint_time": pair.find("checkpoint_time").text,</div><div class='add'>+                        "checkpoint_completion_time":</div><div class='add'>+                        pair.find("checkpoint_completion_time").text</div><div class='add'>+                    }</div><div class='add'>+    except ParseError:</div><div class='add'>+        raise GlusterBadXmlFormat("Bad XML Format: %s" % " ".join(cmd))</div><div class='add'>+</div><div class='add'>+    return session_keys, out</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def get_offline_status(volname, brick, node_uuid, slave):</div><div class='add'>+    node, brick = brick.split(":")</div><div class='add'>+    if "@" not in slave:</div><div class='add'>+        slave_user = "root"</div><div class='add'>+    else:</div><div class='add'>+        slave_user, _ = slave.split("@")</div><div class='add'>+</div><div class='add'>+    return {</div><div class='add'>+        "mastervol": volname,</div><div class='add'>+        "slavevol": slave.split("::")[-1],</div><div class='add'>+        "master_node": node,</div><div class='add'>+        "master_brick": brick,</div><div class='add'>+        "slave_user": slave_user,</div><div class='add'>+        "slave": slave,</div><div class='add'>+        "slave_node": "N/A",</div><div class='add'>+        "status": "Offline",</div><div class='add'>+        "crawl_status": "N/A",</div><div class='add'>+        "entry": "N/A",</div><div class='add'>+        "data": "N/A",</div><div class='add'>+        "meta": "N/A",</div><div class='add'>+        "failures": "N/A",</div><div class='add'>+        "checkpoint_completed": "N/A",</div><div class='add'>+        "master_node_uuid": node_uuid,</div><div class='add'>+        "last_synced": "N/A",</div><div class='add'>+        "checkpoint_time": "N/A",</div><div class='add'>+        "checkpoint_completion_time": "N/A"</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def get(mastervol=None, slave=None):</div><div class='add'>+    """</div><div class='add'>+    This function gets list of Bricks of Master Volume and collects</div><div class='add'>+    respective Geo-rep status. Output will be always ordered as the</div><div class='add'>+    bricks list in Master Volume. If Geo-rep status is not available</div><div class='add'>+    for any brick then it updates OFFLINE status.</div><div class='add'>+    """</div><div class='add'>+    out = []</div><div class='add'>+    session_keys, gstatus = get_georep_status(mastervol, slave)</div><div class='add'>+</div><div class='add'>+    for session in session_keys:</div><div class='add'>+        mvol, _, slave = session.split(":", 2)</div><div class='add'>+        slave = slave.replace("ssh://", "")</div><div class='add'>+        master_bricks = get_bricks(mvol)</div><div class='add'>+        out.append([])</div><div class='add'>+        for brick in master_bricks:</div><div class='add'>+            bname = brick["name"]</div><div class='add'>+            if gstatus.get(session) and gstatus[session].get(bname, None):</div><div class='add'>+                out[-1].append(gstatus[session][bname])</div><div class='add'>+            else:</div><div class='add'>+                out[-1].append(</div><div class='add'>+                    get_offline_status(mvol, bname, brick["hostUuid"], slave))</div><div class='add'>+</div><div class='add'>+    return out</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def get_summary(mastervol, slave_url):</div><div class='add'>+    """</div><div class='add'>+    Wrapper function around Geo-rep Status and Gluster Volume Info</div><div class='add'>+    This combines the output from Bricks list and Geo-rep Status.</div><div class='add'>+    If a Master Brick node is down or Status is faulty then increments</div><div class='add'>+    the faulty counter. It also collects the checkpoint status from all</div><div class='add'>+    workers and compares with Number of Bricks.</div><div class='add'>+    """</div><div class='add'>+    down_rows = []</div><div class='add'>+    faulty_rows = []</div><div class='add'>+    out = []</div><div class='add'>+</div><div class='add'>+    status_data = get(mastervol, slave_url)</div><div class='add'>+</div><div class='add'>+    for session in status_data:</div><div class='add'>+        session_name = ""</div><div class='add'>+        summary = {</div><div class='add'>+            "active": 0,</div><div class='add'>+            "passive": 0,</div><div class='add'>+            "faulty": 0,</div><div class='add'>+            "initializing": 0,</div><div class='add'>+            "stopped": 0,</div><div class='add'>+            "created": 0,</div><div class='add'>+            "offline": 0,</div><div class='add'>+            "paused": 0,</div><div class='add'>+            "workers": 0,</div><div class='add'>+            "completed_checkpoints": 0,</div><div class='add'>+            "checkpoint": False,</div><div class='add'>+            "checkpoints_ok": False,</div><div class='add'>+            "ok": False</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        for row in session:</div><div class='add'>+            summary[row["status"].replace("...", "").lower()] += 1</div><div class='add'>+            summary["workers"] += 1</div><div class='add'>+            if row["checkpoint_completed"] == "Yes":</div><div class='add'>+                summary["completed_checkpoints"] += 1</div><div class='add'>+</div><div class='add'>+            session_name = "{0}=&gt;{1}".format(</div><div class='add'>+                row["mastervol"],</div><div class='add'>+                row["slave"].replace("ssh://", "")</div><div class='add'>+            )</div><div class='add'>+</div><div class='add'>+            if row["status"] == "Faulty":</div><div class='add'>+                faulty_rows.append("{0}:{1}".format(row["master_node"],</div><div class='add'>+                                                    row["master_brick"]))</div><div class='add'>+</div><div class='add'>+            if row["status"] == "Offline":</div><div class='add'>+                down_rows.append("{0}:{1}".format(row["master_node"],</div><div class='add'>+                                                  row["master_brick"]))</div><div class='add'>+</div><div class='add'>+        if summary["active"] == summary["completed_checkpoints"] and \</div><div class='add'>+           summary["faulty"] == 0 and summary["offline"] == 0:</div><div class='add'>+            summary["checkpoints_ok"] = True</div><div class='add'>+</div><div class='add'>+        if summary["faulty"] == 0 and summary["offline"] == 0:</div><div class='add'>+            summary["ok"] = True</div><div class='add'>+</div><div class='add'>+        if session_name != "":</div><div class='add'>+                out.append([session_name, summary, faulty_rows, down_rows])</div><div class='add'>+</div><div class='add'>+    return out</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def touch_mount_root(mastervol):</div><div class='add'>+    # Create a Mount and Touch the Mount point root,</div><div class='add'>+    # Hack to make sure some event available after</div><div class='add'>+    # setting Checkpoint. Without this there is a chance of</div><div class='add'>+    # Checkpoint never completes.</div><div class='add'>+    with glustermount("localhost", mastervol) as mnt:</div><div class='add'>+        execute(["touch", mnt])</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def main(args):</div><div class='add'>+    turns = 1</div><div class='add'>+</div><div class='add'>+    # Stop Force</div><div class='add'>+    cmd = ["@SBIN_DIR@/gluster", "volume", "geo-replication", args.mastervol,</div><div class='add'>+           "%s::%s" % (args.slave, args.slavevol), "stop", "force"]</div><div class='add'>+    execute(cmd)</div><div class='add'>+    output_ok("Stopped Geo-replication")</div><div class='add'>+</div><div class='add'>+    # Set Checkpoint to NOW</div><div class='add'>+    cmd = ["@SBIN_DIR@/gluster", "volume", "geo-replication", args.mastervol,</div><div class='add'>+           "%s::%s" % (args.slave, args.slavevol), "config", "checkpoint",</div><div class='add'>+           "now"]</div><div class='add'>+    execute(cmd)</div><div class='add'>+    output_ok("Set Checkpoint")</div><div class='add'>+</div><div class='add'>+    # Start the Geo-replication</div><div class='add'>+    cmd = ["@SBIN_DIR@/gluster", "volume", "geo-replication", args.mastervol,</div><div class='add'>+           "%s::%s" % (args.slave, args.slavevol), "start"]</div><div class='add'>+    execute(cmd)</div><div class='add'>+    output_ok("Started Geo-replication and watching Status for "</div><div class='add'>+              "Checkpoint completion")</div><div class='add'>+</div><div class='add'>+    start_time = int(time.time())</div><div class='add'>+    duration = 0</div><div class='add'>+</div><div class='add'>+    # Sleep till Geo-rep initializes</div><div class='add'>+    time.sleep(60)</div><div class='add'>+</div><div class='add'>+    touch_mount_root(args.mastervol)</div><div class='add'>+</div><div class='add'>+    slave_url = "{0}::{1}".format(args.slave, args.slavevol)</div><div class='add'>+</div><div class='add'>+    # Loop to Check the Geo-replication Status and Checkpoint</div><div class='add'>+    # If All Status OK and all Checkpoints complete,</div><div class='add'>+    # Stop the Geo-replication and Log the Completeness</div><div class='add'>+    while True:</div><div class='add'>+        session_summary = get_summary(args.mastervol,</div><div class='add'>+                                      slave_url)</div><div class='add'>+        if len(session_summary) == 0:</div><div class='add'>+            # If Status command fails with another transaction error</div><div class='add'>+            # or any other error. Gluster cmd still produces XML output</div><div class='add'>+            # with different message</div><div class='add'>+            output_warning("Unable to get Geo-replication Status")</div><div class='add'>+        else:</div><div class='add'>+            session_name, summary, faulty_rows, down_rows = session_summary[0]</div><div class='add'>+            chkpt_status = "COMPLETE" if summary["checkpoints_ok"] else \</div><div class='add'>+                           "NOT COMPLETE"</div><div class='add'>+            ok_status = "OK" if summary["ok"] else "NOT OK"</div><div class='add'>+</div><div class='add'>+            if summary["ok"]:</div><div class='add'>+                output_ok("All Checkpoints {1}, "</div><div class='add'>+                          "All status {2} (Turns {0:&gt;3})".format(</div><div class='add'>+                              turns, chkpt_status, ok_status))</div><div class='add'>+            else:</div><div class='add'>+                output_warning("All Checkpoints {1}, "</div><div class='add'>+                               "All status {2} (Turns {0:&gt;3})".format(</div><div class='add'>+                                   turns, chkpt_status, ok_status))</div><div class='add'>+</div><div class='add'>+                output_warning("Geo-rep workers Faulty/Offline, "</div><div class='add'>+                               "Faulty: {0} Offline: {1}".format(</div><div class='add'>+                                   repr(faulty_rows),</div><div class='add'>+                                   repr(down_rows)))</div><div class='add'>+</div><div class='add'>+            if summary["checkpoints_ok"]:</div><div class='add'>+                output_ok("Stopping Geo-replication session now")</div><div class='add'>+                cmd = ["@SBIN_DIR@/gluster", "volume", "geo-replication",</div><div class='add'>+                       args.mastervol,</div><div class='add'>+                       "%s::%s" % (args.slave, args.slavevol), "stop"]</div><div class='add'>+                execute(cmd)</div><div class='add'>+                break</div><div class='add'>+            else:</div><div class='add'>+                # If Checkpoint is not complete after a iteration means brick</div><div class='add'>+                # was down and came online now. SETATTR on mount is not</div><div class='add'>+                # recorded, So again issue touch on mount root So that</div><div class='add'>+                # Stime will increase and Checkpoint will complete.</div><div class='add'>+                touch_mount_root(args.mastervol)</div><div class='add'>+</div><div class='add'>+        # Increment the turns and Sleep for 10 sec</div><div class='add'>+        turns += 1</div><div class='add'>+        duration = int(time.time()) - start_time</div><div class='add'>+        if args.timeout &gt; 0 and duration &gt; (args.timeout * 60):</div><div class='add'>+            cmd = ["@SBIN_DIR@/gluster", "volume", "geo-replication",</div><div class='add'>+                   args.mastervol,</div><div class='add'>+                   "%s::%s" % (args.slave, args.slavevol), "stop", "force"]</div><div class='add'>+            execute(cmd)</div><div class='add'>+            output_notok("Timed out, Stopping Geo-replication("</div><div class='add'>+                         "Duration: {0}sec)".format(duration))</div><div class='add'>+</div><div class='add'>+        time.sleep(args.interval)</div><div class='add'>+</div><div class='add'>+    for mnt in mnt_list:</div><div class='add'>+        execute(["rmdir", mnt],</div><div class='add'>+                failure_msg="Unable to Remove temp directory "</div><div class='add'>+                "{0}".format(mnt), exitcode=0)</div><div class='add'>+</div><div class='add'>+if __name__ == "__main__":</div><div class='add'>+    parser = ArgumentParser(formatter_class=RawDescriptionHelpFormatter,</div><div class='add'>+                            description=__doc__)</div><div class='add'>+    parser.add_argument("mastervol", help="Master Volume Name")</div><div class='add'>+    parser.add_argument("slave",</div><div class='add'>+                        help="Slave hostname "</div><div class='add'>+                        "(&lt;username&gt;@SLAVEHOST or SLAVEHOST)",</div><div class='add'>+                        metavar="SLAVE")</div><div class='add'>+    parser.add_argument("slavevol", help="Slave Volume Name")</div><div class='add'>+    parser.add_argument("--interval", help="Interval in Seconds. "</div><div class='add'>+                        "Wait time before each status check",</div><div class='add'>+                        type=int, default=10)</div><div class='add'>+    parser.add_argument("--timeout", help="Timeout in minutes. Script will "</div><div class='add'>+                        "stop Geo-replication if Checkpoint is not complete "</div><div class='add'>+                        "in the specified timeout time", type=int,</div><div class='add'>+                        default=0)</div><div class='add'>+    parser.add_argument("--no-color", help="Don't use Color in CLI output",</div><div class='add'>+                        action="store_true")</div><div class='add'>+    args = parser.parse_args()</div><div class='add'>+    if args.no_color:</div><div class='add'>+        USE_CLI_COLOR = False</div><div class='add'>+    try:</div><div class='add'>+        # Check for session existence</div><div class='add'>+        cmd = ["@SBIN_DIR@/gluster", "volume", "geo-replication",</div><div class='add'>+               args.mastervol, "%s::%s" % (args.slave, args.slavevol), "status"]</div><div class='add'>+        execute(cmd)</div><div class='add'>+        main(args)</div><div class='add'>+    except KeyboardInterrupt:</div><div class='add'>+        for mnt in mnt_list:</div><div class='add'>+            execute(["umount", "-l", mnt],</div><div class='add'>+                    failure_msg="Unable to Unmount Gluster Volume "</div><div class='add'>+                    "Mounted at {0}".format(mnt), exitcode=0)</div><div class='add'>+            execute(["rmdir", mnt],</div><div class='add'>+                    failure_msg="Unable to Remove temp directory "</div><div class='add'>+                    "{0}".format(mnt), exitcode=0)</div><div class='add'>+        output_notok("Exiting...")</div><div class='head'>diff --git a/extras/geo-rep/slave-upgrade.sh b/extras/geo-rep/slave-upgrade.sh<br/>new file mode 100644<br/>index 00000000000..3a37f8e3579<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/extras/geo-rep/slave-upgrade.sh?id=d1d7a6f35c816822fab51c820e25023863c239c1'>extras/geo-rep/slave-upgrade.sh</a></div><div class='hunk'>@@ -0,0 +1,102 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+#usage: slave-upgrade.sh &lt;volfile-server:volname&gt; &lt;gfid-file&gt;</div><div class='add'>+#                        &lt;path-to-gsync-sync-gfid&gt;</div><div class='add'>+#&lt;slave-volfile-server&gt;: a machine on which gluster cli can fetch slave volume info.</div><div class='add'>+#                        slave-volfile-server defaults to localhost.</div><div class='add'>+#</div><div class='add'>+#&lt;gfid-file&gt;: a file containing paths and their associated gfids</div><div class='add'>+#            on master. The paths are relative to master mount point</div><div class='add'>+#            (not absolute). An example extract of &lt;gfid-file&gt; can be,</div><div class='add'>+#</div><div class='add'>+#            &lt;extract&gt;</div><div class='add'>+#            22114455-57c5-46e9-a783-c40f83a72b09 /dir</div><div class='add'>+#            25772386-3eb8-4550-a802-c3fdc938ca80 /dir/file</div><div class='add'>+#            &lt;/extract&gt;</div><div class='add'>+</div><div class='add'>+function get_bricks()</div><div class='add'>+{</div><div class='add'>+    gluster volume info $1 | grep -E 'Brick[0-9]+' | sed -e 's/[^:]*:\(.*\)/\1/g'</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function cleanup_brick()</div><div class='add'>+{</div><div class='add'>+    HOST=$1</div><div class='add'>+    BRICK=$2</div><div class='add'>+</div><div class='add'>+    # TODO: write a C program to receive a list of files and does cleanup on</div><div class='add'>+    # them instead of spawning a new setfattr process for each file if</div><div class='add'>+    # performance is bad.</div><div class='add'>+    ssh $HOST "rm -rf $BRICK/.glusterfs/* &amp;&amp; find $BRICK -exec setfattr -x trusted.gfid {} \; 2&gt;/dev/null"</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function cleanup_slave()</div><div class='add'>+{</div><div class='add'>+    VOLUME_NAME=`echo $1 | sed -e 's/.*:\(.*\)/\1/'`</div><div class='add'>+</div><div class='add'>+    BRICKS=`get_bricks $VOLUME_NAME`</div><div class='add'>+</div><div class='add'>+    for i in $BRICKS; do</div><div class='add'>+	HOST=`echo $i | sed -e 's/\(.*\):.*/\1/'`</div><div class='add'>+	BRICK=`echo $i | sed -e 's/.*:\(.*\)/\1/'`</div><div class='add'>+	cleanup_brick $HOST $BRICK</div><div class='add'>+    done</div><div class='add'>+</div><div class='add'>+    # Now restart the volume</div><div class='add'>+    gluster --mode=script volume stop $VOLUME_NAME;</div><div class='add'>+    gluster volume start $VOLUME_NAME;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function mount_client()</div><div class='add'>+{</div><div class='add'>+    local T; # temporary mount</div><div class='add'>+    local i; # inode number</div><div class='add'>+</div><div class='add'>+    VOLUME_NAME=$2;</div><div class='add'>+    GFID_FILE=$3</div><div class='add'>+    SYNC_CMD=$4</div><div class='add'>+</div><div class='add'>+    T=$(mktemp -d -t ${0##*/}.XXXXXX);</div><div class='add'>+</div><div class='add'>+    glusterfs --aux-gfid-mount -s $1 --volfile-id $VOLUME_NAME $T;</div><div class='add'>+</div><div class='add'>+    i=$(stat -c '%i' $T);</div><div class='add'>+</div><div class='add'>+    cd $T;</div><div class='add'>+</div><div class='add'>+    $SYNC_CMD $GFID_FILE</div><div class='add'>+</div><div class='add'>+    cd -;</div><div class='add'>+</div><div class='add'>+    umount $T || fatal "could not umount $MASTER from $T";</div><div class='add'>+</div><div class='add'>+    rmdir $T || warn "rmdir of $T failed";</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function sync_gfids()</div><div class='add'>+{</div><div class='add'>+    SLAVE=$1</div><div class='add'>+    GFID_FILE=$2</div><div class='add'>+    SYNC_CMD=$3</div><div class='add'>+</div><div class='add'>+    SLAVE_VOLFILE_SERVER=`echo $SLAVE | sed -e 's/\(.*\):.*/\1/'`</div><div class='add'>+    SLAVE_VOLUME_NAME=`echo $SLAVE | sed -e 's/.*:\(.*\)/\1/'`</div><div class='add'>+</div><div class='add'>+    if [ "x$SLAVE_VOLFILE_SERVER" = "x" ]; then</div><div class='add'>+        SLAVE_VOLFILE_SERVER="localhost"</div><div class='add'>+    fi</div><div class='add'>+</div><div class='add'>+    mount_client $SLAVE_VOLFILE_SERVER $SLAVE_VOLUME_NAME $GFID_FILE $SYNC_CMD</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function upgrade()</div><div class='add'>+{</div><div class='add'>+    SLAVE=$1</div><div class='add'>+    GFID_FILE=$2</div><div class='add'>+    SYNC_CMD=$3</div><div class='add'>+</div><div class='add'>+    cleanup_slave $SLAVE</div><div class='add'>+</div><div class='add'>+    sync_gfids $SLAVE $GFID_FILE $SYNC_CMD</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+upgrade "$@"</div><div class='head'>diff --git a/extras/gfid-to-dirname.sh b/extras/gfid-to-dirname.sh<br/>new file mode 100755<br/>index 00000000000..fd359fab58a<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/extras/gfid-to-dirname.sh?id=d1d7a6f35c816822fab51c820e25023863c239c1'>extras/gfid-to-dirname.sh</a></div><div class='hunk'>@@ -0,0 +1,46 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+function read_symlink()</div><div class='add'>+{</div><div class='add'>+        DOT_GLUSTERFS_PATH=$BRICK_PATH/.glusterfs</div><div class='add'>+        gfid_string=$1</div><div class='add'>+        symlink_path="$DOT_GLUSTERFS_PATH/${gfid_string:0:2}/${gfid_string:2:2}/$gfid_string"</div><div class='add'>+        #remove trailing '/'</div><div class='add'>+        symlink_path=${symlink_path%/}</div><div class='add'>+        linkname=$(readlink $symlink_path)</div><div class='add'>+        if [ $? -ne 0 ]; then</div><div class='add'>+                echo "readlink of $symlink_path returned an error." &gt;&amp;2</div><div class='add'>+                exit -1</div><div class='add'>+        fi</div><div class='add'>+        echo $linkname</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+main()</div><div class='add'>+{</div><div class='add'>+        if [ $# -lt 2 ] ;then</div><div class='add'>+                echo "Usage: $0 &lt;brick-path&gt; &lt;gfid-string-of-directory&gt;"</div><div class='add'>+                echo "Example: $0 /bricks/brick1 1b835012-1ae5-4f0d-9db4-64de574d891c"</div><div class='add'>+                exit -1</div><div class='add'>+        fi</div><div class='add'>+</div><div class='add'>+        BRICK_PATH=$1</div><div class='add'>+        name=$(read_symlink $2)</div><div class='add'>+        if [ $? -ne 0 ]; then</div><div class='add'>+                exit -1</div><div class='add'>+        fi</div><div class='add'>+</div><div class='add'>+        while [ ${name:12:36} != "00000000-0000-0000-0000-000000000001" ]</div><div class='add'>+        do</div><div class='add'>+                LOCATION=`basename $name`/$LOCATION</div><div class='add'>+                GFID_STRING=${name:12:36}</div><div class='add'>+                name=$(read_symlink $GFID_STRING)</div><div class='add'>+                if [ $? -ne 0 ]; then</div><div class='add'>+                        exit -1</div><div class='add'>+                fi</div><div class='add'>+        done</div><div class='add'>+</div><div class='add'>+        LOCATION=`basename $name`/$LOCATION</div><div class='add'>+        echo "Location of the directory corresponding to gfid:$2 is $BRICK_PATH/$LOCATION"</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+main "$@"</div><div class='head'>diff --git a/extras/git-branch-diff.py b/extras/git-branch-diff.py<br/>new file mode 100755<br/>index 00000000000..382513e069e<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/extras/git-branch-diff.py?id=d1d7a6f35c816822fab51c820e25023863c239c1'>extras/git-branch-diff.py</a></div><div class='hunk'>@@ -0,0 +1,285 @@</div><div class='add'>+#!/bin/python2</div><div class='add'>+</div><div class='add'>+"""</div><div class='add'>+  Copyright (c) 2016 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='add'>+"""</div><div class='add'>+</div><div class='add'>+"""</div><div class='add'>+  ABOUT:</div><div class='add'>+  This script helps in visualizing backported and missed commits between two</div><div class='add'>+  different branches, tags or commit ranges. In the list of missed commits,</div><div class='add'>+  it will help you identify patches which are posted for reviews on gerrit server.</div><div class='add'>+</div><div class='add'>+  USAGE:</div><div class='add'>+    $ ./extras/git-branch-diff.py --help</div><div class='add'>+    usage: git-branch-diff.py [-h] [-s SOURCE] -t TARGET [-a AUTHOR] [-p PATH]</div><div class='add'>+                              [-o OPTIONS]</div><div class='add'>+</div><div class='add'>+    git wrapper to diff local or remote branches/tags/commit-ranges</div><div class='add'>+</div><div class='add'>+    optional arguments:</div><div class='add'>+      -h, --help            show this help message and exit</div><div class='add'>+      -s SOURCE, --source SOURCE</div><div class='add'>+                            source pattern, it could be a branch, tag or a commit</div><div class='add'>+                            range</div><div class='add'>+      -t TARGET, --target TARGET</div><div class='add'>+                            target pattern, it could be a branch, tag or a commit</div><div class='add'>+                            range</div><div class='add'>+      -a AUTHOR, --author AUTHOR</div><div class='add'>+                            default: git config name/email, to provide multiple</div><div class='add'>+                            specify comma separated values</div><div class='add'>+      -p PATH, --path PATH  show source and target diff w.r.t given path, to</div><div class='add'>+                            provide multiple specify space in between them</div><div class='add'>+      -o OPTIONS, --options OPTIONS</div><div class='add'>+                            add other git options such as --after=&lt;&gt;, --before=&lt;&gt;</div><div class='add'>+                            etc. experts use;</div><div class='add'>+</div><div class='add'>+  SAMPLE EXECUTIONS:</div><div class='add'>+  $ ./extras/git-branch-diff.py -t origin/release-3.8</div><div class='add'>+</div><div class='add'>+  $ ./extras/git-branch-diff.py -s local_branch -t origin/release-3.7</div><div class='add'>+</div><div class='add'>+  $ ./extras/git-branch-diff.py -s 4517bf8..e66add8 -t origin/release-3.7</div><div class='add'>+  $ ./extras/git-branch-diff.py -s HEAD..c4efd39 -t origin/release-3.7</div><div class='add'>+</div><div class='add'>+  $ ./extras/git-branch-diff.py -t v3.7.11 --author="author@redhat.com"</div><div class='add'>+  $ ./extras/git-branch-diff.py -t v3.7.11 --author="authorX, authorY, authorZ"</div><div class='add'>+</div><div class='add'>+  $ ./extras/git-branch-diff.py -t origin/release-3.8 --path="xlators/"</div><div class='add'>+  $ ./extras/git-branch-diff.py -t origin/release-3.8 --path="./xlators ./rpc"</div><div class='add'>+</div><div class='add'>+  $ ./extras/git-branch-diff.py -t origin/release-3.6 --author="*"</div><div class='add'>+  $ ./extras/git-branch-diff.py -t origin/release-3.6 --author="All"</div><div class='add'>+  $ ./extras/git-branch-diff.py -t origin/release-3.6 --author="Null"</div><div class='add'>+</div><div class='add'>+  $ ./extras/git-branch-diff.py -t v3.7.11 --options="--after=2015-03-01 \</div><div class='add'>+                                                      --before=2016-01-30"</div><div class='add'>+</div><div class='add'>+  DECLARATION:</div><div class='add'>+  While backporting commit to another branch only subject of the patch may</div><div class='add'>+  remain unchanged, all others such as commit message,  commit Id, change Id,</div><div class='add'>+  bug Id, may be changed. This script works by taking commit subject as the</div><div class='add'>+  key value for comparing two git branches, which can be local or remote.</div><div class='add'>+</div><div class='add'>+  Note: This script may ignore commits which have altered their commit subjects</div><div class='add'>+  while backporting patches. Also this script doesn't have any intelligence to</div><div class='add'>+  detect squashed commits.</div><div class='add'>+</div><div class='add'>+  AUTHOR:</div><div class='add'>+  Prasanna Kumar Kalever &lt;prasanna.kalever@redhat.com&gt;</div><div class='add'>+"""</div><div class='add'>+</div><div class='add'>+from __future__ import print_function</div><div class='add'>+import os</div><div class='add'>+import sys</div><div class='add'>+import argparse</div><div class='add'>+import commands</div><div class='add'>+import subprocess</div><div class='add'>+import requests</div><div class='add'>+</div><div class='add'>+class GitBranchDiff:</div><div class='add'>+    def __init__ (self):</div><div class='add'>+        " color symbols"</div><div class='add'>+        self.tick  = u'\033[1;32m[ \u2714 ]\033[0m'</div><div class='add'>+        self.cross = u'\033[1;31m[ \u2716 ]\033[0m'</div><div class='add'>+        self.green_set = u'\033[1;34m'</div><div class='add'>+        self.yello_set = u'\033[4;33m'</div><div class='add'>+        self.color_unset = '\033[0m'</div><div class='add'>+</div><div class='add'>+        self.parse_cmd_args()</div><div class='add'>+</div><div class='add'>+        " replace default values with actual values from command args"</div><div class='add'>+        self.g_author = self.argsdict['author']</div><div class='add'>+        self.s_pattern  = self.argsdict['source']</div><div class='add'>+        self.t_pattern  = self.argsdict['target']</div><div class='add'>+        self.r_path     = self.argsdict['path']</div><div class='add'>+        self.options    = ' '.join(self.argsdict['options'])</div><div class='add'>+</div><div class='add'>+        self.gerrit_server = "http://review.gluster.org"</div><div class='add'>+</div><div class='add'>+    def check_dir_exist (self, os_path):</div><div class='add'>+        " checks whether given path exist"</div><div class='add'>+        path_list = os_path.split()</div><div class='add'>+        for path in path_list:</div><div class='add'>+            if not os.path.exists(path):</div><div class='add'>+                raise argparse.ArgumentTypeError("'%s' path %s is not valid"</div><div class='add'>+                                                 %(os_path, path))</div><div class='add'>+        return os_path</div><div class='add'>+</div><div class='add'>+    def check_pattern_exist (self):</div><div class='add'>+        " defend to check given branch[s] exit"</div><div class='add'>+        status_sbr, op = commands.getstatusoutput('git log ' +</div><div class='add'>+                                                  self.s_pattern)</div><div class='add'>+        status_tbr, op = commands.getstatusoutput('git log ' +</div><div class='add'>+                                                  self.t_pattern)</div><div class='add'>+        if status_sbr != 0:</div><div class='add'>+            print("Error: --source=" + self.s_pattern + " doesn't exit\n")</div><div class='add'>+            self.parser.print_help()</div><div class='add'>+            exit(status_sbr)</div><div class='add'>+        elif status_tbr != 0:</div><div class='add'>+            print("Error: --target=" + self.t_pattern + " doesn't exit\n")</div><div class='add'>+            self.parser.print_help()</div><div class='add'>+            exit(status_tbr)</div><div class='add'>+</div><div class='add'>+    def check_author_exist (self):</div><div class='add'>+        " defend to check given author exist, format in case of multiple"</div><div class='add'>+        contrib_list = ['', '*', 'all', 'All', 'ALL', 'null', 'Null', 'NULL']</div><div class='add'>+        if self.g_author in contrib_list:</div><div class='add'>+            self.g_author = ""</div><div class='add'>+        else:</div><div class='add'>+            ide_list = self.g_author.split(',')</div><div class='add'>+            for ide in ide_list:</div><div class='add'>+                cmd4 = 'git log ' + self.s_pattern + ' --author=' + ide</div><div class='add'>+                c_list = subprocess.check_output(cmd4, shell = True)</div><div class='add'>+                if len(c_list) is 0:</div><div class='add'>+                    print("Error: --author=%s doesn't exit" %self.g_author)</div><div class='add'>+                    print("see '%s --help'" %__file__)</div><div class='add'>+                    exit(1)</div><div class='add'>+            if len(ide_list) &gt; 1:</div><div class='add'>+                self.g_author = "\|".join(ide_list)</div><div class='add'>+</div><div class='add'>+    def connected_to_gerrit (self):</div><div class='add'>+        "check if gerrit server is reachable"</div><div class='add'>+        try:</div><div class='add'>+            r = requests.get(self.gerrit_server, timeout=3)</div><div class='add'>+            return True</div><div class='add'>+        except requests.Timeout as err:</div><div class='add'>+            " request timed out"</div><div class='add'>+            print("Warning: failed to get list of open review commits on " \</div><div class='add'>+                            "gerrit.\n" \</div><div class='add'>+                  "hint: Request timed out! gerrit server could possibly " \</div><div class='add'>+                  "slow ...\n")</div><div class='add'>+            return False</div><div class='add'>+        except requests.RequestException as err:</div><div class='add'>+            " handle other errors"</div><div class='add'>+            print("Warning: failed to get list of open review commits on " \</div><div class='add'>+                            "gerrit\n" \</div><div class='add'>+                  "hint: check with internet connection ...\n")</div><div class='add'>+            return False</div><div class='add'>+</div><div class='add'>+    def parse_cmd_args (self):</div><div class='add'>+        " command line parser"</div><div class='add'>+        author = subprocess.check_output('git config user.email',</div><div class='add'>+                                                  shell = True).rstrip('\n')</div><div class='add'>+        source = "remotes/origin/master"</div><div class='add'>+        options  = [' --pretty=format:"%h %s" ']</div><div class='add'>+        path = subprocess.check_output('git rev-parse --show-toplevel',</div><div class='add'>+                                            shell = True).rstrip('\n')</div><div class='add'>+        self.parser = argparse.ArgumentParser(description = 'git wrapper to '</div><div class='add'>+                                              'diff local or remote branches/'</div><div class='add'>+                                              'tags/commit-ranges')</div><div class='add'>+        self.parser.add_argument('-s',</div><div class='add'>+                                 '--source',</div><div class='add'>+                                 help = 'source pattern, it could be a branch,'</div><div class='add'>+                                        ' tag or a commit range',</div><div class='add'>+                                 default = source,</div><div class='add'>+                                 dest = 'source')</div><div class='add'>+        self.parser.add_argument('-t',</div><div class='add'>+                                 '--target',</div><div class='add'>+                                 help = 'target pattern, it could be a branch,'</div><div class='add'>+                                        ' tag or a commit range',</div><div class='add'>+                                 required = True,</div><div class='add'>+                                 dest = 'target')</div><div class='add'>+        self.parser.add_argument('-a',</div><div class='add'>+                                 '--author',</div><div class='add'>+                                 help = 'default: git config name/email, '</div><div class='add'>+                                        'to provide multiple specify comma'</div><div class='add'>+                                        ' separated values',</div><div class='add'>+                                 default = author,</div><div class='add'>+                                 dest = 'author')</div><div class='add'>+        self.parser.add_argument('-p',</div><div class='add'>+                                 '--path',</div><div class='add'>+                                 type = self.check_dir_exist,</div><div class='add'>+                                 help = 'show source and target diff w.r.t '</div><div class='add'>+                                        'given path, to provide multiple '</div><div class='add'>+                                        'specify space in between them',</div><div class='add'>+                                 default = path,</div><div class='add'>+                                 dest = 'path')</div><div class='add'>+        self.parser.add_argument('-o',</div><div class='add'>+                                 '--options',</div><div class='add'>+                                 help = 'add other git options such as '</div><div class='add'>+                                        '--after=&lt;&gt;, --before=&lt;&gt; etc. '</div><div class='add'>+                                        'experts use;',</div><div class='add'>+                                 default = options,</div><div class='add'>+                                 dest = 'options',</div><div class='add'>+                                 action='append')</div><div class='add'>+        self.argsdict = vars(self.parser.parse_args())</div><div class='add'>+</div><div class='add'>+    def print_output (self):</div><div class='add'>+        " display the result list"</div><div class='add'>+        print("\n------------------------------------------------------------\n")</div><div class='add'>+        print(self.tick + " Successfully Backported changes:")</div><div class='add'>+        print('      {' + 'from: ' + self.s_pattern + \</div><div class='add'>+              '  to: '+ self.t_pattern + '}\n')</div><div class='add'>+        for key, value in self.s_dict.items():</div><div class='add'>+            if value in self.t_dict.itervalues():</div><div class='add'>+                print("[%s%s%s] %s" %(self.yello_set,</div><div class='add'>+                                      key,</div><div class='add'>+                                      self.color_unset,</div><div class='add'>+                                      value))</div><div class='add'>+        print("\n------------------------------------------------------------\n")</div><div class='add'>+        print(self.cross + " Missing patches in " + self.t_pattern + ':\n')</div><div class='add'>+        if self.connected_to_gerrit():</div><div class='add'>+            cmd3 = "git review -r origin -l"</div><div class='add'>+            review_list = subprocess.check_output(cmd3, shell = True).split('\n')</div><div class='add'>+        else:</div><div class='add'>+            review_list = []</div><div class='add'>+</div><div class='add'>+        for key, value in self.s_dict.items():</div><div class='add'>+            if value not in self.t_dict.itervalues():</div><div class='add'>+                if any(value in s for s in review_list):</div><div class='add'>+                    print("[%s%s%s] %s %s(under review)%s" %(self.yello_set,</div><div class='add'>+                                                            key,</div><div class='add'>+                                                            self.color_unset,</div><div class='add'>+                                                            value,</div><div class='add'>+                                                            self.green_set,</div><div class='add'>+                                                            self.color_unset))</div><div class='add'>+                else:</div><div class='add'>+                    print("[%s%s%s] %s" %(self.yello_set,</div><div class='add'>+                                          key,</div><div class='add'>+                                          self.color_unset,</div><div class='add'>+                                          value))</div><div class='add'>+        print("\n------------------------------------------------------------\n")</div><div class='add'>+</div><div class='add'>+    def main (self):</div><div class='add'>+        self.check_pattern_exist()</div><div class='add'>+        self.check_author_exist()</div><div class='add'>+</div><div class='add'>+        " actual git commands"</div><div class='add'>+        cmd1 = 'git log' + self.options + ' ' + self.s_pattern + \</div><div class='add'>+               ' --author=\'' + self.g_author + '\' ' + self.r_path</div><div class='add'>+</div><div class='add'>+        " could be backported by anybody so --author doesn't apply here"</div><div class='add'>+        cmd2 = 'git log' + self.options + ' ' + self.t_pattern + \</div><div class='add'>+               ' ' + self.r_path</div><div class='add'>+</div><div class='add'>+        s_list = subprocess.check_output(cmd1, shell = True).split('\n')</div><div class='add'>+        t_list = subprocess.check_output(cmd2, shell = True)</div><div class='add'>+</div><div class='add'>+        if len(t_list) is 0:</div><div class='add'>+            print("No commits in the target: %s" %self.t_pattern)</div><div class='add'>+            print("see '%s --help'" %__file__)</div><div class='add'>+            exit()</div><div class='add'>+        else:</div><div class='add'>+            t_list = t_list.split('\n')</div><div class='add'>+</div><div class='add'>+        self.s_dict = dict()</div><div class='add'>+        self.t_dict = dict()</div><div class='add'>+</div><div class='add'>+        for item in s_list:</div><div class='add'>+            self.s_dict.update(dict([item.split(' ', 1)]))</div><div class='add'>+        for item in t_list:</div><div class='add'>+            self.t_dict.update(dict([item.split(' ', 1)]))</div><div class='add'>+</div><div class='add'>+        self.print_output()</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+if __name__ == '__main__':</div><div class='add'>+    run = GitBranchDiff()</div><div class='add'>+    run.main()</div><div class='head'>diff --git a/extras/gluster-rsyslog-5.8.conf b/extras/gluster-rsyslog-5.8.conf<br/>new file mode 100644<br/>index 00000000000..2519999bcac<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/extras/gluster-rsyslog-5.8.conf?id=d1d7a6f35c816822fab51c820e25023863c239c1'>extras/gluster-rsyslog-5.8.conf</a></div><div class='hunk'>@@ -0,0 +1,51 @@</div><div class='add'>+##### gluster.conf #####</div><div class='add'>+</div><div class='add'>+#</div><div class='add'>+## If you want to log every message to the log file instead of</div><div class='add'>+## intelligently suppressing repeated messages, set off to</div><div class='add'>+## RepeatedMsgReduction.  This change requires rsyslog restart</div><div class='add'>+## (eg. run 'service rsyslog restart')</div><div class='add'>+#</div><div class='add'>+#$RepeatedMsgReduction off</div><div class='add'>+$RepeatedMsgReduction on</div><div class='add'>+</div><div class='add'>+#</div><div class='add'>+## The mmcount module provides the capability to count log messages by </div><div class='add'>+## severity or json property of given app-name.  The count value is added</div><div class='add'>+## into the log message as json property named '$msgid'</div><div class='add'>+#</div><div class='add'>+$ModLoad mmcount</div><div class='add'>+$mmcountKey gf_code # start counting value of gf_code</div><div class='add'>+</div><div class='add'>+$template Glusterfsd_dynLogFile,"/var/log/glusterfs/bricks/%app-name%.log"</div><div class='add'>+$template Gluster_dynLogFile,"/var/log/glusterfs/%app-name%.log"</div><div class='add'>+</div><div class='add'>+$template GLFS_Template,"%msgid%/%syslogfacility-text:::uppercase%/%syslogseverity-text:::uppercase% [%TIMESTAMP:::date-rfc3339%] %msg:::sp-if-no-1st-sp%%msg:::drop-last-lf%\n"</div><div class='add'>+</div><div class='add'>+#</div><div class='add'>+## Pass logs to mmcount if app-name is 'gluster'</div><div class='add'>+#</div><div class='add'>+if $app-name contains 'gluster' then :mmcount:</div><div class='add'>+</div><div class='add'>+if $app-name contains 'glusterfsd' then ?Glusterfsd_dynLogFile;GLFS_Template</div><div class='add'>+if $app-name contains 'gluster' and not ( $app-name contains 'glusterfsd' ) then ?Gluster_dynLogFile;GLFS_Template</div><div class='add'>+</div><div class='add'>+#</div><div class='add'>+## Sample configuration to send a email alert for every 50th mmcount</div><div class='add'>+#</div><div class='add'>+#$ModLoad ommail</div><div class='add'>+#$ActionMailSMTPServer smtp.example.com</div><div class='add'>+#$ActionMailFrom rsyslog@example.com</div><div class='add'>+#$ActionMailTo glusteradmin@example.com</div><div class='add'>+#$template mailSubject,"50th message of gf_code=9999 on %hostname%"</div><div class='add'>+#$template mailBody,"RSYSLOG Alert\r\nmsg='%msg%'"</div><div class='add'>+#$ActionMailSubject mailSubject</div><div class='add'>+#$ActionExecOnlyOnceEveryInterval 30</div><div class='add'>+#if $app-name == 'glusterfsd' and $msgid != 0 and $msgid % 50 == 0 \</div><div class='add'>+#then :ommail:;RSYSLOG_SyslogProtocol23Format</div><div class='add'>+#</div><div class='add'>+</div><div class='add'>+#</div><div class='add'>+## discard logs where app-name is 'gluster' as we processed already</div><div class='add'>+#</div><div class='add'>+if $app-name contains 'gluster' then ~</div><div class='head'>diff --git a/extras/gluster-rsyslog-7.2.conf b/extras/gluster-rsyslog-7.2.conf<br/>new file mode 100644<br/>index 00000000000..8b2841543f4<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/extras/gluster-rsyslog-7.2.conf?id=d1d7a6f35c816822fab51c820e25023863c239c1'>extras/gluster-rsyslog-7.2.conf</a></div><div class='hunk'>@@ -0,0 +1,76 @@</div><div class='add'>+##### gluster.conf #####</div><div class='add'>+#</div><div class='add'>+## If you want to log every message to the log file instead of</div><div class='add'>+## intelligently suppressing repeated messages, set off to</div><div class='add'>+## RepeatedMsgReduction.  This change requires rsyslog restart</div><div class='add'>+## (eg. run 'service rsyslog restart')</div><div class='add'>+#</div><div class='add'>+#$RepeatedMsgReduction off</div><div class='add'>+$RepeatedMsgReduction on</div><div class='add'>+</div><div class='add'>+$ModLoad mmjsonparse</div><div class='add'>+*.* :mmjsonparse:</div><div class='add'>+</div><div class='add'>+#</div><div class='add'>+## The mmcount module provides the capability to count log messages by </div><div class='add'>+## severity or json property of given app-name.  The count value is added</div><div class='add'>+## into the log message as json property named 'mmcount'</div><div class='add'>+##</div><div class='add'>+## More info at http://www.rsyslog.com/doc/mmcount.html</div><div class='add'>+#</div><div class='add'>+#module(load="mmcount")</div><div class='add'>+#action(type="mmcount" appname="glusterd" key="!gf_code") # count each value of gf_code of appname glusterd</div><div class='add'>+#action(type="mmcount" appname="glusterfsd" key="!gf_code") # count each value of gf_code of appname glusterfsd</div><div class='add'>+#action(type="mmcount" appname="glusterfs" key="!gf_code") # count each value of gf_code of appname glusterfs</div><div class='add'>+</div><div class='add'>+template (name="Glusterfsd_dynLogFile" type="string" string="/var/log/glusterfs/bricks/%app-name%.log")</div><div class='add'>+template (name="Gluster_dynLogFile" type="string" string="/var/log/glusterfs/%app-name%.log")</div><div class='add'>+</div><div class='add'>+template(name="GLFS_template" type="list") {</div><div class='add'>+   property(name="$!mmcount")</div><div class='add'>+   constant(value="/")</div><div class='add'>+   property(name="syslogfacility-text" caseConversion="upper")</div><div class='add'>+   constant(value="/")</div><div class='add'>+   property(name="syslogseverity-text" caseConversion="upper")</div><div class='add'>+   constant(value=" ")</div><div class='add'>+   constant(value="[")</div><div class='add'>+   property(name="timereported" dateFormat="rfc3339")</div><div class='add'>+   constant(value="] ")</div><div class='add'>+   constant(value="[")</div><div class='add'>+   property(name="$!gf_code")</div><div class='add'>+   constant(value="] ")</div><div class='add'>+   constant(value="[")</div><div class='add'>+   property(name="$!gf_message")</div><div class='add'>+   constant(value="] ")</div><div class='add'>+   property(name="$!msg")</div><div class='add'>+   constant(value="\n")</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+if $app-name contains 'glusterfsd' then {</div><div class='add'>+   action(type="omfile"</div><div class='add'>+          DynaFile="Glusterfsd_dynLogFile"</div><div class='add'>+          Template="GLFS_template")</div><div class='add'>+   stop</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+if $app-name contains 'gluster' then {</div><div class='add'>+   action(type="omfile"</div><div class='add'>+          DynaFile="Gluster_dynLogFile"</div><div class='add'>+          Template="GLFS_template")</div><div class='add'>+   stop</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#</div><div class='add'>+## send email for every 50th mmcount</div><div class='add'>+#$ModLoad ommail</div><div class='add'>+#if $app-name == 'glusterfsd' and $!mmcount &lt;&gt; 0 and $!mmcount % 50 == 0 then {</div><div class='add'>+#   $ActionMailSMTPServer smtp.example.com</div><div class='add'>+#   $ActionMailFrom rsyslog@example.com</div><div class='add'>+#   $ActionMailTo glusteradmin@example.com</div><div class='add'>+#   $template mailSubject,"50th message of gf_code=9999 on %hostname%"</div><div class='add'>+#   $template mailBody,"RSYSLOG Alert\r\nmsg='%msg%'"</div><div class='add'>+#   $ActionMailSubject mailSubject</div><div class='add'>+#   $ActionExecOnlyOnceEveryInterval 30</div><div class='add'>+#   :ommail:;RSYSLOG_SyslogProtocol23Format</div><div class='add'>+#}</div><div class='add'>+#</div><div class='head'>diff --git a/extras/glusterd-sysconfig b/extras/glusterd-sysconfig<br/>new file mode 100644<br/>index 00000000000..8237c571104<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/extras/glusterd-sysconfig?id=d1d7a6f35c816822fab51c820e25023863c239c1'>extras/glusterd-sysconfig</a></div><div class='hunk'>@@ -0,0 +1,6 @@</div><div class='add'>+## Set custom log file and log level (bellow are defaults)</div><div class='add'>+# LOG_FILE='/var/log/glusterfs/glusterd.log'</div><div class='add'>+# LOG_LEVEL='INFO'</div><div class='add'>+</div><div class='add'>+## Set custom options for glusterd</div><div class='add'>+# GLUSTERD_OPTIONS=''</div><div class='head'>diff --git a/extras/glusterd.vol.in b/extras/glusterd.vol.in<br/>new file mode 100644<br/>index 00000000000..5d7bad0e4c8<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/extras/glusterd.vol.in?id=d1d7a6f35c816822fab51c820e25023863c239c1'>extras/glusterd.vol.in</a></div><div class='hunk'>@@ -0,0 +1,15 @@</div><div class='add'>+volume management</div><div class='add'>+    type mgmt/glusterd</div><div class='add'>+    option working-directory @GLUSTERD_WORKDIR@</div><div class='add'>+    option transport-type socket</div><div class='add'>+    option transport.socket.keepalive-time 10</div><div class='add'>+    option transport.socket.keepalive-interval 2</div><div class='add'>+    option transport.socket.read-fail-log off</div><div class='add'>+    option transport.socket.listen-port 24007</div><div class='add'>+    option ping-timeout 0</div><div class='add'>+    option event-threads 1</div><div class='add'>+#   option lock-timer 180</div><div class='add'>+#   option transport.address-family inet6</div><div class='add'>+#   option base-port 49152</div><div class='add'>+    option max-port  60999</div><div class='add'>+end-volume</div><div class='head'>diff --git a/extras/glusterfs-defrag.in b/extras/glusterfs-defrag.in<br/>deleted file mode 100644<br/>index 68a393f1c3a..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/extras/glusterfs-defrag.in?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/glusterfs-defrag.in</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,123 +0,0 @@</div><div class='del'>-#!/bin/bash</div><div class='del'>-</div><div class='del'>-# Please leave 'added_bricks' as empty if you want 100% defrag.</div><div class='del'>-# If you want to move data to newly added bricks, properly give</div><div class='del'>-# brick info as "&lt;hostname&gt;:&lt;export-dir&gt;" form (which was given</div><div class='del'>-# in 'gluster volume create' command)</div><div class='del'>-# More than one brick can be given with space inbetween.</div><div class='del'>-</div><div class='del'>-#</div><div class='del'>-# (c) 2010 Gluster Inc &lt;http://www.gluster.com/&gt;</div><div class='del'>-#</div><div class='del'>-</div><div class='del'>-set -e;</div><div class='del'>-</div><div class='del'>-#</div><div class='del'>-#added_bricks="node1:/gfs/export1"</div><div class='del'>-#</div><div class='del'>-added_bricks=""</div><div class='del'>-</div><div class='del'>-CP="cp"</div><div class='del'>-MV="mv"</div><div class='del'>-</div><div class='del'>-scan_dir()</div><div class='del'>-{</div><div class='del'>-    path=$1;</div><div class='del'>-    # run defrag on files first #</div><div class='del'>-    find "$path" -maxdepth 1 -type f -perm +01000 -exec $0 '{}' \;</div><div class='del'>-</div><div class='del'>-    for subdir in $(find "$path" -maxdepth 1 -type d | sed 1d); do</div><div class='del'>-        $0 "$subdir";</div><div class='del'>-    done</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-fix_xattr()</div><div class='del'>-{</div><div class='del'>-    path=$1;</div><div class='del'>-    getfattr -n trusted.distribute.fix.layout "$path" 2&gt;/dev/null;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-rsync_filename()</div><div class='del'>-{</div><div class='del'>-    path=$1</div><div class='del'>-    dir=$(dirname "$path");</div><div class='del'>-    file=$(basename "$path");</div><div class='del'>-</div><div class='del'>-    echo "$dir/.$file.zr$$";</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-relocate_file()</div><div class='del'>-{</div><div class='del'>-    path=$1;</div><div class='del'>-</div><div class='del'>-    # Make sure we don't 'defrag' valid file.</div><div class='del'>-    stat_info=$(stat -c '%a' "$path");</div><div class='del'>-    if [ $stat_info -lt 1000 ] ; then</div><div class='del'>-        return;</div><div class='del'>-    fi</div><div class='del'>-</div><div class='del'>-    size=$(stat -c '%s' "$path");</div><div class='del'>-</div><div class='del'>-    # If there are some entries in added_bricks, then check</div><div class='del'>-    # if the link file is present on those nodes, if not,</div><div class='del'>-    # set flag=1, so full defrag happens</div><div class='del'>-</div><div class='del'>-    flag=0;</div><div class='del'>-    for bricks in ${added_bricks}; do</div><div class='del'>-        linknode=$(getfattr --only-values -n trusted.distribute.linkinfo $path 2&gt;/dev/null);</div><div class='del'>-        if [ -z $linknode ] ; then</div><div class='del'>-            return;</div><div class='del'>-        fi</div><div class='del'>-        current_brick=${linknode:0:${#bricks}};</div><div class='del'>-        if [ "${bricks}" == "${current_brick}" ]; then</div><div class='del'>-            flag=1;</div><div class='del'>-        fi</div><div class='del'>-    done</div><div class='del'>-</div><div class='del'>-    if [ -z ${added_bricks} ] ; then</div><div class='del'>-        flag=1;</div><div class='del'>-    fi</div><div class='del'>-</div><div class='del'>-    if [ $flag -ne 1 ]; then</div><div class='del'>-        return;</div><div class='del'>-    fi</div><div class='del'>-</div><div class='del'>-    tmp_path=$(rsync_filename "$path");</div><div class='del'>-</div><div class='del'>-    pre_mtime=$(stat -c '%Y' "$path");</div><div class='del'>-    $CP -a "$path" "$tmp_path";</div><div class='del'>-    post_mtime=$(stat -c '%Y' "$path");</div><div class='del'>-</div><div class='del'>-    if [ $pre_mtime = $post_mtime ]; then</div><div class='del'>-	chmod -t "$tmp_path";</div><div class='del'>-	$MV "$tmp_path" "$path";</div><div class='del'>-	echo "file '$path' relocated"</div><div class='del'>-    else</div><div class='del'>-	echo "file '$path' modified during defrag. skipping"</div><div class='del'>-	rm -f "$tmp_path";</div><div class='del'>-    fi</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-defrag_usage()</div><div class='del'>-{</div><div class='del'>-    echo "Usage: $0 &lt;directory&gt;"</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-main()</div><div class='del'>-{</div><div class='del'>-    path="$1";</div><div class='del'>-</div><div class='del'>-    if [ -z "$path" ]; then</div><div class='del'>-        defrag_usage;</div><div class='del'>-        return;</div><div class='del'>-    fi</div><div class='del'>-</div><div class='del'>-    if [ -d "$path" ]; then</div><div class='del'>-        fix_xattr "$path";</div><div class='del'>-	scan_dir "$path";</div><div class='del'>-    else</div><div class='del'>-	relocate_file "$@";</div><div class='del'>-    fi</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-main "$1"</div><div class='head'>diff --git a/extras/glusterfs-georep-logrotate b/extras/glusterfs-georep-logrotate<br/>new file mode 100644<br/>index 00000000000..3e7ecf373a1<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/extras/glusterfs-georep-logrotate?id=d1d7a6f35c816822fab51c820e25023863c239c1'>extras/glusterfs-georep-logrotate</a></div><div class='hunk'>@@ -0,0 +1,61 @@</div><div class='add'>+/var/log/glusterfs/geo-replication/*/*.log {</div><div class='add'>+    sharedscripts</div><div class='add'>+    weekly</div><div class='add'>+    maxsize 10M</div><div class='add'>+    minsize 100k</div><div class='add'>+</div><div class='add'>+    # 6 months of logs are good enough</div><div class='add'>+    rotate 26</div><div class='add'>+</div><div class='add'>+    missingok</div><div class='add'>+    compress</div><div class='add'>+    delaycompress</div><div class='add'>+    notifempty</div><div class='add'>+    postrotate</div><div class='add'>+    for pid in `ps -aef | grep glusterfs | egrep "\-\-aux-gfid-mount" | awk '{print $2}'`; do</div><div class='add'>+        /usr/bin/kill -HUP $pid &gt; /dev/null 2&gt;&amp;1 || true</div><div class='add'>+    done</div><div class='add'>+     endscript</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+/var/log/glusterfs/geo-replication-slaves/*.log {</div><div class='add'>+    sharedscripts</div><div class='add'>+    weekly</div><div class='add'>+    maxsize 10M</div><div class='add'>+    minsize 100k</div><div class='add'>+</div><div class='add'>+    # 6 months of logs are good enough</div><div class='add'>+    rotate 26</div><div class='add'>+</div><div class='add'>+    missingok</div><div class='add'>+    compress</div><div class='add'>+    delaycompress</div><div class='add'>+    notifempty</div><div class='add'>+    postrotate</div><div class='add'>+    for pid in `ps -aef | grep glusterfs | egrep "\-\-aux-gfid-mount" | awk '{print $2}'`; do</div><div class='add'>+        /usr/bin/kill -HUP $pid &gt; /dev/null 2&gt;&amp;1 || true</div><div class='add'>+    done</div><div class='add'>+    endscript</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+/var/log/glusterfs/geo-replication-slaves/*/*.log {</div><div class='add'>+    sharedscripts</div><div class='add'>+    weekly</div><div class='add'>+    maxsize 10M</div><div class='add'>+    minsize 100k</div><div class='add'>+</div><div class='add'>+    # 6 months of logs are good enough</div><div class='add'>+    rotate 26</div><div class='add'>+</div><div class='add'>+    missingok</div><div class='add'>+    compress</div><div class='add'>+    delaycompress</div><div class='add'>+    notifempty</div><div class='add'>+    postrotate</div><div class='add'>+    for pid in `ps -aef | grep glusterfs | egrep "\-\-aux-gfid-mount" | awk '{print $2}'`; do</div><div class='add'>+        /usr/bin/kill -HUP $pid &gt; /dev/null 2&gt;&amp;1 || true</div><div class='add'>+    done</div><div class='add'>+    endscript</div><div class='add'>+}</div><div class='head'>diff --git a/extras/glusterfs-georep-upgrade.py b/extras/glusterfs-georep-upgrade.py<br/>new file mode 100755<br/>index 00000000000..634576058d6<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/extras/glusterfs-georep-upgrade.py?id=d1d7a6f35c816822fab51c820e25023863c239c1'>extras/glusterfs-georep-upgrade.py</a></div><div class='hunk'>@@ -0,0 +1,77 @@</div><div class='add'>+#!/usr/bin/python3</div><div class='add'>+"""</div><div class='add'>+</div><div class='add'>+Copyright (c) 2020 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+cases as published by the Free Software Foundation.</div><div class='add'>+</div><div class='add'>+"""</div><div class='add'>+</div><div class='add'>+import argparse</div><div class='add'>+import errno</div><div class='add'>+import os, sys</div><div class='add'>+import shutil</div><div class='add'>+from datetime import datetime</div><div class='add'>+</div><div class='add'>+def find_htime_path(brick_path):</div><div class='add'>+    dirs = []</div><div class='add'>+    htime_dir = os.path.join(brick_path, '.glusterfs/changelogs/htime')</div><div class='add'>+    for file in os.listdir(htime_dir):</div><div class='add'>+        if os.path.isfile(os.path.join(htime_dir,file)) and file.startswith("HTIME"):</div><div class='add'>+            dirs.append(os.path.join(htime_dir, file))</div><div class='add'>+        else:</div><div class='add'>+            raise FileNotFoundError("%s unavailable" % (os.path.join(htime_dir, file)))</div><div class='add'>+    return dirs</div><div class='add'>+</div><div class='add'>+def modify_htime_file(brick_path):</div><div class='add'>+    htime_file_path_list = find_htime_path(brick_path)</div><div class='add'>+</div><div class='add'>+    for htime_file_path in htime_file_path_list:</div><div class='add'>+        changelog_path = os.path.join(brick_path, '.glusterfs/changelogs')</div><div class='add'>+        temp_htime_path = os.path.join(changelog_path, 'htime/temp_htime_file')</div><div class='add'>+        with open(htime_file_path, 'r') as htime_file, open(temp_htime_path, 'w') as temp_htime_file:</div><div class='add'>+            #extract epoch times from htime file</div><div class='add'>+            paths = htime_file.read().split("\x00")</div><div class='add'>+</div><div class='add'>+            for pth in paths:</div><div class='add'>+                epoch_no = pth.split(".")[-1]</div><div class='add'>+                changelog = os.path.basename(pth)</div><div class='add'>+                #convert epoch time to year, month and day</div><div class='add'>+                if epoch_no != '':</div><div class='add'>+                    date=(datetime.fromtimestamp(float(int(epoch_no))).strftime("%Y/%m/%d"))</div><div class='add'>+                    #update paths in temp htime file</div><div class='add'>+                    temp_htime_file.write("%s/%s/%s\x00" % (changelog_path, date, changelog))</div><div class='add'>+                    #create directory in the format year/month/days</div><div class='add'>+                    path = os.path.join(changelog_path, date)</div><div class='add'>+</div><div class='add'>+                if changelog.startswith("CHANGELOG."):</div><div class='add'>+                    try:</div><div class='add'>+                        os.makedirs(path, mode = 0o600);</div><div class='add'>+                    except OSError as exc:</div><div class='add'>+                        if exc.errno == errno.EEXIST:</div><div class='add'>+                            pass</div><div class='add'>+                        else:</div><div class='add'>+                            raise</div><div class='add'>+</div><div class='add'>+                    #copy existing changelogs to new directory structure, delete old changelog files</div><div class='add'>+                    shutil.copyfile(pth, os.path.join(path, changelog))</div><div class='add'>+                    os.remove(pth)</div><div class='add'>+</div><div class='add'>+        #rename temp_htime_file with htime file</div><div class='add'>+        os.rename(htime_file_path, os.path.join('%s.bak'%htime_file_path))</div><div class='add'>+        os.rename(temp_htime_path, htime_file_path)</div><div class='add'>+</div><div class='add'>+if __name__ == "__main__":</div><div class='add'>+    parser = argparse.ArgumentParser()</div><div class='add'>+    parser.add_argument('brick_path', help="This upgrade script, which is to be run on\</div><div class='add'>+                         server side, takes brick path as the argument, \</div><div class='add'>+                         updates paths inside htime file and alters the directory structure \</div><div class='add'>+                         above the changelog files inorder to support new optimised format \</div><div class='add'>+                         of the directory structure as per \</div><div class='add'>+                         https://review.gluster.org/#/c/glusterfs/+/23733/")</div><div class='add'>+    args = parser.parse_args()</div><div class='add'>+    modify_htime_file(args.brick_path)</div><div class='head'>diff --git a/extras/glusterfs-logrotate b/extras/glusterfs-logrotate<br/>new file mode 100644<br/>index 00000000000..6ba6ef18e9f<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/extras/glusterfs-logrotate?id=d1d7a6f35c816822fab51c820e25023863c239c1'>extras/glusterfs-logrotate</a></div><div class='hunk'>@@ -0,0 +1,68 @@</div><div class='add'>+# Rotate client logs</div><div class='add'>+/var/log/glusterfs/*.log {</div><div class='add'>+  sharedscripts</div><div class='add'>+  weekly</div><div class='add'>+  maxsize 10M</div><div class='add'>+  minsize 100k</div><div class='add'>+</div><div class='add'>+# 6 months of logs are good enough</div><div class='add'>+  rotate 26</div><div class='add'>+</div><div class='add'>+  missingok</div><div class='add'>+  compress</div><div class='add'>+  delaycompress</div><div class='add'>+  notifempty</div><div class='add'>+  postrotate</div><div class='add'>+  /usr/bin/killall -HUP glusterfs &gt; /dev/null 2&gt;&amp;1 || true</div><div class='add'>+  /usr/bin/killall -HUP glusterd &gt; /dev/null 2&gt;&amp;1 || true</div><div class='add'>+  endscript</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+# Rotate server logs</div><div class='add'>+/var/log/glusterfs/bricks/*.log {</div><div class='add'>+  sharedscripts</div><div class='add'>+  weekly</div><div class='add'>+  maxsize 10M</div><div class='add'>+  minsize 100k</div><div class='add'>+</div><div class='add'>+# 6 months of logs are good enough</div><div class='add'>+  rotate 26</div><div class='add'>+</div><div class='add'>+  missingok</div><div class='add'>+  compress</div><div class='add'>+  delaycompress</div><div class='add'>+  notifempty</div><div class='add'>+  postrotate</div><div class='add'>+  /usr/bin/killall -HUP glusterfsd &gt; /dev/null 2&gt;&amp;1 || true</div><div class='add'>+  endscript</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/var/log/glusterfs/samples/*.samp {</div><div class='add'>+  daily</div><div class='add'>+  rotate 3</div><div class='add'>+  sharedscripts</div><div class='add'>+  missingok</div><div class='add'>+  compress</div><div class='add'>+  delaycompress</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+# Rotate snapd log</div><div class='add'>+/var/log/glusterfs/snaps/*/*.log {</div><div class='add'>+    sharedscripts</div><div class='add'>+    weekly</div><div class='add'>+    maxsize 10M</div><div class='add'>+    minsize 100k</div><div class='add'>+</div><div class='add'>+    # 6 months of logs are good enough</div><div class='add'>+    rotate 26</div><div class='add'>+</div><div class='add'>+    missingok</div><div class='add'>+    compress</div><div class='add'>+    delaycompress</div><div class='add'>+    notifempty</div><div class='add'>+    postrotate</div><div class='add'>+    for pid in `ps -aef | grep glusterfs | egrep "snapd" | awk '{print $2}'`; do</div><div class='add'>+        /usr/bin/kill -HUP $pid &gt; /dev/null 2&gt;&amp;1 || true</div><div class='add'>+    done</div><div class='add'>+    endscript</div><div class='add'>+}</div><div class='head'>diff --git a/extras/glusterfs-mode.el b/extras/glusterfs-mode.el<br/>index 2f4b40c4e01..a9ed2335ab3 100644<br/>--- a/<a href='/cgit/glusterfs.git/tree/extras/glusterfs-mode.el?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/glusterfs-mode.el</a><br/>+++ b/<a href='/cgit/glusterfs.git/tree/extras/glusterfs-mode.el?id=d1d7a6f35c816822fab51c820e25023863c239c1'>extras/glusterfs-mode.el</a></div><div class='hunk'>@@ -1,112 +1,113 @@</div><div class='del'>-;;; Copyright (C) 2007-2009 Gluster Inc. &lt;http://www.gluster.com&gt;</div><div class='del'>-;;;  </div><div class='del'>-;;; This program is free software; you can redistribute it and/or modify</div><div class='del'>-;;; it under the terms of the GNU General Public License as published by</div><div class='del'>-;;; the Free Software Foundation; either version 2 of the License, or</div><div class='del'>-;;; (at your option) any later version.</div><div class='del'>-;;;  </div><div class='del'>-;;; This program is distributed in the hope that it will be useful,</div><div class='del'>-;;; but WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the</div><div class='del'>-;;; GNU General Public License for more details.</div><div class='del'>-;;;  </div><div class='del'>-;;; You should have received a copy of the GNU General Public License</div><div class='del'>-;;; along with this program; if not, write to the Free Software</div><div class='del'>-;;; Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.</div><div class='del'>-;;;  </div><div class='del'>-</div><div class='del'>-(defvar glusterfs-mode-hook nil)</div><div class='del'>-</div><div class='del'>-;; (defvar glusterfs-mode-map</div><div class='del'>-;;   (let ((glusterfs-mode-map (make-keymap)))</div><div class='del'>-;;     (define-key glusterfs-mode-map "\C-j" 'newline-and-indent)</div><div class='del'>-;;     glusterfs-mode-map)</div><div class='del'>-;;   "Keymap for WPDL major mode")</div><div class='del'>-</div><div class='del'>-(add-to-list 'auto-mode-alist '("\\.vol\\'" . glusterfs-mode))</div><div class='del'>-</div><div class='del'>-(defconst glusterfs-font-lock-keywords-1</div><div class='del'>-  (list</div><div class='del'>-					; "cluster/{unify,afr,stripe}" </div><div class='del'>-					; "performance/{io-cache,io-threads,write-behind,read-ahead,stat-prefetch}"</div><div class='del'>-					; "protocol/{client/server}"</div><div class='del'>-					; "features/{trash,posix-locks,fixed-id,filter}"</div><div class='del'>-					; "stroage/posix"</div><div class='del'>-					; "encryption/rot-13"</div><div class='del'>-					; "debug/trace"</div><div class='del'>-    '("\\&lt;\\(cluster/\\(unify\\|afr\\|replicate\\|stripe\\|ha\\|dht\\|distribute\\)\\|\\performance/\\(io-\\(cache\\|threads\\)\\|write-behind\\|read-ahead\\|symlink-cache\\)\\|protocol/\\(server\\|client\\)\\|features/\\(trash\\|posix-locks\\|locks\\|path-converter\\|filter\\)\\|storage/\\(posix\\|bdb\\)\\|encryption/rot-13\\|debug/trace\\)\\&gt;" . font-lock-keyword-face))</div><div class='del'>-"Additional Keywords to highlight in GlusterFS mode.")</div><div class='del'>-</div><div class='del'>-(defconst glusterfs-font-lock-keywords-2</div><div class='del'>-  (append glusterfs-font-lock-keywords-1</div><div class='del'>-	  (list</div><div class='del'>-      ; "replicate" "namespace" "scheduler" "remote-subvolume" "remote-host" </div><div class='del'>-      ; "auth.addr" "block-size" "remote-port" "listen-port" "transport-type"</div><div class='del'>-      ; "limits.min-free-disk" "directory"</div><div class='del'>-	; TODO: add all the keys here.</div><div class='del'>-	   '("\\&lt;\\(inode-lru-limit\\|replicate\\|namespace\\|scheduler\\|username\\|password\\|allow\\|reject\\|block-size\\|listen-port\\|transport-type\\|transport-timeout\\|directory\\|page-size\\|page-count\\|aggregate-size\\|non-blocking-io\\|client-volume-filename\\|bind-address\\|self-heal\\|read-only-subvolumes\\|read-subvolume\\|thread-count\\|cache-size\\|window-size\\|force-revalidate-timeout\\|priority\\|include\\|exclude\\|remote-\\(host\\|subvolume\\|port\\)\\|auth.\\(addr\\|login\\)\\|limits.\\(min-disk-free\\|transaction-size\\|ib-verbs-\\(work-request-\\(send-\\|recv-\\(count\\|size\\)\\)\\|port\\|mtu\\|device-name\\)\\)\\)\ \\&gt;" . font-lock-constant-face)))</div><div class='del'>-  "option keys in GlusterFS mode.")</div><div class='del'>-</div><div class='del'>-(defconst glusterfs-font-lock-keywords-3</div><div class='del'>-  (append glusterfs-font-lock-keywords-2</div><div class='del'>-	  (list</div><div class='del'>-					; "option" "volume" "end-volume" "subvolumes" "type"</div><div class='del'>-	   '("\\&lt;\\(option\ \\|volume\ \\|subvolumes\ \\|type\ \\|end-volume\\)\\&gt;" . font-lock-builtin-face)))</div><div class='del'>-					;'((regexp-opt (" option " "^volume " "^end-volume" "subvolumes " " type ") t) . font-lock-builtin-face))</div><div class='del'>-  "Minimal highlighting expressions for GlusterFS mode.")</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-(defvar glusterfs-font-lock-keywords glusterfs-font-lock-keywords-3</div><div class='del'>-  "Default highlighting expressions for GlusterFS mode.")</div><div class='del'>-</div><div class='del'>-(defvar glusterfs-mode-syntax-table</div><div class='del'>-  (let ((glusterfs-mode-syntax-table (make-syntax-table)))</div><div class='del'>-    (modify-syntax-entry ?\# "&lt;"  glusterfs-mode-syntax-table)</div><div class='del'>-    (modify-syntax-entry ?* ". 23"  glusterfs-mode-syntax-table)</div><div class='del'>-    (modify-syntax-entry ?\n "&gt;#"  glusterfs-mode-syntax-table)</div><div class='del'>-    glusterfs-mode-syntax-table)</div><div class='del'>-  "Syntax table for glusterfs-mode")</div><div class='del'>-</div><div class='del'>-;; TODO: add an indentation table</div><div class='del'>-</div><div class='del'>-(defun glusterfs-indent-line ()</div><div class='del'>-  "Indent current line as GlusterFS code"</div><div class='del'>-  (interactive)</div><div class='del'>-  (beginning-of-line)</div><div class='del'>-  (if (bobp)</div><div class='del'>-      (indent-line-to 0)   ; First line is always non-indented</div><div class='del'>-    (let ((not-indented t) cur-indent)</div><div class='del'>-      (if (looking-at "^[ \t]*volume\ ")</div><div class='del'>-	  (progn</div><div class='del'>-	    (save-excursion</div><div class='del'>-	      (forward-line -1)</div><div class='del'>-	      (setq not-indented nil)</div><div class='del'>-	      (setq cur-indent 0))))</div><div class='del'>-      (if (looking-at "^[ \t]*end-volume")</div><div class='del'>-	  (progn</div><div class='del'>-	    (save-excursion</div><div class='del'>-	      (forward-line -1)</div><div class='del'>-	      (setq cur-indent 0))</div><div class='del'>-	    (if (&lt; cur-indent 0) ; We can't indent past the left margin</div><div class='del'>-		(setq cur-indent 0)))</div><div class='del'>-	(save-excursion</div><div class='del'>-	  (while not-indented ; Iterate backwards until we find an indentation hint</div><div class='del'>-	    (progn</div><div class='del'>-	      (setq cur-indent 2) ; Do the actual indenting</div><div class='del'>-	      (setq not-indented nil)))))</div><div class='del'>-      (if cur-indent</div><div class='del'>-	  (indent-line-to cur-indent)</div><div class='del'>-	(indent-line-to 0)))))</div><div class='del'>-</div><div class='del'>-(defun glusterfs-mode ()</div><div class='del'>-  (interactive)</div><div class='del'>-  (kill-all-local-variables)</div><div class='del'>-  ;; (use-local-map glusterfs-mode-map)</div><div class='del'>-  (set-syntax-table glusterfs-mode-syntax-table)</div><div class='del'>-  (set (make-local-variable 'indent-line-function) 'glusterfs-indent-line)  </div><div class='del'>-  (set (make-local-variable 'font-lock-defaults) '(glusterfs-font-lock-keywords))</div><div class='del'>-  (setq major-mode 'glusterfs-mode)</div><div class='del'>-  (setq mode-name "GlusterFS")</div><div class='del'>-  (run-hooks 'glusterfs-mode-hook))</div><div class='del'>-</div><div class='del'>-(provide 'glusterfs-mode)</div><div class='add'>+;;; Copyright (C) 2007-2017 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+;;; Copyright (C) 2007-2011 Gluster Inc. &lt;http://www.gluster.com&gt;</div><div class='add'>+;;;</div><div class='add'>+;;; This program is free software; you can redistribute it and/or</div><div class='add'>+;;; modify it under the terms of the GNU General Public License</div><div class='add'>+;;; as published by the Free Software Foundation; either version 2</div><div class='add'>+;;; of the License, or (at your option) any later version.</div><div class='add'>+;;;</div><div class='add'>+;;; This program is distributed in the hope that it will be useful,</div><div class='add'>+;;; but WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='add'>+;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the</div><div class='add'>+;;; GNU General Public License for more details.</div><div class='add'>+;;;</div><div class='add'>+;;; You should have received a copy of the GNU General Public License</div><div class='add'>+;;; along with this program; if not, write to the Free Software</div><div class='add'>+;;; Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.</div><div class='add'>+;;;</div><div class='add'>+</div><div class='add'>+(defvar glusterfs-mode-hook nil)</div><div class='add'>+</div><div class='add'>+;; (defvar glusterfs-mode-map</div><div class='add'>+;;   (let ((glusterfs-mode-map (make-keymap)))</div><div class='add'>+;;     (define-key glusterfs-mode-map "\C-j" 'newline-and-indent)</div><div class='add'>+;;     glusterfs-mode-map)</div><div class='add'>+;;   "Keymap for WPDL major mode")</div><div class='add'>+</div><div class='add'>+(add-to-list 'auto-mode-alist '("\\.vol\\'" . glusterfs-mode))</div><div class='add'>+</div><div class='add'>+(defconst glusterfs-font-lock-keywords-1</div><div class='add'>+  (list</div><div class='add'>+					; "cluster/{unify,afr,stripe}"</div><div class='add'>+					; "performance/{io-cache,io-threads,write-behind,read-ahead,stat-prefetch}"</div><div class='add'>+					; "protocol/{client/server}"</div><div class='add'>+					; "features/{trash,posix-locks,fixed-id,filter}"</div><div class='add'>+					; "storage/posix"</div><div class='add'>+					; "encryption/rot-13"</div><div class='add'>+					; "debug/trace"</div><div class='add'>+    '("\\&lt;\\(cluster/\\(unify\\|afr\\|replicate\\|stripe\\|ha\\|dht\\|distribute\\)\\|\\performance/\\(io-\\(cache\\|threads\\)\\|write-behind\\|read-ahead\\|symlink-cache\\)\\|protocol/\\(server\\|client\\)\\|features/\\(trash\\|posix-locks\\|locks\\|path-converter\\|filter\\)\\|storage/\\(posix\\|bdb\\)\\|encryption/rot-13\\|debug/trace\\)\\&gt;" . font-lock-keyword-face))</div><div class='add'>+"Additional Keywords to highlight in GlusterFS mode.")</div><div class='add'>+</div><div class='add'>+(defconst glusterfs-font-lock-keywords-2</div><div class='add'>+  (append glusterfs-font-lock-keywords-1</div><div class='add'>+	  (list</div><div class='add'>+      ; "replicate" "namespace" "scheduler" "remote-subvolume" "remote-host"</div><div class='add'>+      ; "auth.addr" "block-size" "remote-port" "listen-port" "transport-type"</div><div class='add'>+      ; "limits.min-free-disk" "directory"</div><div class='add'>+	; TODO: add all the keys here.</div><div class='add'>+	   '("\\&lt;\\(inode-lru-limit\\|replicate\\|namespace\\|scheduler\\|username\\|password\\|allow\\|reject\\|block-size\\|listen-port\\|transport-type\\|transport-timeout\\|directory\\|page-size\\|page-count\\|aggregate-size\\|non-blocking-io\\|client-volume-filename\\|bind-address\\|self-heal\\|read-only-subvolumes\\|read-subvolume\\|thread-count\\|cache-size\\|window-size\\|force-revalidate-timeout\\|priority\\|include\\|exclude\\|remote-\\(host\\|subvolume\\|port\\)\\|auth.\\(addr\\|login\\)\\|limits.\\(min-disk-free\\|transaction-size\\|ib-verbs-\\(work-request-\\(send-\\|recv-\\(count\\|size\\)\\)\\|port\\|mtu\\|device-name\\)\\)\\)\ \\&gt;" . font-lock-constant-face)))</div><div class='add'>+  "option keys in GlusterFS mode.")</div><div class='add'>+</div><div class='add'>+(defconst glusterfs-font-lock-keywords-3</div><div class='add'>+  (append glusterfs-font-lock-keywords-2</div><div class='add'>+	  (list</div><div class='add'>+					; "option" "volume" "end-volume" "subvolumes" "type"</div><div class='add'>+	   '("\\&lt;\\(option\ \\|volume\ \\|subvolumes\ \\|type\ \\|end-volume\\)\\&gt;" . font-lock-builtin-face)))</div><div class='add'>+					;'((regexp-opt (" option " "^volume " "^end-volume" "subvolumes " " type ") t) . font-lock-builtin-face))</div><div class='add'>+  "Minimal highlighting expressions for GlusterFS mode.")</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+(defvar glusterfs-font-lock-keywords glusterfs-font-lock-keywords-3</div><div class='add'>+  "Default highlighting expressions for GlusterFS mode.")</div><div class='add'>+</div><div class='add'>+(defvar glusterfs-mode-syntax-table</div><div class='add'>+  (let ((glusterfs-mode-syntax-table (make-syntax-table)))</div><div class='add'>+    (modify-syntax-entry ?\# "&lt;"  glusterfs-mode-syntax-table)</div><div class='add'>+    (modify-syntax-entry ?* ". 23"  glusterfs-mode-syntax-table)</div><div class='add'>+    (modify-syntax-entry ?\n "&gt;#"  glusterfs-mode-syntax-table)</div><div class='add'>+    glusterfs-mode-syntax-table)</div><div class='add'>+  "Syntax table for glusterfs-mode")</div><div class='add'>+</div><div class='add'>+;; TODO: add an indentation table</div><div class='add'>+</div><div class='add'>+(defun glusterfs-indent-line ()</div><div class='add'>+  "Indent current line as GlusterFS code"</div><div class='add'>+  (interactive)</div><div class='add'>+  (beginning-of-line)</div><div class='add'>+  (if (bobp)</div><div class='add'>+      (indent-line-to 0)   ; First line is always non-indented</div><div class='add'>+    (let ((not-indented t) cur-indent)</div><div class='add'>+      (if (looking-at "^[ \t]*volume\ ")</div><div class='add'>+	  (progn</div><div class='add'>+	    (save-excursion</div><div class='add'>+	      (forward-line -1)</div><div class='add'>+	      (setq not-indented nil)</div><div class='add'>+	      (setq cur-indent 0))))</div><div class='add'>+      (if (looking-at "^[ \t]*end-volume")</div><div class='add'>+	  (progn</div><div class='add'>+	    (save-excursion</div><div class='add'>+	      (forward-line -1)</div><div class='add'>+	      (setq cur-indent 0))</div><div class='add'>+	    (if (&lt; cur-indent 0) ; We can't indent past the left margin</div><div class='add'>+		(setq cur-indent 0)))</div><div class='add'>+	(save-excursion</div><div class='add'>+	  (while not-indented ; Iterate backwards until we find an indentation hint</div><div class='add'>+	    (progn</div><div class='add'>+	      (setq cur-indent 2) ; Do the actual indenting</div><div class='add'>+	      (setq not-indented nil)))))</div><div class='add'>+      (if cur-indent</div><div class='add'>+	  (indent-line-to cur-indent)</div><div class='add'>+	(indent-line-to 0)))))</div><div class='add'>+</div><div class='add'>+(defun glusterfs-mode ()</div><div class='add'>+  (interactive)</div><div class='add'>+  (kill-all-local-variables)</div><div class='add'>+  ;; (use-local-map glusterfs-mode-map)</div><div class='add'>+  (set-syntax-table glusterfs-mode-syntax-table)</div><div class='add'>+  (set (make-local-variable 'indent-line-function) 'glusterfs-indent-line)</div><div class='add'>+  (set (make-local-variable 'font-lock-defaults) '(glusterfs-font-lock-keywords))</div><div class='add'>+  (setq major-mode 'glusterfs-mode)</div><div class='add'>+  (setq mode-name "GlusterFS")</div><div class='add'>+  (run-hooks 'glusterfs-mode-hook))</div><div class='add'>+</div><div class='add'>+(provide 'glusterfs-mode)</div><div class='head'>diff --git a/extras/glusterfs.vim b/extras/glusterfs.vim<br/>index 6bdf2a78d58..899cc65511c 100644<br/>--- a/<a href='/cgit/glusterfs.git/tree/extras/glusterfs.vim?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/glusterfs.vim</a><br/>+++ b/<a href='/cgit/glusterfs.git/tree/extras/glusterfs.vim?id=d1d7a6f35c816822fab51c820e25023863c239c1'>extras/glusterfs.vim</a></div><div class='hunk'>@@ -1,20 +1,11 @@</div><div class='ctx'> " glusterfs.vim: GNU Vim Syntax file for GlusterFS .vol specification</div><div class='del'>-" Copyright (C) 2007-2009 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='del'>-" This file is part of GlusterFS.</div><div class='add'>+"  Copyright (c) 2007777777Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+"  This file is part of GlusterFS.</div><div class='ctx'> "</div><div class='del'>-" GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-" it under the terms of the GNU General Public License as published</div><div class='del'>-" by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-" or (at your option) any later version.</div><div class='del'>-"</div><div class='del'>-" GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-" WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-" General Public License for more details.</div><div class='del'>-"</div><div class='del'>-" You should have received a copy of the GNU General Public License</div><div class='del'>-" along with this program.  If not, see</div><div class='del'>-" &lt;http://www.gnu.org/licenses/&gt;.</div><div class='add'>+"  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+"  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+"  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+"  cases as published by the Free Software Foundation.</div><div class='ctx'> "</div><div class='ctx'> " Last Modified: Wed Aug  1 00:47:10 IST 2007</div><div class='ctx'> " Version: 0.8 </div><div class='head'>diff --git a/extras/gnfs-loganalyse.py b/extras/gnfs-loganalyse.py<br/>index 1e0fde7f295..6341d007188 100644..100755<br/>--- a/<a href='/cgit/glusterfs.git/tree/extras/gnfs-loganalyse.py?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/gnfs-loganalyse.py</a><br/>+++ b/<a href='/cgit/glusterfs.git/tree/extras/gnfs-loganalyse.py?id=d1d7a6f35c816822fab51c820e25023863c239c1'>extras/gnfs-loganalyse.py</a></div><div class='hunk'>@@ -1,29 +1,29 @@</div><div class='ctx'> #!/bin/python</div><div class='ctx'> """</div><div class='del'>-  Copyright (c) 2010 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='add'>+  Copyright (c) 2006-2012 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='ctx'>   This file is part of GlusterFS.</div><div class='ctx'> </div><div class='del'>-  GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-  it under the terms of the GNU General Public License as published</div><div class='del'>-  by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-  or (at your option) any later version.</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='ctx'> </div><div class='del'>-  GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-  WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-  General Public License for more details.</div><div class='del'>-</div><div class='del'>-  You should have received a copy of the GNU General Public License</div><div class='del'>-  along with this program.  If not, see</div><div class='del'>-  &lt;http://www.gnu.org/licenses/&gt;.</div><div class='ctx'> """</div><div class='ctx'> </div><div class='add'>+from __future__ import print_function</div><div class='ctx'> import os</div><div class='ctx'> import string</div><div class='ctx'> import sys</div><div class='ctx'> </div><div class='ctx'> </div><div class='ctx'> class NFSRequest:</div><div class='add'>+        def requestIsEntryOp (self):</div><div class='add'>+                op = self.op</div><div class='add'>+                if op == "CREATE" or op == "LOOKUP" or op == "REMOVE" or op == "LINK" or op == "RENAME" or op == "MKDIR" or op == "RMDIR" or op == "SYMLINK" or op == "MKNOD":</div><div class='add'>+                        return 1</div><div class='add'>+                else:</div><div class='add'>+                        return 0</div><div class='add'>+</div><div class='ctx'>         def __init__ (self, logline, linecount):</div><div class='ctx'>                 self.calllinecount = 0</div><div class='ctx'>                 self.xid = ""</div><div class='hunk'>@@ -31,8 +31,13 @@ class NFSRequest:</div><div class='ctx'>                 self.opdata = ""</div><div class='ctx'>                 self.replydata = ""</div><div class='ctx'>                 self.replylinecount = 0</div><div class='add'>+                self.timestamp = ""</div><div class='add'>+                self.entryname = ""</div><div class='add'>+                self.gfid = ""</div><div class='add'>+                self.replygfid = ""</div><div class='ctx'> </div><div class='ctx'>                 tokens = logline.strip ().split (" ")</div><div class='add'>+                self.timestamp = tokens[0] + " " + tokens[1]</div><div class='ctx'>                 if "XID:" not in tokens:</div><div class='ctx'>                         return None</div><div class='ctx'> </div><div class='hunk'>@@ -47,6 +52,11 @@ class NFSRequest:</div><div class='ctx'>                 opidx = tokens.index ("args:")</div><div class='ctx'>                 self.op = tokens [opidx-1].strip (":")</div><div class='ctx'>                 self.opdata = " ".join(tokens [opidx+1:])</div><div class='add'>+                if self.requestIsEntryOp ():</div><div class='add'>+                        nameidx = tokens.index ("name:")</div><div class='add'>+                        self.entryname = tokens[nameidx + 1].strip (",")</div><div class='add'>+                gfididx = tokens.index ("gfid")</div><div class='add'>+                self.gfid = tokens[gfididx +1].strip(",")</div><div class='ctx'> </div><div class='ctx'> </div><div class='ctx'>         def getXID (self):</div><div class='hunk'>@@ -54,25 +64,56 @@ class NFSRequest:</div><div class='ctx'> </div><div class='ctx'>         def setReply (self, logline, linecount):</div><div class='ctx'>                 tokens = logline.strip ().split (" ")</div><div class='add'>+                timestamp = tokens[0] + " " + tokens[1]</div><div class='ctx'>                 statidx = tokens.index ("NFS:")</div><div class='del'>-                self.replydata = " ".join (tokens [statidx+1:])</div><div class='add'>+                self.replydata = " TimeStamp: " + timestamp + " " + " ".join (tokens [statidx+1:])</div><div class='ctx'>                 self.replylinecount = linecount</div><div class='add'>+                if "gfid" in tokens:</div><div class='add'>+                        gfididx = tokens.index ("gfid")</div><div class='add'>+                        self.replygfid = tokens [gfididx + 1].strip(",")</div><div class='ctx'> </div><div class='ctx'>         def dump (self):</div><div class='del'>-                print "ReqLine: " + str(self.calllinecount) + " XID: " + self.xid + " " + self.op + " ARGS: " + self.opdata + " RepLine: " + str(self.replylinecount) + " " + self.replydata</div><div class='add'>+                print("ReqLine: " + str(self.calllinecount) + " TimeStamp: " + self.timestamp + ", XID: " + self.xid + " " + self.op + " ARGS: " + self.opdata + " RepLine: " + str(self.replylinecount) + " " + self.replydata)</div><div class='ctx'> </div><div class='ctx'> class NFSLogAnalyzer:</div><div class='ctx'> </div><div class='del'>-        def __init__ (self):</div><div class='add'>+        def __init__ (self, optn, trackfilename, tracknamefh, stats):</div><div class='add'>+                self.stats = stats</div><div class='ctx'>                 self.xid_request_map = {}</div><div class='ctx'>                 self.orphan_replies = {}</div><div class='add'>+                self.rqlist = []</div><div class='ctx'>                 self.CALL = 1</div><div class='ctx'>                 self.REPLY = 2</div><div class='add'>+                self.optn = optn</div><div class='add'>+                self.trackfilename = trackfilename</div><div class='add'>+                self.tracknamefh = tracknamefh</div><div class='add'>+                self.trackedfilehandles = []</div><div class='ctx'> </div><div class='ctx'>         def handle_call_line (self, logline, linecount):</div><div class='ctx'>                 newreq = NFSRequest (logline, linecount)</div><div class='ctx'>                 xid = newreq.getXID ()</div><div class='del'>-                self.xid_request_map [xid] = newreq</div><div class='add'>+                if (self.optn == SYNTHESIZE):</div><div class='add'>+                        self.xid_request_map [xid] = newreq</div><div class='add'>+                        self.rqlist.append(newreq)</div><div class='add'>+                elif self.optn == TRACKFILENAME:</div><div class='add'>+                        if newreq.requestIsEntryOp():</div><div class='add'>+                                if newreq.entryname == self.trackfilename:</div><div class='add'>+                                        self.xid_request_map [xid] = newreq</div><div class='add'>+                                        self.rqlist.append(newreq)</div><div class='add'>+                                else:</div><div class='add'>+                                        del newreq</div><div class='add'>+                        elif self.tracknamefh == ENABLE_TRACKNAME_FH:</div><div class='add'>+                                if len (self.trackedfilehandles) &gt; 0:</div><div class='add'>+                                        if newreq.gfid in self.trackedfilehandles:</div><div class='add'>+                                                self.xid_request_map [xid] = newreq</div><div class='add'>+                                                self.rqlist.append(newreq)</div><div class='add'>+                                        else:</div><div class='add'>+                                                del newreq</div><div class='add'>+                                else:</div><div class='add'>+                                        del newreq</div><div class='add'>+                        else:</div><div class='add'>+                                del newreq</div><div class='add'>+</div><div class='ctx'> </div><div class='ctx'>         def handle_reply_line (self, logline, linecount):</div><div class='ctx'>                 tokens = logline.strip ().split (" ")</div><div class='hunk'>@@ -82,7 +123,10 @@ class NFSLogAnalyzer:</div><div class='ctx'>                 if xid not in self.xid_request_map.keys ():</div><div class='ctx'>                         self.orphan_replies [xid] = logline</div><div class='ctx'>                 else:</div><div class='del'>-                        self.xid_request_map [xid].setReply (logline, linecount)</div><div class='add'>+                        rq = self.xid_request_map [xid]</div><div class='add'>+                        rq.setReply (logline, linecount)</div><div class='add'>+                        if rq.requestIsEntryOp() and rq.entryname == self.trackfilename:</div><div class='add'>+                                self.trackedfilehandles.append (rq.replygfid)</div><div class='ctx'> </div><div class='ctx'>         def analyzeLine (self, logline, linecount):</div><div class='ctx'>                 tokens = logline.strip ().split (" ")</div><div class='hunk'>@@ -102,43 +146,116 @@ class NFSLogAnalyzer:</div><div class='ctx'>                         self.handle_reply_line (logline, linecount)</div><div class='ctx'> </div><div class='ctx'>         def getStats (self):</div><div class='add'>+                if self.stats == 0:</div><div class='add'>+                        return</div><div class='ctx'>                 rcount = len (self.xid_request_map.keys ())</div><div class='ctx'>                 orphancount = len (self.orphan_replies.keys ())</div><div class='del'>-                print "Requests: " + str(rcount) + ", Orphans: " + str(orphancount)</div><div class='add'>+                print("Requests: " + str(rcount) + ", Orphans: " + str(orphancount))</div><div class='ctx'> </div><div class='ctx'>         def dump (self):</div><div class='ctx'>                 self.getStats ()</div><div class='del'>-                for rq in self.xid_request_map.values ():</div><div class='add'>+                for rq in self.rqlist:</div><div class='ctx'>                         rq.dump ()</div><div class='add'>+                        del rq</div><div class='ctx'> </div><div class='del'>-</div><div class='add'>+                self.rqlist = []</div><div class='add'>+                self.orphan_replies = {}</div><div class='add'>+                self.xid_request_map = {}</div><div class='ctx'> </div><div class='ctx'> </div><div class='ctx'> linecount = 0</div><div class='del'>-la = NFSLogAnalyzer ()</div><div class='add'>+</div><div class='add'>+SYNTHESIZE = 1</div><div class='add'>+TRACKFILENAME = 2</div><div class='add'>+</div><div class='add'>+ENABLESTATS = 1</div><div class='add'>+DISABLESTATS = 0</div><div class='add'>+</div><div class='add'>+ENABLE_TRACKNAME_FH = 1</div><div class='add'>+DISABLE_TRACKNAME_FH = 0</div><div class='ctx'> </div><div class='ctx'> progmsgcount = 1000</div><div class='del'>-dumpinterval = 2000000</div><div class='add'>+dumpinterval = 200000</div><div class='add'>+operation = SYNTHESIZE</div><div class='add'>+stats = ENABLESTATS</div><div class='add'>+tracknamefh = DISABLE_TRACKNAME_FH</div><div class='add'>+trackfilename = ""</div><div class='add'>+</div><div class='add'>+"""</div><div class='add'>+Print the progress of the analysing operations every X number of lines read from</div><div class='add'>+the logs, where X is the argument provided to this option.</div><div class='add'>+</div><div class='add'>+Use this to print a status message every say 10000 lines processed or 100000</div><div class='add'>+lines processed to know how much longer the processing will go on for.</div><div class='ctx'> </div><div class='add'>+</div><div class='add'>+USAGE: --progress &lt;NUMLINES&gt;</div><div class='add'>+"""</div><div class='ctx'> if "--progress" in sys.argv:</div><div class='ctx'>         idx = sys.argv.index ("--progress")</div><div class='ctx'>         progmsgcount = int(sys.argv[idx+1])</div><div class='ctx'> </div><div class='del'>-</div><div class='add'>+"""</div><div class='add'>+The replies for a NFS request can be separated by hundreds and even thousands</div><div class='add'>+of other NFS requests and replies. These can be spread over many hundreds and</div><div class='add'>+thousands of log lines. This script maintains a memory dict to map each request</div><div class='add'>+to its reply using the XID. Because this is in-core, there is a limit to the</div><div class='add'>+number of entries in the dict. At regular intervals, it dumps the mapped</div><div class='add'>+requests and the replies into the stdout. The requests whose replies were not</div><div class='add'>+found at the point of dumping are left as orphans, i.e. without info about the</div><div class='add'>+replies. Use this option to tune the number of lines to maximize the number of</div><div class='add'>+requests whose replies are found while balancing the dict size with memory</div><div class='add'>+on the machine. The default works fine for most cases.</div><div class='add'>+</div><div class='add'>+USAGE: --dump &lt;NUMLINES&gt;</div><div class='add'>+"""</div><div class='ctx'> if "--dump" in sys.argv:</div><div class='ctx'>         idx = sys.argv.index ("--dump")</div><div class='ctx'>         dumpinterval = int(sys.argv[idx+1])</div><div class='ctx'> </div><div class='add'>+"""</div><div class='add'>+The default operation of the script is to output all the requests mapped to</div><div class='add'>+their replies in a single line. This operation mode can be changed by this</div><div class='add'>+argument. It is used to print only those operations that were performed on the</div><div class='add'>+filename given as the argument to this option. Only those entry operations are</div><div class='add'>+printed which contain this filename.</div><div class='add'>+</div><div class='add'>+USAGE: --trackfilename &lt;filename&gt;</div><div class='add'>+"""</div><div class='add'>+if "--trackfilename" in sys.argv:</div><div class='add'>+        idx = sys.argv.index ("--trackfilename")</div><div class='add'>+        trackfilename = sys.argv[idx + 1]</div><div class='add'>+        operation = TRACKFILENAME</div><div class='add'>+</div><div class='add'>+"""</div><div class='add'>+At every dump interval, some stats are printed about the dumped lines.</div><div class='add'>+Use this option to disable printing that to avoid cluttering the</div><div class='add'>+output.</div><div class='add'>+"""</div><div class='add'>+if "--nostats" in sys.argv:</div><div class='add'>+        stats = DISABLESTATS</div><div class='add'>+</div><div class='add'>+"""</div><div class='add'>+While tracking a file using --trackfilename, we're only given those</div><div class='add'>+operations which contain the filename. This excludes a large number</div><div class='add'>+of operations which operate on that file using its filehandle instead of</div><div class='add'>+the filename. This option enables outputting those operations also. It</div><div class='add'>+tracks every single file handle that was ever seen in the log for a given</div><div class='add'>+filename.</div><div class='add'>+</div><div class='add'>+USAGE: --trackfilename</div><div class='add'>+"""</div><div class='add'>+if "--tracknamefh" in sys.argv:</div><div class='add'>+        tracknamefh = ENABLE_TRACKNAME_FH</div><div class='add'>+</div><div class='add'>+la = NFSLogAnalyzer (operation, trackfilename, tracknamefh, stats)</div><div class='add'>+</div><div class='ctx'> for line in sys.stdin:</div><div class='ctx'>         linecount = linecount + 1</div><div class='ctx'>         if linecount % dumpinterval == 0:</div><div class='ctx'>                 sys.stderr.write ("Dumping data..\n")</div><div class='ctx'>                 la.dump ()</div><div class='del'>-                del la</div><div class='del'>-                la = NFSLogAnalyzer ()</div><div class='ctx'> </div><div class='ctx'>         if linecount % progmsgcount == 0:</div><div class='ctx'>                 sys.stderr.write ("Integrating line: "+ str(linecount) + "\n")</div><div class='ctx'>         la.analyzeLine (line, linecount)</div><div class='del'>-</div><div class='del'>-la.dump ()</div><div class='head'>diff --git a/extras/group-db-workload b/extras/group-db-workload<br/>new file mode 100644<br/>index 00000000000..9334d6fb942<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/extras/group-db-workload?id=d1d7a6f35c816822fab51c820e25023863c239c1'>extras/group-db-workload</a></div><div class='hunk'>@@ -0,0 +1,12 @@</div><div class='add'>+performance.open-behind=on</div><div class='add'>+performance.write-behind=off</div><div class='add'>+performance.stat-prefetch=off</div><div class='add'>+performance.quick-read=off</div><div class='add'>+performance.strict-o-direct=on</div><div class='add'>+performance.read-ahead=off</div><div class='add'>+performance.io-cache=off</div><div class='add'>+performance.readdir-ahead=off</div><div class='add'>+performance.client-io-threads=on</div><div class='add'>+server.event-threads=4</div><div class='add'>+client.event-threads=4</div><div class='add'>+performance.read-after-open=yes</div><div class='head'>diff --git a/extras/group-distributed-virt b/extras/group-distributed-virt<br/>new file mode 100644<br/>index 00000000000..a960b76c694<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/extras/group-distributed-virt?id=d1d7a6f35c816822fab51c820e25023863c239c1'>extras/group-distributed-virt</a></div><div class='hunk'>@@ -0,0 +1,10 @@</div><div class='add'>+performance.quick-read=off</div><div class='add'>+performance.read-ahead=off</div><div class='add'>+performance.io-cache=off</div><div class='add'>+performance.low-prio-threads=32</div><div class='add'>+network.remote-dio=enable</div><div class='add'>+features.shard=on</div><div class='add'>+user.cifs=off</div><div class='add'>+client.event-threads=4</div><div class='add'>+server.event-threads=4</div><div class='add'>+performance.client-io-threads=on</div><div class='head'>diff --git a/extras/group-gluster-block b/extras/group-gluster-block<br/>new file mode 100644<br/>index 00000000000..1e398019e6b<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/extras/group-gluster-block?id=d1d7a6f35c816822fab51c820e25023863c239c1'>extras/group-gluster-block</a></div><div class='hunk'>@@ -0,0 +1,27 @@</div><div class='add'>+performance.quick-read=off</div><div class='add'>+performance.read-ahead=off</div><div class='add'>+performance.io-cache=off</div><div class='add'>+performance.stat-prefetch=off</div><div class='add'>+performance.open-behind=off</div><div class='add'>+performance.readdir-ahead=off</div><div class='add'>+performance.strict-o-direct=on</div><div class='add'>+performance.client-io-threads=on</div><div class='add'>+performance.io-thread-count=32</div><div class='add'>+performance.high-prio-threads=32</div><div class='add'>+performance.normal-prio-threads=32</div><div class='add'>+performance.low-prio-threads=32</div><div class='add'>+performance.least-prio-threads=4</div><div class='add'>+client.event-threads=8</div><div class='add'>+server.event-threads=8</div><div class='add'>+network.remote-dio=disable</div><div class='add'>+cluster.eager-lock=enable</div><div class='add'>+cluster.quorum-type=auto</div><div class='add'>+cluster.data-self-heal-algorithm=full</div><div class='add'>+cluster.locking-scheme=granular</div><div class='add'>+cluster.shd-max-threads=8</div><div class='add'>+cluster.shd-wait-qlength=10000</div><div class='add'>+features.shard=on</div><div class='add'>+features.shard-block-size=64MB</div><div class='add'>+user.cifs=off</div><div class='add'>+server.allow-insecure=on</div><div class='add'>+cluster.choose-local=off</div><div class='head'>diff --git a/extras/group-metadata-cache b/extras/group-metadata-cache<br/>new file mode 100644<br/>index 00000000000..b890b288fc7<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/extras/group-metadata-cache?id=d1d7a6f35c816822fab51c820e25023863c239c1'>extras/group-metadata-cache</a></div><div class='hunk'>@@ -0,0 +1,6 @@</div><div class='add'>+features.cache-invalidation=on</div><div class='add'>+features.cache-invalidation-timeout=600</div><div class='add'>+performance.stat-prefetch=on</div><div class='add'>+performance.cache-invalidation=on</div><div class='add'>+performance.md-cache-timeout=600</div><div class='add'>+network.inode-lru-limit=200000</div><div class='head'>diff --git a/extras/group-nl-cache b/extras/group-nl-cache<br/>new file mode 100644<br/>index 00000000000..897807e8933<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/extras/group-nl-cache?id=d1d7a6f35c816822fab51c820e25023863c239c1'>extras/group-nl-cache</a></div><div class='hunk'>@@ -0,0 +1,5 @@</div><div class='add'>+features.cache-invalidation=on</div><div class='add'>+features.cache-invalidation-timeout=600</div><div class='add'>+performance.nl-cache=on</div><div class='add'>+performance.nl-cache-timeout=600</div><div class='add'>+network.inode-lru-limit=200000</div><div class='head'>diff --git a/extras/group-samba b/extras/group-samba<br/>new file mode 100644<br/>index 00000000000..eeee6e06031<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/extras/group-samba?id=d1d7a6f35c816822fab51c820e25023863c239c1'>extras/group-samba</a></div><div class='hunk'>@@ -0,0 +1,11 @@</div><div class='add'>+features.cache-invalidation=on</div><div class='add'>+features.cache-invalidation-timeout=600</div><div class='add'>+performance.cache-samba-metadata=on</div><div class='add'>+performance.stat-prefetch=on</div><div class='add'>+performance.cache-invalidation=on</div><div class='add'>+performance.md-cache-timeout=600</div><div class='add'>+network.inode-lru-limit=200000</div><div class='add'>+performance.nl-cache=on</div><div class='add'>+performance.nl-cache-timeout=600</div><div class='add'>+performance.readdir-ahead=on</div><div class='add'>+performance.parallel-readdir=on</div><div class='head'>diff --git a/extras/group-virt.example b/extras/group-virt.example<br/>new file mode 100644<br/>index 00000000000..cc37c98a25c<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/extras/group-virt.example?id=d1d7a6f35c816822fab51c820e25023863c239c1'>extras/group-virt.example</a></div><div class='hunk'>@@ -0,0 +1,24 @@</div><div class='add'>+performance.quick-read=off</div><div class='add'>+performance.read-ahead=off</div><div class='add'>+performance.io-cache=off</div><div class='add'>+performance.low-prio-threads=32</div><div class='add'>+network.remote-dio=disable</div><div class='add'>+performance.strict-o-direct=on</div><div class='add'>+cluster.eager-lock=enable</div><div class='add'>+cluster.quorum-type=auto</div><div class='add'>+cluster.server-quorum-type=server</div><div class='add'>+cluster.data-self-heal-algorithm=full</div><div class='add'>+cluster.locking-scheme=granular</div><div class='add'>+cluster.shd-max-threads=8</div><div class='add'>+cluster.shd-wait-qlength=10000</div><div class='add'>+features.shard=on</div><div class='add'>+user.cifs=off</div><div class='add'>+cluster.choose-local=off</div><div class='add'>+client.event-threads=4</div><div class='add'>+server.event-threads=4</div><div class='add'>+performance.client-io-threads=on</div><div class='add'>+network.ping-timeout=20</div><div class='add'>+server.tcp-user-timeout=20</div><div class='add'>+server.keepalive-time=10</div><div class='add'>+server.keepalive-interval=2</div><div class='add'>+server.keepalive-count=5</div><div class='head'>diff --git a/extras/hook-scripts/Makefile.am b/extras/hook-scripts/Makefile.am<br/>new file mode 100644<br/>index 00000000000..26059d7dbb9<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/extras/hook-scripts/Makefile.am?id=d1d7a6f35c816822fab51c820e25023863c239c1'>extras/hook-scripts/Makefile.am</a></div><div class='hunk'>@@ -0,0 +1,7 @@</div><div class='add'>+EXTRA_DIST = S40ufo-stop.py S56glusterd-geo-rep-create-post.sh</div><div class='add'>+SUBDIRS = add-brick create delete set start stop reset</div><div class='add'>+</div><div class='add'>+scriptsdir = $(GLUSTERD_WORKDIR)/hooks/1/gsync-create/post/</div><div class='add'>+if USE_GEOREP</div><div class='add'>+scripts_SCRIPTS = S56glusterd-geo-rep-create-post.sh</div><div class='add'>+endif</div><div class='head'>diff --git a/extras/hook-scripts/S40ufo-stop.py b/extras/hook-scripts/S40ufo-stop.py<br/>new file mode 100755<br/>index 00000000000..2c79eb1d54a<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/extras/hook-scripts/S40ufo-stop.py?id=d1d7a6f35c816822fab51c820e25023863c239c1'>extras/hook-scripts/S40ufo-stop.py</a></div><div class='hunk'>@@ -0,0 +1,24 @@</div><div class='add'>+#!/usr/bin/python3</div><div class='add'>+</div><div class='add'>+import os</div><div class='add'>+from optparse import OptionParser</div><div class='add'>+</div><div class='add'>+if __name__ == '__main__':</div><div class='add'>+    # check if swift is installed</div><div class='add'>+    try:</div><div class='add'>+        from gluster.swift.common.Glusterfs import get_mnt_point, unmount</div><div class='add'>+    except ImportError:</div><div class='add'>+        import sys</div><div class='add'>+        sys.exit("Openstack Swift does not appear to be installed properly");</div><div class='add'>+</div><div class='add'>+    op = OptionParser(usage="%prog [options...]")</div><div class='add'>+    op.add_option('--volname', dest='vol', type=str)</div><div class='add'>+    op.add_option('--last', dest='last', type=str)</div><div class='add'>+    (opts, args) = op.parse_args()</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+    mnt_point = get_mnt_point(opts.vol)</div><div class='add'>+    if mnt_point:</div><div class='add'>+        unmount(mnt_point)</div><div class='add'>+    else:</div><div class='add'>+        sys.exit("get_mnt_point returned none for mount point")</div><div class='head'>diff --git a/extras/hook-scripts/S56glusterd-geo-rep-create-post.sh b/extras/hook-scripts/S56glusterd-geo-rep-create-post.sh<br/>new file mode 100755<br/>index 00000000000..7d6052315bb<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/extras/hook-scripts/S56glusterd-geo-rep-create-post.sh?id=d1d7a6f35c816822fab51c820e25023863c239c1'>extras/hook-scripts/S56glusterd-geo-rep-create-post.sh</a></div><div class='hunk'>@@ -0,0 +1,104 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+#key_val_pair is the arguments passed to the script in the form of</div><div class='add'>+#key value pair</div><div class='add'>+</div><div class='add'>+key_val_pair1=`echo $2 | cut -d ',' -f 1`</div><div class='add'>+key_val_pair2=`echo $2 | cut -d ',' -f 2`</div><div class='add'>+key_val_pair3=`echo $2 | cut -d ',' -f 3`</div><div class='add'>+key_val_pair4=`echo $2 | cut -d ',' -f 4`</div><div class='add'>+key_val_pair5=`echo $2 | cut -d ',' -f 5`</div><div class='add'>+key_val_pair6=`echo $2 | cut -d ',' -f 6`</div><div class='add'>+</div><div class='add'>+mastervol=`echo $1 | cut -d '=' -f 2`</div><div class='add'>+if [ "$mastervol" == "" ]; then</div><div class='add'>+    exit;</div><div class='add'>+fi</div><div class='add'>+</div><div class='add'>+key=`echo $key_val_pair1 | cut -d '=' -f 1`</div><div class='add'>+val=`echo $key_val_pair1 | cut -d '=' -f 2`</div><div class='add'>+if [ "$key" != "is_push_pem" ]; then</div><div class='add'>+    exit;</div><div class='add'>+fi</div><div class='add'>+if [ "$val" != '1' ]; then</div><div class='add'>+    exit;</div><div class='add'>+fi</div><div class='add'>+</div><div class='add'>+key=`echo $key_val_pair2 | cut -d '=' -f 1`</div><div class='add'>+val=`echo $key_val_pair2 | cut -d '=' -f 2`</div><div class='add'>+if [ "$key" != "pub_file" ]; then</div><div class='add'>+    exit;</div><div class='add'>+fi</div><div class='add'>+if [ "$val" == "" ]; then</div><div class='add'>+    exit;</div><div class='add'>+fi</div><div class='add'>+</div><div class='add'>+pub_file=`echo $val`</div><div class='add'>+pub_file_bname="$(basename $pub_file)"</div><div class='add'>+pub_file_dname="$(dirname $pub_file)"</div><div class='add'>+pub_file_tmp=`echo $val`_tmp</div><div class='add'>+</div><div class='add'>+key=`echo $key_val_pair3 | cut -d '=' -f 1`</div><div class='add'>+val=`echo $key_val_pair3 | cut -d '=' -f 2`</div><div class='add'>+if [ "$key" != "slave_user" ]; then</div><div class='add'>+    exit;</div><div class='add'>+fi</div><div class='add'>+if [ "$val" == "" ]; then</div><div class='add'>+    exit;</div><div class='add'>+fi</div><div class='add'>+slave_user=`echo $val`</div><div class='add'>+</div><div class='add'>+key=`echo $key_val_pair4 | cut -d '=' -f 1`</div><div class='add'>+val=`echo $key_val_pair4 | cut -d '=' -f 2`</div><div class='add'>+if [ "$key" != "slave_ip" ]; then</div><div class='add'>+    exit;</div><div class='add'>+fi</div><div class='add'>+if [ "$val" == "" ]; then</div><div class='add'>+    exit;</div><div class='add'>+fi</div><div class='add'>+slave_ip=`echo $val`</div><div class='add'>+</div><div class='add'>+key=`echo $key_val_pair5 | cut -d '=' -f 1`</div><div class='add'>+val=`echo $key_val_pair5 | cut -d '=' -f 2`</div><div class='add'>+if [ "$key" != "slave_vol" ]; then</div><div class='add'>+    exit;</div><div class='add'>+fi</div><div class='add'>+if [ "$val" == "" ]; then</div><div class='add'>+    exit;</div><div class='add'>+fi</div><div class='add'>+slavevol=`echo $val`</div><div class='add'>+</div><div class='add'>+key=`echo $key_val_pair6 | cut -d '=' -f 1`</div><div class='add'>+val=`echo $key_val_pair6 | cut -d '=' -f 2`</div><div class='add'>+if [ "$key" != "ssh_port" ]; then</div><div class='add'>+    exit;</div><div class='add'>+fi</div><div class='add'>+if [ "$val" == "" ]; then</div><div class='add'>+    exit;</div><div class='add'>+fi</div><div class='add'>+SSH_PORT=`echo $val`</div><div class='add'>+SSH_OPT="-oPasswordAuthentication=no -oStrictHostKeyChecking=no"</div><div class='add'>+</div><div class='add'>+if [ -f $pub_file ]; then</div><div class='add'>+    # For a non-root user copy the pub file to the user's home directory</div><div class='add'>+    # For a root user copy the pub files to priv_dir-&gt;geo-rep.</div><div class='add'>+    if [ "$slave_user" != "root" ]; then</div><div class='add'>+        slave_user_home_dir=`ssh -p ${SSH_PORT} ${SSH_OPT} $slave_user@$slave_ip "getent passwd $slave_user | cut -d ':' -f 6"`</div><div class='add'>+        scp -P ${SSH_PORT} ${SSH_OPT} $pub_file $slave_user@$slave_ip:$slave_user_home_dir/common_secret.pem.pub_tmp</div><div class='add'>+        ssh -p ${SSH_PORT} ${SSH_OPT} $slave_user@$slave_ip "mv $slave_user_home_dir/common_secret.pem.pub_tmp $slave_user_home_dir/${mastervol}_${slavevol}_common_secret.pem.pub"</div><div class='add'>+    else</div><div class='add'>+        if [[ -z "${GR_SSH_IDENTITY_KEY}" ]]; then</div><div class='add'>+            scp -P ${SSH_PORT} ${SSH_OPT} $pub_file $slave_ip:$pub_file_tmp</div><div class='add'>+            ssh -p ${SSH_PORT} ${SSH_OPT} $slave_ip "mv $pub_file_tmp ${pub_file_dname}/${mastervol}_${slavevol}_${pub_file_bname}"</div><div class='add'>+            ssh -p ${SSH_PORT} ${SSH_OPT} $slave_ip "gluster system:: copy file /geo-replication/${mastervol}_${slavevol}_common_secret.pem.pub &gt; /dev/null"</div><div class='add'>+            ssh -p ${SSH_PORT} ${SSH_OPT} $slave_ip "gluster system:: execute add_secret_pub root geo-replication/${mastervol}_${slavevol}_common_secret.pem.pub &gt; /dev/null"</div><div class='add'>+            ssh -p ${SSH_PORT} ${SSH_OPT} $slave_ip "gluster vol set ${slavevol} features.read-only on"</div><div class='add'>+        else</div><div class='add'>+            scp -P ${SSH_PORT} -i ${GR_SSH_IDENTITY_KEY} ${SSH_OPT} $pub_file $slave_ip:$pub_file_tmp</div><div class='add'>+            ssh -p ${SSH_PORT} -i ${GR_SSH_IDENTITY_KEY} ${SSH_OPT} $slave_ip "mv $pub_file_tmp ${pub_file_dname}/${mastervol}_${slavevol}_${pub_file_bname}"</div><div class='add'>+            ssh -p ${SSH_PORT} -i ${GR_SSH_IDENTITY_KEY} ${SSH_OPT} $slave_ip "gluster system:: copy file /geo-replication/${mastervol}_${slavevol}_common_secret.pem.pub &gt; /dev/null"</div><div class='add'>+            ssh -p ${SSH_PORT} -i ${GR_SSH_IDENTITY_KEY} ${SSH_OPT} $slave_ip "gluster system:: execute add_secret_pub root geo-replication/${mastervol}_${slavevol}_common_secret.pem.pub &gt; /dev/null"</div><div class='add'>+            ssh -p ${SSH_PORT} -i ${GR_SSH_IDENTITY_KEY} ${SSH_OPT} $slave_ip "gluster vol set ${slavevol} features.read-only on"</div><div class='add'>+        fi</div><div class='add'>+    fi</div><div class='add'>+fi</div><div class='head'>diff --git a/extras/hook-scripts/add-brick/Makefile.am b/extras/hook-scripts/add-brick/Makefile.am<br/>new file mode 100644<br/>index 00000000000..6e2701e909e<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/extras/hook-scripts/add-brick/Makefile.am?id=d1d7a6f35c816822fab51c820e25023863c239c1'>extras/hook-scripts/add-brick/Makefile.am</a></div><div class='hunk'>@@ -0,0 +1,2 @@</div><div class='add'>+SUBDIRS = post pre</div><div class='add'>+CLEANFILES =</div><div class='head'>diff --git a/extras/hook-scripts/add-brick/post/Makefile.am b/extras/hook-scripts/add-brick/post/Makefile.am<br/>new file mode 100644<br/>index 00000000000..9b236df096d<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/extras/hook-scripts/add-brick/post/Makefile.am?id=d1d7a6f35c816822fab51c820e25023863c239c1'>extras/hook-scripts/add-brick/post/Makefile.am</a></div><div class='hunk'>@@ -0,0 +1,6 @@</div><div class='add'>+EXTRA_DIST = disabled-quota-root-xattr-heal.sh S10selinux-label-brick.sh S13create-subdir-mounts.sh</div><div class='add'>+</div><div class='add'>+hookdir = $(GLUSTERD_WORKDIR)/hooks/1/add-brick/post/</div><div class='add'>+if WITH_SERVER</div><div class='add'>+hook_SCRIPTS = disabled-quota-root-xattr-heal.sh S10selinux-label-brick.sh S13create-subdir-mounts.sh</div><div class='add'>+endif</div><div class='head'>diff --git a/extras/hook-scripts/add-brick/post/S10selinux-label-brick.sh b/extras/hook-scripts/add-brick/post/S10selinux-label-brick.sh<br/>new file mode 100755<br/>index 00000000000..4a17c993a77<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/extras/hook-scripts/add-brick/post/S10selinux-label-brick.sh?id=d1d7a6f35c816822fab51c820e25023863c239c1'>extras/hook-scripts/add-brick/post/S10selinux-label-brick.sh</a></div><div class='hunk'>@@ -0,0 +1,100 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+#</div><div class='add'>+# Install to hooks/&lt;HOOKS_VER&gt;/add-brick/post</div><div class='add'>+#</div><div class='add'>+# Add an SELinux file context for each brick using the glusterd_brick_t type.</div><div class='add'>+# This ensures that the brick is relabeled correctly on an SELinux restart or</div><div class='add'>+# restore. Subsequently, run a restore on the brick path to set the selinux</div><div class='add'>+# labels.</div><div class='add'>+#</div><div class='add'>+###</div><div class='add'>+</div><div class='add'>+PROGNAME="Sselinux"</div><div class='add'>+OPTSPEC="volname:,version:,gd-workdir:,volume-op:"</div><div class='add'>+VOL=</div><div class='add'>+</div><div class='add'>+parse_args () {</div><div class='add'>+  ARGS=$(getopt -o '' -l ${OPTSPEC} -n ${PROGNAME} -- "$@")</div><div class='add'>+  eval set -- "${ARGS}"</div><div class='add'>+</div><div class='add'>+  while true; do</div><div class='add'>+    case ${1} in</div><div class='add'>+      --volname)</div><div class='add'>+        shift</div><div class='add'>+        VOL=${1}</div><div class='add'>+        ;;</div><div class='add'>+      --gd-workdir)</div><div class='add'>+          shift</div><div class='add'>+          GLUSTERD_WORKDIR=$1</div><div class='add'>+          ;;</div><div class='add'>+      --version)</div><div class='add'>+          shift</div><div class='add'>+          ;;</div><div class='add'>+      --volume-op)</div><div class='add'>+          shift</div><div class='add'>+          ;;</div><div class='add'>+      *)</div><div class='add'>+          shift</div><div class='add'>+          break</div><div class='add'>+          ;;</div><div class='add'>+    esac</div><div class='add'>+    shift</div><div class='add'>+  done</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+set_brick_labels()</div><div class='add'>+{</div><div class='add'>+  local volname="${1}"</div><div class='add'>+  local fctx</div><div class='add'>+  local list=()</div><div class='add'>+</div><div class='add'>+  fctx="$(semanage fcontext --list -C)"</div><div class='add'>+</div><div class='add'>+  # wait for new brick path to be updated under</div><div class='add'>+  # ${GLUSTERD_WORKDIR}/vols/${volname}/bricks/</div><div class='add'>+  sleep 5</div><div class='add'>+</div><div class='add'>+  # grab the path for each local brick</div><div class='add'>+  brickpath="${GLUSTERD_WORKDIR}/vols/${volname}/bricks/"</div><div class='add'>+  brickdirs=$(</div><div class='add'>+    find "${brickpath}" -type f -exec grep '^path=' {} \; | \</div><div class='add'>+    cut -d= -f 2 | \</div><div class='add'>+    sort -u</div><div class='add'>+  )</div><div class='add'>+</div><div class='add'>+  # create a list of bricks for which custom SELinux</div><div class='add'>+  # label doesn't exist</div><div class='add'>+  for b in ${brickdirs}; do</div><div class='add'>+    pattern="${b}(/.*)?"</div><div class='add'>+    echo "${fctx}" | grep "^${pattern}\s" &gt;/dev/null</div><div class='add'>+    if [[ $? -ne 0 ]]; then</div><div class='add'>+      list+=("${pattern}")</div><div class='add'>+    fi</div><div class='add'>+  done</div><div class='add'>+</div><div class='add'>+  # Add a file context for each brick path in the list and associate with the</div><div class='add'>+  # glusterd_brick_t SELinux type.</div><div class='add'>+  for p in ${list[@]}</div><div class='add'>+  do</div><div class='add'>+    semanage fcontext --add -t glusterd_brick_t -r s0 "${p}"</div><div class='add'>+  done</div><div class='add'>+</div><div class='add'>+  # Set the labels for which SELinux label was added above</div><div class='add'>+  for b in ${brickdirs}</div><div class='add'>+  do</div><div class='add'>+    echo "${list[@]}" | grep "${b}" &gt;/dev/null</div><div class='add'>+    if [[ $? -eq 0 ]]; then</div><div class='add'>+      restorecon -R "${b}"</div><div class='add'>+    fi</div><div class='add'>+  done</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+SELINUX_STATE=$(which getenforce &amp;&amp; getenforce)</div><div class='add'>+[ "${SELINUX_STATE}" = 'Disabled' ] &amp;&amp; exit 0</div><div class='add'>+</div><div class='add'>+parse_args "$@"</div><div class='add'>+[ -z "${VOL}" ] &amp;&amp; exit 1</div><div class='add'>+</div><div class='add'>+set_brick_labels "${VOL}"</div><div class='add'>+</div><div class='add'>+exit 0</div><div class='head'>diff --git a/extras/hook-scripts/add-brick/post/S13create-subdir-mounts.sh b/extras/hook-scripts/add-brick/post/S13create-subdir-mounts.sh<br/>new file mode 100755<br/>index 00000000000..1a6923ee7aa<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/extras/hook-scripts/add-brick/post/S13create-subdir-mounts.sh?id=d1d7a6f35c816822fab51c820e25023863c239c1'>extras/hook-scripts/add-brick/post/S13create-subdir-mounts.sh</a></div><div class='hunk'>@@ -0,0 +1,86 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+##---------------------------------------------------------------------------</div><div class='add'>+## This script runs the self-heal of the directories which are expected to</div><div class='add'>+## be present as they are mounted as subdirectory mounts.</div><div class='add'>+##---------------------------------------------------------------------------</div><div class='add'>+</div><div class='add'>+MOUNT_DIR=`mktemp -d -t ${0##*/}.XXXXXX`;</div><div class='add'>+OPTSPEC="volname:,version:,gd-workdir:,volume-op:"</div><div class='add'>+PROGNAME="add-brick-create-subdir"</div><div class='add'>+VOL_NAME=test</div><div class='add'>+GLUSTERD_WORKDIR="/var/lib/glusterd"</div><div class='add'>+</div><div class='add'>+cleanup_mountpoint ()</div><div class='add'>+{</div><div class='add'>+        umount -f $MOUNT_DIR;</div><div class='add'>+        if [ 0 -ne $? ]</div><div class='add'>+        then</div><div class='add'>+                return $?</div><div class='add'>+        fi</div><div class='add'>+</div><div class='add'>+        rmdir $MOUNT_DIR;</div><div class='add'>+        if [ 0 -ne $? ]</div><div class='add'>+        then</div><div class='add'>+                return $?</div><div class='add'>+        fi</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+##------------------------------------------</div><div class='add'>+## Parse the arguments</div><div class='add'>+##------------------------------------------</div><div class='add'>+ARGS=$(getopt -l $OPTSPEC  -name $PROGNAME $@)</div><div class='add'>+eval set -- "$ARGS"</div><div class='add'>+</div><div class='add'>+while true;</div><div class='add'>+do</div><div class='add'>+    case $1 in</div><div class='add'>+        --volname)</div><div class='add'>+            shift</div><div class='add'>+            VOL_NAME=$1</div><div class='add'>+            ;;</div><div class='add'>+        --gd-workdir)</div><div class='add'>+            shift</div><div class='add'>+            GLUSTERD_WORKDIR=$1</div><div class='add'>+            ;;</div><div class='add'>+	--version)</div><div class='add'>+	    shift</div><div class='add'>+	    ;;</div><div class='add'>+	--volume-op)</div><div class='add'>+	    shift</div><div class='add'>+	    ;;</div><div class='add'>+	*)</div><div class='add'>+	    shift</div><div class='add'>+	    break</div><div class='add'>+	    ;;</div><div class='add'>+    esac</div><div class='add'>+    shift</div><div class='add'>+done</div><div class='add'>+</div><div class='add'>+## See if we have any subdirs to be healed before going further</div><div class='add'>+subdirs=$(grep 'auth.allow' ${GLUSTERD_WORKDIR}/vols/${VOL_NAME}/info | cut -f2 -d'=' | tr ',' '\n' | cut -f1 -d'(');</div><div class='add'>+</div><div class='add'>+if [ -z ${subdirs} ]; then</div><div class='add'>+    rmdir $MOUNT_DIR;</div><div class='add'>+    exit 0;</div><div class='add'>+fi</div><div class='add'>+</div><div class='add'>+##----------------------------------------</div><div class='add'>+## Mount the volume in temp directory.</div><div class='add'>+## -----------------------------------</div><div class='add'>+glusterfs -s localhost --volfile-id=$VOL_NAME --client-pid=-50 $MOUNT_DIR;</div><div class='add'>+if [ 0 -ne $? ]</div><div class='add'>+then</div><div class='add'>+    exit $?;</div><div class='add'>+fi</div><div class='add'>+</div><div class='add'>+## -----------------------------------</div><div class='add'>+# Do the 'stat' on all the directory for now. Ideal fix is to look at subdir</div><div class='add'>+# list from 'auth.allow' option and only stat them.</div><div class='add'>+for subdir in ${subdirs}</div><div class='add'>+do</div><div class='add'>+    stat ${MOUNT_DIR}/${subdir} &gt; /dev/null;</div><div class='add'>+done</div><div class='add'>+</div><div class='add'>+## Clean up and exit</div><div class='add'>+cleanup_mountpoint;</div><div class='head'>diff --git a/extras/hook-scripts/add-brick/post/disabled-quota-root-xattr-heal.sh b/extras/hook-scripts/add-brick/post/disabled-quota-root-xattr-heal.sh<br/>new file mode 100755<br/>index 00000000000..ca17a903549<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/extras/hook-scripts/add-brick/post/disabled-quota-root-xattr-heal.sh?id=d1d7a6f35c816822fab51c820e25023863c239c1'>extras/hook-scripts/add-brick/post/disabled-quota-root-xattr-heal.sh</a></div><div class='hunk'>@@ -0,0 +1,145 @@</div><div class='add'>+#!/bin/sh</div><div class='add'>+</div><div class='add'>+##---------------------------------------------------------------------------</div><div class='add'>+## This script updates the 'limit-set' xattr on the newly added node. Please</div><div class='add'>+## refer hook-scripts/add-brick/pre/S28Quota-root-xattr-heal.sh for the complete</div><div class='add'>+## description.</div><div class='add'>+## Do the following only if limit configured on root.</div><div class='add'>+## 1. Do an auxiliary mount.</div><div class='add'>+## 2. Get 'limit-set' xattr on root</div><div class='add'>+## 3. Set xattrs with the same value on the root.</div><div class='add'>+## 4. Disable itself</div><div class='add'>+##---------------------------------------------------------------------------</div><div class='add'>+</div><div class='add'>+QUOTA_LIMIT_XATTR="trusted.glusterfs.quota.limit-set"</div><div class='add'>+QUOTA_OBJECT_LIMIT_XATTR="trusted.glusterfs.quota.limit-objects"</div><div class='add'>+MOUNT_DIR=$(mktemp -d -t "${0##*/}.XXXXXX");</div><div class='add'>+OPTSPEC="volname:,version:,gd-workdir:,volume-op:"</div><div class='add'>+PROGNAME="Quota-xattr-heal-add-brick"</div><div class='add'>+VOL_NAME=</div><div class='add'>+VERSION=</div><div class='add'>+VOLUME_OP=</div><div class='add'>+GLUSTERD_WORKDIR=</div><div class='add'>+ENABLED_NAME_PREFIX="S28"</div><div class='add'>+ENABLED_NAME="Quota-root-xattr-heal.sh"</div><div class='add'>+</div><div class='add'>+THIS_SCRIPT=$(echo "${0}" | awk -F'/' '{print $NF}')</div><div class='add'>+</div><div class='add'>+cleanup_mountpoint ()</div><div class='add'>+{</div><div class='add'>+</div><div class='add'>+  if umount -f "${MOUNT_DIR}"; then</div><div class='add'>+    return $?</div><div class='add'>+  fi</div><div class='add'>+</div><div class='add'>+  if rmdir "${MOUNT_DIR}"; then</div><div class='add'>+    return $?</div><div class='add'>+  fi</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+disable_and_exit ()</div><div class='add'>+{</div><div class='add'>+  if [ -e "${ENABLED_STATE}" ]</div><div class='add'>+  then</div><div class='add'>+    unlink "${ENABLED_STATE}";</div><div class='add'>+    exit $?</div><div class='add'>+  fi</div><div class='add'>+</div><div class='add'>+  exit 0</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+get_and_set_xattr ()</div><div class='add'>+{</div><div class='add'>+  XATTR=$1</div><div class='add'>+</div><div class='add'>+  VALUE=$(getfattr -n "${XATTR}" -e hex --absolute-names "${MOUNT_DIR}" 2&gt;&amp;1)</div><div class='add'>+  RET=$?</div><div class='add'>+  if [ 0 -eq ${RET} ]; then</div><div class='add'>+    VALUE=$(echo "${VALUE}" | grep "${XATTR}" | awk -F'=' '{print $NF}')</div><div class='add'>+    setfattr -n "${XATTR}" -v "${VALUE}" "${MOUNT_DIR}";</div><div class='add'>+    RET=$?</div><div class='add'>+  else</div><div class='add'>+    if echo "${VALUE}" | grep -iq "No such attribute" ; then</div><div class='add'>+      RET=0</div><div class='add'>+    fi</div><div class='add'>+  fi</div><div class='add'>+</div><div class='add'>+  return ${RET};</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+##------------------------------------------</div><div class='add'>+## Parse the arguments</div><div class='add'>+##------------------------------------------</div><div class='add'>+ARGS=$(getopt -o '' -l ${OPTSPEC} -n ${PROGNAME} -- "$@")</div><div class='add'>+eval set -- "$ARGS"</div><div class='add'>+</div><div class='add'>+while true;</div><div class='add'>+do</div><div class='add'>+  case $1 in</div><div class='add'>+    --volname)</div><div class='add'>+      shift</div><div class='add'>+      VOL_NAME=$1</div><div class='add'>+    ;;</div><div class='add'>+    --version)</div><div class='add'>+      shift</div><div class='add'>+      VERSION=$1</div><div class='add'>+    ;;</div><div class='add'>+    --gd-workdir)</div><div class='add'>+      shift</div><div class='add'>+      GLUSTERD_WORKDIR=$1</div><div class='add'>+    ;;</div><div class='add'>+    --volume-op)</div><div class='add'>+      shift</div><div class='add'>+      VOLUME_OP=$1</div><div class='add'>+    ;;</div><div class='add'>+    *)</div><div class='add'>+      shift</div><div class='add'>+      break</div><div class='add'>+    ;;</div><div class='add'>+  esac</div><div class='add'>+  shift</div><div class='add'>+done</div><div class='add'>+##----------------------------------------</div><div class='add'>+</div><div class='add'>+# Avoid long lines</div><div class='add'>+ENABLED_STATE_1="${GLUSTERD_WORKDIR}/hooks/${VERSION}/${VOLUME_OP}/"</div><div class='add'>+ENABLED_STATE_2="post/${ENABLED_NAME_PREFIX}${VOL_NAME}-${ENABLED_NAME}"</div><div class='add'>+ENABLED_STATE="${ENABLED_STATE_1}${ENABLED_STATE_2}"</div><div class='add'>+</div><div class='add'>+if [ "${THIS_SCRIPT}" != *"${VOL_NAME}"* ]; then</div><div class='add'>+  exit 0</div><div class='add'>+fi</div><div class='add'>+</div><div class='add'>+## Is quota enabled?</div><div class='add'>+FLAG=$(grep "^features.quota=" "${GLUSTERD_WORKDIR}/vols/${VOL_NAME}/info" \</div><div class='add'>+| awk -F'=' '{print $NF}');</div><div class='add'>+if [ "${FLAG}" != "on" ]</div><div class='add'>+then</div><div class='add'>+  disable_and_exit</div><div class='add'>+fi</div><div class='add'>+</div><div class='add'>+## -----------------------------------</div><div class='add'>+## Mount the volume in temp directory.</div><div class='add'>+## -----------------------------------</div><div class='add'>+# Avoid long lines</div><div class='add'>+CMD_1="glusterfs -s localhost"</div><div class='add'>+CMD_2="--volfile-id=${VOL_NAME} client-pid=-42 ${MOUNT_DIR}"</div><div class='add'>+CMD="${CMD_1}${CMD_2}"</div><div class='add'>+</div><div class='add'>+if ${CMD}</div><div class='add'>+then</div><div class='add'>+  exit $?;</div><div class='add'>+fi</div><div class='add'>+## -----------------------------------</div><div class='add'>+</div><div class='add'>+RET1=$(get_and_set_xattr "${QUOTA_LIMIT_XATTR}")</div><div class='add'>+RET2=$(get_and_set_xattr "${QUOTA_OBJECT_LIMIT_XATTR}")</div><div class='add'>+</div><div class='add'>+## Clean up and exit</div><div class='add'>+cleanup_mountpoint;</div><div class='add'>+</div><div class='add'>+if [ "${RET1}" -ne 0 ] || [ "${RET2}" -ne 0 ]; then</div><div class='add'>+  exit 1</div><div class='add'>+fi</div><div class='add'>+</div><div class='add'>+disable_and_exit;</div><div class='head'>diff --git a/extras/hook-scripts/add-brick/pre/Makefile.am b/extras/hook-scripts/add-brick/pre/Makefile.am<br/>new file mode 100644<br/>index 00000000000..3288581aa57<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/extras/hook-scripts/add-brick/pre/Makefile.am?id=d1d7a6f35c816822fab51c820e25023863c239c1'>extras/hook-scripts/add-brick/pre/Makefile.am</a></div><div class='hunk'>@@ -0,0 +1,6 @@</div><div class='add'>+EXTRA_DIST = S28Quota-enable-root-xattr-heal.sh</div><div class='add'>+</div><div class='add'>+hookdir = $(GLUSTERD_WORKDIR)/hooks/1/add-brick/pre/</div><div class='add'>+if WITH_SERVER</div><div class='add'>+hook_SCRIPTS = S28Quota-enable-root-xattr-heal.sh</div><div class='add'>+endif</div><div class='head'>diff --git a/extras/hook-scripts/add-brick/pre/S28Quota-enable-root-xattr-heal.sh b/extras/hook-scripts/add-brick/pre/S28Quota-enable-root-xattr-heal.sh<br/>new file mode 100755<br/>index 00000000000..27e85231f45<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/extras/hook-scripts/add-brick/pre/S28Quota-enable-root-xattr-heal.sh?id=d1d7a6f35c816822fab51c820e25023863c239c1'>extras/hook-scripts/add-brick/pre/S28Quota-enable-root-xattr-heal.sh</a></div><div class='hunk'>@@ -0,0 +1,101 @@</div><div class='add'>+#!/bin/sh</div><div class='add'>+</div><div class='add'>+###############################################################################</div><div class='add'>+## ----------------------------------------------------------------------------</div><div class='add'>+## The scripts</div><div class='add'>+## I.   add-brick/pre/S28Quota-root-xattr-heal.sh (itself)</div><div class='add'>+## II.  add-brick/post/disabled-root-xattr-heal.sh AND</div><div class='add'>+## collectively archieves the job of healing the 'limit-set' xattr upon</div><div class='add'>+## add-brick to the gluster volume.</div><div class='add'>+##</div><div class='add'>+## This script is the 'controlling' script. Upon add-brick this script enables</div><div class='add'>+## the corresponding script based on the status of the volume.</div><div class='add'>+## If volume is started - enable add-brick/post script</div><div class='add'>+## else                 - enable start/post script.</div><div class='add'>+##</div><div class='add'>+## The enabling and disabling of a script is based on the glusterd's logic,</div><div class='add'>+## that it only runs the scripts which starts its name with 'S'. So,</div><div class='add'>+## Enable - symlink the file to 'S'*.</div><div class='add'>+## Disable- unlink symlink</div><div class='add'>+## ----------------------------------------------------------------------------</div><div class='add'>+###############################################################################</div><div class='add'>+</div><div class='add'>+OPTSPEC="volname:,version:,gd-workdir:,volume-op:"</div><div class='add'>+PROGNAME="Quota-xattr-heal-add-brick-pre"</div><div class='add'>+VOL_NAME=</div><div class='add'>+GLUSTERD_WORKDIR=</div><div class='add'>+VOLUME_OP=</div><div class='add'>+VERSION=</div><div class='add'>+ENABLED_NAME_PREFIX="S28"</div><div class='add'>+ENABLED_NAME="Quota-root-xattr-heal.sh"</div><div class='add'>+DISABLED_NAME="disabled-quota-root-xattr-heal.sh"</div><div class='add'>+</div><div class='add'>+activate ()</div><div class='add'>+{</div><div class='add'>+        ln -sf $DISABLED_STATE $1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+##------------------------------------------</div><div class='add'>+## Parse the arguments</div><div class='add'>+##------------------------------------------</div><div class='add'>+ARGS=$(getopt -o '' -l $OPTSPEC -n $PROGNAME -- "$@")</div><div class='add'>+eval set -- "$ARGS"</div><div class='add'>+</div><div class='add'>+while true;</div><div class='add'>+do</div><div class='add'>+    case $1 in</div><div class='add'>+        --volname)</div><div class='add'>+            shift</div><div class='add'>+            VOL_NAME=$1</div><div class='add'>+            ;;</div><div class='add'>+        --gd-workdir)</div><div class='add'>+            shift</div><div class='add'>+            GLUSTERD_WORKDIR=$1</div><div class='add'>+            ;;</div><div class='add'>+        --volume-op)</div><div class='add'>+            shift</div><div class='add'>+            VOLUME_OP=$1</div><div class='add'>+            ;;</div><div class='add'>+        --version)</div><div class='add'>+            shift</div><div class='add'>+            VERSION=$1</div><div class='add'>+            ;;</div><div class='add'>+        *)</div><div class='add'>+            shift</div><div class='add'>+            break</div><div class='add'>+            ;;</div><div class='add'>+    esac</div><div class='add'>+    shift</div><div class='add'>+done</div><div class='add'>+##----------------------------------------</div><div class='add'>+</div><div class='add'>+DISABLED_STATE="$GLUSTERD_WORKDIR/hooks/$VERSION/add-brick/post/$DISABLED_NAME"</div><div class='add'>+ENABLED_STATE_START="$GLUSTERD_WORKDIR/hooks/$VERSION/start/post/""$ENABLED_NAME_PREFIX$VOL_NAME""-""$ENABLED_NAME"</div><div class='add'>+ENABLED_STATE_ADD_BRICK="$GLUSTERD_WORKDIR/hooks/$VERSION/add-brick/post/""$ENABLED_NAME_PREFIX""$VOL_NAME""-""$ENABLED_NAME";</div><div class='add'>+</div><div class='add'>+## Why to proceed if the required script itself is not present?</div><div class='add'>+ls $DISABLED_STATE;</div><div class='add'>+if [ 0 -ne $? ]</div><div class='add'>+then</div><div class='add'>+        exit $?;</div><div class='add'>+fi</div><div class='add'>+</div><div class='add'>+## Is quota enabled?</div><div class='add'>+FLAG=`cat $GLUSTERD_WORKDIR/vols/$VOL_NAME/info | grep "^features.quota=" \</div><div class='add'>+      | awk -F'=' '{print $NF}'`;</div><div class='add'>+if [ "$FLAG" != "on" ]</div><div class='add'>+then</div><div class='add'>+        exit $EXIT_SUCCESS;</div><div class='add'>+fi</div><div class='add'>+</div><div class='add'>+## Is volume started?</div><div class='add'>+FLAG=`cat $GLUSTERD_WORKDIR/vols/$VOL_NAME/info | grep "^status=" \</div><div class='add'>+      | awk -F'=' '{print $NF}'`;</div><div class='add'>+if [ "$FLAG" != "1" ]</div><div class='add'>+then</div><div class='add'>+        activate $ENABLED_STATE_START;</div><div class='add'>+        exit $?</div><div class='add'>+fi</div><div class='add'>+</div><div class='add'>+activate $ENABLED_STATE_ADD_BRICK;</div><div class='add'>+exit $?</div><div class='head'>diff --git a/extras/hook-scripts/create/Makefile.am b/extras/hook-scripts/create/Makefile.am<br/>new file mode 100644<br/>index 00000000000..b083a9145d6<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/extras/hook-scripts/create/Makefile.am?id=d1d7a6f35c816822fab51c820e25023863c239c1'>extras/hook-scripts/create/Makefile.am</a></div><div class='hunk'>@@ -0,0 +1 @@</div><div class='add'>+SUBDIRS = post</div><div class='head'>diff --git a/extras/hook-scripts/create/post/Makefile.am b/extras/hook-scripts/create/post/Makefile.am<br/>new file mode 100644<br/>index 00000000000..fd1892e9589<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/extras/hook-scripts/create/post/Makefile.am?id=d1d7a6f35c816822fab51c820e25023863c239c1'>extras/hook-scripts/create/post/Makefile.am</a></div><div class='hunk'>@@ -0,0 +1,8 @@</div><div class='add'>+EXTRA_DIST = S10selinux-label-brick.sh</div><div class='add'>+</div><div class='add'>+scriptsdir = $(GLUSTERD_WORKDIR)/hooks/1/create/post/</div><div class='add'>+if WITH_SERVER</div><div class='add'>+if USE_SELINUX</div><div class='add'>+scripts_SCRIPTS = S10selinux-label-brick.sh</div><div class='add'>+endif</div><div class='add'>+endif</div><div class='head'>diff --git a/extras/hook-scripts/create/post/S10selinux-label-brick.sh b/extras/hook-scripts/create/post/S10selinux-label-brick.sh<br/>new file mode 100755<br/>index 00000000000..f9b4b1a57e3<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/extras/hook-scripts/create/post/S10selinux-label-brick.sh?id=d1d7a6f35c816822fab51c820e25023863c239c1'>extras/hook-scripts/create/post/S10selinux-label-brick.sh</a></div><div class='hunk'>@@ -0,0 +1,65 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+#</div><div class='add'>+# Install to hooks/&lt;HOOKS_VER&gt;/create/post</div><div class='add'>+#</div><div class='add'>+# Add an SELinux file context for each brick using the glusterd_brick_t type.</div><div class='add'>+# This ensures that the brick is relabeled correctly on an SELinux restart or</div><div class='add'>+# restore. Subsequently, run a restore on the brick path to set the selinux</div><div class='add'>+# labels.</div><div class='add'>+#</div><div class='add'>+###</div><div class='add'>+</div><div class='add'>+PROGNAME="Sselinux"</div><div class='add'>+OPTSPEC="volname:"</div><div class='add'>+VOL=</div><div class='add'>+</div><div class='add'>+parse_args () {</div><div class='add'>+  ARGS=$(getopt -o '' -l ${OPTSPEC} -n ${PROGNAME} -- "$@")</div><div class='add'>+  eval set -- "${ARGS}"</div><div class='add'>+</div><div class='add'>+  while true; do</div><div class='add'>+    case ${1} in</div><div class='add'>+      --volname)</div><div class='add'>+        shift</div><div class='add'>+        VOL=${1}</div><div class='add'>+      ;;</div><div class='add'>+      *)</div><div class='add'>+        shift</div><div class='add'>+        break</div><div class='add'>+      ;;</div><div class='add'>+    esac</div><div class='add'>+    shift</div><div class='add'>+  done</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+set_brick_labels()</div><div class='add'>+{</div><div class='add'>+  volname="${1}"</div><div class='add'>+</div><div class='add'>+  # grab the path for each local brick</div><div class='add'>+  brickpath="/var/lib/glusterd/vols/${volname}/bricks/"</div><div class='add'>+  brickdirs=$(</div><div class='add'>+    find "${brickpath}" -type f -exec grep '^path=' {} \; | \</div><div class='add'>+    cut -d= -f 2 | \</div><div class='add'>+    sort -u</div><div class='add'>+  )</div><div class='add'>+</div><div class='add'>+  for b in ${brickdirs}; do</div><div class='add'>+    # Add a file context for each brick path and associate with the</div><div class='add'>+    # glusterd_brick_t SELinux type.</div><div class='add'>+    pattern="${b}(/.*)?"</div><div class='add'>+    semanage fcontext --add -t glusterd_brick_t -r s0 "${pattern}"</div><div class='add'>+    # Set the labels on the new brick path.</div><div class='add'>+    restorecon -R "${b}"</div><div class='add'>+  done</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+SELINUX_STATE=$(which getenforce &amp;&amp; getenforce)</div><div class='add'>+[ "${SELINUX_STATE}" = 'Disabled' ] &amp;&amp; exit 0</div><div class='add'>+</div><div class='add'>+parse_args "$@"</div><div class='add'>+[ -z "${VOL}" ] &amp;&amp; exit 1</div><div class='add'>+</div><div class='add'>+set_brick_labels "${VOL}"</div><div class='add'>+</div><div class='add'>+exit 0</div><div class='head'>diff --git a/extras/hook-scripts/delete/Makefile.am b/extras/hook-scripts/delete/Makefile.am<br/>new file mode 100644<br/>index 00000000000..c98a05d9205<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/extras/hook-scripts/delete/Makefile.am?id=d1d7a6f35c816822fab51c820e25023863c239c1'>extras/hook-scripts/delete/Makefile.am</a></div><div class='hunk'>@@ -0,0 +1 @@</div><div class='add'>+SUBDIRS = pre</div><div class='head'>diff --git a/extras/hook-scripts/delete/pre/Makefile.am b/extras/hook-scripts/delete/pre/Makefile.am<br/>new file mode 100644<br/>index 00000000000..4fbfbe7311f<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/extras/hook-scripts/delete/pre/Makefile.am?id=d1d7a6f35c816822fab51c820e25023863c239c1'>extras/hook-scripts/delete/pre/Makefile.am</a></div><div class='hunk'>@@ -0,0 +1,8 @@</div><div class='add'>+EXTRA_DIST = S10selinux-del-fcontext.sh</div><div class='add'>+</div><div class='add'>+scriptsdir = $(GLUSTERD_WORKDIR)/hooks/1/delete/pre/</div><div class='add'>+if WITH_SERVER</div><div class='add'>+if USE_SELINUX</div><div class='add'>+scripts_SCRIPTS = S10selinux-del-fcontext.sh</div><div class='add'>+endif</div><div class='add'>+endif</div><div class='head'>diff --git a/extras/hook-scripts/delete/pre/S10selinux-del-fcontext.sh b/extras/hook-scripts/delete/pre/S10selinux-del-fcontext.sh<br/>new file mode 100755<br/>index 00000000000..056b52afe76<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/extras/hook-scripts/delete/pre/S10selinux-del-fcontext.sh?id=d1d7a6f35c816822fab51c820e25023863c239c1'>extras/hook-scripts/delete/pre/S10selinux-del-fcontext.sh</a></div><div class='hunk'>@@ -0,0 +1,73 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+#</div><div class='add'>+# Install to hooks/&lt;HOOKS_VER&gt;/delete/pre</div><div class='add'>+#</div><div class='add'>+# Delete the file context associated with the brick path on volume deletion. The</div><div class='add'>+# associated file context was added during volume creation.</div><div class='add'>+#</div><div class='add'>+# We do not explicitly relabel the brick, as this could be time consuming and</div><div class='add'>+# unnecessary.</div><div class='add'>+#</div><div class='add'>+###</div><div class='add'>+</div><div class='add'>+PROGNAME="Sselinux"</div><div class='add'>+OPTSPEC="volname:"</div><div class='add'>+VOL=</div><div class='add'>+</div><div class='add'>+function parse_args () {</div><div class='add'>+  ARGS=$(getopt -o '' -l ${OPTSPEC} -n ${PROGNAME} -- "$@")</div><div class='add'>+  eval set -- "${ARGS}"</div><div class='add'>+</div><div class='add'>+  while true; do</div><div class='add'>+    case ${1} in</div><div class='add'>+      --volname)</div><div class='add'>+        shift</div><div class='add'>+        VOL=${1}</div><div class='add'>+      ;;</div><div class='add'>+      *)</div><div class='add'>+        shift</div><div class='add'>+        break</div><div class='add'>+      ;;</div><div class='add'>+    esac</div><div class='add'>+    shift</div><div class='add'>+  done</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function delete_brick_fcontext()</div><div class='add'>+{</div><div class='add'>+  local volname=$1</div><div class='add'>+  local fctx</div><div class='add'>+  local list=()</div><div class='add'>+</div><div class='add'>+  fctx="$(semanage fcontext --list -C)"</div><div class='add'>+  # grab the path for each local brick</div><div class='add'>+  brickpath="/var/lib/glusterd/vols/${volname}/bricks/"</div><div class='add'>+  brickdirs=$(find "${brickpath}" -type f -exec grep '^path=' {} \; | \</div><div class='add'>+    cut -d= -f 2 | sort -u)</div><div class='add'>+  for b in ${brickdirs}</div><div class='add'>+  do</div><div class='add'>+    pattern="${b}(/.*)?"</div><div class='add'>+    echo "${fctx}" | grep "^${pattern}\s" &gt;/dev/null</div><div class='add'>+    if [[ $? -eq 0 ]]; then</div><div class='add'>+      list+=("${pattern}")</div><div class='add'>+    fi</div><div class='add'>+  done</div><div class='add'>+  if [[ ${#list[@]} -gt 0 ]]; then</div><div class='add'>+    printf 'fcontext --delete %s\n' "${list[@]}" | semanage -i -</div><div class='add'>+  fi</div><div class='add'>+  for b in ${brickdirs}</div><div class='add'>+  do</div><div class='add'>+    restorecon -R "${b}"</div><div class='add'>+  done</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+SELINUX_STATE=$(which getenforce &amp;&amp; getenforce)</div><div class='add'>+[ "${SELINUX_STATE}" = 'Disabled' ] &amp;&amp; exit 0</div><div class='add'>+</div><div class='add'>+parse_args "$@"</div><div class='add'>+[ -z "${VOL}" ] &amp;&amp; exit 1</div><div class='add'>+</div><div class='add'>+delete_brick_fcontext "${VOL}"</div><div class='add'>+</div><div class='add'>+# failure to delete the fcontext is not fatal</div><div class='add'>+exit 0</div><div class='head'>diff --git a/extras/hook-scripts/reset/Makefile.am b/extras/hook-scripts/reset/Makefile.am<br/>new file mode 100644<br/>index 00000000000..6e2701e909e<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/extras/hook-scripts/reset/Makefile.am?id=d1d7a6f35c816822fab51c820e25023863c239c1'>extras/hook-scripts/reset/Makefile.am</a></div><div class='hunk'>@@ -0,0 +1,2 @@</div><div class='add'>+SUBDIRS = post pre</div><div class='add'>+CLEANFILES =</div><div class='head'>diff --git a/extras/hook-scripts/reset/post/Makefile.am b/extras/hook-scripts/reset/post/Makefile.am<br/>new file mode 100644<br/>index 00000000000..1b336ac1a85<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/extras/hook-scripts/reset/post/Makefile.am?id=d1d7a6f35c816822fab51c820e25023863c239c1'>extras/hook-scripts/reset/post/Makefile.am</a></div><div class='hunk'>@@ -0,0 +1 @@</div><div class='add'>+EXTRA_DIST =</div><div class='head'>diff --git a/extras/hook-scripts/reset/pre/Makefile.am b/extras/hook-scripts/reset/pre/Makefile.am<br/>new file mode 100644<br/>index 00000000000..1b336ac1a85<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/extras/hook-scripts/reset/pre/Makefile.am?id=d1d7a6f35c816822fab51c820e25023863c239c1'>extras/hook-scripts/reset/pre/Makefile.am</a></div><div class='hunk'>@@ -0,0 +1 @@</div><div class='add'>+EXTRA_DIST =</div><div class='head'>diff --git a/extras/hook-scripts/set/Makefile.am b/extras/hook-scripts/set/Makefile.am<br/>new file mode 100644<br/>index 00000000000..1fcade4b07f<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/extras/hook-scripts/set/Makefile.am?id=d1d7a6f35c816822fab51c820e25023863c239c1'>extras/hook-scripts/set/Makefile.am</a></div><div class='hunk'>@@ -0,0 +1,2 @@</div><div class='add'>+SUBDIRS = post</div><div class='add'>+CLEANFILES =</div><div class='head'>diff --git a/extras/hook-scripts/set/post/Makefile.am b/extras/hook-scripts/set/post/Makefile.am<br/>new file mode 100644<br/>index 00000000000..506a25a8666<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/extras/hook-scripts/set/post/Makefile.am?id=d1d7a6f35c816822fab51c820e25023863c239c1'>extras/hook-scripts/set/post/Makefile.am</a></div><div class='hunk'>@@ -0,0 +1,6 @@</div><div class='add'>+EXTRA_DIST = S30samba-set.sh S32gluster_enable_shared_storage.sh</div><div class='add'>+</div><div class='add'>+hookdir = $(GLUSTERD_WORKDIR)/hooks/1/set/post/</div><div class='add'>+if WITH_SERVER</div><div class='add'>+hook_SCRIPTS = $(EXTRA_DIST)</div><div class='add'>+endif</div><div class='head'>diff --git a/extras/hook-scripts/set/post/S30samba-set.sh b/extras/hook-scripts/set/post/S30samba-set.sh<br/>new file mode 100755<br/>index 00000000000..854f131f6c8<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/extras/hook-scripts/set/post/S30samba-set.sh?id=d1d7a6f35c816822fab51c820e25023863c239c1'>extras/hook-scripts/set/post/S30samba-set.sh</a></div><div class='hunk'>@@ -0,0 +1,161 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+#Need to be copied to hooks/&lt;HOOKS_VER&gt;/set/post/</div><div class='add'>+</div><div class='add'>+#TODO: All gluster and samba paths are assumed for fedora like systems.</div><div class='add'>+#Some efforts are required to make it work on other distros.</div><div class='add'>+</div><div class='add'>+#The preferred way of creating a smb share of a gluster volume has changed.</div><div class='add'>+#The old method was to create a fuse mount of the volume and share the mount</div><div class='add'>+#point through samba.</div><div class='add'>+#</div><div class='add'>+#New method eliminates the requirement of fuse mount and changes in fstab.</div><div class='add'>+#glusterfs_vfs plugin for samba makes call to libgfapi to access the volume.</div><div class='add'>+#</div><div class='add'>+#This hook script enables user to enable or disable smb share by volume set</div><div class='add'>+#option. Keys "user.cifs" and "user.smb" both are valid, but user.smb is</div><div class='add'>+#preferred.</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+PROGNAME="Ssamba-set"</div><div class='add'>+OPTSPEC="volname:,gd-workdir:"</div><div class='add'>+VOL=</div><div class='add'>+CONFIGFILE=</div><div class='add'>+LOGFILEBASE=</div><div class='add'>+PIDDIR=</div><div class='add'>+GLUSTERD_WORKDIR=</div><div class='add'>+USERSMB_SET=""</div><div class='add'>+USERCIFS_SET=""</div><div class='add'>+</div><div class='add'>+function parse_args () {</div><div class='add'>+        ARGS=$(getopt -o 'o:' -l $OPTSPEC -n $PROGNAME -- "$@")</div><div class='add'>+        eval set -- "$ARGS"</div><div class='add'>+</div><div class='add'>+        while true; do</div><div class='add'>+            case $1 in</div><div class='add'>+                --volname)</div><div class='add'>+                    shift</div><div class='add'>+                    VOL=$1</div><div class='add'>+                    ;;</div><div class='add'>+                --gd-workdir)</div><div class='add'>+                    shift</div><div class='add'>+                    GLUSTERD_WORKDIR=$1</div><div class='add'>+                    ;;</div><div class='add'>+                --)</div><div class='add'>+                    shift</div><div class='add'>+                    break</div><div class='add'>+                    ;;</div><div class='add'>+                -o)</div><div class='add'>+                    shift</div><div class='add'>+                        read key value &lt; &lt;(echo "$1" | tr "=" " ")</div><div class='add'>+                        case "$key" in</div><div class='add'>+                            "user.cifs")</div><div class='add'>+                                USERCIFS_SET="YES"</div><div class='add'>+                                ;;</div><div class='add'>+                            "user.smb")</div><div class='add'>+                                USERSMB_SET="YES"</div><div class='add'>+                                ;;</div><div class='add'>+                            *)</div><div class='add'>+                                ;;</div><div class='add'>+                        esac</div><div class='add'>+                    ;;</div><div class='add'>+                *)</div><div class='add'>+                    shift</div><div class='add'>+                    break</div><div class='add'>+                    ;;</div><div class='add'>+            esac</div><div class='add'>+            shift</div><div class='add'>+        done</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function find_config_info () {</div><div class='add'>+        cmdout=`smbd -b | grep smb.conf`</div><div class='add'>+        if [ $? -ne 0 ]; then</div><div class='add'>+                echo "Samba is not installed"</div><div class='add'>+                exit 1</div><div class='add'>+        fi</div><div class='add'>+        CONFIGFILE=`echo $cmdout | awk '{print $2}'`</div><div class='add'>+        PIDDIR=`smbd -b | grep PIDDIR | awk '{print $2}'`</div><div class='add'>+        LOGFILEBASE=`smbd -b | grep 'LOGFILEBASE' | awk '{print $2}'`</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function add_samba_share () {</div><div class='add'>+        volname=$1</div><div class='add'>+        STRING="\n[gluster-$volname]\n"</div><div class='add'>+        STRING+="comment = For samba share of volume $volname\n"</div><div class='add'>+        STRING+="vfs objects = glusterfs\n"</div><div class='add'>+        STRING+="glusterfs:volume = $volname\n"</div><div class='add'>+        STRING+="glusterfs:logfile = $LOGFILEBASE/glusterfs-$volname.%%M.log\n"</div><div class='add'>+        STRING+="glusterfs:loglevel = 7\n"</div><div class='add'>+        STRING+="path = /\n"</div><div class='add'>+        STRING+="read only = no\n"</div><div class='add'>+        STRING+="kernel share modes = no\n"</div><div class='add'>+        printf "$STRING"  &gt;&gt; ${CONFIGFILE}</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function sighup_samba () {</div><div class='add'>+        pid=`cat ${PIDDIR}/smbd.pid`</div><div class='add'>+        if [ "x$pid" != "x" ]</div><div class='add'>+        then</div><div class='add'>+                kill -HUP "$pid";</div><div class='add'>+        else</div><div class='add'>+                service smb condrestart</div><div class='add'>+        fi</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function deactivate_samba_share () {</div><div class='add'>+        volname=$1</div><div class='add'>+        sed -i -e '/^\[gluster-'"$volname"'\]/{ :a' -e 'n; /available = no/H; /^$/!{$!ba;}; x; /./!{ s/^/available = no/; $!{G;x}; $H; }; s/.*//; x; };' ${CONFIGFILE}</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function is_volume_started () {</div><div class='add'>+        volname=$1</div><div class='add'>+        echo "$(grep status $GLUSTERD_WORKDIR/vols/"$volname"/info |\</div><div class='add'>+                cut -d"=" -f2)"</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function get_smb () {</div><div class='add'>+        volname=$1</div><div class='add'>+        uservalue=</div><div class='add'>+</div><div class='add'>+        usercifsvalue=$(grep user.cifs $GLUSTERD_WORKDIR/vols/"$volname"/info |\</div><div class='add'>+                        cut -d"=" -f2)</div><div class='add'>+        usersmbvalue=$(grep user.smb $GLUSTERD_WORKDIR/vols/"$volname"/info |\</div><div class='add'>+                       cut -d"=" -f2)</div><div class='add'>+</div><div class='add'>+        if [ -n "$usercifsvalue" ]; then</div><div class='add'>+                if [ "$usercifsvalue" = "disable" ] || [ "$usercifsvalue" = "off" ]; then</div><div class='add'>+                        uservalue="disable"</div><div class='add'>+                fi</div><div class='add'>+        fi</div><div class='add'>+</div><div class='add'>+        if [ -n "$usersmbvalue" ]; then</div><div class='add'>+                if [ "$usersmbvalue" = "disable" ] || [ "$usersmbvalue" = "off" ]; then</div><div class='add'>+                        uservalue="disable"</div><div class='add'>+                fi</div><div class='add'>+        fi</div><div class='add'>+</div><div class='add'>+        echo "$uservalue"</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+parse_args "$@"</div><div class='add'>+if [ "0" = "$(is_volume_started "$VOL")" ]; then</div><div class='add'>+    exit 0</div><div class='add'>+fi</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+if [ "$USERCIFS_SET" = "YES" ] || [ "$USERSMB_SET" = "YES" ]; then</div><div class='add'>+    #Find smb.conf, smbd pid directory and smbd logfile path</div><div class='add'>+    find_config_info</div><div class='add'>+</div><div class='add'>+    if [ "$(get_smb "$VOL")" = "disable" ]; then</div><div class='add'>+        deactivate_samba_share $VOL</div><div class='add'>+    else</div><div class='add'>+        if ! grep --quiet "\[gluster-$VOL\]" ${CONFIGFILE} ; then</div><div class='add'>+            add_samba_share $VOL</div><div class='add'>+        else</div><div class='add'>+            sed -i '/\[gluster-'"$VOL"'\]/,/^$/!b;/available = no/d' ${CONFIGFILE}</div><div class='add'>+        fi</div><div class='add'>+    fi</div><div class='add'>+    sighup_samba</div><div class='add'>+fi</div><div class='head'>diff --git a/extras/hook-scripts/set/post/S32gluster_enable_shared_storage.sh b/extras/hook-scripts/set/post/S32gluster_enable_shared_storage.sh<br/>new file mode 100755<br/>index 00000000000..1f2564b44ff<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/extras/hook-scripts/set/post/S32gluster_enable_shared_storage.sh?id=d1d7a6f35c816822fab51c820e25023863c239c1'>extras/hook-scripts/set/post/S32gluster_enable_shared_storage.sh</a></div><div class='hunk'>@@ -0,0 +1,136 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+key=`echo $3 | cut -d '=' -f 1`</div><div class='add'>+val=`echo $3 | cut -d '=' -f 2`</div><div class='add'>+if [ "$key" != "cluster.enable-shared-storage" ] &amp;&amp; [ "$key" != "enable-shared-storage" ]; then</div><div class='add'>+    exit;</div><div class='add'>+fi</div><div class='add'>+if [ "$val" != 'enable' ]; then</div><div class='add'>+    if [ "$val" != 'disable' ]; then</div><div class='add'>+        exit;</div><div class='add'>+    fi</div><div class='add'>+fi</div><div class='add'>+</div><div class='add'>+option=$val</div><div class='add'>+</div><div class='add'>+key_val_pair1=`echo $4 | cut -d ',' -f 1`</div><div class='add'>+key_val_pair2=`echo $4 | cut -d ',' -f 2`</div><div class='add'>+</div><div class='add'>+key=`echo $key_val_pair1 | cut -d '=' -f 1`</div><div class='add'>+val=`echo $key_val_pair1 | cut -d '=' -f 2`</div><div class='add'>+if [ "$key" != "is_originator" ]; then</div><div class='add'>+    exit;</div><div class='add'>+fi</div><div class='add'>+is_originator=$val;</div><div class='add'>+</div><div class='add'>+key=`echo $key_val_pair2 | cut -d '=' -f 1`</div><div class='add'>+val=`echo $key_val_pair2 | cut -d '=' -f 2`</div><div class='add'>+if [ "$key" != "local_node_hostname" ]; then</div><div class='add'>+    exit;</div><div class='add'>+fi</div><div class='add'>+local_node_hostname=$val;</div><div class='add'>+</div><div class='add'>+# Read gluster peer status to find the peers</div><div class='add'>+# which are in 'Peer in Cluster' mode and</div><div class='add'>+# are connected.</div><div class='add'>+</div><div class='add'>+number_of_connected_peers=0</div><div class='add'>+while read -r line</div><div class='add'>+do</div><div class='add'>+    # Already got two connected peers. Including the current node</div><div class='add'>+    # we have 3 peers which is enough to create a shared storage</div><div class='add'>+    # with replica 3</div><div class='add'>+    if [ "$number_of_connected_peers" == "2" ]; then</div><div class='add'>+        break;</div><div class='add'>+    fi</div><div class='add'>+</div><div class='add'>+    key=`echo $line | cut -d ':' -f 1`</div><div class='add'>+    if [ "$key" == "Hostname" ]; then</div><div class='add'>+        hostname=`echo $line | cut -d ':' -f 2 | xargs`</div><div class='add'>+    fi</div><div class='add'>+</div><div class='add'>+    if [ "$key" == "State" ]; then</div><div class='add'>+        peer_state=`echo $line | cut -d ':' -f 2 | cut -d '(' -f 1 | xargs`</div><div class='add'>+        conn_state=`echo $line | cut -d '(' -f 2 | cut -d ')' -f 1 | xargs`</div><div class='add'>+</div><div class='add'>+        if [ "$peer_state" == "Peer in Cluster" ]; then</div><div class='add'>+            if [ "$conn_state" == "Connected" ]; then</div><div class='add'>+                ((number_of_connected_peers++))</div><div class='add'>+                connected_peer[$number_of_connected_peers]=$hostname</div><div class='add'>+            fi</div><div class='add'>+        fi</div><div class='add'>+    fi</div><div class='add'>+</div><div class='add'>+done &lt; &lt;(gluster peer status)</div><div class='add'>+</div><div class='add'>+# Include current node in connected peer list</div><div class='add'>+((number_of_connected_peers++))</div><div class='add'>+connected_peer[$number_of_connected_peers]=$local_node_hostname</div><div class='add'>+</div><div class='add'>+# forming the create vol command</div><div class='add'>+create_cmd="gluster --mode=script --wignore volume create \</div><div class='add'>+            gluster_shared_storage replica $number_of_connected_peers"</div><div class='add'>+</div><div class='add'>+# Adding the brick names in the command</div><div class='add'>+for i in "${connected_peer[@]}"</div><div class='add'>+do</div><div class='add'>+    create_cmd=$create_cmd" "$i:"$GLUSTERD_WORKDIR"/ss_brick</div><div class='add'>+done</div><div class='add'>+</div><div class='add'>+if [ "$option" == "disable" ]; then</div><div class='add'>+    # Unmount the volume on all the nodes</div><div class='add'>+    umount /run/gluster/shared_storage</div><div class='add'>+    cat /etc/fstab  | grep -v "gluster_shared_storage /run/gluster/shared_storage/" &gt; /run/gluster/fstab.tmp</div><div class='add'>+    mv /run/gluster/fstab.tmp /etc/fstab</div><div class='add'>+fi</div><div class='add'>+</div><div class='add'>+if [ "$is_originator" == 1 ]; then</div><div class='add'>+    if [ "$option" == "enable" ]; then</div><div class='add'>+        # Create and start the volume</div><div class='add'>+        $create_cmd</div><div class='add'>+        gluster --mode=script --wignore volume start gluster_shared_storage</div><div class='add'>+    fi</div><div class='add'>+</div><div class='add'>+    if [ "$option" == "disable" ]; then</div><div class='add'>+        # Stop and delete the volume</div><div class='add'>+        gluster --mode=script --wignore volume stop gluster_shared_storage</div><div class='add'>+        gluster --mode=script --wignore volume delete gluster_shared_storage</div><div class='add'>+    fi</div><div class='add'>+fi</div><div class='add'>+</div><div class='add'>+function check_volume_status()</div><div class='add'>+{</div><div class='add'>+    status=`gluster volume info gluster_shared_storage  | grep Status | cut -d ':' -f 2 | xargs`</div><div class='add'>+    echo $status</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+key=`echo $5 | cut -d '=' -f 1`</div><div class='add'>+val=`echo $5 | cut -d '=' -f 2`</div><div class='add'>+if [ "$key" == "transport.address-family" ]; then</div><div class='add'>+    mount_cmd="mount -t glusterfs -o xlator-option=transport.address-family=inet6 \</div><div class='add'>+               $local_node_hostname:/gluster_shared_storage /run/gluster/shared_storage"</div><div class='add'>+else</div><div class='add'>+    mount_cmd="mount -t glusterfs $local_node_hostname:/gluster_shared_storage \</div><div class='add'>+           /run/gluster/shared_storage"</div><div class='add'>+fi</div><div class='add'>+</div><div class='add'>+if [ "$option" == "enable" ]; then</div><div class='add'>+    retry=0;</div><div class='add'>+    # Wait for volume to start before mounting</div><div class='add'>+    status=$(check_volume_status)</div><div class='add'>+    while [ "$status" != "Started" ]; do</div><div class='add'>+        sleep 5;</div><div class='add'>+        ((retry++))</div><div class='add'>+        if [ "$retry" == 3 ]; then</div><div class='add'>+            break;</div><div class='add'>+        fi</div><div class='add'>+        status=$(check_volume_status)</div><div class='add'>+    done</div><div class='add'>+    # Mount the volume on all the nodes</div><div class='add'>+    umount /run/gluster/shared_storage</div><div class='add'>+    mkdir -p /run/gluster/shared_storage</div><div class='add'>+    $mount_cmd</div><div class='add'>+    cp /etc/fstab /run/gluster/fstab.tmp</div><div class='add'>+    echo "$local_node_hostname:/gluster_shared_storage /run/gluster/shared_storage/ glusterfs defaults        0 0" &gt;&gt; /run/gluster/fstab.tmp</div><div class='add'>+    mv /run/gluster/fstab.tmp /etc/fstab</div><div class='add'>+fi</div><div class='head'>diff --git a/extras/hook-scripts/start/Makefile.am b/extras/hook-scripts/start/Makefile.am<br/>new file mode 100644<br/>index 00000000000..1fcade4b07f<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/extras/hook-scripts/start/Makefile.am?id=d1d7a6f35c816822fab51c820e25023863c239c1'>extras/hook-scripts/start/Makefile.am</a></div><div class='hunk'>@@ -0,0 +1,2 @@</div><div class='add'>+SUBDIRS = post</div><div class='add'>+CLEANFILES =</div><div class='head'>diff --git a/extras/hook-scripts/start/post/Makefile.am b/extras/hook-scripts/start/post/Makefile.am<br/>new file mode 100644<br/>index 00000000000..792019d3c9f<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/extras/hook-scripts/start/post/Makefile.am?id=d1d7a6f35c816822fab51c820e25023863c239c1'>extras/hook-scripts/start/post/Makefile.am</a></div><div class='hunk'>@@ -0,0 +1,6 @@</div><div class='add'>+EXTRA_DIST = S29CTDBsetup.sh S30samba-start.sh S31ganesha-start.sh</div><div class='add'>+</div><div class='add'>+hookdir = $(GLUSTERD_WORKDIR)/hooks/1/start/post/</div><div class='add'>+if WITH_SERVER</div><div class='add'>+hook_SCRIPTS = $(EXTRA_DIST)</div><div class='add'>+endif</div><div class='head'>diff --git a/extras/hook-scripts/start/post/S29CTDBsetup.sh b/extras/hook-scripts/start/post/S29CTDBsetup.sh<br/>new file mode 100755<br/>index 00000000000..69a0d89a3eb<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/extras/hook-scripts/start/post/S29CTDBsetup.sh?id=d1d7a6f35c816822fab51c820e25023863c239c1'>extras/hook-scripts/start/post/S29CTDBsetup.sh</a></div><div class='hunk'>@@ -0,0 +1,84 @@</div><div class='add'>+#! /bin/bash</div><div class='add'>+#</div><div class='add'>+# - The script mounts the 'meta-vol' on start 'event' on a known</div><div class='add'>+#   directory (eg. /gluster/lock)</div><div class='add'>+# - P.S: There are other 'tasks' that need to be done outside this script</div><div class='add'>+#   to get CTDB based failover up and running.</div><div class='add'>+</div><div class='add'>+CTDB_MNT=/gluster/lock</div><div class='add'>+# Make sure ping-timeout is not default for CTDB volume</div><div class='add'>+PING_TIMEOUT_SECS=10</div><div class='add'>+PROGNAME="ctdb"</div><div class='add'>+OPTSPEC="volname:,gd-workdir:,version:,volume-op:,first:"</div><div class='add'>+HOSTNAME=`hostname`</div><div class='add'>+MNTOPTS="_netdev,transport=tcp,xlator-option=*client*.ping-timeout=${PING_TIMEOUT_SECS}"</div><div class='add'>+VOL=</div><div class='add'>+GLUSTERD_WORKDIR=</div><div class='add'>+VERSION=</div><div class='add'>+VOLUME_OP=</div><div class='add'>+FIRST=</div><div class='add'>+# $META is the volume that will be used by CTDB as a shared filesystem.</div><div class='add'>+# It is not desirable to use this volume for storing 'data' as well.</div><div class='add'>+# META is set to 'all' (viz. a keyword and hence not a legal volume name)</div><div class='add'>+# to prevent the script from running for volumes it was not intended.</div><div class='add'>+# User needs to set META to the volume that serves CTDB lockfile.</div><div class='add'>+META="all"</div><div class='add'>+</div><div class='add'>+function parse_args () {</div><div class='add'>+        ARGS=$(getopt -o '' -l $OPTSPEC -n $PROGNAME -- "$@")</div><div class='add'>+        eval set -- "$ARGS"</div><div class='add'>+</div><div class='add'>+        while true; do</div><div class='add'>+            case $1 in</div><div class='add'>+                --volname)</div><div class='add'>+                    shift</div><div class='add'>+                    VOL=$1</div><div class='add'>+                    ;;</div><div class='add'>+                --gd-workdir)</div><div class='add'>+                    shift</div><div class='add'>+                    GLUSTERD_WORKDIR=$1</div><div class='add'>+                    ;;</div><div class='add'>+                --version)</div><div class='add'>+                    shift</div><div class='add'>+                    VERSION=$1</div><div class='add'>+                    ;;</div><div class='add'>+                --volume-op)</div><div class='add'>+                    shift</div><div class='add'>+                    VOLUME_OP=$1</div><div class='add'>+                    ;;</div><div class='add'>+                --first)</div><div class='add'>+                    shift</div><div class='add'>+                    FIRST=$1</div><div class='add'>+                    ;;</div><div class='add'>+                *)</div><div class='add'>+                    shift</div><div class='add'>+                    break</div><div class='add'>+                    ;;</div><div class='add'>+            esac</div><div class='add'>+</div><div class='add'>+            shift</div><div class='add'>+        done</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function add_fstab_entry () {</div><div class='add'>+        volname=$1</div><div class='add'>+        mntpt=$2</div><div class='add'>+        mntopts="${MNTOPTS}"</div><div class='add'>+</div><div class='add'>+        mntent="${HOSTNAME}:/${volname} ${mntpt} glusterfs ${mntopts} 0 0"</div><div class='add'>+        exists=`grep "${mntpt}" /etc/fstab`</div><div class='add'>+        if [ "$exists" == "" ]</div><div class='add'>+        then</div><div class='add'>+            echo "${mntent}" &gt;&gt; /etc/fstab</div><div class='add'>+        fi</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+parse_args "$@"</div><div class='add'>+if [ "$META" = "$VOL" ]</div><div class='add'>+then</div><div class='add'>+        mkdir -p $CTDB_MNT</div><div class='add'>+        sleep 5</div><div class='add'>+        mount -t glusterfs -o${MNTOPTS} ${HOSTNAME}:/$VOL "$CTDB_MNT" &amp;&amp; \</div><div class='add'>+            add_fstab_entry $VOL $CTDB_MNT</div><div class='add'>+        chkconfig ctdb on</div><div class='add'>+fi</div><div class='head'>diff --git a/extras/hook-scripts/start/post/S30samba-start.sh b/extras/hook-scripts/start/post/S30samba-start.sh<br/>new file mode 100755<br/>index 00000000000..cac0cbf1464<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/extras/hook-scripts/start/post/S30samba-start.sh?id=d1d7a6f35c816822fab51c820e25023863c239c1'>extras/hook-scripts/start/post/S30samba-start.sh</a></div><div class='hunk'>@@ -0,0 +1,145 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+#Need to be copied to hooks/&lt;HOOKS_VER&gt;/start/post</div><div class='add'>+</div><div class='add'>+#TODO: All gluster and samba paths are assumed for fedora like systems.</div><div class='add'>+#Some efforts are required to make it work on other distros.</div><div class='add'>+</div><div class='add'>+#The preferred way of creating a smb share of a gluster volume has changed.</div><div class='add'>+#The old method was to create a fuse mount of the volume and share the mount</div><div class='add'>+#point through samba.</div><div class='add'>+#</div><div class='add'>+#New method eliminates the requirement of fuse mount and changes in fstab.</div><div class='add'>+#glusterfs_vfs plugin for samba makes call to libgfapi to access the volume.</div><div class='add'>+#</div><div class='add'>+#This hook script automagically creates shares for volume on every volume start</div><div class='add'>+#event by adding the entries in smb.conf file and sending SIGHUP to samba.</div><div class='add'>+#</div><div class='add'>+#In smb.conf:</div><div class='add'>+#glusterfs vfs plugin has to be specified as required vfs object.</div><div class='add'>+#Path value is relative to the root of gluster volume;"/" signifies complete</div><div class='add'>+#volume.</div><div class='add'>+</div><div class='add'>+PROGNAME="Ssamba-start"</div><div class='add'>+OPTSPEC="volname:,gd-workdir:,version:,volume-op:,first:"</div><div class='add'>+VOL=</div><div class='add'>+CONFIGFILE=</div><div class='add'>+LOGFILEBASE=</div><div class='add'>+PIDDIR=</div><div class='add'>+GLUSTERD_WORKDIR=</div><div class='add'>+VERSION=</div><div class='add'>+VOLUME_OP=</div><div class='add'>+FIRST=</div><div class='add'>+</div><div class='add'>+function parse_args () {</div><div class='add'>+        ARGS=$(getopt -o '' -l $OPTSPEC -n $PROGNAME -- "$@")</div><div class='add'>+        eval set -- "$ARGS"</div><div class='add'>+</div><div class='add'>+        while true; do</div><div class='add'>+            case $1 in</div><div class='add'>+                --volname)</div><div class='add'>+                    shift</div><div class='add'>+                    VOL=$1</div><div class='add'>+                    ;;</div><div class='add'>+                --gd-workdir)</div><div class='add'>+                    shift</div><div class='add'>+                    GLUSTERD_WORKDIR=$1</div><div class='add'>+                    ;;</div><div class='add'>+                --version)</div><div class='add'>+                    shift</div><div class='add'>+                    VERSION=$1</div><div class='add'>+                    ;;</div><div class='add'>+                --volume-op)</div><div class='add'>+                    shift</div><div class='add'>+                    VOLUME_OP=$1</div><div class='add'>+                    ;;</div><div class='add'>+                --first)</div><div class='add'>+                    shift</div><div class='add'>+                    FIRST=$1</div><div class='add'>+                    ;;</div><div class='add'>+                *)</div><div class='add'>+                    shift</div><div class='add'>+                    break</div><div class='add'>+                    ;;</div><div class='add'>+            esac</div><div class='add'>+</div><div class='add'>+            shift</div><div class='add'>+        done</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function find_config_info () {</div><div class='add'>+        cmdout=$(smbd -b 2&gt; /dev/null)</div><div class='add'>+        CONFIGFILE=$(echo "$cmdout" | grep CONFIGFILE | awk '{print $2}')</div><div class='add'>+        if [ -z "$CONFIGFILE" ]; then</div><div class='add'>+                echo "Samba is not installed"</div><div class='add'>+                exit 1</div><div class='add'>+        fi</div><div class='add'>+        PIDDIR=$(echo "$cmdout" | grep PIDDIR | awk '{print $2}')</div><div class='add'>+        LOGFILEBASE=$(echo "$cmdout" | grep 'LOGFILEBASE' | awk '{print $2}')</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function add_samba_share () {</div><div class='add'>+        volname=$1</div><div class='add'>+        STRING="\n[gluster-$volname]\n"</div><div class='add'>+        STRING+="comment = For samba share of volume $volname\n"</div><div class='add'>+        STRING+="vfs objects = glusterfs\n"</div><div class='add'>+        STRING+="glusterfs:volume = $volname\n"</div><div class='add'>+        STRING+="glusterfs:logfile = $LOGFILEBASE/glusterfs-$volname.%%M.log\n"</div><div class='add'>+        STRING+="glusterfs:loglevel = 7\n"</div><div class='add'>+        STRING+="path = /\n"</div><div class='add'>+        STRING+="read only = no\n"</div><div class='add'>+        STRING+="kernel share modes = no\n"</div><div class='add'>+        printf "$STRING"  &gt;&gt; "${CONFIGFILE}"</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function sighup_samba () {</div><div class='add'>+        pid=$(cat "${PIDDIR}/smbd.pid" 2&gt; /dev/null)</div><div class='add'>+        if [ "x$pid" != "x" ]</div><div class='add'>+        then</div><div class='add'>+                kill -HUP "$pid";</div><div class='add'>+        else</div><div class='add'>+                service smb condrestart</div><div class='add'>+        fi</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function get_smb () {</div><div class='add'>+        volname=$1</div><div class='add'>+        uservalue=</div><div class='add'>+</div><div class='add'>+        usercifsvalue=$(grep user.cifs "$GLUSTERD_WORKDIR"/vols/"$volname"/info |\</div><div class='add'>+                        cut -d"=" -f2)</div><div class='add'>+        usersmbvalue=$(grep user.smb "$GLUSTERD_WORKDIR"/vols/"$volname"/info |\</div><div class='add'>+                       cut -d"=" -f2)</div><div class='add'>+</div><div class='add'>+        if [ -n "$usercifsvalue" ]; then</div><div class='add'>+                if [ "$usercifsvalue" = "enable" ] || [ "$usercifsvalue" = "on" ]; then</div><div class='add'>+                        uservalue="enable"</div><div class='add'>+                fi</div><div class='add'>+        fi</div><div class='add'>+</div><div class='add'>+        if [ -n "$usersmbvalue" ]; then</div><div class='add'>+                if [ "$usersmbvalue" = "enable" ] || [ "$usersmbvalue" = "on" ]; then</div><div class='add'>+                        uservalue="enable"</div><div class='add'>+                fi</div><div class='add'>+        fi</div><div class='add'>+</div><div class='add'>+        echo "$uservalue"</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+parse_args "$@"</div><div class='add'>+</div><div class='add'>+value=$(get_smb "$VOL")</div><div class='add'>+</div><div class='add'>+if [ -z "$value" ] || [ "$value" != "enable" ]; then</div><div class='add'>+        exit 0</div><div class='add'>+fi</div><div class='add'>+</div><div class='add'>+#Find smb.conf, smbd pid directory and smbd logfile path</div><div class='add'>+find_config_info</div><div class='add'>+</div><div class='add'>+if ! grep --quiet "\[gluster-$VOL\]" "${CONFIGFILE}" ; then</div><div class='add'>+        add_samba_share "$VOL"</div><div class='add'>+else</div><div class='add'>+        sed -i '/\[gluster-'"$VOL"'\]/,/^$/!b;/available = no/d' "${CONFIGFILE}"</div><div class='add'>+fi</div><div class='add'>+sighup_samba</div><div class='head'>diff --git a/extras/hook-scripts/start/post/S31ganesha-start.sh b/extras/hook-scripts/start/post/S31ganesha-start.sh<br/>new file mode 100755<br/>index 00000000000..7ad6f23ad06<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/extras/hook-scripts/start/post/S31ganesha-start.sh?id=d1d7a6f35c816822fab51c820e25023863c239c1'>extras/hook-scripts/start/post/S31ganesha-start.sh</a></div><div class='hunk'>@@ -0,0 +1,122 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+PROGNAME="Sganesha-start"</div><div class='add'>+OPTSPEC="volname:,gd-workdir:"</div><div class='add'>+VOL=</div><div class='add'>+declare -i EXPORT_ID</div><div class='add'>+ganesha_key="ganesha.enable"</div><div class='add'>+GANESHA_DIR="/run/gluster/shared_storage/nfs-ganesha"</div><div class='add'>+CONF1="$GANESHA_DIR/ganesha.conf"</div><div class='add'>+GLUSTERD_WORKDIR=</div><div class='add'>+</div><div class='add'>+function parse_args ()</div><div class='add'>+{</div><div class='add'>+        ARGS=$(getopt -l $OPTSPEC  -o "o" -name $PROGNAME $@)</div><div class='add'>+        eval set -- "$ARGS"</div><div class='add'>+</div><div class='add'>+        while true; do</div><div class='add'>+            case $1 in</div><div class='add'>+                --volname)</div><div class='add'>+                    shift</div><div class='add'>+                    VOL=$1</div><div class='add'>+                    ;;</div><div class='add'>+                --gd-workdir)</div><div class='add'>+                    shift</div><div class='add'>+                    GLUSTERD_WORKDIR=$1</div><div class='add'>+                    ;;</div><div class='add'>+                *)</div><div class='add'>+                    shift</div><div class='add'>+                    break</div><div class='add'>+                    ;;</div><div class='add'>+            esac</div><div class='add'>+            shift</div><div class='add'>+        done</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+#This function generates a new export entry as export.volume_name.conf</div><div class='add'>+function write_conf()</div><div class='add'>+{</div><div class='add'>+echo -e "# WARNING : Using Gluster CLI will overwrite manual</div><div class='add'>+# changes made to this file. To avoid it, edit the</div><div class='add'>+# file, copy it over to all the NFS-Ganesha nodes</div><div class='add'>+# and run ganesha-ha.sh --refresh-config."</div><div class='add'>+</div><div class='add'>+echo "EXPORT{"</div><div class='add'>+echo "      Export_Id = 2;"</div><div class='add'>+echo "      Path = \"/$VOL\";"</div><div class='add'>+echo "      FSAL {"</div><div class='add'>+echo "           name = \"GLUSTER\";"</div><div class='add'>+echo "           hostname=\"localhost\";"</div><div class='add'>+echo "           volume=\"$VOL\";"</div><div class='add'>+echo "           }"</div><div class='add'>+echo "      Access_type = RW;"</div><div class='add'>+echo "      Disable_ACL = true;"</div><div class='add'>+echo "      Squash=\"No_root_squash\";"</div><div class='add'>+echo "      Pseudo=\"/$VOL\";"</div><div class='add'>+echo "      Protocols = \"3\", \"4\" ;"</div><div class='add'>+echo "      Transports = \"UDP\",\"TCP\";"</div><div class='add'>+echo "      SecType = \"sys\";"</div><div class='add'>+echo "}"</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#It adds the export dynamically by sending dbus signals</div><div class='add'>+function export_add()</div><div class='add'>+{</div><div class='add'>+        dbus-send --print-reply --system --dest=org.ganesha.nfsd \</div><div class='add'>+/org/ganesha/nfsd/ExportMgr org.ganesha.nfsd.exportmgr.AddExport \</div><div class='add'>+string:$GANESHA_DIR/exports/export.$VOL.conf string:"EXPORT(Export_Id=$EXPORT_ID)"</div><div class='add'>+</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+# based on src/scripts/ganeshactl/Ganesha/export_mgr.py</div><div class='add'>+function is_exported()</div><div class='add'>+{</div><div class='add'>+        local volume="${1}"</div><div class='add'>+</div><div class='add'>+        dbus-send --type=method_call --print-reply --system \</div><div class='add'>+                  --dest=org.ganesha.nfsd /org/ganesha/nfsd/ExportMgr \</div><div class='add'>+                  org.ganesha.nfsd.exportmgr.ShowExports \</div><div class='add'>+            | grep -w -q "/${volume}"</div><div class='add'>+</div><div class='add'>+        return $?</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+# Check the info file (contains the volume options) to see if Ganesha is</div><div class='add'>+# enabled for this volume.</div><div class='add'>+function ganesha_enabled()</div><div class='add'>+{</div><div class='add'>+        local volume="${1}"</div><div class='add'>+        local info_file="${GLUSTERD_WORKDIR}/vols/${VOL}/info"</div><div class='add'>+        local enabled="off"</div><div class='add'>+</div><div class='add'>+        enabled=$(grep -w ${ganesha_key} ${info_file} | cut -d"=" -f2)</div><div class='add'>+</div><div class='add'>+        [ "${enabled}" == "on" ]</div><div class='add'>+</div><div class='add'>+        return $?</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+parse_args $@</div><div class='add'>+</div><div class='add'>+if ganesha_enabled ${VOL} &amp;&amp; ! is_exported ${VOL}</div><div class='add'>+then</div><div class='add'>+        if [ ! -e ${GANESHA_DIR}/exports/export.${VOL}.conf ]</div><div class='add'>+        then</div><div class='add'>+                #Remove export entry from nfs-ganesha.conf</div><div class='add'>+                sed -i /$VOL.conf/d  $CONF1</div><div class='add'>+                write_conf ${VOL} &gt; ${GANESHA_DIR}/exports/export.${VOL}.conf</div><div class='add'>+                EXPORT_ID=`cat $GANESHA_DIR/.export_added`</div><div class='add'>+                EXPORT_ID=EXPORT_ID+1</div><div class='add'>+                echo $EXPORT_ID &gt; $GANESHA_DIR/.export_added</div><div class='add'>+                sed -i s/Export_Id.*/"Export_Id=$EXPORT_ID;"/ \</div><div class='add'>+                        $GANESHA_DIR/exports/export.$VOL.conf</div><div class='add'>+                echo "%include \"$GANESHA_DIR/exports/export.$VOL.conf\"" &gt;&gt; $CONF1</div><div class='add'>+        else</div><div class='add'>+                EXPORT_ID=$(grep ^[[:space:]]*Export_Id $GANESHA_DIR/exports/export.$VOL.conf |\</div><div class='add'>+                          awk -F"[=,;]" '{print $2}' | tr -d '[[:space:]]')</div><div class='add'>+        fi</div><div class='add'>+        export_add $VOL</div><div class='add'>+fi</div><div class='add'>+</div><div class='add'>+exit 0</div><div class='head'>diff --git a/extras/hook-scripts/stop/Makefile.am b/extras/hook-scripts/stop/Makefile.am<br/>new file mode 100644<br/>index 00000000000..e2ac8e2740b<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/extras/hook-scripts/stop/Makefile.am?id=d1d7a6f35c816822fab51c820e25023863c239c1'>extras/hook-scripts/stop/Makefile.am</a></div><div class='hunk'>@@ -0,0 +1,2 @@</div><div class='add'>+SUBDIRS = pre</div><div class='add'>+CLEANFILES =</div><div class='head'>diff --git a/extras/hook-scripts/stop/pre/Makefile.am b/extras/hook-scripts/stop/pre/Makefile.am<br/>new file mode 100644<br/>index 00000000000..9e8d1565e93<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/extras/hook-scripts/stop/pre/Makefile.am?id=d1d7a6f35c816822fab51c820e25023863c239c1'>extras/hook-scripts/stop/pre/Makefile.am</a></div><div class='hunk'>@@ -0,0 +1,6 @@</div><div class='add'>+EXTRA_DIST =  S29CTDB-teardown.sh S30samba-stop.sh</div><div class='add'>+</div><div class='add'>+hookdir = $(GLUSTERD_WORKDIR)/hooks/1/stop/pre/</div><div class='add'>+if WITH_SERVER</div><div class='add'>+hook_SCRIPTS = $(EXTRA_DIST)</div><div class='add'>+endif</div><div class='head'>diff --git a/extras/hook-scripts/stop/pre/S29CTDB-teardown.sh b/extras/hook-scripts/stop/pre/S29CTDB-teardown.sh<br/>new file mode 100755<br/>index 00000000000..0975a00f18d<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/extras/hook-scripts/stop/pre/S29CTDB-teardown.sh?id=d1d7a6f35c816822fab51c820e25023863c239c1'>extras/hook-scripts/stop/pre/S29CTDB-teardown.sh</a></div><div class='hunk'>@@ -0,0 +1,62 @@</div><div class='add'>+#! /bin/bash</div><div class='add'>+</div><div class='add'>+CTDB_MNT=/gluster/lock</div><div class='add'>+PROGNAME="ctdb"</div><div class='add'>+OPTSPEC="volname:,last:"</div><div class='add'>+VOL=</div><div class='add'>+LAST=</div><div class='add'>+# $META is the volume that will be used by CTDB as a shared filesystem.</div><div class='add'>+# It is not desirable to use this volume for storing 'data' as well.</div><div class='add'>+# META is set to 'all' (viz. a keyword and hence not a legal volume name)</div><div class='add'>+# to prevent the script from running for volumes it was not intended.</div><div class='add'>+# User needs to set META to the volume that serves CTDB lockfile.</div><div class='add'>+META="all"</div><div class='add'>+</div><div class='add'>+function parse_args () {</div><div class='add'>+        ARGS=$(getopt -o '' -l $OPTSPEC -n $PROGNAME -- "$@")</div><div class='add'>+        eval set -- "$ARGS"</div><div class='add'>+</div><div class='add'>+        while true; do</div><div class='add'>+            case $1 in</div><div class='add'>+                --volname)</div><div class='add'>+                    shift</div><div class='add'>+                    VOL=$1</div><div class='add'>+                    ;;</div><div class='add'>+                --last)</div><div class='add'>+                    shift</div><div class='add'>+                    LAST=$1</div><div class='add'>+                    ;;</div><div class='add'>+                *)</div><div class='add'>+                    shift</div><div class='add'>+                    break</div><div class='add'>+                    ;;</div><div class='add'>+            esac</div><div class='add'>+            shift</div><div class='add'>+        done</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+function remove_fstab_entry () {</div><div class='add'>+        mntpt=$1</div><div class='add'>+        fstab="/etc/fstab"</div><div class='add'>+        exists=`grep "$mntpt" ${fstab}`</div><div class='add'>+        esc_mntpt=$(echo -e $mntpt | sed 's/\//\\\//g')</div><div class='add'>+        if [ "$exists" != " " ]</div><div class='add'>+        then</div><div class='add'>+            sed -i /"$esc_mntpt"/d $fstab</div><div class='add'>+            exists=`grep "$mntpt" ${fstab}`</div><div class='add'>+            if [ "$exists" != " " ]</div><div class='add'>+            then</div><div class='add'>+                echo "fstab entry cannot be removed for unknown reason"</div><div class='add'>+                exit 1</div><div class='add'>+            fi</div><div class='add'>+        fi</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+parse_args "$@"</div><div class='add'>+if [ "$META" = "$VOL" ]</div><div class='add'>+then</div><div class='add'>+        umount "$CTDB_MNT"</div><div class='add'>+        chkconfig ctdb off</div><div class='add'>+        remove_fstab_entry $CTDB_MNT</div><div class='add'>+fi</div><div class='head'>diff --git a/extras/hook-scripts/stop/pre/S30samba-stop.sh b/extras/hook-scripts/stop/pre/S30samba-stop.sh<br/>new file mode 100755<br/>index 00000000000..ea799381d62<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/extras/hook-scripts/stop/pre/S30samba-stop.sh?id=d1d7a6f35c816822fab51c820e25023863c239c1'>extras/hook-scripts/stop/pre/S30samba-stop.sh</a></div><div class='hunk'>@@ -0,0 +1,77 @@</div><div class='add'>+#! /bin/bash</div><div class='add'>+</div><div class='add'>+#Need to be copied to hooks/&lt;HOOKS_VER&gt;/stop/pre</div><div class='add'>+</div><div class='add'>+#TODO: All gluster and samba paths are assumed for fedora like systems.</div><div class='add'>+#Some efforts are required to make it work on other distros.</div><div class='add'>+</div><div class='add'>+#The preferred way of creating a smb share of a gluster volume has changed.</div><div class='add'>+#The old method was to create a fuse mount of the volume and share the mount</div><div class='add'>+#point through samba.</div><div class='add'>+#</div><div class='add'>+#New method eliminates the requirement of fuse mount and changes in fstab.</div><div class='add'>+#glusterfs_vfs plugin for samba makes call to libgfapi to access the volume.</div><div class='add'>+#</div><div class='add'>+#This hook script automagically removes shares for volume on every volume stop</div><div class='add'>+#event by removing the volume related entries(if any) in smb.conf file.</div><div class='add'>+</div><div class='add'>+PROGNAME="Ssamba-stop"</div><div class='add'>+OPTSPEC="volname:,last:"</div><div class='add'>+VOL=</div><div class='add'>+CONFIGFILE=</div><div class='add'>+PIDDIR=</div><div class='add'>+LAST=</div><div class='add'>+</div><div class='add'>+function parse_args () {</div><div class='add'>+        ARGS=$(getopt -o '' -l $OPTSPEC -n $PROGNAME -- "$@")</div><div class='add'>+        eval set -- "$ARGS"</div><div class='add'>+</div><div class='add'>+        while true; do</div><div class='add'>+            case $1 in</div><div class='add'>+                --volname)</div><div class='add'>+                    shift</div><div class='add'>+                    VOL=$1</div><div class='add'>+                    ;;</div><div class='add'>+                --last)</div><div class='add'>+                    shift</div><div class='add'>+                    LAST=$1</div><div class='add'>+                    ;;</div><div class='add'>+                *)</div><div class='add'>+                    shift</div><div class='add'>+                    break</div><div class='add'>+                    ;;</div><div class='add'>+            esac</div><div class='add'>+</div><div class='add'>+            shift</div><div class='add'>+        done</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function find_config_info () {</div><div class='add'>+        cmdout=`smbd -b | grep smb.conf`</div><div class='add'>+        if [ $? -ne 0 ];then</div><div class='add'>+                echo "Samba is not installed"</div><div class='add'>+                exit 1</div><div class='add'>+        fi</div><div class='add'>+        CONFIGFILE=`echo $cmdout | awk '{print $2}'`</div><div class='add'>+        PIDDIR=`smbd -b | grep PIDDIR | awk '{print $2}'`</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function deactivate_samba_share () {</div><div class='add'>+        volname=$1</div><div class='add'>+        sed -i -e '/^\[gluster-'"$volname"'\]/{ :a' -e 'n; /available = no/H; /^$/!{$!ba;}; x; /./!{ s/^/available = no/; $!{G;x}; $H; }; s/.*//; x; };' ${CONFIGFILE}</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function sighup_samba () {</div><div class='add'>+        pid=`cat ${PIDDIR}/smbd.pid`</div><div class='add'>+        if [ "x$pid" != "x" ]</div><div class='add'>+        then</div><div class='add'>+                kill -HUP $pid;</div><div class='add'>+        else</div><div class='add'>+                service smb condrestart</div><div class='add'>+        fi</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+parse_args "$@"</div><div class='add'>+find_config_info</div><div class='add'>+deactivate_samba_share $VOL</div><div class='add'>+sighup_samba</div><div class='head'>diff --git a/extras/identify-hangs.sh b/extras/identify-hangs.sh<br/>new file mode 100755<br/>index 00000000000..ebc6bf144aa<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/extras/identify-hangs.sh?id=d1d7a6f35c816822fab51c820e25023863c239c1'>extras/identify-hangs.sh</a></div><div class='hunk'>@@ -0,0 +1,53 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+function get_statedump_fnames_without_timestamps</div><div class='add'>+{</div><div class='add'>+    ls | grep -E "[.]dump[.][0-9][0-9]*" | cut -f1-3 -d'.' | sort -u</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function get_non_uniq_fields</div><div class='add'>+{</div><div class='add'>+    local statedump_fname_prefix=$1</div><div class='add'>+    print_stack_lkowner_unique_in_one_line "$statedump_fname_prefix" | sort | uniq -c | grep -vE "^\s*1 " | awk '{$1="repeats="$1; print $0}'</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function print_stack_lkowner_unique_in_one_line</div><div class='add'>+{</div><div class='add'>+    local statedump_fname_prefix=$1</div><div class='add'>+    sed -e '/./{H;$!d;}' -e 'x;/unique=/!d;/stack=/!d;/lk-owner=/!d;/pid=/!d;' "${statedump_fname_prefix}"* | grep -E "(stack|lk-owner|unique|pid)=" | paste -d " " - - - -</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function get_stacks_that_appear_in_multiple_statedumps</div><div class='add'>+{</div><div class='add'>+    #If a stack with same 'unique/lk-owner/stack' appears in multiple statedumps</div><div class='add'>+    #print the stack</div><div class='add'>+    local statedump_fname_prefix=$1</div><div class='add'>+    while read -r non_uniq_stack;</div><div class='add'>+    do</div><div class='add'>+        if [ -z "$printed" ];</div><div class='add'>+        then</div><div class='add'>+            printed="1"</div><div class='add'>+        fi</div><div class='add'>+        echo "$statedump_fname_prefix" "$non_uniq_stack"</div><div class='add'>+    done &lt; &lt;(get_non_uniq_fields "$statedump_fname_prefix")</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+statedumpdir=${1}</div><div class='add'>+if [ -z "$statedumpdir" ];</div><div class='add'>+then</div><div class='add'>+    echo "Usage: $0 &lt;statedump-dir&gt;"</div><div class='add'>+    exit 1</div><div class='add'>+fi</div><div class='add'>+</div><div class='add'>+if [ ! -d "$statedumpdir" ];</div><div class='add'>+then</div><div class='add'>+    echo "$statedumpdir: Is not a directory"</div><div class='add'>+    echo "Usage: $0 &lt;statedump-dir&gt;"</div><div class='add'>+    exit 1</div><div class='add'>+fi</div><div class='add'>+</div><div class='add'>+cd "$statedumpdir" || exit 1</div><div class='add'>+for statedump_fname_prefix in $(get_statedump_fnames_without_timestamps);</div><div class='add'>+do</div><div class='add'>+    get_stacks_that_appear_in_multiple_statedumps "$statedump_fname_prefix"</div><div class='add'>+done | column -t</div><div class='add'>+echo "NOTE: stacks with lk-owner=\"\"/lk-owner=0000000000000000/unique=0 may not be hung frames and need further inspection" &gt;&amp;2</div><div class='head'>diff --git a/extras/init.d/Makefile.am b/extras/init.d/Makefile.am<br/>index c090161780b..8d8cc69571a 100644<br/>--- a/<a href='/cgit/glusterfs.git/tree/extras/init.d/Makefile.am?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/init.d/Makefile.am</a><br/>+++ b/<a href='/cgit/glusterfs.git/tree/extras/init.d/Makefile.am?id=d1d7a6f35c816822fab51c820e25023863c239c1'>extras/init.d/Makefile.am</a></div><div class='hunk'>@@ -1,19 +1,32 @@</div><div class='ctx'> </div><div class='del'>-EXTRA_DIST = glusterfsd-Debian glusterfsd-Redhat glusterfsd-SuSE glusterfs-server.plist</div><div class='add'>+EXTRA_DIST = glusterd-Debian glusterd-FreeBSD glusterd-Redhat \</div><div class='add'>+	glusterd-SuSE glusterd.plist glustereventsd-FreeBSD \</div><div class='add'>+	glustereventsd-Redhat glustereventsd-Debian</div><div class='ctx'> </div><div class='del'>-CLEANFILES = </div><div class='add'>+CLEANFILES =</div><div class='ctx'> </div><div class='del'>-initdir = @initdir@</div><div class='del'>-launchddir = @launchddir@</div><div class='add'>+INIT_DIR = @initdir@</div><div class='add'>+SYSTEMD_DIR = @systemddir@</div><div class='add'>+LAUNCHD_DIR = @launchddir@</div><div class='ctx'> </div><div class='del'>-$(GF_DISTRIBUTION): </div><div class='del'>-	$(mkdir_p) $(DESTDIR)$(initdir)	</div><div class='del'>-	$(INSTALL_PROGRAM) glusterfsd-$(GF_DISTRIBUTION) $(DESTDIR)$(initdir)/glusterfsd</div><div class='add'>+$(GF_DISTRIBUTION):</div><div class='add'>+if WITH_SERVER</div><div class='add'>+	@if [ ! -d $(SYSTEMD_DIR) ]; then \</div><div class='add'>+		$(mkdir_p) $(DESTDIR)$(INIT_DIR); \</div><div class='add'>+		$(INSTALL_PROGRAM) glusterd-$(GF_DISTRIBUTION) $(DESTDIR)$(INIT_DIR)/glusterd; \</div><div class='add'>+	fi</div><div class='add'>+endif</div><div class='add'>+if BUILD_EVENTS</div><div class='add'>+	@if [ ! -d $(SYSTEMD_DIR) ]; then \</div><div class='add'>+		$(mkdir_p) $(DESTDIR)$(INIT_DIR); \</div><div class='add'>+		$(INSTALL_PROGRAM) glustereventsd-$(GF_DISTRIBUTION) $(DESTDIR)$(INIT_DIR)/glustereventsd; \</div><div class='add'>+	fi</div><div class='add'>+endif</div><div class='ctx'> </div><div class='ctx'> install-exec-local: $(GF_DISTRIBUTION)</div><div class='ctx'> </div><div class='del'>-install-data-local: </div><div class='add'>+install-data-local:</div><div class='ctx'> if GF_DARWIN_HOST_OS</div><div class='del'>-	$(mkdir_p) $(DESTDIR)$(launchddir)</div><div class='del'>-	$(INSTALL_PROGRAM) glusterfs-server.plist $(DESTDIR)$(launchddir)/com.gluster.glusterfs.plist</div><div class='add'>+	$(mkdir_p) $(DESTDIR)$(LAUNCHD_DIR)</div><div class='add'>+	$(INSTALL_PROGRAM) glusterd.plist $(DESTDIR)$(LAUNCHD_DIR)/org.gluster.glusterd.plist</div><div class='ctx'> endif</div><div class='head'>diff --git a/extras/init.d/glusterfsd-Debian.in b/extras/init.d/glusterd-Debian.in<br/>index a0c83d53569..918f8592c6e 100755<br/>--- a/<a href='/cgit/glusterfs.git/tree/extras/init.d/glusterfsd-Debian.in?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/init.d/glusterfsd-Debian.in</a><br/>+++ b/<a href='/cgit/glusterfs.git/tree/extras/init.d/glusterd-Debian.in?id=d1d7a6f35c816822fab51c820e25023863c239c1'>extras/init.d/glusterd-Debian.in</a></div><div class='hunk'>@@ -1,24 +1,23 @@</div><div class='ctx'> #!/bin/sh</div><div class='ctx'> ### BEGIN INIT INFO</div><div class='del'>-# Provides:          glusterfsd</div><div class='add'>+# Provides:          glusterd</div><div class='ctx'> # Required-Start:    $local_fs $network</div><div class='ctx'> # Required-Stop:     $local_fs $network</div><div class='ctx'> # Default-Start:     2 3 4 5</div><div class='ctx'> # Default-Stop:      0 1 6</div><div class='del'>-# Short-Description: gluster server</div><div class='del'>-# Description:       This file starts / stops the gluster server</div><div class='add'>+# Short-Description: Gluster File System service for volume management</div><div class='add'>+# Description:       Gluster File System service for volume management</div><div class='ctx'> ### END INIT INFO</div><div class='ctx'> </div><div class='ctx'> # Author: Chris AtLee &lt;chris@atlee.ca&gt;</div><div class='ctx'> # Patched by: Matthias Albert &lt; matthias@linux4experts.de&gt;</div><div class='ctx'> </div><div class='ctx'> PATH=/sbin:/usr/sbin:/bin:/usr/bin</div><div class='del'>-NAME=glusterfsd</div><div class='add'>+NAME=glusterd</div><div class='ctx'> SCRIPTNAME=/etc/init.d/$NAME</div><div class='ctx'> DAEMON=@prefix@/sbin/$NAME</div><div class='ctx'> PIDFILE=/var/run/$NAME.pid</div><div class='del'>-CONFIGFILE=/etc/glusterfs/glusterfsd.vol</div><div class='del'>-GLUSTERFS_OPTS="-f $CONFIGFILE"</div><div class='add'>+GLUSTERD_OPTS=""</div><div class='ctx'> PID=`test -f $PIDFILE &amp;&amp; cat $PIDFILE`</div><div class='ctx'> </div><div class='ctx'> </div><div class='hunk'>@@ -31,24 +30,16 @@ test -x $DAEMON || exit 0</div><div class='ctx'> # Define LSB log_* functions.</div><div class='ctx'> . /lib/lsb/init-functions</div><div class='ctx'> </div><div class='del'>-check_config()</div><div class='del'>-{</div><div class='del'>-  if [ ! -f "$CONFIGFILE" ]; then</div><div class='del'>-    echo "Config file $CONFIGFILE is missing...exiting!"</div><div class='del'>-    exit 0</div><div class='del'>-  fi</div><div class='del'>-}</div><div class='ctx'> </div><div class='ctx'> do_start()</div><div class='ctx'> {</div><div class='del'>-    check_config;</div><div class='ctx'>     pidofproc -p $PIDFILE $DAEMON &gt;/dev/null</div><div class='ctx'>     status=$?</div><div class='ctx'>     if [ $status -eq 0 ]; then</div><div class='del'>-      log_success_msg "glusterfs server is already running with pid $PID"</div><div class='add'>+      log_success_msg "glusterd service is already running with pid $PID"</div><div class='ctx'>     else</div><div class='del'>-      log_daemon_msg "Starting glusterfs server" "glusterfsd"</div><div class='del'>-      start-stop-daemon --start --quiet --oknodo --pidfile $PIDFILE --startas $DAEMON -- -p $PIDFILE $GLUSTERFS_OPTS</div><div class='add'>+      log_daemon_msg "Starting glusterd service" "glusterd"</div><div class='add'>+      start-stop-daemon --start --quiet --oknodo --pidfile $PIDFILE --startas $DAEMON -- -p $PIDFILE $GLUSTERD_OPTS</div><div class='ctx'>       log_end_msg $?</div><div class='ctx'>       start_daemon -p $PIDFILE $DAEMON -f $CONFIGFILE</div><div class='ctx'>       return $?</div><div class='hunk'>@@ -57,7 +48,7 @@ do_start()</div><div class='ctx'> </div><div class='ctx'> do_stop()</div><div class='ctx'> {</div><div class='del'>-    log_daemon_msg "Stopping glusterfs server" "glusterfsd"</div><div class='add'>+    log_daemon_msg "Stopping glusterd service" "glusterd"</div><div class='ctx'>     start-stop-daemon --stop --quiet --oknodo --pidfile $PIDFILE</div><div class='ctx'>     log_end_msg $?</div><div class='ctx'>     rm -f $PIDFILE</div><div class='hunk'>@@ -70,9 +61,9 @@ do_status()</div><div class='ctx'>      pidofproc -p $PIDFILE $DAEMON &gt;/dev/null</div><div class='ctx'>      status=$?</div><div class='ctx'>      if [ $status -eq 0 ]; then</div><div class='del'>-       log_success_msg "glusterfs server is running with pid $PID"</div><div class='add'>+       log_success_msg "glusterd service is running with pid $PID"</div><div class='ctx'>      else</div><div class='del'>-       log_failure_msg "glusterfs server is not running."</div><div class='add'>+       log_failure_msg "glusterd service is not running."</div><div class='ctx'>      fi</div><div class='ctx'>      exit $status</div><div class='ctx'> }</div><div class='head'>diff --git a/extras/init.d/glusterd-FreeBSD.in b/extras/init.d/glusterd-FreeBSD.in<br/>new file mode 100644<br/>index 00000000000..21c3da72624<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/extras/init.d/glusterd-FreeBSD.in?id=d1d7a6f35c816822fab51c820e25023863c239c1'>extras/init.d/glusterd-FreeBSD.in</a></div><div class='hunk'>@@ -0,0 +1,24 @@</div><div class='add'>+#!/bin/sh</div><div class='add'>+#</div><div class='add'>+# $FreeBSD$</div><div class='add'>+#</div><div class='add'>+</div><div class='add'>+# PROVIDE: glusterd</div><div class='add'>+</div><div class='add'>+. /etc/rc.subr</div><div class='add'>+</div><div class='add'>+name="glusterd"</div><div class='add'>+rcvar=`set_rcvar`</div><div class='add'>+command=@prefix@/sbin/${name}</div><div class='add'>+pidfile="/var/run/${name}.pid"</div><div class='add'>+glusterd_flags="-p /var/run/${name}.pid"</div><div class='add'>+start_precmd="glusterd_prestart"</div><div class='add'>+</div><div class='add'>+glusterd_prestart()</div><div class='add'>+{</div><div class='add'>+    mkdir -p @GLUSTERD_WORKDIR@ /var/log/glusterfs</div><div class='add'>+    return 0</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+load_rc_config $name</div><div class='add'>+run_rc_command "$1"</div><div class='head'>diff --git a/extras/init.d/glusterd-Redhat.in b/extras/init.d/glusterd-Redhat.in<br/>new file mode 100755<br/>index 00000000000..94801fe31a5<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/extras/init.d/glusterd-Redhat.in?id=d1d7a6f35c816822fab51c820e25023863c239c1'>extras/init.d/glusterd-Redhat.in</a></div><div class='hunk'>@@ -0,0 +1,143 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+#</div><div class='add'>+# glusterd   Startup script for the glusterfs server</div><div class='add'>+#</div><div class='add'>+# chkconfig:   - 20 80</div><div class='add'>+# description: Clustered file-system server</div><div class='add'>+</div><div class='add'>+### BEGIN INIT INFO</div><div class='add'>+# Provides: glusterd</div><div class='add'>+# Required-Start: $local_fs $network</div><div class='add'>+# Required-Stop: $local_fs $network</div><div class='add'>+# Should-Start: </div><div class='add'>+# Should-Stop: </div><div class='add'>+# Default-Start: 2 3 4 5</div><div class='add'>+# Default-Stop: 0 1 6</div><div class='add'>+# Short-Description: glusterfs server</div><div class='add'>+# Description:       Clustered file-system server</div><div class='add'>+### END INIT INFO</div><div class='add'>+#</div><div class='add'>+</div><div class='add'>+# Source function library.</div><div class='add'>+. /etc/rc.d/init.d/functions</div><div class='add'>+</div><div class='add'>+BASE=glusterd</div><div class='add'>+</div><div class='add'>+# Fedora File System Layout dictates /run</div><div class='add'>+[ -e /run ] &amp;&amp; RUNDIR="/run"</div><div class='add'>+PIDFILE="${RUNDIR:-/var/run}/${BASE}.pid"</div><div class='add'>+</div><div class='add'>+PID=`test -f $PIDFILE &amp;&amp; cat $PIDFILE`</div><div class='add'>+</div><div class='add'>+# Overwriteable from sysconfig</div><div class='add'>+LOG_LEVEL=''</div><div class='add'>+LOG_FILE=''</div><div class='add'>+GLUSTERD_OPTIONS=''</div><div class='add'>+GLUSTERD_NOFILE='65536'</div><div class='add'>+</div><div class='add'>+[ -f /etc/sysconfig/${BASE} ] &amp;&amp; . /etc/sysconfig/${BASE}</div><div class='add'>+</div><div class='add'>+[ ! -z $LOG_LEVEL ] &amp;&amp; GLUSTERD_OPTIONS="${GLUSTERD_OPTIONS} --log-level ${LOG_LEVEL}"</div><div class='add'>+[ ! -z $LOG_FILE ] &amp;&amp; GLUSTERD_OPTIONS="${GLUSTERD_OPTIONS} --log-file ${LOG_FILE}"</div><div class='add'>+</div><div class='add'>+GLUSTERFSD=glusterfsd</div><div class='add'>+GLUSTERFS=glusterfs</div><div class='add'>+GLUSTERD_BIN=@prefix@/sbin/$BASE</div><div class='add'>+GLUSTERD_OPTS="--pid-file=$PIDFILE ${GLUSTERD_OPTIONS}"</div><div class='add'>+GLUSTERD="$GLUSTERD_BIN $GLUSTERD_OPTS"</div><div class='add'>+RETVAL=0</div><div class='add'>+</div><div class='add'>+LOCKFILE=/var/lock/subsys/${BASE}</div><div class='add'>+</div><div class='add'>+# Start the service $BASE</div><div class='add'>+start()</div><div class='add'>+{</div><div class='add'>+       if pidofproc -p $PIDFILE $GLUSTERD_BIN &amp;&gt; /dev/null; then</div><div class='add'>+           echo "glusterd service is already running with pid $PID"</div><div class='add'>+           return 0</div><div class='add'>+       else</div><div class='add'>+           ulimit -n $GLUSTERD_NOFILE</div><div class='add'>+           echo -n $"Starting $BASE:"</div><div class='add'>+           daemon $GLUSTERD</div><div class='add'>+           RETVAL=$?</div><div class='add'>+           echo</div><div class='add'>+           [ $RETVAL -eq 0 ] &amp;&amp; touch $LOCKFILE</div><div class='add'>+           return $RETVAL</div><div class='add'>+       fi</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+# Stop the service $BASE</div><div class='add'>+stop()</div><div class='add'>+{</div><div class='add'>+    echo -n $"Stopping $BASE:"</div><div class='add'>+    if pidofproc -p $PIDFILE $GLUSTERD_BIN &amp;&gt; /dev/null; then</div><div class='add'>+        killproc -p $PIDFILE $BASE</div><div class='add'>+    else</div><div class='add'>+        killproc $BASE</div><div class='add'>+    fi</div><div class='add'>+    RETVAL=$?</div><div class='add'>+    echo</div><div class='add'>+    [ $RETVAL -eq 0 ] &amp;&amp; rm -f $LOCKFILE</div><div class='add'>+    return $RETVAL</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+restart()</div><div class='add'>+{</div><div class='add'>+    stop</div><div class='add'>+    start</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+reload()</div><div class='add'>+{</div><div class='add'>+    restart</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+force_reload()</div><div class='add'>+{</div><div class='add'>+    restart</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+rh_status()</div><div class='add'>+{</div><div class='add'>+    status $BASE</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+rh_status_q()</div><div class='add'>+{</div><div class='add'>+    rh_status &amp;&gt;/dev/null</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+### service arguments ###</div><div class='add'>+case $1 in</div><div class='add'>+    start)</div><div class='add'>+        rh_status_q &amp;&amp; exit 0</div><div class='add'>+        $1</div><div class='add'>+        ;;</div><div class='add'>+    stop)</div><div class='add'>+        rh_status_q || exit 0</div><div class='add'>+        $1</div><div class='add'>+        ;;</div><div class='add'>+    restart)</div><div class='add'>+        $1</div><div class='add'>+        ;;</div><div class='add'>+    reload)</div><div class='add'>+        rh_status_q || exit 7</div><div class='add'>+        $1</div><div class='add'>+        ;;</div><div class='add'>+    force-reload)</div><div class='add'>+        force_reload</div><div class='add'>+        ;;</div><div class='add'>+    status)</div><div class='add'>+        rh_status</div><div class='add'>+        ;;</div><div class='add'>+    condrestart|try-restart)</div><div class='add'>+        rh_status_q || exit 0</div><div class='add'>+        restart</div><div class='add'>+        ;;</div><div class='add'>+    *)</div><div class='add'>+        echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload}"</div><div class='add'>+        exit 1</div><div class='add'>+esac</div><div class='add'>+</div><div class='add'>+exit $?</div><div class='head'>diff --git a/extras/init.d/glusterfsd-SuSE.in b/extras/init.d/glusterd-SuSE.in<br/>index 43552bb499c..6259bab00b6 100755<br/>--- a/<a href='/cgit/glusterfs.git/tree/extras/init.d/glusterfsd-SuSE.in?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/init.d/glusterfsd-SuSE.in</a><br/>+++ b/<a href='/cgit/glusterfs.git/tree/extras/init.d/glusterd-SuSE.in?id=d1d7a6f35c816822fab51c820e25023863c239c1'>extras/init.d/glusterd-SuSE.in</a></div><div class='hunk'>@@ -1,31 +1,30 @@</div><div class='ctx'> #!/bin/bash</div><div class='ctx'> #</div><div class='ctx'> ### BEGIN INIT INFO</div><div class='del'>-# Provides:       glusterfsd</div><div class='del'>-# Required-Start: $local_fs $network</div><div class='del'>-# Required-Stop:</div><div class='add'>+# Provides:       glusterd</div><div class='add'>+# Required-Start: $remote_fs $network</div><div class='add'>+# Required-Stop: $remote_fs $network</div><div class='ctx'> # Default-Start:  3 5</div><div class='ctx'> # Default-Stop:</div><div class='del'>-# Short-Description: GlusterFS server daemon</div><div class='del'>-# Description:    All necessary services for GlusterFS clients</div><div class='add'>+# Short-Description: Gluster File System service for volume management</div><div class='add'>+# Description:    Gluster File System service for volume management</div><div class='ctx'> ### END INIT INFO</div><div class='ctx'> </div><div class='ctx'> # Get function from functions library</div><div class='ctx'> </div><div class='ctx'> . /etc/rc.status</div><div class='ctx'> </div><div class='del'>-BASE=glusterfsd</div><div class='del'>-GLUSTERFSD_BIN=@prefix@/sbin/$BASE</div><div class='del'>-CONFIGFILE=/etc/glusterfs/glusterfsd.vol</div><div class='del'>-GLUSTERFSD_OPTS="-f $CONFIGFILE"</div><div class='del'>-GSERVER="$GLUSTERFSD_BIN $GLUSTERFSD_OPTS"</div><div class='add'>+BASE=glusterd</div><div class='add'>+GLUSTERD_BIN=@prefix@/sbin/$BASE</div><div class='add'>+GLUSTERD_OPTS=""</div><div class='add'>+GLUSTERD="$GLUSTERD_BIN $GLUSTERD_OPTS"</div><div class='ctx'> RETVAL=0</div><div class='ctx'> </div><div class='ctx'> # Start the service $BASE</div><div class='ctx'> start()</div><div class='ctx'> {</div><div class='ctx'>        echo -n $"Starting $BASE:"</div><div class='del'>-       startproc $GSERVER </div><div class='add'>+       startproc $GLUSTERD</div><div class='ctx'>        return $?</div><div class='ctx'> }</div><div class='ctx'> </div><div class='hunk'>@@ -33,7 +32,7 @@ start()</div><div class='ctx'> stop()</div><div class='ctx'> {</div><div class='ctx'>        echo $"Stopping $BASE:"</div><div class='del'>-       killproc $BASE </div><div class='add'>+       killproc $BASE</div><div class='ctx'>        return $?</div><div class='ctx'> }</div><div class='ctx'> </div><div class='hunk'>@@ -55,20 +54,24 @@ case $1 in</div><div class='ctx'>        rc_status -v</div><div class='ctx'>        ;;</div><div class='ctx'>  status)</div><div class='del'>-	echo -n " glusterfsd"</div><div class='add'>+	echo -n " glusterd"</div><div class='ctx'> 	if ! checkproc $BASE ;then</div><div class='ctx'> 	    echo " not running"</div><div class='ctx'> 	    rc_failed 3</div><div class='ctx'> 	fi</div><div class='ctx'> 	rc_status -v</div><div class='ctx'>        ;;</div><div class='add'>+ reload)</div><div class='add'>+       rc_failed 3</div><div class='add'>+       rc_status -v</div><div class='add'>+       ;;</div><div class='ctx'>  restart)</div><div class='ctx'>        $0 stop</div><div class='ctx'>        $0 start</div><div class='ctx'>        rc_status</div><div class='ctx'>        ;;</div><div class='ctx'>  *)</div><div class='del'>-       echo $"Usage: $0 {start|stop|status|restart}."</div><div class='add'>+       echo $"Usage: $0 {start|stop|status|reload|restart}."</div><div class='ctx'>        exit 1</div><div class='ctx'> esac</div><div class='ctx'> </div><div class='head'>diff --git a/extras/init.d/glusterfs-server.plist.in b/extras/init.d/glusterd.plist.in<br/>index 624dfe22d80..3ee9f60c5c5 100644<br/>--- a/<a href='/cgit/glusterfs.git/tree/extras/init.d/glusterfs-server.plist.in?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/init.d/glusterfs-server.plist.in</a><br/>+++ b/<a href='/cgit/glusterfs.git/tree/extras/init.d/glusterd.plist.in?id=d1d7a6f35c816822fab51c820e25023863c239c1'>extras/init.d/glusterd.plist.in</a></div><div class='hunk'>@@ -3,13 +3,11 @@</div><div class='ctx'> &lt;plist version="1.0"&gt;</div><div class='ctx'> &lt;dict&gt;</div><div class='ctx'>         &lt;key&gt;Label&lt;/key&gt;</div><div class='del'>-        &lt;string&gt;com.gluster.glusterfs&lt;/string&gt;</div><div class='add'>+        &lt;string&gt;org.gluster.glusterd&lt;/string&gt;</div><div class='ctx'>         &lt;key&gt;ProgramArguments&lt;/key&gt;</div><div class='ctx'>         &lt;array&gt;</div><div class='del'>-                &lt;string&gt;@prefix@/sbin/glusterfsd&lt;/string&gt;</div><div class='add'>+                &lt;string&gt;@prefix@/sbin/glusterd&lt;/string&gt;</div><div class='ctx'>                 &lt;string&gt;-N&lt;/string&gt;</div><div class='del'>-                &lt;string&gt;-f&lt;/string&gt;</div><div class='del'>-                &lt;string&gt;@prefix@/etc/glusterfs/server.vol&lt;/string&gt;</div><div class='ctx'>         &lt;/array&gt;</div><div class='ctx'> &lt;/dict&gt;</div><div class='ctx'> &lt;/plist&gt;</div><div class='head'>diff --git a/extras/init.d/glustereventsd-Debian.in b/extras/init.d/glustereventsd-Debian.in<br/>new file mode 100644<br/>index 00000000000..6eebdb2b8d8<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/extras/init.d/glustereventsd-Debian.in?id=d1d7a6f35c816822fab51c820e25023863c239c1'>extras/init.d/glustereventsd-Debian.in</a></div><div class='hunk'>@@ -0,0 +1,91 @@</div><div class='add'>+#!/bin/sh</div><div class='add'>+### BEGIN INIT INFO</div><div class='add'>+# Provides:          glustereventsd</div><div class='add'>+# Required-Start:    $local_fs $network</div><div class='add'>+# Required-Stop:     $local_fs $network</div><div class='add'>+# Default-Start:     2 3 4 5</div><div class='add'>+# Default-Stop:      0 1 6</div><div class='add'>+# Short-Description: Gluster Events Server</div><div class='add'>+# Description:       Gluster Events Server</div><div class='add'>+### END INIT INFO</div><div class='add'>+</div><div class='add'>+# Author: Chris AtLee &lt;chris@atlee.ca&gt;</div><div class='add'>+# Patched by: Matthias Albert &lt; matthias@linux4experts.de&gt;</div><div class='add'>+</div><div class='add'>+PATH=/sbin:/usr/sbin:/bin:/usr/bin</div><div class='add'>+NAME=glustereventsd</div><div class='add'>+SCRIPTNAME=/etc/init.d/$NAME</div><div class='add'>+DAEMON=@prefix@/sbin/$NAME</div><div class='add'>+PIDFILE=/var/run/$NAME.pid</div><div class='add'>+GLUSTEREVENTSD_OPTS=""</div><div class='add'>+PID=`test -f $PIDFILE &amp;&amp; cat $PIDFILE`</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+# Gracefully exit if the package has been removed.</div><div class='add'>+test -x $DAEMON || exit 0</div><div class='add'>+</div><div class='add'>+# Load the VERBOSE setting and other rcS variables</div><div class='add'>+. /lib/init/vars.sh</div><div class='add'>+</div><div class='add'>+# Define LSB log_* functions.</div><div class='add'>+. /lib/lsb/init-functions</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+do_start()</div><div class='add'>+{</div><div class='add'>+    pidofproc -p $PIDFILE $DAEMON &gt;/dev/null</div><div class='add'>+    status=$?</div><div class='add'>+    if [ $status -eq 0 ]; then</div><div class='add'>+      log_success_msg "glustereventsd service is already running with pid $PID"</div><div class='add'>+    else</div><div class='add'>+      log_daemon_msg "Starting glustereventsd service" "glustereventsd"</div><div class='add'>+      start-stop-daemon --start --quiet --oknodo --pidfile $PIDFILE --startas $DAEMON -- -p $PIDFILE $GLUSTEREVENTSD_OPTS</div><div class='add'>+      log_end_msg $?</div><div class='add'>+      start_daemon -p $PIDFILE $DAEMON -f $CONFIGFILE</div><div class='add'>+      return $?</div><div class='add'>+    fi</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+do_stop()</div><div class='add'>+{</div><div class='add'>+    log_daemon_msg "Stopping glustereventsd service" "glustereventsd"</div><div class='add'>+    start-stop-daemon --stop --quiet --oknodo --pidfile $PIDFILE</div><div class='add'>+    log_end_msg $?</div><div class='add'>+    rm -f $PIDFILE</div><div class='add'>+    killproc -p $PIDFILE $DAEMON</div><div class='add'>+    return $?</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+do_status()</div><div class='add'>+{</div><div class='add'>+     pidofproc -p $PIDFILE $DAEMON &gt;/dev/null</div><div class='add'>+     status=$?</div><div class='add'>+     if [ $status -eq 0 ]; then</div><div class='add'>+       log_success_msg "glustereventsd service is running with pid $PID"</div><div class='add'>+     else</div><div class='add'>+       log_failure_msg "glustereventsd service is not running."</div><div class='add'>+     fi</div><div class='add'>+     exit $status</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+case "$1" in</div><div class='add'>+  start)</div><div class='add'>+        do_start</div><div class='add'>+        ;;</div><div class='add'>+  stop)</div><div class='add'>+        do_stop</div><div class='add'>+        ;;</div><div class='add'>+  status)</div><div class='add'>+        do_status;</div><div class='add'>+        ;;</div><div class='add'>+  restart|force-reload)</div><div class='add'>+        do_stop</div><div class='add'>+        sleep 2</div><div class='add'>+        do_start</div><div class='add'>+        ;;</div><div class='add'>+  *)</div><div class='add'>+        echo "Usage: $SCRIPTNAME {start|stop|status|restart|force-reload}" &gt;&amp;2</div><div class='add'>+        exit 3</div><div class='add'>+        ;;</div><div class='add'>+esac</div><div class='add'>+</div><div class='head'>diff --git a/extras/init.d/glustereventsd-FreeBSD.in b/extras/init.d/glustereventsd-FreeBSD.in<br/>new file mode 100644<br/>index 00000000000..2e8303ec6c6<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/extras/init.d/glustereventsd-FreeBSD.in?id=d1d7a6f35c816822fab51c820e25023863c239c1'>extras/init.d/glustereventsd-FreeBSD.in</a></div><div class='hunk'>@@ -0,0 +1,19 @@</div><div class='add'>+#!/bin/sh</div><div class='add'>+#</div><div class='add'>+# $FreeBSD$</div><div class='add'>+#</div><div class='add'>+</div><div class='add'>+# PROVIDE: glustereventsd</div><div class='add'>+</div><div class='add'>+. /etc/rc.subr</div><div class='add'>+</div><div class='add'>+name="glustereventsd"</div><div class='add'>+rcvar=`set_rcvar`</div><div class='add'>+command=@prefix@/sbin/${name}</div><div class='add'>+command_interpreter=/usr/local/bin/python</div><div class='add'>+pidfile="/var/run/${name}.pid"</div><div class='add'>+glustereventsd_flags="-p /var/run/${name}.pid"</div><div class='add'>+start_cmd="/usr/sbin/daemon $command ${glustereventsd_flags}"</div><div class='add'>+</div><div class='add'>+load_rc_config $name</div><div class='add'>+run_rc_command "$1"</div><div class='head'>diff --git a/extras/init.d/glustereventsd-Redhat.in b/extras/init.d/glustereventsd-Redhat.in<br/>new file mode 100644<br/>index 00000000000..d23ce4c244f<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/extras/init.d/glustereventsd-Redhat.in?id=d1d7a6f35c816822fab51c820e25023863c239c1'>extras/init.d/glustereventsd-Redhat.in</a></div><div class='hunk'>@@ -0,0 +1,129 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+#</div><div class='add'>+# glustereventsd   Startup script for the glusterfs Events server</div><div class='add'>+#</div><div class='add'>+# chkconfig:   - 20 80</div><div class='add'>+# description: Gluster Events Server</div><div class='add'>+</div><div class='add'>+### BEGIN INIT INFO</div><div class='add'>+# Provides: glustereventsd</div><div class='add'>+# Required-Start: $local_fs $network</div><div class='add'>+# Required-Stop: $local_fs $network</div><div class='add'>+# Should-Start:</div><div class='add'>+# Should-Stop:</div><div class='add'>+# Default-Start: 2 3 4 5</div><div class='add'>+# Default-Stop: 0 1 6</div><div class='add'>+# Short-Description: glusterfs Events server</div><div class='add'>+# Description:       GlusterFS Events Server</div><div class='add'>+### END INIT INFO</div><div class='add'>+#</div><div class='add'>+</div><div class='add'>+# Source function library.</div><div class='add'>+. /etc/rc.d/init.d/functions</div><div class='add'>+</div><div class='add'>+BASE=glustereventsd</div><div class='add'>+</div><div class='add'>+# Fedora File System Layout dictates /run</div><div class='add'>+[ -e /run ] &amp;&amp; RUNDIR="/run"</div><div class='add'>+PIDFILE="${RUNDIR:-/var/run}/${BASE}.pid"</div><div class='add'>+</div><div class='add'>+PID=`test -f $PIDFILE &amp;&amp; cat $PIDFILE`</div><div class='add'>+</div><div class='add'>+GLUSTEREVENTSD_BIN=@prefix@/sbin/$BASE</div><div class='add'>+GLUSTEREVENTSD_OPTS="--pid-file=$PIDFILE"</div><div class='add'>+GLUSTEREVENTSD="$GLUSTEREVENTSD_BIN $GLUSTEREVENTSD_OPTS"</div><div class='add'>+RETVAL=0</div><div class='add'>+</div><div class='add'>+LOCKFILE=/var/lock/subsys/${BASE}</div><div class='add'>+</div><div class='add'>+# Start the service $BASE</div><div class='add'>+start()</div><div class='add'>+{</div><div class='add'>+       if pidofproc -p $PIDFILE $GLUSTEREVENTSD_BIN &amp;&gt; /dev/null; then</div><div class='add'>+           echo "glustereventsd service is already running with pid $PID"</div><div class='add'>+           return 0</div><div class='add'>+       else</div><div class='add'>+           echo -n $"Starting $BASE:"</div><div class='add'>+           daemon $GLUSTEREVENTSD &amp;</div><div class='add'>+           RETVAL=$?</div><div class='add'>+           echo</div><div class='add'>+           [ $RETVAL -eq 0 ] &amp;&amp; touch $LOCKFILE</div><div class='add'>+           return $RETVAL</div><div class='add'>+       fi</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+# Stop the service $BASE</div><div class='add'>+stop()</div><div class='add'>+{</div><div class='add'>+    echo -n $"Stopping $BASE:"</div><div class='add'>+    if pidofproc -p $PIDFILE $GLUSTEREVENTSD_BIN &amp;&gt; /dev/null; then</div><div class='add'>+        killproc -p $PIDFILE $BASE</div><div class='add'>+    else</div><div class='add'>+        killproc $BASE</div><div class='add'>+    fi</div><div class='add'>+    RETVAL=$?</div><div class='add'>+    echo</div><div class='add'>+    [ $RETVAL -eq 0 ] &amp;&amp; rm -f $LOCKFILE</div><div class='add'>+    return $RETVAL</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+restart()</div><div class='add'>+{</div><div class='add'>+    stop</div><div class='add'>+    start</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+reload()</div><div class='add'>+{</div><div class='add'>+    restart</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+force_reload()</div><div class='add'>+{</div><div class='add'>+    restart</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+rh_status()</div><div class='add'>+{</div><div class='add'>+    status $BASE</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+rh_status_q()</div><div class='add'>+{</div><div class='add'>+    rh_status &amp;&gt;/dev/null</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+### service arguments ###</div><div class='add'>+case $1 in</div><div class='add'>+    start)</div><div class='add'>+        rh_status_q &amp;&amp; exit 0</div><div class='add'>+        $1</div><div class='add'>+        ;;</div><div class='add'>+    stop)</div><div class='add'>+        rh_status_q || exit 0</div><div class='add'>+        $1</div><div class='add'>+        ;;</div><div class='add'>+    restart)</div><div class='add'>+        $1</div><div class='add'>+        ;;</div><div class='add'>+    reload)</div><div class='add'>+        rh_status_q || exit 7</div><div class='add'>+        $1</div><div class='add'>+        ;;</div><div class='add'>+    force-reload)</div><div class='add'>+        force_reload</div><div class='add'>+        ;;</div><div class='add'>+    status)</div><div class='add'>+        rh_status</div><div class='add'>+        ;;</div><div class='add'>+    condrestart|try-restart)</div><div class='add'>+        rh_status_q || exit 0</div><div class='add'>+        restart</div><div class='add'>+        ;;</div><div class='add'>+    *)</div><div class='add'>+        echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload}"</div><div class='add'>+        exit 1</div><div class='add'>+esac</div><div class='add'>+</div><div class='add'>+exit $?</div><div class='head'>diff --git a/extras/init.d/glusterfsd-Redhat.in b/extras/init.d/glusterfsd-Redhat.in<br/>deleted file mode 100755<br/>index 2f5009ef78f..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/extras/init.d/glusterfsd-Redhat.in?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/init.d/glusterfsd-Redhat.in</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,54 +0,0 @@</div><div class='del'>-#!/bin/bash</div><div class='del'>-#</div><div class='del'>-# chkconfig: 35 90 12</div><div class='del'>-# description: Glusterfsd server</div><div class='del'>-#</div><div class='del'>-</div><div class='del'>-# Get function from functions library</div><div class='del'>-. /etc/rc.d/init.d/functions</div><div class='del'>-</div><div class='del'>-BASE=glusterfsd</div><div class='del'>-GLUSTERFSD_BIN=@exec_prefix@/sbin/$BASE</div><div class='del'>-CONFIGFILE=/etc/glusterfs/glusterfsd.vol</div><div class='del'>-GLUSTERFSD_OPTS="-f $CONFIGFILE"</div><div class='del'>-GSERVER="$GLUSTERFSD_BIN $GLUSTERFSD_OPTS"</div><div class='del'>-RETVAL=0</div><div class='del'>-</div><div class='del'>-# Start the service $BASE</div><div class='del'>-start()</div><div class='del'>-{</div><div class='del'>-       echo $"Starting $BASE:"</div><div class='del'>-       daemon $GSERVER</div><div class='del'>-       RETVAL=$?</div><div class='del'>-       [ $RETVAL -ne 0 ] &amp;&amp; exit $RETVAL</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-# Stop the service $BASE</div><div class='del'>-stop()</div><div class='del'>-{</div><div class='del'>-       echo $"Stopping $BASE:"</div><div class='del'>-       killproc $BASE </div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-### service arguments ###</div><div class='del'>-case $1 in</div><div class='del'>- start)</div><div class='del'>-       start</div><div class='del'>-       ;;</div><div class='del'>- stop)</div><div class='del'>-       stop</div><div class='del'>-       ;;</div><div class='del'>- status)</div><div class='del'>-       status $BASE</div><div class='del'>-       ;;</div><div class='del'>- restart)</div><div class='del'>-       $0 stop</div><div class='del'>-       $0 start</div><div class='del'>-       ;;</div><div class='del'>- *)</div><div class='del'>-       echo $"Usage: $0 {start|stop|status|restart}."</div><div class='del'>-       exit 1</div><div class='del'>-esac</div><div class='del'>-</div><div class='del'>-exit 0</div><div class='head'>diff --git a/extras/logger.conf.example b/extras/logger.conf.example<br/>new file mode 100644<br/>index 00000000000..248be5bda69<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/extras/logger.conf.example?id=d1d7a6f35c816822fab51c820e25023863c239c1'>extras/logger.conf.example</a></div><div class='hunk'>@@ -0,0 +1,13 @@</div><div class='add'>+#</div><div class='add'>+# Sample logger.conf file to configure enhanced Logging in GlusterFS</div><div class='add'>+#</div><div class='add'>+# To enable enhanced logging capabilities,</div><div class='add'>+#</div><div class='add'>+# 1. rename this file to /etc/glusterfs/logger.conf</div><div class='add'>+#</div><div class='add'>+# 2. rename /etc/rsyslog.d/gluster.conf.example to</div><div class='add'>+#    /etc/rsyslog.d/gluster.conf</div><div class='add'>+#</div><div class='add'>+# This change requires restart of all gluster services/volumes and</div><div class='add'>+# rsyslog.</div><div class='add'>+#</div><div class='head'>diff --git a/extras/mount-shared-storage.sh b/extras/mount-shared-storage.sh<br/>new file mode 100755<br/>index 00000000000..cc40e13c3e3<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/extras/mount-shared-storage.sh?id=d1d7a6f35c816822fab51c820e25023863c239c1'>extras/mount-shared-storage.sh</a></div><div class='hunk'>@@ -0,0 +1,39 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+#Post reboot there is a chance in which mounting of shared storage will fail</div><div class='add'>+#This will impact starting of features like NFS-Ganesha. So this script will</div><div class='add'>+#try to mount the shared storage if it fails</div><div class='add'>+</div><div class='add'>+exitStatus=0</div><div class='add'>+</div><div class='add'>+while IFS= read -r glm</div><div class='add'>+do</div><div class='add'>+	IFS=$' \t' read -r -a arr &lt;&lt;&lt; "$glm"</div><div class='add'>+</div><div class='add'>+	#Validate storage type is glusterfs</div><div class='add'>+	if [ "${arr[2]}" == "glusterfs" ]</div><div class='add'>+	then</div><div class='add'>+</div><div class='add'>+		#check whether shared storage is mounted</div><div class='add'>+		#if it is mounted then mountpoint -q will return a 0 success code</div><div class='add'>+		if mountpoint -q "${arr[1]}"</div><div class='add'>+		then</div><div class='add'>+			echo "${arr[1]} is already mounted"</div><div class='add'>+			continue</div><div class='add'>+		fi</div><div class='add'>+</div><div class='add'>+		mount -t glusterfs -o "${arr[3]}" "${arr[0]}" "${arr[1]}"</div><div class='add'>+		#wait for few seconds</div><div class='add'>+		sleep 10</div><div class='add'>+</div><div class='add'>+		#recheck mount got succeed</div><div class='add'>+		if mountpoint -q "${arr[1]}"</div><div class='add'>+		then</div><div class='add'>+			echo "${arr[1]} has been mounted"</div><div class='add'>+			continue</div><div class='add'>+		else</div><div class='add'>+			echo "${arr[1]} failed to mount"</div><div class='add'>+			exitStatus=1</div><div class='add'>+		fi</div><div class='add'>+	fi</div><div class='add'>+done &lt;&lt;&lt; "$(sed '/^#/ d' &lt;/etc/fstab | grep 'glusterfs')"</div><div class='add'>+exit $exitStatus</div><div class='head'>diff --git a/extras/ocf/Makefile.am b/extras/ocf/Makefile.am<br/>new file mode 100644<br/>index 00000000000..c49a835fbca<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/extras/ocf/Makefile.am?id=d1d7a6f35c816822fab51c820e25023863c239c1'>extras/ocf/Makefile.am</a></div><div class='hunk'>@@ -0,0 +1,11 @@</div><div class='add'>+EXTRA_DIST = glusterd.in volume.in</div><div class='add'>+</div><div class='add'>+# The root of the OCF resource agent hierarchy</div><div class='add'>+# Per the OCF standard, it's always "lib",</div><div class='add'>+# not "lib64" (even on 64-bit platforms).</div><div class='add'>+ocfdir = $(prefix)/lib/ocf</div><div class='add'>+</div><div class='add'>+# The ceph provider directory</div><div class='add'>+radir = $(ocfdir)/resource.d/$(PACKAGE_NAME)</div><div class='add'>+</div><div class='add'>+ra_SCRIPTS = glusterd volume</div><div class='head'>diff --git a/extras/ocf/glusterd.in b/extras/ocf/glusterd.in<br/>new file mode 100755<br/>index 00000000000..c119a285d32<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/extras/ocf/glusterd.in?id=d1d7a6f35c816822fab51c820e25023863c239c1'>extras/ocf/glusterd.in</a></div><div class='hunk'>@@ -0,0 +1,212 @@</div><div class='add'>+#!/bin/sh</div><div class='add'>+#</div><div class='add'>+# glusterd</div><div class='add'>+#</div><div class='add'>+# Description:  Manages a glusterd server as a (typically cloned)</div><div class='add'>+#               HA resource</div><div class='add'>+#</div><div class='add'>+# Authors:      Florian Haas (hastexo Professional Services GmbH)</div><div class='add'>+#</div><div class='add'>+# License:      GNU General Public License (GPL)</div><div class='add'>+</div><div class='add'>+#######################################################################</div><div class='add'>+# Initialization:</div><div class='add'>+</div><div class='add'>+: ${OCF_FUNCTIONS_DIR=${OCF_ROOT}/lib/heartbeat}</div><div class='add'>+. ${OCF_FUNCTIONS_DIR}/ocf-shellfuncs</div><div class='add'>+</div><div class='add'>+# Convenience variables</div><div class='add'>+# When sysconfdir and localstatedir aren't passed in as</div><div class='add'>+# configure flags, they're defined in terms of prefix</div><div class='add'>+prefix=@prefix@</div><div class='add'>+#######################################################################</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+OCF_RESKEY_binary_default="glusterd"</div><div class='add'>+OCF_RESKEY_pid_default="@localstatedir@/run/glusterd.pid"</div><div class='add'>+OCF_RESKEY_socket_default=""</div><div class='add'>+OCF_RESKEY_additional_parameters_default=""</div><div class='add'>+</div><div class='add'>+: ${OCF_RESKEY_binary=${OCF_RESKEY_binary_default}}</div><div class='add'>+: ${OCF_RESKEY_pid=${OCF_RESKEY_pid_default}}</div><div class='add'>+</div><div class='add'>+glusterd_meta_data() {</div><div class='add'>+    cat &lt;&lt;EOF</div><div class='add'>+&lt;?xml version="1.0"?&gt;</div><div class='add'>+&lt;!DOCTYPE resource-agent SYSTEM "ra-api-1.dtd"&gt;</div><div class='add'>+&lt;resource-agent name="glusterd" version="0.1"&gt;</div><div class='add'>+  &lt;version&gt;0.1&lt;/version&gt;</div><div class='add'>+  &lt;longdesc lang="en"&gt;</div><div class='add'>+  &lt;/longdesc&gt;</div><div class='add'>+  &lt;shortdesc lang="en"&gt;Manages a Gluster server&lt;/shortdesc&gt;</div><div class='add'>+  &lt;parameters&gt;</div><div class='add'>+    &lt;parameter name="binary"&gt;</div><div class='add'>+      &lt;longdesc lang="en"&gt;</div><div class='add'>+      Name of the glusterd executable. Specify a full absolute</div><div class='add'>+      path if the binary is not in your \$PATH.</div><div class='add'>+      &lt;/longdesc&gt;</div><div class='add'>+      &lt;shortdesc lang="en"&gt;glusterd executable&lt;/shortdesc&gt;</div><div class='add'>+      &lt;content type="string" default="$OCF_RESKEY_binary_default"/&gt;</div><div class='add'>+    &lt;/parameter&gt;</div><div class='add'>+    &lt;parameter name="pid"&gt;</div><div class='add'>+      &lt;longdesc lang="en"&gt;</div><div class='add'>+      Path to the glusterd PID file.</div><div class='add'>+      &lt;/longdesc&gt;</div><div class='add'>+      &lt;shortdesc lang="en"&gt;PID file&lt;/shortdesc&gt;</div><div class='add'>+      &lt;content type="string" default="$OCF_RESKEY_pid_default"/&gt;</div><div class='add'>+    &lt;/parameter&gt;</div><div class='add'>+    &lt;parameter name="socket"&gt;</div><div class='add'>+      &lt;longdesc lang="en"&gt;</div><div class='add'>+      Path to the glusterd UNIX socket file. If unspecified,</div><div class='add'>+      glusterd will not listen on any socket.</div><div class='add'>+      &lt;/longdesc&gt;</div><div class='add'>+      &lt;shortdesc lang="en"&gt;Socket file&lt;/shortdesc&gt;</div><div class='add'>+      &lt;content type="string"/&gt;</div><div class='add'>+    &lt;/parameter&gt;</div><div class='add'>+  &lt;/parameters&gt;</div><div class='add'>+  &lt;actions&gt;</div><div class='add'>+    &lt;action name="start"        timeout="20" /&gt;</div><div class='add'>+    &lt;action name="stop"         timeout="20" /&gt;</div><div class='add'>+    &lt;action name="monitor"      timeout="20" interval="10" /&gt;</div><div class='add'>+    &lt;action name="reload"       timeout="20" /&gt;</div><div class='add'>+    &lt;action name="meta-data"    timeout="5" /&gt;</div><div class='add'>+    &lt;action name="validate-all"   timeout="20" /&gt;</div><div class='add'>+  &lt;/actions&gt;</div><div class='add'>+&lt;/resource-agent&gt;</div><div class='add'>+EOF</div><div class='add'>+</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+glusterd_start() {</div><div class='add'>+    local glusterd_options</div><div class='add'>+    # exit immediately if configuration is not valid</div><div class='add'>+    glusterd_validate_all || exit $?</div><div class='add'>+</div><div class='add'>+    # if resource is already running, bail out early</div><div class='add'>+    if glusterd_monitor; then</div><div class='add'>+        ocf_log info "Resource is already running"</div><div class='add'>+        return $OCF_SUCCESS</div><div class='add'>+    fi</div><div class='add'>+</div><div class='add'>+    # actually start up the resource here (make sure to immediately</div><div class='add'>+    # exit with an $OCF_ERR_ error code if anything goes seriously</div><div class='add'>+    # wrong)</div><div class='add'>+    glusterd_options="-p $OCF_RESKEY_pid"</div><div class='add'>+    if [ -n "$OCF_RESKEY_socket" ]; then</div><div class='add'>+	glusterd_options="$glusterd_options -S $OCF_RESKEY_socket"</div><div class='add'>+    fi</div><div class='add'>+    if [ -n "$OCF_RESKEY_additional_parameters" ]; then</div><div class='add'>+	glusterd_options="$glusterd_options $OCF_RESKEY_additional_parameters"</div><div class='add'>+    fi</div><div class='add'>+</div><div class='add'>+    ocf_run $OCF_RESKEY_binary $glusterd_options || exit $OCF_ERR_GENERIC</div><div class='add'>+</div><div class='add'>+    # After the resource has been started, check whether it started up</div><div class='add'>+    # correctly. If the resource starts asynchronously, the agent may</div><div class='add'>+    # spin on the monitor function here -- if the resource does not</div><div class='add'>+    # start up within the defined timeout, the cluster manager will</div><div class='add'>+    # consider the start action failed</div><div class='add'>+    while ! glusterd_monitor; do</div><div class='add'>+        ocf_log debug "Resource has not started yet, waiting"</div><div class='add'>+        sleep 1</div><div class='add'>+    done</div><div class='add'>+</div><div class='add'>+    # only return $OCF_SUCCESS if _everything_ succeeded as expected</div><div class='add'>+    return $OCF_SUCCESS</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+glusterd_stop() {</div><div class='add'>+    local rc</div><div class='add'>+    local pid</div><div class='add'>+</div><div class='add'>+    # exit immediately if configuration is not valid</div><div class='add'>+    glusterd_validate_all || exit $?</div><div class='add'>+</div><div class='add'>+    glusterd_monitor</div><div class='add'>+    rc=$?</div><div class='add'>+    case "$rc" in</div><div class='add'>+        "$OCF_SUCCESS")</div><div class='add'>+            # Currently running. Normal, expected behavior.</div><div class='add'>+            ocf_log debug "Resource is currently running"</div><div class='add'>+            ;;</div><div class='add'>+        "$OCF_NOT_RUNNING")</div><div class='add'>+            # Currently not running. Nothing to do.</div><div class='add'>+            ocf_log info "Resource is already stopped"</div><div class='add'>+            return $OCF_SUCCESS</div><div class='add'>+            ;;</div><div class='add'>+    esac</div><div class='add'>+</div><div class='add'>+    # actually shut down the resource here (make sure to immediately</div><div class='add'>+    # exit with an $OCF_ERR_ error code if anything goes seriously</div><div class='add'>+    # wrong)</div><div class='add'>+    pid=`cat $OCF_RESKEY_pid`</div><div class='add'>+    ocf_run kill -s TERM $pid || exit OCF_ERR_GENERIC</div><div class='add'>+</div><div class='add'>+    # After the resource has been stopped, check whether it shut down</div><div class='add'>+    # correctly. If the resource stops asynchronously, the agent may</div><div class='add'>+    # spin on the monitor function here -- if the resource does not</div><div class='add'>+    # shut down within the defined timeout, the cluster manager will</div><div class='add'>+    # consider the stop action failed</div><div class='add'>+    while glusterd_monitor; do</div><div class='add'>+        ocf_log debug "Resource has not stopped yet, waiting"</div><div class='add'>+        sleep 1</div><div class='add'>+    done</div><div class='add'>+</div><div class='add'>+    # only return $OCF_SUCCESS if _everything_ succeeded as expected</div><div class='add'>+    return $OCF_SUCCESS</div><div class='add'>+</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+glusterd_monitor() {</div><div class='add'>+    local pid</div><div class='add'>+</div><div class='add'>+    [ -e $OCF_RESKEY_pid ] || return $OCF_NOT_RUNNING</div><div class='add'>+</div><div class='add'>+    pid=`cat $OCF_RESKEY_pid`</div><div class='add'>+    ocf_run kill -s 0 $pid || return $OCF_NOT_RUNNING</div><div class='add'>+</div><div class='add'>+    ocf_log debug "$OCF_RESKEY_binary running with PID $pid"</div><div class='add'>+    return $OCF_SUCCESS</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+glusterd_validate_all() {</div><div class='add'>+    # Test for required binaries</div><div class='add'>+    check_binary $OCF_RESKEY_binary</div><div class='add'>+</div><div class='add'>+    return $OCF_SUCCESS</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+# Make sure meta-data and usage always succeed</div><div class='add'>+case $__OCF_ACTION in</div><div class='add'>+meta-data)      glusterd_meta_data</div><div class='add'>+                exit $OCF_SUCCESS</div><div class='add'>+                ;;</div><div class='add'>+usage|help)     glusterd_usage</div><div class='add'>+                exit $OCF_SUCCESS</div><div class='add'>+                ;;</div><div class='add'>+esac</div><div class='add'>+</div><div class='add'>+# Anything other than meta-data and usage must pass validation</div><div class='add'>+glusterd_validate_all || exit $?</div><div class='add'>+</div><div class='add'>+# Translate each action into the appropriate function call</div><div class='add'>+case $__OCF_ACTION in</div><div class='add'>+start)          glusterd_start;;</div><div class='add'>+stop)           glusterd_stop;;</div><div class='add'>+status|monitor) glusterd_monitor;;</div><div class='add'>+reload)         ocf_log info "Reloading..."</div><div class='add'>+                glusterd_start</div><div class='add'>+                ;;</div><div class='add'>+validate-all)   ;;</div><div class='add'>+notify)		exit $OCF_SUCCESS;;</div><div class='add'>+*)              glusterd_usage</div><div class='add'>+                exit $OCF_ERR_UNIMPLEMENTED</div><div class='add'>+                ;;</div><div class='add'>+esac</div><div class='add'>+rc=$?</div><div class='add'>+</div><div class='add'>+# The resource agent may optionally log a debug message</div><div class='add'>+ocf_log debug "${OCF_RESOURCE_INSTANCE} $__OCF_ACTION returned $rc"</div><div class='add'>+exit $rc</div><div class='head'>diff --git a/extras/ocf/volume.in b/extras/ocf/volume.in<br/>new file mode 100755<br/>index 00000000000..76cc649e55f<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/extras/ocf/volume.in?id=d1d7a6f35c816822fab51c820e25023863c239c1'>extras/ocf/volume.in</a></div><div class='hunk'>@@ -0,0 +1,276 @@</div><div class='add'>+#!/bin/sh</div><div class='add'>+#</div><div class='add'>+# glusterd</div><div class='add'>+#</div><div class='add'>+# Description:  Manages a glusterd server as a (typically cloned)</div><div class='add'>+#               HA resource</div><div class='add'>+#</div><div class='add'>+# Authors:      Florian Haas (hastexo Professional Services GmbH)</div><div class='add'>+#               Jiri Lunacek (Hosting90 Systems s.r.o.)</div><div class='add'>+#</div><div class='add'>+# License:      GNU General Public License (GPL)</div><div class='add'>+</div><div class='add'>+#######################################################################</div><div class='add'>+# Initialization:</div><div class='add'>+</div><div class='add'>+: ${OCF_FUNCTIONS_DIR=${OCF_ROOT}/lib/heartbeat}</div><div class='add'>+. ${OCF_FUNCTIONS_DIR}/ocf-shellfuncs</div><div class='add'>+</div><div class='add'>+# Convenience variables</div><div class='add'>+# When sysconfdir and localstatedir aren't passed in as</div><div class='add'>+# configure flags, they're defined in terms of prefix</div><div class='add'>+prefix=@prefix@</div><div class='add'>+SHORTHOSTNAME=`hostname -s`</div><div class='add'>+#######################################################################</div><div class='add'>+</div><div class='add'>+OCF_RESKEY_binary_default="gluster"</div><div class='add'>+</div><div class='add'>+: ${OCF_RESKEY_binary=${OCF_RESKEY_binary_default}}</div><div class='add'>+</div><div class='add'>+volume_meta_data() {</div><div class='add'>+    cat &lt;&lt;EOF</div><div class='add'>+&lt;?xml version="1.0"?&gt;</div><div class='add'>+&lt;!DOCTYPE resource-agent SYSTEM "ra-api-1.dtd"&gt;</div><div class='add'>+&lt;resource-agent name="volume" version="0.1"&gt;</div><div class='add'>+  &lt;version&gt;0.1&lt;/version&gt;</div><div class='add'>+  &lt;longdesc lang="en"&gt;</div><div class='add'>+Manages a GlusterFS volume and monitors its bricks. When a resource of</div><div class='add'>+this type is configured as a clone (as is commonly the case), then it</div><div class='add'>+must have clone ordering enabled.</div><div class='add'>+  &lt;/longdesc&gt;</div><div class='add'>+  &lt;shortdesc lang="en"&gt;Manages a GlusterFS volume&lt;/shortdesc&gt;</div><div class='add'>+  &lt;parameters&gt;</div><div class='add'>+    &lt;parameter name="volname" required="1"&gt;</div><div class='add'>+      &lt;longdesc lang="en"&gt;</div><div class='add'>+      The name of the volume to manage.</div><div class='add'>+      &lt;/longdesc&gt;</div><div class='add'>+      &lt;shortdesc lang="en"&gt;volume name&lt;/shortdesc&gt;</div><div class='add'>+      &lt;content type="string"/&gt;</div><div class='add'>+    &lt;/parameter&gt;</div><div class='add'>+    &lt;parameter name="binary"&gt;</div><div class='add'>+      &lt;longdesc lang="en"&gt;</div><div class='add'>+      Name of the gluster executable. Specify a full absolute</div><div class='add'>+      path if the binary is not in your \$PATH.</div><div class='add'>+      &lt;/longdesc&gt;</div><div class='add'>+      &lt;shortdesc lang="en"&gt;gluster executable&lt;/shortdesc&gt;</div><div class='add'>+      &lt;content type="string" default="$OCF_RESKEY_binary_default"/&gt;</div><div class='add'>+    &lt;/parameter&gt;</div><div class='add'>+    &lt;parameter name="peer_map"&gt;</div><div class='add'>+      &lt;longdesc lang="en"&gt;</div><div class='add'>+      Mapping of hostname - peer name in the gluster cluster</div><div class='add'>+      in format hostname1:peername1,hostname2:peername2,...</div><div class='add'>+      &lt;/longdesc&gt;</div><div class='add'>+      &lt;shortdesc lang="en"&gt;gluster peer map&lt;/shortdesc&gt;</div><div class='add'>+      &lt;content type="string" default=""/&gt;</div><div class='add'>+    &lt;/parameter&gt;</div><div class='add'>+  &lt;/parameters&gt;</div><div class='add'>+  &lt;actions&gt;</div><div class='add'>+    &lt;action name="start"        timeout="20" /&gt;</div><div class='add'>+    &lt;action name="stop"         timeout="20" /&gt;</div><div class='add'>+    &lt;action name="monitor"      timeout="20" interval="10" /&gt;</div><div class='add'>+    &lt;action name="reload"       timeout="20" /&gt;</div><div class='add'>+    &lt;action name="meta-data"    timeout="5" /&gt;</div><div class='add'>+    &lt;action name="validate-all"   timeout="20" /&gt;</div><div class='add'>+  &lt;/actions&gt;</div><div class='add'>+&lt;/resource-agent&gt;</div><div class='add'>+EOF</div><div class='add'>+</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+if [ -n "${OCF_RESKEY_peer_map}" ]; then</div><div class='add'>+    SHORTHOSTNAME=`echo "${OCF_RESKEY_peer_map}" | egrep -o "$SHORTHOSTNAME\:[^,]+" | awk -F: '{print $2}'`</div><div class='add'>+fi</div><div class='add'>+</div><div class='add'>+volume_getdir() {</div><div class='add'>+    local voldir</div><div class='add'>+    voldir="@GLUSTERD_WORKDIR@/vols/${OCF_RESKEY_volname}"</div><div class='add'>+</div><div class='add'>+    [ -d ${voldir} ] || return 1</div><div class='add'>+</div><div class='add'>+    echo "${voldir}"</div><div class='add'>+    return 0</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+volume_getpid_dir() {</div><div class='add'>+    local volpid_dir</div><div class='add'>+    volpid_dir="/var/run/gluster/vols/${OCF_RESKEY_volname}"</div><div class='add'>+</div><div class='add'>+    [ -d ${volpid_dir} ] || return 1</div><div class='add'>+</div><div class='add'>+    echo "${volpid_dir}"</div><div class='add'>+    return 0</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+volume_getbricks() {</div><div class='add'>+    local infofile</div><div class='add'>+    local voldir</div><div class='add'>+    voldir=`volume_getdir`</div><div class='add'>+    infofile="${voldir}/info"</div><div class='add'>+</div><div class='add'>+    [ -e ${infofile} ] || return 1</div><div class='add'>+</div><div class='add'>+    echo "`sed -n -e "s/^brick-.\+=${SHORTHOSTNAME}://p" &lt; ${infofile}`"</div><div class='add'>+    return 0</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+volume_getpids() {</div><div class='add'>+    local bricks</div><div class='add'>+    local pidfile</div><div class='add'>+    local infofile</div><div class='add'>+    local volpid_dir</div><div class='add'>+</div><div class='add'>+    volpid_dir=`volume_getpid_dir`</div><div class='add'>+    bricks=`volume_getbricks`</div><div class='add'>+    </div><div class='add'>+    if [ -z "$bricks" ]; then</div><div class='add'>+        return 1</div><div class='add'>+    fi</div><div class='add'>+</div><div class='add'>+    for brick in ${bricks}; do</div><div class='add'>+	pidfile="${volpid_dir}/${SHORTHOSTNAME}${brick}.pid"</div><div class='add'>+	[ -e $pidfile ] || return 1</div><div class='add'>+	cat $pidfile</div><div class='add'>+    done</div><div class='add'>+</div><div class='add'>+    return 0</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+volume_start() {</div><div class='add'>+    local volume_options</div><div class='add'>+</div><div class='add'>+    # exit immediately if configuration is not valid</div><div class='add'>+    volume_validate_all || exit $?</div><div class='add'>+</div><div class='add'>+    # if resource is already running, bail out early</div><div class='add'>+    if volume_monitor; then</div><div class='add'>+        ocf_log info "Resource is already running"</div><div class='add'>+        return $OCF_SUCCESS</div><div class='add'>+    fi</div><div class='add'>+</div><div class='add'>+    # actually start up the resource here</div><div class='add'>+    ocf_run "$OCF_RESKEY_binary" \</div><div class='add'>+	volume start "$OCF_RESKEY_volname" force || exit $OCF_ERR_GENERIC</div><div class='add'>+</div><div class='add'>+    # After the resource has been started, check whether it started up</div><div class='add'>+    # correctly. If the resource starts asynchronously, the agent may</div><div class='add'>+    # spin on the monitor function here -- if the resource does not</div><div class='add'>+    # start up within the defined timeout, the cluster manager will</div><div class='add'>+    # consider the start action failed</div><div class='add'>+    while ! volume_monitor; do</div><div class='add'>+        ocf_log debug "Resource has not started yet, waiting"</div><div class='add'>+        sleep 1</div><div class='add'>+    done</div><div class='add'>+</div><div class='add'>+    # only return $OCF_SUCCESS if _everything_ succeeded as expected</div><div class='add'>+    return $OCF_SUCCESS</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+volume_stop() {</div><div class='add'>+    local rc</div><div class='add'>+    local pid</div><div class='add'>+</div><div class='add'>+    # exit immediately if configuration is not valid</div><div class='add'>+    volume_validate_all || exit $?</div><div class='add'>+</div><div class='add'>+    volume_monitor</div><div class='add'>+    rc=$?</div><div class='add'>+    case "$rc" in</div><div class='add'>+        "$OCF_SUCCESS")</div><div class='add'>+            # Currently running. Normal, expected behavior.</div><div class='add'>+            ocf_log debug "Resource is currently running"</div><div class='add'>+            ;;</div><div class='add'>+        "$OCF_NOT_RUNNING")</div><div class='add'>+            # Currently not running. Nothing to do.</div><div class='add'>+            ocf_log info "Resource is already stopped"</div><div class='add'>+            return $OCF_SUCCESS</div><div class='add'>+            ;;</div><div class='add'>+    esac</div><div class='add'>+</div><div class='add'>+    # actually shut down the resource here (make sure to immediately</div><div class='add'>+    # exit with an $OCF_ERR_ error code if anything goes seriously</div><div class='add'>+    # wrong)</div><div class='add'>+    pids=`volume_getpids`</div><div class='add'>+    for pid in $pids; do</div><div class='add'>+	ocf_run kill -s TERM $pid</div><div class='add'>+    done</div><div class='add'>+</div><div class='add'>+    # After the resource has been stopped, check whether it shut down</div><div class='add'>+    # correctly. If the resource stops asynchronously, the agent may</div><div class='add'>+    # spin on the monitor function here -- if the resource does not</div><div class='add'>+    # shut down within the defined timeout, the cluster manager will</div><div class='add'>+    # consider the stop action failed</div><div class='add'>+    while volume_monitor; do</div><div class='add'>+        ocf_log debug "Resource has not stopped yet, waiting"</div><div class='add'>+        sleep 1</div><div class='add'>+    done</div><div class='add'>+</div><div class='add'>+    # only return $OCF_SUCCESS if _everything_ succeeded as expected</div><div class='add'>+    return $OCF_SUCCESS</div><div class='add'>+</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+volume_monitor() {</div><div class='add'>+    local pid</div><div class='add'>+</div><div class='add'>+    pids=`volume_getpids` || return $OCF_NOT_RUNNING</div><div class='add'>+</div><div class='add'>+    for pid in $pids; do</div><div class='add'>+	ocf_run kill -s 0 $pid || return $OCF_NOT_RUNNING</div><div class='add'>+    done</div><div class='add'>+</div><div class='add'>+    ocf_log debug "Local bricks for volume ${OCF_RESKEY_volname} running with PIDs $pids"</div><div class='add'>+    return $OCF_SUCCESS</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+volume_validate_all() {</div><div class='add'>+    # Test for configuration errors first</div><div class='add'>+    if [ -z "${OCF_RESKEY_volname}" ]; then</div><div class='add'>+	ocf_log err 'Missing required parameter "volname"'</div><div class='add'>+	return $OCF_ERR_CONFIGURED</div><div class='add'>+    fi</div><div class='add'>+</div><div class='add'>+    # Test for required binaries</div><div class='add'>+    check_binary $OCF_RESKEY_binary</div><div class='add'>+	</div><div class='add'>+	if [ -z "$SHORTHOSTNAME" ]; then</div><div class='add'>+		ocf_log err 'Unable to get host in node map'</div><div class='add'>+		return $OCF_ERR_CONFIGURED</div><div class='add'>+	fi</div><div class='add'>+</div><div class='add'>+    return $OCF_SUCCESS</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+# Make sure meta-data and usage always succeed</div><div class='add'>+case $__OCF_ACTION in</div><div class='add'>+meta-data)      volume_meta_data</div><div class='add'>+                exit $OCF_SUCCESS</div><div class='add'>+                ;;</div><div class='add'>+usage|help)     volume_usage</div><div class='add'>+                exit $OCF_SUCCESS</div><div class='add'>+                ;;</div><div class='add'>+esac</div><div class='add'>+</div><div class='add'>+# Anything other than meta-data and usage must pass validation</div><div class='add'>+volume_validate_all || exit $?</div><div class='add'>+</div><div class='add'>+# Translate each action into the appropriate function call</div><div class='add'>+case $__OCF_ACTION in</div><div class='add'>+start)          volume_start;;</div><div class='add'>+stop)           volume_stop;;</div><div class='add'>+status|monitor) volume_monitor;;</div><div class='add'>+reload)         ocf_log info "Reloading..."</div><div class='add'>+                volume_start</div><div class='add'>+                ;;</div><div class='add'>+validate-all)   ;;</div><div class='add'>+notify)		exit $OCF_SUCCESS;;</div><div class='add'>+*)              volume_usage</div><div class='add'>+                exit $OCF_ERR_UNIMPLEMENTED</div><div class='add'>+                ;;</div><div class='add'>+esac</div><div class='add'>+rc=$?</div><div class='add'>+</div><div class='add'>+# The resource agent may optionally log a debug message</div><div class='add'>+ocf_log debug "${OCF_RESOURCE_INSTANCE} $__OCF_ACTION returned $rc"</div><div class='add'>+exit $rc</div><div class='head'>diff --git a/extras/peer_add_secret_pub.in b/extras/peer_add_secret_pub.in<br/>new file mode 100644<br/>index 00000000000..c9674af353d<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/extras/peer_add_secret_pub.in?id=d1d7a6f35c816822fab51c820e25023863c239c1'>extras/peer_add_secret_pub.in</a></div><div class='hunk'>@@ -0,0 +1,70 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+user=$1</div><div class='add'>+pub_file=$2</div><div class='add'>+</div><div class='add'>+if [ "$user" == "" ]; then</div><div class='add'>+    echo "Invalid User";</div><div class='add'>+    exit 1;</div><div class='add'>+fi</div><div class='add'>+</div><div class='add'>+if [ "$pub_file" == "" ]; then</div><div class='add'>+    echo "Invalid pub file";</div><div class='add'>+    exit 1;</div><div class='add'>+fi</div><div class='add'>+</div><div class='add'>+home_dir=`getent passwd $user | cut -d ':' -f 6`;</div><div class='add'>+</div><div class='add'>+if [ "$home_dir" == "" ]; then</div><div class='add'>+    echo "Invalid home dir";</div><div class='add'>+    exit 1;</div><div class='add'>+fi</div><div class='add'>+</div><div class='add'>+authorized_keys_file=$(cat /etc/ssh/sshd_config | \</div><div class='add'>+                              grep -e "^AuthorizedKeysFile" | \</div><div class='add'>+                              awk '{print $2}' | tail -1);</div><div class='add'>+</div><div class='add'>+# If not set, use default location</div><div class='add'>+if [ "x$authorized_keys_file" == "x" ]; then</div><div class='add'>+    authorized_keys_file="%h/.ssh/authorized_keys"</div><div class='add'>+fi</div><div class='add'>+</div><div class='add'>+# If default location</div><div class='add'>+if [ "$authorized_keys_file" == ".ssh/authorized_keys" ]; then</div><div class='add'>+    authorized_keys_file="%h/$authorized_keys_file"</div><div class='add'>+fi</div><div class='add'>+</div><div class='add'>+# Replace %u with user name (ex: /etc/ssh/keys/%u/authorized_keys)</div><div class='add'>+authorized_keys_file="${authorized_keys_file//%u/$user}";</div><div class='add'>+</div><div class='add'>+# Replace %h with home dir (ex: %h/.ssh/authorized_keys)</div><div class='add'>+authorized_keys_file="${authorized_keys_file//%h/$home_dir}";</div><div class='add'>+ssh_dir=$(dirname $authorized_keys_file);</div><div class='add'>+</div><div class='add'>+if [ ! -d $ssh_dir ]; then</div><div class='add'>+    mkdir $ssh_dir;</div><div class='add'>+    chmod 700 $ssh_dir;</div><div class='add'>+    chown $user: $ssh_dir;</div><div class='add'>+fi</div><div class='add'>+</div><div class='add'>+if [ ! -d $authorized_keys_file ]; then</div><div class='add'>+    touch $authorized_keys_file;</div><div class='add'>+    chmod 600 $authorized_keys_file;</div><div class='add'>+    chown $user: $authorized_keys_file;</div><div class='add'>+fi</div><div class='add'>+</div><div class='add'>+# Restore SELinux security contexts. This is required</div><div class='add'>+# for passwdless SSH to work.</div><div class='add'>+</div><div class='add'>+if type restorecon &gt;/dev/null 2&gt;&amp;1; then</div><div class='add'>+    restorecon -F $ssh_dir $authorized_keys_file;</div><div class='add'>+fi</div><div class='add'>+</div><div class='add'>+# Add to authorized_keys file only if not exists already</div><div class='add'>+while read line</div><div class='add'>+do</div><div class='add'>+    grep -Fxq "$line" $authorized_keys_file;</div><div class='add'>+    [ $? -ne 0 ] &amp;&amp; echo "$line" &gt;&gt; $authorized_keys_file;</div><div class='add'>+done &lt; "$GLUSTERD_WORKDIR"/$pub_file;</div><div class='add'>+</div><div class='add'>+exit 0;</div><div class='head'>diff --git a/extras/post-upgrade-script-for-quota.sh b/extras/post-upgrade-script-for-quota.sh<br/>new file mode 100755<br/>index 00000000000..15652429056<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/extras/post-upgrade-script-for-quota.sh?id=d1d7a6f35c816822fab51c820e25023863c239c1'>extras/post-upgrade-script-for-quota.sh</a></div><div class='hunk'>@@ -0,0 +1,65 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+#The post-upgrade script must be executed after all the nodes in the cluster</div><div class='add'>+#have upgraded.</div><div class='add'>+#Also, all the clients accessing the given volume must also be upgraded</div><div class='add'>+#before the script is run.</div><div class='add'>+#Make sure glusterd and the brick processes are running on all nodes in the</div><div class='add'>+#cluster post upgrade.</div><div class='add'>+#Execute this script on the node where the pre-upgrade script for quota was run.</div><div class='add'>+</div><div class='add'>+VOL=$1;</div><div class='add'>+</div><div class='add'>+BACKUP_DIR=/var/tmp/glusterfs/quota-config-backup</div><div class='add'>+</div><div class='add'>+function set_limits {</div><div class='add'>+        local var=$(gluster volume info $1 | grep 'features.quota'| cut -d" " -f2);</div><div class='add'>+</div><div class='add'>+        if  [ -z "$var" ] || [ "$var" = "off" ]; then</div><div class='add'>+                if [ $2 -eq '0' ]; then</div><div class='add'>+                        echo "Volume $1 does not have quota enabled. " \</div><div class='add'>+                             "Exiting ..."</div><div class='add'>+                        exit 1</div><div class='add'>+                fi</div><div class='add'>+        else</div><div class='add'>+                gluster volume set $1 default-soft-limit 80%</div><div class='add'>+                if [ $? -ne '0' ]; then</div><div class='add'>+                        echo "Post-upgrade process failed." \</div><div class='add'>+                             "Please address the error and run " \</div><div class='add'>+                             "post-upgrade-script.sh on volume $VOL again."</div><div class='add'>+                        exit 1</div><div class='add'>+                fi</div><div class='add'>+</div><div class='add'>+                gluster volume start $1 force</div><div class='add'>+                sleep 3;</div><div class='add'>+</div><div class='add'>+                local path_array=( $(cat $BACKUP_DIR/vol_$1 | tail -n +3 | awk '{print $1}') )</div><div class='add'>+                local limit_array=( $(cat $BACKUP_DIR/vol_$1 | tail -n +3 | awk '{print $2}') )</div><div class='add'>+                local len=${#path_array[@]}</div><div class='add'>+</div><div class='add'>+                for ((j=0; j&lt;$len; j++))</div><div class='add'>+                    do</div><div class='add'>+                            gluster volume quota $1 limit-usage ${path_array[$j]} ${limit_array[j]};</div><div class='add'>+                            if [ $? -eq 0 ]; then</div><div class='add'>+                                    echo "Setting limit (${limit_array[j]}) on " \</div><div class='add'>+                                         "path ${path_array[$j]} has been " \</div><div class='add'>+                                         "successful"</div><div class='add'>+                            fi</div><div class='add'>+                    done</div><div class='add'>+        fi;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+if [ -z $1 ]; then</div><div class='add'>+        echo "Please provide volume name or 'all'";</div><div class='add'>+        exit 1;</div><div class='add'>+fi</div><div class='add'>+</div><div class='add'>+if [ "$1" = "all" ]; then</div><div class='add'>+        for VOL in `gluster volume list`;</div><div class='add'>+            do</div><div class='add'>+                    set_limits $VOL '1';</div><div class='add'>+            done</div><div class='add'>+</div><div class='add'>+else</div><div class='add'>+        set_limits $1 '0';</div><div class='add'>+fi</div><div class='head'>diff --git a/extras/pre-upgrade-script-for-quota.sh b/extras/pre-upgrade-script-for-quota.sh<br/>new file mode 100755<br/>index 00000000000..9ff15f3b307<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/extras/pre-upgrade-script-for-quota.sh?id=d1d7a6f35c816822fab51c820e25023863c239c1'>extras/pre-upgrade-script-for-quota.sh</a></div><div class='hunk'>@@ -0,0 +1,18 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+#Make sure glusterd and the brick processes are running on all nodes in the</div><div class='add'>+#cluster.</div><div class='add'>+#This script must be run prior to upgradation, that too on</div><div class='add'>+#only one of the nodes in the cluster.</div><div class='add'>+</div><div class='add'>+BACKUP_DIR=/var/tmp/glusterfs/quota-config-backup</div><div class='add'>+</div><div class='add'>+mkdir -p $BACKUP_DIR</div><div class='add'>+for i in `gluster volume list`; do</div><div class='add'>+        var=$(gluster volume info $i | grep 'features.quota'| cut -d" " -f2);</div><div class='add'>+        if  [ -z "$var" ] || [ "$var" = "off" ]; then</div><div class='add'>+                continue</div><div class='add'>+        else</div><div class='add'>+                gluster volume quota $i list &gt; $BACKUP_DIR/vol_$i;</div><div class='add'>+        fi;</div><div class='add'>+done</div><div class='head'>diff --git a/extras/profiler/glusterfs-profiler b/extras/profiler/glusterfs-profiler<br/>index 7a5ca7405f1..aaafd088648 100755<br/>--- a/<a href='/cgit/glusterfs.git/tree/extras/profiler/glusterfs-profiler?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/profiler/glusterfs-profiler</a><br/>+++ b/<a href='/cgit/glusterfs.git/tree/extras/profiler/glusterfs-profiler?id=d1d7a6f35c816822fab51c820e25023863c239c1'>extras/profiler/glusterfs-profiler</a></div><div class='hunk'>@@ -1,22 +1,15 @@</div><div class='del'>-#!/usr/bin/env python</div><div class='add'>+#!/usr/bin/python3</div><div class='ctx'> </div><div class='del'>-# texttable - module for creating simple ASCII tables</div><div class='del'>-# Copyright (C) 2003-2009 Gerome Fournier &lt;jefke(at)free.fr&gt;</div><div class='del'>-#</div><div class='del'>-# This library is free software; you can redistribute it and/or</div><div class='del'>-# modify it under the terms of the GNU Lesser General Public</div><div class='del'>-# License as published by the Free Software Foundation; either</div><div class='del'>-# version 2.1 of the License, or (at your option) any later version.</div><div class='del'>-#</div><div class='del'>-# This library is distributed in the hope that it will be useful,</div><div class='del'>-# but WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-# Lesser General Public License for more details.</div><div class='add'>+#  Copyright (c) 2006-2012 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+#  This file is part of GlusterFS.</div><div class='ctx'> #</div><div class='del'>-# You should have received a copy of the GNU Lesser General Public</div><div class='del'>-# License along with this library; if not, write to the Free Software</div><div class='del'>-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA</div><div class='add'>+#  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+#  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+#  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+#  cases as published by the Free Software Foundation.</div><div class='ctx'> </div><div class='add'>+</div><div class='add'>+# texttable - module for creating simple ASCII tables</div><div class='ctx'> # Incorporated from texttable.py downloaded from</div><div class='ctx'> # http://jefke.free.fr/stuff/python/texttable/texttable-0.7.0.tar.gz</div><div class='ctx'> </div><div class='hunk'>@@ -298,7 +291,7 @@ class Texttable:</div><div class='ctx'>         s = "%s%s%s" % (horiz, [horiz, self._char_corner][self._has_vlines()],</div><div class='ctx'>             horiz)</div><div class='ctx'>         # build the line</div><div class='del'>-        l = string.join([horiz*n for n in self._width], s)</div><div class='add'>+        l = s.join([horiz*n for n in self._width])</div><div class='ctx'>         # add border if needed</div><div class='ctx'>         if self._has_border():</div><div class='ctx'>             l = "%s%s%s%s%s\n" % (self._char_corner, horiz, l, horiz,</div><div class='hunk'>@@ -420,7 +413,7 @@ class Texttable:</div><div class='ctx'>         return line_wrapped</div><div class='ctx'> </div><div class='ctx'> </div><div class='del'>-#    Copyright (c) 2010 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='add'>+#    Copyright (c) 2010-2011 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='ctx'> #    This file is part of GlusterFS.</div><div class='ctx'> </div><div class='ctx'> #    GlusterFS is free software; you can redistribute it and/or modify</div><div class='head'>diff --git a/extras/python/Makefile.am b/extras/python/Makefile.am<br/>new file mode 100644<br/>index 00000000000..7d81fa0319b<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/extras/python/Makefile.am?id=d1d7a6f35c816822fab51c820e25023863c239c1'>extras/python/Makefile.am</a></div><div class='hunk'>@@ -0,0 +1,7 @@</div><div class='add'>+if HAVE_PYTHON</div><div class='add'>+# Install __init__.py into the Python site-packages area</div><div class='add'>+pypkgdir = @BUILD_PYTHON_SITE_PACKAGES@/gluster</div><div class='add'>+pypkg_PYTHON = __init__.py</div><div class='add'>+endif</div><div class='add'>+</div><div class='add'>+EXTRA_DIST = __init__.py</div><div class='head'>diff --git a/extras/python/__init__.py b/extras/python/__init__.py<br/>new file mode 100644<br/>index 00000000000..3ad9513f40e<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/extras/python/__init__.py?id=d1d7a6f35c816822fab51c820e25023863c239c1'>extras/python/__init__.py</a></div><div class='hunk'>@@ -0,0 +1,2 @@</div><div class='add'>+from pkgutil import extend_path</div><div class='add'>+__path__ = extend_path(__path__, __name__)</div><div class='head'>diff --git a/extras/quota/contri-add.sh b/extras/quota/contri-add.sh<br/>new file mode 100755<br/>index 00000000000..7db5edd5d20<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/extras/quota/contri-add.sh?id=d1d7a6f35c816822fab51c820e25023863c239c1'>extras/quota/contri-add.sh</a></div><div class='hunk'>@@ -0,0 +1,73 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+# This script adds contributions of files/directories in backend to volume</div><div class='add'>+# size.</div><div class='add'>+# It can also be used to debug by passing dir as first argument, in which case</div><div class='add'>+# it will just add contributions from immediate children of a directory and</div><div class='add'>+# displays only if added contributions from immediate children is different</div><div class='add'>+# from size stored in directory.</div><div class='add'>+# For Eg., find &lt;backend-directory&gt; -type d -exec ./contri-add.sh dir \{} \;</div><div class='add'>+# will list all the directories which have descrepancies in their</div><div class='add'>+# size/contributions.</div><div class='add'>+</div><div class='add'>+usage ()</div><div class='add'>+{</div><div class='add'>+    echo &gt;&amp;2 "usage: $0 &lt;file|dir&gt; &lt;list-of-backend-directories&gt;"</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+add_contributions ()</div><div class='add'>+{</div><div class='add'>+    local var=0</div><div class='add'>+    local count=0</div><div class='add'>+</div><div class='add'>+    SIZE=`getfattr -h -e hex -n trusted.glusterfs.quota.size $2 2&gt;&amp;1 | sed -e '/^#/d' | sed -e '/^getfattr/d' | sed -e '/^$/d' | cut -d'=' -f 2`</div><div class='add'>+    CONTRI=`getfattr -h -e hex -d -m trusted.glusterfs.quota.*.contri $2 2&gt;&amp;1 | sed -e '/^#/d' | sed -e '/^getfattr/d' | sed -e '/^$/d' | cut -d'=' -f 2`</div><div class='add'>+</div><div class='add'>+    if [ $1 == "file" ]; then</div><div class='add'>+        PATHS=`find  $2 ! -type d | sed -e "\|^$2$|d" | sed -e '/^[ \t]*$/d'`</div><div class='add'>+    else</div><div class='add'>+        PATHS=`find  $2 -maxdepth 1 | sed -e "\|^$2$|d" | sed -e '/^[ \t]*$/d'`</div><div class='add'>+    fi</div><div class='add'>+</div><div class='add'>+    if [ -z "$PATHS" ]; then</div><div class='add'>+        return 0</div><div class='add'>+    fi</div><div class='add'>+</div><div class='add'>+    CONTRIBUTIONS=`echo $PATHS | xargs getfattr -h -e hex -d -m trusted.glusterfs.quota.*.contri 2&gt;&amp;1 | sed -e '/^#/d' | sed -e '/^getfattr/d' | sed -e '/^$/d' | cut -d'=' -f 2 | sed -e 's/^[ \t]*\([^ \t]*\)/\1/g'`</div><div class='add'>+</div><div class='add'>+    if [ -n "$CONTRIBUTIONS" ]; then</div><div class='add'>+        for i in $CONTRIBUTIONS; do</div><div class='add'>+            count=$(($count + 1))</div><div class='add'>+            var=$(($var + $i))</div><div class='add'>+        done</div><div class='add'>+    fi</div><div class='add'>+</div><div class='add'>+    if [ $1 == "file" ] || [ $var -ne $(($SIZE)) ] || [ $(($SIZE)) -ne $(($CONTRI)) ]; then</div><div class='add'>+        if [ $1 == "dir" ]; then</div><div class='add'>+            TMP_PATH=`echo $2 | sed -e "s/\/home\/export\/[0-9]*/\/mnt\/raghu/g"`</div><div class='add'>+            stat $TMP_PATH &gt; /dev/null</div><div class='add'>+        fi</div><div class='add'>+</div><div class='add'>+        echo "file count $count"</div><div class='add'>+        echo "added contribution of $2=$var"</div><div class='add'>+        echo "size stored in xattrs on $2=$(($SIZE))"</div><div class='add'>+        echo "contribution of $2 to its parent directory=$(($CONTRI))"</div><div class='add'>+        echo "=============================================================="</div><div class='add'>+    fi</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+main ()</div><div class='add'>+{</div><div class='add'>+    [ $# -lt 1 ] &amp;&amp; usage</div><div class='add'>+</div><div class='add'>+    TYPE=$1</div><div class='add'>+</div><div class='add'>+    shift 1</div><div class='add'>+</div><div class='add'>+    for i in $@; do</div><div class='add'>+        add_contributions $TYPE $i</div><div class='add'>+    done</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+main $@
\ No newline at end of file</div><div class='head'>diff --git a/extras/quota/log_accounting.sh b/extras/quota/log_accounting.sh<br/>new file mode 100755<br/>index 00000000000..e2dd87b84d7<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/extras/quota/log_accounting.sh?id=d1d7a6f35c816822fab51c820e25023863c239c1'>extras/quota/log_accounting.sh</a></div><div class='hunk'>@@ -0,0 +1,26 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+# The script does an accounting of all directories using command 'du' and</div><div class='add'>+# using gluster. We can then compare the two to identify accounting mismatch</div><div class='add'>+# THere can be minor mismatch because gluster only accounts for the size of</div><div class='add'>+# files. Direcotries can take up upto 4kB space on FS per directory. THis</div><div class='add'>+# size is accounted by du and not by gluster. However the difference would</div><div class='add'>+# not be significant.</div><div class='add'>+</div><div class='add'>+mountpoint=$1</div><div class='add'>+volname=$2</div><div class='add'>+</div><div class='add'>+usage ()</div><div class='add'>+{</div><div class='add'>+    echo &gt;&amp;2 "usage: $0 &lt;mountpoint&gt; &lt;volume name&gt;"</div><div class='add'>+    exit</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+[ $# -lt 2 ] &amp;&amp; usage</div><div class='add'>+</div><div class='add'>+cd $mountpoint</div><div class='add'>+du -h | head -n -1 | tr -d '.' |awk  '{ for (i = 2; i &lt;= NF; i++) { printf("%s ", $i);}  print "" }' &gt; /tmp/gluster_quota_1</div><div class='add'>+cat /tmp/gluster_quota_1 | sed 's/ $//' | sed 's/ /\\ /g' | sed 's/(/\\(/g' | sed 's/)/\\)/g' |xargs gluster v quota $volname list &gt; /tmp/gluster_quota_2</div><div class='add'>+du -h | head -n -1 |awk  '{ for (i = 2; i &lt;= NF; i++) { printf("%s %s", $i, $1);}  print "" }' | tr -d '.' &gt;  /tmp/gluster_quota_3</div><div class='add'>+cat /tmp/gluster_quota_2 /tmp/gluster_quota_3 | sort &gt; /tmp/gluster_quota_4</div><div class='add'>+find . -type d &gt; /tmp/gluster_quota_5</div><div class='add'>+tar -cvf /tmp/gluster_quota_files.tar /tmp/gluster_quota_*</div><div class='head'>diff --git a/extras/quota/quota_fsck.py b/extras/quota/quota_fsck.py<br/>new file mode 100755<br/>index 00000000000..e62f7fc52a3<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/extras/quota/quota_fsck.py?id=d1d7a6f35c816822fab51c820e25023863c239c1'>extras/quota/quota_fsck.py</a></div><div class='hunk'>@@ -0,0 +1,377 @@</div><div class='add'>+#!/usr/bin/python3</div><div class='add'>+# The following script enables, Detecting, Reporting and Fixing</div><div class='add'>+# anomalies in quota accounting. Run this script with -h option</div><div class='add'>+# for further details.</div><div class='add'>+</div><div class='add'>+'''</div><div class='add'>+   Copyright (c) 2018 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+   This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+   This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+   General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+   later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+   cases as published by the Free Software Foundation.</div><div class='add'>+'''</div><div class='add'>+from __future__ import print_function</div><div class='add'>+import os, sys, re</div><div class='add'>+from stat import *</div><div class='add'>+import subprocess</div><div class='add'>+import argparse</div><div class='add'>+import xattr</div><div class='add'>+</div><div class='add'>+aggr_size = {}</div><div class='add'>+verbose_mode = False</div><div class='add'>+mnt_path = None</div><div class='add'>+brick_path = None</div><div class='add'>+obj_fix_count = 0</div><div class='add'>+file_count = 0</div><div class='add'>+dir_count = 0</div><div class='add'>+</div><div class='add'>+#CONSTANTS</div><div class='add'>+KB = 1024</div><div class='add'>+MB = 1048576</div><div class='add'>+GB = 1048576 * 1024</div><div class='add'>+TB = 1048576 * 1048576</div><div class='add'>+</div><div class='add'>+QUOTA_VERBOSE = 0</div><div class='add'>+QUOTA_META_ABSENT = 1</div><div class='add'>+QUOTA_SIZE_MISMATCH = 2</div><div class='add'>+</div><div class='add'>+IS_DIRTY ='0x3100'</div><div class='add'>+IS_CLEAN ='0x3000'</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+epilog_msg='''</div><div class='add'>+            The script attempts to find any gluster accounting issues in the</div><div class='add'>+            filesystem at the given subtree. The script crawls the given</div><div class='add'>+            subdirectory tree doing a stat for all files and compares the</div><div class='add'>+            size reported by gluster quota with the size reported by stat</div><div class='add'>+            calls. Any mismatch is reported. In addition integrity of marker</div><div class='add'>+            xattrs are verified.</div><div class='add'>+            '''</div><div class='add'>+</div><div class='add'>+def print_msg(log_type, path, xattr_dict = {}, stbuf = "", dir_size = None):</div><div class='add'>+    if log_type == QUOTA_VERBOSE:</div><div class='add'>+        print('%-24s %-60s\nxattr_values: %s\n%s\n' % ("Verbose", path, xattr_dict, stbuf))</div><div class='add'>+    elif log_type == QUOTA_META_ABSENT:</div><div class='add'>+        print('%-24s %-60s\n%s\n' % ("Quota-Meta Absent", path, xattr_dict))</div><div class='add'>+    elif log_type == QUOTA_SIZE_MISMATCH:</div><div class='add'>+        print("mismatch")</div><div class='add'>+        if dir_size is not None:</div><div class='add'>+            print('%24s %60s %12s %12s' % ("Size Mismatch", path,</div><div class='add'>+                xattr_dict, dir_size))</div><div class='add'>+        else:</div><div class='add'>+            print('%-24s %-60s %-12s %-12s' % ("Size Mismatch", path, xattr_dict,</div><div class='add'>+                   stbuf.st_size))</div><div class='add'>+</div><div class='add'>+def size_differs_lot(s1, s2):</div><div class='add'>+    '''</div><div class='add'>+    There could be minor accounting differences between the stat based</div><div class='add'>+    accounting and gluster accounting. To avoid these from throwing lot</div><div class='add'>+    of false positives in our logs. using a threshold of 1M for now.</div><div class='add'>+    TODO: For a deeply nested directory, at higher levels in hierarchy</div><div class='add'>+    differences may not be significant, hence this check needs to be improved.</div><div class='add'>+    '''</div><div class='add'>+    if abs(s1-s2) &gt; 0:</div><div class='add'>+        return True</div><div class='add'>+    else:</div><div class='add'>+        return False</div><div class='add'>+</div><div class='add'>+def fix_hardlink_accounting(curr_dict, accounted_dict, curr_size):</div><div class='add'>+    '''</div><div class='add'>+            Hard links are messy.. we have to account them for their parent</div><div class='add'>+            directory. But, stop accounting at the most common ancestor.</div><div class='add'>+            Eg:</div><div class='add'>+                say we have 3 hardlinks : /d1/d2/h1, /d1/d3/h2 and /d1/h3</div><div class='add'>+</div><div class='add'>+            suppose we encounter the hard links h1 first , then h2 and then h3.</div><div class='add'>+            while accounting for h1, we account the size until root(d2-&gt;d1-&gt;/)</div><div class='add'>+            while accounting for h2, we need to account only till d3. (as d1</div><div class='add'>+            and / are accounted for this inode).</div><div class='add'>+            while accounting for h3 we should not account at all.. as all</div><div class='add'>+            its ancestors are already accounted for same inode.</div><div class='add'>+</div><div class='add'>+            curr_dict                : dict of hardlinks that were seen and</div><div class='add'>+                                       accounted by the current iteration.</div><div class='add'>+            accounted_dict           : dict of hardlinks that has already been</div><div class='add'>+                                       accounted for.</div><div class='add'>+</div><div class='add'>+            size                     : size of the object as accounted by the</div><div class='add'>+                                       curr_iteration.</div><div class='add'>+</div><div class='add'>+            Return vale:</div><div class='add'>+            curr_size                : size reduced by hardlink sizes for those</div><div class='add'>+                                       hardlinks that has already been accounted</div><div class='add'>+                                       in current subtree.</div><div class='add'>+            Also delete the duplicate link from curr_dict.</div><div class='add'>+    '''</div><div class='add'>+</div><div class='add'>+    dual_accounted_links = set(curr_dict.keys()) &amp; set(accounted_dict.keys())</div><div class='add'>+    for link in dual_accounted_links:</div><div class='add'>+        curr_size = curr_size - curr_dict[link]</div><div class='add'>+        del curr_dict[link]</div><div class='add'>+    return curr_size</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def fix_xattr(file_name, mark_dirty):</div><div class='add'>+    global obj_fix_count</div><div class='add'>+    global mnt_path</div><div class='add'>+</div><div class='add'>+    if mnt_path is None:</div><div class='add'>+        return</div><div class='add'>+    if mark_dirty:</div><div class='add'>+        print("MARKING DIRTY: " + file_name)</div><div class='add'>+        out = subprocess.check_output (["/usr/bin/setfattr", "-n",</div><div class='add'>+                                       "trusted.glusterfs.quota.dirty",</div><div class='add'>+                                       "-v", IS_DIRTY, file_name])</div><div class='add'>+    rel_path = os.path.relpath(file_name, brick_path)</div><div class='add'>+    print("stat on "  + mnt_path + "/" + rel_path)</div><div class='add'>+    stbuf = os.lstat(mnt_path + "/" + rel_path)</div><div class='add'>+</div><div class='add'>+    obj_fix_count += 1</div><div class='add'>+</div><div class='add'>+def get_quota_xattr_brick(dpath):</div><div class='add'>+    out = subprocess.check_output (["/usr/bin/getfattr", "--no-dereference",</div><div class='add'>+                                    "-d", "-m.", "-e", "hex", dpath])</div><div class='add'>+    pairs = out.splitlines()</div><div class='add'>+</div><div class='add'>+    '''</div><div class='add'>+    Sample output to be parsed:</div><div class='add'>+    [root@dhcp35-100 mnt]# getfattr -d -m. -e hex /export/b1/B0/d14/d13/</div><div class='add'>+    # file: export/b1/B0/d14/d13/</div><div class='add'>+    security.selinux=0x756e636f6e66696e65645f753a6f626a6563745f723a7573725f743a733000</div><div class='add'>+    trusted.gfid=0xbae5e0d2d05043de9fd851d91ecf63e8</div><div class='add'>+    trusted.glusterfs.dht=0x000000010000000000000000ffffffff</div><div class='add'>+    trusted.glusterfs.dht.mds=0x00000000</div><div class='add'>+    trusted.glusterfs.quota.6a7675a3-b85a-40c5-830b-de9229d702ce.contri.39=0x00000000000000000000000000000000000000000000000e</div><div class='add'>+    trusted.glusterfs.quota.dirty=0x3000</div><div class='add'>+    trusted.glusterfs.quota.size.39=0x00000000000000000000000000000000000000000000000e</div><div class='add'>+    '''</div><div class='add'>+</div><div class='add'>+    '''</div><div class='add'>+    xattr_dict dictionary holds quota related xattrs</div><div class='add'>+    eg:</div><div class='add'>+    '''</div><div class='add'>+</div><div class='add'>+    xattr_dict = {}</div><div class='add'>+    xattr_dict['parents'] = {}</div><div class='add'>+</div><div class='add'>+    for xattr in pairs[1:]:</div><div class='add'>+        xattr = xattr.decode("utf-8")</div><div class='add'>+        xattr_key = xattr.split("=")[0]</div><div class='add'>+        if xattr_key == "":</div><div class='add'>+            # skip any empty lines</div><div class='add'>+            continue</div><div class='add'>+        elif not re.search("quota", xattr_key):</div><div class='add'>+            # skip all non quota xattr.</div><div class='add'>+            continue</div><div class='add'>+</div><div class='add'>+        xattr_value = xattr.split("=")[1]</div><div class='add'>+        if re.search("contri", xattr_key):</div><div class='add'>+</div><div class='add'>+            xattr_version = xattr_key.split(".")[5]</div><div class='add'>+            if 'version' not in xattr_dict:</div><div class='add'>+                xattr_dict['version'] = xattr_version</div><div class='add'>+            else:</div><div class='add'>+                if xattr_version != xattr_dict['version']:</div><div class='add'>+                   print("Multiple xattr version found")</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+            cur_parent = xattr_key.split(".")[3]</div><div class='add'>+            if cur_parent not in xattr_dict['parents']:</div><div class='add'>+                xattr_dict['parents'][cur_parent] = {}</div><div class='add'>+</div><div class='add'>+            contri_dict = xattr_dict['parents'][cur_parent]</div><div class='add'>+            if len(xattr_value) == 34:</div><div class='add'>+                # 34 bytes implies file contri xattr</div><div class='add'>+                # contri format =0x&lt; 16bytes file size&gt;&lt;16bytes file count&gt;</div><div class='add'>+                # size is obtained in iatt, file count = 1, dir count=0</div><div class='add'>+                contri_dict['contri_size'] = int(xattr_value[2:18], 16)</div><div class='add'>+                contri_dict['contri_file_count'] = int(xattr_value[18:34], 16)</div><div class='add'>+                contri_dict['contri_dir_count'] = 0</div><div class='add'>+            else:</div><div class='add'>+                # This is a directory contri.</div><div class='add'>+                contri_dict['contri_size'] = int(xattr_value[2:18], 16)</div><div class='add'>+                contri_dict['contri_file_count'] = int(xattr_value[18:34], 16)</div><div class='add'>+                contri_dict['contri_dir_count'] = int(xattr_value[34:], 16)</div><div class='add'>+</div><div class='add'>+        elif re.search("size", xattr_key):</div><div class='add'>+            xattr_dict['size'] = int(xattr_value[2:18], 16)</div><div class='add'>+            xattr_dict['file_count'] = int(xattr_value[18:34], 16)</div><div class='add'>+            xattr_dict['dir_count'] = int(xattr_value[34:], 16)</div><div class='add'>+        elif re.search("dirty", xattr_key):</div><div class='add'>+            if xattr_value == IS_CLEAN:</div><div class='add'>+                xattr_dict['dirty'] = False</div><div class='add'>+            elif xattr_value == IS_DIRTY:</div><div class='add'>+                xattr_dict['dirty'] = True</div><div class='add'>+        elif re.search("limit_objects", xattr_key):</div><div class='add'>+            xattr_dict['limit_objects'] = int(xattr_value[2:18], 16)</div><div class='add'>+        elif re.search("limit_set", xattr_key):</div><div class='add'>+            xattr_dict['limit_set'] = int(xattr_value[2:18], 16)</div><div class='add'>+</div><div class='add'>+    return xattr_dict</div><div class='add'>+</div><div class='add'>+def verify_file_xattr(path, stbuf = None):</div><div class='add'>+</div><div class='add'>+    global file_count</div><div class='add'>+    file_count += 1</div><div class='add'>+</div><div class='add'>+    if stbuf is None:</div><div class='add'>+        stbuf = os.lstat(path)</div><div class='add'>+</div><div class='add'>+    xattr_dict = get_quota_xattr_brick(path)</div><div class='add'>+</div><div class='add'>+    for parent in xattr_dict['parents']:</div><div class='add'>+        contri_dict = xattr_dict['parents'][parent]</div><div class='add'>+</div><div class='add'>+        if 'contri_size' not in contri_dict or \</div><div class='add'>+           'contri_file_count' not in contri_dict or \</div><div class='add'>+           'contri_dir_count' not in contri_dict:</div><div class='add'>+            print_msg(QUOTA_META_ABSENT, path, xattr_dict, stbuf)</div><div class='add'>+            fix_xattr(path, False)</div><div class='add'>+            return</div><div class='add'>+        elif size_differs_lot(contri_dict['contri_size'], stbuf.st_size):</div><div class='add'>+            print_msg(QUOTA_SIZE_MISMATCH, path, xattr_dict, stbuf)</div><div class='add'>+            fix_xattr(path, False)</div><div class='add'>+            return</div><div class='add'>+</div><div class='add'>+    if verbose_mode is True:</div><div class='add'>+        print_msg(QUOTA_VERBOSE, path, xattr_dict, stbuf)</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def verify_dir_xattr(path, dir_size):</div><div class='add'>+</div><div class='add'>+    global dir_count</div><div class='add'>+    dir_count += 1</div><div class='add'>+    xattr_dict = get_quota_xattr_brick(path)</div><div class='add'>+</div><div class='add'>+    stbuf = os.lstat(path)</div><div class='add'>+</div><div class='add'>+    for parent in xattr_dict['parents']:</div><div class='add'>+        contri_dict = xattr_dict['parents'][parent]</div><div class='add'>+</div><div class='add'>+        if 'size' not in xattr_dict or 'contri_size' not in contri_dict:</div><div class='add'>+            print_msg(QUOTA_META_ABSENT, path)</div><div class='add'>+            fix_xattr(path, True)</div><div class='add'>+            return</div><div class='add'>+        elif size_differs_lot(dir_size, xattr_dict['size']) or \</div><div class='add'>+             size_differs_lot(contri_dict['contri_size'], xattr_dict['size']):</div><div class='add'>+            print_msg(QUOTA_SIZE_MISMATCH, path, xattr_dict, stbuf, dir_size)</div><div class='add'>+            fix_xattr(path, True)</div><div class='add'>+            return</div><div class='add'>+</div><div class='add'>+    if verbose_mode is True:</div><div class='add'>+        print_msg("VERBOSE", path, xattr_dict, stbuf, dir_size)</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def walktree(t_dir, hard_link_dict):</div><div class='add'>+    '''recursively descend the directory tree rooted at dir,</div><div class='add'>+       aggregating the size</div><div class='add'>+       t_dir            : directory to walk over.</div><div class='add'>+       hard_link_dict   : dict of inodes with multiple hard_links under t_dir</div><div class='add'>+    '''</div><div class='add'>+    global aggr_size</div><div class='add'>+    aggr_size[t_dir] = 0</div><div class='add'>+</div><div class='add'>+    for entry in os.listdir(t_dir):</div><div class='add'>+        pathname = os.path.join(t_dir, entry)</div><div class='add'>+        stbuf = os.lstat(pathname)</div><div class='add'>+        if S_ISDIR(stbuf.st_mode):</div><div class='add'>+            # It's a directory, recurse into it</div><div class='add'>+            if entry == '.glusterfs':</div><div class='add'>+                print("skipping " + pathname)</div><div class='add'>+                continue</div><div class='add'>+            descendent_hardlinks = {}</div><div class='add'>+            subtree_size = walktree(pathname, descendent_hardlinks)</div><div class='add'>+</div><div class='add'>+            subtree_size = fix_hardlink_accounting(descendent_hardlinks,</div><div class='add'>+                                                   hard_link_dict,</div><div class='add'>+                                                   subtree_size)</div><div class='add'>+</div><div class='add'>+            aggr_size[t_dir] = aggr_size[t_dir] + subtree_size</div><div class='add'>+</div><div class='add'>+        elif S_ISREG(stbuf.st_mode) or S_ISLNK(stbuf.st_mode):</div><div class='add'>+            # Even a symbolic link file may have multiple hardlinks.</div><div class='add'>+</div><div class='add'>+            file_size = stbuf.st_size</div><div class='add'>+            if stbuf.st_nlink &gt; 2:</div><div class='add'>+                # send a single element dict to check if file is accounted.</div><div class='add'>+                file_size = fix_hardlink_accounting({stbuf.st_ino:stbuf.st_size},</div><div class='add'>+                                                    hard_link_dict,</div><div class='add'>+                                                    stbuf.st_size)</div><div class='add'>+</div><div class='add'>+                if file_size == 0:</div><div class='add'>+                    print_msg("HARD_LINK (skipped)", pathname, "",</div><div class='add'>+                                stbuf)</div><div class='add'>+                else:</div><div class='add'>+                    print_msg("HARD_LINK (accounted)", pathname, "",</div><div class='add'>+                               stbuf)</div><div class='add'>+                    hard_link_dict[stbuf.st_ino] = stbuf.st_size</div><div class='add'>+</div><div class='add'>+            if t_dir in aggr_size:</div><div class='add'>+                aggr_size[t_dir] = aggr_size[t_dir] + file_size</div><div class='add'>+            else:</div><div class='add'>+                aggr_size[t_dir] = file_size</div><div class='add'>+            verify_file_xattr(pathname, stbuf)</div><div class='add'>+</div><div class='add'>+        else:</div><div class='add'>+            # Unknown file type, print a message</div><div class='add'>+            print('Skipping %s, due to file mode' % (pathname))</div><div class='add'>+</div><div class='add'>+    if t_dir not in aggr_size:</div><div class='add'>+        aggr_size[t_dir] = 0</div><div class='add'>+</div><div class='add'>+    verify_dir_xattr(t_dir, aggr_size[t_dir])</div><div class='add'>+    # du also accounts for t_directory sizes</div><div class='add'>+    # aggr_size[t_dir] += 4096</div><div class='add'>+</div><div class='add'>+    #cleanup</div><div class='add'>+    ret = aggr_size[t_dir]</div><div class='add'>+    del aggr_size[t_dir]</div><div class='add'>+    return ret</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+if __name__ == '__main__':</div><div class='add'>+</div><div class='add'>+    parser = argparse.ArgumentParser(description='Diagnose quota accounting issues.', epilog=epilog_msg)</div><div class='add'>+    parser.add_argument('brick_path', nargs=1,</div><div class='add'>+                        help='The brick path (or any descendent sub-directory of brick path)',</div><div class='add'>+                        )</div><div class='add'>+    parser.add_argument('--full-logs', dest='verbose', action='store_true',</div><div class='add'>+                   help='''</div><div class='add'>+                         log all the xattr values and stat values reported</div><div class='add'>+                         for analysis. [CAUTION: This can give lot of output</div><div class='add'>+                         depending on FS depth. So one has to make sure enough</div><div class='add'>+                         disk space exists if redirecting to file]</div><div class='add'>+                        '''</div><div class='add'>+                        )</div><div class='add'>+    parser.add_argument('--fix-issues', metavar='mount_path', dest='mnt', action='store',</div><div class='add'>+                   help='''</div><div class='add'>+                         fix accounting issues where the xattr values disagree</div><div class='add'>+                         with stat sizes reported by gluster. A mount is also</div><div class='add'>+                         required for this option to be used.</div><div class='add'>+                         [CAUTION: This will directly modify backend xattr]</div><div class='add'>+                        '''</div><div class='add'>+                        )</div><div class='add'>+    parser.add_argument('--sub-dir', metavar='sub_dir', dest='sub_dir', action='store',</div><div class='add'>+                   help='''</div><div class='add'>+                         limit the crawling and accounting verification/correction</div><div class='add'>+                         to a specific subdirectory.</div><div class='add'>+                        '''</div><div class='add'>+                        )</div><div class='add'>+</div><div class='add'>+    args = parser.parse_args()</div><div class='add'>+    verbose_mode = args.verbose</div><div class='add'>+    brick_path = args.brick_path[0]</div><div class='add'>+    sub_dir = args.sub_dir</div><div class='add'>+    mnt_path = args.mnt</div><div class='add'>+    hard_link_dict = {}</div><div class='add'>+    if sub_dir is not None:</div><div class='add'>+        walktree(os.path.join(brick_path, sub_dir), hard_link_dict)</div><div class='add'>+    else:</div><div class='add'>+        walktree(brick_path, hard_link_dict)</div><div class='add'>+</div><div class='add'>+    print("Files verified : " + str(file_count))</div><div class='add'>+    print("Directories verified : " + str(dir_count))</div><div class='add'>+    if mnt_path is not None:</div><div class='add'>+        print("Objects Fixed : " + str(obj_fix_count))</div><div class='head'>diff --git a/extras/quota/xattr_analysis.py b/extras/quota/xattr_analysis.py<br/>new file mode 100755<br/>index 00000000000..7bd7d96374c<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/extras/quota/xattr_analysis.py?id=d1d7a6f35c816822fab51c820e25023863c239c1'>extras/quota/xattr_analysis.py</a></div><div class='hunk'>@@ -0,0 +1,73 @@</div><div class='add'>+#!/usr/bin/python3</div><div class='add'>+# Below script has two purposes</div><div class='add'>+#  1. Display xattr of entire FS tree in a human readable form</div><div class='add'>+#  2. Display all the directory where contri and size mismatch.</div><div class='add'>+#      (If there are any directory with contri and size mismatch that are not dirty</div><div class='add'>+#       then that highlights a propagation issue)</div><div class='add'>+#  The script takes only one input LOG _FILE generated from the command,</div><div class='add'>+#  find &lt;brick_path&gt; | xargs  getfattr -d -m. -e hex  &gt; log_gluster_xattr</div><div class='add'>+</div><div class='add'>+from __future__ import print_function</div><div class='add'>+import re</div><div class='add'>+import subprocess</div><div class='add'>+import sys</div><div class='add'>+from hurry.filesize import size</div><div class='add'>+</div><div class='add'>+if len(sys.argv) &lt; 2:</div><div class='add'>+    sys.exit('Usage: %s log_gluster_xattr \n'</div><div class='add'>+              'to generate log_gluster_xattr use: \n'</div><div class='add'>+              'find &lt;brick_path&gt; | xargs  getfattr -d -m. -e hex  &gt; log_gluster_xattr'</div><div class='add'>+              % sys.argv[0])</div><div class='add'>+LOG_FILE=sys.argv[1]</div><div class='add'>+</div><div class='add'>+def get_quota_xattr_brick():</div><div class='add'>+    out = subprocess.check_output (["/usr/bin/cat", LOG_FILE])</div><div class='add'>+    pairs = out.splitlines()</div><div class='add'>+</div><div class='add'>+    xdict = {}</div><div class='add'>+    mismatch_size = [('====contri_size===', '====size====')]</div><div class='add'>+    for xattr in pairs:</div><div class='add'>+        k = xattr.split("=")[0]</div><div class='add'>+        if re.search("# file:", k):</div><div class='add'>+            print(xdict)</div><div class='add'>+            filename=k</div><div class='add'>+            print("=====" + filename + "=======")</div><div class='add'>+            xdict = {}</div><div class='add'>+        elif k is "":</div><div class='add'>+            pass</div><div class='add'>+        else:</div><div class='add'>+            print(xattr)</div><div class='add'>+            v = xattr.split("=")[1]</div><div class='add'>+            if re.search("contri", k):</div><div class='add'>+                if len(v) == 34:</div><div class='add'>+                    # for files size is obtained in iatt, file count should be 1, dir count=0</div><div class='add'>+                    xdict['contri_file_count'] = int(v[18:34], 16)</div><div class='add'>+                    xdict['contri_dir_count'] = 0</div><div class='add'>+                else:</div><div class='add'>+                    xdict['contri_size'] = size(int(v[2:18], 16))</div><div class='add'>+                    xdict['contri_file_count'] = int(v[18:34], 16)</div><div class='add'>+                    xdict['contri_dir_count'] = int(v[34:], 16)</div><div class='add'>+            elif re.search("size", k):</div><div class='add'>+                xdict['size'] = size(int(v[2:18], 16))</div><div class='add'>+                xdict['file_count'] = int(v[18:34], 16)</div><div class='add'>+                xdict['dir_count'] = int(v[34:], 16)</div><div class='add'>+            elif re.search("dirty", k):</div><div class='add'>+                if v == '0x3000':</div><div class='add'>+                    xdict['dirty'] = False</div><div class='add'>+                elif v == '0x3100':</div><div class='add'>+                    xdict['dirty'] = True</div><div class='add'>+            elif re.search("limit_objects", k):</div><div class='add'>+                xdict['limit_objects'] = int(v[2:18], 16)</div><div class='add'>+            elif re.search("limit_set", k):</div><div class='add'>+                xdict['limit_set'] = size(int(v[2:18], 16))</div><div class='add'>+</div><div class='add'>+            if 'size' in xdict and 'contri_size' in xdict and xdict['size'] != xdict['contri_size']:</div><div class='add'>+                mismatch_size.append((xdict['contri_size'], xdict['size'], filename))</div><div class='add'>+</div><div class='add'>+    for values in mismatch_size:</div><div class='add'>+        print(values)</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+if __name__ == '__main__':</div><div class='add'>+    get_quota_xattr_brick()</div><div class='add'>+</div><div class='head'>diff --git a/extras/rebalance.py b/extras/rebalance.py<br/>new file mode 100755<br/>index 00000000000..37c68ebbb42<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/extras/rebalance.py?id=d1d7a6f35c816822fab51c820e25023863c239c1'>extras/rebalance.py</a></div><div class='hunk'>@@ -0,0 +1,309 @@</div><div class='add'>+#!/usr/bin/python3</div><div class='add'>+</div><div class='add'>+from __future__ import print_function</div><div class='add'>+</div><div class='add'>+import atexit</div><div class='add'>+import copy</div><div class='add'>+import optparse</div><div class='add'>+import os</div><div class='add'>+import pipes</div><div class='add'>+import shutil</div><div class='add'>+import string</div><div class='add'>+import subprocess</div><div class='add'>+import sys</div><div class='add'>+import tempfile</div><div class='add'>+import volfilter</div><div class='add'>+import platform</div><div class='add'>+</div><div class='add'>+# It's just more convenient to have named fields.</div><div class='add'>+class Brick:</div><div class='add'>+        def __init__ (self, path, name):</div><div class='add'>+                self.path = path</div><div class='add'>+                self.sv_name = name</div><div class='add'>+                self.size = 0</div><div class='add'>+                self.curr_size = 0</div><div class='add'>+                self.good_size = 0</div><div class='add'>+        def set_size (self, size):</div><div class='add'>+                self.size = size</div><div class='add'>+        def set_range (self, rs, re):</div><div class='add'>+                self.r_start = rs</div><div class='add'>+                self.r_end = re</div><div class='add'>+                self.curr_size = self.r_end - self.r_start + 1</div><div class='add'>+        def __repr__ (self):</div><div class='add'>+                value = self.path[:]</div><div class='add'>+                value += "(%d," % self.size</div><div class='add'>+                if self.curr_size:</div><div class='add'>+                        value += "0x%x,0x%x)" % (self.r_start, self.r_end)</div><div class='add'>+                else:</div><div class='add'>+                        value += "-)"</div><div class='add'>+                return value</div><div class='add'>+</div><div class='add'>+def get_bricks (host, vol):</div><div class='add'>+        t = pipes.Template()</div><div class='add'>+        t.prepend("gluster --remote-host=%s system getspec %s"%(host, vol), ".-")</div><div class='add'>+        return t.open(None, "r")</div><div class='add'>+</div><div class='add'>+def generate_stanza (vf, all_xlators, cur_subvol):</div><div class='add'>+        sv_list = []</div><div class='add'>+        for sv in cur_subvol.subvols:</div><div class='add'>+                generate_stanza(vf, all_xlators, sv)</div><div class='add'>+                sv_list.append(sv.name)</div><div class='add'>+        vf.write("volume %s\n" % cur_subvol.name)</div><div class='add'>+        vf.write("  type %s\n" % cur_subvol.type)</div><div class='add'>+        for kvpair in cur_subvol.opts.items():</div><div class='add'>+                vf.write("  option %s %s\n" % kvpair)</div><div class='add'>+        if sv_list:</div><div class='add'>+                vf.write("  subvolumes %s\n" % ''.join(sv_list))</div><div class='add'>+        vf.write("end-volume\n\n")</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def mount_brick (localpath, all_xlators, dht_subvol):</div><div class='add'>+</div><div class='add'>+        # Generate a volfile.</div><div class='add'>+        vf_name = localpath + ".vol"</div><div class='add'>+        vf = open(vf_name, "w")</div><div class='add'>+        generate_stanza(vf, all_xlators, dht_subvol)</div><div class='add'>+        vf.flush()</div><div class='add'>+        vf.close()</div><div class='add'>+</div><div class='add'>+        # Create a brick directory and mount the brick there.</div><div class='add'>+        os.mkdir(localpath)</div><div class='add'>+        subprocess.call(["glusterfs", "-f", vf_name, localpath])</div><div class='add'>+</div><div class='add'>+# We use the command-line tools because there's no getxattr support in the</div><div class='add'>+# Python standard library (which is ridiculous IMO).  Adding the xattr package</div><div class='add'>+# from PyPI would create a new and difficult dependency because the bits to</div><div class='add'>+# satisfy it don't seem to exist in Fedora.  We already expect the command-line</div><div class='add'>+# tools to be there, so it's safer just to rely on them.</div><div class='add'>+#</div><div class='add'>+# We might have to revisit this if we get as far as actually issuing millions</div><div class='add'>+# of setxattr requests.  Even then, it might be better to do that part with a C</div><div class='add'>+# program which has only a build-time dependency.</div><div class='add'>+def get_range (brick):</div><div class='add'>+        t = pipes.Template()</div><div class='add'>+        cmd = "getfattr -e hex -n trusted.glusterfs.dht %s 2&gt; /dev/null"</div><div class='add'>+        t.prepend(cmd%brick, ".-")</div><div class='add'>+        t.append("grep ^trusted.glusterfs.dht=", "--")</div><div class='add'>+        f = t.open(None, "r")</div><div class='add'>+        try:</div><div class='add'>+                value = f.readline().rstrip().split('=')[1][2:]</div><div class='add'>+        except:</div><div class='add'>+                print("could not get layout for %s (might be OK)" % brick)</div><div class='add'>+                return None</div><div class='add'>+        v_start = int("0x"+value[16:24], 16)</div><div class='add'>+        v_end = int("0x"+value[24:32], 16)</div><div class='add'>+        return (v_start, v_end)</div><div class='add'>+</div><div class='add'>+def calc_sizes (bricks, total):</div><div class='add'>+        leftover = 1 &lt;&lt; 32</div><div class='add'>+        for b in bricks:</div><div class='add'>+               if b.size:</div><div class='add'>+                        b.good_size = (b.size &lt;&lt; 32) / total</div><div class='add'>+                        leftover -= b.good_size</div><div class='add'>+               else:</div><div class='add'>+                        b.good_size = 0</div><div class='add'>+        if leftover:</div><div class='add'>+                # Add the leftover to an old brick if we can.</div><div class='add'>+                for b in bricks:</div><div class='add'>+                        if b.good_size:</div><div class='add'>+                                b.good_size += leftover</div><div class='add'>+                                break</div><div class='add'>+                else:</div><div class='add'>+                        # Fine, just add it wherever.</div><div class='add'>+                        bricks[0].good_size += leftover</div><div class='add'>+</div><div class='add'>+# Normalization means sorting the bricks by r_start and (b) ensuring that there</div><div class='add'>+# are no gaps.</div><div class='add'>+def normalize (in_bricks):</div><div class='add'>+        out_bricks = []</div><div class='add'>+        curr_hash = 0</div><div class='add'>+        used = 0</div><div class='add'>+        while curr_hash &lt; (1&lt;&lt;32):</div><div class='add'>+                curr_best = None</div><div class='add'>+                for b in in_bricks:</div><div class='add'>+                        if b.r_start == curr_hash:</div><div class='add'>+                                used += 1</div><div class='add'>+                                out_bricks.append(b)</div><div class='add'>+                                in_bricks.remove(b)</div><div class='add'>+                                curr_hash = b.r_end + 1</div><div class='add'>+                                break</div><div class='add'>+                else:</div><div class='add'>+                        print("gap found at 0x%08x" % curr_hash)</div><div class='add'>+                        sys.exit(1)</div><div class='add'>+        return out_bricks + in_bricks, used</div><div class='add'>+</div><div class='add'>+def get_score (bricks):</div><div class='add'>+        score = 0</div><div class='add'>+        curr_hash = 0</div><div class='add'>+        for b in bricks:</div><div class='add'>+                if not b.curr_size:</div><div class='add'>+                        curr_hash += b.good_size</div><div class='add'>+                        continue</div><div class='add'>+                new_start = curr_hash</div><div class='add'>+                curr_hash += b.good_size</div><div class='add'>+                new_end = curr_hash - 1</div><div class='add'>+                if new_start &gt; b.r_start:</div><div class='add'>+                        max_start = new_start</div><div class='add'>+                else:</div><div class='add'>+                        max_start = b.r_start</div><div class='add'>+                if new_end &lt; b.r_end:</div><div class='add'>+                        min_end = new_end</div><div class='add'>+                else:</div><div class='add'>+                        min_end = b.r_end</div><div class='add'>+                if max_start &lt;= min_end:</div><div class='add'>+                        score += (min_end - max_start + 1)</div><div class='add'>+        return score</div><div class='add'>+</div><div class='add'>+if __name__ == "__main__":</div><div class='add'>+</div><div class='add'>+        my_usage = "%prog [options] server volume [directory]"</div><div class='add'>+        parser = optparse.OptionParser(usage=my_usage)</div><div class='add'>+        parser.add_option("-f", "--free-space", dest="free_space",</div><div class='add'>+                          default=False, action="store_true",</div><div class='add'>+                          help="use free space instead of total space")</div><div class='add'>+        parser.add_option("-l", "--leave-mounted", dest="leave_mounted",</div><div class='add'>+                          default=False, action="store_true",</div><div class='add'>+                          help="leave subvolumes mounted")</div><div class='add'>+        parser.add_option("-v", "--verbose", dest="verbose",</div><div class='add'>+                          default=False, action="store_true",</div><div class='add'>+                          help="verbose output")</div><div class='add'>+        options, args = parser.parse_args()</div><div class='add'>+</div><div class='add'>+        if len(args) == 3:</div><div class='add'>+                fix_dir = args[2]</div><div class='add'>+        else:</div><div class='add'>+                if len(args) != 2:</div><div class='add'>+                        parser.print_help()</div><div class='add'>+                        sys.exit(1)</div><div class='add'>+                fix_dir = None</div><div class='add'>+        hostname, volname = args[:2]</div><div class='add'>+</div><div class='add'>+        # Make sure stuff gets cleaned up, even if there are exceptions.</div><div class='add'>+        orig_dir = os.getcwd()</div><div class='add'>+        work_dir = tempfile.mkdtemp()</div><div class='add'>+        bricks = []</div><div class='add'>+        def cleanup_workdir ():</div><div class='add'>+                os.chdir(orig_dir)</div><div class='add'>+                if options.verbose:</div><div class='add'>+                        print("Cleaning up %s" % work_dir)</div><div class='add'>+                for b in bricks:</div><div class='add'>+                        subprocess.call(["umount", b.path])</div><div class='add'>+                shutil.rmtree(work_dir)</div><div class='add'>+        if not options.leave_mounted:</div><div class='add'>+                atexit.register(cleanup_workdir)</div><div class='add'>+        os.chdir(work_dir)</div><div class='add'>+</div><div class='add'>+        # Mount each brick individually, so we can issue brick-specific calls.</div><div class='add'>+        if options.verbose:</div><div class='add'>+                print("Mounting subvolumes...")</div><div class='add'>+        index = 0</div><div class='add'>+        volfile_pipe = get_bricks(hostname, volname)</div><div class='add'>+        all_xlators, last_xlator = volfilter.load(volfile_pipe)</div><div class='add'>+        for dht_vol in all_xlators.itervalues():</div><div class='add'>+                if dht_vol.type == "cluster/distribute":</div><div class='add'>+                        break</div><div class='add'>+        else:</div><div class='add'>+                print("no DHT volume found")</div><div class='add'>+                sys.exit(1)</div><div class='add'>+        for sv in dht_vol.subvols:</div><div class='add'>+                #print "found subvol %s" % sv.name</div><div class='add'>+                lpath = "%s/brick%s" % (work_dir, index)</div><div class='add'>+                index += 1</div><div class='add'>+                mount_brick(lpath, all_xlators, sv)</div><div class='add'>+                bricks.append(Brick(lpath, sv.name))</div><div class='add'>+        if index == 0:</div><div class='add'>+                print("no bricks")</div><div class='add'>+                sys.exit(1)</div><div class='add'>+</div><div class='add'>+        # Collect all of the sizes.</div><div class='add'>+        if options.verbose:</div><div class='add'>+                print("Collecting information...")</div><div class='add'>+        total = 0</div><div class='add'>+        for b in bricks:</div><div class='add'>+                info = os.statvfs(b.path)</div><div class='add'>+                # On FreeBSD f_bsize (info[0]) contains the optimal I/O size,</div><div class='add'>+                # not the block size as it's found on Linux. In this case we</div><div class='add'>+                # use f_frsize (info[1]).</div><div class='add'>+                if platform.system() == 'FreeBSD':</div><div class='add'>+                        bsize = info[1]</div><div class='add'>+                else:</div><div class='add'>+                        bsize = info[0]</div><div class='add'>+                # We want a standard unit even if different bricks use</div><div class='add'>+                # different block sizes.  The size is chosen to avoid overflows</div><div class='add'>+                # for very large bricks with very small block sizes, but also</div><div class='add'>+                # accommodate filesystems which use very large block sizes to</div><div class='add'>+                # cheat on benchmarks.</div><div class='add'>+                blocksper100mb = 104857600 / bsize</div><div class='add'>+                if options.free_space:</div><div class='add'>+                        size = info[3] / blocksper100mb</div><div class='add'>+                else:</div><div class='add'>+                        size = info[2] / blocksper100mb</div><div class='add'>+                if size &lt;= 0:</div><div class='add'>+                        print("brick %s has invalid size %d" % (b.path, size))</div><div class='add'>+                        sys.exit(1)</div><div class='add'>+                b.set_size(size)</div><div class='add'>+                total += size</div><div class='add'>+</div><div class='add'>+        # Collect all of the layout information.</div><div class='add'>+        for b in bricks:</div><div class='add'>+                hash_range = get_range(b.path)</div><div class='add'>+                if hash_range is not None:</div><div class='add'>+                        rs, re = hash_range</div><div class='add'>+                        if rs &gt; re:</div><div class='add'>+                                print("%s has backwards hash range" % b.path)</div><div class='add'>+                                sys.exit(1)</div><div class='add'>+                        b.set_range(hash_range[0], hash_range[1])</div><div class='add'>+</div><div class='add'>+        if options.verbose:</div><div class='add'>+                print("Calculating new layouts...")</div><div class='add'>+        calc_sizes(bricks, total)</div><div class='add'>+        bricks, used = normalize(bricks)</div><div class='add'>+</div><div class='add'>+        # We can't afford O(n!) here, but O(n^2) should be OK and the result</div><div class='add'>+        # should be almost as good.</div><div class='add'>+        while used &lt; len(bricks):</div><div class='add'>+                best_place = used</div><div class='add'>+                best_score = get_score(bricks)</div><div class='add'>+                for i in range(used):</div><div class='add'>+                        new_bricks = bricks[:]</div><div class='add'>+                        del new_bricks[used]</div><div class='add'>+                        new_bricks.insert(i, bricks[used])</div><div class='add'>+                        new_score = get_score(new_bricks)</div><div class='add'>+                        if new_score &gt; best_score:</div><div class='add'>+                                best_place = i</div><div class='add'>+                                best_score = new_score</div><div class='add'>+                if best_place != used:</div><div class='add'>+                        nb = bricks[used]</div><div class='add'>+                        del bricks[used]</div><div class='add'>+                        bricks.insert(best_place, nb)</div><div class='add'>+                used += 1</div><div class='add'>+</div><div class='add'>+        # Finalize whatever we decided on.</div><div class='add'>+        curr_hash = 0</div><div class='add'>+        for b in bricks:</div><div class='add'>+                b.r_start = curr_hash</div><div class='add'>+                curr_hash += b.good_size</div><div class='add'>+                b.r_end = curr_hash - 1</div><div class='add'>+</div><div class='add'>+        print("Here are the xattr values for your size-weighted layout:")</div><div class='add'>+        for b in bricks:</div><div class='add'>+                print("  %s: 0x0000000200000000%08x%08x" % (</div><div class='add'>+                        b.sv_name, b.r_start, b.r_end))</div><div class='add'>+</div><div class='add'>+        if fix_dir:</div><div class='add'>+                if options.verbose:</div><div class='add'>+                        print("Fixing layout for %s" % fix_dir)</div><div class='add'>+                for b in bricks:</div><div class='add'>+                        value = "0x0000000200000000%08x%08x" % (</div><div class='add'>+                                b.r_start, b.r_end)</div><div class='add'>+                        path = "%s/%s" % (b.path, fix_dir)</div><div class='add'>+                        cmd = "setfattr -n trusted.glusterfs.dht -v %s %s" % (</div><div class='add'>+                                value, path)</div><div class='add'>+                        print(cmd)</div><div class='add'>+</div><div class='add'>+        if options.leave_mounted:</div><div class='add'>+                print("The following subvolumes are still mounted:")</div><div class='add'>+                for b in bricks:</div><div class='add'>+                        print("%s on %s" % (b.sv_name, b.path))</div><div class='add'>+                print("Don't forget to clean up when you're done.")</div><div class='add'>+</div><div class='head'>diff --git a/extras/run-gluster.tmpfiles.in b/extras/run-gluster.tmpfiles.in<br/>new file mode 100644<br/>index 00000000000..329f2dde6db<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/extras/run-gluster.tmpfiles.in?id=d1d7a6f35c816822fab51c820e25023863c239c1'>extras/run-gluster.tmpfiles.in</a></div><div class='hunk'>@@ -0,0 +1,2 @@</div><div class='add'>+# hardcoding /run for now, should be detected while building from source?</div><div class='add'>+d /run/gluster 0775 gluster gluster -</div><div class='head'>diff --git a/extras/snap_scheduler/Makefile.am b/extras/snap_scheduler/Makefile.am<br/>new file mode 100644<br/>index 00000000000..782f139016f<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/extras/snap_scheduler/Makefile.am?id=d1d7a6f35c816822fab51c820e25023863c239c1'>extras/snap_scheduler/Makefile.am</a></div><div class='hunk'>@@ -0,0 +1,9 @@</div><div class='add'>+snap_schedulerdir = $(sbindir)/</div><div class='add'>+</div><div class='add'>+if WITH_SERVER</div><div class='add'>+snap_scheduler_SCRIPTS = gcron.py snap_scheduler.py conf.py</div><div class='add'>+endif</div><div class='add'>+</div><div class='add'>+EXTRA_DIST = gcron.py snap_scheduler.py conf.py</div><div class='add'>+</div><div class='add'>+CLEANFILES =</div><div class='head'>diff --git a/extras/snap_scheduler/README.md b/extras/snap_scheduler/README.md<br/>new file mode 100644<br/>index 00000000000..1316bb76469<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/extras/snap_scheduler/README.md?id=d1d7a6f35c816822fab51c820e25023863c239c1'>extras/snap_scheduler/README.md</a></div><div class='hunk'>@@ -0,0 +1,125 @@</div><div class='add'>+Snapshot Scheduler</div><div class='add'>+==============================</div><div class='add'>+</div><div class='add'>+SUMMARY</div><div class='add'>+-------</div><div class='add'>+</div><div class='add'>+GlusterFS volume snapshot provides point-in-time copy of a GlusterFS volume. Currently, GlusterFS volume snapshots can be easily scheduled by setting up cron jobs on one of the nodes in the GlusterFS trusted storage pool. This has a single point failure (SPOF), as scheduled jobs can be missed if the node running the cron jobs dies.</div><div class='add'>+</div><div class='add'>+We can avoid the SPOF by distributing the cron jobs to all nodes of the trusted storage pool.</div><div class='add'>+</div><div class='add'>+DETAILED DESCRIPTION</div><div class='add'>+--------------------</div><div class='add'>+</div><div class='add'>+The solution to the above problems involves the usage of:</div><div class='add'>+</div><div class='add'>+* A shared storage - This can be any shared storage (another gluster volume, a NFS mount, etc.) that will be used to share the schedule configuration and will help in the coordination of the jobs.</div><div class='add'>+* An agent - This agent will perform the actual snapshot commands, instead of cron. It will contain the logic to perform coordinated snapshots.</div><div class='add'>+* A helper script - This script will allow the user to initialise the scheduler on the local node, enable/disable scheduling, add/edit/list/delete snapshot schedules.</div><div class='add'>+* cronie - It is the default cron daemon shipped with RHEL. It invokes the agent at the appropriate intervals as mentioned by the user to perform the snapshot operation on the volume as mentioned by the user in the schedule.</div><div class='add'>+</div><div class='add'>+INITIAL SETUP</div><div class='add'>+-------------</div><div class='add'>+</div><div class='add'>+The administrator needs to create a shared storage that can be available to nodes across the cluster. A GlusterFS volume can also be used for the same. It is preferable that the *shared volume* be a replicate volume to avoid SPOF.</div><div class='add'>+</div><div class='add'>+Once the shared storage is created, it should be mounted on all nodes in the trusted storage pool which will be participating in the scheduling. The location where the shared_storage should be mounted (/var/run/gluster/snaps/shared_storage) in these nodes is fixed and is not configurable. Each node participating in the scheduling then needs to perform an initialisation of the snapshot scheduler by invoking the following:</div><div class='add'>+</div><div class='add'>+snap_scheduler.py init</div><div class='add'>+</div><div class='add'>+NOTE: This command needs to be run on all the nodes participating in the scheduling</div><div class='add'>+</div><div class='add'>+HELPER SCRIPT</div><div class='add'>+-------------</div><div class='add'>+</div><div class='add'>+The helper script(snap_scheduler.py) will initialise the scheduler on the local node, enable/disable scheduling, add/edit/list/delete snapshot schedules.</div><div class='add'>+</div><div class='add'>+a) snap_scheduler.py init</div><div class='add'>+</div><div class='add'>+This command initialises the snap_scheduler and interfaces it with the crond running on the local node. This is the first step, before executing any scheduling related commands from a node.</div><div class='add'>+</div><div class='add'>+NOTE: The helper script needs to be run with this option on all the nodes participating in the scheduling. Other options of the helper script can be run independently from any node, where initialisation has been successfully completed.</div><div class='add'>+</div><div class='add'>+b) snap_scheduler.py enable</div><div class='add'>+</div><div class='add'>+The snap scheduler is disabled by default after initialisation. This command enables the snap scheduler.</div><div class='add'>+</div><div class='add'>+c) snap_scheduler.py disable</div><div class='add'>+</div><div class='add'>+This command disables the snap scheduler.</div><div class='add'>+</div><div class='add'>+d) snap_scheduler.py status</div><div class='add'>+</div><div class='add'>+This command displays the current status(Enabled/Disabled) of the snap scheduler.</div><div class='add'>+</div><div class='add'>+e) snap_scheduler.py add "Job Name" "Schedule" "Volume Name"</div><div class='add'>+</div><div class='add'>+This command adds a new snapshot schedule. All the arguments must be provided within double-quotes(""). It takes three arguments:</div><div class='add'>+</div><div class='add'>+-&gt; Job Name: This name uniquely identifies this particular schedule, and can be used to reference this schedule for future events like edit/delete. If a schedule already exists for the specified Job Name, the add command will fail.</div><div class='add'>+</div><div class='add'>+-&gt; Schedule: The schedules are accepted in the format crond understands:-</div><div class='add'>+</div><div class='add'>+Example of job definition:</div><div class='add'>+.---------------- minute (0 - 59)</div><div class='add'>+| .------------- hour (0 - 23)</div><div class='add'>+| | .---------- day of month (1 - 31)</div><div class='add'>+| | | .------- month (1 - 12) OR jan,feb,mar,apr ...</div><div class='add'>+| | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat</div><div class='add'>+| | | | |</div><div class='add'>+* * * * * user-name command to be executed</div><div class='add'>+Although we accept all valid cron schedules, currently we support granularity of snapshot schedules to a maximum of half-hourly snapshots.</div><div class='add'>+</div><div class='add'>+-&gt; Volume Name: The name of the volume on which the scheduled snapshot operation will be performed.</div><div class='add'>+</div><div class='add'>+f) snap_scheduler.py edit "Job Name" "Schedule" "Volume Name"</div><div class='add'>+</div><div class='add'>+This command edits an existing snapshot schedule. It takes the same three arguments that the add option takes. All the arguments must be provided within double-quotes(""). If a schedule does not exists for the specified Job Name, the edit command will fail.</div><div class='add'>+</div><div class='add'>+g) snap_scheduler.py delete "Job Name"</div><div class='add'>+</div><div class='add'>+This command deletes an existing snapshot schedule. It takes the job name of the schedule as argument. The argument must be provided within double-quotes(""). If a schedule does not exists for the specified Job Name, the delete command will fail.</div><div class='add'>+</div><div class='add'>+h) snap_scheduler.py list</div><div class='add'>+</div><div class='add'>+This command lists the existing snapshot schedules in the following manner: Pseudocode:</div><div class='add'>+</div><div class='add'>+# snap_scheduler.py list</div><div class='add'>+JOB_NAME         SCHEDULE         OPERATION        VOLUME NAME</div><div class='add'>+--------------------------------------------------------------------</div><div class='add'>+Job0             * * * * *        Snapshot Create  test_vol</div><div class='add'>+</div><div class='add'>+THE AGENT</div><div class='add'>+---------</div><div class='add'>+</div><div class='add'>+The snapshots scheduled with the help of the helper script, are read by crond which then invokes the agent(gcron.py) at the scheduled intervals to perform the snapshot operations on the specified volumes. It then performs the scheduled snapshots using the following algorithm to coordinate.</div><div class='add'>+</div><div class='add'>+start_time = get current time</div><div class='add'>+lock_file = job_name passed as an argument</div><div class='add'>+vol_name = volume name psased as an argument</div><div class='add'>+try POSIX locking the $lock_file</div><div class='add'>+    if lock is obtained, then</div><div class='add'>+        mod_time = Get modification time of $entry</div><div class='add'>+        if $mod_time &lt; $start_time, then</div><div class='add'>+            Take snapshot of $entry.name (Volume name)</div><div class='add'>+            if snapshot failed, then</div><div class='add'>+                log the failure</div><div class='add'>+            Update modification time of $entry to current time</div><div class='add'>+        unlock the $entry</div><div class='add'>+</div><div class='add'>+The coordination with other scripts running on other nodes, is handled by the use of POSIX locks. All the instances of the script will attempt to lock the lock_file which is essentialy an empty file with the job name, and one which gets the lock will take the snapshot.</div><div class='add'>+</div><div class='add'>+To prevent redoing a done task, the script will make use of the mtime attribute of the entry. At the beginning execution, the script would have saved its start time. Once the script obtains the lock on the lock_file, before taking the snapshot, it compares the mtime of the entry with the start time. The snapshot will only be taken if the mtime is smaller than start time. Once the snapshot command completes, the script will update the mtime of the lock_file to the current time before unlocking.</div><div class='add'>+</div><div class='add'>+If a snapshot command fails, the script will log the failure (in syslog) and continue with its operation. It will not attempt to retry the failed snapshot in the current schedule, but will attempt it again in the next schedules. It is left to the administrator to monitor the logs and decide what to do after a failure.</div><div class='add'>+</div><div class='add'>+ASSUMPTIONS AND LIMITATIONS</div><div class='add'>+---------------------------</div><div class='add'>+</div><div class='add'>+It is assumed that all nodes in the have their times synced using NTP or any other mechanism. This is a hard requirement for this feature to work.</div><div class='add'>+</div><div class='add'>+The administrator needs to have python2.7 or higher installed, as well as the argparse module installed, to be able to use the helper script(snap_scheduler.py).</div><div class='add'>+</div><div class='add'>+There is a latency of one minute, between providing a command by the helper script and that command taking effect. Hence, currently we do not support snapshot schedules with per minute granularity.</div><div class='add'>+</div><div class='add'>+The administrator can however leverage the scheduler to schedule snapshots with granularity of half-hourly/hourly/daily/weekly/monthly/yearly periodic intervals. They can also schedule snapshots, which are customised mentioning which minute of the hour, which day of the week, which week of the month, and which month of the year, they want to schedule the snapshot operation.</div><div class='head'>diff --git a/extras/snap_scheduler/conf.py.in b/extras/snap_scheduler/conf.py.in<br/>new file mode 100644<br/>index 00000000000..6dcca0534a7<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/extras/snap_scheduler/conf.py.in?id=d1d7a6f35c816822fab51c820e25023863c239c1'>extras/snap_scheduler/conf.py.in</a></div><div class='hunk'>@@ -0,0 +1,11 @@</div><div class='add'>+#</div><div class='add'>+# Copyright (c) 2016 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+# This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+# This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+# General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+# later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+# cases as published by the Free Software Foundation.</div><div class='add'>+#</div><div class='add'>+</div><div class='add'>+GLUSTERFS_LIBEXECDIR = '@GLUSTERFS_LIBEXECDIR@'</div><div class='head'>diff --git a/extras/snap_scheduler/gcron.py b/extras/snap_scheduler/gcron.py<br/>new file mode 100755<br/>index 00000000000..0e4df77d481<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/extras/snap_scheduler/gcron.py?id=d1d7a6f35c816822fab51c820e25023863c239c1'>extras/snap_scheduler/gcron.py</a></div><div class='hunk'>@@ -0,0 +1,190 @@</div><div class='add'>+#!/usr/bin/python3</div><div class='add'>+#</div><div class='add'>+# Copyright (c) 2015 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+# This file is part of GlusterFS.</div><div class='add'>+#</div><div class='add'>+# This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+# General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+# later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+# cases as published by the Free Software Foundation.</div><div class='add'>+</div><div class='add'>+from __future__ import print_function</div><div class='add'>+import subprocess</div><div class='add'>+import os</div><div class='add'>+import os.path</div><div class='add'>+import sys</div><div class='add'>+import time</div><div class='add'>+import logging</div><div class='add'>+import logging.handlers</div><div class='add'>+import fcntl</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+GCRON_TASKS = "/run/gluster/shared_storage/snaps/glusterfs_snap_cron_tasks"</div><div class='add'>+GCRON_CROND_TASK = "/etc/cron.d/glusterfs_snap_cron_tasks"</div><div class='add'>+GCRON_RELOAD_FLAG = "/var/run/gluster/crond_task_reload_flag"</div><div class='add'>+LOCK_FILE_DIR = "/run/gluster/shared_storage/snaps/lock_files/"</div><div class='add'>+log = logging.getLogger("gcron-logger")</div><div class='add'>+start_time = 0.0</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def initLogger(script_name):</div><div class='add'>+    log.setLevel(logging.DEBUG)</div><div class='add'>+    logFormat = "[%(asctime)s %(filename)s:%(lineno)s %(funcName)s] "\</div><div class='add'>+        "%(levelname)s %(message)s"</div><div class='add'>+    formatter = logging.Formatter(logFormat)</div><div class='add'>+</div><div class='add'>+    sh = logging.handlers.SysLogHandler()</div><div class='add'>+    sh.setLevel(logging.ERROR)</div><div class='add'>+    sh.setFormatter(formatter)</div><div class='add'>+</div><div class='add'>+    process = subprocess.Popen(["gluster", "--print-logdir"],</div><div class='add'>+                               stdout=subprocess.PIPE,</div><div class='add'>+                               universal_newlines=True)</div><div class='add'>+    out, err = process.communicate()</div><div class='add'>+    if process.returncode == 0:</div><div class='add'>+        logfile = os.path.join(out.strip(), script_name[:-3]+".log")</div><div class='add'>+</div><div class='add'>+    fh = logging.FileHandler(logfile)</div><div class='add'>+    fh.setLevel(logging.DEBUG)</div><div class='add'>+    fh.setFormatter(formatter)</div><div class='add'>+</div><div class='add'>+    log.addHandler(sh)</div><div class='add'>+    log.addHandler(fh)</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def takeSnap(volname="", snapname=""):</div><div class='add'>+    success = True</div><div class='add'>+    if volname == "":</div><div class='add'>+        log.debug("No volname given")</div><div class='add'>+        return False</div><div class='add'>+    if snapname == "":</div><div class='add'>+        log.debug("No snapname given")</div><div class='add'>+        return False</div><div class='add'>+</div><div class='add'>+    cli = ["gluster",</div><div class='add'>+           "snapshot",</div><div class='add'>+           "create",</div><div class='add'>+           snapname,</div><div class='add'>+           volname]</div><div class='add'>+    log.debug("Running command '%s'", " ".join(cli))</div><div class='add'>+</div><div class='add'>+    p = subprocess.Popen(cli, stdout=subprocess.PIPE,</div><div class='add'>+                         stderr=subprocess.PIPE)</div><div class='add'>+    out, err = p.communicate()</div><div class='add'>+    rv = p.returncode</div><div class='add'>+</div><div class='add'>+    log.debug("Command '%s' returned '%d'", " ".join(cli), rv)</div><div class='add'>+</div><div class='add'>+    if rv:</div><div class='add'>+        log.error("Snapshot of %s failed", volname)</div><div class='add'>+        log.error("Command output:")</div><div class='add'>+        log.error(err)</div><div class='add'>+        success = False</div><div class='add'>+    else:</div><div class='add'>+        log.info("Snapshot of %s successful", volname)</div><div class='add'>+</div><div class='add'>+    return success</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def doJob(name, lockFile, jobFunc, volname):</div><div class='add'>+    success = True</div><div class='add'>+    try:</div><div class='add'>+        f = os.open(lockFile, os.O_CREAT | os.O_RDWR | os.O_NONBLOCK)</div><div class='add'>+        try:</div><div class='add'>+            fcntl.flock(f, fcntl.LOCK_EX | fcntl.LOCK_NB)</div><div class='add'>+            mtime = os.path.getmtime(lockFile)</div><div class='add'>+            global start_time</div><div class='add'>+            log.debug("%s last modified at %s", lockFile, time.ctime(mtime))</div><div class='add'>+            if mtime &lt; start_time:</div><div class='add'>+                log.debug("Processing job %s", name)</div><div class='add'>+                if jobFunc(volname, name):</div><div class='add'>+                    log.info("Job %s succeeded", name)</div><div class='add'>+                else:</div><div class='add'>+                    log.error("Job %s failed", name)</div><div class='add'>+                    success = False</div><div class='add'>+                os.utime(lockFile, None)</div><div class='add'>+            else:</div><div class='add'>+                log.info("Job %s has been processed already", name)</div><div class='add'>+            fcntl.flock(f, fcntl.LOCK_UN)</div><div class='add'>+        except (OSError, IOError):</div><div class='add'>+            log.info("Job %s is being processed by another agent", name)</div><div class='add'>+        os.close(f)</div><div class='add'>+    except (OSError, IOError) as e:</div><div class='add'>+        log.debug("Failed to open lock file %s : %s", lockFile, e)</div><div class='add'>+        log.error("Failed to process job %s", name)</div><div class='add'>+        success = False</div><div class='add'>+</div><div class='add'>+    return success</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def main():</div><div class='add'>+    script_name = os.path.basename(__file__)</div><div class='add'>+    initLogger(script_name)</div><div class='add'>+    global start_time</div><div class='add'>+    if sys.argv[1] == "--update":</div><div class='add'>+        if not os.path.exists(GCRON_TASKS):</div><div class='add'>+            # Create a flag in /var/run/gluster which indicates that this</div><div class='add'>+            # node doesn't have access to GCRON_TASKS right now, so that</div><div class='add'>+            # when the mount is available and GCRON_TASKS is available</div><div class='add'>+            # the flag will tell this routine to reload GCRON_CROND_TASK</div><div class='add'>+            try:</div><div class='add'>+                f = os.open(GCRON_RELOAD_FLAG,</div><div class='add'>+                            os.O_CREAT | os.O_NONBLOCK, 0o644)</div><div class='add'>+                os.close(f)</div><div class='add'>+            except OSError as e:</div><div class='add'>+                if errno != EEXIST:</div><div class='add'>+                    log.error("Failed to create %s : %s",</div><div class='add'>+                              GCRON_RELOAD_FLAG, e)</div><div class='add'>+                    output("Failed to create %s. Error: %s"</div><div class='add'>+                           % (GCRON_RELOAD_FLAG, e))</div><div class='add'>+            return</div><div class='add'>+</div><div class='add'>+        if not os.path.exists(GCRON_CROND_TASK):</div><div class='add'>+            return</div><div class='add'>+</div><div class='add'>+        # As GCRON_TASKS exists now, we should check if GCRON_RELOAD_FLAG</div><div class='add'>+        # also exists. If so we should touch GCRON_CROND_TASK and remove</div><div class='add'>+        # the GCRON_RELOAD_FLAG</div><div class='add'>+        if os.path.exists(GCRON_RELOAD_FLAG):</div><div class='add'>+            try:</div><div class='add'>+                os.remove(GCRON_RELOAD_FLAG);</div><div class='add'>+                process = subprocess.Popen(["touch", "-h", GCRON_CROND_TASK],</div><div class='add'>+                                           stdout=subprocess.PIPE,</div><div class='add'>+                                           stderr=subprocess.PIPE)</div><div class='add'>+                out, err = process.communicate()</div><div class='add'>+                if process.returncode != 0:</div><div class='add'>+                    log.error("Failed to touch %s. Error: %s.",</div><div class='add'>+                              GCRON_CROND_TASK, err)</div><div class='add'>+            except (IOError, OSError) as e:</div><div class='add'>+                log.error("Failed to touch %s. Error: %s.",</div><div class='add'>+                          GCRON_CROND_TASK, e)</div><div class='add'>+            return</div><div class='add'>+        if os.lstat(GCRON_TASKS).st_mtime &gt; \</div><div class='add'>+           os.lstat(GCRON_CROND_TASK).st_mtime:</div><div class='add'>+            try:</div><div class='add'>+                process = subprocess.Popen(["touch", "-h", GCRON_CROND_TASK],</div><div class='add'>+                                           stdout=subprocess.PIPE,</div><div class='add'>+                                           stderr=subprocess.PIPE)</div><div class='add'>+                out, err = process.communicate()</div><div class='add'>+                if process.returncode != 0:</div><div class='add'>+                    log.error("Failed to touch %s. Error: %s.",</div><div class='add'>+                              GCRON_CROND_TASK, err)</div><div class='add'>+            except IOError as e:</div><div class='add'>+                log.error("Failed to touch %s. Error: %s.",</div><div class='add'>+                          GCRON_CROND_TASK, e)</div><div class='add'>+        return</div><div class='add'>+</div><div class='add'>+    volname = sys.argv[1]</div><div class='add'>+    jobname = sys.argv[2]</div><div class='add'>+    locking_file = os.path.join(LOCK_FILE_DIR, jobname)</div><div class='add'>+    log.debug("locking_file = %s", locking_file)</div><div class='add'>+    log.debug("volname = %s", volname)</div><div class='add'>+    log.debug("jobname = %s", jobname)</div><div class='add'>+</div><div class='add'>+    start_time = int(time.time())</div><div class='add'>+</div><div class='add'>+    doJob("Scheduled-" + jobname + "-" + volname, locking_file, takeSnap, volname)</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+if __name__ == "__main__":</div><div class='add'>+    main()</div><div class='head'>diff --git a/extras/snap_scheduler/snap_scheduler.py b/extras/snap_scheduler/snap_scheduler.py<br/>new file mode 100755<br/>index 00000000000..e8fcc449a9b<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/extras/snap_scheduler/snap_scheduler.py?id=d1d7a6f35c816822fab51c820e25023863c239c1'>extras/snap_scheduler/snap_scheduler.py</a></div><div class='hunk'>@@ -0,0 +1,941 @@</div><div class='add'>+#!/usr/bin/python3</div><div class='add'>+#</div><div class='add'>+# Copyright (c) 2015 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+# This file is part of GlusterFS.</div><div class='add'>+#</div><div class='add'>+# This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+# General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+# later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+# cases as published by the Free Software Foundation.</div><div class='add'>+</div><div class='add'>+from __future__ import print_function</div><div class='add'>+import subprocess</div><div class='add'>+import os</div><div class='add'>+import os.path</div><div class='add'>+import logging</div><div class='add'>+import argparse</div><div class='add'>+import fcntl</div><div class='add'>+import logging.handlers</div><div class='add'>+import sys</div><div class='add'>+import shutil</div><div class='add'>+from errno import EEXIST</div><div class='add'>+from conf import GLUSTERFS_LIBEXECDIR</div><div class='add'>+sys.path.insert(1, GLUSTERFS_LIBEXECDIR)</div><div class='add'>+</div><div class='add'>+EVENTS_ENABLED = True</div><div class='add'>+try:</div><div class='add'>+    from events.eventtypes import SNAPSHOT_SCHEDULER_INITIALISED \</div><div class='add'>+                         as EVENT_SNAPSHOT_SCHEDULER_INITIALISED</div><div class='add'>+    from events.eventtypes import SNAPSHOT_SCHEDULER_INIT_FAILED \</div><div class='add'>+                         as EVENT_SNAPSHOT_SCHEDULER_INIT_FAILED</div><div class='add'>+    from events.eventtypes import SNAPSHOT_SCHEDULER_DISABLED \</div><div class='add'>+                         as EVENT_SNAPSHOT_SCHEDULER_DISABLED</div><div class='add'>+    from events.eventtypes import SNAPSHOT_SCHEDULER_DISABLE_FAILED \</div><div class='add'>+                         as EVENT_SNAPSHOT_SCHEDULER_DISABLE_FAILED</div><div class='add'>+    from events.eventtypes import SNAPSHOT_SCHEDULER_ENABLED \</div><div class='add'>+                         as EVENT_SNAPSHOT_SCHEDULER_ENABLED</div><div class='add'>+    from events.eventtypes import SNAPSHOT_SCHEDULER_ENABLE_FAILED \</div><div class='add'>+                         as EVENT_SNAPSHOT_SCHEDULER_ENABLE_FAILED</div><div class='add'>+    from events.eventtypes import SNAPSHOT_SCHEDULER_SCHEDULE_ADDED \</div><div class='add'>+                         as EVENT_SNAPSHOT_SCHEDULER_SCHEDULE_ADDED</div><div class='add'>+    from events.eventtypes import SNAPSHOT_SCHEDULER_SCHEDULE_ADD_FAILED \</div><div class='add'>+                         as EVENT_SNAPSHOT_SCHEDULER_SCHEDULE_ADD_FAILED</div><div class='add'>+    from events.eventtypes import SNAPSHOT_SCHEDULER_SCHEDULE_DELETED \</div><div class='add'>+                         as EVENT_SNAPSHOT_SCHEDULER_SCHEDULE_DELETED</div><div class='add'>+    from events.eventtypes import SNAPSHOT_SCHEDULER_SCHEDULE_DELETE_FAILED \</div><div class='add'>+                         as EVENT_SNAPSHOT_SCHEDULER_SCHEDULE_DELETE_FAILED</div><div class='add'>+    from events.eventtypes import SNAPSHOT_SCHEDULER_SCHEDULE_EDITED \</div><div class='add'>+                         as EVENT_SNAPSHOT_SCHEDULER_SCHEDULE_EDITED</div><div class='add'>+    from events.eventtypes import SNAPSHOT_SCHEDULER_SCHEDULE_EDIT_FAILED \</div><div class='add'>+                         as EVENT_SNAPSHOT_SCHEDULER_SCHEDULE_EDIT_FAILED</div><div class='add'>+except ImportError:</div><div class='add'>+    # Events APIs not installed, dummy eventtypes with None</div><div class='add'>+    EVENTS_ENABLED = False</div><div class='add'>+    EVENT_SNAPSHOT_SCHEDULER_INITIALISED = None</div><div class='add'>+    EVENT_SNAPSHOT_SCHEDULER_INIT_FAILED = None</div><div class='add'>+    EVENT_SNAPSHOT_SCHEDULER_DISABLED = None</div><div class='add'>+    EVENT_SNAPSHOT_SCHEDULER_DISABLE_FAILED = None</div><div class='add'>+    EVENT_SNAPSHOT_SCHEDULER_ENABLED = None</div><div class='add'>+    EVENT_SNAPSHOT_SCHEDULER_ENABLE_FAILED = None</div><div class='add'>+    EVENT_SNAPSHOT_SCHEDULER_SCHEDULE_ADDED = None</div><div class='add'>+    EVENT_SNAPSHOT_SCHEDULER_SCHEDULE_ADD_FAILED = None</div><div class='add'>+    EVENT_SNAPSHOT_SCHEDULER_SCHEDULE_DELETED = None</div><div class='add'>+    EVENT_SNAPSHOT_SCHEDULER_SCHEDULE_DELETE_FAILED = None</div><div class='add'>+    EVENT_SNAPSHOT_SCHEDULER_SCHEDULE_EDITED = None</div><div class='add'>+    EVENT_SNAPSHOT_SCHEDULER_SCHEDULE_EDIT_FAILED = None</div><div class='add'>+</div><div class='add'>+SCRIPT_NAME = "snap_scheduler"</div><div class='add'>+scheduler_enabled = False</div><div class='add'>+log = logging.getLogger(SCRIPT_NAME)</div><div class='add'>+SHARED_STORAGE_DIR="/run/gluster/shared_storage"</div><div class='add'>+GCRON_DISABLED = SHARED_STORAGE_DIR+"/snaps/gcron_disabled"</div><div class='add'>+GCRON_ENABLED = SHARED_STORAGE_DIR+"/snaps/gcron_enabled"</div><div class='add'>+GCRON_TASKS = SHARED_STORAGE_DIR+"/snaps/glusterfs_snap_cron_tasks"</div><div class='add'>+GCRON_CROND_TASK = "/etc/cron.d/glusterfs_snap_cron_tasks"</div><div class='add'>+LOCK_FILE_DIR = SHARED_STORAGE_DIR+"/snaps/lock_files/"</div><div class='add'>+LOCK_FILE = LOCK_FILE_DIR+"lock_file"</div><div class='add'>+TMP_FILE = SHARED_STORAGE_DIR+"/snaps/tmp_file"</div><div class='add'>+GCRON_UPDATE_TASK = "/etc/cron.d/gcron_update_task"</div><div class='add'>+CURRENT_SCHEDULER = SHARED_STORAGE_DIR+"/snaps/current_scheduler"</div><div class='add'>+tasks = {}</div><div class='add'>+longest_field = 12</div><div class='add'>+current_scheduler = ""</div><div class='add'>+</div><div class='add'>+INTERNAL_ERROR = 2</div><div class='add'>+SHARED_STORAGE_DIR_DOESNT_EXIST = 3</div><div class='add'>+SHARED_STORAGE_NOT_MOUNTED = 4</div><div class='add'>+ANOTHER_TRANSACTION_IN_PROGRESS = 5</div><div class='add'>+INIT_FAILED = 6</div><div class='add'>+SCHEDULING_ALREADY_DISABLED = 7</div><div class='add'>+SCHEDULING_ALREADY_ENABLED = 8</div><div class='add'>+NODE_NOT_INITIALISED = 9</div><div class='add'>+ANOTHER_SCHEDULER_ACTIVE = 10</div><div class='add'>+JOB_ALREADY_EXISTS = 11</div><div class='add'>+JOB_NOT_FOUND = 12</div><div class='add'>+INVALID_JOBNAME = 13</div><div class='add'>+INVALID_VOLNAME = 14</div><div class='add'>+INVALID_SCHEDULE = 15</div><div class='add'>+INVALID_ARG = 16</div><div class='add'>+VOLUME_DOES_NOT_EXIST = 17</div><div class='add'>+</div><div class='add'>+def print_error (error_num):</div><div class='add'>+    if error_num == INTERNAL_ERROR:</div><div class='add'>+        return "Internal Error"</div><div class='add'>+    elif error_num == SHARED_STORAGE_DIR_DOESNT_EXIST:</div><div class='add'>+        return "The shared storage directory ("+SHARED_STORAGE_DIR+")" \</div><div class='add'>+               " does not exist."</div><div class='add'>+    elif error_num == SHARED_STORAGE_NOT_MOUNTED:</div><div class='add'>+        return "The shared storage directory ("+SHARED_STORAGE_DIR+")" \</div><div class='add'>+               " is not mounted."</div><div class='add'>+    elif error_num == ANOTHER_TRANSACTION_IN_PROGRESS:</div><div class='add'>+        return "Another transaction is in progress."</div><div class='add'>+    elif error_num == INIT_FAILED:</div><div class='add'>+        return "Initialisation failed."</div><div class='add'>+    elif error_num == SCHEDULING_ALREADY_DISABLED:</div><div class='add'>+        return "Snapshot scheduler is already disabled."</div><div class='add'>+    elif error_num == SCHEDULING_ALREADY_ENABLED:</div><div class='add'>+        return "Snapshot scheduler is already enabled."</div><div class='add'>+    elif error_num == NODE_NOT_INITIALISED:</div><div class='add'>+        return "The node is not initialised."</div><div class='add'>+    elif error_num == ANOTHER_SCHEDULER_ACTIVE:</div><div class='add'>+        return "Another scheduler is active."</div><div class='add'>+    elif error_num == JOB_ALREADY_EXISTS:</div><div class='add'>+        return "The job already exists."</div><div class='add'>+    elif error_num == JOB_NOT_FOUND:</div><div class='add'>+        return "The job cannot be found."</div><div class='add'>+    elif error_num == INVALID_JOBNAME:</div><div class='add'>+        return "The job name is invalid."</div><div class='add'>+    elif error_num == INVALID_VOLNAME:</div><div class='add'>+        return "The volume name is invalid."</div><div class='add'>+    elif error_num == INVALID_SCHEDULE:</div><div class='add'>+        return "The schedule is invalid."</div><div class='add'>+    elif error_num == INVALID_ARG:</div><div class='add'>+        return "The argument is invalid."</div><div class='add'>+    elif error_num == VOLUME_DOES_NOT_EXIST:</div><div class='add'>+        return "The volume does not exist."</div><div class='add'>+</div><div class='add'>+def output(msg):</div><div class='add'>+    print("%s: %s" % (SCRIPT_NAME, msg))</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def initLogger():</div><div class='add'>+    log.setLevel(logging.DEBUG)</div><div class='add'>+    logFormat = "[%(asctime)s %(filename)s:%(lineno)s %(funcName)s] "\</div><div class='add'>+        "%(levelname)s %(message)s"</div><div class='add'>+    formatter = logging.Formatter(logFormat)</div><div class='add'>+</div><div class='add'>+    sh = logging.handlers.SysLogHandler()</div><div class='add'>+    sh.setLevel(logging.ERROR)</div><div class='add'>+    sh.setFormatter(formatter)</div><div class='add'>+</div><div class='add'>+    process = subprocess.Popen(["gluster", "--print-logdir"],</div><div class='add'>+                               stdout=subprocess.PIPE, universal_newlines=True)</div><div class='add'>+    logfile = os.path.join(process.stdout.read()[:-1], SCRIPT_NAME + ".log")</div><div class='add'>+</div><div class='add'>+    fh = logging.FileHandler(logfile)</div><div class='add'>+    fh.setLevel(logging.DEBUG)</div><div class='add'>+    fh.setFormatter(formatter)</div><div class='add'>+</div><div class='add'>+    log.addHandler(sh)</div><div class='add'>+    log.addHandler(fh)</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def scheduler_status():</div><div class='add'>+    ret = INTERNAL_ERROR</div><div class='add'>+    global scheduler_enabled</div><div class='add'>+    try:</div><div class='add'>+        f = os.path.realpath(GCRON_TASKS)</div><div class='add'>+        if f != os.path.realpath(GCRON_ENABLED) or not os.path.exists(GCRON_ENABLED):</div><div class='add'>+            log.info("Snapshot scheduler is currently disabled.")</div><div class='add'>+            scheduler_enabled = False</div><div class='add'>+        else:</div><div class='add'>+            log.info("Snapshot scheduler is currently enabled.")</div><div class='add'>+            scheduler_enabled = True</div><div class='add'>+        ret = 0</div><div class='add'>+    except:</div><div class='add'>+        log.error("Failed to enable snapshot scheduling. Error: "</div><div class='add'>+                  "Failed to check the status of %s.", GCRON_DISABLED)</div><div class='add'>+</div><div class='add'>+    return ret</div><div class='add'>+</div><div class='add'>+def enable_scheduler():</div><div class='add'>+    ret = scheduler_status()</div><div class='add'>+    if ret == 0:</div><div class='add'>+        if not scheduler_enabled:</div><div class='add'>+</div><div class='add'>+            # Check if another scheduler is active.</div><div class='add'>+            ret = get_current_scheduler()</div><div class='add'>+            if ret == 0:</div><div class='add'>+                if (current_scheduler != "none"):</div><div class='add'>+                    print_str = "Failed to enable snapshot scheduling. " \</div><div class='add'>+                                "Error: Another scheduler is active."</div><div class='add'>+                    log.error(print_str)</div><div class='add'>+                    output(print_str)</div><div class='add'>+                    ret = ANOTHER_SCHEDULER_ACTIVE</div><div class='add'>+                    return ret</div><div class='add'>+            else:</div><div class='add'>+                print_str = "Failed to get current scheduler info."</div><div class='add'>+                log.error(print_str)</div><div class='add'>+                output(print_str)</div><div class='add'>+                return ret</div><div class='add'>+</div><div class='add'>+            log.info("Enabling snapshot scheduler.")</div><div class='add'>+            try:</div><div class='add'>+                if os.path.exists(GCRON_DISABLED):</div><div class='add'>+                    os.remove(GCRON_DISABLED)</div><div class='add'>+                if os.path.lexists(GCRON_TASKS):</div><div class='add'>+                    os.remove(GCRON_TASKS)</div><div class='add'>+                try:</div><div class='add'>+                    f = os.open(GCRON_ENABLED, os.O_CREAT | os.O_NONBLOCK,</div><div class='add'>+                                0o644)</div><div class='add'>+                    os.close(f)</div><div class='add'>+                except OSError as e:</div><div class='add'>+                    log.error("Failed to open %s. Error: %s.",</div><div class='add'>+                              GCRON_ENABLED, e)</div><div class='add'>+                    ret = INTERNAL_ERROR</div><div class='add'>+                    return ret</div><div class='add'>+                os.symlink(GCRON_ENABLED, GCRON_TASKS)</div><div class='add'>+                update_current_scheduler("cli")</div><div class='add'>+                log.info("Snapshot scheduling is enabled")</div><div class='add'>+                output("Snapshot scheduling is enabled")</div><div class='add'>+                ret = 0</div><div class='add'>+            except OSError as e:</div><div class='add'>+                print_str = ("Failed to enable snapshot scheduling."</div><div class='add'>+                             "Error: {{}}" + e)</div><div class='add'>+                log.error(print_str)</div><div class='add'>+                output(print_str)</div><div class='add'>+                ret = INTERNAL_ERROR</div><div class='add'>+        else:</div><div class='add'>+            print_str = "Failed to enable snapshot scheduling. " \</div><div class='add'>+                        "Error: Snapshot scheduling is already enabled."</div><div class='add'>+            log.error(print_str)</div><div class='add'>+            output(print_str)</div><div class='add'>+            ret = SCHEDULING_ALREADY_ENABLED</div><div class='add'>+    else:</div><div class='add'>+        print_str = "Failed to enable snapshot scheduling. " \</div><div class='add'>+                    "Error: Failed to check scheduler status."</div><div class='add'>+        log.error(print_str)</div><div class='add'>+        output(print_str)</div><div class='add'>+</div><div class='add'>+    return ret</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def disable_scheduler():</div><div class='add'>+    ret = scheduler_status()</div><div class='add'>+    if ret == 0:</div><div class='add'>+        if scheduler_enabled:</div><div class='add'>+            log.info("Disabling snapshot scheduler.")</div><div class='add'>+            try:</div><div class='add'>+                # Check if another scheduler is active. If not, then</div><div class='add'>+                # update current scheduler to "none". Else do nothing.</div><div class='add'>+                ret = get_current_scheduler()</div><div class='add'>+                if ret == 0:</div><div class='add'>+                    if (current_scheduler == "cli"):</div><div class='add'>+                        update_current_scheduler("none")</div><div class='add'>+                else:</div><div class='add'>+                    print_str = "Failed to disable snapshot scheduling. " \</div><div class='add'>+                                "Error: Failed to get current scheduler info."</div><div class='add'>+                    log.error(print_str)</div><div class='add'>+                    output(print_str)</div><div class='add'>+                    return ret</div><div class='add'>+</div><div class='add'>+                if os.path.exists(GCRON_DISABLED):</div><div class='add'>+                    os.remove(GCRON_DISABLED)</div><div class='add'>+                if os.path.lexists(GCRON_TASKS):</div><div class='add'>+                    os.remove(GCRON_TASKS)</div><div class='add'>+                f = os.open(GCRON_DISABLED, os.O_CREAT, 0o644)</div><div class='add'>+                os.close(f)</div><div class='add'>+                os.symlink(GCRON_DISABLED, GCRON_TASKS)</div><div class='add'>+                log.info("Snapshot scheduling is disabled")</div><div class='add'>+                output("Snapshot scheduling is disabled")</div><div class='add'>+                ret = 0</div><div class='add'>+            except OSError as e:</div><div class='add'>+                print_str = ("Failed to disable snapshot scheduling. Error: "</div><div class='add'>+                             + e)</div><div class='add'>+                log.error(print_str)</div><div class='add'>+                output(print_str)</div><div class='add'>+                ret = INTERNAL_ERROR</div><div class='add'>+        else:</div><div class='add'>+            print_str = "Failed to disable scheduling. " \</div><div class='add'>+                        "Error: Snapshot scheduling is already disabled."</div><div class='add'>+            log.error(print_str)</div><div class='add'>+            output(print_str)</div><div class='add'>+            ret = SCHEDULING_ALREADY_DISABLED</div><div class='add'>+    else:</div><div class='add'>+        print_str = "Failed to disable snapshot scheduling. " \</div><div class='add'>+                    "Error: Failed to check scheduler status."</div><div class='add'>+        log.error(print_str)</div><div class='add'>+        output(print_str)</div><div class='add'>+        ret = INTERNAL_ERROR</div><div class='add'>+</div><div class='add'>+    return ret</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def load_tasks_from_file():</div><div class='add'>+    global tasks</div><div class='add'>+    global longest_field</div><div class='add'>+    try:</div><div class='add'>+        with open(GCRON_ENABLED, 'r') as f:</div><div class='add'>+            for line in f:</div><div class='add'>+                line = line.rstrip('\n')</div><div class='add'>+                if not line:</div><div class='add'>+                    break</div><div class='add'>+                line = line.split("gcron.py")</div><div class='add'>+                schedule = line[0].split("root")[0].rstrip(' ')</div><div class='add'>+                line = line[1].split(" ")</div><div class='add'>+                volname = line[1]</div><div class='add'>+                jobname = line[2]</div><div class='add'>+                longest_field = max(longest_field, len(jobname), len(volname),</div><div class='add'>+                                    len(schedule))</div><div class='add'>+                tasks[jobname] = schedule+":"+volname</div><div class='add'>+            f.close()</div><div class='add'>+        ret = 0</div><div class='add'>+    except IOError as e:</div><div class='add'>+        log.error("Failed to open %s. Error: %s.", GCRON_ENABLED, e)</div><div class='add'>+        ret = INTERNAL_ERROR</div><div class='add'>+</div><div class='add'>+    return ret</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def get_current_scheduler():</div><div class='add'>+    global current_scheduler</div><div class='add'>+    try:</div><div class='add'>+        with open(CURRENT_SCHEDULER, 'r') as f:</div><div class='add'>+            current_scheduler = f.readline().rstrip('\n')</div><div class='add'>+            f.close()</div><div class='add'>+        ret = 0</div><div class='add'>+    except IOError as e:</div><div class='add'>+        log.error("Failed to open %s. Error: %s.", CURRENT_SCHEDULER, e)</div><div class='add'>+        ret = INTERNAL_ERROR</div><div class='add'>+</div><div class='add'>+    return ret</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def list_schedules():</div><div class='add'>+    log.info("Listing snapshot schedules.")</div><div class='add'>+    ret = load_tasks_from_file()</div><div class='add'>+    if ret == 0:</div><div class='add'>+        if len(tasks) == 0:</div><div class='add'>+            output("No snapshots scheduled")</div><div class='add'>+        else:</div><div class='add'>+            jobname = "JOB_NAME".ljust(longest_field+5)</div><div class='add'>+            schedule = "SCHEDULE".ljust(longest_field+5)</div><div class='add'>+            operation = "OPERATION".ljust(longest_field+5)</div><div class='add'>+            volname = "VOLUME NAME".ljust(longest_field+5)</div><div class='add'>+            hyphens = "".ljust((longest_field+5) * 4, '-')</div><div class='add'>+            print(jobname+schedule+operation+volname)</div><div class='add'>+            print(hyphens)</div><div class='add'>+            for key in sorted(tasks):</div><div class='add'>+                jobname = key.ljust(longest_field+5)</div><div class='add'>+                schedule = tasks[key].split(":")[0].ljust(</div><div class='add'>+                           longest_field + 5)</div><div class='add'>+                volname = tasks[key].split(":")[1].ljust(</div><div class='add'>+                          longest_field + 5)</div><div class='add'>+                operation = "Snapshot Create".ljust(longest_field+5)</div><div class='add'>+                print(jobname+schedule+operation+volname)</div><div class='add'>+            ret = 0</div><div class='add'>+    else:</div><div class='add'>+        print_str = "Failed to list snapshot schedules. " \</div><div class='add'>+                    "Error: Failed to load tasks from "+GCRON_ENABLED</div><div class='add'>+        log.error(print_str)</div><div class='add'>+        output(print_str)</div><div class='add'>+</div><div class='add'>+    return ret</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def write_tasks_to_file():</div><div class='add'>+    try:</div><div class='add'>+        with open(TMP_FILE, "w", 0o644) as f:</div><div class='add'>+            # If tasks is empty, just create an empty tmp file</div><div class='add'>+            if len(tasks) != 0:</div><div class='add'>+                for key in sorted(tasks):</div><div class='add'>+                    jobname = key</div><div class='add'>+                    schedule = tasks[key].split(":")[0]</div><div class='add'>+                    volname = tasks[key].split(":")[1]</div><div class='add'>+                    f.write("%s root PATH=$PATH:/usr/local/sbin:/usr/sbin "</div><div class='add'>+                            "gcron.py %s %s\n" % (schedule, volname, jobname))</div><div class='add'>+                f.write("\n")</div><div class='add'>+                f.flush()</div><div class='add'>+                os.fsync(f.fileno())</div><div class='add'>+            f.close()</div><div class='add'>+    except IOError as e:</div><div class='add'>+        log.error("Failed to open %s. Error: %s.", TMP_FILE, e)</div><div class='add'>+        ret = INTERNAL_ERROR</div><div class='add'>+        return ret</div><div class='add'>+</div><div class='add'>+    shutil.move(TMP_FILE, GCRON_ENABLED)</div><div class='add'>+    ret = 0</div><div class='add'>+</div><div class='add'>+    return ret</div><div class='add'>+</div><div class='add'>+def update_current_scheduler(data):</div><div class='add'>+    try:</div><div class='add'>+        with open(TMP_FILE, "w", 0o644) as f:</div><div class='add'>+            f.write("%s" % data)</div><div class='add'>+            f.flush()</div><div class='add'>+            os.fsync(f.fileno())</div><div class='add'>+            f.close()</div><div class='add'>+    except IOError as e:</div><div class='add'>+        log.error("Failed to open %s. Error: %s.", TMP_FILE, e)</div><div class='add'>+        ret = INTERNAL_ERROR</div><div class='add'>+        return ret</div><div class='add'>+</div><div class='add'>+    shutil.move(TMP_FILE, CURRENT_SCHEDULER)</div><div class='add'>+    ret = 0</div><div class='add'>+</div><div class='add'>+    return ret</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def isVolumePresent(volname):</div><div class='add'>+    success = False</div><div class='add'>+    if volname == "":</div><div class='add'>+        log.debug("No volname given")</div><div class='add'>+        return success</div><div class='add'>+</div><div class='add'>+    cli = ["gluster",</div><div class='add'>+           "volume",</div><div class='add'>+           "info",</div><div class='add'>+           volname]</div><div class='add'>+    log.debug("Running command '%s'", " ".join(cli))</div><div class='add'>+</div><div class='add'>+    p = subprocess.Popen(cli, stdout=subprocess.PIPE,</div><div class='add'>+                         stderr=subprocess.PIPE)</div><div class='add'>+    out, err = p.communicate()</div><div class='add'>+    rv = p.returncode</div><div class='add'>+</div><div class='add'>+    log.debug("Command '%s' returned '%d'", " ".join(cli), rv)</div><div class='add'>+</div><div class='add'>+    if rv:</div><div class='add'>+        log.error("Command output:")</div><div class='add'>+        log.error(err)</div><div class='add'>+    else:</div><div class='add'>+        success = True;</div><div class='add'>+</div><div class='add'>+    return success</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def add_schedules(jobname, schedule, volname):</div><div class='add'>+    log.info("Adding snapshot schedules.")</div><div class='add'>+    ret = load_tasks_from_file()</div><div class='add'>+    if ret == 0:</div><div class='add'>+        if jobname in tasks:</div><div class='add'>+            print_str = ("%s already exists in schedule. Use "</div><div class='add'>+                         "'edit' to modify %s" % (jobname, jobname))</div><div class='add'>+            log.error(print_str)</div><div class='add'>+            output(print_str)</div><div class='add'>+            ret = JOB_ALREADY_EXISTS</div><div class='add'>+        else:</div><div class='add'>+            if not isVolumePresent(volname):</div><div class='add'>+                print_str = ("Volume %s does not exist. Create %s and retry." %</div><div class='add'>+                             (volname, volname))</div><div class='add'>+                log.error(print_str)</div><div class='add'>+                output(print_str)</div><div class='add'>+                ret = VOLUME_DOES_NOT_EXIST</div><div class='add'>+            else:</div><div class='add'>+                tasks[jobname] = schedule + ":" + volname</div><div class='add'>+                ret = write_tasks_to_file()</div><div class='add'>+                if ret == 0:</div><div class='add'>+                    # Create a LOCK_FILE for the job</div><div class='add'>+                    job_lockfile = LOCK_FILE_DIR + jobname</div><div class='add'>+                    try:</div><div class='add'>+                        f = os.open(job_lockfile, os.O_CREAT | os.O_NONBLOCK,</div><div class='add'>+                                    0o644)</div><div class='add'>+                        os.close(f)</div><div class='add'>+                    except OSError as e:</div><div class='add'>+                        log.error("Failed to open %s. Error: %s.",</div><div class='add'>+                                  job_lockfile, e)</div><div class='add'>+                        ret = INTERNAL_ERROR</div><div class='add'>+                        return ret</div><div class='add'>+                    log.info("Successfully added snapshot schedule %s" %</div><div class='add'>+                             jobname)</div><div class='add'>+                    output("Successfully added snapshot schedule")</div><div class='add'>+                    ret = 0</div><div class='add'>+    else:</div><div class='add'>+        print_str = "Failed to add snapshot schedule. " \</div><div class='add'>+                    "Error: Failed to load tasks from "+GCRON_ENABLED</div><div class='add'>+        log.error(print_str)</div><div class='add'>+        output(print_str)</div><div class='add'>+</div><div class='add'>+    return ret</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def delete_schedules(jobname):</div><div class='add'>+    log.info("Delete snapshot schedules.")</div><div class='add'>+    ret = load_tasks_from_file()</div><div class='add'>+    if ret == 0:</div><div class='add'>+        if jobname in tasks:</div><div class='add'>+            del tasks[jobname]</div><div class='add'>+            ret = write_tasks_to_file()</div><div class='add'>+            if ret == 0:</div><div class='add'>+                # Delete the LOCK_FILE for the job</div><div class='add'>+                job_lockfile = LOCK_FILE_DIR+jobname</div><div class='add'>+                try:</div><div class='add'>+                    os.remove(job_lockfile)</div><div class='add'>+                except OSError as e:</div><div class='add'>+                    log.error("Failed to open %s. Error: %s.",</div><div class='add'>+                              job_lockfile, e)</div><div class='add'>+                    ret = INTERNAL_ERROR</div><div class='add'>+                    return ret</div><div class='add'>+                log.info("Successfully deleted snapshot schedule %s"</div><div class='add'>+                         % jobname)</div><div class='add'>+                output("Successfully deleted snapshot schedule")</div><div class='add'>+                ret = 0</div><div class='add'>+        else:</div><div class='add'>+            print_str = ("Failed to delete %s. Error: No such "</div><div class='add'>+                         "job scheduled" % jobname)</div><div class='add'>+            log.error(print_str)</div><div class='add'>+            output(print_str)</div><div class='add'>+            ret = JOB_NOT_FOUND</div><div class='add'>+    else:</div><div class='add'>+        print_str = "Failed to delete snapshot schedule. " \</div><div class='add'>+                    "Error: Failed to load tasks from "+GCRON_ENABLED</div><div class='add'>+        log.error(print_str)</div><div class='add'>+        output(print_str)</div><div class='add'>+</div><div class='add'>+    return ret</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def edit_schedules(jobname, schedule, volname):</div><div class='add'>+    log.info("Editing snapshot schedules.")</div><div class='add'>+    ret = load_tasks_from_file()</div><div class='add'>+    if ret == 0:</div><div class='add'>+        if jobname in tasks:</div><div class='add'>+            if not isVolumePresent(volname):</div><div class='add'>+                print_str = ("Volume %s does not exist. Create %s and retry." %</div><div class='add'>+                             (volname, volname))</div><div class='add'>+                log.error(print_str)</div><div class='add'>+                output(print_str)</div><div class='add'>+                ret = VOLUME_DOES_NOT_EXIST</div><div class='add'>+            else:</div><div class='add'>+                tasks[jobname] = schedule+":"+volname</div><div class='add'>+                ret = write_tasks_to_file()</div><div class='add'>+                if ret == 0:</div><div class='add'>+                    log.info("Successfully edited snapshot schedule %s" %</div><div class='add'>+                             jobname)</div><div class='add'>+                    output("Successfully edited snapshot schedule")</div><div class='add'>+        else:</div><div class='add'>+            print_str = ("Failed to edit %s. Error: No such "</div><div class='add'>+                         "job scheduled" % jobname)</div><div class='add'>+            log.error(print_str)</div><div class='add'>+            output(print_str)</div><div class='add'>+            ret = JOB_NOT_FOUND</div><div class='add'>+    else:</div><div class='add'>+        print_str = "Failed to edit snapshot schedule. " \</div><div class='add'>+                    "Error: Failed to load tasks from "+GCRON_ENABLED</div><div class='add'>+        log.error(print_str)</div><div class='add'>+        output(print_str)</div><div class='add'>+</div><div class='add'>+    return ret</div><div class='add'>+</div><div class='add'>+def get_bool_val():</div><div class='add'>+    getsebool_cli = ["getsebool",</div><div class='add'>+                     "-a"]</div><div class='add'>+    p1 = subprocess.Popen(getsebool_cli, stdout=subprocess.PIPE,</div><div class='add'>+                          stderr=subprocess.PIPE)</div><div class='add'>+</div><div class='add'>+    grep_cmd = ["grep",</div><div class='add'>+                "cron_system_cronjob_use_shares"]</div><div class='add'>+    p2 = subprocess.Popen(grep_cmd, stdin=p1.stdout,</div><div class='add'>+                          stdout=subprocess.PIPE,</div><div class='add'>+                          stderr=subprocess.PIPE)</div><div class='add'>+</div><div class='add'>+    p1.stdout.close()</div><div class='add'>+    output, err = p2.communicate()</div><div class='add'>+    rv = p2.returncode</div><div class='add'>+</div><div class='add'>+    if rv:</div><div class='add'>+        log.error("Command output:")</div><div class='add'>+        log.error(err)</div><div class='add'>+        return -1</div><div class='add'>+</div><div class='add'>+    bool_val = output.split()[2]</div><div class='add'>+    log.debug("Bool value = '%s'", bool_val)</div><div class='add'>+</div><div class='add'>+    return bool_val</div><div class='add'>+</div><div class='add'>+def get_selinux_status():</div><div class='add'>+    getenforce_cli = ["getenforce"]</div><div class='add'>+    log.debug("Running command '%s'", " ".join(getenforce_cli))</div><div class='add'>+</div><div class='add'>+    try:</div><div class='add'>+        p1 = subprocess.Popen(getenforce_cli, stdout=subprocess.PIPE,</div><div class='add'>+                              stderr=subprocess.PIPE)</div><div class='add'>+    except OSError as oserr:</div><div class='add'>+        log.error("Failed to run the command \"getenforce\". Error: %s" %\</div><div class='add'>+                  oserr)</div><div class='add'>+        return -1</div><div class='add'>+</div><div class='add'>+    output, err = p1.communicate()</div><div class='add'>+    rv = p1.returncode</div><div class='add'>+</div><div class='add'>+    if rv:</div><div class='add'>+        log.error("Command output:")</div><div class='add'>+        log.error(err)</div><div class='add'>+        return -1</div><div class='add'>+    else:</div><div class='add'>+        selinux_status=output.rstrip()</div><div class='add'>+        log.debug("selinux status: %s", selinux_status)</div><div class='add'>+</div><div class='add'>+    return selinux_status</div><div class='add'>+</div><div class='add'>+def set_cronjob_user_share():</div><div class='add'>+    selinux_status = get_selinux_status()</div><div class='add'>+    if (selinux_status == -1):</div><div class='add'>+        log.error("Failed to get selinux status")</div><div class='add'>+        return -1</div><div class='add'>+    elif (selinux_status == "Disabled"):</div><div class='add'>+        return 0</div><div class='add'>+</div><div class='add'>+    bool_val = get_bool_val()</div><div class='add'>+    # In case of a failure (where the boolean value is not)</div><div class='add'>+    # present in the system, we should not proceed further</div><div class='add'>+    # We should only proceed when the value is "off"</div><div class='add'>+    if (bool_val == -1 or bool_val != "off"):</div><div class='add'>+        return 0</div><div class='add'>+</div><div class='add'>+    setsebool_cli = ["setsebool", "-P",</div><div class='add'>+                     "cron_system_cronjob_use_shares",</div><div class='add'>+                     "on"]</div><div class='add'>+    log.debug("Running command '%s'", " ".join(setsebool_cli))</div><div class='add'>+</div><div class='add'>+    p1 = subprocess.Popen(setsebool_cli, stdout=subprocess.PIPE,</div><div class='add'>+                          stderr=subprocess.PIPE)</div><div class='add'>+</div><div class='add'>+    output, err = p1.communicate()</div><div class='add'>+    rv = p1.returncode</div><div class='add'>+</div><div class='add'>+    if rv:</div><div class='add'>+        log.error("Command output:")</div><div class='add'>+        log.error(err)</div><div class='add'>+        return rv</div><div class='add'>+</div><div class='add'>+    bool_val = get_bool_val()</div><div class='add'>+    if (bool_val == "on"):</div><div class='add'>+        return 0</div><div class='add'>+    else:</div><div class='add'>+        # In case of an error or if boolean is not on</div><div class='add'>+        # we return a failure here</div><div class='add'>+        return -1</div><div class='add'>+</div><div class='add'>+def initialise_scheduler():</div><div class='add'>+    ret = set_cronjob_user_share()</div><div class='add'>+    if ret:</div><div class='add'>+        log.error("Failed to set selinux boolean "</div><div class='add'>+                  "cron_system_cronjob_use_shares to 'on'")</div><div class='add'>+        return ret</div><div class='add'>+</div><div class='add'>+    try:</div><div class='add'>+        with open(TMP_FILE, "w+", 0o644) as f:</div><div class='add'>+            updater = ("* * * * * root PATH=$PATH:/usr/local/sbin:"</div><div class='add'>+                       "/usr/sbin gcron.py --update\n")</div><div class='add'>+            f.write("%s\n" % updater)</div><div class='add'>+            f.flush()</div><div class='add'>+            os.fsync(f.fileno())</div><div class='add'>+            f.close()</div><div class='add'>+    except IOError as e:</div><div class='add'>+        log.error("Failed to open %s. Error: %s.", TMP_FILE, e)</div><div class='add'>+        ret = INIT_FAILED</div><div class='add'>+        return ret</div><div class='add'>+</div><div class='add'>+    shutil.move(TMP_FILE, GCRON_UPDATE_TASK)</div><div class='add'>+</div><div class='add'>+    if not os.path.lexists(GCRON_TASKS):</div><div class='add'>+        try:</div><div class='add'>+            f = open(GCRON_TASKS, "w", 0o644)</div><div class='add'>+            f.close()</div><div class='add'>+        except IOError as e:</div><div class='add'>+            log.error("Failed to open %s. Error: %s.", GCRON_TASKS, e)</div><div class='add'>+            ret = INIT_FAILED</div><div class='add'>+            return ret</div><div class='add'>+</div><div class='add'>+    if os.path.lexists(GCRON_CROND_TASK):</div><div class='add'>+        os.remove(GCRON_CROND_TASK)</div><div class='add'>+</div><div class='add'>+    os.symlink(GCRON_TASKS, GCRON_CROND_TASK)</div><div class='add'>+</div><div class='add'>+    log.info("Successfully initialised snapshot scheduler for this node")</div><div class='add'>+    output("Successfully initialised snapshot scheduler for this node")</div><div class='add'>+    gf_event (EVENT_SNAPSHOT_SCHEDULER_INITIALISED, status="Success")</div><div class='add'>+</div><div class='add'>+    ret = 0</div><div class='add'>+    return ret</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def syntax_checker(args):</div><div class='add'>+    if hasattr(args, 'jobname'):</div><div class='add'>+        if (len(args.jobname.split()) != 1):</div><div class='add'>+            output("Invalid Jobname. Jobname should not be empty and should not contain \" \" character.")</div><div class='add'>+            ret = INVALID_JOBNAME</div><div class='add'>+            return ret</div><div class='add'>+        args.jobname=args.jobname.strip()</div><div class='add'>+</div><div class='add'>+    if hasattr(args, 'volname'):</div><div class='add'>+        if (len(args.volname.split()) != 1):</div><div class='add'>+            output("Invalid Volname. Volname should not be empty and should not contain \" \" character.")</div><div class='add'>+            ret = INVALID_VOLNAME</div><div class='add'>+            return ret</div><div class='add'>+        args.volname=args.volname.strip()</div><div class='add'>+</div><div class='add'>+    if hasattr(args, 'schedule'):</div><div class='add'>+        if (len(args.schedule.split()) != 5):</div><div class='add'>+            output("Invalid Schedule. Please refer to the following for adding a valid cron schedule")</div><div class='add'>+            print ("* * * * *")</div><div class='add'>+            print ("| | | | |")</div><div class='add'>+            print ("| | | | +---- Day of the Week   (range: 1-7, 1 standing for Monday)")</div><div class='add'>+            print ("| | | +------ Month of the Year (range: 1-12)")</div><div class='add'>+            print ("| | +-------- Day of the Month  (range: 1-31)")</div><div class='add'>+            print ("| +---------- Hour              (range: 0-23)")</div><div class='add'>+            print ("+------------ Minute            (range: 0-59)")</div><div class='add'>+            ret = INVALID_SCHEDULE</div><div class='add'>+            return ret</div><div class='add'>+</div><div class='add'>+    ret = 0</div><div class='add'>+    return ret</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def perform_operation(args):</div><div class='add'>+    if not os.path.exists(CURRENT_SCHEDULER):</div><div class='add'>+        update_current_scheduler("none")</div><div class='add'>+</div><div class='add'>+    # Initialise snapshot scheduler on local node</div><div class='add'>+    if args.action == "init":</div><div class='add'>+        ret = initialise_scheduler()</div><div class='add'>+        if ret != 0:</div><div class='add'>+            output("Failed to initialise snapshot scheduling")</div><div class='add'>+            gf_event (EVENT_SNAPSHOT_SCHEDULER_INIT_FAILED,</div><div class='add'>+                      error=print_error(ret))</div><div class='add'>+        return ret</div><div class='add'>+</div><div class='add'>+    # Disable snapshot scheduler</div><div class='add'>+    if args.action == "disable_force":</div><div class='add'>+        ret = disable_scheduler()</div><div class='add'>+        if ret == 0:</div><div class='add'>+            subprocess.Popen(["touch", "-h", GCRON_TASKS])</div><div class='add'>+            gf_event (EVENT_SNAPSHOT_SCHEDULER_DISABLED,</div><div class='add'>+                      status="Successfully Disabled")</div><div class='add'>+        else:</div><div class='add'>+            gf_event (EVENT_SNAPSHOT_SCHEDULER_DISABLE_FAILED,</div><div class='add'>+                      error=print_error(ret))</div><div class='add'>+        return ret</div><div class='add'>+</div><div class='add'>+    # Check if the symlink to GCRON_TASKS is properly set in the shared storage</div><div class='add'>+    if (not os.path.lexists(GCRON_UPDATE_TASK) or</div><div class='add'>+        not os.path.lexists(GCRON_CROND_TASK) or</div><div class='add'>+        os.readlink(GCRON_CROND_TASK) != GCRON_TASKS):</div><div class='add'>+        print_str = ("Please run 'snap_scheduler.py' init to initialise "</div><div class='add'>+                     "the snap scheduler for the local node.")</div><div class='add'>+        log.error(print_str)</div><div class='add'>+        output(print_str)</div><div class='add'>+        ret = NODE_NOT_INITIALISED</div><div class='add'>+        return ret</div><div class='add'>+</div><div class='add'>+    # Check status of snapshot scheduler.</div><div class='add'>+    if args.action == "status":</div><div class='add'>+        ret = scheduler_status()</div><div class='add'>+        if ret == 0:</div><div class='add'>+            if scheduler_enabled:</div><div class='add'>+                output("Snapshot scheduling status: Enabled")</div><div class='add'>+            else:</div><div class='add'>+                output("Snapshot scheduling status: Disabled")</div><div class='add'>+        else:</div><div class='add'>+            output("Failed to check status of snapshot scheduler")</div><div class='add'>+        return ret</div><div class='add'>+</div><div class='add'>+    # Enable snapshot scheduler</div><div class='add'>+    if args.action == "enable":</div><div class='add'>+        ret = enable_scheduler()</div><div class='add'>+        if ret == 0:</div><div class='add'>+            subprocess.Popen(["touch", "-h", GCRON_TASKS])</div><div class='add'>+            gf_event (EVENT_SNAPSHOT_SCHEDULER_ENABLED,</div><div class='add'>+                      status="Successfully Enabled")</div><div class='add'>+        else:</div><div class='add'>+            gf_event (EVENT_SNAPSHOT_SCHEDULER_ENABLE_FAILED,</div><div class='add'>+                      error=print_error(ret))</div><div class='add'>+        return ret</div><div class='add'>+</div><div class='add'>+    # Disable snapshot scheduler</div><div class='add'>+    if args.action == "disable":</div><div class='add'>+        ret = disable_scheduler()</div><div class='add'>+        if ret == 0:</div><div class='add'>+            subprocess.Popen(["touch", "-h", GCRON_TASKS])</div><div class='add'>+            gf_event (EVENT_SNAPSHOT_SCHEDULER_DISABLED,</div><div class='add'>+                      status="Successfully Disabled")</div><div class='add'>+        else:</div><div class='add'>+            gf_event (EVENT_SNAPSHOT_SCHEDULER_DISABLE_FAILED,</div><div class='add'>+                      error=print_error(ret))</div><div class='add'>+        return ret</div><div class='add'>+</div><div class='add'>+    # List snapshot schedules</div><div class='add'>+    if args.action == "list":</div><div class='add'>+        ret = list_schedules()</div><div class='add'>+        return ret</div><div class='add'>+</div><div class='add'>+    # Add snapshot schedules</div><div class='add'>+    if args.action == "add":</div><div class='add'>+        ret = syntax_checker(args)</div><div class='add'>+        if ret != 0:</div><div class='add'>+            return ret</div><div class='add'>+        ret = add_schedules(args.jobname, args.schedule, args.volname)</div><div class='add'>+        if ret == 0:</div><div class='add'>+            subprocess.Popen(["touch", "-h", GCRON_TASKS])</div><div class='add'>+            gf_event (EVENT_SNAPSHOT_SCHEDULER_SCHEDULE_ADDED,</div><div class='add'>+                      status="Successfully added job "+args.jobname)</div><div class='add'>+        else:</div><div class='add'>+            gf_event (EVENT_SNAPSHOT_SCHEDULER_SCHEDULE_ADD_FAILED,</div><div class='add'>+                      status="Failed to add job "+args.jobname,</div><div class='add'>+                      error=print_error(ret))</div><div class='add'>+        return ret</div><div class='add'>+</div><div class='add'>+    # Delete snapshot schedules</div><div class='add'>+    if args.action == "delete":</div><div class='add'>+        ret = syntax_checker(args)</div><div class='add'>+        if ret != 0:</div><div class='add'>+            return ret</div><div class='add'>+        ret = delete_schedules(args.jobname)</div><div class='add'>+        if ret == 0:</div><div class='add'>+            subprocess.Popen(["touch", "-h", GCRON_TASKS])</div><div class='add'>+            gf_event (EVENT_SNAPSHOT_SCHEDULER_SCHEDULE_DELETED,</div><div class='add'>+                      status="Successfully deleted job "+args.jobname)</div><div class='add'>+        else:</div><div class='add'>+            gf_event (EVENT_SNAPSHOT_SCHEDULER_SCHEDULE_DELETE_FAILED,</div><div class='add'>+                      status="Failed to delete job "+args.jobname,</div><div class='add'>+                      error=print_error(ret))</div><div class='add'>+        return ret</div><div class='add'>+</div><div class='add'>+    # Edit snapshot schedules</div><div class='add'>+    if args.action == "edit":</div><div class='add'>+        ret = syntax_checker(args)</div><div class='add'>+        if ret != 0:</div><div class='add'>+            return ret</div><div class='add'>+        ret = edit_schedules(args.jobname, args.schedule, args.volname)</div><div class='add'>+        if ret == 0:</div><div class='add'>+            subprocess.Popen(["touch", "-h", GCRON_TASKS])</div><div class='add'>+            gf_event (EVENT_SNAPSHOT_SCHEDULER_SCHEDULE_EDITED,</div><div class='add'>+                      status="Successfully edited job "+args.jobname)</div><div class='add'>+        else:</div><div class='add'>+            gf_event (EVENT_SNAPSHOT_SCHEDULER_SCHEDULE_EDIT_FAILED,</div><div class='add'>+                      status="Failed to edit job "+args.jobname,</div><div class='add'>+                      error=print_error(ret))</div><div class='add'>+        return ret</div><div class='add'>+</div><div class='add'>+    ret = INVALID_ARG</div><div class='add'>+    return ret</div><div class='add'>+</div><div class='add'>+def gf_event(event_type, **kwargs):</div><div class='add'>+    if EVENTS_ENABLED:</div><div class='add'>+        from events.gf_event import gf_event as gfevent</div><div class='add'>+        gfevent(event_type, **kwargs)</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def main(argv):</div><div class='add'>+    initLogger()</div><div class='add'>+    ret = -1</div><div class='add'>+    parser = argparse.ArgumentParser()</div><div class='add'>+    subparsers = parser.add_subparsers(dest="action",</div><div class='add'>+                                       metavar=('{init, status, enable,'</div><div class='add'>+                                               ' disable, list, add,'</div><div class='add'>+                                               ' delete, edit}'))</div><div class='add'>+    subparsers.add_parser('init',</div><div class='add'>+                          help="Initialise the node for snapshot scheduling")</div><div class='add'>+</div><div class='add'>+    subparsers.add_parser("status",</div><div class='add'>+                          help="Check if snapshot scheduling is "</div><div class='add'>+                          "enabled or disabled")</div><div class='add'>+    subparsers.add_parser("enable",</div><div class='add'>+                          help="Enable snapshot scheduling")</div><div class='add'>+    subparsers.add_parser("disable",</div><div class='add'>+                          help="Disable snapshot scheduling")</div><div class='add'>+    subparsers.add_parser("disable_force")</div><div class='add'>+    subparsers.add_parser("list",</div><div class='add'>+                          help="List snapshot schedules")</div><div class='add'>+    parser_add = subparsers.add_parser("add",</div><div class='add'>+                                       help="Add snapshot schedules")</div><div class='add'>+    parser_add.add_argument("jobname", help="Job Name")</div><div class='add'>+    parser_add.add_argument("schedule", help="Schedule")</div><div class='add'>+    parser_add.add_argument("volname", help="Volume Name")</div><div class='add'>+</div><div class='add'>+    parser_delete = subparsers.add_parser("delete",</div><div class='add'>+                                          help="Delete snapshot schedules")</div><div class='add'>+    parser_delete.add_argument("jobname", help="Job Name")</div><div class='add'>+    parser_edit = subparsers.add_parser("edit",</div><div class='add'>+                                        help="Edit snapshot schedules")</div><div class='add'>+    parser_edit.add_argument("jobname", help="Job Name")</div><div class='add'>+    parser_edit.add_argument("schedule", help="Schedule")</div><div class='add'>+    parser_edit.add_argument("volname", help="Volume Name")</div><div class='add'>+</div><div class='add'>+    args = parser.parse_args(argv)</div><div class='add'>+</div><div class='add'>+    if not os.path.exists(SHARED_STORAGE_DIR):</div><div class='add'>+        output("Failed: "+SHARED_STORAGE_DIR+" does not exist.")</div><div class='add'>+        return SHARED_STORAGE_DIR_DOESNT_EXIST</div><div class='add'>+</div><div class='add'>+    if not os.path.ismount(SHARED_STORAGE_DIR):</div><div class='add'>+        output("Failed: Shared storage is not mounted at "+SHARED_STORAGE_DIR)</div><div class='add'>+        return SHARED_STORAGE_NOT_MOUNTED</div><div class='add'>+</div><div class='add'>+    if not os.path.exists(SHARED_STORAGE_DIR+"/snaps/"):</div><div class='add'>+        try:</div><div class='add'>+            os.makedirs(SHARED_STORAGE_DIR+"/snaps/")</div><div class='add'>+        except OSError as e:</div><div class='add'>+            if errno != EEXIST:</div><div class='add'>+                log.error("Failed to create %s : %s", SHARED_STORAGE_DIR+"/snaps/", e)</div><div class='add'>+                output("Failed to create %s. Error: %s"</div><div class='add'>+                       % (SHARED_STORAGE_DIR+"/snaps/", e))</div><div class='add'>+                return INTERNAL_ERROR</div><div class='add'>+</div><div class='add'>+    if not os.path.exists(GCRON_ENABLED):</div><div class='add'>+        f = os.open(GCRON_ENABLED, os.O_CREAT | os.O_NONBLOCK, 0o644)</div><div class='add'>+        os.close(f)</div><div class='add'>+</div><div class='add'>+    if not os.path.exists(LOCK_FILE_DIR):</div><div class='add'>+        try:</div><div class='add'>+            os.makedirs(LOCK_FILE_DIR)</div><div class='add'>+        except OSError as e:</div><div class='add'>+            if errno != EEXIST:</div><div class='add'>+                log.error("Failed to create %s : %s", LOCK_FILE_DIR, e)</div><div class='add'>+                output("Failed to create %s. Error: %s"</div><div class='add'>+                       % (LOCK_FILE_DIR, e))</div><div class='add'>+                return INTERNAL_ERROR</div><div class='add'>+</div><div class='add'>+    try:</div><div class='add'>+        f = os.open(LOCK_FILE, os.O_CREAT | os.O_RDWR | os.O_NONBLOCK, 0o644)</div><div class='add'>+        try:</div><div class='add'>+            fcntl.flock(f, fcntl.LOCK_EX | fcntl.LOCK_NB)</div><div class='add'>+            ret = perform_operation(args)</div><div class='add'>+            fcntl.flock(f, fcntl.LOCK_UN)</div><div class='add'>+        except IOError:</div><div class='add'>+            log.info("%s is being processed by another agent.", LOCK_FILE)</div><div class='add'>+            output("Another snap_scheduler command is running. "</div><div class='add'>+                   "Please try again after some time.")</div><div class='add'>+            return ANOTHER_TRANSACTION_IN_PROGRESS</div><div class='add'>+        os.close(f)</div><div class='add'>+    except OSError as e:</div><div class='add'>+        log.error("Failed to open %s : %s", LOCK_FILE, e)</div><div class='add'>+        output("Failed to open %s. Error: %s" % (LOCK_FILE, e))</div><div class='add'>+        return INTERNAL_ERROR</div><div class='add'>+</div><div class='add'>+    return ret</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+if __name__ == "__main__":</div><div class='add'>+    sys.exit(main(sys.argv[1:]))</div><div class='head'>diff --git a/extras/specgen.scm b/extras/specgen.scm<br/>index b188d88a597..0edbb6f6280 100755<br/>--- a/<a href='/cgit/glusterfs.git/tree/extras/specgen.scm?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/specgen.scm</a><br/>+++ b/<a href='/cgit/glusterfs.git/tree/extras/specgen.scm?id=d1d7a6f35c816822fab51c820e25023863c239c1'>extras/specgen.scm</a></div><div class='hunk'>@@ -1,7 +1,7 @@</div><div class='ctx'> #!/usr/bin/guile -s</div><div class='ctx'> !#</div><div class='ctx'> </div><div class='del'>-;;; Copyright (C) 2007-2009 Gluster Inc. &lt;http://www.gluster.com&gt;</div><div class='add'>+;;; Copyright (c) 2007-2011 Gluster Inc. &lt;http://www.gluster.com&gt;</div><div class='ctx'> ;;;  </div><div class='ctx'> ;;; This program is free software; you can redistribute it and/or modify</div><div class='ctx'> ;;; it under the terms of the GNU General Public License as published by</div><div class='head'>diff --git a/extras/statedumpparse.rb b/extras/statedumpparse.rb<br/>new file mode 100755<br/>index 00000000000..1aff43377db<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/extras/statedumpparse.rb?id=d1d7a6f35c816822fab51c820e25023863c239c1'>extras/statedumpparse.rb</a></div><div class='hunk'>@@ -0,0 +1,208 @@</div><div class='add'>+#!/usr/bin/env ruby</div><div class='add'>+</div><div class='add'>+require 'time'</div><div class='add'>+require 'optparse'</div><div class='add'>+</div><div class='add'>+unless Array.instance_methods.include? :to_h</div><div class='add'>+  class Array</div><div class='add'>+    def to_h</div><div class='add'>+      h = {}</div><div class='add'>+      each { |k,v| h[k]=v }</div><div class='add'>+      h</div><div class='add'>+    end</div><div class='add'>+  end</div><div class='add'>+end</div><div class='add'>+</div><div class='add'>+# statedump.c:gf_proc_dump_mempool_info uses a five-dash record separator,</div><div class='add'>+# client.c:client_fd_lk_ctx_dump uses a six-dash record separator.</div><div class='add'>+ARRSEP = /^(-{5,6}=-{5,6})?$/</div><div class='add'>+HEAD = /^\[(.*)\]$/</div><div class='add'>+INPUT_FORMATS = %w[statedump json]</div><div class='add'>+</div><div class='add'>+format = 'json'</div><div class='add'>+input_format = 'statedump'</div><div class='add'>+tz = '+0000'</div><div class='add'>+memstat_select,memstat_reject = //,/\Z./</div><div class='add'>+OptionParser.new do |op|</div><div class='add'>+  op.banner &lt;&lt; " [&lt;] &lt;STATEDUMP&gt;"</div><div class='add'>+  op.on("-f", "--format=F", "json/yaml/memstat(-[plain|human|json])") { |s| format = s }</div><div class='add'>+  op.on("--input-format=F", INPUT_FORMATS.join(?/)) { |s| input_format = s }</div><div class='add'>+  op.on("--timezone=T",</div><div class='add'>+        "time zone to apply to zoneless timestamps [default UTC]") { |s| tz = s }</div><div class='add'>+  op.on("--memstat-select=RX", "memstat: select memory types matching RX") { |s|</div><div class='add'>+    memstat_select = Regexp.new s</div><div class='add'>+  }</div><div class='add'>+  op.on("--memstat-reject=RX", "memstat: reject memory types matching RX") { |s|</div><div class='add'>+    memstat_reject = Regexp.new s</div><div class='add'>+  }</div><div class='add'>+end.parse!</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+if format =~ /\Amemstat(?:-(.*))?/</div><div class='add'>+  memstat_type = $1 || 'plain'</div><div class='add'>+  unless %w[plain human json].include? memstat_type</div><div class='add'>+    raise "unknown memstat type #{memstat_type.dump}"</div><div class='add'>+  end</div><div class='add'>+  format = 'memstat'</div><div class='add'>+end</div><div class='add'>+</div><div class='add'>+repr, logsep = case format</div><div class='add'>+when 'yaml'</div><div class='add'>+  require 'yaml'</div><div class='add'>+</div><div class='add'>+  [proc { |e| e.to_yaml }, "\n"]</div><div class='add'>+when 'json', 'memstat'</div><div class='add'>+  require 'json'</div><div class='add'>+</div><div class='add'>+  [proc { |e| e.to_json }, " "]</div><div class='add'>+else</div><div class='add'>+  raise "unkonwn format '#{format}'"</div><div class='add'>+end</div><div class='add'>+formatter = proc { |e| puts repr.call(e) }</div><div class='add'>+</div><div class='add'>+INPUT_FORMATS.include? input_format or raise "unkwown input format '#{input_format}'"</div><div class='add'>+</div><div class='add'>+dumpinfo = {}</div><div class='add'>+</div><div class='add'>+# parse a statedump entry</div><div class='add'>+elem_cbk = proc { |s,&amp;cbk|</div><div class='add'>+  arraylike = false</div><div class='add'>+  s.grep(/\S/).empty? and next</div><div class='add'>+  head = nil</div><div class='add'>+  while s.last =~ /^\s*$/</div><div class='add'>+    s.pop</div><div class='add'>+  end</div><div class='add'>+  body = catch { |misc2|</div><div class='add'>+    s[0] =~ HEAD ? (head = $1) : (throw misc2)</div><div class='add'>+    body = [[]]</div><div class='add'>+    s[1..-1].each { |l|</div><div class='add'>+      if l =~ ARRSEP</div><div class='add'>+        arraylike = true</div><div class='add'>+        body &lt;&lt; []</div><div class='add'>+        next</div><div class='add'>+      end</div><div class='add'>+      body.last &lt;&lt; l</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    body.reject(&amp;:empty?).map { |e|</div><div class='add'>+      ea = e.map { |l|</div><div class='add'>+        k,v = l.split("=",2)</div><div class='add'>+        m = /\A(0|-?[1-9]\d*)(\.\d+)?\Z/.match v</div><div class='add'>+        [k, m ? (m[2] ? Float(v) : Integer(v)) : v]</div><div class='add'>+      }</div><div class='add'>+      begin</div><div class='add'>+        ea.to_h</div><div class='add'>+      rescue</div><div class='add'>+        throw misc2</div><div class='add'>+      end</div><div class='add'>+    }</div><div class='add'>+  }</div><div class='add'>+</div><div class='add'>+  if body</div><div class='add'>+    cbk.call [head, arraylike ? body : (body.empty? ? {} : body[0])]</div><div class='add'>+  else</div><div class='add'>+    STDERR.puts ["WARNING: failed to parse record:", repr.call(s)].join(logsep)</div><div class='add'>+  end</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+# aggregator routine</div><div class='add'>+aggr = case format</div><div class='add'>+when 'memstat'</div><div class='add'>+  meminfo = {}</div><div class='add'>+  # commit memory-related entries to meminfo</div><div class='add'>+  proc { |k,r|</div><div class='add'>+    case k</div><div class='add'>+    when /memusage/</div><div class='add'>+      (meminfo["GF_MALLOC"]||={})[k] ||= r["size"] if k =~ memstat_select and k !~ memstat_reject</div><div class='add'>+    when "mempool"</div><div class='add'>+      r.each {|e|</div><div class='add'>+        kk = "mempool:#{e['pool-name']}"</div><div class='add'>+        (meminfo["mempool"]||={})[kk] ||= e["size"] if kk =~ memstat_select and kk !~ memstat_reject</div><div class='add'>+      }</div><div class='add'>+    end</div><div class='add'>+  }</div><div class='add'>+else</div><div class='add'>+  # just format data, don't actually aggregate anything</div><div class='add'>+  proc { |pair| formatter.call pair }</div><div class='add'>+end</div><div class='add'>+</div><div class='add'>+# processing the data</div><div class='add'>+case input_format</div><div class='add'>+when 'statedump'</div><div class='add'>+  acc = []</div><div class='add'>+  $&lt;.each { |l|</div><div class='add'>+    l = l.strip</div><div class='add'>+    if l =~ /^(DUMP-(?:START|END)-TIME):\s+(.*)/</div><div class='add'>+      dumpinfo["_meta"]||={}</div><div class='add'>+      (dumpinfo["_meta"]["date"]||={})[$1] = Time.parse([$2, tz].join " ")</div><div class='add'>+      next</div><div class='add'>+    end</div><div class='add'>+</div><div class='add'>+    if l =~ HEAD</div><div class='add'>+      elem_cbk.call(acc, &amp;aggr)</div><div class='add'>+      acc = [l]</div><div class='add'>+      next</div><div class='add'>+    end</div><div class='add'>+</div><div class='add'>+    acc &lt;&lt; l</div><div class='add'>+  }</div><div class='add'>+  elem_cbk.call(acc, &amp;aggr)</div><div class='add'>+when 'json'</div><div class='add'>+  $&lt;.each { |l|</div><div class='add'>+    r = JSON.load l</div><div class='add'>+    case r</div><div class='add'>+    when Array</div><div class='add'>+      aggr[r]</div><div class='add'>+    when Hash</div><div class='add'>+      dumpinfo.merge! r</div><div class='add'>+    end</div><div class='add'>+  }</div><div class='add'>+end</div><div class='add'>+</div><div class='add'>+# final actions: output aggregated data</div><div class='add'>+case format</div><div class='add'>+when 'memstat'</div><div class='add'>+  ma = meminfo.values.map(&amp;:to_a).inject(:+)</div><div class='add'>+  totals = meminfo.map { |coll,h| [coll, h.values.inject(:+)] }.to_h</div><div class='add'>+  tt = ma.transpose[1].inject(:+)</div><div class='add'>+</div><div class='add'>+  summary_sep,showm = case memstat_type</div><div class='add'>+  when 'json'</div><div class='add'>+    ["", proc { |k,v| puts({type: k, value: v}.to_json) }]</div><div class='add'>+  when 'plain', 'human'</div><div class='add'>+    # human-friendly number representation</div><div class='add'>+    hr = proc { |n|</div><div class='add'>+      qa = %w[B kB MB GB]</div><div class='add'>+      q = ((1...qa.size).find {|i| n &lt; (1 &lt;&lt; i*10)} || qa.size) - 1</div><div class='add'>+      "%.2f%s" % [n.to_f / (1 &lt;&lt; q*10), qa[q]]</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    templ = "%{val} %{key}"</div><div class='add'>+    tft = proc { |t| t }</div><div class='add'>+    nft = if memstat_type == 'human'</div><div class='add'>+      nw = [ma.transpose[1], totals.values, tt].flatten.map{|n| hr[n].size}.max</div><div class='add'>+      proc { |n|</div><div class='add'>+        hn = hr[n]</div><div class='add'>+        " " * (nw - hn.size) + hn</div><div class='add'>+      }</div><div class='add'>+    else</div><div class='add'>+      nw = tt.to_s.size</div><div class='add'>+      proc { |n| "%#{nw}d" % n }</div><div class='add'>+    end</div><div class='add'>+    ## Alternative template, key first:</div><div class='add'>+    # templ = "%{key} %{val}"</div><div class='add'>+    # tw = ma.transpose[0].map(&amp;:size).max</div><div class='add'>+    # tft = proc { |t| t + " " * [tw - t.size, 0].max }</div><div class='add'>+    # nft = (memstat_type == 'human') ? hr : proc { |n| n }</div><div class='add'>+    ["\n", proc { |k,v| puts templ % {key: tft[k], val: nft[v]} }]</div><div class='add'>+  else</div><div class='add'>+    raise 'this should be impossible'</div><div class='add'>+  end</div><div class='add'>+</div><div class='add'>+  ma.sort_by { |k,v| v }.each(&amp;showm)</div><div class='add'>+  print summary_sep</div><div class='add'>+  totals.each { |coll,t| showm.call "Total #{coll}", t }</div><div class='add'>+  showm.call "TOTAL", tt</div><div class='add'>+else</div><div class='add'>+  formatter.call dumpinfo</div><div class='add'>+end</div><div class='head'>diff --git a/extras/stop-all-gluster-processes.sh b/extras/stop-all-gluster-processes.sh<br/>new file mode 100755<br/>index 00000000000..710aaf5fd3c<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/extras/stop-all-gluster-processes.sh?id=d1d7a6f35c816822fab51c820e25023863c239c1'>extras/stop-all-gluster-processes.sh</a></div><div class='hunk'>@@ -0,0 +1,193 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+#</div><div class='add'>+# Kill all the processes/services except glusterd</div><div class='add'>+#</div><div class='add'>+# Usage: ./extras/stop-all-gluster-processes.sh [-g] [-h]</div><div class='add'>+#    options:</div><div class='add'>+#    -g  Terminate in graceful mode</div><div class='add'>+#    -h  Show this message, then exit</div><div class='add'>+#</div><div class='add'>+# eg:</div><div class='add'>+#  1. ./extras/stop-all-gluster-processes.sh</div><div class='add'>+#  2. ./extras/stop-all-gluster-processes.sh -g</div><div class='add'>+#</div><div class='add'>+# By default, this script executes in force mode, i.e. all of brick, gsyncd</div><div class='add'>+# and other glustershd services/processes are killed without checking for</div><div class='add'>+# ongoing tasks such as geo-rep, self-heal, rebalance and etc. which may lead</div><div class='add'>+# to inconsistency after the node is brought back.</div><div class='add'>+#</div><div class='add'>+# On specifying '-g' option this script works in graceful mode, to maintain</div><div class='add'>+# data consistency the script fails with a valid exit code incase if any of</div><div class='add'>+# the gluster processes are busy in doing their jobs.</div><div class='add'>+#</div><div class='add'>+# The author of page [1] proposes user-defined exit codes to the range 64 - 113</div><div class='add'>+# Find the better explanation behind the choice in the link</div><div class='add'>+#</div><div class='add'>+# The exit code returned by stop-all-gluster-processes.sh:</div><div class='add'>+#   0       No errors/Success</div><div class='add'>+#   64      Rebalance is in progress</div><div class='add'>+#   65      Self-Heal is in progress</div><div class='add'>+#   66      Tier daemon running on this node</div><div class='add'>+#   127     option not found</div><div class='add'>+#</div><div class='add'>+# [1] http://www.tldp.org/LDP/abs/html/exitcodes.html</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+# global</div><div class='add'>+errors=0</div><div class='add'>+</div><div class='add'>+# find the mounts and return their pids</div><div class='add'>+get_mount_pids()</div><div class='add'>+{</div><div class='add'>+    local opts</div><div class='add'>+    local pid</div><div class='add'>+</div><div class='add'>+    for opts in $(grep -w fuse.glusterfs /proc/mounts| awk '{print $1":/"$2}');</div><div class='add'>+    do</div><div class='add'>+        IFS=' ' read -r -a volinfo &lt;&lt;&lt; $(echo "${opts}" | sed 's/:\// /g')</div><div class='add'>+        pid+="$(ps -Ao pid,args | grep -w "volfile-server=${volinfo[0]}" |</div><div class='add'>+                grep -w "volfile-id=/${volinfo[1]}" | grep -w "${volinfo[2]}" |</div><div class='add'>+                awk '{print $1}') "</div><div class='add'>+    done</div><div class='add'>+    echo "${pid}"</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+# handle mount processes i.e. 'glusterfs'</div><div class='add'>+kill_mounts()</div><div class='add'>+{</div><div class='add'>+    local signal=${1}</div><div class='add'>+    local pid</div><div class='add'>+</div><div class='add'>+    for pid in $(get_mount_pids);</div><div class='add'>+    do</div><div class='add'>+        echo "sending SIG${signal} to mount process with pid: ${pid}";</div><div class='add'>+        kill -${signal} ${pid};</div><div class='add'>+    done</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+# handle brick processes and node services</div><div class='add'>+kill_bricks_and_services()</div><div class='add'>+{</div><div class='add'>+    local signal=${1}</div><div class='add'>+    local pidfile</div><div class='add'>+    local pid</div><div class='add'>+</div><div class='add'>+    for pidfile in $(find /var/run/gluster/ -name '*.pid');</div><div class='add'>+    do</div><div class='add'>+        local pid=$(cat ${pidfile});</div><div class='add'>+        echo "sending SIG${signal} to pid: ${pid}";</div><div class='add'>+        kill -${signal} ${pid};</div><div class='add'>+    done</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+# for geo-replication, only 'monitor' has pid file written, other</div><div class='add'>+# processes are not having a pid file, so get it through 'ps' and</div><div class='add'>+# handle these processes</div><div class='add'>+kill_georep_gsync()</div><div class='add'>+{</div><div class='add'>+    local signal=${1}</div><div class='add'>+</div><div class='add'>+    # FIXME: add strick/better check</div><div class='add'>+    local gsyncpid=$(ps -Ao pid,args | grep gluster | grep gsync |</div><div class='add'>+                     awk '{print $1}');</div><div class='add'>+    if [ -n "${gsyncpid}" ]</div><div class='add'>+    then</div><div class='add'>+        echo "sending SIG${signal} to geo-rep gsync process ${gsyncpid}";</div><div class='add'>+        kill -${signal} ${gsyncpid} || errors=$((${errors} + 1));</div><div class='add'>+    fi</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+# check if all processes are ready to die</div><div class='add'>+check_background_tasks()</div><div class='add'>+{</div><div class='add'>+    volumes=$(gluster vol list)</div><div class='add'>+    quit=0</div><div class='add'>+    for volname in ${volumes};</div><div class='add'>+    do</div><div class='add'>+        # tiering</div><div class='add'>+        if [[ $(gluster volume tier ${volname} status 2&gt; /dev/null |</div><div class='add'>+                grep "localhost" | grep -c "in progress") -gt 0 ]]</div><div class='add'>+        then</div><div class='add'>+            quit=66</div><div class='add'>+            break;</div><div class='add'>+        fi</div><div class='add'>+</div><div class='add'>+        # rebalance</div><div class='add'>+        if [[ $(gluster volume rebalance ${volname} status 2&gt; /dev/null |</div><div class='add'>+                grep -c "in progress") -gt 0 ]]</div><div class='add'>+        then</div><div class='add'>+            quit=64</div><div class='add'>+            break;</div><div class='add'>+        fi</div><div class='add'>+</div><div class='add'>+        # self heal</div><div class='add'>+        if [[ $(gluster volume heal ${volname} info | grep "Number of entries" |</div><div class='add'>+                awk '{ sum+=$4} END {print sum}') -gt 0 ]];</div><div class='add'>+        then</div><div class='add'>+            quit=65</div><div class='add'>+            break;</div><div class='add'>+        fi</div><div class='add'>+</div><div class='add'>+        # geo-rep, snapshot and quota doesn't need grace checks,</div><div class='add'>+        # as they ensures the consistancy on force kills</div><div class='add'>+    done</div><div class='add'>+</div><div class='add'>+    echo ${quit}</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+usage()</div><div class='add'>+{</div><div class='add'>+    cat &lt;&lt;EOM</div><div class='add'>+Usage: $0 [-g] [-h]</div><div class='add'>+    options:</div><div class='add'>+    -g  Terminate in graceful mode</div><div class='add'>+    -h  Show this message, then exit</div><div class='add'>+</div><div class='add'>+eg:</div><div class='add'>+ 1. $0</div><div class='add'>+ 2. $0 -g</div><div class='add'>+EOM</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+main()</div><div class='add'>+{</div><div class='add'>+    while getopts "gh" opt; do</div><div class='add'>+        case $opt in</div><div class='add'>+            g)</div><div class='add'>+                # graceful mode</div><div class='add'>+                quit=$(check_background_tasks)</div><div class='add'>+                if [[ ${quit} -ne 0 ]]</div><div class='add'>+                then</div><div class='add'>+                    exit ${quit};</div><div class='add'>+                fi</div><div class='add'>+                # else safe to kill</div><div class='add'>+                ;;</div><div class='add'>+            h)</div><div class='add'>+                usage</div><div class='add'>+                exit 0;</div><div class='add'>+                ;;</div><div class='add'>+            *)</div><div class='add'>+                usage</div><div class='add'>+                exit 127;</div><div class='add'>+                ;;</div><div class='add'>+        esac</div><div class='add'>+    done</div><div class='add'>+    # remove all the options that have been parsed by getopts</div><div class='add'>+    shift $((OPTIND-1))</div><div class='add'>+</div><div class='add'>+    kill_mounts TERM</div><div class='add'>+    kill_georep_gsync TERM</div><div class='add'>+    kill_bricks_and_services TERM</div><div class='add'>+</div><div class='add'>+    sleep 5;</div><div class='add'>+    echo ""</div><div class='add'>+</div><div class='add'>+    # still not Terminated? let's pass SIGKILL</div><div class='add'>+    kill_mounts KILL</div><div class='add'>+    kill_georep_gsync KILL</div><div class='add'>+    kill_bricks_and_services KILL</div><div class='add'>+</div><div class='add'>+    exit ${errors};</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+main "$@"</div><div class='head'>diff --git a/extras/stripe-merge.c b/extras/stripe-merge.c<br/>index 3f8e4b1244d..e013a6e6e8a 100644<br/>--- a/<a href='/cgit/glusterfs.git/tree/extras/stripe-merge.c?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/stripe-merge.c</a><br/>+++ b/<a href='/cgit/glusterfs.git/tree/extras/stripe-merge.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>extras/stripe-merge.c</a></div><div class='hunk'>@@ -1,48 +1,503 @@</div><div class='add'>+/*</div><div class='add'>+  Copyright (c) 2008-2012 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+ * stripe-merge.c</div><div class='add'>+ *</div><div class='add'>+ * This program recovers an original file based on the striped files stored on</div><div class='add'>+ * the individual bricks of a striped volume. The file format and stripe</div><div class='add'>+ * geometry is validated through the extended attributes stored in the file.</div><div class='add'>+ *</div><div class='add'>+ * TODO: Support optional xattr recovery (i.e., user xattrs). Perhaps provide a</div><div class='add'>+ * 	 command-line flag to toggle this behavior.</div><div class='add'>+ */</div><div class='add'>+</div><div class='ctx'> #include &lt;stdio.h&gt;</div><div class='del'>-#include &lt;unistd.h&gt;</div><div class='del'>-#include &lt;fcntl.h&gt;</div><div class='ctx'> #include &lt;sys/types.h&gt;</div><div class='ctx'> #include &lt;sys/stat.h&gt;</div><div class='add'>+#include &lt;fcntl.h&gt;</div><div class='add'>+#include &lt;unistd.h&gt;</div><div class='add'>+#include &lt;stdlib.h&gt;</div><div class='add'>+#include &lt;stdint.h&gt;</div><div class='add'>+#include &lt;errno.h&gt;</div><div class='add'>+#include &lt;string.h&gt;</div><div class='add'>+#include &lt;sys/xattr.h&gt;</div><div class='add'>+#include &lt;fnmatch.h&gt;</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-main (int argc, char *argv[])</div><div class='del'>-{</div><div class='del'>-	int fds[argc-1];</div><div class='del'>-	char buf[argc-1][4096];</div><div class='del'>-	int i;</div><div class='del'>-	int max_ret, ret;</div><div class='del'>-</div><div class='del'>-	if (argc &lt; 2) {</div><div class='del'>-		printf ("Usage: %s file1 file2 ... &gt;file\n", argv[0]);</div><div class='del'>-		return 1;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	for (i=0; i&lt;argc-1; i++) {</div><div class='del'>-		fds[i] = open (argv[i+1], O_RDONLY);</div><div class='del'>-		if (fds[i] == -1) {</div><div class='del'>-			perror (argv[i+1]);</div><div class='del'>-			return 1;</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	max_ret = 0;</div><div class='del'>-	do {</div><div class='del'>-		char newbuf[4096] = {0, };</div><div class='del'>-		int j;</div><div class='del'>-</div><div class='del'>-		max_ret = 0;</div><div class='del'>-		for (i=0; i&lt;argc-1; i++) {</div><div class='del'>-			memset (buf[i], 0, 4096);</div><div class='del'>-			ret = read (fds[i], buf[i], 4096); </div><div class='del'>-			if (ret &gt; max_ret)</div><div class='del'>-				max_ret = ret;</div><div class='del'>-		}</div><div class='del'>-		for (i=0; i&lt;max_ret;i++)</div><div class='del'>-			for (j=0; j&lt;argc-1; j++)</div><div class='del'>-				newbuf[i] |= buf[j][i];</div><div class='del'>-		write (1, newbuf, max_ret);</div><div class='del'>-	} while (max_ret);</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='add'>+#define ATTRNAME_STRIPE_INDEX "trusted.*.stripe-index"</div><div class='add'>+#define ATTRNAME_STRIPE_COUNT "trusted.*.stripe-count"</div><div class='add'>+#define ATTRNAME_STRIPE_SIZE "trusted.*.stripe-size"</div><div class='add'>+#define ATTRNAME_STRIPE_COALESCE "trusted.*.stripe-coalesce"</div><div class='add'>+</div><div class='add'>+#define INVALID_FD -1</div><div class='add'>+#define INVALID_MODE UINT32_MAX</div><div class='add'>+</div><div class='add'>+struct file_stripe_info {</div><div class='add'>+    int stripe_count;</div><div class='add'>+    int stripe_size;</div><div class='add'>+    int coalesce;</div><div class='add'>+    mode_t mode;</div><div class='add'>+    int fd[0];</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+close_files(struct file_stripe_info *);</div><div class='add'>+</div><div class='add'>+static struct file_stripe_info *</div><div class='add'>+alloc_file_stripe_info(int count)</div><div class='add'>+{</div><div class='add'>+    int i;</div><div class='add'>+    struct file_stripe_info *finfo;</div><div class='add'>+</div><div class='add'>+    finfo = calloc(1, sizeof(struct file_stripe_info) + (sizeof(int) * count));</div><div class='add'>+    if (!finfo)</div><div class='add'>+        return NULL;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; count; i++)</div><div class='add'>+        finfo-&gt;fd[i] = INVALID_FD;</div><div class='add'>+</div><div class='add'>+    finfo-&gt;mode = INVALID_MODE;</div><div class='add'>+    finfo-&gt;coalesce = INVALID_FD;</div><div class='add'>+</div><div class='add'>+    return finfo;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+ * Search for an attribute matching the provided pattern. Return a count for</div><div class='add'>+ * the total number of matching entries (including 0). Allocate a buffer for</div><div class='add'>+ * the first matching entry found.</div><div class='add'>+ */</div><div class='add'>+static int</div><div class='add'>+get_stripe_attr_name(const char *path, const char *pattern, char **attrname)</div><div class='add'>+{</div><div class='add'>+    char attrbuf[4096];</div><div class='add'>+    char *ptr, *match = NULL;</div><div class='add'>+    int len, r, match_count = 0;</div><div class='add'>+</div><div class='add'>+    if (!path || !pattern || !attrname)</div><div class='add'>+        return -1;</div><div class='add'>+</div><div class='add'>+    len = listxattr(path, attrbuf, sizeof(attrbuf));</div><div class='add'>+    if (len &lt; 0)</div><div class='add'>+        return len;</div><div class='add'>+</div><div class='add'>+    ptr = attrbuf;</div><div class='add'>+    while (ptr) {</div><div class='add'>+        r = fnmatch(pattern, ptr, 0);</div><div class='add'>+        if (!r) {</div><div class='add'>+            if (!match)</div><div class='add'>+                match = ptr;</div><div class='add'>+            match_count++;</div><div class='add'>+        } else if (r != FNM_NOMATCH) {</div><div class='add'>+            return -1;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        len -= strlen(ptr) + 1;</div><div class='add'>+        if (len &gt; 0)</div><div class='add'>+            ptr += strlen(ptr) + 1;</div><div class='add'>+        else</div><div class='add'>+            ptr = NULL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (match)</div><div class='add'>+        *attrname = strdup(match);</div><div class='add'>+</div><div class='add'>+    return match_count;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+/*</div><div class='add'>+ * Get the integer representation of a named attribute.</div><div class='add'>+ */</div><div class='add'>+static int</div><div class='add'>+get_stripe_attr_val(const char *path, const char *attr, int *val)</div><div class='add'>+{</div><div class='add'>+    char attrbuf[4096];</div><div class='add'>+    int len;</div><div class='add'>+</div><div class='add'>+    if (!path || !attr || !val)</div><div class='add'>+        return -1;</div><div class='add'>+</div><div class='add'>+    len = getxattr(path, attr, attrbuf, sizeof(attrbuf));</div><div class='add'>+    if (len &lt; 0)</div><div class='add'>+        return len;</div><div class='add'>+</div><div class='add'>+    *val = atoi(attrbuf);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+ * Get an attribute name/value (assumed to be an integer) pair based on a</div><div class='add'>+ * specified search pattern. A buffer is allocated for the exact attr name</div><div class='add'>+ * returned. Optionally, skip the pattern search if a buffer is provided</div><div class='add'>+ * (which should contain an attribute name).</div><div class='add'>+ *</div><div class='add'>+ * Returns the attribute count or -1 on error. The value parameter is set only</div><div class='add'>+ * when a single attribute is found.</div><div class='add'>+ */</div><div class='add'>+static int</div><div class='add'>+get_attr(const char *path, const char *pattern, char **buf, int *val)</div><div class='add'>+{</div><div class='add'>+    int count = 1;</div><div class='add'>+</div><div class='add'>+    if (!buf)</div><div class='add'>+        return -1;</div><div class='add'>+</div><div class='add'>+    if (!*buf) {</div><div class='add'>+        count = get_stripe_attr_name(path, pattern, buf);</div><div class='add'>+        if (count &gt; 1) {</div><div class='add'>+            /* pattern isn't good enough */</div><div class='add'>+            fprintf(stderr,</div><div class='add'>+                    "ERROR: duplicate attributes found "</div><div class='add'>+                    "matching pattern: %s\n",</div><div class='add'>+                    pattern);</div><div class='add'>+            free(*buf);</div><div class='add'>+            *buf = NULL;</div><div class='add'>+            return count;</div><div class='add'>+        } else if (count &lt; 1) {</div><div class='add'>+            return count;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (get_stripe_attr_val(path, *buf, val) &lt; 0)</div><div class='add'>+        return -1;</div><div class='add'>+</div><div class='add'>+    return count;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+ * validate_and_open_files()</div><div class='add'>+ *</div><div class='add'>+ * Open the provided source files and validate the extended attributes. Verify</div><div class='add'>+ * that the geometric attributes are consistent across all of the files and</div><div class='add'>+ * print a warning if any files are missing. We proceed without error in the</div><div class='add'>+ * latter case to support partial recovery.</div><div class='add'>+ */</div><div class='add'>+static struct file_stripe_info *</div><div class='add'>+validate_and_open_files(char *paths[], int count)</div><div class='add'>+{</div><div class='add'>+    int i, val, tmp;</div><div class='add'>+    struct stat sbuf;</div><div class='add'>+    char *stripe_count_attr = NULL;</div><div class='add'>+    char *stripe_size_attr = NULL;</div><div class='add'>+    char *stripe_index_attr = NULL;</div><div class='add'>+    char *stripe_coalesce_attr = NULL;</div><div class='add'>+    struct file_stripe_info *finfo = NULL;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; count; i++) {</div><div class='add'>+        if (!paths[i])</div><div class='add'>+            goto err;</div><div class='add'>+</div><div class='add'>+        /*</div><div class='add'>+         * Check the stripe count first so we can allocate the info</div><div class='add'>+         * struct with the appropriate number of fds.</div><div class='add'>+         */</div><div class='add'>+        if (get_attr(paths[i], ATTRNAME_STRIPE_COUNT, &amp;stripe_count_attr,</div><div class='add'>+                     &amp;val) != 1) {</div><div class='add'>+            fprintf(stderr, "ERROR: %s: attribute: '%s'\n", paths[i],</div><div class='add'>+                    ATTRNAME_STRIPE_COUNT);</div><div class='add'>+            goto err;</div><div class='add'>+        }</div><div class='add'>+        if (!finfo) {</div><div class='add'>+            finfo = alloc_file_stripe_info(val);</div><div class='add'>+            if (!finfo)</div><div class='add'>+                goto err;</div><div class='add'>+</div><div class='add'>+            if (val != count)</div><div class='add'>+                fprintf(stderr,</div><div class='add'>+                        "WARNING: %s: stripe-count "</div><div class='add'>+                        "(%d) != file count (%d). Result may "</div><div class='add'>+                        "be incomplete.\n",</div><div class='add'>+                        paths[i], val, count);</div><div class='add'>+</div><div class='add'>+            finfo-&gt;stripe_count = val;</div><div class='add'>+        } else if (val != finfo-&gt;stripe_count) {</div><div class='add'>+            fprintf(stderr,</div><div class='add'>+                    "ERROR %s: invalid stripe count: %d "</div><div class='add'>+                    "(expected %d)\n",</div><div class='add'>+                    paths[i], val, finfo-&gt;stripe_count);</div><div class='add'>+            goto err;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        /*</div><div class='add'>+         * Get and validate the chunk size.</div><div class='add'>+         */</div><div class='add'>+        if (get_attr(paths[i], ATTRNAME_STRIPE_SIZE, &amp;stripe_size_attr, &amp;val) !=</div><div class='add'>+            1) {</div><div class='add'>+            fprintf(stderr, "ERROR: %s: attribute: '%s'\n", paths[i],</div><div class='add'>+                    ATTRNAME_STRIPE_SIZE);</div><div class='add'>+            goto err;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        if (!finfo-&gt;stripe_size) {</div><div class='add'>+            finfo-&gt;stripe_size = val;</div><div class='add'>+        } else if (val != finfo-&gt;stripe_size) {</div><div class='add'>+            fprintf(stderr,</div><div class='add'>+                    "ERROR: %s: invalid stripe size: %d "</div><div class='add'>+                    "(expected %d)\n",</div><div class='add'>+                    paths[i], val, finfo-&gt;stripe_size);</div><div class='add'>+            goto err;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        /*</div><div class='add'>+         * stripe-coalesce is a backward compatible attribute. If the</div><div class='add'>+         * attribute does not exist, assume a value of zero for the</div><div class='add'>+         * traditional stripe format.</div><div class='add'>+         */</div><div class='add'>+        tmp = get_attr(paths[i], ATTRNAME_STRIPE_COALESCE,</div><div class='add'>+                       &amp;stripe_coalesce_attr, &amp;val);</div><div class='add'>+        if (!tmp) {</div><div class='add'>+            val = 0;</div><div class='add'>+        } else if (tmp != 1) {</div><div class='add'>+            fprintf(stderr, "ERROR: %s: attribute: '%s'\n", paths[i],</div><div class='add'>+                    ATTRNAME_STRIPE_COALESCE);</div><div class='add'>+            goto err;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        if (finfo-&gt;coalesce == INVALID_FD) {</div><div class='add'>+            finfo-&gt;coalesce = val;</div><div class='add'>+        } else if (val != finfo-&gt;coalesce) {</div><div class='add'>+            fprintf(stderr, "ERROR: %s: invalid coalesce flag\n", paths[i]);</div><div class='add'>+            goto err;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        /*</div><div class='add'>+         * Get/validate the stripe index and open the file in the</div><div class='add'>+         * appropriate fd slot.</div><div class='add'>+         */</div><div class='add'>+        if (get_attr(paths[i], ATTRNAME_STRIPE_INDEX, &amp;stripe_index_attr,</div><div class='add'>+                     &amp;val) != 1) {</div><div class='add'>+            fprintf(stderr, "ERROR: %s: attribute: '%s'\n", paths[i],</div><div class='add'>+                    ATTRNAME_STRIPE_INDEX);</div><div class='add'>+            goto err;</div><div class='add'>+        }</div><div class='add'>+        if (finfo-&gt;fd[val] != INVALID_FD) {</div><div class='add'>+            fprintf(stderr,</div><div class='add'>+                    "ERROR: %s: duplicate stripe index: "</div><div class='add'>+                    "%d\n",</div><div class='add'>+                    paths[i], val);</div><div class='add'>+            goto err;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        finfo-&gt;fd[val] = open(paths[i], O_RDONLY);</div><div class='add'>+        if (finfo-&gt;fd[val] &lt; 0)</div><div class='add'>+            goto err;</div><div class='add'>+</div><div class='add'>+        /*</div><div class='add'>+         * Get the creation mode for the file.</div><div class='add'>+         */</div><div class='add'>+        if (fstat(finfo-&gt;fd[val], &amp;sbuf) &lt; 0)</div><div class='add'>+            goto err;</div><div class='add'>+        if (finfo-&gt;mode == INVALID_MODE) {</div><div class='add'>+            finfo-&gt;mode = sbuf.st_mode;</div><div class='add'>+        } else if (sbuf.st_mode != finfo-&gt;mode) {</div><div class='add'>+            fprintf(stderr, "ERROR: %s: invalid mode\n", paths[i]);</div><div class='add'>+            goto err;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    free(stripe_count_attr);</div><div class='add'>+    free(stripe_size_attr);</div><div class='add'>+    free(stripe_index_attr);</div><div class='add'>+    free(stripe_coalesce_attr);</div><div class='add'>+</div><div class='add'>+    return finfo;</div><div class='add'>+err:</div><div class='add'>+</div><div class='add'>+    free(stripe_count_attr);</div><div class='add'>+    free(stripe_size_attr);</div><div class='add'>+    free(stripe_index_attr);</div><div class='add'>+    free(stripe_coalesce_attr);</div><div class='add'>+</div><div class='add'>+    if (finfo) {</div><div class='add'>+        close_files(finfo);</div><div class='add'>+        free(finfo);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return NULL;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+close_files(struct file_stripe_info *finfo)</div><div class='add'>+{</div><div class='add'>+    int i, ret;</div><div class='add'>+</div><div class='add'>+    if (!finfo)</div><div class='add'>+        return -1;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; finfo-&gt;stripe_count; i++) {</div><div class='add'>+        if (finfo-&gt;fd[i] == INVALID_FD)</div><div class='add'>+            continue;</div><div class='add'>+</div><div class='add'>+        ret = close(finfo-&gt;fd[i]);</div><div class='add'>+        if (ret &lt; 0)</div><div class='add'>+            return ret;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+ * Generate the original file using files striped in the coalesced format.</div><div class='add'>+ * Data in the striped files is stored at a coalesced offset based on the</div><div class='add'>+ * stripe number.</div><div class='add'>+ *</div><div class='add'>+ * Walk through the finfo fds (which are already ordered) and and iteratively</div><div class='add'>+ * copy stripe_size bytes from the source files to the target file. If a source</div><div class='add'>+ * file is missing, seek past the associated stripe_size bytes in the target</div><div class='add'>+ * file.</div><div class='add'>+ */</div><div class='add'>+static int</div><div class='add'>+generate_file_coalesce(int target, struct file_stripe_info *finfo)</div><div class='add'>+{</div><div class='add'>+    char *buf;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    int r, w, i;</div><div class='add'>+</div><div class='add'>+    buf = malloc(finfo-&gt;stripe_size);</div><div class='add'>+    if (!buf)</div><div class='add'>+        return -1;</div><div class='add'>+</div><div class='add'>+    i = 0;</div><div class='add'>+    while (1) {</div><div class='add'>+        if (finfo-&gt;fd[i] == INVALID_FD) {</div><div class='add'>+            if (lseek(target, finfo-&gt;stripe_size, SEEK_CUR) &lt; 0)</div><div class='add'>+                break;</div><div class='add'>+</div><div class='add'>+            i = (i + 1) % finfo-&gt;stripe_count;</div><div class='add'>+            continue;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        r = read(finfo-&gt;fd[i], buf, finfo-&gt;stripe_size);</div><div class='add'>+        if (r &lt; 0) {</div><div class='add'>+            ret = r;</div><div class='add'>+            break;</div><div class='add'>+        }</div><div class='add'>+        if (!r)</div><div class='add'>+            break;</div><div class='add'>+</div><div class='add'>+        w = write(target, buf, r);</div><div class='add'>+        if (w &lt; 0) {</div><div class='add'>+            ret = w;</div><div class='add'>+            break;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        i = (i + 1) % finfo-&gt;stripe_count;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    free(buf);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+ * Generate the original file using files striped with the traditional stripe</div><div class='add'>+ * format. Data in the striped files is stored at the equivalent offset from</div><div class='add'>+ * the source file.</div><div class='add'>+ */</div><div class='add'>+static int</div><div class='add'>+generate_file_traditional(int target, struct file_stripe_info *finfo)</div><div class='add'>+{</div><div class='add'>+    int i, j, max_ret, ret;</div><div class='add'>+    char buf[finfo-&gt;stripe_count][4096];</div><div class='add'>+</div><div class='add'>+    do {</div><div class='add'>+        char newbuf[4096] = {</div><div class='add'>+            0,</div><div class='add'>+        };</div><div class='add'>+</div><div class='add'>+        max_ret = 0;</div><div class='add'>+        for (i = 0; i &lt; finfo-&gt;stripe_count; i++) {</div><div class='add'>+            memset(buf[i], 0, 4096);</div><div class='add'>+            ret = read(finfo-&gt;fd[i], buf[i], 4096);</div><div class='add'>+            if (ret &gt; max_ret)</div><div class='add'>+                max_ret = ret;</div><div class='add'>+        }</div><div class='add'>+        for (i = 0; i &lt; max_ret; i++)</div><div class='add'>+            for (j = 0; j &lt; finfo-&gt;stripe_count; j++)</div><div class='add'>+                newbuf[i] |= buf[j][i];</div><div class='add'>+        write(target, newbuf, max_ret);</div><div class='add'>+    } while (max_ret);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+generate_file(int target, struct file_stripe_info *finfo)</div><div class='add'>+{</div><div class='add'>+    if (finfo-&gt;coalesce)</div><div class='add'>+        return generate_file_coalesce(target, finfo);</div><div class='add'>+</div><div class='add'>+    return generate_file_traditional(target, finfo);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+usage(char *name)</div><div class='add'>+{</div><div class='add'>+    fprintf(stderr,</div><div class='add'>+            "Usage: %s [-o &lt;outputfile&gt;] &lt;inputfile1&gt; "</div><div class='add'>+            "&lt;inputfile2&gt; ...\n",</div><div class='add'>+            name);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+main(int argc, char *argv[])</div><div class='add'>+{</div><div class='add'>+    int file_count, opt;</div><div class='add'>+    char *opath = NULL;</div><div class='add'>+    int targetfd;</div><div class='add'>+    struct file_stripe_info *finfo;</div><div class='add'>+</div><div class='add'>+    while ((opt = getopt(argc, argv, "o:")) != -1) {</div><div class='add'>+        switch (opt) {</div><div class='add'>+            case 'o':</div><div class='add'>+                opath = optarg;</div><div class='add'>+                break;</div><div class='add'>+            default:</div><div class='add'>+                usage(argv[0]);</div><div class='add'>+                return -1;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    file_count = argc - optind;</div><div class='add'>+</div><div class='add'>+    if (!opath || !file_count) {</div><div class='add'>+        usage(argv[0]);</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    finfo = validate_and_open_files(&amp;argv[optind], file_count);</div><div class='add'>+    if (!finfo)</div><div class='add'>+        goto err;</div><div class='add'>+</div><div class='add'>+    targetfd = open(opath, O_RDWR | O_CREAT, finfo-&gt;mode);</div><div class='add'>+    if (targetfd &lt; 0)</div><div class='add'>+        goto err;</div><div class='add'>+</div><div class='add'>+    if (generate_file(targetfd, finfo) &lt; 0)</div><div class='add'>+        goto err;</div><div class='add'>+</div><div class='add'>+    if (fsync(targetfd) &lt; 0)</div><div class='add'>+        fprintf(stderr, "ERROR: %s\n", strerror(errno));</div><div class='add'>+    if (close(targetfd) &lt; 0)</div><div class='add'>+        fprintf(stderr, "ERROR: %s\n", strerror(errno));</div><div class='add'>+</div><div class='add'>+    close_files(finfo);</div><div class='add'>+    free(finfo);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+</div><div class='add'>+err:</div><div class='add'>+    if (finfo) {</div><div class='add'>+        close_files(finfo);</div><div class='add'>+        free(finfo);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return -1;</div><div class='add'>+}</div><div class='head'>diff --git a/extras/systemd/Makefile.am b/extras/systemd/Makefile.am<br/>new file mode 100644<br/>index 00000000000..61446a9b84a<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/extras/systemd/Makefile.am?id=d1d7a6f35c816822fab51c820e25023863c239c1'>extras/systemd/Makefile.am</a></div><div class='hunk'>@@ -0,0 +1,17 @@</div><div class='add'>+CLEANFILES = glusterd.service glustereventsd.service glusterfssharedstorage.service gluster-ta-volume.service</div><div class='add'>+EXTRA_DIST = glusterd.service.in glustereventsd.service.in glusterfssharedstorage.service.in gluster-ta-volume.service.in</div><div class='add'>+</div><div class='add'>+if USE_SYSTEMD</div><div class='add'>+systemd_DATA = gluster-ta-volume.service</div><div class='add'>+endif</div><div class='add'>+</div><div class='add'>+if WITH_SERVER</div><div class='add'>+if USE_SYSTEMD</div><div class='add'>+# systemddir is already defined through configure.ac</div><div class='add'>+systemd_DATA += glusterd.service glusterfssharedstorage.service</div><div class='add'>+</div><div class='add'>+if BUILD_EVENTS</div><div class='add'>+systemd_DATA += glustereventsd.service</div><div class='add'>+endif</div><div class='add'>+endif</div><div class='add'>+endif</div><div class='head'>diff --git a/extras/systemd/gluster-ta-volume.service.in b/extras/systemd/gluster-ta-volume.service.in<br/>new file mode 100644<br/>index 00000000000..2802bca05bf<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/extras/systemd/gluster-ta-volume.service.in?id=d1d7a6f35c816822fab51c820e25023863c239c1'>extras/systemd/gluster-ta-volume.service.in</a></div><div class='hunk'>@@ -0,0 +1,13 @@</div><div class='add'>+[Unit]</div><div class='add'>+Description=GlusterFS, Thin-arbiter process to maintain quorum for replica volume</div><div class='add'>+After=network.target</div><div class='add'>+</div><div class='add'>+[Service]</div><div class='add'>+Environment="LOG_LEVEL=WARNING"</div><div class='add'>+ExecStart=@prefix@/sbin/glusterfsd -N --volfile-id ta -f @GLUSTERD_WORKDIR@/thin-arbiter/thin-arbiter.vol --brick-port 24007 --xlator-option ta-server.transport.socket.listen-port=24007 -LWARNING</div><div class='add'>+Restart=always</div><div class='add'>+KillMode=process</div><div class='add'>+SuccessExitStatus=15</div><div class='add'>+</div><div class='add'>+[Install]</div><div class='add'>+WantedBy=multi-user.target</div><div class='head'>diff --git a/extras/systemd/glusterd.service.in b/extras/systemd/glusterd.service.in<br/>new file mode 100644<br/>index 00000000000..abb0d82911f<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/extras/systemd/glusterd.service.in?id=d1d7a6f35c816822fab51c820e25023863c239c1'>extras/systemd/glusterd.service.in</a></div><div class='hunk'>@@ -0,0 +1,26 @@</div><div class='add'>+[Unit]</div><div class='add'>+Description=GlusterFS, a clustered file-system server</div><div class='add'>+Documentation=man:glusterd(8)</div><div class='add'>+StartLimitBurst=6</div><div class='add'>+StartLimitIntervalSec=3600</div><div class='add'>+Requires=@RPCBIND_SERVICE@</div><div class='add'>+After=network.target @RPCBIND_SERVICE@</div><div class='add'>+Before=network-online.target</div><div class='add'>+</div><div class='add'>+[Service]</div><div class='add'>+Type=forking</div><div class='add'>+PIDFile=@localstatedir@/run/glusterd.pid</div><div class='add'>+LimitNOFILE=65536</div><div class='add'>+Environment="LOG_LEVEL=INFO"</div><div class='add'>+EnvironmentFile=-@SYSCONF_DIR@/sysconfig/glusterd</div><div class='add'>+ExecStart=@prefix@/sbin/glusterd -p @localstatedir@/run/glusterd.pid  --log-level $LOG_LEVEL $GLUSTERD_OPTIONS</div><div class='add'>+KillMode=process</div><div class='add'>+TimeoutSec=300</div><div class='add'>+SuccessExitStatus=15</div><div class='add'>+Restart=on-abnormal</div><div class='add'>+RestartSec=60</div><div class='add'>+StartLimitBurst=6</div><div class='add'>+StartLimitInterval=3600</div><div class='add'>+</div><div class='add'>+[Install]</div><div class='add'>+WantedBy=multi-user.target</div><div class='head'>diff --git a/extras/systemd/glustereventsd.service.in b/extras/systemd/glustereventsd.service.in<br/>new file mode 100644<br/>index 00000000000..f80b78199f6<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/extras/systemd/glustereventsd.service.in?id=d1d7a6f35c816822fab51c820e25023863c239c1'>extras/systemd/glustereventsd.service.in</a></div><div class='hunk'>@@ -0,0 +1,16 @@</div><div class='add'>+[Unit]</div><div class='add'>+Description=Gluster Events Notifier</div><div class='add'>+After=network.target</div><div class='add'>+Documentation=man:glustereventsd(8)</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+[Service]</div><div class='add'>+Environment=PYTHONPATH=@BUILD_PYTHON_SITE_PACKAGES_EXPANDED@:$PYTHONPATH</div><div class='add'>+Type=simple</div><div class='add'>+ExecStart=@SBIN_DIR@/glustereventsd --pid-file @localstatedir@/run/glustereventsd.pid</div><div class='add'>+ExecReload=/bin/kill -SIGUSR2 $MAINPID</div><div class='add'>+KillMode=control-group</div><div class='add'>+PIDFile=@localstatedir@/run/glustereventsd.pid</div><div class='add'>+</div><div class='add'>+[Install]</div><div class='add'>+WantedBy=multi-user.target</div><div class='head'>diff --git a/extras/systemd/glusterfssharedstorage.service.in b/extras/systemd/glusterfssharedstorage.service.in<br/>new file mode 100644<br/>index 00000000000..723ff49afb7<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/extras/systemd/glusterfssharedstorage.service.in?id=d1d7a6f35c816822fab51c820e25023863c239c1'>extras/systemd/glusterfssharedstorage.service.in</a></div><div class='hunk'>@@ -0,0 +1,13 @@</div><div class='add'>+[Unit]</div><div class='add'>+Description=Mount glusterfs sharedstorage</div><div class='add'>+Requires=glusterd.service remote-fs-pre.target local-fs.target</div><div class='add'>+</div><div class='add'>+[Service]</div><div class='add'>+Type=forking</div><div class='add'>+ExecStart=@GLUSTERFS_LIBEXECDIR@/mount-shared-storage.sh</div><div class='add'>+Restart=on-failure</div><div class='add'>+RestartSec=3</div><div class='add'>+RestartForceExitStatus=1</div><div class='add'>+</div><div class='add'>+[Install]</div><div class='add'>+WantedBy=multi-user.target</div><div class='head'>diff --git a/extras/test/bug-920583.t b/extras/test/bug-920583.t<br/>new file mode 100755<br/>index 00000000000..eedbb800ac0<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/extras/test/bug-920583.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>extras/test/bug-920583.t</a></div><div class='hunk'>@@ -0,0 +1,50 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+##Copy this file to tests/bugs before running run.sh (cp extras/test/bug-920583.t tests/bugs/)</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../include.rc</div><div class='add'>+. $(dirname $0)/../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+logdir=`gluster --print-logdir`</div><div class='add'>+</div><div class='add'>+## Start and create a volume</div><div class='add'>+TEST glusterd;</div><div class='add'>+TEST pidof glusterd;</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 replica 2 stripe 2 $H0:$B0/${V0}{1,2,3,4,5,6,7,8};</div><div class='add'>+</div><div class='add'>+## Verify volume is is created</div><div class='add'>+EXPECT "$V0" volinfo_field $V0 'Volume Name';</div><div class='add'>+EXPECT 'Created' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+## Start volume and verify</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+EXPECT 'Started' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+function log-file-name()</div><div class='add'>+{</div><div class='add'>+    logfilename=$M0".log"</div><div class='add'>+    echo ${logfilename:1} | tr / -</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+log_file=$logdir"/"`log-file-name`</div><div class='add'>+</div><div class='add'>+lookup_unhashed_count=`grep "adding option 'lookup-unhashed'" $log_file | wc -l`</div><div class='add'>+no_child_down_count=`grep "adding option 'assert-no-child-down'" $log_file | wc -l`</div><div class='add'>+mount -t glusterfs $H0:/$V0 $M0 -o "xlator-option=*dht.assert-no-child-down=yes,xlator-option=*dht.lookup-unhashed=yes"</div><div class='add'>+touch $M0/file1;</div><div class='add'>+</div><div class='add'>+new_lookup_unhashed_count=`grep "adding option 'lookup-unhashed'" $log_file | wc -l`</div><div class='add'>+new_no_child_down_count=`grep "adding option 'assert-no-child-down'" $log_file | wc -l`</div><div class='add'>+EXPECT "1" expr $new_lookup_unhashed_count - $lookup_unhashed_count</div><div class='add'>+EXPECT "1" expr $new_no_child_down_count - $no_child_down_count</div><div class='add'>+</div><div class='add'>+## Finish up</div><div class='add'>+TEST $CLI volume stop $V0;</div><div class='add'>+EXPECT 'Stopped' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+TEST $CLI volume delete $V0;</div><div class='add'>+TEST ! $CLI volume info $V0;</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/extras/test/gluster_commands.sh b/extras/test/gluster_commands.sh<br/>index 8db4de9c16c..cb2a55fd5b5 100755<br/>--- a/<a href='/cgit/glusterfs.git/tree/extras/test/gluster_commands.sh?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/test/gluster_commands.sh</a><br/>+++ b/<a href='/cgit/glusterfs.git/tree/extras/test/gluster_commands.sh?id=d1d7a6f35c816822fab51c820e25023863c239c1'>extras/test/gluster_commands.sh</a></div><div class='hunk'>@@ -1,25 +1,26 @@</div><div class='ctx'> #!/bin/bash</div><div class='ctx'> </div><div class='del'>-#   Copyright (c) 2006-2010 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='del'>-#   This file is part of GlusterFS.</div><div class='ctx'> </div><div class='del'>-#   GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-#   it under the terms of the GNU General Public License as published</div><div class='del'>-#   by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-#   or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-#   GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-#   WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-#   General Public License for more details.</div><div class='del'>-</div><div class='del'>-#   You should have received a copy of the GNU General Public License</div><div class='del'>-#   along with this program.  If not, see</div><div class='del'>-#   &lt;http://www.gnu.org/licenses/&gt;.</div><div class='add'>+#  Copyright (c) 2006-2012 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+#  This file is part of GlusterFS.</div><div class='add'>+#</div><div class='add'>+#  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+#  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+#  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+#  cases as published by the Free Software Foundation.</div><div class='ctx'> </div><div class='ctx'> </div><div class='ctx'> # This script tests the basics gluster cli commands.</div><div class='ctx'> </div><div class='add'>+echo "Starting glusterd"</div><div class='add'>+glusterd</div><div class='add'>+if [ $? -ne 0 ]; then</div><div class='add'>+    echo "Could not start glusterd.Exiting"</div><div class='add'>+    exit;</div><div class='add'>+else</div><div class='add'>+    echo "glusterd started"</div><div class='add'>+fi</div><div class='add'>+</div><div class='ctx'> if [ ! -d "/exports" ]; then</div><div class='ctx'>     mkdir /exports;</div><div class='ctx'>     mkdir /exports/exp{1..10};</div><div class='hunk'>@@ -45,44 +46,67 @@ gluster volume start vol</div><div class='ctx'> gluster volume info</div><div class='ctx'> sleep 1</div><div class='ctx'> mount -t glusterfs `hostname`:vol /mnt/client</div><div class='del'>-sleep 1 </div><div class='add'>+sleep 1</div><div class='ctx'> df -h</div><div class='ctx'> </div><div class='ctx'> echo "adding-brick......."</div><div class='ctx'> gluster volume add-brick vol `hostname`:/exports/exp2</div><div class='ctx'> gluster volume info</div><div class='del'>-sleep 1 </div><div class='add'>+sleep 1</div><div class='add'>+umount /mnt/client</div><div class='ctx'> mount -t glusterfs `hostname`:vol /mnt/client</div><div class='ctx'> df -h</div><div class='ctx'> sleep 1</div><div class='ctx'> </div><div class='ctx'> echo "replacing brick......"</div><div class='ctx'> gluster volume replace-brick vol `hostname`:/exports/exp1 `hostname`:/exports/exp3 start</div><div class='add'>+#sleep for 5 seconds</div><div class='add'>+sleep 5</div><div class='ctx'> gluster volume replace-brick vol `hostname`:/exports/exp1 `hostname`:/exports/exp3 status</div><div class='ctx'> gluster volume replace-brick vol `hostname`:/exports/exp1 `hostname`:/exports/exp3 pause</div><div class='del'>-gluster volume replace-brick vol `hostname`:/exports/exp1 `hostname`:/exports/exp3 abort</div><div class='add'>+gluster volume replace-brick vol `hostname`:/exports/exp1 `hostname`:/exports/exp3 status</div><div class='add'>+gluster volume replace-brick vol `hostname`:/exports/exp1 `hostname`:/exports/exp3 start</div><div class='add'>+#sleep for 5 seconds</div><div class='add'>+sleep 5</div><div class='add'>+gluster volume replace-brick vol `hostname`:/exports/exp1 `hostname`:/exports/exp3 status</div><div class='ctx'> gluster volume replace-brick vol `hostname`:/exports/exp1 `hostname`:/exports/exp3 commit</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+echo "replcing brick for abort operation"</div><div class='add'>+gluster volume replace-brick vol `hostname`:/exports/exp3 `hostname`:/exports/exp1 start</div><div class='add'>+#sleep for 5 seconds</div><div class='add'>+sleep 5</div><div class='add'>+gluster volume replace-brick vol `hostname`:/exports/exp3 `hostname`:/exports/exp1 status</div><div class='add'>+gluster volume replace-brick vol `hostname`:/exports/exp3 `hostname`:/exports/exp1 pause</div><div class='add'>+gluster volume replace-brick vol `hostname`:/exports/exp3 `hostname`:/exports/exp1 status</div><div class='add'>+gluster volume replace-brick vol `hostname`:/exports/exp3 `hostname`:/exports/exp1 start</div><div class='add'>+#sleep for 5 seconds</div><div class='add'>+sleep 5</div><div class='add'>+gluster volume replace-brick vol `hostname`:/exports/exp3 `hostname`:/exports/exp1 status</div><div class='add'>+gluster volume replace-brick vol `hostname`:/exports/exp3 `hostname`:/exports/exp1 abort</div><div class='add'>+</div><div class='add'>+</div><div class='ctx'> gluster volume info</div><div class='ctx'> sleep 1</div><div class='ctx'> df -h</div><div class='ctx'> sleep 1</div><div class='ctx'> </div><div class='ctx'> echo "removing brick......."</div><div class='del'>-gluster volume remove-brick vol `hostname`:/exports/exp2</div><div class='add'>+gluster --mode=script volume remove-brick vol `hostname`:/exports/exp2</div><div class='ctx'> gluster volume info</div><div class='del'>-sleep 1 </div><div class='add'>+sleep 1</div><div class='ctx'> df -h</div><div class='ctx'> sleep 1</div><div class='ctx'> </div><div class='ctx'> echo "stopping distribute volume......"</div><div class='del'>-gluster volume stop vol</div><div class='add'>+gluster --mode=script volume stop vol</div><div class='ctx'> gluster volume info</div><div class='ctx'> sleep 1</div><div class='ctx'> umount /mnt/client</div><div class='ctx'> df -h</div><div class='ctx'> </div><div class='ctx'> echo "deleting distribute volume......"</div><div class='del'>-gluster volume delete vol</div><div class='add'>+gluster --mode=script volume delete vol</div><div class='ctx'> gluster volume info</div><div class='ctx'> sleep 1</div><div class='ctx'> </div><div class='hunk'>@@ -95,46 +119,70 @@ sleep 1</div><div class='ctx'> echo "starting replicate volume......"</div><div class='ctx'> gluster volume start mirror</div><div class='ctx'> gluster volume info</div><div class='del'>-sleep 1 </div><div class='add'>+sleep 1</div><div class='ctx'> mount -t glusterfs `hostname`:mirror /mnt/client</div><div class='ctx'> sleep 1</div><div class='ctx'> df -h</div><div class='ctx'> sleep 1</div><div class='ctx'> </div><div class='ctx'> echo "adding-brick......."</div><div class='del'>-gluster volume add-brick mirror replica 2 `hostname`:/exports/exp3 `hostname`:/exports/exp4</div><div class='add'>+gluster volume add-brick mirror `hostname`:/exports/exp3 `hostname`:/exports/exp4</div><div class='ctx'> gluster volume info</div><div class='del'>-sleep 1 </div><div class='add'>+sleep 1</div><div class='ctx'> df -h</div><div class='ctx'> sleep 1</div><div class='ctx'> </div><div class='ctx'> echo "replacing-brick....."</div><div class='ctx'> gluster volume replace-brick mirror `hostname`:/exports/exp1 `hostname`:/exports/exp5 start</div><div class='add'>+#sleep for 5 seconds</div><div class='add'>+sleep 5</div><div class='ctx'> gluster volume replace-brick mirror `hostname`:/exports/exp1 `hostname`:/exports/exp5 status</div><div class='ctx'> gluster volume replace-brick mirror `hostname`:/exports/exp1 `hostname`:/exports/exp5 pause</div><div class='del'>-gluster volume replace-brick mirror `hostname`:/exports/exp1 `hostname`:/exports/exp5 abort</div><div class='add'>+gluster volume replace-brick mirror `hostname`:/exports/exp1 `hostname`:/exports/exp5 status</div><div class='add'>+gluster volume replace-brick mirror `hostname`:/exports/exp1 `hostname`:/exports/exp5 start</div><div class='add'>+#sleep for 5 seconds</div><div class='add'>+sleep 5</div><div class='add'>+gluster volume replace-brick mirror `hostname`:/exports/exp1 `hostname`:/exports/exp5 status</div><div class='ctx'> gluster volume replace-brick mirror `hostname`:/exports/exp1 `hostname`:/exports/exp5 commit</div><div class='ctx'> gluster volume info</div><div class='ctx'> sleep 1</div><div class='ctx'> df -h</div><div class='ctx'> sleep 1</div><div class='ctx'> </div><div class='add'>+echo "replacing brick for abort operation"</div><div class='add'>+gluster volume replace-brick mirror `hostname`:/exports/exp5 `hostname`:/exports/exp1 start</div><div class='add'>+#sleep for 5 seconds</div><div class='add'>+sleep 5</div><div class='add'>+gluster volume replace-brick mirror `hostname`:/exports/exp5 `hostname`:/exports/exp1 status</div><div class='add'>+gluster volume replace-brick mirror `hostname`:/exports/exp5 `hostname`:/exports/exp1 pause</div><div class='add'>+gluster volume replace-brick mirror `hostname`:/exports/exp5 `hostname`:/exports/exp1 status</div><div class='add'>+gluster volume replace-brick mirror `hostname`:/exports/exp5 `hostname`:/exports/exp1 start</div><div class='add'>+#sleep for 5 seconds</div><div class='add'>+sleep 5</div><div class='add'>+gluster volume replace-brick mirror `hostname`:/exports/exp5 `hostname`:/exports/exp1 status</div><div class='add'>+gluster volume replace-brick mirror `hostname`:/exports/exp5 `hostname`:/exports/exp1 abort</div><div class='add'>+</div><div class='add'>+gluster volume info</div><div class='add'>+sleep 1</div><div class='add'>+df -h</div><div class='add'>+sleep 1</div><div class='add'>+</div><div class='ctx'> echo "removeing-brick....."</div><div class='del'>-gluster volume remove-brick mirror replica 2 `hostname`:/exports/exp3 `hostname`:/exports/exp4</div><div class='add'>+gluster --mode=script volume remove-brick mirror `hostname`:/exports/exp3 `hostname`:/exports/exp4</div><div class='ctx'> gluster volume info</div><div class='del'>-sleep 1 </div><div class='add'>+sleep 1</div><div class='ctx'> df -h</div><div class='ctx'> sleep 1</div><div class='ctx'> </div><div class='ctx'> echo "stopping replicate volume....."</div><div class='del'>-gluster volume stop mirror</div><div class='add'>+gluster --mode=script volume stop mirror</div><div class='ctx'> gluster volume info</div><div class='del'>-sleep 1 </div><div class='add'>+sleep 1</div><div class='ctx'> umount /mnt/client</div><div class='ctx'> df -h</div><div class='ctx'> </div><div class='ctx'> echo "deleting replicate volume....."</div><div class='del'>-gluster volume delete mirror</div><div class='add'>+gluster --mode=script volume delete mirror</div><div class='ctx'> gluster volume info</div><div class='ctx'> sleep 1</div><div class='ctx'> </div><div class='hunk'>@@ -150,41 +198,68 @@ gluster volume start str</div><div class='ctx'> gluster volume info</div><div class='ctx'> sleep 1</div><div class='ctx'> mount -t glusterfs `hostname`:str /mnt/client</div><div class='del'>-sleep 1 </div><div class='add'>+sleep 1</div><div class='ctx'> df -h</div><div class='ctx'> sleep 1</div><div class='ctx'> </div><div class='ctx'> echo "adding brick...."</div><div class='del'>-gluster volume add-brick str stripe 2 `hostname`:/exports/exp3 `hostname`:/exports/exp4</div><div class='add'>+gluster volume add-brick str `hostname`:/exports/exp3 `hostname`:/exports/exp4</div><div class='ctx'> gluster volume info</div><div class='del'>-sleep 1 </div><div class='add'>+sleep 1</div><div class='ctx'> df -h</div><div class='ctx'> sleep 1</div><div class='ctx'> </div><div class='ctx'> echo "replacing brick....."</div><div class='ctx'> gluster volume replace-brick str `hostname`:/exports/exp1 `hostname`:/exports/exp5 start</div><div class='add'>+#sleep for 5 seconds</div><div class='add'>+sleep 5</div><div class='ctx'> gluster volume replace-brick str `hostname`:/exports/exp1 `hostname`:/exports/exp5 status</div><div class='ctx'> gluster volume replace-brick str `hostname`:/exports/exp1 `hostname`:/exports/exp5 pause</div><div class='del'>-gluster volume replace-brick str `hostname`:/exports/exp1 `hostname`:/exports/exp5 abort</div><div class='add'>+gluster volume replace-brick str `hostname`:/exports/exp1 `hostname`:/exports/exp5 status</div><div class='add'>+gluster volume replace-brick str `hostname`:/exports/exp1 `hostname`:/exports/exp5 start</div><div class='add'>+#sleep for 5 seconds</div><div class='add'>+sleep 5</div><div class='add'>+gluster volume replace-brick str `hostname`:/exports/exp1 `hostname`:/exports/exp5 status</div><div class='ctx'> gluster volume replace-brick str `hostname`:/exports/exp1 `hostname`:/exports/exp5 commit</div><div class='add'>+</div><div class='add'>+gluster volume info</div><div class='add'>+sleep 1</div><div class='add'>+df -h</div><div class='add'>+sleep 1</div><div class='add'>+</div><div class='add'>+echo "replacing brick for abort operation"</div><div class='add'>+gluster volume replace-brick str `hostname`:/exports/exp5 `hostname`:/exports/exp1 start</div><div class='add'>+#sleep for 5 seconds</div><div class='add'>+sleep 5</div><div class='add'>+gluster volume replace-brick str `hostname`:/exports/exp5 `hostname`:/exports/exp1 status</div><div class='add'>+gluster volume replace-brick str `hostname`:/exports/exp5 `hostname`:/exports/exp1 pause</div><div class='add'>+gluster volume replace-brick str `hostname`:/exports/exp5 `hostname`:/exports/exp1 status</div><div class='add'>+gluster volume replace-brick str `hostname`:/exports/exp5 `hostname`:/exports/exp1 start</div><div class='add'>+#sleep for 5 seconds</div><div class='add'>+sleep 5</div><div class='add'>+gluster volume replace-brick str `hostname`:/exports/exp5 `hostname`:/exports/exp1 status</div><div class='add'>+gluster volume replace-brick str `hostname`:/exports/exp5 `hostname`:/exports/exp1 abort</div><div class='add'>+</div><div class='ctx'> gluster volume info</div><div class='ctx'> sleep 1</div><div class='ctx'> df -h</div><div class='add'>+sleep 1</div><div class='ctx'> </div><div class='ctx'> echo "removing-brick....."</div><div class='del'>-gluster volume remove-brick str stripe 2 `hostname`:/exports/exp3 `hostname`:/exports/exp4</div><div class='add'>+gluster --mode=script volume remove-brick str `hostname`:/exports/exp3 `hostname`:/exports/exp4</div><div class='ctx'> gluster volume info</div><div class='ctx'> sleep 1</div><div class='ctx'> df -h</div><div class='ctx'> sleep 1</div><div class='ctx'> </div><div class='ctx'> echo "stopping stripe volume....."</div><div class='del'>-gluster volume stop str</div><div class='add'>+gluster --mode=script volume stop str</div><div class='ctx'> gluster volume info</div><div class='ctx'> sleep 1</div><div class='ctx'> umount /mnt/client</div><div class='ctx'> df -h</div><div class='ctx'> </div><div class='ctx'> echo "deleting stripe volume....."</div><div class='del'>-gluster volume delete str</div><div class='add'>+gluster --mode=script volume delete str</div><div class='ctx'> gluster volume info</div><div class='add'>+</div><div class='head'>diff --git a/extras/test/ld-preload-test/README b/extras/test/ld-preload-test/README<br/>index 725b94023c8..df80003844b 100644<br/>--- a/<a href='/cgit/glusterfs.git/tree/extras/test/ld-preload-test/README?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/test/ld-preload-test/README</a><br/>+++ b/<a href='/cgit/glusterfs.git/tree/extras/test/ld-preload-test/README?id=d1d7a6f35c816822fab51c820e25023863c239c1'>extras/test/ld-preload-test/README</a></div><div class='hunk'>@@ -32,9 +32,9 @@ Instructions</div><div class='ctx'>         $ make</div><div class='ctx'> </div><div class='ctx'> (We've tested the tool on Debian and CentOS. If there are build errors or</div><div class='del'>-warnings, please do report them to glusterfs-devel@nongnu.org.)</div><div class='add'>+warnings, please do report them to gluster-devel@gluster.org.)</div><div class='ctx'> </div><div class='ctx'> 2. Run the test.</div><div class='ctx'>         $ ./test-preload.sh &gt; preload.log</div><div class='ctx'> </div><div class='del'>-3. Mail the log to glusterfs-devel@nongnu.org.</div><div class='add'>+3. Mail the log to gluster-devel@gluster.org.</div><div class='head'>diff --git a/extras/test/ld-preload-test/ld-preload-lib.c b/extras/test/ld-preload-test/ld-preload-lib.c<br/>index 18ee3b993da..d120c053a69 100644<br/>--- a/<a href='/cgit/glusterfs.git/tree/extras/test/ld-preload-test/ld-preload-lib.c?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/test/ld-preload-test/ld-preload-lib.c</a><br/>+++ b/<a href='/cgit/glusterfs.git/tree/extras/test/ld-preload-test/ld-preload-lib.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>extras/test/ld-preload-test/ld-preload-lib.c</a></div><div class='hunk'>@@ -1,23 +1,13 @@</div><div class='ctx'> /*</div><div class='del'>-   Copyright (c) 2007-2009 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='add'>+   Copyright (c) 2007-2012 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='ctx'>    This file is part of GlusterFS.</div><div class='ctx'> </div><div class='del'>-   GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-   it under the terms of the GNU General Public License as published</div><div class='del'>-   by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-   or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-   GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-   WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-   General Public License for more details.</div><div class='del'>-</div><div class='del'>-   You should have received a copy of the GNU General Public License</div><div class='del'>-   along with this program.  If not, see</div><div class='del'>-   &lt;http://www.gnu.org/licenses/&gt;.</div><div class='add'>+   This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+   General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+   later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+   cases as published by the Free Software Foundation.</div><div class='ctx'> */</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> /* LD PRELOAD'able library</div><div class='ctx'>  * A very simple library that intercepts booster supported system calls</div><div class='ctx'>  * and prints a log message to stdout.</div><div class='hunk'>@@ -44,594 +34,582 @@</div><div class='ctx'> #include &lt;fcntl.h&gt;</div><div class='ctx'> #include &lt;sys/stat.h&gt;</div><div class='ctx'> #include &lt;dirent.h&gt;</div><div class='del'>-#include &lt;attr/xattr.h&gt;</div><div class='add'>+#include &lt;sys/xattr.h&gt;</div><div class='ctx'> #include &lt;sys/sendfile.h&gt;</div><div class='ctx'> </div><div class='ctx'> /* Err number that is assigned to errno so that test application can</div><div class='ctx'>  * verify that the function was intercepted correctly.</div><div class='ctx'>  */</div><div class='del'>-#define PRELOAD_ERRNO_VERF      6449</div><div class='del'>-#define set_errno()             (errno = PRELOAD_ERRNO_VERF)</div><div class='add'>+#define PRELOAD_ERRNO_VERF 6449</div><div class='add'>+#define set_errno() (errno = PRELOAD_ERRNO_VERF)</div><div class='ctx'> </div><div class='del'>-inline void</div><div class='del'>-intercept (char *call, int tabs)</div><div class='add'>+void</div><div class='add'>+intercept(char *call, int tabs)</div><div class='ctx'> {</div><div class='del'>-        while (tabs &gt; 0) {</div><div class='del'>-                fprintf (stdout, "\t");</div><div class='del'>-                --tabs;</div><div class='del'>-        }</div><div class='add'>+    while (tabs &gt; 0) {</div><div class='add'>+        fprintf(stdout, "\t");</div><div class='add'>+        --tabs;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        fprintf (stdout, "Intercepted by %s", call);</div><div class='add'>+    fprintf(stdout, "Intercepted by %s", call);</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-creat64 (const char *pathname, mode_t mode)</div><div class='add'>+creat64(const char *pathname, mode_t mode)</div><div class='ctx'> {</div><div class='del'>-        intercept ("creat64", 2);</div><div class='del'>-        set_errno ();</div><div class='del'>-        return -1;</div><div class='add'>+    intercept("creat64", 2);</div><div class='add'>+    set_errno();</div><div class='add'>+    return -1;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-creat (const char *pathname, mode_t mode)</div><div class='add'>+creat(const char *pathname, mode_t mode)</div><div class='ctx'> {</div><div class='del'>-        intercept ("creat", 2);</div><div class='del'>-        set_errno ();</div><div class='del'>-        return -1;</div><div class='add'>+    intercept("creat", 2);</div><div class='add'>+    set_errno();</div><div class='add'>+    return -1;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-close (int fd)</div><div class='add'>+close(int fd)</div><div class='ctx'> {</div><div class='del'>-        intercept ("close", 2);</div><div class='del'>-        set_errno ();</div><div class='del'>-        return -1;</div><div class='add'>+    intercept("close", 2);</div><div class='add'>+    set_errno();</div><div class='add'>+    return -1;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-open64 (const char *pathname, int flags, ...)</div><div class='add'>+open64(const char *pathname, int flags, ...)</div><div class='ctx'> {</div><div class='del'>-        intercept ("open64", 2);</div><div class='del'>-        set_errno ();</div><div class='del'>-        return -1;</div><div class='add'>+    intercept("open64", 2);</div><div class='add'>+    set_errno();</div><div class='add'>+    return -1;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-open (const char *pathname, int flags, ...)</div><div class='add'>+open(const char *pathname, int flags, ...)</div><div class='ctx'> {</div><div class='del'>-        intercept ("open", 2);</div><div class='del'>-        set_errno ();</div><div class='del'>-        return -1;</div><div class='add'>+    intercept("open", 2);</div><div class='add'>+    set_errno();</div><div class='add'>+    return -1;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> ssize_t</div><div class='del'>-read (int fd, void *buf, size_t count)</div><div class='add'>+read(int fd, void *buf, size_t count)</div><div class='ctx'> {</div><div class='del'>-        intercept ("read", 2);</div><div class='del'>-        set_errno ();</div><div class='del'>-        return -1;</div><div class='add'>+    intercept("read", 2);</div><div class='add'>+    set_errno();</div><div class='add'>+    return -1;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> ssize_t</div><div class='del'>-readv (int fd, const struct iovec *vector, int count)</div><div class='add'>+readv(int fd, const struct iovec *vector, int count)</div><div class='ctx'> {</div><div class='del'>-        intercept ("readv", 2);</div><div class='del'>-        set_errno ();</div><div class='del'>-        return -1;</div><div class='add'>+    intercept("readv", 2);</div><div class='add'>+    set_errno();</div><div class='add'>+    return -1;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> ssize_t</div><div class='del'>-pread (int fd, void *buf, size_t count, unsigned long offset)</div><div class='add'>+pread(int fd, void *buf, size_t count, unsigned long offset)</div><div class='ctx'> {</div><div class='del'>-        intercept ("pread", 2);</div><div class='del'>-        set_errno ();</div><div class='del'>-        return -1;</div><div class='add'>+    intercept("pread", 2);</div><div class='add'>+    set_errno();</div><div class='add'>+    return -1;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> ssize_t</div><div class='del'>-pread64 (int fd, void *buf, size_t count, uint64_t offset)</div><div class='add'>+pread64(int fd, void *buf, size_t count, uint64_t offset)</div><div class='ctx'> {</div><div class='del'>-        intercept ("pread64", 2);</div><div class='del'>-        set_errno ();</div><div class='del'>-        return -1;</div><div class='add'>+    intercept("pread64", 2);</div><div class='add'>+    set_errno();</div><div class='add'>+    return -1;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> ssize_t</div><div class='del'>-write (int fd, const void *buf, size_t count)</div><div class='add'>+write(int fd, const void *buf, size_t count)</div><div class='ctx'> {</div><div class='del'>-        intercept ("write", 2);</div><div class='del'>-        set_errno ();</div><div class='del'>-        return -1;</div><div class='add'>+    intercept("write", 2);</div><div class='add'>+    set_errno();</div><div class='add'>+    return -1;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> ssize_t</div><div class='del'>-writev (int fd, const struct iovec *vector, int count)</div><div class='add'>+writev(int fd, const struct iovec *vector, int count)</div><div class='ctx'> {</div><div class='del'>-        intercept ("writev", 2);</div><div class='del'>-        set_errno ();</div><div class='del'>-        return -1;</div><div class='add'>+    intercept("writev", 2);</div><div class='add'>+    set_errno();</div><div class='add'>+    return -1;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> ssize_t</div><div class='del'>-pwrite (int fd, const void *buf, size_t count, unsigned long offset)</div><div class='add'>+pwrite(int fd, const void *buf, size_t count, unsigned long offset)</div><div class='ctx'> {</div><div class='del'>-        intercept ("pwrite", 2);</div><div class='del'>-        set_errno ();</div><div class='del'>-        return -1;</div><div class='add'>+    intercept("pwrite", 2);</div><div class='add'>+    set_errno();</div><div class='add'>+    return -1;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> ssize_t</div><div class='del'>-pwrite64 (int fd, const void *buf, size_t count, uint64_t offset)</div><div class='add'>+pwrite64(int fd, const void *buf, size_t count, uint64_t offset)</div><div class='ctx'> {</div><div class='del'>-        intercept ("pwrite64", 2);</div><div class='del'>-        set_errno ();</div><div class='del'>-        return -1;</div><div class='add'>+    intercept("pwrite64", 2);</div><div class='add'>+    set_errno();</div><div class='add'>+    return -1;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> off_t</div><div class='del'>-lseek (int fildes, unsigned long offset, int whence)</div><div class='add'>+lseek(int fildes, unsigned long offset, int whence)</div><div class='ctx'> {</div><div class='del'>-        intercept ("lseek", 2);</div><div class='del'>-        set_errno ();</div><div class='del'>-        return -1;</div><div class='add'>+    intercept("lseek", 2);</div><div class='add'>+    set_errno();</div><div class='add'>+    return -1;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> off_t</div><div class='del'>-lseek64 (int fildes, uint64_t offset, int whence)</div><div class='add'>+lseek64(int fildes, uint64_t offset, int whence)</div><div class='ctx'> {</div><div class='del'>-        intercept ("lseek64", 2);</div><div class='del'>-        set_errno ();</div><div class='del'>-        return -1;</div><div class='add'>+    intercept("lseek64", 2);</div><div class='add'>+    set_errno();</div><div class='add'>+    return -1;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-dup (int fd)</div><div class='add'>+dup(int fd)</div><div class='ctx'> {</div><div class='del'>-        intercept ("dup", 2);</div><div class='del'>-        set_errno ();</div><div class='del'>-        return -1;</div><div class='add'>+    intercept("dup", 2);</div><div class='add'>+    set_errno();</div><div class='add'>+    return -1;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-dup2 (int oldfd, int newfd)</div><div class='add'>+dup2(int oldfd, int newfd)</div><div class='ctx'> {</div><div class='del'>-        intercept ("dup2", 2);</div><div class='del'>-        set_errno ();</div><div class='del'>-        return -1;</div><div class='add'>+    intercept("dup2", 2);</div><div class='add'>+    set_errno();</div><div class='add'>+    return -1;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-mkdir (const char *pathname, mode_t mode)</div><div class='add'>+mkdir(const char *pathname, mode_t mode)</div><div class='ctx'> {</div><div class='del'>-        intercept ("mkdir", 2);</div><div class='del'>-        set_errno ();</div><div class='del'>-        return -1;</div><div class='add'>+    intercept("mkdir", 2);</div><div class='add'>+    set_errno();</div><div class='add'>+    return -1;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-rmdir (const char *pathname)</div><div class='add'>+rmdir(const char *pathname)</div><div class='ctx'> {</div><div class='del'>-        intercept ("rmdir", 2);</div><div class='del'>-        set_errno ();</div><div class='del'>-        return -1;</div><div class='add'>+    intercept("rmdir", 2);</div><div class='add'>+    set_errno();</div><div class='add'>+    return -1;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-chmod (const char *pathname, mode_t mode)</div><div class='add'>+chmod(const char *pathname, mode_t mode)</div><div class='ctx'> {</div><div class='del'>-        intercept ("chmod", 2);</div><div class='del'>-        set_errno ();</div><div class='del'>-        return -1;</div><div class='add'>+    intercept("chmod", 2);</div><div class='add'>+    set_errno();</div><div class='add'>+    return -1;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-chown (const char *pathname, uid_t owner, gid_t group)</div><div class='add'>+chown(const char *pathname, uid_t owner, gid_t group)</div><div class='ctx'> {</div><div class='del'>-        intercept ("chown", 2);</div><div class='del'>-        set_errno ();</div><div class='del'>-        return -1;</div><div class='add'>+    intercept("chown", 2);</div><div class='add'>+    set_errno();</div><div class='add'>+    return -1;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-fchmod (int fd, mode_t mode)</div><div class='add'>+fchmod(int fd, mode_t mode)</div><div class='ctx'> {</div><div class='del'>-        intercept ("fchmod", 2);</div><div class='del'>-        set_errno ();</div><div class='del'>-        return -1;</div><div class='add'>+    intercept("fchmod", 2);</div><div class='add'>+    set_errno();</div><div class='add'>+    return -1;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-fchown (int fd, uid_t uid, gid_t gid)</div><div class='add'>+fchown(int fd, uid_t uid, gid_t gid)</div><div class='ctx'> {</div><div class='del'>-        intercept ("fchown", 2);</div><div class='del'>-        set_errno ();</div><div class='del'>-        return -1;</div><div class='add'>+    intercept("fchown", 2);</div><div class='add'>+    set_errno();</div><div class='add'>+    return -1;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-int fsync (int fd)</div><div class='add'>+int</div><div class='add'>+fsync(int fd)</div><div class='ctx'> {</div><div class='del'>-        intercept ("fsync", 2);</div><div class='del'>-        set_errno ();</div><div class='del'>-        return -1;</div><div class='add'>+    intercept("fsync", 2);</div><div class='add'>+    set_errno();</div><div class='add'>+    return -1;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-ftruncate (int fd, off_t length)</div><div class='add'>+ftruncate(int fd, off_t length)</div><div class='ctx'> {</div><div class='del'>-        intercept ("ftruncate", 1);</div><div class='del'>-        set_errno ();</div><div class='del'>-        return -1;</div><div class='add'>+    intercept("ftruncate", 1);</div><div class='add'>+    set_errno();</div><div class='add'>+    return -1;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-ftruncate64 (int fd, off_t length)</div><div class='add'>+ftruncate64(int fd, off_t length)</div><div class='ctx'> {</div><div class='del'>-        intercept ("ftruncate64", 1);</div><div class='del'>-        set_errno ();</div><div class='del'>-        return -1;</div><div class='add'>+    intercept("ftruncate64", 1);</div><div class='add'>+    set_errno();</div><div class='add'>+    return -1;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-link (const char *oldpath, const char *newname)</div><div class='add'>+link(const char *oldpath, const char *newname)</div><div class='ctx'> {</div><div class='del'>-        intercept ("link", 2);</div><div class='del'>-        set_errno ();</div><div class='del'>-        return -1;</div><div class='add'>+    intercept("link", 2);</div><div class='add'>+    set_errno();</div><div class='add'>+    return -1;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-rename (const char *oldpath, const char *newpath)</div><div class='add'>+rename(const char *oldpath, const char *newpath)</div><div class='ctx'> {</div><div class='del'>-        intercept ("rename", 2);</div><div class='del'>-        set_errno ();</div><div class='del'>-        return -1;</div><div class='add'>+    intercept("rename", 2);</div><div class='add'>+    set_errno();</div><div class='add'>+    return -1;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-utimes (const char *path, const struct timeval times[2])</div><div class='add'>+utimes(const char *path, const struct timeval times[2])</div><div class='ctx'> {</div><div class='del'>-        intercept ("utimes", 2);</div><div class='del'>-        set_errno ();</div><div class='del'>-        return -1;</div><div class='add'>+    intercept("utimes", 2);</div><div class='add'>+    set_errno();</div><div class='add'>+    return -1;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-utime (const char *path, const struct utimbuf *buf)</div><div class='add'>+futimes(int fd, const struct timeval times[2])</div><div class='ctx'> {</div><div class='del'>-        intercept ("utime", 2);</div><div class='del'>-        set_errno ();</div><div class='del'>-        return -1;</div><div class='add'>+    intercept("futimes", 2);</div><div class='add'>+    set_errno();</div><div class='add'>+    return -1;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-mknod (const char *path, mode_t mode, dev_t dev)</div><div class='add'>+utime(const char *path, const struct utimbuf *buf)</div><div class='ctx'> {</div><div class='del'>-        intercept ("mknod", 2);</div><div class='del'>-        set_errno ();</div><div class='del'>-        return -1;</div><div class='add'>+    intercept("utime", 2);</div><div class='add'>+    set_errno();</div><div class='add'>+    return -1;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-__xmknod (int ver, const char *path, mode_t mode, dev_t *dev)</div><div class='add'>+mknod(const char *path, mode_t mode, dev_t dev)</div><div class='ctx'> {</div><div class='del'>-        intercept ("__xmknod", 2);</div><div class='del'>-        set_errno ();</div><div class='del'>-        return -1;</div><div class='add'>+    intercept("mknod", 2);</div><div class='add'>+    set_errno();</div><div class='add'>+    return -1;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-mkfifo (const char *path, mode_t mode)</div><div class='add'>+__xmknod(int ver, const char *path, mode_t mode, dev_t *dev)</div><div class='ctx'> {</div><div class='del'>-        intercept ("mkfifo", 2);</div><div class='del'>-        set_errno ();</div><div class='del'>-        return -1;</div><div class='add'>+    intercept("__xmknod", 2);</div><div class='add'>+    set_errno();</div><div class='add'>+    return -1;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-unlink (const char *path)</div><div class='add'>+mkfifo(const char *path, mode_t mode)</div><div class='ctx'> {</div><div class='del'>-        intercept ("unlink", 2);</div><div class='del'>-        set_errno ();</div><div class='del'>-        return -1;</div><div class='add'>+    intercept("mkfifo", 2);</div><div class='add'>+    set_errno();</div><div class='add'>+    return -1;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-symlink (const char *oldpath, const char *newpath)</div><div class='add'>+unlink(const char *path)</div><div class='ctx'> {</div><div class='del'>-        intercept ("symlink", 2);</div><div class='del'>-        set_errno ();</div><div class='del'>-        return -1;</div><div class='add'>+    intercept("unlink", 2);</div><div class='add'>+    set_errno();</div><div class='add'>+    return -1;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-readlink (const char *path, char *buf, size_t bufsize)</div><div class='add'>+symlink(const char *oldpath, const char *newpath)</div><div class='ctx'> {</div><div class='del'>-        intercept ("readlink", 1);</div><div class='del'>-        set_errno ();</div><div class='del'>-        return -1;</div><div class='add'>+    intercept("symlink", 2);</div><div class='add'>+    set_errno();</div><div class='add'>+    return -1;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+int</div><div class='add'>+readlink(const char *path, char *buf, size_t bufsize)</div><div class='add'>+{</div><div class='add'>+    intercept("readlink", 1);</div><div class='add'>+    set_errno();</div><div class='add'>+    return -1;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> char *</div><div class='del'>-realpath (const char *path, char *resolved)</div><div class='add'>+realpath(const char *path, char *resolved)</div><div class='ctx'> {</div><div class='del'>-        intercept ("realpath", 1);</div><div class='del'>-        set_errno ();</div><div class='del'>-        return NULL;</div><div class='add'>+    intercept("realpath", 1);</div><div class='add'>+    set_errno();</div><div class='add'>+    return NULL;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> DIR *</div><div class='del'>-opendir (const char *path)</div><div class='add'>+opendir(const char *path)</div><div class='ctx'> {</div><div class='del'>-        intercept ("opendir", 2);</div><div class='del'>-        set_errno ();</div><div class='del'>-        return NULL;</div><div class='add'>+    intercept("opendir", 2);</div><div class='add'>+    set_errno();</div><div class='add'>+    return NULL;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> struct dirent *</div><div class='del'>-readdir (DIR *dir)</div><div class='add'>+readdir(DIR *dir)</div><div class='ctx'> {</div><div class='del'>-        intercept ("readdir\t", 2);</div><div class='del'>-        set_errno ();</div><div class='del'>-        return NULL;</div><div class='add'>+    intercept("readdir\t", 2);</div><div class='add'>+    set_errno();</div><div class='add'>+    return NULL;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> struct dirent *</div><div class='del'>-readdir64 (DIR *dir)</div><div class='add'>+readdir64(DIR *dir)</div><div class='ctx'> {</div><div class='del'>-        intercept ("readdir64", 2);</div><div class='del'>-        set_errno ();</div><div class='del'>-        return NULL;</div><div class='add'>+    intercept("readdir64", 2);</div><div class='add'>+    set_errno();</div><div class='add'>+    return NULL;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-readdir_r (DIR *dir, struct dirent *entry, struct dirent **result)</div><div class='add'>+readdir_r(DIR *dir, struct dirent *entry, struct dirent **result)</div><div class='ctx'> {</div><div class='del'>-        intercept ("readdir_r", 1);</div><div class='del'>-        set_errno ();</div><div class='del'>-        return -1;</div><div class='add'>+    intercept("readdir_r", 1);</div><div class='add'>+    set_errno();</div><div class='add'>+    return -1;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-readdir64_r (DIR *dir, struct dirent *entry, struct dirent **result)</div><div class='add'>+readdir64_r(DIR *dir, struct dirent *entry, struct dirent **result)</div><div class='ctx'> {</div><div class='del'>-        intercept ("readdir64_r", 1);</div><div class='del'>-        set_errno ();</div><div class='del'>-        return -1;</div><div class='add'>+    intercept("readdir64_r", 1);</div><div class='add'>+    set_errno();</div><div class='add'>+    return -1;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-closedir (DIR *dh)</div><div class='add'>+closedir(DIR *dh)</div><div class='ctx'> {</div><div class='del'>-        intercept ("closedir", 1);</div><div class='del'>-        set_errno ();</div><div class='del'>-        return -1;</div><div class='add'>+    intercept("closedir", 1);</div><div class='add'>+    set_errno();</div><div class='add'>+    return -1;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-__xstat (int ver, const char *path, struct stat *buf)</div><div class='add'>+__xstat(int ver, const char *path, struct stat *buf)</div><div class='ctx'> {</div><div class='del'>-        intercept ("__xstat\t", 2);</div><div class='del'>-        set_errno ();</div><div class='del'>-        return -1;</div><div class='add'>+    intercept("__xstat\t", 2);</div><div class='add'>+    set_errno();</div><div class='add'>+    return -1;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-__xstat64 (int ver, const char *path, struct stat *buf)</div><div class='add'>+__xstat64(int ver, const char *path, struct stat *buf)</div><div class='ctx'> {</div><div class='del'>-        intercept ("__xstat64", 2);</div><div class='del'>-        set_errno ();</div><div class='del'>-        return -1;</div><div class='add'>+    intercept("__xstat64", 2);</div><div class='add'>+    set_errno();</div><div class='add'>+    return -1;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-stat (const char *path, struct stat *buf)</div><div class='add'>+stat(const char *path, struct stat *buf)</div><div class='ctx'> {</div><div class='del'>-        intercept ("stat", 2);</div><div class='del'>-        set_errno ();</div><div class='del'>-        return -1;</div><div class='add'>+    intercept("stat", 2);</div><div class='add'>+    set_errno();</div><div class='add'>+    return -1;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-stat64 (const char *path, struct stat *buf)</div><div class='add'>+stat64(const char *path, struct stat *buf)</div><div class='ctx'> {</div><div class='del'>-        intercept ("stat64", 2);</div><div class='del'>-        set_errno ();</div><div class='del'>-        return -1;</div><div class='add'>+    intercept("stat64", 2);</div><div class='add'>+    set_errno();</div><div class='add'>+    return -1;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-__fxstat (int ver, int fd, struct stat *buf)</div><div class='add'>+__fxstat(int ver, int fd, struct stat *buf)</div><div class='ctx'> {</div><div class='del'>-        intercept ("__fxstat\t", 2);</div><div class='del'>-        set_errno ();</div><div class='del'>-        return -1;</div><div class='add'>+    intercept("__fxstat\t", 2);</div><div class='add'>+    set_errno();</div><div class='add'>+    return -1;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-__fxstat64 (int ver, int fd, struct stat *buf)</div><div class='add'>+__fxstat64(int ver, int fd, struct stat *buf)</div><div class='ctx'> {</div><div class='del'>-        intercept ("__fxstat64", 2);</div><div class='del'>-        set_errno ();</div><div class='del'>-        return -1;</div><div class='add'>+    intercept("__fxstat64", 2);</div><div class='add'>+    set_errno();</div><div class='add'>+    return -1;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-fstat (int fd, struct stat *buf)</div><div class='add'>+fstat(int fd, struct stat *buf)</div><div class='ctx'> {</div><div class='del'>-        intercept ("fstat", 2);</div><div class='del'>-        set_errno ();</div><div class='del'>-        return -1;</div><div class='add'>+    intercept("fstat", 2);</div><div class='add'>+    set_errno();</div><div class='add'>+    return -1;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-fstat64 (int fd , struct stat *buf)</div><div class='add'>+fstat64(int fd, struct stat *buf)</div><div class='ctx'> {</div><div class='del'>-        intercept ("fstat64", 2);</div><div class='del'>-        set_errno ();</div><div class='del'>-        return -1;</div><div class='add'>+    intercept("fstat64", 2);</div><div class='add'>+    set_errno();</div><div class='add'>+    return -1;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-__lxstat (int ver, const char *path, struct stat *buf)</div><div class='add'>+__lxstat(int ver, const char *path, struct stat *buf)</div><div class='ctx'> {</div><div class='del'>-        intercept ("__lxstat\t", 2);</div><div class='del'>-        set_errno ();</div><div class='del'>-        return -1;</div><div class='add'>+    intercept("__lxstat\t", 2);</div><div class='add'>+    set_errno();</div><div class='add'>+    return -1;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-__lxstat64 (int ver, const char *path, struct stat *buf)</div><div class='add'>+__lxstat64(int ver, const char *path, struct stat *buf)</div><div class='ctx'> {</div><div class='del'>-        intercept ("__lxstat64", 2);</div><div class='del'>-        set_errno ();</div><div class='del'>-        return -1;</div><div class='add'>+    intercept("__lxstat64", 2);</div><div class='add'>+    set_errno();</div><div class='add'>+    return -1;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-lstat (const char *path, struct stat *buf)</div><div class='add'>+lstat(const char *path, struct stat *buf)</div><div class='ctx'> {</div><div class='del'>-        intercept ("lstat", 2);</div><div class='del'>-        set_errno ();</div><div class='del'>-        return -1;</div><div class='add'>+    intercept("lstat", 2);</div><div class='add'>+    set_errno();</div><div class='add'>+    return -1;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-lstat64 (const char *path, struct stat *buf)</div><div class='add'>+lstat64(const char *path, struct stat *buf)</div><div class='ctx'> {</div><div class='del'>-        intercept ("lstat64", 2);</div><div class='del'>-        set_errno ();</div><div class='del'>-        return -1;</div><div class='add'>+    intercept("lstat64", 2);</div><div class='add'>+    set_errno();</div><div class='add'>+    return -1;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-statfs (const char *path, struct statfs *buf)</div><div class='add'>+statfs(const char *path, struct statfs *buf)</div><div class='ctx'> {</div><div class='del'>-        intercept ("statfs", 2);</div><div class='del'>-        set_errno ();</div><div class='del'>-        return -1;</div><div class='add'>+    intercept("statfs", 2);</div><div class='add'>+    set_errno();</div><div class='add'>+    return -1;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-statfs64 (const char *path, struct statfs *buf)</div><div class='add'>+statfs64(const char *path, struct statfs *buf)</div><div class='ctx'> {</div><div class='del'>-        intercept ("statfs64", 2);</div><div class='del'>-        set_errno ();</div><div class='del'>-        return -1;</div><div class='add'>+    intercept("statfs64", 2);</div><div class='add'>+    set_errno();</div><div class='add'>+    return -1;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-statvfs (const char *path, struct statvfs *buf)</div><div class='add'>+statvfs(const char *path, struct statvfs *buf)</div><div class='ctx'> {</div><div class='del'>-        intercept ("statvfs\t", 2);</div><div class='del'>-        set_errno ();</div><div class='del'>-        return -1;</div><div class='add'>+    intercept("statvfs\t", 2);</div><div class='add'>+    set_errno();</div><div class='add'>+    return -1;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-statvfs64 (const char *path, struct statvfs *buf)</div><div class='add'>+statvfs64(const char *path, struct statvfs *buf)</div><div class='ctx'> {</div><div class='del'>-        intercept ("statvfs64", 2);</div><div class='del'>-        set_errno ();</div><div class='del'>-        return -1;</div><div class='add'>+    intercept("statvfs64", 2);</div><div class='add'>+    set_errno();</div><div class='add'>+    return -1;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> ssize_t</div><div class='del'>-getxattr (const char *path, const char *name, void *value, size_t size)</div><div class='add'>+getxattr(const char *path, const char *name, void *value, size_t size)</div><div class='ctx'> {</div><div class='del'>-        intercept ("getxattr", 1);</div><div class='del'>-        set_errno ();</div><div class='del'>-        return -1;</div><div class='add'>+    intercept("getxattr", 1);</div><div class='add'>+    set_errno();</div><div class='add'>+    return -1;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> ssize_t</div><div class='del'>-lgetxattr (const char *path, const char *name, void *value, size_t size)</div><div class='add'>+lgetxattr(const char *path, const char *name, void *value, size_t size)</div><div class='ctx'> {</div><div class='del'>-        intercept ("lgetxattr", 1);</div><div class='del'>-        set_errno ();</div><div class='del'>-        return -1;</div><div class='add'>+    intercept("lgetxattr", 1);</div><div class='add'>+    set_errno();</div><div class='add'>+    return -1;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-remove (const char* path)</div><div class='add'>+remove(const char *path)</div><div class='ctx'> {</div><div class='del'>-        intercept ("remove", 2);</div><div class='del'>-        set_errno ();</div><div class='del'>-        return -1;</div><div class='add'>+    intercept("remove", 2);</div><div class='add'>+    set_errno();</div><div class='add'>+    return -1;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-lchown (const char *path, uid_t owner, gid_t group)</div><div class='add'>+lchown(const char *path, uid_t owner, gid_t group)</div><div class='ctx'> {</div><div class='del'>-        intercept ("lchown", 2);</div><div class='del'>-        set_errno ();</div><div class='del'>-        return -1;</div><div class='add'>+    intercept("lchown", 2);</div><div class='add'>+    set_errno();</div><div class='add'>+    return -1;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> void</div><div class='del'>-rewinddir (DIR *dirp)</div><div class='add'>+rewinddir(DIR *dirp)</div><div class='ctx'> {</div><div class='del'>-        intercept ("rewinddir", 1);</div><div class='del'>-        set_errno ();</div><div class='del'>-        return;</div><div class='add'>+    intercept("rewinddir", 1);</div><div class='add'>+    set_errno();</div><div class='add'>+    return;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> void</div><div class='del'>-seekdir (DIR *dirp, off_t offset)</div><div class='add'>+seekdir(DIR *dirp, off_t offset)</div><div class='ctx'> {</div><div class='del'>-        intercept ("seekdir", 2);</div><div class='del'>-        set_errno ();</div><div class='del'>-        return;</div><div class='add'>+    intercept("seekdir", 2);</div><div class='add'>+    set_errno();</div><div class='add'>+    return;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> off_t</div><div class='del'>-telldir (DIR *dirp)</div><div class='add'>+telldir(DIR *dirp)</div><div class='ctx'> {</div><div class='del'>-        intercept ("telldir", 2);</div><div class='del'>-        set_errno ();</div><div class='del'>-        return -1;</div><div class='add'>+    intercept("telldir", 2);</div><div class='add'>+    set_errno();</div><div class='add'>+    return -1;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> ssize_t</div><div class='del'>-sendfile (int out_fd, int in_fd, off_t *offset, size_t count)</div><div class='add'>+sendfile(int out_fd, int in_fd, off_t *offset, size_t count)</div><div class='ctx'> {</div><div class='del'>-        intercept ("sendfile\t", 1);</div><div class='del'>-        set_errno ();</div><div class='del'>-        return -1;</div><div class='add'>+    intercept("sendfile\t", 1);</div><div class='add'>+    set_errno();</div><div class='add'>+    return -1;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> ssize_t</div><div class='del'>-sendfile64 (int out_fd, int in_fd, off_t *offset, size_t count)</div><div class='add'>+sendfile64(int out_fd, int in_fd, off_t *offset, size_t count)</div><div class='ctx'> {</div><div class='del'>-        intercept ("sendfile64", 1);</div><div class='del'>-        set_errno ();</div><div class='del'>-        return -1;</div><div class='add'>+    intercept("sendfile64", 1);</div><div class='add'>+    set_errno();</div><div class='add'>+    return -1;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-fcntl (int fd, int cmd, ...)</div><div class='add'>+fcntl(int fd, int cmd, ...)</div><div class='ctx'> {</div><div class='del'>-        intercept ("fcntl", 2);</div><div class='del'>-        set_errno ();</div><div class='del'>-        return -1;</div><div class='add'>+    intercept("fcntl", 2);</div><div class='add'>+    set_errno();</div><div class='add'>+    return -1;</div><div class='ctx'> }</div><div class='del'>-</div><div class='head'>diff --git a/extras/test/ld-preload-test/ld-preload-test.c b/extras/test/ld-preload-test/ld-preload-test.c<br/>index f98b1f4ee0e..54dde8c7d54 100644<br/>--- a/<a href='/cgit/glusterfs.git/tree/extras/test/ld-preload-test/ld-preload-test.c?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/test/ld-preload-test/ld-preload-test.c</a><br/>+++ b/<a href='/cgit/glusterfs.git/tree/extras/test/ld-preload-test/ld-preload-test.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>extras/test/ld-preload-test/ld-preload-test.c</a></div><div class='hunk'>@@ -1,23 +1,13 @@</div><div class='ctx'> /*</div><div class='del'>-   Copyright (c) 2007-2009 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='add'>+   Copyright (c) 2007-2012 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='ctx'>    This file is part of GlusterFS.</div><div class='ctx'> </div><div class='del'>-   GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-   it under the terms of the GNU General Public License as published</div><div class='del'>-   by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-   or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-   GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-   WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-   General Public License for more details.</div><div class='del'>-</div><div class='del'>-   You should have received a copy of the GNU General Public License</div><div class='del'>-   along with this program.  If not, see</div><div class='del'>-   &lt;http://www.gnu.org/licenses/&gt;.</div><div class='add'>+   This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+   General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+   later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+   cases as published by the Free Software Foundation.</div><div class='ctx'> */</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> /*</div><div class='ctx'>  * LD PRELOAD Test Tool</div><div class='ctx'>  *</div><div class='hunk'>@@ -56,322 +46,313 @@</div><div class='ctx'> #include &lt;sys/uio.h&gt;</div><div class='ctx'> #include &lt;utime.h&gt;</div><div class='ctx'> #include &lt;sys/time.h&gt;</div><div class='del'>-#include &lt;attr/xattr.h&gt;</div><div class='add'>+#include &lt;sys/xattr.h&gt;</div><div class='ctx'> #include &lt;sys/sendfile.h&gt;</div><div class='ctx'> </div><div class='del'>-</div><div class='del'>-#define PRELOAD_ERRNO_VERF      6449</div><div class='del'>-inline void</div><div class='add'>+#define PRELOAD_ERRNO_VERF 6449</div><div class='add'>+void</div><div class='ctx'> check_err(int ret, char *call, int tabs)</div><div class='ctx'> {</div><div class='del'>-        while (tabs &gt; 0) {</div><div class='del'>-                fprintf (stdout, "\t");</div><div class='del'>-                --tabs;</div><div class='del'>-        }</div><div class='del'>-        if (ret != -1) {</div><div class='del'>-                fprintf (stdout, "Not intercepted: %s\n", call);</div><div class='del'>-                return;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (errno != PRELOAD_ERRNO_VERF) {</div><div class='del'>-                fprintf (stdout, "Not intercepted: %s: err: %s\n", call,</div><div class='del'>-                         strerror (errno));</div><div class='del'>-                return;</div><div class='del'>-        }</div><div class='add'>+    while (tabs &gt; 0) {</div><div class='add'>+        fprintf(stdout, "\t");</div><div class='add'>+        --tabs;</div><div class='add'>+    }</div><div class='add'>+    if (ret != -1) {</div><div class='add'>+        fprintf(stdout, "Not intercepted: %s\n", call);</div><div class='add'>+        return;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        fprintf (stdout, "Intercept verified: %s\n", call);</div><div class='add'>+    if (errno != PRELOAD_ERRNO_VERF) {</div><div class='add'>+        fprintf(stdout, "Not intercepted: %s: err: %s\n", call,</div><div class='add'>+                strerror(errno));</div><div class='ctx'>         return;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    fprintf(stdout, "Intercept verified: %s\n", call);</div><div class='add'>+    return;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> void</div><div class='del'>-usage (FILE *fp)</div><div class='add'>+usage(FILE *fp)</div><div class='ctx'> {</div><div class='del'>-        fprintf (fp, "Usage: ld-preload-test &lt;Options&gt;\n");</div><div class='del'>-        fprintf (fp, "Options\n");</div><div class='del'>-        fprintf (fp, "\t--path\t\tPathname is used as the file/directory"</div><div class='del'>-                     " created for the test.\n");</div><div class='del'>-</div><div class='add'>+    fprintf(fp, "Usage: ld-preload-test &lt;Options&gt;\n");</div><div class='add'>+    fprintf(fp, "Options\n");</div><div class='add'>+    fprintf(fp,</div><div class='add'>+            "\t--path\t\tPathname is used as the file/directory"</div><div class='add'>+            " created for the test.\n");</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-run_file_tests (char *testfile)</div><div class='add'>+run_file_tests(char *testfile)</div><div class='ctx'> {</div><div class='del'>-        int             ret = -1;</div><div class='del'>-        struct stat     buf;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    struct stat buf;</div><div class='ctx'> </div><div class='del'>-        assert (testfile);</div><div class='del'>-        fprintf (stdout, "Testing creat");</div><div class='del'>-        ret = creat (testfile, S_IRWXU);</div><div class='del'>-        check_err (ret, "creat", 2);</div><div class='add'>+    assert(testfile);</div><div class='add'>+    fprintf(stdout, "Testing creat");</div><div class='add'>+    ret = creat(testfile, S_IRWXU);</div><div class='add'>+    check_err(ret, "creat", 2);</div><div class='ctx'> </div><div class='del'>-        fprintf (stdout, "Testing close");</div><div class='del'>-        ret = close (ret);</div><div class='del'>-        check_err (ret, "close", 2);</div><div class='add'>+    fprintf(stdout, "Testing close");</div><div class='add'>+    ret = close(ret);</div><div class='add'>+    check_err(ret, "close", 2);</div><div class='ctx'> </div><div class='del'>-        fprintf (stdout, "Testing open");</div><div class='del'>-        ret = open (testfile, O_RDONLY);</div><div class='del'>-        check_err (ret, "open", 2);</div><div class='add'>+    fprintf(stdout, "Testing open");</div><div class='add'>+    ret = open(testfile, O_RDONLY);</div><div class='add'>+    check_err(ret, "open", 2);</div><div class='ctx'> </div><div class='del'>-        fprintf (stdout, "Testing read");</div><div class='del'>-        ret = read (0, NULL, 0);</div><div class='del'>-        check_err (ret, "read", 2);</div><div class='add'>+    fprintf(stdout, "Testing read");</div><div class='add'>+    ret = read(0, NULL, 0);</div><div class='add'>+    check_err(ret, "read", 2);</div><div class='ctx'> </div><div class='del'>-        fprintf (stdout, "Testing readv");</div><div class='del'>-        ret = readv (0, NULL, 0);</div><div class='del'>-        check_err (ret, "readv", 2);</div><div class='add'>+    fprintf(stdout, "Testing readv");</div><div class='add'>+    ret = readv(0, NULL, 0);</div><div class='add'>+    check_err(ret, "readv", 2);</div><div class='ctx'> </div><div class='del'>-        fprintf (stdout, "Testing pread");</div><div class='del'>-        ret = pread (0, NULL, 0, 0);</div><div class='del'>-        check_err (ret, "pread", 2);</div><div class='add'>+    fprintf(stdout, "Testing pread");</div><div class='add'>+    ret = pread(0, NULL, 0, 0);</div><div class='add'>+    check_err(ret, "pread", 2);</div><div class='ctx'> </div><div class='del'>-        fprintf (stdout, "Testing write");</div><div class='del'>-        ret = write (0, NULL, 0);</div><div class='del'>-        check_err (ret, "write", 2);</div><div class='add'>+    fprintf(stdout, "Testing write");</div><div class='add'>+    ret = write(0, NULL, 0);</div><div class='add'>+    check_err(ret, "write", 2);</div><div class='ctx'> </div><div class='del'>-        fprintf (stdout, "Testing writev");</div><div class='del'>-        ret = writev (0, NULL, 0);</div><div class='del'>-        check_err (ret, "writev", 2);</div><div class='add'>+    fprintf(stdout, "Testing writev");</div><div class='add'>+    ret = writev(0, NULL, 0);</div><div class='add'>+    check_err(ret, "writev", 2);</div><div class='ctx'> </div><div class='del'>-        fprintf (stdout, "Testing pwrite");</div><div class='del'>-        ret = pwrite (0, NULL, 0, 0);</div><div class='del'>-        check_err (ret, "pwrite", 2);</div><div class='add'>+    fprintf(stdout, "Testing pwrite");</div><div class='add'>+    ret = pwrite(0, NULL, 0, 0);</div><div class='add'>+    check_err(ret, "pwrite", 2);</div><div class='ctx'> </div><div class='del'>-        fprintf (stdout, "Testing lseek");</div><div class='del'>-        ret = lseek (0, 0, 0);</div><div class='del'>-        check_err (ret, "lseek", 2);</div><div class='add'>+    fprintf(stdout, "Testing lseek");</div><div class='add'>+    ret = lseek(0, 0, 0);</div><div class='add'>+    check_err(ret, "lseek", 2);</div><div class='ctx'> </div><div class='del'>-        fprintf (stdout, "Testing dup");</div><div class='del'>-        ret = dup (0);</div><div class='del'>-        check_err (ret, "dup", 2);</div><div class='add'>+    fprintf(stdout, "Testing dup");</div><div class='add'>+    ret = dup(0);</div><div class='add'>+    check_err(ret, "dup", 2);</div><div class='ctx'> </div><div class='del'>-        fprintf (stdout, "Testing dup2");</div><div class='del'>-        ret = dup2 (0, 0);</div><div class='del'>-        check_err (ret, "dup2", 2);</div><div class='add'>+    fprintf(stdout, "Testing dup2");</div><div class='add'>+    ret = dup2(0, 0);</div><div class='add'>+    check_err(ret, "dup2", 2);</div><div class='ctx'> </div><div class='del'>-        fprintf (stdout, "Testing fchmod");</div><div class='del'>-        ret = fchmod (0, 0);</div><div class='del'>-        check_err (ret, "fchmod", 2);</div><div class='add'>+    fprintf(stdout, "Testing fchmod");</div><div class='add'>+    ret = fchmod(0, 0);</div><div class='add'>+    check_err(ret, "fchmod", 2);</div><div class='ctx'> </div><div class='del'>-        fprintf (stdout, "Testing fchown");</div><div class='del'>-        ret = fchown (0, 0, 0);</div><div class='del'>-        check_err (ret, "fchown", 2);</div><div class='add'>+    fprintf(stdout, "Testing fchown");</div><div class='add'>+    ret = fchown(0, 0, 0);</div><div class='add'>+    check_err(ret, "fchown", 2);</div><div class='ctx'> </div><div class='del'>-        fprintf (stdout, "Testing fsync");</div><div class='del'>-        ret = fsync (0);</div><div class='del'>-        check_err (ret, "fsync", 2);</div><div class='add'>+    fprintf(stdout, "Testing fsync");</div><div class='add'>+    ret = fsync(0);</div><div class='add'>+    check_err(ret, "fsync", 2);</div><div class='ctx'> </div><div class='del'>-        fprintf (stdout, "Testing ftruncate");</div><div class='del'>-        ret = ftruncate (0, 0);</div><div class='del'>-        check_err (ret, "ftruncate", 1);</div><div class='add'>+    fprintf(stdout, "Testing ftruncate");</div><div class='add'>+    ret = ftruncate(0, 0);</div><div class='add'>+    check_err(ret, "ftruncate", 1);</div><div class='ctx'> </div><div class='del'>-        fprintf (stdout, "Testing fstat");</div><div class='del'>-        ret = fstat (0, &amp;buf);</div><div class='del'>-        check_err (ret, "fstat", 1);</div><div class='add'>+    fprintf(stdout, "Testing fstat");</div><div class='add'>+    ret = fstat(0, &amp;buf);</div><div class='add'>+    check_err(ret, "fstat", 1);</div><div class='ctx'> </div><div class='del'>-        fprintf (stdout, "Testing sendfile");</div><div class='del'>-        ret = sendfile (0, 0, NULL, 0);</div><div class='del'>-        check_err (ret, "sendfile", 1);</div><div class='add'>+    fprintf(stdout, "Testing sendfile");</div><div class='add'>+    ret = sendfile(0, 0, NULL, 0);</div><div class='add'>+    check_err(ret, "sendfile", 1);</div><div class='ctx'> </div><div class='del'>-        fprintf (stdout, "Testing fcntl");</div><div class='del'>-        ret = fcntl (0, 0, NULL);</div><div class='del'>-        check_err (ret, "fcntl", 2);</div><div class='add'>+    fprintf(stdout, "Testing fcntl");</div><div class='add'>+    ret = fcntl(0, 0, NULL);</div><div class='add'>+    check_err(ret, "fcntl", 2);</div><div class='ctx'> </div><div class='del'>-        fprintf (stdout, "Testing close");</div><div class='del'>-        ret = close (ret);</div><div class='del'>-        check_err (ret, "close", 2);</div><div class='add'>+    fprintf(stdout, "Testing close");</div><div class='add'>+    ret = close(ret);</div><div class='add'>+    check_err(ret, "close", 2);</div><div class='ctx'> </div><div class='del'>-        fprintf (stdout, "Testing remove");</div><div class='del'>-        ret = remove (testfile);</div><div class='del'>-        check_err (ret, "remove", 2);</div><div class='add'>+    fprintf(stdout, "Testing remove");</div><div class='add'>+    ret = remove(testfile);</div><div class='add'>+    check_err(ret, "remove", 2);</div><div class='ctx'> </div><div class='del'>-        return ret;</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-run_attr_tests (char *testfile)</div><div class='add'>+run_attr_tests(char *testfile)</div><div class='ctx'> {</div><div class='del'>-        int             ret = -1;</div><div class='del'>-        char            *res = NULL;</div><div class='del'>-        struct stat     buf;</div><div class='del'>-        struct statfs   sbuf;</div><div class='del'>-        struct statvfs  svbuf;</div><div class='del'>-</div><div class='del'>-        assert (testfile);</div><div class='del'>-</div><div class='del'>-        fprintf (stdout, "Testing chmod");</div><div class='del'>-        ret = chmod (testfile, 0);</div><div class='del'>-        check_err (ret, "chmod", 2);</div><div class='del'>-</div><div class='del'>-        fprintf (stdout, "Testing chown");</div><div class='del'>-        ret = chown (testfile, 0, 0);</div><div class='del'>-        check_err (ret, "chown", 2);</div><div class='del'>-</div><div class='del'>-        fprintf (stdout, "Testing link");</div><div class='del'>-        ret = link (testfile, testfile);</div><div class='del'>-        check_err (ret, "link", 2);</div><div class='del'>-</div><div class='del'>-        fprintf (stdout, "Testing rename");</div><div class='del'>-        ret = rename (testfile, testfile);</div><div class='del'>-        check_err (ret, "rename", 2);</div><div class='del'>-</div><div class='del'>-        fprintf (stdout, "Testing utimes");</div><div class='del'>-        ret = utimes (testfile, NULL);</div><div class='del'>-        check_err (ret, "utimes", 2);</div><div class='del'>-</div><div class='del'>-        fprintf (stdout, "Testing utime");</div><div class='del'>-        ret = utime (testfile, NULL);</div><div class='del'>-        check_err (ret, "utime", 2);</div><div class='del'>-</div><div class='del'>-        fprintf (stdout, "Testing unlink");</div><div class='del'>-        ret = unlink (testfile);</div><div class='del'>-        check_err (ret, "unlink", 2);</div><div class='del'>-</div><div class='del'>-        fprintf (stdout, "Testing symlink");</div><div class='del'>-        ret = symlink (testfile, testfile);</div><div class='del'>-        check_err (ret, "symlink", 2);</div><div class='del'>-</div><div class='del'>-        fprintf (stdout, "Testing readlink");</div><div class='del'>-        ret = readlink (testfile, testfile, 0);</div><div class='del'>-        check_err (ret, "readlink", 2);</div><div class='del'>-</div><div class='del'>-        fprintf (stdout, "Testing realpath");</div><div class='del'>-        ret = 0;</div><div class='del'>-        res = realpath ((const char *)testfile, testfile);</div><div class='del'>-        if (!res)</div><div class='del'>-                ret = -1;</div><div class='del'>-        check_err (ret, "realpath", 2);</div><div class='del'>-</div><div class='del'>-        fprintf (stdout, "Testing stat");</div><div class='del'>-        ret = stat (testfile, &amp;buf);</div><div class='del'>-        check_err (ret, "stat", 1);</div><div class='del'>-</div><div class='del'>-        fprintf (stdout, "Testing lstat");</div><div class='del'>-        ret = lstat (testfile, &amp;buf);</div><div class='del'>-        check_err (ret, "lstat", 1);</div><div class='del'>-</div><div class='del'>-        fprintf (stdout, "Testing statfs");</div><div class='del'>-        ret = statfs (testfile, &amp;sbuf);</div><div class='del'>-        check_err (ret, "statfs", 2);</div><div class='del'>-</div><div class='del'>-        fprintf (stdout, "Testing statvfs");</div><div class='del'>-        ret = statvfs (testfile, &amp;svbuf);</div><div class='del'>-        check_err (ret, "statvfs", 1);</div><div class='del'>-</div><div class='del'>-        fprintf (stdout, "Testing getxattr");</div><div class='del'>-        ret = getxattr (testfile, NULL, NULL, 0);</div><div class='del'>-        check_err (ret, "getxattr", 2);</div><div class='del'>-</div><div class='del'>-        fprintf (stdout, "Testing lgetxattr");</div><div class='del'>-        ret = lgetxattr (testfile, NULL, NULL, 0);</div><div class='del'>-        check_err (ret, "lgetxattr", 1);</div><div class='del'>-</div><div class='del'>-        fprintf (stdout, "Testing lchown");</div><div class='del'>-        ret = lchown (testfile, 0, 0);</div><div class='del'>-        check_err (ret, "lchown", 2);</div><div class='del'>-        return 0;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    char *res = NULL;</div><div class='add'>+    struct stat buf;</div><div class='add'>+    struct statfs sbuf;</div><div class='add'>+    struct statvfs svbuf;</div><div class='add'>+</div><div class='add'>+    assert(testfile);</div><div class='add'>+</div><div class='add'>+    fprintf(stdout, "Testing chmod");</div><div class='add'>+    ret = chmod(testfile, 0);</div><div class='add'>+    check_err(ret, "chmod", 2);</div><div class='add'>+</div><div class='add'>+    fprintf(stdout, "Testing chown");</div><div class='add'>+    ret = chown(testfile, 0, 0);</div><div class='add'>+    check_err(ret, "chown", 2);</div><div class='add'>+</div><div class='add'>+    fprintf(stdout, "Testing link");</div><div class='add'>+    ret = link(testfile, testfile);</div><div class='add'>+    check_err(ret, "link", 2);</div><div class='add'>+</div><div class='add'>+    fprintf(stdout, "Testing rename");</div><div class='add'>+    ret = rename(testfile, testfile);</div><div class='add'>+    check_err(ret, "rename", 2);</div><div class='add'>+</div><div class='add'>+    fprintf(stdout, "Testing utimes");</div><div class='add'>+    ret = utimes(testfile, NULL);</div><div class='add'>+    check_err(ret, "utimes", 2);</div><div class='add'>+</div><div class='add'>+    fprintf(stdout, "Testing utime");</div><div class='add'>+    ret = utime(testfile, NULL);</div><div class='add'>+    check_err(ret, "utime", 2);</div><div class='add'>+</div><div class='add'>+    fprintf(stdout, "Testing unlink");</div><div class='add'>+    ret = unlink(testfile);</div><div class='add'>+    check_err(ret, "unlink", 2);</div><div class='add'>+</div><div class='add'>+    fprintf(stdout, "Testing symlink");</div><div class='add'>+    ret = symlink(testfile, testfile);</div><div class='add'>+    check_err(ret, "symlink", 2);</div><div class='add'>+</div><div class='add'>+    fprintf(stdout, "Testing readlink");</div><div class='add'>+    ret = readlink(testfile, testfile, 0);</div><div class='add'>+    check_err(ret, "readlink", 2);</div><div class='add'>+</div><div class='add'>+    fprintf(stdout, "Testing realpath");</div><div class='add'>+    ret = 0;</div><div class='add'>+    res = realpath((const char *)testfile, testfile);</div><div class='add'>+    if (!res)</div><div class='add'>+        ret = -1;</div><div class='add'>+    check_err(ret, "realpath", 2);</div><div class='add'>+</div><div class='add'>+    fprintf(stdout, "Testing stat");</div><div class='add'>+    ret = stat(testfile, &amp;buf);</div><div class='add'>+    check_err(ret, "stat", 1);</div><div class='add'>+</div><div class='add'>+    fprintf(stdout, "Testing lstat");</div><div class='add'>+    ret = lstat(testfile, &amp;buf);</div><div class='add'>+    check_err(ret, "lstat", 1);</div><div class='add'>+</div><div class='add'>+    fprintf(stdout, "Testing statfs");</div><div class='add'>+    ret = statfs(testfile, &amp;sbuf);</div><div class='add'>+    check_err(ret, "statfs", 2);</div><div class='add'>+</div><div class='add'>+    fprintf(stdout, "Testing statvfs");</div><div class='add'>+    ret = statvfs(testfile, &amp;svbuf);</div><div class='add'>+    check_err(ret, "statvfs", 1);</div><div class='add'>+</div><div class='add'>+    fprintf(stdout, "Testing getxattr");</div><div class='add'>+    ret = getxattr(testfile, NULL, NULL, 0);</div><div class='add'>+    check_err(ret, "getxattr", 2);</div><div class='add'>+</div><div class='add'>+    fprintf(stdout, "Testing lgetxattr");</div><div class='add'>+    ret = lgetxattr(testfile, NULL, NULL, 0);</div><div class='add'>+    check_err(ret, "lgetxattr", 1);</div><div class='add'>+</div><div class='add'>+    fprintf(stdout, "Testing lchown");</div><div class='add'>+    ret = lchown(testfile, 0, 0);</div><div class='add'>+    check_err(ret, "lchown", 2);</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-run_dev_tests (char *testfile)</div><div class='add'>+run_dev_tests(char *testfile)</div><div class='ctx'> {</div><div class='del'>-        int     ret = -1;</div><div class='add'>+    int ret = -1;</div><div class='ctx'> </div><div class='del'>-        assert (testfile);</div><div class='add'>+    assert(testfile);</div><div class='ctx'> </div><div class='del'>-        fprintf (stdout, "Testing mknod");</div><div class='del'>-        ret = mknod (testfile, 0, 0);</div><div class='del'>-        check_err (ret, "mknod", 2);</div><div class='add'>+    fprintf(stdout, "Testing mknod");</div><div class='add'>+    ret = mknod(testfile, 0, 0);</div><div class='add'>+    check_err(ret, "mknod", 2);</div><div class='ctx'> </div><div class='del'>-        fprintf (stdout, "Testing mkfifo");</div><div class='del'>-        ret = mkfifo (testfile, 0);</div><div class='del'>-        check_err (ret, "mkfifo", 2);</div><div class='del'>-        return 0;</div><div class='add'>+    fprintf(stdout, "Testing mkfifo");</div><div class='add'>+    ret = mkfifo(testfile, 0);</div><div class='add'>+    check_err(ret, "mkfifo", 2);</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-run_dir_tests (char *testpath)</div><div class='add'>+run_dir_tests(char *testpath)</div><div class='ctx'> {</div><div class='del'>-        int             ret = -1;</div><div class='del'>-        DIR             *dh = NULL;</div><div class='del'>-        struct dirent   *dire = NULL;</div><div class='del'>-</div><div class='del'>-        assert (testpath);</div><div class='del'>-</div><div class='del'>-        fprintf (stdout, "Testing mkdir");</div><div class='del'>-        ret = mkdir (testpath, 0);</div><div class='del'>-        check_err (ret, "mkdir", 2);</div><div class='del'>-</div><div class='del'>-        fprintf (stdout, "Testing rmdir");</div><div class='del'>-        ret = rmdir (testpath);</div><div class='del'>-        check_err (ret, "rmdir", 2);</div><div class='del'>-</div><div class='del'>-        fprintf (stdout, "Testing opendir");</div><div class='del'>-        ret = 0;</div><div class='del'>-        dh = opendir (testpath);</div><div class='del'>-        if (!dh)</div><div class='del'>-                ret = -1;</div><div class='del'>-        check_err (ret, "opendir", 2);</div><div class='del'>-</div><div class='del'>-        fprintf (stdout, "Testing readdir");</div><div class='del'>-        ret = 0;</div><div class='del'>-        dire = readdir (dh);</div><div class='del'>-        if (!dire)</div><div class='del'>-                ret = -1;</div><div class='del'>-        check_err (ret, "readdir", 1);</div><div class='del'>-</div><div class='del'>-        fprintf (stdout, "Testing readdir_r");</div><div class='del'>-        ret = readdir_r (dh, dire, &amp;dire);</div><div class='del'>-        check_err (ret, "readdir_r", 1);</div><div class='del'>-</div><div class='del'>-        fprintf (stdout, "Testing rewinddir");</div><div class='del'>-        rewinddir (dh);</div><div class='del'>-        check_err (-1, "rewinddir", 1);</div><div class='del'>-</div><div class='del'>-        fprintf (stdout, "Testing seekdir");</div><div class='del'>-        seekdir (dh, 0);</div><div class='del'>-        check_err (-1, "seekdir", 2);</div><div class='del'>-</div><div class='del'>-        fprintf (stdout, "Testing telldir");</div><div class='del'>-        ret = telldir (dh);</div><div class='del'>-        check_err (ret, "telldir", 2);</div><div class='del'>-</div><div class='del'>-        fprintf (stdout, "Testing closedir");</div><div class='del'>-        ret = closedir (dh);</div><div class='del'>-        check_err (ret, "closedir", 2);</div><div class='del'>-        return 0;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    DIR *dh = NULL;</div><div class='add'>+    struct dirent *dire = NULL;</div><div class='add'>+</div><div class='add'>+    assert(testpath);</div><div class='add'>+</div><div class='add'>+    fprintf(stdout, "Testing mkdir");</div><div class='add'>+    ret = mkdir(testpath, 0);</div><div class='add'>+    check_err(ret, "mkdir", 2);</div><div class='add'>+</div><div class='add'>+    fprintf(stdout, "Testing rmdir");</div><div class='add'>+    ret = rmdir(testpath);</div><div class='add'>+    check_err(ret, "rmdir", 2);</div><div class='add'>+</div><div class='add'>+    fprintf(stdout, "Testing opendir");</div><div class='add'>+    ret = 0;</div><div class='add'>+    dh = opendir(testpath);</div><div class='add'>+    if (!dh)</div><div class='add'>+        ret = -1;</div><div class='add'>+    check_err(ret, "opendir", 2);</div><div class='add'>+</div><div class='add'>+    fprintf(stdout, "Testing readdir");</div><div class='add'>+    ret = 0;</div><div class='add'>+    dire = readdir(dh);</div><div class='add'>+    if (!dire)</div><div class='add'>+        ret = -1;</div><div class='add'>+    check_err(ret, "readdir", 1);</div><div class='add'>+</div><div class='add'>+    fprintf(stdout, "Testing readdir_r");</div><div class='add'>+    ret = readdir_r(dh, dire, &amp;dire);</div><div class='add'>+    check_err(ret, "readdir_r", 1);</div><div class='add'>+</div><div class='add'>+    fprintf(stdout, "Testing rewinddir");</div><div class='add'>+    rewinddir(dh);</div><div class='add'>+    check_err(-1, "rewinddir", 1);</div><div class='add'>+</div><div class='add'>+    fprintf(stdout, "Testing seekdir");</div><div class='add'>+    seekdir(dh, 0);</div><div class='add'>+    check_err(-1, "seekdir", 2);</div><div class='add'>+</div><div class='add'>+    fprintf(stdout, "Testing telldir");</div><div class='add'>+    ret = telldir(dh);</div><div class='add'>+    check_err(ret, "telldir", 2);</div><div class='add'>+</div><div class='add'>+    fprintf(stdout, "Testing closedir");</div><div class='add'>+    ret = closedir(dh);</div><div class='add'>+    check_err(ret, "closedir", 2);</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-main (int argc, char *argv[])</div><div class='add'>+main(int argc, char *argv[])</div><div class='ctx'> {</div><div class='del'>-        char            *testpath = NULL;</div><div class='del'>-        int             x = 0;</div><div class='del'>-</div><div class='del'>-        for (;x &lt; argc; ++x) {</div><div class='del'>-                if (strcmp (argv[x], "--path") == 0) {</div><div class='del'>-                        testpath = argv[x+1];</div><div class='del'>-                        continue;</div><div class='del'>-                }</div><div class='add'>+    char *testpath = NULL;</div><div class='add'>+    int x = 0;</div><div class='ctx'> </div><div class='add'>+    for (; x &lt; argc; ++x) {</div><div class='add'>+        if (strcmp(argv[x], "--path") == 0) {</div><div class='add'>+            testpath = argv[x + 1];</div><div class='add'>+            continue;</div><div class='ctx'>         }</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        if (!testpath) {</div><div class='del'>-                fprintf (stderr, "--path not specified\n");</div><div class='del'>-                usage (stderr);</div><div class='del'>-                return -1;</div><div class='del'>-        }</div><div class='add'>+    if (!testpath) {</div><div class='add'>+        fprintf(stderr, "--path not specified\n");</div><div class='add'>+        usage(stderr);</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        run_file_tests (testpath);</div><div class='del'>-        run_dir_tests (testpath);</div><div class='del'>-        run_attr_tests (testpath);</div><div class='del'>-        run_dev_tests (testpath);</div><div class='add'>+    run_file_tests(testpath);</div><div class='add'>+    run_dir_tests(testpath);</div><div class='add'>+    run_attr_tests(testpath);</div><div class='add'>+    run_dev_tests(testpath);</div><div class='ctx'> </div><div class='del'>-        return 0;</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='del'>-</div><div class='del'>-</div><div class='head'>diff --git a/extras/test/open-fd-tests.c b/extras/test/open-fd-tests.c<br/>new file mode 100644<br/>index 00000000000..509952b4180<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/extras/test/open-fd-tests.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>extras/test/open-fd-tests.c</a></div><div class='hunk'>@@ -0,0 +1,67 @@</div><div class='add'>+</div><div class='add'>+#include &lt;stdio.h&gt;</div><div class='add'>+#include &lt;fcntl.h&gt;</div><div class='add'>+#include &lt;unistd.h&gt;</div><div class='add'>+#include &lt;sys/types.h&gt;</div><div class='add'>+#include &lt;sys/stat.h&gt;</div><div class='add'>+#include &lt;sys/xattr.h&gt;</div><div class='add'>+#include &lt;errno.h&gt;</div><div class='add'>+#include &lt;string.h&gt;</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+main(int argc, char *argv[])</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int fd = 0;</div><div class='add'>+    char *filename = NULL;</div><div class='add'>+    int loop = 0;</div><div class='add'>+    struct stat stbuf = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    char string[1024] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    if (argc &gt; 1)</div><div class='add'>+        filename = argv[1];</div><div class='add'>+</div><div class='add'>+    if (!filename)</div><div class='add'>+        filename = "temp-fd-test-file";</div><div class='add'>+</div><div class='add'>+    fd = open(filename, O_RDWR | O_CREAT | O_TRUNC);</div><div class='add'>+    if (fd &lt; 0) {</div><div class='add'>+        fd = 0;</div><div class='add'>+        fprintf(stderr, "open failed : %s\n", strerror(errno));</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    while (loop &lt; 1000) {</div><div class='add'>+        /* Use it as a mechanism to test time delays */</div><div class='add'>+        memset(string, 0, 1024);</div><div class='add'>+        scanf("%s", string);</div><div class='add'>+</div><div class='add'>+        ret = write(fd, string, strlen(string));</div><div class='add'>+        if (ret != strlen(string)) {</div><div class='add'>+            fprintf(stderr, "write failed : %s (%s %d)\n", strerror(errno),</div><div class='add'>+                    string, loop);</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        ret = write(fd, "\n", 1);</div><div class='add'>+        if (ret != 1) {</div><div class='add'>+            fprintf(stderr, "write failed : %s (%d)\n", strerror(errno), loop);</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        loop++;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    fprintf(stdout, "finishing the test after %d loops\n", loop);</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+out:</div><div class='add'>+    if (fd)</div><div class='add'>+        close(fd);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='head'>diff --git a/extras/test/run.sh b/extras/test/run.sh<br/>new file mode 100755<br/>index 00000000000..4b3839cf679<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/extras/test/run.sh?id=d1d7a6f35c816822fab51c820e25023863c239c1'>extras/test/run.sh</a></div><div class='hunk'>@@ -0,0 +1,22 @@</div><div class='add'>+#!/bin/sh</div><div class='add'>+</div><div class='add'>+#  Copyright (c) 2006-2012 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+#  This file is part of GlusterFS.</div><div class='add'>+#</div><div class='add'>+#  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+#  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+#  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+#  cases as published by the Free Software Foundation.</div><div class='add'>+</div><div class='add'>+# Running gluster sanity test which starts glusterd and runs gluster commands, and exit at the first failure.</div><div class='add'>+$PWD/gluster_commands.sh</div><div class='add'>+</div><div class='add'>+if [ $? -ne 0 ]; then</div><div class='add'>+    echo "sanity failed"</div><div class='add'>+else</div><div class='add'>+    echo "sanity passed"</div><div class='add'>+fi</div><div class='add'>+</div><div class='add'>+# Stopping glusterd</div><div class='add'>+$PWD/stop_glusterd.sh</div><div class='add'>+</div><div class='head'>diff --git a/extras/test/stop_glusterd.sh b/extras/test/stop_glusterd.sh<br/>new file mode 100755<br/>index 00000000000..a2db13f4241<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/extras/test/stop_glusterd.sh?id=d1d7a6f35c816822fab51c820e25023863c239c1'>extras/test/stop_glusterd.sh</a></div><div class='hunk'>@@ -0,0 +1,19 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+#  Copyright (c) 2006-2012 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+#  This file is part of GlusterFS.</div><div class='add'>+#</div><div class='add'>+#  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+#  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+#  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+#  cases as published by the Free Software Foundation.</div><div class='add'>+</div><div class='add'>+#This script stops the glusterd running on the machine. Helpful for gluster sanity script</div><div class='add'>+</div><div class='add'>+killall -9 glusterd</div><div class='add'>+</div><div class='add'>+if [ $? -ne 0 ]; then</div><div class='add'>+    echo "Error: Could not kill glusterd. Either glusterd is not running or kill it manually"</div><div class='add'>+else</div><div class='add'>+    echo "Killed glusterd"</div><div class='add'>+fi</div><div class='head'>diff --git a/extras/test/test-ffop.c b/extras/test/test-ffop.c<br/>new file mode 100644<br/>index 00000000000..1d9c125db67<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/extras/test/test-ffop.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>extras/test/test-ffop.c</a></div><div class='hunk'>@@ -0,0 +1,920 @@</div><div class='add'>+#include &lt;stdio.h&gt;</div><div class='add'>+#include &lt;fcntl.h&gt;</div><div class='add'>+#include &lt;unistd.h&gt;</div><div class='add'>+#include &lt;sys/types.h&gt;</div><div class='add'>+#include &lt;sys/stat.h&gt;</div><div class='add'>+#include &lt;sys/xattr.h&gt;</div><div class='add'>+#include &lt;errno.h&gt;</div><div class='add'>+#include &lt;string.h&gt;</div><div class='add'>+#include &lt;dirent.h&gt;</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+fd_based_fops_1(char *filename);  // for fd based fops after unlink</div><div class='add'>+int</div><div class='add'>+fd_based_fops_2(char *filename);  // for fd based fops before unlink</div><div class='add'>+int</div><div class='add'>+dup_fd_based_fops(char *filename);  // fops based on fd after dup</div><div class='add'>+int</div><div class='add'>+path_based_fops(char *filename);  // for fops based on path</div><div class='add'>+int</div><div class='add'>+dir_based_fops(char *filename);  // for fops which operate on directory</div><div class='add'>+int</div><div class='add'>+link_based_fops(</div><div class='add'>+    char *filename);  // for fops which operate in link files (symlinks)</div><div class='add'>+int</div><div class='add'>+test_open_modes(</div><div class='add'>+    char *filename);  // to test open syscall with open modes available.</div><div class='add'>+int</div><div class='add'>+generic_open_read_write(</div><div class='add'>+    char *filename,</div><div class='add'>+    int flag);  // generic function which does open write and read.</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+main(int argc, char *argv[])</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    char filename[255] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    if (argc &gt; 1)</div><div class='add'>+        strcpy(filename, argv[1]);</div><div class='add'>+    else</div><div class='add'>+        strcpy(filename, "temp-xattr-test-file");</div><div class='add'>+</div><div class='add'>+    ret = fd_based_fops_1(strcat(filename, "_1"));</div><div class='add'>+    if (ret &lt; 0)</div><div class='add'>+        fprintf(stderr, "fd based file operation 1 failed\n");</div><div class='add'>+    else</div><div class='add'>+        fprintf(stdout, "fd based file operation 1 passed\n");</div><div class='add'>+</div><div class='add'>+    ret = fd_based_fops_2(strcat(filename, "_2"));</div><div class='add'>+    if (ret &lt; 0)</div><div class='add'>+        fprintf(stderr, "fd based file operation 2 failed\n");</div><div class='add'>+    else</div><div class='add'>+        fprintf(stdout, "fd based file operation 2 passed\n");</div><div class='add'>+</div><div class='add'>+    ret = dup_fd_based_fops(strcat(filename, "_3"));</div><div class='add'>+    if (ret &lt; 0)</div><div class='add'>+        fprintf(stderr, "dup fd based file operation failed\n");</div><div class='add'>+    else</div><div class='add'>+        fprintf(stdout, "dup fd based file operation passed\n");</div><div class='add'>+</div><div class='add'>+    ret = path_based_fops(strcat(filename, "_4"));</div><div class='add'>+    if (ret &lt; 0)</div><div class='add'>+        fprintf(stderr, "path based file operation failed\n");</div><div class='add'>+    else</div><div class='add'>+        fprintf(stdout, "path based file operation passed\n");</div><div class='add'>+</div><div class='add'>+    ret = dir_based_fops(strcat(filename, "_5"));</div><div class='add'>+    if (ret &lt; 0)</div><div class='add'>+        fprintf(stderr, "directory based file operation failed\n");</div><div class='add'>+    else</div><div class='add'>+        fprintf(stdout, "directory based file operation passed\n");</div><div class='add'>+</div><div class='add'>+    ret = link_based_fops(strcat(filename, "_5"));</div><div class='add'>+    if (ret &lt; 0)</div><div class='add'>+        fprintf(stderr, "link based file operation failed\n");</div><div class='add'>+    else</div><div class='add'>+        fprintf(stdout, "link based file operation passed\n");</div><div class='add'>+</div><div class='add'>+    ret = test_open_modes(strcat(filename, "_5"));</div><div class='add'>+    if (ret &lt; 0)</div><div class='add'>+        fprintf(stderr, "testing modes of 'open' call failed\n");</div><div class='add'>+    else</div><div class='add'>+        fprintf(stdout, "testing modes of 'open' call passed\n");</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+fd_based_fops_1(char *filename)</div><div class='add'>+{</div><div class='add'>+    int fd = 0;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    struct stat stbuf = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    char wstr[50] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    char rstr[50] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    fd = open(filename, O_RDWR | O_CREAT);</div><div class='add'>+    if (fd &lt; 0) {</div><div class='add'>+        fd = 0;</div><div class='add'>+        fprintf(stderr, "open failed : %s\n", strerror(errno));</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = unlink(filename);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(stderr, "unlink failed : %s\n", strerror(errno));</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    strcpy(wstr, "This is my string\n");</div><div class='add'>+    ret = write(fd, wstr, strlen(wstr));</div><div class='add'>+    if (ret &lt;= 0) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        fprintf(stderr, "write failed: %s\n", strerror(errno));</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = lseek(fd, 0, SEEK_SET);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(stderr, "lseek failed: %s\n", strerror(errno));</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = read(fd, rstr, strlen(wstr));</div><div class='add'>+    if (ret &lt;= 0) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        fprintf(stderr, "read failed: %s\n", strerror(errno));</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = memcmp(rstr, wstr, strlen(wstr));</div><div class='add'>+    if (ret != 0) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        fprintf(stderr, "read returning junk\n");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = ftruncate(fd, 0);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(stderr, "ftruncate failed : %s\n", strerror(errno));</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = fstat(fd, &amp;stbuf);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(stderr, "fstat failed : %s\n", strerror(errno));</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = fchmod(fd, 0640);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(stderr, "fchmod failed : %s\n", strerror(errno));</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = fchown(fd, 10001, 10001);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(stderr, "fchown failed : %s\n", strerror(errno));</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = fsync(fd);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(stderr, "fsync failed : %s\n", strerror(errno));</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = fsetxattr(fd, "trusted.xattr-test", "working", 8, 0);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(stderr, "fsetxattr failed : %s\n", strerror(errno));</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = fdatasync(fd);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(stderr, "fdatasync failed : %s\n", strerror(errno));</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = flistxattr(fd, NULL, 0);</div><div class='add'>+    if (ret &lt;= 0) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        fprintf(stderr, "flistxattr failed : %s\n", strerror(errno));</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = fgetxattr(fd, "trusted.xattr-test", NULL, 0);</div><div class='add'>+    if (ret &lt;= 0) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        fprintf(stderr, "fgetxattr failed : %s\n", strerror(errno));</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = fremovexattr(fd, "trusted.xattr-test");</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(stderr, "fremovexattr failed : %s\n", strerror(errno));</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+out:</div><div class='add'>+    if (fd)</div><div class='add'>+        close(fd);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+fd_based_fops_2(char *filename)</div><div class='add'>+{</div><div class='add'>+    int fd = 0;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    struct stat stbuf = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    char wstr[50] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    char rstr[50] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    fd = open(filename, O_RDWR | O_CREAT);</div><div class='add'>+    if (fd &lt; 0) {</div><div class='add'>+        fd = 0;</div><div class='add'>+        fprintf(stderr, "open failed : %s\n", strerror(errno));</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = ftruncate(fd, 0);</div><div class='add'>+</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(stderr, "ftruncate failed : %s\n", strerror(errno));</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    strcpy(wstr, "This is my second string\n");</div><div class='add'>+    ret = write(fd, wstr, strlen(wstr));</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        fprintf(stderr, "write failed: %s\n", strerror(errno));</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    lseek(fd, 0, SEEK_SET);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(stderr, "lseek failed: %s\n", strerror(errno));</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = read(fd, rstr, strlen(wstr));</div><div class='add'>+    if (ret &lt;= 0) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        fprintf(stderr, "read failed: %s\n", strerror(errno));</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = memcmp(rstr, wstr, strlen(wstr));</div><div class='add'>+    if (ret != 0) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        fprintf(stderr, "read returning junk\n");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = fstat(fd, &amp;stbuf);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(stderr, "fstat failed : %s\n", strerror(errno));</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = fchmod(fd, 0640);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(stderr, "fchmod failed : %s\n", strerror(errno));</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = fchown(fd, 10001, 10001);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(stderr, "fchown failed : %s\n", strerror(errno));</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = fsync(fd);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(stderr, "fsync failed : %s\n", strerror(errno));</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = fsetxattr(fd, "trusted.xattr-test", "working", 8, 0);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(stderr, "fsetxattr failed : %s\n", strerror(errno));</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = fdatasync(fd);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(stderr, "fdatasync failed : %s\n", strerror(errno));</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = flistxattr(fd, NULL, 0);</div><div class='add'>+    if (ret &lt;= 0) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        fprintf(stderr, "flistxattr failed : %s\n", strerror(errno));</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = fgetxattr(fd, "trusted.xattr-test", NULL, 0);</div><div class='add'>+    if (ret &lt;= 0) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        fprintf(stderr, "fgetxattr failed : %s\n", strerror(errno));</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = fremovexattr(fd, "trusted.xattr-test");</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(stderr, "fremovexattr failed : %s\n", strerror(errno));</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (fd)</div><div class='add'>+        close(fd);</div><div class='add'>+    unlink(filename);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+path_based_fops(char *filename)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int fd = 0;</div><div class='add'>+    struct stat stbuf = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    char newfilename[255] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    fd = creat(filename, 0644);</div><div class='add'>+    if (fd &lt; 0) {</div><div class='add'>+        fprintf(stderr, "creat failed: %s\n", strerror(errno));</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = truncate(filename, 0);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(stderr, "truncate failed: %s\n", strerror(errno));</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = stat(filename, &amp;stbuf);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(stderr, "stat failed: %s\n", strerror(errno));</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = chmod(filename, 0640);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(stderr, "chmod failed: %s\n", strerror(errno));</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = chown(filename, 10001, 10001);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(stderr, "chown failed: %s\n", strerror(errno));</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = setxattr(filename, "trusted.xattr-test", "working", 8, 0);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(stderr, "setxattr failed: %s\n", strerror(errno));</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = listxattr(filename, NULL, 0);</div><div class='add'>+    if (ret &lt;= 0) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        fprintf(stderr, "listxattr failed: %s\n", strerror(errno));</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = getxattr(filename, "trusted.xattr-test", NULL, 0);</div><div class='add'>+    if (ret &lt;= 0) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        fprintf(stderr, "getxattr failed: %s\n", strerror(errno));</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = removexattr(filename, "trusted.xattr-test");</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(stderr, "removexattr failed: %s\n", strerror(errno));</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = access(filename, R_OK | W_OK);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(stderr, "access failed: %s\n", strerror(errno));</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    strcpy(newfilename, filename);</div><div class='add'>+    strcat(newfilename, "_new");</div><div class='add'>+    ret = rename(filename, newfilename);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(stderr, "rename failed: %s\n", strerror(errno));</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    unlink(newfilename);</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (fd)</div><div class='add'>+        close(fd);</div><div class='add'>+</div><div class='add'>+    unlink(filename);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+dup_fd_based_fops(char *filename)</div><div class='add'>+{</div><div class='add'>+    int fd = 0;</div><div class='add'>+    int newfd = 0;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    struct stat stbuf = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    char wstr[50] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    char rstr[50] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    fd = open(filename, O_RDWR | O_CREAT);</div><div class='add'>+    if (fd &lt; 0) {</div><div class='add'>+        fd = 0;</div><div class='add'>+        fprintf(stderr, "open failed : %s\n", strerror(errno));</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    newfd = dup(fd);</div><div class='add'>+    if (newfd &lt; 0) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        fprintf(stderr, "dup failed: %s\n", strerror(errno));</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    close(fd);</div><div class='add'>+</div><div class='add'>+    strcpy(wstr, "This is my string\n");</div><div class='add'>+    ret = write(newfd, wstr, strlen(wstr));</div><div class='add'>+    if (ret &lt;= 0) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        fprintf(stderr, "write failed: %s\n", strerror(errno));</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = lseek(newfd, 0, SEEK_SET);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(stderr, "lseek failed: %s\n", strerror(errno));</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = read(newfd, rstr, strlen(wstr));</div><div class='add'>+    if (ret &lt;= 0) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        fprintf(stderr, "read failed: %s\n", strerror(errno));</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = memcmp(rstr, wstr, strlen(wstr));</div><div class='add'>+    if (ret != 0) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        fprintf(stderr, "read returning junk\n");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = ftruncate(newfd, 0);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(stderr, "ftruncate failed : %s\n", strerror(errno));</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = fstat(newfd, &amp;stbuf);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(stderr, "fstat failed : %s\n", strerror(errno));</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = fchmod(newfd, 0640);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(stderr, "fchmod failed : %s\n", strerror(errno));</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = fchown(newfd, 10001, 10001);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(stderr, "fchown failed : %s\n", strerror(errno));</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = fsync(newfd);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(stderr, "fsync failed : %s\n", strerror(errno));</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = fsetxattr(newfd, "trusted.xattr-test", "working", 8, 0);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(stderr, "fsetxattr failed : %s\n", strerror(errno));</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = fdatasync(newfd);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(stderr, "fdatasync failed : %s\n", strerror(errno));</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = flistxattr(newfd, NULL, 0);</div><div class='add'>+    if (ret &lt;= 0) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        fprintf(stderr, "flistxattr failed : %s\n", strerror(errno));</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = fgetxattr(newfd, "trusted.xattr-test", NULL, 0);</div><div class='add'>+    if (ret &lt;= 0) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        fprintf(stderr, "fgetxattr failed : %s\n", strerror(errno));</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = fremovexattr(newfd, "trusted.xattr-test");</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(stderr, "fremovexattr failed : %s\n", strerror(errno));</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+out:</div><div class='add'>+    if (newfd)</div><div class='add'>+        close(newfd);</div><div class='add'>+    ret = unlink(filename);</div><div class='add'>+    if (ret &lt; 0)</div><div class='add'>+        fprintf(stderr, "unlink failed : %s\n", strerror(errno));</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+dir_based_fops(char *dirname)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    DIR *dp = NULL;</div><div class='add'>+    char buff[255] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    struct dirent *dbuff = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    struct stat stbuff = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    char newdname[255] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    char *cwd = NULL;</div><div class='add'>+</div><div class='add'>+    ret = mkdir(dirname, 0755);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(stderr, "mkdir failed: %s\n", strerror(errno));</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    dp = opendir(dirname);</div><div class='add'>+    if (dp == NULL) {</div><div class='add'>+        fprintf(stderr, "opendir failed: %s\n", strerror(errno));</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    dbuff = readdir(dp);</div><div class='add'>+    if (NULL == dbuff) {</div><div class='add'>+        fprintf(stderr, "readdir failed: %s\n", strerror(errno));</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = closedir(dp);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(stderr, "closedir failed: %s\n", strerror(errno));</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = stat(dirname, &amp;stbuff);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(stderr, "stat failed: %s\n", strerror(errno));</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = chmod(dirname, 0744);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(stderr, "chmod failed: %s\n", strerror(errno));</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = chown(dirname, 10001, 10001);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(stderr, "chmod failed: %s\n", strerror(errno));</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = setxattr(dirname, "trusted.xattr-test", "working", 8, 0);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(stderr, "setxattr failed: %s\n", strerror(errno));</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = listxattr(dirname, NULL, 0);</div><div class='add'>+    if (ret &lt;= 0) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        fprintf(stderr, "listxattr failed: %s\n", strerror(errno));</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = getxattr(dirname, "trusted.xattr-test", NULL, 0);</div><div class='add'>+    if (ret &lt;= 0) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        fprintf(stderr, "getxattr failed: %s\n", strerror(errno));</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = removexattr(dirname, "trusted.xattr-test");</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(stderr, "removexattr failed: %s\n", strerror(errno));</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    strcpy(newdname, dirname);</div><div class='add'>+    strcat(newdname, "/../");</div><div class='add'>+    ret = chdir(newdname);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(stderr, "chdir failed: %s\n", strerror(errno));</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    cwd = getcwd(buff, 255);</div><div class='add'>+    if (NULL == cwd) {</div><div class='add'>+        fprintf(stderr, "getcwd failed: %s\n", strerror(errno));</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    strcpy(newdname, dirname);</div><div class='add'>+    strcat(newdname, "new");</div><div class='add'>+    ret = rename(dirname, newdname);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(stderr, "rename failed: %s\n", strerror(errno));</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = rmdir(newdname);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(stderr, "rmdir failed: %s\n", strerror(errno));</div><div class='add'>+        return ret;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    rmdir(dirname);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+link_based_fops(char *filename)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int fd = 0;</div><div class='add'>+    char newname[255] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    char linkname[255] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    struct stat lstbuf = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    fd = creat(filename, 0644);</div><div class='add'>+    if (fd &lt; 0) {</div><div class='add'>+        fd = 0;</div><div class='add'>+        fprintf(stderr, "creat failed: %s\n", strerror(errno));</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    strcpy(newname, filename);</div><div class='add'>+    strcat(newname, "_hlink");</div><div class='add'>+    ret = link(filename, newname);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(stderr, "link failed: %s\n", strerror(errno));</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = unlink(filename);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(stderr, "unlink failed: %s\n", strerror(errno));</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    strcpy(linkname, filename);</div><div class='add'>+    strcat(linkname, "_slink");</div><div class='add'>+    ret = symlink(newname, linkname);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(stderr, "symlink failed: %s\n", strerror(errno));</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = lstat(linkname, &amp;lstbuf);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(stderr, "lstbuf failed: %s\n", strerror(errno));</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = lchown(linkname, 10001, 10001);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(stderr, "lchown failed: %s\n", strerror(errno));</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = lsetxattr(linkname, "trusted.lxattr-test", "working", 8, 0);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(stderr, "lsetxattr failed: %s\n", strerror(errno));</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = llistxattr(linkname, NULL, 0);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        fprintf(stderr, "llistxattr failed: %s\n", strerror(errno));</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = lgetxattr(linkname, "trusted.lxattr-test", NULL, 0);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        fprintf(stderr, "lgetxattr failed: %s\n", strerror(errno));</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = lremovexattr(linkname, "trusted.lxattr-test");</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(stderr, "lremovexattr failed: %s\n", strerror(errno));</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (fd)</div><div class='add'>+        close(fd);</div><div class='add'>+    unlink(linkname);</div><div class='add'>+    unlink(newname);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+test_open_modes(char *filename)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    ret = generic_open_read_write(filename, O_CREAT | O_WRONLY);</div><div class='add'>+    if (3 != ret) {</div><div class='add'>+        fprintf(stderr, "flag O_CREAT|O_WRONLY failed: \n");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = generic_open_read_write(filename, O_CREAT | O_RDWR);</div><div class='add'>+    if (ret != 0) {</div><div class='add'>+        fprintf(stderr, "flag O_CREAT|O_RDWR failed\n");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = generic_open_read_write(filename, O_CREAT | O_RDONLY);</div><div class='add'>+    if (ret != 0) {</div><div class='add'>+        fprintf(stderr, "flag O_CREAT|O_RDONLY failed\n");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = creat(filename, 0644);</div><div class='add'>+    close(ret);</div><div class='add'>+    ret = generic_open_read_write(filename, O_WRONLY);</div><div class='add'>+    if (3 != ret) {</div><div class='add'>+        fprintf(stderr, "flag O_WRONLY failed\n");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = creat(filename, 0644);</div><div class='add'>+    close(ret);</div><div class='add'>+    ret = generic_open_read_write(filename, O_RDWR);</div><div class='add'>+    if (0 != ret) {</div><div class='add'>+        fprintf(stderr, "flag O_RDWR failed\n");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = creat(filename, 0644);</div><div class='add'>+    close(ret);</div><div class='add'>+    ret = generic_open_read_write(filename, O_RDONLY);</div><div class='add'>+    if (0 != ret) {</div><div class='add'>+        fprintf(stderr, "flag O_RDONLY failed\n");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = creat(filename, 0644);</div><div class='add'>+    close(ret);</div><div class='add'>+    ret = generic_open_read_write(filename, O_TRUNC | O_WRONLY);</div><div class='add'>+    if (3 != ret) {</div><div class='add'>+        fprintf(stderr, "flag O_TRUNC|O_WRONLY failed\n");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+#if 0 /* undefined behaviour, unable to reliably test */</div><div class='add'>+        ret = creat (filename, 0644);</div><div class='add'>+        close (ret);</div><div class='add'>+        ret = generic_open_read_write (filename, O_TRUNC|O_RDONLY);</div><div class='add'>+        if (0 != ret) {</div><div class='add'>+               fprintf (stderr, "flag O_TRUNC|O_RDONLY failed\n");</div><div class='add'>+               goto out;</div><div class='add'>+        }</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+    ret = generic_open_read_write(filename, O_CREAT | O_RDWR | O_SYNC);</div><div class='add'>+    if (0 != ret) {</div><div class='add'>+        fprintf(stderr, "flag O_CREAT|O_RDWR|O_SYNC failed\n");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = creat(filename, 0644);</div><div class='add'>+    close(ret);</div><div class='add'>+    ret = generic_open_read_write(filename, O_CREAT | O_EXCL);</div><div class='add'>+    if (0 != ret) {</div><div class='add'>+        fprintf(stderr, "flag O_CREAT|O_EXCL failed\n");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+generic_open_read_write(char *filename, int flag)</div><div class='add'>+{</div><div class='add'>+    int fd = 0;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    char wstring[50] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    char rstring[50] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    fd = open(filename, flag);</div><div class='add'>+    if (fd &lt; 0) {</div><div class='add'>+        if (flag == O_CREAT | O_EXCL &amp;&amp; errno == EEXIST) {</div><div class='add'>+            unlink(filename);</div><div class='add'>+            return 0;</div><div class='add'>+        } else {</div><div class='add'>+            fd = 0;</div><div class='add'>+            fprintf(stderr, "open failed: %s\n", strerror(errno));</div><div class='add'>+            return 1;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    strcpy(wstring, "My string to write\n");</div><div class='add'>+    ret = write(fd, wstring, strlen(wstring));</div><div class='add'>+    if (ret &lt;= 0) {</div><div class='add'>+        if (errno != EBADF) {</div><div class='add'>+            fprintf(stderr, "write failed: %s\n", strerror(errno));</div><div class='add'>+            close(fd);</div><div class='add'>+            unlink(filename);</div><div class='add'>+            return 2;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = lseek(fd, 0, SEEK_SET);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        close(fd);</div><div class='add'>+        unlink(filename);</div><div class='add'>+        return 4;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = read(fd, rstring, strlen(wstring));</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        close(fd);</div><div class='add'>+        unlink(filename);</div><div class='add'>+        return 3;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Compare the rstring with wstring. But we do not want to return</div><div class='add'>+     * error when the flag is either O_RDONLY, O_CREAT|O_RDONLY or</div><div class='add'>+     * O_TRUNC|O_RDONLY. Because in that case we are not writing</div><div class='add'>+     * anything to the file.*/</div><div class='add'>+</div><div class='add'>+    ret = memcmp(wstring, rstring, strlen(wstring));</div><div class='add'>+    if (0 != ret &amp;&amp; !(flag == O_CREAT | O_RDONLY || flag == O_RDONLY ||</div><div class='add'>+                      flag == O_TRUNC | O_RDONLY)) {</div><div class='add'>+        fprintf(stderr, "read is returning junk\n");</div><div class='add'>+        close(fd);</div><div class='add'>+        unlink(filename);</div><div class='add'>+        return 4;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    close(fd);</div><div class='add'>+    unlink(filename);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='head'>diff --git a/extras/thin-arbiter/setup-thin-arbiter.sh b/extras/thin-arbiter/setup-thin-arbiter.sh<br/>new file mode 100755<br/>index 00000000000..0681b30ef3f<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/extras/thin-arbiter/setup-thin-arbiter.sh?id=d1d7a6f35c816822fab51c820e25023863c239c1'>extras/thin-arbiter/setup-thin-arbiter.sh</a></div><div class='hunk'>@@ -0,0 +1,184 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+#  Copyright (c) 2018-2019 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+#  This file is part of GlusterFS.</div><div class='add'>+#</div><div class='add'>+#  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+#  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+#  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+#  cases as published by the Free Software Foundation.</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+#  This tool has been developed to setup thin-arbiter process on a node.</div><div class='add'>+#  Seting up a thin arbiter process involves following files -</div><div class='add'>+#  1 - thin-arbiter.vol</div><div class='add'>+#  Thin-arbiter (TA) process will use the graph in this file to load the</div><div class='add'>+#  required translators.</div><div class='add'>+#  2 - gluster-ta-volume.service (generated by gluster-ta-volume.service.in)</div><div class='add'>+#  TA process would be running as systemd service.</div><div class='add'>+#</div><div class='add'>+#  TA process uses a location to save TA id files for every subvolume.</div><div class='add'>+#  This location can be taken as input from user. Once provided and the</div><div class='add'>+#  TA process is started on a node, it can not be changed using this</div><div class='add'>+#  script or by any other mean. The same location should be used in</div><div class='add'>+#  the gluster CLI when creating thin-arbiter volumes.</div><div class='add'>+</div><div class='add'>+MYPATH=`dirname $0`</div><div class='add'>+</div><div class='add'>+volloc="/var/lib/glusterd/thin-arbiter"</div><div class='add'>+mkdir -p $volloc</div><div class='add'>+</div><div class='add'>+if [ -f /etc/glusterfs/thin-arbiter.vol ]; then</div><div class='add'>+    volfile=/etc/glusterfs/thin-arbiter.vol</div><div class='add'>+else</div><div class='add'>+    volfile=$MYPATH/thin-arbiter.vol</div><div class='add'>+fi</div><div class='add'>+</div><div class='add'>+tafile="$volloc/thin-arbiter.vol"</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+help () {</div><div class='add'>+    echo " "</div><div class='add'>+    echo '  This tool helps to setup thin-arbiter (TA) process on a node.</div><div class='add'>+  TA process uses a location to save TA id files for every subvolume.</div><div class='add'>+  This location can be taken as input from user. Once provided and the</div><div class='add'>+  TA process is started on a node, it can not be changed using this script</div><div class='add'>+  or by any other mean. The same location should be used in gluster CLI</div><div class='add'>+  when creating thin-arbiter volumes.</div><div class='add'>+</div><div class='add'>+  usage: setup-thin-arbiter.sh [-s] [-h]</div><div class='add'>+    options:</div><div class='add'>+    -s - Setup thin-arbiter file path and start process</div><div class='add'>+    -h - Show this help message and exit</div><div class='add'>+'</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+volfile_set_brick_path () {</div><div class='add'>+    while read -r line</div><div class='add'>+    do</div><div class='add'>+        dir=`echo "$line" | cut -d' ' -f 2`</div><div class='add'>+        if [ "$dir" = "directory" ]; then</div><div class='add'>+            bpath=`echo "$line" | cut -d' ' -f 3`</div><div class='add'>+            sed -i -- 's?'$bpath'?'$1'?g' $tafile</div><div class='add'>+            return</div><div class='add'>+        fi</div><div class='add'>+    done &lt; $tafile</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+check_ta_proc () {</div><div class='add'>+    pro=`ps aux | grep thin-arbiter.vol | grep "volfile-id"`</div><div class='add'>+    if [ "${pro}" = '' ]; then</div><div class='add'>+            echo ""</div><div class='add'>+    else</div><div class='add'>+        curr_loc=`cat $volloc/thin-arbiter.vol | grep option | grep directory`</div><div class='add'>+        loc=`echo "${curr_loc##* }"`</div><div class='add'>+        echo "******************************************************"</div><div class='add'>+        echo "Error:"</div><div class='add'>+        echo "Thin-arbiter process is running with thin-arbiter path = $loc"</div><div class='add'>+        echo "Can not change TA path on this host now."</div><div class='add'>+        echo "$pro"</div><div class='add'>+        echo "******************************************************"</div><div class='add'>+        exit 1</div><div class='add'>+    fi</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+getpath () {</div><div class='add'>+    check_ta_proc</div><div class='add'>+    echo "******************************************************"</div><div class='add'>+    echo "User will be required to enter a path/folder for arbiter volume."</div><div class='add'>+    echo "Please note that this path will be used for ALL VOLUMES using this"</div><div class='add'>+    echo "node to host thin-arbiter. After setting, if a volume"</div><div class='add'>+    echo "has been created using this host and path then path for"</div><div class='add'>+    echo "thin-arbiter can not be changed "</div><div class='add'>+    echo "******************************************************"</div><div class='add'>+    echo " "</div><div class='add'>+    while true;</div><div class='add'>+    do</div><div class='add'>+        echo -n "Enter brick path for thin arbiter volumes: "</div><div class='add'>+        echo " "</div><div class='add'>+        read tapath</div><div class='add'>+        if [ "${tapath}" = '' ]; then</div><div class='add'>+            echo "Please enter valid path"</div><div class='add'>+            continue</div><div class='add'>+        else</div><div class='add'>+            echo "Entered brick path : $tapath "</div><div class='add'>+            echo "Please note that this brick path will be used for ALL"</div><div class='add'>+            echo "VOLUMES using this node to host thin-arbiter brick"</div><div class='add'>+            echo -n "Want to continue? (y/N): "</div><div class='add'>+            echo " "</div><div class='add'>+            read cont</div><div class='add'>+</div><div class='add'>+            if [ "${cont}" = 'N' ] || [ "${cont}" = 'n' ]; then</div><div class='add'>+                exit 0</div><div class='add'>+            else</div><div class='add'>+                break</div><div class='add'>+            fi</div><div class='add'>+        fi</div><div class='add'>+    done</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+setup () {</div><div class='add'>+    getpath</div><div class='add'>+    mkdir -p $tapath/.glusterfs/indices</div><div class='add'>+    if [ -d $tapath/.glusterfs/indices ]; then</div><div class='add'>+        echo " "</div><div class='add'>+    else</div><div class='add'>+        echo "Could not create $tapath/.glusterfs/indices directory, check provided ta path."</div><div class='add'>+        exit 1</div><div class='add'>+    fi</div><div class='add'>+</div><div class='add'>+    cp -f --backup --suffix=_old $volfile $volloc/thin-arbiter.vol</div><div class='add'>+    volfile_set_brick_path "$tapath"</div><div class='add'>+</div><div class='add'>+    echo "Directory path to be used for thin-arbiter volume is: $tapath"</div><div class='add'>+    echo " "</div><div class='add'>+    echo "========================================================"</div><div class='add'>+</div><div class='add'>+    if [ -f /usr/lib/systemd/system/gluster-ta-volume.service ]; then</div><div class='add'>+        echo "Starting thin-arbiter process"</div><div class='add'>+    else</div><div class='add'>+        cp $MYPATH/../systemd/gluster-ta-volume.service /etc/systemd/system/</div><div class='add'>+        echo "Starting thin-arbiter process"</div><div class='add'>+        chmod 0644 /etc/systemd/system/gluster-ta-volume.service</div><div class='add'>+    fi</div><div class='add'>+</div><div class='add'>+    systemctl daemon-reload</div><div class='add'>+    systemctl enable gluster-ta-volume</div><div class='add'>+    systemctl stop gluster-ta-volume</div><div class='add'>+    systemctl start gluster-ta-volume</div><div class='add'>+</div><div class='add'>+    if [ $? == 0 ]; then</div><div class='add'>+        echo "thin-arbiter process has been setup and running"</div><div class='add'>+    else</div><div class='add'>+        echo "Failed to setup thin arbiter"</div><div class='add'>+        exit 1</div><div class='add'>+    fi</div><div class='add'>+</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+main()</div><div class='add'>+{</div><div class='add'>+</div><div class='add'>+    if [ "$#" -ne 1 ]; then</div><div class='add'>+        help</div><div class='add'>+        exit 0</div><div class='add'>+    fi</div><div class='add'>+</div><div class='add'>+    while getopts "sh" opt; do</div><div class='add'>+        case $opt in</div><div class='add'>+            h)</div><div class='add'>+                help</div><div class='add'>+                exit 0</div><div class='add'>+                ;;</div><div class='add'>+            s)</div><div class='add'>+                setup</div><div class='add'>+                exit 0</div><div class='add'>+                ;;</div><div class='add'>+            *)</div><div class='add'>+                help</div><div class='add'>+                exit 0</div><div class='add'>+                ;;</div><div class='add'>+        esac</div><div class='add'>+    done</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+main "$@"</div><div class='head'>diff --git a/extras/thin-arbiter/thin-arbiter.vol b/extras/thin-arbiter/thin-arbiter.vol<br/>new file mode 100644<br/>index 00000000000..c76babc7b3c<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/extras/thin-arbiter/thin-arbiter.vol?id=d1d7a6f35c816822fab51c820e25023863c239c1'>extras/thin-arbiter/thin-arbiter.vol</a></div><div class='hunk'>@@ -0,0 +1,57 @@</div><div class='add'>+volume ta-posix</div><div class='add'>+    type storage/posix</div><div class='add'>+    option directory /mnt/thin-arbiter</div><div class='add'>+end-volume</div><div class='add'>+</div><div class='add'>+volume ta-thin-arbiter</div><div class='add'>+    type features/thin-arbiter</div><div class='add'>+    subvolumes ta-posix</div><div class='add'>+end-volume</div><div class='add'>+</div><div class='add'>+volume ta-locks</div><div class='add'>+    type features/locks</div><div class='add'>+    option notify-contention yes</div><div class='add'>+    subvolumes ta-thin-arbiter</div><div class='add'>+end-volume</div><div class='add'>+</div><div class='add'>+volume ta-upcall</div><div class='add'>+    type features/upcall</div><div class='add'>+    option cache-invalidation off</div><div class='add'>+    subvolumes ta-locks</div><div class='add'>+end-volume</div><div class='add'>+</div><div class='add'>+volume ta-io-threads</div><div class='add'>+    type performance/io-threads</div><div class='add'>+    subvolumes ta-upcall</div><div class='add'>+end-volume</div><div class='add'>+</div><div class='add'>+volume ta-index</div><div class='add'>+    type features/index</div><div class='add'>+    option xattrop-pending-watchlist trusted.afr.ta-</div><div class='add'>+    option xattrop-dirty-watchlist trusted.afr.dirty</div><div class='add'>+    option index-base /mnt/thin-arbiter/.glusterfs/indices</div><div class='add'>+    subvolumes ta-io-threads</div><div class='add'>+end-volume</div><div class='add'>+</div><div class='add'>+volume /mnt/thin-arbiter</div><div class='add'>+    type debug/io-stats</div><div class='add'>+    option count-fop-hits off</div><div class='add'>+    option latency-measurement off</div><div class='add'>+    option unique-id /mnt/thin-arbiter</div><div class='add'>+    subvolumes ta-index</div><div class='add'>+end-volume</div><div class='add'>+</div><div class='add'>+volume ta-server</div><div class='add'>+    type protocol/server</div><div class='add'>+    option transport.listen-backlog 10</div><div class='add'>+    option transport.socket.keepalive-count 9</div><div class='add'>+    option transport.socket.keepalive-interval 2</div><div class='add'>+    option transport.socket.keepalive-time 20</div><div class='add'>+    option transport.tcp-user-timeout 0</div><div class='add'>+    option transport.socket.keepalive 1</div><div class='add'>+    option auth.addr./mnt/thin-arbiter.allow *</div><div class='add'>+    option auth-path /mnt/thin-arbiter</div><div class='add'>+    option transport.address-family inet</div><div class='add'>+    option transport-type tcp</div><div class='add'>+    subvolumes /mnt/thin-arbiter</div><div class='add'>+end-volume</div><div class='head'>diff --git a/extras/volfilter.py b/extras/volfilter.py<br/>new file mode 100644<br/>index 00000000000..5558a1beff4<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/extras/volfilter.py?id=d1d7a6f35c816822fab51c820e25023863c239c1'>extras/volfilter.py</a></div><div class='hunk'>@@ -0,0 +1,168 @@</div><div class='add'>+# Copyright (c) 2010-2011 Red Hat, Inc.</div><div class='add'>+#</div><div class='add'>+# This file is part of HekaFS.</div><div class='add'>+#</div><div class='add'>+# HekaFS is free software: you can redistribute it and/or modify it under the</div><div class='add'>+# terms of the GNU General Public License, version 3, as published by the Free</div><div class='add'>+# Software Foundation.</div><div class='add'>+#</div><div class='add'>+# HekaFS is distributed in the hope that it will be useful, but WITHOUT ANY</div><div class='add'>+# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR</div><div class='add'>+# A PARTICULAR PURPOSE.  See the GNU General Public License for more details.</div><div class='add'>+#</div><div class='add'>+# You should have received a copy of the GNU General Public License * along</div><div class='add'>+# with HekaFS.  If not, see &lt;http://www.gnu.org/licenses/&gt;.</div><div class='add'>+</div><div class='add'>+from __future__ import print_function</div><div class='add'>+import copy</div><div class='add'>+import string</div><div class='add'>+import sys</div><div class='add'>+import types</div><div class='add'>+</div><div class='add'>+good_xlators = [</div><div class='add'>+	"cluster/afr",</div><div class='add'>+	"cluster/dht",</div><div class='add'>+	"cluster/distribute",</div><div class='add'>+	"cluster/replicate",</div><div class='add'>+	"cluster/stripe",</div><div class='add'>+	"debug/io-stats",</div><div class='add'>+	"features/access-control",</div><div class='add'>+	"features/locks",</div><div class='add'>+	"features/marker",</div><div class='add'>+	"features/uidmap",</div><div class='add'>+	"performance/io-threads",</div><div class='add'>+	"protocol/client",</div><div class='add'>+	"protocol/server",</div><div class='add'>+	"storage/posix",</div><div class='add'>+]</div><div class='add'>+</div><div class='add'>+def copy_stack (old_xl, suffix, recursive=False):</div><div class='add'>+	if recursive:</div><div class='add'>+		new_name = old_xl.name + "-" + suffix</div><div class='add'>+	else:</div><div class='add'>+		new_name = suffix</div><div class='add'>+	new_xl = Translator(new_name)</div><div class='add'>+	new_xl.type = old_xl.type</div><div class='add'>+	# The results with normal assignment here are . . . amusing.</div><div class='add'>+	new_xl.opts = copy.deepcopy(old_xl.opts)</div><div class='add'>+	for sv in old_xl.subvols:</div><div class='add'>+		new_xl.subvols.append(copy_stack(sv, suffix, True))</div><div class='add'>+	# Patch up the path at the bottom.</div><div class='add'>+	if new_xl.type == "storage/posix":</div><div class='add'>+		new_xl.opts["directory"] += ("/" + suffix)</div><div class='add'>+	return new_xl</div><div class='add'>+</div><div class='add'>+def cleanup (parent, graph):</div><div class='add'>+	if parent.type in good_xlators:</div><div class='add'>+		# Temporary fix so that HekaFS volumes can use the</div><div class='add'>+		# SSL-enabled multi-threaded socket transport.</div><div class='add'>+		if parent.type == "protocol/server":</div><div class='add'>+			parent.type = "protocol/server2"</div><div class='add'>+			parent.opts["transport-type"] = "ssl"</div><div class='add'>+		elif parent.type == "protocol/client":</div><div class='add'>+			parent.type = "protocol/client2"</div><div class='add'>+			parent.opts["transport-type"] = "ssl"</div><div class='add'>+		sv = []</div><div class='add'>+		for child in parent.subvols:</div><div class='add'>+			sv.append(cleanup(child, graph))</div><div class='add'>+		parent.subvols = sv</div><div class='add'>+	else:</div><div class='add'>+		parent = cleanup(parent.subvols[0], graph)</div><div class='add'>+	return parent</div><div class='add'>+</div><div class='add'>+class Translator:</div><div class='add'>+	def __init__ (self, name):</div><div class='add'>+		self.name = name</div><div class='add'>+		self.type = ""</div><div class='add'>+		self.opts = {}</div><div class='add'>+		self.subvols = []</div><div class='add'>+		self.dumped = False</div><div class='add'>+	def __repr__ (self):</div><div class='add'>+		return "&lt;Translator %s&gt;" % self.name</div><div class='add'>+</div><div class='add'>+def load (path):</div><div class='add'>+	# If it's a string, open it; otherwise, assume it's already a</div><div class='add'>+	# file-like object (most notably from urllib*).</div><div class='add'>+	if type(path) in (str,):</div><div class='add'>+		fp = file(path, "r")</div><div class='add'>+	else:</div><div class='add'>+		fp = path</div><div class='add'>+	all_xlators = {}</div><div class='add'>+	xlator = None</div><div class='add'>+	last_xlator = None</div><div class='add'>+	while True:</div><div class='add'>+		text = fp.readline()</div><div class='add'>+		if text == "":</div><div class='add'>+			break</div><div class='add'>+		text = text.split()</div><div class='add'>+		if not len(text):</div><div class='add'>+			continue</div><div class='add'>+		if text[0] == "volume":</div><div class='add'>+			if xlator:</div><div class='add'>+				raise RuntimeError("nested volume definition")</div><div class='add'>+			xlator = Translator(text[1])</div><div class='add'>+			continue</div><div class='add'>+		if not xlator:</div><div class='add'>+			raise RuntimeError("text outside volume definition")</div><div class='add'>+		if text[0] == "type":</div><div class='add'>+			xlator.type = text[1]</div><div class='add'>+			continue</div><div class='add'>+		if text[0] == "option":</div><div class='add'>+			xlator.opts[text[1]] = ''.join(text[2:])</div><div class='add'>+			continue</div><div class='add'>+		if text[0] == "subvolumes":</div><div class='add'>+			for sv in text[1:]:</div><div class='add'>+				xlator.subvols.append(all_xlators[sv])</div><div class='add'>+			continue</div><div class='add'>+		if text[0] == "end-volume":</div><div class='add'>+			all_xlators[xlator.name] = xlator</div><div class='add'>+			last_xlator = xlator</div><div class='add'>+			xlator = None</div><div class='add'>+			continue</div><div class='add'>+		raise RuntimeError("unrecognized keyword %s" % text[0])</div><div class='add'>+	if xlator:</div><div class='add'>+		raise RuntimeError("unclosed volume definition")</div><div class='add'>+	return all_xlators, last_xlator</div><div class='add'>+</div><div class='add'>+def generate (graph, last, stream=sys.stdout):</div><div class='add'>+	for sv in last.subvols:</div><div class='add'>+		if not sv.dumped:</div><div class='add'>+			generate(graph, sv, stream)</div><div class='add'>+			print("", file=stream)</div><div class='add'>+			sv.dumped = True</div><div class='add'>+	print("volume %s" % last.name, file=stream)</div><div class='add'>+	print("    type %s" % last.type, file=stream)</div><div class='add'>+	for k, v in last.opts.items():</div><div class='add'>+		print("    option %s %s" % (k, v), file=stream)</div><div class='add'>+	if last.subvols:</div><div class='add'>+		print("    subvolumes %s" % ''.join(</div><div class='add'>+			[ sv.name for sv in last.subvols ]), file=stream)</div><div class='add'>+	print("end-volume", file=stream)</div><div class='add'>+</div><div class='add'>+def push_filter (graph, old_xl, filt_type, opts={}):</div><div class='add'>+	suffix = "-" + old_xl.type.split("/")[1]</div><div class='add'>+	if len(old_xl.name) &gt; len(suffix):</div><div class='add'>+		if old_xl.name[-len(suffix):] == suffix:</div><div class='add'>+			old_xl.name = old_xl.name[:-len(suffix)]</div><div class='add'>+	new_xl = Translator(old_xl.name+suffix)</div><div class='add'>+	new_xl.type = old_xl.type</div><div class='add'>+	new_xl.opts = old_xl.opts</div><div class='add'>+	new_xl.subvols = old_xl.subvols</div><div class='add'>+	graph[new_xl.name] = new_xl</div><div class='add'>+	old_xl.name += ("-" + filt_type.split("/")[1])</div><div class='add'>+	old_xl.type = filt_type</div><div class='add'>+	old_xl.opts = opts</div><div class='add'>+	old_xl.subvols = [new_xl]</div><div class='add'>+	graph[old_xl.name] = old_xl</div><div class='add'>+</div><div class='add'>+def delete (graph, victim):</div><div class='add'>+	if len(victim.subvols) != 1:</div><div class='add'>+		raise RuntimeError("attempt to delete non-unary translator")</div><div class='add'>+	for xl in graph.itervalues():</div><div class='add'>+		while xl.subvols.count(victim):</div><div class='add'>+			i = xl.subvols.index(victim)</div><div class='add'>+			xl.subvols[i] = victim.subvols[0]</div><div class='add'>+</div><div class='add'>+if __name__ == "__main__":</div><div class='add'>+	graph, last = load(sys.argv[1])</div><div class='add'>+	generate(graph, last)</div><div class='head'>diff --git a/extras/volgen/Common.py b/extras/volgen/Common.py<br/>deleted file mode 100644<br/>index 298dee98943..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/extras/volgen/Common.py?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/volgen/Common.py</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,83 +0,0 @@</div><div class='del'>-import os, sys, re, string</div><div class='del'>-</div><div class='del'>-def check_duplicate_entry(args):</div><div class='del'>-    """Check duplicate entries in incoming arguments"""</div><div class='del'>-    _tmp = []</div><div class='del'>-    for server in args:</div><div class='del'>-        if server not in _tmp:</div><div class='del'>-            _tmp.append (server)</div><div class='del'>-        else:</div><div class='del'>-            print "Duplicate arguments detected (%s)" % server</div><div class='del'>-            raise ValueError</div><div class='del'>-</div><div class='del'>-    return</div><div class='del'>-</div><div class='del'>-def args2dict(args):</div><div class='del'>-</div><div class='del'>-    keyvalue = {}</div><div class='del'>-    for arg in args:</div><div class='del'>-        if int(arg.find(':')) == -1:</div><div class='del'>-            continue</div><div class='del'>-        first = arg.split(':')[0]</div><div class='del'>-        keyvalue[first] = []</div><div class='del'>-</div><div class='del'>-    for arg in args:</div><div class='del'>-        if int(arg.find(':')) == -1:</div><div class='del'>-            continue</div><div class='del'>-        first = arg.split(':')[0]</div><div class='del'>-        if arg.split(':')[1] not in keyvalue[first]:</div><div class='del'>-            if arg.split(':')[1][0] != '/':</div><div class='del'>-                print "Absolute export path required for %s" % arg</div><div class='del'>-                raise ValueError</div><div class='del'>-            keyvalue[first].append (arg.split(':')[1])</div><div class='del'>-</div><div class='del'>-    return keyvalue</div><div class='del'>-</div><div class='del'>-def args2array(args):</div><div class='del'>-</div><div class='del'>-    array = []</div><div class='del'>-</div><div class='del'>-    for arg in args:</div><div class='del'>-        if int(arg.find(':')) == -1:</div><div class='del'>-            continue</div><div class='del'>-        array.append(arg)</div><div class='del'>-</div><div class='del'>-    return array</div><div class='del'>-</div><div class='del'>-def list_export_vols(configdir, volumename):</div><div class='del'>-</div><div class='del'>-    list_export = []</div><div class='del'>-    if os.path.isdir(configdir):</div><div class='del'>-        for line in os.listdir(configdir):</div><div class='del'>-            if re.match(r'[a-zA-Z0-9_]\S+%s-export.vol' % volumename, line):</div><div class='del'>-                list_export.append(line)</div><div class='del'>-</div><div class='del'>-    return list_export</div><div class='del'>-</div><div class='del'>-def get_old_server_args(exports, configdir):</div><div class='del'>-</div><div class='del'>-    list_args = []</div><div class='del'>-    for export in exports:</div><div class='del'>-        array = gfParser("%s/%s" % (configdir, export))</div><div class='del'>-        for dt in array:</div><div class='del'>-            if dt.has_key('option'):</div><div class='del'>-                if re.match("\w+tory", dt['option']):</div><div class='del'>-                    list_args.append(export.split('-')[0] + ":" + dt['option'].split()[1])</div><div class='del'>-</div><div class='del'>-    return list_args</div><div class='del'>-</div><div class='del'>-def gfParser (volfile):</div><div class='del'>-</div><div class='del'>-    volfile_rl = open (volfile).readlines()</div><div class='del'>-    volume_array = []</div><div class='del'>-    for line in volfile_rl:</div><div class='del'>-        line = line.strip()</div><div class='del'>-        volfile_dict = {}</div><div class='del'>-        if re.match(r"[a-zA-Z0-9_]+", line):</div><div class='del'>-            if line.split() &gt; 1:</div><div class='del'>-                volfile_dict[line.split()[0]] = string.join (line.split()[1:], ' ')  </div><div class='del'>-            else: </div><div class='del'>-                volfile_dict[line.split()[0]] = " "</div><div class='del'>-            volume_array.append(volfile_dict)</div><div class='del'>-</div><div class='del'>-    return volume_array</div><div class='head'>diff --git a/extras/volgen/CreateVolfile.py b/extras/volgen/CreateVolfile.py<br/>deleted file mode 100644<br/>index c8143a03aba..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/extras/volgen/CreateVolfile.py?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/volgen/CreateVolfile.py</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,684 +0,0 @@</div><div class='del'>-#    Copyright (c) 2009-2010 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='del'>-#    This file is part of GlusterFS.</div><div class='del'>-</div><div class='del'>-#    GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-#    it under the terms of the GNU General Public License as published</div><div class='del'>-#    by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-#    or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-#    GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-#    WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-#    General Public License for more details.</div><div class='del'>-</div><div class='del'>-#    You should have received a copy of the GNU General Public License</div><div class='del'>-#    along with this program.  If not, see</div><div class='del'>-#    &lt;http://www.gnu.org/licenses/&gt;.</div><div class='del'>-</div><div class='del'>-import os, sys, string</div><div class='del'>-</div><div class='del'>-#Cachesize calculator</div><div class='del'>-cache_size = "`echo $(( $(grep 'MemTotal' /proc/meminfo | sed 's/[^0-9]//g') / 5120 ))`"</div><div class='del'>-</div><div class='del'>-class CreateVolfile:</div><div class='del'>-</div><div class='del'>-    def __init__ (self, server_dict, server, transport,</div><div class='del'>-                  transports, options, server_array):</div><div class='del'>-</div><div class='del'>-        self.host_dict = server_dict</div><div class='del'>-        self.host = server</div><div class='del'>-        self.volume_name = options.volume_name</div><div class='del'>-        self.transport = transport</div><div class='del'>-        self.transports = transports</div><div class='del'>-        self.auth_parameters = options.auth_param</div><div class='del'>-        self.raid_type = options.raid_type</div><div class='del'>-        self.ib_devport = options.ib_dev</div><div class='del'>-        self.conf_dir = options.conf_dir</div><div class='del'>-        self.host_array = server_array</div><div class='del'>-        self.enable_safe_mode = options.enable_safe_mode</div><div class='del'>-        self.volume_size_server = options.size_server</div><div class='del'>-        self.volume_size_client = options.size_client</div><div class='del'>-        self.nfs = options.need_nfs</div><div class='del'>-        self.num_replica = options.num_replica</div><div class='del'>-        self.num_stripe = options.num_stripe</div><div class='del'>-        if options.port:</div><div class='del'>-            self.gfs_port    = options.port</div><div class='del'>-            self.gfs_ib_port = options.port + 1</div><div class='del'>-        else:</div><div class='del'>-            self.gfs_port    = 6969</div><div class='del'>-            self.gfs_ib_port = 6970</div><div class='del'>-</div><div class='del'>-    def create_pmap_mount_volfile (self):</div><div class='del'>-</div><div class='del'>-        raid_type = self.raid_type</div><div class='del'>-</div><div class='del'>-        mount_volfile = "%s/%s-%s.vol" % (self.conf_dir, str(self.volume_name), str(self.transport))</div><div class='del'>-        mount_fd = file ("%s" % (mount_volfile), "w")</div><div class='del'>-</div><div class='del'>-        print "Generating client volfiles.. '%s'" % mount_volfile</div><div class='del'>-</div><div class='del'>-        cmdline = string.join (sys.argv, ' ')</div><div class='del'>-</div><div class='del'>-        mount_fd.write ("## file auto generated by %s\n" % sys.argv[0])</div><div class='del'>-        mount_fd.write ("# Cmd line:\n")</div><div class='del'>-        mount_fd.write ("# $ %s\n\n" % cmdline)</div><div class='del'>-</div><div class='del'>-        if raid_type is not None:</div><div class='del'>-            # Used for later usage</div><div class='del'>-            mount_fd.write ("# RAID %d\n" % raid_type)</div><div class='del'>-</div><div class='del'>-        mount_fd.write ("# TRANSPORT-TYPE %s\n" % self.transport)</div><div class='del'>-        subvolumes = []</div><div class='del'>-        for host in self.host_dict.keys():</div><div class='del'>-            i = 1</div><div class='del'>-            for export in self.host_dict[host]:</div><div class='del'>-                mount_fd.write ("volume %s-%s\n" % (host,export))</div><div class='del'>-                mount_fd.write ("    type protocol/client\n")</div><div class='del'>-                mount_fd.write ("    option transport-type %s\n" %</div><div class='del'>-                                self.transport)</div><div class='del'>-                mount_fd.write ("    option remote-host %s\n" % host)</div><div class='del'>-                if self.transport == 'ib-verbs':</div><div class='del'>-                    mount_fd.write ("    option transport.ib-verbs.port %d\n" %</div><div class='del'>-                                    self.ib_devport)</div><div class='del'>-                if self.transport == 'tcp':</div><div class='del'>-                    mount_fd.write ("    option transport.socket.nodelay on\n")</div><div class='del'>-</div><div class='del'>-                mount_fd.write ("    option remote-subvolume %s\n" % export)</div><div class='del'>-                mount_fd.write ("end-volume\n\n")</div><div class='del'>-                i += 1</div><div class='del'>-                subvolumes.append(str(host) + '-' + str(export))</div><div class='del'>-</div><div class='del'>-        # Stripe section.. if given</div><div class='del'>-        if raid_type is 0:</div><div class='del'>-            max_stripe_idx = len (subvolumes) / self.num_stripe</div><div class='del'>-            stripe_idx = 0</div><div class='del'>-            index = 0</div><div class='del'>-            while index &lt; max_stripe_idx:</div><div class='del'>-                mount_fd.write ("volume stripe-%d\n" % index)</div><div class='del'>-                mount_fd.write ("    type cluster/stripe\n")</div><div class='del'>-                mount_fd.write ("#    option block-size 128k\n")</div><div class='del'>-                mount_fd.write ("#    option use-xattr no\n")</div><div class='del'>-                mount_fd.write ("    subvolumes %s" % subvolumes[stripe_idx])</div><div class='del'>-                sub_idx = 1</div><div class='del'>-                while sub_idx &lt; self.num_stripe:</div><div class='del'>-                    mount_fd.write (" %s" % subvolumes[stripe_idx+sub_idx])</div><div class='del'>-                    sub_idx += 1</div><div class='del'>-                mount_fd.write ("\nend-volume\n\n")</div><div class='del'>-                stripe_idx += self.num_stripe</div><div class='del'>-                index +=1</div><div class='del'>-</div><div class='del'>-        # Replicate section</div><div class='del'>-        if raid_type is 1:</div><div class='del'>-            max_mirror_idx = len (subvolumes) / self.num_replica</div><div class='del'>-            mirror_idx = 0</div><div class='del'>-            index = 0</div><div class='del'>-            while index &lt; max_mirror_idx:</div><div class='del'>-                mount_fd.write ("volume mirror-%d\n" % index)</div><div class='del'>-                mount_fd.write ("    type cluster/replicate\n")</div><div class='del'>-                mount_fd.write ("    subvolumes %s" % subvolumes[mirror_idx])</div><div class='del'>-                sub_idx = 1</div><div class='del'>-                while sub_idx &lt; self.num_replica:</div><div class='del'>-                    mount_fd.write (" %s" % subvolumes[mirror_idx + sub_idx])</div><div class='del'>-                    sub_idx += 1</div><div class='del'>-                mount_fd.write ("\nend-volume\n\n")</div><div class='del'>-                mirror_idx += self.num_replica</div><div class='del'>-                index += 1</div><div class='del'>-</div><div class='del'>-        # Distribute section</div><div class='del'>-        if raid_type is 0:</div><div class='del'>-            subvolumes = []</div><div class='del'>-            flag = 0</div><div class='del'>-            while flag &lt; index:</div><div class='del'>-                subvolumes.append ("stripe-%d" % flag)</div><div class='del'>-                flag += 1</div><div class='del'>-</div><div class='del'>-        if raid_type is 1:</div><div class='del'>-            subvolumes = []</div><div class='del'>-            flag = 0</div><div class='del'>-            while flag &lt; index:</div><div class='del'>-                subvolumes.append ("mirror-%d" % flag)</div><div class='del'>-                flag += 1</div><div class='del'>-</div><div class='del'>-        if len (subvolumes) &gt; 1:</div><div class='del'>-            mount_fd.write ("volume distribute\n")</div><div class='del'>-            mount_fd.write ("    type cluster/distribute\n")</div><div class='del'>-            mount_fd.write ("#   option unhashed-sticky-bit yes"</div><div class='del'>-                           "  # Used for migrating data while adding new nodes\n")</div><div class='del'>-            mount_fd.write ("#   option min-free-disk 5%"</div><div class='del'>-                           "  # Minimum free disk available on the volume\n")</div><div class='del'>-            mount_fd.write ("    subvolumes %s\n" %</div><div class='del'>-                                 string.join (subvolumes,' '))</div><div class='del'>-            mount_fd.write ("end-volume\n\n")</div><div class='del'>-            subvolumes[0] = "distribute"</div><div class='del'>-</div><div class='del'>-        if self.volume_size_client:</div><div class='del'>-            mount_fd.write ("volume quota\n")</div><div class='del'>-            mount_fd.write ("    type features/quota\n")</div><div class='del'>-            mount_fd.write ("    option disk-usage-limit %s\n" % self.volume_size_client)</div><div class='del'>-            mount_fd.write ("#   option minimum-free-disk-limit 10GB\n"</div><div class='del'>-                            "#   minimum free disk value (default) 0\n")</div><div class='del'>-            mount_fd.write ("#   option refresh-interval 10\n")</div><div class='del'>-            mount_fd.write ("    subvolumes %s\n" % subvolumes[0])</div><div class='del'>-            mount_fd.write ("end-volume\n\n")</div><div class='del'>-            subvolumes[0] = "quota"</div><div class='del'>-</div><div class='del'>-        if self.enable_safe_mode:</div><div class='del'>-            return</div><div class='del'>-</div><div class='del'>-        self.performance_mode (subvolumes[0], mount_fd)</div><div class='del'>-</div><div class='del'>-        return</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-    def performance_mode (self, cluster_subvolume, volfile_fd):</div><div class='del'>-</div><div class='del'>-        volfile_fd.write ("volume writebehind\n")</div><div class='del'>-        volfile_fd.write ("    type performance/write-behind\n")</div><div class='del'>-        volfile_fd.write ("    option cache-size 4MB\n")</div><div class='del'>-        volfile_fd.write ("#   option enable-trickling-writes yes # Flush final write calls when network is free\n")</div><div class='del'>-        volfile_fd.write ("#   option enable-O_SYNC yes # Enable O_SYNC for write-behind\n")</div><div class='del'>-        volfile_fd.write ("#   option disable-for-first-nbytes 1 # Disable first nbytes with very small initial writes\n")</div><div class='del'>-        if self.volume_size_client:</div><div class='del'>-            volfile_fd.write ("    subvolumes quota\n")</div><div class='del'>-        else:</div><div class='del'>-            volfile_fd.write ("    subvolumes %s\n" % cluster_subvolume)</div><div class='del'>-            volfile_fd.write ("end-volume\n\n")</div><div class='del'>-</div><div class='del'>-        volfile_fd.write ("volume readahead\n")</div><div class='del'>-        volfile_fd.write ("    type performance/read-ahead\n")</div><div class='del'>-        volfile_fd.write ("    option page-count 4\n")</div><div class='del'>-        volfile_fd.write ("#   option force-atime-update yes # force updating atimes, default off\n")</div><div class='del'>-        volfile_fd.write ("    subvolumes writebehind\n")</div><div class='del'>-        volfile_fd.write ("end-volume\n\n")</div><div class='del'>-</div><div class='del'>-        volfile_fd.write ("volume iocache\n")</div><div class='del'>-        volfile_fd.write ("    type performance/io-cache\n")</div><div class='del'>-        volfile_fd.write ("    option cache-size %sMB\n" % cache_size)</div><div class='del'>-        volfile_fd.write ("    option cache-timeout 1\n")</div><div class='del'>-        volfile_fd.write ("#   option priority *.html:1,abc*:2 # Priority list for iocaching files\n")</div><div class='del'>-        volfile_fd.write ("    subvolumes readahead\n")</div><div class='del'>-        volfile_fd.write ("end-volume\n\n")</div><div class='del'>-</div><div class='del'>-        volfile_fd.write ("volume quickread\n")</div><div class='del'>-        volfile_fd.write ("    type performance/quick-read\n")</div><div class='del'>-        volfile_fd.write ("    option cache-timeout 1\n")</div><div class='del'>-        volfile_fd.write ("    option max-file-size 64kB\n")</div><div class='del'>-        volfile_fd.write ("    subvolumes iocache\n")</div><div class='del'>-        volfile_fd.write ("end-volume\n\n")</div><div class='del'>-</div><div class='del'>-        volfile_fd.write ("volume statprefetch\n")</div><div class='del'>-        volfile_fd.write ("    type performance/stat-prefetch\n")</div><div class='del'>-        volfile_fd.write ("    subvolumes quickread\n")</div><div class='del'>-        volfile_fd.write ("end-volume\n\n")</div><div class='del'>-</div><div class='del'>-        return</div><div class='del'>-</div><div class='del'>-    def create_pmap_nfs_volfile (self):</div><div class='del'>-</div><div class='del'>-        raid_type = self.raid_type</div><div class='del'>-</div><div class='del'>-        mount_volfile = "%s/%s-%s-nfs.vol" % (self.conf_dir, str(self.volume_name), str(self.transport))</div><div class='del'>-        mount_fd = file ("%s" % (mount_volfile), "w")</div><div class='del'>-</div><div class='del'>-        print "Generating client volfiles.. '%s'" % mount_volfile</div><div class='del'>-</div><div class='del'>-        cmdline = string.join (sys.argv, ' ')</div><div class='del'>-</div><div class='del'>-        mount_fd.write ("## file auto generated by %s\n" % sys.argv[0])</div><div class='del'>-        mount_fd.write ("# Cmd line:\n")</div><div class='del'>-        mount_fd.write ("# $ %s\n\n" % cmdline)</div><div class='del'>-</div><div class='del'>-        if raid_type is not None:</div><div class='del'>-            # Used for later usage</div><div class='del'>-            mount_fd.write ("# RAID %d\n" % raid_type)</div><div class='del'>-</div><div class='del'>-        mount_fd.write ("# TRANSPORT-TYPE %s\n" % self.transport)</div><div class='del'>-        subvolumes = []</div><div class='del'>-        for host in self.host_dict.keys():</div><div class='del'>-            i = 1</div><div class='del'>-            for export in self.host_dict[host]:</div><div class='del'>-                mount_fd.write ("volume %s-%d\n" % (host,i))</div><div class='del'>-                mount_fd.write ("    type protocol/client\n")</div><div class='del'>-                mount_fd.write ("    option transport-type %s\n" %</div><div class='del'>-                                self.transport)</div><div class='del'>-                mount_fd.write ("    option remote-host %s\n" % host)</div><div class='del'>-                if self.transport == 'ib-verbs':</div><div class='del'>-                    mount_fd.write ("    option transport.ib-verbs.port %d\n" %</div><div class='del'>-                                    self.ib_devport)</div><div class='del'>-                if self.transport == 'tcp':</div><div class='del'>-                    mount_fd.write ("    option transport.socket.nodelay on\n")</div><div class='del'>-</div><div class='del'>-                mount_fd.write ("    option remote-subvolume %s\n" % export)</div><div class='del'>-                mount_fd.write ("end-volume\n\n")</div><div class='del'>-                subvolumes.append(str(host) + '-' + str(i))</div><div class='del'>-                i += 1</div><div class='del'>-</div><div class='del'>-        # Stripe section.. if given</div><div class='del'>-        if raid_type is 0:</div><div class='del'>-            max_stripe_idx = len (subvolumes) / self.num_stripe</div><div class='del'>-            stripe_idx = 0</div><div class='del'>-            index = 0</div><div class='del'>-            while index &lt; max_stripe_idx:</div><div class='del'>-                mount_fd.write ("volume stripe-%d\n" % index)</div><div class='del'>-                mount_fd.write ("    type cluster/stripe\n")</div><div class='del'>-                mount_fd.write ("#    option block-size 128k\n")</div><div class='del'>-                mount_fd.write ("#    option use-xattr no\n")</div><div class='del'>-                mount_fd.write ("    subvolumes %s" % subvolumes[stripe_idx])</div><div class='del'>-                sub_idx = 1</div><div class='del'>-                while sub_idx &lt; self.num_stripe:</div><div class='del'>-                    mount_fd.write (" %s" % subvolumes[stripe_idx+sub_idx])</div><div class='del'>-                    sub_idx += 1</div><div class='del'>-                mount_fd.write ("\nend-volume\n\n")</div><div class='del'>-                stripe_idx += self.num_stripe</div><div class='del'>-                index +=1</div><div class='del'>-</div><div class='del'>-        # Replicate section</div><div class='del'>-        if raid_type is 1:</div><div class='del'>-            max_mirror_idx = len (subvolumes) / self.num_replica</div><div class='del'>-            mirror_idx = 0</div><div class='del'>-            index = 0</div><div class='del'>-            while index &lt; max_mirror_idx:</div><div class='del'>-                mount_fd.write ("volume mirror-%d\n" % index)</div><div class='del'>-                mount_fd.write ("    type cluster/replicate\n")</div><div class='del'>-                mount_fd.write ("    subvolumes %s" % subvolumes[mirror_idx])</div><div class='del'>-                sub_idx = 1</div><div class='del'>-                while sub_idx &lt; self.num_replica:</div><div class='del'>-                    mount_fd.write (" %s" % subvolumes[mirror_idx + sub_idx])</div><div class='del'>-                    sub_idx += 1</div><div class='del'>-                mount_fd.write ("\nend-volume\n\n")</div><div class='del'>-                mirror_idx += self.num_replica</div><div class='del'>-                index += 1</div><div class='del'>-</div><div class='del'>-        # Distribute section</div><div class='del'>-        if raid_type is 0:</div><div class='del'>-            subvolumes = []</div><div class='del'>-            flag = 0</div><div class='del'>-            while flag &lt; index:</div><div class='del'>-                subvolumes.append ("stripe-%d" % flag)</div><div class='del'>-                flag += 1</div><div class='del'>-</div><div class='del'>-        if raid_type is 1:</div><div class='del'>-            subvolumes = []</div><div class='del'>-            flag = 0</div><div class='del'>-            while flag &lt; index:</div><div class='del'>-                subvolumes.append ("mirror-%d" % flag)</div><div class='del'>-                flag += 1</div><div class='del'>-</div><div class='del'>-        if len (subvolumes) &gt; 1:</div><div class='del'>-            mount_fd.write ("volume distribute\n")</div><div class='del'>-            mount_fd.write ("    type cluster/distribute\n")</div><div class='del'>-            mount_fd.write ("#   option unhashed-sticky-bit yes"</div><div class='del'>-                           "  # Used for migrating data while adding new nodes\n")</div><div class='del'>-            mount_fd.write ("#   option min-free-disk 5%"</div><div class='del'>-                           "  # Minimum free disk available on the volume\n")</div><div class='del'>-            mount_fd.write ("    subvolumes %s\n" %</div><div class='del'>-                                 string.join (subvolumes,' '))</div><div class='del'>-            mount_fd.write ("end-volume\n\n")</div><div class='del'>-            subvolumes[0] = "distribute"</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-        mount_fd.write ("volume nfsxlator\n")</div><div class='del'>-        mount_fd.write ("    type nfs/server\n")</div><div class='del'>-        mount_fd.write ("    subvolumes %s\n" % subvolumes[0])</div><div class='del'>-        mount_fd.write ("#   option rpc-auth.auth-unix         off  #Enabled by default\n")</div><div class='del'>-        mount_fd.write ("#   option rpc-auth.auth-null         off  #Enabled by default\n")</div><div class='del'>-        mount_fd.write ("#   By default all addresses are rejected until allowed.\n")</div><div class='del'>-        mount_fd.write ("#   option rpc-auth.addr.reject       127.*\n")</div><div class='del'>-        mount_fd.write ("#   option rpc-auth.addr.allow        localhost\n")</div><div class='del'>-        mount_fd.write ("    option rpc-auth.addr.%s.allow %s\n" % (subvolumes[0], self.auth_parameters))</div><div class='del'>-        mount_fd.write ("#   By default insecure ports are not allowed.\n")</div><div class='del'>-        mount_fd.write ("#   option rpc-auth.ports.insecure    on\n")</div><div class='del'>-        mount_fd.write ("#   option rpc-auth.ports.&lt;volume&gt;.insecure  on\n")</div><div class='del'>-        mount_fd.write ("#   By default all access is read-write.\n")</div><div class='del'>-        mount_fd.write ("#   option nfs3.&lt;volume&gt;.volume-access       read-only\n")</div><div class='del'>-        mount_fd.write ("#   option nfs3.&lt;volume&gt;.volume-access       read-only\n")</div><div class='del'>-        mount_fd.write ("#   option nfs3.read-size             128Kb\n")</div><div class='del'>-        mount_fd.write ("#   option nfs3.write-size            32Kb\n")</div><div class='del'>-        mount_fd.write ("#   option nfs3.readdir-size          64Kb\n")</div><div class='del'>-        mount_fd.write ("#   option nfs3.&lt;volume&gt;.read-size    64Kb\n")</div><div class='del'>-        mount_fd.write ("#   option nfs3.&lt;volume&gt;.write-size   64Kb\n")</div><div class='del'>-        mount_fd.write ("#   option nfs3.posix1.readdir-size   128Kb\n")</div><div class='del'>-        mount_fd.write ("end-volume\n\n")</div><div class='del'>-</div><div class='del'>-        return</div><div class='del'>-</div><div class='del'>-    def create_pmap_export_volfile (self):</div><div class='del'>-</div><div class='del'>-        cmdline = string.join (sys.argv, ' ')</div><div class='del'>-        i = 0</div><div class='del'>-        for export in self.host_dict[self.host]:</div><div class='del'>-            export_volfile = "%s/%s-%d.vol" % (self.conf_dir,</div><div class='del'>-                                               str(self.volume_name + '.' + self.host),</div><div class='del'>-                                               i)</div><div class='del'>-            i += 1</div><div class='del'>-            exp_fd = file ("%s" % (export_volfile),"w")</div><div class='del'>-</div><div class='del'>-            print "Generating server volfiles.. for server %s as '%s'" % (self.host,</div><div class='del'>-                                                                          export_volfile)</div><div class='del'>-</div><div class='del'>-            exp_fd.write ("## file auto generated by %s\n" % sys.argv[0])</div><div class='del'>-            exp_fd.write ("# Cmd line:\n")</div><div class='del'>-            exp_fd.write ("# $ %s\n\n" % cmdline)</div><div class='del'>-            exp_fd.write ("volume posix\n")</div><div class='del'>-            exp_fd.write ("    type storage/posix\n")</div><div class='del'>-            exp_fd.write ("#   option o-direct enable # (default: disable) boolean type only\n")</div><div class='del'>-            exp_fd.write ("#   option export-statfs-size no # (default: yes) boolean type only\n")</div><div class='del'>-            exp_fd.write ("#   option mandate-attribute off # (default: on) boolean type only\n")</div><div class='del'>-            exp_fd.write ("#   option span-devices 8 # (default: 0) integer value\n")</div><div class='del'>-            exp_fd.write ("#   option background-unlink yes # (default: no) boolean type\n")</div><div class='del'>-</div><div class='del'>-            exp_fd.write ("    option directory %s\n" % export)</div><div class='del'>-            exp_fd.write ("end-volume\n\n")</div><div class='del'>-</div><div class='del'>-            if self.nfs:</div><div class='del'>-                exp_fd.write ("volume posix-ac\n")</div><div class='del'>-                exp_fd.write ("    type features/access-control\n")</div><div class='del'>-                exp_fd.write ("    subvolumes posix\n")</div><div class='del'>-                exp_fd.write ("end-volume\n\n")</div><div class='del'>-</div><div class='del'>-            if self.volume_size_server:</div><div class='del'>-                exp_fd.write ("volume quota\n")</div><div class='del'>-                exp_fd.write ("    type features/quota\n")</div><div class='del'>-                exp_fd.write ("    option disk-usage-limit %s\n" % self.volume_size_server)</div><div class='del'>-                exp_fd.write ("#   option minimum-free-disk-limit 10GB"</div><div class='del'>-                              "  # minimum free disk value (default) 0\n")</div><div class='del'>-                exp_fd.write ("#   option refresh-interval 10\n")</div><div class='del'>-                if self.nfs:</div><div class='del'>-                    exp_fd.write ("    subvolumes posix-ac\n")</div><div class='del'>-                else:</div><div class='del'>-                    exp_fd.write ("    subvolumes posix\n")</div><div class='del'>-                exp_fd.write ("end-volume\n\n")</div><div class='del'>-</div><div class='del'>-            exp_fd.write ("volume locks\n")</div><div class='del'>-            exp_fd.write ("    type features/locks\n")</div><div class='del'>-            exp_fd.write ("#   option mandatory on # Default off, used in specific applications\n")</div><div class='del'>-            if self.volume_size_server:</div><div class='del'>-                exp_fd.write ("    subvolumes quota\n")</div><div class='del'>-            elif self.nfs:</div><div class='del'>-                exp_fd.write ("    subvolumes posix-ac\n")</div><div class='del'>-            else:</div><div class='del'>-                exp_fd.write ("    subvolumes posix\n")</div><div class='del'>-            exp_fd.write ("end-volume\n\n")</div><div class='del'>-</div><div class='del'>-            exp_fd.write ("volume replace-brick\n")</div><div class='del'>-            exp_fd.write ("    type protocol/client\n")</div><div class='del'>-            if self.transport:</div><div class='del'>-                exp_fd.write ("    option transport-type %s\n" % self.transport)</div><div class='del'>-            if self.gfs_port:</div><div class='del'>-                exp_fd.write ("    option transport.remote-port 34034\n")</div><div class='del'>-            exp_fd.write ("    option ping-timeout 42\n")</div><div class='del'>-            exp_fd.write ("end-volume\n\n")</div><div class='del'>-</div><div class='del'>-            exp_fd.write ("volume pump\n")</div><div class='del'>-            exp_fd.write ("    type cluster/pump\n")</div><div class='del'>-            exp_fd.write ("    subvolumes locks replace-brick\n")</div><div class='del'>-            exp_fd.write ("end-volume\n\n")</div><div class='del'>-</div><div class='del'>-            exp_fd.write ("volume %s\n" % export)</div><div class='del'>-            exp_fd.write ("    type performance/io-threads\n")</div><div class='del'>-            exp_fd.write ("    option thread-count 8\n")</div><div class='del'>-            exp_fd.write ("#   option autoscaling yes # Heuristic for autoscaling threads on demand\n")</div><div class='del'>-            exp_fd.write ("#   option min-threads 2 # min count for thread pool\n")</div><div class='del'>-            exp_fd.write ("#   option max-threads 64 # max count for thread pool\n")</div><div class='del'>-            exp_fd.write ("    subvolumes pump\n")</div><div class='del'>-            exp_fd.write ("end-volume\n\n")</div><div class='del'>-</div><div class='del'>-            for transport in self.transports:</div><div class='del'>-                exp_fd.write ("volume server-%s\n" % export)</div><div class='del'>-                exp_fd.write ("    type protocol/server\n")</div><div class='del'>-                exp_fd.write ("    option transport-type %s\n" % transport)</div><div class='del'>-                exp_fd.write ("    option auth.addr.%s.allow %s\n" %</div><div class='del'>-                                  (export, self.auth_parameters))</div><div class='del'>-                if transport == 'ib-verbs':</div><div class='del'>-                    exp_fd.write ("    option transport.ib-verbs.port %d\n" %</div><div class='del'>-                                  self.ib_devport)</div><div class='del'>-                if transport == 'tcp':</div><div class='del'>-                    exp_fd.write ("    option transport.socket.nodelay on\n")</div><div class='del'>-                    exp_fd.write ("    option transport.socket.listen-port %d\n" % self.gfs_port)</div><div class='del'>-                exp_fd.write ("    subvolumes %s\n" % export)</div><div class='del'>-                exp_fd.write ("end-volume\n\n")</div><div class='del'>-</div><div class='del'>-        return</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-    def create_mount_volfile (self):</div><div class='del'>-</div><div class='del'>-        raid_type = self.raid_type</div><div class='del'>-</div><div class='del'>-        mount_volfile = "%s/%s-%s.vol" % (self.conf_dir, str(self.volume_name), str(self.transport))</div><div class='del'>-        mount_fd = file ("%s" % (mount_volfile), "w")</div><div class='del'>-</div><div class='del'>-        print "Generating client volfiles.. '%s'" % mount_volfile</div><div class='del'>-</div><div class='del'>-        cmdline = string.join (sys.argv, ' ')</div><div class='del'>-</div><div class='del'>-        mount_fd.write ("## file auto generated by %s\n" % sys.argv[0])</div><div class='del'>-        mount_fd.write ("# Cmd line:\n")</div><div class='del'>-        mount_fd.write ("# $ %s\n\n" % cmdline)</div><div class='del'>-</div><div class='del'>-        if raid_type is not None:</div><div class='del'>-            # Used for later usage</div><div class='del'>-            mount_fd.write ("# RAID %d\n" % raid_type)</div><div class='del'>-</div><div class='del'>-        mount_fd.write ("# TRANSPORT-TYPE %s\n" % self.transport)</div><div class='del'>-        subvolumes = []</div><div class='del'>-        for host in self.host_dict.keys():</div><div class='del'>-            i = 1</div><div class='del'>-            for exports in self.host_dict[host]:</div><div class='del'>-                mount_fd.write ("volume %s-%s\n" % (host,exports))</div><div class='del'>-                mount_fd.write ("    type protocol/client\n")</div><div class='del'>-                mount_fd.write ("    option transport-type %s\n" %</div><div class='del'>-                                self.transport)</div><div class='del'>-                mount_fd.write ("    option remote-host %s\n" % host)</div><div class='del'>-                if self.transport == 'ib-verbs':</div><div class='del'>-                    mount_fd.write ("    option transport.ib-verbs.port %d\n" %</div><div class='del'>-                                    self.ib_devport)</div><div class='del'>-                    mount_fd.write ("    option remote-port %d\n" %</div><div class='del'>-                                    self.gfs_ib_port)</div><div class='del'>-                if self.transport == 'tcp':</div><div class='del'>-                    mount_fd.write ("    option transport.socket.nodelay on\n")</div><div class='del'>-                    mount_fd.write ("    option remote-port %d\n" %</div><div class='del'>-                                    self.gfs_port)</div><div class='del'>-</div><div class='del'>-                mount_fd.write ("    option remote-subvolume %s\n" % exports)</div><div class='del'>-                mount_fd.write ("end-volume\n\n")</div><div class='del'>-                subvolumes.append(str(host) + '-' + str(exports))</div><div class='del'>-</div><div class='del'>-        # Stripe section.. if given</div><div class='del'>-        if raid_type is 0:</div><div class='del'>-            max_stripe_idx = len (subvolumes) / self.num_stripe</div><div class='del'>-            stripe_idx = 0</div><div class='del'>-            index = 0</div><div class='del'>-            while index &lt; max_stripe_idx:</div><div class='del'>-                mount_fd.write ("volume stripe-%d\n" % index)</div><div class='del'>-                mount_fd.write ("    type cluster/stripe\n")</div><div class='del'>-                mount_fd.write ("#    option block-size 128k\n")</div><div class='del'>-                mount_fd.write ("#    option use-xattr no\n")</div><div class='del'>-                mount_fd.write ("    subvolumes %s" % subvolumes[stripe_idx])</div><div class='del'>-                sub_idx = 1</div><div class='del'>-                while sub_idx &lt; self.num_stripe:</div><div class='del'>-                    mount_fd.write (" %s" % subvolumes[stripe_idx+sub_idx])</div><div class='del'>-                    sub_idx += 1</div><div class='del'>-                mount_fd.write ("\nend-volume\n\n")</div><div class='del'>-                stripe_idx += self.num_stripe</div><div class='del'>-                index +=1</div><div class='del'>-</div><div class='del'>-        # Replicate section</div><div class='del'>-        if raid_type is 1:</div><div class='del'>-            max_mirror_idx = len (subvolumes) / self.num_replica</div><div class='del'>-            mirror_idx = 0</div><div class='del'>-            index = 0</div><div class='del'>-            while index &lt; max_mirror_idx:</div><div class='del'>-                mount_fd.write ("volume mirror-%d\n" % index)</div><div class='del'>-                mount_fd.write ("    type cluster/replicate\n")</div><div class='del'>-                mount_fd.write ("    subvolumes %s" % subvolumes[mirror_idx])</div><div class='del'>-                sub_idx = 1</div><div class='del'>-                while sub_idx &lt; self.num_replica:</div><div class='del'>-                    mount_fd.write (" %s" % subvolumes[mirror_idx + sub_idx])</div><div class='del'>-                    sub_idx += 1</div><div class='del'>-                mount_fd.write ("\nend-volume\n\n")</div><div class='del'>-                mirror_idx += self.num_replica</div><div class='del'>-                index += 1</div><div class='del'>-</div><div class='del'>-        # Distribute section</div><div class='del'>-        if raid_type is 0:</div><div class='del'>-            subvolumes = []</div><div class='del'>-            flag = 0</div><div class='del'>-            while flag &lt; index:</div><div class='del'>-                subvolumes.append ("stripe-%d" % flag)</div><div class='del'>-                flag += 1</div><div class='del'>-</div><div class='del'>-        if raid_type is 1:</div><div class='del'>-            subvolumes = []</div><div class='del'>-            flag = 0</div><div class='del'>-            while flag &lt; index:</div><div class='del'>-                subvolumes.append ("mirror-%d" % flag)</div><div class='del'>-                flag += 1</div><div class='del'>-</div><div class='del'>-        if len (subvolumes) &gt; 1:</div><div class='del'>-            mount_fd.write ("volume distribute\n")</div><div class='del'>-            mount_fd.write ("    type cluster/distribute\n")</div><div class='del'>-            mount_fd.write ("#   option unhashed-sticky-bit yes"</div><div class='del'>-                           "  # Used for migrating data while adding new nodes\n")</div><div class='del'>-            mount_fd.write ("#   option min-free-disk 5%"</div><div class='del'>-                           "  # Minimum free disk available on the volume\n")</div><div class='del'>-            mount_fd.write ("    subvolumes %s\n" %</div><div class='del'>-                                 string.join (subvolumes,' '))</div><div class='del'>-            mount_fd.write ("end-volume\n\n")</div><div class='del'>-            subvolumes[0] = "distribute"</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-        if self.nfs:</div><div class='del'>-            mount_fd.write ("volume nfsxlator\n")</div><div class='del'>-            mount_fd.write ("    type nfs/server\n")</div><div class='del'>-            mount_fd.write ("    subvolumes %s\n" % subvolumes[0])</div><div class='del'>-            mount_fd.write ("#   option rpc-auth.auth-unix         off  #Enabled by default\n")</div><div class='del'>-            mount_fd.write ("#   option rpc-auth.auth-null         off  #Enabled by default\n")</div><div class='del'>-            mount_fd.write ("#   By default all addresses are rejected until allowed.\n")</div><div class='del'>-            mount_fd.write ("#   option rpc-auth.addr.reject       127.*\n")</div><div class='del'>-            mount_fd.write ("#   option rpc-auth.addr.allow        localhost\n")</div><div class='del'>-            mount_fd.write ("    option rpc-auth.addr.%s.allow %s\n" % (subvolumes[0], self.auth_parameters))</div><div class='del'>-            mount_fd.write ("#   By default insecure ports are not allowed.\n")</div><div class='del'>-            mount_fd.write ("#   option rpc-auth.ports.insecure    on\n")</div><div class='del'>-            mount_fd.write ("#   option rpc-auth.ports.&lt;volume&gt;.insecure  on\n")</div><div class='del'>-            mount_fd.write ("#   By default all access is read-write.\n")</div><div class='del'>-            mount_fd.write ("#   option nfs3.&lt;volume&gt;.volume-access       read-only\n")</div><div class='del'>-            mount_fd.write ("#   option nfs3.&lt;volume&gt;.volume-access       read-only\n")</div><div class='del'>-            mount_fd.write ("#   option nfs3.read-size             128Kb\n")</div><div class='del'>-            mount_fd.write ("#   option nfs3.write-size            32Kb\n")</div><div class='del'>-            mount_fd.write ("#   option nfs3.readdir-size          64Kb\n")</div><div class='del'>-            mount_fd.write ("#   option nfs3.&lt;volume&gt;.read-size    64Kb\n")</div><div class='del'>-            mount_fd.write ("#   option nfs3.&lt;volume&gt;.write-size   64Kb\n")</div><div class='del'>-            mount_fd.write ("#   option nfs3.posix1.readdir-size   128Kb\n")</div><div class='del'>-            mount_fd.write ("end-volume\n\n")</div><div class='del'>-            return</div><div class='del'>-</div><div class='del'>-        if self.volume_size_client:</div><div class='del'>-            mount_fd.write ("volume quota\n")</div><div class='del'>-            mount_fd.write ("    type features/quota\n")</div><div class='del'>-            mount_fd.write ("    option disk-usage-limit %s\n" % self.volume_size_client)</div><div class='del'>-            mount_fd.write ("#   option minimum-free-disk-limit 10GB\n"</div><div class='del'>-                            "#   minimum free disk value (default) 0\n")</div><div class='del'>-            mount_fd.write ("#   option refresh-interval 10\n")</div><div class='del'>-            mount_fd.write ("    subvolumes %s\n" % subvolumes[0])</div><div class='del'>-            mount_fd.write ("end-volume\n\n")</div><div class='del'>-            subvolumes[0] = "quota"</div><div class='del'>-</div><div class='del'>-        if self.enable_safe_mode:</div><div class='del'>-            return</div><div class='del'>-</div><div class='del'>-        self.performance_mode (subvolumes[0], mount_fd)</div><div class='del'>-</div><div class='del'>-        return</div><div class='del'>-</div><div class='del'>-    def create_export_volfile (self):</div><div class='del'>-</div><div class='del'>-        cmdline = string.join (sys.argv, ' ')</div><div class='del'>-        export_volfile = "%s/%s-export.vol" % (self.conf_dir, str(self.host + '-' + self.volume_name))</div><div class='del'>-        exp_fd = file ("%s" % (export_volfile),"w")</div><div class='del'>-</div><div class='del'>-        print "Generating server volfiles.. for server %s as '%s'" % (self.host,</div><div class='del'>-                                                                      export_volfile)</div><div class='del'>-</div><div class='del'>-        exp_fd.write ("## file auto generated by %s\n" %</div><div class='del'>-                      sys.argv[0])</div><div class='del'>-        exp_fd.write ("# Cmd line:\n")</div><div class='del'>-        exp_fd.write ("# $ %s\n\n" % cmdline)</div><div class='del'>-        total_bricks = []</div><div class='del'>-        i=1</div><div class='del'>-        for export in self.host_dict[self.host]:</div><div class='del'>-            exp_fd.write ("volume posix%d\n" % i)</div><div class='del'>-            exp_fd.write ("    type storage/posix\n")</div><div class='del'>-            exp_fd.write ("#   option o-direct enable # (default: disable) boolean type only\n")</div><div class='del'>-            exp_fd.write ("#   option export-statfs-size no # (default: yes) boolean type only\n")</div><div class='del'>-            exp_fd.write ("#   option mandate-attribute off # (default: on) boolean type only\n")</div><div class='del'>-            exp_fd.write ("#   option span-devices 8 # (default: 0) integer value\n")</div><div class='del'>-            exp_fd.write ("#   option background-unlink yes # (default: no) boolean type\n")</div><div class='del'>-</div><div class='del'>-            exp_fd.write ("    option directory %s\n" % export)</div><div class='del'>-            exp_fd.write ("end-volume\n\n")</div><div class='del'>-</div><div class='del'>-            if self.nfs:</div><div class='del'>-                exp_fd.write ("volume posix-ac%d\n" % i)</div><div class='del'>-                exp_fd.write ("    type features/access-control\n")</div><div class='del'>-                exp_fd.write ("    subvolumes posix%d\n" % i)</div><div class='del'>-                exp_fd.write ("end-volume\n\n")</div><div class='del'>-</div><div class='del'>-            if self.volume_size_server:</div><div class='del'>-                exp_fd.write ("volume quota%d\n" % i)</div><div class='del'>-                exp_fd.write ("    type features/quota\n")</div><div class='del'>-                exp_fd.write ("    option disk-usage-limit %s\n" % self.volume_size_server)</div><div class='del'>-                exp_fd.write ("#   option minimum-free-disk-limit 10GB"</div><div class='del'>-                              "  # minimum free disk value (default) 0\n")</div><div class='del'>-                exp_fd.write ("#   option refresh-interval 10\n")</div><div class='del'>-                if self.nfs:</div><div class='del'>-                    exp_fd.write ("    subvolumes posix-ac%d\n" % i)</div><div class='del'>-                else:</div><div class='del'>-                    exp_fd.write ("    subvolumes posix%d\n" % i)</div><div class='del'>-                exp_fd.write ("end-volume\n\n")</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-            exp_fd.write ("volume locks%d\n" % i)</div><div class='del'>-            exp_fd.write ("    type features/locks\n")</div><div class='del'>-            exp_fd.write ("#   option mandatory on # Default off, used in specific applications\n")</div><div class='del'>-            if self.volume_size_server:</div><div class='del'>-                exp_fd.write ("    subvolumes quota%d\n" % i)</div><div class='del'>-            else:</div><div class='del'>-                exp_fd.write ("    subvolumes posix%d\n" % i)</div><div class='del'>-            exp_fd.write ("end-volume\n\n")</div><div class='del'>-</div><div class='del'>-            exp_fd.write ("volume %s\n" % export)</div><div class='del'>-            exp_fd.write ("    type performance/io-threads\n")</div><div class='del'>-            exp_fd.write ("    option thread-count 8\n")</div><div class='del'>-            exp_fd.write ("#   option autoscaling yes # Heuristic for autoscaling threads on demand\n")</div><div class='del'>-            exp_fd.write ("#   option min-threads 2 # min count for thread pool\n")</div><div class='del'>-            exp_fd.write ("#   option max-threads 64 # max count for thread pool\n")</div><div class='del'>-</div><div class='del'>-            exp_fd.write ("    subvolumes locks%d\n" % i)</div><div class='del'>-            exp_fd.write ("end-volume\n\n")</div><div class='del'>-</div><div class='del'>-            total_bricks.append("%s" % export)</div><div class='del'>-            i += 1</div><div class='del'>-</div><div class='del'>-        for transport in self.transports:</div><div class='del'>-            exp_fd.write ("volume server-%s\n" % transport)</div><div class='del'>-            exp_fd.write ("    type protocol/server\n")</div><div class='del'>-            exp_fd.write ("    option transport-type %s\n" % transport)</div><div class='del'>-            for brick in total_bricks:</div><div class='del'>-                exp_fd.write ("    option auth.addr.%s.allow %s\n" %</div><div class='del'>-                              (brick, self.auth_parameters))</div><div class='del'>-</div><div class='del'>-            if transport == 'ib-verbs':</div><div class='del'>-                exp_fd.write ("    option transport.ib-verbs.listen-port %d\n" % self.gfs_ib_port)</div><div class='del'>-                exp_fd.write ("    option transport.ib-verbs.port %d\n" %</div><div class='del'>-                              self.ib_devport)</div><div class='del'>-            if transport == 'tcp':</div><div class='del'>-                exp_fd.write ("    option transport.socket.listen-port %d\n" % self.gfs_port)</div><div class='del'>-                exp_fd.write ("    option transport.socket.nodelay on\n")</div><div class='del'>-</div><div class='del'>-            exp_fd.write ("    subvolumes %s\n" %</div><div class='del'>-                          string.join(total_bricks, ' '))</div><div class='del'>-            exp_fd.write ("end-volume\n\n")</div><div class='del'>-</div><div class='del'>-        return</div><div class='del'>-</div><div class='head'>diff --git a/extras/volgen/Makefile.am b/extras/volgen/Makefile.am<br/>deleted file mode 100644<br/>index e36bd159b38..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/extras/volgen/Makefile.am?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/volgen/Makefile.am</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,8 +0,0 @@</div><div class='del'>-</div><div class='del'>-volgendir = $(datadir)/glusterfs</div><div class='del'>-dist_volgen_DATA = CreateVolfile.py Common.py</div><div class='del'>-</div><div class='del'>-dist_bin_SCRIPTS = glusterfs-volgen</div><div class='del'>-</div><div class='del'>-CLEANFILES = </div><div class='del'>-</div><div class='head'>diff --git a/extras/volgen/glusterfs-volgen.in b/extras/volgen/glusterfs-volgen.in<br/>deleted file mode 100755<br/>index 4b3742366c5..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/extras/volgen/glusterfs-volgen.in?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>extras/volgen/glusterfs-volgen.in</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,227 +0,0 @@</div><div class='del'>-#!/usr/bin/python</div><div class='del'>-</div><div class='del'>-#    Copyright (c) 2009-2010 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='del'>-#    This file is part of GlusterFS.</div><div class='del'>-</div><div class='del'>-#    GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-#    it under the terms of the GNU General Public License as published</div><div class='del'>-#    by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-#    or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-#    GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-#    WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-#    General Public License for more details.</div><div class='del'>-</div><div class='del'>-#    You should have received a copy of the GNU General Public License</div><div class='del'>-#    along with this program.  If not, see</div><div class='del'>-#    &lt;http://www.gnu.org/licenses/&gt;.</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-import getopt, sys, os, string</div><div class='del'>-from optparse import OptionParser,OptionGroup,make_option</div><div class='del'>-</div><div class='del'>-prefix = "@prefix@"</div><div class='del'>-</div><div class='del'>-if not (prefix + "/share/glusterfs") in sys.path:</div><div class='del'>-    sys.path.append(prefix + "/share/glusterfs")</div><div class='del'>-</div><div class='del'>-from CreateVolfile import *</div><div class='del'>-from Common import *</div><div class='del'>-</div><div class='del'>-def generate_volume_files ():</div><div class='del'>-</div><div class='del'>-    usage_str = "%s%s" % ("%prog: -n &lt;VOLUMENAME&gt; -t &lt;TRANSPORT&gt; -p &lt;NUMBER&gt; -a &lt;AUTH&gt; ",</div><div class='del'>-                          "-r &lt;TYPE&gt; [--num-replica N] [--num-stripe N]")</div><div class='del'>-    version_str = "%prog 3.0"</div><div class='del'>-    desc_str = "A tool to generate volume files for GlusterFS."</div><div class='del'>-</div><div class='del'>-    parse = OptionParser(usage=usage_str, version=version_str, description=desc_str)</div><div class='del'>-</div><div class='del'>-    # Basic option list</div><div class='del'>-    group = OptionGroup(parse, "Basic Options")</div><div class='del'>-    group.add_option("-n", "--name", dest="volume_name",</div><div class='del'>-                help="&lt;volume-name&gt;")</div><div class='del'>-    group.add_option("-t", "--transport", dest="transport_type",</div><div class='del'>-                default="tcp", help="tcp,ib-verbs default: tcp")</div><div class='del'>-    group.add_option("-p", "--port", type="int",</div><div class='del'>-                dest="port", help="&lt;port&gt; number")</div><div class='del'>-    group.add_option("--auth", dest="auth_param", default="*",</div><div class='del'>-                help="comma seperated ip range")</div><div class='del'>-    group.add_option("-r", "--raid", type="int", dest="raid_type",</div><div class='del'>-                help="0|1")</div><div class='del'>-    group.add_option("-c", "--conf-dir", dest="conf_dir",</div><div class='del'>-                     default=os.getcwd(),</div><div class='del'>-                     help="output directory for volume files")</div><div class='del'>-    group.add_option("--nfs", action="store_true", dest="need_nfs",</div><div class='del'>-                default=False, help="enable nfs translator")</div><div class='del'>-    parse.add_option_group(group)</div><div class='del'>-</div><div class='del'>-    # Advanced option list</div><div class='del'>-    group = OptionGroup(parse, "Advanced Options")</div><div class='del'>-    group.add_option("--ibdev", type="int", dest="ib_dev",</div><div class='del'>-                     default=1, help="Infiniband device number &lt;N&gt;")</div><div class='del'>-    group.add_option("--volume-size-server", dest="size_server",</div><div class='del'>-                     help="volume size for each server")</div><div class='del'>-    group.add_option("--volume-size-client", dest="size_client",</div><div class='del'>-                     help="volume size for each client")</div><div class='del'>-    group.add_option("--safe-mode", action="store_true",</div><div class='del'>-                     dest="enable_safe_mode", default=False,</div><div class='del'>-                     help="generate volume files in safe mode")</div><div class='del'>-    group.add_option("--num-replica", type="int", dest="num_replica",</div><div class='del'>-                     help="number of file replica needed")</div><div class='del'>-    group.add_option("--num-stripe", type="int", dest="num_stripe",</div><div class='del'>-                     help="number of stripe count needed")</div><div class='del'>-    group.add_option("--portmapper-mode", action="store_true", dest="portmapper",</div><div class='del'>-                     default=False, help="generate volume files for glusterfs portmapper friendly way")</div><div class='del'>-</div><div class='del'>-    parse.add_option_group(group)</div><div class='del'>-</div><div class='del'>-    # Changes for Dynamic Volume Manager</div><div class='del'>-    #group = OptionGroup(parse, "Dynamic Volume Options")</div><div class='del'>-    #group.add_option("--add-server", dest="add_server_args",</div><div class='del'>-    #                 help="Add server to existing volume")</div><div class='del'>-    #group.add_option("--migrate", dest="migrate_server_args",</div><div class='del'>-    #                 help="Migrate servers from existing volumes")</div><div class='del'>-</div><div class='del'>-    #parse.add_option_group(group)</div><div class='del'>-</div><div class='del'>-    (options, args) = parse.parse_args()</div><div class='del'>-</div><div class='del'>-    if options.volume_name is None:</div><div class='del'>-        print "Error: volume name is mandatory, please provide volume name"</div><div class='del'>-        raise ValueError</div><div class='del'>-</div><div class='del'>-    if options.need_nfs and options.size_client:</div><div class='del'>-        print "Error: Currently quota not supported with native NFS, please use server side instead"</div><div class='del'>-        raise ValueError</div><div class='del'>-</div><div class='del'>-    if options.transport_type:</div><div class='del'>-        transports = options.transport_type.split(',')</div><div class='del'>-        for transport in transports:</div><div class='del'>-            if (transport != "tcp" and transport != "ib-verbs"):</div><div class='del'>-                print "Error: --transport: option " + transport + \</div><div class='del'>-                    " is not valid transport type"</div><div class='del'>-                raise ValueError</div><div class='del'>-</div><div class='del'>-    if options.raid_type:</div><div class='del'>-        if (options.raid_type != 1 and options.raid_type != 0):</div><div class='del'>-            print "Error: --raid: option " + str(options.raid_type) + " is not valid raid type"</div><div class='del'>-            raise ValueError</div><div class='del'>-</div><div class='del'>-    if options.conf_dir:</div><div class='del'>-        if not os.path.isdir(options.conf_dir):</div><div class='del'>-            print "Specified directory %s doesn't exist" % options.conf_dir</div><div class='del'>-            raise ValueError</div><div class='del'>-</div><div class='del'>-    server_dict = {}</div><div class='del'>-</div><div class='del'>-    # Dynamic Volume Manager</div><div class='del'>-    #if options.add_server_args:</div><div class='del'>-    #    add_server_list = (options.add_server_args).strip().split()</div><div class='del'>-    #    check_duplicate_entry(add_server_list)</div><div class='del'>-    #    old_server_list = get_old_server_args(list_export_vols(options.conf_dir,</div><div class='del'>-    #                                                           options.volume_name),</div><div class='del'>-    #                                          options.conf_dir)</div><div class='del'>-    #    for new_server in add_server_list:</div><div class='del'>-    #        old_server_list.append(new_server)</div><div class='del'>-</div><div class='del'>-    #    server_dict = args2dict(old_server_list)</div><div class='del'>-    #    server_array = args2array(old_server_list)</div><div class='del'>-</div><div class='del'>-    #    if len (server_dict.keys()) == 0:</div><div class='del'>-    #        print "Error: no servers provided, please provide atleast one server"</div><div class='del'>-    #        raise ValueError</div><div class='del'>-</div><div class='del'>-    #else:</div><div class='del'>-    check_duplicate_entry(args)</div><div class='del'>-    server_dict = args2dict(args)</div><div class='del'>-    server_array = args2array(args)</div><div class='del'>-</div><div class='del'>-    if len (server_dict.keys()) == 0:</div><div class='del'>-        print "Error: no servers provided, please provide atleast one server"</div><div class='del'>-        raise ValueError</div><div class='del'>-</div><div class='del'>-    if options.num_replica is None:</div><div class='del'>-        options.num_replica = 2</div><div class='del'>-</div><div class='del'>-    if options.num_stripe is None:</div><div class='del'>-        options.num_stripe = 4</div><div class='del'>-</div><div class='del'>-    if options.num_replica &lt; 2:</div><div class='del'>-        print "--num-replica option (%d) is not valid" % options.num_replica</div><div class='del'>-</div><div class='del'>-    if options.num_stripe &lt; 2:</div><div class='del'>-        print "--num-stripe option (%d) is not valid" % options.num_stripe</div><div class='del'>-</div><div class='del'>-    if options.raid_type == 1:</div><div class='del'>-        if (len(server_array) % options.num_replica) != 0:</div><div class='del'>-            print "raid type (%d) and number of volumes (%d) invalid" % (options.raid_type,</div><div class='del'>-                                                                         len(server_array))</div><div class='del'>-            raise ValueError</div><div class='del'>-</div><div class='del'>-    if options.raid_type == 0:</div><div class='del'>-        if (len(server_array) % options.num_stripe) != 0:</div><div class='del'>-            print "raid type (%d) and number of volumes (%d) invalid" % (options.raid_type,</div><div class='del'>-                                                                         len(server_array))</div><div class='del'>-            raise ValueError</div><div class='del'>-</div><div class='del'>-    if options.portmapper is True:</div><div class='del'>-        for server in server_dict.keys():</div><div class='del'>-            create_exp = CreateVolfile (server_dict, server,</div><div class='del'>-                                        None, transports,</div><div class='del'>-                                        options, None)</div><div class='del'>-            try:</div><div class='del'>-                create_exp.create_pmap_export_volfile ()</div><div class='del'>-            except IOError, (errno, strerror):</div><div class='del'>-                print "Got %s creating server volfiles for %s" % (strerror, server)</div><div class='del'>-</div><div class='del'>-        for transport in transports:</div><div class='del'>-            create_mnt = CreateVolfile (server_dict, None,</div><div class='del'>-                                        transport, transports,</div><div class='del'>-                                        options, server_array)</div><div class='del'>-            try:</div><div class='del'>-                create_mnt.create_pmap_mount_volfile ()</div><div class='del'>-            except IOError, (errno, strerror):</div><div class='del'>-                print "Got %s creating client volfiles for transport '%s'" % (strerror, transport)</div><div class='del'>-</div><div class='del'>-        if options.need_nfs:</div><div class='del'>-            for transport in transports:</div><div class='del'>-                create_mnt = CreateVolfile (server_dict, None,</div><div class='del'>-                                            transport, transports,</div><div class='del'>-                                            options, server_array)</div><div class='del'>-                try:</div><div class='del'>-                    create_mnt.create_pmap_nfs_volfile ()</div><div class='del'>-                except IOError, (errno, strerror):</div><div class='del'>-                    print "Got %s creating nfs volfiles for transport '%s'" % (strerror, transport)</div><div class='del'>-</div><div class='del'>-        return</div><div class='del'>-</div><div class='del'>-    for server in server_dict.keys():</div><div class='del'>-        create_exp = CreateVolfile (server_dict, server,</div><div class='del'>-                                    None, transports,</div><div class='del'>-                                    options, None)</div><div class='del'>-        try:</div><div class='del'>-            create_exp.create_export_volfile ()</div><div class='del'>-        except IOError, (errno, strerror):</div><div class='del'>-            print "Got %s creating server volfiles for %s" % (strerror, server)</div><div class='del'>-</div><div class='del'>-    for transport in transports:</div><div class='del'>-        create_mnt = CreateVolfile (server_dict, None,</div><div class='del'>-                                    transport, transports,</div><div class='del'>-                                    options, server_array)</div><div class='del'>-        try:</div><div class='del'>-            create_mnt.create_mount_volfile ()</div><div class='del'>-        except IOError, (errno, strerror):</div><div class='del'>-            print "Got %s creating client volfiles for transport '%s'" % (strerror, transport)</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-def main ():</div><div class='del'>-</div><div class='del'>-    try:</div><div class='del'>-        generate_volume_files()</div><div class='del'>-    except ValueError:</div><div class='del'>-        sys.exit(1)</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-main()</div><div class='head'>diff --git a/extras/who-wrote-glusterfs/gitdm.aliases b/extras/who-wrote-glusterfs/gitdm.aliases<br/>new file mode 100644<br/>index 00000000000..901c12418e3<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/extras/who-wrote-glusterfs/gitdm.aliases?id=d1d7a6f35c816822fab51c820e25023863c239c1'>extras/who-wrote-glusterfs/gitdm.aliases</a></div><div class='hunk'>@@ -0,0 +1,58 @@</div><div class='add'>+#</div><div class='add'>+# This is the email aliases file, mapping secondary addresses onto a single,</div><div class='add'>+# canonical address. This file should probably match the contents of .mailmap</div><div class='add'>+# in the root of the git repository.</div><div class='add'>+#</div><div class='add'>+# Format: &lt;alias&gt; &lt;real&gt;</div><div class='add'>+</div><div class='add'>+amar@gluster.com	amarts@redhat.com</div><div class='add'>+amar@del.gluster.com	amarts@redhat.com</div><div class='add'>+avati@amp.gluster.com	avati@redhat.com</div><div class='add'>+avati@blackhole.gluster.com	avati@redhat.com</div><div class='add'>+avati@dev.gluster.com	avati@redhat.com</div><div class='add'>+avati@gluster.com	avati@redhat.com</div><div class='add'>+wheelear@gmail.com      awheeler@redhat.com</div><div class='add'>+anush@gluster.com	ashetty@redhat.com</div><div class='add'>+csaba@gluster.com	csaba@redhat.com</div><div class='add'>+csaba@lowlife.hu	csaba@redhat.com</div><div class='add'>+csaba@zresearch.com	csaba@redhat.com</div><div class='add'>+gd@samba.org            gd@redhat.com</div><div class='add'>+harsha@gluster.com	fharshav@redhat.com</div><div class='add'>+harsha@zresearch.com	fharshav@redhat.com</div><div class='add'>+harsha@dev.gluster.com	fharshav@redhat.com</div><div class='add'>+harsha@harshavardhana.net	fharshav@redhat.com</div><div class='add'>+jclift@redhat.com       jclift@gluster.org</div><div class='add'>+kkeithle@linux.keithley.org	kkeithle@redhat.com</div><div class='add'>+kkeithle@f16node1.kkeithle.usersys.redhat.com	kkeithle@redhat.com</div><div class='add'>+kaushal@gluster.com	kaushal@redhat.com</div><div class='add'>+kaushikbv@gluster.com	kbudiger@redhat.com</div><div class='add'>+krishna@gluster.com	ksriniva@redhat.com</div><div class='add'>+krishna@zresearch.com	ksriniva@redhat.com</div><div class='add'>+krishna@guest-laptop	ksriniva@redhat.com</div><div class='add'>+kp@gluster.com	kparthas@redhat.com</div><div class='add'>+me@louiszuckerman.com	louiszuckerman@gmail.com</div><div class='add'>+msvbhat@gmail.com	vbhat@redhat.com</div><div class='add'>+nullpai@gmail.com       ppai@redhat.com</div><div class='add'>+vishwanath@gluster.com	vbhat@redhat.com</div><div class='add'>+obnox@samba.org         madam@redhat.com</div><div class='add'>+oleksandr@natalenko.name        o.natalenko@lanet.ua</div><div class='add'>+patrick@puiterwijk.org  puiterwijk@fedoraproject.org</div><div class='add'>+pavan@dev.gluster.com	pavan@gluster.com</div><div class='add'>+zaitcev@yahoo.com	zaitcev@kotori.zaitcev.us</div><div class='add'>+pranithk@gluster.com	pkarampu@redhat.com</div><div class='add'>+raghavendrabhat@gluster.com	raghavendra@redhat.com</div><div class='add'>+raghavendra@gluster.com	rgowdapp@redhat.com</div><div class='add'>+raghavendra@zresearch.com	rgowdapp@redhat.com</div><div class='add'>+rahulcssjce@gmail.com	rahulcs@redhat.com</div><div class='add'>+rajesh@gluster.com	rajesh@redhat.com</div><div class='add'>+rajesh.amaravathi@gmail.com	rajesh@redhat.com</div><div class='add'>+root@ravi2.(none)       ravishankar@redhat.com</div><div class='add'>+sabansal@localhost.localdomain  sabansal@redhat.com</div><div class='add'>+shehjart@zresearch.com	shehjart@gluster.com</div><div class='add'>+venky@gluster.com	vshankar@redhat.com</div><div class='add'>+vijay@gluster.com	vbellur@redhat.com</div><div class='add'>+vijay@dev.gluster.com	vbellur@redhat.com</div><div class='add'>+vijaykumar.koppad@gmail.com	vkoppad@redhat.com</div><div class='add'>+vikas@zresearch.com	vikas@gluster.com</div><div class='add'>+shishirng@gluster.com	sgowda@redhat.com</div><div class='add'>+potatogim@potatogim.net	potatogim@gluesys.com</div><div class='head'>diff --git a/extras/who-wrote-glusterfs/gitdm.config b/extras/who-wrote-glusterfs/gitdm.config<br/>new file mode 100644<br/>index 00000000000..e1ff2bd5bda<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/extras/who-wrote-glusterfs/gitdm.config?id=d1d7a6f35c816822fab51c820e25023863c239c1'>extras/who-wrote-glusterfs/gitdm.config</a></div><div class='hunk'>@@ -0,0 +1,8 @@</div><div class='add'>+#</div><div class='add'>+# This is the gitdm configuration file for GlusterFS.</div><div class='add'>+# See the gitdm.config in the gitdm repositofy for additional options and</div><div class='add'>+# comments.</div><div class='add'>+#</div><div class='add'>+</div><div class='add'>+EmailAliases gitdm.aliases</div><div class='add'>+EmailMap gitdm.domain-map</div><div class='head'>diff --git a/extras/who-wrote-glusterfs/gitdm.domain-map b/extras/who-wrote-glusterfs/gitdm.domain-map<br/>new file mode 100644<br/>index 00000000000..7cd2bbd605b<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/extras/who-wrote-glusterfs/gitdm.domain-map?id=d1d7a6f35c816822fab51c820e25023863c239c1'>extras/who-wrote-glusterfs/gitdm.domain-map</a></div><div class='hunk'>@@ -0,0 +1,29 @@</div><div class='add'>+#</div><div class='add'>+# Here is a set of mappings of domain names onto employer names.</div><div class='add'>+#</div><div class='add'>+active.by       ActiveCloud</div><div class='add'>+appeartv.com    Appear TV</div><div class='add'>+cern.ch         CERN</div><div class='add'>+cmss.chinamobile.com    China Mobile(Suzhou) Software Technology</div><div class='add'>+datalab.es      DataLab S.L.</div><div class='add'>+fb.com          Facebook</div><div class='add'>+fedoraproject.org       Fedora Project</div><div class='add'>+gluster.com     Red Hat</div><div class='add'>+gmail.com       (personal contributions)</div><div class='add'>+gooddata.com	GoodData</div><div class='add'>+hastexo.com     hastexo</div><div class='add'>+horde.com       (personal contributions)</div><div class='add'>+ibm.com		IBM</div><div class='add'>+io.com          IO</div><div class='add'>+lanet.ua        Lanet Network</div><div class='add'>+linbit.com	LINBIT</div><div class='add'>+nectec.or.th    NECTEC</div><div class='add'>+netbsd.org	NetBSD</div><div class='add'>+netdirect.ca	Net Direct</div><div class='add'>+nokia.com       Nokia</div><div class='add'>+redhat.com	Red Hat</div><div class='add'>+stepping-stone.ch       stepping stone GmbH</div><div class='add'>+xtaotech.com    XTAO Co.</div><div class='add'>+yahoo.in        (personal contributions)</div><div class='add'>+zresearch.com   Red Hat</div><div class='add'>+gluesys.com     Gluesys</div><div class='head'>diff --git a/extras/who-wrote-glusterfs/who-wrote-glusterfs.sh b/extras/who-wrote-glusterfs/who-wrote-glusterfs.sh<br/>new file mode 100755<br/>index 00000000000..70d5964c576<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/extras/who-wrote-glusterfs/who-wrote-glusterfs.sh?id=d1d7a6f35c816822fab51c820e25023863c239c1'>extras/who-wrote-glusterfs/who-wrote-glusterfs.sh</a></div><div class='hunk'>@@ -0,0 +1,50 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+#</div><div class='add'>+# Gather statistics on "Who wrote GlusterFS". The idea comes from the excellent</div><div class='add'>+# articles on http://lwn.net/ named "Who wrote &lt;linux-version&gt;?".</div><div class='add'>+#</div><div class='add'>+# gitdm comes from git://git.lwn.net/gitdm.git by Jonathan Corbet.</div><div class='add'>+#</div><div class='add'>+# Confguration files used:</div><div class='add'>+#  - gitdm.config: main configuration file, pointing to the others</div><div class='add'>+#  - gitdm.aliases: merge users with different emailaddresses into one</div><div class='add'>+#  - gitdm.domain-map: map domain names from emailaddresses to companies</div><div class='add'>+#</div><div class='add'>+</div><div class='add'>+DIRNAME=$(dirname $0)</div><div class='add'>+</div><div class='add'>+GITDM_REPO=git://git.lwn.net/gitdm.git</div><div class='add'>+GITDM_DIR=${DIRNAME}/gitdm</div><div class='add'>+GITDM_CMD="python ${GITDM_DIR}/gitdm"</div><div class='add'>+</div><div class='add'>+error()</div><div class='add'>+{</div><div class='add'>+        local ret=${?}</div><div class='add'>+        printf "${@}\n" &gt; /dev/stderr</div><div class='add'>+        return ${ret}</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+check_gitdm()</div><div class='add'>+{</div><div class='add'>+        if [ ! -e "${GITDM_DIR}/gitdm" ]</div><div class='add'>+        then</div><div class='add'>+                git clone --quiet ${GITDM_REPO} ${DIRNAME}/gitdm</div><div class='add'>+        fi</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+# The first argument is the revision-range (see 'git rev-list --help').</div><div class='add'>+# REV can be empty, and the statistics will be calculated over the whole</div><div class='add'>+# current branch.</div><div class='add'>+REV=${1}</div><div class='add'>+shift</div><div class='add'>+# all remaining options are passed to gitdm, see the gitdm script for an</div><div class='add'>+# explanation of the accepted options.</div><div class='add'>+GITDM_OPTS=${@}</div><div class='add'>+</div><div class='add'>+if ! check_gitdm</div><div class='add'>+then</div><div class='add'>+        error "Could not find 'gitdm', exiting..."</div><div class='add'>+        exit 1</div><div class='add'>+fi</div><div class='add'>+</div><div class='add'>+git log --numstat -M ${REV} | ${GITDM_CMD} -b ${DIRNAME} -n ${GITDM_OPTS}</div><div class='head'>diff --git a/format-patch.sh b/format-patch.sh<br/>deleted file mode 100755<br/>index 12d05a03d57..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/format-patch.sh?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>format-patch.sh</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,60 +0,0 @@</div><div class='del'>-#!/bin/bash</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-function is_num()</div><div class='del'>-{</div><div class='del'>-    local num;</div><div class='del'>-</div><div class='del'>-    num="$1";</div><div class='del'>-</div><div class='del'>-    [ -z "$(echo $num | sed -e 's/[0-9]//g')" ]</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-function guess_branch()</div><div class='del'>-{</div><div class='del'>-    local branch;</div><div class='del'>-    local src_branch;</div><div class='del'>-</div><div class='del'>-    branch=$(git branch | grep '*' | cut -f2 -d' ');</div><div class='del'>-</div><div class='del'>-    if [ $branch = "master" ] ; then</div><div class='del'>-        src_branch="master";</div><div class='del'>-    else</div><div class='del'>-        src_branch=$(cat .git/logs/refs/heads/$branch | head -n 1 \</div><div class='del'>-            | sed -r -e 's/.*( [^ ]*)$/\1/g' | cut -f2 -d/);</div><div class='del'>-    fi</div><div class='del'>-</div><div class='del'>-    echo $src_branch</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-function main()</div><div class='del'>-{</div><div class='del'>-    local branch;</div><div class='del'>-    local bug;</div><div class='del'>-</div><div class='del'>-    branch=$(guess_branch);</div><div class='del'>-    echo</div><div class='del'>-    echo "Patches are always to be associated with a bug ID. If there is no   "</div><div class='del'>-    echo "bug filed in bugzilla for this patch, it is highly suggested to file"</div><div class='del'>-    echo "a new bug with a description and reasoning of this patchset. If this"</div><div class='del'>-    echo "is a new feature, then file a new enhancement bug with a brief      "</div><div class='del'>-    echo "summary of the feature as the description."</div><div class='del'>-    echo</div><div class='del'>-    echo -n "Enter bug ID (from http://bugs.gluster.com/): "</div><div class='del'>-    read bug;</div><div class='del'>-</div><div class='del'>-    [ -z "$bug" ] || is_num $bug || {</div><div class='del'>-        log "bug ID should be a valid bug number";</div><div class='del'>-        exit;</div><div class='del'>-    }</div><div class='del'>-</div><div class='del'>-    if [ -z "$bug" ]; then</div><div class='del'>-        git format-patch -s "$@";</div><div class='del'>-    else</div><div class='del'>-        git format-patch -s --subject-prefix="PATCH BUG:$bug" "$@";</div><div class='del'>-    fi</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-main "$@"</div><div class='head'>diff --git a/geo-replication/Makefile.am b/geo-replication/Makefile.am<br/>new file mode 100644<br/>index 00000000000..591b23d0eaf<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/geo-replication/Makefile.am?id=d1d7a6f35c816822fab51c820e25023863c239c1'>geo-replication/Makefile.am</a></div><div class='hunk'>@@ -0,0 +1,8 @@</div><div class='add'>+SUBDIRS = syncdaemon src</div><div class='add'>+</div><div class='add'>+CLEANFILES =</div><div class='add'>+</div><div class='add'>+EXTRA_DIST = gsyncd.conf.in</div><div class='add'>+</div><div class='add'>+gsyncdconfdir = $(sysconfdir)/glusterfs/</div><div class='add'>+gsyncdconf_DATA = gsyncd.conf</div><div class='head'>diff --git a/geo-replication/gsyncd.conf.in b/geo-replication/gsyncd.conf.in<br/>new file mode 100644<br/>index 00000000000..9688c79fab7<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/geo-replication/gsyncd.conf.in?id=d1d7a6f35c816822fab51c820e25023863c239c1'>geo-replication/gsyncd.conf.in</a></div><div class='hunk'>@@ -0,0 +1,349 @@</div><div class='add'>+[__meta__]</div><div class='add'>+version = 4.0</div><div class='add'>+</div><div class='add'>+[master-bricks]</div><div class='add'>+configurable=false</div><div class='add'>+</div><div class='add'>+[slave-bricks]</div><div class='add'>+configurable=false</div><div class='add'>+</div><div class='add'>+[master-volume-id]</div><div class='add'>+configurable=false</div><div class='add'>+</div><div class='add'>+[slave-volume-id]</div><div class='add'>+configurable=false</div><div class='add'>+</div><div class='add'>+[master-replica-count]</div><div class='add'>+configurable=false</div><div class='add'>+type=int</div><div class='add'>+value=1</div><div class='add'>+</div><div class='add'>+[master-disperse-count]</div><div class='add'>+configurable=false</div><div class='add'>+type=int</div><div class='add'>+value=1</div><div class='add'>+</div><div class='add'>+[master-distribution-count]</div><div class='add'>+configurable=false</div><div class='add'>+type=int</div><div class='add'>+value=1</div><div class='add'>+</div><div class='add'>+[glusterd-workdir]</div><div class='add'>+value = @GLUSTERD_WORKDIR@</div><div class='add'>+</div><div class='add'>+[gluster-logdir]</div><div class='add'>+value = /var/log/glusterfs</div><div class='add'>+</div><div class='add'>+[gluster-rundir]</div><div class='add'>+value = /var/run/gluster</div><div class='add'>+</div><div class='add'>+[gsyncd-miscdir]</div><div class='add'>+value = /var/lib/misc/gluster/gsyncd</div><div class='add'>+</div><div class='add'>+[stime-xattr-prefix]</div><div class='add'>+value=</div><div class='add'>+</div><div class='add'>+[checkpoint]</div><div class='add'>+value=0</div><div class='add'>+help=Set Checkpoint</div><div class='add'>+validation=unixtime</div><div class='add'>+type=int</div><div class='add'>+</div><div class='add'>+[gluster-cli-options]</div><div class='add'>+value=</div><div class='add'>+help=Gluster CLI Options</div><div class='add'>+</div><div class='add'>+[pid-file]</div><div class='add'>+value=${gluster_rundir}/gsyncd-${master}-${primary_slave_host}-${slavevol}.pid</div><div class='add'>+configurable=false</div><div class='add'>+template = true</div><div class='add'>+help=PID file path</div><div class='add'>+</div><div class='add'>+[state-file]</div><div class='add'>+value=${glusterd_workdir}/geo-replication/${master}_${primary_slave_host}_${slavevol}/monitor.status</div><div class='add'>+configurable=false</div><div class='add'>+template=true</div><div class='add'>+help=Status File path</div><div class='add'>+</div><div class='add'>+[georep-session-working-dir]</div><div class='add'>+value=${glusterd_workdir}/geo-replication/${master}_${primary_slave_host}_${slavevol}/</div><div class='add'>+template=true</div><div class='add'>+help=Session Working directory</div><div class='add'>+configurable=false</div><div class='add'>+</div><div class='add'>+[access-mount]</div><div class='add'>+value=false</div><div class='add'>+type=bool</div><div class='add'>+validation=bool</div><div class='add'>+help=Do not lazy unmount the master volume. This allows admin to access the mount for debugging.</div><div class='add'>+</div><div class='add'>+[slave-access-mount]</div><div class='add'>+value=false</div><div class='add'>+type=bool</div><div class='add'>+validation=bool</div><div class='add'>+help=Do not lazy unmount the slave volume. This allows admin to access the mount for debugging.</div><div class='add'>+</div><div class='add'>+[isolated-slaves]</div><div class='add'>+value=</div><div class='add'>+help=List of Slave nodes which are isolated</div><div class='add'>+</div><div class='add'>+[changelog-batch-size]</div><div class='add'>+# Max size of Changelogs to process per batch, Changelogs Processing is</div><div class='add'>+# not limited by the number of changelogs but instead based on</div><div class='add'>+# size of the changelog file, One sample changelog file size was 145408</div><div class='add'>+# with ~1000 CREATE and ~1000 DATA. 5 such files in one batch is 727040</div><div class='add'>+# If geo-rep worker crashes while processing a batch, it has to retry only</div><div class='add'>+# that batch since stime will get updated after each batch.</div><div class='add'>+value=727040</div><div class='add'>+help=Max size of Changelogs to process per batch.</div><div class='add'>+type=int</div><div class='add'>+</div><div class='add'>+[slave-timeout]</div><div class='add'>+value=120</div><div class='add'>+type=int</div><div class='add'>+help=Timeout in seconds for Slave Gsyncd. If no activity from master for this timeout, Slave gsyncd will be disconnected. Set Timeout to zero to skip this check.</div><div class='add'>+</div><div class='add'>+[connection-timeout]</div><div class='add'>+value=60</div><div class='add'>+type=int</div><div class='add'>+help=Timeout for mounts</div><div class='add'>+</div><div class='add'>+[replica-failover-interval]</div><div class='add'>+value=1</div><div class='add'>+type=int</div><div class='add'>+help=Minimum time interval in seconds for passive worker to become Active</div><div class='add'>+</div><div class='add'>+[changelog-archive-format]</div><div class='add'>+value=%Y%m</div><div class='add'>+help=Processed changelogs will be archived in working directory. Pattern for archive file</div><div class='add'>+</div><div class='add'>+[use-meta-volume]</div><div class='add'>+value=false</div><div class='add'>+type=bool</div><div class='add'>+help=Use this to set Active Passive mode to meta-volume.</div><div class='add'>+</div><div class='add'>+[meta-volume-mnt]</div><div class='add'>+value=/run/gluster/shared_storage</div><div class='add'>+help=Meta Volume or Shared Volume mount path</div><div class='add'>+</div><div class='add'>+[allow-network]</div><div class='add'>+value=</div><div class='add'>+</div><div class='add'>+[change-interval]</div><div class='add'>+value=5</div><div class='add'>+type=int</div><div class='add'>+</div><div class='add'>+[sync-method]</div><div class='add'>+value=rsync</div><div class='add'>+help=Sync method for data sync. Available methods are tar over ssh and rsync. Default is rsync.</div><div class='add'>+validation=choice</div><div class='add'>+allowed_values=tarssh,rsync</div><div class='add'>+</div><div class='add'>+[remote-gsyncd]</div><div class='add'>+value =</div><div class='add'>+help=If SSH keys are not secured with gsyncd prefix then use this configuration to set the actual path of gsyncd(Usually /usr/libexec/glusterfs/gsyncd)</div><div class='add'>+</div><div class='add'>+[gluster-command-dir]</div><div class='add'>+value=@SBIN_DIR@</div><div class='add'>+help=Directory where Gluster binaries exist on master</div><div class='add'>+</div><div class='add'>+[slave-gluster-command-dir]</div><div class='add'>+value=@SBIN_DIR@</div><div class='add'>+help=Directory where Gluster binaries exist on slave</div><div class='add'>+</div><div class='add'>+[gluster-params]</div><div class='add'>+value = aux-gfid-mount acl</div><div class='add'>+help=Parameters for Gluster Geo-rep mount in Master</div><div class='add'>+</div><div class='add'>+[slave-gluster-params]</div><div class='add'>+value = aux-gfid-mount acl</div><div class='add'>+help=Parameters for Gluster Geo-rep mount in Slave</div><div class='add'>+</div><div class='add'>+[ignore-deletes]</div><div class='add'>+value = false</div><div class='add'>+type=bool</div><div class='add'>+help=Do not sync deletes in Slave</div><div class='add'>+</div><div class='add'>+[special-sync-mode]</div><div class='add'>+# tunables for failover/failback mechanism:</div><div class='add'>+# None   - gsyncd behaves as normal</div><div class='add'>+# blind  - gsyncd works with xtime pairs to identify</div><div class='add'>+#          candidates for synchronization</div><div class='add'>+# wrapup - same as normal mode but does not assign</div><div class='add'>+#          xtimes to orphaned files</div><div class='add'>+# see crawl() for usage of the above tunables</div><div class='add'>+value =</div><div class='add'>+help=</div><div class='add'>+</div><div class='add'>+[gfid-conflict-resolution]</div><div class='add'>+value = true</div><div class='add'>+validation=bool</div><div class='add'>+type=bool</div><div class='add'>+help=Disables automatic gfid conflict resolution while syncing</div><div class='add'>+</div><div class='add'>+[working-dir]</div><div class='add'>+value = ${gsyncd_miscdir}/${master}_${primary_slave_host}_${slavevol}/</div><div class='add'>+template=true</div><div class='add'>+configurable=false</div><div class='add'>+help=Working directory for storing Changelogs</div><div class='add'>+</div><div class='add'>+[change-detector]</div><div class='add'>+value=changelog</div><div class='add'>+help=Change detector</div><div class='add'>+validation=choice</div><div class='add'>+allowed_values=changelog,xsync</div><div class='add'>+</div><div class='add'>+[cli-log-file]</div><div class='add'>+value=${gluster_logdir}/geo-replication/cli.log</div><div class='add'>+template=true</div><div class='add'>+configurable=false</div><div class='add'>+</div><div class='add'>+[cli-log-level]</div><div class='add'>+value=INFO</div><div class='add'>+help=Set CLI Log Level</div><div class='add'>+validation=choice</div><div class='add'>+allowed_values=ERROR,INFO,WARNING,DEBUG</div><div class='add'>+</div><div class='add'>+[log-file]</div><div class='add'>+value=${gluster_logdir}/geo-replication/${master}_${primary_slave_host}_${slavevol}/gsyncd.log</div><div class='add'>+configurable=false</div><div class='add'>+template=true</div><div class='add'>+</div><div class='add'>+[changelog-log-file]</div><div class='add'>+value=${gluster_logdir}/geo-replication/${master}_${primary_slave_host}_${slavevol}/changes-${local_id}.log</div><div class='add'>+configurable=false</div><div class='add'>+template=true</div><div class='add'>+</div><div class='add'>+[gluster-log-file]</div><div class='add'>+value=${gluster_logdir}/geo-replication/${master}_${primary_slave_host}_${slavevol}/mnt-${local_id}.log</div><div class='add'>+template=true</div><div class='add'>+configurable=false</div><div class='add'>+</div><div class='add'>+[slave-log-file]</div><div class='add'>+value=${gluster_logdir}/geo-replication-slaves/${master}_${primary_slave_host}_${slavevol}/gsyncd.log</div><div class='add'>+template=true</div><div class='add'>+configurable=false</div><div class='add'>+</div><div class='add'>+[slave-gluster-log-file]</div><div class='add'>+value=${gluster_logdir}/geo-replication-slaves/${master}_${primary_slave_host}_${slavevol}/mnt-${master_node}-${master_brick_id}.log</div><div class='add'>+template=true</div><div class='add'>+configurable=false</div><div class='add'>+</div><div class='add'>+[slave-gluster-log-file-mbr]</div><div class='add'>+value=${gluster_logdir}/geo-replication-slaves/${master}_${primary_slave_host}_${slavevol}/mnt-mbr-${master_node}-${master_brick_id}.log</div><div class='add'>+template=true</div><div class='add'>+configurable=false</div><div class='add'>+</div><div class='add'>+[log-level]</div><div class='add'>+value=INFO</div><div class='add'>+help=Set Log Level</div><div class='add'>+validation=choice</div><div class='add'>+allowed_values=ERROR,INFO,WARNING,DEBUG</div><div class='add'>+</div><div class='add'>+[gluster-log-level]</div><div class='add'>+value=INFO</div><div class='add'>+help=Set Gluster mount Log Level</div><div class='add'>+validation=choice</div><div class='add'>+allowed_values=ERROR,INFO,WARNING,DEBUG</div><div class='add'>+</div><div class='add'>+[changelog-log-level]</div><div class='add'>+value=INFO</div><div class='add'>+help=Set Changelog Log Level</div><div class='add'>+validation=choice</div><div class='add'>+allowed_values=ERROR,INFO,WARNING,DEBUG</div><div class='add'>+</div><div class='add'>+[slave-log-level]</div><div class='add'>+value=INFO</div><div class='add'>+help=Set Slave Gsyncd Log Level</div><div class='add'>+validation=choice</div><div class='add'>+allowed_values=ERROR,INFO,WARNING,DEBUG</div><div class='add'>+</div><div class='add'>+[slave-gluster-log-level]</div><div class='add'>+value=INFO</div><div class='add'>+help=Set Slave Gluster mount Log Level</div><div class='add'>+validation=choice</div><div class='add'>+allowed_values=ERROR,INFO,WARNING,DEBUG</div><div class='add'>+</div><div class='add'>+[ssh-port]</div><div class='add'>+value=22</div><div class='add'>+validation=minmax</div><div class='add'>+min=1</div><div class='add'>+max=65535</div><div class='add'>+help=Set SSH port</div><div class='add'>+type=int</div><div class='add'>+</div><div class='add'>+[ssh-command]</div><div class='add'>+value=ssh</div><div class='add'>+help=Set ssh binary path</div><div class='add'>+validation=execpath</div><div class='add'>+</div><div class='add'>+[tar-command]</div><div class='add'>+value=tar</div><div class='add'>+help=Set tar command path</div><div class='add'>+validation=execpath</div><div class='add'>+</div><div class='add'>+[ssh-options]</div><div class='add'>+value = -oPasswordAuthentication=no -oStrictHostKeyChecking=no -i ${glusterd_workdir}/geo-replication/secret.pem</div><div class='add'>+template=true</div><div class='add'>+</div><div class='add'>+[ssh-options-tar]</div><div class='add'>+value = -oPasswordAuthentication=no -oStrictHostKeyChecking=no -i ${glusterd_workdir}/geo-replication/tar_ssh.pem</div><div class='add'>+template=true</div><div class='add'>+</div><div class='add'>+[gluster-command]</div><div class='add'>+value=gluster</div><div class='add'>+help=Set gluster binary path</div><div class='add'>+validation=execpath</div><div class='add'>+</div><div class='add'>+[sync-jobs]</div><div class='add'>+value=3</div><div class='add'>+help=Number of Syncer jobs</div><div class='add'>+validation=minmax</div><div class='add'>+min=1</div><div class='add'>+max=100</div><div class='add'>+type=int</div><div class='add'>+</div><div class='add'>+[rsync-command]</div><div class='add'>+value=rsync</div><div class='add'>+help=Set rsync command path</div><div class='add'>+validation=execpath</div><div class='add'>+</div><div class='add'>+[rsync-options]</div><div class='add'>+value=</div><div class='add'>+</div><div class='add'>+[rsync-ssh-options]</div><div class='add'>+value=</div><div class='add'>+</div><div class='add'>+[rsync-opt-ignore-missing-args]</div><div class='add'>+value=true</div><div class='add'>+type=bool</div><div class='add'>+</div><div class='add'>+[rsync-opt-existing]</div><div class='add'>+value=true</div><div class='add'>+type=bool</div><div class='add'>+</div><div class='add'>+[log-rsync-performance]</div><div class='add'>+value=false</div><div class='add'>+help=Log Rsync performance</div><div class='add'>+validation=bool</div><div class='add'>+type=bool</div><div class='add'>+</div><div class='add'>+[use-rsync-xattrs]</div><div class='add'>+value=false</div><div class='add'>+type=bool</div><div class='add'>+</div><div class='add'>+[sync-xattrs]</div><div class='add'>+value=true</div><div class='add'>+type=bool</div><div class='add'>+</div><div class='add'>+[sync-acls]</div><div class='add'>+value=true</div><div class='add'>+type=bool</div><div class='add'>+</div><div class='add'>+[max-rsync-retries]</div><div class='add'>+value=10</div><div class='add'>+type=int</div><div class='add'>+</div><div class='add'>+[state_socket_unencoded]</div><div class='add'>+# Unused, For backward compatibility</div><div class='add'>+value=</div><div class='head'>diff --git a/geo-replication/setup.py b/geo-replication/setup.py<br/>new file mode 100644<br/>index 00000000000..0eae469d2d6<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/geo-replication/setup.py?id=d1d7a6f35c816822fab51c820e25023863c239c1'>geo-replication/setup.py</a></div><div class='hunk'>@@ -0,0 +1,32 @@</div><div class='add'>+#</div><div class='add'>+# Copyright (c) 2011-2014 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+# This file is part of GlusterFS.</div><div class='add'>+#</div><div class='add'>+# This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+# General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+# later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+# cases as published by the Free Software Foundation.</div><div class='add'>+#</div><div class='add'>+</div><div class='add'>+"""</div><div class='add'>+This setup.py only used to run tests, since geo-replication will</div><div class='add'>+be installed in /usr/local/libexec/glusterfs or /usr/libexec/glusterfs</div><div class='add'>+"""</div><div class='add'>+from setuptools import setup</div><div class='add'>+</div><div class='add'>+name = 'syncdaemon'</div><div class='add'>+</div><div class='add'>+setup(</div><div class='add'>+    name=name,</div><div class='add'>+    version="",</div><div class='add'>+    description='GlusterFS Geo Replication',</div><div class='add'>+    license='GPLV2 and LGPLV3+',</div><div class='add'>+    author='Red Hat, Inc.',</div><div class='add'>+    author_email='gluster-devel@gluster.org',</div><div class='add'>+    url='http://www.gluster.org',</div><div class='add'>+    packages=[name, ],</div><div class='add'>+    test_suite='nose.collector',</div><div class='add'>+    install_requires=[],</div><div class='add'>+    scripts=[],</div><div class='add'>+    entry_points={},</div><div class='add'>+)</div><div class='head'>diff --git a/geo-replication/src/Makefile.am b/geo-replication/src/Makefile.am<br/>new file mode 100644<br/>index 00000000000..9937a0bd026<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/geo-replication/src/Makefile.am?id=d1d7a6f35c816822fab51c820e25023863c239c1'>geo-replication/src/Makefile.am</a></div><div class='hunk'>@@ -0,0 +1,48 @@</div><div class='add'>+gsyncddir = $(GLUSTERFS_LIBEXECDIR)</div><div class='add'>+</div><div class='add'>+gsyncd_SCRIPTS = gverify.sh peer_gsec_create \</div><div class='add'>+	set_geo_rep_pem_keys.sh peer_mountbroker peer_mountbroker.py \</div><div class='add'>+	peer_georep-sshkey.py</div><div class='add'>+</div><div class='add'>+# peer_gsec_create and peer_add_secret_pub are not added to</div><div class='add'>+# EXTRA_DIST as it's derived from a .in file</div><div class='add'>+EXTRA_DIST = gverify.sh set_geo_rep_pem_keys.sh peer_mountbroker.py.in \</div><div class='add'>+	peer_georep-sshkey.py.in</div><div class='add'>+</div><div class='add'>+gsyncd_PROGRAMS = gsyncd</div><div class='add'>+</div><div class='add'>+gsyncd_SOURCES = gsyncd.c procdiggy.c</div><div class='add'>+</div><div class='add'>+gsyncd_LDADD = $(GF_LDADD) $(top_builddir)/libglusterfs/src/libglusterfs.la</div><div class='add'>+</div><div class='add'>+gsyncd_LDFLAGS = $(GF_LDFLAGS)</div><div class='add'>+</div><div class='add'>+noinst_HEADERS = procdiggy.h</div><div class='add'>+</div><div class='add'>+AM_CPPFLAGS = $(GF_CPPFLAGS) -I$(top_srcdir)/libglusterfs/src \</div><div class='add'>+	-I$(top_srcdir)/rpc/xdr/src -I$(top_builddir)/rpc/xdr/src \</div><div class='add'>+	-DGSYNCD_PREFIX=\"$(GLUSTERFS_LIBEXECDIR)\" -DUSE_LIBGLUSTERFS \</div><div class='add'>+	-DSBIN_DIR=\"$(sbindir)\" -DPYTHON=\"$(PYTHON)\"</div><div class='add'>+</div><div class='add'>+AM_CFLAGS = -Wall $(GF_CFLAGS)</div><div class='add'>+</div><div class='add'>+CLEANFILES =</div><div class='add'>+</div><div class='add'>+$(top_builddir)/libglusterfs/src/libglusterfs.la:</div><div class='add'>+	$(MAKE) -C $(top_builddir)/libglusterfs/src/ all</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+install-exec-hook:</div><div class='add'>+	$(mkdir_p) $(DESTDIR)$(sbindir)</div><div class='add'>+	rm -f $(DESTDIR)$(sbindir)/gluster-mountbroker</div><div class='add'>+	ln -s $(GLUSTERFS_LIBEXECDIR)/peer_mountbroker.py \</div><div class='add'>+		$(DESTDIR)$(sbindir)/gluster-mountbroker</div><div class='add'>+</div><div class='add'>+	rm -f $(DESTDIR)$(sbindir)/gluster-georep-sshkey</div><div class='add'>+	ln -s $(GLUSTERFS_LIBEXECDIR)/peer_georep-sshkey.py \</div><div class='add'>+		$(DESTDIR)$(sbindir)/gluster-georep-sshkey</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+uninstall-hook:</div><div class='add'>+	rm -f $(DESTDIR)$(sbindir)/gluster-mountbroker</div><div class='add'>+	rm -f $(DESTDIR)$(sbindir)/gluster-georep-sshkey</div><div class='head'>diff --git a/geo-replication/src/gsyncd.c b/geo-replication/src/gsyncd.c<br/>new file mode 100644<br/>index 00000000000..b5aeec5bf33<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/geo-replication/src/gsyncd.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>geo-replication/src/gsyncd.c</a></div><div class='hunk'>@@ -0,0 +1,402 @@</div><div class='add'>+/*</div><div class='add'>+   Copyright (c) 2011-2012 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+   This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+   This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+   General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+   later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+   cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+#include &lt;glusterfs/compat.h&gt;</div><div class='add'>+#include &lt;glusterfs/syscall.h&gt;</div><div class='add'>+</div><div class='add'>+#include &lt;stdlib.h&gt;</div><div class='add'>+#include &lt;stdio.h&gt;</div><div class='add'>+#include &lt;unistd.h&gt;</div><div class='add'>+#include &lt;string.h&gt;</div><div class='add'>+#include &lt;sys/param.h&gt; /* for PATH_MAX */</div><div class='add'>+</div><div class='add'>+/* NOTE (USE_LIBGLUSTERFS):</div><div class='add'>+ * ------------------------</div><div class='add'>+ * When USE_LIBGLUSTERFS debugging sumbol is passed; perform</div><div class='add'>+ * glusterfs translator like initialization so that glusterfs</div><div class='add'>+ * globals, contexts are valid when glustefs api's are invoked.</div><div class='add'>+ * We unconditionally pass then while building gsyncd binary.</div><div class='add'>+ */</div><div class='add'>+#ifdef USE_LIBGLUSTERFS</div><div class='add'>+#include &lt;glusterfs/glusterfs.h&gt;</div><div class='add'>+#include &lt;glusterfs/globals.h&gt;</div><div class='add'>+#include &lt;glusterfs/defaults.h&gt;</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#include &lt;glusterfs/common-utils.h&gt;</div><div class='add'>+#include &lt;glusterfs/run.h&gt;</div><div class='add'>+#include "procdiggy.h"</div><div class='add'>+</div><div class='add'>+#define _GLUSTERD_CALLED_ "_GLUSTERD_CALLED_"</div><div class='add'>+#define _GSYNCD_DISPATCHED_ "_GSYNCD_DISPATCHED_"</div><div class='add'>+#define GSYNCD_CONF_TEMPLATE "geo-replication/gsyncd_template.conf"</div><div class='add'>+#define GSYNCD_PY "gsyncd.py"</div><div class='add'>+#define RSYNC "rsync"</div><div class='add'>+</div><div class='add'>+int restricted = 0;</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+duplexpand(void **buf, size_t tsiz, size_t *len)</div><div class='add'>+{</div><div class='add'>+    size_t osiz = tsiz * *len;</div><div class='add'>+    char *p = realloc(*buf, osiz &lt;&lt; 1);</div><div class='add'>+    if (!p) {</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    memset(p + osiz, 0, osiz);</div><div class='add'>+    *buf = p;</div><div class='add'>+    *len &lt;&lt;= 1;</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+str2argv(char *str, char ***argv)</div><div class='add'>+{</div><div class='add'>+    char *p = NULL;</div><div class='add'>+    char *savetok = NULL;</div><div class='add'>+    char *temp = NULL;</div><div class='add'>+    char *temp1 = NULL;</div><div class='add'>+    int argc = 0;</div><div class='add'>+    size_t argv_len = 32;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    int i = 0;</div><div class='add'>+</div><div class='add'>+    assert(str);</div><div class='add'>+    temp = str = strdup(str);</div><div class='add'>+    if (!str)</div><div class='add'>+        goto error;</div><div class='add'>+</div><div class='add'>+    *argv = calloc(argv_len, sizeof(**argv));</div><div class='add'>+    if (!*argv)</div><div class='add'>+        goto error;</div><div class='add'>+</div><div class='add'>+    while ((p = strtok_r(str, " ", &amp;savetok))) {</div><div class='add'>+        str = NULL;</div><div class='add'>+</div><div class='add'>+        argc++;</div><div class='add'>+        if (argc == argv_len) {</div><div class='add'>+            ret = duplexpand((void *)argv, sizeof(**argv), &amp;argv_len);</div><div class='add'>+            if (ret == -1)</div><div class='add'>+                goto error;</div><div class='add'>+        }</div><div class='add'>+        temp1 = strdup(p);</div><div class='add'>+        if (!temp1)</div><div class='add'>+            goto error;</div><div class='add'>+        (*argv)[argc - 1] = temp1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    free(temp);</div><div class='add'>+    return argc;</div><div class='add'>+</div><div class='add'>+error:</div><div class='add'>+    fprintf(stderr, "out of memory\n");</div><div class='add'>+    free(temp);</div><div class='add'>+    for (i = 0; i &lt; argc - 1; i++)</div><div class='add'>+        free((*argv)[i]);</div><div class='add'>+    free(*argv);</div><div class='add'>+    return -1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+invoke_gsyncd(int argc, char **argv)</div><div class='add'>+{</div><div class='add'>+    int i = 0;</div><div class='add'>+    int j = 0;</div><div class='add'>+    char *nargv[argc + 4];</div><div class='add'>+    char *python = NULL;</div><div class='add'>+</div><div class='add'>+    if (chdir("/") == -1)</div><div class='add'>+        goto error;</div><div class='add'>+</div><div class='add'>+    j = 0;</div><div class='add'>+    python = getenv("PYTHON");</div><div class='add'>+    if (!python)</div><div class='add'>+        python = PYTHON;</div><div class='add'>+    nargv[j++] = python;</div><div class='add'>+    nargv[j++] = GSYNCD_PREFIX "/python/syncdaemon/" GSYNCD_PY;</div><div class='add'>+    for (i = 1; i &lt; argc; i++)</div><div class='add'>+        nargv[j++] = argv[i];</div><div class='add'>+</div><div class='add'>+    nargv[j++] = NULL;</div><div class='add'>+</div><div class='add'>+    execvp(python, nargv);</div><div class='add'>+</div><div class='add'>+    fprintf(stderr, "exec of '%s' failed\n", python);</div><div class='add'>+    return 127;</div><div class='add'>+</div><div class='add'>+error:</div><div class='add'>+    fprintf(stderr, "gsyncd initializaion failed\n");</div><div class='add'>+    return 1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+find_gsyncd(pid_t pid, pid_t ppid, char *name, void *data)</div><div class='add'>+{</div><div class='add'>+    char buf[NAME_MAX * 2] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    char path[PATH_MAX] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    char *p = NULL;</div><div class='add'>+    int zeros = 0;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    int fd = -1;</div><div class='add'>+    pid_t *pida = (pid_t *)data;</div><div class='add'>+</div><div class='add'>+    if (ppid != pida[0])</div><div class='add'>+        return 0;</div><div class='add'>+</div><div class='add'>+    snprintf(path, sizeof path, PROC "/%d/cmdline", pid);</div><div class='add'>+    fd = open(path, O_RDONLY);</div><div class='add'>+    if (fd == -1)</div><div class='add'>+        return 0;</div><div class='add'>+    ret = sys_read(fd, buf, sizeof(buf));</div><div class='add'>+    sys_close(fd);</div><div class='add'>+    if (ret == -1)</div><div class='add'>+        return 0;</div><div class='add'>+    for (zeros = 0, p = buf; zeros &lt; 2 &amp;&amp; p &lt; buf + ret; p++)</div><div class='add'>+        zeros += !*p;</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+    switch (zeros) {</div><div class='add'>+        case 2:</div><div class='add'>+            if ((strcmp(basename(buf), basename(PYTHON)) ||</div><div class='add'>+                 strcmp(basename(buf + strlen(buf) + 1), GSYNCD_PY)) == 0) {</div><div class='add'>+                ret = 1;</div><div class='add'>+                break;</div><div class='add'>+            }</div><div class='add'>+            /* fallthrough */</div><div class='add'>+        case 1:</div><div class='add'>+            if (strcmp(basename(buf), GSYNCD_PY) == 0)</div><div class='add'>+                ret = 1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (ret == 1) {</div><div class='add'>+        if (pida[1] != -1) {</div><div class='add'>+            fprintf(stderr, GSYNCD_PY " sibling is not unique");</div><div class='add'>+            return -1;</div><div class='add'>+        }</div><div class='add'>+        pida[1] = pid;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+invoke_rsync(int argc, char **argv)</div><div class='add'>+{</div><div class='add'>+    int i = 0;</div><div class='add'>+    char path[PATH_MAX] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    pid_t pid = -1;</div><div class='add'>+    pid_t ppid = -1;</div><div class='add'>+    pid_t pida[] = {-1, -1};</div><div class='add'>+    char *name = NULL;</div><div class='add'>+    char buf[PATH_MAX + 1] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    assert(argv[argc] == NULL);</div><div class='add'>+</div><div class='add'>+    if (argc &lt; 2 || strcmp(argv[1], "--server") != 0)</div><div class='add'>+        goto error;</div><div class='add'>+</div><div class='add'>+    for (i = 2; i &lt; argc &amp;&amp; argv[i][0] == '-'; i++)</div><div class='add'>+        ;</div><div class='add'>+</div><div class='add'>+    if (!(i == argc - 2 &amp;&amp; strcmp(argv[i], ".") == 0 &amp;&amp;</div><div class='add'>+          argv[i + 1][0] == '/')) {</div><div class='add'>+        fprintf(stderr, "need an rsync invocation without protected args\n");</div><div class='add'>+        goto error;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* look up sshd we are spawned from */</div><div class='add'>+    for (pid = getpid();; pid = ppid) {</div><div class='add'>+        ppid = pidinfo(pid, &amp;name);</div><div class='add'>+        if (ppid &lt; 0) {</div><div class='add'>+            fprintf(stderr, "sshd ancestor not found\n");</div><div class='add'>+            goto error;</div><div class='add'>+        }</div><div class='add'>+        if (strcmp(name, "sshd") == 0) {</div><div class='add'>+            GF_FREE(name);</div><div class='add'>+            break;</div><div class='add'>+        }</div><div class='add'>+        GF_FREE(name);</div><div class='add'>+    }</div><div class='add'>+    /* look up "ssh-sibling" gsyncd */</div><div class='add'>+    pida[0] = pid;</div><div class='add'>+    ret = prociter(find_gsyncd, pida);</div><div class='add'>+    if (ret == -1 || pida[1] == -1) {</div><div class='add'>+        fprintf(stderr, "gsyncd sibling not found\n");</div><div class='add'>+        goto error;</div><div class='add'>+    }</div><div class='add'>+    /* check if rsync target matches gsyncd target */</div><div class='add'>+    snprintf(path, sizeof path, PROC "/%d/cwd", pida[1]);</div><div class='add'>+    ret = sys_readlink(path, buf, sizeof(buf));</div><div class='add'>+    if (ret == -1 || ret == sizeof(buf))</div><div class='add'>+        goto error;</div><div class='add'>+    if (strcmp(argv[argc - 1], "/") == 0 /* root dir cannot be a target */ ||</div><div class='add'>+        (strcmp(argv[argc - 1], path) /* match against gluster target */ &amp;&amp;</div><div class='add'>+         strcmp(argv[argc - 1], buf) /* match against file target */) != 0) {</div><div class='add'>+        fprintf(stderr, "rsync target does not match " GEOREP " session\n");</div><div class='add'>+        goto error;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    argv[0] = RSYNC;</div><div class='add'>+</div><div class='add'>+    execvp(RSYNC, argv);</div><div class='add'>+</div><div class='add'>+    fprintf(stderr, "exec of " RSYNC " failed\n");</div><div class='add'>+    return 127;</div><div class='add'>+</div><div class='add'>+error:</div><div class='add'>+    fprintf(stderr, "disallowed " RSYNC " invocation\n");</div><div class='add'>+    return 1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+invoke_gluster(int argc, char **argv)</div><div class='add'>+{</div><div class='add'>+    int i = 0;</div><div class='add'>+    int j = 0;</div><div class='add'>+    int optsover = 0;</div><div class='add'>+    char *ov = NULL;</div><div class='add'>+</div><div class='add'>+    for (i = 1; i &lt; argc; i++) {</div><div class='add'>+        ov = strtail(argv[i], "--");</div><div class='add'>+        if (ov &amp;&amp; !optsover) {</div><div class='add'>+            if (*ov == '\0')</div><div class='add'>+                optsover = 1;</div><div class='add'>+            continue;</div><div class='add'>+        }</div><div class='add'>+        switch (++j) {</div><div class='add'>+            case 1:</div><div class='add'>+                if (strcmp(argv[i], "volume") != 0)</div><div class='add'>+                    goto error;</div><div class='add'>+                break;</div><div class='add'>+            case 2:</div><div class='add'>+                if (strcmp(argv[i], "info") != 0)</div><div class='add'>+                    goto error;</div><div class='add'>+                break;</div><div class='add'>+            case 3:</div><div class='add'>+                break;</div><div class='add'>+            default:</div><div class='add'>+                goto error;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    argv[0] = "gluster";</div><div class='add'>+    execvp(SBIN_DIR "/gluster", argv);</div><div class='add'>+    fprintf(stderr, "exec of gluster failed\n");</div><div class='add'>+    return 127;</div><div class='add'>+</div><div class='add'>+error:</div><div class='add'>+    fprintf(stderr, "disallowed gluster invocation\n");</div><div class='add'>+    return 1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+struct invocable {</div><div class='add'>+    char *name;</div><div class='add'>+    int (*invoker)(int argc, char **argv);</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct invocable invocables[] = {{"rsync", invoke_rsync},</div><div class='add'>+                                 {"gsyncd", invoke_gsyncd},</div><div class='add'>+                                 {"gluster", invoke_gluster},</div><div class='add'>+                                 {NULL, NULL}};</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+main(int argc, char **argv)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    char *evas = NULL;</div><div class='add'>+    struct invocable *i = NULL;</div><div class='add'>+    char *b = NULL;</div><div class='add'>+    char *sargv = NULL;</div><div class='add'>+    int j = 0;</div><div class='add'>+</div><div class='add'>+#ifdef USE_LIBGLUSTERFS</div><div class='add'>+    glusterfs_ctx_t *ctx = NULL;</div><div class='add'>+</div><div class='add'>+    ctx = glusterfs_ctx_new();</div><div class='add'>+    if (!ctx)</div><div class='add'>+        return ENOMEM;</div><div class='add'>+</div><div class='add'>+    if (glusterfs_globals_init(ctx))</div><div class='add'>+        return 1;</div><div class='add'>+</div><div class='add'>+    THIS-&gt;ctx = ctx;</div><div class='add'>+    ret = default_mem_acct_init(THIS);</div><div class='add'>+    if (ret) {</div><div class='add'>+        fprintf(stderr, "internal error: mem accounting failed\n");</div><div class='add'>+        return 1;</div><div class='add'>+    }</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+    evas = getenv(_GLUSTERD_CALLED_);</div><div class='add'>+    if (evas &amp;&amp; strcmp(evas, "1") == 0)</div><div class='add'>+        /* OK, we know glusterd called us, no need to look for further config</div><div class='add'>+         *...although this conclusion should not inherit to our children</div><div class='add'>+         */</div><div class='add'>+        unsetenv(_GLUSTERD_CALLED_);</div><div class='add'>+    else {</div><div class='add'>+        /* we regard all gsyncd invocations unsafe</div><div class='add'>+         * that do not come from glusterd and</div><div class='add'>+         * therefore restrict it</div><div class='add'>+         */</div><div class='add'>+        restricted = 1;</div><div class='add'>+</div><div class='add'>+        if (!getenv(_GSYNCD_DISPATCHED_)) {</div><div class='add'>+            evas = getenv("SSH_ORIGINAL_COMMAND");</div><div class='add'>+            if (evas)</div><div class='add'>+                sargv = evas;</div><div class='add'>+            else {</div><div class='add'>+                evas = getenv("SHELL");</div><div class='add'>+                if (evas &amp;&amp; strcmp(basename(evas), "gsyncd") == 0 &amp;&amp;</div><div class='add'>+                    argc == 3 &amp;&amp; strcmp(argv[1], "-c") == 0)</div><div class='add'>+                    sargv = argv[2];</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (!(sargv &amp;&amp; restricted))</div><div class='add'>+        return invoke_gsyncd(argc, argv);</div><div class='add'>+</div><div class='add'>+    argc = str2argv(sargv, &amp;argv);</div><div class='add'>+</div><div class='add'>+    if (argc == -1) {</div><div class='add'>+        fprintf(stderr, "internal error\n");</div><div class='add'>+        return 1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (setenv(_GSYNCD_DISPATCHED_, "1", 1) == -1) {</div><div class='add'>+        fprintf(stderr, "internal error\n");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    b = basename(argv[0]);</div><div class='add'>+    for (i = invocables; i-&gt;name; i++) {</div><div class='add'>+        if (strcmp(b, i-&gt;name) == 0)</div><div class='add'>+            return i-&gt;invoker(argc, argv);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    fprintf(stderr, "invoking %s in restricted SSH session is not allowed\n",</div><div class='add'>+            b);</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    for (j = 1; j &lt; argc; j++)</div><div class='add'>+        free(argv[j]);</div><div class='add'>+    free(argv);</div><div class='add'>+    return 1;</div><div class='add'>+}</div><div class='head'>diff --git a/geo-replication/src/gverify.sh b/geo-replication/src/gverify.sh<br/>new file mode 100755<br/>index 00000000000..f5f70d245e0<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/geo-replication/src/gverify.sh?id=d1d7a6f35c816822fab51c820e25023863c239c1'>geo-replication/src/gverify.sh</a></div><div class='hunk'>@@ -0,0 +1,276 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+# Script to verify the Master and Slave Gluster compatibility.</div><div class='add'>+# To use ./gverify &lt;master volume&gt; &lt;slave user&gt; &lt;slave host&gt; &lt;slave volume&gt; &lt;ssh port&gt; &lt;log file&gt;</div><div class='add'>+# Returns 0 if master and slave compatible.</div><div class='add'>+</div><div class='add'>+# Considering buffer_size 100MB</div><div class='add'>+BUFFER_SIZE=104857600;</div><div class='add'>+SSH_PORT=$5;</div><div class='add'>+master_log_file=`gluster --print-logdir`/geo-replication/gverify-mastermnt.log</div><div class='add'>+slave_log_file=`gluster --print-logdir`/geo-replication/gverify-slavemnt.log</div><div class='add'>+</div><div class='add'>+function SSHM()</div><div class='add'>+{</div><div class='add'>+    if [[ -z "${GR_SSH_IDENTITY_KEY}" ]]; then</div><div class='add'>+        ssh -p ${SSH_PORT} -q \</div><div class='add'>+	    -oPasswordAuthentication=no \</div><div class='add'>+	    -oStrictHostKeyChecking=no \</div><div class='add'>+	    -oControlMaster=yes \</div><div class='add'>+	    "$@";</div><div class='add'>+    else</div><div class='add'>+        ssh -p ${SSH_PORT} -i ${GR_SSH_IDENTITY_KEY} -q \</div><div class='add'>+	    -oPasswordAuthentication=no \</div><div class='add'>+	    -oStrictHostKeyChecking=no \</div><div class='add'>+	    -oControlMaster=yes \</div><div class='add'>+	    "$@";</div><div class='add'>+    fi</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function get_inode_num()</div><div class='add'>+{</div><div class='add'>+    local os</div><div class='add'>+    case `uname -s` in</div><div class='add'>+        NetBSD) os="NetBSD";;</div><div class='add'>+        Linux)  os="Linux";;</div><div class='add'>+        *)      os="Default";;</div><div class='add'>+    esac</div><div class='add'>+</div><div class='add'>+    if [[ "X$os" = "XNetBSD" ]]; then</div><div class='add'>+        echo $(stat -f "%i" "$1")</div><div class='add'>+    else</div><div class='add'>+        echo $(stat -c "%i" "$1")</div><div class='add'>+    fi</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function umount_lazy()</div><div class='add'>+{</div><div class='add'>+    local os</div><div class='add'>+    case `uname -s` in</div><div class='add'>+        NetBSD) os="NetBSD";;</div><div class='add'>+        Linux)  os="Linux";;</div><div class='add'>+        *)      os="Default";;</div><div class='add'>+    esac</div><div class='add'>+</div><div class='add'>+    if [[ "X$os" = "XNetBSD" ]]; then</div><div class='add'>+        umount -f -R "$1"</div><div class='add'>+    else</div><div class='add'>+        umount -l "$1"</div><div class='add'>+    fi;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function disk_usage()</div><div class='add'>+{</div><div class='add'>+    local os</div><div class='add'>+    case `uname -s` in</div><div class='add'>+        NetBSD) os="NetBSD";;</div><div class='add'>+        Linux)  os="Linux";;</div><div class='add'>+        *)      os="Default";;</div><div class='add'>+    esac</div><div class='add'>+</div><div class='add'>+    if [[ "X$os" = "XNetBSD" ]]; then</div><div class='add'>+        echo $(df -P "$1" | tail -1)</div><div class='add'>+    else</div><div class='add'>+        echo $(df -P -B1 "$1" | tail -1)</div><div class='add'>+    fi;</div><div class='add'>+</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function cmd_slave()</div><div class='add'>+{</div><div class='add'>+    local cmd_line;</div><div class='add'>+    cmd_line=$(cat &lt;&lt;EOF</div><div class='add'>+function do_verify() {</div><div class='add'>+ver=\$(gluster --version | head -1 | cut -f2 -d " ");</div><div class='add'>+echo \$ver;</div><div class='add'>+};</div><div class='add'>+source /etc/profile &amp;&amp; do_verify;</div><div class='add'>+EOF</div><div class='add'>+);</div><div class='add'>+</div><div class='add'>+echo $cmd_line;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function master_stats()</div><div class='add'>+{</div><div class='add'>+    MASTERVOL=$1;</div><div class='add'>+    local inet6=$2;</div><div class='add'>+    local d;</div><div class='add'>+    local i;</div><div class='add'>+    local disk_size;</div><div class='add'>+    local used_size;</div><div class='add'>+    local ver;</div><div class='add'>+    local m_status;</div><div class='add'>+</div><div class='add'>+    d=$(mktemp -d -t ${0##*/}.XXXXXX 2&gt;/dev/null);</div><div class='add'>+    if [ "$inet6" = "inet6" ]; then</div><div class='add'>+        glusterfs -s localhost --xlator-option="*dht.lookup-unhashed=off" --xlator-option="transport.address-family=inet6" --volfile-id $MASTERVOL -l $master_log_file $d;</div><div class='add'>+    else</div><div class='add'>+        glusterfs -s localhost --xlator-option="*dht.lookup-unhashed=off" --volfile-id $MASTERVOL -l $master_log_file $d;</div><div class='add'>+    fi</div><div class='add'>+</div><div class='add'>+    i=$(get_inode_num $d);</div><div class='add'>+    if [[ "$i" -ne "1" ]]; then</div><div class='add'>+        echo 0:0;</div><div class='add'>+        exit 1;</div><div class='add'>+    fi;</div><div class='add'>+    cd $d;</div><div class='add'>+    disk_size=$(disk_usage $d | awk "{print \$2}");</div><div class='add'>+    used_size=$(disk_usage $d | awk "{print \$3}");</div><div class='add'>+    umount_lazy $d;</div><div class='add'>+    rmdir $d;</div><div class='add'>+    ver=$(gluster --version | head -1 | cut -f2 -d " ");</div><div class='add'>+    m_status=$(echo "$disk_size:$used_size:$ver");</div><div class='add'>+    echo $m_status</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+function slave_stats()</div><div class='add'>+{</div><div class='add'>+    SLAVEUSER=$1;</div><div class='add'>+    SLAVEHOST=$2;</div><div class='add'>+    SLAVEVOL=$3;</div><div class='add'>+    local inet6=$4;</div><div class='add'>+    local cmd_line;</div><div class='add'>+    local ver;</div><div class='add'>+    local status;</div><div class='add'>+</div><div class='add'>+    d=$(mktemp -d -t ${0##*/}.XXXXXX 2&gt;/dev/null);</div><div class='add'>+    if [ "$inet6" = "inet6" ]; then</div><div class='add'>+        glusterfs --xlator-option="*dht.lookup-unhashed=off" --xlator-option="transport.address-family=inet6" --volfile-server $SLAVEHOST --volfile-id $SLAVEVOL -l $slave_log_file $d;</div><div class='add'>+    else</div><div class='add'>+        glusterfs --xlator-option="*dht.lookup-unhashed=off" --volfile-server $SLAVEHOST --volfile-id $SLAVEVOL -l $slave_log_file $d;</div><div class='add'>+    fi</div><div class='add'>+</div><div class='add'>+    i=$(get_inode_num $d);</div><div class='add'>+    if [[ "$i" -ne "1" ]]; then</div><div class='add'>+        echo 0:0;</div><div class='add'>+        exit 1;</div><div class='add'>+    fi;</div><div class='add'>+    cd $d;</div><div class='add'>+    disk_size=$(disk_usage $d | awk "{print \$2}");</div><div class='add'>+    used_size=$(disk_usage $d | awk "{print \$3}");</div><div class='add'>+    no_of_files=$(find $d -maxdepth 1 -path "$d/.trashcan" -prune -o -path "$d" -o -print0 -quit);</div><div class='add'>+    umount_lazy $d;</div><div class='add'>+    rmdir $d;</div><div class='add'>+</div><div class='add'>+    cmd_line=$(cmd_slave);</div><div class='add'>+    ver=`SSHM $SLAVEUSER@$SLAVEHOST bash -c "'$cmd_line'"`;</div><div class='add'>+    status=$disk_size:$used_size:$ver:$no_of_files;</div><div class='add'>+    echo $status</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function ping_host ()</div><div class='add'>+{</div><div class='add'>+    ### Use bash internal socket support</div><div class='add'>+    {</div><div class='add'>+        exec 100&lt;&gt;/dev/tcp/$1/$2</div><div class='add'>+        if [ $? -ne '0' ]; then</div><div class='add'>+            return 1;</div><div class='add'>+        else</div><div class='add'>+            exec 100&gt;&amp;-</div><div class='add'>+            return 0;</div><div class='add'>+        fi</div><div class='add'>+    } 1&gt;&amp;2 2&gt;/dev/null</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function main()</div><div class='add'>+{</div><div class='add'>+    log_file=$6</div><div class='add'>+    &gt; $log_file</div><div class='add'>+</div><div class='add'>+    inet6=$7</div><div class='add'>+    local cmd_line</div><div class='add'>+    local ver</div><div class='add'>+</div><div class='add'>+    # Use FORCE_BLOCKER flag in the error message to differentiate</div><div class='add'>+    # between the errors which the force command should bypass</div><div class='add'>+</div><div class='add'>+    # Test tcp connection to port 22, this is necessary since `ping`</div><div class='add'>+    # does not work on all environments where 'ssh' is allowed but</div><div class='add'>+    # ICMP is filterd</div><div class='add'>+</div><div class='add'>+    ping_host $3 ${SSH_PORT}</div><div class='add'>+</div><div class='add'>+    if [ $? -ne 0 ]; then</div><div class='add'>+        echo "FORCE_BLOCKER|$3 not reachable." &gt; $log_file</div><div class='add'>+        exit 1;</div><div class='add'>+    fi;</div><div class='add'>+</div><div class='add'>+    if [[ -z "${GR_SSH_IDENTITY_KEY}" ]]; then</div><div class='add'>+        ssh -p ${SSH_PORT} -oNumberOfPasswordPrompts=0 -oStrictHostKeyChecking=no $2@$3 "echo Testing_Passwordless_SSH";</div><div class='add'>+    else</div><div class='add'>+        ssh -p ${SSH_PORT} -i ${GR_SSH_IDENTITY_KEY} -oNumberOfPasswordPrompts=0 -oStrictHostKeyChecking=no $2@$3 "echo Testing_Passwordless_SSH";</div><div class='add'>+    fi</div><div class='add'>+</div><div class='add'>+    if [ $? -ne 0 ]; then</div><div class='add'>+        echo "FORCE_BLOCKER|Passwordless ssh login has not been setup with $3 for user $2." &gt; $log_file</div><div class='add'>+        exit 1;</div><div class='add'>+    fi;</div><div class='add'>+</div><div class='add'>+    cmd_line=$(cmd_slave);</div><div class='add'>+    if [[ -z "${GR_SSH_IDENTITY_KEY}" ]]; then</div><div class='add'>+        ver=$(ssh -p ${SSH_PORT} -oNumberOfPasswordPrompts=0 -oStrictHostKeyChecking=no $2@$3 bash -c "'$cmd_line'")</div><div class='add'>+    else</div><div class='add'>+        ver=$(ssh -p ${SSH_PORT} -i ${GR_SSH_IDENTITY_KEY} -oNumberOfPasswordPrompts=0 -oStrictHostKeyChecking=no $2@$3 bash -c "'$cmd_line'")</div><div class='add'>+    fi</div><div class='add'>+</div><div class='add'>+    if [ -z "$ver" ]; then</div><div class='add'>+        echo "FORCE_BLOCKER|gluster command not found on $3 for user $2." &gt; $log_file</div><div class='add'>+        exit 1;</div><div class='add'>+    fi;</div><div class='add'>+</div><div class='add'>+    ERRORS=0;</div><div class='add'>+    master_data=$(master_stats $1 ${inet6});</div><div class='add'>+    slave_data=$(slave_stats $2 $3 $4 ${inet6});</div><div class='add'>+    master_disk_size=$(echo $master_data | cut -f1 -d':');</div><div class='add'>+    slave_disk_size=$(echo $slave_data | cut -f1 -d':');</div><div class='add'>+    master_used_size=$(echo $master_data | cut -f2 -d':');</div><div class='add'>+    slave_used_size=$(echo $slave_data | cut -f2 -d':');</div><div class='add'>+    master_version=$(echo $master_data | cut -f3 -d':');</div><div class='add'>+    slave_version=$(echo $slave_data | cut -f3 -d':');</div><div class='add'>+    slave_no_of_files=$(echo $slave_data | cut -f4 -d':');</div><div class='add'>+</div><div class='add'>+    if [[ "x$master_disk_size" = "x" || "x$master_version" = "x" || "$master_disk_size" -eq "0" ]]; then</div><div class='add'>+        echo "FORCE_BLOCKER|Unable to mount and fetch master volume details. Please check the log: $master_log_file" &gt; $log_file;</div><div class='add'>+	exit 1;</div><div class='add'>+    fi;</div><div class='add'>+</div><div class='add'>+    if [[ "x$slave_disk_size" = "x" || "x$slave_version" = "x" || "$slave_disk_size" -eq "0" ]]; then</div><div class='add'>+	echo "FORCE_BLOCKER|Unable to mount and fetch slave volume details. Please check the log: $slave_log_file" &gt; $log_file;</div><div class='add'>+	exit 1;</div><div class='add'>+    fi;</div><div class='add'>+</div><div class='add'>+    # The above checks are mandatory and force command should be blocked</div><div class='add'>+    # if they fail. The checks below can be bypassed if force option is</div><div class='add'>+    # provided hence no FORCE_BLOCKER flag.</div><div class='add'>+</div><div class='add'>+    if [ "$slave_disk_size" -lt "$master_disk_size" ]; then</div><div class='add'>+        echo "Total disk size of master is greater than disk size of slave." &gt;&gt; $log_file;</div><div class='add'>+        ERRORS=$(($ERRORS + 1));</div><div class='add'>+    fi</div><div class='add'>+</div><div class='add'>+    effective_master_used_size=$(( $master_used_size + $BUFFER_SIZE ))</div><div class='add'>+    slave_available_size=$(( $slave_disk_size - $slave_used_size ))</div><div class='add'>+    master_available_size=$(( $master_disk_size - $effective_master_used_size ));</div><div class='add'>+</div><div class='add'>+    if [ "$slave_available_size" -lt "$master_available_size" ]; then</div><div class='add'>+        echo "Total available size of master is greater than available size of slave" &gt;&gt; $log_file;</div><div class='add'>+        ERRORS=$(($ERRORS + 1));</div><div class='add'>+    fi</div><div class='add'>+</div><div class='add'>+    if [ ! -z $slave_no_of_files ]; then</div><div class='add'>+        echo "$3::$4 is not empty. Please delete existing files in $3::$4 and retry, or use force to continue without deleting the existing files." &gt;&gt; $log_file;</div><div class='add'>+        ERRORS=$(($ERRORS + 1));</div><div class='add'>+    fi;</div><div class='add'>+</div><div class='add'>+    if [[ $master_version != $slave_version ]]; then</div><div class='add'>+        echo "Gluster version mismatch between master and slave. Master version: $master_version Slave version: $slave_version" &gt;&gt; $log_file;</div><div class='add'>+        ERRORS=$(($ERRORS + 1));</div><div class='add'>+    fi;</div><div class='add'>+</div><div class='add'>+    exit $ERRORS;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+main "$@";</div><div class='head'>diff --git a/geo-replication/src/peer_georep-sshkey.py.in b/geo-replication/src/peer_georep-sshkey.py.in<br/>new file mode 100644<br/>index 00000000000..58696e9a616<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/geo-replication/src/peer_georep-sshkey.py.in?id=d1d7a6f35c816822fab51c820e25023863c239c1'>geo-replication/src/peer_georep-sshkey.py.in</a></div><div class='hunk'>@@ -0,0 +1,116 @@</div><div class='add'>+#!/usr/bin/python3</div><div class='add'>+# -*- coding: utf-8 -*-</div><div class='add'>+#</div><div class='add'>+#  Copyright (c) 2016 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+#  This file is part of GlusterFS.</div><div class='add'>+#</div><div class='add'>+#  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+#  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+#  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+#  cases as published by the Free Software Foundation.</div><div class='add'>+#</div><div class='add'>+"""</div><div class='add'>+Usage:</div><div class='add'>+    gluster-georep-sshkey generate</div><div class='add'>+    or</div><div class='add'>+    gluster-georep-sshkey generate --no-prefix</div><div class='add'>+</div><div class='add'>+Generates two SSH keys(one for gsyncd access and other for tar) in all</div><div class='add'>+peer nodes and collects the public keys to the local node where it is</div><div class='add'>+initiated. Adds `command=` prefix to common_secret.pem.pub if `--no-prefix`</div><div class='add'>+argument is not passed.</div><div class='add'>+"""</div><div class='add'>+import os</div><div class='add'>+import glob</div><div class='add'>+</div><div class='add'>+from gluster.cliutils import (node_output_ok, execute, execute_in_peers,</div><div class='add'>+                              Cmd, runcli)</div><div class='add'>+from prettytable import PrettyTable</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+SECRET_PEM = "@GLUSTERD_WORKDIR@/geo-replication/secret.pem"</div><div class='add'>+TAR_SSH_PEM = "@GLUSTERD_WORKDIR@/geo-replication/tar_ssh.pem"</div><div class='add'>+GSYNCD_CMD = 'command="@GLUSTERFS_LIBEXECDIR@/gsyncd" '</div><div class='add'>+TAR_CMD = 'command="tar ${SSH_ORIGINAL_COMMAND#* }" '</div><div class='add'>+COMMON_SECRET_FILE = "@GLUSTERD_WORKDIR@/geo-replication/common_secret.pem.pub"</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+class NodeGenCmd(Cmd):</div><div class='add'>+    name = "node-generate"</div><div class='add'>+</div><div class='add'>+    def args(self, parser):</div><div class='add'>+        parser.add_argument("no_prefix")</div><div class='add'>+</div><div class='add'>+    def run(self, args):</div><div class='add'>+        # Regenerate if secret.pem.pub not exists</div><div class='add'>+        if not os.path.exists(SECRET_PEM + ".pub"):</div><div class='add'>+            # Cleanup old files</div><div class='add'>+            for f in glob.glob(SECRET_PEM + "*"):</div><div class='add'>+                os.remove(f)</div><div class='add'>+</div><div class='add'>+            execute(["ssh-keygen", "-N", "", "-f", SECRET_PEM])</div><div class='add'>+</div><div class='add'>+        # Regenerate if ssh_tar.pem.pub not exists</div><div class='add'>+        if not os.path.exists(TAR_SSH_PEM + ".pub"):</div><div class='add'>+            # Cleanup old files</div><div class='add'>+            for f in glob.glob(TAR_SSH_PEM + "*"):</div><div class='add'>+                os.remove(f)</div><div class='add'>+</div><div class='add'>+            execute(["ssh-keygen", "-N", "", "-f", TAR_SSH_PEM])</div><div class='add'>+</div><div class='add'>+        # Add required prefixes if prefix is not "container"</div><div class='add'>+        prefix_secret_pem_pub = ""</div><div class='add'>+        prefix_tar_ssh_pem_pub = ""</div><div class='add'>+        if args.no_prefix != "no-prefix":</div><div class='add'>+            prefix_secret_pem_pub = GSYNCD_CMD</div><div class='add'>+            prefix_tar_ssh_pem_pub = TAR_CMD</div><div class='add'>+</div><div class='add'>+        data = {"default_pub": "", "tar_pub": ""}</div><div class='add'>+        with open(SECRET_PEM + ".pub") as f:</div><div class='add'>+            data["default_pub"] = prefix_secret_pem_pub + f.read().strip()</div><div class='add'>+</div><div class='add'>+        with open(TAR_SSH_PEM + ".pub") as f:</div><div class='add'>+            data["tar_pub"] = prefix_tar_ssh_pem_pub + f.read().strip()</div><div class='add'>+</div><div class='add'>+        node_output_ok(data)</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def color_status(value):</div><div class='add'>+    if value in ["UP", "OK"]:</div><div class='add'>+        return "green"</div><div class='add'>+    return "red"</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+class GenCmd(Cmd):</div><div class='add'>+    name = "generate"</div><div class='add'>+</div><div class='add'>+    def args(self, parser):</div><div class='add'>+        parser.add_argument("--no-prefix", help="Do not use prefix in "</div><div class='add'>+                            "generated pub keys", action="store_true")</div><div class='add'>+</div><div class='add'>+    def run(self, args):</div><div class='add'>+        prefix = "no-prefix" if args.no_prefix else "."</div><div class='add'>+        out = execute_in_peers("node-generate", [prefix])</div><div class='add'>+</div><div class='add'>+        common_secrets = []</div><div class='add'>+        table = PrettyTable(["NODE", "NODE STATUS", "KEYGEN STATUS"])</div><div class='add'>+        table.align["NODE STATUS"] = "r"</div><div class='add'>+        table.align["KEYGEN STATUS"] = "r"</div><div class='add'>+        for p in out:</div><div class='add'>+            if p.ok:</div><div class='add'>+                common_secrets.append(p.output["default_pub"])</div><div class='add'>+                common_secrets.append(p.output["tar_pub"])</div><div class='add'>+</div><div class='add'>+            table.add_row([p.hostname,</div><div class='add'>+                           "UP" if p.node_up else "DOWN",</div><div class='add'>+                           "OK" if p.ok else "NOT OK: {0}".format(</div><div class='add'>+                               p.error)])</div><div class='add'>+</div><div class='add'>+        with open(COMMON_SECRET_FILE, "w") as f:</div><div class='add'>+            f.write("\n".join(common_secrets) + "\n")</div><div class='add'>+</div><div class='add'>+        print (table)</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+if __name__ == "__main__":</div><div class='add'>+    runcli()</div><div class='head'>diff --git a/geo-replication/src/peer_gsec_create.in b/geo-replication/src/peer_gsec_create.in<br/>new file mode 100755<br/>index 00000000000..6d4a4847013<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/geo-replication/src/peer_gsec_create.in?id=d1d7a6f35c816822fab51c820e25023863c239c1'>geo-replication/src/peer_gsec_create.in</a></div><div class='hunk'>@@ -0,0 +1,24 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+prefix=@prefix@</div><div class='add'>+exec_prefix=@exec_prefix@</div><div class='add'>+libexecdir=@libexecdir@</div><div class='add'>+</div><div class='add'>+if [ ! -f "$GLUSTERD_WORKDIR"/geo-replication/secret.pem.pub ]; then</div><div class='add'>+    \rm -rf "$GLUSTERD_WORKDIR"/geo-replication/secret.pem*</div><div class='add'>+    ssh-keygen -N '' -f "$GLUSTERD_WORKDIR"/geo-replication/secret.pem &gt; /dev/null</div><div class='add'>+fi</div><div class='add'>+</div><div class='add'>+if [ ! -f "$GLUSTERD_WORKDIR"/geo-replication/tar_ssh.pem.pub ]; then</div><div class='add'>+    \rm -rf "$GLUSTERD_WORKDIR"/geo-replication/tar_ssh.pem*</div><div class='add'>+    ssh-keygen -N '' -f "$GLUSTERD_WORKDIR"/geo-replication/tar_ssh.pem &gt; /dev/null</div><div class='add'>+fi</div><div class='add'>+</div><div class='add'>+if [ "Xcontainer" = "X$1" ]; then</div><div class='add'>+    output1=`cat "$GLUSTERD_WORKDIR"/geo-replication/secret.pem.pub`</div><div class='add'>+    output2=`cat "$GLUSTERD_WORKDIR"/geo-replication/tar_ssh.pem.pub`</div><div class='add'>+else</div><div class='add'>+    output1=`echo command=\"${libexecdir}/glusterfs/gsyncd\" ""``cat "$GLUSTERD_WORKDIR"/geo-replication/secret.pem.pub`</div><div class='add'>+    output2=`echo command=\"tar \$\{SSH_ORIGINAL_COMMAND#* \}\" ""``cat "$GLUSTERD_WORKDIR"/geo-replication/tar_ssh.pem.pub`</div><div class='add'>+fi</div><div class='add'>+echo -e "$output1\n$output2"</div><div class='head'>diff --git a/geo-replication/src/peer_mountbroker.in b/geo-replication/src/peer_mountbroker.in<br/>new file mode 100644<br/>index 00000000000..8ecf38ded41<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/geo-replication/src/peer_mountbroker.in?id=d1d7a6f35c816822fab51c820e25023863c239c1'>geo-replication/src/peer_mountbroker.in</a></div><div class='hunk'>@@ -0,0 +1,211 @@</div><div class='add'>+#!/usr/bin/python3</div><div class='add'>+</div><div class='add'>+from __future__ import print_function</div><div class='add'>+</div><div class='add'>+import os</div><div class='add'>+from argparse import ArgumentParser, RawDescriptionHelpFormatter</div><div class='add'>+import json</div><div class='add'>+import sys</div><div class='add'>+</div><div class='add'>+PROG_DESCRIPTION = """</div><div class='add'>+GlusterFS Mountbroker user management</div><div class='add'>+"""</div><div class='add'>+</div><div class='add'>+args = None</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def ok(message=""):</div><div class='add'>+    if (not args and "-j" in sys.argv) or (args and args.json):</div><div class='add'>+        print(json.dumps({"ok": True, "message": message}))</div><div class='add'>+    else:</div><div class='add'>+        if message:</div><div class='add'>+            print(message)</div><div class='add'>+</div><div class='add'>+    sys.exit(0)</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def notok(message=""):</div><div class='add'>+    if (not args and "-j" in sys.argv) or (args and args.json):</div><div class='add'>+        print(json.dumps({"ok": False, "message": message}))</div><div class='add'>+    else:</div><div class='add'>+        print("error: %s" % message)</div><div class='add'>+</div><div class='add'>+    # Always return zero due to limitation while executing</div><div class='add'>+    # as `gluster system:: execute`</div><div class='add'>+    sys.exit(0)</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+class NoStdErrParser(ArgumentParser):</div><div class='add'>+    """</div><div class='add'>+    with gluster system:: execute, stderr gives</div><div class='add'>+    "Unable to end. Error : Bad file descriptor" error,</div><div class='add'>+    so deriving new class, prints error message and</div><div class='add'>+    exits with zero.</div><div class='add'>+    """</div><div class='add'>+    def error(self, message):</div><div class='add'>+        notok(message)</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+class MountbrokerUserMgmt(object):</div><div class='add'>+    def __init__(self, volfile):</div><div class='add'>+        self.volfile = volfile</div><div class='add'>+        self._options = {}</div><div class='add'>+        self.commented_lines = []</div><div class='add'>+        self._parse()</div><div class='add'>+</div><div class='add'>+    def _parse(self):</div><div class='add'>+        with open(self.volfile, "r") as f:</div><div class='add'>+            for line in f:</div><div class='add'>+                line = line.strip()</div><div class='add'>+                if line.startswith("option "):</div><div class='add'>+                    key, value = line.split(" ")[1:]</div><div class='add'>+                    self._options[key] = value</div><div class='add'>+                if line.startswith("#"):</div><div class='add'>+                    self.commented_lines.append(line)</div><div class='add'>+</div><div class='add'>+    def _get_write_data(self):</div><div class='add'>+        op = "volume management\n"</div><div class='add'>+        op += "    type mgmt/glusterd\n"</div><div class='add'>+        for k, v in self._options.items():</div><div class='add'>+            op += "    option %s %s\n" % (k, v)</div><div class='add'>+        for line in self.commented_lines:</div><div class='add'>+            op += "    %s\n" % line</div><div class='add'>+        op += "end-volume"</div><div class='add'>+        return op</div><div class='add'>+</div><div class='add'>+    def save(self):</div><div class='add'>+        with open(self.volfile + "_tmp", "w") as f:</div><div class='add'>+            f.write(self._get_write_data())</div><div class='add'>+            f.flush()</div><div class='add'>+            os.fsync(f.fileno())</div><div class='add'>+        os.rename(self.volfile + "_tmp", self.volfile)</div><div class='add'>+</div><div class='add'>+    def set_opt(self, key, value):</div><div class='add'>+        self._options[key] = value.strip()</div><div class='add'>+</div><div class='add'>+    def remove_opt(self, key):</div><div class='add'>+        if key in self._options:</div><div class='add'>+            del(self._options[key])</div><div class='add'>+</div><div class='add'>+    def add_user(self, user, volumes):</div><div class='add'>+        vols = set()</div><div class='add'>+        for k, v in self._options.items():</div><div class='add'>+            if k.startswith("mountbroker-geo-replication.") \</div><div class='add'>+               and user == k.split(".")[-1]:</div><div class='add'>+                vols.update(v.split(","))</div><div class='add'>+</div><div class='add'>+        vols.update(volumes)</div><div class='add'>+        self.set_opt("mountbroker-geo-replication.%s" % user,</div><div class='add'>+                     ",".join(vols))</div><div class='add'>+</div><div class='add'>+    def remove_volume(self, user, volumes):</div><div class='add'>+        vols = set()</div><div class='add'>+        for k, v in self._options.items():</div><div class='add'>+            if k.startswith("mountbroker-geo-replication.") \</div><div class='add'>+               and user == k.split(".")[-1]:</div><div class='add'>+                vols.update(v.split(","))</div><div class='add'>+</div><div class='add'>+        for v1 in volumes:</div><div class='add'>+            vols.discard(v1)</div><div class='add'>+</div><div class='add'>+        if vols:</div><div class='add'>+            self.set_opt("mountbroker-geo-replication.%s" % user,</div><div class='add'>+                         ",".join(vols))</div><div class='add'>+        else:</div><div class='add'>+            self.remove_opt("mountbroker-geo-replication.%s" % user)</div><div class='add'>+</div><div class='add'>+    def remove_user(self, user):</div><div class='add'>+        self.remove_opt("mountbroker-geo-replication.%s" % user)</div><div class='add'>+</div><div class='add'>+    def info(self):</div><div class='add'>+        data = {"users": []}</div><div class='add'>+</div><div class='add'>+        for k, v in self._options.items():</div><div class='add'>+            if k.startswith("mountbroker-geo-replication."):</div><div class='add'>+                data["users"].append(</div><div class='add'>+                    {"name": k.split(".")[-1], "volumes": v.split(",")}</div><div class='add'>+                )</div><div class='add'>+            else:</div><div class='add'>+                data[k] = v</div><div class='add'>+</div><div class='add'>+        return data</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def format_info(data):</div><div class='add'>+    op = "%s %s\n" % ("Option".ljust(50), "Value".ljust(50))</div><div class='add'>+    op += ("-" * 101) + "\n"</div><div class='add'>+    for key, value in data.items():</div><div class='add'>+        if key != "users":</div><div class='add'>+            op += "%s %s\n" % (key.ljust(50), value)</div><div class='add'>+</div><div class='add'>+    op += "\nUsers: %s\n" % ("None" if not data["users"] else "")</div><div class='add'>+    for user in data["users"]:</div><div class='add'>+        op += "%s: %s\n" % (user["name"], ", ".join(user["volumes"]))</div><div class='add'>+    op += "\n\n"</div><div class='add'>+    return op</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def _get_args():</div><div class='add'>+    parser = NoStdErrParser(formatter_class=RawDescriptionHelpFormatter,</div><div class='add'>+                            description=PROG_DESCRIPTION)</div><div class='add'>+</div><div class='add'>+    parser.add_argument('-j', dest="json", help="JSON output",</div><div class='add'>+                        action="store_true")</div><div class='add'>+    subparsers = parser.add_subparsers(title='subcommands', dest='cmd')</div><div class='add'>+    parser_useradd = subparsers.add_parser('user')</div><div class='add'>+    parser_userdel = subparsers.add_parser('userdel')</div><div class='add'>+    parser_volumedel = subparsers.add_parser('volumedel')</div><div class='add'>+    subparsers.add_parser('info')</div><div class='add'>+    parser_opt = subparsers.add_parser('opt')</div><div class='add'>+    parser_optdel = subparsers.add_parser('optdel')</div><div class='add'>+</div><div class='add'>+    parser_useradd.add_argument('username', help="Username", type=str)</div><div class='add'>+    parser_useradd.add_argument('volumes', type=str, default='',</div><div class='add'>+                                help="Volumes list. ',' separated")</div><div class='add'>+</div><div class='add'>+    parser_volumedel.add_argument('username', help="Username", type=str)</div><div class='add'>+    parser_volumedel.add_argument('volumes', type=str, default='',</div><div class='add'>+                                help="Volumes list. ',' separated")</div><div class='add'>+</div><div class='add'>+    parser_userdel.add_argument('username', help="Username", type=str)</div><div class='add'>+</div><div class='add'>+    parser_opt.add_argument('opt_name', help="Name", type=str)</div><div class='add'>+    parser_opt.add_argument('opt_value', help="Value", type=str)</div><div class='add'>+</div><div class='add'>+    parser_optdel.add_argument('opt_name', help="Name", type=str)</div><div class='add'>+</div><div class='add'>+    return parser.parse_args()</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def main():</div><div class='add'>+    global args</div><div class='add'>+    args = _get_args()</div><div class='add'>+</div><div class='add'>+    m = MountbrokerUserMgmt("@GLUSTERD_VOLFILE@")</div><div class='add'>+</div><div class='add'>+    if args.cmd == "opt":</div><div class='add'>+        m.set_opt(args.opt_name, args.opt_value)</div><div class='add'>+    elif args.cmd == "optdel":</div><div class='add'>+        m.remove_opt(args.opt_name)</div><div class='add'>+    elif args.cmd == "userdel":</div><div class='add'>+        m.remove_user(args.username)</div><div class='add'>+    elif args.cmd == "user":</div><div class='add'>+        volumes = [v.strip() for v in args.volumes.split(",")</div><div class='add'>+                   if v.strip() != ""]</div><div class='add'>+        m.add_user(args.username, volumes)</div><div class='add'>+    elif args.cmd == "volumedel":</div><div class='add'>+        volumes = [v.strip() for v in args.volumes.split(",")</div><div class='add'>+                   if v.strip() != ""]</div><div class='add'>+        m.remove_volume(args.username, volumes)</div><div class='add'>+    elif args.cmd == "info":</div><div class='add'>+        info = m.info()</div><div class='add'>+        if not args.json:</div><div class='add'>+            info = format_info(info)</div><div class='add'>+        ok(info)</div><div class='add'>+</div><div class='add'>+    if args.cmd != "info":</div><div class='add'>+        m.save()</div><div class='add'>+        ok()</div><div class='add'>+</div><div class='add'>+if __name__ == "__main__":</div><div class='add'>+    main()</div><div class='head'>diff --git a/geo-replication/src/peer_mountbroker.py.in b/geo-replication/src/peer_mountbroker.py.in<br/>new file mode 100644<br/>index 00000000000..40b90ffc560<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/geo-replication/src/peer_mountbroker.py.in?id=d1d7a6f35c816822fab51c820e25023863c239c1'>geo-replication/src/peer_mountbroker.py.in</a></div><div class='hunk'>@@ -0,0 +1,401 @@</div><div class='add'>+#!/usr/bin/python3</div><div class='add'>+</div><div class='add'>+from __future__ import print_function</div><div class='add'>+</div><div class='add'>+import os</div><div class='add'>+from errno import EEXIST, ENOENT</div><div class='add'>+</div><div class='add'>+from gluster.cliutils import (execute, Cmd, node_output_ok,</div><div class='add'>+                              node_output_notok, execute_in_peers,</div><div class='add'>+                              runcli, oknotok)</div><div class='add'>+from prettytable import PrettyTable</div><div class='add'>+</div><div class='add'>+LOG_DIR = "@localstatedir@/log/glusterfs/geo-replication-slaves"</div><div class='add'>+CLI_LOG = "@localstatedir@/log/glusterfs/cli.log"</div><div class='add'>+GEOREP_DIR = "@GLUSTERD_WORKDIR@/geo-replication"</div><div class='add'>+GLUSTERD_VOLFILE = "@GLUSTERD_VOLFILE@"</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+class MountbrokerUserMgmt(object):</div><div class='add'>+    def __init__(self, volfile):</div><div class='add'>+        self.volfile = volfile</div><div class='add'>+        self._options = {}</div><div class='add'>+        self.commented_lines = []</div><div class='add'>+        self.user_volumes = {}</div><div class='add'>+        self._parse()</div><div class='add'>+</div><div class='add'>+    def _parse(self):</div><div class='add'>+        """ Example glusterd.vol</div><div class='add'>+        volume management</div><div class='add'>+            type mgmt/glusterd</div><div class='add'>+            option working-directory /var/lib/glusterd</div><div class='add'>+            option transport-type socket,rdma</div><div class='add'>+            option transport.socket.keepalive-time 10</div><div class='add'>+            option transport.socket.keepalive-interval 2</div><div class='add'>+            option transport.socket.read-fail-log off</div><div class='add'>+            option rpc-auth-allow-insecure on</div><div class='add'>+            option ping-timeout 0</div><div class='add'>+            option event-threads 1</div><div class='add'>+            # option base-port 49152</div><div class='add'>+            option mountbroker-root /var/mountbroker-root</div><div class='add'>+            option mountbroker-geo-replication.user1 vol1,vol2,vol3</div><div class='add'>+            option geo-replication-log-group geogroup</div><div class='add'>+            option rpc-auth-allow-insecure on</div><div class='add'>+        end-volume</div><div class='add'>+        """</div><div class='add'>+        with open(self.volfile, "r") as f:</div><div class='add'>+            for line in f:</div><div class='add'>+                line = line.strip()</div><div class='add'>+                if line.startswith("option "):</div><div class='add'>+                    key, value = line.split()[1:]</div><div class='add'>+                    self._options[key] = value</div><div class='add'>+                if line.startswith("#"):</div><div class='add'>+                    self.commented_lines.append(line)</div><div class='add'>+</div><div class='add'>+        for k, v in self._options.items():</div><div class='add'>+            if k.startswith("mountbroker-geo-replication."):</div><div class='add'>+                user = k.split(".")[-1]</div><div class='add'>+                self.user_volumes[user] = set(v.split(","))</div><div class='add'>+</div><div class='add'>+    def get_group(self):</div><div class='add'>+        return self._options.get("geo-replication-log-group", None)</div><div class='add'>+</div><div class='add'>+    def _get_write_data(self):</div><div class='add'>+        op = "volume management\n"</div><div class='add'>+        op += "    type mgmt/glusterd\n"</div><div class='add'>+        for k, v in self._options.items():</div><div class='add'>+            if k.startswith("mountbroker-geo-replication."):</div><div class='add'>+                # Users will be added seperately</div><div class='add'>+                continue</div><div class='add'>+</div><div class='add'>+            op += "    option %s %s\n" % (k, v)</div><div class='add'>+</div><div class='add'>+        for k, v in self.user_volumes.items():</div><div class='add'>+            if v:</div><div class='add'>+                op += ("    option mountbroker-geo-replication."</div><div class='add'>+                       "%s %s\n" % (k, ",".join(v)))</div><div class='add'>+</div><div class='add'>+        for line in self.commented_lines:</div><div class='add'>+            op += "    %s\n" % line</div><div class='add'>+</div><div class='add'>+        op += "end-volume"</div><div class='add'>+        return op</div><div class='add'>+</div><div class='add'>+    def save(self):</div><div class='add'>+        with open(self.volfile + "_tmp", "w") as f:</div><div class='add'>+            f.write(self._get_write_data())</div><div class='add'>+            f.flush()</div><div class='add'>+            os.fsync(f.fileno())</div><div class='add'>+        os.rename(self.volfile + "_tmp", self.volfile)</div><div class='add'>+</div><div class='add'>+    def set_mount_root_and_group(self, mnt_root, group):</div><div class='add'>+        self._options["mountbroker-root"] = mnt_root</div><div class='add'>+        self._options["geo-replication-log-group"] = group</div><div class='add'>+</div><div class='add'>+    def add(self, volume, user):</div><div class='add'>+        user_volumes = self.user_volumes.get(user, None)</div><div class='add'>+</div><div class='add'>+        if user_volumes is not None and volume in user_volumes:</div><div class='add'>+            # User and Volume already exists</div><div class='add'>+            return</div><div class='add'>+</div><div class='add'>+        if user_volumes is None:</div><div class='add'>+            # User not exists</div><div class='add'>+            self.user_volumes[user] = set()</div><div class='add'>+</div><div class='add'>+        self.user_volumes[user].add(volume)</div><div class='add'>+</div><div class='add'>+    def remove(self, volume=None, user=None):</div><div class='add'>+        if user is not None:</div><div class='add'>+            if volume is None:</div><div class='add'>+                self.user_volumes[user] = set()</div><div class='add'>+            else:</div><div class='add'>+                try:</div><div class='add'>+                    self.user_volumes.get(user, set()).remove(volume)</div><div class='add'>+                except KeyError:</div><div class='add'>+                    pass</div><div class='add'>+        else:</div><div class='add'>+            if volume is None:</div><div class='add'>+                return</div><div class='add'>+</div><div class='add'>+            for k, v in self.user_volumes.items():</div><div class='add'>+                try:</div><div class='add'>+                    self.user_volumes[k].remove(volume)</div><div class='add'>+                except KeyError:</div><div class='add'>+                    pass</div><div class='add'>+</div><div class='add'>+    def info(self):</div><div class='add'>+        # Convert Volumes set into Volumes list</div><div class='add'>+        users = {}</div><div class='add'>+        for k, v in self.user_volumes.items():</div><div class='add'>+            users[k] = list(v)</div><div class='add'>+</div><div class='add'>+        data = {</div><div class='add'>+            "mountbroker-root": self._options.get("mountbroker-root", "None"),</div><div class='add'>+            "geo-replication-log-group": self._options.get(</div><div class='add'>+                "geo-replication-log-group", ""),</div><div class='add'>+            "users": users</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        return data</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+class NodeSetup(Cmd):</div><div class='add'>+    # Test if group exists using `getent group &lt;grp&gt;`</div><div class='add'>+    # and then group add using `groupadd &lt;grp&gt;`</div><div class='add'>+    # chgrp -R &lt;grp&gt; /var/log/glusterfs/geo-replication-slaves</div><div class='add'>+    # chgrp -R &lt;grp&gt; /var/lib/glusterd/geo-replication</div><div class='add'>+    # chmod -R 770 /var/log/glusterfs/geo-replication-slaves</div><div class='add'>+    # chmod 770 /var/lib/glusterd/geo-replication</div><div class='add'>+    # mkdir -p &lt;mnt_root&gt;</div><div class='add'>+    # chmod 0711 &lt;mnt_root&gt;</div><div class='add'>+    # If selinux,</div><div class='add'>+    # semanage fcontext -a -e /home /var/mountbroker-root</div><div class='add'>+    # restorecon -Rv /var/mountbroker-root</div><div class='add'>+    name = "node-setup"</div><div class='add'>+</div><div class='add'>+    def args(self, parser):</div><div class='add'>+        parser.add_argument("mount_root")</div><div class='add'>+        parser.add_argument("group")</div><div class='add'>+</div><div class='add'>+    def run(self, args):</div><div class='add'>+        m = MountbrokerUserMgmt(GLUSTERD_VOLFILE)</div><div class='add'>+</div><div class='add'>+        try:</div><div class='add'>+            os.makedirs(args.mount_root)</div><div class='add'>+        except OSError as e:</div><div class='add'>+            if e.errno == EEXIST:</div><div class='add'>+                pass</div><div class='add'>+            else:</div><div class='add'>+                node_output_notok("Unable to Create {0}".format(</div><div class='add'>+                    args.mount_root))</div><div class='add'>+</div><div class='add'>+        execute(["chmod", "0711", args.mount_root])</div><div class='add'>+        try:</div><div class='add'>+            execute(["semanage", "fcontext", "-a", "-e",</div><div class='add'>+                     "/home", args.mount_root])</div><div class='add'>+        except OSError as e:</div><div class='add'>+            if e.errno == ENOENT:</div><div class='add'>+                pass</div><div class='add'>+            else:</div><div class='add'>+                node_output_notok(</div><div class='add'>+                    "Unable to run semanage: {0}".format(e))</div><div class='add'>+</div><div class='add'>+        try:</div><div class='add'>+            execute(["restorecon", "-Rv", args.mount_root])</div><div class='add'>+        except OSError as e:</div><div class='add'>+            if e.errno == ENOENT:</div><div class='add'>+                pass</div><div class='add'>+            else:</div><div class='add'>+                node_output_notok(</div><div class='add'>+                    "Unable to run restorecon: {0}".format(e))</div><div class='add'>+</div><div class='add'>+        rc, out, err = execute(["getent", "group", args.group])</div><div class='add'>+        if rc != 0:</div><div class='add'>+            node_output_notok("User Group not exists")</div><div class='add'>+</div><div class='add'>+        execute(["chgrp", "-R", args.group, GEOREP_DIR])</div><div class='add'>+        execute(["chgrp", "-R", args.group, LOG_DIR])</div><div class='add'>+        execute(["chgrp", args.group, CLI_LOG])</div><div class='add'>+        execute(["chmod", "770", GEOREP_DIR])</div><div class='add'>+        execute(["find", LOG_DIR, "-type", "d", "-exec", "chmod", "770", "{}",</div><div class='add'>+                 "+"])</div><div class='add'>+        execute(["find", LOG_DIR, "-type", "f", "-exec", "chmod", "660", "{}",</div><div class='add'>+                 "+"])</div><div class='add'>+        execute(["chmod", "660", CLI_LOG])</div><div class='add'>+</div><div class='add'>+        m.set_mount_root_and_group(args.mount_root, args.group)</div><div class='add'>+        m.save()</div><div class='add'>+</div><div class='add'>+        node_output_ok()</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def color_status(value):</div><div class='add'>+    if value.lower() in ("up", "ok", "yes"):</div><div class='add'>+        return "green"</div><div class='add'>+    else:</div><div class='add'>+        return "red"</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+class CliSetup(Cmd):</div><div class='add'>+    # gluster-mountbroker setup &lt;MOUNT_ROOT&gt; &lt;GROUP&gt;</div><div class='add'>+    name = "setup"</div><div class='add'>+</div><div class='add'>+    def args(self, parser):</div><div class='add'>+        parser.add_argument("mount_root",</div><div class='add'>+                            help="Path to the mountbroker-root directory.")</div><div class='add'>+        parser.add_argument("group",</div><div class='add'>+                            help="Group to be used for setup.")</div><div class='add'>+</div><div class='add'>+    def run(self, args):</div><div class='add'>+        out = execute_in_peers("node-setup", [args.mount_root,</div><div class='add'>+                                              args.group])</div><div class='add'>+        table = PrettyTable(["NODE", "NODE STATUS", "SETUP STATUS"])</div><div class='add'>+        table.align["NODE STATUS"] = "r"</div><div class='add'>+        table.align["SETUP STATUS"] = "r"</div><div class='add'>+        for p in out:</div><div class='add'>+            table.add_row([p.hostname,</div><div class='add'>+                           "UP" if p.node_up else "DOWN",</div><div class='add'>+                           "OK" if p.ok else "NOT OK: {0}".format(</div><div class='add'>+                               p.error)])</div><div class='add'>+</div><div class='add'>+        print(table)</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+class NodeStatus(Cmd):</div><div class='add'>+    # Check if Group exists</div><div class='add'>+    # Check if user exists</div><div class='add'>+    # Check directory permission /var/log/glusterfs/geo-replication-slaves</div><div class='add'>+    # and /var/lib/glusterd/geo-replication</div><div class='add'>+    # Check mount root and its permissions</div><div class='add'>+    # Check glusterd.vol file for user, group, dir existance</div><div class='add'>+    name = "node-status"</div><div class='add'>+</div><div class='add'>+    def run(self, args):</div><div class='add'>+        m = MountbrokerUserMgmt(GLUSTERD_VOLFILE)</div><div class='add'>+        data = m.info()</div><div class='add'>+        data["group_exists"] = False</div><div class='add'>+        data["path_exists"] = False</div><div class='add'>+</div><div class='add'>+        rc, out, err = execute(["getent", "group",</div><div class='add'>+                                data["geo-replication-log-group"]])</div><div class='add'>+</div><div class='add'>+        if rc == 0:</div><div class='add'>+            data["group_exists"] = True</div><div class='add'>+</div><div class='add'>+        if os.path.exists(data["mountbroker-root"]):</div><div class='add'>+            data["path_exists"] = True</div><div class='add'>+</div><div class='add'>+        node_output_ok(data)</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+class CliStatus(Cmd):</div><div class='add'>+    # gluster-mountbroker status</div><div class='add'>+    name = "status"</div><div class='add'>+</div><div class='add'>+    def run(self, args):</div><div class='add'>+        out = execute_in_peers("node-status")</div><div class='add'>+        table = PrettyTable(["NODE", "NODE STATUS", "MOUNT ROOT",</div><div class='add'>+                             "GROUP", "USERS"])</div><div class='add'>+        table.align["NODE STATUS"] = "r"</div><div class='add'>+</div><div class='add'>+        for p in out:</div><div class='add'>+            node_data = p.output</div><div class='add'>+            if node_data == "" or node_data == "N/A":</div><div class='add'>+                node_data = {}</div><div class='add'>+</div><div class='add'>+            users_row_data = ""</div><div class='add'>+            for k, v in node_data.get("users", {}).items():</div><div class='add'>+                users_row_data += "{0}({1}) ".format(k, ", ".join(v))</div><div class='add'>+</div><div class='add'>+            if not users_row_data:</div><div class='add'>+                users_row_data = "None"</div><div class='add'>+</div><div class='add'>+            mount_root = node_data.get("mountbroker-root", "None")</div><div class='add'>+            if mount_root != "None":</div><div class='add'>+                mount_root += "({0})".format(oknotok(</div><div class='add'>+                    node_data.get("path_exists", False)))</div><div class='add'>+</div><div class='add'>+            grp = node_data.get("geo-replication-log-group", "None")</div><div class='add'>+            if grp != "None":</div><div class='add'>+                grp += "({0})".format(oknotok(</div><div class='add'>+                    node_data.get("group_exists", False)))</div><div class='add'>+</div><div class='add'>+            table.add_row([p.hostname,</div><div class='add'>+                           "UP" if p.node_up else "DOWN",</div><div class='add'>+                           mount_root,</div><div class='add'>+                           grp,</div><div class='add'>+                           users_row_data])</div><div class='add'>+</div><div class='add'>+        print(table)</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+class NodeAdd(Cmd):</div><div class='add'>+    # useradd -m -g &lt;grp&gt; &lt;usr&gt;</div><div class='add'>+    # useradd to glusterd.vol</div><div class='add'>+    name = "node-add"</div><div class='add'>+</div><div class='add'>+    def args(self, parser):</div><div class='add'>+        parser.add_argument("volume")</div><div class='add'>+        parser.add_argument("user")</div><div class='add'>+</div><div class='add'>+    def run(self, args):</div><div class='add'>+        m = MountbrokerUserMgmt(GLUSTERD_VOLFILE)</div><div class='add'>+        grp = m.get_group()</div><div class='add'>+        if grp is None:</div><div class='add'>+            node_output_notok("Group is not available")</div><div class='add'>+</div><div class='add'>+        m.add(args.volume, args.user)</div><div class='add'>+        m.save()</div><div class='add'>+        node_output_ok()</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+class CliAdd(Cmd):</div><div class='add'>+    # gluster-mountbroker add &lt;VOLUME&gt; &lt;USER&gt;</div><div class='add'>+    name = "add"</div><div class='add'>+</div><div class='add'>+    def args(self, parser):</div><div class='add'>+        parser.add_argument("volume",</div><div class='add'>+                            help="Volume to be added.")</div><div class='add'>+        parser.add_argument("user",</div><div class='add'>+                            help="User for which volume is to be added.")</div><div class='add'>+</div><div class='add'>+    def run(self, args):</div><div class='add'>+        out = execute_in_peers("node-add", [args.volume,</div><div class='add'>+                                            args.user])</div><div class='add'>+        table = PrettyTable(["NODE", "NODE STATUS", "ADD STATUS"])</div><div class='add'>+        table.align["NODE STATUS"] = "r"</div><div class='add'>+        table.align["ADD STATUS"] = "r"</div><div class='add'>+</div><div class='add'>+        for p in out:</div><div class='add'>+            table.add_row([p.hostname,</div><div class='add'>+                           "UP" if p.node_up else "DOWN",</div><div class='add'>+                           "OK" if p.ok else "NOT OK: {0}".format(</div><div class='add'>+                               p.error)])</div><div class='add'>+</div><div class='add'>+        print(table)</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+class NodeRemove(Cmd):</div><div class='add'>+    # userremove from glusterd.vol file</div><div class='add'>+    name = "node-remove"</div><div class='add'>+</div><div class='add'>+    def args(self, parser):</div><div class='add'>+        parser.add_argument("volume")</div><div class='add'>+        parser.add_argument("user")</div><div class='add'>+</div><div class='add'>+    def run(self, args):</div><div class='add'>+        m = MountbrokerUserMgmt(GLUSTERD_VOLFILE)</div><div class='add'>+        volume = None if args.volume == "." else args.volume</div><div class='add'>+        user = None if args.user == "." else args.user</div><div class='add'>+        m.remove(volume=volume, user=user)</div><div class='add'>+        m.save()</div><div class='add'>+        node_output_ok()</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+class CliRemove(Cmd):</div><div class='add'>+    # gluster-mountbroker remove --volume &lt;VOLUME&gt; --user &lt;USER&gt;</div><div class='add'>+    name = "remove"</div><div class='add'>+</div><div class='add'>+    def args(self, parser):</div><div class='add'>+        parser.add_argument("--volume", default=".", help="Volume to be removed.")</div><div class='add'>+        parser.add_argument("--user", default=".",</div><div class='add'>+                            help="User for which volume has to be removed.")</div><div class='add'>+</div><div class='add'>+    def run(self, args):</div><div class='add'>+        out = execute_in_peers("node-remove", [args.volume,</div><div class='add'>+                                               args.user])</div><div class='add'>+        table = PrettyTable(["NODE", "NODE STATUS", "REMOVE STATUS"])</div><div class='add'>+        table.align["NODE STATUS"] = "r"</div><div class='add'>+        table.align["REMOVE STATUS"] = "r"</div><div class='add'>+</div><div class='add'>+        for p in out:</div><div class='add'>+            table.add_row([p.hostname,</div><div class='add'>+                           "UP" if p.node_up else "DOWN",</div><div class='add'>+                           "OK" if p.ok else "NOT OK: {0}".format(</div><div class='add'>+                               p.error)])</div><div class='add'>+</div><div class='add'>+        print(table)</div><div class='add'>+</div><div class='add'>+if __name__ == "__main__":</div><div class='add'>+    runcli()</div><div class='head'>diff --git a/geo-replication/src/procdiggy.c b/geo-replication/src/procdiggy.c<br/>new file mode 100644<br/>index 00000000000..8068ef79a42<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/geo-replication/src/procdiggy.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>geo-replication/src/procdiggy.c</a></div><div class='hunk'>@@ -0,0 +1,136 @@</div><div class='add'>+/*</div><div class='add'>+   Copyright (c) 2011-2012 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+   This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+   This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+   General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+   later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+   cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#include &lt;stdlib.h&gt;</div><div class='add'>+#include &lt;stdio.h&gt;</div><div class='add'>+#include &lt;unistd.h&gt;</div><div class='add'>+#include &lt;string.h&gt;</div><div class='add'>+#include &lt;ctype.h&gt;</div><div class='add'>+#include &lt;sys/param.h&gt; /* for PATH_MAX */</div><div class='add'>+</div><div class='add'>+#include &lt;glusterfs/common-utils.h&gt;</div><div class='add'>+#include &lt;glusterfs/syscall.h&gt;</div><div class='add'>+#include "procdiggy.h"</div><div class='add'>+</div><div class='add'>+pid_t</div><div class='add'>+pidinfo(pid_t pid, char **name)</div><div class='add'>+{</div><div class='add'>+    char buf[NAME_MAX * 2] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    FILE *f = NULL;</div><div class='add'>+    char path[PATH_MAX] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    char *p = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    pid_t lpid = -1;</div><div class='add'>+</div><div class='add'>+    if (name)</div><div class='add'>+        *name = NULL;</div><div class='add'>+</div><div class='add'>+    snprintf(path, sizeof path, PROC "/%d/status", pid);</div><div class='add'>+</div><div class='add'>+    f = fopen(path, "r");</div><div class='add'>+    if (!f)</div><div class='add'>+        return -1;</div><div class='add'>+</div><div class='add'>+    for (;;) {</div><div class='add'>+        size_t len;</div><div class='add'>+        memset(buf, 0, sizeof(buf));</div><div class='add'>+        if (fgets(buf, sizeof(buf), f) == NULL || (len = strlen(buf)) == 0 ||</div><div class='add'>+            buf[len - 1] != '\n') {</div><div class='add'>+            lpid = -1;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+        buf[len - 1] = '\0';</div><div class='add'>+</div><div class='add'>+        if (name &amp;&amp; !*name) {</div><div class='add'>+            p = strtail(buf, "Name:");</div><div class='add'>+            if (p) {</div><div class='add'>+                while (isspace(*++p))</div><div class='add'>+                    ;</div><div class='add'>+                *name = gf_strdup(p);</div><div class='add'>+                if (!*name) {</div><div class='add'>+                    lpid = -2;</div><div class='add'>+                    goto out;</div><div class='add'>+                }</div><div class='add'>+                continue;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        p = strtail(buf, "PPid:");</div><div class='add'>+        if (p)</div><div class='add'>+            break;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    while (isspace(*++p))</div><div class='add'>+        ;</div><div class='add'>+    ret = gf_string2int(p, &amp;lpid);</div><div class='add'>+    if (ret == -1)</div><div class='add'>+        lpid = -1;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    fclose(f);</div><div class='add'>+    if (lpid == -1 &amp;&amp; name &amp;&amp; *name)</div><div class='add'>+        GF_FREE(*name);</div><div class='add'>+    if (lpid == -2)</div><div class='add'>+        fprintf(stderr, "out of memory\n");</div><div class='add'>+    return lpid;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+prociter(int (*proch)(pid_t pid, pid_t ppid, char *tmpname, void *data),</div><div class='add'>+         void *data)</div><div class='add'>+{</div><div class='add'>+    char *name = NULL;</div><div class='add'>+    DIR *d = NULL;</div><div class='add'>+    struct dirent *de = NULL;</div><div class='add'>+    struct dirent scratch[2] = {</div><div class='add'>+        {</div><div class='add'>+            0,</div><div class='add'>+        },</div><div class='add'>+    };</div><div class='add'>+    pid_t pid = -1;</div><div class='add'>+    pid_t ppid = -1;</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    d = sys_opendir(PROC);</div><div class='add'>+    if (!d)</div><div class='add'>+        return -1;</div><div class='add'>+</div><div class='add'>+    for (;;) {</div><div class='add'>+        errno = 0;</div><div class='add'>+        de = sys_readdir(d, scratch);</div><div class='add'>+        if (!de || errno != 0)</div><div class='add'>+            break;</div><div class='add'>+</div><div class='add'>+        if (gf_string2int(de-&gt;d_name, &amp;pid) != -1 &amp;&amp; pid &gt;= 0) {</div><div class='add'>+            ppid = pidinfo(pid, &amp;name);</div><div class='add'>+            switch (ppid) {</div><div class='add'>+                case -1:</div><div class='add'>+                    continue;</div><div class='add'>+                case -2:</div><div class='add'>+                    break;</div><div class='add'>+            }</div><div class='add'>+            ret = proch(pid, ppid, name, data);</div><div class='add'>+            GF_FREE(name);</div><div class='add'>+            if (ret)</div><div class='add'>+                break;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    sys_closedir(d);</div><div class='add'>+    if (!de &amp;&amp; errno) {</div><div class='add'>+        fprintf(stderr, "failed to traverse " PROC " (%s)\n", strerror(errno));</div><div class='add'>+        ret = -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='head'>diff --git a/geo-replication/src/procdiggy.h b/geo-replication/src/procdiggy.h<br/>new file mode 100644<br/>index 00000000000..e17ccd31c89<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/geo-replication/src/procdiggy.h?id=d1d7a6f35c816822fab51c820e25023863c239c1'>geo-replication/src/procdiggy.h</a></div><div class='hunk'>@@ -0,0 +1,21 @@</div><div class='add'>+/*</div><div class='add'>+   Copyright (c) 2011-2012 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+   This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+   This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+   General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+   later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+   cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+#ifdef __NetBSD__</div><div class='add'>+#include &lt;sys/syslimits.h&gt;</div><div class='add'>+#endif /* __NetBSD__ */</div><div class='add'>+</div><div class='add'>+#define PROC "/proc"</div><div class='add'>+</div><div class='add'>+pid_t</div><div class='add'>+pidinfo(pid_t pid, char **name);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+prociter(int (*proch)(pid_t pid, pid_t ppid, char *name, void *data),</div><div class='add'>+         void *data);</div><div class='head'>diff --git a/geo-replication/src/set_geo_rep_pem_keys.sh b/geo-replication/src/set_geo_rep_pem_keys.sh<br/>new file mode 100755<br/>index 00000000000..8a43fa39d1f<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/geo-replication/src/set_geo_rep_pem_keys.sh?id=d1d7a6f35c816822fab51c820e25023863c239c1'>geo-replication/src/set_geo_rep_pem_keys.sh</a></div><div class='hunk'>@@ -0,0 +1,58 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+# Script to copy the pem keys from the user's home directory</div><div class='add'>+# to $GLUSTERD_WORKDIR/geo-replication and then copy</div><div class='add'>+# the keys to other nodes in the cluster and add them to the</div><div class='add'>+# respective authorized keys. The script takes as argument the</div><div class='add'>+# user name and assumes that the user will be present in all</div><div class='add'>+# the nodes in the cluster. Not to be used for root user</div><div class='add'>+</div><div class='add'>+function main()</div><div class='add'>+{</div><div class='add'>+    user=$1</div><div class='add'>+    master_vol=$2</div><div class='add'>+    slave_vol=$3</div><div class='add'>+    GLUSTERD_WORKDIR=$(gluster system:: getwd)</div><div class='add'>+</div><div class='add'>+    if [ "$user" == "" ];  then</div><div class='add'>+        echo "Please enter the user's name"</div><div class='add'>+        exit 1;</div><div class='add'>+    fi</div><div class='add'>+</div><div class='add'>+    if [ "$master_vol" == "" ]; then</div><div class='add'>+        echo "Invalid master volume name"</div><div class='add'>+        exit 1;</div><div class='add'>+    fi</div><div class='add'>+</div><div class='add'>+    if [ "$slave_vol" == "" ]; then</div><div class='add'>+        echo "Invalid slave volume name"</div><div class='add'>+        exit 1;</div><div class='add'>+    fi</div><div class='add'>+</div><div class='add'>+    COMMON_SECRET_PEM_PUB=${master_vol}_${slave_vol}_common_secret.pem.pub</div><div class='add'>+</div><div class='add'>+    if [ "$user" == "root" ]; then</div><div class='add'>+        echo "This script is not needed for root"</div><div class='add'>+        exit 1;</div><div class='add'>+    fi</div><div class='add'>+</div><div class='add'>+    home_dir=`getent passwd $user | cut -d ':' -f 6`;</div><div class='add'>+</div><div class='add'>+    if [ "$home_dir" == "" ]; then</div><div class='add'>+        echo "No user $user found"</div><div class='add'>+        exit 1;</div><div class='add'>+    fi</div><div class='add'>+</div><div class='add'>+    if [ -f $home_dir/${COMMON_SECRET_PEM_PUB} ]; then</div><div class='add'>+        cp $home_dir/${COMMON_SECRET_PEM_PUB} ${GLUSTERD_WORKDIR}/geo-replication/</div><div class='add'>+        gluster system:: copy file /geo-replication/${COMMON_SECRET_PEM_PUB}</div><div class='add'>+        gluster system:: execute add_secret_pub $user geo-replication/${master_vol}_${slave_vol}_common_secret.pem.pub</div><div class='add'>+        gluster vol set ${slave_vol} features.read-only on</div><div class='add'>+    else</div><div class='add'>+        echo "$home_dir/common_secret.pem.pub not present. Please run geo-replication command on master with push-pem option to generate the file"</div><div class='add'>+        exit 1;</div><div class='add'>+    fi</div><div class='add'>+    exit 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+main "$@";</div><div class='head'>diff --git a/geo-replication/syncdaemon/Makefile.am b/geo-replication/syncdaemon/Makefile.am<br/>new file mode 100644<br/>index 00000000000..d70e3368faf<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/geo-replication/syncdaemon/Makefile.am?id=d1d7a6f35c816822fab51c820e25023863c239c1'>geo-replication/syncdaemon/Makefile.am</a></div><div class='hunk'>@@ -0,0 +1,8 @@</div><div class='add'>+syncdaemondir = $(GLUSTERFS_LIBEXECDIR)/python/syncdaemon</div><div class='add'>+</div><div class='add'>+syncdaemon_PYTHON = rconf.py gsyncd.py __init__.py master.py README.md repce.py \</div><div class='add'>+	resource.py syncdutils.py monitor.py libcxattr.py gsyncdconfig.py \</div><div class='add'>+	libgfchangelog.py gsyncdstatus.py conf.py logutils.py \</div><div class='add'>+	subcmds.py argsupgrade.py py2py3.py</div><div class='add'>+</div><div class='add'>+CLEANFILES =</div><div class='head'>diff --git a/geo-replication/syncdaemon/README.md b/geo-replication/syncdaemon/README.md<br/>new file mode 100644<br/>index 00000000000..5ab785ae669<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/geo-replication/syncdaemon/README.md?id=d1d7a6f35c816822fab51c820e25023863c239c1'>geo-replication/syncdaemon/README.md</a></div><div class='hunk'>@@ -0,0 +1,57 @@</div><div class='add'>+gsycnd, the Gluster Syncdaemon</div><div class='add'>+==============================</div><div class='add'>+</div><div class='add'>+REQUIREMENTS</div><div class='add'>+------------</div><div class='add'>+</div><div class='add'>+_gsyncd_ is a program which can operate either in _master_ or in _slave_ mode.</div><div class='add'>+Requirements are categorized according to this.</div><div class='add'>+</div><div class='add'>+* supported OS is GNU/Linux</div><div class='add'>+* Python &gt;= 2.5, or 2.4 with Ctypes (see below) (both)</div><div class='add'>+* OpenSSH &gt;= 4.0 (master) / SSH2 compliant sshd (eg. openssh) (slave)</div><div class='add'>+* rsync (both)</div><div class='add'>+* glusterfs: with marker and changelog support (master &amp; slave);</div><div class='add'>+* FUSE: glusterfs fuse module with auxiliary gfid based access support</div><div class='add'>+</div><div class='add'>+INSTALLATION</div><div class='add'>+------------</div><div class='add'>+</div><div class='add'>+As of now, the supported way of operation is running from the source directory or using the RPMs given.</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+CONFIGURATION</div><div class='add'>+-------------</div><div class='add'>+</div><div class='add'>+gsyncd tunables are a subset of the long command-line options; for listing them,</div><div class='add'>+type</div><div class='add'>+</div><div class='add'>+    gsyncd.py --help</div><div class='add'>+</div><div class='add'>+and see the long options up to "--config-file". (The leading double dash should be omitted;</div><div class='add'>+interim underscores and dashes are interchangeable.) The set of options bear some resemblance</div><div class='add'>+to those of glusterfs and rsync.</div><div class='add'>+</div><div class='add'>+The config file format matches the following syntax:</div><div class='add'>+</div><div class='add'>+      &lt;option1&gt;: &lt;value1&gt;</div><div class='add'>+      &lt;option2&gt;: &lt;value2&gt;</div><div class='add'>+      # comment</div><div class='add'>+</div><div class='add'>+By default (unless specified by the option `-c`), gsyncd looks for config file at _conf/gsyncd_template.conf_</div><div class='add'>+in the source tree.</div><div class='add'>+</div><div class='add'>+USAGE</div><div class='add'>+-----</div><div class='add'>+</div><div class='add'>+gsyncd is a utilitly for continuous mirroring, ie. it mirrors master to slave incrementally.</div><div class='add'>+Assume we have a gluster volume _pop_ at localhost. We try to set up the mirroring for volume</div><div class='add'>+_pop_ using gsyncd for gluster volume _moz_ on remote machine/cluster @ example.com. The</div><div class='add'>+respective gsyncd invocations are (demoing some syntax sugaring):</div><div class='add'>+</div><div class='add'>+`gsyncd.py :pop example.com::moz`</div><div class='add'>+</div><div class='add'>+gsyncd has to be available on both sides; it's location on the remote side has to be specified</div><div class='add'>+via the "--remote-gsyncd" option (or "remote-gsyncd" config file parameter). (This option can also be</div><div class='add'>+used for setting options on the remote side, although the suggested mode of operation is to</div><div class='add'>+set parameters like log file / pid file in the configuration file.)</div><div class='head'>diff --git a/geo-replication/syncdaemon/__codecheck.py b/geo-replication/syncdaemon/__codecheck.py<br/>new file mode 100644<br/>index 00000000000..9437147f7d9<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/geo-replication/syncdaemon/__codecheck.py?id=d1d7a6f35c816822fab51c820e25023863c239c1'>geo-replication/syncdaemon/__codecheck.py</a></div><div class='hunk'>@@ -0,0 +1,58 @@</div><div class='add'>+#</div><div class='add'>+# Copyright (c) 2011-2014 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+# This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+# This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+# General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+# later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+# cases as published by the Free Software Foundation.</div><div class='add'>+#</div><div class='add'>+</div><div class='add'>+from __future__ import print_function</div><div class='add'>+import os</div><div class='add'>+import os.path</div><div class='add'>+import sys</div><div class='add'>+import tempfile</div><div class='add'>+import shutil</div><div class='add'>+</div><div class='add'>+ipd = tempfile.mkdtemp(prefix='codecheck-aux')</div><div class='add'>+</div><div class='add'>+try:</div><div class='add'>+    # add a fake ipaddr module, we don't want to</div><div class='add'>+    # deal with the real one (just test our code)</div><div class='add'>+    f = open(os.path.join(ipd, 'ipaddr.py'), 'w')</div><div class='add'>+    f.write("""</div><div class='add'>+class IPAddress(object):</div><div class='add'>+    pass</div><div class='add'>+class IPNetwork(list):</div><div class='add'>+    pass</div><div class='add'>+""")</div><div class='add'>+    f.close()</div><div class='add'>+    sys.path.append(ipd)</div><div class='add'>+</div><div class='add'>+    fl = os.listdir(os.path.dirname(sys.argv[0]) or '.')</div><div class='add'>+    fl.sort()</div><div class='add'>+    for f in fl:</div><div class='add'>+        if f[-3:] != '.py' or f[0] == '_':</div><div class='add'>+            continue</div><div class='add'>+        m = f[:-3]</div><div class='add'>+        sys.stdout.write('importing %s ...' % m)</div><div class='add'>+        __import__(m)</div><div class='add'>+        print(' OK.')</div><div class='add'>+</div><div class='add'>+    def sys_argv_set(a):</div><div class='add'>+        sys.argv = sys.argv[:1] + a</div><div class='add'>+</div><div class='add'>+    gsyncd = sys.modules['gsyncd']</div><div class='add'>+    for a in [['--help'], ['--version'],</div><div class='add'>+              ['--canonicalize-escape-url', '/foo']]:</div><div class='add'>+        print(('&gt;&gt;&gt; invoking program with args: %s' % ' '.join(a)))</div><div class='add'>+        pid = os.fork()</div><div class='add'>+        if not pid:</div><div class='add'>+            sys_argv_set(a)</div><div class='add'>+            gsyncd.main()</div><div class='add'>+        _, r = os.waitpid(pid, 0)</div><div class='add'>+        if r:</div><div class='add'>+            raise RuntimeError('invocation failed')</div><div class='add'>+finally:</div><div class='add'>+    shutil.rmtree(ipd)</div><div class='head'>diff --git a/geo-replication/syncdaemon/__init__.py b/geo-replication/syncdaemon/__init__.py<br/>new file mode 100644<br/>index 00000000000..b4648b69645<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/geo-replication/syncdaemon/__init__.py?id=d1d7a6f35c816822fab51c820e25023863c239c1'>geo-replication/syncdaemon/__init__.py</a></div><div class='hunk'>@@ -0,0 +1,9 @@</div><div class='add'>+#</div><div class='add'>+# Copyright (c) 2011-2014 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+# This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+# This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+# General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+# later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+# cases as published by the Free Software Foundation.</div><div class='add'>+#</div><div class='head'>diff --git a/geo-replication/syncdaemon/argsupgrade.py b/geo-replication/syncdaemon/argsupgrade.py<br/>new file mode 100644<br/>index 00000000000..7af40633ef8<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/geo-replication/syncdaemon/argsupgrade.py?id=d1d7a6f35c816822fab51c820e25023863c239c1'>geo-replication/syncdaemon/argsupgrade.py</a></div><div class='hunk'>@@ -0,0 +1,359 @@</div><div class='add'>+# -*- coding: utf-8 -*-</div><div class='add'>+#</div><div class='add'>+#  Copyright (c) 2016 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+#  This file is part of GlusterFS.</div><div class='add'>+#</div><div class='add'>+#  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+#  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+#  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+#  cases as published by the Free Software Foundation.</div><div class='add'>+#</div><div class='add'>+# Converts old style args into new style args</div><div class='add'>+</div><div class='add'>+from __future__ import print_function</div><div class='add'>+import sys</div><div class='add'>+from argparse import ArgumentParser</div><div class='add'>+import socket</div><div class='add'>+import os</div><div class='add'>+</div><div class='add'>+from syncdutils import GsyncdError</div><div class='add'>+from conf import GLUSTERD_WORKDIR</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def gethostbyname(hnam):</div><div class='add'>+    """gethostbyname wrapper"""</div><div class='add'>+    try:</div><div class='add'>+        return socket.gethostbyname(hnam)</div><div class='add'>+    except socket.gaierror:</div><div class='add'>+        ex = sys.exc_info()[1]</div><div class='add'>+        raise GsyncdError("failed to resolve %s: %s" %</div><div class='add'>+                          (hnam, ex.strerror))</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def slave_url(urldata):</div><div class='add'>+    urldata = urldata.replace("ssh://", "")</div><div class='add'>+    host, vol = urldata.split("::")</div><div class='add'>+    vol = vol.split(":")[0]</div><div class='add'>+    return "%s::%s" % (host, vol)</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def init_gsyncd_template_conf():</div><div class='add'>+    path = GLUSTERD_WORKDIR + "/geo-replication/gsyncd_template.conf"</div><div class='add'>+    dname = os.path.dirname(path)</div><div class='add'>+    if not os.path.exists(dname):</div><div class='add'>+        try:</div><div class='add'>+            os.mkdir(dname)</div><div class='add'>+        except OSError:</div><div class='add'>+            pass</div><div class='add'>+</div><div class='add'>+    if not os.path.exists(path):</div><div class='add'>+        fd = os.open(path, os.O_CREAT | os.O_RDWR)</div><div class='add'>+        os.close(fd)</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def init_gsyncd_session_conf(master, slave):</div><div class='add'>+    slave = slave_url(slave)</div><div class='add'>+    master = master.strip(":")</div><div class='add'>+    slavehost, slavevol = slave.split("::")</div><div class='add'>+    slavehost = slavehost.split("@")[-1]</div><div class='add'>+</div><div class='add'>+    # Session Config File</div><div class='add'>+    path = "%s/geo-replication/%s_%s_%s/gsyncd.conf" % (</div><div class='add'>+        GLUSTERD_WORKDIR, master, slavehost, slavevol)</div><div class='add'>+</div><div class='add'>+    if os.path.exists(os.path.dirname(path)) and not os.path.exists(path):</div><div class='add'>+        fd = os.open(path, os.O_CREAT | os.O_RDWR)</div><div class='add'>+        os.close(fd)</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def init_gsyncd_conf(path):</div><div class='add'>+    dname = os.path.dirname(path)</div><div class='add'>+    if not os.path.exists(dname):</div><div class='add'>+        try:</div><div class='add'>+            os.mkdir(dname)</div><div class='add'>+        except OSError:</div><div class='add'>+            pass</div><div class='add'>+</div><div class='add'>+    if os.path.exists(dname) and not os.path.exists(path):</div><div class='add'>+        fd = os.open(path, os.O_CREAT | os.O_RDWR)</div><div class='add'>+        os.close(fd)</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def upgrade():</div><div class='add'>+    # Create dummy template conf(empty), hack to avoid glusterd</div><div class='add'>+    # fail when it does stat to check the existence.</div><div class='add'>+    init_gsyncd_template_conf()</div><div class='add'>+</div><div class='add'>+    inet6 = False</div><div class='add'>+    if "--inet6" in sys.argv:</div><div class='add'>+        inet6 = True</div><div class='add'>+</div><div class='add'>+    if "--monitor" in sys.argv:</div><div class='add'>+        # python gsyncd.py --path=/bricks/b1</div><div class='add'>+        # --monitor -c gsyncd.conf</div><div class='add'>+        # --iprefix=/var :gv1</div><div class='add'>+        # --glusterd-uuid=f26ac7a8-eb1b-4ea7-959c-80b27d3e43d0</div><div class='add'>+        # f241::gv2</div><div class='add'>+        p = ArgumentParser()</div><div class='add'>+        p.add_argument("master")</div><div class='add'>+        p.add_argument("slave")</div><div class='add'>+        p.add_argument("--glusterd-uuid")</div><div class='add'>+        p.add_argument("-c")</div><div class='add'>+        p.add_argument("--iprefix")</div><div class='add'>+        p.add_argument("--path", action="append")</div><div class='add'>+        pargs = p.parse_known_args(sys.argv[1:])[0]</div><div class='add'>+</div><div class='add'>+        # Overwrite the sys.argv after rearrange</div><div class='add'>+        init_gsyncd_session_conf(pargs.master, pargs.slave)</div><div class='add'>+        sys.argv = [</div><div class='add'>+            sys.argv[0],</div><div class='add'>+            "monitor",</div><div class='add'>+            pargs.master.strip(":"),</div><div class='add'>+            slave_url(pargs.slave),</div><div class='add'>+            "--local-node-id",</div><div class='add'>+            pargs.glusterd_uuid</div><div class='add'>+        ]</div><div class='add'>+    elif "--status-get" in sys.argv:</div><div class='add'>+        # -c gsyncd.conf --iprefix=/var :gv1 f241::gv2</div><div class='add'>+        # --status-get --path /bricks/b1</div><div class='add'>+        p = ArgumentParser()</div><div class='add'>+        p.add_argument("master")</div><div class='add'>+        p.add_argument("slave")</div><div class='add'>+        p.add_argument("-c")</div><div class='add'>+        p.add_argument("--path")</div><div class='add'>+        p.add_argument("--iprefix")</div><div class='add'>+        pargs = p.parse_known_args(sys.argv[1:])[0]</div><div class='add'>+</div><div class='add'>+        init_gsyncd_session_conf(pargs.master, pargs.slave)</div><div class='add'>+</div><div class='add'>+        sys.argv = [</div><div class='add'>+            sys.argv[0],</div><div class='add'>+            "status",</div><div class='add'>+            pargs.master.strip(":"),</div><div class='add'>+            slave_url(pargs.slave),</div><div class='add'>+            "--local-path",</div><div class='add'>+            pargs.path</div><div class='add'>+        ]</div><div class='add'>+    elif "--canonicalize-url" in sys.argv:</div><div class='add'>+        # This can accept multiple URLs and converts each URL to the</div><div class='add'>+        # format ssh://USER@IP:gluster://127.0.0.1:VOLUME</div><div class='add'>+        # This format not used in gsyncd, but added for glusterd compatibility</div><div class='add'>+        p = ArgumentParser()</div><div class='add'>+        p.add_argument("--canonicalize-url", nargs="+")</div><div class='add'>+        pargs = p.parse_known_args(sys.argv[1:])[0]</div><div class='add'>+</div><div class='add'>+        for url in pargs.canonicalize_url:</div><div class='add'>+            host, vol = url.split("::")</div><div class='add'>+            host = host.replace("ssh://", "")</div><div class='add'>+            remote_addr = host</div><div class='add'>+            if "@" not in remote_addr:</div><div class='add'>+                remote_addr = "root@" + remote_addr</div><div class='add'>+</div><div class='add'>+            user, hname = remote_addr.split("@")</div><div class='add'>+</div><div class='add'>+            if not inet6:</div><div class='add'>+                hname = gethostbyname(hname)</div><div class='add'>+</div><div class='add'>+            print(("ssh://%s@%s:gluster://127.0.0.1:%s" % (</div><div class='add'>+                user, hname, vol)))</div><div class='add'>+</div><div class='add'>+        sys.exit(0)</div><div class='add'>+    elif "--normalize-url" in sys.argv:</div><div class='add'>+        # Adds schema prefix as ssh://</div><div class='add'>+        # This format not used in gsyncd, but added for glusterd compatibility</div><div class='add'>+        p = ArgumentParser()</div><div class='add'>+        p.add_argument("--normalize-url")</div><div class='add'>+        pargs = p.parse_known_args(sys.argv[1:])[0]</div><div class='add'>+        print(("ssh://%s" % slave_url(pargs.normalize_url)))</div><div class='add'>+        sys.exit(0)</div><div class='add'>+    elif "--config-get-all" in sys.argv:</div><div class='add'>+        #  -c gsyncd.conf --iprefix=/var :gv1 f241::gv2 --config-get-all</div><div class='add'>+        p = ArgumentParser()</div><div class='add'>+        p.add_argument("master")</div><div class='add'>+        p.add_argument("slave")</div><div class='add'>+        p.add_argument("-c")</div><div class='add'>+        p.add_argument("--iprefix")</div><div class='add'>+        pargs = p.parse_known_args(sys.argv[1:])[0]</div><div class='add'>+</div><div class='add'>+        init_gsyncd_session_conf(pargs.master, pargs.slave)</div><div class='add'>+</div><div class='add'>+        sys.argv = [</div><div class='add'>+            sys.argv[0],</div><div class='add'>+            "config-get",</div><div class='add'>+            pargs.master.strip(":"),</div><div class='add'>+            slave_url(pargs.slave),</div><div class='add'>+            "--show-defaults",</div><div class='add'>+            "--use-underscore"</div><div class='add'>+        ]</div><div class='add'>+    elif "--verify" in sys.argv and "spawning" in sys.argv:</div><div class='add'>+        # Just checks that able to spawn gsyncd or not</div><div class='add'>+        sys.exit(0)</div><div class='add'>+    elif "--slavevoluuid-get" in sys.argv:</div><div class='add'>+        # --slavevoluuid-get f241::gv2</div><div class='add'>+        p = ArgumentParser()</div><div class='add'>+        p.add_argument("--slavevoluuid-get")</div><div class='add'>+        p.add_argument("-c")</div><div class='add'>+        p.add_argument("--iprefix")</div><div class='add'>+        pargs = p.parse_known_args(sys.argv[1:])[0]</div><div class='add'>+        host, vol = pargs.slavevoluuid_get.split("::")</div><div class='add'>+</div><div class='add'>+        # Modified sys.argv</div><div class='add'>+        sys.argv = [</div><div class='add'>+            sys.argv[0],</div><div class='add'>+            "voluuidget",</div><div class='add'>+            host,</div><div class='add'>+            vol</div><div class='add'>+        ]</div><div class='add'>+    elif "--config-set-rx" in sys.argv:</div><div class='add'>+        # Not required since default conf is not generated</div><div class='add'>+        # and custom conf generated only when required</div><div class='add'>+        # -c gsyncd.conf --config-set-rx remote-gsyncd</div><div class='add'>+        # /usr/local/libexec/glusterfs/gsyncd . .</div><div class='add'>+        # Touch the gsyncd.conf file and create session</div><div class='add'>+        # directory if required</div><div class='add'>+        p = ArgumentParser()</div><div class='add'>+        p.add_argument("-c", dest="config_file")</div><div class='add'>+        pargs = p.parse_known_args(sys.argv[1:])[0]</div><div class='add'>+</div><div class='add'>+        # If not template conf then it is trying to create</div><div class='add'>+        # session config, create a empty file instead</div><div class='add'>+        if pargs.config_file.endswith("gsyncd.conf"):</div><div class='add'>+            init_gsyncd_conf(pargs.config_file)</div><div class='add'>+        sys.exit(0)</div><div class='add'>+    elif "--create" in sys.argv:</div><div class='add'>+        # To update monitor status file</div><div class='add'>+        # --create Created -c gsyncd.conf</div><div class='add'>+        # --iprefix=/var :gv1 f241::gv2</div><div class='add'>+        p = ArgumentParser()</div><div class='add'>+        p.add_argument("--create")</div><div class='add'>+        p.add_argument("master")</div><div class='add'>+        p.add_argument("slave")</div><div class='add'>+        p.add_argument("-c")</div><div class='add'>+        p.add_argument("--iprefix")</div><div class='add'>+        pargs = p.parse_known_args(sys.argv[1:])[0]</div><div class='add'>+</div><div class='add'>+        init_gsyncd_session_conf(pargs.master, pargs.slave)</div><div class='add'>+</div><div class='add'>+        # Modified sys.argv</div><div class='add'>+        sys.argv = [</div><div class='add'>+            sys.argv[0],</div><div class='add'>+            "monitor-status",</div><div class='add'>+            pargs.master.strip(":"),</div><div class='add'>+            slave_url(pargs.slave),</div><div class='add'>+            pargs.create</div><div class='add'>+        ]</div><div class='add'>+    elif "--config-get" in sys.argv:</div><div class='add'>+        # -c gsyncd.conf --iprefix=/var :gv1 f241::gv2 --config-get pid-file</div><div class='add'>+        p = ArgumentParser()</div><div class='add'>+        p.add_argument("--config-get")</div><div class='add'>+        p.add_argument("master")</div><div class='add'>+        p.add_argument("slave")</div><div class='add'>+        p.add_argument("-c")</div><div class='add'>+        p.add_argument("--iprefix")</div><div class='add'>+        pargs = p.parse_known_args(sys.argv[1:])[0]</div><div class='add'>+</div><div class='add'>+        init_gsyncd_session_conf(pargs.master, pargs.slave)</div><div class='add'>+</div><div class='add'>+        # Modified sys.argv</div><div class='add'>+        sys.argv = [</div><div class='add'>+            sys.argv[0],</div><div class='add'>+            "config-get",</div><div class='add'>+            pargs.master.strip(":"),</div><div class='add'>+            slave_url(pargs.slave),</div><div class='add'>+            "--only-value",</div><div class='add'>+            "--show-defaults",</div><div class='add'>+            "--name",</div><div class='add'>+            pargs.config_get.replace("_", "-")</div><div class='add'>+        ]</div><div class='add'>+    elif "--config-set" in sys.argv:</div><div class='add'>+        # ignore session-owner</div><div class='add'>+        if "session-owner" in sys.argv:</div><div class='add'>+            sys.exit(0)</div><div class='add'>+</div><div class='add'>+        # --path=/bricks/b1  -c gsyncd.conf :gv1 f241::gv2</div><div class='add'>+        # --config-set log_level DEBUG</div><div class='add'>+        p = ArgumentParser()</div><div class='add'>+        p.add_argument("master")</div><div class='add'>+        p.add_argument("slave")</div><div class='add'>+        p.add_argument("--config-set", action='store_true')</div><div class='add'>+        p.add_argument("name")</div><div class='add'>+        p.add_argument("--value")</div><div class='add'>+        p.add_argument("-c")</div><div class='add'>+        pargs = p.parse_known_args(sys.argv[1:])[0]</div><div class='add'>+</div><div class='add'>+        init_gsyncd_session_conf(pargs.master, pargs.slave)</div><div class='add'>+</div><div class='add'>+        # Modified sys.argv</div><div class='add'>+        sys.argv = [</div><div class='add'>+            sys.argv[0],</div><div class='add'>+            "config-set",</div><div class='add'>+            pargs.master.strip(":"),</div><div class='add'>+            slave_url(pargs.slave),</div><div class='add'>+            "--name=%s" % pargs.name,</div><div class='add'>+            "--value=%s" % pargs.value</div><div class='add'>+        ]</div><div class='add'>+    elif "--config-check" in sys.argv:</div><div class='add'>+        # --config-check georep_session_working_dir</div><div class='add'>+        p = ArgumentParser()</div><div class='add'>+        p.add_argument("--config-check")</div><div class='add'>+        p.add_argument("-c")</div><div class='add'>+        pargs = p.parse_known_args(sys.argv[1:])[0]</div><div class='add'>+</div><div class='add'>+        # Modified sys.argv</div><div class='add'>+        sys.argv = [</div><div class='add'>+            sys.argv[0],</div><div class='add'>+            "config-check",</div><div class='add'>+            pargs.config_check.replace("_", "-")</div><div class='add'>+        ]</div><div class='add'>+    elif "--config-del" in sys.argv:</div><div class='add'>+        # -c gsyncd.conf --iprefix=/var :gv1 f241::gv2 --config-del log_level</div><div class='add'>+        p = ArgumentParser()</div><div class='add'>+        p.add_argument("--config-del")</div><div class='add'>+        p.add_argument("master")</div><div class='add'>+        p.add_argument("slave")</div><div class='add'>+        p.add_argument("-c")</div><div class='add'>+        p.add_argument("--iprefix")</div><div class='add'>+        pargs = p.parse_known_args(sys.argv[1:])[0]</div><div class='add'>+</div><div class='add'>+        init_gsyncd_session_conf(pargs.master, pargs.slave)</div><div class='add'>+</div><div class='add'>+        # Modified sys.argv</div><div class='add'>+        sys.argv = [</div><div class='add'>+            sys.argv[0],</div><div class='add'>+            "config-reset",</div><div class='add'>+            pargs.master.strip(":"),</div><div class='add'>+            slave_url(pargs.slave),</div><div class='add'>+            pargs.config_del.replace("_", "-")</div><div class='add'>+        ]</div><div class='add'>+    elif "--delete" in sys.argv:</div><div class='add'>+        # --delete -c gsyncd.conf --iprefix=/var</div><div class='add'>+        # --path-list=--path=/bricks/b1  :gv1 f241::gv2</div><div class='add'>+        p = ArgumentParser()</div><div class='add'>+        p.add_argument("--reset-sync-time", action="store_true")</div><div class='add'>+        p.add_argument("--path-list")</div><div class='add'>+        p.add_argument("master")</div><div class='add'>+        p.add_argument("slave")</div><div class='add'>+        p.add_argument("--iprefix")</div><div class='add'>+        p.add_argument("-c")</div><div class='add'>+        pargs = p.parse_known_args(sys.argv[1:])[0]</div><div class='add'>+</div><div class='add'>+        init_gsyncd_session_conf(pargs.master, pargs.slave)</div><div class='add'>+</div><div class='add'>+        paths = pargs.path_list.split("--path=")</div><div class='add'>+        paths = ["--path=%s" % x.strip() for x in paths if x.strip() != ""]</div><div class='add'>+</div><div class='add'>+        # Modified sys.argv</div><div class='add'>+        sys.argv = [</div><div class='add'>+            sys.argv[0],</div><div class='add'>+            "delete",</div><div class='add'>+            pargs.master.strip(":"),</div><div class='add'>+            slave_url(pargs.slave)</div><div class='add'>+        ]</div><div class='add'>+        sys.argv += paths</div><div class='add'>+</div><div class='add'>+        if pargs.reset_sync_time:</div><div class='add'>+            sys.argv.append("--reset-sync-time")</div><div class='add'>+</div><div class='add'>+    if inet6:</div><div class='add'>+        # Add `--inet6` as first argument</div><div class='add'>+        sys.argv = [sys.argv[0], "--inet6"] + sys.argv[1:]</div><div class='head'>diff --git a/geo-replication/syncdaemon/conf.py.in b/geo-replication/syncdaemon/conf.py.in<br/>new file mode 100644<br/>index 00000000000..2042fa9cdfb<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/geo-replication/syncdaemon/conf.py.in?id=d1d7a6f35c816822fab51c820e25023863c239c1'>geo-replication/syncdaemon/conf.py.in</a></div><div class='hunk'>@@ -0,0 +1,17 @@</div><div class='add'>+#</div><div class='add'>+# Copyright (c) 2016 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+# This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+# This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+# General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+# later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+# cases as published by the Free Software Foundation.</div><div class='add'>+#</div><div class='add'>+</div><div class='add'>+GLUSTERFS_LIBEXECDIR = '@GLUSTERFS_LIBEXECDIR@'</div><div class='add'>+GLUSTERD_WORKDIR = "@GLUSTERD_WORKDIR@"</div><div class='add'>+</div><div class='add'>+LOCALSTATEDIR = "@localstatedir@"</div><div class='add'>+UUID_FILE = "@GLUSTERD_WORKDIR@/glusterd.info"</div><div class='add'>+GLUSTERFS_CONFDIR = "@SYSCONF_DIR@/glusterfs"</div><div class='add'>+GCONF_VERSION = 4.0</div><div class='head'>diff --git a/geo-replication/syncdaemon/gsyncd.py b/geo-replication/syncdaemon/gsyncd.py<br/>new file mode 100644<br/>index 00000000000..257ed72c6ae<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/geo-replication/syncdaemon/gsyncd.py?id=d1d7a6f35c816822fab51c820e25023863c239c1'>geo-replication/syncdaemon/gsyncd.py</a></div><div class='hunk'>@@ -0,0 +1,325 @@</div><div class='add'>+#!/usr/bin/python3</div><div class='add'>+# -*- coding: utf-8 -*-</div><div class='add'>+#</div><div class='add'>+#  Copyright (c) 2016 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+#  This file is part of GlusterFS.</div><div class='add'>+#</div><div class='add'>+#  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+#  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+#  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+#  cases as published by the Free Software Foundation.</div><div class='add'>+#</div><div class='add'>+</div><div class='add'>+from argparse import ArgumentParser</div><div class='add'>+import time</div><div class='add'>+import os</div><div class='add'>+from errno import EEXIST</div><div class='add'>+import sys</div><div class='add'>+import logging</div><div class='add'>+</div><div class='add'>+from logutils import setup_logging</div><div class='add'>+import gsyncdconfig as gconf</div><div class='add'>+from rconf import rconf</div><div class='add'>+import subcmds</div><div class='add'>+from conf import GLUSTERD_WORKDIR, GLUSTERFS_CONFDIR, GCONF_VERSION</div><div class='add'>+from syncdutils import (set_term_handler, finalize, lf,</div><div class='add'>+                        log_raise_exception, FreeObject, escape)</div><div class='add'>+import argsupgrade</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+GSYNCD_VERSION = "gsyncd.py %s.0" % GCONF_VERSION</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def main():</div><div class='add'>+    rconf.starttime = time.time()</div><div class='add'>+</div><div class='add'>+    # If old Glusterd sends commands in old format, below function</div><div class='add'>+    # converts the sys.argv to new format. This conversion is added</div><div class='add'>+    # temporarily for backward compatibility. This can be removed</div><div class='add'>+    # once integrated with Glusterd2</div><div class='add'>+    # This modifies sys.argv globally, so rest of the code works as usual</div><div class='add'>+    argsupgrade.upgrade()</div><div class='add'>+</div><div class='add'>+    # Default argparse version handler prints to stderr, which is fixed in</div><div class='add'>+    # 3.x series but not in 2.x, using custom parser to fix this issue</div><div class='add'>+    if "--version" in sys.argv:</div><div class='add'>+        print(GSYNCD_VERSION)</div><div class='add'>+        sys.exit(0)</div><div class='add'>+</div><div class='add'>+    parser = ArgumentParser()</div><div class='add'>+    parser.add_argument("--inet6", action="store_true")</div><div class='add'>+    sp = parser.add_subparsers(dest="subcmd")</div><div class='add'>+</div><div class='add'>+    # Monitor Status File update</div><div class='add'>+    p = sp.add_parser("monitor-status")</div><div class='add'>+    p.add_argument("master", help="Master Volume Name")</div><div class='add'>+    p.add_argument("slave", help="Slave details user@host::vol format")</div><div class='add'>+    p.add_argument("status", help="Update Monitor Status")</div><div class='add'>+    p.add_argument("-c", "--config-file", help="Config File")</div><div class='add'>+    p.add_argument("--debug", action="store_true")</div><div class='add'>+</div><div class='add'>+    # Monitor</div><div class='add'>+    p = sp.add_parser("monitor")</div><div class='add'>+    p.add_argument("master", help="Master Volume Name")</div><div class='add'>+    p.add_argument("slave", help="Slave details user@host::vol format")</div><div class='add'>+    p.add_argument("-c", "--config-file", help="Config File")</div><div class='add'>+    p.add_argument("--pause-on-start",</div><div class='add'>+                   action="store_true",</div><div class='add'>+                   help="Start with Paused state")</div><div class='add'>+    p.add_argument("--local-node-id", help="Local Node ID")</div><div class='add'>+    p.add_argument("--debug", action="store_true")</div><div class='add'>+    p.add_argument("--use-gconf-volinfo", action="store_true")</div><div class='add'>+</div><div class='add'>+    # Worker</div><div class='add'>+    p = sp.add_parser("worker")</div><div class='add'>+    p.add_argument("master", help="Master Volume Name")</div><div class='add'>+    p.add_argument("slave", help="Slave details user@host::vol format")</div><div class='add'>+    p.add_argument("--local-path", help="Local Brick Path")</div><div class='add'>+    p.add_argument("--feedback-fd", type=int,</div><div class='add'>+                   help="feedback fd between monitor and worker")</div><div class='add'>+    p.add_argument("--local-node", help="Local master node")</div><div class='add'>+    p.add_argument("--local-node-id", help="Local Node ID")</div><div class='add'>+    p.add_argument("--subvol-num", type=int, help="Subvolume number")</div><div class='add'>+    p.add_argument("--is-hottier", action="store_true",</div><div class='add'>+                   help="Is this brick part of hot tier")</div><div class='add'>+    p.add_argument("--resource-remote",</div><div class='add'>+                   help="Remote node to connect to Slave Volume")</div><div class='add'>+    p.add_argument("--resource-remote-id",</div><div class='add'>+                   help="Remote node ID to connect to Slave Volume")</div><div class='add'>+    p.add_argument("--slave-id", help="Slave Volume ID")</div><div class='add'>+    p.add_argument("-c", "--config-file", help="Config File")</div><div class='add'>+    p.add_argument("--debug", action="store_true")</div><div class='add'>+</div><div class='add'>+    # Slave</div><div class='add'>+    p = sp.add_parser("slave")</div><div class='add'>+    p.add_argument("master", help="Master Volume Name")</div><div class='add'>+    p.add_argument("slave", help="Slave details user@host::vol format")</div><div class='add'>+    p.add_argument("--session-owner")</div><div class='add'>+    p.add_argument("--master-brick",</div><div class='add'>+                   help="Master brick which is connected to the Slave")</div><div class='add'>+    p.add_argument("--master-node",</div><div class='add'>+                   help="Master node which is connected to the Slave")</div><div class='add'>+    p.add_argument("--master-node-id",</div><div class='add'>+                   help="Master node ID which is connected to the Slave")</div><div class='add'>+    p.add_argument("--local-node", help="Local Slave node")</div><div class='add'>+    p.add_argument("--local-node-id", help="Local Slave ID")</div><div class='add'>+    p.add_argument("-c", "--config-file", help="Config File")</div><div class='add'>+    p.add_argument("--debug", action="store_true")</div><div class='add'>+</div><div class='add'>+    # All configurations which are configured via "slave-" options</div><div class='add'>+    # DO NOT add default values for these configurations, default values</div><div class='add'>+    # will be picked from template config file</div><div class='add'>+    p.add_argument("--slave-timeout", type=int,</div><div class='add'>+                   help="Timeout to end gsyncd at Slave side")</div><div class='add'>+    p.add_argument("--use-rsync-xattrs", action="store_true")</div><div class='add'>+    p.add_argument("--slave-log-level", help="Slave Gsyncd Log level")</div><div class='add'>+    p.add_argument("--slave-gluster-log-level",</div><div class='add'>+                   help="Slave Gluster mount Log level")</div><div class='add'>+    p.add_argument("--slave-gluster-command-dir",</div><div class='add'>+                   help="Directory where Gluster binaries exist on slave")</div><div class='add'>+    p.add_argument("--slave-access-mount", action="store_true",</div><div class='add'>+                   help="Do not lazy umount the slave volume")</div><div class='add'>+    p.add_argument("--master-dist-count", type=int,</div><div class='add'>+                   help="Master Distribution count")</div><div class='add'>+</div><div class='add'>+    # Status</div><div class='add'>+    p = sp.add_parser("status")</div><div class='add'>+    p.add_argument("master", help="Master Volume Name")</div><div class='add'>+    p.add_argument("slave", help="Slave")</div><div class='add'>+    p.add_argument("-c", "--config-file", help="Config File")</div><div class='add'>+    p.add_argument("--local-path", help="Local Brick Path")</div><div class='add'>+    p.add_argument("--debug", action="store_true")</div><div class='add'>+    p.add_argument("--json", action="store_true")</div><div class='add'>+</div><div class='add'>+    # Config-check</div><div class='add'>+    p = sp.add_parser("config-check")</div><div class='add'>+    p.add_argument("name", help="Config Name")</div><div class='add'>+    p.add_argument("--value", help="Config Value")</div><div class='add'>+    p.add_argument("--debug", action="store_true")</div><div class='add'>+</div><div class='add'>+    # Config-get</div><div class='add'>+    p = sp.add_parser("config-get")</div><div class='add'>+    p.add_argument("master", help="Master Volume Name")</div><div class='add'>+    p.add_argument("slave", help="Slave")</div><div class='add'>+    p.add_argument("--name", help="Config Name")</div><div class='add'>+    p.add_argument("-c", "--config-file", help="Config File")</div><div class='add'>+    p.add_argument("--debug", action="store_true")</div><div class='add'>+    p.add_argument("--show-defaults", action="store_true")</div><div class='add'>+    p.add_argument("--only-value", action="store_true")</div><div class='add'>+    p.add_argument("--use-underscore", action="store_true")</div><div class='add'>+    p.add_argument("--json", action="store_true")</div><div class='add'>+</div><div class='add'>+    # Config-set</div><div class='add'>+    p = sp.add_parser("config-set")</div><div class='add'>+    p.add_argument("master", help="Master Volume Name")</div><div class='add'>+    p.add_argument("slave", help="Slave")</div><div class='add'>+    p.add_argument("-n", "--name", help="Config Name")</div><div class='add'>+    p.add_argument("-v", "--value", help="Config Value")</div><div class='add'>+    p.add_argument("-c", "--config-file", help="Config File")</div><div class='add'>+    p.add_argument("--debug", action="store_true")</div><div class='add'>+</div><div class='add'>+    # Config-reset</div><div class='add'>+    p = sp.add_parser("config-reset")</div><div class='add'>+    p.add_argument("master", help="Master Volume Name")</div><div class='add'>+    p.add_argument("slave", help="Slave")</div><div class='add'>+    p.add_argument("name", help="Config Name")</div><div class='add'>+    p.add_argument("-c", "--config-file", help="Config File")</div><div class='add'>+    p.add_argument("--debug", action="store_true")</div><div class='add'>+</div><div class='add'>+    # voluuidget</div><div class='add'>+    p = sp.add_parser("voluuidget")</div><div class='add'>+    p.add_argument("host", help="Hostname")</div><div class='add'>+    p.add_argument("volname", help="Volume Name")</div><div class='add'>+    p.add_argument("--debug", action="store_true")</div><div class='add'>+</div><div class='add'>+    # Delete</div><div class='add'>+    p = sp.add_parser("delete")</div><div class='add'>+    p.add_argument("master", help="Master Volume Name")</div><div class='add'>+    p.add_argument("slave", help="Slave")</div><div class='add'>+    p.add_argument("-c", "--config-file", help="Config File")</div><div class='add'>+    p.add_argument('--path', dest='paths', action="append")</div><div class='add'>+    p.add_argument("--reset-sync-time", action="store_true",</div><div class='add'>+                   help="Reset Sync Time")</div><div class='add'>+    p.add_argument("--debug", action="store_true")</div><div class='add'>+</div><div class='add'>+    # Parse arguments</div><div class='add'>+    args = parser.parse_args()</div><div class='add'>+</div><div class='add'>+    # Extra template values, All arguments are already part of template</div><div class='add'>+    # variables, use this for adding extra variables</div><div class='add'>+    extra_tmpl_args = {}</div><div class='add'>+</div><div class='add'>+    # Add First/Primary Slave host, user and volume</div><div class='add'>+    if getattr(args, "slave", None) is not None:</div><div class='add'>+        hostdata, slavevol = args.slave.split("::")</div><div class='add'>+        hostdata = hostdata.split("@")</div><div class='add'>+        slavehost = hostdata[-1]</div><div class='add'>+        slaveuser = "root"</div><div class='add'>+        if len(hostdata) == 2:</div><div class='add'>+            slaveuser = hostdata[0]</div><div class='add'>+        extra_tmpl_args["primary_slave_host"] = slavehost</div><div class='add'>+        extra_tmpl_args["slaveuser"] = slaveuser</div><div class='add'>+        extra_tmpl_args["slavevol"] = slavevol</div><div class='add'>+</div><div class='add'>+    # Add Bricks encoded path</div><div class='add'>+    if getattr(args, "local_path", None) is not None:</div><div class='add'>+        extra_tmpl_args["local_id"] = escape(args.local_path)</div><div class='add'>+</div><div class='add'>+    # Add Master Bricks encoded path(For Slave)</div><div class='add'>+    if getattr(args, "master_brick", None) is not None:</div><div class='add'>+        extra_tmpl_args["master_brick_id"] = escape(args.master_brick)</div><div class='add'>+</div><div class='add'>+    # Load configurations</div><div class='add'>+    config_file = getattr(args, "config_file", None)</div><div class='add'>+</div><div class='add'>+    # Subcmd accepts config file argument but not passed</div><div class='add'>+    # Set default path for config file in that case</div><div class='add'>+    # If an subcmd accepts config file then it also accepts</div><div class='add'>+    # master and Slave arguments.</div><div class='add'>+    if config_file is None and hasattr(args, "config_file") \</div><div class='add'>+        and args.subcmd != "slave":</div><div class='add'>+        config_file = "%s/geo-replication/%s_%s_%s/gsyncd.conf" % (</div><div class='add'>+            GLUSTERD_WORKDIR,</div><div class='add'>+            args.master,</div><div class='add'>+            extra_tmpl_args["primary_slave_host"],</div><div class='add'>+            extra_tmpl_args["slavevol"])</div><div class='add'>+</div><div class='add'>+    # If Config file path not exists, log error and continue using default conf</div><div class='add'>+    config_file_error_msg = None</div><div class='add'>+    if config_file is not None and not os.path.exists(config_file):</div><div class='add'>+        # Logging not yet initialized, create the error message to</div><div class='add'>+        # log later and reset the config_file to None</div><div class='add'>+        config_file_error_msg = lf(</div><div class='add'>+            "Session config file not exists, using the default config",</div><div class='add'>+            path=config_file)</div><div class='add'>+        config_file = None</div><div class='add'>+</div><div class='add'>+    rconf.config_file = config_file</div><div class='add'>+</div><div class='add'>+    # Override gconf values from argument values only if it is slave gsyncd</div><div class='add'>+    override_from_args = False</div><div class='add'>+    if args.subcmd == "slave":</div><div class='add'>+        override_from_args = True</div><div class='add'>+</div><div class='add'>+    if config_file is not None and \</div><div class='add'>+       args.subcmd in ["monitor", "config-get", "config-set", "config-reset"]:</div><div class='add'>+        ret = gconf.is_config_file_old(config_file, args.master, extra_tmpl_args["slavevol"])</div><div class='add'>+        if ret is not None:</div><div class='add'>+           gconf.config_upgrade(config_file, ret)</div><div class='add'>+</div><div class='add'>+    # Load Config file</div><div class='add'>+    gconf.load(GLUSTERFS_CONFDIR + "/gsyncd.conf",</div><div class='add'>+               config_file,</div><div class='add'>+               vars(args),</div><div class='add'>+               extra_tmpl_args,</div><div class='add'>+               override_from_args)</div><div class='add'>+</div><div class='add'>+    # Default label to print in log file</div><div class='add'>+    label = args.subcmd</div><div class='add'>+    if args.subcmd in ("worker"):</div><div class='add'>+        # If Worker, then add brick path also to label</div><div class='add'>+        label = "%s %s" % (args.subcmd, args.local_path)</div><div class='add'>+    elif args.subcmd == "slave":</div><div class='add'>+        # If Slave add Master node and Brick details</div><div class='add'>+        label = "%s %s%s" % (args.subcmd, args.master_node, args.master_brick)</div><div class='add'>+</div><div class='add'>+    # Setup Logger</div><div class='add'>+    # Default log file</div><div class='add'>+    log_file = gconf.get("cli-log-file")</div><div class='add'>+    log_level = gconf.get("cli-log-level")</div><div class='add'>+    if getattr(args, "master", None) is not None and \</div><div class='add'>+       getattr(args, "slave", None) is not None:</div><div class='add'>+        log_file = gconf.get("log-file")</div><div class='add'>+        log_level = gconf.get("log-level")</div><div class='add'>+</div><div class='add'>+    # Use different log file location for Slave log file</div><div class='add'>+    if args.subcmd == "slave":</div><div class='add'>+        log_file = gconf.get("slave-log-file")</div><div class='add'>+        log_level = gconf.get("slave-log-level")</div><div class='add'>+</div><div class='add'>+    if args.debug:</div><div class='add'>+        log_file = "-"</div><div class='add'>+        log_level = "DEBUG"</div><div class='add'>+</div><div class='add'>+    # Create Logdir if not exists</div><div class='add'>+    try:</div><div class='add'>+        if log_file != "-":</div><div class='add'>+            os.mkdir(os.path.dirname(log_file))</div><div class='add'>+    except OSError as e:</div><div class='add'>+        if e.errno != EEXIST:</div><div class='add'>+            raise</div><div class='add'>+</div><div class='add'>+    setup_logging(</div><div class='add'>+        log_file=log_file,</div><div class='add'>+        level=log_level,</div><div class='add'>+        label=label</div><div class='add'>+    )</div><div class='add'>+</div><div class='add'>+    if config_file_error_msg is not None:</div><div class='add'>+        logging.warn(config_file_error_msg)</div><div class='add'>+</div><div class='add'>+    # Log message for loaded config file</div><div class='add'>+    if config_file is not None:</div><div class='add'>+        logging.debug(lf("Using session config file", path=config_file))</div><div class='add'>+</div><div class='add'>+    set_term_handler()</div><div class='add'>+    excont = FreeObject(exval=0)</div><div class='add'>+</div><div class='add'>+    # Gets the function name based on the input argument. For example</div><div class='add'>+    # if subcommand passed as argument is monitor then it looks for</div><div class='add'>+    # function with name "subcmd_monitor" in subcmds file</div><div class='add'>+    func = getattr(subcmds, "subcmd_" + args.subcmd.replace("-", "_"), None)</div><div class='add'>+</div><div class='add'>+    try:</div><div class='add'>+        try:</div><div class='add'>+            if func is not None:</div><div class='add'>+                rconf.args = args</div><div class='add'>+                func(args)</div><div class='add'>+        except:</div><div class='add'>+            log_raise_exception(excont)</div><div class='add'>+    finally:</div><div class='add'>+        finalize(exval=excont.exval)</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+if __name__ == "__main__":</div><div class='add'>+    main()</div><div class='head'>diff --git a/geo-replication/syncdaemon/gsyncdconfig.py b/geo-replication/syncdaemon/gsyncdconfig.py<br/>new file mode 100644<br/>index 00000000000..8848071997a<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/geo-replication/syncdaemon/gsyncdconfig.py?id=d1d7a6f35c816822fab51c820e25023863c239c1'>geo-replication/syncdaemon/gsyncdconfig.py</a></div><div class='hunk'>@@ -0,0 +1,485 @@</div><div class='add'>+# -*- coding: utf-8 -*-</div><div class='add'>+#</div><div class='add'>+#  Copyright (c) 2016 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+#  This file is part of GlusterFS.</div><div class='add'>+#</div><div class='add'>+#  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+#  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+#  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+#  cases as published by the Free Software Foundation.</div><div class='add'>+#</div><div class='add'>+</div><div class='add'>+try:</div><div class='add'>+    from ConfigParser import RawConfigParser, NoSectionError</div><div class='add'>+except ImportError:</div><div class='add'>+    from configparser import RawConfigParser, NoSectionError</div><div class='add'>+import os</div><div class='add'>+import shutil</div><div class='add'>+from string import Template</div><div class='add'>+from datetime import datetime</div><div class='add'>+from threading import Lock</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+# Global object which can be used in other modules</div><div class='add'>+# once load_config is called</div><div class='add'>+_gconf = {}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+class GconfNotConfigurable(Exception):</div><div class='add'>+    pass</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+class GconfInvalidValue(Exception):</div><div class='add'>+    pass</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+class Gconf(object):</div><div class='add'>+    def __init__(self, default_conf_file, custom_conf_file=None,</div><div class='add'>+                 args={}, extra_tmpl_args={}, override_from_args=False):</div><div class='add'>+        self.lock = Lock()</div><div class='add'>+        self.default_conf_file = default_conf_file</div><div class='add'>+        self.custom_conf_file = custom_conf_file</div><div class='add'>+        self.tmp_conf_file = None</div><div class='add'>+        self.gconf = {}</div><div class='add'>+        self.gconfdata = {}</div><div class='add'>+        self.gconf_typecast = {}</div><div class='add'>+        self.template_conf = []</div><div class='add'>+        self.non_configurable_configs = []</div><div class='add'>+        self.prev_mtime = 0</div><div class='add'>+        if custom_conf_file is not None:</div><div class='add'>+            self.tmp_conf_file = custom_conf_file + ".tmp"</div><div class='add'>+</div><div class='add'>+        self.session_conf_items = []</div><div class='add'>+        self.args = args</div><div class='add'>+        self.extra_tmpl_args = extra_tmpl_args</div><div class='add'>+        self.override_from_args = override_from_args</div><div class='add'>+        # Store default values only if overwritten, Only for JSON/CLI output</div><div class='add'>+        self.default_values = {}</div><div class='add'>+        self._load()</div><div class='add'>+</div><div class='add'>+    def _tmpl_substitute(self):</div><div class='add'>+        tmpl_values = {}</div><div class='add'>+        for k, v in self.gconf.items():</div><div class='add'>+            tmpl_values[k.replace("-", "_")] = v</div><div class='add'>+</div><div class='add'>+        # override the config file values with the one user passed</div><div class='add'>+        for k, v in self.args.items():</div><div class='add'>+            # override the existing value only if set by user</div><div class='add'>+            if v is not None:</div><div class='add'>+                tmpl_values[k] = v</div><div class='add'>+</div><div class='add'>+        for k, v in self.extra_tmpl_args.items():</div><div class='add'>+            tmpl_values[k] = v</div><div class='add'>+</div><div class='add'>+        for k, v in self.gconf.items():</div><div class='add'>+            if k in self.template_conf and \</div><div class='add'>+               (isinstance(v, str) or isinstance(v, unicode)):</div><div class='add'>+                self.gconf[k] = Template(v).safe_substitute(tmpl_values)</div><div class='add'>+</div><div class='add'>+    def _do_typecast(self):</div><div class='add'>+        for k, v in self.gconf.items():</div><div class='add'>+            cast_func = globals().get(</div><div class='add'>+                "to_" + self.gconf_typecast.get(k, "string"), None)</div><div class='add'>+            if cast_func is not None:</div><div class='add'>+                self.gconf[k] = cast_func(v)</div><div class='add'>+                if self.default_values.get(k, None) is not None:</div><div class='add'>+                    self.default_values[k] = cast_func(v)</div><div class='add'>+</div><div class='add'>+    def reset(self, name):</div><div class='add'>+        # If custom conf file is not set then it is only read only configs</div><div class='add'>+        if self.custom_conf_file is None:</div><div class='add'>+            raise GconfNotConfigurable()</div><div class='add'>+</div><div class='add'>+        # If a config can not be modified</div><div class='add'>+        if name != "all" and not self._is_configurable(name):</div><div class='add'>+            raise GconfNotConfigurable()</div><div class='add'>+</div><div class='add'>+        cnf = RawConfigParser()</div><div class='add'>+        with open(self.custom_conf_file) as f:</div><div class='add'>+            cnf.readfp(f)</div><div class='add'>+</div><div class='add'>+            # Nothing to Reset, Not configured</div><div class='add'>+            if name != "all":</div><div class='add'>+                if not cnf.has_option("vars", name):</div><div class='add'>+                    return True</div><div class='add'>+</div><div class='add'>+                # Remove option from custom conf file</div><div class='add'>+                cnf.remove_option("vars", name)</div><div class='add'>+            else:</div><div class='add'>+                # Remove and add empty section, do not disturb if config file</div><div class='add'>+                # already has any other section</div><div class='add'>+                try:</div><div class='add'>+                    cnf.remove_section("vars")</div><div class='add'>+                except NoSectionError:</div><div class='add'>+                    pass</div><div class='add'>+</div><div class='add'>+                cnf.add_section("vars")</div><div class='add'>+</div><div class='add'>+        with open(self.tmp_conf_file, "w") as fw:</div><div class='add'>+            cnf.write(fw)</div><div class='add'>+</div><div class='add'>+        os.rename(self.tmp_conf_file, self.custom_conf_file)</div><div class='add'>+</div><div class='add'>+        self.reload()</div><div class='add'>+</div><div class='add'>+        return True</div><div class='add'>+</div><div class='add'>+    def set(self, name, value):</div><div class='add'>+        if self.custom_conf_file is None:</div><div class='add'>+            raise GconfNotConfigurable()</div><div class='add'>+</div><div class='add'>+        if not self._is_configurable(name):</div><div class='add'>+            raise GconfNotConfigurable()</div><div class='add'>+</div><div class='add'>+        if not self._is_valid_value(name, value):</div><div class='add'>+            raise GconfInvalidValue()</div><div class='add'>+</div><div class='add'>+        curr_val = self.gconf.get(name, None)</div><div class='add'>+        if curr_val == value:</div><div class='add'>+            return True</div><div class='add'>+</div><div class='add'>+        cnf = RawConfigParser()</div><div class='add'>+        with open(self.custom_conf_file) as f:</div><div class='add'>+            cnf.readfp(f)</div><div class='add'>+</div><div class='add'>+        if not cnf.has_section("vars"):</div><div class='add'>+            cnf.add_section("vars")</div><div class='add'>+</div><div class='add'>+        cnf.set("vars", name, value)</div><div class='add'>+        with open(self.tmp_conf_file, "w") as fw:</div><div class='add'>+            cnf.write(fw)</div><div class='add'>+</div><div class='add'>+        os.rename(self.tmp_conf_file, self.custom_conf_file)</div><div class='add'>+</div><div class='add'>+        self.reload()</div><div class='add'>+</div><div class='add'>+        return True</div><div class='add'>+</div><div class='add'>+    def check(self, name, value=None, with_conffile=True):</div><div class='add'>+        if with_conffile and self.custom_conf_file is None:</div><div class='add'>+            raise GconfNotConfigurable()</div><div class='add'>+</div><div class='add'>+        if not self._is_configurable(name):</div><div class='add'>+            raise GconfNotConfigurable()</div><div class='add'>+</div><div class='add'>+        if value is not None and not self._is_valid_value(name, value):</div><div class='add'>+            raise GconfInvalidValue()</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+    def _load_with_lock(self):</div><div class='add'>+        with self.lock:</div><div class='add'>+            self._load()</div><div class='add'>+</div><div class='add'>+    def _load(self):</div><div class='add'>+        self.gconf = {}</div><div class='add'>+        self.template_conf = []</div><div class='add'>+        self.gconf_typecast = {}</div><div class='add'>+        self.non_configurable_configs = []</div><div class='add'>+        self.session_conf_items = []</div><div class='add'>+        self.default_values = {}</div><div class='add'>+</div><div class='add'>+        conf = RawConfigParser()</div><div class='add'>+        # Default Template config file</div><div class='add'>+        with open(self.default_conf_file) as f:</div><div class='add'>+            conf.readfp(f)</div><div class='add'>+</div><div class='add'>+        # Custom Config file</div><div class='add'>+        if self.custom_conf_file is not None:</div><div class='add'>+            with open(self.custom_conf_file) as f:</div><div class='add'>+                conf.readfp(f)</div><div class='add'>+</div><div class='add'>+        # Get version from default conf file</div><div class='add'>+        self.version = conf.get("__meta__", "version")</div><div class='add'>+</div><div class='add'>+        # Populate default values</div><div class='add'>+        for sect in conf.sections():</div><div class='add'>+            if sect in ["__meta__", "vars"]:</div><div class='add'>+                continue</div><div class='add'>+</div><div class='add'>+            # Collect list of available options with help details</div><div class='add'>+            self.gconfdata[sect] = {}</div><div class='add'>+            for k, v in conf.items(sect):</div><div class='add'>+                self.gconfdata[sect][k] = v.strip()</div><div class='add'>+</div><div class='add'>+            # Collect the Type cast information</div><div class='add'>+            if conf.has_option(sect, "type"):</div><div class='add'>+                self.gconf_typecast[sect] = conf.get(sect, "type")</div><div class='add'>+</div><div class='add'>+            # Prepare list of configurable conf</div><div class='add'>+            if conf.has_option(sect, "configurable"):</div><div class='add'>+                if conf.get(sect, "configurable").lower() == "false":</div><div class='add'>+                    self.non_configurable_configs.append(sect)</div><div class='add'>+</div><div class='add'>+            # if it is a template conf value which needs to be substituted</div><div class='add'>+            if conf.has_option(sect, "template"):</div><div class='add'>+                if conf.get(sect, "template").lower().strip() == "true":</div><div class='add'>+                    self.template_conf.append(sect)</div><div class='add'>+</div><div class='add'>+            # Set default values</div><div class='add'>+            if conf.has_option(sect, "value"):</div><div class='add'>+                self.gconf[sect] = conf.get(sect, "value").strip()</div><div class='add'>+</div><div class='add'>+        # Load the custom conf elements and overwrite</div><div class='add'>+        if conf.has_section("vars"):</div><div class='add'>+            for k, v in conf.items("vars"):</div><div class='add'>+                self.session_conf_items.append(k)</div><div class='add'>+                self.default_values[k] = self.gconf.get(k, "")</div><div class='add'>+                self.gconf[k] = v.strip()</div><div class='add'>+</div><div class='add'>+        # Overwrite the Slave configurations which are sent as</div><div class='add'>+        # arguments to gsyncd slave</div><div class='add'>+        if self.override_from_args:</div><div class='add'>+            for k, v in self.args.items():</div><div class='add'>+                k = k.replace("_", "-")</div><div class='add'>+                if k.startswith("slave-") and k in self.gconf:</div><div class='add'>+                    self.gconf[k] = v</div><div class='add'>+</div><div class='add'>+        self._tmpl_substitute()</div><div class='add'>+        self._do_typecast()</div><div class='add'>+</div><div class='add'>+    def reload(self, with_lock=True):</div><div class='add'>+        if self._is_config_changed():</div><div class='add'>+            if with_lock:</div><div class='add'>+                self._load_with_lock()</div><div class='add'>+            else:</div><div class='add'>+                self._load()</div><div class='add'>+</div><div class='add'>+    def get(self, name, default_value=None, with_lock=True):</div><div class='add'>+        if with_lock:</div><div class='add'>+            with self.lock:</div><div class='add'>+                return self.gconf.get(name, default_value)</div><div class='add'>+        else:</div><div class='add'>+            return self.gconf.get(name, default_value)</div><div class='add'>+</div><div class='add'>+    def getall(self, show_defaults=False, show_non_configurable=False):</div><div class='add'>+        cnf = {}</div><div class='add'>+        if not show_defaults:</div><div class='add'>+            for k in self.session_conf_items:</div><div class='add'>+                if k not in self.non_configurable_configs:</div><div class='add'>+                    dv = self.default_values.get(k, "")</div><div class='add'>+                    cnf[k] = {</div><div class='add'>+                        "value": self.get(k),</div><div class='add'>+                        "default": dv,</div><div class='add'>+                        "configurable": True,</div><div class='add'>+                        "modified": False if dv == "" else True</div><div class='add'>+                    }</div><div class='add'>+            return cnf</div><div class='add'>+</div><div class='add'>+        # Show all configs including defaults</div><div class='add'>+        for k, v in self.gconf.items():</div><div class='add'>+            configurable = False if k in self.non_configurable_configs \</div><div class='add'>+                           else True</div><div class='add'>+            dv = self.default_values.get(k, "")</div><div class='add'>+            modified = False if dv == "" else True</div><div class='add'>+            if show_non_configurable:</div><div class='add'>+                cnf[k] = {</div><div class='add'>+                    "value": v,</div><div class='add'>+                    "default": dv,</div><div class='add'>+                    "configurable": configurable,</div><div class='add'>+                    "modified": modified</div><div class='add'>+                }</div><div class='add'>+            else:</div><div class='add'>+                if k not in self.non_configurable_configs:</div><div class='add'>+                    cnf[k] = {</div><div class='add'>+                        "value": v,</div><div class='add'>+                        "default": dv,</div><div class='add'>+                        "configurable": configurable,</div><div class='add'>+                        "modified": modified</div><div class='add'>+                    }</div><div class='add'>+</div><div class='add'>+        return cnf</div><div class='add'>+</div><div class='add'>+    def getr(self, name, default_value=None):</div><div class='add'>+        with self.lock:</div><div class='add'>+            self.reload(with_lock=False)</div><div class='add'>+            return self.get(name, default_value, with_lock=False)</div><div class='add'>+</div><div class='add'>+    def get_help(self, name=None):</div><div class='add'>+        pass</div><div class='add'>+</div><div class='add'>+    def _is_configurable(self, name):</div><div class='add'>+        item = self.gconfdata.get(name, None)</div><div class='add'>+        if item is None:</div><div class='add'>+            return False</div><div class='add'>+</div><div class='add'>+        return item.get("configurable", True)</div><div class='add'>+</div><div class='add'>+    def _is_valid_value(self, name, value):</div><div class='add'>+        item = self.gconfdata.get(name, None)</div><div class='add'>+        if item is None:</div><div class='add'>+            return False</div><div class='add'>+</div><div class='add'>+        # If validation func not defined</div><div class='add'>+        if item.get("validation", None) is None:</div><div class='add'>+            return True</div><div class='add'>+</div><div class='add'>+        # minmax validation</div><div class='add'>+        if item["validation"] == "minmax":</div><div class='add'>+            return validate_minmax(value, item["min"], item["max"])</div><div class='add'>+</div><div class='add'>+        if item["validation"] == "choice":</div><div class='add'>+            return validate_choice(value, item["allowed_values"])</div><div class='add'>+</div><div class='add'>+        if item["validation"] == "bool":</div><div class='add'>+            return validate_bool(value)</div><div class='add'>+</div><div class='add'>+        if item["validation"] == "execpath":</div><div class='add'>+            return validate_execpath(value)</div><div class='add'>+</div><div class='add'>+        if item["validation"] == "unixtime":</div><div class='add'>+            return validate_unixtime(value)</div><div class='add'>+</div><div class='add'>+        if item["validation"] == "int":</div><div class='add'>+            return validate_int(value)</div><div class='add'>+</div><div class='add'>+        return False</div><div class='add'>+</div><div class='add'>+    def _is_config_changed(self):</div><div class='add'>+        if self.custom_conf_file is not None and \</div><div class='add'>+           os.path.exists(self.custom_conf_file):</div><div class='add'>+                st = os.lstat(self.custom_conf_file)</div><div class='add'>+                if st.st_mtime &gt; self.prev_mtime:</div><div class='add'>+                    self.prev_mtime = st.st_mtime</div><div class='add'>+                    return True</div><div class='add'>+</div><div class='add'>+        return False</div><div class='add'>+</div><div class='add'>+def is_config_file_old(config_file, mastervol, slavevol):</div><div class='add'>+    cnf = RawConfigParser()</div><div class='add'>+    cnf.read(config_file)</div><div class='add'>+    session_section = "peers %s %s" % (mastervol, slavevol)</div><div class='add'>+    try:</div><div class='add'>+        return dict(cnf.items(session_section))</div><div class='add'>+    except NoSectionError:</div><div class='add'>+        return None</div><div class='add'>+</div><div class='add'>+def config_upgrade(config_file, ret):</div><div class='add'>+    config_file_backup = os.path.join(os.path.dirname(config_file), "gsyncd.conf.bkp")</div><div class='add'>+</div><div class='add'>+    #copy old config file in a backup file</div><div class='add'>+    shutil.copyfile(config_file, config_file_backup)</div><div class='add'>+</div><div class='add'>+    #write a new config file</div><div class='add'>+    config = RawConfigParser()</div><div class='add'>+    config.add_section('vars')</div><div class='add'>+</div><div class='add'>+    for key, value in ret.items():</div><div class='add'>+        #handle option name changes</div><div class='add'>+        if key == "use_tarssh":</div><div class='add'>+            new_key = "sync-method"</div><div class='add'>+            if value == "true":</div><div class='add'>+                new_value = "tarssh"</div><div class='add'>+            else:</div><div class='add'>+                new_value = "rsync"</div><div class='add'>+            config.set('vars', new_key, new_value)</div><div class='add'>+        elif key == "timeout":</div><div class='add'>+            new_key = "slave-timeout"</div><div class='add'>+            config.set('vars', new_key, value)</div><div class='add'>+        #for changes like: ignore_deletes to ignore-deletes</div><div class='add'>+        else:</div><div class='add'>+            new_key = key.replace("_", "-")</div><div class='add'>+            config.set('vars', new_key, value)</div><div class='add'>+</div><div class='add'>+    with open(config_file, 'w') as configfile:</div><div class='add'>+        config.write(configfile)</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def validate_int(value):</div><div class='add'>+    try:</div><div class='add'>+        _ = int(value)</div><div class='add'>+        return True</div><div class='add'>+    except ValueError:</div><div class='add'>+        return False</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def validate_unixtime(value):</div><div class='add'>+    try:</div><div class='add'>+        y = datetime.fromtimestamp(int(value)).strftime("%Y")</div><div class='add'>+        if y == "1970":</div><div class='add'>+            return False</div><div class='add'>+</div><div class='add'>+        return True</div><div class='add'>+    except ValueError:</div><div class='add'>+        return False</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def validate_minmax(value, minval, maxval):</div><div class='add'>+    try:</div><div class='add'>+        value = int(value)</div><div class='add'>+        minval = int(minval)</div><div class='add'>+        maxval = int(maxval)</div><div class='add'>+        return value &gt;= minval and value &lt;= maxval</div><div class='add'>+    except ValueError:</div><div class='add'>+        return False</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def validate_choice(value, allowed_values):</div><div class='add'>+    allowed_values = allowed_values.split(",")</div><div class='add'>+    allowed_values = [v.strip() for v in allowed_values]</div><div class='add'>+</div><div class='add'>+    return value in allowed_values</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def validate_bool(value):</div><div class='add'>+    return value in ["true", "false"]</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def validate_execpath(value):</div><div class='add'>+    return os.path.isfile(value) and os.access(value, os.X_OK)</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def validate_filepath(value):</div><div class='add'>+    return os.path.isfile(value)</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def validate_path(value):</div><div class='add'>+    return os.path.exists(value)</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def to_int(value):</div><div class='add'>+    return int(value)</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def to_float(value):</div><div class='add'>+    return float(value)</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def to_bool(value):</div><div class='add'>+    if isinstance(value, bool):</div><div class='add'>+        return value</div><div class='add'>+    return True if value in ["true", "True"] else False</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def get(name, default_value=None):</div><div class='add'>+    return _gconf.get(name, default_value)</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def getall(show_defaults=False, show_non_configurable=False):</div><div class='add'>+    return _gconf.getall(show_defaults=show_defaults,</div><div class='add'>+                         show_non_configurable=show_non_configurable)</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def getr(name, default_value=None):</div><div class='add'>+    return _gconf.getr(name, default_value)</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def load(default_conf, custom_conf=None, args={}, extra_tmpl_args={},</div><div class='add'>+         override_from_args=False):</div><div class='add'>+    global _gconf</div><div class='add'>+    _gconf = Gconf(default_conf, custom_conf, args, extra_tmpl_args,</div><div class='add'>+                   override_from_args)</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def setconfig(name, value):</div><div class='add'>+    global _gconf</div><div class='add'>+    _gconf.set(name, value)</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def resetconfig(name):</div><div class='add'>+    global _gconf</div><div class='add'>+    _gconf.reset(name)</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def check(name, value=None, with_conffile=True):</div><div class='add'>+    global _gconf</div><div class='add'>+    _gconf.check(name, value=value, with_conffile=with_conffile)</div><div class='head'>diff --git a/geo-replication/syncdaemon/gsyncdstatus.py b/geo-replication/syncdaemon/gsyncdstatus.py<br/>new file mode 100644<br/>index 00000000000..1a655ff8887<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/geo-replication/syncdaemon/gsyncdstatus.py?id=d1d7a6f35c816822fab51c820e25023863c239c1'>geo-replication/syncdaemon/gsyncdstatus.py</a></div><div class='hunk'>@@ -0,0 +1,419 @@</div><div class='add'>+#!/usr/bin/python3</div><div class='add'>+#</div><div class='add'>+# Copyright (c) 2011-2014 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+# This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+# This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+# General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+# later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+# cases as published by the Free Software Foundation.</div><div class='add'>+#</div><div class='add'>+</div><div class='add'>+from __future__ import print_function</div><div class='add'>+import fcntl</div><div class='add'>+import os</div><div class='add'>+import tempfile</div><div class='add'>+try:</div><div class='add'>+    import urllib.parse as urllib</div><div class='add'>+except ImportError:</div><div class='add'>+    import urllib</div><div class='add'>+import json</div><div class='add'>+import time</div><div class='add'>+from datetime import datetime</div><div class='add'>+from errno import EACCES, EAGAIN, ENOENT</div><div class='add'>+import logging</div><div class='add'>+</div><div class='add'>+from syncdutils import (EVENT_GEOREP_ACTIVE, EVENT_GEOREP_PASSIVE, gf_event,</div><div class='add'>+                        EVENT_GEOREP_CHECKPOINT_COMPLETED, lf)</div><div class='add'>+</div><div class='add'>+DEFAULT_STATUS = "N/A"</div><div class='add'>+MONITOR_STATUS = ("Created", "Started", "Paused", "Stopped")</div><div class='add'>+STATUS_VALUES = (DEFAULT_STATUS,</div><div class='add'>+                 "Initializing...",</div><div class='add'>+                 "Active",</div><div class='add'>+                 "Passive",</div><div class='add'>+                 "Faulty")</div><div class='add'>+</div><div class='add'>+CRAWL_STATUS_VALUES = (DEFAULT_STATUS,</div><div class='add'>+                       "Hybrid Crawl",</div><div class='add'>+                       "History Crawl",</div><div class='add'>+                       "Changelog Crawl")</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def human_time(ts):</div><div class='add'>+    try:</div><div class='add'>+        return datetime.fromtimestamp(float(ts)).strftime("%Y-%m-%d %H:%M:%S")</div><div class='add'>+    except ValueError:</div><div class='add'>+        return DEFAULT_STATUS</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def human_time_utc(ts):</div><div class='add'>+    try:</div><div class='add'>+        return datetime.utcfromtimestamp(</div><div class='add'>+            float(ts)).strftime("%Y-%m-%d %H:%M:%S")</div><div class='add'>+    except ValueError:</div><div class='add'>+        return DEFAULT_STATUS</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def get_default_values():</div><div class='add'>+    return {</div><div class='add'>+        "slave_node": DEFAULT_STATUS,</div><div class='add'>+        "worker_status": DEFAULT_STATUS,</div><div class='add'>+        "last_synced": 0,</div><div class='add'>+        "last_synced_entry": 0,</div><div class='add'>+        "crawl_status": DEFAULT_STATUS,</div><div class='add'>+        "entry": 0,</div><div class='add'>+        "data": 0,</div><div class='add'>+        "meta": 0,</div><div class='add'>+        "failures": 0,</div><div class='add'>+        "checkpoint_completed": DEFAULT_STATUS,</div><div class='add'>+        "checkpoint_time": 0,</div><div class='add'>+        "checkpoint_completion_time": 0}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+class LockedOpen(object):</div><div class='add'>+</div><div class='add'>+    def __init__(self, filename, *args, **kwargs):</div><div class='add'>+        self.filename = filename</div><div class='add'>+        self.open_args = args</div><div class='add'>+        self.open_kwargs = kwargs</div><div class='add'>+        self.fileobj = None</div><div class='add'>+</div><div class='add'>+    def __enter__(self):</div><div class='add'>+        """</div><div class='add'>+        If two processes compete to update a file, The first process</div><div class='add'>+        gets the lock and the second process is blocked in the fcntl.flock()</div><div class='add'>+        call. When first process replaces the file and releases the lock,</div><div class='add'>+        the already open file descriptor in the second process now points</div><div class='add'>+        to a  "ghost" file(not reachable by any path name) with old contents.</div><div class='add'>+        To avoid that conflict, check the fd already opened is same or</div><div class='add'>+        not. Open new one if not same</div><div class='add'>+        """</div><div class='add'>+        f = open(self.filename, *self.open_args, **self.open_kwargs)</div><div class='add'>+        while True:</div><div class='add'>+            fcntl.flock(f, fcntl.LOCK_EX)</div><div class='add'>+            fnew = open(self.filename, *self.open_args, **self.open_kwargs)</div><div class='add'>+            if os.path.sameopenfile(f.fileno(), fnew.fileno()):</div><div class='add'>+                fnew.close()</div><div class='add'>+                break</div><div class='add'>+            else:</div><div class='add'>+                f.close()</div><div class='add'>+                f = fnew</div><div class='add'>+        self.fileobj = f</div><div class='add'>+        return f</div><div class='add'>+</div><div class='add'>+    def __exit__(self, _exc_type, _exc_value, _traceback):</div><div class='add'>+        fcntl.flock(self.fileobj, fcntl.LOCK_UN)</div><div class='add'>+        self.fileobj.close()</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def set_monitor_status(status_file, status):</div><div class='add'>+    fd = os.open(status_file, os.O_CREAT | os.O_RDWR)</div><div class='add'>+    os.close(fd)</div><div class='add'>+    with LockedOpen(status_file, 'r+'):</div><div class='add'>+        with tempfile.NamedTemporaryFile('w', dir=os.path.dirname(status_file),</div><div class='add'>+                                         delete=False) as tf:</div><div class='add'>+            tf.write(status)</div><div class='add'>+            tempname = tf.name</div><div class='add'>+</div><div class='add'>+        os.rename(tempname, status_file)</div><div class='add'>+        dirfd = os.open(os.path.dirname(os.path.abspath(status_file)),</div><div class='add'>+                        os.O_DIRECTORY)</div><div class='add'>+        os.fsync(dirfd)</div><div class='add'>+        os.close(dirfd)</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+class GeorepStatus(object):</div><div class='add'>+    def __init__(self, monitor_status_file, master_node, brick, master_node_id,</div><div class='add'>+                 master, slave, monitor_pid_file=None):</div><div class='add'>+        self.master = master</div><div class='add'>+        slv_data = slave.split("::")</div><div class='add'>+        self.slave_host = slv_data[0]</div><div class='add'>+        self.slave_volume = slv_data[1].split(":")[0]  # Remove Slave UUID</div><div class='add'>+        self.work_dir = os.path.dirname(monitor_status_file)</div><div class='add'>+        self.monitor_status_file = monitor_status_file</div><div class='add'>+        self.filename = os.path.join(self.work_dir,</div><div class='add'>+                                     "brick_%s.status"</div><div class='add'>+                                     % urllib.quote_plus(brick))</div><div class='add'>+</div><div class='add'>+        fd = os.open(self.filename, os.O_CREAT | os.O_RDWR)</div><div class='add'>+        os.close(fd)</div><div class='add'>+        fd = os.open(self.monitor_status_file, os.O_CREAT | os.O_RDWR)</div><div class='add'>+        os.close(fd)</div><div class='add'>+        self.master_node = master_node</div><div class='add'>+        self.master_node_id = master_node_id</div><div class='add'>+        self.brick = brick</div><div class='add'>+        self.default_values = get_default_values()</div><div class='add'>+        self.monitor_pid_file = monitor_pid_file</div><div class='add'>+</div><div class='add'>+    def send_event(self, event_type, **kwargs):</div><div class='add'>+        gf_event(event_type,</div><div class='add'>+                 master_volume=self.master,</div><div class='add'>+                 master_node=self.master_node,</div><div class='add'>+                 master_node_id=self.master_node_id,</div><div class='add'>+                 slave_host=self.slave_host,</div><div class='add'>+                 slave_volume=self.slave_volume,</div><div class='add'>+                 brick_path=self.brick,</div><div class='add'>+                 **kwargs)</div><div class='add'>+</div><div class='add'>+    def _update(self, mergerfunc):</div><div class='add'>+        data = self.default_values</div><div class='add'>+        with LockedOpen(self.filename, 'r+') as f:</div><div class='add'>+            try:</div><div class='add'>+                data.update(json.load(f))</div><div class='add'>+            except ValueError:</div><div class='add'>+                pass</div><div class='add'>+</div><div class='add'>+            data = mergerfunc(data)</div><div class='add'>+            # If Data is not changed by merger func</div><div class='add'>+            if not data:</div><div class='add'>+                return False</div><div class='add'>+</div><div class='add'>+            with tempfile.NamedTemporaryFile(</div><div class='add'>+                    'w',</div><div class='add'>+                    dir=os.path.dirname(self.filename),</div><div class='add'>+                    delete=False) as tf:</div><div class='add'>+                tf.write(data)</div><div class='add'>+                tempname = tf.name</div><div class='add'>+</div><div class='add'>+            os.rename(tempname, self.filename)</div><div class='add'>+            dirfd = os.open(os.path.dirname(os.path.abspath(self.filename)),</div><div class='add'>+                            os.O_DIRECTORY)</div><div class='add'>+            os.fsync(dirfd)</div><div class='add'>+            os.close(dirfd)</div><div class='add'>+            return True</div><div class='add'>+</div><div class='add'>+    def reset_on_worker_start(self):</div><div class='add'>+        def merger(data):</div><div class='add'>+            data["slave_node"] = DEFAULT_STATUS</div><div class='add'>+            data["crawl_status"] = DEFAULT_STATUS</div><div class='add'>+            data["entry"] = 0</div><div class='add'>+            data["data"] = 0</div><div class='add'>+            data["meta"] = 0</div><div class='add'>+            return json.dumps(data)</div><div class='add'>+</div><div class='add'>+        self._update(merger)</div><div class='add'>+</div><div class='add'>+    def set_field(self, key, value):</div><div class='add'>+        def merger(data):</div><div class='add'>+            # Current data and prev data is same</div><div class='add'>+            if data[key] == value:</div><div class='add'>+                return {}</div><div class='add'>+</div><div class='add'>+            data[key] = value</div><div class='add'>+            return json.dumps(data)</div><div class='add'>+</div><div class='add'>+        return self._update(merger)</div><div class='add'>+</div><div class='add'>+    def trigger_gf_event_checkpoint_completion(self, checkpoint_time,</div><div class='add'>+                                               checkpoint_completion_time):</div><div class='add'>+        self.send_event(EVENT_GEOREP_CHECKPOINT_COMPLETED,</div><div class='add'>+                        checkpoint_time=checkpoint_time,</div><div class='add'>+                        checkpoint_completion_time=checkpoint_completion_time)</div><div class='add'>+</div><div class='add'>+    def set_last_synced(self, value, checkpoint_time):</div><div class='add'>+        def merger(data):</div><div class='add'>+            data["last_synced"] = value[0]</div><div class='add'>+</div><div class='add'>+            # If checkpoint is not set or reset</div><div class='add'>+            # or if last set checkpoint is changed</div><div class='add'>+            if checkpoint_time == 0 or \</div><div class='add'>+               checkpoint_time != data["checkpoint_time"]:</div><div class='add'>+                data["checkpoint_time"] = 0</div><div class='add'>+                data["checkpoint_completion_time"] = 0</div><div class='add'>+                data["checkpoint_completed"] = "No"</div><div class='add'>+</div><div class='add'>+            # If checkpoint is completed and not marked as completed</div><div class='add'>+            # previously then update the checkpoint completed time</div><div class='add'>+            if checkpoint_time &gt; 0 and checkpoint_time &lt;= value[0]:</div><div class='add'>+                if data["checkpoint_completed"] == "No":</div><div class='add'>+                    curr_time = int(time.time())</div><div class='add'>+                    data["checkpoint_time"] = checkpoint_time</div><div class='add'>+                    data["checkpoint_completion_time"] = curr_time</div><div class='add'>+                    data["checkpoint_completed"] = "Yes"</div><div class='add'>+                    logging.info(lf("Checkpoint completed",</div><div class='add'>+                                    checkpoint_time=human_time_utc(</div><div class='add'>+                                        checkpoint_time),</div><div class='add'>+                                    completion_time=human_time_utc(curr_time)))</div><div class='add'>+                    self.trigger_gf_event_checkpoint_completion(</div><div class='add'>+                        checkpoint_time, curr_time)</div><div class='add'>+</div><div class='add'>+            return json.dumps(data)</div><div class='add'>+</div><div class='add'>+        self._update(merger)</div><div class='add'>+</div><div class='add'>+    def set_worker_status(self, status):</div><div class='add'>+        if self.set_field("worker_status", status):</div><div class='add'>+            logging.info(lf("Worker Status Change",</div><div class='add'>+                            status=status))</div><div class='add'>+</div><div class='add'>+    def set_worker_crawl_status(self, status):</div><div class='add'>+        if self.set_field("crawl_status", status):</div><div class='add'>+            logging.info(lf("Crawl Status Change",</div><div class='add'>+                            status=status))</div><div class='add'>+</div><div class='add'>+    def set_slave_node(self, slave_node):</div><div class='add'>+        def merger(data):</div><div class='add'>+            data["slave_node"] = slave_node</div><div class='add'>+            return json.dumps(data)</div><div class='add'>+</div><div class='add'>+        self._update(merger)</div><div class='add'>+</div><div class='add'>+    def inc_value(self, key, value):</div><div class='add'>+        def merger(data):</div><div class='add'>+            data[key] = data.get(key, 0) + value</div><div class='add'>+            return json.dumps(data)</div><div class='add'>+</div><div class='add'>+        self._update(merger)</div><div class='add'>+</div><div class='add'>+    def dec_value(self, key, value):</div><div class='add'>+        def merger(data):</div><div class='add'>+            data[key] = data.get(key, 0) - value</div><div class='add'>+            if data[key] &lt; 0:</div><div class='add'>+                data[key] = 0</div><div class='add'>+            return json.dumps(data)</div><div class='add'>+</div><div class='add'>+        self._update(merger)</div><div class='add'>+</div><div class='add'>+    def set_active(self):</div><div class='add'>+        if self.set_field("worker_status", "Active"):</div><div class='add'>+            logging.info(lf("Worker Status Change",</div><div class='add'>+                            status="Active"))</div><div class='add'>+            self.send_event(EVENT_GEOREP_ACTIVE)</div><div class='add'>+</div><div class='add'>+    def set_passive(self):</div><div class='add'>+        if self.set_field("worker_status", "Passive"):</div><div class='add'>+            logging.info(lf("Worker Status Change",</div><div class='add'>+                            status="Passive"))</div><div class='add'>+            self.send_event(EVENT_GEOREP_PASSIVE)</div><div class='add'>+</div><div class='add'>+    def get_monitor_status(self):</div><div class='add'>+        data = ""</div><div class='add'>+        with open(self.monitor_status_file, "r") as f:</div><div class='add'>+            data = f.read().strip()</div><div class='add'>+        return data</div><div class='add'>+</div><div class='add'>+    def get_status(self, checkpoint_time=0):</div><div class='add'>+        """</div><div class='add'>+        Monitor Status ---&gt;        Created    Started  Paused      Stopped</div><div class='add'>+        ----------------------------------------------------------------------</div><div class='add'>+        slave_node                 N/A        VALUE    VALUE       N/A</div><div class='add'>+        status                     Created    VALUE    Paused      Stopped</div><div class='add'>+        last_synced                N/A        VALUE    VALUE       VALUE</div><div class='add'>+        last_synced_entry          N/A        VALUE    VALUE       VALUE</div><div class='add'>+        crawl_status               N/A        VALUE    N/A         N/A</div><div class='add'>+        entry                      N/A        VALUE    N/A         N/A</div><div class='add'>+        data                       N/A        VALUE    N/A         N/A</div><div class='add'>+        meta                       N/A        VALUE    N/A         N/A</div><div class='add'>+        failures                   N/A        VALUE    VALUE       VALUE</div><div class='add'>+        checkpoint_completed       N/A        VALUE    VALUE       VALUE</div><div class='add'>+        checkpoint_time            N/A        VALUE    VALUE       VALUE</div><div class='add'>+        checkpoint_completed_time  N/A        VALUE    VALUE       VALUE</div><div class='add'>+        """</div><div class='add'>+        data = self.default_values</div><div class='add'>+        with open(self.filename) as f:</div><div class='add'>+            try:</div><div class='add'>+                data.update(json.load(f))</div><div class='add'>+            except ValueError:</div><div class='add'>+                pass</div><div class='add'>+        monitor_status = self.get_monitor_status()</div><div class='add'>+</div><div class='add'>+        # Verifying whether monitor process running and adjusting status</div><div class='add'>+        if monitor_status in ["Started", "Paused"]:</div><div class='add'>+            try:</div><div class='add'>+                with open(self.monitor_pid_file, "r+") as f:</div><div class='add'>+                    fcntl.lockf(f, fcntl.LOCK_EX | fcntl.LOCK_NB)</div><div class='add'>+                    monitor_status = "Stopped"</div><div class='add'>+            except (IOError, OSError) as e:</div><div class='add'>+                # If pid file not exists, either monitor died or Geo-rep</div><div class='add'>+                # not even started once</div><div class='add'>+                if e.errno == ENOENT:</div><div class='add'>+                    monitor_status = "Stopped"</div><div class='add'>+                elif e.errno in (EACCES, EAGAIN):</div><div class='add'>+                    # cannot grab. so, monitor process still running..move on</div><div class='add'>+                    pass</div><div class='add'>+                else:</div><div class='add'>+                    raise</div><div class='add'>+</div><div class='add'>+        if monitor_status in ["Created", "Paused", "Stopped"]:</div><div class='add'>+            data["worker_status"] = monitor_status</div><div class='add'>+</div><div class='add'>+        if monitor_status == "":</div><div class='add'>+            data["worker_status"] = "Stopped"</div><div class='add'>+</div><div class='add'>+        # Checkpoint adjustments</div><div class='add'>+        if checkpoint_time == 0:</div><div class='add'>+            data["checkpoint_completed"] = DEFAULT_STATUS</div><div class='add'>+            data["checkpoint_time"] = DEFAULT_STATUS</div><div class='add'>+            data["checkpoint_completion_time"] = DEFAULT_STATUS</div><div class='add'>+        else:</div><div class='add'>+            if checkpoint_time != data["checkpoint_time"]:</div><div class='add'>+                if checkpoint_time &lt;= data["last_synced"]:</div><div class='add'>+                    data["checkpoint_completed"] = "Yes"</div><div class='add'>+                    data["checkpoint_time"] = checkpoint_time</div><div class='add'>+                    data["checkpoint_completion_time"] = data["last_synced"]</div><div class='add'>+                else:</div><div class='add'>+                    data["checkpoint_completed"] = "No"</div><div class='add'>+                    data["checkpoint_time"] = checkpoint_time</div><div class='add'>+                    data["checkpoint_completion_time"] = DEFAULT_STATUS</div><div class='add'>+</div><div class='add'>+        if data["checkpoint_time"] not in [0, DEFAULT_STATUS]:</div><div class='add'>+            chkpt_time = data["checkpoint_time"]</div><div class='add'>+            data["checkpoint_time"] = human_time(chkpt_time)</div><div class='add'>+            data["checkpoint_time_utc"] = human_time_utc(chkpt_time)</div><div class='add'>+</div><div class='add'>+        if data["checkpoint_completion_time"] not in [0, DEFAULT_STATUS]:</div><div class='add'>+            chkpt_completion_time = data["checkpoint_completion_time"]</div><div class='add'>+            data["checkpoint_completion_time"] = human_time(</div><div class='add'>+                chkpt_completion_time)</div><div class='add'>+            data["checkpoint_completion_time_utc"] = human_time_utc(</div><div class='add'>+                chkpt_completion_time)</div><div class='add'>+</div><div class='add'>+        if data["last_synced"] == 0:</div><div class='add'>+            data["last_synced"] = DEFAULT_STATUS</div><div class='add'>+            data["last_synced_utc"] = DEFAULT_STATUS</div><div class='add'>+        else:</div><div class='add'>+            last_synced = data["last_synced"]</div><div class='add'>+            data["last_synced"] = human_time(last_synced)</div><div class='add'>+            data["last_synced_utc"] = human_time_utc(last_synced)</div><div class='add'>+</div><div class='add'>+        if data["worker_status"] != "Active":</div><div class='add'>+            data["last_synced"] = DEFAULT_STATUS</div><div class='add'>+            data["last_synced_utc"] = DEFAULT_STATUS</div><div class='add'>+            data["crawl_status"] = DEFAULT_STATUS</div><div class='add'>+            data["entry"] = DEFAULT_STATUS</div><div class='add'>+            data["data"] = DEFAULT_STATUS</div><div class='add'>+            data["meta"] = DEFAULT_STATUS</div><div class='add'>+            data["failures"] = DEFAULT_STATUS</div><div class='add'>+            data["checkpoint_completed"] = DEFAULT_STATUS</div><div class='add'>+            data["checkpoint_time"] = DEFAULT_STATUS</div><div class='add'>+            data["checkpoint_completed_time"] = DEFAULT_STATUS</div><div class='add'>+            data["checkpoint_time_utc"] = DEFAULT_STATUS</div><div class='add'>+            data["checkpoint_completion_time_utc"] = DEFAULT_STATUS</div><div class='add'>+</div><div class='add'>+        if data["worker_status"] not in ["Active", "Passive"]:</div><div class='add'>+            data["slave_node"] = DEFAULT_STATUS</div><div class='add'>+</div><div class='add'>+        if data.get("last_synced_utc", 0) == 0:</div><div class='add'>+            data["last_synced_utc"] = DEFAULT_STATUS</div><div class='add'>+</div><div class='add'>+        if data.get("checkpoint_completion_time_utc", 0) == 0:</div><div class='add'>+            data["checkpoint_completion_time_utc"] = DEFAULT_STATUS</div><div class='add'>+</div><div class='add'>+        if data.get("checkpoint_time_utc", 0) == 0:</div><div class='add'>+            data["checkpoint_time_utc"] = DEFAULT_STATUS</div><div class='add'>+</div><div class='add'>+        return data</div><div class='add'>+</div><div class='add'>+    def print_status(self, checkpoint_time=0, json_output=False):</div><div class='add'>+        status_out = self.get_status(checkpoint_time)</div><div class='add'>+        if json_output:</div><div class='add'>+            out = {}</div><div class='add'>+            # Convert all values as string</div><div class='add'>+            for k, v in status_out.items():</div><div class='add'>+                out[k] = str(v)</div><div class='add'>+            print(json.dumps(out))</div><div class='add'>+            return</div><div class='add'>+</div><div class='add'>+        for key, value in status_out.items():</div><div class='add'>+            print(("%s: %s" % (key, value)))</div><div class='head'>diff --git a/geo-replication/syncdaemon/libcxattr.py b/geo-replication/syncdaemon/libcxattr.py<br/>new file mode 100644<br/>index 00000000000..e6406c36bd7<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/geo-replication/syncdaemon/libcxattr.py?id=d1d7a6f35c816822fab51c820e25023863c239c1'>geo-replication/syncdaemon/libcxattr.py</a></div><div class='hunk'>@@ -0,0 +1,112 @@</div><div class='add'>+#</div><div class='add'>+# Copyright (c) 2011-2014 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+# This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+# This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+# General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+# later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+# cases as published by the Free Software Foundation.</div><div class='add'>+#</div><div class='add'>+</div><div class='add'>+import os</div><div class='add'>+from ctypes import CDLL, get_errno</div><div class='add'>+from py2py3 import (bytearray_to_str, gr_create_string_buffer,</div><div class='add'>+                    gr_query_xattr, gr_lsetxattr, gr_lremovexattr)</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+class Xattr(object):</div><div class='add'>+</div><div class='add'>+    """singleton that wraps the extended attributes system</div><div class='add'>+       interface for python using ctypes</div><div class='add'>+</div><div class='add'>+       Just implement it to the degree we need it, in particular</div><div class='add'>+       - we need just the l*xattr variants, ie. we never want symlinks to be</div><div class='add'>+         followed</div><div class='add'>+       - don't need size discovery for getxattr, as we always know the exact</div><div class='add'>+         sizes we expect</div><div class='add'>+    """</div><div class='add'>+</div><div class='add'>+    libc = CDLL("libc.so.6", use_errno=True)</div><div class='add'>+</div><div class='add'>+    @classmethod</div><div class='add'>+    def geterrno(cls):</div><div class='add'>+        return get_errno()</div><div class='add'>+</div><div class='add'>+    @classmethod</div><div class='add'>+    def raise_oserr(cls):</div><div class='add'>+        errn = cls.geterrno()</div><div class='add'>+        raise OSError(errn, os.strerror(errn))</div><div class='add'>+</div><div class='add'>+    @classmethod</div><div class='add'>+    def _query_xattr(cls, path, siz, syscall, *a):</div><div class='add'>+        if siz:</div><div class='add'>+            buf = gr_create_string_buffer(siz)</div><div class='add'>+        else:</div><div class='add'>+            buf = None</div><div class='add'>+        ret = getattr(cls.libc, syscall)(*((path,) + a + (buf, siz)))</div><div class='add'>+        if ret == -1:</div><div class='add'>+            cls.raise_oserr()</div><div class='add'>+        if siz:</div><div class='add'>+            # py2 and py3 compatibility. Convert bytes array</div><div class='add'>+            # to string</div><div class='add'>+            result = bytearray_to_str(buf.raw)</div><div class='add'>+            return result[:ret]</div><div class='add'>+        else:</div><div class='add'>+            return ret</div><div class='add'>+</div><div class='add'>+    @classmethod</div><div class='add'>+    def lgetxattr(cls, path, attr, siz=0):</div><div class='add'>+        return gr_query_xattr(cls, path, siz, 'lgetxattr', attr)</div><div class='add'>+</div><div class='add'>+    @classmethod</div><div class='add'>+    def lgetxattr_buf(cls, path, attr):</div><div class='add'>+        """lgetxattr variant with size discovery"""</div><div class='add'>+        size = cls.lgetxattr(path, attr)</div><div class='add'>+        if size == -1:</div><div class='add'>+            cls.raise_oserr()</div><div class='add'>+        if size == 0:</div><div class='add'>+            return ''</div><div class='add'>+        return cls.lgetxattr(path, attr, size)</div><div class='add'>+</div><div class='add'>+    @classmethod</div><div class='add'>+    def llistxattr(cls, path, siz=0):</div><div class='add'>+        ret = gr_query_xattr(cls, path, siz, 'llistxattr')</div><div class='add'>+        if isinstance(ret, str):</div><div class='add'>+            ret = ret.strip('\0')</div><div class='add'>+            ret = ret.split('\0') if ret else []</div><div class='add'>+        return ret</div><div class='add'>+</div><div class='add'>+    @classmethod</div><div class='add'>+    def lsetxattr(cls, path, attr, val):</div><div class='add'>+        ret = gr_lsetxattr(cls, path, attr, val)</div><div class='add'>+        if ret == -1:</div><div class='add'>+            cls.raise_oserr()</div><div class='add'>+</div><div class='add'>+    @classmethod</div><div class='add'>+    def lremovexattr(cls, path, attr):</div><div class='add'>+        ret = gr_lremovexattr(cls, path, attr)</div><div class='add'>+        if ret == -1:</div><div class='add'>+            cls.raise_oserr()</div><div class='add'>+</div><div class='add'>+    @classmethod</div><div class='add'>+    def llistxattr_buf(cls, path):</div><div class='add'>+        """listxattr variant with size discovery"""</div><div class='add'>+        try:</div><div class='add'>+            # Assuming no more than 100 xattrs in a file/directory and</div><div class='add'>+            # each xattr key length will be less than 256 bytes</div><div class='add'>+            # llistxattr will be called with bigger size so that</div><div class='add'>+            # listxattr will not fail with ERANGE. OSError will be</div><div class='add'>+            # raised if fails even with the large size specified.</div><div class='add'>+            size = 256 * 100</div><div class='add'>+            return cls.llistxattr(path, size)</div><div class='add'>+        except OSError:</div><div class='add'>+            # If fixed length failed for getting list of xattrs then</div><div class='add'>+            # use the llistxattr call to get the size and use that</div><div class='add'>+            # size to get the list of xattrs.</div><div class='add'>+            size = cls.llistxattr(path)</div><div class='add'>+            if size == -1:</div><div class='add'>+                cls.raise_oserr()</div><div class='add'>+            if size == 0:</div><div class='add'>+                return []</div><div class='add'>+</div><div class='add'>+            return cls.llistxattr(path, size)</div><div class='head'>diff --git a/geo-replication/syncdaemon/libgfchangelog.py b/geo-replication/syncdaemon/libgfchangelog.py<br/>new file mode 100644<br/>index 00000000000..a3bda7282c0<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/geo-replication/syncdaemon/libgfchangelog.py?id=d1d7a6f35c816822fab51c820e25023863c239c1'>geo-replication/syncdaemon/libgfchangelog.py</a></div><div class='hunk'>@@ -0,0 +1,143 @@</div><div class='add'>+#</div><div class='add'>+# Copyright (c) 2011-2014 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+# This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+# This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+# General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+# later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+# cases as published by the Free Software Foundation.</div><div class='add'>+#</div><div class='add'>+</div><div class='add'>+import os</div><div class='add'>+from ctypes import CDLL, RTLD_GLOBAL, get_errno, byref, c_ulong</div><div class='add'>+from ctypes.util import find_library</div><div class='add'>+from syncdutils import ChangelogException, ChangelogHistoryNotAvailable</div><div class='add'>+from py2py3 import (gr_cl_history_changelog, gr_cl_done,</div><div class='add'>+                    gr_create_string_buffer, gr_cl_register,</div><div class='add'>+                    gr_cl_history_done, bytearray_to_str)</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+libgfc = CDLL(</div><div class='add'>+    find_library("gfchangelog"),</div><div class='add'>+    mode=RTLD_GLOBAL,</div><div class='add'>+    use_errno=True</div><div class='add'>+)</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def _raise_changelog_err():</div><div class='add'>+    errn = get_errno()</div><div class='add'>+    raise ChangelogException(errn, os.strerror(errn))</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def _init():</div><div class='add'>+    if libgfc.gf_changelog_init(None) == -1:</div><div class='add'>+        _raise_changelog_err()</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def register(brick, path, log_file, log_level, retries=0):</div><div class='add'>+    _init()</div><div class='add'>+</div><div class='add'>+    ret = gr_cl_register(libgfc, brick, path, log_file, log_level, retries)</div><div class='add'>+</div><div class='add'>+    if ret == -1:</div><div class='add'>+        _raise_changelog_err()</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def scan():</div><div class='add'>+    ret = libgfc.gf_changelog_scan()</div><div class='add'>+    if ret == -1:</div><div class='add'>+        _raise_changelog_err()</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def startfresh():</div><div class='add'>+    ret = libgfc.gf_changelog_start_fresh()</div><div class='add'>+    if ret == -1:</div><div class='add'>+        _raise_changelog_err()</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def getchanges():</div><div class='add'>+    def clsort(cfile):</div><div class='add'>+        return cfile.split('.')[-1]</div><div class='add'>+</div><div class='add'>+    changes = []</div><div class='add'>+    buf = gr_create_string_buffer(4096)</div><div class='add'>+    call = libgfc.gf_changelog_next_change</div><div class='add'>+</div><div class='add'>+    while True:</div><div class='add'>+        ret = call(buf, 4096)</div><div class='add'>+        if ret in (0, -1):</div><div class='add'>+            break</div><div class='add'>+</div><div class='add'>+        # py2 and py3 compatibility</div><div class='add'>+        result = bytearray_to_str(buf.raw[:ret - 1])</div><div class='add'>+        changes.append(result)</div><div class='add'>+</div><div class='add'>+    if ret == -1:</div><div class='add'>+        _raise_changelog_err()</div><div class='add'>+</div><div class='add'>+    # cleanup tracker</div><div class='add'>+    startfresh()</div><div class='add'>+</div><div class='add'>+    return sorted(changes, key=clsort)</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def done(clfile):</div><div class='add'>+    ret = gr_cl_done(libgfc, clfile)</div><div class='add'>+    if ret == -1:</div><div class='add'>+        _raise_changelog_err()</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def history_scan():</div><div class='add'>+    ret = libgfc.gf_history_changelog_scan()</div><div class='add'>+    if ret == -1:</div><div class='add'>+        _raise_changelog_err()</div><div class='add'>+</div><div class='add'>+    return ret</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def history_changelog(changelog_path, start, end, num_parallel):</div><div class='add'>+    actual_end = c_ulong()</div><div class='add'>+    ret = gr_cl_history_changelog(libgfc, changelog_path, start, end,</div><div class='add'>+                                  num_parallel, byref(actual_end))</div><div class='add'>+    if ret == -1:</div><div class='add'>+        _raise_changelog_err()</div><div class='add'>+</div><div class='add'>+    if ret == -2:</div><div class='add'>+        raise ChangelogHistoryNotAvailable()</div><div class='add'>+</div><div class='add'>+    return (ret, actual_end.value)</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def history_startfresh():</div><div class='add'>+    ret = libgfc.gf_history_changelog_start_fresh()</div><div class='add'>+    if ret == -1:</div><div class='add'>+        _raise_changelog_err()</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def history_getchanges():</div><div class='add'>+    def clsort(cfile):</div><div class='add'>+        return cfile.split('.')[-1]</div><div class='add'>+</div><div class='add'>+    changes = []</div><div class='add'>+    buf = gr_create_string_buffer(4096)</div><div class='add'>+    call = libgfc.gf_history_changelog_next_change</div><div class='add'>+</div><div class='add'>+    while True:</div><div class='add'>+        ret = call(buf, 4096)</div><div class='add'>+        if ret in (0, -1):</div><div class='add'>+            break</div><div class='add'>+</div><div class='add'>+        # py2 and py3 compatibility</div><div class='add'>+        result = bytearray_to_str(buf.raw[:ret - 1])</div><div class='add'>+        changes.append(result)</div><div class='add'>+</div><div class='add'>+    if ret == -1:</div><div class='add'>+        _raise_changelog_err()</div><div class='add'>+</div><div class='add'>+    return sorted(changes, key=clsort)</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def history_done(clfile):</div><div class='add'>+    ret = gr_cl_history_done(libgfc, clfile)</div><div class='add'>+    if ret == -1:</div><div class='add'>+        _raise_changelog_err()</div><div class='head'>diff --git a/geo-replication/syncdaemon/logutils.py b/geo-replication/syncdaemon/logutils.py<br/>new file mode 100644<br/>index 00000000000..01ae7852f23<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/geo-replication/syncdaemon/logutils.py?id=d1d7a6f35c816822fab51c820e25023863c239c1'>geo-replication/syncdaemon/logutils.py</a></div><div class='hunk'>@@ -0,0 +1,77 @@</div><div class='add'>+# -*- coding: utf-8 -*-</div><div class='add'>+#</div><div class='add'>+#  Copyright (c) 2016 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+#  This file is part of GlusterFS.</div><div class='add'>+#</div><div class='add'>+#  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+#  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+#  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+#  cases as published by the Free Software Foundation.</div><div class='add'>+#</div><div class='add'>+</div><div class='add'>+import logging</div><div class='add'>+from logging import Logger, handlers</div><div class='add'>+import sys</div><div class='add'>+import time</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+class GLogger(Logger):</div><div class='add'>+</div><div class='add'>+    """Logger customizations for gsyncd.</div><div class='add'>+</div><div class='add'>+    It implements a log format similar to that of glusterfs.</div><div class='add'>+    """</div><div class='add'>+</div><div class='add'>+    def makeRecord(self, name, level, *a):</div><div class='add'>+        rv = Logger.makeRecord(self, name, level, *a)</div><div class='add'>+        rv.nsecs = (rv.created - int(rv.created)) * 1000000</div><div class='add'>+        fr = sys._getframe(4)</div><div class='add'>+        callee = fr.f_locals.get('self')</div><div class='add'>+        if callee:</div><div class='add'>+            ctx = str(type(callee)).split("'")[1].split('.')[-1]</div><div class='add'>+        else:</div><div class='add'>+            ctx = '&lt;top&gt;'</div><div class='add'>+        if not hasattr(rv, 'funcName'):</div><div class='add'>+            rv.funcName = fr.f_code.co_name</div><div class='add'>+        rv.lvlnam = logging.getLevelName(level)[0]</div><div class='add'>+        rv.ctx = ctx</div><div class='add'>+        return rv</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+LOGFMT = ("[%(asctime)s.%(nsecs)d] %(lvlnam)s [%(module)s{0}"</div><div class='add'>+          ":%(lineno)s:%(funcName)s] %(ctx)s: %(message)s")</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def setup_logging(level="INFO", label="", log_file=""):</div><div class='add'>+    if label:</div><div class='add'>+        label = "(" + label + ")"</div><div class='add'>+</div><div class='add'>+    filename = None</div><div class='add'>+    stream = None</div><div class='add'>+    if log_file:</div><div class='add'>+        if log_file in ('-', '/dev/stderr'):</div><div class='add'>+            stream = sys.stderr</div><div class='add'>+        elif log_file == '/dev/stdout':</div><div class='add'>+            stream = sys.stdout</div><div class='add'>+        else:</div><div class='add'>+            filename = log_file</div><div class='add'>+</div><div class='add'>+    datefmt = "%Y-%m-%d %H:%M:%S"</div><div class='add'>+    fmt = LOGFMT.format(label)</div><div class='add'>+    logging.root = GLogger("root", level)</div><div class='add'>+    logging.setLoggerClass(GLogger)</div><div class='add'>+    logging.Formatter.converter = time.gmtime  # Log in GMT/UTC time</div><div class='add'>+    logging.getLogger().handlers = []</div><div class='add'>+    logging.getLogger().setLevel(level)</div><div class='add'>+</div><div class='add'>+    if filename is not None:</div><div class='add'>+        logging_handler = handlers.WatchedFileHandler(filename)</div><div class='add'>+        formatter = logging.Formatter(fmt=fmt,</div><div class='add'>+                                      datefmt=datefmt)</div><div class='add'>+        logging_handler.setFormatter(formatter)</div><div class='add'>+        logging.getLogger().addHandler(logging_handler)</div><div class='add'>+    else:</div><div class='add'>+        logging.basicConfig(stream=stream,</div><div class='add'>+                            format=fmt,</div><div class='add'>+                            datefmt=datefmt,</div><div class='add'>+                            level=level)</div><div class='head'>diff --git a/geo-replication/syncdaemon/master.py b/geo-replication/syncdaemon/master.py<br/>new file mode 100644<br/>index 00000000000..9501aeae6b5<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/geo-replication/syncdaemon/master.py?id=d1d7a6f35c816822fab51c820e25023863c239c1'>geo-replication/syncdaemon/master.py</a></div><div class='hunk'>@@ -0,0 +1,2020 @@</div><div class='add'>+#</div><div class='add'>+# Copyright (c) 2011-2014 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+# This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+# This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+# General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+# later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+# cases as published by the Free Software Foundation.</div><div class='add'>+#</div><div class='add'>+</div><div class='add'>+import os</div><div class='add'>+import sys</div><div class='add'>+import time</div><div class='add'>+import stat</div><div class='add'>+import logging</div><div class='add'>+import fcntl</div><div class='add'>+import string</div><div class='add'>+import errno</div><div class='add'>+import tarfile</div><div class='add'>+from errno import ENOENT, ENODATA, EEXIST, EACCES, EAGAIN, ESTALE, EINTR</div><div class='add'>+from threading import Condition, Lock</div><div class='add'>+from datetime import datetime</div><div class='add'>+</div><div class='add'>+import gsyncdconfig as gconf</div><div class='add'>+import libgfchangelog</div><div class='add'>+from rconf import rconf</div><div class='add'>+from syncdutils import (Thread, GsyncdError, escape_space_newline,</div><div class='add'>+                        unescape_space_newline, gauxpfx, escape,</div><div class='add'>+                        lstat, errno_wrap, FreeObject, lf, matching_disk_gfid,</div><div class='add'>+                        NoStimeAvailable, PartialHistoryAvailable,</div><div class='add'>+                        host_brick_split)</div><div class='add'>+</div><div class='add'>+URXTIME = (-1, 0)</div><div class='add'>+</div><div class='add'>+# Default rollover time set in changelog translator</div><div class='add'>+# changelog rollover time is hardcoded here to avoid the</div><div class='add'>+# xsync usage when crawling switch happens from history</div><div class='add'>+# to changelog. If rollover time increased in translator</div><div class='add'>+# then geo-rep can enter into xsync crawl after history</div><div class='add'>+# crawl before starting live changelog crawl.</div><div class='add'>+CHANGELOG_ROLLOVER_TIME = 15</div><div class='add'>+</div><div class='add'>+# Utility functions to help us to get to closer proximity</div><div class='add'>+# of the DRY principle (no, don't look for elevated or</div><div class='add'>+# perspectivistic things here)</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def _xtime_now():</div><div class='add'>+    t = time.time()</div><div class='add'>+    sec = int(t)</div><div class='add'>+    nsec = int((t - sec) * 1000000)</div><div class='add'>+    return (sec, nsec)</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def _volinfo_hook_relax_foreign(self):</div><div class='add'>+    volinfo_sys = self.get_sys_volinfo()</div><div class='add'>+    fgn_vi = volinfo_sys[self.KFGN]</div><div class='add'>+    if fgn_vi:</div><div class='add'>+        expiry = fgn_vi['timeout'] - int(time.time()) + 1</div><div class='add'>+        logging.info(lf('foreign volume info found, waiting for expiry',</div><div class='add'>+                        expiry=expiry))</div><div class='add'>+        time.sleep(expiry)</div><div class='add'>+        volinfo_sys = self.get_sys_volinfo()</div><div class='add'>+    return volinfo_sys</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def edct(op, **ed):</div><div class='add'>+    dct = {}</div><div class='add'>+    dct['op'] = op</div><div class='add'>+    # This is used in automatic gfid conflict resolution.</div><div class='add'>+    # When marked True, it's skipped during re-processing.</div><div class='add'>+    dct['skip_entry'] = False</div><div class='add'>+    for k in ed:</div><div class='add'>+        if k == 'stat':</div><div class='add'>+            st = ed[k]</div><div class='add'>+            dst = dct['stat'] = {}</div><div class='add'>+            if st:</div><div class='add'>+                dst['uid'] = st.st_uid</div><div class='add'>+                dst['gid'] = st.st_gid</div><div class='add'>+                dst['mode'] = st.st_mode</div><div class='add'>+                dst['atime'] = st.st_atime</div><div class='add'>+                dst['mtime'] = st.st_mtime</div><div class='add'>+        else:</div><div class='add'>+            dct[k] = ed[k]</div><div class='add'>+    return dct</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+# The API!</div><div class='add'>+</div><div class='add'>+def gmaster_builder(excrawl=None):</div><div class='add'>+    """produce the GMaster class variant corresponding</div><div class='add'>+       to sync mode"""</div><div class='add'>+    this = sys.modules[__name__]</div><div class='add'>+    modemixin = gconf.get("special-sync-mode")</div><div class='add'>+    if not modemixin:</div><div class='add'>+        modemixin = 'normal'</div><div class='add'>+</div><div class='add'>+    if gconf.get("change-detector") == 'xsync':</div><div class='add'>+        changemixin = 'xsync'</div><div class='add'>+    elif excrawl:</div><div class='add'>+        changemixin = excrawl</div><div class='add'>+    else:</div><div class='add'>+        changemixin = gconf.get("change-detector")</div><div class='add'>+</div><div class='add'>+    logging.debug(lf('setting up change detection mode',</div><div class='add'>+                     mode=changemixin))</div><div class='add'>+    modemixin = getattr(this, modemixin.capitalize() + 'Mixin')</div><div class='add'>+    crawlmixin = getattr(this, 'GMaster' + changemixin.capitalize() + 'Mixin')</div><div class='add'>+</div><div class='add'>+    if gconf.get("use-rsync-xattrs"):</div><div class='add'>+        sendmarkmixin = SendmarkRsyncMixin</div><div class='add'>+    else:</div><div class='add'>+        sendmarkmixin = SendmarkNormalMixin</div><div class='add'>+</div><div class='add'>+    if gconf.get("ignore-deletes"):</div><div class='add'>+        purgemixin = PurgeNoopMixin</div><div class='add'>+    else:</div><div class='add'>+        purgemixin = PurgeNormalMixin</div><div class='add'>+</div><div class='add'>+    if gconf.get("sync-method") == "tarssh":</div><div class='add'>+        syncengine = TarSSHEngine</div><div class='add'>+    else:</div><div class='add'>+        syncengine = RsyncEngine</div><div class='add'>+</div><div class='add'>+    class _GMaster(crawlmixin, modemixin, sendmarkmixin,</div><div class='add'>+                   purgemixin, syncengine):</div><div class='add'>+        pass</div><div class='add'>+</div><div class='add'>+    return _GMaster</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+# Mixin classes that implement the data format</div><div class='add'>+# and logic particularities of the certain</div><div class='add'>+# sync modes</div><div class='add'>+</div><div class='add'>+class NormalMixin(object):</div><div class='add'>+</div><div class='add'>+    """normal geo-rep behavior"""</div><div class='add'>+</div><div class='add'>+    minus_infinity = URXTIME</div><div class='add'>+</div><div class='add'>+    # following staticmethods ideally would be</div><div class='add'>+    # methods of an xtime object (in particular,</div><div class='add'>+    # implementing the hooks needed for comparison</div><div class='add'>+    # operators), but at this point we don't yet</div><div class='add'>+    # have a dedicated xtime class</div><div class='add'>+</div><div class='add'>+    @staticmethod</div><div class='add'>+    def serialize_xtime(xt):</div><div class='add'>+        return "%d.%d" % tuple(xt)</div><div class='add'>+</div><div class='add'>+    @staticmethod</div><div class='add'>+    def deserialize_xtime(xt):</div><div class='add'>+        return tuple(int(x) for x in xt.split("."))</div><div class='add'>+</div><div class='add'>+    @staticmethod</div><div class='add'>+    def native_xtime(xt):</div><div class='add'>+        return xt</div><div class='add'>+</div><div class='add'>+    @staticmethod</div><div class='add'>+    def xtime_geq(xt0, xt1):</div><div class='add'>+        return xt0 &gt;= xt1</div><div class='add'>+</div><div class='add'>+    def make_xtime_opts(self, is_master, opts):</div><div class='add'>+        if 'create' not in opts:</div><div class='add'>+            opts['create'] = is_master</div><div class='add'>+        if 'default_xtime' not in opts:</div><div class='add'>+            opts['default_xtime'] = URXTIME</div><div class='add'>+</div><div class='add'>+    def xtime_low(self, rsc, path, **opts):</div><div class='add'>+        if rsc == self.master:</div><div class='add'>+            xt = rsc.server.xtime(path, self.uuid)</div><div class='add'>+        else:</div><div class='add'>+            xt = rsc.server.stime(path, self.uuid)</div><div class='add'>+            if isinstance(xt, int) and xt == ENODATA:</div><div class='add'>+                xt = rsc.server.xtime(path, self.uuid)</div><div class='add'>+                if not isinstance(xt, int):</div><div class='add'>+                    self.slave.server.set_stime(path, self.uuid, xt)</div><div class='add'>+        if isinstance(xt, int) and xt != ENODATA:</div><div class='add'>+            return xt</div><div class='add'>+        if xt == ENODATA or xt &lt; self.volmark:</div><div class='add'>+            if opts['create']:</div><div class='add'>+                xt = _xtime_now()</div><div class='add'>+                rsc.server.aggregated.set_xtime(path, self.uuid, xt)</div><div class='add'>+            else:</div><div class='add'>+                zero_zero = (0, 0)</div><div class='add'>+                if xt != zero_zero:</div><div class='add'>+                    xt = opts['default_xtime']</div><div class='add'>+        return xt</div><div class='add'>+</div><div class='add'>+    def keepalive_payload_hook(self, timo, gap):</div><div class='add'>+        # first grab a reference as self.volinfo</div><div class='add'>+        # can be changed in main thread</div><div class='add'>+        vi = self.volinfo</div><div class='add'>+        if vi:</div><div class='add'>+            # then have a private copy which we can mod</div><div class='add'>+            vi = vi.copy()</div><div class='add'>+            vi['timeout'] = int(time.time()) + timo</div><div class='add'>+        else:</div><div class='add'>+            # send keep-alive more frequently to</div><div class='add'>+            # avoid a delay in announcing our volume info</div><div class='add'>+            # to slave if it becomes established in the</div><div class='add'>+            # meantime</div><div class='add'>+            gap = min(10, gap)</div><div class='add'>+        return (vi, gap)</div><div class='add'>+</div><div class='add'>+    def volinfo_hook(self):</div><div class='add'>+        return self.get_sys_volinfo()</div><div class='add'>+</div><div class='add'>+    def xtime_reversion_hook(self, path, xtl, xtr):</div><div class='add'>+        if xtr &gt; xtl:</div><div class='add'>+            raise GsyncdError("timestamp corruption for " + path)</div><div class='add'>+</div><div class='add'>+    def need_sync(self, e, xte, xtrd):</div><div class='add'>+        return xte &gt; xtrd</div><div class='add'>+</div><div class='add'>+    def set_slave_xtime(self, path, mark):</div><div class='add'>+        self.slave.server.set_stime(path, self.uuid, mark)</div><div class='add'>+        # self.slave.server.set_xtime_remote(path, self.uuid, mark)</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+class PartialMixin(NormalMixin):</div><div class='add'>+</div><div class='add'>+    """a variant tuned towards operation with a master</div><div class='add'>+       that has partial info of the slave (brick typically)"""</div><div class='add'>+</div><div class='add'>+    def xtime_reversion_hook(self, path, xtl, xtr):</div><div class='add'>+        pass</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+class RecoverMixin(NormalMixin):</div><div class='add'>+</div><div class='add'>+    """a variant that differs from normal in terms</div><div class='add'>+       of ignoring non-indexed files"""</div><div class='add'>+</div><div class='add'>+    @staticmethod</div><div class='add'>+    def make_xtime_opts(is_master, opts):</div><div class='add'>+        if 'create' not in opts:</div><div class='add'>+            opts['create'] = False</div><div class='add'>+        if 'default_xtime' not in opts:</div><div class='add'>+            opts['default_xtime'] = URXTIME</div><div class='add'>+</div><div class='add'>+    def keepalive_payload_hook(self, timo, gap):</div><div class='add'>+        return (None, gap)</div><div class='add'>+</div><div class='add'>+    def volinfo_hook(self):</div><div class='add'>+        return _volinfo_hook_relax_foreign(self)</div><div class='add'>+</div><div class='add'>+# Further mixins for certain tunable behaviors</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+class SendmarkNormalMixin(object):</div><div class='add'>+</div><div class='add'>+    def sendmark_regular(self, *a, **kw):</div><div class='add'>+        return self.sendmark(*a, **kw)</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+class SendmarkRsyncMixin(object):</div><div class='add'>+</div><div class='add'>+    def sendmark_regular(self, *a, **kw):</div><div class='add'>+        pass</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+class PurgeNormalMixin(object):</div><div class='add'>+</div><div class='add'>+    def purge_missing(self, path, names):</div><div class='add'>+        self.slave.server.purge(path, names)</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+class PurgeNoopMixin(object):</div><div class='add'>+</div><div class='add'>+    def purge_missing(self, path, names):</div><div class='add'>+        pass</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+class TarSSHEngine(object):</div><div class='add'>+</div><div class='add'>+    """Sync engine that uses tar(1) piped over ssh(1)</div><div class='add'>+       for data transfers. Good for lots of small files.</div><div class='add'>+    """</div><div class='add'>+</div><div class='add'>+    def a_syncdata(self, files):</div><div class='add'>+        logging.debug(lf("Files", files=files))</div><div class='add'>+</div><div class='add'>+        for f in files:</div><div class='add'>+            pb = self.syncer.add(f)</div><div class='add'>+</div><div class='add'>+            def regjob(se, xte, pb):</div><div class='add'>+                rv = pb.wait()</div><div class='add'>+                if rv[0]:</div><div class='add'>+                    logging.debug(lf('synced', file=se))</div><div class='add'>+                    return True</div><div class='add'>+                else:</div><div class='add'>+                    # stat check for file presence</div><div class='add'>+                    st = lstat(se)</div><div class='add'>+                    if isinstance(st, int):</div><div class='add'>+                        # file got unlinked in the interim</div><div class='add'>+                        self.unlinked_gfids.add(se)</div><div class='add'>+                        return True</div><div class='add'>+</div><div class='add'>+            self.add_job(self.FLAT_DIR_HIERARCHY, 'reg', regjob, f, None, pb)</div><div class='add'>+</div><div class='add'>+    def syncdata_wait(self):</div><div class='add'>+        if self.wait(self.FLAT_DIR_HIERARCHY, None):</div><div class='add'>+            return True</div><div class='add'>+</div><div class='add'>+    def syncdata(self, files):</div><div class='add'>+        self.a_syncdata(files)</div><div class='add'>+        self.syncdata_wait()</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+class RsyncEngine(object):</div><div class='add'>+</div><div class='add'>+    """Sync engine that uses rsync(1) for data transfers"""</div><div class='add'>+</div><div class='add'>+    def a_syncdata(self, files):</div><div class='add'>+        logging.debug(lf("files", files=files))</div><div class='add'>+</div><div class='add'>+        for f in files:</div><div class='add'>+            logging.debug(lf('candidate for syncing', file=f))</div><div class='add'>+            pb = self.syncer.add(f)</div><div class='add'>+</div><div class='add'>+            def regjob(se, xte, pb):</div><div class='add'>+                rv = pb.wait()</div><div class='add'>+                if rv[0]:</div><div class='add'>+                    logging.debug(lf('synced', file=se))</div><div class='add'>+                    return True</div><div class='add'>+                else:</div><div class='add'>+                    # stat to check if the file exist</div><div class='add'>+                    st = lstat(se)</div><div class='add'>+                    if isinstance(st, int):</div><div class='add'>+                        # file got unlinked in the interim</div><div class='add'>+                        self.unlinked_gfids.add(se)</div><div class='add'>+                        return True</div><div class='add'>+</div><div class='add'>+            self.add_job(self.FLAT_DIR_HIERARCHY, 'reg', regjob, f, None, pb)</div><div class='add'>+</div><div class='add'>+    def syncdata_wait(self):</div><div class='add'>+        if self.wait(self.FLAT_DIR_HIERARCHY, None):</div><div class='add'>+            return True</div><div class='add'>+</div><div class='add'>+    def syncdata(self, files):</div><div class='add'>+        self.a_syncdata(files)</div><div class='add'>+        self.syncdata_wait()</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+class GMasterCommon(object):</div><div class='add'>+</div><div class='add'>+    """abstract class impementling master role"""</div><div class='add'>+</div><div class='add'>+    KFGN = 0</div><div class='add'>+    KNAT = 1</div><div class='add'>+</div><div class='add'>+    def get_sys_volinfo(self):</div><div class='add'>+        """query volume marks on fs root</div><div class='add'>+</div><div class='add'>+        err out on multiple foreign masters</div><div class='add'>+        """</div><div class='add'>+        fgn_vis, nat_vi = (</div><div class='add'>+            self.master.server.aggregated.foreign_volume_infos(),</div><div class='add'>+            self.master.server.aggregated.native_volume_info())</div><div class='add'>+        fgn_vi = None</div><div class='add'>+        if fgn_vis:</div><div class='add'>+            if len(fgn_vis) &gt; 1:</div><div class='add'>+                raise GsyncdError("cannot work with multiple foreign masters")</div><div class='add'>+            fgn_vi = fgn_vis[0]</div><div class='add'>+        return fgn_vi, nat_vi</div><div class='add'>+</div><div class='add'>+    @property</div><div class='add'>+    def uuid(self):</div><div class='add'>+        if self.volinfo:</div><div class='add'>+            return self.volinfo['uuid']</div><div class='add'>+</div><div class='add'>+    @property</div><div class='add'>+    def volmark(self):</div><div class='add'>+        if self.volinfo:</div><div class='add'>+            return self.volinfo['volume_mark']</div><div class='add'>+</div><div class='add'>+    def get_entry_stime(self):</div><div class='add'>+        data = self.slave.server.entry_stime(".", self.uuid)</div><div class='add'>+        if isinstance(data, int):</div><div class='add'>+            data = None</div><div class='add'>+        return data</div><div class='add'>+</div><div class='add'>+    def get_data_stime(self):</div><div class='add'>+        data = self.slave.server.stime(".", self.uuid)</div><div class='add'>+        if isinstance(data, int):</div><div class='add'>+            data = None</div><div class='add'>+        return data</div><div class='add'>+</div><div class='add'>+    def xtime(self, path, *a, **opts):</div><div class='add'>+        """get amended xtime</div><div class='add'>+</div><div class='add'>+        as of amending, we can create missing xtime, or</div><div class='add'>+        determine a valid value if what we get is expired</div><div class='add'>+        (as of the volume mark expiry); way of amendig</div><div class='add'>+        depends on @opts and on subject of query (master</div><div class='add'>+        or slave).</div><div class='add'>+        """</div><div class='add'>+        if a:</div><div class='add'>+            rsc = a[0]</div><div class='add'>+        else:</div><div class='add'>+            rsc = self.master</div><div class='add'>+        self.make_xtime_opts(rsc == self.master, opts)</div><div class='add'>+        return self.xtime_low(rsc, path, **opts)</div><div class='add'>+</div><div class='add'>+    def __init__(self, master, slave):</div><div class='add'>+        self.master = master</div><div class='add'>+        self.slave = slave</div><div class='add'>+        self.jobtab = {}</div><div class='add'>+        if gconf.get("sync-method") == "tarssh":</div><div class='add'>+            self.syncer = Syncer(slave, self.slave.tarssh, [2])</div><div class='add'>+        else:</div><div class='add'>+            # partial transfer (cf. rsync(1)), that's normal</div><div class='add'>+            self.syncer = Syncer(slave, self.slave.rsync, [23, 24])</div><div class='add'>+        # crawls vs. turns:</div><div class='add'>+        # - self.crawls is simply the number of crawl() invocations on root</div><div class='add'>+        # - one turn is a maximal consecutive sequence of crawls so that each</div><div class='add'>+        #   crawl in it detects a change to be synced</div><div class='add'>+        # - self.turns is the number of turns since start</div><div class='add'>+        # - self.total_turns is a limit so that if self.turns reaches it, then</div><div class='add'>+        #   we exit (for diagnostic purposes)</div><div class='add'>+        # so, eg., if the master fs changes unceasingly, self.turns will remain</div><div class='add'>+        # 0.</div><div class='add'>+        self.crawls = 0</div><div class='add'>+        self.turns = 0</div><div class='add'>+        self.total_turns = rconf.turns</div><div class='add'>+        self.crawl_start = datetime.now()</div><div class='add'>+        self.lastreport = {'crawls': 0, 'turns': 0, 'time': 0}</div><div class='add'>+        self.start = None</div><div class='add'>+        self.change_seen = None</div><div class='add'>+        # the actual volinfo we make use of</div><div class='add'>+        self.volinfo = None</div><div class='add'>+        self.terminate = False</div><div class='add'>+        self.sleep_interval = 1</div><div class='add'>+        self.unlinked_gfids = set()</div><div class='add'>+</div><div class='add'>+    def init_keep_alive(cls):</div><div class='add'>+        """start the keep-alive thread """</div><div class='add'>+        timo = gconf.get("slave-timeout", 0)</div><div class='add'>+        if timo &gt; 0:</div><div class='add'>+            def keep_alive():</div><div class='add'>+                while True:</div><div class='add'>+                    vi, gap = cls.keepalive_payload_hook(timo, timo * 0.5)</div><div class='add'>+                    cls.slave.server.keep_alive(vi)</div><div class='add'>+                    time.sleep(gap)</div><div class='add'>+            t = Thread(target=keep_alive)</div><div class='add'>+            t.start()</div><div class='add'>+</div><div class='add'>+    def mgmt_lock(self):</div><div class='add'>+</div><div class='add'>+        """Take management volume lock """</div><div class='add'>+        if rconf.mgmt_lock_fd:</div><div class='add'>+            try:</div><div class='add'>+                fcntl.lockf(rconf.mgmt_lock_fd, fcntl.LOCK_EX | fcntl.LOCK_NB)</div><div class='add'>+                return True</div><div class='add'>+            except:</div><div class='add'>+                ex = sys.exc_info()[1]</div><div class='add'>+                if isinstance(ex, IOError) and ex.errno in (EACCES, EAGAIN):</div><div class='add'>+                    return False</div><div class='add'>+                raise</div><div class='add'>+</div><div class='add'>+        fd = None</div><div class='add'>+        bname = str(self.uuid) + "_" + rconf.args.slave_id + "_subvol_" \</div><div class='add'>+            + str(rconf.args.subvol_num) + ".lock"</div><div class='add'>+        mgmt_lock_dir = os.path.join(gconf.get("meta-volume-mnt"), "geo-rep")</div><div class='add'>+        path = os.path.join(mgmt_lock_dir, bname)</div><div class='add'>+        logging.debug(lf("lock file path", path=path))</div><div class='add'>+        try:</div><div class='add'>+            fd = os.open(path, os.O_CREAT | os.O_RDWR)</div><div class='add'>+        except OSError:</div><div class='add'>+            ex = sys.exc_info()[1]</div><div class='add'>+            if ex.errno == ENOENT:</div><div class='add'>+                logging.info("Creating geo-rep directory in meta volume...")</div><div class='add'>+                try:</div><div class='add'>+                    os.makedirs(mgmt_lock_dir)</div><div class='add'>+                except OSError:</div><div class='add'>+                    ex = sys.exc_info()[1]</div><div class='add'>+                    if ex.errno == EEXIST:</div><div class='add'>+                        pass</div><div class='add'>+                    else:</div><div class='add'>+                        raise</div><div class='add'>+                fd = os.open(path, os.O_CREAT | os.O_RDWR)</div><div class='add'>+            else:</div><div class='add'>+                raise</div><div class='add'>+        try:</div><div class='add'>+            fcntl.lockf(fd, fcntl.LOCK_EX | fcntl.LOCK_NB)</div><div class='add'>+            # Save latest FD for future use</div><div class='add'>+            rconf.mgmt_lock_fd = fd</div><div class='add'>+        except:</div><div class='add'>+            ex = sys.exc_info()[1]</div><div class='add'>+            if isinstance(ex, IOError) and ex.errno in (EACCES, EAGAIN):</div><div class='add'>+                # cannot grab, it's taken</div><div class='add'>+                rconf.mgmt_lock_fd = fd</div><div class='add'>+                return False</div><div class='add'>+            raise</div><div class='add'>+</div><div class='add'>+        return True</div><div class='add'>+</div><div class='add'>+    def should_crawl(self):</div><div class='add'>+        if not gconf.get("use-meta-volume"):</div><div class='add'>+            return rconf.args.local_node_id in self.master.server.node_uuid()</div><div class='add'>+</div><div class='add'>+        if not os.path.ismount(gconf.get("meta-volume-mnt")):</div><div class='add'>+            logging.error("Meta-volume is not mounted. Worker Exiting...")</div><div class='add'>+            sys.exit(1)</div><div class='add'>+        return self.mgmt_lock()</div><div class='add'>+</div><div class='add'>+    def register(self):</div><div class='add'>+        self.register()</div><div class='add'>+</div><div class='add'>+    def crawlwrap(self, oneshot=False, register_time=None):</div><div class='add'>+        if oneshot:</div><div class='add'>+            # it's important to do this during the oneshot crawl as</div><div class='add'>+            # for a passive gsyncd (ie. in a replicate scenario)</div><div class='add'>+            # the keepalive thread would keep the connection alive.</div><div class='add'>+            self.init_keep_alive()</div><div class='add'>+</div><div class='add'>+        # If crawlwrap is called when partial history available,</div><div class='add'>+        # then it sets register_time which is the time when geo-rep</div><div class='add'>+        # worker registered to changelog consumption. Since nsec is</div><div class='add'>+        # not considered in register time, there are chances of skipping</div><div class='add'>+        # changes detection in xsync crawl. This limit will be reset when</div><div class='add'>+        # crawlwrap is called again.</div><div class='add'>+        self.live_changelog_start_time = None</div><div class='add'>+        if register_time:</div><div class='add'>+            self.live_changelog_start_time = (register_time, 0)</div><div class='add'>+</div><div class='add'>+        # no need to maintain volinfo state machine.</div><div class='add'>+        # in a cascading setup, each geo-replication session is</div><div class='add'>+        # independent (ie. 'volume-mark' and 'xtime' are not</div><div class='add'>+        # propagated). This is because the slave's xtime is now</div><div class='add'>+        # stored on the master itself. 'volume-mark' just identifies</div><div class='add'>+        # that we are in a cascading setup and need to enable</div><div class='add'>+        # 'geo-replication.ignore-pid-check' option.</div><div class='add'>+        volinfo_sys = self.volinfo_hook()</div><div class='add'>+        self.volinfo = volinfo_sys[self.KNAT]</div><div class='add'>+        inter_master = volinfo_sys[self.KFGN]</div><div class='add'>+        logging.debug("%s master with volume id %s ..." %</div><div class='add'>+                      (inter_master and "intermediate" or "primary",</div><div class='add'>+                       self.uuid))</div><div class='add'>+        rconf.volume_id = self.uuid</div><div class='add'>+        if self.volinfo:</div><div class='add'>+            if self.volinfo['retval']:</div><div class='add'>+                logging.warn(lf("master cluster's info may not be valid",</div><div class='add'>+                                error=self.volinfo['retval']))</div><div class='add'>+        else:</div><div class='add'>+            raise GsyncdError("master volinfo unavailable")</div><div class='add'>+        self.lastreport['time'] = time.time()</div><div class='add'>+</div><div class='add'>+        t0 = time.time()</div><div class='add'>+        crawl = self.should_crawl()</div><div class='add'>+        while not self.terminate:</div><div class='add'>+            if self.start:</div><div class='add'>+                logging.debug("... crawl #%d done, took %.6f seconds" %</div><div class='add'>+                              (self.crawls, time.time() - self.start))</div><div class='add'>+            self.start = time.time()</div><div class='add'>+            should_display_info = self.start - self.lastreport['time'] &gt;= 60</div><div class='add'>+            if should_display_info:</div><div class='add'>+                logging.debug("%d crawls, %d turns",</div><div class='add'>+                              self.crawls - self.lastreport['crawls'],</div><div class='add'>+                              self.turns - self.lastreport['turns'])</div><div class='add'>+                self.lastreport.update(crawls=self.crawls,</div><div class='add'>+                                       turns=self.turns,</div><div class='add'>+                                       time=self.start)</div><div class='add'>+            t1 = time.time()</div><div class='add'>+            if int(t1 - t0) &gt;= gconf.get("replica-failover-interval"):</div><div class='add'>+                crawl = self.should_crawl()</div><div class='add'>+                t0 = t1</div><div class='add'>+            self.update_worker_remote_node()</div><div class='add'>+            if not crawl:</div><div class='add'>+                self.status.set_passive()</div><div class='add'>+                # bring up _this_ brick to the cluster stime</div><div class='add'>+                # which is min of cluster (but max of the replicas)</div><div class='add'>+                brick_stime = self.xtime('.', self.slave)</div><div class='add'>+                cluster_stime = self.master.server.aggregated.stime_mnt(</div><div class='add'>+                    '.', '.'.join([str(self.uuid), rconf.args.slave_id]))</div><div class='add'>+                logging.debug(lf("Crawl info",</div><div class='add'>+                                 cluster_stime=cluster_stime,</div><div class='add'>+                                 brick_stime=brick_stime))</div><div class='add'>+</div><div class='add'>+                if not isinstance(cluster_stime, int):</div><div class='add'>+                    if brick_stime &lt; cluster_stime:</div><div class='add'>+                        self.slave.server.set_stime(</div><div class='add'>+                            self.FLAT_DIR_HIERARCHY, self.uuid, cluster_stime)</div><div class='add'>+                        self.upd_stime(cluster_stime)</div><div class='add'>+                        # Purge all changelogs available in processing dir</div><div class='add'>+                        # less than cluster_stime</div><div class='add'>+                        proc_dir = os.path.join(self.tempdir,</div><div class='add'>+                                                ".processing")</div><div class='add'>+</div><div class='add'>+                        if os.path.exists(proc_dir):</div><div class='add'>+                            to_purge = [f for f in os.listdir(proc_dir)</div><div class='add'>+                                        if (f.startswith("CHANGELOG.") and</div><div class='add'>+                                            int(f.split('.')[-1]) &lt;</div><div class='add'>+                                            cluster_stime[0])]</div><div class='add'>+                            for f in to_purge:</div><div class='add'>+                                os.remove(os.path.join(proc_dir, f))</div><div class='add'>+</div><div class='add'>+                time.sleep(5)</div><div class='add'>+                continue</div><div class='add'>+</div><div class='add'>+            self.status.set_active()</div><div class='add'>+            self.crawl()</div><div class='add'>+</div><div class='add'>+            if oneshot:</div><div class='add'>+                return</div><div class='add'>+            time.sleep(self.sleep_interval)</div><div class='add'>+</div><div class='add'>+    @staticmethod</div><div class='add'>+    def humantime(*tpair):</div><div class='add'>+        """format xtime-like (sec, nsec) pair to human readable format"""</div><div class='add'>+        ts = datetime.fromtimestamp(float('.'.join(str(n) for n in tpair))).\</div><div class='add'>+            strftime("%Y-%m-%d %H:%M:%S")</div><div class='add'>+        if len(tpair) &gt; 1:</div><div class='add'>+            ts += '.' + str(tpair[1])</div><div class='add'>+        return ts</div><div class='add'>+</div><div class='add'>+    def _crawl_time_format(self, crawl_time):</div><div class='add'>+        # Ex: 5 years, 4 days, 20:23:10</div><div class='add'>+        years, days = divmod(crawl_time.days, 365.25)</div><div class='add'>+        years = int(years)</div><div class='add'>+        days = int(days)</div><div class='add'>+</div><div class='add'>+        date = ""</div><div class='add'>+        m, s = divmod(crawl_time.seconds, 60)</div><div class='add'>+        h, m = divmod(m, 60)</div><div class='add'>+</div><div class='add'>+        if years != 0:</div><div class='add'>+            date += "%s %s " % (years, "year" if years == 1 else "years")</div><div class='add'>+        if days != 0:</div><div class='add'>+            date += "%s %s " % (days, "day" if days == 1 else "days")</div><div class='add'>+</div><div class='add'>+        date += "%s:%s:%s" % (string.zfill(h, 2),</div><div class='add'>+                              string.zfill(m, 2), string.zfill(s, 2))</div><div class='add'>+        return date</div><div class='add'>+</div><div class='add'>+    def add_job(self, path, label, job, *a, **kw):</div><div class='add'>+        """insert @job function to job table at @path with @label"""</div><div class='add'>+        if self.jobtab.get(path) is None:</div><div class='add'>+            self.jobtab[path] = []</div><div class='add'>+        self.jobtab[path].append((label, a, lambda: job(*a, **kw)))</div><div class='add'>+</div><div class='add'>+    def add_failjob(self, path, label):</div><div class='add'>+        """invoke .add_job with a job that does nothing just fails"""</div><div class='add'>+        logging.debug('salvaged: ' + label)</div><div class='add'>+        self.add_job(path, label, lambda: False)</div><div class='add'>+</div><div class='add'>+    def wait(self, path, *args):</div><div class='add'>+        """perform jobs registered for @path</div><div class='add'>+</div><div class='add'>+        Reset jobtab entry for @path,</div><div class='add'>+        determine success as the conjunction of</div><div class='add'>+        success of all the jobs. In case of</div><div class='add'>+        success, call .sendmark on @path</div><div class='add'>+        """</div><div class='add'>+        jobs = self.jobtab.pop(path, [])</div><div class='add'>+        succeed = True</div><div class='add'>+        for j in jobs:</div><div class='add'>+            ret = j[-1]()</div><div class='add'>+            if not ret:</div><div class='add'>+                succeed = False</div><div class='add'>+        if succeed and not args[0] is None:</div><div class='add'>+            self.sendmark(path, *args)</div><div class='add'>+        return succeed</div><div class='add'>+</div><div class='add'>+    def sendmark(self, path, mark, adct=None):</div><div class='add'>+        """update slave side xtime for @path to master side xtime</div><div class='add'>+</div><div class='add'>+        also can send a setattr payload (see Server.setattr).</div><div class='add'>+        """</div><div class='add'>+        if adct:</div><div class='add'>+            self.slave.server.setattr(path, adct)</div><div class='add'>+        self.set_slave_xtime(path, mark)</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+class XCrawlMetadata(object):</div><div class='add'>+    def __init__(self, st_uid, st_gid, st_mode, st_atime, st_mtime):</div><div class='add'>+        self.st_uid = int(st_uid)</div><div class='add'>+        self.st_gid = int(st_gid)</div><div class='add'>+        self.st_mode = int(st_mode)</div><div class='add'>+        self.st_atime = float(st_atime)</div><div class='add'>+        self.st_mtime = float(st_mtime)</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+class GMasterChangelogMixin(GMasterCommon):</div><div class='add'>+</div><div class='add'>+    """ changelog based change detection and syncing """</div><div class='add'>+</div><div class='add'>+    # index for change type and entry</div><div class='add'>+    IDX_START = 0</div><div class='add'>+    IDX_END = 2</div><div class='add'>+    UNLINK_ENTRY = 2</div><div class='add'>+</div><div class='add'>+    POS_GFID = 0</div><div class='add'>+    POS_TYPE = 1</div><div class='add'>+    POS_ENTRY1 = -1</div><div class='add'>+</div><div class='add'>+    TYPE_META = "M "</div><div class='add'>+    TYPE_GFID = "D "</div><div class='add'>+    TYPE_ENTRY = "E "</div><div class='add'>+</div><div class='add'>+    MAX_EF_RETRIES = 10</div><div class='add'>+    MAX_OE_RETRIES = 10</div><div class='add'>+</div><div class='add'>+    # flat directory hierarchy for gfid based access</div><div class='add'>+    FLAT_DIR_HIERARCHY = '.'</div><div class='add'>+</div><div class='add'>+    CHANGELOG_CONN_RETRIES = 5</div><div class='add'>+</div><div class='add'>+    def init_fop_batch_stats(self):</div><div class='add'>+        self.batch_stats = {</div><div class='add'>+            "CREATE": 0,</div><div class='add'>+            "MKNOD": 0,</div><div class='add'>+            "UNLINK": 0,</div><div class='add'>+            "MKDIR": 0,</div><div class='add'>+            "RMDIR": 0,</div><div class='add'>+            "LINK": 0,</div><div class='add'>+            "SYMLINK": 0,</div><div class='add'>+            "RENAME": 0,</div><div class='add'>+            "SETATTR": 0,</div><div class='add'>+            "SETXATTR": 0,</div><div class='add'>+            "XATTROP": 0,</div><div class='add'>+            "DATA": 0,</div><div class='add'>+            "ENTRY_SYNC_TIME": 0,</div><div class='add'>+            "META_SYNC_TIME": 0,</div><div class='add'>+            "DATA_START_TIME": 0</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+    def update_fop_batch_stats(self, ty):</div><div class='add'>+        if ty in ['FSETXATTR']:</div><div class='add'>+            ty = 'SETXATTR'</div><div class='add'>+        self.batch_stats[ty] = self.batch_stats.get(ty, 0) + 1</div><div class='add'>+</div><div class='add'>+    def archive_and_purge_changelogs(self, changelogs):</div><div class='add'>+        # Creates tar file instead of tar.gz, since changelogs will</div><div class='add'>+        # be appended to existing tar. archive name is</div><div class='add'>+        # archive_&lt;YEAR&gt;&lt;MONTH&gt;.tar</div><div class='add'>+        archive_name = "archive_%s.tar" % datetime.today().strftime(</div><div class='add'>+            gconf.get("changelog-archive-format"))</div><div class='add'>+</div><div class='add'>+        try:</div><div class='add'>+            tar = tarfile.open(os.path.join(self.processed_changelogs_dir,</div><div class='add'>+                                            archive_name),</div><div class='add'>+                               "a")</div><div class='add'>+        except tarfile.ReadError:</div><div class='add'>+            tar = tarfile.open(os.path.join(self.processed_changelogs_dir,</div><div class='add'>+                                            archive_name),</div><div class='add'>+                               "w")</div><div class='add'>+</div><div class='add'>+        for f in changelogs:</div><div class='add'>+            try:</div><div class='add'>+                f = os.path.basename(f)</div><div class='add'>+                tar.add(os.path.join(self.processed_changelogs_dir, f),</div><div class='add'>+                        arcname=os.path.basename(f))</div><div class='add'>+            except:</div><div class='add'>+                exc = sys.exc_info()[1]</div><div class='add'>+                if ((isinstance(exc, OSError) or</div><div class='add'>+                     isinstance(exc, IOError)) and exc.errno == ENOENT):</div><div class='add'>+                    continue</div><div class='add'>+                else:</div><div class='add'>+                    tar.close()</div><div class='add'>+                    raise</div><div class='add'>+        tar.close()</div><div class='add'>+</div><div class='add'>+        for f in changelogs:</div><div class='add'>+            try:</div><div class='add'>+                f = os.path.basename(f)</div><div class='add'>+                os.remove(os.path.join(self.processed_changelogs_dir, f))</div><div class='add'>+            except OSError as e:</div><div class='add'>+                if e.errno == errno.ENOENT:</div><div class='add'>+                    continue</div><div class='add'>+                else:</div><div class='add'>+                    raise</div><div class='add'>+</div><div class='add'>+    def setup_working_dir(self):</div><div class='add'>+        workdir = os.path.join(gconf.get("working-dir"),</div><div class='add'>+                               escape(rconf.args.local_path))</div><div class='add'>+        logging.debug('changelog working dir %s' % workdir)</div><div class='add'>+        return workdir</div><div class='add'>+</div><div class='add'>+    def log_failures(self, failures, entry_key, gfid_prefix, log_prefix):</div><div class='add'>+        num_failures = 0</div><div class='add'>+        for failure in failures:</div><div class='add'>+            st = lstat(os.path.join(gfid_prefix, failure[0][entry_key]))</div><div class='add'>+            if not isinstance(st, int):</div><div class='add'>+                num_failures += 1</div><div class='add'>+                logging.error(lf('%s FAILED' % log_prefix,</div><div class='add'>+                                 data=failure))</div><div class='add'>+                if failure[0]['op'] == 'MKDIR':</div><div class='add'>+                    raise GsyncdError("The above directory failed to sync."</div><div class='add'>+                                      " Please fix it to proceed further.")</div><div class='add'>+</div><div class='add'>+        self.status.inc_value("failures", num_failures)</div><div class='add'>+</div><div class='add'>+    def fix_possible_entry_failures(self, failures, retry_count, entries):</div><div class='add'>+        pfx = gauxpfx()</div><div class='add'>+        fix_entry_ops = []</div><div class='add'>+        failures1 = []</div><div class='add'>+        remove_gfids = set()</div><div class='add'>+        for failure in failures:</div><div class='add'>+            if failure[2]['name_mismatch']:</div><div class='add'>+                pbname = failure[2]['slave_entry']</div><div class='add'>+            elif failure[2]['dst']:</div><div class='add'>+                pbname = failure[0]['entry1']</div><div class='add'>+            else:</div><div class='add'>+                pbname = failure[0]['entry']</div><div class='add'>+</div><div class='add'>+            op = failure[0]['op']</div><div class='add'>+            # name exists but gfid is different</div><div class='add'>+            if failure[2]['gfid_mismatch'] or failure[2]['name_mismatch']:</div><div class='add'>+                slave_gfid = failure[2]['slave_gfid']</div><div class='add'>+                st = lstat(os.path.join(pfx, slave_gfid))</div><div class='add'>+                # Takes care of scenarios with no hardlinks</div><div class='add'>+                if isinstance(st, int) and st == ENOENT:</div><div class='add'>+                    logging.debug(lf('Entry not present on master. Fixing gfid '</div><div class='add'>+                                    'mismatch in slave. Deleting the entry',</div><div class='add'>+                                    retry_count=retry_count,</div><div class='add'>+                                    entry=repr(failure)))</div><div class='add'>+                    # Add deletion to fix_entry_ops list</div><div class='add'>+                    if failure[2]['slave_isdir']:</div><div class='add'>+                        fix_entry_ops.append(</div><div class='add'>+                            edct('RMDIR',</div><div class='add'>+                                 gfid=failure[2]['slave_gfid'],</div><div class='add'>+                                 entry=pbname))</div><div class='add'>+                    else:</div><div class='add'>+                        fix_entry_ops.append(</div><div class='add'>+                            edct('UNLINK',</div><div class='add'>+                                 gfid=failure[2]['slave_gfid'],</div><div class='add'>+                                 entry=pbname))</div><div class='add'>+                    remove_gfids.add(slave_gfid)</div><div class='add'>+                    if op in ['RENAME']:</div><div class='add'>+                        # If renamed gfid doesn't exists on master, remove</div><div class='add'>+                        # rename entry and unlink src on slave</div><div class='add'>+                        st = lstat(os.path.join(pfx, failure[0]['gfid']))</div><div class='add'>+                        if isinstance(st, int) and st == ENOENT:</div><div class='add'>+                            logging.debug("Unlink source %s" % repr(failure))</div><div class='add'>+                            remove_gfids.add(failure[0]['gfid'])</div><div class='add'>+                            fix_entry_ops.append(</div><div class='add'>+                                edct('UNLINK',</div><div class='add'>+                                     gfid=failure[0]['gfid'],</div><div class='add'>+                                     entry=failure[0]['entry']))</div><div class='add'>+                # Takes care of scenarios of hardlinks/renames on master</div><div class='add'>+                elif not isinstance(st, int):</div><div class='add'>+                    if matching_disk_gfid(slave_gfid, pbname):</div><div class='add'>+                        # Safe to ignore the failure as master contains same</div><div class='add'>+                        # file with same gfid. Remove entry from entries list</div><div class='add'>+                        logging.debug(lf('Fixing gfid mismatch in slave. '</div><div class='add'>+                                        ' Safe to ignore, take out entry',</div><div class='add'>+                                        retry_count=retry_count,</div><div class='add'>+                                        entry=repr(failure)))</div><div class='add'>+                        remove_gfids.add(failure[0]['gfid'])</div><div class='add'>+                        if op == 'RENAME':</div><div class='add'>+                            fix_entry_ops.append(</div><div class='add'>+                                edct('UNLINK',</div><div class='add'>+                                     gfid=failure[0]['gfid'],</div><div class='add'>+                                     entry=failure[0]['entry']))</div><div class='add'>+                    # The file exists on master but with different name.</div><div class='add'>+                    # Probably renamed and got missed during xsync crawl.</div><div class='add'>+                    elif failure[2]['slave_isdir']:</div><div class='add'>+                        realpath = os.readlink(os.path.join(</div><div class='add'>+                                               rconf.args.local_path,</div><div class='add'>+                                               ".glusterfs",</div><div class='add'>+                                               slave_gfid[0:2],</div><div class='add'>+                                               slave_gfid[2:4],</div><div class='add'>+                                               slave_gfid))</div><div class='add'>+                        dst_entry = os.path.join(pfx, realpath.split('/')[-2],</div><div class='add'>+                                                 realpath.split('/')[-1])</div><div class='add'>+                        src_entry = pbname</div><div class='add'>+                        logging.debug(lf('Fixing dir name/gfid mismatch in '</div><div class='add'>+                                        'slave', retry_count=retry_count,</div><div class='add'>+                                        entry=repr(failure)))</div><div class='add'>+                        if src_entry == dst_entry:</div><div class='add'>+                            # Safe to ignore the failure as master contains</div><div class='add'>+                            # same directory as in slave with same gfid.</div><div class='add'>+                            # Remove the failure entry from entries list</div><div class='add'>+                            logging.debug(lf('Fixing dir name/gfid mismatch'</div><div class='add'>+                                            ' in slave. Safe to ignore, '</div><div class='add'>+                                            'take out entry',</div><div class='add'>+                                            retry_count=retry_count,</div><div class='add'>+                                            entry=repr(failure)))</div><div class='add'>+                            try:</div><div class='add'>+                                entries.remove(failure[0])</div><div class='add'>+                            except ValueError:</div><div class='add'>+                                pass</div><div class='add'>+                        else:</div><div class='add'>+                            rename_dict = edct('RENAME', gfid=slave_gfid,</div><div class='add'>+                                               entry=src_entry,</div><div class='add'>+                                               entry1=dst_entry, stat=st,</div><div class='add'>+                                               link=None)</div><div class='add'>+                            logging.debug(lf('Fixing dir name/gfid mismatch'</div><div class='add'>+                                            ' in slave. Renaming',</div><div class='add'>+                                            retry_count=retry_count,</div><div class='add'>+                                            entry=repr(rename_dict)))</div><div class='add'>+                            fix_entry_ops.append(rename_dict)</div><div class='add'>+                    else:</div><div class='add'>+                        # A hardlink file exists with different name or</div><div class='add'>+                        # renamed file exists and we are sure from</div><div class='add'>+                        # matching_disk_gfid check that the entry doesn't</div><div class='add'>+                        # exist with same gfid so we can safely delete on slave</div><div class='add'>+                        logging.debug(lf('Fixing file gfid mismatch in slave. '</div><div class='add'>+                                        'Hardlink/Rename Case. Deleting entry',</div><div class='add'>+                                        retry_count=retry_count,</div><div class='add'>+                                        entry=repr(failure)))</div><div class='add'>+                        fix_entry_ops.append(</div><div class='add'>+                            edct('UNLINK',</div><div class='add'>+                                 gfid=failure[2]['slave_gfid'],</div><div class='add'>+                                 entry=pbname))</div><div class='add'>+            elif failure[1] == ENOENT:</div><div class='add'>+                if op in ['RENAME']:</div><div class='add'>+                    pbname = failure[0]['entry1']</div><div class='add'>+                else:</div><div class='add'>+                    pbname = failure[0]['entry']</div><div class='add'>+</div><div class='add'>+                pargfid = pbname.split('/')[1]</div><div class='add'>+                st = lstat(os.path.join(pfx, pargfid))</div><div class='add'>+                # Safe to ignore the failure as master doesn't contain</div><div class='add'>+                # parent directory.</div><div class='add'>+                if isinstance(st, int):</div><div class='add'>+                    logging.debug(lf('Fixing ENOENT error in slave. Parent '</div><div class='add'>+                                    'does not exist on master. Safe to '</div><div class='add'>+                                    'ignore, take out entry',</div><div class='add'>+                                    retry_count=retry_count,</div><div class='add'>+                                    entry=repr(failure)))</div><div class='add'>+                    try:</div><div class='add'>+                        entries.remove(failure[0])</div><div class='add'>+                    except ValueError:</div><div class='add'>+                        pass</div><div class='add'>+                else:</div><div class='add'>+                    logging.debug(lf('Fixing ENOENT error in slave. Create '</div><div class='add'>+                                    'parent directory on slave.',</div><div class='add'>+                                    retry_count=retry_count,</div><div class='add'>+                                    entry=repr(failure)))</div><div class='add'>+                    realpath = os.readlink(os.path.join(rconf.args.local_path,</div><div class='add'>+                                                        ".glusterfs",</div><div class='add'>+                                                        pargfid[0:2],</div><div class='add'>+                                                        pargfid[2:4],</div><div class='add'>+                                                        pargfid))</div><div class='add'>+                    dir_entry = os.path.join(pfx, realpath.split('/')[-2],</div><div class='add'>+                                             realpath.split('/')[-1])</div><div class='add'>+                    fix_entry_ops.append(</div><div class='add'>+                        edct('MKDIR', gfid=pargfid, entry=dir_entry,</div><div class='add'>+                             mode=st.st_mode, uid=st.st_uid, gid=st.st_gid))</div><div class='add'>+</div><div class='add'>+        logging.debug("remove_gfids: %s" % repr(remove_gfids))</div><div class='add'>+        if remove_gfids:</div><div class='add'>+            for e in entries:</div><div class='add'>+                if e['op'] in ['MKDIR', 'MKNOD', 'CREATE', 'RENAME'] \</div><div class='add'>+                   and e['gfid'] in remove_gfids:</div><div class='add'>+                    logging.debug("Removed entry op from retrial list: entry: %s" % repr(e))</div><div class='add'>+                    e['skip_entry'] = True</div><div class='add'>+</div><div class='add'>+        if fix_entry_ops:</div><div class='add'>+            # Process deletions of entries whose gfids are mismatched</div><div class='add'>+            failures1 = self.slave.server.entry_ops(fix_entry_ops)</div><div class='add'>+</div><div class='add'>+        return (failures1, fix_entry_ops)</div><div class='add'>+</div><div class='add'>+    def handle_entry_failures(self, failures, entries):</div><div class='add'>+        retries = 0</div><div class='add'>+        pending_failures = False</div><div class='add'>+        failures1 = []</div><div class='add'>+        failures2 = []</div><div class='add'>+        entry_ops1 = []</div><div class='add'>+        entry_ops2 = []</div><div class='add'>+</div><div class='add'>+        if failures:</div><div class='add'>+            pending_failures = True</div><div class='add'>+            failures1 = failures</div><div class='add'>+            entry_ops1 = entries</div><div class='add'>+</div><div class='add'>+            while pending_failures and retries &lt; self.MAX_EF_RETRIES:</div><div class='add'>+                retries += 1</div><div class='add'>+                (failures2, entry_ops2) = self.fix_possible_entry_failures(</div><div class='add'>+                    failures1, retries, entry_ops1)</div><div class='add'>+                if not failures2:</div><div class='add'>+                    pending_failures = False</div><div class='add'>+                    logging.info(lf('Successfully fixed entry ops with gfid '</div><div class='add'>+                                 'mismatch', retry_count=retries))</div><div class='add'>+                else:</div><div class='add'>+                    pending_failures = True</div><div class='add'>+                    failures1 = failures2</div><div class='add'>+                    entry_ops1 = entry_ops2</div><div class='add'>+</div><div class='add'>+            if pending_failures:</div><div class='add'>+                for failure in failures1:</div><div class='add'>+                    logging.error("Failed to fix entry ops %s", repr(failure))</div><div class='add'>+</div><div class='add'>+    def process_change(self, change, done, retry):</div><div class='add'>+        pfx = gauxpfx()</div><div class='add'>+        clist = []</div><div class='add'>+        entries = []</div><div class='add'>+        meta_gfid = set()</div><div class='add'>+        datas = set()</div><div class='add'>+</div><div class='add'>+        change_ts = change.split(".")[-1]</div><div class='add'>+</div><div class='add'>+        # Ignore entry ops which are already processed in Changelog modes</div><div class='add'>+        ignore_entry_ops = False</div><div class='add'>+        entry_stime = None</div><div class='add'>+        data_stime = None</div><div class='add'>+        if self.name in ["live_changelog", "history_changelog"]:</div><div class='add'>+            entry_stime = self.get_entry_stime()</div><div class='add'>+            data_stime = self.get_data_stime()</div><div class='add'>+</div><div class='add'>+        if entry_stime is not None and data_stime is not None:</div><div class='add'>+            # if entry_stime is not None but data_stime &gt; entry_stime</div><div class='add'>+            # This situation is caused by the stime update of Passive worker</div><div class='add'>+            # Consider data_stime in this case.</div><div class='add'>+            if data_stime[0] &gt; entry_stime[0]:</div><div class='add'>+                entry_stime = data_stime</div><div class='add'>+</div><div class='add'>+            # Compare the entry_stime with changelog file suffix</div><div class='add'>+            # if changelog time is less than entry_stime then ignore</div><div class='add'>+            if int(change_ts) &lt;= entry_stime[0]:</div><div class='add'>+                ignore_entry_ops = True</div><div class='add'>+</div><div class='add'>+        try:</div><div class='add'>+            f = open(change, "r")</div><div class='add'>+            clist = f.readlines()</div><div class='add'>+            f.close()</div><div class='add'>+        except IOError:</div><div class='add'>+            raise</div><div class='add'>+</div><div class='add'>+        for e in clist:</div><div class='add'>+            e = e.strip()</div><div class='add'>+            et = e[self.IDX_START:self.IDX_END]   # entry type</div><div class='add'>+            ec = e[self.IDX_END:].split(' ')      # rest of the bits</div><div class='add'>+</div><div class='add'>+            # skip ENTRY operation if hot tier brick</div><div class='add'>+            if self.name == 'live_changelog' or \</div><div class='add'>+               self.name == 'history_changelog':</div><div class='add'>+                if rconf.args.is_hottier and et == self.TYPE_ENTRY:</div><div class='add'>+                    logging.debug(lf('skip ENTRY op if hot tier brick',</div><div class='add'>+                                     op=ec[self.POS_TYPE]))</div><div class='add'>+                    continue</div><div class='add'>+</div><div class='add'>+            # Data and Meta operations are decided while parsing</div><div class='add'>+            # UNLINK/RMDIR/MKNOD except that case ignore all the other</div><div class='add'>+            # entry ops if ignore_entry_ops is True.</div><div class='add'>+            # UNLINK/RMDIR/MKNOD entry_ops are ignored in the end</div><div class='add'>+            if ignore_entry_ops and et == self.TYPE_ENTRY and \</div><div class='add'>+               ec[self.POS_TYPE] not in ["UNLINK", "RMDIR", "MKNOD"]:</div><div class='add'>+                continue</div><div class='add'>+</div><div class='add'>+            if et == self.TYPE_ENTRY:</div><div class='add'>+                # extract information according to the type of</div><div class='add'>+                # the entry operation. create(), mkdir() and mknod()</div><div class='add'>+                # have mode, uid, gid information in the changelog</div><div class='add'>+                # itself, so no need to stat()...</div><div class='add'>+                ty = ec[self.POS_TYPE]</div><div class='add'>+</div><div class='add'>+                self.update_fop_batch_stats(ec[self.POS_TYPE])</div><div class='add'>+</div><div class='add'>+                # PARGFID/BNAME</div><div class='add'>+                en = unescape_space_newline(</div><div class='add'>+                    os.path.join(pfx, ec[self.POS_ENTRY1]))</div><div class='add'>+                # GFID of the entry</div><div class='add'>+                gfid = ec[self.POS_GFID]</div><div class='add'>+</div><div class='add'>+                if ty in ['UNLINK', 'RMDIR']:</div><div class='add'>+                    # The index of PARGFID/BNAME for UNLINK, RMDIR</div><div class='add'>+                    # is no more the last index. It varies based on</div><div class='add'>+                    # changelog.capture-del-path is enabled or not.</div><div class='add'>+                    en = unescape_space_newline(</div><div class='add'>+                        os.path.join(pfx, ec[self.UNLINK_ENTRY]))</div><div class='add'>+</div><div class='add'>+                    # Remove from DATA list, so that rsync will</div><div class='add'>+                    # not fail</div><div class='add'>+                    pt = os.path.join(pfx, ec[0])</div><div class='add'>+                    st = lstat(pt)</div><div class='add'>+                    if pt in datas and isinstance(st, int):</div><div class='add'>+                        # file got unlinked, May be historical Changelog</div><div class='add'>+                        datas.remove(pt)</div><div class='add'>+</div><div class='add'>+                    if ty in ['RMDIR'] and not isinstance(st, int):</div><div class='add'>+                        logging.info(lf('Ignoring rmdir. Directory present in '</div><div class='add'>+                                        'master', gfid=gfid, pgfid_bname=en))</div><div class='add'>+                        continue</div><div class='add'>+</div><div class='add'>+                    if not gconf.get("ignore-deletes"):</div><div class='add'>+                        if not ignore_entry_ops:</div><div class='add'>+                            entries.append(edct(ty, gfid=gfid, entry=en))</div><div class='add'>+                elif ty in ['CREATE', 'MKDIR', 'MKNOD']:</div><div class='add'>+                    # Special case: record mknod as link</div><div class='add'>+                    if ty in ['MKNOD']:</div><div class='add'>+                        mode = int(ec[2])</div><div class='add'>+                        if mode &amp; 0o1000:</div><div class='add'>+                                # Avoid stat'ing the file as it</div><div class='add'>+                                # may be deleted in the interim</div><div class='add'>+                                st = FreeObject(st_mode=int(ec[2]),</div><div class='add'>+                                                st_uid=int(ec[3]),</div><div class='add'>+                                                st_gid=int(ec[4]),</div><div class='add'>+                                                st_atime=0,</div><div class='add'>+                                                st_mtime=0)</div><div class='add'>+</div><div class='add'>+                                # So, it may be deleted, but still we are</div><div class='add'>+                                # append LINK? Because, the file will be</div><div class='add'>+                                # CREATED if source not exists.</div><div class='add'>+                                entries.append(edct('LINK', stat=st, entry=en,</div><div class='add'>+                                               gfid=gfid))</div><div class='add'>+</div><div class='add'>+                                # Here, we have the assumption that only</div><div class='add'>+                                # tier-gfid.linkto causes this mknod. Add data</div><div class='add'>+                                datas.add(os.path.join(pfx, ec[0]))</div><div class='add'>+                                continue</div><div class='add'>+</div><div class='add'>+                    # stat info. present in the changelog itself</div><div class='add'>+                    entries.append(edct(ty, gfid=gfid, entry=en,</div><div class='add'>+                                   mode=int(ec[2]),</div><div class='add'>+                                   uid=int(ec[3]), gid=int(ec[4])))</div><div class='add'>+                elif ty == "RENAME":</div><div class='add'>+                    go = os.path.join(pfx, gfid)</div><div class='add'>+                    st = lstat(go)</div><div class='add'>+                    if isinstance(st, int):</div><div class='add'>+                        st = {}</div><div class='add'>+</div><div class='add'>+                    rl = None</div><div class='add'>+                    if st and stat.S_ISLNK(st.st_mode):</div><div class='add'>+                        rl = errno_wrap(os.readlink, [en], [ENOENT],</div><div class='add'>+                                        [ESTALE, EINTR])</div><div class='add'>+                        if isinstance(rl, int):</div><div class='add'>+                            rl = None</div><div class='add'>+</div><div class='add'>+                    e1 = unescape_space_newline(</div><div class='add'>+                        os.path.join(pfx, ec[self.POS_ENTRY1 - 1]))</div><div class='add'>+                    entries.append(edct(ty, gfid=gfid, entry=e1, entry1=en,</div><div class='add'>+                                        stat=st, link=rl))</div><div class='add'>+                    # If src doesn't exist while doing rename, destination</div><div class='add'>+                    # is created. If data is not followed by rename, this</div><div class='add'>+                    # remains zero byte file on slave. Hence add data entry</div><div class='add'>+                    # for renames</div><div class='add'>+                    datas.add(os.path.join(pfx, gfid))</div><div class='add'>+                else:</div><div class='add'>+                    # stat() to get mode and other information</div><div class='add'>+                    if not matching_disk_gfid(gfid, en):</div><div class='add'>+                        logging.debug(lf('Ignoring entry, purged in the '</div><div class='add'>+                                      'interim', file=en, gfid=gfid))</div><div class='add'>+                        continue</div><div class='add'>+</div><div class='add'>+                    go = os.path.join(pfx, gfid)</div><div class='add'>+                    st = lstat(go)</div><div class='add'>+                    if isinstance(st, int):</div><div class='add'>+                        logging.debug(lf('Ignoring entry, purged in the '</div><div class='add'>+                                      'interim', file=en, gfid=gfid))</div><div class='add'>+                        continue</div><div class='add'>+</div><div class='add'>+                    if ty == 'LINK':</div><div class='add'>+                        rl = None</div><div class='add'>+                        if st and stat.S_ISLNK(st.st_mode):</div><div class='add'>+                            rl = errno_wrap(os.readlink, [en], [ENOENT],</div><div class='add'>+                                            [ESTALE, EINTR])</div><div class='add'>+                            if isinstance(rl, int):</div><div class='add'>+                                rl = None</div><div class='add'>+                        entries.append(edct(ty, stat=st, entry=en, gfid=gfid,</div><div class='add'>+                                       link=rl))</div><div class='add'>+                        # If src doesn't exist while doing link, destination</div><div class='add'>+                        # is created based on file type. If data is not</div><div class='add'>+                        # followed by link, this remains zero byte file on</div><div class='add'>+                        # slave. Hence add data entry for links</div><div class='add'>+                        if rl is None:</div><div class='add'>+                            datas.add(os.path.join(pfx, gfid))</div><div class='add'>+                    elif ty == 'SYMLINK':</div><div class='add'>+                        rl = errno_wrap(os.readlink, [en], [ENOENT],</div><div class='add'>+                                        [ESTALE, EINTR])</div><div class='add'>+                        if isinstance(rl, int):</div><div class='add'>+                            continue</div><div class='add'>+</div><div class='add'>+                        entries.append(</div><div class='add'>+                            edct(ty, stat=st, entry=en, gfid=gfid, link=rl))</div><div class='add'>+                    else:</div><div class='add'>+                        logging.warn(lf('ignoring op',</div><div class='add'>+                                        gfid=gfid,</div><div class='add'>+                                        type=ty))</div><div class='add'>+            elif et == self.TYPE_GFID:</div><div class='add'>+                # If self.unlinked_gfids is available, then that means it is</div><div class='add'>+                # retrying the changelog second time. Do not add the GFID's</div><div class='add'>+                # to rsync job if failed previously but unlinked in master</div><div class='add'>+                if self.unlinked_gfids and \</div><div class='add'>+                   os.path.join(pfx, ec[0]) in self.unlinked_gfids:</div><div class='add'>+                    logging.debug("ignoring data, since file purged interim")</div><div class='add'>+                else:</div><div class='add'>+                    datas.add(os.path.join(pfx, ec[0]))</div><div class='add'>+            elif et == self.TYPE_META:</div><div class='add'>+                self.update_fop_batch_stats(ec[self.POS_TYPE])</div><div class='add'>+                if ec[1] == 'SETATTR':  # only setattr's for now...</div><div class='add'>+                    if len(ec) == 5:</div><div class='add'>+                        # In xsync crawl, we already have stat data</div><div class='add'>+                        # avoid doing stat again</div><div class='add'>+                        meta_gfid.add((os.path.join(pfx, ec[0]),</div><div class='add'>+                                       XCrawlMetadata(st_uid=ec[2],</div><div class='add'>+                                                      st_gid=ec[3],</div><div class='add'>+                                                      st_mode=ec[4],</div><div class='add'>+                                                      st_atime=ec[5],</div><div class='add'>+                                                      st_mtime=ec[6])))</div><div class='add'>+                    else:</div><div class='add'>+                        meta_gfid.add((os.path.join(pfx, ec[0]), ))</div><div class='add'>+                elif ec[1] in ['SETXATTR', 'XATTROP', 'FXATTROP']:</div><div class='add'>+                    # To sync xattr/acls use rsync/tar, --xattrs and --acls</div><div class='add'>+                    # switch to rsync and tar</div><div class='add'>+                    if not gconf.get("sync-method") == "tarssh" and \</div><div class='add'>+                       (gconf.get("sync-xattrs") or gconf.get("sync-acls")):</div><div class='add'>+                        datas.add(os.path.join(pfx, ec[0]))</div><div class='add'>+            else:</div><div class='add'>+                logging.warn(lf('got invalid fop type',</div><div class='add'>+                                type=et))</div><div class='add'>+        logging.debug('entries: %s' % repr(entries))</div><div class='add'>+</div><div class='add'>+        # Increment counters for Status</div><div class='add'>+        self.files_in_batch += len(datas)</div><div class='add'>+        self.status.inc_value("data", len(datas))</div><div class='add'>+</div><div class='add'>+        self.batch_stats["DATA"] += self.files_in_batch - \</div><div class='add'>+            self.batch_stats["SETXATTR"] - \</div><div class='add'>+            self.batch_stats["XATTROP"]</div><div class='add'>+</div><div class='add'>+        entry_start_time = time.time()</div><div class='add'>+        # sync namespace</div><div class='add'>+        if entries and not ignore_entry_ops:</div><div class='add'>+            # Increment counters for Status</div><div class='add'>+            self.status.inc_value("entry", len(entries))</div><div class='add'>+</div><div class='add'>+            failures = self.slave.server.entry_ops(entries)</div><div class='add'>+</div><div class='add'>+            if gconf.get("gfid-conflict-resolution"):</div><div class='add'>+                count = 0</div><div class='add'>+                if failures:</div><div class='add'>+                    logging.info(lf('Entry ops failed with gfid mismatch',</div><div class='add'>+                                count=len(failures)))</div><div class='add'>+                while failures and count &lt; self.MAX_OE_RETRIES:</div><div class='add'>+                    count += 1</div><div class='add'>+                    self.handle_entry_failures(failures, entries)</div><div class='add'>+                    logging.info(lf('Retry original entries', count=count))</div><div class='add'>+                    failures = self.slave.server.entry_ops(entries)</div><div class='add'>+                    if not failures:</div><div class='add'>+                        logging.info("Successfully fixed all entry ops with "</div><div class='add'>+                                     "gfid mismatch")</div><div class='add'>+                        break</div><div class='add'>+</div><div class='add'>+            self.log_failures(failures, 'gfid', gauxpfx(), 'ENTRY')</div><div class='add'>+            self.status.dec_value("entry", len(entries))</div><div class='add'>+</div><div class='add'>+            # Update Entry stime in Brick Root only in case of Changelog mode</div><div class='add'>+            if self.name in ["live_changelog", "history_changelog"]:</div><div class='add'>+                entry_stime_to_update = (int(change_ts) - 1, 0)</div><div class='add'>+                self.upd_entry_stime(entry_stime_to_update)</div><div class='add'>+                self.status.set_field("last_synced_entry",</div><div class='add'>+                                      entry_stime_to_update[0])</div><div class='add'>+</div><div class='add'>+        self.batch_stats["ENTRY_SYNC_TIME"] += time.time() - entry_start_time</div><div class='add'>+</div><div class='add'>+        if ignore_entry_ops:</div><div class='add'>+            # Book keeping, to show in logs the range of Changelogs skipped</div><div class='add'>+            self.num_skipped_entry_changelogs += 1</div><div class='add'>+            if self.skipped_entry_changelogs_first is None:</div><div class='add'>+                self.skipped_entry_changelogs_first = change_ts</div><div class='add'>+</div><div class='add'>+            self.skipped_entry_changelogs_last = change_ts</div><div class='add'>+</div><div class='add'>+        meta_start_time = time.time()</div><div class='add'>+        # sync metadata</div><div class='add'>+        if meta_gfid:</div><div class='add'>+            meta_entries = []</div><div class='add'>+            for go in meta_gfid:</div><div class='add'>+                if len(go) &gt; 1:</div><div class='add'>+                    st = go[1]</div><div class='add'>+                else:</div><div class='add'>+                    st = lstat(go[0])</div><div class='add'>+                if isinstance(st, int):</div><div class='add'>+                    logging.debug(lf('file got purged in the interim',</div><div class='add'>+                                     file=go[0]))</div><div class='add'>+                    continue</div><div class='add'>+                meta_entries.append(edct('META', go=go[0], stat=st))</div><div class='add'>+            if meta_entries:</div><div class='add'>+                self.status.inc_value("meta", len(meta_entries))</div><div class='add'>+                failures = self.slave.server.meta_ops(meta_entries)</div><div class='add'>+                self.log_failures(failures, 'go', '', 'META')</div><div class='add'>+                self.status.dec_value("meta", len(meta_entries))</div><div class='add'>+</div><div class='add'>+        self.batch_stats["META_SYNC_TIME"] += time.time() - meta_start_time</div><div class='add'>+</div><div class='add'>+        if self.batch_stats["DATA_START_TIME"] == 0:</div><div class='add'>+            self.batch_stats["DATA_START_TIME"] = time.time()</div><div class='add'>+</div><div class='add'>+        # sync data</div><div class='add'>+        if datas:</div><div class='add'>+            self.a_syncdata(datas)</div><div class='add'>+            self.datas_in_batch.update(datas)</div><div class='add'>+</div><div class='add'>+    def process(self, changes, done=1):</div><div class='add'>+        tries = 0</div><div class='add'>+        retry = False</div><div class='add'>+        self.unlinked_gfids = set()</div><div class='add'>+        self.files_in_batch = 0</div><div class='add'>+        self.datas_in_batch = set()</div><div class='add'>+        # Error log disabled till the last round</div><div class='add'>+        self.syncer.disable_errorlog()</div><div class='add'>+        self.skipped_entry_changelogs_first = None</div><div class='add'>+        self.skipped_entry_changelogs_last = None</div><div class='add'>+        self.num_skipped_entry_changelogs = 0</div><div class='add'>+        self.batch_start_time = time.time()</div><div class='add'>+        self.init_fop_batch_stats()</div><div class='add'>+</div><div class='add'>+        while True:</div><div class='add'>+            # first, fire all changelog transfers in parallel. entry and</div><div class='add'>+            # metadata are performed synchronously, therefore in serial.</div><div class='add'>+            # However at the end of each changelog, data is synchronized</div><div class='add'>+            # with syncdata_async() - which means it is serial w.r.t</div><div class='add'>+            # entries/metadata of that changelog but happens in parallel</div><div class='add'>+            # with data of other changelogs.</div><div class='add'>+</div><div class='add'>+            if retry:</div><div class='add'>+                if tries == (gconf.get("max-rsync-retries") - 1):</div><div class='add'>+                    # Enable Error logging if it is last retry</div><div class='add'>+                    self.syncer.enable_errorlog()</div><div class='add'>+</div><div class='add'>+                # Remove Unlinked GFIDs from Queue</div><div class='add'>+                for unlinked_gfid in self.unlinked_gfids:</div><div class='add'>+                    if unlinked_gfid in self.datas_in_batch:</div><div class='add'>+                        self.datas_in_batch.remove(unlinked_gfid)</div><div class='add'>+</div><div class='add'>+                # Retry only Sync. Do not retry entry ops</div><div class='add'>+                if self.datas_in_batch:</div><div class='add'>+                    self.a_syncdata(self.datas_in_batch)</div><div class='add'>+            else:</div><div class='add'>+                for change in changes:</div><div class='add'>+                    logging.debug(lf('processing change',</div><div class='add'>+                                     changelog=change))</div><div class='add'>+                    self.process_change(change, done, retry)</div><div class='add'>+                    if not retry:</div><div class='add'>+                        # number of changelogs processed in the batch</div><div class='add'>+                        self.turns += 1</div><div class='add'>+</div><div class='add'>+            # Now we wait for all the data transfers fired off in the above</div><div class='add'>+            # step to complete. Note that this is not ideal either. Ideally</div><div class='add'>+            # we want to trigger the entry/meta-data transfer of the next</div><div class='add'>+            # batch while waiting for the data transfer of the current batch</div><div class='add'>+            # to finish.</div><div class='add'>+</div><div class='add'>+            # Note that the reason to wait for the data transfer (vs doing it</div><div class='add'>+            # completely in the background and call the changelog_done()</div><div class='add'>+            # asynchronously) is because this waiting acts as a "backpressure"</div><div class='add'>+            # and prevents a spiraling increase of wait stubs from consuming</div><div class='add'>+            # unbounded memory and resources.</div><div class='add'>+</div><div class='add'>+            # update the slave's time with the timestamp of the _last_</div><div class='add'>+            # changelog file time suffix. Since, the changelog prefix time</div><div class='add'>+            # is the time when the changelog was rolled over, introduce a</div><div class='add'>+            # tolerance of 1 second to counter the small delta b/w the</div><div class='add'>+            # marker update and gettimeofday().</div><div class='add'>+            # NOTE: this is only for changelog mode, not xsync.</div><div class='add'>+</div><div class='add'>+            # @change is the last changelog (therefore max time for this batch)</div><div class='add'>+            if self.syncdata_wait():</div><div class='add'>+                self.unlinked_gfids = set()</div><div class='add'>+                if done:</div><div class='add'>+                    xtl = (int(change.split('.')[-1]) - 1, 0)</div><div class='add'>+                    self.upd_stime(xtl)</div><div class='add'>+                    list(map(self.changelog_done_func, changes))</div><div class='add'>+                    self.archive_and_purge_changelogs(changes)</div><div class='add'>+</div><div class='add'>+                # Reset Data counter after sync</div><div class='add'>+                self.status.dec_value("data", self.files_in_batch)</div><div class='add'>+                self.files_in_batch = 0</div><div class='add'>+                self.datas_in_batch = set()</div><div class='add'>+                break</div><div class='add'>+</div><div class='add'>+            # We do not know which changelog transfer failed, retry everything.</div><div class='add'>+            retry = True</div><div class='add'>+            tries += 1</div><div class='add'>+            if tries == gconf.get("max-rsync-retries"):</div><div class='add'>+                logging.error(lf('changelogs could not be processed '</div><div class='add'>+                                 'completely - moving on...',</div><div class='add'>+                                 files=list(map(os.path.basename, changes))))</div><div class='add'>+</div><div class='add'>+                # Reset data counter on failure</div><div class='add'>+                self.status.dec_value("data", self.files_in_batch)</div><div class='add'>+                self.files_in_batch = 0</div><div class='add'>+                self.datas_in_batch = set()</div><div class='add'>+</div><div class='add'>+                if done:</div><div class='add'>+                    xtl = (int(change.split('.')[-1]) - 1, 0)</div><div class='add'>+                    self.upd_stime(xtl)</div><div class='add'>+                    list(map(self.changelog_done_func, changes))</div><div class='add'>+                    self.archive_and_purge_changelogs(changes)</div><div class='add'>+                break</div><div class='add'>+            # it's either entry_ops() or Rsync that failed to do it's</div><div class='add'>+            # job. Mostly it's entry_ops() [which currently has a problem</div><div class='add'>+            # of failing to create an entry but failing to return an errno]</div><div class='add'>+            # Therefore we do not know if it's either Rsync or the freaking</div><div class='add'>+            # entry_ops() that failed... so we retry the _whole_ changelog</div><div class='add'>+            # again.</div><div class='add'>+            # TODO: remove entry retries when it's gets fixed.</div><div class='add'>+            logging.warn(lf('incomplete sync, retrying changelogs',</div><div class='add'>+                            files=list(map(os.path.basename, changes))))</div><div class='add'>+</div><div class='add'>+            # Reset the Data counter before Retry</div><div class='add'>+            self.status.dec_value("data", self.files_in_batch)</div><div class='add'>+            self.files_in_batch = 0</div><div class='add'>+            self.init_fop_batch_stats()</div><div class='add'>+            time.sleep(0.5)</div><div class='add'>+</div><div class='add'>+        # Log the Skipped Entry ops range if any</div><div class='add'>+        if self.skipped_entry_changelogs_first is not None and \</div><div class='add'>+           self.skipped_entry_changelogs_last is not None:</div><div class='add'>+            logging.info(lf("Skipping already processed entry ops",</div><div class='add'>+                            from_changelog=self.skipped_entry_changelogs_first,</div><div class='add'>+                            to_changelog=self.skipped_entry_changelogs_last,</div><div class='add'>+                            num_changelogs=self.num_skipped_entry_changelogs))</div><div class='add'>+</div><div class='add'>+        # Log Current batch details</div><div class='add'>+        if changes:</div><div class='add'>+            logging.info(</div><div class='add'>+                lf("Entry Time Taken",</div><div class='add'>+                   UNL=self.batch_stats["UNLINK"],</div><div class='add'>+                   RMD=self.batch_stats["RMDIR"],</div><div class='add'>+                   CRE=self.batch_stats["CREATE"],</div><div class='add'>+                   MKN=self.batch_stats["MKNOD"],</div><div class='add'>+                   MKD=self.batch_stats["MKDIR"],</div><div class='add'>+                   REN=self.batch_stats["RENAME"],</div><div class='add'>+                   LIN=self.batch_stats["LINK"],</div><div class='add'>+                   SYM=self.batch_stats["SYMLINK"],</div><div class='add'>+                   duration="%.4f" % self.batch_stats["ENTRY_SYNC_TIME"]))</div><div class='add'>+</div><div class='add'>+            logging.info(</div><div class='add'>+                lf("Data/Metadata Time Taken",</div><div class='add'>+                   SETA=self.batch_stats["SETATTR"],</div><div class='add'>+                   meta_duration="%.4f" % self.batch_stats["META_SYNC_TIME"],</div><div class='add'>+                   SETX=self.batch_stats["SETXATTR"],</div><div class='add'>+                   XATT=self.batch_stats["XATTROP"],</div><div class='add'>+                   DATA=self.batch_stats["DATA"],</div><div class='add'>+                   data_duration="%.4f" % (</div><div class='add'>+                       time.time() - self.batch_stats["DATA_START_TIME"])))</div><div class='add'>+</div><div class='add'>+            logging.info(</div><div class='add'>+                lf("Batch Completed",</div><div class='add'>+                   mode=self.name,</div><div class='add'>+                   duration="%.4f" % (time.time() - self.batch_start_time),</div><div class='add'>+                   changelog_start=changes[0].split(".")[-1],</div><div class='add'>+                   changelog_end=changes[-1].split(".")[-1],</div><div class='add'>+                   num_changelogs=len(changes),</div><div class='add'>+                   stime=self.get_data_stime(),</div><div class='add'>+                   entry_stime=self.get_entry_stime()))</div><div class='add'>+</div><div class='add'>+    def upd_entry_stime(self, stime):</div><div class='add'>+        self.slave.server.set_entry_stime(self.FLAT_DIR_HIERARCHY,</div><div class='add'>+                                          self.uuid,</div><div class='add'>+                                          stime)</div><div class='add'>+</div><div class='add'>+    def upd_stime(self, stime, path=None):</div><div class='add'>+        if not path:</div><div class='add'>+            path = self.FLAT_DIR_HIERARCHY</div><div class='add'>+        if not stime == URXTIME:</div><div class='add'>+            self.sendmark(path, stime)</div><div class='add'>+</div><div class='add'>+        # Update last_synced_time in status file based on stime</div><div class='add'>+        # only update stime if stime xattr set to Brick root</div><div class='add'>+        if path == self.FLAT_DIR_HIERARCHY:</div><div class='add'>+            chkpt_time = gconf.getr("checkpoint")</div><div class='add'>+            checkpoint_time = 0</div><div class='add'>+            if chkpt_time is not None:</div><div class='add'>+                checkpoint_time = int(chkpt_time)</div><div class='add'>+</div><div class='add'>+            self.status.set_last_synced(stime, checkpoint_time)</div><div class='add'>+</div><div class='add'>+    def update_worker_remote_node(self):</div><div class='add'>+        node = rconf.args.resource_remote</div><div class='add'>+        node_data = node.split("@")</div><div class='add'>+        node = node_data[-1]</div><div class='add'>+        remote_node_ip, _ = host_brick_split(node)</div><div class='add'>+        self.status.set_slave_node(remote_node_ip)</div><div class='add'>+</div><div class='add'>+    def changelogs_batch_process(self, changes):</div><div class='add'>+        changelogs_batches = []</div><div class='add'>+        current_size = 0</div><div class='add'>+        for c in changes:</div><div class='add'>+            si = os.lstat(c).st_size</div><div class='add'>+            if (si + current_size) &gt; gconf.get("changelog-batch-size"):</div><div class='add'>+                # Create new batch if single Changelog file greater than</div><div class='add'>+                # Max Size! or current batch size exceeds Max size</div><div class='add'>+                changelogs_batches.append([c])</div><div class='add'>+                current_size = si</div><div class='add'>+            else:</div><div class='add'>+                # Append to last batch, if No batches available Create one</div><div class='add'>+                current_size += si</div><div class='add'>+                if not changelogs_batches:</div><div class='add'>+                    changelogs_batches.append([c])</div><div class='add'>+                else:</div><div class='add'>+                    changelogs_batches[-1].append(c)</div><div class='add'>+</div><div class='add'>+        for batch in changelogs_batches:</div><div class='add'>+            logging.debug(lf('processing changes',</div><div class='add'>+                             batch=batch))</div><div class='add'>+            self.process(batch)</div><div class='add'>+</div><div class='add'>+    def crawl(self):</div><div class='add'>+        self.status.set_worker_crawl_status("Changelog Crawl")</div><div class='add'>+        changes = []</div><div class='add'>+        # get stime (from the brick) and purge changelogs</div><div class='add'>+        # that are _historical_ to that time.</div><div class='add'>+        data_stime = self.get_data_stime()</div><div class='add'>+</div><div class='add'>+        libgfchangelog.scan()</div><div class='add'>+        self.crawls += 1</div><div class='add'>+        changes = libgfchangelog.getchanges()</div><div class='add'>+        if changes:</div><div class='add'>+            if data_stime:</div><div class='add'>+                logging.info(lf("slave's time",</div><div class='add'>+                                stime=data_stime))</div><div class='add'>+                processed = [x for x in changes</div><div class='add'>+                             if int(x.split('.')[-1]) &lt; data_stime[0]]</div><div class='add'>+                for pr in processed:</div><div class='add'>+                    logging.debug(</div><div class='add'>+                        lf('skipping already processed change',</div><div class='add'>+                           changelog=os.path.basename(pr)))</div><div class='add'>+                    self.changelog_done_func(pr)</div><div class='add'>+                    changes.remove(pr)</div><div class='add'>+                self.archive_and_purge_changelogs(processed)</div><div class='add'>+</div><div class='add'>+        self.changelogs_batch_process(changes)</div><div class='add'>+</div><div class='add'>+    def register(self, register_time, status):</div><div class='add'>+        self.sleep_interval = gconf.get("change-interval")</div><div class='add'>+        self.changelog_done_func = libgfchangelog.done</div><div class='add'>+        self.tempdir = self.setup_working_dir()</div><div class='add'>+        self.processed_changelogs_dir = os.path.join(self.tempdir,</div><div class='add'>+                                                     ".processed")</div><div class='add'>+        self.name = "live_changelog"</div><div class='add'>+        self.status = status</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+class GMasterChangeloghistoryMixin(GMasterChangelogMixin):</div><div class='add'>+    def register(self, register_time, status):</div><div class='add'>+        self.changelog_register_time = register_time</div><div class='add'>+        self.history_crawl_start_time = register_time</div><div class='add'>+        self.changelog_done_func = libgfchangelog.history_done</div><div class='add'>+        self.history_turns = 0</div><div class='add'>+        self.tempdir = self.setup_working_dir()</div><div class='add'>+        self.processed_changelogs_dir = os.path.join(self.tempdir,</div><div class='add'>+                                                     ".history/.processed")</div><div class='add'>+        self.name = "history_changelog"</div><div class='add'>+        self.status = status</div><div class='add'>+</div><div class='add'>+    def crawl(self):</div><div class='add'>+        self.history_turns += 1</div><div class='add'>+        self.status.set_worker_crawl_status("History Crawl")</div><div class='add'>+        data_stime = self.get_data_stime()</div><div class='add'>+</div><div class='add'>+        end_time = int(time.time())</div><div class='add'>+</div><div class='add'>+        #as start of historical crawl marks Geo-rep worker restart</div><div class='add'>+        if gconf.get("ignore-deletes"):</div><div class='add'>+            logging.info(lf('ignore-deletes config option is set',</div><div class='add'>+                         stime=data_stime))</div><div class='add'>+</div><div class='add'>+        logging.info(lf('starting history crawl',</div><div class='add'>+                        turns=self.history_turns,</div><div class='add'>+                        stime=data_stime,</div><div class='add'>+                        etime=end_time,</div><div class='add'>+                        entry_stime=self.get_entry_stime()))</div><div class='add'>+</div><div class='add'>+        if not data_stime or data_stime == URXTIME:</div><div class='add'>+            raise NoStimeAvailable()</div><div class='add'>+</div><div class='add'>+        # Changelogs backend path is hardcoded as</div><div class='add'>+        # &lt;BRICK_PATH&gt;/.glusterfs/changelogs, if user configured to different</div><div class='add'>+        # location then consuming history will not work(Known issue as of now)</div><div class='add'>+        changelog_path = os.path.join(rconf.args.local_path,</div><div class='add'>+                                      ".glusterfs/changelogs")</div><div class='add'>+        ret, actual_end = libgfchangelog.history_changelog(</div><div class='add'>+            changelog_path,</div><div class='add'>+            data_stime[0],</div><div class='add'>+            end_time,</div><div class='add'>+            gconf.get("sync-jobs"))</div><div class='add'>+</div><div class='add'>+        # scan followed by getchanges till scan returns zero.</div><div class='add'>+        # history_scan() is blocking call, till it gets the number</div><div class='add'>+        # of changelogs to process. Returns zero when no changelogs</div><div class='add'>+        # to be processed. returns positive value as number of changelogs</div><div class='add'>+        # to be processed, which will be fetched using</div><div class='add'>+        # history_getchanges()</div><div class='add'>+        while libgfchangelog.history_scan() &gt; 0:</div><div class='add'>+            self.crawls += 1</div><div class='add'>+</div><div class='add'>+            changes = libgfchangelog.history_getchanges()</div><div class='add'>+            if changes:</div><div class='add'>+                if data_stime:</div><div class='add'>+                    logging.info(lf("slave's time",</div><div class='add'>+                                    stime=data_stime))</div><div class='add'>+                    processed = [x for x in changes</div><div class='add'>+                                 if int(x.split('.')[-1]) &lt; data_stime[0]]</div><div class='add'>+                    for pr in processed:</div><div class='add'>+                        logging.debug(lf('skipping already processed change',</div><div class='add'>+                                         changelog=os.path.basename(pr)))</div><div class='add'>+                        self.changelog_done_func(pr)</div><div class='add'>+                        changes.remove(pr)</div><div class='add'>+</div><div class='add'>+            self.changelogs_batch_process(changes)</div><div class='add'>+</div><div class='add'>+        history_turn_time = int(time.time()) - self.history_crawl_start_time</div><div class='add'>+</div><div class='add'>+        logging.info(lf('finished history crawl',</div><div class='add'>+                        endtime=actual_end,</div><div class='add'>+                        stime=self.get_data_stime(),</div><div class='add'>+                        entry_stime=self.get_entry_stime()))</div><div class='add'>+</div><div class='add'>+        # If TS returned from history_changelog is &lt; register_time</div><div class='add'>+        # then FS crawl may be required, since history is only available</div><div class='add'>+        # till TS returned from history_changelog</div><div class='add'>+        if actual_end &lt; self.changelog_register_time:</div><div class='add'>+            if self.history_turns &lt; 2:</div><div class='add'>+                sleep_time = 1</div><div class='add'>+                if history_turn_time &lt; CHANGELOG_ROLLOVER_TIME:</div><div class='add'>+                    sleep_time = CHANGELOG_ROLLOVER_TIME - history_turn_time</div><div class='add'>+                time.sleep(sleep_time)</div><div class='add'>+                self.history_crawl_start_time = int(time.time())</div><div class='add'>+                self.crawl()</div><div class='add'>+            else:</div><div class='add'>+                # This exception will be caught in resource.py and</div><div class='add'>+                # fallback to xsync for the small gap.</div><div class='add'>+                raise PartialHistoryAvailable(str(actual_end))</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+class GMasterXsyncMixin(GMasterChangelogMixin):</div><div class='add'>+</div><div class='add'>+    """</div><div class='add'>+    This crawl needs to be xtime based (as of now</div><div class='add'>+    it's not. this is because we generate CHANGELOG</div><div class='add'>+    file during each crawl which is then processed</div><div class='add'>+    by process_change()).</div><div class='add'>+    For now it's used as a one-shot initial sync</div><div class='add'>+    mechanism and only syncs directories, regular</div><div class='add'>+    files, hardlinks and symlinks.</div><div class='add'>+    """</div><div class='add'>+</div><div class='add'>+    XSYNC_MAX_ENTRIES = 1 &lt;&lt; 13</div><div class='add'>+</div><div class='add'>+    def register(self, register_time=None, status=None):</div><div class='add'>+        self.status = status</div><div class='add'>+        self.counter = 0</div><div class='add'>+        self.comlist = []</div><div class='add'>+        self.stimes = []</div><div class='add'>+        self.sleep_interval = 60</div><div class='add'>+        self.tempdir = self.setup_working_dir()</div><div class='add'>+        logging.info(lf('Working dir',</div><div class='add'>+                        path=self.tempdir))</div><div class='add'>+        self.tempdir = os.path.join(self.tempdir, 'xsync')</div><div class='add'>+        self.processed_changelogs_dir = self.tempdir</div><div class='add'>+        self.name = "xsync"</div><div class='add'>+        try:</div><div class='add'>+            os.makedirs(self.tempdir)</div><div class='add'>+        except OSError:</div><div class='add'>+            ex = sys.exc_info()[1]</div><div class='add'>+            if ex.errno == EEXIST and os.path.isdir(self.tempdir):</div><div class='add'>+                pass</div><div class='add'>+            else:</div><div class='add'>+                raise</div><div class='add'>+        # Purge stale unprocessed xsync changelogs</div><div class='add'>+        for f in os.listdir(self.tempdir):</div><div class='add'>+            if f.startswith("XSYNC-CHANGELOG"):</div><div class='add'>+                os.remove(os.path.join(self.tempdir, f))</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+    def crawl(self):</div><div class='add'>+        """</div><div class='add'>+        event dispatcher thread</div><div class='add'>+</div><div class='add'>+        this thread dispatches either changelog or synchronizes stime.</div><div class='add'>+        additionally terminates itself on receiving a 'finale' event</div><div class='add'>+        """</div><div class='add'>+        def Xsyncer():</div><div class='add'>+            self.Xcrawl()</div><div class='add'>+        t = Thread(target=Xsyncer)</div><div class='add'>+        t.start()</div><div class='add'>+        logging.info(lf('starting hybrid crawl',</div><div class='add'>+                        stime=self.get_data_stime()))</div><div class='add'>+        self.status.set_worker_crawl_status("Hybrid Crawl")</div><div class='add'>+        while True:</div><div class='add'>+            try:</div><div class='add'>+                item = self.comlist.pop(0)</div><div class='add'>+                if item[0] == 'finale':</div><div class='add'>+                    logging.info(lf('finished hybrid crawl',</div><div class='add'>+                                    stime=self.get_data_stime()))</div><div class='add'>+                    break</div><div class='add'>+                elif item[0] == 'xsync':</div><div class='add'>+                    logging.info(lf('processing xsync changelog',</div><div class='add'>+                                    path=item[1]))</div><div class='add'>+                    self.process([item[1]], 0)</div><div class='add'>+                    self.archive_and_purge_changelogs([item[1]])</div><div class='add'>+                elif item[0] == 'stime':</div><div class='add'>+                    logging.debug(lf('setting slave time',</div><div class='add'>+                                     time=item[1]))</div><div class='add'>+                    self.upd_stime(item[1][1], item[1][0])</div><div class='add'>+                else:</div><div class='add'>+                    logging.warn(lf('unknown tuple in comlist',</div><div class='add'>+                                    entry=item))</div><div class='add'>+            except IndexError:</div><div class='add'>+                time.sleep(1)</div><div class='add'>+</div><div class='add'>+    def write_entry_change(self, prefix, data=[]):</div><div class='add'>+        if not getattr(self, "fh", None):</div><div class='add'>+            self.open()</div><div class='add'>+</div><div class='add'>+        self.fh.write("%s %s\n" % (prefix, ' '.join(data)))</div><div class='add'>+</div><div class='add'>+    def open(self):</div><div class='add'>+        try:</div><div class='add'>+            self.xsync_change = os.path.join(</div><div class='add'>+                self.tempdir, 'XSYNC-CHANGELOG.' + str(int(time.time())))</div><div class='add'>+            self.fh = open(self.xsync_change, 'w')</div><div class='add'>+        except IOError:</div><div class='add'>+            raise</div><div class='add'>+</div><div class='add'>+    def close(self):</div><div class='add'>+        if getattr(self, "fh", None):</div><div class='add'>+            self.fh.flush()</div><div class='add'>+            os.fsync(self.fh.fileno())</div><div class='add'>+            self.fh.close()</div><div class='add'>+            self.fh = None</div><div class='add'>+</div><div class='add'>+    def fname(self):</div><div class='add'>+        return self.xsync_change</div><div class='add'>+</div><div class='add'>+    def put(self, mark, item):</div><div class='add'>+        self.comlist.append((mark, item))</div><div class='add'>+</div><div class='add'>+    def sync_xsync(self, last):</div><div class='add'>+        """schedule a processing of changelog"""</div><div class='add'>+        self.close()</div><div class='add'>+        if self.counter &gt; 0:</div><div class='add'>+            self.put('xsync', self.fname())</div><div class='add'>+        self.counter = 0</div><div class='add'>+        if not last:</div><div class='add'>+            time.sleep(1)  # make sure changelogs are 1 second apart</div><div class='add'>+</div><div class='add'>+    def sync_stime(self, stime=None, last=False):</div><div class='add'>+        """schedule a stime synchronization"""</div><div class='add'>+        if stime:</div><div class='add'>+            self.put('stime', stime)</div><div class='add'>+        if last:</div><div class='add'>+            self.put('finale', None)</div><div class='add'>+</div><div class='add'>+    def sync_done(self, stime=[], last=False):</div><div class='add'>+        self.sync_xsync(last)</div><div class='add'>+        if stime:</div><div class='add'>+            # Send last as True only for last stime entry</div><div class='add'>+            for st in stime[:-1]:</div><div class='add'>+                self.sync_stime(st, False)</div><div class='add'>+</div><div class='add'>+            if stime and stime[-1]:</div><div class='add'>+                self.sync_stime(stime[-1], last)</div><div class='add'>+</div><div class='add'>+    def is_sticky(self, path, mo):</div><div class='add'>+        """check for DHTs linkto sticky bit file"""</div><div class='add'>+        sticky = False</div><div class='add'>+        if mo &amp; 0o1000:</div><div class='add'>+            sticky = self.master.server.linkto_check(path)</div><div class='add'>+        return sticky</div><div class='add'>+</div><div class='add'>+    def Xcrawl(self, path='.', xtr_root=None):</div><div class='add'>+        """</div><div class='add'>+        generate a CHANGELOG file consumable by process_change.</div><div class='add'>+</div><div class='add'>+        slave's xtime (stime) is _cached_ for comparisons across</div><div class='add'>+        the filesystem tree, but set after directory synchronization.</div><div class='add'>+        """</div><div class='add'>+        if path == '.':</div><div class='add'>+            self.crawls += 1</div><div class='add'>+        if not xtr_root:</div><div class='add'>+            # get the root stime and use it for all comparisons</div><div class='add'>+            xtr_root = self.xtime('.', self.slave)</div><div class='add'>+            if isinstance(xtr_root, int):</div><div class='add'>+                if xtr_root != ENOENT:</div><div class='add'>+                    logging.warn(lf("slave cluster not returning the "</div><div class='add'>+                                    "xtime for root",</div><div class='add'>+                                    error=xtr_root))</div><div class='add'>+                xtr_root = self.minus_infinity</div><div class='add'>+        xtl = self.xtime(path)</div><div class='add'>+        if isinstance(xtl, int):</div><div class='add'>+            logging.warn("master cluster's xtime not found")</div><div class='add'>+        xtr = self.xtime(path, self.slave)</div><div class='add'>+        if isinstance(xtr, int):</div><div class='add'>+            if xtr != ENOENT:</div><div class='add'>+                logging.warn(lf("slave cluster not returning the "</div><div class='add'>+                                "xtime for dir",</div><div class='add'>+                                path=path,</div><div class='add'>+                                error=xtr))</div><div class='add'>+            xtr = self.minus_infinity</div><div class='add'>+        xtr = max(xtr, xtr_root)</div><div class='add'>+        zero_zero = (0, 0)</div><div class='add'>+        if xtr_root == zero_zero:</div><div class='add'>+            xtr = self.minus_infinity</div><div class='add'>+        if not self.need_sync(path, xtl, xtr):</div><div class='add'>+            if path == '.':</div><div class='add'>+                self.sync_done([(path, xtl)], True)</div><div class='add'>+            return</div><div class='add'>+        self.xtime_reversion_hook(path, xtl, xtr)</div><div class='add'>+        logging.debug("entering " + path)</div><div class='add'>+        dem = self.master.server.entries(path)</div><div class='add'>+        pargfid = self.master.server.gfid(path)</div><div class='add'>+        if isinstance(pargfid, int):</div><div class='add'>+            logging.warn(lf('skipping directory',</div><div class='add'>+                            path=path))</div><div class='add'>+        for e in dem:</div><div class='add'>+            bname = e</div><div class='add'>+            e = os.path.join(path, e)</div><div class='add'>+            xte = self.xtime(e)</div><div class='add'>+            if isinstance(xte, int):</div><div class='add'>+                logging.warn(lf("irregular xtime",</div><div class='add'>+                                path=e,</div><div class='add'>+                                error=errno.errorcode[xte]))</div><div class='add'>+                continue</div><div class='add'>+            if not self.need_sync(e, xte, xtr):</div><div class='add'>+                continue</div><div class='add'>+            st = self.master.server.lstat(e)</div><div class='add'>+            if isinstance(st, int):</div><div class='add'>+                logging.warn(lf('got purged in the interim',</div><div class='add'>+                                path=e))</div><div class='add'>+                continue</div><div class='add'>+            if self.is_sticky(e, st.st_mode):</div><div class='add'>+                logging.debug(lf('ignoring sticky bit file',</div><div class='add'>+                                 path=e))</div><div class='add'>+                continue</div><div class='add'>+            gfid = self.master.server.gfid(e)</div><div class='add'>+            if isinstance(gfid, int):</div><div class='add'>+                logging.warn(lf('skipping entry',</div><div class='add'>+                                path=e))</div><div class='add'>+                continue</div><div class='add'>+            mo = st.st_mode</div><div class='add'>+            self.counter += 1 if ((stat.S_ISDIR(mo) or</div><div class='add'>+                                   stat.S_ISLNK(mo) or</div><div class='add'>+                                   stat.S_ISREG(mo))) else 0</div><div class='add'>+            if self.counter == self.XSYNC_MAX_ENTRIES:</div><div class='add'>+                self.sync_done(self.stimes, False)</div><div class='add'>+                self.stimes = []</div><div class='add'>+            if stat.S_ISDIR(mo):</div><div class='add'>+                self.write_entry_change("E",</div><div class='add'>+                                        [gfid, 'MKDIR', str(mo),</div><div class='add'>+                                         str(0), str(0), escape_space_newline(</div><div class='add'>+                                             os.path.join(pargfid, bname))])</div><div class='add'>+                self.write_entry_change("M", [gfid, "SETATTR", str(st.st_uid),</div><div class='add'>+                                              str(st.st_gid), str(st.st_mode),</div><div class='add'>+                                              str(st.st_atime),</div><div class='add'>+                                              str(st.st_mtime)])</div><div class='add'>+                self.Xcrawl(e, xtr_root)</div><div class='add'>+                stime_to_update = xte</div><div class='add'>+                # Live Changelog Start time indicates that from that time</div><div class='add'>+                # onwards Live changelogs are available. If we update stime</div><div class='add'>+                # greater than live_changelog_start time then Geo-rep will</div><div class='add'>+                # skip those changelogs as already processed. But Xsync</div><div class='add'>+                # actually failed to sync the deletes and Renames. Update</div><div class='add'>+                # stime as min(Live_changelogs_time, Actual_stime) When it</div><div class='add'>+                # switches to Changelog mode, it syncs Deletes and Renames.</div><div class='add'>+                if self.live_changelog_start_time:</div><div class='add'>+                    stime_to_update = min(self.live_changelog_start_time, xte)</div><div class='add'>+                self.stimes.append((e, stime_to_update))</div><div class='add'>+            elif stat.S_ISLNK(mo):</div><div class='add'>+                self.write_entry_change(</div><div class='add'>+                    "E", [gfid, 'SYMLINK', escape_space_newline(</div><div class='add'>+                        os.path.join(pargfid, bname))])</div><div class='add'>+            elif stat.S_ISREG(mo):</div><div class='add'>+                nlink = st.st_nlink</div><div class='add'>+                nlink -= 1  # fixup backend stat link count</div><div class='add'>+                # if a file has a hardlink, create a Changelog entry as</div><div class='add'>+                # 'LINK' so the slave side will decide if to create the</div><div class='add'>+                # new entry, or to create link.</div><div class='add'>+                if nlink == 1:</div><div class='add'>+                    self.write_entry_change("E",</div><div class='add'>+                                            [gfid, 'MKNOD', str(mo),</div><div class='add'>+                                             str(0), str(0),</div><div class='add'>+                                             escape_space_newline(</div><div class='add'>+                                                 os.path.join(</div><div class='add'>+                                                     pargfid, bname))])</div><div class='add'>+                else:</div><div class='add'>+                    self.write_entry_change(</div><div class='add'>+                        "E", [gfid, 'LINK', escape_space_newline(</div><div class='add'>+                            os.path.join(pargfid, bname))])</div><div class='add'>+                self.write_entry_change("D", [gfid])</div><div class='add'>+        if path == '.':</div><div class='add'>+            stime_to_update = xtl</div><div class='add'>+            if self.live_changelog_start_time:</div><div class='add'>+                stime_to_update = min(self.live_changelog_start_time, xtl)</div><div class='add'>+            self.stimes.append((path, stime_to_update))</div><div class='add'>+            self.sync_done(self.stimes, True)</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+class BoxClosedErr(Exception):</div><div class='add'>+    pass</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+class PostBox(list):</div><div class='add'>+</div><div class='add'>+    """synchronized collection for storing things thought of as "requests" """</div><div class='add'>+</div><div class='add'>+    def __init__(self, *a):</div><div class='add'>+        list.__init__(self, *a)</div><div class='add'>+        # too bad Python stdlib does not have read/write locks...</div><div class='add'>+        # it would suffivce to grab the lock in .append as reader, in .close as</div><div class='add'>+        # writer</div><div class='add'>+        self.lever = Condition()</div><div class='add'>+        self.open = True</div><div class='add'>+        self.done = False</div><div class='add'>+</div><div class='add'>+    def wait(self):</div><div class='add'>+        """wait on requests to be processed"""</div><div class='add'>+        self.lever.acquire()</div><div class='add'>+        if not self.done:</div><div class='add'>+            self.lever.wait()</div><div class='add'>+        self.lever.release()</div><div class='add'>+        return self.result</div><div class='add'>+</div><div class='add'>+    def wakeup(self, data):</div><div class='add'>+        """wake up requestors with the result"""</div><div class='add'>+        self.result = data</div><div class='add'>+        self.lever.acquire()</div><div class='add'>+        self.done = True</div><div class='add'>+        self.lever.notifyAll()</div><div class='add'>+        self.lever.release()</div><div class='add'>+</div><div class='add'>+    def append(self, e):</div><div class='add'>+        """post a request"""</div><div class='add'>+        self.lever.acquire()</div><div class='add'>+        if not self.open:</div><div class='add'>+            raise BoxClosedErr</div><div class='add'>+        list.append(self, e)</div><div class='add'>+        self.lever.release()</div><div class='add'>+</div><div class='add'>+    def close(self):</div><div class='add'>+        """prohibit the posting of further requests"""</div><div class='add'>+        self.lever.acquire()</div><div class='add'>+        self.open = False</div><div class='add'>+        self.lever.release()</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+class Syncer(object):</div><div class='add'>+</div><div class='add'>+    """a staged queue to relay rsync requests to rsync workers</div><div class='add'>+</div><div class='add'>+    By "staged queue" its meant that when a consumer comes to the</div><div class='add'>+    queue, it takes _all_ entries, leaving the queue empty.</div><div class='add'>+    (I don't know if there is an official term for this pattern.)</div><div class='add'>+</div><div class='add'>+    The queue uses a PostBox to accumulate incoming items.</div><div class='add'>+    When a consumer (rsync worker) comes, a new PostBox is</div><div class='add'>+    set up and the old one is passed on to the consumer.</div><div class='add'>+</div><div class='add'>+    Instead of the simplistic scheme of having one big lock</div><div class='add'>+    which synchronizes both the addition of new items and</div><div class='add'>+    PostBox exchanges, use a separate lock to arbitrate consumers,</div><div class='add'>+    and rely on PostBox's synchronization mechanisms take</div><div class='add'>+    care about additions.</div><div class='add'>+</div><div class='add'>+    There is a corner case racy situation, producers vs. consumers,</div><div class='add'>+    which is not handled by this scheme: namely, when the PostBox</div><div class='add'>+    exchange occurs in between being passed to the producer for posting</div><div class='add'>+    and the post placement. But that's what Postbox.close is for:</div><div class='add'>+    such a posting will find the PostBox closed, in which case</div><div class='add'>+    the producer can re-try posting against the actual PostBox of</div><div class='add'>+    the queue.</div><div class='add'>+</div><div class='add'>+    To aid accumlation of items in the PostBoxen before grabbed</div><div class='add'>+    by an rsync worker, the worker goes to sleep a bit after</div><div class='add'>+    each completed syncjob.</div><div class='add'>+    """</div><div class='add'>+</div><div class='add'>+    def __init__(self, slave, sync_engine, resilient_errnos=[]):</div><div class='add'>+        """spawn worker threads"""</div><div class='add'>+        self.log_err = False</div><div class='add'>+        self.slave = slave</div><div class='add'>+        self.lock = Lock()</div><div class='add'>+        self.pb = PostBox()</div><div class='add'>+        self.sync_engine = sync_engine</div><div class='add'>+        self.errnos_ok = resilient_errnos</div><div class='add'>+        for i in range(gconf.get("sync-jobs")):</div><div class='add'>+            t = Thread(target=self.syncjob, args=(i + 1, ))</div><div class='add'>+            t.start()</div><div class='add'>+</div><div class='add'>+    def syncjob(self, job_id):</div><div class='add'>+        """the life of a worker"""</div><div class='add'>+        while True:</div><div class='add'>+            pb = None</div><div class='add'>+            while True:</div><div class='add'>+                self.lock.acquire()</div><div class='add'>+                if self.pb:</div><div class='add'>+                    pb, self.pb = self.pb, PostBox()</div><div class='add'>+                self.lock.release()</div><div class='add'>+                if pb:</div><div class='add'>+                    break</div><div class='add'>+                time.sleep(0.5)</div><div class='add'>+            pb.close()</div><div class='add'>+            start = time.time()</div><div class='add'>+            po = self.sync_engine(pb, self.log_err)</div><div class='add'>+            logging.info(lf("Sync Time Taken",</div><div class='add'>+                            job=job_id,</div><div class='add'>+                            num_files=len(pb),</div><div class='add'>+                            return_code=po.returncode,</div><div class='add'>+                            duration="%.4f" % (time.time() - start)))</div><div class='add'>+</div><div class='add'>+            if po.returncode == 0:</div><div class='add'>+                ret = (True, 0)</div><div class='add'>+            elif po.returncode in self.errnos_ok:</div><div class='add'>+                ret = (False, po.returncode)</div><div class='add'>+            else:</div><div class='add'>+                po.errfail()</div><div class='add'>+            pb.wakeup(ret)</div><div class='add'>+</div><div class='add'>+    def add(self, e):</div><div class='add'>+        while True:</div><div class='add'>+            pb = self.pb</div><div class='add'>+            try:</div><div class='add'>+                pb.append(e)</div><div class='add'>+                return pb</div><div class='add'>+            except BoxClosedErr:</div><div class='add'>+                pass</div><div class='add'>+</div><div class='add'>+    def enable_errorlog(self):</div><div class='add'>+        self.log_err = True</div><div class='add'>+</div><div class='add'>+    def disable_errorlog(self):</div><div class='add'>+        self.log_err = False</div><div class='head'>diff --git a/geo-replication/syncdaemon/monitor.py b/geo-replication/syncdaemon/monitor.py<br/>new file mode 100644<br/>index 00000000000..6aa7b9dfc99<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/geo-replication/syncdaemon/monitor.py?id=d1d7a6f35c816822fab51c820e25023863c239c1'>geo-replication/syncdaemon/monitor.py</a></div><div class='hunk'>@@ -0,0 +1,395 @@</div><div class='add'>+#</div><div class='add'>+# Copyright (c) 2011-2014 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+# This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+# This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+# General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+# later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+# cases as published by the Free Software Foundation.</div><div class='add'>+#</div><div class='add'>+</div><div class='add'>+import os</div><div class='add'>+import sys</div><div class='add'>+import time</div><div class='add'>+import signal</div><div class='add'>+import logging</div><div class='add'>+import xml.etree.ElementTree as XET</div><div class='add'>+from threading import Lock</div><div class='add'>+from errno import ECHILD, ESRCH</div><div class='add'>+import random</div><div class='add'>+</div><div class='add'>+from resource import SSH</div><div class='add'>+import gsyncdconfig as gconf</div><div class='add'>+import libgfchangelog</div><div class='add'>+from rconf import rconf</div><div class='add'>+from syncdutils import (select, waitpid, errno_wrap, lf, grabpidfile,</div><div class='add'>+                        set_term_handler, GsyncdError,</div><div class='add'>+                        Thread, finalize, Volinfo, VolinfoFromGconf,</div><div class='add'>+                        gf_event, EVENT_GEOREP_FAULTY, get_up_nodes,</div><div class='add'>+                        unshare_propagation_supported)</div><div class='add'>+from gsyncdstatus import GeorepStatus, set_monitor_status</div><div class='add'>+import py2py3</div><div class='add'>+from py2py3 import pipe</div><div class='add'>+</div><div class='add'>+ParseError = XET.ParseError if hasattr(XET, 'ParseError') else SyntaxError</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def get_subvol_num(brick_idx, vol, hot):</div><div class='add'>+    tier = vol.is_tier()</div><div class='add'>+    disperse_count = vol.disperse_count(tier, hot)</div><div class='add'>+    replica_count = vol.replica_count(tier, hot)</div><div class='add'>+    distribute_count = vol.distribution_count(tier, hot)</div><div class='add'>+    gconf.setconfig("master-distribution-count", distribute_count)</div><div class='add'>+</div><div class='add'>+    if (tier and not hot):</div><div class='add'>+        brick_idx = brick_idx - vol.get_hot_bricks_count(tier)</div><div class='add'>+</div><div class='add'>+    subvol_size = disperse_count if disperse_count &gt; 0 else replica_count</div><div class='add'>+    cnt = int((brick_idx + 1) / subvol_size)</div><div class='add'>+    rem = (brick_idx + 1) % subvol_size</div><div class='add'>+    if rem &gt; 0:</div><div class='add'>+        cnt = cnt + 1</div><div class='add'>+</div><div class='add'>+    if (tier and hot):</div><div class='add'>+        return "hot_" + str(cnt)</div><div class='add'>+    elif (tier and not hot):</div><div class='add'>+        return "cold_" + str(cnt)</div><div class='add'>+    else:</div><div class='add'>+        return str(cnt)</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+class Monitor(object):</div><div class='add'>+</div><div class='add'>+    """class which spawns and manages gsyncd workers"""</div><div class='add'>+</div><div class='add'>+    ST_INIT = 'Initializing...'</div><div class='add'>+    ST_STARTED = 'Started'</div><div class='add'>+    ST_STABLE = 'Active'</div><div class='add'>+    ST_FAULTY = 'Faulty'</div><div class='add'>+    ST_INCON = 'inconsistent'</div><div class='add'>+    _ST_ORD = [ST_STABLE, ST_INIT, ST_FAULTY, ST_INCON]</div><div class='add'>+</div><div class='add'>+    def __init__(self):</div><div class='add'>+        self.lock = Lock()</div><div class='add'>+        self.state = {}</div><div class='add'>+        self.status = {}</div><div class='add'>+</div><div class='add'>+    @staticmethod</div><div class='add'>+    def terminate():</div><div class='add'>+        # relax one SIGTERM by setting a handler that sets back</div><div class='add'>+        # standard handler</div><div class='add'>+        set_term_handler(lambda *a: set_term_handler())</div><div class='add'>+        # give a chance to graceful exit</div><div class='add'>+        errno_wrap(os.kill, [-os.getpid(), signal.SIGTERM], [ESRCH])</div><div class='add'>+</div><div class='add'>+    def monitor(self, w, argv, cpids, slave_vol, slave_host, master,</div><div class='add'>+                suuid, slavenodes):</div><div class='add'>+        """the monitor loop</div><div class='add'>+</div><div class='add'>+        Basic logic is a blantantly simple blunt heuristics:</div><div class='add'>+        if spawned client survives 60 secs, it's considered OK.</div><div class='add'>+        This servers us pretty well as it's not vulneralbe to</div><div class='add'>+        any kind of irregular behavior of the child...</div><div class='add'>+</div><div class='add'>+        ... well, except for one: if children is hung up on</div><div class='add'>+        waiting for some event, it can survive aeons, still</div><div class='add'>+        will be defunct. So we tweak the above logic to</div><div class='add'>+        expect the worker to send us a signal within 60 secs</div><div class='add'>+        (in the form of closing its end of a pipe). The worker</div><div class='add'>+        does this when it's done with the setup stage</div><div class='add'>+        ready to enter the service loop (note it's the setup</div><div class='add'>+        stage which is vulnerable to hangs -- the full</div><div class='add'>+        blown worker blows up on EPIPE if the net goes down,</div><div class='add'>+        due to the keep-alive thread)</div><div class='add'>+        """</div><div class='add'>+        if not self.status.get(w[0]['dir'], None):</div><div class='add'>+            self.status[w[0]['dir']] = GeorepStatus(gconf.get("state-file"),</div><div class='add'>+                                                    w[0]['host'],</div><div class='add'>+                                                    w[0]['dir'],</div><div class='add'>+                                                    w[0]['uuid'],</div><div class='add'>+                                                    master,</div><div class='add'>+                                                    "%s::%s" % (slave_host,</div><div class='add'>+                                                                slave_vol))</div><div class='add'>+        ret = 0</div><div class='add'>+</div><div class='add'>+        def nwait(p, o=0):</div><div class='add'>+            try:</div><div class='add'>+                p2, r = waitpid(p, o)</div><div class='add'>+                if not p2:</div><div class='add'>+                    return</div><div class='add'>+                return r</div><div class='add'>+            except OSError as e:</div><div class='add'>+                # no child process, this happens if the child process</div><div class='add'>+                # already died and has been cleaned up</div><div class='add'>+                if e.errno == ECHILD:</div><div class='add'>+                    return -1</div><div class='add'>+                else:</div><div class='add'>+                    raise</div><div class='add'>+</div><div class='add'>+        def exit_signalled(s):</div><div class='add'>+            """ child terminated due to receipt of SIGUSR1 """</div><div class='add'>+            return (os.WIFSIGNALED(s) and (os.WTERMSIG(s) == signal.SIGUSR1))</div><div class='add'>+</div><div class='add'>+        def exit_status(s):</div><div class='add'>+            if os.WIFEXITED(s):</div><div class='add'>+                return os.WEXITSTATUS(s)</div><div class='add'>+            return 1</div><div class='add'>+</div><div class='add'>+        conn_timeout = gconf.get("connection-timeout")</div><div class='add'>+        while ret in (0, 1):</div><div class='add'>+            remote_user, remote_host = w[1][0].split("@")</div><div class='add'>+            remote_id = w[1][1]</div><div class='add'>+            # Check the status of the connected slave node</div><div class='add'>+            # If the connected slave node is down then try to connect to</div><div class='add'>+            # different up node.</div><div class='add'>+            current_slave_host = remote_host</div><div class='add'>+            slave_up_hosts = get_up_nodes(slavenodes, gconf.get("ssh-port"))</div><div class='add'>+</div><div class='add'>+            if (current_slave_host, remote_id) not in slave_up_hosts:</div><div class='add'>+                if len(slave_up_hosts) &gt; 0:</div><div class='add'>+                    remote_new = random.choice(slave_up_hosts)</div><div class='add'>+                    remote_host = "%s@%s" % (remote_user, remote_new[0])</div><div class='add'>+                    remote_id = remote_new[1]</div><div class='add'>+</div><div class='add'>+            # Spawn the worker in lock to avoid fd leak</div><div class='add'>+            self.lock.acquire()</div><div class='add'>+</div><div class='add'>+            self.status[w[0]['dir']].set_worker_status(self.ST_INIT)</div><div class='add'>+            logging.info(lf('starting gsyncd worker',</div><div class='add'>+                            brick=w[0]['dir'],</div><div class='add'>+                            slave_node=remote_host))</div><div class='add'>+</div><div class='add'>+            pr, pw = pipe()</div><div class='add'>+            cpid = os.fork()</div><div class='add'>+            if cpid == 0:</div><div class='add'>+                os.close(pr)</div><div class='add'>+</div><div class='add'>+                args_to_worker = argv + [</div><div class='add'>+                    'worker',</div><div class='add'>+                    rconf.args.master,</div><div class='add'>+                    rconf.args.slave,</div><div class='add'>+                    '--feedback-fd', str(pw),</div><div class='add'>+                    '--local-path', w[0]['dir'],</div><div class='add'>+                    '--local-node', w[0]['host'],</div><div class='add'>+                    '--local-node-id', w[0]['uuid'],</div><div class='add'>+                    '--slave-id', suuid,</div><div class='add'>+                    '--subvol-num', str(w[2]),</div><div class='add'>+                    '--resource-remote', remote_host,</div><div class='add'>+                    '--resource-remote-id', remote_id</div><div class='add'>+                ]</div><div class='add'>+</div><div class='add'>+                if rconf.args.config_file is not None:</div><div class='add'>+                    args_to_worker += ['-c', rconf.args.config_file]</div><div class='add'>+</div><div class='add'>+                if w[3]:</div><div class='add'>+                    args_to_worker.append("--is-hottier")</div><div class='add'>+</div><div class='add'>+                if rconf.args.debug:</div><div class='add'>+                    args_to_worker.append("--debug")</div><div class='add'>+</div><div class='add'>+                access_mount = gconf.get("access-mount")</div><div class='add'>+                if access_mount:</div><div class='add'>+                    os.execv(sys.executable, args_to_worker)</div><div class='add'>+                else:</div><div class='add'>+                    if unshare_propagation_supported():</div><div class='add'>+                        logging.debug("Worker would mount volume privately")</div><div class='add'>+                        unshare_cmd = ['unshare', '-m', '--propagation',</div><div class='add'>+                                       'private']</div><div class='add'>+                        cmd = unshare_cmd + args_to_worker</div><div class='add'>+                        os.execvp("unshare", cmd)</div><div class='add'>+                    else:</div><div class='add'>+                        logging.debug("Mount is not private. It would be lazy"</div><div class='add'>+                                      " umounted")</div><div class='add'>+                        os.execv(sys.executable, args_to_worker)</div><div class='add'>+</div><div class='add'>+            cpids.add(cpid)</div><div class='add'>+            os.close(pw)</div><div class='add'>+</div><div class='add'>+            self.lock.release()</div><div class='add'>+</div><div class='add'>+            t0 = time.time()</div><div class='add'>+            so = select((pr,), (), (), conn_timeout)[0]</div><div class='add'>+            os.close(pr)</div><div class='add'>+</div><div class='add'>+            if so:</div><div class='add'>+                ret = nwait(cpid, os.WNOHANG)</div><div class='add'>+</div><div class='add'>+                if ret is not None:</div><div class='add'>+                    logging.info(lf("worker died before establishing "</div><div class='add'>+                                    "connection",</div><div class='add'>+                                    brick=w[0]['dir']))</div><div class='add'>+                else:</div><div class='add'>+                    logging.debug("worker(%s) connected" % w[0]['dir'])</div><div class='add'>+                    while time.time() &lt; t0 + conn_timeout:</div><div class='add'>+                        ret = nwait(cpid, os.WNOHANG)</div><div class='add'>+</div><div class='add'>+                        if ret is not None:</div><div class='add'>+                            logging.info(lf("worker died in startup phase",</div><div class='add'>+                                            brick=w[0]['dir']))</div><div class='add'>+                            break</div><div class='add'>+</div><div class='add'>+                        time.sleep(1)</div><div class='add'>+            else:</div><div class='add'>+                logging.info(</div><div class='add'>+                    lf("Worker not confirmed after wait, aborting it. "</div><div class='add'>+                       "Gsyncd invocation on remote slave via SSH or "</div><div class='add'>+                       "gluster master mount might have hung. Please "</div><div class='add'>+                       "check the above logs for exact issue and check "</div><div class='add'>+                       "master or slave volume for errors. Restarting "</div><div class='add'>+                       "master/slave volume accordingly might help.",</div><div class='add'>+                       brick=w[0]['dir'],</div><div class='add'>+                       timeout=conn_timeout))</div><div class='add'>+                errno_wrap(os.kill, [cpid, signal.SIGKILL], [ESRCH])</div><div class='add'>+                ret = nwait(cpid)</div><div class='add'>+            if ret is None:</div><div class='add'>+                ret = nwait(cpid)</div><div class='add'>+            if exit_signalled(ret):</div><div class='add'>+                ret = 0</div><div class='add'>+            else:</div><div class='add'>+                ret = exit_status(ret)</div><div class='add'>+                if ret in (0, 1):</div><div class='add'>+                    self.status[w[0]['dir']].set_worker_status(self.ST_FAULTY)</div><div class='add'>+                    gf_event(EVENT_GEOREP_FAULTY,</div><div class='add'>+                             master_volume=master.volume,</div><div class='add'>+                             master_node=w[0]['host'],</div><div class='add'>+                             master_node_id=w[0]['uuid'],</div><div class='add'>+                             slave_host=slave_host,</div><div class='add'>+                             slave_volume=slave_vol,</div><div class='add'>+                             current_slave_host=current_slave_host,</div><div class='add'>+                             brick_path=w[0]['dir'])</div><div class='add'>+            time.sleep(10)</div><div class='add'>+        self.status[w[0]['dir']].set_worker_status(self.ST_INCON)</div><div class='add'>+        return ret</div><div class='add'>+</div><div class='add'>+    def multiplex(self, wspx, suuid, slave_vol, slave_host, master, slavenodes):</div><div class='add'>+        argv = [os.path.basename(sys.executable), sys.argv[0]]</div><div class='add'>+</div><div class='add'>+        cpids = set()</div><div class='add'>+        ta = []</div><div class='add'>+        for wx in wspx:</div><div class='add'>+            def wmon(w):</div><div class='add'>+                cpid, _ = self.monitor(w, argv, cpids, slave_vol,</div><div class='add'>+                                       slave_host, master, suuid, slavenodes)</div><div class='add'>+                time.sleep(1)</div><div class='add'>+                self.lock.acquire()</div><div class='add'>+                for cpid in cpids:</div><div class='add'>+                    errno_wrap(os.kill, [cpid, signal.SIGKILL], [ESRCH])</div><div class='add'>+                self.lock.release()</div><div class='add'>+                finalize(exval=1)</div><div class='add'>+            t = Thread(target=wmon, args=[wx])</div><div class='add'>+            t.start()</div><div class='add'>+            ta.append(t)</div><div class='add'>+</div><div class='add'>+        # monitor status was being updated in each monitor thread. It</div><div class='add'>+        # should not be done as it can cause deadlock for a worker start.</div><div class='add'>+        # set_monitor_status uses flock to synchronize multple instances</div><div class='add'>+        # updating the file. Since each monitor thread forks worker,</div><div class='add'>+        # these processes can hold the reference to fd of status</div><div class='add'>+        # file causing deadlock to workers which starts later as flock</div><div class='add'>+        # will not be release until all references to same fd is closed.</div><div class='add'>+        # It will also cause fd leaks.</div><div class='add'>+</div><div class='add'>+        self.lock.acquire()</div><div class='add'>+        set_monitor_status(gconf.get("state-file"), self.ST_STARTED)</div><div class='add'>+        self.lock.release()</div><div class='add'>+        for t in ta:</div><div class='add'>+            t.join()</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def distribute(master, slave):</div><div class='add'>+    if rconf.args.use_gconf_volinfo:</div><div class='add'>+        mvol = VolinfoFromGconf(master.volume, master=True)</div><div class='add'>+    else:</div><div class='add'>+        mvol = Volinfo(master.volume, master.host, master=True)</div><div class='add'>+    logging.debug('master bricks: ' + repr(mvol.bricks))</div><div class='add'>+    prelude = []</div><div class='add'>+    slave_host = None</div><div class='add'>+    slave_vol = None</div><div class='add'>+</div><div class='add'>+    prelude = [gconf.get("ssh-command")] + \</div><div class='add'>+        gconf.get("ssh-options").split() + \</div><div class='add'>+        ["-p", str(gconf.get("ssh-port"))] + \</div><div class='add'>+        [slave.remote_addr]</div><div class='add'>+</div><div class='add'>+    logging.debug('slave SSH gateway: ' + slave.remote_addr)</div><div class='add'>+</div><div class='add'>+    if rconf.args.use_gconf_volinfo:</div><div class='add'>+        svol = VolinfoFromGconf(slave.volume, master=False)</div><div class='add'>+    else:</div><div class='add'>+        svol = Volinfo(slave.volume, "localhost", prelude, master=False)</div><div class='add'>+</div><div class='add'>+    sbricks = svol.bricks</div><div class='add'>+    suuid = svol.uuid</div><div class='add'>+    slave_host = slave.remote_addr.split('@')[-1]</div><div class='add'>+    slave_vol = slave.volume</div><div class='add'>+</div><div class='add'>+    # save this xattr for the session delete command</div><div class='add'>+    old_stime_xattr_prefix = gconf.get("stime-xattr-prefix", None)</div><div class='add'>+    new_stime_xattr_prefix = "trusted.glusterfs." + mvol.uuid + "." + \</div><div class='add'>+                             svol.uuid</div><div class='add'>+    if not old_stime_xattr_prefix or \</div><div class='add'>+       old_stime_xattr_prefix != new_stime_xattr_prefix:</div><div class='add'>+        gconf.setconfig("stime-xattr-prefix", new_stime_xattr_prefix)</div><div class='add'>+</div><div class='add'>+    logging.debug('slave bricks: ' + repr(sbricks))</div><div class='add'>+</div><div class='add'>+    slavenodes = set((b['host'], b["uuid"]) for b in sbricks)</div><div class='add'>+    rap = SSH.parse_ssh_address(slave)</div><div class='add'>+    slaves = [(rap['user'] + '@' + h[0], h[1]) for h in slavenodes]</div><div class='add'>+</div><div class='add'>+    workerspex = []</div><div class='add'>+    for idx, brick in enumerate(mvol.bricks):</div><div class='add'>+        if rconf.args.local_node_id == brick['uuid']:</div><div class='add'>+            is_hot = mvol.is_hot(":".join([brick['host'], brick['dir']]))</div><div class='add'>+            workerspex.append((brick,</div><div class='add'>+                               slaves[idx % len(slaves)],</div><div class='add'>+                               get_subvol_num(idx, mvol, is_hot),</div><div class='add'>+                               is_hot))</div><div class='add'>+    logging.debug('worker specs: ' + repr(workerspex))</div><div class='add'>+    return workerspex, suuid, slave_vol, slave_host, master, slavenodes</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def monitor(local, remote):</div><div class='add'>+    # Check if gsyncd restarted in pause state. If</div><div class='add'>+    # yes, send SIGSTOP to negative of monitor pid</div><div class='add'>+    # to go back to pause state.</div><div class='add'>+    if rconf.args.pause_on_start:</div><div class='add'>+        errno_wrap(os.kill, [-os.getpid(), signal.SIGSTOP], [ESRCH])</div><div class='add'>+</div><div class='add'>+    """oh yeah, actually Monitor is used as singleton, too"""</div><div class='add'>+    return Monitor().multiplex(*distribute(local, remote))</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def startup(go_daemon=True):</div><div class='add'>+    """set up logging, pidfile grabbing, daemonization"""</div><div class='add'>+    pid_file = gconf.get("pid-file")</div><div class='add'>+    if not grabpidfile():</div><div class='add'>+        sys.stderr.write("pidfile is taken, exiting.\n")</div><div class='add'>+        sys.exit(2)</div><div class='add'>+    rconf.pid_file_owned = True</div><div class='add'>+</div><div class='add'>+    if not go_daemon:</div><div class='add'>+        return</div><div class='add'>+</div><div class='add'>+    x, y = pipe()</div><div class='add'>+    cpid = os.fork()</div><div class='add'>+    if cpid:</div><div class='add'>+        os.close(x)</div><div class='add'>+        sys.exit()</div><div class='add'>+    os.close(y)</div><div class='add'>+    os.setsid()</div><div class='add'>+    dn = os.open(os.devnull, os.O_RDWR)</div><div class='add'>+    for f in (sys.stdin, sys.stdout, sys.stderr):</div><div class='add'>+        os.dup2(dn, f.fileno())</div><div class='add'>+</div><div class='add'>+    if not grabpidfile(pid_file + '.tmp'):</div><div class='add'>+        raise GsyncdError("cannot grab temporary pidfile")</div><div class='add'>+</div><div class='add'>+    os.rename(pid_file + '.tmp', pid_file)</div><div class='add'>+</div><div class='add'>+    # wait for parent to terminate</div><div class='add'>+    # so we can start up with</div><div class='add'>+    # no messing from the dirty</div><div class='add'>+    # ol' bustard</div><div class='add'>+    select((x,), (), ())</div><div class='add'>+    os.close(x)</div><div class='head'>diff --git a/geo-replication/syncdaemon/py2py3.py b/geo-replication/syncdaemon/py2py3.py<br/>new file mode 100644<br/>index 00000000000..f9c76e1b50a<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/geo-replication/syncdaemon/py2py3.py?id=d1d7a6f35c816822fab51c820e25023863c239c1'>geo-replication/syncdaemon/py2py3.py</a></div><div class='hunk'>@@ -0,0 +1,184 @@</div><div class='add'>+#</div><div class='add'>+# Copyright (c) 2018 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+# This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+# This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+# General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+# later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+# cases as published by the Free Software Foundation.</div><div class='add'>+#</div><div class='add'>+</div><div class='add'>+# All python2/python3 compatibility routines</div><div class='add'>+</div><div class='add'>+import sys</div><div class='add'>+import os</div><div class='add'>+import stat</div><div class='add'>+import struct</div><div class='add'>+from syncdutils import umask</div><div class='add'>+from ctypes import create_string_buffer</div><div class='add'>+</div><div class='add'>+if sys.version_info &gt;= (3,):</div><div class='add'>+    def pipe():</div><div class='add'>+        (r, w) = os.pipe()</div><div class='add'>+        os.set_inheritable(r, True)</div><div class='add'>+        os.set_inheritable(w, True)</div><div class='add'>+        return (r, w)</div><div class='add'>+</div><div class='add'>+    # Raw conversion of bytearray to string. Used in the cases where</div><div class='add'>+    # buffer is created by create_string_buffer which is a 8-bit char</div><div class='add'>+    # array and passed to syscalls to fetch results. Using encode/decode</div><div class='add'>+    # doesn't work as it converts to string altering the size.</div><div class='add'>+    def bytearray_to_str(byte_arr):</div><div class='add'>+        return ''.join([chr(b) for b in byte_arr])</div><div class='add'>+</div><div class='add'>+    # Raw conversion of string to bytes. This is required to convert</div><div class='add'>+    # back the string into bytearray(c char array) to use in struc</div><div class='add'>+    # pack/unpacking. Again encode/decode can't be used as it</div><div class='add'>+    # converts it alters size.</div><div class='add'>+    def str_to_bytearray(string):</div><div class='add'>+        return bytes([ord(c) for c in string])</div><div class='add'>+</div><div class='add'>+    def gr_create_string_buffer(size):</div><div class='add'>+        return create_string_buffer(b'\0', size)</div><div class='add'>+</div><div class='add'>+    def gr_query_xattr(cls, path, size, syscall, attr=None):</div><div class='add'>+        if attr:</div><div class='add'>+            return cls._query_xattr(path.encode(), size, syscall,</div><div class='add'>+                                    attr.encode())</div><div class='add'>+        else:</div><div class='add'>+            return cls._query_xattr(path.encode(), size, syscall)</div><div class='add'>+</div><div class='add'>+    def gr_lsetxattr(cls, path, attr, val):</div><div class='add'>+        return cls.libc.lsetxattr(path.encode(), attr.encode(), val,</div><div class='add'>+                                  len(val), 0)</div><div class='add'>+</div><div class='add'>+    def gr_lremovexattr(cls, path, attr):</div><div class='add'>+        return cls.libc.lremovexattr(path.encode(), attr.encode())</div><div class='add'>+</div><div class='add'>+    def gr_cl_register(libgfapi, brick, path, log_file, log_level, retries):</div><div class='add'>+        return libgfapi.gf_changelog_register(brick.encode(),</div><div class='add'>+                                              path.encode(),</div><div class='add'>+                                              log_file.encode(),</div><div class='add'>+                                              log_level, retries)</div><div class='add'>+</div><div class='add'>+    def gr_cl_done(libgfapi, clfile):</div><div class='add'>+        return libgfapi.gf_changelog_done(clfile.encode())</div><div class='add'>+</div><div class='add'>+    def gr_cl_history_changelog(libgfapi, changelog_path, start, end, num_parallel,</div><div class='add'>+                                actual_end):</div><div class='add'>+        return libgfapi.gf_history_changelog(changelog_path.encode(),</div><div class='add'>+                                             start, end, num_parallel,</div><div class='add'>+                                             actual_end)</div><div class='add'>+</div><div class='add'>+    def gr_cl_history_done(libgfapi, clfile):</div><div class='add'>+        return libgfapi.gf_history_changelog_done(clfile.encode())</div><div class='add'>+</div><div class='add'>+    # regular file</div><div class='add'>+</div><div class='add'>+    def entry_pack_reg(cls, gf, bn, mo, uid, gid):</div><div class='add'>+        bn_encoded = bn.encode()</div><div class='add'>+        blen = len(bn_encoded)</div><div class='add'>+        return struct.pack(cls._fmt_mknod(blen),</div><div class='add'>+                           uid, gid, gf.encode(), mo, bn_encoded,</div><div class='add'>+                           stat.S_IMODE(mo), 0, umask())</div><div class='add'>+</div><div class='add'>+    def entry_pack_reg_stat(cls, gf, bn, st):</div><div class='add'>+        bn_encoded = bn.encode()</div><div class='add'>+        blen = len(bn_encoded)</div><div class='add'>+        mo = st['mode']</div><div class='add'>+        return struct.pack(cls._fmt_mknod(blen),</div><div class='add'>+                           st['uid'], st['gid'],</div><div class='add'>+                           gf.encode(), mo, bn_encoded,</div><div class='add'>+                           stat.S_IMODE(mo), 0, umask())</div><div class='add'>+    # mkdir</div><div class='add'>+</div><div class='add'>+    def entry_pack_mkdir(cls, gf, bn, mo, uid, gid):</div><div class='add'>+        bn_encoded = bn.encode()</div><div class='add'>+        blen = len(bn_encoded)</div><div class='add'>+        return struct.pack(cls._fmt_mkdir(blen),</div><div class='add'>+                           uid, gid, gf.encode(), mo, bn_encoded,</div><div class='add'>+                           stat.S_IMODE(mo), umask())</div><div class='add'>+    # symlink</div><div class='add'>+</div><div class='add'>+    def entry_pack_symlink(cls, gf, bn, lnk, st):</div><div class='add'>+        bn_encoded = bn.encode()</div><div class='add'>+        blen = len(bn_encoded)</div><div class='add'>+        lnk_encoded = lnk.encode()</div><div class='add'>+        llen = len(lnk_encoded)</div><div class='add'>+        return struct.pack(cls._fmt_symlink(blen, llen),</div><div class='add'>+                           st['uid'], st['gid'],</div><div class='add'>+                           gf.encode(), st['mode'], bn_encoded,</div><div class='add'>+                           lnk_encoded)</div><div class='add'>+else:</div><div class='add'>+    def pipe():</div><div class='add'>+        (r, w) = os.pipe()</div><div class='add'>+        return (r, w)</div><div class='add'>+</div><div class='add'>+    # Raw conversion of bytearray to string</div><div class='add'>+    def bytearray_to_str(byte_arr):</div><div class='add'>+        return byte_arr</div><div class='add'>+</div><div class='add'>+    # Raw conversion of string to bytearray</div><div class='add'>+    def str_to_bytearray(string):</div><div class='add'>+        return string</div><div class='add'>+</div><div class='add'>+    def gr_create_string_buffer(size):</div><div class='add'>+        return create_string_buffer('\0', size)</div><div class='add'>+</div><div class='add'>+    def gr_query_xattr(cls, path, size, syscall, attr=None):</div><div class='add'>+        if attr:</div><div class='add'>+            return cls._query_xattr(path, size, syscall, attr)</div><div class='add'>+        else:</div><div class='add'>+            return cls._query_xattr(path, size, syscall)</div><div class='add'>+</div><div class='add'>+    def gr_lsetxattr(cls, path, attr, val):</div><div class='add'>+        return cls.libc.lsetxattr(path, attr, val, len(val), 0)</div><div class='add'>+</div><div class='add'>+    def gr_lremovexattr(cls, path, attr):</div><div class='add'>+        return cls.libc.lremovexattr(path, attr)</div><div class='add'>+</div><div class='add'>+    def gr_cl_register(libgfapi, brick, path, log_file, log_level, retries):</div><div class='add'>+        return libgfapi.gf_changelog_register(brick, path, log_file,</div><div class='add'>+                                              log_level, retries)</div><div class='add'>+</div><div class='add'>+    def gr_cl_done(libgfapi, clfile):</div><div class='add'>+        return libgfapi.gf_changelog_done(clfile)</div><div class='add'>+</div><div class='add'>+    def gr_cl_history_changelog(libgfapi, changelog_path, start, end, num_parallel,</div><div class='add'>+                                actual_end):</div><div class='add'>+        return libgfapi.gf_history_changelog(changelog_path, start, end,</div><div class='add'>+                                             num_parallel, actual_end)</div><div class='add'>+</div><div class='add'>+    def gr_cl_history_done(libgfapi, clfile):</div><div class='add'>+        return libgfapi.gf_history_changelog_done(clfile)</div><div class='add'>+</div><div class='add'>+    # regular file</div><div class='add'>+</div><div class='add'>+    def entry_pack_reg(cls, gf, bn, mo, uid, gid):</div><div class='add'>+        blen = len(bn)</div><div class='add'>+        return struct.pack(cls._fmt_mknod(blen),</div><div class='add'>+                           uid, gid, gf, mo, bn,</div><div class='add'>+                           stat.S_IMODE(mo), 0, umask())</div><div class='add'>+</div><div class='add'>+    def entry_pack_reg_stat(cls, gf, bn, st):</div><div class='add'>+        blen = len(bn)</div><div class='add'>+        mo = st['mode']</div><div class='add'>+        return struct.pack(cls._fmt_mknod(blen),</div><div class='add'>+                           st['uid'], st['gid'],</div><div class='add'>+                           gf, mo, bn,</div><div class='add'>+                           stat.S_IMODE(mo), 0, umask())</div><div class='add'>+    # mkdir</div><div class='add'>+</div><div class='add'>+    def entry_pack_mkdir(cls, gf, bn, mo, uid, gid):</div><div class='add'>+        blen = len(bn)</div><div class='add'>+        return struct.pack(cls._fmt_mkdir(blen),</div><div class='add'>+                           uid, gid, gf, mo, bn,</div><div class='add'>+                           stat.S_IMODE(mo), umask())</div><div class='add'>+    # symlink</div><div class='add'>+</div><div class='add'>+    def entry_pack_symlink(cls, gf, bn, lnk, st):</div><div class='add'>+        blen = len(bn)</div><div class='add'>+        llen = len(lnk)</div><div class='add'>+        return struct.pack(cls._fmt_symlink(blen, llen),</div><div class='add'>+                           st['uid'], st['gid'],</div><div class='add'>+                           gf, st['mode'], bn, lnk)</div><div class='head'>diff --git a/geo-replication/syncdaemon/rconf.py b/geo-replication/syncdaemon/rconf.py<br/>new file mode 100644<br/>index 00000000000..ff716ee4d6d<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/geo-replication/syncdaemon/rconf.py?id=d1d7a6f35c816822fab51c820e25023863c239c1'>geo-replication/syncdaemon/rconf.py</a></div><div class='hunk'>@@ -0,0 +1,31 @@</div><div class='add'>+#</div><div class='add'>+# Copyright (c) 2011-2014 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+# This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+# This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+# General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+# later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+# cases as published by the Free Software Foundation.</div><div class='add'>+#</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+class RConf(object):</div><div class='add'>+</div><div class='add'>+    """singleton class to store runtime globals</div><div class='add'>+       shared between gsyncd modules"""</div><div class='add'>+</div><div class='add'>+    ssh_ctl_dir = None</div><div class='add'>+    ssh_ctl_args = None</div><div class='add'>+    cpid = None</div><div class='add'>+    pid_file_owned = False</div><div class='add'>+    log_exit = False</div><div class='add'>+    permanent_handles = []</div><div class='add'>+    log_metadata = {}</div><div class='add'>+    mgmt_lock_fd = None</div><div class='add'>+    args = None</div><div class='add'>+    turns = 0</div><div class='add'>+    mountbroker = False</div><div class='add'>+    mount_point = None</div><div class='add'>+    mbr_umount_cmd = []</div><div class='add'>+</div><div class='add'>+rconf = RConf()</div><div class='head'>diff --git a/geo-replication/syncdaemon/repce.py b/geo-replication/syncdaemon/repce.py<br/>new file mode 100644<br/>index 00000000000..c622afa6373<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/geo-replication/syncdaemon/repce.py?id=d1d7a6f35c816822fab51c820e25023863c239c1'>geo-replication/syncdaemon/repce.py</a></div><div class='hunk'>@@ -0,0 +1,253 @@</div><div class='add'>+#</div><div class='add'>+# Copyright (c) 2011-2014 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+# This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+# This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+# General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+# later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+# cases as published by the Free Software Foundation.</div><div class='add'>+#</div><div class='add'>+</div><div class='add'>+import os</div><div class='add'>+import sys</div><div class='add'>+import time</div><div class='add'>+import logging</div><div class='add'>+from threading import Condition</div><div class='add'>+try:</div><div class='add'>+    import _thread as thread</div><div class='add'>+except ImportError:</div><div class='add'>+    import thread</div><div class='add'>+try:</div><div class='add'>+    from queue import Queue</div><div class='add'>+except ImportError:</div><div class='add'>+    from Queue import Queue</div><div class='add'>+try:</div><div class='add'>+    import cPickle as pickle</div><div class='add'>+except ImportError:</div><div class='add'>+    import pickle</div><div class='add'>+</div><div class='add'>+from syncdutils import Thread, select, lf</div><div class='add'>+</div><div class='add'>+pickle_proto = 2</div><div class='add'>+repce_version = 1.0</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def ioparse(i, o):</div><div class='add'>+    if isinstance(i, int):</div><div class='add'>+        i = os.fdopen(i, 'rb')</div><div class='add'>+    # rely on duck typing for recognizing</div><div class='add'>+    # streams as that works uniformly</div><div class='add'>+    # in py2 and py3</div><div class='add'>+    if hasattr(o, 'fileno'):</div><div class='add'>+        o = o.fileno()</div><div class='add'>+    return (i, o)</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def send(out, *args):</div><div class='add'>+    """pickle args and write out wholly in one syscall</div><div class='add'>+</div><div class='add'>+    ie. not use the ability of pickle to dump directly to</div><div class='add'>+    a stream, as that would potentially mess up messages</div><div class='add'>+    by interleaving them</div><div class='add'>+    """</div><div class='add'>+    os.write(out, pickle.dumps(args, pickle_proto))</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def recv(inf):</div><div class='add'>+    """load an object from input stream</div><div class='add'>+    python2 and python3 compatibility, inf is sys.stdin</div><div class='add'>+    and is opened as text stream by default. Hence using the</div><div class='add'>+    buffer attribute in python3</div><div class='add'>+    """</div><div class='add'>+    if hasattr(inf, "buffer"):</div><div class='add'>+        return pickle.load(inf.buffer)</div><div class='add'>+    else:</div><div class='add'>+        return pickle.load(inf)</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+class RepceServer(object):</div><div class='add'>+</div><div class='add'>+    """RePCe is Hungarian for canola, http://hu.wikipedia.org/wiki/Repce</div><div class='add'>+</div><div class='add'>+    ... also our homebrewed RPC backend where the transport layer is</div><div class='add'>+    reduced to a pair of filehandles.</div><div class='add'>+</div><div class='add'>+    This is the server component.</div><div class='add'>+    """</div><div class='add'>+</div><div class='add'>+    def __init__(self, obj, i, o, wnum=6):</div><div class='add'>+        """register a backend object .obj to which incoming messages</div><div class='add'>+           are dispatched, also incoming/outcoming streams</div><div class='add'>+        """</div><div class='add'>+        self.obj = obj</div><div class='add'>+        self.inf, self.out = ioparse(i, o)</div><div class='add'>+        self.wnum = wnum</div><div class='add'>+        self.q = Queue()</div><div class='add'>+</div><div class='add'>+    def service_loop(self):</div><div class='add'>+        """fire up worker threads, get messages and dispatch among them"""</div><div class='add'>+        for i in range(self.wnum):</div><div class='add'>+            t = Thread(target=self.worker)</div><div class='add'>+            t.start()</div><div class='add'>+        try:</div><div class='add'>+            while True:</div><div class='add'>+                self.q.put(recv(self.inf))</div><div class='add'>+        except EOFError:</div><div class='add'>+            logging.info("terminating on reaching EOF.")</div><div class='add'>+</div><div class='add'>+    def worker(self):</div><div class='add'>+        """life of a worker</div><div class='add'>+</div><div class='add'>+        Get message, extract its id, method name and arguments</div><div class='add'>+        (kwargs not supported), call method on .obj.</div><div class='add'>+        Send back message id + return value.</div><div class='add'>+        If method call throws an exception, rescue it, and send</div><div class='add'>+        back the exception as result (with flag marking it as</div><div class='add'>+        exception).</div><div class='add'>+        """</div><div class='add'>+        while True:</div><div class='add'>+            in_data = self.q.get(True)</div><div class='add'>+            rid = in_data[0]</div><div class='add'>+            rmeth = in_data[1]</div><div class='add'>+            exc = False</div><div class='add'>+            if rmeth == '__repce_version__':</div><div class='add'>+                res = repce_version</div><div class='add'>+            else:</div><div class='add'>+                try:</div><div class='add'>+                    res = getattr(self.obj, rmeth)(*in_data[2:])</div><div class='add'>+                except:</div><div class='add'>+                    res = sys.exc_info()[1]</div><div class='add'>+                    exc = True</div><div class='add'>+                    logging.exception("call failed: ")</div><div class='add'>+            send(self.out, rid, exc, res)</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+class RepceJob(object):</div><div class='add'>+</div><div class='add'>+    """class representing message status we can use</div><div class='add'>+    for waiting on reply"""</div><div class='add'>+</div><div class='add'>+    def __init__(self, cbk):</div><div class='add'>+        """</div><div class='add'>+        - .rid: (process-wise) unique id</div><div class='add'>+        - .cbk: what we do upon receiving reply</div><div class='add'>+        """</div><div class='add'>+        self.rid = (os.getpid(), thread.get_ident(), time.time())</div><div class='add'>+        self.cbk = cbk</div><div class='add'>+        self.lever = Condition()</div><div class='add'>+        self.done = False</div><div class='add'>+</div><div class='add'>+    def __repr__(self):</div><div class='add'>+        return ':'.join([str(x) for x in self.rid])</div><div class='add'>+</div><div class='add'>+    def wait(self):</div><div class='add'>+        self.lever.acquire()</div><div class='add'>+        if not self.done:</div><div class='add'>+            self.lever.wait()</div><div class='add'>+        self.lever.release()</div><div class='add'>+        return self.result</div><div class='add'>+</div><div class='add'>+    def wakeup(self, data):</div><div class='add'>+        self.result = data</div><div class='add'>+        self.lever.acquire()</div><div class='add'>+        self.done = True</div><div class='add'>+        self.lever.notify()</div><div class='add'>+        self.lever.release()</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+class RepceClient(object):</div><div class='add'>+</div><div class='add'>+    """RePCe is Hungarian for canola, http://hu.wikipedia.org/wiki/Repce</div><div class='add'>+</div><div class='add'>+    ... also our homebrewed RPC backend where the transport layer is</div><div class='add'>+    reduced to a pair of filehandles.</div><div class='add'>+</div><div class='add'>+    This is the client component.</div><div class='add'>+    """</div><div class='add'>+</div><div class='add'>+    def __init__(self, i, o):</div><div class='add'>+        self.inf, self.out = ioparse(i, o)</div><div class='add'>+        self.jtab = {}</div><div class='add'>+        t = Thread(target=self.listen)</div><div class='add'>+        t.start()</div><div class='add'>+</div><div class='add'>+    def listen(self):</div><div class='add'>+        while True:</div><div class='add'>+            select((self.inf,), (), ())</div><div class='add'>+            rid, exc, res = recv(self.inf)</div><div class='add'>+            rjob = self.jtab.pop(rid)</div><div class='add'>+            if rjob.cbk:</div><div class='add'>+                rjob.cbk(rjob, [exc, res])</div><div class='add'>+</div><div class='add'>+    def push(self, meth, *args, **kw):</div><div class='add'>+        """wrap arguments in a RepceJob, send them to server</div><div class='add'>+           and return the RepceJob</div><div class='add'>+</div><div class='add'>+           @cbk to pass on RepceJob can be given as kwarg.</div><div class='add'>+        """</div><div class='add'>+        cbk = kw.get('cbk')</div><div class='add'>+        if not cbk:</div><div class='add'>+            def cbk(rj, res):</div><div class='add'>+                if res[0]:</div><div class='add'>+                    raise res[1]</div><div class='add'>+        rjob = RepceJob(cbk)</div><div class='add'>+        self.jtab[rjob.rid] = rjob</div><div class='add'>+        logging.debug("call %s %s%s ..." % (repr(rjob), meth, repr(args)))</div><div class='add'>+        send(self.out, rjob.rid, meth, *args)</div><div class='add'>+        return rjob</div><div class='add'>+</div><div class='add'>+    def __call__(self, meth, *args):</div><div class='add'>+        """RePCe client is callabe, calling it implements a synchronous</div><div class='add'>+        remote call.</div><div class='add'>+</div><div class='add'>+        We do a .push with a cbk which does a wakeup upon receiving answer,</div><div class='add'>+        then wait on the RepceJob.</div><div class='add'>+        """</div><div class='add'>+        rjob = self.push(</div><div class='add'>+            meth, *args, **{'cbk': lambda rj, res: rj.wakeup(res)})</div><div class='add'>+        exc, res = rjob.wait()</div><div class='add'>+        if exc:</div><div class='add'>+            logging.error(lf('call failed',</div><div class='add'>+                             call=repr(rjob),</div><div class='add'>+                             method=meth,</div><div class='add'>+                             error=str(type(res).__name__)))</div><div class='add'>+            raise res</div><div class='add'>+        logging.debug("call %s %s -&gt; %s" % (repr(rjob), meth, repr(res)))</div><div class='add'>+        return res</div><div class='add'>+</div><div class='add'>+    class mprx(object):</div><div class='add'>+</div><div class='add'>+        """method proxy, standard trick to implement rubyesque</div><div class='add'>+        method_missing in Python</div><div class='add'>+</div><div class='add'>+        A class is a closure factory, you know what I mean, or go read</div><div class='add'>+        some SICP.</div><div class='add'>+        """</div><div class='add'>+</div><div class='add'>+        def __init__(self, ins, meth):</div><div class='add'>+            self.ins = ins</div><div class='add'>+            self.meth = meth</div><div class='add'>+</div><div class='add'>+        def __call__(self, *a):</div><div class='add'>+            return self.ins(self.meth, *a)</div><div class='add'>+</div><div class='add'>+    def __getattr__(self, meth):</div><div class='add'>+        """this implements transparent method dispatch to remote object,</div><div class='add'>+           so that you don't need to call the RepceClient instance like</div><div class='add'>+</div><div class='add'>+             rclient('how_old_are_you_if_born_in', 1979)</div><div class='add'>+</div><div class='add'>+           but you can make it into an ordinary method call like</div><div class='add'>+</div><div class='add'>+             rclient.how_old_are_you_if_born_in(1979)</div><div class='add'>+        """</div><div class='add'>+        return self.mprx(self, meth)</div><div class='add'>+</div><div class='add'>+    def __version__(self):</div><div class='add'>+        """used in handshake to verify compatibility"""</div><div class='add'>+        d = {'proto': self('__repce_version__')}</div><div class='add'>+        try:</div><div class='add'>+            d['object'] = self('version')</div><div class='add'>+        except AttributeError:</div><div class='add'>+            pass</div><div class='add'>+        return d</div><div class='head'>diff --git a/geo-replication/syncdaemon/resource.py b/geo-replication/syncdaemon/resource.py<br/>new file mode 100644<br/>index 00000000000..f12c7ceaa36<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/geo-replication/syncdaemon/resource.py?id=d1d7a6f35c816822fab51c820e25023863c239c1'>geo-replication/syncdaemon/resource.py</a></div><div class='hunk'>@@ -0,0 +1,1583 @@</div><div class='add'>+#</div><div class='add'>+# Copyright (c) 2011-2014 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+# This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+# This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+# General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+# later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+# cases as published by the Free Software Foundation.</div><div class='add'>+#</div><div class='add'>+</div><div class='add'>+import re</div><div class='add'>+import os</div><div class='add'>+import sys</div><div class='add'>+import stat</div><div class='add'>+import time</div><div class='add'>+import fcntl</div><div class='add'>+import types</div><div class='add'>+import struct</div><div class='add'>+import logging</div><div class='add'>+import tempfile</div><div class='add'>+import subprocess</div><div class='add'>+from errno import (EEXIST, ENOENT, ENODATA, ENOTDIR, ELOOP, EACCES,</div><div class='add'>+                   EISDIR, ENOTEMPTY, ESTALE, EINVAL, EBUSY, EPERM)</div><div class='add'>+import errno</div><div class='add'>+</div><div class='add'>+from rconf import rconf</div><div class='add'>+import gsyncdconfig as gconf</div><div class='add'>+import libgfchangelog</div><div class='add'>+</div><div class='add'>+import repce</div><div class='add'>+from repce import RepceServer, RepceClient</div><div class='add'>+from master import gmaster_builder</div><div class='add'>+import syncdutils</div><div class='add'>+from syncdutils import (GsyncdError, select, privileged, funcode,</div><div class='add'>+                        entry2pb, gauxpfx, errno_wrap, lstat,</div><div class='add'>+                        NoStimeAvailable, PartialHistoryAvailable,</div><div class='add'>+                        ChangelogException, ChangelogHistoryNotAvailable,</div><div class='add'>+                        get_changelog_log_level, get_rsync_version,</div><div class='add'>+                        GX_GFID_CANONICAL_LEN,</div><div class='add'>+                        gf_mount_ready, lf, Popen, sup,</div><div class='add'>+                        Xattr, matching_disk_gfid, get_gfid_from_mnt,</div><div class='add'>+                        unshare_propagation_supported, get_slv_dir_path)</div><div class='add'>+from gsyncdstatus import GeorepStatus</div><div class='add'>+from py2py3 import (pipe, str_to_bytearray, entry_pack_reg,</div><div class='add'>+                    entry_pack_reg_stat, entry_pack_mkdir,</div><div class='add'>+                    entry_pack_symlink)</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+ENOTSUP = getattr(errno, 'ENOTSUP', 'EOPNOTSUPP')</div><div class='add'>+</div><div class='add'>+slv_volume = None</div><div class='add'>+slv_host = None</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+class Server(object):</div><div class='add'>+</div><div class='add'>+    """singleton implemening those filesystem access primitives</div><div class='add'>+       which are needed for geo-replication functionality</div><div class='add'>+</div><div class='add'>+    (Singleton in the sense it's a class which has only static</div><div class='add'>+    and classmethods and is used directly, without instantiation.)</div><div class='add'>+    """</div><div class='add'>+</div><div class='add'>+    GX_NSPACE_PFX = (privileged() and "trusted" or "system")</div><div class='add'>+    GX_NSPACE = GX_NSPACE_PFX + ".glusterfs"</div><div class='add'>+    NTV_FMTSTR = "!" + "B" * 19 + "II"</div><div class='add'>+    FRGN_XTRA_FMT = "I"</div><div class='add'>+    FRGN_FMTSTR = NTV_FMTSTR + FRGN_XTRA_FMT</div><div class='add'>+</div><div class='add'>+    # for backend gfid fetch, do not use GX_NSPACE_PFX</div><div class='add'>+    GFID_XATTR = 'trusted.gfid'</div><div class='add'>+    GFID_FMTSTR = "!" + "B" * 16</div><div class='add'>+</div><div class='add'>+    local_path = ''</div><div class='add'>+</div><div class='add'>+    @classmethod</div><div class='add'>+    def _fmt_mknod(cls, l):</div><div class='add'>+        return "!II%dsI%dsIII" % (GX_GFID_CANONICAL_LEN, l + 1)</div><div class='add'>+</div><div class='add'>+    @classmethod</div><div class='add'>+    def _fmt_mkdir(cls, l):</div><div class='add'>+        return "!II%dsI%dsII" % (GX_GFID_CANONICAL_LEN, l + 1)</div><div class='add'>+</div><div class='add'>+    @classmethod</div><div class='add'>+    def _fmt_symlink(cls, l1, l2):</div><div class='add'>+        return "!II%dsI%ds%ds" % (GX_GFID_CANONICAL_LEN, l1 + 1, l2 + 1)</div><div class='add'>+</div><div class='add'>+    def _pathguard(f):</div><div class='add'>+        """decorator method that checks</div><div class='add'>+        the path argument of the decorated</div><div class='add'>+        functions to make sure it does not</div><div class='add'>+        point out of the managed tree</div><div class='add'>+        """</div><div class='add'>+</div><div class='add'>+        fc = funcode(f)</div><div class='add'>+        pi = list(fc.co_varnames).index('path')</div><div class='add'>+</div><div class='add'>+        def ff(*args):</div><div class='add'>+            path = args[pi]</div><div class='add'>+            ps = path.split('/')</div><div class='add'>+            if path[0] == '/' or '..' in ps:</div><div class='add'>+                raise ValueError('unsafe path')</div><div class='add'>+            args = list(args)</div><div class='add'>+            args[pi] = os.path.join(args[0].local_path, path)</div><div class='add'>+            return f(*args)</div><div class='add'>+        return ff</div><div class='add'>+</div><div class='add'>+    @classmethod</div><div class='add'>+    @_pathguard</div><div class='add'>+    def entries(cls, path):</div><div class='add'>+        """directory entries in an array"""</div><div class='add'>+        # prevent symlinks being followed</div><div class='add'>+        if not stat.S_ISDIR(os.lstat(path).st_mode):</div><div class='add'>+            raise OSError(ENOTDIR, os.strerror(ENOTDIR))</div><div class='add'>+        return os.listdir(path)</div><div class='add'>+</div><div class='add'>+    @classmethod</div><div class='add'>+    @_pathguard</div><div class='add'>+    def lstat(cls, path):</div><div class='add'>+        try:</div><div class='add'>+            return os.lstat(path)</div><div class='add'>+        except (IOError, OSError):</div><div class='add'>+            ex = sys.exc_info()[1]</div><div class='add'>+            if ex.errno == ENOENT:</div><div class='add'>+                return ex.errno</div><div class='add'>+            else:</div><div class='add'>+                raise</div><div class='add'>+</div><div class='add'>+    @classmethod</div><div class='add'>+    @_pathguard</div><div class='add'>+    def linkto_check(cls, path):</div><div class='add'>+        try:</div><div class='add'>+            return not (</div><div class='add'>+                Xattr.lgetxattr_buf(path,</div><div class='add'>+                                    'trusted.glusterfs.dht.linkto') == '')</div><div class='add'>+        except (IOError, OSError):</div><div class='add'>+            ex = sys.exc_info()[1]</div><div class='add'>+            if ex.errno in (ENOENT, ENODATA):</div><div class='add'>+                return False</div><div class='add'>+            else:</div><div class='add'>+                raise</div><div class='add'>+</div><div class='add'>+    @classmethod</div><div class='add'>+    @_pathguard</div><div class='add'>+    def gfid(cls, path):</div><div class='add'>+        buf = errno_wrap(Xattr.lgetxattr, [path, cls.GFID_XATTR, 16],</div><div class='add'>+                         [ENOENT], [ESTALE, ENODATA])</div><div class='add'>+        if buf == ENOENT:</div><div class='add'>+            return buf</div><div class='add'>+        else:</div><div class='add'>+            buf = str_to_bytearray(buf)</div><div class='add'>+            m = re.match('(.{8})(.{4})(.{4})(.{4})(.{12})', "".join(</div><div class='add'>+                ['%02x' % x for x in struct.unpack(cls.GFID_FMTSTR, buf)]))</div><div class='add'>+            return '-'.join(m.groups())</div><div class='add'>+</div><div class='add'>+    @classmethod</div><div class='add'>+    @_pathguard</div><div class='add'>+    def purge(cls, path, entries=None):</div><div class='add'>+        """force-delete subtrees</div><div class='add'>+</div><div class='add'>+        If @entries is not specified, delete</div><div class='add'>+        the whole subtree under @path (including</div><div class='add'>+        @path).</div><div class='add'>+</div><div class='add'>+        Otherwise, @entries should be a</div><div class='add'>+        a sequence of children of @path, and</div><div class='add'>+        the effect is identical with a joint</div><div class='add'>+        @entries-less purge on them, ie.</div><div class='add'>+</div><div class='add'>+        for e in entries:</div><div class='add'>+            cls.purge(os.path.join(path, e))</div><div class='add'>+        """</div><div class='add'>+        me_also = entries is None</div><div class='add'>+        if not entries:</div><div class='add'>+            try:</div><div class='add'>+                # if it's a symlink, prevent</div><div class='add'>+                # following it</div><div class='add'>+                try:</div><div class='add'>+                    os.unlink(path)</div><div class='add'>+                    return</div><div class='add'>+                except OSError:</div><div class='add'>+                    ex = sys.exc_info()[1]</div><div class='add'>+                    if ex.errno == EISDIR:</div><div class='add'>+                        entries = os.listdir(path)</div><div class='add'>+                    else:</div><div class='add'>+                        raise</div><div class='add'>+            except OSError:</div><div class='add'>+                ex = sys.exc_info()[1]</div><div class='add'>+                if ex.errno in (ENOTDIR, ENOENT, ELOOP):</div><div class='add'>+                    try:</div><div class='add'>+                        os.unlink(path)</div><div class='add'>+                        return</div><div class='add'>+                    except OSError:</div><div class='add'>+                        ex = sys.exc_info()[1]</div><div class='add'>+                        if ex.errno == ENOENT:</div><div class='add'>+                            return</div><div class='add'>+                        raise</div><div class='add'>+                else:</div><div class='add'>+                    raise</div><div class='add'>+        for e in entries:</div><div class='add'>+            cls.purge(os.path.join(path, e))</div><div class='add'>+        if me_also:</div><div class='add'>+            os.rmdir(path)</div><div class='add'>+</div><div class='add'>+    @classmethod</div><div class='add'>+    @_pathguard</div><div class='add'>+    def _create(cls, path, ctor):</div><div class='add'>+        """path creation backend routine"""</div><div class='add'>+        try:</div><div class='add'>+            ctor(path)</div><div class='add'>+        except OSError:</div><div class='add'>+            ex = sys.exc_info()[1]</div><div class='add'>+            if ex.errno == EEXIST:</div><div class='add'>+                cls.purge(path)</div><div class='add'>+                return ctor(path)</div><div class='add'>+            raise</div><div class='add'>+</div><div class='add'>+    @classmethod</div><div class='add'>+    @_pathguard</div><div class='add'>+    def mkdir(cls, path):</div><div class='add'>+        cls._create(path, os.mkdir)</div><div class='add'>+</div><div class='add'>+    @classmethod</div><div class='add'>+    @_pathguard</div><div class='add'>+    def symlink(cls, lnk, path):</div><div class='add'>+        cls._create(path, lambda p: os.symlink(lnk, p))</div><div class='add'>+</div><div class='add'>+    @classmethod</div><div class='add'>+    @_pathguard</div><div class='add'>+    def xtime(cls, path, uuid):</div><div class='add'>+        """query xtime extended attribute</div><div class='add'>+</div><div class='add'>+        Return xtime of @path for @uuid as a pair of integers.</div><div class='add'>+        "Normal" errors due to non-existent @path or extended attribute</div><div class='add'>+        are tolerated and errno is returned in such a case.</div><div class='add'>+        """</div><div class='add'>+</div><div class='add'>+        try:</div><div class='add'>+            val = Xattr.lgetxattr(path,</div><div class='add'>+                                  '.'.join([cls.GX_NSPACE, uuid, 'xtime']),</div><div class='add'>+                                  8)</div><div class='add'>+            val = str_to_bytearray(val)</div><div class='add'>+            return struct.unpack('!II', val)</div><div class='add'>+        except OSError:</div><div class='add'>+            ex = sys.exc_info()[1]</div><div class='add'>+            if ex.errno in (ENOENT, ENODATA, ENOTDIR):</div><div class='add'>+                return ex.errno</div><div class='add'>+            else:</div><div class='add'>+                raise</div><div class='add'>+</div><div class='add'>+    @classmethod</div><div class='add'>+    @_pathguard</div><div class='add'>+    def stime_mnt(cls, path, uuid):</div><div class='add'>+        """query xtime extended attribute</div><div class='add'>+</div><div class='add'>+        Return xtime of @path for @uuid as a pair of integers.</div><div class='add'>+        "Normal" errors due to non-existent @path or extended attribute</div><div class='add'>+        are tolerated and errno is returned in such a case.</div><div class='add'>+        """</div><div class='add'>+</div><div class='add'>+        try:</div><div class='add'>+            val = Xattr.lgetxattr(path,</div><div class='add'>+                                  '.'.join([cls.GX_NSPACE, uuid, 'stime']),</div><div class='add'>+                                  8)</div><div class='add'>+            val = str_to_bytearray(val)</div><div class='add'>+            return struct.unpack('!II', val)</div><div class='add'>+        except OSError:</div><div class='add'>+            ex = sys.exc_info()[1]</div><div class='add'>+            if ex.errno in (ENOENT, ENODATA, ENOTDIR):</div><div class='add'>+                return ex.errno</div><div class='add'>+            else:</div><div class='add'>+                raise</div><div class='add'>+</div><div class='add'>+    @classmethod</div><div class='add'>+    @_pathguard</div><div class='add'>+    def stime(cls, path, uuid):</div><div class='add'>+        """query xtime extended attribute</div><div class='add'>+</div><div class='add'>+        Return xtime of @path for @uuid as a pair of integers.</div><div class='add'>+        "Normal" errors due to non-existent @path or extended attribute</div><div class='add'>+        are tolerated and errno is returned in such a case.</div><div class='add'>+        """</div><div class='add'>+</div><div class='add'>+        try:</div><div class='add'>+            val = Xattr.lgetxattr(path,</div><div class='add'>+                                  '.'.join([cls.GX_NSPACE, uuid, 'stime']),</div><div class='add'>+                                  8)</div><div class='add'>+            val = str_to_bytearray(val)</div><div class='add'>+            return struct.unpack('!II', val)</div><div class='add'>+        except OSError:</div><div class='add'>+            ex = sys.exc_info()[1]</div><div class='add'>+            if ex.errno in (ENOENT, ENODATA, ENOTDIR):</div><div class='add'>+                return ex.errno</div><div class='add'>+            else:</div><div class='add'>+                raise</div><div class='add'>+</div><div class='add'>+    @classmethod</div><div class='add'>+    @_pathguard</div><div class='add'>+    def entry_stime(cls, path, uuid):</div><div class='add'>+        """</div><div class='add'>+        entry_stime xattr to reduce the number of retry of Entry changes when</div><div class='add'>+        Geo-rep worker crashes and restarts. entry_stime is updated after</div><div class='add'>+        processing every changelog file. On failure and restart, worker only</div><div class='add'>+        have to reprocess the last changelog for Entry ops.</div><div class='add'>+        Xattr Key: &lt;PFX&gt;.&lt;MASTERVOL_UUID&gt;.&lt;SLAVEVOL_UUID&gt;.entry_stime</div><div class='add'>+        """</div><div class='add'>+        try:</div><div class='add'>+            val = Xattr.lgetxattr(path,</div><div class='add'>+                                  '.'.join([cls.GX_NSPACE, uuid,</div><div class='add'>+                                            'entry_stime']),</div><div class='add'>+                                  8)</div><div class='add'>+            val = str_to_bytearray(val)</div><div class='add'>+            return struct.unpack('!II', val)</div><div class='add'>+        except OSError:</div><div class='add'>+            ex = sys.exc_info()[1]</div><div class='add'>+            if ex.errno in (ENOENT, ENODATA, ENOTDIR):</div><div class='add'>+                return ex.errno</div><div class='add'>+            else:</div><div class='add'>+                raise</div><div class='add'>+</div><div class='add'>+    @classmethod</div><div class='add'>+    def node_uuid(cls, path='.'):</div><div class='add'>+        try:</div><div class='add'>+            uuid_l = Xattr.lgetxattr_buf(</div><div class='add'>+                path, '.'.join([cls.GX_NSPACE, 'node-uuid']))</div><div class='add'>+            return uuid_l[:-1].split(' ')</div><div class='add'>+        except OSError:</div><div class='add'>+            raise</div><div class='add'>+</div><div class='add'>+    @classmethod</div><div class='add'>+    @_pathguard</div><div class='add'>+    def set_stime(cls, path, uuid, mark):</div><div class='add'>+        """set @mark as stime for @uuid on @path"""</div><div class='add'>+        errno_wrap(Xattr.lsetxattr,</div><div class='add'>+                   [path,</div><div class='add'>+                    '.'.join([cls.GX_NSPACE, uuid, 'stime']),</div><div class='add'>+                    struct.pack('!II', *mark)],</div><div class='add'>+                   [ENOENT],</div><div class='add'>+                   [ESTALE, EINVAL])</div><div class='add'>+</div><div class='add'>+    @classmethod</div><div class='add'>+    @_pathguard</div><div class='add'>+    def set_entry_stime(cls, path, uuid, mark):</div><div class='add'>+        """set @mark as stime for @uuid on @path"""</div><div class='add'>+        errno_wrap(Xattr.lsetxattr,</div><div class='add'>+                   [path,</div><div class='add'>+                    '.'.join([cls.GX_NSPACE, uuid, 'entry_stime']),</div><div class='add'>+                    struct.pack('!II', *mark)],</div><div class='add'>+                   [ENOENT],</div><div class='add'>+                   [ESTALE, EINVAL])</div><div class='add'>+</div><div class='add'>+    @classmethod</div><div class='add'>+    @_pathguard</div><div class='add'>+    def set_xtime(cls, path, uuid, mark):</div><div class='add'>+        """set @mark as xtime for @uuid on @path"""</div><div class='add'>+        errno_wrap(Xattr.lsetxattr,</div><div class='add'>+                   [path,</div><div class='add'>+                    '.'.join([cls.GX_NSPACE, uuid, 'xtime']),</div><div class='add'>+                    struct.pack('!II', *mark)],</div><div class='add'>+                   [ENOENT],</div><div class='add'>+                   [ESTALE, EINVAL])</div><div class='add'>+</div><div class='add'>+    @classmethod</div><div class='add'>+    @_pathguard</div><div class='add'>+    def set_xtime_remote(cls, path, uuid, mark):</div><div class='add'>+        """</div><div class='add'>+        set @mark as xtime for @uuid on @path</div><div class='add'>+        the difference b/w this and set_xtime() being</div><div class='add'>+        set_xtime() being overloaded to set the xtime</div><div class='add'>+        on the brick (this method sets xtime on the</div><div class='add'>+        remote slave)</div><div class='add'>+        """</div><div class='add'>+        Xattr.lsetxattr(</div><div class='add'>+            path, '.'.join([cls.GX_NSPACE, uuid, 'xtime']),</div><div class='add'>+            struct.pack('!II', *mark))</div><div class='add'>+</div><div class='add'>+    @classmethod</div><div class='add'>+    def entry_ops(cls, entries):</div><div class='add'>+        pfx = gauxpfx()</div><div class='add'>+        logging.debug('entries: %s' % repr(entries))</div><div class='add'>+        dist_count = rconf.args.master_dist_count</div><div class='add'>+</div><div class='add'>+        def entry_purge(op, entry, gfid, e, uid, gid):</div><div class='add'>+            # This is an extremely racy code and needs to be fixed ASAP.</div><div class='add'>+            # The GFID check here is to be sure that the pargfid/bname</div><div class='add'>+            # to be purged is the GFID gotten from the changelog.</div><div class='add'>+            # (a stat(changelog_gfid) would also be valid here)</div><div class='add'>+            # The race here is between the GFID check and the purge.</div><div class='add'>+</div><div class='add'>+            # If the entry or the gfid of the file to be deleted is not present</div><div class='add'>+            # on slave, we can ignore the unlink/rmdir</div><div class='add'>+            if isinstance(lstat(entry), int) or \</div><div class='add'>+               isinstance(lstat(os.path.join(pfx, gfid)), int):</div><div class='add'>+                return</div><div class='add'>+</div><div class='add'>+            if not matching_disk_gfid(gfid, entry):</div><div class='add'>+                collect_failure(e, EEXIST, uid, gid)</div><div class='add'>+                return</div><div class='add'>+</div><div class='add'>+            if op == 'UNLINK':</div><div class='add'>+                er = errno_wrap(os.unlink, [entry], [ENOENT, ESTALE], [EBUSY])</div><div class='add'>+                # EISDIR is safe error, ignore. This can only happen when</div><div class='add'>+                # unlink is sent from master while fixing gfid conflicts.</div><div class='add'>+                if er != EISDIR:</div><div class='add'>+                    return er</div><div class='add'>+</div><div class='add'>+            elif op == 'RMDIR':</div><div class='add'>+                er = errno_wrap(os.rmdir, [entry], [ENOENT, ESTALE,</div><div class='add'>+                                                    ENOTEMPTY], [EBUSY])</div><div class='add'>+                if er == ENOTEMPTY:</div><div class='add'>+                    return er</div><div class='add'>+</div><div class='add'>+        def collect_failure(e, cmd_ret, uid, gid, dst=False):</div><div class='add'>+            slv_entry_info = {}</div><div class='add'>+            slv_entry_info['gfid_mismatch'] = False</div><div class='add'>+            slv_entry_info['name_mismatch'] = False</div><div class='add'>+            slv_entry_info['dst'] = dst</div><div class='add'>+            slv_entry_info['slave_isdir'] = False</div><div class='add'>+            slv_entry_info['slave_name'] = None</div><div class='add'>+            slv_entry_info['slave_gfid'] = None</div><div class='add'>+            # We do this for failing fops on Slave</div><div class='add'>+            # Master should be logging this</div><div class='add'>+            if cmd_ret is None:</div><div class='add'>+                return False</div><div class='add'>+</div><div class='add'>+            if e.get("stat", {}):</div><div class='add'>+                # Copy actual UID/GID value back to entry stat</div><div class='add'>+                e['stat']['uid'] = uid</div><div class='add'>+                e['stat']['gid'] = gid</div><div class='add'>+</div><div class='add'>+            if cmd_ret in [EEXIST, ESTALE]:</div><div class='add'>+                if dst:</div><div class='add'>+                    en = e['entry1']</div><div class='add'>+                else:</div><div class='add'>+                    en = e['entry']</div><div class='add'>+                disk_gfid = get_gfid_from_mnt(en)</div><div class='add'>+                if isinstance(disk_gfid, str) and \</div><div class='add'>+                   e['gfid'] != disk_gfid:</div><div class='add'>+                    slv_entry_info['gfid_mismatch'] = True</div><div class='add'>+                    st = lstat(en)</div><div class='add'>+                    if not isinstance(st, int):</div><div class='add'>+                        if st and stat.S_ISDIR(st.st_mode):</div><div class='add'>+                            slv_entry_info['slave_isdir'] = True</div><div class='add'>+                            dir_name = get_slv_dir_path(slv_host, slv_volume,</div><div class='add'>+                                                        disk_gfid)</div><div class='add'>+                            slv_entry_info['slave_name'] = dir_name</div><div class='add'>+                        else:</div><div class='add'>+                            slv_entry_info['slave_isdir'] = False</div><div class='add'>+                    slv_entry_info['slave_gfid'] = disk_gfid</div><div class='add'>+                    failures.append((e, cmd_ret, slv_entry_info))</div><div class='add'>+                else:</div><div class='add'>+                    return False</div><div class='add'>+            else:</div><div class='add'>+                failures.append((e, cmd_ret, slv_entry_info))</div><div class='add'>+</div><div class='add'>+            return True</div><div class='add'>+</div><div class='add'>+        failures = []</div><div class='add'>+</div><div class='add'>+        def recursive_rmdir(gfid, entry, path):</div><div class='add'>+            """disk_gfid check added for original path for which</div><div class='add'>+            recursive_delete is called. This disk gfid check executed</div><div class='add'>+            before every Unlink/Rmdir. If disk gfid is not matching</div><div class='add'>+            with GFID from Changelog, that means other worker</div><div class='add'>+            deleted the directory. Even if the subdir/file present,</div><div class='add'>+            it belongs to different parent. Exit without performing</div><div class='add'>+            further deletes.</div><div class='add'>+            """</div><div class='add'>+            if not matching_disk_gfid(gfid, entry):</div><div class='add'>+                return</div><div class='add'>+</div><div class='add'>+            names = []</div><div class='add'>+            names = errno_wrap(os.listdir, [path], [ENOENT], [ESTALE, ENOTSUP])</div><div class='add'>+            if isinstance(names, int):</div><div class='add'>+                return</div><div class='add'>+</div><div class='add'>+            for name in names:</div><div class='add'>+                fullname = os.path.join(path, name)</div><div class='add'>+                if not matching_disk_gfid(gfid, entry):</div><div class='add'>+                    return</div><div class='add'>+                er = errno_wrap(os.remove, [fullname], [ENOENT, ESTALE,</div><div class='add'>+                                                        EISDIR], [EBUSY])</div><div class='add'>+</div><div class='add'>+                if er == EISDIR:</div><div class='add'>+                    recursive_rmdir(gfid, entry, fullname)</div><div class='add'>+</div><div class='add'>+            if not matching_disk_gfid(gfid, entry):</div><div class='add'>+                return</div><div class='add'>+</div><div class='add'>+            errno_wrap(os.rmdir, [path], [ENOENT, ESTALE], [EBUSY])</div><div class='add'>+</div><div class='add'>+        def rename_with_disk_gfid_confirmation(gfid, entry, en, uid, gid):</div><div class='add'>+            if not matching_disk_gfid(gfid, entry):</div><div class='add'>+                logging.error(lf("RENAME ignored: source entry does not match "</div><div class='add'>+                                 "with on-disk gfid",</div><div class='add'>+                                 source=entry,</div><div class='add'>+                                 gfid=gfid,</div><div class='add'>+                                 disk_gfid=get_gfid_from_mnt(entry),</div><div class='add'>+                                 target=en))</div><div class='add'>+                collect_failure(e, EEXIST, uid, gid)</div><div class='add'>+                return</div><div class='add'>+</div><div class='add'>+            cmd_ret = errno_wrap(os.rename,</div><div class='add'>+                                 [entry, en],</div><div class='add'>+                                 [ENOENT, EEXIST], [ESTALE, EBUSY])</div><div class='add'>+            collect_failure(e, cmd_ret, uid, gid)</div><div class='add'>+</div><div class='add'>+        for e in entries:</div><div class='add'>+            blob = None</div><div class='add'>+            op = e['op']</div><div class='add'>+            gfid = e['gfid']</div><div class='add'>+            entry = e['entry']</div><div class='add'>+            uid = 0</div><div class='add'>+            gid = 0</div><div class='add'>+</div><div class='add'>+            # Skip entry processing if it's marked true during gfid</div><div class='add'>+            # conflict resolution</div><div class='add'>+            if e['skip_entry']:</div><div class='add'>+                continue</div><div class='add'>+</div><div class='add'>+            if e.get("stat", {}):</div><div class='add'>+                # Copy UID/GID value and then reset to zero. Copied UID/GID</div><div class='add'>+                # will be used to run chown once entry is created.</div><div class='add'>+                uid = e['stat']['uid']</div><div class='add'>+                gid = e['stat']['gid']</div><div class='add'>+                e['stat']['uid'] = 0</div><div class='add'>+                e['stat']['gid'] = 0</div><div class='add'>+</div><div class='add'>+            (pg, bname) = entry2pb(entry)</div><div class='add'>+            if op in ['RMDIR', 'UNLINK']:</div><div class='add'>+                # Try once, if rmdir failed with ENOTEMPTY</div><div class='add'>+                # then delete recursively.</div><div class='add'>+                er = entry_purge(op, entry, gfid, e, uid, gid)</div><div class='add'>+                if isinstance(er, int):</div><div class='add'>+                    if er == ENOTEMPTY and op == 'RMDIR':</div><div class='add'>+                        # Retry if ENOTEMPTY, ESTALE</div><div class='add'>+                        er1 = errno_wrap(recursive_rmdir,</div><div class='add'>+                                         [gfid, entry,</div><div class='add'>+                                          os.path.join(pg, bname)],</div><div class='add'>+                                         [], [ENOTEMPTY, ESTALE, ENODATA])</div><div class='add'>+                        if not isinstance(er1, int):</div><div class='add'>+                            logging.debug("Removed %s =&gt; %s/%s recursively" %</div><div class='add'>+                                          (gfid, pg, bname))</div><div class='add'>+                        else:</div><div class='add'>+                            logging.warn(lf("Recursive remove failed",</div><div class='add'>+                                            gfid=gfid,</div><div class='add'>+                                            pgfid=pg,</div><div class='add'>+                                            bname=bname,</div><div class='add'>+                                            error=os.strerror(er1)))</div><div class='add'>+                    else:</div><div class='add'>+                        logging.warn(lf("Failed to remove",</div><div class='add'>+                                        gfid=gfid,</div><div class='add'>+                                        pgfid=pg,</div><div class='add'>+                                        bname=bname,</div><div class='add'>+                                        error=os.strerror(er)))</div><div class='add'>+            elif op in ['CREATE', 'MKNOD']:</div><div class='add'>+                slink = os.path.join(pfx, gfid)</div><div class='add'>+                st = lstat(slink)</div><div class='add'>+                # don't create multiple entries with same gfid</div><div class='add'>+                if isinstance(st, int):</div><div class='add'>+                    blob = entry_pack_reg(cls, gfid, bname,</div><div class='add'>+                                          e['mode'], e['uid'], e['gid'])</div><div class='add'>+                # Self healed hardlinks are recorded as MKNOD.</div><div class='add'>+                # So if the gfid already exists, it should be</div><div class='add'>+                # processed as hard link not mknod.</div><div class='add'>+                elif op in ['MKNOD']:</div><div class='add'>+                    cmd_ret = errno_wrap(os.link,</div><div class='add'>+                                         [slink, entry],</div><div class='add'>+                                         [ENOENT, EEXIST], [ESTALE])</div><div class='add'>+                    collect_failure(e, cmd_ret, uid, gid)</div><div class='add'>+            elif op == 'MKDIR':</div><div class='add'>+                en = e['entry']</div><div class='add'>+                slink = os.path.join(pfx, gfid)</div><div class='add'>+                st = lstat(slink)</div><div class='add'>+                # don't create multiple entries with same gfid</div><div class='add'>+                if isinstance(st, int):</div><div class='add'>+                    blob = entry_pack_mkdir(cls, gfid, bname,</div><div class='add'>+                                            e['mode'], e['uid'], e['gid'])</div><div class='add'>+                elif (isinstance(lstat(en), int) or</div><div class='add'>+                      not matching_disk_gfid(gfid, en)):</div><div class='add'>+                    # If gfid of a directory exists on slave but path based</div><div class='add'>+                    # create is getting EEXIST. This means the directory is</div><div class='add'>+                    # renamed in master but recorded as MKDIR during hybrid</div><div class='add'>+                    # crawl. Get the directory path by reading the backend</div><div class='add'>+                    # symlink and trying to rename to new name as said by</div><div class='add'>+                    # master.</div><div class='add'>+                    logging.info(lf("Special case: rename on mkdir",</div><div class='add'>+                                    gfid=gfid, entry=repr(entry)))</div><div class='add'>+                    src_entry = get_slv_dir_path(slv_host, slv_volume, gfid)</div><div class='add'>+                    if src_entry is None:</div><div class='add'>+                        collect_failure(e, ENOENT, uid, gid)</div><div class='add'>+                    if src_entry is not None and src_entry != entry:</div><div class='add'>+                        slv_entry_info = {}</div><div class='add'>+                        slv_entry_info['gfid_mismatch'] = False</div><div class='add'>+                        slv_entry_info['name_mismatch'] = True</div><div class='add'>+                        slv_entry_info['dst'] = False</div><div class='add'>+                        slv_entry_info['slave_isdir'] = True</div><div class='add'>+                        slv_entry_info['slave_gfid'] = gfid</div><div class='add'>+                        slv_entry_info['slave_entry'] = src_entry</div><div class='add'>+</div><div class='add'>+                        failures.append((e, EEXIST, slv_entry_info))</div><div class='add'>+            elif op == 'LINK':</div><div class='add'>+                slink = os.path.join(pfx, gfid)</div><div class='add'>+                st = lstat(slink)</div><div class='add'>+                if isinstance(st, int):</div><div class='add'>+                    (pg, bname) = entry2pb(entry)</div><div class='add'>+                    if stat.S_ISREG(e['stat']['mode']):</div><div class='add'>+                        blob = entry_pack_reg_stat(cls, gfid, bname, e['stat'])</div><div class='add'>+                    elif stat.S_ISLNK(e['stat']['mode']):</div><div class='add'>+                        blob = entry_pack_symlink(cls, gfid, bname, e['link'],</div><div class='add'>+                                                  e['stat'])</div><div class='add'>+                else:</div><div class='add'>+                    cmd_ret = errno_wrap(os.link,</div><div class='add'>+                                         [slink, entry],</div><div class='add'>+                                         [ENOENT, EEXIST], [ESTALE])</div><div class='add'>+                    collect_failure(e, cmd_ret, uid, gid)</div><div class='add'>+            elif op == 'SYMLINK':</div><div class='add'>+                en = e['entry']</div><div class='add'>+                st = lstat(entry)</div><div class='add'>+                if isinstance(st, int):</div><div class='add'>+                    blob = entry_pack_symlink(cls, gfid, bname, e['link'],</div><div class='add'>+                                              e['stat'])</div><div class='add'>+                elif not matching_disk_gfid(gfid, en):</div><div class='add'>+                    collect_failure(e, EEXIST, uid, gid)</div><div class='add'>+            elif op == 'RENAME':</div><div class='add'>+                en = e['entry1']</div><div class='add'>+                # The matching disk gfid check validates two things</div><div class='add'>+                #  1. Validates name is present, return false otherwise</div><div class='add'>+                #  2. Validates gfid is same, returns false otherwise</div><div class='add'>+                # So both validations are necessary to decide src doesn't</div><div class='add'>+                # exist. We can't rely on only gfid stat as hardlink could</div><div class='add'>+                # be present and we can't rely only on name as name could</div><div class='add'>+                # exist with different gfid.</div><div class='add'>+                if not matching_disk_gfid(gfid, entry):</div><div class='add'>+                    if e['stat'] and not stat.S_ISDIR(e['stat']['mode']):</div><div class='add'>+                        if stat.S_ISLNK(e['stat']['mode']):</div><div class='add'>+                            # src is not present, so don't sync symlink as</div><div class='add'>+                            # we don't know target. It's ok to ignore. If</div><div class='add'>+                            # it's unliked, it's fine. If it's renamed to</div><div class='add'>+                            # something else, it will be synced then.</div><div class='add'>+                            if e['link'] is not None:</div><div class='add'>+                                st1 = lstat(en)</div><div class='add'>+                                if isinstance(st1, int):</div><div class='add'>+                                    (pg, bname) = entry2pb(en)</div><div class='add'>+                                    blob = entry_pack_symlink(cls, gfid, bname,</div><div class='add'>+                                                              e['link'],</div><div class='add'>+                                                              e['stat'])</div><div class='add'>+                                elif not matching_disk_gfid(gfid, en):</div><div class='add'>+                                    collect_failure(e, EEXIST, uid, gid, True)</div><div class='add'>+                        else:</div><div class='add'>+                            slink = os.path.join(pfx, gfid)</div><div class='add'>+                            st = lstat(slink)</div><div class='add'>+                            # don't create multiple entries with same gfid</div><div class='add'>+                            if isinstance(st, int):</div><div class='add'>+                                (pg, bname) = entry2pb(en)</div><div class='add'>+                                blob = entry_pack_reg_stat(cls, gfid, bname,</div><div class='add'>+                                                           e['stat'])</div><div class='add'>+                            else:</div><div class='add'>+                                cmd_ret = errno_wrap(os.link, [slink, en],</div><div class='add'>+                                                    [ENOENT, EEXIST], [ESTALE])</div><div class='add'>+                                collect_failure(e, cmd_ret, uid, gid)</div><div class='add'>+                else:</div><div class='add'>+                    st = lstat(entry)</div><div class='add'>+                    st1 = lstat(en)</div><div class='add'>+                    if isinstance(st1, int):</div><div class='add'>+                        rename_with_disk_gfid_confirmation(gfid, entry, en,</div><div class='add'>+                                                           uid, gid)</div><div class='add'>+                    else:</div><div class='add'>+                        if st.st_ino == st1.st_ino:</div><div class='add'>+                            # we have a hard link, we can now unlink source</div><div class='add'>+                            try:</div><div class='add'>+                                errno_wrap(os.unlink, [entry],</div><div class='add'>+                                           [ENOENT, ESTALE], [EBUSY])</div><div class='add'>+                            except OSError as e:</div><div class='add'>+                                if e.errno == EISDIR:</div><div class='add'>+                                    try:</div><div class='add'>+                                        errno_wrap(os.rmdir, [entry],</div><div class='add'>+                                                   [ENOENT, ESTALE], [EBUSY])</div><div class='add'>+                                    except OSError as e:</div><div class='add'>+                                        if e.errno == ENOTEMPTY:</div><div class='add'>+                                            logging.error(</div><div class='add'>+                                                lf("Directory Rename failed. "</div><div class='add'>+                                                   "Both Old and New"</div><div class='add'>+                                                   " directories exists",</div><div class='add'>+                                                   old=entry,</div><div class='add'>+                                                   new=en))</div><div class='add'>+                                        else:</div><div class='add'>+                                            raise</div><div class='add'>+                                else:</div><div class='add'>+                                    raise</div><div class='add'>+                        elif not matching_disk_gfid(gfid, en) and dist_count &gt; 1:</div><div class='add'>+                            collect_failure(e, EEXIST, uid, gid, True)</div><div class='add'>+                        else:</div><div class='add'>+                            # We are here which means matching_disk_gfid for</div><div class='add'>+                            # both source and destination has returned false</div><div class='add'>+                            # and distribution count for master vol is greater</div><div class='add'>+                            # then one. Which basically says both the source and</div><div class='add'>+                            # destination exist and not hardlinks.</div><div class='add'>+                            # So we are safe to go ahead with rename here.</div><div class='add'>+                            rename_with_disk_gfid_confirmation(gfid, entry, en,</div><div class='add'>+                                                               uid, gid)</div><div class='add'>+            if blob:</div><div class='add'>+                cmd_ret = errno_wrap(Xattr.lsetxattr,</div><div class='add'>+                                     [pg, 'glusterfs.gfid.newfile', blob],</div><div class='add'>+                                     [EEXIST, ENOENT, ESTALE],</div><div class='add'>+                                     [ESTALE, EINVAL, EBUSY])</div><div class='add'>+                collect_failure(e, cmd_ret, uid, gid)</div><div class='add'>+</div><div class='add'>+                # If UID/GID is different than zero that means we are trying</div><div class='add'>+                # create Entry with different UID/GID. Create Entry with</div><div class='add'>+                # UID:0 and GID:0, and then call chown to set UID/GID</div><div class='add'>+                if uid != 0 or gid != 0:</div><div class='add'>+                    path = os.path.join(pfx, gfid)</div><div class='add'>+                    cmd_ret = errno_wrap(os.lchown, [path, uid, gid], [ENOENT],</div><div class='add'>+                                         [ESTALE, EINVAL])</div><div class='add'>+                    collect_failure(e, cmd_ret, uid, gid)</div><div class='add'>+</div><div class='add'>+        return failures</div><div class='add'>+</div><div class='add'>+    @classmethod</div><div class='add'>+    def meta_ops(cls, meta_entries):</div><div class='add'>+        logging.debug('Meta-entries: %s' % repr(meta_entries))</div><div class='add'>+        failures = []</div><div class='add'>+        for e in meta_entries:</div><div class='add'>+            mode = e['stat']['mode']</div><div class='add'>+            uid = e['stat']['uid']</div><div class='add'>+            gid = e['stat']['gid']</div><div class='add'>+            atime = e['stat']['atime']</div><div class='add'>+            mtime = e['stat']['mtime']</div><div class='add'>+            go = e['go']</div><div class='add'>+            # Linux doesn't support chmod on symlink itself.</div><div class='add'>+            # It is always applied to the target file. So</div><div class='add'>+            # changelog would record target file's gfid</div><div class='add'>+            # and we are good. But 'chown' is supported on</div><div class='add'>+            # symlink file. So changelog would record symlink</div><div class='add'>+            # gfid in such cases. Since we do 'chown' 'chmod'</div><div class='add'>+            # 'utime' for each gfid recorded for metadata, and</div><div class='add'>+            # we know from changelog the metadata is on symlink's</div><div class='add'>+            # gfid or target file's gfid, we should be doing</div><div class='add'>+            # 'lchown' 'lchmod' 'utime with no-deference' blindly.</div><div class='add'>+            # But since 'lchmod' and 'utime with no de-reference' is</div><div class='add'>+            # not supported in python3, we have to rely on 'chmod'</div><div class='add'>+            # and 'utime with de-reference'. Hence avoiding 'chmod'</div><div class='add'>+            # and 'utime' if it's symlink file.</div><div class='add'>+</div><div class='add'>+            is_symlink = False</div><div class='add'>+            cmd_ret = errno_wrap(os.lchown, [go, uid, gid], [ENOENT],</div><div class='add'>+                                 [ESTALE, EINVAL])</div><div class='add'>+            if isinstance(cmd_ret, int):</div><div class='add'>+                continue</div><div class='add'>+</div><div class='add'>+            is_symlink = os.path.islink(go)</div><div class='add'>+</div><div class='add'>+            if not is_symlink:</div><div class='add'>+                cmd_ret = errno_wrap(os.chmod, [go, mode],</div><div class='add'>+                                     [ENOENT, EACCES, EPERM], [ESTALE, EINVAL])</div><div class='add'>+                if isinstance(cmd_ret, int):</div><div class='add'>+                    failures.append((e, cmd_ret, "chmod"))</div><div class='add'>+</div><div class='add'>+                cmd_ret = errno_wrap(os.utime, [go, (atime, mtime)],</div><div class='add'>+                                     [ENOENT, EACCES, EPERM], [ESTALE, EINVAL])</div><div class='add'>+                if isinstance(cmd_ret, int):</div><div class='add'>+                    failures.append((e, cmd_ret, "utime"))</div><div class='add'>+        return failures</div><div class='add'>+</div><div class='add'>+    @classmethod</div><div class='add'>+    @_pathguard</div><div class='add'>+    def setattr(cls, path, adct):</div><div class='add'>+        """set file attributes</div><div class='add'>+</div><div class='add'>+        @adct is a dict, where 'own', 'mode' and 'times'</div><div class='add'>+        keys are looked for and values used to perform</div><div class='add'>+        chown, chmod or utimes on @path.</div><div class='add'>+        """</div><div class='add'>+        own = adct.get('own')</div><div class='add'>+        if own:</div><div class='add'>+            os.lchown(path, *own)</div><div class='add'>+        mode = adct.get('mode')</div><div class='add'>+        if mode:</div><div class='add'>+            os.chmod(path, stat.S_IMODE(mode))</div><div class='add'>+        times = adct.get('times')</div><div class='add'>+        if times:</div><div class='add'>+            os.utime(path, times)</div><div class='add'>+</div><div class='add'>+    @staticmethod</div><div class='add'>+    def pid():</div><div class='add'>+        return os.getpid()</div><div class='add'>+</div><div class='add'>+    last_keep_alive = 0</div><div class='add'>+</div><div class='add'>+    @classmethod</div><div class='add'>+    def keep_alive(cls, dct):</div><div class='add'>+        """process keepalive messages.</div><div class='add'>+</div><div class='add'>+        Return keep-alive counter (number of received keep-alive</div><div class='add'>+        messages).</div><div class='add'>+</div><div class='add'>+        Now the "keep-alive" message can also have a payload which is</div><div class='add'>+        used to set a foreign volume-mark on the underlying file system.</div><div class='add'>+        """</div><div class='add'>+        if dct:</div><div class='add'>+            key = '.'.join([cls.GX_NSPACE, 'volume-mark', dct['uuid']])</div><div class='add'>+            val = struct.pack(cls.FRGN_FMTSTR,</div><div class='add'>+                              *(dct['version'] +</div><div class='add'>+                                tuple(int(x, 16)</div><div class='add'>+                                      for x in re.findall('(?:[\da-f]){2}',</div><div class='add'>+                                                          dct['uuid'])) +</div><div class='add'>+                                (dct['retval'],) + dct['volume_mark'][0:2] + (</div><div class='add'>+                                    dct['timeout'],)))</div><div class='add'>+            Xattr.lsetxattr('.', key, val)</div><div class='add'>+        cls.last_keep_alive += 1</div><div class='add'>+        return cls.last_keep_alive</div><div class='add'>+</div><div class='add'>+    @staticmethod</div><div class='add'>+    def version():</div><div class='add'>+        """version used in handshake"""</div><div class='add'>+        return 1.0</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+class Mounter(object):</div><div class='add'>+</div><div class='add'>+    """Abstract base class for mounter backends"""</div><div class='add'>+</div><div class='add'>+    def __init__(self, params):</div><div class='add'>+        self.params = params</div><div class='add'>+        self.mntpt = None</div><div class='add'>+        self.umount_cmd = []</div><div class='add'>+</div><div class='add'>+    @classmethod</div><div class='add'>+    def get_glusterprog(cls):</div><div class='add'>+        gluster_cmd_dir = gconf.get("gluster-command-dir")</div><div class='add'>+        if rconf.args.subcmd == "slave":</div><div class='add'>+            gluster_cmd_dir = gconf.get("slave-gluster-command-dir")</div><div class='add'>+        return os.path.join(gluster_cmd_dir, cls.glusterprog)</div><div class='add'>+</div><div class='add'>+    def umount_l(self, d):</div><div class='add'>+        """perform lazy umount"""</div><div class='add'>+        po = Popen(self.make_umount_argv(d), stderr=subprocess.PIPE,</div><div class='add'>+                   universal_newlines=True)</div><div class='add'>+        po.wait()</div><div class='add'>+        return po</div><div class='add'>+</div><div class='add'>+    @classmethod</div><div class='add'>+    def make_umount_argv(cls, d):</div><div class='add'>+        raise NotImplementedError</div><div class='add'>+</div><div class='add'>+    def make_mount_argv(self, label=None):</div><div class='add'>+        raise NotImplementedError</div><div class='add'>+</div><div class='add'>+    def cleanup_mntpt(self, *a):</div><div class='add'>+        pass</div><div class='add'>+</div><div class='add'>+    def handle_mounter(self, po):</div><div class='add'>+        po.wait()</div><div class='add'>+</div><div class='add'>+    def inhibit(self, label):</div><div class='add'>+        """inhibit a gluster filesystem</div><div class='add'>+</div><div class='add'>+        Mount glusterfs over a temporary mountpoint,</div><div class='add'>+        change into the mount, and lazy unmount the</div><div class='add'>+        filesystem.</div><div class='add'>+        """</div><div class='add'>+        mpi, mpo = pipe()</div><div class='add'>+        mh = Popen.fork()</div><div class='add'>+        if mh:</div><div class='add'>+            # Parent</div><div class='add'>+            os.close(mpi)</div><div class='add'>+            fcntl.fcntl(mpo, fcntl.F_SETFD, fcntl.FD_CLOEXEC)</div><div class='add'>+            d = None</div><div class='add'>+            margv = self.make_mount_argv(label)</div><div class='add'>+            if self.mntpt:</div><div class='add'>+                # mntpt is determined pre-mount</div><div class='add'>+                d = self.mntpt</div><div class='add'>+                mnt_msg = d + '\0'</div><div class='add'>+                encoded_msg = mnt_msg.encode()</div><div class='add'>+                os.write(mpo, encoded_msg)</div><div class='add'>+            po = Popen(margv, **self.mountkw)</div><div class='add'>+            self.handle_mounter(po)</div><div class='add'>+            po.terminate_geterr()</div><div class='add'>+            logging.debug('auxiliary glusterfs mount in place')</div><div class='add'>+            if not d:</div><div class='add'>+                # mntpt is determined during mount</div><div class='add'>+                d = self.mntpt</div><div class='add'>+                mnt_msg = d + '\0'</div><div class='add'>+                encoded_msg = mnt_msg.encode()</div><div class='add'>+                os.write(mpo, encoded_msg)</div><div class='add'>+            encoded_msg = 'M'.encode()</div><div class='add'>+            os.write(mpo, encoded_msg)</div><div class='add'>+            t = syncdutils.Thread(target=lambda: os.chdir(d))</div><div class='add'>+            t.start()</div><div class='add'>+            tlim = rconf.starttime + gconf.get("connection-timeout")</div><div class='add'>+            while True:</div><div class='add'>+                if not t.isAlive():</div><div class='add'>+                    break</div><div class='add'>+</div><div class='add'>+                if time.time() &gt;= tlim:</div><div class='add'>+                    syncdutils.finalize(exval=1)</div><div class='add'>+                time.sleep(1)</div><div class='add'>+            os.close(mpo)</div><div class='add'>+            _, rv = syncdutils.waitpid(mh, 0)</div><div class='add'>+            if rv:</div><div class='add'>+                rv = (os.WIFEXITED(rv) and os.WEXITSTATUS(rv) or 0) - \</div><div class='add'>+                     (os.WIFSIGNALED(rv) and os.WTERMSIG(rv) or 0)</div><div class='add'>+                logging.warn(lf('stale mount possibly left behind',</div><div class='add'>+                                path=d))</div><div class='add'>+                raise GsyncdError("cleaning up temp mountpoint %s "</div><div class='add'>+                                  "failed with status %d" %</div><div class='add'>+                                  (d, rv))</div><div class='add'>+        else:</div><div class='add'>+            rv = 0</div><div class='add'>+            try:</div><div class='add'>+                os.setsid()</div><div class='add'>+                os.close(mpo)</div><div class='add'>+                mntdata = ''</div><div class='add'>+                while True:</div><div class='add'>+                    c = os.read(mpi, 1)</div><div class='add'>+                    c = c.decode()</div><div class='add'>+                    if not c:</div><div class='add'>+                        break</div><div class='add'>+                    mntdata += c</div><div class='add'>+                if mntdata:</div><div class='add'>+                    mounted = False</div><div class='add'>+                    if mntdata[-1] == 'M':</div><div class='add'>+                        mntdata = mntdata[:-1]</div><div class='add'>+                        assert(mntdata)</div><div class='add'>+                        mounted = True</div><div class='add'>+                    assert(mntdata[-1] == '\0')</div><div class='add'>+                    mntpt = mntdata[:-1]</div><div class='add'>+                    assert(mntpt)</div><div class='add'>+</div><div class='add'>+                    umount_master = False</div><div class='add'>+                    umount_slave = False</div><div class='add'>+                    if rconf.args.subcmd == "worker" \</div><div class='add'>+                       and not unshare_propagation_supported() \</div><div class='add'>+                       and not gconf.get("access-mount"):</div><div class='add'>+                        umount_master = True</div><div class='add'>+                    if rconf.args.subcmd == "slave" \</div><div class='add'>+                       and not gconf.get("slave-access-mount"):</div><div class='add'>+                        umount_slave = True</div><div class='add'>+</div><div class='add'>+                    if mounted and (umount_master or umount_slave):</div><div class='add'>+                        po = self.umount_l(mntpt)</div><div class='add'>+                        po.terminate_geterr(fail_on_err=False)</div><div class='add'>+                        if po.returncode != 0:</div><div class='add'>+                            po.errlog()</div><div class='add'>+                            rv = po.returncode</div><div class='add'>+                        logging.debug("Lazy umount done: %s" % mntpt)</div><div class='add'>+                    if umount_master or umount_slave:</div><div class='add'>+                        self.cleanup_mntpt(mntpt)</div><div class='add'>+            except:</div><div class='add'>+                logging.exception('mount cleanup failure:')</div><div class='add'>+                rv = 200</div><div class='add'>+            os._exit(rv)</div><div class='add'>+</div><div class='add'>+        #Polling the dht.subvol.status value.</div><div class='add'>+        RETRIES = 10</div><div class='add'>+        while not gf_mount_ready():</div><div class='add'>+            if RETRIES &lt; 0:</div><div class='add'>+                logging.error('Subvols are not up')</div><div class='add'>+                break</div><div class='add'>+            RETRIES -= 1</div><div class='add'>+            time.sleep(0.2)</div><div class='add'>+</div><div class='add'>+        logging.debug('auxiliary glusterfs mount prepared')</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+class DirectMounter(Mounter):</div><div class='add'>+</div><div class='add'>+    """mounter backend which calls mount(8), umount(8) directly"""</div><div class='add'>+</div><div class='add'>+    mountkw = {'stderr': subprocess.PIPE, 'universal_newlines': True}</div><div class='add'>+    glusterprog = 'glusterfs'</div><div class='add'>+</div><div class='add'>+    @staticmethod</div><div class='add'>+    def make_umount_argv(d):</div><div class='add'>+        return ['umount', '-l', d]</div><div class='add'>+</div><div class='add'>+    def make_mount_argv(self, label=None):</div><div class='add'>+        self.mntpt = tempfile.mkdtemp(prefix='gsyncd-aux-mount-')</div><div class='add'>+        rconf.mount_point = self.mntpt</div><div class='add'>+        return [self.get_glusterprog()] + \</div><div class='add'>+            ['--' + p for p in self.params] + [self.mntpt]</div><div class='add'>+</div><div class='add'>+    def cleanup_mntpt(self, mntpt=None):</div><div class='add'>+        if not mntpt:</div><div class='add'>+            mntpt = self.mntpt</div><div class='add'>+        errno_wrap(os.rmdir, [mntpt], [ENOENT, EBUSY])</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+class MountbrokerMounter(Mounter):</div><div class='add'>+</div><div class='add'>+    """mounter backend using the mountbroker gluster service"""</div><div class='add'>+</div><div class='add'>+    mountkw = {'stderr': subprocess.PIPE, 'stdout': subprocess.PIPE,</div><div class='add'>+               'universal_newlines': True}</div><div class='add'>+    glusterprog = 'gluster'</div><div class='add'>+</div><div class='add'>+    @classmethod</div><div class='add'>+    def make_cli_argv(cls):</div><div class='add'>+        return [cls.get_glusterprog()] + ['--remote-host=localhost'] + \</div><div class='add'>+            gconf.get("gluster-cli-options").split() + ['system::']</div><div class='add'>+</div><div class='add'>+    @classmethod</div><div class='add'>+    def make_umount_argv(cls, d):</div><div class='add'>+        return cls.make_cli_argv() + ['umount', d, 'lazy']</div><div class='add'>+</div><div class='add'>+    def make_mount_argv(self, label):</div><div class='add'>+        return self.make_cli_argv() + \</div><div class='add'>+            ['mount', label, 'user-map-root=' +</div><div class='add'>+                syncdutils.getusername()] + self.params</div><div class='add'>+</div><div class='add'>+    def handle_mounter(self, po):</div><div class='add'>+        self.mntpt = po.stdout.readline()[:-1]</div><div class='add'>+        rconf.mount_point = self.mntpt</div><div class='add'>+        rconf.mountbroker = True</div><div class='add'>+        self.umount_cmd = self.make_cli_argv() + ['umount']</div><div class='add'>+        rconf.mbr_umount_cmd = self.umount_cmd</div><div class='add'>+        po.stdout.close()</div><div class='add'>+        sup(self, po)</div><div class='add'>+        if po.returncode != 0:</div><div class='add'>+            # if cli terminated with error due to being</div><div class='add'>+            # refused by glusterd, what it put</div><div class='add'>+            # out on stdout is a diagnostic message</div><div class='add'>+            logging.error(lf('glusterd answered', mnt=self.mntpt))</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+class GLUSTERServer(Server):</div><div class='add'>+</div><div class='add'>+    "server enhancements for a glusterfs backend"""</div><div class='add'>+</div><div class='add'>+    @classmethod</div><div class='add'>+    def _attr_unpack_dict(cls, xattr, extra_fields=''):</div><div class='add'>+        """generic volume mark fetching/parsing backed"""</div><div class='add'>+        fmt_string = cls.NTV_FMTSTR + extra_fields</div><div class='add'>+        buf = Xattr.lgetxattr('.', xattr, struct.calcsize(fmt_string))</div><div class='add'>+        buf = str_to_bytearray(buf)</div><div class='add'>+        vm = struct.unpack(fmt_string, buf)</div><div class='add'>+        m = re.match(</div><div class='add'>+            '(.{8})(.{4})(.{4})(.{4})(.{12})',</div><div class='add'>+            "".join(['%02x' % x for x in vm[2:18]]))</div><div class='add'>+        uuid = '-'.join(m.groups())</div><div class='add'>+        volinfo = {'version': vm[0:2],</div><div class='add'>+                   'uuid': uuid,</div><div class='add'>+                   'retval': vm[18],</div><div class='add'>+                   'volume_mark': vm[19:21],</div><div class='add'>+                   }</div><div class='add'>+        if extra_fields:</div><div class='add'>+            return volinfo, vm[-len(extra_fields):]</div><div class='add'>+        else:</div><div class='add'>+            return volinfo</div><div class='add'>+</div><div class='add'>+    @classmethod</div><div class='add'>+    def foreign_volume_infos(cls):</div><div class='add'>+        """return list of valid (not expired) foreign volume marks"""</div><div class='add'>+        dict_list = []</div><div class='add'>+        xattr_list = Xattr.llistxattr_buf('.')</div><div class='add'>+        for ele in xattr_list:</div><div class='add'>+            if ele.find('.'.join([cls.GX_NSPACE, 'volume-mark', ''])) == 0:</div><div class='add'>+                d, x = cls._attr_unpack_dict(ele, cls.FRGN_XTRA_FMT)</div><div class='add'>+                now = int(time.time())</div><div class='add'>+                if x[0] &gt; now:</div><div class='add'>+                    logging.debug("volinfo[%s] expires: %d "</div><div class='add'>+                                  "(%d sec later)" %</div><div class='add'>+                                  (d['uuid'], x[0], x[0] - now))</div><div class='add'>+                    d['timeout'] = x[0]</div><div class='add'>+                    dict_list.append(d)</div><div class='add'>+                else:</div><div class='add'>+                    try:</div><div class='add'>+                        Xattr.lremovexattr('.', ele)</div><div class='add'>+                    except OSError:</div><div class='add'>+                        pass</div><div class='add'>+        return dict_list</div><div class='add'>+</div><div class='add'>+    @classmethod</div><div class='add'>+    def native_volume_info(cls):</div><div class='add'>+        """get the native volume mark of the underlying gluster volume"""</div><div class='add'>+        try:</div><div class='add'>+            return cls._attr_unpack_dict('.'.join([cls.GX_NSPACE,</div><div class='add'>+                                                   'volume-mark']))</div><div class='add'>+        except OSError:</div><div class='add'>+            ex = sys.exc_info()[1]</div><div class='add'>+            if ex.errno != ENODATA:</div><div class='add'>+                raise</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+class GLUSTER(object):</div><div class='add'>+</div><div class='add'>+    """scheme class for gluster:// urls</div><div class='add'>+</div><div class='add'>+    can be used to represent a gluster slave server</div><div class='add'>+    on slave side, or interface to a remote gluster</div><div class='add'>+    slave on master side, or to represent master</div><div class='add'>+    (slave-ish features come from the mixins, master</div><div class='add'>+    functionality is outsourced to GMaster from master)</div><div class='add'>+    """</div><div class='add'>+    server = GLUSTERServer</div><div class='add'>+</div><div class='add'>+    def __init__(self, host, volume):</div><div class='add'>+        self.path = "%s:%s" % (host, volume)</div><div class='add'>+        self.host = host</div><div class='add'>+        self.volume = volume</div><div class='add'>+</div><div class='add'>+        global slv_volume</div><div class='add'>+        global slv_host</div><div class='add'>+        slv_volume = self.volume</div><div class='add'>+        slv_host = self.host</div><div class='add'>+</div><div class='add'>+    def connect(self):</div><div class='add'>+        """inhibit the resource beyond</div><div class='add'>+</div><div class='add'>+        Choose mounting backend (direct or mountbroker),</div><div class='add'>+        set up glusterfs parameters and perform the mount</div><div class='add'>+        with given backend</div><div class='add'>+        """</div><div class='add'>+</div><div class='add'>+        logging.info("Mounting gluster volume locally...")</div><div class='add'>+        t0 = time.time()</div><div class='add'>+        label = gconf.get('mountbroker', None)</div><div class='add'>+        if not label and not privileged():</div><div class='add'>+            label = syncdutils.getusername()</div><div class='add'>+        mounter = label and MountbrokerMounter or DirectMounter</div><div class='add'>+</div><div class='add'>+        log_file = gconf.get("gluster-log-file")</div><div class='add'>+        if rconf.args.subcmd == "slave":</div><div class='add'>+            log_file = gconf.get("slave-gluster-log-file")</div><div class='add'>+</div><div class='add'>+        log_level = gconf.get("gluster-log-level")</div><div class='add'>+        if rconf.args.subcmd == "slave":</div><div class='add'>+            log_level = gconf.get("slave-gluster-log-level")</div><div class='add'>+</div><div class='add'>+        params = gconf.get("gluster-params").split() + \</div><div class='add'>+            ['log-level=' + log_level] + \</div><div class='add'>+            ['log-file=' + log_file, 'volfile-server=' + self.host] + \</div><div class='add'>+            ['volfile-id=' + self.volume, 'client-pid=-1']</div><div class='add'>+</div><div class='add'>+        self.mounter = mounter(params)</div><div class='add'>+        self.mounter.inhibit(label)</div><div class='add'>+        logging.info(lf("Mounted gluster volume",</div><div class='add'>+                        duration="%.4f" % (time.time() - t0)))</div><div class='add'>+</div><div class='add'>+    def gmaster_instantiate_tuple(self, slave):</div><div class='add'>+        """return a tuple of the 'one shot' and the 'main crawl'</div><div class='add'>+        class instance"""</div><div class='add'>+        return (gmaster_builder('xsync')(self, slave),</div><div class='add'>+                gmaster_builder()(self, slave),</div><div class='add'>+                gmaster_builder('changeloghistory')(self, slave))</div><div class='add'>+</div><div class='add'>+    def service_loop(self, slave=None):</div><div class='add'>+        """enter service loop</div><div class='add'>+</div><div class='add'>+        - if slave given, instantiate GMaster and</div><div class='add'>+          pass control to that instance, which implements</div><div class='add'>+          master behavior</div><div class='add'>+        - else do that's what's inherited</div><div class='add'>+        """</div><div class='add'>+        if rconf.args.subcmd == "slave":</div><div class='add'>+            if gconf.get("use-rsync-xattrs") and not privileged():</div><div class='add'>+                raise GsyncdError(</div><div class='add'>+                    "using rsync for extended attributes is not supported")</div><div class='add'>+</div><div class='add'>+            repce = RepceServer(</div><div class='add'>+                self.server, sys.stdin, sys.stdout, gconf.get("sync-jobs"))</div><div class='add'>+            t = syncdutils.Thread(target=lambda: (repce.service_loop(),</div><div class='add'>+                                                  syncdutils.finalize()))</div><div class='add'>+            t.start()</div><div class='add'>+            logging.info("slave listening")</div><div class='add'>+            if gconf.get("slave-timeout") and gconf.get("slave-timeout") &gt; 0:</div><div class='add'>+                while True:</div><div class='add'>+                    lp = self.server.last_keep_alive</div><div class='add'>+                    time.sleep(gconf.get("slave-timeout"))</div><div class='add'>+                    if lp == self.server.last_keep_alive:</div><div class='add'>+                        logging.info(</div><div class='add'>+                            lf("connection inactive, stopping",</div><div class='add'>+                               timeout=gconf.get("slave-timeout")))</div><div class='add'>+                        break</div><div class='add'>+            else:</div><div class='add'>+                select((), (), ())</div><div class='add'>+</div><div class='add'>+            return</div><div class='add'>+</div><div class='add'>+        class brickserver(Server):</div><div class='add'>+            local_path = rconf.args.local_path</div><div class='add'>+            aggregated = self.server</div><div class='add'>+</div><div class='add'>+            @classmethod</div><div class='add'>+            def entries(cls, path):</div><div class='add'>+                e = super(brickserver, cls).entries(path)</div><div class='add'>+                # on the brick don't mess with /.glusterfs</div><div class='add'>+                if path == '.':</div><div class='add'>+                    try:</div><div class='add'>+                        e.remove('.glusterfs')</div><div class='add'>+                        e.remove('.trashcan')</div><div class='add'>+                    except ValueError:</div><div class='add'>+                        pass</div><div class='add'>+                return e</div><div class='add'>+</div><div class='add'>+            @classmethod</div><div class='add'>+            def lstat(cls, e):</div><div class='add'>+                """ path based backend stat """</div><div class='add'>+                return super(brickserver, cls).lstat(e)</div><div class='add'>+</div><div class='add'>+            @classmethod</div><div class='add'>+            def gfid(cls, e):</div><div class='add'>+                """ path based backend gfid fetch """</div><div class='add'>+                return super(brickserver, cls).gfid(e)</div><div class='add'>+</div><div class='add'>+            @classmethod</div><div class='add'>+            def linkto_check(cls, e):</div><div class='add'>+                return super(brickserver, cls).linkto_check(e)</div><div class='add'>+</div><div class='add'>+        # define {,set_}xtime in slave, thus preempting</div><div class='add'>+        # the call to remote, so that it takes data from</div><div class='add'>+        # the local brick</div><div class='add'>+        slave.server.xtime = types.MethodType(</div><div class='add'>+            lambda _self, path, uuid: (</div><div class='add'>+                brickserver.xtime(path,</div><div class='add'>+                                  uuid + '.' + rconf.args.slave_id)</div><div class='add'>+            ),</div><div class='add'>+            slave.server)</div><div class='add'>+        slave.server.stime = types.MethodType(</div><div class='add'>+            lambda _self, path, uuid: (</div><div class='add'>+                brickserver.stime(path,</div><div class='add'>+                                  uuid + '.' + rconf.args.slave_id)</div><div class='add'>+            ),</div><div class='add'>+            slave.server)</div><div class='add'>+        slave.server.entry_stime = types.MethodType(</div><div class='add'>+            lambda _self, path, uuid: (</div><div class='add'>+                brickserver.entry_stime(</div><div class='add'>+                    path,</div><div class='add'>+                    uuid + '.' + rconf.args.slave_id)</div><div class='add'>+            ),</div><div class='add'>+            slave.server)</div><div class='add'>+        slave.server.set_stime = types.MethodType(</div><div class='add'>+            lambda _self, path, uuid, mark: (</div><div class='add'>+                brickserver.set_stime(path,</div><div class='add'>+                                      uuid + '.' + rconf.args.slave_id,</div><div class='add'>+                                      mark)</div><div class='add'>+            ),</div><div class='add'>+            slave.server)</div><div class='add'>+        slave.server.set_entry_stime = types.MethodType(</div><div class='add'>+            lambda _self, path, uuid, mark: (</div><div class='add'>+                brickserver.set_entry_stime(</div><div class='add'>+                    path,</div><div class='add'>+                    uuid + '.' + rconf.args.slave_id,</div><div class='add'>+                    mark)</div><div class='add'>+            ),</div><div class='add'>+            slave.server)</div><div class='add'>+</div><div class='add'>+        (g1, g2, g3) = self.gmaster_instantiate_tuple(slave)</div><div class='add'>+        g1.master.server = brickserver</div><div class='add'>+        g2.master.server = brickserver</div><div class='add'>+        g3.master.server = brickserver</div><div class='add'>+</div><div class='add'>+        # bad bad bad: bad way to do things like this</div><div class='add'>+        # need to make this elegant</div><div class='add'>+        # register the crawlers and start crawling</div><div class='add'>+        # g1 ==&gt; Xsync, g2 ==&gt; config.change_detector(changelog by default)</div><div class='add'>+        # g3 ==&gt; changelog History</div><div class='add'>+        status = GeorepStatus(gconf.get("state-file"),</div><div class='add'>+                              rconf.args.local_node,</div><div class='add'>+                              rconf.args.local_path,</div><div class='add'>+                              rconf.args.local_node_id,</div><div class='add'>+                              rconf.args.master,</div><div class='add'>+                              rconf.args.slave)</div><div class='add'>+        status.reset_on_worker_start()</div><div class='add'>+</div><div class='add'>+        try:</div><div class='add'>+            workdir = g2.setup_working_dir()</div><div class='add'>+            # Register only when change_detector is not set to</div><div class='add'>+            # xsync, else agent will generate changelog files</div><div class='add'>+            # in .processing directory of working dir</div><div class='add'>+            if gconf.get("change-detector") != 'xsync':</div><div class='add'>+                # register with the changelog library</div><div class='add'>+                # 9 == log level (DEBUG)</div><div class='add'>+                # 5 == connection retries</div><div class='add'>+                libgfchangelog.register(rconf.args.local_path,</div><div class='add'>+                                        workdir,</div><div class='add'>+                                        gconf.get("changelog-log-file"),</div><div class='add'>+                                        get_changelog_log_level(</div><div class='add'>+                                            gconf.get("changelog-log-level")),</div><div class='add'>+                                        g2.CHANGELOG_CONN_RETRIES)</div><div class='add'>+</div><div class='add'>+            register_time = int(time.time())</div><div class='add'>+            g2.register(register_time, status)</div><div class='add'>+            g3.register(register_time, status)</div><div class='add'>+        except ChangelogException as e:</div><div class='add'>+            logging.error(lf("Changelog register failed", error=e))</div><div class='add'>+            sys.exit(1)</div><div class='add'>+</div><div class='add'>+        g1.register(status=status)</div><div class='add'>+        logging.info(lf("Register time",</div><div class='add'>+                        time=register_time))</div><div class='add'>+        # oneshot: Try to use changelog history api, if not</div><div class='add'>+        # available switch to FS crawl</div><div class='add'>+        # Note: if config.change_detector is xsync then</div><div class='add'>+        # it will not use changelog history api</div><div class='add'>+        try:</div><div class='add'>+            g3.crawlwrap(oneshot=True)</div><div class='add'>+        except PartialHistoryAvailable as e:</div><div class='add'>+            logging.info(lf('Partial history available, using xsync crawl'</div><div class='add'>+                            ' after consuming history',</div><div class='add'>+                            till=e))</div><div class='add'>+            g1.crawlwrap(oneshot=True, register_time=register_time)</div><div class='add'>+        except ChangelogHistoryNotAvailable:</div><div class='add'>+            logging.info('Changelog history not available, using xsync')</div><div class='add'>+            g1.crawlwrap(oneshot=True, register_time=register_time)</div><div class='add'>+        except NoStimeAvailable:</div><div class='add'>+            logging.info('No stime available, using xsync crawl')</div><div class='add'>+            g1.crawlwrap(oneshot=True, register_time=register_time)</div><div class='add'>+        except ChangelogException as e:</div><div class='add'>+            logging.error(lf("Changelog History Crawl failed",</div><div class='add'>+                             error=e))</div><div class='add'>+            sys.exit(1)</div><div class='add'>+</div><div class='add'>+        try:</div><div class='add'>+            g2.crawlwrap()</div><div class='add'>+        except ChangelogException as e:</div><div class='add'>+            logging.error(lf("Changelog crawl failed", error=e))</div><div class='add'>+            sys.exit(1)</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+class SSH(object):</div><div class='add'>+</div><div class='add'>+    """scheme class for ssh:// urls</div><div class='add'>+</div><div class='add'>+    interface to remote slave on master side</div><div class='add'>+    implementing an ssh based proxy</div><div class='add'>+    """</div><div class='add'>+</div><div class='add'>+    def __init__(self, host, volume):</div><div class='add'>+        self.remote_addr = host</div><div class='add'>+        self.volume = volume</div><div class='add'>+</div><div class='add'>+    @staticmethod</div><div class='add'>+    def parse_ssh_address(self):</div><div class='add'>+        m = re.match('([^@]+)@(.+)', self.remote_addr)</div><div class='add'>+        if m:</div><div class='add'>+            u, h = m.groups()</div><div class='add'>+        else:</div><div class='add'>+            u, h = syncdutils.getusername(), self.remote_addr</div><div class='add'>+        self.remotehost = h</div><div class='add'>+        return {'user': u, 'host': h}</div><div class='add'>+</div><div class='add'>+    def start_fd_client(self, i, o):</div><div class='add'>+        """set up RePCe client, handshake with server</div><div class='add'>+</div><div class='add'>+        It's cut out as a separate method to let</div><div class='add'>+        subclasses hook into client startup</div><div class='add'>+        """</div><div class='add'>+        self.server = RepceClient(i, o)</div><div class='add'>+        rv = self.server.__version__()</div><div class='add'>+        exrv = {'proto': repce.repce_version, 'object': Server.version()}</div><div class='add'>+        da0 = (rv, exrv)</div><div class='add'>+        da1 = ({}, {})</div><div class='add'>+        for i in range(2):</div><div class='add'>+            for k, v in da0[i].items():</div><div class='add'>+                da1[i][k] = int(v)</div><div class='add'>+        if da1[0] != da1[1]:</div><div class='add'>+            raise GsyncdError(</div><div class='add'>+                "RePCe major version mismatch: local %s, remote %s" %</div><div class='add'>+                (exrv, rv))</div><div class='add'>+        slavepath = "/proc/%d/cwd" % self.server.pid()</div><div class='add'>+        self.slaveurl = ':'.join([self.remote_addr, slavepath])</div><div class='add'>+</div><div class='add'>+    def connect_remote(self):</div><div class='add'>+        """connect to inner slave url through outer ssh url</div><div class='add'>+</div><div class='add'>+        Wrap the connecting utility in ssh.</div><div class='add'>+</div><div class='add'>+        Much care is put into daemonizing: in that case</div><div class='add'>+        ssh is started before daemonization, but</div><div class='add'>+        RePCe client is to be created after that (as ssh</div><div class='add'>+        interactive password auth would be defeated by</div><div class='add'>+        a daemonized ssh, while client should be present</div><div class='add'>+        only in the final process). In that case the action</div><div class='add'>+        is taken apart to two parts, this method is ivoked</div><div class='add'>+        once pre-daemon, once post-daemon. Use @go_daemon</div><div class='add'>+        to deiced what part to perform.</div><div class='add'>+</div><div class='add'>+        [NB. ATM gluster product does not makes use of interactive</div><div class='add'>+        authentication.]</div><div class='add'>+        """</div><div class='add'>+        syncdutils.setup_ssh_ctl(tempfile.mkdtemp(prefix='gsyncd-aux-ssh-'),</div><div class='add'>+                                 self.remote_addr,</div><div class='add'>+                                 self.volume)</div><div class='add'>+</div><div class='add'>+        logging.info("Initializing SSH connection between master and slave...")</div><div class='add'>+        t0 = time.time()</div><div class='add'>+</div><div class='add'>+        extra_opts = []</div><div class='add'>+        remote_gsyncd = gconf.get("remote-gsyncd")</div><div class='add'>+        if remote_gsyncd == "":</div><div class='add'>+            remote_gsyncd = "/nonexistent/gsyncd"</div><div class='add'>+</div><div class='add'>+        if gconf.get("use-rsync-xattrs"):</div><div class='add'>+            extra_opts.append('--use-rsync-xattrs')</div><div class='add'>+</div><div class='add'>+        args_to_slave = [gconf.get("ssh-command")] + \</div><div class='add'>+            gconf.get("ssh-options").split() + \</div><div class='add'>+            ["-p", str(gconf.get("ssh-port"))] + \</div><div class='add'>+            rconf.ssh_ctl_args + [self.remote_addr] + \</div><div class='add'>+            [remote_gsyncd, "slave"] + \</div><div class='add'>+            extra_opts + \</div><div class='add'>+            [rconf.args.master, rconf.args.slave] + \</div><div class='add'>+            [</div><div class='add'>+                '--master-node', rconf.args.local_node,</div><div class='add'>+                '--master-node-id', rconf.args.local_node_id,</div><div class='add'>+                '--master-brick', rconf.args.local_path,</div><div class='add'>+                '--local-node', rconf.args.resource_remote,</div><div class='add'>+                '--local-node-id', rconf.args.resource_remote_id] + \</div><div class='add'>+            [</div><div class='add'>+                # Add all config arguments here, slave gsyncd will not use</div><div class='add'>+                # config file in slave side, so all overriding options should</div><div class='add'>+                # be sent as arguments</div><div class='add'>+                '--slave-timeout', str(gconf.get("slave-timeout")),</div><div class='add'>+                '--slave-log-level', gconf.get("slave-log-level"),</div><div class='add'>+                '--slave-gluster-log-level',</div><div class='add'>+                gconf.get("slave-gluster-log-level"),</div><div class='add'>+                '--slave-gluster-command-dir',</div><div class='add'>+                gconf.get("slave-gluster-command-dir"),</div><div class='add'>+                '--master-dist-count',</div><div class='add'>+                str(gconf.get("master-distribution-count"))]</div><div class='add'>+</div><div class='add'>+        if gconf.get("slave-access-mount"):</div><div class='add'>+            args_to_slave.append('--slave-access-mount')</div><div class='add'>+</div><div class='add'>+        if rconf.args.debug:</div><div class='add'>+            args_to_slave.append('--debug')</div><div class='add'>+</div><div class='add'>+        po = Popen(args_to_slave,</div><div class='add'>+                   stdin=subprocess.PIPE, stdout=subprocess.PIPE,</div><div class='add'>+                   stderr=subprocess.PIPE)</div><div class='add'>+        rconf.transport = po</div><div class='add'>+        self.start_fd_client(po.stdout, po.stdin)</div><div class='add'>+        logging.info(lf("SSH connection between master and slave established.",</div><div class='add'>+                        duration="%.4f" % (time.time() - t0)))</div><div class='add'>+</div><div class='add'>+    def rsync(self, files, *args, **kw):</div><div class='add'>+        """invoke rsync"""</div><div class='add'>+        if not files:</div><div class='add'>+            raise GsyncdError("no files to sync")</div><div class='add'>+        logging.debug("files: " + ", ".join(files))</div><div class='add'>+</div><div class='add'>+        extra_rsync_flags = []</div><div class='add'>+        # Performance flag, --ignore-missing-args, if rsync version is</div><div class='add'>+        # greater than 3.1.0 then include this flag.</div><div class='add'>+        if gconf.get("rsync-opt-ignore-missing-args") and \</div><div class='add'>+           get_rsync_version(gconf.get("rsync-command")) &gt;= "3.1.0":</div><div class='add'>+            extra_rsync_flags = ["--ignore-missing-args"]</div><div class='add'>+</div><div class='add'>+        rsync_ssh_opts = [gconf.get("ssh-command")] + \</div><div class='add'>+            gconf.get("ssh-options").split() + \</div><div class='add'>+            ["-p", str(gconf.get("ssh-port"))] + \</div><div class='add'>+            rconf.ssh_ctl_args + \</div><div class='add'>+            gconf.get("rsync-ssh-options").split()</div><div class='add'>+</div><div class='add'>+        argv = [</div><div class='add'>+            gconf.get("rsync-command"),</div><div class='add'>+            '-aR0',</div><div class='add'>+            '--inplace',</div><div class='add'>+            '--files-from=-',</div><div class='add'>+            '--super',</div><div class='add'>+            '--stats',</div><div class='add'>+            '--numeric-ids',</div><div class='add'>+            '--no-implied-dirs'</div><div class='add'>+        ]</div><div class='add'>+</div><div class='add'>+        if gconf.get("rsync-opt-existing"):</div><div class='add'>+            argv += ["--existing"]</div><div class='add'>+</div><div class='add'>+        if gconf.get("sync-xattrs"):</div><div class='add'>+            argv += ['--xattrs']</div><div class='add'>+</div><div class='add'>+        if gconf.get("sync-acls"):</div><div class='add'>+            argv += ['--acls']</div><div class='add'>+</div><div class='add'>+        argv = argv + \</div><div class='add'>+            gconf.get("rsync-options").split() + \</div><div class='add'>+            extra_rsync_flags + ['.'] + \</div><div class='add'>+            ["-e", " ".join(rsync_ssh_opts)] + \</div><div class='add'>+            [self.slaveurl]</div><div class='add'>+</div><div class='add'>+        log_rsync_performance = gconf.getr("log-rsync-performance", False)</div><div class='add'>+</div><div class='add'>+        if log_rsync_performance:</div><div class='add'>+            # use stdout=PIPE only when log_rsync_performance enabled</div><div class='add'>+            # Else rsync will write to stdout and nobody is there</div><div class='add'>+            # to consume. If PIPE is full rsync hangs.</div><div class='add'>+            po = Popen(argv, stdin=subprocess.PIPE, stdout=subprocess.PIPE,</div><div class='add'>+                       stderr=subprocess.PIPE, universal_newlines=True)</div><div class='add'>+        else:</div><div class='add'>+            po = Popen(argv, stdin=subprocess.PIPE, stderr=subprocess.PIPE,</div><div class='add'>+                       universal_newlines=True)</div><div class='add'>+</div><div class='add'>+        for f in files:</div><div class='add'>+            po.stdin.write(f)</div><div class='add'>+            po.stdin.write('\0')</div><div class='add'>+</div><div class='add'>+        stdout, stderr = po.communicate()</div><div class='add'>+</div><div class='add'>+        if kw.get("log_err", False):</div><div class='add'>+            for errline in stderr.strip().split("\n")[:-1]:</div><div class='add'>+                logging.error(lf("SYNC Error",</div><div class='add'>+                                 sync_engine="Rsync",</div><div class='add'>+                                 error=errline))</div><div class='add'>+</div><div class='add'>+        if log_rsync_performance:</div><div class='add'>+            rsync_msg = []</div><div class='add'>+            for line in stdout.split("\n"):</div><div class='add'>+                if line.startswith("Number of files:") or \</div><div class='add'>+                   line.startswith("Number of regular files transferred:") or \</div><div class='add'>+                   line.startswith("Total file size:") or \</div><div class='add'>+                   line.startswith("Total transferred file size:") or \</div><div class='add'>+                   line.startswith("Literal data:") or \</div><div class='add'>+                   line.startswith("Matched data:") or \</div><div class='add'>+                   line.startswith("Total bytes sent:") or \</div><div class='add'>+                   line.startswith("Total bytes received:") or \</div><div class='add'>+                   line.startswith("sent "):</div><div class='add'>+                    rsync_msg.append(line)</div><div class='add'>+            logging.info(lf("rsync performance",</div><div class='add'>+                            data=", ".join(rsync_msg)))</div><div class='add'>+</div><div class='add'>+        return po</div><div class='add'>+</div><div class='add'>+    def tarssh(self, files, log_err=False):</div><div class='add'>+        """invoke tar+ssh</div><div class='add'>+        -z (compress) can be use if needed, but omitting it now</div><div class='add'>+        as it results in weird error (tar+ssh errors out (errcode: 2)</div><div class='add'>+        """</div><div class='add'>+        if not files:</div><div class='add'>+            raise GsyncdError("no files to sync")</div><div class='add'>+        logging.debug("files: " + ", ".join(files))</div><div class='add'>+        (host, rdir) = self.slaveurl.split(':')</div><div class='add'>+</div><div class='add'>+        tar_cmd = ["tar"] + \</div><div class='add'>+            ["--sparse", "-cf", "-", "--files-from", "-"]</div><div class='add'>+        ssh_cmd = gconf.get("ssh-command").split() + \</div><div class='add'>+            gconf.get("ssh-options-tar").split() + \</div><div class='add'>+            ["-p", str(gconf.get("ssh-port"))] + \</div><div class='add'>+            [host, "tar"] + \</div><div class='add'>+            ["--overwrite", "-xf", "-", "-C", rdir]</div><div class='add'>+        p0 = Popen(tar_cmd, stdout=subprocess.PIPE,</div><div class='add'>+                   stdin=subprocess.PIPE, stderr=subprocess.PIPE,</div><div class='add'>+                   universal_newlines=True)</div><div class='add'>+        p1 = Popen(ssh_cmd, stdin=p0.stdout, stderr=subprocess.PIPE,</div><div class='add'>+                   universal_newlines=True)</div><div class='add'>+        for f in files:</div><div class='add'>+            p0.stdin.write(f)</div><div class='add'>+            p0.stdin.write('\n')</div><div class='add'>+</div><div class='add'>+        p0.stdin.close()</div><div class='add'>+        p0.stdout.close()  # Allow p0 to receive a SIGPIPE if p1 exits.</div><div class='add'>+</div><div class='add'>+        # stdin and stdout of p0 is already closed, Reset to None and</div><div class='add'>+        # wait for child process to complete</div><div class='add'>+        p0.stdin = None</div><div class='add'>+        p0.stdout = None</div><div class='add'>+</div><div class='add'>+        def wait_for_tar(p0):</div><div class='add'>+            _, stderr = p0.communicate()</div><div class='add'>+            if log_err:</div><div class='add'>+                for errline in stderr.strip().split("\n")[:-1]:</div><div class='add'>+                    if "No such file or directory" not in errline:</div><div class='add'>+                        logging.error(lf("SYNC Error",</div><div class='add'>+                                         sync_engine="Tarssh",</div><div class='add'>+                                         error=errline))</div><div class='add'>+</div><div class='add'>+        t = syncdutils.Thread(target=wait_for_tar, args=(p0, ))</div><div class='add'>+        # wait for tar to terminate, collecting any errors, further</div><div class='add'>+        # waiting for transfer to complete</div><div class='add'>+        t.start()</div><div class='add'>+</div><div class='add'>+        # wait for ssh process</div><div class='add'>+        _, stderr1 = p1.communicate()</div><div class='add'>+        t.join()</div><div class='add'>+</div><div class='add'>+        if log_err:</div><div class='add'>+            for errline in stderr1.strip().split("\n")[:-1]:</div><div class='add'>+                logging.error(lf("SYNC Error",</div><div class='add'>+                                 sync_engine="Tarssh",</div><div class='add'>+                                 error=errline))</div><div class='add'>+</div><div class='add'>+        return p1</div><div class='head'>diff --git a/geo-replication/syncdaemon/subcmds.py b/geo-replication/syncdaemon/subcmds.py<br/>new file mode 100644<br/>index 00000000000..b8508532e30<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/geo-replication/syncdaemon/subcmds.py?id=d1d7a6f35c816822fab51c820e25023863c239c1'>geo-replication/syncdaemon/subcmds.py</a></div><div class='hunk'>@@ -0,0 +1,335 @@</div><div class='add'>+# -*- coding: utf-8 -*-</div><div class='add'>+#</div><div class='add'>+#  Copyright (c) 2016 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+#  This file is part of GlusterFS.</div><div class='add'>+#</div><div class='add'>+#  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+#  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+#  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+#  cases as published by the Free Software Foundation.</div><div class='add'>+#</div><div class='add'>+</div><div class='add'>+from __future__ import print_function</div><div class='add'>+from syncdutils import lf</div><div class='add'>+import logging</div><div class='add'>+import gsyncdconfig as gconf</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+ERROR_CONFIG_INVALID = 2</div><div class='add'>+ERROR_CONFIG_INVALID_VALUE = 3</div><div class='add'>+ERROR_CONFIG_NOT_CONFIGURABLE = 4</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def subcmd_monitor_status(args):</div><div class='add'>+    from gsyncdstatus import set_monitor_status</div><div class='add'>+    from rconf import rconf</div><div class='add'>+</div><div class='add'>+    set_monitor_status(gconf.get("state-file"), args.status)</div><div class='add'>+    rconf.log_exit = False</div><div class='add'>+    logging.info(lf("Monitor Status Change", status=args.status))</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def subcmd_status(args):</div><div class='add'>+    from gsyncdstatus import GeorepStatus</div><div class='add'>+</div><div class='add'>+    master_name = args.master.replace(":", "")</div><div class='add'>+    slave_data = args.slave.replace("ssh://", "")</div><div class='add'>+</div><div class='add'>+    brick_status = GeorepStatus(gconf.get("state-file"),</div><div class='add'>+                                "",</div><div class='add'>+                                args.local_path,</div><div class='add'>+                                "",</div><div class='add'>+                                master_name,</div><div class='add'>+                                slave_data,</div><div class='add'>+                                gconf.get("pid-file"))</div><div class='add'>+    checkpoint_time = gconf.get("checkpoint", 0)</div><div class='add'>+    brick_status.print_status(checkpoint_time=checkpoint_time,</div><div class='add'>+                              json_output=args.json)</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def subcmd_monitor(args):</div><div class='add'>+    import monitor</div><div class='add'>+    from resource import GLUSTER, SSH, Popen</div><div class='add'>+    go_daemon = False if args.debug else True</div><div class='add'>+</div><div class='add'>+    monitor.startup(go_daemon)</div><div class='add'>+    Popen.init_errhandler()</div><div class='add'>+    local = GLUSTER("localhost", args.master)</div><div class='add'>+    slavehost, slavevol = args.slave.split("::")</div><div class='add'>+    remote = SSH(slavehost, slavevol)</div><div class='add'>+    return monitor.monitor(local, remote)</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def subcmd_verify_spawning(args):</div><div class='add'>+    logging.info("Able to spawn gsyncd.py")</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def subcmd_worker(args):</div><div class='add'>+    import os</div><div class='add'>+    import fcntl</div><div class='add'>+</div><div class='add'>+    from resource import GLUSTER, SSH, Popen</div><div class='add'>+</div><div class='add'>+    Popen.init_errhandler()</div><div class='add'>+    fcntl.fcntl(args.feedback_fd, fcntl.F_SETFD, fcntl.FD_CLOEXEC)</div><div class='add'>+    local = GLUSTER("localhost", args.master)</div><div class='add'>+    slave_url, slavevol = args.slave.split("::")</div><div class='add'>+    if "@" not in slave_url:</div><div class='add'>+        slavehost = args.resource_remote</div><div class='add'>+    else:</div><div class='add'>+        slavehost = "%s@%s" % (slave_url.split("@")[0], args.resource_remote)</div><div class='add'>+    remote = SSH(slavehost, slavevol)</div><div class='add'>+    remote.connect_remote()</div><div class='add'>+    local.connect()</div><div class='add'>+    logging.info("Worker spawn successful. Acknowledging back to monitor")</div><div class='add'>+    os.close(args.feedback_fd)</div><div class='add'>+    local.service_loop(remote)</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def subcmd_slave(args):</div><div class='add'>+    from resource import GLUSTER, Popen</div><div class='add'>+</div><div class='add'>+    Popen.init_errhandler()</div><div class='add'>+    slavevol = args.slave.split("::")[-1]</div><div class='add'>+    local = GLUSTER("localhost", slavevol)</div><div class='add'>+</div><div class='add'>+    local.connect()</div><div class='add'>+    local.service_loop()</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def subcmd_voluuidget(args):</div><div class='add'>+    from subprocess import Popen, PIPE</div><div class='add'>+    import xml.etree.ElementTree as XET</div><div class='add'>+</div><div class='add'>+    ParseError = XET.ParseError if hasattr(XET, 'ParseError') else SyntaxError</div><div class='add'>+</div><div class='add'>+    cmd = ['gluster', '--xml', '--remote-host=' + args.host,</div><div class='add'>+           'volume', 'info', args.volname]</div><div class='add'>+</div><div class='add'>+    if args.inet6:</div><div class='add'>+        cmd.append("--inet6")</div><div class='add'>+</div><div class='add'>+    po = Popen(cmd, bufsize=0,</div><div class='add'>+               stdin=None, stdout=PIPE, stderr=PIPE,</div><div class='add'>+               universal_newlines=True)</div><div class='add'>+</div><div class='add'>+    vix, err = po.communicate()</div><div class='add'>+    if po.returncode != 0:</div><div class='add'>+        logging.info(lf("Volume info failed, unable to get "</div><div class='add'>+                        "volume uuid of slavevol, "</div><div class='add'>+                        "returning empty string",</div><div class='add'>+                        slavevol=args.volname,</div><div class='add'>+                        slavehost=args.host,</div><div class='add'>+                        error=po.returncode))</div><div class='add'>+        return ""</div><div class='add'>+    vi = XET.fromstring(vix)</div><div class='add'>+    if vi.find('opRet').text != '0':</div><div class='add'>+        logging.info(lf("Unable to get volume uuid of slavevol, "</div><div class='add'>+                        "returning empty string",</div><div class='add'>+                        slavevol=args.volname,</div><div class='add'>+                        slavehost=args.host,</div><div class='add'>+                        error=vi.find('opErrstr').text))</div><div class='add'>+        return ""</div><div class='add'>+</div><div class='add'>+    try:</div><div class='add'>+        voluuid = vi.find("volInfo/volumes/volume/id").text</div><div class='add'>+    except (ParseError, AttributeError, ValueError) as e:</div><div class='add'>+        logging.info(lf("Parsing failed to volume uuid of slavevol, "</div><div class='add'>+                        "returning empty string",</div><div class='add'>+                        slavevol=args.volname,</div><div class='add'>+                        slavehost=args.host,</div><div class='add'>+                        error=e))</div><div class='add'>+        voluuid = ""</div><div class='add'>+</div><div class='add'>+    print(voluuid)</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def _unlink(path):</div><div class='add'>+    import os</div><div class='add'>+    from errno import ENOENT</div><div class='add'>+    from syncdutils import GsyncdError</div><div class='add'>+    import sys</div><div class='add'>+</div><div class='add'>+    try:</div><div class='add'>+        os.unlink(path)</div><div class='add'>+    except (OSError, IOError):</div><div class='add'>+        if sys.exc_info()[1].errno == ENOENT:</div><div class='add'>+            pass</div><div class='add'>+        else:</div><div class='add'>+            raise GsyncdError('Unlink error: %s' % path)</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def subcmd_delete(args):</div><div class='add'>+    import logging</div><div class='add'>+    import shutil</div><div class='add'>+    import glob</div><div class='add'>+    import sys</div><div class='add'>+    from errno import ENOENT, ENODATA</div><div class='add'>+    import struct</div><div class='add'>+</div><div class='add'>+    from syncdutils import GsyncdError, Xattr, errno_wrap</div><div class='add'>+    import gsyncdconfig as gconf</div><div class='add'>+</div><div class='add'>+    logging.info('geo-replication delete')</div><div class='add'>+    # remove the stime xattr from all the brick paths so that</div><div class='add'>+    # a re-create of a session will start sync all over again</div><div class='add'>+    stime_xattr_prefix = gconf.get('stime-xattr-prefix', None)</div><div class='add'>+</div><div class='add'>+    # Delete pid file, status file, socket file</div><div class='add'>+    cleanup_paths = []</div><div class='add'>+    cleanup_paths.append(gconf.get("pid-file"))</div><div class='add'>+</div><div class='add'>+    # Cleanup Session dir</div><div class='add'>+    try:</div><div class='add'>+        shutil.rmtree(gconf.get("georep-session-working-dir"))</div><div class='add'>+    except (IOError, OSError):</div><div class='add'>+        if sys.exc_info()[1].errno == ENOENT:</div><div class='add'>+            pass</div><div class='add'>+        else:</div><div class='add'>+            raise GsyncdError(</div><div class='add'>+                'Error while removing working dir: %s' %</div><div class='add'>+                gconf.get("georep-session-working-dir"))</div><div class='add'>+</div><div class='add'>+    # Cleanup changelog working dirs</div><div class='add'>+    try:</div><div class='add'>+        shutil.rmtree(gconf.get("working-dir"))</div><div class='add'>+    except (IOError, OSError):</div><div class='add'>+        if sys.exc_info()[1].errno == ENOENT:</div><div class='add'>+            pass</div><div class='add'>+        else:</div><div class='add'>+            raise GsyncdError(</div><div class='add'>+                'Error while removing working dir: %s' %</div><div class='add'>+                gconf.get("working-dir"))</div><div class='add'>+</div><div class='add'>+    for path in cleanup_paths:</div><div class='add'>+        # To delete temp files</div><div class='add'>+        for f in glob.glob(path + "*"):</div><div class='add'>+            _unlink(f)</div><div class='add'>+</div><div class='add'>+    if args.reset_sync_time and stime_xattr_prefix:</div><div class='add'>+        for p in args.paths:</div><div class='add'>+            if p != "":</div><div class='add'>+                # set stime to (0,0) to trigger full volume content resync</div><div class='add'>+                # to slave on session recreation</div><div class='add'>+                # look at master.py::Xcrawl   hint: zero_zero</div><div class='add'>+                errno_wrap(Xattr.lsetxattr,</div><div class='add'>+                           (p, stime_xattr_prefix + ".stime",</div><div class='add'>+                            struct.pack("!II", 0, 0)),</div><div class='add'>+                           [ENOENT, ENODATA])</div><div class='add'>+                errno_wrap(Xattr.lremovexattr,</div><div class='add'>+                           (p, stime_xattr_prefix + ".entry_stime"),</div><div class='add'>+                           [ENOENT, ENODATA])</div><div class='add'>+</div><div class='add'>+    return</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def print_config(name, value, only_value=False, use_underscore=False):</div><div class='add'>+    val = value</div><div class='add'>+    if isinstance(value, bool):</div><div class='add'>+        val = str(value).lower()</div><div class='add'>+</div><div class='add'>+    if only_value:</div><div class='add'>+        print(val)</div><div class='add'>+    else:</div><div class='add'>+        if use_underscore:</div><div class='add'>+            name = name.replace("-", "_")</div><div class='add'>+</div><div class='add'>+        print(("%s:%s" % (name, val)))</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def config_name_format(val):</div><div class='add'>+    return val.replace("_", "-")</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def subcmd_config_get(args):</div><div class='add'>+    import sys</div><div class='add'>+    import json</div><div class='add'>+</div><div class='add'>+    all_config = gconf.getall(show_defaults=args.show_defaults,</div><div class='add'>+                              show_non_configurable=True)</div><div class='add'>+    if args.name is not None:</div><div class='add'>+        val = all_config.get(config_name_format(args.name), None)</div><div class='add'>+        if val is None:</div><div class='add'>+            sys.stderr.write("Invalid config name \"%s\"\n" % args.name)</div><div class='add'>+            sys.exit(ERROR_CONFIG_INVALID)</div><div class='add'>+</div><div class='add'>+        print_config(args.name, val["value"], only_value=args.only_value,</div><div class='add'>+                     use_underscore=args.use_underscore)</div><div class='add'>+        return</div><div class='add'>+</div><div class='add'>+    if args.json:</div><div class='add'>+        out = []</div><div class='add'>+        # Convert all values as string</div><div class='add'>+        for k in sorted(all_config):</div><div class='add'>+            v = all_config[k]</div><div class='add'>+            out.append({</div><div class='add'>+                "name": k,</div><div class='add'>+                "value": str(v["value"]),</div><div class='add'>+                "default": str(v["default"]),</div><div class='add'>+                "configurable": v["configurable"],</div><div class='add'>+                "modified": v["modified"]</div><div class='add'>+            })</div><div class='add'>+</div><div class='add'>+        print((json.dumps(out)))</div><div class='add'>+        return</div><div class='add'>+</div><div class='add'>+    for k in sorted(all_config):</div><div class='add'>+        print_config(k, all_config[k]["value"],</div><div class='add'>+                     use_underscore=args.use_underscore)</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def subcmd_config_check(args):</div><div class='add'>+    import sys</div><div class='add'>+</div><div class='add'>+    try:</div><div class='add'>+        gconf.check(config_name_format(args.name), value=args.value,</div><div class='add'>+                    with_conffile=False)</div><div class='add'>+    except gconf.GconfNotConfigurable:</div><div class='add'>+        cnf_val = gconf.get(config_name_format(args.name), None)</div><div class='add'>+        if cnf_val is None:</div><div class='add'>+            sys.stderr.write("Invalid config name \"%s\"\n" % args.name)</div><div class='add'>+            sys.exit(ERROR_CONFIG_INVALID)</div><div class='add'>+</div><div class='add'>+        # Not configurable</div><div class='add'>+        sys.stderr.write("Not configurable \"%s\"\n" % args.name)</div><div class='add'>+        sys.exit(ERROR_CONFIG_NOT_CONFIGURABLE)</div><div class='add'>+    except gconf.GconfInvalidValue:</div><div class='add'>+        sys.stderr.write("Invalid config value \"%s=%s\"\n" % (args.name,</div><div class='add'>+                                                               args.value))</div><div class='add'>+        sys.exit(ERROR_CONFIG_INVALID_VALUE)</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def subcmd_config_set(args):</div><div class='add'>+    import sys</div><div class='add'>+</div><div class='add'>+    try:</div><div class='add'>+        gconf.setconfig(config_name_format(args.name), args.value)</div><div class='add'>+    except gconf.GconfNotConfigurable:</div><div class='add'>+        cnf_val = gconf.get(config_name_format(args.name), None)</div><div class='add'>+        if cnf_val is None:</div><div class='add'>+            sys.stderr.write("Invalid config name \"%s\"\n" % args.name)</div><div class='add'>+            sys.exit(ERROR_CONFIG_INVALID)</div><div class='add'>+</div><div class='add'>+        # Not configurable</div><div class='add'>+        sys.stderr.write("Not configurable \"%s\"\n" % args.name)</div><div class='add'>+        sys.exit(ERROR_CONFIG_NOT_CONFIGURABLE)</div><div class='add'>+    except gconf.GconfInvalidValue:</div><div class='add'>+        sys.stderr.write("Invalid config value \"%s=%s\"\n" % (args.name,</div><div class='add'>+                                                               args.value))</div><div class='add'>+        sys.exit(ERROR_CONFIG_INVALID_VALUE)</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def subcmd_config_reset(args):</div><div class='add'>+    import sys</div><div class='add'>+</div><div class='add'>+    try:</div><div class='add'>+        gconf.resetconfig(config_name_format(args.name))</div><div class='add'>+    except gconf.GconfNotConfigurable:</div><div class='add'>+        cnf_val = gconf.get(config_name_format(args.name), None)</div><div class='add'>+        if cnf_val is None:</div><div class='add'>+            sys.stderr.write("Invalid config name \"%s\"\n" % args.name)</div><div class='add'>+            sys.exit(ERROR_CONFIG_INVALID)</div><div class='add'>+</div><div class='add'>+        # Not configurable</div><div class='add'>+        sys.stderr.write("Not configurable \"%s\"\n" % args.name)</div><div class='add'>+        sys.exit(ERROR_CONFIG_NOT_CONFIGURABLE)</div><div class='head'>diff --git a/geo-replication/syncdaemon/syncdutils.py b/geo-replication/syncdaemon/syncdutils.py<br/>new file mode 100644<br/>index 00000000000..a3df103e76c<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/geo-replication/syncdaemon/syncdutils.py?id=d1d7a6f35c816822fab51c820e25023863c239c1'>geo-replication/syncdaemon/syncdutils.py</a></div><div class='hunk'>@@ -0,0 +1,1115 @@</div><div class='add'>+#</div><div class='add'>+# Copyright (c) 2011-2014 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+# This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+# This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+# General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+# later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+# cases as published by the Free Software Foundation.</div><div class='add'>+#</div><div class='add'>+</div><div class='add'>+import os</div><div class='add'>+import sys</div><div class='add'>+import pwd</div><div class='add'>+import time</div><div class='add'>+import fcntl</div><div class='add'>+import shutil</div><div class='add'>+import logging</div><div class='add'>+import errno</div><div class='add'>+import threading</div><div class='add'>+import subprocess</div><div class='add'>+import socket</div><div class='add'>+from subprocess import PIPE</div><div class='add'>+from threading import Lock, Thread as baseThread</div><div class='add'>+from errno import (EACCES, EAGAIN, EPIPE, ENOTCONN, ENOMEM, ECONNABORTED,</div><div class='add'>+                   EINTR, ENOENT, ESTALE, EBUSY, ENODATA, errorcode, EIO)</div><div class='add'>+from signal import signal, SIGTERM</div><div class='add'>+import select as oselect</div><div class='add'>+from os import waitpid as owaitpid</div><div class='add'>+import xml.etree.ElementTree as XET</div><div class='add'>+from select import error as SelectError</div><div class='add'>+try:</div><div class='add'>+    from cPickle import PickleError</div><div class='add'>+except ImportError:</div><div class='add'>+    from pickle import PickleError</div><div class='add'>+</div><div class='add'>+from conf import GLUSTERFS_LIBEXECDIR, UUID_FILE</div><div class='add'>+sys.path.insert(1, GLUSTERFS_LIBEXECDIR)</div><div class='add'>+EVENTS_ENABLED = True</div><div class='add'>+try:</div><div class='add'>+    from gfevents.eventtypes import GEOREP_FAULTY as EVENT_GEOREP_FAULTY</div><div class='add'>+    from gfevents.eventtypes import GEOREP_ACTIVE as EVENT_GEOREP_ACTIVE</div><div class='add'>+    from gfevents.eventtypes import GEOREP_PASSIVE as EVENT_GEOREP_PASSIVE</div><div class='add'>+    from gfevents.eventtypes import GEOREP_CHECKPOINT_COMPLETED \</div><div class='add'>+        as EVENT_GEOREP_CHECKPOINT_COMPLETED</div><div class='add'>+except ImportError:</div><div class='add'>+    # Events APIs not installed, dummy eventtypes with None</div><div class='add'>+    EVENTS_ENABLED = False</div><div class='add'>+    EVENT_GEOREP_FAULTY = None</div><div class='add'>+    EVENT_GEOREP_ACTIVE = None</div><div class='add'>+    EVENT_GEOREP_PASSIVE = None</div><div class='add'>+    EVENT_GEOREP_CHECKPOINT_COMPLETED = None</div><div class='add'>+</div><div class='add'>+import gsyncdconfig as gconf</div><div class='add'>+from rconf import rconf</div><div class='add'>+</div><div class='add'>+from hashlib import sha256 as sha256</div><div class='add'>+</div><div class='add'>+ENOTSUP = getattr(errno, 'ENOTSUP', 'EOPNOTSUPP')</div><div class='add'>+</div><div class='add'>+# auxiliary gfid based access prefix</div><div class='add'>+_CL_AUX_GFID_PFX = ".gfid/"</div><div class='add'>+ROOT_GFID = "00000000-0000-0000-0000-000000000001"</div><div class='add'>+GF_OP_RETRIES = 10</div><div class='add'>+</div><div class='add'>+GX_GFID_CANONICAL_LEN = 37  # canonical gfid len + '\0'</div><div class='add'>+</div><div class='add'>+NodeID = None</div><div class='add'>+rsync_version = None</div><div class='add'>+unshare_mnt_propagation = None</div><div class='add'>+slv_bricks = None</div><div class='add'>+SPACE_ESCAPE_CHAR = "%20"</div><div class='add'>+NEWLINE_ESCAPE_CHAR = "%0A"</div><div class='add'>+PERCENTAGE_ESCAPE_CHAR = "%25"</div><div class='add'>+</div><div class='add'>+final_lock = Lock()</div><div class='add'>+</div><div class='add'>+def sup(x, *a, **kw):</div><div class='add'>+    """a rubyesque "super" for python ;)</div><div class='add'>+</div><div class='add'>+    invoke caller method in parent class with given args.</div><div class='add'>+    """</div><div class='add'>+    return getattr(super(type(x), x),</div><div class='add'>+                   sys._getframe(1).f_code.co_name)(*a, **kw)</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def escape(s):</div><div class='add'>+    """the chosen flavor of string escaping, used all over</div><div class='add'>+       to turn whatever data to creatable representation"""</div><div class='add'>+    return s.replace("/", "-").strip("-")</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def escape_space_newline(s):</div><div class='add'>+    return s.replace("%", PERCENTAGE_ESCAPE_CHAR)\</div><div class='add'>+            .replace(" ", SPACE_ESCAPE_CHAR)\</div><div class='add'>+            .replace("\n", NEWLINE_ESCAPE_CHAR)</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def unescape_space_newline(s):</div><div class='add'>+    return s.replace(SPACE_ESCAPE_CHAR, " ")\</div><div class='add'>+            .replace(NEWLINE_ESCAPE_CHAR, "\n")\</div><div class='add'>+            .replace(PERCENTAGE_ESCAPE_CHAR, "%")</div><div class='add'>+</div><div class='add'>+# gf_mount_ready() returns 1 if all subvols are up, else 0</div><div class='add'>+def gf_mount_ready():</div><div class='add'>+    ret = errno_wrap(Xattr.lgetxattr,</div><div class='add'>+                     ['.', 'dht.subvol.status', 16],</div><div class='add'>+                     [ENOENT, ENOTSUP, ENODATA], [ENOMEM])</div><div class='add'>+</div><div class='add'>+    if isinstance(ret, int):</div><div class='add'>+       logging.error("failed to get the xattr value")</div><div class='add'>+       return 1</div><div class='add'>+    ret = ret.rstrip('\x00')</div><div class='add'>+    if ret == "1":</div><div class='add'>+       return 1</div><div class='add'>+    return 0</div><div class='add'>+</div><div class='add'>+def norm(s):</div><div class='add'>+    if s:</div><div class='add'>+        return s.replace('-', '_')</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def update_file(path, updater, merger=lambda f: True):</div><div class='add'>+    """update a file in a transaction-like manner"""</div><div class='add'>+</div><div class='add'>+    fr = fw = None</div><div class='add'>+    try:</div><div class='add'>+        fd = os.open(path, os.O_CREAT | os.O_RDWR)</div><div class='add'>+        try:</div><div class='add'>+            fr = os.fdopen(fd, 'r+b')</div><div class='add'>+        except:</div><div class='add'>+            os.close(fd)</div><div class='add'>+            raise</div><div class='add'>+        fcntl.lockf(fr, fcntl.LOCK_EX)</div><div class='add'>+        if not merger(fr):</div><div class='add'>+            return</div><div class='add'>+</div><div class='add'>+        tmpp = path + '.tmp.' + str(os.getpid())</div><div class='add'>+        fd = os.open(tmpp, os.O_CREAT | os.O_EXCL | os.O_WRONLY)</div><div class='add'>+        try:</div><div class='add'>+            fw = os.fdopen(fd, 'wb', 0)</div><div class='add'>+        except:</div><div class='add'>+            os.close(fd)</div><div class='add'>+            raise</div><div class='add'>+        updater(fw)</div><div class='add'>+        os.fsync(fd)</div><div class='add'>+        os.rename(tmpp, path)</div><div class='add'>+    finally:</div><div class='add'>+        for fx in (fr, fw):</div><div class='add'>+            if fx:</div><div class='add'>+                fx.close()</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def create_manifest(fname, content):</div><div class='add'>+    """</div><div class='add'>+    Create manifest file for SSH Control Path</div><div class='add'>+    """</div><div class='add'>+    fd = None</div><div class='add'>+    try:</div><div class='add'>+        fd = os.open(fname, os.O_CREAT | os.O_RDWR)</div><div class='add'>+        try:</div><div class='add'>+            os.write(fd, content)</div><div class='add'>+        except:</div><div class='add'>+            os.close(fd)</div><div class='add'>+            raise</div><div class='add'>+    finally:</div><div class='add'>+        if fd is not None:</div><div class='add'>+            os.close(fd)</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def setup_ssh_ctl(ctld, remote_addr, resource_url):</div><div class='add'>+    """</div><div class='add'>+    Setup GConf ssh control path parameters</div><div class='add'>+    """</div><div class='add'>+    rconf.ssh_ctl_dir = ctld</div><div class='add'>+    content = "SLAVE_HOST=%s\nSLAVE_RESOURCE_URL=%s" % (remote_addr,</div><div class='add'>+                                                        resource_url)</div><div class='add'>+    encoded_content = content.encode()</div><div class='add'>+    content_sha256 = sha256hex(encoded_content)</div><div class='add'>+    """</div><div class='add'>+    The length of ctl_path for ssh connection should not be &gt; 108.</div><div class='add'>+    ssh fails with ctl_path too long if it is so. But when rsync</div><div class='add'>+    is piped to ssh, it is not taking &gt; 90. Hence using first 32</div><div class='add'>+    bytes of hash. Hash collision doesn't matter as only one sock</div><div class='add'>+    file is created per directory.</div><div class='add'>+    """</div><div class='add'>+    content_sha256 = content_sha256[:32]</div><div class='add'>+    fname = os.path.join(rconf.ssh_ctl_dir,</div><div class='add'>+                         "%s.mft" % content_sha256)</div><div class='add'>+</div><div class='add'>+    create_manifest(fname, encoded_content)</div><div class='add'>+    ssh_ctl_path = os.path.join(rconf.ssh_ctl_dir,</div><div class='add'>+                                "%s.sock" % content_sha256)</div><div class='add'>+    rconf.ssh_ctl_args = ["-oControlMaster=auto", "-S", ssh_ctl_path]</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def grabfile(fname, content=None):</div><div class='add'>+    """open @fname + contest for its fcntl lock</div><div class='add'>+</div><div class='add'>+    @content: if given, set the file content to it</div><div class='add'>+    """</div><div class='add'>+    # damn those messy open() mode codes</div><div class='add'>+    fd = os.open(fname, os.O_CREAT | os.O_RDWR)</div><div class='add'>+    f = os.fdopen(fd, 'r+')</div><div class='add'>+    try:</div><div class='add'>+        fcntl.lockf(f, fcntl.LOCK_EX | fcntl.LOCK_NB)</div><div class='add'>+    except:</div><div class='add'>+        ex = sys.exc_info()[1]</div><div class='add'>+        f.close()</div><div class='add'>+        if isinstance(ex, IOError) and ex.errno in (EACCES, EAGAIN):</div><div class='add'>+            # cannot grab, it's taken</div><div class='add'>+            return</div><div class='add'>+        raise</div><div class='add'>+    if content:</div><div class='add'>+        try:</div><div class='add'>+            f.truncate()</div><div class='add'>+            f.write(content)</div><div class='add'>+            f.flush()</div><div class='add'>+        except:</div><div class='add'>+            f.close()</div><div class='add'>+            raise</div><div class='add'>+    rconf.permanent_handles.append(f)</div><div class='add'>+    return f</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def grabpidfile(fname=None, setpid=True):</div><div class='add'>+    """.grabfile customization for pid files"""</div><div class='add'>+    if not fname:</div><div class='add'>+        fname = gconf.get("pid-file")</div><div class='add'>+    content = None</div><div class='add'>+    if setpid:</div><div class='add'>+        content = str(os.getpid()) + '\n'</div><div class='add'>+    return grabfile(fname, content=content)</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def finalize(*args, **kwargs):</div><div class='add'>+    """all those messy final steps we go trough upon termination</div><div class='add'>+</div><div class='add'>+    Do away with pidfile, ssh control dir and logging.</div><div class='add'>+    """</div><div class='add'>+</div><div class='add'>+    final_lock.acquire()</div><div class='add'>+    if gconf.get('pid_file'):</div><div class='add'>+        rm_pidf = rconf.pid_file_owned</div><div class='add'>+        if rconf.cpid:</div><div class='add'>+            # exit path from parent branch of daemonization</div><div class='add'>+            rm_pidf = False</div><div class='add'>+            while True:</div><div class='add'>+                f = grabpidfile(setpid=False)</div><div class='add'>+                if not f:</div><div class='add'>+                    # child has already taken over pidfile</div><div class='add'>+                    break</div><div class='add'>+                if os.waitpid(rconf.cpid, os.WNOHANG)[0] == rconf.cpid:</div><div class='add'>+                    # child has terminated</div><div class='add'>+                    rm_pidf = True</div><div class='add'>+                    break</div><div class='add'>+                time.sleep(0.1)</div><div class='add'>+        if rm_pidf:</div><div class='add'>+            try:</div><div class='add'>+                os.unlink(rconf.pid_file)</div><div class='add'>+            except:</div><div class='add'>+                ex = sys.exc_info()[1]</div><div class='add'>+                if ex.errno == ENOENT:</div><div class='add'>+                    pass</div><div class='add'>+                else:</div><div class='add'>+                    raise</div><div class='add'>+    if rconf.ssh_ctl_dir and not rconf.cpid:</div><div class='add'>+        def handle_rm_error(func, path, exc_info):</div><div class='add'>+            if exc_info[1].errno == ENOENT:</div><div class='add'>+                return</div><div class='add'>+            raise exc_info[1]</div><div class='add'>+</div><div class='add'>+        shutil.rmtree(rconf.ssh_ctl_dir, onerror=handle_rm_error)</div><div class='add'>+</div><div class='add'>+    """ Unmount if not done """</div><div class='add'>+    if rconf.mount_point:</div><div class='add'>+        if rconf.mountbroker:</div><div class='add'>+            umount_cmd = rconf.mbr_umount_cmd + [rconf.mount_point, 'lazy']</div><div class='add'>+        else:</div><div class='add'>+            umount_cmd = ['umount', '-l', rconf.mount_point]</div><div class='add'>+        p0 = subprocess.Popen(umount_cmd, stderr=subprocess.PIPE,</div><div class='add'>+                              universal_newlines=True)</div><div class='add'>+        _, errdata = p0.communicate()</div><div class='add'>+        if p0.returncode == 0:</div><div class='add'>+            try:</div><div class='add'>+                os.rmdir(rconf.mount_point)</div><div class='add'>+            except OSError:</div><div class='add'>+                pass</div><div class='add'>+        else:</div><div class='add'>+            pass</div><div class='add'>+</div><div class='add'>+    if rconf.log_exit:</div><div class='add'>+        logging.info("exiting.")</div><div class='add'>+    sys.stdout.flush()</div><div class='add'>+    sys.stderr.flush()</div><div class='add'>+    os._exit(kwargs.get('exval', 0))</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def log_raise_exception(excont):</div><div class='add'>+    """top-level exception handler</div><div class='add'>+</div><div class='add'>+    Try to some fancy things to cover up we face with an error.</div><div class='add'>+    Translate some weird sounding but well understood exceptions</div><div class='add'>+    into human-friendly lingo</div><div class='add'>+    """</div><div class='add'>+</div><div class='add'>+    is_filelog = False</div><div class='add'>+    for h in logging.getLogger().handlers:</div><div class='add'>+        fno = getattr(getattr(h, 'stream', None), 'fileno', None)</div><div class='add'>+        if fno and not os.isatty(fno()):</div><div class='add'>+            is_filelog = True</div><div class='add'>+</div><div class='add'>+    exc = sys.exc_info()[1]</div><div class='add'>+    if isinstance(exc, SystemExit):</div><div class='add'>+        excont.exval = exc.code or 0</div><div class='add'>+        raise</div><div class='add'>+    else:</div><div class='add'>+        logtag = None</div><div class='add'>+        if isinstance(exc, GsyncdError):</div><div class='add'>+            if is_filelog:</div><div class='add'>+                logging.error(exc.args[0])</div><div class='add'>+            sys.stderr.write('failure: ' + exc.args[0] + '\n')</div><div class='add'>+        elif isinstance(exc, PickleError) or isinstance(exc, EOFError) or \</div><div class='add'>+            ((isinstance(exc, OSError) or isinstance(exc, IOError)) and</div><div class='add'>+             exc.errno == EPIPE):</div><div class='add'>+            logging.error('connection to peer is broken')</div><div class='add'>+            if hasattr(rconf, 'transport'):</div><div class='add'>+                rconf.transport.wait()</div><div class='add'>+                if rconf.transport.returncode == 127:</div><div class='add'>+                    logging.error("getting \"No such file or directory\""</div><div class='add'>+                                  "errors is most likely due to "</div><div class='add'>+                                  "MISCONFIGURATION, please remove all "</div><div class='add'>+                                  "the public keys added by geo-replication "</div><div class='add'>+                                  "from authorized_keys file in slave nodes "</div><div class='add'>+                                  "and run Geo-replication create "</div><div class='add'>+                                  "command again.")</div><div class='add'>+                    logging.error("If `gsec_create container` was used, then "</div><div class='add'>+                                  "run `gluster volume geo-replication "</div><div class='add'>+                                  "&lt;MASTERVOL&gt; [&lt;SLAVEUSER&gt;@]&lt;SLAVEHOST&gt;::"</div><div class='add'>+                                  "&lt;SLAVEVOL&gt; config remote-gsyncd "</div><div class='add'>+                                  "&lt;GSYNCD_PATH&gt; (Example GSYNCD_PATH: "</div><div class='add'>+                                  "`/usr/libexec/glusterfs/gsyncd`)")</div><div class='add'>+                rconf.transport.terminate_geterr()</div><div class='add'>+        elif isinstance(exc, OSError) and exc.errno in (ENOTCONN,</div><div class='add'>+                                                        ECONNABORTED):</div><div class='add'>+            logging.error(lf('Gluster Mount process exited',</div><div class='add'>+                             error=errorcode[exc.errno]))</div><div class='add'>+        elif isinstance(exc, OSError) and exc.errno == EIO:</div><div class='add'>+            logging.error("Getting \"Input/Output error\" "</div><div class='add'>+                          "is most likely due to "</div><div class='add'>+                          "a. Brick is down or "</div><div class='add'>+                          "b. Split brain issue.")</div><div class='add'>+            logging.error("This is expected as per design to "</div><div class='add'>+                          "keep the consistency of the file system. "</div><div class='add'>+                          "Once the above issue is resolved "</div><div class='add'>+                          "geo-replication would automatically "</div><div class='add'>+                          "proceed further.")</div><div class='add'>+            logtag = "FAIL"</div><div class='add'>+        else:</div><div class='add'>+            logtag = "FAIL"</div><div class='add'>+        if not logtag and logging.getLogger().isEnabledFor(logging.DEBUG):</div><div class='add'>+            logtag = "FULL EXCEPTION TRACE"</div><div class='add'>+        if logtag:</div><div class='add'>+            logging.exception(logtag + ": ")</div><div class='add'>+            sys.stderr.write("failed with %s: %s.\n" % (type(exc).__name__, exc))</div><div class='add'>+        excont.exval = 1</div><div class='add'>+        sys.exit(excont.exval)</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+class FreeObject(object):</div><div class='add'>+</div><div class='add'>+    """wildcard class for which any attribute can be set"""</div><div class='add'>+</div><div class='add'>+    def __init__(self, **kw):</div><div class='add'>+        for k, v in kw.items():</div><div class='add'>+            setattr(self, k, v)</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+class Thread(baseThread):</div><div class='add'>+</div><div class='add'>+    """thread class flavor for gsyncd</div><div class='add'>+</div><div class='add'>+    - always a daemon thread</div><div class='add'>+    - force exit for whole program if thread</div><div class='add'>+      function coughs up an exception</div><div class='add'>+    """</div><div class='add'>+</div><div class='add'>+    def __init__(self, *args, **kwargs):</div><div class='add'>+        tf = kwargs.get('target')</div><div class='add'>+        if tf:</div><div class='add'>+            def twrap(*aargs):</div><div class='add'>+                excont = FreeObject(exval=0)</div><div class='add'>+                try:</div><div class='add'>+                    tf(*aargs)</div><div class='add'>+                except:</div><div class='add'>+                    try:</div><div class='add'>+                        log_raise_exception(excont)</div><div class='add'>+                    finally:</div><div class='add'>+                        finalize(exval=excont.exval)</div><div class='add'>+            kwargs['target'] = twrap</div><div class='add'>+        baseThread.__init__(self, *args, **kwargs)</div><div class='add'>+        self.setDaemon(True)</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+class GsyncdError(Exception):</div><div class='add'>+    pass</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+class _MetaXattr(object):</div><div class='add'>+</div><div class='add'>+    """singleton class, a lazy wrapper around the</div><div class='add'>+    libcxattr module</div><div class='add'>+</div><div class='add'>+    libcxattr (a heavy import due to ctypes) is</div><div class='add'>+    loaded only when when the single</div><div class='add'>+    instance is tried to be used.</div><div class='add'>+</div><div class='add'>+    This reduces runtime for those invocations</div><div class='add'>+    which do not need filesystem manipulation</div><div class='add'>+    (eg. for config, url parsing)</div><div class='add'>+    """</div><div class='add'>+</div><div class='add'>+    def __getattr__(self, meth):</div><div class='add'>+        from libcxattr import Xattr as LXattr</div><div class='add'>+        xmeth = [m for m in dir(LXattr) if m[0] != '_']</div><div class='add'>+        if meth not in xmeth:</div><div class='add'>+            return</div><div class='add'>+        for m in xmeth:</div><div class='add'>+            setattr(self, m, getattr(LXattr, m))</div><div class='add'>+        return getattr(self, meth)</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+Xattr = _MetaXattr()</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def getusername(uid=None):</div><div class='add'>+    if uid is None:</div><div class='add'>+        uid = os.geteuid()</div><div class='add'>+    return pwd.getpwuid(uid).pw_name</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def privileged():</div><div class='add'>+    return os.geteuid() == 0</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def boolify(s):</div><div class='add'>+    """</div><div class='add'>+    Generic string to boolean converter</div><div class='add'>+</div><div class='add'>+    return</div><div class='add'>+    - Quick return if string 's' is of type bool</div><div class='add'>+    - True if it's in true_list</div><div class='add'>+    - False if it's in false_list</div><div class='add'>+    - Warn if it's not present in either and return False</div><div class='add'>+    """</div><div class='add'>+    true_list = ['true', 'yes', '1', 'on']</div><div class='add'>+    false_list = ['false', 'no', '0', 'off']</div><div class='add'>+</div><div class='add'>+    if isinstance(s, bool):</div><div class='add'>+        return s</div><div class='add'>+</div><div class='add'>+    rv = False</div><div class='add'>+    lstr = s.lower()</div><div class='add'>+    if lstr in true_list:</div><div class='add'>+        rv = True</div><div class='add'>+    elif lstr not in false_list:</div><div class='add'>+        logging.warn(lf("Unknown string in \"string to boolean\" conversion, "</div><div class='add'>+                        "defaulting to False",</div><div class='add'>+                        str=s))</div><div class='add'>+</div><div class='add'>+    return rv</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def eintr_wrap(func, exc, *args):</div><div class='add'>+    """</div><div class='add'>+    wrapper around syscalls resilient to interrupt caused</div><div class='add'>+    by signals</div><div class='add'>+    """</div><div class='add'>+    while True:</div><div class='add'>+        try:</div><div class='add'>+            return func(*args)</div><div class='add'>+        except exc:</div><div class='add'>+            ex = sys.exc_info()[1]</div><div class='add'>+            if not ex.args[0] == EINTR:</div><div class='add'>+                raise</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def select(*args):</div><div class='add'>+    return eintr_wrap(oselect.select, oselect.error, *args)</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def waitpid(*args):</div><div class='add'>+    return eintr_wrap(owaitpid, OSError, *args)</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def term_handler_default_hook(signum, frame):</div><div class='add'>+    finalize(signum, frame, exval=1)</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def set_term_handler(hook=term_handler_default_hook):</div><div class='add'>+    signal(SIGTERM, hook)</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def get_node_uuid():</div><div class='add'>+    global NodeID</div><div class='add'>+    if NodeID is not None:</div><div class='add'>+        return NodeID</div><div class='add'>+</div><div class='add'>+    NodeID = ""</div><div class='add'>+    with open(UUID_FILE) as f:</div><div class='add'>+        for line in f:</div><div class='add'>+            if line.startswith("UUID="):</div><div class='add'>+                NodeID = line.strip().split("=")[-1]</div><div class='add'>+                break</div><div class='add'>+</div><div class='add'>+    if NodeID == "":</div><div class='add'>+        raise GsyncdError("Failed to get Host UUID from %s" % UUID_FILE)</div><div class='add'>+    return NodeID</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def is_host_local(host_id):</div><div class='add'>+    return host_id == get_node_uuid()</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def funcode(f):</div><div class='add'>+    fc = getattr(f, 'func_code', None)</div><div class='add'>+    if not fc:</div><div class='add'>+        # python 3</div><div class='add'>+        fc = f.__code__</div><div class='add'>+    return fc</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def memoize(f):</div><div class='add'>+    fc = funcode(f)</div><div class='add'>+    fn = fc.co_name</div><div class='add'>+</div><div class='add'>+    def ff(self, *a, **kw):</div><div class='add'>+        rv = getattr(self, '_' + fn, None)</div><div class='add'>+        if rv is None:</div><div class='add'>+            rv = f(self, *a, **kw)</div><div class='add'>+            setattr(self, '_' + fn, rv)</div><div class='add'>+        return rv</div><div class='add'>+    return ff</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def umask():</div><div class='add'>+    return os.umask(0)</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def entry2pb(e):</div><div class='add'>+    return e.rsplit('/', 1)</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def gauxpfx():</div><div class='add'>+    return _CL_AUX_GFID_PFX</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def sha256hex(s):</div><div class='add'>+    return sha256(s).hexdigest()</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def selfkill(sig=SIGTERM):</div><div class='add'>+    os.kill(os.getpid(), sig)</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def errno_wrap(call, arg=[], errnos=[], retry_errnos=[]):</div><div class='add'>+    """ wrapper around calls resilient to errnos.</div><div class='add'>+    """</div><div class='add'>+    nr_tries = 0</div><div class='add'>+    while True:</div><div class='add'>+        try:</div><div class='add'>+            return call(*arg)</div><div class='add'>+        except OSError:</div><div class='add'>+            ex = sys.exc_info()[1]</div><div class='add'>+            if ex.errno in errnos:</div><div class='add'>+                return ex.errno</div><div class='add'>+            if ex.errno not in retry_errnos:</div><div class='add'>+                raise</div><div class='add'>+            nr_tries += 1</div><div class='add'>+            if nr_tries == GF_OP_RETRIES:</div><div class='add'>+                # probably a screwed state, cannot do much...</div><div class='add'>+                logging.warn(lf('reached maximum retries',</div><div class='add'>+                                args=repr(arg),</div><div class='add'>+                                error=ex))</div><div class='add'>+                raise</div><div class='add'>+            time.sleep(0.250)  # retry the call</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def lstat(e):</div><div class='add'>+    return errno_wrap(os.lstat, [e], [ENOENT], [ESTALE, EBUSY])</div><div class='add'>+</div><div class='add'>+def get_gfid_from_mnt(gfidpath):</div><div class='add'>+    return errno_wrap(Xattr.lgetxattr,</div><div class='add'>+                      [gfidpath, 'glusterfs.gfid.string',</div><div class='add'>+                       GX_GFID_CANONICAL_LEN], [ENOENT], [ESTALE])</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def matching_disk_gfid(gfid, entry):</div><div class='add'>+    disk_gfid = get_gfid_from_mnt(entry)</div><div class='add'>+    if isinstance(disk_gfid, int):</div><div class='add'>+        return False</div><div class='add'>+</div><div class='add'>+    if not gfid == disk_gfid:</div><div class='add'>+        return False</div><div class='add'>+</div><div class='add'>+    return True</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+class NoStimeAvailable(Exception):</div><div class='add'>+    pass</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+class PartialHistoryAvailable(Exception):</div><div class='add'>+    pass</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+class ChangelogHistoryNotAvailable(Exception):</div><div class='add'>+    pass</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+class ChangelogException(OSError):</div><div class='add'>+    pass</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def gf_event(event_type, **kwargs):</div><div class='add'>+    if EVENTS_ENABLED:</div><div class='add'>+        from gfevents.gf_event import gf_event as gfevent</div><div class='add'>+        gfevent(event_type, **kwargs)</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+class GlusterLogLevel(object):</div><div class='add'>+        NONE = 0</div><div class='add'>+        EMERG = 1</div><div class='add'>+        ALERT = 2</div><div class='add'>+        CRITICAL = 3</div><div class='add'>+        ERROR = 4</div><div class='add'>+        WARNING = 5</div><div class='add'>+        NOTICE = 6</div><div class='add'>+        INFO = 7</div><div class='add'>+        DEBUG = 8</div><div class='add'>+        TRACE = 9</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def get_changelog_log_level(lvl):</div><div class='add'>+    return getattr(GlusterLogLevel, lvl, GlusterLogLevel.INFO)</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def get_master_and_slave_data_from_args(args):</div><div class='add'>+    master_name = None</div><div class='add'>+    slave_data = None</div><div class='add'>+    for arg in args:</div><div class='add'>+        if arg.startswith(":"):</div><div class='add'>+            master_name = arg.replace(":", "")</div><div class='add'>+        if "::" in arg:</div><div class='add'>+            slave_data = arg.replace("ssh://", "")</div><div class='add'>+</div><div class='add'>+    return (master_name, slave_data)</div><div class='add'>+</div><div class='add'>+def unshare_propagation_supported():</div><div class='add'>+    global unshare_mnt_propagation</div><div class='add'>+    if unshare_mnt_propagation is not None:</div><div class='add'>+        return unshare_mnt_propagation</div><div class='add'>+</div><div class='add'>+    unshare_mnt_propagation = False</div><div class='add'>+    p = subprocess.Popen(["unshare", "--help"],</div><div class='add'>+                         stderr=subprocess.PIPE,</div><div class='add'>+                         stdout=subprocess.PIPE,</div><div class='add'>+                         universal_newlines=True)</div><div class='add'>+    out, err = p.communicate()</div><div class='add'>+    if p.returncode == 0:</div><div class='add'>+        if "propagation" in out:</div><div class='add'>+            unshare_mnt_propagation = True</div><div class='add'>+</div><div class='add'>+    return unshare_mnt_propagation</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def get_rsync_version(rsync_cmd):</div><div class='add'>+    global rsync_version</div><div class='add'>+    if rsync_version is not None:</div><div class='add'>+        return rsync_version</div><div class='add'>+</div><div class='add'>+    rsync_version = "0"</div><div class='add'>+    p = subprocess.Popen([rsync_cmd, "--version"],</div><div class='add'>+                         stderr=subprocess.PIPE,</div><div class='add'>+                         stdout=subprocess.PIPE,</div><div class='add'>+                         universal_newlines=True)</div><div class='add'>+    out, err = p.communicate()</div><div class='add'>+    if p.returncode == 0:</div><div class='add'>+        rsync_version = out.split(" ", 4)[3]</div><div class='add'>+</div><div class='add'>+    return rsync_version</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def get_slv_dir_path(slv_host, slv_volume, gfid):</div><div class='add'>+    global slv_bricks</div><div class='add'>+</div><div class='add'>+    dir_path = ENOENT</div><div class='add'>+    pfx = gauxpfx()</div><div class='add'>+</div><div class='add'>+    if not slv_bricks:</div><div class='add'>+        slv_info = Volinfo(slv_volume, slv_host, master=False)</div><div class='add'>+        slv_bricks = slv_info.bricks</div><div class='add'>+    # Result of readlink would be of format as below.</div><div class='add'>+    # readlink = "../../pgfid[0:2]/pgfid[2:4]/pgfid/basename"</div><div class='add'>+    for brick in slv_bricks:</div><div class='add'>+        dir_path = errno_wrap(os.path.join,</div><div class='add'>+                              [brick['dir'],</div><div class='add'>+                               ".glusterfs", gfid[0:2],</div><div class='add'>+                               gfid[2:4],</div><div class='add'>+                               gfid], [ENOENT], [ESTALE])</div><div class='add'>+        if dir_path != ENOENT:</div><div class='add'>+            try:</div><div class='add'>+                realpath = errno_wrap(os.readlink, [dir_path],</div><div class='add'>+                                      [ENOENT], [ESTALE])</div><div class='add'>+                if not isinstance(realpath, int):</div><div class='add'>+                    realpath_parts = realpath.split('/')</div><div class='add'>+                    pargfid = realpath_parts[-2]</div><div class='add'>+                    basename = realpath_parts[-1]</div><div class='add'>+                    dir_entry = os.path.join(pfx, pargfid, basename)</div><div class='add'>+                    return dir_entry</div><div class='add'>+            except OSError:</div><div class='add'>+                # .gfid/GFID</div><div class='add'>+                gfidpath = unescape_space_newline(os.path.join(pfx, gfid))</div><div class='add'>+                realpath = errno_wrap(Xattr.lgetxattr_buf,</div><div class='add'>+                      [gfidpath, 'glusterfs.gfid2path'], [ENOENT], [ESTALE])</div><div class='add'>+                if not isinstance(realpath, int):</div><div class='add'>+                    basename = os.path.basename(realpath).rstrip('\x00')</div><div class='add'>+                    dirpath = os.path.dirname(realpath)</div><div class='add'>+                    if dirpath == "/":</div><div class='add'>+                        pargfid = ROOT_GFID</div><div class='add'>+                    else:</div><div class='add'>+                        dirpath = dirpath.strip("/")</div><div class='add'>+                        pargfid = get_gfid_from_mnt(dirpath)</div><div class='add'>+                        if isinstance(pargfid, int):</div><div class='add'>+                            return None</div><div class='add'>+                    dir_entry = os.path.join(pfx, pargfid, basename)</div><div class='add'>+                    return dir_entry</div><div class='add'>+</div><div class='add'>+    return None</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def lf(event, **kwargs):</div><div class='add'>+    """</div><div class='add'>+    Log Format helper function, log messages can be</div><div class='add'>+    easily modified to structured log format.</div><div class='add'>+    lf("Config Change", sync_jobs=4, brick=/bricks/b1) will be</div><div class='add'>+    converted as "Config Change [{brick=/bricks/b1}, {sync_jobs=4}]"</div><div class='add'>+    """</div><div class='add'>+    msgparts = []</div><div class='add'>+    for k, v in kwargs.items():</div><div class='add'>+        msgparts.append("{%s=%s}" % (k, v))</div><div class='add'>+    return "%s [%s]" % (event, ", ".join(msgparts))</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+class Popen(subprocess.Popen):</div><div class='add'>+</div><div class='add'>+    """customized subclass of subprocess.Popen with a ring</div><div class='add'>+    buffer for children error output"""</div><div class='add'>+</div><div class='add'>+    @classmethod</div><div class='add'>+    def init_errhandler(cls):</div><div class='add'>+        """start the thread which handles children's error output"""</div><div class='add'>+        cls.errstore = {}</div><div class='add'>+</div><div class='add'>+        def tailer():</div><div class='add'>+            while True:</div><div class='add'>+                errstore = cls.errstore.copy()</div><div class='add'>+                try:</div><div class='add'>+                    poe, _, _ = select(</div><div class='add'>+                        [po.stderr for po in errstore], [], [], 1)</div><div class='add'>+                except (ValueError, SelectError):</div><div class='add'>+                    # stderr is already closed wait for some time before</div><div class='add'>+                    # checking next error</div><div class='add'>+                    time.sleep(0.5)</div><div class='add'>+                    continue</div><div class='add'>+                for po in errstore:</div><div class='add'>+                    if po.stderr not in poe:</div><div class='add'>+                        continue</div><div class='add'>+                    po.lock.acquire()</div><div class='add'>+                    try:</div><div class='add'>+                        if po.on_death_row:</div><div class='add'>+                            continue</div><div class='add'>+                        la = errstore[po]</div><div class='add'>+                        try:</div><div class='add'>+                            fd = po.stderr.fileno()</div><div class='add'>+                        except ValueError:  # file is already closed</div><div class='add'>+                            time.sleep(0.5)</div><div class='add'>+                            continue</div><div class='add'>+</div><div class='add'>+                        try:</div><div class='add'>+                            l = os.read(fd, 1024)</div><div class='add'>+                        except OSError:</div><div class='add'>+                            time.sleep(0.5)</div><div class='add'>+                            continue</div><div class='add'>+</div><div class='add'>+                        if not l:</div><div class='add'>+                            continue</div><div class='add'>+                        tots = len(l)</div><div class='add'>+                        for lx in la:</div><div class='add'>+                            tots += len(lx)</div><div class='add'>+                        while tots &gt; 1 &lt;&lt; 20 and la:</div><div class='add'>+                            tots -= len(la.pop(0))</div><div class='add'>+                        la.append(l)</div><div class='add'>+                    finally:</div><div class='add'>+                        po.lock.release()</div><div class='add'>+        t = Thread(target=tailer)</div><div class='add'>+        t.start()</div><div class='add'>+        cls.errhandler = t</div><div class='add'>+</div><div class='add'>+    @classmethod</div><div class='add'>+    def fork(cls):</div><div class='add'>+        """fork wrapper that restarts errhandler thread in child"""</div><div class='add'>+        pid = os.fork()</div><div class='add'>+        if not pid:</div><div class='add'>+            cls.init_errhandler()</div><div class='add'>+        return pid</div><div class='add'>+</div><div class='add'>+    def __init__(self, args, *a, **kw):</div><div class='add'>+        """customizations for subprocess.Popen instantiation</div><div class='add'>+</div><div class='add'>+        - 'close_fds' is taken to be the default</div><div class='add'>+        - if child's stderr is chosen to be managed,</div><div class='add'>+          register it with the error handler thread</div><div class='add'>+        """</div><div class='add'>+        self.args = args</div><div class='add'>+        if 'close_fds' not in kw:</div><div class='add'>+            kw['close_fds'] = True</div><div class='add'>+        self.lock = threading.Lock()</div><div class='add'>+        self.on_death_row = False</div><div class='add'>+        self.elines = []</div><div class='add'>+        try:</div><div class='add'>+            sup(self, args, *a, **kw)</div><div class='add'>+        except:</div><div class='add'>+            ex = sys.exc_info()[1]</div><div class='add'>+            if not isinstance(ex, OSError):</div><div class='add'>+                raise</div><div class='add'>+            raise GsyncdError("""execution of "%s" failed with %s (%s)""" %</div><div class='add'>+                              (args[0], errno.errorcode[ex.errno],</div><div class='add'>+                               os.strerror(ex.errno)))</div><div class='add'>+        if kw.get('stderr') == subprocess.PIPE:</div><div class='add'>+            assert(getattr(self, 'errhandler', None))</div><div class='add'>+            self.errstore[self] = []</div><div class='add'>+</div><div class='add'>+    def errlog(self):</div><div class='add'>+        """make a log about child's failure event"""</div><div class='add'>+        logging.error(lf("command returned error",</div><div class='add'>+                         cmd=" ".join(self.args),</div><div class='add'>+                         error=self.returncode))</div><div class='add'>+        lp = ''</div><div class='add'>+</div><div class='add'>+        def logerr(l):</div><div class='add'>+            logging.error(self.args[0] + "&gt; " + l)</div><div class='add'>+        for l in self.elines:</div><div class='add'>+            ls = l.split('\n')</div><div class='add'>+            ls[0] = lp + ls[0]</div><div class='add'>+            lp = ls.pop()</div><div class='add'>+            for ll in ls:</div><div class='add'>+                logerr(ll)</div><div class='add'>+        if lp:</div><div class='add'>+            logerr(lp)</div><div class='add'>+</div><div class='add'>+    def errfail(self):</div><div class='add'>+        """fail nicely if child did not terminate with success"""</div><div class='add'>+        self.errlog()</div><div class='add'>+        finalize(exval=1)</div><div class='add'>+</div><div class='add'>+    def terminate_geterr(self, fail_on_err=True):</div><div class='add'>+        """kill child, finalize stderr harvesting (unregister</div><div class='add'>+        from errhandler, set up .elines), fail on error if</div><div class='add'>+        asked for</div><div class='add'>+        """</div><div class='add'>+        self.lock.acquire()</div><div class='add'>+        try:</div><div class='add'>+            self.on_death_row = True</div><div class='add'>+        finally:</div><div class='add'>+            self.lock.release()</div><div class='add'>+        elines = self.errstore.pop(self)</div><div class='add'>+        if self.poll() is None:</div><div class='add'>+            self.terminate()</div><div class='add'>+            if self.poll() is None:</div><div class='add'>+                time.sleep(0.1)</div><div class='add'>+                self.kill()</div><div class='add'>+                self.wait()</div><div class='add'>+        while True:</div><div class='add'>+            if not select([self.stderr], [], [], 0.1)[0]:</div><div class='add'>+                break</div><div class='add'>+            b = os.read(self.stderr.fileno(), 1024)</div><div class='add'>+            if b:</div><div class='add'>+                elines.append(b.decode())</div><div class='add'>+            else:</div><div class='add'>+                break</div><div class='add'>+        self.stderr.close()</div><div class='add'>+        self.elines = elines</div><div class='add'>+        if fail_on_err and self.returncode != 0:</div><div class='add'>+            self.errfail()</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def host_brick_split(value):</div><div class='add'>+    """</div><div class='add'>+    IPv6 compatible way to split and get the host</div><div class='add'>+    and brick information. Example inputs:</div><div class='add'>+    node1.example.com:/exports/bricks/brick1/brick</div><div class='add'>+    fe80::af0f:df82:844f:ef66%utun0:/exports/bricks/brick1/brick</div><div class='add'>+    """</div><div class='add'>+    parts = value.split(":")</div><div class='add'>+    brick = parts[-1]</div><div class='add'>+    hostparts = parts[0:-1]</div><div class='add'>+    return (":".join(hostparts), brick)</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+class Volinfo(object):</div><div class='add'>+</div><div class='add'>+    def __init__(self, vol, host='localhost', prelude=[], master=True):</div><div class='add'>+        if master:</div><div class='add'>+            gluster_cmd_dir = gconf.get("gluster-command-dir")</div><div class='add'>+        else:</div><div class='add'>+            gluster_cmd_dir = gconf.get("slave-gluster-command-dir")</div><div class='add'>+</div><div class='add'>+        gluster_cmd = os.path.join(gluster_cmd_dir, 'gluster')</div><div class='add'>+        po = Popen(prelude + [gluster_cmd, '--xml', '--remote-host=' + host,</div><div class='add'>+                              'volume', 'info', vol],</div><div class='add'>+                   stdout=PIPE, stderr=PIPE, universal_newlines=True)</div><div class='add'>+        vix = po.stdout.read()</div><div class='add'>+        po.wait()</div><div class='add'>+        po.terminate_geterr()</div><div class='add'>+        vi = XET.fromstring(vix)</div><div class='add'>+        if vi.find('opRet').text != '0':</div><div class='add'>+            if prelude:</div><div class='add'>+                via = '(via %s) ' % prelude.join(' ')</div><div class='add'>+            else:</div><div class='add'>+                via = ' '</div><div class='add'>+            raise GsyncdError('getting volume info of %s%s '</div><div class='add'>+                              'failed with errorcode %s' %</div><div class='add'>+                              (vol, via, vi.find('opErrno').text))</div><div class='add'>+        self.tree = vi</div><div class='add'>+        self.volume = vol</div><div class='add'>+        self.host = host</div><div class='add'>+</div><div class='add'>+    def get(self, elem):</div><div class='add'>+        return self.tree.findall('.//' + elem)</div><div class='add'>+</div><div class='add'>+    def is_tier(self):</div><div class='add'>+        return (self.get('typeStr')[0].text == 'Tier')</div><div class='add'>+</div><div class='add'>+    def is_hot(self, brickpath):</div><div class='add'>+        logging.debug('brickpath: ' + repr(brickpath))</div><div class='add'>+        return brickpath in self.hot_bricks</div><div class='add'>+</div><div class='add'>+    @property</div><div class='add'>+    @memoize</div><div class='add'>+    def bricks(self):</div><div class='add'>+        def bparse(b):</div><div class='add'>+            host, dirp = host_brick_split(b.find("name").text)</div><div class='add'>+            return {'host': host, 'dir': dirp, 'uuid': b.find("hostUuid").text}</div><div class='add'>+        return [bparse(b) for b in self.get('brick')]</div><div class='add'>+</div><div class='add'>+    @property</div><div class='add'>+    @memoize</div><div class='add'>+    def uuid(self):</div><div class='add'>+        ids = self.get('id')</div><div class='add'>+        if len(ids) != 1:</div><div class='add'>+            raise GsyncdError("volume info of %s obtained from %s: "</div><div class='add'>+                              "ambiguous uuid" % (self.volume, self.host))</div><div class='add'>+        return ids[0].text</div><div class='add'>+</div><div class='add'>+    def replica_count(self, tier, hot):</div><div class='add'>+        if (tier and hot):</div><div class='add'>+            return int(self.get('hotBricks/hotreplicaCount')[0].text)</div><div class='add'>+        elif (tier and not hot):</div><div class='add'>+            return int(self.get('coldBricks/coldreplicaCount')[0].text)</div><div class='add'>+        else:</div><div class='add'>+            return int(self.get('replicaCount')[0].text)</div><div class='add'>+</div><div class='add'>+    def disperse_count(self, tier, hot):</div><div class='add'>+        if (tier and hot):</div><div class='add'>+            # Tiering doesn't support disperse volume as hot brick,</div><div class='add'>+            # hence no xml output, so returning 0. In case, if it's</div><div class='add'>+            # supported later, we should change here.</div><div class='add'>+            return 0</div><div class='add'>+        elif (tier and not hot):</div><div class='add'>+            return int(self.get('coldBricks/colddisperseCount')[0].text)</div><div class='add'>+        else:</div><div class='add'>+            return int(self.get('disperseCount')[0].text)</div><div class='add'>+</div><div class='add'>+    def distribution_count(self, tier, hot):</div><div class='add'>+        if (tier and hot):</div><div class='add'>+            return int(self.get('hotBricks/hotdistCount')[0].text)</div><div class='add'>+        elif (tier and not hot):</div><div class='add'>+            return int(self.get('coldBricks/colddistCount')[0].text)</div><div class='add'>+        else:</div><div class='add'>+            return int(self.get('distCount')[0].text)</div><div class='add'>+</div><div class='add'>+    @property</div><div class='add'>+    @memoize</div><div class='add'>+    def hot_bricks(self):</div><div class='add'>+        return [b.text for b in self.get('hotBricks/brick')]</div><div class='add'>+</div><div class='add'>+    def get_hot_bricks_count(self, tier):</div><div class='add'>+        if (tier):</div><div class='add'>+            return int(self.get('hotBricks/hotbrickCount')[0].text)</div><div class='add'>+        else:</div><div class='add'>+            return 0</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+class VolinfoFromGconf(object):</div><div class='add'>+    # Glusterd will generate following config items before Geo-rep start</div><div class='add'>+    # So that Geo-rep need not run gluster commands from inside</div><div class='add'>+    # Volinfo object API/interface kept as is so that caller need not</div><div class='add'>+    # change anything except calling this instead of Volinfo()</div><div class='add'>+    #</div><div class='add'>+    # master-bricks=</div><div class='add'>+    # master-bricks=NODEID:HOSTNAME:PATH,..</div><div class='add'>+    # slave-bricks=NODEID:HOSTNAME,..</div><div class='add'>+    # master-volume-id=</div><div class='add'>+    # slave-volume-id=</div><div class='add'>+    # master-replica-count=</div><div class='add'>+    # master-disperse_count=</div><div class='add'>+    def __init__(self, vol, host='localhost', master=True):</div><div class='add'>+        self.volume = vol</div><div class='add'>+        self.host = host</div><div class='add'>+        self.master = master</div><div class='add'>+</div><div class='add'>+    def is_tier(self):</div><div class='add'>+        return False</div><div class='add'>+</div><div class='add'>+    def is_hot(self, brickpath):</div><div class='add'>+        return False</div><div class='add'>+</div><div class='add'>+    def is_uuid(self, value):</div><div class='add'>+        try:</div><div class='add'>+            uuid.UUID(value)</div><div class='add'>+            return True</div><div class='add'>+        except ValueError:</div><div class='add'>+            return False</div><div class='add'>+</div><div class='add'>+    def possible_path(self, value):</div><div class='add'>+        return "/" in value</div><div class='add'>+</div><div class='add'>+    @property</div><div class='add'>+    @memoize</div><div class='add'>+    def bricks(self):</div><div class='add'>+        pfx = "master-" if self.master else "slave-"</div><div class='add'>+        bricks_data = gconf.get(pfx + "bricks")</div><div class='add'>+        if bricks_data is None:</div><div class='add'>+            return []</div><div class='add'>+</div><div class='add'>+        bricks_data = bricks_data.split(",")</div><div class='add'>+        bricks_data = [b.strip() for b in bricks_data]</div><div class='add'>+        out = []</div><div class='add'>+        for b in bricks_data:</div><div class='add'>+            parts = b.split(":")</div><div class='add'>+            b_uuid = None</div><div class='add'>+            if self.is_uuid(parts[0]):</div><div class='add'>+                b_uuid = parts[0]</div><div class='add'>+                # Set all parts except first</div><div class='add'>+                parts = parts[1:]</div><div class='add'>+</div><div class='add'>+            if self.possible_path(parts[-1]):</div><div class='add'>+                bpath = parts[-1]</div><div class='add'>+                # Set all parts except last</div><div class='add'>+                parts = parts[0:-1]</div><div class='add'>+</div><div class='add'>+            out.append({</div><div class='add'>+                "host": ":".join(parts),   # if remaining parts are IPv6 name</div><div class='add'>+                "dir": bpath,</div><div class='add'>+                "uuid": b_uuid</div><div class='add'>+            })</div><div class='add'>+</div><div class='add'>+        return out</div><div class='add'>+</div><div class='add'>+    @property</div><div class='add'>+    @memoize</div><div class='add'>+    def uuid(self):</div><div class='add'>+        if self.master:</div><div class='add'>+            return gconf.get("master-volume-id")</div><div class='add'>+        else:</div><div class='add'>+            return gconf.get("slave-volume-id")</div><div class='add'>+</div><div class='add'>+    def replica_count(self, tier, hot):</div><div class='add'>+        return gconf.get("master-replica-count")</div><div class='add'>+</div><div class='add'>+    def disperse_count(self, tier, hot):</div><div class='add'>+        return gconf.get("master-disperse-count")</div><div class='add'>+</div><div class='add'>+    def distribution_count(self, tier, hot):</div><div class='add'>+        return gconf.get("master-distribution-count")</div><div class='add'>+</div><div class='add'>+    @property</div><div class='add'>+    @memoize</div><div class='add'>+    def hot_bricks(self):</div><div class='add'>+        return []</div><div class='add'>+</div><div class='add'>+    def get_hot_bricks_count(self, tier):</div><div class='add'>+        return 0</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def can_ssh(host, port=22):</div><div class='add'>+    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)</div><div class='add'>+    try:</div><div class='add'>+        s.connect((host, port))</div><div class='add'>+        flag = True</div><div class='add'>+    except socket.error:</div><div class='add'>+        flag = False</div><div class='add'>+</div><div class='add'>+    s.close()</div><div class='add'>+    return flag</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def get_up_nodes(hosts, port):</div><div class='add'>+    # List of hosts with Hostname/IP and UUID</div><div class='add'>+    up_nodes = []</div><div class='add'>+    for h in hosts:</div><div class='add'>+        if can_ssh(h[0], port):</div><div class='add'>+            up_nodes.append(h)</div><div class='add'>+</div><div class='add'>+    return up_nodes</div><div class='head'>diff --git a/geo-replication/test-requirements.txt b/geo-replication/test-requirements.txt<br/>new file mode 100644<br/>index 00000000000..d6165640d3f<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/geo-replication/test-requirements.txt?id=d1d7a6f35c816822fab51c820e25023863c239c1'>geo-replication/test-requirements.txt</a></div><div class='hunk'>@@ -0,0 +1,7 @@</div><div class='add'>+# Hacking already pins down pep8, pyflakes and flake8</div><div class='add'>+flake8</div><div class='add'>+coverage</div><div class='add'>+nose</div><div class='add'>+nosexcover</div><div class='add'>+nosehtmloutput</div><div class='add'>+mock&gt;=0.8.0</div><div class='head'>diff --git a/geo-replication/tests/__init__.py b/geo-replication/tests/__init__.py<br/>new file mode 100644<br/>index 00000000000..b4648b69645<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/geo-replication/tests/__init__.py?id=d1d7a6f35c816822fab51c820e25023863c239c1'>geo-replication/tests/__init__.py</a></div><div class='hunk'>@@ -0,0 +1,9 @@</div><div class='add'>+#</div><div class='add'>+# Copyright (c) 2011-2014 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+# This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+# This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+# General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+# later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+# cases as published by the Free Software Foundation.</div><div class='add'>+#</div><div class='head'>diff --git a/geo-replication/tests/unit/__init__.py b/geo-replication/tests/unit/__init__.py<br/>new file mode 100644<br/>index 00000000000..b4648b69645<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/geo-replication/tests/unit/__init__.py?id=d1d7a6f35c816822fab51c820e25023863c239c1'>geo-replication/tests/unit/__init__.py</a></div><div class='hunk'>@@ -0,0 +1,9 @@</div><div class='add'>+#</div><div class='add'>+# Copyright (c) 2011-2014 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+# This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+# This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+# General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+# later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+# cases as published by the Free Software Foundation.</div><div class='add'>+#</div><div class='head'>diff --git a/geo-replication/tests/unit/test_gsyncdstatus.py b/geo-replication/tests/unit/test_gsyncdstatus.py<br/>new file mode 100755<br/>index 00000000000..9c1aa2ad4ad<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/geo-replication/tests/unit/test_gsyncdstatus.py?id=d1d7a6f35c816822fab51c820e25023863c239c1'>geo-replication/tests/unit/test_gsyncdstatus.py</a></div><div class='hunk'>@@ -0,0 +1,193 @@</div><div class='add'>+#!/usr/bin/python3</div><div class='add'>+#</div><div class='add'>+# Copyright (c) 2011-2014 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+# This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+# This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+# General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+# later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+# cases as published by the Free Software Foundation.</div><div class='add'>+#</div><div class='add'>+</div><div class='add'>+import unittest</div><div class='add'>+import os</div><div class='add'>+import urllib</div><div class='add'>+</div><div class='add'>+from syncdaemon.gstatus import (GeorepStatus, set_monitor_status,</div><div class='add'>+                                get_default_values,</div><div class='add'>+                                MONITOR_STATUS, DEFAULT_STATUS,</div><div class='add'>+                                STATUS_VALUES, CRAWL_STATUS_VALUES,</div><div class='add'>+                                human_time, human_time_utc)</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+class GeorepStatusTestCase(unittest.TestCase):</div><div class='add'>+    @classmethod</div><div class='add'>+    def setUpClass(cls):</div><div class='add'>+        cls.work_dir = os.path.dirname(os.path.abspath(__file__))</div><div class='add'>+        cls.monitor_status_file = os.path.join(cls.work_dir, "monitor.status")</div><div class='add'>+        cls.brick = "/exports/bricks/b1"</div><div class='add'>+        cls.status = GeorepStatus(cls.monitor_status_file, cls.brick)</div><div class='add'>+        cls.statusfile = os.path.join(cls.work_dir,</div><div class='add'>+                                      "brick_%s.status"</div><div class='add'>+                                      % urllib.quote_plus(cls.brick))</div><div class='add'>+</div><div class='add'>+    @classmethod</div><div class='add'>+    def tearDownClass(cls):</div><div class='add'>+        os.remove(cls.statusfile)</div><div class='add'>+        os.remove(cls.monitor_status_file)</div><div class='add'>+</div><div class='add'>+    def _filter_dict(self, inp, keys):</div><div class='add'>+        op = {}</div><div class='add'>+        for k in keys:</div><div class='add'>+            op[k] = inp.get(k, None)</div><div class='add'>+        return op</div><div class='add'>+</div><div class='add'>+    def test_monitor_status_file_created(self):</div><div class='add'>+        self.assertTrue(os.path.exists(self.monitor_status_file))</div><div class='add'>+</div><div class='add'>+    def test_status_file_created(self):</div><div class='add'>+        self.assertTrue(os.path.exists(self.statusfile))</div><div class='add'>+</div><div class='add'>+    def test_set_monitor_status(self):</div><div class='add'>+        for st in MONITOR_STATUS:</div><div class='add'>+            set_monitor_status(self.monitor_status_file, st)</div><div class='add'>+            self.assertTrue(self.status.get_monitor_status(), st)</div><div class='add'>+</div><div class='add'>+    def test_default_values_test(self):</div><div class='add'>+        self.assertTrue(get_default_values(), {</div><div class='add'>+            "slave_node": DEFAULT_STATUS,</div><div class='add'>+            "worker_status": DEFAULT_STATUS,</div><div class='add'>+            "last_synced": 0,</div><div class='add'>+            "last_synced_utc": 0,</div><div class='add'>+            "crawl_status": DEFAULT_STATUS,</div><div class='add'>+            "entry": 0,</div><div class='add'>+            "data": 0,</div><div class='add'>+            "metadata": 0,</div><div class='add'>+            "failures": 0,</div><div class='add'>+            "checkpoint_completed": False,</div><div class='add'>+            "checkpoint_time": 0,</div><div class='add'>+            "checkpoint_time_utc": 0,</div><div class='add'>+            "checkpoint_completion_time": 0,</div><div class='add'>+            "checkpoint_completion_time_utc": 0</div><div class='add'>+        })</div><div class='add'>+</div><div class='add'>+    def test_human_time(self):</div><div class='add'>+        self.assertTrue(human_time(1429174398), "2015-04-16 14:23:18")</div><div class='add'>+</div><div class='add'>+    def test_human_time_utc(self):</div><div class='add'>+        self.assertTrue(human_time_utc(1429174398), "2015-04-16 08:53:18")</div><div class='add'>+</div><div class='add'>+    def test_invalid_human_time(self):</div><div class='add'>+        self.assertTrue(human_time(142917439), DEFAULT_STATUS)</div><div class='add'>+        self.assertTrue(human_time("abcdef"), DEFAULT_STATUS)</div><div class='add'>+</div><div class='add'>+    def test_invalid_human_time_utc(self):</div><div class='add'>+        self.assertTrue(human_time_utc(142917439), DEFAULT_STATUS)</div><div class='add'>+        self.assertTrue(human_time_utc("abcdef"), DEFAULT_STATUS)</div><div class='add'>+</div><div class='add'>+    def test_worker_status(self):</div><div class='add'>+        set_monitor_status(self.monitor_status_file, "Started")</div><div class='add'>+        for st in STATUS_VALUES:</div><div class='add'>+            self.status.set_worker_status(st)</div><div class='add'>+            self.assertTrue(self.status.get_status()["worker_status"], st)</div><div class='add'>+</div><div class='add'>+    def test_crawl_status(self):</div><div class='add'>+        set_monitor_status(self.monitor_status_file, "Started")</div><div class='add'>+        self.status.set_active()</div><div class='add'>+        for st in CRAWL_STATUS_VALUES:</div><div class='add'>+            self.status.set_worker_crawl_status(st)</div><div class='add'>+            self.assertTrue(self.status.get_status()["crawl_status"], st)</div><div class='add'>+</div><div class='add'>+    def test_slave_node(self):</div><div class='add'>+        set_monitor_status(self.monitor_status_file, "Started")</div><div class='add'>+        self.status.set_active()</div><div class='add'>+        self.status.set_slave_node("fvm2")</div><div class='add'>+        self.assertTrue(self.status.get_status()["slave_node"], "fvm2")</div><div class='add'>+</div><div class='add'>+        self.status.set_worker_status("Passive")</div><div class='add'>+        self.status.set_slave_node("fvm2")</div><div class='add'>+        self.assertTrue(self.status.get_status()["slave_node"], "fvm2")</div><div class='add'>+</div><div class='add'>+    def test_active_worker_status(self):</div><div class='add'>+        set_monitor_status(self.monitor_status_file, "Started")</div><div class='add'>+        self.status.set_active()</div><div class='add'>+        self.assertTrue(self.status.get_status()["worker_status"], "Active")</div><div class='add'>+</div><div class='add'>+    def test_passive_worker_status(self):</div><div class='add'>+        set_monitor_status(self.monitor_status_file, "Started")</div><div class='add'>+        self.status.set_passive()</div><div class='add'>+        self.assertTrue(self.status.get_status()["worker_status"], "Passive")</div><div class='add'>+</div><div class='add'>+    def test_set_field(self):</div><div class='add'>+        set_monitor_status(self.monitor_status_file, "Started")</div><div class='add'>+        self.status.set_active()</div><div class='add'>+        self.status.set_field("entry", 42)</div><div class='add'>+        self.assertTrue(self.status.get_status()["entry"], 42)</div><div class='add'>+</div><div class='add'>+    def test_inc_value(self):</div><div class='add'>+        set_monitor_status(self.monitor_status_file, "Started")</div><div class='add'>+        self.status.set_active()</div><div class='add'>+        self.status.set_field("entry", 0)</div><div class='add'>+        self.status.inc_value("entry", 2)</div><div class='add'>+        self.assertTrue(self.status.get_status()["entry"], 2)</div><div class='add'>+</div><div class='add'>+        self.status.set_field("data", 0)</div><div class='add'>+        self.status.inc_value("data", 2)</div><div class='add'>+        self.assertTrue(self.status.get_status()["data"], 2)</div><div class='add'>+</div><div class='add'>+        self.status.set_field("meta", 0)</div><div class='add'>+        self.status.inc_value("meta", 2)</div><div class='add'>+        self.assertTrue(self.status.get_status()["meta"], 2)</div><div class='add'>+</div><div class='add'>+        self.status.set_field("failures", 0)</div><div class='add'>+        self.status.inc_value("failures", 2)</div><div class='add'>+        self.assertTrue(self.status.get_status()["failures"], 2)</div><div class='add'>+</div><div class='add'>+    def test_dec_value(self):</div><div class='add'>+        set_monitor_status(self.monitor_status_file, "Started")</div><div class='add'>+        self.status.set_active()</div><div class='add'>+</div><div class='add'>+        self.status.set_field("entry", 4)</div><div class='add'>+        self.status.inc_value("entry", 2)</div><div class='add'>+        self.assertTrue(self.status.get_status()["entry"], 2)</div><div class='add'>+</div><div class='add'>+        self.status.set_field("data", 4)</div><div class='add'>+        self.status.inc_value("data", 2)</div><div class='add'>+        self.assertTrue(self.status.get_status()["data"], 2)</div><div class='add'>+</div><div class='add'>+        self.status.set_field("meta", 4)</div><div class='add'>+        self.status.inc_value("meta", 2)</div><div class='add'>+        self.assertTrue(self.status.get_status()["meta"], 2)</div><div class='add'>+</div><div class='add'>+        self.status.set_field("failures", 4)</div><div class='add'>+        self.status.inc_value("failures", 2)</div><div class='add'>+        self.assertTrue(self.status.get_status()["failures"], 2)</div><div class='add'>+</div><div class='add'>+    def test_worker_status_when_monitor_status_created(self):</div><div class='add'>+        set_monitor_status(self.monitor_status_file, "Created")</div><div class='add'>+        for st in STATUS_VALUES:</div><div class='add'>+            self.status.set_worker_status(st)</div><div class='add'>+            self.assertTrue(self.status.get_status()["worker_status"],</div><div class='add'>+                            "Created")</div><div class='add'>+</div><div class='add'>+    def test_worker_status_when_monitor_status_paused(self):</div><div class='add'>+        set_monitor_status(self.monitor_status_file, "Paused")</div><div class='add'>+        for st in STATUS_VALUES:</div><div class='add'>+            self.status.set_worker_status(st)</div><div class='add'>+            self.assertTrue(self.status.get_status()["worker_status"],</div><div class='add'>+                            "Paused")</div><div class='add'>+</div><div class='add'>+    def test_worker_status_when_monitor_status_stopped(self):</div><div class='add'>+        set_monitor_status(self.monitor_status_file, "Stopped")</div><div class='add'>+        for st in STATUS_VALUES:</div><div class='add'>+            self.status.set_worker_status(st)</div><div class='add'>+            self.assertTrue(self.status.get_status()["worker_status"],</div><div class='add'>+                            "Stopped")</div><div class='add'>+</div><div class='add'>+    def test_status_when_worker_status_active(self):</div><div class='add'>+        set_monitor_status(self.monitor_status_file, "Started")</div><div class='add'>+        self.status.set_active()</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+if __name__ == "__main__":</div><div class='add'>+    unittest.main()</div><div class='head'>diff --git a/geo-replication/tests/unit/test_syncdutils.py b/geo-replication/tests/unit/test_syncdutils.py<br/>new file mode 100644<br/>index 00000000000..ff537ab2660<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/geo-replication/tests/unit/test_syncdutils.py?id=d1d7a6f35c816822fab51c820e25023863c239c1'>geo-replication/tests/unit/test_syncdutils.py</a></div><div class='hunk'>@@ -0,0 +1,29 @@</div><div class='add'>+#</div><div class='add'>+# Copyright (c) 2011-2014 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+# This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+# This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+# General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+# later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+# cases as published by the Free Software Foundation.</div><div class='add'>+#</div><div class='add'>+</div><div class='add'>+import unittest</div><div class='add'>+</div><div class='add'>+from syncdaemon import syncdutils</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+class SyncdutilsTestCase(unittest.TestCase):</div><div class='add'>+    def setUp(self):</div><div class='add'>+        pass</div><div class='add'>+</div><div class='add'>+    def tearDown(self):</div><div class='add'>+        pass</div><div class='add'>+</div><div class='add'>+    def test_escape(self):</div><div class='add'>+        self.assertEqual(syncdutils.escape("http://gluster.org"),</div><div class='add'>+                         "http%3A%2F%2Fgluster.org")</div><div class='add'>+</div><div class='add'>+    def test_unescape(self):</div><div class='add'>+        self.assertEqual(syncdutils.unescape("http%3A%2F%2Fgluster.org"),</div><div class='add'>+                         "http://gluster.org")</div><div class='head'>diff --git a/geo-replication/tox.ini b/geo-replication/tox.ini<br/>new file mode 100644<br/>index 00000000000..57ff086b947<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/geo-replication/tox.ini?id=d1d7a6f35c816822fab51c820e25023863c239c1'>geo-replication/tox.ini</a></div><div class='hunk'>@@ -0,0 +1,32 @@</div><div class='add'>+[tox]</div><div class='add'>+envlist = py26,py27,pep8</div><div class='add'>+</div><div class='add'>+[testenv]</div><div class='add'>+whitelist_externals=bash</div><div class='add'>+setenv = VIRTUAL_ENV={envdir}</div><div class='add'>+deps =</div><div class='add'>+     --download-cache={homedir}/.pipcache</div><div class='add'>+     -r{toxinidir}/test-requirements.txt</div><div class='add'>+changedir = {toxinidir}/tests/unit</div><div class='add'>+commands = nosetests -v --exe --with-xunit --with-coverage --cover-package syncdaemon --cover-erase --cover-xml --cover-html --cover-branches --with-html-output {posargs}</div><div class='add'>+</div><div class='add'>+[tox:jenkins]</div><div class='add'>+downloadcache = ~/cache/pip</div><div class='add'>+</div><div class='add'>+[testenv:pep8]</div><div class='add'>+changedir = {toxinidir}</div><div class='add'>+commands =</div><div class='add'>+         flake8</div><div class='add'>+         flake8 syncdaemon tests</div><div class='add'>+</div><div class='add'>+[testenv:cover]</div><div class='add'>+setenv = NOSE_WITH_COVERAGE=1</div><div class='add'>+</div><div class='add'>+[testenv:venv]</div><div class='add'>+commands = {posargs}</div><div class='add'>+</div><div class='add'>+[flake8]</div><div class='add'>+ignore = H</div><div class='add'>+builtins = _</div><div class='add'>+exclude = .venv,.tox,dist,doc,tests,*egg</div><div class='add'>+show-source = True
\ No newline at end of file</div><div class='head'>diff --git a/geo-replication/unittests.sh b/geo-replication/unittests.sh<br/>new file mode 100644<br/>index 00000000000..d5dbd00bd4c<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/geo-replication/unittests.sh?id=d1d7a6f35c816822fab51c820e25023863c239c1'>geo-replication/unittests.sh</a></div><div class='hunk'>@@ -0,0 +1,9 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+cd $(dirname $0)/tests/unit</div><div class='add'>+nosetests -v --exe --with-coverage --cover-package \</div><div class='add'>+          syncdaemon --cover-erase --cover-html --cover-branches $@</div><div class='add'>+</div><div class='add'>+saved_status=$?</div><div class='add'>+rm -f .coverage</div><div class='add'>+exit $saved_status</div><div class='head'>diff --git a/glusterfs-api.pc.in b/glusterfs-api.pc.in<br/>new file mode 100644<br/>index 00000000000..4a2edb7bf07<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/glusterfs-api.pc.in?id=d1d7a6f35c816822fab51c820e25023863c239c1'>glusterfs-api.pc.in</a></div><div class='hunk'>@@ -0,0 +1,12 @@</div><div class='add'>+prefix=@prefix@</div><div class='add'>+exec_prefix=@exec_prefix@</div><div class='add'>+libdir=@libdir@</div><div class='add'>+includedir=@includedir@</div><div class='add'>+</div><div class='add'>+Name: glusterfs-api</div><div class='add'>+Description: GlusterFS API</div><div class='add'>+/* This is the API version, NOT package version */</div><div class='add'>+Version: @GFAPI_VERSION@</div><div class='add'>+Requires: @PKGCONFIG_UUID@</div><div class='add'>+Libs: -L${libdir} @GFAPI_LIBS@ -lgfapi -lglusterfs -lgfrpc -lgfxdr</div><div class='add'>+Cflags: -I${includedir} -D_FILE_OFFSET_BITS=64 -D__USE_FILE_OFFSET64 -D__USE_LARGEFILE64 -DUSE_POSIX_ACLS=@USE_POSIX_ACLS@</div><div class='head'>diff --git a/glusterfs.spec.in b/glusterfs.spec.in<br/>index ffb87d8fc61..b6d63146e14 100644<br/>--- a/<a href='/cgit/glusterfs.git/tree/glusterfs.spec.in?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>glusterfs.spec.in</a><br/>+++ b/<a href='/cgit/glusterfs.git/tree/glusterfs.spec.in?id=d1d7a6f35c816822fab51c820e25023863c239c1'>glusterfs.spec.in</a></div><div class='hunk'>@@ -1,182 +1,2268 @@</div><div class='del'>-# if you make changes, the it is advised to increment this number, and provide </div><div class='del'>-# a descriptive suffix to identify who owns or what the change represents</div><div class='del'>-# e.g. release_version 2.MSW</div><div class='del'>-%define release 1%{?dist}</div><div class='add'>+%global _hardened_build 1</div><div class='ctx'> </div><div class='add'>+%global _for_fedora_koji_builds 0</div><div class='add'>+</div><div class='add'>+# uncomment and add '%' to use the prereltag for pre-releases</div><div class='add'>+# %%global prereltag qa3</div><div class='add'>+</div><div class='add'>+##-----------------------------------------------------------------------------</div><div class='add'>+## All argument definitions should be placed here and keep them sorted</div><div class='add'>+##</div><div class='add'>+</div><div class='add'>+# asan</div><div class='add'>+# if you wish to compile an rpm with address sanitizer...</div><div class='add'>+# rpmbuild -ta @PACKAGE_NAME@-@PACKAGE_VERSION@.tar.gz --with asan</div><div class='add'>+%{?_with_asan:%global _with_asan --enable-asan}</div><div class='add'>+</div><div class='add'>+%if ( 0%{?rhel} &amp;&amp; 0%{?rhel} &lt; 7 )</div><div class='add'>+%global _with_asan %{nil}</div><div class='add'>+%endif</div><div class='add'>+</div><div class='add'>+# cmocka</div><div class='add'>+# if you wish to compile an rpm with cmocka unit testing...</div><div class='add'>+# rpmbuild -ta @PACKAGE_NAME@-@PACKAGE_VERSION@.tar.gz --with cmocka</div><div class='add'>+%{?_with_cmocka:%global _with_cmocka --enable-cmocka}</div><div class='add'>+</div><div class='add'>+# debug</div><div class='add'>+# if you wish to compile an rpm with debugging...</div><div class='add'>+# rpmbuild -ta @PACKAGE_NAME@-@PACKAGE_VERSION@.tar.gz --with debug</div><div class='add'>+%{?_with_debug:%global _with_debug --enable-debug}</div><div class='add'>+</div><div class='add'>+# epoll</div><div class='ctx'> # if you wish to compile an rpm without epoll...</div><div class='ctx'> # rpmbuild -ta @PACKAGE_NAME@-@PACKAGE_VERSION@.tar.gz --without epoll</div><div class='del'>-%{?_without_epoll:%define _without_epoll --disable-epoll}</div><div class='del'>-</div><div class='del'>-# if you wish to compile an rpm with fusermount...</div><div class='del'>-# rpmbuild -ta @PACKAGE_NAME@-@PACKAGE_VERSION@.tar.gz --with fusermount</div><div class='del'>-%{?_with_fusermount:%define _with_fusermount --enable-fusermount}</div><div class='del'>-</div><div class='del'>-Summary: Cluster File System</div><div class='del'>-Name: @PACKAGE_NAME@</div><div class='del'>-Version: @PACKAGE_VERSION@</div><div class='del'>-Release: %{release}</div><div class='del'>-License: GPLv3+</div><div class='del'>-Group: System Environment/Base</div><div class='del'>-Vendor: Gluster Inc</div><div class='del'>-Packager: @PACKAGE_BUGREPORT@</div><div class='del'>-URL: http://www.gluster.org/docs/index.php/GlusterFS</div><div class='del'>-Source0: ftp://ftp.gluster.com/pub/gluster/glusterfs/2.0/@PACKAGE_VERSION@/@PACKAGE_NAME@-@PACKAGE_VERSION@.tar.gz</div><div class='del'>-BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root</div><div class='del'>-Requires(post): /sbin/chkconfig</div><div class='del'>-Requires(preun): /sbin/service, /sbin/chkconfig</div><div class='del'>-Requires(postun): /sbin/service</div><div class='add'>+%{?_without_epoll:%global _without_epoll --disable-epoll}</div><div class='add'>+</div><div class='add'>+# fusermount</div><div class='add'>+# if you wish to compile an rpm without fusermount...</div><div class='add'>+# rpmbuild -ta @PACKAGE_NAME@-@PACKAGE_VERSION@.tar.gz --without fusermount</div><div class='add'>+%{?_without_fusermount:%global _without_fusermount --disable-fusermount}</div><div class='add'>+</div><div class='add'>+# geo-rep</div><div class='add'>+# if you wish to compile an rpm without geo-replication support, compile like this...</div><div class='add'>+# rpmbuild -ta @PACKAGE_NAME@-@PACKAGE_VERSION@.tar.gz --without georeplication</div><div class='add'>+%{?_without_georeplication:%global _without_georeplication --disable-georeplication}</div><div class='add'>+</div><div class='add'>+# gnfs</div><div class='add'>+# if you wish to compile an rpm with the legacy gNFS server xlator</div><div class='add'>+# rpmbuild -ta @PACKAGE_NAME@-@PACKAGE_VERSION@.tar.gz --with gnfs</div><div class='add'>+%{?_with_gnfs:%global _with_gnfs --enable-gnfs}</div><div class='add'>+</div><div class='add'>+# ipv6default</div><div class='add'>+# if you wish to compile an rpm with IPv6 default...</div><div class='add'>+# rpmbuild -ta @PACKAGE_NAME@-@PACKAGE_VERSION@.tar.gz --with ipv6default</div><div class='add'>+%{?_with_ipv6default:%global _with_ipv6default --with-ipv6-default}</div><div class='add'>+</div><div class='add'>+# libtirpc</div><div class='add'>+# if you wish to compile an rpm without TIRPC (i.e. use legacy glibc rpc)</div><div class='add'>+# rpmbuild -ta @PACKAGE_NAME@-@PACKAGE_VERSION@.tar.gz --without libtirpc</div><div class='add'>+%{?_without_libtirpc:%global _without_libtirpc --without-libtirpc}</div><div class='add'>+</div><div class='add'>+# Do not use libtirpc on EL6, it does not have xdr_uint64_t() and xdr_uint32_t</div><div class='add'>+# Do not use libtirpc on EL7, it does not have xdr_sizeof()</div><div class='add'>+%if ( 0%{?rhel} &amp;&amp; 0%{?rhel} &lt;= 7 )</div><div class='add'>+%global _without_libtirpc --without-libtirpc</div><div class='add'>+%endif</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+# ocf</div><div class='add'>+# if you wish to compile an rpm without the OCF resource agents...</div><div class='add'>+# rpmbuild -ta @PACKAGE_NAME@-@PACKAGE_VERSION@.tar.gz --without ocf</div><div class='add'>+%{?_without_ocf:%global _without_ocf --without-ocf}</div><div class='add'>+</div><div class='add'>+# server</div><div class='add'>+# if you wish to build rpms without server components, compile like this</div><div class='add'>+# rpmbuild -ta @PACKAGE_NAME@-@PACKAGE_VERSION@.tar.gz --without server</div><div class='add'>+%{?_without_server:%global _without_server --without-server}</div><div class='add'>+</div><div class='add'>+# disable server components forcefully as rhel &lt;= 6</div><div class='add'>+%if ( 0%{?rhel} &amp;&amp; 0%{?rhel} &lt;= 6 )</div><div class='add'>+%global _without_server --without-server</div><div class='add'>+%endif</div><div class='add'>+</div><div class='add'>+# syslog</div><div class='add'>+# if you wish to build rpms without syslog logging, compile like this</div><div class='add'>+# rpmbuild -ta @PACKAGE_NAME@-@PACKAGE_VERSION@.tar.gz --without syslog</div><div class='add'>+%{?_without_syslog:%global _without_syslog --disable-syslog}</div><div class='add'>+</div><div class='add'>+# disable syslog forcefully as rhel &lt;= 6 doesn't have rsyslog or rsyslog-mmcount</div><div class='add'>+# Fedora deprecated syslog, see</div><div class='add'>+#  https://fedoraproject.org/wiki/Changes/NoDefaultSyslog</div><div class='add'>+# (And what about RHEL7?)</div><div class='add'>+%if ( 0%{?fedora} &amp;&amp; 0%{?fedora} &gt;= 20 ) || ( 0%{?rhel} &amp;&amp; 0%{?rhel} &lt;= 6 )</div><div class='add'>+%global _without_syslog --disable-syslog</div><div class='add'>+%endif</div><div class='add'>+</div><div class='add'>+# tsan</div><div class='add'>+# if you wish to compile an rpm with thread sanitizer...</div><div class='add'>+# rpmbuild -ta @PACKAGE_NAME@-@PACKAGE_VERSION@.tar.gz --with tsan</div><div class='add'>+%{?_with_tsan:%global _with_tsan --enable-tsan}</div><div class='add'>+</div><div class='add'>+%if ( 0%{?rhel} &amp;&amp; 0%{?rhel} &lt; 7 )</div><div class='add'>+%global _with_tsan %{nil}</div><div class='add'>+%endif</div><div class='add'>+</div><div class='add'>+# valgrind</div><div class='add'>+# if you wish to compile an rpm to run all processes under valgrind...</div><div class='add'>+# rpmbuild -ta @PACKAGE_NAME@-@PACKAGE_VERSION@.tar.gz --with valgrind</div><div class='add'>+%{?_with_valgrind:%global _with_valgrind --enable-valgrind}</div><div class='add'>+</div><div class='add'>+##-----------------------------------------------------------------------------</div><div class='add'>+## All %%global definitions should be placed here and keep them sorted</div><div class='add'>+##</div><div class='add'>+</div><div class='add'>+# selinux booleans whose defalut value needs modification</div><div class='add'>+# these booleans will be consumed by "%%selinux_set_booleans" macro.</div><div class='add'>+%if ( 0%{?rhel} &amp;&amp; 0%{?rhel} &gt;= 8 )</div><div class='add'>+%global selinuxbooleans rsync_full_access=1 rsync_client=1</div><div class='add'>+%endif</div><div class='add'>+</div><div class='add'>+%if ( 0%{?fedora} ) || ( 0%{?rhel} &amp;&amp; 0%{?rhel} &gt; 6 )</div><div class='add'>+%global _with_systemd true</div><div class='add'>+%endif</div><div class='add'>+</div><div class='add'>+%if ( 0%{?fedora} ) || ( 0%{?rhel} &amp;&amp; 0%{?rhel} &gt;= 7 )</div><div class='add'>+%global _with_firewalld --enable-firewalld</div><div class='add'>+%endif</div><div class='add'>+</div><div class='add'>+%if 0%{?_tmpfilesdir:1}</div><div class='add'>+%global _with_tmpfilesdir --with-tmpfilesdir=%{_tmpfilesdir}</div><div class='add'>+%else</div><div class='add'>+%global _with_tmpfilesdir --without-tmpfilesdir</div><div class='add'>+%endif</div><div class='add'>+</div><div class='add'>+# without server should also disable some server-only components</div><div class='add'>+%if 0%{?_without_server:1}</div><div class='add'>+%global _without_events --disable-events</div><div class='add'>+%global _without_georeplication --disable-georeplication</div><div class='add'>+%global _with_gnfs %{nil}</div><div class='add'>+%global _without_ocf --without-ocf</div><div class='add'>+%endif</div><div class='add'>+</div><div class='add'>+%if ( 0%{?fedora} ) || ( 0%{?rhel} &amp;&amp; 0%{?rhel} &gt; 7 )</div><div class='add'>+%global _usepython3 1</div><div class='add'>+%global _pythonver 3</div><div class='add'>+%else</div><div class='add'>+%global _usepython3 0</div><div class='add'>+%global _pythonver 2</div><div class='add'>+%endif</div><div class='add'>+</div><div class='add'>+# From https://fedoraproject.org/wiki/Packaging:Python#Macros</div><div class='add'>+%if ( 0%{?rhel} &amp;&amp; 0%{?rhel} &lt;= 6 )</div><div class='add'>+%{!?python2_sitelib: %global python2_sitelib %(python2 -c "from distutils.sysconfig import get_python_lib; print(get_python_lib())")}</div><div class='add'>+%{!?python2_sitearch: %global python2_sitearch %(python2 -c "from distutils.sysconfig import get_python_lib; print(get_python_lib(1))")}</div><div class='add'>+%global _rundir %{_localstatedir}/run</div><div class='add'>+%endif</div><div class='add'>+</div><div class='add'>+%if ( 0%{?_with_systemd:1} )</div><div class='add'>+%global service_start()   /bin/systemctl --quiet start %1.service || : \</div><div class='add'>+%{nil}</div><div class='add'>+%global service_stop()    /bin/systemctl --quiet stop %1.service || :\</div><div class='add'>+%{nil}</div><div class='add'>+%global service_install() install -D -p -m 0644 %1.service %{buildroot}%2 \</div><div class='add'>+%{nil}</div><div class='add'>+# can't seem to make a generic macro that works</div><div class='add'>+%global glusterd_svcfile   %{_unitdir}/glusterd.service</div><div class='add'>+%global glusterfsd_svcfile %{_unitdir}/glusterfsd.service</div><div class='add'>+%global glusterta_svcfile %{_unitdir}/gluster-ta-volume.service</div><div class='add'>+%global glustereventsd_svcfile %{_unitdir}/glustereventsd.service</div><div class='add'>+%global glusterfssharedstorage_svcfile %{_unitdir}/glusterfssharedstorage.service</div><div class='add'>+%else</div><div class='add'>+%global systemd_post()  /sbin/chkconfig --add %1 &gt;/dev/null 2&gt;&amp;1 || : \</div><div class='add'>+%{nil}</div><div class='add'>+%global systemd_preun() /sbin/chkconfig --del %1 &gt;/dev/null 2&gt;&amp;1 || : \</div><div class='add'>+%{nil}</div><div class='add'>+%global systemd_postun_with_restart() /sbin/service %1 condrestart &gt;/dev/null 2&gt;&amp;1 || : \</div><div class='add'>+%{nil}</div><div class='add'>+%global service_start()   /sbin/service %1 start &gt;/dev/null 2&gt;&amp;1 || : \</div><div class='add'>+%{nil}</div><div class='add'>+%global service_stop()    /sbin/service %1 stop &gt;/dev/null 2&gt;&amp;1 || : \</div><div class='add'>+%{nil}</div><div class='add'>+%global service_install() install -D -p -m 0755 %1.init %{buildroot}%2 \</div><div class='add'>+%{nil}</div><div class='add'>+# can't seem to make a generic macro that works</div><div class='add'>+%global glusterd_svcfile   %{_sysconfdir}/init.d/glusterd</div><div class='add'>+%global glusterfsd_svcfile %{_sysconfdir}/init.d/glusterfsd</div><div class='add'>+%global glustereventsd_svcfile %{_sysconfdir}/init.d/glustereventsd</div><div class='add'>+%endif</div><div class='add'>+</div><div class='add'>+%{!?_pkgdocdir: %global _pkgdocdir %{_docdir}/%{name}-%{version}}</div><div class='add'>+</div><div class='add'>+# We do not want to generate useless provides and requires for xlator</div><div class='add'>+# .so files to be set for glusterfs packages.</div><div class='add'>+# Filter all generated:</div><div class='add'>+#</div><div class='add'>+# TODO: RHEL5 does not have a convenient solution</div><div class='add'>+%if ( 0%{?rhel} == 6 )</div><div class='add'>+# filter_setup exists in RHEL6 only</div><div class='add'>+%filter_provides_in %{_libdir}/glusterfs/%{version}/</div><div class='add'>+%global __filter_from_req %{?__filter_from_req} | grep -v -P '^(?!lib).*\.so.*$'</div><div class='add'>+%filter_setup</div><div class='add'>+%else</div><div class='add'>+# modern rpm and current Fedora do not generate requires when the</div><div class='add'>+# provides are filtered</div><div class='add'>+%global __provides_exclude_from ^%{_libdir}/glusterfs/%{version}/.*$</div><div class='add'>+%endif</div><div class='ctx'> </div><div class='del'>-BuildRequires: bison flex </div><div class='del'>-BuildRequires: gcc make</div><div class='add'>+</div><div class='add'>+##-----------------------------------------------------------------------------</div><div class='add'>+## All package definitions should be placed here in alphabetical order</div><div class='add'>+##</div><div class='add'>+Summary:          Distributed File System</div><div class='add'>+%if ( 0%{_for_fedora_koji_builds} )</div><div class='add'>+Name:             glusterfs</div><div class='add'>+Version:          3.8.0</div><div class='add'>+Release:          0.1%{?prereltag:.%{prereltag}}%{?dist}</div><div class='add'>+%else</div><div class='add'>+Name:             @PACKAGE_NAME@</div><div class='add'>+Version:          @PACKAGE_VERSION@</div><div class='add'>+Release:          0.@PACKAGE_RELEASE@%{?dist}</div><div class='add'>+%endif</div><div class='add'>+License:          GPLv2 or LGPLv3+</div><div class='add'>+URL:              http://docs.gluster.org/</div><div class='add'>+%if ( 0%{_for_fedora_koji_builds} )</div><div class='add'>+Source0:          http://bits.gluster.org/pub/gluster/glusterfs/src/glusterfs-%{version}%{?prereltag}.tar.gz</div><div class='add'>+Source1:          glusterd.sysconfig</div><div class='add'>+Source2:          glusterfsd.sysconfig</div><div class='add'>+Source7:          glusterfsd.service</div><div class='add'>+Source8:          glusterfsd.init</div><div class='add'>+%else</div><div class='add'>+Source0:          @PACKAGE_NAME@-@PACKAGE_VERSION@.tar.gz</div><div class='add'>+%endif</div><div class='add'>+</div><div class='add'>+BuildRoot:        %(mktemp -ud %{_tmppath}/%{name}-%{version}-%{release}-XXXXXX)</div><div class='add'>+</div><div class='add'>+Requires(pre):    shadow-utils</div><div class='add'>+%if ( 0%{?_with_systemd:1} )</div><div class='add'>+BuildRequires:    systemd</div><div class='add'>+%endif</div><div class='add'>+</div><div class='add'>+Requires:         libglusterfs0%{?_isa} = %{version}-%{release}</div><div class='add'>+Requires:         libgfrpc0%{?_isa} = %{version}-%{release}</div><div class='add'>+Requires:         libgfxdr0%{?_isa} = %{version}-%{release}</div><div class='add'>+%if ( 0%{?_with_systemd:1} )</div><div class='add'>+%{?systemd_requires}</div><div class='add'>+%endif</div><div class='add'>+%if 0%{?_with_asan:1} &amp;&amp; !( 0%{?rhel} &amp;&amp; 0%{?rhel} &lt; 7 )</div><div class='add'>+BuildRequires:    libasan</div><div class='add'>+%endif</div><div class='add'>+%if 0%{?_with_tsan:1} &amp;&amp; !( 0%{?rhel} &amp;&amp; 0%{?rhel} &lt; 7 )</div><div class='add'>+BuildRequires:    libtsan</div><div class='add'>+%endif</div><div class='add'>+BuildRequires:    bison flex</div><div class='add'>+BuildRequires:    gcc make libtool</div><div class='add'>+BuildRequires:    ncurses-devel readline-devel</div><div class='add'>+BuildRequires:    libxml2-devel openssl-devel</div><div class='add'>+BuildRequires:    libaio-devel libacl-devel</div><div class='add'>+BuildRequires:    python%{_pythonver}-devel</div><div class='add'>+%if ( 0%{?rhel} &amp;&amp; 0%{?rhel} &lt; 8 )</div><div class='add'>+BuildRequires:    python-ctypes</div><div class='add'>+%endif</div><div class='add'>+%if ( 0%{?_with_ipv6default:1} ) || ( 0%{!?_without_libtirpc:1} )</div><div class='add'>+BuildRequires:    libtirpc-devel</div><div class='add'>+%endif</div><div class='add'>+%if ( 0%{?fedora} &amp;&amp; 0%{?fedora} &gt; 27 ) || ( 0%{?rhel} &amp;&amp; 0%{?rhel} &gt; 7 )</div><div class='add'>+BuildRequires:    rpcgen</div><div class='add'>+%endif</div><div class='add'>+BuildRequires:    userspace-rcu-devel &gt;= 0.7</div><div class='add'>+%if ( 0%{?rhel} &amp;&amp; 0%{?rhel} &lt;= 6 )</div><div class='add'>+BuildRequires:    automake</div><div class='add'>+%endif</div><div class='add'>+BuildRequires:    libuuid-devel</div><div class='add'>+%if ( 0%{?_with_cmocka:1} )</div><div class='add'>+BuildRequires:    libcmocka-devel &gt;= 1.0.1</div><div class='add'>+%endif</div><div class='add'>+%if ( 0%{!?_without_georeplication:1} )</div><div class='add'>+BuildRequires:    libattr-devel</div><div class='add'>+%endif</div><div class='add'>+</div><div class='add'>+%if (0%{?_with_firewalld:1})</div><div class='add'>+BuildRequires:    firewalld</div><div class='add'>+%endif</div><div class='add'>+</div><div class='add'>+Obsoletes:        %{name}-common &lt; %{version}-%{release}</div><div class='add'>+Obsoletes:        %{name}-core &lt; %{version}-%{release}</div><div class='add'>+Obsoletes:        %{name}-ganesha</div><div class='add'>+Obsoletes:        %{name}-rdma &lt; %{version}-%{release}</div><div class='add'>+%if ( 0%{!?_with_gnfs:1} )</div><div class='add'>+Obsoletes:        %{name}-gnfs &lt; %{version}-%{release}</div><div class='add'>+%endif</div><div class='add'>+Provides:         %{name}-common = %{version}-%{release}</div><div class='add'>+Provides:         %{name}-core = %{version}-%{release}</div><div class='ctx'> </div><div class='ctx'> %description</div><div class='del'>-GlusterFS is a clustered file-system capable of scaling to several</div><div class='del'>-peta-bytes. It aggregates various storage bricks over Infiniband RDMA</div><div class='del'>-or TCP/IP interconnect into one large parallel network file</div><div class='del'>-system. GlusterFS is one of the most sophisticated file system in</div><div class='del'>-terms of features and extensibility.  It borrows a powerful concept</div><div class='del'>-called Translators from GNU Hurd kernel. Much of the code in GlusterFS</div><div class='del'>-is in userspace and easily manageable.</div><div class='add'>+GlusterFS is a distributed file-system capable of scaling to several</div><div class='add'>+petabytes. It aggregates various storage bricks over TCP/IP interconnect</div><div class='add'>+into one large parallel network filesystem. GlusterFS is one of the</div><div class='add'>+most sophisticated file systems in terms of features and extensibility.</div><div class='add'>+It borrows a powerful concept called Translators from GNU Hurd kernel.</div><div class='add'>+Much of the code in GlusterFS is in user space and easily manageable.</div><div class='ctx'> </div><div class='del'>-%package core</div><div class='del'>-Summary: GlusterFS common files for both the client and the server </div><div class='del'>-Group: System Environment/Libraries</div><div class='del'>-Obsoletes: glusterfs-libs &lt;= 2.0.0</div><div class='del'>-Provides: glusterfs-libs = %{version}-%{release}</div><div class='add'>+This package includes the glusterfs binary, the glusterfsd daemon and the</div><div class='add'>+libglusterfs and glusterfs translator modules common to both GlusterFS server</div><div class='add'>+and client framework.</div><div class='ctx'> </div><div class='del'>-%description core</div><div class='del'>-GlusterFS is a clustered file-system capable of scaling to several</div><div class='del'>-peta-bytes. It aggregates various storage bricks over Infiniband RDMA</div><div class='del'>-or TCP/IP interconnect into one large parallel network file</div><div class='del'>-system. GlusterFS is one of the most sophisticated file system in</div><div class='del'>-terms of features and extensibility.  It borrows a powerful concept</div><div class='del'>-called Translators from GNU Hurd kernel. Much of the code in GlusterFS</div><div class='del'>-is in userspace and easily manageable.</div><div class='add'>+%package cli</div><div class='add'>+Summary:          GlusterFS CLI</div><div class='add'>+Requires:         libglusterfs0%{?_isa} = %{version}-%{release}</div><div class='add'>+Requires:         libglusterd0%{?_isa} = %{version}-%{release}</div><div class='ctx'> </div><div class='del'>-This package includes the glusterfs binary, the glusterd daemon and the gluster</div><div class='del'>-command line, libglusterfs and glusterfs translator modules common to both</div><div class='del'>-GlusterFS server and client framework.</div><div class='add'>+%description cli</div><div class='add'>+GlusterFS is a distributed file-system capable of scaling to several</div><div class='add'>+petabytes. It aggregates various storage bricks over TCP/IP interconnect</div><div class='add'>+into one large parallel network filesystem. GlusterFS is one of the</div><div class='add'>+most sophisticated file systems in terms of features and extensibility.</div><div class='add'>+It borrows a powerful concept called Translators from GNU Hurd kernel.</div><div class='add'>+Much of the code in GlusterFS is in user space and easily manageable.</div><div class='ctx'> </div><div class='del'>-%package rdma</div><div class='del'>-Summary: GlusterFS rdma</div><div class='del'>-Group: Applications/File</div><div class='del'>-Requires: libibverbs-devel</div><div class='add'>+This package provides the GlusterFS CLI application and its man page</div><div class='ctx'> </div><div class='del'>-%description rdma</div><div class='del'>-GlusterFS is a clustered file-system capable of scaling to several</div><div class='del'>-peta-bytes. It aggregates various storage bricks over Infiniband RDMA</div><div class='del'>-or TCP/IP interconnect into one large parallel network file</div><div class='del'>-system. GlusterFS is one of the most sophisticated file system in</div><div class='del'>-terms of features and extensibility.  It borrows a powerful concept</div><div class='del'>-called Translators from GNU Hurd kernel. Much of the code in GlusterFS</div><div class='del'>-is in userspace and easily manageable.</div><div class='add'>+%package cloudsync-plugins</div><div class='add'>+Summary:          Cloudsync Plugins</div><div class='add'>+BuildRequires:    libcurl-devel</div><div class='add'>+</div><div class='add'>+%description cloudsync-plugins</div><div class='add'>+GlusterFS is a distributed file-system capable of scaling to several</div><div class='add'>+petabytes. It aggregates various storage bricks over TCP/IP interconnect</div><div class='add'>+into one large parallel network filesystem. GlusterFS is one of the</div><div class='add'>+most sophisticated file systems in terms of features and extensibility.</div><div class='add'>+It borrows a powerful concept called Translators from GNU Hurd kernel.</div><div class='add'>+Much of the code in GlusterFS is in user space and easily manageable.</div><div class='add'>+</div><div class='add'>+This package provides cloudsync plugins for archival feature.</div><div class='add'>+</div><div class='add'>+%package extra-xlators</div><div class='add'>+Summary:          Extra Gluster filesystem Translators</div><div class='add'>+# We need python-gluster rpm for gluster module's __init__.py in Python</div><div class='add'>+# site-packages area</div><div class='add'>+Requires:         python%{_pythonver}-gluster = %{version}-%{release}</div><div class='add'>+Requires:         python%{_pythonver}</div><div class='ctx'> </div><div class='del'>-This package provides support to ib-verbs library.</div><div class='add'>+%description extra-xlators</div><div class='add'>+GlusterFS is a distributed file-system capable of scaling to several</div><div class='add'>+petabytes. It aggregates various storage bricks over TCP/IP interconnect</div><div class='add'>+into one large parallel network filesystem. GlusterFS is one of the</div><div class='add'>+most sophisticated file systems in terms of features and extensibility.</div><div class='add'>+It borrows a powerful concept called Translators from GNU Hurd kernel.</div><div class='add'>+Much of the code in GlusterFS is in user space and easily manageable.</div><div class='add'>+</div><div class='add'>+This package provides extra filesystem Translators, such as Glupy,</div><div class='add'>+for GlusterFS.</div><div class='ctx'> </div><div class='ctx'> %package fuse</div><div class='del'>-Summary: GlusterFS Fuse</div><div class='del'>-Group: Applications/File</div><div class='add'>+Summary:          Fuse client</div><div class='add'>+BuildRequires:    fuse-devel</div><div class='add'>+Requires:         attr</div><div class='add'>+Requires:         psmisc</div><div class='add'>+</div><div class='add'>+Requires:         %{name}%{?_isa} = %{version}-%{release}</div><div class='add'>+Requires:         %{name}-client-xlators%{?_isa} = %{version}-%{release}</div><div class='add'>+</div><div class='add'>+Obsoletes:        %{name}-client &lt; %{version}-%{release}</div><div class='add'>+Provides:         %{name}-client = %{version}-%{release}</div><div class='ctx'> </div><div class='ctx'> %description fuse</div><div class='del'>-GlusterFS is a clustered file-system capable of scaling to several</div><div class='del'>-peta-bytes. It aggregates various storage bricks over Infiniband RDMA</div><div class='add'>+GlusterFS is a distributed file-system capable of scaling to several</div><div class='add'>+petabytes. It aggregates various storage bricks over TCP/IP interconnect</div><div class='add'>+into one large parallel network filesystem. GlusterFS is one of the</div><div class='add'>+most sophisticated file systems in terms of features and extensibility.</div><div class='add'>+It borrows a powerful concept called Translators from GNU Hurd kernel.</div><div class='add'>+Much of the code in GlusterFS is in user space and easily manageable.</div><div class='add'>+</div><div class='add'>+This package provides support to FUSE based clients and inlcudes the</div><div class='add'>+glusterfs(d) binary.</div><div class='add'>+</div><div class='add'>+%if ( 0%{!?_without_server:1} )</div><div class='add'>+%package ganesha</div><div class='add'>+Summary:          NFS-Ganesha configuration</div><div class='add'>+Group:            Applications/File</div><div class='add'>+</div><div class='add'>+Requires:         %{name}-server%{?_isa} = %{version}-%{release}</div><div class='add'>+Requires:         nfs-ganesha-selinux &gt;= 2.7.6</div><div class='add'>+Requires:         nfs-ganesha-gluster &gt;= 2.7.6</div><div class='add'>+Requires:         pcs &gt;= 0.10.0</div><div class='add'>+Requires:         resource-agents &gt;= 4.2.0</div><div class='add'>+Requires:         dbus</div><div class='add'>+</div><div class='add'>+%if ( 0%{?rhel} &amp;&amp; 0%{?rhel} == 6 )</div><div class='add'>+Requires:         cman, pacemaker, corosync</div><div class='add'>+%endif</div><div class='add'>+</div><div class='add'>+%if ( 0%{?fedora} ) || ( 0%{?rhel} &amp;&amp; 0%{?rhel} &gt; 5 )</div><div class='add'>+# we need portblock resource-agent in 3.9.5 and later.</div><div class='add'>+Requires:         net-tools</div><div class='add'>+%endif</div><div class='add'>+</div><div class='add'>+%if ( 0%{?fedora} &amp;&amp; 0%{?fedora} &gt; 25  || ( 0%{?rhel} &amp;&amp; 0%{?rhel} &gt; 6 ) )</div><div class='add'>+%if ( 0%{?rhel} &amp;&amp; 0%{?rhel} &lt; 8 )</div><div class='add'>+Requires: selinux-policy &gt;= 3.13.1-160</div><div class='add'>+Requires(post):   policycoreutils-python</div><div class='add'>+Requires(postun): policycoreutils-python</div><div class='add'>+%else</div><div class='add'>+Requires(post):   policycoreutils-python-utils</div><div class='add'>+Requires(postun): policycoreutils-python-utils</div><div class='add'>+%endif</div><div class='add'>+%endif</div><div class='add'>+</div><div class='add'>+%description ganesha</div><div class='add'>+GlusterFS is a distributed file-system capable of scaling to several</div><div class='add'>+petabytes. It aggregates various storage bricks over Infiniband RDMA</div><div class='ctx'> or TCP/IP interconnect into one large parallel network file</div><div class='del'>-system. GlusterFS is one of the most sophisticated file system in</div><div class='add'>+system. GlusterFS is one of the most sophisticated file systems in</div><div class='ctx'> terms of features and extensibility.  It borrows a powerful concept</div><div class='ctx'> called Translators from GNU Hurd kernel. Much of the code in GlusterFS</div><div class='del'>-is in userspace and easily manageable.</div><div class='add'>+is in user space and easily manageable.</div><div class='add'>+</div><div class='add'>+This package provides the configuration and related files for using</div><div class='add'>+NFS-Ganesha as the NFS server using GlusterFS</div><div class='add'>+%endif</div><div class='add'>+</div><div class='add'>+%if ( 0%{!?_without_georeplication:1} )</div><div class='add'>+%package geo-replication</div><div class='add'>+Summary:          GlusterFS Geo-replication</div><div class='add'>+Requires:         %{name}%{?_isa} = %{version}-%{release}</div><div class='add'>+Requires:         %{name}-server%{?_isa} = %{version}-%{release}</div><div class='add'>+Requires:         python%{_pythonver}</div><div class='add'>+Requires:         python%{_pythonver}-prettytable</div><div class='add'>+Requires:         python%{_pythonver}-gluster = %{version}-%{release}</div><div class='add'>+</div><div class='add'>+Requires:         rsync</div><div class='add'>+Requires:         util-linux</div><div class='add'>+# required for setting selinux bools</div><div class='add'>+%if ( 0%{?rhel} &amp;&amp; 0%{?rhel} &gt;= 8 )</div><div class='add'>+Requires(post):      policycoreutils-python-utils</div><div class='add'>+Requires(postun):    policycoreutils-python-utils</div><div class='add'>+Requires:            selinux-policy-targeted</div><div class='add'>+Requires(post):      selinux-policy-targeted</div><div class='add'>+BuildRequires:       selinux-policy-devel</div><div class='add'>+%endif</div><div class='add'>+</div><div class='add'>+%description geo-replication</div><div class='add'>+GlusterFS is a distributed file-system capable of scaling to several</div><div class='add'>+petabytes. It aggregates various storage bricks over TCP/IP interconnect</div><div class='add'>+into one large parallel network filesystem. GlusterFS is one of the</div><div class='add'>+most sophisticated file systems in terms of features and extensibility.</div><div class='add'>+It borrows a powerful concept called Translators from GNU Hurd kernel.</div><div class='add'>+Much of the code in GlusterFS is in user space and easily manageable.</div><div class='add'>+</div><div class='add'>+This package provides support to geo-replication.</div><div class='add'>+%endif</div><div class='add'>+</div><div class='add'>+%if ( 0%{?_with_gnfs:1} )</div><div class='add'>+%package gnfs</div><div class='add'>+Summary:          GlusterFS gNFS server</div><div class='add'>+Requires:         %{name}%{?_isa} = %{version}-%{release}</div><div class='add'>+Requires:         %{name}-client-xlators%{?_isa} = %{version}-%{release}</div><div class='add'>+Requires:         nfs-utils</div><div class='add'>+</div><div class='add'>+%description gnfs</div><div class='add'>+GlusterFS is a distributed file-system capable of scaling to several</div><div class='add'>+petabytes. It aggregates various storage bricks over TCP/IP interconnect</div><div class='add'>+into one large parallel network filesystem. GlusterFS is one of the</div><div class='add'>+most sophisticated file systems in terms of features and extensibility.</div><div class='add'>+It borrows a powerful concept called Translators from GNU Hurd kernel.</div><div class='add'>+Much of the code in GlusterFS is in user space and easily manageable.</div><div class='add'>+</div><div class='add'>+This package provides the glusterfs legacy gNFS server xlator</div><div class='add'>+%endif</div><div class='add'>+</div><div class='add'>+%package -n libglusterfs0</div><div class='add'>+Summary:          GlusterFS libglusterfs library</div><div class='add'>+Requires:         libgfrpc0%{?_isa} = %{version}-%{release}</div><div class='add'>+Requires:         libgfxdr0%{?_isa} = %{version}-%{release}</div><div class='add'>+Obsoletes:        %{name}-libs &lt;= %{version}-%{release}</div><div class='add'>+Provides:         %{name}-libs = %{version}-%{release}</div><div class='add'>+</div><div class='add'>+%description -n libglusterfs0</div><div class='add'>+GlusterFS is a distributed file-system capable of scaling to several</div><div class='add'>+petabytes. It aggregates various storage bricks over TCP/IP interconnect</div><div class='add'>+into one large parallel network filesystem. GlusterFS is one of the</div><div class='add'>+most sophisticated file systems in terms of features and extensibility.</div><div class='add'>+It borrows a powerful concept called Translators from GNU Hurd kernel.</div><div class='add'>+Much of the code in GlusterFS is in user space and easily manageable.</div><div class='add'>+</div><div class='add'>+This package provides the base libglusterfs library</div><div class='add'>+</div><div class='add'>+%package -n libglusterfs-devel</div><div class='add'>+Summary:          GlusterFS libglusterfs library</div><div class='add'>+Requires:         libgfrpc-devel%{?_isa} = %{version}-%{release}</div><div class='add'>+Requires:         libgfxdr-devel%{?_isa} = %{version}-%{release}</div><div class='add'>+Obsoletes:        %{name}-devel &lt;= %{version}-%{release}</div><div class='add'>+Provides:         %{name}-devel = %{version}-%{release}</div><div class='add'>+</div><div class='add'>+%description -n libglusterfs-devel</div><div class='add'>+GlusterFS is a distributed file-system capable of scaling to several</div><div class='add'>+petabytes. It aggregates various storage bricks over TCP/IP interconnect</div><div class='add'>+into one large parallel network filesystem. GlusterFS is one of the</div><div class='add'>+most sophisticated file systems in terms of features and extensibility.</div><div class='add'>+It borrows a powerful concept called Translators from GNU Hurd kernel.</div><div class='add'>+Much of the code in GlusterFS is in user space and easily manageable.</div><div class='add'>+</div><div class='add'>+This package provides libglusterfs.so and the gluster C header files.</div><div class='add'>+</div><div class='add'>+%package -n libgfapi0</div><div class='add'>+Summary:          GlusterFS api library</div><div class='add'>+Requires:         libglusterfs0%{?_isa} = %{version}-%{release}</div><div class='add'>+Requires:         %{name}-client-xlators%{?_isa} = %{version}-%{release}</div><div class='add'>+Obsoletes:        %{name}-api &lt;= %{version}-%{release}</div><div class='add'>+Provides:         %{name}-api = %{version}-%{release}</div><div class='add'>+</div><div class='add'>+%description -n libgfapi0</div><div class='add'>+GlusterFS is a distributed file-system capable of scaling to several</div><div class='add'>+petabytes. It aggregates various storage bricks over TCP/IP interconnect</div><div class='add'>+into one large parallel network filesystem. GlusterFS is one of the</div><div class='add'>+most sophisticated file systems in terms of features and extensibility.</div><div class='add'>+It borrows a powerful concept called Translators from GNU Hurd kernel.</div><div class='add'>+Much of the code in GlusterFS is in user space and easily manageable.</div><div class='add'>+</div><div class='add'>+This package provides the glusterfs libgfapi library.</div><div class='add'>+</div><div class='add'>+%package -n libgfapi-devel</div><div class='add'>+Summary:          Development Libraries</div><div class='add'>+Requires:         libglusterfs-devel%{?_isa} = %{version}-%{release}</div><div class='add'>+Requires:         libacl-devel</div><div class='add'>+Obsoletes:        %{name}-api-devel &lt;= %{version}-%{release}</div><div class='add'>+Provides:         %{name}-api-devel = %{version}-%{release}</div><div class='add'>+</div><div class='add'>+%description -n libgfapi-devel</div><div class='add'>+GlusterFS is a distributed file-system capable of scaling to several</div><div class='add'>+petabytes. It aggregates various storage bricks over TCP/IP interconnect</div><div class='add'>+into one large parallel network filesystem. GlusterFS is one of the</div><div class='add'>+most sophisticated file systems in terms of features and extensibility.</div><div class='add'>+It borrows a powerful concept called Translators from GNU Hurd kernel.</div><div class='add'>+Much of the code in GlusterFS is in user space and easily manageable.</div><div class='add'>+</div><div class='add'>+This package provides libgfapi.so and the api C header files.</div><div class='add'>+</div><div class='add'>+%package -n libgfchangelog0</div><div class='add'>+Summary:          GlusterFS libchangelog library</div><div class='add'>+Requires:         libglusterfs0%{?_isa} = %{version}-%{release}</div><div class='add'>+Obsoletes:        %{name}-libs &lt;= %{version}-%{release}</div><div class='add'>+</div><div class='add'>+%description -n libgfchangelog0</div><div class='add'>+GlusterFS is a distributed file-system capable of scaling to several</div><div class='add'>+petabytes. It aggregates various storage bricks over TCP/IP interconnect</div><div class='add'>+into one large parallel network filesystem. GlusterFS is one of the</div><div class='add'>+most sophisticated file systems in terms of features and extensibility.</div><div class='add'>+It borrows a powerful concept called Translators from GNU Hurd kernel.</div><div class='add'>+Much of the code in GlusterFS is in user space and easily manageable.</div><div class='add'>+</div><div class='add'>+This package provides the libgfchangelog library</div><div class='add'>+</div><div class='add'>+%package -n libgfchangelog-devel</div><div class='add'>+Summary:          GlusterFS libchangelog library</div><div class='add'>+Requires:         libglusterfs-devel%{?_isa} = %{version}-%{release}</div><div class='add'>+Obsoletes:        %{name}-devel &lt;= %{version}-%{release}</div><div class='add'>+</div><div class='add'>+%description -n libgfchangelog-devel</div><div class='add'>+GlusterFS is a distributed file-system capable of scaling to several</div><div class='add'>+petabytes. It aggregates various storage bricks over TCP/IP interconnect</div><div class='add'>+into one large parallel network filesystem. GlusterFS is one of the</div><div class='add'>+most sophisticated file systems in terms of features and extensibility.</div><div class='add'>+It borrows a powerful concept called Translators from GNU Hurd kernel.</div><div class='add'>+Much of the code in GlusterFS is in user space and easily manageable.</div><div class='add'>+</div><div class='add'>+This package provides libgfchangelog.so and changelog C header files.</div><div class='add'>+</div><div class='add'>+%package -n libgfrpc0</div><div class='add'>+Summary:          GlusterFS libgfrpc0 library</div><div class='add'>+Requires:         libglusterfs0%{?_isa} = %{version}-%{release}</div><div class='add'>+Obsoletes:        %{name}-libs &lt;= %{version}-%{release}</div><div class='add'>+</div><div class='add'>+%description -n libgfrpc0</div><div class='add'>+GlusterFS is a distributed file-system capable of scaling to several</div><div class='add'>+petabytes. It aggregates various storage bricks over TCP/IP interconnect</div><div class='add'>+into one large parallel network filesystem. GlusterFS is one of the</div><div class='add'>+most sophisticated file systems in terms of features and extensibility.</div><div class='add'>+It borrows a powerful concept called Translators from GNU Hurd kernel.</div><div class='add'>+Much of the code in GlusterFS is in user space and easily manageable.</div><div class='add'>+</div><div class='add'>+This package provides the libgfrpc library</div><div class='ctx'> </div><div class='del'>-This package provides support to FUSE based clients.</div><div class='add'>+%package -n libgfrpc-devel</div><div class='add'>+Summary:          GlusterFS libgfrpc library</div><div class='add'>+Requires:         libglusterfs0%{?_isa} = %{version}-%{release}</div><div class='add'>+Obsoletes:        %{name}-devel &lt;= %{version}-%{release}</div><div class='ctx'> </div><div class='add'>+%description -n libgfrpc-devel</div><div class='add'>+GlusterFS is a distributed file-system capable of scaling to several</div><div class='add'>+petabytes. It aggregates various storage bricks over TCP/IP interconnect</div><div class='add'>+into one large parallel network filesystem. GlusterFS is one of the</div><div class='add'>+most sophisticated file systems in terms of features and extensibility.</div><div class='add'>+It borrows a powerful concept called Translators from GNU Hurd kernel.</div><div class='add'>+Much of the code in GlusterFS is in user space and easily manageable.</div><div class='add'>+</div><div class='add'>+This package provides libgfrpc.so and rpc C header files.</div><div class='add'>+</div><div class='add'>+%package -n libgfxdr0</div><div class='add'>+Summary:          GlusterFS libgfxdr0 library</div><div class='add'>+Requires:         libglusterfs0%{?_isa} = %{version}-%{release}</div><div class='add'>+Obsoletes:        %{name}-libs &lt;= %{version}-%{release}</div><div class='add'>+</div><div class='add'>+%description -n libgfxdr0</div><div class='add'>+GlusterFS is a distributed file-system capable of scaling to several</div><div class='add'>+petabytes. It aggregates various storage bricks over TCP/IP interconnect</div><div class='add'>+into one large parallel network filesystem. GlusterFS is one of the</div><div class='add'>+most sophisticated file systems in terms of features and extensibility.</div><div class='add'>+It borrows a powerful concept called Translators from GNU Hurd kernel.</div><div class='add'>+Much of the code in GlusterFS is in user space and easily manageable.</div><div class='add'>+</div><div class='add'>+This package provides the libgfxdr library</div><div class='add'>+</div><div class='add'>+%package -n libgfxdr-devel</div><div class='add'>+Summary:          GlusterFS libgfxdr library</div><div class='add'>+Requires:         libglusterfs0%{?_isa} = %{version}-%{release}</div><div class='add'>+Obsoletes:        %{name}-devel &lt;= %{version}-%{release}</div><div class='add'>+</div><div class='add'>+%description -n libgfxdr-devel</div><div class='add'>+GlusterFS is a distributed file-system capable of scaling to several</div><div class='add'>+petabytes. It aggregates various storage bricks over TCP/IP interconnect</div><div class='add'>+into one large parallel network filesystem. GlusterFS is one of the</div><div class='add'>+most sophisticated file systems in terms of features and extensibility.</div><div class='add'>+It borrows a powerful concept called Translators from GNU Hurd kernel.</div><div class='add'>+Much of the code in GlusterFS is in user space and easily manageable.</div><div class='add'>+</div><div class='add'>+This package provides libgfxdr.so.</div><div class='add'>+</div><div class='add'>+%package -n libglusterd0</div><div class='add'>+Summary:          GlusterFS libglusterd library</div><div class='add'>+Requires:         libglusterfs0%{?_isa} = %{version}-%{release}</div><div class='add'>+Obsoletes:        %{name}-libs &lt;= %{version}-%{release}</div><div class='add'>+</div><div class='add'>+%description -n libglusterd0</div><div class='add'>+GlusterFS is a distributed file-system capable of scaling to several</div><div class='add'>+petabytes. It aggregates various storage bricks over TCP/IP interconnect</div><div class='add'>+into one large parallel network filesystem. GlusterFS is one of the</div><div class='add'>+most sophisticated file systems in terms of features and extensibility.</div><div class='add'>+It borrows a powerful concept called Translators from GNU Hurd kernel.</div><div class='add'>+Much of the code in GlusterFS is in user space and easily manageable.</div><div class='add'>+</div><div class='add'>+This package provides the libglusterd library</div><div class='add'>+</div><div class='add'>+%package -n python%{_pythonver}-gluster</div><div class='add'>+Summary:          GlusterFS python library</div><div class='add'>+Requires:         python%{_pythonver}</div><div class='add'>+%if ( ! %{_usepython3} )</div><div class='add'>+%{?python_provide:%python_provide python-gluster}</div><div class='add'>+Provides:         python-gluster = %{version}-%{release}</div><div class='add'>+Obsoletes:        python-gluster &lt; 3.10</div><div class='add'>+%endif</div><div class='add'>+</div><div class='add'>+%description -n python%{_pythonver}-gluster</div><div class='add'>+GlusterFS is a distributed file-system capable of scaling to several</div><div class='add'>+petabytes. It aggregates various storage bricks over TCP/IP interconnect</div><div class='add'>+into one large parallel network filesystem. GlusterFS is one of the</div><div class='add'>+most sophisticated file systems in terms of features and extensibility.</div><div class='add'>+It borrows a powerful concept called Translators from GNU Hurd kernel.</div><div class='add'>+Much of the code in GlusterFS is in user space and easily manageable.</div><div class='add'>+</div><div class='add'>+This package contains the python modules of GlusterFS and own gluster</div><div class='add'>+namespace.</div><div class='add'>+</div><div class='add'>+%package regression-tests</div><div class='add'>+Summary:          Development Tools</div><div class='add'>+Requires:         %{name}%{?_isa} = %{version}-%{release}</div><div class='add'>+Requires:         %{name}-fuse%{?_isa} = %{version}-%{release}</div><div class='add'>+Requires:         %{name}-server%{?_isa} = %{version}-%{release}</div><div class='add'>+## thin provisioning support</div><div class='add'>+Requires:         lvm2 &gt;= 2.02.89</div><div class='add'>+Requires:         perl(App::Prove) perl(Test::Harness) gcc util-linux-ng</div><div class='add'>+Requires:         python%{_pythonver}</div><div class='add'>+Requires:         attr dbench file git libacl-devel net-tools</div><div class='add'>+Requires:         nfs-utils xfsprogs yajl psmisc bc</div><div class='add'>+</div><div class='add'>+%description regression-tests</div><div class='add'>+The Gluster Test Framework, is a suite of scripts used for</div><div class='add'>+regression testing of Gluster.</div><div class='add'>+</div><div class='add'>+%if ( 0%{!?_without_ocf:1} )</div><div class='add'>+%package resource-agents</div><div class='add'>+Summary:          OCF Resource Agents for GlusterFS</div><div class='add'>+License:          GPLv3+</div><div class='add'>+BuildArch:        noarch</div><div class='add'>+# this Group handling comes from the Fedora resource-agents package</div><div class='add'>+# for glusterd</div><div class='add'>+Requires:         %{name}-server = %{version}-%{release}</div><div class='add'>+# depending on the distribution, we need pacemaker or resource-agents</div><div class='add'>+Requires:         %{_prefix}/lib/ocf/resource.d</div><div class='add'>+</div><div class='add'>+%description resource-agents</div><div class='add'>+GlusterFS is a distributed file-system capable of scaling to several</div><div class='add'>+petabytes. It aggregates various storage bricks over TCP/IP interconnect</div><div class='add'>+into one large parallel network filesystem. GlusterFS is one of the</div><div class='add'>+most sophisticated file systems in terms of features and extensibility.</div><div class='add'>+It borrows a powerful concept called Translators from GNU Hurd kernel.</div><div class='add'>+Much of the code in GlusterFS is in user space and easily manageable.</div><div class='add'>+</div><div class='add'>+This package provides the resource agents which plug glusterd into</div><div class='add'>+Open Cluster Framework (OCF) compliant cluster resource managers,</div><div class='add'>+like Pacemaker.</div><div class='add'>+%endif</div><div class='add'>+</div><div class='add'>+%if ( 0%{!?_without_server:1} )</div><div class='add'>+%package server</div><div class='add'>+Summary:          Clustered file-system server</div><div class='add'>+Requires:         %{name}%{?_isa} = %{version}-%{release}</div><div class='add'>+Requires:         %{name}-cli%{?_isa} = %{version}-%{release}</div><div class='add'>+Requires:         libglusterfs0%{?_isa} = %{version}-%{release}</div><div class='add'>+Requires:         libgfchangelog0%{?_isa} = %{version}-%{release}</div><div class='add'>+%if ( 0%{?fedora} &amp;&amp; 0%{?fedora} &gt;= 30  || ( 0%{?rhel} &amp;&amp; 0%{?rhel} &gt;= 8 ) )</div><div class='add'>+Requires:         glusterfs-selinux &gt;= 0.1.0-2</div><div class='add'>+%endif</div><div class='add'>+# some daemons (like quota) use a fuse-mount, glusterfsd is part of -fuse</div><div class='add'>+Requires:         %{name}-fuse%{?_isa} = %{version}-%{release}</div><div class='add'>+# self-heal daemon, rebalance, nfs-server etc. are actually clients</div><div class='add'>+Requires:         libgfapi0%{?_isa} = %{version}-%{release}</div><div class='add'>+Requires:         %{name}-client-xlators%{?_isa} = %{version}-%{release}</div><div class='add'>+# lvm2 for snapshot, and nfs-utils and rpcbind/portmap for gnfs server</div><div class='add'>+Requires:         lvm2</div><div class='add'>+%if ( 0%{?_with_systemd:1} )</div><div class='add'>+%{?systemd_requires}</div><div class='add'>+%else</div><div class='add'>+Requires(post):   /sbin/chkconfig</div><div class='add'>+Requires(preun):  /sbin/service</div><div class='add'>+Requires(preun):  /sbin/chkconfig</div><div class='add'>+Requires(postun): /sbin/service</div><div class='add'>+%endif</div><div class='add'>+%if (0%{?_with_firewalld:1})</div><div class='add'>+# we install firewalld rules, so we need to have the directory owned</div><div class='add'>+%if ( 0%{!?rhel} )</div><div class='add'>+# not on RHEL because firewalld-filesystem appeared in 7.3</div><div class='add'>+# when EL7 rpm gets weak dependencies we can add a Suggests:</div><div class='add'>+Requires:         firewalld-filesystem</div><div class='add'>+%endif</div><div class='add'>+%endif</div><div class='add'>+%if ( 0%{?fedora} ) || ( 0%{?rhel} &amp;&amp; 0%{?rhel} &gt;= 6 )</div><div class='add'>+Requires:         rpcbind</div><div class='add'>+%else</div><div class='add'>+Requires:         portmap</div><div class='add'>+%endif</div><div class='add'>+%if ( 0%{?rhel} &amp;&amp; 0%{?rhel} &lt;= 6 )</div><div class='add'>+Requires:         python-argparse</div><div class='add'>+%endif</div><div class='add'>+%if ( 0%{?fedora} &amp;&amp; 0%{?fedora} &gt; 27 ) || ( 0%{?rhel} &amp;&amp; 0%{?rhel} &gt; 7 )</div><div class='add'>+Requires:         python%{_pythonver}-pyxattr</div><div class='add'>+%else</div><div class='add'>+Requires:         pyxattr</div><div class='add'>+%endif</div><div class='add'>+%if (0%{?_with_valgrind:1})</div><div class='add'>+Requires:         valgrind</div><div class='add'>+%endif</div><div class='add'>+</div><div class='add'>+%description server</div><div class='add'>+GlusterFS is a distributed file-system capable of scaling to several</div><div class='add'>+petabytes. It aggregates various storage bricks over TCP/IP interconnect</div><div class='add'>+into one large parallel network filesystem. GlusterFS is one of the</div><div class='add'>+most sophisticated file systems in terms of features and extensibility.</div><div class='add'>+It borrows a powerful concept called Translators from GNU Hurd kernel.</div><div class='add'>+Much of the code in GlusterFS is in user space and easily manageable.</div><div class='add'>+</div><div class='add'>+This package provides the glusterfs server daemon.</div><div class='add'>+%endif</div><div class='add'>+</div><div class='add'>+%package thin-arbiter</div><div class='add'>+Summary:          GlusterFS thin-arbiter module</div><div class='add'>+Requires:         %{name}%{?_isa} = %{version}-%{release}</div><div class='add'>+Requires:         %{name}-server%{?_isa} = %{version}-%{release}</div><div class='add'>+</div><div class='add'>+%description thin-arbiter</div><div class='add'>+This package provides a tie-breaker functionality to GlusterFS</div><div class='add'>+replicate volume. It includes translators required to provide the</div><div class='add'>+functionality, and also few other scripts required for getting the setup done.</div><div class='add'>+</div><div class='add'>+This package provides the glusterfs thin-arbiter translator.</div><div class='add'>+</div><div class='add'>+%package client-xlators</div><div class='add'>+Summary:          GlusterFS client-side translators</div><div class='add'>+</div><div class='add'>+%description client-xlators</div><div class='add'>+GlusterFS is a distributed file-system capable of scaling to several</div><div class='add'>+petabytes. It aggregates various storage bricks over TCP/IP interconnect</div><div class='add'>+into one large parallel network filesystem. GlusterFS is one of the</div><div class='add'>+most sophisticated file systems in terms of features and extensibility.</div><div class='add'>+It borrows a powerful concept called Translators from GNU Hurd kernel.</div><div class='add'>+Much of the code in GlusterFS is in user space and easily manageable.</div><div class='add'>+</div><div class='add'>+This package provides the translators needed on any GlusterFS client.</div><div class='add'>+</div><div class='add'>+%if ( 0%{!?_without_events:1} )</div><div class='add'>+%package events</div><div class='add'>+Summary:          GlusterFS Events</div><div class='add'>+Requires:         %{name}-server%{?_isa} = %{version}-%{release}</div><div class='add'>+Requires:         python%{_pythonver} python%{_pythonver}-prettytable</div><div class='add'>+Requires:         python%{_pythonver}-gluster = %{version}-%{release}</div><div class='add'>+%if ( 0%{?rhel} &amp;&amp; 0%{?rhel} &lt; 8 )</div><div class='add'>+Requires:         python-requests</div><div class='add'>+%else</div><div class='add'>+Requires:         python%{_pythonver}-requests</div><div class='add'>+%endif</div><div class='add'>+%if ( 0%{?rhel} &amp;&amp; 0%{?rhel} &lt; 7 )</div><div class='add'>+Requires:         python-argparse</div><div class='add'>+%endif</div><div class='add'>+%if ( 0%{?_with_systemd:1} )</div><div class='add'>+%{?systemd_requires}</div><div class='add'>+%endif</div><div class='add'>+</div><div class='add'>+%description events</div><div class='add'>+GlusterFS Events</div><div class='add'>+</div><div class='add'>+%endif</div><div class='ctx'> </div><div class='ctx'> %prep</div><div class='del'>-%setup -q -n %{name}-%{version}</div><div class='add'>+%setup -q -n %{name}-%{version}%{?prereltag}</div><div class='add'>+%if ( ! %{_usepython3} )</div><div class='add'>+echo "fixing python shebangs..."</div><div class='add'>+for f in api events extras geo-replication libglusterfs tools xlators; do</div><div class='add'>+find $f -type f -exec sed -i 's|/usr/bin/python3|/usr/bin/python2|' {} \;</div><div class='add'>+done</div><div class='add'>+%endif</div><div class='ctx'> </div><div class='ctx'> %build</div><div class='ctx'> </div><div class='del'>-%configure %{?_without_epoll} %{?_with_fusermount}</div><div class='add'>+# RHEL6 and earlier need to manually replace config.guess and config.sub</div><div class='add'>+%if ( 0%{?rhel} &amp;&amp; 0%{?rhel} &lt;= 6 )</div><div class='add'>+./autogen.sh</div><div class='add'>+%endif</div><div class='add'>+</div><div class='add'>+%configure \</div><div class='add'>+        %{?_with_asan} \</div><div class='add'>+        %{?_with_cmocka} \</div><div class='add'>+        %{?_with_debug} \</div><div class='add'>+        %{?_with_firewalld} \</div><div class='add'>+        %{?_with_gnfs} \</div><div class='add'>+        %{?_with_tmpfilesdir} \</div><div class='add'>+        %{?_with_tsan} \</div><div class='add'>+        %{?_with_valgrind} \</div><div class='add'>+        %{?_without_epoll} \</div><div class='add'>+        %{?_without_events} \</div><div class='add'>+        %{?_without_fusermount} \</div><div class='add'>+        %{?_without_georeplication} \</div><div class='add'>+        %{?_without_ocf} \</div><div class='add'>+        %{?_without_server} \</div><div class='add'>+        %{?_without_syslog} \</div><div class='add'>+        %{?_with_ipv6default} \</div><div class='add'>+        %{?_without_libtirpc}</div><div class='add'>+</div><div class='add'>+# fix hardening and remove rpath in shlibs</div><div class='add'>+%if ( 0%{?fedora} &amp;&amp; 0%{?fedora} &gt; 17 ) || ( 0%{?rhel} &amp;&amp; 0%{?rhel} &gt; 6 )</div><div class='add'>+sed -i 's| \\\$compiler_flags |&amp;\\\$LDFLAGS |' libtool</div><div class='add'>+%endif</div><div class='add'>+sed -i 's|^hardcode_libdir_flag_spec=.*|hardcode_libdir_flag_spec=""|' libtool</div><div class='add'>+sed -i 's|^runpath_var=LD_RUN_PATH|runpath_var=DIE_RPATH_DIE|' libtool</div><div class='ctx'> </div><div class='del'>-# Remove rpath</div><div class='del'>-sed -i 's|^hardcode_libdir_flag_spec=.*|hardcode_libdir_flag_spec=""|g' libtool</div><div class='del'>-sed -i 's|^runpath_var=LD_RUN_PATH|runpath_var=DIE_RPATH_DIE|g' libtool</div><div class='del'>-%{__make} %{?_smp_mflags}</div><div class='add'>+make %{?_smp_mflags}</div><div class='ctx'> </div><div class='add'>+%check</div><div class='add'>+make check</div><div class='ctx'> </div><div class='ctx'> %install</div><div class='del'>-%{__rm} -rf %{buildroot} </div><div class='del'>-%{__make} install DESTDIR=%{buildroot}</div><div class='del'>-%{__mkdir_p} %{buildroot}%{_includedir}/glusterfs</div><div class='del'>-%{__mkdir_p} %{buildroot}/var/log/glusterfs</div><div class='del'>-%{__install} -p -m 0644 libglusterfs/src/*.h \</div><div class='del'>-    %{buildroot}%{_includedir}/glusterfs/</div><div class='add'>+rm -rf %{buildroot}</div><div class='add'>+make install DESTDIR=%{buildroot}</div><div class='add'>+%if ( 0%{!?_without_server:1} )</div><div class='add'>+%if ( 0%{_for_fedora_koji_builds} )</div><div class='add'>+install -D -p -m 0644 %{SOURCE1} \</div><div class='add'>+    %{buildroot}%{_sysconfdir}/sysconfig/glusterd</div><div class='add'>+install -D -p -m 0644 %{SOURCE2} \</div><div class='add'>+    %{buildroot}%{_sysconfdir}/sysconfig/glusterfsd</div><div class='add'>+%else</div><div class='add'>+install -D -p -m 0644 extras/glusterd-sysconfig \</div><div class='add'>+    %{buildroot}%{_sysconfdir}/sysconfig/glusterd</div><div class='add'>+%endif</div><div class='add'>+%endif</div><div class='add'>+</div><div class='add'>+mkdir -p %{buildroot}%{_localstatedir}/log/glusterd</div><div class='add'>+mkdir -p %{buildroot}%{_localstatedir}/log/glusterfs</div><div class='add'>+mkdir -p %{buildroot}%{_localstatedir}/log/glusterfsd</div><div class='add'>+mkdir -p %{buildroot}%{_rundir}/gluster</div><div class='ctx'> </div><div class='ctx'> # Remove unwanted files from all the shared libraries</div><div class='del'>-find %{buildroot}%{_libdir} -name '*.la' | xargs rm -f</div><div class='del'>-find %{buildroot}%{_libdir} -name '*.a' | xargs rm -f</div><div class='add'>+find %{buildroot}%{_libdir} -name '*.a' -delete</div><div class='add'>+find %{buildroot}%{_libdir} -name '*.la' -delete</div><div class='add'>+</div><div class='add'>+# Remove installed docs, the ones we want are included by %%doc, in</div><div class='add'>+# /usr/share/doc/glusterfs or /usr/share/doc/glusterfs-x.y.z depending</div><div class='add'>+# on the distribution</div><div class='add'>+%if ( 0%{?fedora} &amp;&amp; 0%{?fedora} &gt; 19 ) || ( 0%{?rhel} &amp;&amp; 0%{?rhel} &gt; 6 )</div><div class='add'>+rm -rf %{buildroot}%{_pkgdocdir}/*</div><div class='add'>+%else</div><div class='add'>+rm -rf %{buildroot}%{_defaultdocdir}/%{name}</div><div class='add'>+mkdir -p %{buildroot}%{_pkgdocdir}</div><div class='add'>+%endif</div><div class='add'>+head -50 ChangeLog &gt; ChangeLog.head &amp;&amp; mv ChangeLog.head ChangeLog</div><div class='add'>+cat &lt;&lt; EOM &gt;&gt; ChangeLog</div><div class='add'>+</div><div class='add'>+More commit messages for this ChangeLog can be found at</div><div class='add'>+https://forge.gluster.org/glusterfs-core/glusterfs/commits/v%{version}%{?prereltag}</div><div class='add'>+EOM</div><div class='add'>+</div><div class='add'>+# Remove benchmarking and other unpackaged files</div><div class='add'>+# make install always puts these in %%{_defaultdocdir}/%%{name} so don't</div><div class='add'>+# use %%{_pkgdocdir}; that will be wrong on later Fedora distributions</div><div class='add'>+rm -rf %{buildroot}%{_defaultdocdir}/%{name}/benchmarking</div><div class='add'>+rm -f %{buildroot}%{_defaultdocdir}/%{name}/glusterfs-mode.el</div><div class='add'>+rm -f %{buildroot}%{_defaultdocdir}/%{name}/glusterfs.vim</div><div class='add'>+</div><div class='add'>+%if ( 0%{!?_without_server:1} )</div><div class='add'>+# Create working directory</div><div class='add'>+mkdir -p %{buildroot}%{_sharedstatedir}/glusterd</div><div class='add'>+</div><div class='add'>+# Update configuration file to /var/lib working directory</div><div class='add'>+sed -i 's|option working-directory /etc/glusterd|option working-directory %{_sharedstatedir}/glusterd|g' \</div><div class='add'>+    %{buildroot}%{_sysconfdir}/glusterfs/glusterd.vol</div><div class='add'>+%endif</div><div class='add'>+</div><div class='add'>+# Install glusterfsd .service or init.d file</div><div class='add'>+%if ( 0%{!?_without_server:1} )</div><div class='add'>+%if ( 0%{_for_fedora_koji_builds} )</div><div class='add'>+%service_install glusterfsd %{glusterfsd_svcfile}</div><div class='add'>+%endif</div><div class='add'>+%endif</div><div class='add'>+</div><div class='add'>+install -D -p -m 0644 extras/glusterfs-logrotate \</div><div class='add'>+    %{buildroot}%{_sysconfdir}/logrotate.d/glusterfs</div><div class='add'>+</div><div class='add'>+# ganesha ghosts</div><div class='add'>+%if ( 0%{!?_without_server:1} )</div><div class='add'>+mkdir -p %{buildroot}%{_sysconfdir}/ganesha</div><div class='add'>+touch %{buildroot}%{_sysconfdir}/ganesha/ganesha-ha.conf</div><div class='add'>+mkdir -p %{buildroot}%{_localstatedir}/run/gluster/shared_storage/nfs-ganesha/</div><div class='add'>+touch %{buildroot}%{_localstatedir}/run/gluster/shared_storage/nfs-ganesha/ganesha.conf</div><div class='add'>+touch %{buildroot}%{_localstatedir}/run/gluster/shared_storage/nfs-ganesha/ganesha-ha.conf</div><div class='add'>+%endif</div><div class='add'>+</div><div class='add'>+%if ( 0%{!?_without_georeplication:1} )</div><div class='add'>+# geo-rep ghosts</div><div class='add'>+mkdir -p %{buildroot}%{_sharedstatedir}/glusterd/geo-replication</div><div class='add'>+touch %{buildroot}%{_sharedstatedir}/glusterd/geo-replication/gsyncd_template.conf</div><div class='add'>+install -D -p -m 0644 extras/glusterfs-georep-logrotate \</div><div class='add'>+    %{buildroot}%{_sysconfdir}/logrotate.d/glusterfs-georep</div><div class='add'>+%endif</div><div class='add'>+</div><div class='add'>+%if ( 0%{!?_without_server:1} )</div><div class='add'>+# the rest of the ghosts</div><div class='add'>+touch %{buildroot}%{_sharedstatedir}/glusterd/glusterd.info</div><div class='add'>+touch %{buildroot}%{_sharedstatedir}/glusterd/options</div><div class='add'>+subdirs=(add-brick create copy-file delete gsync-create remove-brick reset set start stop)</div><div class='add'>+for dir in ${subdirs[@]}; do</div><div class='add'>+    mkdir -p %{buildroot}%{_sharedstatedir}/glusterd/hooks/1/"$dir"/{pre,post}</div><div class='add'>+done</div><div class='add'>+mkdir -p %{buildroot}%{_sharedstatedir}/glusterd/glustershd</div><div class='add'>+mkdir -p %{buildroot}%{_sharedstatedir}/glusterd/peers</div><div class='add'>+mkdir -p %{buildroot}%{_sharedstatedir}/glusterd/vols</div><div class='add'>+mkdir -p %{buildroot}%{_sharedstatedir}/glusterd/nfs/run</div><div class='add'>+mkdir -p %{buildroot}%{_sharedstatedir}/glusterd/bitd</div><div class='add'>+mkdir -p %{buildroot}%{_sharedstatedir}/glusterd/quotad</div><div class='add'>+mkdir -p %{buildroot}%{_sharedstatedir}/glusterd/scrub</div><div class='add'>+mkdir -p %{buildroot}%{_sharedstatedir}/glusterd/snaps</div><div class='add'>+mkdir -p %{buildroot}%{_sharedstatedir}/glusterd/ss_brick</div><div class='add'>+touch %{buildroot}%{_sharedstatedir}/glusterd/nfs/nfs-server.vol</div><div class='add'>+touch %{buildroot}%{_sharedstatedir}/glusterd/nfs/run/nfs.pid</div><div class='add'>+%endif</div><div class='add'>+</div><div class='add'>+find ./tests ./run-tests.sh -type f | cpio -pd %{buildroot}%{_prefix}/share/glusterfs</div><div class='add'>+</div><div class='add'>+## Install bash completion for cli</div><div class='add'>+install -p -m 0744 -D extras/command-completion/gluster.bash \</div><div class='add'>+    %{buildroot}%{_sysconfdir}/bash_completion.d/gluster</div><div class='ctx'> </div><div class='ctx'> %clean</div><div class='del'>-%{__rm} -rf %{buildroot}</div><div class='add'>+rm -rf %{buildroot}</div><div class='add'>+</div><div class='add'>+##-----------------------------------------------------------------------------</div><div class='add'>+## All %%post should be placed here and keep them sorted</div><div class='add'>+##</div><div class='add'>+%post</div><div class='add'>+/sbin/ldconfig</div><div class='add'>+%if ( 0%{!?_without_syslog:1} )</div><div class='add'>+%if ( 0%{?fedora} ) || ( 0%{?rhel} &amp;&amp; 0%{?rhel} &gt;= 6 )</div><div class='add'>+%systemd_postun_with_restart rsyslog</div><div class='add'>+%endif</div><div class='add'>+%endif</div><div class='add'>+exit 0</div><div class='add'>+</div><div class='add'>+%if ( 0%{!?_without_events:1} )</div><div class='add'>+%post events</div><div class='add'>+%systemd_post glustereventsd</div><div class='add'>+%endif</div><div class='add'>+</div><div class='add'>+%if ( 0%{!?_without_server:1} )</div><div class='add'>+%if ( 0%{?fedora} &amp;&amp; 0%{?fedora} &gt; 25 || ( 0%{?rhel} &amp;&amp; 0%{?rhel} &gt; 6 ) )</div><div class='add'>+%post ganesha</div><div class='add'>+semanage boolean -m ganesha_use_fusefs --on</div><div class='add'>+exit 0</div><div class='add'>+%endif</div><div class='add'>+%endif</div><div class='add'>+</div><div class='add'>+%if ( 0%{!?_without_georeplication:1} )</div><div class='add'>+%post geo-replication</div><div class='add'>+%if ( 0%{?rhel} &amp;&amp; 0%{?rhel} &gt;= 8 )</div><div class='add'>+%selinux_set_booleans %{selinuxbooleans}</div><div class='add'>+%endif</div><div class='add'>+if [ $1 -ge 1 ]; then</div><div class='add'>+    %systemd_postun_with_restart glusterd</div><div class='add'>+fi</div><div class='add'>+exit 0</div><div class='add'>+%endif</div><div class='add'>+</div><div class='add'>+%post -n libglusterfs0</div><div class='add'>+/sbin/ldconfig</div><div class='add'>+</div><div class='add'>+%post -n libgfapi0</div><div class='add'>+/sbin/ldconfig</div><div class='add'>+</div><div class='add'>+%post -n libgfchangelog0</div><div class='add'>+/sbin/ldconfig</div><div class='ctx'> </div><div class='del'>-%post core</div><div class='del'>-/sbin/ldconfig -n %{_libdir}</div><div class='del'>-/sbin/chkconfig --add glusterfsd</div><div class='add'>+%post -n libgfrpc0</div><div class='add'>+/sbin/ldconfig</div><div class='ctx'> </div><div class='del'>-%postun core</div><div class='del'>-/sbin/ldconfig -n %{_libdir}</div><div class='add'>+%post -n libgfxdr0</div><div class='add'>+/sbin/ldconfig</div><div class='add'>+</div><div class='add'>+%post -n libglusterd0</div><div class='add'>+/sbin/ldconfig</div><div class='add'>+</div><div class='add'>+%if ( 0%{!?_without_server:1} )</div><div class='add'>+%post server</div><div class='add'>+# Legacy server</div><div class='add'>+%systemd_post glusterd</div><div class='add'>+%if ( 0%{_for_fedora_koji_builds} )</div><div class='add'>+%systemd_post glusterfsd</div><div class='add'>+%endif</div><div class='add'>+# ".cmd_log_history" is renamed to "cmd_history.log" in GlusterFS-3.7 .</div><div class='add'>+# While upgrading glusterfs-server package form GlusterFS version &lt;= 3.6 to</div><div class='add'>+# GlusterFS version 3.7, ".cmd_log_history" should be renamed to</div><div class='add'>+# "cmd_history.log" to retain cli command history contents.</div><div class='add'>+if [ -f %{_localstatedir}/log/glusterfs/.cmd_log_history ]; then</div><div class='add'>+    mv %{_localstatedir}/log/glusterfs/.cmd_log_history \</div><div class='add'>+       %{_localstatedir}/log/glusterfs/cmd_history.log</div><div class='add'>+fi</div><div class='add'>+</div><div class='add'>+# Genuine Fedora (and EPEL) builds never put gluster files in /etc; if</div><div class='add'>+# there are any files in /etc from a prior gluster.org install, move them</div><div class='add'>+# to /var/lib. (N.B. Starting with 3.3.0 all gluster files are in /var/lib</div><div class='add'>+# in gluster.org RPMs.) Be careful to copy them on the off chance that</div><div class='add'>+# /etc and /var/lib are on separate file systems</div><div class='add'>+if [ -d /etc/glusterd -a ! -h %{_sharedstatedir}/glusterd ]; then</div><div class='add'>+    mkdir -p %{_sharedstatedir}/glusterd</div><div class='add'>+    cp -a /etc/glusterd %{_sharedstatedir}/glusterd</div><div class='add'>+    rm -rf /etc/glusterd</div><div class='add'>+    ln -sf %{_sharedstatedir}/glusterd /etc/glusterd</div><div class='add'>+fi</div><div class='add'>+</div><div class='add'>+# Rename old volfiles in an RPM-standard way.  These aren't actually</div><div class='add'>+# considered package config files, so %%config doesn't work for them.</div><div class='add'>+if [ -d %{_sharedstatedir}/glusterd/vols ]; then</div><div class='add'>+    for file in $(find %{_sharedstatedir}/glusterd/vols -name '*.vol'); do</div><div class='add'>+        newfile=${file}.rpmsave</div><div class='add'>+        echo "warning: ${file} saved as ${newfile}"</div><div class='add'>+        cp ${file} ${newfile}</div><div class='add'>+    done</div><div class='add'>+fi</div><div class='ctx'> </div><div class='del'>-%preun core</div><div class='del'>-if [ $1 -eq 0 ]; then </div><div class='del'>-    /sbin/chkconfig --del glusterfsd</div><div class='add'>+# add marker translator</div><div class='add'>+# but first make certain that there are no old libs around to bite us</div><div class='add'>+# BZ 834847</div><div class='add'>+if [ -e /etc/ld.so.conf.d/glusterfs.conf ]; then</div><div class='add'>+    rm -f /etc/ld.so.conf.d/glusterfs.conf</div><div class='add'>+    /sbin/ldconfig</div><div class='ctx'> fi</div><div class='ctx'> </div><div class='del'>-%files core</div><div class='del'>-%defattr(-,root,root)</div><div class='del'>-%doc AUTHORS ChangeLog COPYING.GPL COPYING.AGPL INSTALL NEWS README</div><div class='del'>-%doc /usr/share/doc/glusterfs</div><div class='del'>-%if 0%{?_with_fusermount:1}</div><div class='del'>-%{_bindir}/fusermount-glusterfs </div><div class='del'>-%endif</div><div class='del'>-%{_datadir}/glusterfs</div><div class='del'>-%{_bindir}/glusterfs-volgen</div><div class='del'>-%{_libdir}/glusterfs</div><div class='del'>-%{_libdir}/*.so.*</div><div class='del'>-%{_sbindir}/glusterfs*</div><div class='del'>-%{_bindir}/glusterfs-defrag</div><div class='add'>+%if (0%{?_with_firewalld:1})</div><div class='add'>+    %firewalld_reload</div><div class='add'>+%endif</div><div class='add'>+</div><div class='add'>+pidof -c -o %PPID -x glusterd &amp;&gt; /dev/null</div><div class='add'>+if [ $? -eq 0 ]; then</div><div class='add'>+    kill -9 `pgrep -f gsyncd.py` &amp;&gt; /dev/null</div><div class='add'>+</div><div class='add'>+    killall --wait glusterd &amp;&gt; /dev/null</div><div class='add'>+    glusterd --xlator-option *.upgrade=on -N</div><div class='add'>+</div><div class='add'>+    #Cleaning leftover glusterd socket file which is created by glusterd in</div><div class='add'>+    #rpm_script_t context.</div><div class='add'>+    rm -f %{_rundir}/glusterd.socket</div><div class='add'>+</div><div class='add'>+    # glusterd _was_ running, we killed it, it exited after *.upgrade=on,</div><div class='add'>+    # so start it again</div><div class='add'>+    %service_start glusterd</div><div class='add'>+else</div><div class='add'>+    glusterd --xlator-option *.upgrade=on -N</div><div class='add'>+</div><div class='add'>+    #Cleaning leftover glusterd socket file which is created by glusterd in</div><div class='add'>+    #rpm_script_t context.</div><div class='add'>+    rm -f %{_rundir}/glusterd.socket</div><div class='add'>+fi</div><div class='add'>+exit 0</div><div class='add'>+%endif</div><div class='add'>+</div><div class='add'>+##-----------------------------------------------------------------------------</div><div class='add'>+## All %%pre should be placed here and keep them sorted</div><div class='add'>+##</div><div class='add'>+%pre</div><div class='add'>+getent group gluster &gt; /dev/null || groupadd -r gluster</div><div class='add'>+getent passwd gluster &gt; /dev/null || useradd -r -g gluster -d %{_rundir}/gluster -s /sbin/nologin -c "GlusterFS daemons" gluster</div><div class='add'>+exit 0</div><div class='add'>+</div><div class='add'>+##-----------------------------------------------------------------------------</div><div class='add'>+## All %%preun should be placed here and keep them sorted</div><div class='add'>+##</div><div class='add'>+%if ( 0%{!?_without_events:1} )</div><div class='add'>+%preun events</div><div class='add'>+if [ $1 -eq 0 ]; then</div><div class='add'>+    if [ -f %glustereventsd_svcfile ]; then</div><div class='add'>+        %service_stop glustereventsd</div><div class='add'>+        %systemd_preun glustereventsd</div><div class='add'>+    fi</div><div class='add'>+fi</div><div class='add'>+exit 0</div><div class='add'>+%endif</div><div class='add'>+</div><div class='add'>+%if ( 0%{!?_without_server:1} )</div><div class='add'>+%preun server</div><div class='add'>+if [ $1 -eq 0 ]; then</div><div class='add'>+    if [ -f %glusterfsd_svcfile ]; then</div><div class='add'>+        %service_stop glusterfsd</div><div class='add'>+    fi</div><div class='add'>+    %service_stop glusterd</div><div class='add'>+    if [ -f %glusterfsd_svcfile ]; then</div><div class='add'>+        %systemd_preun glusterfsd</div><div class='add'>+    fi</div><div class='add'>+    %systemd_preun glusterd</div><div class='add'>+fi</div><div class='add'>+if [ $1 -ge 1 ]; then</div><div class='add'>+    if [ -f %glusterfsd_svcfile ]; then</div><div class='add'>+        %systemd_postun_with_restart glusterfsd</div><div class='add'>+    fi</div><div class='add'>+    %systemd_postun_with_restart glusterd</div><div class='add'>+fi</div><div class='add'>+exit 0</div><div class='add'>+%endif</div><div class='add'>+</div><div class='add'>+%preun thin-arbiter</div><div class='add'>+if [ $1 -eq 0 ]; then</div><div class='add'>+    if [ -f %glusterta_svcfile ]; then</div><div class='add'>+        %service_stop gluster-ta-volume</div><div class='add'>+        %systemd_preun gluster-ta-volume</div><div class='add'>+    fi</div><div class='add'>+fi</div><div class='add'>+</div><div class='add'>+##-----------------------------------------------------------------------------</div><div class='add'>+## All %%postun should be placed here and keep them sorted</div><div class='add'>+##</div><div class='add'>+%postun</div><div class='add'>+%if ( 0%{!?_without_syslog:1} )</div><div class='add'>+%if ( 0%{?fedora} ) || ( 0%{?rhel} &amp;&amp; 0%{?rhel} &gt;= 6 )</div><div class='add'>+%systemd_postun_with_restart rsyslog</div><div class='add'>+%endif</div><div class='add'>+%endif</div><div class='add'>+</div><div class='add'>+%if ( 0%{!?_without_server:1} )</div><div class='add'>+%postun server</div><div class='add'>+%if (0%{?_with_firewalld:1})</div><div class='add'>+    %firewalld_reload</div><div class='add'>+%endif</div><div class='add'>+exit 0</div><div class='add'>+%endif</div><div class='add'>+</div><div class='add'>+%if ( 0%{!?_without_server:1} )</div><div class='add'>+%if ( 0%{?fedora} &amp;&amp; 0%{?fedora} &gt; 25  || ( 0%{?rhel} &amp;&amp; 0%{?rhel} &gt; 6 ) )</div><div class='add'>+%postun ganesha</div><div class='add'>+semanage boolean -m ganesha_use_fusefs --off</div><div class='add'>+exit 0</div><div class='add'>+%endif</div><div class='add'>+%endif</div><div class='add'>+</div><div class='add'>+##-----------------------------------------------------------------------------</div><div class='add'>+## All %%trigger should be placed here and keep them sorted</div><div class='add'>+##</div><div class='add'>+%if ( 0%{!?_without_server:1} )</div><div class='add'>+%if ( 0%{?fedora} &amp;&amp; 0%{?fedora} &gt; 25  || ( 0%{?rhel} &amp;&amp; 0%{?rhel} &gt; 6 ) )</div><div class='add'>+%trigger ganesha -- selinux-policy-targeted</div><div class='add'>+semanage boolean -m ganesha_use_fusefs --on</div><div class='add'>+exit 0</div><div class='add'>+%endif</div><div class='add'>+%endif</div><div class='add'>+</div><div class='add'>+##-----------------------------------------------------------------------------</div><div class='add'>+## All %%triggerun should be placed here and keep them sorted</div><div class='add'>+##</div><div class='add'>+%if ( 0%{!?_without_server:1} )</div><div class='add'>+%if ( 0%{?fedora} &amp;&amp; 0%{?fedora} &gt; 25  || ( 0%{?rhel} &amp;&amp; 0%{?rhel} &gt; 6 ) )</div><div class='add'>+%triggerun ganesha -- selinux-policy-targeted</div><div class='add'>+semanage boolean -m ganesha_use_fusefs --off</div><div class='add'>+exit 0</div><div class='add'>+%endif</div><div class='add'>+%endif</div><div class='add'>+</div><div class='add'>+##-----------------------------------------------------------------------------</div><div class='add'>+## All %%files should be placed here and keep them grouped</div><div class='add'>+##</div><div class='add'>+%files</div><div class='add'>+%doc ChangeLog COPYING-GPLV2 COPYING-LGPLV3 INSTALL README.md THANKS COMMITMENT</div><div class='add'>+%{_mandir}/man8/*gluster*.8*</div><div class='add'>+%if ( 0%{!?_without_server:1} )</div><div class='add'>+%exclude %{_mandir}/man8/gluster.8*</div><div class='add'>+%endif</div><div class='add'>+%dir %{_localstatedir}/log/glusterfs</div><div class='add'>+%if 0%{?!_without_server:1}</div><div class='add'>+%dir %{_datadir}/glusterfs</div><div class='add'>+%dir %{_datadir}/glusterfs/scripts</div><div class='add'>+     %{_datadir}/glusterfs/scripts/post-upgrade-script-for-quota.sh</div><div class='add'>+     %{_datadir}/glusterfs/scripts/pre-upgrade-script-for-quota.sh</div><div class='add'>+%endif</div><div class='add'>+# xlators that are needed on the client- and on the server-side</div><div class='add'>+%dir %{_libdir}/glusterfs</div><div class='add'>+%dir %{_libdir}/glusterfs/%{version}%{?prereltag}</div><div class='add'>+%dir %{_libdir}/glusterfs/%{version}%{?prereltag}/auth</div><div class='add'>+     %{_libdir}/glusterfs/%{version}%{?prereltag}/auth/addr.so</div><div class='add'>+     %{_libdir}/glusterfs/%{version}%{?prereltag}/auth/login.so</div><div class='add'>+%dir %{_libdir}/glusterfs/%{version}%{?prereltag}/rpc-transport</div><div class='add'>+     %{_libdir}/glusterfs/%{version}%{?prereltag}/rpc-transport/socket.so</div><div class='add'>+%dir %{_libdir}/glusterfs/%{version}%{?prereltag}/xlator</div><div class='add'>+%dir %{_libdir}/glusterfs/%{version}%{?prereltag}/xlator/debug</div><div class='add'>+     %{_libdir}/glusterfs/%{version}%{?prereltag}/xlator/debug/error-gen.so</div><div class='add'>+     %{_libdir}/glusterfs/%{version}%{?prereltag}/xlator/debug/delay-gen.so</div><div class='add'>+     %{_libdir}/glusterfs/%{version}%{?prereltag}/xlator/debug/io-stats.so</div><div class='add'>+     %{_libdir}/glusterfs/%{version}%{?prereltag}/xlator/debug/sink.so</div><div class='add'>+     %{_libdir}/glusterfs/%{version}%{?prereltag}/xlator/debug/trace.so</div><div class='add'>+%dir %{_libdir}/glusterfs/%{version}%{?prereltag}/xlator/features</div><div class='add'>+     %{_libdir}/glusterfs/%{version}%{?prereltag}/xlator/features/access-control.so</div><div class='add'>+     %{_libdir}/glusterfs/%{version}%{?prereltag}/xlator/features/barrier.so</div><div class='add'>+     %{_libdir}/glusterfs/%{version}%{?prereltag}/xlator/features/cdc.so</div><div class='add'>+     %{_libdir}/glusterfs/%{version}%{?prereltag}/xlator/features/changelog.so</div><div class='add'>+     %{_libdir}/glusterfs/%{version}%{?prereltag}/xlator/features/utime.so</div><div class='add'>+     %{_libdir}/glusterfs/%{version}%{?prereltag}/xlator/features/gfid-access.so</div><div class='add'>+     %{_libdir}/glusterfs/%{version}%{?prereltag}/xlator/features/namespace.so</div><div class='add'>+     %{_libdir}/glusterfs/%{version}%{?prereltag}/xlator/features/read-only.so</div><div class='add'>+     %{_libdir}/glusterfs/%{version}%{?prereltag}/xlator/features/shard.so</div><div class='add'>+     %{_libdir}/glusterfs/%{version}%{?prereltag}/xlator/features/snapview-client.so</div><div class='add'>+     %{_libdir}/glusterfs/%{version}%{?prereltag}/xlator/features/worm.so</div><div class='add'>+     %{_libdir}/glusterfs/%{version}%{?prereltag}/xlator/features/cloudsync.so</div><div class='add'>+     %{_libdir}/glusterfs/%{version}%{?prereltag}/xlator/meta.so</div><div class='add'>+%dir %{_libdir}/glusterfs/%{version}%{?prereltag}/xlator/performance</div><div class='add'>+     %{_libdir}/glusterfs/%{version}%{?prereltag}/xlator/performance/io-cache.so</div><div class='add'>+     %{_libdir}/glusterfs/%{version}%{?prereltag}/xlator/performance/io-threads.so</div><div class='add'>+     %{_libdir}/glusterfs/%{version}%{?prereltag}/xlator/performance/md-cache.so</div><div class='add'>+     %{_libdir}/glusterfs/%{version}%{?prereltag}/xlator/performance/open-behind.so</div><div class='add'>+     %{_libdir}/glusterfs/%{version}%{?prereltag}/xlator/performance/quick-read.so</div><div class='add'>+     %{_libdir}/glusterfs/%{version}%{?prereltag}/xlator/performance/read-ahead.so</div><div class='add'>+     %{_libdir}/glusterfs/%{version}%{?prereltag}/xlator/performance/readdir-ahead.so</div><div class='add'>+     %{_libdir}/glusterfs/%{version}%{?prereltag}/xlator/performance/stat-prefetch.so</div><div class='add'>+     %{_libdir}/glusterfs/%{version}%{?prereltag}/xlator/performance/write-behind.so</div><div class='add'>+     %{_libdir}/glusterfs/%{version}%{?prereltag}/xlator/performance/nl-cache.so</div><div class='add'>+%dir %{_libdir}/glusterfs/%{version}%{?prereltag}/xlator/system</div><div class='add'>+     %{_libdir}/glusterfs/%{version}%{?prereltag}/xlator/system/posix-acl.so</div><div class='add'>+%dir %attr(0775,gluster,gluster) %{_rundir}/gluster</div><div class='add'>+%if 0%{?_tmpfilesdir:1} &amp;&amp; 0%{!?_without_server:1}</div><div class='add'>+%{_tmpfilesdir}/gluster.conf</div><div class='add'>+%endif</div><div class='add'>+</div><div class='add'>+%if ( 0%{?_without_server:1} )</div><div class='add'>+#exclude ganesha related files</div><div class='add'>+%exclude %{_sysconfdir}/ganesha/ganesha-ha.conf.sample</div><div class='add'>+%exclude %{_libexecdir}/ganesha/*</div><div class='add'>+%exclude %{_prefix}/lib/ocf/resource.d/heartbeat/*</div><div class='add'>+%endif</div><div class='add'>+</div><div class='add'>+%files cli</div><div class='ctx'> %{_sbindir}/gluster</div><div class='del'>-%{_sbindir}/glusterd</div><div class='del'>-%{_mandir}/man8/*glusterfs.8*</div><div class='del'>-%{_mandir}/man8/*gluster.8*</div><div class='del'>-%{_mandir}/man8/*glusterd.8*</div><div class='del'>-%{_mandir}/man8/*glusterfs-volgen.8*</div><div class='del'>-%dir /var/log/glusterfs</div><div class='del'>-%exclude %{_libdir}/glusterfs/%{version}/rpc-transport/rdma*</div><div class='del'>-%exclude %{_libdir}/glusterfs/%{version}/xlator/mount/fuse*</div><div class='del'>-%config %{_sysconfdir}/glusterfs</div><div class='del'>-%{_sysconfdir}/init.d/glusterfsd</div><div class='del'>-%{_includedir}/glusterfs</div><div class='del'>-%exclude %{_includedir}/glusterfs/y.tab.h</div><div class='del'>-%{_libdir}/*.so</div><div class='del'>-/sbin/mount.glusterfs</div><div class='add'>+%{_mandir}/man8/gluster.8*</div><div class='add'>+%{_sysconfdir}/bash_completion.d/gluster</div><div class='add'>+</div><div class='add'>+%files cloudsync-plugins</div><div class='add'>+%dir %{_libdir}/glusterfs/%{version}%{?prereltag}/cloudsync-plugins</div><div class='add'>+     %{_libdir}/glusterfs/%{version}%{?prereltag}/cloudsync-plugins/cloudsyncs3.so</div><div class='add'>+     %{_libdir}/glusterfs/%{version}%{?prereltag}/cloudsync-plugins/cloudsynccvlt.so</div><div class='add'>+</div><div class='add'>+%files -n libglusterfs-devel</div><div class='add'>+%dir %{_includedir}/glusterfs</div><div class='add'>+     %{_includedir}/glusterfs/*.h</div><div class='add'>+     %{_includedir}/glusterfs/server/*.h</div><div class='add'>+%{_libdir}/libglusterfs.so</div><div class='add'>+</div><div class='add'>+%files -n libgfapi-devel</div><div class='add'>+%dir %{_includedir}/glusterfs/api</div><div class='add'>+     %{_includedir}/glusterfs/api/*.h</div><div class='add'>+%{_libdir}/libgfapi.so</div><div class='add'>+%{_libdir}/pkgconfig/glusterfs-api.pc</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+%files -n libgfchangelog-devel</div><div class='add'>+%dir %{_includedir}/glusterfs/gfchangelog</div><div class='add'>+     %{_includedir}/glusterfs/gfchangelog/*.h</div><div class='add'>+%{_libdir}/libgfchangelog.so</div><div class='add'>+%{_libdir}/pkgconfig/libgfchangelog.pc</div><div class='ctx'> </div><div class='del'>-%files rdma</div><div class='del'>-%defattr(-,root,root)</div><div class='del'>-%{_libdir}/glusterfs/%{version}/rpc-transport/rdma*</div><div class='add'>+%files -n libgfrpc-devel</div><div class='add'>+%dir %{_includedir}/glusterfs/rpc</div><div class='add'>+     %{_includedir}/glusterfs/rpc/*.h</div><div class='add'>+%{_libdir}/libgfrpc.so</div><div class='add'>+</div><div class='add'>+%files -n libgfxdr-devel</div><div class='add'>+%{_libdir}/libgfxdr.so</div><div class='add'>+</div><div class='add'>+%files client-xlators</div><div class='add'>+%dir %{_libdir}/glusterfs/%{version}%{?prereltag}/xlator</div><div class='add'>+%dir %{_libdir}/glusterfs/%{version}%{?prereltag}/xlator/cluster</div><div class='add'>+     %{_libdir}/glusterfs/%{version}%{?prereltag}/xlator/cluster/*.so</div><div class='add'>+%dir %{_libdir}/glusterfs/%{version}%{?prereltag}/xlator/protocol</div><div class='add'>+     %{_libdir}/glusterfs/%{version}%{?prereltag}/xlator/protocol/client.so</div><div class='add'>+</div><div class='add'>+%files extra-xlators</div><div class='add'>+%dir %{_libdir}/glusterfs/%{version}%{?prereltag}/xlator</div><div class='add'>+%dir %{_libdir}/glusterfs/%{version}%{?prereltag}/xlator/features</div><div class='add'>+     %{_libdir}/glusterfs/%{version}%{?prereltag}/xlator/features/quiesce.so</div><div class='add'>+%dir %{_libdir}/glusterfs/%{version}%{?prereltag}/xlator/playground</div><div class='add'>+     %{_libdir}/glusterfs/%{version}%{?prereltag}/xlator/playground/template.so</div><div class='ctx'> </div><div class='ctx'> %files fuse</div><div class='del'>-%defattr(-,root,root)</div><div class='del'>-%{_libdir}/glusterfs/%{version}/xlator/mount/fuse*</div><div class='add'>+# glusterfs is a symlink to glusterfsd, -server depends on -fuse.</div><div class='add'>+%{_sbindir}/glusterfs</div><div class='add'>+%{_sbindir}/glusterfsd</div><div class='add'>+%config(noreplace) %{_sysconfdir}/logrotate.d/glusterfs</div><div class='add'>+%dir %{_libdir}/glusterfs/%{version}%{?prereltag}/xlator</div><div class='add'>+%dir %{_libdir}/glusterfs/%{version}%{?prereltag}/xlator/mount</div><div class='add'>+     %{_libdir}/glusterfs/%{version}%{?prereltag}/xlator/mount/fuse.so</div><div class='add'>+/sbin/mount.glusterfs</div><div class='add'>+%if ( 0%{!?_without_fusermount:1} )</div><div class='add'>+%{_bindir}/fusermount-glusterfs</div><div class='add'>+%endif</div><div class='add'>+</div><div class='add'>+%if ( 0%{?_with_gnfs:1} &amp;&amp; 0%{!?_without_server:1} )</div><div class='add'>+%files gnfs</div><div class='add'>+%dir %{_libdir}/glusterfs/%{version}%{?prereltag}/xlator</div><div class='add'>+%dir %{_libdir}/glusterfs/%{version}%{?prereltag}/xlator/nfs</div><div class='add'>+     %{_libdir}/glusterfs/%{version}%{?prereltag}/xlator/nfs/server.so</div><div class='add'>+%ghost %dir %attr(0755,-,-) %{_sharedstatedir}/glusterd/nfs</div><div class='add'>+%ghost      %attr(0600,-,-) %{_sharedstatedir}/glusterd/nfs/nfs-server.vol</div><div class='add'>+%ghost %dir %attr(0755,-,-) %{_sharedstatedir}/glusterd/nfs/run</div><div class='add'>+%ghost      %attr(0600,-,-) %{_sharedstatedir}/glusterd/nfs/run/nfs.pid</div><div class='add'>+%endif</div><div class='add'>+</div><div class='add'>+%files thin-arbiter</div><div class='add'>+%dir %{_libdir}/glusterfs/%{version}%{?prereltag}/xlator</div><div class='add'>+%dir %{_libdir}/glusterfs/%{version}%{?prereltag}/xlator/features</div><div class='add'>+     %{_libdir}/glusterfs/%{version}%{?prereltag}/xlator/features/thin-arbiter.so</div><div class='add'>+%dir %{_datadir}/glusterfs/scripts</div><div class='add'>+     %{_datadir}/glusterfs/scripts/setup-thin-arbiter.sh</div><div class='add'>+%config %{_sysconfdir}/glusterfs/thin-arbiter.vol</div><div class='add'>+</div><div class='add'>+%if ( 0%{?_with_systemd:1} )</div><div class='add'>+%{_unitdir}/gluster-ta-volume.service</div><div class='add'>+%endif</div><div class='add'>+</div><div class='add'>+%if ( 0%{!?_without_georeplication:1} )</div><div class='add'>+%files geo-replication</div><div class='add'>+%config(noreplace) %{_sysconfdir}/logrotate.d/glusterfs-georep</div><div class='add'>+</div><div class='add'>+%{_sbindir}/gfind_missing_files</div><div class='add'>+%{_sbindir}/gluster-mountbroker</div><div class='add'>+%dir %{_libexecdir}/glusterfs</div><div class='add'>+%dir %{_libexecdir}/glusterfs/python</div><div class='add'>+%dir %{_libexecdir}/glusterfs/python/syncdaemon</div><div class='add'>+     %{_libexecdir}/glusterfs/gsyncd</div><div class='add'>+     %{_libexecdir}/glusterfs/python/syncdaemon/*</div><div class='add'>+%dir %{_libexecdir}/glusterfs/scripts</div><div class='add'>+     %{_libexecdir}/glusterfs/scripts/get-gfid.sh</div><div class='add'>+     %{_libexecdir}/glusterfs/scripts/slave-upgrade.sh</div><div class='add'>+     %{_libexecdir}/glusterfs/scripts/gsync-upgrade.sh</div><div class='add'>+     %{_libexecdir}/glusterfs/scripts/generate-gfid-file.sh</div><div class='add'>+     %{_libexecdir}/glusterfs/scripts/gsync-sync-gfid</div><div class='add'>+     %{_libexecdir}/glusterfs/scripts/schedule_georep.py*</div><div class='add'>+     %{_libexecdir}/glusterfs/gverify.sh</div><div class='add'>+     %{_libexecdir}/glusterfs/set_geo_rep_pem_keys.sh</div><div class='add'>+     %{_libexecdir}/glusterfs/peer_gsec_create</div><div class='add'>+     %{_libexecdir}/glusterfs/peer_mountbroker</div><div class='add'>+     %{_libexecdir}/glusterfs/peer_mountbroker.py*</div><div class='add'>+     %{_libexecdir}/glusterfs/gfind_missing_files</div><div class='add'>+     %{_libexecdir}/glusterfs/peer_georep-sshkey.py*</div><div class='add'>+%{_sbindir}/gluster-georep-sshkey</div><div class='add'>+</div><div class='add'>+       %dir %attr(0755,-,-) %{_sharedstatedir}/glusterd/geo-replication</div><div class='add'>+%ghost      %attr(0644,-,-) %{_sharedstatedir}/glusterd/geo-replication/gsyncd_template.conf</div><div class='add'>+       %dir %attr(0755,-,-) %{_sharedstatedir}/glusterd/hooks/1/gsync-create</div><div class='add'>+       %dir %attr(0755,-,-) %{_sharedstatedir}/glusterd/hooks/1/gsync-create/post</div><div class='add'>+            %attr(0755,-,-) %{_sharedstatedir}/glusterd/hooks/1/gsync-create/post/S56glusterd-geo-rep-create-post.sh</div><div class='add'>+%ghost %dir %attr(0755,-,-) %{_sharedstatedir}/glusterd/hooks/1/gsync-create/pre</div><div class='add'>+</div><div class='add'>+%endif</div><div class='add'>+</div><div class='add'>+%files -n libglusterfs0</div><div class='add'>+%{_libdir}/libglusterfs.so.*</div><div class='add'>+</div><div class='add'>+%files -n libgfapi0</div><div class='add'>+%{_libdir}/libgfapi.so.*</div><div class='add'>+%dir %{_libdir}/glusterfs/%{version}%{?prereltag}/xlator/mount</div><div class='add'>+     %{_libdir}/glusterfs/%{version}%{?prereltag}/xlator/mount/api.so</div><div class='add'>+</div><div class='add'>+%files -n libgfchangelog0</div><div class='add'>+%{_libdir}/libgfchangelog.so.*</div><div class='add'>+</div><div class='add'>+%files -n libgfrpc0</div><div class='add'>+%{_libdir}/libgfrpc.so.*</div><div class='add'>+</div><div class='add'>+%files -n libgfxdr0</div><div class='add'>+%{_libdir}/libgfxdr.so.*</div><div class='add'>+</div><div class='add'>+%files -n libglusterd0</div><div class='add'>+%{_libdir}/libglusterd.so.*</div><div class='add'>+%exclude %{_libdir}/libglusterd.so</div><div class='add'>+</div><div class='add'>+%files -n python%{_pythonver}-gluster</div><div class='add'>+# introducing glusterfs module in site packages.</div><div class='add'>+# so that all other gluster submodules can reside in the same namespace.</div><div class='add'>+%if ( %{_usepython3} )</div><div class='add'>+%dir %{python3_sitelib}/gluster</div><div class='add'>+     %{python3_sitelib}/gluster/__init__.*</div><div class='add'>+     %{python3_sitelib}/gluster/__pycache__</div><div class='add'>+     %{python3_sitelib}/gluster/cliutils</div><div class='add'>+%else</div><div class='add'>+%dir %{python2_sitelib}/gluster</div><div class='add'>+     %{python2_sitelib}/gluster/__init__.*</div><div class='add'>+     %{python2_sitelib}/gluster/cliutils</div><div class='add'>+%endif</div><div class='add'>+</div><div class='add'>+%files regression-tests</div><div class='add'>+%dir %{_datadir}/glusterfs</div><div class='add'>+     %{_datadir}/glusterfs/run-tests.sh</div><div class='add'>+     %{_datadir}/glusterfs/tests</div><div class='add'>+%exclude %{_datadir}/glusterfs/tests/vagrant</div><div class='add'>+</div><div class='add'>+%if ( 0%{!?_without_server:1} )</div><div class='add'>+%files ganesha</div><div class='add'>+%dir %{_libexecdir}/ganesha</div><div class='add'>+%{_sysconfdir}/ganesha/ganesha-ha.conf.sample</div><div class='add'>+%{_libexecdir}/ganesha/*</div><div class='add'>+%{_prefix}/lib/ocf/resource.d/heartbeat/*</div><div class='add'>+%{_sharedstatedir}/glusterd/hooks/1/start/post/S31ganesha-start.sh</div><div class='add'>+%ghost      %attr(0644,-,-) %config(noreplace) %{_sysconfdir}/ganesha/ganesha-ha.conf</div><div class='add'>+%ghost %dir %attr(0755,-,-) %{_localstatedir}/run/gluster/shared_storage/nfs-ganesha</div><div class='add'>+%ghost      %attr(0644,-,-) %config(noreplace) %{_localstatedir}/run/gluster/shared_storage/nfs-ganesha/ganesha.conf</div><div class='add'>+%ghost      %attr(0644,-,-) %config(noreplace) %{_localstatedir}/run/gluster/shared_storage/nfs-ganesha/ganesha-ha.conf</div><div class='add'>+%endif</div><div class='add'>+</div><div class='add'>+%if ( 0%{!?_without_ocf:1} )</div><div class='add'>+%files resource-agents</div><div class='add'>+# /usr/lib is the standard for OCF, also on x86_64</div><div class='add'>+%{_prefix}/lib/ocf/resource.d/glusterfs</div><div class='add'>+%endif</div><div class='add'>+</div><div class='add'>+%if ( 0%{!?_without_server:1} )</div><div class='add'>+%files server</div><div class='add'>+%doc extras/clear_xattrs.sh</div><div class='add'>+# sysconf</div><div class='add'>+%config(noreplace) %{_sysconfdir}/glusterfs</div><div class='add'>+%exclude %{_sysconfdir}/glusterfs/thin-arbiter.vol</div><div class='add'>+%exclude %{_sysconfdir}/glusterfs/eventsconfig.json</div><div class='add'>+%exclude %{_sharedstatedir}/glusterd/nfs/nfs-server.vol</div><div class='add'>+%exclude %{_sharedstatedir}/glusterd/nfs/run/nfs.pid</div><div class='add'>+%if ( 0%{?_with_gnfs:1} )</div><div class='add'>+%exclude %{_libdir}/glusterfs/%{version}%{?prereltag}/xlator/nfs/*</div><div class='add'>+%endif</div><div class='add'>+%config(noreplace) %{_sysconfdir}/sysconfig/glusterd</div><div class='add'>+%if ( 0%{_for_fedora_koji_builds} )</div><div class='add'>+%config(noreplace) %{_sysconfdir}/sysconfig/glusterfsd</div><div class='add'>+%endif</div><div class='add'>+</div><div class='add'>+# init files</div><div class='add'>+%glusterd_svcfile</div><div class='add'>+%if ( 0%{_for_fedora_koji_builds} )</div><div class='add'>+%glusterfsd_svcfile</div><div class='add'>+%endif</div><div class='add'>+%if ( 0%{?_with_systemd:1} )</div><div class='add'>+%glusterfssharedstorage_svcfile</div><div class='add'>+%endif</div><div class='add'>+</div><div class='add'>+# binaries</div><div class='add'>+%{_sbindir}/glusterd</div><div class='add'>+%{_libexecdir}/glusterfs/glfsheal</div><div class='add'>+%{_sbindir}/gf_attach</div><div class='add'>+%{_sbindir}/gluster-setgfid2path</div><div class='add'>+# {_sbindir}/glusterfsd is the actual binary, but glusterfs (client) is a</div><div class='add'>+# symlink. The binary itself (and symlink) are part of the glusterfs-fuse</div><div class='add'>+# package, because glusterfs-server depends on that anyway.</div><div class='add'>+</div><div class='add'>+# Manpages</div><div class='add'>+%{_mandir}/man8/gluster-setgfid2path.8*</div><div class='add'>+</div><div class='add'>+# xlators</div><div class='add'>+%dir %{_libdir}/glusterfs/%{version}%{?prereltag}/xlator</div><div class='add'>+%dir %{_libdir}/glusterfs/%{version}%{?prereltag}/xlator/features</div><div class='add'>+     %{_libdir}/glusterfs/%{version}%{?prereltag}/xlator/features/arbiter.so</div><div class='add'>+     %{_libdir}/glusterfs/%{version}%{?prereltag}/xlator/features/bit-rot.so</div><div class='add'>+     %{_libdir}/glusterfs/%{version}%{?prereltag}/xlator/features/bitrot-stub.so</div><div class='add'>+     %{_libdir}/glusterfs/%{version}%{?prereltag}/xlator/features/sdfs.so</div><div class='add'>+     %{_libdir}/glusterfs/%{version}%{?prereltag}/xlator/features/index.so</div><div class='add'>+     %{_libdir}/glusterfs/%{version}%{?prereltag}/xlator/features/locks.so</div><div class='add'>+     %{_libdir}/glusterfs/%{version}%{?prereltag}/xlator/features/posix*</div><div class='add'>+     %{_libdir}/glusterfs/%{version}%{?prereltag}/xlator/features/snapview-server.so</div><div class='add'>+     %{_libdir}/glusterfs/%{version}%{?prereltag}/xlator/features/marker.so</div><div class='add'>+     %{_libdir}/glusterfs/%{version}%{?prereltag}/xlator/features/quota*</div><div class='add'>+     %{_libdir}/glusterfs/%{version}%{?prereltag}/xlator/features/selinux.so</div><div class='add'>+     %{_libdir}/glusterfs/%{version}%{?prereltag}/xlator/features/trash.so</div><div class='add'>+     %{_libdir}/glusterfs/%{version}%{?prereltag}/xlator/features/upcall.so</div><div class='add'>+     %{_libdir}/glusterfs/%{version}%{?prereltag}/xlator/features/leases.so</div><div class='add'>+%dir %{_libdir}/glusterfs/%{version}%{?prereltag}/xlator/mgmt</div><div class='add'>+     %{_libdir}/glusterfs/%{version}%{?prereltag}/xlator/mgmt/glusterd.so</div><div class='add'>+%dir %{_libdir}/glusterfs/%{version}%{?prereltag}/xlator/protocol</div><div class='add'>+     %{_libdir}/glusterfs/%{version}%{?prereltag}/xlator/protocol/server.so</div><div class='add'>+%dir %{_libdir}/glusterfs/%{version}%{?prereltag}/xlator/storage</div><div class='add'>+     %{_libdir}/glusterfs/%{version}%{?prereltag}/xlator/storage/posix.so</div><div class='add'>+</div><div class='add'>+# snap_scheduler</div><div class='add'>+%{_sbindir}/snap_scheduler.py</div><div class='add'>+%{_sbindir}/gcron.py</div><div class='add'>+%{_sbindir}/conf.py</div><div class='add'>+</div><div class='add'>+# /var/lib/glusterd, e.g. hookscripts, etc.</div><div class='add'>+%ghost      %attr(0644,-,-) %config(noreplace) %{_sharedstatedir}/glusterd/glusterd.info</div><div class='add'>+       %dir %attr(0755,-,-) %{_sharedstatedir}/glusterd</div><div class='add'>+%ghost %dir %attr(0755,-,-) %{_sharedstatedir}/glusterd/bitd</div><div class='add'>+       %dir %attr(0755,-,-) %{_sharedstatedir}/glusterd/groups</div><div class='add'>+            %attr(0644,-,-) %{_sharedstatedir}/glusterd/groups/virt</div><div class='add'>+            %attr(0644,-,-) %{_sharedstatedir}/glusterd/groups/metadata-cache</div><div class='add'>+            %attr(0644,-,-) %{_sharedstatedir}/glusterd/groups/gluster-block</div><div class='add'>+            %attr(0644,-,-) %{_sharedstatedir}/glusterd/groups/nl-cache</div><div class='add'>+            %attr(0644,-,-) %{_sharedstatedir}/glusterd/groups/db-workload</div><div class='add'>+            %attr(0644,-,-) %{_sharedstatedir}/glusterd/groups/distributed-virt</div><div class='add'>+            %attr(0644,-,-) %{_sharedstatedir}/glusterd/groups/samba</div><div class='add'>+       %dir %attr(0755,-,-) %{_sharedstatedir}/glusterd/glusterfind</div><div class='add'>+       %dir %attr(0755,-,-) %{_sharedstatedir}/glusterd/glusterfind/.keys</div><div class='add'>+%ghost %dir %attr(0755,-,-) %{_sharedstatedir}/glusterd/glustershd</div><div class='add'>+       %dir %attr(0755,-,-) %{_sharedstatedir}/glusterd/hooks</div><div class='add'>+       %dir %attr(0755,-,-) %{_sharedstatedir}/glusterd/hooks/1</div><div class='add'>+       %dir %attr(0755,-,-) %{_sharedstatedir}/glusterd/hooks/1/add-brick</div><div class='add'>+       %dir %attr(0755,-,-) %{_sharedstatedir}/glusterd/hooks/1/add-brick/post</div><div class='add'>+            %attr(0755,-,-) %{_sharedstatedir}/glusterd/hooks/1/add-brick/post/disabled-quota-root-xattr-heal.sh</div><div class='add'>+            %attr(0755,-,-) %{_sharedstatedir}/glusterd/hooks/1/add-brick/post/S10selinux-label-brick.sh</div><div class='add'>+            %attr(0755,-,-) %{_sharedstatedir}/glusterd/hooks/1/add-brick/post/S13create-subdir-mounts.sh</div><div class='add'>+       %dir %attr(0755,-,-) %{_sharedstatedir}/glusterd/hooks/1/add-brick/pre</div><div class='add'>+            %attr(0755,-,-) %{_sharedstatedir}/glusterd/hooks/1/add-brick/pre/S28Quota-enable-root-xattr-heal.sh</div><div class='add'>+       %dir %attr(0755,-,-) %{_sharedstatedir}/glusterd/hooks/1/create</div><div class='add'>+       %dir %attr(0755,-,-) %{_sharedstatedir}/glusterd/hooks/1/create/post</div><div class='add'>+            %attr(0755,-,-) %{_sharedstatedir}/glusterd/hooks/1/create/post/S10selinux-label-brick.sh</div><div class='add'>+%ghost %dir %attr(0755,-,-) %{_sharedstatedir}/glusterd/hooks/1/create/pre</div><div class='add'>+%ghost %dir %attr(0755,-,-) %{_sharedstatedir}/glusterd/hooks/1/copy-file</div><div class='add'>+%ghost %dir %attr(0755,-,-) %{_sharedstatedir}/glusterd/hooks/1/copy-file/post</div><div class='add'>+%ghost %dir %attr(0755,-,-) %{_sharedstatedir}/glusterd/hooks/1/copy-file/pre</div><div class='add'>+       %dir %attr(0755,-,-) %{_sharedstatedir}/glusterd/hooks/1/delete</div><div class='add'>+       %dir %attr(0755,-,-) %{_sharedstatedir}/glusterd/hooks/1/delete/post</div><div class='add'>+                            %{_sharedstatedir}/glusterd/hooks/1/delete/post/S57glusterfind-delete-post</div><div class='add'>+       %dir %attr(0755,-,-) %{_sharedstatedir}/glusterd/hooks/1/delete/pre</div><div class='add'>+            %attr(0755,-,-) %{_sharedstatedir}/glusterd/hooks/1/delete/pre/S10selinux-del-fcontext.sh</div><div class='add'>+%ghost %dir %attr(0755,-,-) %{_sharedstatedir}/glusterd/hooks/1/remove-brick</div><div class='add'>+%ghost %dir %attr(0755,-,-) %{_sharedstatedir}/glusterd/hooks/1/remove-brick/post</div><div class='add'>+%ghost %dir %attr(0755,-,-) %{_sharedstatedir}/glusterd/hooks/1/remove-brick/pre</div><div class='add'>+       %dir %attr(0755,-,-) %{_sharedstatedir}/glusterd/hooks/1/reset</div><div class='add'>+       %dir %attr(0755,-,-) %{_sharedstatedir}/glusterd/hooks/1/reset/post</div><div class='add'>+%ghost %dir %attr(0755,-,-) %{_sharedstatedir}/glusterd/hooks/1/reset/pre</div><div class='add'>+       %dir %attr(0755,-,-) %{_sharedstatedir}/glusterd/hooks/1/set</div><div class='add'>+       %dir %attr(0755,-,-) %{_sharedstatedir}/glusterd/hooks/1/set/post</div><div class='add'>+            %attr(0755,-,-) %{_sharedstatedir}/glusterd/hooks/1/set/post/S30samba-set.sh</div><div class='add'>+            %attr(0755,-,-) %{_sharedstatedir}/glusterd/hooks/1/set/post/S32gluster_enable_shared_storage.sh</div><div class='add'>+%ghost %dir %attr(0755,-,-) %{_sharedstatedir}/glusterd/hooks/1/set/pre</div><div class='add'>+       %dir %attr(0755,-,-) %{_sharedstatedir}/glusterd/hooks/1/start</div><div class='add'>+       %dir %attr(0755,-,-) %{_sharedstatedir}/glusterd/hooks/1/start/post</div><div class='add'>+            %attr(0755,-,-) %{_sharedstatedir}/glusterd/hooks/1/start/post/S29CTDBsetup.sh</div><div class='add'>+            %attr(0755,-,-) %{_sharedstatedir}/glusterd/hooks/1/start/post/S30samba-start.sh</div><div class='add'>+%ghost %dir %attr(0755,-,-) %{_sharedstatedir}/glusterd/hooks/1/start/pre</div><div class='add'>+       %dir %attr(0755,-,-) %{_sharedstatedir}/glusterd/hooks/1/stop</div><div class='add'>+%ghost %dir %attr(0755,-,-) %{_sharedstatedir}/glusterd/hooks/1/stop/post</div><div class='add'>+       %dir %attr(0755,-,-) %{_sharedstatedir}/glusterd/hooks/1/stop/pre</div><div class='add'>+            %attr(0755,-,-) %{_sharedstatedir}/glusterd/hooks/1/stop/pre/S30samba-stop.sh</div><div class='add'>+            %attr(0755,-,-) %{_sharedstatedir}/glusterd/hooks/1/stop/pre/S29CTDB-teardown.sh</div><div class='add'>+%config(noreplace) %ghost      %attr(0600,-,-) %{_sharedstatedir}/glusterd/options</div><div class='add'>+%ghost %dir %attr(0755,-,-) %{_sharedstatedir}/glusterd/peers</div><div class='add'>+%ghost %dir %attr(0755,-,-) %{_sharedstatedir}/glusterd/quotad</div><div class='add'>+%ghost %dir %attr(0755,-,-) %{_sharedstatedir}/glusterd/scrub</div><div class='add'>+%ghost %dir %attr(0755,-,-) %{_sharedstatedir}/glusterd/snaps</div><div class='add'>+%ghost %dir %attr(0755,-,-) %{_sharedstatedir}/glusterd/ss_brick</div><div class='add'>+%ghost %dir %attr(0755,-,-) %{_sharedstatedir}/glusterd/vols</div><div class='add'>+</div><div class='add'>+# Extra utility script</div><div class='add'>+%dir %{_libexecdir}/glusterfs</div><div class='add'>+%dir %{_datadir}/glusterfs/scripts</div><div class='add'>+     %{_datadir}/glusterfs/scripts/stop-all-gluster-processes.sh</div><div class='add'>+%if ( 0%{?_with_systemd:1} )</div><div class='add'>+     %{_libexecdir}/glusterfs/mount-shared-storage.sh</div><div class='add'>+     %{_datadir}/glusterfs/scripts/control-cpu-load.sh</div><div class='add'>+     %{_datadir}/glusterfs/scripts/control-mem.sh</div><div class='add'>+%endif</div><div class='add'>+</div><div class='add'>+# Incrementalapi</div><div class='add'>+     %{_libexecdir}/glusterfs/glusterfind</div><div class='add'>+%{_bindir}/glusterfind</div><div class='add'>+     %{_libexecdir}/glusterfs/peer_add_secret_pub</div><div class='add'>+</div><div class='add'>+%if ( 0%{?_with_firewalld:1} )</div><div class='add'>+%{_prefix}/lib/firewalld/services/glusterfs.xml</div><div class='add'>+%endif</div><div class='add'>+# end of server files</div><div class='add'>+%endif</div><div class='add'>+</div><div class='add'>+# Events</div><div class='add'>+%if ( 0%{!?_without_events:1} )</div><div class='add'>+%files events</div><div class='add'>+%config(noreplace) %{_sysconfdir}/glusterfs/eventsconfig.json</div><div class='add'>+%dir %{_sharedstatedir}/glusterd</div><div class='add'>+%dir %{_sharedstatedir}/glusterd/events</div><div class='add'>+%dir %{_libexecdir}/glusterfs</div><div class='add'>+     %{_libexecdir}/glusterfs/gfevents</div><div class='add'>+     %{_libexecdir}/glusterfs/peer_eventsapi.py*</div><div class='add'>+%{_sbindir}/glustereventsd</div><div class='add'>+%{_sbindir}/gluster-eventsapi</div><div class='add'>+%{_datadir}/glusterfs/scripts/eventsdash.py*</div><div class='add'>+%if ( 0%{?_with_systemd:1} )</div><div class='add'>+%{_unitdir}/glustereventsd.service</div><div class='add'>+%else</div><div class='add'>+%{_sysconfdir}/init.d/glustereventsd</div><div class='add'>+%endif</div><div class='add'>+%endif</div><div class='ctx'> </div><div class='ctx'> %changelog</div><div class='del'>-* Wed Jul 01 2009 Harshavardhana &lt;harsha@gluster.com&gt; - 2.1</div><div class='del'>-- Removed mod_glusterfs.so and added new --without epoll build</div><div class='del'>-  option. </div><div class='add'>+* Thu May 14 2020 Kaleb S. KEITHLEY &lt;kkeithle@redhat.com&gt;</div><div class='add'>+- refactor, common practice, Issue #1126</div><div class='add'>+</div><div class='add'>+* Mon May 11 2020 Sunny Kumar &lt;sunkumar@redhat.com&gt;</div><div class='add'>+- added requires policycoreutils-python-utils on rhel8 for geo-replication</div><div class='add'>+</div><div class='add'>+* Wed Oct 9 2019 Kaleb S. KEITHLEY &lt;kkeithle@redhat.com&gt;</div><div class='add'>+- remove leftover bd xlator cruft</div><div class='add'>+</div><div class='add'>+* Fri Aug 23 2019 Shwetha K Acharya &lt;sacharya@redhat.com&gt;</div><div class='add'>+- removed {name}-ufs from Obsoletes</div><div class='add'>+- added  "&lt; version" for obsoletes {name}-gnfs and {name}-rdma</div><div class='add'>+</div><div class='add'>+* Mon Jul 15 2019 Jiffin Tony Thottan &lt;jthottan@redhat.com&gt;</div><div class='add'>+- Adding ganesha ha bits back in gluster repository</div><div class='add'>+</div><div class='add'>+* Fri Jul 12 2019 Amar Tumballi &lt;amarts@redhat.com&gt;</div><div class='add'>+- Remove rdma package, and mark older rdma package as 'Obsoletes'</div><div class='add'>+</div><div class='add'>+* Fri Jun 14 2019 Niels de Vos &lt;ndevos@redhat.com&gt;</div><div class='add'>+- always build glusterfs-cli to allow monitoring/managing from clients</div><div class='add'>+</div><div class='add'>+* Wed Mar 6 2019 Kaleb S. KEITHLEY &lt;kkeithle@redhat.com&gt;</div><div class='add'>+- remove unneeded ldconfig in scriptlets</div><div class='add'>+-  reported by Igor Gnatenko in Fedora</div><div class='add'>+-   https://src.fedoraproject.org/rpms/glusterfs/pull-request/5</div><div class='add'>+</div><div class='add'>+* Mon Mar 4 2019 Kaleb S. KEITHLEY &lt;kkeithle@redhat.com&gt;</div><div class='add'>+- s390x has RDMA, since around Fedora 27 and in RHEL7 since June 2016.</div><div class='add'>+</div><div class='add'>+* Tue Feb 26 2019 Ashish Pandey &lt;aspandey@redhat.com&gt;</div><div class='add'>+- Add thin-arbiter package</div><div class='add'>+</div><div class='add'>+* Sun Feb 24 2019 Aravinda VK &lt;avishwan@redhat.com&gt;</div><div class='add'>+- Renamed events package to gfevents</div><div class='add'>+</div><div class='add'>+* Thu Feb 21 2019 Jiffin Tony Thottan &lt;jthottan@redhat.com&gt;</div><div class='add'>+- Obsoleting gluster-gnfs package</div><div class='add'>+</div><div class='add'>+* Wed Nov 28 2018 Krutika Dhananjay &lt;kdhananj@redhat.com&gt;</div><div class='add'>+- Install /var/lib/glusterd/groups/distributed-virt by default</div><div class='add'>+</div><div class='add'>+* Tue Nov 13 2018 Niels de Vos &lt;ndevos@redhat.com&gt;</div><div class='add'>+- Add an option to build with ThreadSanitizer (TSAN)</div><div class='add'>+</div><div class='add'>+* Fri Sep 7 2018 Niels de Vos &lt;ndevos@redhat.com&gt;</div><div class='add'>+- Add an option to build with address sanitizer (ASAN)</div><div class='add'>+</div><div class='add'>+* Sun Jul 29 2018 Niels de Vos &lt;ndevos@redhat.com&gt;</div><div class='add'>+- Disable building glusterfs-resource-agents on el6 (#1609551)</div><div class='add'>+</div><div class='add'>+* Thu Feb 22 2018 Kotresh HR &lt;khiremat@redhat.com&gt;</div><div class='add'>+- Added util-linux as dependency to georeplication rpm (#1544382)</div><div class='add'>+</div><div class='add'>+* Thu Feb 1 2018 Niels de Vos &lt;ndevos@redhat.com&gt;</div><div class='add'>+- Add '--without server' option to facilitate el6 builds (#1074947)</div><div class='add'>+</div><div class='add'>+* Wed Jan 24 2018 Kaleb S. KEITHLEY &lt;kkeithle@redhat.com&gt;</div><div class='add'>+- python-ctypes no long exists, now in python stdlib (#1538258)</div><div class='add'>+</div><div class='add'>+* Thu Jan 18 2018 Kaleb S. KEITHLEY &lt;kkeithle@redhat.com&gt;</div><div class='add'>+- Fedora 28 glibc has removed rpc headers and rpcgen, use libtirpc</div><div class='add'>+</div><div class='add'>+* Mon Dec 25 2017 Niels de Vos &lt;ndevos@redhat.com&gt;</div><div class='add'>+- Fedora 28 has renamed pyxattr</div><div class='add'>+</div><div class='add'>+* Wed Sep 27 2017 Mohit Agrawal &lt;moagrawa@redhat.com&gt;</div><div class='add'>+- Added control-cpu-load.sh and control-mem.sh scripts to glusterfs-server section(#1496335)</div><div class='add'>+</div><div class='add'>+* Tue Aug 22 2017 Kaleb S. KEITHLEY &lt;kkeithle@redhat.com&gt;</div><div class='add'>+- libibverbs-devel, librdmacm-devel -&gt; rdma-core-devel #1483995</div><div class='add'>+</div><div class='add'>+* Thu Jul 20 2017 Aravinda VK &lt;avishwan@redhat.com&gt;</div><div class='add'>+- Added new tool/binary to set the gfid2path xattr on files</div><div class='add'>+</div><div class='add'>+* Thu Jul 13 2017 Kaleb S. KEITHLEY &lt;kkeithle@redhat.com&gt;</div><div class='add'>+- various directories not owned by any package</div><div class='add'>+</div><div class='add'>+* Fri Jun 16 2017 Jiffin Tony Thottan &lt;jthottan@redhat.com&gt;</div><div class='add'>+- Add glusterfssharedstorage.service systemd file</div><div class='add'>+</div><div class='add'>+* Fri Jun 9 2017 Poornima G &lt;pgurusid@redhat.com&gt;</div><div class='add'>+- Install /var/lib/glusterd/groups/nl-cache by default</div><div class='add'>+</div><div class='add'>+* Wed May 10 2017 Pranith Kumar K &lt;pkarampu@redhat.com&gt;</div><div class='add'>+- Install /var/lib/glusterd/groups/gluster-block by default</div><div class='add'>+</div><div class='add'>+* Thu Apr 27 2017 Kaleb S. KEITHLEY &lt;kkeithle@redhat.com&gt;</div><div class='add'>+- gnfs in an optional subpackage</div><div class='add'>+</div><div class='add'>+* Wed Apr 26 2017 Kaleb S. KEITHLEY &lt;kkeithle@redhat.com&gt;</div><div class='add'>+- /var/run/gluster owner gluster:gluster(0775) for qemu(gfapi)</div><div class='add'>+  statedumps (#1445569)</div><div class='add'>+</div><div class='add'>+* Mon Apr 24 2017 Jiffin Tony Thottan &lt;jhottan@redhat.com&gt;</div><div class='add'>+- Install SELinux hook scripts that manage contexts for bricks (#1047975)</div><div class='add'>+</div><div class='add'>+* Thu Apr 20 2017 Kaleb S. KEITHLEY &lt;kkeithle@redhat.com&gt;</div><div class='add'>+- firewalld-filesystem -&gt; firewalld (#1443959)</div><div class='add'>+</div><div class='add'>+* Thu Apr 13 2017 Niels de Vos &lt;ndevos@redhat.com&gt;</div><div class='add'>+- the -regression-tests sub-package needs "bc" for some tests (#1442145)</div><div class='add'>+</div><div class='add'>+* Mon Mar 20 2017 Niels de Vos &lt;ndevos@redhat.com&gt;</div><div class='add'>+- Drop dependency on psmisc, pkill is used instead of killall (#1197308)</div><div class='add'>+</div><div class='add'>+* Thu Feb 16 2017 Niels de Vos &lt;ndevos@redhat.com&gt;</div><div class='add'>+- Obsolete and Provide python-gluster for upgrading from glusterfs &lt; 3.10</div><div class='add'>+</div><div class='add'>+* Wed Feb 1 2017 Poornima G &lt;pgurusid@redhat.com&gt;</div><div class='add'>+- Install /var/lib/glusterd/groups/metadata-cache by default</div><div class='add'>+</div><div class='add'>+* Wed Jan 18 2017 Kaleb S. KEITHLEY &lt;kkeithle@redhat.com&gt;</div><div class='add'>+- python2 (versus python3) cleanup (#1414902)</div><div class='add'>+</div><div class='add'>+* Fri Jan 13 2017 Kaleb S. KEITHLEY &lt;kkeithle@redhat.com&gt;</div><div class='add'>+- switch to storhaug HA</div><div class='add'>+</div><div class='add'>+* Fri Jan 6 2017 Niels de Vos &lt;ndevos@redhat.com&gt;</div><div class='add'>+- use macro provided by firewalld-filesystem to reload firewalld</div><div class='add'>+</div><div class='add'>+* Thu Nov 24 2016 Jiffin Tony Thottan &lt;jhottan@redhat.com&gt;</div><div class='add'>+- remove S31ganesha-reset.sh from hooks (#1397795)</div><div class='add'>+</div><div class='add'>+* Thu Sep 22 2016 Kaleb S. KEITHLEY &lt;kkeithle@redhat.com&gt;</div><div class='add'>+- python-ctypes no long exists, now in python stdlib (#1378436)</div><div class='add'>+</div><div class='add'>+* Wed Sep 14 2016 Aravinda VK &lt;avishwan@redhat.com&gt;</div><div class='add'>+- Changed attribute of eventsconfig.json file as same as other configs (#1375532)</div><div class='add'>+</div><div class='add'>+* Thu Sep 08 2016 Aravinda VK &lt;avishwan@redhat.com&gt;</div><div class='add'>+- Added init script for glustereventsd (#1365395)</div><div class='add'>+</div><div class='add'>+* Wed Aug 31 2016 Avra Sengupta &lt;asengupt@redhat.com&gt;</div><div class='add'>+- Added conf.py for snap scheduler</div><div class='add'>+</div><div class='add'>+* Wed Aug 31 2016 Aravinda VK &lt;avishwan@redhat.com&gt;</div><div class='add'>+- Added new Geo-replication utility "gluster-georep-sshkey" (#1356508)</div><div class='add'>+</div><div class='add'>+* Thu Aug 25 2016 Aravinda VK &lt;avishwan@redhat.com&gt;</div><div class='add'>+- Added gluster-mountbroker utility for geo-rep mountbroker setup (#1343333)</div><div class='add'>+</div><div class='add'>+* Mon Aug 22 2016 Milind Changire &lt;mchangir@redhat.com&gt;</div><div class='add'>+- Add psmisc as dependency for glusterfs-fuse for killall command (#1367665)</div><div class='add'>+</div><div class='add'>+* Thu Aug 4 2016 Jiffin Tony Thottan &lt;jthottan@redhat.com&gt;</div><div class='add'>+- Remove ganesha.so from client xlators</div><div class='add'>+</div><div class='add'>+* Sun Jul 31 2016 Soumya Koduri &lt;skoduri@redhat.com&gt;</div><div class='add'>+- Add dependency on portblock resource agent for ganesha package (#1354439)</div><div class='add'>+</div><div class='add'>+* Mon Jul 18 2016 Aravinda VK &lt;avishwan@redhat.com&gt;</div><div class='add'>+- Added new subpackage events(glusterfs-events) (#1334044)</div><div class='add'>+</div><div class='add'>+* Fri Jul 15 2016 Aravinda VK &lt;avishwan@redhat.com&gt;</div><div class='add'>+- Removed ".py" extension from symlink(S57glusterfind-delete-post)(#1356868)</div><div class='add'>+</div><div class='add'>+* Thu Jul 14 2016 Aravinda VK &lt;avishwan@redhat.com&gt;</div><div class='add'>+- Removed extra packaging line of cliutils(python-gluster)(#1342356)</div><div class='add'>+</div><div class='add'>+* Mon Jul 11 2016 Aravinda VK &lt;avishwan@redhat.com&gt;</div><div class='add'>+- Added Python subpackage "cliutils" under gluster</div><div class='add'>+</div><div class='add'>+* Tue May 31 2016 Kaleb S. KEITHLEY &lt;kkeithle@redhat.com&gt;</div><div class='add'>+- broken brp-python-bytecompile in RHEL7 results in installed</div><div class='add'>+  but unpackaged files.</div><div class='add'>+</div><div class='add'>+* Fri May 6 2016 Kaleb S. KEITHLEY &lt;kkeithle@redhat.com&gt;</div><div class='add'>+- additional dirs and files in /var/lib/glusterd/... (#1326410)</div><div class='add'>+</div><div class='add'>+* Tue Apr 26 2016 Kaleb S. KEITHLEY &lt;kkeithle@redhat.com&gt;</div><div class='add'>+- %%postun libs w/o firewalld on RHEL6 (#1330583)</div><div class='add'>+</div><div class='add'>+* Tue Apr 12 2016 Kaleb S. KEITHLEY &lt;kkeithle@redhat.com&gt;</div><div class='add'>+- additional dirs and files in /var/lib/glusterd/... (#1326410)</div><div class='add'>+</div><div class='add'>+* Mon Mar 7 2016 Kaleb S. KEITHLEY &lt;kkeithle@redhat.com&gt;</div><div class='add'>+- %%pre, %%post etc. scriptlet cleanup, ... -p /sbin/ldconfig (#1315024)</div><div class='add'>+</div><div class='add'>+* Fri Jan 22 2016 Aravinda VK &lt;avishwan@redhat.com&gt;</div><div class='add'>+- Added schedule_georep.py script to the glusterfs-geo-replication (#1300956)</div><div class='add'>+</div><div class='add'>+* Sat Jan 16 2016 Niels de Vos &lt;ndevos@redhat.com&gt;</div><div class='add'>+- glusterfs-server depends on -api (#1296931)</div><div class='add'>+</div><div class='add'>+* Sun Jan 10 2016 Niels de Vos &lt;ndevos@redhat.com&gt;</div><div class='add'>+- build system got fixed so that special glupy build is not needed anymore</div><div class='add'>+</div><div class='add'>+* Mon Dec 28 2015 Niels de Vos &lt;ndevos@redhat.com&gt;</div><div class='add'>+- hook scripts in glusterfs-ganesha use dbus-send, add dependency (#1294446)</div><div class='add'>+</div><div class='add'>+* Tue Dec 22 2015 Niels de Vos &lt;ndevos@redhat.com&gt;</div><div class='add'>+- move hook scripts for nfs-ganesha to the -ganesha sub-package</div><div class='add'>+- use standard 'make' installation for the hook scripts (#1174765)</div><div class='add'>+</div><div class='add'>+* Tue Sep 1 2015 Kaleb S. KEITHLEY &lt;kkeithle@redhat.com&gt;</div><div class='add'>+- erroneous ghost of ../hooks/1/delete causes install failure (#1258975)</div><div class='add'>+</div><div class='add'>+* Tue Aug 25 2015 Anand Nekkunti &lt;anekkunt@redhat.com&gt;</div><div class='add'>+- adding glusterfs-firewalld service (#1253967)</div><div class='add'>+</div><div class='add'>+* Tue Aug 18 2015 Niels de Vos &lt;ndevos@redhat.com&gt;</div><div class='add'>+- Include missing directories for glusterfind hooks scripts (#1225465)</div><div class='add'>+</div><div class='add'>+* Mon Jun 15 2015 Niels de Vos &lt;ndevos@redhat.com&gt;</div><div class='add'>+- Replace hook script S31ganesha-set.sh by S31ganesha-start.sh (#1231738)</div><div class='add'>+</div><div class='add'>+* Fri Jun 12 2015 Aravinda VK &lt;avishwan@redhat.com&gt;</div><div class='add'>+- Added rsync as dependency to georeplication rpm (#1231205)</div><div class='add'>+</div><div class='add'>+* Tue Jun 02 2015 Aravinda VK &lt;avishwan@redhat.com&gt;</div><div class='add'>+- Added post hook for volume delete as part of glusterfind (#1225465)</div><div class='add'>+</div><div class='add'>+* Wed May 27 2015 Aravinda VK &lt;avishwan@redhat.com&gt;</div><div class='add'>+- Added stop-all-gluster-processes.sh in glusterfs-server section (#1204641)</div><div class='add'>+</div><div class='add'>+* Wed May 20 2015 Kaleb S. KEITHLEY &lt;kkeithle@redhat.com&gt;</div><div class='add'>+- python-gluster should be 'noarch' (#1219954)</div><div class='add'>+</div><div class='add'>+* Wed May 20 2015 Kaleb S. KEITHLEY &lt;kkeithle@redhat.com&gt;</div><div class='add'>+- move libgf{db,changelog}.pc from -api-devel to -devel (#1223385)</div><div class='add'>+</div><div class='add'>+* Wed May 20 2015 Anand Nekkunti &lt;anekkunt@redhat.com&gt;</div><div class='add'>+- glusterd.socket file cleanup during post run upgrade (#1210404)</div><div class='add'>+</div><div class='add'>+* Tue May 19 2015 Avra Sengupta &lt;asengupt@redhat.com&gt;</div><div class='add'>+- Added S32gluster_enable_shared_storage.sh as volume set hook script (#1222013)</div><div class='add'>+</div><div class='add'>+* Mon May 18 2015 Milind Changire &lt;mchangir@redhat.com&gt;</div><div class='add'>+- Move file peer_add_secret_pub to the server RPM to support glusterfind (#1221544)</div><div class='add'>+* Sun May 17 2015 Niels de Vos &lt;ndevos@redhat.com&gt;</div><div class='add'>+- Fix building on RHEL-5 based distributions (#1222317)</div><div class='add'>+</div><div class='add'>+* Tue May 05 2015 Niels de Vos &lt;ndevos@redhat.com&gt;</div><div class='add'>+- Introduce glusterfs-client-xlators to reduce dependencies (#1195947)</div><div class='add'>+</div><div class='add'>+* Wed Apr 15 2015 Humble Chirammal &lt;hchiramm@redhat.com&gt;</div><div class='add'>+- Introducing python-gluster package to own gluster namespace in sitelib (#1211848)</div><div class='add'>+</div><div class='add'>+* Sat Mar 28 2015 Mohammed Rafi KC &lt;rkavunga@redhat.com&gt;</div><div class='add'>+- Add dependency for librdmacm version &gt;= 1.0.15 (#1206744)</div><div class='add'>+</div><div class='add'>+* Tue Mar 24 2015 Niels de Vos &lt;ndevos@redhat.com&gt;</div><div class='add'>+- move libgfdb (with sqlite dependency) to -server subpackage (#1194753)</div><div class='add'>+</div><div class='add'>+* Tue Mar 17 2015 Kaleb S. KEITHLEY &lt;kkeithle@redhat.com&gt;</div><div class='add'>+- glusterfs-ganesha sub-package</div><div class='add'>+</div><div class='add'>+* Thu Mar 12 2015 Kotresh H R &lt;khiremat@redhat.com&gt;</div><div class='add'>+- gfind_missing_files tool is included (#1187140)</div><div class='add'>+</div><div class='add'>+* Tue Mar 03 2015 Aravinda VK &lt;avishwan@redhat.com&gt;</div><div class='add'>+- Included glusterfind files as part of server package.</div><div class='add'>+</div><div class='add'>+* Sun Mar 1 2015 Avra Sengupta &lt;asengupt@redhat.com&gt;</div><div class='add'>+- Added installation of snap-scheduler</div><div class='add'>+</div><div class='add'>+* Thu Feb 26 2015 Kaleb S. KEITHLEY &lt;kkeithle@redhat.com&gt;</div><div class='add'>+- enable cmocka unittest support only when asked for (#1067059)</div><div class='add'>+</div><div class='add'>+* Tue Feb 24 2015 Niels de Vos &lt;ndevos@redhat.com&gt;</div><div class='add'>+- POSIX ACL conversion needs BuildRequires libacl-devel (#1185654)</div><div class='add'>+</div><div class='add'>+* Wed Feb 18 2015 Andreas Schneider &lt;asn@redhat.com&gt;</div><div class='add'>+- Change cmockery2 to cmocka.</div><div class='add'>+</div><div class='add'>+* Wed Feb 18 2015 Kaushal M &lt;kaushal@redhat.com&gt;</div><div class='add'>+- add userspace-rcu as a requirement</div><div class='add'>+</div><div class='add'>+* Fri Feb 13 2015 Gaurav Kumar Garg &lt;ggarg@redhat.com&gt;</div><div class='add'>+- .cmd_log_history file should be renamed to cmd_history.log post</div><div class='add'>+  upgrade (#1165996)</div><div class='add'>+</div><div class='add'>+* Fri Jan 30 2015 Nandaja Varma &lt;nvarma@redhat.com&gt;</div><div class='add'>+- remove checks for rpmbuild/mock from run-tests.sh (#178008)</div><div class='add'>+</div><div class='add'>+* Fri Jan 16 2015 Niels de Vos &lt;ndevos@redhat.com&gt;</div><div class='add'>+- add support for /run/gluster through a tmpfiles.d config file (#1182934)</div><div class='add'>+</div><div class='add'>+* Tue Jan 6 2015 Aravinda VK&lt;avishwan@redhat.com&gt;</div><div class='add'>+- Added new libexec script for mountbroker user management (peer_mountbroker)</div><div class='add'>+</div><div class='add'>+* Fri Dec 12 2014 Niels de Vos &lt;ndevos@redhat.com&gt;</div><div class='add'>+- do not package all /usr/share/glusterfs/* files in regression-tests (#1169005)</div><div class='add'>+</div><div class='add'>+* Fri Sep 26 2014 Kaleb S. KEITHLEY &lt;kkeithle@redhat.com&gt;</div><div class='add'>+- smarter logic in %%post server (#1146426)</div><div class='add'>+</div><div class='add'>+* Wed Sep 24 2014 Balamurugan Arumugam &lt;barumuga@redhat.com&gt;</div><div class='add'>+- remove /sbin/ldconfig as interpreter (#1145989)</div><div class='add'>+</div><div class='add'>+* Fri Sep 5 2014 Lalatendu Mohanty &lt;lmohanty@redhat.com&gt;</div><div class='add'>+- Changed the description as "GlusterFS a distributed filesystem"</div><div class='add'>+</div><div class='add'>+* Tue Aug 5 2014 Kaleb S. KEITHLEY &lt;kkeithle@redhat.com&gt;</div><div class='add'>+- logrotate files (#1126832)</div><div class='add'>+</div><div class='add'>+* Wed Jul 16 2014 Luis Pabon &lt;lpabon@redhat.com&gt;</div><div class='add'>+- Added cmockery2 dependency</div><div class='add'>+</div><div class='add'>+* Fri Jun 27 2014 Kaleb S. KEITHLEY &lt;kkeithle@redhat.com&gt;</div><div class='add'>+- killall --wait in %%post server, (#1113543)</div><div class='add'>+</div><div class='add'>+* Thu Jun 19 2014 Humble Chirammal &lt;hchiramm@redhat.com&gt;</div><div class='add'>+- Added dynamic loading of fuse module with glusterfs-fuse package installation in el5.</div><div class='add'>+</div><div class='add'>+* Thu Jun 12 2014 Varun Shastry &lt;vshastry@redhat.com&gt;</div><div class='add'>+- Add bash completion config to the cli package</div><div class='add'>+</div><div class='add'>+* Tue Jun 03 2014 Vikhyat Umrao &lt;vumrao@redhat.com&gt;</div><div class='add'>+- add nfs-utils package dependency for server package (#1065654)</div><div class='add'>+</div><div class='add'>+* Thu May 22 2014 Poornima G &lt;pgurusid@redhat.com&gt;</div><div class='add'>+- Rename old hookscripts in an RPM-standard way.</div><div class='add'>+</div><div class='add'>+* Tue May 20 2014 Niels de Vos &lt;ndevos@redhat.com&gt;</div><div class='add'>+- Almost drop calling ./autogen.sh</div><div class='add'>+</div><div class='add'>+* Fri Apr 25 2014 Kaleb S. KEITHLEY &lt;kkeithle@redhat.com&gt;</div><div class='add'>+- Sync with Fedora spec (#1091408, #1091392)</div><div class='add'>+</div><div class='add'>+* Fri Apr 25 2014 Arumugam Balamurugan &lt;barumuga@redhat.com&gt;</div><div class='add'>+- fix RHEL 7 build failure "Installed (but unpackaged) file(s) found" (#1058188)</div><div class='add'>+</div><div class='add'>+* Wed Apr 02 2014 Arumugam Balamurugan &lt;barumuga@redhat.com&gt;</div><div class='add'>+- cleanup to rearrange spec file elements</div><div class='add'>+</div><div class='add'>+* Wed Apr 02 2014 Arumugam Balamurugan &lt;barumuga@redhat.com&gt;</div><div class='add'>+- add version/release dynamically (#1074919)</div><div class='add'>+</div><div class='add'>+* Thu Mar 27 2014 Kaleb S. KEITHLEY &lt;kkeithle@redhat.com&gt;</div><div class='add'>+- attr dependency (#1184626)</div><div class='add'>+</div><div class='add'>+* Wed Mar 26 2014 Poornima G &lt;pgurusid@redhat.com&gt;</div><div class='add'>+- Include the hook scripts of add-brick, volume start, stop and set</div><div class='add'>+</div><div class='add'>+* Wed Feb 26 2014 Niels de Vos &lt;ndevos@redhat.com&gt;</div><div class='add'>+- Drop glusterfs-devel dependency from glusterfs-api (#1065750)</div><div class='add'>+</div><div class='add'>+* Wed Feb 19 2014 Justin Clift &lt;justin@gluster.org&gt;</div><div class='add'>+- Rename gluster.py to glupy.py to avoid namespace conflict (#1018619)</div><div class='add'>+- Move the main Glupy files into glusterfs-extra-xlators rpm</div><div class='add'>+- Move the Glupy Translator examples into glusterfs-devel rpm</div><div class='add'>+</div><div class='add'>+* Thu Feb 06 2014 Aravinda VK &lt;avishwan@redhat.com&gt;</div><div class='add'>+- Include geo-replication upgrade scripts and hook scripts.</div><div class='add'>+</div><div class='add'>+* Wed Jan 15 2014 Niels de Vos &lt;ndevos@redhat.com&gt;</div><div class='add'>+- Install /var/lib/glusterd/groups/virt by default</div><div class='add'>+</div><div class='add'>+* Sat Jan 4 2014 Niels de Vos &lt;ndevos@redhat.com&gt;</div><div class='add'>+- The main glusterfs package should not provide glusterfs-libs (#1048489)</div><div class='add'>+</div><div class='add'>+* Tue Dec 10 2013 Kaleb S. KEITHLEY &lt;kkeithle@redhat.com&gt;</div><div class='add'>+- Sync with Fedora glusterfs.spec 3.5.0-0.1.qa3</div><div class='add'>+</div><div class='add'>+* Fri Oct 11 2013 Harshavardhana &lt;fharshav@redhat.com&gt;</div><div class='add'>+- Add '_sharedstatedir' macro to `/var/lib` on &lt;= RHEL5 (#1003184)</div><div class='add'>+</div><div class='add'>+* Wed Oct 9 2013 Kaleb S. KEITHLEY &lt;kkeithle@redhat.com&gt;</div><div class='add'>+- Sync with Fedora glusterfs.spec 3.4.1-2+</div><div class='add'>+</div><div class='add'>+* Wed Oct 9 2013 Niels de Vos &lt;ndevos@redhat.com&gt;</div><div class='add'>+- glusterfs-api-devel requires glusterfs-devel (#1016938, #1017094)</div><div class='add'>+</div><div class='add'>+* Mon Sep 30 2013 Niels de Vos &lt;ndevos@redhat.com&gt;</div><div class='add'>+- Package gfapi.py into the Python site-packages path (#1005146)</div><div class='add'>+</div><div class='add'>+* Tue Sep 17 2013 Harshavardhana &lt;fharshav@redhat.com&gt;</div><div class='add'>+- Provide a new package called "glusterfs-regression-tests" for standalone</div><div class='add'>+  regression testing.</div><div class='add'>+</div><div class='add'>+* Thu Aug 22 2013 Niels de Vos &lt;ndevos@redhat.com&gt;</div><div class='add'>+- Correct the day/date for some entries in this changelog (#1000019)</div><div class='add'>+</div><div class='add'>+* Wed Aug 7 2013 Kaleb S. KEITHLEY &lt;kkeithle@redhat.com&gt;</div><div class='add'>+- Sync with Fedora glusterfs.spec</div><div class='add'>+-  add Requires</div><div class='add'>+-  add -cli subpackage,</div><div class='add'>+-  fix other minor differences with Fedora glusterfs.spec</div><div class='add'>+</div><div class='add'>+* Tue Jul 30 2013 Kaleb S. KEITHLEY &lt;kkeithle@redhat.com&gt;</div><div class='add'>+- Sync with Fedora glusterfs.spec, add glusterfs-libs RPM for oVirt/qemu-kvm</div><div class='add'>+</div><div class='add'>+* Thu Jul 25 2013 Csaba Henk &lt;csaba@redhat.com&gt;</div><div class='add'>+- Added peer_add_secret_pub and peer_gsec_create to %%{_libexecdir}/glusterfs</div><div class='add'>+</div><div class='add'>+* Thu Jul 25 2013 Aravinda VK &lt;avishwan@redhat.com&gt;</div><div class='add'>+- Added gverify.sh to %%{_libexecdir}/glusterfs directory.</div><div class='add'>+</div><div class='add'>+* Thu Jul 25 2013 Harshavardhana &lt;fharshav@redhat.com&gt;</div><div class='add'>+- Allow to build with '--without bd' to disable 'bd' xlator</div><div class='add'>+</div><div class='add'>+* Thu Jun 27 2013 Kaleb S. KEITHLEY &lt;kkeithle@redhat.com&gt;</div><div class='add'>+- fix the hardening fix for shlibs, use %%sed macro, shorter ChangeLog</div><div class='add'>+</div><div class='add'>+* Wed Jun 26 2013 Niels de Vos &lt;ndevos@redhat.com&gt;</div><div class='add'>+- move the mount/api xlator to glusterfs-api</div><div class='add'>+</div><div class='add'>+* Fri Jun 7 2013 Kaleb S. KEITHLEY &lt;kkeithle@redhat.com&gt;</div><div class='add'>+- Sync with Fedora glusterfs.spec, remove G4S/UFO and Swift</div><div class='add'>+</div><div class='add'>+* Mon Mar 4 2013 Niels de Vos &lt;ndevos@redhat.com&gt;</div><div class='add'>+- Package /var/run/gluster so that statedumps can be created</div><div class='add'>+</div><div class='add'>+* Wed Feb 6 2013 Kaleb S. KEITHLEY &lt;kkeithle@redhat.com&gt;</div><div class='add'>+- Sync with Fedora glusterfs.spec</div><div class='add'>+</div><div class='add'>+* Tue Dec 11 2012 Filip Pytloun &lt;filip.pytloun@gooddata.com&gt;</div><div class='add'>+- add sysconfig file</div><div class='add'>+</div><div class='add'>+* Thu Oct 25 2012 Niels de Vos &lt;ndevos@redhat.com&gt;</div><div class='add'>+- Add a sub-package for the OCF resource agents</div><div class='add'>+</div><div class='add'>+* Wed Sep 05 2012 Niels de Vos &lt;ndevos@redhat.com&gt;</div><div class='add'>+- Don't use python-ctypes on SLES (from JÃ¶rg Petersen)</div><div class='add'>+</div><div class='add'>+* Tue Jul 10 2012 Niels de Vos &lt;ndevos@redhat.com&gt;</div><div class='add'>+- Include extras/clear_xattrs.sh in the glusterfs-server sub-package</div><div class='add'>+</div><div class='add'>+* Thu Jun 07 2012 Niels de Vos &lt;ndevos@redhat.com&gt;</div><div class='add'>+- Mark /var/lib/glusterd as owned by glusterfs, subdirs belong to -server</div><div class='add'>+</div><div class='add'>+* Wed May 9 2012 Kaleb S. KEITHLEY &lt;kkeithle[at]redhat.com&gt;</div><div class='add'>+- Add BuildRequires: libxml2-devel so that configure will DTRT on for</div><div class='add'>+- Fedora's Koji build system</div><div class='add'>+</div><div class='add'>+* Wed Nov 9 2011 Joe Julian &lt;me@joejulian.name&gt; - git master</div><div class='add'>+- Merge fedora specfile into gluster's spec.in.</div><div class='add'>+- Add conditionals to allow the same spec file to be used for both 3.1 and 3.2</div><div class='add'>+- http://bugs.gluster.com/show_bug.cgi?id=2970</div><div class='add'>+</div><div class='add'>+* Wed Oct  5 2011 Joe Julian &lt;me@joejulian.name&gt; - 3.2.4-1</div><div class='add'>+- Update to 3.2.4</div><div class='add'>+- Removed the $local_fs requirement from the init scripts as in RHEL/CentOS that's provided</div><div class='add'>+- by netfs, which needs to be started after glusterd.</div><div class='add'>+</div><div class='add'>+* Sun Sep 25 2011 Joe Julian &lt;me@joejulian.name&gt; - 3.2.3-2</div><div class='add'>+- Merged in upstream changes</div><div class='add'>+- Fixed version reporting 3.2git</div><div class='add'>+- Added nfs init script (disabled by default)</div><div class='add'>+</div><div class='add'>+* Thu Sep  1 2011 Joe Julian &lt;me@joejulian.name&gt; - 3.2.3-1</div><div class='add'>+- Update to 3.2.3</div><div class='add'>+</div><div class='add'>+* Tue Jul 19 2011 Joe Julian &lt;me@joejulian.name&gt; - 3.2.2-3</div><div class='add'>+- Add readline and libtermcap dependencies</div><div class='add'>+</div><div class='add'>+* Tue Jul 19 2011 Joe Julian &lt;me@joejulian.name&gt; - 3.2.2-2</div><div class='add'>+- Critical patch to prevent glusterd from walking outside of its own volume during rebalance</div><div class='add'>+</div><div class='add'>+* Thu Jul 14 2011 Joe Julian &lt;me@joejulian.name&gt; - 3.2.2-1</div><div class='add'>+- Update to 3.2.2</div><div class='add'>+</div><div class='add'>+* Wed Jul 13 2011 Joe Julian &lt;me@joejulian.name&gt; - 3.2.1-2</div><div class='add'>+- fix hardcoded path to gsyncd in source to match the actual file location</div><div class='add'>+</div><div class='add'>+* Tue Jun 21 2011 Joe Julian &lt;me@joejulian.name&gt; - 3.2.1</div><div class='add'>+- Update to 3.2.1</div><div class='add'>+</div><div class='add'>+* Mon Jun 20 2011 Joe Julian &lt;me@joejulian.name&gt; - 3.1.5</div><div class='add'>+- Update to 3.1.5</div><div class='add'>+</div><div class='add'>+* Tue May 31 2011 Joe Julian &lt;me@joejulian.name&gt; - 3.1.5-qa1.4</div><div class='add'>+- Current git</div><div class='add'>+</div><div class='add'>+* Sun May 29 2011 Joe Julian &lt;me@joejulian.name&gt; - 3.1.5-qa1.2</div><div class='add'>+- set _sharedstatedir to /var/lib for FHS compliance in RHEL5/CentOS5</div><div class='add'>+- mv /etc/glusterd, if it exists, to the new state dir for upgrading from gluster packaging</div><div class='add'>+</div><div class='add'>+* Sat May 28 2011 Joe Julian &lt;me@joejulian.name&gt; - 3.1.5-qa1.1</div><div class='add'>+- Update to 3.1.5-qa1</div><div class='add'>+- Add patch to remove optimization disabling</div><div class='add'>+- Add patch to remove forced 64 bit compile</div><div class='add'>+- Obsolete glusterfs-core to allow for upgrading from gluster packaging</div><div class='add'>+</div><div class='add'>+* Sat Mar 19 2011 Jonathan Steffan &lt;jsteffan@fedoraproject.org&gt; - 3.1.3-1</div><div class='add'>+- Update to 3.1.3</div><div class='add'>+- Merge in more upstream SPEC changes</div><div class='add'>+- Remove patches from GlusterFS bugzilla #2309 and #2311</div><div class='add'>+- Remove inode-gen.patch</div><div class='add'>+</div><div class='add'>+* Sun Feb 06 2011 Jonathan Steffan &lt;jsteffan@fedoraproject.org&gt; - 3.1.2-3</div><div class='add'>+- Add back in legacy SPEC elements to support older branches</div><div class='add'>+</div><div class='add'>+* Thu Feb 03 2011 Jonathan Steffan &lt;jsteffan@fedoraproject.org&gt; - 3.1.2-2</div><div class='add'>+- Add patches from CloudFS project</div><div class='add'>+</div><div class='add'>+* Tue Jan 25 2011 Jonathan Steffan &lt;jsteffan@fedoraproject.org&gt; - 3.1.2-1</div><div class='add'>+- Update to 3.1.2</div><div class='add'>+</div><div class='add'>+* Wed Jan 5 2011 Dan HorÃ¡k &lt;dan[at]danny.cz&gt; - 3.1.1-3</div><div class='add'>+- no InfiniBand on s390(x)</div><div class='add'>+</div><div class='add'>+* Sat Jan 1 2011 Jonathan Steffan &lt;jsteffan@fedoraproject.org&gt; - 3.1.1-2</div><div class='add'>+- Update to support readline</div><div class='add'>+- Update to not parallel build</div><div class='add'>+</div><div class='add'>+* Mon Dec 27 2010 Silas Sewell &lt;silas@sewell.ch&gt; - 3.1.1-1</div><div class='add'>+- Update to 3.1.1</div><div class='add'>+- Change package names to mirror upstream</div><div class='add'>+</div><div class='add'>+* Mon Dec 20 2010 Jonathan Steffan &lt;jsteffan@fedoraproject.org&gt; - 3.0.7-1</div><div class='add'>+- Update to 3.0.7</div><div class='add'>+</div><div class='add'>+* Wed Jul 28 2010 Jonathan Steffan &lt;jsteffan@fedoraproject.org&gt; - 3.0.5-1</div><div class='add'>+- Update to 3.0.x</div><div class='add'>+</div><div class='add'>+* Sat Apr 10 2010 Jonathan Steffan &lt;jsteffan@fedoraproject.org&gt; - 2.0.9-2</div><div class='add'>+- Move python version requires into a proper BuildRequires otherwise</div><div class='add'>+  the spec always turned off python bindings as python is not part</div><div class='add'>+  of buildsys-build and the chroot will never have python unless we</div><div class='add'>+  require it</div><div class='add'>+- Temporarily set -D_FORTIFY_SOURCE=1 until upstream fixes code</div><div class='add'>+  GlusterFS Bugzilla #197 (#555728)</div><div class='add'>+- Move glusterfs-volgen to devel subpackage (#555724)</div><div class='add'>+- Update description (#554947)</div><div class='add'>+</div><div class='add'>+* Sat Jan 2 2010 Jonathan Steffan &lt;jsteffan@fedoraproject.org&gt; - 2.0.9-1</div><div class='add'>+- Update to 2.0.9</div><div class='add'>+</div><div class='add'>+* Sun Nov 8 2009 Jonathan Steffan &lt;jsteffan@fedoraproject.org&gt; - 2.0.8-1</div><div class='add'>+- Update to 2.0.8</div><div class='add'>+- Remove install of glusterfs-volgen, it's properly added to</div><div class='add'>+  automake upstream now</div><div class='add'>+</div><div class='add'>+* Sat Oct 31 2009 Jonathan Steffan &lt;jsteffan@fedoraproject.org&gt; - 2.0.7-1</div><div class='add'>+- Update to 2.0.7</div><div class='add'>+- Install glusterfs-volgen, until it's properly added to automake</div><div class='add'>+  by upstream</div><div class='add'>+- Add macro to be able to ship more docs</div><div class='add'>+</div><div class='add'>+* Thu Sep 17 2009 Peter Lemenkov &lt;lemenkov@gmail.com&gt; 2.0.6-2</div><div class='add'>+- Rebuilt with new fuse</div><div class='add'>+</div><div class='add'>+* Sat Sep 12 2009 Matthias Saou &lt;http://freshrpms.net/&gt; 2.0.6-1</div><div class='add'>+- Update to 2.0.6.</div><div class='add'>+- No longer default to disable the client on RHEL5 (#522192).</div><div class='add'>+- Update spec file URLs.</div><div class='add'>+</div><div class='add'>+* Mon Jul 27 2009 Matthias Saou &lt;http://freshrpms.net/&gt; 2.0.4-1</div><div class='add'>+- Update to 2.0.4.</div><div class='add'>+</div><div class='add'>+* Thu Jun 11 2009 Matthias Saou &lt;http://freshrpms.net/&gt; 2.0.1-2</div><div class='add'>+- Remove libglusterfs/src/y.tab.c to fix koji F11/devel builds.</div><div class='add'>+</div><div class='add'>+* Sat May 16 2009 Matthias Saou &lt;http://freshrpms.net/&gt; 2.0.1-1</div><div class='add'>+- Update to 2.0.1.</div><div class='add'>+</div><div class='add'>+* Thu May  7 2009 Matthias Saou &lt;http://freshrpms.net/&gt; 2.0.0-1</div><div class='add'>+- Update to 2.0.0 final.</div><div class='add'>+</div><div class='add'>+* Wed Apr 29 2009 Matthias Saou &lt;http://freshrpms.net/&gt; 2.0.0-0.3.rc8</div><div class='add'>+- Move glusterfsd to common, since the client has a symlink to it.</div><div class='add'>+</div><div class='add'>+* Fri Apr 24 2009 Matthias Saou &lt;http://freshrpms.net/&gt; 2.0.0-0.2.rc8</div><div class='add'>+- Update to 2.0.0rc8.</div><div class='add'>+</div><div class='add'>+* Sun Apr 12 2009 Matthias Saou &lt;http://freshrpms.net/&gt; 2.0.0-0.2.rc7</div><div class='add'>+- Update glusterfsd init script to the new style init.</div><div class='add'>+- Update files to match the new default vol file names.</div><div class='add'>+- Include logrotate for glusterfsd, use a pid file by default.</div><div class='add'>+- Include logrotate for glusterfs, using killall for lack of anything better.</div><div class='add'>+</div><div class='add'>+* Sat Apr 11 2009 Matthias Saou &lt;http://freshrpms.net/&gt; 2.0.0-0.1.rc7</div><div class='add'>+- Update to 2.0.0rc7.</div><div class='add'>+- Rename "libs" to "common" and move the binary, man page and log dir there.</div><div class='add'>+</div><div class='add'>+* Tue Feb 24 2009 Fedora Release Engineering &lt;rel-eng@lists.fedoraproject.org&gt;</div><div class='add'>+- Rebuilt for https://fedoraproject.org/wiki/Fedora_11_Mass_Rebuild</div><div class='add'>+</div><div class='add'>+* Mon Feb 16 2009 Matthias Saou &lt;http://freshrpms.net/&gt; 2.0.0-0.1.rc1</div><div class='add'>+- Update to 2.0.0rc1.</div><div class='add'>+- Include new libglusterfsclient.h.</div><div class='add'>+</div><div class='add'>+* Mon Feb 16 2009 Matthias Saou &lt;http://freshrpms.net/&gt; 1.3.12-1</div><div class='add'>+- Update to 1.3.12.</div><div class='add'>+- Remove no longer needed ocreat patch.</div><div class='add'>+</div><div class='add'>+* Thu Jul 17 2008 Matthias Saou &lt;http://freshrpms.net/&gt; 1.3.10-1</div><div class='add'>+- Update to 1.3.10.</div><div class='add'>+- Remove mount patch, it's been included upstream now.</div><div class='add'>+</div><div class='add'>+* Fri May 16 2008 Matthias Saou &lt;http://freshrpms.net/&gt; 1.3.9-1</div><div class='add'>+- Update to 1.3.9.</div><div class='add'>+</div><div class='add'>+* Fri May  9 2008 Matthias Saou &lt;http://freshrpms.net/&gt; 1.3.8-1</div><div class='add'>+- Update to 1.3.8 final.</div><div class='add'>+</div><div class='add'>+* Wed Apr 23 2008 Matthias Saou &lt;http://freshrpms.net/&gt; 1.3.8-0.10</div><div class='add'>+- Include short patch to include fixes from latest TLA 751.</div><div class='add'>+</div><div class='add'>+* Tue Apr 22 2008 Matthias Saou &lt;http://freshrpms.net/&gt; 1.3.8-0.9</div><div class='add'>+- Update to 1.3.8pre6.</div><div class='add'>+- Include glusterfs binary in both the client and server packages, now that</div><div class='add'>+  glusterfsd is a symlink to it instead of a separate binary.</div><div class='add'>+* Sun Feb  3 2008 Matthias Saou &lt;http://freshrpms.net/&gt; 1.3.8-0.8</div><div class='add'>+- Add python version check and disable bindings for version &lt; 2.4.</div><div class='add'>+</div><div class='add'>+* Sun Feb  3 2008 Matthias Saou &lt;http://freshrpms.net/&gt; 1.3.8-0.7</div><div class='add'>+- Add --without client rpmbuild option, make it the default for RHEL (no fuse).</div><div class='add'>+  (I hope "rhel" is the proper default macro name, couldn't find it...)</div><div class='add'>+</div><div class='add'>+* Wed Jan 30 2008 Matthias Saou &lt;http://freshrpms.net/&gt; 1.3.8-0.6</div><div class='add'>+- Add --without ibverbs rpmbuild option to the package.</div><div class='add'>+</div><div class='add'>+* Mon Jan 14 2008 Matthias Saou &lt;http://freshrpms.net/&gt; 1.3.8-0.5</div><div class='add'>+- Update to current TLA again, patch-636 which fixes the known segfaults.</div><div class='add'>+</div><div class='add'>+* Thu Jan 10 2008 Matthias Saou &lt;http://freshrpms.net/&gt; 1.3.8-0.4</div><div class='add'>+- Downgrade to glusterfs--mainline--2.5--patch-628 which is more stable.</div><div class='add'>+</div><div class='add'>+* Tue Jan  8 2008 Matthias Saou &lt;http://freshrpms.net/&gt; 1.3.8-0.3</div><div class='add'>+- Update to current TLA snapshot.</div><div class='add'>+- Include umount.glusterfs wrapper script (really needed? dunno).</div><div class='add'>+- Include patch to mount wrapper to avoid multiple identical mounts.</div><div class='add'>+</div><div class='add'>+* Sun Dec 30 2007 Matthias Saou &lt;http://freshrpms.net/&gt; 1.3.8-0.1</div><div class='add'>+- Update to current TLA snapshot, which includes "volume-name=" fstab option.</div><div class='add'>+</div><div class='add'>+* Mon Dec  3 2007 Matthias Saou &lt;http://freshrpms.net/&gt; 1.3.7-6</div><div class='add'>+- Re-add the /var/log/glusterfs directory in the client sub-package (required).</div><div class='add'>+- Include custom patch to support vol= in fstab for -n glusterfs client option.</div><div class='add'>+</div><div class='add'>+* Mon Nov 26 2007 Matthias Saou &lt;http://freshrpms.net/&gt; 1.3.7-4</div><div class='add'>+- Re-enable libibverbs.</div><div class='add'>+- Check and update License field to GPLv3+.</div><div class='add'>+- Add glusterfs-common obsoletes, to provide upgrade path from old packages.</div><div class='add'>+- Include patch to add mode to O_CREATE opens.</div><div class='ctx'> </div><div class='del'>-* Thu Apr 16 2009 Harshavardhana &lt;harsha@gluster.com&gt; - 2.0</div><div class='del'>-- Galore of updates including new packages added common,</div><div class='del'>-  client,server splitting the original package. rpmbuild </div><div class='del'>-  fully restructured to adhere to Fedora rpm standards. </div><div class='del'>-  Older changelog removed as there were warnings when </div><div class='del'>-  tried with 'rpmlint'. </div><div class='add'>+* Thu Nov 22 2007 Matthias Saou &lt;http://freshrpms.net/&gt; 1.3.7-3</div><div class='add'>+- Remove Makefile* files from examples.</div><div class='add'>+- Include RHEL/Fedora type init script, since the included ones don't do.</div><div class='ctx'> </div><div class='add'>+* Wed Nov 21 2007 Matthias Saou &lt;http://freshrpms.net/&gt; 1.3.7-1</div><div class='add'>+- Major spec file cleanup.</div><div class='add'>+- Add missing %%clean section.</div><div class='add'>+- Fix ldconfig calls (weren't set for the proper sub-package).</div><div class='ctx'> </div><div class='add'>+* Sat Aug 4 2007 Matt Paine &lt;matt@mattsoftware.com&gt; - 1.3.pre7</div><div class='add'>+- Added support to build rpm without ibverbs support (use --without ibverbs</div><div class='add'>+  switch)</div><div class='ctx'> </div><div class='add'>+* Sun Jul 15 2007 Matt Paine &lt;matt@mattsoftware.com&gt; - 1.3.pre6</div><div class='add'>+- Initial spec file</div><div class='head'>diff --git a/glusterfsd/src/Makefile.am b/glusterfsd/src/Makefile.am<br/>index 8cfe4b55461..a0a778158d8 100644<br/>--- a/<a href='/cgit/glusterfs.git/tree/glusterfsd/src/Makefile.am?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>glusterfsd/src/Makefile.am</a><br/>+++ b/<a href='/cgit/glusterfs.git/tree/glusterfsd/src/Makefile.am?id=d1d7a6f35c816822fab51c820e25023863c239c1'>glusterfsd/src/Makefile.am</a></div><div class='hunk'>@@ -1,25 +1,38 @@</div><div class='ctx'> sbin_PROGRAMS = glusterfsd</div><div class='add'>+if WITH_SERVER</div><div class='add'>+sbin_PROGRAMS += glusterfsd gf_attach</div><div class='add'>+endif</div><div class='ctx'> </div><div class='ctx'> glusterfsd_SOURCES = glusterfsd.c glusterfsd-mgmt.c</div><div class='del'>-if GF_DARWIN_HOST_OS</div><div class='del'>-glusterfsd_SOURCES += $(CONTRIBDIR)/apple/daemon.c</div><div class='del'>-endif</div><div class='ctx'> glusterfsd_LDADD = $(top_builddir)/libglusterfs/src/libglusterfs.la \</div><div class='ctx'> 	$(top_builddir)/rpc/rpc-lib/src/libgfrpc.la \</div><div class='del'>-	$(top_builddir)/rpc/xdr/src/libgfxdr.la \</div><div class='del'>-	$(GF_LDADD)</div><div class='del'>-glusterfsd_LDFLAGS = $(GF_LDFLAGS) $(GF_GLUSTERFS_LDFLAGS)</div><div class='del'>-noinst_HEADERS = glusterfsd.h glusterfsd-common.h glusterfsd-mem-types.h</div><div class='add'>+	$(top_builddir)/rpc/xdr/src/libgfxdr.la $(GF_LDADD) $(LIB_DL)</div><div class='add'>+glusterfsd_LDFLAGS = $(GF_LDFLAGS)</div><div class='add'>+</div><div class='add'>+gf_attach_SOURCES = gf_attach.c</div><div class='add'>+gf_attach_LDADD   = $(top_builddir)/libglusterfs/src/libglusterfs.la \</div><div class='add'>+		    $(top_builddir)/api/src/libgfapi.la \</div><div class='add'>+		    $(top_builddir)/rpc/rpc-lib/src/libgfrpc.la \</div><div class='add'>+		    $(top_builddir)/rpc/xdr/src/libgfxdr.la</div><div class='add'>+gf_attach_LDFLAGS = $(GF_LDFLAGS)</div><div class='ctx'> </div><div class='del'>-AM_CFLAGS = -fPIC -Wall -D_FILE_OFFSET_BITS=64 -D_GNU_SOURCE -D$(GF_HOST_OS)\</div><div class='add'>+noinst_HEADERS = glusterfsd.h glusterfsd-mem-types.h glusterfsd-messages.h</div><div class='add'>+</div><div class='add'>+AM_CPPFLAGS = $(GF_CPPFLAGS) \</div><div class='ctx'> 	-I$(top_srcdir)/libglusterfs/src -DDATADIR=\"$(localstatedir)\" \</div><div class='ctx'> 	-DCONFDIR=\"$(sysconfdir)/glusterfs\" $(GF_GLUSTERFS_CFLAGS) \</div><div class='del'>-	-I$(top_srcdir)/rpc/rpc-lib/src -I$(top_srcdir)/rpc/xdr/src</div><div class='del'>-if GF_DARWIN_HOST_OS</div><div class='del'>-AM_CFLAGS += -I$(CONTRIBDIR)/apple</div><div class='del'>-endif</div><div class='add'>+	-DXLATORDIR=\"$(libdir)/glusterfs/$(PACKAGE_VERSION)/xlator\" \</div><div class='add'>+	-DLIBEXECDIR=\"$(GLUSTERFS_LIBEXECDIR)\"\</div><div class='add'>+	-I$(top_srcdir)/rpc/rpc-lib/src \</div><div class='add'>+	-I$(top_srcdir)/rpc/xdr/src \</div><div class='add'>+	-I$(top_builddir)/rpc/xdr/src \</div><div class='add'>+	-I$(top_srcdir)/xlators/nfs/server/src \</div><div class='add'>+	-I$(top_srcdir)/xlators/protocol/server/src \</div><div class='add'>+	-I$(top_srcdir)/api/src</div><div class='ctx'> </div><div class='del'>-CLEANFILES = </div><div class='add'>+AM_CFLAGS = -Wall $(GF_CFLAGS)</div><div class='add'>+</div><div class='add'>+CLEANFILES =</div><div class='ctx'> </div><div class='ctx'> $(top_builddir)/libglusterfs/src/libglusterfs.la:</div><div class='ctx'> 	$(MAKE) -C $(top_builddir)/libglusterfs/src/ all</div><div class='hunk'>@@ -30,8 +43,12 @@ uninstall-local:</div><div class='ctx'> </div><div class='ctx'> install-data-local:</div><div class='ctx'> 	$(INSTALL) -d -m 755 $(DESTDIR)$(localstatedir)/run</div><div class='add'>+	$(INSTALL) -d -m 755 $(DESTDIR)$(localstatedir)/run/gluster</div><div class='ctx'> 	$(INSTALL) -d -m 755 $(DESTDIR)$(localstatedir)/log/glusterfs</div><div class='add'>+	$(INSTALL) -d -m 755 $(DESTDIR)$(sbindir)</div><div class='ctx'> 	rm -f $(DESTDIR)$(sbindir)/glusterfs</div><div class='del'>-	rm -f $(DESTDIR)$(sbindir)/glusterd</div><div class='ctx'> 	ln -s glusterfsd $(DESTDIR)$(sbindir)/glusterfs</div><div class='add'>+if WITH_SERVER</div><div class='add'>+	rm -f $(DESTDIR)$(sbindir)/glusterd</div><div class='ctx'> 	ln -s glusterfsd $(DESTDIR)$(sbindir)/glusterd</div><div class='add'>+endif</div><div class='head'>diff --git a/glusterfsd/src/gf_attach.c b/glusterfsd/src/gf_attach.c<br/>new file mode 100644<br/>index 00000000000..c553b0b1f61<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/glusterfsd/src/gf_attach.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>glusterfsd/src/gf_attach.c</a></div><div class='hunk'>@@ -0,0 +1,241 @@</div><div class='add'>+/*</div><div class='add'>+ * Copyright (c) 2016 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+ * This file is part of GlusterFS.</div><div class='add'>+ *</div><div class='add'>+ * This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+ * General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+ * later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+ * cases as published by the Free Software Foundation.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+#include &lt;stdio.h&gt;</div><div class='add'>+#include &lt;stdlib.h&gt;</div><div class='add'>+#include &lt;unistd.h&gt;</div><div class='add'>+</div><div class='add'>+#include &lt;glusterfs/glusterfs.h&gt;</div><div class='add'>+#include "glfs-internal.h"</div><div class='add'>+#include "rpc-clnt.h"</div><div class='add'>+#include "protocol-common.h"</div><div class='add'>+#include "xdr-generic.h"</div><div class='add'>+#include "glusterd1-xdr.h"</div><div class='add'>+</div><div class='add'>+/* In seconds */</div><div class='add'>+#define CONNECT_TIMEOUT 60</div><div class='add'>+#define REPLY_TIMEOUT 120</div><div class='add'>+</div><div class='add'>+int done = 0;</div><div class='add'>+int rpc_status;</div><div class='add'>+</div><div class='add'>+pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;</div><div class='add'>+pthread_cond_t cond = PTHREAD_COND_INITIALIZER;</div><div class='add'>+</div><div class='add'>+struct rpc_clnt_procedure gf_attach_actors[GLUSTERD_BRICK_MAXVALUE] = {</div><div class='add'>+    [GLUSTERD_BRICK_NULL] = {"NULL", NULL},</div><div class='add'>+    [GLUSTERD_BRICK_OP] = {"BRICK_OP", NULL},</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct rpc_clnt_program gf_attach_prog = {</div><div class='add'>+    .progname = "brick operations",</div><div class='add'>+    .prognum = GD_BRICK_PROGRAM,</div><div class='add'>+    .progver = GD_BRICK_VERSION,</div><div class='add'>+    .proctable = gf_attach_actors,</div><div class='add'>+    .numproc = GLUSTERD_BRICK_MAXVALUE,</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+my_callback(struct rpc_req *req, struct iovec *iov, int count, void *frame)</div><div class='add'>+{</div><div class='add'>+    pthread_mutex_lock(&amp;mutex);</div><div class='add'>+    rpc_status = req-&gt;rpc_status;</div><div class='add'>+    done = 1;</div><div class='add'>+    /* Signal main thread which is the only waiter */</div><div class='add'>+    pthread_cond_signal(&amp;cond);</div><div class='add'>+    pthread_mutex_unlock(&amp;mutex);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* copied from gd_syncop_submit_request */</div><div class='add'>+int</div><div class='add'>+send_brick_req(xlator_t *this, struct rpc_clnt *rpc, char *path, int op)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    struct timespec ts;</div><div class='add'>+    struct iobuf *iobuf = NULL;</div><div class='add'>+    struct iobref *iobref = NULL;</div><div class='add'>+    struct iovec iov = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    ssize_t req_size = 0;</div><div class='add'>+    call_frame_t *frame = NULL;</div><div class='add'>+    gd1_mgmt_brick_op_req brick_req;</div><div class='add'>+    void *req = &amp;brick_req;</div><div class='add'>+</div><div class='add'>+    brick_req.op = op;</div><div class='add'>+    brick_req.name = path;</div><div class='add'>+    brick_req.input.input_val = NULL;</div><div class='add'>+    brick_req.input.input_len = 0;</div><div class='add'>+    brick_req.dict.dict_val = NULL;</div><div class='add'>+    brick_req.dict.dict_len = 0;</div><div class='add'>+</div><div class='add'>+    req_size = xdr_sizeof((xdrproc_t)xdr_gd1_mgmt_brick_op_req, req);</div><div class='add'>+    iobuf = iobuf_get2(rpc-&gt;ctx-&gt;iobuf_pool, req_size);</div><div class='add'>+    if (!iobuf)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    iobref = iobref_new();</div><div class='add'>+    if (!iobref)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    iobref_add(iobref, iobuf);</div><div class='add'>+</div><div class='add'>+    iov.iov_base = iobuf-&gt;ptr;</div><div class='add'>+    iov.iov_len = iobuf_pagesize(iobuf);</div><div class='add'>+</div><div class='add'>+    /* Create the xdr payload */</div><div class='add'>+    ret = xdr_serialize_generic(iov, req, (xdrproc_t)xdr_gd1_mgmt_brick_op_req);</div><div class='add'>+    if (ret == -1)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    iov.iov_len = ret;</div><div class='add'>+</div><div class='add'>+    /* Wait for connection */</div><div class='add'>+    timespec_now_realtime(&amp;ts);</div><div class='add'>+    ts.tv_sec += CONNECT_TIMEOUT;</div><div class='add'>+    pthread_mutex_lock(&amp;rpc-&gt;conn.lock);</div><div class='add'>+    {</div><div class='add'>+        while (!rpc-&gt;conn.connected)</div><div class='add'>+            if (pthread_cond_timedwait(&amp;rpc-&gt;conn.cond, &amp;rpc-&gt;conn.lock, &amp;ts) ==</div><div class='add'>+                ETIMEDOUT) {</div><div class='add'>+                fprintf(stderr, "timeout waiting for RPC connection\n");</div><div class='add'>+                pthread_mutex_unlock(&amp;rpc-&gt;conn.lock);</div><div class='add'>+                return EXIT_FAILURE;</div><div class='add'>+            }</div><div class='add'>+    }</div><div class='add'>+    pthread_mutex_unlock(&amp;rpc-&gt;conn.lock);</div><div class='add'>+</div><div class='add'>+    frame = create_frame(this, this-&gt;ctx-&gt;pool);</div><div class='add'>+    if (!frame) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Send the msg */</div><div class='add'>+    ret = rpc_clnt_submit(rpc, &amp;gf_attach_prog, op, my_callback, &amp;iov, 1, NULL,</div><div class='add'>+                          0, iobref, frame, NULL, 0, NULL, 0, NULL);</div><div class='add'>+    if (!ret) {</div><div class='add'>+        /* OK, wait for callback */</div><div class='add'>+        timespec_now_realtime(&amp;ts);</div><div class='add'>+        ts.tv_sec += REPLY_TIMEOUT;</div><div class='add'>+        pthread_mutex_lock(&amp;mutex);</div><div class='add'>+        {</div><div class='add'>+            while (!done)</div><div class='add'>+                if (pthread_cond_timedwait(&amp;cond, &amp;mutex, &amp;ts) == ETIMEDOUT) {</div><div class='add'>+                    fprintf(stderr, "timeout waiting for RPC reply\n");</div><div class='add'>+                    pthread_mutex_unlock(&amp;mutex);</div><div class='add'>+                    return EXIT_FAILURE;</div><div class='add'>+                }</div><div class='add'>+        }</div><div class='add'>+        pthread_mutex_unlock(&amp;mutex);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+</div><div class='add'>+    iobref_unref(iobref);</div><div class='add'>+    iobuf_unref(iobuf);</div><div class='add'>+    if (frame)</div><div class='add'>+        STACK_DESTROY(frame-&gt;root);</div><div class='add'>+</div><div class='add'>+    if (rpc_status != 0) {</div><div class='add'>+        fprintf(stderr, "got error %d on RPC\n", rpc_status);</div><div class='add'>+        return EXIT_FAILURE;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    printf("OK\n");</div><div class='add'>+    return EXIT_SUCCESS;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+usage(char *prog)</div><div class='add'>+{</div><div class='add'>+    fprintf(stderr, "Usage: %s uds_path volfile_path (to attach)\n", prog);</div><div class='add'>+    fprintf(stderr, "       %s -d uds_path brick_path (to detach)\n", prog);</div><div class='add'>+</div><div class='add'>+    return EXIT_FAILURE;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+main(int argc, char *argv[])</div><div class='add'>+{</div><div class='add'>+    glfs_t *fs;</div><div class='add'>+    struct rpc_clnt *rpc;</div><div class='add'>+    dict_t *options;</div><div class='add'>+    int ret;</div><div class='add'>+    int op = GLUSTERD_BRICK_ATTACH;</div><div class='add'>+</div><div class='add'>+    for (;;) {</div><div class='add'>+        switch (getopt(argc, argv, "d")) {</div><div class='add'>+            case 'd':</div><div class='add'>+                op = GLUSTERD_BRICK_TERMINATE;</div><div class='add'>+                break;</div><div class='add'>+            case -1:</div><div class='add'>+                goto done_parsing;</div><div class='add'>+            default:</div><div class='add'>+                return usage(argv[0]);</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+done_parsing:</div><div class='add'>+    if (optind != (argc - 2)) {</div><div class='add'>+        return usage(argv[0]);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    fs = glfs_new("gf-attach");</div><div class='add'>+    if (!fs) {</div><div class='add'>+        fprintf(stderr, "glfs_new failed\n");</div><div class='add'>+        return EXIT_FAILURE;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    (void)glfs_set_logging(fs, "/dev/stderr", 7);</div><div class='add'>+    /*</div><div class='add'>+     * This will actually fail because we haven't defined a volume, but</div><div class='add'>+     * it will do enough initialization to get us going.</div><div class='add'>+     */</div><div class='add'>+    (void)glfs_init(fs);</div><div class='add'>+</div><div class='add'>+    options = dict_new();</div><div class='add'>+    if (!options) {</div><div class='add'>+        return EXIT_FAILURE;</div><div class='add'>+    }</div><div class='add'>+    ret = dict_set_str(options, "transport-type", "socket");</div><div class='add'>+    if (ret != 0) {</div><div class='add'>+        fprintf(stderr, "failed to set transport type\n");</div><div class='add'>+        return EXIT_FAILURE;</div><div class='add'>+    }</div><div class='add'>+    ret = dict_set_str(options, "transport.address-family", "unix");</div><div class='add'>+    if (ret != 0) {</div><div class='add'>+        fprintf(stderr, "failed to set address family\n");</div><div class='add'>+        return EXIT_FAILURE;</div><div class='add'>+    }</div><div class='add'>+    ret = dict_set_str(options, "transport.socket.connect-path", argv[optind]);</div><div class='add'>+    if (ret != 0) {</div><div class='add'>+        fprintf(stderr, "failed to set connect path\n");</div><div class='add'>+        return EXIT_FAILURE;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    rpc = rpc_clnt_new(options, fs-&gt;ctx-&gt;master, "gf-attach-rpc", 0);</div><div class='add'>+    if (!rpc) {</div><div class='add'>+        fprintf(stderr, "rpc_clnt_new failed\n");</div><div class='add'>+        return EXIT_FAILURE;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (rpc_clnt_register_notify(rpc, NULL, NULL) != 0) {</div><div class='add'>+        fprintf(stderr, "rpc_clnt_register_notify failed\n");</div><div class='add'>+        return EXIT_FAILURE;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (rpc_clnt_start(rpc) != 0) {</div><div class='add'>+        fprintf(stderr, "rpc_clnt_start failed\n");</div><div class='add'>+        return EXIT_FAILURE;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return send_brick_req(fs-&gt;ctx-&gt;master, rpc, argv[optind + 1], op);</div><div class='add'>+}</div><div class='head'>diff --git a/glusterfsd/src/glusterfsd-common.h b/glusterfsd/src/glusterfsd-common.h<br/>deleted file mode 100644<br/>index 47f94721003..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/glusterfsd/src/glusterfsd-common.h?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>glusterfsd/src/glusterfsd-common.h</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,30 +0,0 @@</div><div class='del'>-/*</div><div class='del'>-   Copyright (c) 2006-2010 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='del'>-   This file is part of GlusterFS.</div><div class='del'>-</div><div class='del'>-   GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-   it under the terms of the GNU General Public License as published</div><div class='del'>-   by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-   or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-   GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-   WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-   General Public License for more details.</div><div class='del'>-</div><div class='del'>-   You should have received a copy of the GNU General Public License</div><div class='del'>-   along with this program.  If not, see</div><div class='del'>-   &lt;http://www.gnu.org/licenses/&gt;.</div><div class='del'>-*/</div><div class='del'>-</div><div class='del'>-#ifndef __GLUSTERFSD_COMMON_H__</div><div class='del'>-#define __GLUSTERFSD_COMMON_H__</div><div class='del'>-</div><div class='del'>-#define ZR_MOUNTPOINT_OPT       "mountpoint"</div><div class='del'>-#define ZR_ATTR_TIMEOUT_OPT     "attribute-timeout"</div><div class='del'>-#define ZR_ENTRY_TIMEOUT_OPT    "entry-timeout"</div><div class='del'>-#define ZR_DIRECT_IO_OPT        "direct-io-mode"</div><div class='del'>-#define ZR_STRICT_VOLFILE_CHECK "strict-volfile-check"</div><div class='del'>-#define ZR_DUMP_FUSE            "dump-fuse"</div><div class='del'>-</div><div class='del'>-#endif</div><div class='head'>diff --git a/glusterfsd/src/glusterfsd-mem-types.h b/glusterfsd/src/glusterfsd-mem-types.h<br/>index 1cca177889b..e59b558deb0 100644<br/>--- a/<a href='/cgit/glusterfs.git/tree/glusterfsd/src/glusterfsd-mem-types.h?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>glusterfsd/src/glusterfsd-mem-types.h</a><br/>+++ b/<a href='/cgit/glusterfs.git/tree/glusterfsd/src/glusterfsd-mem-types.h?id=d1d7a6f35c816822fab51c820e25023863c239c1'>glusterfsd/src/glusterfsd-mem-types.h</a></div><div class='hunk'>@@ -1,36 +1,27 @@</div><div class='ctx'> /*</div><div class='del'>-   Copyright (c) 2006-2009 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='del'>-   This file is part of GlusterFS.</div><div class='add'>+  Copyright (c) 2006-2012 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='ctx'> </div><div class='del'>-   GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-   it under the terms of the GNU General Public License as published</div><div class='del'>-   by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-   or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-   GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-   WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-   General Public License for more details.</div><div class='del'>-</div><div class='del'>-   You should have received a copy of the GNU General Public License</div><div class='del'>-   along with this program.  If not, see</div><div class='del'>-   &lt;http://www.gnu.org/licenses/&gt;.</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='ctx'> */</div><div class='del'>-</div><div class='ctx'> #ifndef __GLUSTERFSD_MEM_TYPES_H__</div><div class='ctx'> #define __GLUSTERFSD_MEM_TYPES_H__</div><div class='ctx'> </div><div class='del'>-#include "mem-types.h"</div><div class='add'>+#include &lt;glusterfs/mem-types.h&gt;</div><div class='ctx'> </div><div class='ctx'> #define GF_MEM_TYPE_START (gf_common_mt_end + 1)</div><div class='ctx'> </div><div class='ctx'> enum gfd_mem_types_ {</div><div class='del'>-        gfd_mt_xlator_list_t = GF_MEM_TYPE_START,</div><div class='del'>-        gfd_mt_xlator_t,</div><div class='del'>-        gfd_mt_xlator_cmdline_option_t,</div><div class='del'>-        gfd_mt_char,</div><div class='del'>-        gfd_mt_call_pool_t,</div><div class='del'>-        gfd_mt_end</div><div class='add'>+    gfd_mt_xlator_list_t = GF_MEM_TYPE_START,</div><div class='add'>+    gfd_mt_xlator_t,</div><div class='add'>+    gfd_mt_server_cmdline_t,</div><div class='add'>+    gfd_mt_xlator_cmdline_option_t,</div><div class='add'>+    gfd_mt_char,</div><div class='add'>+    gfd_mt_call_pool_t,</div><div class='add'>+    gfd_mt_end</div><div class='ctx'> </div><div class='ctx'> };</div><div class='ctx'> #endif</div><div class='head'>diff --git a/glusterfsd/src/glusterfsd-messages.h b/glusterfsd/src/glusterfsd-messages.h<br/>new file mode 100644<br/>index 00000000000..0cdbffa71ea<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/glusterfsd/src/glusterfsd-messages.h?id=d1d7a6f35c816822fab51c820e25023863c239c1'>glusterfsd/src/glusterfsd-messages.h</a></div><div class='hunk'>@@ -0,0 +1,93 @@</div><div class='add'>+/*</div><div class='add'>+  Copyright (c) 2013 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#ifndef _GLUSTERFSD_MESSAGES_H_</div><div class='add'>+#define _GLUSTERFSD_MESSAGES_H_</div><div class='add'>+</div><div class='add'>+#include &lt;glusterfs/glfs-message-id.h&gt;</div><div class='add'>+</div><div class='add'>+/* To add new message IDs, append new identifiers at the end of the list.</div><div class='add'>+ *</div><div class='add'>+ * Never remove a message ID. If it's not used anymore, you can rename it or</div><div class='add'>+ * leave it as it is, but not delete it. This is to prevent reutilization of</div><div class='add'>+ * IDs by other messages.</div><div class='add'>+ *</div><div class='add'>+ * The component name must match one of the entries defined in</div><div class='add'>+ * glfs-message-id.h.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+GLFS_MSGID(</div><div class='add'>+    GLUSTERFSD, glusterfsd_msg_1, glusterfsd_msg_2, glusterfsd_msg_3,</div><div class='add'>+    glusterfsd_msg_4, glusterfsd_msg_5, glusterfsd_msg_6, glusterfsd_msg_7,</div><div class='add'>+    glusterfsd_msg_8, glusterfsd_msg_9, glusterfsd_msg_10, glusterfsd_msg_11,</div><div class='add'>+    glusterfsd_msg_12, glusterfsd_msg_13, glusterfsd_msg_14, glusterfsd_msg_15,</div><div class='add'>+    glusterfsd_msg_16, glusterfsd_msg_17, glusterfsd_msg_18, glusterfsd_msg_19,</div><div class='add'>+    glusterfsd_msg_20, glusterfsd_msg_21, glusterfsd_msg_22, glusterfsd_msg_23,</div><div class='add'>+    glusterfsd_msg_24, glusterfsd_msg_25, glusterfsd_msg_26, glusterfsd_msg_27,</div><div class='add'>+    glusterfsd_msg_28, glusterfsd_msg_29, glusterfsd_msg_30, glusterfsd_msg_31,</div><div class='add'>+    glusterfsd_msg_32, glusterfsd_msg_33, glusterfsd_msg_34, glusterfsd_msg_35,</div><div class='add'>+    glusterfsd_msg_36, glusterfsd_msg_37, glusterfsd_msg_38, glusterfsd_msg_39,</div><div class='add'>+    glusterfsd_msg_40, glusterfsd_msg_41, glusterfsd_msg_42, glusterfsd_msg_43,</div><div class='add'>+    glusterfsd_msg_029, glusterfsd_msg_041, glusterfsd_msg_042);</div><div class='add'>+</div><div class='add'>+#define glusterfsd_msg_1_STR "Could not create absolute mountpoint path"</div><div class='add'>+#define glusterfsd_msg_2_STR "Could not get current working directory"</div><div class='add'>+#define glusterfsd_msg_4_STR "failed to set mount-point to options dictionary"</div><div class='add'>+#define glusterfsd_msg_3_STR "failed to set dict value for key"</div><div class='add'>+#define glusterfsd_msg_5_STR "failed to set disable for key"</div><div class='add'>+#define glusterfsd_msg_6_STR "failed to set enable for key"</div><div class='add'>+#define glusterfsd_msg_7_STR                                                   \</div><div class='add'>+    "Not a client process, not performing mount operation"</div><div class='add'>+#define glusterfsd_msg_8_STR "MOUNT_POINT initialization failed"</div><div class='add'>+#define glusterfsd_msg_9_STR "loading volume file failed"</div><div class='add'>+#define glusterfsd_msg_10_STR "xlator option is invalid"</div><div class='add'>+#define glusterfsd_msg_11_STR "Fetching the volume file from server..."</div><div class='add'>+#define glusterfsd_msg_12_STR "volume initialization failed"</div><div class='add'>+#define glusterfsd_msg_34_STR "memory init failed"</div><div class='add'>+#define glusterfsd_msg_13_STR "ERROR: glusterfs uuid generation failed"</div><div class='add'>+#define glusterfsd_msg_14_STR "ERROR: glusterfs pool creation failed"</div><div class='add'>+#define glusterfsd_msg_15_STR                                                  \</div><div class='add'>+    "ERROR: '--volfile-id' is mandatory if '-s' OR '--volfile-server' option " \</div><div class='add'>+    "is given"</div><div class='add'>+#define glusterfsd_msg_16_STR "ERROR: parsing the volfile failed"</div><div class='add'>+#define glusterfsd_msg_33_STR                                                  \</div><div class='add'>+    "obsolete option '--volfile-max-fecth-attempts or fetch-attempts' was "    \</div><div class='add'>+    "provided"</div><div class='add'>+#define glusterfsd_msg_17_STR "pidfile open failed"</div><div class='add'>+#define glusterfsd_msg_18_STR "pidfile lock failed"</div><div class='add'>+#define glusterfsd_msg_20_STR "pidfile truncation failed"</div><div class='add'>+#define glusterfsd_msg_21_STR "pidfile write failed"</div><div class='add'>+#define glusterfsd_msg_22_STR "failed to exeute pthread_sigmask"</div><div class='add'>+#define glusterfsd_msg_23_STR "failed to create pthread"</div><div class='add'>+#define glusterfsd_msg_24_STR "daemonization failed"</div><div class='add'>+#define glusterfsd_msg_25_STR "mount failed"</div><div class='add'>+#define glusterfsd_msg_26_STR "failed to construct the graph"</div><div class='add'>+#define glusterfsd_msg_27_STR "fuse xlator cannot be specified in volume file"</div><div class='add'>+#define glusterfsd_msg_28_STR "Cannot reach volume specification file"</div><div class='add'>+#define glusterfsd_msg_29_STR "ERROR: glusterfsd context not initialized"</div><div class='add'>+#define glusterfsd_msg_43_STR                                                  \</div><div class='add'>+    "command line argument --brick-mux is valid only for brick process"</div><div class='add'>+#define glusterfsd_msg_029_STR "failed to create command line string"</div><div class='add'>+#define glusterfsd_msg_30_STR "Started running version"</div><div class='add'>+#define glusterfsd_msg_31_STR "Could not create new sync-environment"</div><div class='add'>+#define glusterfsd_msg_40_STR "No change in volfile, countinuing"</div><div class='add'>+#define glusterfsd_msg_39_STR "Unable to create/delete temporary file"</div><div class='add'>+#define glusterfsd_msg_38_STR                                                  \</div><div class='add'>+    "Not processing brick-op since volume graph is not yet active"</div><div class='add'>+#define glusterfsd_msg_35_STR "rpc req buffer unserialization failed"</div><div class='add'>+#define glusterfsd_msg_36_STR "problem in xlator loading"</div><div class='add'>+#define glusterfsd_msg_37_STR "failed to get dict value"</div><div class='add'>+#define glusterfsd_msg_41_STR "received attach request for volfile"</div><div class='add'>+#define glusterfsd_msg_42_STR "failed to unserialize xdata to dictionary"</div><div class='add'>+#define glusterfsd_msg_041_STR "can't detach. flie not found"</div><div class='add'>+#define glusterfsd_msg_042_STR                                                 \</div><div class='add'>+    "couldnot detach old graph. Aborting the reconfiguration operation"</div><div class='add'>+</div><div class='add'>+#endif /* !_GLUSTERFSD_MESSAGES_H_ */</div><div class='head'>diff --git a/glusterfsd/src/glusterfsd-mgmt.c b/glusterfsd/src/glusterfsd-mgmt.c<br/>index a4a7422cfcf..eaf6796e4c3 100644<br/>--- a/<a href='/cgit/glusterfs.git/tree/glusterfsd/src/glusterfsd-mgmt.c?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>glusterfsd/src/glusterfsd-mgmt.c</a><br/>+++ b/<a href='/cgit/glusterfs.git/tree/glusterfsd/src/glusterfsd-mgmt.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>glusterfsd/src/glusterfsd-mgmt.c</a></div><div class='hunk'>@@ -1,492 +1,3055 @@</div><div class='ctx'> /*</div><div class='del'>-  Copyright (c) 2007-2009 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='del'>-  This file is part of GlusterFS.</div><div class='del'>-</div><div class='del'>-  GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-  it under the terms of the GNU General Public License as published</div><div class='del'>-  by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-  or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-  GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-  WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-  General Public License for more details.</div><div class='del'>-</div><div class='del'>-  You should have received a copy of the GNU General Public License</div><div class='del'>-  along with this program.  If not, see</div><div class='del'>-  &lt;http://www.gnu.org/licenses/&gt;.</div><div class='del'>-*/</div><div class='add'>+   Copyright (c) 2007-2012 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+   This file is part of GlusterFS.</div><div class='ctx'> </div><div class='add'>+   This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+   General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+   later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+   cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='ctx'> #include &lt;stdio.h&gt;</div><div class='ctx'> #include &lt;sys/types.h&gt;</div><div class='ctx'> #include &lt;sys/wait.h&gt;</div><div class='ctx'> #include &lt;stdlib.h&gt;</div><div class='add'>+#include &lt;signal.h&gt;</div><div class='ctx'> </div><div class='del'>-#ifndef _CONFIG_H</div><div class='del'>-#define _CONFIG_H</div><div class='del'>-#include "config.h"</div><div class='del'>-#endif /* _CONFIG_H */</div><div class='del'>-</div><div class='del'>-#include "glusterfs.h"</div><div class='del'>-#include "stack.h"</div><div class='del'>-#include "dict.h"</div><div class='del'>-#include "event.h"</div><div class='del'>-#include "defaults.h"</div><div class='add'>+#include &lt;glusterfs/glusterfs.h&gt;</div><div class='add'>+#include &lt;glusterfs/dict.h&gt;</div><div class='add'>+#include &lt;glusterfs/gf-event.h&gt;</div><div class='add'>+#include &lt;glusterfs/defaults.h&gt;</div><div class='ctx'> </div><div class='ctx'> #include "rpc-clnt.h"</div><div class='ctx'> #include "protocol-common.h"</div><div class='add'>+#include "glusterfsd-messages.h"</div><div class='ctx'> #include "glusterfs3.h"</div><div class='del'>-#include "portmap.h"</div><div class='del'>-</div><div class='del'>-static char is_mgmt_rpc_reconnect;</div><div class='del'>-</div><div class='del'>-typedef ssize_t (*mgmt_serialize_t) (struct iovec outmsg, void *args);</div><div class='add'>+#include "portmap-xdr.h"</div><div class='add'>+#include "xdr-generic.h"</div><div class='add'>+</div><div class='add'>+#include "glusterfsd.h"</div><div class='add'>+#include "rpcsvc.h"</div><div class='add'>+#include "cli1-xdr.h"</div><div class='add'>+#include &lt;glusterfs/statedump.h&gt;</div><div class='add'>+#include &lt;glusterfs/syncop.h&gt;</div><div class='add'>+#include &lt;glusterfs/xlator.h&gt;</div><div class='add'>+#include &lt;glusterfs/syscall.h&gt;</div><div class='add'>+#include &lt;glusterfs/monitoring.h&gt;</div><div class='add'>+#include "server.h"</div><div class='add'>+</div><div class='add'>+static gf_boolean_t is_mgmt_rpc_reconnect = _gf_false;</div><div class='add'>+int need_emancipate = 0;</div><div class='ctx'> </div><div class='add'>+int</div><div class='add'>+glusterfs_mgmt_pmap_signin(glusterfs_ctx_t *ctx);</div><div class='add'>+int</div><div class='add'>+glusterfs_volfile_fetch(glusterfs_ctx_t *ctx);</div><div class='add'>+int</div><div class='add'>+glusterfs_process_volfp(glusterfs_ctx_t *ctx, FILE *fp);</div><div class='add'>+int</div><div class='add'>+emancipate(glusterfs_ctx_t *ctx, int ret);</div><div class='add'>+int</div><div class='add'>+glusterfs_process_svc_attach_volfp(glusterfs_ctx_t *ctx, FILE *fp,</div><div class='add'>+                                   char *volfile_id, char *checksum,</div><div class='add'>+                                   dict_t *dict);</div><div class='add'>+int</div><div class='add'>+glusterfs_mux_volfile_reconfigure(FILE *newvolfile_fp, glusterfs_ctx_t *ctx,</div><div class='add'>+                                  gf_volfile_t *volfile_obj, char *checksum,</div><div class='add'>+                                  dict_t *dict);</div><div class='add'>+int</div><div class='add'>+glusterfs_process_svc_attach_volfp(glusterfs_ctx_t *ctx, FILE *fp,</div><div class='add'>+                                   char *volfile_id, char *checksum,</div><div class='add'>+                                   dict_t *dict);</div><div class='add'>+int</div><div class='add'>+glusterfs_process_svc_detach(glusterfs_ctx_t *ctx, gf_volfile_t *volfile_obj);</div><div class='ctx'> </div><div class='add'>+gf_boolean_t</div><div class='add'>+mgmt_is_multiplexed_daemon(char *name);</div><div class='ctx'> </div><div class='del'>-int glusterfs_mgmt_pmap_signin (glusterfs_ctx_t *ctx);</div><div class='del'>-int glusterfs_volfile_fetch (glusterfs_ctx_t *ctx);</div><div class='del'>-int glusterfs_process_volfp (glusterfs_ctx_t *ctx, FILE *fp);</div><div class='add'>+static int</div><div class='add'>+glusterfs_volume_top_perf(const char *brick_path, dict_t *dict,</div><div class='add'>+                          gf_boolean_t write_test);</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-mgmt_cbk_spec (void *data)</div><div class='add'>+mgmt_cbk_spec(struct rpc_clnt *rpc, void *mydata, void *data)</div><div class='ctx'> {</div><div class='del'>-        glusterfs_ctx_t *ctx = NULL;</div><div class='add'>+    glusterfs_ctx_t *ctx = NULL;</div><div class='ctx'> </div><div class='del'>-        ctx = glusterfs_ctx_get ();</div><div class='del'>-        gf_log ("mgmt", GF_LOG_INFO, "Volume file changed");</div><div class='add'>+    ctx = glusterfsd_ctx;</div><div class='add'>+    gf_log("mgmt", GF_LOG_INFO, "Volume file changed");</div><div class='ctx'> </div><div class='del'>-        glusterfs_volfile_fetch (ctx);</div><div class='del'>-        return 0;</div><div class='add'>+    glusterfs_volfile_fetch(ctx);</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-rpcclnt_cb_actor_t gluster_cbk_actors[] = {</div><div class='del'>-        [GF_CBK_FETCHSPEC] = {"FETCHSPEC", GF_CBK_FETCHSPEC, mgmt_cbk_spec },</div><div class='del'>-};</div><div class='add'>+int</div><div class='add'>+mgmt_process_volfile(const char *volfile, ssize_t size, char *volfile_id,</div><div class='add'>+                     dict_t *dict)</div><div class='add'>+{</div><div class='add'>+    glusterfs_ctx_t *ctx = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    FILE *tmpfp = NULL;</div><div class='add'>+    gf_volfile_t *volfile_obj = NULL;</div><div class='add'>+    gf_volfile_t *volfile_tmp = NULL;</div><div class='add'>+    char sha256_hash[SHA256_DIGEST_LENGTH] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int tmp_fd = -1;</div><div class='add'>+    char template[] = "/tmp/glfs.volfile.XXXXXX";</div><div class='add'>+</div><div class='add'>+    glusterfs_compute_sha256((const unsigned char *)volfile, size, sha256_hash);</div><div class='add'>+    ctx = THIS-&gt;ctx;</div><div class='add'>+    LOCK(&amp;ctx-&gt;volfile_lock);</div><div class='add'>+    {</div><div class='add'>+        list_for_each_entry(volfile_obj, &amp;ctx-&gt;volfile_list, volfile_list)</div><div class='add'>+        {</div><div class='add'>+            if (!strcmp(volfile_id, volfile_obj-&gt;vol_id)) {</div><div class='add'>+                if (!memcmp(sha256_hash, volfile_obj-&gt;volfile_checksum,</div><div class='add'>+                            sizeof(volfile_obj-&gt;volfile_checksum))) {</div><div class='add'>+                    UNLOCK(&amp;ctx-&gt;volfile_lock);</div><div class='add'>+                    gf_smsg(THIS-&gt;name, GF_LOG_INFO, 0, glusterfsd_msg_40,</div><div class='add'>+                            NULL);</div><div class='add'>+                    goto out;</div><div class='add'>+                }</div><div class='add'>+                volfile_tmp = volfile_obj;</div><div class='add'>+                break;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='ctx'> </div><div class='add'>+        /* coverity[secure_temp] mkstemp uses 0600 as the mode */</div><div class='add'>+        tmp_fd = mkstemp(template);</div><div class='add'>+        if (-1 == tmp_fd) {</div><div class='add'>+            UNLOCK(&amp;ctx-&gt;volfile_lock);</div><div class='add'>+            gf_smsg(THIS-&gt;name, GF_LOG_ERROR, 0, glusterfsd_msg_39,</div><div class='add'>+                    "create template=%s", template, NULL);</div><div class='add'>+            ret = -1;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-struct rpcclnt_cb_program mgmt_cbk_prog = {</div><div class='del'>-        .progname  = "GlusterFS Callback",</div><div class='del'>-        .prognum   = GLUSTER_CBK_PROGRAM,</div><div class='del'>-        .progver   = GLUSTER_CBK_VERSION,</div><div class='del'>-        .actors    = gluster_cbk_actors,</div><div class='del'>-        .numactors = GF_CBK_MAXVALUE,</div><div class='del'>-};</div><div class='add'>+        /* Calling unlink so that when the file is closed or program</div><div class='add'>+         * terminates the temporary file is deleted.</div><div class='add'>+         */</div><div class='add'>+        ret = sys_unlink(template);</div><div class='add'>+        if (ret &lt; 0) {</div><div class='add'>+            gf_smsg(THIS-&gt;name, GF_LOG_INFO, 0, glusterfsd_msg_39,</div><div class='add'>+                    "delete template=%s", template, NULL);</div><div class='add'>+            ret = 0;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-char *clnt_pmap_procs[GF_PMAP_MAXVALUE] = {</div><div class='del'>-        [GF_PMAP_NULL]        = "NULL",</div><div class='del'>-        [GF_PMAP_PORTBYBRICK] = "PORTBYBRICK",</div><div class='del'>-        [GF_PMAP_BRICKBYPORT] = "BRICKBYPORT",</div><div class='del'>-        [GF_PMAP_SIGNIN]      = "SIGNIN",</div><div class='del'>-        [GF_PMAP_SIGNOUT]     = "SIGNOUT",</div><div class='del'>-        [GF_PMAP_SIGNUP]      = "SIGNUP",</div><div class='del'>-};</div><div class='add'>+        tmpfp = fdopen(tmp_fd, "w+b");</div><div class='add'>+        if (!tmpfp) {</div><div class='add'>+            ret = -1;</div><div class='add'>+            goto unlock;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='add'>+        fwrite(volfile, size, 1, tmpfp);</div><div class='add'>+        fflush(tmpfp);</div><div class='add'>+        if (ferror(tmpfp)) {</div><div class='add'>+            ret = -1;</div><div class='add'>+            goto unlock;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-rpc_clnt_prog_t clnt_pmap_prog = {</div><div class='del'>-        .progname  = "Gluster Portmap",</div><div class='del'>-        .prognum   = GLUSTER_PMAP_PROGRAM,</div><div class='del'>-        .progver   = GLUSTER_PMAP_VERSION,</div><div class='del'>-        .procnames = clnt_pmap_procs,</div><div class='del'>-};</div><div class='add'>+        if (!volfile_tmp) {</div><div class='add'>+            /* There is no checksum in the list, which means simple attach</div><div class='add'>+             * the volfile</div><div class='add'>+             */</div><div class='add'>+            ret = glusterfs_process_svc_attach_volfp(ctx, tmpfp, volfile_id,</div><div class='add'>+                                                     sha256_hash, dict);</div><div class='add'>+            goto unlock;</div><div class='add'>+        }</div><div class='add'>+        ret = glusterfs_mux_volfile_reconfigure(tmpfp, ctx, volfile_obj,</div><div class='add'>+                                                sha256_hash, dict);</div><div class='add'>+        if (ret &lt; 0) {</div><div class='add'>+            gf_msg_debug("glusterfsd-mgmt", EINVAL, "Reconfigure failed !!");</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+unlock:</div><div class='add'>+    UNLOCK(&amp;ctx-&gt;volfile_lock);</div><div class='add'>+out:</div><div class='add'>+    if (tmpfp)</div><div class='add'>+        fclose(tmpfp);</div><div class='add'>+    else if (tmp_fd != -1)</div><div class='add'>+        sys_close(tmp_fd);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-char *clnt_handshake_procs[GF_HNDSK_MAXVALUE] = {</div><div class='del'>-        [GF_HNDSK_NULL]         = "NULL",</div><div class='del'>-        [GF_HNDSK_SETVOLUME]    = "SETVOLUME",</div><div class='del'>-        [GF_HNDSK_GETSPEC]      = "GETSPEC",</div><div class='del'>-        [GF_HNDSK_PING]         = "PING",</div><div class='del'>-};</div><div class='add'>+int</div><div class='add'>+mgmt_cbk_event(struct rpc_clnt *rpc, void *mydata, void *data)</div><div class='add'>+{</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-rpc_clnt_prog_t clnt_handshake_prog = {</div><div class='del'>-        .progname  = "GlusterFS Handshake",</div><div class='del'>-        .prognum   = GLUSTER_HNDSK_PROGRAM,</div><div class='del'>-        .progver   = GLUSTER_HNDSK_VERSION,</div><div class='del'>-        .procnames = clnt_handshake_procs,</div><div class='del'>-};</div><div class='add'>+struct iobuf *</div><div class='add'>+glusterfs_serialize_reply(rpcsvc_request_t *req, void *arg,</div><div class='add'>+                          struct iovec *outmsg, xdrproc_t xdrproc)</div><div class='add'>+{</div><div class='add'>+    struct iobuf *iob = NULL;</div><div class='add'>+    ssize_t retlen = -1;</div><div class='add'>+    ssize_t xdr_size = 0;</div><div class='add'>+</div><div class='add'>+    /* First, get the io buffer into which the reply in arg will</div><div class='add'>+     * be serialized.</div><div class='add'>+     */</div><div class='add'>+    xdr_size = xdr_sizeof(xdrproc, arg);</div><div class='add'>+    iob = iobuf_get2(req-&gt;svc-&gt;ctx-&gt;iobuf_pool, xdr_size);</div><div class='add'>+    if (!iob) {</div><div class='add'>+        gf_log(THIS-&gt;name, GF_LOG_ERROR, "Failed to get iobuf");</div><div class='add'>+        goto ret;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    iobuf_to_iovec(iob, outmsg);</div><div class='add'>+    /* Use the given serializer to translate the give C structure in arg</div><div class='add'>+     * to XDR format which will be written into the buffer in outmsg.</div><div class='add'>+     */</div><div class='add'>+    /* retlen is used to received the error since size_t is unsigned and we</div><div class='add'>+     * need -1 for error notification during encoding.</div><div class='add'>+     */</div><div class='add'>+    retlen = xdr_serialize_generic(*outmsg, arg, xdrproc);</div><div class='add'>+    if (retlen == -1) {</div><div class='add'>+        gf_log(THIS-&gt;name, GF_LOG_ERROR, "Failed to encode message");</div><div class='add'>+        GF_FREE(iob);</div><div class='add'>+        goto ret;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    outmsg-&gt;iov_len = retlen;</div><div class='add'>+ret:</div><div class='add'>+    if (retlen == -1) {</div><div class='add'>+        iob = NULL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return iob;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-mgmt_submit_request (void *req, call_frame_t *frame,</div><div class='del'>-                     glusterfs_ctx_t *ctx,</div><div class='del'>-                     rpc_clnt_prog_t *prog, int procnum,</div><div class='del'>-                     mgmt_serialize_t sfunc, fop_cbk_fn_t cbkfn)</div><div class='add'>+glusterfs_submit_reply(rpcsvc_request_t *req, void *arg, struct iovec *payload,</div><div class='add'>+                       int payloadcount, struct iobref *iobref,</div><div class='add'>+                       xdrproc_t xdrproc)</div><div class='ctx'> {</div><div class='del'>-        int                     ret         = -1;</div><div class='del'>-        int                     count      = 0;</div><div class='del'>-        struct iovec            iov         = {0, };</div><div class='del'>-        struct iobuf            *iobuf = NULL;</div><div class='del'>-        struct iobref           *iobref = NULL;</div><div class='del'>-</div><div class='del'>-        iobref = iobref_new ();</div><div class='add'>+    struct iobuf *iob = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    struct iovec rsp = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    char new_iobref = 0;</div><div class='add'>+</div><div class='add'>+    if (!req) {</div><div class='add'>+        GF_ASSERT(req);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (!iobref) {</div><div class='add'>+        iobref = iobref_new();</div><div class='ctx'>         if (!iobref) {</div><div class='del'>-                goto out;</div><div class='add'>+            gf_log(THIS-&gt;name, GF_LOG_ERROR, "out of memory");</div><div class='add'>+            goto out;</div><div class='ctx'>         }</div><div class='ctx'> </div><div class='del'>-        iobuf = iobuf_get (ctx-&gt;iobuf_pool);</div><div class='del'>-        if (!iobuf) {</div><div class='del'>-                goto out;</div><div class='del'>-        };</div><div class='add'>+        new_iobref = 1;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        iobref_add (iobref, iobuf);</div><div class='add'>+    iob = glusterfs_serialize_reply(req, arg, &amp;rsp, xdrproc);</div><div class='add'>+    if (!iob) {</div><div class='add'>+        gf_log_callingfn(THIS-&gt;name, GF_LOG_ERROR, "Failed to serialize reply");</div><div class='add'>+    } else {</div><div class='add'>+        iobref_add(iobref, iob);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        iov.iov_base = iobuf-&gt;ptr;</div><div class='del'>-        iov.iov_len  = 128 * GF_UNIT_KB;</div><div class='add'>+    ret = rpcsvc_submit_generic(req, &amp;rsp, 1, payload, payloadcount, iobref);</div><div class='ctx'> </div><div class='add'>+    /* Now that we've done our job of handing the message to the RPC layer</div><div class='add'>+     * we can safely unref the iob in the hope that RPC layer must have</div><div class='add'>+     * ref'ed the iob on receiving into the txlist.</div><div class='add'>+     */</div><div class='add'>+    if (ret == -1) {</div><div class='add'>+        gf_log(THIS-&gt;name, GF_LOG_ERROR, "Reply submission failed");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        /* Create the xdr payload */</div><div class='del'>-        if (req &amp;&amp; sfunc) {</div><div class='del'>-                ret = sfunc (iov, req);</div><div class='del'>-                if (ret == -1) {</div><div class='del'>-                        goto out;</div><div class='del'>-                }</div><div class='del'>-                iov.iov_len = ret;</div><div class='del'>-                count = 1;</div><div class='del'>-        }</div><div class='add'>+    ret = 0;</div><div class='add'>+out:</div><div class='add'>+    if (iob)</div><div class='add'>+        iobuf_unref(iob);</div><div class='ctx'> </div><div class='del'>-        /* Send the msg */</div><div class='del'>-        ret = rpc_clnt_submit (ctx-&gt;mgmt, prog, procnum, cbkfn,</div><div class='del'>-                               &amp;iov, count,</div><div class='del'>-                               NULL, 0, iobref, frame, NULL, 0, NULL, 0, NULL);</div><div class='add'>+    if (new_iobref &amp;&amp; iobref)</div><div class='add'>+        iobref_unref(iobref);</div><div class='ctx'> </div><div class='del'>-out:</div><div class='del'>-        if (iobref)</div><div class='del'>-                iobref_unref (iobref);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        return ret;</div><div class='add'>+int</div><div class='add'>+glusterfs_terminate_response_send(rpcsvc_request_t *req, int op_ret)</div><div class='add'>+{</div><div class='add'>+    gd1_mgmt_brick_op_rsp rsp = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    dict_t *dict = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    rsp.op_ret = op_ret;</div><div class='add'>+    rsp.op_errno = 0;</div><div class='add'>+    rsp.op_errstr = "";</div><div class='add'>+    dict = dict_new();</div><div class='add'>+</div><div class='add'>+    if (dict)</div><div class='add'>+        ret = dict_allocate_and_serialize(dict, &amp;rsp.output.output_val,</div><div class='add'>+                                          &amp;rsp.output.output_len);</div><div class='add'>+</div><div class='add'>+    if (ret == 0)</div><div class='add'>+        ret = glusterfs_submit_reply(req, &amp;rsp, NULL, 0, NULL,</div><div class='add'>+                                     (xdrproc_t)xdr_gd1_mgmt_brick_op_rsp);</div><div class='add'>+</div><div class='add'>+    GF_FREE(rsp.output.output_val);</div><div class='add'>+    if (dict)</div><div class='add'>+        dict_unref(dict);</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+int</div><div class='add'>+glusterfs_handle_terminate(rpcsvc_request_t *req)</div><div class='add'>+{</div><div class='add'>+    gd1_mgmt_brick_op_req xlator_req = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    ssize_t ret;</div><div class='add'>+    glusterfs_ctx_t *ctx = NULL;</div><div class='add'>+    xlator_t *top = NULL;</div><div class='add'>+    xlator_t *victim = NULL;</div><div class='add'>+    xlator_t *tvictim = NULL;</div><div class='add'>+    xlator_list_t **trav_p = NULL;</div><div class='add'>+    gf_boolean_t lockflag = _gf_false;</div><div class='add'>+    gf_boolean_t still_bricks_attached = _gf_false;</div><div class='add'>+</div><div class='add'>+    ret = xdr_to_generic(req-&gt;msg[0], &amp;xlator_req,</div><div class='add'>+                         (xdrproc_t)xdr_gd1_mgmt_brick_op_req);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        req-&gt;rpc_err = GARBAGE_ARGS;</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+    ctx = glusterfsd_ctx;</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;ctx-&gt;volfile_lock);</div><div class='add'>+    {</div><div class='add'>+        /* Find the xlator_list_t that points to our victim. */</div><div class='add'>+        if (glusterfsd_ctx-&gt;active) {</div><div class='add'>+            top = glusterfsd_ctx-&gt;active-&gt;first;</div><div class='add'>+            for (trav_p = &amp;top-&gt;children; *trav_p; trav_p = &amp;(*trav_p)-&gt;next) {</div><div class='add'>+                victim = (*trav_p)-&gt;xlator;</div><div class='add'>+                if (!victim-&gt;cleanup_starting &amp;&amp;</div><div class='add'>+                    strcmp(victim-&gt;name, xlator_req.name) == 0) {</div><div class='add'>+                    break;</div><div class='add'>+                }</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-/* XXX: move these into @ctx */</div><div class='del'>-static char oldvolfile[131072];</div><div class='del'>-static int oldvollen = 0;</div><div class='add'>+        if (!top)</div><div class='add'>+            goto err;</div><div class='add'>+    }</div><div class='add'>+    if (!*trav_p) {</div><div class='add'>+        gf_log(THIS-&gt;name, GF_LOG_ERROR, "can't terminate %s - not found",</div><div class='add'>+               xlator_req.name);</div><div class='add'>+        /*</div><div class='add'>+         * Used to be -ENOENT.  However, the caller asked us to</div><div class='add'>+         * make sure it's down and if it's already down that's</div><div class='add'>+         * good enough.</div><div class='add'>+         */</div><div class='add'>+        glusterfs_terminate_response_send(req, 0);</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    glusterfs_terminate_response_send(req, 0);</div><div class='add'>+    for (trav_p = &amp;top-&gt;children; *trav_p; trav_p = &amp;(*trav_p)-&gt;next) {</div><div class='add'>+        tvictim = (*trav_p)-&gt;xlator;</div><div class='add'>+        if (!tvictim-&gt;cleanup_starting &amp;&amp;</div><div class='add'>+            !strcmp(tvictim-&gt;name, xlator_req.name)) {</div><div class='add'>+            continue;</div><div class='add'>+        }</div><div class='add'>+        if (!tvictim-&gt;cleanup_starting) {</div><div class='add'>+            still_bricks_attached = _gf_true;</div><div class='add'>+            break;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    if (!still_bricks_attached) {</div><div class='add'>+        gf_log(THIS-&gt;name, GF_LOG_INFO,</div><div class='add'>+               "terminating after loss of last child %s", xlator_req.name);</div><div class='add'>+        rpc_clnt_mgmt_pmap_signout(glusterfsd_ctx, xlator_req.name);</div><div class='add'>+        kill(getpid(), SIGTERM);</div><div class='add'>+    } else {</div><div class='add'>+        /* TODO cleanup sequence needs to be done properly for</div><div class='add'>+           Quota and Changelog</div><div class='add'>+        */</div><div class='add'>+        if (victim-&gt;cleanup_starting)</div><div class='add'>+            goto err;</div><div class='add'>+</div><div class='add'>+        rpc_clnt_mgmt_pmap_signout(glusterfsd_ctx, xlator_req.name);</div><div class='add'>+        victim-&gt;cleanup_starting = 1;</div><div class='add'>+</div><div class='add'>+        UNLOCK(&amp;ctx-&gt;volfile_lock);</div><div class='add'>+        lockflag = _gf_true;</div><div class='add'>+</div><div class='add'>+        gf_log(THIS-&gt;name, GF_LOG_INFO,</div><div class='add'>+               "detaching not-only"</div><div class='add'>+               " child %s",</div><div class='add'>+               xlator_req.name);</div><div class='add'>+        top-&gt;notify(top, GF_EVENT_CLEANUP, victim);</div><div class='add'>+    }</div><div class='add'>+err:</div><div class='add'>+    if (!lockflag)</div><div class='add'>+        UNLOCK(&amp;ctx-&gt;volfile_lock);</div><div class='add'>+    if (xlator_req.input.input_val)</div><div class='add'>+        free(xlator_req.input.input_val);</div><div class='add'>+    if (xlator_req.dict.dict_val)</div><div class='add'>+        free(xlator_req.dict.dict_val);</div><div class='add'>+    free(xlator_req.name);</div><div class='add'>+    xlator_req.name = NULL;</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-mgmt_getspec_cbk (struct rpc_req *req, struct iovec *iov, int count,</div><div class='del'>-                  void *myframe)</div><div class='add'>+glusterfs_translator_info_response_send(rpcsvc_request_t *req, int ret,</div><div class='add'>+                                        char *msg, dict_t *output)</div><div class='ctx'> {</div><div class='del'>-        gf_getspec_rsp           rsp   = {0,};</div><div class='del'>-        call_frame_t            *frame = NULL;</div><div class='del'>-        glusterfs_ctx_t         *ctx = NULL;</div><div class='del'>-        int                      ret   = 0;</div><div class='del'>-        ssize_t                  size = 0;</div><div class='del'>-        FILE                    *tmpfp = NULL;</div><div class='add'>+    gd1_mgmt_brick_op_rsp rsp = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    gf_boolean_t free_ptr = _gf_false;</div><div class='add'>+    GF_ASSERT(req);</div><div class='add'>+</div><div class='add'>+    rsp.op_ret = ret;</div><div class='add'>+    rsp.op_errno = 0;</div><div class='add'>+    if (ret &amp;&amp; msg &amp;&amp; msg[0])</div><div class='add'>+        rsp.op_errstr = msg;</div><div class='add'>+    else</div><div class='add'>+        rsp.op_errstr = "";</div><div class='add'>+</div><div class='add'>+    ret = -1;</div><div class='add'>+    if (output) {</div><div class='add'>+        ret = dict_allocate_and_serialize(output, &amp;rsp.output.output_val,</div><div class='add'>+                                          &amp;rsp.output.output_len);</div><div class='add'>+    }</div><div class='add'>+    if (!ret)</div><div class='add'>+        free_ptr = _gf_true;</div><div class='add'>+</div><div class='add'>+    glusterfs_submit_reply(req, &amp;rsp, NULL, 0, NULL,</div><div class='add'>+                           (xdrproc_t)xdr_gd1_mgmt_brick_op_rsp);</div><div class='add'>+    ret = 0;</div><div class='add'>+    if (free_ptr)</div><div class='add'>+        GF_FREE(rsp.output.output_val);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        frame = myframe;</div><div class='del'>-        ctx = frame-&gt;this-&gt;ctx;</div><div class='add'>+int</div><div class='add'>+glusterfs_xlator_op_response_send(rpcsvc_request_t *req, int op_ret, char *msg,</div><div class='add'>+                                  dict_t *output)</div><div class='add'>+{</div><div class='add'>+    gd1_mgmt_brick_op_rsp rsp = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int ret = -1;</div><div class='add'>+    gf_boolean_t free_ptr = _gf_false;</div><div class='add'>+    GF_ASSERT(req);</div><div class='add'>+</div><div class='add'>+    rsp.op_ret = op_ret;</div><div class='add'>+    rsp.op_errno = 0;</div><div class='add'>+    if (op_ret &amp;&amp; msg &amp;&amp; msg[0])</div><div class='add'>+        rsp.op_errstr = msg;</div><div class='add'>+    else</div><div class='add'>+        rsp.op_errstr = "";</div><div class='add'>+</div><div class='add'>+    if (output) {</div><div class='add'>+        ret = dict_allocate_and_serialize(output, &amp;rsp.output.output_val,</div><div class='add'>+                                          &amp;rsp.output.output_len);</div><div class='add'>+    }</div><div class='add'>+    if (!ret)</div><div class='add'>+        free_ptr = _gf_true;</div><div class='add'>+</div><div class='add'>+    ret = glusterfs_submit_reply(req, &amp;rsp, NULL, 0, NULL,</div><div class='add'>+                                 (xdrproc_t)xdr_gd1_mgmt_brick_op_rsp);</div><div class='add'>+</div><div class='add'>+    if (free_ptr)</div><div class='add'>+        GF_FREE(rsp.output.output_val);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        if (-1 == req-&gt;rpc_status) {</div><div class='del'>-                ret = -1;</div><div class='del'>-                goto out;</div><div class='add'>+int</div><div class='add'>+glusterfs_handle_translator_info_get(rpcsvc_request_t *req)</div><div class='add'>+{</div><div class='add'>+    int32_t ret = -1;</div><div class='add'>+    gd1_mgmt_brick_op_req xlator_req = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    dict_t *dict = NULL;</div><div class='add'>+    xlator_t *this = NULL;</div><div class='add'>+    gf1_cli_top_op top_op = 0;</div><div class='add'>+    xlator_t *any = NULL;</div><div class='add'>+    xlator_t *xlator = NULL;</div><div class='add'>+    glusterfs_graph_t *active = NULL;</div><div class='add'>+    glusterfs_ctx_t *ctx = NULL;</div><div class='add'>+    char msg[2048] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    dict_t *output = NULL;</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(req);</div><div class='add'>+    this = THIS;</div><div class='add'>+    GF_ASSERT(this);</div><div class='add'>+</div><div class='add'>+    ret = xdr_to_generic(req-&gt;msg[0], &amp;xlator_req,</div><div class='add'>+                         (xdrproc_t)xdr_gd1_mgmt_brick_op_req);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        // failed to decode msg;</div><div class='add'>+        req-&gt;rpc_err = GARBAGE_ARGS;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    dict = dict_new();</div><div class='add'>+    ret = dict_unserialize(xlator_req.input.input_val,</div><div class='add'>+                           xlator_req.input.input_len, &amp;dict);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        gf_log(this-&gt;name, GF_LOG_ERROR,</div><div class='add'>+               "failed to "</div><div class='add'>+               "unserialize req-buffer to dictionary");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_get_int32(dict, "top-op", (int32_t *)&amp;top_op);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto cont;</div><div class='add'>+    if (GF_CLI_TOP_READ_PERF == top_op) {</div><div class='add'>+        ret = glusterfs_volume_top_perf(xlator_req.name, dict, _gf_false);</div><div class='add'>+    } else if (GF_CLI_TOP_WRITE_PERF == top_op) {</div><div class='add'>+        ret = glusterfs_volume_top_perf(xlator_req.name, dict, _gf_true);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+cont:</div><div class='add'>+    ctx = glusterfsd_ctx;</div><div class='add'>+    GF_ASSERT(ctx);</div><div class='add'>+    active = ctx-&gt;active;</div><div class='add'>+    if (active == NULL) {</div><div class='add'>+        gf_log(THIS-&gt;name, GF_LOG_ERROR, "ctx-&gt;active returned NULL");</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    any = active-&gt;first;</div><div class='add'>+</div><div class='add'>+    xlator = get_xlator_by_name(any, xlator_req.name);</div><div class='add'>+    if (!xlator) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        snprintf(msg, sizeof(msg), "xlator %s is not loaded", xlator_req.name);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (strcmp(xlator-&gt;type, "debug/io-stats")) {</div><div class='add'>+        xlator = get_xlator_by_type(xlator, "debug/io-stats");</div><div class='add'>+        if (!xlator) {</div><div class='add'>+            ret = -1;</div><div class='add'>+            snprintf(msg, sizeof(msg),</div><div class='add'>+                     "xlator-type debug/io-stats is not loaded");</div><div class='add'>+            goto out;</div><div class='ctx'>         }</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        ret = xdr_to_getspec_rsp (*iov, &amp;rsp);</div><div class='del'>-        if (ret &lt; 0) {</div><div class='del'>-                gf_log (frame-&gt;this-&gt;name, GF_LOG_ERROR, "error");</div><div class='del'>-                ret   = -1;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='add'>+    output = dict_new();</div><div class='add'>+    ret = xlator-&gt;notify(xlator, GF_EVENT_TRANSLATOR_INFO, dict, output);</div><div class='ctx'> </div><div class='del'>-        if (-1 == rsp.op_ret) {</div><div class='del'>-                gf_log (frame-&gt;this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-                        "failed to get the 'volume file' from server");</div><div class='del'>-                ret = -1;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='add'>+out:</div><div class='add'>+    ret = glusterfs_translator_info_response_send(req, ret, msg, output);</div><div class='add'>+</div><div class='add'>+    free(xlator_req.name);</div><div class='add'>+    free(xlator_req.input.input_val);</div><div class='add'>+    if (xlator_req.dict.dict_val)</div><div class='add'>+        free(xlator_req.dict.dict_val);</div><div class='add'>+    if (output)</div><div class='add'>+        dict_unref(output);</div><div class='add'>+    if (dict)</div><div class='add'>+        dict_unref(dict);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='add'>+static int</div><div class='add'>+glusterfs_volume_top_perf(const char *brick_path, dict_t *dict,</div><div class='add'>+                          gf_boolean_t write_test)</div><div class='add'>+{</div><div class='add'>+    int32_t fd = -1;</div><div class='add'>+    int32_t output_fd = -1;</div><div class='add'>+    char export_path[PATH_MAX] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    char *buf = NULL;</div><div class='add'>+    int32_t iter = 0;</div><div class='add'>+    int32_t ret = -1;</div><div class='add'>+    uint64_t total_blks = 0;</div><div class='add'>+    uint32_t blk_size;</div><div class='add'>+    uint32_t blk_count;</div><div class='add'>+    double throughput = 0;</div><div class='add'>+    double time = 0;</div><div class='add'>+    struct timeval begin, end = {</div><div class='add'>+                              0,</div><div class='add'>+                          };</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(brick_path);</div><div class='add'>+</div><div class='add'>+    ret = dict_get_uint32(dict, "blk-size", &amp;blk_size);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+    ret = dict_get_uint32(dict, "blk-cnt", &amp;blk_count);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    if (!(blk_size &gt; 0) || !(blk_count &gt; 0))</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    buf = GF_CALLOC(1, blk_size * sizeof(*buf), gf_common_mt_char);</div><div class='add'>+    if (!buf) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        gf_log("glusterd", GF_LOG_ERROR, "Could not allocate memory");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    snprintf(export_path, sizeof(export_path), "%s/%s", brick_path,</div><div class='add'>+             ".gf-tmp-stats-perf");</div><div class='add'>+    fd = open(export_path, O_CREAT | O_RDWR, S_IRWXU);</div><div class='add'>+    if (-1 == fd) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        gf_log("glusterd", GF_LOG_ERROR, "Could not open tmp file");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    gettimeofday(&amp;begin, NULL);</div><div class='add'>+    for (iter = 0; iter &lt; blk_count; iter++) {</div><div class='add'>+        ret = sys_write(fd, buf, blk_size);</div><div class='add'>+        if (ret != blk_size) {</div><div class='add'>+            ret = -1;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+        total_blks += ret;</div><div class='add'>+    }</div><div class='add'>+    gettimeofday(&amp;end, NULL);</div><div class='add'>+    if (total_blks != ((uint64_t)blk_size * blk_count)) {</div><div class='add'>+        gf_log("glusterd", GF_LOG_WARNING, "Error in write");</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    time = gf_tvdiff(&amp;begin, &amp;end);</div><div class='add'>+    throughput = total_blks / time;</div><div class='add'>+    gf_log("glusterd", GF_LOG_INFO,</div><div class='add'>+           "Throughput %.2f Mbps time %.2f secs "</div><div class='add'>+           "bytes written %" PRId64,</div><div class='add'>+           throughput, time, total_blks);</div><div class='add'>+</div><div class='add'>+    /* if it's a write test, we are done. Otherwise, we continue to the read</div><div class='add'>+     * part */</div><div class='add'>+    if (write_test == _gf_true) {</div><div class='ctx'>         ret = 0;</div><div class='del'>-        size = rsp.op_ret;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = sys_fsync(fd);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log("glusterd", GF_LOG_ERROR, "could not flush cache");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    ret = sys_lseek(fd, 0L, 0);</div><div class='add'>+    if (ret != 0) {</div><div class='add'>+        gf_log("glusterd", GF_LOG_ERROR, "could not seek back to start");</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    output_fd = open("/dev/null", O_RDWR);</div><div class='add'>+    if (-1 == output_fd) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        gf_log("glusterd", GF_LOG_ERROR, "Could not open output file");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    total_blks = 0;</div><div class='add'>+</div><div class='add'>+    gettimeofday(&amp;begin, NULL);</div><div class='add'>+    for (iter = 0; iter &lt; blk_count; iter++) {</div><div class='add'>+        ret = sys_read(fd, buf, blk_size);</div><div class='add'>+        if (ret != blk_size) {</div><div class='add'>+            ret = -1;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+        ret = sys_write(output_fd, buf, blk_size);</div><div class='add'>+        if (ret != blk_size) {</div><div class='add'>+            ret = -1;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+        total_blks += ret;</div><div class='add'>+    }</div><div class='add'>+    gettimeofday(&amp;end, NULL);</div><div class='add'>+    if (total_blks != ((uint64_t)blk_size * blk_count)) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        gf_log("glusterd", GF_LOG_WARNING, "Error in read");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    time = gf_tvdiff(&amp;begin, &amp;end);</div><div class='add'>+    throughput = total_blks / time;</div><div class='add'>+    gf_log("glusterd", GF_LOG_INFO,</div><div class='add'>+           "Throughput %.2f Mbps time %.2f secs "</div><div class='add'>+           "bytes read %" PRId64,</div><div class='add'>+           throughput, time, total_blks);</div><div class='add'>+    ret = 0;</div><div class='add'>+out:</div><div class='add'>+    if (fd &gt;= 0)</div><div class='add'>+        sys_close(fd);</div><div class='add'>+    if (output_fd &gt;= 0)</div><div class='add'>+        sys_close(output_fd);</div><div class='add'>+    GF_FREE(buf);</div><div class='add'>+    sys_unlink(export_path);</div><div class='add'>+    if (ret == 0) {</div><div class='add'>+        ret = dict_set_double(dict, "time", time);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto end;</div><div class='add'>+        ret = dict_set_double(dict, "throughput", throughput);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto end;</div><div class='add'>+    }</div><div class='add'>+end:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        if (size == oldvollen &amp;&amp; (memcmp (oldvolfile, rsp.spec, size) == 0))</div><div class='del'>-                goto out;</div><div class='add'>+int</div><div class='add'>+glusterfs_handle_translator_op(rpcsvc_request_t *req)</div><div class='add'>+{</div><div class='add'>+    int32_t ret = -1;</div><div class='add'>+    int32_t op_ret = 0;</div><div class='add'>+    gd1_mgmt_brick_op_req xlator_req = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    dict_t *input = NULL;</div><div class='add'>+    xlator_t *xlator = NULL;</div><div class='add'>+    xlator_t *any = NULL;</div><div class='add'>+    dict_t *output = NULL;</div><div class='add'>+    char key[32] = {0};</div><div class='add'>+    int len;</div><div class='add'>+    char *xname = NULL;</div><div class='add'>+    glusterfs_ctx_t *ctx = NULL;</div><div class='add'>+    glusterfs_graph_t *active = NULL;</div><div class='add'>+    xlator_t *this = NULL;</div><div class='add'>+    int i = 0;</div><div class='add'>+    int count = 0;</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(req);</div><div class='add'>+    this = THIS;</div><div class='add'>+    GF_ASSERT(this);</div><div class='add'>+</div><div class='add'>+    ret = xdr_to_generic(req-&gt;msg[0], &amp;xlator_req,</div><div class='add'>+                         (xdrproc_t)xdr_gd1_mgmt_brick_op_req);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        // failed to decode msg;</div><div class='add'>+        req-&gt;rpc_err = GARBAGE_ARGS;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ctx = glusterfsd_ctx;</div><div class='add'>+    active = ctx-&gt;active;</div><div class='add'>+    if (!active) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_ERROR, EAGAIN, glusterfsd_msg_38,</div><div class='add'>+                "brick-op_no.=%d", xlator_req.op, NULL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    any = active-&gt;first;</div><div class='add'>+    input = dict_new();</div><div class='add'>+    ret = dict_unserialize(xlator_req.input.input_val,</div><div class='add'>+                           xlator_req.input.input_len, &amp;input);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        gf_log(this-&gt;name, GF_LOG_ERROR,</div><div class='add'>+               "failed to "</div><div class='add'>+               "unserialize req-buffer to dictionary");</div><div class='add'>+        goto out;</div><div class='add'>+    } else {</div><div class='add'>+        input-&gt;extra_stdfree = xlator_req.input.input_val;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_get_int32(input, "count", &amp;count);</div><div class='add'>+</div><div class='add'>+    output = dict_new();</div><div class='add'>+    if (!output) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; count; i++) {</div><div class='add'>+        len = snprintf(key, sizeof(key), "xl-%d", i);</div><div class='add'>+        ret = dict_get_strn(input, key, len, &amp;xname);</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_log(this-&gt;name, GF_LOG_ERROR,</div><div class='add'>+                   "Couldn't get "</div><div class='add'>+                   "xlator %s ",</div><div class='add'>+                   key);</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+        xlator = xlator_search_by_name(any, xname);</div><div class='add'>+        if (!xlator) {</div><div class='add'>+            gf_log(this-&gt;name, GF_LOG_ERROR,</div><div class='add'>+                   "xlator %s is not "</div><div class='add'>+                   "loaded",</div><div class='add'>+                   xname);</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    for (i = 0; i &lt; count; i++) {</div><div class='add'>+        len = snprintf(key, sizeof(key), "xl-%d", i);</div><div class='add'>+        ret = dict_get_strn(input, key, len, &amp;xname);</div><div class='add'>+        xlator = xlator_search_by_name(any, xname);</div><div class='add'>+        XLATOR_NOTIFY(ret, xlator, GF_EVENT_TRANSLATOR_OP, input, output);</div><div class='add'>+        /* If notify fails for an xlator we need to capture it but</div><div class='add'>+         * continue with the loop. */</div><div class='add'>+        if (ret)</div><div class='add'>+            op_ret = -1;</div><div class='add'>+    }</div><div class='add'>+    ret = op_ret;</div><div class='add'>+out:</div><div class='add'>+    glusterfs_xlator_op_response_send(req, ret, "", output);</div><div class='add'>+    if (input)</div><div class='add'>+        dict_unref(input);</div><div class='add'>+    if (output)</div><div class='add'>+        dict_unref(output);</div><div class='add'>+    free(xlator_req.name);  // malloced by xdr</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        tmpfp = tmpfile ();</div><div class='del'>-        if (!tmpfp) {</div><div class='del'>-                ret = -1;</div><div class='del'>-                goto out;</div><div class='add'>+int</div><div class='add'>+glusterfs_handle_bitrot(rpcsvc_request_t *req)</div><div class='add'>+{</div><div class='add'>+    int32_t ret = -1;</div><div class='add'>+    gd1_mgmt_brick_op_req xlator_req = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    dict_t *input = NULL;</div><div class='add'>+    dict_t *output = NULL;</div><div class='add'>+    xlator_t *any = NULL;</div><div class='add'>+    xlator_t *this = NULL;</div><div class='add'>+    xlator_t *xlator = NULL;</div><div class='add'>+    char msg[2048] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    char xname[1024] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    glusterfs_ctx_t *ctx = NULL;</div><div class='add'>+    glusterfs_graph_t *active = NULL;</div><div class='add'>+    char *scrub_opt = NULL;</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(req);</div><div class='add'>+    this = THIS;</div><div class='add'>+    GF_ASSERT(this);</div><div class='add'>+</div><div class='add'>+    ret = xdr_to_generic(req-&gt;msg[0], &amp;xlator_req,</div><div class='add'>+                         (xdrproc_t)xdr_gd1_mgmt_brick_op_req);</div><div class='add'>+</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        /*failed to decode msg;*/</div><div class='add'>+        req-&gt;rpc_err = GARBAGE_ARGS;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ctx = glusterfsd_ctx;</div><div class='add'>+    GF_ASSERT(ctx);</div><div class='add'>+</div><div class='add'>+    active = ctx-&gt;active;</div><div class='add'>+    if (!active) {</div><div class='add'>+        req-&gt;rpc_err = GARBAGE_ARGS;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    any = active-&gt;first;</div><div class='add'>+</div><div class='add'>+    input = dict_new();</div><div class='add'>+    if (!input)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    ret = dict_unserialize(xlator_req.input.input_val,</div><div class='add'>+                           xlator_req.input.input_len, &amp;input);</div><div class='add'>+</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_ERROR, 0, glusterfsd_msg_35, NULL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Send scrubber request to bitrot xlator */</div><div class='add'>+    snprintf(xname, sizeof(xname), "%s-bit-rot-0", xlator_req.name);</div><div class='add'>+    xlator = xlator_search_by_name(any, xname);</div><div class='add'>+    if (!xlator) {</div><div class='add'>+        snprintf(msg, sizeof(msg), "xlator %s is not loaded", xname);</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_ERROR, 0, glusterfsd_msg_36, NULL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    output = dict_new();</div><div class='add'>+    if (!output) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_get_str(input, "scrub-value", &amp;scrub_opt);</div><div class='add'>+    if (ret) {</div><div class='add'>+        snprintf(msg, sizeof(msg), "Failed to get scrub value");</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_ERROR, 0, glusterfsd_msg_37, NULL);</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (!strncmp(scrub_opt, "status", SLEN("status"))) {</div><div class='add'>+        ret = xlator-&gt;notify(xlator, GF_EVENT_SCRUB_STATUS, input, output);</div><div class='add'>+    } else if (!strncmp(scrub_opt, "ondemand", SLEN("ondemand"))) {</div><div class='add'>+        ret = xlator-&gt;notify(xlator, GF_EVENT_SCRUB_ONDEMAND, input, output);</div><div class='add'>+        if (ret == -2) {</div><div class='add'>+            snprintf(msg, sizeof(msg),</div><div class='add'>+                     "Scrubber is in "</div><div class='add'>+                     "Pause/Inactive/Running state");</div><div class='add'>+            ret = -1;</div><div class='add'>+            goto out;</div><div class='ctx'>         }</div><div class='add'>+    }</div><div class='add'>+out:</div><div class='add'>+    glusterfs_translator_info_response_send(req, ret, msg, output);</div><div class='add'>+</div><div class='add'>+    if (input)</div><div class='add'>+        dict_unref(input);</div><div class='add'>+    free(xlator_req.input.input_val); /*malloced by xdr*/</div><div class='add'>+    if (xlator_req.dict.dict_val)</div><div class='add'>+        free(xlator_req.dict.dict_val);</div><div class='add'>+    if (output)</div><div class='add'>+        dict_unref(output);</div><div class='add'>+    free(xlator_req.name);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        fwrite (rsp.spec, size, 1, tmpfp);</div><div class='del'>-        fflush (tmpfp);</div><div class='add'>+int</div><div class='add'>+glusterfs_handle_attach(rpcsvc_request_t *req)</div><div class='add'>+{</div><div class='add'>+    int32_t ret = -1;</div><div class='add'>+    gd1_mgmt_brick_op_req xlator_req = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    xlator_t *this = NULL;</div><div class='add'>+    xlator_t *nextchild = NULL;</div><div class='add'>+    glusterfs_graph_t *newgraph = NULL;</div><div class='add'>+    glusterfs_ctx_t *ctx = NULL;</div><div class='add'>+    xlator_t *srv_xl = NULL;</div><div class='add'>+    server_conf_t *srv_conf = NULL;</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(req);</div><div class='add'>+    this = THIS;</div><div class='add'>+    GF_ASSERT(this);</div><div class='add'>+</div><div class='add'>+    ctx = this-&gt;ctx;</div><div class='add'>+    if (!ctx-&gt;cmd_args.volfile_id) {</div><div class='add'>+        gf_log(THIS-&gt;name, GF_LOG_ERROR,</div><div class='add'>+               "No volfile-id provided, erroring out");</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = xdr_to_generic(req-&gt;msg[0], &amp;xlator_req,</div><div class='add'>+                         (xdrproc_t)xdr_gd1_mgmt_brick_op_req);</div><div class='add'>+</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        /*failed to decode msg;*/</div><div class='add'>+        req-&gt;rpc_err = GARBAGE_ARGS;</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+    ret = 0;</div><div class='add'>+</div><div class='add'>+    if (!this-&gt;ctx-&gt;active) {</div><div class='add'>+        gf_log(this-&gt;name, GF_LOG_WARNING,</div><div class='add'>+               "got attach for %s but no active graph", xlator_req.name);</div><div class='add'>+        goto post_unlock;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    gf_log(this-&gt;name, GF_LOG_INFO, "got attach for %s", xlator_req.name);</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;ctx-&gt;volfile_lock);</div><div class='add'>+    {</div><div class='add'>+        ret = glusterfs_graph_attach(this-&gt;ctx-&gt;active, xlator_req.name,</div><div class='add'>+                                     &amp;newgraph);</div><div class='add'>+        if (!ret &amp;&amp; (newgraph &amp;&amp; newgraph-&gt;first)) {</div><div class='add'>+            nextchild = newgraph-&gt;first;</div><div class='add'>+            ret = xlator_notify(nextchild, GF_EVENT_PARENT_UP, nextchild);</div><div class='add'>+            if (ret) {</div><div class='add'>+                gf_smsg(this-&gt;name, GF_LOG_ERROR, 0, LG_MSG_EVENT_NOTIFY_FAILED,</div><div class='add'>+                        "event=ParentUp", "name=%s", nextchild-&gt;name, NULL);</div><div class='add'>+                goto unlock;</div><div class='add'>+            }</div><div class='add'>+            /* we need a protocol/server xlator as</div><div class='add'>+             * nextchild</div><div class='add'>+             */</div><div class='add'>+            srv_xl = this-&gt;ctx-&gt;active-&gt;first;</div><div class='add'>+            srv_conf = (server_conf_t *)srv_xl-&gt;private;</div><div class='add'>+            rpcsvc_autoscale_threads(this-&gt;ctx, srv_conf-&gt;rpc, 1);</div><div class='add'>+        }</div><div class='add'>+        if (ret) {</div><div class='add'>+            ret = -1;</div><div class='add'>+        }</div><div class='add'>+        ret = glusterfs_translator_info_response_send(req, ret, NULL, NULL);</div><div class='add'>+        if (ret) {</div><div class='add'>+            /* Response sent back to glusterd, req is already destroyed. So</div><div class='add'>+             * resetting the ret to 0. Otherwise another response will be</div><div class='add'>+             * send from rpcsvc_check_and_reply_error. Which will lead to</div><div class='add'>+             * double resource leak.</div><div class='add'>+             */</div><div class='add'>+            ret = 0;</div><div class='add'>+        }</div><div class='add'>+    unlock:</div><div class='add'>+        UNLOCK(&amp;ctx-&gt;volfile_lock);</div><div class='add'>+    }</div><div class='add'>+post_unlock:</div><div class='add'>+    if (xlator_req.dict.dict_val)</div><div class='add'>+        free(xlator_req.dict.dict_val);</div><div class='add'>+    free(xlator_req.input.input_val);</div><div class='add'>+    free(xlator_req.name);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        ret = glusterfs_process_volfp (ctx, tmpfp);</div><div class='del'>-        if (ret)</div><div class='del'>-                goto out;</div><div class='add'>+int</div><div class='add'>+glusterfs_handle_svc_attach(rpcsvc_request_t *req)</div><div class='add'>+{</div><div class='add'>+    int32_t ret = -1;</div><div class='add'>+    gd1_mgmt_brick_op_req xlator_req = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    xlator_t *this = NULL;</div><div class='add'>+    dict_t *dict = NULL;</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(req);</div><div class='add'>+    this = THIS;</div><div class='add'>+    GF_ASSERT(this);</div><div class='add'>+</div><div class='add'>+    ret = xdr_to_generic(req-&gt;msg[0], &amp;xlator_req,</div><div class='add'>+                         (xdrproc_t)xdr_gd1_mgmt_brick_op_req);</div><div class='add'>+</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        /*failed to decode msg;*/</div><div class='add'>+        req-&gt;rpc_err = GARBAGE_ARGS;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    gf_smsg(THIS-&gt;name, GF_LOG_INFO, 0, glusterfsd_msg_41, "volfile-id=%s",</div><div class='add'>+            xlator_req.name, NULL);</div><div class='add'>+</div><div class='add'>+    dict = dict_new();</div><div class='add'>+    if (!dict) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        errno = ENOMEM;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_unserialize(xlator_req.dict.dict_val, xlator_req.dict.dict_len,</div><div class='add'>+                           &amp;dict);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_WARNING, EINVAL, glusterfsd_msg_42, NULL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    dict-&gt;extra_stdfree = xlator_req.dict.dict_val;</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+</div><div class='add'>+    ret = mgmt_process_volfile(xlator_req.input.input_val,</div><div class='add'>+                               xlator_req.input.input_len, xlator_req.name,</div><div class='add'>+                               dict);</div><div class='add'>+out:</div><div class='add'>+    if (dict)</div><div class='add'>+        dict_unref(dict);</div><div class='add'>+    if (xlator_req.input.input_val)</div><div class='add'>+        free(xlator_req.input.input_val);</div><div class='add'>+    if (xlator_req.name)</div><div class='add'>+        free(xlator_req.name);</div><div class='add'>+    glusterfs_translator_info_response_send(req, ret, NULL, NULL);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+glusterfs_handle_svc_detach(rpcsvc_request_t *req)</div><div class='add'>+{</div><div class='add'>+    gd1_mgmt_brick_op_req xlator_req = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    ssize_t ret;</div><div class='add'>+    gf_volfile_t *volfile_obj = NULL;</div><div class='add'>+    glusterfs_ctx_t *ctx = NULL;</div><div class='add'>+    gf_volfile_t *volfile_tmp = NULL;</div><div class='add'>+</div><div class='add'>+    ret = xdr_to_generic(req-&gt;msg[0], &amp;xlator_req,</div><div class='add'>+                         (xdrproc_t)xdr_gd1_mgmt_brick_op_req);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        req-&gt;rpc_err = GARBAGE_ARGS;</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+    ctx = glusterfsd_ctx;</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;ctx-&gt;volfile_lock);</div><div class='add'>+    {</div><div class='add'>+        list_for_each_entry(volfile_obj, &amp;ctx-&gt;volfile_list, volfile_list)</div><div class='add'>+        {</div><div class='add'>+            if (!strcmp(xlator_req.name, volfile_obj-&gt;vol_id)) {</div><div class='add'>+                volfile_tmp = volfile_obj;</div><div class='add'>+                break;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-        oldvollen = size;</div><div class='del'>-        memcpy (oldvolfile, rsp.spec, size);</div><div class='del'>-        if (!is_mgmt_rpc_reconnect) {</div><div class='del'>-                glusterfs_mgmt_pmap_signin (ctx);</div><div class='del'>-                is_mgmt_rpc_reconnect = 1;</div><div class='add'>+        if (!volfile_tmp) {</div><div class='add'>+            UNLOCK(&amp;ctx-&gt;volfile_lock);</div><div class='add'>+            gf_smsg(THIS-&gt;name, GF_LOG_ERROR, 0, glusterfsd_msg_041, "name=%s",</div><div class='add'>+                    xlator_req.name, NULL);</div><div class='add'>+            /*</div><div class='add'>+             * Used to be -ENOENT.  However, the caller asked us to</div><div class='add'>+             * make sure it's down and if it's already down that's</div><div class='add'>+             * good enough.</div><div class='add'>+             */</div><div class='add'>+            ret = 0;</div><div class='add'>+            goto out;</div><div class='ctx'>         }</div><div class='add'>+        /* coverity[ORDER_REVERSAL] */</div><div class='add'>+        ret = glusterfs_process_svc_detach(ctx, volfile_tmp);</div><div class='add'>+        if (ret) {</div><div class='add'>+            UNLOCK(&amp;ctx-&gt;volfile_lock);</div><div class='add'>+            gf_smsg("glusterfsd-mgmt", GF_LOG_ERROR, EINVAL, glusterfsd_msg_042,</div><div class='add'>+                    NULL);</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    UNLOCK(&amp;ctx-&gt;volfile_lock);</div><div class='add'>+out:</div><div class='add'>+    glusterfs_terminate_response_send(req, ret);</div><div class='add'>+    free(xlator_req.name);</div><div class='add'>+    xlator_req.name = NULL;</div><div class='ctx'> </div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+glusterfs_handle_dump_metrics(rpcsvc_request_t *req)</div><div class='add'>+{</div><div class='add'>+    int32_t ret = -1;</div><div class='add'>+    gd1_mgmt_brick_op_req xlator_req = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    xlator_t *this = NULL;</div><div class='add'>+    glusterfs_ctx_t *ctx = NULL;</div><div class='add'>+    char *filepath = NULL;</div><div class='add'>+    int fd = -1;</div><div class='add'>+    struct stat statbuf = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    char *msg = NULL;</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(req);</div><div class='add'>+    this = THIS;</div><div class='add'>+    GF_ASSERT(this);</div><div class='add'>+</div><div class='add'>+    ret = xdr_to_generic(req-&gt;msg[0], &amp;xlator_req,</div><div class='add'>+                         (xdrproc_t)xdr_gd1_mgmt_brick_op_req);</div><div class='add'>+</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        /*failed to decode msg;*/</div><div class='add'>+        req-&gt;rpc_err = GARBAGE_ARGS;</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+    ret = -1;</div><div class='add'>+    ctx = this-&gt;ctx;</div><div class='add'>+</div><div class='add'>+    /* Infra for monitoring */</div><div class='add'>+    filepath = gf_monitor_metrics(ctx);</div><div class='add'>+    if (!filepath)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    fd = sys_open(filepath, O_RDONLY, 0);</div><div class='add'>+    if (fd &lt; 0)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    if (sys_fstat(fd, &amp;statbuf) &lt; 0)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    if (statbuf.st_size &gt; GF_UNIT_MB) {</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_WARNING, ENOMEM, LG_MSG_NO_MEMORY,</div><div class='add'>+                "reconsider logic (%" PRId64 ")", statbuf.st_size, NULL);</div><div class='add'>+    }</div><div class='add'>+    msg = GF_CALLOC(1, (statbuf.st_size + 1), gf_common_mt_char);</div><div class='add'>+    if (!msg)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    ret = sys_read(fd, msg, statbuf.st_size);</div><div class='add'>+    if (ret &lt; 0)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    /* Send all the data in errstr, instead of dictionary for now */</div><div class='add'>+    glusterfs_translator_info_response_send(req, 0, msg, NULL);</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='ctx'> out:</div><div class='del'>-        STACK_DESTROY (frame-&gt;root);</div><div class='add'>+    if (fd &gt;= 0)</div><div class='add'>+        sys_close(fd);</div><div class='ctx'> </div><div class='del'>-        if (rsp.spec)</div><div class='del'>-                free (rsp.spec);</div><div class='add'>+    GF_FREE(msg);</div><div class='add'>+    GF_FREE(filepath);</div><div class='add'>+    if (xlator_req.input.input_val)</div><div class='add'>+        free(xlator_req.input.input_val);</div><div class='add'>+    if (xlator_req.dict.dict_val)</div><div class='add'>+        free(xlator_req.dict.dict_val);</div><div class='ctx'> </div><div class='del'>-        if (ret &amp;&amp; ctx &amp;&amp; ctx-&gt;master) {</div><div class='del'>-                /* Failed to get the volume file, start fuse anyways */</div><div class='del'>-                xlator_notify (ctx-&gt;master,</div><div class='del'>-                               GF_EVENT_CHILD_CONNECTING, NULL);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        }</div><div class='del'>-        return 0;</div><div class='add'>+int</div><div class='add'>+glusterfs_handle_defrag(rpcsvc_request_t *req)</div><div class='add'>+{</div><div class='add'>+    int32_t ret = -1;</div><div class='add'>+    gd1_mgmt_brick_op_req xlator_req = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    dict_t *dict = NULL;</div><div class='add'>+    xlator_t *xlator = NULL;</div><div class='add'>+    xlator_t *any = NULL;</div><div class='add'>+    dict_t *output = NULL;</div><div class='add'>+    char msg[2048] = {0};</div><div class='add'>+    glusterfs_ctx_t *ctx = NULL;</div><div class='add'>+    glusterfs_graph_t *active = NULL;</div><div class='add'>+    xlator_t *this = NULL;</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(req);</div><div class='add'>+    this = THIS;</div><div class='add'>+    GF_ASSERT(this);</div><div class='add'>+</div><div class='add'>+    ctx = glusterfsd_ctx;</div><div class='add'>+    GF_ASSERT(ctx);</div><div class='add'>+</div><div class='add'>+    active = ctx-&gt;active;</div><div class='add'>+    if (!active) {</div><div class='add'>+        req-&gt;rpc_err = GARBAGE_ARGS;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    any = active-&gt;first;</div><div class='add'>+    ret = xdr_to_generic(req-&gt;msg[0], &amp;xlator_req,</div><div class='add'>+                         (xdrproc_t)xdr_gd1_mgmt_brick_op_req);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        // failed to decode msg;</div><div class='add'>+        req-&gt;rpc_err = GARBAGE_ARGS;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    dict = dict_new();</div><div class='add'>+    if (!dict)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    ret = dict_unserialize(xlator_req.input.input_val,</div><div class='add'>+                           xlator_req.input.input_len, &amp;dict);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        gf_log(this-&gt;name, GF_LOG_ERROR,</div><div class='add'>+               "failed to "</div><div class='add'>+               "unserialize req-buffer to dictionary");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    xlator = xlator_search_by_name(any, xlator_req.name);</div><div class='add'>+    if (!xlator) {</div><div class='add'>+        snprintf(msg, sizeof(msg), "xlator %s is not loaded", xlator_req.name);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    output = dict_new();</div><div class='add'>+    if (!output) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = xlator-&gt;notify(xlator, GF_EVENT_VOLUME_DEFRAG, dict, output);</div><div class='add'>+</div><div class='add'>+    ret = glusterfs_translator_info_response_send(req, ret, msg, output);</div><div class='add'>+out:</div><div class='add'>+    if (dict)</div><div class='add'>+        dict_unref(dict);</div><div class='add'>+    free(xlator_req.input.input_val);  // malloced by xdr</div><div class='add'>+    if (xlator_req.dict.dict_val)</div><div class='add'>+        free(xlator_req.dict.dict_val);</div><div class='add'>+    if (output)</div><div class='add'>+        dict_unref(output);</div><div class='add'>+    free(xlator_req.name);  // malloced by xdr</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='add'>+int</div><div class='add'>+glusterfs_handle_brick_status(rpcsvc_request_t *req)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    gd1_mgmt_brick_op_req brick_req = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    gd1_mgmt_brick_op_rsp rsp = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    glusterfs_ctx_t *ctx = NULL;</div><div class='add'>+    glusterfs_graph_t *active = NULL;</div><div class='add'>+    xlator_t *this = NULL;</div><div class='add'>+    xlator_t *server_xl = NULL;</div><div class='add'>+    xlator_t *brick_xl = NULL;</div><div class='add'>+    dict_t *dict = NULL;</div><div class='add'>+    dict_t *output = NULL;</div><div class='add'>+    uint32_t cmd = 0;</div><div class='add'>+    char *msg = NULL;</div><div class='add'>+    char *brickname = NULL;</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(req);</div><div class='add'>+    this = THIS;</div><div class='add'>+    GF_ASSERT(this);</div><div class='add'>+</div><div class='add'>+    ret = xdr_to_generic(req-&gt;msg[0], &amp;brick_req,</div><div class='add'>+                         (xdrproc_t)xdr_gd1_mgmt_brick_op_req);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        req-&gt;rpc_err = GARBAGE_ARGS;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    dict = dict_new();</div><div class='add'>+    ret = dict_unserialize(brick_req.input.input_val, brick_req.input.input_len,</div><div class='add'>+                           &amp;dict);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        gf_log(this-&gt;name, GF_LOG_ERROR,</div><div class='add'>+               "Failed to unserialize "</div><div class='add'>+               "req-buffer to dictionary");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_get_uint32(dict, "cmd", &amp;cmd);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log(this-&gt;name, GF_LOG_ERROR, "Couldn't get status op");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_get_str(dict, "brick-name", &amp;brickname);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log(this-&gt;name, GF_LOG_ERROR,</div><div class='add'>+               "Couldn't get brickname from"</div><div class='add'>+               " dict");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ctx = glusterfsd_ctx;</div><div class='add'>+    if (ctx == NULL) {</div><div class='add'>+        gf_log(this-&gt;name, GF_LOG_ERROR, "ctx returned NULL");</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    if (ctx-&gt;active == NULL) {</div><div class='add'>+        gf_log(this-&gt;name, GF_LOG_ERROR, "ctx-&gt;active returned NULL");</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    active = ctx-&gt;active;</div><div class='add'>+    if (ctx-&gt;active-&gt;first == NULL) {</div><div class='add'>+        gf_log(this-&gt;name, GF_LOG_ERROR,</div><div class='add'>+               "ctx-&gt;active-&gt;first "</div><div class='add'>+               "returned NULL");</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    server_xl = active-&gt;first;</div><div class='add'>+</div><div class='add'>+    brick_xl = get_xlator_by_name(server_xl, brickname);</div><div class='add'>+    if (!brick_xl) {</div><div class='add'>+        gf_log(this-&gt;name, GF_LOG_ERROR, "xlator is not loaded");</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    output = dict_new();</div><div class='add'>+    switch (cmd &amp; GF_CLI_STATUS_MASK) {</div><div class='add'>+        case GF_CLI_STATUS_MEM:</div><div class='add'>+            ret = 0;</div><div class='add'>+            gf_proc_dump_mem_info_to_dict(output);</div><div class='add'>+            gf_proc_dump_mempool_info_to_dict(ctx, output);</div><div class='add'>+            break;</div><div class='add'>+</div><div class='add'>+        case GF_CLI_STATUS_CLIENTS:</div><div class='add'>+        case GF_CLI_STATUS_CLIENT_LIST:</div><div class='add'>+            ret = server_xl-&gt;dumpops-&gt;priv_to_dict(server_xl, output,</div><div class='add'>+                                                   brickname);</div><div class='add'>+            break;</div><div class='add'>+</div><div class='add'>+        case GF_CLI_STATUS_INODE:</div><div class='add'>+            ret = server_xl-&gt;dumpops-&gt;inode_to_dict(brick_xl, output);</div><div class='add'>+            break;</div><div class='add'>+</div><div class='add'>+        case GF_CLI_STATUS_FD:</div><div class='add'>+            ret = server_xl-&gt;dumpops-&gt;fd_to_dict(brick_xl, output);</div><div class='add'>+            break;</div><div class='add'>+</div><div class='add'>+        case GF_CLI_STATUS_CALLPOOL:</div><div class='add'>+            ret = 0;</div><div class='add'>+            gf_proc_dump_pending_frames_to_dict(ctx-&gt;pool, output);</div><div class='add'>+            break;</div><div class='add'>+</div><div class='add'>+        default:</div><div class='add'>+            ret = -1;</div><div class='add'>+            msg = gf_strdup("Unknown status op");</div><div class='add'>+            break;</div><div class='add'>+    }</div><div class='add'>+    rsp.op_ret = ret;</div><div class='add'>+    rsp.op_errno = 0;</div><div class='add'>+    if (ret &amp;&amp; msg)</div><div class='add'>+        rsp.op_errstr = msg;</div><div class='add'>+    else</div><div class='add'>+        rsp.op_errstr = "";</div><div class='add'>+</div><div class='add'>+    ret = dict_allocate_and_serialize(output, &amp;rsp.output.output_val,</div><div class='add'>+                                      &amp;rsp.output.output_len);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log(this-&gt;name, GF_LOG_ERROR,</div><div class='add'>+               "Failed to serialize output dict to rsp");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    glusterfs_submit_reply(req, &amp;rsp, NULL, 0, NULL,</div><div class='add'>+                           (xdrproc_t)xdr_gd1_mgmt_brick_op_rsp);</div><div class='add'>+    ret = 0;</div><div class='ctx'> </div><div class='add'>+out:</div><div class='add'>+    if (dict)</div><div class='add'>+        dict_unref(dict);</div><div class='add'>+    if (output)</div><div class='add'>+        dict_unref(output);</div><div class='add'>+    free(brick_req.input.input_val);</div><div class='add'>+    if (brick_req.dict.dict_val)</div><div class='add'>+        free(brick_req.dict.dict_val);</div><div class='add'>+    free(brick_req.name);</div><div class='add'>+    GF_FREE(msg);</div><div class='add'>+    GF_FREE(rsp.output.output_val);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-glusterfs_volfile_fetch (glusterfs_ctx_t *ctx)</div><div class='add'>+glusterfs_handle_node_status(rpcsvc_request_t *req)</div><div class='ctx'> {</div><div class='del'>-        cmd_args_t       *cmd_args = NULL;</div><div class='del'>-        gf_getspec_req    req = {0, };</div><div class='del'>-        int               ret = 0;</div><div class='del'>-        call_frame_t     *frame = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    gd1_mgmt_brick_op_req node_req = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    gd1_mgmt_brick_op_rsp rsp = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    glusterfs_ctx_t *ctx = NULL;</div><div class='add'>+    glusterfs_graph_t *active = NULL;</div><div class='add'>+    xlator_t *any = NULL;</div><div class='add'>+    xlator_t *node = NULL;</div><div class='add'>+    xlator_t *subvol = NULL;</div><div class='add'>+    dict_t *dict = NULL;</div><div class='add'>+    dict_t *output = NULL;</div><div class='add'>+    char *volname = NULL;</div><div class='add'>+    char *node_name = NULL;</div><div class='add'>+    char *subvol_name = NULL;</div><div class='add'>+    uint32_t cmd = 0;</div><div class='add'>+    char *msg = NULL;</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(req);</div><div class='add'>+</div><div class='add'>+    ret = xdr_to_generic(req-&gt;msg[0], &amp;node_req,</div><div class='add'>+                         (xdrproc_t)xdr_gd1_mgmt_brick_op_req);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        req-&gt;rpc_err = GARBAGE_ARGS;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    dict = dict_new();</div><div class='add'>+    ret = dict_unserialize(node_req.input.input_val, node_req.input.input_len,</div><div class='add'>+                           &amp;dict);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        gf_log(THIS-&gt;name, GF_LOG_ERROR,</div><div class='add'>+               "Failed to unserialize "</div><div class='add'>+               "req buffer to dictionary");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_get_uint32(dict, "cmd", &amp;cmd);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log(THIS-&gt;name, GF_LOG_ERROR, "Couldn't get status op");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_get_str(dict, "volname", &amp;volname);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log(THIS-&gt;name, GF_LOG_ERROR, "Couldn't get volname");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ctx = glusterfsd_ctx;</div><div class='add'>+    GF_ASSERT(ctx);</div><div class='add'>+    active = ctx-&gt;active;</div><div class='add'>+    if (active == NULL) {</div><div class='add'>+        gf_log(THIS-&gt;name, GF_LOG_ERROR, "ctx-&gt;active returned NULL");</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    any = active-&gt;first;</div><div class='add'>+</div><div class='add'>+    if ((cmd &amp; GF_CLI_STATUS_SHD) != 0)</div><div class='add'>+        ret = gf_asprintf(&amp;node_name, "%s", "glustershd");</div><div class='add'>+#ifdef BUILD_GNFS</div><div class='add'>+    else if ((cmd &amp; GF_CLI_STATUS_NFS) != 0)</div><div class='add'>+        ret = gf_asprintf(&amp;node_name, "%s", "nfs-server");</div><div class='add'>+#endif</div><div class='add'>+    else if ((cmd &amp; GF_CLI_STATUS_QUOTAD) != 0)</div><div class='add'>+        ret = gf_asprintf(&amp;node_name, "%s", "quotad");</div><div class='add'>+    else if ((cmd &amp; GF_CLI_STATUS_BITD) != 0)</div><div class='add'>+        ret = gf_asprintf(&amp;node_name, "%s", "bitd");</div><div class='add'>+    else if ((cmd &amp; GF_CLI_STATUS_SCRUB) != 0)</div><div class='add'>+        ret = gf_asprintf(&amp;node_name, "%s", "scrubber");</div><div class='add'>+</div><div class='add'>+    else {</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    if (ret == -1) {</div><div class='add'>+        gf_log(THIS-&gt;name, GF_LOG_ERROR, "Failed to set node xlator name");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    node = xlator_search_by_name(any, node_name);</div><div class='add'>+    if (!node) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        gf_log(THIS-&gt;name, GF_LOG_ERROR, "%s xlator is not loaded", node_name);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if ((cmd &amp; GF_CLI_STATUS_NFS) != 0)</div><div class='add'>+        ret = gf_asprintf(&amp;subvol_name, "%s", volname);</div><div class='add'>+    else if ((cmd &amp; GF_CLI_STATUS_SHD) != 0)</div><div class='add'>+        ret = gf_asprintf(&amp;subvol_name, "%s-replicate-0", volname);</div><div class='add'>+    else if ((cmd &amp; GF_CLI_STATUS_QUOTAD) != 0)</div><div class='add'>+        ret = gf_asprintf(&amp;subvol_name, "%s", volname);</div><div class='add'>+    else if ((cmd &amp; GF_CLI_STATUS_BITD) != 0)</div><div class='add'>+        ret = gf_asprintf(&amp;subvol_name, "%s", volname);</div><div class='add'>+    else if ((cmd &amp; GF_CLI_STATUS_SCRUB) != 0)</div><div class='add'>+        ret = gf_asprintf(&amp;subvol_name, "%s", volname);</div><div class='add'>+    else {</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    if (ret == -1) {</div><div class='add'>+        gf_log(THIS-&gt;name, GF_LOG_ERROR, "Failed to set node xlator name");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    subvol = xlator_search_by_name(node, subvol_name);</div><div class='add'>+    if (!subvol) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        gf_log(THIS-&gt;name, GF_LOG_ERROR, "%s xlator is not loaded",</div><div class='add'>+               subvol_name);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    output = dict_new();</div><div class='add'>+    switch (cmd &amp; GF_CLI_STATUS_MASK) {</div><div class='add'>+        case GF_CLI_STATUS_MEM:</div><div class='add'>+            ret = 0;</div><div class='add'>+            gf_proc_dump_mem_info_to_dict(output);</div><div class='add'>+            gf_proc_dump_mempool_info_to_dict(ctx, output);</div><div class='add'>+            break;</div><div class='add'>+</div><div class='add'>+        case GF_CLI_STATUS_CLIENTS:</div><div class='add'>+            // clients not available for SHD</div><div class='add'>+            if ((cmd &amp; GF_CLI_STATUS_SHD) != 0)</div><div class='add'>+                break;</div><div class='add'>+</div><div class='add'>+            ret = dict_set_str(output, "volname", volname);</div><div class='add'>+            if (ret) {</div><div class='add'>+                gf_log(THIS-&gt;name, GF_LOG_ERROR,</div><div class='add'>+                       "Error setting volname to dict");</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+            ret = node-&gt;dumpops-&gt;priv_to_dict(node, output, NULL);</div><div class='add'>+            break;</div><div class='add'>+</div><div class='add'>+        case GF_CLI_STATUS_INODE:</div><div class='add'>+            ret = 0;</div><div class='add'>+            inode_table_dump_to_dict(subvol-&gt;itable, "conn0", output);</div><div class='add'>+            ret = dict_set_int32(output, "conncount", 1);</div><div class='add'>+            break;</div><div class='add'>+</div><div class='add'>+        case GF_CLI_STATUS_FD:</div><div class='add'>+            // cannot find fd-tables in nfs-server graph</div><div class='add'>+            // TODO: finish once found</div><div class='add'>+            break;</div><div class='add'>+</div><div class='add'>+        case GF_CLI_STATUS_CALLPOOL:</div><div class='add'>+            ret = 0;</div><div class='add'>+            gf_proc_dump_pending_frames_to_dict(ctx-&gt;pool, output);</div><div class='add'>+            break;</div><div class='ctx'> </div><div class='del'>-        cmd_args = &amp;ctx-&gt;cmd_args;</div><div class='add'>+        default:</div><div class='add'>+            ret = -1;</div><div class='add'>+            msg = gf_strdup("Unknown status op");</div><div class='add'>+            gf_log(THIS-&gt;name, GF_LOG_ERROR, "%s", msg);</div><div class='add'>+            break;</div><div class='add'>+    }</div><div class='add'>+    rsp.op_ret = ret;</div><div class='add'>+    rsp.op_errno = 0;</div><div class='add'>+    if (ret &amp;&amp; msg)</div><div class='add'>+        rsp.op_errstr = msg;</div><div class='add'>+    else</div><div class='add'>+        rsp.op_errstr = "";</div><div class='add'>+</div><div class='add'>+    ret = dict_allocate_and_serialize(output, &amp;rsp.output.output_val,</div><div class='add'>+                                      &amp;rsp.output.output_len);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log(THIS-&gt;name, GF_LOG_ERROR,</div><div class='add'>+               "Failed to serialize output dict to rsp");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    glusterfs_submit_reply(req, &amp;rsp, NULL, 0, NULL,</div><div class='add'>+                           (xdrproc_t)xdr_gd1_mgmt_brick_op_rsp);</div><div class='add'>+    ret = 0;</div><div class='ctx'> </div><div class='del'>-        frame = create_frame (THIS, ctx-&gt;pool);</div><div class='add'>+out:</div><div class='add'>+    if (dict)</div><div class='add'>+        dict_unref(dict);</div><div class='add'>+    free(node_req.input.input_val);</div><div class='add'>+    if (node_req.dict.dict_val)</div><div class='add'>+        free(node_req.dict.dict_val);</div><div class='add'>+    GF_FREE(msg);</div><div class='add'>+    GF_FREE(rsp.output.output_val);</div><div class='add'>+    GF_FREE(node_name);</div><div class='add'>+    GF_FREE(subvol_name);</div><div class='add'>+</div><div class='add'>+    gf_log(THIS-&gt;name, GF_LOG_DEBUG, "Returning %d", ret);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        req.key = cmd_args-&gt;volfile_id;</div><div class='del'>-        req.flags = 0;</div><div class='add'>+int</div><div class='add'>+glusterfs_handle_nfs_profile(rpcsvc_request_t *req)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    gd1_mgmt_brick_op_req nfs_req = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    gd1_mgmt_brick_op_rsp rsp = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    dict_t *dict = NULL;</div><div class='add'>+    glusterfs_ctx_t *ctx = NULL;</div><div class='add'>+    glusterfs_graph_t *active = NULL;</div><div class='add'>+    xlator_t *any = NULL;</div><div class='add'>+    xlator_t *nfs = NULL;</div><div class='add'>+    xlator_t *subvol = NULL;</div><div class='add'>+    char *volname = NULL;</div><div class='add'>+    dict_t *output = NULL;</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(req);</div><div class='add'>+</div><div class='add'>+    ret = xdr_to_generic(req-&gt;msg[0], &amp;nfs_req,</div><div class='add'>+                         (xdrproc_t)xdr_gd1_mgmt_brick_op_req);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        req-&gt;rpc_err = GARBAGE_ARGS;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    dict = dict_new();</div><div class='add'>+    ret = dict_unserialize(nfs_req.input.input_val, nfs_req.input.input_len,</div><div class='add'>+                           &amp;dict);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        gf_log(THIS-&gt;name, GF_LOG_ERROR,</div><div class='add'>+               "Failed to "</div><div class='add'>+               "unserialize req-buffer to dict");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_get_str(dict, "volname", &amp;volname);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log(THIS-&gt;name, GF_LOG_ERROR, "Couldn't get volname");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ctx = glusterfsd_ctx;</div><div class='add'>+    GF_ASSERT(ctx);</div><div class='add'>+</div><div class='add'>+    active = ctx-&gt;active;</div><div class='add'>+    if (active == NULL) {</div><div class='add'>+        gf_log(THIS-&gt;name, GF_LOG_ERROR, "ctx-&gt;active returned NULL");</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    any = active-&gt;first;</div><div class='add'>+</div><div class='add'>+    // is this needed?</div><div class='add'>+    // are problems possible by searching for subvol directly from "any"?</div><div class='add'>+    nfs = xlator_search_by_name(any, "nfs-server");</div><div class='add'>+    if (!nfs) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        gf_log(THIS-&gt;name, GF_LOG_ERROR,</div><div class='add'>+               "xlator nfs-server is "</div><div class='add'>+               "not loaded");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    subvol = xlator_search_by_name(nfs, volname);</div><div class='add'>+    if (!subvol) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        gf_log(THIS-&gt;name, GF_LOG_ERROR, "xlator %s is no loaded", volname);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    output = dict_new();</div><div class='add'>+    ret = subvol-&gt;notify(subvol, GF_EVENT_TRANSLATOR_INFO, dict, output);</div><div class='add'>+</div><div class='add'>+    rsp.op_ret = ret;</div><div class='add'>+    rsp.op_errno = 0;</div><div class='add'>+    rsp.op_errstr = "";</div><div class='add'>+</div><div class='add'>+    ret = dict_allocate_and_serialize(output, &amp;rsp.output.output_val,</div><div class='add'>+                                      &amp;rsp.output.output_len);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log(THIS-&gt;name, GF_LOG_ERROR,</div><div class='add'>+               "Failed to serialize output dict to rsp");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    glusterfs_submit_reply(req, &amp;rsp, NULL, 0, NULL,</div><div class='add'>+                           (xdrproc_t)xdr_gd1_mgmt_brick_op_rsp);</div><div class='add'>+    ret = 0;</div><div class='ctx'> </div><div class='del'>-        ret = mgmt_submit_request (&amp;req, frame, ctx, &amp;clnt_handshake_prog,</div><div class='del'>-                                   GF_HNDSK_GETSPEC, xdr_from_getspec_req,</div><div class='del'>-                                   mgmt_getspec_cbk);</div><div class='del'>-        return ret;</div><div class='add'>+out:</div><div class='add'>+    free(nfs_req.input.input_val);</div><div class='add'>+    if (nfs_req.dict.dict_val)</div><div class='add'>+        free(nfs_req.dict.dict_val);</div><div class='add'>+    if (dict)</div><div class='add'>+        dict_unref(dict);</div><div class='add'>+    if (output)</div><div class='add'>+        dict_unref(output);</div><div class='add'>+    GF_FREE(rsp.output.output_val);</div><div class='add'>+</div><div class='add'>+    gf_log(THIS-&gt;name, GF_LOG_DEBUG, "Returning %d", ret);</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+int</div><div class='add'>+glusterfs_handle_volume_barrier_op(rpcsvc_request_t *req)</div><div class='add'>+{</div><div class='add'>+    int32_t ret = -1;</div><div class='add'>+    gd1_mgmt_brick_op_req xlator_req = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    dict_t *dict = NULL;</div><div class='add'>+    xlator_t *xlator = NULL;</div><div class='add'>+    xlator_t *any = NULL;</div><div class='add'>+    dict_t *output = NULL;</div><div class='add'>+    char msg[2048] = {0};</div><div class='add'>+    glusterfs_ctx_t *ctx = NULL;</div><div class='add'>+    glusterfs_graph_t *active = NULL;</div><div class='add'>+    xlator_t *this = NULL;</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(req);</div><div class='add'>+    this = THIS;</div><div class='add'>+    GF_ASSERT(this);</div><div class='add'>+</div><div class='add'>+    ctx = glusterfsd_ctx;</div><div class='add'>+    GF_ASSERT(ctx);</div><div class='add'>+</div><div class='add'>+    active = ctx-&gt;active;</div><div class='add'>+    if (!active) {</div><div class='add'>+        req-&gt;rpc_err = GARBAGE_ARGS;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    any = active-&gt;first;</div><div class='add'>+    ret = xdr_to_generic(req-&gt;msg[0], &amp;xlator_req,</div><div class='add'>+                         (xdrproc_t)xdr_gd1_mgmt_brick_op_req);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        // failed to decode msg;</div><div class='add'>+        req-&gt;rpc_err = GARBAGE_ARGS;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    dict = dict_new();</div><div class='add'>+    if (!dict)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    ret = dict_unserialize(xlator_req.input.input_val,</div><div class='add'>+                           xlator_req.input.input_len, &amp;dict);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        gf_log(this-&gt;name, GF_LOG_ERROR,</div><div class='add'>+               "failed to "</div><div class='add'>+               "unserialize req-buffer to dictionary");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    xlator = xlator_search_by_name(any, xlator_req.name);</div><div class='add'>+    if (!xlator) {</div><div class='add'>+        snprintf(msg, sizeof(msg), "xlator %s is not loaded", xlator_req.name);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    output = dict_new();</div><div class='add'>+    if (!output) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = xlator-&gt;notify(xlator, GF_EVENT_VOLUME_BARRIER_OP, dict, output);</div><div class='add'>+</div><div class='add'>+    ret = glusterfs_translator_info_response_send(req, ret, msg, output);</div><div class='add'>+out:</div><div class='add'>+    if (dict)</div><div class='add'>+        dict_unref(dict);</div><div class='add'>+    free(xlator_req.input.input_val);  // malloced by xdr</div><div class='add'>+    if (xlator_req.dict.dict_val)</div><div class='add'>+        free(xlator_req.dict.dict_val);</div><div class='add'>+    if (output)</div><div class='add'>+        dict_unref(output);</div><div class='add'>+    free(xlator_req.name);  // malloced by xdr</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-static int</div><div class='del'>-mgmt_rpc_notify (struct rpc_clnt *rpc, void *mydata, rpc_clnt_event_t event,</div><div class='del'>-                 void *data)</div><div class='add'>+int</div><div class='add'>+glusterfs_handle_barrier(rpcsvc_request_t *req)</div><div class='ctx'> {</div><div class='del'>-        xlator_t        *this = NULL;</div><div class='del'>-        glusterfs_ctx_t *ctx = NULL;</div><div class='del'>-        int              ret = 0;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    gd1_mgmt_brick_op_req brick_req = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    gd1_mgmt_brick_op_rsp brick_rsp = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    glusterfs_ctx_t *ctx = NULL;</div><div class='add'>+    glusterfs_graph_t *active = NULL;</div><div class='add'>+    xlator_t *top = NULL;</div><div class='add'>+    xlator_t *xlator = NULL;</div><div class='add'>+    xlator_t *old_THIS = NULL;</div><div class='add'>+    dict_t *dict = NULL;</div><div class='add'>+    gf_boolean_t barrier = _gf_true;</div><div class='add'>+    xlator_list_t *trav;</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(req);</div><div class='add'>+</div><div class='add'>+    ret = xdr_to_generic(req-&gt;msg[0], &amp;brick_req,</div><div class='add'>+                         (xdrproc_t)xdr_gd1_mgmt_brick_op_req);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        req-&gt;rpc_err = GARBAGE_ARGS;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ctx = glusterfsd_ctx;</div><div class='add'>+    GF_ASSERT(ctx);</div><div class='add'>+    active = ctx-&gt;active;</div><div class='add'>+    if (active == NULL) {</div><div class='add'>+        gf_log(THIS-&gt;name, GF_LOG_ERROR, "ctx-&gt;active returned NULL");</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    top = active-&gt;first;</div><div class='add'>+</div><div class='add'>+    for (trav = top-&gt;children; trav; trav = trav-&gt;next) {</div><div class='add'>+        if (strcmp(trav-&gt;xlator-&gt;name, brick_req.name) == 0) {</div><div class='add'>+            break;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    if (!trav) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    top = trav-&gt;xlator;</div><div class='add'>+</div><div class='add'>+    dict = dict_new();</div><div class='add'>+    if (!dict) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_unserialize(brick_req.input.input_val, brick_req.input.input_len,</div><div class='add'>+                           &amp;dict);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        gf_log(THIS-&gt;name, GF_LOG_ERROR,</div><div class='add'>+               "Failed to unserialize "</div><div class='add'>+               "request dictionary");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    brick_rsp.op_ret = 0;</div><div class='add'>+    brick_rsp.op_errstr = "";  // initing to prevent serilaztion failures</div><div class='add'>+    old_THIS = THIS;</div><div class='add'>+</div><div class='add'>+    /* Send barrier request to the barrier xlator */</div><div class='add'>+    xlator = get_xlator_by_type(top, "features/barrier");</div><div class='add'>+    if (!xlator) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        gf_log(THIS-&gt;name, GF_LOG_ERROR, "%s xlator is not loaded",</div><div class='add'>+               "features/barrier");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    THIS = xlator;</div><div class='add'>+    // TODO: Extend this to accept return of errnos</div><div class='add'>+    ret = xlator-&gt;notify(xlator, GF_EVENT_TRANSLATOR_OP, dict);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log(THIS-&gt;name, GF_LOG_ERROR, "barrier notify failed");</div><div class='add'>+        brick_rsp.op_ret = ret;</div><div class='add'>+        brick_rsp.op_errstr = gf_strdup(</div><div class='add'>+            "Failed to reconfigure "</div><div class='add'>+            "barrier.");</div><div class='add'>+        /* This is to invoke changelog-barrier disable if barrier</div><div class='add'>+         * disable fails and don't invoke if barrier enable fails.</div><div class='add'>+         */</div><div class='add'>+        barrier = dict_get_str_boolean(dict, "barrier", _gf_true);</div><div class='add'>+        if (barrier)</div><div class='add'>+            goto submit_reply;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Reset THIS so that we have it correct in case of an error below</div><div class='add'>+     */</div><div class='add'>+    THIS = old_THIS;</div><div class='add'>+</div><div class='add'>+    /* Send barrier request to changelog as well */</div><div class='add'>+    xlator = get_xlator_by_type(top, "features/changelog");</div><div class='add'>+    if (!xlator) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        gf_log(THIS-&gt;name, GF_LOG_ERROR, "%s xlator is not loaded",</div><div class='add'>+               "features/changelog");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    THIS = xlator;</div><div class='add'>+    ret = xlator-&gt;notify(xlator, GF_EVENT_TRANSLATOR_OP, dict);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log(THIS-&gt;name, GF_LOG_ERROR, "changelog notify failed");</div><div class='add'>+        brick_rsp.op_ret = ret;</div><div class='add'>+        brick_rsp.op_errstr = gf_strdup("changelog notify failed");</div><div class='add'>+        goto submit_reply;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+submit_reply:</div><div class='add'>+    THIS = old_THIS;</div><div class='add'>+</div><div class='add'>+    ret = glusterfs_submit_reply(req, &amp;brick_rsp, NULL, 0, NULL,</div><div class='add'>+                                 (xdrproc_t)xdr_gd1_mgmt_brick_op_rsp);</div><div class='ctx'> </div><div class='del'>-        this = mydata;</div><div class='del'>-        ctx = this-&gt;ctx;</div><div class='add'>+out:</div><div class='add'>+    if (dict)</div><div class='add'>+        dict_unref(dict);</div><div class='add'>+    free(brick_req.input.input_val);</div><div class='add'>+    if (brick_req.dict.dict_val)</div><div class='add'>+        free(brick_req.dict.dict_val);</div><div class='add'>+    gf_log(THIS-&gt;name, GF_LOG_DEBUG, "Returning %d", ret);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        switch (event) {</div><div class='del'>-        case RPC_CLNT_CONNECT:</div><div class='del'>-                rpc_clnt_set_connected (ctx-&gt;mgmt);</div><div class='add'>+int</div><div class='add'>+glusterfs_handle_rpc_msg(rpcsvc_request_t *req)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    /* for now, nothing */</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-                ret = glusterfs_volfile_fetch (ctx);</div><div class='del'>-                if (ret &amp;&amp; ctx &amp;&amp; ctx-&gt;master) {</div><div class='del'>-                        /* Failed to get the volume file, start fuse anyways */</div><div class='del'>-                        xlator_notify (ctx-&gt;master,</div><div class='del'>-                                       GF_EVENT_CHILD_CONNECTING, NULL);</div><div class='add'>+static rpcclnt_cb_actor_t mgmt_cbk_actors[GF_CBK_MAXVALUE] = {</div><div class='add'>+    [GF_CBK_FETCHSPEC] = {"FETCHSPEC", mgmt_cbk_spec, GF_CBK_FETCHSPEC},</div><div class='add'>+    [GF_CBK_EVENT_NOTIFY] = {"EVENTNOTIFY", mgmt_cbk_event,</div><div class='add'>+                             GF_CBK_EVENT_NOTIFY},</div><div class='add'>+    [GF_CBK_STATEDUMP] = {"STATEDUMP", mgmt_cbk_event, GF_CBK_STATEDUMP},</div><div class='add'>+};</div><div class='ctx'> </div><div class='del'>-                        gf_log ("", GF_LOG_WARNING,</div><div class='del'>-                                "failed to fetch volume file");</div><div class='del'>-                }</div><div class='add'>+static struct rpcclnt_cb_program mgmt_cbk_prog = {</div><div class='add'>+    .progname = "GlusterFS Callback",</div><div class='add'>+    .prognum = GLUSTER_CBK_PROGRAM,</div><div class='add'>+    .progver = GLUSTER_CBK_VERSION,</div><div class='add'>+    .actors = mgmt_cbk_actors,</div><div class='add'>+    .numactors = GF_CBK_MAXVALUE,</div><div class='add'>+};</div><div class='ctx'> </div><div class='del'>-                if (is_mgmt_rpc_reconnect)</div><div class='del'>-                        glusterfs_mgmt_pmap_signin (ctx);</div><div class='del'>-                break;</div><div class='del'>-        default:</div><div class='del'>-                if (ctx-&gt;master)</div><div class='del'>-                        ret = xlator_notify (ctx-&gt;master,</div><div class='del'>-                                             GF_EVENT_CHILD_CONNECTING, NULL);</div><div class='del'>-                gf_log ("", GF_LOG_WARNING,</div><div class='del'>-                        "failed to establish mgmt rpc connection (%d)", ret);</div><div class='del'>-                break;</div><div class='del'>-        }</div><div class='add'>+static char *clnt_pmap_procs[GF_PMAP_MAXVALUE] = {</div><div class='add'>+    [GF_PMAP_NULL] = "NULL",</div><div class='add'>+    [GF_PMAP_PORTBYBRICK] = "PORTBYBRICK",</div><div class='add'>+    [GF_PMAP_BRICKBYPORT] = "BRICKBYPORT",</div><div class='add'>+    [GF_PMAP_SIGNIN] = "SIGNIN",</div><div class='add'>+    [GF_PMAP_SIGNOUT] = "SIGNOUT",</div><div class='add'>+    [GF_PMAP_SIGNUP] = "SIGNUP", /* DEPRECATED - DON'T USE! */</div><div class='add'>+};</div><div class='ctx'> </div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='add'>+static rpc_clnt_prog_t clnt_pmap_prog = {</div><div class='add'>+    .progname = "Gluster Portmap",</div><div class='add'>+    .prognum = GLUSTER_PMAP_PROGRAM,</div><div class='add'>+    .progver = GLUSTER_PMAP_VERSION,</div><div class='add'>+    .procnames = clnt_pmap_procs,</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+static char *clnt_handshake_procs[GF_HNDSK_MAXVALUE] = {</div><div class='add'>+    [GF_HNDSK_NULL] = "NULL",</div><div class='add'>+    [GF_HNDSK_SETVOLUME] = "SETVOLUME",</div><div class='add'>+    [GF_HNDSK_GETSPEC] = "GETSPEC",</div><div class='add'>+    [GF_HNDSK_PING] = "PING",</div><div class='add'>+    [GF_HNDSK_EVENT_NOTIFY] = "EVENTNOTIFY",</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+static rpc_clnt_prog_t clnt_handshake_prog = {</div><div class='add'>+    .progname = "GlusterFS Handshake",</div><div class='add'>+    .prognum = GLUSTER_HNDSK_PROGRAM,</div><div class='add'>+    .progver = GLUSTER_HNDSK_VERSION,</div><div class='add'>+    .procnames = clnt_handshake_procs,</div><div class='add'>+};</div><div class='ctx'> </div><div class='add'>+static rpcsvc_actor_t glusterfs_actors[GLUSTERD_BRICK_MAXVALUE] = {</div><div class='add'>+    [GLUSTERD_BRICK_NULL] = {"NULL", glusterfs_handle_rpc_msg, NULL,</div><div class='add'>+                             GLUSTERD_BRICK_NULL, DRC_NA, 0},</div><div class='add'>+    [GLUSTERD_BRICK_TERMINATE] = {"TERMINATE", glusterfs_handle_terminate, NULL,</div><div class='add'>+                                  GLUSTERD_BRICK_TERMINATE, DRC_NA, 0},</div><div class='add'>+    [GLUSTERD_BRICK_XLATOR_INFO] = {"TRANSLATOR INFO",</div><div class='add'>+                                    glusterfs_handle_translator_info_get, NULL,</div><div class='add'>+                                    GLUSTERD_BRICK_XLATOR_INFO, DRC_NA, 0},</div><div class='add'>+    [GLUSTERD_BRICK_XLATOR_OP] = {"TRANSLATOR OP",</div><div class='add'>+                                  glusterfs_handle_translator_op, NULL,</div><div class='add'>+                                  GLUSTERD_BRICK_XLATOR_OP, DRC_NA, 0},</div><div class='add'>+    [GLUSTERD_BRICK_STATUS] = {"STATUS", glusterfs_handle_brick_status, NULL,</div><div class='add'>+                               GLUSTERD_BRICK_STATUS, DRC_NA, 0},</div><div class='add'>+    [GLUSTERD_BRICK_XLATOR_DEFRAG] = {"TRANSLATOR DEFRAG",</div><div class='add'>+                                      glusterfs_handle_defrag, NULL,</div><div class='add'>+                                      GLUSTERD_BRICK_XLATOR_DEFRAG, DRC_NA, 0},</div><div class='add'>+    [GLUSTERD_NODE_PROFILE] = {"NFS PROFILE", glusterfs_handle_nfs_profile,</div><div class='add'>+                               NULL, GLUSTERD_NODE_PROFILE, DRC_NA, 0},</div><div class='add'>+    [GLUSTERD_NODE_STATUS] = {"NFS STATUS", glusterfs_handle_node_status, NULL,</div><div class='add'>+                              GLUSTERD_NODE_STATUS, DRC_NA, 0},</div><div class='add'>+    [GLUSTERD_VOLUME_BARRIER_OP] = {"VOLUME BARRIER OP",</div><div class='add'>+                                    glusterfs_handle_volume_barrier_op, NULL,</div><div class='add'>+                                    GLUSTERD_VOLUME_BARRIER_OP, DRC_NA, 0},</div><div class='add'>+    [GLUSTERD_BRICK_BARRIER] = {"BARRIER", glusterfs_handle_barrier, NULL,</div><div class='add'>+                                GLUSTERD_BRICK_BARRIER, DRC_NA, 0},</div><div class='add'>+    [GLUSTERD_NODE_BITROT] = {"BITROT", glusterfs_handle_bitrot, NULL,</div><div class='add'>+                              GLUSTERD_NODE_BITROT, DRC_NA, 0},</div><div class='add'>+    [GLUSTERD_BRICK_ATTACH] = {"ATTACH", glusterfs_handle_attach, NULL,</div><div class='add'>+                               GLUSTERD_BRICK_ATTACH, DRC_NA, 0},</div><div class='add'>+</div><div class='add'>+    [GLUSTERD_DUMP_METRICS] = {"DUMP METRICS", glusterfs_handle_dump_metrics,</div><div class='add'>+                               NULL, GLUSTERD_DUMP_METRICS, DRC_NA, 0},</div><div class='add'>+</div><div class='add'>+    [GLUSTERD_SVC_ATTACH] = {"ATTACH CLIENT", glusterfs_handle_svc_attach, NULL,</div><div class='add'>+                             GLUSTERD_SVC_ATTACH, DRC_NA, 0},</div><div class='add'>+</div><div class='add'>+    [GLUSTERD_SVC_DETACH] = {"DETACH CLIENT", glusterfs_handle_svc_detach, NULL,</div><div class='add'>+                             GLUSTERD_SVC_DETACH, DRC_NA, 0},</div><div class='add'>+</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+static struct rpcsvc_program glusterfs_mop_prog = {</div><div class='add'>+    .progname = "Gluster Brick operations",</div><div class='add'>+    .prognum = GD_BRICK_PROGRAM,</div><div class='add'>+    .progver = GD_BRICK_VERSION,</div><div class='add'>+    .actors = glusterfs_actors,</div><div class='add'>+    .numactors = GLUSTERD_BRICK_MAXVALUE,</div><div class='add'>+    .synctask = _gf_true,</div><div class='add'>+};</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-glusterfs_mgmt_init (glusterfs_ctx_t *ctx)</div><div class='add'>+mgmt_submit_request(void *req, call_frame_t *frame, glusterfs_ctx_t *ctx,</div><div class='add'>+                    rpc_clnt_prog_t *prog, int procnum, fop_cbk_fn_t cbkfn,</div><div class='add'>+                    xdrproc_t xdrproc)</div><div class='ctx'> {</div><div class='del'>-        cmd_args_t              *cmd_args = NULL;</div><div class='del'>-        struct rpc_clnt         *rpc = NULL;</div><div class='del'>-        struct rpc_clnt_config  rpc_cfg = {0,};</div><div class='del'>-        dict_t                  *options = NULL;</div><div class='del'>-        int                     ret = -1;</div><div class='del'>-        int                     port = 6969;</div><div class='del'>-        char                    *host = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int count = 0;</div><div class='add'>+    struct iovec iov = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    struct iobuf *iobuf = NULL;</div><div class='add'>+    struct iobref *iobref = NULL;</div><div class='add'>+    ssize_t xdr_size = 0;</div><div class='add'>+</div><div class='add'>+    iobref = iobref_new();</div><div class='add'>+    if (!iobref) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (req) {</div><div class='add'>+        xdr_size = xdr_sizeof(xdrproc, req);</div><div class='add'>+</div><div class='add'>+        iobuf = iobuf_get2(ctx-&gt;iobuf_pool, xdr_size);</div><div class='add'>+        if (!iobuf) {</div><div class='add'>+            goto out;</div><div class='add'>+        };</div><div class='ctx'> </div><div class='del'>-        cmd_args = &amp;ctx-&gt;cmd_args;</div><div class='add'>+        iobref_add(iobref, iobuf);</div><div class='ctx'> </div><div class='del'>-        if (ctx-&gt;mgmt)</div><div class='del'>-                return 0;</div><div class='add'>+        iov.iov_base = iobuf-&gt;ptr;</div><div class='add'>+        iov.iov_len = iobuf_pagesize(iobuf);</div><div class='ctx'> </div><div class='del'>-        options = dict_new ();</div><div class='del'>-        if (!options)</div><div class='del'>-                goto out;</div><div class='add'>+        /* Create the xdr payload */</div><div class='add'>+        ret = xdr_serialize_generic(iov, req, xdrproc);</div><div class='add'>+        if (ret == -1) {</div><div class='add'>+            gf_log(THIS-&gt;name, GF_LOG_WARNING, "failed to create XDR payload");</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+        iov.iov_len = ret;</div><div class='add'>+        count = 1;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        if (cmd_args-&gt;volfile_server_port)</div><div class='del'>-                port = cmd_args-&gt;volfile_server_port;</div><div class='add'>+    /* Send the msg */</div><div class='add'>+    ret = rpc_clnt_submit(ctx-&gt;mgmt, prog, procnum, cbkfn, &amp;iov, count, NULL, 0,</div><div class='add'>+                          iobref, frame, NULL, 0, NULL, 0, NULL);</div><div class='ctx'> </div><div class='del'>-        host = "localhost";</div><div class='del'>-        if (cmd_args-&gt;volfile_server)</div><div class='del'>-                host = cmd_args-&gt;volfile_server;</div><div class='add'>+out:</div><div class='add'>+    if (iobref)</div><div class='add'>+        iobref_unref(iobref);</div><div class='ctx'> </div><div class='del'>-        rpc_cfg.remote_host = host;</div><div class='del'>-        rpc_cfg.remote_port = port;</div><div class='add'>+    if (iobuf)</div><div class='add'>+        iobuf_unref(iobuf);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        ret = dict_set_int32 (options, "remote-port", port);</div><div class='add'>+int</div><div class='add'>+mgmt_getspec_cbk(struct rpc_req *req, struct iovec *iov, int count,</div><div class='add'>+                 void *myframe)</div><div class='add'>+{</div><div class='add'>+    gf_getspec_rsp rsp = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    call_frame_t *frame = NULL;</div><div class='add'>+    glusterfs_ctx_t *ctx = NULL;</div><div class='add'>+    int ret = 0, locked = 0;</div><div class='add'>+    ssize_t size = 0;</div><div class='add'>+    FILE *tmpfp = NULL;</div><div class='add'>+    char *volfile_id = NULL;</div><div class='add'>+    gf_volfile_t *volfile_obj = NULL;</div><div class='add'>+    gf_volfile_t *volfile_tmp = NULL;</div><div class='add'>+    char sha256_hash[SHA256_DIGEST_LENGTH] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    dict_t *dict = NULL;</div><div class='add'>+    char *servers_list = NULL;</div><div class='add'>+    int tmp_fd = -1;</div><div class='add'>+    char template[] = "/tmp/glfs.volfile.XXXXXX";</div><div class='add'>+</div><div class='add'>+    frame = myframe;</div><div class='add'>+    ctx = frame-&gt;this-&gt;ctx;</div><div class='add'>+</div><div class='add'>+    if (-1 == req-&gt;rpc_status) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = xdr_to_generic(*iov, &amp;rsp, (xdrproc_t)xdr_gf_getspec_rsp);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        gf_log(frame-&gt;this-&gt;name, GF_LOG_ERROR, "XDR decoding error");</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (-1 == rsp.op_ret) {</div><div class='add'>+        gf_log(frame-&gt;this-&gt;name, GF_LOG_ERROR,</div><div class='add'>+               "failed to get the 'volume file' from server");</div><div class='add'>+        ret = rsp.op_errno;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (!rsp.xdata.xdata_len) {</div><div class='add'>+        goto volfile;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    dict = dict_new();</div><div class='add'>+    if (!dict) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        errno = ENOMEM;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_unserialize(rsp.xdata.xdata_val, rsp.xdata.xdata_len, &amp;dict);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log(frame-&gt;this-&gt;name, GF_LOG_ERROR,</div><div class='add'>+               "failed to unserialize xdata to dictionary");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    dict-&gt;extra_stdfree = rsp.xdata.xdata_val;</div><div class='add'>+</div><div class='add'>+    ret = dict_get_str(dict, "servers-list", &amp;servers_list);</div><div class='add'>+    if (ret) {</div><div class='add'>+        /* Server list is set by glusterd at the time of getspec */</div><div class='add'>+        ret = dict_get_str(dict, GLUSTERD_BRICK_SERVERS, &amp;servers_list);</div><div class='ctx'>         if (ret)</div><div class='del'>-                goto out;</div><div class='add'>+            goto volfile;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    gf_log(frame-&gt;this-&gt;name, GF_LOG_INFO,</div><div class='add'>+           "Received list of available volfile servers: %s", servers_list);</div><div class='add'>+</div><div class='add'>+    ret = gf_process_getspec_servers_list(&amp;ctx-&gt;cmd_args, servers_list);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log(frame-&gt;this-&gt;name, GF_LOG_ERROR,</div><div class='add'>+               "Failed (%s) to process servers list: %s", strerror(errno),</div><div class='add'>+               servers_list);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+volfile:</div><div class='add'>+    size = rsp.op_ret;</div><div class='add'>+    volfile_id = frame-&gt;local;</div><div class='add'>+    if (mgmt_is_multiplexed_daemon(ctx-&gt;cmd_args.process_name)) {</div><div class='add'>+        ret = mgmt_process_volfile((const char *)rsp.spec, size, volfile_id,</div><div class='add'>+                                   dict);</div><div class='add'>+        goto post_graph_mgmt;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+    glusterfs_compute_sha256((const unsigned char *)rsp.spec, size,</div><div class='add'>+                             sha256_hash);</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;ctx-&gt;volfile_lock);</div><div class='add'>+    {</div><div class='add'>+        locked = 1;</div><div class='add'>+</div><div class='add'>+        list_for_each_entry(volfile_obj, &amp;ctx-&gt;volfile_list, volfile_list)</div><div class='add'>+        {</div><div class='add'>+            if (!strcmp(volfile_id, volfile_obj-&gt;vol_id)) {</div><div class='add'>+                if (!memcmp(sha256_hash, volfile_obj-&gt;volfile_checksum,</div><div class='add'>+                            sizeof(volfile_obj-&gt;volfile_checksum))) {</div><div class='add'>+                    UNLOCK(&amp;ctx-&gt;volfile_lock);</div><div class='add'>+                    gf_log(frame-&gt;this-&gt;name, GF_LOG_INFO,</div><div class='add'>+                           "No change in volfile,"</div><div class='add'>+                           "continuing");</div><div class='add'>+                    goto post_unlock;</div><div class='add'>+                }</div><div class='add'>+                volfile_tmp = volfile_obj;</div><div class='add'>+                break;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-        ret = dict_set_str (options, "remote-host", host);</div><div class='del'>-        if (ret)</div><div class='del'>-                goto out;</div><div class='add'>+        /* coverity[secure_temp] mkstemp uses 0600 as the mode */</div><div class='add'>+        tmp_fd = mkstemp(template);</div><div class='add'>+        if (-1 == tmp_fd) {</div><div class='add'>+            UNLOCK(&amp;ctx-&gt;volfile_lock);</div><div class='add'>+            gf_smsg(frame-&gt;this-&gt;name, GF_LOG_ERROR, 0, glusterfsd_msg_39,</div><div class='add'>+                    "create template=%s", template, NULL);</div><div class='add'>+            ret = -1;</div><div class='add'>+            goto post_unlock;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-        ret = dict_set_str (options, "transport.address-family", "inet");</div><div class='del'>-        if (ret)</div><div class='del'>-                goto out;</div><div class='add'>+        /* Calling unlink so that when the file is closed or program</div><div class='add'>+         * terminates the temporary file is deleted.</div><div class='add'>+         */</div><div class='add'>+        ret = sys_unlink(template);</div><div class='add'>+        if (ret &lt; 0) {</div><div class='add'>+            gf_smsg(frame-&gt;this-&gt;name, GF_LOG_INFO, 0, glusterfsd_msg_39,</div><div class='add'>+                    "delete template=%s", template, NULL);</div><div class='add'>+            ret = 0;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-        ret = dict_set_str (options, "transport-type", "socket");</div><div class='del'>-        if (ret)</div><div class='del'>-                goto out;</div><div class='add'>+        tmpfp = fdopen(tmp_fd, "w+b");</div><div class='add'>+        if (!tmpfp) {</div><div class='add'>+            ret = -1;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        fwrite(rsp.spec, size, 1, tmpfp);</div><div class='add'>+        fflush(tmpfp);</div><div class='add'>+        if (ferror(tmpfp)) {</div><div class='add'>+            ret = -1;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-        rpc = rpc_clnt_init (&amp;rpc_cfg, options, THIS-&gt;ctx, THIS-&gt;name);</div><div class='del'>-        if (!rpc) {</div><div class='add'>+        /*  Check if only options have changed. No need to reload the</div><div class='add'>+         *  volfile if topology hasn't changed.</div><div class='add'>+         *  glusterfs_volfile_reconfigure returns 3 possible return states</div><div class='add'>+         *  return 0          =======&gt; reconfiguration of options has succeeded</div><div class='add'>+         *  return 1          =======&gt; the graph has to be reconstructed and all</div><div class='add'>+         * the xlators should be inited return -1(or -ve) =======&gt; Some Internal</div><div class='add'>+         * Error occurred during the operation</div><div class='add'>+         */</div><div class='add'>+</div><div class='add'>+        ret = glusterfs_volfile_reconfigure(tmpfp, ctx);</div><div class='add'>+        if (ret == 0) {</div><div class='add'>+            gf_log("glusterfsd-mgmt", GF_LOG_DEBUG,</div><div class='add'>+                   "No need to re-load volfile, reconfigure done");</div><div class='add'>+            if (!volfile_tmp) {</div><div class='ctx'>                 ret = -1;</div><div class='del'>-                goto out;</div><div class='add'>+                UNLOCK(&amp;ctx-&gt;volfile_lock);</div><div class='add'>+                gf_log("mgmt", GF_LOG_ERROR,</div><div class='add'>+                       "Graph reconfigure succeeded with out having "</div><div class='add'>+                       "checksum.");</div><div class='add'>+                goto post_unlock;</div><div class='add'>+            }</div><div class='add'>+            memcpy(volfile_tmp-&gt;volfile_checksum, sha256_hash,</div><div class='add'>+                   sizeof(volfile_tmp-&gt;volfile_checksum));</div><div class='add'>+            goto out;</div><div class='ctx'>         }</div><div class='ctx'> </div><div class='del'>-        ctx-&gt;mgmt = rpc;</div><div class='add'>+        if (ret &lt; 0) {</div><div class='add'>+            UNLOCK(&amp;ctx-&gt;volfile_lock);</div><div class='add'>+            gf_log("glusterfsd-mgmt", GF_LOG_DEBUG, "Reconfigure failed !!");</div><div class='add'>+            goto post_unlock;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-        ret = rpc_clnt_register_notify (rpc, mgmt_rpc_notify, THIS);</div><div class='add'>+        ret = glusterfs_process_volfp(ctx, tmpfp);</div><div class='add'>+        /* tmpfp closed */</div><div class='add'>+        tmpfp = NULL;</div><div class='add'>+        tmp_fd = -1;</div><div class='ctx'>         if (ret)</div><div class='del'>-                goto out;</div><div class='add'>+            goto out;</div><div class='ctx'> </div><div class='del'>-        ret = rpcclnt_cbk_program_register (rpc, &amp;mgmt_cbk_prog);</div><div class='del'>-        if (ret)</div><div class='add'>+        if (!volfile_tmp) {</div><div class='add'>+            volfile_tmp = GF_CALLOC(1, sizeof(gf_volfile_t),</div><div class='add'>+                                    gf_common_volfile_t);</div><div class='add'>+            if (!volfile_tmp) {</div><div class='add'>+                ret = -1;</div><div class='ctx'>                 goto out;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            INIT_LIST_HEAD(&amp;volfile_tmp-&gt;volfile_list);</div><div class='add'>+            volfile_tmp-&gt;graph = ctx-&gt;active;</div><div class='add'>+            list_add(&amp;volfile_tmp-&gt;volfile_list, &amp;ctx-&gt;volfile_list);</div><div class='add'>+            snprintf(volfile_tmp-&gt;vol_id, sizeof(volfile_tmp-&gt;vol_id), "%s",</div><div class='add'>+                     volfile_id);</div><div class='add'>+        }</div><div class='add'>+        memcpy(volfile_tmp-&gt;volfile_checksum, sha256_hash,</div><div class='add'>+               sizeof(volfile_tmp-&gt;volfile_checksum));</div><div class='add'>+    }</div><div class='add'>+    UNLOCK(&amp;ctx-&gt;volfile_lock);</div><div class='add'>+</div><div class='add'>+    locked = 0;</div><div class='add'>+</div><div class='add'>+post_graph_mgmt:</div><div class='add'>+    if (!is_mgmt_rpc_reconnect) {</div><div class='add'>+        need_emancipate = 1;</div><div class='add'>+        glusterfs_mgmt_pmap_signin(ctx);</div><div class='add'>+        is_mgmt_rpc_reconnect = _gf_true;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='ctx'> out:</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='ctx'> </div><div class='add'>+    if (locked)</div><div class='add'>+        UNLOCK(&amp;ctx-&gt;volfile_lock);</div><div class='add'>+post_unlock:</div><div class='add'>+    GF_FREE(frame-&gt;local);</div><div class='add'>+    frame-&gt;local = NULL;</div><div class='add'>+    STACK_DESTROY(frame-&gt;root);</div><div class='add'>+    free(rsp.spec);</div><div class='add'>+</div><div class='add'>+    if (dict)</div><div class='add'>+        dict_unref(dict);</div><div class='add'>+</div><div class='add'>+    // Stop if server is running at an unsupported op-version</div><div class='add'>+    if (ENOTSUP == ret) {</div><div class='add'>+        gf_log("mgmt", GF_LOG_ERROR,</div><div class='add'>+               "Server is operating at an "</div><div class='add'>+               "op-version which is not supported");</div><div class='add'>+        cleanup_and_exit(0);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (ret &amp;&amp; ctx &amp;&amp; !ctx-&gt;active) {</div><div class='add'>+        /* Do it only for the first time */</div><div class='add'>+        /* Failed to get the volume file, something wrong,</div><div class='add'>+           restart the process */</div><div class='add'>+        gf_log("mgmt", GF_LOG_ERROR, "failed to fetch volume file (key:%s)",</div><div class='add'>+               ctx-&gt;cmd_args.volfile_id);</div><div class='add'>+        cleanup_and_exit(0);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (tmpfp)</div><div class='add'>+        fclose(tmpfp);</div><div class='add'>+    else if (tmp_fd != -1)</div><div class='add'>+        sys_close(tmp_fd);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> static int</div><div class='del'>-mgmt_pmap_signin_cbk (struct rpc_req *req, struct iovec *iov, int count,</div><div class='del'>-                      void *myframe)</div><div class='add'>+glusterfs_volfile_fetch_one(glusterfs_ctx_t *ctx, char *volfile_id)</div><div class='ctx'> {</div><div class='del'>-        pmap_signin_rsp  rsp   = {0,};</div><div class='del'>-        call_frame_t    *frame = NULL;</div><div class='del'>-        int              ret   = 0;</div><div class='add'>+    cmd_args_t *cmd_args = NULL;</div><div class='add'>+    gf_getspec_req req = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int ret = 0;</div><div class='add'>+    call_frame_t *frame = NULL;</div><div class='add'>+    dict_t *dict = NULL;</div><div class='add'>+</div><div class='add'>+    cmd_args = &amp;ctx-&gt;cmd_args;</div><div class='add'>+    if (!volfile_id) {</div><div class='add'>+        volfile_id = ctx-&gt;cmd_args.volfile_id;</div><div class='add'>+        if (!volfile_id) {</div><div class='add'>+            gf_log(THIS-&gt;name, GF_LOG_ERROR,</div><div class='add'>+                   "No volfile-id provided, erroring out");</div><div class='add'>+            return -1;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    frame = create_frame(THIS, ctx-&gt;pool);</div><div class='add'>+    if (!frame) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    req.key = volfile_id;</div><div class='add'>+    req.flags = 0;</div><div class='add'>+    /*</div><div class='add'>+     * We are only storing one variable in local, hence using the same</div><div class='add'>+     * variable. If multiple local variable is required, create a struct.</div><div class='add'>+     */</div><div class='add'>+    frame-&gt;local = gf_strdup(volfile_id);</div><div class='add'>+    if (!frame-&gt;local) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    dict = dict_new();</div><div class='add'>+    if (!dict) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    // Set the supported min and max op-versions, so glusterd can make a</div><div class='add'>+    // decision</div><div class='add'>+    ret = dict_set_int32(dict, "min-op-version", GD_OP_VERSION_MIN);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log(THIS-&gt;name, GF_LOG_ERROR,</div><div class='add'>+               "Failed to set min-op-version"</div><div class='add'>+               " in request dict");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_set_int32(dict, "max-op-version", GD_OP_VERSION_MAX);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log(THIS-&gt;name, GF_LOG_ERROR,</div><div class='add'>+               "Failed to set max-op-version"</div><div class='add'>+               " in request dict");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Ask for a list of volfile (glusterd2 only) servers */</div><div class='add'>+    if (GF_CLIENT_PROCESS == ctx-&gt;process_mode) {</div><div class='add'>+        req.flags = req.flags | GF_GETSPEC_FLAG_SERVERS_LIST;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (cmd_args-&gt;brick_name) {</div><div class='add'>+        ret = dict_set_dynstr_with_alloc(dict, "brick_name",</div><div class='add'>+                                         cmd_args-&gt;brick_name);</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_log(THIS-&gt;name, GF_LOG_ERROR,</div><div class='add'>+                   "Failed to set brick_name in request dict");</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        frame = myframe;</div><div class='add'>+    ret = dict_allocate_and_serialize(dict, &amp;req.xdata.xdata_val,</div><div class='add'>+                                      &amp;req.xdata.xdata_len);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        gf_log(THIS-&gt;name, GF_LOG_ERROR, "Failed to serialize dictionary");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        if (-1 == req-&gt;rpc_status) {</div><div class='del'>-                rsp.op_ret   = -1;</div><div class='del'>-                rsp.op_errno = EINVAL;</div><div class='del'>-                goto out;</div><div class='add'>+    ret = mgmt_submit_request(&amp;req, frame, ctx, &amp;clnt_handshake_prog,</div><div class='add'>+                              GF_HNDSK_GETSPEC, mgmt_getspec_cbk,</div><div class='add'>+                              (xdrproc_t)xdr_gf_getspec_req);</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    GF_FREE(req.xdata.xdata_val);</div><div class='add'>+    if (dict)</div><div class='add'>+        dict_unref(dict);</div><div class='add'>+    if (ret &amp;&amp; frame) {</div><div class='add'>+        /* Free the frame-&gt;local fast, because we have not used memget</div><div class='add'>+         */</div><div class='add'>+        GF_FREE(frame-&gt;local);</div><div class='add'>+        frame-&gt;local = NULL;</div><div class='add'>+        STACK_DESTROY(frame-&gt;root);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+glusterfs_volfile_fetch(glusterfs_ctx_t *ctx)</div><div class='add'>+{</div><div class='add'>+    xlator_t *server_xl = NULL;</div><div class='add'>+    xlator_list_t *trav;</div><div class='add'>+    gf_volfile_t *volfile_obj = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;ctx-&gt;volfile_lock);</div><div class='add'>+    {</div><div class='add'>+        if (ctx-&gt;active &amp;&amp;</div><div class='add'>+            mgmt_is_multiplexed_daemon(ctx-&gt;cmd_args.process_name)) {</div><div class='add'>+            list_for_each_entry(volfile_obj, &amp;ctx-&gt;volfile_list, volfile_list)</div><div class='add'>+            {</div><div class='add'>+                ret |= glusterfs_volfile_fetch_one(ctx, volfile_obj-&gt;vol_id);</div><div class='add'>+            }</div><div class='add'>+            UNLOCK(&amp;ctx-&gt;volfile_lock);</div><div class='add'>+            return ret;</div><div class='ctx'>         }</div><div class='ctx'> </div><div class='del'>-        ret = xdr_to_pmap_signin_rsp (*iov, &amp;rsp);</div><div class='del'>-        if (ret &lt; 0) {</div><div class='del'>-                gf_log (frame-&gt;this-&gt;name, GF_LOG_ERROR, "error");</div><div class='del'>-                rsp.op_ret   = -1;</div><div class='del'>-                rsp.op_errno = EINVAL;</div><div class='del'>-                goto out;</div><div class='add'>+        if (ctx-&gt;active) {</div><div class='add'>+            server_xl = ctx-&gt;active-&gt;first;</div><div class='add'>+            if (strcmp(server_xl-&gt;type, "protocol/server") != 0) {</div><div class='add'>+                server_xl = NULL;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+        if (!server_xl) {</div><div class='add'>+            /* Startup (ctx-&gt;active not set) or non-server. */</div><div class='add'>+            UNLOCK(&amp;ctx-&gt;volfile_lock);</div><div class='add'>+            return glusterfs_volfile_fetch_one(ctx, ctx-&gt;cmd_args.volfile_id);</div><div class='ctx'>         }</div><div class='ctx'> </div><div class='del'>-        if (-1 == rsp.op_ret) {</div><div class='del'>-                gf_log (frame-&gt;this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-                        "failed to register the port with glusterd");</div><div class='del'>-                goto out;</div><div class='add'>+        ret = 0;</div><div class='add'>+        for (trav = server_xl-&gt;children; trav; trav = trav-&gt;next) {</div><div class='add'>+            ret |= glusterfs_volfile_fetch_one(ctx, trav-&gt;xlator-&gt;volfile_id);</div><div class='ctx'>         }</div><div class='add'>+    }</div><div class='add'>+    UNLOCK(&amp;ctx-&gt;volfile_lock);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+mgmt_event_notify_cbk(struct rpc_req *req, struct iovec *iov, int count,</div><div class='add'>+                      void *myframe)</div><div class='add'>+{</div><div class='add'>+    gf_event_notify_rsp rsp = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    call_frame_t *frame = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    frame = myframe;</div><div class='add'>+</div><div class='add'>+    if (-1 == req-&gt;rpc_status) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = xdr_to_generic(*iov, &amp;rsp, (xdrproc_t)xdr_gf_event_notify_rsp);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        gf_log(frame-&gt;this-&gt;name, GF_LOG_ERROR, "XDR decoding error");</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (-1 == rsp.op_ret) {</div><div class='add'>+        gf_log(frame-&gt;this-&gt;name, GF_LOG_ERROR,</div><div class='add'>+               "failed to get the rsp from server");</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='ctx'> out:</div><div class='add'>+    free(rsp.dict.dict_val);  // malloced by xdr</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        STACK_DESTROY (frame-&gt;root);</div><div class='del'>-        return 0;</div><div class='add'>+int32_t</div><div class='add'>+glusterfs_rebalance_event_notify_cbk(struct rpc_req *req, struct iovec *iov,</div><div class='add'>+                                     int count, void *myframe)</div><div class='add'>+{</div><div class='add'>+    gf_event_notify_rsp rsp = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    call_frame_t *frame = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    frame = myframe;</div><div class='add'>+</div><div class='add'>+    if (-1 == req-&gt;rpc_status) {</div><div class='add'>+        gf_log(frame-&gt;this-&gt;name, GF_LOG_ERROR,</div><div class='add'>+               "failed to get the rsp from server");</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = xdr_to_generic(*iov, &amp;rsp, (xdrproc_t)xdr_gf_event_notify_rsp);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        gf_log(frame-&gt;this-&gt;name, GF_LOG_ERROR, "XDR decoding error");</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (-1 == rsp.op_ret) {</div><div class='add'>+        gf_log(frame-&gt;this-&gt;name, GF_LOG_ERROR,</div><div class='add'>+               "Received error (%s) from server", strerror(rsp.op_errno));</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+out:</div><div class='add'>+    free(rsp.dict.dict_val);  // malloced by xdr</div><div class='add'>+</div><div class='add'>+    if (frame) {</div><div class='add'>+        STACK_DESTROY(frame-&gt;root);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-glusterfs_mgmt_pmap_signin (glusterfs_ctx_t *ctx)</div><div class='add'>+int32_t</div><div class='add'>+glusterfs_rebalance_event_notify(dict_t *dict)</div><div class='ctx'> {</div><div class='del'>-        call_frame_t     *frame = NULL;</div><div class='del'>-        pmap_signin_req   req = {0, };</div><div class='del'>-        int               ret = -1;</div><div class='del'>-        cmd_args_t       *cmd_args = NULL;</div><div class='add'>+    glusterfs_ctx_t *ctx = NULL;</div><div class='add'>+    gf_event_notify_req req = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int32_t ret = -1;</div><div class='add'>+    cmd_args_t *cmd_args = NULL;</div><div class='add'>+    call_frame_t *frame = NULL;</div><div class='ctx'> </div><div class='del'>-        frame = create_frame (THIS, ctx-&gt;pool);</div><div class='del'>-        cmd_args = &amp;ctx-&gt;cmd_args;</div><div class='add'>+    ctx = glusterfsd_ctx;</div><div class='add'>+    cmd_args = &amp;ctx-&gt;cmd_args;</div><div class='ctx'> </div><div class='del'>-        if (!cmd_args-&gt;brick_port || !cmd_args-&gt;brick_name) {</div><div class='del'>-                gf_log ("fsd-mgmt", GF_LOG_DEBUG,</div><div class='del'>-                        "portmapper signin arguments not given");</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='add'>+    frame = create_frame(THIS, ctx-&gt;pool);</div><div class='ctx'> </div><div class='del'>-        req.port  = cmd_args-&gt;brick_port;</div><div class='del'>-        req.brick = cmd_args-&gt;brick_name;</div><div class='add'>+    req.op = GF_EN_DEFRAG_STATUS;</div><div class='ctx'> </div><div class='del'>-        ret = mgmt_submit_request (&amp;req, frame, ctx, &amp;clnt_pmap_prog,</div><div class='del'>-                                   GF_PMAP_SIGNIN, xdr_from_pmap_signin_req,</div><div class='del'>-                                   mgmt_pmap_signin_cbk);</div><div class='add'>+    if (dict) {</div><div class='add'>+        ret = dict_set_str(dict, "volname", cmd_args-&gt;volfile_id);</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_log("", GF_LOG_ERROR, "failed to set volname");</div><div class='add'>+        }</div><div class='add'>+        ret = dict_allocate_and_serialize(dict, &amp;req.dict.dict_val,</div><div class='add'>+                                          &amp;req.dict.dict_len);</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_log("", GF_LOG_ERROR, "failed to serialize dict");</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-out:</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='add'>+    ret = mgmt_submit_request(&amp;req, frame, ctx, &amp;clnt_handshake_prog,</div><div class='add'>+                              GF_HNDSK_EVENT_NOTIFY,</div><div class='add'>+                              glusterfs_rebalance_event_notify_cbk,</div><div class='add'>+                              (xdrproc_t)xdr_gf_event_notify_req);</div><div class='ctx'> </div><div class='add'>+    GF_FREE(req.dict.dict_val);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> static int</div><div class='del'>-mgmt_pmap_signout_cbk (struct rpc_req *req, struct iovec *iov, int count,</div><div class='del'>-                       void *myframe)</div><div class='add'>+mgmt_rpc_notify(struct rpc_clnt *rpc, void *mydata, rpc_clnt_event_t event,</div><div class='add'>+                void *data)</div><div class='ctx'> {</div><div class='del'>-        pmap_signout_rsp  rsp   = {0,};</div><div class='del'>-        call_frame_t    *frame = NULL;</div><div class='del'>-        int              ret   = 0;</div><div class='add'>+    xlator_t *this = NULL;</div><div class='add'>+    glusterfs_ctx_t *ctx = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    server_cmdline_t *server = NULL;</div><div class='add'>+    rpc_transport_t *rpc_trans = NULL;</div><div class='add'>+    int need_term = 0;</div><div class='add'>+    int emval = 0;</div><div class='add'>+    static int log_ctr1;</div><div class='add'>+    static int log_ctr2;</div><div class='add'>+    struct dnscache6 *dnscache = NULL;</div><div class='add'>+</div><div class='add'>+    this = mydata;</div><div class='add'>+    rpc_trans = rpc-&gt;conn.trans;</div><div class='add'>+    ctx = this-&gt;ctx;</div><div class='add'>+</div><div class='add'>+    switch (event) {</div><div class='add'>+        case RPC_CLNT_DISCONNECT:</div><div class='add'>+            if (rpc_trans-&gt;connect_failed) {</div><div class='add'>+                GF_LOG_OCCASIONALLY(log_ctr1, "glusterfsd-mgmt", GF_LOG_ERROR,</div><div class='add'>+                                    "failed to connect to remote-"</div><div class='add'>+                                    "host: %s",</div><div class='add'>+                                    ctx-&gt;cmd_args.volfile_server);</div><div class='add'>+            } else {</div><div class='add'>+                GF_LOG_OCCASIONALLY(log_ctr1, "glusterfsd-mgmt", GF_LOG_INFO,</div><div class='add'>+                                    "disconnected from remote-"</div><div class='add'>+                                    "host: %s",</div><div class='add'>+                                    ctx-&gt;cmd_args.volfile_server);</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            if (!rpc-&gt;disabled) {</div><div class='add'>+                /*</div><div class='add'>+                 * Check if dnscache is exhausted for current server</div><div class='add'>+                 * and continue until cache is exhausted</div><div class='add'>+                 */</div><div class='add'>+                dnscache = rpc_trans-&gt;dnscache;</div><div class='add'>+                if (dnscache &amp;&amp; dnscache-&gt;next) {</div><div class='add'>+                    break;</div><div class='add'>+                }</div><div class='add'>+            }</div><div class='add'>+            server = ctx-&gt;cmd_args.curr_server;</div><div class='add'>+            if (server-&gt;list.next == &amp;ctx-&gt;cmd_args.volfile_servers) {</div><div class='add'>+                if (!ctx-&gt;active) {</div><div class='add'>+                    need_term = 1;</div><div class='add'>+                }</div><div class='add'>+                emval = ENOTCONN;</div><div class='add'>+                GF_LOG_OCCASIONALLY(log_ctr2, "glusterfsd-mgmt", GF_LOG_INFO,</div><div class='add'>+                                    "Exhausted all volfile servers");</div><div class='add'>+                break;</div><div class='add'>+            }</div><div class='add'>+            server = list_entry(server-&gt;list.next, typeof(*server), list);</div><div class='add'>+            ctx-&gt;cmd_args.curr_server = server;</div><div class='add'>+            ctx-&gt;cmd_args.volfile_server = server-&gt;volfile_server;</div><div class='add'>+</div><div class='add'>+            ret = dict_set_str(rpc_trans-&gt;options, "remote-host",</div><div class='add'>+                               server-&gt;volfile_server);</div><div class='add'>+            if (ret != 0) {</div><div class='add'>+                gf_log("glusterfsd-mgmt", GF_LOG_ERROR,</div><div class='add'>+                       "failed to set remote-host: %s", server-&gt;volfile_server);</div><div class='add'>+                if (!ctx-&gt;active) {</div><div class='add'>+                    need_term = 1;</div><div class='add'>+                }</div><div class='add'>+                emval = ENOTCONN;</div><div class='add'>+                break;</div><div class='add'>+            }</div><div class='add'>+            gf_log("glusterfsd-mgmt", GF_LOG_INFO,</div><div class='add'>+                   "connecting to next volfile server %s",</div><div class='add'>+                   server-&gt;volfile_server);</div><div class='add'>+            break;</div><div class='add'>+        case RPC_CLNT_CONNECT:</div><div class='add'>+            ret = glusterfs_volfile_fetch(ctx);</div><div class='add'>+            if (ret) {</div><div class='add'>+                emval = ret;</div><div class='add'>+                if (!ctx-&gt;active) {</div><div class='add'>+                    need_term = 1;</div><div class='add'>+                    gf_log("glusterfsd-mgmt", GF_LOG_ERROR,</div><div class='add'>+                           "failed to fetch volume file (key:%s)",</div><div class='add'>+                           ctx-&gt;cmd_args.volfile_id);</div><div class='add'>+                    break;</div><div class='add'>+                }</div><div class='add'>+            }</div><div class='ctx'> </div><div class='del'>-        frame = myframe;</div><div class='add'>+            if (is_mgmt_rpc_reconnect)</div><div class='add'>+                glusterfs_mgmt_pmap_signin(ctx);</div><div class='ctx'> </div><div class='del'>-        if (-1 == req-&gt;rpc_status) {</div><div class='del'>-                rsp.op_ret   = -1;</div><div class='del'>-                rsp.op_errno = EINVAL;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='add'>+            break;</div><div class='add'>+        default:</div><div class='add'>+            break;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        ret = xdr_to_pmap_signout_rsp (*iov, &amp;rsp);</div><div class='del'>-        if (ret &lt; 0) {</div><div class='del'>-                gf_log (frame-&gt;this-&gt;name, GF_LOG_ERROR, "error");</div><div class='del'>-                rsp.op_ret   = -1;</div><div class='del'>-                rsp.op_errno = EINVAL;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='add'>+    if (need_term) {</div><div class='add'>+        emancipate(ctx, emval);</div><div class='add'>+        cleanup_and_exit(1);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        if (-1 == rsp.op_ret) {</div><div class='del'>-                gf_log (frame-&gt;this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-                        "failed to register the port with glusterd");</div><div class='del'>-                goto out;</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+glusterfs_rpcsvc_notify(rpcsvc_t *rpc, void *xl, rpcsvc_event_t event,</div><div class='add'>+                        void *data)</div><div class='add'>+{</div><div class='add'>+    if (!xl || !data) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    switch (event) {</div><div class='add'>+        case RPCSVC_EVENT_ACCEPT: {</div><div class='add'>+            break;</div><div class='ctx'>         }</div><div class='add'>+        case RPCSVC_EVENT_DISCONNECT: {</div><div class='add'>+            break;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        default:</div><div class='add'>+            break;</div><div class='add'>+    }</div><div class='add'>+</div><div class='ctx'> out:</div><div class='del'>-        if (frame)</div><div class='del'>-                STACK_DESTROY (frame-&gt;root);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+glusterfs_listener_init(glusterfs_ctx_t *ctx)</div><div class='add'>+{</div><div class='add'>+    cmd_args_t *cmd_args = NULL;</div><div class='add'>+    rpcsvc_t *rpc = NULL;</div><div class='add'>+    dict_t *options = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    cmd_args = &amp;ctx-&gt;cmd_args;</div><div class='add'>+</div><div class='add'>+    if (ctx-&gt;listener)</div><div class='ctx'>         return 0;</div><div class='add'>+</div><div class='add'>+    if (!cmd_args-&gt;sock_file)</div><div class='add'>+        return 0;</div><div class='add'>+</div><div class='add'>+    options = dict_new();</div><div class='add'>+    if (!options)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    ret = rpcsvc_transport_unix_options_build(options, cmd_args-&gt;sock_file);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    rpc = rpcsvc_init(THIS, ctx, options, 8);</div><div class='add'>+    if (rpc == NULL) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = rpcsvc_register_notify(rpc, glusterfs_rpcsvc_notify, THIS);</div><div class='add'>+    if (ret) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = rpcsvc_create_listeners(rpc, options, "glusterfsd");</div><div class='add'>+    if (ret &lt; 1) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = rpcsvc_program_register(rpc, &amp;glusterfs_mop_prog, _gf_false);</div><div class='add'>+    if (ret) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ctx-&gt;listener = rpc;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (options)</div><div class='add'>+        dict_unref(options);</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+int</div><div class='add'>+glusterfs_mgmt_notify(int32_t op, void *data, ...)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+    switch (op) {</div><div class='add'>+        case GF_EN_DEFRAG_STATUS:</div><div class='add'>+            ret = glusterfs_rebalance_event_notify((dict_t *)data);</div><div class='add'>+            break;</div><div class='add'>+</div><div class='add'>+        default:</div><div class='add'>+            gf_log("", GF_LOG_ERROR, "Invalid op");</div><div class='add'>+            break;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-glusterfs_mgmt_pmap_signout (glusterfs_ctx_t *ctx)</div><div class='add'>+glusterfs_mgmt_init(glusterfs_ctx_t *ctx)</div><div class='ctx'> {</div><div class='del'>-        int               ret = 0;</div><div class='del'>-        pmap_signout_req  req = {0, };</div><div class='del'>-        call_frame_t     *frame = NULL;</div><div class='del'>-        cmd_args_t       *cmd_args = NULL;</div><div class='add'>+    cmd_args_t *cmd_args = NULL;</div><div class='add'>+    struct rpc_clnt *rpc = NULL;</div><div class='add'>+    dict_t *options = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int port = GF_DEFAULT_BASE_PORT;</div><div class='add'>+    char *host = NULL;</div><div class='add'>+    xlator_cmdline_option_t *opt = NULL;</div><div class='add'>+</div><div class='add'>+    cmd_args = &amp;ctx-&gt;cmd_args;</div><div class='add'>+    GF_VALIDATE_OR_GOTO(THIS-&gt;name, cmd_args-&gt;volfile_server, out);</div><div class='add'>+</div><div class='add'>+    if (ctx-&gt;mgmt)</div><div class='add'>+        return 0;</div><div class='ctx'> </div><div class='del'>-        frame = create_frame (THIS, ctx-&gt;pool);</div><div class='del'>-        cmd_args = &amp;ctx-&gt;cmd_args;</div><div class='add'>+    options = dict_new();</div><div class='add'>+    if (!options)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    LOCK_INIT(&amp;ctx-&gt;volfile_lock);</div><div class='add'>+</div><div class='add'>+    if (cmd_args-&gt;volfile_server_port)</div><div class='add'>+        port = cmd_args-&gt;volfile_server_port;</div><div class='add'>+</div><div class='add'>+    host = cmd_args-&gt;volfile_server;</div><div class='add'>+</div><div class='add'>+    if (cmd_args-&gt;volfile_server_transport &amp;&amp;</div><div class='add'>+        !strcmp(cmd_args-&gt;volfile_server_transport, "unix")) {</div><div class='add'>+        ret = rpc_transport_unix_options_build(options, host, 0);</div><div class='add'>+    } else {</div><div class='add'>+        opt = find_xlator_option_in_cmd_args_t("address-family", cmd_args);</div><div class='add'>+        ret = rpc_transport_inet_options_build(options, host, port,</div><div class='add'>+                                               (opt ? opt-&gt;value : NULL));</div><div class='add'>+    }</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    /* Explicitly turn on encrypted transport. */</div><div class='add'>+    if (ctx-&gt;secure_mgmt) {</div><div class='add'>+        ret = dict_set_dynstr_with_alloc(options,</div><div class='add'>+                                         "transport.socket.ssl-enabled", "yes");</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_log(THIS-&gt;name, GF_LOG_ERROR,</div><div class='add'>+                   "failed to set 'transport.socket.ssl-enabled' "</div><div class='add'>+                   "in options dict");</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-        if (!cmd_args-&gt;brick_port || !cmd_args-&gt;brick_name) {</div><div class='del'>-                gf_log ("fsd-mgmt", GF_LOG_DEBUG,</div><div class='del'>-                        "portmapper signout arguments not given");</div><div class='del'>-                goto out;</div><div class='add'>+        ctx-&gt;ssl_cert_depth = glusterfs_read_secure_access_file();</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    rpc = rpc_clnt_new(options, THIS, THIS-&gt;name, 8);</div><div class='add'>+    if (!rpc) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        gf_log(THIS-&gt;name, GF_LOG_WARNING, "failed to create rpc clnt");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = rpc_clnt_register_notify(rpc, mgmt_rpc_notify, THIS);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log(THIS-&gt;name, GF_LOG_WARNING,</div><div class='add'>+               "failed to register notify function");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = rpcclnt_cbk_program_register(rpc, &amp;mgmt_cbk_prog, THIS);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log(THIS-&gt;name, GF_LOG_WARNING,</div><div class='add'>+               "failed to register callback function");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ctx-&gt;notify = glusterfs_mgmt_notify;</div><div class='add'>+</div><div class='add'>+    /* This value should be set before doing the 'rpc_clnt_start()' as</div><div class='add'>+       the notify function uses this variable */</div><div class='add'>+    ctx-&gt;mgmt = rpc;</div><div class='add'>+</div><div class='add'>+    ret = rpc_clnt_start(rpc);</div><div class='add'>+out:</div><div class='add'>+    if (options)</div><div class='add'>+        dict_unref(options);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+mgmt_pmap_signin2_cbk(struct rpc_req *req, struct iovec *iov, int count,</div><div class='add'>+                      void *myframe)</div><div class='add'>+{</div><div class='add'>+    pmap_signin_rsp rsp = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    glusterfs_ctx_t *ctx = NULL;</div><div class='add'>+    call_frame_t *frame = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    ctx = glusterfsd_ctx;</div><div class='add'>+    frame = myframe;</div><div class='add'>+</div><div class='add'>+    if (-1 == req-&gt;rpc_status) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        rsp.op_ret = -1;</div><div class='add'>+        rsp.op_errno = EINVAL;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = xdr_to_generic(*iov, &amp;rsp, (xdrproc_t)xdr_pmap_signin_rsp);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        gf_log(frame-&gt;this-&gt;name, GF_LOG_ERROR, "XDR decode error");</div><div class='add'>+        rsp.op_ret = -1;</div><div class='add'>+        rsp.op_errno = EINVAL;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (-1 == rsp.op_ret) {</div><div class='add'>+        gf_log(frame-&gt;this-&gt;name, GF_LOG_ERROR,</div><div class='add'>+               "failed to register the port with glusterd");</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+out:</div><div class='add'>+    if (need_emancipate)</div><div class='add'>+        emancipate(ctx, ret);</div><div class='add'>+</div><div class='add'>+    STACK_DESTROY(frame-&gt;root);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+mgmt_pmap_signin_cbk(struct rpc_req *req, struct iovec *iov, int count,</div><div class='add'>+                     void *myframe)</div><div class='add'>+{</div><div class='add'>+    pmap_signin_rsp rsp = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    call_frame_t *frame = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    int emancipate_ret = -1;</div><div class='add'>+    pmap_signin_req pmap_req = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    cmd_args_t *cmd_args = NULL;</div><div class='add'>+    glusterfs_ctx_t *ctx = NULL;</div><div class='add'>+    char brick_name[PATH_MAX] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    frame = myframe;</div><div class='add'>+    ctx = glusterfsd_ctx;</div><div class='add'>+    cmd_args = &amp;ctx-&gt;cmd_args;</div><div class='add'>+</div><div class='add'>+    if (-1 == req-&gt;rpc_status) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        rsp.op_ret = -1;</div><div class='add'>+        rsp.op_errno = EINVAL;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = xdr_to_generic(*iov, &amp;rsp, (xdrproc_t)xdr_pmap_signin_rsp);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        gf_log(frame-&gt;this-&gt;name, GF_LOG_ERROR, "XDR decode error");</div><div class='add'>+        rsp.op_ret = -1;</div><div class='add'>+        rsp.op_errno = EINVAL;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (-1 == rsp.op_ret) {</div><div class='add'>+        gf_log(frame-&gt;this-&gt;name, GF_LOG_ERROR,</div><div class='add'>+               "failed to register the port with glusterd");</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (!cmd_args-&gt;brick_port2) {</div><div class='add'>+        /* We are done with signin process */</div><div class='add'>+        emancipate_ret = 0;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    snprintf(brick_name, PATH_MAX, "%s.rdma", cmd_args-&gt;brick_name);</div><div class='add'>+    pmap_req.port = cmd_args-&gt;brick_port2;</div><div class='add'>+    pmap_req.brick = brick_name;</div><div class='add'>+</div><div class='add'>+    ret = mgmt_submit_request(&amp;pmap_req, frame, ctx, &amp;clnt_pmap_prog,</div><div class='add'>+                              GF_PMAP_SIGNIN, mgmt_pmap_signin2_cbk,</div><div class='add'>+                              (xdrproc_t)xdr_pmap_signin_req);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (need_emancipate &amp;&amp; (ret &lt; 0 || !cmd_args-&gt;brick_port2))</div><div class='add'>+        emancipate(ctx, emancipate_ret);</div><div class='add'>+</div><div class='add'>+    STACK_DESTROY(frame-&gt;root);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+glusterfs_mgmt_pmap_signin(glusterfs_ctx_t *ctx)</div><div class='add'>+{</div><div class='add'>+    call_frame_t *frame = NULL;</div><div class='add'>+    xlator_list_t **trav_p;</div><div class='add'>+    xlator_t *top;</div><div class='add'>+    pmap_signin_req req = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int emancipate_ret = -1;</div><div class='add'>+    cmd_args_t *cmd_args = NULL;</div><div class='add'>+</div><div class='add'>+    cmd_args = &amp;ctx-&gt;cmd_args;</div><div class='add'>+</div><div class='add'>+    if (!cmd_args-&gt;brick_port || !cmd_args-&gt;brick_name) {</div><div class='add'>+        gf_log("fsd-mgmt", GF_LOG_DEBUG,</div><div class='add'>+               "portmapper signin arguments not given");</div><div class='add'>+        emancipate_ret = 0;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    req.port = cmd_args-&gt;brick_port;</div><div class='add'>+    req.pid = (int)getpid(); /* only glusterd2 consumes this */</div><div class='add'>+</div><div class='add'>+    if (ctx-&gt;active) {</div><div class='add'>+        top = ctx-&gt;active-&gt;first;</div><div class='add'>+        for (trav_p = &amp;top-&gt;children; *trav_p; trav_p = &amp;(*trav_p)-&gt;next) {</div><div class='add'>+            frame = create_frame(THIS, ctx-&gt;pool);</div><div class='add'>+            req.brick = (*trav_p)-&gt;xlator-&gt;name;</div><div class='add'>+            ret = mgmt_submit_request(&amp;req, frame, ctx, &amp;clnt_pmap_prog,</div><div class='add'>+                                      GF_PMAP_SIGNIN, mgmt_pmap_signin_cbk,</div><div class='add'>+                                      (xdrproc_t)xdr_pmap_signin_req);</div><div class='add'>+            if (ret &lt; 0) {</div><div class='add'>+                gf_log(THIS-&gt;name, GF_LOG_WARNING,</div><div class='add'>+                       "failed to send sign in request; brick = %s", req.brick);</div><div class='add'>+            }</div><div class='ctx'>         }</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        req.port  = cmd_args-&gt;brick_port;</div><div class='del'>-        req.brick = cmd_args-&gt;brick_name;</div><div class='add'>+    /* unfortunately, the caller doesn't care about the returned value */</div><div class='ctx'> </div><div class='del'>-        ret = mgmt_submit_request (&amp;req, frame, ctx, &amp;clnt_pmap_prog,</div><div class='del'>-                                   GF_PMAP_SIGNOUT, xdr_from_pmap_signout_req,</div><div class='del'>-                                   mgmt_pmap_signout_cbk);</div><div class='ctx'> out:</div><div class='del'>-        return ret;</div><div class='add'>+    if (need_emancipate &amp;&amp; ret &lt; 0)</div><div class='add'>+        emancipate(ctx, emancipate_ret);</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='head'>diff --git a/glusterfsd/src/glusterfsd.c b/glusterfsd/src/glusterfsd.c<br/>index 36fc86af4c1..dae41f33fef 100644<br/>--- a/<a href='/cgit/glusterfs.git/tree/glusterfsd/src/glusterfsd.c?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>glusterfsd/src/glusterfsd.c</a><br/>+++ b/<a href='/cgit/glusterfs.git/tree/glusterfsd/src/glusterfsd.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>glusterfsd/src/glusterfsd.c</a></div><div class='hunk'>@@ -1,22 +1,12 @@</div><div class='ctx'> /*</div><div class='del'>-  Copyright (c) 2006-2010 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='del'>-  This file is part of GlusterFS.</div><div class='del'>-</div><div class='del'>-  GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-  it under the terms of the GNU General Public License as published</div><div class='del'>-  by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-  or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-  GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-  WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-  General Public License for more details.</div><div class='del'>-</div><div class='del'>-  You should have received a copy of the GNU General Public License</div><div class='del'>-  along with this program.  If not, see</div><div class='del'>-  &lt;http://www.gnu.org/licenses/&gt;.</div><div class='del'>-*/</div><div class='add'>+   Copyright (c) 2006-2016 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+   This file is part of GlusterFS.</div><div class='ctx'> </div><div class='add'>+   This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+   General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+   later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+   cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='ctx'> #include &lt;stdio.h&gt;</div><div class='ctx'> #include &lt;string.h&gt;</div><div class='ctx'> #include &lt;stdlib.h&gt;</div><div class='hunk'>@@ -25,9 +15,11 @@</div><div class='ctx'> #include &lt;sys/types.h&gt;</div><div class='ctx'> #include &lt;sys/resource.h&gt;</div><div class='ctx'> #include &lt;sys/file.h&gt;</div><div class='add'>+#include &lt;sys/wait.h&gt;</div><div class='ctx'> #include &lt;netdb.h&gt;</div><div class='ctx'> #include &lt;signal.h&gt;</div><div class='ctx'> #include &lt;libgen.h&gt;</div><div class='add'>+#include &lt;dlfcn.h&gt;</div><div class='ctx'> </div><div class='ctx'> #include &lt;sys/utsname.h&gt;</div><div class='ctx'> </div><div class='hunk'>@@ -38,1367 +30,2709 @@</div><div class='ctx'> #include &lt;time.h&gt;</div><div class='ctx'> #include &lt;semaphore.h&gt;</div><div class='ctx'> #include &lt;errno.h&gt;</div><div class='add'>+#include &lt;pwd.h&gt;</div><div class='ctx'> </div><div class='del'>-#ifndef _CONFIG_H</div><div class='del'>-#define _CONFIG_H</div><div class='del'>-#include "config.h"</div><div class='add'>+#ifdef GF_LINUX_HOST_OS</div><div class='add'>+#ifdef HAVE_LINUX_OOM_H</div><div class='add'>+#include &lt;linux/oom.h&gt;</div><div class='add'>+#else</div><div class='add'>+#define OOM_SCORE_ADJ_MIN (-1000)</div><div class='add'>+#define OOM_SCORE_ADJ_MAX 1000</div><div class='add'>+#define OOM_DISABLE (-17)</div><div class='add'>+#define OOM_ADJUST_MAX 15</div><div class='add'>+#endif</div><div class='ctx'> #endif</div><div class='ctx'> </div><div class='ctx'> #ifdef HAVE_MALLOC_H</div><div class='ctx'> #include &lt;malloc.h&gt;</div><div class='ctx'> #endif</div><div class='ctx'> </div><div class='del'>-#ifdef HAVE_MALLOC_STATS</div><div class='del'>-#ifdef DEBUG</div><div class='del'>-#include &lt;mcheck.h&gt;</div><div class='del'>-#endif</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-#include "xlator.h"</div><div class='del'>-#include "glusterfs.h"</div><div class='del'>-#include "compat.h"</div><div class='del'>-#include "logging.h"</div><div class='del'>-#include "dict.h"</div><div class='del'>-#include "list.h"</div><div class='del'>-#include "timer.h"</div><div class='add'>+#include &lt;glusterfs/xlator.h&gt;</div><div class='add'>+#include &lt;glusterfs/glusterfs.h&gt;</div><div class='add'>+#include &lt;glusterfs/compat.h&gt;</div><div class='add'>+#include &lt;glusterfs/logging.h&gt;</div><div class='add'>+#include "glusterfsd-messages.h"</div><div class='add'>+#include &lt;glusterfs/dict.h&gt;</div><div class='add'>+#include &lt;glusterfs/list.h&gt;</div><div class='add'>+#include &lt;glusterfs/timer.h&gt;</div><div class='ctx'> #include "glusterfsd.h"</div><div class='del'>-#include "stack.h"</div><div class='del'>-#include "revision.h"</div><div class='del'>-#include "common-utils.h"</div><div class='del'>-#include "event.h"</div><div class='del'>-#include "globals.h"</div><div class='del'>-#include "statedump.h"</div><div class='del'>-#include "latency.h"</div><div class='add'>+#include &lt;glusterfs/revision.h&gt;</div><div class='add'>+#include &lt;glusterfs/common-utils.h&gt;</div><div class='add'>+#include &lt;glusterfs/gf-event.h&gt;</div><div class='add'>+#include &lt;glusterfs/statedump.h&gt;</div><div class='add'>+#include &lt;glusterfs/latency.h&gt;</div><div class='ctx'> #include "glusterfsd-mem-types.h"</div><div class='del'>-#include "syscall.h"</div><div class='del'>-#include "call-stub.h"</div><div class='add'>+#include &lt;glusterfs/syscall.h&gt;</div><div class='add'>+#include &lt;glusterfs/call-stub.h&gt;</div><div class='ctx'> #include &lt;fnmatch.h&gt;</div><div class='add'>+#include "rpc-clnt.h"</div><div class='add'>+#include &lt;glusterfs/syncop.h&gt;</div><div class='add'>+#include &lt;glusterfs/client_t.h&gt;</div><div class='add'>+#include "netgroups.h"</div><div class='add'>+#include "exports.h"</div><div class='add'>+#include &lt;glusterfs/monitoring.h&gt;</div><div class='ctx'> </div><div class='del'>-#ifdef GF_DARWIN_HOST_OS</div><div class='del'>-#include "daemon.h"</div><div class='del'>-#else</div><div class='del'>-#define os_daemon(u, v) daemon (u, v)</div><div class='del'>-#endif</div><div class='del'>-</div><div class='add'>+#include &lt;glusterfs/daemon.h&gt;</div><div class='ctx'> </div><div class='ctx'> /* using argp for command line parsing */</div><div class='ctx'> static char gf_doc[] = "";</div><div class='del'>-static char argp_doc[] = "--volfile-server=SERVER [MOUNT-POINT]\n"       \</div><div class='del'>-        "--volfile=VOLFILE [MOUNT-POINT]";</div><div class='del'>-const char *argp_program_version = "" \</div><div class='del'>-        PACKAGE_NAME" "PACKAGE_VERSION" built on "__DATE__" "__TIME__ \</div><div class='del'>-        "\nRepository revision: " GLUSTERFS_REPOSITORY_REVISION "\n"  \</div><div class='del'>-        "Copyright (c) 2006-2009 Gluster Inc. "             \</div><div class='del'>-        "&lt;http://www.gluster.com&gt;\n"                                \</div><div class='del'>-        "GlusterFS comes with ABSOLUTELY NO WARRANTY.\n"              \</div><div class='del'>-        "You may redistribute copies of GlusterFS under the terms of "\</div><div class='del'>-        "the GNU General Public License.";</div><div class='add'>+static char argp_doc[] =</div><div class='add'>+    "--volfile-server=SERVER [MOUNT-POINT]\n"</div><div class='add'>+    "--volfile=VOLFILE [MOUNT-POINT]";</div><div class='add'>+const char *argp_program_version =</div><div class='add'>+    "" PACKAGE_NAME " " PACKAGE_VERSION</div><div class='add'>+    "\nRepository revision: " GLUSTERFS_REPOSITORY_REVISION</div><div class='add'>+    "\n"</div><div class='add'>+    "Copyright (c) 2006-2016 Red Hat, Inc. "</div><div class='add'>+    "&lt;https://www.gluster.org/&gt;\n"</div><div class='add'>+    "GlusterFS comes with ABSOLUTELY NO WARRANTY.\n"</div><div class='add'>+    "It is licensed to you under your choice of the GNU Lesser\n"</div><div class='add'>+    "General Public License, version 3 or any later version (LGPLv3\n"</div><div class='add'>+    "or later), or the GNU General Public License, version 2 (GPLv2),\n"</div><div class='add'>+    "in all cases as published by the Free Software Foundation.";</div><div class='ctx'> const char *argp_program_bug_address = "&lt;" PACKAGE_BUGREPORT "&gt;";</div><div class='ctx'> </div><div class='del'>-static error_t parse_opts (int32_t key, char *arg, struct argp_state *_state);</div><div class='add'>+static error_t</div><div class='add'>+parse_opts(int32_t key, char *arg, struct argp_state *_state);</div><div class='ctx'> </div><div class='ctx'> static struct argp_option gf_options[] = {</div><div class='del'>-        {0, 0, 0, 0, "Basic options:"},</div><div class='del'>-        {"volfile-server", ARGP_VOLFILE_SERVER_KEY, "SERVER", 0,</div><div class='del'>-         "Server to get the volume file from.  This option overrides "</div><div class='del'>-         "--volfile option"},</div><div class='del'>-        {"volfile-max-fetch-attempts", ARGP_VOLFILE_MAX_FETCH_ATTEMPTS,</div><div class='del'>-         "MAX-ATTEMPTS", 0, "Maximum number of connect attempts to server. "</div><div class='del'>-         "This option should be provided with --volfile-server option"</div><div class='del'>-         "[default: 1]"},</div><div class='del'>-        {"volfile", ARGP_VOLUME_FILE_KEY, "VOLFILE", 0,</div><div class='del'>-         "File to use as VOLUME_FILE [default: "DEFAULT_CLIENT_VOLFILE" or "</div><div class='del'>-         DEFAULT_SERVER_VOLFILE"]"},</div><div class='del'>-        {"spec-file", ARGP_VOLUME_FILE_KEY, "VOLFILE", OPTION_HIDDEN,</div><div class='del'>-         "File to use as VOLFILE [default : "DEFAULT_CLIENT_VOLFILE" or "</div><div class='del'>-         DEFAULT_SERVER_VOLFILE"]"},</div><div class='del'>-        {"log-server", ARGP_LOG_SERVER_KEY, "LOGSERVER", 0,</div><div class='del'>-         "Server to use as the central log server"},</div><div class='del'>-</div><div class='del'>-        {"log-level", ARGP_LOG_LEVEL_KEY, "LOGLEVEL", 0,</div><div class='del'>-         "Logging severity.  Valid options are DEBUG, NORMAL, WARNING, ERROR, "</div><div class='del'>-         "CRITICAL and NONE [default: NORMAL]"},</div><div class='del'>-        {"log-file", ARGP_LOG_FILE_KEY, "LOGFILE", 0,</div><div class='del'>-         "File to use for logging [default: "</div><div class='del'>-         DEFAULT_LOG_FILE_DIRECTORY "/" PACKAGE_NAME ".log" "]"},</div><div class='del'>-</div><div class='del'>-        {0, 0, 0, 0, "Advanced Options:"},</div><div class='del'>-        {"volfile-server-port", ARGP_VOLFILE_SERVER_PORT_KEY, "PORT", 0,</div><div class='del'>-         "Listening port number of volfile server"},</div><div class='del'>-        {"volfile-server-transport", ARGP_VOLFILE_SERVER_TRANSPORT_KEY,</div><div class='del'>-         "TRANSPORT", 0,</div><div class='del'>-         "Transport type to get volfile from server [default: socket]"},</div><div class='del'>-        {"volfile-id", ARGP_VOLFILE_ID_KEY, "KEY", 0,</div><div class='del'>-         "'key' of the volfile to be fetched from server"},</div><div class='del'>-        {"log-server-port", ARGP_LOG_SERVER_PORT_KEY, "PORT", 0,</div><div class='del'>-         "Listening port number of log server"},</div><div class='del'>-        {"pid-file", ARGP_PID_FILE_KEY, "PIDFILE", 0,</div><div class='del'>-         "File to use as pid file"},</div><div class='del'>-        {"no-daemon", ARGP_NO_DAEMON_KEY, 0, 0,</div><div class='del'>-         "Run in foreground"},</div><div class='del'>-        {"run-id", ARGP_RUN_ID_KEY, "RUN-ID", OPTION_HIDDEN,</div><div class='del'>-         "Run ID for the process, used by scripts to keep track of process "</div><div class='del'>-         "they started, defaults to none"},</div><div class='del'>-        {"debug", ARGP_DEBUG_KEY, 0, 0,</div><div class='del'>-         "Run in debug mode.  This option sets --no-daemon, --log-level "</div><div class='del'>-         "to DEBUG and --log-file to console"},</div><div class='del'>-        {"volume-name", ARGP_VOLUME_NAME_KEY, "VOLUME-NAME", 0,</div><div class='del'>-         "Volume name to be used for MOUNT-POINT [default: top most volume "</div><div class='del'>-         "in VOLFILE]"},</div><div class='del'>-        {"xlator-option", ARGP_XLATOR_OPTION_KEY,"VOLUME-NAME.OPTION=VALUE", 0,</div><div class='del'>-         "Add/override a translator option for a volume with specified value"},</div><div class='del'>-        {"read-only", ARGP_READ_ONLY_KEY, 0, 0,</div><div class='del'>-         "Mount the filesystem in 'read-only' mode"},</div><div class='del'>-        {"mac-compat", ARGP_MAC_COMPAT_KEY, "BOOL", OPTION_ARG_OPTIONAL,</div><div class='del'>-         "Provide stubs for attributes needed for seamless operation on Macs "</div><div class='add'>+    {0, 0, 0, 0, "Basic options:"},</div><div class='add'>+    {"volfile-server", ARGP_VOLFILE_SERVER_KEY, "SERVER", 0,</div><div class='add'>+     "Server to get the volume file from. Unix domain socket path when "</div><div class='add'>+     "transport type 'unix'. This option overrides --volfile option"},</div><div class='add'>+    {"volfile", ARGP_VOLUME_FILE_KEY, "VOLFILE", 0,</div><div class='add'>+     "File to use as VOLUME_FILE"},</div><div class='add'>+    {"spec-file", ARGP_VOLUME_FILE_KEY, "VOLFILE", OPTION_HIDDEN,</div><div class='add'>+     "File to use as VOLUME FILE"},</div><div class='add'>+</div><div class='add'>+    {"log-level", ARGP_LOG_LEVEL_KEY, "LOGLEVEL", 0,</div><div class='add'>+     "Logging severity.  Valid options are DEBUG, INFO, WARNING, ERROR, "</div><div class='add'>+     "CRITICAL, TRACE and NONE [default: INFO]"},</div><div class='add'>+    {"log-file", ARGP_LOG_FILE_KEY, "LOGFILE", 0,</div><div class='add'>+     "File to use for logging [default: " DEFAULT_LOG_FILE_DIRECTORY</div><div class='add'>+     "/" PACKAGE_NAME ".log"</div><div class='add'>+     "]"},</div><div class='add'>+    {"logger", ARGP_LOGGER, "LOGGER", 0,</div><div class='add'>+     "Set which logging sub-system to "</div><div class='add'>+     "log to, valid options are: gluster-log and syslog, "</div><div class='add'>+     "[default: \"gluster-log\"]"},</div><div class='add'>+    {"log-format", ARGP_LOG_FORMAT, "LOG-FORMAT", 0,</div><div class='add'>+     "Set log format, valid"</div><div class='add'>+     " options are: no-msg-id and with-msg-id, [default: \"with-msg-id\"]"},</div><div class='add'>+    {"log-buf-size", ARGP_LOG_BUF_SIZE, "LOG-BUF-SIZE", 0,</div><div class='add'>+     "Set logging "</div><div class='add'>+     "buffer size, [default: 5]"},</div><div class='add'>+    {"log-flush-timeout", ARGP_LOG_FLUSH_TIMEOUT, "LOG-FLUSH-TIMEOUT", 0,</div><div class='add'>+     "Set log flush timeout, [default: 2 minutes]"},</div><div class='add'>+</div><div class='add'>+    {0, 0, 0, 0, "Advanced Options:"},</div><div class='add'>+    {"volfile-server-port", ARGP_VOLFILE_SERVER_PORT_KEY, "PORT", 0,</div><div class='add'>+     "Listening port number of volfile server"},</div><div class='add'>+    {"volfile-server-transport", ARGP_VOLFILE_SERVER_TRANSPORT_KEY, "TRANSPORT",</div><div class='add'>+     0, "Transport type to get volfile from server [default: socket]"},</div><div class='add'>+    {"volfile-id", ARGP_VOLFILE_ID_KEY, "KEY", 0,</div><div class='add'>+     "'key' of the volfile to be fetched from server"},</div><div class='add'>+    {"pid-file", ARGP_PID_FILE_KEY, "PIDFILE", 0, "File to use as pid file"},</div><div class='add'>+    {"socket-file", ARGP_SOCK_FILE_KEY, "SOCKFILE", 0,</div><div class='add'>+     "File to use as unix-socket"},</div><div class='add'>+    {"no-daemon", ARGP_NO_DAEMON_KEY, 0, 0, "Run in foreground"},</div><div class='add'>+    {"run-id", ARGP_RUN_ID_KEY, "RUN-ID", OPTION_HIDDEN,</div><div class='add'>+     "Run ID for the process, used by scripts to keep track of process "</div><div class='add'>+     "they started, defaults to none"},</div><div class='add'>+    {"debug", ARGP_DEBUG_KEY, 0, 0,</div><div class='add'>+     "Run in debug mode.  This option sets --no-daemon, --log-level "</div><div class='add'>+     "to DEBUG and --log-file to console"},</div><div class='add'>+    {"volume-name", ARGP_VOLUME_NAME_KEY, "XLATOR-NAME", 0,</div><div class='add'>+     "Translator name to be used for MOUNT-POINT [default: top most volume "</div><div class='add'>+     "definition in VOLFILE]"},</div><div class='add'>+    {"xlator-option", ARGP_XLATOR_OPTION_KEY, "XLATOR-NAME.OPTION=VALUE", 0,</div><div class='add'>+     "Add/override an option for a translator in volume file with specified"</div><div class='add'>+     " value"},</div><div class='add'>+    {"read-only", ARGP_READ_ONLY_KEY, 0, 0,</div><div class='add'>+     "Mount the filesystem in 'read-only' mode"},</div><div class='add'>+    {"acl", ARGP_ACL_KEY, 0, 0, "Mount the filesystem with POSIX ACL support"},</div><div class='add'>+    {"selinux", ARGP_SELINUX_KEY, 0, 0,</div><div class='add'>+     "Enable SELinux label (extended attributes) support on inodes"},</div><div class='add'>+    {"capability", ARGP_CAPABILITY_KEY, 0, 0,</div><div class='add'>+     "Enable Capability (extended attributes) support on inodes"},</div><div class='add'>+    {"subdir-mount", ARGP_SUBDIR_MOUNT_KEY, "SUBDIR-PATH", 0,</div><div class='add'>+     "Mount subdirectory given [default: NULL]"},</div><div class='add'>+</div><div class='add'>+    {"print-netgroups", ARGP_PRINT_NETGROUPS, "NETGROUP-FILE", 0,</div><div class='add'>+     "Validate the netgroups file and print it out"},</div><div class='add'>+    {"print-exports", ARGP_PRINT_EXPORTS, "EXPORTS-FILE", 0,</div><div class='add'>+     "Validate the exports file and print it out"},</div><div class='add'>+    {"print-xlatordir", ARGP_PRINT_XLATORDIR_KEY, 0, OPTION_ARG_OPTIONAL,</div><div class='add'>+     "Print xlator directory path"},</div><div class='add'>+    {"print-statedumpdir", ARGP_PRINT_STATEDUMPDIR_KEY, 0, OPTION_ARG_OPTIONAL,</div><div class='add'>+     "Print directory path in which statedumps shall be generated"},</div><div class='add'>+    {"print-logdir", ARGP_PRINT_LOGDIR_KEY, 0, OPTION_ARG_OPTIONAL,</div><div class='add'>+     "Print path of default log directory"},</div><div class='add'>+    {"print-libexecdir", ARGP_PRINT_LIBEXECDIR_KEY, 0, OPTION_ARG_OPTIONAL,</div><div class='add'>+     "Print path of default libexec directory"},</div><div class='add'>+</div><div class='add'>+    {"volfile-max-fetch-attempts", ARGP_VOLFILE_MAX_FETCH_ATTEMPTS, "0",</div><div class='add'>+     OPTION_HIDDEN, "Maximum number of attempts to fetch the volfile"},</div><div class='add'>+    {"aux-gfid-mount", ARGP_AUX_GFID_MOUNT_KEY, 0, 0,</div><div class='add'>+     "Enable access to filesystem through gfid directly"},</div><div class='add'>+    {"enable-ino32", ARGP_INODE32_KEY, "BOOL", OPTION_ARG_OPTIONAL,</div><div class='add'>+     "Use 32-bit inodes when mounting to workaround broken applications"</div><div class='add'>+     "that don't support 64-bit inodes"},</div><div class='add'>+    {"worm", ARGP_WORM_KEY, 0, 0, "Mount the filesystem in 'worm' mode"},</div><div class='add'>+    {"mac-compat", ARGP_MAC_COMPAT_KEY, "BOOL", OPTION_ARG_OPTIONAL,</div><div class='add'>+     "Provide stubs for attributes needed for seamless operation on Macs "</div><div class='ctx'> #ifdef GF_DARWIN_HOST_OS</div><div class='del'>-         "[default: \"on\" on client side, else \"off\"]"</div><div class='add'>+     "[default: \"on\" on client side, else \"off\"]"</div><div class='ctx'> #else</div><div class='del'>-         "[default: \"off\"]"</div><div class='add'>+     "[default: \"off\"]"</div><div class='add'>+#endif</div><div class='add'>+    },</div><div class='add'>+    {"brick-name", ARGP_BRICK_NAME_KEY, "BRICK-NAME", OPTION_HIDDEN,</div><div class='add'>+     "Brick name to be registered with Gluster portmapper"},</div><div class='add'>+    {"brick-port", ARGP_BRICK_PORT_KEY, "BRICK-PORT", OPTION_HIDDEN,</div><div class='add'>+     "Brick Port to be registered with Gluster portmapper"},</div><div class='add'>+    {"fopen-keep-cache", ARGP_FOPEN_KEEP_CACHE_KEY, "BOOL", OPTION_ARG_OPTIONAL,</div><div class='add'>+     "Do not purge the cache on file open [default: false]"},</div><div class='add'>+    {"global-timer-wheel", ARGP_GLOBAL_TIMER_WHEEL, "BOOL", OPTION_ARG_OPTIONAL,</div><div class='add'>+     "Instantiate process global timer-wheel"},</div><div class='add'>+    {"thin-client", ARGP_THIN_CLIENT_KEY, 0, 0,</div><div class='add'>+     "Enables thin mount and connects via gfproxyd daemon"},</div><div class='add'>+    {"global-threading", ARGP_GLOBAL_THREADING_KEY, "BOOL", OPTION_ARG_OPTIONAL,</div><div class='add'>+     "Use the global thread pool instead of io-threads"},</div><div class='add'>+    {0, 0, 0, 0, "Fuse options:"},</div><div class='add'>+    {"direct-io-mode", ARGP_DIRECT_IO_MODE_KEY, "BOOL|auto",</div><div class='add'>+     OPTION_ARG_OPTIONAL, "Specify direct I/O strategy [default: \"auto\"]"},</div><div class='add'>+    {"entry-timeout", ARGP_ENTRY_TIMEOUT_KEY, "SECONDS", 0,</div><div class='add'>+     "Set entry timeout to SECONDS in fuse kernel module [default: 1]"},</div><div class='add'>+    {"negative-timeout", ARGP_NEGATIVE_TIMEOUT_KEY, "SECONDS", 0,</div><div class='add'>+     "Set negative timeout to SECONDS in fuse kernel module [default: 0]"},</div><div class='add'>+    {"attribute-timeout", ARGP_ATTRIBUTE_TIMEOUT_KEY, "SECONDS", 0,</div><div class='add'>+     "Set attribute timeout to SECONDS for inodes in fuse kernel module "</div><div class='add'>+     "[default: 1]"},</div><div class='add'>+    {"gid-timeout", ARGP_GID_TIMEOUT_KEY, "SECONDS", 0,</div><div class='add'>+     "Set auxiliary group list timeout to SECONDS for fuse translator "</div><div class='add'>+     "[default: 300]"},</div><div class='add'>+    {"resolve-gids", ARGP_RESOLVE_GIDS_KEY, 0, 0,</div><div class='add'>+     "Resolve all auxiliary groups in fuse translator (max 32 otherwise)"},</div><div class='add'>+    {"lru-limit", ARGP_FUSE_LRU_LIMIT_KEY, "N", 0,</div><div class='add'>+     "Set fuse module's limit for number of inodes kept in LRU list to N "</div><div class='add'>+     "[default: 65536]"},</div><div class='add'>+    {"invalidate-limit", ARGP_FUSE_INVALIDATE_LIMIT_KEY, "N", 0,</div><div class='add'>+     "Suspend inode invalidations implied by 'lru-limit' if the number of "</div><div class='add'>+     "outstanding invalidations reaches N"},</div><div class='add'>+    {"background-qlen", ARGP_FUSE_BACKGROUND_QLEN_KEY, "N", 0,</div><div class='add'>+     "Set fuse module's background queue length to N "</div><div class='add'>+     "[default: 64]"},</div><div class='add'>+    {"congestion-threshold", ARGP_FUSE_CONGESTION_THRESHOLD_KEY, "N", 0,</div><div class='add'>+     "Set fuse module's congestion threshold to N "</div><div class='add'>+     "[default: 48]"},</div><div class='add'>+#ifdef GF_LINUX_HOST_OS</div><div class='add'>+    {"oom-score-adj", ARGP_OOM_SCORE_ADJ_KEY, "INTEGER", 0,</div><div class='add'>+     "Set oom_score_adj value for process"</div><div class='add'>+     "[default: 0]"},</div><div class='ctx'> #endif</div><div class='del'>-        },</div><div class='del'>-        {"brick-name", ARGP_BRICK_NAME_KEY, "BRICK-NAME", OPTION_HIDDEN,</div><div class='del'>-         "Brick name to be registered with Gluster portmapper" },</div><div class='del'>-        {"brick-port", ARGP_BRICK_PORT_KEY, "BRICK-PORT", OPTION_HIDDEN,</div><div class='del'>-         "Brick Port to be registered with Gluster portmapper" },</div><div class='del'>-</div><div class='del'>-        {0, 0, 0, 0, "Fuse options:"},</div><div class='del'>-        {"direct-io-mode", ARGP_DIRECT_IO_MODE_KEY, "BOOL", OPTION_ARG_OPTIONAL,</div><div class='del'>-         "Use direct I/O mode in fuse kernel module"</div><div class='del'>-         " [default: \"off\" if big writes are supported, else \"on\"]"},</div><div class='del'>-        {"entry-timeout", ARGP_ENTRY_TIMEOUT_KEY, "SECONDS", 0,</div><div class='del'>-         "Set entry timeout to SECONDS in fuse kernel module [default: 1]"},</div><div class='del'>-        {"attribute-timeout", ARGP_ATTRIBUTE_TIMEOUT_KEY, "SECONDS", 0,</div><div class='del'>-         "Set attribute timeout to SECONDS for inodes in fuse kernel module "</div><div class='del'>-         "[default: 1]"},</div><div class='del'>-        {"dump-fuse", ARGP_DUMP_FUSE_KEY, "PATH", 0,</div><div class='del'>-         "Dump fuse traffic to PATH"},</div><div class='del'>-        {"volfile-check", ARGP_VOLFILE_CHECK_KEY, 0, 0,</div><div class='del'>-         "Enable strict volume file checking"},</div><div class='del'>-        {0, 0, 0, 0, "Miscellaneous Options:"},</div><div class='del'>-        {0, }</div><div class='del'>-};</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-static struct argp argp = { gf_options, parse_opts, argp_doc, gf_doc };</div><div class='del'>-</div><div class='del'>-int glusterfs_pidfile_cleanup (glusterfs_ctx_t *ctx);</div><div class='del'>-int glusterfs_volumes_init (glusterfs_ctx_t *ctx);</div><div class='del'>-int glusterfs_mgmt_init (glusterfs_ctx_t *ctx);</div><div class='add'>+    {"client-pid", ARGP_CLIENT_PID_KEY, "PID", OPTION_HIDDEN,</div><div class='add'>+     "client will authenticate itself with process id PID to server"},</div><div class='add'>+    {"no-root-squash", ARGP_FUSE_NO_ROOT_SQUASH_KEY, "BOOL",</div><div class='add'>+     OPTION_ARG_OPTIONAL,</div><div class='add'>+     "disable/enable root squashing for the trusted "</div><div class='add'>+     "client"},</div><div class='add'>+    {"user-map-root", ARGP_USER_MAP_ROOT_KEY, "USER", OPTION_HIDDEN,</div><div class='add'>+     "replace USER with root in messages"},</div><div class='add'>+    {"dump-fuse", ARGP_DUMP_FUSE_KEY, "PATH", 0, "Dump fuse traffic to PATH"},</div><div class='add'>+    {"volfile-check", ARGP_VOLFILE_CHECK_KEY, 0, 0,</div><div class='add'>+     "Enable strict volume file checking"},</div><div class='add'>+    {"no-mem-accounting", ARGP_MEM_ACCOUNTING_KEY, 0, OPTION_HIDDEN,</div><div class='add'>+     "disable internal memory accounting"},</div><div class='add'>+    {"fuse-mountopts", ARGP_FUSE_MOUNTOPTS_KEY, "OPTIONS", OPTION_HIDDEN,</div><div class='add'>+     "Extra mount options to pass to FUSE"},</div><div class='add'>+    {"use-readdirp", ARGP_FUSE_USE_READDIRP_KEY, "BOOL", OPTION_ARG_OPTIONAL,</div><div class='add'>+     "Use readdirp mode in fuse kernel module"</div><div class='add'>+     " [default: \"yes\"]"},</div><div class='add'>+    {"secure-mgmt", ARGP_SECURE_MGMT_KEY, "BOOL", OPTION_ARG_OPTIONAL,</div><div class='add'>+     "Override default for secure (SSL) management connections"},</div><div class='add'>+    {"localtime-logging", ARGP_LOCALTIME_LOGGING_KEY, 0, 0,</div><div class='add'>+     "Enable localtime logging"},</div><div class='add'>+    {"process-name", ARGP_PROCESS_NAME_KEY, "PROCESS-NAME", OPTION_HIDDEN,</div><div class='add'>+     "option to specify the process type"},</div><div class='add'>+    {"event-history", ARGP_FUSE_EVENT_HISTORY_KEY, "BOOL", OPTION_ARG_OPTIONAL,</div><div class='add'>+     "disable/enable fuse event-history"},</div><div class='add'>+    {"reader-thread-count", ARGP_READER_THREAD_COUNT_KEY, "INTEGER",</div><div class='add'>+     OPTION_ARG_OPTIONAL, "set fuse reader thread count"},</div><div class='add'>+    {"kernel-writeback-cache", ARGP_KERNEL_WRITEBACK_CACHE_KEY, "BOOL",</div><div class='add'>+     OPTION_ARG_OPTIONAL, "enable fuse in-kernel writeback cache"},</div><div class='add'>+    {"attr-times-granularity", ARGP_ATTR_TIMES_GRANULARITY_KEY, "NS",</div><div class='add'>+     OPTION_ARG_OPTIONAL,</div><div class='add'>+     "declare supported granularity of file attribute"</div><div class='add'>+     " times in nanoseconds"},</div><div class='add'>+    {"fuse-flush-handle-interrupt", ARGP_FUSE_FLUSH_HANDLE_INTERRUPT_KEY,</div><div class='add'>+     "BOOL", OPTION_ARG_OPTIONAL | OPTION_HIDDEN,</div><div class='add'>+     "handle interrupt in fuse FLUSH handler"},</div><div class='add'>+    {"auto-invalidation", ARGP_FUSE_AUTO_INVAL_KEY, "BOOL", OPTION_ARG_OPTIONAL,</div><div class='add'>+     "controls whether fuse-kernel can auto-invalidate "</div><div class='add'>+     "attribute, dentry and page-cache. "</div><div class='add'>+     "Disable this only if same files/directories are not accessed across "</div><div class='add'>+     "two different mounts concurrently [default: \"on\"]"},</div><div class='add'>+    {"fuse-dev-eperm-ratelimit-ns", ARGP_FUSE_DEV_EPERM_RATELIMIT_NS_KEY,</div><div class='add'>+     "OPTIONS", OPTION_HIDDEN,</div><div class='add'>+     "rate limit reading from fuse device upon EPERM failure"},</div><div class='add'>+    {"brick-mux", ARGP_BRICK_MUX_KEY, 0, 0, "Enable brick mux. "},</div><div class='add'>+    {0, 0, 0, 0, "Miscellaneous Options:"},</div><div class='add'>+    {</div><div class='add'>+        0,</div><div class='add'>+    }};</div><div class='add'>+</div><div class='add'>+static struct argp argp = {gf_options, parse_opts, argp_doc, gf_doc};</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-create_fuse_mount (glusterfs_ctx_t *ctx)</div><div class='del'>-{</div><div class='del'>-        int              ret = 0;</div><div class='del'>-        cmd_args_t      *cmd_args = NULL;</div><div class='del'>-        xlator_t        *master = NULL;</div><div class='del'>-</div><div class='del'>-        cmd_args = &amp;ctx-&gt;cmd_args;</div><div class='del'>-</div><div class='del'>-        if (!cmd_args-&gt;mount_point)</div><div class='del'>-                return 0;</div><div class='del'>-</div><div class='del'>-        master = GF_CALLOC (1, sizeof (*master),</div><div class='del'>-                            gfd_mt_xlator_t);</div><div class='del'>-        if (!master)</div><div class='del'>-                goto err;</div><div class='del'>-</div><div class='del'>-        master-&gt;name = gf_strdup ("fuse");</div><div class='del'>-        if (!master-&gt;name)</div><div class='del'>-                goto err;</div><div class='del'>-</div><div class='del'>-        if (xlator_set_type (master, "mount/fuse") == -1) {</div><div class='del'>-                gf_log ("glusterfsd", GF_LOG_ERROR,</div><div class='del'>-                        "MOUNT-POINT %s initialization failed",</div><div class='del'>-                        cmd_args-&gt;mount_point);</div><div class='del'>-                goto err;</div><div class='del'>-        }</div><div class='add'>+glusterfs_pidfile_cleanup(glusterfs_ctx_t *ctx);</div><div class='add'>+int</div><div class='add'>+glusterfs_volumes_init(glusterfs_ctx_t *ctx);</div><div class='add'>+int</div><div class='add'>+glusterfs_mgmt_init(glusterfs_ctx_t *ctx);</div><div class='add'>+int</div><div class='add'>+glusterfs_listener_init(glusterfs_ctx_t *ctx);</div><div class='ctx'> </div><div class='del'>-        master-&gt;ctx      = ctx;</div><div class='del'>-        master-&gt;options  = get_new_dict ();</div><div class='add'>+#define DICT_SET_VAL(method, dict, key, val, msgid)                            \</div><div class='add'>+    if (method(dict, key, val)) {                                              \</div><div class='add'>+        gf_smsg("glusterfsd", GF_LOG_ERROR, 0, msgid, "key=%s", key);          \</div><div class='add'>+        goto err;                                                              \</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        ret = dict_set_static_ptr (master-&gt;options, ZR_MOUNTPOINT_OPT,</div><div class='del'>-                                   cmd_args-&gt;mount_point);</div><div class='del'>-        if (ret &lt; 0) {</div><div class='del'>-                gf_log ("glusterfsd", GF_LOG_ERROR,</div><div class='del'>-                        "failed to set mount-point to options dictionary");</div><div class='add'>+static int</div><div class='add'>+set_fuse_mount_options(glusterfs_ctx_t *ctx, dict_t *options)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+    cmd_args_t *cmd_args = NULL;</div><div class='add'>+    char *mount_point = NULL;</div><div class='add'>+    char cwd[PATH_MAX] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    cmd_args = &amp;ctx-&gt;cmd_args;</div><div class='add'>+</div><div class='add'>+    /* Check if mount-point is absolute path,</div><div class='add'>+     * if not convert to absolute path by concatenating with CWD</div><div class='add'>+     */</div><div class='add'>+    if (cmd_args-&gt;mount_point[0] != '/') {</div><div class='add'>+        if (getcwd(cwd, PATH_MAX) != NULL) {</div><div class='add'>+            ret = gf_asprintf(&amp;mount_point, "%s/%s", cwd,</div><div class='add'>+                              cmd_args-&gt;mount_point);</div><div class='add'>+            if (ret == -1) {</div><div class='add'>+                gf_smsg("glusterfsd", GF_LOG_ERROR, errno, glusterfsd_msg_1,</div><div class='add'>+                        "gf_asprintf failed", NULL);</div><div class='ctx'>                 goto err;</div><div class='add'>+            }</div><div class='add'>+        } else {</div><div class='add'>+            gf_smsg("glusterfsd", GF_LOG_ERROR, errno, glusterfsd_msg_2,</div><div class='add'>+                    "getcwd failed", NULL);</div><div class='add'>+            goto err;</div><div class='ctx'>         }</div><div class='ctx'> </div><div class='del'>-        if (cmd_args-&gt;fuse_attribute_timeout &gt;= 0) {</div><div class='del'>-                ret = dict_set_double (master-&gt;options, ZR_ATTR_TIMEOUT_OPT,</div><div class='del'>-                                       cmd_args-&gt;fuse_attribute_timeout);</div><div class='del'>-</div><div class='del'>-                if (ret &lt; 0) {</div><div class='del'>-                        gf_log ("glusterfsd", GF_LOG_ERROR,</div><div class='del'>-                                "failed to set dict value.");</div><div class='del'>-                        goto err;</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (cmd_args-&gt;fuse_entry_timeout &gt;= 0) {</div><div class='del'>-                ret = dict_set_double (master-&gt;options, ZR_ENTRY_TIMEOUT_OPT,</div><div class='del'>-                                       cmd_args-&gt;fuse_entry_timeout);</div><div class='del'>-                if (ret &lt; 0) {</div><div class='del'>-                        gf_log ("glusterfsd", GF_LOG_ERROR,</div><div class='del'>-                                "failed to set dict value.");</div><div class='del'>-                        goto err;</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (cmd_args-&gt;volfile_check) {</div><div class='del'>-                ret = dict_set_int32 (master-&gt;options, ZR_STRICT_VOLFILE_CHECK,</div><div class='del'>-                                      cmd_args-&gt;volfile_check);</div><div class='del'>-                if (ret &lt; 0) {</div><div class='del'>-                        gf_log ("glusterfsd", GF_LOG_ERROR,</div><div class='del'>-                                "failed to set dict value.");</div><div class='del'>-                        goto err;</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (cmd_args-&gt;dump_fuse) {</div><div class='del'>-                ret = dict_set_static_ptr (master-&gt;options, ZR_DUMP_FUSE,</div><div class='del'>-                                           cmd_args-&gt;dump_fuse);</div><div class='del'>-                if (ret &lt; 0) {</div><div class='del'>-                        gf_log ("glusterfsd", GF_LOG_ERROR,</div><div class='del'>-                                "failed to set dict value.");</div><div class='del'>-                        goto err;</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        switch (cmd_args-&gt;fuse_direct_io_mode) {</div><div class='add'>+    } else {</div><div class='add'>+        mount_point = gf_strdup(cmd_args-&gt;mount_point);</div><div class='add'>+    }</div><div class='add'>+    DICT_SET_VAL(dict_set_dynstr_sizen, options, ZR_MOUNTPOINT_OPT, mount_point,</div><div class='add'>+                 glusterfsd_msg_3);</div><div class='add'>+</div><div class='add'>+    if (cmd_args-&gt;fuse_attribute_timeout &gt;= 0) {</div><div class='add'>+        DICT_SET_VAL(dict_set_double, options, ZR_ATTR_TIMEOUT_OPT,</div><div class='add'>+                     cmd_args-&gt;fuse_attribute_timeout, glusterfsd_msg_3);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (cmd_args-&gt;fuse_entry_timeout &gt;= 0) {</div><div class='add'>+        DICT_SET_VAL(dict_set_double, options, ZR_ENTRY_TIMEOUT_OPT,</div><div class='add'>+                     cmd_args-&gt;fuse_entry_timeout, glusterfsd_msg_3);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (cmd_args-&gt;fuse_negative_timeout &gt;= 0) {</div><div class='add'>+        DICT_SET_VAL(dict_set_double, options, ZR_NEGATIVE_TIMEOUT_OPT,</div><div class='add'>+                     cmd_args-&gt;fuse_negative_timeout, glusterfsd_msg_3);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (cmd_args-&gt;client_pid_set) {</div><div class='add'>+        DICT_SET_VAL(dict_set_int32_sizen, options, "client-pid",</div><div class='add'>+                     cmd_args-&gt;client_pid, glusterfsd_msg_3);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (cmd_args-&gt;uid_map_root) {</div><div class='add'>+        DICT_SET_VAL(dict_set_int32_sizen, options, "uid-map-root",</div><div class='add'>+                     cmd_args-&gt;uid_map_root, glusterfsd_msg_3);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (cmd_args-&gt;volfile_check) {</div><div class='add'>+        DICT_SET_VAL(dict_set_int32_sizen, options, ZR_STRICT_VOLFILE_CHECK,</div><div class='add'>+                     cmd_args-&gt;volfile_check, glusterfsd_msg_3);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (cmd_args-&gt;dump_fuse) {</div><div class='add'>+        DICT_SET_VAL(dict_set_static_ptr, options, ZR_DUMP_FUSE,</div><div class='add'>+                     cmd_args-&gt;dump_fuse, glusterfsd_msg_3);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (cmd_args-&gt;acl) {</div><div class='add'>+        DICT_SET_VAL(dict_set_static_ptr, options, "acl", "on",</div><div class='add'>+                     glusterfsd_msg_3);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (cmd_args-&gt;selinux) {</div><div class='add'>+        DICT_SET_VAL(dict_set_static_ptr, options, "selinux", "on",</div><div class='add'>+                     glusterfsd_msg_3);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (cmd_args-&gt;capability) {</div><div class='add'>+        DICT_SET_VAL(dict_set_static_ptr, options, "capability", "on",</div><div class='add'>+                     glusterfsd_msg_3);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (cmd_args-&gt;aux_gfid_mount) {</div><div class='add'>+        DICT_SET_VAL(dict_set_static_ptr, options, "virtual-gfid-access", "on",</div><div class='add'>+                     glusterfsd_msg_3);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (cmd_args-&gt;enable_ino32) {</div><div class='add'>+        DICT_SET_VAL(dict_set_static_ptr, options, "enable-ino32", "on",</div><div class='add'>+                     glusterfsd_msg_3);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (cmd_args-&gt;read_only) {</div><div class='add'>+        DICT_SET_VAL(dict_set_static_ptr, options, "read-only", "on",</div><div class='add'>+                     glusterfsd_msg_3);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    switch (cmd_args-&gt;fopen_keep_cache) {</div><div class='add'>+        case GF_OPTION_ENABLE:</div><div class='add'>+</div><div class='add'>+            DICT_SET_VAL(dict_set_static_ptr, options, "fopen-keep-cache", "on",</div><div class='add'>+                         glusterfsd_msg_3);</div><div class='add'>+            break;</div><div class='add'>+        case GF_OPTION_DISABLE:</div><div class='add'>+            DICT_SET_VAL(dict_set_static_ptr, options, "fopen-keep-cache",</div><div class='add'>+                         "off", glusterfsd_msg_3);</div><div class='add'>+            break;</div><div class='add'>+        default:</div><div class='add'>+            gf_msg_debug("glusterfsd", 0, "fopen-keep-cache mode %d",</div><div class='add'>+                         cmd_args-&gt;fopen_keep_cache);</div><div class='add'>+            break;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (cmd_args-&gt;gid_timeout_set) {</div><div class='add'>+        DICT_SET_VAL(dict_set_int32_sizen, options, "gid-timeout",</div><div class='add'>+                     cmd_args-&gt;gid_timeout, glusterfsd_msg_3);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (cmd_args-&gt;resolve_gids) {</div><div class='add'>+        DICT_SET_VAL(dict_set_static_ptr, options, "resolve-gids", "on",</div><div class='add'>+                     glusterfsd_msg_3);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (cmd_args-&gt;lru_limit &gt;= 0) {</div><div class='add'>+        DICT_SET_VAL(dict_set_int32_sizen, options, "lru-limit",</div><div class='add'>+                     cmd_args-&gt;lru_limit, glusterfsd_msg_3);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (cmd_args-&gt;invalidate_limit &gt;= 0) {</div><div class='add'>+        DICT_SET_VAL(dict_set_int32_sizen, options, "invalidate-limit",</div><div class='add'>+                     cmd_args-&gt;invalidate_limit, glusterfsd_msg_3);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (cmd_args-&gt;background_qlen) {</div><div class='add'>+        DICT_SET_VAL(dict_set_int32_sizen, options, "background-qlen",</div><div class='add'>+                     cmd_args-&gt;background_qlen, glusterfsd_msg_3);</div><div class='add'>+    }</div><div class='add'>+    if (cmd_args-&gt;congestion_threshold) {</div><div class='add'>+        DICT_SET_VAL(dict_set_int32_sizen, options, "congestion-threshold",</div><div class='add'>+                     cmd_args-&gt;congestion_threshold, glusterfsd_msg_3);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    switch (cmd_args-&gt;fuse_direct_io_mode) {</div><div class='ctx'>         case GF_OPTION_DISABLE: /* disable */</div><div class='del'>-                ret = dict_set_static_ptr (master-&gt;options, ZR_DIRECT_IO_OPT,</div><div class='del'>-                                           "disable");</div><div class='del'>-                if (ret &lt; 0) {</div><div class='del'>-                        gf_log ("glusterfsd", GF_LOG_ERROR,</div><div class='del'>-                                "failed to set dict value.");</div><div class='del'>-                        goto err;</div><div class='del'>-                }</div><div class='del'>-                break;</div><div class='add'>+            DICT_SET_VAL(dict_set_static_ptr, options, ZR_DIRECT_IO_OPT,</div><div class='add'>+                         "disable", glusterfsd_msg_3);</div><div class='add'>+            break;</div><div class='ctx'>         case GF_OPTION_ENABLE: /* enable */</div><div class='del'>-                ret = dict_set_static_ptr (master-&gt;options, ZR_DIRECT_IO_OPT,</div><div class='del'>-                                           "enable");</div><div class='del'>-                if (ret &lt; 0) {</div><div class='del'>-                        gf_log ("glusterfsd", GF_LOG_ERROR,</div><div class='del'>-                                "failed to set dict value.");</div><div class='del'>-                        goto err;</div><div class='del'>-                }</div><div class='del'>-                break;</div><div class='del'>-        case GF_OPTION_DEFERRED: /* default */</div><div class='add'>+            DICT_SET_VAL(dict_set_static_ptr, options, ZR_DIRECT_IO_OPT,</div><div class='add'>+                         "enable", glusterfsd_msg_3);</div><div class='add'>+            break;</div><div class='ctx'>         default:</div><div class='del'>-                break;</div><div class='add'>+            gf_msg_debug("glusterfsd", 0, "fuse direct io type %d",</div><div class='add'>+                         cmd_args-&gt;fuse_direct_io_mode);</div><div class='add'>+            break;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    switch (cmd_args-&gt;no_root_squash) {</div><div class='add'>+        case GF_OPTION_ENABLE: /* enable */</div><div class='add'>+            DICT_SET_VAL(dict_set_static_ptr, options, "no-root-squash",</div><div class='add'>+                         "enable", glusterfsd_msg_3);</div><div class='add'>+            break;</div><div class='add'>+        default:</div><div class='add'>+            DICT_SET_VAL(dict_set_static_ptr, options, "no-root-squash",</div><div class='add'>+                         "disable", glusterfsd_msg_3);</div><div class='add'>+            gf_msg_debug("glusterfsd", 0, "fuse no-root-squash mode %d",</div><div class='add'>+                         cmd_args-&gt;no_root_squash);</div><div class='add'>+            break;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (!cmd_args-&gt;no_daemon_mode) {</div><div class='add'>+        DICT_SET_VAL(dict_set_static_ptr, options, "sync-to-mount", "enable",</div><div class='add'>+                     glusterfsd_msg_3);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (cmd_args-&gt;use_readdirp) {</div><div class='add'>+        DICT_SET_VAL(dict_set_static_ptr, options, "use-readdirp",</div><div class='add'>+                     cmd_args-&gt;use_readdirp, glusterfsd_msg_3);</div><div class='add'>+    }</div><div class='add'>+    if (cmd_args-&gt;event_history) {</div><div class='add'>+        ret = dict_set_str(options, "event-history", cmd_args-&gt;event_history);</div><div class='add'>+        DICT_SET_VAL(dict_set_static_ptr, options, "event-history",</div><div class='add'>+                     cmd_args-&gt;event_history, glusterfsd_msg_3);</div><div class='add'>+    }</div><div class='add'>+    if (cmd_args-&gt;thin_client) {</div><div class='add'>+        DICT_SET_VAL(dict_set_static_ptr, options, "thin-client", "on",</div><div class='add'>+                     glusterfsd_msg_3);</div><div class='add'>+    }</div><div class='add'>+    if (cmd_args-&gt;reader_thread_count) {</div><div class='add'>+        DICT_SET_VAL(dict_set_uint32, options, "reader-thread-count",</div><div class='add'>+                     cmd_args-&gt;reader_thread_count, glusterfsd_msg_3);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    DICT_SET_VAL(dict_set_uint32, options, "auto-invalidation",</div><div class='add'>+                 cmd_args-&gt;fuse_auto_inval, glusterfsd_msg_3);</div><div class='add'>+</div><div class='add'>+    switch (cmd_args-&gt;kernel_writeback_cache) {</div><div class='add'>+        case GF_OPTION_ENABLE:</div><div class='add'>+            DICT_SET_VAL(dict_set_static_ptr, options, "kernel-writeback-cache",</div><div class='add'>+                         "on", glusterfsd_msg_3);</div><div class='add'>+            break;</div><div class='add'>+        case GF_OPTION_DISABLE:</div><div class='add'>+            DICT_SET_VAL(dict_set_static_ptr, options, "kernel-writeback-cache",</div><div class='add'>+                         "off", glusterfsd_msg_3);</div><div class='add'>+            break;</div><div class='add'>+        default:</div><div class='add'>+            gf_msg_debug("glusterfsd", 0, "kernel-writeback-cache mode %d",</div><div class='add'>+                         cmd_args-&gt;kernel_writeback_cache);</div><div class='add'>+            break;</div><div class='add'>+    }</div><div class='add'>+    if (cmd_args-&gt;attr_times_granularity) {</div><div class='add'>+        DICT_SET_VAL(dict_set_uint32, options, "attr-times-granularity",</div><div class='add'>+                     cmd_args-&gt;attr_times_granularity, glusterfsd_msg_3);</div><div class='add'>+    }</div><div class='add'>+    switch (cmd_args-&gt;fuse_flush_handle_interrupt) {</div><div class='add'>+        case GF_OPTION_ENABLE:</div><div class='add'>+            DICT_SET_VAL(dict_set_static_ptr, options, "flush-handle-interrupt",</div><div class='add'>+                         "on", glusterfsd_msg_3);</div><div class='add'>+            break;</div><div class='add'>+        case GF_OPTION_DISABLE:</div><div class='add'>+            DICT_SET_VAL(dict_set_static_ptr, options, "flush-handle-interrupt",</div><div class='add'>+                         "off", glusterfsd_msg_3);</div><div class='add'>+            break;</div><div class='add'>+        default:</div><div class='add'>+            gf_msg_debug("glusterfsd", 0, "fuse-flush-handle-interrupt mode %d",</div><div class='add'>+                         cmd_args-&gt;fuse_flush_handle_interrupt);</div><div class='add'>+            break;</div><div class='add'>+    }</div><div class='add'>+    if (cmd_args-&gt;global_threading) {</div><div class='add'>+        DICT_SET_VAL(dict_set_static_ptr, options, "global-threading", "on",</div><div class='add'>+                     glusterfsd_msg_3);</div><div class='add'>+    }</div><div class='add'>+    if (cmd_args-&gt;fuse_dev_eperm_ratelimit_ns) {</div><div class='add'>+        DICT_SET_VAL(dict_set_uint32, options, "fuse-dev-eperm-ratelimit-ns",</div><div class='add'>+                     cmd_args-&gt;fuse_dev_eperm_ratelimit_ns, glusterfsd_msg_3);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+err:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+create_fuse_mount(glusterfs_ctx_t *ctx)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+    cmd_args_t *cmd_args = NULL;</div><div class='add'>+    xlator_t *master = NULL;</div><div class='add'>+</div><div class='add'>+    cmd_args = &amp;ctx-&gt;cmd_args;</div><div class='add'>+    if (!cmd_args-&gt;mount_point) {</div><div class='add'>+        gf_msg_trace("glusterfsd", 0,</div><div class='add'>+                     "mount point not found, not a client process");</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (ctx-&gt;process_mode != GF_CLIENT_PROCESS) {</div><div class='add'>+        gf_smsg("glusterfsd", GF_LOG_ERROR, 0, glusterfsd_msg_7, NULL);</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    master = GF_CALLOC(1, sizeof(*master), gfd_mt_xlator_t);</div><div class='add'>+    if (!master)</div><div class='add'>+        goto err;</div><div class='add'>+</div><div class='add'>+    master-&gt;name = gf_strdup("fuse");</div><div class='add'>+    if (!master-&gt;name)</div><div class='add'>+        goto err;</div><div class='add'>+</div><div class='add'>+    if (xlator_set_type(master, "mount/fuse") == -1) {</div><div class='add'>+        gf_smsg("glusterfsd", GF_LOG_ERROR, errno, glusterfsd_msg_8,</div><div class='add'>+                "MOUNT-POINT=%s", cmd_args-&gt;mount_point, NULL);</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    master-&gt;ctx = ctx;</div><div class='add'>+    master-&gt;options = dict_new();</div><div class='add'>+    if (!master-&gt;options)</div><div class='add'>+        goto err;</div><div class='add'>+</div><div class='add'>+    ret = set_fuse_mount_options(ctx, master-&gt;options);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto err;</div><div class='add'>+</div><div class='add'>+    if (cmd_args-&gt;fuse_mountopts) {</div><div class='add'>+        ret = dict_set_static_ptr(master-&gt;options, ZR_FUSE_MOUNTOPTS,</div><div class='add'>+                                  cmd_args-&gt;fuse_mountopts);</div><div class='add'>+        if (ret &lt; 0) {</div><div class='add'>+            gf_smsg("glusterfsd", GF_LOG_ERROR, 0, glusterfsd_msg_3,</div><div class='add'>+                    ZR_FUSE_MOUNTOPTS, NULL);</div><div class='add'>+            goto err;</div><div class='ctx'>         }</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        ret = xlator_init (master);</div><div class='del'>-        if (ret)</div><div class='del'>-                goto err;</div><div class='add'>+    ret = xlator_init(master);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_msg_debug("glusterfsd", 0, "failed to initialize fuse translator");</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        ctx-&gt;master = master;</div><div class='add'>+    ctx-&gt;master = master;</div><div class='ctx'> </div><div class='del'>-        return 0;</div><div class='add'>+    return 0;</div><div class='ctx'> </div><div class='ctx'> err:</div><div class='del'>-        if (master) {</div><div class='del'>-                xlator_destroy (master);</div><div class='del'>-        }</div><div class='add'>+    if (master) {</div><div class='add'>+        xlator_destroy(master);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        return -1;</div><div class='add'>+    return 1;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> static FILE *</div><div class='del'>-get_volfp (glusterfs_ctx_t *ctx)</div><div class='add'>+get_volfp(glusterfs_ctx_t *ctx)</div><div class='ctx'> {</div><div class='del'>-        int          ret = 0;</div><div class='del'>-        cmd_args_t  *cmd_args = NULL;</div><div class='del'>-        FILE        *specfp = NULL;</div><div class='del'>-        struct stat  statbuf;</div><div class='add'>+    cmd_args_t *cmd_args = NULL;</div><div class='add'>+    FILE *specfp = NULL;</div><div class='ctx'> </div><div class='del'>-        cmd_args = &amp;ctx-&gt;cmd_args;</div><div class='add'>+    cmd_args = &amp;ctx-&gt;cmd_args;</div><div class='ctx'> </div><div class='del'>-        ret = sys_lstat (cmd_args-&gt;volfile, &amp;statbuf);</div><div class='del'>-        if (ret == -1) {</div><div class='del'>-                gf_log ("glusterfsd", GF_LOG_ERROR,</div><div class='del'>-                        "%s: %s", cmd_args-&gt;volfile, strerror (errno));</div><div class='del'>-                return NULL;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if ((specfp = fopen (cmd_args-&gt;volfile, "r")) == NULL) {</div><div class='del'>-                gf_log ("glusterfsd", GF_LOG_ERROR,</div><div class='del'>-                        "volume file %s: %s",</div><div class='del'>-                        cmd_args-&gt;volfile,</div><div class='del'>-                        strerror (errno));</div><div class='del'>-                return NULL;</div><div class='del'>-        }</div><div class='add'>+    if ((specfp = fopen(cmd_args-&gt;volfile, "r")) == NULL) {</div><div class='add'>+        gf_smsg("glusterfsd", GF_LOG_ERROR, errno, glusterfsd_msg_9,</div><div class='add'>+                "volume_file=%s", cmd_args-&gt;volfile, NULL);</div><div class='add'>+        return NULL;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        gf_log ("glusterfsd", GF_LOG_DEBUG,</div><div class='del'>-                "loading volume file %s", cmd_args-&gt;volfile);</div><div class='add'>+    gf_msg_debug("glusterfsd", 0, "loading volume file %s", cmd_args-&gt;volfile);</div><div class='ctx'> </div><div class='del'>-        return specfp;</div><div class='add'>+    return specfp;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+static int</div><div class='add'>+gf_remember_backup_volfile_server(char *arg)</div><div class='add'>+{</div><div class='add'>+    glusterfs_ctx_t *ctx = NULL;</div><div class='add'>+    cmd_args_t *cmd_args = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    ctx = glusterfsd_ctx;</div><div class='add'>+    if (!ctx)</div><div class='add'>+        goto out;</div><div class='add'>+    cmd_args = &amp;ctx-&gt;cmd_args;</div><div class='add'>+</div><div class='add'>+    if (!cmd_args)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    ret = gf_set_volfile_server_common(</div><div class='add'>+        cmd_args, arg, GF_DEFAULT_VOLFILE_TRANSPORT, GF_DEFAULT_BASE_PORT);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log("glusterfs", GF_LOG_ERROR, "failed to set volfile server: %s",</div><div class='add'>+               strerror(errno));</div><div class='add'>+    }</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> static int</div><div class='del'>-gf_remember_xlator_option (struct list_head *options, char *arg)</div><div class='add'>+gf_remember_xlator_option(char *arg)</div><div class='ctx'> {</div><div class='del'>-        glusterfs_ctx_t         *ctx = NULL;</div><div class='del'>-        cmd_args_t              *cmd_args  = NULL;</div><div class='del'>-        xlator_cmdline_option_t *option = NULL;</div><div class='del'>-        int                      ret = -1;</div><div class='del'>-        char                    *dot = NULL;</div><div class='del'>-        char                    *equals = NULL;</div><div class='del'>-</div><div class='del'>-        ctx = glusterfs_ctx_get ();</div><div class='del'>-        cmd_args = &amp;ctx-&gt;cmd_args;</div><div class='del'>-</div><div class='del'>-        option = GF_CALLOC (1, sizeof (xlator_cmdline_option_t),</div><div class='del'>-                            gfd_mt_xlator_cmdline_option_t);</div><div class='del'>-        if (!option)</div><div class='del'>-                goto out;</div><div class='add'>+    glusterfs_ctx_t *ctx = NULL;</div><div class='add'>+    cmd_args_t *cmd_args = NULL;</div><div class='add'>+    xlator_cmdline_option_t *option = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    char *dot = NULL;</div><div class='add'>+    char *equals = NULL;</div><div class='ctx'> </div><div class='del'>-        INIT_LIST_HEAD (&amp;option-&gt;cmd_args);</div><div class='add'>+    ctx = glusterfsd_ctx;</div><div class='add'>+    cmd_args = &amp;ctx-&gt;cmd_args;</div><div class='ctx'> </div><div class='del'>-        dot = strchr (arg, '.');</div><div class='del'>-        if (!dot)</div><div class='del'>-                goto out;</div><div class='add'>+    option = GF_CALLOC(1, sizeof(xlator_cmdline_option_t),</div><div class='add'>+                       gfd_mt_xlator_cmdline_option_t);</div><div class='add'>+    if (!option)</div><div class='add'>+        goto out;</div><div class='ctx'> </div><div class='del'>-        option-&gt;volume = GF_CALLOC ((dot - arg) + 1, sizeof (char),</div><div class='del'>-                                    gfd_mt_char);</div><div class='del'>-        strncpy (option-&gt;volume, arg, (dot - arg));</div><div class='add'>+    INIT_LIST_HEAD(&amp;option-&gt;cmd_args);</div><div class='ctx'> </div><div class='del'>-        equals = strchr (arg, '=');</div><div class='del'>-        if (!equals)</div><div class='del'>-                goto out;</div><div class='add'>+    dot = strchr(arg, '.');</div><div class='add'>+    if (!dot) {</div><div class='add'>+        gf_smsg("", GF_LOG_WARNING, 0, glusterfsd_msg_10, "arg=%s", arg, NULL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        option-&gt;key = GF_CALLOC ((equals - dot) + 1, sizeof (char),</div><div class='del'>-                                 gfd_mt_char);</div><div class='del'>-        if (!option-&gt;key)</div><div class='del'>-                goto out;</div><div class='add'>+    option-&gt;volume = GF_MALLOC((dot - arg) + 1, gfd_mt_char);</div><div class='add'>+    if (!option-&gt;volume)</div><div class='add'>+        goto out;</div><div class='ctx'> </div><div class='del'>-        strncpy (option-&gt;key, dot + 1, (equals - dot - 1));</div><div class='add'>+    strncpy(option-&gt;volume, arg, (dot - arg));</div><div class='add'>+    option-&gt;volume[(dot - arg)] = '\0';</div><div class='ctx'> </div><div class='del'>-        if (!*(equals + 1))</div><div class='del'>-                goto out;</div><div class='add'>+    equals = strchr(arg, '=');</div><div class='add'>+    if (!equals) {</div><div class='add'>+        gf_smsg("", GF_LOG_WARNING, 0, glusterfsd_msg_10, "arg=%s", arg, NULL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        option-&gt;value = gf_strdup (equals + 1);</div><div class='add'>+    option-&gt;key = GF_MALLOC((equals - dot) + 1, gfd_mt_char);</div><div class='add'>+    if (!option-&gt;key)</div><div class='add'>+        goto out;</div><div class='ctx'> </div><div class='del'>-        list_add (&amp;option-&gt;cmd_args, &amp;cmd_args-&gt;xlator_options);</div><div class='add'>+    strncpy(option-&gt;key, dot + 1, (equals - dot - 1));</div><div class='add'>+    option-&gt;key[(equals - dot - 1)] = '\0';</div><div class='ctx'> </div><div class='del'>-        ret = 0;</div><div class='add'>+    if (!*(equals + 1)) {</div><div class='add'>+        gf_smsg("", GF_LOG_WARNING, 0, glusterfsd_msg_10, "arg=%s", arg, NULL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    option-&gt;value = gf_strdup(equals + 1);</div><div class='add'>+</div><div class='add'>+    list_add(&amp;option-&gt;cmd_args, &amp;cmd_args-&gt;xlator_options);</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='ctx'> out:</div><div class='del'>-        if (ret == -1) {</div><div class='del'>-                if (option) {</div><div class='del'>-                        if (option-&gt;volume)</div><div class='del'>-                                GF_FREE (option-&gt;volume);</div><div class='del'>-                        if (option-&gt;key)</div><div class='del'>-                                GF_FREE (option-&gt;key);</div><div class='del'>-                        if (option-&gt;value)</div><div class='del'>-                                GF_FREE (option-&gt;value);</div><div class='del'>-</div><div class='del'>-                        GF_FREE (option);</div><div class='del'>-                }</div><div class='add'>+    if (ret == -1) {</div><div class='add'>+        if (option) {</div><div class='add'>+            GF_FREE(option-&gt;volume);</div><div class='add'>+            GF_FREE(option-&gt;key);</div><div class='add'>+            GF_FREE(option-&gt;value);</div><div class='add'>+</div><div class='add'>+            GF_FREE(option);</div><div class='ctx'>         }</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        return ret;</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+#ifdef GF_LINUX_HOST_OS</div><div class='add'>+static struct oom_api_info {</div><div class='add'>+    char *oom_api_file;</div><div class='add'>+    int32_t oom_min;</div><div class='add'>+    int32_t oom_max;</div><div class='add'>+} oom_api_info[] = {</div><div class='add'>+    {"/proc/self/oom_score_adj", OOM_SCORE_ADJ_MIN, OOM_SCORE_ADJ_MAX},</div><div class='add'>+    {"/proc/self/oom_adj", OOM_DISABLE, OOM_ADJUST_MAX},</div><div class='add'>+    {NULL, 0, 0}};</div><div class='add'>+</div><div class='add'>+static struct oom_api_info *</div><div class='add'>+get_oom_api_info(void)</div><div class='add'>+{</div><div class='add'>+    struct oom_api_info *api = NULL;</div><div class='ctx'> </div><div class='add'>+    for (api = oom_api_info; api-&gt;oom_api_file; api++) {</div><div class='add'>+        if (sys_access(api-&gt;oom_api_file, F_OK) != -1) {</div><div class='add'>+            return api;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return NULL;</div><div class='add'>+}</div><div class='add'>+#endif</div><div class='ctx'> </div><div class='ctx'> static error_t</div><div class='del'>-parse_opts (int key, char *arg, struct argp_state *state)</div><div class='add'>+parse_opts(int key, char *arg, struct argp_state *state)</div><div class='ctx'> {</div><div class='del'>-        cmd_args_t *cmd_args = NULL;</div><div class='del'>-        uint32_t    n = 0;</div><div class='del'>-        double      d = 0.0;</div><div class='del'>-        gf_boolean_t b = _gf_false;</div><div class='add'>+    cmd_args_t *cmd_args = NULL;</div><div class='add'>+    uint32_t n = 0;</div><div class='add'>+#ifdef GF_LINUX_HOST_OS</div><div class='add'>+    int32_t k = 0;</div><div class='add'>+    struct oom_api_info *api = NULL;</div><div class='add'>+#endif</div><div class='add'>+    double d = 0.0;</div><div class='add'>+    gf_boolean_t b = _gf_false;</div><div class='add'>+    char *pwd = NULL;</div><div class='add'>+    char *tmp_str = NULL;</div><div class='add'>+    char *port_str = NULL;</div><div class='add'>+    struct passwd *pw = NULL;</div><div class='add'>+    int ret = 0;</div><div class='ctx'> </div><div class='del'>-        cmd_args = state-&gt;input;</div><div class='add'>+    cmd_args = state-&gt;input;</div><div class='ctx'> </div><div class='del'>-        switch (key) {</div><div class='add'>+    switch (key) {</div><div class='ctx'>         case ARGP_VOLFILE_SERVER_KEY:</div><div class='del'>-                cmd_args-&gt;volfile_server = gf_strdup (arg);</div><div class='del'>-                break;</div><div class='add'>+            gf_remember_backup_volfile_server(arg);</div><div class='ctx'> </div><div class='del'>-        case ARGP_VOLFILE_MAX_FETCH_ATTEMPTS:</div><div class='del'>-                n = 0;</div><div class='add'>+            break;</div><div class='ctx'> </div><div class='del'>-                if (gf_string2uint_base10 (arg, &amp;n) == 0) {</div><div class='del'>-                        cmd_args-&gt;max_connect_attempts = n;</div><div class='del'>-                        break;</div><div class='del'>-                }</div><div class='add'>+        case ARGP_READ_ONLY_KEY:</div><div class='add'>+            cmd_args-&gt;read_only = 1;</div><div class='add'>+            break;</div><div class='ctx'> </div><div class='del'>-                argp_failure (state, -1, 0,</div><div class='del'>-                              "Invalid limit on connect attempts %s", arg);</div><div class='del'>-                break;</div><div class='add'>+        case ARGP_ACL_KEY:</div><div class='add'>+            cmd_args-&gt;acl = 1;</div><div class='add'>+            gf_remember_xlator_option("*-md-cache.cache-posix-acl=true");</div><div class='add'>+            break;</div><div class='ctx'> </div><div class='del'>-        case ARGP_READ_ONLY_KEY:</div><div class='del'>-                cmd_args-&gt;read_only = 1;</div><div class='del'>-                break;</div><div class='add'>+        case ARGP_SELINUX_KEY:</div><div class='add'>+            cmd_args-&gt;selinux = 1;</div><div class='add'>+            gf_remember_xlator_option("*-md-cache.cache-selinux=true");</div><div class='add'>+            break;</div><div class='ctx'> </div><div class='del'>-        case ARGP_MAC_COMPAT_KEY:</div><div class='del'>-                if (!arg)</div><div class='del'>-                        arg = "on";</div><div class='add'>+        case ARGP_CAPABILITY_KEY:</div><div class='add'>+            cmd_args-&gt;capability = 1;</div><div class='add'>+            break;</div><div class='ctx'> </div><div class='del'>-                if (gf_string2boolean (arg, &amp;b) == 0) {</div><div class='del'>-                        cmd_args-&gt;mac_compat = b;</div><div class='add'>+        case ARGP_AUX_GFID_MOUNT_KEY:</div><div class='add'>+            cmd_args-&gt;aux_gfid_mount = 1;</div><div class='add'>+            break;</div><div class='ctx'> </div><div class='del'>-                        break;</div><div class='del'>-                }</div><div class='add'>+        case ARGP_INODE32_KEY:</div><div class='add'>+            cmd_args-&gt;enable_ino32 = 1;</div><div class='add'>+            break;</div><div class='ctx'> </div><div class='del'>-                argp_failure (state, -1, 0,</div><div class='del'>-                              "invalid value \"%s\" for mac-compat", arg);</div><div class='del'>-                break;</div><div class='add'>+        case ARGP_WORM_KEY:</div><div class='add'>+            cmd_args-&gt;worm = 1;</div><div class='add'>+            break;</div><div class='ctx'> </div><div class='del'>-        case ARGP_VOLUME_FILE_KEY:</div><div class='del'>-                if (cmd_args-&gt;volfile)</div><div class='del'>-                        GF_FREE (cmd_args-&gt;volfile);</div><div class='add'>+        case ARGP_PRINT_NETGROUPS:</div><div class='add'>+            cmd_args-&gt;print_netgroups = arg;</div><div class='add'>+            break;</div><div class='ctx'> </div><div class='del'>-                cmd_args-&gt;volfile = gf_strdup (arg);</div><div class='del'>-                break;</div><div class='add'>+        case ARGP_PRINT_EXPORTS:</div><div class='add'>+            cmd_args-&gt;print_exports = arg;</div><div class='add'>+            break;</div><div class='ctx'> </div><div class='del'>-        case ARGP_LOG_SERVER_KEY:</div><div class='del'>-                if (cmd_args-&gt;log_server)</div><div class='del'>-                        GF_FREE (cmd_args-&gt;log_server);</div><div class='add'>+        case ARGP_PRINT_XLATORDIR_KEY:</div><div class='add'>+            cmd_args-&gt;print_xlatordir = _gf_true;</div><div class='add'>+            break;</div><div class='ctx'> </div><div class='del'>-                cmd_args-&gt;log_server = gf_strdup (arg);</div><div class='del'>-                break;</div><div class='add'>+        case ARGP_PRINT_STATEDUMPDIR_KEY:</div><div class='add'>+            cmd_args-&gt;print_statedumpdir = _gf_true;</div><div class='add'>+            break;</div><div class='ctx'> </div><div class='del'>-        case ARGP_LOG_LEVEL_KEY:</div><div class='del'>-                if (strcasecmp (arg, ARGP_LOG_LEVEL_NONE_OPTION) == 0) {</div><div class='del'>-                        cmd_args-&gt;log_level = GF_LOG_NONE;</div><div class='del'>-                        break;</div><div class='del'>-                }</div><div class='del'>-                if (strcasecmp (arg, ARGP_LOG_LEVEL_CRITICAL_OPTION) == 0) {</div><div class='del'>-                        cmd_args-&gt;log_level = GF_LOG_CRITICAL;</div><div class='del'>-                        break;</div><div class='del'>-                }</div><div class='del'>-                if (strcasecmp (arg, ARGP_LOG_LEVEL_ERROR_OPTION) == 0) {</div><div class='del'>-                        cmd_args-&gt;log_level = GF_LOG_ERROR;</div><div class='del'>-                        break;</div><div class='del'>-                }</div><div class='del'>-                if (strcasecmp (arg, ARGP_LOG_LEVEL_WARNING_OPTION) == 0) {</div><div class='del'>-                        cmd_args-&gt;log_level = GF_LOG_WARNING;</div><div class='del'>-                        break;</div><div class='del'>-                }</div><div class='del'>-                if (strcasecmp (arg, ARGP_LOG_LEVEL_NORMAL_OPTION) == 0) {</div><div class='del'>-                        cmd_args-&gt;log_level = GF_LOG_NORMAL;</div><div class='del'>-                        break;</div><div class='del'>-                }</div><div class='del'>-                if (strcasecmp (arg, ARGP_LOG_LEVEL_DEBUG_OPTION) == 0) {</div><div class='del'>-                        cmd_args-&gt;log_level = GF_LOG_DEBUG;</div><div class='del'>-                        break;</div><div class='del'>-                }</div><div class='del'>-                if (strcasecmp (arg, ARGP_LOG_LEVEL_TRACE_OPTION) == 0) {</div><div class='del'>-                        cmd_args-&gt;log_level = GF_LOG_TRACE;</div><div class='del'>-                        break;</div><div class='del'>-                }</div><div class='add'>+        case ARGP_PRINT_LOGDIR_KEY:</div><div class='add'>+            cmd_args-&gt;print_logdir = _gf_true;</div><div class='add'>+            break;</div><div class='ctx'> </div><div class='del'>-                argp_failure (state, -1, 0, "unknown log level %s", arg);</div><div class='del'>-                break;</div><div class='add'>+        case ARGP_PRINT_LIBEXECDIR_KEY:</div><div class='add'>+            cmd_args-&gt;print_libexecdir = _gf_true;</div><div class='add'>+            break;</div><div class='add'>+</div><div class='add'>+        case ARGP_MAC_COMPAT_KEY:</div><div class='add'>+            if (!arg)</div><div class='add'>+                arg = "on";</div><div class='add'>+</div><div class='add'>+            if (gf_string2boolean(arg, &amp;b) == 0) {</div><div class='add'>+                cmd_args-&gt;mac_compat = b;</div><div class='ctx'> </div><div class='del'>-        case ARGP_LOG_FILE_KEY:</div><div class='del'>-                cmd_args-&gt;log_file = gf_strdup (arg);</div><div class='ctx'>                 break;</div><div class='add'>+            }</div><div class='ctx'> </div><div class='del'>-        case ARGP_VOLFILE_SERVER_PORT_KEY:</div><div class='del'>-                n = 0;</div><div class='add'>+            argp_failure(state, -1, 0, "invalid value \"%s\" for mac-compat",</div><div class='add'>+                         arg);</div><div class='add'>+            break;</div><div class='ctx'> </div><div class='del'>-                if (gf_string2uint_base10 (arg, &amp;n) == 0) {</div><div class='del'>-                        cmd_args-&gt;volfile_server_port = n;</div><div class='del'>-                        break;</div><div class='add'>+        case ARGP_VOLUME_FILE_KEY:</div><div class='add'>+            GF_FREE(cmd_args-&gt;volfile);</div><div class='add'>+</div><div class='add'>+            if (arg[0] != '/') {</div><div class='add'>+                pwd = getcwd(NULL, PATH_MAX);</div><div class='add'>+                if (!pwd) {</div><div class='add'>+                    argp_failure(state, -1, errno,</div><div class='add'>+                                 "getcwd failed with error no %d", errno);</div><div class='add'>+                    break;</div><div class='ctx'>                 }</div><div class='add'>+                char tmp_buf[1024];</div><div class='add'>+                snprintf(tmp_buf, sizeof(tmp_buf), "%s/%s", pwd, arg);</div><div class='add'>+                cmd_args-&gt;volfile = gf_strdup(tmp_buf);</div><div class='add'>+                free(pwd);</div><div class='add'>+            } else {</div><div class='add'>+                cmd_args-&gt;volfile = gf_strdup(arg);</div><div class='add'>+            }</div><div class='ctx'> </div><div class='del'>-                argp_failure (state, -1, 0,</div><div class='del'>-                              "unknown volfile server port %s", arg);</div><div class='add'>+            break;</div><div class='add'>+</div><div class='add'>+        case ARGP_LOG_LEVEL_KEY:</div><div class='add'>+            if (strcasecmp(arg, ARGP_LOG_LEVEL_NONE_OPTION) == 0) {</div><div class='add'>+                cmd_args-&gt;log_level = GF_LOG_NONE;</div><div class='add'>+                break;</div><div class='add'>+            }</div><div class='add'>+            if (strcasecmp(arg, ARGP_LOG_LEVEL_CRITICAL_OPTION) == 0) {</div><div class='add'>+                cmd_args-&gt;log_level = GF_LOG_CRITICAL;</div><div class='add'>+                break;</div><div class='add'>+            }</div><div class='add'>+            if (strcasecmp(arg, ARGP_LOG_LEVEL_ERROR_OPTION) == 0) {</div><div class='add'>+                cmd_args-&gt;log_level = GF_LOG_ERROR;</div><div class='add'>+                break;</div><div class='add'>+            }</div><div class='add'>+            if (strcasecmp(arg, ARGP_LOG_LEVEL_WARNING_OPTION) == 0) {</div><div class='add'>+                cmd_args-&gt;log_level = GF_LOG_WARNING;</div><div class='ctx'>                 break;</div><div class='add'>+            }</div><div class='add'>+            if (strcasecmp(arg, ARGP_LOG_LEVEL_INFO_OPTION) == 0) {</div><div class='add'>+                cmd_args-&gt;log_level = GF_LOG_INFO;</div><div class='add'>+                break;</div><div class='add'>+            }</div><div class='add'>+            if (strcasecmp(arg, ARGP_LOG_LEVEL_DEBUG_OPTION) == 0) {</div><div class='add'>+                cmd_args-&gt;log_level = GF_LOG_DEBUG;</div><div class='add'>+                break;</div><div class='add'>+            }</div><div class='add'>+            if (strcasecmp(arg, ARGP_LOG_LEVEL_TRACE_OPTION) == 0) {</div><div class='add'>+                cmd_args-&gt;log_level = GF_LOG_TRACE;</div><div class='add'>+                break;</div><div class='add'>+            }</div><div class='ctx'> </div><div class='del'>-        case ARGP_LOG_SERVER_PORT_KEY:</div><div class='del'>-                n = 0;</div><div class='add'>+            argp_failure(state, -1, 0, "unknown log level %s", arg);</div><div class='add'>+            break;</div><div class='ctx'> </div><div class='del'>-                if (gf_string2uint_base10 (arg, &amp;n) == 0) {</div><div class='del'>-                        cmd_args-&gt;log_server_port = n;</div><div class='del'>-                        break;</div><div class='del'>-                }</div><div class='add'>+        case ARGP_LOG_FILE_KEY:</div><div class='add'>+            cmd_args-&gt;log_file = gf_strdup(arg);</div><div class='add'>+            break;</div><div class='ctx'> </div><div class='del'>-                argp_failure (state, -1, 0,</div><div class='del'>-                              "unknown log server port %s", arg);</div><div class='add'>+        case ARGP_VOLFILE_SERVER_PORT_KEY:</div><div class='add'>+            n = 0;</div><div class='add'>+</div><div class='add'>+            if (gf_string2uint_base10(arg, &amp;n) == 0) {</div><div class='add'>+                cmd_args-&gt;volfile_server_port = n;</div><div class='ctx'>                 break;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            argp_failure(state, -1, 0, "unknown volfile server port %s", arg);</div><div class='add'>+            break;</div><div class='ctx'> </div><div class='ctx'>         case ARGP_VOLFILE_SERVER_TRANSPORT_KEY:</div><div class='del'>-                cmd_args-&gt;volfile_server_transport = gf_strdup (arg);</div><div class='del'>-                break;</div><div class='add'>+            cmd_args-&gt;volfile_server_transport = gf_strdup(arg);</div><div class='add'>+            break;</div><div class='ctx'> </div><div class='ctx'>         case ARGP_VOLFILE_ID_KEY:</div><div class='del'>-                cmd_args-&gt;volfile_id = gf_strdup (arg);</div><div class='del'>-                break;</div><div class='add'>+            cmd_args-&gt;volfile_id = gf_strdup(arg);</div><div class='add'>+            break;</div><div class='add'>+</div><div class='add'>+        case ARGP_THIN_CLIENT_KEY:</div><div class='add'>+            cmd_args-&gt;thin_client = _gf_true;</div><div class='add'>+            break;</div><div class='add'>+</div><div class='add'>+        case ARGP_BRICK_MUX_KEY:</div><div class='add'>+            cmd_args-&gt;brick_mux = _gf_true;</div><div class='add'>+            break;</div><div class='ctx'> </div><div class='ctx'>         case ARGP_PID_FILE_KEY:</div><div class='del'>-                cmd_args-&gt;pid_file = gf_strdup (arg);</div><div class='del'>-                break;</div><div class='add'>+            cmd_args-&gt;pid_file = gf_strdup(arg);</div><div class='add'>+            break;</div><div class='add'>+</div><div class='add'>+        case ARGP_SOCK_FILE_KEY:</div><div class='add'>+            cmd_args-&gt;sock_file = gf_strdup(arg);</div><div class='add'>+            break;</div><div class='ctx'> </div><div class='ctx'>         case ARGP_NO_DAEMON_KEY:</div><div class='del'>-                cmd_args-&gt;no_daemon_mode = ENABLE_NO_DAEMON_MODE;</div><div class='del'>-                break;</div><div class='add'>+            cmd_args-&gt;no_daemon_mode = ENABLE_NO_DAEMON_MODE;</div><div class='add'>+            break;</div><div class='ctx'> </div><div class='ctx'>         case ARGP_RUN_ID_KEY:</div><div class='del'>-                cmd_args-&gt;run_id = gf_strdup (arg);</div><div class='del'>-                break;</div><div class='add'>+            cmd_args-&gt;run_id = gf_strdup(arg);</div><div class='add'>+            break;</div><div class='ctx'> </div><div class='ctx'>         case ARGP_DEBUG_KEY:</div><div class='del'>-                cmd_args-&gt;debug_mode = ENABLE_DEBUG_MODE;</div><div class='del'>-                break;</div><div class='add'>+            cmd_args-&gt;debug_mode = ENABLE_DEBUG_MODE;</div><div class='add'>+            break;</div><div class='add'>+        case ARGP_VOLFILE_MAX_FETCH_ATTEMPTS:</div><div class='add'>+            cmd_args-&gt;max_connect_attempts = 1;</div><div class='add'>+            break;</div><div class='ctx'> </div><div class='ctx'>         case ARGP_DIRECT_IO_MODE_KEY:</div><div class='del'>-                if (!arg)</div><div class='del'>-                        arg = "on";</div><div class='add'>+            if (!arg)</div><div class='add'>+                arg = "on";</div><div class='ctx'> </div><div class='del'>-                if (gf_string2boolean (arg, &amp;b) == 0) {</div><div class='del'>-                        cmd_args-&gt;fuse_direct_io_mode = b;</div><div class='add'>+            if (gf_string2boolean(arg, &amp;b) == 0) {</div><div class='add'>+                cmd_args-&gt;fuse_direct_io_mode = b;</div><div class='ctx'> </div><div class='del'>-                        break;</div><div class='del'>-                }</div><div class='add'>+                break;</div><div class='add'>+            }</div><div class='ctx'> </div><div class='del'>-                argp_failure (state, -1, 0,</div><div class='del'>-                              "unknown direct I/O mode setting \"%s\"", arg);</div><div class='add'>+            if (strcmp(arg, "auto") == 0)</div><div class='ctx'>                 break;</div><div class='ctx'> </div><div class='add'>+            argp_failure(state, -1, 0, "unknown direct I/O mode setting \"%s\"",</div><div class='add'>+                         arg);</div><div class='add'>+            break;</div><div class='add'>+</div><div class='add'>+        case ARGP_FUSE_NO_ROOT_SQUASH_KEY:</div><div class='add'>+            cmd_args-&gt;no_root_squash = _gf_true;</div><div class='add'>+            break;</div><div class='add'>+</div><div class='ctx'>         case ARGP_ENTRY_TIMEOUT_KEY:</div><div class='del'>-                d = 0.0;</div><div class='add'>+            d = 0.0;</div><div class='ctx'> </div><div class='del'>-                gf_string2double (arg, &amp;d);</div><div class='del'>-                if (!(d &lt; 0.0)) {</div><div class='del'>-                        cmd_args-&gt;fuse_entry_timeout = d;</div><div class='del'>-                        break;</div><div class='del'>-                }</div><div class='add'>+            gf_string2double(arg, &amp;d);</div><div class='add'>+            if (!(d &lt; 0.0)) {</div><div class='add'>+                cmd_args-&gt;fuse_entry_timeout = d;</div><div class='add'>+                break;</div><div class='add'>+            }</div><div class='ctx'> </div><div class='del'>-                argp_failure (state, -1, 0, "unknown entry timeout %s", arg);</div><div class='add'>+            argp_failure(state, -1, 0, "unknown entry timeout %s", arg);</div><div class='add'>+            break;</div><div class='add'>+</div><div class='add'>+        case ARGP_NEGATIVE_TIMEOUT_KEY:</div><div class='add'>+            d = 0.0;</div><div class='add'>+</div><div class='add'>+            ret = gf_string2double(arg, &amp;d);</div><div class='add'>+            if ((ret == 0) &amp;&amp; !(d &lt; 0.0)) {</div><div class='add'>+                cmd_args-&gt;fuse_negative_timeout = d;</div><div class='ctx'>                 break;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            argp_failure(state, -1, 0, "unknown negative timeout %s", arg);</div><div class='add'>+            break;</div><div class='ctx'> </div><div class='ctx'>         case ARGP_ATTRIBUTE_TIMEOUT_KEY:</div><div class='del'>-                d = 0.0;</div><div class='add'>+            d = 0.0;</div><div class='ctx'> </div><div class='del'>-                gf_string2double (arg, &amp;d);</div><div class='del'>-                if (!(d &lt; 0.0)) {</div><div class='del'>-                        cmd_args-&gt;fuse_attribute_timeout = d;</div><div class='del'>-                        break;</div><div class='del'>-                }</div><div class='add'>+            gf_string2double(arg, &amp;d);</div><div class='add'>+            if (!(d &lt; 0.0)) {</div><div class='add'>+                cmd_args-&gt;fuse_attribute_timeout = d;</div><div class='add'>+                break;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            argp_failure(state, -1, 0, "unknown attribute timeout %s", arg);</div><div class='add'>+            break;</div><div class='ctx'> </div><div class='del'>-                argp_failure (state, -1, 0,</div><div class='del'>-                              "unknown attribute timeout %s", arg);</div><div class='add'>+        case ARGP_CLIENT_PID_KEY:</div><div class='add'>+            if (gf_string2int(arg, &amp;cmd_args-&gt;client_pid) == 0) {</div><div class='add'>+                cmd_args-&gt;client_pid_set = 1;</div><div class='ctx'>                 break;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            argp_failure(state, -1, 0, "unknown client pid %s", arg);</div><div class='add'>+            break;</div><div class='add'>+</div><div class='add'>+        case ARGP_USER_MAP_ROOT_KEY:</div><div class='add'>+            pw = getpwnam(arg);</div><div class='add'>+            if (pw)</div><div class='add'>+                cmd_args-&gt;uid_map_root = pw-&gt;pw_uid;</div><div class='add'>+            else</div><div class='add'>+                argp_failure(state, -1, 0, "user %s does not exist", arg);</div><div class='add'>+            break;</div><div class='ctx'> </div><div class='ctx'>         case ARGP_VOLFILE_CHECK_KEY:</div><div class='del'>-                cmd_args-&gt;volfile_check = 1;</div><div class='del'>-                break;</div><div class='add'>+            cmd_args-&gt;volfile_check = 1;</div><div class='add'>+            break;</div><div class='ctx'> </div><div class='ctx'>         case ARGP_VOLUME_NAME_KEY:</div><div class='del'>-                cmd_args-&gt;volume_name = gf_strdup (arg);</div><div class='del'>-                break;</div><div class='add'>+            cmd_args-&gt;volume_name = gf_strdup(arg);</div><div class='add'>+            break;</div><div class='ctx'> </div><div class='ctx'>         case ARGP_XLATOR_OPTION_KEY:</div><div class='del'>-                gf_remember_xlator_option (&amp;cmd_args-&gt;xlator_options, arg);</div><div class='del'>-                break;</div><div class='add'>+            if (gf_remember_xlator_option(arg))</div><div class='add'>+                argp_failure(state, -1, 0, "invalid xlator option  %s", arg);</div><div class='add'>+</div><div class='add'>+            break;</div><div class='ctx'> </div><div class='ctx'>         case ARGP_KEY_NO_ARGS:</div><div class='del'>-                break;</div><div class='add'>+            break;</div><div class='ctx'> </div><div class='ctx'>         case ARGP_KEY_ARG:</div><div class='del'>-                if (state-&gt;arg_num &gt;= 1)</div><div class='del'>-                        argp_usage (state);</div><div class='del'>-</div><div class='del'>-                cmd_args-&gt;mount_point = gf_strdup (arg);</div><div class='del'>-                break;</div><div class='add'>+            if (state-&gt;arg_num &gt;= 1)</div><div class='add'>+                argp_usage(state);</div><div class='add'>+            cmd_args-&gt;mount_point = gf_strdup(arg);</div><div class='add'>+            break;</div><div class='ctx'> </div><div class='ctx'>         case ARGP_DUMP_FUSE_KEY:</div><div class='del'>-                cmd_args-&gt;dump_fuse = gf_strdup (arg);</div><div class='del'>-                break;</div><div class='add'>+            cmd_args-&gt;dump_fuse = gf_strdup(arg);</div><div class='add'>+            break;</div><div class='ctx'>         case ARGP_BRICK_NAME_KEY:</div><div class='del'>-                cmd_args-&gt;brick_name = gf_strdup (arg);</div><div class='del'>-                break;</div><div class='add'>+            cmd_args-&gt;brick_name = gf_strdup(arg);</div><div class='add'>+            break;</div><div class='ctx'>         case ARGP_BRICK_PORT_KEY:</div><div class='del'>-                n = 0;</div><div class='del'>-</div><div class='del'>-                if (gf_string2uint_base10 (arg, &amp;n) == 0) {</div><div class='del'>-                        cmd_args-&gt;brick_port = n;</div><div class='del'>-                        break;</div><div class='add'>+            n = 0;</div><div class='add'>+</div><div class='add'>+            if (arg != NULL) {</div><div class='add'>+                port_str = strtok_r(arg, ",", &amp;tmp_str);</div><div class='add'>+                if (gf_string2uint_base10(port_str, &amp;n) == 0) {</div><div class='add'>+                    cmd_args-&gt;brick_port = n;</div><div class='add'>+                    port_str = strtok_r(NULL, ",", &amp;tmp_str);</div><div class='add'>+                    if (port_str) {</div><div class='add'>+                        if (gf_string2uint_base10(port_str, &amp;n) == 0) {</div><div class='add'>+                            cmd_args-&gt;brick_port2 = n;</div><div class='add'>+                            break;</div><div class='add'>+                        }</div><div class='add'>+                        argp_failure(state, -1, 0,</div><div class='add'>+                                     "wrong brick (listen) port %s", arg);</div><div class='add'>+                    }</div><div class='add'>+                    break;</div><div class='ctx'>                 }</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            argp_failure(state, -1, 0, "unknown brick (listen) port %s", arg);</div><div class='add'>+            break;</div><div class='add'>+</div><div class='add'>+        case ARGP_MEM_ACCOUNTING_KEY:</div><div class='add'>+            /* TODO: it should have got handled much earlier */</div><div class='add'>+            // gf_mem_acct_enable_set (THIS-&gt;ctx);</div><div class='add'>+            break;</div><div class='add'>+</div><div class='add'>+        case ARGP_FOPEN_KEEP_CACHE_KEY:</div><div class='add'>+            if (!arg)</div><div class='add'>+                arg = "on";</div><div class='add'>+</div><div class='add'>+            if (gf_string2boolean(arg, &amp;b) == 0) {</div><div class='add'>+                cmd_args-&gt;fopen_keep_cache = b;</div><div class='ctx'> </div><div class='del'>-                argp_failure (state, -1, 0,</div><div class='del'>-                              "unknown brick (listen) port %s", arg);</div><div class='ctx'>                 break;</div><div class='del'>-        }</div><div class='add'>+            }</div><div class='ctx'> </div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='add'>+            argp_failure(state, -1, 0, "unknown cache setting \"%s\"", arg);</div><div class='ctx'> </div><div class='add'>+            break;</div><div class='ctx'> </div><div class='del'>-static void</div><div class='del'>-cleanup_and_exit (int signum)</div><div class='del'>-{</div><div class='del'>-        glusterfs_ctx_t *ctx      = NULL;</div><div class='del'>-        xlator_t        *trav     = NULL;</div><div class='add'>+        case ARGP_GLOBAL_TIMER_WHEEL:</div><div class='add'>+            cmd_args-&gt;global_timer_wheel = 1;</div><div class='add'>+            break;</div><div class='ctx'> </div><div class='del'>-        ctx = glusterfs_ctx_get ();</div><div class='add'>+        case ARGP_GID_TIMEOUT_KEY:</div><div class='add'>+            if (!gf_string2int(arg, &amp;cmd_args-&gt;gid_timeout)) {</div><div class='add'>+                cmd_args-&gt;gid_timeout_set = _gf_true;</div><div class='add'>+                break;</div><div class='add'>+            }</div><div class='ctx'> </div><div class='del'>-        /* TODO: is this the right place? */</div><div class='del'>-        // glusterfs_mgmt_pmap_signout (ctx);</div><div class='add'>+            argp_failure(state, -1, 0, "unknown group list timeout %s", arg);</div><div class='add'>+            break;</div><div class='ctx'> </div><div class='del'>-        gf_log ("glusterfsd", GF_LOG_NORMAL, "shutting down");</div><div class='add'>+        case ARGP_RESOLVE_GIDS_KEY:</div><div class='add'>+            cmd_args-&gt;resolve_gids = 1;</div><div class='add'>+            break;</div><div class='ctx'> </div><div class='del'>-        /* Call fini() of FUSE xlator first */</div><div class='del'>-        trav = ctx-&gt;master;</div><div class='del'>-        if (trav &amp;&amp; trav-&gt;fini) {</div><div class='del'>-                THIS = trav;</div><div class='del'>-                trav-&gt;fini (trav);</div><div class='del'>-        }</div><div class='add'>+        case ARGP_FUSE_LRU_LIMIT_KEY:</div><div class='add'>+            if (!gf_string2int32(arg, &amp;cmd_args-&gt;lru_limit))</div><div class='add'>+                break;</div><div class='ctx'> </div><div class='del'>-        /* call fini() of each xlator */</div><div class='del'>-        trav = NULL;</div><div class='del'>-        if (ctx-&gt;active)</div><div class='del'>-                trav = ctx-&gt;active-&gt;top;</div><div class='del'>-        while (trav) {</div><div class='del'>-                if (trav-&gt;fini) {</div><div class='del'>-                        THIS = trav;</div><div class='del'>-                        trav-&gt;fini (trav);</div><div class='del'>-                }</div><div class='del'>-                trav = trav-&gt;next;</div><div class='del'>-        }</div><div class='add'>+            argp_failure(state, -1, 0, "unknown LRU limit option %s", arg);</div><div class='add'>+            break;</div><div class='ctx'> </div><div class='add'>+        case ARGP_FUSE_INVALIDATE_LIMIT_KEY:</div><div class='add'>+            if (!gf_string2int32(arg, &amp;cmd_args-&gt;invalidate_limit))</div><div class='add'>+                break;</div><div class='ctx'> </div><div class='del'>-        glusterfs_pidfile_cleanup (ctx);</div><div class='add'>+            argp_failure(state, -1, 0, "unknown invalidate limit option %s",</div><div class='add'>+                         arg);</div><div class='add'>+            break;</div><div class='ctx'> </div><div class='del'>-        exit (0);</div><div class='del'>-}</div><div class='add'>+        case ARGP_FUSE_BACKGROUND_QLEN_KEY:</div><div class='add'>+            if (!gf_string2int(arg, &amp;cmd_args-&gt;background_qlen))</div><div class='add'>+                break;</div><div class='ctx'> </div><div class='add'>+            argp_failure(state, -1, 0, "unknown background qlen option %s",</div><div class='add'>+                         arg);</div><div class='add'>+            break;</div><div class='add'>+        case ARGP_FUSE_CONGESTION_THRESHOLD_KEY:</div><div class='add'>+            if (!gf_string2int(arg, &amp;cmd_args-&gt;congestion_threshold))</div><div class='add'>+                break;</div><div class='ctx'> </div><div class='del'>-static void</div><div class='del'>-reincarnate (int signum)</div><div class='del'>-{</div><div class='del'>-        int                 ret = 0;</div><div class='del'>-        glusterfs_ctx_t    *ctx = NULL;</div><div class='del'>-        cmd_args_t         *cmd_args = NULL;</div><div class='add'>+            argp_failure(state, -1, 0, "unknown congestion threshold option %s",</div><div class='add'>+                         arg);</div><div class='add'>+            break;</div><div class='ctx'> </div><div class='del'>-        ctx = glusterfs_ctx_get ();</div><div class='del'>-        cmd_args = &amp;ctx-&gt;cmd_args;</div><div class='add'>+#ifdef GF_LINUX_HOST_OS</div><div class='add'>+        case ARGP_OOM_SCORE_ADJ_KEY:</div><div class='add'>+            k = 0;</div><div class='ctx'> </div><div class='add'>+            api = get_oom_api_info();</div><div class='add'>+            if (!api)</div><div class='add'>+                goto no_oom_api;</div><div class='ctx'> </div><div class='del'>-        if (cmd_args-&gt;volfile_server) {</div><div class='del'>-                gf_log ("glusterfsd", GF_LOG_NORMAL,</div><div class='del'>-                        "Fetching the volume file from server...");</div><div class='del'>-                ret = glusterfs_volfile_fetch (ctx);</div><div class='del'>-        } else {</div><div class='del'>-                gf_log ("glusterfsd", GF_LOG_NORMAL,</div><div class='del'>-                        "Reloading volfile ...");</div><div class='del'>-                ret = glusterfs_volumes_init (ctx);</div><div class='del'>-        }</div><div class='add'>+            if (gf_string2int(arg, &amp;k) == 0 &amp;&amp; k &gt;= api-&gt;oom_min &amp;&amp;</div><div class='add'>+                k &lt;= api-&gt;oom_max) {</div><div class='add'>+                cmd_args-&gt;oom_score_adj = gf_strdup(arg);</div><div class='add'>+                break;</div><div class='add'>+            }</div><div class='ctx'> </div><div class='del'>-        if (ret &lt; 0)</div><div class='del'>-                gf_log ("glusterfsd", GF_LOG_ERROR,</div><div class='del'>-                        "volume initialization failed.");</div><div class='add'>+            argp_failure(state, -1, 0, "unknown oom_score_adj value %s", arg);</div><div class='ctx'> </div><div class='del'>-        /* Also, SIGHUP should do logroate */</div><div class='del'>-        gf_log_logrotate (1);</div><div class='add'>+        no_oom_api:</div><div class='add'>+            break;</div><div class='add'>+#endif</div><div class='ctx'> </div><div class='del'>-        return;</div><div class='del'>-}</div><div class='add'>+        case ARGP_FUSE_MOUNTOPTS_KEY:</div><div class='add'>+            cmd_args-&gt;fuse_mountopts = gf_strdup(arg);</div><div class='add'>+            break;</div><div class='ctx'> </div><div class='add'>+        case ARGP_FUSE_USE_READDIRP_KEY:</div><div class='add'>+            if (!arg)</div><div class='add'>+                arg = "yes";</div><div class='ctx'> </div><div class='del'>-static char *</div><div class='del'>-generate_uuid ()</div><div class='del'>-{</div><div class='del'>-        char           tmp_str[1024] = {0,};</div><div class='del'>-        char           hostname[256] = {0,};</div><div class='del'>-        struct timeval tv = {0,};</div><div class='del'>-        struct tm      now = {0, };</div><div class='del'>-        char           now_str[32];</div><div class='del'>-</div><div class='del'>-        if (gettimeofday (&amp;tv, NULL) == -1) {</div><div class='del'>-                gf_log ("glusterfsd", GF_LOG_ERROR,</div><div class='del'>-                        "gettimeofday: failed %s",</div><div class='del'>-                        strerror (errno));</div><div class='del'>-        }</div><div class='add'>+            if (gf_string2boolean(arg, &amp;b) == 0) {</div><div class='add'>+                if (b) {</div><div class='add'>+                    cmd_args-&gt;use_readdirp = "yes";</div><div class='add'>+                } else {</div><div class='add'>+                    cmd_args-&gt;use_readdirp = "no";</div><div class='add'>+                }</div><div class='ctx'> </div><div class='del'>-        if (gethostname (hostname, 256) == -1) {</div><div class='del'>-                gf_log ("glusterfsd", GF_LOG_ERROR,</div><div class='del'>-                        "gethostname: failed %s",</div><div class='del'>-                        strerror (errno));</div><div class='del'>-        }</div><div class='add'>+                break;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            argp_failure(state, -1, 0, "unknown use-readdirp setting \"%s\"",</div><div class='add'>+                         arg);</div><div class='add'>+            break;</div><div class='add'>+</div><div class='add'>+        case ARGP_LOGGER:</div><div class='add'>+            if (strcasecmp(arg, GF_LOGGER_GLUSTER_LOG) == 0)</div><div class='add'>+                cmd_args-&gt;logger = gf_logger_glusterlog;</div><div class='add'>+            else if (strcasecmp(arg, GF_LOGGER_SYSLOG) == 0)</div><div class='add'>+                cmd_args-&gt;logger = gf_logger_syslog;</div><div class='add'>+            else</div><div class='add'>+                argp_failure(state, -1, 0, "unknown logger %s", arg);</div><div class='add'>+</div><div class='add'>+            break;</div><div class='add'>+</div><div class='add'>+        case ARGP_LOG_FORMAT:</div><div class='add'>+            if (strcasecmp(arg, GF_LOG_FORMAT_NO_MSG_ID) == 0)</div><div class='add'>+                cmd_args-&gt;log_format = gf_logformat_traditional;</div><div class='add'>+            else if (strcasecmp(arg, GF_LOG_FORMAT_WITH_MSG_ID) == 0)</div><div class='add'>+                cmd_args-&gt;log_format = gf_logformat_withmsgid;</div><div class='add'>+            else</div><div class='add'>+                argp_failure(state, -1, 0, "unknown log format %s", arg);</div><div class='add'>+</div><div class='add'>+            break;</div><div class='add'>+</div><div class='add'>+        case ARGP_LOG_BUF_SIZE:</div><div class='add'>+            if (gf_string2uint32(arg, &amp;cmd_args-&gt;log_buf_size)) {</div><div class='add'>+                argp_failure(state, -1, 0, "unknown log buf size option %s",</div><div class='add'>+                             arg);</div><div class='add'>+            } else if (cmd_args-&gt;log_buf_size &gt; GF_LOG_LRU_BUFSIZE_MAX) {</div><div class='add'>+                argp_failure(state, -1, 0,</div><div class='add'>+                             "Invalid log buf size %s. "</div><div class='add'>+                             "Valid range: [" GF_LOG_LRU_BUFSIZE_MIN_STR</div><div class='add'>+                             "," GF_LOG_LRU_BUFSIZE_MAX_STR "]",</div><div class='add'>+                             arg);</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            break;</div><div class='add'>+</div><div class='add'>+        case ARGP_LOG_FLUSH_TIMEOUT:</div><div class='add'>+            if (gf_string2uint32(arg, &amp;cmd_args-&gt;log_flush_timeout)) {</div><div class='add'>+                argp_failure(state, -1, 0,</div><div class='add'>+                             "unknown log flush timeout option %s", arg);</div><div class='add'>+            } else if ((cmd_args-&gt;log_flush_timeout &lt;</div><div class='add'>+                        GF_LOG_FLUSH_TIMEOUT_MIN) ||</div><div class='add'>+                       (cmd_args-&gt;log_flush_timeout &gt;</div><div class='add'>+                        GF_LOG_FLUSH_TIMEOUT_MAX)) {</div><div class='add'>+                argp_failure(state, -1, 0,</div><div class='add'>+                             "Invalid log flush timeout %s. "</div><div class='add'>+                             "Valid range: [" GF_LOG_FLUSH_TIMEOUT_MIN_STR</div><div class='add'>+                             "," GF_LOG_FLUSH_TIMEOUT_MAX_STR "]",</div><div class='add'>+                             arg);</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            break;</div><div class='add'>+</div><div class='add'>+        case ARGP_SECURE_MGMT_KEY:</div><div class='add'>+            if (!arg)</div><div class='add'>+                arg = "yes";</div><div class='add'>+</div><div class='add'>+            if (gf_string2boolean(arg, &amp;b) == 0) {</div><div class='add'>+                cmd_args-&gt;secure_mgmt = b ? 1 : 0;</div><div class='add'>+                break;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            argp_failure(state, -1, 0, "unknown secure-mgmt setting \"%s\"",</div><div class='add'>+                         arg);</div><div class='add'>+            break;</div><div class='add'>+</div><div class='add'>+        case ARGP_LOCALTIME_LOGGING_KEY:</div><div class='add'>+            cmd_args-&gt;localtime_logging = 1;</div><div class='add'>+            break;</div><div class='add'>+        case ARGP_PROCESS_NAME_KEY:</div><div class='add'>+            cmd_args-&gt;process_name = gf_strdup(arg);</div><div class='add'>+            break;</div><div class='add'>+        case ARGP_SUBDIR_MOUNT_KEY:</div><div class='add'>+            if (arg[0] != '/') {</div><div class='add'>+                argp_failure(state, -1, 0, "expect '/%s', provided just \"%s\"",</div><div class='add'>+                             arg, arg);</div><div class='add'>+                break;</div><div class='add'>+            }</div><div class='add'>+            cmd_args-&gt;subdir_mount = gf_strdup(arg);</div><div class='add'>+            break;</div><div class='add'>+        case ARGP_FUSE_EVENT_HISTORY_KEY:</div><div class='add'>+            if (!arg)</div><div class='add'>+                arg = "no";</div><div class='add'>+</div><div class='add'>+            if (gf_string2boolean(arg, &amp;b) == 0) {</div><div class='add'>+                if (b) {</div><div class='add'>+                    cmd_args-&gt;event_history = "yes";</div><div class='add'>+                } else {</div><div class='add'>+                    cmd_args-&gt;event_history = "no";</div><div class='add'>+                }</div><div class='ctx'> </div><div class='del'>-        localtime_r (&amp;tv.tv_sec, &amp;now);</div><div class='del'>-        strftime (now_str, 32, "%Y/%m/%d-%H:%M:%S", &amp;now);</div><div class='del'>-        snprintf (tmp_str, 1024, "%s-%d-%s:%" GF_PRI_SUSECONDS,</div><div class='del'>-                  hostname, getpid(), now_str, tv.tv_usec);</div><div class='add'>+                break;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            argp_failure(state, -1, 0, "unknown event-history setting \"%s\"",</div><div class='add'>+                         arg);</div><div class='add'>+            break;</div><div class='add'>+        case ARGP_READER_THREAD_COUNT_KEY:</div><div class='add'>+            if (gf_string2uint32(arg, &amp;cmd_args-&gt;reader_thread_count)) {</div><div class='add'>+                argp_failure(state, -1, 0,</div><div class='add'>+                             "unknown reader thread count option %s", arg);</div><div class='add'>+            } else if ((cmd_args-&gt;reader_thread_count &lt; 1) ||</div><div class='add'>+                       (cmd_args-&gt;reader_thread_count &gt; 64)) {</div><div class='add'>+                argp_failure(state, -1, 0,</div><div class='add'>+                             "Invalid reader thread count %s. "</div><div class='add'>+                             "Valid range: [\"1, 64\"]",</div><div class='add'>+                             arg);</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            break;</div><div class='add'>+</div><div class='add'>+        case ARGP_KERNEL_WRITEBACK_CACHE_KEY:</div><div class='add'>+            if (!arg)</div><div class='add'>+                arg = "yes";</div><div class='add'>+</div><div class='add'>+            if (gf_string2boolean(arg, &amp;b) == 0) {</div><div class='add'>+                cmd_args-&gt;kernel_writeback_cache = b;</div><div class='ctx'> </div><div class='del'>-        return gf_strdup (tmp_str);</div><div class='del'>-}</div><div class='add'>+                break;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            argp_failure(state, -1, 0,</div><div class='add'>+                         "unknown kernel writeback cache setting \"%s\"", arg);</div><div class='add'>+            break;</div><div class='add'>+        case ARGP_ATTR_TIMES_GRANULARITY_KEY:</div><div class='add'>+            if (gf_string2uint32(arg, &amp;cmd_args-&gt;attr_times_granularity)) {</div><div class='add'>+                argp_failure(state, -1, 0,</div><div class='add'>+                             "unknown attribute times granularity option %s",</div><div class='add'>+                             arg);</div><div class='add'>+            } else if (cmd_args-&gt;attr_times_granularity &gt; 1000000000) {</div><div class='add'>+                argp_failure(state, -1, 0,</div><div class='add'>+                             "Invalid attribute times granularity value %s. "</div><div class='add'>+                             "Valid range: [\"0, 1000000000\"]",</div><div class='add'>+                             arg);</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            break;</div><div class='add'>+</div><div class='add'>+        case ARGP_FUSE_FLUSH_HANDLE_INTERRUPT_KEY:</div><div class='add'>+            if (!arg)</div><div class='add'>+                arg = "yes";</div><div class='add'>+</div><div class='add'>+            if (gf_string2boolean(arg, &amp;b) == 0) {</div><div class='add'>+                cmd_args-&gt;fuse_flush_handle_interrupt = b;</div><div class='ctx'> </div><div class='del'>-#define GF_SERVER_PROCESS   0</div><div class='del'>-#define GF_CLIENT_PROCESS   1</div><div class='del'>-#define GF_GLUSTERD_PROCESS 2</div><div class='add'>+                break;</div><div class='add'>+            }</div><div class='ctx'> </div><div class='del'>-static uint8_t</div><div class='del'>-gf_get_process_mode (char *exec_name)</div><div class='del'>-{</div><div class='del'>-        char *dup_execname = NULL, *base = NULL;</div><div class='del'>-        uint8_t ret = 0;</div><div class='add'>+            argp_failure(state, -1, 0,</div><div class='add'>+                         "unknown fuse flush handle interrupt setting \"%s\"",</div><div class='add'>+                         arg);</div><div class='add'>+            break;</div><div class='ctx'> </div><div class='del'>-        dup_execname = gf_strdup (exec_name);</div><div class='del'>-        base = basename (dup_execname);</div><div class='add'>+        case ARGP_FUSE_AUTO_INVAL_KEY:</div><div class='add'>+            if (!arg)</div><div class='add'>+                arg = "yes";</div><div class='ctx'> </div><div class='del'>-        if (!strncmp (base, "glusterfsd", 10)) {</div><div class='del'>-                ret = GF_SERVER_PROCESS;</div><div class='del'>-        } else if (!strncmp (base, "glusterd", 8)) {</div><div class='del'>-                ret = GF_GLUSTERD_PROCESS;</div><div class='del'>-        } else {</div><div class='del'>-                ret = GF_CLIENT_PROCESS;</div><div class='del'>-        }</div><div class='add'>+            if (gf_string2boolean(arg, &amp;b) == 0) {</div><div class='add'>+                cmd_args-&gt;fuse_auto_inval = b;</div><div class='add'>+                break;</div><div class='add'>+            }</div><div class='ctx'> </div><div class='del'>-        GF_FREE (dup_execname);</div><div class='add'>+            break;</div><div class='ctx'> </div><div class='del'>-        return ret;</div><div class='add'>+        case ARGP_GLOBAL_THREADING_KEY:</div><div class='add'>+            if (!arg || (*arg == 0)) {</div><div class='add'>+                arg = "yes";</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            if (gf_string2boolean(arg, &amp;b) == 0) {</div><div class='add'>+                cmd_args-&gt;global_threading = b;</div><div class='add'>+                break;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            argp_failure(state, -1, 0,</div><div class='add'>+                         "Invalid value for global threading \"%s\"", arg);</div><div class='add'>+            break;</div><div class='add'>+</div><div class='add'>+        case ARGP_FUSE_DEV_EPERM_RATELIMIT_NS_KEY:</div><div class='add'>+            if (gf_string2uint32(arg, &amp;cmd_args-&gt;fuse_dev_eperm_ratelimit_ns)) {</div><div class='add'>+                argp_failure(state, -1, 0,</div><div class='add'>+                             "Non-numerical value for "</div><div class='add'>+                             "'fuse-dev-eperm-ratelimit-ns' option %s",</div><div class='add'>+                             arg);</div><div class='add'>+            } else if (cmd_args-&gt;fuse_dev_eperm_ratelimit_ns &gt; 1000000000) {</div><div class='add'>+                argp_failure(state, -1, 0,</div><div class='add'>+                             "Invalid 'fuse-dev-eperm-ratelimit-ns' value %s. "</div><div class='add'>+                             "Valid range: [\"0, 1000000000\"]",</div><div class='add'>+                             arg);</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            break;</div><div class='add'>+    }</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+gf_boolean_t</div><div class='add'>+should_call_fini(glusterfs_ctx_t *ctx, xlator_t *trav)</div><div class='add'>+{</div><div class='add'>+    /* There's nothing to call, so the other checks don't matter. */</div><div class='add'>+    if (!trav-&gt;fini) {</div><div class='add'>+        return _gf_false;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='add'>+    /* This preserves previous behavior in glusterd. */</div><div class='add'>+    if (ctx-&gt;process_mode == GF_GLUSTERD_PROCESS) {</div><div class='add'>+        return _gf_true;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-static int</div><div class='del'>-set_log_file_path (cmd_args_t *cmd_args)</div><div class='add'>+    return _gf_false;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+cleanup_and_exit(int signum)</div><div class='ctx'> {</div><div class='del'>-        int   i = 0;</div><div class='del'>-        int   j = 0;</div><div class='del'>-        int   ret = 0;</div><div class='del'>-        int   port = 0;</div><div class='del'>-        char *tmp_ptr = NULL;</div><div class='del'>-        char  tmp_str[1024] = {0,};</div><div class='del'>-</div><div class='del'>-        if (cmd_args-&gt;mount_point) {</div><div class='del'>-                j = 0;</div><div class='del'>-                i = 0;</div><div class='del'>-                if (cmd_args-&gt;mount_point[0] == '/')</div><div class='del'>-                        i = 1;</div><div class='del'>-                for (; i &lt; strlen (cmd_args-&gt;mount_point); i++,j++) {</div><div class='del'>-                        tmp_str[j] = cmd_args-&gt;mount_point[i];</div><div class='del'>-                        if (cmd_args-&gt;mount_point[i] == '/')</div><div class='del'>-                                tmp_str[j] = '-';</div><div class='del'>-                }</div><div class='add'>+    glusterfs_ctx_t *ctx = NULL;</div><div class='add'>+    xlator_t *trav = NULL;</div><div class='add'>+    xlator_t *top;</div><div class='add'>+    xlator_t *victim;</div><div class='add'>+    xlator_list_t **trav_p;</div><div class='ctx'> </div><div class='del'>-                ret = gf_asprintf (&amp;cmd_args-&gt;log_file,</div><div class='del'>-                                   DEFAULT_LOG_FILE_DIRECTORY "/%s.log",</div><div class='del'>-                                   tmp_str);</div><div class='del'>-                if (ret == -1) {</div><div class='del'>-                        gf_log ("glusterfsd", GF_LOG_ERROR,</div><div class='del'>-                                "asprintf failed while setting up log-file");</div><div class='del'>-                }</div><div class='del'>-                goto done;</div><div class='add'>+    ctx = glusterfsd_ctx;</div><div class='add'>+</div><div class='add'>+    if (!ctx)</div><div class='add'>+        return;</div><div class='add'>+</div><div class='add'>+    /* To take or not to take the mutex here and in the other</div><div class='add'>+     * signal handler - gf_print_trace() - is the big question here.</div><div class='add'>+     *</div><div class='add'>+     * Taking mutex in signal handler would mean that if the process</div><div class='add'>+     * receives a fatal signal while another thread is holding</div><div class='add'>+     * ctx-&gt;log.log_buf_lock to perhaps log a message in _gf_msg_internal(),</div><div class='add'>+     * the offending thread hangs on the mutex lock forever without letting</div><div class='add'>+     * the process exit.</div><div class='add'>+     *</div><div class='add'>+     * On the other hand. not taking the mutex in signal handler would cause</div><div class='add'>+     * it to modify the lru_list of buffered log messages in a racy manner,</div><div class='add'>+     * corrupt the list and potentially give rise to an unending</div><div class='add'>+     * cascade of SIGSEGVs and other re-entrancy issues.</div><div class='add'>+     */</div><div class='add'>+</div><div class='add'>+    gf_log_disable_suppression_before_exit(ctx);</div><div class='add'>+</div><div class='add'>+    gf_msg_callingfn("", GF_LOG_WARNING, 0, glusterfsd_msg_32,</div><div class='add'>+                     "received signum (%d), shutting down", signum);</div><div class='add'>+</div><div class='add'>+    if (ctx-&gt;cleanup_started)</div><div class='add'>+        return;</div><div class='add'>+    pthread_mutex_lock(&amp;ctx-&gt;cleanup_lock);</div><div class='add'>+    {</div><div class='add'>+        ctx-&gt;cleanup_started = 1;</div><div class='add'>+</div><div class='add'>+        /* signout should be sent to all the bricks in case brick mux is enabled</div><div class='add'>+         * and multiple brick instances are attached to this process</div><div class='add'>+         */</div><div class='add'>+        if (ctx-&gt;active) {</div><div class='add'>+            top = ctx-&gt;active-&gt;first;</div><div class='add'>+            for (trav_p = &amp;top-&gt;children; *trav_p; trav_p = &amp;(*trav_p)-&gt;next) {</div><div class='add'>+                victim = (*trav_p)-&gt;xlator;</div><div class='add'>+                rpc_clnt_mgmt_pmap_signout(ctx, victim-&gt;name);</div><div class='add'>+            }</div><div class='add'>+        } else {</div><div class='add'>+            rpc_clnt_mgmt_pmap_signout(ctx, NULL);</div><div class='ctx'>         }</div><div class='ctx'> </div><div class='del'>-        if (cmd_args-&gt;volfile) {</div><div class='del'>-                j = 0;</div><div class='del'>-                i = 0;</div><div class='del'>-                if (cmd_args-&gt;volfile[0] == '/')</div><div class='del'>-                        i = 1;</div><div class='del'>-                for (; i &lt; strlen (cmd_args-&gt;volfile); i++,j++) {</div><div class='del'>-                        tmp_str[j] = cmd_args-&gt;volfile[i];</div><div class='del'>-                        if (cmd_args-&gt;volfile[i] == '/')</div><div class='del'>-                                tmp_str[j] = '-';</div><div class='del'>-                }</div><div class='del'>-                ret = gf_asprintf (&amp;cmd_args-&gt;log_file,</div><div class='del'>-                                DEFAULT_LOG_FILE_DIRECTORY "/%s.log",</div><div class='del'>-                                tmp_str);</div><div class='del'>-                if (ret == -1) {</div><div class='del'>-                        gf_log ("glusterfsd", GF_LOG_ERROR,</div><div class='del'>-                                "asprintf failed while setting up log-file");</div><div class='del'>-                }</div><div class='del'>-                goto done;</div><div class='add'>+        /* below part is a racy code where the rpcsvc object is freed.</div><div class='add'>+         * But in another thread (epoll thread), upon poll error in the</div><div class='add'>+         * socket the transports are cleaned up where again rpcsvc object</div><div class='add'>+         * is accessed (which is already freed by the below function).</div><div class='add'>+         * Since the process is about to be killed don't execute the function</div><div class='add'>+         * below.</div><div class='add'>+         */</div><div class='add'>+        /* if (ctx-&gt;listener) { */</div><div class='add'>+        /*         (void) glusterfs_listener_stop (ctx); */</div><div class='add'>+        /* } */</div><div class='add'>+</div><div class='add'>+        /* Call fini() of FUSE xlator first:</div><div class='add'>+         * so there are no more requests coming and</div><div class='add'>+         * 'umount' of mount point is done properly */</div><div class='add'>+        trav = ctx-&gt;master;</div><div class='add'>+        if (trav &amp;&amp; trav-&gt;fini) {</div><div class='add'>+            THIS = trav;</div><div class='add'>+            trav-&gt;fini(trav);</div><div class='ctx'>         }</div><div class='ctx'> </div><div class='del'>-        if (cmd_args-&gt;volfile_server) {</div><div class='del'>-                port = 1;</div><div class='del'>-                tmp_ptr = "default";</div><div class='del'>-</div><div class='del'>-                if (cmd_args-&gt;volfile_server_port)</div><div class='del'>-                        port = cmd_args-&gt;volfile_server_port;</div><div class='del'>-                if (cmd_args-&gt;volfile_id)</div><div class='del'>-                        tmp_ptr = cmd_args-&gt;volfile_id;</div><div class='del'>-</div><div class='del'>-                ret = gf_asprintf (&amp;cmd_args-&gt;log_file,</div><div class='del'>-                                   DEFAULT_LOG_FILE_DIRECTORY "/%s-%s-%d.log",</div><div class='del'>-                                   cmd_args-&gt;volfile_server, tmp_ptr, port);</div><div class='del'>-                if (-1 == ret) {</div><div class='del'>-                        gf_log ("glusterfsd", GF_LOG_ERROR,</div><div class='del'>-                                "asprintf failed while setting up log-file");</div><div class='del'>-                }</div><div class='add'>+        glusterfs_pidfile_cleanup(ctx);</div><div class='add'>+</div><div class='add'>+#if 0</div><div class='add'>+        /* TODO: Properly do cleanup_and_exit(), with synchronization */</div><div class='add'>+        if (ctx-&gt;mgmt) {</div><div class='add'>+                /* cleanup the saved-frames before last unref */</div><div class='add'>+                rpc_clnt_connection_cleanup (&amp;ctx-&gt;mgmt-&gt;conn);</div><div class='add'>+                rpc_clnt_unref (ctx-&gt;mgmt);</div><div class='ctx'>         }</div><div class='del'>-done:</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='add'>+#endif</div><div class='ctx'> </div><div class='add'>+        trav = NULL;</div><div class='ctx'> </div><div class='del'>-static int</div><div class='del'>-glusterfs_ctx_defaults_init (glusterfs_ctx_t *ctx)</div><div class='add'>+        /* previously we were releasing the cleanup mutex lock before the</div><div class='add'>+           process exit. As we are releasing the cleanup mutex lock, before</div><div class='add'>+           the process can exit some other thread which is blocked on</div><div class='add'>+           cleanup mutex lock is acquiring the cleanup mutex lock and</div><div class='add'>+           trying to acquire some resources which are already freed as a</div><div class='add'>+           part of cleanup. To avoid this, we are exiting the process without</div><div class='add'>+           releasing the cleanup mutex lock. This will not cause any lock</div><div class='add'>+           related issues as the process which acquired the lock is going down</div><div class='add'>+         */</div><div class='add'>+        /* NOTE: Only the least significant 8 bits i.e (signum &amp; 255)</div><div class='add'>+           will be available to parent process on calling exit() */</div><div class='add'>+        exit(abs(signum));</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+reincarnate(int signum)</div><div class='ctx'> {</div><div class='del'>-        cmd_args_t    *cmd_args = NULL;</div><div class='del'>-        struct rlimit  lim = {0, };</div><div class='del'>-        call_pool_t   *pool = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    glusterfs_ctx_t *ctx = NULL;</div><div class='add'>+    cmd_args_t *cmd_args = NULL;</div><div class='ctx'> </div><div class='del'>-        xlator_mem_acct_init (THIS, gfd_mt_end);</div><div class='add'>+    ctx = glusterfsd_ctx;</div><div class='add'>+    cmd_args = &amp;ctx-&gt;cmd_args;</div><div class='ctx'> </div><div class='del'>-        ctx-&gt;process_uuid = generate_uuid ();</div><div class='del'>-        if (!ctx-&gt;process_uuid)</div><div class='del'>-                return -1;</div><div class='add'>+    gf_msg_trace("gluster", 0, "received reincarnate request (sig:HUP)");</div><div class='ctx'> </div><div class='del'>-        ctx-&gt;page_size  = 128 * GF_UNIT_KB;</div><div class='add'>+    if (cmd_args-&gt;volfile_server) {</div><div class='add'>+        gf_smsg("glusterfsd", GF_LOG_INFO, 0, glusterfsd_msg_11, NULL);</div><div class='add'>+        ret = glusterfs_volfile_fetch(ctx);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        ctx-&gt;iobuf_pool = iobuf_pool_new (8 * GF_UNIT_MB, ctx-&gt;page_size);</div><div class='del'>-        if (!ctx-&gt;iobuf_pool)</div><div class='del'>-                return -1;</div><div class='add'>+    /* Also, SIGHUP should do logrotate */</div><div class='add'>+    gf_log_logrotate(1);</div><div class='ctx'> </div><div class='del'>-        ctx-&gt;event_pool = event_pool_new (DEFAULT_EVENT_POOL_SIZE);</div><div class='del'>-        if (!ctx-&gt;event_pool)</div><div class='del'>-                return -1;</div><div class='add'>+    if (ret &lt; 0)</div><div class='add'>+        gf_smsg("glusterfsd", GF_LOG_ERROR, 0, glusterfsd_msg_12, NULL);</div><div class='ctx'> </div><div class='del'>-        pool = GF_CALLOC (1, sizeof (call_pool_t),</div><div class='del'>-                          gfd_mt_call_pool_t);</div><div class='del'>-        if (!pool)</div><div class='del'>-                return -1;</div><div class='add'>+    return;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        /* frame_mem_pool size 112 * 16k */</div><div class='del'>-        pool-&gt;frame_mem_pool = mem_pool_new (call_frame_t, 16384);</div><div class='add'>+void</div><div class='add'>+emancipate(glusterfs_ctx_t *ctx, int ret)</div><div class='add'>+{</div><div class='add'>+    /* break free from the parent */</div><div class='add'>+    if (ctx-&gt;daemon_pipe[1] != -1) {</div><div class='add'>+        sys_write(ctx-&gt;daemon_pipe[1], (void *)&amp;ret, sizeof(ret));</div><div class='add'>+        sys_close(ctx-&gt;daemon_pipe[1]);</div><div class='add'>+        ctx-&gt;daemon_pipe[1] = -1;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        if (!pool-&gt;frame_mem_pool)</div><div class='del'>-                return -1;</div><div class='add'>+static uint8_t</div><div class='add'>+gf_get_process_mode(char *exec_name)</div><div class='add'>+{</div><div class='add'>+    char *dup_execname = NULL, *base = NULL;</div><div class='add'>+    uint8_t ret = 0;</div><div class='ctx'> </div><div class='del'>-        /* stack_mem_pool size 256 * 8k */</div><div class='del'>-        pool-&gt;stack_mem_pool = mem_pool_new (call_stack_t, 8192);</div><div class='add'>+    dup_execname = gf_strdup(exec_name);</div><div class='add'>+    base = basename(dup_execname);</div><div class='ctx'> </div><div class='del'>-        if (!pool-&gt;stack_mem_pool)</div><div class='del'>-                return -1;</div><div class='add'>+    if (!strncmp(base, "glusterfsd", 10)) {</div><div class='add'>+        ret = GF_SERVER_PROCESS;</div><div class='add'>+    } else if (!strncmp(base, "glusterd", 8)) {</div><div class='add'>+        ret = GF_GLUSTERD_PROCESS;</div><div class='add'>+    } else {</div><div class='add'>+        ret = GF_CLIENT_PROCESS;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        ctx-&gt;stub_mem_pool = mem_pool_new (call_stub_t, 1024);</div><div class='del'>-        if (!ctx-&gt;stub_mem_pool)</div><div class='del'>-                return -1;</div><div class='add'>+    GF_FREE(dup_execname);</div><div class='ctx'> </div><div class='del'>-        INIT_LIST_HEAD (&amp;pool-&gt;all_frames);</div><div class='del'>-        LOCK_INIT (&amp;pool-&gt;lock);</div><div class='del'>-        ctx-&gt;pool = pool;</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        pthread_mutex_init (&amp;(ctx-&gt;lock), NULL);</div><div class='add'>+static int</div><div class='add'>+glusterfs_ctx_defaults_init(glusterfs_ctx_t *ctx)</div><div class='add'>+{</div><div class='add'>+    cmd_args_t *cmd_args = NULL;</div><div class='add'>+    struct rlimit lim = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int ret = -1;</div><div class='ctx'> </div><div class='del'>-        cmd_args = &amp;ctx-&gt;cmd_args;</div><div class='add'>+    if (!ctx)</div><div class='add'>+        return ret;</div><div class='ctx'> </div><div class='del'>-        /* parsing command line arguments */</div><div class='del'>-        cmd_args-&gt;log_level = DEFAULT_LOG_LEVEL;</div><div class='add'>+    ret = xlator_mem_acct_init(THIS, gfd_mt_end);</div><div class='add'>+    if (ret != 0) {</div><div class='add'>+        gf_smsg(THIS-&gt;name, GF_LOG_CRITICAL, 0, glusterfsd_msg_34, NULL);</div><div class='add'>+        return ret;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* reset ret to -1 so that we don't need to explicitly</div><div class='add'>+     * set it in all error paths before "goto err"</div><div class='add'>+     */</div><div class='add'>+    ret = -1;</div><div class='add'>+</div><div class='add'>+    /* monitoring should be enabled by default */</div><div class='add'>+    ctx-&gt;measure_latency = true;</div><div class='add'>+</div><div class='add'>+    ctx-&gt;process_uuid = generate_glusterfs_ctx_id();</div><div class='add'>+    if (!ctx-&gt;process_uuid) {</div><div class='add'>+        gf_smsg("", GF_LOG_CRITICAL, 0, glusterfsd_msg_13, NULL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ctx-&gt;page_size = 128 * GF_UNIT_KB;</div><div class='add'>+</div><div class='add'>+    ctx-&gt;iobuf_pool = iobuf_pool_new();</div><div class='add'>+    if (!ctx-&gt;iobuf_pool) {</div><div class='add'>+        gf_smsg("", GF_LOG_CRITICAL, 0, glusterfsd_msg_14, "iobuf", NULL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ctx-&gt;event_pool = gf_event_pool_new(DEFAULT_EVENT_POOL_SIZE,</div><div class='add'>+                                        STARTING_EVENT_THREADS);</div><div class='add'>+    if (!ctx-&gt;event_pool) {</div><div class='add'>+        gf_smsg("", GF_LOG_CRITICAL, 0, glusterfsd_msg_14, "event", NULL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ctx-&gt;pool = GF_CALLOC(1, sizeof(call_pool_t), gfd_mt_call_pool_t);</div><div class='add'>+    if (!ctx-&gt;pool) {</div><div class='add'>+        gf_smsg("", GF_LOG_CRITICAL, 0, glusterfsd_msg_14, "call", NULL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    INIT_LIST_HEAD(&amp;ctx-&gt;pool-&gt;all_frames);</div><div class='add'>+    LOCK_INIT(&amp;ctx-&gt;pool-&gt;lock);</div><div class='add'>+</div><div class='add'>+    /* frame_mem_pool size 112 * 4k */</div><div class='add'>+    ctx-&gt;pool-&gt;frame_mem_pool = mem_pool_new(call_frame_t, 4096);</div><div class='add'>+    if (!ctx-&gt;pool-&gt;frame_mem_pool) {</div><div class='add'>+        gf_smsg("", GF_LOG_CRITICAL, 0, glusterfsd_msg_14, "frame", NULL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    /* stack_mem_pool size 256 * 1024 */</div><div class='add'>+    ctx-&gt;pool-&gt;stack_mem_pool = mem_pool_new(call_stack_t, 1024);</div><div class='add'>+    if (!ctx-&gt;pool-&gt;stack_mem_pool) {</div><div class='add'>+        gf_smsg("", GF_LOG_CRITICAL, 0, glusterfsd_msg_14, "stack", NULL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ctx-&gt;stub_mem_pool = mem_pool_new(call_stub_t, 1024);</div><div class='add'>+    if (!ctx-&gt;stub_mem_pool) {</div><div class='add'>+        gf_smsg("", GF_LOG_CRITICAL, 0, glusterfsd_msg_14, "stub", NULL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ctx-&gt;dict_pool = mem_pool_new(dict_t, GF_MEMPOOL_COUNT_OF_DICT_T);</div><div class='add'>+    if (!ctx-&gt;dict_pool)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    ctx-&gt;dict_pair_pool = mem_pool_new(data_pair_t,</div><div class='add'>+                                       GF_MEMPOOL_COUNT_OF_DATA_PAIR_T);</div><div class='add'>+    if (!ctx-&gt;dict_pair_pool)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    ctx-&gt;dict_data_pool = mem_pool_new(data_t, GF_MEMPOOL_COUNT_OF_DATA_T);</div><div class='add'>+    if (!ctx-&gt;dict_data_pool)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    ctx-&gt;logbuf_pool = mem_pool_new(log_buf_t, GF_MEMPOOL_COUNT_OF_LRU_BUF_T);</div><div class='add'>+    if (!ctx-&gt;logbuf_pool)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    pthread_mutex_init(&amp;ctx-&gt;notify_lock, NULL);</div><div class='add'>+    pthread_mutex_init(&amp;ctx-&gt;cleanup_lock, NULL);</div><div class='add'>+    pthread_cond_init(&amp;ctx-&gt;notify_cond, NULL);</div><div class='add'>+</div><div class='add'>+    ctx-&gt;clienttable = gf_clienttable_alloc();</div><div class='add'>+    if (!ctx-&gt;clienttable)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    cmd_args = &amp;ctx-&gt;cmd_args;</div><div class='add'>+</div><div class='add'>+    /* parsing command line arguments */</div><div class='add'>+    cmd_args-&gt;log_level = DEFAULT_LOG_LEVEL;</div><div class='add'>+    cmd_args-&gt;logger = gf_logger_glusterlog;</div><div class='add'>+    cmd_args-&gt;log_format = gf_logformat_withmsgid;</div><div class='add'>+    cmd_args-&gt;log_buf_size = GF_LOG_LRU_BUFSIZE_DEFAULT;</div><div class='add'>+    cmd_args-&gt;log_flush_timeout = GF_LOG_FLUSH_TIMEOUT_DEFAULT;</div><div class='add'>+</div><div class='add'>+    cmd_args-&gt;mac_compat = GF_OPTION_DISABLE;</div><div class='ctx'> #ifdef GF_DARWIN_HOST_OS</div><div class='del'>-        cmd_args-&gt;mac_compat = GF_OPTION_DEFERRED;</div><div class='del'>-        /* On Darwin machines, O_APPEND is not handled,</div><div class='del'>-         * which may corrupt the data</div><div class='del'>-         */</div><div class='del'>-        cmd_args-&gt;fuse_direct_io_mode = GF_OPTION_DISABLE;</div><div class='add'>+    /* On Darwin machines, O_APPEND is not handled,</div><div class='add'>+     * which may corrupt the data</div><div class='add'>+     */</div><div class='add'>+    cmd_args-&gt;fuse_direct_io_mode = GF_OPTION_DISABLE;</div><div class='ctx'> #else</div><div class='del'>-        cmd_args-&gt;mac_compat = GF_OPTION_DISABLE;</div><div class='del'>-        cmd_args-&gt;fuse_direct_io_mode = GF_OPTION_DEFERRED;</div><div class='add'>+    cmd_args-&gt;fuse_direct_io_mode = GF_OPTION_DEFERRED;</div><div class='ctx'> #endif</div><div class='del'>-        cmd_args-&gt;fuse_attribute_timeout = -1;</div><div class='del'>-</div><div class='del'>-        INIT_LIST_HEAD (&amp;cmd_args-&gt;xlator_options);</div><div class='del'>-</div><div class='del'>-        lim.rlim_cur = RLIM_INFINITY;</div><div class='del'>-        lim.rlim_max = RLIM_INFINITY;</div><div class='del'>-        setrlimit (RLIMIT_CORE, &amp;lim);</div><div class='add'>+    cmd_args-&gt;fuse_attribute_timeout = -1;</div><div class='add'>+    cmd_args-&gt;fuse_entry_timeout = -1;</div><div class='add'>+    cmd_args-&gt;fopen_keep_cache = GF_OPTION_DEFERRED;</div><div class='add'>+    cmd_args-&gt;kernel_writeback_cache = GF_OPTION_DEFERRED;</div><div class='add'>+    cmd_args-&gt;fuse_flush_handle_interrupt = GF_OPTION_DEFERRED;</div><div class='add'>+</div><div class='add'>+    if (ctx-&gt;mem_acct_enable)</div><div class='add'>+        cmd_args-&gt;mem_acct = 1;</div><div class='add'>+</div><div class='add'>+    INIT_LIST_HEAD(&amp;cmd_args-&gt;xlator_options);</div><div class='add'>+    INIT_LIST_HEAD(&amp;cmd_args-&gt;volfile_servers);</div><div class='add'>+    ctx-&gt;pxl_count = 0;</div><div class='add'>+    pthread_mutex_init(&amp;ctx-&gt;fd_lock, NULL);</div><div class='add'>+    pthread_cond_init(&amp;ctx-&gt;fd_cond, NULL);</div><div class='add'>+    INIT_LIST_HEAD(&amp;ctx-&gt;janitor_fds);</div><div class='add'>+</div><div class='add'>+    lim.rlim_cur = RLIM_INFINITY;</div><div class='add'>+    lim.rlim_max = RLIM_INFINITY;</div><div class='add'>+    setrlimit(RLIMIT_CORE, &amp;lim);</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+out:</div><div class='ctx'> </div><div class='del'>-        return 0;</div><div class='add'>+    if (ret) {</div><div class='add'>+        if (ctx-&gt;pool) {</div><div class='add'>+            mem_pool_destroy(ctx-&gt;pool-&gt;frame_mem_pool);</div><div class='add'>+            mem_pool_destroy(ctx-&gt;pool-&gt;stack_mem_pool);</div><div class='add'>+        }</div><div class='add'>+        GF_FREE(ctx-&gt;pool);</div><div class='add'>+        mem_pool_destroy(ctx-&gt;stub_mem_pool);</div><div class='add'>+        mem_pool_destroy(ctx-&gt;dict_pool);</div><div class='add'>+        mem_pool_destroy(ctx-&gt;dict_data_pool);</div><div class='add'>+        mem_pool_destroy(ctx-&gt;dict_pair_pool);</div><div class='add'>+        mem_pool_destroy(ctx-&gt;logbuf_pool);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> static int</div><div class='del'>-logging_init (glusterfs_ctx_t *ctx)</div><div class='add'>+logging_init(glusterfs_ctx_t *ctx, const char *progpath)</div><div class='ctx'> {</div><div class='del'>-        cmd_args_t *cmd_args = NULL;</div><div class='del'>-        int         ret = 0;</div><div class='add'>+    cmd_args_t *cmd_args = NULL;</div><div class='add'>+    int ret = 0;</div><div class='ctx'> </div><div class='del'>-        cmd_args = &amp;ctx-&gt;cmd_args;</div><div class='add'>+    cmd_args = &amp;ctx-&gt;cmd_args;</div><div class='ctx'> </div><div class='del'>-        if (cmd_args-&gt;log_file == NULL) {</div><div class='del'>-                ret = set_log_file_path (cmd_args);</div><div class='del'>-                if (ret == -1) {</div><div class='del'>-                        fprintf (stderr, "failed to set the log file path.. "</div><div class='del'>-                                 "exiting\n");</div><div class='del'>-                        return -1;</div><div class='del'>-                }</div><div class='add'>+    if (cmd_args-&gt;log_file == NULL) {</div><div class='add'>+        ret = gf_set_log_file_path(cmd_args, ctx);</div><div class='add'>+        if (ret == -1) {</div><div class='add'>+            fprintf(stderr,</div><div class='add'>+                    "ERROR: failed to set the log file "</div><div class='add'>+                    "path\n");</div><div class='add'>+            return -1;</div><div class='ctx'>         }</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        if (gf_log_init (cmd_args-&gt;log_file) == -1) {</div><div class='del'>-                fprintf (stderr,</div><div class='del'>-                         "failed to open logfile %s.  exiting\n",</div><div class='del'>-                         cmd_args-&gt;log_file);</div><div class='del'>-                return -1;</div><div class='add'>+    if (cmd_args-&gt;log_ident == NULL) {</div><div class='add'>+        ret = gf_set_log_ident(cmd_args);</div><div class='add'>+        if (ret == -1) {</div><div class='add'>+            fprintf(stderr,</div><div class='add'>+                    "ERROR: failed to set the log "</div><div class='add'>+                    "identity\n");</div><div class='add'>+            return -1;</div><div class='ctx'>         }</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        gf_log_set_loglevel (cmd_args-&gt;log_level);</div><div class='add'>+    /* finish log set parameters before init */</div><div class='add'>+    gf_log_set_loglevel(ctx, cmd_args-&gt;log_level);</div><div class='ctx'> </div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='add'>+    gf_log_set_localtime(cmd_args-&gt;localtime_logging);</div><div class='ctx'> </div><div class='add'>+    gf_log_set_logger(cmd_args-&gt;logger);</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-parse_cmdline (int argc, char *argv[], glusterfs_ctx_t *ctx)</div><div class='del'>-{</div><div class='del'>-        int               process_mode = 0;</div><div class='del'>-        int               ret = 0;</div><div class='del'>-        struct stat       stbuf = {0, };</div><div class='del'>-        struct tm        *tm = NULL;</div><div class='del'>-        time_t            utime;</div><div class='del'>-        char              timestr[256];</div><div class='del'>-        char              tmp_logfile[1024] = { 0 };</div><div class='del'>-        char              *tmp_logfile_dyn = NULL;</div><div class='del'>-        char              *tmp_logfilebase = NULL;</div><div class='del'>-        cmd_args_t        *cmd_args = NULL;</div><div class='del'>-</div><div class='del'>-        cmd_args = &amp;ctx-&gt;cmd_args;</div><div class='del'>-</div><div class='del'>-        argp_parse (&amp;argp, argc, argv, ARGP_IN_ORDER, NULL, cmd_args);</div><div class='del'>-</div><div class='del'>-        if (ENABLE_DEBUG_MODE == cmd_args-&gt;debug_mode) {</div><div class='del'>-                cmd_args-&gt;log_level = GF_LOG_DEBUG;</div><div class='del'>-                cmd_args-&gt;log_file = "/dev/stderr";</div><div class='del'>-                cmd_args-&gt;no_daemon_mode = ENABLE_NO_DAEMON_MODE;</div><div class='del'>-        }</div><div class='add'>+    gf_log_set_logformat(cmd_args-&gt;log_format);</div><div class='ctx'> </div><div class='del'>-        process_mode = gf_get_process_mode (argv[0]);</div><div class='add'>+    gf_log_set_log_buf_size(cmd_args-&gt;log_buf_size);</div><div class='ctx'> </div><div class='del'>-        if ((cmd_args-&gt;volfile_server == NULL)</div><div class='del'>-            &amp;&amp; (cmd_args-&gt;volfile == NULL)) {</div><div class='del'>-                if (process_mode == GF_SERVER_PROCESS)</div><div class='del'>-                        cmd_args-&gt;volfile = gf_strdup (DEFAULT_SERVER_VOLFILE);</div><div class='del'>-                else if (process_mode == GF_GLUSTERD_PROCESS)</div><div class='del'>-                        cmd_args-&gt;volfile = gf_strdup (DEFAULT_GLUSTERD_VOLFILE);</div><div class='del'>-                else</div><div class='del'>-                        cmd_args-&gt;volfile = gf_strdup (DEFAULT_CLIENT_VOLFILE);</div><div class='del'>-        }</div><div class='add'>+    gf_log_set_log_flush_timeout(cmd_args-&gt;log_flush_timeout);</div><div class='ctx'> </div><div class='del'>-        if (cmd_args-&gt;run_id) {</div><div class='del'>-                ret = sys_lstat (cmd_args-&gt;log_file, &amp;stbuf);</div><div class='del'>-                /* If its /dev/null, or /dev/stdout, /dev/stderr,</div><div class='del'>-                 * let it use the same, no need to alter</div><div class='del'>-                 */</div><div class='del'>-                if (((ret == 0) &amp;&amp;</div><div class='del'>-                     (S_ISREG (stbuf.st_mode) || S_ISLNK (stbuf.st_mode))) ||</div><div class='del'>-                    (ret == -1)) {</div><div class='del'>-                        /* Have seperate logfile per run */</div><div class='del'>-                        tm = localtime (&amp;utime);</div><div class='del'>-                        strftime (timestr, 256, "%Y%m%d.%H%M%S", tm);</div><div class='del'>-                        sprintf (tmp_logfile, "%s.%s.%d",</div><div class='del'>-                                 cmd_args-&gt;log_file, timestr, getpid ());</div><div class='del'>-</div><div class='del'>-                        /* Create symlink to actual log file */</div><div class='del'>-                        sys_unlink (cmd_args-&gt;log_file);</div><div class='del'>-</div><div class='del'>-                        tmp_logfile_dyn = gf_strdup (tmp_logfile);</div><div class='del'>-                        tmp_logfilebase = basename (tmp_logfile_dyn);</div><div class='del'>-                        ret = sys_symlink (tmp_logfilebase,</div><div class='del'>-                                           cmd_args-&gt;log_file);</div><div class='del'>-                        if (ret == -1) {</div><div class='del'>-                                fprintf (stderr, "symlink of logfile failed");</div><div class='del'>-                        } else {</div><div class='del'>-                                GF_FREE (cmd_args-&gt;log_file);</div><div class='del'>-                                cmd_args-&gt;log_file = gf_strdup (tmp_logfile);</div><div class='del'>-                        }</div><div class='add'>+    if (gf_log_init(ctx, cmd_args-&gt;log_file, cmd_args-&gt;log_ident) == -1) {</div><div class='add'>+        fprintf(stderr, "ERROR: failed to open logfile %s\n",</div><div class='add'>+                cmd_args-&gt;log_file);</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-                        GF_FREE (tmp_logfile_dyn);</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='add'>+    /* At this point, all the logging related parameters are initialised</div><div class='add'>+     * except for the log flush timer, which will be injected post fork(2)</div><div class='add'>+     * in daemonize() . During this time, any log message that is logged</div><div class='add'>+     * will be kept buffered. And if the list that holds these messages</div><div class='add'>+     * overflows, then the same lru policy is used to drive out the least</div><div class='add'>+     * recently used message and displace it with the message just logged.</div><div class='add'>+     */</div><div class='ctx'> </div><div class='del'>-        return ret;</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+void</div><div class='add'>+gf_check_and_set_mem_acct(int argc, char *argv[])</div><div class='add'>+{</div><div class='add'>+    int i = 0;</div><div class='ctx'> </div><div class='add'>+    for (i = 0; i &lt; argc; i++) {</div><div class='add'>+        if (strcmp(argv[i], "--no-mem-accounting") == 0) {</div><div class='add'>+            gf_global_mem_acct_enable_set(0);</div><div class='add'>+            break;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/**</div><div class='add'>+ * print_exports_file - Print out &amp; verify the syntax</div><div class='add'>+ *                      of the exports file specified</div><div class='add'>+ *                      in the parameter.</div><div class='add'>+ *</div><div class='add'>+ * @exports_file : Path of the exports file to print &amp; verify</div><div class='add'>+ *</div><div class='add'>+ * @return : success: 0 when successfully parsed</div><div class='add'>+ *           failure: 1 when failed to parse one or more lines</div><div class='add'>+ *                   -1 when other critical errors (dlopen () etc)</div><div class='add'>+ * Critical errors are treated differently than parse errors. Critical</div><div class='add'>+ * errors terminate the program immediately here and print out different</div><div class='add'>+ * error messages. Hence there are different return values.</div><div class='add'>+ */</div><div class='ctx'> int</div><div class='del'>-glusterfs_pidfile_setup (glusterfs_ctx_t *ctx)</div><div class='add'>+print_exports_file(const char *exports_file)</div><div class='ctx'> {</div><div class='del'>-        cmd_args_t  *cmd_args = NULL;</div><div class='del'>-        int          ret = 0;</div><div class='del'>-        FILE        *pidfp = NULL;</div><div class='add'>+    void *libhandle = NULL;</div><div class='add'>+    char *libpathfull = NULL;</div><div class='add'>+    struct exports_file *file = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    int (*exp_file_parse)(const char *filepath, struct exports_file **expfile,</div><div class='add'>+                          struct mount3_state *ms) = NULL;</div><div class='add'>+    void (*exp_file_print)(const struct exports_file *file) = NULL;</div><div class='add'>+    void (*exp_file_deinit)(struct exports_file * ptr) = NULL;</div><div class='add'>+</div><div class='add'>+    /* XLATORDIR passed through a -D flag to GCC */</div><div class='add'>+    ret = gf_asprintf(&amp;libpathfull, "%s/%s/server.so", XLATORDIR, "nfs");</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        gf_log("glusterfs", GF_LOG_CRITICAL, "asprintf () failed.");</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Load up the library */</div><div class='add'>+    libhandle = dlopen(libpathfull, RTLD_NOW);</div><div class='add'>+    if (!libhandle) {</div><div class='add'>+        gf_log("glusterfs", GF_LOG_CRITICAL,</div><div class='add'>+               "Error loading NFS server library : "</div><div class='add'>+               "%s\n",</div><div class='add'>+               dlerror());</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Load up the function */</div><div class='add'>+    exp_file_parse = dlsym(libhandle, "exp_file_parse");</div><div class='add'>+    if (!exp_file_parse) {</div><div class='add'>+        gf_log("glusterfs", GF_LOG_CRITICAL,</div><div class='add'>+               "Error finding function exp_file_parse "</div><div class='add'>+               "in symbol.");</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Parse the file */</div><div class='add'>+    ret = exp_file_parse(exports_file, &amp;file, NULL);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        ret = 1; /* This means we failed to parse */</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Load up the function */</div><div class='add'>+    exp_file_print = dlsym(libhandle, "exp_file_print");</div><div class='add'>+    if (!exp_file_print) {</div><div class='add'>+        gf_log("glusterfs", GF_LOG_CRITICAL,</div><div class='add'>+               "Error finding function exp_file_print in symbol.");</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Print it out to screen */</div><div class='add'>+    exp_file_print(file);</div><div class='add'>+</div><div class='add'>+    /* Load up the function */</div><div class='add'>+    exp_file_deinit = dlsym(libhandle, "exp_file_deinit");</div><div class='add'>+    if (!exp_file_deinit) {</div><div class='add'>+        gf_log("glusterfs", GF_LOG_CRITICAL,</div><div class='add'>+               "Error finding function exp_file_deinit in lib.");</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Free the file */</div><div class='add'>+    exp_file_deinit(file);</div><div class='ctx'> </div><div class='del'>-        cmd_args = &amp;ctx-&gt;cmd_args;</div><div class='add'>+out:</div><div class='add'>+    if (libhandle)</div><div class='add'>+        dlclose(libhandle);</div><div class='add'>+    GF_FREE(libpathfull);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        if (!cmd_args-&gt;pid_file)</div><div class='del'>-                return 0;</div><div class='add'>+/**</div><div class='add'>+ * print_netgroups_file - Print out &amp; verify the syntax</div><div class='add'>+ *                        of the netgroups file specified</div><div class='add'>+ *                        in the parameter.</div><div class='add'>+ *</div><div class='add'>+ * @netgroups_file : Path of the netgroups file to print &amp; verify</div><div class='add'>+ * @return : success: 0 when successfully parsed</div><div class='add'>+ *           failure: 1 when failed to parse one more more lines</div><div class='add'>+ *                   -1 when other critical errors (dlopen () etc)</div><div class='add'>+ *</div><div class='add'>+ * We have multiple returns here because for critical errors, we abort</div><div class='add'>+ * operations immediately and exit. For example, if we can't load the</div><div class='add'>+ * NFS server library, then we have a real bad problem so we don't continue.</div><div class='add'>+ * Or if we cannot allocate anymore memory, we don't want to continue. Also,</div><div class='add'>+ * we want to print out a different error messages based on the ret value.</div><div class='add'>+ */</div><div class='add'>+int</div><div class='add'>+print_netgroups_file(const char *netgroups_file)</div><div class='add'>+{</div><div class='add'>+    void *libhandle = NULL;</div><div class='add'>+    char *libpathfull = NULL;</div><div class='add'>+    struct netgroups_file *file = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    struct netgroups_file *(*ng_file_parse)(const char *file_path) = NULL;</div><div class='add'>+    void (*ng_file_print)(const struct netgroups_file *file) = NULL;</div><div class='add'>+    void (*ng_file_deinit)(struct netgroups_file * ptr) = NULL;</div><div class='add'>+</div><div class='add'>+    /* XLATORDIR passed through a -D flag to GCC */</div><div class='add'>+    ret = gf_asprintf(&amp;libpathfull, "%s/%s/server.so", XLATORDIR, "nfs");</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        gf_log("glusterfs", GF_LOG_CRITICAL, "asprintf () failed.");</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    /* Load up the library */</div><div class='add'>+    libhandle = dlopen(libpathfull, RTLD_NOW);</div><div class='add'>+    if (!libhandle) {</div><div class='add'>+        gf_log("glusterfs", GF_LOG_CRITICAL,</div><div class='add'>+               "Error loading NFS server library : %s\n", dlerror());</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Load up the function */</div><div class='add'>+    ng_file_parse = dlsym(libhandle, "ng_file_parse");</div><div class='add'>+    if (!ng_file_parse) {</div><div class='add'>+        gf_log("glusterfs", GF_LOG_CRITICAL,</div><div class='add'>+               "Error finding function ng_file_parse in symbol.");</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Parse the file */</div><div class='add'>+    file = ng_file_parse(netgroups_file);</div><div class='add'>+    if (!file) {</div><div class='add'>+        ret = 1; /* This means we failed to parse */</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Load up the function */</div><div class='add'>+    ng_file_print = dlsym(libhandle, "ng_file_print");</div><div class='add'>+    if (!ng_file_print) {</div><div class='add'>+        gf_log("glusterfs", GF_LOG_CRITICAL,</div><div class='add'>+               "Error finding function ng_file_print in symbol.");</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Print it out to screen */</div><div class='add'>+    ng_file_print(file);</div><div class='add'>+</div><div class='add'>+    /* Load up the function */</div><div class='add'>+    ng_file_deinit = dlsym(libhandle, "ng_file_deinit");</div><div class='add'>+    if (!ng_file_deinit) {</div><div class='add'>+        gf_log("glusterfs", GF_LOG_CRITICAL,</div><div class='add'>+               "Error finding function ng_file_deinit in lib.");</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Free the file */</div><div class='add'>+    ng_file_deinit(file);</div><div class='ctx'> </div><div class='del'>-        pidfp = fopen (cmd_args-&gt;pid_file, "a+");</div><div class='del'>-        if (!pidfp) {</div><div class='del'>-                gf_log ("glusterfsd", GF_LOG_ERROR,</div><div class='del'>-                        "pidfile %s error (%s)",</div><div class='del'>-                        cmd_args-&gt;pid_file, strerror (errno));</div><div class='del'>-                return -1;</div><div class='del'>-        }</div><div class='add'>+out:</div><div class='add'>+    if (libhandle)</div><div class='add'>+        dlclose(libhandle);</div><div class='add'>+    GF_FREE(libpathfull);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+parse_cmdline(int argc, char *argv[], glusterfs_ctx_t *ctx)</div><div class='add'>+{</div><div class='add'>+    int process_mode = 0;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    struct stat stbuf = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    char timestr[GF_TIMESTR_SIZE];</div><div class='add'>+    char tmp_logfile[1024] = {0};</div><div class='add'>+    char *tmp_logfile_dyn = NULL;</div><div class='add'>+    char *tmp_logfilebase = NULL;</div><div class='add'>+    cmd_args_t *cmd_args = NULL;</div><div class='add'>+    int len = 0;</div><div class='add'>+    char *thin_volfileid = NULL;</div><div class='add'>+</div><div class='add'>+    cmd_args = &amp;ctx-&gt;cmd_args;</div><div class='add'>+</div><div class='add'>+    /* Do this before argp_parse so it can be overridden. */</div><div class='add'>+    if (sys_access(SECURE_ACCESS_FILE, F_OK) == 0) {</div><div class='add'>+        cmd_args-&gt;secure_mgmt = 1;</div><div class='add'>+        ctx-&gt;ssl_cert_depth = glusterfs_read_secure_access_file();</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Need to set lru_limit to below 0 to indicate there was nothing</div><div class='add'>+       specified. This is needed as 0 is a valid option, and may not be</div><div class='add'>+       default value. */</div><div class='add'>+    cmd_args-&gt;lru_limit = -1;</div><div class='add'>+</div><div class='add'>+    argp_parse(&amp;argp, argc, argv, ARGP_IN_ORDER, NULL, cmd_args);</div><div class='add'>+</div><div class='add'>+    if (cmd_args-&gt;print_xlatordir || cmd_args-&gt;print_statedumpdir ||</div><div class='add'>+        cmd_args-&gt;print_logdir || cmd_args-&gt;print_libexecdir) {</div><div class='add'>+        /* Just print, nothing else to do */</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (cmd_args-&gt;print_netgroups) {</div><div class='add'>+        /* When this option is set we don't want to do anything else</div><div class='add'>+         * except for printing &amp; verifying the netgroups file.</div><div class='add'>+         */</div><div class='add'>+        ret = 0;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        ret = lockf (fileno (pidfp), F_TLOCK, 0);</div><div class='add'>+    if (cmd_args-&gt;print_exports) {</div><div class='add'>+        /* When this option is set we don't want to do anything else</div><div class='add'>+         * except for printing &amp; verifying the exports file.</div><div class='add'>+         */</div><div class='add'>+        ret = 0;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ctx-&gt;secure_mgmt = cmd_args-&gt;secure_mgmt;</div><div class='add'>+</div><div class='add'>+    if (ENABLE_DEBUG_MODE == cmd_args-&gt;debug_mode) {</div><div class='add'>+        cmd_args-&gt;log_level = GF_LOG_DEBUG;</div><div class='add'>+        cmd_args-&gt;log_file = gf_strdup("/dev/stderr");</div><div class='add'>+        cmd_args-&gt;no_daemon_mode = ENABLE_NO_DAEMON_MODE;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    process_mode = gf_get_process_mode(argv[0]);</div><div class='add'>+    ctx-&gt;process_mode = process_mode;</div><div class='add'>+</div><div class='add'>+    if (cmd_args-&gt;process_name) {</div><div class='add'>+        ctx-&gt;cmd_args.process_name = cmd_args-&gt;process_name;</div><div class='add'>+    }</div><div class='add'>+    /* Make sure after the parsing cli, if '--volfile-server' option is</div><div class='add'>+       given, then '--volfile-id' is mandatory */</div><div class='add'>+    if (cmd_args-&gt;volfile_server &amp;&amp; !cmd_args-&gt;volfile_id) {</div><div class='add'>+        gf_smsg("glusterfs", GF_LOG_CRITICAL, 0, glusterfsd_msg_15, NULL);</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if ((cmd_args-&gt;volfile_server == NULL) &amp;&amp; (cmd_args-&gt;volfile == NULL)) {</div><div class='add'>+        if (process_mode == GF_SERVER_PROCESS)</div><div class='add'>+            cmd_args-&gt;volfile = gf_strdup(DEFAULT_SERVER_VOLFILE);</div><div class='add'>+        else if (process_mode == GF_GLUSTERD_PROCESS)</div><div class='add'>+            cmd_args-&gt;volfile = gf_strdup(DEFAULT_GLUSTERD_VOLFILE);</div><div class='add'>+        else</div><div class='add'>+            cmd_args-&gt;volfile = gf_strdup(DEFAULT_CLIENT_VOLFILE);</div><div class='add'>+</div><div class='add'>+        /* Check if the volfile exists, if not give usage output</div><div class='add'>+           and exit */</div><div class='add'>+        ret = sys_stat(cmd_args-&gt;volfile, &amp;stbuf);</div><div class='ctx'>         if (ret) {</div><div class='del'>-                gf_log ("glusterfsd", GF_LOG_ERROR,</div><div class='del'>-                        "pidfile %s lock error (%s)",</div><div class='del'>-                        cmd_args-&gt;pid_file, strerror (errno));</div><div class='del'>-                return ret;</div><div class='add'>+            gf_smsg("glusterfs", GF_LOG_CRITICAL, errno, glusterfsd_msg_16,</div><div class='add'>+                    NULL);</div><div class='add'>+            /* argp_usage (argp.) */</div><div class='add'>+            fprintf(stderr, "USAGE: %s [options] [mountpoint]\n", argv[0]);</div><div class='add'>+            goto out;</div><div class='ctx'>         }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (cmd_args-&gt;thin_client) {</div><div class='add'>+        len = strlen(cmd_args-&gt;volfile_id) + SLEN("gfproxy-client/");</div><div class='add'>+        thin_volfileid = GF_MALLOC(len + 1, gf_common_mt_char);</div><div class='add'>+        snprintf(thin_volfileid, len + 1, "gfproxy-client/%s",</div><div class='add'>+                 cmd_args-&gt;volfile_id);</div><div class='add'>+        GF_FREE(cmd_args-&gt;volfile_id);</div><div class='add'>+        cmd_args-&gt;volfile_id = thin_volfileid;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (cmd_args-&gt;run_id) {</div><div class='add'>+        ret = sys_lstat(cmd_args-&gt;log_file, &amp;stbuf);</div><div class='add'>+        /* If its /dev/null, or /dev/stdout, /dev/stderr,</div><div class='add'>+         * let it use the same, no need to alter</div><div class='add'>+         */</div><div class='add'>+        if (((ret == 0) &amp;&amp;</div><div class='add'>+             (S_ISREG(stbuf.st_mode) || S_ISLNK(stbuf.st_mode))) ||</div><div class='add'>+            (ret == -1)) {</div><div class='add'>+            /* Have separate logfile per run. */</div><div class='add'>+            gf_time_fmt(timestr, sizeof timestr, gf_time(), gf_timefmt_FT);</div><div class='add'>+            sprintf(tmp_logfile, "%s.%s.%d", cmd_args-&gt;log_file, timestr,</div><div class='add'>+                    getpid());</div><div class='add'>+</div><div class='add'>+            /* Create symlink to actual log file */</div><div class='add'>+            sys_unlink(cmd_args-&gt;log_file);</div><div class='add'>+</div><div class='add'>+            tmp_logfile_dyn = gf_strdup(tmp_logfile);</div><div class='add'>+            tmp_logfilebase = basename(tmp_logfile_dyn);</div><div class='add'>+            ret = sys_symlink(tmp_logfilebase, cmd_args-&gt;log_file);</div><div class='add'>+            if (ret == -1) {</div><div class='add'>+                fprintf(stderr, "ERROR: symlink of logfile failed\n");</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='ctx'> </div><div class='del'>-        gf_log ("glusterfsd", GF_LOG_TRACE,</div><div class='del'>-                "pidfile %s lock acquired",</div><div class='del'>-                cmd_args-&gt;pid_file);</div><div class='add'>+            GF_FREE(cmd_args-&gt;log_file);</div><div class='add'>+            cmd_args-&gt;log_file = gf_strdup(tmp_logfile);</div><div class='ctx'> </div><div class='del'>-        ret = lockf (fileno (pidfp), F_ULOCK, 0);</div><div class='del'>-        if (ret) {</div><div class='del'>-                gf_log ("glusterfsd", GF_LOG_ERROR,</div><div class='del'>-                        "pidfile %s unlock error (%s)",</div><div class='del'>-                        cmd_args-&gt;pid_file, strerror (errno));</div><div class='del'>-                return ret;</div><div class='add'>+            GF_FREE(tmp_logfile_dyn);</div><div class='ctx'>         }</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        ctx-&gt;pidfp = pidfp;</div><div class='add'>+    /*</div><div class='add'>+       This option was made obsolete but parsing it for backward</div><div class='add'>+       compatibility with third party applications</div><div class='add'>+     */</div><div class='add'>+    if (cmd_args-&gt;max_connect_attempts) {</div><div class='add'>+        gf_smsg("glusterfs", GF_LOG_WARNING, 0, glusterfsd_msg_33, NULL);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='add'>+#ifdef GF_DARWIN_HOST_OS</div><div class='add'>+    if (cmd_args-&gt;mount_point)</div><div class='add'>+        cmd_args-&gt;mac_compat = GF_OPTION_DEFERRED;</div><div class='add'>+#endif</div><div class='ctx'> </div><div class='add'>+    ret = 0;</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-glusterfs_pidfile_cleanup (glusterfs_ctx_t *ctx)</div><div class='add'>+glusterfs_pidfile_setup(glusterfs_ctx_t *ctx)</div><div class='ctx'> {</div><div class='del'>-        cmd_args_t  *cmd_args = NULL;</div><div class='add'>+    cmd_args_t *cmd_args = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    FILE *pidfp = NULL;</div><div class='ctx'> </div><div class='del'>-        cmd_args = &amp;ctx-&gt;cmd_args;</div><div class='add'>+    cmd_args = &amp;ctx-&gt;cmd_args;</div><div class='ctx'> </div><div class='del'>-        if (!ctx-&gt;pidfp)</div><div class='del'>-                return 0;</div><div class='add'>+    if (!cmd_args-&gt;pid_file)</div><div class='add'>+        return 0;</div><div class='ctx'> </div><div class='del'>-        gf_log ("glusterfsd", GF_LOG_TRACE,</div><div class='del'>-                "pidfile %s unlocking",</div><div class='del'>-                cmd_args-&gt;pid_file);</div><div class='add'>+    pidfp = fopen(cmd_args-&gt;pid_file, "a+");</div><div class='add'>+    if (!pidfp) {</div><div class='add'>+        gf_smsg("glusterfsd", GF_LOG_ERROR, errno, glusterfsd_msg_17,</div><div class='add'>+                "pidfile=%s", cmd_args-&gt;pid_file, NULL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        lockf (fileno (ctx-&gt;pidfp), F_ULOCK, 0);</div><div class='del'>-        fclose (ctx-&gt;pidfp);</div><div class='del'>-        ctx-&gt;pidfp = NULL;</div><div class='add'>+    ctx-&gt;pidfp = pidfp;</div><div class='ctx'> </div><div class='del'>-        if (ctx-&gt;cmd_args.pid_file) {</div><div class='del'>-                unlink (ctx-&gt;cmd_args.pid_file);</div><div class='del'>-                ctx-&gt;cmd_args.pid_file = NULL;</div><div class='del'>-        }</div><div class='add'>+    ret = 0;</div><div class='add'>+out:</div><div class='ctx'> </div><div class='del'>-        return 0;</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-glusterfs_pidfile_update (glusterfs_ctx_t *ctx)</div><div class='add'>+glusterfs_pidfile_cleanup(glusterfs_ctx_t *ctx)</div><div class='ctx'> {</div><div class='del'>-        cmd_args_t  *cmd_args = NULL;</div><div class='del'>-        int          ret = 0;</div><div class='del'>-        FILE        *pidfp = NULL;</div><div class='add'>+    cmd_args_t *cmd_args = NULL;</div><div class='ctx'> </div><div class='del'>-        cmd_args = &amp;ctx-&gt;cmd_args;</div><div class='add'>+    cmd_args = &amp;ctx-&gt;cmd_args;</div><div class='ctx'> </div><div class='del'>-        pidfp = ctx-&gt;pidfp;</div><div class='del'>-        if (!pidfp)</div><div class='del'>-                return 0;</div><div class='add'>+    if (!ctx-&gt;pidfp)</div><div class='add'>+        return 0;</div><div class='ctx'> </div><div class='del'>-        ret = lockf (fileno (pidfp), F_TLOCK, 0);</div><div class='del'>-        if (ret) {</div><div class='del'>-                gf_log ("glusterfsd", GF_LOG_ERROR,</div><div class='del'>-                        "pidfile %s lock failed",</div><div class='del'>-                        cmd_args-&gt;pid_file);</div><div class='del'>-                return ret;</div><div class='del'>-        }</div><div class='add'>+    gf_msg_trace("glusterfsd", 0, "pidfile %s cleanup", cmd_args-&gt;pid_file);</div><div class='ctx'> </div><div class='del'>-        ret = ftruncate (fileno (pidfp), 0);</div><div class='del'>-        if (ret) {</div><div class='del'>-                gf_log ("glusterfsd", GF_LOG_ERROR,</div><div class='del'>-                        "pidfile %s truncation failed",</div><div class='del'>-                        cmd_args-&gt;pid_file);</div><div class='del'>-                return ret;</div><div class='del'>-        }</div><div class='add'>+    if (ctx-&gt;cmd_args.pid_file) {</div><div class='add'>+        GF_FREE(ctx-&gt;cmd_args.pid_file);</div><div class='add'>+        ctx-&gt;cmd_args.pid_file = NULL;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        ret = fprintf (pidfp, "%d\n", getpid ());</div><div class='del'>-        if (ret &lt;= 0) {</div><div class='del'>-                gf_log ("glusterfsd", GF_LOG_ERROR,</div><div class='del'>-                        "pidfile %s write failed",</div><div class='del'>-                        cmd_args-&gt;pid_file);</div><div class='del'>-                return ret;</div><div class='del'>-        }</div><div class='add'>+    lockf(fileno(ctx-&gt;pidfp), F_ULOCK, 0);</div><div class='add'>+    fclose(ctx-&gt;pidfp);</div><div class='add'>+    ctx-&gt;pidfp = NULL;</div><div class='ctx'> </div><div class='del'>-        ret = fflush (pidfp);</div><div class='del'>-        if (ret) {</div><div class='del'>-                gf_log ("glusterfsd", GF_LOG_ERROR,</div><div class='del'>-                        "pidfile %s write failed",</div><div class='del'>-                        cmd_args-&gt;pid_file);</div><div class='del'>-                return ret;</div><div class='del'>-        }</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        gf_log ("glusterfsd", GF_LOG_DEBUG,</div><div class='del'>-                "pidfile %s updated with pid %d",</div><div class='del'>-                cmd_args-&gt;pid_file, getpid ());</div><div class='add'>+int</div><div class='add'>+glusterfs_pidfile_update(glusterfs_ctx_t *ctx, pid_t pid)</div><div class='add'>+{</div><div class='add'>+    cmd_args_t *cmd_args = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    FILE *pidfp = NULL;</div><div class='ctx'> </div><div class='add'>+    cmd_args = &amp;ctx-&gt;cmd_args;</div><div class='add'>+</div><div class='add'>+    pidfp = ctx-&gt;pidfp;</div><div class='add'>+    if (!pidfp)</div><div class='ctx'>         return 0;</div><div class='del'>-}</div><div class='ctx'> </div><div class='add'>+    ret = lockf(fileno(pidfp), F_TLOCK, 0);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_smsg("glusterfsd", GF_LOG_ERROR, errno, glusterfsd_msg_18,</div><div class='add'>+                "pidfile=%s", cmd_args-&gt;pid_file, NULL);</div><div class='add'>+        return ret;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-void *</div><div class='del'>-glusterfs_sigwaiter (void *arg)</div><div class='del'>-{</div><div class='del'>-        sigset_t  set;</div><div class='del'>-        int       ret = 0;</div><div class='del'>-        int       sig = 0;</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-        sigaddset (&amp;set, SIGINT);   /* cleanup_and_exit */</div><div class='del'>-        sigaddset (&amp;set, SIGTERM);  /* cleanup_and_exit */</div><div class='del'>-        sigaddset (&amp;set, SIGHUP);   /* reincarnate */</div><div class='del'>-        sigaddset (&amp;set, SIGUSR1);  /* gf_proc_dump_info */</div><div class='del'>-        sigaddset (&amp;set, SIGUSR2);  /* gf_latency_toggle */</div><div class='del'>-</div><div class='del'>-        for (;;) {</div><div class='del'>-                ret = sigwait (&amp;set, &amp;sig);</div><div class='del'>-                if (ret) {</div><div class='del'>-                        gf_log ("sigwaiter", GF_LOG_ERROR,</div><div class='del'>-                                "sigwait returned error (%s)",</div><div class='del'>-                                strerror (ret));</div><div class='del'>-                        continue;</div><div class='del'>-                }</div><div class='add'>+    ret = sys_ftruncate(fileno(pidfp), 0);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_smsg("glusterfsd", GF_LOG_ERROR, errno, glusterfsd_msg_20,</div><div class='add'>+                "pidfile=%s", cmd_args-&gt;pid_file, NULL);</div><div class='add'>+        return ret;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-                gf_log ("sigwaiter", GF_LOG_DEBUG,</div><div class='del'>-                        "received signal %d", sig);</div><div class='del'>-</div><div class='del'>-                switch (sig) {</div><div class='del'>-                case SIGINT:</div><div class='del'>-                case SIGTERM:</div><div class='del'>-                        cleanup_and_exit (sig);</div><div class='del'>-                        break;</div><div class='del'>-                case SIGHUP:</div><div class='del'>-                        reincarnate (sig);</div><div class='del'>-                        break;</div><div class='del'>-                case SIGUSR1:</div><div class='del'>-                        gf_proc_dump_info (sig);</div><div class='del'>-                        break;</div><div class='del'>-                case SIGUSR2:</div><div class='del'>-                        gf_latency_toggle (sig);</div><div class='del'>-                        break;</div><div class='del'>-                default:</div><div class='del'>-                        gf_log ("sigwaiter", GF_LOG_ERROR,</div><div class='del'>-                                "unhandled signal: %d", sig);</div><div class='del'>-                        break;</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='add'>+    ret = fprintf(pidfp, "%d\n", pid);</div><div class='add'>+    if (ret &lt;= 0) {</div><div class='add'>+        gf_smsg("glusterfsd", GF_LOG_ERROR, errno, glusterfsd_msg_21,</div><div class='add'>+                "pidfile=%s", cmd_args-&gt;pid_file, NULL);</div><div class='add'>+        return ret;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        return NULL;</div><div class='del'>-}</div><div class='add'>+    ret = fflush(pidfp);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_smsg("glusterfsd", GF_LOG_ERROR, errno, glusterfsd_msg_21,</div><div class='add'>+                "pidfile=%s", cmd_args-&gt;pid_file, NULL);</div><div class='add'>+        return ret;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='add'>+    gf_msg_debug("glusterfsd", 0, "pidfile %s updated with pid %d",</div><div class='add'>+                 cmd_args-&gt;pid_file, pid);</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-glusterfs_signals_setup (glusterfs_ctx_t *ctx)</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void *</div><div class='add'>+glusterfs_sigwaiter(void *arg)</div><div class='ctx'> {</div><div class='del'>-        sigset_t  set;</div><div class='del'>-        int       ret = 0;</div><div class='del'>-</div><div class='del'>-        sigemptyset (&amp;set);</div><div class='del'>-</div><div class='del'>-        /* common setting for all threads */</div><div class='del'>-        signal (SIGSEGV, gf_print_trace);</div><div class='del'>-        signal (SIGABRT, gf_print_trace);</div><div class='del'>-        signal (SIGILL, gf_print_trace);</div><div class='del'>-        signal (SIGTRAP, gf_print_trace);</div><div class='del'>-        signal (SIGFPE, gf_print_trace);</div><div class='del'>-        signal (SIGBUS, gf_print_trace);</div><div class='del'>-        signal (SIGINT, cleanup_and_exit);</div><div class='del'>-        signal (SIGPIPE, SIG_IGN);</div><div class='del'>-</div><div class='del'>-        /* block these signals from non-sigwaiter threads */</div><div class='del'>-        sigaddset (&amp;set, SIGTERM);  /* cleanup_and_exit */</div><div class='del'>-        sigaddset (&amp;set, SIGHUP);   /* reincarnate */</div><div class='del'>-        sigaddset (&amp;set, SIGUSR1);  /* gf_proc_dump_info */</div><div class='del'>-        sigaddset (&amp;set, SIGUSR2);  /* gf_latency_toggle */</div><div class='del'>-</div><div class='del'>-        ret = pthread_sigmask (SIG_BLOCK, &amp;set, NULL);</div><div class='add'>+    sigset_t set;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    int sig = 0;</div><div class='add'>+    char *file = NULL;</div><div class='add'>+</div><div class='add'>+    sigemptyset(&amp;set);</div><div class='add'>+    sigaddset(&amp;set, SIGINT);  /* cleanup_and_exit */</div><div class='add'>+    sigaddset(&amp;set, SIGTERM); /* cleanup_and_exit */</div><div class='add'>+    sigaddset(&amp;set, SIGHUP);  /* reincarnate */</div><div class='add'>+    sigaddset(&amp;set, SIGUSR1); /* gf_proc_dump_info */</div><div class='add'>+    sigaddset(&amp;set, SIGUSR2);</div><div class='add'>+</div><div class='add'>+    for (;;) {</div><div class='add'>+        ret = sigwait(&amp;set, &amp;sig);</div><div class='ctx'>         if (ret)</div><div class='del'>-                return ret;</div><div class='add'>+            continue;</div><div class='ctx'> </div><div class='del'>-        ret = pthread_create (&amp;ctx-&gt;sigwaiter, NULL, glusterfs_sigwaiter,</div><div class='del'>-                              (void *) &amp;set);</div><div class='del'>-        if (ret) {</div><div class='del'>-                /*</div><div class='del'>-                  TODO:</div><div class='del'>-                  fallback to signals getting handled by other threads.</div><div class='del'>-                  setup the signal handlers</div><div class='del'>-                */</div><div class='del'>-                return ret;</div><div class='add'>+        switch (sig) {</div><div class='add'>+            case SIGINT:</div><div class='add'>+            case SIGTERM:</div><div class='add'>+                cleanup_and_exit(sig);</div><div class='add'>+                break;</div><div class='add'>+            case SIGHUP:</div><div class='add'>+                reincarnate(sig);</div><div class='add'>+                break;</div><div class='add'>+            case SIGUSR1:</div><div class='add'>+                gf_proc_dump_info(sig, glusterfsd_ctx);</div><div class='add'>+                break;</div><div class='add'>+            case SIGUSR2:</div><div class='add'>+                file = gf_monitor_metrics(glusterfsd_ctx);</div><div class='add'>+</div><div class='add'>+                /* Nothing needed to be done here */</div><div class='add'>+                GF_FREE(file);</div><div class='add'>+</div><div class='add'>+                break;</div><div class='add'>+            default:</div><div class='add'>+</div><div class='add'>+                break;</div><div class='ctx'>         }</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        return ret;</div><div class='add'>+    return NULL;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+void</div><div class='add'>+glusterfsd_print_trace(int signum)</div><div class='add'>+{</div><div class='add'>+    gf_print_trace(signum, glusterfsd_ctx);</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-daemonize (glusterfs_ctx_t *ctx)</div><div class='add'>+glusterfs_signals_setup(glusterfs_ctx_t *ctx)</div><div class='ctx'> {</div><div class='del'>-        int            ret = 0;</div><div class='del'>-        cmd_args_t    *cmd_args = NULL;</div><div class='add'>+    sigset_t set;</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    sigemptyset(&amp;set);</div><div class='add'>+</div><div class='add'>+    /* common setting for all threads */</div><div class='add'>+    signal(SIGSEGV, glusterfsd_print_trace);</div><div class='add'>+    signal(SIGABRT, glusterfsd_print_trace);</div><div class='add'>+    signal(SIGILL, glusterfsd_print_trace);</div><div class='add'>+    signal(SIGTRAP, glusterfsd_print_trace);</div><div class='add'>+    signal(SIGFPE, glusterfsd_print_trace);</div><div class='add'>+    signal(SIGBUS, glusterfsd_print_trace);</div><div class='add'>+    signal(SIGINT, cleanup_and_exit);</div><div class='add'>+    signal(SIGPIPE, SIG_IGN);</div><div class='add'>+</div><div class='add'>+    /* block these signals from non-sigwaiter threads */</div><div class='add'>+    sigaddset(&amp;set, SIGTERM); /* cleanup_and_exit */</div><div class='add'>+    sigaddset(&amp;set, SIGHUP);  /* reincarnate */</div><div class='add'>+    sigaddset(&amp;set, SIGUSR1); /* gf_proc_dump_info */</div><div class='add'>+    sigaddset(&amp;set, SIGUSR2);</div><div class='add'>+</div><div class='add'>+    /* Signals needed for asynchronous framework. */</div><div class='add'>+    sigaddset(&amp;set, GF_ASYNC_SIGQUEUE);</div><div class='add'>+    sigaddset(&amp;set, GF_ASYNC_SIGCTRL);</div><div class='add'>+</div><div class='add'>+    ret = pthread_sigmask(SIG_BLOCK, &amp;set, NULL);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_smsg("glusterfsd", GF_LOG_WARNING, errno, glusterfsd_msg_22, NULL);</div><div class='add'>+        return ret;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = gf_thread_create(&amp;ctx-&gt;sigwaiter, NULL, glusterfs_sigwaiter,</div><div class='add'>+                           (void *)&amp;set, "sigwait");</div><div class='add'>+    if (ret) {</div><div class='add'>+        /*</div><div class='add'>+          TODO:</div><div class='add'>+          fallback to signals getting handled by other threads.</div><div class='add'>+          setup the signal handlers</div><div class='add'>+        */</div><div class='add'>+        gf_smsg("glusterfsd", GF_LOG_WARNING, errno, glusterfsd_msg_23, NULL);</div><div class='add'>+        return ret;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        cmd_args = &amp;ctx-&gt;cmd_args;</div><div class='add'>+int</div><div class='add'>+daemonize(glusterfs_ctx_t *ctx)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    cmd_args_t *cmd_args = NULL;</div><div class='add'>+    int cstatus = 0;</div><div class='add'>+    int err = 1;</div><div class='add'>+    int child_pid = 0;</div><div class='add'>+</div><div class='add'>+    cmd_args = &amp;ctx-&gt;cmd_args;</div><div class='add'>+</div><div class='add'>+    ret = glusterfs_pidfile_setup(ctx);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    if (cmd_args-&gt;no_daemon_mode) {</div><div class='add'>+        goto postfork;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (cmd_args-&gt;debug_mode)</div><div class='add'>+        goto postfork;</div><div class='add'>+</div><div class='add'>+    ret = pipe(ctx-&gt;daemon_pipe);</div><div class='add'>+    if (ret) {</div><div class='add'>+        /* If pipe() fails, retain daemon_pipe[] = {-1, -1}</div><div class='add'>+           and parent will just not wait for child status</div><div class='add'>+        */</div><div class='add'>+        ctx-&gt;daemon_pipe[0] = -1;</div><div class='add'>+        ctx-&gt;daemon_pipe[1] = -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = os_daemon_return(0, 0);</div><div class='add'>+    switch (ret) {</div><div class='add'>+        case -1:</div><div class='add'>+            if (ctx-&gt;daemon_pipe[0] != -1) {</div><div class='add'>+                sys_close(ctx-&gt;daemon_pipe[0]);</div><div class='add'>+                sys_close(ctx-&gt;daemon_pipe[1]);</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            gf_smsg("daemonize", GF_LOG_ERROR, errno, glusterfsd_msg_24, NULL);</div><div class='add'>+            goto out;</div><div class='add'>+        case 0:</div><div class='add'>+            /* child */</div><div class='add'>+            /* close read */</div><div class='add'>+            sys_close(ctx-&gt;daemon_pipe[0]);</div><div class='add'>+            break;</div><div class='add'>+        default:</div><div class='add'>+            /* parent */</div><div class='add'>+            /* close write */</div><div class='add'>+            child_pid = ret;</div><div class='add'>+            sys_close(ctx-&gt;daemon_pipe[1]);</div><div class='add'>+</div><div class='add'>+            if (ctx-&gt;mnt_pid &gt; 0) {</div><div class='add'>+                ret = waitpid(ctx-&gt;mnt_pid, &amp;cstatus, 0);</div><div class='add'>+                if (!(ret == ctx-&gt;mnt_pid)) {</div><div class='add'>+                    if (WIFEXITED(cstatus)) {</div><div class='add'>+                        err = WEXITSTATUS(cstatus);</div><div class='add'>+                    } else {</div><div class='add'>+                        err = cstatus;</div><div class='add'>+                    }</div><div class='add'>+                    gf_smsg("daemonize", GF_LOG_ERROR, 0, glusterfsd_msg_25,</div><div class='add'>+                            NULL);</div><div class='add'>+                    exit(err);</div><div class='add'>+                }</div><div class='add'>+            }</div><div class='add'>+            sys_read(ctx-&gt;daemon_pipe[0], (void *)&amp;err, sizeof(err));</div><div class='add'>+            /* NOTE: Only the least significant 8 bits i.e (err &amp; 255)</div><div class='add'>+               will be available to parent process on calling exit() */</div><div class='add'>+            if (err)</div><div class='add'>+                _exit(abs(err));</div><div class='add'>+</div><div class='add'>+            /* Update pid in parent only for glusterd process */</div><div class='add'>+            if (ctx-&gt;process_mode == GF_GLUSTERD_PROCESS) {</div><div class='add'>+                ret = glusterfs_pidfile_update(ctx, child_pid);</div><div class='add'>+                if (ret)</div><div class='add'>+                    exit(1);</div><div class='add'>+            }</div><div class='add'>+            _exit(0);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        ret = glusterfs_pidfile_setup (ctx);</div><div class='add'>+postfork:</div><div class='add'>+    /* Update pid in child either process_mode is not belong to glusterd</div><div class='add'>+       or process is spawned in no daemon mode</div><div class='add'>+    */</div><div class='add'>+    if ((ctx-&gt;process_mode != GF_GLUSTERD_PROCESS) ||</div><div class='add'>+        (cmd_args-&gt;no_daemon_mode)) {</div><div class='add'>+        ret = glusterfs_pidfile_update(ctx, getpid());</div><div class='ctx'>         if (ret)</div><div class='del'>-                return ret;</div><div class='add'>+            goto out;</div><div class='add'>+    }</div><div class='add'>+    gf_log("glusterfs", GF_LOG_INFO, "Pid of current running process is %d",</div><div class='add'>+           getpid());</div><div class='add'>+    ret = gf_log_inject_timer_event(ctx);</div><div class='ctx'> </div><div class='del'>-        if (cmd_args-&gt;no_daemon_mode)</div><div class='del'>-                goto postfork;</div><div class='add'>+    glusterfs_signals_setup(ctx);</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        if (cmd_args-&gt;debug_mode)</div><div class='del'>-                goto postfork;</div><div class='add'>+#ifdef GF_LINUX_HOST_OS</div><div class='add'>+static int</div><div class='add'>+set_oom_score_adj(glusterfs_ctx_t *ctx)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    cmd_args_t *cmd_args = NULL;</div><div class='add'>+    int fd = -1;</div><div class='add'>+    size_t oom_score_len = 0;</div><div class='add'>+    struct oom_api_info *api = NULL;</div><div class='ctx'> </div><div class='del'>-        ret = os_daemon (0, 0);</div><div class='del'>-        if (ret == -1) {</div><div class='del'>-                gf_log ("daemonize", GF_LOG_ERROR,</div><div class='del'>-                        "Daemonization failed: %s", strerror(errno));</div><div class='del'>-                return ret;</div><div class='del'>-        }</div><div class='add'>+    cmd_args = &amp;ctx-&gt;cmd_args;</div><div class='ctx'> </div><div class='del'>-postfork:</div><div class='del'>-        ret = glusterfs_pidfile_update (ctx);</div><div class='del'>-        if (ret)</div><div class='del'>-                return ret;</div><div class='add'>+    if (!cmd_args-&gt;oom_score_adj)</div><div class='add'>+        goto success;</div><div class='ctx'> </div><div class='del'>-        glusterfs_signals_setup (ctx);</div><div class='add'>+    api = get_oom_api_info();</div><div class='add'>+    if (!api)</div><div class='add'>+        goto out;</div><div class='ctx'> </div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='add'>+    fd = open(api-&gt;oom_api_file, O_WRONLY);</div><div class='add'>+    if (fd &lt; 0)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    oom_score_len = strlen(cmd_args-&gt;oom_score_adj);</div><div class='add'>+    if (sys_write(fd, cmd_args-&gt;oom_score_adj, oom_score_len) !=</div><div class='add'>+        oom_score_len) {</div><div class='add'>+        sys_close(fd);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (sys_close(fd) &lt; 0)</div><div class='add'>+        goto out;</div><div class='ctx'> </div><div class='add'>+success:</div><div class='add'>+    ret = 0;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+#endif</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-glusterfs_process_volfp (glusterfs_ctx_t *ctx, FILE *fp)</div><div class='add'>+glusterfs_process_volfp(glusterfs_ctx_t *ctx, FILE *fp)</div><div class='ctx'> {</div><div class='del'>-        glusterfs_graph_t  *graph = NULL;</div><div class='del'>-        int                 ret = 0;</div><div class='del'>-        xlator_t           *trav = NULL;</div><div class='add'>+    glusterfs_graph_t *graph = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    xlator_t *trav = NULL;</div><div class='ctx'> </div><div class='del'>-        graph = glusterfs_graph_construct (fp);</div><div class='add'>+    if (!ctx)</div><div class='add'>+        return -1;</div><div class='ctx'> </div><div class='del'>-        if (!graph) {</div><div class='del'>-                ret = -1;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='add'>+    graph = glusterfs_graph_construct(fp);</div><div class='add'>+    if (!graph) {</div><div class='add'>+        gf_smsg("", GF_LOG_ERROR, 0, glusterfsd_msg_26, NULL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        for (trav = graph-&gt;first; trav; trav = trav-&gt;next) {</div><div class='del'>-                if (strcmp (trav-&gt;type, "mount/fuse") == 0) {</div><div class='del'>-                        gf_log ("glusterfsd", GF_LOG_ERROR,</div><div class='del'>-                                "fuse xlator cannot be specified "</div><div class='del'>-                                "in volume file");</div><div class='del'>-                        ret = -1;</div><div class='del'>-                        goto out;</div><div class='del'>-                }</div><div class='add'>+    for (trav = graph-&gt;first; trav; trav = trav-&gt;next) {</div><div class='add'>+        if (strcmp(trav-&gt;type, "mount/fuse") == 0) {</div><div class='add'>+            gf_smsg("glusterfsd", GF_LOG_ERROR, 0, glusterfsd_msg_27, NULL);</div><div class='add'>+            goto out;</div><div class='ctx'>         }</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        ret = glusterfs_graph_prepare (graph, ctx);</div><div class='add'>+    xlator_t *xl = graph-&gt;first;</div><div class='add'>+    if (xl &amp;&amp; (strcmp(xl-&gt;type, "protocol/server") == 0)) {</div><div class='add'>+        (void)copy_opts_to_child(xl, FIRST_CHILD(xl), "*auth*");</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        if (ret) {</div><div class='del'>-                glusterfs_graph_destroy (graph);</div><div class='del'>-                ret = -1;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='add'>+    ret = glusterfs_graph_prepare(graph, ctx, ctx-&gt;cmd_args.volume_name);</div><div class='add'>+    if (ret) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        ret = glusterfs_graph_activate (graph, ctx);</div><div class='add'>+    ret = glusterfs_graph_activate(graph, ctx);</div><div class='ctx'> </div><div class='del'>-        if (ret) {</div><div class='del'>-                glusterfs_graph_destroy (graph);</div><div class='del'>-                ret = -1;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='add'>+    if (ret) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        gf_log_volume_file (fp);</div><div class='add'>+    gf_log_dump_graph(fp, graph);</div><div class='ctx'> </div><div class='add'>+    ret = 0;</div><div class='ctx'> out:</div><div class='del'>-        if (fp)</div><div class='del'>-                fclose (fp);</div><div class='add'>+    if (fp)</div><div class='add'>+        fclose(fp);</div><div class='add'>+</div><div class='add'>+    if (ret) {</div><div class='add'>+        /* TODO This code makes to generic for all graphs</div><div class='add'>+           client as well as servers.For now it destroys</div><div class='add'>+           graph only for server-side xlators not for client-side</div><div class='add'>+           xlators, before destroying a graph call xlator fini for</div><div class='add'>+           xlators those call xlator_init to avoid leak</div><div class='add'>+        */</div><div class='add'>+        if (graph) {</div><div class='add'>+            xl = graph-&gt;first;</div><div class='add'>+            if ((ctx-&gt;active != graph) &amp;&amp;</div><div class='add'>+                (xl &amp;&amp; !strcmp(xl-&gt;type, "protocol/server"))) {</div><div class='add'>+                /* Take dict ref for every graph xlator to avoid dict leak</div><div class='add'>+                   at the time of graph destroying</div><div class='add'>+                */</div><div class='add'>+                glusterfs_graph_fini(graph);</div><div class='add'>+                glusterfs_graph_destroy(graph);</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-        if (ret &amp;&amp; !ctx-&gt;active) {</div><div class='del'>-                /* there is some error in setting up the first graph itself */</div><div class='del'>-                cleanup_and_exit (0);</div><div class='add'>+        /* there is some error in setting up the first graph itself */</div><div class='add'>+        if (!ctx-&gt;active) {</div><div class='add'>+            emancipate(ctx, ret);</div><div class='add'>+            cleanup_and_exit(ret);</div><div class='ctx'>         }</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        return ret;</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-glusterfs_volumes_init (glusterfs_ctx_t *ctx)</div><div class='add'>+glusterfs_volumes_init(glusterfs_ctx_t *ctx)</div><div class='ctx'> {</div><div class='del'>-        FILE               *fp = NULL;</div><div class='del'>-        cmd_args_t         *cmd_args = NULL;</div><div class='del'>-        int                 ret = 0;</div><div class='add'>+    FILE *fp = NULL;</div><div class='add'>+    cmd_args_t *cmd_args = NULL;</div><div class='add'>+    int ret = 0;</div><div class='ctx'> </div><div class='del'>-        cmd_args = &amp;ctx-&gt;cmd_args;</div><div class='add'>+    cmd_args = &amp;ctx-&gt;cmd_args;</div><div class='ctx'> </div><div class='del'>-        if (cmd_args-&gt;volfile_server) {</div><div class='del'>-                ret = glusterfs_mgmt_init (ctx);</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='add'>+    if (cmd_args-&gt;sock_file) {</div><div class='add'>+        ret = glusterfs_listener_init(ctx);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        fp = get_volfp (ctx);</div><div class='add'>+    if (cmd_args-&gt;volfile_server) {</div><div class='add'>+        ret = glusterfs_mgmt_init(ctx);</div><div class='add'>+        /* return, do not emancipate() yet */</div><div class='add'>+        return ret;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        if (!fp) {</div><div class='del'>-                gf_log ("glusterfsd", GF_LOG_ERROR,</div><div class='del'>-                        "Cannot reach volume specification file");</div><div class='del'>-                ret = -1;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='add'>+    fp = get_volfp(ctx);</div><div class='ctx'> </div><div class='del'>-        ret = glusterfs_process_volfp (ctx, fp);</div><div class='del'>-        if (ret)</div><div class='del'>-                goto out;</div><div class='add'>+    if (!fp) {</div><div class='add'>+        gf_smsg("glusterfsd", GF_LOG_ERROR, 0, glusterfsd_msg_28, NULL);</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = glusterfs_process_volfp(ctx, fp);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='ctx'> </div><div class='ctx'> out:</div><div class='del'>-        return ret;</div><div class='add'>+    emancipate(ctx, ret);</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+/* This is the only legal global pointer  */</div><div class='add'>+glusterfs_ctx_t *glusterfsd_ctx;</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-main (int argc, char *argv[])</div><div class='add'>+main(int argc, char *argv[])</div><div class='ctx'> {</div><div class='del'>-        glusterfs_ctx_t  *ctx = NULL;</div><div class='del'>-        int               ret = -1;</div><div class='del'>-</div><div class='del'>-        ret = glusterfs_globals_init ();</div><div class='del'>-        if (ret)</div><div class='del'>-                return ret;</div><div class='del'>-</div><div class='del'>-        ctx = glusterfs_ctx_get ();</div><div class='del'>-        if (!ctx)</div><div class='del'>-                return ENOMEM;</div><div class='del'>-</div><div class='del'>-        ret = glusterfs_ctx_defaults_init (ctx);</div><div class='del'>-        if (ret)</div><div class='del'>-                goto out;</div><div class='del'>-</div><div class='del'>-        ret = parse_cmdline (argc, argv, ctx);</div><div class='del'>-        if (ret)</div><div class='del'>-                goto out;</div><div class='add'>+    glusterfs_ctx_t *ctx = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    char cmdlinestr[PATH_MAX] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    cmd_args_t *cmd = NULL;</div><div class='add'>+</div><div class='add'>+    gf_check_and_set_mem_acct(argc, argv);</div><div class='add'>+</div><div class='add'>+    ctx = glusterfs_ctx_new();</div><div class='add'>+    if (!ctx) {</div><div class='add'>+        gf_smsg("glusterfs", GF_LOG_CRITICAL, 0, glusterfsd_msg_29, NULL);</div><div class='add'>+        return ENOMEM;</div><div class='add'>+    }</div><div class='add'>+    glusterfsd_ctx = ctx;</div><div class='add'>+</div><div class='add'>+    ret = glusterfs_globals_init(ctx);</div><div class='add'>+    if (ret)</div><div class='add'>+        return ret;</div><div class='ctx'> </div><div class='del'>-        ret = logging_init (ctx);</div><div class='del'>-        if (ret)</div><div class='add'>+    THIS-&gt;ctx = ctx;</div><div class='add'>+</div><div class='add'>+    ret = glusterfs_ctx_defaults_init(ctx);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    ret = parse_cmdline(argc, argv, ctx);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+    cmd = &amp;ctx-&gt;cmd_args;</div><div class='add'>+</div><div class='add'>+    if (cmd-&gt;print_xlatordir) {</div><div class='add'>+        /* XLATORDIR passed through a -D flag to GCC */</div><div class='add'>+        printf("%s\n", XLATORDIR);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (cmd-&gt;print_statedumpdir) {</div><div class='add'>+        printf("%s\n", DEFAULT_VAR_RUN_DIRECTORY);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (cmd-&gt;print_logdir) {</div><div class='add'>+        printf("%s\n", DEFAULT_LOG_FILE_DIRECTORY);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (cmd-&gt;print_libexecdir) {</div><div class='add'>+        printf("%s\n", LIBEXECDIR);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (cmd-&gt;print_netgroups) {</div><div class='add'>+        /* If this option is set we want to print &amp; verify the file,</div><div class='add'>+         * set the return value (exit code in this case) and exit.</div><div class='add'>+         */</div><div class='add'>+        ret = print_netgroups_file(cmd-&gt;print_netgroups);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (cmd-&gt;print_exports) {</div><div class='add'>+        /* If this option is set we want to print &amp; verify the file,</div><div class='add'>+         * set the return value (exit code in this case)</div><div class='add'>+         * and exit.</div><div class='add'>+         */</div><div class='add'>+        ret = print_exports_file(cmd-&gt;print_exports);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = logging_init(ctx, argv[0]);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    /* set brick_mux mode only for server process */</div><div class='add'>+    if ((ctx-&gt;process_mode != GF_SERVER_PROCESS) &amp;&amp; cmd-&gt;brick_mux) {</div><div class='add'>+        gf_smsg("glusterfs", GF_LOG_CRITICAL, 0, glusterfsd_msg_43, NULL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* log the version of glusterfs running here along with the actual</div><div class='add'>+       command line options. */</div><div class='add'>+    {</div><div class='add'>+        int i = 0;</div><div class='add'>+        int pos = 0;</div><div class='add'>+        int len = snprintf(cmdlinestr, sizeof(cmdlinestr), "%s", argv[0]);</div><div class='add'>+        for (i = 1; (i &lt; argc) &amp;&amp; (len &gt; 0); i++) {</div><div class='add'>+            pos += len;</div><div class='add'>+            len = snprintf(cmdlinestr + pos, sizeof(cmdlinestr) - pos, " %s",</div><div class='add'>+                           argv[i]);</div><div class='add'>+            if ((len &lt;= 0) || (len &gt;= (sizeof(cmdlinestr) - pos))) {</div><div class='add'>+                gf_smsg("glusterfs", GF_LOG_ERROR, 0, glusterfsd_msg_029, NULL);</div><div class='add'>+                ret = -1;</div><div class='ctx'>                 goto out;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+        gf_smsg(argv[0], GF_LOG_INFO, 0, glusterfsd_msg_30, "arg=%s", argv[0],</div><div class='add'>+                "version=%s", PACKAGE_VERSION, "cmdlinestr=%s", cmdlinestr,</div><div class='add'>+                NULL);</div><div class='add'>+</div><div class='add'>+        ctx-&gt;cmdlinestr = gf_strdup(cmdlinestr);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    gf_proc_dump_init();</div><div class='add'>+</div><div class='add'>+    ret = create_fuse_mount(ctx);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    ret = daemonize(ctx);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    /*</div><div class='add'>+     * If we do this before daemonize, the pool-sweeper thread dies with</div><div class='add'>+     * the parent, but we want to do it as soon as possible after that in</div><div class='add'>+     * case something else depends on pool allocations.</div><div class='add'>+     */</div><div class='add'>+    mem_pools_init();</div><div class='add'>+</div><div class='add'>+    ret = gf_async_init(ctx);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+#ifdef GF_LINUX_HOST_OS</div><div class='add'>+    ret = set_oom_score_adj(ctx);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+#endif</div><div class='ctx'> </div><div class='del'>-        gf_proc_dump_init();</div><div class='add'>+    ctx-&gt;env = syncenv_new(0, 0, 0);</div><div class='add'>+    if (!ctx-&gt;env) {</div><div class='add'>+        gf_smsg("", GF_LOG_ERROR, 0, glusterfsd_msg_31, NULL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        ret = create_fuse_mount (ctx);</div><div class='del'>-        if (ret)</div><div class='del'>-                goto out;</div><div class='add'>+    /* do this _after_ daemonize() */</div><div class='add'>+    if (!glusterfs_ctx_tw_get(ctx)) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        ret = daemonize (ctx);</div><div class='del'>-        if (ret)</div><div class='del'>-                goto out;</div><div class='del'>-</div><div class='del'>-        ret = glusterfs_volumes_init (ctx);</div><div class='del'>-        if (ret)</div><div class='del'>-                goto out;</div><div class='add'>+    ret = glusterfs_volumes_init(ctx);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='ctx'> </div><div class='del'>-        ret = event_dispatch (ctx-&gt;event_pool);</div><div class='add'>+    ret = gf_event_dispatch(ctx-&gt;event_pool);</div><div class='ctx'> </div><div class='ctx'> out:</div><div class='del'>-//        glusterfs_ctx_destroy (ctx);</div><div class='del'>-</div><div class='del'>-        return ret;</div><div class='add'>+    //    glusterfs_ctx_destroy (ctx);</div><div class='add'>+    gf_async_fini();</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='head'>diff --git a/glusterfsd/src/glusterfsd.h b/glusterfsd/src/glusterfsd.h<br/>index c0789b6d202..4e1413caa70 100644<br/>--- a/<a href='/cgit/glusterfs.git/tree/glusterfsd/src/glusterfsd.h?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>glusterfsd/src/glusterfsd.h</a><br/>+++ b/<a href='/cgit/glusterfs.git/tree/glusterfsd/src/glusterfsd.h?id=d1d7a6f35c816822fab51c820e25023863c239c1'>glusterfsd/src/glusterfsd.h</a></div><div class='hunk'>@@ -1,85 +1,142 @@</div><div class='ctx'> /*</div><div class='del'>-   Copyright (c) 2006-2010 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='add'>+   Copyright (c) 2006-2012 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='ctx'>    This file is part of GlusterFS.</div><div class='ctx'> </div><div class='del'>-   GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-   it under the terms of the GNU General Public License as published</div><div class='del'>-   by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-   or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-   GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-   WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-   General Public License for more details.</div><div class='del'>-</div><div class='del'>-   You should have received a copy of the GNU General Public License</div><div class='del'>-   along with this program.  If not, see</div><div class='del'>-   &lt;http://www.gnu.org/licenses/&gt;.</div><div class='add'>+   This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+   General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+   later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+   cases as published by the Free Software Foundation.</div><div class='ctx'> */</div><div class='del'>-</div><div class='ctx'> #ifndef __GLUSTERFSD_H__</div><div class='ctx'> #define __GLUSTERFSD_H__</div><div class='ctx'> </div><div class='del'>-#ifndef _CONFIG_H</div><div class='del'>-#define _CONFIG_H</div><div class='del'>-#include "config.h"</div><div class='del'>-#endif</div><div class='add'>+#include "rpcsvc.h"</div><div class='add'>+#include "glusterd1-xdr.h"</div><div class='ctx'> </div><div class='del'>-#include "glusterfsd-common.h"</div><div class='add'>+#define DEFAULT_GLUSTERD_VOLFILE CONFDIR "/glusterd.vol"</div><div class='add'>+#define DEFAULT_CLIENT_VOLFILE CONFDIR "/glusterfs.vol"</div><div class='add'>+#define DEFAULT_SERVER_VOLFILE CONFDIR "/glusterfsd.vol"</div><div class='ctx'> </div><div class='del'>-#define DEFAULT_GLUSTERD_VOLFILE              CONFDIR "/glusterd.vol"</div><div class='del'>-#define DEFAULT_CLIENT_VOLFILE                CONFDIR "/glusterfs.vol"</div><div class='del'>-#define DEFAULT_SERVER_VOLFILE                CONFDIR "/glusterfsd.vol"</div><div class='del'>-#define DEFAULT_LOG_FILE_DIRECTORY            DATADIR "/log/glusterfs"</div><div class='del'>-#define DEFAULT_LOG_LEVEL                     GF_LOG_NORMAL</div><div class='add'>+#define DEFAULT_EVENT_POOL_SIZE 16384</div><div class='ctx'> </div><div class='del'>-#define DEFAULT_EVENT_POOL_SIZE            16384</div><div class='add'>+#define ARGP_LOG_LEVEL_NONE_OPTION "NONE"</div><div class='add'>+#define ARGP_LOG_LEVEL_TRACE_OPTION "TRACE"</div><div class='add'>+#define ARGP_LOG_LEVEL_CRITICAL_OPTION "CRITICAL"</div><div class='add'>+#define ARGP_LOG_LEVEL_ERROR_OPTION "ERROR"</div><div class='add'>+#define ARGP_LOG_LEVEL_WARNING_OPTION "WARNING"</div><div class='add'>+#define ARGP_LOG_LEVEL_INFO_OPTION "INFO"</div><div class='add'>+#define ARGP_LOG_LEVEL_DEBUG_OPTION "DEBUG"</div><div class='ctx'> </div><div class='del'>-#define ARGP_LOG_LEVEL_NONE_OPTION        "NONE"</div><div class='del'>-#define ARGP_LOG_LEVEL_TRACE_OPTION       "TRACE"</div><div class='del'>-#define ARGP_LOG_LEVEL_CRITICAL_OPTION    "CRITICAL"</div><div class='del'>-#define ARGP_LOG_LEVEL_ERROR_OPTION       "ERROR"</div><div class='del'>-#define ARGP_LOG_LEVEL_WARNING_OPTION     "WARNING"</div><div class='del'>-#define ARGP_LOG_LEVEL_NORMAL_OPTION      "NORMAL"</div><div class='del'>-#define ARGP_LOG_LEVEL_DEBUG_OPTION       "DEBUG"</div><div class='add'>+#define ENABLE_NO_DAEMON_MODE 1</div><div class='add'>+#define ENABLE_DEBUG_MODE 1</div><div class='ctx'> </div><div class='del'>-#define ENABLE_NO_DAEMON_MODE     1</div><div class='del'>-#define ENABLE_DEBUG_MODE         1</div><div class='add'>+#define GF_MEMPOOL_COUNT_OF_DICT_T 4096</div><div class='add'>+/* Considering 4 key/value pairs in a dictionary on an average */</div><div class='add'>+#define GF_MEMPOOL_COUNT_OF_DATA_T (GF_MEMPOOL_COUNT_OF_DICT_T * 4)</div><div class='add'>+#define GF_MEMPOOL_COUNT_OF_DATA_PAIR_T (GF_MEMPOOL_COUNT_OF_DICT_T * 4)</div><div class='add'>+</div><div class='add'>+#define GF_MEMPOOL_COUNT_OF_LRU_BUF_T 256</div><div class='ctx'> </div><div class='ctx'> enum argp_option_keys {</div><div class='del'>-	ARGP_VOLFILE_SERVER_KEY = 's',</div><div class='del'>-	ARGP_VOLUME_FILE_KEY = 'f',</div><div class='del'>-	ARGP_LOG_LEVEL_KEY = 'L',</div><div class='del'>-	ARGP_LOG_FILE_KEY = 'l',</div><div class='del'>-	ARGP_VOLFILE_SERVER_PORT_KEY = 131,</div><div class='del'>-	ARGP_VOLFILE_SERVER_TRANSPORT_KEY = 132,</div><div class='del'>-	ARGP_PID_FILE_KEY = 'p',</div><div class='del'>-	ARGP_NO_DAEMON_KEY = 'N',</div><div class='del'>-	ARGP_RUN_ID_KEY = 'r',</div><div class='del'>-	ARGP_DEBUG_KEY = 133,</div><div class='del'>-	ARGP_ENTRY_TIMEOUT_KEY = 135,</div><div class='del'>-	ARGP_ATTRIBUTE_TIMEOUT_KEY = 136,</div><div class='del'>-	ARGP_VOLUME_NAME_KEY = 137,</div><div class='del'>-	ARGP_XLATOR_OPTION_KEY = 138,</div><div class='del'>-	ARGP_DIRECT_IO_MODE_KEY = 139,</div><div class='add'>+    ARGP_VOLFILE_SERVER_KEY = 's',</div><div class='add'>+    ARGP_VOLUME_FILE_KEY = 'f',</div><div class='add'>+    ARGP_LOG_LEVEL_KEY = 'L',</div><div class='add'>+    ARGP_LOG_FILE_KEY = 'l',</div><div class='add'>+    ARGP_VOLFILE_SERVER_PORT_KEY = 131,</div><div class='add'>+    ARGP_VOLFILE_SERVER_TRANSPORT_KEY = 132,</div><div class='add'>+    ARGP_PID_FILE_KEY = 'p',</div><div class='add'>+    ARGP_SOCK_FILE_KEY = 'S',</div><div class='add'>+    ARGP_NO_DAEMON_KEY = 'N',</div><div class='add'>+    ARGP_RUN_ID_KEY = 'r',</div><div class='add'>+    ARGP_PRINT_NETGROUPS = 'n',</div><div class='add'>+    ARGP_PRINT_EXPORTS = 'e',</div><div class='add'>+    ARGP_DEBUG_KEY = 133,</div><div class='add'>+    ARGP_NEGATIVE_TIMEOUT_KEY = 134,</div><div class='add'>+    ARGP_ENTRY_TIMEOUT_KEY = 135,</div><div class='add'>+    ARGP_ATTRIBUTE_TIMEOUT_KEY = 136,</div><div class='add'>+    ARGP_VOLUME_NAME_KEY = 137,</div><div class='add'>+    ARGP_XLATOR_OPTION_KEY = 138,</div><div class='add'>+    ARGP_DIRECT_IO_MODE_KEY = 139,</div><div class='ctx'> #ifdef GF_DARWIN_HOST_OS</div><div class='del'>-	ARGP_NON_LOCAL_KEY = 140,</div><div class='add'>+    ARGP_NON_LOCAL_KEY = 140,</div><div class='ctx'> #endif /* DARWIN */</div><div class='del'>-	ARGP_VOLFILE_ID_KEY = 143,</div><div class='del'>-        ARGP_VOLFILE_CHECK_KEY = 144,</div><div class='del'>-        ARGP_VOLFILE_MAX_FETCH_ATTEMPTS = 145,</div><div class='del'>-        ARGP_LOG_SERVER_KEY = 146,</div><div class='del'>-        ARGP_LOG_SERVER_PORT_KEY = 147,</div><div class='del'>-        ARGP_READ_ONLY_KEY = 148,</div><div class='del'>-        ARGP_MAC_COMPAT_KEY = 149,</div><div class='del'>-        ARGP_DUMP_FUSE_KEY = 150,</div><div class='del'>-        ARGP_BRICK_NAME_KEY = 151,</div><div class='del'>-        ARGP_BRICK_PORT_KEY = 152,</div><div class='add'>+    ARGP_VOLFILE_ID_KEY = 143,</div><div class='add'>+    ARGP_VOLFILE_CHECK_KEY = 144,</div><div class='add'>+    ARGP_VOLFILE_MAX_FETCH_ATTEMPTS = 145,</div><div class='add'>+    ARGP_LOG_SERVER_KEY = 146,</div><div class='add'>+    ARGP_LOG_SERVER_PORT_KEY = 147,</div><div class='add'>+    ARGP_READ_ONLY_KEY = 148,</div><div class='add'>+    ARGP_MAC_COMPAT_KEY = 149,</div><div class='add'>+    ARGP_DUMP_FUSE_KEY = 150,</div><div class='add'>+    ARGP_BRICK_NAME_KEY = 151,</div><div class='add'>+    ARGP_BRICK_PORT_KEY = 152,</div><div class='add'>+    ARGP_CLIENT_PID_KEY = 153,</div><div class='add'>+    ARGP_ACL_KEY = 154,</div><div class='add'>+    ARGP_WORM_KEY = 155,</div><div class='add'>+    ARGP_USER_MAP_ROOT_KEY = 156,</div><div class='add'>+    ARGP_MEM_ACCOUNTING_KEY = 157,</div><div class='add'>+    ARGP_SELINUX_KEY = 158,</div><div class='add'>+    ARGP_FOPEN_KEEP_CACHE_KEY = 159,</div><div class='add'>+    ARGP_GID_TIMEOUT_KEY = 160,</div><div class='add'>+    ARGP_FUSE_BACKGROUND_QLEN_KEY = 161,</div><div class='add'>+    ARGP_FUSE_CONGESTION_THRESHOLD_KEY = 162,</div><div class='add'>+    ARGP_INODE32_KEY = 163,</div><div class='add'>+    ARGP_FUSE_MOUNTOPTS_KEY = 164,</div><div class='add'>+    ARGP_FUSE_USE_READDIRP_KEY = 165,</div><div class='add'>+    ARGP_AUX_GFID_MOUNT_KEY = 166,</div><div class='add'>+    ARGP_FUSE_NO_ROOT_SQUASH_KEY = 167,</div><div class='add'>+    ARGP_LOGGER = 168,</div><div class='add'>+    ARGP_LOG_FORMAT = 169,</div><div class='add'>+    ARGP_LOG_BUF_SIZE = 170,</div><div class='add'>+    ARGP_LOG_FLUSH_TIMEOUT = 171,</div><div class='add'>+    ARGP_SECURE_MGMT_KEY = 172,</div><div class='add'>+    ARGP_GLOBAL_TIMER_WHEEL = 173,</div><div class='add'>+    ARGP_RESOLVE_GIDS_KEY = 174,</div><div class='add'>+    ARGP_CAPABILITY_KEY = 175,</div><div class='add'>+#ifdef GF_LINUX_HOST_OS</div><div class='add'>+    ARGP_OOM_SCORE_ADJ_KEY = 176,</div><div class='add'>+#endif</div><div class='add'>+    ARGP_LOCALTIME_LOGGING_KEY = 177,</div><div class='add'>+    ARGP_SUBDIR_MOUNT_KEY = 178,</div><div class='add'>+    ARGP_PROCESS_NAME_KEY = 179,</div><div class='add'>+    ARGP_FUSE_EVENT_HISTORY_KEY = 180,</div><div class='add'>+    ARGP_THIN_CLIENT_KEY = 181,</div><div class='add'>+    ARGP_READER_THREAD_COUNT_KEY = 182,</div><div class='add'>+    ARGP_PRINT_XLATORDIR_KEY = 183,</div><div class='add'>+    ARGP_PRINT_STATEDUMPDIR_KEY = 184,</div><div class='add'>+    ARGP_PRINT_LOGDIR_KEY = 185,</div><div class='add'>+    ARGP_KERNEL_WRITEBACK_CACHE_KEY = 186,</div><div class='add'>+    ARGP_ATTR_TIMES_GRANULARITY_KEY = 187,</div><div class='add'>+    ARGP_PRINT_LIBEXECDIR_KEY = 188,</div><div class='add'>+    ARGP_FUSE_FLUSH_HANDLE_INTERRUPT_KEY = 189,</div><div class='add'>+    ARGP_FUSE_LRU_LIMIT_KEY = 190,</div><div class='add'>+    ARGP_FUSE_AUTO_INVAL_KEY = 191,</div><div class='add'>+    ARGP_GLOBAL_THREADING_KEY = 192,</div><div class='add'>+    ARGP_BRICK_MUX_KEY = 193,</div><div class='add'>+    ARGP_FUSE_DEV_EPERM_RATELIMIT_NS_KEY = 194,</div><div class='add'>+    ARGP_FUSE_INVALIDATE_LIMIT_KEY = 195,</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct _gfd_vol_top_priv {</div><div class='add'>+    rpcsvc_request_t *req;</div><div class='add'>+    gd1_mgmt_brick_op_req xlator_req;</div><div class='add'>+    uint32_t blk_count;</div><div class='add'>+    uint32_t blk_size;</div><div class='add'>+    double throughput;</div><div class='add'>+    double time;</div><div class='add'>+    int32_t ret;</div><div class='ctx'> };</div><div class='add'>+typedef struct _gfd_vol_top_priv gfd_vol_top_priv_t;</div><div class='ctx'> </div><div class='del'>-int glusterfs_mgmt_pmap_signout (glusterfs_ctx_t *ctx);</div><div class='del'>-int glusterfs_mgmt_pmap_signin (glusterfs_ctx_t *ctx);</div><div class='del'>-int glusterfs_volfile_fetch (glusterfs_ctx_t *ctx);</div><div class='add'>+int</div><div class='add'>+glusterfs_mgmt_pmap_signin(glusterfs_ctx_t *ctx);</div><div class='add'>+int</div><div class='add'>+glusterfs_volfile_fetch(glusterfs_ctx_t *ctx);</div><div class='add'>+void</div><div class='add'>+cleanup_and_exit(int signum);</div><div class='ctx'> </div><div class='add'>+void</div><div class='add'>+xlator_mem_cleanup(xlator_t *this);</div><div class='ctx'> </div><div class='add'>+extern glusterfs_ctx_t *glusterfsd_ctx;</div><div class='ctx'> #endif /* __GLUSTERFSD_H__ */</div><div class='head'>diff --git a/xlators/features/access-control/Makefile.am b/heal/Makefile.am<br/>index a985f42a877..a985f42a877 100644<br/>--- a/<a href='/cgit/glusterfs.git/tree/xlators/features/access-control/Makefile.am?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/access-control/Makefile.am</a><br/>+++ b/<a href='/cgit/glusterfs.git/tree/heal/Makefile.am?id=d1d7a6f35c816822fab51c820e25023863c239c1'>heal/Makefile.am</a></div><div class='head'>diff --git a/heal/src/Makefile.am b/heal/src/Makefile.am<br/>new file mode 100644<br/>index 00000000000..aa18d3eff88<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/heal/src/Makefile.am?id=d1d7a6f35c816822fab51c820e25023863c239c1'>heal/src/Makefile.am</a></div><div class='hunk'>@@ -0,0 +1,29 @@</div><div class='add'>+if WITH_SERVER</div><div class='add'>+scriptdir = $(GLUSTERFS_LIBEXECDIR)</div><div class='add'>+script_PROGRAMS = glfsheal</div><div class='add'>+endif</div><div class='add'>+</div><div class='add'>+glfsheal_SOURCES = glfs-heal.c</div><div class='add'>+</div><div class='add'>+glfsheal_LDADD = $(top_builddir)/libglusterfs/src/libglusterfs.la $(GF_LDADD)\</div><div class='add'>+		$(RLLIBS) $(top_builddir)/rpc/xdr/src/libgfxdr.la \</div><div class='add'>+		$(top_builddir)/rpc/rpc-lib/src/libgfrpc.la \</div><div class='add'>+		$(top_builddir)/api/src/libgfapi.la \</div><div class='add'>+		$(XML_LIBS) $(GFAPI_LIBS) $(UUID_LIBS)</div><div class='add'>+</div><div class='add'>+glfsheal_LDFLAGS = $(GF_LDFLAGS)</div><div class='add'>+</div><div class='add'>+AM_CPPFLAGS = $(GF_CPPFLAGS) \</div><div class='add'>+	-I$(top_srcdir)/xlators/lib/src\</div><div class='add'>+	-I$(top_srcdir)/libglusterfs/src -I$(top_srcdir)/rpc/rpc-lib/src\</div><div class='add'>+	-I$(top_srcdir)/rpc/xdr/src\</div><div class='add'>+	-I$(top_builddir)/rpc/xdr/src\</div><div class='add'>+	-I$(top_srcdir)/api/src\</div><div class='add'>+	-DDATADIR=\"$(localstatedir)\"</div><div class='add'>+</div><div class='add'>+AM_CFLAGS = -Wall $(GF_CFLAGS) $(XML_CFLAGS)</div><div class='add'>+</div><div class='add'>+CLEANFILES =</div><div class='add'>+</div><div class='add'>+$(top_builddir)/libglusterfs/src/libglusterfs.la:</div><div class='add'>+	$(MAKE) -C $(top_builddir)/libglusterfs/src/ all</div><div class='head'>diff --git a/heal/src/glfs-heal.c b/heal/src/glfs-heal.c<br/>new file mode 100644<br/>index 00000000000..bf4b47f8760<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/heal/src/glfs-heal.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>heal/src/glfs-heal.c</a></div><div class='hunk'>@@ -0,0 +1,1793 @@</div><div class='add'>+/*</div><div class='add'>+ Copyright (c) 2014 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+ This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+ This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+ General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+ later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+ cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#include &lt;stdio.h&gt;</div><div class='add'>+#include &lt;stdlib.h&gt;</div><div class='add'>+#include &lt;errno.h&gt;</div><div class='add'>+#include "glfs.h"</div><div class='add'>+#include "glfs-internal.h"</div><div class='add'>+#include "protocol-common.h"</div><div class='add'>+#include &lt;glusterfs/syscall.h&gt;</div><div class='add'>+#include &lt;glusterfs/syncop.h&gt;</div><div class='add'>+#include &lt;glusterfs/syncop-utils.h&gt;</div><div class='add'>+#include &lt;string.h&gt;</div><div class='add'>+#include &lt;glusterfs/glusterfs.h&gt;</div><div class='add'>+#include &lt;libgen.h&gt;</div><div class='add'>+</div><div class='add'>+#if (HAVE_LIB_XML)</div><div class='add'>+#include &lt;libxml/encoding.h&gt;</div><div class='add'>+#include &lt;libxml/xmlwriter.h&gt;</div><div class='add'>+</div><div class='add'>+xmlTextWriterPtr glfsh_writer;</div><div class='add'>+xmlDocPtr glfsh_doc = NULL;</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#define XML_RET_CHECK_AND_GOTO(ret, label)                                     \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        if (ret &lt; 0) {                                                         \</div><div class='add'>+            ret = -1;                                                          \</div><div class='add'>+            goto label;                                                        \</div><div class='add'>+        } else                                                                 \</div><div class='add'>+            ret = 0;                                                           \</div><div class='add'>+    } while (0)</div><div class='add'>+</div><div class='add'>+#define MODE_XML (1 &lt;&lt; 0)</div><div class='add'>+#define MODE_NO_LOG (1 &lt;&lt; 1)</div><div class='add'>+</div><div class='add'>+typedef struct num_entries {</div><div class='add'>+    uint64_t num_entries;</div><div class='add'>+    uint64_t pending_entries;</div><div class='add'>+    uint64_t spb_entries;</div><div class='add'>+    uint64_t possibly_healing_entries;</div><div class='add'>+} num_entries_t;</div><div class='add'>+</div><div class='add'>+typedef int (*print_status)(dict_t *, char *, uuid_t, num_entries_t *,</div><div class='add'>+                            gf_boolean_t flag);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+glfsh_heal_splitbrain_file(glfs_t *fs, xlator_t *top_subvol, loc_t *rootloc,</div><div class='add'>+                           char *file, dict_t *xattr_req);</div><div class='add'>+</div><div class='add'>+typedef struct glfs_info {</div><div class='add'>+    int (*init)(void);</div><div class='add'>+    int (*print_brick_from_xl)(xlator_t *xl, loc_t *rootloc);</div><div class='add'>+    int (*print_heal_op_status)(int ret, uint64_t num_entries, char *fmt_str);</div><div class='add'>+    int (*print_heal_op_summary)(int ret, num_entries_t *num_entries);</div><div class='add'>+    int (*print_heal_status)(char *path, uuid_t gfid, char *status);</div><div class='add'>+    int (*print_spb_status)(char *path, uuid_t gfid, char *status);</div><div class='add'>+    int (*end)(int op_ret, char *op_errstr);</div><div class='add'>+} glfsh_info_t;</div><div class='add'>+</div><div class='add'>+glfsh_info_t *glfsh_output = NULL;</div><div class='add'>+int32_t is_xml;</div><div class='add'>+</div><div class='add'>+#define DEFAULT_HEAL_LOG_FILE_DIRECTORY DATADIR "/log/glusterfs"</div><div class='add'>+#define USAGE_STR                                                              \</div><div class='add'>+    "Usage: %s &lt;VOLNAME&gt; [bigger-file &lt;FILE&gt; | "                               \</div><div class='add'>+    "latest-mtime &lt;FILE&gt; | "                                                   \</div><div class='add'>+    "source-brick &lt;HOSTNAME:BRICKNAME&gt; [&lt;FILE&gt;] | "                            \</div><div class='add'>+    "split-brain-info | info-summary] [glusterd-sock &lt;FILE&gt;"                   \</div><div class='add'>+    "]\n"</div><div class='add'>+</div><div class='add'>+typedef enum {</div><div class='add'>+    GLFSH_MODE_CONTINUE_ON_ERROR = 1,</div><div class='add'>+    GLFSH_MODE_EXIT_ON_FIRST_FAILURE,</div><div class='add'>+} glfsh_fail_mode_t;</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+glfsh_init()</div><div class='add'>+{</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+glfsh_end_op_granular_entry_heal(int op_ret, char *op_errstr)</div><div class='add'>+{</div><div class='add'>+    /* If error string is available, give it higher precedence.*/</div><div class='add'>+</div><div class='add'>+    if (op_errstr) {</div><div class='add'>+        printf("%s\n", op_errstr);</div><div class='add'>+    } else if (op_ret &lt; 0) {</div><div class='add'>+        if (op_ret == -EAGAIN)</div><div class='add'>+            printf(</div><div class='add'>+                "One or more entries need heal. Please execute "</div><div class='add'>+                "the command again after there are no entries "</div><div class='add'>+                "to be healed\n");</div><div class='add'>+        else if (op_ret == -ENOTCONN)</div><div class='add'>+            printf(</div><div class='add'>+                "One or more bricks could be down. Please "</div><div class='add'>+                "execute the command again after bringing all "</div><div class='add'>+                "bricks online and finishing any pending "</div><div class='add'>+                "heals\n");</div><div class='add'>+        else</div><div class='add'>+            printf(</div><div class='add'>+                "Command failed - %s. Please check the logs for"</div><div class='add'>+                " more details\n",</div><div class='add'>+                strerror(-op_ret));</div><div class='add'>+    }</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+glfsh_end(int op_ret, char *op_errstr)</div><div class='add'>+{</div><div class='add'>+    if (op_errstr)</div><div class='add'>+        printf("%s\n", op_errstr);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+glfsh_print_hr_spb_status(char *path, uuid_t gfid, char *status)</div><div class='add'>+{</div><div class='add'>+    printf("%s\n", path);</div><div class='add'>+    fflush(stdout);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+glfsh_no_print_hr_status(char *path, uuid_t gfid, char *status)</div><div class='add'>+{</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+glfsh_print_hr_heal_status(char *path, uuid_t gfid, char *status)</div><div class='add'>+{</div><div class='add'>+    printf("%s%s\n", path, status);</div><div class='add'>+    fflush(stdout);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#if (HAVE_LIB_XML)</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+glfsh_xml_init()</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    glfsh_writer = xmlNewTextWriterDoc(&amp;glfsh_doc, 0);</div><div class='add'>+    if (glfsh_writer == NULL) {</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = xmlTextWriterStartDocument(glfsh_writer, "1.0", "UTF-8", "yes");</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, xml_out);</div><div class='add'>+</div><div class='add'>+    /* &lt;cliOutput&gt; */</div><div class='add'>+    ret = xmlTextWriterStartElement(glfsh_writer, (xmlChar *)"cliOutput");</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, xml_out);</div><div class='add'>+</div><div class='add'>+    /* &lt;healInfo&gt; */</div><div class='add'>+    ret = xmlTextWriterStartElement(glfsh_writer, (xmlChar *)"healInfo");</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, xml_out);</div><div class='add'>+    /* &lt;bricks&gt; */</div><div class='add'>+    ret = xmlTextWriterStartElement(glfsh_writer, (xmlChar *)"bricks");</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, xml_out);</div><div class='add'>+    xmlTextWriterFlush(glfsh_writer);</div><div class='add'>+xml_out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+glfsh_xml_end(int op_ret, char *op_errstr)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int op_errno = 0;</div><div class='add'>+    gf_boolean_t alloc = _gf_false;</div><div class='add'>+</div><div class='add'>+    if (op_ret &lt; 0) {</div><div class='add'>+        op_errno = -op_ret;</div><div class='add'>+        op_ret = -1;</div><div class='add'>+        if (op_errstr == NULL) {</div><div class='add'>+            op_errstr = gf_strdup(strerror(op_errno));</div><div class='add'>+            alloc = _gf_true;</div><div class='add'>+        }</div><div class='add'>+    } else {</div><div class='add'>+        op_errstr = NULL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* &lt;/bricks&gt; */</div><div class='add'>+    ret = xmlTextWriterEndElement(glfsh_writer);</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, xml_out);</div><div class='add'>+</div><div class='add'>+    /* &lt;/healInfo&gt; */</div><div class='add'>+    ret = xmlTextWriterEndElement(glfsh_writer);</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, xml_out);</div><div class='add'>+</div><div class='add'>+    ret = xmlTextWriterWriteFormatElement(glfsh_writer, (xmlChar *)"opRet",</div><div class='add'>+                                          "%d", op_ret);</div><div class='add'>+</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, xml_out);</div><div class='add'>+</div><div class='add'>+    ret = xmlTextWriterWriteFormatElement(glfsh_writer, (xmlChar *)"opErrno",</div><div class='add'>+                                          "%d", op_errno);</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, xml_out);</div><div class='add'>+</div><div class='add'>+    if (op_errstr)</div><div class='add'>+        ret = xmlTextWriterWriteFormatElement(</div><div class='add'>+            glfsh_writer, (xmlChar *)"opErrstr", "%s", op_errstr);</div><div class='add'>+    else</div><div class='add'>+        ret = xmlTextWriterWriteFormatElement(glfsh_writer,</div><div class='add'>+                                              (xmlChar *)"opErrstr", "%s", "");</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, xml_out);</div><div class='add'>+    ret = xmlTextWriterEndDocument(glfsh_writer);</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(ret, xml_out);</div><div class='add'>+</div><div class='add'>+    /* Dump xml document to stdout and pretty format it */</div><div class='add'>+    xmlSaveFormatFileEnc("-", glfsh_doc, "UTF-8", 1);</div><div class='add'>+</div><div class='add'>+    xmlFreeTextWriter(glfsh_writer);</div><div class='add'>+    xmlFreeDoc(glfsh_doc);</div><div class='add'>+xml_out:</div><div class='add'>+    if (alloc)</div><div class='add'>+        GF_FREE(op_errstr);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+glfsh_print_xml_heal_op_status(int ret, uint64_t num_entries, char *fmt_str)</div><div class='add'>+{</div><div class='add'>+    int x_ret = 0;</div><div class='add'>+    if (ret &lt; 0 &amp;&amp; num_entries == 0) {</div><div class='add'>+        x_ret = xmlTextWriterWriteFormatElement(</div><div class='add'>+            glfsh_writer, (xmlChar *)"status", "%s", strerror(-ret));</div><div class='add'>+        XML_RET_CHECK_AND_GOTO(x_ret, out);</div><div class='add'>+        if (fmt_str) {</div><div class='add'>+            x_ret = xmlTextWriterWriteFormatElement(</div><div class='add'>+                glfsh_writer, (xmlChar *)"numberOfEntries", "-");</div><div class='add'>+            XML_RET_CHECK_AND_GOTO(x_ret, out);</div><div class='add'>+        }</div><div class='add'>+        goto out;</div><div class='add'>+    } else if (ret == 0) {</div><div class='add'>+        x_ret = xmlTextWriterWriteFormatElement(</div><div class='add'>+            glfsh_writer, (xmlChar *)"status", "%s", "Connected");</div><div class='add'>+        XML_RET_CHECK_AND_GOTO(x_ret, out);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        if (fmt_str) {</div><div class='add'>+            x_ret = xmlTextWriterWriteFormatElement(</div><div class='add'>+                glfsh_writer, (xmlChar *)"status",</div><div class='add'>+                "Failed to process entries completely. "</div><div class='add'>+                "(%s)%s %" PRIu64 "",</div><div class='add'>+                strerror(-ret), fmt_str, num_entries);</div><div class='add'>+            XML_RET_CHECK_AND_GOTO(x_ret, out);</div><div class='add'>+        }</div><div class='add'>+    } else {</div><div class='add'>+        if (fmt_str) {</div><div class='add'>+            x_ret = xmlTextWriterWriteFormatElement(</div><div class='add'>+                glfsh_writer, (xmlChar *)"numberOfEntries", "%" PRIu64 "",</div><div class='add'>+                num_entries);</div><div class='add'>+            XML_RET_CHECK_AND_GOTO(x_ret, out);</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+out:</div><div class='add'>+    if (x_ret &gt;= 0) {</div><div class='add'>+        x_ret = xmlTextWriterEndElement(glfsh_writer);</div><div class='add'>+        if (x_ret &gt;= 0) {</div><div class='add'>+            xmlTextWriterFlush(glfsh_writer);</div><div class='add'>+            x_ret = 0;</div><div class='add'>+        } else {</div><div class='add'>+            x_ret = -1;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    return x_ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+glfsh_print_xml_heal_op_summary(int ret, num_entries_t *num_entries)</div><div class='add'>+{</div><div class='add'>+    int x_ret = 0;</div><div class='add'>+</div><div class='add'>+    if (ret &lt; 0 &amp;&amp; num_entries == 0) {</div><div class='add'>+        x_ret = xmlTextWriterWriteFormatElement(</div><div class='add'>+            glfsh_writer, (xmlChar *)"status", "%s", strerror(-ret));</div><div class='add'>+        XML_RET_CHECK_AND_GOTO(x_ret, out);</div><div class='add'>+        x_ret = xmlTextWriterWriteFormatElement(</div><div class='add'>+            glfsh_writer, (xmlChar *)"totalNumberOfEntries", "-");</div><div class='add'>+        XML_RET_CHECK_AND_GOTO(x_ret, out);</div><div class='add'>+        x_ret = xmlTextWriterWriteFormatElement(</div><div class='add'>+            glfsh_writer, (xmlChar *)"numberOfEntriesInHealPending", "-");</div><div class='add'>+        XML_RET_CHECK_AND_GOTO(x_ret, out);</div><div class='add'>+        x_ret = xmlTextWriterWriteFormatElement(</div><div class='add'>+            glfsh_writer, (xmlChar *)"numberOfEntriesInSplitBrain", "-");</div><div class='add'>+        XML_RET_CHECK_AND_GOTO(x_ret, out);</div><div class='add'>+        x_ret = xmlTextWriterWriteFormatElement(</div><div class='add'>+            glfsh_writer, (xmlChar *)"numberOfEntriesPossiblyHealing", "-");</div><div class='add'>+        XML_RET_CHECK_AND_GOTO(x_ret, out);</div><div class='add'>+        goto out;</div><div class='add'>+    } else if (ret == 0) {</div><div class='add'>+        x_ret = xmlTextWriterWriteFormatElement(</div><div class='add'>+            glfsh_writer, (xmlChar *)"status", "%s", "Connected");</div><div class='add'>+        XML_RET_CHECK_AND_GOTO(x_ret, out);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        x_ret = xmlTextWriterWriteFormatElement(</div><div class='add'>+            glfsh_writer, (xmlChar *)"status",</div><div class='add'>+            "Failed to process entries"</div><div class='add'>+            " completely. "</div><div class='add'>+            "(%s)totalNumberOfEntries%" PRIu64 "",</div><div class='add'>+            strerror(-ret), num_entries-&gt;num_entries);</div><div class='add'>+        XML_RET_CHECK_AND_GOTO(x_ret, out);</div><div class='add'>+    } else {</div><div class='add'>+        x_ret = xmlTextWriterWriteFormatElement(</div><div class='add'>+            glfsh_writer, (xmlChar *)"totalNumberOfEntries", "%" PRIu64 "",</div><div class='add'>+            num_entries-&gt;num_entries);</div><div class='add'>+        XML_RET_CHECK_AND_GOTO(x_ret, out);</div><div class='add'>+        x_ret = xmlTextWriterWriteFormatElement(</div><div class='add'>+            glfsh_writer, (xmlChar *)"numberOfEntriesInHealPending",</div><div class='add'>+            "%" PRIu64 "", num_entries-&gt;pending_entries);</div><div class='add'>+        XML_RET_CHECK_AND_GOTO(x_ret, out);</div><div class='add'>+        x_ret = xmlTextWriterWriteFormatElement(</div><div class='add'>+            glfsh_writer, (xmlChar *)"numberOfEntriesInSplitBrain",</div><div class='add'>+            "%" PRIu64 "", num_entries-&gt;spb_entries);</div><div class='add'>+        XML_RET_CHECK_AND_GOTO(x_ret, out);</div><div class='add'>+        x_ret = xmlTextWriterWriteFormatElement(</div><div class='add'>+            glfsh_writer, (xmlChar *)"numberOfEntriesPossiblyHealing",</div><div class='add'>+            "%" PRIu64 "", num_entries-&gt;possibly_healing_entries);</div><div class='add'>+        XML_RET_CHECK_AND_GOTO(x_ret, out);</div><div class='add'>+    }</div><div class='add'>+out:</div><div class='add'>+    if (x_ret &gt;= 0) {</div><div class='add'>+        x_ret = xmlTextWriterEndElement(glfsh_writer);</div><div class='add'>+    }</div><div class='add'>+    return x_ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+glfsh_print_xml_file_status(char *path, uuid_t gfid, char *status)</div><div class='add'>+{</div><div class='add'>+    int x_ret = 0;</div><div class='add'>+</div><div class='add'>+    x_ret = xmlTextWriterStartElement(glfsh_writer, (xmlChar *)"file");</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(x_ret, out);</div><div class='add'>+    x_ret = xmlTextWriterWriteFormatAttribute(glfsh_writer, (xmlChar *)"gfid",</div><div class='add'>+                                              "%s", uuid_utoa(gfid));</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(x_ret, out);</div><div class='add'>+    x_ret = xmlTextWriterWriteFormatString(glfsh_writer, "%s", path);</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(x_ret, out);</div><div class='add'>+    x_ret = xmlTextWriterEndElement(glfsh_writer);</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(x_ret, out);</div><div class='add'>+    xmlTextWriterFlush(glfsh_writer);</div><div class='add'>+out:</div><div class='add'>+    return x_ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+glfsh_print_xml_brick_from_xl(xlator_t *xl, loc_t *rootloc)</div><div class='add'>+{</div><div class='add'>+    char *remote_host = NULL;</div><div class='add'>+    char *remote_subvol = NULL;</div><div class='add'>+    char *uuid = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    int x_ret = 0;</div><div class='add'>+</div><div class='add'>+    ret = dict_get_str(xl-&gt;options, "remote-host", &amp;remote_host);</div><div class='add'>+    if (ret &lt; 0)</div><div class='add'>+        goto print;</div><div class='add'>+</div><div class='add'>+    ret = dict_get_str(xl-&gt;options, "remote-subvolume", &amp;remote_subvol);</div><div class='add'>+    if (ret &lt; 0)</div><div class='add'>+        goto print;</div><div class='add'>+    ret = syncop_getxattr(xl, rootloc, &amp;xl-&gt;options, GF_XATTR_NODE_UUID_KEY,</div><div class='add'>+                          NULL, NULL);</div><div class='add'>+    if (ret &lt; 0)</div><div class='add'>+        goto print;</div><div class='add'>+</div><div class='add'>+    ret = dict_get_str(xl-&gt;options, GF_XATTR_NODE_UUID_KEY, &amp;uuid);</div><div class='add'>+    if (ret &lt; 0)</div><div class='add'>+        goto print;</div><div class='add'>+print:</div><div class='add'>+</div><div class='add'>+    x_ret = xmlTextWriterStartElement(glfsh_writer, (xmlChar *)"brick");</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(x_ret, xml_out);</div><div class='add'>+    x_ret = xmlTextWriterWriteFormatAttribute(</div><div class='add'>+        glfsh_writer, (xmlChar *)"hostUuid", "%s", uuid ? uuid : "-");</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(x_ret, xml_out);</div><div class='add'>+</div><div class='add'>+    x_ret = xmlTextWriterWriteFormatElement(</div><div class='add'>+        glfsh_writer, (xmlChar *)"name", "%s:%s",</div><div class='add'>+        remote_host ? remote_host : "-", remote_subvol ? remote_subvol : "-");</div><div class='add'>+    XML_RET_CHECK_AND_GOTO(x_ret, xml_out);</div><div class='add'>+    xmlTextWriterFlush(glfsh_writer);</div><div class='add'>+xml_out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+glfsh_link_inode_update_loc(loc_t *loc, struct iatt *iattr)</div><div class='add'>+{</div><div class='add'>+    inode_t *link_inode = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    link_inode = inode_link(loc-&gt;inode, NULL, NULL, iattr);</div><div class='add'>+    if (link_inode == NULL)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    inode_unref(loc-&gt;inode);</div><div class='add'>+    loc-&gt;inode = link_inode;</div><div class='add'>+    ret = 0;</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+glfsh_no_print_hr_heal_op_status(int ret, uint64_t num_entries, char *fmt_str)</div><div class='add'>+{</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+glfsh_print_hr_heal_op_summary(int ret, num_entries_t *num_entries)</div><div class='add'>+{</div><div class='add'>+    if (ret &lt; 0 &amp;&amp; num_entries-&gt;num_entries == 0) {</div><div class='add'>+        printf("Status: %s\n", strerror(-ret));</div><div class='add'>+        printf("Total Number of entries: -\n");</div><div class='add'>+        printf("Number of entries in heal pending: -\n");</div><div class='add'>+        printf("Number of entries in split-brain: -\n");</div><div class='add'>+        printf("Number of entries possibly healing: -\n");</div><div class='add'>+        goto out;</div><div class='add'>+    } else if (ret == 0) {</div><div class='add'>+        printf("Status: Connected\n");</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        printf(</div><div class='add'>+            "Status: Failed to process entries completely. "</div><div class='add'>+            "(%s)\nTotal Number of entries: %" PRIu64 "\n",</div><div class='add'>+            strerror(-ret), num_entries-&gt;num_entries);</div><div class='add'>+    } else {</div><div class='add'>+        printf("Total Number of entries: %" PRIu64 "\n",</div><div class='add'>+               num_entries-&gt;num_entries);</div><div class='add'>+        printf("Number of entries in heal pending: %" PRIu64 "\n",</div><div class='add'>+               num_entries-&gt;pending_entries);</div><div class='add'>+        printf("Number of entries in split-brain: %" PRIu64 "\n",</div><div class='add'>+               num_entries-&gt;spb_entries);</div><div class='add'>+        printf("Number of entries possibly healing: %" PRIu64 "\n",</div><div class='add'>+               num_entries-&gt;possibly_healing_entries);</div><div class='add'>+    }</div><div class='add'>+out:</div><div class='add'>+    printf("\n");</div><div class='add'>+    fflush(stdout);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+glfsh_print_hr_heal_op_status(int ret, uint64_t num_entries, char *fmt_str)</div><div class='add'>+{</div><div class='add'>+    if (ret &lt; 0 &amp;&amp; num_entries == 0) {</div><div class='add'>+        printf("Status: %s\n", strerror(-ret));</div><div class='add'>+        if (fmt_str)</div><div class='add'>+            printf("%s -\n", fmt_str);</div><div class='add'>+        goto out;</div><div class='add'>+    } else if (ret == 0) {</div><div class='add'>+        printf("Status: Connected\n");</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        if (fmt_str)</div><div class='add'>+            printf(</div><div class='add'>+                "Status: Failed to process entries completely. "</div><div class='add'>+                "(%s)\n%s %" PRIu64 "\n",</div><div class='add'>+                strerror(-ret), fmt_str, num_entries);</div><div class='add'>+    } else {</div><div class='add'>+        if (fmt_str)</div><div class='add'>+            printf("%s %" PRIu64 "\n", fmt_str, num_entries);</div><div class='add'>+    }</div><div class='add'>+out:</div><div class='add'>+    printf("\n");</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+glfsh_print_info_summary(int ret, num_entries_t *num_entries)</div><div class='add'>+{</div><div class='add'>+    return glfsh_output-&gt;print_heal_op_summary(ret, num_entries);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+glfsh_print_heal_op_status(int ret, uint64_t num_entries,</div><div class='add'>+                           gf_xl_afr_op_t heal_op)</div><div class='add'>+{</div><div class='add'>+    char *fmt_str = NULL;</div><div class='add'>+</div><div class='add'>+    if (heal_op == GF_SHD_OP_INDEX_SUMMARY)</div><div class='add'>+        fmt_str = "Number of entries:";</div><div class='add'>+    else if (heal_op == GF_SHD_OP_SPLIT_BRAIN_FILES)</div><div class='add'>+        fmt_str = "Number of entries in split-brain:";</div><div class='add'>+    else if (heal_op == GF_SHD_OP_SBRAIN_HEAL_FROM_BRICK)</div><div class='add'>+        fmt_str = "Number of healed entries:";</div><div class='add'>+</div><div class='add'>+    return glfsh_output-&gt;print_heal_op_status(ret, num_entries, fmt_str);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+glfsh_get_index_dir_loc(loc_t *rootloc, xlator_t *xl, loc_t *dirloc,</div><div class='add'>+                        int32_t *op_errno, char *vgfid)</div><div class='add'>+{</div><div class='add'>+    void *index_gfid = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    dict_t *xattr = NULL;</div><div class='add'>+    struct iatt iattr = {0};</div><div class='add'>+    struct iatt parent = {0};</div><div class='add'>+</div><div class='add'>+    ret = syncop_getxattr(xl, rootloc, &amp;xattr, vgfid, NULL, NULL);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        *op_errno = -ret;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_get_ptr(xattr, vgfid, &amp;index_gfid);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        *op_errno = EINVAL;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    gf_uuid_copy(dirloc-&gt;gfid, index_gfid);</div><div class='add'>+    dirloc-&gt;path = "";</div><div class='add'>+    dirloc-&gt;inode = inode_new(rootloc-&gt;inode-&gt;table);</div><div class='add'>+    ret = syncop_lookup(xl, dirloc, &amp;iattr, &amp;parent, NULL, NULL);</div><div class='add'>+    dirloc-&gt;path = NULL;</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        *op_errno = -ret;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    ret = glfsh_link_inode_update_loc(dirloc, &amp;iattr);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    ret = glfs_loc_touchup(dirloc);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        *op_errno = errno;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+out:</div><div class='add'>+    if (xattr)</div><div class='add'>+        dict_unref(xattr);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static xlator_t *</div><div class='add'>+_get_ancestor(xlator_t *xl, gf_xl_afr_op_t heal_op)</div><div class='add'>+{</div><div class='add'>+    static char *replica_xl[] = {"cluster/replicate", NULL};</div><div class='add'>+    static char *heal_xls[] = {"cluster/replicate", "cluster/disperse", NULL};</div><div class='add'>+    char **ancestors = NULL;</div><div class='add'>+</div><div class='add'>+    if (heal_op == GF_SHD_OP_INDEX_SUMMARY || heal_op == GF_SHD_OP_HEAL_SUMMARY)</div><div class='add'>+        ancestors = heal_xls;</div><div class='add'>+    else</div><div class='add'>+        ancestors = replica_xl;</div><div class='add'>+</div><div class='add'>+    if (!xl || !xl-&gt;parents)</div><div class='add'>+        return NULL;</div><div class='add'>+</div><div class='add'>+    while (xl-&gt;parents) {</div><div class='add'>+        xl = xl-&gt;parents-&gt;xlator;</div><div class='add'>+        if (!xl)</div><div class='add'>+            break;</div><div class='add'>+        if (gf_get_index_by_elem(ancestors, xl-&gt;type) != -1)</div><div class='add'>+            return xl;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return NULL;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+glfsh_index_purge(xlator_t *subvol, inode_t *inode, char *name)</div><div class='add'>+{</div><div class='add'>+    loc_t loc = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    loc.parent = inode_ref(inode);</div><div class='add'>+    loc.name = name;</div><div class='add'>+</div><div class='add'>+    ret = syncop_unlink(subvol, &amp;loc, NULL, NULL);</div><div class='add'>+</div><div class='add'>+    loc_wipe(&amp;loc);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+glfsh_print_summary_status(dict_t *dict, char *path, uuid_t gfid,</div><div class='add'>+                           num_entries_t *num_entries, gf_boolean_t flag)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+    char *value = NULL;</div><div class='add'>+</div><div class='add'>+    ret = dict_get_str(dict, "heal-info", &amp;value);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    if ((!strcmp(value, "heal")) || (!strcmp(value, "heal-pending"))) {</div><div class='add'>+        (num_entries-&gt;pending_entries)++;</div><div class='add'>+    } else if ((!strcmp(value, "split-brain")) ||</div><div class='add'>+               (!strcmp(value, "split-brain-pending"))) {</div><div class='add'>+        (num_entries-&gt;spb_entries)++;</div><div class='add'>+    } else if ((!strcmp(value, "possibly-healing-pending")) ||</div><div class='add'>+               (!strcmp(value, "possibly-healing"))) {</div><div class='add'>+        (num_entries-&gt;possibly_healing_entries)++;</div><div class='add'>+    } else {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    (num_entries-&gt;num_entries)++;</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+glfsh_print_spb_status(dict_t *dict, char *path, uuid_t gfid,</div><div class='add'>+                       num_entries_t *num_entries, gf_boolean_t flag)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+    gf_boolean_t pending = _gf_false;</div><div class='add'>+    gf_boolean_t split_b = _gf_false;</div><div class='add'>+    char *value = NULL;</div><div class='add'>+    char gfid_str[64] = {0};</div><div class='add'>+</div><div class='add'>+    ret = dict_get_str(dict, "heal-info", &amp;value);</div><div class='add'>+    if (ret)</div><div class='add'>+        return 0;</div><div class='add'>+</div><div class='add'>+    if (!strcmp(value, "split-brain")) {</div><div class='add'>+        split_b = _gf_true;</div><div class='add'>+    } else if (!strcmp(value, "split-brain-pending")) {</div><div class='add'>+        split_b = _gf_true;</div><div class='add'>+        pending = _gf_true;</div><div class='add'>+    }</div><div class='add'>+    /* Consider the entry only iff :</div><div class='add'>+     * 1) The dir being processed is not indices/dirty, indicated by</div><div class='add'>+     *    flag == _gf_false</div><div class='add'>+     * 2) The dir being processed is indices/dirty but the entry also</div><div class='add'>+     *    exists in indices/xattrop dir and has already been processed.</div><div class='add'>+     */</div><div class='add'>+    if (split_b) {</div><div class='add'>+        if (!flag || (flag &amp;&amp; !pending)) {</div><div class='add'>+            (num_entries-&gt;num_entries)++;</div><div class='add'>+            glfsh_output-&gt;print_spb_status(</div><div class='add'>+                path ? path : uuid_utoa_r(gfid, gfid_str), gfid, NULL);</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+glfsh_print_heal_status(dict_t *dict, char *path, uuid_t gfid,</div><div class='add'>+                        num_entries_t *num_entries, gf_boolean_t ignore_dirty)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+    gf_boolean_t pending = _gf_false;</div><div class='add'>+    char *status = NULL;</div><div class='add'>+    char *value = NULL;</div><div class='add'>+    char gfid_str[64] = {0};</div><div class='add'>+</div><div class='add'>+    ret = dict_get_str(dict, "heal-info", &amp;value);</div><div class='add'>+    if (ret || (!strcmp(value, "no-heal")))</div><div class='add'>+        return 0;</div><div class='add'>+</div><div class='add'>+    if (!strcmp(value, "heal")) {</div><div class='add'>+        ret = gf_asprintf(&amp;status, " ");</div><div class='add'>+        if (ret &lt; 0)</div><div class='add'>+            goto out;</div><div class='add'>+    } else if (!strcmp(value, "possibly-healing")) {</div><div class='add'>+        ret = gf_asprintf(&amp;status, " - Possibly undergoing heal");</div><div class='add'>+        if (ret &lt; 0)</div><div class='add'>+            goto out;</div><div class='add'>+    } else if (!strcmp(value, "split-brain")) {</div><div class='add'>+        ret = gf_asprintf(&amp;status, " - Is in split-brain");</div><div class='add'>+        if (ret &lt; 0)</div><div class='add'>+            goto out;</div><div class='add'>+    } else if (!strcmp(value, "heal-pending")) {</div><div class='add'>+        pending = _gf_true;</div><div class='add'>+        ret = gf_asprintf(&amp;status, " ");</div><div class='add'>+        if (ret &lt; 0)</div><div class='add'>+            goto out;</div><div class='add'>+    } else if (!strcmp(value, "split-brain-pending")) {</div><div class='add'>+        pending = _gf_true;</div><div class='add'>+        ret = gf_asprintf(&amp;status, " - Is in split-brain");</div><div class='add'>+        if (ret &lt; 0)</div><div class='add'>+            goto out;</div><div class='add'>+    } else if (!strcmp(value, "possibly-healing-pending")) {</div><div class='add'>+        pending = _gf_true;</div><div class='add'>+        ret = gf_asprintf(&amp;status, " - Possibly undergoing heal");</div><div class='add'>+        if (ret &lt; 0)</div><div class='add'>+            goto out;</div><div class='add'>+    }</div><div class='add'>+out:</div><div class='add'>+    /* If ignore_dirty is set, it means indices/dirty directory is</div><div class='add'>+     * being processed. Ignore the entry if it also exists in</div><div class='add'>+     * indices/xattrop.</div><div class='add'>+     * Boolean pending is set to true if the entry also exists in</div><div class='add'>+     * indices/xattrop directory.</div><div class='add'>+     */</div><div class='add'>+    if (ignore_dirty) {</div><div class='add'>+        if (pending) {</div><div class='add'>+            GF_FREE(status);</div><div class='add'>+            status = NULL;</div><div class='add'>+            return 0;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    if (ret == -1)</div><div class='add'>+        status = NULL;</div><div class='add'>+</div><div class='add'>+    (num_entries-&gt;num_entries)++;</div><div class='add'>+    glfsh_output-&gt;print_heal_status(path ? path : uuid_utoa_r(gfid, gfid_str),</div><div class='add'>+                                    gfid, status ? status : "");</div><div class='add'>+</div><div class='add'>+    GF_FREE(status);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+glfsh_heal_status_boolean(dict_t *dict, char *path, uuid_t gfid,</div><div class='add'>+                          num_entries_t *num_entries, gf_boolean_t ignore_dirty)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+    char *value = NULL;</div><div class='add'>+</div><div class='add'>+    ret = dict_get_str(dict, "heal-info", &amp;value);</div><div class='add'>+    if ((!ret) &amp;&amp; (!strcmp(value, "no-heal")))</div><div class='add'>+        return 0;</div><div class='add'>+    else</div><div class='add'>+        return -1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+glfsh_heal_entries(glfs_t *fs, xlator_t *top_subvol, loc_t *rootloc,</div><div class='add'>+                   gf_dirent_t *entries, uint64_t *offset,</div><div class='add'>+                   num_entries_t *num_entries, dict_t *xattr_req)</div><div class='add'>+{</div><div class='add'>+    gf_dirent_t *entry = NULL;</div><div class='add'>+    gf_dirent_t *tmp = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    char file[64] = {0};</div><div class='add'>+</div><div class='add'>+    list_for_each_entry_safe(entry, tmp, &amp;entries-&gt;list, list)</div><div class='add'>+    {</div><div class='add'>+        *offset = entry-&gt;d_off;</div><div class='add'>+        if ((strcmp(entry-&gt;d_name, ".") == 0) ||</div><div class='add'>+            (strcmp(entry-&gt;d_name, "..") == 0))</div><div class='add'>+            continue;</div><div class='add'>+        snprintf(file, sizeof(file), "gfid:%s", entry-&gt;d_name);</div><div class='add'>+        ret = glfsh_heal_splitbrain_file(fs, top_subvol, rootloc, file,</div><div class='add'>+                                         xattr_req);</div><div class='add'>+        if (ret)</div><div class='add'>+            continue;</div><div class='add'>+        (num_entries-&gt;num_entries)++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+glfsh_process_entries(xlator_t *xl, fd_t *fd, gf_dirent_t *entries,</div><div class='add'>+                      uint64_t *offset, num_entries_t *num_entries,</div><div class='add'>+                      print_status glfsh_print_status,</div><div class='add'>+                      gf_boolean_t ignore_dirty, glfsh_fail_mode_t mode)</div><div class='add'>+{</div><div class='add'>+    gf_dirent_t *entry = NULL;</div><div class='add'>+    gf_dirent_t *tmp = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    int print_status = 0;</div><div class='add'>+    char *path = NULL;</div><div class='add'>+    uuid_t gfid = {0};</div><div class='add'>+    xlator_t *this = NULL;</div><div class='add'>+    dict_t *dict = NULL;</div><div class='add'>+    loc_t loc = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    this = THIS;</div><div class='add'>+</div><div class='add'>+    list_for_each_entry_safe(entry, tmp, &amp;entries-&gt;list, list)</div><div class='add'>+    {</div><div class='add'>+        *offset = entry-&gt;d_off;</div><div class='add'>+        if ((strcmp(entry-&gt;d_name, ".") == 0) ||</div><div class='add'>+            (strcmp(entry-&gt;d_name, "..") == 0))</div><div class='add'>+            continue;</div><div class='add'>+</div><div class='add'>+        if (dict) {</div><div class='add'>+            dict_unref(dict);</div><div class='add'>+            dict = NULL;</div><div class='add'>+        }</div><div class='add'>+        gf_uuid_clear(gfid);</div><div class='add'>+        GF_FREE(path);</div><div class='add'>+        path = NULL;</div><div class='add'>+</div><div class='add'>+        gf_uuid_parse(entry-&gt;d_name, gfid);</div><div class='add'>+        gf_uuid_copy(loc.gfid, gfid);</div><div class='add'>+        ret = syncop_getxattr(this, &amp;loc, &amp;dict, GF_HEAL_INFO, NULL, NULL);</div><div class='add'>+        if (ret) {</div><div class='add'>+            if ((mode != GLFSH_MODE_CONTINUE_ON_ERROR) &amp;&amp; (ret == -ENOTCONN))</div><div class='add'>+                goto out;</div><div class='add'>+            else</div><div class='add'>+                continue;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        ret = syncop_gfid_to_path(this-&gt;itable, xl, gfid, &amp;path);</div><div class='add'>+</div><div class='add'>+        if (ret == -ENOENT || ret == -ESTALE) {</div><div class='add'>+            glfsh_index_purge(xl, fd-&gt;inode, entry-&gt;d_name);</div><div class='add'>+            ret = 0;</div><div class='add'>+            continue;</div><div class='add'>+        }</div><div class='add'>+        if (dict) {</div><div class='add'>+            print_status = glfsh_print_status(dict, path, gfid, num_entries,</div><div class='add'>+                                              ignore_dirty);</div><div class='add'>+            if ((print_status) &amp;&amp; (mode != GLFSH_MODE_CONTINUE_ON_ERROR)) {</div><div class='add'>+                ret = -EAGAIN;</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    ret = 0;</div><div class='add'>+out:</div><div class='add'>+    GF_FREE(path);</div><div class='add'>+    if (dict) {</div><div class='add'>+        dict_unref(dict);</div><div class='add'>+        dict = NULL;</div><div class='add'>+    }</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+glfsh_crawl_directory(glfs_t *fs, xlator_t *top_subvol, loc_t *rootloc,</div><div class='add'>+                      xlator_t *readdir_xl, fd_t *fd, loc_t *loc,</div><div class='add'>+                      dict_t *xattr_req, num_entries_t *num_entries,</div><div class='add'>+                      gf_boolean_t ignore)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+    int heal_op = -1;</div><div class='add'>+    uint64_t offset = 0;</div><div class='add'>+    gf_dirent_t entries;</div><div class='add'>+    gf_boolean_t free_entries = _gf_false;</div><div class='add'>+    glfsh_fail_mode_t mode = GLFSH_MODE_CONTINUE_ON_ERROR;</div><div class='add'>+</div><div class='add'>+    INIT_LIST_HEAD(&amp;entries.list);</div><div class='add'>+    ret = dict_get_int32(xattr_req, "heal-op", &amp;heal_op);</div><div class='add'>+    if (ret)</div><div class='add'>+        return ret;</div><div class='add'>+</div><div class='add'>+    if (heal_op == GF_SHD_OP_GRANULAR_ENTRY_HEAL_ENABLE)</div><div class='add'>+        mode = GLFSH_MODE_EXIT_ON_FIRST_FAILURE;</div><div class='add'>+</div><div class='add'>+    while (1) {</div><div class='add'>+        ret = syncop_readdir(readdir_xl, fd, 131072, offset, &amp;entries, NULL,</div><div class='add'>+                             NULL);</div><div class='add'>+        if (ret &lt;= 0)</div><div class='add'>+            break;</div><div class='add'>+        ret = 0;</div><div class='add'>+        free_entries = _gf_true;</div><div class='add'>+</div><div class='add'>+        if (list_empty(&amp;entries.list))</div><div class='add'>+            goto out;</div><div class='add'>+</div><div class='add'>+        if (heal_op == GF_SHD_OP_INDEX_SUMMARY) {</div><div class='add'>+            ret = glfsh_process_entries(readdir_xl, fd, &amp;entries, &amp;offset,</div><div class='add'>+                                        num_entries, glfsh_print_heal_status,</div><div class='add'>+                                        ignore, mode);</div><div class='add'>+            if (ret &lt; 0)</div><div class='add'>+                goto out;</div><div class='add'>+        } else if (heal_op == GF_SHD_OP_SPLIT_BRAIN_FILES) {</div><div class='add'>+            ret = glfsh_process_entries(readdir_xl, fd, &amp;entries, &amp;offset,</div><div class='add'>+                                        num_entries, glfsh_print_spb_status,</div><div class='add'>+                                        ignore, mode);</div><div class='add'>+            if (ret &lt; 0)</div><div class='add'>+                goto out;</div><div class='add'>+        } else if (heal_op == GF_SHD_OP_HEAL_SUMMARY) {</div><div class='add'>+            ret = glfsh_process_entries(readdir_xl, fd, &amp;entries, &amp;offset,</div><div class='add'>+                                        num_entries, glfsh_print_summary_status,</div><div class='add'>+                                        ignore, mode);</div><div class='add'>+            if (ret &lt; 0)</div><div class='add'>+                goto out;</div><div class='add'>+        } else if (heal_op == GF_SHD_OP_SBRAIN_HEAL_FROM_BRICK) {</div><div class='add'>+            glfsh_heal_entries(fs, top_subvol, rootloc, &amp;entries, &amp;offset,</div><div class='add'>+                               num_entries, xattr_req);</div><div class='add'>+        } else if (heal_op == GF_SHD_OP_GRANULAR_ENTRY_HEAL_ENABLE) {</div><div class='add'>+            ret = glfsh_process_entries(readdir_xl, fd, &amp;entries, &amp;offset,</div><div class='add'>+                                        num_entries, glfsh_heal_status_boolean,</div><div class='add'>+                                        ignore, mode);</div><div class='add'>+            if (ret &lt; 0)</div><div class='add'>+                goto out;</div><div class='add'>+        }</div><div class='add'>+        gf_dirent_free(&amp;entries);</div><div class='add'>+        free_entries = _gf_false;</div><div class='add'>+    }</div><div class='add'>+    ret = 0;</div><div class='add'>+out:</div><div class='add'>+    if (free_entries)</div><div class='add'>+        gf_dirent_free(&amp;entries);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+glfsh_no_print_brick_from_xl(xlator_t *xl, loc_t *rootloc)</div><div class='add'>+{</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+glfsh_print_brick_from_xl(xlator_t *xl, loc_t *rootloc)</div><div class='add'>+{</div><div class='add'>+    char *remote_host = NULL;</div><div class='add'>+    char *remote_subvol = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    ret = dict_get_str(xl-&gt;options, "remote-host", &amp;remote_host);</div><div class='add'>+    if (ret &lt; 0)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    ret = dict_get_str(xl-&gt;options, "remote-subvolume", &amp;remote_subvol);</div><div class='add'>+    if (ret &lt; 0)</div><div class='add'>+        goto out;</div><div class='add'>+out:</div><div class='add'>+    if (ret &lt; 0)</div><div class='add'>+        printf("Brick - Not able to get brick information\n");</div><div class='add'>+    else</div><div class='add'>+        printf("Brick %s:%s\n", remote_host, remote_subvol);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+glfsh_print_pending_heals_type(glfs_t *fs, xlator_t *top_subvol, loc_t *rootloc,</div><div class='add'>+                               xlator_t *xl, gf_xl_afr_op_t heal_op,</div><div class='add'>+                               dict_t *xattr_req, char *vgfid,</div><div class='add'>+                               num_entries_t *num_entries)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+    loc_t dirloc = {0};</div><div class='add'>+    fd_t *fd = NULL;</div><div class='add'>+    int32_t op_errno = 0;</div><div class='add'>+    gf_boolean_t ignore = _gf_false;</div><div class='add'>+</div><div class='add'>+    if (!strcmp(vgfid, GF_XATTROP_DIRTY_GFID))</div><div class='add'>+        ignore = _gf_true;</div><div class='add'>+</div><div class='add'>+    ret = glfsh_get_index_dir_loc(rootloc, xl, &amp;dirloc, &amp;op_errno, vgfid);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        if (op_errno == ESTALE || op_errno == ENOENT || op_errno == ENOTSUP)</div><div class='add'>+            ret = 0;</div><div class='add'>+        else</div><div class='add'>+            ret = -op_errno;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = syncop_dirfd(xl, &amp;dirloc, &amp;fd, GF_CLIENT_PID_GLFS_HEAL);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    ret = glfsh_crawl_directory(fs, top_subvol, rootloc, xl, fd, &amp;dirloc,</div><div class='add'>+                                xattr_req, num_entries, ignore);</div><div class='add'>+    if (fd)</div><div class='add'>+        fd_unref(fd);</div><div class='add'>+out:</div><div class='add'>+    loc_wipe(&amp;dirloc);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+glfsh_print_pending_heals(glfs_t *fs, xlator_t *top_subvol, loc_t *rootloc,</div><div class='add'>+                          xlator_t *xl, gf_xl_afr_op_t heal_op,</div><div class='add'>+                          gf_boolean_t is_parent_replicate)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+    num_entries_t num_entries = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    num_entries_t total = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    dict_t *xattr_req = NULL;</div><div class='add'>+</div><div class='add'>+    xattr_req = dict_new();</div><div class='add'>+    if (!xattr_req)</div><div class='add'>+        goto out;</div><div class='add'>+    ret = dict_set_int32(xattr_req, "heal-op", heal_op);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    if ((!is_parent_replicate) &amp;&amp;</div><div class='add'>+        ((heal_op == GF_SHD_OP_GRANULAR_ENTRY_HEAL_ENABLE) ||</div><div class='add'>+         (heal_op == GF_SHD_OP_GRANULAR_ENTRY_HEAL_DISABLE))) {</div><div class='add'>+        ret = 0;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = glfsh_output-&gt;print_brick_from_xl(xl, rootloc);</div><div class='add'>+    if (ret &lt; 0)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    ret = glfsh_print_pending_heals_type(fs, top_subvol, rootloc, xl, heal_op,</div><div class='add'>+                                         xattr_req, GF_XATTROP_INDEX_GFID,</div><div class='add'>+                                         &amp;num_entries);</div><div class='add'>+</div><div class='add'>+    if (ret &lt; 0 &amp;&amp; heal_op == GF_SHD_OP_GRANULAR_ENTRY_HEAL_ENABLE)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    total.num_entries += num_entries.num_entries;</div><div class='add'>+    total.pending_entries += num_entries.pending_entries;</div><div class='add'>+    total.spb_entries += num_entries.spb_entries;</div><div class='add'>+    total.possibly_healing_entries += num_entries.possibly_healing_entries;</div><div class='add'>+    num_entries.num_entries = 0;</div><div class='add'>+    num_entries.pending_entries = 0;</div><div class='add'>+    num_entries.spb_entries = 0;</div><div class='add'>+    num_entries.possibly_healing_entries = 0;</div><div class='add'>+    if (ret == -ENOTCONN)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    if (is_parent_replicate) {</div><div class='add'>+        ret = glfsh_print_pending_heals_type(</div><div class='add'>+            fs, top_subvol, rootloc, xl, heal_op, xattr_req,</div><div class='add'>+            GF_XATTROP_DIRTY_GFID, &amp;num_entries);</div><div class='add'>+        total.num_entries += num_entries.num_entries;</div><div class='add'>+        total.pending_entries += num_entries.pending_entries;</div><div class='add'>+        total.spb_entries += num_entries.spb_entries;</div><div class='add'>+        total.possibly_healing_entries += num_entries.possibly_healing_entries;</div><div class='add'>+    }</div><div class='add'>+out:</div><div class='add'>+    if (xattr_req)</div><div class='add'>+        dict_unref(xattr_req);</div><div class='add'>+    if (heal_op == GF_SHD_OP_HEAL_SUMMARY) {</div><div class='add'>+        glfsh_print_info_summary(ret, &amp;total);</div><div class='add'>+    } else {</div><div class='add'>+        glfsh_print_heal_op_status(ret, total.num_entries, heal_op);</div><div class='add'>+    }</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+glfsh_set_heal_options(glfs_t *fs, gf_xl_afr_op_t heal_op)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    ret = glfs_set_xlator_option(fs, "*-replicate-*",</div><div class='add'>+                                 "background-self-heal-count", "0");</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    ret = glfs_set_xlator_option(fs, "*-replicate-*", "halo-enabled", "off");</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    if ((heal_op != GF_SHD_OP_SBRAIN_HEAL_FROM_BIGGER_FILE) &amp;&amp;</div><div class='add'>+        (heal_op != GF_SHD_OP_SBRAIN_HEAL_FROM_BRICK) &amp;&amp;</div><div class='add'>+        (heal_op != GF_SHD_OP_SBRAIN_HEAL_FROM_LATEST_MTIME))</div><div class='add'>+        return 0;</div><div class='add'>+    ret = glfs_set_xlator_option(fs, "*-replicate-*", "data-self-heal", "on");</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    ret = glfs_set_xlator_option(fs, "*-replicate-*", "metadata-self-heal",</div><div class='add'>+                                 "on");</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    ret = glfs_set_xlator_option(fs, "*-replicate-*", "entry-self-heal", "on");</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+glfsh_validate_volume(xlator_t *xl, gf_xl_afr_op_t heal_op)</div><div class='add'>+{</div><div class='add'>+    xlator_t *heal_xl = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    while (xl-&gt;next)</div><div class='add'>+        xl = xl-&gt;next;</div><div class='add'>+</div><div class='add'>+    while (xl) {</div><div class='add'>+        if (strcmp(xl-&gt;type, "protocol/client") == 0) {</div><div class='add'>+            heal_xl = _get_ancestor(xl, heal_op);</div><div class='add'>+            if (heal_xl) {</div><div class='add'>+                ret = 0;</div><div class='add'>+                break;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        xl = xl-&gt;prev;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static xlator_t *</div><div class='add'>+_brick_path_to_client_xlator(xlator_t *top_subvol, char *hostname,</div><div class='add'>+                             char *brickpath)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+    xlator_t *xl = NULL;</div><div class='add'>+    char *remote_host = NULL;</div><div class='add'>+    char *remote_subvol = NULL;</div><div class='add'>+</div><div class='add'>+    xl = top_subvol;</div><div class='add'>+</div><div class='add'>+    while (xl-&gt;next)</div><div class='add'>+        xl = xl-&gt;next;</div><div class='add'>+</div><div class='add'>+    while (xl) {</div><div class='add'>+        if (!strcmp(xl-&gt;type, "protocol/client")) {</div><div class='add'>+            ret = dict_get_str(xl-&gt;options, "remote-host", &amp;remote_host);</div><div class='add'>+            if (ret &lt; 0)</div><div class='add'>+                goto out;</div><div class='add'>+            ret = dict_get_str(xl-&gt;options, "remote-subvolume", &amp;remote_subvol);</div><div class='add'>+            if (ret &lt; 0)</div><div class='add'>+                goto out;</div><div class='add'>+            if (!strcmp(hostname, remote_host) &amp;&amp;</div><div class='add'>+                !strcmp(brickpath, remote_subvol))</div><div class='add'>+                return xl;</div><div class='add'>+        }</div><div class='add'>+        xl = xl-&gt;prev;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return NULL;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+glfsh_gather_heal_info(glfs_t *fs, xlator_t *top_subvol, loc_t *rootloc,</div><div class='add'>+                       gf_xl_afr_op_t heal_op)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+    xlator_t *xl = NULL;</div><div class='add'>+    xlator_t *heal_xl = NULL;</div><div class='add'>+    xlator_t *old_THIS = NULL;</div><div class='add'>+</div><div class='add'>+    xl = top_subvol;</div><div class='add'>+    while (xl-&gt;next)</div><div class='add'>+        xl = xl-&gt;next;</div><div class='add'>+    while (xl) {</div><div class='add'>+        if (strcmp(xl-&gt;type, "protocol/client") == 0 &amp;&amp;</div><div class='add'>+            !strstr(xl-&gt;name, "-ta-")) {</div><div class='add'>+            heal_xl = _get_ancestor(xl, heal_op);</div><div class='add'>+            if (heal_xl) {</div><div class='add'>+                old_THIS = THIS;</div><div class='add'>+                THIS = heal_xl;</div><div class='add'>+                ret = glfsh_print_pending_heals(</div><div class='add'>+                    fs, top_subvol, rootloc, xl, heal_op,</div><div class='add'>+                    !strcmp(heal_xl-&gt;type, "cluster/replicate"));</div><div class='add'>+                THIS = old_THIS;</div><div class='add'>+</div><div class='add'>+                if ((ret &lt; 0) &amp;&amp;</div><div class='add'>+                    (heal_op == GF_SHD_OP_GRANULAR_ENTRY_HEAL_ENABLE))</div><div class='add'>+                    goto out;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        xl = xl-&gt;prev;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (heal_op != GF_SHD_OP_GRANULAR_ENTRY_HEAL_ENABLE)</div><div class='add'>+        ret = 0;</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+_validate_directory(dict_t *xattr_req, char *file)</div><div class='add'>+{</div><div class='add'>+    int heal_op = -1;</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    ret = dict_get_int32(xattr_req, "heal-op", &amp;heal_op);</div><div class='add'>+    if (ret)</div><div class='add'>+        return ret;</div><div class='add'>+</div><div class='add'>+    if (heal_op == GF_SHD_OP_SBRAIN_HEAL_FROM_BIGGER_FILE) {</div><div class='add'>+        printf("'bigger-file' not a valid option for directories.\n");</div><div class='add'>+        ret = -1;</div><div class='add'>+    } else if (heal_op == GF_SHD_OP_SBRAIN_HEAL_FROM_BRICK) {</div><div class='add'>+        printf(</div><div class='add'>+            "'source-brick' option used on a directory (%s). "</div><div class='add'>+            "Performing conservative merge.\n",</div><div class='add'>+            file);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+glfsh_heal_splitbrain_file(glfs_t *fs, xlator_t *top_subvol, loc_t *rootloc,</div><div class='add'>+                           char *file, dict_t *xattr_req)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int reval = 0;</div><div class='add'>+    loc_t loc = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    char *path = NULL;</div><div class='add'>+    char *path1 = NULL;</div><div class='add'>+    char *path2 = NULL;</div><div class='add'>+    char *filename = NULL;</div><div class='add'>+    char *filename1 = NULL;</div><div class='add'>+    struct iatt iatt = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    xlator_t *xl = top_subvol;</div><div class='add'>+    dict_t *xattr_rsp = NULL;</div><div class='add'>+    char *sh_fail_msg = NULL;</div><div class='add'>+    char *gfid_heal_msg = NULL;</div><div class='add'>+    int32_t op_errno = 0;</div><div class='add'>+    gf_boolean_t flag = _gf_false;</div><div class='add'>+</div><div class='add'>+    if (!strncmp(file, "gfid:", 5)) {</div><div class='add'>+        filename = gf_strdup(file);</div><div class='add'>+        if (!filename) {</div><div class='add'>+            printf("Error allocating memory to filename\n");</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+        path = strtok(filename, ":");</div><div class='add'>+        path = strtok(NULL, ";");</div><div class='add'>+        gf_uuid_parse(path, loc.gfid);</div><div class='add'>+        loc.path = gf_strdup(uuid_utoa(loc.gfid));</div><div class='add'>+        if (!loc.path) {</div><div class='add'>+            printf("Error allocating memory to path\n");</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+        loc.inode = inode_new(rootloc-&gt;inode-&gt;table);</div><div class='add'>+        if (!loc.inode) {</div><div class='add'>+            printf("Error getting inode\n");</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+        ret = syncop_lookup(xl, &amp;loc, &amp;iatt, 0, xattr_req, &amp;xattr_rsp);</div><div class='add'>+        if (ret) {</div><div class='add'>+            op_errno = -ret;</div><div class='add'>+            printf("Lookup failed on %s:%s.\n", file, strerror(op_errno));</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    } else {</div><div class='add'>+        if (file[0] != '/') {</div><div class='add'>+            printf(</div><div class='add'>+                "&lt;FILE&gt; must be absolute path w.r.t. the "</div><div class='add'>+                "volume, starting with '/'\n");</div><div class='add'>+            ret = -1;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+        path1 = gf_strdup(file);</div><div class='add'>+        if (!path1) {</div><div class='add'>+            printf("Error allocating memory to path\n");</div><div class='add'>+            ret = -1;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+        path2 = gf_strdup(file);</div><div class='add'>+        if (!path2) {</div><div class='add'>+            printf("Error allocating memory to path\n");</div><div class='add'>+            ret = -1;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+        path = dirname(path1);</div><div class='add'>+        filename1 = basename(path2);</div><div class='add'>+    retry1:</div><div class='add'>+        ret = glfs_resolve(fs, xl, path, &amp;loc, &amp;iatt, reval);</div><div class='add'>+        ESTALE_RETRY(ret, errno, reval, &amp;loc, retry1);</div><div class='add'>+        if (ret) {</div><div class='add'>+            printf("Lookup failed on %s:%s\n", path, strerror(errno));</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+        GF_FREE((char *)loc.path);</div><div class='add'>+        loc.path = gf_strdup(file);</div><div class='add'>+        if (!loc.path) {</div><div class='add'>+            printf("Error allocating memory for path\n");</div><div class='add'>+            ret = -1;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+        loc.parent = inode_unref(loc.parent);</div><div class='add'>+        loc.parent = inode_ref(loc.inode);</div><div class='add'>+        loc.inode = inode_unref(loc.inode);</div><div class='add'>+        loc.inode = inode_new(rootloc-&gt;inode-&gt;table);</div><div class='add'>+        if (!loc.inode) {</div><div class='add'>+            printf("Error getting inode\n");</div><div class='add'>+            ret = -1;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+        loc.name = filename1;</div><div class='add'>+        gf_uuid_copy(loc.pargfid, loc.gfid);</div><div class='add'>+        gf_uuid_clear(loc.gfid);</div><div class='add'>+</div><div class='add'>+        ret = syncop_lookup(xl, &amp;loc, &amp;iatt, 0, xattr_req, &amp;xattr_rsp);</div><div class='add'>+        if (ret) {</div><div class='add'>+            op_errno = -ret;</div><div class='add'>+            printf("Lookup failed on %s:%s.\n", file, strerror(op_errno));</div><div class='add'>+            flag = _gf_true;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        ret = dict_get_str(xattr_rsp, "gfid-heal-msg", &amp;gfid_heal_msg);</div><div class='add'>+        if (!ret) {</div><div class='add'>+            printf("%s for file %s\n", gfid_heal_msg, file);</div><div class='add'>+            loc_wipe(&amp;loc);</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+        if (flag)</div><div class='add'>+            goto out;</div><div class='add'>+</div><div class='add'>+        reval = 0;</div><div class='add'>+        loc_wipe(&amp;loc);</div><div class='add'>+        memset(&amp;iatt, 0, sizeof(iatt));</div><div class='add'>+</div><div class='add'>+    retry2:</div><div class='add'>+        ret = glfs_resolve(fs, xl, file, &amp;loc, &amp;iatt, reval);</div><div class='add'>+        ESTALE_RETRY(ret, errno, reval, &amp;loc, retry2);</div><div class='add'>+        if (ret) {</div><div class='add'>+            printf("Lookup failed on %s:%s\n", file, strerror(errno));</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (iatt.ia_type == IA_IFDIR) {</div><div class='add'>+        ret = _validate_directory(xattr_req, file);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+    }</div><div class='add'>+    ret = syncop_getxattr(xl, &amp;loc, &amp;xattr_rsp, GF_AFR_HEAL_SBRAIN, xattr_req,</div><div class='add'>+                          NULL);</div><div class='add'>+    if (ret) {</div><div class='add'>+        op_errno = -ret;</div><div class='add'>+        printf("Healing %s failed:%s.\n", file, strerror(op_errno));</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    ret = dict_get_str(xattr_rsp, "sh-fail-msg", &amp;sh_fail_msg);</div><div class='add'>+    if (!ret) {</div><div class='add'>+        printf("Healing %s failed: %s.\n", file, sh_fail_msg);</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    printf("Healed %s.\n", file);</div><div class='add'>+    ret = 0;</div><div class='add'>+out:</div><div class='add'>+    if (xattr_rsp)</div><div class='add'>+        dict_unref(xattr_rsp);</div><div class='add'>+    if (path1)</div><div class='add'>+        GF_FREE(path1);</div><div class='add'>+    if (path2)</div><div class='add'>+        GF_FREE(path2);</div><div class='add'>+    if (filename)</div><div class='add'>+        GF_FREE(filename);</div><div class='add'>+    loc_wipe(&amp;loc);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+glfsh_heal_from_brick_type(glfs_t *fs, xlator_t *top_subvol, loc_t *rootloc,</div><div class='add'>+                           char *hostname, char *brickpath, xlator_t *client,</div><div class='add'>+                           dict_t *xattr_req, char *vgfid,</div><div class='add'>+                           num_entries_t *num_entries)</div><div class='add'>+{</div><div class='add'>+    fd_t *fd = NULL;</div><div class='add'>+    loc_t dirloc = {0};</div><div class='add'>+    int32_t op_errno = 0;</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    ret = glfsh_get_index_dir_loc(rootloc, client, &amp;dirloc, &amp;op_errno, vgfid);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        if (op_errno == ESTALE || op_errno == ENOENT)</div><div class='add'>+            ret = 0;</div><div class='add'>+        else</div><div class='add'>+            ret = -op_errno;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = syncop_dirfd(client, &amp;dirloc, &amp;fd, GF_CLIENT_PID_GLFS_HEAL);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+    ret = glfsh_crawl_directory(fs, top_subvol, rootloc, client, fd, &amp;dirloc,</div><div class='add'>+                                xattr_req, num_entries, _gf_false);</div><div class='add'>+    if (fd)</div><div class='add'>+        fd_unref(fd);</div><div class='add'>+out:</div><div class='add'>+    loc_wipe(&amp;dirloc);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+glfsh_heal_from_brick(glfs_t *fs, xlator_t *top_subvol, loc_t *rootloc,</div><div class='add'>+                      char *hostname, char *brickpath, char *file)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    dict_t *xattr_req = NULL;</div><div class='add'>+    xlator_t *client = NULL;</div><div class='add'>+    num_entries_t num_entries = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    num_entries_t total = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    xattr_req = dict_new();</div><div class='add'>+    if (!xattr_req)</div><div class='add'>+        goto out;</div><div class='add'>+    ret = dict_set_int32(xattr_req, "heal-op",</div><div class='add'>+                         GF_SHD_OP_SBRAIN_HEAL_FROM_BRICK);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+    client = _brick_path_to_client_xlator(top_subvol, hostname, brickpath);</div><div class='add'>+    if (!client) {</div><div class='add'>+        printf("\"%s:%s\"- No such brick available in the volume.\n", hostname,</div><div class='add'>+               brickpath);</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    ret = dict_set_str(xattr_req, "child-name", client-&gt;name);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+    if (file)</div><div class='add'>+        ret = glfsh_heal_splitbrain_file(fs, top_subvol, rootloc, file,</div><div class='add'>+                                         xattr_req);</div><div class='add'>+    else {</div><div class='add'>+        ret = glfsh_heal_from_brick_type(fs, top_subvol, rootloc, hostname,</div><div class='add'>+                                         brickpath, client, xattr_req,</div><div class='add'>+                                         GF_XATTROP_INDEX_GFID, &amp;num_entries);</div><div class='add'>+        total.num_entries += num_entries.num_entries;</div><div class='add'>+        num_entries.num_entries = 0;</div><div class='add'>+        if (ret == -ENOTCONN)</div><div class='add'>+            goto out;</div><div class='add'>+</div><div class='add'>+        ret = glfsh_heal_from_brick_type(fs, top_subvol, rootloc, hostname,</div><div class='add'>+                                         brickpath, client, xattr_req,</div><div class='add'>+                                         GF_XATTROP_DIRTY_GFID, &amp;num_entries);</div><div class='add'>+        total.num_entries += num_entries.num_entries;</div><div class='add'>+        if (ret &lt; 0)</div><div class='add'>+            goto out;</div><div class='add'>+    }</div><div class='add'>+out:</div><div class='add'>+    if (xattr_req)</div><div class='add'>+        dict_unref(xattr_req);</div><div class='add'>+    if (!file)</div><div class='add'>+        glfsh_print_heal_op_status(ret, total.num_entries,</div><div class='add'>+                                   GF_SHD_OP_SBRAIN_HEAL_FROM_BRICK);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+glfsh_heal_from_bigger_file_or_mtime(glfs_t *fs, xlator_t *top_subvol,</div><div class='add'>+                                     loc_t *rootloc, char *file,</div><div class='add'>+                                     gf_xl_afr_op_t heal_op)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    dict_t *xattr_req = NULL;</div><div class='add'>+</div><div class='add'>+    xattr_req = dict_new();</div><div class='add'>+    if (!xattr_req)</div><div class='add'>+        goto out;</div><div class='add'>+    ret = dict_set_int32(xattr_req, "heal-op", heal_op);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+    ret = glfsh_heal_splitbrain_file(fs, top_subvol, rootloc, file, xattr_req);</div><div class='add'>+out:</div><div class='add'>+    if (xattr_req)</div><div class='add'>+        dict_unref(xattr_req);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+cleanup(glfs_t *fs)</div><div class='add'>+{</div><div class='add'>+    if (!fs)</div><div class='add'>+        return;</div><div class='add'>+#if 0</div><div class='add'>+        /* glfs fini path is still racy and crashing the program. Since</div><div class='add'>+         * this program any way has to die, we are not going to call fini</div><div class='add'>+         * in the released versions. i.e. final builds. For all</div><div class='add'>+         * internal testing lets enable this so that glfs_fini code</div><div class='add'>+         * path becomes stable. */</div><div class='add'>+        glfs_fini (fs);</div><div class='add'>+#endif</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+glfsh_info_t glfsh_human_readable = {</div><div class='add'>+    .init = glfsh_init,</div><div class='add'>+    .print_brick_from_xl = glfsh_print_brick_from_xl,</div><div class='add'>+    .print_heal_op_status = glfsh_print_hr_heal_op_status,</div><div class='add'>+    .print_heal_op_summary = glfsh_print_hr_heal_op_summary,</div><div class='add'>+    .print_heal_status = glfsh_print_hr_heal_status,</div><div class='add'>+    .print_spb_status = glfsh_print_hr_spb_status,</div><div class='add'>+    .end = glfsh_end};</div><div class='add'>+</div><div class='add'>+glfsh_info_t glfsh_no_print = {</div><div class='add'>+    .init = glfsh_init,</div><div class='add'>+    .print_brick_from_xl = glfsh_no_print_brick_from_xl,</div><div class='add'>+    .print_heal_op_status = glfsh_no_print_hr_heal_op_status,</div><div class='add'>+    .print_heal_status = glfsh_no_print_hr_status,</div><div class='add'>+    .print_spb_status = glfsh_no_print_hr_status,</div><div class='add'>+    .end = glfsh_end_op_granular_entry_heal};</div><div class='add'>+</div><div class='add'>+#if (HAVE_LIB_XML)</div><div class='add'>+glfsh_info_t glfsh_xml_output = {</div><div class='add'>+    .init = glfsh_xml_init,</div><div class='add'>+    .print_brick_from_xl = glfsh_print_xml_brick_from_xl,</div><div class='add'>+    .print_heal_op_status = glfsh_print_xml_heal_op_status,</div><div class='add'>+    .print_heal_op_summary = glfsh_print_xml_heal_op_summary,</div><div class='add'>+    .print_heal_status = glfsh_print_xml_file_status,</div><div class='add'>+    .print_spb_status = glfsh_print_xml_file_status,</div><div class='add'>+    .end = glfsh_xml_end};</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+parse_flags(int *argc, char **argv, int *flags)</div><div class='add'>+{</div><div class='add'>+    int i = 0;</div><div class='add'>+    char *opt = NULL;</div><div class='add'>+    int count = 0;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; *argc; i++) {</div><div class='add'>+        opt = strtail(argv[i], "--");</div><div class='add'>+        if (!opt)</div><div class='add'>+            continue;</div><div class='add'>+        if (strcmp(opt, "nolog") == 0) {</div><div class='add'>+            *flags |= MODE_NO_LOG;</div><div class='add'>+            count++;</div><div class='add'>+        } else if (strcmp(opt, "xml") == 0) {</div><div class='add'>+            *flags |= MODE_XML;</div><div class='add'>+            count++;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    *argc = *argc - count;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+main(int argc, char **argv)</div><div class='add'>+{</div><div class='add'>+    glfs_t *fs = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    char *volname = NULL;</div><div class='add'>+    xlator_t *top_subvol = NULL;</div><div class='add'>+    loc_t rootloc = {0};</div><div class='add'>+    char logfilepath[PATH_MAX] = {0};</div><div class='add'>+    char *hostname = NULL;</div><div class='add'>+    char *path = NULL;</div><div class='add'>+    char *file = NULL;</div><div class='add'>+    char *op_errstr = NULL;</div><div class='add'>+    char *socket_filepath = NULL;</div><div class='add'>+    gf_xl_afr_op_t heal_op = -1;</div><div class='add'>+    gf_loglevel_t log_level = GF_LOG_INFO;</div><div class='add'>+    int flags = 0;</div><div class='add'>+</div><div class='add'>+    if (argc &lt; 2) {</div><div class='add'>+        printf(USAGE_STR, argv[0]);</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    } else if (argc &gt;= 4) {</div><div class='add'>+        if (!strcmp(argv[argc - 2], "glusterd-sock")) {</div><div class='add'>+            socket_filepath = argv[argc - 1];</div><div class='add'>+            argc = argc - 2;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    volname = argv[1];</div><div class='add'>+</div><div class='add'>+    parse_flags(&amp;argc, argv, &amp;flags);</div><div class='add'>+    if (flags &amp; MODE_NO_LOG)</div><div class='add'>+        log_level = GF_LOG_NONE;</div><div class='add'>+    if (flags &amp; MODE_XML)</div><div class='add'>+        is_xml = 1;</div><div class='add'>+</div><div class='add'>+    switch (argc) {</div><div class='add'>+        case 2:</div><div class='add'>+            heal_op = GF_SHD_OP_INDEX_SUMMARY;</div><div class='add'>+            break;</div><div class='add'>+        case 3:</div><div class='add'>+            if (!strcmp(argv[2], "split-brain-info")) {</div><div class='add'>+                heal_op = GF_SHD_OP_SPLIT_BRAIN_FILES;</div><div class='add'>+            } else if (!strcmp(argv[2], "granular-entry-heal-op")) {</div><div class='add'>+                heal_op = GF_SHD_OP_GRANULAR_ENTRY_HEAL_ENABLE;</div><div class='add'>+            } else if (!strcmp(argv[2], "info-summary")) {</div><div class='add'>+                heal_op = GF_SHD_OP_HEAL_SUMMARY;</div><div class='add'>+            } else {</div><div class='add'>+                printf(USAGE_STR, argv[0]);</div><div class='add'>+                ret = -1;</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+            break;</div><div class='add'>+        case 4:</div><div class='add'>+            if (!strcmp(argv[2], "bigger-file")) {</div><div class='add'>+                heal_op = GF_SHD_OP_SBRAIN_HEAL_FROM_BIGGER_FILE;</div><div class='add'>+                file = argv[3];</div><div class='add'>+            } else if (!strcmp(argv[2], "latest-mtime")) {</div><div class='add'>+                heal_op = GF_SHD_OP_SBRAIN_HEAL_FROM_LATEST_MTIME;</div><div class='add'>+                file = argv[3];</div><div class='add'>+            } else if (!strcmp(argv[2], "source-brick")) {</div><div class='add'>+                heal_op = GF_SHD_OP_SBRAIN_HEAL_FROM_BRICK;</div><div class='add'>+                hostname = strtok(argv[3], ":");</div><div class='add'>+                path = strtok(NULL, ":");</div><div class='add'>+            } else {</div><div class='add'>+                printf(USAGE_STR, argv[0]);</div><div class='add'>+                ret = -1;</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+            break;</div><div class='add'>+        case 5:</div><div class='add'>+            if (!strcmp(argv[2], "source-brick")) {</div><div class='add'>+                heal_op = GF_SHD_OP_SBRAIN_HEAL_FROM_BRICK;</div><div class='add'>+                hostname = strtok(argv[3], ":");</div><div class='add'>+                path = strtok(NULL, ":");</div><div class='add'>+                file = argv[4];</div><div class='add'>+            } else {</div><div class='add'>+                printf(USAGE_STR, argv[0]);</div><div class='add'>+                ret = -1;</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+            break;</div><div class='add'>+        default:</div><div class='add'>+            printf(USAGE_STR, argv[0]);</div><div class='add'>+            ret = -1;</div><div class='add'>+            goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    glfsh_output = &amp;glfsh_human_readable;</div><div class='add'>+    if (is_xml) {</div><div class='add'>+#if (HAVE_LIB_XML)</div><div class='add'>+        if ((heal_op == GF_SHD_OP_INDEX_SUMMARY) ||</div><div class='add'>+            (heal_op == GF_SHD_OP_SPLIT_BRAIN_FILES) ||</div><div class='add'>+            (heal_op == GF_SHD_OP_HEAL_SUMMARY)) {</div><div class='add'>+            glfsh_output = &amp;glfsh_xml_output;</div><div class='add'>+        } else {</div><div class='add'>+            printf(USAGE_STR, argv[0]);</div><div class='add'>+            ret = -1;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+#else</div><div class='add'>+        /*No point doing anything, just fail the command*/</div><div class='add'>+        exit(EXIT_FAILURE);</div><div class='add'>+#endif</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (heal_op == GF_SHD_OP_GRANULAR_ENTRY_HEAL_ENABLE)</div><div class='add'>+        glfsh_output = &amp;glfsh_no_print;</div><div class='add'>+</div><div class='add'>+    ret = glfsh_output-&gt;init();</div><div class='add'>+    if (ret)</div><div class='add'>+        exit(EXIT_FAILURE);</div><div class='add'>+</div><div class='add'>+    fs = glfs_new(volname);</div><div class='add'>+    if (!fs) {</div><div class='add'>+        ret = -errno;</div><div class='add'>+        gf_asprintf(&amp;op_errstr, "Not able to initialize volume '%s'", volname);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (sys_access(SECURE_ACCESS_FILE, F_OK) == 0) {</div><div class='add'>+        fs-&gt;ctx-&gt;secure_mgmt = 1;</div><div class='add'>+        fs-&gt;ctx-&gt;ssl_cert_depth = glusterfs_read_secure_access_file();</div><div class='add'>+    }</div><div class='add'>+    if (socket_filepath != NULL) {</div><div class='add'>+        ret = glfs_set_volfile_server(fs, "unix", socket_filepath, 0);</div><div class='add'>+    } else {</div><div class='add'>+        ret = glfs_set_volfile_server(fs, "unix", DEFAULT_GLUSTERD_SOCKFILE, 0);</div><div class='add'>+    }</div><div class='add'>+    if (ret) {</div><div class='add'>+        ret = -errno;</div><div class='add'>+        gf_asprintf(&amp;op_errstr,</div><div class='add'>+                    "Setting the volfile server failed, "</div><div class='add'>+                    "%s",</div><div class='add'>+                    strerror(errno));</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = glfsh_set_heal_options(fs, heal_op);</div><div class='add'>+    if (ret) {</div><div class='add'>+        printf("Setting xlator heal options failed, %s\n", strerror(errno));</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    snprintf(logfilepath, sizeof(logfilepath),</div><div class='add'>+             DEFAULT_HEAL_LOG_FILE_DIRECTORY "/glfsheal-%s.log", volname);</div><div class='add'>+    ret = glfs_set_logging(fs, logfilepath, log_level);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        ret = -errno;</div><div class='add'>+        gf_asprintf(&amp;op_errstr,</div><div class='add'>+                    "Failed to set the log file path, "</div><div class='add'>+                    "%s",</div><div class='add'>+                    strerror(errno));</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = glfs_setfspid(fs, GF_CLIENT_PID_GLFS_HEAL);</div><div class='add'>+    if (ret) {</div><div class='add'>+        printf("Setting client pid failed, %s\n", strerror(errno));</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = glfs_init(fs);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        ret = -errno;</div><div class='add'>+        if (errno == ENOENT) {</div><div class='add'>+            gf_asprintf(&amp;op_errstr, "Volume %s does not exist", volname);</div><div class='add'>+        } else {</div><div class='add'>+            gf_asprintf(&amp;op_errstr,</div><div class='add'>+                        "%s: Not able to fetch "</div><div class='add'>+                        "volfile from glusterd",</div><div class='add'>+                        volname);</div><div class='add'>+        }</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    top_subvol = glfs_active_subvol(fs);</div><div class='add'>+    if (!top_subvol) {</div><div class='add'>+        ret = -errno;</div><div class='add'>+        if (errno == ENOTCONN) {</div><div class='add'>+            gf_asprintf(&amp;op_errstr,</div><div class='add'>+                        "Volume %s is not started "</div><div class='add'>+                        "(Or) All the bricks are not "</div><div class='add'>+                        "running.",</div><div class='add'>+                        volname);</div><div class='add'>+        } else {</div><div class='add'>+            gf_asprintf(&amp;op_errstr,</div><div class='add'>+                        "%s: Not able to mount the "</div><div class='add'>+                        "volume, %s",</div><div class='add'>+                        volname, strerror(errno));</div><div class='add'>+        }</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    char *var_str = (heal_op == GF_SHD_OP_INDEX_SUMMARY ||</div><div class='add'>+                     heal_op == GF_SHD_OP_HEAL_SUMMARY)</div><div class='add'>+                        ? "replicate/disperse"</div><div class='add'>+                        : "replicate";</div><div class='add'>+</div><div class='add'>+    ret = glfsh_validate_volume(top_subvol, heal_op);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        ret = -EINVAL;</div><div class='add'>+        gf_asprintf(&amp;op_errstr,</div><div class='add'>+                    "This command is supported "</div><div class='add'>+                    "for only volumes of %s type. Volume %s "</div><div class='add'>+                    "is not of type %s",</div><div class='add'>+                    var_str, volname, var_str);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    rootloc.inode = inode_ref(top_subvol-&gt;itable-&gt;root);</div><div class='add'>+    ret = glfs_loc_touchup(&amp;rootloc);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        ret = -errno;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    switch (heal_op) {</div><div class='add'>+        case GF_SHD_OP_INDEX_SUMMARY:</div><div class='add'>+        case GF_SHD_OP_SPLIT_BRAIN_FILES:</div><div class='add'>+        case GF_SHD_OP_GRANULAR_ENTRY_HEAL_ENABLE:</div><div class='add'>+        case GF_SHD_OP_HEAL_SUMMARY:</div><div class='add'>+            ret = glfsh_gather_heal_info(fs, top_subvol, &amp;rootloc, heal_op);</div><div class='add'>+            break;</div><div class='add'>+        case GF_SHD_OP_SBRAIN_HEAL_FROM_BIGGER_FILE:</div><div class='add'>+        case GF_SHD_OP_SBRAIN_HEAL_FROM_LATEST_MTIME:</div><div class='add'>+            ret = glfsh_heal_from_bigger_file_or_mtime(fs, top_subvol, &amp;rootloc,</div><div class='add'>+                                                       file, heal_op);</div><div class='add'>+            break;</div><div class='add'>+        case GF_SHD_OP_SBRAIN_HEAL_FROM_BRICK:</div><div class='add'>+            ret = glfsh_heal_from_brick(fs, top_subvol, &amp;rootloc, hostname,</div><div class='add'>+                                        path, file);</div><div class='add'>+            break;</div><div class='add'>+        default:</div><div class='add'>+            ret = -EINVAL;</div><div class='add'>+            break;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    glfsh_output-&gt;end(ret, NULL);</div><div class='add'>+    if (ret &lt; 0)</div><div class='add'>+        ret = -ret;</div><div class='add'>+    loc_wipe(&amp;rootloc);</div><div class='add'>+    glfs_subvol_done(fs, top_subvol);</div><div class='add'>+    cleanup(fs);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+out:</div><div class='add'>+    if (fs &amp;&amp; top_subvol)</div><div class='add'>+        glfs_subvol_done(fs, top_subvol);</div><div class='add'>+    loc_wipe(&amp;rootloc);</div><div class='add'>+    cleanup(fs);</div><div class='add'>+    if (glfsh_output)</div><div class='add'>+        glfsh_output-&gt;end(ret, op_errstr);</div><div class='add'>+    if (op_errstr)</div><div class='add'>+        GF_FREE(op_errstr);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='head'>diff --git a/libgfchangelog.pc.in b/libgfchangelog.pc.in<br/>new file mode 100644<br/>index 00000000000..79eac2ad2d3<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/libgfchangelog.pc.in?id=d1d7a6f35c816822fab51c820e25023863c239c1'>libgfchangelog.pc.in</a></div><div class='hunk'>@@ -0,0 +1,12 @@</div><div class='add'>+prefix=@prefix@</div><div class='add'>+exec_prefix=@exec_prefix@</div><div class='add'>+libdir=@libdir@</div><div class='add'>+includedir=@includedir@</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+Name: libgfchangelog</div><div class='add'>+Description: GlusterFS Changelog Consumer Library</div><div class='add'>+Version: @LIBGFCHANGELOG_VERSION@</div><div class='add'>+Requires: @PKGCONFIG_UUID@</div><div class='add'>+Libs: -L${libdir} -lgfchangelog -lglusterfs</div><div class='add'>+Cflags: -I${includedir} -D_FILE_OFFSET_BITS=64 -D__USE_FILE_OFFSET64 -D__USE_LARGEFILE64</div><div class='head'>diff --git a/scheduler/nufa/Makefile.am b/libglusterd/Makefile.am<br/>index d471a3f9243..a985f42a877 100644<br/>--- a/<a href='/cgit/glusterfs.git/tree/scheduler/nufa/Makefile.am?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>scheduler/nufa/Makefile.am</a><br/>+++ b/<a href='/cgit/glusterfs.git/tree/libglusterd/Makefile.am?id=d1d7a6f35c816822fab51c820e25023863c239c1'>libglusterd/Makefile.am</a></div><div class='hunk'>@@ -1,3 +1,3 @@</div><div class='ctx'> SUBDIRS = src</div><div class='ctx'> </div><div class='del'>-CLEANFILES = </div><div class='add'>+CLEANFILES =</div><div class='head'>diff --git a/libglusterd/src/Makefile.am b/libglusterd/src/Makefile.am<br/>new file mode 100644<br/>index 00000000000..684d2bac96b<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/libglusterd/src/Makefile.am?id=d1d7a6f35c816822fab51c820e25023863c239c1'>libglusterd/src/Makefile.am</a></div><div class='hunk'>@@ -0,0 +1,31 @@</div><div class='add'>+libglusterd_la_CFLAGS = $(GF_CFLAGS) $(GF_DARWIN_LIBGLUSTERFS_CFLAGS) \</div><div class='add'>+	-DDATADIR=\"$(localstatedir)\"</div><div class='add'>+</div><div class='add'>+libglusterd_la_CPPFLAGS = $(GF_CPPFLAGS) -D__USE_FILE_OFFSET64 \</div><div class='add'>+	-DXLATORDIR=\"$(libdir)/glusterfs/$(PACKAGE_VERSION)/xlator\" \</div><div class='add'>+	-DXLATORPARENTDIR=\"$(libdir)/glusterfs/$(PACKAGE_VERSION)\" \</div><div class='add'>+	-DXXH_NAMESPACE=GF_ -D__USE_LARGEFILE64 \</div><div class='add'>+	-I$(CONTRIBDIR)/rbtree \</div><div class='add'>+	-I$(CONTRIBDIR)/libexecinfo ${ARGP_STANDALONE_CPPFLAGS} \</div><div class='add'>+	-DSBIN_DIR=\"$(sbindir)\" -I$(CONTRIBDIR)/timer-wheel \</div><div class='add'>+	-I$(CONTRIBDIR)/xxhash \</div><div class='add'>+	-I$(top_srcdir)/rpc/xdr/src -I$(top_builddir)/rpc/xdr/src \</div><div class='add'>+	-I$(top_srcdir)/rpc/rpc-lib/src/</div><div class='add'>+</div><div class='add'>+libglusterd_la_LIBADD = $(ZLIB_LIBS) $(MATH_LIB) $(UUID_LIBS)</div><div class='add'>+libglusterd_la_LDFLAGS = -version-info $(LIBGLUSTERFS_LT_VERSION) $(GF_LDFLAGS) \</div><div class='add'>+	-export-symbols $(top_srcdir)/libglusterd/src/libglusterd.sym</div><div class='add'>+</div><div class='add'>+lib_LTLIBRARIES = libglusterd.la</div><div class='add'>+</div><div class='add'>+libglusterd_la_SOURCES = gd-common-utils.c</div><div class='add'>+</div><div class='add'>+libglusterd_la_HEADERS = gd-common-utils.h</div><div class='add'>+</div><div class='add'>+libglusterd_ladir = $(includedir)/glusterfs</div><div class='add'>+</div><div class='add'>+noinst_HEADERS = gd-common-utils.h</div><div class='add'>+</div><div class='add'>+EXTRA_DIST = libglusterd.sym</div><div class='add'>+</div><div class='add'>+CLEANFILES =</div><div class='head'>diff --git a/libglusterd/src/gd-common-utils.c b/libglusterd/src/gd-common-utils.c<br/>new file mode 100644<br/>index 00000000000..243fab215e6<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/libglusterd/src/gd-common-utils.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>libglusterd/src/gd-common-utils.c</a></div><div class='hunk'>@@ -0,0 +1,78 @@</div><div class='add'>+/*</div><div class='add'>+  Copyright (c) 2019 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#include "gd-common-utils.h"</div><div class='add'>+#include "cli1-xdr.h"</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+get_vol_type(int type, int dist_count, int brick_count)</div><div class='add'>+{</div><div class='add'>+    if ((type != GF_CLUSTER_TYPE_TIER) &amp;&amp; (type &gt; 0) &amp;&amp;</div><div class='add'>+        (dist_count &lt; brick_count))</div><div class='add'>+        type = type + GF_CLUSTER_TYPE_MAX - 1;</div><div class='add'>+</div><div class='add'>+    return type;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+char *</div><div class='add'>+get_struct_variable(int mem_num, gf_gsync_status_t *sts_val)</div><div class='add'>+{</div><div class='add'>+    switch (mem_num) {</div><div class='add'>+        case 0:</div><div class='add'>+            return (sts_val-&gt;node);</div><div class='add'>+        case 1:</div><div class='add'>+            return (sts_val-&gt;master);</div><div class='add'>+        case 2:</div><div class='add'>+            return (sts_val-&gt;brick);</div><div class='add'>+        case 3:</div><div class='add'>+            return (sts_val-&gt;slave_user);</div><div class='add'>+        case 4:</div><div class='add'>+            return (sts_val-&gt;slave);</div><div class='add'>+        case 5:</div><div class='add'>+            return (sts_val-&gt;slave_node);</div><div class='add'>+        case 6:</div><div class='add'>+            return (sts_val-&gt;worker_status);</div><div class='add'>+        case 7:</div><div class='add'>+            return (sts_val-&gt;crawl_status);</div><div class='add'>+        case 8:</div><div class='add'>+            return (sts_val-&gt;last_synced);</div><div class='add'>+        case 9:</div><div class='add'>+            return (sts_val-&gt;entry);</div><div class='add'>+        case 10:</div><div class='add'>+            return (sts_val-&gt;data);</div><div class='add'>+        case 11:</div><div class='add'>+            return (sts_val-&gt;meta);</div><div class='add'>+        case 12:</div><div class='add'>+            return (sts_val-&gt;failures);</div><div class='add'>+        case 13:</div><div class='add'>+            return (sts_val-&gt;checkpoint_time);</div><div class='add'>+        case 14:</div><div class='add'>+            return (sts_val-&gt;checkpoint_completed);</div><div class='add'>+        case 15:</div><div class='add'>+            return (sts_val-&gt;checkpoint_completion_time);</div><div class='add'>+        case 16:</div><div class='add'>+            return (sts_val-&gt;brick_host_uuid);</div><div class='add'>+        case 17:</div><div class='add'>+            return (sts_val-&gt;last_synced_utc);</div><div class='add'>+        case 18:</div><div class='add'>+            return (sts_val-&gt;checkpoint_time_utc);</div><div class='add'>+        case 19:</div><div class='add'>+            return (sts_val-&gt;checkpoint_completion_time_utc);</div><div class='add'>+        case 20:</div><div class='add'>+            return (sts_val-&gt;slavekey);</div><div class='add'>+        case 21:</div><div class='add'>+            return (sts_val-&gt;session_slave);</div><div class='add'>+        default:</div><div class='add'>+            goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return NULL;</div><div class='add'>+}</div><div class='head'>diff --git a/libglusterd/src/gd-common-utils.h b/libglusterd/src/gd-common-utils.h<br/>new file mode 100644<br/>index 00000000000..b9bb4f956fe<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/libglusterd/src/gd-common-utils.h?id=d1d7a6f35c816822fab51c820e25023863c239c1'>libglusterd/src/gd-common-utils.h</a></div><div class='hunk'>@@ -0,0 +1,28 @@</div><div class='add'>+/*</div><div class='add'>+  Copyright (c) 2019 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#ifndef _GD_COMMON_UTILS_H</div><div class='add'>+#define _GD_COMMON_UTILS_H</div><div class='add'>+</div><div class='add'>+#include &lt;fcntl.h&gt;</div><div class='add'>+#include &lt;unistd.h&gt;</div><div class='add'>+#include &lt;limits.h&gt;</div><div class='add'>+#include &lt;stddef.h&gt;</div><div class='add'>+</div><div class='add'>+#include "protocol-common.h"</div><div class='add'>+#include "rpcsvc.h"</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+get_vol_type(int type, int dist_count, int brick_count);</div><div class='add'>+</div><div class='add'>+char *</div><div class='add'>+get_struct_variable(int mem_num, gf_gsync_status_t *sts_val);</div><div class='add'>+</div><div class='add'>+#endif /* _GD_COMMON_UTILS_H */</div><div class='head'>diff --git a/libglusterd/src/libglusterd.sym b/libglusterd/src/libglusterd.sym<br/>new file mode 100644<br/>index 00000000000..45969a87c12<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/libglusterd/src/libglusterd.sym?id=d1d7a6f35c816822fab51c820e25023863c239c1'>libglusterd/src/libglusterd.sym</a></div><div class='hunk'>@@ -0,0 +1,2 @@</div><div class='add'>+get_vol_type</div><div class='add'>+get_struct_variable</div><div class='head'>diff --git a/libglusterfs/src/Makefile.am b/libglusterfs/src/Makefile.am<br/>index 3513419ebc9..385e8ef4600 100644<br/>--- a/<a href='/cgit/glusterfs.git/tree/libglusterfs/src/Makefile.am?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/Makefile.am</a><br/>+++ b/<a href='/cgit/glusterfs.git/tree/libglusterfs/src/Makefile.am?id=d1d7a6f35c816822fab51c820e25023863c239c1'>libglusterfs/src/Makefile.am</a></div><div class='hunk'>@@ -1,21 +1,116 @@</div><div class='del'>-libglusterfs_la_CFLAGS = -fPIC  -Wall -g -shared -nostartfiles $(GF_CFLAGS) $(GF_DARWIN_LIBGLUSTERFS_CFLAGS)</div><div class='add'>+noinst_PYTHON = generator.py gen-defaults.py $(top_srcdir)/events/eventskeygen.py</div><div class='ctx'> </div><div class='del'>-libglusterfs_la_CPPFLAGS = -D_FILE_OFFSET_BITS=64 -D__USE_FILE_OFFSET64 -D_GNU_SOURCE -DXLATORDIR=\"$(libdir)/glusterfs/$(PACKAGE_VERSION)/xlator\" -D$(GF_HOST_OS) -I$(CONTRIBDIR)/rbtree  -DSCHEDULERDIR=\"$(libdir)/glusterfs/$(PACKAGE_VERSION)/scheduler\" -I$(CONTRIBDIR)/md5</div><div class='add'>+libglusterfs_la_CFLAGS = $(GF_CFLAGS) $(GF_DARWIN_LIBGLUSTERFS_CFLAGS) \</div><div class='add'>+	-DDATADIR=\"$(localstatedir)\"</div><div class='ctx'> </div><div class='del'>-libglusterfs_la_LIBADD = @LEXLIB@</div><div class='add'>+libglusterfs_la_CPPFLAGS = $(GF_CPPFLAGS) -D__USE_FILE_OFFSET64 \</div><div class='add'>+	-DXLATORDIR=\"$(libdir)/glusterfs/$(PACKAGE_VERSION)/xlator\" \</div><div class='add'>+	-DXLATORPARENTDIR=\"$(libdir)/glusterfs/$(PACKAGE_VERSION)\" \</div><div class='add'>+	-DXXH_NAMESPACE=GF_ -D__USE_LARGEFILE64 \</div><div class='add'>+	-I$(CONTRIBDIR)/rbtree \</div><div class='add'>+	-I$(CONTRIBDIR)/libexecinfo ${ARGP_STANDALONE_CPPFLAGS} \</div><div class='add'>+	-DSBIN_DIR=\"$(sbindir)\" -I$(CONTRIBDIR)/timer-wheel \</div><div class='add'>+	-I$(CONTRIBDIR)/xxhash</div><div class='add'>+</div><div class='add'>+libglusterfs_la_LIBADD = $(ZLIB_LIBS) $(MATH_LIB) $(UUID_LIBS) $(LIB_DL) \</div><div class='add'>+	$(URCU_LIBS) $(URCU_CDS_LIBS)</div><div class='add'>+libglusterfs_la_LDFLAGS = -version-info $(LIBGLUSTERFS_LT_VERSION) $(GF_LDFLAGS) \</div><div class='add'>+	-export-symbols $(top_srcdir)/libglusterfs/src/libglusterfs.sym</div><div class='ctx'> </div><div class='ctx'> lib_LTLIBRARIES = libglusterfs.la</div><div class='add'>+libgfchangelogdir = $(includedir)/glusterfs/gfchangelog</div><div class='add'>+</div><div class='add'>+CONTRIB_BUILDDIR = $(top_builddir)/contrib</div><div class='add'>+</div><div class='add'>+libglusterfs_la_SOURCES = dict.c xlator.c logging.c \</div><div class='add'>+	hashfn.c common-utils.c timer.c inode.c call-stub.c \</div><div class='add'>+	compat.c fd.c compat-errno.c event.c mem-pool.c gf-dirent.c syscall.c \</div><div class='add'>+	iobuf.c globals.c statedump.c stack.c checksum.c daemon.c timespec.c \</div><div class='add'>+	$(CONTRIBDIR)/rbtree/rb.c rbthash.c store.c latency.c \</div><div class='add'>+	graph.c syncop.c graph-print.c trie.c run.c options.c fd-lk.c \</div><div class='add'>+	circ-buff.c event-history.c gidcache.c ctx.c client_t.c event-poll.c \</div><div class='add'>+	event-epoll.c syncop-utils.c cluster-syncop.c refcount.c \</div><div class='add'>+	$(CONTRIBDIR)/libgen/basename_r.c \</div><div class='add'>+	$(CONTRIBDIR)/libgen/dirname_r.c \</div><div class='add'>+	strfd.c parse-utils.c $(CONTRIBDIR)/mount/mntent.c \</div><div class='add'>+	$(CONTRIBDIR)/libexecinfo/execinfo.c quota-common-utils.c rot-buffs.c \</div><div class='add'>+	$(CONTRIBDIR)/timer-wheel/timer-wheel.c \</div><div class='add'>+	$(CONTRIBDIR)/timer-wheel/find_last_bit.c default-args.c locking.c \</div><div class='add'>+	$(CONTRIBDIR)/xxhash/xxhash.c \</div><div class='add'>+	throttle-tbf.c monitoring.c async.c</div><div class='add'>+</div><div class='add'>+nodist_libglusterfs_la_SOURCES = y.tab.c graph.lex.c defaults.c</div><div class='add'>+nodist_libglusterfs_la_HEADERS = y.tab.h</div><div class='add'>+</div><div class='add'>+BUILT_SOURCES = graph.lex.c defaults.c eventtypes.h</div><div class='add'>+</div><div class='add'>+libglusterfs_la_HEADERS = glusterfs/common-utils.h glusterfs/defaults.h \</div><div class='add'>+	glusterfs/default-args.h glusterfs/dict.h glusterfs/glusterfs.h \</div><div class='add'>+	glusterfs/hashfn.h glusterfs/timespec.h glusterfs/logging.h \</div><div class='add'>+	glusterfs/xlator.h glusterfs/stack.h glusterfs/timer.h glusterfs/list.h \</div><div class='add'>+	glusterfs/inode.h glusterfs/call-stub.h glusterfs/compat.h glusterfs/fd.h \</div><div class='add'>+	glusterfs/revision.h glusterfs/compat-errno.h glusterfs/gf-event.h \</div><div class='add'>+	glusterfs/mem-pool.h glusterfs/byte-order.h glusterfs/gf-dirent.h \</div><div class='add'>+	glusterfs/locking.h glusterfs/syscall.h glusterfs/iobuf.h \</div><div class='add'>+	glusterfs/globals.h glusterfs/statedump.h glusterfs/checksum.h \</div><div class='add'>+	glusterfs/daemon.h glusterfs/store.h glusterfs/rbthash.h glusterfs/iatt.h \</div><div class='add'>+	glusterfs/latency.h glusterfs/mem-types.h glusterfs/syncop.h \</div><div class='add'>+	glusterfs/cluster-syncop.h glusterfs/graph-utils.h glusterfs/trie.h \</div><div class='add'>+	glusterfs/refcount.h glusterfs/run.h glusterfs/options.h \</div><div class='add'>+	glusterfs/lkowner.h glusterfs/fd-lk.h glusterfs/circ-buff.h \</div><div class='add'>+	glusterfs/event-history.h glusterfs/gidcache.h glusterfs/client_t.h \</div><div class='add'>+	glusterfs/glusterfs-acl.h glusterfs/glfs-message-id.h \</div><div class='add'>+	glusterfs/template-component-messages.h glusterfs/strfd.h \</div><div class='add'>+	glusterfs/syncop-utils.h glusterfs/parse-utils.h \</div><div class='add'>+	glusterfs/libglusterfs-messages.h glusterfs/lvm-defaults.h \</div><div class='add'>+	glusterfs/quota-common-utils.h glusterfs/rot-buffs.h \</div><div class='add'>+	glusterfs/compat-uuid.h glusterfs/upcall-utils.h glusterfs/throttle-tbf.h \</div><div class='add'>+	glusterfs/events.h glusterfs/atomic.h glusterfs/monitoring.h \</div><div class='add'>+	glusterfs/async.h glusterfs/glusterfs-fops.h</div><div class='ctx'> </div><div class='del'>-libglusterfs_la_SOURCES = dict.c graph.lex.c y.tab.c xlator.c logging.c  hashfn.c defaults.c common-utils.c timer.c inode.c call-stub.c compat.c fd.c compat-errno.c event.c mem-pool.c gf-dirent.c syscall.c iobuf.c globals.c statedump.c stack.c checksum.c $(CONTRIBDIR)/md5/md5.c $(CONTRIBDIR)/rbtree/rb.c rbthash.c latency.c graph.c $(CONTRIBDIR)/uuid/clear.c $(CONTRIBDIR)/uuid/copy.c $(CONTRIBDIR)/uuid/gen_uuid.c $(CONTRIBDIR)/uuid/pack.c $(CONTRIBDIR)/uuid/tst_uuid.c $(CONTRIBDIR)/uuid/parse.c $(CONTRIBDIR)/uuid/unparse.c $(CONTRIBDIR)/uuid/uuid_time.c $(CONTRIBDIR)/uuid/compare.c $(CONTRIBDIR)/uuid/isnull.c $(CONTRIBDIR)/uuid/unpack.c syncop.c</div><div class='add'>+libglusterfs_ladir = $(includedir)/glusterfs</div><div class='ctx'> </div><div class='del'>-noinst_HEADERS = common-utils.h defaults.h dict.h glusterfs.h hashfn.h logging.h  xlator.h  stack.h timer.h list.h inode.h call-stub.h compat.h fd.h revision.h compat-errno.h event.h mem-pool.h byte-order.h gf-dirent.h locking.h syscall.h iobuf.h globals.h statedump.h checksum.h $(CONTRIBDIR)/md5/md5.h $(CONTRIBDIR)/rbtree/rb.h rbthash.h iatt.h latency.h mem-types.h $(CONTRIBDIR)/uuid/uuidd.h $(CONTRIBDIR)/uuid/uuid.h $(CONTRIBDIR)/uuid/uuidP.h $(CONTRIBDIR)/uuid/uuid_types.h syncop.h</div><div class='add'>+noinst_HEADERS = unittest/unittest.h \</div><div class='add'>+	$(CONTRIBDIR)/rbtree/rb.h \</div><div class='add'>+	$(CONTRIBDIR)/mount/mntent_compat.h \</div><div class='add'>+	$(CONTRIBDIR)/libexecinfo/execinfo_compat.h \</div><div class='add'>+	$(CONTRIBDIR)/timer-wheel/timer-wheel.h \</div><div class='add'>+	$(CONTRIBDIR)/xxhash/xxhash.h \</div><div class='add'>+	$(CONTRIBDIR)/userspace-rcu/wfcqueue.h \</div><div class='add'>+	$(CONTRIBDIR)/userspace-rcu/wfstack.h \</div><div class='add'>+	$(CONTRIBDIR)/userspace-rcu/static-wfcqueue.h \</div><div class='add'>+	$(CONTRIBDIR)/userspace-rcu/static-wfstack.h</div><div class='ctx'> </div><div class='del'>-EXTRA_DIST = graph.l graph.y</div><div class='add'>+eventtypes.h: $(top_srcdir)/events/eventskeygen.py</div><div class='add'>+	$(PYTHON) $(top_srcdir)/events/eventskeygen.py C_HEADER</div><div class='add'>+</div><div class='add'>+if BUILD_EVENTS</div><div class='add'>+libglusterfs_la_SOURCES += events.c</div><div class='add'>+endif</div><div class='add'>+</div><div class='add'>+libgfchangelog_HEADERS = changelog.h</div><div class='add'>+</div><div class='add'>+EXTRA_DIST = graph.l graph.y defaults-tmpl.c libglusterfs.sym</div><div class='ctx'> </div><div class='ctx'> graph.lex.c: graph.l y.tab.h</div><div class='del'>-	$(LEX) -t $(srcdir)/graph.l &gt; $@</div><div class='add'>+	$(LEX) -Pgraphyy -t $(srcdir)/graph.l &gt; $@</div><div class='add'>+</div><div class='add'>+y.tab.c: y.tab.h</div><div class='add'>+y.tab.h: graph.y</div><div class='add'>+	$(YACC) -p graphyy -d $(srcdir)/graph.y</div><div class='add'>+</div><div class='add'>+defaults.c: defaults-tmpl.c generator.py gen-defaults.py</div><div class='add'>+	$(PYTHON) $(srcdir)/gen-defaults.py $(srcdir)/defaults-tmpl.c &gt; $@</div><div class='add'>+</div><div class='add'>+CLEANFILES = $(nodist_libglusterfs_la_SOURCES) \</div><div class='add'>+	$(nodist_libglusterfs_la_HEADERS) *.pyc</div><div class='ctx'> </div><div class='del'>-y.tab.c y.tab.h: graph.y</div><div class='del'>-	$(YACC) -d $(srcdir)/graph.y</div><div class='add'>+if UNITTEST</div><div class='add'>+CLEANFILES += *.gcda *.gcno *_xunit.xml</div><div class='add'>+noinst_PROGRAMS =</div><div class='add'>+TESTS =</div><div class='add'>+endif</div><div class='ctx'> </div><div class='del'>-CLEANFILES = graph.lex.c y.tab.c y.tab.h</div><div class='add'>+if BUILD_EVENTS</div><div class='add'>+CLEANFILES += eventtypes.h</div><div class='add'>+endif</div><div class='head'>diff --git a/libglusterfs/src/async.c b/libglusterfs/src/async.c<br/>new file mode 100644<br/>index 00000000000..1d6cfa374b6<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/libglusterfs/src/async.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>libglusterfs/src/async.c</a></div><div class='hunk'>@@ -0,0 +1,720 @@</div><div class='add'>+/*</div><div class='add'>+  Copyright (c) 2019 Red Hat, Inc &lt;https://www.redhat.com&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+/* To implement an efficient thread pool with minimum contention we have used</div><div class='add'>+ * the following ideas:</div><div class='add'>+ *</div><div class='add'>+ *    - The queue of jobs has been implemented using a Wait-Free queue provided</div><div class='add'>+ *      by the userspace-rcu library. This queue requires a mutex when multiple</div><div class='add'>+ *      consumers can be extracting items from it concurrently, but the locked</div><div class='add'>+ *      region is very small, which minimizes the chances of contention. To</div><div class='add'>+ *      further minimize contention, the number of active worker threads that</div><div class='add'>+ *      are accessing the queue is dynamically adjusted so that we always have</div><div class='add'>+ *      the minimum required amount of workers contending for the queue. Adding</div><div class='add'>+ *      new items can be done with a single atomic operation, without locks.</div><div class='add'>+ *</div><div class='add'>+ *    - All queue management operations, like creating more threads, enabling</div><div class='add'>+ *      sleeping ones, etc. are done by a single thread. This makes it possible</div><div class='add'>+ *      to manage all scaling related information and workers lists without</div><div class='add'>+ *      locks. This functionality is implemented as a role that can be assigned</div><div class='add'>+ *      to any of the worker threads, which avoids that some lengthy operations</div><div class='add'>+ *      could interfere with this task.</div><div class='add'>+ *</div><div class='add'>+ *    - Management is based on signals. We used signals for management tasks to</div><div class='add'>+ *      avoid multiple system calls for each request (with signals we can wait</div><div class='add'>+ *      for multiple events and get some additional data for each request in a</div><div class='add'>+ *      single call, instead of first polling and then reading).</div><div class='add'>+ *</div><div class='add'>+ * TODO: There are some other changes that can take advantage of this new</div><div class='add'>+ *       thread pool.</div><div class='add'>+ *</div><div class='add'>+ *          - Use this thread pool as the core threading model for synctasks. I</div><div class='add'>+ *            think this would improve synctask performance because I think we</div><div class='add'>+ *            currently have some contention there for some workloads.</div><div class='add'>+ *</div><div class='add'>+ *          - Implement a per thread timer that will allow adding and removing</div><div class='add'>+ *            timers without using mutexes.</div><div class='add'>+ *</div><div class='add'>+ *          - Integrate with userspace-rcu library in QSBR mode, allowing</div><div class='add'>+ *            other portions of code to be implemented using RCU-based</div><div class='add'>+ *            structures with a extremely fast read side without contention.</div><div class='add'>+ *</div><div class='add'>+ *          - Integrate I/O into the thread pool so that the thread pool is</div><div class='add'>+ *            able to efficiently manage all loads and scale dynamically. This</div><div class='add'>+ *            could make it possible to minimize context switching when serving</div><div class='add'>+ *            requests from fuse or network.</div><div class='add'>+ *</div><div class='add'>+ *          - Dynamically scale the number of workers based on system load.</div><div class='add'>+ *            This will make it possible to reduce contention when system is</div><div class='add'>+ *            heavily loaded, improving performance under these circumstances</div><div class='add'>+ *            (or minimizing performance loss). This will also make it possible</div><div class='add'>+ *            that gluster can coexist with other processes that also consume</div><div class='add'>+ *            CPU, with minimal interference from each other.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+#include &lt;unistd.h&gt;</div><div class='add'>+#include &lt;pthread.h&gt;</div><div class='add'>+#include &lt;errno.h&gt;</div><div class='add'>+</div><div class='add'>+#include "glusterfs/list.h"</div><div class='add'>+#include "glusterfs/mem-types.h"</div><div class='add'>+#include "glusterfs/async.h"</div><div class='add'>+</div><div class='add'>+/* These macros wrap a simple system/library call to check the returned error</div><div class='add'>+ * and log a message in case of failure. */</div><div class='add'>+#define GF_ASYNC_CHECK(_func, _args...)                                        \</div><div class='add'>+    ({                                                                         \</div><div class='add'>+        int32_t __async_error = -_func(_args);                                 \</div><div class='add'>+        if (caa_unlikely(__async_error != 0)) {                                \</div><div class='add'>+            gf_async_error(__async_error, #_func "() failed.");                \</div><div class='add'>+        }                                                                      \</div><div class='add'>+        __async_error;                                                         \</div><div class='add'>+    })</div><div class='add'>+</div><div class='add'>+#define GF_ASYNC_CHECK_ERRNO(_func, _args...)                                  \</div><div class='add'>+    ({                                                                         \</div><div class='add'>+        int32_t __async_error = _func(_args);                                  \</div><div class='add'>+        if (caa_unlikely(__async_error &lt; 0)) {                                 \</div><div class='add'>+            __async_error = -errno;                                            \</div><div class='add'>+            gf_async_error(__async_error, #_func "() failed.");                \</div><div class='add'>+        }                                                                      \</div><div class='add'>+        __async_error;                                                         \</div><div class='add'>+    })</div><div class='add'>+</div><div class='add'>+/* These macros are used when, based on POSIX documentation, the function</div><div class='add'>+ * should never fail under the conditions we are using it. So any unexpected</div><div class='add'>+ * error will be handled as a fatal event. It probably means a critical bug</div><div class='add'>+ * or memory corruption. In both cases we consider that stopping the process</div><div class='add'>+ * is safer (otherwise it could cause more corruption with unknown effects</div><div class='add'>+ * that could be worse). */</div><div class='add'>+#define GF_ASYNC_CANTFAIL(_func, _args...)                                     \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        int32_t __async_error = -_func(_args);                                 \</div><div class='add'>+        if (caa_unlikely(__async_error != 0)) {                                \</div><div class='add'>+            gf_async_fatal(__async_error, #_func "() failed");                 \</div><div class='add'>+        }                                                                      \</div><div class='add'>+    } while (0)</div><div class='add'>+</div><div class='add'>+#define GF_ASYNC_CANTFAIL_ERRNO(_func, _args...)                               \</div><div class='add'>+    ({                                                                         \</div><div class='add'>+        int32_t __async_error = _func(_args);                                  \</div><div class='add'>+        if (caa_unlikely(__async_error &lt; 0)) {                                 \</div><div class='add'>+            __async_error = -errno;                                            \</div><div class='add'>+            gf_async_fatal(__async_error, #_func "() failed");                 \</div><div class='add'>+        }                                                                      \</div><div class='add'>+        __async_error;                                                         \</div><div class='add'>+    })</div><div class='add'>+</div><div class='add'>+/* TODO: for now we allocate a static array of workers. There's an issue if we</div><div class='add'>+ *       try to use dynamic memory since these workers are initialized very</div><div class='add'>+ *       early in the process startup and it seems that sometimes not all is</div><div class='add'>+ *       ready to use dynamic memory. */</div><div class='add'>+static gf_async_worker_t gf_async_workers[GF_ASYNC_MAX_THREADS];</div><div class='add'>+</div><div class='add'>+/* This is the only global variable needed to manage the entire framework. */</div><div class='add'>+gf_async_control_t gf_async_ctrl = {};</div><div class='add'>+</div><div class='add'>+static __thread gf_async_worker_t *gf_async_current_worker = NULL;</div><div class='add'>+</div><div class='add'>+/* The main function of the worker threads. */</div><div class='add'>+static void *</div><div class='add'>+gf_async_worker(void *arg);</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf_async_sync_init(void)</div><div class='add'>+{</div><div class='add'>+    GF_ASYNC_CANTFAIL(pthread_barrier_init, &amp;gf_async_ctrl.sync, NULL, 2);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf_async_sync_now(void)</div><div class='add'>+{</div><div class='add'>+    int32_t ret;</div><div class='add'>+</div><div class='add'>+    ret = pthread_barrier_wait(&amp;gf_async_ctrl.sync);</div><div class='add'>+    if (ret == PTHREAD_BARRIER_SERIAL_THREAD) {</div><div class='add'>+        GF_ASYNC_CANTFAIL(pthread_barrier_destroy, &amp;gf_async_ctrl.sync);</div><div class='add'>+        ret = 0;</div><div class='add'>+    }</div><div class='add'>+    if (caa_unlikely(ret != 0)) {</div><div class='add'>+        gf_async_fatal(-ret, "pthread_barrier_wait() failed");</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf_async_sigmask_empty(sigset_t *mask)</div><div class='add'>+{</div><div class='add'>+    GF_ASYNC_CANTFAIL_ERRNO(sigemptyset, mask);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf_async_sigmask_add(sigset_t *mask, int32_t signal)</div><div class='add'>+{</div><div class='add'>+    GF_ASYNC_CANTFAIL_ERRNO(sigaddset, mask, signal);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf_async_sigmask_set(int32_t mode, sigset_t *mask, sigset_t *old)</div><div class='add'>+{</div><div class='add'>+    GF_ASYNC_CANTFAIL(pthread_sigmask, mode, mask, old);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf_async_sigaction(int32_t signum, const struct sigaction *action,</div><div class='add'>+                   struct sigaction *old)</div><div class='add'>+{</div><div class='add'>+    GF_ASYNC_CANTFAIL_ERRNO(sigaction, signum, action, old);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int32_t</div><div class='add'>+gf_async_sigwait(sigset_t *set)</div><div class='add'>+{</div><div class='add'>+    int32_t ret, signum;</div><div class='add'>+</div><div class='add'>+    do {</div><div class='add'>+        ret = sigwait(set, &amp;signum);</div><div class='add'>+    } while (caa_unlikely((ret &lt; 0) &amp;&amp; (errno == EINTR)));</div><div class='add'>+</div><div class='add'>+    if (caa_unlikely(ret &lt; 0)) {</div><div class='add'>+        ret = -errno;</div><div class='add'>+        gf_async_fatal(ret, "sigwait() failed");</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return signum;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int32_t</div><div class='add'>+gf_async_sigtimedwait(sigset_t *set, struct timespec *timeout)</div><div class='add'>+{</div><div class='add'>+    int32_t ret;</div><div class='add'>+</div><div class='add'>+    do {</div><div class='add'>+        ret = sigtimedwait(set, NULL, timeout);</div><div class='add'>+    } while (caa_unlikely((ret &lt; 0) &amp;&amp; (errno == EINTR)));</div><div class='add'>+    if (caa_unlikely(ret &lt; 0)) {</div><div class='add'>+        ret = -errno;</div><div class='add'>+        /* EAGAIN means that the timeout has expired, so we allow this error.</div><div class='add'>+         * Any other error shouldn't happen. */</div><div class='add'>+        if (caa_unlikely(ret != -EAGAIN)) {</div><div class='add'>+            gf_async_fatal(ret, "sigtimedwait() failed");</div><div class='add'>+        }</div><div class='add'>+        ret = 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf_async_sigbroadcast(int32_t signum)</div><div class='add'>+{</div><div class='add'>+    GF_ASYNC_CANTFAIL_ERRNO(kill, gf_async_ctrl.pid, signum);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf_async_signal_handler(int32_t signum)</div><div class='add'>+{</div><div class='add'>+    /* We should never handle a signal in this function. */</div><div class='add'>+    gf_async_fatal(-EBUSY,</div><div class='add'>+                   "Unexpected processing of signal %d through a handler.",</div><div class='add'>+                   signum);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf_async_signal_setup(void)</div><div class='add'>+{</div><div class='add'>+    struct sigaction action;</div><div class='add'>+</div><div class='add'>+    /* We configure all related signals so that we can detect threads using an</div><div class='add'>+     * invalid signal mask that doesn't block our critical signal. */</div><div class='add'>+    memset(&amp;action, 0, sizeof(action));</div><div class='add'>+    action.sa_handler = gf_async_signal_handler;</div><div class='add'>+</div><div class='add'>+    gf_async_sigaction(GF_ASYNC_SIGCTRL, &amp;action, &amp;gf_async_ctrl.handler_ctrl);</div><div class='add'>+</div><div class='add'>+    gf_async_sigaction(GF_ASYNC_SIGQUEUE, &amp;action,</div><div class='add'>+                       &amp;gf_async_ctrl.handler_queue);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf_async_signal_restore(void)</div><div class='add'>+{</div><div class='add'>+    /* Handlers we have previously changed are restored back to their original</div><div class='add'>+     * value. */</div><div class='add'>+</div><div class='add'>+    if (gf_async_ctrl.handler_ctrl.sa_handler != gf_async_signal_handler) {</div><div class='add'>+        gf_async_sigaction(GF_ASYNC_SIGCTRL, &amp;gf_async_ctrl.handler_ctrl, NULL);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (gf_async_ctrl.handler_queue.sa_handler != gf_async_signal_handler) {</div><div class='add'>+        gf_async_sigaction(GF_ASYNC_SIGQUEUE, &amp;gf_async_ctrl.handler_queue,</div><div class='add'>+                           NULL);</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf_async_signal_flush(void)</div><div class='add'>+{</div><div class='add'>+    struct timespec delay;</div><div class='add'>+</div><div class='add'>+    delay.tv_sec = 0;</div><div class='add'>+    delay.tv_nsec = 0;</div><div class='add'>+</div><div class='add'>+    /* We read all pending signals so that they don't trigger once the signal</div><div class='add'>+     * mask of some thread is changed. */</div><div class='add'>+    while (gf_async_sigtimedwait(&amp;gf_async_ctrl.sigmask_ctrl, &amp;delay) &gt; 0) {</div><div class='add'>+    }</div><div class='add'>+    while (gf_async_sigtimedwait(&amp;gf_async_ctrl.sigmask_queue, &amp;delay) &gt; 0) {</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int32_t</div><div class='add'>+gf_async_thread_create(pthread_t *thread, int32_t id, void *data)</div><div class='add'>+{</div><div class='add'>+    int32_t ret;</div><div class='add'>+</div><div class='add'>+    ret = gf_thread_create(thread, NULL, gf_async_worker, data,</div><div class='add'>+                           GF_ASYNC_THREAD_NAME "%u", id);</div><div class='add'>+    if (caa_unlikely(ret &lt; 0)) {</div><div class='add'>+        /* TODO: gf_thread_create() should return a more specific error</div><div class='add'>+         *       code. */</div><div class='add'>+        return -ENOMEM;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf_async_thread_wait(pthread_t thread)</div><div class='add'>+{</div><div class='add'>+    /* TODO: this is a blocking call executed inside one of the workers of the</div><div class='add'>+     *       thread pool. This is bad, but this is only executed once we have</div><div class='add'>+     *       received a notification from the thread that it's terminating, so</div><div class='add'>+     *       this should return almost immediately. However, to be more robust</div><div class='add'>+     *       it would be better to use pthread_timedjoin_np() (or even a call</div><div class='add'>+     *       to pthread_tryjoin_np() followed by a delayed recheck if it</div><div class='add'>+     *       fails), but they are not portable. We should see how to do this</div><div class='add'>+     *       in other platforms. */</div><div class='add'>+    GF_ASYNC_CANTFAIL(pthread_join, thread, NULL);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int32_t</div><div class='add'>+gf_async_worker_create(void)</div><div class='add'>+{</div><div class='add'>+    struct cds_wfs_node *node;</div><div class='add'>+    gf_async_worker_t *worker;</div><div class='add'>+    uint32_t counts, running, max;</div><div class='add'>+    int32_t ret;</div><div class='add'>+</div><div class='add'>+    node = __cds_wfs_pop_blocking(&amp;gf_async_ctrl.available);</div><div class='add'>+    if (caa_unlikely(node == NULL)) {</div><div class='add'>+        /* There are no more available workers. We have all threads running. */</div><div class='add'>+        return 1;</div><div class='add'>+    }</div><div class='add'>+    cds_wfs_node_init(node);</div><div class='add'>+</div><div class='add'>+    ret = 1;</div><div class='add'>+</div><div class='add'>+    counts = uatomic_read(&amp;gf_async_ctrl.counts);</div><div class='add'>+    max = uatomic_read(&amp;gf_async_ctrl.max_threads);</div><div class='add'>+    running = GF_ASYNC_COUNT_RUNNING(counts);</div><div class='add'>+    if (running &lt; max) {</div><div class='add'>+        uatomic_add(&amp;gf_async_ctrl.counts, GF_ASYNC_COUNTS(1, 0));</div><div class='add'>+</div><div class='add'>+        worker = caa_container_of(node, gf_async_worker_t, stack);</div><div class='add'>+</div><div class='add'>+        ret = gf_async_thread_create(&amp;worker-&gt;thread, worker-&gt;id, worker);</div><div class='add'>+        if (caa_likely(ret &gt;= 0)) {</div><div class='add'>+            return 0;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        uatomic_add(&amp;gf_async_ctrl.counts, GF_ASYNC_COUNTS(-1, 0));</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    cds_wfs_push(&amp;gf_async_ctrl.available, node);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf_async_worker_enable(void)</div><div class='add'>+{</div><div class='add'>+    /* This will wake one of the spare workers. If all workers are busy now,</div><div class='add'>+     * the signal will be queued so that the first one that completes its</div><div class='add'>+     * work will become the leader. */</div><div class='add'>+    gf_async_sigbroadcast(GF_ASYNC_SIGCTRL);</div><div class='add'>+</div><div class='add'>+    /* We have consumed a spare worker. We create another one for future</div><div class='add'>+     * needs. */</div><div class='add'>+    gf_async_worker_create();</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf_async_worker_wait(void)</div><div class='add'>+{</div><div class='add'>+    int32_t signum;</div><div class='add'>+</div><div class='add'>+    signum = gf_async_sigwait(&amp;gf_async_ctrl.sigmask_ctrl);</div><div class='add'>+    if (caa_unlikely(signum != GF_ASYNC_SIGCTRL)) {</div><div class='add'>+        gf_async_fatal(-EINVAL, "Worker received an unexpected signal (%d)",</div><div class='add'>+                       signum);</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf_async_leader_wait(void)</div><div class='add'>+{</div><div class='add'>+    int32_t signum;</div><div class='add'>+</div><div class='add'>+    signum = gf_async_sigwait(&amp;gf_async_ctrl.sigmask_queue);</div><div class='add'>+    if (caa_unlikely(signum != GF_ASYNC_SIGQUEUE)) {</div><div class='add'>+        gf_async_fatal(-EINVAL, "Leader received an unexpected signal (%d)",</div><div class='add'>+                       signum);</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf_async_run(struct cds_wfcq_node *node)</div><div class='add'>+{</div><div class='add'>+    gf_async_t *async;</div><div class='add'>+</div><div class='add'>+    /* We've just got work from the queue. Process it. */</div><div class='add'>+    async = caa_container_of(node, gf_async_t, queue);</div><div class='add'>+    /* TODO: remove dependency from THIS and xl. */</div><div class='add'>+    THIS = async-&gt;xl;</div><div class='add'>+    async-&gt;cbk(async-&gt;xl, async);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf_async_worker_run(void)</div><div class='add'>+{</div><div class='add'>+    struct cds_wfcq_node *node;</div><div class='add'>+</div><div class='add'>+    do {</div><div class='add'>+        /* We keep executing jobs from the queue while it's not empty. Note</div><div class='add'>+         * that while we do this, we are ignoring any stop request. That's</div><div class='add'>+         * fine, since we need to process our own 'join' messages to fully</div><div class='add'>+         * terminate all threads. Note that normal jobs should have already</div><div class='add'>+         * completed once a stop request is received. */</div><div class='add'>+        node = cds_wfcq_dequeue_blocking(&amp;gf_async_ctrl.queue.head,</div><div class='add'>+                                         &amp;gf_async_ctrl.queue.tail);</div><div class='add'>+        if (node != NULL) {</div><div class='add'>+            gf_async_run(node);</div><div class='add'>+        }</div><div class='add'>+    } while (node != NULL);</div><div class='add'>+</div><div class='add'>+    /* TODO: I've tried to keep the worker looking at the queue for some small</div><div class='add'>+     *       amount of time in a busy loop to see if more jobs come soon. With</div><div class='add'>+     *       this I attempted to avoid the overhead of signal management if</div><div class='add'>+     *       jobs come fast enough. However experimental results seem to</div><div class='add'>+     *       indicate that doing this, CPU utilization grows and performance</div><div class='add'>+     *       is actually reduced. We need to see if that's because I used bad</div><div class='add'>+     *       parameters or it's really better to do it as it's done now. */</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf_async_leader_run(void)</div><div class='add'>+{</div><div class='add'>+    struct cds_wfcq_node *node;</div><div class='add'>+</div><div class='add'>+    node = cds_wfcq_dequeue_blocking(&amp;gf_async_ctrl.queue.head,</div><div class='add'>+                                     &amp;gf_async_ctrl.queue.tail);</div><div class='add'>+    while (caa_unlikely(node == NULL)) {</div><div class='add'>+        gf_async_leader_wait();</div><div class='add'>+</div><div class='add'>+        node = cds_wfcq_dequeue_blocking(&amp;gf_async_ctrl.queue.head,</div><div class='add'>+                                         &amp;gf_async_ctrl.queue.tail);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Activate the next available worker thread. It will become the new</div><div class='add'>+     * leader. */</div><div class='add'>+    gf_async_worker_enable();</div><div class='add'>+</div><div class='add'>+    gf_async_run(node);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static uint32_t</div><div class='add'>+gf_async_stop_check(gf_async_worker_t *worker)</div><div class='add'>+{</div><div class='add'>+    uint32_t counts, old, running, max;</div><div class='add'>+</div><div class='add'>+    /* First we check if we should stop without doing any costly atomic</div><div class='add'>+     * operation. */</div><div class='add'>+    old = uatomic_read(&amp;gf_async_ctrl.counts);</div><div class='add'>+    max = uatomic_read(&amp;gf_async_ctrl.max_threads);</div><div class='add'>+    running = GF_ASYNC_COUNT_RUNNING(old);</div><div class='add'>+    while (running &gt; max) {</div><div class='add'>+        /* There are too many threads. We try to stop the current worker. */</div><div class='add'>+        counts = uatomic_cmpxchg(&amp;gf_async_ctrl.counts, old,</div><div class='add'>+                                 old + GF_ASYNC_COUNTS(-1, 1));</div><div class='add'>+        if (old != counts) {</div><div class='add'>+            /* Another thread has just updated the counts. We need to retry. */</div><div class='add'>+            old = counts;</div><div class='add'>+            running = GF_ASYNC_COUNT_RUNNING(old);</div><div class='add'>+</div><div class='add'>+            continue;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        running--;</div><div class='add'>+        worker-&gt;running = false;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return running;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf_async_stop_all(xlator_t *xl, gf_async_t *async)</div><div class='add'>+{</div><div class='add'>+    if (gf_async_stop_check(gf_async_current_worker) &gt; 0) {</div><div class='add'>+        /* There are more workers running. We propagate the stop request to</div><div class='add'>+         * them. */</div><div class='add'>+        gf_async(async, xl, gf_async_stop_all);</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf_async_join(xlator_t *xl, gf_async_t *async)</div><div class='add'>+{</div><div class='add'>+    gf_async_worker_t *worker;</div><div class='add'>+</div><div class='add'>+    worker = caa_container_of(async, gf_async_worker_t, async);</div><div class='add'>+</div><div class='add'>+    gf_async_thread_wait(worker-&gt;thread);</div><div class='add'>+</div><div class='add'>+    cds_wfs_push(&amp;gf_async_ctrl.available, &amp;worker-&gt;stack);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf_async_terminate(gf_async_worker_t *worker)</div><div class='add'>+{</div><div class='add'>+    uint32_t counts;</div><div class='add'>+</div><div class='add'>+    counts = uatomic_add_return(&amp;gf_async_ctrl.counts, GF_ASYNC_COUNTS(0, -1));</div><div class='add'>+    if (counts == 0) {</div><div class='add'>+        /* This is the termination of the last worker thread. We need to</div><div class='add'>+         * synchronize the main thread that is waiting for all workers to</div><div class='add'>+         * finish. */</div><div class='add'>+        gf_async_ctrl.sync_thread = worker-&gt;thread;</div><div class='add'>+</div><div class='add'>+        gf_async_sync_now();</div><div class='add'>+    } else {</div><div class='add'>+        /* Force someone else to join this thread to release resources. */</div><div class='add'>+        gf_async(&amp;worker-&gt;async, THIS, gf_async_join);</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void *</div><div class='add'>+gf_async_worker(void *arg)</div><div class='add'>+{</div><div class='add'>+    gf_async_worker_t *worker;</div><div class='add'>+</div><div class='add'>+    worker = (gf_async_worker_t *)arg;</div><div class='add'>+    gf_async_current_worker = worker;</div><div class='add'>+</div><div class='add'>+    worker-&gt;running = true;</div><div class='add'>+    do {</div><div class='add'>+        /* This thread does nothing until someone enables it to become a</div><div class='add'>+         * leader. */</div><div class='add'>+        gf_async_worker_wait();</div><div class='add'>+</div><div class='add'>+        /* This thread is now a leader. It will process jobs from the queue</div><div class='add'>+         * and, if necessary, enable another worker and transfer leadership</div><div class='add'>+         * to it. */</div><div class='add'>+        gf_async_leader_run();</div><div class='add'>+</div><div class='add'>+        /* This thread is not a leader anymore. It will continue processing</div><div class='add'>+         * queued jobs until it becomes empty. */</div><div class='add'>+        gf_async_worker_run();</div><div class='add'>+</div><div class='add'>+        /* Stop the current thread if there are too many threads running. */</div><div class='add'>+        gf_async_stop_check(worker);</div><div class='add'>+    } while (worker-&gt;running);</div><div class='add'>+</div><div class='add'>+    gf_async_terminate(worker);</div><div class='add'>+</div><div class='add'>+    return NULL;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf_async_cleanup(void)</div><div class='add'>+{</div><div class='add'>+    /* We do some basic initialization of the global variable 'gf_async_ctrl'</div><div class='add'>+     * so that it's put into a relatively consistent state. */</div><div class='add'>+</div><div class='add'>+    gf_async_ctrl.enabled = false;</div><div class='add'>+</div><div class='add'>+    gf_async_ctrl.pid = 0;</div><div class='add'>+    gf_async_sigmask_empty(&amp;gf_async_ctrl.sigmask_ctrl);</div><div class='add'>+    gf_async_sigmask_empty(&amp;gf_async_ctrl.sigmask_queue);</div><div class='add'>+</div><div class='add'>+    /* This is used to later detect if the handler of these signals have been</div><div class='add'>+     * changed or not. */</div><div class='add'>+    gf_async_ctrl.handler_ctrl.sa_handler = gf_async_signal_handler;</div><div class='add'>+    gf_async_ctrl.handler_queue.sa_handler = gf_async_signal_handler;</div><div class='add'>+</div><div class='add'>+    gf_async_ctrl.table = NULL;</div><div class='add'>+    gf_async_ctrl.max_threads = 0;</div><div class='add'>+    gf_async_ctrl.counts = 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+gf_async_fini(void)</div><div class='add'>+{</div><div class='add'>+    gf_async_t async;</div><div class='add'>+</div><div class='add'>+    if (uatomic_read(&amp;gf_async_ctrl.counts) != 0) {</div><div class='add'>+        /* We ensure that all threads will quit on the next check. */</div><div class='add'>+        gf_async_ctrl.max_threads = 0;</div><div class='add'>+</div><div class='add'>+        /* Send the stop request to the thread pool. This will cause the</div><div class='add'>+         * execution of gf_async_stop_all() by one of the worker threads which,</div><div class='add'>+         * eventually, will terminate all worker threads. */</div><div class='add'>+        gf_async(&amp;async, THIS, gf_async_stop_all);</div><div class='add'>+</div><div class='add'>+        /* We synchronize here with the last thread. */</div><div class='add'>+        gf_async_sync_now();</div><div class='add'>+</div><div class='add'>+        /* We have just synchronized with the latest thread. Now just wait for</div><div class='add'>+         * it to terminate. */</div><div class='add'>+        gf_async_thread_wait(gf_async_ctrl.sync_thread);</div><div class='add'>+</div><div class='add'>+        gf_async_signal_flush();</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    gf_async_signal_restore();</div><div class='add'>+</div><div class='add'>+    gf_async_cleanup();</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+gf_async_adjust_threads(int32_t threads)</div><div class='add'>+{</div><div class='add'>+    if (threads == 0) {</div><div class='add'>+        /* By default we allow a maximum of 2 * #cores worker threads. This</div><div class='add'>+         * value is to try to accommodate threads that will do some I/O. Having</div><div class='add'>+         * more threads than cores we can keep CPU busy even if some threads</div><div class='add'>+         * are blocked for I/O. In the most efficient case, we can have #cores</div><div class='add'>+         * computing threads and #cores blocked threads on I/O. However this is</div><div class='add'>+         * hard to achieve because we can end with more than #cores computing</div><div class='add'>+         * threads, which won't provide a real benefit and will increase</div><div class='add'>+         * contention.</div><div class='add'>+         *</div><div class='add'>+         * TODO: implement a more intelligent dynamic maximum based on CPU</div><div class='add'>+         *       usage and/or system load. */</div><div class='add'>+        threads = sysconf(_SC_NPROCESSORS_ONLN) * 2;</div><div class='add'>+        if (threads &lt; 0) {</div><div class='add'>+            /* If we can't get the current number of processors, we pick a</div><div class='add'>+             * random number. */</div><div class='add'>+            threads = 16;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    if (threads &gt; GF_ASYNC_MAX_THREADS) {</div><div class='add'>+        threads = GF_ASYNC_MAX_THREADS;</div><div class='add'>+    }</div><div class='add'>+    uatomic_set(&amp;gf_async_ctrl.max_threads, threads);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+gf_async_init(glusterfs_ctx_t *ctx)</div><div class='add'>+{</div><div class='add'>+    sigset_t set;</div><div class='add'>+    gf_async_worker_t *worker;</div><div class='add'>+    uint32_t i;</div><div class='add'>+    int32_t ret;</div><div class='add'>+    bool running;</div><div class='add'>+</div><div class='add'>+    gf_async_cleanup();</div><div class='add'>+</div><div class='add'>+    if (!ctx-&gt;cmd_args.global_threading ||</div><div class='add'>+        (ctx-&gt;process_mode == GF_GLUSTERD_PROCESS)) {</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* At the init time, the maximum number of threads has not yet been</div><div class='add'>+     * configured. We use a small starting value that will be layer dynamically</div><div class='add'>+     * adjusted when ctx-&gt;config.max_threads is updated. */</div><div class='add'>+    gf_async_adjust_threads(GF_ASYNC_SPARE_THREADS + 1);</div><div class='add'>+</div><div class='add'>+    gf_async_ctrl.pid = getpid();</div><div class='add'>+</div><div class='add'>+    __cds_wfs_init(&amp;gf_async_ctrl.available);</div><div class='add'>+    cds_wfcq_init(&amp;gf_async_ctrl.queue.head, &amp;gf_async_ctrl.queue.tail);</div><div class='add'>+</div><div class='add'>+    gf_async_sync_init();</div><div class='add'>+</div><div class='add'>+    /* TODO: it would be cleaner to use dynamic memory, but at this point some</div><div class='add'>+     *       memory management resources are not yet initialized. */</div><div class='add'>+    gf_async_ctrl.table = gf_async_workers;</div><div class='add'>+</div><div class='add'>+    /* We keep all workers in a stack. It will be used when a new thread needs</div><div class='add'>+     * to be created. */</div><div class='add'>+    for (i = GF_ASYNC_MAX_THREADS; i &gt; 0; i--) {</div><div class='add'>+        worker = &amp;gf_async_ctrl.table[i - 1];</div><div class='add'>+</div><div class='add'>+        worker-&gt;id = i - 1;</div><div class='add'>+        cds_wfs_node_init(&amp;worker-&gt;stack);</div><div class='add'>+        cds_wfs_push(&amp;gf_async_ctrl.available, &amp;worker-&gt;stack);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Prepare the signal mask for regular workers and the leader. */</div><div class='add'>+    gf_async_sigmask_add(&amp;gf_async_ctrl.sigmask_ctrl, GF_ASYNC_SIGCTRL);</div><div class='add'>+    gf_async_sigmask_add(&amp;gf_async_ctrl.sigmask_queue, GF_ASYNC_SIGQUEUE);</div><div class='add'>+</div><div class='add'>+    /* TODO: this is needed to block our special signals in the current thread</div><div class='add'>+     *       and all children that it starts. It would be cleaner to do it when</div><div class='add'>+     *       signals are initialized, but there doesn't seem to be a unique</div><div class='add'>+     *       place to do that, so for now we do it here. */</div><div class='add'>+    gf_async_sigmask_empty(&amp;set);</div><div class='add'>+    gf_async_sigmask_add(&amp;set, GF_ASYNC_SIGCTRL);</div><div class='add'>+    gf_async_sigmask_add(&amp;set, GF_ASYNC_SIGQUEUE);</div><div class='add'>+    gf_async_sigmask_set(SIG_BLOCK, &amp;set, NULL);</div><div class='add'>+</div><div class='add'>+    /* Configure the signal handlers. This is mostly for safety, not really</div><div class='add'>+     * needed, but it doesn't hurt. Note that the caller must ensure that the</div><div class='add'>+     * signals we need to run are already blocked in any thread already</div><div class='add'>+     * started. Otherwise this won't work. */</div><div class='add'>+    gf_async_signal_setup();</div><div class='add'>+</div><div class='add'>+    running = false;</div><div class='add'>+</div><div class='add'>+    /* We start the spare workers + 1 for the leader. */</div><div class='add'>+    for (i = 0; i &lt; GF_ASYNC_SPARE_THREADS; i++) {</div><div class='add'>+        ret = gf_async_worker_create();</div><div class='add'>+        if (caa_unlikely(ret &lt; 0)) {</div><div class='add'>+            /* This is the initial start up so we enforce that the spare</div><div class='add'>+             * threads are created. If this fails at the beginning, it's very</div><div class='add'>+             * unlikely that the async workers could do its job, so we abort</div><div class='add'>+             * the initialization. */</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        /* Once the first thread is started, we can enable it to become the</div><div class='add'>+         * initial leader. */</div><div class='add'>+        if ((ret == 0) &amp;&amp; !running) {</div><div class='add'>+            running = true;</div><div class='add'>+            gf_async_worker_enable();</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (caa_unlikely(!running)) {</div><div class='add'>+        gf_async_fatal(-ENOMEM, "No worker thread has started");</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    gf_async_ctrl.enabled = true;</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        gf_async_error(ret, "Unable to initialize the thread pool.");</div><div class='add'>+        gf_async_fini();</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='head'>diff --git a/libglusterfs/src/byte-order.h b/libglusterfs/src/byte-order.h<br/>deleted file mode 100644<br/>index 817ae47904e..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/libglusterfs/src/byte-order.h?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/byte-order.h</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,150 +0,0 @@</div><div class='del'>-/*</div><div class='del'>-   Copyright (c) 2008-2009 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='del'>-   This file is part of GlusterFS.</div><div class='del'>-</div><div class='del'>-   GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-   it under the terms of the GNU General Public License as published</div><div class='del'>-   by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-   or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-   GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-   WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-   General Public License for more details.</div><div class='del'>-</div><div class='del'>-   You should have received a copy of the GNU General Public License</div><div class='del'>-   along with this program.  If not, see</div><div class='del'>-   &lt;http://www.gnu.org/licenses/&gt;.</div><div class='del'>-*/</div><div class='del'>-</div><div class='del'>-#ifndef _BYTE_ORDER_H</div><div class='del'>-#define _BYTE_ORDER_H</div><div class='del'>-</div><div class='del'>-#include &lt;inttypes.h&gt;</div><div class='del'>-</div><div class='del'>-#define LS1 0x00ffU</div><div class='del'>-#define MS1 0xff00U</div><div class='del'>-#define LS2 0x0000ffffU</div><div class='del'>-#define MS2 0xffff0000U</div><div class='del'>-#define LS4 0x00000000ffffffffULL</div><div class='del'>-#define MS4 0xffffffff00000000ULL</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-static uint16_t (*hton16) (uint16_t);</div><div class='del'>-static uint32_t (*hton32) (uint32_t);</div><div class='del'>-static uint64_t (*hton64) (uint64_t);</div><div class='del'>-</div><div class='del'>-#define ntoh16 hton16</div><div class='del'>-#define ntoh32 hton32</div><div class='del'>-#define ntoh64 hton64</div><div class='del'>-</div><div class='del'>-#define do_swap2(x) (((x&amp;LS1) &lt;&lt; 8)|(((x&amp;MS1) &gt;&gt; 8)))</div><div class='del'>-#define do_swap4(x) ((do_swap2(x&amp;LS2) &lt;&lt; 16)|(do_swap2((x&amp;MS2) &gt;&gt; 16)))</div><div class='del'>-#define do_swap8(x) ((do_swap4(x&amp;LS4) &lt;&lt; 32)|(do_swap4((x&amp;MS4) &gt;&gt; 32)))</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-static inline uint16_t</div><div class='del'>-__swap16 (uint16_t x)</div><div class='del'>-{</div><div class='del'>-	return do_swap2(x);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-static inline uint32_t</div><div class='del'>-__swap32 (uint32_t x)</div><div class='del'>-{</div><div class='del'>-	return do_swap4(x);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-static inline uint64_t</div><div class='del'>-__swap64 (uint64_t x)</div><div class='del'>-{</div><div class='del'>-	return do_swap8(x);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-static inline uint16_t</div><div class='del'>-__noswap16 (uint16_t x)</div><div class='del'>-{</div><div class='del'>-	return x;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-static inline uint32_t</div><div class='del'>-__noswap32 (uint32_t x)</div><div class='del'>-{</div><div class='del'>-	return x;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-static inline uint64_t</div><div class='del'>-__noswap64 (uint64_t x)</div><div class='del'>-{</div><div class='del'>-	return x;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-static inline uint16_t</div><div class='del'>-__byte_order_init16 (uint16_t i)</div><div class='del'>-{</div><div class='del'>-	uint32_t num = 1;</div><div class='del'>-</div><div class='del'>-	if (((char *)(&amp;num))[0] == 1) {</div><div class='del'>-		hton16 = __swap16;</div><div class='del'>-		hton32 = __swap32;</div><div class='del'>-		hton64 = __swap64;</div><div class='del'>-	} else {</div><div class='del'>-		hton16 = __noswap16;</div><div class='del'>-		hton32 = __noswap32;</div><div class='del'>-		hton64 = __noswap64;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	return hton16 (i);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-static inline uint32_t</div><div class='del'>-__byte_order_init32 (uint32_t i)</div><div class='del'>-{</div><div class='del'>-	uint32_t num = 1;</div><div class='del'>-</div><div class='del'>-	if (((char *)(&amp;num))[0] == 1) {</div><div class='del'>-		hton16 = __swap16;</div><div class='del'>-		hton32 = __swap32;</div><div class='del'>-		hton64 = __swap64;</div><div class='del'>-	} else {</div><div class='del'>-		hton16 = __noswap16;</div><div class='del'>-		hton32 = __noswap32;</div><div class='del'>-		hton64 = __noswap64;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	return hton32 (i);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-static inline uint64_t</div><div class='del'>-__byte_order_init64 (uint64_t i)</div><div class='del'>-{</div><div class='del'>-	uint32_t num = 1;</div><div class='del'>-</div><div class='del'>-	if (((char *)(&amp;num))[0] == 1) {</div><div class='del'>-		hton16 = __swap16;</div><div class='del'>-		hton32 = __swap32;</div><div class='del'>-		hton64 = __swap64;</div><div class='del'>-	} else {</div><div class='del'>-		hton16 = __noswap16;</div><div class='del'>-		hton32 = __noswap32;</div><div class='del'>-		hton64 = __noswap64;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	return hton64 (i);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-static uint16_t (*hton16) (uint16_t) = __byte_order_init16;</div><div class='del'>-static uint32_t (*hton32) (uint32_t) = __byte_order_init32;</div><div class='del'>-static uint64_t (*hton64) (uint64_t) = __byte_order_init64;</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-#endif /* _BYTE_ORDER_H */</div><div class='head'>diff --git a/libglusterfs/src/call-stub.c b/libglusterfs/src/call-stub.c<br/>index 7008cfd6f38..ee84f08acd4 100644<br/>--- a/<a href='/cgit/glusterfs.git/tree/libglusterfs/src/call-stub.c?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/call-stub.c</a><br/>+++ b/<a href='/cgit/glusterfs.git/tree/libglusterfs/src/call-stub.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>libglusterfs/src/call-stub.c</a></div><div class='hunk'>@@ -1,3881 +1,2467 @@</div><div class='ctx'> /*</div><div class='del'>-  Copyright (c) 2007-2009 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='add'>+  Copyright (c) 2008-2012 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='ctx'>   This file is part of GlusterFS.</div><div class='ctx'> </div><div class='del'>-  GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-  it under the terms of the GNU General Public License as published</div><div class='del'>-  by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-  or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-  GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-  WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-  General Public License for more details.</div><div class='del'>-</div><div class='del'>-  You should have received a copy of the GNU General Public License</div><div class='del'>-  along with this program.  If not, see</div><div class='del'>-  &lt;http://www.gnu.org/licenses/&gt;.</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='ctx'> */</div><div class='ctx'> </div><div class='del'>-#ifndef _CONFIG_H</div><div class='del'>-#define _CONFIG_H</div><div class='del'>-#include "config.h"</div><div class='del'>-#endif</div><div class='del'>-</div><div class='add'>+#include &lt;openssl/md5.h&gt;</div><div class='ctx'> #include &lt;inttypes.h&gt;</div><div class='ctx'> </div><div class='del'>-#include "md5.h"</div><div class='del'>-#include "call-stub.h"</div><div class='del'>-#include "mem-types.h"</div><div class='del'>-</div><div class='add'>+#include "glusterfs/call-stub.h"</div><div class='add'>+#include "glusterfs/mem-types.h"</div><div class='add'>+#include "glusterfs/libglusterfs-messages.h"</div><div class='ctx'> </div><div class='ctx'> static call_stub_t *</div><div class='del'>-stub_new (call_frame_t *frame,</div><div class='del'>-	  char wind,</div><div class='del'>-	  glusterfs_fop_t fop)</div><div class='add'>+stub_new(call_frame_t *frame, const char wind, const glusterfs_fop_t fop)</div><div class='ctx'> {</div><div class='del'>-	call_stub_t *new = NULL;</div><div class='add'>+    call_stub_t *new = NULL;</div><div class='add'>+</div><div class='add'>+    GF_VALIDATE_OR_GOTO("call-stub", frame, out);</div><div class='ctx'> </div><div class='del'>-	GF_VALIDATE_OR_GOTO ("call-stub", frame, out);</div><div class='add'>+    new = mem_get0(frame-&gt;this-&gt;ctx-&gt;stub_mem_pool);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("call-stub", new, out);</div><div class='ctx'> </div><div class='del'>-       new = mem_get0 (frame-&gt;this-&gt;ctx-&gt;stub_mem_pool);</div><div class='del'>-	GF_VALIDATE_OR_GOTO ("call-stub", new, out);</div><div class='add'>+    new-&gt;frame = frame;</div><div class='add'>+    new-&gt;wind = wind;</div><div class='add'>+    new-&gt;fop = fop;</div><div class='add'>+    new-&gt;stub_mem_pool = frame-&gt;this-&gt;ctx-&gt;stub_mem_pool;</div><div class='add'>+    INIT_LIST_HEAD(&amp;new-&gt;list);</div><div class='ctx'> </div><div class='del'>-	new-&gt;frame = frame;</div><div class='del'>-	new-&gt;wind = wind;</div><div class='del'>-	new-&gt;fop = fop;</div><div class='del'>-       new-&gt;stub_mem_pool = frame-&gt;this-&gt;ctx-&gt;stub_mem_pool;</div><div class='del'>-	INIT_LIST_HEAD (&amp;new-&gt;list);</div><div class='add'>+    INIT_LIST_HEAD(&amp;new-&gt;args_cbk.entries);</div><div class='ctx'> out:</div><div class='del'>-	return new;</div><div class='add'>+    return new;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> call_stub_t *</div><div class='del'>-fop_lookup_stub (call_frame_t *frame,</div><div class='del'>-		 fop_lookup_t fn,</div><div class='del'>-		 loc_t *loc,</div><div class='del'>-		 dict_t *xattr_req)</div><div class='add'>+fop_lookup_stub(call_frame_t *frame, fop_lookup_t fn, loc_t *loc, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-	call_stub_t *stub = NULL;</div><div class='add'>+    call_stub_t *stub = NULL;</div><div class='ctx'> </div><div class='del'>-	GF_VALIDATE_OR_GOTO ("call-stub", frame, out);</div><div class='del'>-	GF_VALIDATE_OR_GOTO ("call-stub", loc, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("call-stub", loc, out);</div><div class='ctx'> </div><div class='del'>-	stub = stub_new (frame, 1, GF_FOP_LOOKUP);</div><div class='del'>-	GF_VALIDATE_OR_GOTO ("call-stub", stub, out);</div><div class='add'>+    stub = stub_new(frame, 1, GF_FOP_LOOKUP);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("call-stub", stub, out);</div><div class='ctx'> </div><div class='del'>-	stub-&gt;args.lookup.fn = fn;</div><div class='add'>+    stub-&gt;fn.lookup = fn;</div><div class='add'>+    args_lookup_store(&amp;stub-&gt;args, loc, xdata);</div><div class='add'>+out:</div><div class='add'>+    return stub;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+call_stub_t *</div><div class='add'>+fop_lookup_cbk_stub(call_frame_t *frame, fop_lookup_cbk_t fn, int32_t op_ret,</div><div class='add'>+                    int32_t op_errno, inode_t *inode, struct iatt *buf,</div><div class='add'>+                    dict_t *xdata, struct iatt *postparent)</div><div class='add'>+{</div><div class='add'>+    call_stub_t *stub = NULL;</div><div class='ctx'> </div><div class='del'>-	if (xattr_req)</div><div class='del'>-		stub-&gt;args.lookup.xattr_req = dict_ref (xattr_req);</div><div class='add'>+    stub = stub_new(frame, 0, GF_FOP_LOOKUP);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("call-stub", stub, out);</div><div class='ctx'> </div><div class='del'>-	loc_copy (&amp;stub-&gt;args.lookup.loc, loc);</div><div class='add'>+    stub-&gt;fn_cbk.lookup = fn;</div><div class='add'>+    args_lookup_cbk_store(&amp;stub-&gt;args_cbk, op_ret, op_errno, inode, buf, xdata,</div><div class='add'>+                          postparent);</div><div class='ctx'> out:</div><div class='del'>-	return stub;</div><div class='add'>+    return stub;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> call_stub_t *</div><div class='del'>-fop_lookup_cbk_stub (call_frame_t *frame,</div><div class='del'>-		     fop_lookup_cbk_t fn,</div><div class='del'>-		     int32_t op_ret,</div><div class='del'>-		     int32_t op_errno,</div><div class='del'>-		     inode_t *inode,</div><div class='del'>-		     struct iatt *buf,</div><div class='del'>-                     dict_t *dict,</div><div class='del'>-                     struct iatt *postparent)</div><div class='add'>+fop_stat_stub(call_frame_t *frame, fop_stat_t fn, loc_t *loc, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-	call_stub_t *stub = NULL;</div><div class='add'>+    call_stub_t *stub = NULL;</div><div class='ctx'> </div><div class='del'>-	GF_VALIDATE_OR_GOTO ("call-stub", frame, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("call-stub", loc, out);</div><div class='ctx'> </div><div class='del'>-	stub = stub_new (frame, 0, GF_FOP_LOOKUP);</div><div class='del'>-	GF_VALIDATE_OR_GOTO ("call-stub", stub, out);</div><div class='add'>+    stub = stub_new(frame, 1, GF_FOP_STAT);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("call-stub", stub, out);</div><div class='ctx'> </div><div class='del'>-	stub-&gt;args.lookup_cbk.fn = fn;</div><div class='del'>-	stub-&gt;args.lookup_cbk.op_ret = op_ret;</div><div class='del'>-	stub-&gt;args.lookup_cbk.op_errno = op_errno;</div><div class='del'>-	if (inode)</div><div class='del'>-		stub-&gt;args.lookup_cbk.inode = inode_ref (inode);</div><div class='del'>-	if (buf)</div><div class='del'>-		stub-&gt;args.lookup_cbk.buf = *buf;</div><div class='del'>-	if (dict)</div><div class='del'>-		stub-&gt;args.lookup_cbk.dict = dict_ref (dict);</div><div class='del'>-        if (postparent)</div><div class='del'>-                stub-&gt;args.lookup_cbk.postparent = *postparent;</div><div class='add'>+    stub-&gt;fn.stat = fn;</div><div class='add'>+    args_stat_store(&amp;stub-&gt;args, loc, xdata);</div><div class='ctx'> out:</div><div class='del'>-	return stub;</div><div class='add'>+    return stub;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='del'>-</div><div class='ctx'> call_stub_t *</div><div class='del'>-fop_stat_stub (call_frame_t *frame,</div><div class='del'>-	       fop_stat_t fn,</div><div class='del'>-	       loc_t *loc)</div><div class='add'>+fop_stat_cbk_stub(call_frame_t *frame, fop_stat_cbk_t fn, int32_t op_ret,</div><div class='add'>+                  int32_t op_errno, struct iatt *buf, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-	call_stub_t *stub = NULL;</div><div class='del'>-  </div><div class='del'>-	GF_VALIDATE_OR_GOTO ("call-stub", frame, out);</div><div class='del'>-	GF_VALIDATE_OR_GOTO ("call-stub", loc, out);</div><div class='add'>+    call_stub_t *stub = NULL;</div><div class='ctx'> </div><div class='del'>-	stub = stub_new (frame, 1, GF_FOP_STAT);</div><div class='del'>-	GF_VALIDATE_OR_GOTO ("call-stub", stub, out);</div><div class='add'>+    stub = stub_new(frame, 0, GF_FOP_STAT);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("call-stub", stub, out);</div><div class='ctx'> </div><div class='del'>-	stub-&gt;args.stat.fn = fn;</div><div class='del'>-	loc_copy (&amp;stub-&gt;args.stat.loc, loc);</div><div class='add'>+    stub-&gt;fn_cbk.stat = fn;</div><div class='add'>+    args_stat_cbk_store(&amp;stub-&gt;args_cbk, op_ret, op_errno, buf, xdata);</div><div class='ctx'> out:</div><div class='del'>-	return stub;</div><div class='add'>+    return stub;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> call_stub_t *</div><div class='del'>-fop_stat_cbk_stub (call_frame_t *frame,</div><div class='del'>-		   fop_stat_cbk_t fn,</div><div class='del'>-		   int32_t op_ret,</div><div class='del'>-		   int32_t op_errno,</div><div class='del'>-		   struct iatt *buf)</div><div class='add'>+fop_fstat_stub(call_frame_t *frame, fop_fstat_t fn, fd_t *fd, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-	call_stub_t *stub = NULL;</div><div class='del'>-	</div><div class='del'>-	GF_VALIDATE_OR_GOTO ("call-stub", frame, out);</div><div class='add'>+    call_stub_t *stub = NULL;</div><div class='ctx'> </div><div class='del'>-	stub = stub_new (frame, 0, GF_FOP_STAT);</div><div class='del'>-	GF_VALIDATE_OR_GOTO ("call-stub", stub, out);</div><div class='add'>+    stub = stub_new(frame, 1, GF_FOP_FSTAT);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("call-stub", stub, out);</div><div class='ctx'> </div><div class='del'>-	stub-&gt;args.stat_cbk.fn = fn;</div><div class='del'>-	stub-&gt;args.stat_cbk.op_ret = op_ret;</div><div class='del'>-	stub-&gt;args.stat_cbk.op_errno = op_errno;</div><div class='del'>-	if (op_ret == 0)</div><div class='del'>-		stub-&gt;args.stat_cbk.buf = *buf;</div><div class='add'>+    stub-&gt;fn.fstat = fn;</div><div class='add'>+    args_fstat_store(&amp;stub-&gt;args, fd, xdata);</div><div class='ctx'> out:</div><div class='del'>-	return stub;</div><div class='add'>+    return stub;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> call_stub_t *</div><div class='del'>-fop_fstat_stub (call_frame_t *frame,</div><div class='del'>-		fop_fstat_t fn,</div><div class='del'>-		fd_t *fd)</div><div class='add'>+fop_fstat_cbk_stub(call_frame_t *frame, fop_fstat_cbk_t fn, int32_t op_ret,</div><div class='add'>+                   int32_t op_errno, struct iatt *buf, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-	call_stub_t *stub = NULL;</div><div class='del'>-</div><div class='del'>-	GF_VALIDATE_OR_GOTO ("call-stub", frame, out);</div><div class='del'>-</div><div class='del'>-	stub = stub_new (frame, 1, GF_FOP_FSTAT);</div><div class='del'>-	GF_VALIDATE_OR_GOTO ("call-stub", stub, out);</div><div class='add'>+    call_stub_t *stub = NULL;</div><div class='ctx'> </div><div class='del'>-	stub-&gt;args.fstat.fn = fn;</div><div class='add'>+    stub = stub_new(frame, 0, GF_FOP_FSTAT);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("call-stub", stub, out);</div><div class='ctx'> </div><div class='del'>-	if (fd)</div><div class='del'>-		stub-&gt;args.fstat.fd = fd_ref (fd);</div><div class='add'>+    stub-&gt;fn_cbk.fstat = fn;</div><div class='add'>+    args_fstat_cbk_store(&amp;stub-&gt;args_cbk, op_ret, op_errno, buf, xdata);</div><div class='ctx'> out:</div><div class='del'>-	return stub;</div><div class='add'>+    return stub;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> call_stub_t *</div><div class='del'>-fop_fstat_cbk_stub (call_frame_t *frame,</div><div class='del'>-		    fop_fstat_cbk_t fn,</div><div class='del'>-		    int32_t op_ret,</div><div class='del'>-		    int32_t op_errno,</div><div class='del'>-		    struct iatt *buf)</div><div class='add'>+fop_truncate_stub(call_frame_t *frame, fop_truncate_t fn, loc_t *loc, off_t off,</div><div class='add'>+                  dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-	call_stub_t *stub = NULL;</div><div class='add'>+    call_stub_t *stub = NULL;</div><div class='ctx'> </div><div class='del'>-	GF_VALIDATE_OR_GOTO ("call-stub", frame, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("call-stub", loc, out);</div><div class='ctx'> </div><div class='del'>-	stub = stub_new (frame, 0, GF_FOP_FSTAT);</div><div class='del'>-	GF_VALIDATE_OR_GOTO ("call-stub", stub, out);</div><div class='add'>+    stub = stub_new(frame, 1, GF_FOP_TRUNCATE);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("call-stub", stub, out);</div><div class='ctx'> </div><div class='del'>-	stub-&gt;args.fstat_cbk.fn = fn;</div><div class='del'>-	stub-&gt;args.fstat_cbk.op_ret = op_ret;</div><div class='del'>-	stub-&gt;args.fstat_cbk.op_errno = op_errno;</div><div class='del'>-	if (buf)</div><div class='del'>-		stub-&gt;args.fstat_cbk.buf = *buf;</div><div class='add'>+    stub-&gt;fn.truncate = fn;</div><div class='add'>+    args_truncate_store(&amp;stub-&gt;args, loc, off, xdata);</div><div class='ctx'> out:</div><div class='del'>-	return stub;</div><div class='add'>+    return stub;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+call_stub_t *</div><div class='add'>+fop_truncate_cbk_stub(call_frame_t *frame, fop_truncate_cbk_t fn,</div><div class='add'>+                      int32_t op_ret, int32_t op_errno, struct iatt *prebuf,</div><div class='add'>+                      struct iatt *postbuf, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    call_stub_t *stub = NULL;</div><div class='ctx'> </div><div class='del'>-/* truncate */</div><div class='add'>+    stub = stub_new(frame, 0, GF_FOP_TRUNCATE);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("call-stub", stub, out);</div><div class='add'>+</div><div class='add'>+    stub-&gt;fn_cbk.truncate = fn;</div><div class='add'>+    args_truncate_cbk_store(&amp;stub-&gt;args_cbk, op_ret, op_errno, prebuf, postbuf,</div><div class='add'>+                            xdata);</div><div class='add'>+out:</div><div class='add'>+    return stub;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> call_stub_t *</div><div class='del'>-fop_truncate_stub (call_frame_t *frame,</div><div class='del'>-		   fop_truncate_t fn,</div><div class='del'>-		   loc_t *loc,</div><div class='del'>-		   off_t off)</div><div class='add'>+fop_ftruncate_stub(call_frame_t *frame, fop_ftruncate_t fn, fd_t *fd, off_t off,</div><div class='add'>+                   dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-	call_stub_t *stub = NULL;</div><div class='add'>+    call_stub_t *stub = NULL;</div><div class='ctx'> </div><div class='del'>-	GF_VALIDATE_OR_GOTO ("call-stub", frame, out);	</div><div class='del'>-	GF_VALIDATE_OR_GOTO ("call-stub", loc, out);</div><div class='add'>+    stub = stub_new(frame, 1, GF_FOP_FTRUNCATE);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("call-stub", stub, out);</div><div class='ctx'> </div><div class='del'>-	stub = stub_new (frame, 1, GF_FOP_TRUNCATE);</div><div class='del'>-	GF_VALIDATE_OR_GOTO ("call-stub", stub, out);</div><div class='add'>+    stub-&gt;fn.ftruncate = fn;</div><div class='add'>+    args_ftruncate_store(&amp;stub-&gt;args, fd, off, xdata);</div><div class='ctx'> </div><div class='del'>-	stub-&gt;args.truncate.fn = fn;</div><div class='del'>-	loc_copy (&amp;stub-&gt;args.truncate.loc, loc);</div><div class='del'>-	stub-&gt;args.truncate.off = off;</div><div class='ctx'> out:</div><div class='del'>-	return stub;</div><div class='add'>+    return stub;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> call_stub_t *</div><div class='del'>-fop_truncate_cbk_stub (call_frame_t *frame,</div><div class='del'>-		       fop_truncate_cbk_t fn,</div><div class='del'>-		       int32_t op_ret,</div><div class='del'>-		       int32_t op_errno,</div><div class='del'>-		       struct iatt *prebuf,</div><div class='del'>-                       struct iatt *postbuf)</div><div class='add'>+fop_ftruncate_cbk_stub(call_frame_t *frame, fop_ftruncate_cbk_t fn,</div><div class='add'>+                       int32_t op_ret, int32_t op_errno, struct iatt *prebuf,</div><div class='add'>+                       struct iatt *postbuf, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-	call_stub_t *stub = NULL;</div><div class='add'>+    call_stub_t *stub = NULL;</div><div class='ctx'> </div><div class='del'>-	GF_VALIDATE_OR_GOTO ("call-stub", frame, out);</div><div class='add'>+    stub = stub_new(frame, 0, GF_FOP_FTRUNCATE);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("call-stub", stub, out);</div><div class='ctx'> </div><div class='del'>-	stub = stub_new (frame, 0, GF_FOP_TRUNCATE);</div><div class='del'>-	GF_VALIDATE_OR_GOTO ("call-stub", stub, out);</div><div class='add'>+    stub-&gt;fn_cbk.ftruncate = fn;</div><div class='add'>+    args_ftruncate_cbk_store(&amp;stub-&gt;args_cbk, op_ret, op_errno, prebuf, postbuf,</div><div class='add'>+                             xdata);</div><div class='ctx'> </div><div class='del'>-	stub-&gt;args.truncate_cbk.fn = fn;</div><div class='del'>-	stub-&gt;args.truncate_cbk.op_ret = op_ret;</div><div class='del'>-	stub-&gt;args.truncate_cbk.op_errno = op_errno;</div><div class='del'>-	if (prebuf)</div><div class='del'>-		stub-&gt;args.truncate_cbk.prebuf = *prebuf;</div><div class='del'>-        if (postbuf)</div><div class='del'>-                stub-&gt;args.truncate_cbk.postbuf = *postbuf;</div><div class='ctx'> out:</div><div class='del'>-	return stub;</div><div class='add'>+    return stub;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> call_stub_t *</div><div class='del'>-fop_ftruncate_stub (call_frame_t *frame,</div><div class='del'>-		    fop_ftruncate_t fn,</div><div class='del'>-		    fd_t *fd,</div><div class='del'>-		    off_t off)</div><div class='add'>+fop_access_stub(call_frame_t *frame, fop_access_t fn, loc_t *loc, int32_t mask,</div><div class='add'>+                dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-	call_stub_t *stub = NULL;</div><div class='del'>-</div><div class='del'>-	GF_VALIDATE_OR_GOTO ("call-stub", frame, out);</div><div class='add'>+    call_stub_t *stub = NULL;</div><div class='ctx'> </div><div class='del'>-	stub = stub_new (frame, 1, GF_FOP_FTRUNCATE);</div><div class='del'>-	GF_VALIDATE_OR_GOTO ("call-stub", stub, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("call-stub", loc, out);</div><div class='ctx'> </div><div class='del'>-	stub-&gt;args.ftruncate.fn = fn;</div><div class='del'>-	if (fd)</div><div class='del'>-		stub-&gt;args.ftruncate.fd = fd_ref (fd);</div><div class='add'>+    stub = stub_new(frame, 1, GF_FOP_ACCESS);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("call-stub", stub, out);</div><div class='ctx'> </div><div class='del'>-	stub-&gt;args.ftruncate.off = off;</div><div class='add'>+    stub-&gt;fn.access = fn;</div><div class='add'>+    args_access_store(&amp;stub-&gt;args, loc, mask, xdata);</div><div class='ctx'> out:</div><div class='del'>-	return stub;</div><div class='add'>+    return stub;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> call_stub_t *</div><div class='del'>-fop_ftruncate_cbk_stub (call_frame_t *frame,</div><div class='del'>-			fop_ftruncate_cbk_t fn,</div><div class='del'>-			int32_t op_ret,</div><div class='del'>-			int32_t op_errno,</div><div class='del'>-			struct iatt *prebuf,</div><div class='del'>-                        struct iatt *postbuf)</div><div class='add'>+fop_access_cbk_stub(call_frame_t *frame, fop_access_cbk_t fn, int32_t op_ret,</div><div class='add'>+                    int32_t op_errno, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-	call_stub_t *stub = NULL;</div><div class='add'>+    call_stub_t *stub = NULL;</div><div class='ctx'> </div><div class='del'>-	GF_VALIDATE_OR_GOTO ("call-stub", frame, out);</div><div class='add'>+    stub = stub_new(frame, 0, GF_FOP_ACCESS);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("call-stub", stub, out);</div><div class='ctx'> </div><div class='del'>-	stub = stub_new (frame, 0, GF_FOP_FTRUNCATE);</div><div class='del'>-	GF_VALIDATE_OR_GOTO ("call-stub", stub, out);</div><div class='del'>-</div><div class='del'>-	stub-&gt;args.ftruncate_cbk.fn = fn;</div><div class='del'>-	stub-&gt;args.ftruncate_cbk.op_ret = op_ret;</div><div class='del'>-	stub-&gt;args.ftruncate_cbk.op_errno = op_errno;</div><div class='del'>-	if (prebuf)</div><div class='del'>-		stub-&gt;args.ftruncate_cbk.prebuf = *prebuf;</div><div class='del'>-	if (postbuf)</div><div class='del'>-		stub-&gt;args.ftruncate_cbk.postbuf = *postbuf;</div><div class='add'>+    stub-&gt;fn_cbk.access = fn;</div><div class='add'>+    args_access_cbk_store(&amp;stub-&gt;args_cbk, op_ret, op_errno, xdata);</div><div class='ctx'> out:</div><div class='del'>-	return stub;</div><div class='add'>+    return stub;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> call_stub_t *</div><div class='del'>-fop_access_stub (call_frame_t *frame,</div><div class='del'>-		 fop_access_t fn,</div><div class='del'>-		 loc_t *loc,</div><div class='del'>-		 int32_t mask)</div><div class='add'>+fop_readlink_stub(call_frame_t *frame, fop_readlink_t fn, loc_t *loc,</div><div class='add'>+                  size_t size, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-	call_stub_t *stub = NULL;</div><div class='add'>+    call_stub_t *stub = NULL;</div><div class='ctx'> </div><div class='del'>-	GF_VALIDATE_OR_GOTO ("call-stub", frame, out);</div><div class='del'>-	GF_VALIDATE_OR_GOTO ("call-stub", loc, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("call-stub", loc, out);</div><div class='ctx'> </div><div class='del'>-	stub = stub_new (frame, 1, GF_FOP_ACCESS);</div><div class='del'>-	GF_VALIDATE_OR_GOTO ("call-stub", stub, out);</div><div class='add'>+    stub = stub_new(frame, 1, GF_FOP_READLINK);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("call-stub", stub, out);</div><div class='ctx'> </div><div class='del'>-	stub-&gt;args.access.fn = fn;</div><div class='del'>-	loc_copy (&amp;stub-&gt;args.access.loc, loc);</div><div class='del'>-	stub-&gt;args.access.mask = mask;</div><div class='add'>+    stub-&gt;fn.readlink = fn;</div><div class='add'>+    args_readlink_store(&amp;stub-&gt;args, loc, size, xdata);</div><div class='ctx'> out:</div><div class='del'>-	return stub;</div><div class='add'>+    return stub;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+call_stub_t *</div><div class='add'>+fop_readlink_cbk_stub(call_frame_t *frame, fop_readlink_cbk_t fn,</div><div class='add'>+                      int32_t op_ret, int32_t op_errno, const char *path,</div><div class='add'>+                      struct iatt *stbuf, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    call_stub_t *stub = NULL;</div><div class='add'>+</div><div class='add'>+    stub = stub_new(frame, 0, GF_FOP_READLINK);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("call-stub", stub, out);</div><div class='add'>+</div><div class='add'>+    stub-&gt;fn_cbk.readlink = fn;</div><div class='add'>+    args_readlink_cbk_store(&amp;stub-&gt;args_cbk, op_ret, op_errno, path, stbuf,</div><div class='add'>+                            xdata);</div><div class='add'>+out:</div><div class='add'>+    return stub;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> call_stub_t *</div><div class='del'>-fop_access_cbk_stub (call_frame_t *frame,</div><div class='del'>-		     fop_access_cbk_t fn,</div><div class='del'>-		     int32_t op_ret,</div><div class='del'>-		     int32_t op_errno)</div><div class='add'>+fop_mknod_stub(call_frame_t *frame, fop_mknod_t fn, loc_t *loc, mode_t mode,</div><div class='add'>+               dev_t rdev, mode_t umask, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-	call_stub_t *stub = NULL;</div><div class='add'>+    call_stub_t *stub = NULL;</div><div class='ctx'> </div><div class='del'>-	GF_VALIDATE_OR_GOTO ("call-stub", frame, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("call-stub", loc, out);</div><div class='ctx'> </div><div class='del'>-	stub = stub_new (frame, 0, GF_FOP_ACCESS);</div><div class='del'>-	GF_VALIDATE_OR_GOTO ("call-stub", stub, out);</div><div class='add'>+    stub = stub_new(frame, 1, GF_FOP_MKNOD);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("call-stub", stub, out);</div><div class='ctx'> </div><div class='del'>-	stub-&gt;args.access_cbk.fn = fn;</div><div class='del'>-	stub-&gt;args.access_cbk.op_ret = op_ret;</div><div class='del'>-	stub-&gt;args.access_cbk.op_errno = op_errno;</div><div class='add'>+    stub-&gt;fn.mknod = fn;</div><div class='add'>+    args_mknod_store(&amp;stub-&gt;args, loc, mode, rdev, umask, xdata);</div><div class='ctx'> out:</div><div class='del'>-	return stub;</div><div class='add'>+    return stub;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> call_stub_t *</div><div class='del'>-fop_readlink_stub (call_frame_t *frame,</div><div class='del'>-		   fop_readlink_t fn,</div><div class='del'>-		   loc_t *loc,</div><div class='del'>-		   size_t size)</div><div class='add'>+fop_mknod_cbk_stub(call_frame_t *frame, fop_mknod_cbk_t fn, int32_t op_ret,</div><div class='add'>+                   int32_t op_errno, inode_t *inode, struct iatt *buf,</div><div class='add'>+                   struct iatt *preparent, struct iatt *postparent,</div><div class='add'>+                   dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-	call_stub_t *stub = NULL;</div><div class='add'>+    call_stub_t *stub = NULL;</div><div class='ctx'> </div><div class='del'>-	GF_VALIDATE_OR_GOTO ("call-stub", frame, out);</div><div class='del'>-	GF_VALIDATE_OR_GOTO ("call-stub", loc, out);</div><div class='del'>-	</div><div class='del'>-	stub = stub_new (frame, 1, GF_FOP_READLINK);</div><div class='del'>-	GF_VALIDATE_OR_GOTO ("call-stub", stub, out);</div><div class='add'>+    stub = stub_new(frame, 0, GF_FOP_MKNOD);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("call-stub", stub, out);</div><div class='ctx'> </div><div class='del'>-	stub-&gt;args.readlink.fn = fn;</div><div class='del'>-	loc_copy (&amp;stub-&gt;args.readlink.loc, loc);</div><div class='del'>-	stub-&gt;args.readlink.size = size;</div><div class='add'>+    stub-&gt;fn_cbk.mknod = fn;</div><div class='add'>+    args_mknod_cbk_store(&amp;stub-&gt;args_cbk, op_ret, op_errno, inode, buf,</div><div class='add'>+                         preparent, postparent, xdata);</div><div class='ctx'> out:</div><div class='del'>-	return stub;</div><div class='add'>+    return stub;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> call_stub_t *</div><div class='del'>-fop_readlink_cbk_stub (call_frame_t *frame,</div><div class='del'>-		       fop_readlink_cbk_t fn,</div><div class='del'>-		       int32_t op_ret,</div><div class='del'>-		       int32_t op_errno,</div><div class='del'>-		       const char *path,</div><div class='del'>-                       struct iatt *sbuf)</div><div class='add'>+fop_mkdir_stub(call_frame_t *frame, fop_mkdir_t fn, loc_t *loc, mode_t mode,</div><div class='add'>+               mode_t umask, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-	call_stub_t *stub = NULL;</div><div class='add'>+    call_stub_t *stub = NULL;</div><div class='ctx'> </div><div class='del'>-	GF_VALIDATE_OR_GOTO ("call-stub", frame, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("call-stub", loc, out);</div><div class='ctx'> </div><div class='del'>-	stub = stub_new (frame, 0, GF_FOP_READLINK);</div><div class='del'>-	GF_VALIDATE_OR_GOTO ("call-stub", stub, out);</div><div class='add'>+    stub = stub_new(frame, 1, GF_FOP_MKDIR);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("call-stub", stub, out);</div><div class='ctx'> </div><div class='del'>-	stub-&gt;args.readlink_cbk.fn = fn;</div><div class='del'>-	stub-&gt;args.readlink_cbk.op_ret = op_ret;</div><div class='del'>-	stub-&gt;args.readlink_cbk.op_errno = op_errno;</div><div class='del'>-	if (path)</div><div class='del'>-		stub-&gt;args.readlink_cbk.buf = gf_strdup (path);</div><div class='del'>-        if (sbuf)</div><div class='del'>-                stub-&gt;args.readlink_cbk.sbuf = *sbuf;</div><div class='add'>+    stub-&gt;fn.mkdir = fn;</div><div class='add'>+    args_mkdir_store(&amp;stub-&gt;args, loc, mode, umask, xdata);</div><div class='ctx'> out:</div><div class='del'>-	return stub;</div><div class='add'>+    return stub;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> call_stub_t *</div><div class='del'>-fop_mknod_stub (call_frame_t *frame, fop_mknod_t fn,</div><div class='del'>-		loc_t *loc, mode_t mode, dev_t rdev, dict_t *params)</div><div class='add'>+fop_mkdir_cbk_stub(call_frame_t *frame, fop_mkdir_cbk_t fn, int32_t op_ret,</div><div class='add'>+                   int32_t op_errno, inode_t *inode, struct iatt *buf,</div><div class='add'>+                   struct iatt *preparent, struct iatt *postparent,</div><div class='add'>+                   dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-	call_stub_t *stub = NULL;</div><div class='add'>+    call_stub_t *stub = NULL;</div><div class='ctx'> </div><div class='del'>-	GF_VALIDATE_OR_GOTO ("call-stub", frame, out);</div><div class='del'>-	GF_VALIDATE_OR_GOTO ("call-stub", loc, out);</div><div class='add'>+    stub = stub_new(frame, 0, GF_FOP_MKDIR);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("call-stub", stub, out);</div><div class='ctx'> </div><div class='del'>-	stub = stub_new (frame, 1, GF_FOP_MKNOD);</div><div class='del'>-	GF_VALIDATE_OR_GOTO ("call-stub", stub, out);</div><div class='del'>-</div><div class='del'>-	stub-&gt;args.mknod.fn = fn;</div><div class='del'>-	loc_copy (&amp;stub-&gt;args.mknod.loc, loc);</div><div class='del'>-	stub-&gt;args.mknod.mode = mode;</div><div class='del'>-	stub-&gt;args.mknod.rdev = rdev;</div><div class='del'>-        if (params)</div><div class='del'>-                stub-&gt;args.mknod.params = dict_ref (params);</div><div class='add'>+    stub-&gt;fn_cbk.mkdir = fn;</div><div class='add'>+    args_mkdir_cbk_store(&amp;stub-&gt;args_cbk, op_ret, op_errno, inode, buf,</div><div class='add'>+                         preparent, postparent, xdata);</div><div class='ctx'> out:</div><div class='del'>-	return stub;</div><div class='add'>+    return stub;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> call_stub_t *</div><div class='del'>-fop_mknod_cbk_stub (call_frame_t *frame,</div><div class='del'>-		    fop_mknod_cbk_t fn,</div><div class='del'>-		    int32_t op_ret,</div><div class='del'>-		    int32_t op_errno,</div><div class='del'>-		    inode_t *inode,</div><div class='del'>-                    struct iatt *buf,</div><div class='del'>-                    struct iatt *preparent,</div><div class='del'>-                    struct iatt *postparent)</div><div class='add'>+fop_unlink_stub(call_frame_t *frame, fop_unlink_t fn, loc_t *loc, int xflag,</div><div class='add'>+                dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-	call_stub_t *stub = NULL;</div><div class='add'>+    call_stub_t *stub = NULL;</div><div class='add'>+</div><div class='add'>+    GF_VALIDATE_OR_GOTO("call-stub", loc, out);</div><div class='ctx'> </div><div class='del'>-	GF_VALIDATE_OR_GOTO ("call-stub", frame, out);</div><div class='add'>+    stub = stub_new(frame, 1, GF_FOP_UNLINK);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("call-stub", stub, out);</div><div class='ctx'> </div><div class='del'>-	stub = stub_new (frame, 0, GF_FOP_MKNOD);</div><div class='del'>-	GF_VALIDATE_OR_GOTO ("call-stub", stub, out);</div><div class='add'>+    stub-&gt;fn.unlink = fn;</div><div class='add'>+    args_unlink_store(&amp;stub-&gt;args, loc, xflag, xdata);</div><div class='ctx'> </div><div class='del'>-	stub-&gt;args.mknod_cbk.fn = fn;</div><div class='del'>-	stub-&gt;args.mknod_cbk.op_ret = op_ret;</div><div class='del'>-	stub-&gt;args.mknod_cbk.op_errno = op_errno;</div><div class='del'>-	if (inode)</div><div class='del'>-		stub-&gt;args.mknod_cbk.inode = inode_ref (inode);</div><div class='del'>-	if (buf)</div><div class='del'>-		stub-&gt;args.mknod_cbk.buf = *buf;</div><div class='del'>-        if (preparent)</div><div class='del'>-                stub-&gt;args.mknod_cbk.preparent = *preparent;</div><div class='del'>-        if (postparent)</div><div class='del'>-                stub-&gt;args.mknod_cbk.postparent = *postparent;</div><div class='ctx'> out:</div><div class='del'>-	return stub;</div><div class='add'>+    return stub;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> call_stub_t *</div><div class='del'>-fop_mkdir_stub (call_frame_t *frame, fop_mkdir_t fn,</div><div class='del'>-		loc_t *loc, mode_t mode, dict_t *params)</div><div class='add'>+fop_unlink_cbk_stub(call_frame_t *frame, fop_unlink_cbk_t fn, int32_t op_ret,</div><div class='add'>+                    int32_t op_errno, struct iatt *preparent,</div><div class='add'>+                    struct iatt *postparent, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-	call_stub_t *stub = NULL;</div><div class='del'>-</div><div class='del'>-	GF_VALIDATE_OR_GOTO ("call-stub", frame, out);</div><div class='del'>-	GF_VALIDATE_OR_GOTO ("call-stub", loc, out);</div><div class='add'>+    call_stub_t *stub = NULL;</div><div class='ctx'> </div><div class='del'>-	stub = stub_new (frame, 1, GF_FOP_MKDIR);</div><div class='del'>-	GF_VALIDATE_OR_GOTO ("call-stub", stub, out);</div><div class='add'>+    stub = stub_new(frame, 0, GF_FOP_UNLINK);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("call-stub", stub, out);</div><div class='ctx'> </div><div class='del'>-	stub-&gt;args.mkdir.fn = fn;</div><div class='del'>-	loc_copy (&amp;stub-&gt;args.mkdir.loc, loc);</div><div class='del'>-	stub-&gt;args.mkdir.mode = mode;</div><div class='del'>-        if (params)</div><div class='del'>-                stub-&gt;args.mkdir.params = dict_ref (params);</div><div class='add'>+    stub-&gt;fn_cbk.unlink = fn;</div><div class='add'>+    args_unlink_cbk_store(&amp;stub-&gt;args_cbk, op_ret, op_errno, preparent,</div><div class='add'>+                          postparent, xdata);</div><div class='ctx'> out:</div><div class='del'>-	return stub;</div><div class='add'>+    return stub;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> call_stub_t *</div><div class='del'>-fop_mkdir_cbk_stub (call_frame_t *frame,</div><div class='del'>-		    fop_mkdir_cbk_t fn,</div><div class='del'>-		    int32_t op_ret,</div><div class='del'>-		    int32_t op_errno,</div><div class='del'>-		    inode_t *inode,</div><div class='del'>-                    struct iatt *buf,</div><div class='del'>-                    struct iatt *preparent,</div><div class='del'>-                    struct iatt *postparent)</div><div class='add'>+fop_rmdir_stub(call_frame_t *frame, fop_rmdir_t fn, loc_t *loc, int flags,</div><div class='add'>+               dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-	call_stub_t *stub = NULL;</div><div class='add'>+    call_stub_t *stub = NULL;</div><div class='add'>+</div><div class='add'>+    GF_VALIDATE_OR_GOTO("call-stub", loc, out);</div><div class='ctx'> </div><div class='del'>-	GF_VALIDATE_OR_GOTO ("call-stub", frame, out);</div><div class='add'>+    stub = stub_new(frame, 1, GF_FOP_RMDIR);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("call-stub", stub, out);</div><div class='ctx'> </div><div class='del'>-	stub = stub_new (frame, 0, GF_FOP_MKDIR);</div><div class='del'>-	GF_VALIDATE_OR_GOTO ("call-stub", stub, out);</div><div class='add'>+    stub-&gt;fn.rmdir = fn;</div><div class='add'>+    args_rmdir_store(&amp;stub-&gt;args, loc, flags, xdata);</div><div class='ctx'> </div><div class='del'>-	stub-&gt;args.mkdir_cbk.fn = fn;</div><div class='del'>-	stub-&gt;args.mkdir_cbk.op_ret = op_ret;</div><div class='del'>-	stub-&gt;args.mkdir_cbk.op_errno = op_errno;</div><div class='del'>-	if (inode)</div><div class='del'>-		stub-&gt;args.mkdir_cbk.inode = inode_ref (inode);</div><div class='del'>-	if (buf)</div><div class='del'>-		stub-&gt;args.mkdir_cbk.buf = *buf;</div><div class='del'>-        if (preparent)</div><div class='del'>-                stub-&gt;args.mkdir_cbk.preparent = *preparent;</div><div class='del'>-        if (postparent)</div><div class='del'>-                stub-&gt;args.mkdir_cbk.postparent = *postparent;</div><div class='ctx'> out:</div><div class='del'>-	return stub;</div><div class='add'>+    return stub;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> call_stub_t *</div><div class='del'>-fop_unlink_stub (call_frame_t *frame,</div><div class='del'>-		 fop_unlink_t fn,</div><div class='del'>-		 loc_t *loc)</div><div class='add'>+fop_rmdir_cbk_stub(call_frame_t *frame, fop_rmdir_cbk_t fn, int32_t op_ret,</div><div class='add'>+                   int32_t op_errno, struct iatt *preparent,</div><div class='add'>+                   struct iatt *postparent, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-	call_stub_t *stub = NULL;</div><div class='add'>+    call_stub_t *stub = NULL;</div><div class='ctx'> </div><div class='del'>-	GF_VALIDATE_OR_GOTO ("call-stub", frame, out);</div><div class='del'>-	GF_VALIDATE_OR_GOTO ("call-stub", loc, out);</div><div class='add'>+    stub = stub_new(frame, 0, GF_FOP_RMDIR);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("call-stub", stub, out);</div><div class='ctx'> </div><div class='del'>-	stub = stub_new (frame, 1, GF_FOP_UNLINK);</div><div class='del'>-	GF_VALIDATE_OR_GOTO ("call-stub", stub, out);</div><div class='del'>-</div><div class='del'>-	stub-&gt;args.unlink.fn = fn;</div><div class='del'>-	loc_copy (&amp;stub-&gt;args.unlink.loc, loc);</div><div class='add'>+    stub-&gt;fn_cbk.rmdir = fn;</div><div class='add'>+    args_rmdir_cbk_store(&amp;stub-&gt;args_cbk, op_ret, op_errno, preparent,</div><div class='add'>+                         postparent, xdata);</div><div class='ctx'> out:</div><div class='del'>-	return stub;</div><div class='add'>+    return stub;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> call_stub_t *</div><div class='del'>-fop_unlink_cbk_stub (call_frame_t *frame,</div><div class='del'>-		     fop_unlink_cbk_t fn,</div><div class='del'>-		     int32_t op_ret,</div><div class='del'>-		     int32_t op_errno,</div><div class='del'>-                     struct iatt *preparent,</div><div class='del'>-                     struct iatt *postparent)</div><div class='add'>+fop_symlink_stub(call_frame_t *frame, fop_symlink_t fn, const char *linkname,</div><div class='add'>+                 loc_t *loc, mode_t umask, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-	call_stub_t *stub = NULL;</div><div class='add'>+    call_stub_t *stub = NULL;</div><div class='ctx'> </div><div class='del'>-	GF_VALIDATE_OR_GOTO ("call-stub", frame, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("call-stub", loc, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("call-stub", linkname, out);</div><div class='ctx'> </div><div class='del'>-	stub = stub_new (frame, 0, GF_FOP_UNLINK);</div><div class='del'>-	GF_VALIDATE_OR_GOTO ("call-stub", stub, out);</div><div class='add'>+    stub = stub_new(frame, 1, GF_FOP_SYMLINK);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("call-stub", stub, out);</div><div class='ctx'> </div><div class='del'>-	stub-&gt;args.unlink_cbk.fn = fn;</div><div class='del'>-	stub-&gt;args.unlink_cbk.op_ret = op_ret;</div><div class='del'>-	stub-&gt;args.unlink_cbk.op_errno = op_errno;</div><div class='del'>-        if (preparent)</div><div class='del'>-                stub-&gt;args.unlink_cbk.preparent = *preparent;</div><div class='del'>-        if (postparent)</div><div class='del'>-                stub-&gt;args.unlink_cbk.postparent = *postparent;</div><div class='add'>+    stub-&gt;fn.symlink = fn;</div><div class='add'>+    args_symlink_store(&amp;stub-&gt;args, linkname, loc, umask, xdata);</div><div class='ctx'> out:</div><div class='del'>-	return stub;</div><div class='add'>+    return stub;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+call_stub_t *</div><div class='add'>+fop_symlink_cbk_stub(call_frame_t *frame, fop_symlink_cbk_t fn, int32_t op_ret,</div><div class='add'>+                     int32_t op_errno, inode_t *inode, struct iatt *buf,</div><div class='add'>+                     struct iatt *preparent, struct iatt *postparent,</div><div class='add'>+                     dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    call_stub_t *stub = NULL;</div><div class='add'>+</div><div class='add'>+    stub = stub_new(frame, 0, GF_FOP_SYMLINK);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("call-stub", stub, out);</div><div class='ctx'> </div><div class='add'>+    stub-&gt;fn_cbk.symlink = fn;</div><div class='add'>+    args_symlink_cbk_store(&amp;stub-&gt;args_cbk, op_ret, op_errno, inode, buf,</div><div class='add'>+                           preparent, postparent, xdata);</div><div class='add'>+out:</div><div class='add'>+    return stub;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> call_stub_t *</div><div class='del'>-fop_rmdir_stub (call_frame_t *frame,</div><div class='del'>-		fop_rmdir_t fn,</div><div class='del'>-		loc_t *loc)</div><div class='add'>+fop_rename_stub(call_frame_t *frame, fop_rename_t fn, loc_t *oldloc,</div><div class='add'>+                loc_t *newloc, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-	call_stub_t *stub = NULL;</div><div class='add'>+    call_stub_t *stub = NULL;</div><div class='ctx'> </div><div class='del'>-	GF_VALIDATE_OR_GOTO ("call-stub", frame, out);</div><div class='del'>-	GF_VALIDATE_OR_GOTO ("call-stub", loc, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("call-stub", oldloc, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("call-stub", newloc, out);</div><div class='ctx'> </div><div class='del'>-	stub = stub_new (frame, 1, GF_FOP_RMDIR);</div><div class='del'>-	GF_VALIDATE_OR_GOTO ("call-stub", stub, out);</div><div class='add'>+    stub = stub_new(frame, 1, GF_FOP_RENAME);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("call-stub", stub, out);</div><div class='ctx'> </div><div class='del'>-	stub-&gt;args.rmdir.fn = fn;</div><div class='del'>-	loc_copy (&amp;stub-&gt;args.rmdir.loc, loc);</div><div class='add'>+    stub-&gt;fn.rename = fn;</div><div class='add'>+    args_rename_store(&amp;stub-&gt;args, oldloc, newloc, xdata);</div><div class='ctx'> out:</div><div class='del'>-	return stub;</div><div class='add'>+    return stub;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> call_stub_t *</div><div class='del'>-fop_rmdir_cbk_stub (call_frame_t *frame,</div><div class='del'>-		    fop_rmdir_cbk_t fn,</div><div class='del'>-		    int32_t op_ret,</div><div class='del'>-		    int32_t op_errno,</div><div class='del'>-                    struct iatt *preparent,</div><div class='del'>-                    struct iatt *postparent)</div><div class='add'>+fop_rename_cbk_stub(call_frame_t *frame, fop_rename_cbk_t fn, int32_t op_ret,</div><div class='add'>+                    int32_t op_errno, struct iatt *buf,</div><div class='add'>+                    struct iatt *preoldparent, struct iatt *postoldparent,</div><div class='add'>+                    struct iatt *prenewparent, struct iatt *postnewparent,</div><div class='add'>+                    dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-	call_stub_t *stub = NULL;</div><div class='del'>-</div><div class='del'>-	GF_VALIDATE_OR_GOTO ("call-stub", frame, out);</div><div class='add'>+    call_stub_t *stub = NULL;</div><div class='ctx'> </div><div class='del'>-	stub = stub_new (frame, 0, GF_FOP_RMDIR);</div><div class='del'>-	GF_VALIDATE_OR_GOTO ("call-stub", stub, out);</div><div class='add'>+    stub = stub_new(frame, 0, GF_FOP_RENAME);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("call-stub", stub, out);</div><div class='ctx'> </div><div class='del'>-	stub-&gt;args.rmdir_cbk.fn = fn;</div><div class='del'>-	stub-&gt;args.rmdir_cbk.op_ret = op_ret;</div><div class='del'>-	stub-&gt;args.rmdir_cbk.op_errno = op_errno;</div><div class='del'>-        if (preparent)</div><div class='del'>-                stub-&gt;args.rmdir_cbk.preparent = *preparent;</div><div class='del'>-        if (postparent)</div><div class='del'>-                stub-&gt;args.rmdir_cbk.postparent = *postparent;</div><div class='add'>+    stub-&gt;fn_cbk.rename = fn;</div><div class='add'>+    args_rename_cbk_store(&amp;stub-&gt;args_cbk, op_ret, op_errno, buf, preoldparent,</div><div class='add'>+                          postoldparent, prenewparent, postnewparent, xdata);</div><div class='ctx'> out:</div><div class='del'>-	return stub;</div><div class='add'>+    return stub;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> call_stub_t *</div><div class='del'>-fop_symlink_stub (call_frame_t *frame, fop_symlink_t fn,</div><div class='del'>-		  const char *linkname, loc_t *loc, dict_t *params)</div><div class='add'>+fop_link_stub(call_frame_t *frame, fop_link_t fn, loc_t *oldloc, loc_t *newloc,</div><div class='add'>+              dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-	call_stub_t *stub = NULL;</div><div class='add'>+    call_stub_t *stub = NULL;</div><div class='ctx'> </div><div class='del'>-	GF_VALIDATE_OR_GOTO ("call-stub", frame, out);</div><div class='del'>-	GF_VALIDATE_OR_GOTO ("call-stub", loc, out);</div><div class='del'>-	GF_VALIDATE_OR_GOTO ("call-stub", linkname, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("call-stub", oldloc, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("call-stub", newloc, out);</div><div class='ctx'> </div><div class='del'>-	stub = stub_new (frame, 1, GF_FOP_SYMLINK);</div><div class='del'>-	GF_VALIDATE_OR_GOTO ("call-stub", stub, out);</div><div class='add'>+    stub = stub_new(frame, 1, GF_FOP_LINK);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("call-stub", stub, out);</div><div class='ctx'> </div><div class='del'>-	stub-&gt;args.symlink.fn = fn;</div><div class='del'>-	stub-&gt;args.symlink.linkname = gf_strdup (linkname);</div><div class='del'>-	loc_copy (&amp;stub-&gt;args.symlink.loc, loc);</div><div class='del'>-        if (params)</div><div class='del'>-                stub-&gt;args.symlink.params = dict_ref (params);</div><div class='add'>+    stub-&gt;fn.link = fn;</div><div class='add'>+    args_link_store(&amp;stub-&gt;args, oldloc, newloc, xdata);</div><div class='ctx'> out:</div><div class='del'>-	return stub;</div><div class='add'>+    return stub;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> call_stub_t *</div><div class='del'>-fop_symlink_cbk_stub (call_frame_t *frame,</div><div class='del'>-		      fop_symlink_cbk_t fn,</div><div class='del'>-		      int32_t op_ret,</div><div class='del'>-		      int32_t op_errno,</div><div class='del'>-		      inode_t *inode,</div><div class='del'>-                      struct iatt *buf,</div><div class='del'>-                      struct iatt *preparent,</div><div class='del'>-                      struct iatt *postparent)</div><div class='add'>+fop_link_cbk_stub(call_frame_t *frame, fop_link_cbk_t fn, int32_t op_ret,</div><div class='add'>+                  int32_t op_errno, inode_t *inode, struct iatt *buf,</div><div class='add'>+                  struct iatt *preparent, struct iatt *postparent,</div><div class='add'>+                  dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-	call_stub_t *stub = NULL;</div><div class='add'>+    call_stub_t *stub = NULL;</div><div class='ctx'> </div><div class='del'>-	GF_VALIDATE_OR_GOTO ("call-stub", frame, out);</div><div class='add'>+    stub = stub_new(frame, 0, GF_FOP_LINK);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("call-stub", stub, out);</div><div class='ctx'> </div><div class='del'>-	stub = stub_new (frame, 0, GF_FOP_SYMLINK);</div><div class='del'>-	GF_VALIDATE_OR_GOTO ("call-stub", stub, out);</div><div class='del'>-</div><div class='del'>-	stub-&gt;args.symlink_cbk.fn = fn;</div><div class='del'>-	stub-&gt;args.symlink_cbk.op_ret = op_ret;</div><div class='del'>-	stub-&gt;args.symlink_cbk.op_errno = op_errno;</div><div class='del'>-	if (inode)</div><div class='del'>-		stub-&gt;args.symlink_cbk.inode = inode_ref (inode);</div><div class='del'>-	if (buf)</div><div class='del'>-		stub-&gt;args.symlink_cbk.buf = *buf;</div><div class='del'>-        if (preparent)</div><div class='del'>-                stub-&gt;args.symlink_cbk.preparent = *preparent;</div><div class='del'>-        if (postparent)</div><div class='del'>-                stub-&gt;args.symlink_cbk.postparent = *postparent;</div><div class='add'>+    stub-&gt;fn_cbk.link = fn;</div><div class='add'>+    args_link_cbk_store(&amp;stub-&gt;args_cbk, op_ret, op_errno, inode, buf,</div><div class='add'>+                        preparent, postparent, xdata);</div><div class='ctx'> out:</div><div class='del'>-	return stub;</div><div class='add'>+    return stub;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> call_stub_t *</div><div class='del'>-fop_rename_stub (call_frame_t *frame,</div><div class='del'>-		 fop_rename_t fn,</div><div class='del'>-		 loc_t *oldloc,</div><div class='del'>-		 loc_t *newloc)</div><div class='add'>+fop_create_stub(call_frame_t *frame, fop_create_t fn, loc_t *loc, int32_t flags,</div><div class='add'>+                mode_t mode, mode_t umask, fd_t *fd, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-	call_stub_t *stub = NULL;</div><div class='add'>+    call_stub_t *stub = NULL;</div><div class='ctx'> </div><div class='del'>-	GF_VALIDATE_OR_GOTO ("call-stub", frame, out);</div><div class='del'>-	GF_VALIDATE_OR_GOTO ("call-stub", oldloc, out);</div><div class='del'>-	GF_VALIDATE_OR_GOTO ("call-stub", newloc, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("call-stub", loc, out);</div><div class='ctx'> </div><div class='del'>-	stub = stub_new (frame, 1, GF_FOP_RENAME);</div><div class='del'>-	GF_VALIDATE_OR_GOTO ("call-stub", stub, out);</div><div class='add'>+    stub = stub_new(frame, 1, GF_FOP_CREATE);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("call-stub", stub, out);</div><div class='ctx'> </div><div class='del'>-	stub-&gt;args.rename.fn = fn;</div><div class='del'>-	loc_copy (&amp;stub-&gt;args.rename.old, oldloc);</div><div class='del'>-	loc_copy (&amp;stub-&gt;args.rename.new, newloc);</div><div class='add'>+    stub-&gt;fn.create = fn;</div><div class='add'>+    args_create_store(&amp;stub-&gt;args, loc, flags, mode, umask, fd, xdata);</div><div class='ctx'> out:</div><div class='del'>-	return stub;</div><div class='add'>+    return stub;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+call_stub_t *</div><div class='add'>+fop_create_cbk_stub(call_frame_t *frame, fop_create_cbk_t fn, int32_t op_ret,</div><div class='add'>+                    int32_t op_errno, fd_t *fd, inode_t *inode,</div><div class='add'>+                    struct iatt *buf, struct iatt *preparent,</div><div class='add'>+                    struct iatt *postparent, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    call_stub_t *stub = NULL;</div><div class='add'>+</div><div class='add'>+    stub = stub_new(frame, 0, GF_FOP_CREATE);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("call-stub", stub, out);</div><div class='add'>+</div><div class='add'>+    stub-&gt;fn_cbk.create = fn;</div><div class='add'>+    args_create_cbk_store(&amp;stub-&gt;args_cbk, op_ret, op_errno, fd, inode, buf,</div><div class='add'>+                          preparent, postparent, xdata);</div><div class='add'>+out:</div><div class='add'>+    return stub;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> call_stub_t *</div><div class='del'>-fop_rename_cbk_stub (call_frame_t *frame,</div><div class='del'>-		     fop_rename_cbk_t fn,</div><div class='del'>-		     int32_t op_ret,</div><div class='del'>-		     int32_t op_errno,</div><div class='del'>-		     struct iatt *buf,</div><div class='del'>-                     struct iatt *preoldparent,</div><div class='del'>-                     struct iatt *postoldparent,</div><div class='del'>-                     struct iatt *prenewparent,</div><div class='del'>-                     struct iatt *postnewparent)</div><div class='add'>+fop_open_stub(call_frame_t *frame, fop_open_t fn, loc_t *loc, int32_t flags,</div><div class='add'>+              fd_t *fd, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-	call_stub_t *stub = NULL;</div><div class='add'>+    call_stub_t *stub = NULL;</div><div class='ctx'> </div><div class='del'>-	GF_VALIDATE_OR_GOTO ("call-stub", frame, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("call-stub", loc, out);</div><div class='ctx'> </div><div class='del'>-	stub = stub_new (frame, 0, GF_FOP_RENAME);</div><div class='del'>-	GF_VALIDATE_OR_GOTO ("call-stub", stub, out);</div><div class='add'>+    stub = stub_new(frame, 1, GF_FOP_OPEN);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("call-stub", stub, out);</div><div class='ctx'> </div><div class='del'>-	stub-&gt;args.rename_cbk.fn = fn;</div><div class='del'>-	stub-&gt;args.rename_cbk.op_ret = op_ret;</div><div class='del'>-	stub-&gt;args.rename_cbk.op_errno = op_errno;</div><div class='del'>-	if (buf)</div><div class='del'>-		stub-&gt;args.rename_cbk.buf = *buf;</div><div class='del'>-        if (preoldparent)</div><div class='del'>-                stub-&gt;args.rename_cbk.preoldparent = *preoldparent;</div><div class='del'>-        if (postoldparent)</div><div class='del'>-                stub-&gt;args.rename_cbk.postoldparent = *postoldparent;</div><div class='del'>-        if (prenewparent)</div><div class='del'>-                stub-&gt;args.rename_cbk.prenewparent = *prenewparent;</div><div class='del'>-        if (postnewparent)</div><div class='del'>-                stub-&gt;args.rename_cbk.postnewparent = *postnewparent;</div><div class='add'>+    stub-&gt;fn.open = fn;</div><div class='add'>+    args_open_store(&amp;stub-&gt;args, loc, flags, fd, xdata);</div><div class='ctx'> out:</div><div class='del'>-	return stub;</div><div class='add'>+    return stub;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> call_stub_t *</div><div class='del'>-fop_link_stub (call_frame_t *frame,</div><div class='del'>-	       fop_link_t fn,</div><div class='del'>-	       loc_t *oldloc,</div><div class='del'>-	       loc_t *newloc)</div><div class='add'>+fop_open_cbk_stub(call_frame_t *frame, fop_open_cbk_t fn, int32_t op_ret,</div><div class='add'>+                  int32_t op_errno, fd_t *fd, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-	call_stub_t *stub = NULL;</div><div class='add'>+    call_stub_t *stub = NULL;</div><div class='ctx'> </div><div class='del'>-	GF_VALIDATE_OR_GOTO ("call-stub", frame, out);</div><div class='del'>-	GF_VALIDATE_OR_GOTO ("call-stub", oldloc, out);</div><div class='del'>-	GF_VALIDATE_OR_GOTO ("call-stub", newloc, out);</div><div class='add'>+    stub = stub_new(frame, 0, GF_FOP_OPEN);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("call-stub", stub, out);</div><div class='ctx'> </div><div class='del'>-	stub = stub_new (frame, 1, GF_FOP_LINK);</div><div class='del'>-	GF_VALIDATE_OR_GOTO ("call-stub", stub, out);</div><div class='add'>+    stub-&gt;fn_cbk.open = fn;</div><div class='add'>+    args_open_cbk_store(&amp;stub-&gt;args_cbk, op_ret, op_errno, fd, xdata);</div><div class='add'>+out:</div><div class='add'>+    return stub;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	stub-&gt;args.link.fn = fn;</div><div class='del'>-	loc_copy (&amp;stub-&gt;args.link.oldloc, oldloc);</div><div class='del'>-	loc_copy (&amp;stub-&gt;args.link.newloc, newloc);</div><div class='add'>+call_stub_t *</div><div class='add'>+fop_readv_stub(call_frame_t *frame, fop_readv_t fn, fd_t *fd, size_t size,</div><div class='add'>+               off_t off, uint32_t flags, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    call_stub_t *stub = NULL;</div><div class='ctx'> </div><div class='add'>+    stub = stub_new(frame, 1, GF_FOP_READ);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("call-stub", stub, out);</div><div class='add'>+</div><div class='add'>+    stub-&gt;fn.readv = fn;</div><div class='add'>+    args_readv_store(&amp;stub-&gt;args, fd, size, off, flags, xdata);</div><div class='ctx'> out:</div><div class='del'>-	return stub;</div><div class='add'>+    return stub;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> call_stub_t *</div><div class='del'>-fop_link_cbk_stub (call_frame_t *frame,</div><div class='del'>-		   fop_link_cbk_t fn,</div><div class='del'>-		   int32_t op_ret,</div><div class='del'>-		   int32_t op_errno,</div><div class='del'>-		   inode_t *inode,</div><div class='del'>-                   struct iatt *buf,</div><div class='del'>-                   struct iatt *preparent,</div><div class='del'>-                   struct iatt *postparent)</div><div class='add'>+fop_readv_cbk_stub(call_frame_t *frame, fop_readv_cbk_t fn, int32_t op_ret,</div><div class='add'>+                   int32_t op_errno, struct iovec *vector, int32_t count,</div><div class='add'>+                   struct iatt *stbuf, struct iobref *iobref, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-	call_stub_t *stub = NULL;</div><div class='add'>+    call_stub_t *stub = NULL;</div><div class='ctx'> </div><div class='del'>-	GF_VALIDATE_OR_GOTO ("call-stub", frame, out);</div><div class='add'>+    stub = stub_new(frame, 0, GF_FOP_READ);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("call-stub", stub, out);</div><div class='ctx'> </div><div class='del'>-	stub = stub_new (frame, 0, GF_FOP_LINK);</div><div class='del'>-	GF_VALIDATE_OR_GOTO ("call-stub", stub, out);</div><div class='del'>-</div><div class='del'>-	stub-&gt;args.link_cbk.fn = fn;</div><div class='del'>-	stub-&gt;args.link_cbk.op_ret = op_ret;</div><div class='del'>-	stub-&gt;args.link_cbk.op_errno = op_errno;</div><div class='del'>-	if (inode)</div><div class='del'>-		stub-&gt;args.link_cbk.inode = inode_ref (inode);</div><div class='del'>-	if (buf)</div><div class='del'>-		stub-&gt;args.link_cbk.buf = *buf;</div><div class='del'>-        if (preparent)</div><div class='del'>-                stub-&gt;args.link_cbk.preparent = *preparent;</div><div class='del'>-        if (postparent)</div><div class='del'>-                stub-&gt;args.link_cbk.postparent = *postparent;</div><div class='add'>+    stub-&gt;fn_cbk.readv = fn;</div><div class='add'>+    args_readv_cbk_store(&amp;stub-&gt;args_cbk, op_ret, op_errno, vector, count,</div><div class='add'>+                         stbuf, iobref, xdata);</div><div class='ctx'> out:</div><div class='del'>-	return stub;</div><div class='add'>+    return stub;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> call_stub_t *</div><div class='del'>-fop_create_stub (call_frame_t *frame, fop_create_t fn,</div><div class='del'>-		 loc_t *loc, int32_t flags, mode_t mode,</div><div class='del'>-                 fd_t *fd, dict_t *params)</div><div class='add'>+fop_writev_stub(call_frame_t *frame, fop_writev_t fn, fd_t *fd,</div><div class='add'>+                struct iovec *vector, int32_t count, off_t off, uint32_t flags,</div><div class='add'>+                struct iobref *iobref, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-	call_stub_t *stub = NULL;</div><div class='add'>+    call_stub_t *stub = NULL;</div><div class='ctx'> </div><div class='del'>-	GF_VALIDATE_OR_GOTO ("call-stub", frame, out);</div><div class='del'>-	GF_VALIDATE_OR_GOTO ("call-stub", loc, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("call-stub", vector, out);</div><div class='ctx'> </div><div class='del'>-	stub = stub_new (frame, 1, GF_FOP_CREATE);</div><div class='del'>-	GF_VALIDATE_OR_GOTO ("call-stub", stub, out);</div><div class='add'>+    stub = stub_new(frame, 1, GF_FOP_WRITE);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("call-stub", stub, out);</div><div class='ctx'> </div><div class='del'>-	stub-&gt;args.create.fn = fn;</div><div class='del'>-	loc_copy (&amp;stub-&gt;args.create.loc, loc);</div><div class='del'>-	stub-&gt;args.create.flags = flags;</div><div class='del'>-	stub-&gt;args.create.mode = mode;</div><div class='del'>-	if (fd)</div><div class='del'>-		stub-&gt;args.create.fd = fd_ref (fd);</div><div class='del'>-        if (params)</div><div class='del'>-                stub-&gt;args.create.params = dict_ref (params);</div><div class='add'>+    stub-&gt;fn.writev = fn;</div><div class='add'>+    args_writev_store(&amp;stub-&gt;args, fd, vector, count, off, flags, iobref,</div><div class='add'>+                      xdata);</div><div class='ctx'> out:</div><div class='del'>-	return stub;</div><div class='add'>+    return stub;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> call_stub_t *</div><div class='del'>-fop_create_cbk_stub (call_frame_t *frame,</div><div class='del'>-		     fop_create_cbk_t fn,</div><div class='del'>-		     int32_t op_ret,</div><div class='del'>-		     int32_t op_errno,</div><div class='del'>-		     fd_t *fd,</div><div class='del'>-		     inode_t *inode,</div><div class='del'>-		     struct iatt *buf,</div><div class='del'>-                     struct iatt *preparent,</div><div class='del'>-                     struct iatt *postparent)</div><div class='add'>+fop_writev_cbk_stub(call_frame_t *frame, fop_writev_cbk_t fn, int32_t op_ret,</div><div class='add'>+                    int32_t op_errno, struct iatt *prebuf, struct iatt *postbuf,</div><div class='add'>+                    dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-	call_stub_t *stub = NULL;</div><div class='del'>-</div><div class='del'>-	GF_VALIDATE_OR_GOTO ("call-stub", frame, out);</div><div class='add'>+    call_stub_t *stub = NULL;</div><div class='ctx'> </div><div class='del'>-	stub = stub_new (frame, 0, GF_FOP_CREATE);</div><div class='del'>-	GF_VALIDATE_OR_GOTO ("call-stub", stub, out);</div><div class='add'>+    stub = stub_new(frame, 0, GF_FOP_WRITE);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("call-stub", stub, out);</div><div class='ctx'> </div><div class='del'>-	stub-&gt;args.create_cbk.fn = fn;</div><div class='del'>-	stub-&gt;args.create_cbk.op_ret = op_ret;</div><div class='del'>-	stub-&gt;args.create_cbk.op_errno = op_errno;</div><div class='del'>-	if (fd)</div><div class='del'>-		stub-&gt;args.create_cbk.fd = fd_ref (fd);</div><div class='del'>-	if (inode)</div><div class='del'>-		stub-&gt;args.create_cbk.inode = inode_ref (inode);</div><div class='del'>-	if (buf)</div><div class='del'>-		stub-&gt;args.create_cbk.buf = *buf;</div><div class='del'>-        if (preparent)</div><div class='del'>-                stub-&gt;args.create_cbk.preparent = *preparent;</div><div class='del'>-        if (postparent)</div><div class='del'>-                stub-&gt;args.create_cbk.postparent = *postparent;</div><div class='add'>+    stub-&gt;fn_cbk.writev = fn;</div><div class='add'>+    args_writev_cbk_store(&amp;stub-&gt;args_cbk, op_ret, op_errno, prebuf, postbuf,</div><div class='add'>+                          xdata);</div><div class='ctx'> out:</div><div class='del'>-	return stub;</div><div class='add'>+    return stub;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> call_stub_t *</div><div class='del'>-fop_open_stub (call_frame_t *frame,</div><div class='del'>-	       fop_open_t fn,</div><div class='del'>-	       loc_t *loc,</div><div class='del'>-	       int32_t flags, fd_t *fd,</div><div class='del'>-               int32_t wbflags)</div><div class='add'>+fop_flush_stub(call_frame_t *frame, fop_flush_t fn, fd_t *fd, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-	call_stub_t *stub = NULL;</div><div class='del'>-</div><div class='del'>-	GF_VALIDATE_OR_GOTO ("call-stub", frame, out);</div><div class='del'>-	GF_VALIDATE_OR_GOTO ("call-stub", loc, out);</div><div class='add'>+    call_stub_t *stub = NULL;</div><div class='ctx'> </div><div class='del'>-	stub = stub_new (frame, 1, GF_FOP_OPEN);</div><div class='del'>-	GF_VALIDATE_OR_GOTO ("call-stub", stub, out);</div><div class='add'>+    stub = stub_new(frame, 1, GF_FOP_FLUSH);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("call-stub", stub, out);</div><div class='ctx'> </div><div class='del'>-	stub-&gt;args.open.fn = fn;</div><div class='del'>-	loc_copy (&amp;stub-&gt;args.open.loc, loc);</div><div class='del'>-	stub-&gt;args.open.flags = flags;</div><div class='del'>-        stub-&gt;args.open.wbflags = wbflags;</div><div class='del'>-	if (fd)</div><div class='del'>-		stub-&gt;args.open.fd = fd_ref (fd);</div><div class='add'>+    stub-&gt;fn.flush = fn;</div><div class='add'>+    args_flush_store(&amp;stub-&gt;args, fd, xdata);</div><div class='ctx'> out:</div><div class='del'>-	return stub;</div><div class='add'>+    return stub;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> call_stub_t *</div><div class='del'>-fop_open_cbk_stub (call_frame_t *frame,</div><div class='del'>-		   fop_open_cbk_t fn,</div><div class='del'>-		   int32_t op_ret,</div><div class='del'>-		   int32_t op_errno,</div><div class='del'>-		   fd_t *fd)</div><div class='del'>-</div><div class='add'>+fop_flush_cbk_stub(call_frame_t *frame, fop_flush_cbk_t fn, int32_t op_ret,</div><div class='add'>+                   int32_t op_errno, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-	call_stub_t *stub = NULL;</div><div class='del'>-</div><div class='del'>-	GF_VALIDATE_OR_GOTO ("call-stub", frame, out);</div><div class='add'>+    call_stub_t *stub = NULL;</div><div class='ctx'> </div><div class='del'>-	stub = stub_new (frame, 0, GF_FOP_OPEN);</div><div class='del'>-	GF_VALIDATE_OR_GOTO ("call-stub", stub, out);</div><div class='add'>+    stub = stub_new(frame, 0, GF_FOP_FLUSH);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("call-stub", stub, out);</div><div class='ctx'> </div><div class='del'>-	stub-&gt;args.open_cbk.fn = fn;</div><div class='del'>-	stub-&gt;args.open_cbk.op_ret = op_ret;</div><div class='del'>-	stub-&gt;args.open_cbk.op_errno = op_errno;</div><div class='del'>-	if (fd)</div><div class='del'>-		stub-&gt;args.open_cbk.fd = fd_ref (fd);</div><div class='add'>+    stub-&gt;fn_cbk.flush = fn;</div><div class='add'>+    args_flush_cbk_store(&amp;stub-&gt;args_cbk, op_ret, op_errno, xdata);</div><div class='ctx'> out:</div><div class='del'>-	return stub;</div><div class='add'>+    return stub;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> call_stub_t *</div><div class='del'>-fop_readv_stub (call_frame_t *frame,</div><div class='del'>-		fop_readv_t fn,</div><div class='del'>-		fd_t *fd,</div><div class='del'>-		size_t size,</div><div class='del'>-		off_t off)</div><div class='add'>+fop_fsync_stub(call_frame_t *frame, fop_fsync_t fn, fd_t *fd, int32_t datasync,</div><div class='add'>+               dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-	call_stub_t *stub = NULL;</div><div class='del'>-</div><div class='del'>-	GF_VALIDATE_OR_GOTO ("call-stub", frame, out);</div><div class='add'>+    call_stub_t *stub = NULL;</div><div class='ctx'> </div><div class='del'>-	stub = stub_new (frame, 1, GF_FOP_READ);</div><div class='del'>-	GF_VALIDATE_OR_GOTO ("call-stub", stub, out);</div><div class='add'>+    stub = stub_new(frame, 1, GF_FOP_FSYNC);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("call-stub", stub, out);</div><div class='ctx'> </div><div class='del'>-	stub-&gt;args.readv.fn = fn;</div><div class='del'>-	if (fd)</div><div class='del'>-		stub-&gt;args.readv.fd = fd_ref (fd);</div><div class='del'>-	stub-&gt;args.readv.size = size;</div><div class='del'>-	stub-&gt;args.readv.off = off;</div><div class='add'>+    stub-&gt;fn.fsync = fn;</div><div class='add'>+    args_fsync_store(&amp;stub-&gt;args, fd, datasync, xdata);</div><div class='ctx'> out:</div><div class='del'>-	return stub;</div><div class='add'>+    return stub;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> call_stub_t *</div><div class='del'>-fop_readv_cbk_stub (call_frame_t *frame,</div><div class='del'>-		    fop_readv_cbk_t fn,</div><div class='del'>-		    int32_t op_ret,</div><div class='del'>-		    int32_t op_errno,</div><div class='del'>-		    struct iovec *vector,</div><div class='del'>-		    int32_t count,</div><div class='del'>-		    struct iatt *stbuf,</div><div class='del'>-                    struct iobref *iobref)</div><div class='del'>-</div><div class='add'>+fop_fsync_cbk_stub(call_frame_t *frame, fop_fsync_cbk_t fn, int32_t op_ret,</div><div class='add'>+                   int32_t op_errno, struct iatt *prebuf, struct iatt *postbuf,</div><div class='add'>+                   dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-	call_stub_t *stub = NULL;</div><div class='del'>-</div><div class='del'>-	GF_VALIDATE_OR_GOTO ("call-stub", frame, out);</div><div class='add'>+    call_stub_t *stub = NULL;</div><div class='ctx'> </div><div class='del'>-	stub = stub_new (frame, 0, GF_FOP_READ);</div><div class='del'>-	GF_VALIDATE_OR_GOTO ("call-stub", stub, out);</div><div class='add'>+    stub = stub_new(frame, 0, GF_FOP_FSYNC);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("call-stub", stub, out);</div><div class='ctx'> </div><div class='del'>-	stub-&gt;args.readv_cbk.fn = fn;</div><div class='del'>-	stub-&gt;args.readv_cbk.op_ret = op_ret;</div><div class='del'>-	stub-&gt;args.readv_cbk.op_errno = op_errno;</div><div class='del'>-	if (op_ret &gt;= 0) {</div><div class='del'>-		stub-&gt;args.readv_cbk.vector = iov_dup (vector, count);</div><div class='del'>-		stub-&gt;args.readv_cbk.count = count;</div><div class='del'>-		stub-&gt;args.readv_cbk.stbuf = *stbuf;</div><div class='del'>-		stub-&gt;args.readv_cbk.iobref = iobref_ref (iobref);</div><div class='del'>-	}</div><div class='add'>+    stub-&gt;fn_cbk.fsync = fn;</div><div class='add'>+    args_fsync_cbk_store(&amp;stub-&gt;args_cbk, op_ret, op_errno, prebuf, postbuf,</div><div class='add'>+                         xdata);</div><div class='ctx'> out:</div><div class='del'>-	return stub;</div><div class='add'>+    return stub;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> call_stub_t *</div><div class='del'>-fop_writev_stub (call_frame_t *frame,</div><div class='del'>-		 fop_writev_t fn,</div><div class='del'>-		 fd_t *fd,</div><div class='del'>-		 struct iovec *vector,</div><div class='del'>-		 int32_t count,</div><div class='del'>-		 off_t off,</div><div class='del'>-                 struct iobref *iobref)</div><div class='add'>+fop_opendir_stub(call_frame_t *frame, fop_opendir_t fn, loc_t *loc, fd_t *fd,</div><div class='add'>+                 dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-	call_stub_t *stub = NULL;</div><div class='add'>+    call_stub_t *stub = NULL;</div><div class='ctx'> </div><div class='del'>-	GF_VALIDATE_OR_GOTO ("call-stub", frame, out);</div><div class='del'>-	GF_VALIDATE_OR_GOTO ("call-stub", vector, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("call-stub", loc, out);</div><div class='ctx'> </div><div class='del'>-	stub = stub_new (frame, 1, GF_FOP_WRITE);</div><div class='del'>-	GF_VALIDATE_OR_GOTO ("call-stub", stub, out);</div><div class='add'>+    stub = stub_new(frame, 1, GF_FOP_OPENDIR);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("call-stub", stub, out);</div><div class='ctx'> </div><div class='del'>-	stub-&gt;args.writev.fn = fn;</div><div class='del'>-	if (fd)</div><div class='del'>-		stub-&gt;args.writev.fd = fd_ref (fd);</div><div class='del'>-	stub-&gt;args.writev.vector = iov_dup (vector, count);</div><div class='del'>-	stub-&gt;args.writev.count = count;</div><div class='del'>-	stub-&gt;args.writev.off = off;</div><div class='del'>-        stub-&gt;args.writev.iobref = iobref_ref (iobref);</div><div class='add'>+    stub-&gt;fn.opendir = fn;</div><div class='add'>+    args_opendir_store(&amp;stub-&gt;args, loc, fd, xdata);</div><div class='ctx'> out:</div><div class='del'>-	return stub;</div><div class='add'>+    return stub;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> call_stub_t *</div><div class='del'>-fop_writev_cbk_stub (call_frame_t *frame,</div><div class='del'>-		     fop_writev_cbk_t fn,</div><div class='del'>-		     int32_t op_ret,</div><div class='del'>-		     int32_t op_errno,</div><div class='del'>-                     struct iatt *prebuf,</div><div class='del'>-		     struct iatt *postbuf)</div><div class='del'>-</div><div class='add'>+fop_opendir_cbk_stub(call_frame_t *frame, fop_opendir_cbk_t fn, int32_t op_ret,</div><div class='add'>+                     int32_t op_errno, fd_t *fd, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-	call_stub_t *stub = NULL;</div><div class='add'>+    call_stub_t *stub = NULL;</div><div class='ctx'> </div><div class='del'>-	GF_VALIDATE_OR_GOTO ("call-stub", frame, out);</div><div class='add'>+    stub = stub_new(frame, 0, GF_FOP_OPENDIR);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("call-stub", stub, out);</div><div class='ctx'> </div><div class='del'>-	stub = stub_new (frame, 0, GF_FOP_WRITE);</div><div class='del'>-	GF_VALIDATE_OR_GOTO ("call-stub", stub, out);</div><div class='del'>-</div><div class='del'>-	stub-&gt;args.writev_cbk.fn = fn;</div><div class='del'>-	stub-&gt;args.writev_cbk.op_ret = op_ret;</div><div class='del'>-	stub-&gt;args.writev_cbk.op_errno = op_errno;</div><div class='del'>-	if (op_ret &gt;= 0)</div><div class='del'>-		stub-&gt;args.writev_cbk.postbuf = *postbuf;</div><div class='del'>-        if (prebuf)</div><div class='del'>-                stub-&gt;args.writev_cbk.prebuf = *prebuf;</div><div class='add'>+    stub-&gt;fn_cbk.opendir = fn;</div><div class='add'>+    args_opendir_cbk_store(&amp;stub-&gt;args_cbk, op_ret, op_errno, fd, xdata);</div><div class='ctx'> out:</div><div class='del'>-	return stub;</div><div class='add'>+    return stub;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+call_stub_t *</div><div class='add'>+fop_fsyncdir_stub(call_frame_t *frame, fop_fsyncdir_t fn, fd_t *fd,</div><div class='add'>+                  int32_t datasync, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    call_stub_t *stub = NULL;</div><div class='add'>+</div><div class='add'>+    stub = stub_new(frame, 1, GF_FOP_FSYNCDIR);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("call-stub", stub, out);</div><div class='ctx'> </div><div class='add'>+    stub-&gt;fn.fsyncdir = fn;</div><div class='add'>+    args_fsyncdir_store(&amp;stub-&gt;args, fd, datasync, xdata);</div><div class='add'>+out:</div><div class='add'>+    return stub;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> call_stub_t *</div><div class='del'>-fop_flush_stub (call_frame_t *frame,</div><div class='del'>-		fop_flush_t fn,</div><div class='del'>-		fd_t *fd)</div><div class='add'>+fop_fsyncdir_cbk_stub(call_frame_t *frame, fop_fsyncdir_cbk_t fn,</div><div class='add'>+                      int32_t op_ret, int32_t op_errno, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-	call_stub_t *stub = NULL;</div><div class='add'>+    call_stub_t *stub = NULL;</div><div class='ctx'> </div><div class='del'>-	GF_VALIDATE_OR_GOTO ("call-stub", frame, out);</div><div class='add'>+    stub = stub_new(frame, 0, GF_FOP_FSYNCDIR);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("call-stub", stub, out);</div><div class='ctx'> </div><div class='del'>-	stub = stub_new (frame, 1, GF_FOP_FLUSH);</div><div class='del'>-	GF_VALIDATE_OR_GOTO ("call-stub", stub, out);</div><div class='del'>-</div><div class='del'>-	stub-&gt;args.flush.fn = fn;</div><div class='del'>-	if (fd)</div><div class='del'>-		stub-&gt;args.flush.fd = fd_ref (fd);</div><div class='add'>+    stub-&gt;fn_cbk.fsyncdir = fn;</div><div class='add'>+    args_fsyncdir_cbk_store(&amp;stub-&gt;args_cbk, op_ret, op_errno, xdata);</div><div class='ctx'> out:</div><div class='del'>-	return stub;</div><div class='add'>+    return stub;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> call_stub_t *</div><div class='del'>-fop_flush_cbk_stub (call_frame_t *frame,</div><div class='del'>-		    fop_flush_cbk_t fn,</div><div class='del'>-		    int32_t op_ret,</div><div class='del'>-		    int32_t op_errno)</div><div class='del'>-</div><div class='add'>+fop_statfs_stub(call_frame_t *frame, fop_statfs_t fn, loc_t *loc, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-	call_stub_t *stub = NULL;</div><div class='add'>+    call_stub_t *stub = NULL;</div><div class='ctx'> </div><div class='del'>-	GF_VALIDATE_OR_GOTO ("call-stub", frame, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("call-stub", loc, out);</div><div class='ctx'> </div><div class='del'>-	stub = stub_new (frame, 0, GF_FOP_FLUSH);</div><div class='del'>-	GF_VALIDATE_OR_GOTO ("call-stub", stub, out);</div><div class='add'>+    stub = stub_new(frame, 1, GF_FOP_STATFS);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("call-stub", stub, out);</div><div class='ctx'> </div><div class='del'>-	stub-&gt;args.flush_cbk.fn = fn;</div><div class='del'>-	stub-&gt;args.flush_cbk.op_ret = op_ret;</div><div class='del'>-	stub-&gt;args.flush_cbk.op_errno = op_errno;</div><div class='add'>+    stub-&gt;fn.statfs = fn;</div><div class='add'>+    args_statfs_store(&amp;stub-&gt;args, loc, xdata);</div><div class='ctx'> out:</div><div class='del'>-	return stub;</div><div class='add'>+    return stub;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+call_stub_t *</div><div class='add'>+fop_statfs_cbk_stub(call_frame_t *frame, fop_statfs_cbk_t fn, int32_t op_ret,</div><div class='add'>+                    int32_t op_errno, struct statvfs *buf, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    call_stub_t *stub = NULL;</div><div class='ctx'> </div><div class='add'>+    stub = stub_new(frame, 0, GF_FOP_STATFS);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("call-stub", stub, out);</div><div class='ctx'> </div><div class='add'>+    stub-&gt;fn_cbk.statfs = fn;</div><div class='add'>+    args_statfs_cbk_store(&amp;stub-&gt;args_cbk, op_ret, op_errno, buf, xdata);</div><div class='add'>+out:</div><div class='add'>+    return stub;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> call_stub_t *</div><div class='del'>-fop_fsync_stub (call_frame_t *frame,</div><div class='del'>-		fop_fsync_t fn,</div><div class='del'>-		fd_t *fd,</div><div class='del'>-		int32_t datasync)</div><div class='add'>+fop_setxattr_stub(call_frame_t *frame, fop_setxattr_t fn, loc_t *loc,</div><div class='add'>+                  dict_t *dict, int32_t flags, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-	call_stub_t *stub = NULL;</div><div class='add'>+    call_stub_t *stub = NULL;</div><div class='ctx'> </div><div class='del'>-	GF_VALIDATE_OR_GOTO ("call-stub", frame, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("call-stub", loc, out);</div><div class='ctx'> </div><div class='del'>-	stub = stub_new (frame, 1, GF_FOP_FSYNC);</div><div class='del'>-	GF_VALIDATE_OR_GOTO ("call-stub", stub, out);</div><div class='add'>+    stub = stub_new(frame, 1, GF_FOP_SETXATTR);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("call-stub", stub, out);</div><div class='ctx'> </div><div class='del'>-	stub-&gt;args.fsync.fn = fn;</div><div class='del'>-	if (fd)</div><div class='del'>-		stub-&gt;args.fsync.fd = fd_ref (fd);</div><div class='del'>-	stub-&gt;args.fsync.datasync = datasync;</div><div class='add'>+    stub-&gt;fn.setxattr = fn;</div><div class='add'>+    args_setxattr_store(&amp;stub-&gt;args, loc, dict, flags, xdata);</div><div class='ctx'> out:</div><div class='del'>-	return stub;</div><div class='add'>+    return stub;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> call_stub_t *</div><div class='del'>-fop_fsync_cbk_stub (call_frame_t *frame,</div><div class='del'>-		    fop_fsync_cbk_t fn,</div><div class='del'>-		    int32_t op_ret,</div><div class='del'>-		    int32_t op_errno,</div><div class='del'>-                    struct iatt *prebuf,</div><div class='del'>-                    struct iatt *postbuf)</div><div class='add'>+fop_setxattr_cbk_stub(call_frame_t *frame, fop_setxattr_cbk_t fn,</div><div class='add'>+                      int32_t op_ret, int32_t op_errno, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-	call_stub_t *stub = NULL;</div><div class='add'>+    call_stub_t *stub = NULL;</div><div class='ctx'> </div><div class='del'>-	GF_VALIDATE_OR_GOTO ("call-stub", frame, out);</div><div class='add'>+    stub = stub_new(frame, 0, GF_FOP_SETXATTR);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("call-stub", stub, out);</div><div class='ctx'> </div><div class='del'>-	stub = stub_new (frame, 0, GF_FOP_FSYNC);</div><div class='del'>-	GF_VALIDATE_OR_GOTO ("call-stub", stub, out);</div><div class='del'>-</div><div class='del'>-	stub-&gt;args.fsync_cbk.fn = fn;</div><div class='del'>-	stub-&gt;args.fsync_cbk.op_ret = op_ret;</div><div class='del'>-	stub-&gt;args.fsync_cbk.op_errno = op_errno;</div><div class='del'>-        if (prebuf)</div><div class='del'>-                stub-&gt;args.fsync_cbk.prebuf = *prebuf;</div><div class='del'>-        if (postbuf)</div><div class='del'>-                stub-&gt;args.fsync_cbk.postbuf = *postbuf;</div><div class='add'>+    stub-&gt;fn_cbk.setxattr = fn;</div><div class='add'>+    args_setxattr_cbk_store(&amp;stub-&gt;args_cbk, op_ret, op_errno, xdata);</div><div class='ctx'> out:</div><div class='del'>-	return stub;</div><div class='add'>+    return stub;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> call_stub_t *</div><div class='del'>-fop_opendir_stub (call_frame_t *frame,</div><div class='del'>-		  fop_opendir_t fn,</div><div class='del'>-		  loc_t *loc, fd_t *fd)</div><div class='add'>+fop_getxattr_stub(call_frame_t *frame, fop_getxattr_t fn, loc_t *loc,</div><div class='add'>+                  const char *name, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-	call_stub_t *stub = NULL;</div><div class='add'>+    call_stub_t *stub = NULL;</div><div class='ctx'> </div><div class='del'>-	GF_VALIDATE_OR_GOTO ("call-stub", frame, out);</div><div class='del'>-	GF_VALIDATE_OR_GOTO ("call-stub", loc, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("call-stub", loc, out);</div><div class='ctx'> </div><div class='del'>-	stub = stub_new (frame, 1, GF_FOP_OPENDIR);</div><div class='del'>-	GF_VALIDATE_OR_GOTO ("call-stub", stub, out);</div><div class='add'>+    stub = stub_new(frame, 1, GF_FOP_GETXATTR);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("call-stub", stub, out);</div><div class='ctx'> </div><div class='del'>-	stub-&gt;args.opendir.fn = fn;</div><div class='del'>-	loc_copy (&amp;stub-&gt;args.opendir.loc, loc);</div><div class='del'>-	if (fd)</div><div class='del'>-		stub-&gt;args.opendir.fd = fd_ref (fd);</div><div class='add'>+    stub-&gt;fn.getxattr = fn;</div><div class='add'>+    args_getxattr_store(&amp;stub-&gt;args, loc, name, xdata);</div><div class='ctx'> out:</div><div class='del'>-	return stub;</div><div class='add'>+    return stub;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> call_stub_t *</div><div class='del'>-fop_opendir_cbk_stub (call_frame_t *frame,</div><div class='del'>-		      fop_opendir_cbk_t fn,</div><div class='del'>-		      int32_t op_ret,</div><div class='del'>-		      int32_t op_errno,</div><div class='del'>-		      fd_t *fd)</div><div class='del'>-</div><div class='add'>+fop_getxattr_cbk_stub(call_frame_t *frame, fop_getxattr_cbk_t fn,</div><div class='add'>+                      int32_t op_ret, int32_t op_errno, dict_t *dict,</div><div class='add'>+                      dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-	call_stub_t *stub = NULL;</div><div class='del'>-</div><div class='del'>-	GF_VALIDATE_OR_GOTO ("call-stub", frame, out);</div><div class='add'>+    call_stub_t *stub = NULL;</div><div class='ctx'> </div><div class='del'>-	stub = stub_new (frame, 0, GF_FOP_OPENDIR);</div><div class='del'>-	GF_VALIDATE_OR_GOTO ("call-stub", stub, out);</div><div class='add'>+    stub = stub_new(frame, 0, GF_FOP_GETXATTR);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("call-stub", stub, out);</div><div class='ctx'> </div><div class='del'>-	stub-&gt;args.opendir_cbk.fn = fn;</div><div class='del'>-	stub-&gt;args.opendir_cbk.op_ret = op_ret;</div><div class='del'>-	stub-&gt;args.opendir_cbk.op_errno = op_errno;</div><div class='del'>-</div><div class='del'>-	if (fd)</div><div class='del'>-		stub-&gt;args.opendir_cbk.fd = fd_ref (fd);</div><div class='add'>+    stub-&gt;fn_cbk.getxattr = fn;</div><div class='add'>+    args_getxattr_cbk_store(&amp;stub-&gt;args_cbk, op_ret, op_errno, dict, xdata);</div><div class='ctx'> out:</div><div class='del'>-	return stub;</div><div class='add'>+    return stub;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> call_stub_t *</div><div class='del'>-fop_fsyncdir_stub (call_frame_t *frame,</div><div class='del'>-		   fop_fsyncdir_t fn,</div><div class='del'>-		   fd_t *fd,</div><div class='del'>-		   int32_t datasync)</div><div class='add'>+fop_fsetxattr_stub(call_frame_t *frame, fop_fsetxattr_t fn, fd_t *fd,</div><div class='add'>+                   dict_t *dict, int32_t flags, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-	call_stub_t *stub = NULL;</div><div class='add'>+    call_stub_t *stub = NULL;</div><div class='ctx'> </div><div class='del'>-	GF_VALIDATE_OR_GOTO ("call-stub", frame, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("call-stub", fd, out);</div><div class='ctx'> </div><div class='del'>-	stub = stub_new (frame, 1, GF_FOP_FSYNCDIR);</div><div class='del'>-	GF_VALIDATE_OR_GOTO ("call-stub", stub, out);</div><div class='add'>+    stub = stub_new(frame, 1, GF_FOP_FSETXATTR);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("call-stub", stub, out);</div><div class='ctx'> </div><div class='del'>-	stub-&gt;args.fsyncdir.fn = fn;</div><div class='del'>-	if (fd)</div><div class='del'>-		stub-&gt;args.fsyncdir.fd = fd_ref (fd);</div><div class='del'>-	stub-&gt;args.fsyncdir.datasync = datasync;</div><div class='add'>+    stub-&gt;fn.fsetxattr = fn;</div><div class='add'>+    args_fsetxattr_store(&amp;stub-&gt;args, fd, dict, flags, xdata);</div><div class='ctx'> out:</div><div class='del'>-	return stub;</div><div class='add'>+    return stub;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> call_stub_t *</div><div class='del'>-fop_fsyncdir_cbk_stub (call_frame_t *frame,</div><div class='del'>-		       fop_fsyncdir_cbk_t fn,</div><div class='del'>-		       int32_t op_ret,</div><div class='del'>-		       int32_t op_errno)</div><div class='del'>-</div><div class='add'>+fop_fsetxattr_cbk_stub(call_frame_t *frame, fop_fsetxattr_cbk_t fn,</div><div class='add'>+                       int32_t op_ret, int32_t op_errno, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-	call_stub_t *stub = NULL;</div><div class='add'>+    call_stub_t *stub = NULL;</div><div class='ctx'> </div><div class='del'>-	GF_VALIDATE_OR_GOTO ("call-stub", frame, out);</div><div class='add'>+    stub = stub_new(frame, 0, GF_FOP_FSETXATTR);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("call-stub", stub, out);</div><div class='ctx'> </div><div class='del'>-	stub = stub_new (frame, 0, GF_FOP_FSYNCDIR);</div><div class='del'>-	GF_VALIDATE_OR_GOTO ("call-stub", stub, out);</div><div class='del'>-</div><div class='del'>-	stub-&gt;args.fsyncdir_cbk.fn = fn;</div><div class='del'>-	stub-&gt;args.fsyncdir_cbk.op_ret = op_ret;</div><div class='del'>-	stub-&gt;args.fsyncdir_cbk.op_errno = op_errno;</div><div class='add'>+    stub-&gt;fn_cbk.fsetxattr = fn;</div><div class='add'>+    args_fsetxattr_cbk_store(&amp;stub-&gt;args_cbk, op_ret, op_errno, xdata);</div><div class='ctx'> out:</div><div class='del'>-	return stub;</div><div class='add'>+    return stub;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> call_stub_t *</div><div class='del'>-fop_statfs_stub (call_frame_t *frame,</div><div class='del'>-		 fop_statfs_t fn,</div><div class='del'>-		 loc_t *loc)</div><div class='add'>+fop_fgetxattr_stub(call_frame_t *frame, fop_fgetxattr_t fn, fd_t *fd,</div><div class='add'>+                   const char *name, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-	call_stub_t *stub = NULL;</div><div class='add'>+    call_stub_t *stub = NULL;</div><div class='ctx'> </div><div class='del'>-	GF_VALIDATE_OR_GOTO ("call-stub", frame, out);</div><div class='del'>-	GF_VALIDATE_OR_GOTO ("call-stub", loc, out); </div><div class='add'>+    GF_VALIDATE_OR_GOTO("call-stub", fd, out);</div><div class='ctx'> </div><div class='del'>-	stub = stub_new (frame, 1, GF_FOP_STATFS);</div><div class='del'>-	GF_VALIDATE_OR_GOTO ("call-stub", stub, out);</div><div class='add'>+    stub = stub_new(frame, 1, GF_FOP_FGETXATTR);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("call-stub", stub, out);</div><div class='ctx'> </div><div class='del'>-	stub-&gt;args.statfs.fn = fn;</div><div class='del'>-	loc_copy (&amp;stub-&gt;args.statfs.loc, loc);</div><div class='add'>+    stub-&gt;fn.fgetxattr = fn;</div><div class='add'>+    args_fgetxattr_store(&amp;stub-&gt;args, fd, name, xdata);</div><div class='ctx'> out:</div><div class='del'>-	return stub;</div><div class='add'>+    return stub;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> call_stub_t *</div><div class='del'>-fop_statfs_cbk_stub (call_frame_t *frame,</div><div class='del'>-		     fop_statfs_cbk_t fn,</div><div class='del'>-		     int32_t op_ret,</div><div class='del'>-		     int32_t op_errno,</div><div class='del'>-		     struct statvfs *buf)</div><div class='del'>-</div><div class='add'>+fop_fgetxattr_cbk_stub(call_frame_t *frame, fop_fgetxattr_cbk_t fn,</div><div class='add'>+                       int32_t op_ret, int32_t op_errno, dict_t *dict,</div><div class='add'>+                       dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-	call_stub_t *stub = NULL;</div><div class='del'>-</div><div class='del'>-	GF_VALIDATE_OR_GOTO ("call-stub", frame, out);</div><div class='add'>+    call_stub_t *stub = NULL;</div><div class='ctx'> </div><div class='del'>-	stub = stub_new (frame, 0, GF_FOP_STATFS);</div><div class='del'>-	GF_VALIDATE_OR_GOTO ("call-stub", stub, out);</div><div class='add'>+    stub = stub_new(frame, 0, GF_FOP_GETXATTR);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("call-stub", stub, out);</div><div class='ctx'> </div><div class='del'>-	stub-&gt;args.statfs_cbk.fn = fn;</div><div class='del'>-	stub-&gt;args.statfs_cbk.op_ret = op_ret;</div><div class='del'>-	stub-&gt;args.statfs_cbk.op_errno = op_errno;</div><div class='del'>-	if (op_ret == 0)</div><div class='del'>-		stub-&gt;args.statfs_cbk.buf = *buf;</div><div class='add'>+    stub-&gt;fn_cbk.fgetxattr = fn;</div><div class='add'>+    args_fgetxattr_cbk_store(&amp;stub-&gt;args_cbk, op_ret, op_errno, dict, xdata);</div><div class='ctx'> out:</div><div class='del'>-	return stub;</div><div class='add'>+    return stub;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> call_stub_t *</div><div class='del'>-fop_setxattr_stub (call_frame_t *frame,</div><div class='del'>-		   fop_setxattr_t fn,</div><div class='del'>-		   loc_t *loc,</div><div class='del'>-		   dict_t *dict,</div><div class='del'>-		   int32_t flags)</div><div class='add'>+fop_removexattr_stub(call_frame_t *frame, fop_removexattr_t fn, loc_t *loc,</div><div class='add'>+                     const char *name, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-	call_stub_t *stub = NULL;</div><div class='add'>+    call_stub_t *stub = NULL;</div><div class='ctx'> </div><div class='del'>-	GF_VALIDATE_OR_GOTO ("call-stub", frame, out);</div><div class='del'>-	GF_VALIDATE_OR_GOTO ("call-stub", loc, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("call-stub", loc, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("call-stub", name, out);</div><div class='ctx'> </div><div class='del'>-	stub = stub_new (frame, 1, GF_FOP_SETXATTR);</div><div class='del'>-	GF_VALIDATE_OR_GOTO ("call-stub", stub, out);</div><div class='add'>+    stub = stub_new(frame, 1, GF_FOP_REMOVEXATTR);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("call-stub", stub, out);</div><div class='ctx'> </div><div class='del'>-	stub-&gt;args.setxattr.fn = fn;</div><div class='del'>-	loc_copy (&amp;stub-&gt;args.setxattr.loc, loc);</div><div class='del'>-	/* TODO */</div><div class='del'>-	if (dict)</div><div class='del'>-		stub-&gt;args.setxattr.dict = dict_ref (dict);</div><div class='del'>-	stub-&gt;args.setxattr.flags = flags;</div><div class='add'>+    stub-&gt;fn.removexattr = fn;</div><div class='add'>+    args_removexattr_store(&amp;stub-&gt;args, loc, name, xdata);</div><div class='ctx'> out:</div><div class='del'>-	return stub;</div><div class='add'>+    return stub;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+call_stub_t *</div><div class='add'>+fop_removexattr_cbk_stub(call_frame_t *frame, fop_removexattr_cbk_t fn,</div><div class='add'>+                         int32_t op_ret, int32_t op_errno, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    call_stub_t *stub = NULL;</div><div class='add'>+</div><div class='add'>+    stub = stub_new(frame, 0, GF_FOP_REMOVEXATTR);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("call-stub", stub, out);</div><div class='add'>+</div><div class='add'>+    stub-&gt;fn_cbk.removexattr = fn;</div><div class='add'>+    args_removexattr_cbk_store(&amp;stub-&gt;args_cbk, op_ret, op_errno, xdata);</div><div class='add'>+out:</div><div class='add'>+    return stub;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> call_stub_t *</div><div class='del'>-fop_setxattr_cbk_stub (call_frame_t *frame,</div><div class='del'>-		       fop_setxattr_cbk_t fn,</div><div class='del'>-		       int32_t op_ret,</div><div class='del'>-		       int32_t op_errno)</div><div class='add'>+fop_fremovexattr_stub(call_frame_t *frame, fop_fremovexattr_t fn, fd_t *fd,</div><div class='add'>+                      const char *name, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-	call_stub_t *stub = NULL;</div><div class='add'>+    call_stub_t *stub = NULL;</div><div class='ctx'> </div><div class='del'>-	GF_VALIDATE_OR_GOTO ("call-stub", frame, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("call-stub", fd, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("call-stub", name, out);</div><div class='ctx'> </div><div class='del'>-	stub = stub_new (frame, 0, GF_FOP_SETXATTR);</div><div class='del'>-	GF_VALIDATE_OR_GOTO ("call-stub", stub, out);</div><div class='add'>+    stub = stub_new(frame, 1, GF_FOP_FREMOVEXATTR);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("call-stub", stub, out);</div><div class='ctx'> </div><div class='del'>-	stub-&gt;args.setxattr_cbk.fn = fn;</div><div class='del'>-	stub-&gt;args.setxattr_cbk.op_ret = op_ret;</div><div class='del'>-	stub-&gt;args.setxattr_cbk.op_errno = op_errno;</div><div class='add'>+    stub-&gt;fn.fremovexattr = fn;</div><div class='add'>+    args_fremovexattr_store(&amp;stub-&gt;args, fd, name, xdata);</div><div class='ctx'> out:</div><div class='del'>-	return stub;</div><div class='add'>+    return stub;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> call_stub_t *</div><div class='del'>-fop_getxattr_stub (call_frame_t *frame,</div><div class='del'>-		   fop_getxattr_t fn,</div><div class='del'>-		   loc_t *loc,</div><div class='del'>-		   const char *name)</div><div class='add'>+fop_fremovexattr_cbk_stub(call_frame_t *frame, fop_fremovexattr_cbk_t fn,</div><div class='add'>+                          int32_t op_ret, int32_t op_errno, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-	call_stub_t *stub = NULL;</div><div class='add'>+    call_stub_t *stub = NULL;</div><div class='ctx'> </div><div class='del'>-	GF_VALIDATE_OR_GOTO ("call-stub", frame, out);</div><div class='del'>-	GF_VALIDATE_OR_GOTO ("call-stub", loc, out);</div><div class='add'>+    stub = stub_new(frame, 0, GF_FOP_FREMOVEXATTR);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("call-stub", stub, out);</div><div class='ctx'> </div><div class='del'>-	stub = stub_new (frame, 1, GF_FOP_GETXATTR);</div><div class='del'>-	GF_VALIDATE_OR_GOTO ("call-stub", stub, out);</div><div class='add'>+    stub-&gt;fn_cbk.fremovexattr = fn;</div><div class='add'>+    args_fremovexattr_cbk_store(&amp;stub-&gt;args_cbk, op_ret, op_errno, xdata);</div><div class='add'>+out:</div><div class='add'>+    return stub;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+call_stub_t *</div><div class='add'>+fop_lk_stub(call_frame_t *frame, fop_lk_t fn, fd_t *fd, int32_t cmd,</div><div class='add'>+            struct gf_flock *lock, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    call_stub_t *stub = NULL;</div><div class='ctx'> </div><div class='del'>-	stub-&gt;args.getxattr.fn = fn;</div><div class='del'>-	loc_copy (&amp;stub-&gt;args.getxattr.loc, loc);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("call-stub", lock, out);</div><div class='ctx'> </div><div class='del'>-	if (name)</div><div class='del'>-	        stub-&gt;args.getxattr.name = gf_strdup (name);</div><div class='add'>+    stub = stub_new(frame, 1, GF_FOP_LK);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("call-stub", stub, out);</div><div class='add'>+</div><div class='add'>+    stub-&gt;fn.lk = fn;</div><div class='add'>+    args_lk_store(&amp;stub-&gt;args, fd, cmd, lock, xdata);</div><div class='ctx'> out:</div><div class='del'>-	return stub;</div><div class='add'>+    return stub;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+call_stub_t *</div><div class='add'>+fop_lk_cbk_stub(call_frame_t *frame, fop_lk_cbk_t fn, int32_t op_ret,</div><div class='add'>+                int32_t op_errno, struct gf_flock *lock, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    call_stub_t *stub = NULL;</div><div class='add'>+</div><div class='add'>+    stub = stub_new(frame, 0, GF_FOP_LK);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("call-stub", stub, out);</div><div class='add'>+</div><div class='add'>+    stub-&gt;fn_cbk.lk = fn;</div><div class='add'>+    args_lk_cbk_store(&amp;stub-&gt;args_cbk, op_ret, op_errno, lock, xdata);</div><div class='add'>+out:</div><div class='add'>+    return stub;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> call_stub_t *</div><div class='del'>-fop_getxattr_cbk_stub (call_frame_t *frame,</div><div class='del'>-		       fop_getxattr_cbk_t fn,</div><div class='del'>-		       int32_t op_ret,</div><div class='del'>-		       int32_t op_errno,</div><div class='del'>-		       dict_t *dict)</div><div class='add'>+fop_inodelk_stub(call_frame_t *frame, fop_inodelk_t fn, const char *volume,</div><div class='add'>+                 loc_t *loc, int32_t cmd, struct gf_flock *lock, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-	call_stub_t *stub = NULL;</div><div class='add'>+    call_stub_t *stub = NULL;</div><div class='ctx'> </div><div class='del'>-	GF_VALIDATE_OR_GOTO ("call-stub", frame, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("call-stub", lock, out);</div><div class='ctx'> </div><div class='del'>-	stub = stub_new (frame, 0, GF_FOP_GETXATTR);</div><div class='del'>-	GF_VALIDATE_OR_GOTO ("call-stub", stub, out);</div><div class='add'>+    stub = stub_new(frame, 1, GF_FOP_INODELK);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("call-stub", stub, out);</div><div class='ctx'> </div><div class='del'>-	stub-&gt;args.getxattr_cbk.fn = fn;</div><div class='del'>-	stub-&gt;args.getxattr_cbk.op_ret = op_ret;</div><div class='del'>-	stub-&gt;args.getxattr_cbk.op_errno = op_errno;</div><div class='del'>-	/* TODO */</div><div class='del'>-	if (dict)</div><div class='del'>-		stub-&gt;args.getxattr_cbk.dict = dict_ref (dict);</div><div class='add'>+    stub-&gt;fn.inodelk = fn;</div><div class='add'>+    args_inodelk_store(&amp;stub-&gt;args, volume, loc, cmd, lock, xdata);</div><div class='ctx'> out:</div><div class='del'>-	return stub;</div><div class='add'>+    return stub;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+call_stub_t *</div><div class='add'>+fop_inodelk_cbk_stub(call_frame_t *frame, fop_inodelk_cbk_t fn, int32_t op_ret,</div><div class='add'>+                     int32_t op_errno, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    call_stub_t *stub = NULL;</div><div class='add'>+</div><div class='add'>+    stub = stub_new(frame, 0, GF_FOP_INODELK);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("call-stub", stub, out);</div><div class='add'>+</div><div class='add'>+    stub-&gt;fn_cbk.inodelk = fn;</div><div class='add'>+    args_inodelk_cbk_store(&amp;stub-&gt;args_cbk, op_ret, op_errno, xdata);</div><div class='add'>+out:</div><div class='add'>+    return stub;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> call_stub_t *</div><div class='del'>-fop_fsetxattr_stub (call_frame_t *frame,</div><div class='del'>-                    fop_fsetxattr_t fn,</div><div class='del'>-                    fd_t *fd,</div><div class='del'>-                    dict_t *dict,</div><div class='del'>-                    int32_t flags)</div><div class='add'>+fop_finodelk_stub(call_frame_t *frame, fop_finodelk_t fn, const char *volume,</div><div class='add'>+                  fd_t *fd, int32_t cmd, struct gf_flock *lock, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-	call_stub_t *stub = NULL;</div><div class='add'>+    call_stub_t *stub = NULL;</div><div class='ctx'> </div><div class='del'>-	GF_VALIDATE_OR_GOTO ("call-stub", frame, out);</div><div class='del'>-	GF_VALIDATE_OR_GOTO ("call-stub", fd, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("call-stub", lock, out);</div><div class='ctx'> </div><div class='del'>-	stub = stub_new (frame, 1, GF_FOP_FSETXATTR);</div><div class='del'>-	GF_VALIDATE_OR_GOTO ("call-stub", stub, out);</div><div class='add'>+    stub = stub_new(frame, 1, GF_FOP_FINODELK);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("call-stub", stub, out);</div><div class='ctx'> </div><div class='del'>-	stub-&gt;args.fsetxattr.fn = fn;</div><div class='del'>-	stub-&gt;args.fsetxattr.fd = fd_ref (fd);</div><div class='add'>+    stub-&gt;fn.finodelk = fn;</div><div class='add'>+    args_finodelk_store(&amp;stub-&gt;args, volume, fd, cmd, lock, xdata);</div><div class='ctx'> </div><div class='del'>-	/* TODO */</div><div class='del'>-	if (dict)</div><div class='del'>-		stub-&gt;args.fsetxattr.dict = dict_ref (dict);</div><div class='del'>-	stub-&gt;args.fsetxattr.flags = flags;</div><div class='ctx'> out:</div><div class='del'>-	return stub;</div><div class='add'>+    return stub;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> call_stub_t *</div><div class='del'>-fop_fsetxattr_cbk_stub (call_frame_t *frame,</div><div class='del'>-                        fop_fsetxattr_cbk_t fn,</div><div class='del'>-                        int32_t op_ret,</div><div class='del'>-                        int32_t op_errno)</div><div class='add'>+fop_finodelk_cbk_stub(call_frame_t *frame, fop_inodelk_cbk_t fn, int32_t op_ret,</div><div class='add'>+                      int32_t op_errno, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-	call_stub_t *stub = NULL;</div><div class='add'>+    call_stub_t *stub = NULL;</div><div class='ctx'> </div><div class='del'>-	GF_VALIDATE_OR_GOTO ("call-stub", frame, out);</div><div class='add'>+    stub = stub_new(frame, 0, GF_FOP_FINODELK);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("call-stub", stub, out);</div><div class='ctx'> </div><div class='del'>-	stub = stub_new (frame, 0, GF_FOP_FSETXATTR);</div><div class='del'>-	GF_VALIDATE_OR_GOTO ("call-stub", stub, out);</div><div class='del'>-</div><div class='del'>-	stub-&gt;args.fsetxattr_cbk.fn = fn;</div><div class='del'>-	stub-&gt;args.fsetxattr_cbk.op_ret = op_ret;</div><div class='del'>-	stub-&gt;args.fsetxattr_cbk.op_errno = op_errno;</div><div class='add'>+    stub-&gt;fn_cbk.finodelk = fn;</div><div class='add'>+    args_finodelk_cbk_store(&amp;stub-&gt;args_cbk, op_ret, op_errno, xdata);</div><div class='ctx'> out:</div><div class='del'>-	return stub;</div><div class='add'>+    return stub;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> call_stub_t *</div><div class='del'>-fop_fgetxattr_stub (call_frame_t *frame,</div><div class='del'>-                    fop_fgetxattr_t fn,</div><div class='del'>-                    fd_t *fd,</div><div class='del'>-                    const char *name)</div><div class='add'>+fop_entrylk_stub(call_frame_t *frame, fop_entrylk_t fn, const char *volume,</div><div class='add'>+                 loc_t *loc, const char *name, entrylk_cmd cmd,</div><div class='add'>+                 entrylk_type type, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-	call_stub_t *stub = NULL;</div><div class='del'>-</div><div class='del'>-	GF_VALIDATE_OR_GOTO ("call-stub", frame, out);</div><div class='del'>-	GF_VALIDATE_OR_GOTO ("call-stub", fd, out);</div><div class='add'>+    call_stub_t *stub = NULL;</div><div class='ctx'> </div><div class='del'>-	stub = stub_new (frame, 1, GF_FOP_FGETXATTR);</div><div class='del'>-	GF_VALIDATE_OR_GOTO ("call-stub", stub, out);</div><div class='add'>+    stub = stub_new(frame, 1, GF_FOP_ENTRYLK);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("call-stub", stub, out);</div><div class='ctx'> </div><div class='del'>-	stub-&gt;args.fgetxattr.fn = fn;</div><div class='del'>-	stub-&gt;args.fgetxattr.fd = fd_ref (fd);</div><div class='add'>+    stub-&gt;fn.entrylk = fn;</div><div class='add'>+    args_entrylk_store(&amp;stub-&gt;args, volume, loc, name, cmd, type, xdata);</div><div class='ctx'> </div><div class='del'>-	if (name)</div><div class='del'>-                stub-&gt;args.fgetxattr.name = gf_strdup (name);</div><div class='ctx'> out:</div><div class='del'>-	return stub;</div><div class='add'>+    return stub;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> call_stub_t *</div><div class='del'>-fop_fgetxattr_cbk_stub (call_frame_t *frame,</div><div class='del'>-                        fop_fgetxattr_cbk_t fn,</div><div class='del'>-                        int32_t op_ret,</div><div class='del'>-                        int32_t op_errno,</div><div class='del'>-                        dict_t *dict)</div><div class='add'>+fop_entrylk_cbk_stub(call_frame_t *frame, fop_entrylk_cbk_t fn, int32_t op_ret,</div><div class='add'>+                     int32_t op_errno, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-	call_stub_t *stub = NULL;</div><div class='add'>+    call_stub_t *stub = NULL;</div><div class='ctx'> </div><div class='del'>-	GF_VALIDATE_OR_GOTO ("call-stub", frame, out);</div><div class='add'>+    stub = stub_new(frame, 0, GF_FOP_ENTRYLK);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("call-stub", stub, out);</div><div class='ctx'> </div><div class='del'>-	stub = stub_new (frame, 0, GF_FOP_GETXATTR);</div><div class='del'>-	GF_VALIDATE_OR_GOTO ("call-stub", stub, out);</div><div class='add'>+    stub-&gt;fn_cbk.entrylk = fn;</div><div class='add'>+    args_entrylk_cbk_store(&amp;stub-&gt;args_cbk, op_ret, op_errno, xdata);</div><div class='add'>+out:</div><div class='add'>+    return stub;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+call_stub_t *</div><div class='add'>+fop_fentrylk_stub(call_frame_t *frame, fop_fentrylk_t fn, const char *volume,</div><div class='add'>+                  fd_t *fd, const char *name, entrylk_cmd cmd,</div><div class='add'>+                  entrylk_type type, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    call_stub_t *stub = NULL;</div><div class='ctx'> </div><div class='del'>-	stub-&gt;args.fgetxattr_cbk.fn = fn;</div><div class='del'>-	stub-&gt;args.fgetxattr_cbk.op_ret = op_ret;</div><div class='del'>-	stub-&gt;args.fgetxattr_cbk.op_errno = op_errno;</div><div class='add'>+    stub = stub_new(frame, 1, GF_FOP_FENTRYLK);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("call-stub", stub, out);</div><div class='ctx'> </div><div class='del'>-	/* TODO */</div><div class='del'>-	if (dict)</div><div class='del'>-		stub-&gt;args.fgetxattr_cbk.dict = dict_ref (dict);</div><div class='add'>+    stub-&gt;fn.fentrylk = fn;</div><div class='add'>+    args_fentrylk_store(&amp;stub-&gt;args, volume, fd, name, cmd, type, xdata);</div><div class='ctx'> out:</div><div class='del'>-	return stub;</div><div class='add'>+    return stub;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> call_stub_t *</div><div class='del'>-fop_removexattr_stub (call_frame_t *frame,</div><div class='del'>-		      fop_removexattr_t fn,</div><div class='del'>-		      loc_t *loc,</div><div class='del'>-		      const char *name)</div><div class='add'>+fop_fentrylk_cbk_stub(call_frame_t *frame, fop_fentrylk_cbk_t fn,</div><div class='add'>+                      int32_t op_ret, int32_t op_errno, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-	call_stub_t *stub = NULL;</div><div class='del'>-</div><div class='del'>-	GF_VALIDATE_OR_GOTO ("call-stub", frame, out);</div><div class='del'>-	GF_VALIDATE_OR_GOTO ("call-stub", loc, out);</div><div class='del'>-	GF_VALIDATE_OR_GOTO ("call-stub", name, out);</div><div class='add'>+    call_stub_t *stub = NULL;</div><div class='ctx'> </div><div class='del'>-	stub = stub_new (frame, 1, GF_FOP_REMOVEXATTR);</div><div class='del'>-	GF_VALIDATE_OR_GOTO ("call-stub", stub, out);</div><div class='add'>+    stub = stub_new(frame, 0, GF_FOP_FENTRYLK);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("call-stub", stub, out);</div><div class='ctx'> </div><div class='del'>-	stub-&gt;args.removexattr.fn = fn;</div><div class='del'>-	loc_copy (&amp;stub-&gt;args.removexattr.loc, loc);</div><div class='del'>-        stub-&gt;args.removexattr.name = gf_strdup (name);</div><div class='add'>+    stub-&gt;fn_cbk.fentrylk = fn;</div><div class='add'>+    args_fentrylk_cbk_store(&amp;stub-&gt;args_cbk, op_ret, op_errno, xdata);</div><div class='ctx'> out:</div><div class='del'>-	return stub;</div><div class='add'>+    return stub;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> call_stub_t *</div><div class='del'>-fop_removexattr_cbk_stub (call_frame_t *frame,</div><div class='del'>-			  fop_removexattr_cbk_t fn,</div><div class='del'>-			  int32_t op_ret,</div><div class='del'>-			  int32_t op_errno)</div><div class='add'>+fop_readdirp_cbk_stub(call_frame_t *frame, fop_readdirp_cbk_t fn,</div><div class='add'>+                      int32_t op_ret, int32_t op_errno, gf_dirent_t *entries,</div><div class='add'>+                      dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-	call_stub_t *stub = NULL;</div><div class='add'>+    call_stub_t *stub = NULL;</div><div class='ctx'> </div><div class='del'>-	GF_VALIDATE_OR_GOTO ("call-stub", frame, out);</div><div class='add'>+    stub = stub_new(frame, 0, GF_FOP_READDIRP);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("call-stub", stub, out);</div><div class='ctx'> </div><div class='del'>-	stub = stub_new (frame, 0, GF_FOP_REMOVEXATTR);</div><div class='del'>-	GF_VALIDATE_OR_GOTO ("call-stub", stub, out);</div><div class='del'>-</div><div class='del'>-	stub-&gt;args.removexattr_cbk.fn = fn;</div><div class='del'>-	stub-&gt;args.removexattr_cbk.op_ret = op_ret;</div><div class='del'>-	stub-&gt;args.removexattr_cbk.op_errno = op_errno;</div><div class='add'>+    stub-&gt;fn_cbk.readdirp = fn;</div><div class='add'>+    args_readdirp_cbk_store(&amp;stub-&gt;args_cbk, op_ret, op_errno, entries, xdata);</div><div class='ctx'> out:</div><div class='del'>-	return stub;</div><div class='add'>+    return stub;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> call_stub_t *</div><div class='del'>-fop_lk_stub (call_frame_t *frame,</div><div class='del'>-	     fop_lk_t fn,</div><div class='del'>-	     fd_t *fd,</div><div class='del'>-	     int32_t cmd,</div><div class='del'>-	     struct flock *lock)</div><div class='add'>+fop_readdir_cbk_stub(call_frame_t *frame, fop_readdir_cbk_t fn, int32_t op_ret,</div><div class='add'>+                     int32_t op_errno, gf_dirent_t *entries, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-	call_stub_t *stub = NULL;</div><div class='add'>+    call_stub_t *stub = NULL;</div><div class='ctx'> </div><div class='del'>-	GF_VALIDATE_OR_GOTO ("call-stub", frame, out);</div><div class='del'>-	GF_VALIDATE_OR_GOTO ("call-stub", lock, out);</div><div class='del'>-	</div><div class='del'>-	stub = stub_new (frame, 1, GF_FOP_LK);</div><div class='del'>-	GF_VALIDATE_OR_GOTO ("call-stub", stub, out);</div><div class='add'>+    stub = stub_new(frame, 0, GF_FOP_READDIR);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("call-stub", stub, out);</div><div class='ctx'> </div><div class='del'>-	stub-&gt;args.lk.fn = fn;</div><div class='del'>-	if (fd)</div><div class='del'>-		stub-&gt;args.lk.fd = fd_ref (fd);</div><div class='del'>-	stub-&gt;args.lk.cmd = cmd;</div><div class='del'>-	stub-&gt;args.lk.lock = *lock;</div><div class='add'>+    stub-&gt;fn_cbk.readdir = fn;</div><div class='add'>+    args_readdir_cbk_store(&amp;stub-&gt;args_cbk, op_ret, op_errno, entries, xdata);</div><div class='ctx'> out:</div><div class='del'>-	return stub;</div><div class='add'>+    return stub;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> call_stub_t *</div><div class='del'>-fop_lk_cbk_stub (call_frame_t *frame,</div><div class='del'>-		 fop_lk_cbk_t fn,</div><div class='del'>-		 int32_t op_ret,</div><div class='del'>-		 int32_t op_errno,</div><div class='del'>-		 struct flock *lock)</div><div class='del'>-</div><div class='add'>+fop_readdir_stub(call_frame_t *frame, fop_readdir_t fn, fd_t *fd, size_t size,</div><div class='add'>+                 off_t off, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-	call_stub_t *stub = NULL;</div><div class='del'>-</div><div class='del'>-	GF_VALIDATE_OR_GOTO ("call-stub", frame, out);</div><div class='add'>+    call_stub_t *stub = NULL;</div><div class='ctx'> </div><div class='del'>-	stub = stub_new (frame, 0, GF_FOP_LK);</div><div class='del'>-	GF_VALIDATE_OR_GOTO ("call-stub", stub, out);</div><div class='add'>+    stub = stub_new(frame, 1, GF_FOP_READDIR);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("call-stub", stub, out);</div><div class='ctx'> </div><div class='del'>-	stub-&gt;args.lk_cbk.fn = fn;</div><div class='del'>-	stub-&gt;args.lk_cbk.op_ret = op_ret;</div><div class='del'>-	stub-&gt;args.lk_cbk.op_errno = op_errno;</div><div class='del'>-	if (op_ret == 0)</div><div class='del'>-		stub-&gt;args.lk_cbk.lock = *lock;</div><div class='add'>+    stub-&gt;fn.readdir = fn;</div><div class='add'>+    args_readdir_store(&amp;stub-&gt;args, fd, size, off, xdata);</div><div class='ctx'> out:</div><div class='del'>-	return stub;</div><div class='add'>+    return stub;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> call_stub_t *</div><div class='del'>-fop_inodelk_stub (call_frame_t *frame, fop_inodelk_t fn,</div><div class='del'>-		  const char *volume, loc_t *loc, int32_t cmd, struct flock *lock)</div><div class='add'>+fop_readdirp_stub(call_frame_t *frame, fop_readdirp_t fn, fd_t *fd, size_t size,</div><div class='add'>+                  off_t off, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-  call_stub_t *stub = NULL;</div><div class='add'>+    call_stub_t *stub = NULL;</div><div class='ctx'> </div><div class='del'>-  if (!frame || !lock)</div><div class='del'>-    return NULL;</div><div class='add'>+    stub = stub_new(frame, 1, GF_FOP_READDIRP);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("call-stub", stub, out);</div><div class='ctx'> </div><div class='del'>-  stub = stub_new (frame, 1, GF_FOP_INODELK);</div><div class='del'>-  if (!stub)</div><div class='del'>-    return NULL;</div><div class='add'>+    stub-&gt;fn.readdirp = fn;</div><div class='add'>+    args_readdirp_store(&amp;stub-&gt;args, fd, size, off, xdata);</div><div class='add'>+out:</div><div class='add'>+    return stub;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-  stub-&gt;args.inodelk.fn = fn;</div><div class='add'>+call_stub_t *</div><div class='add'>+fop_rchecksum_stub(call_frame_t *frame, fop_rchecksum_t fn, fd_t *fd,</div><div class='add'>+                   off_t offset, int32_t len, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    call_stub_t *stub = NULL;</div><div class='ctx'> </div><div class='del'>-  if (volume)</div><div class='del'>-          stub-&gt;args.inodelk.volume = gf_strdup (volume);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("call-stub", fd, out);</div><div class='ctx'> </div><div class='del'>-  loc_copy (&amp;stub-&gt;args.inodelk.loc, loc);</div><div class='del'>-  stub-&gt;args.inodelk.cmd  = cmd;</div><div class='del'>-  stub-&gt;args.inodelk.lock = *lock;</div><div class='add'>+    stub = stub_new(frame, 1, GF_FOP_RCHECKSUM);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("call-stub", stub, out);</div><div class='ctx'> </div><div class='del'>-  return stub;</div><div class='add'>+    stub-&gt;fn.rchecksum = fn;</div><div class='add'>+    args_rchecksum_store(&amp;stub-&gt;args, fd, offset, len, xdata);</div><div class='add'>+out:</div><div class='add'>+    return stub;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> call_stub_t *</div><div class='del'>-fop_inodelk_cbk_stub (call_frame_t *frame, fop_inodelk_cbk_t fn,</div><div class='del'>-		      int32_t op_ret, int32_t op_errno)</div><div class='add'>+fop_rchecksum_cbk_stub(call_frame_t *frame, fop_rchecksum_cbk_t fn,</div><div class='add'>+                       int32_t op_ret, int32_t op_errno, uint32_t weak_checksum,</div><div class='add'>+                       uint8_t *strong_checksum, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-  call_stub_t *stub = NULL;</div><div class='add'>+    call_stub_t *stub = NULL;</div><div class='ctx'> </div><div class='del'>-  if (!frame)</div><div class='del'>-    return NULL;</div><div class='add'>+    stub = stub_new(frame, 0, GF_FOP_RCHECKSUM);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("call-stub", stub, out);</div><div class='add'>+</div><div class='add'>+    stub-&gt;fn_cbk.rchecksum = fn;</div><div class='add'>+    args_rchecksum_cbk_store(&amp;stub-&gt;args_cbk, op_ret, op_errno, weak_checksum,</div><div class='add'>+                             strong_checksum, xdata);</div><div class='add'>+out:</div><div class='add'>+    return stub;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-  stub = stub_new (frame, 0, GF_FOP_INODELK);</div><div class='del'>-  if (!stub)</div><div class='del'>-    return NULL;</div><div class='add'>+call_stub_t *</div><div class='add'>+fop_xattrop_cbk_stub(call_frame_t *frame, fop_xattrop_cbk_t fn, int32_t op_ret,</div><div class='add'>+                     int32_t op_errno, dict_t *xattr, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    call_stub_t *stub = NULL;</div><div class='ctx'> </div><div class='del'>-  stub-&gt;args.inodelk_cbk.fn       = fn;</div><div class='del'>-  stub-&gt;args.inodelk_cbk.op_ret   = op_ret;</div><div class='del'>-  stub-&gt;args.inodelk_cbk.op_errno = op_errno;</div><div class='add'>+    stub = stub_new(frame, 0, GF_FOP_XATTROP);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("call-stub", stub, out);</div><div class='ctx'> </div><div class='del'>-  return stub;</div><div class='add'>+    stub-&gt;fn_cbk.xattrop = fn;</div><div class='add'>+    args_xattrop_cbk_store(&amp;stub-&gt;args_cbk, op_ret, op_errno, xattr, xdata);</div><div class='add'>+out:</div><div class='add'>+    return stub;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+call_stub_t *</div><div class='add'>+fop_fxattrop_cbk_stub(call_frame_t *frame, fop_fxattrop_cbk_t fn,</div><div class='add'>+                      int32_t op_ret, int32_t op_errno, dict_t *xattr,</div><div class='add'>+                      dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    call_stub_t *stub = NULL;</div><div class='add'>+</div><div class='add'>+    stub = stub_new(frame, 0, GF_FOP_FXATTROP);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("call-stub", stub, out);</div><div class='add'>+</div><div class='add'>+    stub-&gt;fn_cbk.fxattrop = fn;</div><div class='add'>+    args_xattrop_cbk_store(&amp;stub-&gt;args_cbk, op_ret, op_errno, xattr, xdata);</div><div class='add'>+out:</div><div class='add'>+    return stub;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> call_stub_t *</div><div class='del'>-fop_finodelk_stub (call_frame_t *frame, fop_finodelk_t fn,</div><div class='del'>-		   const char *volume, fd_t *fd, int32_t cmd, struct flock *lock)</div><div class='add'>+fop_xattrop_stub(call_frame_t *frame, fop_xattrop_t fn, loc_t *loc,</div><div class='add'>+                 gf_xattrop_flags_t optype, dict_t *xattr, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-  call_stub_t *stub = NULL;</div><div class='add'>+    call_stub_t *stub = NULL;</div><div class='ctx'> </div><div class='del'>-  if (!frame || !lock)</div><div class='del'>-    return NULL;</div><div class='add'>+    GF_VALIDATE_OR_GOTO("call-stub", xattr, out);</div><div class='ctx'> </div><div class='del'>-  stub = stub_new (frame, 1, GF_FOP_FINODELK);</div><div class='del'>-  if (!stub)</div><div class='del'>-    return NULL;</div><div class='add'>+    stub = stub_new(frame, 1, GF_FOP_XATTROP);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("call-stub", stub, out);</div><div class='ctx'> </div><div class='del'>-  stub-&gt;args.finodelk.fn = fn;</div><div class='add'>+    stub-&gt;fn.xattrop = fn;</div><div class='add'>+    args_xattrop_store(&amp;stub-&gt;args, loc, optype, xattr, xdata);</div><div class='add'>+out:</div><div class='add'>+    return stub;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-  if (fd)</div><div class='del'>-	  stub-&gt;args.finodelk.fd   = fd_ref (fd);</div><div class='add'>+call_stub_t *</div><div class='add'>+fop_fxattrop_stub(call_frame_t *frame, fop_fxattrop_t fn, fd_t *fd,</div><div class='add'>+                  gf_xattrop_flags_t optype, dict_t *xattr, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    call_stub_t *stub = NULL;</div><div class='ctx'> </div><div class='del'>-  if (volume)</div><div class='del'>-          stub-&gt;args.finodelk.volume = gf_strdup (volume);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("call-stub", xattr, out);</div><div class='ctx'> </div><div class='del'>-  stub-&gt;args.finodelk.cmd  = cmd;</div><div class='del'>-  stub-&gt;args.finodelk.lock = *lock;</div><div class='add'>+    stub = stub_new(frame, 1, GF_FOP_FXATTROP);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("call-stub", stub, out);</div><div class='ctx'> </div><div class='del'>-  return stub;</div><div class='add'>+    stub-&gt;fn.fxattrop = fn;</div><div class='add'>+    args_fxattrop_store(&amp;stub-&gt;args, fd, optype, xattr, xdata);</div><div class='add'>+out:</div><div class='add'>+    return stub;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> call_stub_t *</div><div class='del'>-fop_finodelk_cbk_stub (call_frame_t *frame, fop_inodelk_cbk_t fn,</div><div class='del'>-		       int32_t op_ret, int32_t op_errno)</div><div class='add'>+fop_setattr_cbk_stub(call_frame_t *frame, fop_setattr_cbk_t fn, int32_t op_ret,</div><div class='add'>+                     int32_t op_errno, struct iatt *statpre,</div><div class='add'>+                     struct iatt *statpost, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-  call_stub_t *stub = NULL;</div><div class='add'>+    call_stub_t *stub = NULL;</div><div class='ctx'> </div><div class='del'>-  if (!frame)</div><div class='del'>-    return NULL;</div><div class='add'>+    stub = stub_new(frame, 0, GF_FOP_SETATTR);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("call-stub", stub, out);</div><div class='ctx'> </div><div class='del'>-  stub = stub_new (frame, 0, GF_FOP_FINODELK);</div><div class='del'>-  if (!stub)</div><div class='del'>-    return NULL;</div><div class='add'>+    stub-&gt;fn_cbk.setattr = fn;</div><div class='add'>+    args_setattr_cbk_store(&amp;stub-&gt;args_cbk, op_ret, op_errno, statpre, statpost,</div><div class='add'>+                           xdata);</div><div class='add'>+out:</div><div class='add'>+    return stub;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-  stub-&gt;args.finodelk_cbk.fn       = fn;</div><div class='del'>-  stub-&gt;args.finodelk_cbk.op_ret   = op_ret;</div><div class='del'>-  stub-&gt;args.finodelk_cbk.op_errno = op_errno;</div><div class='add'>+call_stub_t *</div><div class='add'>+fop_fsetattr_cbk_stub(call_frame_t *frame, fop_setattr_cbk_t fn, int32_t op_ret,</div><div class='add'>+                      int32_t op_errno, struct iatt *statpre,</div><div class='add'>+                      struct iatt *statpost, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    call_stub_t *stub = NULL;</div><div class='ctx'> </div><div class='del'>-  return stub;</div><div class='del'>-}</div><div class='add'>+    stub = stub_new(frame, 0, GF_FOP_FSETATTR);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("call-stub", stub, out);</div><div class='ctx'> </div><div class='add'>+    stub-&gt;fn_cbk.fsetattr = fn;</div><div class='add'>+    args_fsetattr_cbk_store(&amp;stub-&gt;args_cbk, op_ret, op_errno, statpre,</div><div class='add'>+                            statpost, xdata);</div><div class='add'>+out:</div><div class='add'>+    return stub;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> call_stub_t *</div><div class='del'>-fop_entrylk_stub (call_frame_t *frame, fop_entrylk_t fn,</div><div class='del'>-		  const char *volume, loc_t *loc, const char *name,</div><div class='del'>-		  entrylk_cmd cmd, entrylk_type type)</div><div class='add'>+fop_setattr_stub(call_frame_t *frame, fop_setattr_t fn, loc_t *loc,</div><div class='add'>+                 struct iatt *stbuf, int32_t valid, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-  call_stub_t *stub = NULL;</div><div class='add'>+    call_stub_t *stub = NULL;</div><div class='ctx'> </div><div class='del'>-  if (!frame)</div><div class='del'>-    return NULL;</div><div class='add'>+    GF_VALIDATE_OR_GOTO("call-stub", fn, out);</div><div class='ctx'> </div><div class='del'>-  stub = stub_new (frame, 1, GF_FOP_ENTRYLK);</div><div class='del'>-  if (!stub)</div><div class='del'>-    return NULL;</div><div class='add'>+    stub = stub_new(frame, 1, GF_FOP_SETATTR);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("call-stub", stub, out);</div><div class='ctx'> </div><div class='del'>-  stub-&gt;args.entrylk.fn = fn;</div><div class='add'>+    stub-&gt;fn.setattr = fn;</div><div class='add'>+    args_setattr_store(&amp;stub-&gt;args, loc, stbuf, valid, xdata);</div><div class='add'>+out:</div><div class='add'>+    return stub;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-  if (volume)</div><div class='del'>-          stub-&gt;args.entrylk.volume = gf_strdup (volume);</div><div class='add'>+call_stub_t *</div><div class='add'>+fop_fsetattr_stub(call_frame_t *frame, fop_fsetattr_t fn, fd_t *fd,</div><div class='add'>+                  struct iatt *stbuf, int32_t valid, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    call_stub_t *stub = NULL;</div><div class='ctx'> </div><div class='del'>-  loc_copy (&amp;stub-&gt;args.entrylk.loc, loc);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("call-stub", fn, out);</div><div class='ctx'> </div><div class='del'>-  stub-&gt;args.entrylk.cmd = cmd;</div><div class='del'>-  stub-&gt;args.entrylk.type = type;</div><div class='del'>-  if (name)</div><div class='del'>-          stub-&gt;args.entrylk.name = gf_strdup (name);</div><div class='add'>+    stub = stub_new(frame, 1, GF_FOP_FSETATTR);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("call-stub", stub, out);</div><div class='ctx'> </div><div class='del'>-  return stub;</div><div class='add'>+    stub-&gt;fn.fsetattr = fn;</div><div class='add'>+    args_fsetattr_store(&amp;stub-&gt;args, fd, stbuf, valid, xdata);</div><div class='add'>+out:</div><div class='add'>+    return stub;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> call_stub_t *</div><div class='del'>-fop_entrylk_cbk_stub (call_frame_t *frame, fop_entrylk_cbk_t fn,</div><div class='del'>-		      int32_t op_ret, int32_t op_errno)</div><div class='add'>+fop_fallocate_cbk_stub(call_frame_t *frame, fop_fallocate_cbk_t fn,</div><div class='add'>+                       int32_t op_ret, int32_t op_errno, struct iatt *statpre,</div><div class='add'>+                       struct iatt *statpost, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-  call_stub_t *stub = NULL;</div><div class='del'>-</div><div class='del'>-  if (!frame)</div><div class='del'>-    return NULL;</div><div class='add'>+    call_stub_t *stub = NULL;</div><div class='ctx'> </div><div class='del'>-  stub = stub_new (frame, 0, GF_FOP_ENTRYLK);</div><div class='del'>-  if (!stub)</div><div class='del'>-    return NULL;</div><div class='add'>+    stub = stub_new(frame, 0, GF_FOP_FALLOCATE);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("call-stub", stub, out);</div><div class='ctx'> </div><div class='del'>-  stub-&gt;args.entrylk_cbk.fn       = fn;</div><div class='del'>-  stub-&gt;args.entrylk_cbk.op_ret   = op_ret;</div><div class='del'>-  stub-&gt;args.entrylk_cbk.op_errno = op_errno;</div><div class='add'>+    stub-&gt;fn_cbk.fallocate = fn;</div><div class='ctx'> </div><div class='del'>-  return stub;</div><div class='add'>+    args_fallocate_cbk_store(&amp;stub-&gt;args_cbk, op_ret, op_errno, statpre,</div><div class='add'>+                             statpost, xdata);</div><div class='add'>+out:</div><div class='add'>+    return stub;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> call_stub_t *</div><div class='del'>-fop_fentrylk_stub (call_frame_t *frame, fop_fentrylk_t fn,</div><div class='del'>-		   const char *volume, fd_t *fd, const char *name,</div><div class='del'>-		   entrylk_cmd cmd, entrylk_type type)</div><div class='add'>+fop_fallocate_stub(call_frame_t *frame, fop_fallocate_t fn, fd_t *fd,</div><div class='add'>+                   int32_t mode, off_t offset, size_t len, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-  call_stub_t *stub = NULL;</div><div class='add'>+    call_stub_t *stub = NULL;</div><div class='ctx'> </div><div class='del'>-  if (!frame)</div><div class='del'>-    return NULL;</div><div class='add'>+    GF_VALIDATE_OR_GOTO("call-stub", fn, out);</div><div class='ctx'> </div><div class='del'>-  stub = stub_new (frame, 1, GF_FOP_FENTRYLK);</div><div class='del'>-  if (!stub)</div><div class='del'>-    return NULL;</div><div class='add'>+    stub = stub_new(frame, 1, GF_FOP_FALLOCATE);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("call-stub", stub, out);</div><div class='ctx'> </div><div class='del'>-  stub-&gt;args.fentrylk.fn = fn;</div><div class='add'>+    stub-&gt;fn.fallocate = fn;</div><div class='add'>+    args_fallocate_store(&amp;stub-&gt;args, fd, mode, offset, len, xdata);</div><div class='add'>+out:</div><div class='add'>+    return stub;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-  if (volume)</div><div class='del'>-          stub-&gt;args.fentrylk.volume = gf_strdup (volume);</div><div class='add'>+call_stub_t *</div><div class='add'>+fop_discard_cbk_stub(call_frame_t *frame, fop_discard_cbk_t fn, int32_t op_ret,</div><div class='add'>+                     int32_t op_errno, struct iatt *statpre,</div><div class='add'>+                     struct iatt *statpost, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    call_stub_t *stub = NULL;</div><div class='add'>+</div><div class='add'>+    stub = stub_new(frame, 0, GF_FOP_DISCARD);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("call-stub", stub, out);</div><div class='ctx'> </div><div class='del'>-  if (fd)</div><div class='del'>-	  stub-&gt;args.fentrylk.fd = fd_ref (fd);</div><div class='del'>-  stub-&gt;args.fentrylk.cmd = cmd;</div><div class='del'>-  stub-&gt;args.fentrylk.type = type;</div><div class='del'>-  if (name)</div><div class='del'>-          stub-&gt;args.fentrylk.name = gf_strdup (name);</div><div class='add'>+    stub-&gt;fn_cbk.discard = fn;</div><div class='ctx'> </div><div class='del'>-  return stub;</div><div class='add'>+    args_discard_cbk_store(&amp;stub-&gt;args_cbk, op_ret, op_errno, statpre, statpost,</div><div class='add'>+                           xdata);</div><div class='add'>+out:</div><div class='add'>+    return stub;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> call_stub_t *</div><div class='del'>-fop_fentrylk_cbk_stub (call_frame_t *frame, fop_fentrylk_cbk_t fn,</div><div class='del'>-		       int32_t op_ret, int32_t op_errno)</div><div class='add'>+fop_discard_stub(call_frame_t *frame, fop_discard_t fn, fd_t *fd, off_t offset,</div><div class='add'>+                 size_t len, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-  call_stub_t *stub = NULL;</div><div class='add'>+    call_stub_t *stub = NULL;</div><div class='ctx'> </div><div class='del'>-  if (!frame)</div><div class='del'>-    return NULL;</div><div class='add'>+    GF_VALIDATE_OR_GOTO("call-stub", fn, out);</div><div class='ctx'> </div><div class='del'>-  stub = stub_new (frame, 0, GF_FOP_FENTRYLK);</div><div class='del'>-  if (!stub)</div><div class='del'>-    return NULL;</div><div class='add'>+    stub = stub_new(frame, 1, GF_FOP_DISCARD);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("call-stub", stub, out);</div><div class='ctx'> </div><div class='del'>-  stub-&gt;args.fentrylk_cbk.fn       = fn;</div><div class='del'>-  stub-&gt;args.fentrylk_cbk.op_ret   = op_ret;</div><div class='del'>-  stub-&gt;args.fentrylk_cbk.op_errno = op_errno;</div><div class='del'>-</div><div class='del'>-  return stub;</div><div class='add'>+    stub-&gt;fn.discard = fn;</div><div class='add'>+    args_discard_store(&amp;stub-&gt;args, fd, offset, len, xdata);</div><div class='add'>+out:</div><div class='add'>+    return stub;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> call_stub_t *</div><div class='del'>-fop_readdirp_cbk_stub (call_frame_t *frame,</div><div class='del'>-		       fop_readdirp_cbk_t fn,</div><div class='del'>-		       int32_t op_ret,</div><div class='del'>-		       int32_t op_errno,</div><div class='del'>-		       gf_dirent_t *entries)</div><div class='add'>+fop_zerofill_cbk_stub(call_frame_t *frame, fop_zerofill_cbk_t fn,</div><div class='add'>+                      int32_t op_ret, int32_t op_errno, struct iatt *statpre,</div><div class='add'>+                      struct iatt *statpost, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-	call_stub_t *stub = NULL;</div><div class='del'>-	gf_dirent_t *stub_entry = NULL, *entry = NULL;</div><div class='del'>-</div><div class='del'>-	GF_VALIDATE_OR_GOTO ("call-stub", frame, out);</div><div class='add'>+    call_stub_t *stub = NULL;</div><div class='ctx'> </div><div class='del'>-	stub = stub_new (frame, 0, GF_FOP_READDIRP);</div><div class='del'>-	GF_VALIDATE_OR_GOTO ("call-stub", stub, out);</div><div class='add'>+    stub = stub_new(frame, 0, GF_FOP_ZEROFILL);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("call-stub", stub, out);</div><div class='ctx'> </div><div class='del'>-	stub-&gt;args.readdirp_cbk.fn = fn;</div><div class='del'>-	stub-&gt;args.readdirp_cbk.op_ret = op_ret;</div><div class='del'>-	stub-&gt;args.readdirp_cbk.op_errno = op_errno;</div><div class='del'>-	INIT_LIST_HEAD (&amp;stub-&gt;args.readdirp_cbk.entries.list);</div><div class='add'>+    stub-&gt;fn_cbk.zerofill = fn;</div><div class='ctx'> </div><div class='del'>-        /* This check must come after the init of head above</div><div class='del'>-         * so we're sure the list is empty for list_empty.</div><div class='del'>-         */</div><div class='del'>-        if (!entries)</div><div class='del'>-                goto out;</div><div class='del'>-</div><div class='del'>-	if (op_ret &gt; 0) {</div><div class='del'>-		list_for_each_entry (entry, &amp;entries-&gt;list, list) {</div><div class='del'>-			stub_entry = gf_dirent_for_name (entry-&gt;d_name);</div><div class='del'>-                        if (!stub_entry)</div><div class='del'>-                                goto out;</div><div class='del'>-			stub_entry-&gt;d_off = entry-&gt;d_off;</div><div class='del'>-			stub_entry-&gt;d_ino = entry-&gt;d_ino;</div><div class='del'>-			stub_entry-&gt;d_stat = entry-&gt;d_stat;</div><div class='del'>-			list_add_tail (&amp;stub_entry-&gt;list,</div><div class='del'>-				       &amp;stub-&gt;args.readdirp_cbk.entries.list);</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='add'>+    args_zerofill_cbk_store(&amp;stub-&gt;args_cbk, op_ret, op_errno, statpre,</div><div class='add'>+                            statpost, xdata);</div><div class='ctx'> out:</div><div class='del'>-	return stub;</div><div class='add'>+    return stub;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> call_stub_t *</div><div class='del'>-fop_readdir_cbk_stub (call_frame_t *frame,</div><div class='del'>-		      fop_readdir_cbk_t fn,</div><div class='del'>-		      int32_t op_ret,</div><div class='del'>-		      int32_t op_errno,</div><div class='del'>-		      gf_dirent_t *entries)</div><div class='add'>+fop_zerofill_stub(call_frame_t *frame, fop_zerofill_t fn, fd_t *fd,</div><div class='add'>+                  off_t offset, off_t len, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-	call_stub_t *stub = NULL;</div><div class='del'>-	gf_dirent_t *stub_entry = NULL, *entry = NULL;</div><div class='add'>+    call_stub_t *stub = NULL;</div><div class='ctx'> </div><div class='del'>-	GF_VALIDATE_OR_GOTO ("call-stub", frame, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("call-stub", fn, out);</div><div class='ctx'> </div><div class='del'>-	stub = stub_new (frame, 0, GF_FOP_READDIR);</div><div class='del'>-	GF_VALIDATE_OR_GOTO ("call-stub", stub, out);</div><div class='del'>-	</div><div class='del'>-	stub-&gt;args.readdir_cbk.fn = fn;</div><div class='del'>-	stub-&gt;args.readdir_cbk.op_ret = op_ret;</div><div class='del'>-	stub-&gt;args.readdir_cbk.op_errno = op_errno;</div><div class='del'>-	INIT_LIST_HEAD (&amp;stub-&gt;args.readdir_cbk.entries.list);</div><div class='add'>+    stub = stub_new(frame, 1, GF_FOP_ZEROFILL);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("call-stub", stub, out);</div><div class='ctx'> </div><div class='del'>-        /* This check must come after the init of head above</div><div class='del'>-         * so we're sure the list is empty for list_empty.</div><div class='del'>-         */</div><div class='del'>-        if (!entries)</div><div class='del'>-                goto out;</div><div class='add'>+    stub-&gt;fn.zerofill = fn;</div><div class='add'>+    args_zerofill_store(&amp;stub-&gt;args, fd, offset, len, xdata);</div><div class='add'>+out:</div><div class='add'>+    return stub;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+call_stub_t *</div><div class='add'>+fop_ipc_cbk_stub(call_frame_t *frame, fop_ipc_cbk_t fn, int32_t op_ret,</div><div class='add'>+                 int32_t op_errno, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    call_stub_t *stub = NULL;</div><div class='ctx'> </div><div class='del'>-	if (op_ret &gt; 0) {</div><div class='del'>-		list_for_each_entry (entry, &amp;entries-&gt;list, list) {</div><div class='del'>-			stub_entry = gf_dirent_for_name (entry-&gt;d_name);</div><div class='del'>-                        if (!stub_entry)</div><div class='del'>-                                goto out;</div><div class='del'>-			stub_entry-&gt;d_off = entry-&gt;d_off;</div><div class='del'>-			stub_entry-&gt;d_ino = entry-&gt;d_ino;</div><div class='add'>+    stub = stub_new(frame, 0, GF_FOP_IPC);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("call-stub", stub, out);</div><div class='ctx'> </div><div class='del'>-			list_add_tail (&amp;stub_entry-&gt;list,</div><div class='del'>-				       &amp;stub-&gt;args.readdir_cbk.entries.list);</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='add'>+    stub-&gt;fn_cbk.ipc = fn;</div><div class='add'>+</div><div class='add'>+    args_ipc_cbk_store(&amp;stub-&gt;args_cbk, op_ret, op_errno, xdata);</div><div class='ctx'> out:</div><div class='del'>-	return stub;</div><div class='add'>+    return stub;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> call_stub_t *</div><div class='del'>-fop_readdir_stub (call_frame_t *frame,</div><div class='del'>-		  fop_readdir_t fn,</div><div class='del'>-		  fd_t *fd,</div><div class='del'>-		  size_t size,</div><div class='del'>-		  off_t off)</div><div class='add'>+fop_ipc_stub(call_frame_t *frame, fop_ipc_t fn, int32_t op, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-  call_stub_t *stub = NULL;</div><div class='add'>+    call_stub_t *stub = NULL;</div><div class='add'>+</div><div class='add'>+    GF_VALIDATE_OR_GOTO("call-stub", fn, out);</div><div class='ctx'> </div><div class='del'>-  stub = stub_new (frame, 1, GF_FOP_READDIR);</div><div class='del'>-  stub-&gt;args.readdir.fn = fn;</div><div class='del'>-  stub-&gt;args.readdir.fd = fd_ref (fd);</div><div class='del'>-  stub-&gt;args.readdir.size = size;</div><div class='del'>-  stub-&gt;args.readdir.off = off;</div><div class='add'>+    stub = stub_new(frame, 1, GF_FOP_IPC);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("call-stub", stub, out);</div><div class='ctx'> </div><div class='del'>-  return stub;</div><div class='add'>+    stub-&gt;fn.ipc = fn;</div><div class='add'>+    args_ipc_store(&amp;stub-&gt;args, op, xdata);</div><div class='add'>+out:</div><div class='add'>+    return stub;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> call_stub_t *</div><div class='del'>-fop_readdirp_stub (call_frame_t *frame,</div><div class='del'>-		   fop_readdirp_t fn,</div><div class='del'>-		   fd_t *fd,</div><div class='del'>-		   size_t size,</div><div class='del'>-		   off_t off)</div><div class='add'>+fop_lease_cbk_stub(call_frame_t *frame, fop_lease_cbk_t fn, int32_t op_ret,</div><div class='add'>+                   int32_t op_errno, struct gf_lease *lease, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-  call_stub_t *stub = NULL;</div><div class='add'>+    call_stub_t *stub = NULL;</div><div class='ctx'> </div><div class='del'>-  stub = stub_new (frame, 1, GF_FOP_READDIRP);</div><div class='del'>-  stub-&gt;args.readdirp.fn = fn;</div><div class='del'>-  stub-&gt;args.readdirp.fd = fd_ref (fd);</div><div class='del'>-  stub-&gt;args.readdirp.size = size;</div><div class='del'>-  stub-&gt;args.readdirp.off = off;</div><div class='add'>+    stub = stub_new(frame, 0, GF_FOP_LEASE);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("call-stub", stub, out);</div><div class='ctx'> </div><div class='del'>-  return stub;</div><div class='add'>+    stub-&gt;fn_cbk.lease = fn;</div><div class='add'>+    args_lease_cbk_store(&amp;stub-&gt;args_cbk, op_ret, op_errno, lease, xdata);</div><div class='add'>+out:</div><div class='add'>+    return stub;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> call_stub_t *</div><div class='del'>-fop_rchecksum_stub (call_frame_t *frame,</div><div class='del'>-                    fop_rchecksum_t fn,</div><div class='del'>-                    fd_t *fd, off_t offset,</div><div class='del'>-                    int32_t len)</div><div class='add'>+fop_lease_stub(call_frame_t *frame, fop_lease_t fn, loc_t *loc,</div><div class='add'>+               struct gf_lease *lease, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-	call_stub_t *stub = NULL;</div><div class='add'>+    call_stub_t *stub = NULL;</div><div class='ctx'> </div><div class='del'>-	GF_VALIDATE_OR_GOTO ("call-stub", frame, out);</div><div class='del'>-	GF_VALIDATE_OR_GOTO ("call-stub", fd, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("call-stub", fn, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("call-stub", lease, out);</div><div class='ctx'> </div><div class='del'>-	stub = stub_new (frame, 1, GF_FOP_RCHECKSUM);</div><div class='del'>-	GF_VALIDATE_OR_GOTO ("call-stub", stub, out);</div><div class='add'>+    stub = stub_new(frame, 1, GF_FOP_LEASE);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("call-stub", stub, out);</div><div class='ctx'> </div><div class='del'>-	stub-&gt;args.rchecksum.fn = fn;</div><div class='del'>-        stub-&gt;args.rchecksum.fd = fd_ref (fd);</div><div class='del'>-	stub-&gt;args.rchecksum.offset = offset;</div><div class='del'>-	stub-&gt;args.rchecksum.len    = len;</div><div class='add'>+    stub-&gt;fn.lease = fn;</div><div class='add'>+    args_lease_store(&amp;stub-&gt;args, loc, lease, xdata);</div><div class='ctx'> out:</div><div class='del'>-	return stub;</div><div class='add'>+    return stub;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> call_stub_t *</div><div class='del'>-fop_rchecksum_cbk_stub (call_frame_t *frame,</div><div class='del'>-                        fop_rchecksum_cbk_t fn,</div><div class='del'>-                        int32_t op_ret,</div><div class='del'>-                        int32_t op_errno,</div><div class='del'>-                        uint32_t weak_checksum,</div><div class='del'>-                        uint8_t *strong_checksum)</div><div class='add'>+fop_seek_cbk_stub(call_frame_t *frame, fop_seek_cbk_t fn, int32_t op_ret,</div><div class='add'>+                  int32_t op_errno, off_t offset, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-	call_stub_t *stub = NULL;</div><div class='add'>+    call_stub_t *stub = NULL;</div><div class='ctx'> </div><div class='del'>-	GF_VALIDATE_OR_GOTO ("call-stub", frame, out);</div><div class='add'>+    stub = stub_new(frame, 0, GF_FOP_SEEK);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("call-stub", stub, out);</div><div class='ctx'> </div><div class='del'>-	stub = stub_new (frame, 0, GF_FOP_RCHECKSUM);</div><div class='del'>-	GF_VALIDATE_OR_GOTO ("call-stub", stub, out);</div><div class='add'>+    stub-&gt;fn_cbk.seek = fn;</div><div class='ctx'> </div><div class='del'>-	stub-&gt;args.rchecksum_cbk.fn = fn;</div><div class='del'>-	stub-&gt;args.rchecksum_cbk.op_ret = op_ret;</div><div class='del'>-	stub-&gt;args.rchecksum_cbk.op_errno = op_errno;</div><div class='del'>-</div><div class='del'>-	if (op_ret &gt;= 0)</div><div class='del'>-	{</div><div class='del'>-		stub-&gt;args.rchecksum_cbk.weak_checksum =</div><div class='del'>-                        weak_checksum;</div><div class='del'>-</div><div class='del'>-		stub-&gt;args.rchecksum_cbk.strong_checksum = </div><div class='del'>-			memdup (strong_checksum, MD5_DIGEST_LEN);</div><div class='del'>-	}</div><div class='add'>+    args_seek_cbk_store(&amp;stub-&gt;args_cbk, op_ret, op_errno, offset, xdata);</div><div class='ctx'> out:</div><div class='del'>-	return stub;</div><div class='add'>+    return stub;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> call_stub_t *</div><div class='del'>-fop_xattrop_cbk_stub (call_frame_t *frame,</div><div class='del'>-		      fop_xattrop_cbk_t fn,</div><div class='del'>-		      int32_t op_ret,</div><div class='del'>-		      int32_t op_errno)</div><div class='add'>+fop_seek_stub(call_frame_t *frame, fop_seek_t fn, fd_t *fd, off_t offset,</div><div class='add'>+              gf_seek_what_t what, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-	call_stub_t *stub = NULL;</div><div class='add'>+    call_stub_t *stub = NULL;</div><div class='ctx'> </div><div class='del'>-	GF_VALIDATE_OR_GOTO ("call-stub", frame, out);</div><div class='del'>-	</div><div class='del'>-	stub = stub_new (frame, 0, GF_FOP_XATTROP);</div><div class='del'>-	GF_VALIDATE_OR_GOTO ("call-stub", stub, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("call-stub", fn, out);</div><div class='ctx'> </div><div class='del'>-	stub-&gt;args.xattrop_cbk.fn       = fn;</div><div class='del'>-	stub-&gt;args.xattrop_cbk.op_ret   = op_ret;</div><div class='del'>-	stub-&gt;args.xattrop_cbk.op_errno = op_errno;</div><div class='add'>+    stub = stub_new(frame, 1, GF_FOP_SEEK);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("call-stub", stub, out);</div><div class='ctx'> </div><div class='add'>+    stub-&gt;fn.seek = fn;</div><div class='add'>+    args_seek_store(&amp;stub-&gt;args, fd, offset, what, xdata);</div><div class='ctx'> out:</div><div class='del'>-	return stub;</div><div class='add'>+    return stub;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> call_stub_t *</div><div class='del'>-fop_fxattrop_cbk_stub (call_frame_t *frame,</div><div class='del'>-		       fop_fxattrop_cbk_t fn,</div><div class='del'>-		       int32_t op_ret,</div><div class='del'>-		       int32_t op_errno,</div><div class='del'>-		       dict_t *xattr)</div><div class='add'>+fop_getactivelk_cbk_stub(call_frame_t *frame, fop_getactivelk_cbk_t fn,</div><div class='add'>+                         int32_t op_ret, int32_t op_errno,</div><div class='add'>+                         lock_migration_info_t *lmi, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-	call_stub_t *stub = NULL;</div><div class='del'>-	GF_VALIDATE_OR_GOTO ("call-stub", frame, out);</div><div class='add'>+    call_stub_t *stub = NULL;</div><div class='add'>+</div><div class='add'>+    stub = stub_new(frame, 0, GF_FOP_GETACTIVELK);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("call-stub", stub, out);</div><div class='ctx'> </div><div class='del'>-	stub = stub_new (frame, 0, GF_FOP_FXATTROP);</div><div class='del'>-	stub-&gt;args.fxattrop_cbk.fn = fn;</div><div class='del'>-	stub-&gt;args.fxattrop_cbk.op_ret = op_ret;</div><div class='del'>-	stub-&gt;args.fxattrop_cbk.op_errno = op_errno;</div><div class='del'>-	if (xattr) </div><div class='del'>-		stub-&gt;args.fxattrop_cbk.xattr = dict_ref (xattr);</div><div class='add'>+    stub-&gt;fn_cbk.getactivelk = fn;</div><div class='ctx'> </div><div class='add'>+    args_getactivelk_cbk_store(&amp;stub-&gt;args_cbk, op_ret, op_errno, lmi, xdata);</div><div class='ctx'> out:</div><div class='del'>-	return stub;</div><div class='add'>+    return stub;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> call_stub_t *</div><div class='del'>-fop_xattrop_stub (call_frame_t *frame,</div><div class='del'>-		  fop_xattrop_t fn,</div><div class='del'>-		  loc_t *loc,</div><div class='del'>-		  gf_xattrop_flags_t optype,</div><div class='del'>-		  dict_t *xattr)</div><div class='add'>+fop_getactivelk_stub(call_frame_t *frame, fop_getactivelk_t fn, loc_t *loc,</div><div class='add'>+                     dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-	call_stub_t *stub = NULL;</div><div class='add'>+    call_stub_t *stub = NULL;</div><div class='ctx'> </div><div class='del'>-	if (!frame || !xattr)</div><div class='del'>-		return NULL;</div><div class='add'>+    GF_VALIDATE_OR_GOTO("call-stub", fn, out);</div><div class='ctx'> </div><div class='del'>-	stub = stub_new (frame, 1, GF_FOP_XATTROP);</div><div class='del'>-	if (!stub)</div><div class='del'>-		return NULL;</div><div class='add'>+    stub = stub_new(frame, 1, GF_FOP_GETACTIVELK);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("call-stub", stub, out);</div><div class='ctx'> </div><div class='del'>-	stub-&gt;args.xattrop.fn = fn;</div><div class='del'>-	</div><div class='del'>-	loc_copy (&amp;stub-&gt;args.xattrop.loc, loc);</div><div class='add'>+    stub-&gt;fn.getactivelk = fn;</div><div class='ctx'> </div><div class='del'>-	stub-&gt;args.xattrop.optype = optype;</div><div class='del'>-	stub-&gt;args.xattrop.xattr = dict_ref (xattr);</div><div class='add'>+    loc_copy(&amp;stub-&gt;args.loc, loc);</div><div class='ctx'> </div><div class='del'>-	return stub;</div><div class='add'>+    if (xdata)</div><div class='add'>+        stub-&gt;args.xdata = dict_ref(xdata);</div><div class='add'>+out:</div><div class='add'>+    return stub;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> call_stub_t *</div><div class='del'>-fop_fxattrop_stub (call_frame_t *frame,</div><div class='del'>-		   fop_fxattrop_t fn,</div><div class='del'>-		   fd_t *fd,</div><div class='del'>-		   gf_xattrop_flags_t optype,</div><div class='del'>-		   dict_t *xattr)</div><div class='add'>+fop_setactivelk_cbk_stub(call_frame_t *frame, fop_setactivelk_cbk_t fn,</div><div class='add'>+                         int32_t op_ret, int32_t op_errno, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-	call_stub_t *stub = NULL;</div><div class='add'>+    call_stub_t *stub = NULL;</div><div class='ctx'> </div><div class='del'>-	if (!frame || !xattr)</div><div class='del'>-		return NULL;</div><div class='add'>+    stub = stub_new(frame, 0, GF_FOP_SETACTIVELK);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("call-stub", stub, out);</div><div class='ctx'> </div><div class='del'>-	stub = stub_new (frame, 1, GF_FOP_FXATTROP);</div><div class='del'>-	if (!stub)</div><div class='del'>-		return NULL;</div><div class='add'>+    stub-&gt;fn_cbk.setactivelk = fn;</div><div class='add'>+    stub-&gt;args_cbk.op_ret = op_ret;</div><div class='add'>+    stub-&gt;args_cbk.op_errno = op_errno;</div><div class='ctx'> </div><div class='del'>-	stub-&gt;args.fxattrop.fn = fn;</div><div class='del'>-	</div><div class='del'>-	stub-&gt;args.fxattrop.fd = fd_ref (fd);</div><div class='add'>+    if (xdata)</div><div class='add'>+        stub-&gt;args.xdata = dict_ref(xdata);</div><div class='ctx'> </div><div class='del'>-	stub-&gt;args.fxattrop.optype = optype;</div><div class='del'>-	stub-&gt;args.fxattrop.xattr = dict_ref (xattr);</div><div class='del'>-</div><div class='del'>-	return stub;</div><div class='add'>+out:</div><div class='add'>+    return stub;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> call_stub_t *</div><div class='del'>-fop_setattr_cbk_stub (call_frame_t *frame,</div><div class='del'>-                      fop_setattr_cbk_t fn,</div><div class='del'>-                      int32_t op_ret,</div><div class='del'>-                      int32_t op_errno,</div><div class='del'>-                      struct iatt *statpre,</div><div class='del'>-                      struct iatt *statpost)</div><div class='add'>+fop_setactivelk_stub(call_frame_t *frame, fop_setactivelk_t fn, loc_t *loc,</div><div class='add'>+                     lock_migration_info_t *locklist, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-        call_stub_t *stub = NULL;</div><div class='del'>-</div><div class='del'>-        if (frame == NULL)</div><div class='del'>-                goto out;</div><div class='add'>+    call_stub_t *stub = NULL;</div><div class='ctx'> </div><div class='del'>-	stub = stub_new (frame, 0, GF_FOP_SETATTR);</div><div class='del'>-	if (stub == NULL)</div><div class='del'>-                goto out;</div><div class='add'>+    GF_VALIDATE_OR_GOTO("call-stub", fn, out);</div><div class='ctx'> </div><div class='del'>-	stub-&gt;args.setattr_cbk.fn = fn;</div><div class='add'>+    stub = stub_new(frame, 1, GF_FOP_SETACTIVELK);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("call-stub", stub, out);</div><div class='ctx'> </div><div class='del'>-        stub-&gt;args.setattr_cbk.op_ret = op_ret;</div><div class='del'>-        stub-&gt;args.setattr_cbk.op_errno = op_errno;</div><div class='add'>+    stub-&gt;fn.setactivelk = fn;</div><div class='ctx'> </div><div class='del'>-        if (statpre)</div><div class='del'>-                stub-&gt;args.setattr_cbk.statpre = *statpre;</div><div class='del'>-        if (statpost)</div><div class='del'>-                stub-&gt;args.setattr_cbk.statpost = *statpost;</div><div class='add'>+    args_setactivelk_store(&amp;stub-&gt;args, loc, locklist, xdata);</div><div class='ctx'> </div><div class='ctx'> out:</div><div class='del'>-	return stub;</div><div class='add'>+    return stub;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> call_stub_t *</div><div class='del'>-fop_fsetattr_cbk_stub (call_frame_t *frame,</div><div class='del'>-                       fop_setattr_cbk_t fn,</div><div class='del'>-                       int32_t op_ret,</div><div class='del'>-                       int32_t op_errno,</div><div class='del'>-                       struct iatt *statpre,</div><div class='del'>-                       struct iatt *statpost)</div><div class='add'>+fop_copy_file_range_stub(call_frame_t *frame, fop_copy_file_range_t fn,</div><div class='add'>+                         fd_t *fd_in, off64_t off_in, fd_t *fd_out,</div><div class='add'>+                         off64_t off_out, size_t len, uint32_t flags,</div><div class='add'>+                         dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-        call_stub_t *stub = NULL;</div><div class='add'>+    call_stub_t *stub = NULL;</div><div class='ctx'> </div><div class='del'>-        if (frame == NULL)</div><div class='del'>-                goto out;</div><div class='add'>+    GF_VALIDATE_OR_GOTO("call-stub", fn, out);</div><div class='ctx'> </div><div class='del'>-	stub = stub_new (frame, 0, GF_FOP_FSETATTR);</div><div class='del'>-	if (stub == NULL)</div><div class='del'>-                goto out;</div><div class='add'>+    stub = stub_new(frame, 1, GF_FOP_COPY_FILE_RANGE);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("call-stub", stub, out);</div><div class='ctx'> </div><div class='del'>-	stub-&gt;args.fsetattr_cbk.fn = fn;</div><div class='add'>+    stub-&gt;fn.copy_file_range = fn;</div><div class='ctx'> </div><div class='del'>-        stub-&gt;args.fsetattr_cbk.op_ret = op_ret;</div><div class='del'>-        stub-&gt;args.fsetattr_cbk.op_errno = op_errno;</div><div class='add'>+    args_copy_file_range_store(&amp;stub-&gt;args, fd_in, off_in, fd_out, off_out, len,</div><div class='add'>+                               flags, xdata);</div><div class='ctx'> </div><div class='del'>-        if (statpre)</div><div class='del'>-                stub-&gt;args.setattr_cbk.statpre = *statpre;</div><div class='del'>-        if (statpost)</div><div class='del'>-                stub-&gt;args.fsetattr_cbk.statpost = *statpost;</div><div class='ctx'> out:</div><div class='del'>-	return stub;</div><div class='add'>+    return stub;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> call_stub_t *</div><div class='del'>-fop_setattr_stub (call_frame_t *frame,</div><div class='del'>-                  fop_setattr_t fn,</div><div class='del'>-                  loc_t *loc,</div><div class='del'>-                  struct iatt *stbuf,</div><div class='del'>-                  int32_t valid)</div><div class='add'>+fop_copy_file_range_cbk_stub(call_frame_t *frame, fop_copy_file_range_cbk_t fn,</div><div class='add'>+                             int32_t op_ret, int32_t op_errno,</div><div class='add'>+                             struct iatt *stbuf, struct iatt *prebuf_dst,</div><div class='add'>+                             struct iatt *postbuf_dst, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-        call_stub_t *stub = NULL;</div><div class='add'>+    call_stub_t *stub = NULL;</div><div class='ctx'> </div><div class='del'>-        if (frame == NULL)</div><div class='del'>-                goto out;</div><div class='add'>+    GF_VALIDATE_OR_GOTO("call-stub", fn, out);</div><div class='ctx'> </div><div class='del'>-        if (fn == NULL)</div><div class='del'>-                goto out;</div><div class='add'>+    stub = stub_new(frame, 0, GF_FOP_COPY_FILE_RANGE);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("call-stub", stub, out);</div><div class='ctx'> </div><div class='del'>-	stub = stub_new (frame, 1, GF_FOP_SETATTR);</div><div class='del'>-	if (stub == NULL)</div><div class='del'>-                goto out;</div><div class='add'>+    stub-&gt;fn_cbk.copy_file_range = fn;</div><div class='add'>+    args_copy_file_range_cbk_store(&amp;stub-&gt;args_cbk, op_ret, op_errno, stbuf,</div><div class='add'>+                                   prebuf_dst, postbuf_dst, xdata);</div><div class='ctx'> </div><div class='del'>-	stub-&gt;args.setattr.fn = fn;</div><div class='add'>+out:</div><div class='add'>+    return stub;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	loc_copy (&amp;stub-&gt;args.setattr.loc, loc);</div><div class='add'>+call_stub_t *</div><div class='add'>+fop_put_stub(call_frame_t *frame, fop_put_t fn, loc_t *loc, mode_t mode,</div><div class='add'>+             mode_t umask, uint32_t flags, struct iovec *vector, int32_t count,</div><div class='add'>+             off_t offset, struct iobref *iobref, dict_t *xattr, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    call_stub_t *stub = NULL;</div><div class='ctx'> </div><div class='del'>-        if (stbuf)</div><div class='del'>-                stub-&gt;args.setattr.stbuf = *stbuf;</div><div class='add'>+    GF_VALIDATE_OR_GOTO("call-stub", vector, out);</div><div class='ctx'> </div><div class='del'>-        stub-&gt;args.setattr.valid = valid;</div><div class='add'>+    stub = stub_new(frame, 1, GF_FOP_PUT);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("call-stub", stub, out);</div><div class='ctx'> </div><div class='add'>+    stub-&gt;fn.put = fn;</div><div class='add'>+    args_put_store(&amp;stub-&gt;args, loc, mode, umask, flags, vector, count, offset,</div><div class='add'>+                   iobref, xattr, xdata);</div><div class='ctx'> out:</div><div class='del'>-	return stub;</div><div class='add'>+    return stub;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> call_stub_t *</div><div class='del'>-fop_fsetattr_stub (call_frame_t *frame,</div><div class='del'>-                   fop_fsetattr_t fn,</div><div class='del'>-                   fd_t *fd,</div><div class='del'>-                   struct iatt *stbuf,</div><div class='del'>-                   int32_t valid)</div><div class='add'>+fop_put_cbk_stub(call_frame_t *frame, fop_put_cbk_t fn, int32_t op_ret,</div><div class='add'>+                 int32_t op_errno, inode_t *inode, struct iatt *buf,</div><div class='add'>+                 struct iatt *preparent, struct iatt *postparent, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-        call_stub_t *stub = NULL;</div><div class='add'>+    call_stub_t *stub = NULL;</div><div class='ctx'> </div><div class='del'>-        if (frame == NULL)</div><div class='del'>-                goto out;</div><div class='add'>+    stub = stub_new(frame, 0, GF_FOP_PUT);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("call-stub", stub, out);</div><div class='ctx'> </div><div class='del'>-        if (fn == NULL)</div><div class='del'>-                goto out;</div><div class='add'>+    stub-&gt;fn_cbk.put = fn;</div><div class='add'>+    args_put_cbk_store(&amp;stub-&gt;args_cbk, op_ret, op_errno, inode, buf, preparent,</div><div class='add'>+                       postparent, xdata);</div><div class='add'>+out:</div><div class='add'>+    return stub;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	stub = stub_new (frame, 1, GF_FOP_FSETATTR);</div><div class='del'>-	if (stub == NULL)</div><div class='del'>-                goto out;</div><div class='add'>+call_stub_t *</div><div class='add'>+fop_icreate_stub(call_frame_t *frame, fop_icreate_t fn, loc_t *loc, mode_t mode,</div><div class='add'>+                 dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    call_stub_t *stub = NULL;</div><div class='ctx'> </div><div class='del'>-	stub-&gt;args.fsetattr.fn = fn;</div><div class='add'>+    GF_VALIDATE_OR_GOTO("call-stub", fn, out);</div><div class='ctx'> </div><div class='del'>-        if (fd)</div><div class='del'>-                stub-&gt;args.fsetattr.fd = fd_ref (fd);</div><div class='add'>+    stub = stub_new(frame, 1, GF_FOP_ICREATE);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("call-stub", stub, out);</div><div class='ctx'> </div><div class='del'>-        if (stbuf)</div><div class='del'>-                stub-&gt;args.fsetattr.stbuf = *stbuf;</div><div class='add'>+    stub-&gt;fn.icreate = fn;</div><div class='ctx'> </div><div class='del'>-        stub-&gt;args.fsetattr.valid = valid;</div><div class='add'>+    stub-&gt;args.mode = mode;</div><div class='add'>+    if (loc)</div><div class='add'>+        loc_copy(&amp;stub-&gt;args.loc, loc);</div><div class='add'>+    if (xdata)</div><div class='add'>+        stub-&gt;args.xdata = dict_ref(xdata);</div><div class='ctx'> </div><div class='ctx'> out:</div><div class='del'>-	return stub;</div><div class='add'>+    return stub;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> static void</div><div class='del'>-call_resume_wind (call_stub_t *stub)</div><div class='del'>-{</div><div class='del'>-	GF_VALIDATE_OR_GOTO ("call-stub", stub, out);</div><div class='del'>-</div><div class='del'>-	switch (stub-&gt;fop) {</div><div class='del'>-	case GF_FOP_OPEN:</div><div class='del'>-	{</div><div class='del'>-		stub-&gt;args.open.fn (stub-&gt;frame, </div><div class='del'>-				    stub-&gt;frame-&gt;this,</div><div class='del'>-				    &amp;stub-&gt;args.open.loc, </div><div class='del'>-				    stub-&gt;args.open.flags, stub-&gt;args.open.fd,</div><div class='del'>-                                    stub-&gt;args.open.wbflags);</div><div class='del'>-		break;</div><div class='del'>-	}</div><div class='del'>-	case GF_FOP_CREATE:</div><div class='del'>-	{</div><div class='del'>-		stub-&gt;args.create.fn (stub-&gt;frame,</div><div class='del'>-				      stub-&gt;frame-&gt;this,</div><div class='del'>-				      &amp;stub-&gt;args.create.loc,</div><div class='del'>-				      stub-&gt;args.create.flags,</div><div class='del'>-				      stub-&gt;args.create.mode,</div><div class='del'>-				      stub-&gt;args.create.fd,</div><div class='del'>-                                      stub-&gt;args.create.params);</div><div class='del'>-		break;</div><div class='del'>-	}</div><div class='del'>-	case GF_FOP_STAT:</div><div class='del'>-	{</div><div class='del'>-		stub-&gt;args.stat.fn (stub-&gt;frame,</div><div class='del'>-				    stub-&gt;frame-&gt;this,</div><div class='del'>-				    &amp;stub-&gt;args.stat.loc);</div><div class='del'>-		break;</div><div class='del'>-	}</div><div class='del'>-	case GF_FOP_READLINK:</div><div class='del'>-	{</div><div class='del'>-		stub-&gt;args.readlink.fn (stub-&gt;frame,</div><div class='del'>-					stub-&gt;frame-&gt;this,</div><div class='del'>-					&amp;stub-&gt;args.readlink.loc,</div><div class='del'>-					stub-&gt;args.readlink.size);</div><div class='del'>-		break;</div><div class='del'>-	}</div><div class='del'>-  </div><div class='del'>-	case GF_FOP_MKNOD:</div><div class='del'>-	{</div><div class='del'>-		stub-&gt;args.mknod.fn (stub-&gt;frame, stub-&gt;frame-&gt;this,</div><div class='del'>-				     &amp;stub-&gt;args.mknod.loc,</div><div class='del'>-				     stub-&gt;args.mknod.mode,</div><div class='del'>-				     stub-&gt;args.mknod.rdev,</div><div class='del'>-                                     stub-&gt;args.mknod.params);</div><div class='del'>-	}</div><div class='del'>-	break;</div><div class='del'>-  </div><div class='del'>-	case GF_FOP_MKDIR:</div><div class='del'>-	{</div><div class='del'>-		stub-&gt;args.mkdir.fn (stub-&gt;frame, stub-&gt;frame-&gt;this,</div><div class='del'>-				     &amp;stub-&gt;args.mkdir.loc,</div><div class='del'>-				     stub-&gt;args.mkdir.mode,</div><div class='del'>-                                     stub-&gt;args.mkdir.params);</div><div class='del'>-	}</div><div class='del'>-	break;</div><div class='del'>-  </div><div class='del'>-	case GF_FOP_UNLINK:</div><div class='del'>-	{</div><div class='del'>-		stub-&gt;args.unlink.fn (stub-&gt;frame,</div><div class='del'>-				      stub-&gt;frame-&gt;this,</div><div class='del'>-				      &amp;stub-&gt;args.unlink.loc);</div><div class='del'>-	}</div><div class='del'>-	break;</div><div class='del'>-</div><div class='del'>-	case GF_FOP_RMDIR:</div><div class='del'>-	{</div><div class='del'>-		stub-&gt;args.rmdir.fn (stub-&gt;frame,</div><div class='del'>-				     stub-&gt;frame-&gt;this,</div><div class='del'>-				     &amp;stub-&gt;args.rmdir.loc);</div><div class='del'>-	}</div><div class='del'>-	break;</div><div class='del'>-      </div><div class='del'>-	case GF_FOP_SYMLINK:</div><div class='del'>-	{</div><div class='del'>-		stub-&gt;args.symlink.fn (stub-&gt;frame,</div><div class='del'>-				       stub-&gt;frame-&gt;this,</div><div class='del'>-				       stub-&gt;args.symlink.linkname,</div><div class='del'>-				       &amp;stub-&gt;args.symlink.loc,</div><div class='del'>-                                       stub-&gt;args.symlink.params);</div><div class='del'>-	}</div><div class='del'>-	break;</div><div class='del'>-  </div><div class='del'>-	case GF_FOP_RENAME:</div><div class='del'>-	{</div><div class='del'>-		stub-&gt;args.rename.fn (stub-&gt;frame,</div><div class='del'>-				      stub-&gt;frame-&gt;this,</div><div class='del'>-				      &amp;stub-&gt;args.rename.old,</div><div class='del'>-				      &amp;stub-&gt;args.rename.new);</div><div class='del'>-	}</div><div class='del'>-	break;</div><div class='del'>-</div><div class='del'>-	case GF_FOP_LINK:</div><div class='del'>-	{</div><div class='del'>-		stub-&gt;args.link.fn (stub-&gt;frame,</div><div class='del'>-				    stub-&gt;frame-&gt;this,</div><div class='del'>-				    &amp;stub-&gt;args.link.oldloc,</div><div class='del'>-				    &amp;stub-&gt;args.link.newloc);</div><div class='del'>-	}</div><div class='del'>-	break;</div><div class='del'>-  </div><div class='del'>-	case GF_FOP_TRUNCATE:</div><div class='del'>-	{</div><div class='del'>-		stub-&gt;args.truncate.fn (stub-&gt;frame,</div><div class='del'>-					stub-&gt;frame-&gt;this,</div><div class='del'>-					&amp;stub-&gt;args.truncate.loc,</div><div class='del'>-					stub-&gt;args.truncate.off);</div><div class='del'>-		break;</div><div class='del'>-	}</div><div class='del'>-      </div><div class='del'>-	case GF_FOP_READ:</div><div class='del'>-	{</div><div class='del'>-		stub-&gt;args.readv.fn (stub-&gt;frame,</div><div class='del'>-				     stub-&gt;frame-&gt;this,</div><div class='del'>-				     stub-&gt;args.readv.fd,</div><div class='del'>-				     stub-&gt;args.readv.size,</div><div class='del'>-				     stub-&gt;args.readv.off);</div><div class='del'>-		break;</div><div class='del'>-	}</div><div class='del'>-  </div><div class='del'>-	case GF_FOP_WRITE:</div><div class='del'>-	{</div><div class='del'>-		stub-&gt;args.writev.fn (stub-&gt;frame,</div><div class='del'>-				      stub-&gt;frame-&gt;this,</div><div class='del'>-				      stub-&gt;args.writev.fd,</div><div class='del'>-				      stub-&gt;args.writev.vector,</div><div class='del'>-				      stub-&gt;args.writev.count,</div><div class='del'>-				      stub-&gt;args.writev.off,</div><div class='del'>-                                      stub-&gt;args.writev.iobref);</div><div class='del'>-		break;</div><div class='del'>-	}</div><div class='del'>-  </div><div class='del'>-	case GF_FOP_STATFS:</div><div class='del'>-	{</div><div class='del'>-		stub-&gt;args.statfs.fn (stub-&gt;frame,</div><div class='del'>-				      stub-&gt;frame-&gt;this,</div><div class='del'>-				      &amp;stub-&gt;args.statfs.loc);</div><div class='del'>-		break;</div><div class='del'>-	}</div><div class='del'>-	case GF_FOP_FLUSH:</div><div class='del'>-	{</div><div class='del'>-		stub-&gt;args.flush.fn (stub-&gt;frame,</div><div class='del'>-				     stub-&gt;frame-&gt;this,</div><div class='del'>-				     stub-&gt;args.flush.fd);</div><div class='del'>-		break;</div><div class='del'>-	}</div><div class='del'>-  </div><div class='del'>-	case GF_FOP_FSYNC:</div><div class='del'>-	{</div><div class='del'>-		stub-&gt;args.fsync.fn (stub-&gt;frame,</div><div class='del'>-				     stub-&gt;frame-&gt;this,</div><div class='del'>-				     stub-&gt;args.fsync.fd,</div><div class='del'>-				     stub-&gt;args.fsync.datasync);</div><div class='del'>-		break;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	case GF_FOP_SETXATTR:</div><div class='del'>-	{</div><div class='del'>-		stub-&gt;args.setxattr.fn (stub-&gt;frame,</div><div class='del'>-					stub-&gt;frame-&gt;this,</div><div class='del'>-					&amp;stub-&gt;args.setxattr.loc,</div><div class='del'>-					stub-&gt;args.setxattr.dict,</div><div class='del'>-					stub-&gt;args.setxattr.flags);</div><div class='del'>-		break;</div><div class='del'>-	}</div><div class='del'>-  </div><div class='del'>-	case GF_FOP_GETXATTR:</div><div class='del'>-	{</div><div class='del'>-		stub-&gt;args.getxattr.fn (stub-&gt;frame,</div><div class='del'>-					stub-&gt;frame-&gt;this,</div><div class='del'>-					&amp;stub-&gt;args.getxattr.loc,</div><div class='del'>-					stub-&gt;args.getxattr.name);</div><div class='del'>-		break;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	case GF_FOP_FSETXATTR:</div><div class='del'>-	{</div><div class='del'>-		stub-&gt;args.fsetxattr.fn (stub-&gt;frame,</div><div class='del'>-                                         stub-&gt;frame-&gt;this,</div><div class='del'>-                                         stub-&gt;args.fsetxattr.fd,</div><div class='del'>-                                         stub-&gt;args.fsetxattr.dict,</div><div class='del'>-                                         stub-&gt;args.fsetxattr.flags);</div><div class='del'>-		break;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	case GF_FOP_FGETXATTR:</div><div class='del'>-	{</div><div class='del'>-		stub-&gt;args.fgetxattr.fn (stub-&gt;frame,</div><div class='del'>-                                         stub-&gt;frame-&gt;this,</div><div class='del'>-                                         stub-&gt;args.fgetxattr.fd,</div><div class='del'>-                                         stub-&gt;args.fgetxattr.name);</div><div class='del'>-		break;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	case GF_FOP_REMOVEXATTR:</div><div class='del'>-	{</div><div class='del'>-		stub-&gt;args.removexattr.fn (stub-&gt;frame,</div><div class='del'>-					   stub-&gt;frame-&gt;this,</div><div class='del'>-					   &amp;stub-&gt;args.removexattr.loc,</div><div class='del'>-					   stub-&gt;args.removexattr.name);</div><div class='del'>-		break;</div><div class='del'>-	}</div><div class='del'>-  </div><div class='del'>-	case GF_FOP_OPENDIR:</div><div class='del'>-	{</div><div class='del'>-		stub-&gt;args.opendir.fn (stub-&gt;frame,</div><div class='del'>-				       stub-&gt;frame-&gt;this,</div><div class='del'>-				       &amp;stub-&gt;args.opendir.loc,</div><div class='del'>-				       stub-&gt;args.opendir.fd);</div><div class='del'>-		break;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	case GF_FOP_FSYNCDIR:</div><div class='del'>-	{</div><div class='del'>-		stub-&gt;args.fsyncdir.fn (stub-&gt;frame,</div><div class='del'>-					stub-&gt;frame-&gt;this,</div><div class='del'>-					stub-&gt;args.fsyncdir.fd,</div><div class='del'>-					stub-&gt;args.fsyncdir.datasync);</div><div class='del'>-		break;</div><div class='del'>-	}</div><div class='del'>-  </div><div class='del'>-	case GF_FOP_ACCESS:</div><div class='del'>-	{</div><div class='del'>-		stub-&gt;args.access.fn (stub-&gt;frame,</div><div class='del'>-				      stub-&gt;frame-&gt;this,</div><div class='del'>-				      &amp;stub-&gt;args.access.loc,</div><div class='del'>-				      stub-&gt;args.access.mask);</div><div class='del'>-		break;</div><div class='del'>-	}</div><div class='del'>-  </div><div class='del'>-	case GF_FOP_FTRUNCATE:</div><div class='del'>-	{</div><div class='del'>-		stub-&gt;args.ftruncate.fn (stub-&gt;frame,</div><div class='del'>-					 stub-&gt;frame-&gt;this,</div><div class='del'>-					 stub-&gt;args.ftruncate.fd,</div><div class='del'>-					 stub-&gt;args.ftruncate.off);</div><div class='del'>-		break;</div><div class='del'>-	}</div><div class='del'>-  </div><div class='del'>-	case GF_FOP_FSTAT:</div><div class='del'>-	{</div><div class='del'>-		stub-&gt;args.fstat.fn (stub-&gt;frame,</div><div class='del'>-				     stub-&gt;frame-&gt;this,</div><div class='del'>-				     stub-&gt;args.fstat.fd);</div><div class='del'>-		break;</div><div class='del'>-	}</div><div class='del'>-  </div><div class='del'>-	case GF_FOP_LK:</div><div class='del'>-	{</div><div class='del'>-		stub-&gt;args.lk.fn (stub-&gt;frame,</div><div class='del'>-				  stub-&gt;frame-&gt;this,</div><div class='del'>-				  stub-&gt;args.lk.fd,</div><div class='del'>-				  stub-&gt;args.lk.cmd,</div><div class='del'>-				  &amp;stub-&gt;args.lk.lock);</div><div class='del'>-		break;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	case GF_FOP_INODELK:</div><div class='del'>-	{</div><div class='del'>-		stub-&gt;args.inodelk.fn (stub-&gt;frame,</div><div class='del'>-				       stub-&gt;frame-&gt;this,</div><div class='del'>-                                       stub-&gt;args.inodelk.volume,</div><div class='del'>-				       &amp;stub-&gt;args.inodelk.loc,</div><div class='del'>-				       stub-&gt;args.inodelk.cmd,</div><div class='del'>-				       &amp;stub-&gt;args.inodelk.lock);</div><div class='del'>-		break;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	case GF_FOP_FINODELK:</div><div class='del'>-	{</div><div class='del'>-		stub-&gt;args.finodelk.fn (stub-&gt;frame,</div><div class='del'>-					stub-&gt;frame-&gt;this,</div><div class='del'>-                                        stub-&gt;args.finodelk.volume,</div><div class='del'>-					stub-&gt;args.finodelk.fd,</div><div class='del'>-					stub-&gt;args.finodelk.cmd,</div><div class='del'>-					&amp;stub-&gt;args.finodelk.lock);</div><div class='del'>-		break;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	case GF_FOP_ENTRYLK:</div><div class='del'>-	{</div><div class='del'>-		stub-&gt;args.entrylk.fn (stub-&gt;frame,</div><div class='del'>-				       stub-&gt;frame-&gt;this,</div><div class='del'>-                                       stub-&gt;args.entrylk.volume,</div><div class='del'>-				       &amp;stub-&gt;args.entrylk.loc,</div><div class='del'>-				       stub-&gt;args.entrylk.name,</div><div class='del'>-				       stub-&gt;args.entrylk.cmd,</div><div class='del'>-				       stub-&gt;args.entrylk.type);</div><div class='del'>-		break;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	case GF_FOP_FENTRYLK:</div><div class='del'>-	{</div><div class='del'>-		stub-&gt;args.fentrylk.fn (stub-&gt;frame,</div><div class='del'>-					stub-&gt;frame-&gt;this,</div><div class='del'>-                                        stub-&gt;args.fentrylk.volume,</div><div class='del'>-					stub-&gt;args.fentrylk.fd,</div><div class='del'>-					stub-&gt;args.fentrylk.name,</div><div class='del'>-					stub-&gt;args.fentrylk.cmd,</div><div class='del'>-					stub-&gt;args.fentrylk.type);</div><div class='del'>-		break;</div><div class='del'>-	}</div><div class='del'>-  </div><div class='del'>-	break;</div><div class='del'>-  </div><div class='del'>-	case GF_FOP_LOOKUP:</div><div class='del'>-	{</div><div class='del'>-		stub-&gt;args.lookup.fn (stub-&gt;frame, </div><div class='del'>-				      stub-&gt;frame-&gt;this,</div><div class='del'>-				      &amp;stub-&gt;args.lookup.loc,</div><div class='del'>-				      stub-&gt;args.lookup.xattr_req);</div><div class='del'>-		break;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	case GF_FOP_RCHECKSUM:</div><div class='del'>-	{</div><div class='del'>-		stub-&gt;args.rchecksum.fn (stub-&gt;frame,</div><div class='del'>-                                         stub-&gt;frame-&gt;this,</div><div class='del'>-                                         stub-&gt;args.rchecksum.fd,</div><div class='del'>-                                         stub-&gt;args.rchecksum.offset,</div><div class='del'>-                                         stub-&gt;args.rchecksum.len);</div><div class='del'>-		break;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	case GF_FOP_READDIR:</div><div class='del'>-	{</div><div class='del'>-		stub-&gt;args.readdir.fn (stub-&gt;frame,</div><div class='del'>-				       stub-&gt;frame-&gt;this,</div><div class='del'>-				       stub-&gt;args.readdir.fd,</div><div class='del'>-				       stub-&gt;args.readdir.size,</div><div class='del'>-				       stub-&gt;args.readdir.off);</div><div class='del'>-		break;</div><div class='del'>-	}</div><div class='add'>+args_icreate_store_cbk(default_args_cbk_t *args, int32_t op_ret,</div><div class='add'>+                       int32_t op_errno, inode_t *inode, struct iatt *buf,</div><div class='add'>+                       dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    args-&gt;op_ret = op_ret;</div><div class='add'>+    args-&gt;op_errno = op_errno;</div><div class='add'>+    if (inode)</div><div class='add'>+        args-&gt;inode = inode_ref(inode);</div><div class='add'>+    if (buf)</div><div class='add'>+        args-&gt;stat = *buf;</div><div class='add'>+    if (xdata)</div><div class='add'>+        args-&gt;xdata = dict_ref(xdata);</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        case GF_FOP_READDIRP:</div><div class='del'>-	{</div><div class='del'>-		stub-&gt;args.readdirp.fn (stub-&gt;frame,</div><div class='del'>-				        stub-&gt;frame-&gt;this,</div><div class='del'>-				        stub-&gt;args.readdirp.fd,</div><div class='del'>-				        stub-&gt;args.readdirp.size,</div><div class='del'>-				        stub-&gt;args.readdirp.off);</div><div class='del'>-		break;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	case GF_FOP_XATTROP:</div><div class='del'>-	{</div><div class='del'>-		stub-&gt;args.xattrop.fn (stub-&gt;frame,</div><div class='del'>-				       stub-&gt;frame-&gt;this,</div><div class='del'>-				       &amp;stub-&gt;args.xattrop.loc,</div><div class='del'>-				       stub-&gt;args.xattrop.optype,</div><div class='del'>-				       stub-&gt;args.xattrop.xattr);</div><div class='del'>-</div><div class='del'>-		break;</div><div class='del'>-	}</div><div class='del'>-	case GF_FOP_FXATTROP:</div><div class='del'>-	{</div><div class='del'>-		stub-&gt;args.fxattrop.fn (stub-&gt;frame,</div><div class='del'>-					stub-&gt;frame-&gt;this,</div><div class='del'>-					stub-&gt;args.fxattrop.fd,</div><div class='del'>-					stub-&gt;args.fxattrop.optype,</div><div class='del'>-					stub-&gt;args.fxattrop.xattr);</div><div class='del'>-</div><div class='del'>-		break;</div><div class='del'>-	}</div><div class='del'>-        case GF_FOP_SETATTR:</div><div class='del'>-        {</div><div class='del'>-                stub-&gt;args.setattr.fn (stub-&gt;frame,</div><div class='del'>-                                       stub-&gt;frame-&gt;this,</div><div class='del'>-                                       &amp;stub-&gt;args.setattr.loc,</div><div class='del'>-                                       &amp;stub-&gt;args.setattr.stbuf,</div><div class='del'>-                                       stub-&gt;args.setattr.valid);</div><div class='del'>-                break;</div><div class='del'>-        }</div><div class='del'>-        case GF_FOP_FSETATTR:</div><div class='del'>-        {</div><div class='del'>-                stub-&gt;args.fsetattr.fn (stub-&gt;frame,</div><div class='del'>-                                        stub-&gt;frame-&gt;this,</div><div class='del'>-                                        stub-&gt;args.fsetattr.fd,</div><div class='del'>-                                        &amp;stub-&gt;args.fsetattr.stbuf,</div><div class='del'>-                                        stub-&gt;args.fsetattr.valid);</div><div class='del'>-                break;</div><div class='del'>-        }</div><div class='del'>-	default:</div><div class='del'>-	{</div><div class='del'>-		gf_log ("call-stub", GF_LOG_ERROR, "Invalid value of FOP (%d)",</div><div class='del'>-                        stub-&gt;fop);</div><div class='del'>-                break;</div><div class='del'>-	}</div><div class='add'>+call_stub_t *</div><div class='add'>+fop_icreate_cbk_stub(call_frame_t *frame, fop_icreate_cbk_t fn, int32_t op_ret,</div><div class='add'>+                     int32_t op_errno, inode_t *inode, struct iatt *buf,</div><div class='add'>+                     dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    call_stub_t *stub = NULL;</div><div class='add'>+</div><div class='add'>+    stub = stub_new(frame, 0, GF_FOP_ICREATE);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("call-stub", stub, out);</div><div class='add'>+</div><div class='add'>+    stub-&gt;fn_cbk.icreate = fn;</div><div class='add'>+    args_icreate_store_cbk(&amp;stub-&gt;args_cbk, op_ret, op_errno, inode, buf,</div><div class='add'>+                           xdata);</div><div class='ctx'> </div><div class='del'>-	}</div><div class='ctx'> out:</div><div class='del'>-	return;</div><div class='add'>+    return stub;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+call_stub_t *</div><div class='add'>+fop_namelink_stub(call_frame_t *frame, fop_namelink_t fn, loc_t *loc,</div><div class='add'>+                  dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    call_stub_t *stub = NULL;</div><div class='add'>+</div><div class='add'>+    GF_VALIDATE_OR_GOTO("call-stub", fn, out);</div><div class='add'>+</div><div class='add'>+    stub = stub_new(frame, 1, GF_FOP_NAMELINK);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("call-stub", stub, out);</div><div class='add'>+</div><div class='add'>+    stub-&gt;fn.namelink = fn;</div><div class='ctx'> </div><div class='add'>+    if (loc)</div><div class='add'>+        loc_copy(&amp;stub-&gt;args.loc, loc);</div><div class='add'>+    if (xdata)</div><div class='add'>+        stub-&gt;args.xdata = dict_ref(xdata);</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return stub;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> static void</div><div class='del'>-call_resume_unwind (call_stub_t *stub)</div><div class='del'>-{</div><div class='del'>-	GF_VALIDATE_OR_GOTO ("call-stub", stub, out);</div><div class='del'>-</div><div class='del'>-	switch (stub-&gt;fop) {</div><div class='del'>-	case GF_FOP_OPEN:</div><div class='del'>-	{</div><div class='del'>-		if (!stub-&gt;args.open_cbk.fn)</div><div class='del'>-			STACK_UNWIND (stub-&gt;frame,</div><div class='del'>-				      stub-&gt;args.open_cbk.op_ret,</div><div class='del'>-				      stub-&gt;args.open_cbk.op_errno,</div><div class='del'>-				      stub-&gt;args.open_cbk.fd);</div><div class='del'>-		else</div><div class='del'>-			stub-&gt;args.open_cbk.fn (stub-&gt;frame, </div><div class='del'>-						stub-&gt;frame-&gt;cookie,</div><div class='del'>-						stub-&gt;frame-&gt;this,</div><div class='del'>-						stub-&gt;args.open_cbk.op_ret, </div><div class='del'>-						stub-&gt;args.open_cbk.op_errno,</div><div class='del'>-						stub-&gt;args.open_cbk.fd);</div><div class='del'>-		break;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	case GF_FOP_CREATE:</div><div class='del'>-	{</div><div class='del'>-		if (!stub-&gt;args.create_cbk.fn)</div><div class='del'>-			STACK_UNWIND (stub-&gt;frame,</div><div class='del'>-				      stub-&gt;args.create_cbk.op_ret,</div><div class='del'>-				      stub-&gt;args.create_cbk.op_errno,</div><div class='del'>-				      stub-&gt;args.create_cbk.fd,</div><div class='del'>-				      stub-&gt;args.create_cbk.inode,</div><div class='del'>-				      &amp;stub-&gt;args.create_cbk.buf,</div><div class='del'>-                                      &amp;stub-&gt;args.create_cbk.preparent,</div><div class='del'>-                                      &amp;stub-&gt;args.create_cbk.postparent);</div><div class='del'>-		else</div><div class='del'>-			stub-&gt;args.create_cbk.fn (stub-&gt;frame,</div><div class='del'>-						  stub-&gt;frame-&gt;cookie,</div><div class='del'>-						  stub-&gt;frame-&gt;this,</div><div class='del'>-						  stub-&gt;args.create_cbk.op_ret,</div><div class='del'>-						  stub-&gt;args.create_cbk.op_errno,</div><div class='del'>-						  stub-&gt;args.create_cbk.fd,</div><div class='del'>-						  stub-&gt;args.create_cbk.inode,</div><div class='del'>-						  &amp;stub-&gt;args.create_cbk.buf,</div><div class='del'>-                                                  &amp;stub-&gt;args.create_cbk.preparent,</div><div class='del'>-                                                  &amp;stub-&gt;args.create_cbk.postparent);</div><div class='del'>-      </div><div class='del'>-		break;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	case GF_FOP_STAT:</div><div class='del'>-	{</div><div class='del'>-		if (!stub-&gt;args.stat_cbk.fn)</div><div class='del'>-			STACK_UNWIND (stub-&gt;frame,</div><div class='del'>-				      stub-&gt;args.stat_cbk.op_ret,</div><div class='del'>-				      stub-&gt;args.stat_cbk.op_errno,</div><div class='del'>-				      &amp;stub-&gt;args.stat_cbk.buf);</div><div class='del'>-		else</div><div class='del'>-			stub-&gt;args.stat_cbk.fn (stub-&gt;frame,</div><div class='del'>-						stub-&gt;frame-&gt;cookie,</div><div class='del'>-						stub-&gt;frame-&gt;this,</div><div class='del'>-						stub-&gt;args.stat_cbk.op_ret,</div><div class='del'>-						stub-&gt;args.stat_cbk.op_errno,</div><div class='del'>-						&amp;stub-&gt;args.stat_cbk.buf);</div><div class='del'>-</div><div class='del'>-		break;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	case GF_FOP_READLINK:</div><div class='del'>-	{</div><div class='del'>-		if (!stub-&gt;args.readlink_cbk.fn)</div><div class='del'>-			STACK_UNWIND (stub-&gt;frame,</div><div class='del'>-				      stub-&gt;args.readlink_cbk.op_ret,</div><div class='del'>-				      stub-&gt;args.readlink_cbk.op_errno,</div><div class='del'>-				      stub-&gt;args.readlink_cbk.buf,</div><div class='del'>-                                      &amp;stub-&gt;args.readlink_cbk.sbuf);</div><div class='del'>-		else</div><div class='del'>-			stub-&gt;args.readlink_cbk.fn (stub-&gt;frame,</div><div class='del'>-						    stub-&gt;frame-&gt;cookie,</div><div class='del'>-						    stub-&gt;frame-&gt;this,</div><div class='del'>-						    stub-&gt;args.readlink_cbk.op_ret,</div><div class='del'>-						    stub-&gt;args.readlink_cbk.op_errno,</div><div class='del'>-						    stub-&gt;args.readlink_cbk.buf,</div><div class='del'>-                                                    &amp;stub-&gt;args.readlink_cbk.sbuf);</div><div class='del'>-</div><div class='del'>-		break;</div><div class='del'>-	}</div><div class='del'>-  </div><div class='del'>-	case GF_FOP_MKNOD:</div><div class='del'>-	{</div><div class='del'>-		if (!stub-&gt;args.mknod_cbk.fn)</div><div class='del'>-			STACK_UNWIND (stub-&gt;frame,</div><div class='del'>-				      stub-&gt;args.mknod_cbk.op_ret,</div><div class='del'>-				      stub-&gt;args.mknod_cbk.op_errno,</div><div class='del'>-				      stub-&gt;args.mknod_cbk.inode,</div><div class='del'>-                                      &amp;stub-&gt;args.mknod_cbk.buf,</div><div class='del'>-                                      &amp;stub-&gt;args.mknod_cbk.preparent,</div><div class='del'>-                                      &amp;stub-&gt;args.mknod_cbk.postparent);</div><div class='del'>-		else</div><div class='del'>-			stub-&gt;args.mknod_cbk.fn (stub-&gt;frame,</div><div class='del'>-						 stub-&gt;frame-&gt;cookie,</div><div class='del'>-						 stub-&gt;frame-&gt;this,</div><div class='del'>-						 stub-&gt;args.mknod_cbk.op_ret,</div><div class='del'>-						 stub-&gt;args.mknod_cbk.op_errno,</div><div class='del'>-						 stub-&gt;args.mknod_cbk.inode,</div><div class='del'>-                                                 &amp;stub-&gt;args.mknod_cbk.buf,</div><div class='del'>-                                                 &amp;stub-&gt;args.mknod_cbk.preparent,</div><div class='del'>-                                                 &amp;stub-&gt;args.mknod_cbk.postparent);</div><div class='del'>-		break;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	case GF_FOP_MKDIR:</div><div class='del'>-	{</div><div class='del'>-		if (!stub-&gt;args.mkdir_cbk.fn)</div><div class='del'>-			STACK_UNWIND (stub-&gt;frame,</div><div class='del'>-				      stub-&gt;args.mkdir_cbk.op_ret,</div><div class='del'>-				      stub-&gt;args.mkdir_cbk.op_errno,</div><div class='del'>-				      stub-&gt;args.mkdir_cbk.inode,</div><div class='del'>-                                      &amp;stub-&gt;args.mkdir_cbk.buf,</div><div class='del'>-                                      &amp;stub-&gt;args.mkdir_cbk.preparent,</div><div class='del'>-                                      &amp;stub-&gt;args.mkdir_cbk.postparent);</div><div class='del'>-		else</div><div class='del'>-			stub-&gt;args.mkdir_cbk.fn (stub-&gt;frame,</div><div class='del'>-						 stub-&gt;frame-&gt;cookie,</div><div class='del'>-						 stub-&gt;frame-&gt;this,</div><div class='del'>-						 stub-&gt;args.mkdir_cbk.op_ret,</div><div class='del'>-						 stub-&gt;args.mkdir_cbk.op_errno,</div><div class='del'>-						 stub-&gt;args.mkdir_cbk.inode,</div><div class='del'>-                                                 &amp;stub-&gt;args.mkdir_cbk.buf,</div><div class='del'>-                                                 &amp;stub-&gt;args.mkdir_cbk.preparent,</div><div class='del'>-                                                 &amp;stub-&gt;args.mkdir_cbk.postparent);</div><div class='del'>-</div><div class='del'>-		if (stub-&gt;args.mkdir_cbk.inode)</div><div class='del'>-			inode_unref (stub-&gt;args.mkdir_cbk.inode);</div><div class='del'>-</div><div class='del'>-		break;</div><div class='del'>-	}</div><div class='del'>-  </div><div class='del'>-	case GF_FOP_UNLINK:</div><div class='del'>-	{</div><div class='del'>-		if (!stub-&gt;args.unlink_cbk.fn)</div><div class='del'>-			STACK_UNWIND (stub-&gt;frame,</div><div class='del'>-				      stub-&gt;args.unlink_cbk.op_ret,</div><div class='del'>-				      stub-&gt;args.unlink_cbk.op_errno,</div><div class='del'>-                                      &amp;stub-&gt;args.unlink_cbk.preparent,</div><div class='del'>-                                      &amp;stub-&gt;args.unlink_cbk.postparent);</div><div class='del'>-		else</div><div class='del'>-			stub-&gt;args.unlink_cbk.fn (stub-&gt;frame,</div><div class='del'>-						  stub-&gt;frame-&gt;cookie,</div><div class='del'>-						  stub-&gt;frame-&gt;this,</div><div class='del'>-						  stub-&gt;args.unlink_cbk.op_ret,</div><div class='del'>-						  stub-&gt;args.unlink_cbk.op_errno,</div><div class='del'>-                                                  &amp;stub-&gt;args.unlink_cbk.preparent,</div><div class='del'>-                                                  &amp;stub-&gt;args.unlink_cbk.postparent);</div><div class='del'>-		break;</div><div class='del'>-	}</div><div class='del'>-  </div><div class='del'>-	case GF_FOP_RMDIR:</div><div class='del'>-	{</div><div class='del'>-		if (!stub-&gt;args.rmdir_cbk.fn)</div><div class='del'>-			STACK_UNWIND (stub-&gt;frame,</div><div class='del'>-				      stub-&gt;args.rmdir_cbk.op_ret,</div><div class='del'>-				      stub-&gt;args.rmdir_cbk.op_errno,</div><div class='del'>-                                      &amp;stub-&gt;args.rmdir_cbk.preparent,</div><div class='del'>-                                      &amp;stub-&gt;args.rmdir_cbk.postparent);</div><div class='del'>-		else</div><div class='del'>-			stub-&gt;args.unlink_cbk.fn (stub-&gt;frame,</div><div class='del'>-						  stub-&gt;frame-&gt;cookie,</div><div class='del'>-						  stub-&gt;frame-&gt;this,</div><div class='del'>-						  stub-&gt;args.rmdir_cbk.op_ret,</div><div class='del'>-						  stub-&gt;args.rmdir_cbk.op_errno,</div><div class='del'>-                                                  &amp;stub-&gt;args.rmdir_cbk.preparent,</div><div class='del'>-                                                  &amp;stub-&gt;args.rmdir_cbk.postparent);</div><div class='del'>-		break;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	case GF_FOP_SYMLINK:</div><div class='del'>-	{</div><div class='del'>-		if (!stub-&gt;args.symlink_cbk.fn)</div><div class='del'>-			STACK_UNWIND (stub-&gt;frame,</div><div class='del'>-				      stub-&gt;args.symlink_cbk.op_ret,</div><div class='del'>-				      stub-&gt;args.symlink_cbk.op_errno,</div><div class='del'>-				      stub-&gt;args.symlink_cbk.inode,</div><div class='del'>-                                      &amp;stub-&gt;args.symlink_cbk.buf,</div><div class='del'>-                                      &amp;stub-&gt;args.symlink_cbk.preparent,</div><div class='del'>-                                      &amp;stub-&gt;args.symlink_cbk.postparent);</div><div class='del'>-		else</div><div class='del'>-			stub-&gt;args.symlink_cbk.fn (stub-&gt;frame,</div><div class='del'>-						   stub-&gt;frame-&gt;cookie,</div><div class='del'>-						   stub-&gt;frame-&gt;this,</div><div class='del'>-						   stub-&gt;args.symlink_cbk.op_ret,</div><div class='del'>-						   stub-&gt;args.symlink_cbk.op_errno,</div><div class='del'>-						   stub-&gt;args.symlink_cbk.inode,</div><div class='del'>-                                                   &amp;stub-&gt;args.symlink_cbk.buf,</div><div class='del'>-                                                   &amp;stub-&gt;args.symlink_cbk.preparent,</div><div class='del'>-                                                   &amp;stub-&gt;args.symlink_cbk.postparent);</div><div class='del'>-	}</div><div class='del'>-	break;</div><div class='del'>-  </div><div class='del'>-	case GF_FOP_RENAME:</div><div class='del'>-	{</div><div class='del'>-#if 0</div><div class='del'>-		if (!stub-&gt;args.rename_cbk.fn)</div><div class='del'>-			STACK_UNWIND (stub-&gt;frame,</div><div class='del'>-				      stub-&gt;args.rename_cbk.op_ret,</div><div class='del'>-				      stub-&gt;args.rename_cbk.op_errno,</div><div class='del'>-				      &amp;stub-&gt;args.rename_cbk.buf,</div><div class='del'>-                                      &amp;stub-&gt;args.rename_cbk.preoldparent,</div><div class='del'>-                                      &amp;stub-&gt;args.rename_cbk.postoldparent,</div><div class='del'>-                                      &amp;stub-&gt;args.rename_cbk.prenewparent,</div><div class='del'>-                                      &amp;stub-&gt;args.rename_cbk.postnewparent);</div><div class='del'>-		else</div><div class='del'>-			stub-&gt;args.rename_cbk.fn (stub-&gt;frame,</div><div class='del'>-						  stub-&gt;frame-&gt;cookie,</div><div class='del'>-						  stub-&gt;frame-&gt;this,</div><div class='del'>-						  stub-&gt;args.rename_cbk.op_ret,</div><div class='del'>-						  stub-&gt;args.rename_cbk.op_errno,</div><div class='del'>-						  &amp;stub-&gt;args.rename_cbk.buf,</div><div class='del'>-                                                  &amp;stub-&gt;args.rename_cbk.preoldparent,</div><div class='del'>-                                                  &amp;stub-&gt;args.rename_cbk.postoldparent,</div><div class='del'>-                                                  &amp;stub-&gt;args.rename_cbk.prenewparent,</div><div class='del'>-                                                  &amp;stub-&gt;args.rename_cbk.postnewparent);</div><div class='del'>-#endif</div><div class='del'>-		break;</div><div class='del'>-	}</div><div class='del'>-  </div><div class='del'>-	case GF_FOP_LINK:</div><div class='del'>-	{</div><div class='del'>-		if (!stub-&gt;args.link_cbk.fn)</div><div class='del'>-			STACK_UNWIND (stub-&gt;frame,</div><div class='del'>-				      stub-&gt;args.link_cbk.op_ret,</div><div class='del'>-				      stub-&gt;args.link_cbk.op_errno,</div><div class='del'>-				      stub-&gt;args.link_cbk.inode,</div><div class='del'>-				      &amp;stub-&gt;args.link_cbk.buf);</div><div class='del'>-		else</div><div class='del'>-			stub-&gt;args.link_cbk.fn (stub-&gt;frame,</div><div class='del'>-						stub-&gt;frame-&gt;cookie,</div><div class='del'>-						stub-&gt;frame-&gt;this,</div><div class='del'>-						stub-&gt;args.link_cbk.op_ret,</div><div class='del'>-						stub-&gt;args.link_cbk.op_errno,</div><div class='del'>-						stub-&gt;args.link_cbk.inode,</div><div class='del'>-                                                &amp;stub-&gt;args.link_cbk.buf,</div><div class='del'>-                                                &amp;stub-&gt;args.link_cbk.preparent,</div><div class='del'>-                                                &amp;stub-&gt;args.link_cbk.postparent);</div><div class='del'>-		break;</div><div class='del'>-	}</div><div class='del'>-  </div><div class='del'>-	case GF_FOP_TRUNCATE:</div><div class='del'>-	{</div><div class='del'>-		if (!stub-&gt;args.truncate_cbk.fn)</div><div class='del'>-			STACK_UNWIND (stub-&gt;frame,</div><div class='del'>-				      stub-&gt;args.truncate_cbk.op_ret,</div><div class='del'>-				      stub-&gt;args.truncate_cbk.op_errno,</div><div class='del'>-				      &amp;stub-&gt;args.truncate_cbk.prebuf,</div><div class='del'>-                                      &amp;stub-&gt;args.truncate_cbk.postbuf);</div><div class='del'>-		else</div><div class='del'>-			stub-&gt;args.truncate_cbk.fn (stub-&gt;frame,</div><div class='del'>-						    stub-&gt;frame-&gt;cookie,</div><div class='del'>-						    stub-&gt;frame-&gt;this,</div><div class='del'>-						    stub-&gt;args.truncate_cbk.op_ret,</div><div class='del'>-						    stub-&gt;args.truncate_cbk.op_errno,</div><div class='del'>-						    &amp;stub-&gt;args.truncate_cbk.prebuf,</div><div class='del'>-                                                    &amp;stub-&gt;args.truncate_cbk.postbuf);</div><div class='del'>-		break;</div><div class='del'>-	}</div><div class='del'>-      </div><div class='del'>-	case GF_FOP_READ:</div><div class='del'>-	{</div><div class='del'>-		if (!stub-&gt;args.readv_cbk.fn)</div><div class='del'>-			STACK_UNWIND (stub-&gt;frame,</div><div class='del'>-				      stub-&gt;args.readv_cbk.op_ret,</div><div class='del'>-				      stub-&gt;args.readv_cbk.op_errno,</div><div class='del'>-				      stub-&gt;args.readv_cbk.vector,</div><div class='del'>-				      stub-&gt;args.readv_cbk.count,</div><div class='del'>-				      &amp;stub-&gt;args.readv_cbk.stbuf,</div><div class='del'>-                                      stub-&gt;args.readv_cbk.iobref);</div><div class='del'>-		else</div><div class='del'>-			stub-&gt;args.readv_cbk.fn (stub-&gt;frame,</div><div class='del'>-						 stub-&gt;frame-&gt;cookie,</div><div class='del'>-						 stub-&gt;frame-&gt;this,</div><div class='del'>-						 stub-&gt;args.readv_cbk.op_ret,</div><div class='del'>-						 stub-&gt;args.readv_cbk.op_errno,</div><div class='del'>-						 stub-&gt;args.readv_cbk.vector,</div><div class='del'>-						 stub-&gt;args.readv_cbk.count,</div><div class='del'>-						 &amp;stub-&gt;args.readv_cbk.stbuf,</div><div class='del'>-                                                 stub-&gt;args.readv_cbk.iobref);</div><div class='del'>-	}</div><div class='del'>-	break;</div><div class='del'>-  </div><div class='del'>-	case GF_FOP_WRITE:</div><div class='del'>-	{</div><div class='del'>-		if (!stub-&gt;args.writev_cbk.fn)</div><div class='del'>-			STACK_UNWIND (stub-&gt;frame,</div><div class='del'>-				      stub-&gt;args.writev_cbk.op_ret,</div><div class='del'>-				      stub-&gt;args.writev_cbk.op_errno,</div><div class='del'>-                                      &amp;stub-&gt;args.writev_cbk.prebuf,</div><div class='del'>-				      &amp;stub-&gt;args.writev_cbk.postbuf);</div><div class='del'>-		else</div><div class='del'>-			stub-&gt;args.writev_cbk.fn (stub-&gt;frame,</div><div class='del'>-						  stub-&gt;frame-&gt;cookie,</div><div class='del'>-						  stub-&gt;frame-&gt;this,</div><div class='del'>-						  stub-&gt;args.writev_cbk.op_ret,</div><div class='del'>-						  stub-&gt;args.writev_cbk.op_errno,</div><div class='del'>-                                                  &amp;stub-&gt;args.writev_cbk.prebuf,</div><div class='del'>-						  &amp;stub-&gt;args.writev_cbk.postbuf);</div><div class='del'>-		break;</div><div class='del'>-	}</div><div class='del'>-  </div><div class='del'>-	case GF_FOP_STATFS:</div><div class='del'>-	{</div><div class='del'>-		if (!stub-&gt;args.statfs_cbk.fn)</div><div class='del'>-			STACK_UNWIND (stub-&gt;frame,</div><div class='del'>-				      stub-&gt;args.statfs_cbk.op_ret,</div><div class='del'>-				      stub-&gt;args.statfs_cbk.op_errno,</div><div class='del'>-				      &amp;(stub-&gt;args.statfs_cbk.buf));</div><div class='del'>-		else</div><div class='del'>-			stub-&gt;args.statfs_cbk.fn (stub-&gt;frame,</div><div class='del'>-						  stub-&gt;frame-&gt;cookie,</div><div class='del'>-						  stub-&gt;frame-&gt;this,</div><div class='del'>-						  stub-&gt;args.statfs_cbk.op_ret,</div><div class='del'>-						  stub-&gt;args.statfs_cbk.op_errno,</div><div class='del'>-						  &amp;(stub-&gt;args.statfs_cbk.buf));</div><div class='del'>-	}</div><div class='del'>-	break;</div><div class='del'>-  </div><div class='del'>-	case GF_FOP_FLUSH:</div><div class='del'>-	{</div><div class='del'>-		if (!stub-&gt;args.flush_cbk.fn)</div><div class='del'>-			STACK_UNWIND (stub-&gt;frame,</div><div class='del'>-				      stub-&gt;args.flush_cbk.op_ret,</div><div class='del'>-				      stub-&gt;args.flush_cbk.op_errno);</div><div class='del'>-		else</div><div class='del'>-			stub-&gt;args.flush_cbk.fn (stub-&gt;frame,</div><div class='del'>-						 stub-&gt;frame-&gt;cookie,</div><div class='del'>-						 stub-&gt;frame-&gt;this,</div><div class='del'>-						 stub-&gt;args.flush_cbk.op_ret,</div><div class='del'>-						 stub-&gt;args.flush_cbk.op_errno);</div><div class='del'>-      </div><div class='del'>-		break;</div><div class='del'>-	}</div><div class='del'>-  </div><div class='del'>-	case GF_FOP_FSYNC:</div><div class='del'>-	{</div><div class='del'>-		if (!stub-&gt;args.fsync_cbk.fn)</div><div class='del'>-			STACK_UNWIND (stub-&gt;frame,</div><div class='del'>-				      stub-&gt;args.fsync_cbk.op_ret,</div><div class='del'>-				      stub-&gt;args.fsync_cbk.op_errno,</div><div class='del'>-                                      &amp;stub-&gt;args.fsync_cbk.prebuf,</div><div class='del'>-                                      &amp;stub-&gt;args.fsync_cbk.postbuf);</div><div class='del'>-		else</div><div class='del'>-			stub-&gt;args.fsync_cbk.fn (stub-&gt;frame,</div><div class='del'>-						 stub-&gt;frame-&gt;cookie,</div><div class='del'>-						 stub-&gt;frame-&gt;this,</div><div class='del'>-						 stub-&gt;args.fsync_cbk.op_ret,</div><div class='del'>-						 stub-&gt;args.fsync_cbk.op_errno,</div><div class='del'>-                                                 &amp;stub-&gt;args.fsync_cbk.prebuf,</div><div class='del'>-                                                 &amp;stub-&gt;args.fsync_cbk.postbuf);</div><div class='del'>-		break;</div><div class='del'>-	}</div><div class='del'>-  </div><div class='del'>-	case GF_FOP_SETXATTR:</div><div class='del'>-	{</div><div class='del'>-		if (!stub-&gt;args.setxattr_cbk.fn)</div><div class='del'>-			STACK_UNWIND (stub-&gt;frame,</div><div class='del'>-				      stub-&gt;args.setxattr_cbk.op_ret,</div><div class='del'>-				      stub-&gt;args.setxattr_cbk.op_errno);</div><div class='del'>-</div><div class='del'>-		else</div><div class='del'>-			stub-&gt;args.setxattr_cbk.fn (stub-&gt;frame,</div><div class='del'>-						    stub-&gt;frame-&gt;cookie,</div><div class='del'>-						    stub-&gt;frame-&gt;this,</div><div class='del'>-						    stub-&gt;args.setxattr_cbk.op_ret,</div><div class='del'>-						    stub-&gt;args.setxattr_cbk.op_errno);</div><div class='del'>-</div><div class='del'>-		break;</div><div class='del'>-	}</div><div class='del'>-  </div><div class='del'>-	case GF_FOP_GETXATTR:</div><div class='del'>-	{</div><div class='del'>-		if (!stub-&gt;args.getxattr_cbk.fn)</div><div class='del'>-			STACK_UNWIND (stub-&gt;frame,</div><div class='del'>-				      stub-&gt;args.getxattr_cbk.op_ret,</div><div class='del'>-				      stub-&gt;args.getxattr_cbk.op_errno,</div><div class='del'>-				      stub-&gt;args.getxattr_cbk.dict);</div><div class='del'>-		else</div><div class='del'>-			stub-&gt;args.getxattr_cbk.fn (stub-&gt;frame,</div><div class='del'>-						    stub-&gt;frame-&gt;cookie,</div><div class='del'>-						    stub-&gt;frame-&gt;this,</div><div class='del'>-						    stub-&gt;args.getxattr_cbk.op_ret,</div><div class='del'>-						    stub-&gt;args.getxattr_cbk.op_errno,</div><div class='del'>-						    stub-&gt;args.getxattr_cbk.dict);</div><div class='del'>-		break;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	case GF_FOP_FSETXATTR:</div><div class='del'>-	{</div><div class='del'>-		if (!stub-&gt;args.fsetxattr_cbk.fn)</div><div class='del'>-			STACK_UNWIND (stub-&gt;frame,</div><div class='del'>-				      stub-&gt;args.fsetxattr_cbk.op_ret,</div><div class='del'>-				      stub-&gt;args.fsetxattr_cbk.op_errno);</div><div class='del'>-</div><div class='del'>-		else</div><div class='del'>-			stub-&gt;args.fsetxattr_cbk.fn (stub-&gt;frame,</div><div class='del'>-                                                     stub-&gt;frame-&gt;cookie,</div><div class='del'>-                                                     stub-&gt;frame-&gt;this,</div><div class='del'>-                                                     stub-&gt;args.fsetxattr_cbk.op_ret,</div><div class='del'>-                                                     stub-&gt;args.fsetxattr_cbk.op_errno);</div><div class='del'>-</div><div class='del'>-		break;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	case GF_FOP_FGETXATTR:</div><div class='del'>-	{</div><div class='del'>-		if (!stub-&gt;args.fgetxattr_cbk.fn)</div><div class='del'>-			STACK_UNWIND (stub-&gt;frame,</div><div class='del'>-				      stub-&gt;args.fgetxattr_cbk.op_ret,</div><div class='del'>-				      stub-&gt;args.fgetxattr_cbk.op_errno,</div><div class='del'>-				      stub-&gt;args.fgetxattr_cbk.dict);</div><div class='del'>-		else</div><div class='del'>-			stub-&gt;args.fgetxattr_cbk.fn (stub-&gt;frame,</div><div class='del'>-                                                     stub-&gt;frame-&gt;cookie,</div><div class='del'>-                                                     stub-&gt;frame-&gt;this,</div><div class='del'>-                                                     stub-&gt;args.fgetxattr_cbk.op_ret,</div><div class='del'>-                                                     stub-&gt;args.fgetxattr_cbk.op_errno,</div><div class='del'>-                                                     stub-&gt;args.fgetxattr_cbk.dict);</div><div class='del'>-		break;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	case GF_FOP_REMOVEXATTR:</div><div class='del'>-	{</div><div class='del'>-		if (!stub-&gt;args.removexattr_cbk.fn)</div><div class='del'>-			STACK_UNWIND (stub-&gt;frame,</div><div class='del'>-				      stub-&gt;args.removexattr_cbk.op_ret,</div><div class='del'>-				      stub-&gt;args.removexattr_cbk.op_errno);</div><div class='del'>-		else</div><div class='del'>-			stub-&gt;args.removexattr_cbk.fn (stub-&gt;frame,</div><div class='del'>-						       stub-&gt;frame-&gt;cookie,</div><div class='del'>-						       stub-&gt;frame-&gt;this,</div><div class='del'>-						       stub-&gt;args.removexattr_cbk.op_ret,</div><div class='del'>-						       stub-&gt;args.removexattr_cbk.op_errno);</div><div class='del'>-</div><div class='del'>-		break;</div><div class='del'>-	}</div><div class='del'>-  </div><div class='del'>-	case GF_FOP_OPENDIR:</div><div class='del'>-	{</div><div class='del'>-		if (!stub-&gt;args.opendir_cbk.fn)</div><div class='del'>-			STACK_UNWIND (stub-&gt;frame,</div><div class='del'>-				      stub-&gt;args.opendir_cbk.op_ret,</div><div class='del'>-				      stub-&gt;args.opendir_cbk.op_errno,</div><div class='del'>-				      stub-&gt;args.opendir_cbk.fd);</div><div class='del'>-		else</div><div class='del'>-			stub-&gt;args.opendir_cbk.fn (stub-&gt;frame,</div><div class='del'>-						   stub-&gt;frame-&gt;cookie,</div><div class='del'>-						   stub-&gt;frame-&gt;this,</div><div class='del'>-						   stub-&gt;args.opendir_cbk.op_ret,</div><div class='del'>-						   stub-&gt;args.opendir_cbk.op_errno,</div><div class='del'>-						   stub-&gt;args.opendir_cbk.fd);</div><div class='del'>-		break;</div><div class='del'>-	}</div><div class='del'>-  </div><div class='del'>-	case GF_FOP_FSYNCDIR:</div><div class='del'>-	{</div><div class='del'>-		if (!stub-&gt;args.fsyncdir_cbk.fn)</div><div class='del'>-			STACK_UNWIND (stub-&gt;frame,</div><div class='del'>-				      stub-&gt;args.fsyncdir_cbk.op_ret,</div><div class='del'>-				      stub-&gt;args.fsyncdir_cbk.op_errno);</div><div class='del'>-		else</div><div class='del'>-			stub-&gt;args.fsyncdir_cbk.fn (stub-&gt;frame,</div><div class='del'>-						    stub-&gt;frame-&gt;cookie,</div><div class='del'>-						    stub-&gt;frame-&gt;this,</div><div class='del'>-						    stub-&gt;args.fsyncdir_cbk.op_ret,</div><div class='del'>-						    stub-&gt;args.fsyncdir_cbk.op_errno);</div><div class='del'>-		break;</div><div class='del'>-	}</div><div class='del'>-  </div><div class='del'>-	case GF_FOP_ACCESS:</div><div class='del'>-	{</div><div class='del'>-		if (!stub-&gt;args.access_cbk.fn)</div><div class='del'>-			STACK_UNWIND (stub-&gt;frame,</div><div class='del'>-				      stub-&gt;args.access_cbk.op_ret,</div><div class='del'>-				      stub-&gt;args.access_cbk.op_errno);</div><div class='del'>-		else</div><div class='del'>-			stub-&gt;args.access_cbk.fn (stub-&gt;frame,</div><div class='del'>-						  stub-&gt;frame-&gt;cookie,</div><div class='del'>-						  stub-&gt;frame-&gt;this,</div><div class='del'>-						  stub-&gt;args.access_cbk.op_ret,</div><div class='del'>-						  stub-&gt;args.access_cbk.op_errno);</div><div class='del'>-</div><div class='del'>-		break;</div><div class='del'>-	}</div><div class='del'>-  </div><div class='del'>-	case GF_FOP_FTRUNCATE:</div><div class='del'>-	{</div><div class='del'>-		if (!stub-&gt;args.ftruncate_cbk.fn)</div><div class='del'>-			STACK_UNWIND (stub-&gt;frame,</div><div class='del'>-				      stub-&gt;args.ftruncate_cbk.op_ret,</div><div class='del'>-				      stub-&gt;args.ftruncate_cbk.op_errno,</div><div class='del'>-				      &amp;stub-&gt;args.ftruncate_cbk.prebuf,</div><div class='del'>-				      &amp;stub-&gt;args.ftruncate_cbk.postbuf);</div><div class='del'>-		else</div><div class='del'>-			stub-&gt;args.ftruncate_cbk.fn (stub-&gt;frame,</div><div class='del'>-						     stub-&gt;frame-&gt;cookie,</div><div class='del'>-						     stub-&gt;frame-&gt;this,</div><div class='del'>-						     stub-&gt;args.ftruncate_cbk.op_ret,</div><div class='del'>-						     stub-&gt;args.ftruncate_cbk.op_errno,</div><div class='del'>-						     &amp;stub-&gt;args.ftruncate_cbk.prebuf,</div><div class='del'>-						     &amp;stub-&gt;args.ftruncate_cbk.postbuf);</div><div class='del'>-		break;</div><div class='del'>-	}</div><div class='del'>-  </div><div class='del'>-	case GF_FOP_FSTAT:</div><div class='del'>-	{</div><div class='del'>-		if (!stub-&gt;args.fstat_cbk.fn)</div><div class='del'>-			STACK_UNWIND (stub-&gt;frame,</div><div class='del'>-				      stub-&gt;args.fstat_cbk.op_ret,</div><div class='del'>-				      stub-&gt;args.fstat_cbk.op_errno,</div><div class='del'>-				      &amp;stub-&gt;args.fstat_cbk.buf);</div><div class='del'>-		else</div><div class='del'>-			stub-&gt;args.fstat_cbk.fn (stub-&gt;frame,</div><div class='del'>-						 stub-&gt;frame-&gt;cookie,</div><div class='del'>-						 stub-&gt;frame-&gt;this,</div><div class='del'>-						 stub-&gt;args.fstat_cbk.op_ret,</div><div class='del'>-						 stub-&gt;args.fstat_cbk.op_errno,</div><div class='del'>-						 &amp;stub-&gt;args.fstat_cbk.buf);</div><div class='del'>-      </div><div class='del'>-		break;</div><div class='del'>-	}</div><div class='del'>-  </div><div class='del'>-	case GF_FOP_LK:</div><div class='del'>-	{</div><div class='del'>-		if (!stub-&gt;args.lk_cbk.fn)</div><div class='del'>-			STACK_UNWIND (stub-&gt;frame,</div><div class='del'>-				      stub-&gt;args.lk_cbk.op_ret,</div><div class='del'>-				      stub-&gt;args.lk_cbk.op_errno,</div><div class='del'>-				      &amp;stub-&gt;args.lk_cbk.lock);</div><div class='del'>-		else</div><div class='del'>-			stub-&gt;args.lk_cbk.fn (stub-&gt;frame,</div><div class='del'>-					      stub-&gt;frame-&gt;cookie,</div><div class='del'>-					      stub-&gt;frame-&gt;this,</div><div class='del'>-					      stub-&gt;args.lk_cbk.op_ret,</div><div class='del'>-					      stub-&gt;args.lk_cbk.op_errno,</div><div class='del'>-					      &amp;stub-&gt;args.lk_cbk.lock);</div><div class='del'>-		break;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	case GF_FOP_INODELK:</div><div class='del'>-	{</div><div class='del'>-		if (!stub-&gt;args.inodelk_cbk.fn)</div><div class='del'>-			STACK_UNWIND (stub-&gt;frame,</div><div class='del'>-				      stub-&gt;args.inodelk_cbk.op_ret,</div><div class='del'>-				      stub-&gt;args.inodelk_cbk.op_errno);</div><div class='del'>-</div><div class='del'>-		else</div><div class='del'>-			stub-&gt;args.inodelk_cbk.fn (stub-&gt;frame,</div><div class='del'>-						   stub-&gt;frame-&gt;cookie,</div><div class='del'>-						   stub-&gt;frame-&gt;this,</div><div class='del'>-						   stub-&gt;args.inodelk_cbk.op_ret,</div><div class='del'>-						   stub-&gt;args.inodelk_cbk.op_errno);</div><div class='del'>-		break;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	case GF_FOP_FINODELK:</div><div class='del'>-	{</div><div class='del'>-		if (!stub-&gt;args.finodelk_cbk.fn)</div><div class='del'>-			STACK_UNWIND (stub-&gt;frame,</div><div class='del'>-				      stub-&gt;args.finodelk_cbk.op_ret,</div><div class='del'>-				      stub-&gt;args.finodelk_cbk.op_errno);</div><div class='del'>-</div><div class='del'>-		else</div><div class='del'>-			stub-&gt;args.finodelk_cbk.fn (stub-&gt;frame,</div><div class='del'>-						    stub-&gt;frame-&gt;cookie,</div><div class='del'>-						    stub-&gt;frame-&gt;this,</div><div class='del'>-						    stub-&gt;args.finodelk_cbk.op_ret,</div><div class='del'>-						    stub-&gt;args.finodelk_cbk.op_errno);</div><div class='del'>-		break;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	case GF_FOP_ENTRYLK:</div><div class='del'>-	{</div><div class='del'>-		if (!stub-&gt;args.entrylk_cbk.fn)</div><div class='del'>-			STACK_UNWIND (stub-&gt;frame,</div><div class='del'>-				      stub-&gt;args.entrylk_cbk.op_ret,</div><div class='del'>-				      stub-&gt;args.entrylk_cbk.op_errno);</div><div class='del'>-</div><div class='del'>-		else</div><div class='del'>-			stub-&gt;args.entrylk_cbk.fn (stub-&gt;frame,</div><div class='del'>-						   stub-&gt;frame-&gt;cookie,</div><div class='del'>-						   stub-&gt;frame-&gt;this,</div><div class='del'>-						   stub-&gt;args.entrylk_cbk.op_ret,</div><div class='del'>-						   stub-&gt;args.entrylk_cbk.op_errno);</div><div class='del'>-		break;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	case GF_FOP_FENTRYLK:</div><div class='del'>-	{</div><div class='del'>-		if (!stub-&gt;args.fentrylk_cbk.fn)</div><div class='del'>-			STACK_UNWIND (stub-&gt;frame,</div><div class='del'>-				      stub-&gt;args.fentrylk_cbk.op_ret,</div><div class='del'>-				      stub-&gt;args.fentrylk_cbk.op_errno);</div><div class='del'>-</div><div class='del'>-		else</div><div class='del'>-			stub-&gt;args.fentrylk_cbk.fn (stub-&gt;frame,</div><div class='del'>-						    stub-&gt;frame-&gt;cookie,</div><div class='del'>-						    stub-&gt;frame-&gt;this,</div><div class='del'>-						    stub-&gt;args.fentrylk_cbk.op_ret,</div><div class='del'>-						    stub-&gt;args.fentrylk_cbk.op_errno);</div><div class='del'>-		break;</div><div class='del'>-	}</div><div class='del'>-  </div><div class='del'>-	case GF_FOP_LOOKUP:</div><div class='del'>-	{</div><div class='del'>-		if (!stub-&gt;args.lookup_cbk.fn)</div><div class='del'>-			STACK_UNWIND (stub-&gt;frame,</div><div class='del'>-				      stub-&gt;args.lookup_cbk.op_ret,</div><div class='del'>-				      stub-&gt;args.lookup_cbk.op_errno,</div><div class='del'>-				      stub-&gt;args.lookup_cbk.inode,</div><div class='del'>-				      &amp;stub-&gt;args.lookup_cbk.buf,</div><div class='del'>-                                      stub-&gt;args.lookup_cbk.dict,</div><div class='del'>-                                      &amp;stub-&gt;args.lookup_cbk.postparent);</div><div class='del'>-		else</div><div class='del'>-			stub-&gt;args.lookup_cbk.fn (stub-&gt;frame, </div><div class='del'>-						  stub-&gt;frame-&gt;cookie,</div><div class='del'>-						  stub-&gt;frame-&gt;this,</div><div class='del'>-						  stub-&gt;args.lookup_cbk.op_ret,</div><div class='del'>-						  stub-&gt;args.lookup_cbk.op_errno,</div><div class='del'>-						  stub-&gt;args.lookup_cbk.inode,</div><div class='del'>-                                                  &amp;stub-&gt;args.lookup_cbk.buf,</div><div class='del'>-                                                  stub-&gt;args.lookup_cbk.dict,</div><div class='del'>-                                                  &amp;stub-&gt;args.lookup_cbk.postparent);</div><div class='del'>-		/* FIXME NULL should not be passed */</div><div class='del'>-</div><div class='del'>-		if (stub-&gt;args.lookup_cbk.dict)</div><div class='del'>-			dict_unref (stub-&gt;args.lookup_cbk.dict);</div><div class='del'>-		if (stub-&gt;args.lookup_cbk.inode)</div><div class='del'>-			inode_unref (stub-&gt;args.lookup_cbk.inode);</div><div class='del'>-</div><div class='del'>-		break;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	case GF_FOP_RCHECKSUM:</div><div class='del'>-	{</div><div class='del'>-		if (!stub-&gt;args.rchecksum_cbk.fn)</div><div class='del'>-			STACK_UNWIND (stub-&gt;frame,</div><div class='del'>-				      stub-&gt;args.rchecksum_cbk.op_ret,</div><div class='del'>-				      stub-&gt;args.rchecksum_cbk.op_errno,</div><div class='del'>-				      stub-&gt;args.rchecksum_cbk.weak_checksum,</div><div class='del'>-				      stub-&gt;args.rchecksum_cbk.strong_checksum);</div><div class='del'>-		else</div><div class='del'>-			stub-&gt;args.rchecksum_cbk.fn (stub-&gt;frame, </div><div class='del'>-                                                     stub-&gt;frame-&gt;cookie,</div><div class='del'>-                                                     stub-&gt;frame-&gt;this,</div><div class='del'>-                                                     stub-&gt;args.rchecksum_cbk.op_ret, </div><div class='del'>-                                                     stub-&gt;args.rchecksum_cbk.op_errno,</div><div class='del'>-                                                     stub-&gt;args.rchecksum_cbk.weak_checksum,</div><div class='del'>-                                                     stub-&gt;args.rchecksum_cbk.strong_checksum);</div><div class='del'>-		if (stub-&gt;args.rchecksum_cbk.op_ret &gt;= 0)</div><div class='del'>-		{</div><div class='del'>-			GF_FREE (stub-&gt;args.rchecksum_cbk.strong_checksum);</div><div class='del'>-		}</div><div class='del'>-</div><div class='del'>-		break;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	case GF_FOP_READDIR:</div><div class='del'>-	{</div><div class='del'>-		if (!stub-&gt;args.readdir_cbk.fn) </div><div class='del'>-			STACK_UNWIND (stub-&gt;frame,</div><div class='del'>-				      stub-&gt;args.readdir_cbk.op_ret,</div><div class='del'>-				      stub-&gt;args.readdir_cbk.op_errno,</div><div class='del'>-				      &amp;stub-&gt;args.readdir_cbk.entries);</div><div class='del'>-		else </div><div class='del'>-			stub-&gt;args.readdir_cbk.fn (stub-&gt;frame,</div><div class='del'>-						   stub-&gt;frame-&gt;cookie,</div><div class='del'>-						   stub-&gt;frame-&gt;this,</div><div class='del'>-						   stub-&gt;args.readdir_cbk.op_ret,</div><div class='del'>-						   stub-&gt;args.readdir_cbk.op_errno,</div><div class='del'>-						   &amp;stub-&gt;args.readdir_cbk.entries);</div><div class='del'>-		</div><div class='del'>-		if (stub-&gt;args.readdir_cbk.op_ret &gt; 0) </div><div class='del'>-			gf_dirent_free (&amp;stub-&gt;args.readdir_cbk.entries);</div><div class='del'>-</div><div class='del'>-		break;</div><div class='del'>-	}</div><div class='add'>+args_namelink_store_cbk(default_args_cbk_t *args, int32_t op_ret,</div><div class='add'>+                        int32_t op_errno, struct iatt *prebuf,</div><div class='add'>+                        struct iatt *postbuf, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    args-&gt;op_ret = op_ret;</div><div class='add'>+    args-&gt;op_errno = op_errno;</div><div class='add'>+</div><div class='add'>+    if (prebuf)</div><div class='add'>+        args-&gt;prestat = *prebuf;</div><div class='add'>+    if (postbuf)</div><div class='add'>+        args-&gt;poststat = *postbuf;</div><div class='add'>+    if (xdata)</div><div class='add'>+        args-&gt;xdata = dict_ref(xdata);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+call_stub_t *</div><div class='add'>+fop_namelink_cbk_stub(call_frame_t *frame, fop_namelink_cbk_t fn,</div><div class='add'>+                      int32_t op_ret, int32_t op_errno, struct iatt *prebuf,</div><div class='add'>+                      struct iatt *postbuf, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    call_stub_t *stub = NULL;</div><div class='add'>+</div><div class='add'>+    stub = stub_new(frame, 0, GF_FOP_NAMELINK);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("call-stub", stub, out);</div><div class='add'>+</div><div class='add'>+    stub-&gt;fn_cbk.namelink = fn;</div><div class='add'>+    args_namelink_store_cbk(&amp;stub-&gt;args_cbk, op_ret, op_errno, prebuf, postbuf,</div><div class='add'>+                            xdata);</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return stub;</div><div class='add'>+}</div><div class='ctx'> </div><div class='add'>+void</div><div class='add'>+call_resume_wind(call_stub_t *stub)</div><div class='add'>+{</div><div class='add'>+    GF_VALIDATE_OR_GOTO("call-stub", stub, out);</div><div class='add'>+</div><div class='add'>+    switch (stub-&gt;fop) {</div><div class='add'>+        case GF_FOP_OPEN:</div><div class='add'>+            stub-&gt;fn.open(stub-&gt;frame, stub-&gt;frame-&gt;this, &amp;stub-&gt;args.loc,</div><div class='add'>+                          stub-&gt;args.flags, stub-&gt;args.fd, stub-&gt;args.xdata);</div><div class='add'>+            break;</div><div class='add'>+        case GF_FOP_CREATE:</div><div class='add'>+            stub-&gt;fn.create(stub-&gt;frame, stub-&gt;frame-&gt;this, &amp;stub-&gt;args.loc,</div><div class='add'>+                            stub-&gt;args.flags, stub-&gt;args.mode, stub-&gt;args.umask,</div><div class='add'>+                            stub-&gt;args.fd, stub-&gt;args.xdata);</div><div class='add'>+            break;</div><div class='add'>+        case GF_FOP_STAT:</div><div class='add'>+            stub-&gt;fn.stat(stub-&gt;frame, stub-&gt;frame-&gt;this, &amp;stub-&gt;args.loc,</div><div class='add'>+                          stub-&gt;args.xdata);</div><div class='add'>+            break;</div><div class='add'>+        case GF_FOP_READLINK:</div><div class='add'>+            stub-&gt;fn.readlink(stub-&gt;frame, stub-&gt;frame-&gt;this, &amp;stub-&gt;args.loc,</div><div class='add'>+                              stub-&gt;args.size, stub-&gt;args.xdata);</div><div class='add'>+            break;</div><div class='add'>+        case GF_FOP_MKNOD:</div><div class='add'>+            stub-&gt;fn.mknod(stub-&gt;frame, stub-&gt;frame-&gt;this, &amp;stub-&gt;args.loc,</div><div class='add'>+                           stub-&gt;args.mode, stub-&gt;args.rdev, stub-&gt;args.umask,</div><div class='add'>+                           stub-&gt;args.xdata);</div><div class='add'>+            break;</div><div class='add'>+        case GF_FOP_MKDIR:</div><div class='add'>+            stub-&gt;fn.mkdir(stub-&gt;frame, stub-&gt;frame-&gt;this, &amp;stub-&gt;args.loc,</div><div class='add'>+                           stub-&gt;args.mode, stub-&gt;args.umask, stub-&gt;args.xdata);</div><div class='add'>+            break;</div><div class='add'>+        case GF_FOP_UNLINK:</div><div class='add'>+            stub-&gt;fn.unlink(stub-&gt;frame, stub-&gt;frame-&gt;this, &amp;stub-&gt;args.loc,</div><div class='add'>+                            stub-&gt;args.xflag, stub-&gt;args.xdata);</div><div class='add'>+            break;</div><div class='add'>+        case GF_FOP_RMDIR:</div><div class='add'>+            stub-&gt;fn.rmdir(stub-&gt;frame, stub-&gt;frame-&gt;this, &amp;stub-&gt;args.loc,</div><div class='add'>+                           stub-&gt;args.flags, stub-&gt;args.xdata);</div><div class='add'>+            break;</div><div class='add'>+        case GF_FOP_SYMLINK:</div><div class='add'>+            stub-&gt;fn.symlink(stub-&gt;frame, stub-&gt;frame-&gt;this,</div><div class='add'>+                             stub-&gt;args.linkname, &amp;stub-&gt;args.loc,</div><div class='add'>+                             stub-&gt;args.umask, stub-&gt;args.xdata);</div><div class='add'>+            break;</div><div class='add'>+        case GF_FOP_RENAME:</div><div class='add'>+            stub-&gt;fn.rename(stub-&gt;frame, stub-&gt;frame-&gt;this, &amp;stub-&gt;args.loc,</div><div class='add'>+                            &amp;stub-&gt;args.loc2, stub-&gt;args.xdata);</div><div class='add'>+            break;</div><div class='add'>+        case GF_FOP_LINK:</div><div class='add'>+            stub-&gt;fn.link(stub-&gt;frame, stub-&gt;frame-&gt;this, &amp;stub-&gt;args.loc,</div><div class='add'>+                          &amp;stub-&gt;args.loc2, stub-&gt;args.xdata);</div><div class='add'>+            break;</div><div class='add'>+        case GF_FOP_TRUNCATE:</div><div class='add'>+            stub-&gt;fn.truncate(stub-&gt;frame, stub-&gt;frame-&gt;this, &amp;stub-&gt;args.loc,</div><div class='add'>+                              stub-&gt;args.offset, stub-&gt;args.xdata);</div><div class='add'>+            break;</div><div class='add'>+        case GF_FOP_READ:</div><div class='add'>+            stub-&gt;fn.readv(stub-&gt;frame, stub-&gt;frame-&gt;this, stub-&gt;args.fd,</div><div class='add'>+                           stub-&gt;args.size, stub-&gt;args.offset, stub-&gt;args.flags,</div><div class='add'>+                           stub-&gt;args.xdata);</div><div class='add'>+            break;</div><div class='add'>+        case GF_FOP_WRITE:</div><div class='add'>+            stub-&gt;fn.writev(stub-&gt;frame, stub-&gt;frame-&gt;this, stub-&gt;args.fd,</div><div class='add'>+                            stub-&gt;args.vector, stub-&gt;args.count,</div><div class='add'>+                            stub-&gt;args.offset, stub-&gt;args.flags,</div><div class='add'>+                            stub-&gt;args.iobref, stub-&gt;args.xdata);</div><div class='add'>+            break;</div><div class='add'>+        case GF_FOP_STATFS:</div><div class='add'>+            stub-&gt;fn.statfs(stub-&gt;frame, stub-&gt;frame-&gt;this, &amp;stub-&gt;args.loc,</div><div class='add'>+                            stub-&gt;args.xdata);</div><div class='add'>+            break;</div><div class='add'>+        case GF_FOP_FLUSH:</div><div class='add'>+            stub-&gt;fn.flush(stub-&gt;frame, stub-&gt;frame-&gt;this, stub-&gt;args.fd,</div><div class='add'>+                           stub-&gt;args.xdata);</div><div class='add'>+            break;</div><div class='add'>+        case GF_FOP_FSYNC:</div><div class='add'>+            stub-&gt;fn.fsync(stub-&gt;frame, stub-&gt;frame-&gt;this, stub-&gt;args.fd,</div><div class='add'>+                           stub-&gt;args.datasync, stub-&gt;args.xdata);</div><div class='add'>+            break;</div><div class='add'>+        case GF_FOP_SETXATTR:</div><div class='add'>+            stub-&gt;fn.setxattr(stub-&gt;frame, stub-&gt;frame-&gt;this, &amp;stub-&gt;args.loc,</div><div class='add'>+                              stub-&gt;args.xattr, stub-&gt;args.flags,</div><div class='add'>+                              stub-&gt;args.xdata);</div><div class='add'>+            break;</div><div class='add'>+        case GF_FOP_GETXATTR:</div><div class='add'>+            stub-&gt;fn.getxattr(stub-&gt;frame, stub-&gt;frame-&gt;this, &amp;stub-&gt;args.loc,</div><div class='add'>+                              stub-&gt;args.name, stub-&gt;args.xdata);</div><div class='add'>+            break;</div><div class='add'>+        case GF_FOP_FSETXATTR:</div><div class='add'>+            stub-&gt;fn.fsetxattr(stub-&gt;frame, stub-&gt;frame-&gt;this, stub-&gt;args.fd,</div><div class='add'>+                               stub-&gt;args.xattr, stub-&gt;args.flags,</div><div class='add'>+                               stub-&gt;args.xdata);</div><div class='add'>+            break;</div><div class='add'>+        case GF_FOP_FGETXATTR:</div><div class='add'>+            stub-&gt;fn.fgetxattr(stub-&gt;frame, stub-&gt;frame-&gt;this, stub-&gt;args.fd,</div><div class='add'>+                               stub-&gt;args.name, stub-&gt;args.xdata);</div><div class='add'>+            break;</div><div class='add'>+        case GF_FOP_REMOVEXATTR:</div><div class='add'>+            stub-&gt;fn.removexattr(stub-&gt;frame, stub-&gt;frame-&gt;this,</div><div class='add'>+                                 &amp;stub-&gt;args.loc, stub-&gt;args.name,</div><div class='add'>+                                 stub-&gt;args.xdata);</div><div class='add'>+            break;</div><div class='add'>+        case GF_FOP_FREMOVEXATTR:</div><div class='add'>+            stub-&gt;fn.fremovexattr(stub-&gt;frame, stub-&gt;frame-&gt;this, stub-&gt;args.fd,</div><div class='add'>+                                  stub-&gt;args.name, stub-&gt;args.xdata);</div><div class='add'>+            break;</div><div class='add'>+        case GF_FOP_OPENDIR:</div><div class='add'>+            stub-&gt;fn.opendir(stub-&gt;frame, stub-&gt;frame-&gt;this, &amp;stub-&gt;args.loc,</div><div class='add'>+                             stub-&gt;args.fd, stub-&gt;args.xdata);</div><div class='add'>+            break;</div><div class='add'>+        case GF_FOP_FSYNCDIR:</div><div class='add'>+            stub-&gt;fn.fsyncdir(stub-&gt;frame, stub-&gt;frame-&gt;this, stub-&gt;args.fd,</div><div class='add'>+                              stub-&gt;args.datasync, stub-&gt;args.xdata);</div><div class='add'>+            break;</div><div class='add'>+        case GF_FOP_ACCESS:</div><div class='add'>+            stub-&gt;fn.access(stub-&gt;frame, stub-&gt;frame-&gt;this, &amp;stub-&gt;args.loc,</div><div class='add'>+                            stub-&gt;args.mask, stub-&gt;args.xdata);</div><div class='add'>+            break;</div><div class='add'>+</div><div class='add'>+        case GF_FOP_FTRUNCATE:</div><div class='add'>+            stub-&gt;fn.ftruncate(stub-&gt;frame, stub-&gt;frame-&gt;this, stub-&gt;args.fd,</div><div class='add'>+                               stub-&gt;args.offset, stub-&gt;args.xdata);</div><div class='add'>+            break;</div><div class='add'>+        case GF_FOP_FSTAT:</div><div class='add'>+            stub-&gt;fn.fstat(stub-&gt;frame, stub-&gt;frame-&gt;this, stub-&gt;args.fd,</div><div class='add'>+                           stub-&gt;args.xdata);</div><div class='add'>+            break;</div><div class='add'>+        case GF_FOP_LK:</div><div class='add'>+            stub-&gt;fn.lk(stub-&gt;frame, stub-&gt;frame-&gt;this, stub-&gt;args.fd,</div><div class='add'>+                        stub-&gt;args.cmd, &amp;stub-&gt;args.lock, stub-&gt;args.xdata);</div><div class='add'>+            break;</div><div class='add'>+        case GF_FOP_INODELK:</div><div class='add'>+            stub-&gt;fn.inodelk(stub-&gt;frame, stub-&gt;frame-&gt;this, stub-&gt;args.volume,</div><div class='add'>+                             &amp;stub-&gt;args.loc, stub-&gt;args.cmd, &amp;stub-&gt;args.lock,</div><div class='add'>+                             stub-&gt;args.xdata);</div><div class='add'>+            break;</div><div class='add'>+        case GF_FOP_FINODELK:</div><div class='add'>+            stub-&gt;fn.finodelk(stub-&gt;frame, stub-&gt;frame-&gt;this, stub-&gt;args.volume,</div><div class='add'>+                              stub-&gt;args.fd, stub-&gt;args.cmd, &amp;stub-&gt;args.lock,</div><div class='add'>+                              stub-&gt;args.xdata);</div><div class='add'>+            break;</div><div class='add'>+        case GF_FOP_ENTRYLK:</div><div class='add'>+            stub-&gt;fn.entrylk(stub-&gt;frame, stub-&gt;frame-&gt;this, stub-&gt;args.volume,</div><div class='add'>+                             &amp;stub-&gt;args.loc, stub-&gt;args.name,</div><div class='add'>+                             stub-&gt;args.entrylkcmd, stub-&gt;args.entrylktype,</div><div class='add'>+                             stub-&gt;args.xdata);</div><div class='add'>+            break;</div><div class='add'>+        case GF_FOP_FENTRYLK:</div><div class='add'>+            stub-&gt;fn.fentrylk(stub-&gt;frame, stub-&gt;frame-&gt;this, stub-&gt;args.volume,</div><div class='add'>+                              stub-&gt;args.fd, stub-&gt;args.name,</div><div class='add'>+                              stub-&gt;args.entrylkcmd, stub-&gt;args.entrylktype,</div><div class='add'>+                              stub-&gt;args.xdata);</div><div class='add'>+            break;</div><div class='add'>+        case GF_FOP_LOOKUP:</div><div class='add'>+            stub-&gt;fn.lookup(stub-&gt;frame, stub-&gt;frame-&gt;this, &amp;stub-&gt;args.loc,</div><div class='add'>+                            stub-&gt;args.xdata);</div><div class='add'>+            break;</div><div class='add'>+        case GF_FOP_RCHECKSUM:</div><div class='add'>+            stub-&gt;fn.rchecksum(stub-&gt;frame, stub-&gt;frame-&gt;this, stub-&gt;args.fd,</div><div class='add'>+                               stub-&gt;args.offset, stub-&gt;args.size,</div><div class='add'>+                               stub-&gt;args.xdata);</div><div class='add'>+            break;</div><div class='add'>+        case GF_FOP_READDIR:</div><div class='add'>+            stub-&gt;fn.readdir(stub-&gt;frame, stub-&gt;frame-&gt;this, stub-&gt;args.fd,</div><div class='add'>+                             stub-&gt;args.size, stub-&gt;args.offset,</div><div class='add'>+                             stub-&gt;args.xdata);</div><div class='add'>+            break;</div><div class='ctx'>         case GF_FOP_READDIRP:</div><div class='del'>-	{</div><div class='del'>-		if (!stub-&gt;args.readdirp_cbk.fn)</div><div class='del'>-			STACK_UNWIND (stub-&gt;frame,</div><div class='del'>-				      stub-&gt;args.readdirp_cbk.op_ret,</div><div class='del'>-				      stub-&gt;args.readdirp_cbk.op_errno,</div><div class='del'>-				      &amp;stub-&gt;args.readdirp_cbk.entries);</div><div class='del'>-		else</div><div class='del'>-			stub-&gt;args.readdirp_cbk.fn (stub-&gt;frame,</div><div class='del'>-						    stub-&gt;frame-&gt;cookie,</div><div class='del'>-						    stub-&gt;frame-&gt;this,</div><div class='del'>-						    stub-&gt;args.readdirp_cbk.op_ret,</div><div class='del'>-						    stub-&gt;args.readdirp_cbk.op_errno,</div><div class='del'>-						    &amp;stub-&gt;args.readdirp_cbk.entries);</div><div class='del'>-</div><div class='del'>-		if (stub-&gt;args.readdirp_cbk.op_ret &gt; 0)</div><div class='del'>-			gf_dirent_free (&amp;stub-&gt;args.readdirp_cbk.entries);</div><div class='del'>-</div><div class='del'>-		break;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	case GF_FOP_XATTROP:</div><div class='del'>-	{</div><div class='del'>-		if (!stub-&gt;args.xattrop_cbk.fn)</div><div class='del'>-			STACK_UNWIND (stub-&gt;frame,</div><div class='del'>-				      stub-&gt;args.xattrop_cbk.op_ret,</div><div class='del'>-				      stub-&gt;args.xattrop_cbk.op_errno);</div><div class='del'>-		else</div><div class='del'>-			stub-&gt;args.xattrop_cbk.fn (stub-&gt;frame,</div><div class='del'>-						   stub-&gt;frame-&gt;cookie,</div><div class='del'>-						   stub-&gt;frame-&gt;this,</div><div class='del'>-						   stub-&gt;args.xattrop_cbk.op_ret,</div><div class='del'>-						   stub-&gt;args.xattrop_cbk.op_errno,</div><div class='del'>-						   stub-&gt;args.xattrop_cbk.xattr);</div><div class='del'>-</div><div class='del'>-		if (stub-&gt;args.xattrop_cbk.xattr)</div><div class='del'>-			dict_unref (stub-&gt;args.xattrop_cbk.xattr);</div><div class='del'>-</div><div class='del'>-		break;</div><div class='del'>-	}</div><div class='del'>-	case GF_FOP_FXATTROP:</div><div class='del'>-	{</div><div class='del'>-		if (!stub-&gt;args.fxattrop_cbk.fn)</div><div class='del'>-			STACK_UNWIND (stub-&gt;frame,</div><div class='del'>-				      stub-&gt;args.fxattrop_cbk.op_ret,</div><div class='del'>-				      stub-&gt;args.fxattrop_cbk.op_errno);</div><div class='del'>-		else</div><div class='del'>-			stub-&gt;args.fxattrop_cbk.fn (stub-&gt;frame,</div><div class='del'>-						    stub-&gt;frame-&gt;cookie,</div><div class='del'>-						    stub-&gt;frame-&gt;this,</div><div class='del'>-						    stub-&gt;args.fxattrop_cbk.op_ret,</div><div class='del'>-						    stub-&gt;args.fxattrop_cbk.op_errno,</div><div class='del'>-						    stub-&gt;args.fxattrop_cbk.xattr);</div><div class='del'>-</div><div class='del'>-		if (stub-&gt;args.fxattrop_cbk.xattr)</div><div class='del'>-			dict_unref (stub-&gt;args.fxattrop_cbk.xattr);</div><div class='del'>-</div><div class='del'>-		break;</div><div class='del'>-	}</div><div class='add'>+            stub-&gt;fn.readdirp(stub-&gt;frame, stub-&gt;frame-&gt;this, stub-&gt;args.fd,</div><div class='add'>+                              stub-&gt;args.size, stub-&gt;args.offset,</div><div class='add'>+                              stub-&gt;args.xdata);</div><div class='add'>+            break;</div><div class='add'>+        case GF_FOP_XATTROP:</div><div class='add'>+            stub-&gt;fn.xattrop(stub-&gt;frame, stub-&gt;frame-&gt;this, &amp;stub-&gt;args.loc,</div><div class='add'>+                             stub-&gt;args.optype, stub-&gt;args.xattr,</div><div class='add'>+                             stub-&gt;args.xdata);</div><div class='add'>+            break;</div><div class='add'>+        case GF_FOP_FXATTROP:</div><div class='add'>+            stub-&gt;fn.fxattrop(stub-&gt;frame, stub-&gt;frame-&gt;this, stub-&gt;args.fd,</div><div class='add'>+                              stub-&gt;args.optype, stub-&gt;args.xattr,</div><div class='add'>+                              stub-&gt;args.xdata);</div><div class='add'>+            break;</div><div class='ctx'>         case GF_FOP_SETATTR:</div><div class='del'>-        {</div><div class='del'>-                if (!stub-&gt;args.setattr_cbk.fn)</div><div class='del'>-                        STACK_UNWIND (stub-&gt;frame,</div><div class='del'>-                                      stub-&gt;args.setattr_cbk.op_ret,</div><div class='del'>-                                      stub-&gt;args.setattr_cbk.op_errno,</div><div class='del'>-                                      &amp;stub-&gt;args.setattr_cbk.statpre,</div><div class='del'>-                                      &amp;stub-&gt;args.setattr_cbk.statpost);</div><div class='del'>-                else</div><div class='del'>-                        stub-&gt;args.setattr_cbk.fn (</div><div class='del'>-                                stub-&gt;frame,</div><div class='del'>-                                stub-&gt;frame-&gt;cookie,</div><div class='del'>-                                stub-&gt;frame-&gt;this,</div><div class='del'>-                                stub-&gt;args.setattr_cbk.op_ret,</div><div class='del'>-                                stub-&gt;args.setattr_cbk.op_errno,</div><div class='del'>-                                &amp;stub-&gt;args.setattr_cbk.statpre,</div><div class='del'>-                                &amp;stub-&gt;args.setattr_cbk.statpost);</div><div class='del'>-                break;</div><div class='del'>-        }</div><div class='add'>+            stub-&gt;fn.setattr(stub-&gt;frame, stub-&gt;frame-&gt;this, &amp;stub-&gt;args.loc,</div><div class='add'>+                             &amp;stub-&gt;args.stat, stub-&gt;args.valid,</div><div class='add'>+                             stub-&gt;args.xdata);</div><div class='add'>+            break;</div><div class='ctx'>         case GF_FOP_FSETATTR:</div><div class='del'>-        {</div><div class='del'>-                if (!stub-&gt;args.fsetattr_cbk.fn)</div><div class='del'>-                        STACK_UNWIND (stub-&gt;frame,</div><div class='del'>-                                      stub-&gt;args.fsetattr_cbk.op_ret,</div><div class='del'>-                                      stub-&gt;args.fsetattr_cbk.op_errno,</div><div class='del'>-                                      &amp;stub-&gt;args.fsetattr_cbk.statpre,</div><div class='del'>-                                      &amp;stub-&gt;args.fsetattr_cbk.statpost);</div><div class='del'>-                else</div><div class='del'>-                        stub-&gt;args.fsetattr_cbk.fn (</div><div class='del'>-                                stub-&gt;frame,</div><div class='del'>-                                stub-&gt;frame-&gt;cookie,</div><div class='del'>-                                stub-&gt;frame-&gt;this,</div><div class='del'>-                                stub-&gt;args.fsetattr_cbk.op_ret,</div><div class='del'>-                                stub-&gt;args.fsetattr_cbk.op_errno,</div><div class='del'>-                                &amp;stub-&gt;args.fsetattr_cbk.statpre,</div><div class='del'>-                                &amp;stub-&gt;args.fsetattr_cbk.statpost);</div><div class='del'>-                break;</div><div class='del'>-        }</div><div class='del'>-        default:</div><div class='del'>-	{</div><div class='del'>-		gf_log ("call-stub", GF_LOG_ERROR, "Invalid value of FOP (%d)",</div><div class='del'>-                        stub-&gt;fop);</div><div class='del'>-                break;</div><div class='del'>-	}</div><div class='del'>-	}</div><div class='del'>-out:</div><div class='del'>-	return;</div><div class='del'>-}</div><div class='add'>+            stub-&gt;fn.fsetattr(stub-&gt;frame, stub-&gt;frame-&gt;this, stub-&gt;args.fd,</div><div class='add'>+                              &amp;stub-&gt;args.stat, stub-&gt;args.valid,</div><div class='add'>+                              stub-&gt;args.xdata);</div><div class='add'>+            break;</div><div class='add'>+        case GF_FOP_FALLOCATE:</div><div class='add'>+            stub-&gt;fn.fallocate(stub-&gt;frame, stub-&gt;frame-&gt;this, stub-&gt;args.fd,</div><div class='add'>+                               stub-&gt;args.flags, stub-&gt;args.offset,</div><div class='add'>+                               stub-&gt;args.size, stub-&gt;args.xdata);</div><div class='add'>+            break;</div><div class='add'>+        case GF_FOP_DISCARD:</div><div class='add'>+            stub-&gt;fn.discard(stub-&gt;frame, stub-&gt;frame-&gt;this, stub-&gt;args.fd,</div><div class='add'>+                             stub-&gt;args.offset, stub-&gt;args.size,</div><div class='add'>+                             stub-&gt;args.xdata);</div><div class='add'>+            break;</div><div class='add'>+        case GF_FOP_ZEROFILL:</div><div class='add'>+            stub-&gt;fn.zerofill(stub-&gt;frame, stub-&gt;frame-&gt;this, stub-&gt;args.fd,</div><div class='add'>+                              stub-&gt;args.offset, stub-&gt;args.size,</div><div class='add'>+                              stub-&gt;args.xdata);</div><div class='add'>+            break;</div><div class='add'>+        case GF_FOP_IPC:</div><div class='add'>+            stub-&gt;fn.ipc(stub-&gt;frame, stub-&gt;frame-&gt;this, stub-&gt;args.cmd,</div><div class='add'>+                         stub-&gt;args.xdata);</div><div class='add'>+            break;</div><div class='add'>+        case GF_FOP_SEEK:</div><div class='add'>+            stub-&gt;fn.seek(stub-&gt;frame, stub-&gt;frame-&gt;this, stub-&gt;args.fd,</div><div class='add'>+                          stub-&gt;args.offset, stub-&gt;args.what, stub-&gt;args.xdata);</div><div class='add'>+            break;</div><div class='add'>+        case GF_FOP_LEASE:</div><div class='add'>+            stub-&gt;fn.lease(stub-&gt;frame, stub-&gt;frame-&gt;this, &amp;stub-&gt;args.loc,</div><div class='add'>+                           &amp;stub-&gt;args.lease, stub-&gt;args.xdata);</div><div class='add'>+            break;</div><div class='add'>+</div><div class='add'>+        case GF_FOP_GETACTIVELK:</div><div class='add'>+            stub-&gt;fn.getactivelk(stub-&gt;frame, stub-&gt;frame-&gt;this,</div><div class='add'>+                                 &amp;stub-&gt;args.loc, stub-&gt;args.xdata);</div><div class='add'>+            break;</div><div class='add'>+</div><div class='add'>+        case GF_FOP_SETACTIVELK:</div><div class='add'>+            stub-&gt;fn.setactivelk(stub-&gt;frame, stub-&gt;frame-&gt;this,</div><div class='add'>+                                 &amp;stub-&gt;args.loc, &amp;stub-&gt;args.locklist,</div><div class='add'>+                                 stub-&gt;args.xdata);</div><div class='add'>+            break;</div><div class='add'>+</div><div class='add'>+        case GF_FOP_PUT:</div><div class='add'>+            stub-&gt;fn.put(stub-&gt;frame, stub-&gt;frame-&gt;this, &amp;stub-&gt;args.loc,</div><div class='add'>+                         stub-&gt;args.mode, stub-&gt;args.umask, stub-&gt;args.flags,</div><div class='add'>+                         stub-&gt;args.vector, stub-&gt;args.count, stub-&gt;args.offset,</div><div class='add'>+                         stub-&gt;args.iobref, stub-&gt;args.xattr, stub-&gt;args.xdata);</div><div class='add'>+            break;</div><div class='add'>+</div><div class='add'>+        case GF_FOP_COPY_FILE_RANGE:</div><div class='add'>+            stub-&gt;fn.copy_file_range(</div><div class='add'>+                stub-&gt;frame, stub-&gt;frame-&gt;this, stub-&gt;args.fd,</div><div class='add'>+                stub-&gt;args.off_in, stub-&gt;args.fd_dst, stub-&gt;args.off_out,</div><div class='add'>+                stub-&gt;args.size, stub-&gt;args.flags, stub-&gt;args.xdata);</div><div class='add'>+            break;</div><div class='ctx'> </div><div class='add'>+        default:</div><div class='add'>+            gf_msg_callingfn("call-stub", GF_LOG_ERROR, EINVAL,</div><div class='add'>+                             LG_MSG_INVALID_ENTRY,</div><div class='add'>+                             "Invalid value of FOP"</div><div class='add'>+                             " (%d)",</div><div class='add'>+                             stub-&gt;fop);</div><div class='add'>+            break;</div><div class='add'>+    }</div><div class='add'>+out:</div><div class='add'>+    return;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#define STUB_UNWIND(stb, fop, args...)                                         \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        if (stb-&gt;fn_cbk.fop)                                                   \</div><div class='add'>+            stb-&gt;fn_cbk.fop(stb-&gt;frame, stb-&gt;frame-&gt;cookie, stb-&gt;frame-&gt;this,  \</div><div class='add'>+                            stb-&gt;args_cbk.op_ret, stb-&gt;args_cbk.op_errno,      \</div><div class='add'>+                            args);                                             \</div><div class='add'>+        else                                                                   \</div><div class='add'>+            STACK_UNWIND_STRICT(fop, stb-&gt;frame, stb-&gt;args_cbk.op_ret,         \</div><div class='add'>+                                stb-&gt;args_cbk.op_errno, args);                 \</div><div class='add'>+    } while (0)</div><div class='ctx'> </div><div class='ctx'> static void</div><div class='del'>-call_stub_destroy_wind (call_stub_t *stub)</div><div class='del'>-{</div><div class='del'>-	switch (stub-&gt;fop) {</div><div class='del'>-	case GF_FOP_OPEN:</div><div class='del'>-	{</div><div class='del'>-		loc_wipe (&amp;stub-&gt;args.open.loc);</div><div class='del'>-		if (stub-&gt;args.open.fd)</div><div class='del'>-			fd_unref (stub-&gt;args.open.fd);</div><div class='del'>-		break;</div><div class='del'>-	}</div><div class='del'>-	case GF_FOP_CREATE:</div><div class='del'>-	{</div><div class='del'>-		loc_wipe (&amp;stub-&gt;args.create.loc);</div><div class='del'>-		if (stub-&gt;args.create.fd)</div><div class='del'>-			fd_unref (stub-&gt;args.create.fd);</div><div class='del'>-                if (stub-&gt;args.create.params)</div><div class='del'>-                        dict_unref (stub-&gt;args.create.params);</div><div class='del'>-		break;</div><div class='del'>-	}</div><div class='del'>-	case GF_FOP_STAT:</div><div class='del'>-	{</div><div class='del'>-		loc_wipe (&amp;stub-&gt;args.stat.loc);</div><div class='del'>-		break;</div><div class='del'>-	}</div><div class='del'>-	case GF_FOP_READLINK:</div><div class='del'>-	{</div><div class='del'>-		loc_wipe (&amp;stub-&gt;args.readlink.loc);</div><div class='del'>-		break;</div><div class='del'>-	}</div><div class='del'>-  </div><div class='del'>-	case GF_FOP_MKNOD:</div><div class='del'>-	{</div><div class='del'>-		loc_wipe (&amp;stub-&gt;args.mknod.loc);</div><div class='del'>-                if (stub-&gt;args.mknod.params)</div><div class='del'>-                        dict_unref (stub-&gt;args.mknod.params);</div><div class='del'>-	}</div><div class='del'>-	break;</div><div class='del'>-  </div><div class='del'>-	case GF_FOP_MKDIR:</div><div class='del'>-	{</div><div class='del'>-		loc_wipe (&amp;stub-&gt;args.mkdir.loc);</div><div class='del'>-                if (stub-&gt;args.mkdir.params)</div><div class='del'>-                        dict_unref (stub-&gt;args.mkdir.params);</div><div class='del'>-	}</div><div class='del'>-	break;</div><div class='del'>-  </div><div class='del'>-	case GF_FOP_UNLINK:</div><div class='del'>-	{</div><div class='del'>-		loc_wipe (&amp;stub-&gt;args.unlink.loc);</div><div class='del'>-	}</div><div class='del'>-	break;</div><div class='del'>-</div><div class='del'>-	case GF_FOP_RMDIR:</div><div class='del'>-	{</div><div class='del'>-		loc_wipe (&amp;stub-&gt;args.rmdir.loc);</div><div class='del'>-	}</div><div class='del'>-	break;</div><div class='del'>-      </div><div class='del'>-	case GF_FOP_SYMLINK:</div><div class='del'>-	{</div><div class='del'>-		GF_FREE ((char *)stub-&gt;args.symlink.linkname);</div><div class='del'>-		loc_wipe (&amp;stub-&gt;args.symlink.loc);</div><div class='del'>-                if (stub-&gt;args.symlink.params)</div><div class='del'>-                        dict_unref (stub-&gt;args.symlink.params);</div><div class='del'>-	}</div><div class='del'>-	break;</div><div class='del'>-  </div><div class='del'>-	case GF_FOP_RENAME:</div><div class='del'>-	{</div><div class='del'>-		loc_wipe (&amp;stub-&gt;args.rename.old);</div><div class='del'>-		loc_wipe (&amp;stub-&gt;args.rename.new);</div><div class='del'>-	}</div><div class='del'>-	break;</div><div class='del'>-</div><div class='del'>-	case GF_FOP_LINK:</div><div class='del'>-	{</div><div class='del'>-		loc_wipe (&amp;stub-&gt;args.link.oldloc);</div><div class='del'>-		loc_wipe (&amp;stub-&gt;args.link.newloc);</div><div class='del'>-	}</div><div class='del'>-	break;</div><div class='del'>-  </div><div class='del'>-	case GF_FOP_TRUNCATE:</div><div class='del'>-	{</div><div class='del'>-		loc_wipe (&amp;stub-&gt;args.truncate.loc);</div><div class='del'>-		break;</div><div class='del'>-	}</div><div class='del'>-      </div><div class='del'>-	case GF_FOP_READ:</div><div class='del'>-	{</div><div class='del'>-		if (stub-&gt;args.readv.fd)</div><div class='del'>-			fd_unref (stub-&gt;args.readv.fd);</div><div class='del'>-		break;</div><div class='del'>-	}</div><div class='del'>-  </div><div class='del'>-	case GF_FOP_WRITE:</div><div class='del'>-	{</div><div class='del'>-		struct iobref *iobref = stub-&gt;args.writev.iobref;</div><div class='del'>-		if (stub-&gt;args.writev.fd)</div><div class='del'>-			fd_unref (stub-&gt;args.writev.fd);</div><div class='del'>-		GF_FREE (stub-&gt;args.writev.vector);</div><div class='del'>-		if (iobref)</div><div class='del'>-			iobref_unref (iobref);</div><div class='del'>-		break;</div><div class='del'>-	}</div><div class='del'>-  </div><div class='del'>-	case GF_FOP_STATFS:</div><div class='del'>-	{</div><div class='del'>-		loc_wipe (&amp;stub-&gt;args.statfs.loc);</div><div class='del'>-		break;</div><div class='del'>-	}</div><div class='del'>-	case GF_FOP_FLUSH:</div><div class='del'>-	{</div><div class='del'>-		if (stub-&gt;args.flush.fd)</div><div class='del'>-			fd_unref (stub-&gt;args.flush.fd);      </div><div class='del'>-		break;</div><div class='del'>-	}</div><div class='del'>-  </div><div class='del'>-	case GF_FOP_FSYNC:</div><div class='del'>-	{</div><div class='del'>-		if (stub-&gt;args.fsync.fd)</div><div class='del'>-			fd_unref (stub-&gt;args.fsync.fd);</div><div class='del'>-		break;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	case GF_FOP_SETXATTR:</div><div class='del'>-	{</div><div class='del'>-		loc_wipe (&amp;stub-&gt;args.setxattr.loc);</div><div class='del'>-		if (stub-&gt;args.setxattr.dict)</div><div class='del'>-			dict_unref (stub-&gt;args.setxattr.dict);</div><div class='del'>-		break;</div><div class='del'>-	}</div><div class='del'>-  </div><div class='del'>-	case GF_FOP_GETXATTR:</div><div class='del'>-	{</div><div class='del'>-		if (stub-&gt;args.getxattr.name)</div><div class='del'>-			GF_FREE ((char *)stub-&gt;args.getxattr.name);</div><div class='del'>-		loc_wipe (&amp;stub-&gt;args.getxattr.loc);</div><div class='del'>-		break;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	case GF_FOP_FSETXATTR:</div><div class='del'>-	{</div><div class='del'>-		fd_unref (stub-&gt;args.fsetxattr.fd);</div><div class='del'>-		if (stub-&gt;args.fsetxattr.dict)</div><div class='del'>-			dict_unref (stub-&gt;args.fsetxattr.dict);</div><div class='del'>-		break;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	case GF_FOP_FGETXATTR:</div><div class='del'>-	{</div><div class='del'>-		if (stub-&gt;args.fgetxattr.name)</div><div class='del'>-			GF_FREE ((char *)stub-&gt;args.fgetxattr.name);</div><div class='del'>-		fd_unref (stub-&gt;args.fgetxattr.fd);</div><div class='del'>-		break;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	case GF_FOP_REMOVEXATTR:</div><div class='del'>-	{</div><div class='del'>-		loc_wipe (&amp;stub-&gt;args.removexattr.loc);</div><div class='del'>-		GF_FREE ((char *)stub-&gt;args.removexattr.name);</div><div class='del'>-		break;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	case GF_FOP_OPENDIR:</div><div class='del'>-	{</div><div class='del'>-		loc_wipe (&amp;stub-&gt;args.opendir.loc);</div><div class='del'>-		if (stub-&gt;args.opendir.fd)</div><div class='del'>-			fd_unref (stub-&gt;args.opendir.fd);</div><div class='del'>-		break;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	case GF_FOP_FSYNCDIR:</div><div class='del'>-	{</div><div class='del'>-		if (stub-&gt;args.fsyncdir.fd)</div><div class='del'>-			fd_unref (stub-&gt;args.fsyncdir.fd);</div><div class='del'>-		break;</div><div class='del'>-	}</div><div class='del'>-  </div><div class='del'>-	case GF_FOP_ACCESS:</div><div class='del'>-	{</div><div class='del'>-		loc_wipe (&amp;stub-&gt;args.access.loc);</div><div class='del'>-		break;</div><div class='del'>-	}</div><div class='del'>-  </div><div class='del'>-	case GF_FOP_FTRUNCATE:</div><div class='del'>-	{</div><div class='del'>-		if (stub-&gt;args.ftruncate.fd)</div><div class='del'>-			fd_unref (stub-&gt;args.ftruncate.fd);</div><div class='del'>-		break;</div><div class='del'>-	}</div><div class='del'>-  </div><div class='del'>-	case GF_FOP_FSTAT:</div><div class='del'>-	{</div><div class='del'>-		if (stub-&gt;args.fstat.fd)</div><div class='del'>-			fd_unref (stub-&gt;args.fstat.fd);</div><div class='del'>-		break;</div><div class='del'>-	}</div><div class='del'>-  </div><div class='del'>-	case GF_FOP_LK:</div><div class='del'>-	{</div><div class='del'>-		if (stub-&gt;args.lk.fd)</div><div class='del'>-			fd_unref (stub-&gt;args.lk.fd);</div><div class='del'>-		break;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	case GF_FOP_INODELK:</div><div class='del'>-	{</div><div class='del'>-                if (stub-&gt;args.inodelk.volume)</div><div class='del'>-                        GF_FREE ((char *)stub-&gt;args.inodelk.volume);</div><div class='del'>-</div><div class='del'>-		loc_wipe (&amp;stub-&gt;args.inodelk.loc);</div><div class='del'>-		break;</div><div class='del'>-	}</div><div class='del'>-	case GF_FOP_FINODELK:</div><div class='del'>-	{</div><div class='del'>-                if (stub-&gt;args.finodelk.volume)</div><div class='del'>-                        GF_FREE ((char *)stub-&gt;args.finodelk.volume);</div><div class='del'>-</div><div class='del'>-		if (stub-&gt;args.finodelk.fd)</div><div class='del'>-			fd_unref (stub-&gt;args.finodelk.fd);</div><div class='del'>-		break;</div><div class='del'>-	}</div><div class='del'>-	case GF_FOP_ENTRYLK:</div><div class='del'>-	{</div><div class='del'>-                if (stub-&gt;args.entrylk.volume)</div><div class='del'>-                        GF_FREE ((char *)stub-&gt;args.entrylk.volume);</div><div class='del'>-</div><div class='del'>-		if (stub-&gt;args.entrylk.name)</div><div class='del'>-			GF_FREE ((char *)stub-&gt;args.entrylk.name);</div><div class='del'>-		loc_wipe (&amp;stub-&gt;args.entrylk.loc);</div><div class='del'>-		break;</div><div class='del'>-	}</div><div class='del'>-	case GF_FOP_FENTRYLK:</div><div class='del'>-	{</div><div class='del'>-                if (stub-&gt;args.fentrylk.volume)</div><div class='del'>-                        GF_FREE ((char *)stub-&gt;args.fentrylk.volume);</div><div class='del'>-</div><div class='del'>-		if (stub-&gt;args.fentrylk.name)</div><div class='del'>-			GF_FREE ((char *)stub-&gt;args.fentrylk.name);</div><div class='del'>-</div><div class='del'>- 		if (stub-&gt;args.fentrylk.fd)</div><div class='del'>-			fd_unref (stub-&gt;args.fentrylk.fd);</div><div class='del'>-		break;</div><div class='del'>-	}</div><div class='del'>-  </div><div class='del'>-	case GF_FOP_LOOKUP:</div><div class='del'>-	{</div><div class='del'>-		loc_wipe (&amp;stub-&gt;args.lookup.loc);</div><div class='del'>-		if (stub-&gt;args.lookup.xattr_req)</div><div class='del'>-			dict_unref (stub-&gt;args.lookup.xattr_req);</div><div class='del'>-		break;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	case GF_FOP_RCHECKSUM:</div><div class='del'>-	{</div><div class='del'>-                if (stub-&gt;args.rchecksum.fd)</div><div class='del'>-                        fd_unref (stub-&gt;args.rchecksum.fd);</div><div class='del'>-		break;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	case GF_FOP_READDIR:</div><div class='del'>-	{</div><div class='del'>-		if (stub-&gt;args.readdir.fd)</div><div class='del'>-			fd_unref (stub-&gt;args.readdir.fd);</div><div class='del'>-		break;</div><div class='del'>-	}</div><div class='del'>-</div><div class='add'>+call_resume_unwind(call_stub_t *stub)</div><div class='add'>+{</div><div class='add'>+    GF_VALIDATE_OR_GOTO("call-stub", stub, out);</div><div class='add'>+</div><div class='add'>+    switch (stub-&gt;fop) {</div><div class='add'>+        case GF_FOP_OPEN:</div><div class='add'>+            STUB_UNWIND(stub, open, stub-&gt;args_cbk.fd, stub-&gt;args_cbk.xdata);</div><div class='add'>+            break;</div><div class='add'>+        case GF_FOP_CREATE:</div><div class='add'>+            STUB_UNWIND(stub, create, stub-&gt;args_cbk.fd, stub-&gt;args_cbk.inode,</div><div class='add'>+                        &amp;stub-&gt;args_cbk.stat, &amp;stub-&gt;args_cbk.preparent,</div><div class='add'>+                        &amp;stub-&gt;args_cbk.postparent, stub-&gt;args_cbk.xdata);</div><div class='add'>+            break;</div><div class='add'>+        case GF_FOP_STAT:</div><div class='add'>+            STUB_UNWIND(stub, stat, &amp;stub-&gt;args_cbk.stat, stub-&gt;args_cbk.xdata);</div><div class='add'>+            break;</div><div class='add'>+        case GF_FOP_READLINK:</div><div class='add'>+            STUB_UNWIND(stub, readlink, stub-&gt;args_cbk.buf,</div><div class='add'>+                        &amp;stub-&gt;args_cbk.stat, stub-&gt;args.xdata);</div><div class='add'>+            break;</div><div class='add'>+        case GF_FOP_MKNOD:</div><div class='add'>+            STUB_UNWIND(stub, mknod, stub-&gt;args_cbk.inode, &amp;stub-&gt;args_cbk.stat,</div><div class='add'>+                        &amp;stub-&gt;args_cbk.preparent, &amp;stub-&gt;args_cbk.postparent,</div><div class='add'>+                        stub-&gt;args_cbk.xdata);</div><div class='add'>+            break;</div><div class='add'>+        case GF_FOP_MKDIR:</div><div class='add'>+            STUB_UNWIND(stub, mkdir, stub-&gt;args_cbk.inode, &amp;stub-&gt;args_cbk.stat,</div><div class='add'>+                        &amp;stub-&gt;args_cbk.preparent, &amp;stub-&gt;args_cbk.postparent,</div><div class='add'>+                        stub-&gt;args_cbk.xdata);</div><div class='add'>+            break;</div><div class='add'>+        case GF_FOP_UNLINK:</div><div class='add'>+            STUB_UNWIND(stub, unlink, &amp;stub-&gt;args_cbk.preparent,</div><div class='add'>+                        &amp;stub-&gt;args_cbk.postparent, stub-&gt;args_cbk.xdata);</div><div class='add'>+            break;</div><div class='add'>+        case GF_FOP_RMDIR:</div><div class='add'>+            STUB_UNWIND(stub, rmdir, &amp;stub-&gt;args_cbk.preparent,</div><div class='add'>+                        &amp;stub-&gt;args_cbk.postparent, stub-&gt;args_cbk.xdata);</div><div class='add'>+            break;</div><div class='add'>+        case GF_FOP_SYMLINK:</div><div class='add'>+            STUB_UNWIND(stub, symlink, stub-&gt;args_cbk.inode,</div><div class='add'>+                        &amp;stub-&gt;args_cbk.stat, &amp;stub-&gt;args_cbk.preparent,</div><div class='add'>+                        &amp;stub-&gt;args_cbk.postparent, stub-&gt;args_cbk.xdata);</div><div class='add'>+            break;</div><div class='add'>+        case GF_FOP_RENAME:</div><div class='add'>+            STUB_UNWIND(stub, rename, &amp;stub-&gt;args_cbk.stat,</div><div class='add'>+                        &amp;stub-&gt;args_cbk.preparent, &amp;stub-&gt;args_cbk.postparent,</div><div class='add'>+                        &amp;stub-&gt;args_cbk.preparent2, &amp;stub-&gt;args_cbk.postparent2,</div><div class='add'>+                        stub-&gt;args_cbk.xdata);</div><div class='add'>+            break;</div><div class='add'>+        case GF_FOP_LINK:</div><div class='add'>+            STUB_UNWIND(stub, link, stub-&gt;args_cbk.inode, &amp;stub-&gt;args_cbk.stat,</div><div class='add'>+                        &amp;stub-&gt;args_cbk.preparent, &amp;stub-&gt;args_cbk.postparent,</div><div class='add'>+                        stub-&gt;args_cbk.xdata);</div><div class='add'>+            break;</div><div class='add'>+        case GF_FOP_TRUNCATE:</div><div class='add'>+            STUB_UNWIND(stub, truncate, &amp;stub-&gt;args_cbk.prestat,</div><div class='add'>+                        &amp;stub-&gt;args_cbk.poststat, stub-&gt;args_cbk.xdata);</div><div class='add'>+            break;</div><div class='add'>+        case GF_FOP_READ:</div><div class='add'>+            STUB_UNWIND(stub, readv, stub-&gt;args_cbk.vector,</div><div class='add'>+                        stub-&gt;args_cbk.count, &amp;stub-&gt;args_cbk.stat,</div><div class='add'>+                        stub-&gt;args_cbk.iobref, stub-&gt;args_cbk.xdata);</div><div class='add'>+            break;</div><div class='add'>+        case GF_FOP_WRITE:</div><div class='add'>+            STUB_UNWIND(stub, writev, &amp;stub-&gt;args_cbk.prestat,</div><div class='add'>+                        &amp;stub-&gt;args_cbk.poststat, stub-&gt;args_cbk.xdata);</div><div class='add'>+            break;</div><div class='add'>+        case GF_FOP_STATFS:</div><div class='add'>+            STUB_UNWIND(stub, statfs, &amp;stub-&gt;args_cbk.statvfs,</div><div class='add'>+                        stub-&gt;args_cbk.xdata);</div><div class='add'>+            break;</div><div class='add'>+        case GF_FOP_FLUSH:</div><div class='add'>+            STUB_UNWIND(stub, flush, stub-&gt;args_cbk.xdata);</div><div class='add'>+            break;</div><div class='add'>+        case GF_FOP_FSYNC:</div><div class='add'>+            STUB_UNWIND(stub, fsync, &amp;stub-&gt;args_cbk.prestat,</div><div class='add'>+                        &amp;stub-&gt;args_cbk.poststat, stub-&gt;args_cbk.xdata);</div><div class='add'>+            break;</div><div class='add'>+        case GF_FOP_SETXATTR:</div><div class='add'>+            STUB_UNWIND(stub, setxattr, stub-&gt;args_cbk.xdata);</div><div class='add'>+            break;</div><div class='add'>+        case GF_FOP_GETXATTR:</div><div class='add'>+            STUB_UNWIND(stub, getxattr, stub-&gt;args_cbk.xattr,</div><div class='add'>+                        stub-&gt;args_cbk.xdata);</div><div class='add'>+            break;</div><div class='add'>+        case GF_FOP_FSETXATTR:</div><div class='add'>+            STUB_UNWIND(stub, fsetxattr, stub-&gt;args_cbk.xdata);</div><div class='add'>+            break;</div><div class='add'>+        case GF_FOP_FGETXATTR:</div><div class='add'>+            STUB_UNWIND(stub, fgetxattr, stub-&gt;args_cbk.xattr,</div><div class='add'>+                        stub-&gt;args_cbk.xdata);</div><div class='add'>+            break;</div><div class='add'>+        case GF_FOP_REMOVEXATTR:</div><div class='add'>+            STUB_UNWIND(stub, removexattr, stub-&gt;args_cbk.xdata);</div><div class='add'>+            break;</div><div class='add'>+        case GF_FOP_FREMOVEXATTR:</div><div class='add'>+            STUB_UNWIND(stub, fremovexattr, stub-&gt;args_cbk.xdata);</div><div class='add'>+            break;</div><div class='add'>+        case GF_FOP_OPENDIR:</div><div class='add'>+            STUB_UNWIND(stub, opendir, stub-&gt;args_cbk.fd, stub-&gt;args_cbk.xdata);</div><div class='add'>+            break;</div><div class='add'>+        case GF_FOP_FSYNCDIR:</div><div class='add'>+            STUB_UNWIND(stub, fsyncdir, stub-&gt;args_cbk.xdata);</div><div class='add'>+            break;</div><div class='add'>+        case GF_FOP_ACCESS:</div><div class='add'>+            STUB_UNWIND(stub, access, stub-&gt;args_cbk.xdata);</div><div class='add'>+            break;</div><div class='add'>+        case GF_FOP_FTRUNCATE:</div><div class='add'>+            STUB_UNWIND(stub, ftruncate, &amp;stub-&gt;args_cbk.prestat,</div><div class='add'>+                        &amp;stub-&gt;args_cbk.poststat, stub-&gt;args_cbk.xdata);</div><div class='add'>+            break;</div><div class='add'>+        case GF_FOP_FSTAT:</div><div class='add'>+            STUB_UNWIND(stub, fstat, &amp;stub-&gt;args_cbk.stat,</div><div class='add'>+                        stub-&gt;args_cbk.xdata);</div><div class='add'>+            break;</div><div class='add'>+        case GF_FOP_LK:</div><div class='add'>+            STUB_UNWIND(stub, lk, &amp;stub-&gt;args_cbk.lock, stub-&gt;args_cbk.xdata);</div><div class='add'>+            break;</div><div class='add'>+        case GF_FOP_INODELK:</div><div class='add'>+            STUB_UNWIND(stub, inodelk, stub-&gt;args_cbk.xdata);</div><div class='add'>+            break;</div><div class='add'>+        case GF_FOP_FINODELK:</div><div class='add'>+            STUB_UNWIND(stub, finodelk, stub-&gt;args_cbk.xdata);</div><div class='add'>+            break;</div><div class='add'>+        case GF_FOP_ENTRYLK:</div><div class='add'>+            STUB_UNWIND(stub, entrylk, stub-&gt;args_cbk.xdata);</div><div class='add'>+            break;</div><div class='add'>+        case GF_FOP_FENTRYLK:</div><div class='add'>+            STUB_UNWIND(stub, fentrylk, stub-&gt;args_cbk.xdata);</div><div class='add'>+            break;</div><div class='add'>+        case GF_FOP_LOOKUP:</div><div class='add'>+            STUB_UNWIND(stub, lookup, stub-&gt;args_cbk.inode,</div><div class='add'>+                        &amp;stub-&gt;args_cbk.stat, stub-&gt;args_cbk.xdata,</div><div class='add'>+                        &amp;stub-&gt;args_cbk.postparent);</div><div class='add'>+            break;</div><div class='add'>+        case GF_FOP_RCHECKSUM:</div><div class='add'>+            STUB_UNWIND(stub, rchecksum, stub-&gt;args_cbk.weak_checksum,</div><div class='add'>+                        stub-&gt;args_cbk.strong_checksum, stub-&gt;args_cbk.xdata);</div><div class='add'>+            break;</div><div class='add'>+        case GF_FOP_READDIR:</div><div class='add'>+            STUB_UNWIND(stub, readdir, &amp;stub-&gt;args_cbk.entries,</div><div class='add'>+                        stub-&gt;args_cbk.xdata);</div><div class='add'>+            break;</div><div class='ctx'>         case GF_FOP_READDIRP:</div><div class='del'>-	{</div><div class='del'>-		if (stub-&gt;args.readdirp.fd)</div><div class='del'>-			fd_unref (stub-&gt;args.readdirp.fd);</div><div class='del'>-		break;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	case GF_FOP_XATTROP:</div><div class='del'>-	{</div><div class='del'>-		loc_wipe (&amp;stub-&gt;args.xattrop.loc);</div><div class='del'>-		dict_unref (stub-&gt;args.xattrop.xattr);</div><div class='del'>-		break;</div><div class='del'>-	}</div><div class='del'>-	case GF_FOP_FXATTROP:</div><div class='del'>-	{</div><div class='del'>-		if (stub-&gt;args.fxattrop.fd)</div><div class='del'>-			fd_unref (stub-&gt;args.fxattrop.fd);</div><div class='del'>-		dict_unref (stub-&gt;args.fxattrop.xattr);</div><div class='del'>-		break;</div><div class='del'>-	}</div><div class='add'>+            STUB_UNWIND(stub, readdir, &amp;stub-&gt;args_cbk.entries,</div><div class='add'>+                        stub-&gt;args_cbk.xdata);</div><div class='add'>+            break;</div><div class='add'>+        case GF_FOP_XATTROP:</div><div class='add'>+            STUB_UNWIND(stub, xattrop, stub-&gt;args_cbk.xattr,</div><div class='add'>+                        stub-&gt;args_cbk.xdata);</div><div class='add'>+            break;</div><div class='add'>+        case GF_FOP_FXATTROP:</div><div class='add'>+            STUB_UNWIND(stub, fxattrop, stub-&gt;args_cbk.xattr,</div><div class='add'>+                        stub-&gt;args_cbk.xdata);</div><div class='add'>+            break;</div><div class='ctx'>         case GF_FOP_SETATTR:</div><div class='del'>-        {</div><div class='del'>-                loc_wipe (&amp;stub-&gt;args.setattr.loc);</div><div class='del'>-                break;</div><div class='del'>-        }</div><div class='add'>+            STUB_UNWIND(stub, setattr, &amp;stub-&gt;args_cbk.prestat,</div><div class='add'>+                        &amp;stub-&gt;args_cbk.poststat, stub-&gt;args_cbk.xdata);</div><div class='add'>+            break;</div><div class='ctx'>         case GF_FOP_FSETATTR:</div><div class='del'>-        {</div><div class='del'>-                if (stub-&gt;args.fsetattr.fd)</div><div class='del'>-                        fd_unref (stub-&gt;args.fsetattr.fd);</div><div class='del'>-                break;</div><div class='del'>-        }</div><div class='add'>+            STUB_UNWIND(stub, fsetattr, &amp;stub-&gt;args_cbk.prestat,</div><div class='add'>+                        &amp;stub-&gt;args_cbk.poststat, stub-&gt;args_cbk.xdata);</div><div class='add'>+            break;</div><div class='add'>+        case GF_FOP_FALLOCATE:</div><div class='add'>+            STUB_UNWIND(stub, fallocate, &amp;stub-&gt;args_cbk.prestat,</div><div class='add'>+                        &amp;stub-&gt;args_cbk.poststat, stub-&gt;args_cbk.xdata);</div><div class='add'>+            break;</div><div class='add'>+        case GF_FOP_DISCARD:</div><div class='add'>+            STUB_UNWIND(stub, discard, &amp;stub-&gt;args_cbk.prestat,</div><div class='add'>+                        &amp;stub-&gt;args_cbk.poststat, stub-&gt;args_cbk.xdata);</div><div class='add'>+            break;</div><div class='add'>+        case GF_FOP_ZEROFILL:</div><div class='add'>+            STUB_UNWIND(stub, zerofill, &amp;stub-&gt;args_cbk.prestat,</div><div class='add'>+                        &amp;stub-&gt;args_cbk.poststat, stub-&gt;args_cbk.xdata);</div><div class='add'>+            break;</div><div class='add'>+        case GF_FOP_IPC:</div><div class='add'>+            STUB_UNWIND(stub, ipc, stub-&gt;args_cbk.xdata);</div><div class='add'>+            break;</div><div class='add'>+        case GF_FOP_SEEK:</div><div class='add'>+            STUB_UNWIND(stub, seek, stub-&gt;args_cbk.offset,</div><div class='add'>+                        stub-&gt;args_cbk.xdata);</div><div class='add'>+            break;</div><div class='add'>+        case GF_FOP_LEASE:</div><div class='add'>+            STUB_UNWIND(stub, lease, &amp;stub-&gt;args_cbk.lease,</div><div class='add'>+                        stub-&gt;args_cbk.xdata);</div><div class='add'>+            break;</div><div class='add'>+</div><div class='add'>+        case GF_FOP_GETACTIVELK:</div><div class='add'>+            STUB_UNWIND(stub, getactivelk, &amp;stub-&gt;args_cbk.locklist,</div><div class='add'>+                        stub-&gt;args_cbk.xdata);</div><div class='add'>+            break;</div><div class='add'>+</div><div class='add'>+        case GF_FOP_SETACTIVELK:</div><div class='add'>+            STUB_UNWIND(stub, setactivelk, stub-&gt;args_cbk.xdata);</div><div class='add'>+            break;</div><div class='add'>+</div><div class='add'>+        case GF_FOP_PUT:</div><div class='add'>+            STUB_UNWIND(stub, put, stub-&gt;args_cbk.inode, &amp;stub-&gt;args_cbk.stat,</div><div class='add'>+                        &amp;stub-&gt;args_cbk.preparent, &amp;stub-&gt;args_cbk.postparent,</div><div class='add'>+                        stub-&gt;args_cbk.xdata);</div><div class='add'>+            break;</div><div class='add'>+</div><div class='add'>+        case GF_FOP_COPY_FILE_RANGE:</div><div class='add'>+            STUB_UNWIND(stub, copy_file_range, &amp;stub-&gt;args_cbk.stat,</div><div class='add'>+                        &amp;stub-&gt;args_cbk.prestat, &amp;stub-&gt;args_cbk.poststat,</div><div class='add'>+                        stub-&gt;args_cbk.xdata);</div><div class='add'>+            break;</div><div class='add'>+</div><div class='ctx'>         default:</div><div class='del'>-	{</div><div class='del'>-		gf_log ("call-stub", GF_LOG_ERROR, "Invalid value of FOP (%d)",</div><div class='del'>-                        stub-&gt;fop);</div><div class='del'>-                break;</div><div class='del'>-	}</div><div class='del'>-	}</div><div class='add'>+            gf_msg_callingfn("call-stub", GF_LOG_ERROR, EINVAL,</div><div class='add'>+                             LG_MSG_INVALID_ENTRY,</div><div class='add'>+                             "Invalid value of FOP"</div><div class='add'>+                             " (%d)",</div><div class='add'>+                             stub-&gt;fop);</div><div class='add'>+            break;</div><div class='add'>+    }</div><div class='add'>+out:</div><div class='add'>+    return;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+static void</div><div class='add'>+call_stub_wipe_args(call_stub_t *stub)</div><div class='add'>+{</div><div class='add'>+    args_wipe(&amp;stub-&gt;args);</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> static void</div><div class='del'>-call_stub_destroy_unwind (call_stub_t *stub)</div><div class='del'>-{</div><div class='del'>-	switch (stub-&gt;fop) {</div><div class='del'>-	case GF_FOP_OPEN:</div><div class='del'>-	{</div><div class='del'>-		if (stub-&gt;args.open_cbk.fd) </div><div class='del'>-			fd_unref (stub-&gt;args.open_cbk.fd);</div><div class='del'>-	}</div><div class='del'>-	break;</div><div class='del'>-</div><div class='del'>-	case GF_FOP_CREATE:</div><div class='del'>-	{</div><div class='del'>-		if (stub-&gt;args.create_cbk.fd) </div><div class='del'>-			fd_unref (stub-&gt;args.create_cbk.fd);</div><div class='del'>-</div><div class='del'>-		if (stub-&gt;args.create_cbk.inode)</div><div class='del'>-			inode_unref (stub-&gt;args.create_cbk.inode);</div><div class='del'>-	}</div><div class='del'>-	break;</div><div class='del'>-</div><div class='del'>-	case GF_FOP_STAT:</div><div class='del'>-		break;</div><div class='del'>-</div><div class='del'>-	case GF_FOP_READLINK:</div><div class='del'>-	{</div><div class='del'>-		if (stub-&gt;args.readlink_cbk.buf) </div><div class='del'>-			GF_FREE ((char *)stub-&gt;args.readlink_cbk.buf);</div><div class='del'>-	}</div><div class='del'>-	break;</div><div class='del'>-  </div><div class='del'>-	case GF_FOP_MKNOD:</div><div class='del'>-	{</div><div class='del'>-		if (stub-&gt;args.mknod_cbk.inode)</div><div class='del'>-			inode_unref (stub-&gt;args.mknod_cbk.inode);</div><div class='del'>-	}</div><div class='del'>-	break;</div><div class='del'>-  </div><div class='del'>-	case GF_FOP_MKDIR:</div><div class='del'>-	{</div><div class='del'>-		if (stub-&gt;args.mkdir_cbk.inode)</div><div class='del'>-			inode_unref (stub-&gt;args.mkdir_cbk.inode);</div><div class='del'>-	}</div><div class='del'>-	break;</div><div class='del'>-  </div><div class='del'>-	case GF_FOP_UNLINK:</div><div class='del'>-		break;</div><div class='del'>-</div><div class='del'>-	case GF_FOP_RMDIR:</div><div class='del'>-		break;</div><div class='del'>-      </div><div class='del'>-	case GF_FOP_SYMLINK:</div><div class='del'>-	{</div><div class='del'>-		if (stub-&gt;args.symlink_cbk.inode) </div><div class='del'>-			inode_unref (stub-&gt;args.symlink_cbk.inode);</div><div class='del'>-	}</div><div class='del'>-	break;</div><div class='del'>-  </div><div class='del'>-	case GF_FOP_RENAME:</div><div class='del'>-		break;</div><div class='del'>-</div><div class='del'>-	case GF_FOP_LINK:</div><div class='del'>-	{</div><div class='del'>-		if (stub-&gt;args.link_cbk.inode)</div><div class='del'>-			inode_unref (stub-&gt;args.link_cbk.inode);</div><div class='del'>-	}</div><div class='del'>-	break;</div><div class='del'>-  </div><div class='del'>-	case GF_FOP_TRUNCATE:</div><div class='del'>-		break;</div><div class='del'>-</div><div class='del'>-	case GF_FOP_READ:</div><div class='del'>-	{</div><div class='del'>-		if (stub-&gt;args.readv_cbk.op_ret &gt;= 0) {</div><div class='del'>-			struct iobref *iobref = stub-&gt;args.readv_cbk.iobref;</div><div class='del'>-			GF_FREE (stub-&gt;args.readv_cbk.vector);</div><div class='del'>-			</div><div class='del'>-			if (iobref) {</div><div class='del'>-				iobref_unref (iobref);</div><div class='del'>-			}</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='del'>-	break;</div><div class='del'>-</div><div class='del'>-	case GF_FOP_WRITE:</div><div class='del'>-		break;</div><div class='del'>-  </div><div class='del'>-	case GF_FOP_STATFS:</div><div class='del'>-		break;</div><div class='del'>-</div><div class='del'>-	case GF_FOP_FLUSH:</div><div class='del'>-		break;</div><div class='del'>-  </div><div class='del'>-	case GF_FOP_FSYNC:</div><div class='del'>-		break;</div><div class='del'>-</div><div class='del'>-	case GF_FOP_SETXATTR:</div><div class='del'>-		break;</div><div class='del'>-  </div><div class='del'>-	case GF_FOP_GETXATTR:</div><div class='del'>-	{</div><div class='del'>-		if (stub-&gt;args.getxattr_cbk.dict)</div><div class='del'>-			dict_unref (stub-&gt;args.getxattr_cbk.dict);</div><div class='del'>-	}</div><div class='del'>-	break;</div><div class='del'>-</div><div class='del'>-	case GF_FOP_FSETXATTR:</div><div class='del'>-		break;</div><div class='del'>-</div><div class='del'>-	case GF_FOP_FGETXATTR:</div><div class='del'>-	{</div><div class='del'>-		if (stub-&gt;args.fgetxattr_cbk.dict)</div><div class='del'>-			dict_unref (stub-&gt;args.fgetxattr_cbk.dict);</div><div class='del'>-	}</div><div class='del'>-	break;</div><div class='del'>-</div><div class='del'>-	case GF_FOP_REMOVEXATTR:</div><div class='del'>-		break;</div><div class='del'>-</div><div class='del'>-	case GF_FOP_OPENDIR:</div><div class='del'>-	{</div><div class='del'>-		if (stub-&gt;args.opendir_cbk.fd)</div><div class='del'>-			fd_unref (stub-&gt;args.opendir_cbk.fd);</div><div class='del'>-	}</div><div class='del'>-	break;</div><div class='del'>-</div><div class='del'>-	case GF_FOP_FSYNCDIR:</div><div class='del'>-		break;</div><div class='del'>-  </div><div class='del'>-	case GF_FOP_ACCESS:</div><div class='del'>-		break;</div><div class='del'>-  </div><div class='del'>-	case GF_FOP_FTRUNCATE:</div><div class='del'>-		break;</div><div class='del'>-  </div><div class='del'>-	case GF_FOP_FSTAT:</div><div class='del'>-		break;</div><div class='del'>-  </div><div class='del'>-	case GF_FOP_LK:</div><div class='del'>-		break;</div><div class='del'>-</div><div class='del'>-	case GF_FOP_INODELK:</div><div class='del'>-		break;</div><div class='del'>-</div><div class='del'>-	case GF_FOP_FINODELK:</div><div class='del'>-		break;</div><div class='del'>-</div><div class='del'>-	case GF_FOP_ENTRYLK:</div><div class='del'>-		break;</div><div class='del'>-</div><div class='del'>-	case GF_FOP_FENTRYLK:</div><div class='del'>-		break;</div><div class='del'>-</div><div class='del'>-	case GF_FOP_LOOKUP:</div><div class='del'>-	{</div><div class='del'>-		if (stub-&gt;args.lookup_cbk.inode)</div><div class='del'>-			inode_unref (stub-&gt;args.lookup_cbk.inode);</div><div class='del'>-</div><div class='del'>-		if (stub-&gt;args.lookup_cbk.dict)</div><div class='del'>-			dict_unref (stub-&gt;args.lookup_cbk.dict);</div><div class='del'>-	}</div><div class='del'>-	break;</div><div class='del'>-</div><div class='del'>-	case GF_FOP_RCHECKSUM:</div><div class='del'>-	{</div><div class='del'>-		if (stub-&gt;args.rchecksum_cbk.op_ret &gt;= 0) {</div><div class='del'>-			GF_FREE (stub-&gt;args.rchecksum_cbk.strong_checksum);</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='del'>-  	break;</div><div class='del'>-</div><div class='del'>-	case GF_FOP_READDIR:</div><div class='del'>-	{</div><div class='del'>-		if (stub-&gt;args.readdir_cbk.op_ret &gt; 0) {</div><div class='del'>-			gf_dirent_free (&amp;stub-&gt;args.readdir_cbk.entries);</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='del'>-	break;</div><div class='add'>+call_stub_wipe_args_cbk(call_stub_t *stub)</div><div class='add'>+{</div><div class='add'>+    args_cbk_wipe(&amp;stub-&gt;args_cbk);</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        case GF_FOP_READDIRP:</div><div class='del'>-	{</div><div class='del'>-		if (stub-&gt;args.readdirp_cbk.op_ret &gt; 0) {</div><div class='del'>-			gf_dirent_free (&amp;stub-&gt;args.readdirp_cbk.entries);</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='del'>-	break;</div><div class='del'>-</div><div class='del'>-	case GF_FOP_XATTROP:</div><div class='del'>-	{</div><div class='del'>-		if (stub-&gt;args.xattrop_cbk.xattr)</div><div class='del'>-			dict_unref (stub-&gt;args.xattrop_cbk.xattr);</div><div class='del'>-	}</div><div class='del'>-	break;</div><div class='del'>-</div><div class='del'>-	case GF_FOP_FXATTROP:</div><div class='del'>-	{</div><div class='del'>-		if (stub-&gt;args.fxattrop_cbk.xattr) </div><div class='del'>-			dict_unref (stub-&gt;args.fxattrop_cbk.xattr);</div><div class='del'>-	}</div><div class='del'>-	break;</div><div class='del'>-        </div><div class='del'>-        case GF_FOP_SETATTR:</div><div class='del'>-        {</div><div class='del'>-                break;</div><div class='del'>-        }</div><div class='add'>+void</div><div class='add'>+call_stub_destroy(call_stub_t *stub)</div><div class='add'>+{</div><div class='add'>+    GF_VALIDATE_OR_GOTO("call-stub", stub, out);</div><div class='ctx'> </div><div class='del'>-        case GF_FOP_FSETATTR:</div><div class='del'>-        {</div><div class='del'>-                break;</div><div class='del'>-        }</div><div class='add'>+    if (stub-&gt;wind)</div><div class='add'>+        call_stub_wipe_args(stub);</div><div class='add'>+    else</div><div class='add'>+        call_stub_wipe_args_cbk(stub);</div><div class='ctx'> </div><div class='del'>-        default:</div><div class='del'>-	{</div><div class='del'>-		gf_log ("call-stub", GF_LOG_ERROR, "Invalid value of FOP (%d)",</div><div class='del'>-                        stub-&gt;fop);</div><div class='del'>-                break;</div><div class='del'>-	}</div><div class='del'>-	}</div><div class='add'>+    stub-&gt;stub_mem_pool = NULL;</div><div class='add'>+</div><div class='add'>+    mem_put(stub);</div><div class='add'>+out:</div><div class='add'>+    return;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>- </div><div class='ctx'> void</div><div class='del'>-call_stub_destroy (call_stub_t *stub)</div><div class='add'>+call_resume(call_stub_t *stub)</div><div class='ctx'> {</div><div class='del'>-       struct mem_pool *tmp_pool = NULL;</div><div class='add'>+    xlator_t *old_THIS = NULL;</div><div class='add'>+</div><div class='add'>+    errno = EINVAL;</div><div class='add'>+    GF_VALIDATE_OR_GOTO("call-stub", stub, out);</div><div class='ctx'> </div><div class='del'>-	GF_VALIDATE_OR_GOTO ("call-stub", stub, out);</div><div class='add'>+    list_del_init(&amp;stub-&gt;list);</div><div class='ctx'> </div><div class='del'>-       tmp_pool = stub-&gt;stub_mem_pool;</div><div class='del'>-	</div><div class='del'>-	if (stub-&gt;wind) {</div><div class='del'>-		call_stub_destroy_wind (stub);</div><div class='del'>-	} else {</div><div class='del'>-		call_stub_destroy_unwind (stub);</div><div class='del'>-	}</div><div class='add'>+    old_THIS = THIS;</div><div class='add'>+    THIS = stub-&gt;frame-&gt;this;</div><div class='add'>+    {</div><div class='add'>+        if (stub-&gt;wind)</div><div class='add'>+            call_resume_wind(stub);</div><div class='add'>+        else</div><div class='add'>+            call_resume_unwind(stub);</div><div class='add'>+    }</div><div class='add'>+    THIS = old_THIS;</div><div class='ctx'> </div><div class='del'>-       stub-&gt;stub_mem_pool = NULL;</div><div class='del'>-       mem_put (tmp_pool, stub);</div><div class='add'>+    call_stub_destroy(stub);</div><div class='ctx'> out:</div><div class='del'>-       tmp_pool = NULL;</div><div class='add'>+    return;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+call_unwind_error(call_stub_t *stub, int op_ret, int op_errno)</div><div class='add'>+{</div><div class='add'>+    xlator_t *old_THIS = NULL;</div><div class='add'>+</div><div class='add'>+    list_del_init(&amp;stub-&gt;list);</div><div class='add'>+</div><div class='add'>+    old_THIS = THIS;</div><div class='add'>+    THIS = stub-&gt;frame-&gt;this;</div><div class='add'>+    {</div><div class='add'>+        stub-&gt;args_cbk.op_ret = op_ret;</div><div class='add'>+        stub-&gt;args_cbk.op_errno = op_errno;</div><div class='add'>+        call_resume_unwind(stub);</div><div class='add'>+    }</div><div class='add'>+    THIS = old_THIS;</div><div class='add'>+</div><div class='add'>+    call_stub_destroy(stub);</div><div class='ctx'> </div><div class='del'>-	return;</div><div class='add'>+    return;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> void</div><div class='del'>-call_resume (call_stub_t *stub)</div><div class='add'>+call_unwind_error_keep_stub(call_stub_t *stub, int op_ret, int op_errno)</div><div class='ctx'> {</div><div class='del'>-        xlator_t *old_THIS = NULL;</div><div class='add'>+    xlator_t *old_THIS = NULL;</div><div class='ctx'> </div><div class='del'>-	errno = EINVAL;</div><div class='del'>-	GF_VALIDATE_OR_GOTO ("call-stub", stub, out);</div><div class='add'>+    list_del_init(&amp;stub-&gt;list);</div><div class='ctx'> </div><div class='del'>-	list_del_init (&amp;stub-&gt;list);</div><div class='add'>+    old_THIS = THIS;</div><div class='add'>+    THIS = stub-&gt;frame-&gt;this;</div><div class='add'>+    {</div><div class='add'>+        stub-&gt;args_cbk.op_ret = op_ret;</div><div class='add'>+        stub-&gt;args_cbk.op_errno = op_errno;</div><div class='add'>+        call_resume_unwind(stub);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        old_THIS = THIS;</div><div class='del'>-        THIS = stub-&gt;frame-&gt;this;</div><div class='del'>-        {</div><div class='del'>-                if (stub-&gt;wind)</div><div class='del'>-                        call_resume_wind (stub);</div><div class='del'>-                else</div><div class='del'>-                        call_resume_unwind (stub);</div><div class='del'>-        }</div><div class='del'>-        THIS = old_THIS;</div><div class='add'>+    THIS = old_THIS;</div><div class='ctx'> </div><div class='del'>-	call_stub_destroy (stub);</div><div class='del'>-out:</div><div class='del'>-	return;</div><div class='add'>+    return;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+void</div><div class='add'>+call_resume_keep_stub(call_stub_t *stub)</div><div class='add'>+{</div><div class='add'>+    xlator_t *old_THIS = NULL;</div><div class='add'>+</div><div class='add'>+    errno = EINVAL;</div><div class='add'>+    GF_VALIDATE_OR_GOTO("call-stub", stub, out);</div><div class='add'>+</div><div class='add'>+    list_del_init(&amp;stub-&gt;list);</div><div class='ctx'> </div><div class='add'>+    old_THIS = THIS;</div><div class='add'>+    THIS = stub-&gt;frame-&gt;this;</div><div class='add'>+    {</div><div class='add'>+        if (stub-&gt;wind)</div><div class='add'>+            call_resume_wind(stub);</div><div class='add'>+        else</div><div class='add'>+            call_resume_unwind(stub);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    THIS = old_THIS;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return;</div><div class='add'>+}</div><div class='head'>diff --git a/libglusterfs/src/call-stub.h b/libglusterfs/src/call-stub.h<br/>deleted file mode 100644<br/>index 83efa9a4857..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/libglusterfs/src/call-stub.h?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/call-stub.h</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,1116 +0,0 @@</div><div class='del'>-/*</div><div class='del'>-  Copyright (c) 2007-2009 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='del'>-  This file is part of GlusterFS.</div><div class='del'>-</div><div class='del'>-  GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-  it under the terms of the GNU General Public License as published</div><div class='del'>-  by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-  or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-  GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-  WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-  General Public License for more details.</div><div class='del'>-</div><div class='del'>-  You should have received a copy of the GNU General Public License</div><div class='del'>-  along with this program.  If not, see</div><div class='del'>-  &lt;http://www.gnu.org/licenses/&gt;.</div><div class='del'>-*/</div><div class='del'>-</div><div class='del'>-#ifndef _CALL_STUB_H_</div><div class='del'>-#define _CALL_STUB_H_</div><div class='del'>-</div><div class='del'>-#ifndef _CONFIG_H</div><div class='del'>-#define _CONFIG_H</div><div class='del'>-#include "config.h"</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-#include "xlator.h"</div><div class='del'>-#include "stack.h"</div><div class='del'>-#include "list.h"</div><div class='del'>-</div><div class='del'>-typedef struct {</div><div class='del'>-	struct list_head list;</div><div class='del'>-	char wind;</div><div class='del'>-	call_frame_t *frame;</div><div class='del'>-	glusterfs_fop_t fop;</div><div class='del'>-       struct mem_pool *stub_mem_pool;    /* pointer to stub mempool in glusterfs ctx */</div><div class='del'>-</div><div class='del'>-	union {</div><div class='del'>-		/* lookup */</div><div class='del'>-		struct {</div><div class='del'>-			fop_lookup_t fn;</div><div class='del'>-			loc_t loc;</div><div class='del'>-			dict_t *xattr_req;</div><div class='del'>-		} lookup;</div><div class='del'>-		struct {</div><div class='del'>-			fop_lookup_cbk_t fn;</div><div class='del'>-			int32_t op_ret, op_errno;</div><div class='del'>-			inode_t *inode;</div><div class='del'>-			struct iatt buf;</div><div class='del'>-			dict_t *dict;</div><div class='del'>-                        struct iatt postparent;</div><div class='del'>-		} lookup_cbk;</div><div class='del'>-</div><div class='del'>-		/* stat */</div><div class='del'>-		struct {</div><div class='del'>-			fop_stat_t fn;</div><div class='del'>-			loc_t loc;</div><div class='del'>-		} stat;</div><div class='del'>-		struct {</div><div class='del'>-			fop_stat_cbk_t fn;</div><div class='del'>-			int32_t op_ret, op_errno;</div><div class='del'>-			struct iatt buf;</div><div class='del'>-		} stat_cbk;</div><div class='del'>-</div><div class='del'>-		/* fstat */</div><div class='del'>-		struct {</div><div class='del'>-			fop_fstat_t fn;</div><div class='del'>-			fd_t *fd;</div><div class='del'>-		} fstat;</div><div class='del'>-		struct {</div><div class='del'>-			fop_fstat_cbk_t fn;</div><div class='del'>-			int32_t op_ret, op_errno;</div><div class='del'>-			struct iatt buf;</div><div class='del'>-		} fstat_cbk;</div><div class='del'>-</div><div class='del'>-		/* truncate */</div><div class='del'>-		struct {</div><div class='del'>-			fop_truncate_t fn;</div><div class='del'>-			loc_t loc;</div><div class='del'>-			off_t off;</div><div class='del'>-		} truncate;</div><div class='del'>-		struct {</div><div class='del'>-			fop_truncate_cbk_t fn;</div><div class='del'>-			int32_t op_ret, op_errno;</div><div class='del'>-			struct iatt prebuf;</div><div class='del'>-                        struct iatt postbuf;</div><div class='del'>-		} truncate_cbk;</div><div class='del'>-</div><div class='del'>-		/* ftruncate */</div><div class='del'>-		struct {</div><div class='del'>-			fop_ftruncate_t fn;</div><div class='del'>-			fd_t *fd;</div><div class='del'>-			off_t off;</div><div class='del'>-		} ftruncate;</div><div class='del'>-		struct {</div><div class='del'>-			fop_ftruncate_cbk_t fn;</div><div class='del'>-			int32_t op_ret, op_errno;</div><div class='del'>-			struct iatt prebuf;</div><div class='del'>-                        struct iatt postbuf;</div><div class='del'>-		} ftruncate_cbk;</div><div class='del'>-</div><div class='del'>-		/* access */</div><div class='del'>-		struct {</div><div class='del'>-			fop_access_t fn;</div><div class='del'>-			loc_t loc;</div><div class='del'>-			int32_t mask;</div><div class='del'>-		} access;</div><div class='del'>-		struct {</div><div class='del'>-			fop_access_cbk_t fn;</div><div class='del'>-			int32_t op_ret, op_errno;</div><div class='del'>-		} access_cbk;</div><div class='del'>-</div><div class='del'>-		/* readlink */</div><div class='del'>-		struct {</div><div class='del'>-			fop_readlink_t fn;</div><div class='del'>-			loc_t loc;</div><div class='del'>-			size_t size;</div><div class='del'>-		} readlink;</div><div class='del'>-		struct {</div><div class='del'>-			fop_readlink_cbk_t fn;</div><div class='del'>-			int32_t op_ret, op_errno;</div><div class='del'>-			const char *buf;</div><div class='del'>-                        struct iatt sbuf;</div><div class='del'>-		} readlink_cbk;</div><div class='del'>-</div><div class='del'>-		/* mknod */</div><div class='del'>-		struct {</div><div class='del'>-			fop_mknod_t fn;</div><div class='del'>-			loc_t loc;</div><div class='del'>-			mode_t mode;</div><div class='del'>-			dev_t rdev;</div><div class='del'>-                        dict_t *params;</div><div class='del'>-		} mknod;</div><div class='del'>-		struct {</div><div class='del'>-			fop_mknod_cbk_t fn;</div><div class='del'>-			int32_t op_ret, op_errno;</div><div class='del'>-			inode_t *inode;</div><div class='del'>-			struct iatt buf;</div><div class='del'>-                        struct iatt preparent;</div><div class='del'>-                        struct iatt postparent;</div><div class='del'>-		} mknod_cbk;</div><div class='del'>-</div><div class='del'>-		/* mkdir */</div><div class='del'>-		struct {</div><div class='del'>-			fop_mkdir_t fn;</div><div class='del'>-			loc_t loc;</div><div class='del'>-			mode_t mode;</div><div class='del'>-                        dict_t *params;</div><div class='del'>-		} mkdir;</div><div class='del'>-		struct {</div><div class='del'>-			fop_mkdir_cbk_t fn;</div><div class='del'>-			int32_t op_ret, op_errno;</div><div class='del'>-			inode_t *inode;</div><div class='del'>-			struct iatt buf;</div><div class='del'>-                        struct iatt preparent;</div><div class='del'>-                        struct iatt postparent;</div><div class='del'>-		} mkdir_cbk;</div><div class='del'>-</div><div class='del'>-		/* unlink */</div><div class='del'>-		struct {</div><div class='del'>-			fop_unlink_t fn;</div><div class='del'>-			loc_t loc;</div><div class='del'>-		} unlink;</div><div class='del'>-		struct {</div><div class='del'>-			fop_unlink_cbk_t fn;</div><div class='del'>-			int32_t op_ret, op_errno;</div><div class='del'>-                        struct iatt preparent;</div><div class='del'>-                        struct iatt postparent;</div><div class='del'>-		} unlink_cbk;</div><div class='del'>-</div><div class='del'>-		/* rmdir */</div><div class='del'>-		struct {</div><div class='del'>-			fop_rmdir_t fn;</div><div class='del'>-			loc_t loc;</div><div class='del'>-		} rmdir;</div><div class='del'>-		struct {</div><div class='del'>-			fop_rmdir_cbk_t fn;</div><div class='del'>-			int32_t op_ret, op_errno;</div><div class='del'>-                        struct iatt preparent;</div><div class='del'>-                        struct iatt postparent;</div><div class='del'>-		} rmdir_cbk;</div><div class='del'>-</div><div class='del'>-		/* symlink */</div><div class='del'>-		struct {</div><div class='del'>-			fop_symlink_t fn;</div><div class='del'>-			const char *linkname;</div><div class='del'>-			loc_t loc;</div><div class='del'>-                        dict_t *params;</div><div class='del'>-		} symlink;</div><div class='del'>-		struct {</div><div class='del'>-			fop_symlink_cbk_t fn;</div><div class='del'>-			int32_t op_ret, op_errno;</div><div class='del'>-			inode_t *inode;</div><div class='del'>-			struct iatt buf;</div><div class='del'>-                        struct iatt preparent;</div><div class='del'>-                        struct iatt postparent;</div><div class='del'>-		} symlink_cbk;</div><div class='del'>-</div><div class='del'>-		/* rename */</div><div class='del'>-		struct {</div><div class='del'>-			fop_rename_t fn;</div><div class='del'>-			loc_t old;</div><div class='del'>-			loc_t new;</div><div class='del'>-		} rename;</div><div class='del'>-		struct {</div><div class='del'>-			fop_rename_cbk_t fn;</div><div class='del'>-			int32_t op_ret, op_errno;</div><div class='del'>-			struct iatt buf;</div><div class='del'>-                        struct iatt preoldparent;</div><div class='del'>-                        struct iatt postoldparent;</div><div class='del'>-                        struct iatt prenewparent;</div><div class='del'>-                        struct iatt postnewparent;</div><div class='del'>-		} rename_cbk;</div><div class='del'>-</div><div class='del'>-		/* link */</div><div class='del'>-		struct {</div><div class='del'>-			fop_link_t fn;</div><div class='del'>-			loc_t oldloc;</div><div class='del'>-			loc_t newloc;</div><div class='del'>-		} link;</div><div class='del'>-		struct {</div><div class='del'>-			fop_link_cbk_t fn;</div><div class='del'>-			int32_t op_ret, op_errno;</div><div class='del'>-			inode_t *inode;</div><div class='del'>-			struct iatt buf;</div><div class='del'>-                        struct iatt preparent;</div><div class='del'>-                        struct iatt postparent;</div><div class='del'>-		} link_cbk;</div><div class='del'>-</div><div class='del'>-		/* create */</div><div class='del'>-		struct {</div><div class='del'>-			fop_create_t fn;</div><div class='del'>-			loc_t loc;</div><div class='del'>-			int32_t flags;</div><div class='del'>-			mode_t mode;</div><div class='del'>-			fd_t *fd;</div><div class='del'>-                        dict_t *params;</div><div class='del'>-		} create;</div><div class='del'>-		struct {</div><div class='del'>-			fop_create_cbk_t fn;</div><div class='del'>-			int32_t op_ret, op_errno;</div><div class='del'>-			fd_t *fd;</div><div class='del'>-			inode_t *inode;</div><div class='del'>-			struct iatt buf;</div><div class='del'>-                        struct iatt preparent;</div><div class='del'>-                        struct iatt postparent;</div><div class='del'>-		} create_cbk;</div><div class='del'>-</div><div class='del'>-		/* open */</div><div class='del'>-		struct {</div><div class='del'>-			fop_open_t fn;</div><div class='del'>-			loc_t loc;</div><div class='del'>-			int32_t flags;</div><div class='del'>-			fd_t *fd;</div><div class='del'>-                        int32_t wbflags;</div><div class='del'>-		} open;</div><div class='del'>-		struct {</div><div class='del'>-			fop_open_cbk_t fn;</div><div class='del'>-			int32_t op_ret, op_errno;</div><div class='del'>-			fd_t *fd;</div><div class='del'>-		} open_cbk;</div><div class='del'>-</div><div class='del'>-		/* readv */</div><div class='del'>-		struct {</div><div class='del'>-			fop_readv_t fn;</div><div class='del'>-			fd_t *fd;</div><div class='del'>-			size_t size;</div><div class='del'>-			off_t off;</div><div class='del'>-		} readv;</div><div class='del'>-		struct {</div><div class='del'>-			fop_readv_cbk_t fn;</div><div class='del'>-			int32_t op_ret;</div><div class='del'>-			int32_t op_errno;</div><div class='del'>-			struct iovec *vector;</div><div class='del'>-			int32_t count;</div><div class='del'>-			struct iatt stbuf;</div><div class='del'>-			struct iobref *iobref;</div><div class='del'>-		} readv_cbk;</div><div class='del'>-</div><div class='del'>-		/* writev */</div><div class='del'>-		struct {</div><div class='del'>-			fop_writev_t fn;</div><div class='del'>-			fd_t *fd;</div><div class='del'>-			struct iovec *vector;</div><div class='del'>-			int32_t count;</div><div class='del'>-			off_t off;</div><div class='del'>-			struct iobref *iobref;</div><div class='del'>-		} writev;</div><div class='del'>-		struct {</div><div class='del'>-			fop_writev_cbk_t fn;</div><div class='del'>-			int32_t op_ret, op_errno;</div><div class='del'>-                        struct iatt prebuf;</div><div class='del'>-			struct iatt postbuf;</div><div class='del'>-		} writev_cbk;</div><div class='del'>-</div><div class='del'>-		/* flush */</div><div class='del'>-		struct {</div><div class='del'>-			fop_flush_t fn;</div><div class='del'>-			fd_t *fd;</div><div class='del'>-		} flush;</div><div class='del'>-		struct {</div><div class='del'>-			fop_flush_cbk_t fn;</div><div class='del'>-			int32_t op_ret, op_errno;</div><div class='del'>-		} flush_cbk;</div><div class='del'>-</div><div class='del'>-		/* fsync */</div><div class='del'>-		struct {</div><div class='del'>-			fop_fsync_t fn;</div><div class='del'>-			fd_t *fd;</div><div class='del'>-			int32_t datasync;</div><div class='del'>-		} fsync;</div><div class='del'>-		struct {</div><div class='del'>-			fop_fsync_cbk_t fn;</div><div class='del'>-			int32_t op_ret, op_errno;</div><div class='del'>-                        struct iatt prebuf;</div><div class='del'>-                        struct iatt postbuf;</div><div class='del'>-		} fsync_cbk;</div><div class='del'>-</div><div class='del'>-		/* opendir */</div><div class='del'>-		struct {</div><div class='del'>-			fop_opendir_t fn;</div><div class='del'>-			loc_t loc;</div><div class='del'>-			fd_t *fd;</div><div class='del'>-		} opendir;</div><div class='del'>-		struct {</div><div class='del'>-			fop_opendir_cbk_t fn;</div><div class='del'>-			int32_t op_ret, op_errno;</div><div class='del'>-			fd_t *fd;</div><div class='del'>-		} opendir_cbk;</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-		/* fsyncdir */</div><div class='del'>-		struct {</div><div class='del'>-			fop_fsyncdir_t fn;</div><div class='del'>-			fd_t *fd;</div><div class='del'>-			int32_t datasync;</div><div class='del'>-		} fsyncdir;</div><div class='del'>-		struct {</div><div class='del'>-			fop_fsyncdir_cbk_t fn;</div><div class='del'>-			int32_t op_ret, op_errno;</div><div class='del'>-		} fsyncdir_cbk;</div><div class='del'>-</div><div class='del'>-		/* statfs */</div><div class='del'>-		struct {</div><div class='del'>-			fop_statfs_t fn;</div><div class='del'>-			loc_t loc;</div><div class='del'>-		} statfs;</div><div class='del'>-		struct {</div><div class='del'>-			fop_statfs_cbk_t fn;</div><div class='del'>-			int32_t op_ret, op_errno;</div><div class='del'>-			struct statvfs buf;</div><div class='del'>-		} statfs_cbk;</div><div class='del'>-</div><div class='del'>-		/* setxattr */</div><div class='del'>-		struct {</div><div class='del'>-			fop_setxattr_t fn;</div><div class='del'>-			loc_t loc;</div><div class='del'>-			dict_t *dict;</div><div class='del'>-			int32_t flags;</div><div class='del'>-		} setxattr;</div><div class='del'>-		struct {</div><div class='del'>-			fop_setxattr_cbk_t fn;</div><div class='del'>-			int32_t op_ret, op_errno;</div><div class='del'>-		} setxattr_cbk;</div><div class='del'>-</div><div class='del'>-		/* getxattr */</div><div class='del'>-		struct {</div><div class='del'>-			fop_getxattr_t fn;</div><div class='del'>-			loc_t loc;</div><div class='del'>-			const char *name;</div><div class='del'>-		} getxattr;</div><div class='del'>-		struct {</div><div class='del'>-			fop_getxattr_cbk_t fn;</div><div class='del'>-			int32_t op_ret, op_errno;</div><div class='del'>-			dict_t *dict;</div><div class='del'>-		} getxattr_cbk;</div><div class='del'>-</div><div class='del'>-		/* fsetxattr */</div><div class='del'>-		struct {</div><div class='del'>-			fop_fsetxattr_t fn;</div><div class='del'>-			fd_t *fd;</div><div class='del'>-			dict_t *dict;</div><div class='del'>-			int32_t flags;</div><div class='del'>-		} fsetxattr;</div><div class='del'>-		struct {</div><div class='del'>-			fop_fsetxattr_cbk_t fn;</div><div class='del'>-			int32_t op_ret, op_errno;</div><div class='del'>-		} fsetxattr_cbk;</div><div class='del'>-</div><div class='del'>-		/* fgetxattr */</div><div class='del'>-		struct {</div><div class='del'>-			fop_fgetxattr_t fn;</div><div class='del'>-			fd_t *fd;</div><div class='del'>-			const char *name;</div><div class='del'>-		} fgetxattr;</div><div class='del'>-		struct {</div><div class='del'>-			fop_fgetxattr_cbk_t fn;</div><div class='del'>-			int32_t op_ret, op_errno;</div><div class='del'>-			dict_t *dict;</div><div class='del'>-		} fgetxattr_cbk;</div><div class='del'>-</div><div class='del'>-		/* removexattr */</div><div class='del'>-		struct {</div><div class='del'>-			fop_removexattr_t fn;</div><div class='del'>-			loc_t loc;</div><div class='del'>-			const char *name;</div><div class='del'>-		} removexattr;</div><div class='del'>-		struct {</div><div class='del'>-			fop_removexattr_cbk_t fn;</div><div class='del'>-			int32_t op_ret, op_errno;</div><div class='del'>-		} removexattr_cbk;</div><div class='del'>-</div><div class='del'>-		/* lk */</div><div class='del'>-		struct {</div><div class='del'>-			fop_lk_t fn;</div><div class='del'>-			fd_t *fd;</div><div class='del'>-			int32_t cmd;</div><div class='del'>-			struct flock lock;</div><div class='del'>-		} lk;</div><div class='del'>-		struct {</div><div class='del'>-			fop_lk_cbk_t fn;</div><div class='del'>-			int32_t op_ret, op_errno;</div><div class='del'>-			struct flock lock;</div><div class='del'>-		} lk_cbk;</div><div class='del'>-</div><div class='del'>-		/* inodelk */</div><div class='del'>-		struct {</div><div class='del'>-			fop_inodelk_t fn;</div><div class='del'>-                        const char *volume;</div><div class='del'>-			loc_t loc;</div><div class='del'>-			int32_t cmd;</div><div class='del'>-			struct flock lock;</div><div class='del'>-		} inodelk;</div><div class='del'>-</div><div class='del'>-		struct {</div><div class='del'>-			fop_inodelk_cbk_t fn;</div><div class='del'>-			int32_t op_ret, op_errno;</div><div class='del'>-		} inodelk_cbk;</div><div class='del'>-</div><div class='del'>-		/* finodelk */</div><div class='del'>-		struct {</div><div class='del'>-			fop_finodelk_t fn;</div><div class='del'>-                        const char *volume;</div><div class='del'>-			fd_t *fd;</div><div class='del'>-			int32_t cmd;</div><div class='del'>-			struct flock lock;</div><div class='del'>-		} finodelk;</div><div class='del'>-</div><div class='del'>-		struct {</div><div class='del'>-			fop_finodelk_cbk_t fn;</div><div class='del'>-			int32_t op_ret, op_errno;</div><div class='del'>-		} finodelk_cbk;</div><div class='del'>-</div><div class='del'>-		/* entrylk */</div><div class='del'>-		struct {</div><div class='del'>-			fop_entrylk_t fn;</div><div class='del'>-			loc_t loc;</div><div class='del'>-                        const char *volume;</div><div class='del'>-			const char *name;</div><div class='del'>-			entrylk_cmd cmd;</div><div class='del'>-			entrylk_type type;</div><div class='del'>-		} entrylk;</div><div class='del'>-</div><div class='del'>-		struct {</div><div class='del'>-			fop_entrylk_cbk_t fn;</div><div class='del'>-			int32_t op_ret, op_errno;</div><div class='del'>-		} entrylk_cbk;</div><div class='del'>-</div><div class='del'>-		/* fentrylk */</div><div class='del'>-		struct {</div><div class='del'>-			fop_fentrylk_t fn;</div><div class='del'>-			fd_t *fd;</div><div class='del'>-                        const char *volume;</div><div class='del'>-			const char *name;</div><div class='del'>-			entrylk_cmd cmd;</div><div class='del'>-			entrylk_type type;</div><div class='del'>-		} fentrylk;</div><div class='del'>-</div><div class='del'>-		struct {</div><div class='del'>-			fop_fentrylk_cbk_t fn;</div><div class='del'>-			int32_t op_ret, op_errno;</div><div class='del'>-		} fentrylk_cbk;</div><div class='del'>-</div><div class='del'>-		/* readdir */</div><div class='del'>-		struct {</div><div class='del'>-			fop_readdir_t fn;</div><div class='del'>-			fd_t *fd;</div><div class='del'>-			size_t size;</div><div class='del'>-			off_t off;</div><div class='del'>-		} readdir;</div><div class='del'>-		struct {</div><div class='del'>-			fop_readdir_cbk_t fn;</div><div class='del'>-			int32_t op_ret, op_errno;</div><div class='del'>-			gf_dirent_t entries;</div><div class='del'>-		} readdir_cbk;</div><div class='del'>-</div><div class='del'>-                /* readdirp */</div><div class='del'>-		struct {</div><div class='del'>-			fop_readdirp_t fn;</div><div class='del'>-			fd_t *fd;</div><div class='del'>-			size_t size;</div><div class='del'>-			off_t off;</div><div class='del'>-		} readdirp;</div><div class='del'>-		struct {</div><div class='del'>-			fop_readdirp_cbk_t fn;</div><div class='del'>-			int32_t op_ret, op_errno;</div><div class='del'>-			gf_dirent_t entries;</div><div class='del'>-		} readdirp_cbk;</div><div class='del'>-</div><div class='del'>-		/* rchecksum */</div><div class='del'>-		struct {</div><div class='del'>-			fop_rchecksum_t fn;</div><div class='del'>-			fd_t *fd;</div><div class='del'>-                        off_t offset;</div><div class='del'>-			int32_t len;</div><div class='del'>-		} rchecksum;</div><div class='del'>-		struct {</div><div class='del'>-			fop_rchecksum_cbk_t fn;</div><div class='del'>-			int32_t op_ret, op_errno;</div><div class='del'>-			uint32_t weak_checksum;</div><div class='del'>-			uint8_t *strong_checksum;</div><div class='del'>-		} rchecksum_cbk;</div><div class='del'>-</div><div class='del'>-		/* xattrop */</div><div class='del'>-		struct {</div><div class='del'>-			fop_xattrop_t fn;</div><div class='del'>-			loc_t loc;</div><div class='del'>-			gf_xattrop_flags_t optype;</div><div class='del'>-			dict_t *xattr;</div><div class='del'>-		} xattrop;</div><div class='del'>-		struct {</div><div class='del'>-			fop_xattrop_cbk_t fn;</div><div class='del'>-			int32_t op_ret;</div><div class='del'>-			int32_t op_errno;</div><div class='del'>-			dict_t *xattr;</div><div class='del'>-		} xattrop_cbk;</div><div class='del'>-</div><div class='del'>-		/* fxattrop */</div><div class='del'>-		struct {</div><div class='del'>-			fop_fxattrop_t fn;</div><div class='del'>-			fd_t *fd;</div><div class='del'>-			gf_xattrop_flags_t optype;</div><div class='del'>-			dict_t *xattr;</div><div class='del'>-		} fxattrop;</div><div class='del'>-		struct {</div><div class='del'>-			fop_fxattrop_cbk_t fn;</div><div class='del'>-			int32_t op_ret;</div><div class='del'>-			int32_t op_errno;</div><div class='del'>-			dict_t *xattr;</div><div class='del'>-		} fxattrop_cbk;</div><div class='del'>-</div><div class='del'>-                /* setattr */</div><div class='del'>-                struct {</div><div class='del'>-                        fop_setattr_t fn;</div><div class='del'>-                        loc_t loc;</div><div class='del'>-                        struct iatt stbuf;</div><div class='del'>-                        int32_t valid;</div><div class='del'>-                } setattr;</div><div class='del'>-                struct {</div><div class='del'>-                        fop_setattr_cbk_t fn;</div><div class='del'>-                        int32_t op_ret;</div><div class='del'>-                        int32_t op_errno;</div><div class='del'>-                        struct iatt statpre;</div><div class='del'>-                        struct iatt statpost;</div><div class='del'>-                } setattr_cbk;</div><div class='del'>-</div><div class='del'>-                /* fsetattr */</div><div class='del'>-                struct {</div><div class='del'>-                        fop_fsetattr_t fn;</div><div class='del'>-                        fd_t *fd;</div><div class='del'>-                        struct iatt stbuf;</div><div class='del'>-                        int32_t valid;</div><div class='del'>-                } fsetattr;</div><div class='del'>-                struct {</div><div class='del'>-                        fop_fsetattr_cbk_t fn;</div><div class='del'>-                        int32_t op_ret;</div><div class='del'>-                        int32_t op_errno;</div><div class='del'>-                        struct iatt statpre;</div><div class='del'>-                        struct iatt statpost;</div><div class='del'>-                } fsetattr_cbk;</div><div class='del'>-</div><div class='del'>-	} args;</div><div class='del'>-} call_stub_t;</div><div class='del'>-</div><div class='del'>-call_stub_t *</div><div class='del'>-fop_lookup_stub (call_frame_t *frame,</div><div class='del'>-		 fop_lookup_t fn,</div><div class='del'>-		 loc_t *loc,</div><div class='del'>-		 dict_t *xattr_req);</div><div class='del'>-</div><div class='del'>-call_stub_t *</div><div class='del'>-fop_lookup_cbk_stub (call_frame_t *frame,</div><div class='del'>-		     fop_lookup_cbk_t fn,</div><div class='del'>-		     int32_t op_ret,</div><div class='del'>-		     int32_t op_errno,</div><div class='del'>-		     inode_t *inode,</div><div class='del'>-		     struct iatt *buf,</div><div class='del'>-                     dict_t *dict,</div><div class='del'>-                     struct iatt *postparent);</div><div class='del'>-call_stub_t *</div><div class='del'>-fop_stat_stub (call_frame_t *frame,</div><div class='del'>-	       fop_stat_t fn,</div><div class='del'>-	       loc_t *loc);</div><div class='del'>-call_stub_t *</div><div class='del'>-fop_stat_cbk_stub (call_frame_t *frame,</div><div class='del'>-		   fop_stat_cbk_t fn,</div><div class='del'>-		   int32_t op_ret,</div><div class='del'>-		   int32_t op_errno,</div><div class='del'>-		   struct iatt *buf);</div><div class='del'>-call_stub_t *</div><div class='del'>-fop_fstat_stub (call_frame_t *frame,</div><div class='del'>-		fop_fstat_t fn,</div><div class='del'>-		fd_t *fd);</div><div class='del'>-call_stub_t *</div><div class='del'>-fop_fstat_cbk_stub (call_frame_t *frame,</div><div class='del'>-		    fop_fstat_cbk_t fn,</div><div class='del'>-		    int32_t op_ret,</div><div class='del'>-		    int32_t op_errno,</div><div class='del'>-		    struct iatt *buf);</div><div class='del'>-</div><div class='del'>-call_stub_t *</div><div class='del'>-fop_truncate_stub (call_frame_t *frame,</div><div class='del'>-		   fop_truncate_t fn,</div><div class='del'>-		   loc_t *loc,</div><div class='del'>-		   off_t off);</div><div class='del'>-</div><div class='del'>-call_stub_t *</div><div class='del'>-fop_truncate_cbk_stub (call_frame_t *frame,</div><div class='del'>-		       fop_truncate_cbk_t fn,</div><div class='del'>-		       int32_t op_ret,</div><div class='del'>-		       int32_t op_errno,</div><div class='del'>-		       struct iatt *prebuf,</div><div class='del'>-                       struct iatt *postbuf);</div><div class='del'>-</div><div class='del'>-call_stub_t *</div><div class='del'>-fop_ftruncate_stub (call_frame_t *frame,</div><div class='del'>-		    fop_ftruncate_t fn,</div><div class='del'>-		    fd_t *fd,</div><div class='del'>-		    off_t off);</div><div class='del'>-</div><div class='del'>-call_stub_t *</div><div class='del'>-fop_ftruncate_cbk_stub (call_frame_t *frame,</div><div class='del'>-			fop_ftruncate_cbk_t fn,</div><div class='del'>-			int32_t op_ret,</div><div class='del'>-			int32_t op_errno,</div><div class='del'>-			struct iatt *prebuf,</div><div class='del'>-                        struct iatt *postbuf);</div><div class='del'>-</div><div class='del'>-call_stub_t *</div><div class='del'>-fop_access_stub (call_frame_t *frame,</div><div class='del'>-		 fop_access_t fn,</div><div class='del'>-		 loc_t *loc,</div><div class='del'>-		 int32_t mask);</div><div class='del'>-</div><div class='del'>-call_stub_t *</div><div class='del'>-fop_access_cbk_stub (call_frame_t *frame,</div><div class='del'>-		     fop_access_cbk_t fn,</div><div class='del'>-		     int32_t op_ret,</div><div class='del'>-		     int32_t op_errno);</div><div class='del'>-</div><div class='del'>-call_stub_t *</div><div class='del'>-fop_readlink_stub (call_frame_t *frame,</div><div class='del'>-		   fop_readlink_t fn,</div><div class='del'>-		   loc_t *loc,</div><div class='del'>-		   size_t size);</div><div class='del'>-</div><div class='del'>-call_stub_t *</div><div class='del'>-fop_readlink_cbk_stub (call_frame_t *frame,</div><div class='del'>-		       fop_readlink_cbk_t fn,</div><div class='del'>-		       int32_t op_ret,</div><div class='del'>-		       int32_t op_errno,</div><div class='del'>-		       const char *path,</div><div class='del'>-                       struct iatt *buf);</div><div class='del'>-</div><div class='del'>-call_stub_t *</div><div class='del'>-fop_mknod_stub (call_frame_t *frame, fop_mknod_t fn,</div><div class='del'>-		loc_t *loc, mode_t mode, dev_t rdev, dict_t *params);</div><div class='del'>-</div><div class='del'>-call_stub_t *</div><div class='del'>-fop_mknod_cbk_stub (call_frame_t *frame,</div><div class='del'>-		    fop_mknod_cbk_t fn,</div><div class='del'>-		    int32_t op_ret,</div><div class='del'>-		    int32_t op_errno,</div><div class='del'>-		    inode_t *inode,</div><div class='del'>-                    struct iatt *buf,</div><div class='del'>-                    struct iatt *preparent,</div><div class='del'>-                    struct iatt *postparent);</div><div class='del'>-</div><div class='del'>-call_stub_t *</div><div class='del'>-fop_mkdir_stub (call_frame_t *frame, fop_mkdir_t fn,</div><div class='del'>-		loc_t *loc, mode_t mode, dict_t *params);</div><div class='del'>-</div><div class='del'>-call_stub_t *</div><div class='del'>-fop_mkdir_cbk_stub (call_frame_t *frame,</div><div class='del'>-		    fop_mkdir_cbk_t fn,</div><div class='del'>-		    int32_t op_ret,</div><div class='del'>-		    int32_t op_errno,</div><div class='del'>-		    inode_t *inode,</div><div class='del'>-                    struct iatt *buf,</div><div class='del'>-                    struct iatt *preparent,</div><div class='del'>-                    struct iatt *postparent);</div><div class='del'>-</div><div class='del'>-call_stub_t *</div><div class='del'>-fop_unlink_stub (call_frame_t *frame,</div><div class='del'>-		 fop_unlink_t fn,</div><div class='del'>-		 loc_t *loc);</div><div class='del'>-</div><div class='del'>-call_stub_t *</div><div class='del'>-fop_unlink_cbk_stub (call_frame_t *frame,</div><div class='del'>-		     fop_unlink_cbk_t fn,</div><div class='del'>-		     int32_t op_ret,</div><div class='del'>-		     int32_t op_errno,</div><div class='del'>-                     struct iatt *preparent,</div><div class='del'>-                     struct iatt *postparent);</div><div class='del'>-</div><div class='del'>-call_stub_t *</div><div class='del'>-fop_rmdir_stub (call_frame_t *frame,</div><div class='del'>-		fop_rmdir_t fn,</div><div class='del'>-		loc_t *loc);</div><div class='del'>-</div><div class='del'>-call_stub_t *</div><div class='del'>-fop_rmdir_cbk_stub (call_frame_t *frame,</div><div class='del'>-		    fop_rmdir_cbk_t fn,</div><div class='del'>-		    int32_t op_ret,</div><div class='del'>-		    int32_t op_errno,</div><div class='del'>-                    struct iatt *preparent,</div><div class='del'>-                    struct iatt *postparent);</div><div class='del'>-</div><div class='del'>-call_stub_t *</div><div class='del'>-fop_symlink_stub (call_frame_t *frame, fop_symlink_t fn,</div><div class='del'>-		  const char *linkname, loc_t *loc, dict_t *params);</div><div class='del'>-</div><div class='del'>-call_stub_t *</div><div class='del'>-fop_symlink_cbk_stub (call_frame_t *frame,</div><div class='del'>-		      fop_symlink_cbk_t fn,</div><div class='del'>-		      int32_t op_ret,</div><div class='del'>-		      int32_t op_errno,</div><div class='del'>-		      inode_t *inode,</div><div class='del'>-                      struct iatt *buf,</div><div class='del'>-                      struct iatt *preparent,</div><div class='del'>-                      struct iatt *postparent);</div><div class='del'>-</div><div class='del'>-call_stub_t *</div><div class='del'>-fop_rename_stub (call_frame_t *frame,</div><div class='del'>-		 fop_rename_t fn,</div><div class='del'>-		 loc_t *oldloc,</div><div class='del'>-		 loc_t *newloc);</div><div class='del'>-</div><div class='del'>-call_stub_t *</div><div class='del'>-fop_rename_cbk_stub (call_frame_t *frame,</div><div class='del'>-		     fop_rename_cbk_t fn,</div><div class='del'>-		     int32_t op_ret,</div><div class='del'>-		     int32_t op_errno,</div><div class='del'>-		     struct iatt *buf,</div><div class='del'>-                     struct iatt *preoldparent,</div><div class='del'>-                     struct iatt *postoldparent,</div><div class='del'>-                     struct iatt *prenewparent,</div><div class='del'>-                     struct iatt *postnewparent);</div><div class='del'>-</div><div class='del'>-call_stub_t *</div><div class='del'>-fop_link_stub (call_frame_t *frame,</div><div class='del'>-	       fop_link_t fn,</div><div class='del'>-	       loc_t *oldloc,</div><div class='del'>-	       loc_t *newloc);</div><div class='del'>-</div><div class='del'>-call_stub_t *</div><div class='del'>-fop_link_cbk_stub (call_frame_t *frame,</div><div class='del'>-		   fop_link_cbk_t fn,</div><div class='del'>-		   int32_t op_ret,</div><div class='del'>-		   int32_t op_errno,</div><div class='del'>-		   inode_t *inode,</div><div class='del'>-                   struct iatt *buf,</div><div class='del'>-                   struct iatt *preparent,</div><div class='del'>-                   struct iatt *postparent);</div><div class='del'>-</div><div class='del'>-call_stub_t *</div><div class='del'>-fop_create_stub (call_frame_t *frame, fop_create_t fn,</div><div class='del'>-		 loc_t *loc, int32_t flags, mode_t mode,</div><div class='del'>-                 fd_t *fd, dict_t *params);</div><div class='del'>-</div><div class='del'>-call_stub_t *</div><div class='del'>-fop_create_cbk_stub (call_frame_t *frame,</div><div class='del'>-		     fop_create_cbk_t fn,</div><div class='del'>-		     int32_t op_ret,</div><div class='del'>-		     int32_t op_errno,</div><div class='del'>-		     fd_t *fd,</div><div class='del'>-		     inode_t *inode,</div><div class='del'>-		     struct iatt *buf,</div><div class='del'>-                     struct iatt *preparent,</div><div class='del'>-                     struct iatt *postparent);</div><div class='del'>-</div><div class='del'>-call_stub_t *</div><div class='del'>-fop_open_stub (call_frame_t *frame,</div><div class='del'>-	       fop_open_t fn,</div><div class='del'>-	       loc_t *loc,</div><div class='del'>-	       int32_t flags,</div><div class='del'>-	       fd_t *fd,</div><div class='del'>-               int32_t wbflags);</div><div class='del'>-</div><div class='del'>-call_stub_t *</div><div class='del'>-fop_open_cbk_stub (call_frame_t *frame,</div><div class='del'>-		   fop_open_cbk_t fn,</div><div class='del'>-		   int32_t op_ret,</div><div class='del'>-		   int32_t op_errno,</div><div class='del'>-		   fd_t *fd);</div><div class='del'>-</div><div class='del'>-call_stub_t *</div><div class='del'>-fop_readv_stub (call_frame_t *frame,</div><div class='del'>-		fop_readv_t fn,</div><div class='del'>-		fd_t *fd,</div><div class='del'>-		size_t size,</div><div class='del'>-		off_t off);</div><div class='del'>-</div><div class='del'>-call_stub_t *</div><div class='del'>-fop_readv_cbk_stub (call_frame_t *frame,</div><div class='del'>-		    fop_readv_cbk_t fn,</div><div class='del'>-		    int32_t op_ret,</div><div class='del'>-		    int32_t op_errno,</div><div class='del'>-		    struct iovec *vector,</div><div class='del'>-		    int32_t count,</div><div class='del'>-		    struct iatt *stbuf,</div><div class='del'>-                    struct iobref *iobref);</div><div class='del'>-</div><div class='del'>-call_stub_t *</div><div class='del'>-fop_writev_stub (call_frame_t *frame,</div><div class='del'>-		 fop_writev_t fn,</div><div class='del'>-		 fd_t *fd,</div><div class='del'>-		 struct iovec *vector,</div><div class='del'>-		 int32_t count,</div><div class='del'>-		 off_t off,</div><div class='del'>-                 struct iobref *iobref);</div><div class='del'>-</div><div class='del'>-call_stub_t *</div><div class='del'>-fop_writev_cbk_stub (call_frame_t *frame,</div><div class='del'>-		     fop_writev_cbk_t fn,</div><div class='del'>-		     int32_t op_ret,</div><div class='del'>-		     int32_t op_errno,</div><div class='del'>-                     struct iatt *prebuf,</div><div class='del'>-                     struct iatt *postbuf);</div><div class='del'>-</div><div class='del'>-call_stub_t *</div><div class='del'>-fop_flush_stub (call_frame_t *frame,</div><div class='del'>-		fop_flush_t fn,</div><div class='del'>-		fd_t *fd);</div><div class='del'>-</div><div class='del'>-call_stub_t *</div><div class='del'>-fop_flush_cbk_stub (call_frame_t *frame,</div><div class='del'>-		    fop_flush_cbk_t fn,</div><div class='del'>-		    int32_t op_ret,</div><div class='del'>-		    int32_t op_errno);</div><div class='del'>-</div><div class='del'>-call_stub_t *</div><div class='del'>-fop_fsync_stub (call_frame_t *frame,</div><div class='del'>-		fop_fsync_t fn,</div><div class='del'>-		fd_t *fd,</div><div class='del'>-		int32_t datasync);</div><div class='del'>-</div><div class='del'>-call_stub_t *</div><div class='del'>-fop_fsync_cbk_stub (call_frame_t *frame,</div><div class='del'>-		    fop_fsync_cbk_t fn,</div><div class='del'>-		    int32_t op_ret,</div><div class='del'>-		    int32_t op_errno,</div><div class='del'>-                    struct iatt *prebuf,</div><div class='del'>-                    struct iatt *postbuf);</div><div class='del'>-</div><div class='del'>-call_stub_t *</div><div class='del'>-fop_opendir_stub (call_frame_t *frame,</div><div class='del'>-		  fop_opendir_t fn,</div><div class='del'>-		  loc_t *loc, fd_t *fd);</div><div class='del'>-</div><div class='del'>-call_stub_t *</div><div class='del'>-fop_opendir_cbk_stub (call_frame_t *frame,</div><div class='del'>-		      fop_opendir_cbk_t fn,</div><div class='del'>-		      int32_t op_ret,</div><div class='del'>-		      int32_t op_errno,</div><div class='del'>-		      fd_t *fd);</div><div class='del'>-</div><div class='del'>-call_stub_t *</div><div class='del'>-fop_fsyncdir_stub (call_frame_t *frame,</div><div class='del'>-		   fop_fsyncdir_t fn,</div><div class='del'>-		   fd_t *fd,</div><div class='del'>-		   int32_t datasync);</div><div class='del'>-</div><div class='del'>-call_stub_t *</div><div class='del'>-fop_fsyncdir_cbk_stub (call_frame_t *frame,</div><div class='del'>-		       fop_fsyncdir_cbk_t fn,</div><div class='del'>-		       int32_t op_ret,</div><div class='del'>-		       int32_t op_errno);</div><div class='del'>-</div><div class='del'>-call_stub_t *</div><div class='del'>-fop_statfs_stub (call_frame_t *frame,</div><div class='del'>-		 fop_statfs_t fn,</div><div class='del'>-		 loc_t *loc);</div><div class='del'>-</div><div class='del'>-call_stub_t *</div><div class='del'>-fop_statfs_cbk_stub (call_frame_t *frame,</div><div class='del'>-		     fop_statfs_cbk_t fn,</div><div class='del'>-		     int32_t op_ret,</div><div class='del'>-		     int32_t op_errno,</div><div class='del'>-		     struct statvfs *buf);</div><div class='del'>-</div><div class='del'>-call_stub_t *</div><div class='del'>-fop_setxattr_stub (call_frame_t *frame,</div><div class='del'>-		   fop_setxattr_t fn,</div><div class='del'>-		   loc_t *loc,</div><div class='del'>-		   dict_t *dict,</div><div class='del'>-		   int32_t flags);</div><div class='del'>-</div><div class='del'>-call_stub_t *</div><div class='del'>-fop_setxattr_cbk_stub (call_frame_t *frame,</div><div class='del'>-		       fop_setxattr_cbk_t fn,</div><div class='del'>-		       int32_t op_ret,</div><div class='del'>-		       int32_t op_errno);</div><div class='del'>-</div><div class='del'>-call_stub_t *</div><div class='del'>-fop_getxattr_stub (call_frame_t *frame,</div><div class='del'>-		   fop_getxattr_t fn,</div><div class='del'>-		   loc_t *loc,</div><div class='del'>-		   const char *name);</div><div class='del'>-</div><div class='del'>-call_stub_t *</div><div class='del'>-fop_getxattr_cbk_stub (call_frame_t *frame,</div><div class='del'>-		       fop_getxattr_cbk_t fn,</div><div class='del'>-		       int32_t op_ret,</div><div class='del'>-		       int32_t op_errno,</div><div class='del'>-		       dict_t *value);</div><div class='del'>-</div><div class='del'>-call_stub_t *</div><div class='del'>-fop_fsetxattr_stub (call_frame_t *frame,</div><div class='del'>-                    fop_fsetxattr_t fn,</div><div class='del'>-                    fd_t *fd,</div><div class='del'>-                    dict_t *dict,</div><div class='del'>-                    int32_t flags);</div><div class='del'>-</div><div class='del'>-call_stub_t *</div><div class='del'>-fop_fsetxattr_cbk_stub (call_frame_t *frame,</div><div class='del'>-                        fop_fsetxattr_cbk_t fn,</div><div class='del'>-                        int32_t op_ret,</div><div class='del'>-                        int32_t op_errno);</div><div class='del'>-</div><div class='del'>-call_stub_t *</div><div class='del'>-fop_fgetxattr_stub (call_frame_t *frame,</div><div class='del'>-                    fop_fgetxattr_t fn,</div><div class='del'>-                    fd_t *fd,</div><div class='del'>-                    const char *name);</div><div class='del'>-</div><div class='del'>-call_stub_t *</div><div class='del'>-fop_fgetxattr_cbk_stub (call_frame_t *frame,</div><div class='del'>-                        fop_fgetxattr_cbk_t fn,</div><div class='del'>-                        int32_t op_ret,</div><div class='del'>-                        int32_t op_errno,</div><div class='del'>-                        dict_t *value);</div><div class='del'>-</div><div class='del'>-call_stub_t *</div><div class='del'>-fop_removexattr_stub (call_frame_t *frame,</div><div class='del'>-		      fop_removexattr_t fn,</div><div class='del'>-		      loc_t *loc,</div><div class='del'>-		      const char *name);</div><div class='del'>-</div><div class='del'>-call_stub_t *</div><div class='del'>-fop_removexattr_cbk_stub (call_frame_t *frame,</div><div class='del'>-			  fop_removexattr_cbk_t fn,</div><div class='del'>-			  int32_t op_ret,</div><div class='del'>-			  int32_t op_errno);</div><div class='del'>-call_stub_t *</div><div class='del'>-fop_lk_stub (call_frame_t *frame,</div><div class='del'>-	     fop_lk_t fn,</div><div class='del'>-	     fd_t *fd,</div><div class='del'>-	     int32_t cmd,</div><div class='del'>-	     struct flock *lock);</div><div class='del'>-</div><div class='del'>-call_stub_t *</div><div class='del'>-fop_lk_cbk_stub (call_frame_t *frame,</div><div class='del'>-		 fop_lk_cbk_t fn,</div><div class='del'>-		 int32_t op_ret,</div><div class='del'>-		 int32_t op_errno,</div><div class='del'>-		 struct flock *lock);</div><div class='del'>-</div><div class='del'>-call_stub_t *</div><div class='del'>-fop_inodelk_stub (call_frame_t *frame, fop_inodelk_t fn,</div><div class='del'>-		  const char *volume, loc_t *loc, int32_t cmd, </div><div class='del'>-                  struct flock *lock);</div><div class='del'>-</div><div class='del'>-call_stub_t *</div><div class='del'>-fop_finodelk_stub (call_frame_t *frame, fop_finodelk_t fn,</div><div class='del'>-		   const char *volume, fd_t *fd, int32_t cmd, </div><div class='del'>-                   struct flock *lock);</div><div class='del'>-</div><div class='del'>-call_stub_t *</div><div class='del'>-fop_entrylk_stub (call_frame_t *frame, fop_entrylk_t fn,</div><div class='del'>-		  const char *volume, loc_t *loc, const char *basename,</div><div class='del'>-		  entrylk_cmd cmd, entrylk_type type);</div><div class='del'>-</div><div class='del'>-call_stub_t *</div><div class='del'>-fop_fentrylk_stub (call_frame_t *frame, fop_fentrylk_t fn,</div><div class='del'>-		   const char *volume, fd_t *fd, const char *basename,</div><div class='del'>-		   entrylk_cmd cmd, entrylk_type type);</div><div class='del'>-</div><div class='del'>-call_stub_t *</div><div class='del'>-fop_inodelk_cbk_stub (call_frame_t *frame, fop_inodelk_cbk_t fn,</div><div class='del'>-		      int32_t op_ret, int32_t op_errno);</div><div class='del'>-</div><div class='del'>-call_stub_t *</div><div class='del'>-fop_finodelk_cbk_stub (call_frame_t *frame, fop_inodelk_cbk_t fn,</div><div class='del'>-		       int32_t op_ret, int32_t op_errno);</div><div class='del'>-</div><div class='del'>-call_stub_t *</div><div class='del'>-fop_entrylk_cbk_stub (call_frame_t *frame, fop_entrylk_cbk_t fn,</div><div class='del'>-		      int32_t op_ret, int32_t op_errno);</div><div class='del'>-</div><div class='del'>-call_stub_t *</div><div class='del'>-fop_fentrylk_cbk_stub (call_frame_t *frame, fop_entrylk_cbk_t fn,</div><div class='del'>-		       int32_t op_ret, int32_t op_errno);</div><div class='del'>-</div><div class='del'>-call_stub_t *</div><div class='del'>-fop_readdir_stub (call_frame_t *frame,</div><div class='del'>-		  fop_readdir_t fn,</div><div class='del'>-		  fd_t *fd,</div><div class='del'>-		  size_t size,</div><div class='del'>-		  off_t off);</div><div class='del'>-</div><div class='del'>-call_stub_t *</div><div class='del'>-fop_readdirp_stub (call_frame_t *frame,</div><div class='del'>-		   fop_readdir_t fn,</div><div class='del'>-		   fd_t *fd,</div><div class='del'>-		   size_t size,</div><div class='del'>-		   off_t off);</div><div class='del'>-</div><div class='del'>-call_stub_t *</div><div class='del'>-fop_readdirp_cbk_stub (call_frame_t *frame,</div><div class='del'>-		       fop_readdir_cbk_t fn,</div><div class='del'>-		       int32_t op_ret,</div><div class='del'>-		       int32_t op_errno,</div><div class='del'>-		       gf_dirent_t *entries);</div><div class='del'>-</div><div class='del'>-call_stub_t *</div><div class='del'>-fop_readdir_cbk_stub (call_frame_t *frame,</div><div class='del'>-		      fop_readdir_cbk_t fn,</div><div class='del'>-		      int32_t op_ret,</div><div class='del'>-		      int32_t op_errno,</div><div class='del'>-		      gf_dirent_t *entries);</div><div class='del'>-</div><div class='del'>-call_stub_t *</div><div class='del'>-fop_rchecksum_stub (call_frame_t *frame,</div><div class='del'>-                    fop_rchecksum_t fn,</div><div class='del'>-                    fd_t *fd, off_t offset,</div><div class='del'>-                    int32_t len);</div><div class='del'>-</div><div class='del'>-call_stub_t *</div><div class='del'>-fop_rchecksum_cbk_stub (call_frame_t *frame,</div><div class='del'>-                        fop_rchecksum_cbk_t fn,</div><div class='del'>-                        int32_t op_ret,</div><div class='del'>-                        int32_t op_errno,</div><div class='del'>-                        uint32_t weak_checksum,</div><div class='del'>-                        uint8_t *strong_checksum);</div><div class='del'>-</div><div class='del'>-call_stub_t *</div><div class='del'>-fop_xattrop_stub (call_frame_t *frame,</div><div class='del'>-		  fop_xattrop_t fn,</div><div class='del'>-		  loc_t *loc,</div><div class='del'>-		  gf_xattrop_flags_t optype,</div><div class='del'>-		  dict_t *xattr);</div><div class='del'>-</div><div class='del'>-call_stub_t *</div><div class='del'>-fop_xattrop_stub_cbk_stub (call_frame_t *frame,</div><div class='del'>-			   fop_xattrop_cbk_t fn,</div><div class='del'>-			   int32_t op_ret,</div><div class='del'>-			   int32_t op_errno);</div><div class='del'>-</div><div class='del'>-call_stub_t *</div><div class='del'>-fop_fxattrop_stub (call_frame_t *frame,</div><div class='del'>-		   fop_fxattrop_t fn,</div><div class='del'>-		   fd_t *fd,</div><div class='del'>-		   gf_xattrop_flags_t optype,</div><div class='del'>-		   dict_t *xattr);</div><div class='del'>-</div><div class='del'>-call_stub_t *</div><div class='del'>-fop_fxattrop_stub_cbk_stub (call_frame_t *frame,</div><div class='del'>-			    fop_xattrop_cbk_t fn,</div><div class='del'>-			    int32_t op_ret,</div><div class='del'>-			    int32_t op_errno);</div><div class='del'>-</div><div class='del'>-call_stub_t *</div><div class='del'>-fop_setattr_stub (call_frame_t *frame,</div><div class='del'>-                  fop_setattr_t fn,</div><div class='del'>-                  loc_t *loc,</div><div class='del'>-                  struct iatt *stbuf,</div><div class='del'>-                  int32_t valid);</div><div class='del'>-</div><div class='del'>-call_stub_t *</div><div class='del'>-fop_setattr_cbk_stub (call_frame_t *frame,</div><div class='del'>-                      fop_setattr_cbk_t fn,</div><div class='del'>-                      int32_t op_ret,</div><div class='del'>-                      int32_t op_errno,</div><div class='del'>-                      struct iatt *statpre,</div><div class='del'>-                      struct iatt *statpost);</div><div class='del'>-</div><div class='del'>-call_stub_t *</div><div class='del'>-fop_fsetattr_stub (call_frame_t *frame,</div><div class='del'>-                   fop_fsetattr_t fn,</div><div class='del'>-                   fd_t *fd,</div><div class='del'>-                   struct iatt *stbuf,</div><div class='del'>-                   int32_t valid);</div><div class='del'>-</div><div class='del'>-call_stub_t *</div><div class='del'>-fop_fsetattr_cbk_stub (call_frame_t *frame,</div><div class='del'>-                       fop_setattr_cbk_t fn,</div><div class='del'>-                       int32_t op_ret,</div><div class='del'>-                       int32_t op_errno,</div><div class='del'>-                       struct iatt *statpre,</div><div class='del'>-                       struct iatt *statpost);</div><div class='del'>-</div><div class='del'>-void call_resume (call_stub_t *stub);</div><div class='del'>-void call_stub_destroy (call_stub_t *stub);</div><div class='del'>-#endif</div><div class='head'>diff --git a/libglusterfs/src/changelog.h b/libglusterfs/src/changelog.h<br/>new file mode 100644<br/>index 00000000000..a09d9f25287<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/libglusterfs/src/changelog.h?id=d1d7a6f35c816822fab51c820e25023863c239c1'>libglusterfs/src/changelog.h</a></div><div class='hunk'>@@ -0,0 +1,115 @@</div><div class='add'>+/*</div><div class='add'>+   Copyright (c) 2013 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+   This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+   This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+   General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+   later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+   cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#ifndef _GF_CHANGELOG_H</div><div class='add'>+#define _GF_CHANGELOG_H</div><div class='add'>+</div><div class='add'>+struct gf_brick_spec;</div><div class='add'>+</div><div class='add'>+/**</div><div class='add'>+ * Max bit shiter for event selection</div><div class='add'>+ */</div><div class='add'>+#define CHANGELOG_EV_SELECTION_RANGE 5</div><div class='add'>+</div><div class='add'>+#define CHANGELOG_OP_TYPE_JOURNAL (1 &lt;&lt; 0)</div><div class='add'>+#define CHANGELOG_OP_TYPE_OPEN (1 &lt;&lt; 1)</div><div class='add'>+#define CHANGELOG_OP_TYPE_CREATE (1 &lt;&lt; 2)</div><div class='add'>+#define CHANGELOG_OP_TYPE_RELEASE (1 &lt;&lt; 3)</div><div class='add'>+#define CHANGELOG_OP_TYPE_BR_RELEASE                                           \</div><div class='add'>+    (1 &lt;&lt; 4) /* logical release (last close()),                                \</div><div class='add'>+                sent by bitrot stub */</div><div class='add'>+#define CHANGELOG_OP_TYPE_MAX (1 &lt;&lt; CHANGELOG_EV_SELECTION_RANGE)</div><div class='add'>+</div><div class='add'>+struct ev_open {</div><div class='add'>+    unsigned char gfid[16];</div><div class='add'>+    int32_t flags;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct ev_creat {</div><div class='add'>+    unsigned char gfid[16];</div><div class='add'>+    int32_t flags;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct ev_release {</div><div class='add'>+    unsigned char gfid[16];</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct ev_release_br {</div><div class='add'>+    unsigned long version;</div><div class='add'>+    unsigned char gfid[16];</div><div class='add'>+    int32_t sign_info;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct ev_changelog {</div><div class='add'>+    char path[PATH_MAX];</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+typedef struct changelog_event {</div><div class='add'>+    unsigned int ev_type;</div><div class='add'>+</div><div class='add'>+    union {</div><div class='add'>+        struct ev_open open;</div><div class='add'>+        struct ev_creat create;</div><div class='add'>+        struct ev_release release;</div><div class='add'>+        struct ev_changelog journal;</div><div class='add'>+        struct ev_release_br releasebr;</div><div class='add'>+    } u;</div><div class='add'>+} changelog_event_t;</div><div class='add'>+</div><div class='add'>+#define CHANGELOG_EV_SIZE (sizeof(changelog_event_t))</div><div class='add'>+</div><div class='add'>+/**</div><div class='add'>+ * event callback, connected &amp; disconnection defs</div><div class='add'>+ */</div><div class='add'>+typedef void(CALLBACK)(void *, char *, void *, changelog_event_t *);</div><div class='add'>+typedef void *(INIT)(void *, struct gf_brick_spec *);</div><div class='add'>+typedef void(FINI)(void *, char *, void *);</div><div class='add'>+typedef void(CONNECT)(void *, char *, void *);</div><div class='add'>+typedef void(DISCONNECT)(void *, char *, void *);</div><div class='add'>+</div><div class='add'>+struct gf_brick_spec {</div><div class='add'>+    char *brick_path;</div><div class='add'>+    unsigned int filter;</div><div class='add'>+</div><div class='add'>+    INIT *init;</div><div class='add'>+    FINI *fini;</div><div class='add'>+    CALLBACK *callback;</div><div class='add'>+    CONNECT *connected;</div><div class='add'>+    DISCONNECT *disconnected;</div><div class='add'>+</div><div class='add'>+    void *ptr;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+/* API set */</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+gf_changelog_register(char *brick_path, char *scratch_dir, char *log_file,</div><div class='add'>+                      int log_levl, int max_reconnects);</div><div class='add'>+ssize_t</div><div class='add'>+gf_changelog_scan();</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+gf_changelog_start_fresh();</div><div class='add'>+</div><div class='add'>+ssize_t</div><div class='add'>+gf_changelog_next_change(char *bufptr, size_t maxlen);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+gf_changelog_done(char *file);</div><div class='add'>+</div><div class='add'>+/* newer flexible API */</div><div class='add'>+int</div><div class='add'>+gf_changelog_init(void *xl);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+gf_changelog_register_generic(struct gf_brick_spec *bricks, int count,</div><div class='add'>+                              int ordered, char *logfile, int lvl, void *xl);</div><div class='add'>+</div><div class='add'>+#endif</div><div class='head'>diff --git a/libglusterfs/src/checksum.c b/libglusterfs/src/checksum.c<br/>index 000ab8d93a2..acdaed04ae2 100644<br/>--- a/<a href='/cgit/glusterfs.git/tree/libglusterfs/src/checksum.c?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/checksum.c</a><br/>+++ b/<a href='/cgit/glusterfs.git/tree/libglusterfs/src/checksum.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>libglusterfs/src/checksum.c</a></div><div class='hunk'>@@ -1,78 +1,44 @@</div><div class='ctx'> /*</div><div class='del'>-   Copyright (c) 2009 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='del'>-   This file is part of GlusterFS.</div><div class='add'>+  Copyright (c) 2008-2012 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='ctx'> </div><div class='del'>-   GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-   it under the terms of the GNU General Public License as published</div><div class='del'>-   by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-   or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-   GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-   WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-   General Public License for more details.</div><div class='del'>-</div><div class='del'>-   You should have received a copy of the GNU General Public License</div><div class='del'>-   along with this program.  If not, see</div><div class='del'>-   &lt;http://www.gnu.org/licenses/&gt;.</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='ctx'> */</div><div class='ctx'> </div><div class='del'>-#include &lt;inttypes.h&gt;</div><div class='del'>-</div><div class='del'>-#include "glusterfs.h"</div><div class='del'>-#include "md5.h"</div><div class='del'>-#include "checksum.h"</div><div class='del'>-</div><div class='add'>+#include &lt;openssl/md5.h&gt;</div><div class='add'>+#include &lt;openssl/sha.h&gt;</div><div class='add'>+#include &lt;zlib.h&gt;</div><div class='add'>+#include &lt;stdint.h&gt;</div><div class='add'>+#include &lt;string.h&gt;</div><div class='ctx'> </div><div class='ctx'> /*</div><div class='del'>- * The "weak" checksum required for the rsync algorithm,</div><div class='del'>- * adapted from the rsync source code. The following comment</div><div class='del'>- * appears there:</div><div class='add'>+ * The "weak" checksum required for the rsync algorithm.</div><div class='ctx'>  *</div><div class='del'>- * "a simple 32 bit checksum that can be upadted from either end</div><div class='del'>- *  (inspired by Mark Adler's Adler-32 checksum)"</div><div class='add'>+ * Note: these functions are only called to compute checksums on</div><div class='add'>+ * pathnames; they don't need to handle arbitrarily long strings of</div><div class='add'>+ * data. Thus int32_t and uint32_t are sufficient</div><div class='ctx'>  */</div><div class='del'>-</div><div class='ctx'> uint32_t</div><div class='del'>-gf_rsync_weak_checksum (char *buf1, int32_t len)</div><div class='add'>+gf_rsync_weak_checksum(unsigned char *buf, size_t len)</div><div class='ctx'> {</div><div class='del'>-        int32_t i;</div><div class='del'>-        uint32_t s1, s2;</div><div class='del'>-</div><div class='del'>-        signed char *buf = (signed char *) buf1;</div><div class='del'>-        uint32_t csum;</div><div class='del'>-</div><div class='del'>-        s1 = s2 = 0;</div><div class='del'>-        for (i = 0; i &lt; (len-4); i+=4) {</div><div class='del'>-                s2 += 4*(s1 + buf[i]) + 3*buf[i+1] + 2*buf[i+2] + buf[i+3];</div><div class='del'>-</div><div class='del'>-                s1 += buf[i+0] + buf[i+1] + buf[i+2] + buf[i+3];</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        for (; i &lt; len; i++) {</div><div class='del'>-                s1 += buf[i];</div><div class='del'>-                s2 += s1;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        csum = (s1 &amp; 0xffff) + (s2 &lt;&lt; 16);</div><div class='del'>-</div><div class='del'>-        return csum;</div><div class='add'>+    return adler32(0, buf, len);</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> /*</div><div class='del'>- * The "strong" checksum required for the rsync algorithm,</div><div class='del'>- * adapted from the rsync source code.</div><div class='add'>+ * The "strong" checksum required for the rsync algorithm.</div><div class='ctx'>  */</div><div class='del'>-</div><div class='ctx'> void</div><div class='del'>-gf_rsync_strong_checksum (char *buf, int32_t len, uint8_t *sum)</div><div class='add'>+gf_rsync_strong_checksum(unsigned char *data, size_t len,</div><div class='add'>+                         unsigned char *sha256_md)</div><div class='ctx'> {</div><div class='del'>-        md_context m;</div><div class='del'>-</div><div class='del'>-        md5_begin (&amp;m);</div><div class='del'>-        md5_update (&amp;m, (unsigned char *) buf, len);</div><div class='del'>-        md5_result (&amp;m, (unsigned char *) sum);</div><div class='add'>+    SHA256((const unsigned char *)data, len, sha256_md);</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        return;</div><div class='add'>+void</div><div class='add'>+gf_rsync_md5_checksum(unsigned char *data, size_t len, unsigned char *md5)</div><div class='add'>+{</div><div class='add'>+    MD5(data, len, md5);</div><div class='ctx'> }</div><div class='head'>diff --git a/libglusterfs/src/checksum.h b/libglusterfs/src/checksum.h<br/>deleted file mode 100644<br/>index 36a114cc217..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/libglusterfs/src/checksum.h?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/checksum.h</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,29 +0,0 @@</div><div class='del'>-/*</div><div class='del'>-   Copyright (c) 2009 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='del'>-   This file is part of GlusterFS.</div><div class='del'>-</div><div class='del'>-   GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-   it under the terms of the GNU General Public License as published</div><div class='del'>-   by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-   or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-   GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-   WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-   General Public License for more details.</div><div class='del'>-</div><div class='del'>-   You should have received a copy of the GNU General Public License</div><div class='del'>-   along with this program.  If not, see</div><div class='del'>-   &lt;http://www.gnu.org/licenses/&gt;.</div><div class='del'>-*/</div><div class='del'>-</div><div class='del'>-#ifndef __CHECKSUM_H__</div><div class='del'>-#define __CHECKSUM_H__</div><div class='del'>-</div><div class='del'>-uint32_t</div><div class='del'>-gf_rsync_weak_checksum (char *buf, int32_t len);</div><div class='del'>-</div><div class='del'>-void</div><div class='del'>-gf_rsync_strong_checksum (char *buf, int32_t len, uint8_t *sum);</div><div class='del'>-</div><div class='del'>-#endif /* __CHECKSUM_H__ */</div><div class='head'>diff --git a/libglusterfs/src/circ-buff.c b/libglusterfs/src/circ-buff.c<br/>new file mode 100644<br/>index 00000000000..913115c7be1<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/libglusterfs/src/circ-buff.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>libglusterfs/src/circ-buff.c</a></div><div class='hunk'>@@ -0,0 +1,193 @@</div><div class='add'>+/*</div><div class='add'>+  Copyright (c) 2008-2012 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#include "glusterfs/circ-buff.h"</div><div class='add'>+#include "glusterfs/libglusterfs-messages.h"</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+cb_destroy_data(circular_buffer_t *cb, void (*destroy_buffer_data)(void *data))</div><div class='add'>+{</div><div class='add'>+    if (destroy_buffer_data)</div><div class='add'>+        destroy_buffer_data(cb-&gt;data);</div><div class='add'>+    GF_FREE(cb-&gt;data);</div><div class='add'>+    return;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* hold lock while calling this function */</div><div class='add'>+int</div><div class='add'>+__cb_add_entry_buffer(buffer_t *buffer, void *item)</div><div class='add'>+{</div><div class='add'>+    circular_buffer_t *ptr = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    // DO we really need the assert here?</div><div class='add'>+    GF_ASSERT(buffer-&gt;used_len &lt;= buffer-&gt;size_buffer);</div><div class='add'>+</div><div class='add'>+    if (buffer-&gt;use_once == _gf_true &amp;&amp;</div><div class='add'>+        buffer-&gt;used_len == buffer-&gt;size_buffer) {</div><div class='add'>+        gf_msg("circ-buff", GF_LOG_WARNING, 0, LG_MSG_BUFFER_ERROR,</div><div class='add'>+               "buffer %p is use once buffer", buffer);</div><div class='add'>+        return -1;</div><div class='add'>+    } else {</div><div class='add'>+        if (buffer-&gt;used_len == buffer-&gt;size_buffer) {</div><div class='add'>+            if (buffer-&gt;cb[buffer-&gt;w_index]) {</div><div class='add'>+                ptr = buffer-&gt;cb[buffer-&gt;w_index];</div><div class='add'>+                if (ptr-&gt;data) {</div><div class='add'>+                    cb_destroy_data(ptr, buffer-&gt;destroy_buffer_data);</div><div class='add'>+                    ptr-&gt;data = NULL;</div><div class='add'>+                    GF_FREE(ptr);</div><div class='add'>+                }</div><div class='add'>+                buffer-&gt;cb[buffer-&gt;w_index] = NULL;</div><div class='add'>+                ptr = NULL;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        buffer-&gt;cb[buffer-&gt;w_index] = GF_CALLOC(1, sizeof(circular_buffer_t),</div><div class='add'>+                                                gf_common_mt_circular_buffer_t);</div><div class='add'>+        if (!buffer-&gt;cb[buffer-&gt;w_index])</div><div class='add'>+            return -1;</div><div class='add'>+</div><div class='add'>+        buffer-&gt;cb[buffer-&gt;w_index]-&gt;data = item;</div><div class='add'>+        ret = gettimeofday(&amp;buffer-&gt;cb[buffer-&gt;w_index]-&gt;tv, NULL);</div><div class='add'>+        if (ret == -1)</div><div class='add'>+            gf_msg_callingfn("circ-buff", GF_LOG_WARNING, 0,</div><div class='add'>+                             LG_MSG_GETTIMEOFDAY_FAILED,</div><div class='add'>+                             "getting time of the day failed");</div><div class='add'>+        buffer-&gt;w_index++;</div><div class='add'>+        buffer-&gt;w_index %= buffer-&gt;size_buffer;</div><div class='add'>+        // used_buffer size cannot be greater than the total buffer size</div><div class='add'>+</div><div class='add'>+        if (buffer-&gt;used_len &lt; buffer-&gt;size_buffer)</div><div class='add'>+            buffer-&gt;used_len++;</div><div class='add'>+        return buffer-&gt;w_index;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+cb_add_entry_buffer(buffer_t *buffer, void *item)</div><div class='add'>+{</div><div class='add'>+    int write_index = -1;</div><div class='add'>+</div><div class='add'>+    pthread_mutex_lock(&amp;buffer-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        write_index = __cb_add_entry_buffer(buffer, item);</div><div class='add'>+    }</div><div class='add'>+    pthread_mutex_unlock(&amp;buffer-&gt;lock);</div><div class='add'>+</div><div class='add'>+    return write_index;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+cb_buffer_show(buffer_t *buffer)</div><div class='add'>+{</div><div class='add'>+    pthread_mutex_lock(&amp;buffer-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        gf_msg_debug("circ-buff", 0,</div><div class='add'>+                     "w_index: %d, size: %" GF_PRI_SIZET " used_buffer: %d",</div><div class='add'>+                     buffer-&gt;w_index, buffer-&gt;size_buffer, buffer-&gt;used_len);</div><div class='add'>+    }</div><div class='add'>+    pthread_mutex_unlock(&amp;buffer-&gt;lock);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+cb_buffer_dump(buffer_t *buffer, void *data,</div><div class='add'>+               int(fn)(circular_buffer_t *buffer, void *data))</div><div class='add'>+{</div><div class='add'>+    int index = 0;</div><div class='add'>+    circular_buffer_t *entry = NULL;</div><div class='add'>+    int entries = 0;</div><div class='add'>+    int ul = 0;</div><div class='add'>+    int w_ind = 0;</div><div class='add'>+    int size_buff = 0;</div><div class='add'>+    int i = 0;</div><div class='add'>+</div><div class='add'>+    ul = buffer-&gt;used_len;</div><div class='add'>+    w_ind = buffer-&gt;w_index;</div><div class='add'>+    size_buff = buffer-&gt;size_buffer;</div><div class='add'>+</div><div class='add'>+    pthread_mutex_lock(&amp;buffer-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        if (buffer-&gt;use_once == _gf_false) {</div><div class='add'>+            index = (size_buff + (w_ind - ul)) % size_buff;</div><div class='add'>+            for (entries = 0; entries &lt; buffer-&gt;used_len; entries++) {</div><div class='add'>+                entry = buffer-&gt;cb[index];</div><div class='add'>+                if (entry)</div><div class='add'>+                    fn(entry, data);</div><div class='add'>+                else</div><div class='add'>+                    gf_msg_callingfn("circ-buff", GF_LOG_WARNING, 0,</div><div class='add'>+                                     LG_MSG_NULL_PTR,</div><div class='add'>+                                     "Null entry in "</div><div class='add'>+                                     "circular buffer at "</div><div class='add'>+                                     "index %d.",</div><div class='add'>+                                     index);</div><div class='add'>+</div><div class='add'>+                index++;</div><div class='add'>+                index %= buffer-&gt;size_buffer;</div><div class='add'>+            }</div><div class='add'>+        } else {</div><div class='add'>+            for (i = 0; i &lt; buffer-&gt;used_len; i++) {</div><div class='add'>+                entry = buffer-&gt;cb[i];</div><div class='add'>+                fn(entry, data);</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    pthread_mutex_unlock(&amp;buffer-&gt;lock);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+buffer_t *</div><div class='add'>+cb_buffer_new(size_t buffer_size, gf_boolean_t use_once,</div><div class='add'>+              void (*destroy_buffer_data)(void *data))</div><div class='add'>+{</div><div class='add'>+    buffer_t *buffer = NULL;</div><div class='add'>+</div><div class='add'>+    buffer = GF_CALLOC(1, sizeof(*buffer), gf_common_mt_buffer_t);</div><div class='add'>+    if (!buffer) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    buffer-&gt;cb = GF_CALLOC(buffer_size, sizeof(circular_buffer_t *),</div><div class='add'>+                           gf_common_mt_circular_buffer_t);</div><div class='add'>+    if (!buffer-&gt;cb) {</div><div class='add'>+        GF_FREE(buffer);</div><div class='add'>+        buffer = NULL;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    buffer-&gt;w_index = 0;</div><div class='add'>+    buffer-&gt;size_buffer = buffer_size;</div><div class='add'>+    buffer-&gt;use_once = use_once;</div><div class='add'>+    buffer-&gt;used_len = 0;</div><div class='add'>+    buffer-&gt;destroy_buffer_data = destroy_buffer_data;</div><div class='add'>+    pthread_mutex_init(&amp;buffer-&gt;lock, NULL);</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return buffer;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+cb_buffer_destroy(buffer_t *buffer)</div><div class='add'>+{</div><div class='add'>+    int i = 0;</div><div class='add'>+    circular_buffer_t *ptr = NULL;</div><div class='add'>+    if (buffer) {</div><div class='add'>+        if (buffer-&gt;cb) {</div><div class='add'>+            for (i = 0; i &lt; buffer-&gt;used_len; i++) {</div><div class='add'>+                ptr = buffer-&gt;cb[i];</div><div class='add'>+                if (ptr-&gt;data) {</div><div class='add'>+                    cb_destroy_data(ptr, buffer-&gt;destroy_buffer_data);</div><div class='add'>+                    ptr-&gt;data = NULL;</div><div class='add'>+                    GF_FREE(ptr);</div><div class='add'>+                }</div><div class='add'>+            }</div><div class='add'>+            GF_FREE(buffer-&gt;cb);</div><div class='add'>+        }</div><div class='add'>+        pthread_mutex_destroy(&amp;buffer-&gt;lock);</div><div class='add'>+        GF_FREE(buffer);</div><div class='add'>+    }</div><div class='add'>+}</div><div class='head'>diff --git a/libglusterfs/src/client_t.c b/libglusterfs/src/client_t.c<br/>new file mode 100644<br/>index 00000000000..9d377c3c2e1<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/libglusterfs/src/client_t.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>libglusterfs/src/client_t.c</a></div><div class='hunk'>@@ -0,0 +1,825 @@</div><div class='add'>+/*</div><div class='add'>+  Copyright (c) 2008-2013 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#include "glusterfs/glusterfs.h"</div><div class='add'>+#include "glusterfs/dict.h"</div><div class='add'>+#include "glusterfs/statedump.h"</div><div class='add'>+#include "glusterfs/client_t.h"</div><div class='add'>+#include "glusterfs/list.h"</div><div class='add'>+#include "glusterfs/libglusterfs-messages.h"</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+gf_client_chain_client_entries(cliententry_t *entries, uint32_t startidx,</div><div class='add'>+                               uint32_t endcount)</div><div class='add'>+{</div><div class='add'>+    uint32_t i = 0;</div><div class='add'>+</div><div class='add'>+    if (!entries) {</div><div class='add'>+        gf_msg_callingfn("client_t", GF_LOG_WARNING, EINVAL, LG_MSG_INVALID_ARG,</div><div class='add'>+                         "!entries");</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Chain only till the second to last entry because we want to</div><div class='add'>+     * ensure that the last entry has GF_CLIENTTABLE_END.</div><div class='add'>+     */</div><div class='add'>+    for (i = startidx; i &lt; (endcount - 1); i++)</div><div class='add'>+        entries[i].next_free = i + 1;</div><div class='add'>+</div><div class='add'>+    /* i has already been incremented up to the last entry. */</div><div class='add'>+    entries[i].next_free = GF_CLIENTTABLE_END;</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+gf_client_clienttable_expand(clienttable_t *clienttable, uint32_t nr)</div><div class='add'>+{</div><div class='add'>+    cliententry_t *oldclients = NULL;</div><div class='add'>+    uint32_t oldmax_clients = -1;</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    if (clienttable == NULL || nr &lt;= clienttable-&gt;max_clients) {</div><div class='add'>+        gf_msg_callingfn("client_t", GF_LOG_ERROR, EINVAL, LG_MSG_INVALID_ARG,</div><div class='add'>+                         "invalid argument");</div><div class='add'>+        ret = EINVAL;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    oldclients = clienttable-&gt;cliententries;</div><div class='add'>+    oldmax_clients = clienttable-&gt;max_clients;</div><div class='add'>+</div><div class='add'>+    clienttable-&gt;cliententries = GF_CALLOC(nr, sizeof(cliententry_t),</div><div class='add'>+                                           gf_common_mt_cliententry_t);</div><div class='add'>+    if (!clienttable-&gt;cliententries) {</div><div class='add'>+        clienttable-&gt;cliententries = oldclients;</div><div class='add'>+        ret = 0;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    clienttable-&gt;max_clients = nr;</div><div class='add'>+</div><div class='add'>+    if (oldclients) {</div><div class='add'>+        uint32_t cpy = oldmax_clients * sizeof(cliententry_t);</div><div class='add'>+        memcpy(clienttable-&gt;cliententries, oldclients, cpy);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    gf_client_chain_client_entries(clienttable-&gt;cliententries, oldmax_clients,</div><div class='add'>+                                   clienttable-&gt;max_clients);</div><div class='add'>+</div><div class='add'>+    /* Now that expansion is done, we must update the client list</div><div class='add'>+     * head pointer so that the client allocation functions can continue</div><div class='add'>+     * using the expanded table.</div><div class='add'>+     */</div><div class='add'>+    clienttable-&gt;first_free = oldmax_clients;</div><div class='add'>+    GF_FREE(oldclients);</div><div class='add'>+    ret = 0;</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+clienttable_t *</div><div class='add'>+gf_clienttable_alloc(void)</div><div class='add'>+{</div><div class='add'>+    clienttable_t *clienttable = NULL;</div><div class='add'>+    int result = 0;</div><div class='add'>+</div><div class='add'>+    clienttable = GF_CALLOC(1, sizeof(clienttable_t),</div><div class='add'>+                            gf_common_mt_clienttable_t);</div><div class='add'>+    if (!clienttable)</div><div class='add'>+        return NULL;</div><div class='add'>+</div><div class='add'>+    LOCK_INIT(&amp;clienttable-&gt;lock);</div><div class='add'>+</div><div class='add'>+    result = gf_client_clienttable_expand(clienttable,</div><div class='add'>+                                          GF_CLIENTTABLE_INITIAL_SIZE);</div><div class='add'>+    if (result != 0) {</div><div class='add'>+        gf_msg("client_t", GF_LOG_ERROR, 0, LG_MSG_EXPAND_CLIENT_TABLE_FAILED,</div><div class='add'>+               "gf_client_clienttable_expand failed");</div><div class='add'>+        GF_FREE(clienttable);</div><div class='add'>+        return NULL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return clienttable;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+ * Increments ref.bind if the client is already present or creates a new</div><div class='add'>+ * client with ref.bind = 1,ref.count = 1 it signifies that</div><div class='add'>+ * as long as ref.bind is &gt; 0 client should be alive.</div><div class='add'>+ */</div><div class='add'>+client_t *</div><div class='add'>+gf_client_get(xlator_t *this, client_auth_data_t *cred, char *client_uid,</div><div class='add'>+              char *subdir_mount)</div><div class='add'>+{</div><div class='add'>+    client_t *client = NULL;</div><div class='add'>+    cliententry_t *cliententry = NULL;</div><div class='add'>+    clienttable_t *clienttable = NULL;</div><div class='add'>+    unsigned int i = 0;</div><div class='add'>+</div><div class='add'>+    if (this == NULL || client_uid == NULL) {</div><div class='add'>+        gf_msg_callingfn("client_t", GF_LOG_ERROR, EINVAL, LG_MSG_INVALID_ARG,</div><div class='add'>+                         "invalid argument");</div><div class='add'>+        errno = EINVAL;</div><div class='add'>+        return NULL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    clienttable = this-&gt;ctx-&gt;clienttable;</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;clienttable-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        for (; i &lt; clienttable-&gt;max_clients; i++) {</div><div class='add'>+            client = clienttable-&gt;cliententries[i].client;</div><div class='add'>+            if (client == NULL)</div><div class='add'>+                continue;</div><div class='add'>+            /*</div><div class='add'>+             * look for matching client_uid, _and_</div><div class='add'>+             * if auth was used, matching auth flavour and data</div><div class='add'>+             */</div><div class='add'>+            if (strcmp(client_uid, client-&gt;client_uid) == 0 &amp;&amp;</div><div class='add'>+                (cred-&gt;flavour &amp;&amp; (cred-&gt;flavour == client-&gt;auth.flavour &amp;&amp;</div><div class='add'>+                                   (size_t)cred-&gt;datalen == client-&gt;auth.len &amp;&amp;</div><div class='add'>+                                   memcmp(cred-&gt;authdata, client-&gt;auth.data,</div><div class='add'>+                                          client-&gt;auth.len) == 0))) {</div><div class='add'>+                GF_ATOMIC_INC(client-&gt;bind);</div><div class='add'>+                goto unlock;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        client = GF_CALLOC(1, sizeof(client_t), gf_common_mt_client_t);</div><div class='add'>+        if (client == NULL) {</div><div class='add'>+            errno = ENOMEM;</div><div class='add'>+            goto unlock;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        client-&gt;this = this;</div><div class='add'>+        if (subdir_mount != NULL)</div><div class='add'>+            client-&gt;subdir_mount = gf_strdup(subdir_mount);</div><div class='add'>+</div><div class='add'>+        LOCK_INIT(&amp;client-&gt;scratch_ctx.lock);</div><div class='add'>+</div><div class='add'>+        client-&gt;client_uid = gf_strdup(client_uid);</div><div class='add'>+        if (client-&gt;client_uid == NULL) {</div><div class='add'>+            GF_FREE(client);</div><div class='add'>+            client = NULL;</div><div class='add'>+            errno = ENOMEM;</div><div class='add'>+            goto unlock;</div><div class='add'>+        }</div><div class='add'>+        client-&gt;scratch_ctx.count = GF_CLIENTCTX_INITIAL_SIZE;</div><div class='add'>+        client-&gt;scratch_ctx.ctx = GF_CALLOC(GF_CLIENTCTX_INITIAL_SIZE,</div><div class='add'>+                                            sizeof(struct client_ctx),</div><div class='add'>+                                            gf_common_mt_client_ctx);</div><div class='add'>+        if (client-&gt;scratch_ctx.ctx == NULL) {</div><div class='add'>+            GF_FREE(client-&gt;client_uid);</div><div class='add'>+            GF_FREE(client);</div><div class='add'>+            client = NULL;</div><div class='add'>+            errno = ENOMEM;</div><div class='add'>+            goto unlock;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        GF_ATOMIC_INIT(client-&gt;bind, 1);</div><div class='add'>+        GF_ATOMIC_INIT(client-&gt;count, 1);</div><div class='add'>+        GF_ATOMIC_INIT(client-&gt;fd_cnt, 0);</div><div class='add'>+</div><div class='add'>+        client-&gt;auth.flavour = cred-&gt;flavour;</div><div class='add'>+        if (cred-&gt;flavour) {</div><div class='add'>+            client-&gt;auth.data = GF_MALLOC(cred-&gt;datalen, gf_common_mt_client_t);</div><div class='add'>+            if (client-&gt;auth.data == NULL) {</div><div class='add'>+                GF_FREE(client-&gt;scratch_ctx.ctx);</div><div class='add'>+                GF_FREE(client-&gt;client_uid);</div><div class='add'>+                GF_FREE(client);</div><div class='add'>+                client = NULL;</div><div class='add'>+                errno = ENOMEM;</div><div class='add'>+                goto unlock;</div><div class='add'>+            }</div><div class='add'>+            memcpy(client-&gt;auth.data, cred-&gt;authdata, cred-&gt;datalen);</div><div class='add'>+            client-&gt;auth.len = cred-&gt;datalen;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        client-&gt;tbl_index = clienttable-&gt;first_free;</div><div class='add'>+        cliententry = &amp;clienttable-&gt;cliententries[clienttable-&gt;first_free];</div><div class='add'>+        if (cliententry-&gt;next_free == GF_CLIENTTABLE_END) {</div><div class='add'>+            int result = gf_client_clienttable_expand(</div><div class='add'>+                clienttable,</div><div class='add'>+                clienttable-&gt;max_clients + GF_CLIENTTABLE_INITIAL_SIZE);</div><div class='add'>+            if (result != 0) {</div><div class='add'>+                GF_FREE(client-&gt;scratch_ctx.ctx);</div><div class='add'>+                GF_FREE(client-&gt;client_uid);</div><div class='add'>+                GF_FREE(client);</div><div class='add'>+                client = NULL;</div><div class='add'>+                errno = result;</div><div class='add'>+                goto unlock;</div><div class='add'>+            }</div><div class='add'>+            cliententry = &amp;clienttable-&gt;cliententries[client-&gt;tbl_index];</div><div class='add'>+            cliententry-&gt;next_free = clienttable-&gt;first_free;</div><div class='add'>+        }</div><div class='add'>+        cliententry-&gt;client = client;</div><div class='add'>+        clienttable-&gt;first_free = cliententry-&gt;next_free;</div><div class='add'>+        cliententry-&gt;next_free = GF_CLIENTENTRY_ALLOCATED;</div><div class='add'>+    }</div><div class='add'>+unlock:</div><div class='add'>+    UNLOCK(&amp;clienttable-&gt;lock);</div><div class='add'>+</div><div class='add'>+    if (client)</div><div class='add'>+        gf_msg_callingfn("client_t", GF_LOG_DEBUG, 0, LG_MSG_BIND_REF,</div><div class='add'>+                         "%s: bind_ref: %" GF_PRI_ATOMIC</div><div class='add'>+                         ", ref: "</div><div class='add'>+                         "%" GF_PRI_ATOMIC,</div><div class='add'>+                         client-&gt;client_uid, GF_ATOMIC_GET(client-&gt;bind),</div><div class='add'>+                         GF_ATOMIC_GET(client-&gt;count));</div><div class='add'>+    return client;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+gf_client_put(client_t *client, gf_boolean_t *detached)</div><div class='add'>+{</div><div class='add'>+    gf_boolean_t unref = _gf_false;</div><div class='add'>+    int bind_ref;</div><div class='add'>+</div><div class='add'>+    if (client == NULL)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    if (detached)</div><div class='add'>+        *detached = _gf_false;</div><div class='add'>+</div><div class='add'>+    bind_ref = GF_ATOMIC_DEC(client-&gt;bind);</div><div class='add'>+    if (bind_ref == 0)</div><div class='add'>+        unref = _gf_true;</div><div class='add'>+</div><div class='add'>+    gf_msg_callingfn("client_t", GF_LOG_DEBUG, 0, LG_MSG_BIND_REF,</div><div class='add'>+                     "%s: "</div><div class='add'>+                     "bind_ref: %" GF_PRI_ATOMIC ", ref: %" GF_PRI_ATOMIC</div><div class='add'>+                     ", "</div><div class='add'>+                     "unref: %d",</div><div class='add'>+                     client-&gt;client_uid, GF_ATOMIC_GET(client-&gt;bind),</div><div class='add'>+                     GF_ATOMIC_GET(client-&gt;count), unref);</div><div class='add'>+    if (unref) {</div><div class='add'>+        if (detached)</div><div class='add'>+            *detached = _gf_true;</div><div class='add'>+        gf_client_unref(client);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+client_t *</div><div class='add'>+gf_client_ref(client_t *client)</div><div class='add'>+{</div><div class='add'>+    if (!client) {</div><div class='add'>+        gf_msg_callingfn("client_t", GF_LOG_ERROR, EINVAL, LG_MSG_INVALID_ARG,</div><div class='add'>+                         "null client");</div><div class='add'>+        return NULL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    GF_ATOMIC_INC(client-&gt;count);</div><div class='add'>+    gf_msg_callingfn("client_t", GF_LOG_DEBUG, 0, LG_MSG_REF_COUNT,</div><div class='add'>+                     "%s: "</div><div class='add'>+                     "ref-count %" GF_PRI_ATOMIC,</div><div class='add'>+                     client-&gt;client_uid, GF_ATOMIC_GET(client-&gt;count));</div><div class='add'>+    return client;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf_client_destroy_recursive(xlator_t *xl, client_t *client)</div><div class='add'>+{</div><div class='add'>+    xlator_list_t *trav;</div><div class='add'>+</div><div class='add'>+    if (!xl-&gt;call_cleanup &amp;&amp; xl-&gt;cbks-&gt;client_destroy) {</div><div class='add'>+        xl-&gt;cbks-&gt;client_destroy(xl, client);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    for (trav = xl-&gt;children; trav; trav = trav-&gt;next) {</div><div class='add'>+        gf_client_destroy_recursive(trav-&gt;xlator, client);</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+client_destroy(client_t *client)</div><div class='add'>+{</div><div class='add'>+    clienttable_t *clienttable = NULL;</div><div class='add'>+    glusterfs_graph_t *gtrav = NULL;</div><div class='add'>+</div><div class='add'>+    if (client == NULL) {</div><div class='add'>+        gf_msg_callingfn("xlator", GF_LOG_ERROR, EINVAL, LG_MSG_INVALID_ARG,</div><div class='add'>+                         "invalid argument");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    clienttable = client-&gt;this-&gt;ctx-&gt;clienttable;</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;clienttable-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        clienttable-&gt;cliententries[client-&gt;tbl_index].client = NULL;</div><div class='add'>+        clienttable-&gt;cliententries[client-&gt;tbl_index]</div><div class='add'>+            .next_free = clienttable-&gt;first_free;</div><div class='add'>+        clienttable-&gt;first_free = client-&gt;tbl_index;</div><div class='add'>+    }</div><div class='add'>+    UNLOCK(&amp;clienttable-&gt;lock);</div><div class='add'>+</div><div class='add'>+    list_for_each_entry(gtrav, &amp;client-&gt;this-&gt;ctx-&gt;graphs, list)</div><div class='add'>+    {</div><div class='add'>+        gf_client_destroy_recursive(gtrav-&gt;top, client);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (client-&gt;subdir_inode)</div><div class='add'>+        inode_unref(client-&gt;subdir_inode);</div><div class='add'>+</div><div class='add'>+    LOCK_DESTROY(&amp;client-&gt;scratch_ctx.lock);</div><div class='add'>+</div><div class='add'>+    GF_FREE(client-&gt;auth.data);</div><div class='add'>+    GF_FREE(client-&gt;auth.username);</div><div class='add'>+    GF_FREE(client-&gt;auth.passwd);</div><div class='add'>+    GF_FREE(client-&gt;scratch_ctx.ctx);</div><div class='add'>+    GF_FREE(client-&gt;client_uid);</div><div class='add'>+    GF_FREE(client-&gt;subdir_mount);</div><div class='add'>+    GF_FREE(client-&gt;client_name);</div><div class='add'>+    GF_FREE(client);</div><div class='add'>+out:</div><div class='add'>+    return;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+gf_client_disconnect_recursive(xlator_t *xl, client_t *client)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+    xlator_list_t *trav;</div><div class='add'>+</div><div class='add'>+    if (!xl-&gt;call_cleanup &amp;&amp; xl-&gt;cbks-&gt;client_disconnect) {</div><div class='add'>+        ret = xl-&gt;cbks-&gt;client_disconnect(xl, client);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    for (trav = xl-&gt;children; trav; trav = trav-&gt;next) {</div><div class='add'>+        ret |= gf_client_disconnect_recursive(trav-&gt;xlator, client);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+gf_client_disconnect(client_t *client)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+    glusterfs_graph_t *gtrav = NULL;</div><div class='add'>+</div><div class='add'>+    list_for_each_entry(gtrav, &amp;client-&gt;this-&gt;ctx-&gt;graphs, list)</div><div class='add'>+    {</div><div class='add'>+        ret |= gf_client_disconnect_recursive(gtrav-&gt;top, client);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+gf_client_unref(client_t *client)</div><div class='add'>+{</div><div class='add'>+    uint64_t refcount;</div><div class='add'>+</div><div class='add'>+    if (!client) {</div><div class='add'>+        gf_msg_callingfn("client_t", GF_LOG_ERROR, EINVAL, LG_MSG_INVALID_ARG,</div><div class='add'>+                         "client is NULL");</div><div class='add'>+        return;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    refcount = GF_ATOMIC_DEC(client-&gt;count);</div><div class='add'>+    gf_msg_callingfn("client_t", GF_LOG_DEBUG, 0, LG_MSG_REF_COUNT,</div><div class='add'>+                     "%s: "</div><div class='add'>+                     "ref-count %" GF_PRI_ATOMIC,</div><div class='add'>+                     client-&gt;client_uid, refcount);</div><div class='add'>+    if (refcount == 0) {</div><div class='add'>+        gf_msg(THIS-&gt;name, GF_LOG_INFO, 0, LG_MSG_DISCONNECT_CLIENT,</div><div class='add'>+               "Shutting down connection %s", client-&gt;client_uid);</div><div class='add'>+        client_destroy(client);</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+__client_ctx_get_int(client_t *client, void *key, void **value)</div><div class='add'>+{</div><div class='add'>+    int index = 0;</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    for (index = 0; index &lt; client-&gt;scratch_ctx.count; index++) {</div><div class='add'>+        if (client-&gt;scratch_ctx.ctx[index].ctx_key == key)</div><div class='add'>+            break;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (index == client-&gt;scratch_ctx.count) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (value)</div><div class='add'>+        *value = client-&gt;scratch_ctx.ctx[index].ctx_value;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+__client_ctx_set_int(client_t *client, void *key, void *value)</div><div class='add'>+{</div><div class='add'>+    int index = 0;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    int set_idx = -1;</div><div class='add'>+</div><div class='add'>+    for (index = 0; index &lt; client-&gt;scratch_ctx.count; index++) {</div><div class='add'>+        if (!client-&gt;scratch_ctx.ctx[index].ctx_key) {</div><div class='add'>+            if (set_idx == -1)</div><div class='add'>+                set_idx = index;</div><div class='add'>+            /* don't break, to check if key already exists</div><div class='add'>+               further on */</div><div class='add'>+        }</div><div class='add'>+        if (client-&gt;scratch_ctx.ctx[index].ctx_key == key) {</div><div class='add'>+            set_idx = index;</div><div class='add'>+            break;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (set_idx == -1) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    client-&gt;scratch_ctx.ctx[set_idx].ctx_key = key;</div><div class='add'>+    client-&gt;scratch_ctx.ctx[set_idx].ctx_value = value;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*will return success with old value if exist*/</div><div class='add'>+void *</div><div class='add'>+client_ctx_set(client_t *client, void *key, void *value)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+    void *ret_value = NULL;</div><div class='add'>+</div><div class='add'>+    if (!client || !key || !value)</div><div class='add'>+        return NULL;</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;client-&gt;scratch_ctx.lock);</div><div class='add'>+    {</div><div class='add'>+        ret = __client_ctx_get_int(client, key, &amp;ret_value);</div><div class='add'>+        if (!ret &amp;&amp; ret_value) {</div><div class='add'>+            UNLOCK(&amp;client-&gt;scratch_ctx.lock);</div><div class='add'>+            return ret_value;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        ret = __client_ctx_set_int(client, key, value);</div><div class='add'>+    }</div><div class='add'>+    UNLOCK(&amp;client-&gt;scratch_ctx.lock);</div><div class='add'>+</div><div class='add'>+    if (ret)</div><div class='add'>+        return NULL;</div><div class='add'>+    return value;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+client_ctx_get(client_t *client, void *key, void **value)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    if (!client || !key)</div><div class='add'>+        return -1;</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;client-&gt;scratch_ctx.lock);</div><div class='add'>+    {</div><div class='add'>+        ret = __client_ctx_get_int(client, key, value);</div><div class='add'>+    }</div><div class='add'>+    UNLOCK(&amp;client-&gt;scratch_ctx.lock);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+__client_ctx_del_int(client_t *client, void *key, void **value)</div><div class='add'>+{</div><div class='add'>+    int index = 0;</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    for (index = 0; index &lt; client-&gt;scratch_ctx.count; index++) {</div><div class='add'>+        if (client-&gt;scratch_ctx.ctx[index].ctx_key == key)</div><div class='add'>+            break;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (index == client-&gt;scratch_ctx.count) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (value)</div><div class='add'>+        *value = client-&gt;scratch_ctx.ctx[index].ctx_value;</div><div class='add'>+</div><div class='add'>+    client-&gt;scratch_ctx.ctx[index].ctx_key = 0;</div><div class='add'>+    client-&gt;scratch_ctx.ctx[index].ctx_value = 0;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+client_ctx_del(client_t *client, void *key, void **value)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    if (!client || !key)</div><div class='add'>+        return -1;</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;client-&gt;scratch_ctx.lock);</div><div class='add'>+    {</div><div class='add'>+        ret = __client_ctx_del_int(client, key, value);</div><div class='add'>+    }</div><div class='add'>+    UNLOCK(&amp;client-&gt;scratch_ctx.lock);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+client_ctx_dump(client_t *client, char *prefix)</div><div class='add'>+{</div><div class='add'>+#if 0 /* TBD, FIXME */</div><div class='add'>+        struct client_ctx   *client_ctx = NULL;</div><div class='add'>+        xlator_t            *xl = NULL;</div><div class='add'>+        int                  i = 0;</div><div class='add'>+</div><div class='add'>+        if ((client == NULL) || (client-&gt;ctx == NULL)) {</div><div class='add'>+                goto out;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        LOCK (&amp;client-&gt;ctx_lock);</div><div class='add'>+        if (client-&gt;ctx != NULL) {</div><div class='add'>+                client_ctx = GF_CALLOC (client-&gt;inode-&gt;table-&gt;xl-&gt;graph-&gt;ctx_count,</div><div class='add'>+                                        sizeof (*client_ctx),</div><div class='add'>+                                        gf_common_mt_client_ctx);</div><div class='add'>+                if (client_ctx == NULL) {</div><div class='add'>+                        goto unlock;</div><div class='add'>+                }</div><div class='add'>+</div><div class='add'>+                for (i = 0; i &lt; client-&gt;inode-&gt;table-&gt;xl-&gt;graph-&gt;ctx_count; i++) {</div><div class='add'>+                        client_ctx[i] = client-&gt;ctx[i];</div><div class='add'>+                }</div><div class='add'>+        }</div><div class='add'>+unlock:</div><div class='add'>+        UNLOCK (&amp;client-&gt;ctx_lock);</div><div class='add'>+</div><div class='add'>+        if (client_ctx == NULL) {</div><div class='add'>+                goto out;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        for (i = 0; i &lt; client-&gt;inode-&gt;table-&gt;xl-&gt;graph-&gt;ctx_count; i++) {</div><div class='add'>+                if (client_ctx[i].xl_key) {</div><div class='add'>+                        xl = (xlator_t *)(long)client_ctx[i].xl_key;</div><div class='add'>+                        if (xl-&gt;dumpops &amp;&amp; xl-&gt;dumpops-&gt;clientctx)</div><div class='add'>+                                xl-&gt;dumpops-&gt;clientctx (xl, client);</div><div class='add'>+                }</div><div class='add'>+        }</div><div class='add'>+out:</div><div class='add'>+        GF_FREE (client_ctx);</div><div class='add'>+#endif</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+ * the following functions are here to preserve legacy behavior of the</div><div class='add'>+ * protocol/server xlator dump, but perhaps they should just be folded</div><div class='add'>+ * into the client dump instead?</div><div class='add'>+ */</div><div class='add'>+int</div><div class='add'>+gf_client_dump_fdtables_to_dict(xlator_t *this, dict_t *dict)</div><div class='add'>+{</div><div class='add'>+    clienttable_t *clienttable = NULL;</div><div class='add'>+    int count = 0;</div><div class='add'>+    int ret = -1;</div><div class='add'>+#ifdef NOTYET</div><div class='add'>+    client_t *client = NULL;</div><div class='add'>+    char key[GF_DUMP_MAX_BUF_LEN] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+    GF_VALIDATE_OR_GOTO(THIS-&gt;name, this, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, dict, out);</div><div class='add'>+</div><div class='add'>+    clienttable = this-&gt;ctx-&gt;clienttable;</div><div class='add'>+</div><div class='add'>+    if (!clienttable)</div><div class='add'>+        return -1;</div><div class='add'>+</div><div class='add'>+#ifdef NOTYET</div><div class='add'>+    ret = TRY_LOCK(&amp;clienttable-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_msg("client_t", GF_LOG_WARNING, 0, LG_MSG_LOCK_FAILED,</div><div class='add'>+                   "Unable to acquire lock");</div><div class='add'>+            return -1;</div><div class='add'>+        }</div><div class='add'>+        for (; count &lt; clienttable-&gt;max_clients; count++) {</div><div class='add'>+            if (GF_CLIENTENTRY_ALLOCATED !=</div><div class='add'>+                clienttable-&gt;cliententries[count].next_free)</div><div class='add'>+                continue;</div><div class='add'>+            client = clienttable-&gt;cliententries[count].client;</div><div class='add'>+            if (client-&gt;bound_xl &amp;&amp;</div><div class='add'>+                !strcmp(client-&gt;bound_xl-&gt;name, this-&gt;name)) {</div><div class='add'>+                snprintf(key, sizeof(key), "conn%d", count++);</div><div class='add'>+                fdtable_dump_to_dict(client-&gt;server_ctx.fdtable, key, dict);</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    UNLOCK(&amp;clienttable-&gt;lock);</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+    ret = dict_set_int32(dict, "conncount", count);</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+gf_client_dump_fdtables(xlator_t *this)</div><div class='add'>+{</div><div class='add'>+    client_t *client = NULL;</div><div class='add'>+    clienttable_t *clienttable = NULL;</div><div class='add'>+    int count = 1;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    char key[GF_DUMP_MAX_BUF_LEN] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    GF_VALIDATE_OR_GOTO(THIS-&gt;name, this, out);</div><div class='add'>+</div><div class='add'>+    clienttable = this-&gt;ctx-&gt;clienttable;</div><div class='add'>+</div><div class='add'>+    if (!clienttable)</div><div class='add'>+        return -1;</div><div class='add'>+</div><div class='add'>+    ret = TRY_LOCK(&amp;clienttable-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_msg("client_t", GF_LOG_WARNING, 0, LG_MSG_LOCK_FAILED,</div><div class='add'>+                   "Unable to acquire lock");</div><div class='add'>+            return -1;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        for (; count &lt; clienttable-&gt;max_clients; count++) {</div><div class='add'>+            if (GF_CLIENTENTRY_ALLOCATED !=</div><div class='add'>+                clienttable-&gt;cliententries[count].next_free)</div><div class='add'>+                continue;</div><div class='add'>+            client = clienttable-&gt;cliententries[count].client;</div><div class='add'>+            if (client-&gt;client_uid) {</div><div class='add'>+                gf_proc_dump_build_key(key, "conn", "%d.id", count);</div><div class='add'>+                gf_proc_dump_write(key, "%s", client-&gt;client_uid);</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            if (client-&gt;subdir_mount) {</div><div class='add'>+                gf_proc_dump_build_key(key, "conn", "%d.subdir", count);</div><div class='add'>+                gf_proc_dump_write(key, "%s", client-&gt;subdir_mount);</div><div class='add'>+            }</div><div class='add'>+            gf_proc_dump_build_key(key, "conn", "%d.ref", count);</div><div class='add'>+            gf_proc_dump_write(key, "%" GF_PRI_ATOMIC,</div><div class='add'>+                               GF_ATOMIC_GET(client-&gt;count));</div><div class='add'>+            if (client-&gt;bound_xl) {</div><div class='add'>+                gf_proc_dump_build_key(key, "conn", "%d.bound_xl", count);</div><div class='add'>+                gf_proc_dump_write(key, "%s", client-&gt;bound_xl-&gt;name);</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+#ifdef NOTYET</div><div class='add'>+            gf_proc_dump_build_key(key, "conn", "%d.id", count);</div><div class='add'>+            fdtable_dump(client-&gt;server_ctx.fdtable, key);</div><div class='add'>+#endif</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    UNLOCK(&amp;clienttable-&gt;lock);</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+gf_client_dump_inodes_to_dict(xlator_t *this, dict_t *dict)</div><div class='add'>+{</div><div class='add'>+    client_t *client = NULL;</div><div class='add'>+    clienttable_t *clienttable = NULL;</div><div class='add'>+    xlator_t *prev_bound_xl = NULL;</div><div class='add'>+    char key[32] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int count = 0;</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    GF_VALIDATE_OR_GOTO(THIS-&gt;name, this, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, dict, out);</div><div class='add'>+</div><div class='add'>+    clienttable = this-&gt;ctx-&gt;clienttable;</div><div class='add'>+</div><div class='add'>+    if (!clienttable)</div><div class='add'>+        return -1;</div><div class='add'>+</div><div class='add'>+    ret = LOCK(&amp;clienttable-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_msg("client_t", GF_LOG_WARNING, 0, LG_MSG_LOCK_FAILED,</div><div class='add'>+                   "Unable to acquire lock");</div><div class='add'>+            return -1;</div><div class='add'>+        }</div><div class='add'>+        for (; count &lt; clienttable-&gt;max_clients; count++) {</div><div class='add'>+            if (GF_CLIENTENTRY_ALLOCATED !=</div><div class='add'>+                clienttable-&gt;cliententries[count].next_free)</div><div class='add'>+                continue;</div><div class='add'>+            client = clienttable-&gt;cliententries[count].client;</div><div class='add'>+            if (!strcmp(client-&gt;bound_xl-&gt;name, this-&gt;name)) {</div><div class='add'>+                if (client-&gt;bound_xl &amp;&amp; client-&gt;bound_xl-&gt;itable) {</div><div class='add'>+                    /* Presently every brick contains only</div><div class='add'>+                     * one bound_xl for all connections.</div><div class='add'>+                     * This will lead to duplicating of</div><div class='add'>+                     *  the inode lists, if listing is</div><div class='add'>+                     * done for every connection. This</div><div class='add'>+                     * simple check prevents duplication</div><div class='add'>+                     * in the present case. If need arises</div><div class='add'>+                     * the check can be improved.</div><div class='add'>+                     */</div><div class='add'>+                    if (client-&gt;bound_xl == prev_bound_xl)</div><div class='add'>+                        continue;</div><div class='add'>+                    prev_bound_xl = client-&gt;bound_xl;</div><div class='add'>+</div><div class='add'>+                    snprintf(key, sizeof(key), "conn%d", count);</div><div class='add'>+                    inode_table_dump_to_dict(client-&gt;bound_xl-&gt;itable, key,</div><div class='add'>+                                             dict);</div><div class='add'>+                }</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    UNLOCK(&amp;clienttable-&gt;lock);</div><div class='add'>+</div><div class='add'>+    ret = dict_set_int32(dict, "conncount", count);</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (prev_bound_xl)</div><div class='add'>+        prev_bound_xl = NULL;</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+gf_client_dump_inodes(xlator_t *this)</div><div class='add'>+{</div><div class='add'>+    client_t *client = NULL;</div><div class='add'>+    clienttable_t *clienttable = NULL;</div><div class='add'>+    xlator_t *prev_bound_xl = NULL;</div><div class='add'>+    int count = 0;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    char key[GF_DUMP_MAX_BUF_LEN] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    GF_VALIDATE_OR_GOTO(THIS-&gt;name, this, out);</div><div class='add'>+</div><div class='add'>+    clienttable = this-&gt;ctx-&gt;clienttable;</div><div class='add'>+</div><div class='add'>+    if (!clienttable)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    ret = TRY_LOCK(&amp;clienttable-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_msg("client_t", GF_LOG_WARNING, 0, LG_MSG_LOCK_FAILED,</div><div class='add'>+                   "Unable to acquire lock");</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        for (; count &lt; clienttable-&gt;max_clients; count++) {</div><div class='add'>+            if (GF_CLIENTENTRY_ALLOCATED !=</div><div class='add'>+                clienttable-&gt;cliententries[count].next_free)</div><div class='add'>+                continue;</div><div class='add'>+            client = clienttable-&gt;cliententries[count].client;</div><div class='add'>+            if (client-&gt;bound_xl &amp;&amp; client-&gt;bound_xl-&gt;itable) {</div><div class='add'>+                /* Presently every brick contains only</div><div class='add'>+                 * one bound_xl for all connections.</div><div class='add'>+                 * This will lead to duplicating of</div><div class='add'>+                 * the inode lists, if listing is</div><div class='add'>+                 * done for every connection. This</div><div class='add'>+                 * simple check prevents duplication</div><div class='add'>+                 * in the present case. If need arises</div><div class='add'>+                 * the check can be improved.</div><div class='add'>+                 */</div><div class='add'>+                if (client-&gt;bound_xl == prev_bound_xl)</div><div class='add'>+                    continue;</div><div class='add'>+                prev_bound_xl = client-&gt;bound_xl;</div><div class='add'>+</div><div class='add'>+                gf_proc_dump_build_key(key, "conn", "%d.bound_xl.%s", count,</div><div class='add'>+                                       client-&gt;bound_xl-&gt;name);</div><div class='add'>+                inode_table_dump(client-&gt;bound_xl-&gt;itable, key);</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    UNLOCK(&amp;clienttable-&gt;lock);</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='head'>diff --git a/libglusterfs/src/cluster-syncop.c b/libglusterfs/src/cluster-syncop.c<br/>new file mode 100644<br/>index 00000000000..6ee89ddfdcf<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/libglusterfs/src/cluster-syncop.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>libglusterfs/src/cluster-syncop.c</a></div><div class='hunk'>@@ -0,0 +1,1261 @@</div><div class='add'>+/*</div><div class='add'>+  Copyright (c) 2015 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+/* Perform fop on all subvolumes represented by list[] array and wait</div><div class='add'>+   for all callbacks to return */</div><div class='add'>+</div><div class='add'>+/* NOTE: Cluster-syncop, like syncop blocks the executing thread until the</div><div class='add'>+ * responses are gathered if it is not executed as part of synctask. So it</div><div class='add'>+ * shouldn't be invoked in epoll worker thread */</div><div class='add'>+#include "glusterfs/cluster-syncop.h"</div><div class='add'>+#include "glusterfs/defaults.h"</div><div class='add'>+</div><div class='add'>+#define FOP_ONLIST(subvols, on, numsubvols, replies, output, frame, fop,       \</div><div class='add'>+                   args...)                                                    \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        int __i = 0;                                                           \</div><div class='add'>+        int __count = 0;                                                       \</div><div class='add'>+        cluster_local_t __local = {                                            \</div><div class='add'>+            0,                                                                 \</div><div class='add'>+        };                                                                     \</div><div class='add'>+        void *__old_local = frame-&gt;local;                                      \</div><div class='add'>+                                                                               \</div><div class='add'>+        __local.replies = replies;                                             \</div><div class='add'>+        memset(output, 0, numsubvols);                                         \</div><div class='add'>+        cluster_replies_wipe(replies, numsubvols);                             \</div><div class='add'>+        for (__i = 0; __i &lt; numsubvols; __i++)                                 \</div><div class='add'>+            INIT_LIST_HEAD(&amp;replies[__i].entries.list);                        \</div><div class='add'>+        if (syncbarrier_init(&amp;__local.barrier))                                \</div><div class='add'>+            break;                                                             \</div><div class='add'>+        frame-&gt;local = &amp;__local;                                               \</div><div class='add'>+        for (__i = 0; __i &lt; numsubvols; __i++) {                               \</div><div class='add'>+            if (on[__i]) {                                                     \</div><div class='add'>+                __count++;                                                     \</div><div class='add'>+            }                                                                  \</div><div class='add'>+        }                                                                      \</div><div class='add'>+        __local.barrier.waitfor = __count;                                     \</div><div class='add'>+        for (__i = 0; __i &lt; numsubvols; __i++) {                               \</div><div class='add'>+            if (!on[__i])                                                      \</div><div class='add'>+                continue;                                                      \</div><div class='add'>+            STACK_WIND_COOKIE(frame, cluster_##fop##_cbk, (void *)(long)__i,   \</div><div class='add'>+                              subvols[__i], subvols[__i]-&gt;fops-&gt;fop, args);    \</div><div class='add'>+        }                                                                      \</div><div class='add'>+        syncbarrier_wait(&amp;__local.barrier, __count);                           \</div><div class='add'>+        syncbarrier_destroy(&amp;__local.barrier);                                 \</div><div class='add'>+        frame-&gt;local = __old_local;                                            \</div><div class='add'>+        STACK_RESET(frame-&gt;root);                                              \</div><div class='add'>+    } while (0)</div><div class='add'>+</div><div class='add'>+#define FOP_SEQ(subvols, on, numsubvols, replies, output, frame, fop, args...) \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        int __i = 0;                                                           \</div><div class='add'>+                                                                               \</div><div class='add'>+        cluster_local_t __local = {                                            \</div><div class='add'>+            0,                                                                 \</div><div class='add'>+        };                                                                     \</div><div class='add'>+        void *__old_local = frame-&gt;local;                                      \</div><div class='add'>+        __local.replies = replies;                                             \</div><div class='add'>+        memset(output, 0, numsubvols);                                         \</div><div class='add'>+        cluster_replies_wipe(replies, numsubvols);                             \</div><div class='add'>+        for (__i = 0; __i &lt; numsubvols; __i++)                                 \</div><div class='add'>+            INIT_LIST_HEAD(&amp;replies[__i].entries.list);                        \</div><div class='add'>+        if (syncbarrier_init(&amp;__local.barrier))                                \</div><div class='add'>+            break;                                                             \</div><div class='add'>+        frame-&gt;local = &amp;__local;                                               \</div><div class='add'>+        for (__i = 0; __i &lt; numsubvols; __i++) {                               \</div><div class='add'>+            if (!on[__i])                                                      \</div><div class='add'>+                continue;                                                      \</div><div class='add'>+            STACK_WIND_COOKIE(frame, cluster_##fop##_cbk, (void *)(long)__i,   \</div><div class='add'>+                              subvols[__i], subvols[__i]-&gt;fops-&gt;fop, args);    \</div><div class='add'>+            syncbarrier_wait(&amp;__local.barrier, 1);                             \</div><div class='add'>+        }                                                                      \</div><div class='add'>+        syncbarrier_destroy(&amp;__local.barrier);                                 \</div><div class='add'>+        frame-&gt;local = __old_local;                                            \</div><div class='add'>+        STACK_RESET(frame-&gt;root);                                              \</div><div class='add'>+    } while (0)</div><div class='add'>+</div><div class='add'>+#define FOP_CBK(fop, frame, cookie, args...)                                   \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        cluster_local_t *__local = frame-&gt;local;                               \</div><div class='add'>+        int __i = (long)cookie;                                                \</div><div class='add'>+        args_##fop##_cbk_store(&amp;__local-&gt;replies[__i], args);                  \</div><div class='add'>+        __local-&gt;replies[__i].valid = 1;                                       \</div><div class='add'>+        syncbarrier_wake(&amp;__local-&gt;barrier);                                   \</div><div class='add'>+    } while (0)</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+cluster_fop_success_fill(default_args_cbk_t *replies, int numsubvols,</div><div class='add'>+                         unsigned char *success)</div><div class='add'>+{</div><div class='add'>+    int i = 0;</div><div class='add'>+    int count = 0;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; numsubvols; i++) {</div><div class='add'>+        if (replies[i].valid &amp;&amp; replies[i].op_ret &gt;= 0) {</div><div class='add'>+            success[i] = 1;</div><div class='add'>+            count++;</div><div class='add'>+        } else {</div><div class='add'>+            success[i] = 0;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return count;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+cluster_replies_wipe(default_args_cbk_t *replies, int numsubvols)</div><div class='add'>+{</div><div class='add'>+    int i = 0;</div><div class='add'>+</div><div class='add'>+    if (!replies)</div><div class='add'>+        return;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; numsubvols; i++)</div><div class='add'>+        args_cbk_wipe(&amp;replies[i]);</div><div class='add'>+    memset(replies, 0, numsubvols * sizeof(*replies));</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+cluster_lookup_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                   int32_t op_ret, int32_t op_errno, inode_t *inode,</div><div class='add'>+                   struct iatt *buf, dict_t *xdata, struct iatt *postparent)</div><div class='add'>+{</div><div class='add'>+    FOP_CBK(lookup, frame, cookie, op_ret, op_errno, inode, buf, xdata,</div><div class='add'>+            postparent);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+cluster_stat_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                 int32_t op_ret, int32_t op_errno, struct iatt *buf,</div><div class='add'>+                 dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    FOP_CBK(stat, frame, cookie, op_ret, op_errno, buf, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+cluster_truncate_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                     int32_t op_ret, int32_t op_errno, struct iatt *prebuf,</div><div class='add'>+                     struct iatt *postbuf, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    FOP_CBK(truncate, frame, cookie, op_ret, op_errno, prebuf, postbuf, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+cluster_ftruncate_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                      int32_t op_ret, int32_t op_errno, struct iatt *prebuf,</div><div class='add'>+                      struct iatt *postbuf, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    FOP_CBK(ftruncate, frame, cookie, op_ret, op_errno, prebuf, postbuf, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+cluster_access_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                   int32_t op_ret, int32_t op_errno, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    FOP_CBK(access, frame, cookie, op_ret, op_errno, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+cluster_readlink_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                     int32_t op_ret, int32_t op_errno, const char *path,</div><div class='add'>+                     struct iatt *buf, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    FOP_CBK(readlink, frame, cookie, op_ret, op_errno, path, buf, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+cluster_mknod_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                  int32_t op_ret, int32_t op_errno, inode_t *inode,</div><div class='add'>+                  struct iatt *buf, struct iatt *preparent,</div><div class='add'>+                  struct iatt *postparent, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    FOP_CBK(mknod, frame, cookie, op_ret, op_errno, inode, buf, preparent,</div><div class='add'>+            postparent, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+cluster_mkdir_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                  int32_t op_ret, int32_t op_errno, inode_t *inode,</div><div class='add'>+                  struct iatt *buf, struct iatt *preparent,</div><div class='add'>+                  struct iatt *postparent, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    FOP_CBK(mkdir, frame, cookie, op_ret, op_errno, inode, buf, preparent,</div><div class='add'>+            postparent, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+cluster_unlink_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                   int32_t op_ret, int32_t op_errno, struct iatt *preparent,</div><div class='add'>+                   struct iatt *postparent, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    FOP_CBK(unlink, frame, cookie, op_ret, op_errno, preparent, postparent,</div><div class='add'>+            xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+cluster_rmdir_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                  int32_t op_ret, int32_t op_errno, struct iatt *preparent,</div><div class='add'>+                  struct iatt *postparent, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    FOP_CBK(rmdir, frame, cookie, op_ret, op_errno, preparent, postparent,</div><div class='add'>+            xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+cluster_symlink_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                    int32_t op_ret, int32_t op_errno, inode_t *inode,</div><div class='add'>+                    struct iatt *buf, struct iatt *preparent,</div><div class='add'>+                    struct iatt *postparent, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    FOP_CBK(symlink, frame, cookie, op_ret, op_errno, inode, buf, preparent,</div><div class='add'>+            postparent, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+cluster_rename_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                   int32_t op_ret, int32_t op_errno, struct iatt *buf,</div><div class='add'>+                   struct iatt *preoldparent, struct iatt *postoldparent,</div><div class='add'>+                   struct iatt *prenewparent, struct iatt *postnewparent,</div><div class='add'>+                   dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    FOP_CBK(rename, frame, cookie, op_ret, op_errno, buf, preoldparent,</div><div class='add'>+            postoldparent, prenewparent, postnewparent, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+cluster_link_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                 int32_t op_ret, int32_t op_errno, inode_t *inode,</div><div class='add'>+                 struct iatt *buf, struct iatt *preparent,</div><div class='add'>+                 struct iatt *postparent, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    FOP_CBK(link, frame, cookie, op_ret, op_errno, inode, buf, preparent,</div><div class='add'>+            postparent, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+cluster_create_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                   int32_t op_ret, int32_t op_errno, fd_t *fd, inode_t *inode,</div><div class='add'>+                   struct iatt *buf, struct iatt *preparent,</div><div class='add'>+                   struct iatt *postparent, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    FOP_CBK(create, frame, cookie, op_ret, op_errno, fd, inode, buf, preparent,</div><div class='add'>+            postparent, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+cluster_open_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                 int32_t op_ret, int32_t op_errno, fd_t *fd, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    FOP_CBK(open, frame, cookie, op_ret, op_errno, fd, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+cluster_readv_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                  int32_t op_ret, int32_t op_errno, struct iovec *vector,</div><div class='add'>+                  int32_t count, struct iatt *stbuf, struct iobref *iobref,</div><div class='add'>+                  dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    FOP_CBK(readv, frame, cookie, op_ret, op_errno, vector, count, stbuf,</div><div class='add'>+            iobref, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+cluster_writev_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                   int32_t op_ret, int32_t op_errno, struct iatt *prebuf,</div><div class='add'>+                   struct iatt *postbuf, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    FOP_CBK(writev, frame, cookie, op_ret, op_errno, prebuf, postbuf, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+cluster_put_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                int32_t op_ret, int32_t op_errno, inode_t *inode,</div><div class='add'>+                struct iatt *buf, struct iatt *preparent,</div><div class='add'>+                struct iatt *postparent, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    FOP_CBK(put, frame, cookie, op_ret, op_errno, inode, buf, preparent,</div><div class='add'>+            postparent, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+cluster_flush_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                  int32_t op_ret, int32_t op_errno, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    FOP_CBK(flush, frame, cookie, op_ret, op_errno, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+cluster_fsync_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                  int32_t op_ret, int32_t op_errno, struct iatt *prebuf,</div><div class='add'>+                  struct iatt *postbuf, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    FOP_CBK(fsync, frame, cookie, op_ret, op_errno, prebuf, postbuf, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+cluster_fstat_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                  int32_t op_ret, int32_t op_errno, struct iatt *buf,</div><div class='add'>+                  dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    FOP_CBK(fstat, frame, cookie, op_ret, op_errno, buf, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+cluster_opendir_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                    int32_t op_ret, int32_t op_errno, fd_t *fd, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    FOP_CBK(opendir, frame, cookie, op_ret, op_errno, fd, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+cluster_fsyncdir_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                     int32_t op_ret, int32_t op_errno, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    FOP_CBK(fsyncdir, frame, cookie, op_ret, op_errno, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+cluster_statfs_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                   int32_t op_ret, int32_t op_errno, struct statvfs *buf,</div><div class='add'>+                   dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    FOP_CBK(statfs, frame, cookie, op_ret, op_errno, buf, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+cluster_setxattr_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                     int32_t op_ret, int32_t op_errno, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    FOP_CBK(setxattr, frame, cookie, op_ret, op_errno, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+cluster_fsetxattr_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                      int32_t op_ret, int32_t op_errno, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    FOP_CBK(fsetxattr, frame, cookie, op_ret, op_errno, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+cluster_fgetxattr_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                      int32_t op_ret, int32_t op_errno, dict_t *dict,</div><div class='add'>+                      dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    FOP_CBK(fgetxattr, frame, cookie, op_ret, op_errno, dict, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+cluster_getxattr_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                     int32_t op_ret, int32_t op_errno, dict_t *dict,</div><div class='add'>+                     dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    FOP_CBK(getxattr, frame, cookie, op_ret, op_errno, dict, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+cluster_xattrop_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                    int32_t op_ret, int32_t op_errno, dict_t *dict,</div><div class='add'>+                    dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    FOP_CBK(xattrop, frame, cookie, op_ret, op_errno, dict, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+cluster_fxattrop_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                     int32_t op_ret, int32_t op_errno, dict_t *dict,</div><div class='add'>+                     dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    FOP_CBK(fxattrop, frame, cookie, op_ret, op_errno, dict, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+cluster_removexattr_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                        int32_t op_ret, int32_t op_errno, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    FOP_CBK(removexattr, frame, cookie, op_ret, op_errno, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+cluster_fremovexattr_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                         int32_t op_ret, int32_t op_errno, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    FOP_CBK(fremovexattr, frame, cookie, op_ret, op_errno, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+cluster_lk_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+               int32_t op_ret, int32_t op_errno, struct gf_flock *lock,</div><div class='add'>+               dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    FOP_CBK(lk, frame, cookie, op_ret, op_errno, lock, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+cluster_inodelk_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                    int32_t op_ret, int32_t op_errno, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    FOP_CBK(inodelk, frame, cookie, op_ret, op_errno, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+cluster_finodelk_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                     int32_t op_ret, int32_t op_errno, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    FOP_CBK(finodelk, frame, cookie, op_ret, op_errno, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+cluster_entrylk_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                    int32_t op_ret, int32_t op_errno, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    FOP_CBK(entrylk, frame, cookie, op_ret, op_errno, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+cluster_fentrylk_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                     int32_t op_ret, int32_t op_errno, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    FOP_CBK(fentrylk, frame, cookie, op_ret, op_errno, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+cluster_rchecksum_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                      int32_t op_ret, int32_t op_errno, uint32_t weak_checksum,</div><div class='add'>+                      uint8_t *strong_checksum, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    FOP_CBK(rchecksum, frame, cookie, op_ret, op_errno, weak_checksum,</div><div class='add'>+            strong_checksum, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+cluster_readdir_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                    int32_t op_ret, int32_t op_errno, gf_dirent_t *entries,</div><div class='add'>+                    dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    FOP_CBK(readdir, frame, cookie, op_ret, op_errno, entries, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+cluster_readdirp_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                     int32_t op_ret, int32_t op_errno, gf_dirent_t *entries,</div><div class='add'>+                     dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    FOP_CBK(readdirp, frame, cookie, op_ret, op_errno, entries, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+cluster_setattr_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                    int32_t op_ret, int32_t op_errno, struct iatt *statpre,</div><div class='add'>+                    struct iatt *statpost, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    FOP_CBK(setattr, frame, cookie, op_ret, op_errno, statpre, statpost, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+cluster_fsetattr_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                     int32_t op_ret, int32_t op_errno, struct iatt *statpre,</div><div class='add'>+                     struct iatt *statpost, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    FOP_CBK(fsetattr, frame, cookie, op_ret, op_errno, statpre, statpost,</div><div class='add'>+            xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+cluster_fallocate_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                      int32_t op_ret, int32_t op_errno, struct iatt *pre,</div><div class='add'>+                      struct iatt *post, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    FOP_CBK(fallocate, frame, cookie, op_ret, op_errno, pre, post, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+cluster_discard_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                    int32_t op_ret, int32_t op_errno, struct iatt *pre,</div><div class='add'>+                    struct iatt *post, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    FOP_CBK(discard, frame, cookie, op_ret, op_errno, pre, post, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+cluster_zerofill_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                     int32_t op_ret, int32_t op_errno, struct iatt *pre,</div><div class='add'>+                     struct iatt *post, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    FOP_CBK(zerofill, frame, cookie, op_ret, op_errno, pre, post, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+cluster_ipc_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                int32_t op_ret, int32_t op_errno, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    FOP_CBK(ipc, frame, cookie, op_ret, op_errno, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+cluster_fgetxattr(xlator_t **subvols, unsigned char *on, int numsubvols,</div><div class='add'>+                  default_args_cbk_t *replies, unsigned char *output,</div><div class='add'>+                  call_frame_t *frame, xlator_t *this, fd_t *fd,</div><div class='add'>+                  const char *name, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    FOP_ONLIST(subvols, on, numsubvols, replies, output, frame, fgetxattr, fd,</div><div class='add'>+               name, xdata);</div><div class='add'>+    return cluster_fop_success_fill(replies, numsubvols, output);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+cluster_fsetxattr(xlator_t **subvols, unsigned char *on, int numsubvols,</div><div class='add'>+                  default_args_cbk_t *replies, unsigned char *output,</div><div class='add'>+                  call_frame_t *frame, xlator_t *this, fd_t *fd, dict_t *dict,</div><div class='add'>+                  int32_t flags, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    FOP_ONLIST(subvols, on, numsubvols, replies, output, frame, fsetxattr, fd,</div><div class='add'>+               dict, flags, xdata);</div><div class='add'>+    return cluster_fop_success_fill(replies, numsubvols, output);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+cluster_setxattr(xlator_t **subvols, unsigned char *on, int numsubvols,</div><div class='add'>+                 default_args_cbk_t *replies, unsigned char *output,</div><div class='add'>+                 call_frame_t *frame, xlator_t *this, loc_t *loc, dict_t *dict,</div><div class='add'>+                 int32_t flags, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    FOP_ONLIST(subvols, on, numsubvols, replies, output, frame, setxattr, loc,</div><div class='add'>+               dict, flags, xdata);</div><div class='add'>+    return cluster_fop_success_fill(replies, numsubvols, output);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+cluster_statfs(xlator_t **subvols, unsigned char *on, int numsubvols,</div><div class='add'>+               default_args_cbk_t *replies, unsigned char *output,</div><div class='add'>+               call_frame_t *frame, xlator_t *this, loc_t *loc, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    FOP_ONLIST(subvols, on, numsubvols, replies, output, frame, statfs, loc,</div><div class='add'>+               xdata);</div><div class='add'>+    return cluster_fop_success_fill(replies, numsubvols, output);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+cluster_fsyncdir(xlator_t **subvols, unsigned char *on, int numsubvols,</div><div class='add'>+                 default_args_cbk_t *replies, unsigned char *output,</div><div class='add'>+                 call_frame_t *frame, xlator_t *this, fd_t *fd, int32_t flags,</div><div class='add'>+                 dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    FOP_ONLIST(subvols, on, numsubvols, replies, output, frame, fsyncdir, fd,</div><div class='add'>+               flags, xdata);</div><div class='add'>+    return cluster_fop_success_fill(replies, numsubvols, output);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+cluster_opendir(xlator_t **subvols, unsigned char *on, int numsubvols,</div><div class='add'>+                default_args_cbk_t *replies, unsigned char *output,</div><div class='add'>+                call_frame_t *frame, xlator_t *this, loc_t *loc, fd_t *fd,</div><div class='add'>+                dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    FOP_ONLIST(subvols, on, numsubvols, replies, output, frame, opendir, loc,</div><div class='add'>+               fd, xdata);</div><div class='add'>+    return cluster_fop_success_fill(replies, numsubvols, output);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+cluster_fstat(xlator_t **subvols, unsigned char *on, int numsubvols,</div><div class='add'>+              default_args_cbk_t *replies, unsigned char *output,</div><div class='add'>+              call_frame_t *frame, xlator_t *this, fd_t *fd, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    FOP_ONLIST(subvols, on, numsubvols, replies, output, frame, fstat, fd,</div><div class='add'>+               xdata);</div><div class='add'>+    return cluster_fop_success_fill(replies, numsubvols, output);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+cluster_fsync(xlator_t **subvols, unsigned char *on, int numsubvols,</div><div class='add'>+              default_args_cbk_t *replies, unsigned char *output,</div><div class='add'>+              call_frame_t *frame, xlator_t *this, fd_t *fd, int32_t flags,</div><div class='add'>+              dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    FOP_ONLIST(subvols, on, numsubvols, replies, output, frame, fsync, fd,</div><div class='add'>+               flags, xdata);</div><div class='add'>+    return cluster_fop_success_fill(replies, numsubvols, output);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+cluster_flush(xlator_t **subvols, unsigned char *on, int numsubvols,</div><div class='add'>+              default_args_cbk_t *replies, unsigned char *output,</div><div class='add'>+              call_frame_t *frame, xlator_t *this, fd_t *fd, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    FOP_ONLIST(subvols, on, numsubvols, replies, output, frame, flush, fd,</div><div class='add'>+               xdata);</div><div class='add'>+    return cluster_fop_success_fill(replies, numsubvols, output);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+cluster_writev(xlator_t **subvols, unsigned char *on, int numsubvols,</div><div class='add'>+               default_args_cbk_t *replies, unsigned char *output,</div><div class='add'>+               call_frame_t *frame, xlator_t *this, fd_t *fd,</div><div class='add'>+               struct iovec *vector, int32_t count, off_t off, uint32_t flags,</div><div class='add'>+               struct iobref *iobref, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    FOP_ONLIST(subvols, on, numsubvols, replies, output, frame, writev, fd,</div><div class='add'>+               vector, count, off, flags, iobref, xdata);</div><div class='add'>+    return cluster_fop_success_fill(replies, numsubvols, output);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+cluster_put(xlator_t **subvols, unsigned char *on, int numsubvols,</div><div class='add'>+            default_args_cbk_t *replies, unsigned char *output,</div><div class='add'>+            call_frame_t *frame, xlator_t *this, loc_t *loc, mode_t mode,</div><div class='add'>+            mode_t umask, uint32_t flags, struct iovec *vector, int32_t count,</div><div class='add'>+            off_t offset, struct iobref *iobref, dict_t *xattr, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    FOP_ONLIST(subvols, on, numsubvols, replies, output, frame, put, loc, mode,</div><div class='add'>+               umask, flags, vector, count, offset, iobref, xattr, xdata);</div><div class='add'>+    return cluster_fop_success_fill(replies, numsubvols, output);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+cluster_readv(xlator_t **subvols, unsigned char *on, int numsubvols,</div><div class='add'>+              default_args_cbk_t *replies, unsigned char *output,</div><div class='add'>+              call_frame_t *frame, xlator_t *this, fd_t *fd, size_t size,</div><div class='add'>+              off_t offset, uint32_t flags, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    FOP_ONLIST(subvols, on, numsubvols, replies, output, frame, readv, fd, size,</div><div class='add'>+               offset, flags, xdata);</div><div class='add'>+    return cluster_fop_success_fill(replies, numsubvols, output);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+cluster_open(xlator_t **subvols, unsigned char *on, int numsubvols,</div><div class='add'>+             default_args_cbk_t *replies, unsigned char *output,</div><div class='add'>+             call_frame_t *frame, xlator_t *this, loc_t *loc, int32_t flags,</div><div class='add'>+             fd_t *fd, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    FOP_ONLIST(subvols, on, numsubvols, replies, output, frame, open, loc,</div><div class='add'>+               flags, fd, xdata);</div><div class='add'>+    return cluster_fop_success_fill(replies, numsubvols, output);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+cluster_create(xlator_t **subvols, unsigned char *on, int numsubvols,</div><div class='add'>+               default_args_cbk_t *replies, unsigned char *output,</div><div class='add'>+               call_frame_t *frame, xlator_t *this, loc_t *loc, int32_t flags,</div><div class='add'>+               mode_t mode, mode_t umask, fd_t *fd, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    FOP_ONLIST(subvols, on, numsubvols, replies, output, frame, create, loc,</div><div class='add'>+               flags, mode, umask, fd, xdata);</div><div class='add'>+    return cluster_fop_success_fill(replies, numsubvols, output);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+cluster_link(xlator_t **subvols, unsigned char *on, int numsubvols,</div><div class='add'>+             default_args_cbk_t *replies, unsigned char *output,</div><div class='add'>+             call_frame_t *frame, xlator_t *this, loc_t *oldloc, loc_t *newloc,</div><div class='add'>+             dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    FOP_ONLIST(subvols, on, numsubvols, replies, output, frame, link, oldloc,</div><div class='add'>+               newloc, xdata);</div><div class='add'>+    return cluster_fop_success_fill(replies, numsubvols, output);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+cluster_rename(xlator_t **subvols, unsigned char *on, int numsubvols,</div><div class='add'>+               default_args_cbk_t *replies, unsigned char *output,</div><div class='add'>+               call_frame_t *frame, xlator_t *this, loc_t *oldloc,</div><div class='add'>+               loc_t *newloc, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    FOP_ONLIST(subvols, on, numsubvols, replies, output, frame, rename, oldloc,</div><div class='add'>+               newloc, xdata);</div><div class='add'>+    return cluster_fop_success_fill(replies, numsubvols, output);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+cluster_symlink(xlator_t **subvols, unsigned char *on, int numsubvols,</div><div class='add'>+                default_args_cbk_t *replies, unsigned char *output,</div><div class='add'>+                call_frame_t *frame, xlator_t *this, const char *linkpath,</div><div class='add'>+                loc_t *loc, mode_t umask, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    FOP_ONLIST(subvols, on, numsubvols, replies, output, frame, symlink,</div><div class='add'>+               linkpath, loc, umask, xdata);</div><div class='add'>+    return cluster_fop_success_fill(replies, numsubvols, output);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+cluster_rmdir(xlator_t **subvols, unsigned char *on, int numsubvols,</div><div class='add'>+              default_args_cbk_t *replies, unsigned char *output,</div><div class='add'>+              call_frame_t *frame, xlator_t *this, loc_t *loc, int flags,</div><div class='add'>+              dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    FOP_ONLIST(subvols, on, numsubvols, replies, output, frame, rmdir, loc,</div><div class='add'>+               flags, xdata);</div><div class='add'>+    return cluster_fop_success_fill(replies, numsubvols, output);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+cluster_unlink(xlator_t **subvols, unsigned char *on, int numsubvols,</div><div class='add'>+               default_args_cbk_t *replies, unsigned char *output,</div><div class='add'>+               call_frame_t *frame, xlator_t *this, loc_t *loc, int xflag,</div><div class='add'>+               dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    FOP_ONLIST(subvols, on, numsubvols, replies, output, frame, unlink, loc,</div><div class='add'>+               xflag, xdata);</div><div class='add'>+    return cluster_fop_success_fill(replies, numsubvols, output);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+cluster_mkdir(xlator_t **subvols, unsigned char *on, int numsubvols,</div><div class='add'>+              default_args_cbk_t *replies, unsigned char *output,</div><div class='add'>+              call_frame_t *frame, xlator_t *this, loc_t *loc, mode_t mode,</div><div class='add'>+              mode_t umask, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    FOP_ONLIST(subvols, on, numsubvols, replies, output, frame, mkdir, loc,</div><div class='add'>+               mode, umask, xdata);</div><div class='add'>+    return cluster_fop_success_fill(replies, numsubvols, output);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+cluster_mknod(xlator_t **subvols, unsigned char *on, int numsubvols,</div><div class='add'>+              default_args_cbk_t *replies, unsigned char *output,</div><div class='add'>+              call_frame_t *frame, xlator_t *this, loc_t *loc, mode_t mode,</div><div class='add'>+              dev_t rdev, mode_t umask, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    FOP_ONLIST(subvols, on, numsubvols, replies, output, frame, mknod, loc,</div><div class='add'>+               mode, rdev, umask, xdata);</div><div class='add'>+    return cluster_fop_success_fill(replies, numsubvols, output);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+cluster_readlink(xlator_t **subvols, unsigned char *on, int numsubvols,</div><div class='add'>+                 default_args_cbk_t *replies, unsigned char *output,</div><div class='add'>+                 call_frame_t *frame, xlator_t *this, loc_t *loc, size_t size,</div><div class='add'>+                 dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    FOP_ONLIST(subvols, on, numsubvols, replies, output, frame, readlink, loc,</div><div class='add'>+               size, xdata);</div><div class='add'>+    return cluster_fop_success_fill(replies, numsubvols, output);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+cluster_access(xlator_t **subvols, unsigned char *on, int numsubvols,</div><div class='add'>+               default_args_cbk_t *replies, unsigned char *output,</div><div class='add'>+               call_frame_t *frame, xlator_t *this, loc_t *loc, int32_t mask,</div><div class='add'>+               dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    FOP_ONLIST(subvols, on, numsubvols, replies, output, frame, access, loc,</div><div class='add'>+               mask, xdata);</div><div class='add'>+    return cluster_fop_success_fill(replies, numsubvols, output);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+cluster_ftruncate(xlator_t **subvols, unsigned char *on, int numsubvols,</div><div class='add'>+                  default_args_cbk_t *replies, unsigned char *output,</div><div class='add'>+                  call_frame_t *frame, xlator_t *this, fd_t *fd, off_t offset,</div><div class='add'>+                  dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    FOP_ONLIST(subvols, on, numsubvols, replies, output, frame, ftruncate, fd,</div><div class='add'>+               offset, xdata);</div><div class='add'>+    return cluster_fop_success_fill(replies, numsubvols, output);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+cluster_getxattr(xlator_t **subvols, unsigned char *on, int numsubvols,</div><div class='add'>+                 default_args_cbk_t *replies, unsigned char *output,</div><div class='add'>+                 call_frame_t *frame, xlator_t *this, loc_t *loc,</div><div class='add'>+                 const char *name, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    FOP_ONLIST(subvols, on, numsubvols, replies, output, frame, getxattr, loc,</div><div class='add'>+               name, xdata);</div><div class='add'>+    return cluster_fop_success_fill(replies, numsubvols, output);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+cluster_xattrop(xlator_t **subvols, unsigned char *on, int numsubvols,</div><div class='add'>+                default_args_cbk_t *replies, unsigned char *output,</div><div class='add'>+                call_frame_t *frame, xlator_t *this, loc_t *loc,</div><div class='add'>+                gf_xattrop_flags_t flags, dict_t *dict, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    FOP_ONLIST(subvols, on, numsubvols, replies, output, frame, xattrop, loc,</div><div class='add'>+               flags, dict, xdata);</div><div class='add'>+    return cluster_fop_success_fill(replies, numsubvols, output);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+cluster_fxattrop(xlator_t **subvols, unsigned char *on, int numsubvols,</div><div class='add'>+                 default_args_cbk_t *replies, unsigned char *output,</div><div class='add'>+                 call_frame_t *frame, xlator_t *this, fd_t *fd,</div><div class='add'>+                 gf_xattrop_flags_t flags, dict_t *dict, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    FOP_ONLIST(subvols, on, numsubvols, replies, output, frame, fxattrop, fd,</div><div class='add'>+               flags, dict, xdata);</div><div class='add'>+    return cluster_fop_success_fill(replies, numsubvols, output);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+cluster_removexattr(xlator_t **subvols, unsigned char *on, int numsubvols,</div><div class='add'>+                    default_args_cbk_t *replies, unsigned char *output,</div><div class='add'>+                    call_frame_t *frame, xlator_t *this, loc_t *loc,</div><div class='add'>+                    const char *name, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    FOP_ONLIST(subvols, on, numsubvols, replies, output, frame, removexattr,</div><div class='add'>+               loc, name, xdata);</div><div class='add'>+    return cluster_fop_success_fill(replies, numsubvols, output);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+cluster_fremovexattr(xlator_t **subvols, unsigned char *on, int numsubvols,</div><div class='add'>+                     default_args_cbk_t *replies, unsigned char *output,</div><div class='add'>+                     call_frame_t *frame, xlator_t *this, fd_t *fd,</div><div class='add'>+                     const char *name, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    FOP_ONLIST(subvols, on, numsubvols, replies, output, frame, fremovexattr,</div><div class='add'>+               fd, name, xdata);</div><div class='add'>+    return cluster_fop_success_fill(replies, numsubvols, output);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+cluster_lk(xlator_t **subvols, unsigned char *on, int numsubvols,</div><div class='add'>+           default_args_cbk_t *replies, unsigned char *output,</div><div class='add'>+           call_frame_t *frame, xlator_t *this, fd_t *fd, int32_t cmd,</div><div class='add'>+           struct gf_flock *lock, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    FOP_ONLIST(subvols, on, numsubvols, replies, output, frame, lk, fd, cmd,</div><div class='add'>+               lock, xdata);</div><div class='add'>+    return cluster_fop_success_fill(replies, numsubvols, output);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+cluster_rchecksum(xlator_t **subvols, unsigned char *on, int numsubvols,</div><div class='add'>+                  default_args_cbk_t *replies, unsigned char *output,</div><div class='add'>+                  call_frame_t *frame, xlator_t *this, fd_t *fd, off_t offset,</div><div class='add'>+                  int32_t len, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    FOP_ONLIST(subvols, on, numsubvols, replies, output, frame, rchecksum, fd,</div><div class='add'>+               offset, len, xdata);</div><div class='add'>+    return cluster_fop_success_fill(replies, numsubvols, output);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+cluster_readdir(xlator_t **subvols, unsigned char *on, int numsubvols,</div><div class='add'>+                default_args_cbk_t *replies, unsigned char *output,</div><div class='add'>+                call_frame_t *frame, xlator_t *this, fd_t *fd, size_t size,</div><div class='add'>+                off_t off, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    FOP_ONLIST(subvols, on, numsubvols, replies, output, frame, readdir, fd,</div><div class='add'>+               size, off, xdata);</div><div class='add'>+    return cluster_fop_success_fill(replies, numsubvols, output);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+cluster_readdirp(xlator_t **subvols, unsigned char *on, int numsubvols,</div><div class='add'>+                 default_args_cbk_t *replies, unsigned char *output,</div><div class='add'>+                 call_frame_t *frame, xlator_t *this, fd_t *fd, size_t size,</div><div class='add'>+                 off_t off, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    FOP_ONLIST(subvols, on, numsubvols, replies, output, frame, readdirp, fd,</div><div class='add'>+               size, off, xdata);</div><div class='add'>+    return cluster_fop_success_fill(replies, numsubvols, output);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+cluster_setattr(xlator_t **subvols, unsigned char *on, int numsubvols,</div><div class='add'>+                default_args_cbk_t *replies, unsigned char *output,</div><div class='add'>+                call_frame_t *frame, xlator_t *this, loc_t *loc,</div><div class='add'>+                struct iatt *stbuf, int32_t valid, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    FOP_ONLIST(subvols, on, numsubvols, replies, output, frame, setattr, loc,</div><div class='add'>+               stbuf, valid, xdata);</div><div class='add'>+    return cluster_fop_success_fill(replies, numsubvols, output);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+cluster_truncate(xlator_t **subvols, unsigned char *on, int numsubvols,</div><div class='add'>+                 default_args_cbk_t *replies, unsigned char *output,</div><div class='add'>+                 call_frame_t *frame, xlator_t *this, loc_t *loc, off_t offset,</div><div class='add'>+                 dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    FOP_ONLIST(subvols, on, numsubvols, replies, output, frame, truncate, loc,</div><div class='add'>+               offset, xdata);</div><div class='add'>+    return cluster_fop_success_fill(replies, numsubvols, output);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+cluster_stat(xlator_t **subvols, unsigned char *on, int numsubvols,</div><div class='add'>+             default_args_cbk_t *replies, unsigned char *output,</div><div class='add'>+             call_frame_t *frame, xlator_t *this, loc_t *loc, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    FOP_ONLIST(subvols, on, numsubvols, replies, output, frame, stat, loc,</div><div class='add'>+               xdata);</div><div class='add'>+    return cluster_fop_success_fill(replies, numsubvols, output);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+cluster_lookup(xlator_t **subvols, unsigned char *on, int numsubvols,</div><div class='add'>+               default_args_cbk_t *replies, unsigned char *output,</div><div class='add'>+               call_frame_t *frame, xlator_t *this, loc_t *loc, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    FOP_ONLIST(subvols, on, numsubvols, replies, output, frame, lookup, loc,</div><div class='add'>+               xdata);</div><div class='add'>+    return cluster_fop_success_fill(replies, numsubvols, output);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+cluster_fsetattr(xlator_t **subvols, unsigned char *on, int numsubvols,</div><div class='add'>+                 default_args_cbk_t *replies, unsigned char *output,</div><div class='add'>+                 call_frame_t *frame, xlator_t *this, fd_t *fd,</div><div class='add'>+                 struct iatt *stbuf, int32_t valid, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    FOP_ONLIST(subvols, on, numsubvols, replies, output, frame, fsetattr, fd,</div><div class='add'>+               stbuf, valid, xdata);</div><div class='add'>+    return cluster_fop_success_fill(replies, numsubvols, output);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+cluster_fallocate(xlator_t **subvols, unsigned char *on, int numsubvols,</div><div class='add'>+                  default_args_cbk_t *replies, unsigned char *output,</div><div class='add'>+                  call_frame_t *frame, xlator_t *this, fd_t *fd,</div><div class='add'>+                  int32_t keep_size, off_t offset, size_t len, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    FOP_ONLIST(subvols, on, numsubvols, replies, output, frame, fallocate, fd,</div><div class='add'>+               keep_size, offset, len, xdata);</div><div class='add'>+    return cluster_fop_success_fill(replies, numsubvols, output);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+cluster_discard(xlator_t **subvols, unsigned char *on, int numsubvols,</div><div class='add'>+                default_args_cbk_t *replies, unsigned char *output,</div><div class='add'>+                call_frame_t *frame, xlator_t *this, fd_t *fd, off_t offset,</div><div class='add'>+                size_t len, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    FOP_ONLIST(subvols, on, numsubvols, replies, output, frame, discard, fd,</div><div class='add'>+               offset, len, xdata);</div><div class='add'>+    return cluster_fop_success_fill(replies, numsubvols, output);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+cluster_zerofill(xlator_t **subvols, unsigned char *on, int numsubvols,</div><div class='add'>+                 default_args_cbk_t *replies, unsigned char *output,</div><div class='add'>+                 call_frame_t *frame, xlator_t *this, fd_t *fd, off_t offset,</div><div class='add'>+                 off_t len, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    FOP_ONLIST(subvols, on, numsubvols, replies, output, frame, zerofill, fd,</div><div class='add'>+               offset, len, xdata);</div><div class='add'>+    return cluster_fop_success_fill(replies, numsubvols, output);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+cluster_ipc(xlator_t **subvols, unsigned char *on, int numsubvols,</div><div class='add'>+            default_args_cbk_t *replies, unsigned char *output,</div><div class='add'>+            call_frame_t *frame, xlator_t *this, int32_t op, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    FOP_ONLIST(subvols, on, numsubvols, replies, output, frame, ipc, op, xdata);</div><div class='add'>+    return cluster_fop_success_fill(replies, numsubvols, output);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+cluster_uninodelk(xlator_t **subvols, unsigned char *locked_on, int numsubvols,</div><div class='add'>+                  default_args_cbk_t *replies, unsigned char *output,</div><div class='add'>+                  call_frame_t *frame, xlator_t *this, char *dom,</div><div class='add'>+                  inode_t *inode, off_t off, size_t size)</div><div class='add'>+{</div><div class='add'>+    loc_t loc = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    struct gf_flock flock = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    loc.inode = inode_ref(inode);</div><div class='add'>+    gf_uuid_copy(loc.gfid, inode-&gt;gfid);</div><div class='add'>+</div><div class='add'>+    flock.l_type = F_UNLCK;</div><div class='add'>+    flock.l_start = off;</div><div class='add'>+    flock.l_len = size;</div><div class='add'>+</div><div class='add'>+    FOP_ONLIST(subvols, locked_on, numsubvols, replies, output, frame, inodelk,</div><div class='add'>+               dom, &amp;loc, F_SETLK, &amp;flock, NULL);</div><div class='add'>+</div><div class='add'>+    loc_wipe(&amp;loc);</div><div class='add'>+</div><div class='add'>+    return cluster_fop_success_fill(replies, numsubvols, output);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+cluster_tryinodelk(xlator_t **subvols, unsigned char *on, int numsubvols,</div><div class='add'>+                   default_args_cbk_t *replies, unsigned char *locked_on,</div><div class='add'>+                   call_frame_t *frame, xlator_t *this, char *dom,</div><div class='add'>+                   inode_t *inode, off_t off, size_t size)</div><div class='add'>+{</div><div class='add'>+    struct gf_flock flock = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    loc_t loc = {0};</div><div class='add'>+</div><div class='add'>+    flock.l_type = F_WRLCK;</div><div class='add'>+    flock.l_start = off;</div><div class='add'>+    flock.l_len = size;</div><div class='add'>+</div><div class='add'>+    loc.inode = inode_ref(inode);</div><div class='add'>+    gf_uuid_copy(loc.gfid, inode-&gt;gfid);</div><div class='add'>+    FOP_ONLIST(subvols, on, numsubvols, replies, locked_on, frame, inodelk, dom,</div><div class='add'>+               &amp;loc, F_SETLK, &amp;flock, NULL);</div><div class='add'>+</div><div class='add'>+    loc_wipe(&amp;loc);</div><div class='add'>+    return cluster_fop_success_fill(replies, numsubvols, locked_on);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+cluster_inodelk(xlator_t **subvols, unsigned char *on, int numsubvols,</div><div class='add'>+                default_args_cbk_t *replies, unsigned char *locked_on,</div><div class='add'>+                call_frame_t *frame, xlator_t *this, char *dom, inode_t *inode,</div><div class='add'>+                off_t off, size_t size)</div><div class='add'>+{</div><div class='add'>+    struct gf_flock flock = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int i = 0;</div><div class='add'>+    loc_t loc = {0};</div><div class='add'>+    unsigned char *output = NULL;</div><div class='add'>+</div><div class='add'>+    flock.l_type = F_WRLCK;</div><div class='add'>+    flock.l_start = off;</div><div class='add'>+    flock.l_len = size;</div><div class='add'>+</div><div class='add'>+    output = alloca(numsubvols);</div><div class='add'>+    loc.inode = inode_ref(inode);</div><div class='add'>+    gf_uuid_copy(loc.gfid, inode-&gt;gfid);</div><div class='add'>+    FOP_ONLIST(subvols, on, numsubvols, replies, locked_on, frame, inodelk, dom,</div><div class='add'>+               &amp;loc, F_SETLK, &amp;flock, NULL);</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; numsubvols; i++) {</div><div class='add'>+        if (replies[i].op_ret == -1 &amp;&amp; replies[i].op_errno == EAGAIN) {</div><div class='add'>+            cluster_fop_success_fill(replies, numsubvols, locked_on);</div><div class='add'>+            cluster_uninodelk(subvols, locked_on, numsubvols, replies, output,</div><div class='add'>+                              frame, this, dom, inode, off, size);</div><div class='add'>+</div><div class='add'>+            FOP_SEQ(subvols, on, numsubvols, replies, locked_on, frame, inodelk,</div><div class='add'>+                    dom, &amp;loc, F_SETLKW, &amp;flock, NULL);</div><div class='add'>+            break;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    loc_wipe(&amp;loc);</div><div class='add'>+    return cluster_fop_success_fill(replies, numsubvols, locked_on);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+cluster_unentrylk(xlator_t **subvols, unsigned char *locked_on, int numsubvols,</div><div class='add'>+                  default_args_cbk_t *replies, unsigned char *output,</div><div class='add'>+                  call_frame_t *frame, xlator_t *this, char *dom,</div><div class='add'>+                  inode_t *inode, const char *name)</div><div class='add'>+{</div><div class='add'>+    loc_t loc = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    loc.inode = inode_ref(inode);</div><div class='add'>+    gf_uuid_copy(loc.gfid, inode-&gt;gfid);</div><div class='add'>+</div><div class='add'>+    FOP_ONLIST(subvols, locked_on, numsubvols, replies, output, frame, entrylk,</div><div class='add'>+               dom, &amp;loc, name, ENTRYLK_UNLOCK, ENTRYLK_WRLCK, NULL);</div><div class='add'>+</div><div class='add'>+    loc_wipe(&amp;loc);</div><div class='add'>+</div><div class='add'>+    return cluster_fop_success_fill(replies, numsubvols, output);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+cluster_tryentrylk(xlator_t **subvols, unsigned char *on, int numsubvols,</div><div class='add'>+                   default_args_cbk_t *replies, unsigned char *locked_on,</div><div class='add'>+                   call_frame_t *frame, xlator_t *this, char *dom,</div><div class='add'>+                   inode_t *inode, const char *name)</div><div class='add'>+{</div><div class='add'>+    loc_t loc = {0};</div><div class='add'>+</div><div class='add'>+    loc.inode = inode_ref(inode);</div><div class='add'>+    gf_uuid_copy(loc.gfid, inode-&gt;gfid);</div><div class='add'>+    FOP_ONLIST(subvols, on, numsubvols, replies, locked_on, frame, entrylk, dom,</div><div class='add'>+               &amp;loc, name, ENTRYLK_LOCK_NB, ENTRYLK_WRLCK, NULL);</div><div class='add'>+</div><div class='add'>+    loc_wipe(&amp;loc);</div><div class='add'>+    return cluster_fop_success_fill(replies, numsubvols, locked_on);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+cluster_entrylk(xlator_t **subvols, unsigned char *on, int numsubvols,</div><div class='add'>+                default_args_cbk_t *replies, unsigned char *locked_on,</div><div class='add'>+                call_frame_t *frame, xlator_t *this, char *dom, inode_t *inode,</div><div class='add'>+                const char *name)</div><div class='add'>+{</div><div class='add'>+    int i = 0;</div><div class='add'>+    loc_t loc = {0};</div><div class='add'>+    unsigned char *output = NULL;</div><div class='add'>+</div><div class='add'>+    output = alloca(numsubvols);</div><div class='add'>+    loc.inode = inode_ref(inode);</div><div class='add'>+    gf_uuid_copy(loc.gfid, inode-&gt;gfid);</div><div class='add'>+    FOP_ONLIST(subvols, on, numsubvols, replies, locked_on, frame, entrylk, dom,</div><div class='add'>+               &amp;loc, name, ENTRYLK_LOCK_NB, ENTRYLK_WRLCK, NULL);</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; numsubvols; i++) {</div><div class='add'>+        if (replies[i].op_ret == -1 &amp;&amp; replies[i].op_errno == EAGAIN) {</div><div class='add'>+            cluster_fop_success_fill(replies, numsubvols, locked_on);</div><div class='add'>+            cluster_unentrylk(subvols, locked_on, numsubvols, replies, output,</div><div class='add'>+                              frame, this, dom, inode, name);</div><div class='add'>+            FOP_SEQ(subvols, on, numsubvols, replies, locked_on, frame, entrylk,</div><div class='add'>+                    dom, &amp;loc, name, ENTRYLK_LOCK, ENTRYLK_WRLCK, NULL);</div><div class='add'>+            break;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    loc_wipe(&amp;loc);</div><div class='add'>+    return cluster_fop_success_fill(replies, numsubvols, locked_on);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+cluster_tiebreaker_inodelk(xlator_t **subvols, unsigned char *on,</div><div class='add'>+                           int numsubvols, default_args_cbk_t *replies,</div><div class='add'>+                           unsigned char *locked_on, call_frame_t *frame,</div><div class='add'>+                           xlator_t *this, char *dom, inode_t *inode, off_t off,</div><div class='add'>+                           size_t size)</div><div class='add'>+{</div><div class='add'>+    struct gf_flock flock = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int i = 0;</div><div class='add'>+    int num_success = 0;</div><div class='add'>+    loc_t loc = {0};</div><div class='add'>+    unsigned char *output = NULL;</div><div class='add'>+</div><div class='add'>+    flock.l_type = F_WRLCK;</div><div class='add'>+    flock.l_start = off;</div><div class='add'>+    flock.l_len = size;</div><div class='add'>+</div><div class='add'>+    output = alloca(numsubvols);</div><div class='add'>+    loc.inode = inode_ref(inode);</div><div class='add'>+    gf_uuid_copy(loc.gfid, inode-&gt;gfid);</div><div class='add'>+    FOP_ONLIST(subvols, on, numsubvols, replies, locked_on, frame, inodelk, dom,</div><div class='add'>+               &amp;loc, F_SETLK, &amp;flock, NULL);</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; numsubvols; i++) {</div><div class='add'>+        if (replies[i].valid &amp;&amp; replies[i].op_ret == 0) {</div><div class='add'>+            num_success++;</div><div class='add'>+            continue;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        /* TODO: If earlier subvols fail with an error other</div><div class='add'>+         * than EAGAIN, we could still have 2 clients competing</div><div class='add'>+         * for the lock*/</div><div class='add'>+        if (replies[i].op_ret == -1 &amp;&amp; replies[i].op_errno == EAGAIN) {</div><div class='add'>+            cluster_fop_success_fill(replies, numsubvols, locked_on);</div><div class='add'>+            cluster_uninodelk(subvols, locked_on, numsubvols, replies, output,</div><div class='add'>+                              frame, this, dom, inode, off, size);</div><div class='add'>+</div><div class='add'>+            if (num_success) {</div><div class='add'>+                FOP_SEQ(subvols, on, numsubvols, replies, locked_on, frame,</div><div class='add'>+                        inodelk, dom, &amp;loc, F_SETLKW, &amp;flock, NULL);</div><div class='add'>+            } else {</div><div class='add'>+                loc_wipe(&amp;loc);</div><div class='add'>+                memset(locked_on, 0, numsubvols);</div><div class='add'>+                return 0;</div><div class='add'>+            }</div><div class='add'>+            break;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    loc_wipe(&amp;loc);</div><div class='add'>+    return cluster_fop_success_fill(replies, numsubvols, locked_on);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+cluster_tiebreaker_entrylk(xlator_t **subvols, unsigned char *on,</div><div class='add'>+                           int numsubvols, default_args_cbk_t *replies,</div><div class='add'>+                           unsigned char *locked_on, call_frame_t *frame,</div><div class='add'>+                           xlator_t *this, char *dom, inode_t *inode,</div><div class='add'>+                           const char *name)</div><div class='add'>+{</div><div class='add'>+    int i = 0;</div><div class='add'>+    loc_t loc = {0};</div><div class='add'>+    unsigned char *output = NULL;</div><div class='add'>+    int num_success = 0;</div><div class='add'>+</div><div class='add'>+    output = alloca(numsubvols);</div><div class='add'>+    loc.inode = inode_ref(inode);</div><div class='add'>+    gf_uuid_copy(loc.gfid, inode-&gt;gfid);</div><div class='add'>+    FOP_ONLIST(subvols, on, numsubvols, replies, locked_on, frame, entrylk, dom,</div><div class='add'>+               &amp;loc, name, ENTRYLK_LOCK_NB, ENTRYLK_WRLCK, NULL);</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; numsubvols; i++) {</div><div class='add'>+        if (replies[i].valid &amp;&amp; replies[i].op_ret == 0) {</div><div class='add'>+            num_success++;</div><div class='add'>+            continue;</div><div class='add'>+        }</div><div class='add'>+        if (replies[i].op_ret == -1 &amp;&amp; replies[i].op_errno == EAGAIN) {</div><div class='add'>+            cluster_fop_success_fill(replies, numsubvols, locked_on);</div><div class='add'>+            cluster_unentrylk(subvols, locked_on, numsubvols, replies, output,</div><div class='add'>+                              frame, this, dom, inode, name);</div><div class='add'>+            if (num_success) {</div><div class='add'>+                FOP_SEQ(subvols, on, numsubvols, replies, locked_on, frame,</div><div class='add'>+                        entrylk, dom, &amp;loc, name, ENTRYLK_LOCK, ENTRYLK_WRLCK,</div><div class='add'>+                        NULL);</div><div class='add'>+            } else {</div><div class='add'>+                loc_wipe(&amp;loc);</div><div class='add'>+                memset(locked_on, 0, numsubvols);</div><div class='add'>+                return 0;</div><div class='add'>+            }</div><div class='add'>+            break;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    loc_wipe(&amp;loc);</div><div class='add'>+    return cluster_fop_success_fill(replies, numsubvols, locked_on);</div><div class='add'>+}</div><div class='head'>diff --git a/libglusterfs/src/common-utils.c b/libglusterfs/src/common-utils.c<br/>index f3386fe2b62..682cbf28055 100644<br/>--- a/<a href='/cgit/glusterfs.git/tree/libglusterfs/src/common-utils.c?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/common-utils.c</a><br/>+++ b/<a href='/cgit/glusterfs.git/tree/libglusterfs/src/common-utils.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>libglusterfs/src/common-utils.c</a></div><div class='hunk'>@@ -1,29 +1,17 @@</div><div class='ctx'> /*</div><div class='del'>-  Copyright (c) 2006-2009 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='add'>+  Copyright (c) 2008-2012 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='ctx'>   This file is part of GlusterFS.</div><div class='ctx'> </div><div class='del'>-  GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-  it under the terms of the GNU General Public License as published</div><div class='del'>-  by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-  or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-  GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-  WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-  General Public License for more details.</div><div class='del'>-</div><div class='del'>-  You should have received a copy of the GNU General Public License</div><div class='del'>-  along with this program.  If not, see</div><div class='del'>-  &lt;http://www.gnu.org/licenses/&gt;.</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='ctx'> */</div><div class='ctx'> </div><div class='del'>-#ifndef _CONFIG_H</div><div class='del'>-#define _CONFIG_H</div><div class='del'>-#include "config.h"</div><div class='del'>-#endif</div><div class='del'>-</div><div class='ctx'> #ifdef HAVE_BACKTRACE</div><div class='ctx'> #include &lt;execinfo.h&gt;</div><div class='add'>+#else</div><div class='add'>+#include "execinfo_compat.h"</div><div class='ctx'> #endif</div><div class='ctx'> </div><div class='ctx'> #include &lt;stdio.h&gt;</div><div class='hunk'>@@ -36,1515 +24,5442 @@</div><div class='ctx'> #include &lt;time.h&gt;</div><div class='ctx'> #include &lt;locale.h&gt;</div><div class='ctx'> #include &lt;sys/socket.h&gt;</div><div class='del'>-#include &lt;sys/wait.h&gt;</div><div class='ctx'> #include &lt;netinet/in.h&gt;</div><div class='ctx'> #include &lt;arpa/inet.h&gt;</div><div class='ctx'> #include &lt;signal.h&gt;</div><div class='add'>+#include &lt;assert.h&gt;</div><div class='add'>+#include &lt;libgen.h&gt; /* for dirname() */</div><div class='add'>+#include &lt;grp.h&gt;</div><div class='add'>+</div><div class='add'>+#if defined(GF_BSD_HOST_OS) || defined(GF_DARWIN_HOST_OS)</div><div class='add'>+#include &lt;sys/sysctl.h&gt;</div><div class='add'>+#endif</div><div class='add'>+#ifndef GF_LINUX_HOST_OS</div><div class='add'>+#include &lt;sys/resource.h&gt;</div><div class='add'>+#endif</div><div class='add'>+#ifdef HAVE_SYNCFS_SYS</div><div class='add'>+#include &lt;sys/syscall.h&gt;</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#include "glusterfs/compat-errno.h"</div><div class='add'>+#include "glusterfs/common-utils.h"</div><div class='add'>+#include "glusterfs/revision.h"</div><div class='add'>+#include "glusterfs/glusterfs.h"</div><div class='add'>+#include "glusterfs/stack.h"</div><div class='add'>+#include "glusterfs/lkowner.h"</div><div class='add'>+#include "glusterfs/syscall.h"</div><div class='add'>+#include "glusterfs/globals.h"</div><div class='add'>+#define XXH_INLINE_ALL</div><div class='add'>+#include "xxhash.h"</div><div class='add'>+#include &lt;ifaddrs.h&gt;</div><div class='add'>+#include "glusterfs/libglusterfs-messages.h"</div><div class='add'>+#include "glusterfs/glusterfs-acl.h"</div><div class='add'>+#ifdef __FreeBSD__</div><div class='add'>+#include &lt;pthread_np.h&gt;</div><div class='add'>+#undef BIT_SET</div><div class='add'>+#endif</div><div class='ctx'> </div><div class='del'>-#include "logging.h"</div><div class='del'>-#include "common-utils.h"</div><div class='del'>-#include "revision.h"</div><div class='del'>-#include "glusterfs.h"</div><div class='del'>-#include "stack.h"</div><div class='add'>+#ifndef AI_ADDRCONFIG</div><div class='add'>+#define AI_ADDRCONFIG 0</div><div class='add'>+#endif /* AI_ADDRCONFIG */</div><div class='add'>+</div><div class='add'>+char *vol_type_str[] = {</div><div class='add'>+    "Distribute",</div><div class='add'>+    "Stripe [NOT SUPPORTED from v6.0]",</div><div class='add'>+    "Replicate",</div><div class='add'>+    "Striped-Replicate [NOT SUPPORTED from v6.0]",</div><div class='add'>+    "Disperse",</div><div class='add'>+    "Tier [NOT SUPPORTED from v6.0]",</div><div class='add'>+    "Distributed-Stripe [NOT SUPPORTED from v6.0]",</div><div class='add'>+    "Distributed-Replicate",</div><div class='add'>+    "Distributed-Striped-Replicate [NOT SUPPORTED from v6.0]",</div><div class='add'>+    "Distributed-Disperse",</div><div class='add'>+};</div><div class='ctx'> </div><div class='ctx'> typedef int32_t (*rw_op_t)(int32_t fd, char *buf, int32_t size);</div><div class='ctx'> typedef int32_t (*rwv_op_t)(int32_t fd, const struct iovec *buf, int32_t size);</div><div class='ctx'> </div><div class='add'>+char *xattrs_to_heal[] = {"user.",</div><div class='add'>+                          POSIX_ACL_ACCESS_XATTR,</div><div class='add'>+                          POSIX_ACL_DEFAULT_XATTR,</div><div class='add'>+                          QUOTA_LIMIT_KEY,</div><div class='add'>+                          QUOTA_LIMIT_OBJECTS_KEY,</div><div class='add'>+                          GF_SELINUX_XATTR_KEY,</div><div class='add'>+                          GF_XATTR_MDATA_KEY,</div><div class='add'>+                          NULL};</div><div class='ctx'> </div><div class='del'>-struct dnscache6 {</div><div class='del'>-	struct addrinfo *first;</div><div class='del'>-	struct addrinfo *next;</div><div class='del'>-};</div><div class='add'>+void</div><div class='add'>+gf_xxh64_wrapper(const unsigned char *data, size_t const len,</div><div class='add'>+                 unsigned long long const seed, char *xxh64)</div><div class='add'>+{</div><div class='add'>+    unsigned short i = 0;</div><div class='add'>+    const unsigned short lim = GF_XXH64_DIGEST_LENGTH * 2 + 1;</div><div class='add'>+    XXH64_hash_t hash = 0;</div><div class='add'>+    XXH64_canonical_t c_hash = {</div><div class='add'>+        {</div><div class='add'>+            0,</div><div class='add'>+        },</div><div class='add'>+    };</div><div class='add'>+    const uint8_t *p = (const uint8_t *)&amp;c_hash;</div><div class='add'>+</div><div class='add'>+    hash = XXH64(data, len, seed);</div><div class='add'>+    XXH64_canonicalFromHash(&amp;c_hash, hash);</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; GF_XXH64_DIGEST_LENGTH; i++)</div><div class='add'>+        snprintf(xxh64 + i * 2, lim - i * 2, "%02x", p[i]);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/**</div><div class='add'>+ * This function takes following arguments</div><div class='add'>+ * @this: xlator</div><div class='add'>+ * @gfid: The gfid which has to be filled</div><div class='add'>+ * @hash: the 8 byte hash which has to be filled inside the gfid</div><div class='add'>+ * @index: the array element of the uuid_t structure (which is</div><div class='add'>+ *         a array of unsigned char) from where the 8 bytes of</div><div class='add'>+ *         the hash has to be filled. Since uuid_t contains 16</div><div class='add'>+ *        char elements in the array, each byte of the hash has</div><div class='add'>+ *        to be filled in one array element.</div><div class='add'>+ *</div><div class='add'>+ * This function is called twice for 2 hashes (of 8 byte each) to</div><div class='add'>+ * be filled in the gfid.</div><div class='add'>+ *</div><div class='add'>+ * The for loop in this function actually is doing these 2 things</div><div class='add'>+ * for each hash</div><div class='add'>+ *</div><div class='add'>+ * 1) One of the hashes</div><div class='add'>+ *      tmp[0] = (hash_2 &gt;&gt; 56) &amp; 0xff;</div><div class='add'>+ *      tmp[1] = (hash_2 &gt;&gt; 48) &amp; 0xff;</div><div class='add'>+ *      tmp[2] = (hash_2 &gt;&gt; 40) &amp; 0xff;</div><div class='add'>+ *      tmp[3] = (hash_2 &gt;&gt; 32) &amp; 0xff;</div><div class='add'>+ *      tmp[4] = (hash_2 &gt;&gt; 24) &amp; 0xff;</div><div class='add'>+ *      tmp[5] = (hash_2 &gt;&gt; 16) &amp; 0xff;</div><div class='add'>+ *      tmp[6] = (hash_2 &gt;&gt; 8) &amp; 0xff;</div><div class='add'>+ *      tmp[7] = (hash_2) &amp; 0xff;</div><div class='add'>+ *</div><div class='add'>+ * 2) The other hash:</div><div class='add'>+ *      tmp[8] = (hash_1 &gt;&gt; 56) &amp; 0xff;</div><div class='add'>+ *      tmp[9] = (hash_1 &gt;&gt; 48) &amp; 0xff;</div><div class='add'>+ *      tmp[10] = (hash_1 &gt;&gt; 40) &amp; 0xff;</div><div class='add'>+ *      tmp[11] = (hash_1 &gt;&gt; 32) &amp; 0xff;</div><div class='add'>+ *      tmp[12] = (hash_1 &gt;&gt; 24) &amp; 0xff;</div><div class='add'>+ *      tmp[13] = (hash_1 &gt;&gt; 16) &amp; 0xff;</div><div class='add'>+ *      tmp[14] = (hash_1 &gt;&gt; 8) &amp; 0xff;</div><div class='add'>+ *      tmp[15] = (hash_1) &amp; 0xff;</div><div class='add'>+ **/</div><div class='add'>+static int</div><div class='add'>+gf_gfid_from_xxh64(xlator_t *this, uuid_t gfid, XXH64_hash_t hash,</div><div class='add'>+                   unsigned short index)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int i = -1;</div><div class='add'>+</div><div class='add'>+    if ((index != 0) &amp;&amp; (index != 8)) {</div><div class='add'>+        gf_msg_callingfn("gfid-from-xxh64", GF_LOG_WARNING, 0,</div><div class='add'>+                         LG_MSG_INDEX_NOT_FOUND,</div><div class='add'>+                         "index can only be either 0 or 8, as this"</div><div class='add'>+                         "function's purpose is to encode a 8 byte "</div><div class='add'>+                         "hash inside the gfid (index: %d)",</div><div class='add'>+                         index);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; sizeof(hash); i++) {</div><div class='add'>+        /*</div><div class='add'>+         * As of now the below statement is equivalent of this.</div><div class='add'>+         * gfid[index+i] = (hash &gt;&gt; (64 - (8 * (i+1)))) &amp; 0xff;</div><div class='add'>+         */</div><div class='add'>+        gfid[index + i] = (hash &gt;&gt; ((sizeof(hash) * 8) - (8 * (i + 1)))) &amp;</div><div class='add'>+                          (0xff);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/**</div><div class='add'>+ * This function does the same thing as gf_xxh64_wrapper. But gf_xxh64_wrapper</div><div class='add'>+ * does not return anything and in this xlator there is a need for both the</div><div class='add'>+ * actual hash and the canonicalized form of the hash.</div><div class='add'>+ *</div><div class='add'>+ * To summarize:</div><div class='add'>+ * - XXH64_hash_t is needed as return because, those bytes which contain the</div><div class='add'>+ *   hash can be used for different purposes as needed. One example is</div><div class='add'>+ *   to have those bytes copied into the uuid_t structure to be used as gfid</div><div class='add'>+ * - xxh64 string is needed because, it can be used as the key for generating</div><div class='add'>+ *   the next hash (and any other purpose which might require canonical form</div><div class='add'>+ *   of the hash).</div><div class='add'>+ **/</div><div class='add'>+XXH64_hash_t</div><div class='add'>+gf_xxh64_hash_wrapper(const unsigned char *data, size_t const len,</div><div class='add'>+                      unsigned long long const seed, char *xxh64)</div><div class='add'>+{</div><div class='add'>+    unsigned short i = 0;</div><div class='add'>+    const unsigned short lim = GF_XXH64_DIGEST_LENGTH * 2 + 1;</div><div class='add'>+    XXH64_hash_t hash = 0;</div><div class='add'>+    XXH64_canonical_t c_hash = {</div><div class='add'>+        {</div><div class='add'>+            0,</div><div class='add'>+        },</div><div class='add'>+    };</div><div class='add'>+    const uint8_t *p = (const uint8_t *)&amp;c_hash;</div><div class='add'>+</div><div class='add'>+    hash = XXH64(data, len, seed);</div><div class='add'>+    XXH64_canonicalFromHash(&amp;c_hash, hash);</div><div class='ctx'> </div><div class='add'>+    for (i = 0; i &lt; GF_XXH64_DIGEST_LENGTH; i++)</div><div class='add'>+        snprintf(xxh64 + i * 2, lim - i * 2, "%02x", p[i]);</div><div class='ctx'> </div><div class='add'>+    return hash;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/**</div><div class='add'>+ * This is the algorithm followed for generating new gfid</div><div class='add'>+ * 1) generate xxh64 hash using snapname and original gfid of the object</div><div class='add'>+ * 2) Using the canonicalized form of above hash as the key, generate</div><div class='add'>+ *    another hash</div><div class='add'>+ * 3) Combine both of the  8 byte hashes to generate a 16 byte uuid_t type</div><div class='add'>+ * 4) Use the above uuid as the gfid</div><div class='add'>+ *</div><div class='add'>+ * Each byte of the hash is stored separately in different elements of the</div><div class='add'>+ * character array represented by uuid_t</div><div class='add'>+ * Ex: tmp[0] = (hash_2 &gt;&gt; 56) &amp; 0xFF</div><div class='add'>+ *     This saves the most significant byte of hash_2 in tmp[0]</div><div class='add'>+ *     tmp[1] = (hash_2 &gt;&gt; 48) &amp; 0xFF</div><div class='add'>+ *     This saves next most significant byte of hash_2 in tmp[1]</div><div class='add'>+ *     .</div><div class='add'>+ *     .</div><div class='add'>+ *     So on.</div><div class='add'>+ *     tmp[0] - tmp[7] holds the contents of hash_2</div><div class='add'>+ *     tmp[8] - tmp[15] hold the conents of hash_1</div><div class='add'>+ *</div><div class='add'>+ * The hash generated (i.e. of type XXH64_hash_t) is 8 bytes long. And for</div><div class='add'>+ * gfid 16 byte uuid is needed. Hecne the 2 hashes are combined to form</div><div class='add'>+ * one 16 byte entity.</div><div class='add'>+ **/</div><div class='add'>+int</div><div class='add'>+gf_gfid_generate_from_xxh64(uuid_t gfid, char *key)</div><div class='add'>+{</div><div class='add'>+    char xxh64_1[GF_XXH64_DIGEST_LENGTH * 2 + 1] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    char xxh64_2[GF_XXH64_DIGEST_LENGTH * 2 + 1] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    XXH64_hash_t hash_1 = 0;</div><div class='add'>+    XXH64_hash_t hash_2 = 0;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    xlator_t *this = THIS;</div><div class='add'>+</div><div class='add'>+    hash_1 = gf_xxh64_hash_wrapper((unsigned char *)key, strlen(key),</div><div class='add'>+                                   GF_XXHSUM64_DEFAULT_SEED, xxh64_1);</div><div class='add'>+</div><div class='add'>+    hash_2 = gf_xxh64_hash_wrapper((unsigned char *)xxh64_1, strlen(xxh64_1),</div><div class='add'>+                                   GF_XXHSUM64_DEFAULT_SEED, xxh64_2);</div><div class='add'>+</div><div class='add'>+    /* hash_2 is saved in 1st 8 elements of uuid_t char array */</div><div class='add'>+    if (gf_gfid_from_xxh64(this, gfid, hash_2, 0)) {</div><div class='add'>+        gf_msg_callingfn(this-&gt;name, GF_LOG_WARNING, 0,</div><div class='add'>+                         LG_MSG_XXH64_TO_GFID_FAILED,</div><div class='add'>+                         "failed to encode the hash %llx into the 1st"</div><div class='add'>+                         "half of gfid",</div><div class='add'>+                         hash_2);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* hash_1 is saved in the remaining 8 elements of uuid_t */</div><div class='add'>+    if (gf_gfid_from_xxh64(this, gfid, hash_1, 8)) {</div><div class='add'>+        gf_msg_callingfn(this-&gt;name, GF_LOG_WARNING, 0,</div><div class='add'>+                         LG_MSG_XXH64_TO_GFID_FAILED,</div><div class='add'>+                         "failed to encode the hash %llx into the 2nd"</div><div class='add'>+                         "half of gfid",</div><div class='add'>+                         hash_1);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    gf_msg_debug(this-&gt;name, 0,</div><div class='add'>+                 "gfid generated is %s (hash1: %llx) "</div><div class='add'>+                 "hash2: %llx, xxh64_1: %s xxh64_2: %s",</div><div class='add'>+                 uuid_utoa(gfid), hash_1, hash_2, xxh64_1, xxh64_2);</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* works similar to mkdir(1) -p.</div><div class='add'>+ */</div><div class='ctx'> int</div><div class='del'>-log_base2 (unsigned long x)</div><div class='add'>+mkdir_p(char *path, mode_t mode, gf_boolean_t allow_symlinks)</div><div class='ctx'> {</div><div class='del'>-        int val = 0;</div><div class='add'>+    int i = 0;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    char dir[PATH_MAX] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    struct stat stbuf = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    const int path_len = min(strlen(path), PATH_MAX - 1);</div><div class='add'>+</div><div class='add'>+    snprintf(dir, path_len + 1, "%s", path);</div><div class='add'>+</div><div class='add'>+    i = (dir[0] == '/') ? 1 : 0;</div><div class='add'>+    do {</div><div class='add'>+        if (path[i] != '/' &amp;&amp; path[i] != '\0')</div><div class='add'>+            continue;</div><div class='add'>+</div><div class='add'>+        dir[i] = '\0';</div><div class='add'>+        ret = sys_mkdir(dir, mode);</div><div class='add'>+        if (ret &amp;&amp; errno != EEXIST) {</div><div class='add'>+            gf_smsg("", GF_LOG_ERROR, errno, LG_MSG_DIR_OP_FAILED, NULL);</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        if (ret &amp;&amp; errno == EEXIST &amp;&amp; !allow_symlinks) {</div><div class='add'>+            ret = sys_lstat(dir, &amp;stbuf);</div><div class='add'>+            if (ret)</div><div class='add'>+                goto out;</div><div class='ctx'> </div><div class='del'>-        while (x &gt; 1) {</div><div class='del'>-                x /= 2;</div><div class='del'>-                val++;</div><div class='add'>+            if (S_ISLNK(stbuf.st_mode)) {</div><div class='add'>+                ret = -1;</div><div class='add'>+                gf_smsg("", GF_LOG_ERROR, 0, LG_MSG_DIR_IS_SYMLINK, "dir=%s",</div><div class='add'>+                        dir, NULL);</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='ctx'>         }</div><div class='add'>+        dir[i] = '/';</div><div class='add'>+</div><div class='add'>+    } while (path[i++] != '\0');</div><div class='add'>+</div><div class='add'>+    ret = sys_stat(dir, &amp;stbuf);</div><div class='add'>+    if (ret || !S_ISDIR(stbuf.st_mode)) {</div><div class='add'>+        if (ret == 0)</div><div class='add'>+            errno = 0;</div><div class='add'>+        ret = -1;</div><div class='add'>+        gf_smsg("", GF_LOG_ERROR, errno, LG_MSG_DIR_OP_FAILED,</div><div class='add'>+                "possibly some of the components"</div><div class='add'>+                " were not directories",</div><div class='add'>+                NULL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+out:</div><div class='ctx'> </div><div class='del'>-        return val;</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+int</div><div class='add'>+gf_lstat_dir(const char *path, struct stat *stbuf_in)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    struct stat stbuf = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    if (path == NULL) {</div><div class='add'>+        errno = EINVAL;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = sys_lstat(path, &amp;stbuf);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    if (!S_ISDIR(stbuf.st_mode)) {</div><div class='add'>+        errno = ENOTDIR;</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    ret = 0;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (!ret &amp;&amp; stbuf_in)</div><div class='add'>+        *stbuf_in = stbuf;</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+log_base2(unsigned long x)</div><div class='add'>+{</div><div class='add'>+    int val = 0;</div><div class='add'>+</div><div class='add'>+    while (x &gt; 1) {</div><div class='add'>+        x /= 2;</div><div class='add'>+        val++;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return val;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/**</div><div class='add'>+ * gf_rev_dns_lookup -- Perform a reverse DNS lookup on the IP address.</div><div class='add'>+ *</div><div class='add'>+ * @ip: The IP address to perform a reverse lookup on</div><div class='add'>+ *</div><div class='add'>+ * @return: success: Allocated string containing the hostname</div><div class='add'>+ *          failure: NULL</div><div class='add'>+ */</div><div class='add'>+char *</div><div class='add'>+gf_rev_dns_lookup(const char *ip)</div><div class='add'>+{</div><div class='add'>+    char *fqdn = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    GF_VALIDATE_OR_GOTO("resolver", ip, out);</div><div class='add'>+</div><div class='add'>+    /* Get the FQDN */</div><div class='add'>+    ret = gf_get_hostname_from_ip((char *)ip, &amp;fqdn);</div><div class='add'>+    if (ret != 0) {</div><div class='add'>+        gf_smsg("resolver", GF_LOG_INFO, errno, LG_MSG_RESOLVE_HOSTNAME_FAILED,</div><div class='add'>+                "hostname=%s", ip, NULL);</div><div class='add'>+    }</div><div class='add'>+out:</div><div class='add'>+    return fqdn;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/**</div><div class='add'>+ * gf_resolve_path_parent -- Given a path, returns an allocated string</div><div class='add'>+ *                           containing the parent's path.</div><div class='add'>+ * @path: Path to parse</div><div class='add'>+ * @return: The parent path if found, NULL otherwise</div><div class='add'>+ */</div><div class='add'>+char *</div><div class='add'>+gf_resolve_path_parent(const char *path)</div><div class='add'>+{</div><div class='add'>+    char *parent = NULL;</div><div class='add'>+    char *tmp = NULL;</div><div class='add'>+    char *pathc = NULL;</div><div class='add'>+</div><div class='add'>+    GF_VALIDATE_OR_GOTO(THIS-&gt;name, path, out);</div><div class='add'>+</div><div class='add'>+    if (0 == strlen(path)) {</div><div class='add'>+        gf_msg_callingfn(THIS-&gt;name, GF_LOG_DEBUG, 0, LG_MSG_INVALID_STRING,</div><div class='add'>+                         "invalid string for 'path'");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* dup the parameter, we don't want to modify it */</div><div class='add'>+    pathc = strdupa(path);</div><div class='add'>+    if (!pathc) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Get the parent directory */</div><div class='add'>+    tmp = dirname(pathc);</div><div class='add'>+    if (strcmp(tmp, "/") == 0)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    parent = gf_strdup(tmp);</div><div class='add'>+out:</div><div class='add'>+    return parent;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int32_t</div><div class='del'>-gf_resolve_ip6 (const char *hostname,</div><div class='del'>-		uint16_t port,</div><div class='del'>-		int family,</div><div class='del'>-		void **dnscache,</div><div class='del'>-		struct addrinfo **addr_info)</div><div class='del'>-{</div><div class='del'>-	int32_t ret = 0;</div><div class='del'>-	struct addrinfo hints;</div><div class='del'>-	struct dnscache6 *cache = NULL;</div><div class='del'>-	char service[NI_MAXSERV], host[NI_MAXHOST];</div><div class='del'>-</div><div class='del'>-	if (!hostname) {</div><div class='del'>-		gf_log ("resolver", GF_LOG_WARNING, "hostname is NULL");</div><div class='del'>-		return -1;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	if (!*dnscache) {</div><div class='del'>-		*dnscache = GF_CALLOC (1, sizeof (struct dnscache6),</div><div class='del'>-                                        gf_common_mt_dnscache6);</div><div class='del'>-                if (!*dnscache)</div><div class='del'>-                        return -1;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	cache = *dnscache;</div><div class='del'>-	if (cache-&gt;first &amp;&amp; !cache-&gt;next) {</div><div class='del'>-		freeaddrinfo(cache-&gt;first);</div><div class='del'>-		cache-&gt;first = cache-&gt;next = NULL;</div><div class='del'>-		gf_log ("resolver", GF_LOG_TRACE,</div><div class='del'>-			"flushing DNS cache");</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	if (!cache-&gt;first) {</div><div class='del'>-		char *port_str = NULL;</div><div class='del'>-		gf_log ("resolver", GF_LOG_TRACE,</div><div class='del'>-			"DNS cache not present, freshly probing hostname: %s",</div><div class='del'>-			hostname);</div><div class='del'>-</div><div class='del'>-		memset(&amp;hints, 0, sizeof(hints));</div><div class='del'>-		hints.ai_family   = family;</div><div class='del'>-		hints.ai_socktype = SOCK_STREAM;</div><div class='del'>-		hints.ai_flags    = AI_ADDRCONFIG;</div><div class='del'>-</div><div class='del'>-		ret = gf_asprintf (&amp;port_str, "%d", port);</div><div class='del'>-                if (-1 == ret) {</div><div class='del'>-                        gf_log ("resolver", GF_LOG_ERROR, "asprintf failed");</div><div class='del'>-                        return -1;</div><div class='del'>-                }</div><div class='del'>-		if ((ret = getaddrinfo(hostname, port_str, &amp;hints, &amp;cache-&gt;first)) != 0) {</div><div class='del'>-			gf_log ("resolver", GF_LOG_ERROR,</div><div class='del'>-				"getaddrinfo failed (%s)", gai_strerror (ret));</div><div class='del'>-</div><div class='del'>-			GF_FREE (*dnscache);</div><div class='del'>-			*dnscache = NULL;</div><div class='del'>-			GF_FREE (port_str);</div><div class='del'>-			return -1;</div><div class='del'>-		}</div><div class='del'>-		GF_FREE (port_str);</div><div class='del'>-</div><div class='del'>-		cache-&gt;next = cache-&gt;first;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	if (cache-&gt;next) {</div><div class='del'>-		ret = getnameinfo((struct sockaddr *)cache-&gt;next-&gt;ai_addr,</div><div class='del'>-				  cache-&gt;next-&gt;ai_addrlen,</div><div class='del'>-				  host, sizeof (host),</div><div class='del'>-				  service, sizeof (service),</div><div class='del'>-				  NI_NUMERICHOST);</div><div class='del'>-		if (ret != 0) {</div><div class='del'>-			gf_log ("resolver",</div><div class='del'>-				GF_LOG_ERROR,</div><div class='del'>-				"getnameinfo failed (%s)", gai_strerror (ret));</div><div class='del'>-			goto err;</div><div class='del'>-		}</div><div class='del'>-</div><div class='del'>-		gf_log ("resolver", GF_LOG_TRACE,</div><div class='del'>-			"returning ip-%s (port-%s) for hostname: %s and port: %d",</div><div class='del'>-			host, service, hostname, port);</div><div class='del'>-</div><div class='del'>-		*addr_info = cache-&gt;next;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-        if (cache-&gt;next)</div><div class='del'>-                cache-&gt;next = cache-&gt;next-&gt;ai_next;</div><div class='del'>-	if (cache-&gt;next) {</div><div class='del'>-		ret = getnameinfo((struct sockaddr *)cache-&gt;next-&gt;ai_addr,</div><div class='del'>-				  cache-&gt;next-&gt;ai_addrlen,</div><div class='del'>-				  host, sizeof (host),</div><div class='del'>-				  service, sizeof (service),</div><div class='del'>-				  NI_NUMERICHOST);</div><div class='del'>-		if (ret != 0) {</div><div class='del'>-			gf_log ("resolver",</div><div class='del'>-				GF_LOG_ERROR,</div><div class='del'>-				"getnameinfo failed (%s)", gai_strerror (ret));</div><div class='del'>-			goto err;</div><div class='del'>-		}</div><div class='del'>-</div><div class='del'>-		gf_log ("resolver", GF_LOG_TRACE,</div><div class='del'>-			"next DNS query will return: ip-%s port-%s", host, service);</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='add'>+gf_resolve_ip6(const char *hostname, uint16_t port, int family, void **dnscache,</div><div class='add'>+               struct addrinfo **addr_info)</div><div class='add'>+{</div><div class='add'>+    int32_t ret = 0;</div><div class='add'>+    struct addrinfo hints;</div><div class='add'>+    struct dnscache6 *cache = NULL;</div><div class='add'>+    char service[NI_MAXSERV], host[NI_MAXHOST];</div><div class='add'>+</div><div class='add'>+    if (!hostname) {</div><div class='add'>+        gf_msg_callingfn("resolver", GF_LOG_WARNING, 0, LG_MSG_HOSTNAME_NULL,</div><div class='add'>+                         "hostname is NULL");</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (!*dnscache) {</div><div class='add'>+        *dnscache = GF_CALLOC(1, sizeof(struct dnscache6),</div><div class='add'>+                              gf_common_mt_dnscache6);</div><div class='add'>+        if (!*dnscache)</div><div class='add'>+            return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    cache = *dnscache;</div><div class='add'>+    if (cache-&gt;first &amp;&amp; !cache-&gt;next) {</div><div class='add'>+        freeaddrinfo(cache-&gt;first);</div><div class='add'>+        cache-&gt;first = cache-&gt;next = NULL;</div><div class='add'>+        gf_msg_trace("resolver", 0, "flushing DNS cache");</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (!cache-&gt;first) {</div><div class='add'>+        char *port_str = NULL;</div><div class='add'>+        gf_msg_trace("resolver", 0,</div><div class='add'>+                     "DNS cache not present, freshly "</div><div class='add'>+                     "probing hostname: %s",</div><div class='add'>+                     hostname);</div><div class='add'>+</div><div class='add'>+        memset(&amp;hints, 0, sizeof(hints));</div><div class='add'>+        hints.ai_family = family;</div><div class='add'>+        hints.ai_socktype = SOCK_STREAM;</div><div class='add'>+</div><div class='add'>+        ret = gf_asprintf(&amp;port_str, "%d", port);</div><div class='add'>+        if (-1 == ret) {</div><div class='add'>+            return -1;</div><div class='add'>+        }</div><div class='add'>+        if ((ret = getaddrinfo(hostname, port_str, &amp;hints, &amp;cache-&gt;first)) !=</div><div class='add'>+            0) {</div><div class='add'>+            gf_smsg("resolver", GF_LOG_ERROR, 0, LG_MSG_GETADDRINFO_FAILED,</div><div class='add'>+                    "family=%d", family, "ret=%s", gai_strerror(ret), NULL);</div><div class='add'>+</div><div class='add'>+            GF_FREE(*dnscache);</div><div class='add'>+            *dnscache = NULL;</div><div class='add'>+            GF_FREE(port_str);</div><div class='add'>+            return -1;</div><div class='add'>+        }</div><div class='add'>+        GF_FREE(port_str);</div><div class='add'>+</div><div class='add'>+        cache-&gt;next = cache-&gt;first;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (cache-&gt;next) {</div><div class='add'>+        ret = getnameinfo((struct sockaddr *)cache-&gt;next-&gt;ai_addr,</div><div class='add'>+                          cache-&gt;next-&gt;ai_addrlen, host, sizeof(host), service,</div><div class='add'>+                          sizeof(service), NI_NUMERICHOST);</div><div class='add'>+        if (ret != 0) {</div><div class='add'>+            gf_smsg("resolver", GF_LOG_ERROR, 0, LG_MSG_GETNAMEINFO_FAILED,</div><div class='add'>+                    "ret=%s", gai_strerror(ret), NULL);</div><div class='add'>+            goto err;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        gf_msg_debug("resolver", 0,</div><div class='add'>+                     "returning ip-%s (port-%s) for "</div><div class='add'>+                     "hostname: %s and port: %d",</div><div class='add'>+                     host, service, hostname, port);</div><div class='add'>+</div><div class='add'>+        *addr_info = cache-&gt;next;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (cache-&gt;next)</div><div class='add'>+        cache-&gt;next = cache-&gt;next-&gt;ai_next;</div><div class='add'>+    if (cache-&gt;next) {</div><div class='add'>+        ret = getnameinfo((struct sockaddr *)cache-&gt;next-&gt;ai_addr,</div><div class='add'>+                          cache-&gt;next-&gt;ai_addrlen, host, sizeof(host), service,</div><div class='add'>+                          sizeof(service), NI_NUMERICHOST);</div><div class='add'>+        if (ret != 0) {</div><div class='add'>+            gf_smsg("resolver", GF_LOG_ERROR, 0, LG_MSG_GETNAMEINFO_FAILED,</div><div class='add'>+                    "ret=%s", gai_strerror(ret), NULL);</div><div class='add'>+            goto err;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        gf_msg_debug("resolver", 0,</div><div class='add'>+                     "next DNS query will return: "</div><div class='add'>+                     "ip-%s port-%s",</div><div class='add'>+                     host, service);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='ctx'> </div><div class='ctx'> err:</div><div class='del'>-	freeaddrinfo (cache-&gt;first);</div><div class='del'>-	cache-&gt;first = cache-&gt;next = NULL;</div><div class='del'>-	GF_FREE (cache);</div><div class='del'>-	*dnscache = NULL;</div><div class='del'>-	return -1;</div><div class='add'>+    freeaddrinfo(cache-&gt;first);</div><div class='add'>+    cache-&gt;first = cache-&gt;next = NULL;</div><div class='add'>+    GF_FREE(cache);</div><div class='add'>+    *dnscache = NULL;</div><div class='add'>+    return -1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/**</div><div class='add'>+ * gf_dnscache_init -- Initializes a dnscache struct and sets the ttl</div><div class='add'>+ *                     to the specified value in the parameter.</div><div class='add'>+ *</div><div class='add'>+ * @ttl: the TTL in seconds</div><div class='add'>+ * @return: SUCCESS: Pointer to an allocated dnscache struct</div><div class='add'>+ *          FAILURE: NULL</div><div class='add'>+ */</div><div class='add'>+struct dnscache *</div><div class='add'>+gf_dnscache_init(time_t ttl)</div><div class='add'>+{</div><div class='add'>+    struct dnscache *cache = GF_MALLOC(sizeof(*cache), gf_common_mt_dnscache);</div><div class='add'>+    if (!cache)</div><div class='add'>+        return NULL;</div><div class='add'>+</div><div class='add'>+    cache-&gt;cache_dict = dict_new();</div><div class='add'>+    if (!cache-&gt;cache_dict) {</div><div class='add'>+        GF_FREE(cache);</div><div class='add'>+        cache = NULL;</div><div class='add'>+    } else {</div><div class='add'>+        cache-&gt;ttl = ttl;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return cache;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/**</div><div class='add'>+ * gf_dnscache_deinit -- cleanup resources used by struct dnscache</div><div class='add'>+ */</div><div class='add'>+void</div><div class='add'>+gf_dnscache_deinit(struct dnscache *cache)</div><div class='add'>+{</div><div class='add'>+    if (!cache) {</div><div class='add'>+        gf_msg_plain(GF_LOG_WARNING, "dnscache is NULL");</div><div class='add'>+        return;</div><div class='add'>+    }</div><div class='add'>+    dict_unref(cache-&gt;cache_dict);</div><div class='add'>+    GF_FREE(cache);</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+/**</div><div class='add'>+ * gf_dnscache_entry_init -- Initialize a dnscache entry</div><div class='add'>+ *</div><div class='add'>+ * @return: SUCCESS: Pointer to an allocated dnscache entry struct</div><div class='add'>+ *          FAILURE: NULL</div><div class='add'>+ */</div><div class='add'>+struct dnscache_entry *</div><div class='add'>+gf_dnscache_entry_init()</div><div class='add'>+{</div><div class='add'>+    struct dnscache_entry *entry = GF_CALLOC(1, sizeof(*entry),</div><div class='add'>+                                             gf_common_mt_dnscache_entry);</div><div class='add'>+    return entry;</div><div class='add'>+}</div><div class='ctx'> </div><div class='add'>+/**</div><div class='add'>+ * gf_dnscache_entry_deinit -- Free memory used by a dnscache entry</div><div class='add'>+ *</div><div class='add'>+ * @entry: Pointer to deallocate</div><div class='add'>+ */</div><div class='ctx'> void</div><div class='del'>-gf_log_volume_file (FILE *specfp)</div><div class='add'>+gf_dnscache_entry_deinit(struct dnscache_entry *entry)</div><div class='ctx'> {</div><div class='del'>-	extern FILE *gf_log_logfile;</div><div class='del'>-	int          lcount = 0;</div><div class='del'>-	char         data[GF_UNIT_KB];</div><div class='add'>+    GF_FREE(entry-&gt;ip);</div><div class='add'>+    GF_FREE(entry-&gt;fqdn);</div><div class='add'>+    GF_FREE(entry);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/**</div><div class='add'>+ * gf_rev_dns_lookup -- Perform a reverse DNS lookup on the IP address.</div><div class='add'>+ *</div><div class='add'>+ * @ip: The IP address to perform a reverse lookup on</div><div class='add'>+ *</div><div class='add'>+ * @return: success: Allocated string containing the hostname</div><div class='add'>+ *          failure: NULL</div><div class='add'>+ */</div><div class='add'>+char *</div><div class='add'>+gf_rev_dns_lookup_cached(const char *ip, struct dnscache *dnscache)</div><div class='add'>+{</div><div class='add'>+    char *fqdn = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    dict_t *cache = NULL;</div><div class='add'>+    data_t *entrydata = NULL;</div><div class='add'>+    struct dnscache_entry *dnsentry = NULL;</div><div class='add'>+    gf_boolean_t from_cache = _gf_false;</div><div class='add'>+</div><div class='add'>+    if (!dnscache)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    cache = dnscache-&gt;cache_dict;</div><div class='add'>+</div><div class='add'>+    /* Quick cache lookup to see if we already hold it */</div><div class='add'>+    entrydata = dict_get(cache, (char *)ip);</div><div class='add'>+    if (entrydata) {</div><div class='add'>+        dnsentry = (struct dnscache_entry *)entrydata-&gt;data;</div><div class='add'>+        /* First check the TTL &amp; timestamp */</div><div class='add'>+        if (gf_time() - dnsentry-&gt;timestamp &gt; dnscache-&gt;ttl) {</div><div class='add'>+            gf_dnscache_entry_deinit(dnsentry);</div><div class='add'>+            entrydata-&gt;data = NULL; /* Mark this as 'null' so</div><div class='add'>+                                     * dict_del () doesn't try free</div><div class='add'>+                                     * this after we've already</div><div class='add'>+                                     * freed it.</div><div class='add'>+                                     */</div><div class='add'>+</div><div class='add'>+            dict_del(cache, (char *)ip); /* Remove this entry */</div><div class='add'>+        } else {</div><div class='add'>+            /* Cache entry is valid, get the FQDN and return */</div><div class='add'>+            fqdn = dnsentry-&gt;fqdn;</div><div class='add'>+            from_cache = _gf_true; /* Mark this as from cache */</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	fseek (specfp, 0L, SEEK_SET);</div><div class='add'>+    /* Get the FQDN */</div><div class='add'>+    ret = gf_get_hostname_from_ip((char *)ip, &amp;fqdn);</div><div class='add'>+    if (ret != 0)</div><div class='add'>+        goto out;</div><div class='ctx'> </div><div class='del'>-	fprintf (gf_log_logfile, "Given volfile:\n");</div><div class='del'>-	fprintf (gf_log_logfile,</div><div class='del'>-		 "+---------------------------------------"</div><div class='del'>-		 "---------------------------------------+\n");</div><div class='del'>-	while (fgets (data, GF_UNIT_KB, specfp) != NULL){</div><div class='del'>-		lcount++;</div><div class='del'>-		fprintf (gf_log_logfile, "%3d: %s", lcount, data);</div><div class='del'>-	}</div><div class='del'>-	fprintf (gf_log_logfile,</div><div class='del'>-		 "\n+---------------------------------------"</div><div class='del'>-		 "---------------------------------------+\n");</div><div class='del'>-	fflush (gf_log_logfile);</div><div class='del'>-	fseek (specfp, 0L, SEEK_SET);</div><div class='add'>+    if (!fqdn) {</div><div class='add'>+        gf_log_callingfn("resolver", GF_LOG_CRITICAL,</div><div class='add'>+                         "Allocation failed for the host address");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    from_cache = _gf_false;</div><div class='add'>+out:</div><div class='add'>+    /* Insert into the cache */</div><div class='add'>+    if (fqdn &amp;&amp; !from_cache &amp;&amp; ip) {</div><div class='add'>+        struct dnscache_entry *entry = gf_dnscache_entry_init();</div><div class='add'>+</div><div class='add'>+        if (entry) {</div><div class='add'>+            entry-&gt;fqdn = fqdn;</div><div class='add'>+            entry-&gt;ip = gf_strdup(ip);</div><div class='add'>+            entry-&gt;timestamp = gf_time();</div><div class='add'>+            entrydata = bin_to_data(entry, sizeof(*entry));</div><div class='add'>+            dict_set(cache, (char *)ip, entrydata);</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    return fqdn;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+struct xldump {</div><div class='add'>+    int lineno;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+/* to catch any format discrepencies that may arise in code */</div><div class='add'>+static int</div><div class='add'>+nprintf(struct xldump *dump, const char *fmt, ...)</div><div class='add'>+    __attribute__((__format__(__printf__, 2, 3)));</div><div class='add'>+static int</div><div class='add'>+nprintf(struct xldump *dump, const char *fmt, ...)</div><div class='add'>+{</div><div class='add'>+    va_list ap;</div><div class='add'>+    char *msg = NULL;</div><div class='add'>+    char header[32];</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    ret = snprintf(header, 32, "%3d:", ++dump-&gt;lineno);</div><div class='add'>+    if (ret &lt; 0)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    va_start(ap, fmt);</div><div class='add'>+    ret = vasprintf(&amp;msg, fmt, ap);</div><div class='add'>+    va_end(ap);</div><div class='add'>+    if (-1 == ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    /* NOTE: No ret value from gf_msg_plain, so unable to compute printed</div><div class='add'>+     * characters. The return value from nprintf is not used, so for now</div><div class='add'>+     * living with it */</div><div class='add'>+    gf_msg_plain(GF_LOG_WARNING, "%s %s", header, msg);</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    FREE(msg);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+xldump_options(dict_t *this, char *key, data_t *value, void *d)</div><div class='add'>+{</div><div class='add'>+    nprintf(d, "    option %s %s", key, value-&gt;data);</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> static void</div><div class='del'>-gf_dump_config_flags (int fd)</div><div class='add'>+xldump_subvolumes(xlator_t *this, void *d)</div><div class='ctx'> {</div><div class='del'>-        int ret = 0;</div><div class='add'>+    xlator_list_t *subv = NULL;</div><div class='add'>+    int len = 0;</div><div class='add'>+    char *subvstr = NULL;</div><div class='ctx'> </div><div class='del'>-	ret = write (fd, "configuration details:\n", 23);</div><div class='del'>-        if (ret == -1)</div><div class='del'>-                goto out;</div><div class='add'>+    if (!this-&gt;children)</div><div class='add'>+        return;</div><div class='add'>+</div><div class='add'>+    for (subv = this-&gt;children; subv; subv = subv-&gt;next)</div><div class='add'>+        len += (strlen(subv-&gt;xlator-&gt;name) + 1);</div><div class='add'>+</div><div class='add'>+    subvstr = GF_MALLOC(len, gf_common_mt_strdup);</div><div class='add'>+</div><div class='add'>+    len = 0;</div><div class='add'>+    for (subv = this-&gt;children; subv; subv = subv-&gt;next)</div><div class='add'>+        len += sprintf(subvstr + len, "%s%s", subv-&gt;xlator-&gt;name,</div><div class='add'>+                       subv-&gt;next ? " " : "");</div><div class='add'>+</div><div class='add'>+    nprintf(d, "    subvolumes %s", subvstr);</div><div class='add'>+</div><div class='add'>+    GF_FREE(subvstr);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+xldump(xlator_t *each, void *d)</div><div class='add'>+{</div><div class='add'>+    nprintf(d, "volume %s", each-&gt;name);</div><div class='add'>+    nprintf(d, "    type %s", each-&gt;type);</div><div class='add'>+    dict_foreach(each-&gt;options, xldump_options, d);</div><div class='add'>+</div><div class='add'>+    xldump_subvolumes(each, d);</div><div class='add'>+</div><div class='add'>+    nprintf(d, "end-volume");</div><div class='add'>+    nprintf(d, " ");</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+gf_log_dump_graph(FILE *specfp, glusterfs_graph_t *graph)</div><div class='add'>+{</div><div class='add'>+    struct xldump xld = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    gf_msg_plain(GF_LOG_WARNING, "Final graph:");</div><div class='add'>+    gf_msg_plain(GF_LOG_WARNING,</div><div class='add'>+                 "+---------------------------------------"</div><div class='add'>+                 "---------------------------------------+");</div><div class='add'>+</div><div class='add'>+    xlator_foreach_depth_first(graph-&gt;top, xldump, &amp;xld);</div><div class='add'>+</div><div class='add'>+    gf_msg_plain(GF_LOG_WARNING,</div><div class='add'>+                 "+---------------------------------------"</div><div class='add'>+                 "---------------------------------------+");</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf_dump_config_flags()</div><div class='add'>+{</div><div class='add'>+    gf_msg_plain_nomem(GF_LOG_ALERT, "configuration details:");</div><div class='ctx'> </div><div class='ctx'> /* have argp */</div><div class='ctx'> #ifdef HAVE_ARGP</div><div class='del'>-	ret = write (fd, "argp 1\n", 7);</div><div class='del'>-        if (ret == -1)</div><div class='del'>-                goto out;</div><div class='add'>+    gf_msg_plain_nomem(GF_LOG_ALERT, "argp 1");</div><div class='ctx'> #endif</div><div class='ctx'> </div><div class='ctx'> /* ifdef if found backtrace */</div><div class='ctx'> #ifdef HAVE_BACKTRACE</div><div class='del'>-	ret = write (fd, "backtrace 1\n", 12);</div><div class='del'>-        if (ret == -1)</div><div class='del'>-                goto out;</div><div class='add'>+    gf_msg_plain_nomem(GF_LOG_ALERT, "backtrace 1");</div><div class='ctx'> #endif</div><div class='ctx'> </div><div class='ctx'> /* Berkeley-DB version has cursor-&gt;get() */</div><div class='ctx'> #ifdef HAVE_BDB_CURSOR_GET</div><div class='del'>-	ret = write (fd, "bdb-&gt;cursor-&gt;get 1\n", 19);</div><div class='del'>-        if (ret == -1)</div><div class='del'>-                goto out;</div><div class='add'>+    gf_msg_plain_nomem(GF_LOG_ALERT, "bdb-&gt;cursor-&gt;get 1");</div><div class='ctx'> #endif</div><div class='ctx'> </div><div class='ctx'> /* Define to 1 if you have the &lt;db.h&gt; header file. */</div><div class='ctx'> #ifdef HAVE_DB_H</div><div class='del'>-	ret = write (fd, "db.h 1\n", 7);</div><div class='del'>-        if (ret == -1)</div><div class='del'>-                goto out;</div><div class='add'>+    gf_msg_plain_nomem(GF_LOG_ALERT, "db.h 1");</div><div class='ctx'> #endif</div><div class='ctx'> </div><div class='ctx'> /* Define to 1 if you have the &lt;dlfcn.h&gt; header file. */</div><div class='ctx'> #ifdef HAVE_DLFCN_H</div><div class='del'>-	ret = write (fd, "dlfcn 1\n", 8);</div><div class='del'>-        if (ret == -1)</div><div class='del'>-                goto out;</div><div class='add'>+    gf_msg_plain_nomem(GF_LOG_ALERT, "dlfcn 1");</div><div class='ctx'> #endif</div><div class='ctx'> </div><div class='ctx'> /* define if fdatasync exists */</div><div class='ctx'> #ifdef HAVE_FDATASYNC</div><div class='del'>-	ret = write (fd, "fdatasync 1\n", 12);</div><div class='del'>-        if (ret == -1)</div><div class='del'>-                goto out;</div><div class='add'>+    gf_msg_plain_nomem(GF_LOG_ALERT, "fdatasync 1");</div><div class='ctx'> #endif</div><div class='ctx'> </div><div class='ctx'> /* Define to 1 if you have the `pthread' library (-lpthread). */</div><div class='ctx'> #ifdef HAVE_LIBPTHREAD</div><div class='del'>-	ret = write (fd, "libpthread 1\n", 13);</div><div class='del'>-        if (ret == -1)</div><div class='del'>-                goto out;</div><div class='add'>+    gf_msg_plain_nomem(GF_LOG_ALERT, "libpthread 1");</div><div class='ctx'> #endif</div><div class='ctx'> </div><div class='ctx'> /* define if llistxattr exists */</div><div class='ctx'> #ifdef HAVE_LLISTXATTR</div><div class='del'>-	ret = write (fd, "llistxattr 1\n", 13);</div><div class='del'>-        if (ret == -1)</div><div class='del'>-                goto out;</div><div class='add'>+    gf_msg_plain_nomem(GF_LOG_ALERT, "llistxattr 1");</div><div class='ctx'> #endif</div><div class='ctx'> </div><div class='ctx'> /* define if found setfsuid setfsgid */</div><div class='ctx'> #ifdef HAVE_SET_FSID</div><div class='del'>-	ret = write (fd, "setfsid 1\n", 10);</div><div class='del'>-        if (ret == -1)</div><div class='del'>-                goto out;</div><div class='add'>+    gf_msg_plain_nomem(GF_LOG_ALERT, "setfsid 1");</div><div class='ctx'> #endif</div><div class='ctx'> </div><div class='ctx'> /* define if found spinlock */</div><div class='ctx'> #ifdef HAVE_SPINLOCK</div><div class='del'>-	ret = write (fd, "spinlock 1\n", 11);</div><div class='del'>-        if (ret == -1)</div><div class='del'>-                goto out;</div><div class='add'>+    gf_msg_plain_nomem(GF_LOG_ALERT, "spinlock 1");</div><div class='ctx'> #endif</div><div class='ctx'> </div><div class='ctx'> /* Define to 1 if you have the &lt;sys/epoll.h&gt; header file. */</div><div class='ctx'> #ifdef HAVE_SYS_EPOLL_H</div><div class='del'>-	ret = write (fd, "epoll.h 1\n", 10);</div><div class='del'>-        if (ret == -1)</div><div class='del'>-                goto out;</div><div class='add'>+    gf_msg_plain_nomem(GF_LOG_ALERT, "epoll.h 1");</div><div class='ctx'> #endif</div><div class='ctx'> </div><div class='ctx'> /* Define to 1 if you have the &lt;sys/extattr.h&gt; header file. */</div><div class='ctx'> #ifdef HAVE_SYS_EXTATTR_H</div><div class='del'>-	ret = write (fd, "extattr.h 1\n", 12);</div><div class='del'>-        if (ret == -1)</div><div class='del'>-                goto out;</div><div class='add'>+    gf_msg_plain_nomem(GF_LOG_ALERT, "extattr.h 1");</div><div class='ctx'> #endif</div><div class='ctx'> </div><div class='ctx'> /* Define to 1 if you have the &lt;sys/xattr.h&gt; header file. */</div><div class='ctx'> #ifdef HAVE_SYS_XATTR_H</div><div class='del'>-	ret = write (fd, "xattr.h 1\n", 10);</div><div class='del'>-        if (ret == -1)</div><div class='del'>-                goto out;</div><div class='add'>+    gf_msg_plain_nomem(GF_LOG_ALERT, "xattr.h 1");</div><div class='ctx'> #endif</div><div class='ctx'> </div><div class='ctx'> /* define if found st_atim.tv_nsec */</div><div class='ctx'> #ifdef HAVE_STRUCT_STAT_ST_ATIM_TV_NSEC</div><div class='del'>-	ret = write (fd, "st_atim.tv_nsec 1\n", 18);</div><div class='del'>-        if (ret == -1)</div><div class='del'>-                goto out;</div><div class='add'>+    gf_msg_plain_nomem(GF_LOG_ALERT, "st_atim.tv_nsec 1");</div><div class='ctx'> #endif</div><div class='ctx'> </div><div class='ctx'> /* define if found st_atimespec.tv_nsec */</div><div class='ctx'> #ifdef HAVE_STRUCT_STAT_ST_ATIMESPEC_TV_NSEC</div><div class='del'>-	ret = write (fd, "st_atimespec.tv_nsec 1\n",23);</div><div class='del'>-        if (ret == -1)</div><div class='del'>-                goto out;</div><div class='add'>+    gf_msg_plain_nomem(GF_LOG_ALERT, "st_atimespec.tv_nsec 1");</div><div class='ctx'> #endif</div><div class='ctx'> </div><div class='ctx'> /* Define to the full name and version of this package. */</div><div class='ctx'> #ifdef PACKAGE_STRING</div><div class='del'>-	{</div><div class='del'>-		char msg[128];</div><div class='del'>-		sprintf (msg, "package-string: %s\n", PACKAGE_STRING);</div><div class='del'>-		ret = write (fd, msg, strlen (msg));</div><div class='del'>-                if (ret == -1)</div><div class='del'>-                        goto out;</div><div class='del'>-	}</div><div class='add'>+    {</div><div class='add'>+        char *msg = NULL;</div><div class='add'>+        int ret = -1;</div><div class='add'>+</div><div class='add'>+        ret = gf_asprintf(&amp;msg, "package-string: %s", PACKAGE_STRING);</div><div class='add'>+        if (ret &gt;= 0) {</div><div class='add'>+            gf_msg_plain_nomem(GF_LOG_ALERT, msg);</div><div class='add'>+            GF_FREE(msg);</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='ctx'> #endif</div><div class='ctx'> </div><div class='del'>-out:</div><div class='del'>-	return;</div><div class='add'>+    return;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-/* Obtain a backtrace and print it to stdout. */</div><div class='del'>-/* TODO: It looks like backtrace_symbols allocates memory,</div><div class='del'>-   it may be problem because mostly memory allocation/free causes 'sigsegv' */</div><div class='add'>+/* Obtain a backtrace and print it to the log */</div><div class='ctx'> void</div><div class='del'>-gf_print_trace (int32_t signum)</div><div class='del'>-{</div><div class='del'>-	extern FILE *gf_log_logfile;</div><div class='del'>-        struct tm   *tm = NULL;</div><div class='del'>-        char         msg[1024] = {0,};</div><div class='del'>-        char         timestr[256] = {0,};</div><div class='del'>-        time_t       utime = 0;</div><div class='del'>-        int          ret = 0;</div><div class='del'>-        int          fd = 0;</div><div class='del'>-</div><div class='del'>-        fd = fileno (gf_log_logfile);</div><div class='del'>-</div><div class='del'>-	/* Pending frames, (if any), list them in order */</div><div class='del'>-	ret = write (fd, "pending frames:\n", 16);</div><div class='del'>-	{</div><div class='del'>-		glusterfs_ctx_t *ctx = glusterfs_ctx_get ();</div><div class='del'>-		struct list_head *trav = ((call_pool_t *)ctx-&gt;pool)-&gt;all_frames.next;</div><div class='del'>-		while (trav != (&amp;((call_pool_t *)ctx-&gt;pool)-&gt;all_frames)) {</div><div class='del'>-			call_frame_t *tmp = (call_frame_t *)(&amp;((call_stack_t *)trav)-&gt;frames);</div><div class='del'>-			if (tmp-&gt;root-&gt;type == GF_OP_TYPE_FOP)</div><div class='del'>-				sprintf (msg,"frame : type(%d) op(%s)\n",</div><div class='del'>-					 tmp-&gt;root-&gt;type,</div><div class='del'>-					 gf_fop_list[tmp-&gt;root-&gt;op]);</div><div class='del'>-			if (tmp-&gt;root-&gt;type == GF_OP_TYPE_MGMT)</div><div class='del'>-				sprintf (msg,"frame : type(%d) op(%s)\n",</div><div class='del'>-					 tmp-&gt;root-&gt;type,</div><div class='del'>-					 gf_mgmt_list[tmp-&gt;root-&gt;op]);</div><div class='del'>-</div><div class='del'>-			ret = write (fd, msg, strlen (msg));</div><div class='del'>-			trav = trav-&gt;next;</div><div class='del'>-		}</div><div class='del'>-		ret = write (fd, "\n", 1);</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	sprintf (msg, "patchset: %s\n", GLUSTERFS_REPOSITORY_REVISION);</div><div class='del'>-	ret = write (fd, msg, strlen (msg));</div><div class='del'>-</div><div class='del'>-	sprintf (msg, "signal received: %d\n", signum);</div><div class='del'>-	ret = write (fd, msg, strlen (msg));</div><div class='del'>-</div><div class='add'>+gf_print_trace(int32_t signum, glusterfs_ctx_t *ctx)</div><div class='add'>+{</div><div class='add'>+    char msg[1024] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    char timestr[GF_TIMESTR_SIZE] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    call_stack_t *stack = NULL;</div><div class='add'>+</div><div class='add'>+    /* Now every gf_log call will just write to a buffer and when the</div><div class='add'>+     * buffer becomes full, its written to the log-file. Suppose the process</div><div class='add'>+     * crashes and prints the backtrace in the log-file, then the previous</div><div class='add'>+     * log information will still be in the buffer itself. So flush the</div><div class='add'>+     * contents of the buffer to the log file before printing the backtrace</div><div class='add'>+     * which helps in debugging.</div><div class='add'>+     */</div><div class='add'>+    gf_log_flush();</div><div class='add'>+</div><div class='add'>+    gf_log_disable_suppression_before_exit(ctx);</div><div class='add'>+</div><div class='add'>+    /* Pending frames, (if any), list them in order */</div><div class='add'>+    gf_msg_plain_nomem(GF_LOG_ALERT, "pending frames:");</div><div class='add'>+    {</div><div class='add'>+        /* FIXME: traversing stacks outside pool-&gt;lock */</div><div class='add'>+        list_for_each_entry(stack, &amp;ctx-&gt;pool-&gt;all_frames, all_frames)</div><div class='ctx'>         {</div><div class='del'>-                /* Dump the timestamp of the crash too, so the previous logs</div><div class='del'>-                   can be related */</div><div class='del'>-                utime = time (NULL);</div><div class='del'>-                tm    = localtime (&amp;utime);</div><div class='del'>-                strftime (timestr, 256, "%Y-%m-%d %H:%M:%S\n", tm);</div><div class='del'>-                ret = write (fd, "time of crash: ", 15);</div><div class='del'>-                ret = write (fd, timestr, strlen (timestr));</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-	gf_dump_config_flags (fd);</div><div class='del'>-#if HAVE_BACKTRACE</div><div class='del'>-	/* Print 'backtrace' */</div><div class='del'>-	{</div><div class='del'>-		void *array[200];</div><div class='del'>-		size_t size;</div><div class='add'>+            if (stack-&gt;type == GF_OP_TYPE_FOP)</div><div class='add'>+                sprintf(msg, "frame : type(%d) op(%s)", stack-&gt;type,</div><div class='add'>+                        gf_fop_list[stack-&gt;op]);</div><div class='add'>+            else</div><div class='add'>+                sprintf(msg, "frame : type(%d) op(%d)", stack-&gt;type, stack-&gt;op);</div><div class='ctx'> </div><div class='del'>-		size = backtrace (array, 200);</div><div class='del'>-		backtrace_symbols_fd (&amp;array[1], size-1, fd);</div><div class='del'>-		sprintf (msg, "---------\n");</div><div class='del'>-		ret = write (fd, msg, strlen (msg));</div><div class='del'>-	}</div><div class='del'>-#endif /* HAVE_BACKTRACE */</div><div class='del'>-</div><div class='del'>-	/* Send a signal to terminate the process */</div><div class='del'>-	signal (signum, SIG_DFL);</div><div class='del'>-	raise (signum);</div><div class='add'>+            gf_msg_plain_nomem(GF_LOG_ALERT, msg);</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    sprintf(msg, "patchset: %s", GLUSTERFS_REPOSITORY_REVISION);</div><div class='add'>+    gf_msg_plain_nomem(GF_LOG_ALERT, msg);</div><div class='add'>+</div><div class='add'>+    sprintf(msg, "signal received: %d", signum);</div><div class='add'>+    gf_msg_plain_nomem(GF_LOG_ALERT, msg);</div><div class='add'>+    {</div><div class='add'>+        /* Dump the timestamp of the crash too, so the previous logs</div><div class='add'>+           can be related */</div><div class='add'>+        gf_time_fmt(timestr, sizeof timestr, gf_time(), gf_timefmt_FT);</div><div class='add'>+        gf_msg_plain_nomem(GF_LOG_ALERT, "time of crash: ");</div><div class='add'>+        gf_msg_plain_nomem(GF_LOG_ALERT, timestr);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    gf_dump_config_flags();</div><div class='add'>+    gf_msg_backtrace_nomem(GF_LOG_ALERT, 200);</div><div class='add'>+    sprintf(msg, "---------");</div><div class='add'>+    gf_msg_plain_nomem(GF_LOG_ALERT, msg);</div><div class='add'>+</div><div class='add'>+    /* Send a signal to terminate the process */</div><div class='add'>+    signal(signum, SIG_DFL);</div><div class='add'>+    raise(signum);</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> void</div><div class='del'>-trap (void)</div><div class='add'>+trap(void)</div><div class='ctx'> {</div><div class='del'>-</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> char *</div><div class='del'>-gf_trim (char *string)</div><div class='add'>+gf_trim(char *string)</div><div class='ctx'> {</div><div class='del'>-	register char *s, *t;</div><div class='add'>+    register char *s, *t;</div><div class='ctx'> </div><div class='del'>-	if (string == NULL)</div><div class='del'>-	{</div><div class='del'>-		return NULL;</div><div class='del'>-	}</div><div class='add'>+    if (string == NULL) {</div><div class='add'>+        return NULL;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	for (s = string; isspace (*s); s++)</div><div class='del'>-		;</div><div class='add'>+    for (s = string; isspace(*s); s++)</div><div class='add'>+        ;</div><div class='ctx'> </div><div class='del'>-	if (*s == 0)</div><div class='del'>-		return s;</div><div class='add'>+    if (*s == 0)</div><div class='add'>+        return s;</div><div class='ctx'> </div><div class='del'>-	t = s + strlen (s) - 1;</div><div class='del'>-	while (t &gt; s &amp;&amp; isspace (*t))</div><div class='del'>-		t--;</div><div class='del'>-	*++t = '\0';</div><div class='add'>+    t = s + strlen(s) - 1;</div><div class='add'>+    while (t &gt; s &amp;&amp; isspace(*t))</div><div class='add'>+        t--;</div><div class='add'>+    *++t = '\0';</div><div class='ctx'> </div><div class='del'>-	return s;</div><div class='add'>+    return s;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-gf_strsplit (const char *str, const char *delim,</div><div class='del'>-	     char ***tokens, int *token_count)</div><div class='add'>+gf_strstr(const char *str, const char *delim, const char *match)</div><div class='ctx'> {</div><div class='del'>-	char *_running = NULL;</div><div class='del'>-	char *running = NULL;</div><div class='del'>-	char *token = NULL;</div><div class='del'>-	char **token_list = NULL;</div><div class='del'>-	int count = 0;</div><div class='del'>-	int i = 0;</div><div class='del'>-	int j = 0;</div><div class='add'>+    char *tmp = NULL;</div><div class='add'>+    char *save_ptr = NULL;</div><div class='add'>+    char *tmp_str = NULL;</div><div class='add'>+</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    tmp_str = strdup(str);</div><div class='ctx'> </div><div class='del'>-	if (str == NULL || delim == NULL || tokens == NULL || token_count == NULL)</div><div class='del'>-	{</div><div class='del'>-		return -1;</div><div class='del'>-	}</div><div class='add'>+    if (str == NULL || delim == NULL || match == NULL || tmp_str == NULL) {</div><div class='add'>+        gf_msg_callingfn(THIS-&gt;name, GF_LOG_WARNING, EINVAL, LG_MSG_INVALID_ARG,</div><div class='add'>+                         "argument invalid");</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    tmp = strtok_r(tmp_str, delim, &amp;save_ptr);</div><div class='add'>+</div><div class='add'>+    while (tmp) {</div><div class='add'>+        ret = strcmp(tmp, match);</div><div class='add'>+</div><div class='add'>+        if (ret == 0)</div><div class='add'>+            break;</div><div class='add'>+</div><div class='add'>+        tmp = strtok_r(NULL, delim, &amp;save_ptr);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    free(tmp_str);</div><div class='ctx'> </div><div class='del'>-        _running = gf_strdup (str);</div><div class='del'>-	if (_running == NULL)</div><div class='del'>-	{</div><div class='del'>-		return -1;</div><div class='del'>-	}</div><div class='del'>-	running = _running;</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	while ((token = strsep (&amp;running, delim)) != NULL)</div><div class='del'>-	{</div><div class='del'>-		if (token[0] != '\0')</div><div class='del'>-			count++;</div><div class='del'>-	}</div><div class='del'>-	GF_FREE (_running);</div><div class='add'>+int</div><div class='add'>+gf_volume_name_validate(const char *volume_name)</div><div class='add'>+{</div><div class='add'>+    const char *vname = NULL;</div><div class='ctx'> </div><div class='del'>-        _running = gf_strdup (str);</div><div class='del'>-	if (_running == NULL)</div><div class='del'>-	{</div><div class='del'>-		return -1;</div><div class='del'>-	}</div><div class='del'>-	running = _running;</div><div class='add'>+    if (volume_name == NULL) {</div><div class='add'>+        gf_msg_callingfn(THIS-&gt;name, GF_LOG_WARNING, EINVAL, LG_MSG_INVALID_ARG,</div><div class='add'>+                         "argument invalid");</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	if ((token_list = GF_CALLOC (count, sizeof (char *),</div><div class='del'>-                                        gf_common_mt_char)) == NULL)</div><div class='del'>-	{</div><div class='del'>-		GF_FREE (_running);</div><div class='del'>-		return -1;</div><div class='del'>-	}</div><div class='add'>+    if (!isalpha(volume_name[0]))</div><div class='add'>+        return 1;</div><div class='ctx'> </div><div class='del'>-	while ((token = strsep (&amp;running, delim)) != NULL)</div><div class='del'>-	{</div><div class='del'>-		if (token[0] == '\0')</div><div class='del'>-			continue;</div><div class='add'>+    for (vname = &amp;volume_name[1]; *vname != '\0'; vname++) {</div><div class='add'>+        if (!(isalnum(*vname) || *vname == '_'))</div><div class='add'>+            return 1;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-                token_list[i] = gf_strdup (token);</div><div class='del'>-		if (token_list[i] == NULL)</div><div class='del'>-			goto free_exit;</div><div class='del'>-                i++;</div><div class='del'>-	}</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	GF_FREE (_running);</div><div class='add'>+int</div><div class='add'>+gf_string2time(const char *str, uint32_t *n)</div><div class='add'>+{</div><div class='add'>+    unsigned long value = 0;</div><div class='add'>+    char *tail = NULL;</div><div class='add'>+    int old_errno = 0;</div><div class='add'>+    const char *s = NULL;</div><div class='add'>+</div><div class='add'>+    if (str == NULL || n == NULL) {</div><div class='add'>+        gf_msg_callingfn(THIS-&gt;name, GF_LOG_WARNING, EINVAL, LG_MSG_INVALID_ARG,</div><div class='add'>+                         "argument invalid");</div><div class='add'>+        errno = EINVAL;</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    for (s = str; *s != '\0'; s++) {</div><div class='add'>+        if (isspace(*s))</div><div class='add'>+            continue;</div><div class='add'>+        if (*s == '-')</div><div class='add'>+            return -1;</div><div class='add'>+        break;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    old_errno = errno;</div><div class='add'>+    errno = 0;</div><div class='add'>+    value = strtol(str, &amp;tail, 0);</div><div class='add'>+    if (str == tail)</div><div class='add'>+        errno = EINVAL;</div><div class='add'>+</div><div class='add'>+    if (errno == ERANGE || errno == EINVAL)</div><div class='add'>+        return -1;</div><div class='add'>+</div><div class='add'>+    if (errno == 0)</div><div class='add'>+        errno = old_errno;</div><div class='add'>+</div><div class='add'>+    if (((tail[0] == '\0') || ((tail[0] == 's') &amp;&amp; (tail[1] == '\0')) ||</div><div class='add'>+         ((tail[0] == 's') &amp;&amp; (tail[1] == 'e') &amp;&amp; (tail[2] == 'c') &amp;&amp;</div><div class='add'>+          (tail[3] == '\0'))))</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    else if (((tail[0] == 'm') &amp;&amp; (tail[1] == '\0')) ||</div><div class='add'>+             ((tail[0] == 'm') &amp;&amp; (tail[1] == 'i') &amp;&amp; (tail[2] == 'n') &amp;&amp;</div><div class='add'>+              (tail[3] == '\0'))) {</div><div class='add'>+        value = value * GF_MINUTE_IN_SECONDS;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    else if (((tail[0] == 'h') &amp;&amp; (tail[1] == '\0')) ||</div><div class='add'>+             ((tail[0] == 'h') &amp;&amp; (tail[1] == 'r') &amp;&amp; (tail[2] == '\0'))) {</div><div class='add'>+        value = value * GF_HOUR_IN_SECONDS;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    else if (((tail[0] == 'd') &amp;&amp; (tail[1] == '\0')) ||</div><div class='add'>+             ((tail[0] == 'd') &amp;&amp; (tail[1] == 'a') &amp;&amp; (tail[2] == 'y') &amp;&amp;</div><div class='add'>+              (tail[3] == 's') &amp;&amp; (tail[4] == '\0'))) {</div><div class='add'>+        value = value * GF_DAY_IN_SECONDS;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    else if (((tail[0] == 'w') &amp;&amp; (tail[1] == '\0')) ||</div><div class='add'>+             ((tail[0] == 'w') &amp;&amp; (tail[1] == 'k') &amp;&amp; (tail[2] == '\0'))) {</div><div class='add'>+        value = value * GF_WEEK_IN_SECONDS;</div><div class='add'>+        goto out;</div><div class='add'>+    } else {</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	*tokens = token_list;</div><div class='del'>-	*token_count = count;</div><div class='del'>-	return 0;</div><div class='add'>+out:</div><div class='add'>+    *n = value;</div><div class='ctx'> </div><div class='del'>-free_exit:</div><div class='del'>-	GF_FREE (_running);</div><div class='del'>-	for (j = 0; j &lt; i; j++)</div><div class='del'>-	{</div><div class='del'>-		GF_FREE (token_list[j]);</div><div class='del'>-	}</div><div class='del'>-	GF_FREE (token_list);</div><div class='del'>-	return -1;</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-gf_strstr (const char *str, const char *delim, const char *match)</div><div class='add'>+gf_string2percent(const char *str, double *n)</div><div class='ctx'> {</div><div class='del'>-        char *tmp      = NULL;</div><div class='del'>-        char *save_ptr = NULL;</div><div class='del'>-        char *tmp_str  = NULL;</div><div class='add'>+    double value = 0;</div><div class='add'>+    char *tail = NULL;</div><div class='add'>+    int old_errno = 0;</div><div class='add'>+    const char *s = NULL;</div><div class='add'>+</div><div class='add'>+    if (str == NULL || n == NULL) {</div><div class='add'>+        gf_msg_callingfn(THIS-&gt;name, GF_LOG_WARNING, EINVAL, LG_MSG_INVALID_ARG,</div><div class='add'>+                         "argument invalid");</div><div class='add'>+        errno = EINVAL;</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    for (s = str; *s != '\0'; s++) {</div><div class='add'>+        if (isspace(*s))</div><div class='add'>+            continue;</div><div class='add'>+        if (*s == '-')</div><div class='add'>+            return -1;</div><div class='add'>+        break;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    old_errno = errno;</div><div class='add'>+    errno = 0;</div><div class='add'>+    value = strtod(str, &amp;tail);</div><div class='add'>+    if (str == tail)</div><div class='add'>+        errno = EINVAL;</div><div class='add'>+</div><div class='add'>+    if (errno == ERANGE || errno == EINVAL)</div><div class='add'>+        return -1;</div><div class='add'>+</div><div class='add'>+    if (errno == 0)</div><div class='add'>+        errno = old_errno;</div><div class='add'>+</div><div class='add'>+    if (!((tail[0] == '\0') || ((tail[0] == '%') &amp;&amp; (tail[1] == '\0'))))</div><div class='add'>+        return -1;</div><div class='add'>+</div><div class='add'>+    *n = value;</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        int  ret       = 0;</div><div class='add'>+static int</div><div class='add'>+_gf_string2long(const char *str, long *n, int base)</div><div class='add'>+{</div><div class='add'>+    long value = 0;</div><div class='add'>+    char *tail = NULL;</div><div class='add'>+    int old_errno = 0;</div><div class='ctx'> </div><div class='del'>-        tmp_str = strdup (str);</div><div class='add'>+    if (str == NULL || n == NULL) {</div><div class='add'>+        gf_msg_callingfn(THIS-&gt;name, GF_LOG_WARNING, EINVAL, LG_MSG_INVALID_ARG,</div><div class='add'>+                         "argument invalid");</div><div class='add'>+        errno = EINVAL;</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        if (str == NULL || delim == NULL || match == NULL || tmp_str == NULL) {</div><div class='del'>-                ret = -1;</div><div class='del'>-		goto out;</div><div class='del'>-	}</div><div class='add'>+    old_errno = errno;</div><div class='add'>+    errno = 0;</div><div class='add'>+    value = strtol(str, &amp;tail, base);</div><div class='add'>+    if (str == tail)</div><div class='add'>+        errno = EINVAL;</div><div class='ctx'> </div><div class='add'>+    if (errno == ERANGE || errno == EINVAL)</div><div class='add'>+        return -1;</div><div class='ctx'> </div><div class='del'>-        tmp = strtok_r (tmp_str, delim, &amp;save_ptr);</div><div class='add'>+    if (errno == 0)</div><div class='add'>+        errno = old_errno;</div><div class='ctx'> </div><div class='del'>-        while (tmp) {</div><div class='del'>-                ret = strcmp (tmp, match);</div><div class='add'>+    if (tail[0] != '\0')</div><div class='add'>+        return -1;</div><div class='ctx'> </div><div class='del'>-                if (ret == 0)</div><div class='del'>-                        break;</div><div class='add'>+    *n = value;</div><div class='ctx'> </div><div class='del'>-                tmp = strtok_r (NULL, delim, &amp;save_ptr);</div><div class='del'>-        }</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-out:</div><div class='del'>-        if (tmp_str)</div><div class='del'>-                free (tmp_str);</div><div class='add'>+static int</div><div class='add'>+_gf_string2ulong(const char *str, unsigned long *n, int base)</div><div class='add'>+{</div><div class='add'>+    unsigned long value = 0;</div><div class='add'>+    char *tail = NULL;</div><div class='add'>+    int old_errno = 0;</div><div class='add'>+    const char *s = NULL;</div><div class='add'>+</div><div class='add'>+    if (str == NULL || n == NULL) {</div><div class='add'>+        gf_msg_callingfn(THIS-&gt;name, GF_LOG_WARNING, EINVAL, LG_MSG_INVALID_ARG,</div><div class='add'>+                         "argument invalid");</div><div class='add'>+        errno = EINVAL;</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    for (s = str; *s != '\0'; s++) {</div><div class='add'>+        if (isspace(*s))</div><div class='add'>+            continue;</div><div class='add'>+        if (*s == '-')</div><div class='add'>+            return -1;</div><div class='add'>+        break;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    old_errno = errno;</div><div class='add'>+    errno = 0;</div><div class='add'>+    value = strtoul(str, &amp;tail, base);</div><div class='add'>+    if (str == tail)</div><div class='add'>+        errno = EINVAL;</div><div class='add'>+</div><div class='add'>+    if (errno == ERANGE || errno == EINVAL)</div><div class='add'>+        return -1;</div><div class='add'>+</div><div class='add'>+    if (errno == 0)</div><div class='add'>+        errno = old_errno;</div><div class='add'>+</div><div class='add'>+    if (tail[0] != '\0')</div><div class='add'>+        return -1;</div><div class='add'>+</div><div class='add'>+    *n = value;</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        return ret;</div><div class='add'>+static int</div><div class='add'>+_gf_string2uint(const char *str, unsigned int *n, int base)</div><div class='add'>+{</div><div class='add'>+    unsigned long value = 0;</div><div class='add'>+    char *tail = NULL;</div><div class='add'>+    int old_errno = 0;</div><div class='add'>+    const char *s = NULL;</div><div class='add'>+</div><div class='add'>+    if (str == NULL || n == NULL) {</div><div class='add'>+        gf_msg_callingfn(THIS-&gt;name, GF_LOG_WARNING, EINVAL, LG_MSG_INVALID_ARG,</div><div class='add'>+                         "argument invalid");</div><div class='add'>+        errno = EINVAL;</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    for (s = str; *s != '\0'; s++) {</div><div class='add'>+        if (isspace(*s))</div><div class='add'>+            continue;</div><div class='add'>+        if (*s == '-')</div><div class='add'>+            return -1;</div><div class='add'>+        break;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    old_errno = errno;</div><div class='add'>+    errno = 0;</div><div class='add'>+    value = strtoul(str, &amp;tail, base);</div><div class='add'>+    if (str == tail)</div><div class='add'>+        errno = EINVAL;</div><div class='add'>+</div><div class='add'>+    if (errno == ERANGE || errno == EINVAL)</div><div class='add'>+        return -1;</div><div class='add'>+</div><div class='add'>+    if (errno == 0)</div><div class='add'>+        errno = old_errno;</div><div class='add'>+</div><div class='add'>+    if (tail[0] != '\0')</div><div class='add'>+        return -1;</div><div class='add'>+</div><div class='add'>+    *n = (unsigned int)value;</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+_gf_string2double(const char *str, double *n)</div><div class='add'>+{</div><div class='add'>+    double value = 0.0;</div><div class='add'>+    char *tail = NULL;</div><div class='add'>+    int old_errno = 0;</div><div class='add'>+</div><div class='add'>+    if (str == NULL || n == NULL) {</div><div class='add'>+        gf_msg_callingfn(THIS-&gt;name, GF_LOG_WARNING, EINVAL, LG_MSG_INVALID_ARG,</div><div class='add'>+                         "argument invalid");</div><div class='add'>+        errno = EINVAL;</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    old_errno = errno;</div><div class='add'>+    errno = 0;</div><div class='add'>+    value = strtod(str, &amp;tail);</div><div class='add'>+    if (str == tail)</div><div class='add'>+        errno = EINVAL;</div><div class='add'>+</div><div class='add'>+    if (errno == ERANGE || errno == EINVAL)</div><div class='add'>+        return -1;</div><div class='ctx'> </div><div class='add'>+    if (errno == 0)</div><div class='add'>+        errno = old_errno;</div><div class='add'>+</div><div class='add'>+    if (tail[0] != '\0')</div><div class='add'>+        return -1;</div><div class='add'>+</div><div class='add'>+    *n = value;</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-gf_volume_name_validate (const char *volume_name)</div><div class='add'>+static int</div><div class='add'>+_gf_string2longlong(const char *str, long long *n, int base)</div><div class='ctx'> {</div><div class='del'>-	const char *vname = NULL;</div><div class='add'>+    long long value = 0;</div><div class='add'>+    char *tail = NULL;</div><div class='add'>+    int old_errno = 0;</div><div class='add'>+</div><div class='add'>+    if (str == NULL || n == NULL) {</div><div class='add'>+        gf_msg_callingfn(THIS-&gt;name, GF_LOG_WARNING, EINVAL, LG_MSG_INVALID_ARG,</div><div class='add'>+                         "argument invalid");</div><div class='add'>+        errno = EINVAL;</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    old_errno = errno;</div><div class='add'>+    errno = 0;</div><div class='add'>+    value = strtoll(str, &amp;tail, base);</div><div class='add'>+    if (str == tail)</div><div class='add'>+        errno = EINVAL;</div><div class='ctx'> </div><div class='del'>-	if (volume_name == NULL)</div><div class='del'>-	{</div><div class='del'>-		return -1;</div><div class='del'>-	}</div><div class='add'>+    if (errno == ERANGE || errno == EINVAL)</div><div class='add'>+        return -1;</div><div class='ctx'> </div><div class='del'>-	if (!isalpha (volume_name[0]))</div><div class='del'>-	{</div><div class='del'>-		return 1;</div><div class='del'>-	}</div><div class='add'>+    if (errno == 0)</div><div class='add'>+        errno = old_errno;</div><div class='ctx'> </div><div class='del'>-	for (vname = &amp;volume_name[1]; *vname != '\0'; vname++)</div><div class='del'>-	{</div><div class='del'>-		if (!(isalnum (*vname) || *vname == '_'))</div><div class='del'>-			return 1;</div><div class='del'>-	}</div><div class='add'>+    if (tail[0] != '\0')</div><div class='add'>+        return -1;</div><div class='ctx'> </div><div class='del'>-	return 0;</div><div class='add'>+    *n = value;</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+static int</div><div class='add'>+_gf_string2ulonglong(const char *str, unsigned long long *n, int base)</div><div class='add'>+{</div><div class='add'>+    unsigned long long value = 0;</div><div class='add'>+    char *tail = NULL;</div><div class='add'>+    int old_errno = 0;</div><div class='add'>+    const char *s = NULL;</div><div class='add'>+</div><div class='add'>+    if (str == NULL || n == NULL) {</div><div class='add'>+        gf_msg_callingfn(THIS-&gt;name, GF_LOG_WARNING, EINVAL, LG_MSG_INVALID_ARG,</div><div class='add'>+                         "argument invalid");</div><div class='add'>+        errno = EINVAL;</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    for (s = str; *s != '\0'; s++) {</div><div class='add'>+        if (isspace(*s))</div><div class='add'>+            continue;</div><div class='add'>+        if (*s == '-')</div><div class='add'>+            return -1;</div><div class='add'>+        break;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    old_errno = errno;</div><div class='add'>+    errno = 0;</div><div class='add'>+    value = strtoull(str, &amp;tail, base);</div><div class='add'>+    if (str == tail)</div><div class='add'>+        errno = EINVAL;</div><div class='add'>+</div><div class='add'>+    if (errno == ERANGE || errno == EINVAL)</div><div class='add'>+        return -1;</div><div class='add'>+</div><div class='add'>+    if (errno == 0)</div><div class='add'>+        errno = old_errno;</div><div class='add'>+</div><div class='add'>+    if (tail[0] != '\0')</div><div class='add'>+        return -1;</div><div class='add'>+</div><div class='add'>+    *n = value;</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-gf_string2time (const char *str, uint32_t *n)</div><div class='add'>+gf_string2long(const char *str, long *n)</div><div class='ctx'> {</div><div class='del'>-	unsigned long value = 0;</div><div class='del'>-	char *tail = NULL;</div><div class='del'>-	int old_errno = 0;</div><div class='del'>-	const char *s = NULL;</div><div class='add'>+    return _gf_string2long(str, n, 0);</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	if (str == NULL || n == NULL)</div><div class='del'>-	{</div><div class='del'>-		errno = EINVAL;</div><div class='del'>-		return -1;</div><div class='del'>-	}</div><div class='add'>+int</div><div class='add'>+gf_string2ulong(const char *str, unsigned long *n)</div><div class='add'>+{</div><div class='add'>+    return _gf_string2ulong(str, n, 0);</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	for (s = str; *s != '\0'; s++)</div><div class='del'>-	{</div><div class='del'>-		if (isspace (*s))</div><div class='del'>-		{</div><div class='del'>-			continue;</div><div class='del'>-		}</div><div class='del'>-		if (*s == '-')</div><div class='del'>-		{</div><div class='del'>-			return -1;</div><div class='del'>-		}</div><div class='del'>-		break;</div><div class='del'>-	}</div><div class='add'>+int</div><div class='add'>+gf_string2int(const char *str, int *n)</div><div class='add'>+{</div><div class='add'>+    long l = 0;</div><div class='add'>+    int ret = 0;</div><div class='ctx'> </div><div class='del'>-	old_errno = errno;</div><div class='del'>-	errno = 0;</div><div class='del'>-	value = strtol (str, &amp;tail, 0);</div><div class='add'>+    ret = _gf_string2long(str, &amp;l, 0);</div><div class='ctx'> </div><div class='del'>-	if (errno == ERANGE || errno == EINVAL)</div><div class='del'>-	{</div><div class='del'>-		return -1;</div><div class='del'>-	}</div><div class='add'>+    *n = l;</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	if (errno == 0)</div><div class='del'>-	{</div><div class='del'>-		errno = old_errno;</div><div class='del'>-	}</div><div class='add'>+int</div><div class='add'>+gf_string2uint(const char *str, unsigned int *n)</div><div class='add'>+{</div><div class='add'>+    return _gf_string2uint(str, n, 0);</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	if (!((tail[0] == '\0') ||</div><div class='del'>-	      ((tail[0] == 's') &amp;&amp; (tail[1] == '\0')) ||</div><div class='del'>-	      ((tail[0] == 's') &amp;&amp; (tail[1] == 'e') &amp;&amp; (tail[2] == 'c') &amp;&amp; (tail[3] == '\0'))))</div><div class='del'>-	{</div><div class='del'>-		return -1;</div><div class='del'>-	}</div><div class='add'>+int</div><div class='add'>+gf_string2double(const char *str, double *n)</div><div class='add'>+{</div><div class='add'>+    return _gf_string2double(str, n);</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	*n = value;</div><div class='add'>+int</div><div class='add'>+gf_string2longlong(const char *str, long long *n)</div><div class='add'>+{</div><div class='add'>+    return _gf_string2longlong(str, n, 0);</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	return 0;</div><div class='add'>+int</div><div class='add'>+gf_string2ulonglong(const char *str, unsigned long long *n)</div><div class='add'>+{</div><div class='add'>+    return _gf_string2ulonglong(str, n, 0);</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+int</div><div class='add'>+gf_string2int8(const char *str, int8_t *n)</div><div class='add'>+{</div><div class='add'>+    long l = 0L;</div><div class='add'>+    int rv = 0;</div><div class='add'>+</div><div class='add'>+    rv = _gf_string2long(str, &amp;l, 0);</div><div class='add'>+    if (rv != 0)</div><div class='add'>+        return rv;</div><div class='add'>+</div><div class='add'>+    if ((l &gt;= INT8_MIN) &amp;&amp; (l &lt;= INT8_MAX)) {</div><div class='add'>+        *n = (int8_t)l;</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    errno = ERANGE;</div><div class='add'>+    return -1;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-gf_string2percent (const char *str, uint32_t *n)</div><div class='add'>+gf_string2int16(const char *str, int16_t *n)</div><div class='ctx'> {</div><div class='del'>-	unsigned long value = 0;</div><div class='del'>-	char *tail = NULL;</div><div class='del'>-	int old_errno = 0;</div><div class='del'>-	const char *s = NULL;</div><div class='add'>+    long l = 0L;</div><div class='add'>+    int rv = 0;</div><div class='ctx'> </div><div class='del'>-	if (str == NULL || n == NULL)</div><div class='del'>-	{</div><div class='del'>-		errno = EINVAL;</div><div class='del'>-		return -1;</div><div class='del'>-	}</div><div class='add'>+    rv = _gf_string2long(str, &amp;l, 0);</div><div class='add'>+    if (rv != 0)</div><div class='add'>+        return rv;</div><div class='ctx'> </div><div class='del'>-	for (s = str; *s != '\0'; s++)</div><div class='del'>-	{</div><div class='del'>-		if (isspace (*s))</div><div class='del'>-		{</div><div class='del'>-			continue;</div><div class='del'>-		}</div><div class='del'>-		if (*s == '-')</div><div class='del'>-		{</div><div class='del'>-			return -1;</div><div class='del'>-		}</div><div class='del'>-		break;</div><div class='del'>-	}</div><div class='add'>+    if ((l &gt;= INT16_MIN) &amp;&amp; (l &lt;= INT16_MAX)) {</div><div class='add'>+        *n = (int16_t)l;</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	old_errno = errno;</div><div class='del'>-	errno = 0;</div><div class='del'>-	value = strtol (str, &amp;tail, 0);</div><div class='add'>+    errno = ERANGE;</div><div class='add'>+    return -1;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	if (errno == ERANGE || errno == EINVAL)</div><div class='del'>-	{</div><div class='del'>-		return -1;</div><div class='del'>-	}</div><div class='add'>+int</div><div class='add'>+gf_string2int32(const char *str, int32_t *n)</div><div class='add'>+{</div><div class='add'>+    long l = 0L;</div><div class='add'>+    int rv = 0;</div><div class='ctx'> </div><div class='del'>-	if (errno == 0)</div><div class='del'>-	{</div><div class='del'>-		errno = old_errno;</div><div class='del'>-	}</div><div class='add'>+    rv = _gf_string2long(str, &amp;l, 0);</div><div class='add'>+    if (rv != 0)</div><div class='add'>+        return rv;</div><div class='ctx'> </div><div class='del'>-	if (!((tail[0] == '\0') ||</div><div class='del'>-	      ((tail[0] == '%') &amp;&amp; (tail[1] == '\0'))))</div><div class='del'>-	{</div><div class='del'>-		return -1;</div><div class='del'>-	}</div><div class='add'>+    if ((l &gt;= INT32_MIN) &amp;&amp; (l &lt;= INT32_MAX)) {</div><div class='add'>+        *n = (int32_t)l;</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	*n = value;</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='add'>+    errno = ERANGE;</div><div class='add'>+    return -1;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+int</div><div class='add'>+gf_string2int64(const char *str, int64_t *n)</div><div class='add'>+{</div><div class='add'>+    long long l = 0LL;</div><div class='add'>+    int rv = 0;</div><div class='ctx'> </div><div class='del'>-static int</div><div class='del'>-_gf_string2long (const char *str, long *n, int base)</div><div class='add'>+    rv = _gf_string2longlong(str, &amp;l, 0);</div><div class='add'>+    if (rv != 0)</div><div class='add'>+        return rv;</div><div class='add'>+</div><div class='add'>+    *n = (int64_t)l;</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+gf_string2uint8(const char *str, uint8_t *n)</div><div class='ctx'> {</div><div class='del'>-	long value = 0;</div><div class='del'>-	char *tail = NULL;</div><div class='del'>-	int old_errno = 0;</div><div class='add'>+    unsigned long l = 0L;</div><div class='add'>+    int rv = 0;</div><div class='ctx'> </div><div class='del'>-	if (str == NULL || n == NULL)</div><div class='del'>-	{</div><div class='del'>-		errno = EINVAL;</div><div class='del'>-		return -1;</div><div class='del'>-	}</div><div class='add'>+    rv = _gf_string2ulong(str, &amp;l, 0);</div><div class='add'>+    if (rv != 0)</div><div class='add'>+        return rv;</div><div class='ctx'> </div><div class='del'>-	old_errno = errno;</div><div class='del'>-	errno = 0;</div><div class='del'>-	value = strtol (str, &amp;tail, base);</div><div class='add'>+    if (l &lt;= UINT8_MAX) {</div><div class='add'>+        *n = (uint8_t)l;</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	if (errno == ERANGE || errno == EINVAL)</div><div class='del'>-	{</div><div class='del'>-		return -1;</div><div class='del'>-	}</div><div class='add'>+    errno = ERANGE;</div><div class='add'>+    return -1;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	if (errno == 0)</div><div class='del'>-	{</div><div class='del'>-		errno = old_errno;</div><div class='del'>-	}</div><div class='add'>+int</div><div class='add'>+gf_string2uint16(const char *str, uint16_t *n)</div><div class='add'>+{</div><div class='add'>+    unsigned long l = 0L;</div><div class='add'>+    int rv = 0;</div><div class='ctx'> </div><div class='del'>-	if (tail[0] != '\0')</div><div class='del'>-	{</div><div class='del'>-		/* bala: invalid integer format */</div><div class='del'>-		return -1;</div><div class='del'>-	}</div><div class='add'>+    rv = _gf_string2ulong(str, &amp;l, 0);</div><div class='add'>+    if (rv != 0)</div><div class='add'>+        return rv;</div><div class='ctx'> </div><div class='del'>-	*n = value;</div><div class='add'>+    if (l &lt;= UINT16_MAX) {</div><div class='add'>+        *n = (uint16_t)l;</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	return 0;</div><div class='add'>+    errno = ERANGE;</div><div class='add'>+    return -1;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-static int</div><div class='del'>-_gf_string2ulong (const char *str, unsigned long *n, int base)</div><div class='del'>-{</div><div class='del'>-	unsigned long value = 0;</div><div class='del'>-	char *tail = NULL;</div><div class='del'>-	int old_errno = 0;</div><div class='del'>-	const char *s = NULL;</div><div class='del'>-</div><div class='del'>-	if (str == NULL || n == NULL)</div><div class='del'>-	{</div><div class='del'>-		errno = EINVAL;</div><div class='del'>-		return -1;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	for (s = str; *s != '\0'; s++)</div><div class='del'>-	{</div><div class='del'>-		if (isspace (*s))</div><div class='del'>-		{</div><div class='del'>-			continue;</div><div class='del'>-		}</div><div class='del'>-		if (*s == '-')</div><div class='del'>-		{</div><div class='del'>-			/* bala: we do not support suffixed (-) sign and</div><div class='del'>-			   invalid integer format */</div><div class='del'>-			return -1;</div><div class='del'>-		}</div><div class='del'>-		break;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	old_errno = errno;</div><div class='del'>-	errno = 0;</div><div class='del'>-	value = strtoul (str, &amp;tail, base);</div><div class='del'>-</div><div class='del'>-	if (errno == ERANGE || errno == EINVAL)</div><div class='del'>-	{</div><div class='del'>-		return -1;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	if (errno == 0)</div><div class='del'>-	{</div><div class='del'>-		errno = old_errno;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	if (tail[0] != '\0')</div><div class='del'>-	{</div><div class='del'>-		/* bala: invalid integer format */</div><div class='del'>-		return -1;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	*n = value;</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='add'>+int</div><div class='add'>+gf_string2uint32(const char *str, uint32_t *n)</div><div class='add'>+{</div><div class='add'>+    unsigned long l = 0L;</div><div class='add'>+    int rv = 0;</div><div class='ctx'> </div><div class='del'>-static int</div><div class='del'>-_gf_string2uint (const char *str, unsigned int *n, int base)</div><div class='del'>-{</div><div class='del'>-	unsigned long value = 0;</div><div class='del'>-	char *tail = NULL;</div><div class='del'>-	int old_errno = 0;</div><div class='del'>-	const char *s = NULL;</div><div class='del'>-</div><div class='del'>-	if (str == NULL || n == NULL)</div><div class='del'>-	{</div><div class='del'>-		errno = EINVAL;</div><div class='del'>-		return -1;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	for (s = str; *s != '\0'; s++)</div><div class='del'>-	{</div><div class='del'>-		if (isspace (*s))</div><div class='del'>-		{</div><div class='del'>-			continue;</div><div class='del'>-		}</div><div class='del'>-		if (*s == '-')</div><div class='del'>-		{</div><div class='del'>-			/* bala: we do not support suffixed (-) sign and</div><div class='del'>-			   invalid integer format */</div><div class='del'>-			return -1;</div><div class='del'>-		}</div><div class='del'>-		break;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	old_errno = errno;</div><div class='del'>-	errno = 0;</div><div class='del'>-	value = strtoul (str, &amp;tail, base);</div><div class='del'>-</div><div class='del'>-	if (errno == ERANGE || errno == EINVAL)</div><div class='del'>-	{</div><div class='del'>-		return -1;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	if (errno == 0)</div><div class='del'>-	{</div><div class='del'>-		errno = old_errno;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	if (tail[0] != '\0')</div><div class='del'>-	{</div><div class='del'>-		/* bala: invalid integer format */</div><div class='del'>-		return -1;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	*n = (unsigned int)value;</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='add'>+    rv = _gf_string2ulong(str, &amp;l, 0);</div><div class='add'>+    if (rv != 0)</div><div class='add'>+        return rv;</div><div class='add'>+</div><div class='add'>+    if (l &lt;= UINT32_MAX) {</div><div class='add'>+        *n = (uint32_t)l;</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    errno = ERANGE;</div><div class='add'>+    return -1;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-static int</div><div class='del'>-_gf_string2double (const char *str, double *n)</div><div class='add'>+int</div><div class='add'>+gf_string2uint64(const char *str, uint64_t *n)</div><div class='ctx'> {</div><div class='del'>-	double value     = 0.0;</div><div class='del'>-	char   *tail     = NULL;</div><div class='del'>-	int    old_errno = 0;</div><div class='add'>+    unsigned long long l = 0ULL;</div><div class='add'>+    int rv = 0;</div><div class='ctx'> </div><div class='del'>-	if (str == NULL || n == NULL) {</div><div class='del'>-		errno = EINVAL;</div><div class='del'>-		return -1;</div><div class='del'>-	}</div><div class='add'>+    rv = _gf_string2ulonglong(str, &amp;l, 0);</div><div class='add'>+    if (rv != 0)</div><div class='add'>+        return rv;</div><div class='ctx'> </div><div class='del'>-	old_errno = errno;</div><div class='del'>-	errno = 0;</div><div class='del'>-	value = strtod (str, &amp;tail);</div><div class='add'>+    if (l &lt;= UINT64_MAX) {</div><div class='add'>+        *n = (uint64_t)l;</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    errno = ERANGE;</div><div class='add'>+    return -1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+gf_string2ulong_base10(const char *str, unsigned long *n)</div><div class='add'>+{</div><div class='add'>+    return _gf_string2ulong(str, n, 10);</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	if (errno == ERANGE || errno == EINVAL)	{</div><div class='del'>-		return -1;</div><div class='del'>-	}</div><div class='add'>+int</div><div class='add'>+gf_string2uint_base10(const char *str, unsigned int *n)</div><div class='add'>+{</div><div class='add'>+    return _gf_string2uint(str, n, 10);</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	if (errno == 0)	{</div><div class='del'>-		errno = old_errno;</div><div class='del'>-	}</div><div class='add'>+int</div><div class='add'>+gf_string2uint8_base10(const char *str, uint8_t *n)</div><div class='add'>+{</div><div class='add'>+    unsigned long l = 0L;</div><div class='add'>+    int rv = 0;</div><div class='ctx'> </div><div class='del'>-	if (tail[0] != '\0') {</div><div class='del'>-		return -1;</div><div class='del'>-	}</div><div class='add'>+    rv = _gf_string2ulong(str, &amp;l, 10);</div><div class='add'>+    if (rv != 0)</div><div class='add'>+        return rv;</div><div class='ctx'> </div><div class='del'>-	*n = value;</div><div class='add'>+    if (l &lt;= UINT8_MAX) {</div><div class='add'>+        *n = (uint8_t)l;</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	return 0;</div><div class='add'>+    errno = ERANGE;</div><div class='add'>+    return -1;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-static int</div><div class='del'>-_gf_string2longlong (const char *str, long long *n, int base)</div><div class='add'>+int</div><div class='add'>+gf_string2uint16_base10(const char *str, uint16_t *n)</div><div class='ctx'> {</div><div class='del'>-	long long value = 0;</div><div class='del'>-	char *tail = NULL;</div><div class='del'>-	int old_errno = 0;</div><div class='add'>+    unsigned long l = 0L;</div><div class='add'>+    int rv = 0;</div><div class='ctx'> </div><div class='del'>-	if (str == NULL || n == NULL)</div><div class='del'>-	{</div><div class='del'>-		errno = EINVAL;</div><div class='del'>-		return -1;</div><div class='del'>-	}</div><div class='add'>+    rv = _gf_string2ulong(str, &amp;l, 10);</div><div class='add'>+    if (rv != 0)</div><div class='add'>+        return rv;</div><div class='ctx'> </div><div class='del'>-	old_errno = errno;</div><div class='del'>-	errno = 0;</div><div class='del'>-	value = strtoll (str, &amp;tail, base);</div><div class='add'>+    if (l &lt;= UINT16_MAX) {</div><div class='add'>+        *n = (uint16_t)l;</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	if (errno == ERANGE || errno == EINVAL)</div><div class='del'>-	{</div><div class='del'>-		return -1;</div><div class='del'>-	}</div><div class='add'>+    errno = ERANGE;</div><div class='add'>+    return -1;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	if (errno == 0)</div><div class='del'>-	{</div><div class='del'>-		errno = old_errno;</div><div class='del'>-	}</div><div class='add'>+int</div><div class='add'>+gf_string2uint32_base10(const char *str, uint32_t *n)</div><div class='add'>+{</div><div class='add'>+    unsigned long l = 0L;</div><div class='add'>+    int rv = 0;</div><div class='ctx'> </div><div class='del'>-	if (tail[0] != '\0')</div><div class='del'>-	{</div><div class='del'>-		/* bala: invalid integer format */</div><div class='del'>-		return -1;</div><div class='del'>-	}</div><div class='add'>+    rv = _gf_string2ulong(str, &amp;l, 10);</div><div class='add'>+    if (rv != 0)</div><div class='add'>+        return rv;</div><div class='ctx'> </div><div class='del'>-	*n = value;</div><div class='add'>+    if (l &lt;= UINT32_MAX) {</div><div class='add'>+        *n = (uint32_t)l;</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	return 0;</div><div class='add'>+    errno = ERANGE;</div><div class='add'>+    return -1;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-static int</div><div class='del'>-_gf_string2ulonglong (const char *str, unsigned long long *n, int base)</div><div class='add'>+int</div><div class='add'>+gf_string2uint64_base10(const char *str, uint64_t *n)</div><div class='ctx'> {</div><div class='del'>-	unsigned long long value = 0;</div><div class='del'>-	char *tail = NULL;</div><div class='del'>-	int old_errno = 0;</div><div class='del'>-	const char *s = NULL;</div><div class='add'>+    unsigned long long l = 0ULL;</div><div class='add'>+    int rv = 0;</div><div class='ctx'> </div><div class='del'>-	if (str == NULL || n == NULL)</div><div class='del'>-	{</div><div class='del'>-		errno = EINVAL;</div><div class='del'>-		return -1;</div><div class='del'>-	}</div><div class='add'>+    rv = _gf_string2ulonglong(str, &amp;l, 10);</div><div class='add'>+    if (rv != 0)</div><div class='add'>+        return rv;</div><div class='ctx'> </div><div class='del'>-	for (s = str; *s != '\0'; s++)</div><div class='del'>-	{</div><div class='del'>-		if (isspace (*s))</div><div class='del'>-		{</div><div class='del'>-			continue;</div><div class='del'>-		}</div><div class='del'>-		if (*s == '-')</div><div class='del'>-		{</div><div class='del'>-			/* bala: we do not support suffixed (-) sign and</div><div class='del'>-			   invalid integer format */</div><div class='del'>-			return -1;</div><div class='del'>-		}</div><div class='del'>-		break;</div><div class='del'>-	}</div><div class='add'>+    if (l &lt;= UINT64_MAX) {</div><div class='add'>+        *n = (uint64_t)l;</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	old_errno = errno;</div><div class='del'>-	errno = 0;</div><div class='del'>-	value = strtoull (str, &amp;tail, base);</div><div class='add'>+    errno = ERANGE;</div><div class='add'>+    return -1;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	if (errno == ERANGE || errno == EINVAL)</div><div class='del'>-	{</div><div class='del'>-		return -1;</div><div class='del'>-	}</div><div class='add'>+char *</div><div class='add'>+gf_uint64_2human_readable(uint64_t n)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+    char *str = NULL;</div><div class='add'>+</div><div class='add'>+    if (n &gt;= GF_UNIT_PB) {</div><div class='add'>+        ret = gf_asprintf(&amp;str, "%.1lfPB", ((double)n) / GF_UNIT_PB);</div><div class='add'>+        if (ret &lt; 0)</div><div class='add'>+            goto err;</div><div class='add'>+    } else if (n &gt;= GF_UNIT_TB) {</div><div class='add'>+        ret = gf_asprintf(&amp;str, "%.1lfTB", ((double)n) / GF_UNIT_TB);</div><div class='add'>+        if (ret &lt; 0)</div><div class='add'>+            goto err;</div><div class='add'>+    } else if (n &gt;= GF_UNIT_GB) {</div><div class='add'>+        ret = gf_asprintf(&amp;str, "%.1lfGB", ((double)n) / GF_UNIT_GB);</div><div class='add'>+        if (ret &lt; 0)</div><div class='add'>+            goto err;</div><div class='add'>+    } else if (n &gt;= GF_UNIT_MB) {</div><div class='add'>+        ret = gf_asprintf(&amp;str, "%.1lfMB", ((double)n) / GF_UNIT_MB);</div><div class='add'>+        if (ret &lt; 0)</div><div class='add'>+            goto err;</div><div class='add'>+    } else if (n &gt;= GF_UNIT_KB) {</div><div class='add'>+        ret = gf_asprintf(&amp;str, "%.1lfKB", ((double)n) / GF_UNIT_KB);</div><div class='add'>+        if (ret &lt; 0)</div><div class='add'>+            goto err;</div><div class='add'>+    } else {</div><div class='add'>+        ret = gf_asprintf(&amp;str, "%" PRIu64 "Bytes", n);</div><div class='add'>+        if (ret &lt; 0)</div><div class='add'>+            goto err;</div><div class='add'>+    }</div><div class='add'>+    return str;</div><div class='add'>+err:</div><div class='add'>+    return NULL;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	if (errno == 0)</div><div class='del'>-	{</div><div class='del'>-		errno = old_errno;</div><div class='del'>-	}</div><div class='add'>+int</div><div class='add'>+gf_string2bytesize_range(const char *str, uint64_t *n, uint64_t umax)</div><div class='add'>+{</div><div class='add'>+    double value = 0.0;</div><div class='add'>+    int64_t int_value = 0;</div><div class='add'>+    uint64_t unit = 0;</div><div class='add'>+    int64_t max = 0;</div><div class='add'>+    char *tail = NULL;</div><div class='add'>+    int old_errno = 0;</div><div class='add'>+    const char *s = NULL;</div><div class='add'>+    gf_boolean_t fraction = _gf_false;</div><div class='add'>+</div><div class='add'>+    if (str == NULL || n == NULL) {</div><div class='add'>+        gf_msg_callingfn(THIS-&gt;name, GF_LOG_WARNING, EINVAL, LG_MSG_INVALID_ARG,</div><div class='add'>+                         "argument invalid");</div><div class='add'>+        errno = EINVAL;</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    max = umax &amp; 0x7fffffffffffffffLL;</div><div class='add'>+</div><div class='add'>+    for (s = str; *s != '\0'; s++) {</div><div class='add'>+        if (isspace(*s))</div><div class='add'>+            continue;</div><div class='add'>+        if (*s == '-')</div><div class='add'>+            return -1;</div><div class='add'>+        break;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (strrchr(str, '.'))</div><div class='add'>+        fraction = _gf_true;</div><div class='add'>+</div><div class='add'>+    old_errno = errno;</div><div class='add'>+    errno = 0;</div><div class='add'>+    if (fraction)</div><div class='add'>+        value = strtod(str, &amp;tail);</div><div class='add'>+    else</div><div class='add'>+        int_value = strtoll(str, &amp;tail, 10);</div><div class='add'>+</div><div class='add'>+    if (str == tail)</div><div class='add'>+        errno = EINVAL;</div><div class='add'>+</div><div class='add'>+    if (errno == ERANGE || errno == EINVAL)</div><div class='add'>+        return -1;</div><div class='add'>+</div><div class='add'>+    if (errno == 0)</div><div class='add'>+        errno = old_errno;</div><div class='add'>+</div><div class='add'>+    if (tail[0] != '\0') {</div><div class='add'>+        if (strcasecmp(tail, GF_UNIT_KB_STRING) == 0)</div><div class='add'>+            unit = GF_UNIT_KB;</div><div class='add'>+        else if (strcasecmp(tail, GF_UNIT_MB_STRING) == 0)</div><div class='add'>+            unit = GF_UNIT_MB;</div><div class='add'>+        else if (strcasecmp(tail, GF_UNIT_GB_STRING) == 0)</div><div class='add'>+            unit = GF_UNIT_GB;</div><div class='add'>+        else if (strcasecmp(tail, GF_UNIT_TB_STRING) == 0)</div><div class='add'>+            unit = GF_UNIT_TB;</div><div class='add'>+        else if (strcasecmp(tail, GF_UNIT_PB_STRING) == 0)</div><div class='add'>+            unit = GF_UNIT_PB;</div><div class='add'>+        else if (strcasecmp(tail, GF_UNIT_B_STRING) != 0)</div><div class='add'>+            return -1;</div><div class='add'>+</div><div class='add'>+        if (unit &gt; 0) {</div><div class='add'>+            if (fraction)</div><div class='add'>+                value *= unit;</div><div class='add'>+            else</div><div class='add'>+                int_value *= unit;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	if (tail[0] != '\0')</div><div class='del'>-	{</div><div class='del'>-		/* bala: invalid integer format */</div><div class='del'>-		return -1;</div><div class='del'>-	}</div><div class='add'>+    if (fraction) {</div><div class='add'>+        if ((max - value) &lt; 0) {</div><div class='add'>+            errno = ERANGE;</div><div class='add'>+            return -1;</div><div class='add'>+        }</div><div class='add'>+        *n = (uint64_t)value;</div><div class='add'>+    } else {</div><div class='add'>+        if ((max - int_value) &lt; 0) {</div><div class='add'>+            errno = ERANGE;</div><div class='add'>+            return -1;</div><div class='add'>+        }</div><div class='add'>+        *n = int_value;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	*n = value;</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	return 0;</div><div class='add'>+int</div><div class='add'>+gf_string2bytesize_uint64(const char *str, uint64_t *n)</div><div class='add'>+{</div><div class='add'>+    return gf_string2bytesize_range(str, n, UINT64_MAX);</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-gf_string2long (const char *str, long *n)</div><div class='add'>+gf_string2bytesize_int64(const char *str, int64_t *n)</div><div class='ctx'> {</div><div class='del'>-	return _gf_string2long (str, n, 0);</div><div class='add'>+    uint64_t u64 = 0;</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    ret = gf_string2bytesize_range(str, &amp;u64, INT64_MAX);</div><div class='add'>+    *n = (int64_t)u64;</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-gf_string2ulong (const char *str, unsigned long *n)</div><div class='add'>+gf_string2percent_or_bytesize(const char *str, double *n,</div><div class='add'>+                              gf_boolean_t *is_percent)</div><div class='ctx'> {</div><div class='del'>-	return _gf_string2ulong (str, n, 0);</div><div class='add'>+    double value = 0ULL;</div><div class='add'>+    char *tail = NULL;</div><div class='add'>+    int old_errno = 0;</div><div class='add'>+    const char *s = NULL;</div><div class='add'>+</div><div class='add'>+    if (str == NULL || n == NULL) {</div><div class='add'>+        gf_msg_callingfn(THIS-&gt;name, GF_LOG_WARNING, EINVAL, LG_MSG_INVALID_ARG,</div><div class='add'>+                         "argument invalid");</div><div class='add'>+        errno = EINVAL;</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    for (s = str; *s != '\0'; s++) {</div><div class='add'>+        if (isspace(*s))</div><div class='add'>+            continue;</div><div class='add'>+        if (*s == '-')</div><div class='add'>+            return -1;</div><div class='add'>+        break;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    old_errno = errno;</div><div class='add'>+    errno = 0;</div><div class='add'>+    value = strtod(str, &amp;tail);</div><div class='add'>+    if (str == tail)</div><div class='add'>+        errno = EINVAL;</div><div class='add'>+</div><div class='add'>+    if (errno == ERANGE || errno == EINVAL)</div><div class='add'>+        return -1;</div><div class='add'>+</div><div class='add'>+    if (errno == 0)</div><div class='add'>+        errno = old_errno;</div><div class='add'>+</div><div class='add'>+    /*Maximum accepted value for 64 bit OS will be (2^14 -1)PB*/</div><div class='add'>+    if (tail[0] != '\0') {</div><div class='add'>+        if (strcasecmp(tail, GF_UNIT_KB_STRING) == 0)</div><div class='add'>+            value *= GF_UNIT_KB;</div><div class='add'>+        else if (strcasecmp(tail, GF_UNIT_MB_STRING) == 0)</div><div class='add'>+            value *= GF_UNIT_MB;</div><div class='add'>+        else if (strcasecmp(tail, GF_UNIT_GB_STRING) == 0)</div><div class='add'>+            value *= GF_UNIT_GB;</div><div class='add'>+        else if (strcasecmp(tail, GF_UNIT_TB_STRING) == 0)</div><div class='add'>+            value *= GF_UNIT_TB;</div><div class='add'>+        else if (strcasecmp(tail, GF_UNIT_PB_STRING) == 0)</div><div class='add'>+            value *= GF_UNIT_PB;</div><div class='add'>+        else if (strcasecmp(tail, GF_UNIT_PERCENT_STRING) == 0)</div><div class='add'>+            *is_percent = _gf_true;</div><div class='add'>+        else</div><div class='add'>+            return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Error out if we cannot store the value in uint64 */</div><div class='add'>+    if ((UINT64_MAX - value) &lt; 0) {</div><div class='add'>+        errno = ERANGE;</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    *n = value;</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int64_t</div><div class='add'>+gf_str_to_long_long(const char *number)</div><div class='add'>+{</div><div class='add'>+    int64_t unit = 1;</div><div class='add'>+    int64_t ret = 0;</div><div class='add'>+    char *endptr = NULL;</div><div class='add'>+    if (!number)</div><div class='add'>+        return 0;</div><div class='add'>+</div><div class='add'>+    ret = strtoll(number, &amp;endptr, 0);</div><div class='add'>+</div><div class='add'>+    if (endptr) {</div><div class='add'>+        switch (*endptr) {</div><div class='add'>+            case 'G':</div><div class='add'>+            case 'g':</div><div class='add'>+                if ((*(endptr + 1) == 'B') || (*(endptr + 1) == 'b'))</div><div class='add'>+                    unit = 1024 * 1024 * 1024;</div><div class='add'>+                break;</div><div class='add'>+            case 'M':</div><div class='add'>+            case 'm':</div><div class='add'>+                if ((*(endptr + 1) == 'B') || (*(endptr + 1) == 'b'))</div><div class='add'>+                    unit = 1024 * 1024;</div><div class='add'>+                break;</div><div class='add'>+            case 'K':</div><div class='add'>+            case 'k':</div><div class='add'>+                if ((*(endptr + 1) == 'B') || (*(endptr + 1) == 'b'))</div><div class='add'>+                    unit = 1024;</div><div class='add'>+                break;</div><div class='add'>+            case '%':</div><div class='add'>+                unit = 1;</div><div class='add'>+                break;</div><div class='add'>+            default:</div><div class='add'>+                unit = 1;</div><div class='add'>+                break;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    return ret * unit;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-gf_string2int (const char *str, int *n)</div><div class='add'>+gf_string2boolean(const char *str, gf_boolean_t *b)</div><div class='ctx'> {</div><div class='del'>-	return _gf_string2long (str, (long *) n, 0);</div><div class='add'>+    if (str == NULL) {</div><div class='add'>+        gf_msg_callingfn(THIS-&gt;name, GF_LOG_WARNING, EINVAL, LG_MSG_INVALID_ARG,</div><div class='add'>+                         "argument invalid");</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if ((strcasecmp(str, "1") == 0) || (strcasecmp(str, "on") == 0) ||</div><div class='add'>+        (strcasecmp(str, "yes") == 0) || (strcasecmp(str, "true") == 0) ||</div><div class='add'>+        (strcasecmp(str, "enable") == 0)) {</div><div class='add'>+        *b = _gf_true;</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if ((strcasecmp(str, "0") == 0) || (strcasecmp(str, "off") == 0) ||</div><div class='add'>+        (strcasecmp(str, "no") == 0) || (strcasecmp(str, "false") == 0) ||</div><div class='add'>+        (strcasecmp(str, "disable") == 0)) {</div><div class='add'>+        *b = _gf_false;</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return -1;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-gf_string2uint (const char *str, unsigned int *n)</div><div class='add'>+gf_strn2boolean(const char *str, const int len, gf_boolean_t *b)</div><div class='ctx'> {</div><div class='del'>-	return _gf_string2uint (str, n, 0);</div><div class='add'>+    if (str == NULL) {</div><div class='add'>+        gf_msg_callingfn(THIS-&gt;name, GF_LOG_WARNING, EINVAL, LG_MSG_INVALID_ARG,</div><div class='add'>+                         "argument invalid");</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    switch (len) {</div><div class='add'>+        case 1:</div><div class='add'>+            if (strcasecmp(str, "1") == 0) {</div><div class='add'>+                *b = _gf_true;</div><div class='add'>+                return 0;</div><div class='add'>+            } else if (strcasecmp(str, "0") == 0) {</div><div class='add'>+                *b = _gf_false;</div><div class='add'>+                return 0;</div><div class='add'>+            }</div><div class='add'>+            break;</div><div class='add'>+        case 2:</div><div class='add'>+            if (strcasecmp(str, "on") == 0) {</div><div class='add'>+                *b = _gf_true;</div><div class='add'>+                return 0;</div><div class='add'>+            } else if (strcasecmp(str, "no") == 0) {</div><div class='add'>+                *b = _gf_false;</div><div class='add'>+                return 0;</div><div class='add'>+            }</div><div class='add'>+            break;</div><div class='add'>+        case 3:</div><div class='add'>+            if (strcasecmp(str, "yes") == 0) {</div><div class='add'>+                *b = _gf_true;</div><div class='add'>+                return 0;</div><div class='add'>+            } else if (strcasecmp(str, "off") == 0) {</div><div class='add'>+                *b = _gf_false;</div><div class='add'>+                return 0;</div><div class='add'>+            }</div><div class='add'>+            break;</div><div class='add'>+        case 4:</div><div class='add'>+            if (strcasecmp(str, "true") == 0) {</div><div class='add'>+                *b = _gf_true;</div><div class='add'>+                return 0;</div><div class='add'>+            }</div><div class='add'>+            break;</div><div class='add'>+        case 5:</div><div class='add'>+            if (strcasecmp(str, "false") == 0) {</div><div class='add'>+                *b = _gf_false;</div><div class='add'>+                return 0;</div><div class='add'>+            }</div><div class='add'>+            break;</div><div class='add'>+        case 6:</div><div class='add'>+            if (strcasecmp(str, "enable") == 0) {</div><div class='add'>+                *b = _gf_true;</div><div class='add'>+                return 0;</div><div class='add'>+            }</div><div class='add'>+            break;</div><div class='add'>+        case 7:</div><div class='add'>+            if (strcasecmp(str, "disable") == 0) {</div><div class='add'>+                *b = _gf_false;</div><div class='add'>+                return 0;</div><div class='add'>+            }</div><div class='add'>+            break;</div><div class='add'>+        default:</div><div class='add'>+            return -1;</div><div class='add'>+            break;</div><div class='add'>+    }</div><div class='add'>+    return -1;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-gf_string2double (const char *str, double *n)</div><div class='add'>+gf_lockfd(int fd)</div><div class='ctx'> {</div><div class='del'>-	return _gf_string2double (str, n);</div><div class='add'>+    struct gf_flock fl;</div><div class='add'>+</div><div class='add'>+    fl.l_type = F_WRLCK;</div><div class='add'>+    fl.l_whence = SEEK_SET;</div><div class='add'>+    fl.l_start = 0;</div><div class='add'>+    fl.l_len = 0;</div><div class='add'>+</div><div class='add'>+    return fcntl(fd, F_SETLK, &amp;fl);</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-gf_string2longlong (const char *str, long long *n)</div><div class='add'>+gf_unlockfd(int fd)</div><div class='ctx'> {</div><div class='del'>-	return _gf_string2longlong (str, n, 0);</div><div class='add'>+    struct gf_flock fl;</div><div class='add'>+</div><div class='add'>+    fl.l_type = F_UNLCK;</div><div class='add'>+    fl.l_whence = SEEK_SET;</div><div class='add'>+    fl.l_start = 0;</div><div class='add'>+    fl.l_len = 0;</div><div class='add'>+</div><div class='add'>+    return fcntl(fd, F_SETLK, &amp;fl);</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+static void</div><div class='add'>+compute_checksum(char *buf, const ssize_t size, uint32_t *checksum)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    char *checksum_buf = NULL;</div><div class='add'>+</div><div class='add'>+    checksum_buf = (char *)(checksum);</div><div class='add'>+</div><div class='add'>+    if (!(*checksum)) {</div><div class='add'>+        checksum_buf[0] = 0xba;</div><div class='add'>+        checksum_buf[1] = 0xbe;</div><div class='add'>+        checksum_buf[2] = 0xb0;</div><div class='add'>+        checksum_buf[3] = 0x0b;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    for (ret = 0; ret &lt; (size - 4); ret += 4) {</div><div class='add'>+        checksum_buf[0] ^= (buf[ret]);</div><div class='add'>+        checksum_buf[1] ^= (buf[ret + 1] &lt;&lt; 1);</div><div class='add'>+        checksum_buf[2] ^= (buf[ret + 2] &lt;&lt; 2);</div><div class='add'>+        checksum_buf[3] ^= (buf[ret + 3] &lt;&lt; 3);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    for (ret = 0; ret &lt;= (size % 4); ret++) {</div><div class='add'>+        checksum_buf[ret] ^= (buf[(size - 4) + ret] &lt;&lt; ret);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#define GF_CHECKSUM_BUF_SIZE 1024</div><div class='add'>+</div><div class='ctx'> int</div><div class='del'>-gf_string2ulonglong (const char *str, unsigned long long *n)</div><div class='add'>+get_checksum_for_file(int fd, uint32_t *checksum, int op_version)</div><div class='ctx'> {</div><div class='del'>-	return _gf_string2ulonglong (str, n, 0);</div><div class='add'>+    int ret = -1;</div><div class='add'>+    char buf[GF_CHECKSUM_BUF_SIZE] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    /* goto first place */</div><div class='add'>+    sys_lseek(fd, 0L, SEEK_SET);</div><div class='add'>+    do {</div><div class='add'>+        ret = sys_read(fd, &amp;buf, GF_CHECKSUM_BUF_SIZE);</div><div class='add'>+        if (ret &gt; 0) {</div><div class='add'>+            if (op_version &lt; GD_OP_VERSION_5_4)</div><div class='add'>+                compute_checksum(buf, GF_CHECKSUM_BUF_SIZE, checksum);</div><div class='add'>+            else</div><div class='add'>+                compute_checksum(buf, ret, checksum);</div><div class='add'>+        }</div><div class='add'>+    } while (ret &gt; 0);</div><div class='add'>+</div><div class='add'>+    /* set it back */</div><div class='add'>+    sys_lseek(fd, 0L, SEEK_SET);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-gf_string2int8 (const char *str, int8_t *n)</div><div class='add'>+get_checksum_for_path(char *path, uint32_t *checksum, int op_version)</div><div class='ctx'> {</div><div class='del'>-	long l = 0L;</div><div class='del'>-	int rv = 0;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int fd = -1;</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(path);</div><div class='add'>+    GF_ASSERT(checksum);</div><div class='add'>+</div><div class='add'>+    fd = open(path, O_RDWR);</div><div class='ctx'> </div><div class='del'>-	rv = _gf_string2long (str, &amp;l, 0);</div><div class='del'>-	if (rv != 0)</div><div class='del'>-		return rv;</div><div class='add'>+    if (fd == -1) {</div><div class='add'>+        gf_smsg(THIS-&gt;name, GF_LOG_ERROR, errno, LG_MSG_PATH_OPEN_FAILED,</div><div class='add'>+                "path=%s", path, NULL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	if (l &gt;= INT8_MIN &amp;&amp; l &lt;= INT8_MAX)</div><div class='del'>-	{</div><div class='del'>-		*n = (int8_t) l;</div><div class='del'>-		return 0;</div><div class='del'>-	}</div><div class='add'>+    ret = get_checksum_for_file(fd, checksum, op_version);</div><div class='ctx'> </div><div class='del'>-	errno = ERANGE;</div><div class='del'>-	return -1;</div><div class='add'>+out:</div><div class='add'>+    if (fd != -1)</div><div class='add'>+        sys_close(fd);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+/**</div><div class='add'>+ * get_file_mtime -- Given a path, get the mtime for the file</div><div class='add'>+ *</div><div class='add'>+ * @path: The filepath to check the mtime on</div><div class='add'>+ * @stamp: The parameter to set after we get the mtime</div><div class='add'>+ *</div><div class='add'>+ * @returns: success: 0</div><div class='add'>+ *           errors : Errors returned by the stat () call</div><div class='add'>+ */</div><div class='ctx'> int</div><div class='del'>-gf_string2int16 (const char *str, int16_t *n)</div><div class='add'>+get_file_mtime(const char *path, time_t *stamp)</div><div class='add'>+{</div><div class='add'>+    struct stat f_stat = {0};</div><div class='add'>+    int ret = -EINVAL;</div><div class='add'>+</div><div class='add'>+    GF_VALIDATE_OR_GOTO(THIS-&gt;name, path, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(THIS-&gt;name, stamp, out);</div><div class='add'>+</div><div class='add'>+    ret = sys_stat(path, &amp;f_stat);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        gf_smsg(THIS-&gt;name, GF_LOG_ERROR, errno, LG_MSG_FILE_STAT_FAILED,</div><div class='add'>+                "path=%s", path, NULL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Set the mtime */</div><div class='add'>+    *stamp = f_stat.st_mtime;</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/**</div><div class='add'>+ * gf_is_ip_in_net -- Checks if an IP Address is in a network.</div><div class='add'>+ *                    A network should be specified by something like</div><div class='add'>+ *                    '10.5.153.0/24' (in CIDR notation).</div><div class='add'>+ *</div><div class='add'>+ * @result : Sets to true if the IP is in the network</div><div class='add'>+ * @ip_str : The IP to check</div><div class='add'>+ * @network: The network to check the IP against.</div><div class='add'>+ *</div><div class='add'>+ * @return: success: _gf_true</div><div class='add'>+ *          failure: -EINVAL for bad args, retval of inet_pton otherwise</div><div class='add'>+ */</div><div class='add'>+gf_boolean_t</div><div class='add'>+gf_is_ip_in_net(const char *network, const char *ip_str)</div><div class='add'>+{</div><div class='add'>+    unsigned long ip_buf = 0;</div><div class='add'>+    unsigned long net_ip_buf = 0;</div><div class='add'>+    unsigned long subnet_mask = 0;</div><div class='add'>+    int ret = -EINVAL;</div><div class='add'>+    char *slash = NULL;</div><div class='add'>+    char *net_ip = NULL;</div><div class='add'>+    char *subnet = NULL;</div><div class='add'>+    char *net_str = NULL;</div><div class='add'>+    int family = AF_INET;</div><div class='add'>+    gf_boolean_t result = _gf_false;</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(network);</div><div class='add'>+    GF_ASSERT(ip_str);</div><div class='add'>+</div><div class='add'>+    if (strchr(network, ':'))</div><div class='add'>+        family = AF_INET6;</div><div class='add'>+    else if (strchr(network, '.'))</div><div class='add'>+        family = AF_INET;</div><div class='add'>+    else {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    net_str = strdupa(network);</div><div class='add'>+    slash = strchr(net_str, '/');</div><div class='add'>+    if (!slash)</div><div class='add'>+        goto out;</div><div class='add'>+    *slash = '\0';</div><div class='add'>+</div><div class='add'>+    subnet = slash + 1;</div><div class='add'>+    net_ip = net_str;</div><div class='add'>+</div><div class='add'>+    /* Convert IP address to a long */</div><div class='add'>+    ret = inet_pton(family, ip_str, &amp;ip_buf);</div><div class='add'>+    if (ret &lt; 0)</div><div class='add'>+        gf_smsg("common-utils", GF_LOG_ERROR, errno, LG_MSG_INET_PTON_FAILED,</div><div class='add'>+                NULL);</div><div class='add'>+</div><div class='add'>+    /* Convert network IP address to a long */</div><div class='add'>+    ret = inet_pton(family, net_ip, &amp;net_ip_buf);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        gf_smsg("common-utils", GF_LOG_ERROR, errno, LG_MSG_INET_PTON_FAILED,</div><div class='add'>+                NULL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Converts /x into a mask */</div><div class='add'>+    subnet_mask = (1 &lt;&lt; atoi(subnet)) - 1;</div><div class='add'>+</div><div class='add'>+    result = ((ip_buf &amp; subnet_mask) == (net_ip_buf &amp; subnet_mask));</div><div class='add'>+out:</div><div class='add'>+    return result;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+char *</div><div class='add'>+strtail(char *str, const char *pattern)</div><div class='ctx'> {</div><div class='del'>-	long l = 0L;</div><div class='del'>-	int rv = 0;</div><div class='add'>+    int i = 0;</div><div class='ctx'> </div><div class='del'>-	rv = _gf_string2long (str, &amp;l, 0);</div><div class='del'>-	if (rv != 0)</div><div class='del'>-		return rv;</div><div class='add'>+    for (i = 0; str[i] == pattern[i] &amp;&amp; str[i]; i++)</div><div class='add'>+        ;</div><div class='ctx'> </div><div class='del'>-	if (l &gt;= INT16_MIN &amp;&amp; l &lt;= INT16_MAX)</div><div class='del'>-	{</div><div class='del'>-		*n = (int16_t) l;</div><div class='del'>-		return 0;</div><div class='del'>-	}</div><div class='add'>+    if (pattern[i] == '\0')</div><div class='add'>+        return str + i;</div><div class='ctx'> </div><div class='del'>-	errno = ERANGE;</div><div class='del'>-	return -1;</div><div class='add'>+    return NULL;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+skipwhite(char **s)</div><div class='add'>+{</div><div class='add'>+    while (isspace(**s))</div><div class='add'>+        (*s)++;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+gf_strTrim(char **s)</div><div class='add'>+{</div><div class='add'>+    char *end = NULL;</div><div class='add'>+</div><div class='add'>+    end = *s + strlen(*s) - 1;</div><div class='add'>+    while (end &gt; *s &amp;&amp; isspace((unsigned char)*end))</div><div class='add'>+        end--;</div><div class='add'>+</div><div class='add'>+    *(end + 1) = '\0';</div><div class='add'>+</div><div class='add'>+    while (isspace(**s))</div><div class='add'>+        (*s)++;</div><div class='add'>+</div><div class='add'>+    return;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+char *</div><div class='add'>+nwstrtail(char *str, char *pattern)</div><div class='add'>+{</div><div class='add'>+    for (;;) {</div><div class='add'>+        skipwhite(&amp;str);</div><div class='add'>+        skipwhite(&amp;pattern);</div><div class='add'>+</div><div class='add'>+        if (*str != *pattern || !*str)</div><div class='add'>+            break;</div><div class='add'>+</div><div class='add'>+        str++;</div><div class='add'>+        pattern++;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return *pattern ? NULL : str;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/**</div><div class='add'>+ * token_iter_init -- initialize tokenization</div><div class='add'>+ *</div><div class='add'>+ * @str: string to be tokenized</div><div class='add'>+ * @sep: token separator character</div><div class='add'>+ * @tit: pointer to iteration state</div><div class='add'>+ *</div><div class='add'>+ * @return: token string</div><div class='add'>+ *</div><div class='add'>+ * The returned token string and tit are</div><div class='add'>+ * not to be used directly, but through</div><div class='add'>+ * next_token().</div><div class='add'>+ */</div><div class='add'>+char *</div><div class='add'>+token_iter_init(char *str, char sep, token_iter_t *tit)</div><div class='add'>+{</div><div class='add'>+    tit-&gt;end = str + strlen(str);</div><div class='add'>+    tit-&gt;sep = sep;</div><div class='add'>+</div><div class='add'>+    return str;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/**</div><div class='add'>+ * next_token -- fetch next token in tokenization</div><div class='add'>+ * inited by token_iter_init().</div><div class='add'>+ *</div><div class='add'>+ * @tokenp: pointer to token</div><div class='add'>+ * @tit:    pointer to iteration state</div><div class='add'>+ *</div><div class='add'>+ * @return: true if iteration ends, else false</div><div class='add'>+ *</div><div class='add'>+ * The token pointed by @tokenp can be used</div><div class='add'>+ * after a call to next_token(). When next_token()</div><div class='add'>+ * returns true the iteration is to be stopped</div><div class='add'>+ * and the string with which the tokenization</div><div class='add'>+ * was inited (see token_iter_init() is restored,</div><div class='add'>+ * apart from dropped tokens (see drop_token()).</div><div class='add'>+ */</div><div class='add'>+gf_boolean_t</div><div class='add'>+next_token(char **tokenp, token_iter_t *tit)</div><div class='add'>+{</div><div class='add'>+    char *cursor = NULL;</div><div class='add'>+    gf_boolean_t is_last = _gf_false;</div><div class='add'>+</div><div class='add'>+    for (cursor = *tokenp; *cursor; cursor++)</div><div class='add'>+        ;</div><div class='add'>+    if (cursor &lt; tit-&gt;end) {</div><div class='add'>+        /*</div><div class='add'>+         * We detect that in between current token and end a zero</div><div class='add'>+         * marker has already been inserted. This means that the</div><div class='add'>+         * token has already been returned. We restore the</div><div class='add'>+         * separator and move ahead.</div><div class='add'>+         */</div><div class='add'>+        *cursor = tit-&gt;sep;</div><div class='add'>+        *tokenp = cursor + 1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    for (cursor = *tokenp; *cursor &amp;&amp; *cursor != tit-&gt;sep; cursor++)</div><div class='add'>+        ;</div><div class='add'>+    /* If the cursor ended up on a zero byte, then it's the last token. */</div><div class='add'>+    is_last = !*cursor;</div><div class='add'>+    /* Zero-terminate the token. */</div><div class='add'>+    *cursor = 0;</div><div class='add'>+</div><div class='add'>+    return is_last;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+ * drop_token -- drop a token during iterated calls of next_token().</div><div class='add'>+ *</div><div class='add'>+ * Sample program that uses these functions to tokenize</div><div class='add'>+ * a comma-separated first argument while dropping the</div><div class='add'>+ * rest of the arguments if they occur as token:</div><div class='add'>+ *</div><div class='add'>+ * #include &lt;stdio.h&gt;</div><div class='add'>+ * #include &lt;stdlib.h&gt;</div><div class='add'>+ * #include &lt;string.h&gt;</div><div class='add'>+ * #include "glusterfs/common-utils.h"</div><div class='add'>+ *</div><div class='add'>+ * int</div><div class='add'>+ * main (int argc, char **argv)</div><div class='add'>+ * {</div><div class='add'>+ *         char *buf;</div><div class='add'>+ *         char *token;</div><div class='add'>+ *         token_iter_t tit;</div><div class='add'>+ *         int i;</div><div class='add'>+ *         gf_boolean_t iter_end;</div><div class='add'>+ *</div><div class='add'>+ *         if (argc &lt;= 1)</div><div class='add'>+ *                 abort();</div><div class='add'>+ *</div><div class='add'>+ *         buf = strdup (argv[1]);</div><div class='add'>+ *         if (!buf)</div><div class='add'>+ *                 abort();</div><div class='add'>+ *</div><div class='add'>+ *         for (token = token_iter_init (buf, ',', &amp;tit) ;;) {</div><div class='add'>+ *                 iter_end = next_token (&amp;token, &amp;tit);</div><div class='add'>+ *                 printf("found token: '%s'\n", token);</div><div class='add'>+ *                 for (i = 2; i &lt; argc; i++) {</div><div class='add'>+ *                         if (strcmp (argv[i], token) == 0) {</div><div class='add'>+ *                                 printf ("%s\n", "dropping token!");</div><div class='add'>+ *                                 drop_token (token, &amp;tit);</div><div class='add'>+ *                                 break;</div><div class='add'>+ *                          }</div><div class='add'>+ *                 }</div><div class='add'>+ *                 if (iter_end)</div><div class='add'>+ *                         break;</div><div class='add'>+ *         }</div><div class='add'>+ *</div><div class='add'>+ *         printf ("finally: '%s'\n", buf);</div><div class='add'>+ *</div><div class='add'>+ *         return 0;</div><div class='add'>+ * }</div><div class='add'>+ */</div><div class='add'>+void</div><div class='add'>+drop_token(char *token, token_iter_t *tit)</div><div class='add'>+{</div><div class='add'>+    char *cursor = NULL;</div><div class='add'>+</div><div class='add'>+    for (cursor = token; *cursor; cursor++)</div><div class='add'>+        ;</div><div class='add'>+    if (cursor &lt; tit-&gt;end) {</div><div class='add'>+        /*</div><div class='add'>+         * We detect a zero inserted by next_token().</div><div class='add'>+         * Step the cursor and copy what comes after</div><div class='add'>+         * to token.</div><div class='add'>+         */</div><div class='add'>+        for (cursor++; cursor &lt; tit-&gt;end; *token++ = *cursor++)</div><div class='add'>+            ;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /*</div><div class='add'>+     * Zero out the remainder of the buffer.</div><div class='add'>+     * It would be enough to insert just a single zero,</div><div class='add'>+     * but we continue 'till the end to have cleaner</div><div class='add'>+     * memory content.</div><div class='add'>+     */</div><div class='add'>+    for (cursor = token; cursor &lt; tit-&gt;end; *cursor++ = 0)</div><div class='add'>+        ;</div><div class='add'>+</div><div class='add'>+    /* Adjust the end to point to the new terminating zero. */</div><div class='add'>+    tit-&gt;end = token;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* Syntax formed according to RFC 1912 (RFC 1123 &amp; 952 are more restrictive)  *</div><div class='add'>+   &lt;hname&gt; ::= &lt;gen-name&gt;*["."&lt;gen-name&gt;]                                     *</div><div class='add'>+   &lt;gen-name&gt; ::= &lt;let-or-digit&gt; &lt;[*[&lt;let-or-digit-or-hyphen&gt;]&lt;let-or-digit&gt;] */</div><div class='add'>+char</div><div class='add'>+valid_host_name(char *address, int length)</div><div class='add'>+{</div><div class='add'>+    int i = 0;</div><div class='add'>+    int str_len = 0;</div><div class='add'>+    char ret = 1;</div><div class='add'>+    char *dup_addr = NULL;</div><div class='add'>+    char *temp_str = NULL;</div><div class='add'>+    char *save_ptr = NULL;</div><div class='add'>+</div><div class='add'>+    if ((length &gt; _POSIX_HOST_NAME_MAX) || (length &lt; 1)) {</div><div class='add'>+        ret = 0;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    dup_addr = gf_strdup(address);</div><div class='add'>+    if (!dup_addr) {</div><div class='add'>+        ret = 0;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (!isalnum(dup_addr[length - 1]) &amp;&amp; (dup_addr[length - 1] != '*')) {</div><div class='add'>+        ret = 0;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Check for consecutive dots, which is invalid in a hostname and is</div><div class='add'>+     * ignored by strtok()</div><div class='add'>+     */</div><div class='add'>+    if (strstr(dup_addr, "..")) {</div><div class='add'>+        ret = 0;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* gen-name */</div><div class='add'>+    temp_str = strtok_r(dup_addr, ".", &amp;save_ptr);</div><div class='add'>+    do {</div><div class='add'>+        str_len = strlen(temp_str);</div><div class='add'>+</div><div class='add'>+        if (!isalnum(temp_str[0]) || !isalnum(temp_str[str_len - 1])) {</div><div class='add'>+            ret = 0;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+        for (i = 1; i &lt; str_len; i++) {</div><div class='add'>+            if (!isalnum(temp_str[i]) &amp;&amp; (temp_str[i] != '-')) {</div><div class='add'>+                ret = 0;</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+    } while ((temp_str = strtok_r(NULL, ".", &amp;save_ptr)));</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    GF_FREE(dup_addr);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*  Matches all ipv4 address, if wildcard_acc is true  '*' wildcard pattern for*</div><div class='add'>+  subnets is considered as valid strings as well */</div><div class='add'>+char</div><div class='add'>+valid_ipv4_address(char *address, int length, gf_boolean_t wildcard_acc)</div><div class='add'>+{</div><div class='add'>+    int octets = 0;</div><div class='add'>+    int value = 0;</div><div class='add'>+    char *tmp = NULL, *ptr = NULL, *prev = NULL, *endptr = NULL;</div><div class='add'>+    char ret = 1;</div><div class='add'>+    int is_wildcard = 0;</div><div class='add'>+</div><div class='add'>+    tmp = gf_strdup(address);</div><div class='add'>+</div><div class='add'>+    /*</div><div class='add'>+     * To prevent cases where last character is '.' and which have</div><div class='add'>+     * consecutive dots like ".." as strtok ignore consecutive</div><div class='add'>+     * delimiters.</div><div class='add'>+     */</div><div class='add'>+    if (length &lt;= 0 || (strstr(address, "..")) ||</div><div class='add'>+        (!isdigit(tmp[length - 1]) &amp;&amp; (tmp[length - 1] != '*'))) {</div><div class='add'>+        ret = 0;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    prev = strtok_r(tmp, ".", &amp;ptr);</div><div class='add'>+</div><div class='add'>+    while (prev != NULL) {</div><div class='add'>+        octets++;</div><div class='add'>+        if (wildcard_acc &amp;&amp; !strcmp(prev, "*")) {</div><div class='add'>+            is_wildcard = 1;</div><div class='add'>+        } else {</div><div class='add'>+            value = strtol(prev, &amp;endptr, 10);</div><div class='add'>+            if ((value &gt; 255) || (value &lt; 0) ||</div><div class='add'>+                (endptr != NULL &amp;&amp; *endptr != '\0')) {</div><div class='add'>+                ret = 0;</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+        prev = strtok_r(NULL, ".", &amp;ptr);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if ((octets &gt; 4) || (octets &lt; 4 &amp;&amp; !is_wildcard)) {</div><div class='add'>+        ret = 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    GF_FREE(tmp);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+char</div><div class='add'>+valid_cidr_address(char *cidr_address, gf_boolean_t wildcard_acc)</div><div class='add'>+{</div><div class='add'>+    unsigned int net_mask = 0, len = 0;</div><div class='add'>+    char *temp = NULL, *cidr_str = NULL, ret = 1;</div><div class='add'>+</div><div class='add'>+    cidr_str = strdupa(cidr_address);</div><div class='add'>+    temp = strstr(cidr_str, "/");</div><div class='add'>+    if (temp == NULL)</div><div class='add'>+        return 0; /* Since Invalid cidr ip address we return 0 */</div><div class='add'>+</div><div class='add'>+    *temp = '\0';</div><div class='add'>+    temp++;</div><div class='add'>+    net_mask = (unsigned int)atoi(temp);</div><div class='add'>+</div><div class='add'>+    if (net_mask &gt; 32 || net_mask &lt; 1)</div><div class='add'>+        return 0; /* Since Invalid cidr ip address we return 0*/</div><div class='add'>+</div><div class='add'>+    len = strlen(cidr_str);</div><div class='add'>+</div><div class='add'>+    ret = valid_ipv4_address(cidr_str, len, wildcard_acc);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/**</div><div class='add'>+ * valid_ipv4_subnetwork() takes the pattern and checks if it contains</div><div class='add'>+ * a valid ipv4 subnetwork pattern i.e. xx.xx.xx.xx/n. IPv4 address</div><div class='add'>+ * part (xx.xx.xx.xx) and mask bits length part (n). The mask bits length</div><div class='add'>+ * must be in 0-32 range (ipv4 addr is 32 bit). The pattern must be</div><div class='add'>+ * in this format.</div><div class='add'>+ *</div><div class='add'>+ * Returns _gf_true if both IP addr and mask bits len are valid</div><div class='add'>+ *         _gf_false otherwise.</div><div class='add'>+ */</div><div class='add'>+gf_boolean_t</div><div class='add'>+valid_ipv4_subnetwork(const char *address)</div><div class='add'>+{</div><div class='add'>+    char *slash = NULL;</div><div class='add'>+    char *paddr = NULL;</div><div class='add'>+    char *endptr = NULL;</div><div class='add'>+    long prefixlen = -1;</div><div class='add'>+    gf_boolean_t retv = _gf_true;</div><div class='add'>+</div><div class='add'>+    if (address == NULL) {</div><div class='add'>+        gf_msg_callingfn(THIS-&gt;name, GF_LOG_WARNING, EINVAL, LG_MSG_INVALID_ARG,</div><div class='add'>+                         "argument invalid");</div><div class='add'>+        return _gf_false;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    paddr = gf_strdup(address);</div><div class='add'>+    if (paddr == NULL) /* ENOMEM */</div><div class='add'>+        return _gf_false;</div><div class='add'>+</div><div class='add'>+    /*</div><div class='add'>+     * INVALID: If '/' is not present OR</div><div class='add'>+     *          Nothing specified after '/'</div><div class='add'>+     */</div><div class='add'>+    slash = strchr(paddr, '/');</div><div class='add'>+    if ((slash == NULL) || (slash[1] == '\0')) {</div><div class='add'>+        gf_msg_callingfn(THIS-&gt;name, GF_LOG_WARNING, 0,</div><div class='add'>+                         LG_MSG_INVALID_IPV4_FORMAT,</div><div class='add'>+                         "Invalid IPv4 "</div><div class='add'>+                         "subnetwork format");</div><div class='add'>+        retv = _gf_false;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    *slash = '\0';</div><div class='add'>+    retv = valid_ipv4_address(paddr, strlen(paddr), _gf_false);</div><div class='add'>+    if (retv == _gf_false) {</div><div class='add'>+        gf_msg_callingfn(THIS-&gt;name, GF_LOG_WARNING, 0,</div><div class='add'>+                         LG_MSG_INVALID_IPV4_FORMAT,</div><div class='add'>+                         "Invalid IPv4 subnetwork address");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    /*</div><div class='add'>+     * Reset errno before checking it</div><div class='add'>+     */</div><div class='add'>+    errno = 0;</div><div class='add'>+    prefixlen = strtol(slash + 1, &amp;endptr, 10);</div><div class='add'>+    if ((errno != 0) || (*endptr != '\0') || (prefixlen &lt; 0) ||</div><div class='add'>+        (prefixlen &gt; IPv4_ADDR_SIZE)) {</div><div class='add'>+        gf_msg_callingfn(THIS-&gt;name, GF_LOG_WARNING, 0,</div><div class='add'>+                         LG_MSG_INVALID_IPV4_FORMAT,</div><div class='add'>+                         "Invalid IPv4 subnetwork mask");</div><div class='add'>+        retv = _gf_false;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    retv = _gf_true;</div><div class='add'>+out:</div><div class='add'>+    GF_FREE(paddr);</div><div class='add'>+    return retv;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+char</div><div class='add'>+valid_ipv6_address(char *address, int length, gf_boolean_t wildcard_acc)</div><div class='add'>+{</div><div class='add'>+    int hex_numbers = 0;</div><div class='add'>+    int value = 0;</div><div class='add'>+    int i = 0;</div><div class='add'>+    char *tmp = NULL, *ptr = NULL, *prev = NULL, *endptr = NULL;</div><div class='add'>+    char ret = 1;</div><div class='add'>+    int is_wildcard = 0;</div><div class='add'>+    int is_compressed = 0;</div><div class='add'>+</div><div class='add'>+    tmp = gf_strdup(address);</div><div class='add'>+</div><div class='add'>+    /* Check for '%' for link local addresses */</div><div class='add'>+    endptr = strchr(tmp, '%');</div><div class='add'>+    if (endptr) {</div><div class='add'>+        *endptr = '\0';</div><div class='add'>+        length = strlen(tmp);</div><div class='add'>+        endptr = NULL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Check for compressed form */</div><div class='add'>+    if (length &lt;= 0 || tmp[length - 1] == ':') {</div><div class='add'>+        ret = 0;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    for (i = 0; i &lt; (length - 1); i++) {</div><div class='add'>+        if (tmp[i] == ':' &amp;&amp; tmp[i + 1] == ':') {</div><div class='add'>+            if (is_compressed == 0)</div><div class='add'>+                is_compressed = 1;</div><div class='add'>+            else {</div><div class='add'>+                ret = 0;</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    prev = strtok_r(tmp, ":", &amp;ptr);</div><div class='add'>+</div><div class='add'>+    while (prev != NULL) {</div><div class='add'>+        hex_numbers++;</div><div class='add'>+        if (wildcard_acc &amp;&amp; !strcmp(prev, "*")) {</div><div class='add'>+            is_wildcard = 1;</div><div class='add'>+        } else {</div><div class='add'>+            value = strtol(prev, &amp;endptr, 16);</div><div class='add'>+            if ((value &gt; 0xffff) || (value &lt; 0) ||</div><div class='add'>+                (endptr != NULL &amp;&amp; *endptr != '\0')) {</div><div class='add'>+                ret = 0;</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+        prev = strtok_r(NULL, ":", &amp;ptr);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if ((hex_numbers &gt; 8) ||</div><div class='add'>+        (hex_numbers &lt; 8 &amp;&amp; !is_wildcard &amp;&amp; !is_compressed)) {</div><div class='add'>+        ret = 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    GF_FREE(tmp);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+char</div><div class='add'>+valid_internet_address(char *address, gf_boolean_t wildcard_acc,</div><div class='add'>+                       gf_boolean_t cidr)</div><div class='add'>+{</div><div class='add'>+    char ret = 0;</div><div class='add'>+    int length = 0;</div><div class='add'>+</div><div class='add'>+    if (address == NULL) {</div><div class='add'>+        gf_msg_callingfn(THIS-&gt;name, GF_LOG_WARNING, EINVAL, LG_MSG_INVALID_ARG,</div><div class='add'>+                         "argument invalid");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    length = strlen(address);</div><div class='add'>+    if (length == 0)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    if (cidr &amp;&amp; valid_cidr_address(address, wildcard_acc)) {</div><div class='add'>+        ret = 1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (valid_ipv4_address(address, length, wildcard_acc) ||</div><div class='add'>+        valid_ipv6_address(address, length, wildcard_acc) ||</div><div class='add'>+        valid_host_name(address, length))</div><div class='add'>+        ret = 1;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/**</div><div class='add'>+ * valid_mount_auth_address - Validate the rpc-auth.addr.allow/reject pattern</div><div class='add'>+ *</div><div class='add'>+ * @param address - Pattern to be validated</div><div class='add'>+ *</div><div class='add'>+ * @return _gf_true if "address" is "*" (anonymous) 'OR'</div><div class='add'>+ *                  if "address" is valid FQDN or valid IPv4/6 address 'OR'</div><div class='add'>+ *                  if "address" contains wildcard chars e.g. "'*' or '?' or</div><div class='add'>+ * '['" if "address" is valid ipv4 subnet pattern (xx.xx.xx.xx/n) _gf_false</div><div class='add'>+ * otherwise</div><div class='add'>+ *</div><div class='add'>+ *</div><div class='add'>+ * NB: If the user/admin set for wildcard pattern, then it does not have</div><div class='add'>+ *     to be validated. Make it similar to the way exportfs (kNFS) works.</div><div class='add'>+ */</div><div class='add'>+gf_boolean_t</div><div class='add'>+valid_mount_auth_address(char *address)</div><div class='add'>+{</div><div class='add'>+    int length = 0;</div><div class='add'>+    char *cp = NULL;</div><div class='add'>+</div><div class='add'>+    /* 1. Check for "NULL and empty string */</div><div class='add'>+    if ((address == NULL) || (address[0] == '\0')) {</div><div class='add'>+        gf_msg_callingfn(THIS-&gt;name, GF_LOG_WARNING, EINVAL, LG_MSG_INVALID_ARG,</div><div class='add'>+                         "argument invalid");</div><div class='add'>+        return _gf_false;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* 2. Check for Anonymous */</div><div class='add'>+    if (strcmp(address, "*") == 0)</div><div class='add'>+        return _gf_true;</div><div class='add'>+</div><div class='add'>+    for (cp = address; *cp; cp++) {</div><div class='add'>+        /* 3. Check for wildcard pattern */</div><div class='add'>+        if (*cp == '*' || *cp == '?' || *cp == '[') {</div><div class='add'>+            return _gf_true;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        /*</div><div class='add'>+         * 4. check for IPv4 subnetwork i.e. xx.xx.xx.xx/n</div><div class='add'>+         * TODO: check for IPv6 subnetwork</div><div class='add'>+         * NB: Wildcard must not be mixed with subnetwork.</div><div class='add'>+         */</div><div class='add'>+        if (*cp == '/') {</div><div class='add'>+            return valid_ipv4_subnetwork(address);</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* 5. Check for v4/v6 IP addr and FQDN/hostname */</div><div class='add'>+    length = strlen(address);</div><div class='add'>+    if ((valid_ipv4_address(address, length, _gf_false)) ||</div><div class='add'>+        (valid_ipv6_address(address, length, _gf_false)) ||</div><div class='add'>+        (valid_host_name(address, length))) {</div><div class='add'>+        return _gf_true;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return _gf_false;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/**</div><div class='add'>+ * gf_sock_union_equal_addr - check if two given gf_sock_unions have same addr</div><div class='add'>+ *</div><div class='add'>+ * @param a - first sock union</div><div class='add'>+ * @param b - second sock union</div><div class='add'>+ * @return _gf_true if a and b have same ipv{4,6} addr, _gf_false otherwise</div><div class='add'>+ */</div><div class='add'>+gf_boolean_t</div><div class='add'>+gf_sock_union_equal_addr(union gf_sock_union *a, union gf_sock_union *b)</div><div class='add'>+{</div><div class='add'>+    if (!a || !b) {</div><div class='add'>+        gf_smsg("common-utils", GF_LOG_ERROR, 0, LG_MSG_INVALID_ENTRY,</div><div class='add'>+                "gf_sock_union_equal_addr", NULL);</div><div class='add'>+        return _gf_false;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (a-&gt;storage.ss_family != b-&gt;storage.ss_family)</div><div class='add'>+        return _gf_false;</div><div class='add'>+</div><div class='add'>+    switch (a-&gt;storage.ss_family) {</div><div class='add'>+        case AF_INET:</div><div class='add'>+            if (a-&gt;sin.sin_addr.s_addr == b-&gt;sin.sin_addr.s_addr)</div><div class='add'>+                return _gf_true;</div><div class='add'>+            else</div><div class='add'>+                return _gf_false;</div><div class='add'>+</div><div class='add'>+        case AF_INET6:</div><div class='add'>+            if (memcmp((void *)(&amp;a-&gt;sin6.sin6_addr),</div><div class='add'>+                       (void *)(&amp;b-&gt;sin6.sin6_addr), sizeof(a-&gt;sin6.sin6_addr)))</div><div class='add'>+                return _gf_false;</div><div class='add'>+            else</div><div class='add'>+                return _gf_true;</div><div class='add'>+</div><div class='add'>+        default:</div><div class='add'>+            gf_msg_debug("common-utils", 0,</div><div class='add'>+                         "Unsupported/invalid address "</div><div class='add'>+                         "family");</div><div class='add'>+            break;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return _gf_false;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+ * Check if both have same network address.</div><div class='add'>+ * Extract the network address from the sockaddr(s) addr by applying the</div><div class='add'>+ * network mask. If they match, return boolean _gf_true, _gf_false otherwise.</div><div class='add'>+ *</div><div class='add'>+ * (x == y) &lt;=&gt; (x ^ y == 0)</div><div class='add'>+ * (x &amp; y) ^ (x &amp; z) &lt;=&gt; x &amp; (y ^ z)</div><div class='add'>+ *</div><div class='add'>+ * ((ip1 &amp; mask) == (ip2 &amp; mask)) &lt;=&gt; ((mask &amp; (ip1 ^ ip2)) == 0)</div><div class='add'>+ */</div><div class='add'>+gf_boolean_t</div><div class='add'>+mask_match(const uint32_t a, const uint32_t b, const uint32_t m)</div><div class='add'>+{</div><div class='add'>+    return (((a ^ b) &amp; m) == 0);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*Thread safe conversion function*/</div><div class='add'>+char *</div><div class='add'>+uuid_utoa(uuid_t uuid)</div><div class='add'>+{</div><div class='add'>+    char *uuid_buffer = glusterfs_uuid_buf_get();</div><div class='add'>+    gf_uuid_unparse(uuid, uuid_buffer);</div><div class='add'>+    return uuid_buffer;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*Re-entrant conversion function*/</div><div class='add'>+char *</div><div class='add'>+uuid_utoa_r(uuid_t uuid, char *dst)</div><div class='add'>+{</div><div class='add'>+    if (!dst)</div><div class='add'>+        return NULL;</div><div class='add'>+    gf_uuid_unparse(uuid, dst);</div><div class='add'>+    return dst;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*Thread safe conversion function*/</div><div class='add'>+char *</div><div class='add'>+lkowner_utoa(gf_lkowner_t *lkowner)</div><div class='add'>+{</div><div class='add'>+    char *lkowner_buffer = glusterfs_lkowner_buf_get();</div><div class='add'>+    lkowner_unparse(lkowner, lkowner_buffer, GF_LKOWNER_BUF_SIZE);</div><div class='add'>+    return lkowner_buffer;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*Re-entrant conversion function*/</div><div class='add'>+char *</div><div class='add'>+lkowner_utoa_r(gf_lkowner_t *lkowner, char *dst, int len)</div><div class='add'>+{</div><div class='add'>+    if (!dst)</div><div class='add'>+        return NULL;</div><div class='add'>+    lkowner_unparse(lkowner, dst, len);</div><div class='add'>+    return dst;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+gf_boolean_t</div><div class='add'>+is_valid_lease_id(const char *lease_id)</div><div class='add'>+{</div><div class='add'>+    int i = 0;</div><div class='add'>+    gf_boolean_t valid = _gf_false;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; LEASE_ID_SIZE; i++) {</div><div class='add'>+        if (lease_id[i] != 0) {</div><div class='add'>+            valid = _gf_true;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+out:</div><div class='add'>+    return valid;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* Lease_id can be a either in printable or non printable binary</div><div class='add'>+ * format. This function can be used to print any lease_id.</div><div class='add'>+ *</div><div class='add'>+ * This function returns a pointer to a buf, containing the ascii</div><div class='add'>+ * representation of the value in lease_id, in the following format:</div><div class='add'>+ * 4hexnum-4hexnum-4hexnum-4hexnum-4hexnum-4hexnum-4hexnum-4hexnum</div><div class='add'>+ *</div><div class='add'>+ * Eg: If lease_id = "lid1-clnt1" the printable string would be:</div><div class='add'>+ * 6c69-6431-2d63-6c6e-7431-0000-0000-0000</div><div class='add'>+ *</div><div class='add'>+ * Note: The pointer returned should not be stored for further use, as any</div><div class='add'>+ * subsequent call to this function will override the same buffer.</div><div class='add'>+ */</div><div class='add'>+char *</div><div class='add'>+leaseid_utoa(const char *lease_id)</div><div class='add'>+{</div><div class='add'>+    char *buf = NULL;</div><div class='add'>+    int i = 0;</div><div class='add'>+    int j = 0;</div><div class='add'>+</div><div class='add'>+    buf = glusterfs_leaseid_buf_get();</div><div class='add'>+    if (!buf)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; LEASE_ID_SIZE; i++) {</div><div class='add'>+        if (i &amp;&amp; !(i % 2)) {</div><div class='add'>+            buf[j] = '-';</div><div class='add'>+            j++;</div><div class='add'>+        }</div><div class='add'>+        sprintf(&amp;buf[j], "%02hhx", lease_id[i]);</div><div class='add'>+        j += 2;</div><div class='add'>+        if (j == GF_LEASE_ID_BUF_SIZE)</div><div class='add'>+            break;</div><div class='add'>+    }</div><div class='add'>+    buf[GF_LEASE_ID_BUF_SIZE - 1] = '\0';</div><div class='add'>+out:</div><div class='add'>+    return buf;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+char *</div><div class='add'>+gf_leaseid_get()</div><div class='add'>+{</div><div class='add'>+    return glusterfs_leaseid_buf_get();</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+char *</div><div class='add'>+gf_existing_leaseid()</div><div class='add'>+{</div><div class='add'>+    return glusterfs_leaseid_exist();</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void *</div><div class='add'>+gf_array_elem(void *a, int index, size_t elem_size)</div><div class='add'>+{</div><div class='add'>+    uint8_t *ptr = a;</div><div class='add'>+    return (void *)(ptr + index * elem_size);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+gf_elem_swap(void *x, void *y, size_t l)</div><div class='add'>+{</div><div class='add'>+    uint8_t *a = x, *b = y, c;</div><div class='add'>+    while (l--) {</div><div class='add'>+        c = *a;</div><div class='add'>+        *a++ = *b;</div><div class='add'>+        *b++ = c;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+gf_array_insertionsort(void *A, int l, int r, size_t elem_size, gf_cmp cmp)</div><div class='add'>+{</div><div class='add'>+    int i = l;</div><div class='add'>+    int N = r + 1;</div><div class='add'>+    void *Temp = NULL;</div><div class='add'>+    int j = 0;</div><div class='add'>+</div><div class='add'>+    for (i = l; i &lt; N; i++) {</div><div class='add'>+        Temp = gf_array_elem(A, i, elem_size);</div><div class='add'>+        j = i - 1;</div><div class='add'>+        while (j &gt;= 0 &amp;&amp; (cmp(Temp, gf_array_elem(A, j, elem_size)) &lt; 0)) {</div><div class='add'>+            gf_elem_swap(Temp, gf_array_elem(A, j, elem_size), elem_size);</div><div class='add'>+            Temp = gf_array_elem(A, j, elem_size);</div><div class='add'>+            j = j - 1;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-gf_string2int32 (const char *str, int32_t *n)</div><div class='add'>+gf_is_str_int(const char *value)</div><div class='ctx'> {</div><div class='del'>-	long l = 0L;</div><div class='del'>-	int rv = 0;</div><div class='add'>+    int flag = 0;</div><div class='add'>+    char *str = NULL;</div><div class='add'>+    char *fptr = NULL;</div><div class='add'>+</div><div class='add'>+    GF_VALIDATE_OR_GOTO(THIS-&gt;name, value, out);</div><div class='ctx'> </div><div class='del'>-	rv = _gf_string2long (str, &amp;l, 0);</div><div class='del'>-	if (rv != 0)</div><div class='del'>-		return rv;</div><div class='add'>+    str = gf_strdup(value);</div><div class='add'>+    if (!str)</div><div class='add'>+        goto out;</div><div class='ctx'> </div><div class='del'>-	if (l &gt;= INT32_MIN &amp;&amp; l &lt;= INT32_MAX)</div><div class='del'>-	{</div><div class='del'>-		*n = (int32_t) l;</div><div class='del'>-		return 0;</div><div class='del'>-	}</div><div class='add'>+    fptr = str;</div><div class='add'>+</div><div class='add'>+    while (*str) {</div><div class='add'>+        if (!isdigit(*str)) {</div><div class='add'>+            flag = 1;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+        str++;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	errno = ERANGE;</div><div class='del'>-	return -1;</div><div class='add'>+out:</div><div class='add'>+    GF_FREE(fptr);</div><div class='add'>+</div><div class='add'>+    return flag;</div><div class='add'>+}</div><div class='add'>+/*</div><div class='add'>+ * rounds up nr to power of two. If nr is already a power of two, just returns</div><div class='add'>+ * nr</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+gf_roundup_power_of_two(int32_t nr)</div><div class='add'>+{</div><div class='add'>+    int32_t result = 1;</div><div class='add'>+</div><div class='add'>+    if (nr &lt; 0) {</div><div class='add'>+        gf_smsg("common-utils", GF_LOG_WARNING, 0, LG_MSG_NEGATIVE_NUM_PASSED,</div><div class='add'>+                NULL);</div><div class='add'>+        result = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    while (result &lt; nr)</div><div class='add'>+        result *= 2;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return result;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+ * rounds up nr to next power of two. If nr is already a power of two, next</div><div class='add'>+ * power of two is returned.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+gf_roundup_next_power_of_two(int32_t nr)</div><div class='add'>+{</div><div class='add'>+    int32_t result = 1;</div><div class='add'>+</div><div class='add'>+    if (nr &lt; 0) {</div><div class='add'>+        gf_smsg("common-utils", GF_LOG_WARNING, 0, LG_MSG_NEGATIVE_NUM_PASSED,</div><div class='add'>+                NULL);</div><div class='add'>+        result = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    while (result &lt;= nr)</div><div class='add'>+        result *= 2;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return result;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-gf_string2int64 (const char *str, int64_t *n)</div><div class='add'>+validate_brick_name(char *brick)</div><div class='ctx'> {</div><div class='del'>-	long long l = 0LL;</div><div class='del'>-	int rv = 0;</div><div class='add'>+    char *delimiter = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    delimiter = strrchr(brick, ':');</div><div class='add'>+    if (!delimiter || delimiter == brick || *(delimiter + 1) != '/')</div><div class='add'>+        ret = -1;</div><div class='ctx'> </div><div class='del'>-	rv = _gf_string2longlong (str, &amp;l, 0);</div><div class='del'>-	if (rv != 0)</div><div class='del'>-		return rv;</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	if (l &gt;= INT64_MIN &amp;&amp; l &lt;= INT64_MAX)</div><div class='del'>-	{</div><div class='del'>-		*n = (int64_t) l;</div><div class='del'>-		return 0;</div><div class='del'>-	}</div><div class='add'>+char *</div><div class='add'>+get_host_name(char *word, char **host)</div><div class='add'>+{</div><div class='add'>+    char *delimiter = NULL;</div><div class='add'>+    delimiter = strrchr(word, ':');</div><div class='add'>+    if (delimiter)</div><div class='add'>+        *delimiter = '\0';</div><div class='add'>+    else</div><div class='add'>+        return NULL;</div><div class='add'>+    *host = word;</div><div class='add'>+    return *host;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	errno = ERANGE;</div><div class='del'>-	return -1;</div><div class='add'>+char *</div><div class='add'>+get_path_name(char *word, char **path)</div><div class='add'>+{</div><div class='add'>+    char *delimiter = NULL;</div><div class='add'>+    delimiter = strchr(word, '/');</div><div class='add'>+    if (!delimiter)</div><div class='add'>+        return NULL;</div><div class='add'>+    *path = delimiter;</div><div class='add'>+    return *path;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+void</div><div class='add'>+gf_path_strip_trailing_slashes(char *path)</div><div class='add'>+{</div><div class='add'>+    int i = 0;</div><div class='add'>+    int len = 0;</div><div class='add'>+</div><div class='add'>+    if (!path)</div><div class='add'>+        return;</div><div class='add'>+</div><div class='add'>+    len = strlen(path);</div><div class='add'>+    for (i = len - 1; i &gt; 0; i--) {</div><div class='add'>+        if (path[i] != '/')</div><div class='add'>+            break;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (i &lt; (len - 1))</div><div class='add'>+        path[i + 1] = '\0';</div><div class='add'>+</div><div class='add'>+    return;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+uint64_t</div><div class='add'>+get_mem_size()</div><div class='add'>+{</div><div class='add'>+    uint64_t memsize = -1;</div><div class='add'>+</div><div class='add'>+#if defined GF_LINUX_HOST_OS || defined GF_SOLARIS_HOST_OS</div><div class='add'>+</div><div class='add'>+    uint64_t page_size = 0;</div><div class='add'>+    uint64_t num_pages = 0;</div><div class='add'>+</div><div class='add'>+    page_size = sysconf(_SC_PAGESIZE);</div><div class='add'>+    num_pages = sysconf(_SC_PHYS_PAGES);</div><div class='add'>+</div><div class='add'>+    memsize = page_size * num_pages;</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#if defined GF_DARWIN_HOST_OS || defined __FreeBSD__</div><div class='add'>+</div><div class='add'>+    size_t len = sizeof(memsize);</div><div class='add'>+    int name[] = {CTL_HW, HW_PHYSMEM};</div><div class='add'>+</div><div class='add'>+    sysctl(name, 2, &amp;memsize, &amp;len, NULL, 0);</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#if defined __NetBSD__</div><div class='add'>+</div><div class='add'>+    size_t len = sizeof(memsize);</div><div class='add'>+    int name64[] = {CTL_HW, HW_PHYSMEM64};</div><div class='add'>+</div><div class='add'>+    sysctl(name64, 2, &amp;memsize, &amp;len, NULL, 0);</div><div class='add'>+    if (memsize == -1)</div><div class='add'>+        sysctl(name64, 2, &amp;memsize, &amp;len, NULL, 0);</div><div class='add'>+#endif</div><div class='add'>+    return memsize;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* Strips all whitespace characters in a string and returns length of new string</div><div class='add'>+ * on success</div><div class='add'>+ */</div><div class='ctx'> int</div><div class='del'>-gf_string2uint8 (const char *str, uint8_t *n)</div><div class='add'>+gf_strip_whitespace(char *str, int len)</div><div class='ctx'> {</div><div class='del'>-	unsigned long l = 0L;</div><div class='del'>-	int rv = 0;</div><div class='add'>+    int i = 0;</div><div class='add'>+    int new_len = 0;</div><div class='add'>+    char *new_str = NULL;</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(str);</div><div class='add'>+</div><div class='add'>+    new_str = GF_MALLOC(len + 1, gf_common_mt_char);</div><div class='add'>+    if (new_str == NULL)</div><div class='add'>+        return -1;</div><div class='ctx'> </div><div class='del'>-	rv = _gf_string2ulong (str, &amp;l, 0);</div><div class='del'>-	if (rv != 0)</div><div class='del'>-		return rv;</div><div class='add'>+    for (i = 0; i &lt; len; i++) {</div><div class='add'>+        if (!isspace(str[i]))</div><div class='add'>+            new_str[new_len++] = str[i];</div><div class='add'>+    }</div><div class='add'>+    new_str[new_len] = '\0';</div><div class='ctx'> </div><div class='del'>-	if (l &gt;= 0 &amp;&amp; l &lt;= UINT8_MAX)</div><div class='del'>-	{</div><div class='del'>-		*n = (uint8_t) l;</div><div class='del'>-		return 0;</div><div class='del'>-	}</div><div class='add'>+    if (new_len != len) {</div><div class='add'>+        snprintf(str, new_len + 1, "%s", new_str);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	errno = ERANGE;</div><div class='del'>-	return -1;</div><div class='add'>+    GF_FREE(new_str);</div><div class='add'>+    return new_len;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-gf_string2uint16 (const char *str, uint16_t *n)</div><div class='add'>+gf_canonicalize_path(char *path)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int path_len = 0;</div><div class='add'>+    int dir_path_len = 0;</div><div class='add'>+    char *tmppath = NULL;</div><div class='add'>+    char *dir = NULL;</div><div class='add'>+    char *tmpstr = NULL;</div><div class='add'>+</div><div class='add'>+    if (!path || *path != '/')</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    if (!strcmp(path, "/"))</div><div class='add'>+        return 0;</div><div class='add'>+</div><div class='add'>+    tmppath = gf_strdup(path);</div><div class='add'>+    if (!tmppath)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    /* Strip the extra slashes and return */</div><div class='add'>+    bzero(path, strlen(path));</div><div class='add'>+    path[0] = '/';</div><div class='add'>+    dir = strtok_r(tmppath, "/", &amp;tmpstr);</div><div class='add'>+</div><div class='add'>+    while (dir) {</div><div class='add'>+        dir_path_len = strlen(dir);</div><div class='add'>+        memcpy((path + path_len + 1), dir, dir_path_len);</div><div class='add'>+        path_len += dir_path_len + 1;</div><div class='add'>+        dir = strtok_r(NULL, "/", &amp;tmpstr);</div><div class='add'>+        if (dir) {</div><div class='add'>+            path[path_len] = '/';</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    path[path_len] = '\0';</div><div class='add'>+    ret = 0;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (ret)</div><div class='add'>+        gf_smsg("common-utils", GF_LOG_ERROR, 0, LG_MSG_PATH_ERROR, NULL);</div><div class='add'>+</div><div class='add'>+    GF_FREE(tmppath);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static const char *__gf_timefmts[] = {</div><div class='add'>+    "%F %T", "%Y/%m/%d-%T", "%b %d %T", "%F %H%M%S", "%Y-%m-%d-%T", "%s",</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+static const char *__gf_zerotimes[] = {</div><div class='add'>+    "0000-00-00 00:00:00", "0000/00/00-00:00:00", "xxx 00 00:00:00",</div><div class='add'>+    "0000-00-00 000000",   "0000-00-00-00:00:00", "0",</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+_gf_timestuff(const char ***fmts, const char ***zeros)</div><div class='ctx'> {</div><div class='del'>-	unsigned long l = 0L;</div><div class='del'>-	int rv = 0;</div><div class='add'>+    *fmts = __gf_timefmts;</div><div class='add'>+    *zeros = __gf_zerotimes;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	rv = _gf_string2ulong (str, &amp;l, 0);</div><div class='del'>-	if (rv != 0)</div><div class='del'>-		return rv;</div><div class='add'>+char *</div><div class='add'>+generate_glusterfs_ctx_id(void)</div><div class='add'>+{</div><div class='add'>+    uuid_t ctxid;</div><div class='add'>+    char *tmp = NULL;</div><div class='ctx'> </div><div class='del'>-	if (l &gt;= 0 &amp;&amp; l &lt;= UINT16_MAX)</div><div class='del'>-	{</div><div class='del'>-		*n = (uint16_t) l;</div><div class='del'>-		return 0;</div><div class='del'>-	}</div><div class='add'>+    gf_uuid_generate(ctxid);</div><div class='add'>+    tmp = uuid_utoa(ctxid);</div><div class='ctx'> </div><div class='del'>-	errno = ERANGE;</div><div class='del'>-	return -1;</div><div class='add'>+    return gf_strdup(tmp);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+char *</div><div class='add'>+gf_get_reserved_ports()</div><div class='add'>+{</div><div class='add'>+    char *ports_info = NULL;</div><div class='add'>+#if defined GF_LINUX_HOST_OS</div><div class='add'>+    int proc_fd = -1;</div><div class='add'>+    char *proc_file = "/proc/sys/net/ipv4/ip_local_reserved_ports";</div><div class='add'>+    char buffer[4096] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int32_t ret = -1;</div><div class='add'>+</div><div class='add'>+    proc_fd = open(proc_file, O_RDONLY);</div><div class='add'>+    if (proc_fd == -1) {</div><div class='add'>+        /* What should be done in this case? error out from here</div><div class='add'>+         * and thus stop the glusterfs process from starting or</div><div class='add'>+         * continue with older method of using any of the available</div><div class='add'>+         * port? For now 2nd option is considered.</div><div class='add'>+         */</div><div class='add'>+        gf_smsg("glusterfs", GF_LOG_WARNING, errno, LG_MSG_FILE_OP_FAILED,</div><div class='add'>+                " /proc/sys/net/ipv4/ip_local_reserved_ports", NULL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = sys_read(proc_fd, buffer, sizeof(buffer) - 1);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        gf_smsg("glusterfs", GF_LOG_WARNING, errno, LG_MSG_FILE_OP_FAILED,</div><div class='add'>+                "file=%s", proc_file, NULL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    buffer[ret] = '\0';</div><div class='add'>+    ports_info = gf_strdup(buffer);</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (proc_fd != -1)</div><div class='add'>+        sys_close(proc_fd);</div><div class='add'>+#endif /* GF_LINUX_HOST_OS */</div><div class='add'>+    return ports_info;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-gf_string2uint32 (const char *str, uint32_t *n)</div><div class='add'>+gf_process_reserved_ports(unsigned char *ports, uint32_t ceiling)</div><div class='ctx'> {</div><div class='del'>-	unsigned long l = 0L;</div><div class='del'>-	int rv = 0;</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    memset(ports, 0, GF_PORT_ARRAY_SIZE);</div><div class='add'>+</div><div class='add'>+#if defined GF_LINUX_HOST_OS</div><div class='add'>+    char *ports_info = NULL;</div><div class='add'>+    char *tmp = NULL;</div><div class='add'>+    char *blocked_port = NULL;</div><div class='ctx'> </div><div class='del'>-	rv = _gf_string2ulong (str, &amp;l, 0);</div><div class='del'>-	if (rv != 0)</div><div class='del'>-		return rv;</div><div class='add'>+    ports_info = gf_get_reserved_ports();</div><div class='add'>+    if (!ports_info) {</div><div class='add'>+        gf_smsg("glusterfs", GF_LOG_WARNING, 0, LG_MSG_RESERVED_PORTS_ERROR,</div><div class='add'>+                NULL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	if (l &gt;= 0 &amp;&amp; l &lt;= UINT32_MAX)</div><div class='del'>-	{</div><div class='del'>-		*n = (uint32_t) l;</div><div class='del'>-		return 0;</div><div class='del'>-	}</div><div class='add'>+    blocked_port = strtok_r(ports_info, ",\n", &amp;tmp);</div><div class='ctx'> </div><div class='del'>-	errno = ERANGE;</div><div class='del'>-	return -1;</div><div class='add'>+    while (blocked_port) {</div><div class='add'>+        gf_ports_reserved(blocked_port, ports, ceiling);</div><div class='add'>+        blocked_port = strtok_r(NULL, ",\n", &amp;tmp);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    GF_FREE(ports_info);</div><div class='add'>+</div><div class='add'>+#else  /* FIXME: Non Linux Host */</div><div class='add'>+    ret = 0;</div><div class='add'>+#endif /* GF_LINUX_HOST_OS */</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+gf_boolean_t</div><div class='add'>+gf_ports_reserved(char *blocked_port, unsigned char *ports, uint32_t ceiling)</div><div class='add'>+{</div><div class='add'>+    gf_boolean_t result = _gf_false;</div><div class='add'>+    char *range_port = NULL;</div><div class='add'>+    int32_t tmp_port1 = -1;</div><div class='add'>+    int32_t tmp_port2 = -1;</div><div class='add'>+</div><div class='add'>+    if (strstr(blocked_port, "-") == NULL) {</div><div class='add'>+        /* get rid of the new line character*/</div><div class='add'>+        if (blocked_port[strlen(blocked_port) - 1] == '\n')</div><div class='add'>+            blocked_port[strlen(blocked_port) - 1] = '\0';</div><div class='add'>+        if (gf_string2int32(blocked_port, &amp;tmp_port1) == 0) {</div><div class='add'>+            if (tmp_port1 &gt; GF_PORT_MAX || tmp_port1 &lt; 0) {</div><div class='add'>+                gf_smsg("glusterfs-socket", GF_LOG_WARNING, 0,</div><div class='add'>+                        LG_MSG_INVALID_PORT, "port=%d", tmp_port1, NULL);</div><div class='add'>+                result = _gf_true;</div><div class='add'>+                goto out;</div><div class='add'>+            } else {</div><div class='add'>+                gf_msg_debug("glusterfs", 0,</div><div class='add'>+                             "blocking port "</div><div class='add'>+                             "%d",</div><div class='add'>+                             tmp_port1);</div><div class='add'>+                BIT_SET(ports, tmp_port1);</div><div class='add'>+            }</div><div class='add'>+        } else {</div><div class='add'>+            gf_smsg("glusterfs-socket", GF_LOG_WARNING, 0, LG_MSG_INVALID_PORT,</div><div class='add'>+                    "port=%s", blocked_port, NULL);</div><div class='add'>+            result = _gf_true;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    } else {</div><div class='add'>+        range_port = strtok(blocked_port, "-");</div><div class='add'>+        if (!range_port) {</div><div class='add'>+            result = _gf_true;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+        if (gf_string2int32(range_port, &amp;tmp_port1) == 0) {</div><div class='add'>+            if (tmp_port1 &gt; ceiling)</div><div class='add'>+                tmp_port1 = ceiling;</div><div class='add'>+            if (tmp_port1 &lt; 0)</div><div class='add'>+                tmp_port1 = 0;</div><div class='add'>+        }</div><div class='add'>+        range_port = strtok(NULL, "-");</div><div class='add'>+        if (!range_port) {</div><div class='add'>+            result = _gf_true;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+        /* get rid of the new line character*/</div><div class='add'>+        if (range_port[strlen(range_port) - 1] == '\n')</div><div class='add'>+            range_port[strlen(range_port) - 1] = '\0';</div><div class='add'>+        if (gf_string2int32(range_port, &amp;tmp_port2) == 0) {</div><div class='add'>+            if (tmp_port2 &gt; ceiling)</div><div class='add'>+                tmp_port2 = ceiling;</div><div class='add'>+            if (tmp_port2 &lt; 0)</div><div class='add'>+                tmp_port2 = 0;</div><div class='add'>+        }</div><div class='add'>+        gf_msg_debug("glusterfs", 0, "lower: %d, higher: %d", tmp_port1,</div><div class='add'>+                     tmp_port2);</div><div class='add'>+        for (; tmp_port1 &lt;= tmp_port2; tmp_port1++)</div><div class='add'>+            BIT_SET(ports, tmp_port1);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return result;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* Takes in client ip{v4,v6} and returns associated hostname, if any</div><div class='add'>+ * Also, allocates memory for the hostname.</div><div class='add'>+ * Returns: 0 for success, -1 for failure</div><div class='add'>+ */</div><div class='ctx'> int</div><div class='del'>-gf_string2uint64 (const char *str, uint64_t *n)</div><div class='add'>+gf_get_hostname_from_ip(char *client_ip, char **hostname)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    struct sockaddr *client_sockaddr = NULL;</div><div class='add'>+    struct sockaddr_in client_sock_in = {0};</div><div class='add'>+    struct sockaddr_in6 client_sock_in6 = {0};</div><div class='add'>+    char client_hostname[NI_MAXHOST] = {0};</div><div class='add'>+    char *client_ip_copy = NULL;</div><div class='add'>+    char *tmp = NULL;</div><div class='add'>+    char *ip = NULL;</div><div class='add'>+    size_t addr_sz = 0;</div><div class='add'>+</div><div class='add'>+    /* if ipv4, reverse lookup the hostname to</div><div class='add'>+     * allow FQDN based rpc authentication</div><div class='add'>+     */</div><div class='add'>+    if (!valid_ipv6_address(client_ip, strlen(client_ip), 0) &amp;&amp;</div><div class='add'>+        !valid_ipv4_address(client_ip, strlen(client_ip), 0)) {</div><div class='add'>+        /* most times, we get a.b.c.d:port form, so check that */</div><div class='add'>+        client_ip_copy = gf_strdup(client_ip);</div><div class='add'>+        if (!client_ip_copy)</div><div class='add'>+            goto out;</div><div class='add'>+</div><div class='add'>+        ip = strtok_r(client_ip_copy, ":", &amp;tmp);</div><div class='add'>+    } else {</div><div class='add'>+        ip = client_ip;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (valid_ipv4_address(ip, strlen(ip), 0) == _gf_true) {</div><div class='add'>+        client_sockaddr = (struct sockaddr *)&amp;client_sock_in;</div><div class='add'>+        addr_sz = sizeof(client_sock_in);</div><div class='add'>+        client_sock_in.sin_family = AF_INET;</div><div class='add'>+        ret = inet_pton(AF_INET, ip, (void *)&amp;client_sock_in.sin_addr.s_addr);</div><div class='add'>+</div><div class='add'>+    } else if (valid_ipv6_address(ip, strlen(ip), 0) == _gf_true) {</div><div class='add'>+        client_sockaddr = (struct sockaddr *)&amp;client_sock_in6;</div><div class='add'>+        addr_sz = sizeof(client_sock_in6);</div><div class='add'>+</div><div class='add'>+        client_sock_in6.sin6_family = AF_INET6;</div><div class='add'>+        ret = inet_pton(AF_INET6, ip, (void *)&amp;client_sock_in6.sin6_addr);</div><div class='add'>+    } else {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (ret != 1) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* You cannot just use sizeof (*client_sockaddr), as per the man page</div><div class='add'>+     * the (getnameinfo) size must be the size of the underlying sockaddr</div><div class='add'>+     * struct e.g. sockaddr_in6 or sockaddr_in.  Failure to do so will</div><div class='add'>+     * break IPv6 hostname resolution (IPv4 will work only because</div><div class='add'>+     * the sockaddr_in struct happens to be of the correct size).</div><div class='add'>+     */</div><div class='add'>+    ret = getnameinfo(client_sockaddr, addr_sz, client_hostname,</div><div class='add'>+                      sizeof(client_hostname), NULL, 0, 0);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_smsg("common-utils", GF_LOG_ERROR, 0, LG_MSG_GETNAMEINFO_FAILED,</div><div class='add'>+                "ip=%s", client_ip, "ret=%s", gai_strerror(ret), NULL);</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    *hostname = gf_strdup((char *)client_hostname);</div><div class='add'>+out:</div><div class='add'>+    if (client_ip_copy)</div><div class='add'>+        GF_FREE(client_ip_copy);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+gf_boolean_t</div><div class='add'>+gf_interface_search(char *ip)</div><div class='add'>+{</div><div class='add'>+    int32_t ret = -1;</div><div class='add'>+    gf_boolean_t found = _gf_false;</div><div class='add'>+    struct ifaddrs *ifaddr, *ifa;</div><div class='add'>+    int family;</div><div class='add'>+    char host[NI_MAXHOST];</div><div class='add'>+    xlator_t *this = NULL;</div><div class='add'>+    char *pct = NULL;</div><div class='add'>+</div><div class='add'>+    this = THIS;</div><div class='add'>+</div><div class='add'>+    ret = getifaddrs(&amp;ifaddr);</div><div class='add'>+</div><div class='add'>+    if (ret != 0) {</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_ERROR, 0, LG_MSG_GETIFADDRS_FAILED, "ret=%s",</div><div class='add'>+                gai_strerror(ret), NULL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    for (ifa = ifaddr; ifa != NULL; ifa = ifa-&gt;ifa_next) {</div><div class='add'>+        if (!ifa-&gt;ifa_addr) {</div><div class='add'>+            /*</div><div class='add'>+             * This seemingly happens if an interface hasn't</div><div class='add'>+             * been bound to a particular protocol (seen with</div><div class='add'>+             * TUN devices).</div><div class='add'>+             */</div><div class='add'>+            continue;</div><div class='add'>+        }</div><div class='add'>+        family = ifa-&gt;ifa_addr-&gt;sa_family;</div><div class='add'>+</div><div class='add'>+        if (family != AF_INET &amp;&amp; family != AF_INET6)</div><div class='add'>+            continue;</div><div class='add'>+</div><div class='add'>+        ret = getnameinfo(ifa-&gt;ifa_addr,</div><div class='add'>+                          (family == AF_INET) ? sizeof(struct sockaddr_in)</div><div class='add'>+                                              : sizeof(struct sockaddr_in6),</div><div class='add'>+                          host, NI_MAXHOST, NULL, 0, NI_NUMERICHOST);</div><div class='add'>+</div><div class='add'>+        if (ret != 0) {</div><div class='add'>+            gf_smsg(this-&gt;name, GF_LOG_ERROR, 0, LG_MSG_GETNAMEINFO_FAILED,</div><div class='add'>+                    "ret=%s", gai_strerror(ret), NULL);</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        /*</div><div class='add'>+         * Sometimes the address comes back as addr%eth0 or</div><div class='add'>+         * similar.  Since % is an invalid character, we can</div><div class='add'>+         * strip it out with confidence that doing so won't</div><div class='add'>+         * harm anything.</div><div class='add'>+         */</div><div class='add'>+        pct = index(host, '%');</div><div class='add'>+        if (pct) {</div><div class='add'>+            *pct = '\0';</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        if (strncmp(ip, host, NI_MAXHOST) == 0) {</div><div class='add'>+            gf_msg_debug(this-&gt;name, 0,</div><div class='add'>+                         "%s is local address at "</div><div class='add'>+                         "interface %s",</div><div class='add'>+                         ip, ifa-&gt;ifa_name);</div><div class='add'>+            found = _gf_true;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+out:</div><div class='add'>+    if (ifaddr)</div><div class='add'>+        freeifaddrs(ifaddr);</div><div class='add'>+    return found;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+char *</div><div class='add'>+get_ip_from_addrinfo(struct addrinfo *addr, char **ip)</div><div class='add'>+{</div><div class='add'>+    char buf[64];</div><div class='add'>+    void *in_addr = NULL;</div><div class='add'>+    struct sockaddr_in *s4 = NULL;</div><div class='add'>+    struct sockaddr_in6 *s6 = NULL;</div><div class='add'>+</div><div class='add'>+    switch (addr-&gt;ai_family) {</div><div class='add'>+        case AF_INET:</div><div class='add'>+            s4 = (struct sockaddr_in *)addr-&gt;ai_addr;</div><div class='add'>+            in_addr = &amp;s4-&gt;sin_addr;</div><div class='add'>+            break;</div><div class='add'>+</div><div class='add'>+        case AF_INET6:</div><div class='add'>+            s6 = (struct sockaddr_in6 *)addr-&gt;ai_addr;</div><div class='add'>+            in_addr = &amp;s6-&gt;sin6_addr;</div><div class='add'>+            break;</div><div class='add'>+</div><div class='add'>+        default:</div><div class='add'>+            gf_smsg("glusterd", GF_LOG_ERROR, 0, LG_MSG_INVALID_FAMILY, NULL);</div><div class='add'>+            return NULL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (!inet_ntop(addr-&gt;ai_family, in_addr, buf, sizeof(buf))) {</div><div class='add'>+        gf_smsg("glusterd", GF_LOG_ERROR, 0, LG_MSG_CONVERSION_FAILED, NULL);</div><div class='add'>+        return NULL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    *ip = gf_strdup(buf);</div><div class='add'>+    return *ip;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+gf_boolean_t</div><div class='add'>+gf_is_loopback_localhost(const struct sockaddr *sa, char *hostname)</div><div class='add'>+{</div><div class='add'>+    GF_ASSERT(sa);</div><div class='add'>+</div><div class='add'>+    gf_boolean_t is_local = _gf_false;</div><div class='add'>+    const struct in_addr *addr4 = NULL;</div><div class='add'>+    const struct in6_addr *addr6 = NULL;</div><div class='add'>+    uint8_t *ap = NULL;</div><div class='add'>+    struct in6_addr loopbackaddr6 = IN6ADDR_LOOPBACK_INIT;</div><div class='add'>+</div><div class='add'>+    switch (sa-&gt;sa_family) {</div><div class='add'>+        case AF_INET:</div><div class='add'>+            addr4 = &amp;(((struct sockaddr_in *)sa)-&gt;sin_addr);</div><div class='add'>+            ap = (uint8_t *)&amp;addr4-&gt;s_addr;</div><div class='add'>+            if (ap[0] == 127)</div><div class='add'>+                is_local = _gf_true;</div><div class='add'>+            break;</div><div class='add'>+</div><div class='add'>+        case AF_INET6:</div><div class='add'>+            addr6 = &amp;(((struct sockaddr_in6 *)sa)-&gt;sin6_addr);</div><div class='add'>+            if (memcmp(addr6, &amp;loopbackaddr6, sizeof(loopbackaddr6)) == 0)</div><div class='add'>+                is_local = _gf_true;</div><div class='add'>+            break;</div><div class='add'>+</div><div class='add'>+        default:</div><div class='add'>+            if (hostname)</div><div class='add'>+                gf_smsg("glusterd", GF_LOG_ERROR, 0, LG_MSG_INVALID_FAMILY,</div><div class='add'>+                        "family=%d", sa-&gt;sa_family, "hostname=%s", hostname,</div><div class='add'>+                        NULL);</div><div class='add'>+            break;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return is_local;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+gf_boolean_t</div><div class='add'>+gf_is_local_addr(char *hostname)</div><div class='ctx'> {</div><div class='del'>-	unsigned long long l = 0ULL;</div><div class='del'>-	int rv = 0;</div><div class='add'>+    int32_t ret = -1;</div><div class='add'>+    struct addrinfo *result = NULL;</div><div class='add'>+    struct addrinfo *res = NULL;</div><div class='add'>+    gf_boolean_t found = _gf_false;</div><div class='add'>+    char *ip = NULL;</div><div class='add'>+    xlator_t *this = NULL;</div><div class='add'>+    struct addrinfo hints;</div><div class='add'>+</div><div class='add'>+    this = THIS;</div><div class='add'>+</div><div class='add'>+    memset(&amp;hints, 0, sizeof(hints));</div><div class='add'>+    /*</div><div class='add'>+     * Removing AI_ADDRCONFIG from default_hints</div><div class='add'>+     * for being able to use link local ipv6 addresses</div><div class='add'>+     */</div><div class='add'>+    hints.ai_family = AF_UNSPEC;</div><div class='add'>+</div><div class='add'>+    ret = getaddrinfo(hostname, NULL, &amp;hints, &amp;result);</div><div class='add'>+</div><div class='add'>+    if (ret != 0) {</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_ERROR, 0, LG_MSG_GETADDRINFO_FAILED,</div><div class='add'>+                "ret=%s", gai_strerror(ret), NULL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    for (res = result; res != NULL; res = res-&gt;ai_next) {</div><div class='add'>+        get_ip_from_addrinfo(res, &amp;ip);</div><div class='add'>+        gf_msg_debug(this-&gt;name, 0, "%s ", ip);</div><div class='add'>+</div><div class='add'>+        if (ip) {</div><div class='add'>+            found = (gf_is_loopback_localhost(res-&gt;ai_addr, hostname) ||</div><div class='add'>+                     gf_interface_search(ip));</div><div class='add'>+        }</div><div class='add'>+        if (found) {</div><div class='add'>+            GF_FREE(ip);</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+        GF_FREE(ip);</div><div class='add'>+        /* the above free will not set ip to NULL, and hence, there is</div><div class='add'>+           double free possible as the loop continues. set ip to NULL. */</div><div class='add'>+        ip = NULL;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	rv = _gf_string2ulonglong (str, &amp;l, 0);</div><div class='del'>-	if (rv != 0)</div><div class='del'>-		return rv;</div><div class='add'>+out:</div><div class='add'>+    if (result)</div><div class='add'>+        freeaddrinfo(result);</div><div class='ctx'> </div><div class='del'>-	if (l &gt;= 0 &amp;&amp; l &lt;= UINT64_MAX)</div><div class='del'>-	{</div><div class='del'>-		*n = (uint64_t) l;</div><div class='del'>-		return 0;</div><div class='del'>-	}</div><div class='add'>+    if (!found)</div><div class='add'>+        gf_msg_debug(this-&gt;name, 0, "%s is not local", hostname);</div><div class='ctx'> </div><div class='del'>-	errno = ERANGE;</div><div class='del'>-	return -1;</div><div class='add'>+    return found;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+gf_boolean_t</div><div class='add'>+gf_is_same_address(char *name1, char *name2)</div><div class='add'>+{</div><div class='add'>+    struct addrinfo *addr1 = NULL;</div><div class='add'>+    struct addrinfo *addr2 = NULL;</div><div class='add'>+    struct addrinfo *p = NULL;</div><div class='add'>+    struct addrinfo *q = NULL;</div><div class='add'>+    gf_boolean_t ret = _gf_false;</div><div class='add'>+    int gai_err = 0;</div><div class='add'>+    struct addrinfo hints;</div><div class='add'>+</div><div class='add'>+    memset(&amp;hints, 0, sizeof(hints));</div><div class='add'>+    hints.ai_family = AF_UNSPEC;</div><div class='add'>+</div><div class='add'>+    gai_err = getaddrinfo(name1, NULL, &amp;hints, &amp;addr1);</div><div class='add'>+    if (gai_err != 0) {</div><div class='add'>+        gf_smsg(name1, GF_LOG_WARNING, 0, LG_MSG_GETADDRINFO_FAILED, "error=%s",</div><div class='add'>+                gai_strerror(gai_err), NULL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    gai_err = getaddrinfo(name2, NULL, &amp;hints, &amp;addr2);</div><div class='add'>+    if (gai_err != 0) {</div><div class='add'>+        gf_smsg(name2, GF_LOG_WARNING, 0, LG_MSG_GETADDRINFO_FAILED, "error=%s",</div><div class='add'>+                gai_strerror(gai_err), NULL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    for (p = addr1; p; p = p-&gt;ai_next) {</div><div class='add'>+        for (q = addr2; q; q = q-&gt;ai_next) {</div><div class='add'>+            if (p-&gt;ai_addrlen != q-&gt;ai_addrlen) {</div><div class='add'>+                continue;</div><div class='add'>+            }</div><div class='add'>+            if (memcmp(p-&gt;ai_addr, q-&gt;ai_addr, p-&gt;ai_addrlen)) {</div><div class='add'>+                continue;</div><div class='add'>+            }</div><div class='add'>+            ret = _gf_true;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (addr1) {</div><div class='add'>+        freeaddrinfo(addr1);</div><div class='add'>+    }</div><div class='add'>+    if (addr2) {</div><div class='add'>+        freeaddrinfo(addr2);</div><div class='add'>+    }</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+ * Processes list of volfile servers.</div><div class='add'>+ * Format: &lt;host1&gt;:&lt;port1&gt; &lt;host2&gt;:&lt;port2&gt;...</div><div class='add'>+ */</div><div class='ctx'> int</div><div class='del'>-gf_string2ulong_base10 (const char *str, unsigned long *n)</div><div class='add'>+gf_process_getspec_servers_list(cmd_args_t *cmd_args, const char *servers_list)</div><div class='ctx'> {</div><div class='del'>-	return _gf_string2ulong (str, n, 10);</div><div class='add'>+    char *tmp = NULL;</div><div class='add'>+    char *address = NULL;</div><div class='add'>+    char *host = NULL;</div><div class='add'>+    char *last_colon = NULL;</div><div class='add'>+    char *save_ptr = NULL;</div><div class='add'>+    int port = 0;</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    tmp = gf_strdup(servers_list);</div><div class='add'>+    if (!tmp) {</div><div class='add'>+        errno = ENOMEM;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    address = strtok_r(tmp, " ", &amp;save_ptr);</div><div class='add'>+    if (!address) {</div><div class='add'>+        errno = EINVAL;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    while (1) {</div><div class='add'>+        last_colon = strrchr(address, ':');</div><div class='add'>+        if (!last_colon) {</div><div class='add'>+            errno = EINVAL;</div><div class='add'>+            ret = -1;</div><div class='add'>+            break;</div><div class='add'>+        }</div><div class='add'>+        *last_colon = '\0';</div><div class='add'>+        host = address;</div><div class='add'>+        port = atoi(last_colon + 1);</div><div class='add'>+        if (port &lt;= 0) {</div><div class='add'>+            errno = EINVAL;</div><div class='add'>+            ret = -1;</div><div class='add'>+            break;</div><div class='add'>+        }</div><div class='add'>+        ret = gf_set_volfile_server_common(cmd_args, host,</div><div class='add'>+                                           GF_DEFAULT_VOLFILE_TRANSPORT, port);</div><div class='add'>+        if (ret &amp;&amp; errno != EEXIST) {</div><div class='add'>+            break;</div><div class='add'>+        }</div><div class='add'>+        address = strtok_r(NULL, " ", &amp;save_ptr);</div><div class='add'>+        if (!address) {</div><div class='add'>+            errno = 0;</div><div class='add'>+            ret = 0;</div><div class='add'>+            break;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (tmp) {</div><div class='add'>+        GF_FREE(tmp);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-gf_string2uint_base10 (const char *str, unsigned int *n)</div><div class='add'>+gf_set_volfile_server_common(cmd_args_t *cmd_args, const char *host,</div><div class='add'>+                             const char *transport, int port)</div><div class='ctx'> {</div><div class='del'>-	return _gf_string2uint (str,  n, 10);</div><div class='add'>+    server_cmdline_t *server = NULL;</div><div class='add'>+    server_cmdline_t *tmp = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    GF_VALIDATE_OR_GOTO(THIS-&gt;name, cmd_args, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(THIS-&gt;name, host, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(THIS-&gt;name, transport, out);</div><div class='add'>+</div><div class='add'>+    server = GF_CALLOC(1, sizeof(server_cmdline_t),</div><div class='add'>+                       gf_common_mt_server_cmdline_t);</div><div class='add'>+    if (!server) {</div><div class='add'>+        errno = ENOMEM;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    INIT_LIST_HEAD(&amp;server-&gt;list);</div><div class='add'>+</div><div class='add'>+    server-&gt;volfile_server = gf_strdup(host);</div><div class='add'>+    if (!server-&gt;volfile_server) {</div><div class='add'>+        errno = ENOMEM;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    server-&gt;transport = gf_strdup(transport);</div><div class='add'>+    if (!server-&gt;transport) {</div><div class='add'>+        errno = ENOMEM;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    server-&gt;port = port;</div><div class='add'>+</div><div class='add'>+    if (!cmd_args-&gt;volfile_server) {</div><div class='add'>+        cmd_args-&gt;volfile_server = server-&gt;volfile_server;</div><div class='add'>+        cmd_args-&gt;volfile_server_transport = server-&gt;transport;</div><div class='add'>+        cmd_args-&gt;volfile_server_port = server-&gt;port;</div><div class='add'>+        cmd_args-&gt;curr_server = server;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    list_for_each_entry(tmp, &amp;cmd_args-&gt;volfile_servers, list)</div><div class='add'>+    {</div><div class='add'>+        if ((!strcmp(tmp-&gt;volfile_server, server-&gt;volfile_server) &amp;&amp;</div><div class='add'>+             !strcmp(tmp-&gt;transport, server-&gt;transport) &amp;&amp;</div><div class='add'>+             (tmp-&gt;port == server-&gt;port))) {</div><div class='add'>+            /* Duplicate option given, log and ignore */</div><div class='add'>+            gf_smsg("gluster", GF_LOG_INFO, EEXIST, LG_MSG_DUPLICATE_ENTRY,</div><div class='add'>+                    NULL);</div><div class='add'>+            ret = 0;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    list_add_tail(&amp;server-&gt;list, &amp;cmd_args-&gt;volfile_servers);</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+out:</div><div class='add'>+    if (-1 == ret) {</div><div class='add'>+        if (server) {</div><div class='add'>+            GF_FREE(server-&gt;volfile_server);</div><div class='add'>+            GF_FREE(server-&gt;transport);</div><div class='add'>+            GF_FREE(server);</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+/* Sets log file path from user provided arguments */</div><div class='ctx'> int</div><div class='del'>-gf_string2uint8_base10 (const char *str, uint8_t *n)</div><div class='add'>+gf_set_log_file_path(cmd_args_t *cmd_args, glusterfs_ctx_t *ctx)</div><div class='ctx'> {</div><div class='del'>-	unsigned long l = 0L;</div><div class='del'>-	int rv = 0;</div><div class='add'>+    int i = 0;</div><div class='add'>+    int j = 0;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    int tmp_len = 0;</div><div class='add'>+    char tmp_str[1024] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    if (!cmd_args)</div><div class='add'>+        goto done;</div><div class='add'>+</div><div class='add'>+    if (cmd_args-&gt;mount_point) {</div><div class='add'>+        j = 0;</div><div class='add'>+        i = 0;</div><div class='add'>+        if (cmd_args-&gt;mount_point[0] == '/')</div><div class='add'>+            i = 1;</div><div class='add'>+        for (; i &lt; strlen(cmd_args-&gt;mount_point); i++, j++) {</div><div class='add'>+            tmp_str[j] = cmd_args-&gt;mount_point[i];</div><div class='add'>+            if (cmd_args-&gt;mount_point[i] == '/')</div><div class='add'>+                tmp_str[j] = '-';</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        ret = gf_asprintf(&amp;cmd_args-&gt;log_file,</div><div class='add'>+                          DEFAULT_LOG_FILE_DIRECTORY "/%s.log", tmp_str);</div><div class='add'>+        if (ret &gt; 0)</div><div class='add'>+            ret = 0;</div><div class='add'>+        goto done;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (ctx &amp;&amp; GF_GLUSTERD_PROCESS == ctx-&gt;process_mode) {</div><div class='add'>+        ret = gf_asprintf(&amp;cmd_args-&gt;log_file,</div><div class='add'>+                          DEFAULT_LOG_FILE_DIRECTORY "/%s.log", GLUSTERD_NAME);</div><div class='add'>+        if (ret &gt; 0)</div><div class='add'>+            ret = 0;</div><div class='add'>+</div><div class='add'>+        goto done;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (cmd_args-&gt;volfile) {</div><div class='add'>+        j = 0;</div><div class='add'>+        i = 0;</div><div class='add'>+        if (cmd_args-&gt;volfile[0] == '/')</div><div class='add'>+            i = 1;</div><div class='add'>+        for (; i &lt; strlen(cmd_args-&gt;volfile); i++, j++) {</div><div class='add'>+            tmp_str[j] = cmd_args-&gt;volfile[i];</div><div class='add'>+            if (cmd_args-&gt;volfile[i] == '/')</div><div class='add'>+                tmp_str[j] = '-';</div><div class='add'>+        }</div><div class='add'>+        ret = gf_asprintf(&amp;cmd_args-&gt;log_file,</div><div class='add'>+                          DEFAULT_LOG_FILE_DIRECTORY "/%s.log", tmp_str);</div><div class='add'>+        if (ret &gt; 0)</div><div class='add'>+            ret = 0;</div><div class='add'>+        goto done;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (cmd_args-&gt;volfile_server) {</div><div class='add'>+        if (strncmp(cmd_args-&gt;volfile_server_transport, "unix", 4) == 0) {</div><div class='add'>+            if (cmd_args-&gt;volfile_server[0] == '/')</div><div class='add'>+                i = 1;</div><div class='add'>+            tmp_len = strlen(cmd_args-&gt;volfile_server);</div><div class='add'>+            for (j = 0; i &lt; tmp_len; i++, j++) {</div><div class='add'>+                tmp_str[j] = cmd_args-&gt;volfile_server[i];</div><div class='add'>+                if (cmd_args-&gt;volfile_server[i] == '/')</div><div class='add'>+                    tmp_str[j] = '-';</div><div class='add'>+            }</div><div class='add'>+            ret = gf_asprintf(&amp;cmd_args-&gt;log_file, "%s/%s-%s-%d.log",</div><div class='add'>+                              DEFAULT_LOG_FILE_DIRECTORY, tmp_str,</div><div class='add'>+                              cmd_args-&gt;volfile_id, getpid());</div><div class='add'>+        } else {</div><div class='add'>+            ret = gf_asprintf(&amp;cmd_args-&gt;log_file, "%s/%s-%s-%d.log",</div><div class='add'>+                              DEFAULT_LOG_FILE_DIRECTORY,</div><div class='add'>+                              cmd_args-&gt;volfile_server, cmd_args-&gt;volfile_id,</div><div class='add'>+                              getpid());</div><div class='add'>+        }</div><div class='add'>+        if (ret &gt; 0)</div><div class='add'>+            ret = 0;</div><div class='add'>+    }</div><div class='add'>+done:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	rv = _gf_string2ulong (str, &amp;l, 10);</div><div class='del'>-	if (rv != 0)</div><div class='del'>-		return rv;</div><div class='add'>+int</div><div class='add'>+gf_set_log_ident(cmd_args_t *cmd_args)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+    char *ptr = NULL;</div><div class='add'>+</div><div class='add'>+    if (cmd_args-&gt;log_file == NULL) {</div><div class='add'>+        /* no ident source */</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* TODO: Some idents would look like, etc-glusterfs-glusterd.vol, which</div><div class='add'>+     * seems ugly and can be bettered? */</div><div class='add'>+    /* just get the filename as the ident */</div><div class='add'>+    if (NULL != (ptr = strrchr(cmd_args-&gt;log_file, '/'))) {</div><div class='add'>+        ret = gf_asprintf(&amp;cmd_args-&gt;log_ident, "%s", ptr + 1);</div><div class='add'>+    } else {</div><div class='add'>+        ret = gf_asprintf(&amp;cmd_args-&gt;log_ident, "%s", cmd_args-&gt;log_file);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (ret &gt; 0)</div><div class='add'>+        ret = 0;</div><div class='add'>+    else</div><div class='add'>+        return ret;</div><div class='ctx'> </div><div class='del'>-	if (l &gt;= 0 &amp;&amp; l &lt;= UINT8_MAX)</div><div class='del'>-	{</div><div class='del'>-		*n = (uint8_t) l;</div><div class='del'>-		return 0;</div><div class='del'>-	}</div><div class='add'>+    /* remove .log suffix */</div><div class='add'>+    if (NULL != (ptr = strrchr(cmd_args-&gt;log_ident, '.'))) {</div><div class='add'>+        if (strcmp(ptr, ".log") == 0) {</div><div class='add'>+            ptr[0] = '\0';</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	errno = ERANGE;</div><div class='del'>-	return -1;</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-gf_string2uint16_base10 (const char *str, uint16_t *n)</div><div class='add'>+gf_thread_cleanup_xint(pthread_t thread)</div><div class='ctx'> {</div><div class='del'>-	unsigned long l = 0L;</div><div class='del'>-	int rv = 0;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    void *res = NULL;</div><div class='add'>+</div><div class='add'>+    ret = pthread_cancel(thread);</div><div class='add'>+    if (ret != 0)</div><div class='add'>+        goto error_return;</div><div class='ctx'> </div><div class='del'>-	rv = _gf_string2ulong (str, &amp;l, 10);</div><div class='del'>-	if (rv != 0)</div><div class='del'>-		return rv;</div><div class='add'>+    ret = pthread_join(thread, &amp;res);</div><div class='add'>+    if (ret != 0)</div><div class='add'>+        goto error_return;</div><div class='ctx'> </div><div class='del'>-	if (l &gt;= 0 &amp;&amp; l &lt;= UINT16_MAX)</div><div class='del'>-	{</div><div class='del'>-		*n = (uint16_t) l;</div><div class='del'>-		return 0;</div><div class='del'>-	}</div><div class='add'>+    if (res != PTHREAD_CANCELED)</div><div class='add'>+        goto error_return;</div><div class='ctx'> </div><div class='del'>-	errno = ERANGE;</div><div class='del'>-	return -1;</div><div class='add'>+    ret = 0;</div><div class='add'>+</div><div class='add'>+error_return:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+gf_thread_set_vname(pthread_t thread, const char *name, va_list args)</div><div class='add'>+{</div><div class='add'>+    char thread_name[GF_THREAD_NAME_LIMIT];</div><div class='add'>+    int ret;</div><div class='add'>+</div><div class='add'>+    /* Initialize the thread name with the prefix (not NULL terminated). */</div><div class='add'>+    memcpy(thread_name, GF_THREAD_NAME_PREFIX,</div><div class='add'>+           sizeof(GF_THREAD_NAME_PREFIX) - 1);</div><div class='add'>+</div><div class='add'>+    ret = vsnprintf(thread_name + sizeof(GF_THREAD_NAME_PREFIX) - 1,</div><div class='add'>+                    sizeof(thread_name) - sizeof(GF_THREAD_NAME_PREFIX) + 1,</div><div class='add'>+                    name, args);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        gf_smsg(THIS-&gt;name, GF_LOG_WARNING, 0, LG_MSG_PTHREAD_NAMING_FAILED,</div><div class='add'>+                "name=%s", name, NULL);</div><div class='add'>+        return;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (ret &gt;= sizeof(thread_name)) {</div><div class='add'>+        gf_smsg(THIS-&gt;name, GF_LOG_WARNING, 0, LG_MSG_THREAD_NAME_TOO_LONG,</div><div class='add'>+                "name=%s", thread_name, NULL);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+#ifdef GF_LINUX_HOST_OS</div><div class='add'>+    ret = pthread_setname_np(thread, thread_name);</div><div class='add'>+#elif defined(__NetBSD__)</div><div class='add'>+    ret = pthread_setname_np(thread, thread_name, NULL);</div><div class='add'>+#elif defined(__FreeBSD__)</div><div class='add'>+    pthread_set_name_np(thread, thread_name);</div><div class='add'>+    ret = 0;</div><div class='add'>+#else</div><div class='add'>+    ret = ENOSYS;</div><div class='add'>+#endif</div><div class='add'>+    if (ret != 0) {</div><div class='add'>+        gf_smsg(THIS-&gt;name, GF_LOG_WARNING, ret, LG_MSG_SET_THREAD_FAILED,</div><div class='add'>+                "name=%s", thread_name, NULL);</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+gf_thread_set_name(pthread_t thread, const char *name, ...)</div><div class='add'>+{</div><div class='add'>+    va_list args;</div><div class='add'>+</div><div class='add'>+    va_start(args, name);</div><div class='add'>+    gf_thread_set_vname(thread, name, args);</div><div class='add'>+    va_end(args);</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-gf_string2uint32_base10 (const char *str, uint32_t *n)</div><div class='add'>+gf_thread_vcreate(pthread_t *thread, const pthread_attr_t *attr,</div><div class='add'>+                  void *(*start_routine)(void *), void *arg, const char *name,</div><div class='add'>+                  va_list args)</div><div class='ctx'> {</div><div class='del'>-	unsigned long l = 0L;</div><div class='del'>-	int rv = 0;</div><div class='add'>+    sigset_t set, old;</div><div class='add'>+    int ret;</div><div class='add'>+</div><div class='add'>+    sigemptyset(&amp;old);</div><div class='add'>+    sigfillset(&amp;set);</div><div class='add'>+    sigdelset(&amp;set, SIGSEGV);</div><div class='add'>+    sigdelset(&amp;set, SIGBUS);</div><div class='add'>+    sigdelset(&amp;set, SIGILL);</div><div class='add'>+    sigdelset(&amp;set, SIGSYS);</div><div class='add'>+    sigdelset(&amp;set, SIGFPE);</div><div class='add'>+    sigdelset(&amp;set, SIGABRT);</div><div class='add'>+</div><div class='add'>+    pthread_sigmask(SIG_BLOCK, &amp;set, &amp;old);</div><div class='add'>+</div><div class='add'>+    ret = pthread_create(thread, attr, start_routine, arg);</div><div class='add'>+    if (ret != 0) {</div><div class='add'>+        gf_smsg(THIS-&gt;name, GF_LOG_ERROR, ret, LG_MSG_THREAD_CREATE_FAILED,</div><div class='add'>+                NULL);</div><div class='add'>+        ret = -1;</div><div class='add'>+    } else if (name != NULL) {</div><div class='add'>+        gf_thread_set_vname(*thread, name, args);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    pthread_sigmask(SIG_SETMASK, &amp;old, NULL);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	rv = _gf_string2ulong (str, &amp;l, 10);</div><div class='del'>-	if (rv != 0)</div><div class='del'>-		return rv;</div><div class='add'>+int</div><div class='add'>+gf_thread_create(pthread_t *thread, const pthread_attr_t *attr,</div><div class='add'>+                 void *(*start_routine)(void *), void *arg, const char *name,</div><div class='add'>+                 ...)</div><div class='add'>+{</div><div class='add'>+    va_list args;</div><div class='add'>+    int ret;</div><div class='ctx'> </div><div class='del'>-	if (l &gt;= 0 &amp;&amp; l &lt;= UINT32_MAX)</div><div class='del'>-	{</div><div class='del'>-		*n = (uint32_t) l;</div><div class='del'>-		return 0;</div><div class='del'>-	}</div><div class='add'>+    va_start(args, name);</div><div class='add'>+    ret = gf_thread_vcreate(thread, attr, start_routine, arg, name, args);</div><div class='add'>+    va_end(args);</div><div class='ctx'> </div><div class='del'>-	errno = ERANGE;</div><div class='del'>-	return -1;</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-gf_string2uint64_base10 (const char *str, uint64_t *n)</div><div class='add'>+gf_thread_create_detached(pthread_t *thread, void *(*start_routine)(void *),</div><div class='add'>+                          void *arg, const char *name, ...)</div><div class='ctx'> {</div><div class='del'>-	unsigned long long l = 0ULL;</div><div class='del'>-	int rv = 0;</div><div class='add'>+    pthread_attr_t attr;</div><div class='add'>+    va_list args;</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    ret = pthread_attr_init(&amp;attr);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_smsg(THIS-&gt;name, GF_LOG_ERROR, ret, LG_MSG_PTHREAD_ATTR_INIT_FAILED,</div><div class='add'>+                NULL);</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    pthread_attr_setdetachstate(&amp;attr, PTHREAD_CREATE_DETACHED);</div><div class='ctx'> </div><div class='del'>-	rv = _gf_string2ulonglong (str, &amp;l, 10);</div><div class='del'>-	if (rv != 0)</div><div class='del'>-		return rv;</div><div class='add'>+    va_start(args, name);</div><div class='add'>+    ret = gf_thread_vcreate(thread, &amp;attr, start_routine, arg, name, args);</div><div class='add'>+    va_end(args);</div><div class='ctx'> </div><div class='del'>-	if (l &gt;= 0 &amp;&amp; l &lt;= UINT64_MAX)</div><div class='del'>-	{</div><div class='del'>-		*n = (uint64_t) l;</div><div class='del'>-		return 0;</div><div class='del'>-	}</div><div class='add'>+    pthread_attr_destroy(&amp;attr);</div><div class='ctx'> </div><div class='del'>-	errno = ERANGE;</div><div class='del'>-	return -1;</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-gf_string2bytesize (const char *str, uint64_t *n)</div><div class='add'>+gf_skip_header_section(int fd, int header_len)</div><div class='ctx'> {</div><div class='del'>-	uint64_t value = 0ULL;</div><div class='del'>-	char *tail = NULL;</div><div class='del'>-	int old_errno = 0;</div><div class='del'>-	const char *s = NULL;</div><div class='add'>+    int ret = -1;</div><div class='ctx'> </div><div class='del'>-	if (str == NULL || n == NULL)</div><div class='del'>-	{</div><div class='del'>-		errno = EINVAL;</div><div class='del'>-		return -1;</div><div class='del'>-	}</div><div class='add'>+    ret = sys_lseek(fd, header_len, SEEK_SET);</div><div class='add'>+    if (ret == (off_t)-1) {</div><div class='add'>+        gf_smsg("", GF_LOG_ERROR, 0, LG_MSG_SKIP_HEADER_FAILED, NULL);</div><div class='add'>+    } else {</div><div class='add'>+        ret = 0;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	for (s = str; *s != '\0'; s++)</div><div class='del'>-	{</div><div class='del'>-		if (isspace (*s))</div><div class='del'>-		{</div><div class='del'>-			continue;</div><div class='del'>-		}</div><div class='del'>-		if (*s == '-')</div><div class='del'>-		{</div><div class='del'>-			/* bala: we do not support suffixed (-) sign and</div><div class='del'>-			   invalid integer format */</div><div class='del'>-			return -1;</div><div class='del'>-		}</div><div class='del'>-		break;</div><div class='del'>-	}</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	old_errno = errno;</div><div class='del'>-	errno = 0;</div><div class='del'>-	value = strtoull (str, &amp;tail, 10);</div><div class='add'>+/* Below function is use to check at runtime if pid is running */</div><div class='ctx'> </div><div class='del'>-	if (errno == ERANGE || errno == EINVAL)</div><div class='del'>-	{</div><div class='del'>-		return -1;</div><div class='del'>-	}</div><div class='add'>+gf_boolean_t</div><div class='add'>+gf_is_pid_running(int pid)</div><div class='add'>+{</div><div class='add'>+#ifdef __FreeBSD__</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    ret = sys_kill(pid, 0);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        return _gf_false;</div><div class='add'>+    }</div><div class='add'>+#else</div><div class='add'>+    char fname[32] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int fd = -1;</div><div class='add'>+</div><div class='add'>+    snprintf(fname, sizeof(fname), "/proc/%d/cmdline", pid);</div><div class='add'>+</div><div class='add'>+    fd = sys_open(fname, O_RDONLY, 0);</div><div class='add'>+    if (fd &lt; 0) {</div><div class='add'>+        return _gf_false;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    sys_close(fd);</div><div class='add'>+#endif</div><div class='add'>+    return _gf_true;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	if (errno == 0)</div><div class='del'>-	{</div><div class='del'>-		errno = old_errno;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	if (tail[0] != '\0')</div><div class='del'>-	{</div><div class='del'>-		if (strcasecmp (tail, GF_UNIT_KB_STRING) == 0)</div><div class='del'>-		{</div><div class='del'>-			value *= GF_UNIT_KB;</div><div class='del'>-		}</div><div class='del'>-		else if (strcasecmp (tail, GF_UNIT_MB_STRING) == 0)</div><div class='del'>-		{</div><div class='del'>-			value *= GF_UNIT_MB;</div><div class='del'>-		}</div><div class='del'>-		else if (strcasecmp (tail, GF_UNIT_GB_STRING) == 0)</div><div class='del'>-		{</div><div class='del'>-			value *= GF_UNIT_GB;</div><div class='del'>-		}</div><div class='del'>-		else if (strcasecmp (tail, GF_UNIT_TB_STRING) == 0)</div><div class='del'>-		{</div><div class='del'>-			value *= GF_UNIT_TB;</div><div class='del'>-		}</div><div class='del'>-		else if (strcasecmp (tail, GF_UNIT_PB_STRING) == 0)</div><div class='del'>-		{</div><div class='del'>-			value *= GF_UNIT_PB;</div><div class='del'>-		}</div><div class='del'>-		else</div><div class='del'>-		{</div><div class='del'>-			/* bala: invalid integer format */</div><div class='del'>-			return -1;</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	*n = value;</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='add'>+gf_boolean_t</div><div class='add'>+gf_is_service_running(char *pidfile, int *pid)</div><div class='add'>+{</div><div class='add'>+    FILE *file = NULL;</div><div class='add'>+    gf_boolean_t running = _gf_false;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    int fno = 0;</div><div class='add'>+</div><div class='add'>+    file = fopen(pidfile, "r+");</div><div class='add'>+    if (!file) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    fno = fileno(file);</div><div class='add'>+    ret = lockf(fno, F_TEST, 0);</div><div class='add'>+    if (ret == -1) {</div><div class='add'>+        running = _gf_true;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = fscanf(file, "%d", pid);</div><div class='add'>+    if (ret &lt;= 0) {</div><div class='add'>+        gf_smsg("", GF_LOG_ERROR, errno, LG_MSG_FILE_OP_FAILED, "pidfile=%s",</div><div class='add'>+                pidfile, NULL);</div><div class='add'>+        *pid = -1;</div><div class='add'>+        running = _gf_false;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    running = gf_is_pid_running(*pid);</div><div class='add'>+out:</div><div class='add'>+    if (file)</div><div class='add'>+        fclose(file);</div><div class='add'>+    return running;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-int64_t</div><div class='del'>-gf_str_to_long_long (const char *number)</div><div class='add'>+/* Check if the pid is &gt; 0 */</div><div class='add'>+gf_boolean_t</div><div class='add'>+gf_valid_pid(const char *pid, int length)</div><div class='ctx'> {</div><div class='del'>-	int64_t unit = 1;</div><div class='del'>-	int64_t ret = 0;</div><div class='del'>-	char *endptr = NULL ;</div><div class='del'>-	if (!number)</div><div class='del'>-		return 0;</div><div class='add'>+    gf_boolean_t ret = _gf_true;</div><div class='add'>+    pid_t value = 0;</div><div class='add'>+    char *end_ptr = NULL;</div><div class='add'>+</div><div class='add'>+    if (length &lt;= 0) {</div><div class='add'>+        ret = _gf_false;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    value = strtol(pid, &amp;end_ptr, 10);</div><div class='add'>+    if (value &lt;= 0) {</div><div class='add'>+        ret = _gf_false;</div><div class='add'>+    }</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	ret = strtoll (number, &amp;endptr, 0);</div><div class='add'>+static int</div><div class='add'>+dht_is_linkfile_key(dict_t *this, char *key, data_t *value, void *data)</div><div class='add'>+{</div><div class='add'>+    gf_boolean_t *linkfile_key_found = NULL;</div><div class='add'>+</div><div class='add'>+    if (!data)</div><div class='add'>+        goto out;</div><div class='ctx'> </div><div class='del'>-	if (endptr) {</div><div class='del'>-		switch (*endptr) {</div><div class='del'>-		case 'G':</div><div class='del'>-		case 'g':</div><div class='del'>-			if ((* (endptr + 1) == 'B') ||(* (endptr + 1) == 'b'))</div><div class='del'>-				unit = 1024 * 1024 * 1024;</div><div class='del'>-			break;</div><div class='del'>-		case 'M':</div><div class='del'>-		case 'm':</div><div class='del'>-			if ((* (endptr + 1) == 'B') ||(* (endptr + 1) == 'b'))</div><div class='del'>-				unit = 1024 * 1024;</div><div class='del'>-			break;</div><div class='del'>-		case 'K':</div><div class='del'>-		case 'k':</div><div class='del'>-			if ((* (endptr + 1) == 'B') ||(* (endptr + 1) == 'b'))</div><div class='del'>-				unit = 1024;</div><div class='del'>-			break;</div><div class='del'>-		case '%':</div><div class='del'>-			unit = 1;</div><div class='del'>-			break;</div><div class='del'>-		default:</div><div class='del'>-			unit = 1;</div><div class='del'>-			break;</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='del'>-	return ret * unit;</div><div class='add'>+    linkfile_key_found = data;</div><div class='add'>+</div><div class='add'>+    *linkfile_key_found = _gf_true;</div><div class='add'>+out:</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-gf_string2boolean (const char *str, gf_boolean_t *b)</div><div class='add'>+gf_boolean_t</div><div class='add'>+dht_is_linkfile(struct iatt *buf, dict_t *dict)</div><div class='ctx'> {</div><div class='del'>-	if (str == NULL) {</div><div class='del'>-		return -1;</div><div class='del'>-	}</div><div class='add'>+    gf_boolean_t linkfile_key_found = _gf_false;</div><div class='ctx'> </div><div class='del'>-	if ((strcasecmp (str, "1") == 0) ||</div><div class='del'>-	    (strcasecmp (str, "on") == 0) ||</div><div class='del'>-	    (strcasecmp (str, "yes") == 0) ||</div><div class='del'>-	    (strcasecmp (str, "true") == 0) ||</div><div class='del'>-	    (strcasecmp (str, "enable") == 0)) {</div><div class='del'>-		*b = _gf_true;</div><div class='del'>-		return 0;</div><div class='del'>-	}</div><div class='add'>+    if (!IS_DHT_LINKFILE_MODE(buf))</div><div class='add'>+        return _gf_false;</div><div class='ctx'> </div><div class='del'>-	if ((strcasecmp (str, "0") == 0) ||</div><div class='del'>-	    (strcasecmp (str, "off") == 0) ||</div><div class='del'>-	    (strcasecmp (str, "no") == 0) ||</div><div class='del'>-	    (strcasecmp (str, "false") == 0) ||</div><div class='del'>-	    (strcasecmp (str, "disable") == 0)) {</div><div class='del'>-		*b = _gf_false;</div><div class='del'>-		return 0;</div><div class='del'>-	}</div><div class='add'>+    dict_foreach_fnmatch(dict, "*." DHT_LINKFILE_STR, dht_is_linkfile_key,</div><div class='add'>+                         &amp;linkfile_key_found);</div><div class='ctx'> </div><div class='del'>-	return -1;</div><div class='add'>+    return linkfile_key_found;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+int</div><div class='add'>+gf_check_log_format(const char *value)</div><div class='add'>+{</div><div class='add'>+    int log_format = -1;</div><div class='add'>+</div><div class='add'>+    if (!strcasecmp(value, GF_LOG_FORMAT_NO_MSG_ID))</div><div class='add'>+        log_format = gf_logformat_traditional;</div><div class='add'>+    else if (!strcasecmp(value, GF_LOG_FORMAT_WITH_MSG_ID))</div><div class='add'>+        log_format = gf_logformat_withmsgid;</div><div class='add'>+</div><div class='add'>+    if (log_format == -1)</div><div class='add'>+        gf_smsg(THIS-&gt;name, GF_LOG_ERROR, 0, LG_MSG_INVALID_LOG,</div><div class='add'>+                "possible_values=" GF_LOG_FORMAT_NO_MSG_ID</div><div class='add'>+                "|" GF_LOG_FORMAT_WITH_MSG_ID,</div><div class='add'>+                NULL);</div><div class='add'>+</div><div class='add'>+    return log_format;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-gf_lockfd (int fd)</div><div class='add'>+gf_check_logger(const char *value)</div><div class='ctx'> {</div><div class='del'>-	struct flock fl;</div><div class='add'>+    int logger = -1;</div><div class='add'>+</div><div class='add'>+    if (!strcasecmp(value, GF_LOGGER_GLUSTER_LOG))</div><div class='add'>+        logger = gf_logger_glusterlog;</div><div class='add'>+    else if (!strcasecmp(value, GF_LOGGER_SYSLOG))</div><div class='add'>+        logger = gf_logger_syslog;</div><div class='ctx'> </div><div class='del'>-	fl.l_type = F_WRLCK;</div><div class='del'>-	fl.l_whence = SEEK_SET;</div><div class='del'>-	fl.l_start = 0;</div><div class='del'>-	fl.l_len = 0;</div><div class='add'>+    if (logger == -1)</div><div class='add'>+        gf_smsg(THIS-&gt;name, GF_LOG_ERROR, 0, LG_MSG_INVALID_LOG,</div><div class='add'>+                "possible_values=" GF_LOGGER_GLUSTER_LOG "|" GF_LOGGER_SYSLOG,</div><div class='add'>+                NULL);</div><div class='ctx'> </div><div class='del'>-	return fcntl (fd, F_SETLK, &amp;fl);</div><div class='add'>+    return logger;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+/* gf_compare_sockaddr compares the given addresses @addr1 and @addr2 for</div><div class='add'>+ * equality, ie. if they both refer to the same address.</div><div class='add'>+ *</div><div class='add'>+ * This was inspired by sock_addr_cmp_addr() from</div><div class='add'>+ * https://www.opensource.apple.com/source/postfix/postfix-197/postfix/src/util/sock_addr.c</div><div class='add'>+ */</div><div class='add'>+gf_boolean_t</div><div class='add'>+gf_compare_sockaddr(const struct sockaddr *addr1, const struct sockaddr *addr2)</div><div class='add'>+{</div><div class='add'>+    GF_ASSERT(addr1 != NULL);</div><div class='add'>+    GF_ASSERT(addr2 != NULL);</div><div class='add'>+</div><div class='add'>+    /* Obviously, the addresses don't match if their families are different</div><div class='add'>+     */</div><div class='add'>+    if (addr1-&gt;sa_family != addr2-&gt;sa_family)</div><div class='add'>+        return _gf_false;</div><div class='add'>+</div><div class='add'>+    if (AF_INET == addr1-&gt;sa_family) {</div><div class='add'>+        if (((struct sockaddr_in *)addr1)-&gt;sin_addr.s_addr ==</div><div class='add'>+            ((struct sockaddr_in *)addr2)-&gt;sin_addr.s_addr)</div><div class='add'>+            return _gf_true;</div><div class='add'>+</div><div class='add'>+    } else if (AF_INET6 == addr1-&gt;sa_family) {</div><div class='add'>+        if (memcmp((char *)&amp;((struct sockaddr_in6 *)addr1)-&gt;sin6_addr,</div><div class='add'>+                   (char *)&amp;((struct sockaddr_in6 *)addr2)-&gt;sin6_addr,</div><div class='add'>+                   sizeof(struct in6_addr)) == 0)</div><div class='add'>+            return _gf_true;</div><div class='add'>+    }</div><div class='add'>+    return _gf_false;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+ * gf_set_timestamp:</div><div class='add'>+ *      It sets the mtime and atime of 'dest' file as of 'src'.</div><div class='add'>+ */</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-gf_unlockfd (int fd)</div><div class='add'>+gf_set_timestamp(const char *src, const char *dest)</div><div class='add'>+{</div><div class='add'>+    struct stat sb = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+#if defined(HAVE_UTIMENSAT)</div><div class='add'>+    struct timespec new_time[2] = {{</div><div class='add'>+                                       0,</div><div class='add'>+                                   },</div><div class='add'>+                                   {</div><div class='add'>+                                       0,</div><div class='add'>+                                   }};</div><div class='add'>+#else</div><div class='add'>+    struct timeval new_time[2] = {{</div><div class='add'>+                                      0,</div><div class='add'>+                                  },</div><div class='add'>+                                  {</div><div class='add'>+                                      0,</div><div class='add'>+                                  }};</div><div class='add'>+#endif</div><div class='add'>+    int ret = 0;</div><div class='add'>+    xlator_t *this = NULL;</div><div class='add'>+</div><div class='add'>+    this = THIS;</div><div class='add'>+    GF_ASSERT(this);</div><div class='add'>+    GF_ASSERT(src);</div><div class='add'>+    GF_ASSERT(dest);</div><div class='add'>+</div><div class='add'>+    ret = sys_stat(src, &amp;sb);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_ERROR, errno, LG_MSG_FILE_STAT_FAILED,</div><div class='add'>+                "stat=%s", src, NULL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    /* The granularity is nano seconds if `utimensat()` is available,</div><div class='add'>+     * and micro seconds otherwise.</div><div class='add'>+     */</div><div class='add'>+#if defined(HAVE_UTIMENSAT)</div><div class='add'>+    new_time[0].tv_sec = sb.st_atime;</div><div class='add'>+    new_time[0].tv_nsec = ST_ATIM_NSEC(&amp;sb);</div><div class='add'>+</div><div class='add'>+    new_time[1].tv_sec = sb.st_mtime;</div><div class='add'>+    new_time[1].tv_nsec = ST_MTIM_NSEC(&amp;sb);</div><div class='add'>+</div><div class='add'>+    /* dirfd = 0 is ignored because `dest` is an absolute path. */</div><div class='add'>+    ret = sys_utimensat(AT_FDCWD, dest, new_time, AT_SYMLINK_NOFOLLOW);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_ERROR, errno, LG_MSG_UTIMENSAT_FAILED,</div><div class='add'>+                "dest=%s", dest, NULL);</div><div class='add'>+    }</div><div class='add'>+#else</div><div class='add'>+    new_time[0].tv_sec = sb.st_atime;</div><div class='add'>+    new_time[0].tv_usec = ST_ATIM_NSEC(&amp;sb) / 1000;</div><div class='add'>+</div><div class='add'>+    new_time[1].tv_sec = sb.st_mtime;</div><div class='add'>+    new_time[1].tv_usec = ST_MTIM_NSEC(&amp;sb) / 1000;</div><div class='add'>+</div><div class='add'>+    ret = sys_utimes(dest, new_time);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_ERROR, errno, LG_MSG_UTIMES_FAILED,</div><div class='add'>+                "dest=%s", dest, NULL);</div><div class='add'>+    }</div><div class='add'>+#endif</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf_backtrace_end(char *buf, size_t frames)</div><div class='ctx'> {</div><div class='del'>-	struct flock fl;</div><div class='add'>+    size_t pos = 0;</div><div class='ctx'> </div><div class='del'>-	fl.l_type = F_UNLCK;</div><div class='del'>-	fl.l_whence = SEEK_SET;</div><div class='del'>-	fl.l_start = 0;</div><div class='del'>-	fl.l_len = 0;</div><div class='add'>+    if (!buf)</div><div class='add'>+        return;</div><div class='ctx'> </div><div class='del'>-	return fcntl (fd, F_SETLK, &amp;fl);</div><div class='add'>+    pos = strlen(buf);</div><div class='add'>+</div><div class='add'>+    frames = min(frames, GF_BACKTRACE_LEN - pos - 1);</div><div class='add'>+</div><div class='add'>+    if (0 == frames)</div><div class='add'>+        return;</div><div class='add'>+</div><div class='add'>+    memset(buf + pos, ')', frames);</div><div class='add'>+    buf[pos + frames] = '\0';</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-static void</div><div class='del'>-compute_checksum (char *buf, size_t size, uint32_t *checksum)</div><div class='add'>+/*Returns bytes written*/</div><div class='add'>+static int</div><div class='add'>+gf_backtrace_append(char *buf, size_t pos, char *framestr)</div><div class='ctx'> {</div><div class='del'>-        int  ret = -1;</div><div class='del'>-        char *checksum_buf = NULL;</div><div class='add'>+    if (pos &gt;= GF_BACKTRACE_LEN)</div><div class='add'>+        return -1;</div><div class='add'>+    return snprintf(buf + pos, GF_BACKTRACE_LEN - pos, "(--&gt; %s ", framestr);</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        checksum_buf = (char *)(checksum);</div><div class='add'>+static int</div><div class='add'>+gf_backtrace_fillframes(char *buf)</div><div class='add'>+{</div><div class='add'>+    void *array[GF_BACKTRACE_FRAME_COUNT];</div><div class='add'>+    size_t frames = 0;</div><div class='add'>+    FILE *fp = NULL;</div><div class='add'>+    char callingfn[GF_BACKTRACE_FRAME_COUNT - 2][1024] = {</div><div class='add'>+        {0},</div><div class='add'>+    };</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int fd = -1;</div><div class='add'>+    size_t idx = 0;</div><div class='add'>+    size_t pos = 0;</div><div class='add'>+    size_t inc = 0;</div><div class='add'>+    char tmpl[] = "/tmp/glfs-bt-XXXXXX";</div><div class='add'>+</div><div class='add'>+    frames = backtrace(array, GF_BACKTRACE_FRAME_COUNT);</div><div class='add'>+    if (!frames)</div><div class='add'>+        return -1;</div><div class='add'>+</div><div class='add'>+    /* coverity[secure_temp] mkstemp uses 0600 as the mode and is safe */</div><div class='add'>+    fd = mkstemp(tmpl);</div><div class='add'>+    if (fd == -1)</div><div class='add'>+        return -1;</div><div class='add'>+</div><div class='add'>+    /* Calling unlink so that when the file is closed or program</div><div class='add'>+     * terminates the temporary file is deleted.</div><div class='add'>+     */</div><div class='add'>+    ret = sys_unlink(tmpl);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        gf_smsg(THIS-&gt;name, GF_LOG_INFO, 0, LG_MSG_FILE_DELETE_FAILED,</div><div class='add'>+                "temporary_file=%s", tmpl, NULL);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /*The most recent two frames are the calling function and</div><div class='add'>+     * gf_backtrace_save, which we can infer.*/</div><div class='add'>+</div><div class='add'>+    backtrace_symbols_fd(&amp;array[2], frames - 2, fd);</div><div class='add'>+</div><div class='add'>+    fp = fdopen(fd, "r");</div><div class='add'>+    if (!fp) {</div><div class='add'>+        sys_close(fd);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = fseek(fp, 0L, SEEK_SET);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    pos = 0;</div><div class='add'>+    for (idx = 0; idx &lt; frames - 2; idx++) {</div><div class='add'>+        ret = fscanf(fp, "%1023s", callingfn[idx]);</div><div class='add'>+        if (ret == EOF)</div><div class='add'>+            break;</div><div class='add'>+        inc = gf_backtrace_append(buf, pos, callingfn[idx]);</div><div class='add'>+        if (inc == -1)</div><div class='add'>+            break;</div><div class='add'>+        pos += inc;</div><div class='add'>+    }</div><div class='add'>+    gf_backtrace_end(buf, idx);</div><div class='ctx'> </div><div class='del'>-        if (!(*checksum)) {</div><div class='del'>-                checksum_buf [0] = 0xba;</div><div class='del'>-                checksum_buf [1] = 0xbe;</div><div class='del'>-                checksum_buf [2] = 0xb0;</div><div class='del'>-                checksum_buf [3] = 0x0b;</div><div class='del'>-        }</div><div class='add'>+out:</div><div class='add'>+    if (fp)</div><div class='add'>+        fclose(fp);</div><div class='ctx'> </div><div class='del'>-        for (ret = 0; ret &lt; (size - 4); ret += 4) {</div><div class='del'>-                checksum_buf[0] ^= (buf[ret]);</div><div class='del'>-                checksum_buf[1] ^= (buf[ret + 1] &lt;&lt; 1) ;</div><div class='del'>-                checksum_buf[2] ^= (buf[ret + 2] &lt;&lt; 2);</div><div class='del'>-                checksum_buf[3] ^= (buf[ret + 3] &lt;&lt; 3);</div><div class='del'>-        }</div><div class='add'>+    return (idx &gt; 0) ? 0 : -1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* Optionally takes @buf to save backtrace.  If @buf is NULL, uses the</div><div class='add'>+ * pre-allocated ctx-&gt;btbuf to avoid allocating memory while printing</div><div class='add'>+ * backtrace.</div><div class='add'>+ * TODO: This API doesn't provide flexibility in terms of no. of frames</div><div class='add'>+ * of the backtrace is being saved in the buffer. Deferring fixing it</div><div class='add'>+ * when there is a real-use for that.*/</div><div class='add'>+</div><div class='add'>+char *</div><div class='add'>+gf_backtrace_save(char *buf)</div><div class='add'>+{</div><div class='add'>+    char *bt = NULL;</div><div class='add'>+</div><div class='add'>+    if (!buf) {</div><div class='add'>+        bt = THIS-&gt;ctx-&gt;btbuf;</div><div class='add'>+        GF_ASSERT(bt);</div><div class='add'>+</div><div class='add'>+    } else {</div><div class='add'>+        bt = buf;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if ((0 == gf_backtrace_fillframes(bt)))</div><div class='add'>+        return bt;</div><div class='ctx'> </div><div class='del'>-        for (ret = 0; ret &lt;= (size % 4); ret++) {</div><div class='del'>-                checksum_buf[ret] ^= (buf[(size - 4) + ret] &lt;&lt; ret);</div><div class='add'>+    gf_smsg(THIS-&gt;name, GF_LOG_WARNING, 0, LG_MSG_BACKTRACE_SAVE_FAILED, NULL);</div><div class='add'>+    return NULL;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+gf_loglevel_t</div><div class='add'>+fop_log_level(glusterfs_fop_t fop, int op_errno)</div><div class='add'>+{</div><div class='add'>+    /* if gfid doesn't exist ESTALE comes */</div><div class='add'>+    if (op_errno == ENOENT || op_errno == ESTALE)</div><div class='add'>+        return GF_LOG_DEBUG;</div><div class='add'>+</div><div class='add'>+    if ((fop == GF_FOP_ENTRYLK) || (fop == GF_FOP_FENTRYLK) ||</div><div class='add'>+        (fop == GF_FOP_FINODELK) || (fop == GF_FOP_INODELK) ||</div><div class='add'>+        (fop == GF_FOP_LK)) {</div><div class='add'>+        /*</div><div class='add'>+         * if non-blocking lock fails EAGAIN comes</div><div class='add'>+         * if locks xlator is not loaded ENOSYS comes</div><div class='add'>+         */</div><div class='add'>+        if (op_errno == EAGAIN || op_errno == ENOSYS)</div><div class='add'>+            return GF_LOG_DEBUG;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if ((fop == GF_FOP_GETXATTR) || (fop == GF_FOP_FGETXATTR)) {</div><div class='add'>+        if (op_errno == ENOTSUP || op_errno == ENODATA)</div><div class='add'>+            return GF_LOG_DEBUG;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if ((fop == GF_FOP_SETXATTR) || (fop == GF_FOP_FSETXATTR) ||</div><div class='add'>+        (fop == GF_FOP_REMOVEXATTR) || (fop == GF_FOP_FREMOVEXATTR)) {</div><div class='add'>+        if (op_errno == ENOTSUP)</div><div class='add'>+            return GF_LOG_DEBUG;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (fop == GF_FOP_MKNOD || fop == GF_FOP_MKDIR)</div><div class='add'>+        if (op_errno == EEXIST)</div><div class='add'>+            return GF_LOG_DEBUG;</div><div class='add'>+</div><div class='add'>+    if (fop == GF_FOP_SEEK) {</div><div class='add'>+#ifdef HAVE_SEEK_HOLE</div><div class='add'>+        if (op_errno == ENXIO) {</div><div class='add'>+            return GF_LOG_DEBUG;</div><div class='ctx'>         }</div><div class='add'>+#else</div><div class='add'>+        return GF_LOG_DEBUG;</div><div class='add'>+#endif</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        return;</div><div class='add'>+    return GF_LOG_ERROR;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-#define GF_CHECKSUM_BUF_SIZE 1024</div><div class='add'>+/* This function will build absolute path of file/directory from the</div><div class='add'>+ * current location and relative path given from the current location</div><div class='add'>+ * For example consider our current path is /a/b/c/ and relative path</div><div class='add'>+ * from current location is ./../x/y/z .After parsing through this</div><div class='add'>+ * function the absolute path becomes /a/b/x/y/z/.</div><div class='add'>+ *</div><div class='add'>+ * The function gives a pointer to absolute path if it is successful</div><div class='add'>+ * and also returns zero.</div><div class='add'>+ * Otherwise function gives NULL pointer with returning an err value.</div><div class='add'>+ *</div><div class='add'>+ * So the user need to free memory allocated for path.</div><div class='add'>+ *</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+gf_build_absolute_path(char *current_path, char *relative_path, char **path)</div><div class='add'>+{</div><div class='add'>+    char *absolute_path = NULL;</div><div class='add'>+    char *token = NULL;</div><div class='add'>+    char *component = NULL;</div><div class='add'>+    char *saveptr = NULL;</div><div class='add'>+    char *end = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    size_t relativepath_len = 0;</div><div class='add'>+    size_t currentpath_len = 0;</div><div class='add'>+    size_t max_absolutepath_len = 0;</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(current_path);</div><div class='add'>+    GF_ASSERT(relative_path);</div><div class='add'>+    GF_ASSERT(path);</div><div class='add'>+</div><div class='add'>+    if (!path || !current_path || !relative_path) {</div><div class='add'>+        ret = -EFAULT;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+    /* Check for current and relative path</div><div class='add'>+     * current path should be absolute one and  start from '/'</div><div class='add'>+     * relative path should not start from '/'</div><div class='add'>+     */</div><div class='add'>+    currentpath_len = strlen(current_path);</div><div class='add'>+    if (current_path[0] != '/' || (currentpath_len &gt; PATH_MAX)) {</div><div class='add'>+        gf_smsg(THIS-&gt;name, GF_LOG_ERROR, 0, LG_MSG_WRONG_VALUE,</div><div class='add'>+                "current-path=%s", current_path, NULL);</div><div class='add'>+        ret = -EINVAL;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    relativepath_len = strlen(relative_path);</div><div class='add'>+    if (relative_path[0] == '/' || (relativepath_len &gt; PATH_MAX)) {</div><div class='add'>+        gf_smsg(THIS-&gt;name, GF_LOG_ERROR, 0, LG_MSG_WRONG_VALUE,</div><div class='add'>+                "relative-path=%s", relative_path, NULL);</div><div class='add'>+        ret = -EINVAL;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* It is maximum possible value for absolute path */</div><div class='add'>+    max_absolutepath_len = currentpath_len + relativepath_len + 2;</div><div class='add'>+</div><div class='add'>+    absolute_path = GF_CALLOC(1, max_absolutepath_len, gf_common_mt_char);</div><div class='add'>+    if (!absolute_path) {</div><div class='add'>+        ret = -ENOMEM;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+    absolute_path[0] = '\0';</div><div class='add'>+</div><div class='add'>+    /* If current path is root i.e contains only "/", we do not</div><div class='add'>+     * need to copy it</div><div class='add'>+     */</div><div class='add'>+    if (strcmp(current_path, "/") != 0) {</div><div class='add'>+        strcpy(absolute_path, current_path);</div><div class='add'>+</div><div class='add'>+        /* We trim '/' at the end for easier string manipulation */</div><div class='add'>+        gf_path_strip_trailing_slashes(absolute_path);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Used to spilt relative path based on '/' */</div><div class='add'>+    component = gf_strdup(relative_path);</div><div class='add'>+    if (!component) {</div><div class='add'>+        ret = -ENOMEM;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* In the relative path, we want to consider ".." and "."</div><div class='add'>+     * if token is ".." , we just need to reduce one level hierarchy</div><div class='add'>+     * if token is "." , we just ignore it</div><div class='add'>+     * if token is NULL , end of relative path</div><div class='add'>+     * if absolute path becomes '\0' and still "..", then it is a bad</div><div class='add'>+     * relative path,  it points to out of boundary area and stop</div><div class='add'>+     * building the absolute path</div><div class='add'>+     * All other cases we just concatenate token to the absolute path</div><div class='add'>+     */</div><div class='add'>+    for (token = strtok_r(component, "/", &amp;saveptr),</div><div class='add'>+        end = strchr(absolute_path, '\0');</div><div class='add'>+         token; token = strtok_r(NULL, "/", &amp;saveptr)) {</div><div class='add'>+        if (strcmp(token, ".") == 0)</div><div class='add'>+            continue;</div><div class='add'>+</div><div class='add'>+        else if (strcmp(token, "..") == 0) {</div><div class='add'>+            if (absolute_path[0] == '\0') {</div><div class='add'>+                ret = -EACCES;</div><div class='add'>+                goto err;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            end = strrchr(absolute_path, '/');</div><div class='add'>+            *end = '\0';</div><div class='add'>+        } else {</div><div class='add'>+            ret = snprintf(end, max_absolutepath_len - strlen(absolute_path),</div><div class='add'>+                           "/%s", token);</div><div class='add'>+            end = strchr(absolute_path, '\0');</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='ctx'> </div><div class='add'>+    if (strlen(absolute_path) &gt; PATH_MAX) {</div><div class='add'>+        ret = -EINVAL;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+    *path = gf_strdup(absolute_path);</div><div class='add'>+</div><div class='add'>+err:</div><div class='add'>+    if (component)</div><div class='add'>+        GF_FREE(component);</div><div class='add'>+    if (absolute_path)</div><div class='add'>+        GF_FREE(absolute_path);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* This is an utility function which will recursively delete</div><div class='add'>+ * a folder and its contents.</div><div class='add'>+ *</div><div class='add'>+ * @param delete_path folder to be deleted.</div><div class='add'>+ *</div><div class='add'>+ * @return 0 on success and -1 on failure.</div><div class='add'>+ */</div><div class='ctx'> int</div><div class='del'>-get_checksum_for_file (int fd, uint32_t *checksum)</div><div class='add'>+recursive_rmdir(const char *delete_path)</div><div class='ctx'> {</div><div class='del'>-        int ret = -1;</div><div class='del'>-        char buf[GF_CHECKSUM_BUF_SIZE] = {0,};</div><div class='add'>+    int ret = -1;</div><div class='add'>+    char path[PATH_MAX] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    struct stat st = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    DIR *dir = NULL;</div><div class='add'>+    struct dirent *entry = NULL;</div><div class='add'>+    struct dirent scratch[2] = {</div><div class='add'>+        {</div><div class='add'>+            0,</div><div class='add'>+        },</div><div class='add'>+    };</div><div class='add'>+    xlator_t *this = NULL;</div><div class='add'>+</div><div class='add'>+    this = THIS;</div><div class='add'>+    GF_ASSERT(this);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, delete_path, out);</div><div class='add'>+</div><div class='add'>+    dir = sys_opendir(delete_path);</div><div class='add'>+    if (!dir) {</div><div class='add'>+        gf_msg_debug(this-&gt;name, 0,</div><div class='add'>+                     "Failed to open directory %s. "</div><div class='add'>+                     "Reason : %s",</div><div class='add'>+                     delete_path, strerror(errno));</div><div class='add'>+        ret = 0;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    while ((entry = sys_readdir(dir, scratch))) {</div><div class='add'>+        if (gf_irrelevant_entry(entry))</div><div class='add'>+            continue;</div><div class='add'>+        snprintf(path, PATH_MAX, "%s/%s", delete_path, entry-&gt;d_name);</div><div class='add'>+        ret = sys_lstat(path, &amp;st);</div><div class='add'>+        if (ret == -1) {</div><div class='add'>+            gf_msg_debug(this-&gt;name, 0,</div><div class='add'>+                         "Failed to stat entry %s :"</div><div class='add'>+                         " %s",</div><div class='add'>+                         path, strerror(errno));</div><div class='add'>+            (void)sys_closedir(dir);</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-        /* goto first place */</div><div class='del'>-        lseek (fd, 0L, SEEK_SET);</div><div class='del'>-        do {</div><div class='del'>-                ret = read (fd, &amp;buf, GF_CHECKSUM_BUF_SIZE);</div><div class='del'>-                if (ret &gt; 0)</div><div class='del'>-                        compute_checksum (buf, GF_CHECKSUM_BUF_SIZE,</div><div class='del'>-                                          checksum);</div><div class='del'>-        } while (ret &gt; 0);</div><div class='add'>+        if (S_ISDIR(st.st_mode))</div><div class='add'>+            ret = recursive_rmdir(path);</div><div class='add'>+        else</div><div class='add'>+            ret = sys_unlink(path);</div><div class='ctx'> </div><div class='del'>-        /* set it back */</div><div class='del'>-        lseek (fd, 0L, SEEK_SET);</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_msg_debug(this-&gt;name, 0,</div><div class='add'>+                         " Failed to remove %s. "</div><div class='add'>+                         "Reason : %s",</div><div class='add'>+                         path, strerror(errno));</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-        return ret;</div><div class='add'>+        gf_msg_debug(this-&gt;name, 0, "%s %s",</div><div class='add'>+                     ret ? "Failed to remove" : "Removed", entry-&gt;d_name);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = sys_closedir(dir);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_msg_debug(this-&gt;name, 0,</div><div class='add'>+                     "Failed to close dir %s. Reason :"</div><div class='add'>+                     " %s",</div><div class='add'>+                     delete_path, strerror(errno));</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = sys_rmdir(delete_path);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_msg_debug(this-&gt;name, 0, "Failed to rmdir: %s,err: %s", delete_path,</div><div class='add'>+                     strerror(errno));</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='add'>+/*</div><div class='add'>+ * Input: Array of strings 'array' terminating in NULL</div><div class='add'>+ *        string 'elem' to be searched in the array</div><div class='add'>+ *</div><div class='add'>+ * Output: Index of the element in the array if found, '-1' otherwise</div><div class='add'>+ */</div><div class='add'>+int</div><div class='add'>+gf_get_index_by_elem(char **array, char *elem)</div><div class='add'>+{</div><div class='add'>+    int i = 0;</div><div class='add'>+</div><div class='add'>+    for (i = 0; array[i]; i++) {</div><div class='add'>+        if (strcmp(elem, array[i]) == 0)</div><div class='add'>+            return i;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='add'>+    return -1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+get_pathinfo_host(char *pathinfo, char *hostname, size_t size)</div><div class='add'>+{</div><div class='add'>+    char *start = NULL;</div><div class='add'>+    char *end = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int i = 0;</div><div class='add'>+</div><div class='add'>+    if (!pathinfo)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    start = strchr(pathinfo, ':');</div><div class='add'>+    if (!start)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    end = strrchr(pathinfo, ':');</div><div class='add'>+    if (start == end)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    memset(hostname, 0, size);</div><div class='add'>+    i = 0;</div><div class='add'>+    while (++start != end)</div><div class='add'>+        hostname[i++] = *start;</div><div class='add'>+    ret = 0;</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-/* One should pass the command here with command with full path,</div><div class='del'>-   otherwise, execv will fail */</div><div class='add'>+/*Note: 'pathinfo' should be gathered only from one brick*/</div><div class='ctx'> int</div><div class='del'>-gf_system (const char *command)</div><div class='add'>+glusterfs_is_local_pathinfo(char *pathinfo, gf_boolean_t *is_local)</div><div class='ctx'> {</div><div class='del'>-        int    ret    = -1;</div><div class='del'>-        pid_t  pid    = 0;</div><div class='del'>-        int    status = 0;</div><div class='del'>-        int    idx    = 0;</div><div class='del'>-        char  *dupcmd = NULL;</div><div class='del'>-        char  *arg    = NULL;</div><div class='del'>-        char  *tmp    = NULL;</div><div class='del'>-        char  *argv[100] = { NULL, };</div><div class='add'>+    int ret = 0;</div><div class='add'>+    char pathinfohost[1024] = {0};</div><div class='add'>+    char localhost[1024] = {0};</div><div class='ctx'> </div><div class='del'>-        dupcmd = gf_strdup (command);</div><div class='del'>-        if (!dupcmd)</div><div class='del'>-                goto out;</div><div class='add'>+    *is_local = _gf_false;</div><div class='add'>+    ret = get_pathinfo_host(pathinfo, pathinfohost, sizeof(pathinfohost));</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='ctx'> </div><div class='del'>-        pid = fork ();</div><div class='del'>-        if (pid &lt; 0) {</div><div class='del'>-                /* failure */</div><div class='add'>+    ret = gethostname(localhost, sizeof(localhost));</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    if (!strcmp(localhost, pathinfohost))</div><div class='add'>+        *is_local = _gf_true;</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+ssize_t</div><div class='add'>+gf_nread(int fd, void *buf, size_t count)</div><div class='add'>+{</div><div class='add'>+    ssize_t ret = 0;</div><div class='add'>+    ssize_t read_bytes = 0;</div><div class='add'>+</div><div class='add'>+    for (read_bytes = 0; read_bytes &lt; count; read_bytes += ret) {</div><div class='add'>+        ret = sys_read(fd, buf + read_bytes, count - read_bytes);</div><div class='add'>+        if (ret == 0) {</div><div class='add'>+            break;</div><div class='add'>+        } else if (ret &lt; 0) {</div><div class='add'>+            if (errno == EINTR)</div><div class='add'>+                ret = 0;</div><div class='add'>+            else</div><div class='ctx'>                 goto out;</div><div class='ctx'>         }</div><div class='del'>-        if (pid == 0) {</div><div class='del'>-                /* Child process */</div><div class='del'>-                /* Step 0: Prepare the argv */</div><div class='del'>-                arg = strtok_r (dupcmd, " ", &amp;tmp);</div><div class='del'>-                while (arg) {</div><div class='del'>-                        argv[idx] = arg;</div><div class='del'>-                        arg = strtok_r (NULL, " ", &amp;tmp);</div><div class='del'>-                        idx++;</div><div class='del'>-                }</div><div class='del'>-                /* Step 1: Close all 'fd' */</div><div class='del'>-                for (idx = 3; idx &lt; 65536; idx++) {</div><div class='del'>-                        close (idx);</div><div class='del'>-                }</div><div class='del'>-                /* Step 2: execv (); */</div><div class='del'>-                ret = execvp (argv[0], argv);</div><div class='del'>-</div><div class='del'>-                /* Code will not come here at all */</div><div class='del'>-                gf_log ("", GF_LOG_ERROR, "execv of (%s) failed", command);</div><div class='del'>-        }</div><div class='del'>-        if (pid &gt; 0) {</div><div class='del'>-                /* Current, ie, parent process */</div><div class='del'>-                pid = waitpid (pid, &amp;status, 0);</div><div class='del'>-                ret = status;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = read_bytes;</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+ssize_t</div><div class='add'>+gf_nwrite(int fd, const void *buf, size_t count)</div><div class='add'>+{</div><div class='add'>+    ssize_t ret = 0;</div><div class='add'>+    ssize_t written = 0;</div><div class='add'>+</div><div class='add'>+    for (written = 0; written != count; written += ret) {</div><div class='add'>+        ret = sys_write(fd, buf + written, count - written);</div><div class='add'>+        if (ret &lt; 0) {</div><div class='add'>+            if (errno == EINTR)</div><div class='add'>+                ret = 0;</div><div class='add'>+            else</div><div class='add'>+                goto out;</div><div class='ctx'>         }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = written;</div><div class='ctx'> out:</div><div class='del'>-        if (dupcmd)</div><div class='del'>-                GF_FREE (dupcmd);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        return ret;</div><div class='add'>+void</div><div class='add'>+gf_free_mig_locks(lock_migration_info_t *locks)</div><div class='add'>+{</div><div class='add'>+    lock_migration_info_t *current = NULL;</div><div class='add'>+    lock_migration_info_t *temp = NULL;</div><div class='add'>+</div><div class='add'>+    if (!locks)</div><div class='add'>+        return;</div><div class='add'>+</div><div class='add'>+    if (list_empty(&amp;locks-&gt;list))</div><div class='add'>+        return;</div><div class='add'>+</div><div class='add'>+    list_for_each_entry_safe(current, temp, &amp;locks-&gt;list, list)</div><div class='add'>+    {</div><div class='add'>+        list_del_init(&amp;current-&gt;list);</div><div class='add'>+        GF_FREE(current-&gt;client_uid);</div><div class='add'>+        GF_FREE(current);</div><div class='add'>+    }</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-get_checksum_for_path (char *path, uint32_t *checksum)</div><div class='add'>+void</div><div class='add'>+_mask_cancellation(void)</div><div class='ctx'> {</div><div class='del'>-        int     ret = -1;</div><div class='del'>-        int     fd = -1;</div><div class='add'>+    (void)pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, NULL);</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        GF_ASSERT (path);</div><div class='del'>-        GF_ASSERT (checksum);</div><div class='add'>+void</div><div class='add'>+_unmask_cancellation(void)</div><div class='add'>+{</div><div class='add'>+    (void)pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL);</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        fd = open (path, O_RDWR);</div><div class='add'>+/* This is a wrapper function to add a pointer to a list,</div><div class='add'>+ * which doesn't contain list member</div><div class='add'>+ */</div><div class='add'>+struct list_node *</div><div class='add'>+_list_node_add(void *ptr, struct list_head *list,</div><div class='add'>+               int (*compare)(struct list_head *, struct list_head *))</div><div class='add'>+{</div><div class='add'>+    struct list_node *node = NULL;</div><div class='ctx'> </div><div class='del'>-        if (fd == -1) {</div><div class='del'>-                gf_log ("", GF_LOG_ERROR, "Unable to open %s, errno: %d",</div><div class='del'>-                        path, errno);</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='add'>+    if (ptr == NULL || list == NULL)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    node = GF_CALLOC(1, sizeof(struct list_node), gf_common_list_node);</div><div class='ctx'> </div><div class='del'>-        ret = get_checksum_for_file (fd, checksum);</div><div class='add'>+    if (node == NULL)</div><div class='add'>+        goto out;</div><div class='ctx'> </div><div class='add'>+    node-&gt;ptr = ptr;</div><div class='add'>+    if (compare)</div><div class='add'>+        list_add_order(&amp;node-&gt;list, list, compare);</div><div class='add'>+    else</div><div class='add'>+        list_add_tail(&amp;node-&gt;list, list);</div><div class='ctx'> out:</div><div class='del'>-        if (fd != -1)</div><div class='del'>-                close (fd);</div><div class='add'>+    return node;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+struct list_node *</div><div class='add'>+list_node_add(void *ptr, struct list_head *list)</div><div class='add'>+{</div><div class='add'>+    return _list_node_add(ptr, list, NULL);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+struct list_node *</div><div class='add'>+list_node_add_order(void *ptr, struct list_head *list,</div><div class='add'>+                    int (*compare)(struct list_head *, struct list_head *))</div><div class='add'>+{</div><div class='add'>+    return _list_node_add(ptr, list, compare);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+list_node_del(struct list_node *node)</div><div class='add'>+{</div><div class='add'>+    if (node == NULL)</div><div class='add'>+        return;</div><div class='ctx'> </div><div class='add'>+    list_del_init(&amp;node-&gt;list);</div><div class='add'>+    GF_FREE(node);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+const char *</div><div class='add'>+fop_enum_to_pri_string(glusterfs_fop_t fop)</div><div class='add'>+{</div><div class='add'>+    switch (fop) {</div><div class='add'>+        case GF_FOP_OPEN:</div><div class='add'>+        case GF_FOP_STAT:</div><div class='add'>+        case GF_FOP_FSTAT:</div><div class='add'>+        case GF_FOP_LOOKUP:</div><div class='add'>+        case GF_FOP_ACCESS:</div><div class='add'>+        case GF_FOP_READLINK:</div><div class='add'>+        case GF_FOP_OPENDIR:</div><div class='add'>+        case GF_FOP_STATFS:</div><div class='add'>+        case GF_FOP_READDIR:</div><div class='add'>+        case GF_FOP_READDIRP:</div><div class='add'>+        case GF_FOP_GETACTIVELK:</div><div class='add'>+        case GF_FOP_SETACTIVELK:</div><div class='add'>+        case GF_FOP_ICREATE:</div><div class='add'>+        case GF_FOP_NAMELINK:</div><div class='add'>+            return "HIGH";</div><div class='add'>+</div><div class='add'>+        case GF_FOP_CREATE:</div><div class='add'>+        case GF_FOP_FLUSH:</div><div class='add'>+        case GF_FOP_LK:</div><div class='add'>+        case GF_FOP_INODELK:</div><div class='add'>+        case GF_FOP_FINODELK:</div><div class='add'>+        case GF_FOP_ENTRYLK:</div><div class='add'>+        case GF_FOP_FENTRYLK:</div><div class='add'>+        case GF_FOP_UNLINK:</div><div class='add'>+        case GF_FOP_SETATTR:</div><div class='add'>+        case GF_FOP_FSETATTR:</div><div class='add'>+        case GF_FOP_MKNOD:</div><div class='add'>+        case GF_FOP_MKDIR:</div><div class='add'>+        case GF_FOP_RMDIR:</div><div class='add'>+        case GF_FOP_SYMLINK:</div><div class='add'>+        case GF_FOP_RENAME:</div><div class='add'>+        case GF_FOP_LINK:</div><div class='add'>+        case GF_FOP_SETXATTR:</div><div class='add'>+        case GF_FOP_GETXATTR:</div><div class='add'>+        case GF_FOP_FGETXATTR:</div><div class='add'>+        case GF_FOP_FSETXATTR:</div><div class='add'>+        case GF_FOP_REMOVEXATTR:</div><div class='add'>+        case GF_FOP_FREMOVEXATTR:</div><div class='add'>+        case GF_FOP_IPC:</div><div class='add'>+        case GF_FOP_LEASE:</div><div class='add'>+            return "NORMAL";</div><div class='add'>+</div><div class='add'>+        case GF_FOP_READ:</div><div class='add'>+        case GF_FOP_WRITE:</div><div class='add'>+        case GF_FOP_FSYNC:</div><div class='add'>+        case GF_FOP_TRUNCATE:</div><div class='add'>+        case GF_FOP_FTRUNCATE:</div><div class='add'>+        case GF_FOP_FSYNCDIR:</div><div class='add'>+        case GF_FOP_XATTROP:</div><div class='add'>+        case GF_FOP_FXATTROP:</div><div class='add'>+        case GF_FOP_RCHECKSUM:</div><div class='add'>+        case GF_FOP_ZEROFILL:</div><div class='add'>+        case GF_FOP_FALLOCATE:</div><div class='add'>+        case GF_FOP_SEEK:</div><div class='add'>+            return "LOW";</div><div class='add'>+</div><div class='add'>+        case GF_FOP_NULL:</div><div class='add'>+        case GF_FOP_FORGET:</div><div class='add'>+        case GF_FOP_RELEASE:</div><div class='add'>+        case GF_FOP_RELEASEDIR:</div><div class='add'>+        case GF_FOP_GETSPEC:</div><div class='add'>+        case GF_FOP_MAXVALUE:</div><div class='add'>+        case GF_FOP_DISCARD:</div><div class='add'>+            return "LEAST";</div><div class='add'>+        default:</div><div class='add'>+            return "UNKNOWN";</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+const char *</div><div class='add'>+gf_inode_type_to_str(ia_type_t type)</div><div class='add'>+{</div><div class='add'>+    static const char *const str_ia_type[] = {</div><div class='add'>+        "UNKNOWN",      "REGULAR FILE",     "DIRECTORY", "LINK",</div><div class='add'>+        "BLOCK DEVICE", "CHARACTER DEVICE", "PIPE",      "SOCKET"};</div><div class='add'>+    return str_ia_type[type];</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+gf_boolean_t</div><div class='add'>+gf_is_zero_filled_stat(struct iatt *buf)</div><div class='add'>+{</div><div class='add'>+    if (!buf)</div><div class='add'>+        return 1;</div><div class='add'>+</div><div class='add'>+    /* Do not use st_dev because it is transformed to store the xlator id</div><div class='add'>+     * in place of the device number. Do not use st_ino because by this time</div><div class='add'>+     * we've already mapped the root ino to 1 so it is not guaranteed to be</div><div class='add'>+     * 0.</div><div class='add'>+     */</div><div class='add'>+    if ((buf-&gt;ia_nlink == 0) &amp;&amp; (buf-&gt;ia_ctime == 0))</div><div class='add'>+        return 1;</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+gf_zero_fill_stat(struct iatt *buf)</div><div class='add'>+{</div><div class='add'>+    buf-&gt;ia_nlink = 0;</div><div class='add'>+    buf-&gt;ia_ctime = 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+gf_boolean_t</div><div class='add'>+gf_is_valid_xattr_namespace(char *key)</div><div class='add'>+{</div><div class='add'>+    static char *xattr_namespaces[] = {"trusted.", "system.", "user.",</div><div class='add'>+                                       "security.", NULL};</div><div class='add'>+    int i = 0;</div><div class='add'>+</div><div class='add'>+    for (i = 0; xattr_namespaces[i]; i++) {</div><div class='add'>+        if (strncmp(key, xattr_namespaces[i], strlen(xattr_namespaces[i])) == 0)</div><div class='add'>+            return _gf_true;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return _gf_false;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+ino_t</div><div class='add'>+gfid_to_ino(uuid_t gfid)</div><div class='add'>+{</div><div class='add'>+    ino_t ino = 0;</div><div class='add'>+    int32_t i;</div><div class='add'>+</div><div class='add'>+    for (i = 8; i &lt; 16; i++) {</div><div class='add'>+        ino &lt;&lt;= 8;</div><div class='add'>+        ino += (uint8_t)gfid[i];</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return ino;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+gf_bits_count(uint64_t n)</div><div class='add'>+{</div><div class='add'>+    int val = 0;</div><div class='add'>+#if defined(__GNUC__) || defined(__clang__)</div><div class='add'>+    val = __builtin_popcountll(n);</div><div class='add'>+#else</div><div class='add'>+    n -= (n &gt;&gt; 1) &amp; 0x5555555555555555ULL;</div><div class='add'>+    n = ((n &gt;&gt; 2) &amp; 0x3333333333333333ULL) + (n &amp; 0x3333333333333333ULL);</div><div class='add'>+    n = (n + (n &gt;&gt; 4)) &amp; 0x0F0F0F0F0F0F0F0FULL;</div><div class='add'>+    n += n &gt;&gt; 8;</div><div class='add'>+    n += n &gt;&gt; 16;</div><div class='add'>+    n += n &gt;&gt; 32;</div><div class='add'>+    val = n &amp; 0xFF;</div><div class='add'>+#endif</div><div class='add'>+    return val;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+gf_bits_index(uint64_t n)</div><div class='add'>+{</div><div class='add'>+#if defined(__GNUC__) || defined(__clang__)</div><div class='add'>+    return __builtin_ffsll(n) - 1;</div><div class='add'>+#else</div><div class='add'>+    return ffsll(n) - 1;</div><div class='add'>+#endif</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+const char *</div><div class='add'>+gf_fop_string(glusterfs_fop_t fop)</div><div class='add'>+{</div><div class='add'>+    if ((fop &gt; GF_FOP_NULL) &amp;&amp; (fop &lt; GF_FOP_MAXVALUE))</div><div class='add'>+        return gf_fop_list[fop];</div><div class='add'>+    return "INVALID";</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+gf_fop_int(char *fop)</div><div class='add'>+{</div><div class='add'>+    int i = 0;</div><div class='add'>+</div><div class='add'>+    for (i = GF_FOP_NULL + 1; i &lt; GF_FOP_MAXVALUE; i++) {</div><div class='add'>+        if (strcasecmp(fop, gf_fop_list[i]) == 0)</div><div class='add'>+            return i;</div><div class='add'>+    }</div><div class='add'>+    return -1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+close_fds_except(int *fdv, size_t count)</div><div class='add'>+{</div><div class='add'>+    int i = 0;</div><div class='add'>+    size_t j = 0;</div><div class='add'>+    gf_boolean_t should_close = _gf_true;</div><div class='add'>+#ifdef GF_LINUX_HOST_OS</div><div class='add'>+    DIR *d = NULL;</div><div class='add'>+    struct dirent *de = NULL;</div><div class='add'>+    struct dirent scratch[2] = {</div><div class='add'>+        {</div><div class='add'>+            0,</div><div class='add'>+        },</div><div class='add'>+    };</div><div class='add'>+    char *e = NULL;</div><div class='add'>+</div><div class='add'>+    d = sys_opendir("/proc/self/fd");</div><div class='add'>+    if (!d)</div><div class='add'>+        return -1;</div><div class='add'>+</div><div class='add'>+    for (;;) {</div><div class='add'>+        should_close = _gf_true;</div><div class='add'>+</div><div class='add'>+        errno = 0;</div><div class='add'>+        de = sys_readdir(d, scratch);</div><div class='add'>+        if (!de || errno != 0)</div><div class='add'>+            break;</div><div class='add'>+        i = strtoul(de-&gt;d_name, &amp;e, 10);</div><div class='add'>+        if (*e != '\0' || i == dirfd(d))</div><div class='add'>+            continue;</div><div class='add'>+</div><div class='add'>+        for (j = 0; j &lt; count; j++) {</div><div class='add'>+            if (i == fdv[j]) {</div><div class='add'>+                should_close = _gf_false;</div><div class='add'>+                break;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+        if (should_close)</div><div class='add'>+            sys_close(i);</div><div class='add'>+    }</div><div class='add'>+    sys_closedir(d);</div><div class='add'>+#else  /* !GF_LINUX_HOST_OS */</div><div class='add'>+    struct rlimit rl;</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    ret = getrlimit(RLIMIT_NOFILE, &amp;rl);</div><div class='add'>+    if (ret)</div><div class='ctx'>         return ret;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; rl.rlim_cur; i++) {</div><div class='add'>+        should_close = _gf_true;</div><div class='add'>+        for (j = 0; j &lt; count; j++) {</div><div class='add'>+            if (i == fdv[j]) {</div><div class='add'>+                should_close = _gf_false;</div><div class='add'>+                break;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+        if (should_close)</div><div class='add'>+            sys_close(i);</div><div class='add'>+    }</div><div class='add'>+#endif /* !GF_LINUX_HOST_OS */</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/**</div><div class='add'>+ * gf_getgrouplist - get list of groups to which a user belongs</div><div class='add'>+ *</div><div class='add'>+ * A convenience wrapper for getgrouplist(3).</div><div class='add'>+ *</div><div class='add'>+ * @param user - same as in getgrouplist(3)</div><div class='add'>+ * @param group - same as in getgrouplist(3)</div><div class='add'>+ * @param groups - pointer to a gid_t pointer</div><div class='add'>+ *</div><div class='add'>+ * gf_getgrouplist allocates a gid_t buffer which is big enough to</div><div class='add'>+ * hold the list of auxiliary group ids for user, up to the GF_MAX_AUX_GROUPS</div><div class='add'>+ * threshold. Upon successful invocation groups will be pointed to that buffer.</div><div class='add'>+ *</div><div class='add'>+ * @return success: the number of auxiliary group ids retrieved</div><div class='add'>+ *         failure: -1</div><div class='add'>+ */</div><div class='add'>+int</div><div class='add'>+gf_getgrouplist(const char *user, gid_t group, gid_t **groups)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int ngroups = SMALL_GROUP_COUNT;</div><div class='add'>+</div><div class='add'>+    *groups = GF_CALLOC(sizeof(gid_t), ngroups, gf_common_mt_groups_t);</div><div class='add'>+    if (!*groups)</div><div class='add'>+        return -1;</div><div class='add'>+</div><div class='add'>+    /*</div><div class='add'>+     * We are running getgrouplist() in a loop until we succeed (or hit</div><div class='add'>+     * certain exit conditions, see the comments below). This is because</div><div class='add'>+     * the indicated number of auxiliary groups that we obtain in case of</div><div class='add'>+     * the failure of the first invocation is not guaranteed to keep its</div><div class='add'>+     * validity upon the next invocation with a gid buffer of that size.</div><div class='add'>+     */</div><div class='add'>+    for (;;) {</div><div class='add'>+        int ngroups_old = ngroups;</div><div class='add'>+        ret = getgrouplist(user, group, *groups, &amp;ngroups);</div><div class='add'>+        if (ret != -1)</div><div class='add'>+            break;</div><div class='add'>+</div><div class='add'>+        if (ngroups &gt;= GF_MAX_AUX_GROUPS) {</div><div class='add'>+            /*</div><div class='add'>+             * This should not happen as GF_MAX_AUX_GROUPS is set</div><div class='add'>+             * to the max value of number of supported auxiliary</div><div class='add'>+             * groups across all platforms supported by GlusterFS.</div><div class='add'>+             * However, if it still happened some way, we wouldn't</div><div class='add'>+             * care about the incompleteness of the result, we'd</div><div class='add'>+             * just go on with what we got.</div><div class='add'>+             */</div><div class='add'>+            return GF_MAX_AUX_GROUPS;</div><div class='add'>+        } else if (ngroups &lt;= ngroups_old) {</div><div class='add'>+            /*</div><div class='add'>+             * There is an edge case that getgrouplist() fails but</div><div class='add'>+             * ngroups remains the same. This is actually not</div><div class='add'>+             * specified in getgrouplist(3), but implementations</div><div class='add'>+             * can do this upon internal failure[1]. To avoid</div><div class='add'>+             * falling into an infinite loop when this happens, we</div><div class='add'>+             * break the loop if the getgrouplist call failed</div><div class='add'>+             * without an increase in the indicated group number.</div><div class='add'>+             *</div><div class='add'>+             * [1]</div><div class='add'>+             * https://sourceware.org/git/?p=glibc.git;a=blob;f=grp/initgroups.c;hb=refs/heads/release/2.25/master#l168</div><div class='add'>+             */</div><div class='add'>+            GF_FREE(*groups);</div><div class='add'>+            return -1;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        *groups = GF_REALLOC(*groups, ngroups * sizeof(gid_t));</div><div class='add'>+        if (!*groups)</div><div class='add'>+            return -1;</div><div class='add'>+    }</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+glusterfs_compute_sha256(const unsigned char *content, size_t size,</div><div class='add'>+                         char *sha256_hash)</div><div class='add'>+{</div><div class='add'>+    SHA256_CTX sha256;</div><div class='add'>+</div><div class='add'>+    SHA256_Init(&amp;sha256);</div><div class='add'>+    SHA256_Update(&amp;sha256, (const unsigned char *)(content), size);</div><div class='add'>+    SHA256_Final((unsigned char *)sha256_hash, &amp;sha256);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* * Safe wrapper function for strncpy.</div><div class='add'>+ * This wrapper makes sure that when there is no null byte among the first n in</div><div class='add'>+ * source srting for strncpy function call, the string placed in dest will be</div><div class='add'>+ * null-terminated.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+char *</div><div class='add'>+gf_strncpy(char *dest, const char *src, const size_t dest_size)</div><div class='add'>+{</div><div class='add'>+    strncpy(dest, src, dest_size - 1);</div><div class='add'>+    dest[dest_size - 1] = '\0';</div><div class='add'>+    return dest;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+gf_replace_old_iatt_in_dict(dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    int ret;</div><div class='add'>+    struct old_iatt *o_iatt; /* old iatt structure */</div><div class='add'>+    struct iatt *c_iatt;     /* current iatt */</div><div class='add'>+</div><div class='add'>+    if (!xdata) {</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_get_bin(xdata, DHT_IATT_IN_XDATA_KEY, (void **)&amp;c_iatt);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    o_iatt = GF_CALLOC(1, sizeof(struct old_iatt), gf_common_mt_char);</div><div class='add'>+    if (!o_iatt) {</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    oldiatt_from_iatt(o_iatt, c_iatt);</div><div class='add'>+</div><div class='add'>+    ret = dict_set_bin(xdata, DHT_IATT_IN_XDATA_KEY, o_iatt,</div><div class='add'>+                       sizeof(struct old_iatt));</div><div class='add'>+    if (ret) {</div><div class='add'>+        GF_FREE(o_iatt);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+gf_replace_new_iatt_in_dict(dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    int ret;</div><div class='add'>+    struct old_iatt *o_iatt; /* old iatt structure */</div><div class='add'>+    struct iatt *c_iatt;     /* new iatt */</div><div class='add'>+</div><div class='add'>+    if (!xdata) {</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_get_bin(xdata, DHT_IATT_IN_XDATA_KEY, (void **)&amp;o_iatt);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    c_iatt = GF_CALLOC(1, sizeof(struct iatt), gf_common_mt_char);</div><div class='add'>+    if (!c_iatt) {</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    iatt_from_oldiatt(c_iatt, o_iatt);</div><div class='add'>+</div><div class='add'>+    ret = dict_set_bin(xdata, DHT_IATT_IN_XDATA_KEY, c_iatt,</div><div class='add'>+                       sizeof(struct iatt));</div><div class='add'>+    if (ret) {</div><div class='add'>+        GF_FREE(c_iatt);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+xlator_cmdline_option_t *</div><div class='add'>+find_xlator_option_in_cmd_args_t(const char *option_name, cmd_args_t *args)</div><div class='add'>+{</div><div class='add'>+    xlator_cmdline_option_t *pos = NULL;</div><div class='add'>+    xlator_cmdline_option_t *tmp = NULL;</div><div class='add'>+</div><div class='add'>+    list_for_each_entry_safe(pos, tmp, &amp;args-&gt;xlator_options, cmd_args)</div><div class='add'>+    {</div><div class='add'>+        if (strcmp(pos-&gt;key, option_name) == 0)</div><div class='add'>+            return pos;</div><div class='add'>+    }</div><div class='add'>+    return NULL;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+gf_d_type_from_ia_type(ia_type_t type)</div><div class='add'>+{</div><div class='add'>+    switch (type) {</div><div class='add'>+        case IA_IFDIR:</div><div class='add'>+            return DT_DIR;</div><div class='add'>+        case IA_IFCHR:</div><div class='add'>+            return DT_CHR;</div><div class='add'>+        case IA_IFBLK:</div><div class='add'>+            return DT_BLK;</div><div class='add'>+        case IA_IFIFO:</div><div class='add'>+            return DT_FIFO;</div><div class='add'>+        case IA_IFLNK:</div><div class='add'>+            return DT_LNK;</div><div class='add'>+        case IA_IFREG:</div><div class='add'>+            return DT_REG;</div><div class='add'>+        case IA_IFSOCK:</div><div class='add'>+            return DT_SOCK;</div><div class='add'>+        default:</div><div class='add'>+            return DT_UNKNOWN;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+gf_nanosleep(uint64_t nsec)</div><div class='add'>+{</div><div class='add'>+    struct timespec req;</div><div class='add'>+    struct timespec rem;</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    req.tv_sec = nsec / GF_SEC_IN_NS;</div><div class='add'>+    req.tv_nsec = nsec % GF_SEC_IN_NS;</div><div class='add'>+</div><div class='add'>+    do {</div><div class='add'>+        ret = nanosleep(&amp;req, &amp;rem);</div><div class='add'>+        req = rem;</div><div class='add'>+    } while (ret == -1 &amp;&amp; errno == EINTR);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+gf_syncfs(int fd)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+#if defined(HAVE_SYNCFS)</div><div class='add'>+    /* Linux with glibc recent enough. */</div><div class='add'>+    ret = syncfs(fd);</div><div class='add'>+#elif defined(HAVE_SYNCFS_SYS)</div><div class='add'>+    /* Linux with no library function. */</div><div class='add'>+    ret = syscall(SYS_syncfs, fd);</div><div class='add'>+#else</div><div class='add'>+    /* Fallback to generic UNIX stuff. */</div><div class='add'>+    sync();</div><div class='add'>+#endif</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+char **</div><div class='add'>+get_xattrs_to_heal()</div><div class='add'>+{</div><div class='add'>+    return xattrs_to_heal;</div><div class='ctx'> }</div><div class='head'>diff --git a/libglusterfs/src/common-utils.h b/libglusterfs/src/common-utils.h<br/>deleted file mode 100644<br/>index 54f52a5a0b1..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/libglusterfs/src/common-utils.h?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/common-utils.h</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,335 +0,0 @@</div><div class='del'>-/*</div><div class='del'>-   Copyright (c) 2006-2009 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='del'>-   This file is part of GlusterFS.</div><div class='del'>-</div><div class='del'>-   GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-   it under the terms of the GNU General Public License as published</div><div class='del'>-   by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-   or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-   GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-   WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-   General Public License for more details.</div><div class='del'>-</div><div class='del'>-   You should have received a copy of the GNU General Public License</div><div class='del'>-   along with this program.  If not, see</div><div class='del'>-   &lt;http://www.gnu.org/licenses/&gt;.</div><div class='del'>-*/</div><div class='del'>-</div><div class='del'>-#ifndef _COMMON_UTILS_H</div><div class='del'>-#define _COMMON_UTILS_H</div><div class='del'>-</div><div class='del'>-#ifndef _CONFIG_H</div><div class='del'>-#define _CONFIG_H</div><div class='del'>-#include "config.h"</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-#include &lt;stdint.h&gt;</div><div class='del'>-#include &lt;sys/uio.h&gt;</div><div class='del'>-#include &lt;netdb.h&gt;</div><div class='del'>-#include &lt;stdlib.h&gt;</div><div class='del'>-#include &lt;string.h&gt;</div><div class='del'>-#include &lt;assert.h&gt;</div><div class='del'>-#include &lt;pthread.h&gt;</div><div class='del'>-#ifndef GF_BSD_HOST_OS</div><div class='del'>-#include &lt;alloca.h&gt;</div><div class='del'>-#endif </div><div class='del'>-</div><div class='del'>-void trap (void);</div><div class='del'>-</div><div class='del'>-#define GF_UNIVERSAL_ANSWER 42    /* :O */</div><div class='del'>-</div><div class='del'>-/* To solve type punned error */</div><div class='del'>-#define VOID(ptr) ((void **) ((void *) ptr))</div><div class='del'>-</div><div class='del'>-#include "logging.h"</div><div class='del'>-#include "glusterfs.h"</div><div class='del'>-#include "locking.h"</div><div class='del'>-#include "mem-pool.h"</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-#define min(a,b) ((a)&lt;(b)?(a):(b))</div><div class='del'>-#define max(a,b) ((a)&gt;(b)?(a):(b))</div><div class='del'>-#define roof(a,b) ((((a)+(b)-1)/((b)?(b):1))*(b))</div><div class='del'>-#define floor(a,b) (((a)/((b)?(b):1))*(b))</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-#define GF_UNIT_KB    1024ULL</div><div class='del'>-#define GF_UNIT_MB    1048576ULL</div><div class='del'>-#define GF_UNIT_GB    1073741824ULL</div><div class='del'>-#define GF_UNIT_TB    1099511627776ULL</div><div class='del'>-#define GF_UNIT_PB    1125899906842624ULL</div><div class='del'>-</div><div class='del'>-#define GF_UNIT_KB_STRING    "KB"</div><div class='del'>-#define GF_UNIT_MB_STRING    "MB"</div><div class='del'>-#define GF_UNIT_GB_STRING    "GB"</div><div class='del'>-#define GF_UNIT_TB_STRING    "TB"</div><div class='del'>-#define GF_UNIT_PB_STRING    "PB"</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-enum _gf_boolean </div><div class='del'>-{</div><div class='del'>-	_gf_false = 0, </div><div class='del'>-	_gf_true = 1</div><div class='del'>-};</div><div class='del'>-</div><div class='del'>-typedef enum _gf_boolean gf_boolean_t;</div><div class='del'>-</div><div class='del'>-void gf_global_variable_init(void);</div><div class='del'>-</div><div class='del'>-in_addr_t gf_resolve_ip (const char *hostname, void **dnscache);</div><div class='del'>-</div><div class='del'>-void gf_log_volume_file (FILE *specfp);</div><div class='del'>-void gf_print_trace (int32_t signal);</div><div class='del'>-</div><div class='del'>-extern char *gf_fop_list[GF_FOP_MAXVALUE];</div><div class='del'>-extern char *gf_mgmt_list[GF_MGMT_MAXVALUE];</div><div class='del'>-</div><div class='del'>-#define VECTORSIZE(count) (count * (sizeof (struct iovec)))</div><div class='del'>-</div><div class='del'>-#define STRLEN_0(str) (strlen(str) + 1)</div><div class='del'>-#define VALIDATE_OR_GOTO(arg,label)   do {				\</div><div class='del'>-		if (!arg) {						\</div><div class='del'>-			errno = EINVAL;					\</div><div class='del'>-			gf_log ((this ? this-&gt;name : "(Govinda! Govinda!)"), \</div><div class='del'>-				GF_LOG_ERROR,				\</div><div class='del'>-				"invalid argument: " #arg);		\</div><div class='del'>-			goto label;					\</div><div class='del'>-		}							\</div><div class='del'>-	} while (0); </div><div class='del'>-</div><div class='del'>-#define GF_VALIDATE_OR_GOTO(name,arg,label)   do {		\</div><div class='del'>-		if (!arg) {					\</div><div class='del'>-			errno = EINVAL;   			\</div><div class='del'>-			gf_log (name, GF_LOG_ERROR,		\</div><div class='del'>-				"invalid argument: " #arg);	\</div><div class='del'>-			goto label;				\</div><div class='del'>-		}						\</div><div class='del'>-	} while (0); </div><div class='del'>-</div><div class='del'>-#define GF_VALIDATE_OR_GOTO_WITH_ERROR(name, arg, label, errno, error) do { \</div><div class='del'>-                if (!arg) {                                                 \</div><div class='del'>-                        errno = error;                                  \</div><div class='del'>-                        gf_log (name, GF_LOG_ERROR,                     \</div><div class='del'>-                                "invalid argument: " #arg);             \</div><div class='del'>-                        goto label;                                     \</div><div class='del'>-                }                                                       \</div><div class='del'>-        }while (0);</div><div class='del'>-</div><div class='del'>-#define GF_VALIDATE_ABSOLUTE_PATH_OR_GOTO(name,arg,label)       \</div><div class='del'>-        do {                                                    \</div><div class='del'>-                GF_VALIDATE_OR_GOTO (name, arg, label);         \</div><div class='del'>-                if ((arg[0]) != '/') {                          \</div><div class='del'>-                        errno = EINVAL;                         \</div><div class='del'>-			gf_log (name, GF_LOG_ERROR,	        \</div><div class='del'>-				"invalid argument: " #arg);	\</div><div class='del'>-                        goto label;                             \</div><div class='del'>-                }                                               \</div><div class='del'>-	} while (0);</div><div class='del'>-</div><div class='del'>-#define GF_FILE_CONTENT_REQUESTED(_xattr_req,_content_limit) \</div><div class='del'>-	(dict_get_uint64 (_xattr_req, "glusterfs.content", _content_limit) == 0)</div><div class='del'>-</div><div class='del'>-#define GF_ASSERT(x)    assert (x);</div><div class='del'>-</div><div class='del'>-static inline void</div><div class='del'>-iov_free (struct iovec *vector, int count)</div><div class='del'>-{</div><div class='del'>-	int i;</div><div class='del'>-</div><div class='del'>-	for (i = 0; i &lt; count; i++)</div><div class='del'>-		FREE (vector[i].iov_base);</div><div class='del'>-</div><div class='del'>-	GF_FREE (vector);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-static inline int</div><div class='del'>-iov_length (const struct iovec *vector, int count)</div><div class='del'>-{</div><div class='del'>-	int     i = 0;</div><div class='del'>-	size_t  size = 0;</div><div class='del'>-</div><div class='del'>-	for (i = 0; i &lt; count; i++)</div><div class='del'>-		size += vector[i].iov_len;</div><div class='del'>-</div><div class='del'>-	return size;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-static inline struct iovec *</div><div class='del'>-iov_dup (struct iovec *vector, int count)</div><div class='del'>-{</div><div class='del'>-	int           bytecount = 0;</div><div class='del'>-	int           i;</div><div class='del'>-	struct iovec *newvec = NULL;</div><div class='del'>-</div><div class='del'>-	bytecount = (count * sizeof (struct iovec));</div><div class='del'>-	newvec = GF_MALLOC (bytecount, gf_common_mt_iovec);</div><div class='del'>-	if (!newvec)</div><div class='del'>-		return NULL;</div><div class='del'>-</div><div class='del'>-	for (i = 0; i &lt; count; i++) {</div><div class='del'>-		newvec[i].iov_len  = vector[i].iov_len;</div><div class='del'>-		newvec[i].iov_base = vector[i].iov_base;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	return newvec;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-static inline int</div><div class='del'>-iov_subset (struct iovec *orig, int orig_count,</div><div class='del'>-	    off_t src_offset, off_t dst_offset,</div><div class='del'>-	    struct iovec *new)</div><div class='del'>-{</div><div class='del'>-	int    new_count = 0;</div><div class='del'>-	int    i;</div><div class='del'>-	off_t  offset = 0;</div><div class='del'>-	size_t start_offset = 0;</div><div class='del'>-	size_t end_offset = 0;</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-	for (i = 0; i &lt; orig_count; i++) {</div><div class='del'>-		if ((offset + orig[i].iov_len &lt; src_offset)</div><div class='del'>-		    || (offset &gt; dst_offset)) {</div><div class='del'>-			goto not_subset;</div><div class='del'>-		}</div><div class='del'>-</div><div class='del'>-		if (!new) {</div><div class='del'>-			goto count_only;</div><div class='del'>-		}</div><div class='del'>-</div><div class='del'>-		start_offset = 0;</div><div class='del'>-		end_offset = orig[i].iov_len;</div><div class='del'>-</div><div class='del'>-		if (src_offset &gt;= offset) {</div><div class='del'>-			start_offset = (src_offset - offset);</div><div class='del'>-		}</div><div class='del'>-</div><div class='del'>-		if (dst_offset &lt;= (offset + orig[i].iov_len)) {</div><div class='del'>-			end_offset = (dst_offset - offset);</div><div class='del'>-		}</div><div class='del'>-</div><div class='del'>-		new[new_count].iov_base = orig[i].iov_base + start_offset;</div><div class='del'>-		new[new_count].iov_len = end_offset - start_offset;</div><div class='del'>-</div><div class='del'>-	count_only:</div><div class='del'>-		new_count++;</div><div class='del'>-</div><div class='del'>-	not_subset:</div><div class='del'>-		offset += orig[i].iov_len;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	return new_count;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-static inline void</div><div class='del'>-iov_unload (char *buf, const struct iovec *vector, int count)</div><div class='del'>-{</div><div class='del'>-	int i;</div><div class='del'>-	int copied = 0;</div><div class='del'>-</div><div class='del'>-	for (i = 0; i &lt; count; i++) {</div><div class='del'>-		memcpy (buf + copied, vector[i].iov_base, vector[i].iov_len);</div><div class='del'>-		copied += vector[i].iov_len;</div><div class='del'>-	}</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-static inline int</div><div class='del'>-mem_0filled (const char *buf, size_t size)</div><div class='del'>-{</div><div class='del'>-	int i = 0;</div><div class='del'>-	int ret = 0;</div><div class='del'>-</div><div class='del'>-	for (i = 0; i &lt; size; i++) {</div><div class='del'>-		ret = buf[i];</div><div class='del'>-		if (ret)</div><div class='del'>-			break;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-static inline int</div><div class='del'>-iov_0filled (struct iovec *vector, int count)</div><div class='del'>-{</div><div class='del'>-	int i = 0;</div><div class='del'>-	int ret = 0;</div><div class='del'>-</div><div class='del'>-	for (i = 0; i &lt; count; i++) {</div><div class='del'>-		ret = mem_0filled (vector[i].iov_base, vector[i].iov_len);</div><div class='del'>-		if (ret)</div><div class='del'>-			break;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-static inline void *</div><div class='del'>-memdup (const void *ptr, size_t size)</div><div class='del'>-{</div><div class='del'>-	void *newptr = NULL;</div><div class='del'>-</div><div class='del'>-	newptr = GF_MALLOC (size, gf_common_mt_memdup);</div><div class='del'>-	if (!newptr)</div><div class='del'>-		return NULL;</div><div class='del'>-</div><div class='del'>-	memcpy (newptr, ptr, size);</div><div class='del'>-	return newptr;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-char *gf_trim (char *string);</div><div class='del'>-int gf_strsplit (const char *str, const char *delim, </div><div class='del'>-		 char ***tokens, int *token_count);</div><div class='del'>-int gf_volume_name_validate (const char *volume_name);</div><div class='del'>-</div><div class='del'>-int gf_string2long (const char *str, long *n);</div><div class='del'>-int gf_string2ulong (const char *str, unsigned long *n);</div><div class='del'>-int gf_string2int (const char *str, int *n);</div><div class='del'>-int gf_string2uint (const char *str, unsigned int *n);</div><div class='del'>-int gf_string2double (const char *str, double *n);</div><div class='del'>-int gf_string2longlong (const char *str, long long *n);</div><div class='del'>-int gf_string2ulonglong (const char *str, unsigned long long *n);</div><div class='del'>-</div><div class='del'>-int gf_string2int8 (const char *str, int8_t *n);</div><div class='del'>-int gf_string2int16 (const char *str, int16_t *n);</div><div class='del'>-int gf_string2int32 (const char *str, int32_t *n);</div><div class='del'>-int gf_string2int64 (const char *str, int64_t *n);</div><div class='del'>-int gf_string2uint8 (const char *str, uint8_t *n);</div><div class='del'>-int gf_string2uint16 (const char *str, uint16_t *n);</div><div class='del'>-int gf_string2uint32 (const char *str, uint32_t *n);</div><div class='del'>-int gf_string2uint64 (const char *str, uint64_t *n);</div><div class='del'>-</div><div class='del'>-int gf_strstr (const char *str, const char *delim, const char *match);</div><div class='del'>-</div><div class='del'>-int gf_string2ulong_base10 (const char *str, unsigned long *n);</div><div class='del'>-int gf_string2uint_base10 (const char *str, unsigned int *n);</div><div class='del'>-int gf_string2uint8_base10 (const char *str, uint8_t *n);</div><div class='del'>-int gf_string2uint16_base10 (const char *str, uint16_t *n);</div><div class='del'>-int gf_string2uint32_base10 (const char *str, uint32_t *n);</div><div class='del'>-int gf_string2uint64_base10 (const char *str, uint64_t *n);</div><div class='del'>-</div><div class='del'>-int gf_string2bytesize (const char *str, uint64_t *n);</div><div class='del'>-</div><div class='del'>-int gf_string2boolean (const char *str, gf_boolean_t *b);</div><div class='del'>-int gf_string2percent (const char *str, uint32_t *n);</div><div class='del'>-int gf_string2time (const char *str, uint32_t *n);</div><div class='del'>-</div><div class='del'>-int gf_lockfd (int fd);</div><div class='del'>-int gf_unlockfd (int fd);</div><div class='del'>-</div><div class='del'>-int get_checksum_for_file (int fd, uint32_t *checksum);</div><div class='del'>-int log_base2 (unsigned long x);</div><div class='del'>-</div><div class='del'>-int gf_system (const char *command);</div><div class='del'>-int get_checksum_for_path (char *path, uint32_t *checksum);</div><div class='del'>-</div><div class='del'>-#endif /* _COMMON_UTILS_H */</div><div class='del'>-</div><div class='head'>diff --git a/libglusterfs/src/compat-errno.c b/libglusterfs/src/compat-errno.c<br/>index 1dccec2fa3d..df57e243239 100644<br/>--- a/<a href='/cgit/glusterfs.git/tree/libglusterfs/src/compat-errno.c?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/compat-errno.c</a><br/>+++ b/<a href='/cgit/glusterfs.git/tree/libglusterfs/src/compat-errno.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>libglusterfs/src/compat-errno.c</a></div><div class='hunk'>@@ -1,938 +1,955 @@</div><div class='ctx'> /*</div><div class='del'>-   Copyright (c) 2008-2009 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='del'>-   This file is part of GlusterFS.</div><div class='del'>-</div><div class='del'>-   GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-   it under the terms of the GNU General Public License as published</div><div class='del'>-   by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-   or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-   GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-   WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-   General Public License for more details.</div><div class='del'>-</div><div class='del'>-   You should have received a copy of the GNU General Public License</div><div class='del'>-   along with this program.  If not, see</div><div class='del'>-   &lt;http://www.gnu.org/licenses/&gt;.</div><div class='del'>-*/</div><div class='add'>+  Copyright (c) 2008-2012 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='ctx'> </div><div class='del'>-#ifndef _CONFIG_H</div><div class='del'>-#define _CONFIG_H</div><div class='del'>-#include "config.h"</div><div class='del'>-#endif</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='ctx'> </div><div class='ctx'> #include &lt;stdint.h&gt;</div><div class='ctx'> </div><div class='del'>-#include "compat-errno.h"</div><div class='del'>-</div><div class='add'>+#include "glusterfs/compat-errno.h"</div><div class='ctx'> </div><div class='del'>-static int32_t gf_error_to_errno_array[1024]; </div><div class='add'>+static int32_t gf_error_to_errno_array[1024];</div><div class='ctx'> static int32_t gf_errno_to_error_array[1024];</div><div class='ctx'> </div><div class='ctx'> static int32_t gf_compat_errno_init_done;</div><div class='ctx'> </div><div class='ctx'> #ifdef GF_SOLARIS_HOST_OS</div><div class='del'>-static void </div><div class='del'>-init_compat_errno_arrays ()</div><div class='add'>+static void</div><div class='add'>+init_compat_errno_arrays()</div><div class='ctx'> {</div><div class='del'>-/*  	ENOMSG	35	/ * No message of desired type		*/</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_NOMSG] = ENOMSG;</div><div class='del'>-  gf_errno_to_error_array[ENOMSG] = GF_ERROR_CODE_NOMSG;</div><div class='del'>-</div><div class='del'>-/*  	EIDRM	36	/ * Identifier removed			*/</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_IDRM] = EIDRM;</div><div class='del'>-  gf_errno_to_error_array[EIDRM] = GF_ERROR_CODE_IDRM;</div><div class='del'>-</div><div class='del'>-/*  	ECHRNG	37	/ * Channel number out of range		*/</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_CHRNG] = ECHRNG;</div><div class='del'>-  gf_errno_to_error_array[ECHRNG] = GF_ERROR_CODE_CHRNG;</div><div class='del'>-</div><div class='del'>-/*  	EL2NSYNC 38	/ * Level 2 not synchronized		*/</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_L2NSYNC] = EL2NSYNC;</div><div class='del'>-  gf_errno_to_error_array[EL2NSYNC] = GF_ERROR_CODE_L2NSYNC;</div><div class='del'>-</div><div class='del'>-/*  	EL3HLT	39	/ * Level 3 halted			*/</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_L3HLT] = EL3HLT;</div><div class='del'>-  gf_errno_to_error_array[EL3HLT] = GF_ERROR_CODE_L3HLT;</div><div class='del'>-</div><div class='del'>-/*  	EL3RST	40	/ * Level 3 reset			*/</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_L3RST] = EL3RST;</div><div class='del'>-  gf_errno_to_error_array[EL3RST] = GF_ERROR_CODE_L3RST;</div><div class='del'>-</div><div class='del'>-/*  	ELNRNG	41	/ * Link number out of range		*/</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_LNRNG] = ELNRNG;</div><div class='del'>-  gf_errno_to_error_array[ELNRNG] = GF_ERROR_CODE_LNRNG;</div><div class='del'>-</div><div class='del'>-/*  	EUNATCH 42	/ * Protocol driver not attached		*/</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_UNATCH] = EUNATCH;</div><div class='del'>-  gf_errno_to_error_array[EUNATCH] = GF_ERROR_CODE_UNATCH;</div><div class='del'>-</div><div class='del'>-/*  	ENOCSI	43	/ * No CSI structure available		*/</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_NOCSI] = ENOCSI;</div><div class='del'>-  gf_errno_to_error_array[ENOCSI] = GF_ERROR_CODE_NOCSI;</div><div class='del'>-</div><div class='del'>-/*  	EL2HLT	44	/ * Level 2 halted			*/</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_L2HLT] = EL2HLT;</div><div class='del'>-  gf_errno_to_error_array[EL2HLT] = GF_ERROR_CODE_L2HLT;</div><div class='del'>-</div><div class='del'>-/*  	EDEADLK	45	/ * Deadlock condition.			*/</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_DEADLK] = EDEADLK;</div><div class='del'>-  gf_errno_to_error_array[EDEADLK] = GF_ERROR_CODE_DEADLK;</div><div class='del'>-</div><div class='del'>-/*  	ENOLCK	46	/ * No record locks available.		*/</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_NOLCK] = ENOLCK;</div><div class='del'>-  gf_errno_to_error_array[ENOLCK] = GF_ERROR_CODE_NOLCK;</div><div class='del'>-</div><div class='del'>-/*  	ECANCELED 47	/ * Operation canceled			*/</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_CANCELED] = ECANCELED;</div><div class='del'>-  gf_errno_to_error_array[ECANCELED] = GF_ERROR_CODE_CANCELED;</div><div class='del'>-</div><div class='del'>-/*  	ENOTSUP	48	/ * Operation not supported		*/</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_NOTSUPP] = ENOTSUP;</div><div class='del'>-  gf_errno_to_error_array[ENOTSUP] = GF_ERROR_CODE_NOTSUPP;</div><div class='del'>-</div><div class='del'>-/* Filesystem Quotas */</div><div class='del'>-/*  	EDQUOT	49	/ * Disc quota exceeded			*/</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_DQUOT] = EDQUOT;</div><div class='del'>-  gf_errno_to_error_array[EDQUOT] = GF_ERROR_CODE_DQUOT;</div><div class='del'>-</div><div class='del'>-/* Convergent Error Returns */</div><div class='del'>-/*  	EBADE	50	/ * invalid exchange			*/</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_BADE] = EBADE;</div><div class='del'>-  gf_errno_to_error_array[EBADE] = GF_ERROR_CODE_BADE;</div><div class='del'>-/*  	EBADR	51	/ * invalid request descriptor		*/</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_BADR] = EBADR;</div><div class='del'>-  gf_errno_to_error_array[EBADR] = GF_ERROR_CODE_BADR;</div><div class='del'>-/*  	EXFULL	52	/ * exchange full			*/</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_XFULL] = EXFULL;</div><div class='del'>-  gf_errno_to_error_array[EXFULL] = GF_ERROR_CODE_XFULL;</div><div class='del'>-/*  	ENOANO	53	/ * no anode				*/</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_NOANO] = ENOANO;</div><div class='del'>-  gf_errno_to_error_array[ENOANO] = GF_ERROR_CODE_NOANO;</div><div class='del'>-/*  	EBADRQC	54	/ * invalid request code			*/</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_BADRQC] = EBADRQC;</div><div class='del'>-  gf_errno_to_error_array[EBADRQC] = GF_ERROR_CODE_BADRQC;</div><div class='del'>-/*  	EBADSLT	55	/ * invalid slot				*/</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_BADSLT] = EBADSLT;</div><div class='del'>-  gf_errno_to_error_array[EBADSLT] = GF_ERROR_CODE_BADSLT;</div><div class='del'>-/*  	EDEADLOCK 56	/ * file locking deadlock error		*/</div><div class='del'>-/* This is same as EDEADLK on linux */</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_DEADLK] = EDEADLOCK;</div><div class='del'>-  gf_errno_to_error_array[EDEADLOCK] = GF_ERROR_CODE_DEADLK;</div><div class='del'>-</div><div class='del'>-/*  	EBFONT	57	/ * bad font file fmt			*/</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_BFONT] = EBFONT;</div><div class='del'>-  gf_errno_to_error_array[EBFONT] = GF_ERROR_CODE_BFONT;</div><div class='del'>-</div><div class='del'>-/* Interprocess Robust Locks */</div><div class='del'>-/*  	EOWNERDEAD	58	/ * process died with the lock */</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_OWNERDEAD] = EOWNERDEAD;</div><div class='del'>-  gf_errno_to_error_array[EOWNERDEAD] = GF_ERROR_CODE_OWNERDEAD;</div><div class='del'>-/*  	ENOTRECOVERABLE	59	/ * lock is not recoverable */</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_NOTRECOVERABLE] = ENOTRECOVERABLE;</div><div class='del'>-  gf_errno_to_error_array[ENOTRECOVERABLE] = GF_ERROR_CODE_NOTRECOVERABLE;</div><div class='del'>-</div><div class='del'>-/* stream problems */</div><div class='del'>-/*  	ENOSTR	60	/ * Device not a stream			*/</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_NOSTR] = ENOSTR;</div><div class='del'>-  gf_errno_to_error_array[ENOSTR] = GF_ERROR_CODE_NOSTR;</div><div class='del'>-/*  	ENODATA	61	/ * no data (for no delay io)		*/</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_NODATA] = ENODATA;</div><div class='del'>-  gf_errno_to_error_array[ENODATA] = GF_ERROR_CODE_NODATA;</div><div class='del'>-/*  	ETIME	62	/ * timer expired			*/</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_TIME] = ETIME;</div><div class='del'>-  gf_errno_to_error_array[ETIME] = GF_ERROR_CODE_TIME;</div><div class='del'>-/*  	ENOSR	63	/ * out of streams resources		*/</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_NOSR] = ENOSR;</div><div class='del'>-  gf_errno_to_error_array[ENOSR] = GF_ERROR_CODE_NOSR;</div><div class='del'>-</div><div class='del'>-/*  	ENONET	64	/ * Machine is not on the network	*/</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_NONET] = ENONET;</div><div class='del'>-  gf_errno_to_error_array[ENONET] = GF_ERROR_CODE_NONET;</div><div class='del'>-/*  	ENOPKG	65	/ * Package not installed		*/</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_NOPKG] = ENOPKG;</div><div class='del'>-  gf_errno_to_error_array[ENOPKG] = GF_ERROR_CODE_NOPKG;</div><div class='del'>-/*  	EREMOTE	66	/ * The object is remote			*/</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_REMOTE] = EREMOTE;</div><div class='del'>-  gf_errno_to_error_array[EREMOTE] = GF_ERROR_CODE_REMOTE;</div><div class='del'>-/*  	ENOLINK	67	/ * the link has been severed		*/</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_NOLINK] = ENOLINK;</div><div class='del'>-  gf_errno_to_error_array[ENOLINK] = GF_ERROR_CODE_NOLINK;</div><div class='del'>-/*  	EADV	68	/ * advertise error			*/</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_ADV] = EADV;</div><div class='del'>-  gf_errno_to_error_array[EADV] = GF_ERROR_CODE_ADV;</div><div class='del'>-/*  	ESRMNT	69	/ * srmount error			*/</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_SRMNT] = ESRMNT;</div><div class='del'>-  gf_errno_to_error_array[ESRMNT] = GF_ERROR_CODE_SRMNT;</div><div class='del'>-</div><div class='del'>-/*  	ECOMM	70	/ * Communication error on send		*/</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_COMM] = ECOMM;</div><div class='del'>-  gf_errno_to_error_array[ECOMM] = GF_ERROR_CODE_COMM;</div><div class='del'>-/*  	EPROTO	71	/ * Protocol error			*/</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_PROTO] = EPROTO;</div><div class='del'>-  gf_errno_to_error_array[EPROTO] = GF_ERROR_CODE_PROTO;</div><div class='del'>-</div><div class='del'>-/* Interprocess Robust Locks */</div><div class='del'>-/*  	ELOCKUNMAPPED	72	/ * locked lock was unmapped */</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_LOCKUNMAPPED] = ELOCKUNMAPPED;</div><div class='del'>-  gf_errno_to_error_array[ELOCKUNMAPPED] = GF_ERROR_CODE_LOCKUNMAPPED;</div><div class='del'>-</div><div class='del'>-/*  	ENOTACTIVE 73	/ * Facility is not active		*/</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_NOTACTIVE] = ENOTACTIVE;</div><div class='del'>-  gf_errno_to_error_array[ENOTACTIVE] = GF_ERROR_CODE_NOTACTIVE;</div><div class='del'>-/*  	EMULTIHOP 74	/ * multihop attempted			*/</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_MULTIHOP] = EMULTIHOP;</div><div class='del'>-  gf_errno_to_error_array[EMULTIHOP] = GF_ERROR_CODE_MULTIHOP;</div><div class='del'>-/*  	EBADMSG 77	/ * trying to read unreadable message	*/</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_BADMSG] = EBADMSG;</div><div class='del'>-  gf_errno_to_error_array[EBADMSG] = GF_ERROR_CODE_BADMSG;</div><div class='del'>-/*  	ENAMETOOLONG 78	/ * path name is too long		*/</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_NAMETOOLONG] = ENAMETOOLONG;</div><div class='del'>-  gf_errno_to_error_array[ENAMETOOLONG] = GF_ERROR_CODE_NAMETOOLONG;</div><div class='del'>-/*  	EOVERFLOW 79	/ * value too large to be stored in data type */</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_OVERFLOW] = EOVERFLOW;</div><div class='del'>-  gf_errno_to_error_array[EOVERFLOW] = GF_ERROR_CODE_OVERFLOW;</div><div class='del'>-/*  	ENOTUNIQ 80	/ * given log. name not unique		*/</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_NOTUNIQ] = ENOTUNIQ;</div><div class='del'>-  gf_errno_to_error_array[ENOTUNIQ] = GF_ERROR_CODE_NOTUNIQ;</div><div class='del'>-/*  	EBADFD	81	/ * f.d. invalid for this operation	*/</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_BADFD] = EBADFD;</div><div class='del'>-  gf_errno_to_error_array[EBADFD] = GF_ERROR_CODE_BADFD;</div><div class='del'>-/*  	EREMCHG	82	/ * Remote address changed		*/</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_REMCHG] = EREMCHG;</div><div class='del'>-  gf_errno_to_error_array[EREMCHG] = GF_ERROR_CODE_REMCHG;</div><div class='del'>-</div><div class='del'>-/* shared library problems */</div><div class='del'>-/*  	ELIBACC	83	/ * Can't access a needed shared lib.	*/</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_LIBACC] = ELIBACC;</div><div class='del'>-  gf_errno_to_error_array[ELIBACC] = GF_ERROR_CODE_LIBACC;</div><div class='del'>-/*  	ELIBBAD	84	/ * Accessing a corrupted shared lib.	*/</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_LIBBAD] = ELIBBAD;</div><div class='del'>-  gf_errno_to_error_array[ELIBBAD] = GF_ERROR_CODE_LIBBAD;</div><div class='del'>-/*  	ELIBSCN	85	/ * .lib section in a.out corrupted.	*/</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_LIBSCN] = ELIBSCN;</div><div class='del'>-  gf_errno_to_error_array[ELIBSCN] = GF_ERROR_CODE_LIBSCN;</div><div class='del'>-/*  	ELIBMAX	86	/ * Attempting to link in too many libs.	*/</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_LIBMAX] = ELIBMAX;</div><div class='del'>-  gf_errno_to_error_array[ELIBMAX] = GF_ERROR_CODE_LIBMAX;</div><div class='del'>-/*  	ELIBEXEC 87	/ * Attempting to exec a shared library.	*/</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_LIBEXEC] = ELIBEXEC;</div><div class='del'>-  gf_errno_to_error_array[ELIBEXEC] = GF_ERROR_CODE_LIBEXEC;</div><div class='del'>-/*  	EILSEQ	88	/ * Illegal byte sequence.		*/</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_ILSEQ] = EILSEQ;</div><div class='del'>-  gf_errno_to_error_array[EILSEQ] = GF_ERROR_CODE_ILSEQ;</div><div class='del'>-/*  	ENOSYS	89	/ * Unsupported file system operation	*/</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_NOSYS] = ENOSYS;</div><div class='del'>-  gf_errno_to_error_array[ENOSYS] = GF_ERROR_CODE_NOSYS;</div><div class='del'>-/*  	ELOOP	90	/ * Symbolic link loop			*/</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_LOOP] = ELOOP;</div><div class='del'>-  gf_errno_to_error_array[ELOOP] = GF_ERROR_CODE_LOOP;</div><div class='del'>-/*  	ERESTART 91	/ * Restartable system call		*/</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_RESTART] = ERESTART;</div><div class='del'>-  gf_errno_to_error_array[ERESTART] = GF_ERROR_CODE_RESTART;</div><div class='del'>-/*  	ESTRPIPE 92	/ * if pipe/FIFO, don't sleep in stream head */</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_STRPIPE] = ESTRPIPE;</div><div class='del'>-  gf_errno_to_error_array[ESTRPIPE] = GF_ERROR_CODE_STRPIPE;</div><div class='del'>-/*  	ENOTEMPTY 93	/ * directory not empty			*/</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_NOTEMPTY] = ENOTEMPTY;</div><div class='del'>-  gf_errno_to_error_array[ENOTEMPTY] = GF_ERROR_CODE_NOTEMPTY;</div><div class='del'>-/*  	EUSERS	94	/ * Too many users (for UFS)		*/</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_USERS] = EUSERS;</div><div class='del'>-  gf_errno_to_error_array[EUSERS] = GF_ERROR_CODE_USERS;</div><div class='del'>-</div><div class='del'>-/* BSD Networking Software */</div><div class='del'>-	/* argument errors */</div><div class='del'>-/*  	ENOTSOCK	95	/ * Socket operation on non-socket */</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_NOTSOCK] = ENOTSOCK;</div><div class='del'>-  gf_errno_to_error_array[ENOTSOCK] = GF_ERROR_CODE_NOTSOCK;</div><div class='del'>-/*  	EDESTADDRREQ	96	/ * Destination address required */</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_DESTADDRREQ] = EDESTADDRREQ;</div><div class='del'>-  gf_errno_to_error_array[EDESTADDRREQ] = GF_ERROR_CODE_DESTADDRREQ;</div><div class='del'>-/*  	EMSGSIZE	97	/ * Message too long */</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_MSGSIZE] = EMSGSIZE;</div><div class='del'>-  gf_errno_to_error_array[EMSGSIZE] = GF_ERROR_CODE_MSGSIZE;</div><div class='del'>-/*  	EPROTOTYPE	98	/ * Protocol wrong type for socket */</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_PROTOTYPE] = EPROTOTYPE;</div><div class='del'>-  gf_errno_to_error_array[EPROTOTYPE] = GF_ERROR_CODE_PROTOTYPE;</div><div class='del'>-/*  	ENOPROTOOPT	99	/ * Protocol not available */</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_NOPROTOOPT] = ENOPROTOOPT;</div><div class='del'>-  gf_errno_to_error_array[ENOPROTOOPT] = GF_ERROR_CODE_NOPROTOOPT;</div><div class='del'>-/*  	EPROTONOSUPPORT	120	/ * Protocol not supported */</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_PROTONOSUPPORT] = EPROTONOSUPPORT;</div><div class='del'>-  gf_errno_to_error_array[EPROTONOSUPPORT] = GF_ERROR_CODE_PROTONOSUPPORT;</div><div class='del'>-/*  	ESOCKTNOSUPPORT	121	/ * Socket type not supported */</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_SOCKTNOSUPPORT] = ESOCKTNOSUPPORT;</div><div class='del'>-  gf_errno_to_error_array[ESOCKTNOSUPPORT] = GF_ERROR_CODE_SOCKTNOSUPPORT;</div><div class='del'>-</div><div class='del'>-/*  	EOPNOTSUPP	122	/ * Operation not supported on socket */</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_OPNOTSUPP] = EOPNOTSUPP;</div><div class='del'>-  gf_errno_to_error_array[EOPNOTSUPP] = GF_ERROR_CODE_OPNOTSUPP;</div><div class='del'>-/*  	EPFNOSUPPORT	123	/ * Protocol family not supported */</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_PFNOSUPPORT] = EPFNOSUPPORT;</div><div class='del'>-  gf_errno_to_error_array[EPFNOSUPPORT] = GF_ERROR_CODE_PFNOSUPPORT;</div><div class='del'>-/*  	EAFNOSUPPORT	124	/ * Address family not supported by */</div><div class='del'>-				/* protocol family */</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_AFNOSUPPORT] = EAFNOSUPPORT;</div><div class='del'>-  gf_errno_to_error_array[EAFNOSUPPORT] = GF_ERROR_CODE_AFNOSUPPORT;</div><div class='del'>-/*  	EADDRINUSE	125	/ * Address already in use */</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_ADDRINUSE] = EADDRINUSE;</div><div class='del'>-  gf_errno_to_error_array[EADDRINUSE] = GF_ERROR_CODE_ADDRINUSE;</div><div class='del'>-/*  	EADDRNOTAVAIL	126	/ * Can't assign requested address */</div><div class='del'>-                                /* operational errors */</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_ADDRNOTAVAIL] = EADDRNOTAVAIL;</div><div class='del'>-  gf_errno_to_error_array[EADDRNOTAVAIL] = GF_ERROR_CODE_ADDRNOTAVAIL;</div><div class='del'>-/*  	ENETDOWN	127	/ * Network is down */</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_NETDOWN] = ENETDOWN;</div><div class='del'>-  gf_errno_to_error_array[ENETDOWN] = GF_ERROR_CODE_NETDOWN;</div><div class='del'>-/*  	ENETUNREACH	128	/ * Network is unreachable */</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_NETUNREACH] = ENETUNREACH;</div><div class='del'>-  gf_errno_to_error_array[ENETUNREACH] = GF_ERROR_CODE_NETUNREACH;</div><div class='del'>-/*  	ENETRESET	129	/ * Network dropped connection because */</div><div class='del'>-				/* of reset */</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_NETRESET] = ENETRESET;</div><div class='del'>-  gf_errno_to_error_array[ENETRESET] = GF_ERROR_CODE_NETRESET;</div><div class='del'>-/*  	ECONNABORTED	130	/ * Software caused connection abort */</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_CONNABORTED] = ECONNABORTED;</div><div class='del'>-  gf_errno_to_error_array[ECONNABORTED] = GF_ERROR_CODE_CONNABORTED;</div><div class='del'>-/*  	ECONNRESET	131	/ * Connection reset by peer */</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_CONNRESET] = ECONNRESET;</div><div class='del'>-  gf_errno_to_error_array[ECONNRESET] = GF_ERROR_CODE_CONNRESET;</div><div class='del'>-/*  	ENOBUFS		132	/ * No buffer space available */</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_NOBUFS] = ENOBUFS;</div><div class='del'>-  gf_errno_to_error_array[ENOBUFS] = GF_ERROR_CODE_NOBUFS;</div><div class='del'>-/*  	EISCONN		133	/ * Socket is already connected */</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_ISCONN] = EISCONN;</div><div class='del'>-  gf_errno_to_error_array[EISCONN] = GF_ERROR_CODE_ISCONN;</div><div class='del'>-/*  	ENOTCONN	134	/ * Socket is not connected */</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_NOTCONN] = ENOTCONN;</div><div class='del'>-  gf_errno_to_error_array[ENOTCONN] = GF_ERROR_CODE_NOTCONN;</div><div class='del'>-/* XENIX has 135 - 142 */</div><div class='del'>-/*  	ESHUTDOWN	143	/ * Can't send after socket shutdown */</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_SHUTDOWN] = ESHUTDOWN;</div><div class='del'>-  gf_errno_to_error_array[ESHUTDOWN] = GF_ERROR_CODE_SHUTDOWN;</div><div class='del'>-/*  	ETOOMANYREFS	144	/ * Too many references: can't splice */</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_TOOMANYREFS] = ETOOMANYREFS;</div><div class='del'>-  gf_errno_to_error_array[ETOOMANYREFS] = GF_ERROR_CODE_TOOMANYREFS;</div><div class='del'>-/*  	ETIMEDOUT	145	/ * Connection timed out */</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_TIMEDOUT] = ETIMEDOUT;</div><div class='del'>-  gf_errno_to_error_array[ETIMEDOUT] = GF_ERROR_CODE_TIMEDOUT;</div><div class='del'>-</div><div class='del'>-/*  	ECONNREFUSED	146	/ * Connection refused */</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_CONNREFUSED] = ECONNREFUSED;</div><div class='del'>-  gf_errno_to_error_array[ECONNREFUSED] = GF_ERROR_CODE_CONNREFUSED;</div><div class='del'>-/*  	EHOSTDOWN	147	/ * Host is down */</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_HOSTDOWN] = EHOSTDOWN;</div><div class='del'>-  gf_errno_to_error_array[EHOSTDOWN] = GF_ERROR_CODE_HOSTDOWN;</div><div class='del'>-/*  	EHOSTUNREACH	148	/ * No route to host */</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_HOSTUNREACH] = EHOSTUNREACH;</div><div class='del'>-  gf_errno_to_error_array[EHOSTUNREACH] = GF_ERROR_CODE_HOSTUNREACH;</div><div class='del'>-/*  	EALREADY	149	/ * operation already in progress */</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_ALREADY] = EALREADY;</div><div class='del'>-  gf_errno_to_error_array[EALREADY] = GF_ERROR_CODE_ALREADY;</div><div class='del'>-/*  	EINPROGRESS	150	/ * operation now in progress */</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_INPROGRESS] = EINPROGRESS;</div><div class='del'>-  gf_errno_to_error_array[EINPROGRESS] = GF_ERROR_CODE_INPROGRESS;</div><div class='del'>-</div><div class='del'>-/* SUN Network File System */</div><div class='del'>-/*  	ESTALE		151	/ * Stale NFS file handle */</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_STALE] = ESTALE;</div><div class='del'>-  gf_errno_to_error_array[ESTALE] = GF_ERROR_CODE_STALE;</div><div class='del'>-</div><div class='del'>-  return ;</div><div class='add'>+    /*      ENOMSG  35      / * No message of desired type          */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_NOMSG] = ENOMSG;</div><div class='add'>+    gf_errno_to_error_array[ENOMSG] = GF_ERROR_CODE_NOMSG;</div><div class='add'>+</div><div class='add'>+    /*      EIDRM   36      / * Identifier removed                  */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_IDRM] = EIDRM;</div><div class='add'>+    gf_errno_to_error_array[EIDRM] = GF_ERROR_CODE_IDRM;</div><div class='add'>+</div><div class='add'>+    /*      ECHRNG  37      / * Channel number out of range         */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_CHRNG] = ECHRNG;</div><div class='add'>+    gf_errno_to_error_array[ECHRNG] = GF_ERROR_CODE_CHRNG;</div><div class='add'>+</div><div class='add'>+    /*      EL2NSYNC 38     / * Level 2 not synchronized            */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_L2NSYNC] = EL2NSYNC;</div><div class='add'>+    gf_errno_to_error_array[EL2NSYNC] = GF_ERROR_CODE_L2NSYNC;</div><div class='add'>+</div><div class='add'>+    /*      EL3HLT  39      / * Level 3 halted                      */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_L3HLT] = EL3HLT;</div><div class='add'>+    gf_errno_to_error_array[EL3HLT] = GF_ERROR_CODE_L3HLT;</div><div class='add'>+</div><div class='add'>+    /*      EL3RST  40      / * Level 3 reset                       */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_L3RST] = EL3RST;</div><div class='add'>+    gf_errno_to_error_array[EL3RST] = GF_ERROR_CODE_L3RST;</div><div class='add'>+</div><div class='add'>+    /*      ELNRNG  41      / * Link number out of range            */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_LNRNG] = ELNRNG;</div><div class='add'>+    gf_errno_to_error_array[ELNRNG] = GF_ERROR_CODE_LNRNG;</div><div class='add'>+</div><div class='add'>+    /*      EUNATCH 42      / * Protocol driver not attached                */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_UNATCH] = EUNATCH;</div><div class='add'>+    gf_errno_to_error_array[EUNATCH] = GF_ERROR_CODE_UNATCH;</div><div class='add'>+</div><div class='add'>+    /*      ENOCSI  43      / * No CSI structure available          */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_NOCSI] = ENOCSI;</div><div class='add'>+    gf_errno_to_error_array[ENOCSI] = GF_ERROR_CODE_NOCSI;</div><div class='add'>+</div><div class='add'>+    /*      EL2HLT  44      / * Level 2 halted                      */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_L2HLT] = EL2HLT;</div><div class='add'>+    gf_errno_to_error_array[EL2HLT] = GF_ERROR_CODE_L2HLT;</div><div class='add'>+</div><div class='add'>+    /*      EDEADLK 45      / * Deadlock condition.                 */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_DEADLK] = EDEADLK;</div><div class='add'>+    gf_errno_to_error_array[EDEADLK] = GF_ERROR_CODE_DEADLK;</div><div class='add'>+</div><div class='add'>+    /*      ENOLCK  46      / * No record locks available.          */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_NOLCK] = ENOLCK;</div><div class='add'>+    gf_errno_to_error_array[ENOLCK] = GF_ERROR_CODE_NOLCK;</div><div class='add'>+</div><div class='add'>+    /*      ECANCELED 47    / * Operation canceled                  */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_CANCELED] = ECANCELED;</div><div class='add'>+    gf_errno_to_error_array[ECANCELED] = GF_ERROR_CODE_CANCELED;</div><div class='add'>+</div><div class='add'>+    /*      ENOTSUP 48      / * Operation not supported             */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_NOTSUPP] = ENOTSUP;</div><div class='add'>+    gf_errno_to_error_array[ENOTSUP] = GF_ERROR_CODE_NOTSUPP;</div><div class='add'>+</div><div class='add'>+    /* Filesystem Quotas */</div><div class='add'>+    /*      EDQUOT  49      / * Disc quota exceeded                 */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_DQUOT] = EDQUOT;</div><div class='add'>+    gf_errno_to_error_array[EDQUOT] = GF_ERROR_CODE_DQUOT;</div><div class='add'>+</div><div class='add'>+    /* Convergent Error Returns */</div><div class='add'>+    /*      EBADE   50      / * invalid exchange                    */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_BADE] = EBADE;</div><div class='add'>+    gf_errno_to_error_array[EBADE] = GF_ERROR_CODE_BADE;</div><div class='add'>+    /*      EBADR   51      / * invalid request descriptor          */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_BADR] = EBADR;</div><div class='add'>+    gf_errno_to_error_array[EBADR] = GF_ERROR_CODE_BADR;</div><div class='add'>+    /*      EXFULL  52      / * exchange full                       */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_XFULL] = EXFULL;</div><div class='add'>+    gf_errno_to_error_array[EXFULL] = GF_ERROR_CODE_XFULL;</div><div class='add'>+    /*      ENOANO  53      / * no anode                            */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_NOANO] = ENOANO;</div><div class='add'>+    gf_errno_to_error_array[ENOANO] = GF_ERROR_CODE_NOANO;</div><div class='add'>+    /*      EBADRQC 54      / * invalid request code                        */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_BADRQC] = EBADRQC;</div><div class='add'>+    gf_errno_to_error_array[EBADRQC] = GF_ERROR_CODE_BADRQC;</div><div class='add'>+    /*      EBADSLT 55      / * invalid slot                                */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_BADSLT] = EBADSLT;</div><div class='add'>+    gf_errno_to_error_array[EBADSLT] = GF_ERROR_CODE_BADSLT;</div><div class='add'>+    /*      EDEADLOCK 56    / * file locking deadlock error         */</div><div class='add'>+    /* This is same as EDEADLK on linux */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_DEADLK] = EDEADLOCK;</div><div class='add'>+    gf_errno_to_error_array[EDEADLOCK] = GF_ERROR_CODE_DEADLK;</div><div class='add'>+</div><div class='add'>+    /*      EBFONT  57      / * bad font file fmt                   */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_BFONT] = EBFONT;</div><div class='add'>+    gf_errno_to_error_array[EBFONT] = GF_ERROR_CODE_BFONT;</div><div class='add'>+</div><div class='add'>+    /* Interprocess Robust Locks */</div><div class='add'>+    /*      EOWNERDEAD      58      / * process died with the lock */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_OWNERDEAD] = EOWNERDEAD;</div><div class='add'>+    gf_errno_to_error_array[EOWNERDEAD] = GF_ERROR_CODE_OWNERDEAD;</div><div class='add'>+    /*      ENOTRECOVERABLE 59      / * lock is not recoverable */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_NOTRECOVERABLE] = ENOTRECOVERABLE;</div><div class='add'>+    gf_errno_to_error_array[ENOTRECOVERABLE] = GF_ERROR_CODE_NOTRECOVERABLE;</div><div class='add'>+</div><div class='add'>+    /* stream problems */</div><div class='add'>+    /*      ENOSTR  60      / * Device not a stream                 */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_NOSTR] = ENOSTR;</div><div class='add'>+    gf_errno_to_error_array[ENOSTR] = GF_ERROR_CODE_NOSTR;</div><div class='add'>+    /*      ENODATA 61      / * no data (for no delay io)           */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_NODATA] = ENODATA;</div><div class='add'>+    gf_errno_to_error_array[ENODATA] = GF_ERROR_CODE_NODATA;</div><div class='add'>+    /*      ETIME   62      / * timer expired                       */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_TIME] = ETIME;</div><div class='add'>+    gf_errno_to_error_array[ETIME] = GF_ERROR_CODE_TIME;</div><div class='add'>+    /*      ENOSR   63      / * out of streams resources            */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_NOSR] = ENOSR;</div><div class='add'>+    gf_errno_to_error_array[ENOSR] = GF_ERROR_CODE_NOSR;</div><div class='add'>+</div><div class='add'>+    /*      ENONET  64      / * Machine is not on the network       */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_NONET] = ENONET;</div><div class='add'>+    gf_errno_to_error_array[ENONET] = GF_ERROR_CODE_NONET;</div><div class='add'>+    /*      ENOPKG  65      / * Package not installed               */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_NOPKG] = ENOPKG;</div><div class='add'>+    gf_errno_to_error_array[ENOPKG] = GF_ERROR_CODE_NOPKG;</div><div class='add'>+    /*      EREMOTE 66      / * The object is remote                        */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_REMOTE] = EREMOTE;</div><div class='add'>+    gf_errno_to_error_array[EREMOTE] = GF_ERROR_CODE_REMOTE;</div><div class='add'>+    /*      ENOLINK 67      / * the link has been severed           */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_NOLINK] = ENOLINK;</div><div class='add'>+    gf_errno_to_error_array[ENOLINK] = GF_ERROR_CODE_NOLINK;</div><div class='add'>+    /*      EADV    68      / * advertise error                     */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_ADV] = EADV;</div><div class='add'>+    gf_errno_to_error_array[EADV] = GF_ERROR_CODE_ADV;</div><div class='add'>+    /*      ESRMNT  69      / * srmount error                       */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_SRMNT] = ESRMNT;</div><div class='add'>+    gf_errno_to_error_array[ESRMNT] = GF_ERROR_CODE_SRMNT;</div><div class='add'>+</div><div class='add'>+    /*      ECOMM   70      / * Communication error on send         */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_COMM] = ECOMM;</div><div class='add'>+    gf_errno_to_error_array[ECOMM] = GF_ERROR_CODE_COMM;</div><div class='add'>+    /*      EPROTO  71      / * Protocol error                      */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_PROTO] = EPROTO;</div><div class='add'>+    gf_errno_to_error_array[EPROTO] = GF_ERROR_CODE_PROTO;</div><div class='add'>+</div><div class='add'>+    /* Interprocess Robust Locks */</div><div class='add'>+    /*      ELOCKUNMAPPED   72      / * locked lock was unmapped */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_LOCKUNMAPPED] = ELOCKUNMAPPED;</div><div class='add'>+    gf_errno_to_error_array[ELOCKUNMAPPED] = GF_ERROR_CODE_LOCKUNMAPPED;</div><div class='add'>+</div><div class='add'>+    /*      ENOTACTIVE 73   / * Facility is not active              */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_NOTACTIVE] = ENOTACTIVE;</div><div class='add'>+    gf_errno_to_error_array[ENOTACTIVE] = GF_ERROR_CODE_NOTACTIVE;</div><div class='add'>+    /*      EMULTIHOP 74    / * multihop attempted                  */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_MULTIHOP] = EMULTIHOP;</div><div class='add'>+    gf_errno_to_error_array[EMULTIHOP] = GF_ERROR_CODE_MULTIHOP;</div><div class='add'>+    /*      EBADMSG 77      / * trying to read unreadable message   */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_BADMSG] = EBADMSG;</div><div class='add'>+    gf_errno_to_error_array[EBADMSG] = GF_ERROR_CODE_BADMSG;</div><div class='add'>+    /*      ENAMETOOLONG 78 / * path name is too long               */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_NAMETOOLONG] = ENAMETOOLONG;</div><div class='add'>+    gf_errno_to_error_array[ENAMETOOLONG] = GF_ERROR_CODE_NAMETOOLONG;</div><div class='add'>+    /*      EOVERFLOW 79    / * value too large to be stored in data type */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_OVERFLOW] = EOVERFLOW;</div><div class='add'>+    gf_errno_to_error_array[EOVERFLOW] = GF_ERROR_CODE_OVERFLOW;</div><div class='add'>+    /*      ENOTUNIQ 80     / * given log. name not unique          */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_NOTUNIQ] = ENOTUNIQ;</div><div class='add'>+    gf_errno_to_error_array[ENOTUNIQ] = GF_ERROR_CODE_NOTUNIQ;</div><div class='add'>+    /*      EBADFD  81      / * f.d. invalid for this operation     */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_BADFD] = EBADFD;</div><div class='add'>+    gf_errno_to_error_array[EBADFD] = GF_ERROR_CODE_BADFD;</div><div class='add'>+    /*      EREMCHG 82      / * Remote address changed              */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_REMCHG] = EREMCHG;</div><div class='add'>+    gf_errno_to_error_array[EREMCHG] = GF_ERROR_CODE_REMCHG;</div><div class='add'>+</div><div class='add'>+    /* shared library problems */</div><div class='add'>+    /*      ELIBACC 83      / * Can't access a needed shared lib.   */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_LIBACC] = ELIBACC;</div><div class='add'>+    gf_errno_to_error_array[ELIBACC] = GF_ERROR_CODE_LIBACC;</div><div class='add'>+    /*      ELIBBAD 84      / * Accessing a corrupted shared lib.   */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_LIBBAD] = ELIBBAD;</div><div class='add'>+    gf_errno_to_error_array[ELIBBAD] = GF_ERROR_CODE_LIBBAD;</div><div class='add'>+    /*      ELIBSCN 85      / * .lib section in a.out corrupted.    */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_LIBSCN] = ELIBSCN;</div><div class='add'>+    gf_errno_to_error_array[ELIBSCN] = GF_ERROR_CODE_LIBSCN;</div><div class='add'>+    /*      ELIBMAX 86      / * Attempting to link in too many libs.        */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_LIBMAX] = ELIBMAX;</div><div class='add'>+    gf_errno_to_error_array[ELIBMAX] = GF_ERROR_CODE_LIBMAX;</div><div class='add'>+    /*      ELIBEXEC 87     / * Attempting to exec a shared library.        */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_LIBEXEC] = ELIBEXEC;</div><div class='add'>+    gf_errno_to_error_array[ELIBEXEC] = GF_ERROR_CODE_LIBEXEC;</div><div class='add'>+    /*      EILSEQ  88      / * Illegal byte sequence.              */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_ILSEQ] = EILSEQ;</div><div class='add'>+    gf_errno_to_error_array[EILSEQ] = GF_ERROR_CODE_ILSEQ;</div><div class='add'>+    /*      ENOSYS  89      / * Unsupported file system operation   */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_NOSYS] = ENOSYS;</div><div class='add'>+    gf_errno_to_error_array[ENOSYS] = GF_ERROR_CODE_NOSYS;</div><div class='add'>+    /*      ELOOP   90      / * Symbolic link loop                  */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_LOOP] = ELOOP;</div><div class='add'>+    gf_errno_to_error_array[ELOOP] = GF_ERROR_CODE_LOOP;</div><div class='add'>+    /*      ERESTART 91     / * Restartable system call             */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_RESTART] = ERESTART;</div><div class='add'>+    gf_errno_to_error_array[ERESTART] = GF_ERROR_CODE_RESTART;</div><div class='add'>+    /*      ESTRPIPE 92     / * if pipe/FIFO, don't sleep in stream head */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_STRPIPE] = ESTRPIPE;</div><div class='add'>+    gf_errno_to_error_array[ESTRPIPE] = GF_ERROR_CODE_STRPIPE;</div><div class='add'>+    /*      ENOTEMPTY 93    / * directory not empty                 */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_NOTEMPTY] = ENOTEMPTY;</div><div class='add'>+    gf_errno_to_error_array[ENOTEMPTY] = GF_ERROR_CODE_NOTEMPTY;</div><div class='add'>+    /*      EUSERS  94      / * Too many users (for UFS)            */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_USERS] = EUSERS;</div><div class='add'>+    gf_errno_to_error_array[EUSERS] = GF_ERROR_CODE_USERS;</div><div class='add'>+</div><div class='add'>+    /* BSD Networking Software */</div><div class='add'>+    /* argument errors */</div><div class='add'>+    /*      ENOTSOCK        95      / * Socket operation on non-socket */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_NOTSOCK] = ENOTSOCK;</div><div class='add'>+    gf_errno_to_error_array[ENOTSOCK] = GF_ERROR_CODE_NOTSOCK;</div><div class='add'>+    /*      EDESTADDRREQ    96      / * Destination address required */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_DESTADDRREQ] = EDESTADDRREQ;</div><div class='add'>+    gf_errno_to_error_array[EDESTADDRREQ] = GF_ERROR_CODE_DESTADDRREQ;</div><div class='add'>+    /*      EMSGSIZE        97      / * Message too long */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_MSGSIZE] = EMSGSIZE;</div><div class='add'>+    gf_errno_to_error_array[EMSGSIZE] = GF_ERROR_CODE_MSGSIZE;</div><div class='add'>+    /*      EPROTOTYPE      98      / * Protocol wrong type for socket */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_PROTOTYPE] = EPROTOTYPE;</div><div class='add'>+    gf_errno_to_error_array[EPROTOTYPE] = GF_ERROR_CODE_PROTOTYPE;</div><div class='add'>+    /*      ENOPROTOOPT     99      / * Protocol not available */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_NOPROTOOPT] = ENOPROTOOPT;</div><div class='add'>+    gf_errno_to_error_array[ENOPROTOOPT] = GF_ERROR_CODE_NOPROTOOPT;</div><div class='add'>+    /*      EPROTONOSUPPORT 120     / * Protocol not supported */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_PROTONOSUPPORT] = EPROTONOSUPPORT;</div><div class='add'>+    gf_errno_to_error_array[EPROTONOSUPPORT] = GF_ERROR_CODE_PROTONOSUPPORT;</div><div class='add'>+    /*      ESOCKTNOSUPPORT 121     / * Socket type not supported */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_SOCKTNOSUPPORT] = ESOCKTNOSUPPORT;</div><div class='add'>+    gf_errno_to_error_array[ESOCKTNOSUPPORT] = GF_ERROR_CODE_SOCKTNOSUPPORT;</div><div class='add'>+</div><div class='add'>+    /*      EOPNOTSUPP      122     / * Operation not supported on socket */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_OPNOTSUPP] = EOPNOTSUPP;</div><div class='add'>+    gf_errno_to_error_array[EOPNOTSUPP] = GF_ERROR_CODE_OPNOTSUPP;</div><div class='add'>+    /*      EPFNOSUPPORT    123     / * Protocol family not supported */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_PFNOSUPPORT] = EPFNOSUPPORT;</div><div class='add'>+    gf_errno_to_error_array[EPFNOSUPPORT] = GF_ERROR_CODE_PFNOSUPPORT;</div><div class='add'>+    /*      EAFNOSUPPORT    124     / * Address family not supported by */</div><div class='add'>+    /* protocol family */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_AFNOSUPPORT] = EAFNOSUPPORT;</div><div class='add'>+    gf_errno_to_error_array[EAFNOSUPPORT] = GF_ERROR_CODE_AFNOSUPPORT;</div><div class='add'>+    /*      EADDRINUSE      125     / * Address already in use */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_ADDRINUSE] = EADDRINUSE;</div><div class='add'>+    gf_errno_to_error_array[EADDRINUSE] = GF_ERROR_CODE_ADDRINUSE;</div><div class='add'>+    /*      EADDRNOTAVAIL   126     / * Can't assign requested address */</div><div class='add'>+    /* operational errors */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_ADDRNOTAVAIL] = EADDRNOTAVAIL;</div><div class='add'>+    gf_errno_to_error_array[EADDRNOTAVAIL] = GF_ERROR_CODE_ADDRNOTAVAIL;</div><div class='add'>+    /*      ENETDOWN        127     / * Network is down */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_NETDOWN] = ENETDOWN;</div><div class='add'>+    gf_errno_to_error_array[ENETDOWN] = GF_ERROR_CODE_NETDOWN;</div><div class='add'>+    /*      ENETUNREACH     128     / * Network is unreachable */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_NETUNREACH] = ENETUNREACH;</div><div class='add'>+    gf_errno_to_error_array[ENETUNREACH] = GF_ERROR_CODE_NETUNREACH;</div><div class='add'>+    /*      ENETRESET       129     / * Network dropped connection because */</div><div class='add'>+    /* of reset */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_NETRESET] = ENETRESET;</div><div class='add'>+    gf_errno_to_error_array[ENETRESET] = GF_ERROR_CODE_NETRESET;</div><div class='add'>+    /*      ECONNABORTED    130     / * Software caused connection abort */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_CONNABORTED] = ECONNABORTED;</div><div class='add'>+    gf_errno_to_error_array[ECONNABORTED] = GF_ERROR_CODE_CONNABORTED;</div><div class='add'>+    /*      ECONNRESET      131     / * Connection reset by peer */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_CONNRESET] = ECONNRESET;</div><div class='add'>+    gf_errno_to_error_array[ECONNRESET] = GF_ERROR_CODE_CONNRESET;</div><div class='add'>+    /*      ENOBUFS         132     / * No buffer space available */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_NOBUFS] = ENOBUFS;</div><div class='add'>+    gf_errno_to_error_array[ENOBUFS] = GF_ERROR_CODE_NOBUFS;</div><div class='add'>+    /*      EISCONN         133     / * Socket is already connected */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_ISCONN] = EISCONN;</div><div class='add'>+    gf_errno_to_error_array[EISCONN] = GF_ERROR_CODE_ISCONN;</div><div class='add'>+    /*      ENOTCONN        134     / * Socket is not connected */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_NOTCONN] = ENOTCONN;</div><div class='add'>+    gf_errno_to_error_array[ENOTCONN] = GF_ERROR_CODE_NOTCONN;</div><div class='add'>+    /* XENIX has 135 - 142 */</div><div class='add'>+    /*      ESHUTDOWN       143     / * Can't send after socket shutdown */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_SHUTDOWN] = ESHUTDOWN;</div><div class='add'>+    gf_errno_to_error_array[ESHUTDOWN] = GF_ERROR_CODE_SHUTDOWN;</div><div class='add'>+    /*      ETOOMANYREFS    144     / * Too many references: can't splice */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_TOOMANYREFS] = ETOOMANYREFS;</div><div class='add'>+    gf_errno_to_error_array[ETOOMANYREFS] = GF_ERROR_CODE_TOOMANYREFS;</div><div class='add'>+    /*      ETIMEDOUT       145     / * Connection timed out */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_TIMEDOUT] = ETIMEDOUT;</div><div class='add'>+    gf_errno_to_error_array[ETIMEDOUT] = GF_ERROR_CODE_TIMEDOUT;</div><div class='add'>+</div><div class='add'>+    /*      ECONNREFUSED    146     / * Connection refused */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_CONNREFUSED] = ECONNREFUSED;</div><div class='add'>+    gf_errno_to_error_array[ECONNREFUSED] = GF_ERROR_CODE_CONNREFUSED;</div><div class='add'>+    /*      EHOSTDOWN       147     / * Host is down */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_HOSTDOWN] = EHOSTDOWN;</div><div class='add'>+    gf_errno_to_error_array[EHOSTDOWN] = GF_ERROR_CODE_HOSTDOWN;</div><div class='add'>+    /*      EHOSTUNREACH    148     / * No route to host */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_HOSTUNREACH] = EHOSTUNREACH;</div><div class='add'>+    gf_errno_to_error_array[EHOSTUNREACH] = GF_ERROR_CODE_HOSTUNREACH;</div><div class='add'>+    /*      EALREADY        149     / * operation already in progress */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_ALREADY] = EALREADY;</div><div class='add'>+    gf_errno_to_error_array[EALREADY] = GF_ERROR_CODE_ALREADY;</div><div class='add'>+    /*      EINPROGRESS     150     / * operation now in progress */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_INPROGRESS] = EINPROGRESS;</div><div class='add'>+    gf_errno_to_error_array[EINPROGRESS] = GF_ERROR_CODE_INPROGRESS;</div><div class='add'>+</div><div class='add'>+    /* SUN Network File System */</div><div class='add'>+    /*      ESTALE          151     / * Stale NFS file handle */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_STALE] = ESTALE;</div><div class='add'>+    gf_errno_to_error_array[ESTALE] = GF_ERROR_CODE_STALE;</div><div class='add'>+</div><div class='add'>+    return;</div><div class='ctx'> }</div><div class='ctx'> #endif /* GF_SOLARIS_HOST_OS */</div><div class='ctx'> </div><div class='ctx'> #ifdef GF_DARWIN_HOST_OS</div><div class='del'>-static void </div><div class='del'>-init_compat_errno_arrays ()</div><div class='add'>+static void</div><div class='add'>+init_compat_errno_arrays()</div><div class='ctx'> {</div><div class='del'>-  /*    EDEADLK         11              / * Resource deadlock would occur */</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_DEADLK] = EDEADLK;</div><div class='del'>-  gf_errno_to_error_array[EDEADLK] = GF_ERROR_CODE_DEADLK;</div><div class='del'>-</div><div class='del'>-  /*    EAGAIN          35              / * Try Again */</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_AGAIN] = EAGAIN;</div><div class='del'>-  gf_errno_to_error_array[EAGAIN] = GF_ERROR_CODE_AGAIN;</div><div class='del'>-  </div><div class='del'>-  /*	EINPROGRESS	36	        / * Operation now in progress */</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_INPROGRESS] = EINPROGRESS;</div><div class='del'>-  gf_errno_to_error_array[EINPROGRESS] = GF_ERROR_CODE_INPROGRESS;</div><div class='del'>-</div><div class='del'>-  /*	EALREADY	37		/ * Operation already in progress */</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_ALREADY] = EALREADY;</div><div class='del'>-  gf_errno_to_error_array[EALREADY] = GF_ERROR_CODE_ALREADY;</div><div class='del'>-  </div><div class='del'>-  /*	ENOTSOCK	38		/ * Socket operation on non-socket */</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_NOTSOCK] = ENOTSOCK;</div><div class='del'>-  gf_errno_to_error_array[ENOTSOCK] = GF_ERROR_CODE_NOTSOCK;</div><div class='del'>-  </div><div class='del'>-  /*	EDESTADDRREQ	39		/ * Destination address required */</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_DESTADDRREQ] = EDESTADDRREQ;</div><div class='del'>-  gf_errno_to_error_array[EDESTADDRREQ] = GF_ERROR_CODE_DESTADDRREQ;</div><div class='del'>-  </div><div class='del'>-  /*	EMSGSIZE	40		/ * Message too long */</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_MSGSIZE] = EMSGSIZE;</div><div class='del'>-  gf_errno_to_error_array[EMSGSIZE] = GF_ERROR_CODE_MSGSIZE;</div><div class='del'>-  </div><div class='del'>-  /*	EPROTOTYPE	41		/ * Protocol wrong type for socket */</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_PROTOTYPE] = EPROTOTYPE;</div><div class='del'>-  gf_errno_to_error_array[EPROTOTYPE] = GF_ERROR_CODE_PROTOTYPE;</div><div class='del'>-  </div><div class='del'>-  /*	ENOPROTOOPT	42		/ * Protocol not available */</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_NOPROTOOPT] = ENOPROTOOPT;</div><div class='del'>-  gf_errno_to_error_array[ENOPROTOOPT] = GF_ERROR_CODE_NOPROTOOPT;</div><div class='del'>-  </div><div class='del'>-  /*	EPROTONOSUPPORT	43		/ * Protocol not supported */</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_PROTONOSUPPORT] = EPROTONOSUPPORT;</div><div class='del'>-  gf_errno_to_error_array[EPROTONOSUPPORT] = GF_ERROR_CODE_PROTONOSUPPORT;</div><div class='del'>-  </div><div class='del'>-  /*	ESOCKTNOSUPPORT	44		/ * Socket type not supported */</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_SOCKTNOSUPPORT] = ESOCKTNOSUPPORT;</div><div class='del'>-  gf_errno_to_error_array[ESOCKTNOSUPPORT] = GF_ERROR_CODE_SOCKTNOSUPPORT;</div><div class='del'>-</div><div class='del'>-  /*	EOPNOTSUPP	45		/ * Operation not supported */</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_OPNOTSUPP] = EOPNOTSUPP;</div><div class='del'>-  gf_errno_to_error_array[EOPNOTSUPP] = GF_ERROR_CODE_OPNOTSUPP;</div><div class='del'>-</div><div class='del'>-  /*	EPFNOSUPPORT	46		/ * Protocol family not supported */</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_PFNOSUPPORT] = EPFNOSUPPORT;</div><div class='del'>-  gf_errno_to_error_array[EPFNOSUPPORT] = GF_ERROR_CODE_PFNOSUPPORT;</div><div class='del'>-</div><div class='del'>-  /*	EAFNOSUPPORT	47		/ * Address family not supported by protocol family */</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_AFNOSUPPORT] = EAFNOSUPPORT;</div><div class='del'>-  gf_errno_to_error_array[EAFNOSUPPORT] = GF_ERROR_CODE_AFNOSUPPORT;</div><div class='del'>-</div><div class='del'>-  /*	EADDRINUSE	48		/ * Address already in use */</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_ADDRINUSE] = EADDRINUSE;</div><div class='del'>-  gf_errno_to_error_array[EADDRINUSE] = GF_ERROR_CODE_ADDRINUSE;</div><div class='del'>-</div><div class='del'>-  /*	EADDRNOTAVAIL	49		/ * Can't assign requested address */</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_ADDRNOTAVAIL] = EADDRNOTAVAIL;</div><div class='del'>-  gf_errno_to_error_array[EADDRNOTAVAIL] = GF_ERROR_CODE_ADDRNOTAVAIL;</div><div class='del'>-</div><div class='del'>-  /*	ENETDOWN	50		/ * Network is down */</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_NETDOWN] = ENETDOWN;</div><div class='del'>-  gf_errno_to_error_array[ENETDOWN] = GF_ERROR_CODE_NETDOWN;</div><div class='del'>-</div><div class='del'>-  /*	ENETUNREACH	51		/ * Network is unreachable */</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_NETUNREACH] = ENETUNREACH;</div><div class='del'>-  gf_errno_to_error_array[ENETUNREACH] = GF_ERROR_CODE_NETUNREACH;</div><div class='del'>-</div><div class='del'>-  /*	ENETRESET	52		/ * Network dropped connection on reset */</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_NETRESET] = ENETRESET;</div><div class='del'>-  gf_errno_to_error_array[ENETRESET] = GF_ERROR_CODE_NETRESET;</div><div class='del'>-</div><div class='del'>-  /*	ECONNABORTED	53		/ * Software caused connection abort */</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_CONNABORTED] = ECONNABORTED;</div><div class='del'>-  gf_errno_to_error_array[ECONNABORTED] = GF_ERROR_CODE_CONNABORTED;</div><div class='del'>-</div><div class='del'>-  /*	ECONNRESET	54		/ * Connection reset by peer */</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_CONNRESET] = ECONNRESET;</div><div class='del'>-  gf_errno_to_error_array[ECONNRESET] = GF_ERROR_CODE_CONNRESET;</div><div class='del'>-  </div><div class='del'>-  /*	ENOBUFS		55		/ * No buffer space available */</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_NOBUFS] = ENOBUFS;</div><div class='del'>-  gf_errno_to_error_array[ENOBUFS] = GF_ERROR_CODE_NOBUFS;</div><div class='del'>-</div><div class='del'>-  /*	EISCONN		56		/ * Socket is already connected */</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_ISCONN] = EISCONN;</div><div class='del'>-  gf_errno_to_error_array[EISCONN] = GF_ERROR_CODE_ISCONN;</div><div class='del'>-</div><div class='del'>-  /*	ENOTCONN	57		/ * Socket is not connected */</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_NOTCONN] = ENOTCONN;</div><div class='del'>-  gf_errno_to_error_array[ENOTCONN] = GF_ERROR_CODE_NOTCONN;</div><div class='del'>-</div><div class='del'>-  /*	ESHUTDOWN	58		/ * Can't send after socket shutdown */</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_SHUTDOWN] = ESHUTDOWN;</div><div class='del'>-  gf_errno_to_error_array[ESHUTDOWN] = GF_ERROR_CODE_SHUTDOWN;</div><div class='del'>-</div><div class='del'>-  /*	ETOOMANYREFS	59		/ * Too many references: can't splice */</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_TOOMANYREFS] = ETOOMANYREFS;</div><div class='del'>-  gf_errno_to_error_array[ETOOMANYREFS] = GF_ERROR_CODE_TOOMANYREFS;</div><div class='del'>-</div><div class='del'>-  /*	ETIMEDOUT	60		/ * Operation timed out */</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_TIMEDOUT] = ETIMEDOUT;</div><div class='del'>-  gf_errno_to_error_array[ETIMEDOUT] = GF_ERROR_CODE_TIMEDOUT;</div><div class='del'>-</div><div class='del'>-  /*	ECONNREFUSED	61		/ * Connection refused */</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_CONNREFUSED] = ECONNREFUSED;</div><div class='del'>-  gf_errno_to_error_array[ECONNREFUSED] = GF_ERROR_CODE_CONNREFUSED;</div><div class='del'>-</div><div class='del'>-  /*	ELOOP		62		/ * Too many levels of symbolic links */</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_LOOP] = ELOOP;</div><div class='del'>-  gf_errno_to_error_array[ELOOP] = GF_ERROR_CODE_LOOP;</div><div class='del'>-</div><div class='del'>-  /*	ENAMETOOLONG	63		/ * File name too long */</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_NAMETOOLONG] = ENAMETOOLONG;</div><div class='del'>-  gf_errno_to_error_array[ENAMETOOLONG] = GF_ERROR_CODE_NAMETOOLONG;</div><div class='del'>-</div><div class='del'>-  /*	EHOSTDOWN	64		/ * Host is down */</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_HOSTDOWN] = EHOSTDOWN;</div><div class='del'>-  gf_errno_to_error_array[EHOSTDOWN] = GF_ERROR_CODE_HOSTDOWN;</div><div class='del'>-</div><div class='del'>-  /*	EHOSTUNREACH	65		/ * No route to host */</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_HOSTUNREACH] = EHOSTUNREACH;</div><div class='del'>-  gf_errno_to_error_array[EHOSTUNREACH] = GF_ERROR_CODE_HOSTUNREACH;</div><div class='del'>-</div><div class='del'>-  /*	ENOTEMPTY	66		/ * Directory not empty */</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_NOTEMPTY] = ENOTEMPTY;</div><div class='del'>-  gf_errno_to_error_array[ENOTEMPTY] = GF_ERROR_CODE_NOTEMPTY;</div><div class='del'>-</div><div class='del'>-  /*	EPROCLIM	67		/ * Too many processes */</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_PROCLIM] = EPROCLIM;</div><div class='del'>-  gf_errno_to_error_array[EPROCLIM] = GF_ERROR_CODE_PROCLIM;</div><div class='del'>-</div><div class='del'>-  /*	EUSERS		68		/ * Too many users */</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_USERS] = EUSERS;</div><div class='del'>-  gf_errno_to_error_array[EUSERS] = GF_ERROR_CODE_USERS;</div><div class='del'>-</div><div class='del'>-  /*	EDQUOT		69		/ * Disc quota exceeded */</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_DQUOT] = EDQUOT;</div><div class='del'>-  gf_errno_to_error_array[EDQUOT] = GF_ERROR_CODE_DQUOT;</div><div class='del'>-</div><div class='del'>-  /*	ESTALE		70		/ * Stale NFS file handle */</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_STALE] = ESTALE;</div><div class='del'>-  gf_errno_to_error_array[ESTALE] = GF_ERROR_CODE_STALE;</div><div class='del'>-</div><div class='del'>-  /*	EREMOTE		71		/ * Too many levels of remote in path */</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_REMOTE] = EREMOTE;</div><div class='del'>-  gf_errno_to_error_array[EREMOTE] = GF_ERROR_CODE_REMOTE;</div><div class='del'>-</div><div class='del'>-  /*	EBADRPC		72		/ * RPC struct is bad */</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_BADRPC] = EBADRPC;</div><div class='del'>-  gf_errno_to_error_array[EBADRPC] = GF_ERROR_CODE_BADRPC;</div><div class='del'>-</div><div class='del'>-  /*	ERPCMISMATCH	73		/ * RPC version wrong */</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_RPCMISMATCH] = ERPCMISMATCH;</div><div class='del'>-  gf_errno_to_error_array[ERPCMISMATCH] = GF_ERROR_CODE_RPCMISMATCH;</div><div class='del'>-</div><div class='del'>-  /*	EPROGUNAVAIL	74		/ * RPC prog. not avail */</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_PROGUNAVAIL] = EPROGUNAVAIL;</div><div class='del'>-  gf_errno_to_error_array[EPROGUNAVAIL] = GF_ERROR_CODE_PROGUNAVAIL;</div><div class='del'>-</div><div class='del'>-  /*	EPROGMISMATCH	75		/ * Program version wrong */</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_PROGMISMATCH] = EPROGMISMATCH;</div><div class='del'>-  gf_errno_to_error_array[EPROGMISMATCH] = GF_ERROR_CODE_PROGMISMATCH;</div><div class='del'>-</div><div class='del'>-  /*	EPROCUNAVAIL	76		/ * Bad procedure for program */</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_PROCUNAVAIL] = EPROCUNAVAIL;</div><div class='del'>-  gf_errno_to_error_array[EPROCUNAVAIL] = GF_ERROR_CODE_PROCUNAVAIL;</div><div class='del'>-</div><div class='del'>-  /*	ENOLCK		77		/ * No locks available */</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_NOLCK] = ENOLCK;</div><div class='del'>-  gf_errno_to_error_array[ENOLCK] = GF_ERROR_CODE_NOLCK;</div><div class='del'>-</div><div class='del'>-  /*	ENOSYS		78		/ * Function not implemented */</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_NOSYS] = ENOSYS;</div><div class='del'>-  gf_errno_to_error_array[ENOSYS] = GF_ERROR_CODE_NOSYS;</div><div class='del'>-</div><div class='del'>-  /*	EFTYPE		79		/ * Inappropriate file type or format */</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_FTYPE] = EFTYPE;</div><div class='del'>-  gf_errno_to_error_array[EFTYPE] = GF_ERROR_CODE_FTYPE;</div><div class='del'>-</div><div class='del'>-  /*	EAUTH		80		/ * Authentication error */</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_AUTH] = EAUTH;</div><div class='del'>-  gf_errno_to_error_array[EAUTH] = GF_ERROR_CODE_AUTH;</div><div class='del'>-</div><div class='del'>-  /*	ENEEDAUTH	81		/ * Need authenticator */</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_NEEDAUTH] = ENEEDAUTH;</div><div class='del'>-  gf_errno_to_error_array[ENEEDAUTH] = GF_ERROR_CODE_NEEDAUTH;</div><div class='del'>-/* Intelligent device errors */</div><div class='del'>-/*  	EPWROFF		82	/ * Device power is off */</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_PWROFF] = EPWROFF;</div><div class='del'>-  gf_errno_to_error_array[EPWROFF] = GF_ERROR_CODE_PWROFF;</div><div class='del'>-/*  	EDEVERR		83	/ * Device error, e.g. paper out */</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_DEVERR] = EDEVERR;</div><div class='del'>-  gf_errno_to_error_array[EDEVERR] = GF_ERROR_CODE_DEVERR;</div><div class='del'>- </div><div class='del'>-  /*	EOVERFLOW	84		/ * Value too large to be stored in data type */</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_OVERFLOW] = EOVERFLOW;</div><div class='del'>-  gf_errno_to_error_array[EOVERFLOW] = GF_ERROR_CODE_OVERFLOW;</div><div class='del'>-</div><div class='del'>-/* Program loading errors */</div><div class='del'>-/*   EBADEXEC	85	/ * Bad executable */</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_BADEXEC] = EBADEXEC;</div><div class='del'>-  gf_errno_to_error_array[EBADEXEC] = GF_ERROR_CODE_BADEXEC;</div><div class='del'>-</div><div class='del'>-/*   EBADARCH	86	/ * Bad CPU type in executable */</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_BADARCH] = EBADARCH;</div><div class='del'>-  gf_errno_to_error_array[EBADARCH] = GF_ERROR_CODE_BADARCH;</div><div class='del'>-</div><div class='del'>-/*   ESHLIBVERS	87	/ * Shared library version mismatch */</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_SHLIBVERS] = ESHLIBVERS;</div><div class='del'>-  gf_errno_to_error_array[ESHLIBVERS] = GF_ERROR_CODE_SHLIBVERS;</div><div class='del'>-</div><div class='del'>-/*   EBADMACHO	88	/ * Malformed Macho file */</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_BADMACHO] = EBADMACHO;</div><div class='del'>-  gf_errno_to_error_array[EBADMACHO] = GF_ERROR_CODE_BADMACHO;</div><div class='del'>-</div><div class='del'>-#if 0</div><div class='del'>-  /*    EDOOFUS		88		/ * Programming error */</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_DOOFUS] = EDOOFUS;</div><div class='del'>-  gf_errno_to_error_array[EDOOFUS] = GF_ERROR_CODE_DOOFUS;</div><div class='add'>+    /*    EDEADLK         11              / * Resource deadlock would occur */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_DEADLK] = EDEADLK;</div><div class='add'>+    gf_errno_to_error_array[EDEADLK] = GF_ERROR_CODE_DEADLK;</div><div class='add'>+</div><div class='add'>+    /*    EAGAIN          35              / * Try Again */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_AGAIN] = EAGAIN;</div><div class='add'>+    gf_errno_to_error_array[EAGAIN] = GF_ERROR_CODE_AGAIN;</div><div class='add'>+</div><div class='add'>+    /*      EINPROGRESS     36              / * Operation now in progress */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_INPROGRESS] = EINPROGRESS;</div><div class='add'>+    gf_errno_to_error_array[EINPROGRESS] = GF_ERROR_CODE_INPROGRESS;</div><div class='add'>+</div><div class='add'>+    /*      EALREADY        37              / * Operation already in progress */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_ALREADY] = EALREADY;</div><div class='add'>+    gf_errno_to_error_array[EALREADY] = GF_ERROR_CODE_ALREADY;</div><div class='add'>+</div><div class='add'>+    /*      ENOTSOCK        38              / * Socket operation on non-socket</div><div class='add'>+     */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_NOTSOCK] = ENOTSOCK;</div><div class='add'>+    gf_errno_to_error_array[ENOTSOCK] = GF_ERROR_CODE_NOTSOCK;</div><div class='add'>+</div><div class='add'>+    /*      EDESTADDRREQ    39              / * Destination address required */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_DESTADDRREQ] = EDESTADDRREQ;</div><div class='add'>+    gf_errno_to_error_array[EDESTADDRREQ] = GF_ERROR_CODE_DESTADDRREQ;</div><div class='add'>+</div><div class='add'>+    /*      EMSGSIZE        40              / * Message too long */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_MSGSIZE] = EMSGSIZE;</div><div class='add'>+    gf_errno_to_error_array[EMSGSIZE] = GF_ERROR_CODE_MSGSIZE;</div><div class='add'>+</div><div class='add'>+    /*      EPROTOTYPE      41              / * Protocol wrong type for socket</div><div class='add'>+     */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_PROTOTYPE] = EPROTOTYPE;</div><div class='add'>+    gf_errno_to_error_array[EPROTOTYPE] = GF_ERROR_CODE_PROTOTYPE;</div><div class='add'>+</div><div class='add'>+    /*      ENOPROTOOPT     42              / * Protocol not available */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_NOPROTOOPT] = ENOPROTOOPT;</div><div class='add'>+    gf_errno_to_error_array[ENOPROTOOPT] = GF_ERROR_CODE_NOPROTOOPT;</div><div class='add'>+</div><div class='add'>+    /*      EPROTONOSUPPORT 43              / * Protocol not supported */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_PROTONOSUPPORT] = EPROTONOSUPPORT;</div><div class='add'>+    gf_errno_to_error_array[EPROTONOSUPPORT] = GF_ERROR_CODE_PROTONOSUPPORT;</div><div class='add'>+</div><div class='add'>+    /*      ESOCKTNOSUPPORT 44              / * Socket type not supported */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_SOCKTNOSUPPORT] = ESOCKTNOSUPPORT;</div><div class='add'>+    gf_errno_to_error_array[ESOCKTNOSUPPORT] = GF_ERROR_CODE_SOCKTNOSUPPORT;</div><div class='add'>+</div><div class='add'>+    /*      EOPNOTSUPP      45              / * Operation not supported */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_OPNOTSUPP] = EOPNOTSUPP;</div><div class='add'>+    gf_errno_to_error_array[EOPNOTSUPP] = GF_ERROR_CODE_OPNOTSUPP;</div><div class='add'>+</div><div class='add'>+    /*      EPFNOSUPPORT    46              / * Protocol family not supported */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_PFNOSUPPORT] = EPFNOSUPPORT;</div><div class='add'>+    gf_errno_to_error_array[EPFNOSUPPORT] = GF_ERROR_CODE_PFNOSUPPORT;</div><div class='add'>+</div><div class='add'>+    /*      EAFNOSUPPORT    47              / * Address family not supported by</div><div class='add'>+     * protocol family */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_AFNOSUPPORT] = EAFNOSUPPORT;</div><div class='add'>+    gf_errno_to_error_array[EAFNOSUPPORT] = GF_ERROR_CODE_AFNOSUPPORT;</div><div class='add'>+</div><div class='add'>+    /*      EADDRINUSE      48              / * Address already in use */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_ADDRINUSE] = EADDRINUSE;</div><div class='add'>+    gf_errno_to_error_array[EADDRINUSE] = GF_ERROR_CODE_ADDRINUSE;</div><div class='add'>+</div><div class='add'>+    /*      EADDRNOTAVAIL   49              / * Can't assign requested address</div><div class='add'>+     */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_ADDRNOTAVAIL] = EADDRNOTAVAIL;</div><div class='add'>+    gf_errno_to_error_array[EADDRNOTAVAIL] = GF_ERROR_CODE_ADDRNOTAVAIL;</div><div class='add'>+</div><div class='add'>+    /*      ENETDOWN        50              / * Network is down */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_NETDOWN] = ENETDOWN;</div><div class='add'>+    gf_errno_to_error_array[ENETDOWN] = GF_ERROR_CODE_NETDOWN;</div><div class='add'>+</div><div class='add'>+    /*      ENETUNREACH     51              / * Network is unreachable */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_NETUNREACH] = ENETUNREACH;</div><div class='add'>+    gf_errno_to_error_array[ENETUNREACH] = GF_ERROR_CODE_NETUNREACH;</div><div class='add'>+</div><div class='add'>+    /*      ENETRESET       52              / * Network dropped connection on</div><div class='add'>+     * reset */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_NETRESET] = ENETRESET;</div><div class='add'>+    gf_errno_to_error_array[ENETRESET] = GF_ERROR_CODE_NETRESET;</div><div class='add'>+</div><div class='add'>+    /*      ECONNABORTED    53              / * Software caused connection abort</div><div class='add'>+     */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_CONNABORTED] = ECONNABORTED;</div><div class='add'>+    gf_errno_to_error_array[ECONNABORTED] = GF_ERROR_CODE_CONNABORTED;</div><div class='add'>+</div><div class='add'>+    /*      ECONNRESET      54              / * Connection reset by peer */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_CONNRESET] = ECONNRESET;</div><div class='add'>+    gf_errno_to_error_array[ECONNRESET] = GF_ERROR_CODE_CONNRESET;</div><div class='add'>+</div><div class='add'>+    /*      ENOBUFS         55              / * No buffer space available */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_NOBUFS] = ENOBUFS;</div><div class='add'>+    gf_errno_to_error_array[ENOBUFS] = GF_ERROR_CODE_NOBUFS;</div><div class='add'>+</div><div class='add'>+    /*      EISCONN         56              / * Socket is already connected */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_ISCONN] = EISCONN;</div><div class='add'>+    gf_errno_to_error_array[EISCONN] = GF_ERROR_CODE_ISCONN;</div><div class='add'>+</div><div class='add'>+    /*      ENOTCONN        57              / * Socket is not connected */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_NOTCONN] = ENOTCONN;</div><div class='add'>+    gf_errno_to_error_array[ENOTCONN] = GF_ERROR_CODE_NOTCONN;</div><div class='add'>+</div><div class='add'>+    /*      ESHUTDOWN       58              / * Can't send after socket shutdown</div><div class='add'>+     */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_SHUTDOWN] = ESHUTDOWN;</div><div class='add'>+    gf_errno_to_error_array[ESHUTDOWN] = GF_ERROR_CODE_SHUTDOWN;</div><div class='add'>+</div><div class='add'>+    /*      ETOOMANYREFS    59              / * Too many references: can't</div><div class='add'>+     * splice */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_TOOMANYREFS] = ETOOMANYREFS;</div><div class='add'>+    gf_errno_to_error_array[ETOOMANYREFS] = GF_ERROR_CODE_TOOMANYREFS;</div><div class='add'>+</div><div class='add'>+    /*      ETIMEDOUT       60              / * Operation timed out */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_TIMEDOUT] = ETIMEDOUT;</div><div class='add'>+    gf_errno_to_error_array[ETIMEDOUT] = GF_ERROR_CODE_TIMEDOUT;</div><div class='add'>+</div><div class='add'>+    /*      ECONNREFUSED    61              / * Connection refused */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_CONNREFUSED] = ECONNREFUSED;</div><div class='add'>+    gf_errno_to_error_array[ECONNREFUSED] = GF_ERROR_CODE_CONNREFUSED;</div><div class='add'>+</div><div class='add'>+    /*      ELOOP           62              / * Too many levels of symbolic</div><div class='add'>+     * links */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_LOOP] = ELOOP;</div><div class='add'>+    gf_errno_to_error_array[ELOOP] = GF_ERROR_CODE_LOOP;</div><div class='add'>+</div><div class='add'>+    /*      ENAMETOOLONG    63              / * File name too long */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_NAMETOOLONG] = ENAMETOOLONG;</div><div class='add'>+    gf_errno_to_error_array[ENAMETOOLONG] = GF_ERROR_CODE_NAMETOOLONG;</div><div class='add'>+</div><div class='add'>+    /*      EHOSTDOWN       64              / * Host is down */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_HOSTDOWN] = EHOSTDOWN;</div><div class='add'>+    gf_errno_to_error_array[EHOSTDOWN] = GF_ERROR_CODE_HOSTDOWN;</div><div class='add'>+</div><div class='add'>+    /*      EHOSTUNREACH    65              / * No route to host */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_HOSTUNREACH] = EHOSTUNREACH;</div><div class='add'>+    gf_errno_to_error_array[EHOSTUNREACH] = GF_ERROR_CODE_HOSTUNREACH;</div><div class='add'>+</div><div class='add'>+    /*      ENOTEMPTY       66              / * Directory not empty */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_NOTEMPTY] = ENOTEMPTY;</div><div class='add'>+    gf_errno_to_error_array[ENOTEMPTY] = GF_ERROR_CODE_NOTEMPTY;</div><div class='add'>+</div><div class='add'>+    /*      EPROCLIM        67              / * Too many processes */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_PROCLIM] = EPROCLIM;</div><div class='add'>+    gf_errno_to_error_array[EPROCLIM] = GF_ERROR_CODE_PROCLIM;</div><div class='add'>+</div><div class='add'>+    /*      EUSERS          68              / * Too many users */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_USERS] = EUSERS;</div><div class='add'>+    gf_errno_to_error_array[EUSERS] = GF_ERROR_CODE_USERS;</div><div class='add'>+</div><div class='add'>+    /*      EDQUOT          69              / * Disc quota exceeded */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_DQUOT] = EDQUOT;</div><div class='add'>+    gf_errno_to_error_array[EDQUOT] = GF_ERROR_CODE_DQUOT;</div><div class='add'>+</div><div class='add'>+    /*      ESTALE          70              / * Stale NFS file handle */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_STALE] = ESTALE;</div><div class='add'>+    gf_errno_to_error_array[ESTALE] = GF_ERROR_CODE_STALE;</div><div class='add'>+</div><div class='add'>+    /*      EREMOTE         71              / * Too many levels of remote in</div><div class='add'>+     * path */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_REMOTE] = EREMOTE;</div><div class='add'>+    gf_errno_to_error_array[EREMOTE] = GF_ERROR_CODE_REMOTE;</div><div class='add'>+</div><div class='add'>+    /*      EBADRPC         72              / * RPC struct is bad */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_BADRPC] = EBADRPC;</div><div class='add'>+    gf_errno_to_error_array[EBADRPC] = GF_ERROR_CODE_BADRPC;</div><div class='add'>+</div><div class='add'>+    /*      ERPCMISMATCH    73              / * RPC version wrong */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_RPCMISMATCH] = ERPCMISMATCH;</div><div class='add'>+    gf_errno_to_error_array[ERPCMISMATCH] = GF_ERROR_CODE_RPCMISMATCH;</div><div class='add'>+</div><div class='add'>+    /*      EPROGUNAVAIL    74              / * RPC prog. not avail */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_PROGUNAVAIL] = EPROGUNAVAIL;</div><div class='add'>+    gf_errno_to_error_array[EPROGUNAVAIL] = GF_ERROR_CODE_PROGUNAVAIL;</div><div class='add'>+</div><div class='add'>+    /*      EPROGMISMATCH   75              / * Program version wrong */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_PROGMISMATCH] = EPROGMISMATCH;</div><div class='add'>+    gf_errno_to_error_array[EPROGMISMATCH] = GF_ERROR_CODE_PROGMISMATCH;</div><div class='add'>+</div><div class='add'>+    /*      EPROCUNAVAIL    76              / * Bad procedure for program */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_PROCUNAVAIL] = EPROCUNAVAIL;</div><div class='add'>+    gf_errno_to_error_array[EPROCUNAVAIL] = GF_ERROR_CODE_PROCUNAVAIL;</div><div class='add'>+</div><div class='add'>+    /*      ENOLCK          77              / * No locks available */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_NOLCK] = ENOLCK;</div><div class='add'>+    gf_errno_to_error_array[ENOLCK] = GF_ERROR_CODE_NOLCK;</div><div class='add'>+</div><div class='add'>+    /*      ENOSYS          78              / * Function not implemented */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_NOSYS] = ENOSYS;</div><div class='add'>+    gf_errno_to_error_array[ENOSYS] = GF_ERROR_CODE_NOSYS;</div><div class='add'>+</div><div class='add'>+    /*      EFTYPE          79              / * Inappropriate file type or</div><div class='add'>+     * format */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_FTYPE] = EFTYPE;</div><div class='add'>+    gf_errno_to_error_array[EFTYPE] = GF_ERROR_CODE_FTYPE;</div><div class='add'>+</div><div class='add'>+    /*      EAUTH           80              / * Authentication error */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_AUTH] = EAUTH;</div><div class='add'>+    gf_errno_to_error_array[EAUTH] = GF_ERROR_CODE_AUTH;</div><div class='add'>+</div><div class='add'>+    /*      ENEEDAUTH       81              / * Need authenticator */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_NEEDAUTH] = ENEEDAUTH;</div><div class='add'>+    gf_errno_to_error_array[ENEEDAUTH] = GF_ERROR_CODE_NEEDAUTH;</div><div class='add'>+    /* Intelligent device errors */</div><div class='add'>+    /*      EPWROFF         82      / * Device power is off */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_PWROFF] = EPWROFF;</div><div class='add'>+    gf_errno_to_error_array[EPWROFF] = GF_ERROR_CODE_PWROFF;</div><div class='add'>+    /*      EDEVERR         83      / * Device error, e.g. paper out */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_DEVERR] = EDEVERR;</div><div class='add'>+    gf_errno_to_error_array[EDEVERR] = GF_ERROR_CODE_DEVERR;</div><div class='add'>+</div><div class='add'>+    /*      EOVERFLOW       84              / * Value too large to be stored in</div><div class='add'>+     * data type */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_OVERFLOW] = EOVERFLOW;</div><div class='add'>+    gf_errno_to_error_array[EOVERFLOW] = GF_ERROR_CODE_OVERFLOW;</div><div class='add'>+</div><div class='add'>+    /* Program loading errors */</div><div class='add'>+    /*   EBADEXEC   85      / * Bad executable */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_BADEXEC] = EBADEXEC;</div><div class='add'>+    gf_errno_to_error_array[EBADEXEC] = GF_ERROR_CODE_BADEXEC;</div><div class='add'>+</div><div class='add'>+    /*   EBADARCH   86      / * Bad CPU type in executable */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_BADARCH] = EBADARCH;</div><div class='add'>+    gf_errno_to_error_array[EBADARCH] = GF_ERROR_CODE_BADARCH;</div><div class='add'>+</div><div class='add'>+    /*   ESHLIBVERS 87      / * Shared library version mismatch */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_SHLIBVERS] = ESHLIBVERS;</div><div class='add'>+    gf_errno_to_error_array[ESHLIBVERS] = GF_ERROR_CODE_SHLIBVERS;</div><div class='add'>+</div><div class='add'>+    /*   EBADMACHO  88      / * Malformed Macho file */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_BADMACHO] = EBADMACHO;</div><div class='add'>+    gf_errno_to_error_array[EBADMACHO] = GF_ERROR_CODE_BADMACHO;</div><div class='add'>+</div><div class='add'>+#ifdef EDOOFUS</div><div class='add'>+    /*    EDOOFUS           88              / * Programming error */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_DOOFUS] = EDOOFUS;</div><div class='add'>+    gf_errno_to_error_array[EDOOFUS] = GF_ERROR_CODE_DOOFUS;</div><div class='ctx'> #endif</div><div class='ctx'> </div><div class='del'>-  /*  	ECANCELED	89		/ * Operation canceled */</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_CANCELED] = ECANCELED;</div><div class='del'>-  gf_errno_to_error_array[ECANCELED] = GF_ERROR_CODE_CANCELED;</div><div class='del'>-</div><div class='del'>-  /*   EIDRM		90		/ * Identifier removed */</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_IDRM] = EIDRM;</div><div class='del'>-  gf_errno_to_error_array[EIDRM] = GF_ERROR_CODE_IDRM;</div><div class='del'>-  /*   ENOMSG		91		/ * No message of desired type */   </div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_NOMSG] = ENOMSG;</div><div class='del'>-  gf_errno_to_error_array[ENOMSG] = GF_ERROR_CODE_NOMSG;</div><div class='del'>-</div><div class='del'>-  /*   EILSEQ		92		/ * Illegal byte sequence */</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_ILSEQ] = EILSEQ;</div><div class='del'>-  gf_errno_to_error_array[EILSEQ] = GF_ERROR_CODE_ILSEQ;</div><div class='del'>-</div><div class='del'>-  /*   ENOATTR		93		/ * Attribute not found */</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_NOATTR] = ENOATTR;</div><div class='del'>-  gf_errno_to_error_array[ENOATTR] = GF_ERROR_CODE_NOATTR;</div><div class='del'>-</div><div class='del'>-  /*   EBADMSG		94		/ * Bad message */</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_BADMSG] = EBADMSG;</div><div class='del'>-  gf_errno_to_error_array[EBADMSG] = GF_ERROR_CODE_BADMSG;</div><div class='del'>-</div><div class='del'>-  /*   EMULTIHOP	95		/ * Reserved */</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_MULTIHOP] = EMULTIHOP;</div><div class='del'>-  gf_errno_to_error_array[EMULTIHOP] = GF_ERROR_CODE_MULTIHOP;</div><div class='del'>-</div><div class='del'>-  /*  	ENODATA		96		/ * No message available on STREAM */</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_NEEDAUTH] = ENEEDAUTH;</div><div class='del'>-  gf_errno_to_error_array[ENEEDAUTH] = GF_ERROR_CODE_NEEDAUTH;</div><div class='del'>-</div><div class='del'>-  /*   ENOLINK		97		/ * Reserved */</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_NOLINK] = ENOLINK;</div><div class='del'>-  gf_errno_to_error_array[ENOLINK] = GF_ERROR_CODE_NOLINK;</div><div class='del'>-</div><div class='del'>-  /*   ENOSR		98		/ * No STREAM resources */</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_NOSR] = ENOSR;</div><div class='del'>-  gf_errno_to_error_array[ENOSR] = GF_ERROR_CODE_NOSR;</div><div class='del'>-</div><div class='del'>-  /*   ENOSTR		99		/ * Not a STREAM */</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_NOSTR] = ENOSTR;</div><div class='del'>-  gf_errno_to_error_array[ENOSTR] = GF_ERROR_CODE_NOSTR;</div><div class='del'>-</div><div class='del'>-/*  	EPROTO		100		/ * Protocol error */</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_PROTO] = EPROTO;</div><div class='del'>-  gf_errno_to_error_array[EPROTO] = GF_ERROR_CODE_PROTO;</div><div class='del'>-/*   ETIME		101		/ * STREAM ioctl timeout */</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_TIME] = ETIME;</div><div class='del'>-  gf_errno_to_error_array[ETIME] = GF_ERROR_CODE_TIME;</div><div class='del'>-</div><div class='del'>-/* This value is only discrete when compiling __DARWIN_UNIX03, or KERNEL */</div><div class='del'>-/*  	EOPNOTSUPP	102		/ * Operation not supported on socket */</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_OPNOTSUPP] = EOPNOTSUPP;</div><div class='del'>-  gf_errno_to_error_array[EOPNOTSUPP] = GF_ERROR_CODE_OPNOTSUPP;</div><div class='del'>-</div><div class='del'>-/*   ENOPOLICY	103		/ * No such policy registered */</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_NOPOLICY] = ENOPOLICY;</div><div class='del'>-  gf_errno_to_error_array[ENOPOLICY] = GF_ERROR_CODE_NOPOLICY;</div><div class='del'>-</div><div class='del'>-  return ;</div><div class='add'>+    /*      ECANCELED       89              / * Operation canceled */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_CANCELED] = ECANCELED;</div><div class='add'>+    gf_errno_to_error_array[ECANCELED] = GF_ERROR_CODE_CANCELED;</div><div class='add'>+</div><div class='add'>+    /*   EIDRM              90              / * Identifier removed */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_IDRM] = EIDRM;</div><div class='add'>+    gf_errno_to_error_array[EIDRM] = GF_ERROR_CODE_IDRM;</div><div class='add'>+    /*   ENOMSG             91              / * No message of desired type */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_NOMSG] = ENOMSG;</div><div class='add'>+    gf_errno_to_error_array[ENOMSG] = GF_ERROR_CODE_NOMSG;</div><div class='add'>+</div><div class='add'>+    /*   EILSEQ             92              / * Illegal byte sequence */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_ILSEQ] = EILSEQ;</div><div class='add'>+    gf_errno_to_error_array[EILSEQ] = GF_ERROR_CODE_ILSEQ;</div><div class='add'>+</div><div class='add'>+    /*   ENOATTR            93              / * Attribute not found */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_NOATTR] = ENOATTR;</div><div class='add'>+    gf_errno_to_error_array[ENOATTR] = GF_ERROR_CODE_NOATTR;</div><div class='add'>+</div><div class='add'>+    /*   EBADMSG            94              / * Bad message */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_BADMSG] = EBADMSG;</div><div class='add'>+    gf_errno_to_error_array[EBADMSG] = GF_ERROR_CODE_BADMSG;</div><div class='add'>+</div><div class='add'>+    /*   EMULTIHOP  95              / * Reserved */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_MULTIHOP] = EMULTIHOP;</div><div class='add'>+    gf_errno_to_error_array[EMULTIHOP] = GF_ERROR_CODE_MULTIHOP;</div><div class='add'>+</div><div class='add'>+    /*      ENODATA         96              / * No message available on STREAM</div><div class='add'>+     */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_NEEDAUTH] = ENEEDAUTH;</div><div class='add'>+    gf_errno_to_error_array[ENEEDAUTH] = GF_ERROR_CODE_NEEDAUTH;</div><div class='add'>+</div><div class='add'>+    /*   ENOLINK            97              / * Reserved */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_NOLINK] = ENOLINK;</div><div class='add'>+    gf_errno_to_error_array[ENOLINK] = GF_ERROR_CODE_NOLINK;</div><div class='add'>+</div><div class='add'>+    /*   ENOSR              98              / * No STREAM resources */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_NOSR] = ENOSR;</div><div class='add'>+    gf_errno_to_error_array[ENOSR] = GF_ERROR_CODE_NOSR;</div><div class='add'>+</div><div class='add'>+    /*   ENOSTR             99              / * Not a STREAM */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_NOSTR] = ENOSTR;</div><div class='add'>+    gf_errno_to_error_array[ENOSTR] = GF_ERROR_CODE_NOSTR;</div><div class='add'>+</div><div class='add'>+    /*      EPROTO          100             / * Protocol error */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_PROTO] = EPROTO;</div><div class='add'>+    gf_errno_to_error_array[EPROTO] = GF_ERROR_CODE_PROTO;</div><div class='add'>+    /*   ETIME              101             / * STREAM ioctl timeout */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_TIME] = ETIME;</div><div class='add'>+    gf_errno_to_error_array[ETIME] = GF_ERROR_CODE_TIME;</div><div class='add'>+</div><div class='add'>+    /* This value is only discrete when compiling __DARWIN_UNIX03, or KERNEL */</div><div class='add'>+    /*      EOPNOTSUPP      102             / * Operation not supported on</div><div class='add'>+     * socket */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_OPNOTSUPP] = EOPNOTSUPP;</div><div class='add'>+    gf_errno_to_error_array[EOPNOTSUPP] = GF_ERROR_CODE_OPNOTSUPP;</div><div class='add'>+</div><div class='add'>+    /*   ENOPOLICY  103             / * No such policy registered */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_NOPOLICY] = ENOPOLICY;</div><div class='add'>+    gf_errno_to_error_array[ENOPOLICY] = GF_ERROR_CODE_NOPOLICY;</div><div class='add'>+</div><div class='add'>+    return;</div><div class='ctx'> }</div><div class='ctx'> #endif /* GF_DARWIN_HOST_OS */</div><div class='ctx'> </div><div class='ctx'> #ifdef GF_BSD_HOST_OS</div><div class='del'>-static void </div><div class='del'>-init_compat_errno_arrays ()</div><div class='add'>+static void</div><div class='add'>+init_compat_errno_arrays()</div><div class='ctx'> {</div><div class='del'>-  /* Quite a bit of things changed in FreeBSD - current */</div><div class='del'>-</div><div class='del'>-  /*    EAGAIN          35              / * Try Again */</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_AGAIN] = EAGAIN;</div><div class='del'>-  gf_errno_to_error_array[EAGAIN] = GF_ERROR_CODE_AGAIN;</div><div class='del'>-</div><div class='del'>-  /*    EDEADLK         11              / * Resource deadlock would occur */</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_DEADLK] = EDEADLK;</div><div class='del'>-  gf_errno_to_error_array[EDEADLK] = GF_ERROR_CODE_DEADLK;</div><div class='del'>-  </div><div class='del'>-  /*	EINPROGRESS	36	        / * Operation now in progress */</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_INPROGRESS] = EINPROGRESS;</div><div class='del'>-  gf_errno_to_error_array[EINPROGRESS] = GF_ERROR_CODE_INPROGRESS;</div><div class='del'>-</div><div class='del'>-  /*	EALREADY	37		/ * Operation already in progress */</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_ALREADY] = EALREADY;</div><div class='del'>-  gf_errno_to_error_array[EALREADY] = GF_ERROR_CODE_ALREADY;</div><div class='del'>-  </div><div class='del'>-  /*	ENOTSOCK	38		/ * Socket operation on non-socket */</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_NOTSOCK] = ENOTSOCK;</div><div class='del'>-  gf_errno_to_error_array[ENOTSOCK] = GF_ERROR_CODE_NOTSOCK;</div><div class='del'>-  </div><div class='del'>-  /*	EDESTADDRREQ	39		/ * Destination address required */</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_DESTADDRREQ] = EDESTADDRREQ;</div><div class='del'>-  gf_errno_to_error_array[EDESTADDRREQ] = GF_ERROR_CODE_DESTADDRREQ;</div><div class='del'>-  </div><div class='del'>-  /*	EMSGSIZE	40		/ * Message too long */</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_MSGSIZE] = EMSGSIZE;</div><div class='del'>-  gf_errno_to_error_array[EMSGSIZE] = GF_ERROR_CODE_MSGSIZE;</div><div class='del'>-  </div><div class='del'>-  /*	EPROTOTYPE	41		/ * Protocol wrong type for socket */</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_PROTOTYPE] = EPROTOTYPE;</div><div class='del'>-  gf_errno_to_error_array[EPROTOTYPE] = GF_ERROR_CODE_PROTOTYPE;</div><div class='del'>-  </div><div class='del'>-  /*	ENOPROTOOPT	42		/ * Protocol not available */</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_NOPROTOOPT] = ENOPROTOOPT;</div><div class='del'>-  gf_errno_to_error_array[ENOPROTOOPT] = GF_ERROR_CODE_NOPROTOOPT;</div><div class='del'>-  </div><div class='del'>-  /*	EPROTONOSUPPORT	43		/ * Protocol not supported */</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_PROTONOSUPPORT] = EPROTONOSUPPORT;</div><div class='del'>-  gf_errno_to_error_array[EPROTONOSUPPORT] = GF_ERROR_CODE_PROTONOSUPPORT;</div><div class='del'>-  </div><div class='del'>-  /*	ESOCKTNOSUPPORT	44		/ * Socket type not supported */</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_SOCKTNOSUPPORT] = ESOCKTNOSUPPORT;</div><div class='del'>-  gf_errno_to_error_array[ESOCKTNOSUPPORT] = GF_ERROR_CODE_SOCKTNOSUPPORT;</div><div class='del'>-</div><div class='del'>-  /*	EOPNOTSUPP	45		/ * Operation not supported */</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_OPNOTSUPP] = EOPNOTSUPP;</div><div class='del'>-  gf_errno_to_error_array[EOPNOTSUPP] = GF_ERROR_CODE_OPNOTSUPP;</div><div class='del'>-</div><div class='del'>-  /*	EPFNOSUPPORT	46		/ * Protocol family not supported */</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_PFNOSUPPORT] = EPFNOSUPPORT;</div><div class='del'>-  gf_errno_to_error_array[EPFNOSUPPORT] = GF_ERROR_CODE_PFNOSUPPORT;</div><div class='del'>-</div><div class='del'>-  /*	EAFNOSUPPORT	47		/ * Address family not supported by protocol family */</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_AFNOSUPPORT] = EAFNOSUPPORT;</div><div class='del'>-  gf_errno_to_error_array[EAFNOSUPPORT] = GF_ERROR_CODE_AFNOSUPPORT;</div><div class='del'>-</div><div class='del'>-  /*	EADDRINUSE	48		/ * Address already in use */</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_ADDRINUSE] = EADDRINUSE;</div><div class='del'>-  gf_errno_to_error_array[EADDRINUSE] = GF_ERROR_CODE_ADDRINUSE;</div><div class='del'>-</div><div class='del'>-  /*	EADDRNOTAVAIL	49		/ * Can't assign requested address */</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_ADDRNOTAVAIL] = EADDRNOTAVAIL;</div><div class='del'>-  gf_errno_to_error_array[EADDRNOTAVAIL] = GF_ERROR_CODE_ADDRNOTAVAIL;</div><div class='del'>-</div><div class='del'>-  /*	ENETDOWN	50		/ * Network is down */</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_NETDOWN] = ENETDOWN;</div><div class='del'>-  gf_errno_to_error_array[ENETDOWN] = GF_ERROR_CODE_NETDOWN;</div><div class='del'>-</div><div class='del'>-  /*	ENETUNREACH	51		/ * Network is unreachable */</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_NETUNREACH] = ENETUNREACH;</div><div class='del'>-  gf_errno_to_error_array[ENETUNREACH] = GF_ERROR_CODE_NETUNREACH;</div><div class='del'>-</div><div class='del'>-  /*	ENETRESET	52		/ * Network dropped connection on reset */</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_NETRESET] = ENETRESET;</div><div class='del'>-  gf_errno_to_error_array[ENETRESET] = GF_ERROR_CODE_NETRESET;</div><div class='del'>-</div><div class='del'>-  /*	ECONNABORTED	53		/ * Software caused connection abort */</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_CONNABORTED] = ECONNABORTED;</div><div class='del'>-  gf_errno_to_error_array[ECONNABORTED] = GF_ERROR_CODE_CONNABORTED;</div><div class='del'>-</div><div class='del'>-  /*	ECONNRESET	54		/ * Connection reset by peer */</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_CONNRESET] = ECONNRESET;</div><div class='del'>-  gf_errno_to_error_array[ECONNRESET] = GF_ERROR_CODE_CONNRESET;</div><div class='del'>-  </div><div class='del'>-  /*	ENOBUFS		55		/ * No buffer space available */</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_NOBUFS] = ENOBUFS;</div><div class='del'>-  gf_errno_to_error_array[ENOBUFS] = GF_ERROR_CODE_NOBUFS;</div><div class='del'>-</div><div class='del'>-  /*	EISCONN		56		/ * Socket is already connected */</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_ISCONN] = EISCONN;</div><div class='del'>-  gf_errno_to_error_array[EISCONN] = GF_ERROR_CODE_ISCONN;</div><div class='del'>-</div><div class='del'>-  /*	ENOTCONN	57		/ * Socket is not connected */</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_NOTCONN] = ENOTCONN;</div><div class='del'>-  gf_errno_to_error_array[ENOTCONN] = GF_ERROR_CODE_NOTCONN;</div><div class='del'>-</div><div class='del'>-  /*	ESHUTDOWN	58		/ * Can't send after socket shutdown */</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_SHUTDOWN] = ESHUTDOWN;</div><div class='del'>-  gf_errno_to_error_array[ESHUTDOWN] = GF_ERROR_CODE_SHUTDOWN;</div><div class='del'>-</div><div class='del'>-  /*	ETOOMANYREFS	59		/ * Too many references: can't splice */</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_TOOMANYREFS] = ETOOMANYREFS;</div><div class='del'>-  gf_errno_to_error_array[ETOOMANYREFS] = GF_ERROR_CODE_TOOMANYREFS;</div><div class='del'>-</div><div class='del'>-  /*	ETIMEDOUT	60		/ * Operation timed out */</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_TIMEDOUT] = ETIMEDOUT;</div><div class='del'>-  gf_errno_to_error_array[ETIMEDOUT] = GF_ERROR_CODE_TIMEDOUT;</div><div class='del'>-</div><div class='del'>-  /*	ECONNREFUSED	61		/ * Connection refused */</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_CONNREFUSED] = ECONNREFUSED;</div><div class='del'>-  gf_errno_to_error_array[ECONNREFUSED] = GF_ERROR_CODE_CONNREFUSED;</div><div class='del'>-</div><div class='del'>-  /*	ELOOP		62		/ * Too many levels of symbolic links */</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_LOOP] = ELOOP;</div><div class='del'>-  gf_errno_to_error_array[ELOOP] = GF_ERROR_CODE_LOOP;</div><div class='del'>-</div><div class='del'>-  /*	ENAMETOOLONG	63		/ * File name too long */</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_NAMETOOLONG] = ENAMETOOLONG;</div><div class='del'>-  gf_errno_to_error_array[ENAMETOOLONG] = GF_ERROR_CODE_NAMETOOLONG;</div><div class='del'>-</div><div class='del'>-  /*	EHOSTDOWN	64		/ * Host is down */</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_HOSTDOWN] = EHOSTDOWN;</div><div class='del'>-  gf_errno_to_error_array[EHOSTDOWN] = GF_ERROR_CODE_HOSTDOWN;</div><div class='del'>-</div><div class='del'>-  /*	EHOSTUNREACH	65		/ * No route to host */</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_HOSTUNREACH] = EHOSTUNREACH;</div><div class='del'>-  gf_errno_to_error_array[EHOSTUNREACH] = GF_ERROR_CODE_HOSTUNREACH;</div><div class='del'>-</div><div class='del'>-  /*	ENOTEMPTY	66		/ * Directory not empty */</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_NOTEMPTY] = ENOTEMPTY;</div><div class='del'>-  gf_errno_to_error_array[ENOTEMPTY] = GF_ERROR_CODE_NOTEMPTY;</div><div class='del'>-</div><div class='del'>-  /*	EPROCLIM	67		/ * Too many processes */</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_PROCLIM] = EPROCLIM;</div><div class='del'>-  gf_errno_to_error_array[EPROCLIM] = GF_ERROR_CODE_PROCLIM;</div><div class='del'>-</div><div class='del'>-  /*	EUSERS		68		/ * Too many users */</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_USERS] = EUSERS;</div><div class='del'>-  gf_errno_to_error_array[EUSERS] = GF_ERROR_CODE_USERS;</div><div class='del'>-</div><div class='del'>-  /*	EDQUOT		69		/ * Disc quota exceeded */</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_DQUOT] = EDQUOT;</div><div class='del'>-  gf_errno_to_error_array[EDQUOT] = GF_ERROR_CODE_DQUOT;</div><div class='del'>-</div><div class='del'>-  /*	ESTALE		70		/ * Stale NFS file handle */</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_STALE] = ESTALE;</div><div class='del'>-  gf_errno_to_error_array[ESTALE] = GF_ERROR_CODE_STALE;</div><div class='del'>-</div><div class='del'>-  /*	EREMOTE		71		/ * Too many levels of remote in path */</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_REMOTE] = EREMOTE;</div><div class='del'>-  gf_errno_to_error_array[EREMOTE] = GF_ERROR_CODE_REMOTE;</div><div class='del'>-</div><div class='del'>-  /*	EBADRPC		72		/ * RPC struct is bad */</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_BADRPC] = EBADRPC;</div><div class='del'>-  gf_errno_to_error_array[EBADRPC] = GF_ERROR_CODE_BADRPC;</div><div class='del'>-</div><div class='del'>-  /*	ERPCMISMATCH	73		/ * RPC version wrong */</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_RPCMISMATCH] = ERPCMISMATCH;</div><div class='del'>-  gf_errno_to_error_array[ERPCMISMATCH] = GF_ERROR_CODE_RPCMISMATCH;</div><div class='del'>-</div><div class='del'>-  /*	EPROGUNAVAIL	74		/ * RPC prog. not avail */</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_PROGUNAVAIL] = EPROGUNAVAIL;</div><div class='del'>-  gf_errno_to_error_array[EPROGUNAVAIL] = GF_ERROR_CODE_PROGUNAVAIL;</div><div class='del'>-</div><div class='del'>-  /*	EPROGMISMATCH	75		/ * Program version wrong */</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_PROGMISMATCH] = EPROGMISMATCH;</div><div class='del'>-  gf_errno_to_error_array[EPROGMISMATCH] = GF_ERROR_CODE_PROGMISMATCH;</div><div class='del'>-</div><div class='del'>-  /*	EPROCUNAVAIL	76		/ * Bad procedure for program */</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_PROCUNAVAIL] = EPROCUNAVAIL;</div><div class='del'>-  gf_errno_to_error_array[EPROCUNAVAIL] = GF_ERROR_CODE_PROCUNAVAIL;</div><div class='del'>-</div><div class='del'>-  /*	ENOLCK		77		/ * No locks available */</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_NOLCK] = ENOLCK;</div><div class='del'>-  gf_errno_to_error_array[ENOLCK] = GF_ERROR_CODE_NOLCK;</div><div class='del'>-</div><div class='del'>-  /*	ENOSYS		78		/ * Function not implemented */</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_NOSYS] = ENOSYS;</div><div class='del'>-  gf_errno_to_error_array[ENOSYS] = GF_ERROR_CODE_NOSYS;</div><div class='del'>-</div><div class='del'>-  /*	EFTYPE		79		/ * Inappropriate file type or format */</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_FTYPE] = EFTYPE;</div><div class='del'>-  gf_errno_to_error_array[EFTYPE] = GF_ERROR_CODE_FTYPE;</div><div class='del'>-</div><div class='del'>-  /*	EAUTH		80		/ * Authentication error */</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_AUTH] = EAUTH;</div><div class='del'>-  gf_errno_to_error_array[EAUTH] = GF_ERROR_CODE_AUTH;</div><div class='del'>-</div><div class='del'>-  /*	ENEEDAUTH	81		/ * Need authenticator */</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_NEEDAUTH] = ENEEDAUTH;</div><div class='del'>-  gf_errno_to_error_array[ENEEDAUTH] = GF_ERROR_CODE_NEEDAUTH;</div><div class='del'>-</div><div class='del'>-  /*	EIDRM		82		/ * Identifier removed */</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_IDRM] = EIDRM;</div><div class='del'>-  gf_errno_to_error_array[EIDRM] = GF_ERROR_CODE_IDRM;</div><div class='del'>-</div><div class='del'>-  /*	ENOMSG		83		/ * No message of desired type */</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_NOMSG] = ENOMSG;</div><div class='del'>-  gf_errno_to_error_array[ENOMSG] = GF_ERROR_CODE_NOMSG;</div><div class='del'>-</div><div class='del'>-  /*	EOVERFLOW	84		/ * Value too large to be stored in data type */</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_OVERFLOW] = EOVERFLOW;</div><div class='del'>-  gf_errno_to_error_array[EOVERFLOW] = GF_ERROR_CODE_OVERFLOW;</div><div class='del'>-</div><div class='del'>-  /*	ECANCELED	85		/ * Operation canceled */</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_CANCELED] = ECANCELED;</div><div class='del'>-  gf_errno_to_error_array[ECANCELED] = GF_ERROR_CODE_CANCELED;</div><div class='del'>-</div><div class='del'>-  /*	EILSEQ		86		/ * Illegal byte sequence */</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_ILSEQ] = EILSEQ;</div><div class='del'>-  gf_errno_to_error_array[EILSEQ] = GF_ERROR_CODE_ILSEQ;</div><div class='del'>-</div><div class='del'>-  /*	ENOATTR		87		/ * Attribute not found */</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_NOATTR] = ENOATTR;</div><div class='del'>-  gf_errno_to_error_array[ENOATTR] = GF_ERROR_CODE_NOATTR;</div><div class='del'>-  </div><div class='del'>-  /*    EDOOFUS		88		/ * Programming error */</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_DOOFUS] = EDOOFUS;</div><div class='del'>-  gf_errno_to_error_array[EDOOFUS] = GF_ERROR_CODE_DOOFUS;</div><div class='add'>+    /* Quite a bit of things changed in FreeBSD - current */</div><div class='add'>+</div><div class='add'>+    /*    EAGAIN          35              / * Try Again */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_AGAIN] = EAGAIN;</div><div class='add'>+    gf_errno_to_error_array[EAGAIN] = GF_ERROR_CODE_AGAIN;</div><div class='add'>+</div><div class='add'>+    /*    EDEADLK         11              / * Resource deadlock would occur */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_DEADLK] = EDEADLK;</div><div class='add'>+    gf_errno_to_error_array[EDEADLK] = GF_ERROR_CODE_DEADLK;</div><div class='add'>+</div><div class='add'>+    /*      EINPROGRESS     36              / * Operation now in progress */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_INPROGRESS] = EINPROGRESS;</div><div class='add'>+    gf_errno_to_error_array[EINPROGRESS] = GF_ERROR_CODE_INPROGRESS;</div><div class='add'>+</div><div class='add'>+    /*      EALREADY        37              / * Operation already in progress */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_ALREADY] = EALREADY;</div><div class='add'>+    gf_errno_to_error_array[EALREADY] = GF_ERROR_CODE_ALREADY;</div><div class='add'>+</div><div class='add'>+    /*      ENOTSOCK        38              / * Socket operation on non-socket</div><div class='add'>+     */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_NOTSOCK] = ENOTSOCK;</div><div class='add'>+    gf_errno_to_error_array[ENOTSOCK] = GF_ERROR_CODE_NOTSOCK;</div><div class='add'>+</div><div class='add'>+    /*      EDESTADDRREQ    39              / * Destination address required */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_DESTADDRREQ] = EDESTADDRREQ;</div><div class='add'>+    gf_errno_to_error_array[EDESTADDRREQ] = GF_ERROR_CODE_DESTADDRREQ;</div><div class='add'>+</div><div class='add'>+    /*      EMSGSIZE        40              / * Message too long */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_MSGSIZE] = EMSGSIZE;</div><div class='add'>+    gf_errno_to_error_array[EMSGSIZE] = GF_ERROR_CODE_MSGSIZE;</div><div class='add'>+</div><div class='add'>+    /*      EPROTOTYPE      41              / * Protocol wrong type for socket</div><div class='add'>+     */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_PROTOTYPE] = EPROTOTYPE;</div><div class='add'>+    gf_errno_to_error_array[EPROTOTYPE] = GF_ERROR_CODE_PROTOTYPE;</div><div class='add'>+</div><div class='add'>+    /*      ENOPROTOOPT     42              / * Protocol not available */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_NOPROTOOPT] = ENOPROTOOPT;</div><div class='add'>+    gf_errno_to_error_array[ENOPROTOOPT] = GF_ERROR_CODE_NOPROTOOPT;</div><div class='add'>+</div><div class='add'>+    /*      EPROTONOSUPPORT 43              / * Protocol not supported */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_PROTONOSUPPORT] = EPROTONOSUPPORT;</div><div class='add'>+    gf_errno_to_error_array[EPROTONOSUPPORT] = GF_ERROR_CODE_PROTONOSUPPORT;</div><div class='add'>+</div><div class='add'>+    /*      ESOCKTNOSUPPORT 44              / * Socket type not supported */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_SOCKTNOSUPPORT] = ESOCKTNOSUPPORT;</div><div class='add'>+    gf_errno_to_error_array[ESOCKTNOSUPPORT] = GF_ERROR_CODE_SOCKTNOSUPPORT;</div><div class='add'>+</div><div class='add'>+    /*      EOPNOTSUPP      45              / * Operation not supported */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_OPNOTSUPP] = EOPNOTSUPP;</div><div class='add'>+    gf_errno_to_error_array[EOPNOTSUPP] = GF_ERROR_CODE_OPNOTSUPP;</div><div class='add'>+</div><div class='add'>+    /*      EPFNOSUPPORT    46              / * Protocol family not supported */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_PFNOSUPPORT] = EPFNOSUPPORT;</div><div class='add'>+    gf_errno_to_error_array[EPFNOSUPPORT] = GF_ERROR_CODE_PFNOSUPPORT;</div><div class='add'>+</div><div class='add'>+    /*      EAFNOSUPPORT    47              / * Address family not supported by</div><div class='add'>+     * protocol family */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_AFNOSUPPORT] = EAFNOSUPPORT;</div><div class='add'>+    gf_errno_to_error_array[EAFNOSUPPORT] = GF_ERROR_CODE_AFNOSUPPORT;</div><div class='add'>+</div><div class='add'>+    /*      EADDRINUSE      48              / * Address already in use */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_ADDRINUSE] = EADDRINUSE;</div><div class='add'>+    gf_errno_to_error_array[EADDRINUSE] = GF_ERROR_CODE_ADDRINUSE;</div><div class='add'>+</div><div class='add'>+    /*      EADDRNOTAVAIL   49              / * Can't assign requested address</div><div class='add'>+     */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_ADDRNOTAVAIL] = EADDRNOTAVAIL;</div><div class='add'>+    gf_errno_to_error_array[EADDRNOTAVAIL] = GF_ERROR_CODE_ADDRNOTAVAIL;</div><div class='add'>+</div><div class='add'>+    /*      ENETDOWN        50              / * Network is down */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_NETDOWN] = ENETDOWN;</div><div class='add'>+    gf_errno_to_error_array[ENETDOWN] = GF_ERROR_CODE_NETDOWN;</div><div class='add'>+</div><div class='add'>+    /*      ENETUNREACH     51              / * Network is unreachable */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_NETUNREACH] = ENETUNREACH;</div><div class='add'>+    gf_errno_to_error_array[ENETUNREACH] = GF_ERROR_CODE_NETUNREACH;</div><div class='add'>+</div><div class='add'>+    /*      ENETRESET       52              / * Network dropped connection on</div><div class='add'>+     * reset */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_NETRESET] = ENETRESET;</div><div class='add'>+    gf_errno_to_error_array[ENETRESET] = GF_ERROR_CODE_NETRESET;</div><div class='add'>+</div><div class='add'>+    /*      ECONNABORTED    53              / * Software caused connection abort</div><div class='add'>+     */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_CONNABORTED] = ECONNABORTED;</div><div class='add'>+    gf_errno_to_error_array[ECONNABORTED] = GF_ERROR_CODE_CONNABORTED;</div><div class='add'>+</div><div class='add'>+    /*      ECONNRESET      54              / * Connection reset by peer */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_CONNRESET] = ECONNRESET;</div><div class='add'>+    gf_errno_to_error_array[ECONNRESET] = GF_ERROR_CODE_CONNRESET;</div><div class='add'>+</div><div class='add'>+    /*      ENOBUFS         55              / * No buffer space available */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_NOBUFS] = ENOBUFS;</div><div class='add'>+    gf_errno_to_error_array[ENOBUFS] = GF_ERROR_CODE_NOBUFS;</div><div class='add'>+</div><div class='add'>+    /*      EISCONN         56              / * Socket is already connected */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_ISCONN] = EISCONN;</div><div class='add'>+    gf_errno_to_error_array[EISCONN] = GF_ERROR_CODE_ISCONN;</div><div class='add'>+</div><div class='add'>+    /*      ENOTCONN        57              / * Socket is not connected */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_NOTCONN] = ENOTCONN;</div><div class='add'>+    gf_errno_to_error_array[ENOTCONN] = GF_ERROR_CODE_NOTCONN;</div><div class='add'>+</div><div class='add'>+    /*      ESHUTDOWN       58              / * Can't send after socket shutdown</div><div class='add'>+     */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_SHUTDOWN] = ESHUTDOWN;</div><div class='add'>+    gf_errno_to_error_array[ESHUTDOWN] = GF_ERROR_CODE_SHUTDOWN;</div><div class='add'>+</div><div class='add'>+    /*      ETOOMANYREFS    59              / * Too many references: can't</div><div class='add'>+     * splice */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_TOOMANYREFS] = ETOOMANYREFS;</div><div class='add'>+    gf_errno_to_error_array[ETOOMANYREFS] = GF_ERROR_CODE_TOOMANYREFS;</div><div class='add'>+</div><div class='add'>+    /*      ETIMEDOUT       60              / * Operation timed out */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_TIMEDOUT] = ETIMEDOUT;</div><div class='add'>+    gf_errno_to_error_array[ETIMEDOUT] = GF_ERROR_CODE_TIMEDOUT;</div><div class='add'>+</div><div class='add'>+    /*      ECONNREFUSED    61              / * Connection refused */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_CONNREFUSED] = ECONNREFUSED;</div><div class='add'>+    gf_errno_to_error_array[ECONNREFUSED] = GF_ERROR_CODE_CONNREFUSED;</div><div class='add'>+</div><div class='add'>+    /*      ELOOP           62              / * Too many levels of symbolic</div><div class='add'>+     * links */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_LOOP] = ELOOP;</div><div class='add'>+    gf_errno_to_error_array[ELOOP] = GF_ERROR_CODE_LOOP;</div><div class='add'>+</div><div class='add'>+    /*      ENAMETOOLONG    63              / * File name too long */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_NAMETOOLONG] = ENAMETOOLONG;</div><div class='add'>+    gf_errno_to_error_array[ENAMETOOLONG] = GF_ERROR_CODE_NAMETOOLONG;</div><div class='add'>+</div><div class='add'>+    /*      EHOSTDOWN       64              / * Host is down */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_HOSTDOWN] = EHOSTDOWN;</div><div class='add'>+    gf_errno_to_error_array[EHOSTDOWN] = GF_ERROR_CODE_HOSTDOWN;</div><div class='add'>+</div><div class='add'>+    /*      EHOSTUNREACH    65              / * No route to host */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_HOSTUNREACH] = EHOSTUNREACH;</div><div class='add'>+    gf_errno_to_error_array[EHOSTUNREACH] = GF_ERROR_CODE_HOSTUNREACH;</div><div class='add'>+</div><div class='add'>+    /*      ENOTEMPTY       66              / * Directory not empty */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_NOTEMPTY] = ENOTEMPTY;</div><div class='add'>+    gf_errno_to_error_array[ENOTEMPTY] = GF_ERROR_CODE_NOTEMPTY;</div><div class='add'>+</div><div class='add'>+    /*      EPROCLIM        67              / * Too many processes */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_PROCLIM] = EPROCLIM;</div><div class='add'>+    gf_errno_to_error_array[EPROCLIM] = GF_ERROR_CODE_PROCLIM;</div><div class='add'>+</div><div class='add'>+    /*      EUSERS          68              / * Too many users */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_USERS] = EUSERS;</div><div class='add'>+    gf_errno_to_error_array[EUSERS] = GF_ERROR_CODE_USERS;</div><div class='add'>+</div><div class='add'>+    /*      EDQUOT          69              / * Disc quota exceeded */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_DQUOT] = EDQUOT;</div><div class='add'>+    gf_errno_to_error_array[EDQUOT] = GF_ERROR_CODE_DQUOT;</div><div class='add'>+</div><div class='add'>+    /*      ESTALE          70              / * Stale NFS file handle */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_STALE] = ESTALE;</div><div class='add'>+    gf_errno_to_error_array[ESTALE] = GF_ERROR_CODE_STALE;</div><div class='add'>+</div><div class='add'>+    /*      EREMOTE         71              / * Too many levels of remote in</div><div class='add'>+     * path */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_REMOTE] = EREMOTE;</div><div class='add'>+    gf_errno_to_error_array[EREMOTE] = GF_ERROR_CODE_REMOTE;</div><div class='add'>+</div><div class='add'>+    /*      EBADRPC         72              / * RPC struct is bad */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_BADRPC] = EBADRPC;</div><div class='add'>+    gf_errno_to_error_array[EBADRPC] = GF_ERROR_CODE_BADRPC;</div><div class='add'>+</div><div class='add'>+    /*      ERPCMISMATCH    73              / * RPC version wrong */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_RPCMISMATCH] = ERPCMISMATCH;</div><div class='add'>+    gf_errno_to_error_array[ERPCMISMATCH] = GF_ERROR_CODE_RPCMISMATCH;</div><div class='add'>+</div><div class='add'>+    /*      EPROGUNAVAIL    74              / * RPC prog. not avail */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_PROGUNAVAIL] = EPROGUNAVAIL;</div><div class='add'>+    gf_errno_to_error_array[EPROGUNAVAIL] = GF_ERROR_CODE_PROGUNAVAIL;</div><div class='add'>+</div><div class='add'>+    /*      EPROGMISMATCH   75              / * Program version wrong */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_PROGMISMATCH] = EPROGMISMATCH;</div><div class='add'>+    gf_errno_to_error_array[EPROGMISMATCH] = GF_ERROR_CODE_PROGMISMATCH;</div><div class='add'>+</div><div class='add'>+    /*      EPROCUNAVAIL    76              / * Bad procedure for program */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_PROCUNAVAIL] = EPROCUNAVAIL;</div><div class='add'>+    gf_errno_to_error_array[EPROCUNAVAIL] = GF_ERROR_CODE_PROCUNAVAIL;</div><div class='add'>+</div><div class='add'>+    /*      ENOLCK          77              / * No locks available */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_NOLCK] = ENOLCK;</div><div class='add'>+    gf_errno_to_error_array[ENOLCK] = GF_ERROR_CODE_NOLCK;</div><div class='add'>+</div><div class='add'>+    /*      ENOSYS          78              / * Function not implemented */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_NOSYS] = ENOSYS;</div><div class='add'>+    gf_errno_to_error_array[ENOSYS] = GF_ERROR_CODE_NOSYS;</div><div class='add'>+</div><div class='add'>+    /*      EFTYPE          79              / * Inappropriate file type or</div><div class='add'>+     * format */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_FTYPE] = EFTYPE;</div><div class='add'>+    gf_errno_to_error_array[EFTYPE] = GF_ERROR_CODE_FTYPE;</div><div class='add'>+</div><div class='add'>+    /*      EAUTH           80              / * Authentication error */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_AUTH] = EAUTH;</div><div class='add'>+    gf_errno_to_error_array[EAUTH] = GF_ERROR_CODE_AUTH;</div><div class='add'>+</div><div class='add'>+    /*      ENEEDAUTH       81              / * Need authenticator */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_NEEDAUTH] = ENEEDAUTH;</div><div class='add'>+    gf_errno_to_error_array[ENEEDAUTH] = GF_ERROR_CODE_NEEDAUTH;</div><div class='add'>+</div><div class='add'>+    /*      EIDRM           82              / * Identifier removed */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_IDRM] = EIDRM;</div><div class='add'>+    gf_errno_to_error_array[EIDRM] = GF_ERROR_CODE_IDRM;</div><div class='add'>+</div><div class='add'>+    /*      ENOMSG          83              / * No message of desired type */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_NOMSG] = ENOMSG;</div><div class='add'>+    gf_errno_to_error_array[ENOMSG] = GF_ERROR_CODE_NOMSG;</div><div class='add'>+</div><div class='add'>+    /*      EOVERFLOW       84              / * Value too large to be stored in</div><div class='add'>+     * data type */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_OVERFLOW] = EOVERFLOW;</div><div class='add'>+    gf_errno_to_error_array[EOVERFLOW] = GF_ERROR_CODE_OVERFLOW;</div><div class='add'>+</div><div class='add'>+    /*      ECANCELED       85              / * Operation canceled */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_CANCELED] = ECANCELED;</div><div class='add'>+    gf_errno_to_error_array[ECANCELED] = GF_ERROR_CODE_CANCELED;</div><div class='add'>+</div><div class='add'>+    /*      EILSEQ          86              / * Illegal byte sequence */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_ILSEQ] = EILSEQ;</div><div class='add'>+    gf_errno_to_error_array[EILSEQ] = GF_ERROR_CODE_ILSEQ;</div><div class='add'>+</div><div class='add'>+    /*      ENOATTR         87              / * Attribute not found */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_NOATTR] = ENOATTR;</div><div class='add'>+    gf_errno_to_error_array[ENOATTR] = GF_ERROR_CODE_NOATTR;</div><div class='add'>+</div><div class='add'>+#ifdef EDOOFUS</div><div class='add'>+    /*    EDOOFUS           88              / * Programming error */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_DOOFUS] = EDOOFUS;</div><div class='add'>+    gf_errno_to_error_array[EDOOFUS] = GF_ERROR_CODE_DOOFUS;</div><div class='add'>+#endif</div><div class='ctx'> </div><div class='del'>-  /*	EBADMSG		89		/ * Bad message */</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_BADMSG] = EBADMSG;</div><div class='del'>-  gf_errno_to_error_array[EBADMSG] = GF_ERROR_CODE_BADMSG;</div><div class='add'>+    /*      EBADMSG         89              / * Bad message */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_BADMSG] = EBADMSG;</div><div class='add'>+    gf_errno_to_error_array[EBADMSG] = GF_ERROR_CODE_BADMSG;</div><div class='ctx'> </div><div class='del'>-  /*	EMULTIHOP	90		/ * Multihop attempted */</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_MULTIHOP] = EMULTIHOP;</div><div class='del'>-  gf_errno_to_error_array[EMULTIHOP] = GF_ERROR_CODE_MULTIHOP;</div><div class='add'>+#ifdef __NetBSD__</div><div class='add'>+    /*      ENODATA         89              / * No message available */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_NODATA] = ENODATA;</div><div class='add'>+    gf_errno_to_error_array[ENODATA] = GF_ERROR_CODE_NODATA;</div><div class='add'>+#endif</div><div class='ctx'> </div><div class='del'>-  /*	ENOLINK		91		/ * Link has been severed */</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_NOLINK] = ENOLINK;</div><div class='del'>-  gf_errno_to_error_array[ENOLINK] = GF_ERROR_CODE_NOLINK;</div><div class='add'>+    /*      EMULTIHOP       90              / * Multihop attempted */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_MULTIHOP] = EMULTIHOP;</div><div class='add'>+    gf_errno_to_error_array[EMULTIHOP] = GF_ERROR_CODE_MULTIHOP;</div><div class='ctx'> </div><div class='del'>-  /*	EPROTO		92		/ * Protocol error */</div><div class='del'>-  gf_error_to_errno_array[GF_ERROR_CODE_PROTO] = EPROTO;</div><div class='del'>-  gf_errno_to_error_array[EPROTO] = GF_ERROR_CODE_PROTO;</div><div class='add'>+    /*      ENOLINK         91              / * Link has been severed */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_NOLINK] = ENOLINK;</div><div class='add'>+    gf_errno_to_error_array[ENOLINK] = GF_ERROR_CODE_NOLINK;</div><div class='ctx'> </div><div class='add'>+    /*      EPROTO          92              / * Protocol error */</div><div class='add'>+    gf_error_to_errno_array[GF_ERROR_CODE_PROTO] = EPROTO;</div><div class='add'>+    gf_errno_to_error_array[EPROTO] = GF_ERROR_CODE_PROTO;</div><div class='ctx'> </div><div class='del'>-  return ;</div><div class='add'>+    return;</div><div class='ctx'> }</div><div class='ctx'> #endif /* GF_BSD_HOST_OS */</div><div class='ctx'> </div><div class='ctx'> #ifdef GF_LINUX_HOST_OS</div><div class='del'>-static void </div><div class='del'>-init_compat_errno_arrays ()</div><div class='add'>+static void</div><div class='add'>+init_compat_errno_arrays()</div><div class='ctx'> {</div><div class='del'>-  /* Things are fine. Everything should work seemlessly on GNU/Linux machines */</div><div class='del'>-  return ;</div><div class='add'>+    /* Things are fine. Everything should work seemlessly on GNU/Linux machines</div><div class='add'>+     */</div><div class='add'>+    return;</div><div class='ctx'> }</div><div class='ctx'> #endif /* GF_LINUX_HOST_OS */</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> static void</div><div class='del'>-init_errno_arrays ()</div><div class='add'>+init_errno_arrays()</div><div class='ctx'> {</div><div class='del'>-  int i;</div><div class='del'>-  for (i=0; i &lt; GF_ERROR_CODE_UNKNOWN; i++) {</div><div class='del'>-    gf_errno_to_error_array[i] = i;</div><div class='del'>-    gf_error_to_errno_array[i] = i;</div><div class='del'>-  }</div><div class='del'>-  /* Now change the order if it needs to be. */</div><div class='del'>-  init_compat_errno_arrays();</div><div class='del'>-</div><div class='del'>-  return;</div><div class='add'>+    int i;</div><div class='add'>+    for (i = 0; i &lt; GF_ERROR_CODE_UNKNOWN; i++) {</div><div class='add'>+        gf_errno_to_error_array[i] = i;</div><div class='add'>+        gf_error_to_errno_array[i] = i;</div><div class='add'>+    }</div><div class='add'>+    /* Now change the order if it needs to be. */</div><div class='add'>+    init_compat_errno_arrays();</div><div class='add'>+</div><div class='add'>+    return;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-int32_t </div><div class='del'>-gf_errno_to_error (int32_t op_errno)</div><div class='add'>+int32_t</div><div class='add'>+gf_errno_to_error(int32_t op_errno)</div><div class='ctx'> {</div><div class='del'>-  if (!gf_compat_errno_init_done) {</div><div class='del'>-    init_errno_arrays ();</div><div class='del'>-    gf_compat_errno_init_done = 1;</div><div class='del'>-  }</div><div class='add'>+    if (!gf_compat_errno_init_done) {</div><div class='add'>+        init_errno_arrays();</div><div class='add'>+        gf_compat_errno_init_done = 1;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-  if ((op_errno &gt; GF_ERROR_CODE_SUCCESS) &amp;&amp; (op_errno &lt; GF_ERROR_CODE_UNKNOWN))</div><div class='del'>-    return gf_errno_to_error_array[op_errno];</div><div class='add'>+    if ((op_errno &gt; GF_ERROR_CODE_SUCCESS) &amp;&amp;</div><div class='add'>+        (op_errno &lt; GF_ERROR_CODE_UNKNOWN))</div><div class='add'>+        return gf_errno_to_error_array[op_errno];</div><div class='ctx'> </div><div class='del'>-  return op_errno;</div><div class='add'>+    return op_errno;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='del'>-int32_t </div><div class='del'>-gf_error_to_errno (int32_t error)</div><div class='add'>+int32_t</div><div class='add'>+gf_error_to_errno(int32_t error)</div><div class='ctx'> {</div><div class='del'>-  if (!gf_compat_errno_init_done) {</div><div class='del'>-    init_errno_arrays ();</div><div class='del'>-    gf_compat_errno_init_done = 1;</div><div class='del'>-  }</div><div class='add'>+    if (!gf_compat_errno_init_done) {</div><div class='add'>+        init_errno_arrays();</div><div class='add'>+        gf_compat_errno_init_done = 1;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-  if ((error &gt; GF_ERROR_CODE_SUCCESS) &amp;&amp; (error &lt; GF_ERROR_CODE_UNKNOWN))</div><div class='del'>-    return gf_error_to_errno_array[error];</div><div class='add'>+    if ((error &gt; GF_ERROR_CODE_SUCCESS) &amp;&amp; (error &lt; GF_ERROR_CODE_UNKNOWN))</div><div class='add'>+        return gf_error_to_errno_array[error];</div><div class='ctx'> </div><div class='del'>-  return error;</div><div class='add'>+    return error;</div><div class='ctx'> }</div><div class='del'>-</div><div class='head'>diff --git a/libglusterfs/src/compat-errno.h b/libglusterfs/src/compat-errno.h<br/>deleted file mode 100644<br/>index c1812e97b62..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/libglusterfs/src/compat-errno.h?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/compat-errno.h</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,240 +0,0 @@</div><div class='del'>-/*</div><div class='del'>-   Copyright (c) 2008-2009 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='del'>-   This file is part of GlusterFS.</div><div class='del'>-</div><div class='del'>-   GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-   it under the terms of the GNU General Public License as published</div><div class='del'>-   by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-   or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-   GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-   WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-   General Public License for more details.</div><div class='del'>-</div><div class='del'>-   You should have received a copy of the GNU General Public License</div><div class='del'>-   along with this program.  If not, see</div><div class='del'>-   &lt;http://www.gnu.org/licenses/&gt;.</div><div class='del'>-*/</div><div class='del'>-</div><div class='del'>-#ifndef __COMPAT_ERRNO_H__</div><div class='del'>-#define __COMPAT_ERRNO_H__</div><div class='del'>-</div><div class='del'>-#ifndef _CONFIG_H</div><div class='del'>-#define _CONFIG_H</div><div class='del'>-#include "config.h"</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-#include &lt;errno.h&gt;</div><div class='del'>-</div><div class='del'>-#define GF_ERROR_CODE_SUCCESS         0</div><div class='del'>-#define GF_ERROR_CODE_UNKNOWN         1024</div><div class='del'>-#define GF_ERRNO_UNKNOWN              1024</div><div class='del'>-</div><div class='del'>-#define GF_ERROR_CODE_PERM            1      /* Operation not permitted */</div><div class='del'>-#define GF_ERROR_CODE_NOENT           2      /* No such file or directory */</div><div class='del'>-#define GF_ERROR_CODE_SRCH            3      /* No such process */</div><div class='del'>-#define GF_ERROR_CODE_INTR            4      /* Interrupted system call */</div><div class='del'>-#define GF_ERROR_CODE_IO              5      /* I/O error */</div><div class='del'>-#define GF_ERROR_CODE_NXIO            6      /* No such device or address */</div><div class='del'>-#define GF_ERROR_CODE_2BIG            7      /* Argument list too long */</div><div class='del'>-#define GF_ERROR_CODE_NOEXEC          8      /* Exec format error */</div><div class='del'>-#define GF_ERROR_CODE_BADF            9      /* Bad file number */</div><div class='del'>-#define GF_ERROR_CODE_CHILD          10      /* No child processes */</div><div class='del'>-#define GF_ERROR_CODE_AGAIN          11      /* Try again */</div><div class='del'>-#define GF_ERROR_CODE_NOMEM          12      /* Out of memory */</div><div class='del'>-#define GF_ERROR_CODE_ACCES          13      /* Permission denied */</div><div class='del'>-#define GF_ERROR_CODE_FAULT          14      /* Bad address */</div><div class='del'>-#define GF_ERROR_CODE_NOTBLK         15      /* Block device required */</div><div class='del'>-#define GF_ERROR_CODE_BUSY           16      /* Device or resource busy */</div><div class='del'>-#define GF_ERROR_CODE_EXIST          17      /* File exists */</div><div class='del'>-#define GF_ERROR_CODE_XDEV           18      /* Cross-device link */</div><div class='del'>-#define GF_ERROR_CODE_NODEV          19      /* No such device */</div><div class='del'>-#define GF_ERROR_CODE_NOTDIR         20      /* Not a directory */</div><div class='del'>-#define GF_ERROR_CODE_ISDIR          21      /* Is a directory */</div><div class='del'>-#define GF_ERROR_CODE_INVAL          22      /* Invalid argument */</div><div class='del'>-#define GF_ERROR_CODE_NFILE          23      /* File table overflow */</div><div class='del'>-#define GF_ERROR_CODE_MFILE          24      /* Too many open files */</div><div class='del'>-#define GF_ERROR_CODE_NOTTY          25      /* Not a typewriter */</div><div class='del'>-#define GF_ERROR_CODE_TXTBSY         26      /* Text file busy */</div><div class='del'>-#define GF_ERROR_CODE_FBIG           27      /* File too large */</div><div class='del'>-#define GF_ERROR_CODE_NOSPC          28      /* No space left on device */</div><div class='del'>-#define GF_ERROR_CODE_SPIPE          29      /* Illegal seek */</div><div class='del'>-#define GF_ERROR_CODE_ROFS           30      /* Read-only file system */</div><div class='del'>-#define GF_ERROR_CODE_MLINK          31      /* Too many links */</div><div class='del'>-#define GF_ERROR_CODE_PIPE           32      /* Broken pipe */</div><div class='del'>-#define GF_ERROR_CODE_DOM            33      /* Math argument out of domain of func */</div><div class='del'>-#define GF_ERROR_CODE_RANGE          34      /* Math result not representable */</div><div class='del'>-#define GF_ERROR_CODE_DEADLK         35      /* Resource deadlock would occur */</div><div class='del'>-#define GF_ERROR_CODE_NAMETOOLONG    36      /* File name too long */</div><div class='del'>-#define GF_ERROR_CODE_NOLCK          37      /* No record locks available */</div><div class='del'>-#define GF_ERROR_CODE_NOSYS          38      /* Function not implemented */</div><div class='del'>-#define GF_ERROR_CODE_NOTEMPTY       39      /* Directory not empty */</div><div class='del'>-#define GF_ERROR_CODE_LOOP           40      /* Too many symbolic links encountered */</div><div class='del'>-</div><div class='del'>-#define GF_ERROR_CODE_NOMSG          42      /* No message of desired type */</div><div class='del'>-#define GF_ERROR_CODE_IDRM           43      /* Identifier removed */</div><div class='del'>-#define GF_ERROR_CODE_CHRNG          44      /* Channel number out of range */</div><div class='del'>-#define GF_ERROR_CODE_L2NSYNC        45      /* Level 2 not synchronized */</div><div class='del'>-#define GF_ERROR_CODE_L3HLT          46      /* Level 3 halted */</div><div class='del'>-#define GF_ERROR_CODE_L3RST          47      /* Level 3 reset */</div><div class='del'>-#define GF_ERROR_CODE_LNRNG          48      /* Link number out of range */</div><div class='del'>-#define GF_ERROR_CODE_UNATCH         49      /* Protocol driver not attached */</div><div class='del'>-#define GF_ERROR_CODE_NOCSI          50      /* No CSI structure available */</div><div class='del'>-#define GF_ERROR_CODE_L2HLT          51      /* Level 2 halted */</div><div class='del'>-#define GF_ERROR_CODE_BADE           52      /* Invalid exchange */</div><div class='del'>-#define GF_ERROR_CODE_BADR           53      /* Invalid request descriptor */</div><div class='del'>-#define GF_ERROR_CODE_XFULL          54      /* Exchange full */</div><div class='del'>-#define GF_ERROR_CODE_NOANO          55      /* No anode */</div><div class='del'>-#define GF_ERROR_CODE_BADRQC         56      /* Invalid request code */</div><div class='del'>-#define GF_ERROR_CODE_BADSLT         57      /* Invalid slot */</div><div class='del'>-#define GF_ERROR_CODE_BFONT          59      /* Bad font file format */</div><div class='del'>-#define GF_ERROR_CODE_NOSTR          60      /* Device not a stream */</div><div class='del'>-#define GF_ERROR_CODE_NODATA         61      /* No data available */</div><div class='del'>-#define GF_ERROR_CODE_TIME           62      /* Timer expired */</div><div class='del'>-#define GF_ERROR_CODE_NOSR           63      /* Out of streams resources */</div><div class='del'>-#define GF_ERROR_CODE_NONET          64      /* Machine is not on the network */</div><div class='del'>-#define GF_ERROR_CODE_NOPKG          65      /* Package not installed */</div><div class='del'>-#define GF_ERROR_CODE_REMOTE         66      /* Object is remote */</div><div class='del'>-#define GF_ERROR_CODE_NOLINK         67      /* Link has been severed */</div><div class='del'>-#define GF_ERROR_CODE_ADV            68      /* Advertise error */</div><div class='del'>-#define GF_ERROR_CODE_SRMNT          69      /* Srmount error */</div><div class='del'>-#define GF_ERROR_CODE_COMM           70      /* Communication error on send */</div><div class='del'>-#define GF_ERROR_CODE_PROTO          71      /* Protocol error */</div><div class='del'>-#define GF_ERROR_CODE_MULTIHOP       72      /* Multihop attempted */</div><div class='del'>-#define GF_ERROR_CODE_DOTDOT         73      /* RFS specific error */</div><div class='del'>-#define GF_ERROR_CODE_BADMSG         74      /* Not a data message */</div><div class='del'>-#define GF_ERROR_CODE_OVERFLOW       75      /* Value too large for defined data type */</div><div class='del'>-#define GF_ERROR_CODE_NOTUNIQ        76      /* Name not unique on network */</div><div class='del'>-#define GF_ERROR_CODE_BADFD          77      /* File descriptor in bad state */</div><div class='del'>-#define GF_ERROR_CODE_REMCHG         78      /* Remote address changed */</div><div class='del'>-#define GF_ERROR_CODE_LIBACC         79      /* Can not access a needed shared library */</div><div class='del'>-#define GF_ERROR_CODE_LIBBAD         80      /* Accessing a corrupted shared library */</div><div class='del'>-#define GF_ERROR_CODE_LIBSCN         81      /* .lib section in a.out corrupted */</div><div class='del'>-#define GF_ERROR_CODE_LIBMAX         82      /* Attempting to link in too many shared libraries */</div><div class='del'>-#define GF_ERROR_CODE_LIBEXEC        83      /* Cannot exec a shared library directly */</div><div class='del'>-#define GF_ERROR_CODE_ILSEQ          84      /* Illegal byte sequence */</div><div class='del'>-#define GF_ERROR_CODE_RESTART        85      /* Interrupted system call should be restarted */</div><div class='del'>-#define GF_ERROR_CODE_STRPIPE        86      /* Streams pipe error */</div><div class='del'>-#define GF_ERROR_CODE_USERS          87      /* Too many users */</div><div class='del'>-#define GF_ERROR_CODE_NOTSOCK        88      /* Socket operation on non-socket */</div><div class='del'>-#define GF_ERROR_CODE_DESTADDRREQ    89      /* Destination address required */</div><div class='del'>-#define GF_ERROR_CODE_MSGSIZE        90      /* Message too long */</div><div class='del'>-#define GF_ERROR_CODE_PROTOTYPE      91      /* Protocol wrong type for socket */</div><div class='del'>-#define GF_ERROR_CODE_NOPROTOOPT     92      /* Protocol not available */</div><div class='del'>-#define GF_ERROR_CODE_PROTONOSUPPORT 93      /* Protocol not supported */</div><div class='del'>-#define GF_ERROR_CODE_SOCKTNOSUPPORT 94      /* Socket type not supported */</div><div class='del'>-#define GF_ERROR_CODE_OPNOTSUPP      95      /* Operation not supported on transport endpoint */</div><div class='del'>-#define GF_ERROR_CODE_PFNOSUPPORT    96      /* Protocol family not supported */</div><div class='del'>-#define GF_ERROR_CODE_AFNOSUPPORT    97      /* Address family not supported by protocol */</div><div class='del'>-#define GF_ERROR_CODE_ADDRINUSE      98      /* Address already in use */</div><div class='del'>-#define GF_ERROR_CODE_ADDRNOTAVAIL   99      /* Cannot assign requested address */</div><div class='del'>-#define GF_ERROR_CODE_NETDOWN        100     /* Network is down */</div><div class='del'>-#define GF_ERROR_CODE_NETUNREACH     101     /* Network is unreachable */</div><div class='del'>-#define GF_ERROR_CODE_NETRESET       102     /* Network dropped connection because of reset */</div><div class='del'>-#define GF_ERROR_CODE_CONNABORTED    103     /* Software caused connection abort */</div><div class='del'>-#define GF_ERROR_CODE_CONNRESET      104     /* Connection reset by peer */</div><div class='del'>-#define GF_ERROR_CODE_NOBUFS         105     /* No buffer space available */</div><div class='del'>-#define GF_ERROR_CODE_ISCONN         106     /* Transport endpoint is already connected */</div><div class='del'>-#define GF_ERROR_CODE_NOTCONN        107     /* Transport endpoint is not connected */</div><div class='del'>-#define GF_ERROR_CODE_SHUTDOWN       108     /* Cannot send after transport endpoint shutdown */</div><div class='del'>-#define GF_ERROR_CODE_TOOMANYREFS    109     /* Too many references: cannot splice */</div><div class='del'>-#define GF_ERROR_CODE_TIMEDOUT       110     /* Connection timed out */</div><div class='del'>-#define GF_ERROR_CODE_CONNREFUSED    111     /* Connection refused */</div><div class='del'>-#define GF_ERROR_CODE_HOSTDOWN       112     /* Host is down */</div><div class='del'>-#define GF_ERROR_CODE_HOSTUNREACH    113     /* No route to host */</div><div class='del'>-#define GF_ERROR_CODE_ALREADY        114     /* Operation already in progress */</div><div class='del'>-#define GF_ERROR_CODE_INPROGRESS     115     /* Operation now in progress */</div><div class='del'>-#define GF_ERROR_CODE_ALREADY        114     /* Operation already in progress */</div><div class='del'>-#define GF_ERROR_CODE_INPROGRESS     115     /* Operation now in progress */</div><div class='del'>-#define GF_ERROR_CODE_STALE          116     /* Stale NFS file handle */</div><div class='del'>-#define GF_ERROR_CODE_UCLEAN         117     /* Structure needs cleaning */</div><div class='del'>-#define GF_ERROR_CODE_NOTNAM         118     /* Not a XENIX named type file */</div><div class='del'>-#define GF_ERROR_CODE_NAVAIL         119     /* No XENIX semaphores available */</div><div class='del'>-#define GF_ERROR_CODE_ISNAM          120     /* Is a named type file */</div><div class='del'>-#define GF_ERROR_CODE_REMOTEIO       121     /* Remote I/O error */</div><div class='del'>-#define GF_ERROR_CODE_DQUOT          122     /* Quota exceeded */</div><div class='del'>-#define GF_ERROR_CODE_NOMEDIUM       123     /* No medium found */</div><div class='del'>-#define GF_ERROR_CODE_MEDIUMTYPE     124     /* Wrong medium type */</div><div class='del'>-#define GF_ERROR_CODE_CANCELED       125     /* Operation Canceled */</div><div class='del'>-#define GF_ERROR_CODE_NOKEY          126     /* Required key not available */</div><div class='del'>-#define GF_ERROR_CODE_KEYEXPIRED     127     /* Key has expired */</div><div class='del'>-#define GF_ERROR_CODE_KEYREVOKED     128     /* Key has been revoked */</div><div class='del'>-#define GF_ERROR_CODE_KEYREJECTED    129     /* Key was rejected by service */</div><div class='del'>-</div><div class='del'>-/* for robust mutexes */</div><div class='del'>-#define GF_ERROR_CODE_OWNERDEAD      130     /* Owner died */</div><div class='del'>-#define GF_ERROR_CODE_NOTRECOVERABLE 131     /* State not recoverable */</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-/* Should never be seen by user programs */</div><div class='del'>-#define GF_ERROR_CODE_RESTARTSYS     512</div><div class='del'>-#define GF_ERROR_CODE_RESTARTNOINTR  513</div><div class='del'>-#define GF_ERROR_CODE_RESTARTNOHAND  514     /* restart if no handler.. */</div><div class='del'>-#define GF_ERROR_CODE_NOIOCTLCMD     515     /* No ioctl command */</div><div class='del'>-#define GF_ERROR_CODE_RESTART_RESTARTBLOCK 516 /* restart by calling sys_restart_syscall */</div><div class='del'>-</div><div class='del'>-/* Defined for the NFSv3 protocol */</div><div class='del'>-#define GF_ERROR_CODE_BADHANDLE      521     /* Illegal NFS file handle */</div><div class='del'>-#define GF_ERROR_CODE_NOTSYNC        522     /* Update synchronization mismatch */</div><div class='del'>-#define GF_ERROR_CODE_BADCOOKIE      523     /* Cookie is stale */</div><div class='del'>-#define GF_ERROR_CODE_NOTSUPP        524     /* Operation is not supported */</div><div class='del'>-#define GF_ERROR_CODE_TOOSMALL       525     /* Buffer or request is too small */</div><div class='del'>-#define GF_ERROR_CODE_SERVERFAULT    526     /* An untranslatable error occurred */</div><div class='del'>-#define GF_ERROR_CODE_BADTYPE        527     /* Type not supported by server */</div><div class='del'>-#define GF_ERROR_CODE_JUKEBOX        528     /* Request initiated, but will not complete before timeout */</div><div class='del'>-#define GF_ERROR_CODE_IOCBQUEUED     529     /* iocb queued, will get completion event */</div><div class='del'>-#define GF_ERROR_CODE_IOCBRETRY      530     /* iocb queued, will trigger a retry */</div><div class='del'>-</div><div class='del'>-/* Darwin OS X */</div><div class='del'>-#define GF_ERROR_CODE_NOPOLICY   701</div><div class='del'>-#define GF_ERROR_CODE_BADMACHO   702</div><div class='del'>-#define GF_ERROR_CODE_PWROFF     703</div><div class='del'>-#define GF_ERROR_CODE_DEVERR     704</div><div class='del'>-#define GF_ERROR_CODE_BADARCH    705</div><div class='del'>-#define GF_ERROR_CODE_BADEXEC    706</div><div class='del'>-#define GF_ERROR_CODE_SHLIBVERS  707</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-/* Solaris */</div><div class='del'>-/*  	ENOTACTIVE 73	/ * Facility is not active		*/</div><div class='del'>-#define GF_ERROR_CODE_NOTACTIVE   801 </div><div class='del'>-/*  	ELOCKUNMAPPED	72	/ * locked lock was unmapped */</div><div class='del'>-#define GF_ERROR_CODE_LOCKUNMAPPED 802</div><div class='del'>-</div><div class='del'>-/* BSD system */</div><div class='del'>-#define GF_ERROR_CODE_PROCLIM	        901		/* Too many processes */</div><div class='del'>-#define GF_ERROR_CODE_BADRPC		902		/* RPC struct is bad */</div><div class='del'>-#define GF_ERROR_CODE_RPCMISMATCH	903		/* RPC version wrong */</div><div class='del'>-#define GF_ERROR_CODE_PROGUNAVAIL	904		/* RPC prog. not avail */</div><div class='del'>-#define GF_ERROR_CODE_PROGMISMATCH	905		/* Program version wrong */</div><div class='del'>-#define GF_ERROR_CODE_PROCUNAVAIL	905		/* Bad procedure for program */</div><div class='del'>-#define GF_ERROR_CODE_FTYPE		906		/* Inappropriate file type or format */</div><div class='del'>-#define GF_ERROR_CODE_AUTH		907		/* Authentication error */</div><div class='del'>-#define GF_ERROR_CODE_NEEDAUTH	        908		/* Need authenticator */</div><div class='del'>-#define GF_ERROR_CODE_DOOFUS		909		/* Programming error */</div><div class='del'>-</div><div class='del'>-#define GF_ERROR_CODE_NOATTR		GF_ERROR_CODE_NODATA		/* Attribute not found */</div><div class='del'>-</div><div class='del'>-/* Either one of enodata or enoattr will be there in system */</div><div class='del'>-#ifndef ENOATTR</div><div class='del'>-#define ENOATTR ENODATA</div><div class='del'>-#endif /* ENOATTR */</div><div class='del'>-</div><div class='del'>-#ifndef ENODATA</div><div class='del'>-#define ENODATA ENOATTR</div><div class='del'>-#endif /* ENODATA */</div><div class='del'>-</div><div class='del'>-#ifndef EBADFD</div><div class='del'>-#define EBADFD EBADRPC</div><div class='del'>-#endif /* EBADFD */</div><div class='del'>-</div><div class='del'>-/* These functions are defined for all the OS flags, but content will </div><div class='del'>- * be different for each OS flag. </div><div class='del'>- */</div><div class='del'>-int32_t gf_errno_to_error (int32_t op_errno);</div><div class='del'>-int32_t gf_error_to_errno (int32_t error);</div><div class='del'>-</div><div class='del'>-#endif /* __COMPAT_ERRNO_H__ */</div><div class='head'>diff --git a/libglusterfs/src/compat.c b/libglusterfs/src/compat.c<br/>index 891b156d3f5..8a05a30a8fe 100644<br/>--- a/<a href='/cgit/glusterfs.git/tree/libglusterfs/src/compat.c?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/compat.c</a><br/>+++ b/<a href='/cgit/glusterfs.git/tree/libglusterfs/src/compat.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>libglusterfs/src/compat.c</a></div><div class='hunk'>@@ -1,426 +1,618 @@</div><div class='ctx'> /*</div><div class='del'>-   Copyright (c) 2006-2009 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='del'>-   This file is part of GlusterFS.</div><div class='del'>-</div><div class='del'>-   GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-   it under the terms of the GNU General Public License as published</div><div class='del'>-   by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-   or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-   GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-   WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-   General Public License for more details.</div><div class='del'>-</div><div class='del'>-   You should have received a copy of the GNU General Public License</div><div class='del'>-   along with this program.  If not, see</div><div class='del'>-   &lt;http://www.gnu.org/licenses/&gt;.</div><div class='del'>-*/</div><div class='add'>+  Copyright (c) 2008-2012 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='ctx'> </div><div class='del'>-#ifndef _CONFIG_H</div><div class='del'>-#define _CONFIG_H</div><div class='del'>-#include "config.h"</div><div class='del'>-#endif</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='ctx'> </div><div class='del'>-#include &lt;string.h&gt;</div><div class='ctx'> #include &lt;stdlib.h&gt;</div><div class='add'>+#include &lt;unistd.h&gt;</div><div class='ctx'> #include &lt;stdarg.h&gt;</div><div class='ctx'> #include &lt;getopt.h&gt;</div><div class='ctx'> #include &lt;sys/types.h&gt;</div><div class='ctx'> #include &lt;dirent.h&gt;</div><div class='ctx'> </div><div class='del'>-#ifdef GF_SOLARIS_HOST_OS</div><div class='del'>-#include "logging.h"</div><div class='del'>-#endif /* GF_SOLARIS_HOST_OS */</div><div class='del'>-</div><div class='del'>-#include "compat.h"</div><div class='del'>-#include "common-utils.h"</div><div class='add'>+#include "glusterfs/logging.h"</div><div class='add'>+#include "glusterfs/compat.h"</div><div class='add'>+#include "glusterfs/iatt.h"</div><div class='add'>+#include "glusterfs/syscall.h"</div><div class='add'>+#include "glusterfs/run.h"</div><div class='add'>+#include "glusterfs/libglusterfs-messages.h"</div><div class='ctx'> </div><div class='ctx'> #ifdef GF_SOLARIS_HOST_OS</div><div class='del'>-</div><div class='del'>-int </div><div class='del'>-solaris_fsetxattr(int fd, </div><div class='del'>-		  const char* key, </div><div class='del'>-		  const char *value, </div><div class='del'>-		  size_t size, </div><div class='del'>-		  int flags)</div><div class='add'>+int</div><div class='add'>+solaris_fsetxattr(int fd, const char *key, const char *value, size_t size,</div><div class='add'>+                  int flags)</div><div class='ctx'> {</div><div class='del'>-	int attrfd = -1;</div><div class='del'>-	int ret = 0;</div><div class='del'>-	</div><div class='del'>-	attrfd = openat (fd, key, flags|O_CREAT|O_WRONLY|O_XATTR, 0777);</div><div class='del'>-	if (attrfd &gt;= 0) {</div><div class='del'>-		ftruncate (attrfd, 0);</div><div class='del'>-		ret = write (attrfd, value, size);</div><div class='del'>-		close (attrfd);</div><div class='del'>-	} else {</div><div class='del'>-		if (errno != ENOENT)</div><div class='del'>-			gf_log ("libglusterfs", GF_LOG_ERROR, </div><div class='del'>-				"Couldn't set extended attribute for %d (%d)", </div><div class='del'>-				fd, errno);</div><div class='del'>-		return -1;</div><div class='del'>-	}</div><div class='del'>-	</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='add'>+    int attrfd = -1;</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    attrfd = openat(fd, key, flags | O_CREAT | O_WRONLY | O_XATTR, 0777);</div><div class='add'>+    if (attrfd &gt;= 0) {</div><div class='add'>+        ftruncate(attrfd, 0);</div><div class='add'>+        ret = write(attrfd, value, size);</div><div class='add'>+        close(attrfd);</div><div class='add'>+    } else {</div><div class='add'>+        if (errno != ENOENT)</div><div class='add'>+            gf_msg("libglusterfs", GF_LOG_ERROR, errno,</div><div class='add'>+                   LG_MSG_SET_ATTRIBUTE_FAILED,</div><div class='add'>+                   "Couldn't set "</div><div class='add'>+                   "extended attribute for %d",</div><div class='add'>+                   fd);</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-int </div><div class='del'>-solaris_fgetxattr(int fd, </div><div class='del'>-		  const char* key, </div><div class='del'>-		  char *value, </div><div class='del'>-		  size_t size)</div><div class='add'>+int</div><div class='add'>+solaris_fgetxattr(int fd, const char *key, char *value, size_t size)</div><div class='ctx'> {</div><div class='del'>-	int attrfd = -1;</div><div class='del'>-	int ret = 0;</div><div class='del'>-	</div><div class='del'>-	attrfd = openat (fd, key, O_RDONLY|O_XATTR);</div><div class='del'>-	if (attrfd &gt;= 0) {</div><div class='del'>-		if (size == 0) {</div><div class='del'>-			struct stat buf;</div><div class='del'>-			fstat (attrfd, &amp;buf);</div><div class='del'>-			ret = buf.st_size;</div><div class='del'>-		} else {</div><div class='del'>-			ret = read (attrfd, value, size);</div><div class='del'>-		}</div><div class='del'>-		close (attrfd);</div><div class='del'>-	} else {</div><div class='del'>-		if (errno == ENOENT)</div><div class='del'>-			errno = ENODATA;</div><div class='del'>-		if (errno != ENOENT)</div><div class='del'>-			gf_log ("libglusterfs", GF_LOG_DEBUG, </div><div class='del'>-				"Couldn't read extended attribute for the file %d (%d)", </div><div class='del'>-				fd, errno);</div><div class='del'>-		return -1;</div><div class='del'>-	}</div><div class='del'>-	</div><div class='del'>-	return ret;</div><div class='add'>+    int attrfd = -1;</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    attrfd = openat(fd, key, O_RDONLY | O_XATTR);</div><div class='add'>+    if (attrfd &gt;= 0) {</div><div class='add'>+        if (size == 0) {</div><div class='add'>+            struct stat buf;</div><div class='add'>+            fstat(attrfd, &amp;buf);</div><div class='add'>+            ret = buf.st_size;</div><div class='add'>+        } else {</div><div class='add'>+            ret = read(attrfd, value, size);</div><div class='add'>+        }</div><div class='add'>+        close(attrfd);</div><div class='add'>+    } else {</div><div class='add'>+        if (errno != ENOENT)</div><div class='add'>+            gf_msg("libglusterfs", GF_LOG_INFO, errno,</div><div class='add'>+                   LG_MSG_READ_ATTRIBUTE_FAILED,</div><div class='add'>+                   "Couldn't read "</div><div class='add'>+                   "extended attribute for the file %d",</div><div class='add'>+                   fd);</div><div class='add'>+        if (errno == ENOENT)</div><div class='add'>+            errno = ENODATA;</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+/* Solaris does not support xattr for symlinks and dev files. Since gfid and</div><div class='add'>+   other trusted attributes are stored as xattrs, we need to provide support for</div><div class='add'>+   them. A mapped regular file is stored in the /.glusterfs_xattr_inode of the</div><div class='add'>+   export dir. All xattr ops related to the special files are redirected to this</div><div class='add'>+   map file.</div><div class='add'>+*/</div><div class='ctx'> </div><div class='del'>-int </div><div class='del'>-solaris_setxattr(const char *path, </div><div class='del'>-		 const char* key, </div><div class='del'>-		 const char *value, </div><div class='del'>-		 size_t size, </div><div class='del'>-		 int flags)</div><div class='add'>+int</div><div class='add'>+make_export_path(const char *real_path, char **path)</div><div class='ctx'> {</div><div class='del'>-	int attrfd = -1;</div><div class='del'>-	int ret = 0;</div><div class='del'>-	</div><div class='del'>-	attrfd = attropen (path, key, flags|O_CREAT|O_WRONLY, 0777);</div><div class='del'>-	if (attrfd &gt;= 0) {</div><div class='del'>-		ftruncate (attrfd, 0);</div><div class='del'>-		ret = write (attrfd, value, size);</div><div class='del'>-		close (attrfd);</div><div class='del'>-	} else {</div><div class='del'>-		if (errno != ENOENT)</div><div class='del'>-			gf_log ("libglusterfs", GF_LOG_ERROR, </div><div class='del'>-				"Couldn't set extended attribute for %s (%d)", </div><div class='del'>-				path, errno);</div><div class='del'>-		return -1;</div><div class='del'>-	}</div><div class='del'>-	</div><div class='del'>-	return 0;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    char *tmp = NULL;</div><div class='add'>+    char *export_path = NULL;</div><div class='add'>+    char *dup = NULL;</div><div class='add'>+    char *ptr = NULL;</div><div class='add'>+    char *freeptr = NULL;</div><div class='add'>+    uuid_t gfid = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    export_path = GF_CALLOC(1, sizeof(char) * PATH_MAX, 0);</div><div class='add'>+    if (!export_path)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    dup = gf_strdup(real_path);</div><div class='add'>+    if (!dup)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    freeptr = dup;</div><div class='add'>+    ret = solaris_getxattr("/", GFID_XATTR_KEY, gfid, 16);</div><div class='add'>+    /* Return value of getxattr */</div><div class='add'>+    if (ret == 16) {</div><div class='add'>+        if (__is_root_gfid(gfid)) {</div><div class='add'>+            strcat(export_path, "/");</div><div class='add'>+            ret = 0;</div><div class='add'>+            goto done;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    do {</div><div class='add'>+        ptr = strtok_r(dup, "/", &amp;tmp);</div><div class='add'>+        if (!ptr)</div><div class='add'>+            break;</div><div class='add'>+        strcat(export_path, dup);</div><div class='add'>+        ret = solaris_getxattr(export_path, GFID_XATTR_KEY, gfid, 16);</div><div class='add'>+        if (ret == 16) {</div><div class='add'>+            if (__is_root_gfid(gfid)) {</div><div class='add'>+                ret = 0;</div><div class='add'>+                goto done;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+        strcat(export_path, "/");</div><div class='add'>+        dup = tmp;</div><div class='add'>+    } while (ptr);</div><div class='add'>+</div><div class='add'>+    goto out;</div><div class='add'>+</div><div class='add'>+done:</div><div class='add'>+    if (!ret) {</div><div class='add'>+        *path = export_path;</div><div class='add'>+    }</div><div class='add'>+out:</div><div class='add'>+    GF_FREE(freeptr);</div><div class='add'>+    if (ret &amp;&amp; export_path)</div><div class='add'>+        GF_FREE(export_path);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='add'>+int</div><div class='add'>+solaris_xattr_resolve_path(const char *real_path, char **path)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    char *export_path = NULL;</div><div class='add'>+    char xattr_path[PATH_MAX] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    struct stat lstatbuf = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    struct iatt stbuf = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    struct stat statbuf = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    ret = lstat(real_path, &amp;lstatbuf);</div><div class='add'>+    if (ret != 0)</div><div class='add'>+        return ret;</div><div class='add'>+    iatt_from_stat(&amp;stbuf, &amp;lstatbuf);</div><div class='add'>+    if (IA_ISREG(stbuf.ia_type) || IA_ISDIR(stbuf.ia_type))</div><div class='add'>+        return -1;</div><div class='add'>+</div><div class='add'>+    ret = make_export_path(real_path, &amp;export_path);</div><div class='add'>+    if (!ret &amp;&amp; export_path) {</div><div class='add'>+        strcat(export_path, "/" GF_SOLARIS_XATTR_DIR);</div><div class='add'>+        if (lstat(export_path, &amp;statbuf)) {</div><div class='add'>+            ret = mkdir(export_path, 0755);</div><div class='add'>+            if (ret &amp;&amp; (errno != EEXIST)) {</div><div class='add'>+                gf_msg_debug(THIS-&gt;name, 0,</div><div class='add'>+                             "mkdir failed,"</div><div class='add'>+                             " errno: %d",</div><div class='add'>+                             errno);</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='ctx'> </div><div class='add'>+        snprintf(xattr_path, PATH_MAX, "%s%s%lu", export_path, "/",</div><div class='add'>+                 stbuf.ia_ino);</div><div class='add'>+</div><div class='add'>+        ret = lstat(xattr_path, &amp;statbuf);</div><div class='add'>+</div><div class='add'>+        if (ret) {</div><div class='add'>+            ret = mknod(xattr_path, S_IFREG | O_WRONLY, 0);</div><div class='add'>+            if (ret &amp;&amp; (errno != EEXIST)) {</div><div class='add'>+                gf_msg(THIS-&gt;name, GF_LOG_WARNING, errno, LG_MSG_FILE_OP_FAILED,</div><div class='add'>+                       "Failed to "</div><div class='add'>+                       "create mapped file %s",</div><div class='add'>+                       xattr_path);</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+        *path = gf_strdup(xattr_path);</div><div class='add'>+    }</div><div class='add'>+out:</div><div class='add'>+    GF_FREE(export_path);</div><div class='add'>+    if (*path)</div><div class='add'>+        return 0;</div><div class='add'>+    else</div><div class='add'>+        return -1;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-solaris_listxattr(const char *path, </div><div class='del'>-		  char *list, </div><div class='del'>-		  size_t size)</div><div class='add'>+solaris_setxattr(const char *path, const char *key, const char *value,</div><div class='add'>+                 size_t size, int flags)</div><div class='ctx'> {</div><div class='del'>-	int attrdirfd = -1;</div><div class='del'>-	ssize_t len = 0;</div><div class='del'>-	DIR *dirptr = NULL;</div><div class='del'>-	struct dirent *dent = NULL;</div><div class='del'>-	int newfd = -1;</div><div class='del'>-	</div><div class='del'>-	attrdirfd = attropen (path, ".", O_RDONLY, 0);</div><div class='del'>-	if (attrdirfd &gt;= 0) {</div><div class='del'>-		newfd = dup(attrdirfd);</div><div class='del'>-		dirptr = fdopendir(newfd);</div><div class='del'>-		if (dirptr) {</div><div class='del'>-			while ((dent = readdir(dirptr))) {</div><div class='del'>-				size_t listlen = strlen(dent-&gt;d_name);</div><div class='del'>-				if (!strcmp(dent-&gt;d_name, ".") || !strcmp(dent-&gt;d_name, "..")) {</div><div class='del'>-					/* we don't want "." and ".." here */</div><div class='del'>-					continue;</div><div class='del'>-				}</div><div class='del'>-				if (size == 0) {</div><div class='del'>-					/* return the current size of the list of extended attribute names*/</div><div class='del'>-					len += listlen + 1;</div><div class='del'>-				} else {</div><div class='del'>-					/* check size and copy entrie + nul into list. */</div><div class='del'>-					if ((len + listlen + 1) &gt; size) {</div><div class='del'>-						errno = ERANGE;</div><div class='del'>-						len = -1;</div><div class='del'>-						break;</div><div class='del'>-					} else {</div><div class='del'>-						strncpy(list + len, dent-&gt;d_name, listlen);</div><div class='del'>-						len += listlen;</div><div class='del'>-						list[len] = '\0';</div><div class='del'>-						++len;</div><div class='del'>-					}</div><div class='del'>-				}</div><div class='del'>-			}</div><div class='del'>-			</div><div class='del'>-			if (closedir(dirptr) == -1) {</div><div class='del'>-				close (attrdirfd);</div><div class='del'>-				return -1;</div><div class='del'>-			}</div><div class='del'>-		} else {</div><div class='del'>-			close (attrdirfd);</div><div class='del'>-			return -1;</div><div class='del'>-		}</div><div class='del'>-		close (attrdirfd);</div><div class='del'>-	}</div><div class='del'>-	return len;</div><div class='add'>+    int attrfd = -1;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    char *mapped_path = NULL;</div><div class='add'>+</div><div class='add'>+    ret = solaris_xattr_resolve_path(path, &amp;mapped_path);</div><div class='add'>+    if (!ret) {</div><div class='add'>+        attrfd = attropen(mapped_path, key, flags | O_CREAT | O_WRONLY, 0777);</div><div class='add'>+    } else {</div><div class='add'>+        attrfd = attropen(path, key, flags | O_CREAT | O_WRONLY, 0777);</div><div class='add'>+    }</div><div class='add'>+    if (attrfd &gt;= 0) {</div><div class='add'>+        ftruncate(attrfd, 0);</div><div class='add'>+        ret = write(attrfd, value, size);</div><div class='add'>+        close(attrfd);</div><div class='add'>+        ret = 0;</div><div class='add'>+    } else {</div><div class='add'>+        if (errno != ENOENT)</div><div class='add'>+            gf_msg("libglusterfs", GF_LOG_ERROR, errno,</div><div class='add'>+                   LG_MSG_SET_ATTRIBUTE_FAILED,</div><div class='add'>+                   "Couldn't set "</div><div class='add'>+                   "extended attribute for %s",</div><div class='add'>+                   path);</div><div class='add'>+        ret = -1;</div><div class='add'>+    }</div><div class='add'>+    GF_FREE(mapped_path);</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+int</div><div class='add'>+solaris_listxattr(const char *path, char *list, size_t size)</div><div class='add'>+{</div><div class='add'>+    int attrdirfd = -1;</div><div class='add'>+    ssize_t len = 0;</div><div class='add'>+    DIR *dirptr = NULL;</div><div class='add'>+    struct dirent *dent = NULL;</div><div class='add'>+    int newfd = -1;</div><div class='add'>+    char *mapped_path = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    ret = solaris_xattr_resolve_path(path, &amp;mapped_path);</div><div class='add'>+    if (!ret) {</div><div class='add'>+        attrdirfd = attropen(mapped_path, ".", O_RDONLY, 0);</div><div class='add'>+    } else {</div><div class='add'>+        attrdirfd = attropen(path, ".", O_RDONLY, 0);</div><div class='add'>+    }</div><div class='add'>+    if (attrdirfd &gt;= 0) {</div><div class='add'>+        newfd = dup(attrdirfd);</div><div class='add'>+        dirptr = fdopendir(newfd);</div><div class='add'>+        if (dirptr) {</div><div class='add'>+            while ((dent = readdir(dirptr))) {</div><div class='add'>+                size_t listlen = strlen(dent-&gt;d_name);</div><div class='add'>+                if (!strcmp(dent-&gt;d_name, ".") || !strcmp(dent-&gt;d_name, "..")) {</div><div class='add'>+                    /* we don't want "." and ".." here */</div><div class='add'>+                    continue;</div><div class='add'>+                }</div><div class='add'>+                if (size == 0) {</div><div class='add'>+                    /* return the current size of the list</div><div class='add'>+                       of extended attribute names*/</div><div class='add'>+                    len += listlen + 1;</div><div class='add'>+                } else {</div><div class='add'>+                    /* check size and copy entry + null</div><div class='add'>+                       into list. */</div><div class='add'>+                    if ((len + listlen + 1) &gt; size) {</div><div class='add'>+                        errno = ERANGE;</div><div class='add'>+                        len = -1;</div><div class='add'>+                        break;</div><div class='add'>+                    } else {</div><div class='add'>+                        strncpy(list + len, dent-&gt;d_name, listlen);</div><div class='add'>+                        len += listlen;</div><div class='add'>+                        list[len] = '\0';</div><div class='add'>+                        ++len;</div><div class='add'>+                    }</div><div class='add'>+                }</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            if (closedir(dirptr) == -1) {</div><div class='add'>+                close(attrdirfd);</div><div class='add'>+                len = -1;</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+        } else {</div><div class='add'>+            close(attrdirfd);</div><div class='add'>+            len = -1;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+        close(attrdirfd);</div><div class='add'>+    }</div><div class='add'>+out:</div><div class='add'>+    GF_FREE(mapped_path);</div><div class='add'>+    return len;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-solaris_flistxattr(int fd,</div><div class='del'>-                   char *list, </div><div class='del'>-                   size_t size)</div><div class='add'>+solaris_flistxattr(int fd, char *list, size_t size)</div><div class='ctx'> {</div><div class='del'>-	int attrdirfd = -1;</div><div class='del'>-	ssize_t len = 0;</div><div class='del'>-	DIR *dirptr = NULL;</div><div class='del'>-	struct dirent *dent = NULL;</div><div class='del'>-	int newfd = -1;</div><div class='del'>-	</div><div class='del'>-	attrdirfd = openat (fd, ".", O_RDONLY, 0);</div><div class='del'>-	if (attrdirfd &gt;= 0) {</div><div class='del'>-		newfd = dup(attrdirfd);</div><div class='del'>-		dirptr = fdopendir(newfd);</div><div class='del'>-		if (dirptr) {</div><div class='del'>-			while ((dent = readdir(dirptr))) {</div><div class='del'>-				size_t listlen = strlen(dent-&gt;d_name);</div><div class='del'>-				if (!strcmp(dent-&gt;d_name, ".") || !strcmp(dent-&gt;d_name, "..")) {</div><div class='del'>-					/* we don't want "." and ".." here */</div><div class='del'>-					continue;</div><div class='del'>-				}</div><div class='del'>-				if (size == 0) {</div><div class='del'>-					/* return the current size of the list of extended attribute names*/</div><div class='del'>-					len += listlen + 1;</div><div class='del'>-				} else {</div><div class='del'>-					/* check size and copy entrie + nul into list. */</div><div class='del'>-					if ((len + listlen + 1) &gt; size) {</div><div class='del'>-						errno = ERANGE;</div><div class='del'>-						len = -1;</div><div class='del'>-						break;</div><div class='del'>-					} else {</div><div class='del'>-						strncpy(list + len, dent-&gt;d_name, listlen);</div><div class='del'>-						len += listlen;</div><div class='del'>-						list[len] = '\0';</div><div class='del'>-						++len;</div><div class='del'>-					}</div><div class='del'>-				}</div><div class='del'>-			}</div><div class='del'>-			</div><div class='del'>-			if (closedir(dirptr) == -1) {</div><div class='del'>-				close (attrdirfd);</div><div class='del'>-				return -1;</div><div class='del'>-			}</div><div class='del'>-		} else {</div><div class='del'>-			close (attrdirfd);</div><div class='del'>-			return -1;</div><div class='del'>-		}</div><div class='del'>-		close (attrdirfd);</div><div class='del'>-	}</div><div class='del'>-	return len;</div><div class='add'>+    int attrdirfd = -1;</div><div class='add'>+    ssize_t len = 0;</div><div class='add'>+    DIR *dirptr = NULL;</div><div class='add'>+    struct dirent *dent = NULL;</div><div class='add'>+    int newfd = -1;</div><div class='add'>+</div><div class='add'>+    attrdirfd = openat(fd, ".", O_RDONLY, 0);</div><div class='add'>+    if (attrdirfd &gt;= 0) {</div><div class='add'>+        newfd = dup(attrdirfd);</div><div class='add'>+        dirptr = fdopendir(newfd);</div><div class='add'>+        if (dirptr) {</div><div class='add'>+            while ((dent = readdir(dirptr))) {</div><div class='add'>+                size_t listlen = strlen(dent-&gt;d_name);</div><div class='add'>+                if (!strcmp(dent-&gt;d_name, ".") || !strcmp(dent-&gt;d_name, "..")) {</div><div class='add'>+                    /* we don't want "." and ".." here */</div><div class='add'>+                    continue;</div><div class='add'>+                }</div><div class='add'>+                if (size == 0) {</div><div class='add'>+                    /* return the current size of the list</div><div class='add'>+                       of extended attribute names*/</div><div class='add'>+                    len += listlen + 1;</div><div class='add'>+                } else {</div><div class='add'>+                    /* check size and copy entry + null</div><div class='add'>+                       into list. */</div><div class='add'>+                    if ((len + listlen + 1) &gt; size) {</div><div class='add'>+                        errno = ERANGE;</div><div class='add'>+                        len = -1;</div><div class='add'>+                        break;</div><div class='add'>+                    } else {</div><div class='add'>+                        strncpy(list + len, dent-&gt;d_name, listlen);</div><div class='add'>+                        len += listlen;</div><div class='add'>+                        list[len] = '\0';</div><div class='add'>+                        ++len;</div><div class='add'>+                    }</div><div class='add'>+                }</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            if (closedir(dirptr) == -1) {</div><div class='add'>+                close(attrdirfd);</div><div class='add'>+                return -1;</div><div class='add'>+            }</div><div class='add'>+        } else {</div><div class='add'>+            close(attrdirfd);</div><div class='add'>+            return -1;</div><div class='add'>+        }</div><div class='add'>+        close(attrdirfd);</div><div class='add'>+    }</div><div class='add'>+    return len;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+int</div><div class='add'>+solaris_removexattr(const char *path, const char *key)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int attrfd = -1;</div><div class='add'>+    char *mapped_path = NULL;</div><div class='add'>+</div><div class='add'>+    ret = solaris_xattr_resolve_path(path, &amp;mapped_path);</div><div class='add'>+    if (!ret) {</div><div class='add'>+        attrfd = attropen(mapped_path, ".", O_RDONLY, 0);</div><div class='add'>+    } else {</div><div class='add'>+        attrfd = attropen(path, ".", O_RDONLY, 0);</div><div class='add'>+    }</div><div class='add'>+    if (attrfd &gt;= 0) {</div><div class='add'>+        ret = unlinkat(attrfd, key, 0);</div><div class='add'>+        close(attrfd);</div><div class='add'>+    } else {</div><div class='add'>+        if (errno == ENOENT)</div><div class='add'>+            errno = ENODATA;</div><div class='add'>+        ret = -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    GF_FREE(mapped_path);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-int </div><div class='del'>-solaris_removexattr(const char *path, </div><div class='del'>-		    const char* key)</div><div class='add'>+int</div><div class='add'>+solaris_getxattr(const char *path, const char *key, char *value, size_t size)</div><div class='ctx'> {</div><div class='del'>-	int ret = -1;</div><div class='del'>-	int attrfd = attropen (path, ".", O_RDONLY, 0);</div><div class='del'>-	if (attrfd &gt;= 0) {</div><div class='del'>-		ret = unlinkat (attrfd, key, 0);</div><div class='del'>-		close (attrfd);</div><div class='del'>-	} else {</div><div class='del'>-		if (errno == ENOENT)</div><div class='del'>-			errno = ENODATA;</div><div class='del'>-		return -1;</div><div class='del'>-	}</div><div class='del'>-	</div><div class='del'>-	return ret;</div><div class='add'>+    int attrfd = -1;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    char *mapped_path = NULL;</div><div class='add'>+</div><div class='add'>+    ret = solaris_xattr_resolve_path(path, &amp;mapped_path);</div><div class='add'>+    if (!ret) {</div><div class='add'>+        attrfd = attropen(mapped_path, key, O_RDONLY, 0);</div><div class='add'>+    } else {</div><div class='add'>+        attrfd = attropen(path, key, O_RDONLY, 0);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (attrfd &gt;= 0) {</div><div class='add'>+        if (size == 0) {</div><div class='add'>+            struct stat buf;</div><div class='add'>+            fstat(attrfd, &amp;buf);</div><div class='add'>+            ret = buf.st_size;</div><div class='add'>+        } else {</div><div class='add'>+            ret = read(attrfd, value, size);</div><div class='add'>+        }</div><div class='add'>+        close(attrfd);</div><div class='add'>+    } else {</div><div class='add'>+        if (errno != ENOENT)</div><div class='add'>+            gf_msg("libglusterfs", GF_LOG_INFO, errno,</div><div class='add'>+                   LG_MSG_READ_ATTRIBUTE_FAILED,</div><div class='add'>+                   "Couldn't read "</div><div class='add'>+                   "extended attribute for the file %s",</div><div class='add'>+                   path);</div><div class='add'>+        if (errno == ENOENT)</div><div class='add'>+            errno = ENODATA;</div><div class='add'>+        ret = -1;</div><div class='add'>+    }</div><div class='add'>+    GF_FREE(mapped_path);</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-int </div><div class='del'>-solaris_getxattr(const char *path, </div><div class='del'>-		 const char* key, </div><div class='del'>-		 char *value, </div><div class='del'>-		 size_t size)</div><div class='add'>+char *</div><div class='add'>+strsep(char **str, const char *delims)</div><div class='ctx'> {</div><div class='del'>-	int attrfd = -1;</div><div class='del'>-	int ret = 0;</div><div class='del'>-	</div><div class='del'>-	attrfd = attropen (path, key, O_RDONLY, 0);</div><div class='del'>-	if (attrfd &gt;= 0) {</div><div class='del'>-		if (size == 0) {</div><div class='del'>-			struct stat buf;</div><div class='del'>-			fstat (attrfd, &amp;buf);</div><div class='del'>-			ret = buf.st_size;</div><div class='del'>-		} else {</div><div class='del'>-			ret = read (attrfd, value, size);</div><div class='del'>-		}</div><div class='del'>-		close (attrfd);</div><div class='del'>-	} else {</div><div class='del'>-		if (errno == ENOENT)</div><div class='del'>-			errno = ENODATA;</div><div class='del'>-		if (errno != ENOENT)</div><div class='del'>-			gf_log ("libglusterfs", GF_LOG_DEBUG, </div><div class='del'>-				"Couldn't read extended attribute for the file %s (%d)", </div><div class='del'>-				path, errno);</div><div class='del'>-		return -1;</div><div class='del'>-	}</div><div class='del'>-	return ret;</div><div class='add'>+    char *token;</div><div class='add'>+</div><div class='add'>+    if (*str == NULL) {</div><div class='add'>+        /* No more tokens */</div><div class='add'>+        return NULL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    token = *str;</div><div class='add'>+    while (**str != '\0') {</div><div class='add'>+        if (strchr(delims, **str) != NULL) {</div><div class='add'>+            **str = '\0';</div><div class='add'>+            (*str)++;</div><div class='add'>+            return token;</div><div class='add'>+        }</div><div class='add'>+        (*str)++;</div><div class='add'>+    }</div><div class='add'>+    /* There is no other token */</div><div class='add'>+    *str = NULL;</div><div class='add'>+    return token;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+/* Code comes from libiberty */</div><div class='ctx'> </div><div class='del'>-char* strsep(char** str, const char* delims)</div><div class='add'>+int</div><div class='add'>+vasprintf(char **result, const char *format, va_list args)</div><div class='ctx'> {</div><div class='del'>-	char* token;</div><div class='del'>-	</div><div class='del'>-	if (*str==NULL) {</div><div class='del'>-		/* No more tokens */</div><div class='del'>-		return NULL;</div><div class='del'>-	}</div><div class='del'>-	</div><div class='del'>-	token=*str;</div><div class='del'>-	while (**str!='\0') {</div><div class='del'>-		if (strchr(delims,**str)!=NULL) {</div><div class='del'>-			**str='\0';</div><div class='del'>-			(*str)++;</div><div class='del'>-			return token;</div><div class='del'>-		}</div><div class='del'>-		(*str)++;</div><div class='del'>-	}</div><div class='del'>-	/* There is no other token */</div><div class='del'>-	*str=NULL;</div><div class='del'>-	return token;</div><div class='add'>+    return gf_vasprintf(result, format, args);</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-/* Code comes from libiberty */</div><div class='add'>+int</div><div class='add'>+asprintf(char **buf, const char *fmt, ...)</div><div class='add'>+{</div><div class='add'>+    int status;</div><div class='add'>+    va_list ap;</div><div class='add'>+</div><div class='add'>+    va_start(ap, fmt);</div><div class='add'>+    status = vasprintf(buf, fmt, ap);</div><div class='add'>+    va_end(ap);</div><div class='add'>+    return status;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-vasprintf (char **result, const char *format, va_list args)</div><div class='add'>+solaris_unlink(const char *path)</div><div class='ctx'> {</div><div class='del'>-  const char *p = format;</div><div class='del'>-  /* Add one to make sure that it is never zero, which might cause malloc</div><div class='del'>-     to return NULL.  */</div><div class='del'>-  int total_width = strlen (format) + 1;</div><div class='del'>-  va_list ap;</div><div class='del'>-</div><div class='del'>-  /* vasprintf does not work on Solaris when memcpy is called on va_list pointers.</div><div class='del'>-   * Replacing it with va_copy which works on Solaris</div><div class='del'>-   */</div><div class='del'>-  va_copy (ap, args);</div><div class='del'>-</div><div class='del'>-  while (*p != '\0')</div><div class='del'>-    {</div><div class='del'>-      if (*p++ == '%')</div><div class='del'>-	{</div><div class='del'>-	  while (strchr ("-+ #0", *p))</div><div class='del'>-	    ++p;</div><div class='del'>-	  if (*p == '*')</div><div class='del'>-	    {</div><div class='del'>-	      ++p;</div><div class='del'>-	      total_width += abs (va_arg (ap, int));</div><div class='del'>-	    }</div><div class='del'>-	  else</div><div class='del'>-            {</div><div class='del'>-              char *endp;  </div><div class='del'>-              total_width += strtoul (p, &amp;endp, 10);</div><div class='del'>-              p = endp;</div><div class='del'>-            }</div><div class='del'>-	  if (*p == '.')</div><div class='del'>-	    {</div><div class='del'>-	      ++p;</div><div class='del'>-	      if (*p == '*')</div><div class='del'>-		{</div><div class='del'>-		  ++p;</div><div class='del'>-		  total_width += abs (va_arg (ap, int));</div><div class='del'>-		}</div><div class='del'>-	      else</div><div class='del'>-                {</div><div class='del'>-                  char *endp;</div><div class='del'>-                  total_width += strtoul (p, &amp;endp, 10);</div><div class='del'>-                  p = endp;</div><div class='del'>-                }</div><div class='del'>-	    }</div><div class='del'>-	  while (strchr ("hlL", *p))</div><div class='del'>-	    ++p;</div><div class='del'>-	  /* Should be big enough for any format specifier except %s</div><div class='del'>-             and floats.  */</div><div class='del'>-	  total_width += 30;</div><div class='del'>-	  switch (*p)</div><div class='del'>-	    {</div><div class='del'>-	    case 'd':</div><div class='del'>-	    case 'i':</div><div class='del'>-	    case 'o':</div><div class='del'>-	    case 'u':</div><div class='del'>-	    case 'x':</div><div class='del'>-	    case 'X':</div><div class='del'>-	    case 'c':</div><div class='del'>-	      (void) va_arg (ap, int);</div><div class='del'>-	      break;</div><div class='del'>-	    case 'f':</div><div class='del'>-	    case 'e':</div><div class='del'>-	    case 'E':</div><div class='del'>-	    case 'g':</div><div class='del'>-	    case 'G':</div><div class='del'>-	      (void) va_arg (ap, double);</div><div class='del'>-	      /* Since an ieee double can have an exponent of 307, we'll</div><div class='del'>-		 make the buffer wide enough to cover the gross case. */</div><div class='del'>-	      total_width += 307;</div><div class='del'>-	    </div><div class='del'>-	    case 's':</div><div class='del'>-	      total_width += strlen (va_arg (ap, char *));</div><div class='del'>-	      break;</div><div class='del'>-	    case 'p':</div><div class='del'>-	    case 'n':</div><div class='del'>-	      (void) va_arg (ap, char *);</div><div class='del'>-	      break;</div><div class='del'>-	    }</div><div class='del'>-	}</div><div class='add'>+    char *mapped_path = NULL;</div><div class='add'>+    struct stat stbuf = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    ret = solaris_xattr_resolve_path(path, &amp;mapped_path);</div><div class='add'>+</div><div class='add'>+    if (!ret &amp;&amp; mapped_path) {</div><div class='add'>+        if (lstat(path, &amp;stbuf)) {</div><div class='add'>+            gf_msg(THIS-&gt;name, GF_LOG_WARNING, errno, LG_MSG_FILE_OP_FAILED,</div><div class='add'>+                   "Stat failed on "</div><div class='add'>+                   "mapped file %s",</div><div class='add'>+                   mapped_path);</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+        if (stbuf.st_nlink == 1) {</div><div class='add'>+            if (remove(mapped_path))</div><div class='add'>+                gf_msg(THIS-&gt;name, GF_LOG_WARNING, errno, LG_MSG_FILE_OP_FAILED,</div><div class='add'>+                       "Failed to "</div><div class='add'>+                       "remove mapped file %s",</div><div class='add'>+                       mapped_path);</div><div class='add'>+        }</div><div class='ctx'>     }</div><div class='ctx'> </div><div class='del'>-  va_end (ap);</div><div class='add'>+out:</div><div class='add'>+    GF_FREE(mapped_path);</div><div class='ctx'> </div><div class='del'>-  *result = malloc (total_width);</div><div class='del'>-  if (*result != NULL)</div><div class='del'>-    return vsprintf (*result, format, args);</div><div class='del'>-  else</div><div class='del'>-    return 0;</div><div class='add'>+    return unlink(path);</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-asprintf (char **buf, const char *fmt, ...)</div><div class='add'>+solaris_rename(const char *old_path, const char *new_path)</div><div class='add'>+{</div><div class='add'>+    char *mapped_path = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    ret = solaris_xattr_resolve_path(new_path, &amp;mapped_path);</div><div class='add'>+</div><div class='add'>+    if (!ret &amp;&amp; mapped_path) {</div><div class='add'>+        if (!remove(mapped_path))</div><div class='add'>+            gf_msg(THIS-&gt;name, GF_LOG_WARNING, errno, LG_MSG_FILE_OP_FAILED,</div><div class='add'>+                   "Failed to remove "</div><div class='add'>+                   "mapped file %s.",</div><div class='add'>+                   mapped_path);</div><div class='add'>+        GF_FREE(mapped_path);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return rename(old_path, new_path);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+char *</div><div class='add'>+mkdtemp(char *tempstring)</div><div class='ctx'> {</div><div class='del'>-  int status;</div><div class='del'>-  va_list ap;</div><div class='add'>+    char *new_string = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    new_string = mkstemp(tempstring);</div><div class='add'>+    if (!new_string)</div><div class='add'>+        goto out;</div><div class='ctx'> </div><div class='del'>-  va_start (ap, fmt);</div><div class='del'>-  status = vasprintf (buf, fmt, ap);</div><div class='del'>-  va_end (ap);</div><div class='del'>-  return status;  </div><div class='add'>+    ret = mkdir(new_string, 0700);</div><div class='add'>+    if (ret &lt; 0)</div><div class='add'>+        new_string = NULL;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return new_string;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> #endif /* GF_SOLARIS_HOST_OS */</div><div class='ctx'> </div><div class='add'>+#ifdef GF_BSD_HOST_OS</div><div class='add'>+void</div><div class='add'>+gf_extattr_list_reshape(char *bsd_list, ssize_t size)</div><div class='add'>+{</div><div class='add'>+    /*</div><div class='add'>+     * the format of bsd_list is</div><div class='add'>+     *     &lt;attr_len&gt;attr&lt;attr_len&gt;attr...</div><div class='add'>+     * we try to reformat it as Linux's</div><div class='add'>+     *     attr&lt;\0&gt;attr&lt;\0&gt;...</div><div class='add'>+     * */</div><div class='add'>+    if (NULL == bsd_list || size &lt;= 0)</div><div class='add'>+        return;</div><div class='add'>+</div><div class='add'>+    size_t i = 0, j;</div><div class='add'>+</div><div class='add'>+    while (i &lt; size) {</div><div class='add'>+        size_t attr_len = bsd_list[i];</div><div class='add'>+</div><div class='add'>+        for (j = i; j &lt; i + attr_len; ++j)</div><div class='add'>+            bsd_list[j] = bsd_list[j + 1];</div><div class='add'>+        bsd_list[j] = '\0';</div><div class='add'>+</div><div class='add'>+        i += attr_len + 1;</div><div class='add'>+        gf_msg_debug("syscall", 0, "syscall debug: %lu", attr_len);</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+#endif /* GF_BSD_HOST_OS */</div><div class='add'>+</div><div class='ctx'> #ifndef HAVE_STRNLEN</div><div class='del'>-size_t </div><div class='del'>-strnlen(const char *string, size_t maxlen)                   </div><div class='add'>+size_t</div><div class='add'>+strnlen(const char *string, size_t maxlen)</div><div class='ctx'> {</div><div class='del'>-	int len = 0;</div><div class='del'>-	while ((len &lt; maxlen) &amp;&amp; string[len])</div><div class='del'>-		len++;</div><div class='del'>-	return len;</div><div class='add'>+    int len = 0;</div><div class='add'>+    while ((len &lt; maxlen) &amp;&amp; string[len])</div><div class='add'>+        len++;</div><div class='add'>+    return len;</div><div class='ctx'> }</div><div class='ctx'> #endif /* STRNLEN */</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+gf_umount_lazy(char *xlname, char *path, int rmdir_flag)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    runner_t runner = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    runinit(&amp;runner);</div><div class='add'>+#ifdef GF_LINUX_HOST_OS</div><div class='add'>+    runner_add_args(&amp;runner, _PATH_UMOUNT, "-l", path, NULL);</div><div class='add'>+#else</div><div class='add'>+    if (rmdir_flag)</div><div class='add'>+        runner_add_args(&amp;runner, SBIN_DIR "/umountd", "-r", path, NULL);</div><div class='add'>+    else</div><div class='add'>+        runner_add_args(&amp;runner, SBIN_DIR "/umountd", path, NULL);</div><div class='add'>+#endif</div><div class='add'>+    ret = runner_run(&amp;runner);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_msg(xlname, GF_LOG_ERROR, errno, LG_MSG_UNMOUNT_FAILED,</div><div class='add'>+               "Lazy unmount of %s", path);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+#ifdef GF_LINUX_HOST_OS</div><div class='add'>+    if (!ret &amp;&amp; rmdir_flag) {</div><div class='add'>+        ret = sys_rmdir(path);</div><div class='add'>+        if (ret)</div><div class='add'>+            gf_msg(xlname, GF_LOG_WARNING, errno, LG_MSG_DIR_OP_FAILED,</div><div class='add'>+                   "rmdir %s", path);</div><div class='add'>+    }</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='head'>diff --git a/libglusterfs/src/compat.h b/libglusterfs/src/compat.h<br/>deleted file mode 100644<br/>index 51539648b22..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/libglusterfs/src/compat.h?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/compat.h</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,354 +0,0 @@</div><div class='del'>-/*</div><div class='del'>-   Copyright (c) 2006-2009 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='del'>-   This file is part of GlusterFS.</div><div class='del'>-</div><div class='del'>-   GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-   it under the terms of the GNU General Public License as published</div><div class='del'>-   by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-   or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-   GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-   WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-   General Public License for more details.</div><div class='del'>-</div><div class='del'>-   You should have received a copy of the GNU General Public License</div><div class='del'>-   along with this program.  If not, see</div><div class='del'>-   &lt;http://www.gnu.org/licenses/&gt;.</div><div class='del'>-*/</div><div class='del'>-</div><div class='del'>-#ifndef __COMPAT_H__</div><div class='del'>-#define __COMPAT_H__</div><div class='del'>-</div><div class='del'>-#ifndef _CONFIG_H</div><div class='del'>-#define _CONFIG_H</div><div class='del'>-#include "config.h"</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-#include &lt;stdint.h&gt;</div><div class='del'>-#include "dict.h"</div><div class='del'>-</div><div class='del'>-#ifndef LLONG_MAX</div><div class='del'>-#define LLONG_MAX __LONG_LONG_MAX__ /* compat with old gcc */</div><div class='del'>-#endif /* LLONG_MAX */</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-#ifdef GF_LINUX_HOST_OS</div><div class='del'>-</div><div class='del'>-#define UNIX_PATH_MAX 108</div><div class='del'>-</div><div class='del'>-#include &lt;sys/un.h&gt;</div><div class='del'>-#include &lt;linux/limits.h&gt;</div><div class='del'>-#include &lt;sys/xattr.h&gt;</div><div class='del'>-#include &lt;endian.h&gt;</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-#ifndef HAVE_LLISTXATTR</div><div class='del'>-</div><div class='del'>-/* This part is valid only incase of old glibc which doesn't support </div><div class='del'>- * 'llistxattr()' system calls.</div><div class='del'>- */</div><div class='del'>-</div><div class='del'>-#define lremovexattr(path,key) removexattr(path,key)</div><div class='del'>-#define llistxattr(path,key,size)  listxattr(path,key,size)</div><div class='del'>-#define lgetxattr(path, key, value, size) getxattr(path,key,value,size)</div><div class='del'>-#define lsetxattr(path,key,value,size,flags) setxattr(path,key,value,size,flags)</div><div class='del'>-</div><div class='del'>-#endif /* HAVE_LLISTXATTR */</div><div class='del'>-#endif /* GF_LINUX_HOST_OS */</div><div class='del'>-</div><div class='del'>-#ifdef GF_BSD_HOST_OS </div><div class='del'>-/* In case of FreeBSD */</div><div class='del'>-</div><div class='del'>-#define UNIX_PATH_MAX 104</div><div class='del'>-#include &lt;sys/types.h&gt;</div><div class='del'>-</div><div class='del'>-#include &lt;sys/un.h&gt;</div><div class='del'>-#include &lt;sys/endian.h&gt;</div><div class='del'>-#include &lt;sys/extattr.h&gt;</div><div class='del'>-#include &lt;limits.h&gt;</div><div class='del'>-</div><div class='del'>-#include &lt;libgen.h&gt;</div><div class='del'>-</div><div class='del'>-enum {</div><div class='del'>-        ATTR_CREATE = 1,</div><div class='del'>-#define XATTR_CREATE ATTR_CREATE</div><div class='del'>-        ATTR_REPLACE = 2</div><div class='del'>-#define XATTR_REPLACE ATTR_REPLACE</div><div class='del'>-};</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-#ifndef sighandler_t</div><div class='del'>-#define sighandler_t sig_t</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-#ifndef ino64_t</div><div class='del'>-#define ino64_t ino_t</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-#ifndef EUCLEAN</div><div class='del'>-#define EUCLEAN 0</div><div class='del'>-#endif </div><div class='del'>-</div><div class='del'>-#include &lt;netinet/in.h&gt;</div><div class='del'>-#ifndef s6_addr16</div><div class='del'>-#define s6_addr16 __u6_addr.__u6_addr16</div><div class='del'>-#endif</div><div class='del'>-#ifndef s6_addr32</div><div class='del'>-#define s6_addr32 __u6_addr.__u6_addr32</div><div class='del'>-#endif </div><div class='del'>-</div><div class='del'>-/* Posix dictates NAME_MAX to be used */</div><div class='del'>-# ifndef NAME_MAX</div><div class='del'>-#  ifdef  MAXNAMLEN</div><div class='del'>-#   define NAME_MAX MAXNAMLEN</div><div class='del'>-#  else</div><div class='del'>-#   define NAME_MAX 255</div><div class='del'>-#  endif</div><div class='del'>-# endif</div><div class='del'>-        </div><div class='del'>-#define F_GETLK64       F_GETLK</div><div class='del'>-#define F_SETLK64       F_SETLK</div><div class='del'>-#define F_SETLKW64      F_SETLKW</div><div class='del'>-</div><div class='del'>-#endif /* GF_BSD_HOST_OS */</div><div class='del'>-</div><div class='del'>-#ifdef GF_DARWIN_HOST_OS</div><div class='del'>-</div><div class='del'>-#define UNIX_PATH_MAX 104</div><div class='del'>-#include &lt;sys/types.h&gt;</div><div class='del'>-</div><div class='del'>-#include &lt;sys/un.h&gt;</div><div class='del'>-#include &lt;machine/endian.h&gt;</div><div class='del'>-#include &lt;sys/xattr.h&gt;</div><div class='del'>-#include &lt;limits.h&gt;</div><div class='del'>-</div><div class='del'>-#include &lt;libgen.h&gt;</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-#if __DARWIN_64_BIT_INO_T == 0</div><div class='del'>-#    error '64 bit ino_t is must for GlusterFS to work, Compile with "CFLAGS=-D__DARWIN_64_BIT_INO_T"'</div><div class='del'>-#endif /* __DARWIN_64_BIT_INO_T */</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-#if __DARWIN_64_BIT_INO_T == 0</div><div class='del'>-#    error '64 bit ino_t is must for GlusterFS to work, Compile with "CFLAGS=-D__DARWIN_64_BIT_INO_T"'</div><div class='del'>-#endif /* __DARWIN_64_BIT_INO_T */</div><div class='del'>-</div><div class='del'>-#ifndef sighandler_t</div><div class='del'>-#define sighandler_t sig_t</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-#ifndef EUCLEAN</div><div class='del'>-#define EUCLEAN 0</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-#include &lt;netinet/in.h&gt;</div><div class='del'>-#ifndef s6_addr16</div><div class='del'>-#define s6_addr16 __u6_addr.__u6_addr16</div><div class='del'>-#endif </div><div class='del'>-#ifndef s6_addr32</div><div class='del'>-#define s6_addr32 __u6_addr.__u6_addr32</div><div class='del'>-#endif </div><div class='del'>-</div><div class='del'>-/* Posix dictates NAME_MAX to be used */</div><div class='del'>-# ifndef NAME_MAX</div><div class='del'>-#  ifdef  MAXNAMLEN</div><div class='del'>-#   define NAME_MAX MAXNAMLEN</div><div class='del'>-#  else</div><div class='del'>-#   define NAME_MAX 255</div><div class='del'>-#  endif</div><div class='del'>-# endif</div><div class='del'>-</div><div class='del'>-#define F_GETLK64       F_GETLK</div><div class='del'>-#define F_SETLK64       F_SETLK</div><div class='del'>-#define F_SETLKW64      F_SETLKW</div><div class='del'>-</div><div class='del'>-#ifndef FTW_CONTINUE</div><div class='del'>-  #define FTW_CONTINUE 0</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-int32_t gf_darwin_compat_listxattr (int len, dict_t *dict, int size);</div><div class='del'>-int32_t gf_darwin_compat_getxattr (const char *key, dict_t *dict);</div><div class='del'>-int32_t gf_darwin_compat_setxattr (dict_t *dict);</div><div class='del'>-</div><div class='del'>-#endif /* GF_DARWIN_HOST_OS */</div><div class='del'>-</div><div class='del'>-#ifdef GF_SOLARIS_HOST_OS</div><div class='del'>-</div><div class='del'>-#define UNIX_PATH_MAX 108</div><div class='del'>-#define EUCLEAN 117 </div><div class='del'>-</div><div class='del'>-#include &lt;sys/un.h&gt;</div><div class='del'>-#include &lt;limits.h&gt;</div><div class='del'>-#include &lt;sys/stat.h&gt;</div><div class='del'>-#include &lt;unistd.h&gt;</div><div class='del'>-#include &lt;sys/fcntl.h&gt;</div><div class='del'>-#include &lt;libgen.h&gt;</div><div class='del'>-#include &lt;sys/mkdev.h&gt;</div><div class='del'>-</div><div class='del'>-#ifndef lchmod</div><div class='del'>-#define lchmod chmod</div><div class='del'>-#endif </div><div class='del'>-</div><div class='del'>-#define lgetxattr(path, key, value, size) solaris_getxattr(path,key,value,size)</div><div class='del'>-enum {</div><div class='del'>-        ATTR_CREATE = 1,</div><div class='del'>-#define XATTR_CREATE ATTR_CREATE</div><div class='del'>-        ATTR_REPLACE = 2</div><div class='del'>-#define XATTR_REPLACE ATTR_REPLACE</div><div class='del'>-};</div><div class='del'>-</div><div class='del'>-/* This patch is not present in Solaris 10 and before */</div><div class='del'>-#ifndef dirfd</div><div class='del'>-#define dirfd(dirp)   ((dirp)-&gt;dd_fd)</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-/* Posix dictates NAME_MAX to be used */</div><div class='del'>-# ifndef NAME_MAX</div><div class='del'>-#  ifdef  MAXNAMLEN</div><div class='del'>-#   define NAME_MAX MAXNAMLEN</div><div class='del'>-#  else </div><div class='del'>-#   define NAME_MAX 255</div><div class='del'>-#  endif</div><div class='del'>-# endif </div><div class='del'>-</div><div class='del'>-#include &lt;netinet/in.h&gt;</div><div class='del'>-#ifndef s6_addr16</div><div class='del'>-#define S6_ADDR16(x)    ((uint16_t*) ((char*)&amp;(x).s6_addr))</div><div class='del'>-#endif</div><div class='del'>-#ifndef s6_addr32</div><div class='del'>-#define s6_addr32       _S6_un._S6_u32</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-#define lutimes(filename,times)              utimes(filename,times)</div><div class='del'>-</div><div class='del'>-#ifndef SEEK_SET</div><div class='del'>-#define SEEK_SET 0</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-enum {</div><div class='del'>-        DT_UNKNOWN = 0,</div><div class='del'>-# define DT_UNKNOWN	DT_UNKNOWN</div><div class='del'>-        DT_FIFO = 1,</div><div class='del'>-# define DT_FIFO	DT_FIFO</div><div class='del'>-        DT_CHR = 2,</div><div class='del'>-# define DT_CHR		DT_CHR</div><div class='del'>-        DT_DIR = 4,</div><div class='del'>-# define DT_DIR		DT_DIR</div><div class='del'>-        DT_BLK = 6,</div><div class='del'>-# define DT_BLK		DT_BLK</div><div class='del'>-        DT_REG = 8,</div><div class='del'>-# define DT_REG		DT_REG</div><div class='del'>-        DT_LNK = 10,</div><div class='del'>-# define DT_LNK		DT_LNK</div><div class='del'>-        DT_SOCK = 12,</div><div class='del'>-# define DT_SOCK	DT_SOCK</div><div class='del'>-        DT_WHT = 14</div><div class='del'>-# define DT_WHT		DT_WHT</div><div class='del'>-};</div><div class='del'>-</div><div class='del'>-#ifndef _PATH_MOUNTED</div><div class='del'>- #define _PATH_MOUNTED "/etc/mtab"</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-#ifndef O_ASYNC</div><div class='del'>-  #ifdef FASYNC</div><div class='del'>-    #define O_ASYNC FASYNC</div><div class='del'>-  #else</div><div class='del'>-    #define O_ASYNC 0</div><div class='del'>-  #endif</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-#ifndef FTW_CONTINUE</div><div class='del'>-  #define FTW_CONTINUE 0</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-int asprintf(char **string_ptr, const char *format, ...); </div><div class='del'>-</div><div class='del'>-int vasprintf (char **result, const char *format, va_list args);</div><div class='del'>-char* strsep(char** str, const char* delims);</div><div class='del'>-int solaris_listxattr(const char *path, char *list, size_t size);</div><div class='del'>-int solaris_removexattr(const char *path, const char* key);</div><div class='del'>-int solaris_getxattr(const char *path, const char* key, </div><div class='del'>-                     char *value, size_t size);</div><div class='del'>-int solaris_setxattr(const char *path, const char* key, const char *value, </div><div class='del'>-                     size_t size, int flags);</div><div class='del'>-int solaris_fgetxattr(int fd, const char* key,</div><div class='del'>-                      char *value, size_t size);</div><div class='del'>-int solaris_fsetxattr(int fd, const char* key, const char *value, </div><div class='del'>-                      size_t size, int flags);</div><div class='del'>-int solaris_flistxattr(int fd, char *list, size_t size);</div><div class='del'>-</div><div class='del'>-#endif /* GF_SOLARIS_HOST_OS */</div><div class='del'>-</div><div class='del'>-#ifndef HAVE_ARGP</div><div class='del'>-#include "argp.h"</div><div class='del'>-#else</div><div class='del'>-#include &lt;argp.h&gt;</div><div class='del'>-#endif /* HAVE_ARGP */</div><div class='del'>-</div><div class='del'>-#ifndef HAVE_STRNLEN</div><div class='del'>-size_t strnlen(const char *string, size_t maxlen);                   </div><div class='del'>-#endif /* STRNLEN */</div><div class='del'>-</div><div class='del'>-#ifndef strdupa</div><div class='del'>-#define strdupa(s)                                                      \</div><div class='del'>-        (__extension__                                                  \</div><div class='del'>-         ({                                                             \</div><div class='del'>-                 __const char *__old = (s);                             \</div><div class='del'>-                 size_t __len = strlen (__old) + 1;                     \</div><div class='del'>-                 char *__new = (char *) __builtin_alloca (__len);       \</div><div class='del'>-                 (char *) memcpy (__new, __old, __len);                 \</div><div class='del'>-         }))</div><div class='del'>-#endif </div><div class='del'>-</div><div class='del'>-#define GF_DIR_ALIGN(x) (((x) + sizeof (uint64_t) - 1) &amp; ~(sizeof (uint64_t) - 1))</div><div class='del'>-</div><div class='del'>-#include &lt;sys/types.h&gt;</div><div class='del'>-#include &lt;dirent.h&gt;</div><div class='del'>-</div><div class='del'>-static inline int32_t</div><div class='del'>-dirent_size (struct dirent *entry)</div><div class='del'>-{</div><div class='del'>-#ifdef GF_BSD_HOST_OS</div><div class='del'>-        return GF_DIR_ALIGN (24 /* FIX MEEEE!!! */ + entry-&gt;d_namlen);</div><div class='del'>-#endif</div><div class='del'>-#ifdef GF_DARWIN_HOST_OS</div><div class='del'>-        return GF_DIR_ALIGN (24 /* FIX MEEEE!!! */ + entry-&gt;d_namlen);</div><div class='del'>-#endif</div><div class='del'>-#ifdef GF_LINUX_HOST_OS</div><div class='del'>-        return GF_DIR_ALIGN (24 /* FIX MEEEE!!! */ + entry-&gt;d_reclen);</div><div class='del'>-#endif</div><div class='del'>-#ifdef GF_SOLARIS_HOST_OS</div><div class='del'>-        return GF_DIR_ALIGN (24 /* FIX MEEEE!!! */ + entry-&gt;d_reclen);</div><div class='del'>-#endif</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-#ifdef HAVE_STRUCT_STAT_ST_ATIM_TV_NSEC</div><div class='del'>-/* Linux, Solaris, Cygwin */</div><div class='del'>-#define ST_ATIM_NSEC(stbuf) ((stbuf)-&gt;st_atim.tv_nsec)</div><div class='del'>-#define ST_CTIM_NSEC(stbuf) ((stbuf)-&gt;st_ctim.tv_nsec)</div><div class='del'>-#define ST_MTIM_NSEC(stbuf) ((stbuf)-&gt;st_mtim.tv_nsec)</div><div class='del'>-#define ST_ATIM_NSEC_SET(stbuf, val) ((stbuf)-&gt;st_atim.tv_nsec = (val))</div><div class='del'>-#define ST_MTIM_NSEC_SET(stbuf, val) ((stbuf)-&gt;st_mtim.tv_nsec = (val))</div><div class='del'>-#define ST_CTIM_NSEC_SET(stbuf, val) ((stbuf)-&gt;st_ctim.tv_nsec = (val))</div><div class='del'>-#elif defined(HAVE_STRUCT_STAT_ST_ATIMESPEC_TV_NSEC)</div><div class='del'>-/* FreeBSD, NetBSD */</div><div class='del'>-#define ST_ATIM_NSEC(stbuf) ((stbuf)-&gt;st_atimespec.tv_nsec)</div><div class='del'>-#define ST_CTIM_NSEC(stbuf) ((stbuf)-&gt;st_ctimespec.tv_nsec)</div><div class='del'>-#define ST_MTIM_NSEC(stbuf) ((stbuf)-&gt;st_mtimespec.tv_nsec)</div><div class='del'>-#define ST_ATIM_NSEC_SET(stbuf, val) ((stbuf)-&gt;st_atimespec.tv_nsec = (val))</div><div class='del'>-#define ST_MTIM_NSEC_SET(stbuf, val) ((stbuf)-&gt;st_mtimespec.tv_nsec = (val))</div><div class='del'>-#define ST_CTIM_NSEC_SET(stbuf, val) ((stbuf)-&gt;st_ctimespec.tv_nsec = (val))</div><div class='del'>-#else</div><div class='del'>-#define ST_ATIM_NSEC(stbuf) (0)</div><div class='del'>-#define ST_CTIM_NSEC(stbuf) (0)</div><div class='del'>-#define ST_MTIM_NSEC(stbuf) (0)</div><div class='del'>-#define ST_ATIM_NSEC_SET(stbuf, val) do { } while (0);</div><div class='del'>-#define ST_MTIM_NSEC_SET(stbuf, val) do { } while (0);</div><div class='del'>-#define ST_CTIM_NSEC_SET(stbuf, val) do { } while (0);</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-#endif /* __COMPAT_H__ */</div><div class='head'>diff --git a/libglusterfs/src/ctx.c b/libglusterfs/src/ctx.c<br/>new file mode 100644<br/>index 00000000000..3d890b04ec9<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/libglusterfs/src/ctx.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>libglusterfs/src/ctx.c</a></div><div class='hunk'>@@ -0,0 +1,97 @@</div><div class='add'>+/*</div><div class='add'>+  Copyright (c) 2008-2012 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#include &lt;pthread.h&gt;</div><div class='add'>+</div><div class='add'>+#include "glusterfs/globals.h"</div><div class='add'>+#include "glusterfs/glusterfs.h"</div><div class='add'>+#include "timer-wheel.h"</div><div class='add'>+</div><div class='add'>+glusterfs_ctx_t *</div><div class='add'>+glusterfs_ctx_new()</div><div class='add'>+{</div><div class='add'>+    glusterfs_ctx_t *ctx = NULL;</div><div class='add'>+</div><div class='add'>+    /* no GF_CALLOC here, gf_acct_mem_set_enable is not</div><div class='add'>+       yet decided at this point */</div><div class='add'>+    ctx = CALLOC(1, sizeof(*ctx));</div><div class='add'>+    if (!ctx) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ctx-&gt;mem_acct_enable = gf_global_mem_acct_enable_get();</div><div class='add'>+</div><div class='add'>+    INIT_LIST_HEAD(&amp;ctx-&gt;graphs);</div><div class='add'>+    INIT_LIST_HEAD(&amp;ctx-&gt;mempool_list);</div><div class='add'>+    INIT_LIST_HEAD(&amp;ctx-&gt;volfile_list);</div><div class='add'>+</div><div class='add'>+    ctx-&gt;daemon_pipe[0] = -1;</div><div class='add'>+    ctx-&gt;daemon_pipe[1] = -1;</div><div class='add'>+</div><div class='add'>+    ctx-&gt;log.loglevel = DEFAULT_LOG_LEVEL;</div><div class='add'>+</div><div class='add'>+#if defined(RUN_WITH_MEMCHECK)</div><div class='add'>+    ctx-&gt;cmd_args.vgtool = _gf_memcheck;</div><div class='add'>+#elif defined(RUN_WITH_DRD)</div><div class='add'>+    ctx-&gt;cmd_args.vgtool = _gf_drd;</div><div class='add'>+#else</div><div class='add'>+    ctx-&gt;cmd_args.vgtool = _gf_none;</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+    /* lock is never destroyed! */</div><div class='add'>+    if (LOCK_INIT(&amp;ctx-&gt;lock)) {</div><div class='add'>+        free(ctx);</div><div class='add'>+        ctx = NULL;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    GF_ATOMIC_INIT(ctx-&gt;stats.max_dict_pairs, 0);</div><div class='add'>+    GF_ATOMIC_INIT(ctx-&gt;stats.total_pairs_used, 0);</div><div class='add'>+    GF_ATOMIC_INIT(ctx-&gt;stats.total_dicts_used, 0);</div><div class='add'>+out:</div><div class='add'>+    return ctx;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+glusterfs_ctx_tw_destroy(struct gf_ctx_tw *ctx_tw)</div><div class='add'>+{</div><div class='add'>+    if (ctx_tw-&gt;timer_wheel)</div><div class='add'>+        gf_tw_cleanup_timers(ctx_tw-&gt;timer_wheel);</div><div class='add'>+</div><div class='add'>+    GF_FREE(ctx_tw);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+struct tvec_base *</div><div class='add'>+glusterfs_ctx_tw_get(glusterfs_ctx_t *ctx)</div><div class='add'>+{</div><div class='add'>+    struct gf_ctx_tw *ctx_tw = NULL;</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;ctx-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        if (ctx-&gt;tw) {</div><div class='add'>+            ctx_tw = GF_REF_GET(ctx-&gt;tw);</div><div class='add'>+        } else {</div><div class='add'>+            ctx_tw = GF_CALLOC(1, sizeof(struct gf_ctx_tw),</div><div class='add'>+                               gf_common_mt_tw_ctx);</div><div class='add'>+            ctx_tw-&gt;timer_wheel = gf_tw_init_timers();</div><div class='add'>+            GF_REF_INIT(ctx_tw, glusterfs_ctx_tw_destroy);</div><div class='add'>+            ctx-&gt;tw = ctx_tw;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    UNLOCK(&amp;ctx-&gt;lock);</div><div class='add'>+</div><div class='add'>+    return ctx_tw-&gt;timer_wheel;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+glusterfs_ctx_tw_put(glusterfs_ctx_t *ctx)</div><div class='add'>+{</div><div class='add'>+    GF_REF_PUT(ctx-&gt;tw);</div><div class='add'>+}</div><div class='head'>diff --git a/libglusterfs/src/daemon.c b/libglusterfs/src/daemon.c<br/>new file mode 100644<br/>index 00000000000..0a3e5438325<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/libglusterfs/src/daemon.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>libglusterfs/src/daemon.c</a></div><div class='hunk'>@@ -0,0 +1,65 @@</div><div class='add'>+/*</div><div class='add'>+  Copyright (c) 2008-2012 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#include &lt;unistd.h&gt;</div><div class='add'>+#include &lt;stdio.h&gt;</div><div class='add'>+#include "glusterfs/daemon.h"</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+os_daemon_return(int nochdir, int noclose)</div><div class='add'>+{</div><div class='add'>+    pid_t pid = -1;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    FILE *ptr = NULL;</div><div class='add'>+</div><div class='add'>+    ret = fork();</div><div class='add'>+    if (ret)</div><div class='add'>+        return ret;</div><div class='add'>+</div><div class='add'>+    pid = setsid();</div><div class='add'>+</div><div class='add'>+    if (pid == -1) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (!nochdir)</div><div class='add'>+        ret = chdir("/");</div><div class='add'>+</div><div class='add'>+    if (!noclose) {</div><div class='add'>+        ptr = freopen(DEVNULLPATH, "r", stdin);</div><div class='add'>+        if (!ptr)</div><div class='add'>+            goto out;</div><div class='add'>+</div><div class='add'>+        ptr = freopen(DEVNULLPATH, "w", stdout);</div><div class='add'>+        if (!ptr)</div><div class='add'>+            goto out;</div><div class='add'>+</div><div class='add'>+        ptr = freopen(DEVNULLPATH, "w", stderr);</div><div class='add'>+        if (!ptr)</div><div class='add'>+            goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+os_daemon(int nochdir, int noclose)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    ret = os_daemon_return(nochdir, noclose);</div><div class='add'>+    if (ret &lt;= 0)</div><div class='add'>+        return ret;</div><div class='add'>+</div><div class='add'>+    _exit(0);</div><div class='add'>+}</div><div class='head'>diff --git a/libglusterfs/src/default-args.c b/libglusterfs/src/default-args.c<br/>new file mode 100644<br/>index 00000000000..a0ba1cfb299<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/libglusterfs/src/default-args.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>libglusterfs/src/default-args.c</a></div><div class='hunk'>@@ -0,0 +1,1651 @@</div><div class='add'>+/*</div><div class='add'>+  Copyright (c) 2008-2015 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#ifndef _CONFIG_H</div><div class='add'>+#define _CONFIG_H</div><div class='add'>+#include "config.h"</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#include "glusterfs/defaults.h"</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+args_lookup_store(default_args_t *args, loc_t *loc, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    loc_copy(&amp;args-&gt;loc, loc);</div><div class='add'>+    if (xdata)</div><div class='add'>+        args-&gt;xdata = dict_ref(xdata);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+args_lookup_cbk_store(default_args_cbk_t *args, int32_t op_ret,</div><div class='add'>+                      int32_t op_errno, inode_t *inode, struct iatt *buf,</div><div class='add'>+                      dict_t *xdata, struct iatt *postparent)</div><div class='add'>+{</div><div class='add'>+    args-&gt;op_ret = op_ret;</div><div class='add'>+    args-&gt;op_errno = op_errno;</div><div class='add'>+    if (inode)</div><div class='add'>+        args-&gt;inode = inode_ref(inode);</div><div class='add'>+    if (buf)</div><div class='add'>+        args-&gt;stat = *buf;</div><div class='add'>+    if (postparent)</div><div class='add'>+        args-&gt;postparent = *postparent;</div><div class='add'>+    if (xdata)</div><div class='add'>+        args-&gt;xdata = dict_ref(xdata);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+args_stat_store(default_args_t *args, loc_t *loc, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    loc_copy(&amp;args-&gt;loc, loc);</div><div class='add'>+    if (xdata)</div><div class='add'>+        args-&gt;xdata = dict_ref(xdata);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+args_stat_cbk_store(default_args_cbk_t *args, int32_t op_ret, int32_t op_errno,</div><div class='add'>+                    struct iatt *buf, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    args-&gt;op_ret = op_ret;</div><div class='add'>+    args-&gt;op_errno = op_errno;</div><div class='add'>+    if (op_ret == 0)</div><div class='add'>+        args-&gt;stat = *buf;</div><div class='add'>+    if (xdata)</div><div class='add'>+        args-&gt;xdata = dict_ref(xdata);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+args_fstat_store(default_args_t *args, fd_t *fd, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    if (fd)</div><div class='add'>+        args-&gt;fd = fd_ref(fd);</div><div class='add'>+    if (xdata)</div><div class='add'>+        args-&gt;xdata = dict_ref(xdata);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+args_fstat_cbk_store(default_args_cbk_t *args, int32_t op_ret, int32_t op_errno,</div><div class='add'>+                     struct iatt *buf, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    args-&gt;op_ret = op_ret;</div><div class='add'>+    args-&gt;op_errno = op_errno;</div><div class='add'>+    if (buf)</div><div class='add'>+        args-&gt;stat = *buf;</div><div class='add'>+    if (xdata)</div><div class='add'>+        args-&gt;xdata = dict_ref(xdata);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+args_truncate_store(default_args_t *args, loc_t *loc, off_t off, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    loc_copy(&amp;args-&gt;loc, loc);</div><div class='add'>+    args-&gt;offset = off;</div><div class='add'>+    if (xdata)</div><div class='add'>+        args-&gt;xdata = dict_ref(xdata);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+args_truncate_cbk_store(default_args_cbk_t *args, int32_t op_ret,</div><div class='add'>+                        int32_t op_errno, struct iatt *prebuf,</div><div class='add'>+                        struct iatt *postbuf, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    args-&gt;op_ret = op_ret;</div><div class='add'>+    args-&gt;op_errno = op_errno;</div><div class='add'>+    if (prebuf)</div><div class='add'>+        args-&gt;prestat = *prebuf;</div><div class='add'>+    if (postbuf)</div><div class='add'>+        args-&gt;poststat = *postbuf;</div><div class='add'>+    if (xdata)</div><div class='add'>+        args-&gt;xdata = dict_ref(xdata);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+args_ftruncate_store(default_args_t *args, fd_t *fd, off_t off, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    if (fd)</div><div class='add'>+        args-&gt;fd = fd_ref(fd);</div><div class='add'>+</div><div class='add'>+    args-&gt;offset = off;</div><div class='add'>+    if (xdata)</div><div class='add'>+        args-&gt;xdata = dict_ref(xdata);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+args_ftruncate_cbk_store(default_args_cbk_t *args, int32_t op_ret,</div><div class='add'>+                         int32_t op_errno, struct iatt *prebuf,</div><div class='add'>+                         struct iatt *postbuf, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    args-&gt;op_ret = op_ret;</div><div class='add'>+    args-&gt;op_errno = op_errno;</div><div class='add'>+    if (prebuf)</div><div class='add'>+        args-&gt;prestat = *prebuf;</div><div class='add'>+    if (postbuf)</div><div class='add'>+        args-&gt;poststat = *postbuf;</div><div class='add'>+    if (xdata)</div><div class='add'>+        args-&gt;xdata = dict_ref(xdata);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+args_access_store(default_args_t *args, loc_t *loc, int32_t mask, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    loc_copy(&amp;args-&gt;loc, loc);</div><div class='add'>+    args-&gt;mask = mask;</div><div class='add'>+    if (xdata)</div><div class='add'>+        args-&gt;xdata = dict_ref(xdata);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+args_access_cbk_store(default_args_cbk_t *args, int32_t op_ret,</div><div class='add'>+                      int32_t op_errno, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    args-&gt;op_ret = op_ret;</div><div class='add'>+    args-&gt;op_errno = op_errno;</div><div class='add'>+    if (xdata)</div><div class='add'>+        args-&gt;xdata = dict_ref(xdata);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+args_readlink_store(default_args_t *args, loc_t *loc, size_t size,</div><div class='add'>+                    dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    loc_copy(&amp;args-&gt;loc, loc);</div><div class='add'>+    args-&gt;size = size;</div><div class='add'>+    if (xdata)</div><div class='add'>+        args-&gt;xdata = dict_ref(xdata);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+args_readlink_cbk_store(default_args_cbk_t *args, int32_t op_ret,</div><div class='add'>+                        int32_t op_errno, const char *path, struct iatt *stbuf,</div><div class='add'>+                        dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    args-&gt;op_ret = op_ret;</div><div class='add'>+    args-&gt;op_errno = op_errno;</div><div class='add'>+    if (path)</div><div class='add'>+        args-&gt;buf = gf_strdup(path);</div><div class='add'>+    if (stbuf)</div><div class='add'>+        args-&gt;stat = *stbuf;</div><div class='add'>+    if (xdata)</div><div class='add'>+        args-&gt;xdata = dict_ref(xdata);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+args_mknod_store(default_args_t *args, loc_t *loc, mode_t mode, dev_t rdev,</div><div class='add'>+                 mode_t umask, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    loc_copy(&amp;args-&gt;loc, loc);</div><div class='add'>+    args-&gt;mode = mode;</div><div class='add'>+    args-&gt;rdev = rdev;</div><div class='add'>+    args-&gt;umask = umask;</div><div class='add'>+    if (xdata)</div><div class='add'>+        args-&gt;xdata = dict_ref(xdata);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+args_mknod_cbk_store(default_args_cbk_t *args, int op_ret, int32_t op_errno,</div><div class='add'>+                     inode_t *inode, struct iatt *buf, struct iatt *preparent,</div><div class='add'>+                     struct iatt *postparent, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    args-&gt;op_ret = op_ret;</div><div class='add'>+    args-&gt;op_errno = op_errno;</div><div class='add'>+    if (inode)</div><div class='add'>+        args-&gt;inode = inode_ref(inode);</div><div class='add'>+    if (buf)</div><div class='add'>+        args-&gt;stat = *buf;</div><div class='add'>+    if (preparent)</div><div class='add'>+        args-&gt;preparent = *preparent;</div><div class='add'>+    if (postparent)</div><div class='add'>+        args-&gt;postparent = *postparent;</div><div class='add'>+    if (xdata)</div><div class='add'>+        args-&gt;xdata = dict_ref(xdata);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+args_mkdir_store(default_args_t *args, loc_t *loc, mode_t mode, mode_t umask,</div><div class='add'>+                 dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    loc_copy(&amp;args-&gt;loc, loc);</div><div class='add'>+    args-&gt;mode = mode;</div><div class='add'>+    args-&gt;umask = umask;</div><div class='add'>+</div><div class='add'>+    if (xdata)</div><div class='add'>+        args-&gt;xdata = dict_ref(xdata);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+args_mkdir_cbk_store(default_args_cbk_t *args, int32_t op_ret, int32_t op_errno,</div><div class='add'>+                     inode_t *inode, struct iatt *buf, struct iatt *preparent,</div><div class='add'>+                     struct iatt *postparent, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    args-&gt;op_ret = op_ret;</div><div class='add'>+    args-&gt;op_errno = op_errno;</div><div class='add'>+    if (inode)</div><div class='add'>+        args-&gt;inode = inode_ref(inode);</div><div class='add'>+    if (buf)</div><div class='add'>+        args-&gt;stat = *buf;</div><div class='add'>+    if (preparent)</div><div class='add'>+        args-&gt;preparent = *preparent;</div><div class='add'>+    if (postparent)</div><div class='add'>+        args-&gt;postparent = *postparent;</div><div class='add'>+    if (xdata)</div><div class='add'>+        args-&gt;xdata = dict_ref(xdata);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+args_unlink_store(default_args_t *args, loc_t *loc, int xflag, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    loc_copy(&amp;args-&gt;loc, loc);</div><div class='add'>+    args-&gt;xflag = xflag;</div><div class='add'>+    if (xdata)</div><div class='add'>+        args-&gt;xdata = dict_ref(xdata);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+args_unlink_cbk_store(default_args_cbk_t *args, int32_t op_ret,</div><div class='add'>+                      int32_t op_errno, struct iatt *preparent,</div><div class='add'>+                      struct iatt *postparent, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    args-&gt;op_ret = op_ret;</div><div class='add'>+    args-&gt;op_errno = op_errno;</div><div class='add'>+    if (preparent)</div><div class='add'>+        args-&gt;preparent = *preparent;</div><div class='add'>+    if (postparent)</div><div class='add'>+        args-&gt;postparent = *postparent;</div><div class='add'>+    if (xdata)</div><div class='add'>+        args-&gt;xdata = dict_ref(xdata);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+args_rmdir_store(default_args_t *args, loc_t *loc, int flags, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    loc_copy(&amp;args-&gt;loc, loc);</div><div class='add'>+    args-&gt;flags = flags;</div><div class='add'>+    if (xdata)</div><div class='add'>+        args-&gt;xdata = dict_ref(xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+args_rmdir_cbk_store(default_args_cbk_t *args, int32_t op_ret, int32_t op_errno,</div><div class='add'>+                     struct iatt *preparent, struct iatt *postparent,</div><div class='add'>+                     dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    args-&gt;op_ret = op_ret;</div><div class='add'>+    args-&gt;op_errno = op_errno;</div><div class='add'>+    if (preparent)</div><div class='add'>+        args-&gt;preparent = *preparent;</div><div class='add'>+    if (postparent)</div><div class='add'>+        args-&gt;postparent = *postparent;</div><div class='add'>+    if (xdata)</div><div class='add'>+        args-&gt;xdata = dict_ref(xdata);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+args_symlink_store(default_args_t *args, const char *linkname, loc_t *loc,</div><div class='add'>+                   mode_t umask, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    args-&gt;linkname = gf_strdup(linkname);</div><div class='add'>+    args-&gt;umask = umask;</div><div class='add'>+    loc_copy(&amp;args-&gt;loc, loc);</div><div class='add'>+    if (xdata)</div><div class='add'>+        args-&gt;xdata = dict_ref(xdata);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+args_symlink_cbk_store(default_args_cbk_t *args, int32_t op_ret,</div><div class='add'>+                       int32_t op_errno, inode_t *inode, struct iatt *buf,</div><div class='add'>+                       struct iatt *preparent, struct iatt *postparent,</div><div class='add'>+                       dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    args-&gt;op_ret = op_ret;</div><div class='add'>+    args-&gt;op_errno = op_errno;</div><div class='add'>+    if (inode)</div><div class='add'>+        args-&gt;inode = inode_ref(inode);</div><div class='add'>+    if (buf)</div><div class='add'>+        args-&gt;stat = *buf;</div><div class='add'>+    if (preparent)</div><div class='add'>+        args-&gt;preparent = *preparent;</div><div class='add'>+    if (postparent)</div><div class='add'>+        args-&gt;postparent = *postparent;</div><div class='add'>+    if (xdata)</div><div class='add'>+        args-&gt;xdata = dict_ref(xdata);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+args_rename_store(default_args_t *args, loc_t *oldloc, loc_t *newloc,</div><div class='add'>+                  dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    loc_copy(&amp;args-&gt;loc, oldloc);</div><div class='add'>+    loc_copy(&amp;args-&gt;loc2, newloc);</div><div class='add'>+    if (xdata)</div><div class='add'>+        args-&gt;xdata = dict_ref(xdata);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+args_rename_cbk_store(default_args_cbk_t *args, int32_t op_ret,</div><div class='add'>+                      int32_t op_errno, struct iatt *buf,</div><div class='add'>+                      struct iatt *preoldparent, struct iatt *postoldparent,</div><div class='add'>+                      struct iatt *prenewparent, struct iatt *postnewparent,</div><div class='add'>+                      dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    args-&gt;op_ret = op_ret;</div><div class='add'>+    args-&gt;op_errno = op_errno;</div><div class='add'>+    if (buf)</div><div class='add'>+        args-&gt;stat = *buf;</div><div class='add'>+    if (preoldparent)</div><div class='add'>+        args-&gt;preparent = *preoldparent;</div><div class='add'>+    if (postoldparent)</div><div class='add'>+        args-&gt;postparent = *postoldparent;</div><div class='add'>+    if (prenewparent)</div><div class='add'>+        args-&gt;preparent2 = *prenewparent;</div><div class='add'>+    if (postnewparent)</div><div class='add'>+        args-&gt;postparent2 = *postnewparent;</div><div class='add'>+    if (xdata)</div><div class='add'>+        args-&gt;xdata = dict_ref(xdata);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+args_link_store(default_args_t *args, loc_t *oldloc, loc_t *newloc,</div><div class='add'>+                dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    loc_copy(&amp;args-&gt;loc, oldloc);</div><div class='add'>+    loc_copy(&amp;args-&gt;loc2, newloc);</div><div class='add'>+</div><div class='add'>+    if (xdata)</div><div class='add'>+        args-&gt;xdata = dict_ref(xdata);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+args_link_cbk_store(default_args_cbk_t *args, int32_t op_ret, int32_t op_errno,</div><div class='add'>+                    inode_t *inode, struct iatt *buf, struct iatt *preparent,</div><div class='add'>+                    struct iatt *postparent, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    args-&gt;op_ret = op_ret;</div><div class='add'>+    args-&gt;op_errno = op_errno;</div><div class='add'>+    if (inode)</div><div class='add'>+        args-&gt;inode = inode_ref(inode);</div><div class='add'>+    if (buf)</div><div class='add'>+        args-&gt;stat = *buf;</div><div class='add'>+    if (preparent)</div><div class='add'>+        args-&gt;preparent = *preparent;</div><div class='add'>+    if (postparent)</div><div class='add'>+        args-&gt;postparent = *postparent;</div><div class='add'>+    if (xdata)</div><div class='add'>+        args-&gt;xdata = dict_ref(xdata);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+args_create_store(default_args_t *args, loc_t *loc, int32_t flags, mode_t mode,</div><div class='add'>+                  mode_t umask, fd_t *fd, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    loc_copy(&amp;args-&gt;loc, loc);</div><div class='add'>+    args-&gt;flags = flags;</div><div class='add'>+    args-&gt;mode = mode;</div><div class='add'>+    args-&gt;umask = umask;</div><div class='add'>+    if (fd)</div><div class='add'>+        args-&gt;fd = fd_ref(fd);</div><div class='add'>+    if (xdata)</div><div class='add'>+        args-&gt;xdata = dict_ref(xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+args_create_cbk_store(default_args_cbk_t *args, int32_t op_ret,</div><div class='add'>+                      int32_t op_errno, fd_t *fd, inode_t *inode,</div><div class='add'>+                      struct iatt *buf, struct iatt *preparent,</div><div class='add'>+                      struct iatt *postparent, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    args-&gt;op_ret = op_ret;</div><div class='add'>+    args-&gt;op_errno = op_errno;</div><div class='add'>+    if (fd)</div><div class='add'>+        args-&gt;fd = fd_ref(fd);</div><div class='add'>+    if (inode)</div><div class='add'>+        args-&gt;inode = inode_ref(inode);</div><div class='add'>+    if (buf)</div><div class='add'>+        args-&gt;stat = *buf;</div><div class='add'>+    if (preparent)</div><div class='add'>+        args-&gt;preparent = *preparent;</div><div class='add'>+    if (postparent)</div><div class='add'>+        args-&gt;postparent = *postparent;</div><div class='add'>+    if (xdata)</div><div class='add'>+        args-&gt;xdata = dict_ref(xdata);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+args_open_store(default_args_t *args, loc_t *loc, int32_t flags, fd_t *fd,</div><div class='add'>+                dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    loc_copy(&amp;args-&gt;loc, loc);</div><div class='add'>+    args-&gt;flags = flags;</div><div class='add'>+    if (fd)</div><div class='add'>+        args-&gt;fd = fd_ref(fd);</div><div class='add'>+    if (xdata)</div><div class='add'>+        args-&gt;xdata = dict_ref(xdata);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+args_open_cbk_store(default_args_cbk_t *args, int32_t op_ret, int32_t op_errno,</div><div class='add'>+                    fd_t *fd, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    args-&gt;op_ret = op_ret;</div><div class='add'>+    args-&gt;op_errno = op_errno;</div><div class='add'>+    if (fd)</div><div class='add'>+        args-&gt;fd = fd_ref(fd);</div><div class='add'>+    if (xdata)</div><div class='add'>+        args-&gt;xdata = dict_ref(xdata);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+args_readv_store(default_args_t *args, fd_t *fd, size_t size, off_t off,</div><div class='add'>+                 uint32_t flags, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    if (fd)</div><div class='add'>+        args-&gt;fd = fd_ref(fd);</div><div class='add'>+    args-&gt;size = size;</div><div class='add'>+    args-&gt;offset = off;</div><div class='add'>+    args-&gt;flags = flags;</div><div class='add'>+</div><div class='add'>+    if (xdata)</div><div class='add'>+        args-&gt;xdata = dict_ref(xdata);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+args_readv_cbk_store(default_args_cbk_t *args, int32_t op_ret, int32_t op_errno,</div><div class='add'>+                     struct iovec *vector, int32_t count, struct iatt *stbuf,</div><div class='add'>+                     struct iobref *iobref, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    args-&gt;op_ret = op_ret;</div><div class='add'>+    args-&gt;op_errno = op_errno;</div><div class='add'>+    if (op_ret &gt;= 0) {</div><div class='add'>+        args-&gt;vector = iov_dup(vector, count);</div><div class='add'>+        args-&gt;count = count;</div><div class='add'>+        args-&gt;stat = *stbuf;</div><div class='add'>+        args-&gt;iobref = iobref_ref(iobref);</div><div class='add'>+    }</div><div class='add'>+    if (xdata)</div><div class='add'>+        args-&gt;xdata = dict_ref(xdata);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+args_writev_store(default_args_t *args, fd_t *fd, struct iovec *vector,</div><div class='add'>+                  int32_t count, off_t off, uint32_t flags,</div><div class='add'>+                  struct iobref *iobref, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    if (fd)</div><div class='add'>+        args-&gt;fd = fd_ref(fd);</div><div class='add'>+    args-&gt;vector = iov_dup(vector, count);</div><div class='add'>+    args-&gt;count = count;</div><div class='add'>+    args-&gt;offset = off;</div><div class='add'>+    args-&gt;flags = flags;</div><div class='add'>+    args-&gt;iobref = iobref_ref(iobref);</div><div class='add'>+    if (xdata)</div><div class='add'>+        args-&gt;xdata = dict_ref(xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+args_writev_cbk_store(default_args_cbk_t *args, int32_t op_ret,</div><div class='add'>+                      int32_t op_errno, struct iatt *prebuf,</div><div class='add'>+                      struct iatt *postbuf, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    args-&gt;op_ret = op_ret;</div><div class='add'>+    args-&gt;op_errno = op_errno;</div><div class='add'>+    if (op_ret &gt;= 0)</div><div class='add'>+        args-&gt;poststat = *postbuf;</div><div class='add'>+    if (prebuf)</div><div class='add'>+        args-&gt;prestat = *prebuf;</div><div class='add'>+    if (xdata)</div><div class='add'>+        args-&gt;xdata = dict_ref(xdata);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+args_put_store(default_args_t *args, loc_t *loc, mode_t mode, mode_t umask,</div><div class='add'>+               uint32_t flags, struct iovec *vector, int32_t count, off_t off,</div><div class='add'>+               struct iobref *iobref, dict_t *xattr, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    loc_copy(&amp;args-&gt;loc, loc);</div><div class='add'>+    args-&gt;mode = mode;</div><div class='add'>+    args-&gt;umask = umask;</div><div class='add'>+    args-&gt;flags = flags;</div><div class='add'>+    args-&gt;vector = iov_dup(vector, count);</div><div class='add'>+    args-&gt;count = count;</div><div class='add'>+    args-&gt;offset = off;</div><div class='add'>+    args-&gt;iobref = iobref_ref(iobref);</div><div class='add'>+    if (xattr)</div><div class='add'>+        args-&gt;xattr = dict_ref(xattr);</div><div class='add'>+    if (xdata)</div><div class='add'>+        args-&gt;xdata = dict_ref(xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+args_put_cbk_store(default_args_cbk_t *args, int32_t op_ret, int32_t op_errno,</div><div class='add'>+                   inode_t *inode, struct iatt *buf, struct iatt *preparent,</div><div class='add'>+                   struct iatt *postparent, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    args-&gt;op_ret = op_ret;</div><div class='add'>+    args-&gt;op_errno = op_errno;</div><div class='add'>+    if (op_ret &gt;= 0)</div><div class='add'>+        args-&gt;stat = *buf;</div><div class='add'>+    if (inode)</div><div class='add'>+        args-&gt;inode = inode_ref(inode);</div><div class='add'>+    if (preparent)</div><div class='add'>+        args-&gt;preparent = *preparent;</div><div class='add'>+    if (postparent)</div><div class='add'>+        args-&gt;postparent = *postparent;</div><div class='add'>+    if (xdata)</div><div class='add'>+        args-&gt;xdata = dict_ref(xdata);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+int</div><div class='add'>+args_flush_store(default_args_t *args, fd_t *fd, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    if (fd)</div><div class='add'>+        args-&gt;fd = fd_ref(fd);</div><div class='add'>+    if (xdata)</div><div class='add'>+        args-&gt;xdata = dict_ref(xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+args_flush_cbk_store(default_args_cbk_t *args, int32_t op_ret, int32_t op_errno,</div><div class='add'>+                     dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    args-&gt;op_ret = op_ret;</div><div class='add'>+    args-&gt;op_errno = op_errno;</div><div class='add'>+    if (xdata)</div><div class='add'>+        args-&gt;xdata = dict_ref(xdata);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+args_fsync_store(default_args_t *args, fd_t *fd, int32_t datasync,</div><div class='add'>+                 dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    if (fd)</div><div class='add'>+        args-&gt;fd = fd_ref(fd);</div><div class='add'>+    args-&gt;datasync = datasync;</div><div class='add'>+    if (xdata)</div><div class='add'>+        args-&gt;xdata = dict_ref(xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+args_fsync_cbk_store(default_args_cbk_t *args, int32_t op_ret, int32_t op_errno,</div><div class='add'>+                     struct iatt *prebuf, struct iatt *postbuf, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    args-&gt;op_ret = op_ret;</div><div class='add'>+    args-&gt;op_errno = op_errno;</div><div class='add'>+    if (prebuf)</div><div class='add'>+        args-&gt;prestat = *prebuf;</div><div class='add'>+    if (postbuf)</div><div class='add'>+        args-&gt;poststat = *postbuf;</div><div class='add'>+    if (xdata)</div><div class='add'>+        args-&gt;xdata = dict_ref(xdata);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+args_opendir_store(default_args_t *args, loc_t *loc, fd_t *fd, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    loc_copy(&amp;args-&gt;loc, loc);</div><div class='add'>+    if (fd)</div><div class='add'>+        args-&gt;fd = fd_ref(fd);</div><div class='add'>+    if (xdata)</div><div class='add'>+        args-&gt;xdata = dict_ref(xdata);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+args_opendir_cbk_store(default_args_cbk_t *args, int32_t op_ret,</div><div class='add'>+                       int32_t op_errno, fd_t *fd, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    args-&gt;op_ret = op_ret;</div><div class='add'>+    args-&gt;op_errno = op_errno;</div><div class='add'>+    if (fd)</div><div class='add'>+        args-&gt;fd = fd_ref(fd);</div><div class='add'>+    if (xdata)</div><div class='add'>+        args-&gt;xdata = dict_ref(xdata);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+args_fsyncdir_store(default_args_t *args, fd_t *fd, int32_t datasync,</div><div class='add'>+                    dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    if (fd)</div><div class='add'>+        args-&gt;fd = fd_ref(fd);</div><div class='add'>+    args-&gt;datasync = datasync;</div><div class='add'>+    if (xdata)</div><div class='add'>+        args-&gt;xdata = dict_ref(xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+int</div><div class='add'>+args_fsyncdir_cbk_store(default_args_cbk_t *args, int32_t op_ret,</div><div class='add'>+                        int32_t op_errno, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    args-&gt;op_ret = op_ret;</div><div class='add'>+    args-&gt;op_errno = op_errno;</div><div class='add'>+    if (xdata)</div><div class='add'>+        args-&gt;xdata = dict_ref(xdata);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+args_statfs_store(default_args_t *args, loc_t *loc, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    loc_copy(&amp;args-&gt;loc, loc);</div><div class='add'>+    if (xdata)</div><div class='add'>+        args-&gt;xdata = dict_ref(xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+args_statfs_cbk_store(default_args_cbk_t *args, int32_t op_ret,</div><div class='add'>+                      int32_t op_errno, struct statvfs *buf, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    args-&gt;op_ret = op_ret;</div><div class='add'>+    args-&gt;op_errno = op_errno;</div><div class='add'>+    if (op_ret == 0)</div><div class='add'>+        args-&gt;statvfs = *buf;</div><div class='add'>+    if (xdata)</div><div class='add'>+        args-&gt;xdata = dict_ref(xdata);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+args_setxattr_store(default_args_t *args, loc_t *loc, dict_t *dict,</div><div class='add'>+                    int32_t flags, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    loc_copy(&amp;args-&gt;loc, loc);</div><div class='add'>+    /* TODO */</div><div class='add'>+    if (dict)</div><div class='add'>+        args-&gt;xattr = dict_ref(dict);</div><div class='add'>+    args-&gt;flags = flags;</div><div class='add'>+    if (xdata)</div><div class='add'>+        args-&gt;xdata = dict_ref(xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+args_setxattr_cbk_store(default_args_cbk_t *args, int32_t op_ret,</div><div class='add'>+                        int32_t op_errno, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    args-&gt;op_ret = op_ret;</div><div class='add'>+    args-&gt;op_errno = op_errno;</div><div class='add'>+    if (xdata)</div><div class='add'>+        args-&gt;xdata = dict_ref(xdata);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+args_getxattr_store(default_args_t *args, loc_t *loc, const char *name,</div><div class='add'>+                    dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    loc_copy(&amp;args-&gt;loc, loc);</div><div class='add'>+</div><div class='add'>+    if (name)</div><div class='add'>+        args-&gt;name = gf_strdup(name);</div><div class='add'>+    if (xdata)</div><div class='add'>+        args-&gt;xdata = dict_ref(xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+args_getxattr_cbk_store(default_args_cbk_t *args, int32_t op_ret,</div><div class='add'>+                        int32_t op_errno, dict_t *dict, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    args-&gt;op_ret = op_ret;</div><div class='add'>+    args-&gt;op_errno = op_errno;</div><div class='add'>+    if (dict)</div><div class='add'>+        args-&gt;xattr = dict_ref(dict);</div><div class='add'>+    if (xdata)</div><div class='add'>+        args-&gt;xdata = dict_ref(xdata);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+args_fsetxattr_store(default_args_t *args, fd_t *fd, dict_t *dict,</div><div class='add'>+                     int32_t flags, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    args-&gt;fd = fd_ref(fd);</div><div class='add'>+</div><div class='add'>+    if (dict)</div><div class='add'>+        args-&gt;xattr = dict_ref(dict);</div><div class='add'>+    args-&gt;flags = flags;</div><div class='add'>+    if (xdata)</div><div class='add'>+        args-&gt;xdata = dict_ref(xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+args_fsetxattr_cbk_store(default_args_cbk_t *args, int32_t op_ret,</div><div class='add'>+                         int32_t op_errno, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    args-&gt;op_ret = op_ret;</div><div class='add'>+    args-&gt;op_errno = op_errno;</div><div class='add'>+    if (xdata)</div><div class='add'>+        args-&gt;xdata = dict_ref(xdata);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+args_fgetxattr_store(default_args_t *args, fd_t *fd, const char *name,</div><div class='add'>+                     dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    args-&gt;fd = fd_ref(fd);</div><div class='add'>+</div><div class='add'>+    if (name)</div><div class='add'>+        args-&gt;name = gf_strdup(name);</div><div class='add'>+    if (xdata)</div><div class='add'>+        args-&gt;xdata = dict_ref(xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+args_fgetxattr_cbk_store(default_args_cbk_t *args, int32_t op_ret,</div><div class='add'>+                         int32_t op_errno, dict_t *dict, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    args-&gt;op_ret = op_ret;</div><div class='add'>+    args-&gt;op_errno = op_errno;</div><div class='add'>+    if (dict)</div><div class='add'>+        args-&gt;xattr = dict_ref(dict);</div><div class='add'>+    if (xdata)</div><div class='add'>+        args-&gt;xdata = dict_ref(xdata);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+args_removexattr_store(default_args_t *args, loc_t *loc, const char *name,</div><div class='add'>+                       dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    loc_copy(&amp;args-&gt;loc, loc);</div><div class='add'>+    args-&gt;name = gf_strdup(name);</div><div class='add'>+    if (xdata)</div><div class='add'>+        args-&gt;xdata = dict_ref(xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+args_removexattr_cbk_store(default_args_cbk_t *args, int32_t op_ret,</div><div class='add'>+                           int32_t op_errno, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    args-&gt;op_ret = op_ret;</div><div class='add'>+    args-&gt;op_errno = op_errno;</div><div class='add'>+    if (xdata)</div><div class='add'>+        args-&gt;xdata = dict_ref(xdata);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+args_fremovexattr_store(default_args_t *args, fd_t *fd, const char *name,</div><div class='add'>+                        dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    args-&gt;fd = fd_ref(fd);</div><div class='add'>+    args-&gt;name = gf_strdup(name);</div><div class='add'>+    if (xdata)</div><div class='add'>+        args-&gt;xdata = dict_ref(xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+args_fremovexattr_cbk_store(default_args_cbk_t *args, int32_t op_ret,</div><div class='add'>+                            int32_t op_errno, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    args-&gt;op_ret = op_ret;</div><div class='add'>+    args-&gt;op_errno = op_errno;</div><div class='add'>+    if (xdata)</div><div class='add'>+        args-&gt;xdata = dict_ref(xdata);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+args_lk_store(default_args_t *args, fd_t *fd, int32_t cmd,</div><div class='add'>+              struct gf_flock *lock, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    if (fd)</div><div class='add'>+        args-&gt;fd = fd_ref(fd);</div><div class='add'>+    args-&gt;cmd = cmd;</div><div class='add'>+    args-&gt;lock = *lock;</div><div class='add'>+    if (xdata)</div><div class='add'>+        args-&gt;xdata = dict_ref(xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+args_lk_cbk_store(default_args_cbk_t *args, int32_t op_ret, int32_t op_errno,</div><div class='add'>+                  struct gf_flock *lock, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    args-&gt;op_ret = op_ret;</div><div class='add'>+    args-&gt;op_errno = op_errno;</div><div class='add'>+    if (op_ret == 0)</div><div class='add'>+        args-&gt;lock = *lock;</div><div class='add'>+    if (xdata)</div><div class='add'>+        args-&gt;xdata = dict_ref(xdata);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+args_inodelk_store(default_args_t *args, const char *volume, loc_t *loc,</div><div class='add'>+                   int32_t cmd, struct gf_flock *lock, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    if (volume)</div><div class='add'>+        args-&gt;volume = gf_strdup(volume);</div><div class='add'>+</div><div class='add'>+    loc_copy(&amp;args-&gt;loc, loc);</div><div class='add'>+    args-&gt;cmd = cmd;</div><div class='add'>+    args-&gt;lock = *lock;</div><div class='add'>+    if (xdata)</div><div class='add'>+        args-&gt;xdata = dict_ref(xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+args_inodelk_cbk_store(default_args_cbk_t *args, int32_t op_ret,</div><div class='add'>+                       int32_t op_errno, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    args-&gt;op_ret = op_ret;</div><div class='add'>+    args-&gt;op_errno = op_errno;</div><div class='add'>+    if (xdata)</div><div class='add'>+        args-&gt;xdata = dict_ref(xdata);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+args_finodelk_store(default_args_t *args, const char *volume, fd_t *fd,</div><div class='add'>+                    int32_t cmd, struct gf_flock *lock, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    if (fd)</div><div class='add'>+        args-&gt;fd = fd_ref(fd);</div><div class='add'>+</div><div class='add'>+    if (volume)</div><div class='add'>+        args-&gt;volume = gf_strdup(volume);</div><div class='add'>+</div><div class='add'>+    args-&gt;cmd = cmd;</div><div class='add'>+    args-&gt;lock = *lock;</div><div class='add'>+</div><div class='add'>+    if (xdata)</div><div class='add'>+        args-&gt;xdata = dict_ref(xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+args_finodelk_cbk_store(default_args_cbk_t *args, int32_t op_ret,</div><div class='add'>+                        int32_t op_errno, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    args-&gt;op_ret = op_ret;</div><div class='add'>+    args-&gt;op_errno = op_errno;</div><div class='add'>+    if (xdata)</div><div class='add'>+        args-&gt;xdata = dict_ref(xdata);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+args_entrylk_store(default_args_t *args, const char *volume, loc_t *loc,</div><div class='add'>+                   const char *name, entrylk_cmd cmd, entrylk_type type,</div><div class='add'>+                   dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    if (volume)</div><div class='add'>+        args-&gt;volume = gf_strdup(volume);</div><div class='add'>+</div><div class='add'>+    loc_copy(&amp;args-&gt;loc, loc);</div><div class='add'>+</div><div class='add'>+    args-&gt;entrylkcmd = cmd;</div><div class='add'>+    args-&gt;entrylktype = type;</div><div class='add'>+</div><div class='add'>+    if (name)</div><div class='add'>+        args-&gt;name = gf_strdup(name);</div><div class='add'>+</div><div class='add'>+    if (xdata)</div><div class='add'>+        args-&gt;xdata = dict_ref(xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+args_entrylk_cbk_store(default_args_cbk_t *args, int32_t op_ret,</div><div class='add'>+                       int32_t op_errno, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    args-&gt;op_ret = op_ret;</div><div class='add'>+    args-&gt;op_errno = op_errno;</div><div class='add'>+    if (xdata)</div><div class='add'>+        args-&gt;xdata = dict_ref(xdata);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+args_fentrylk_store(default_args_t *args, const char *volume, fd_t *fd,</div><div class='add'>+                    const char *name, entrylk_cmd cmd, entrylk_type type,</div><div class='add'>+                    dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    if (volume)</div><div class='add'>+        args-&gt;volume = gf_strdup(volume);</div><div class='add'>+</div><div class='add'>+    if (fd)</div><div class='add'>+        args-&gt;fd = fd_ref(fd);</div><div class='add'>+    args-&gt;entrylkcmd = cmd;</div><div class='add'>+    args-&gt;entrylktype = type;</div><div class='add'>+    if (name)</div><div class='add'>+        args-&gt;name = gf_strdup(name);</div><div class='add'>+</div><div class='add'>+    if (xdata)</div><div class='add'>+        args-&gt;xdata = dict_ref(xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+args_fentrylk_cbk_store(default_args_cbk_t *args, int32_t op_ret,</div><div class='add'>+                        int32_t op_errno, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    args-&gt;op_ret = op_ret;</div><div class='add'>+    args-&gt;op_errno = op_errno;</div><div class='add'>+    if (xdata)</div><div class='add'>+        args-&gt;xdata = dict_ref(xdata);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+args_readdirp_store(default_args_t *args, fd_t *fd, size_t size, off_t off,</div><div class='add'>+                    dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    args-&gt;fd = fd_ref(fd);</div><div class='add'>+    args-&gt;size = size;</div><div class='add'>+    args-&gt;offset = off;</div><div class='add'>+    if (xdata)</div><div class='add'>+        args-&gt;xdata = dict_ref(xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+args_readdirp_cbk_store(default_args_cbk_t *args, int32_t op_ret,</div><div class='add'>+                        int32_t op_errno, gf_dirent_t *entries, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    gf_dirent_t *stub_entry = NULL, *entry = NULL;</div><div class='add'>+</div><div class='add'>+    args-&gt;op_ret = op_ret;</div><div class='add'>+    args-&gt;op_errno = op_errno;</div><div class='add'>+    if (op_ret &gt; 0) {</div><div class='add'>+        list_for_each_entry(entry, &amp;entries-&gt;list, list)</div><div class='add'>+        {</div><div class='add'>+            stub_entry = gf_dirent_for_name(entry-&gt;d_name);</div><div class='add'>+            if (!stub_entry)</div><div class='add'>+                goto out;</div><div class='add'>+            stub_entry-&gt;d_off = entry-&gt;d_off;</div><div class='add'>+            stub_entry-&gt;d_ino = entry-&gt;d_ino;</div><div class='add'>+            stub_entry-&gt;d_stat = entry-&gt;d_stat;</div><div class='add'>+            stub_entry-&gt;d_type = entry-&gt;d_type;</div><div class='add'>+            if (entry-&gt;inode)</div><div class='add'>+                stub_entry-&gt;inode = inode_ref(entry-&gt;inode);</div><div class='add'>+            if (entry-&gt;dict)</div><div class='add'>+                stub_entry-&gt;dict = dict_ref(entry-&gt;dict);</div><div class='add'>+            list_add_tail(&amp;stub_entry-&gt;list, &amp;args-&gt;entries.list);</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    if (xdata)</div><div class='add'>+        args-&gt;xdata = dict_ref(xdata);</div><div class='add'>+out:</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+args_readdir_store(default_args_t *args, fd_t *fd, size_t size, off_t off,</div><div class='add'>+                   dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    args-&gt;fd = fd_ref(fd);</div><div class='add'>+    args-&gt;size = size;</div><div class='add'>+    args-&gt;offset = off;</div><div class='add'>+</div><div class='add'>+    if (xdata)</div><div class='add'>+        args-&gt;xdata = dict_ref(xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+args_readdir_cbk_store(default_args_cbk_t *args, int32_t op_ret,</div><div class='add'>+                       int32_t op_errno, gf_dirent_t *entries, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    gf_dirent_t *stub_entry = NULL, *entry = NULL;</div><div class='add'>+</div><div class='add'>+    args-&gt;op_ret = op_ret;</div><div class='add'>+    args-&gt;op_errno = op_errno;</div><div class='add'>+    if (op_ret &gt; 0) {</div><div class='add'>+        list_for_each_entry(entry, &amp;entries-&gt;list, list)</div><div class='add'>+        {</div><div class='add'>+            stub_entry = gf_dirent_for_name(entry-&gt;d_name);</div><div class='add'>+            if (!stub_entry)</div><div class='add'>+                goto out;</div><div class='add'>+            stub_entry-&gt;d_off = entry-&gt;d_off;</div><div class='add'>+            stub_entry-&gt;d_ino = entry-&gt;d_ino;</div><div class='add'>+            stub_entry-&gt;d_type = entry-&gt;d_type;</div><div class='add'>+            list_add_tail(&amp;stub_entry-&gt;list, &amp;args-&gt;entries.list);</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    if (xdata)</div><div class='add'>+        args-&gt;xdata = dict_ref(xdata);</div><div class='add'>+out:</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+args_rchecksum_store(default_args_t *args, fd_t *fd, off_t offset, int32_t len,</div><div class='add'>+                     dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    args-&gt;fd = fd_ref(fd);</div><div class='add'>+    args-&gt;offset = offset;</div><div class='add'>+    args-&gt;size = len;</div><div class='add'>+    if (xdata)</div><div class='add'>+        args-&gt;xdata = dict_ref(xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+args_rchecksum_cbk_store(default_args_cbk_t *args, int32_t op_ret,</div><div class='add'>+                         int32_t op_errno, uint32_t weak_checksum,</div><div class='add'>+                         uint8_t *strong_checksum, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    args-&gt;op_ret = op_ret;</div><div class='add'>+    args-&gt;op_errno = op_errno;</div><div class='add'>+    if (op_ret &gt;= 0) {</div><div class='add'>+        args-&gt;weak_checksum = weak_checksum;</div><div class='add'>+        args-&gt;strong_checksum = gf_memdup(strong_checksum,</div><div class='add'>+                                          SHA256_DIGEST_LENGTH);</div><div class='add'>+    }</div><div class='add'>+    if (xdata)</div><div class='add'>+        args-&gt;xdata = dict_ref(xdata);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+args_xattrop_store(default_args_t *args, loc_t *loc, gf_xattrop_flags_t optype,</div><div class='add'>+                   dict_t *xattr, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    loc_copy(&amp;args-&gt;loc, loc);</div><div class='add'>+</div><div class='add'>+    args-&gt;optype = optype;</div><div class='add'>+    args-&gt;xattr = dict_ref(xattr);</div><div class='add'>+</div><div class='add'>+    if (xdata)</div><div class='add'>+        args-&gt;xdata = dict_ref(xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+args_xattrop_cbk_store(default_args_cbk_t *args, int32_t op_ret,</div><div class='add'>+                       int32_t op_errno, dict_t *xattr, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    args-&gt;op_ret = op_ret;</div><div class='add'>+    args-&gt;op_errno = op_errno;</div><div class='add'>+    if (xattr)</div><div class='add'>+        args-&gt;xattr = dict_ref(xattr);</div><div class='add'>+    if (xdata)</div><div class='add'>+        args-&gt;xdata = dict_ref(xdata);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+args_fxattrop_store(default_args_t *args, fd_t *fd, gf_xattrop_flags_t optype,</div><div class='add'>+                    dict_t *xattr, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    args-&gt;fd = fd_ref(fd);</div><div class='add'>+</div><div class='add'>+    args-&gt;optype = optype;</div><div class='add'>+    args-&gt;xattr = dict_ref(xattr);</div><div class='add'>+</div><div class='add'>+    if (xdata)</div><div class='add'>+        args-&gt;xdata = dict_ref(xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+args_fxattrop_cbk_store(default_args_cbk_t *args, int32_t op_ret,</div><div class='add'>+                        int32_t op_errno, dict_t *xattr, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    args-&gt;op_ret = op_ret;</div><div class='add'>+    args-&gt;op_errno = op_errno;</div><div class='add'>+    if (xattr)</div><div class='add'>+        args-&gt;xattr = dict_ref(xattr);</div><div class='add'>+    if (xdata)</div><div class='add'>+        args-&gt;xdata = dict_ref(xdata);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+args_setattr_store(default_args_t *args, loc_t *loc, struct iatt *stbuf,</div><div class='add'>+                   int32_t valid, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    loc_copy(&amp;args-&gt;loc, loc);</div><div class='add'>+</div><div class='add'>+    if (stbuf)</div><div class='add'>+        args-&gt;stat = *stbuf;</div><div class='add'>+</div><div class='add'>+    args-&gt;valid = valid;</div><div class='add'>+</div><div class='add'>+    if (xdata)</div><div class='add'>+        args-&gt;xdata = dict_ref(xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+args_setattr_cbk_store(default_args_cbk_t *args, int32_t op_ret,</div><div class='add'>+                       int32_t op_errno, struct iatt *statpre,</div><div class='add'>+                       struct iatt *statpost, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    args-&gt;op_ret = op_ret;</div><div class='add'>+    args-&gt;op_errno = op_errno;</div><div class='add'>+    if (statpre)</div><div class='add'>+        args-&gt;prestat = *statpre;</div><div class='add'>+    if (statpost)</div><div class='add'>+        args-&gt;poststat = *statpost;</div><div class='add'>+    if (xdata)</div><div class='add'>+        args-&gt;xdata = dict_ref(xdata);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+args_fsetattr_store(default_args_t *args, fd_t *fd, struct iatt *stbuf,</div><div class='add'>+                    int32_t valid, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    if (fd)</div><div class='add'>+        args-&gt;fd = fd_ref(fd);</div><div class='add'>+</div><div class='add'>+    if (stbuf)</div><div class='add'>+        args-&gt;stat = *stbuf;</div><div class='add'>+</div><div class='add'>+    args-&gt;valid = valid;</div><div class='add'>+</div><div class='add'>+    if (xdata)</div><div class='add'>+        args-&gt;xdata = dict_ref(xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+int</div><div class='add'>+args_fsetattr_cbk_store(default_args_cbk_t *args, int32_t op_ret,</div><div class='add'>+                        int32_t op_errno, struct iatt *statpre,</div><div class='add'>+                        struct iatt *statpost, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    args-&gt;op_ret = op_ret;</div><div class='add'>+    args-&gt;op_errno = op_errno;</div><div class='add'>+    if (statpre)</div><div class='add'>+        args-&gt;prestat = *statpre;</div><div class='add'>+    if (statpost)</div><div class='add'>+        args-&gt;poststat = *statpost;</div><div class='add'>+    if (xdata)</div><div class='add'>+        args-&gt;xdata = dict_ref(xdata);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+args_fallocate_store(default_args_t *args, fd_t *fd, int32_t mode, off_t offset,</div><div class='add'>+                     size_t len, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    if (fd)</div><div class='add'>+        args-&gt;fd = fd_ref(fd);</div><div class='add'>+</div><div class='add'>+    args-&gt;flags = mode;</div><div class='add'>+    args-&gt;offset = offset;</div><div class='add'>+    args-&gt;size = len;</div><div class='add'>+</div><div class='add'>+    if (xdata)</div><div class='add'>+        args-&gt;xdata = dict_ref(xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+args_fallocate_cbk_store(default_args_cbk_t *args, int32_t op_ret,</div><div class='add'>+                         int32_t op_errno, struct iatt *statpre,</div><div class='add'>+                         struct iatt *statpost, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    args-&gt;op_ret = op_ret;</div><div class='add'>+    args-&gt;op_errno = op_errno;</div><div class='add'>+    if (statpre)</div><div class='add'>+        args-&gt;prestat = *statpre;</div><div class='add'>+    if (statpost)</div><div class='add'>+        args-&gt;poststat = *statpost;</div><div class='add'>+    if (xdata)</div><div class='add'>+        args-&gt;xdata = dict_ref(xdata);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+args_discard_store(default_args_t *args, fd_t *fd, off_t offset, size_t len,</div><div class='add'>+                   dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    if (fd)</div><div class='add'>+        args-&gt;fd = fd_ref(fd);</div><div class='add'>+</div><div class='add'>+    args-&gt;offset = offset;</div><div class='add'>+    args-&gt;size = len;</div><div class='add'>+</div><div class='add'>+    if (xdata)</div><div class='add'>+        args-&gt;xdata = dict_ref(xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+args_discard_cbk_store(default_args_cbk_t *args, int32_t op_ret,</div><div class='add'>+                       int32_t op_errno, struct iatt *statpre,</div><div class='add'>+                       struct iatt *statpost, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    args-&gt;op_ret = op_ret;</div><div class='add'>+    args-&gt;op_errno = op_errno;</div><div class='add'>+    if (statpre)</div><div class='add'>+        args-&gt;prestat = *statpre;</div><div class='add'>+    if (statpost)</div><div class='add'>+        args-&gt;poststat = *statpost;</div><div class='add'>+    if (xdata)</div><div class='add'>+        args-&gt;xdata = dict_ref(xdata);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+args_zerofill_store(default_args_t *args, fd_t *fd, off_t offset, off_t len,</div><div class='add'>+                    dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    if (fd)</div><div class='add'>+        args-&gt;fd = fd_ref(fd);</div><div class='add'>+</div><div class='add'>+    args-&gt;offset = offset;</div><div class='add'>+    args-&gt;size = len;</div><div class='add'>+</div><div class='add'>+    if (xdata)</div><div class='add'>+        args-&gt;xdata = dict_ref(xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+args_zerofill_cbk_store(default_args_cbk_t *args, int32_t op_ret,</div><div class='add'>+                        int32_t op_errno, struct iatt *statpre,</div><div class='add'>+                        struct iatt *statpost, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    args-&gt;op_ret = op_ret;</div><div class='add'>+    args-&gt;op_errno = op_errno;</div><div class='add'>+    if (statpre)</div><div class='add'>+        args-&gt;prestat = *statpre;</div><div class='add'>+    if (statpost)</div><div class='add'>+        args-&gt;poststat = *statpost;</div><div class='add'>+    if (xdata)</div><div class='add'>+        args-&gt;xdata = dict_ref(xdata);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+args_ipc_store(default_args_t *args, int32_t op, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    args-&gt;cmd = op;</div><div class='add'>+</div><div class='add'>+    if (xdata)</div><div class='add'>+        args-&gt;xdata = dict_ref(xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+args_ipc_cbk_store(default_args_cbk_t *args, int32_t op_ret, int32_t op_errno,</div><div class='add'>+                   dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    args-&gt;op_ret = op_ret;</div><div class='add'>+    args-&gt;op_errno = op_errno;</div><div class='add'>+    if (xdata)</div><div class='add'>+        args-&gt;xdata = dict_ref(xdata);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+args_seek_store(default_args_t *args, fd_t *fd, off_t offset,</div><div class='add'>+                gf_seek_what_t what, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    if (fd)</div><div class='add'>+        args-&gt;fd = fd_ref(fd);</div><div class='add'>+</div><div class='add'>+    args-&gt;offset = offset;</div><div class='add'>+    args-&gt;what = what;</div><div class='add'>+</div><div class='add'>+    if (xdata)</div><div class='add'>+        args-&gt;xdata = dict_ref(xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+args_seek_cbk_store(default_args_cbk_t *args, int32_t op_ret, int32_t op_errno,</div><div class='add'>+                    off_t offset, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    args-&gt;op_ret = op_ret;</div><div class='add'>+    args-&gt;op_errno = op_errno;</div><div class='add'>+    args-&gt;offset = offset;</div><div class='add'>+    if (xdata)</div><div class='add'>+        args-&gt;xdata = dict_ref(xdata);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+args_getactivelk_cbk_store(default_args_cbk_t *args, int32_t op_ret,</div><div class='add'>+                           int32_t op_errno, lock_migration_info_t *locklist,</div><div class='add'>+                           dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    lock_migration_info_t *stub_entry = NULL, *entry = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    args-&gt;op_ret = op_ret;</div><div class='add'>+    args-&gt;op_errno = op_errno;</div><div class='add'>+    /*op_ret needs to carry the number of locks present in the list*/</div><div class='add'>+    if (op_ret &gt; 0) {</div><div class='add'>+        list_for_each_entry(entry, &amp;locklist-&gt;list, list)</div><div class='add'>+        {</div><div class='add'>+            stub_entry = GF_CALLOC(1, sizeof(*stub_entry), gf_common_mt_char);</div><div class='add'>+            if (!stub_entry) {</div><div class='add'>+                ret = -1;</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            INIT_LIST_HEAD(&amp;stub_entry-&gt;list);</div><div class='add'>+            stub_entry-&gt;flock = entry-&gt;flock;</div><div class='add'>+</div><div class='add'>+            stub_entry-&gt;lk_flags = entry-&gt;lk_flags;</div><div class='add'>+</div><div class='add'>+            stub_entry-&gt;client_uid = gf_strdup(entry-&gt;client_uid);</div><div class='add'>+            if (!stub_entry-&gt;client_uid) {</div><div class='add'>+                GF_FREE(stub_entry);</div><div class='add'>+                ret = -1;</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            list_add_tail(&amp;stub_entry-&gt;list, &amp;args-&gt;locklist.list);</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (xdata)</div><div class='add'>+        args-&gt;xdata = dict_ref(xdata);</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+args_setactivelk_store(default_args_t *args, loc_t *loc,</div><div class='add'>+                       lock_migration_info_t *locklist, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    lock_migration_info_t *stub_entry = NULL, *entry = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    list_for_each_entry(entry, &amp;locklist-&gt;list, list)</div><div class='add'>+    {</div><div class='add'>+        stub_entry = GF_CALLOC(1, sizeof(*stub_entry), gf_common_mt_lock_mig);</div><div class='add'>+        if (!stub_entry) {</div><div class='add'>+            ret = -1;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        INIT_LIST_HEAD(&amp;stub_entry-&gt;list);</div><div class='add'>+        stub_entry-&gt;flock = entry-&gt;flock;</div><div class='add'>+</div><div class='add'>+        stub_entry-&gt;lk_flags = entry-&gt;lk_flags;</div><div class='add'>+</div><div class='add'>+        stub_entry-&gt;client_uid = gf_strdup(entry-&gt;client_uid);</div><div class='add'>+        if (!stub_entry-&gt;client_uid) {</div><div class='add'>+            GF_FREE(stub_entry);</div><div class='add'>+            ret = -1;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        list_add_tail(&amp;stub_entry-&gt;list, &amp;args-&gt;locklist.list);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    loc_copy(&amp;args-&gt;loc, loc);</div><div class='add'>+</div><div class='add'>+    if (xdata)</div><div class='add'>+        args-&gt;xdata = dict_ref(xdata);</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+args_lease_store(default_args_t *args, loc_t *loc, struct gf_lease *lease,</div><div class='add'>+                 dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    loc_copy(&amp;args-&gt;loc, loc);</div><div class='add'>+    args-&gt;lease = *lease;</div><div class='add'>+</div><div class='add'>+    if (xdata)</div><div class='add'>+        args-&gt;xdata = dict_ref(xdata);</div><div class='add'>+</div><div class='add'>+    return;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+args_lease_cbk_store(default_args_cbk_t *args, int32_t op_ret, int32_t op_errno,</div><div class='add'>+                     struct gf_lease *lease, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    args-&gt;op_ret = op_ret;</div><div class='add'>+    args-&gt;op_errno = op_errno;</div><div class='add'>+    if (op_ret == 0)</div><div class='add'>+        args-&gt;lease = *lease;</div><div class='add'>+    if (xdata)</div><div class='add'>+        args-&gt;xdata = dict_ref(xdata);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+args_icreate_store(default_args_t *args, loc_t *loc, mode_t mode, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    loc_copy(&amp;args-&gt;loc, loc);</div><div class='add'>+    args-&gt;mode = mode;</div><div class='add'>+</div><div class='add'>+    if (xdata)</div><div class='add'>+        args-&gt;xdata = dict_ref(xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+args_namelink_store(default_args_t *args, loc_t *loc, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    loc_copy(&amp;args-&gt;loc, loc);</div><div class='add'>+</div><div class='add'>+    if (xdata)</div><div class='add'>+        args-&gt;xdata = dict_ref(xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+args_copy_file_range_store(default_args_t *args, fd_t *fd_in, off64_t off_in,</div><div class='add'>+                           fd_t *fd_out, off64_t off_out, size_t len,</div><div class='add'>+                           uint32_t flags, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    if (fd_in)</div><div class='add'>+        args-&gt;fd = fd_ref(fd_in);</div><div class='add'>+    if (fd_out)</div><div class='add'>+        args-&gt;fd_dst = fd_ref(fd_out);</div><div class='add'>+    args-&gt;size = len;</div><div class='add'>+    args-&gt;off_in = off_in;</div><div class='add'>+    args-&gt;off_out = off_out;</div><div class='add'>+    args-&gt;flags = flags;</div><div class='add'>+</div><div class='add'>+    if (xdata)</div><div class='add'>+        args-&gt;xdata = dict_ref(xdata);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+args_copy_file_range_cbk_store(default_args_cbk_t *args, int32_t op_ret,</div><div class='add'>+                               int32_t op_errno, struct iatt *stbuf,</div><div class='add'>+                               struct iatt *prebuf_dst,</div><div class='add'>+                               struct iatt *postbuf_dst, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    args-&gt;op_ret = op_ret;</div><div class='add'>+    args-&gt;op_errno = op_errno;</div><div class='add'>+    if (op_ret &gt;= 0) {</div><div class='add'>+        if (postbuf_dst)</div><div class='add'>+            args-&gt;poststat = *postbuf_dst;</div><div class='add'>+        if (prebuf_dst)</div><div class='add'>+            args-&gt;prestat = *prebuf_dst;</div><div class='add'>+        if (stbuf)</div><div class='add'>+            args-&gt;stat = *stbuf;</div><div class='add'>+    }</div><div class='add'>+    if (xdata)</div><div class='add'>+        args-&gt;xdata = dict_ref(xdata);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+args_cbk_wipe(default_args_cbk_t *args_cbk)</div><div class='add'>+{</div><div class='add'>+    if (!args_cbk)</div><div class='add'>+        return;</div><div class='add'>+    if (args_cbk-&gt;inode)</div><div class='add'>+        inode_unref(args_cbk-&gt;inode);</div><div class='add'>+</div><div class='add'>+    GF_FREE((char *)args_cbk-&gt;buf);</div><div class='add'>+</div><div class='add'>+    GF_FREE(args_cbk-&gt;vector);</div><div class='add'>+</div><div class='add'>+    if (args_cbk-&gt;iobref)</div><div class='add'>+        iobref_unref(args_cbk-&gt;iobref);</div><div class='add'>+</div><div class='add'>+    if (args_cbk-&gt;fd)</div><div class='add'>+        fd_unref(args_cbk-&gt;fd);</div><div class='add'>+</div><div class='add'>+    if (args_cbk-&gt;xattr)</div><div class='add'>+        dict_unref(args_cbk-&gt;xattr);</div><div class='add'>+</div><div class='add'>+    GF_FREE(args_cbk-&gt;strong_checksum);</div><div class='add'>+</div><div class='add'>+    if (args_cbk-&gt;xdata)</div><div class='add'>+        dict_unref(args_cbk-&gt;xdata);</div><div class='add'>+</div><div class='add'>+    if (!list_empty(&amp;args_cbk-&gt;entries.list))</div><div class='add'>+        gf_dirent_free(&amp;args_cbk-&gt;entries);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+args_wipe(default_args_t *args)</div><div class='add'>+{</div><div class='add'>+    if (!args)</div><div class='add'>+        return;</div><div class='add'>+</div><div class='add'>+    loc_wipe(&amp;args-&gt;loc);</div><div class='add'>+</div><div class='add'>+    loc_wipe(&amp;args-&gt;loc2);</div><div class='add'>+</div><div class='add'>+    if (args-&gt;fd)</div><div class='add'>+        fd_unref(args-&gt;fd);</div><div class='add'>+</div><div class='add'>+    GF_FREE((char *)args-&gt;linkname);</div><div class='add'>+</div><div class='add'>+    GF_FREE(args-&gt;vector);</div><div class='add'>+</div><div class='add'>+    if (args-&gt;iobref)</div><div class='add'>+        iobref_unref(args-&gt;iobref);</div><div class='add'>+</div><div class='add'>+    if (args-&gt;xattr)</div><div class='add'>+        dict_unref(args-&gt;xattr);</div><div class='add'>+</div><div class='add'>+    if (args-&gt;xdata)</div><div class='add'>+        dict_unref(args-&gt;xdata);</div><div class='add'>+</div><div class='add'>+    GF_FREE((char *)args-&gt;name);</div><div class='add'>+</div><div class='add'>+    GF_FREE((char *)args-&gt;volume);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+args_cbk_init(default_args_cbk_t *args_cbk)</div><div class='add'>+{</div><div class='add'>+    INIT_LIST_HEAD(&amp;args_cbk-&gt;entries);</div><div class='add'>+}</div><div class='head'>diff --git a/libglusterfs/src/defaults-tmpl.c b/libglusterfs/src/defaults-tmpl.c<br/>new file mode 100644<br/>index 00000000000..3cf707f42aa<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/libglusterfs/src/defaults-tmpl.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>libglusterfs/src/defaults-tmpl.c</a></div><div class='hunk'>@@ -0,0 +1,247 @@</div><div class='add'>+/*</div><div class='add'>+  Copyright (c) 2008-2015 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+/* libglusterfs/src/defaults.c:</div><div class='add'>+   This file contains functions, which are used to fill the 'fops', 'cbk'</div><div class='add'>+   structures in the xlator structures, if they are not written. Here, all the</div><div class='add'>+   function calls are plainly forwarded to the first child of the xlator, and</div><div class='add'>+   all the *_cbk function does plain STACK_UNWIND of the frame, and returns.</div><div class='add'>+</div><div class='add'>+   This function also implements *_resume () functions, which does same</div><div class='add'>+   operation as a fop().</div><div class='add'>+</div><div class='add'>+   All the functions are plain enough to understand.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#ifndef _CONFIG_H</div><div class='add'>+#define _CONFIG_H</div><div class='add'>+#include "config.h"</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#include "glusterfs/xlator.h"</div><div class='add'>+#include "glusterfs/defaults.h"</div><div class='add'>+</div><div class='add'>+#pragma generate</div><div class='add'>+</div><div class='add'>+struct xlator_fops _default_fops = {</div><div class='add'>+    .create = default_create,</div><div class='add'>+    .open = default_open,</div><div class='add'>+    .stat = default_stat,</div><div class='add'>+    .readlink = default_readlink,</div><div class='add'>+    .mknod = default_mknod,</div><div class='add'>+    .mkdir = default_mkdir,</div><div class='add'>+    .unlink = default_unlink,</div><div class='add'>+    .rmdir = default_rmdir,</div><div class='add'>+    .symlink = default_symlink,</div><div class='add'>+    .rename = default_rename,</div><div class='add'>+    .link = default_link,</div><div class='add'>+    .truncate = default_truncate,</div><div class='add'>+    .readv = default_readv,</div><div class='add'>+    .writev = default_writev,</div><div class='add'>+    .statfs = default_statfs,</div><div class='add'>+    .flush = default_flush,</div><div class='add'>+    .fsync = default_fsync,</div><div class='add'>+    .setxattr = default_setxattr,</div><div class='add'>+    .getxattr = default_getxattr,</div><div class='add'>+    .fsetxattr = default_fsetxattr,</div><div class='add'>+    .fgetxattr = default_fgetxattr,</div><div class='add'>+    .removexattr = default_removexattr,</div><div class='add'>+    .fremovexattr = default_fremovexattr,</div><div class='add'>+    .opendir = default_opendir,</div><div class='add'>+    .readdir = default_readdir,</div><div class='add'>+    .readdirp = default_readdirp,</div><div class='add'>+    .fsyncdir = default_fsyncdir,</div><div class='add'>+    .access = default_access,</div><div class='add'>+    .ftruncate = default_ftruncate,</div><div class='add'>+    .fstat = default_fstat,</div><div class='add'>+    .lk = default_lk,</div><div class='add'>+    .inodelk = default_inodelk,</div><div class='add'>+    .finodelk = default_finodelk,</div><div class='add'>+    .entrylk = default_entrylk,</div><div class='add'>+    .fentrylk = default_fentrylk,</div><div class='add'>+    .lookup = default_lookup,</div><div class='add'>+    .rchecksum = default_rchecksum,</div><div class='add'>+    .xattrop = default_xattrop,</div><div class='add'>+    .fxattrop = default_fxattrop,</div><div class='add'>+    .setattr = default_setattr,</div><div class='add'>+    .fsetattr = default_fsetattr,</div><div class='add'>+    .fallocate = default_fallocate,</div><div class='add'>+    .discard = default_discard,</div><div class='add'>+    .zerofill = default_zerofill,</div><div class='add'>+    .ipc = default_ipc,</div><div class='add'>+    .seek = default_seek,</div><div class='add'>+</div><div class='add'>+    .getspec = default_getspec,</div><div class='add'>+    .getactivelk = default_getactivelk,</div><div class='add'>+    .setactivelk = default_setactivelk,</div><div class='add'>+    .put = default_put,</div><div class='add'>+    .icreate = default_icreate,</div><div class='add'>+    .namelink = default_namelink,</div><div class='add'>+    .copy_file_range = default_copy_file_range,</div><div class='add'>+};</div><div class='add'>+struct xlator_fops *default_fops = &amp;_default_fops;</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+ * Remaining functions don't follow the fop calling conventions, so they're</div><div class='add'>+ * not generated.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_forget(xlator_t *this, inode_t *inode)</div><div class='add'>+{</div><div class='add'>+    gf_log_callingfn(this-&gt;name, GF_LOG_DEBUG,</div><div class='add'>+                     "xlator does not "</div><div class='add'>+                     "implement forget_cbk");</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_releasedir(xlator_t *this, fd_t *fd)</div><div class='add'>+{</div><div class='add'>+    gf_log_callingfn(this-&gt;name, GF_LOG_DEBUG,</div><div class='add'>+                     "xlator does not "</div><div class='add'>+                     "implement releasedir_cbk");</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_release(xlator_t *this, fd_t *fd)</div><div class='add'>+{</div><div class='add'>+    gf_log_callingfn(this-&gt;name, GF_LOG_DEBUG,</div><div class='add'>+                     "xlator does not "</div><div class='add'>+                     "implement release_cbk");</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* notify */</div><div class='add'>+int</div><div class='add'>+default_notify(xlator_t *this, int32_t event, void *data, ...)</div><div class='add'>+{</div><div class='add'>+    GF_UNUSED int ret = 0;</div><div class='add'>+    xlator_t *victim = data;</div><div class='add'>+</div><div class='add'>+    glusterfs_graph_t *graph = NULL;</div><div class='add'>+</div><div class='add'>+    GF_VALIDATE_OR_GOTO("notify", this, out);</div><div class='add'>+    graph = this-&gt;graph;</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, graph, out);</div><div class='add'>+</div><div class='add'>+    switch (event) {</div><div class='add'>+        case GF_EVENT_PARENT_UP:</div><div class='add'>+        case GF_EVENT_PARENT_DOWN: {</div><div class='add'>+            xlator_list_t *list = this-&gt;children;</div><div class='add'>+</div><div class='add'>+            while (list) {</div><div class='add'>+                if (victim &amp;&amp; victim-&gt;cleanup_starting)</div><div class='add'>+                    xlator_notify(list-&gt;xlator, event, victim);</div><div class='add'>+                else</div><div class='add'>+                    xlator_notify(list-&gt;xlator, event, this);</div><div class='add'>+                list = list-&gt;next;</div><div class='add'>+            }</div><div class='add'>+        } break;</div><div class='add'>+        case GF_EVENT_CHILD_CONNECTING:</div><div class='add'>+        case GF_EVENT_CHILD_DOWN:</div><div class='add'>+        case GF_EVENT_CHILD_UP:</div><div class='add'>+        case GF_EVENT_AUTH_FAILED: {</div><div class='add'>+            xlator_list_t *parent = this-&gt;parents;</div><div class='add'>+</div><div class='add'>+            /*</div><div class='add'>+             * Handle case of CHILD_* &amp; AUTH_FAILED event specially, send</div><div class='add'>+             * it to fuse.</div><div class='add'>+             */</div><div class='add'>+            if (!parent &amp;&amp; this-&gt;ctx &amp;&amp; this-&gt;ctx-&gt;master) {</div><div class='add'>+                xlator_notify(this-&gt;ctx-&gt;master, event, this-&gt;graph, NULL);</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            while (parent) {</div><div class='add'>+                if (parent-&gt;xlator-&gt;init_succeeded)</div><div class='add'>+                    xlator_notify(parent-&gt;xlator, event, this, NULL);</div><div class='add'>+                parent = parent-&gt;next;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            if (event == GF_EVENT_CHILD_DOWN &amp;&amp;</div><div class='add'>+                !(this-&gt;ctx &amp;&amp; this-&gt;ctx-&gt;master) &amp;&amp; (graph-&gt;top == this)) {</div><div class='add'>+                /* Make sure this is not a daemon with master xlator */</div><div class='add'>+                pthread_mutex_lock(&amp;graph-&gt;mutex);</div><div class='add'>+                {</div><div class='add'>+                    if (graph-&gt;parent_down ==</div><div class='add'>+                        graph_total_client_xlator(graph)) {</div><div class='add'>+                        graph-&gt;used = 0;</div><div class='add'>+                        pthread_cond_broadcast(&amp;graph-&gt;child_down_cond);</div><div class='add'>+                    }</div><div class='add'>+                }</div><div class='add'>+                pthread_mutex_unlock(&amp;graph-&gt;mutex);</div><div class='add'>+            }</div><div class='add'>+        } break;</div><div class='add'>+        case GF_EVENT_UPCALL: {</div><div class='add'>+            xlator_list_t *parent = this-&gt;parents;</div><div class='add'>+</div><div class='add'>+            if (!parent &amp;&amp; this-&gt;ctx &amp;&amp; this-&gt;ctx-&gt;master)</div><div class='add'>+                xlator_notify(this-&gt;ctx-&gt;master, event, data, NULL);</div><div class='add'>+</div><div class='add'>+            while (parent) {</div><div class='add'>+                if (parent-&gt;xlator-&gt;init_succeeded)</div><div class='add'>+                    xlator_notify(parent-&gt;xlator, event, data, NULL);</div><div class='add'>+                parent = parent-&gt;next;</div><div class='add'>+            }</div><div class='add'>+        } break;</div><div class='add'>+        case GF_EVENT_CHILD_PING: {</div><div class='add'>+            xlator_list_t *parent = this-&gt;parents;</div><div class='add'>+</div><div class='add'>+            while (parent) {</div><div class='add'>+                if (parent-&gt;xlator-&gt;init_succeeded)</div><div class='add'>+                    XLATOR_NOTIFY(ret, parent-&gt;xlator, event, this, data);</div><div class='add'>+                parent = parent-&gt;next;</div><div class='add'>+            }</div><div class='add'>+        } break;</div><div class='add'>+        case GF_EVENT_CLEANUP: {</div><div class='add'>+            xlator_list_t *list = this-&gt;children;</div><div class='add'>+</div><div class='add'>+            while (list) {</div><div class='add'>+                xlator_notify(list-&gt;xlator, event, this);</div><div class='add'>+                list = list-&gt;next;</div><div class='add'>+            }</div><div class='add'>+        } break;</div><div class='add'>+</div><div class='add'>+        default: {</div><div class='add'>+            xlator_list_t *parent = this-&gt;parents;</div><div class='add'>+</div><div class='add'>+            while (parent) {</div><div class='add'>+                if (parent-&gt;xlator-&gt;init_succeeded)</div><div class='add'>+                    xlator_notify(parent-&gt;xlator, event, this, NULL);</div><div class='add'>+                parent = parent-&gt;next;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+            /*</div><div class='add'>+             * Apparently our picky-about-everything else coding standard allows</div><div class='add'>+             * adjacent same-indendation-level close braces.  Clearly it has</div><div class='add'>+             * nothing to do with readability.</div><div class='add'>+             */</div><div class='add'>+    }</div><div class='add'>+out:</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_mem_acct_init(xlator_t *this)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    ret = xlator_mem_acct_init(this, gf_common_mt_end);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+default_fini(xlator_t *this)</div><div class='add'>+{</div><div class='add'>+    if (this &amp;&amp; this-&gt;private)</div><div class='add'>+        GF_FREE(this-&gt;private);</div><div class='add'>+}</div><div class='head'>diff --git a/libglusterfs/src/defaults.c b/libglusterfs/src/defaults.c<br/>deleted file mode 100644<br/>index 5aa0fad8937..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/libglusterfs/src/defaults.c?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/defaults.c</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,1339 +0,0 @@</div><div class='del'>-/*</div><div class='del'>-  Copyright (c) 2006-2009 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='del'>-  This file is part of GlusterFS.</div><div class='del'>-</div><div class='del'>-  GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-  it under the terms of the GNU General Public License as published</div><div class='del'>-  by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-  or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-  GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-  WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-  General Public License for more details.</div><div class='del'>-</div><div class='del'>-  You should have received a copy of the GNU General Public License</div><div class='del'>-  along with this program.  If not, see</div><div class='del'>-  &lt;http://www.gnu.org/licenses/&gt;.</div><div class='del'>-*/</div><div class='del'>-</div><div class='del'>-/* libglusterfs/src/defaults.c:</div><div class='del'>-   This file contains functions, which are used to fill the 'fops' and 'mops'</div><div class='del'>-   structures in the xlator structures, if they are not written. Here, all the</div><div class='del'>-   function calls are plainly forwared to the first child of the xlator, and</div><div class='del'>-   all the *_cbk function does plain STACK_UNWIND of the frame, and returns.</div><div class='del'>-</div><div class='del'>-   All the functions are plain enough to understand.</div><div class='del'>-*/</div><div class='del'>-</div><div class='del'>-#ifndef _CONFIG_H</div><div class='del'>-#define _CONFIG_H</div><div class='del'>-#include "config.h"</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-#include "xlator.h"</div><div class='del'>-</div><div class='del'>-static int32_t</div><div class='del'>-default_lookup_cbk (call_frame_t *frame,</div><div class='del'>-		    void *cookie,</div><div class='del'>-		    xlator_t *this,</div><div class='del'>-		    int32_t op_ret,</div><div class='del'>-		    int32_t op_errno,</div><div class='del'>-		    inode_t *inode,</div><div class='del'>-		    struct iatt *buf,</div><div class='del'>-                    dict_t *dict,</div><div class='del'>-                    struct iatt *postparent)</div><div class='del'>-{</div><div class='del'>-	STACK_UNWIND (frame,</div><div class='del'>-		      op_ret,</div><div class='del'>-		      op_errno,</div><div class='del'>-		      inode,</div><div class='del'>-		      buf,</div><div class='del'>-                      dict,</div><div class='del'>-                      postparent);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-default_lookup (call_frame_t *frame,</div><div class='del'>-		xlator_t *this,</div><div class='del'>-		loc_t *loc,</div><div class='del'>-		dict_t *xattr_req)</div><div class='del'>-{</div><div class='del'>-	STACK_WIND (frame,</div><div class='del'>-		    default_lookup_cbk,</div><div class='del'>-		    FIRST_CHILD(this),</div><div class='del'>-		    FIRST_CHILD(this)-&gt;fops-&gt;lookup,</div><div class='del'>-		    loc,</div><div class='del'>-		    xattr_req);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-default_forget (xlator_t *this,</div><div class='del'>-		inode_t *inode)</div><div class='del'>-{</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-static int32_t</div><div class='del'>-default_stat_cbk (call_frame_t *frame,</div><div class='del'>-		  void *cookie,</div><div class='del'>-		  xlator_t *this,</div><div class='del'>-		  int32_t op_ret,</div><div class='del'>-		  int32_t op_errno,</div><div class='del'>-		  struct iatt *buf)</div><div class='del'>-{</div><div class='del'>-	STACK_UNWIND (frame,</div><div class='del'>-		      op_ret,</div><div class='del'>-		      op_errno,</div><div class='del'>-		      buf);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-default_stat (call_frame_t *frame,</div><div class='del'>-	      xlator_t *this,</div><div class='del'>-	      loc_t *loc)</div><div class='del'>-{</div><div class='del'>-	STACK_WIND (frame,</div><div class='del'>-		    default_stat_cbk,</div><div class='del'>-		    FIRST_CHILD(this),</div><div class='del'>-		    FIRST_CHILD(this)-&gt;fops-&gt;stat,</div><div class='del'>-		    loc);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-default_truncate_cbk (call_frame_t *frame,</div><div class='del'>-		      void *cookie,</div><div class='del'>-		      xlator_t *this,</div><div class='del'>-		      int32_t op_ret,</div><div class='del'>-		      int32_t op_errno,</div><div class='del'>-		      struct iatt *prebuf,</div><div class='del'>-                      struct iatt *postbuf)</div><div class='del'>-{</div><div class='del'>-	STACK_UNWIND (frame,</div><div class='del'>-		      op_ret,</div><div class='del'>-		      op_errno,</div><div class='del'>-		      prebuf,</div><div class='del'>-                      postbuf);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-default_truncate (call_frame_t *frame,</div><div class='del'>-		  xlator_t *this,</div><div class='del'>-		  loc_t *loc,</div><div class='del'>-		  off_t offset)</div><div class='del'>-{</div><div class='del'>-	STACK_WIND (frame,</div><div class='del'>-		    default_truncate_cbk,</div><div class='del'>-		    FIRST_CHILD(this),</div><div class='del'>-		    FIRST_CHILD(this)-&gt;fops-&gt;truncate,</div><div class='del'>-		    loc,</div><div class='del'>-		    offset);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-static int32_t</div><div class='del'>-default_ftruncate_cbk (call_frame_t *frame,</div><div class='del'>-		       void *cookie,</div><div class='del'>-		       xlator_t *this,</div><div class='del'>-		       int32_t op_ret,</div><div class='del'>-		       int32_t op_errno,</div><div class='del'>-		       struct iatt *prebuf,</div><div class='del'>-                       struct iatt *postbuf)</div><div class='del'>-{</div><div class='del'>-	STACK_UNWIND (frame,</div><div class='del'>-		      op_ret,</div><div class='del'>-		      op_errno,</div><div class='del'>-		      prebuf,</div><div class='del'>-                      postbuf);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-default_ftruncate (call_frame_t *frame,</div><div class='del'>-		   xlator_t *this,</div><div class='del'>-		   fd_t *fd,</div><div class='del'>-		   off_t offset)</div><div class='del'>-{</div><div class='del'>-	STACK_WIND (frame,</div><div class='del'>-		    default_ftruncate_cbk,</div><div class='del'>-		    FIRST_CHILD(this),</div><div class='del'>-		    FIRST_CHILD(this)-&gt;fops-&gt;ftruncate,</div><div class='del'>-		    fd,</div><div class='del'>-		    offset);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-default_access_cbk (call_frame_t *frame,</div><div class='del'>-		    void *cookie,</div><div class='del'>-		    xlator_t *this,</div><div class='del'>-		    int32_t op_ret,</div><div class='del'>-		    int32_t op_errno)</div><div class='del'>-{</div><div class='del'>-	STACK_UNWIND (frame,</div><div class='del'>-		      op_ret,</div><div class='del'>-		      op_errno);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-default_access (call_frame_t *frame,</div><div class='del'>-		xlator_t *this,</div><div class='del'>-		loc_t *loc,</div><div class='del'>-		int32_t mask)</div><div class='del'>-{</div><div class='del'>-	STACK_WIND (frame,</div><div class='del'>-		    default_access_cbk,</div><div class='del'>-		    FIRST_CHILD(this),</div><div class='del'>-		    FIRST_CHILD(this)-&gt;fops-&gt;access,</div><div class='del'>-		    loc,</div><div class='del'>-		    mask);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-default_readlink_cbk (call_frame_t *frame,</div><div class='del'>-		      void *cookie,</div><div class='del'>-		      xlator_t *this,</div><div class='del'>-		      int32_t op_ret,</div><div class='del'>-		      int32_t op_errno,</div><div class='del'>-		      const char *path,</div><div class='del'>-                      struct iatt *buf)</div><div class='del'>-{</div><div class='del'>-	STACK_UNWIND (frame,</div><div class='del'>-		      op_ret,</div><div class='del'>-		      op_errno,</div><div class='del'>-		      path,</div><div class='del'>-                      buf);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-default_readlink (call_frame_t *frame,</div><div class='del'>-		  xlator_t *this,</div><div class='del'>-		  loc_t *loc,</div><div class='del'>-		  size_t size)</div><div class='del'>-{</div><div class='del'>-	STACK_WIND (frame,</div><div class='del'>-		    default_readlink_cbk,</div><div class='del'>-		    FIRST_CHILD(this),</div><div class='del'>-		    FIRST_CHILD(this)-&gt;fops-&gt;readlink,</div><div class='del'>-		    loc,</div><div class='del'>-		    size);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-default_mknod_cbk (call_frame_t *frame,</div><div class='del'>-		   void *cookie,</div><div class='del'>-		   xlator_t *this,</div><div class='del'>-		   int32_t op_ret,</div><div class='del'>-		   int32_t op_errno,</div><div class='del'>-		   inode_t *inode,</div><div class='del'>-                   struct iatt *buf,</div><div class='del'>-                   struct iatt *preparent,</div><div class='del'>-                   struct iatt *postparent)</div><div class='del'>-{</div><div class='del'>-	STACK_UNWIND (frame,</div><div class='del'>-		      op_ret,</div><div class='del'>-		      op_errno,</div><div class='del'>-		      inode,</div><div class='del'>-                      buf,</div><div class='del'>-                      preparent,</div><div class='del'>-                      postparent);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-default_mknod (call_frame_t *frame, xlator_t *this,</div><div class='del'>-	       loc_t *loc, mode_t mode, dev_t rdev, dict_t *parms)</div><div class='del'>-{</div><div class='del'>-	STACK_WIND (frame, default_mknod_cbk,</div><div class='del'>-		    FIRST_CHILD(this),</div><div class='del'>-		    FIRST_CHILD(this)-&gt;fops-&gt;mknod,</div><div class='del'>-		    loc, mode, rdev, parms);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-default_mkdir_cbk (call_frame_t *frame,</div><div class='del'>-		   void *cookie,</div><div class='del'>-		   xlator_t *this,</div><div class='del'>-		   int32_t op_ret,</div><div class='del'>-		   int32_t op_errno,</div><div class='del'>-		   inode_t *inode,</div><div class='del'>-                   struct iatt *buf,</div><div class='del'>-                   struct iatt *preparent,</div><div class='del'>-                   struct iatt *postparent)</div><div class='del'>-{</div><div class='del'>-	STACK_UNWIND (frame,</div><div class='del'>-		      op_ret,</div><div class='del'>-		      op_errno,</div><div class='del'>-		      inode,</div><div class='del'>-                      buf,</div><div class='del'>-                      preparent,</div><div class='del'>-                      postparent);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-default_mkdir (call_frame_t *frame, xlator_t *this,</div><div class='del'>-	       loc_t *loc, mode_t mode, dict_t *params)</div><div class='del'>-{</div><div class='del'>-	STACK_WIND (frame, default_mkdir_cbk,</div><div class='del'>-		    FIRST_CHILD(this),</div><div class='del'>-		    FIRST_CHILD(this)-&gt;fops-&gt;mkdir,</div><div class='del'>-		    loc, mode, params);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-default_unlink_cbk (call_frame_t *frame,</div><div class='del'>-		    void *cookie,</div><div class='del'>-		    xlator_t *this,</div><div class='del'>-		    int32_t op_ret,</div><div class='del'>-		    int32_t op_errno,</div><div class='del'>-                    struct iatt *preparent,</div><div class='del'>-                    struct iatt *postparent)</div><div class='del'>-{</div><div class='del'>-	STACK_UNWIND (frame, op_ret, op_errno, preparent, postparent);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-default_unlink (call_frame_t *frame,</div><div class='del'>-		xlator_t *this,</div><div class='del'>-		loc_t *loc)</div><div class='del'>-{</div><div class='del'>-	STACK_WIND (frame,</div><div class='del'>-		    default_unlink_cbk,</div><div class='del'>-		    FIRST_CHILD(this),</div><div class='del'>-		    FIRST_CHILD(this)-&gt;fops-&gt;unlink,</div><div class='del'>-		    loc);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-default_rmdir_cbk (call_frame_t *frame,</div><div class='del'>-		   void *cookie,</div><div class='del'>-		   xlator_t *this,</div><div class='del'>-		   int32_t op_ret,</div><div class='del'>-		   int32_t op_errno,</div><div class='del'>-                   struct iatt *preparent,</div><div class='del'>-                   struct iatt *postparent)</div><div class='del'>-{</div><div class='del'>-	STACK_UNWIND (frame,</div><div class='del'>-		      op_ret,</div><div class='del'>-		      op_errno,</div><div class='del'>-                      preparent,</div><div class='del'>-                      postparent);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-default_rmdir (call_frame_t *frame,</div><div class='del'>-	       xlator_t *this,</div><div class='del'>-	       loc_t *loc)</div><div class='del'>-{</div><div class='del'>-	STACK_WIND (frame,</div><div class='del'>-		    default_rmdir_cbk,</div><div class='del'>-		    FIRST_CHILD(this),</div><div class='del'>-		    FIRST_CHILD(this)-&gt;fops-&gt;rmdir,</div><div class='del'>-		    loc);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-default_symlink_cbk (call_frame_t *frame,</div><div class='del'>-		     void *cookie,</div><div class='del'>-		     xlator_t *this,</div><div class='del'>-		     int32_t op_ret,</div><div class='del'>-		     int32_t op_errno,</div><div class='del'>-		     inode_t *inode,</div><div class='del'>-                     struct iatt *buf,</div><div class='del'>-                     struct iatt *preparent,</div><div class='del'>-                     struct iatt *postparent)</div><div class='del'>-{</div><div class='del'>-        STACK_UNWIND (frame, op_ret, op_errno, inode, buf, preparent,</div><div class='del'>-                      postparent);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-default_symlink (call_frame_t *frame, xlator_t *this,</div><div class='del'>-		 const char *linkpath, loc_t *loc, dict_t *params)</div><div class='del'>-{</div><div class='del'>-	STACK_WIND (frame, default_symlink_cbk,</div><div class='del'>-		    FIRST_CHILD(this),</div><div class='del'>-		    FIRST_CHILD(this)-&gt;fops-&gt;symlink,</div><div class='del'>-		    linkpath, loc, params);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-default_rename_cbk (call_frame_t *frame,</div><div class='del'>-		    void *cookie,</div><div class='del'>-		    xlator_t *this,</div><div class='del'>-		    int32_t op_ret,</div><div class='del'>-		    int32_t op_errno,</div><div class='del'>-		    struct iatt *buf,</div><div class='del'>-                    struct iatt *preoldparent,</div><div class='del'>-                    struct iatt *postoldparent,</div><div class='del'>-                    struct iatt *prenewparent,</div><div class='del'>-                    struct iatt *postnewparent)</div><div class='del'>-{</div><div class='del'>-	STACK_UNWIND (frame, op_ret, op_errno, buf, preoldparent, postoldparent,</div><div class='del'>-                      prenewparent, postnewparent);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-default_rename (call_frame_t *frame,</div><div class='del'>-		xlator_t *this,</div><div class='del'>-		loc_t *oldloc,</div><div class='del'>-		loc_t *newloc)</div><div class='del'>-{</div><div class='del'>-	STACK_WIND (frame,</div><div class='del'>-		    default_rename_cbk,</div><div class='del'>-		    FIRST_CHILD(this),</div><div class='del'>-		    FIRST_CHILD(this)-&gt;fops-&gt;rename,</div><div class='del'>-		    oldloc, newloc);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-default_link_cbk (call_frame_t *frame,</div><div class='del'>-		  void *cookie,</div><div class='del'>-		  xlator_t *this,</div><div class='del'>-		  int32_t op_ret,</div><div class='del'>-		  int32_t op_errno,</div><div class='del'>-		  inode_t *inode,</div><div class='del'>-                  struct iatt *buf,</div><div class='del'>-                  struct iatt *preparent,</div><div class='del'>-                  struct iatt *postparent)</div><div class='del'>-{</div><div class='del'>-        STACK_UNWIND (frame, op_ret, op_errno, inode, buf, preparent,</div><div class='del'>-                      postparent);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-default_link (call_frame_t *frame,</div><div class='del'>-	      xlator_t *this,</div><div class='del'>-	      loc_t *oldloc,</div><div class='del'>-	      loc_t *newloc)</div><div class='del'>-{</div><div class='del'>-	STACK_WIND (frame,</div><div class='del'>-		    default_link_cbk,</div><div class='del'>-		    FIRST_CHILD(this),</div><div class='del'>-		    FIRST_CHILD(this)-&gt;fops-&gt;link,</div><div class='del'>-		    oldloc, newloc);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-default_create_cbk (call_frame_t *frame,</div><div class='del'>-		    void *cookie,</div><div class='del'>-		    xlator_t *this,</div><div class='del'>-		    int32_t op_ret,</div><div class='del'>-		    int32_t op_errno,</div><div class='del'>-		    fd_t *fd,</div><div class='del'>-		    inode_t *inode,</div><div class='del'>-		    struct iatt *buf,</div><div class='del'>-                    struct iatt *preparent,</div><div class='del'>-                    struct iatt *postparent)</div><div class='del'>-{</div><div class='del'>-	STACK_UNWIND (frame, op_ret, op_errno, fd, inode, buf, preparent,</div><div class='del'>-                      postparent);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-default_create (call_frame_t *frame, xlator_t *this,</div><div class='del'>-		loc_t *loc, int32_t flags, mode_t mode,</div><div class='del'>-                fd_t *fd, dict_t *params)</div><div class='del'>-{</div><div class='del'>-	STACK_WIND (frame, default_create_cbk,</div><div class='del'>-		    FIRST_CHILD(this),</div><div class='del'>-		    FIRST_CHILD(this)-&gt;fops-&gt;create,</div><div class='del'>-		    loc, flags, mode, fd, params);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-default_open_cbk (call_frame_t *frame,</div><div class='del'>-		  void *cookie,</div><div class='del'>-		  xlator_t *this,</div><div class='del'>-		  int32_t op_ret,</div><div class='del'>-		  int32_t op_errno,</div><div class='del'>-		  fd_t *fd)</div><div class='del'>-{</div><div class='del'>-	STACK_UNWIND (frame,</div><div class='del'>-		      op_ret,</div><div class='del'>-		      op_errno,</div><div class='del'>-		      fd);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-default_open (call_frame_t *frame,</div><div class='del'>-	      xlator_t *this,</div><div class='del'>-	      loc_t *loc,</div><div class='del'>-	      int32_t flags, fd_t *fd,</div><div class='del'>-              int32_t wbflags)</div><div class='del'>-{</div><div class='del'>-	STACK_WIND (frame,</div><div class='del'>-		    default_open_cbk,</div><div class='del'>-		    FIRST_CHILD(this),</div><div class='del'>-		    FIRST_CHILD(this)-&gt;fops-&gt;open,</div><div class='del'>-		    loc, flags, fd, wbflags);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-default_readv_cbk (call_frame_t *frame,</div><div class='del'>-		   void *cookie,</div><div class='del'>-		   xlator_t *this,</div><div class='del'>-		   int32_t op_ret,</div><div class='del'>-		   int32_t op_errno,</div><div class='del'>-		   struct iovec *vector,</div><div class='del'>-		   int32_t count,</div><div class='del'>-		   struct iatt *stbuf,</div><div class='del'>-                   struct iobref *iobref)</div><div class='del'>-{</div><div class='del'>-	STACK_UNWIND (frame,</div><div class='del'>-		      op_ret,</div><div class='del'>-		      op_errno,</div><div class='del'>-		      vector,</div><div class='del'>-		      count,</div><div class='del'>-		      stbuf,</div><div class='del'>-                      iobref);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-default_readv (call_frame_t *frame,</div><div class='del'>-	       xlator_t *this,</div><div class='del'>-	       fd_t *fd,</div><div class='del'>-	       size_t size,</div><div class='del'>-	       off_t offset)</div><div class='del'>-{</div><div class='del'>-	STACK_WIND (frame,</div><div class='del'>-		    default_readv_cbk,</div><div class='del'>-		    FIRST_CHILD(this),</div><div class='del'>-		    FIRST_CHILD(this)-&gt;fops-&gt;readv,</div><div class='del'>-		    fd,</div><div class='del'>-		    size,</div><div class='del'>-		    offset);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-default_writev_cbk (call_frame_t *frame,</div><div class='del'>-		    void *cookie,</div><div class='del'>-		    xlator_t *this,</div><div class='del'>-		    int32_t op_ret,</div><div class='del'>-		    int32_t op_errno,</div><div class='del'>-                    struct iatt *prebuf,</div><div class='del'>-		    struct iatt *postbuf)</div><div class='del'>-{</div><div class='del'>-	STACK_UNWIND (frame,</div><div class='del'>-		      op_ret,</div><div class='del'>-		      op_errno,</div><div class='del'>-                      prebuf,</div><div class='del'>-		      postbuf);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-default_writev (call_frame_t *frame,</div><div class='del'>-		xlator_t *this,</div><div class='del'>-		fd_t *fd,</div><div class='del'>-		struct iovec *vector,</div><div class='del'>-		int32_t count,</div><div class='del'>-		off_t off,</div><div class='del'>-                struct iobref *iobref)</div><div class='del'>-{</div><div class='del'>-	STACK_WIND (frame,</div><div class='del'>-		    default_writev_cbk,</div><div class='del'>-		    FIRST_CHILD(this),</div><div class='del'>-		    FIRST_CHILD(this)-&gt;fops-&gt;writev,</div><div class='del'>-		    fd,</div><div class='del'>-		    vector,</div><div class='del'>-		    count,</div><div class='del'>-		    off,</div><div class='del'>-                    iobref);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-static int32_t</div><div class='del'>-default_flush_cbk (call_frame_t *frame,</div><div class='del'>-		   void *cookie,</div><div class='del'>-		   xlator_t *this,</div><div class='del'>-		   int32_t op_ret,</div><div class='del'>-		   int32_t op_errno)</div><div class='del'>-{</div><div class='del'>-	STACK_UNWIND (frame,</div><div class='del'>-		      op_ret,</div><div class='del'>-		      op_errno);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-default_flush (call_frame_t *frame,</div><div class='del'>-	       xlator_t *this,</div><div class='del'>-	       fd_t *fd)</div><div class='del'>-{</div><div class='del'>-	STACK_WIND (frame,</div><div class='del'>-		    default_flush_cbk,</div><div class='del'>-		    FIRST_CHILD(this),</div><div class='del'>-		    FIRST_CHILD(this)-&gt;fops-&gt;flush,</div><div class='del'>-		    fd);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-static int32_t</div><div class='del'>-default_fsync_cbk (call_frame_t *frame,</div><div class='del'>-		   void *cookie,</div><div class='del'>-		   xlator_t *this,</div><div class='del'>-		   int32_t op_ret,</div><div class='del'>-		   int32_t op_errno,</div><div class='del'>-                   struct iatt *prebuf,</div><div class='del'>-                   struct iatt *postbuf)</div><div class='del'>-{</div><div class='del'>-	STACK_UNWIND (frame,</div><div class='del'>-		      op_ret,</div><div class='del'>-		      op_errno,</div><div class='del'>-                      prebuf,</div><div class='del'>-                      postbuf);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-default_fsync (call_frame_t *frame,</div><div class='del'>-	       xlator_t *this,</div><div class='del'>-	       fd_t *fd,</div><div class='del'>-	       int32_t flags)</div><div class='del'>-{</div><div class='del'>-	STACK_WIND (frame,</div><div class='del'>-		    default_fsync_cbk,</div><div class='del'>-		    FIRST_CHILD(this),</div><div class='del'>-		    FIRST_CHILD(this)-&gt;fops-&gt;fsync,</div><div class='del'>-		    fd,</div><div class='del'>-		    flags);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-static int32_t</div><div class='del'>-default_fstat_cbk (call_frame_t *frame,</div><div class='del'>-		   void *cookie,</div><div class='del'>-		   xlator_t *this,</div><div class='del'>-		   int32_t op_ret,</div><div class='del'>-		   int32_t op_errno,</div><div class='del'>-		   struct iatt *buf)</div><div class='del'>-{</div><div class='del'>-	STACK_UNWIND (frame,</div><div class='del'>-		      op_ret,</div><div class='del'>-		      op_errno,</div><div class='del'>-		      buf);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-default_fstat (call_frame_t *frame,</div><div class='del'>-	       xlator_t *this,</div><div class='del'>-	       fd_t *fd)</div><div class='del'>-{</div><div class='del'>-	STACK_WIND (frame,</div><div class='del'>-		    default_fstat_cbk,</div><div class='del'>-		    FIRST_CHILD(this),</div><div class='del'>-		    FIRST_CHILD(this)-&gt;fops-&gt;fstat,</div><div class='del'>-		    fd);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-default_opendir_cbk (call_frame_t *frame,</div><div class='del'>-		     void *cookie,</div><div class='del'>-		     xlator_t *this,</div><div class='del'>-		     int32_t op_ret,</div><div class='del'>-		     int32_t op_errno,</div><div class='del'>-		     fd_t *fd)</div><div class='del'>-{</div><div class='del'>-	STACK_UNWIND (frame,</div><div class='del'>-		      op_ret,</div><div class='del'>-		      op_errno,</div><div class='del'>-		      fd);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-default_opendir (call_frame_t *frame,</div><div class='del'>-		 xlator_t *this,</div><div class='del'>-		 loc_t *loc, fd_t *fd)</div><div class='del'>-{</div><div class='del'>-	STACK_WIND (frame,</div><div class='del'>-		    default_opendir_cbk,</div><div class='del'>-		    FIRST_CHILD(this),</div><div class='del'>-		    FIRST_CHILD(this)-&gt;fops-&gt;opendir,</div><div class='del'>-		    loc, fd);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-static int32_t</div><div class='del'>-default_fsyncdir_cbk (call_frame_t *frame,</div><div class='del'>-		      void *cookie,</div><div class='del'>-		      xlator_t *this,</div><div class='del'>-		      int32_t op_ret,</div><div class='del'>-		      int32_t op_errno)</div><div class='del'>-{</div><div class='del'>-	STACK_UNWIND (frame,</div><div class='del'>-		      op_ret,</div><div class='del'>-		      op_errno);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-default_fsyncdir (call_frame_t *frame,</div><div class='del'>-		  xlator_t *this,</div><div class='del'>-		  fd_t *fd,</div><div class='del'>-		  int32_t flags)</div><div class='del'>-{</div><div class='del'>-	STACK_WIND (frame,</div><div class='del'>-		    default_fsyncdir_cbk,</div><div class='del'>-		    FIRST_CHILD(this),</div><div class='del'>-		    FIRST_CHILD(this)-&gt;fops-&gt;fsyncdir,</div><div class='del'>-		    fd,</div><div class='del'>-		    flags);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-static int32_t</div><div class='del'>-default_statfs_cbk (call_frame_t *frame,</div><div class='del'>-		    void *cookie,</div><div class='del'>-		    xlator_t *this,</div><div class='del'>-		    int32_t op_ret,</div><div class='del'>-		    int32_t op_errno,</div><div class='del'>-		    struct statvfs *buf)</div><div class='del'>-{</div><div class='del'>-	STACK_UNWIND (frame,</div><div class='del'>-		      op_ret,</div><div class='del'>-		      op_errno,</div><div class='del'>-		      buf);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-default_statfs (call_frame_t *frame,</div><div class='del'>-		xlator_t *this,</div><div class='del'>-		loc_t *loc)</div><div class='del'>-{</div><div class='del'>-	STACK_WIND (frame,</div><div class='del'>-		    default_statfs_cbk,</div><div class='del'>-		    FIRST_CHILD(this),</div><div class='del'>-		    FIRST_CHILD(this)-&gt;fops-&gt;statfs,</div><div class='del'>-		    loc);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-static int32_t</div><div class='del'>-default_setxattr_cbk (call_frame_t *frame,</div><div class='del'>-		      void *cookie,</div><div class='del'>-		      xlator_t *this,</div><div class='del'>-		      int32_t op_ret,</div><div class='del'>-		      int32_t op_errno)</div><div class='del'>-{</div><div class='del'>-	STACK_UNWIND (frame,</div><div class='del'>-		      op_ret,</div><div class='del'>-		      op_errno);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-default_setxattr (call_frame_t *frame,</div><div class='del'>-		  xlator_t *this,</div><div class='del'>-		  loc_t *loc,</div><div class='del'>-		  dict_t *dict,</div><div class='del'>-		  int32_t flags)</div><div class='del'>-{</div><div class='del'>-	STACK_WIND (frame,</div><div class='del'>-		    default_setxattr_cbk,</div><div class='del'>-		    FIRST_CHILD(this),</div><div class='del'>-		    FIRST_CHILD(this)-&gt;fops-&gt;setxattr,</div><div class='del'>-		    loc,</div><div class='del'>-		    dict,</div><div class='del'>-		    flags);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-static int32_t</div><div class='del'>-default_fsetxattr_cbk (call_frame_t *frame,</div><div class='del'>-                       void *cookie,</div><div class='del'>-                       xlator_t *this,</div><div class='del'>-                       int32_t op_ret,</div><div class='del'>-                       int32_t op_errno)</div><div class='del'>-{</div><div class='del'>-	STACK_UNWIND (frame,</div><div class='del'>-		      op_ret,</div><div class='del'>-		      op_errno);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-default_fsetxattr (call_frame_t *frame,</div><div class='del'>-                   xlator_t *this,</div><div class='del'>-                   fd_t *fd,</div><div class='del'>-                   dict_t *dict,</div><div class='del'>-                   int32_t flags)</div><div class='del'>-{</div><div class='del'>-	STACK_WIND (frame,</div><div class='del'>-		    default_fsetxattr_cbk,</div><div class='del'>-		    FIRST_CHILD(this),</div><div class='del'>-		    FIRST_CHILD(this)-&gt;fops-&gt;fsetxattr,</div><div class='del'>-		    fd,</div><div class='del'>-		    dict,</div><div class='del'>-		    flags);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-static int32_t</div><div class='del'>-default_fgetxattr_cbk (call_frame_t *frame,</div><div class='del'>-                       void *cookie,</div><div class='del'>-                       xlator_t *this,</div><div class='del'>-                       int32_t op_ret,</div><div class='del'>-                       int32_t op_errno,</div><div class='del'>-                       dict_t *dict)</div><div class='del'>-{</div><div class='del'>-	STACK_UNWIND (frame,</div><div class='del'>-		      op_ret,</div><div class='del'>-		      op_errno,</div><div class='del'>-		      dict);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-default_fgetxattr (call_frame_t *frame,</div><div class='del'>-                   xlator_t *this,</div><div class='del'>-                   fd_t *fd,</div><div class='del'>-                   const char *name)</div><div class='del'>-{</div><div class='del'>-	STACK_WIND (frame,</div><div class='del'>-		    default_fgetxattr_cbk,</div><div class='del'>-		    FIRST_CHILD(this),</div><div class='del'>-		    FIRST_CHILD(this)-&gt;fops-&gt;fgetxattr,</div><div class='del'>-		    fd,</div><div class='del'>-		    name);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-static int32_t</div><div class='del'>-default_getxattr_cbk (call_frame_t *frame,</div><div class='del'>-                      void *cookie,</div><div class='del'>-                      xlator_t *this,</div><div class='del'>-                      int32_t op_ret,</div><div class='del'>-                      int32_t op_errno,</div><div class='del'>-                      dict_t *dict)</div><div class='del'>-{</div><div class='del'>-	STACK_UNWIND (frame,</div><div class='del'>-		      op_ret,</div><div class='del'>-		      op_errno,</div><div class='del'>-		      dict);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-default_getxattr (call_frame_t *frame,</div><div class='del'>-		  xlator_t *this,</div><div class='del'>-		  loc_t *loc,</div><div class='del'>-		  const char *name)</div><div class='del'>-{</div><div class='del'>-	STACK_WIND (frame,</div><div class='del'>-		    default_getxattr_cbk,</div><div class='del'>-		    FIRST_CHILD(this),</div><div class='del'>-		    FIRST_CHILD(this)-&gt;fops-&gt;getxattr,</div><div class='del'>-		    loc,</div><div class='del'>-		    name);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-default_xattrop_cbk (call_frame_t *frame,</div><div class='del'>-		     void *cookie,</div><div class='del'>-		     xlator_t *this,</div><div class='del'>-		     int32_t op_ret,</div><div class='del'>-		     int32_t op_errno,</div><div class='del'>-		     dict_t *dict)</div><div class='del'>-{</div><div class='del'>-	STACK_UNWIND (frame, op_ret, op_errno, dict);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-default_xattrop (call_frame_t *frame,</div><div class='del'>-		 xlator_t *this,</div><div class='del'>-		 loc_t *loc,</div><div class='del'>-		 gf_xattrop_flags_t flags,</div><div class='del'>-		 dict_t *dict)</div><div class='del'>-{</div><div class='del'>-	STACK_WIND (frame,</div><div class='del'>-		    default_xattrop_cbk,</div><div class='del'>-		    FIRST_CHILD(this),</div><div class='del'>-		    FIRST_CHILD(this)-&gt;fops-&gt;xattrop,</div><div class='del'>-		    loc,</div><div class='del'>-		    flags,</div><div class='del'>-		    dict);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-default_fxattrop_cbk (call_frame_t *frame,</div><div class='del'>-		      void *cookie,</div><div class='del'>-		      xlator_t *this,</div><div class='del'>-		      int32_t op_ret,</div><div class='del'>-		      int32_t op_errno,</div><div class='del'>-		      dict_t *dict)</div><div class='del'>-{</div><div class='del'>-	STACK_UNWIND (frame, op_ret, op_errno, dict);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-default_fxattrop (call_frame_t *frame,</div><div class='del'>-		  xlator_t *this,</div><div class='del'>-		  fd_t *fd,</div><div class='del'>-		  gf_xattrop_flags_t flags,</div><div class='del'>-		  dict_t *dict)</div><div class='del'>-{</div><div class='del'>-	STACK_WIND (frame,</div><div class='del'>-		    default_fxattrop_cbk,</div><div class='del'>-		    FIRST_CHILD(this),</div><div class='del'>-		    FIRST_CHILD(this)-&gt;fops-&gt;fxattrop,</div><div class='del'>-		    fd,</div><div class='del'>-		    flags,</div><div class='del'>-		    dict);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-static int32_t</div><div class='del'>-default_removexattr_cbk (call_frame_t *frame,</div><div class='del'>-			 void *cookie,</div><div class='del'>-			 xlator_t *this,</div><div class='del'>-			 int32_t op_ret,</div><div class='del'>-			 int32_t op_errno)</div><div class='del'>-{</div><div class='del'>-	STACK_UNWIND (frame,</div><div class='del'>-		      op_ret,</div><div class='del'>-		      op_errno);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-default_removexattr (call_frame_t *frame,</div><div class='del'>-		     xlator_t *this,</div><div class='del'>-		     loc_t *loc,</div><div class='del'>-		     const char *name)</div><div class='del'>-{</div><div class='del'>-	STACK_WIND (frame,</div><div class='del'>-		    default_removexattr_cbk,</div><div class='del'>-		    FIRST_CHILD(this),</div><div class='del'>-		    FIRST_CHILD(this)-&gt;fops-&gt;removexattr,</div><div class='del'>-		    loc,</div><div class='del'>-		    name);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-static int32_t</div><div class='del'>-default_lk_cbk (call_frame_t *frame,</div><div class='del'>-		void *cookie,</div><div class='del'>-		xlator_t *this,</div><div class='del'>-		int32_t op_ret,</div><div class='del'>-		int32_t op_errno,</div><div class='del'>-		struct flock *lock)</div><div class='del'>-{</div><div class='del'>-	STACK_UNWIND (frame,</div><div class='del'>-		      op_ret,</div><div class='del'>-		      op_errno,</div><div class='del'>-		      lock);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-default_lk (call_frame_t *frame,</div><div class='del'>-	    xlator_t *this,</div><div class='del'>-	    fd_t *fd,</div><div class='del'>-	    int32_t cmd,</div><div class='del'>-	    struct flock *lock)</div><div class='del'>-{</div><div class='del'>-	STACK_WIND (frame,</div><div class='del'>-		    default_lk_cbk,</div><div class='del'>-		    FIRST_CHILD(this),</div><div class='del'>-		    FIRST_CHILD(this)-&gt;fops-&gt;lk,</div><div class='del'>-		    fd,</div><div class='del'>-		    cmd,</div><div class='del'>-		    lock);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-static int32_t</div><div class='del'>-default_inodelk_cbk (call_frame_t *frame, void *cookie,</div><div class='del'>-		     xlator_t *this, int32_t op_ret, int32_t op_errno)</div><div class='del'>-</div><div class='del'>-{</div><div class='del'>-	STACK_UNWIND (frame, op_ret, op_errno);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-default_inodelk (call_frame_t *frame, xlator_t *this,</div><div class='del'>-		 const char *volume, loc_t *loc, int32_t cmd, </div><div class='del'>-                 struct flock *lock)</div><div class='del'>-{</div><div class='del'>-	STACK_WIND (frame,</div><div class='del'>-		    default_inodelk_cbk,</div><div class='del'>-		    FIRST_CHILD(this),</div><div class='del'>-		    FIRST_CHILD(this)-&gt;fops-&gt;inodelk,</div><div class='del'>-		    volume, loc, cmd, lock);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-static int32_t</div><div class='del'>-default_finodelk_cbk (call_frame_t *frame, void *cookie,</div><div class='del'>-		      xlator_t *this, int32_t op_ret, int32_t op_errno)</div><div class='del'>-</div><div class='del'>-{</div><div class='del'>-	STACK_UNWIND (frame, op_ret, op_errno);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-default_finodelk (call_frame_t *frame, xlator_t *this,</div><div class='del'>-		  const char *volume, fd_t *fd, int32_t cmd, struct flock *lock)</div><div class='del'>-{</div><div class='del'>-	STACK_WIND (frame,</div><div class='del'>-		    default_finodelk_cbk,</div><div class='del'>-		    FIRST_CHILD(this),</div><div class='del'>-		    FIRST_CHILD(this)-&gt;fops-&gt;finodelk,</div><div class='del'>-		    volume, fd, cmd, lock);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-static int32_t</div><div class='del'>-default_entrylk_cbk (call_frame_t *frame, void *cookie,</div><div class='del'>-		     xlator_t *this, int32_t op_ret, int32_t op_errno)</div><div class='del'>-</div><div class='del'>-{</div><div class='del'>-	STACK_UNWIND (frame, op_ret, op_errno);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-default_entrylk (call_frame_t *frame, xlator_t *this,</div><div class='del'>-		 const char *volume, loc_t *loc, const char *basename,</div><div class='del'>-		 entrylk_cmd cmd, entrylk_type type)</div><div class='del'>-{</div><div class='del'>-	STACK_WIND (frame, default_entrylk_cbk,</div><div class='del'>-		    FIRST_CHILD(this),</div><div class='del'>-		    FIRST_CHILD(this)-&gt;fops-&gt;entrylk,</div><div class='del'>-		    volume, loc, basename, cmd, type);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-static int32_t</div><div class='del'>-default_fentrylk_cbk (call_frame_t *frame, void *cookie,</div><div class='del'>-		      xlator_t *this, int32_t op_ret, int32_t op_errno)</div><div class='del'>-</div><div class='del'>-{</div><div class='del'>-	STACK_UNWIND (frame, op_ret, op_errno);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-default_fentrylk (call_frame_t *frame, xlator_t *this,</div><div class='del'>-		  const char *volume, fd_t *fd, const char *basename,</div><div class='del'>-		  entrylk_cmd cmd, entrylk_type type)</div><div class='del'>-{</div><div class='del'>-	STACK_WIND (frame, default_fentrylk_cbk,</div><div class='del'>-		    FIRST_CHILD(this),</div><div class='del'>-		    FIRST_CHILD(this)-&gt;fops-&gt;fentrylk,</div><div class='del'>-		    volume, fd, basename, cmd, type);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-/* Management operations */</div><div class='del'>-</div><div class='del'>-static int32_t</div><div class='del'>-default_getspec_cbk (call_frame_t *frame,</div><div class='del'>-		     void *cookie,</div><div class='del'>-		     xlator_t *this,</div><div class='del'>-		     int32_t op_ret,</div><div class='del'>-		     int32_t op_errno,</div><div class='del'>-		     char *spec_data)</div><div class='del'>-{</div><div class='del'>-	STACK_UNWIND (frame,</div><div class='del'>-		      op_ret,</div><div class='del'>-		      op_errno,</div><div class='del'>-		      spec_data);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-default_getspec (call_frame_t *frame,</div><div class='del'>-		 xlator_t *this,</div><div class='del'>-		 const char *key,</div><div class='del'>-		 int32_t flags)</div><div class='del'>-{</div><div class='del'>-	STACK_WIND (frame,</div><div class='del'>-		    default_getspec_cbk,</div><div class='del'>-		    FIRST_CHILD(this),</div><div class='del'>-		    FIRST_CHILD(this)-&gt;fops-&gt;getspec,</div><div class='del'>-		    key, flags);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-static int32_t</div><div class='del'>-default_rchecksum_cbk (call_frame_t *frame,</div><div class='del'>-                       void *cookie,</div><div class='del'>-                       xlator_t *this,</div><div class='del'>-                       int32_t op_ret,</div><div class='del'>-                       int32_t op_errno,</div><div class='del'>-                       uint32_t weak_checksum,</div><div class='del'>-                       uint8_t *strong_checksum)</div><div class='del'>-{</div><div class='del'>-	STACK_UNWIND (frame,</div><div class='del'>-		      op_ret,</div><div class='del'>-		      op_errno,</div><div class='del'>-		      weak_checksum,</div><div class='del'>-		      strong_checksum);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-default_rchecksum (call_frame_t *frame,</div><div class='del'>-                   xlator_t *this,</div><div class='del'>-                   fd_t *fd, off_t offset,</div><div class='del'>-                   int32_t len)</div><div class='del'>-{</div><div class='del'>-	STACK_WIND (frame,</div><div class='del'>-		    default_rchecksum_cbk,</div><div class='del'>-		    FIRST_CHILD(this),</div><div class='del'>-		    FIRST_CHILD(this)-&gt;fops-&gt;rchecksum,</div><div class='del'>-		    fd, offset, len);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-default_readdir_cbk (call_frame_t *frame,</div><div class='del'>-		     void *cookie,</div><div class='del'>-		     xlator_t *this,</div><div class='del'>-		     int32_t op_ret,</div><div class='del'>-		     int32_t op_errno,</div><div class='del'>-		     gf_dirent_t *entries)</div><div class='del'>-{</div><div class='del'>-	STACK_UNWIND (frame, op_ret, op_errno, entries);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-default_readdirp_cbk (call_frame_t *frame,</div><div class='del'>-		      void *cookie,</div><div class='del'>-		      xlator_t *this,</div><div class='del'>-		      int32_t op_ret,</div><div class='del'>-		      int32_t op_errno,</div><div class='del'>-		      gf_dirent_t *entries)</div><div class='del'>-{</div><div class='del'>-	STACK_UNWIND (frame, op_ret, op_errno, entries);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-default_readdir (call_frame_t *frame,</div><div class='del'>-		 xlator_t *this,</div><div class='del'>-		 fd_t *fd,</div><div class='del'>-		 size_t size,</div><div class='del'>-		 off_t off)</div><div class='del'>-{</div><div class='del'>-	STACK_WIND (frame,</div><div class='del'>-		    default_readdir_cbk,</div><div class='del'>-		    FIRST_CHILD(this),</div><div class='del'>-		    FIRST_CHILD(this)-&gt;fops-&gt;readdir,</div><div class='del'>-		    fd, size, off);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-default_readdirp (call_frame_t *frame,</div><div class='del'>-		  xlator_t *this,</div><div class='del'>-		  fd_t *fd,</div><div class='del'>-		  size_t size,</div><div class='del'>-		  off_t off)</div><div class='del'>-{</div><div class='del'>-	STACK_WIND (frame,</div><div class='del'>-		    default_readdirp_cbk,</div><div class='del'>-		    FIRST_CHILD(this),</div><div class='del'>-		    FIRST_CHILD(this)-&gt;fops-&gt;readdirp,</div><div class='del'>-		    fd, size, off);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-/* notify */</div><div class='del'>-int</div><div class='del'>-default_notify (xlator_t *this, int32_t event, void *data, ...)</div><div class='del'>-{</div><div class='del'>-	switch (event)</div><div class='del'>-	{</div><div class='del'>-	case GF_EVENT_PARENT_UP:</div><div class='del'>-	{</div><div class='del'>-		xlator_list_t *list = this-&gt;children;</div><div class='del'>-</div><div class='del'>-		while (list) {</div><div class='del'>-			xlator_notify (list-&gt;xlator, event, this);</div><div class='del'>-			list = list-&gt;next;</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='del'>-	break;</div><div class='del'>-	case GF_EVENT_CHILD_CONNECTING:</div><div class='del'>-	case GF_EVENT_CHILD_UP:</div><div class='del'>-	{</div><div class='del'>-		xlator_list_t *parent = this-&gt;parents;</div><div class='del'>-                /* Handle the case of CHILD_UP specially, send it to fuse */</div><div class='del'>-                if (!parent &amp;&amp; this-&gt;ctx &amp;&amp; this-&gt;ctx-&gt;master)</div><div class='del'>-                        xlator_notify (this-&gt;ctx-&gt;master, event, this-&gt;graph, NULL);</div><div class='del'>-</div><div class='del'>-		while (parent) {</div><div class='del'>-                        if (parent-&gt;xlator-&gt;init_succeeded)</div><div class='del'>-                                xlator_notify (parent-&gt;xlator, event,</div><div class='del'>-                                               this, NULL);</div><div class='del'>-			parent = parent-&gt;next;</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='del'>-	break;</div><div class='del'>-	case GF_EVENT_CHILD_DOWN:</div><div class='del'>-	default:</div><div class='del'>-	{</div><div class='del'>-		xlator_list_t *parent = this-&gt;parents;</div><div class='del'>-		while (parent) {</div><div class='del'>-                        if (parent-&gt;xlator-&gt;init_succeeded)</div><div class='del'>-                                xlator_notify (parent-&gt;xlator, event,</div><div class='del'>-                                               this, NULL);</div><div class='del'>-			parent = parent-&gt;next;</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-default_releasedir (xlator_t *this,</div><div class='del'>-		    fd_t *fd)</div><div class='del'>-{</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-default_release (xlator_t *this,</div><div class='del'>-		 fd_t *fd)</div><div class='del'>-{</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-default_setattr_cbk (call_frame_t *frame,</div><div class='del'>-                     void *cookie,</div><div class='del'>-                     xlator_t *this,</div><div class='del'>-                     int32_t op_ret,</div><div class='del'>-                     int32_t op_errno,</div><div class='del'>-                     struct iatt *statpre,</div><div class='del'>-                     struct iatt *statpost)</div><div class='del'>-{</div><div class='del'>-	STACK_UNWIND (frame, op_ret, op_errno, statpre, statpost);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-default_setattr (call_frame_t *frame,</div><div class='del'>-                 xlator_t *this,</div><div class='del'>-                 loc_t *loc,</div><div class='del'>-                 struct iatt *stbuf,</div><div class='del'>-                 int32_t valid)</div><div class='del'>-{</div><div class='del'>-	STACK_WIND (frame,</div><div class='del'>-		    default_setattr_cbk,</div><div class='del'>-		    FIRST_CHILD (this),</div><div class='del'>-		    FIRST_CHILD (this)-&gt;fops-&gt;setattr,</div><div class='del'>-		    loc, stbuf, valid);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-default_fsetattr_cbk (call_frame_t *frame,</div><div class='del'>-                      void *cookie,</div><div class='del'>-                      xlator_t *this,</div><div class='del'>-                      int32_t op_ret,</div><div class='del'>-                      int32_t op_errno,</div><div class='del'>-                      struct iatt *statpre,</div><div class='del'>-                      struct iatt *statpost)</div><div class='del'>-{</div><div class='del'>-	STACK_UNWIND (frame, op_ret, op_errno, statpre, statpost);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-default_fsetattr (call_frame_t *frame,</div><div class='del'>-                  xlator_t *this,</div><div class='del'>-                  fd_t *fd,</div><div class='del'>-                  struct iatt *stbuf,</div><div class='del'>-                  int32_t valid)</div><div class='del'>-{</div><div class='del'>-	STACK_WIND (frame,</div><div class='del'>-		    default_fsetattr_cbk,</div><div class='del'>-		    FIRST_CHILD (this),</div><div class='del'>-		    FIRST_CHILD (this)-&gt;fops-&gt;fsetattr,</div><div class='del'>-		    fd, stbuf, valid);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-default_mem_acct_init (xlator_t *this)</div><div class='del'>-{</div><div class='del'>-        int     ret = -1;</div><div class='del'>-</div><div class='del'>-        ret = xlator_mem_acct_init (this, gf_common_mt_end);</div><div class='del'>-</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='head'>diff --git a/libglusterfs/src/defaults.h b/libglusterfs/src/defaults.h<br/>deleted file mode 100644<br/>index a1177cb6c52..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/libglusterfs/src/defaults.h?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/defaults.h</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,423 +0,0 @@</div><div class='del'>-/*</div><div class='del'>-   Copyright (c) 2006-2009 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='del'>-   This file is part of GlusterFS.</div><div class='del'>-</div><div class='del'>-   GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-   it under the terms of the GNU General Public License as published</div><div class='del'>-   by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-   or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-   GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-   WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-   General Public License for more details.</div><div class='del'>-</div><div class='del'>-   You should have received a copy of the GNU General Public License</div><div class='del'>-   along with this program.  If not, see</div><div class='del'>-   &lt;http://www.gnu.org/licenses/&gt;.</div><div class='del'>-*/</div><div class='del'>-</div><div class='del'>-/* libglusterfs/src/defaults.h:</div><div class='del'>-       This file contains definition of default fops and mops functions.</div><div class='del'>-*/</div><div class='del'>-</div><div class='del'>-#ifndef _DEFAULTS_H</div><div class='del'>-#define _DEFAULTS_H</div><div class='del'>-</div><div class='del'>-#ifndef _CONFIG_H</div><div class='del'>-#define _CONFIG_H</div><div class='del'>-#include "config.h"</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-#include "xlator.h"</div><div class='del'>-</div><div class='del'>-/* Management Operations */</div><div class='del'>-</div><div class='del'>-int32_t default_getspec (call_frame_t *frame,</div><div class='del'>-			 xlator_t *this,</div><div class='del'>-			 const char *key,</div><div class='del'>-			 int32_t flag);</div><div class='del'>-</div><div class='del'>-int32_t default_checksum (call_frame_t *frame,</div><div class='del'>-			  xlator_t *this,</div><div class='del'>-			  loc_t *loc,</div><div class='del'>-			  int32_t flag);</div><div class='del'>-</div><div class='del'>-int32_t default_rchecksum (call_frame_t *frame,</div><div class='del'>-                           xlator_t *this,</div><div class='del'>-                           fd_t *fd, off_t offset,</div><div class='del'>-                           int32_t len);</div><div class='del'>-</div><div class='del'>-/* FileSystem operations */</div><div class='del'>-int32_t default_lookup (call_frame_t *frame,</div><div class='del'>-			xlator_t *this,</div><div class='del'>-			loc_t *loc,</div><div class='del'>-			dict_t *xattr_req);</div><div class='del'>-</div><div class='del'>-int32_t default_stat (call_frame_t *frame,</div><div class='del'>-		      xlator_t *this,</div><div class='del'>-		      loc_t *loc);</div><div class='del'>-</div><div class='del'>-int32_t default_fstat (call_frame_t *frame,</div><div class='del'>-		       xlator_t *this,</div><div class='del'>-		       fd_t *fd);</div><div class='del'>-</div><div class='del'>-int32_t default_truncate (call_frame_t *frame,</div><div class='del'>-			  xlator_t *this,</div><div class='del'>-			  loc_t *loc,</div><div class='del'>-			  off_t offset);</div><div class='del'>-</div><div class='del'>-int32_t default_ftruncate (call_frame_t *frame,</div><div class='del'>-			   xlator_t *this,</div><div class='del'>-			   fd_t *fd,</div><div class='del'>-			   off_t offset);</div><div class='del'>-</div><div class='del'>-int32_t default_access (call_frame_t *frame,</div><div class='del'>-			xlator_t *this,</div><div class='del'>-			loc_t *loc,</div><div class='del'>-			int32_t mask);</div><div class='del'>-</div><div class='del'>-int32_t default_readlink (call_frame_t *frame,</div><div class='del'>-			  xlator_t *this,</div><div class='del'>-			  loc_t *loc,</div><div class='del'>-			  size_t size);</div><div class='del'>-</div><div class='del'>-int32_t default_mknod (call_frame_t *frame, xlator_t *this,</div><div class='del'>-		       loc_t *loc, mode_t mode, dev_t rdev, dict_t *params);</div><div class='del'>-</div><div class='del'>-int32_t default_mkdir (call_frame_t *frame, xlator_t *this,</div><div class='del'>-		       loc_t *loc, mode_t mode, dict_t *params);</div><div class='del'>-</div><div class='del'>-int32_t default_unlink (call_frame_t *frame,</div><div class='del'>-			xlator_t *this,</div><div class='del'>-			loc_t *loc);</div><div class='del'>-</div><div class='del'>-int32_t default_rmdir (call_frame_t *frame,</div><div class='del'>-		       xlator_t *this,</div><div class='del'>-		       loc_t *loc);</div><div class='del'>-</div><div class='del'>-int32_t default_symlink (call_frame_t *frame, xlator_t *this,</div><div class='del'>-			 const char *linkpath, loc_t *loc, dict_t *params);</div><div class='del'>-</div><div class='del'>-int32_t default_rename (call_frame_t *frame,</div><div class='del'>-			xlator_t *this,</div><div class='del'>-			loc_t *oldloc,</div><div class='del'>-			loc_t *newloc);</div><div class='del'>-</div><div class='del'>-int32_t default_link (call_frame_t *frame,</div><div class='del'>-		      xlator_t *this,</div><div class='del'>-		      loc_t *oldloc,</div><div class='del'>-		      loc_t *newloc);</div><div class='del'>-</div><div class='del'>-int32_t default_create (call_frame_t *frame, xlator_t *this,</div><div class='del'>-			loc_t *loc, int32_t flags, mode_t mode,</div><div class='del'>-                        fd_t *fd, dict_t *params);</div><div class='del'>-</div><div class='del'>-int32_t default_open (call_frame_t *frame,</div><div class='del'>-		      xlator_t *this,</div><div class='del'>-		      loc_t *loc,</div><div class='del'>-		      int32_t flags, fd_t *fd,</div><div class='del'>-                      int32_t wbflags);</div><div class='del'>-</div><div class='del'>-int32_t default_readv (call_frame_t *frame,</div><div class='del'>-		       xlator_t *this,</div><div class='del'>-		       fd_t *fd,</div><div class='del'>-		       size_t size,</div><div class='del'>-		       off_t offset);</div><div class='del'>-</div><div class='del'>-int32_t default_writev (call_frame_t *frame,</div><div class='del'>-			xlator_t *this,</div><div class='del'>-			fd_t *fd,</div><div class='del'>-			struct iovec *vector,</div><div class='del'>-			int32_t count,</div><div class='del'>-			off_t offset,</div><div class='del'>-                        struct iobref *iobref);</div><div class='del'>-</div><div class='del'>-int32_t default_flush (call_frame_t *frame,</div><div class='del'>-		       xlator_t *this,</div><div class='del'>-		       fd_t *fd);</div><div class='del'>-</div><div class='del'>-int32_t default_fsync (call_frame_t *frame,</div><div class='del'>-		       xlator_t *this,</div><div class='del'>-		       fd_t *fd,</div><div class='del'>-		       int32_t datasync);</div><div class='del'>-</div><div class='del'>-int32_t default_opendir (call_frame_t *frame,</div><div class='del'>-			 xlator_t *this,</div><div class='del'>-			 loc_t *loc, fd_t *fd);</div><div class='del'>-</div><div class='del'>-int32_t default_fsyncdir (call_frame_t *frame,</div><div class='del'>-			  xlator_t *this,</div><div class='del'>-			  fd_t *fd,</div><div class='del'>-			  int32_t datasync);</div><div class='del'>-</div><div class='del'>-int32_t default_statfs (call_frame_t *frame,</div><div class='del'>-			xlator_t *this,</div><div class='del'>-			loc_t *loc);</div><div class='del'>-</div><div class='del'>-int32_t default_setxattr (call_frame_t *frame,</div><div class='del'>-			  xlator_t *this,</div><div class='del'>-			  loc_t *loc,</div><div class='del'>-			  dict_t *dict,</div><div class='del'>-			  int32_t flags);</div><div class='del'>-</div><div class='del'>-int32_t default_getxattr (call_frame_t *frame,</div><div class='del'>-			  xlator_t *this,</div><div class='del'>-			  loc_t *loc,</div><div class='del'>-			  const char *name);</div><div class='del'>-</div><div class='del'>-int32_t default_fsetxattr (call_frame_t *frame,</div><div class='del'>-                           xlator_t *this,</div><div class='del'>-                           fd_t *fd,</div><div class='del'>-                           dict_t *dict,</div><div class='del'>-                           int32_t flags);</div><div class='del'>-</div><div class='del'>-int32_t default_fgetxattr (call_frame_t *frame,</div><div class='del'>-                           xlator_t *this,</div><div class='del'>-                           fd_t *fd,</div><div class='del'>-                           const char *name);</div><div class='del'>-</div><div class='del'>-int32_t default_removexattr (call_frame_t *frame,</div><div class='del'>-			     xlator_t *this,</div><div class='del'>-			     loc_t *loc,</div><div class='del'>-			     const char *name);</div><div class='del'>-</div><div class='del'>-int32_t default_lk (call_frame_t *frame,</div><div class='del'>-		    xlator_t *this,</div><div class='del'>-		    fd_t *fd,</div><div class='del'>-		    int32_t cmd,</div><div class='del'>-		    struct flock *flock);</div><div class='del'>-</div><div class='del'>-int32_t default_inodelk (call_frame_t *frame, xlator_t *this,</div><div class='del'>-			 const char *volume, loc_t *loc, int32_t cmd, </div><div class='del'>-                         struct flock *flock);</div><div class='del'>-</div><div class='del'>-int32_t default_finodelk (call_frame_t *frame, xlator_t *this,</div><div class='del'>-			  const char *volume, fd_t *fd, int32_t cmd, </div><div class='del'>-                          struct flock *flock);</div><div class='del'>-</div><div class='del'>-int32_t default_entrylk (call_frame_t *frame, xlator_t *this,</div><div class='del'>-			 const char *volume, loc_t *loc, const char *basename,</div><div class='del'>-			 entrylk_cmd cmd, entrylk_type type);</div><div class='del'>-</div><div class='del'>-int32_t default_fentrylk (call_frame_t *frame, xlator_t *this,</div><div class='del'>-			  const char *volume, fd_t *fd, const char *basename,</div><div class='del'>-			  entrylk_cmd cmd, entrylk_type type);</div><div class='del'>-</div><div class='del'>-int32_t default_readdir (call_frame_t *frame,</div><div class='del'>-			  xlator_t *this,</div><div class='del'>-			  fd_t *fd,</div><div class='del'>-			  size_t size, off_t off);</div><div class='del'>-</div><div class='del'>-int32_t default_readdirp (call_frame_t *frame,</div><div class='del'>-			  xlator_t *this,</div><div class='del'>-			  fd_t *fd,</div><div class='del'>-			  size_t size, off_t off);</div><div class='del'>-</div><div class='del'>-int32_t default_xattrop (call_frame_t *frame,</div><div class='del'>-			 xlator_t *this,</div><div class='del'>-			 loc_t *loc,</div><div class='del'>-			 gf_xattrop_flags_t flags,</div><div class='del'>-			 dict_t *dict);</div><div class='del'>-</div><div class='del'>-int32_t default_fxattrop (call_frame_t *frame,</div><div class='del'>-			  xlator_t *this,</div><div class='del'>-			  fd_t *fd,</div><div class='del'>-			  gf_xattrop_flags_t flags,</div><div class='del'>-			  dict_t *dict);</div><div class='del'>-</div><div class='del'>-int32_t default_notify (xlator_t *this,</div><div class='del'>-			int32_t event,</div><div class='del'>-			void *data,</div><div class='del'>-			...);</div><div class='del'>-</div><div class='del'>-int32_t default_forget (xlator_t *this,</div><div class='del'>-			inode_t *inode);</div><div class='del'>-</div><div class='del'>-int32_t default_release (xlator_t *this,</div><div class='del'>-			 fd_t *fd);</div><div class='del'>-</div><div class='del'>-int32_t default_releasedir (xlator_t *this,</div><div class='del'>-			    fd_t *fd);</div><div class='del'>-</div><div class='del'>-int32_t default_setattr (call_frame_t *frame,</div><div class='del'>-                         xlator_t *this,</div><div class='del'>-                         loc_t *loc,</div><div class='del'>-                         struct iatt *stbuf,</div><div class='del'>-                         int32_t valid);</div><div class='del'>-</div><div class='del'>-int32_t default_fsetattr (call_frame_t *frame,</div><div class='del'>-                          xlator_t *this,</div><div class='del'>-                          fd_t *fd,</div><div class='del'>-                          struct iatt *stbuf,</div><div class='del'>-                          int32_t valid);</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-default_truncate_cbk (call_frame_t *frame,</div><div class='del'>-		      void *cookie,</div><div class='del'>-		      xlator_t *this,</div><div class='del'>-		      int32_t op_ret,</div><div class='del'>-		      int32_t op_errno,</div><div class='del'>-		      struct iatt *prebuf,</div><div class='del'>-                      struct iatt *postbuf);</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-default_access_cbk (call_frame_t *frame,</div><div class='del'>-		    void *cookie,</div><div class='del'>-		    xlator_t *this,</div><div class='del'>-		    int32_t op_ret,</div><div class='del'>-		    int32_t op_errno);</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-default_readlink_cbk (call_frame_t *frame,</div><div class='del'>-		      void *cookie,</div><div class='del'>-		      xlator_t *this,</div><div class='del'>-		      int32_t op_ret,</div><div class='del'>-		      int32_t op_errno,</div><div class='del'>-		      const char *path,</div><div class='del'>-                      struct iatt *buf);</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-default_mknod_cbk (call_frame_t *frame,</div><div class='del'>-		   void *cookie,</div><div class='del'>-		   xlator_t *this,</div><div class='del'>-		   int32_t op_ret,</div><div class='del'>-		   int32_t op_errno,</div><div class='del'>-		   inode_t *inode,</div><div class='del'>-                   struct iatt *buf,</div><div class='del'>-                   struct iatt *preparent,</div><div class='del'>-                   struct iatt *postparent);</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-default_mkdir_cbk (call_frame_t *frame,</div><div class='del'>-		   void *cookie,</div><div class='del'>-		   xlator_t *this,</div><div class='del'>-		   int32_t op_ret,</div><div class='del'>-		   int32_t op_errno,</div><div class='del'>-		   inode_t *inode,</div><div class='del'>-                   struct iatt *buf,</div><div class='del'>-                   struct iatt *preparent,</div><div class='del'>-                   struct iatt *postparent);</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-default_unlink_cbk (call_frame_t *frame,</div><div class='del'>-		    void *cookie,</div><div class='del'>-		    xlator_t *this,</div><div class='del'>-		    int32_t op_ret,</div><div class='del'>-		    int32_t op_errno,</div><div class='del'>-                    struct iatt *preparent,</div><div class='del'>-                    struct iatt *postparent);</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-default_rmdir_cbk (call_frame_t *frame,</div><div class='del'>-		   void *cookie,</div><div class='del'>-		   xlator_t *this,</div><div class='del'>-		   int32_t op_ret,</div><div class='del'>-		   int32_t op_errno,</div><div class='del'>-                   struct iatt *preparent,</div><div class='del'>-                   struct iatt *postparent);</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-default_symlink_cbk (call_frame_t *frame,</div><div class='del'>-		     void *cookie,</div><div class='del'>-		     xlator_t *this,</div><div class='del'>-		     int32_t op_ret,</div><div class='del'>-		     int32_t op_errno,</div><div class='del'>-		     inode_t *inode,</div><div class='del'>-                     struct iatt *buf,</div><div class='del'>-                     struct iatt *preparent,</div><div class='del'>-                     struct iatt *postparent);</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-default_rename_cbk (call_frame_t *frame,</div><div class='del'>-		    void *cookie,</div><div class='del'>-		    xlator_t *this,</div><div class='del'>-		    int32_t op_ret,</div><div class='del'>-		    int32_t op_errno,</div><div class='del'>-		    struct iatt *buf,</div><div class='del'>-                    struct iatt *preoldparent,</div><div class='del'>-                    struct iatt *postoldparent,</div><div class='del'>-                    struct iatt *prenewparent,</div><div class='del'>-                    struct iatt *postnewparent);</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-default_link_cbk (call_frame_t *frame,</div><div class='del'>-		  void *cookie,</div><div class='del'>-		  xlator_t *this,</div><div class='del'>-		  int32_t op_ret,</div><div class='del'>-		  int32_t op_errno,</div><div class='del'>-		  inode_t *inode,</div><div class='del'>-                  struct iatt *buf,</div><div class='del'>-                  struct iatt *preparent,</div><div class='del'>-                  struct iatt *postparent);</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-default_create_cbk (call_frame_t *frame,</div><div class='del'>-		    void *cookie,</div><div class='del'>-		    xlator_t *this,</div><div class='del'>-		    int32_t op_ret,</div><div class='del'>-		    int32_t op_errno,</div><div class='del'>-		    fd_t *fd,</div><div class='del'>-		    inode_t *inode,</div><div class='del'>-		    struct iatt *buf,</div><div class='del'>-                    struct iatt *preparent,</div><div class='del'>-                    struct iatt *postparent);</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-default_open_cbk (call_frame_t *frame,</div><div class='del'>-		  void *cookie,</div><div class='del'>-		  xlator_t *this,</div><div class='del'>-		  int32_t op_ret,</div><div class='del'>-		  int32_t op_errno,</div><div class='del'>-		  fd_t *fd);</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-default_readv_cbk (call_frame_t *frame,</div><div class='del'>-		   void *cookie,</div><div class='del'>-		   xlator_t *this,</div><div class='del'>-		   int32_t op_ret,</div><div class='del'>-		   int32_t op_errno,</div><div class='del'>-		   struct iovec *vector,</div><div class='del'>-		   int32_t count,</div><div class='del'>-		   struct iatt *stbuf,</div><div class='del'>-                   struct iobref *iobref);</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-default_opendir_cbk (call_frame_t *frame,</div><div class='del'>-		     void *cookie,</div><div class='del'>-		     xlator_t *this,</div><div class='del'>-		     int32_t op_ret,</div><div class='del'>-		     int32_t op_errno,</div><div class='del'>-		     fd_t *fd);</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-default_setattr_cbk (call_frame_t *frame,</div><div class='del'>-                     void *cookie,</div><div class='del'>-                     xlator_t *this,</div><div class='del'>-                     int32_t op_ret,</div><div class='del'>-                     int32_t op_errno,</div><div class='del'>-                     struct iatt *statpre,</div><div class='del'>-                     struct iatt *statpost);</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-default_fsetattr_cbk (call_frame_t *frame,</div><div class='del'>-                      void *cookie,</div><div class='del'>-                      xlator_t *this,</div><div class='del'>-                      int32_t op_ret,</div><div class='del'>-                      int32_t op_errno,</div><div class='del'>-                      struct iatt *statpre,</div><div class='del'>-                      struct iatt *statpost);</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-default_writev_cbk (call_frame_t *frame,</div><div class='del'>-		    void *cookie,</div><div class='del'>-		    xlator_t *this,</div><div class='del'>-		    int32_t op_ret,</div><div class='del'>-		    int32_t op_errno,</div><div class='del'>-                    struct iatt *prebuf,</div><div class='del'>-		    struct iatt *postbuf);</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-default_mem_acct_init (xlator_t *this);</div><div class='del'>-#endif /* _DEFAULTS_H */</div><div class='head'>diff --git a/libglusterfs/src/dict.c b/libglusterfs/src/dict.c<br/>index f686857eeb4..1d9be9217a6 100644<br/>--- a/<a href='/cgit/glusterfs.git/tree/libglusterfs/src/dict.c?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/dict.c</a><br/>+++ b/<a href='/cgit/glusterfs.git/tree/libglusterfs/src/dict.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>libglusterfs/src/dict.c</a></div><div class='hunk'>@@ -1,20 +1,11 @@</div><div class='ctx'> /*</div><div class='del'>-  Copyright (c) 2006-2009 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='add'>+  Copyright (c) 2008-2012 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='ctx'>   This file is part of GlusterFS.</div><div class='ctx'> </div><div class='del'>-  GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-  it under the terms of the GNU General Public License as published</div><div class='del'>-  by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-  or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-  GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-  WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-  General Public License for more details.</div><div class='del'>-</div><div class='del'>-  You should have received a copy of the GNU General Public License</div><div class='del'>-  along with this program.  If not, see</div><div class='del'>-  &lt;http://www.gnu.org/licenses/&gt;.</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='ctx'> */</div><div class='ctx'> </div><div class='ctx'> #include &lt;unistd.h&gt;</div><div class='hunk'>@@ -22,1255 +13,1475 @@</div><div class='ctx'> #include &lt;stdlib.h&gt;</div><div class='ctx'> #include &lt;stdio.h&gt;</div><div class='ctx'> #include &lt;inttypes.h&gt;</div><div class='add'>+#include &lt;limits.h&gt;</div><div class='add'>+#include &lt;fnmatch.h&gt;</div><div class='add'>+</div><div class='add'>+#include "glusterfs/dict.h"</div><div class='add'>+#define XXH_INLINE_ALL</div><div class='add'>+#include "xxhash.h"</div><div class='add'>+#include "glusterfs/compat.h"</div><div class='add'>+#include "glusterfs/compat-errno.h"</div><div class='add'>+#include "glusterfs/byte-order.h"</div><div class='add'>+#include "glusterfs/statedump.h"</div><div class='add'>+#include "glusterfs/libglusterfs-messages.h"</div><div class='add'>+</div><div class='add'>+struct dict_cmp {</div><div class='add'>+    dict_t *dict;</div><div class='add'>+    gf_boolean_t (*value_ignore)(char *k);</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+#define VALIDATE_DATA_AND_LOG(data, type, key, ret_val)                        \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        if (!data || !data-&gt;data) {                                            \</div><div class='add'>+            gf_msg_callingfn("dict", GF_LOG_DEBUG, EINVAL, LG_MSG_INVALID_ARG, \</div><div class='add'>+                             "data is NULL");                                  \</div><div class='add'>+            return ret_val;                                                    \</div><div class='add'>+        }                                                                      \</div><div class='add'>+        /* Not of the asked type, or old version */                            \</div><div class='add'>+        if ((data-&gt;data_type != type) &amp;&amp;                                       \</div><div class='add'>+            (data-&gt;data_type != GF_DATA_TYPE_STR_OLD)) {                       \</div><div class='add'>+            gf_msg_callingfn("dict", GF_LOG_DEBUG, EINVAL, LG_MSG_INVALID_ARG, \</div><div class='add'>+                             "key %s, %s type asked, has %s type", key,        \</div><div class='add'>+                             data_type_name[type],                             \</div><div class='add'>+                             data_type_name[data-&gt;data_type]);                 \</div><div class='add'>+        }                                                                      \</div><div class='add'>+    } while (0)</div><div class='ctx'> </div><div class='del'>-#ifndef _CONFIG_H</div><div class='del'>-#define _CONFIG_H</div><div class='del'>-#include "config.h"</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-#include "glusterfs.h"</div><div class='del'>-#include "common-utils.h"</div><div class='del'>-#include "dict.h"</div><div class='del'>-#include "hashfn.h"</div><div class='del'>-#include "logging.h"</div><div class='del'>-#include "compat.h"</div><div class='del'>-#include "byte-order.h"</div><div class='del'>-</div><div class='del'>-data_pair_t *</div><div class='del'>-get_new_data_pair ()</div><div class='del'>-{</div><div class='del'>-	data_pair_t *data_pair_ptr = NULL;</div><div class='add'>+static data_t *</div><div class='add'>+get_new_data()</div><div class='add'>+{</div><div class='add'>+    data_t *data = mem_get(THIS-&gt;ctx-&gt;dict_data_pool);</div><div class='add'>+</div><div class='add'>+    if (!data)</div><div class='add'>+        return NULL;</div><div class='add'>+</div><div class='add'>+    GF_ATOMIC_INIT(data-&gt;refcount, 0);</div><div class='add'>+    data-&gt;is_static = _gf_false;</div><div class='add'>+</div><div class='add'>+    return data;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static dict_t *</div><div class='add'>+get_new_dict_full(int size_hint)</div><div class='add'>+{</div><div class='add'>+    dict_t *dict = mem_get0(THIS-&gt;ctx-&gt;dict_pool);</div><div class='add'>+</div><div class='add'>+    if (!dict) {</div><div class='add'>+        return NULL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    dict-&gt;hash_size = size_hint;</div><div class='add'>+    if (size_hint == 1) {</div><div class='add'>+        /*</div><div class='add'>+         * This is the only case we ever see currently.  If we ever</div><div class='add'>+         * need to support resizing the hash table, the resize function</div><div class='add'>+         * will have to take into account the possibility that</div><div class='add'>+         * "members" is not separately allocated (i.e. don't just call</div><div class='add'>+         * realloc() blindly.</div><div class='add'>+         */</div><div class='add'>+        dict-&gt;members = &amp;dict-&gt;members_internal;</div><div class='add'>+    } else {</div><div class='add'>+        /*</div><div class='add'>+         * We actually need to allocate space for size_hint *pointers*</div><div class='add'>+         * but we actually allocate space for one *structure*.  Since</div><div class='add'>+         * a data_pair_t consists of five pointers, we're wasting four</div><div class='add'>+         * pointers' worth for N=1, and will overrun what we allocated</div><div class='add'>+         * for N&gt;5.  If anybody ever starts using size_hint, we'll need</div><div class='add'>+         * to fix this.</div><div class='add'>+         */</div><div class='add'>+        GF_ASSERT(size_hint &lt;= (sizeof(data_pair_t) / sizeof(data_pair_t *)));</div><div class='add'>+        dict-&gt;members = mem_get0(THIS-&gt;ctx-&gt;dict_pair_pool);</div><div class='add'>+        if (!dict-&gt;members) {</div><div class='add'>+            mem_put(dict);</div><div class='add'>+            return NULL;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	data_pair_ptr = (data_pair_t *) GF_CALLOC (1, sizeof (data_pair_t),</div><div class='del'>-                                                   gf_common_mt_data_pair_t);</div><div class='del'>-        if (!data_pair_ptr)</div><div class='del'>-                gf_log ("dict", GF_LOG_ERROR, "memory alloc failed");</div><div class='add'>+    dict-&gt;free_pair.key = NULL;</div><div class='add'>+    dict-&gt;totkvlen = 0;</div><div class='add'>+    LOCK_INIT(&amp;dict-&gt;lock);</div><div class='ctx'> </div><div class='del'>-	return data_pair_ptr;</div><div class='add'>+    return dict;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-data_t *</div><div class='del'>-get_new_data ()</div><div class='add'>+dict_t *</div><div class='add'>+dict_new(void)</div><div class='ctx'> {</div><div class='del'>-	data_t *data = NULL;</div><div class='add'>+    dict_t *dict = get_new_dict_full(1);</div><div class='ctx'> </div><div class='del'>-	data = (data_t *) GF_CALLOC (1, sizeof (data_t), gf_common_mt_data_t);</div><div class='del'>-	if (!data) {</div><div class='del'>-		gf_log ("dict", GF_LOG_CRITICAL,</div><div class='del'>-			"calloc () returned NULL");</div><div class='del'>-		return NULL;</div><div class='del'>-	}</div><div class='add'>+    if (dict)</div><div class='add'>+        dict_ref(dict);</div><div class='ctx'> </div><div class='del'>-	LOCK_INIT (&amp;data-&gt;lock);</div><div class='del'>-	return data;</div><div class='add'>+    return dict;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-dict_t *</div><div class='del'>-get_new_dict_full (int size_hint)</div><div class='add'>+int32_t</div><div class='add'>+is_data_equal(data_t *one, data_t *two)</div><div class='ctx'> {</div><div class='del'>-	dict_t *dict = GF_CALLOC (1, sizeof (dict_t), gf_common_mt_dict_t);</div><div class='del'>-</div><div class='del'>-	if (!dict) {</div><div class='del'>-		gf_log ("dict", GF_LOG_CRITICAL,</div><div class='del'>-			"calloc () returned NULL");</div><div class='del'>-		return NULL;</div><div class='del'>-	}</div><div class='add'>+    struct iatt *iatt1, *iatt2;</div><div class='add'>+    struct mdata_iatt *mdata_iatt1, *mdata_iatt2;</div><div class='ctx'> </div><div class='del'>-	dict-&gt;hash_size = size_hint;</div><div class='del'>-	dict-&gt;members = GF_CALLOC (size_hint, sizeof (data_pair_t *),</div><div class='del'>-                                   gf_common_mt_data_pair_t);</div><div class='add'>+    if (!one || !two || !one-&gt;data || !two-&gt;data) {</div><div class='add'>+        gf_msg_callingfn("dict", GF_LOG_ERROR, EINVAL, LG_MSG_INVALID_ARG,</div><div class='add'>+                         "input arguments are provided "</div><div class='add'>+                         "with value data_t as NULL");</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	if (!dict-&gt;members) {</div><div class='del'>-		gf_log ("dict", GF_LOG_CRITICAL,</div><div class='del'>-			"calloc () returned NULL");</div><div class='del'>-		return NULL;</div><div class='del'>-	}</div><div class='add'>+    if (one == two)</div><div class='add'>+        return 1;</div><div class='ctx'> </div><div class='del'>-	LOCK_INIT (&amp;dict-&gt;lock);</div><div class='add'>+    if (one-&gt;data == two-&gt;data)</div><div class='add'>+        return 1;</div><div class='ctx'> </div><div class='del'>-	return dict;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-dict_t *</div><div class='del'>-get_new_dict (void)</div><div class='del'>-{</div><div class='del'>-	return get_new_dict_full (1);</div><div class='del'>-}</div><div class='add'>+    if (one-&gt;data_type != two-&gt;data_type) {</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-dict_t *</div><div class='del'>-dict_new (void)</div><div class='del'>-{</div><div class='del'>-	dict_t *dict = NULL;</div><div class='del'>-	</div><div class='del'>-	dict = get_new_dict_full(1);</div><div class='del'>-	</div><div class='del'>-	if (dict)</div><div class='del'>-		dict_ref (dict);</div><div class='del'>-	</div><div class='del'>-	return dict;</div><div class='del'>-}</div><div class='add'>+    if (one-&gt;data_type == GF_DATA_TYPE_IATT) {</div><div class='add'>+        if ((one-&gt;len &lt; sizeof(struct iatt)) ||</div><div class='add'>+            (two-&gt;len &lt; sizeof(struct iatt))) {</div><div class='add'>+            return 0;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='add'>+        iatt1 = (struct iatt *)one-&gt;data;</div><div class='add'>+        iatt2 = (struct iatt *)two-&gt;data;</div><div class='ctx'> </div><div class='del'>-int32_t </div><div class='del'>-is_data_equal (data_t *one,</div><div class='del'>-	       data_t *two)</div><div class='del'>-{</div><div class='del'>-	if (!one || !two || !one-&gt;data || !two-&gt;data)</div><div class='del'>-		return 1;</div><div class='add'>+        /* Two iatt structs are considered equal if main fields are</div><div class='add'>+         * equal, even if times differ.</div><div class='add'>+         * TODO: maybe when ctime if fully operational we could</div><div class='add'>+         *       enforce time matching. */</div><div class='add'>+        if (iatt1-&gt;ia_ino != iatt2-&gt;ia_ino) {</div><div class='add'>+            return 0;</div><div class='add'>+        }</div><div class='add'>+        if (iatt1-&gt;ia_type != iatt2-&gt;ia_type) {</div><div class='add'>+            return 0;</div><div class='add'>+        }</div><div class='add'>+        if ((iatt1-&gt;ia_type == IA_IFBLK) || (iatt1-&gt;ia_type == IA_IFCHR)) {</div><div class='add'>+            if (iatt1-&gt;ia_rdev != iatt2-&gt;ia_rdev) {</div><div class='add'>+                return 0;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+        if (gf_uuid_compare(iatt1-&gt;ia_gfid, iatt2-&gt;ia_gfid) != 0) {</div><div class='add'>+            return 0;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-	if (one == two)</div><div class='del'>-		return 1;</div><div class='add'>+        /* TODO: ia_uid, ia_gid, ia_prot and ia_size can be changed</div><div class='add'>+         *       with some commands. Here we don't have enough</div><div class='add'>+         *       information to decide if they should match or not. */</div><div class='add'>+        /*</div><div class='add'>+                        if ((iatt1-&gt;ia_uid != iatt2-&gt;ia_uid) ||</div><div class='add'>+                            (iatt1-&gt;ia_gid != iatt2-&gt;ia_gid) ||</div><div class='add'>+                            (st_mode_from_ia(iatt1-&gt;ia_prot, iatt1-&gt;ia_type) !=</div><div class='add'>+                                    st_mode_from_ia(iatt2-&gt;ia_prot,</div><div class='add'>+           iatt2-&gt;ia_type))) { return 0;</div><div class='add'>+                        }</div><div class='add'>+                        if (iatt1-&gt;ia_type == IA_IFREG) {</div><div class='add'>+                                if (iatt1-&gt;ia_size != iatt2-&gt;ia_size) {</div><div class='add'>+                                        return 0;</div><div class='add'>+                                }</div><div class='add'>+                        }</div><div class='add'>+        */</div><div class='add'>+        return 1;</div><div class='add'>+    }</div><div class='add'>+    if (one-&gt;data_type == GF_DATA_TYPE_MDATA) {</div><div class='add'>+        if ((one-&gt;len &lt; sizeof(struct mdata_iatt)) ||</div><div class='add'>+            (two-&gt;len &lt; sizeof(struct mdata_iatt))) {</div><div class='add'>+            return 0;</div><div class='add'>+        }</div><div class='add'>+        mdata_iatt1 = (struct mdata_iatt *)one-&gt;data;</div><div class='add'>+        mdata_iatt2 = (struct mdata_iatt *)two-&gt;data;</div><div class='add'>+</div><div class='add'>+        if (mdata_iatt1-&gt;ia_atime != mdata_iatt2-&gt;ia_atime ||</div><div class='add'>+            mdata_iatt1-&gt;ia_mtime != mdata_iatt2-&gt;ia_mtime ||</div><div class='add'>+            mdata_iatt1-&gt;ia_ctime != mdata_iatt2-&gt;ia_ctime ||</div><div class='add'>+            mdata_iatt1-&gt;ia_atime_nsec != mdata_iatt2-&gt;ia_atime_nsec ||</div><div class='add'>+            mdata_iatt1-&gt;ia_mtime_nsec != mdata_iatt2-&gt;ia_mtime_nsec ||</div><div class='add'>+            mdata_iatt1-&gt;ia_ctime_nsec != mdata_iatt2-&gt;ia_ctime_nsec) {</div><div class='add'>+            return 0;</div><div class='add'>+        }</div><div class='add'>+        return 1;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	if (one-&gt;len != two-&gt;len)</div><div class='del'>-		return 0;</div><div class='add'>+    if (one-&gt;len != two-&gt;len)</div><div class='add'>+        return 0;</div><div class='ctx'> </div><div class='del'>-	if (one-&gt;data == two-&gt;data)</div><div class='del'>-		return 1;</div><div class='add'>+    if (memcmp(one-&gt;data, two-&gt;data, one-&gt;len) == 0)</div><div class='add'>+        return 1;</div><div class='ctx'> </div><div class='del'>-	if (memcmp (one-&gt;data, two-&gt;data, one-&gt;len) == 0)</div><div class='del'>-		return 1;</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	return 0;</div><div class='add'>+static int</div><div class='add'>+key_value_cmp(dict_t *one, char *key1, data_t *value1, void *data)</div><div class='add'>+{</div><div class='add'>+    struct dict_cmp *cmp = data;</div><div class='add'>+    dict_t *two = cmp-&gt;dict;</div><div class='add'>+    data_t *value2 = dict_get(two, key1);</div><div class='add'>+</div><div class='add'>+    if (value2) {</div><div class='add'>+        if (cmp-&gt;value_ignore &amp;&amp; cmp-&gt;value_ignore(key1))</div><div class='add'>+            return 0;</div><div class='add'>+</div><div class='add'>+        if (is_data_equal(value1, value2) == 1)</div><div class='add'>+            return 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (value2 == NULL) {</div><div class='add'>+        gf_msg_debug(THIS-&gt;name, 0, "'%s' found only on one dict", key1);</div><div class='add'>+    } else {</div><div class='add'>+        gf_msg_debug(THIS-&gt;name, 0,</div><div class='add'>+                     "'%s' is different in two dicts "</div><div class='add'>+                     "(%u, %u)",</div><div class='add'>+                     key1, value1-&gt;len, value2-&gt;len);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return -1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* If both dicts are NULL then equal. If one of the dicts is NULL but the</div><div class='add'>+ * other has only ignorable keys then also they are equal. If both dicts are</div><div class='add'>+ * non-null then check if for each non-ignorable key, values are same or</div><div class='add'>+ * not.  value_ignore function is used to skip comparing values for the keys</div><div class='add'>+ * which must be present in both the dictionaries but the value could be</div><div class='add'>+ * different.</div><div class='add'>+ */</div><div class='add'>+gf_boolean_t</div><div class='add'>+are_dicts_equal(dict_t *one, dict_t *two,</div><div class='add'>+                gf_boolean_t (*match)(dict_t *d, char *k, data_t *v,</div><div class='add'>+                                      void *data),</div><div class='add'>+                gf_boolean_t (*value_ignore)(char *k))</div><div class='add'>+{</div><div class='add'>+    int num_matches1 = 0;</div><div class='add'>+    int num_matches2 = 0;</div><div class='add'>+    struct dict_cmp cmp = {0};</div><div class='add'>+</div><div class='add'>+    if (one == two)</div><div class='add'>+        return _gf_true;</div><div class='add'>+</div><div class='add'>+    if (!match)</div><div class='add'>+        match = dict_match_everything;</div><div class='add'>+</div><div class='add'>+    if ((one == NULL) || (two == NULL)) {</div><div class='add'>+        num_matches1 = dict_foreach_match(one ? one : two, match, NULL,</div><div class='add'>+                                          dict_null_foreach_fn, NULL);</div><div class='add'>+        goto done;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    cmp.dict = two;</div><div class='add'>+    cmp.value_ignore = value_ignore;</div><div class='add'>+    num_matches1 = dict_foreach_match(one, match, NULL, key_value_cmp, &amp;cmp);</div><div class='add'>+</div><div class='add'>+    if (num_matches1 == -1)</div><div class='add'>+        return _gf_false;</div><div class='add'>+</div><div class='add'>+    if ((num_matches1 == one-&gt;count) &amp;&amp; (one-&gt;count == two-&gt;count))</div><div class='add'>+        return _gf_true;</div><div class='add'>+</div><div class='add'>+    num_matches2 = dict_foreach_match(two, match, NULL, dict_null_foreach_fn,</div><div class='add'>+                                      NULL);</div><div class='add'>+done:</div><div class='add'>+    /* If the number of matches is same in 'two' then for all the</div><div class='add'>+     * valid-keys that exist in 'one' the value matched and no extra valid</div><div class='add'>+     * keys exist in 'two' alone. Otherwise there exists at least one extra</div><div class='add'>+     * valid-key in 'two' which doesn't exist in 'one' */</div><div class='add'>+    if (num_matches1 == num_matches2)</div><div class='add'>+        return _gf_true;</div><div class='add'>+    return _gf_false;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> void</div><div class='del'>-data_destroy (data_t *data)</div><div class='add'>+data_destroy(data_t *data)</div><div class='ctx'> {</div><div class='del'>-	if (data) {</div><div class='del'>-		LOCK_DESTROY (&amp;data-&gt;lock);</div><div class='del'>-</div><div class='del'>-		if (!data-&gt;is_static) {</div><div class='del'>-			if (data-&gt;data)</div><div class='del'>-				GF_FREE (data-&gt;data);</div><div class='del'>-			if (data-&gt;vec)</div><div class='del'>-				GF_FREE (data-&gt;vec);</div><div class='del'>-		}</div><div class='add'>+    if (data) {</div><div class='add'>+        if (!data-&gt;is_static)</div><div class='add'>+            GF_FREE(data-&gt;data);</div><div class='ctx'> </div><div class='del'>-		data-&gt;len = 0xbabababa;</div><div class='del'>-		if (!data-&gt;is_const)</div><div class='del'>-			GF_FREE (data);</div><div class='del'>-	}</div><div class='add'>+        data-&gt;len = 0xbabababa;</div><div class='add'>+        mem_put(data);</div><div class='add'>+    }</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> data_t *</div><div class='del'>-data_copy (data_t *old)</div><div class='del'>-{</div><div class='del'>-	if (!old) {</div><div class='del'>-		gf_log ("dict", GF_LOG_CRITICAL,</div><div class='del'>-			"@old is NULL");</div><div class='del'>-		return NULL;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	data_t *newdata = (data_t *) GF_CALLOC (1, sizeof (*newdata),</div><div class='del'>-                                                gf_common_mt_data_t);</div><div class='del'>-</div><div class='del'>-	if (!newdata) {</div><div class='del'>-		gf_log ("dict", GF_LOG_CRITICAL,</div><div class='del'>-			"@newdata - NULL returned by CALLOC");</div><div class='del'>-		return NULL;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	if (old) {</div><div class='del'>-		newdata-&gt;len = old-&gt;len;</div><div class='del'>-		if (old-&gt;data) {</div><div class='del'>-			newdata-&gt;data = memdup (old-&gt;data, old-&gt;len);</div><div class='del'>-			if (!newdata-&gt;data)</div><div class='del'>-				goto err_out;</div><div class='del'>-		}</div><div class='del'>-		if (old-&gt;vec) {</div><div class='del'>-			newdata-&gt;vec = memdup (old-&gt;vec, old-&gt;len * (sizeof (void *) +</div><div class='del'>-								     sizeof (size_t)));</div><div class='del'>-			if (!newdata-&gt;vec)</div><div class='del'>-				goto err_out;</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	return newdata;</div><div class='del'>-</div><div class='del'>- err_out:</div><div class='del'>-</div><div class='del'>-	if (newdata-&gt;data)</div><div class='del'>-		FREE (newdata-&gt;data);</div><div class='del'>-	if (newdata-&gt;vec)</div><div class='del'>-		FREE (newdata-&gt;vec);</div><div class='del'>-	FREE (newdata);</div><div class='del'>-</div><div class='del'>-	gf_log ("dict", GF_LOG_CRITICAL,</div><div class='del'>-		"@newdata-&gt;data || @newdata-&gt;vec got NULL from CALLOC()");</div><div class='del'>-	return NULL;</div><div class='add'>+data_copy(data_t *old)</div><div class='add'>+{</div><div class='add'>+    if (!old) {</div><div class='add'>+        gf_msg_callingfn("dict", GF_LOG_WARNING, 0, LG_MSG_NULL_PTR,</div><div class='add'>+                         "old is NULL");</div><div class='add'>+        return NULL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    data_t *newdata = mem_get0(THIS-&gt;ctx-&gt;dict_data_pool);</div><div class='add'>+    if (!newdata) {</div><div class='add'>+        return NULL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    newdata-&gt;len = old-&gt;len;</div><div class='add'>+    if (old-&gt;data) {</div><div class='add'>+        newdata-&gt;data = gf_memdup(old-&gt;data, old-&gt;len);</div><div class='add'>+        if (!newdata-&gt;data)</div><div class='add'>+            goto err_out;</div><div class='add'>+    }</div><div class='add'>+    newdata-&gt;data_type = old-&gt;data_type;</div><div class='add'>+</div><div class='add'>+    return newdata;</div><div class='add'>+</div><div class='add'>+err_out:</div><div class='add'>+    mem_put(newdata);</div><div class='add'>+</div><div class='add'>+    return NULL;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+/* Always need to be called under lock</div><div class='add'>+ * Always this and key variables are not null -</div><div class='add'>+ * checked by callers.</div><div class='add'>+ */</div><div class='ctx'> static data_pair_t *</div><div class='del'>-_dict_lookup (dict_t *this, char *key)</div><div class='add'>+dict_lookup_common(const dict_t *this, const char *key, const uint32_t hash)</div><div class='ctx'> {</div><div class='del'>-	if (!this || !key) {</div><div class='del'>-		gf_log ("dict", GF_LOG_CRITICAL,</div><div class='del'>-			"@this=%p @key=%p", this, key);</div><div class='del'>-		return NULL;</div><div class='del'>-	}</div><div class='add'>+    int hashval = 0;</div><div class='add'>+    data_pair_t *pair;</div><div class='ctx'> </div><div class='del'>-	int hashval = SuperFastHash (key, strlen (key)) % this-&gt;hash_size;</div><div class='del'>-	data_pair_t *pair;</div><div class='del'>-   </div><div class='del'>-	for (pair = this-&gt;members[hashval]; pair != NULL; pair = pair-&gt;hash_next) {</div><div class='del'>-		if (pair-&gt;key &amp;&amp; !strcmp (pair-&gt;key, key))</div><div class='del'>-			return pair;</div><div class='del'>-	}</div><div class='del'>-  </div><div class='del'>-	return NULL;</div><div class='del'>-}</div><div class='add'>+    /* If the divisor is 1, the modulo is always 0,</div><div class='add'>+     * in such case avoid hash calculation.</div><div class='add'>+     */</div><div class='add'>+    if (this-&gt;hash_size != 1)</div><div class='add'>+        hashval = hash % this-&gt;hash_size;</div><div class='ctx'> </div><div class='add'>+    for (pair = this-&gt;members[hashval]; pair != NULL; pair = pair-&gt;hash_next) {</div><div class='add'>+        if (pair-&gt;key &amp;&amp; (hash == pair-&gt;key_hash) &amp;&amp; !strcmp(pair-&gt;key, key))</div><div class='add'>+            return pair;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-static int32_t</div><div class='del'>-_dict_set (dict_t *this, </div><div class='del'>-	   char *key, </div><div class='del'>-	   data_t *value)</div><div class='del'>-{</div><div class='del'>-	int hashval;</div><div class='del'>-	data_pair_t *pair;</div><div class='del'>-	char key_free = 0;</div><div class='del'>-	int tmp = 0;</div><div class='del'>-        int ret = 0;</div><div class='del'>-</div><div class='del'>-	if (!key) {</div><div class='del'>-		ret = gf_asprintf (&amp;key, "ref:%p", value);</div><div class='del'>-                if (-1 == ret) {</div><div class='del'>-                        gf_log ("dict", GF_LOG_ERROR, "asprintf failed");</div><div class='del'>-                        return -1;</div><div class='del'>-                }</div><div class='del'>-		key_free = 1;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	tmp = SuperFastHash (key, strlen (key));</div><div class='del'>-	hashval = (tmp % this-&gt;hash_size);</div><div class='del'>-	pair = _dict_lookup (this, key);</div><div class='del'>-</div><div class='del'>-	if (pair) {</div><div class='del'>-		data_t *unref_data = pair-&gt;value;</div><div class='del'>-		pair-&gt;value = data_ref (value);</div><div class='del'>-		data_unref (unref_data);</div><div class='del'>-		if (key_free)</div><div class='del'>-			GF_FREE (key);</div><div class='del'>-		/* Indicates duplicate key */</div><div class='del'>-		return 0;</div><div class='del'>-	}</div><div class='del'>-	pair = (data_pair_t *) GF_CALLOC (1, sizeof (*pair),</div><div class='del'>-                                        gf_common_mt_data_pair_t);</div><div class='del'>-	if (!pair) {</div><div class='del'>-		gf_log ("dict", GF_LOG_CRITICAL,</div><div class='del'>-			"@pair - NULL returned by CALLOC");</div><div class='del'>-		return -1;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	pair-&gt;key = (char *) GF_CALLOC (1, strlen (key) + 1,</div><div class='del'>-                                        gf_common_mt_char);</div><div class='del'>-	if (!pair-&gt;key) {</div><div class='del'>-		gf_log ("dict", GF_LOG_CRITICAL,</div><div class='del'>-			"@pair-&gt;key - NULL returned by CALLOC");</div><div class='del'>-		FREE (pair);</div><div class='del'>-</div><div class='del'>-                if (key_free)</div><div class='del'>-                        GF_FREE (key);</div><div class='del'>-		return -1;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	strcpy (pair-&gt;key, key);</div><div class='del'>-	pair-&gt;value = data_ref (value);</div><div class='del'>- </div><div class='del'>-	pair-&gt;hash_next = this-&gt;members[hashval];</div><div class='del'>-	this-&gt;members[hashval] = pair;</div><div class='del'>- </div><div class='del'>-	pair-&gt;next = this-&gt;members_list;</div><div class='del'>-	pair-&gt;prev = NULL;</div><div class='del'>-	if (this-&gt;members_list)</div><div class='del'>-		this-&gt;members_list-&gt;prev = pair;</div><div class='del'>-	this-&gt;members_list = pair;</div><div class='del'>-	this-&gt;count++;</div><div class='del'>-  </div><div class='del'>-	if (key_free)</div><div class='del'>-		GF_FREE (key);</div><div class='del'>-	return 0;</div><div class='add'>+    return NULL;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> int32_t</div><div class='del'>-dict_set (dict_t *this,</div><div class='del'>-	  char *key,</div><div class='del'>-	  data_t *value)</div><div class='add'>+dict_lookup(dict_t *this, char *key, data_t **data)</div><div class='ctx'> {</div><div class='del'>-	int32_t ret;</div><div class='add'>+    if (!this || !key || !data) {</div><div class='add'>+        gf_msg_callingfn("dict", GF_LOG_WARNING, EINVAL, LG_MSG_INVALID_ARG,</div><div class='add'>+                         "!this || !key || "</div><div class='add'>+                         "!data");</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	if (!this || !value) {</div><div class='del'>-		gf_log ("dict", GF_LOG_CRITICAL,</div><div class='del'>-			"@this=%p @value=%p", this, value);</div><div class='del'>-		return -1;</div><div class='del'>-	}</div><div class='add'>+    data_pair_t *tmp = NULL;</div><div class='ctx'> </div><div class='del'>-	LOCK (&amp;this-&gt;lock);</div><div class='add'>+    uint32_t hash = (uint32_t)XXH64(key, strlen(key), 0);</div><div class='ctx'> </div><div class='del'>-	ret = _dict_set (this, key, value);</div><div class='add'>+    LOCK(&amp;this-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        tmp = dict_lookup_common(this, key, hash);</div><div class='add'>+    }</div><div class='add'>+    UNLOCK(&amp;this-&gt;lock);</div><div class='ctx'> </div><div class='del'>-	UNLOCK (&amp;this-&gt;lock);</div><div class='add'>+    if (!tmp)</div><div class='add'>+        return -1;</div><div class='add'>+</div><div class='add'>+    *data = tmp-&gt;value;</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	return ret;</div><div class='add'>+static int32_t</div><div class='add'>+dict_set_lk(dict_t *this, char *key, const int key_len, data_t *value,</div><div class='add'>+            const uint32_t hash, gf_boolean_t replace)</div><div class='add'>+{</div><div class='add'>+    int hashval = 0;</div><div class='add'>+    data_pair_t *pair;</div><div class='add'>+    int key_free = 0;</div><div class='add'>+    uint32_t key_hash;</div><div class='add'>+    int keylen;</div><div class='add'>+</div><div class='add'>+    if (!key) {</div><div class='add'>+        keylen = gf_asprintf(&amp;key, "ref:%p", value);</div><div class='add'>+        if (-1 == keylen) {</div><div class='add'>+            return -1;</div><div class='add'>+        }</div><div class='add'>+        key_free = 1;</div><div class='add'>+        key_hash = (uint32_t)XXH64(key, keylen, 0);</div><div class='add'>+    } else {</div><div class='add'>+        keylen = key_len;</div><div class='add'>+        key_hash = hash;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Search for a existing key if 'replace' is asked for */</div><div class='add'>+    if (replace) {</div><div class='add'>+        pair = dict_lookup_common(this, key, key_hash);</div><div class='add'>+        if (pair) {</div><div class='add'>+            data_t *unref_data = pair-&gt;value;</div><div class='add'>+            pair-&gt;value = data_ref(value);</div><div class='add'>+            this-&gt;totkvlen += (value-&gt;len - unref_data-&gt;len);</div><div class='add'>+            data_unref(unref_data);</div><div class='add'>+            if (key_free)</div><div class='add'>+                GF_FREE(key);</div><div class='add'>+            /* Indicates duplicate key */</div><div class='add'>+            return 0;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (this-&gt;free_pair.key) { /* the free_pair is used */</div><div class='add'>+        pair = mem_get(THIS-&gt;ctx-&gt;dict_pair_pool);</div><div class='add'>+        if (!pair) {</div><div class='add'>+            if (key_free)</div><div class='add'>+                GF_FREE(key);</div><div class='add'>+            return -1;</div><div class='add'>+        }</div><div class='add'>+    } else { /* assign the pair to the free pair */</div><div class='add'>+        pair = &amp;this-&gt;free_pair;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (key_free) {</div><div class='add'>+        /* It's ours.  Use it. */</div><div class='add'>+        pair-&gt;key = key;</div><div class='add'>+        key_free = 0;</div><div class='add'>+    } else {</div><div class='add'>+        pair-&gt;key = (char *)GF_MALLOC(keylen + 1, gf_common_mt_char);</div><div class='add'>+        if (!pair-&gt;key) {</div><div class='add'>+            if (pair != &amp;this-&gt;free_pair) {</div><div class='add'>+                mem_put(pair);</div><div class='add'>+            }</div><div class='add'>+            return -1;</div><div class='add'>+        }</div><div class='add'>+        strcpy(pair-&gt;key, key);</div><div class='add'>+    }</div><div class='add'>+    pair-&gt;key_hash = key_hash;</div><div class='add'>+    pair-&gt;value = data_ref(value);</div><div class='add'>+    this-&gt;totkvlen += (keylen + 1 + value-&gt;len);</div><div class='add'>+</div><div class='add'>+    /* If the divisor is 1, the modulo is always 0,</div><div class='add'>+     * in such case avoid hash calculation.</div><div class='add'>+     */</div><div class='add'>+    if (this-&gt;hash_size != 1) {</div><div class='add'>+        hashval = (key_hash % this-&gt;hash_size);</div><div class='add'>+    }</div><div class='add'>+    pair-&gt;hash_next = this-&gt;members[hashval];</div><div class='add'>+    this-&gt;members[hashval] = pair;</div><div class='add'>+</div><div class='add'>+    pair-&gt;next = this-&gt;members_list;</div><div class='add'>+    pair-&gt;prev = NULL;</div><div class='add'>+    if (this-&gt;members_list)</div><div class='add'>+        this-&gt;members_list-&gt;prev = pair;</div><div class='add'>+    this-&gt;members_list = pair;</div><div class='add'>+    this-&gt;count++;</div><div class='add'>+</div><div class='add'>+    if (key_free)</div><div class='add'>+        GF_FREE(key);</div><div class='add'>+</div><div class='add'>+    if (this-&gt;max_count &lt; this-&gt;count)</div><div class='add'>+        this-&gt;max_count = this-&gt;count;</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+int32_t</div><div class='add'>+dict_set(dict_t *this, char *key, data_t *value)</div><div class='add'>+{</div><div class='add'>+    if (key)</div><div class='add'>+        return dict_setn(this, key, strlen(key), value);</div><div class='add'>+    else</div><div class='add'>+        return dict_setn(this, NULL, 0, value);</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-data_t *</div><div class='del'>-dict_get (dict_t *this,</div><div class='del'>-  	  char *key)</div><div class='add'>+int32_t</div><div class='add'>+dict_setn(dict_t *this, char *key, const int keylen, data_t *value)</div><div class='ctx'> {</div><div class='del'>-	data_pair_t *pair;</div><div class='add'>+    int32_t ret;</div><div class='add'>+    uint32_t key_hash = 0;</div><div class='ctx'> </div><div class='del'>-	if (!this || !key) {</div><div class='del'>-		gf_log ("dict", GF_LOG_TRACE,</div><div class='del'>-			"@this=%p key=%s", this, (key) ? key : "()");</div><div class='del'>-		return NULL;</div><div class='del'>-	}</div><div class='add'>+    if (!this || !value) {</div><div class='add'>+        gf_msg_callingfn("dict", GF_LOG_WARNING, EINVAL, LG_MSG_INVALID_ARG,</div><div class='add'>+                         "!this || !value for "</div><div class='add'>+                         "key=%s",</div><div class='add'>+                         key);</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	LOCK (&amp;this-&gt;lock);</div><div class='add'>+    if (key) {</div><div class='add'>+        key_hash = (uint32_t)XXH64(key, keylen, 0);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	pair = _dict_lookup (this, key);</div><div class='add'>+    LOCK(&amp;this-&gt;lock);</div><div class='ctx'> </div><div class='del'>-	UNLOCK (&amp;this-&gt;lock);</div><div class='add'>+    ret = dict_set_lk(this, key, keylen, value, key_hash, 1);</div><div class='ctx'> </div><div class='del'>-	if (pair)</div><div class='del'>-		return pair-&gt;value;</div><div class='del'>-  </div><div class='del'>-	return NULL;</div><div class='add'>+    UNLOCK(&amp;this-&gt;lock);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-void</div><div class='del'>-dict_del (dict_t *this,</div><div class='del'>-  	  char *key)</div><div class='del'>-{</div><div class='del'>-	if (!this || !key) {</div><div class='del'>-		gf_log ("dict", GF_LOG_DEBUG,</div><div class='del'>-			"@this=%p @key=%p", this, key);</div><div class='del'>-		return;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	LOCK (&amp;this-&gt;lock);</div><div class='del'>-</div><div class='del'>-	int hashval = SuperFastHash (key, strlen (key)) % this-&gt;hash_size;</div><div class='del'>-	data_pair_t *pair = this-&gt;members[hashval];</div><div class='del'>-	data_pair_t *prev = NULL;</div><div class='del'>-  </div><div class='del'>-	while (pair) {</div><div class='del'>-		if (strcmp (pair-&gt;key, key) == 0) {</div><div class='del'>-			if (prev)</div><div class='del'>-				prev-&gt;hash_next = pair-&gt;hash_next;</div><div class='del'>-			else</div><div class='del'>-				this-&gt;members[hashval] = pair-&gt;hash_next;</div><div class='del'>-  </div><div class='del'>-			data_unref (pair-&gt;value);</div><div class='del'>-  </div><div class='del'>-			if (pair-&gt;prev)</div><div class='del'>-				pair-&gt;prev-&gt;next = pair-&gt;next;</div><div class='del'>-			else</div><div class='del'>-				this-&gt;members_list = pair-&gt;next;</div><div class='del'>-</div><div class='del'>-			if (pair-&gt;next)</div><div class='del'>-				pair-&gt;next-&gt;prev = pair-&gt;prev;</div><div class='del'>-  </div><div class='del'>-			GF_FREE (pair-&gt;key);</div><div class='del'>-			GF_FREE (pair);</div><div class='del'>-			this-&gt;count--;</div><div class='del'>-			break;</div><div class='del'>-		}</div><div class='del'>- </div><div class='del'>-		prev = pair;</div><div class='del'>-		pair = pair-&gt;hash_next;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	UNLOCK (&amp;this-&gt;lock);</div><div class='del'>-</div><div class='del'>-	return;</div><div class='add'>+int32_t</div><div class='add'>+dict_add(dict_t *this, char *key, data_t *value)</div><div class='add'>+{</div><div class='add'>+    if (key)</div><div class='add'>+        return dict_addn(this, key, strlen(key), value);</div><div class='add'>+    else</div><div class='add'>+        return dict_addn(this, NULL, 0, value);</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-void</div><div class='del'>-dict_destroy (dict_t *this)</div><div class='add'>+int32_t</div><div class='add'>+dict_addn(dict_t *this, char *key, const int keylen, data_t *value)</div><div class='ctx'> {</div><div class='del'>-	if (!this) {</div><div class='del'>-		gf_log ("dict", GF_LOG_DEBUG,</div><div class='del'>-			"@this=%p", this);</div><div class='del'>-		return;</div><div class='del'>-	}</div><div class='add'>+    int32_t ret;</div><div class='add'>+    uint32_t key_hash = 0;</div><div class='ctx'> </div><div class='del'>-	data_pair_t *pair = this-&gt;members_list;</div><div class='del'>-	data_pair_t *prev = this-&gt;members_list;</div><div class='add'>+    if (!this || !value) {</div><div class='add'>+        gf_msg_callingfn("dict", GF_LOG_WARNING, EINVAL, LG_MSG_INVALID_ARG,</div><div class='add'>+                         "!this || !value for key=%s", key);</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	LOCK_DESTROY (&amp;this-&gt;lock);</div><div class='add'>+    if (key) {</div><div class='add'>+        key_hash = (uint32_t)XXH64(key, keylen, 0);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	while (prev) {</div><div class='del'>-		pair = pair-&gt;next;</div><div class='del'>-		data_unref (prev-&gt;value);</div><div class='del'>-		GF_FREE (prev-&gt;key);</div><div class='del'>-		GF_FREE (prev);</div><div class='del'>-		prev = pair;</div><div class='del'>-	}</div><div class='add'>+    LOCK(&amp;this-&gt;lock);</div><div class='ctx'> </div><div class='del'>-	GF_FREE (this-&gt;members);</div><div class='add'>+    ret = dict_set_lk(this, key, keylen, value, key_hash, 0);</div><div class='ctx'> </div><div class='del'>-	if (this-&gt;extra_free)</div><div class='del'>-		GF_FREE (this-&gt;extra_free);</div><div class='add'>+    UNLOCK(&amp;this-&gt;lock);</div><div class='ctx'> </div><div class='del'>-	if (!this-&gt;is_static)</div><div class='del'>-		GF_FREE (this);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+data_t *</div><div class='add'>+dict_get(dict_t *this, char *key)</div><div class='add'>+{</div><div class='add'>+    if (!this || !key) {</div><div class='add'>+        gf_msg_callingfn("dict", GF_LOG_DEBUG, EINVAL, LG_MSG_INVALID_ARG,</div><div class='add'>+                         "!this || key=%s", (key) ? key : "()");</div><div class='add'>+        return NULL;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	return;</div><div class='add'>+    return dict_getn(this, key, strlen(key));</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-void</div><div class='del'>-dict_unref (dict_t *this)</div><div class='add'>+data_t *</div><div class='add'>+dict_getn(dict_t *this, char *key, const int keylen)</div><div class='ctx'> {</div><div class='del'>-	int32_t ref;</div><div class='add'>+    data_pair_t *pair;</div><div class='add'>+    uint32_t hash;</div><div class='ctx'> </div><div class='del'>-	if (!this) {</div><div class='del'>-		gf_log ("dict", GF_LOG_DEBUG,</div><div class='del'>-			"@this=%p", this);</div><div class='del'>-		return;</div><div class='del'>-	}</div><div class='add'>+    if (!this || !key) {</div><div class='add'>+        gf_msg_callingfn("dict", GF_LOG_DEBUG, EINVAL, LG_MSG_INVALID_ARG,</div><div class='add'>+                         "!this || key=%s", (key) ? key : "()");</div><div class='add'>+        return NULL;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	LOCK (&amp;this-&gt;lock);</div><div class='add'>+    hash = (uint32_t)XXH64(key, keylen, 0);</div><div class='ctx'> </div><div class='del'>-	this-&gt;refcount--;</div><div class='del'>-	ref = this-&gt;refcount;</div><div class='add'>+    LOCK(&amp;this-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        pair = dict_lookup_common(this, key, hash);</div><div class='add'>+    }</div><div class='add'>+    UNLOCK(&amp;this-&gt;lock);</div><div class='ctx'> </div><div class='del'>-	UNLOCK (&amp;this-&gt;lock);</div><div class='add'>+    if (pair)</div><div class='add'>+        return pair-&gt;value;</div><div class='ctx'> </div><div class='del'>-	if (!ref)</div><div class='del'>-		dict_destroy (this);</div><div class='add'>+    return NULL;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-dict_t *</div><div class='del'>-dict_ref (dict_t *this)</div><div class='add'>+int</div><div class='add'>+dict_key_count(dict_t *this)</div><div class='ctx'> {</div><div class='del'>-	if (!this) {</div><div class='del'>-		gf_log ("dict", GF_LOG_DEBUG,</div><div class='del'>-			"@this=%p", this);</div><div class='del'>-		return NULL;</div><div class='del'>-	}</div><div class='add'>+    int ret = -1;</div><div class='ctx'> </div><div class='del'>-	LOCK (&amp;this-&gt;lock);</div><div class='add'>+    if (!this) {</div><div class='add'>+        gf_msg_callingfn("dict", GF_LOG_WARNING, EINVAL, LG_MSG_INVALID_ARG,</div><div class='add'>+                         "dict passed is NULL");</div><div class='add'>+        return ret;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	this-&gt;refcount++;</div><div class='add'>+    LOCK(&amp;this-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        ret = this-&gt;count;</div><div class='add'>+    }</div><div class='add'>+    UNLOCK(&amp;this-&gt;lock);</div><div class='ctx'> </div><div class='del'>-	UNLOCK (&amp;this-&gt;lock);</div><div class='del'>-</div><div class='del'>-	return this;</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> void</div><div class='del'>-data_unref (data_t *this)</div><div class='add'>+dict_del(dict_t *this, char *key)</div><div class='ctx'> {</div><div class='del'>-	int32_t ref;</div><div class='add'>+    if (!this || !key) {</div><div class='add'>+        gf_msg_callingfn("dict", GF_LOG_WARNING, EINVAL, LG_MSG_INVALID_ARG,</div><div class='add'>+                         "!this || key=%s", key);</div><div class='add'>+        return;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	if (!this) {</div><div class='del'>-		gf_log ("dict", GF_LOG_DEBUG,</div><div class='del'>-			"@this=%p", this);</div><div class='del'>-		return;</div><div class='del'>-	}</div><div class='add'>+    return dict_deln(this, key, strlen(key));</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	LOCK (&amp;this-&gt;lock);</div><div class='add'>+void</div><div class='add'>+dict_deln(dict_t *this, char *key, const int keylen)</div><div class='add'>+{</div><div class='add'>+    int hashval = 0;</div><div class='add'>+    uint32_t hash;</div><div class='add'>+</div><div class='add'>+    if (!this || !key) {</div><div class='add'>+        gf_msg_callingfn("dict", GF_LOG_WARNING, EINVAL, LG_MSG_INVALID_ARG,</div><div class='add'>+                         "!this || key=%s", key);</div><div class='add'>+        return;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    hash = (uint32_t)XXH64(key, keylen, 0);</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;this-&gt;lock);</div><div class='add'>+</div><div class='add'>+    /* If the divisor is 1, the modulo is always 0,</div><div class='add'>+     * in such case avoid hash calculation.</div><div class='add'>+     */</div><div class='add'>+    if (this-&gt;hash_size != 1)</div><div class='add'>+        hashval = hash % this-&gt;hash_size;</div><div class='add'>+</div><div class='add'>+    data_pair_t *pair = this-&gt;members[hashval];</div><div class='add'>+    data_pair_t *prev = NULL;</div><div class='add'>+</div><div class='add'>+    while (pair) {</div><div class='add'>+        if ((hash == pair-&gt;key_hash) &amp;&amp; strcmp(pair-&gt;key, key) == 0) {</div><div class='add'>+            if (prev)</div><div class='add'>+                prev-&gt;hash_next = pair-&gt;hash_next;</div><div class='add'>+            else</div><div class='add'>+                this-&gt;members[hashval] = pair-&gt;hash_next;</div><div class='add'>+</div><div class='add'>+            this-&gt;totkvlen -= pair-&gt;value-&gt;len;</div><div class='add'>+            data_unref(pair-&gt;value);</div><div class='add'>+</div><div class='add'>+            if (pair-&gt;prev)</div><div class='add'>+                pair-&gt;prev-&gt;next = pair-&gt;next;</div><div class='add'>+            else</div><div class='add'>+                this-&gt;members_list = pair-&gt;next;</div><div class='add'>+</div><div class='add'>+            if (pair-&gt;next)</div><div class='add'>+                pair-&gt;next-&gt;prev = pair-&gt;prev;</div><div class='add'>+</div><div class='add'>+            this-&gt;totkvlen -= (strlen(pair-&gt;key) + 1);</div><div class='add'>+            GF_FREE(pair-&gt;key);</div><div class='add'>+            if (pair == &amp;this-&gt;free_pair) {</div><div class='add'>+                this-&gt;free_pair.key = NULL;</div><div class='add'>+            } else {</div><div class='add'>+                mem_put(pair);</div><div class='add'>+            }</div><div class='add'>+            this-&gt;count--;</div><div class='add'>+            break;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-	this-&gt;refcount--;</div><div class='del'>-	ref = this-&gt;refcount;</div><div class='add'>+        prev = pair;</div><div class='add'>+        pair = pair-&gt;hash_next;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	UNLOCK (&amp;this-&gt;lock);</div><div class='add'>+    UNLOCK(&amp;this-&gt;lock);</div><div class='ctx'> </div><div class='del'>-	if (!ref)</div><div class='del'>-		data_destroy (this);</div><div class='add'>+    return;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-data_t *</div><div class='del'>-data_ref (data_t *this)</div><div class='del'>-{</div><div class='del'>-	if (!this) {</div><div class='del'>-		gf_log ("dict", GF_LOG_DEBUG,</div><div class='del'>-			"@this=%p", this);</div><div class='del'>-		return NULL;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	LOCK (&amp;this-&gt;lock);</div><div class='del'>-</div><div class='del'>-	this-&gt;refcount++;</div><div class='del'>-</div><div class='del'>-	UNLOCK (&amp;this-&gt;lock);</div><div class='add'>+void</div><div class='add'>+dict_destroy(dict_t *this)</div><div class='add'>+{</div><div class='add'>+    if (!this) {</div><div class='add'>+        gf_msg_callingfn("dict", GF_LOG_WARNING, EINVAL, LG_MSG_INVALID_ARG,</div><div class='add'>+                         "dict is NULL");</div><div class='add'>+        return;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    data_pair_t *pair = this-&gt;members_list;</div><div class='add'>+    data_pair_t *prev = this-&gt;members_list;</div><div class='add'>+    glusterfs_ctx_t *ctx = NULL;</div><div class='add'>+    uint64_t current_max = 0;</div><div class='add'>+    uint32_t total_pairs = 0;</div><div class='add'>+</div><div class='add'>+    LOCK_DESTROY(&amp;this-&gt;lock);</div><div class='add'>+</div><div class='add'>+    while (prev) {</div><div class='add'>+        pair = pair-&gt;next;</div><div class='add'>+        data_unref(prev-&gt;value);</div><div class='add'>+        GF_FREE(prev-&gt;key);</div><div class='add'>+        if (prev != &amp;this-&gt;free_pair) {</div><div class='add'>+            mem_put(prev);</div><div class='add'>+        } else {</div><div class='add'>+            this-&gt;free_pair.key = NULL;</div><div class='add'>+        }</div><div class='add'>+        total_pairs++;</div><div class='add'>+        prev = pair;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	return this;</div><div class='del'>-}</div><div class='add'>+    this-&gt;totkvlen = 0;</div><div class='add'>+    if (this-&gt;members != &amp;this-&gt;members_internal) {</div><div class='add'>+        mem_put(this-&gt;members);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-/*</div><div class='del'>-  Serialization format:</div><div class='del'>-  ----</div><div class='del'>-  Count:8</div><div class='del'>-  Key_len:8:Value_len:8</div><div class='del'>-  Key</div><div class='del'>-  Value</div><div class='del'>-  .</div><div class='del'>-  .</div><div class='del'>-  .</div><div class='del'>-*/</div><div class='add'>+    free(this-&gt;extra_stdfree);</div><div class='ctx'> </div><div class='del'>-int32_t </div><div class='del'>-dict_serialized_length_old (dict_t *this)</div><div class='del'>-{</div><div class='add'>+    /* update 'ctx-&gt;stats.dict.details' using max_count */</div><div class='add'>+    ctx = THIS-&gt;ctx;</div><div class='ctx'> </div><div class='del'>-	if (!this) {</div><div class='del'>-		gf_log ("dict", GF_LOG_DEBUG,</div><div class='del'>-			"@this=%p", this);</div><div class='del'>-		return -1;</div><div class='del'>-	}</div><div class='add'>+    /* NOTE: below logic is not totaly race proof */</div><div class='add'>+    /* thread0 and thread1 gets current_max as 10 */</div><div class='add'>+    /* thread0 has 'this-&gt;max_count as 11 */</div><div class='add'>+    /* thread1 has 'this-&gt;max_count as 20 */</div><div class='add'>+    /* thread1 goes ahead and sets the max_dict_pairs to 20 */</div><div class='add'>+    /* thread0 then goes and sets it to 11 */</div><div class='add'>+    /* As it is for information purpose only, no functionality will be</div><div class='add'>+       broken by this, but a point to consider about ATOMIC macros. */</div><div class='add'>+    current_max = GF_ATOMIC_GET(ctx-&gt;stats.max_dict_pairs);</div><div class='add'>+    if (current_max &lt; this-&gt;max_count)</div><div class='add'>+        GF_ATOMIC_INIT(ctx-&gt;stats.max_dict_pairs, this-&gt;max_count);</div><div class='ctx'> </div><div class='del'>-	int32_t len = 9; /* count + \n */</div><div class='del'>-	int32_t count = this-&gt;count;</div><div class='del'>-	data_pair_t *pair = this-&gt;members_list;</div><div class='add'>+    GF_ATOMIC_ADD(ctx-&gt;stats.total_pairs_used, total_pairs);</div><div class='add'>+    GF_ATOMIC_INC(ctx-&gt;stats.total_dicts_used);</div><div class='ctx'> </div><div class='del'>-	while (count) {</div><div class='del'>-		len += 18;</div><div class='del'>-		len += strlen (pair-&gt;key) + 1;</div><div class='del'>-		if (pair-&gt;value-&gt;vec) {</div><div class='del'>-			int i;</div><div class='del'>-			for (i=0; i&lt;pair-&gt;value-&gt;len; i++) {</div><div class='del'>-				len += pair-&gt;value-&gt;vec[i].iov_len;</div><div class='del'>-			}</div><div class='del'>-		} else {</div><div class='del'>-			len += pair-&gt;value-&gt;len;</div><div class='del'>-		}</div><div class='del'>-		pair = pair-&gt;next;</div><div class='del'>-		count--;</div><div class='del'>-	}</div><div class='add'>+    mem_put(this);</div><div class='ctx'> </div><div class='del'>-	return len;</div><div class='add'>+    return;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-int32_t </div><div class='del'>-dict_serialize_old (dict_t *this, char *buf)</div><div class='add'>+void</div><div class='add'>+dict_unref(dict_t *this)</div><div class='ctx'> {</div><div class='del'>-	if (!this || !buf) {</div><div class='del'>-		gf_log ("dict", GF_LOG_DEBUG,</div><div class='del'>-			"@this=%p @buf=%p", this, buf);</div><div class='del'>-		return -1;</div><div class='del'>-	}</div><div class='add'>+    uint64_t ref = 0;</div><div class='ctx'> </div><div class='del'>-	data_pair_t *pair = this-&gt;members_list;</div><div class='del'>-	int32_t count = this-&gt;count;</div><div class='del'>-	uint64_t dcount = this-&gt;count;</div><div class='add'>+    if (!this) {</div><div class='add'>+        gf_msg_callingfn("dict", GF_LOG_DEBUG, EINVAL, LG_MSG_INVALID_ARG,</div><div class='add'>+                         "dict is NULL");</div><div class='add'>+        return;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	// FIXME: magic numbers</div><div class='add'>+    ref = GF_ATOMIC_DEC(this-&gt;refcount);</div><div class='ctx'> </div><div class='del'>-	sprintf (buf, "%08"PRIx64"\n", dcount);</div><div class='del'>-	buf += 9;</div><div class='del'>-	while (count) {</div><div class='del'>-		uint64_t keylen = strlen (pair-&gt;key) + 1;</div><div class='del'>-		uint64_t vallen = pair-&gt;value-&gt;len;</div><div class='del'>-</div><div class='del'>-		sprintf (buf, "%08"PRIx64":%08"PRIx64"\n", keylen, vallen);</div><div class='del'>-		buf += 18;</div><div class='del'>-		memcpy (buf, pair-&gt;key, keylen);</div><div class='del'>-		buf += keylen;</div><div class='del'>-		memcpy (buf, pair-&gt;value-&gt;data, pair-&gt;value-&gt;len);</div><div class='del'>-		buf += pair-&gt;value-&gt;len;</div><div class='del'>-		pair = pair-&gt;next;</div><div class='del'>-		count--;</div><div class='del'>-	}</div><div class='del'>-	return (0);</div><div class='add'>+    if (!ref)</div><div class='add'>+        dict_destroy(this);</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> dict_t *</div><div class='del'>-dict_unserialize_old (char *buf, int32_t size, dict_t **fill)</div><div class='del'>-{</div><div class='del'>-	int32_t ret = 0;</div><div class='del'>-	int32_t cnt = 0;</div><div class='del'>-</div><div class='del'>-	if (!buf || !fill || !(*fill)) {</div><div class='del'>-		gf_log ("dict", GF_LOG_ERROR,</div><div class='del'>-			"@buf=%p @fill=%p @*fill=%p",</div><div class='del'>-                        buf, fill, (fill) ? (*fill) : NULL);</div><div class='del'>-		return NULL;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	uint64_t count;</div><div class='del'>-	ret = sscanf (buf, "%"SCNx64"\n", &amp;count);</div><div class='del'>-	(*fill)-&gt;count = 0;</div><div class='del'>-</div><div class='del'>-	if (!ret){</div><div class='del'>-		gf_log ("dict",</div><div class='del'>-			GF_LOG_ERROR,</div><div class='del'>-			"sscanf on buf failed");</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='del'>-	buf += 9;</div><div class='del'>-  </div><div class='del'>-	if (count == 0) {</div><div class='del'>-		gf_log ("dict",</div><div class='del'>-			GF_LOG_ERROR,</div><div class='del'>-			"count == 0");</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	for (cnt = 0; cnt &lt; count; cnt++) {</div><div class='del'>-		data_t *value = NULL;</div><div class='del'>-		char *key = NULL;</div><div class='del'>-		uint64_t key_len, value_len;</div><div class='del'>-    </div><div class='del'>-		ret = sscanf (buf, "%"SCNx64":%"SCNx64"\n", &amp;key_len, &amp;value_len);</div><div class='del'>-		if (ret != 2) {</div><div class='del'>-			gf_log ("dict",</div><div class='del'>-				GF_LOG_ERROR,</div><div class='del'>-				"sscanf for key_len and value_len failed");</div><div class='del'>-			goto err;</div><div class='del'>-		}</div><div class='del'>-		buf += 18;</div><div class='del'>-</div><div class='del'>-		key = buf;</div><div class='del'>-		buf += key_len;</div><div class='del'>-    </div><div class='del'>-		value = get_new_data ();</div><div class='del'>-		value-&gt;len = value_len;</div><div class='del'>-		value-&gt;data = buf;</div><div class='del'>-		value-&gt;is_static = 1;</div><div class='del'>-		buf += value_len;</div><div class='del'>-</div><div class='del'>-		dict_set (*fill, key, value);</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	goto ret;</div><div class='del'>-</div><div class='del'>-err:</div><div class='del'>-	GF_FREE (*fill);</div><div class='del'>-	*fill = NULL; </div><div class='add'>+dict_ref(dict_t *this)</div><div class='add'>+{</div><div class='add'>+    if (!this) {</div><div class='add'>+        gf_msg_callingfn("dict", GF_LOG_DEBUG, EINVAL, LG_MSG_INVALID_ARG,</div><div class='add'>+                         "dict is NULL");</div><div class='add'>+        return NULL;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-ret:</div><div class='del'>-	return *fill;</div><div class='add'>+    GF_ATOMIC_INC(this-&gt;refcount);</div><div class='add'>+    return this;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-dict_iovec_len (dict_t *this)</div><div class='add'>+void</div><div class='add'>+data_unref(data_t *this)</div><div class='ctx'> {</div><div class='del'>-	if (!this) {</div><div class='del'>-		gf_log ("dict", GF_LOG_CRITICAL,</div><div class='del'>-			"@this=%p", this);</div><div class='del'>-		return -1;</div><div class='del'>-	}</div><div class='add'>+    uint64_t ref;</div><div class='ctx'> </div><div class='del'>-	int32_t len = 0;</div><div class='del'>-	data_pair_t *pair = this-&gt;members_list;</div><div class='add'>+    if (!this) {</div><div class='add'>+        gf_msg_callingfn("dict", GF_LOG_WARNING, EINVAL, LG_MSG_INVALID_ARG,</div><div class='add'>+                         "data is NULL");</div><div class='add'>+        return;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	len++; /* initial header */</div><div class='del'>-	while (pair) {</div><div class='del'>-		len++; /* pair header */</div><div class='del'>-		len++; /* key */</div><div class='add'>+    ref = GF_ATOMIC_DEC(this-&gt;refcount);</div><div class='ctx'> </div><div class='del'>-		if (pair-&gt;value-&gt;vec)</div><div class='del'>-			len += pair-&gt;value-&gt;len;</div><div class='del'>-		else</div><div class='del'>-			len++;</div><div class='del'>-		pair = pair-&gt;next;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	return len;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-dict_to_iovec (dict_t *this,</div><div class='del'>-	       struct iovec *vec,</div><div class='del'>-	       int32_t count)</div><div class='del'>-{</div><div class='del'>-	if (!this || !vec) {</div><div class='del'>-		gf_log ("dict", GF_LOG_CRITICAL,</div><div class='del'>-			"@this=%p @vec=%p", this, vec);</div><div class='del'>-		return -1;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	int32_t i = 0;</div><div class='del'>-	data_pair_t *pair = this-&gt;members_list;</div><div class='del'>-</div><div class='del'>-	vec[0].iov_len = 9;</div><div class='del'>-	if (vec[0].iov_base)</div><div class='del'>-		sprintf (vec[0].iov_base,</div><div class='del'>-			 "%08"PRIx64"\n",</div><div class='del'>-			 (int64_t)this-&gt;count);</div><div class='del'>-	i++;</div><div class='del'>-</div><div class='del'>-	while (pair) {</div><div class='del'>-		int64_t keylen = strlen (pair-&gt;key) + 1;</div><div class='del'>-		int64_t vallen = 0;</div><div class='del'>-</div><div class='del'>-		if (pair-&gt;value-&gt;vec) {</div><div class='del'>-			int i;</div><div class='del'>-</div><div class='del'>-			for (i=0; i&lt;pair-&gt;value-&gt;len; i++) {</div><div class='del'>-				vallen += pair-&gt;value-&gt;vec[i].iov_len;</div><div class='del'>-			}</div><div class='del'>-		} else {</div><div class='del'>-			vallen = pair-&gt;value-&gt;len;</div><div class='del'>-		}</div><div class='del'>-</div><div class='del'>-		vec[i].iov_len = 18;</div><div class='del'>-		if (vec[i].iov_base)</div><div class='del'>-			sprintf (vec[i].iov_base,</div><div class='del'>-				 "%08"PRIx64":%08"PRIx64"\n",</div><div class='del'>-				 keylen,</div><div class='del'>-				 vallen);</div><div class='del'>-		i++;</div><div class='del'>-</div><div class='del'>-		vec[i].iov_len = keylen;</div><div class='del'>-		vec[i].iov_base = pair-&gt;key;</div><div class='del'>-		i++;</div><div class='del'>-</div><div class='del'>-		if (pair-&gt;value-&gt;vec) {</div><div class='del'>-			int k;</div><div class='del'>-</div><div class='del'>-			for (k=0; k&lt;pair-&gt;value-&gt;len; k++) {</div><div class='del'>-				vec[i].iov_len = pair-&gt;value-&gt;vec[k].iov_len;</div><div class='del'>-				vec[i].iov_base = pair-&gt;value-&gt;vec[k].iov_base;</div><div class='del'>-				i++;</div><div class='del'>-			}</div><div class='del'>-		} else {</div><div class='del'>-			vec[i].iov_len = pair-&gt;value-&gt;len;</div><div class='del'>-			vec[i].iov_base = pair-&gt;value-&gt;data;</div><div class='del'>-			i++;</div><div class='del'>-		}</div><div class='del'>-</div><div class='del'>-		pair = pair-&gt;next;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='add'>+    if (!ref)</div><div class='add'>+        data_destroy(this);</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> data_t *</div><div class='del'>-int_to_data (int64_t value)</div><div class='add'>+data_ref(data_t *this)</div><div class='ctx'> {</div><div class='del'>-        int     ret = 0;</div><div class='del'>-	data_t *data = get_new_data ();</div><div class='add'>+    if (!this) {</div><div class='add'>+        gf_msg_callingfn("dict", GF_LOG_WARNING, EINVAL, LG_MSG_INVALID_ARG,</div><div class='add'>+                         "data is NULL");</div><div class='add'>+        return NULL;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	if (!data) {</div><div class='del'>-		gf_log ("dict", GF_LOG_CRITICAL,</div><div class='del'>-			"@data - NULL returned by CALLOC");</div><div class='del'>-		return NULL;</div><div class='del'>-	}</div><div class='add'>+    GF_ATOMIC_INC(this-&gt;refcount);</div><div class='ctx'> </div><div class='del'>-	ret = gf_asprintf (&amp;data-&gt;data, "%"PRId64, value);</div><div class='del'>-        if (-1 == ret) {</div><div class='del'>-                gf_log ("dict", GF_LOG_ERROR, "asprintf failed");</div><div class='del'>-                return NULL;</div><div class='del'>-        }</div><div class='del'>-	data-&gt;len = strlen (data-&gt;data) + 1;</div><div class='del'>-</div><div class='del'>-	return data;</div><div class='add'>+    return this;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> data_t *</div><div class='del'>-data_from_int64 (int64_t value)</div><div class='del'>-{</div><div class='del'>-        int     ret = 0;</div><div class='del'>-	data_t *data = get_new_data ();</div><div class='del'>-</div><div class='del'>-	if (!data) {</div><div class='del'>-		gf_log ("dict", GF_LOG_CRITICAL,</div><div class='del'>-			"@data - NULL returned by CALLOC");</div><div class='del'>-		return NULL;</div><div class='del'>-	}</div><div class='del'>-	ret = gf_asprintf (&amp;data-&gt;data, "%"PRId64, value);</div><div class='del'>-        if (-1 == ret) {</div><div class='del'>-                gf_log ("dict", GF_LOG_ERROR, "asprintf failed");</div><div class='del'>-                return NULL;</div><div class='del'>-        }</div><div class='del'>-	data-&gt;len = strlen (data-&gt;data) + 1;</div><div class='add'>+int_to_data(int64_t value)</div><div class='add'>+{</div><div class='add'>+    data_t *data = get_new_data();</div><div class='ctx'> </div><div class='del'>-	return data;</div><div class='add'>+    if (!data) {</div><div class='add'>+        return NULL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    data-&gt;len = gf_asprintf(&amp;data-&gt;data, "%" PRId64, value);</div><div class='add'>+    if (-1 == data-&gt;len) {</div><div class='add'>+        gf_msg_debug("dict", 0, "asprintf failed");</div><div class='add'>+        data_destroy(data);</div><div class='add'>+        return NULL;</div><div class='add'>+    }</div><div class='add'>+    data-&gt;len++; /* account for terminating NULL */</div><div class='add'>+    data-&gt;data_type = GF_DATA_TYPE_INT;</div><div class='add'>+</div><div class='add'>+    return data;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> data_t *</div><div class='del'>-data_from_int32 (int32_t value)</div><div class='del'>-{</div><div class='del'>-        int     ret = 0;</div><div class='del'>-	data_t *data = get_new_data ();</div><div class='del'>-</div><div class='del'>-	if (!data) {</div><div class='del'>-		gf_log ("dict", GF_LOG_CRITICAL,</div><div class='del'>-			"@data - NULL returned by CALLOC");</div><div class='del'>-		return NULL;</div><div class='del'>-	}</div><div class='del'>-	ret = gf_asprintf (&amp;data-&gt;data, "%"PRId32, value);</div><div class='del'>-        if (-1 == ret) {</div><div class='del'>-                gf_log ("dict", GF_LOG_ERROR, "asprintf failed");</div><div class='del'>-                return NULL;</div><div class='del'>-        }</div><div class='add'>+data_from_int64(int64_t value)</div><div class='add'>+{</div><div class='add'>+    data_t *data = get_new_data();</div><div class='ctx'> </div><div class='del'>-	data-&gt;len = strlen (data-&gt;data) + 1;</div><div class='add'>+    if (!data) {</div><div class='add'>+        return NULL;</div><div class='add'>+    }</div><div class='add'>+    data-&gt;len = gf_asprintf(&amp;data-&gt;data, "%" PRId64, value);</div><div class='add'>+    if (-1 == data-&gt;len) {</div><div class='add'>+        gf_msg_debug("dict", 0, "asprintf failed");</div><div class='add'>+        data_destroy(data);</div><div class='add'>+        return NULL;</div><div class='add'>+    }</div><div class='add'>+    data-&gt;len++; /* account for terminating NULL */</div><div class='add'>+    data-&gt;data_type = GF_DATA_TYPE_INT;</div><div class='ctx'> </div><div class='del'>-	return data;</div><div class='add'>+    return data;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> data_t *</div><div class='del'>-data_from_int16 (int16_t value)</div><div class='del'>-{</div><div class='del'>-        int     ret = 0;</div><div class='del'>-	data_t *data = get_new_data ();</div><div class='del'>-</div><div class='del'>-	if (!data) {</div><div class='del'>-		gf_log ("dict", GF_LOG_CRITICAL,</div><div class='del'>-			"@data - NULL returned by CALLOC");</div><div class='del'>-		return NULL;</div><div class='del'>-	}</div><div class='del'>-	ret = gf_asprintf (&amp;data-&gt;data, "%"PRId16, value);</div><div class='del'>-        if (-1 == ret) {</div><div class='del'>-                gf_log ("dict", GF_LOG_ERROR, "asprintf failed");</div><div class='del'>-                return NULL;</div><div class='del'>-        }</div><div class='add'>+data_from_int32(int32_t value)</div><div class='add'>+{</div><div class='add'>+    data_t *data = get_new_data();</div><div class='ctx'> </div><div class='del'>-	data-&gt;len = strlen (data-&gt;data) + 1;</div><div class='add'>+    if (!data) {</div><div class='add'>+        return NULL;</div><div class='add'>+    }</div><div class='add'>+    data-&gt;len = gf_asprintf(&amp;data-&gt;data, "%" PRId32, value);</div><div class='add'>+    if (-1 == data-&gt;len) {</div><div class='add'>+        gf_msg_debug("dict", 0, "asprintf failed");</div><div class='add'>+        data_destroy(data);</div><div class='add'>+        return NULL;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	return data;</div><div class='add'>+    data-&gt;len++; /* account for terminating NULL */</div><div class='add'>+    data-&gt;data_type = GF_DATA_TYPE_INT;</div><div class='add'>+</div><div class='add'>+    return data;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> data_t *</div><div class='del'>-data_from_int8 (int8_t value)</div><div class='del'>-{</div><div class='del'>-        int     ret = 0;</div><div class='del'>-	data_t *data = get_new_data ();</div><div class='del'>-</div><div class='del'>-	if (!data) {</div><div class='del'>-		gf_log ("dict", GF_LOG_CRITICAL,</div><div class='del'>-			"@data - NULL returned by CALLOC");</div><div class='del'>-		return NULL;</div><div class='del'>-	}</div><div class='del'>-	ret = gf_asprintf (&amp;data-&gt;data, "%d", value);</div><div class='del'>-        if (-1 == ret) {</div><div class='del'>-                gf_log ("dict", GF_LOG_ERROR, "asprintf failed");</div><div class='del'>-                return NULL;</div><div class='del'>-        }</div><div class='add'>+data_from_int16(int16_t value)</div><div class='add'>+{</div><div class='add'>+    data_t *data = get_new_data();</div><div class='add'>+</div><div class='add'>+    if (!data) {</div><div class='add'>+        return NULL;</div><div class='add'>+    }</div><div class='add'>+    data-&gt;len = gf_asprintf(&amp;data-&gt;data, "%" PRId16, value);</div><div class='add'>+    if (-1 == data-&gt;len) {</div><div class='add'>+        gf_msg_debug("dict", 0, "asprintf failed");</div><div class='add'>+        data_destroy(data);</div><div class='add'>+        return NULL;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	data-&gt;len = strlen (data-&gt;data) + 1;</div><div class='add'>+    data-&gt;len++; /* account for terminating NULL */</div><div class='add'>+    data-&gt;data_type = GF_DATA_TYPE_INT;</div><div class='ctx'> </div><div class='del'>-	return data;</div><div class='add'>+    return data;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> data_t *</div><div class='del'>-data_from_uint64 (uint64_t value)</div><div class='del'>-{</div><div class='del'>-        int     ret = 0;</div><div class='del'>-	data_t *data = get_new_data ();</div><div class='del'>-</div><div class='del'>-	if (!data) {</div><div class='del'>-		gf_log ("dict", GF_LOG_CRITICAL,</div><div class='del'>-			"@data - NULL returned by CALLOC");</div><div class='del'>-		return NULL;</div><div class='del'>-	}</div><div class='del'>-	ret = gf_asprintf (&amp;data-&gt;data, "%"PRIu64, value);</div><div class='del'>-        if (-1 == ret) {</div><div class='del'>-                gf_log ("dict", GF_LOG_ERROR, "asprintf failed");</div><div class='del'>-                return NULL;</div><div class='del'>-        }</div><div class='add'>+data_from_int8(int8_t value)</div><div class='add'>+{</div><div class='add'>+    data_t *data = get_new_data();</div><div class='ctx'> </div><div class='del'>-	data-&gt;len = strlen (data-&gt;data) + 1;</div><div class='add'>+    if (!data) {</div><div class='add'>+        return NULL;</div><div class='add'>+    }</div><div class='add'>+    data-&gt;len = gf_asprintf(&amp;data-&gt;data, "%d", value);</div><div class='add'>+    if (-1 == data-&gt;len) {</div><div class='add'>+        gf_msg_debug("dict", 0, "asprintf failed");</div><div class='add'>+        data_destroy(data);</div><div class='add'>+        return NULL;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	return data;</div><div class='add'>+    data-&gt;len++; /* account for terminating NULL */</div><div class='add'>+    data-&gt;data_type = GF_DATA_TYPE_INT;</div><div class='add'>+</div><div class='add'>+    return data;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-static data_t *</div><div class='del'>-data_from_double (double value)</div><div class='add'>+data_t *</div><div class='add'>+data_from_uint64(uint64_t value)</div><div class='ctx'> {</div><div class='del'>-	data_t *data = NULL;</div><div class='del'>-	int     ret  = 0;</div><div class='del'>-</div><div class='del'>-	data = get_new_data ();</div><div class='add'>+    data_t *data = get_new_data();</div><div class='ctx'> </div><div class='del'>-	if (!data) {</div><div class='del'>-		gf_log ("dict", GF_LOG_CRITICAL,</div><div class='del'>-			"@data - NULL returned by CALLOC");</div><div class='del'>-		return NULL;</div><div class='del'>-	}</div><div class='add'>+    if (!data) {</div><div class='add'>+        return NULL;</div><div class='add'>+    }</div><div class='add'>+    data-&gt;len = gf_asprintf(&amp;data-&gt;data, "%" PRIu64, value);</div><div class='add'>+    if (-1 == data-&gt;len) {</div><div class='add'>+        gf_msg_debug("dict", 0, "asprintf failed");</div><div class='add'>+        data_destroy(data);</div><div class='add'>+        return NULL;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	ret = gf_asprintf (&amp;data-&gt;data, "%f", value);</div><div class='del'>-	if (ret == -1) {</div><div class='del'>-		gf_log ("dict", GF_LOG_CRITICAL,</div><div class='del'>-			"@data - allocation failed by ASPRINTF");</div><div class='del'>-		return NULL;</div><div class='del'>-	}</div><div class='del'>-	data-&gt;len = strlen (data-&gt;data) + 1;</div><div class='add'>+    data-&gt;len++; /* account for terminating NULL */</div><div class='add'>+    data-&gt;data_type = GF_DATA_TYPE_UINT;</div><div class='ctx'> </div><div class='del'>-	return data;</div><div class='add'>+    return data;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> data_t *</div><div class='del'>-data_from_uint32 (uint32_t value)</div><div class='del'>-{</div><div class='del'>-        int     ret = 0;</div><div class='del'>-	data_t *data = get_new_data ();</div><div class='del'>-</div><div class='del'>-	if (!data) {</div><div class='del'>-		gf_log ("dict", GF_LOG_CRITICAL,</div><div class='del'>-			"@data - NULL returned by CALLOC");</div><div class='del'>-		return NULL;</div><div class='del'>-	}</div><div class='del'>-	ret = gf_asprintf (&amp;data-&gt;data, "%"PRIu32, value);</div><div class='del'>-        if (-1 == ret) {</div><div class='del'>-                gf_log ("dict", GF_LOG_ERROR, "asprintf failed");</div><div class='del'>-                return NULL;</div><div class='del'>-        }</div><div class='add'>+data_from_double(double value)</div><div class='add'>+{</div><div class='add'>+    data_t *data = get_new_data();</div><div class='ctx'> </div><div class='del'>-	data-&gt;len = strlen (data-&gt;data) + 1;</div><div class='add'>+    if (!data) {</div><div class='add'>+        return NULL;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	return data;</div><div class='del'>-}</div><div class='add'>+    data-&gt;len = gf_asprintf(&amp;data-&gt;data, "%f", value);</div><div class='add'>+    if (data-&gt;len == -1) {</div><div class='add'>+        gf_msg_debug("dict", 0, "asprintf failed");</div><div class='add'>+        data_destroy(data);</div><div class='add'>+        return NULL;</div><div class='add'>+    }</div><div class='add'>+    data-&gt;len++; /* account for terminating NULL */</div><div class='add'>+    data-&gt;data_type = GF_DATA_TYPE_DOUBLE;</div><div class='ctx'> </div><div class='add'>+    return data;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> data_t *</div><div class='del'>-data_from_uint16 (uint16_t value)</div><div class='del'>-{</div><div class='del'>-        int     ret = 0;</div><div class='del'>-	data_t *data = get_new_data ();</div><div class='del'>-</div><div class='del'>-	if (!data) {</div><div class='del'>-		gf_log ("dict", GF_LOG_CRITICAL,</div><div class='del'>-			"@data - NULL returned by CALLOC");</div><div class='del'>-		return NULL;</div><div class='del'>-	}</div><div class='del'>-	ret = gf_asprintf (&amp;data-&gt;data, "%"PRIu16, value);</div><div class='del'>-        if (-1 == ret) {</div><div class='del'>-                gf_log ("dict", GF_LOG_ERROR, "asprintf failed");</div><div class='del'>-                return NULL;</div><div class='del'>-        }</div><div class='add'>+data_from_uint32(uint32_t value)</div><div class='add'>+{</div><div class='add'>+    data_t *data = get_new_data();</div><div class='ctx'> </div><div class='del'>-	data-&gt;len = strlen (data-&gt;data) + 1;</div><div class='add'>+    if (!data) {</div><div class='add'>+        return NULL;</div><div class='add'>+    }</div><div class='add'>+    data-&gt;len = gf_asprintf(&amp;data-&gt;data, "%" PRIu32, value);</div><div class='add'>+    if (-1 == data-&gt;len) {</div><div class='add'>+        gf_msg_debug("dict", 0, "asprintf failed");</div><div class='add'>+        data_destroy(data);</div><div class='add'>+        return NULL;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	return data;</div><div class='del'>-}</div><div class='add'>+    data-&gt;len++; /* account for terminating NULL */</div><div class='add'>+    data-&gt;data_type = GF_DATA_TYPE_UINT;</div><div class='ctx'> </div><div class='add'>+    return data;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> data_t *</div><div class='del'>-data_from_ptr (void *value)</div><div class='add'>+data_from_uint16(uint16_t value)</div><div class='ctx'> {</div><div class='del'>-	if (!value) {</div><div class='del'>-		gf_log ("dict", GF_LOG_CRITICAL,</div><div class='del'>-			"@value=%p", value);</div><div class='del'>-		return NULL;</div><div class='del'>-	}</div><div class='add'>+    data_t *data = get_new_data();</div><div class='ctx'> </div><div class='del'>-	data_t *data = get_new_data ();</div><div class='add'>+    if (!data) {</div><div class='add'>+        return NULL;</div><div class='add'>+    }</div><div class='add'>+    data-&gt;len = gf_asprintf(&amp;data-&gt;data, "%" PRIu16, value);</div><div class='add'>+    if (-1 == data-&gt;len) {</div><div class='add'>+        gf_msg_debug("dict", 0, "asprintf failed");</div><div class='add'>+        data_destroy(data);</div><div class='add'>+        return NULL;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	if (!data) {</div><div class='del'>-		gf_log ("dict", GF_LOG_CRITICAL,</div><div class='del'>-			"@data - NULL returned by CALLOC");</div><div class='del'>-		return NULL;</div><div class='del'>-	}</div><div class='add'>+    data-&gt;len++; /* account for terminating NULL */</div><div class='add'>+    data-&gt;data_type = GF_DATA_TYPE_UINT;</div><div class='ctx'> </div><div class='del'>-	data-&gt;data = value;</div><div class='del'>-	return data;</div><div class='add'>+    return data;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-data_t *</div><div class='del'>-data_from_static_ptr (void *value)</div><div class='add'>+static data_t *</div><div class='add'>+data_from_ptr_common(void *value, gf_boolean_t is_static)</div><div class='ctx'> {</div><div class='del'>-/*</div><div class='del'>-  this is valid to set 0 as value..</div><div class='add'>+    /* it is valid to set 0/NULL as a value, no need to check *value */</div><div class='ctx'> </div><div class='del'>-	if (!value) {</div><div class='del'>-		gf_log ("dict", GF_LOG_CRITICAL,</div><div class='del'>-			"@value=%p", value);</div><div class='del'>-		return NULL;</div><div class='del'>-	}</div><div class='del'>-*/</div><div class='del'>-	data_t *data = get_new_data ();</div><div class='add'>+    data_t *data = get_new_data();</div><div class='add'>+    if (!data) {</div><div class='add'>+        return NULL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    data-&gt;data = value;</div><div class='add'>+    data-&gt;len = 0;</div><div class='add'>+    data-&gt;is_static = is_static;</div><div class='ctx'> </div><div class='del'>-	if (!data) {</div><div class='del'>-		gf_log ("dict", GF_LOG_CRITICAL,</div><div class='del'>-			"@data - NULL returned by CALLOC");</div><div class='del'>-		return NULL;</div><div class='del'>-	}</div><div class='add'>+    data-&gt;data_type = GF_DATA_TYPE_PTR;</div><div class='add'>+    return data;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	data-&gt;is_static = 1;</div><div class='del'>-	data-&gt;data = value;</div><div class='add'>+data_t *</div><div class='add'>+str_to_data(char *value)</div><div class='add'>+{</div><div class='add'>+    if (!value) {</div><div class='add'>+        gf_msg_callingfn("dict", GF_LOG_WARNING, EINVAL, LG_MSG_INVALID_ARG,</div><div class='add'>+                         "value is NULL");</div><div class='add'>+        return NULL;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	return data;</div><div class='add'>+    return strn_to_data(value, strlen(value));</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> data_t *</div><div class='del'>-str_to_data (char *value)</div><div class='add'>+strn_to_data(char *value, const int vallen)</div><div class='ctx'> {</div><div class='del'>-	if (!value) {</div><div class='del'>-		gf_log ("dict", GF_LOG_CRITICAL,</div><div class='del'>-			"@value=%p", value);</div><div class='del'>-		return NULL;</div><div class='del'>-	}</div><div class='del'>-	data_t *data = get_new_data ();</div><div class='add'>+    if (!value) {</div><div class='add'>+        gf_msg_callingfn("dict", GF_LOG_WARNING, EINVAL, LG_MSG_INVALID_ARG,</div><div class='add'>+                         "value is NULL");</div><div class='add'>+        return NULL;</div><div class='add'>+    }</div><div class='add'>+    data_t *data = get_new_data();</div><div class='ctx'> </div><div class='del'>-	if (!data) {</div><div class='del'>-		gf_log ("dict", GF_LOG_CRITICAL,</div><div class='del'>-			"@data - NULL returned by CALLOC");</div><div class='del'>-		return NULL;</div><div class='del'>-	}</div><div class='del'>-	data-&gt;len = strlen (value) + 1;</div><div class='add'>+    if (!data) {</div><div class='add'>+        return NULL;</div><div class='add'>+    }</div><div class='add'>+    data-&gt;len = vallen + 1;</div><div class='add'>+    data-&gt;data_type = GF_DATA_TYPE_STR;</div><div class='ctx'> </div><div class='del'>-	data-&gt;data = value;</div><div class='del'>-	data-&gt;is_static = 1;</div><div class='add'>+    data-&gt;data = value;</div><div class='add'>+    data-&gt;is_static = _gf_true;</div><div class='ctx'> </div><div class='del'>-	return data;</div><div class='add'>+    return data;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-data_t *</div><div class='del'>-data_from_dynstr (char *value)</div><div class='add'>+static data_t *</div><div class='add'>+data_from_dynstr(char *value)</div><div class='ctx'> {</div><div class='del'>-	if (!value) {</div><div class='del'>-		gf_log ("dict", GF_LOG_CRITICAL,</div><div class='del'>-			"@value=%p", value);</div><div class='del'>-		return NULL;</div><div class='del'>-	}</div><div class='add'>+    if (!value) {</div><div class='add'>+        gf_msg_callingfn("dict", GF_LOG_WARNING, EINVAL, LG_MSG_INVALID_ARG,</div><div class='add'>+                         "value is NULL");</div><div class='add'>+        return NULL;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	data_t *data = get_new_data ();</div><div class='add'>+    data_t *data = get_new_data();</div><div class='ctx'> </div><div class='del'>-	data-&gt;len = strlen (value) + 1;</div><div class='del'>-	data-&gt;data = value;</div><div class='add'>+    if (!data)</div><div class='add'>+        return NULL;</div><div class='add'>+    data-&gt;len = strlen(value) + 1;</div><div class='add'>+    data-&gt;data = value;</div><div class='add'>+    data-&gt;data_type = GF_DATA_TYPE_STR;</div><div class='ctx'> </div><div class='del'>-	return data;</div><div class='add'>+    return data;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> data_t *</div><div class='del'>-data_from_dynptr (void *value, int32_t len)</div><div class='add'>+data_from_dynptr(void *value, int32_t len)</div><div class='ctx'> {</div><div class='del'>-	data_t *data = get_new_data ();</div><div class='add'>+    data_t *data = get_new_data();</div><div class='add'>+</div><div class='add'>+    if (!data)</div><div class='add'>+        return NULL;</div><div class='ctx'> </div><div class='del'>-	data-&gt;len = len;</div><div class='del'>-	data-&gt;data = value;</div><div class='add'>+    data-&gt;len = len;</div><div class='add'>+    data-&gt;data = value;</div><div class='add'>+    data-&gt;data_type = GF_DATA_TYPE_PTR;</div><div class='ctx'> </div><div class='del'>-	return data;</div><div class='add'>+    return data;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> data_t *</div><div class='del'>-bin_to_data (void *value, int32_t len)</div><div class='add'>+bin_to_data(void *value, int32_t len)</div><div class='ctx'> {</div><div class='del'>-	if (!value) {</div><div class='del'>-		gf_log ("dict", GF_LOG_CRITICAL,</div><div class='del'>-			"@value=%p", value);</div><div class='del'>-		return NULL;</div><div class='del'>-	}</div><div class='add'>+    if (!value) {</div><div class='add'>+        gf_msg_callingfn("dict", GF_LOG_WARNING, EINVAL, LG_MSG_INVALID_ARG,</div><div class='add'>+                         "value is NULL");</div><div class='add'>+        return NULL;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	data_t *data = get_new_data ();</div><div class='add'>+    data_t *data = get_new_data();</div><div class='ctx'> </div><div class='del'>-	data-&gt;is_static = 1;</div><div class='del'>-	data-&gt;len = len;</div><div class='del'>-	data-&gt;data = value;</div><div class='add'>+    if (!data)</div><div class='add'>+        return NULL;</div><div class='ctx'> </div><div class='del'>-	return data;</div><div class='add'>+    data-&gt;is_static = _gf_true;</div><div class='add'>+    data-&gt;len = len;</div><div class='add'>+    data-&gt;data = value;</div><div class='add'>+</div><div class='add'>+    return data;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+static char *data_type_name[GF_DATA_TYPE_MAX] = {</div><div class='add'>+    [GF_DATA_TYPE_UNKNOWN] = "unknown",</div><div class='add'>+    [GF_DATA_TYPE_STR_OLD] = "string-old-version",</div><div class='add'>+    [GF_DATA_TYPE_INT] = "integer",</div><div class='add'>+    [GF_DATA_TYPE_UINT] = "unsigned integer",</div><div class='add'>+    [GF_DATA_TYPE_DOUBLE] = "float",</div><div class='add'>+    [GF_DATA_TYPE_STR] = "string",</div><div class='add'>+    [GF_DATA_TYPE_PTR] = "pointer",</div><div class='add'>+    [GF_DATA_TYPE_GFUUID] = "gf-uuid",</div><div class='add'>+    [GF_DATA_TYPE_IATT] = "iatt",</div><div class='add'>+    [GF_DATA_TYPE_MDATA] = "mdata",</div><div class='add'>+};</div><div class='add'>+</div><div class='ctx'> int64_t</div><div class='del'>-data_to_int64 (data_t *data)</div><div class='del'>-{</div><div class='del'>-	if (!data)</div><div class='del'>-		return -1;</div><div class='add'>+data_to_int64(data_t *data)</div><div class='add'>+{</div><div class='add'>+    VALIDATE_DATA_AND_LOG(data, GF_DATA_TYPE_INT, "null", -1);</div><div class='add'>+</div><div class='add'>+    char *endptr = NULL;</div><div class='add'>+    int64_t value = 0;</div><div class='add'>+</div><div class='add'>+    errno = 0;</div><div class='add'>+    value = strtoll(data-&gt;data, &amp;endptr, 0);</div><div class='add'>+</div><div class='add'>+    if (endptr &amp;&amp; *endptr != '\0')</div><div class='add'>+        /* Unrecognized characters at the end of string. */</div><div class='add'>+        errno = EINVAL;</div><div class='add'>+    if (errno) {</div><div class='add'>+        gf_msg_callingfn("dict", GF_LOG_WARNING, errno,</div><div class='add'>+                         LG_MSG_DATA_CONVERSION_ERROR,</div><div class='add'>+                         "Error in data conversion: '%s' can't "</div><div class='add'>+                         "be represented as int64_t",</div><div class='add'>+                         data-&gt;data);</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+    return value;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* Like above but implies signed range check. */</div><div class='add'>+</div><div class='add'>+#define DATA_TO_RANGED_SIGNED(endptr, value, data, type, min, max)             \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        errno = 0;                                                             \</div><div class='add'>+        value = strtoll(data-&gt;data, &amp;endptr, 0);                               \</div><div class='add'>+        if (endptr &amp;&amp; *endptr != '\0')                                         \</div><div class='add'>+            errno = EINVAL;                                                    \</div><div class='add'>+        if (errno || value &gt; max || value &lt; min) {                             \</div><div class='add'>+            gf_msg_callingfn("dict", GF_LOG_WARNING, errno,                    \</div><div class='add'>+                             LG_MSG_DATA_CONVERSION_ERROR,                     \</div><div class='add'>+                             "Error in data conversion: '%s' can't "           \</div><div class='add'>+                             "be represented as " #type,                       \</div><div class='add'>+                             data-&gt;data);                                      \</div><div class='add'>+            return -1;                                                         \</div><div class='add'>+        }                                                                      \</div><div class='add'>+        return (type)value;                                                    \</div><div class='add'>+    } while (0)</div><div class='ctx'> </div><div class='del'>-	char *str = alloca (data-&gt;len + 1);</div><div class='del'>-        if (!str)</div><div class='del'>-                return -1;</div><div class='add'>+int32_t</div><div class='add'>+data_to_int32(data_t *data)</div><div class='add'>+{</div><div class='add'>+    char *endptr = NULL;</div><div class='add'>+    int64_t value = 0;</div><div class='ctx'> </div><div class='del'>-	memcpy (str, data-&gt;data, data-&gt;len);</div><div class='del'>-	str[data-&gt;len] = '\0';</div><div class='del'>-	return (int64_t) strtoull (str, NULL, 0);</div><div class='add'>+    VALIDATE_DATA_AND_LOG(data, GF_DATA_TYPE_INT, "null", -1);</div><div class='add'>+    DATA_TO_RANGED_SIGNED(endptr, value, data, int32_t, INT_MIN, INT_MAX);</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-int32_t</div><div class='del'>-data_to_int32 (data_t *data)</div><div class='add'>+int16_t</div><div class='add'>+data_to_int16(data_t *data)</div><div class='ctx'> {</div><div class='del'>-	if (!data)</div><div class='del'>-		return -1;</div><div class='add'>+    char *endptr = NULL;</div><div class='add'>+    int64_t value = 0;</div><div class='ctx'> </div><div class='del'>-	char *str = alloca (data-&gt;len + 1);</div><div class='del'>-        if (!str)</div><div class='del'>-                return -1;</div><div class='add'>+    VALIDATE_DATA_AND_LOG(data, GF_DATA_TYPE_INT, "null", -1);</div><div class='add'>+    DATA_TO_RANGED_SIGNED(endptr, value, data, int16_t, SHRT_MIN, SHRT_MAX);</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	memcpy (str, data-&gt;data, data-&gt;len);</div><div class='del'>-	str[data-&gt;len] = '\0';</div><div class='add'>+int8_t</div><div class='add'>+data_to_int8(data_t *data)</div><div class='add'>+{</div><div class='add'>+    char *endptr = NULL;</div><div class='add'>+    int64_t value = 0;</div><div class='ctx'> </div><div class='del'>-	return strtoul (str, NULL, 0);</div><div class='add'>+    VALIDATE_DATA_AND_LOG(data, GF_DATA_TYPE_INT, "null", -1);</div><div class='add'>+    DATA_TO_RANGED_SIGNED(endptr, value, data, int8_t, CHAR_MIN, CHAR_MAX);</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-int16_t</div><div class='del'>-data_to_int16 (data_t *data)</div><div class='add'>+uint64_t</div><div class='add'>+data_to_uint64(data_t *data)</div><div class='add'>+{</div><div class='add'>+    VALIDATE_DATA_AND_LOG(data, GF_DATA_TYPE_UINT, "null", -1);</div><div class='add'>+</div><div class='add'>+    char *endptr = NULL;</div><div class='add'>+    uint64_t value = 0;</div><div class='add'>+</div><div class='add'>+    errno = 0;</div><div class='add'>+    value = strtoull(data-&gt;data, &amp;endptr, 0);</div><div class='add'>+</div><div class='add'>+    if (endptr &amp;&amp; *endptr != '\0')</div><div class='add'>+        errno = EINVAL;</div><div class='add'>+    if (errno) {</div><div class='add'>+        gf_msg_callingfn("dict", GF_LOG_WARNING, errno,</div><div class='add'>+                         LG_MSG_DATA_CONVERSION_ERROR,</div><div class='add'>+                         "Error in data conversion: '%s' can't "</div><div class='add'>+                         "be represented as uint64_t",</div><div class='add'>+                         data-&gt;data);</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+    return value;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* Like above but implies unsigned range check. */</div><div class='add'>+</div><div class='add'>+#define DATA_TO_RANGED_UNSIGNED(endptr, value, data, type, max)                \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        errno = 0;                                                             \</div><div class='add'>+        value = strtoull(data-&gt;data, &amp;endptr, 0);                              \</div><div class='add'>+        if (endptr &amp;&amp; *endptr != '\0')                                         \</div><div class='add'>+            errno = EINVAL;                                                    \</div><div class='add'>+        if (errno || value &gt; max) {                                            \</div><div class='add'>+            gf_msg_callingfn("dict", GF_LOG_WARNING, errno,                    \</div><div class='add'>+                             LG_MSG_DATA_CONVERSION_ERROR,                     \</div><div class='add'>+                             "Error in data conversion: '%s' can't "           \</div><div class='add'>+                             "be represented as " #type,                       \</div><div class='add'>+                             data-&gt;data);                                      \</div><div class='add'>+            return -1;                                                         \</div><div class='add'>+        }                                                                      \</div><div class='add'>+        return (type)value;                                                    \</div><div class='add'>+    } while (0)</div><div class='add'>+</div><div class='add'>+uint32_t</div><div class='add'>+data_to_uint32(data_t *data)</div><div class='ctx'> {</div><div class='del'>-	if (!data)</div><div class='del'>-		return -1;</div><div class='add'>+    char *endptr = NULL;</div><div class='add'>+    uint64_t value = 0;</div><div class='ctx'> </div><div class='del'>-	char *str = alloca (data-&gt;len + 1);</div><div class='del'>-        if (!str)</div><div class='del'>-                return -1;</div><div class='add'>+    VALIDATE_DATA_AND_LOG(data, GF_DATA_TYPE_UINT, "null", -1);</div><div class='add'>+    DATA_TO_RANGED_UNSIGNED(endptr, value, data, uint32_t, UINT_MAX);</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	memcpy (str, data-&gt;data, data-&gt;len);</div><div class='del'>-	str[data-&gt;len] = '\0';</div><div class='add'>+uint16_t</div><div class='add'>+data_to_uint16(data_t *data)</div><div class='add'>+{</div><div class='add'>+    char *endptr = NULL;</div><div class='add'>+    uint64_t value = 0;</div><div class='ctx'> </div><div class='del'>-	return strtol (str, NULL, 0);</div><div class='add'>+    VALIDATE_DATA_AND_LOG(data, GF_DATA_TYPE_UINT, "null", -1);</div><div class='add'>+    DATA_TO_RANGED_UNSIGNED(endptr, value, data, uint16_t, USHRT_MAX);</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='del'>-int8_t</div><div class='del'>-data_to_int8 (data_t *data)</div><div class='add'>+uint8_t</div><div class='add'>+data_to_uint8(data_t *data)</div><div class='ctx'> {</div><div class='del'>-	if (!data)</div><div class='del'>-		return -1;</div><div class='add'>+    char *endptr = NULL;</div><div class='add'>+    uint64_t value = 0;</div><div class='ctx'> </div><div class='del'>-	char *str = alloca (data-&gt;len + 1);</div><div class='del'>-        if (!str)</div><div class='del'>-                return -1;</div><div class='add'>+    VALIDATE_DATA_AND_LOG(data, GF_DATA_TYPE_UINT, "null", -1);</div><div class='add'>+    DATA_TO_RANGED_UNSIGNED(endptr, value, data, uint8_t, UCHAR_MAX);</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	memcpy (str, data-&gt;data, data-&gt;len);</div><div class='del'>-	str[data-&gt;len] = '\0';</div><div class='add'>+char *</div><div class='add'>+data_to_str(data_t *data)</div><div class='add'>+{</div><div class='add'>+    VALIDATE_DATA_AND_LOG(data, GF_DATA_TYPE_STR, "null", NULL);</div><div class='add'>+    return data-&gt;data;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	return (int8_t)strtol (str, NULL, 0);</div><div class='add'>+void *</div><div class='add'>+data_to_ptr(data_t *data)</div><div class='add'>+{</div><div class='add'>+    VALIDATE_DATA_AND_LOG(data, GF_DATA_TYPE_PTR, "null", NULL);</div><div class='add'>+    return data-&gt;data;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+void *</div><div class='add'>+data_to_bin(data_t *data)</div><div class='add'>+{</div><div class='add'>+    VALIDATE_DATA_AND_LOG(data, GF_DATA_TYPE_PTR, "null", NULL);</div><div class='add'>+    return data-&gt;data;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-uint64_t</div><div class='del'>-data_to_uint64 (data_t *data)</div><div class='add'>+struct iatt *</div><div class='add'>+data_to_iatt(data_t *data, char *key)</div><div class='ctx'> {</div><div class='del'>-	if (!data)</div><div class='del'>-		return -1;</div><div class='del'>-	char *str = alloca (data-&gt;len + 1);</div><div class='del'>-        if (!str)</div><div class='del'>-                return -1;</div><div class='add'>+    VALIDATE_DATA_AND_LOG(data, GF_DATA_TYPE_IATT, key, NULL);</div><div class='ctx'> </div><div class='del'>-	memcpy (str, data-&gt;data, data-&gt;len);</div><div class='del'>-	str[data-&gt;len] = '\0';</div><div class='add'>+    /* We only check for smaller size. If it's bigger we simply ignore</div><div class='add'>+     * the extra data. This way it's easy to do changes in the future that</div><div class='add'>+     * pass more data but are backward compatible (if the initial contents</div><div class='add'>+     * of the struct are maintained, of course). */</div><div class='add'>+    if (data-&gt;len &lt; sizeof(struct iatt)) {</div><div class='add'>+        gf_smsg("glusterfs", GF_LOG_ERROR, ENOBUFS, LG_MSG_UNDERSIZED_BUF,</div><div class='add'>+                "key=%s", key, NULL);</div><div class='add'>+        return NULL;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	return strtoll (str, NULL, 0);</div><div class='add'>+    return (struct iatt *)data-&gt;data;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-uint32_t</div><div class='del'>-data_to_uint32 (data_t *data)</div><div class='add'>+int</div><div class='add'>+dict_null_foreach_fn(dict_t *d, char *k, data_t *v, void *tmp)</div><div class='ctx'> {</div><div class='del'>-	if (!data)</div><div class='del'>-		return -1;</div><div class='del'>-</div><div class='del'>-	char *str = alloca (data-&gt;len + 1);</div><div class='del'>-        if (!str)</div><div class='del'>-                return -1;</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	memcpy (str, data-&gt;data, data-&gt;len);</div><div class='del'>-	str[data-&gt;len] = '\0';</div><div class='add'>+int</div><div class='add'>+dict_remove_foreach_fn(dict_t *d, char *k, data_t *v, void *_tmp)</div><div class='add'>+{</div><div class='add'>+    if (!d || !k) {</div><div class='add'>+        gf_smsg("glusterfs", GF_LOG_WARNING, EINVAL, LG_MSG_KEY_OR_VALUE_NULL,</div><div class='add'>+                "d=%s", d ? "key" : "dictionary", NULL);</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	return strtol (str, NULL, 0);</div><div class='add'>+    dict_del(d, k);</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-uint16_t</div><div class='del'>-data_to_uint16 (data_t *data)</div><div class='add'>+gf_boolean_t</div><div class='add'>+dict_match_everything(dict_t *d, char *k, data_t *v, void *data)</div><div class='ctx'> {</div><div class='del'>-	if (!data)</div><div class='del'>-		return -1;</div><div class='add'>+    return _gf_true;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	char *str = alloca (data-&gt;len + 1);</div><div class='del'>-        if (!str)</div><div class='del'>-                return -1;</div><div class='add'>+int</div><div class='add'>+dict_foreach(dict_t *dict,</div><div class='add'>+             int (*fn)(dict_t *this, char *key, data_t *value, void *data),</div><div class='add'>+             void *data)</div><div class='add'>+{</div><div class='add'>+    int ret = dict_foreach_match(dict, dict_match_everything, NULL, fn, data);</div><div class='ctx'> </div><div class='del'>-	memcpy (str, data-&gt;data, data-&gt;len);</div><div class='del'>-	str[data-&gt;len] = '\0';</div><div class='add'>+    if (ret &gt; 0)</div><div class='add'>+        ret = 0;</div><div class='ctx'> </div><div class='del'>-	return strtol (str, NULL, 0);</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-char *</div><div class='del'>-data_to_str (data_t *data)</div><div class='del'>-{</div><div class='del'>-	if (!data) {</div><div class='del'>-		gf_log ("dict", GF_LOG_CRITICAL,</div><div class='del'>-			"@data=%p", data);</div><div class='del'>-		return NULL;</div><div class='del'>-	}</div><div class='del'>-	return data-&gt;data;</div><div class='add'>+/* return values:</div><div class='add'>+   -1 = failure,</div><div class='add'>+    0 = no matches found,</div><div class='add'>+   +n = n number of matches</div><div class='add'>+*/</div><div class='add'>+int</div><div class='add'>+dict_foreach_match(dict_t *dict,</div><div class='add'>+                   gf_boolean_t (*match)(dict_t *this, char *key, data_t *value,</div><div class='add'>+                                         void *mdata),</div><div class='add'>+                   void *match_data,</div><div class='add'>+                   int (*action)(dict_t *this, char *key, data_t *value,</div><div class='add'>+                                 void *adata),</div><div class='add'>+                   void *action_data)</div><div class='add'>+{</div><div class='add'>+    if (!dict || !match || !action) {</div><div class='add'>+        gf_msg_callingfn("dict", GF_LOG_WARNING, EINVAL, LG_MSG_INVALID_ARG,</div><div class='add'>+                         "dict|match|action is "</div><div class='add'>+                         "NULL");</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int count = 0;</div><div class='add'>+    data_pair_t *pairs = dict-&gt;members_list;</div><div class='add'>+    data_pair_t *next = NULL;</div><div class='add'>+</div><div class='add'>+    while (pairs) {</div><div class='add'>+        next = pairs-&gt;next;</div><div class='add'>+        if (match(dict, pairs-&gt;key, pairs-&gt;value, match_data)) {</div><div class='add'>+            ret = action(dict, pairs-&gt;key, pairs-&gt;value, action_data);</div><div class='add'>+            if (ret &lt; 0)</div><div class='add'>+                return ret;</div><div class='add'>+            count++;</div><div class='add'>+        }</div><div class='add'>+        pairs = next;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return count;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-void *</div><div class='del'>-data_to_ptr (data_t *data)</div><div class='add'>+static gf_boolean_t</div><div class='add'>+dict_fnmatch(dict_t *d, char *k, data_t *val, void *match_data)</div><div class='ctx'> {</div><div class='del'>-	if (!data) {</div><div class='del'>-		return NULL;</div><div class='del'>-	}</div><div class='del'>-	return data-&gt;data;</div><div class='add'>+    return (fnmatch(match_data, k, 0) == 0);</div><div class='ctx'> }</div><div class='del'>-</div><div class='del'>-void *</div><div class='del'>-data_to_bin (data_t *data)</div><div class='add'>+/* return values:</div><div class='add'>+   -1 = failure,</div><div class='add'>+    0 = no matches found,</div><div class='add'>+   +n = n number of matches</div><div class='add'>+*/</div><div class='add'>+int</div><div class='add'>+dict_foreach_fnmatch(dict_t *dict, char *pattern,</div><div class='add'>+                     int (*fn)(dict_t *this, char *key, data_t *value,</div><div class='add'>+                               void *data),</div><div class='add'>+                     void *data)</div><div class='ctx'> {</div><div class='del'>-	if (!data) {</div><div class='del'>-		gf_log ("dict", GF_LOG_CRITICAL,</div><div class='del'>-			"@data=%p", data);</div><div class='del'>-		return NULL;</div><div class='del'>-	}</div><div class='del'>-	return data-&gt;data;</div><div class='add'>+    return dict_foreach_match(dict, dict_fnmatch, pattern, fn, data);</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-void</div><div class='del'>-dict_foreach (dict_t *dict,</div><div class='del'>-	      void (*fn)(dict_t *this,</div><div class='del'>-			 char *key,</div><div class='del'>-			 data_t *value,</div><div class='del'>-			 void *data),</div><div class='del'>-	      void *data)</div><div class='add'>+/**</div><div class='add'>+ * dict_keys_join - pack the keys of the dictionary in a buffer.</div><div class='add'>+ *</div><div class='add'>+ * @value     : buffer in which the keys will be packed (can be NULL)</div><div class='add'>+ * @size      : size of the buffer which is sent (can be 0, in which case buffer</div><div class='add'>+ *              is not packed but only length is returned)</div><div class='add'>+ * @dict      : dictionary of which all the keys will be packed</div><div class='add'>+ * @filter_fn : keys matched in filter_fn() is counted.</div><div class='add'>+ *</div><div class='add'>+ * @return : @length of string after joining keys.</div><div class='add'>+ *</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+dict_keys_join(void *value, int size, dict_t *dict, int (*filter_fn)(char *k))</div><div class='ctx'> {</div><div class='del'>-	if (!data) {</div><div class='del'>-		gf_log ("dict", GF_LOG_CRITICAL,</div><div class='del'>-			"@data=%p", data);</div><div class='del'>-		return;</div><div class='del'>-	}</div><div class='add'>+    int len = 0;</div><div class='add'>+    data_pair_t *pairs = dict-&gt;members_list;</div><div class='add'>+    data_pair_t *next = NULL;</div><div class='ctx'> </div><div class='del'>-	data_pair_t *pairs = dict-&gt;members_list;</div><div class='add'>+    while (pairs) {</div><div class='add'>+        next = pairs-&gt;next;</div><div class='ctx'> </div><div class='del'>-	while (pairs) {</div><div class='del'>-		fn (dict, pairs-&gt;key, pairs-&gt;value, data);</div><div class='del'>-		pairs = pairs-&gt;next;</div><div class='del'>-	}</div><div class='del'>-}</div><div class='add'>+        if (filter_fn &amp;&amp; filter_fn(pairs-&gt;key)) {</div><div class='add'>+            pairs = next;</div><div class='add'>+            continue;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='add'>+        if (value &amp;&amp; (size &gt; len))</div><div class='add'>+            strncpy(value + len, pairs-&gt;key, size - len);</div><div class='ctx'> </div><div class='del'>-static void</div><div class='del'>-_copy (dict_t *unused,</div><div class='del'>-       char *key,</div><div class='del'>-       data_t *value,</div><div class='del'>-       void *newdict)</div><div class='del'>-{</div><div class='del'>-	dict_set ((dict_t *)newdict, key, (value));</div><div class='add'>+        len += (strlen(pairs-&gt;key) + 1);</div><div class='add'>+</div><div class='add'>+        pairs = next;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return len;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+static int</div><div class='add'>+dict_copy_one(dict_t *unused, char *key, data_t *value, void *newdict)</div><div class='add'>+{</div><div class='add'>+    return dict_set((dict_t *)newdict, key, (value));</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> dict_t *</div><div class='del'>-dict_copy (dict_t *dict,</div><div class='del'>-	   dict_t *new)</div><div class='add'>+dict_copy(dict_t *dict, dict_t *new)</div><div class='ctx'> {</div><div class='del'>-	if (!dict) {</div><div class='del'>-		gf_log ("dict", GF_LOG_CRITICAL,</div><div class='del'>-			"@data=%p", dict);</div><div class='del'>-		return NULL;</div><div class='del'>-	}</div><div class='add'>+    if (!dict) {</div><div class='add'>+        gf_msg_callingfn("dict", GF_LOG_WARNING, EINVAL, LG_MSG_INVALID_ARG,</div><div class='add'>+                         "dict is NULL");</div><div class='add'>+        return NULL;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	if (!new)</div><div class='del'>-		new = get_new_dict_full (dict-&gt;hash_size);</div><div class='add'>+    if (!new)</div><div class='add'>+        new = get_new_dict_full(dict-&gt;hash_size);</div><div class='ctx'> </div><div class='del'>-	dict_foreach (dict, _copy, new);</div><div class='add'>+    dict_foreach(dict, dict_copy_one, new);</div><div class='add'>+</div><div class='add'>+    return new;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	return new;</div><div class='add'>+int</div><div class='add'>+dict_reset(dict_t *dict)</div><div class='add'>+{</div><div class='add'>+    int32_t ret = -1;</div><div class='add'>+    if (!dict) {</div><div class='add'>+        gf_msg_callingfn("dict", GF_LOG_WARNING, EINVAL, LG_MSG_INVALID_ARG,</div><div class='add'>+                         "dict is NULL");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    dict_foreach(dict, dict_remove_foreach_fn, NULL);</div><div class='add'>+    ret = 0;</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> dict_t *</div><div class='del'>-dict_copy_with_ref (dict_t *dict,</div><div class='del'>-		    dict_t *new)</div><div class='add'>+dict_copy_with_ref(dict_t *dict, dict_t *new)</div><div class='ctx'> {</div><div class='del'>-	dict_t *local_new = NULL;</div><div class='add'>+    dict_t *local_new = NULL;</div><div class='ctx'> </div><div class='del'>-	GF_VALIDATE_OR_GOTO("dict", dict, fail);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("dict", dict, fail);</div><div class='ctx'> </div><div class='del'>-	if (new == NULL) {</div><div class='del'>-		local_new = dict_new ();</div><div class='del'>-		GF_VALIDATE_OR_GOTO("dict", local_new, fail);</div><div class='del'>-		new = local_new;</div><div class='del'>-	}</div><div class='add'>+    if (new == NULL) {</div><div class='add'>+        local_new = dict_new();</div><div class='add'>+        GF_VALIDATE_OR_GOTO("dict", local_new, fail);</div><div class='add'>+        new = local_new;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	dict_foreach (dict, _copy, new);</div><div class='add'>+    dict_foreach(dict, dict_copy_one, new);</div><div class='ctx'> fail:</div><div class='del'>-	return new;</div><div class='add'>+    return new;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> /*</div><div class='hunk'>@@ -1279,850 +1490,1392 @@ fail:</div><div class='ctx'> </div><div class='ctx'> /**</div><div class='ctx'>  * Common cleaned up interface:</div><div class='del'>- * </div><div class='add'>+ *</div><div class='ctx'>  * Return value:  0   success</div><div class='ctx'>  *               -val error, val = errno</div><div class='ctx'>  */</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> static int</div><div class='del'>-dict_get_with_ref (dict_t *this, char *key, data_t **data)</div><div class='add'>+dict_get_with_refn(dict_t *this, char *key, const int keylen, data_t **data)</div><div class='ctx'> {</div><div class='del'>-	data_pair_t * pair = NULL;</div><div class='del'>-	int           ret  = -ENOENT;</div><div class='add'>+    data_pair_t *pair = NULL;</div><div class='add'>+    int ret = -ENOENT;</div><div class='add'>+    uint32_t hash;</div><div class='ctx'> </div><div class='del'>-	if (!this || !key || !data) {</div><div class='del'>-		ret = -EINVAL;</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='add'>+    hash = (uint32_t)XXH64(key, keylen, 0);</div><div class='ctx'> </div><div class='del'>-	LOCK (&amp;this-&gt;lock);</div><div class='del'>-	{</div><div class='del'>-		pair = _dict_lookup (this, key);</div><div class='del'>-	}</div><div class='del'>-	UNLOCK (&amp;this-&gt;lock);</div><div class='add'>+    LOCK(&amp;this-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        pair = dict_lookup_common(this, key, hash);</div><div class='ctx'> </div><div class='del'>-	if (pair) {</div><div class='del'>-		ret = 0;</div><div class='del'>-		*data = data_ref (pair-&gt;value);</div><div class='del'>-	}</div><div class='add'>+        if (pair) {</div><div class='add'>+            ret = 0;</div><div class='add'>+            *data = data_ref(pair-&gt;value);</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    UNLOCK(&amp;this-&gt;lock);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+dict_get_with_ref(dict_t *this, char *key, data_t **data)</div><div class='add'>+{</div><div class='add'>+    if (!this || !key || !data) {</div><div class='add'>+        gf_msg_callingfn("dict", GF_LOG_WARNING, EINVAL, LG_MSG_INVALID_ARG,</div><div class='add'>+                         "dict OR key (%s) is NULL", key);</div><div class='add'>+        return -EINVAL;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-err:  </div><div class='del'>-	return ret;</div><div class='add'>+    return dict_get_with_refn(this, key, strlen(key), data);</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> static int</div><div class='del'>-_data_to_ptr (data_t *data, void **val)</div><div class='add'>+data_to_ptr_common(data_t *data, void **val)</div><div class='ctx'> {</div><div class='del'>-	int ret = 0;</div><div class='add'>+    int ret = 0;</div><div class='ctx'> </div><div class='del'>-	if (!data) {</div><div class='del'>-		ret = -EINVAL;</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='add'>+    if (!data) {</div><div class='add'>+        ret = -EINVAL;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	*val = data-&gt;data;</div><div class='add'>+    *val = data-&gt;data;</div><div class='ctx'> err:</div><div class='del'>-	return ret;</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> static int</div><div class='del'>-_data_to_int8 (data_t *data, int8_t *val)</div><div class='add'>+data_to_int8_ptr(data_t *data, int8_t *val)</div><div class='ctx'> {</div><div class='del'>-	int    ret = 0;</div><div class='del'>-	char * str = NULL;</div><div class='del'>-</div><div class='del'>-	if (!data || !val) {</div><div class='del'>-		ret = -EINVAL;</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='add'>+    int ret = 0;</div><div class='ctx'> </div><div class='del'>-	str = alloca (data-&gt;len + 1);</div><div class='del'>-	if (!str) {</div><div class='del'>-		ret = -ENOMEM;</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='del'>-	memcpy (str, data-&gt;data, data-&gt;len);</div><div class='del'>-	str[data-&gt;len] = '\0';</div><div class='add'>+    if (!data || !val) {</div><div class='add'>+        ret = -EINVAL;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	errno = 0;</div><div class='del'>-	*val = strtol (str, NULL, 0);</div><div class='del'>-	if (errno != 0)</div><div class='del'>-		ret = -errno;</div><div class='add'>+    errno = 0;</div><div class='add'>+    *val = strtol(data-&gt;data, NULL, 0);</div><div class='add'>+    if (errno != 0)</div><div class='add'>+        ret = -errno;</div><div class='ctx'> </div><div class='ctx'> err:</div><div class='del'>-	return ret;</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> static int</div><div class='del'>-_data_to_int16 (data_t *data, int16_t *val)</div><div class='add'>+data_to_int16_ptr(data_t *data, int16_t *val)</div><div class='ctx'> {</div><div class='del'>-	int    ret = 0;</div><div class='del'>-	char * str = NULL;</div><div class='add'>+    int ret = 0;</div><div class='ctx'> </div><div class='del'>-	if (!data || !val) {</div><div class='del'>-		ret = -EINVAL;</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='add'>+    if (!data || !val) {</div><div class='add'>+        ret = -EINVAL;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	str = alloca (data-&gt;len + 1);</div><div class='del'>-	if (!str) {</div><div class='del'>-		ret = -ENOMEM;</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='del'>-	memcpy (str, data-&gt;data, data-&gt;len);</div><div class='del'>-	str[data-&gt;len] = '\0';</div><div class='del'>-</div><div class='del'>-	errno = 0;</div><div class='del'>-	*val = strtol (str, NULL, 0);</div><div class='del'>-	if (errno != 0)</div><div class='del'>-		ret = -errno;</div><div class='add'>+    errno = 0;</div><div class='add'>+    *val = strtol(data-&gt;data, NULL, 0);</div><div class='add'>+    if (errno != 0)</div><div class='add'>+        ret = -errno;</div><div class='ctx'> </div><div class='ctx'> err:</div><div class='del'>-	return ret;</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> static int</div><div class='del'>-_data_to_int32 (data_t *data, int32_t *val)</div><div class='add'>+data_to_int32_ptr(data_t *data, int32_t *val)</div><div class='ctx'> {</div><div class='del'>-	int    ret = 0;</div><div class='del'>-	char * str = NULL;</div><div class='del'>-</div><div class='del'>-	if (!data || !val) {</div><div class='del'>-		ret = -EINVAL;</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='add'>+    int ret = 0;</div><div class='ctx'> </div><div class='del'>-	str = alloca (data-&gt;len + 1);</div><div class='del'>-	if (!str) {</div><div class='del'>-		ret = -ENOMEM;</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='del'>-	memcpy (str, data-&gt;data, data-&gt;len);</div><div class='del'>-	str[data-&gt;len] = '\0';</div><div class='add'>+    if (!data || !val) {</div><div class='add'>+        ret = -EINVAL;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	errno = 0;</div><div class='del'>-	*val = strtol (str, NULL, 0);</div><div class='del'>-	if (errno != 0)</div><div class='del'>-		ret = -errno;</div><div class='add'>+    errno = 0;</div><div class='add'>+    *val = strtol(data-&gt;data, NULL, 0);</div><div class='add'>+    if (errno != 0)</div><div class='add'>+        ret = -errno;</div><div class='ctx'> </div><div class='ctx'> err:</div><div class='del'>-	return ret;</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> static int</div><div class='del'>-_data_to_int64 (data_t *data, int64_t *val)</div><div class='add'>+data_to_int64_ptr(data_t *data, int64_t *val)</div><div class='ctx'> {</div><div class='del'>-	int    ret = 0;</div><div class='del'>-	char * str = NULL;</div><div class='add'>+    int ret = 0;</div><div class='ctx'> </div><div class='del'>-	if (!data || !val) {</div><div class='del'>-		ret = -EINVAL;</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='add'>+    if (!data || !val) {</div><div class='add'>+        ret = -EINVAL;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	str = alloca (data-&gt;len + 1);</div><div class='del'>-	if (!str) {</div><div class='del'>-		ret = -ENOMEM;</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='del'>-	memcpy (str, data-&gt;data, data-&gt;len);</div><div class='del'>-	str[data-&gt;len] = '\0';</div><div class='del'>-</div><div class='del'>-	errno = 0;</div><div class='del'>-	*val = strtoll (str, NULL, 0);</div><div class='del'>-	if (errno != 0)</div><div class='del'>-		ret = -errno;</div><div class='add'>+    errno = 0;</div><div class='add'>+    *val = strtoll(data-&gt;data, NULL, 0);</div><div class='add'>+    if (errno != 0)</div><div class='add'>+        ret = -errno;</div><div class='ctx'> </div><div class='ctx'> err:</div><div class='del'>-	return ret;</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> static int</div><div class='del'>-_data_to_uint16 (data_t *data, uint16_t *val)</div><div class='add'>+data_to_uint16_ptr(data_t *data, uint16_t *val)</div><div class='ctx'> {</div><div class='del'>-	int    ret = 0;</div><div class='del'>-	char * str = NULL;</div><div class='del'>-</div><div class='del'>-	if (!data || !val) {</div><div class='del'>-		ret = -EINVAL;</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='add'>+    int ret = 0;</div><div class='ctx'> </div><div class='del'>-	str = alloca (data-&gt;len + 1);</div><div class='del'>-	if (!str) {</div><div class='del'>-		ret = -ENOMEM;</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='del'>-	memcpy (str, data-&gt;data, data-&gt;len);</div><div class='del'>-	str[data-&gt;len] = '\0';</div><div class='add'>+    if (!data || !val) {</div><div class='add'>+        ret = -EINVAL;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	errno = 0;</div><div class='del'>-	*val = strtoul (str, NULL, 0);</div><div class='del'>-	if (errno != 0)</div><div class='del'>-		ret = -errno;</div><div class='add'>+    errno = 0;</div><div class='add'>+    *val = strtoul(data-&gt;data, NULL, 0);</div><div class='add'>+    if (errno != 0)</div><div class='add'>+        ret = -errno;</div><div class='ctx'> </div><div class='ctx'> err:</div><div class='del'>-	return ret;</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> static int</div><div class='del'>-_data_to_uint32 (data_t *data, uint32_t *val)</div><div class='add'>+data_to_uint32_ptr(data_t *data, uint32_t *val)</div><div class='ctx'> {</div><div class='del'>-	int    ret = 0;</div><div class='del'>-	char * str = NULL;</div><div class='add'>+    int ret = 0;</div><div class='ctx'> </div><div class='del'>-	if (!data || !val) {</div><div class='del'>-		ret = -EINVAL;</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='add'>+    if (!data || !val) {</div><div class='add'>+        ret = -EINVAL;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	str = alloca (data-&gt;len + 1);</div><div class='del'>-	if (!str) {</div><div class='del'>-		ret = -ENOMEM;</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='del'>-	memcpy (str, data-&gt;data, data-&gt;len);</div><div class='del'>-	str[data-&gt;len] = '\0';</div><div class='del'>-</div><div class='del'>-	errno = 0;</div><div class='del'>-	*val = strtoul (str, NULL, 0);</div><div class='del'>-	if (errno != 0)</div><div class='del'>-		ret = -errno;</div><div class='add'>+    errno = 0;</div><div class='add'>+    *val = strtoul(data-&gt;data, NULL, 0);</div><div class='add'>+    if (errno != 0)</div><div class='add'>+        ret = -errno;</div><div class='ctx'> </div><div class='ctx'> err:</div><div class='del'>-	return ret;</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> static int</div><div class='del'>-_data_to_uint64 (data_t *data, uint64_t *val)</div><div class='add'>+data_to_uint64_ptr(data_t *data, uint64_t *val)</div><div class='ctx'> {</div><div class='del'>-	int    ret = 0;</div><div class='del'>-	char * str = NULL;</div><div class='del'>-</div><div class='del'>-	if (!data || !val) {</div><div class='del'>-		ret = -EINVAL;</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='add'>+    int ret = 0;</div><div class='ctx'> </div><div class='del'>-	str = alloca (data-&gt;len + 1);</div><div class='del'>-	if (!str) {</div><div class='del'>-		ret = -ENOMEM;</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='del'>-	memcpy (str, data-&gt;data, data-&gt;len);</div><div class='del'>-	str[data-&gt;len] = '\0';</div><div class='add'>+    if (!data || !val) {</div><div class='add'>+        ret = -EINVAL;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	errno = 0;</div><div class='del'>-	*val = strtoull (str, NULL, 0);</div><div class='del'>-	if (errno != 0)</div><div class='del'>-		ret = -errno;</div><div class='add'>+    errno = 0;</div><div class='add'>+    *val = strtoull(data-&gt;data, NULL, 0);</div><div class='add'>+    if (errno != 0)</div><div class='add'>+        ret = -errno;</div><div class='ctx'> </div><div class='ctx'> err:</div><div class='del'>-	return ret;</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> static int</div><div class='del'>-_data_to_double (data_t *data, double *val)</div><div class='add'>+data_to_double_ptr(data_t *data, double *val)</div><div class='ctx'> {</div><div class='del'>-	int    ret = 0;</div><div class='del'>-	char * str = NULL;</div><div class='add'>+    int ret = 0;</div><div class='ctx'> </div><div class='del'>-	if (!data || !val) {</div><div class='del'>-		ret = -EINVAL;</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='add'>+    if (!data || !val) {</div><div class='add'>+        ret = -EINVAL;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	str = alloca (data-&gt;len + 1);</div><div class='del'>-	if (!str) {</div><div class='del'>-		ret = -ENOMEM;</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='del'>-	memcpy (str, data-&gt;data, data-&gt;len);</div><div class='del'>-	str[data-&gt;len] = '\0';</div><div class='add'>+    errno = 0;</div><div class='add'>+    *val = strtod(data-&gt;data, NULL);</div><div class='add'>+    if (errno != 0)</div><div class='add'>+        ret = -errno;</div><div class='ctx'> </div><div class='del'>-	errno = 0;</div><div class='del'>-	*val = strtod (str, NULL);</div><div class='del'>-	if (errno != 0)</div><div class='del'>-		ret = -errno;</div><div class='add'>+err:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+dict_get_int8(dict_t *this, char *key, int8_t *val)</div><div class='add'>+{</div><div class='add'>+    data_t *data = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    if (!val) {</div><div class='add'>+        ret = -EINVAL;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_get_with_ref(this, key, &amp;data);</div><div class='add'>+    if (ret != 0) {</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    VALIDATE_DATA_AND_LOG(data, GF_DATA_TYPE_INT, key, -EINVAL);</div><div class='add'>+</div><div class='add'>+    ret = data_to_int8_ptr(data, val);</div><div class='ctx'> </div><div class='ctx'> err:</div><div class='del'>-	return ret;</div><div class='add'>+    if (data)</div><div class='add'>+        data_unref(data);</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-dict_get_int8 (dict_t *this, char *key, int8_t *val)</div><div class='add'>+dict_set_int8(dict_t *this, char *key, int8_t val)</div><div class='ctx'> {</div><div class='del'>-	data_t * data = NULL;</div><div class='del'>-	int      ret  = 0;</div><div class='add'>+    data_t *data = NULL;</div><div class='add'>+    int ret = 0;</div><div class='ctx'> </div><div class='del'>-	if (!this || !key || !val) {</div><div class='del'>-		ret = -EINVAL;</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='add'>+    data = data_from_int8(val);</div><div class='add'>+    if (!data) {</div><div class='add'>+        ret = -EINVAL;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	ret = dict_get_with_ref (this, key, &amp;data);</div><div class='del'>-	if (ret != 0) {</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='add'>+    ret = dict_set(this, key, data);</div><div class='add'>+    if (ret &lt; 0)</div><div class='add'>+        data_destroy(data);</div><div class='ctx'> </div><div class='del'>-	ret = _data_to_int8 (data, val);</div><div class='del'>-    </div><div class='ctx'> err:</div><div class='del'>-	if (data)</div><div class='del'>-		data_unref (data);</div><div class='del'>-	return ret;</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+int</div><div class='add'>+dict_get_int16(dict_t *this, char *key, int16_t *val)</div><div class='add'>+{</div><div class='add'>+    data_t *data = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    if (!val) {</div><div class='add'>+        ret = -EINVAL;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_get_with_ref(this, key, &amp;data);</div><div class='add'>+    if (ret != 0) {</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    VALIDATE_DATA_AND_LOG(data, GF_DATA_TYPE_INT, key, -EINVAL);</div><div class='add'>+</div><div class='add'>+    ret = data_to_int16_ptr(data, val);</div><div class='add'>+</div><div class='add'>+err:</div><div class='add'>+    if (data)</div><div class='add'>+        data_unref(data);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-dict_set_int8 (dict_t *this, char *key, int8_t val)</div><div class='add'>+dict_set_int16(dict_t *this, char *key, int16_t val)</div><div class='ctx'> {</div><div class='del'>-	data_t * data = NULL;</div><div class='del'>-	int      ret  = 0;</div><div class='add'>+    data_t *data = NULL;</div><div class='add'>+    int ret = 0;</div><div class='ctx'> </div><div class='del'>-	data = data_from_int8 (val);</div><div class='del'>-	if (!data) {</div><div class='del'>-		ret = -EINVAL;</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='add'>+    data = data_from_int16(val);</div><div class='add'>+    if (!data) {</div><div class='add'>+        ret = -EINVAL;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	ret = dict_set (this, key, data);</div><div class='add'>+    ret = dict_set(this, key, data);</div><div class='add'>+    if (ret &lt; 0)</div><div class='add'>+        data_destroy(data);</div><div class='ctx'> </div><div class='ctx'> err:</div><div class='del'>-	return ret;</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-dict_get_int16 (dict_t *this, char *key, int16_t *val)</div><div class='add'>+dict_get_int32n(dict_t *this, char *key, const int keylen, int32_t *val)</div><div class='ctx'> {</div><div class='del'>-	data_t * data = NULL;</div><div class='del'>-	int      ret  = 0;</div><div class='add'>+    data_t *data = NULL;</div><div class='add'>+    int ret = 0;</div><div class='ctx'> </div><div class='del'>-	if (!this || !key || !val) {</div><div class='del'>-		ret = -EINVAL;</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='add'>+    if (!this || !key || !val) {</div><div class='add'>+        ret = -EINVAL;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	ret = dict_get_with_ref (this, key, &amp;data);</div><div class='del'>-	if (ret != 0) {</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='add'>+    ret = dict_get_with_refn(this, key, keylen, &amp;data);</div><div class='add'>+    if (ret != 0) {</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    VALIDATE_DATA_AND_LOG(data, GF_DATA_TYPE_INT, key, -EINVAL);</div><div class='add'>+</div><div class='add'>+    ret = data_to_int32_ptr(data, val);</div><div class='ctx'> </div><div class='del'>-	ret = _data_to_int16 (data, val);</div><div class='del'>-    </div><div class='ctx'> err:</div><div class='del'>-	if (data)</div><div class='del'>-		data_unref (data);</div><div class='del'>-	return ret;</div><div class='add'>+    if (data)</div><div class='add'>+        data_unref(data);</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+int</div><div class='add'>+dict_get_int32(dict_t *this, char *key, int32_t *val)</div><div class='add'>+{</div><div class='add'>+    data_t *data = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    if (!val) {</div><div class='add'>+        ret = -EINVAL;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_get_with_ref(this, key, &amp;data);</div><div class='add'>+    if (ret != 0) {</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    VALIDATE_DATA_AND_LOG(data, GF_DATA_TYPE_INT, key, -EINVAL);</div><div class='add'>+</div><div class='add'>+    ret = data_to_int32_ptr(data, val);</div><div class='add'>+</div><div class='add'>+err:</div><div class='add'>+    if (data)</div><div class='add'>+        data_unref(data);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-dict_set_int16 (dict_t *this, char *key, int16_t val)</div><div class='add'>+dict_set_int32n(dict_t *this, char *key, const int keylen, int32_t val)</div><div class='ctx'> {</div><div class='del'>-	data_t * data = NULL;</div><div class='del'>-	int      ret  = 0;</div><div class='add'>+    data_t *data = NULL;</div><div class='add'>+    int ret = 0;</div><div class='ctx'> </div><div class='del'>-	data = data_from_int16 (val);</div><div class='del'>-	if (!data) {</div><div class='del'>-		ret = -EINVAL;</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='add'>+    data = data_from_int32(val);</div><div class='add'>+    if (!data) {</div><div class='add'>+        ret = -EINVAL;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	ret = dict_set (this, key, data);</div><div class='add'>+    ret = dict_setn(this, key, keylen, data);</div><div class='add'>+    if (ret &lt; 0)</div><div class='add'>+        data_destroy(data);</div><div class='ctx'> </div><div class='ctx'> err:</div><div class='del'>-	return ret;</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-dict_get_int32 (dict_t *this, char *key, int32_t *val)</div><div class='add'>+dict_set_int32(dict_t *this, char *key, int32_t val)</div><div class='ctx'> {</div><div class='del'>-	data_t * data = NULL;</div><div class='del'>-	int      ret  = 0;</div><div class='add'>+    data_t *data = data_from_int32(val);</div><div class='add'>+    int ret = 0;</div><div class='ctx'> </div><div class='del'>-	if (!this || !key || !val) {</div><div class='del'>-		ret = -EINVAL;</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='add'>+    if (!data) {</div><div class='add'>+        ret = -EINVAL;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	ret = dict_get_with_ref (this, key, &amp;data);</div><div class='del'>-	if (ret != 0) {</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='add'>+    ret = dict_set(this, key, data);</div><div class='add'>+    if (ret &lt; 0)</div><div class='add'>+        data_destroy(data);</div><div class='ctx'> </div><div class='del'>-	ret = _data_to_int32 (data, val);</div><div class='del'>-    </div><div class='ctx'> err:</div><div class='del'>-	if (data)</div><div class='del'>-		data_unref (data);</div><div class='del'>-	return ret;</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+int</div><div class='add'>+dict_get_int64(dict_t *this, char *key, int64_t *val)</div><div class='add'>+{</div><div class='add'>+    data_t *data = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    if (!val) {</div><div class='add'>+        ret = -EINVAL;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_get_with_ref(this, key, &amp;data);</div><div class='add'>+    if (ret != 0) {</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    VALIDATE_DATA_AND_LOG(data, GF_DATA_TYPE_INT, key, -EINVAL);</div><div class='add'>+</div><div class='add'>+    ret = data_to_int64_ptr(data, val);</div><div class='add'>+</div><div class='add'>+err:</div><div class='add'>+    if (data)</div><div class='add'>+        data_unref(data);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-dict_set_int32 (dict_t *this, char *key, int32_t val)</div><div class='add'>+dict_set_int64(dict_t *this, char *key, int64_t val)</div><div class='ctx'> {</div><div class='del'>-	data_t * data = NULL;</div><div class='del'>-	int      ret  = 0;</div><div class='add'>+    data_t *data = data_from_int64(val);</div><div class='add'>+    int ret = 0;</div><div class='ctx'> </div><div class='del'>-	data = data_from_int32 (val);</div><div class='del'>-	if (!data) {</div><div class='del'>-		ret = -EINVAL;</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='add'>+    if (!data) {</div><div class='add'>+        ret = -EINVAL;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	ret = dict_set (this, key, data);</div><div class='add'>+    ret = dict_set(this, key, data);</div><div class='add'>+    if (ret &lt; 0)</div><div class='add'>+        data_destroy(data);</div><div class='ctx'> </div><div class='ctx'> err:</div><div class='del'>-	return ret;</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-dict_get_int64 (dict_t *this, char *key, int64_t *val)</div><div class='add'>+dict_get_uint16(dict_t *this, char *key, uint16_t *val)</div><div class='ctx'> {</div><div class='del'>-	data_t * data = NULL;</div><div class='del'>-	int      ret  = 0;</div><div class='add'>+    data_t *data = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    if (!val) {</div><div class='add'>+        ret = -EINVAL;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	if (!this || !key || !val) {</div><div class='del'>-		ret = -EINVAL;</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='add'>+    ret = dict_get_with_ref(this, key, &amp;data);</div><div class='add'>+    if (ret != 0) {</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	ret = dict_get_with_ref (this, key, &amp;data);</div><div class='del'>-	if (ret != 0) {</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='add'>+    VALIDATE_DATA_AND_LOG(data, GF_DATA_TYPE_UINT, key, -EINVAL);</div><div class='add'>+</div><div class='add'>+    ret = data_to_uint16_ptr(data, val);</div><div class='ctx'> </div><div class='del'>-	ret = _data_to_int64 (data, val);</div><div class='del'>-    </div><div class='ctx'> err:</div><div class='del'>-	if (data)</div><div class='del'>-		data_unref (data);</div><div class='del'>-	return ret;</div><div class='add'>+    if (data)</div><div class='add'>+        data_unref(data);</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+int</div><div class='add'>+dict_set_uint16(dict_t *this, char *key, uint16_t val)</div><div class='add'>+{</div><div class='add'>+    data_t *data = data_from_uint16(val);</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    if (!data) {</div><div class='add'>+        ret = -EINVAL;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_set(this, key, data);</div><div class='add'>+    if (ret &lt; 0)</div><div class='add'>+        data_destroy(data);</div><div class='add'>+</div><div class='add'>+err:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-dict_set_int64 (dict_t *this, char *key, int64_t val)</div><div class='add'>+dict_get_uint32(dict_t *this, char *key, uint32_t *val)</div><div class='ctx'> {</div><div class='del'>-	data_t * data = NULL;</div><div class='del'>-	int      ret  = 0;</div><div class='add'>+    data_t *data = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    if (!val) {</div><div class='add'>+        ret = -EINVAL;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_get_with_ref(this, key, &amp;data);</div><div class='add'>+    if (ret != 0) {</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	data = data_from_int64 (val);</div><div class='del'>-	if (!data) {</div><div class='del'>-		ret = -EINVAL;</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='add'>+    VALIDATE_DATA_AND_LOG(data, GF_DATA_TYPE_UINT, key, -EINVAL);</div><div class='ctx'> </div><div class='del'>-	ret = dict_set (this, key, data);</div><div class='add'>+    ret = data_to_uint32_ptr(data, val);</div><div class='ctx'> </div><div class='ctx'> err:</div><div class='del'>-	return ret;</div><div class='add'>+    if (data)</div><div class='add'>+        data_unref(data);</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-dict_get_uint16 (dict_t *this, char *key, uint16_t *val)</div><div class='add'>+dict_set_uint32(dict_t *this, char *key, uint32_t val)</div><div class='ctx'> {</div><div class='del'>-	data_t * data = NULL;</div><div class='del'>-	int      ret  = 0;</div><div class='add'>+    data_t *data = data_from_uint32(val);</div><div class='add'>+    int ret = 0;</div><div class='ctx'> </div><div class='del'>-	if (!this || !key || !val) {</div><div class='del'>-		ret = -EINVAL;</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='add'>+    if (!data) {</div><div class='add'>+        ret = -EINVAL;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	ret = dict_get_with_ref (this, key, &amp;data);</div><div class='del'>-	if (ret != 0) {</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='add'>+    ret = dict_set(this, key, data);</div><div class='add'>+    if (ret &lt; 0)</div><div class='add'>+        data_destroy(data);</div><div class='ctx'> </div><div class='del'>-	ret = _data_to_uint16 (data, val);</div><div class='del'>-    </div><div class='ctx'> err:</div><div class='del'>-	if (data)</div><div class='del'>-		data_unref (data);</div><div class='del'>-	return ret;</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+int</div><div class='add'>+dict_get_uint64(dict_t *this, char *key, uint64_t *val)</div><div class='add'>+{</div><div class='add'>+    data_t *data = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    if (!val) {</div><div class='add'>+        ret = -EINVAL;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_get_with_ref(this, key, &amp;data);</div><div class='add'>+    if (ret != 0) {</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    VALIDATE_DATA_AND_LOG(data, GF_DATA_TYPE_UINT, key, -EINVAL);</div><div class='add'>+</div><div class='add'>+    ret = data_to_uint64_ptr(data, val);</div><div class='add'>+</div><div class='add'>+err:</div><div class='add'>+    if (data)</div><div class='add'>+        data_unref(data);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-dict_set_uint16 (dict_t *this, char *key, uint16_t val)</div><div class='add'>+dict_set_uint64(dict_t *this, char *key, uint64_t val)</div><div class='ctx'> {</div><div class='del'>-	data_t * data = NULL;</div><div class='del'>-	int      ret  = 0;</div><div class='add'>+    data_t *data = data_from_uint64(val);</div><div class='add'>+    int ret = 0;</div><div class='ctx'> </div><div class='del'>-	data = data_from_uint16 (val);</div><div class='del'>-	if (!data) {</div><div class='del'>-		ret = -EINVAL;</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='add'>+    if (!data) {</div><div class='add'>+        ret = -EINVAL;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	ret = dict_set (this, key, data);</div><div class='add'>+    ret = dict_set(this, key, data);</div><div class='add'>+    if (ret &lt; 0)</div><div class='add'>+        data_destroy(data);</div><div class='ctx'> </div><div class='ctx'> err:</div><div class='del'>-	return ret;</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+/*</div><div class='add'>+ * dict_check_flag can be used to check a one bit flag in an array of flags</div><div class='add'>+ * The flag argument indicates the bit position (within the array of bits).</div><div class='add'>+ * Currently limited to max of 256 flags for a key.</div><div class='add'>+ * return value,</div><div class='add'>+ * 1 : flag is set</div><div class='add'>+ * 0 : flag is not set</div><div class='add'>+ * &lt;0: Error</div><div class='add'>+ */</div><div class='ctx'> int</div><div class='del'>-dict_get_uint32 (dict_t *this, char *key, uint32_t *val)</div><div class='add'>+dict_check_flag(dict_t *this, char *key, int flag)</div><div class='ctx'> {</div><div class='del'>-	data_t * data = NULL;</div><div class='del'>-	int      ret  = 0;</div><div class='add'>+    data_t *data = NULL;</div><div class='add'>+    int ret = -ENOENT;</div><div class='add'>+</div><div class='add'>+    ret = dict_get_with_ref(this, key, &amp;data);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        return ret;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	if (!this || !key || !val) {</div><div class='del'>-		ret = -EINVAL;</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='add'>+    if (BIT_VALUE((unsigned char *)(data-&gt;data), flag))</div><div class='add'>+        ret = 1;</div><div class='add'>+    else</div><div class='add'>+        ret = 0;</div><div class='add'>+</div><div class='add'>+    data_unref(data);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+ * _dict_modify_flag can be used to set/clear a bit flag in an array of flags</div><div class='add'>+ * flag: indicates the bit position. limited to max of DICT_MAX_FLAGS.</div><div class='add'>+ * op: Indicates operation DICT_FLAG_SET / DICT_FLAG_CLEAR</div><div class='add'>+ */</div><div class='add'>+static int</div><div class='add'>+_dict_modify_flag(dict_t *this, char *key, int flag, int op)</div><div class='add'>+{</div><div class='add'>+    data_t *data = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    data_pair_t *pair = NULL;</div><div class='add'>+    char *ptr = NULL;</div><div class='add'>+    int hashval = 0;</div><div class='add'>+    uint32_t hash;</div><div class='add'>+</div><div class='add'>+    if (!this || !key) {</div><div class='add'>+        gf_msg_callingfn("dict", GF_LOG_WARNING, EINVAL, LG_MSG_INVALID_ARG,</div><div class='add'>+                         "dict OR key (%s) is NULL", key);</div><div class='add'>+        ret = -EINVAL;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /*</div><div class='add'>+     * Using a size of 32 bytes to support max of 256</div><div class='add'>+     * flags in a single key. This should be suffcient.</div><div class='add'>+     */</div><div class='add'>+    GF_ASSERT(flag &gt;= 0 &amp;&amp; flag &lt; DICT_MAX_FLAGS);</div><div class='add'>+</div><div class='add'>+    hash = (uint32_t)XXH64(key, strlen(key), 0);</div><div class='add'>+    LOCK(&amp;this-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        pair = dict_lookup_common(this, key, hash);</div><div class='add'>+</div><div class='add'>+        if (pair) {</div><div class='add'>+            data = pair-&gt;value;</div><div class='add'>+            if (op == DICT_FLAG_SET)</div><div class='add'>+                BIT_SET((unsigned char *)(data-&gt;data), flag);</div><div class='add'>+            else</div><div class='add'>+                BIT_CLEAR((unsigned char *)(data-&gt;data), flag);</div><div class='add'>+        } else {</div><div class='add'>+            ptr = GF_CALLOC(1, DICT_MAX_FLAGS / 8, gf_common_mt_char);</div><div class='add'>+            if (!ptr) {</div><div class='add'>+                gf_smsg("dict", GF_LOG_ERROR, ENOMEM, LG_MSG_NO_MEMORY,</div><div class='add'>+                        "flag bit array", NULL);</div><div class='add'>+                ret = -ENOMEM;</div><div class='add'>+                goto err;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            data = data_from_dynptr(ptr, DICT_MAX_FLAGS / 8);</div><div class='add'>+</div><div class='add'>+            if (!data) {</div><div class='add'>+                gf_smsg("dict", GF_LOG_ERROR, ENOMEM, LG_MSG_NO_MEMORY, "data",</div><div class='add'>+                        NULL);</div><div class='add'>+                GF_FREE(ptr);</div><div class='add'>+                ret = -ENOMEM;</div><div class='add'>+                goto err;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            if (op == DICT_FLAG_SET)</div><div class='add'>+                BIT_SET((unsigned char *)(data-&gt;data), flag);</div><div class='add'>+            else</div><div class='add'>+                BIT_CLEAR((unsigned char *)(data-&gt;data), flag);</div><div class='add'>+</div><div class='add'>+            if (this-&gt;free_pair.key) { /* the free pair is in use */</div><div class='add'>+                pair = mem_get0(THIS-&gt;ctx-&gt;dict_pair_pool);</div><div class='add'>+                if (!pair) {</div><div class='add'>+                    gf_smsg("dict", GF_LOG_ERROR, ENOMEM, LG_MSG_NO_MEMORY,</div><div class='add'>+                            "dict pair", NULL);</div><div class='add'>+                    ret = -ENOMEM;</div><div class='add'>+                    goto err;</div><div class='add'>+                }</div><div class='add'>+            } else { /* use the free pair */</div><div class='add'>+                pair = &amp;this-&gt;free_pair;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            pair-&gt;key = (char *)GF_MALLOC(strlen(key) + 1, gf_common_mt_char);</div><div class='add'>+            if (!pair-&gt;key) {</div><div class='add'>+                gf_smsg("dict", GF_LOG_ERROR, ENOMEM, LG_MSG_NO_MEMORY,</div><div class='add'>+                        "dict pair", NULL);</div><div class='add'>+                ret = -ENOMEM;</div><div class='add'>+                goto err;</div><div class='add'>+            }</div><div class='add'>+            strcpy(pair-&gt;key, key);</div><div class='add'>+            pair-&gt;key_hash = hash;</div><div class='add'>+            pair-&gt;value = data_ref(data);</div><div class='add'>+            this-&gt;totkvlen += (strlen(key) + 1 + data-&gt;len);</div><div class='add'>+            hashval = hash % this-&gt;hash_size;</div><div class='add'>+            pair-&gt;hash_next = this-&gt;members[hashval];</div><div class='add'>+            this-&gt;members[hashval] = pair;</div><div class='add'>+</div><div class='add'>+            pair-&gt;next = this-&gt;members_list;</div><div class='add'>+            pair-&gt;prev = NULL;</div><div class='add'>+            if (this-&gt;members_list)</div><div class='add'>+                this-&gt;members_list-&gt;prev = pair;</div><div class='add'>+            this-&gt;members_list = pair;</div><div class='add'>+            this-&gt;count++;</div><div class='add'>+</div><div class='add'>+            if (this-&gt;max_count &lt; this-&gt;count)</div><div class='add'>+                this-&gt;max_count = this-&gt;count;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	ret = dict_get_with_ref (this, key, &amp;data);</div><div class='del'>-	if (ret != 0) {</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='add'>+    UNLOCK(&amp;this-&gt;lock);</div><div class='add'>+    return 0;</div><div class='ctx'> </div><div class='del'>-	ret = _data_to_uint32 (data, val);</div><div class='del'>-    </div><div class='ctx'> err:</div><div class='del'>-	if (data)</div><div class='del'>-		data_unref (data);</div><div class='del'>-	return ret;</div><div class='add'>+    if (key &amp;&amp; this)</div><div class='add'>+        UNLOCK(&amp;this-&gt;lock);</div><div class='add'>+</div><div class='add'>+    if (pair) {</div><div class='add'>+        if (pair-&gt;key) {</div><div class='add'>+            GF_FREE(pair-&gt;key);</div><div class='add'>+            pair-&gt;key = NULL;</div><div class='add'>+        }</div><div class='add'>+        if (pair != &amp;this-&gt;free_pair) {</div><div class='add'>+            mem_put(pair);</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (data)</div><div class='add'>+        data_destroy(data);</div><div class='add'>+</div><div class='add'>+    gf_smsg("dict", GF_LOG_ERROR, EINVAL, LG_MSG_DICT_SET_FAILED, "key=%s", key,</div><div class='add'>+            NULL);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+/*</div><div class='add'>+ * Todo:</div><div class='add'>+ * Add below primitives as needed:</div><div class='add'>+ * dict_check_flags(this, key, flag...): variadic function to check</div><div class='add'>+ *                                       multiple flags at a time.</div><div class='add'>+ * dict_set_flags(this, key, flag...): set multiple flags</div><div class='add'>+ * dict_clear_flags(this, key, flag...): reset multiple flags</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+dict_set_flag(dict_t *this, char *key, int flag)</div><div class='add'>+{</div><div class='add'>+    return _dict_modify_flag(this, key, flag, DICT_FLAG_SET);</div><div class='add'>+}</div><div class='ctx'> </div><div class='add'>+int</div><div class='add'>+dict_clear_flag(dict_t *this, char *key, int flag)</div><div class='add'>+{</div><div class='add'>+    return _dict_modify_flag(this, key, flag, DICT_FLAG_CLEAR);</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-dict_set_uint32 (dict_t *this, char *key, uint32_t val)</div><div class='add'>+dict_get_double(dict_t *this, char *key, double *val)</div><div class='ctx'> {</div><div class='del'>-	data_t * data = NULL;</div><div class='del'>-	int      ret  = 0;</div><div class='add'>+    data_t *data = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    if (!val) {</div><div class='add'>+        ret = -EINVAL;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	data = data_from_uint32 (val);</div><div class='del'>-	if (!data) {</div><div class='del'>-		ret = -EINVAL;</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='add'>+    ret = dict_get_with_ref(this, key, &amp;data);</div><div class='add'>+    if (ret != 0) {</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	ret = dict_set (this, key, data);</div><div class='add'>+    VALIDATE_DATA_AND_LOG(data, GF_DATA_TYPE_DOUBLE, key, -EINVAL);</div><div class='add'>+</div><div class='add'>+    ret = data_to_double_ptr(data, val);</div><div class='ctx'> </div><div class='ctx'> err:</div><div class='del'>-	return ret;</div><div class='add'>+    if (data)</div><div class='add'>+        data_unref(data);</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-dict_get_uint64 (dict_t *this, char *key, uint64_t *val)</div><div class='add'>+dict_set_double(dict_t *this, char *key, double val)</div><div class='ctx'> {</div><div class='del'>-	data_t * data = NULL;</div><div class='del'>-	int      ret  = 0;</div><div class='add'>+    data_t *data = data_from_double(val);</div><div class='add'>+    int ret = 0;</div><div class='ctx'> </div><div class='del'>-	if (!this || !key || !val) {</div><div class='del'>-		ret = -EINVAL;</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='add'>+    if (!data) {</div><div class='add'>+        ret = -EINVAL;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	ret = dict_get_with_ref (this, key, &amp;data);</div><div class='del'>-	if (ret != 0) {</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='add'>+    ret = dict_set(this, key, data);</div><div class='add'>+    if (ret &lt; 0)</div><div class='add'>+        data_destroy(data);</div><div class='ctx'> </div><div class='del'>-	ret = _data_to_uint64 (data, val);</div><div class='del'>-    </div><div class='ctx'> err:</div><div class='del'>-	if (data)</div><div class='del'>-		data_unref (data);</div><div class='del'>-	return ret;</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+int</div><div class='add'>+dict_set_static_ptr(dict_t *this, char *key, void *ptr)</div><div class='add'>+{</div><div class='add'>+    data_t *data = data_from_ptr_common(ptr, _gf_true);</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    if (!data) {</div><div class='add'>+        ret = -EINVAL;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_set(this, key, data);</div><div class='add'>+    if (ret &lt; 0)</div><div class='add'>+        data_destroy(data);</div><div class='add'>+</div><div class='add'>+err:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-dict_set_uint64 (dict_t *this, char *key, uint64_t val)</div><div class='add'>+dict_set_dynptr(dict_t *this, char *key, void *ptr, size_t len)</div><div class='ctx'> {</div><div class='del'>-	data_t * data = NULL;</div><div class='del'>-	int      ret  = 0;</div><div class='add'>+    data_t *data = data_from_dynptr(ptr, len);</div><div class='add'>+    int ret = 0;</div><div class='ctx'> </div><div class='del'>-	data = data_from_uint64 (val);</div><div class='del'>-	if (!data) {</div><div class='del'>-		ret = -EINVAL;</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='add'>+    if (!data) {</div><div class='add'>+        ret = -EINVAL;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	ret = dict_set (this, key, data);</div><div class='add'>+    ret = dict_set(this, key, data);</div><div class='add'>+    if (ret &lt; 0)</div><div class='add'>+        data_destroy(data);</div><div class='ctx'> </div><div class='ctx'> err:</div><div class='del'>-	return ret;</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-dict_get_double (dict_t *this, char *key, double *val)</div><div class='add'>+dict_get_ptr(dict_t *this, char *key, void **ptr)</div><div class='ctx'> {</div><div class='del'>-	data_t *data = NULL;</div><div class='del'>-	int     ret  = 0;</div><div class='add'>+    data_t *data = NULL;</div><div class='add'>+    int ret = 0;</div><div class='ctx'> </div><div class='del'>-	if (!this || !key || !val) {</div><div class='del'>-		ret = -EINVAL;</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='add'>+    if (!ptr) {</div><div class='add'>+        ret = -EINVAL;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	ret = dict_get_with_ref (this, key, &amp;data);</div><div class='del'>-	if (ret != 0) {</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='add'>+    ret = dict_get_with_ref(this, key, &amp;data);</div><div class='add'>+    if (ret != 0) {</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	ret = _data_to_double (data, val);</div><div class='add'>+    VALIDATE_DATA_AND_LOG(data, GF_DATA_TYPE_PTR, key, -EINVAL);</div><div class='add'>+</div><div class='add'>+    ret = data_to_ptr_common(data, ptr);</div><div class='add'>+    if (ret != 0) {</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='ctx'> err:</div><div class='del'>-	if (data)</div><div class='del'>-		data_unref (data);</div><div class='del'>-	return ret;</div><div class='add'>+    if (data)</div><div class='add'>+        data_unref(data);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-dict_set_double (dict_t *this, char *key, double val)</div><div class='add'>+dict_get_ptr_and_len(dict_t *this, char *key, void **ptr, int *len)</div><div class='ctx'> {</div><div class='del'>-	data_t * data = NULL;</div><div class='del'>-	int      ret  = 0;</div><div class='add'>+    data_t *data = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    if (!ptr) {</div><div class='add'>+        ret = -EINVAL;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_get_with_ref(this, key, &amp;data);</div><div class='add'>+    if (ret != 0) {</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	data = data_from_double (val);</div><div class='del'>-	if (!data) {</div><div class='del'>-		ret = -EINVAL;</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='add'>+    VALIDATE_DATA_AND_LOG(data, GF_DATA_TYPE_PTR, key, -EINVAL);</div><div class='ctx'> </div><div class='del'>-	ret = dict_set (this, key, data);</div><div class='add'>+    *len = data-&gt;len;</div><div class='add'>+</div><div class='add'>+    ret = data_to_ptr_common(data, ptr);</div><div class='add'>+    if (ret != 0) {</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='ctx'> err:</div><div class='del'>-	return ret;</div><div class='add'>+    if (data)</div><div class='add'>+        data_unref(data);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+/* Get string - with known key length */</div><div class='ctx'> int</div><div class='del'>-dict_set_static_ptr (dict_t *this, char *key, void *ptr)</div><div class='add'>+dict_get_strn(dict_t *this, char *key, const int keylen, char **str)</div><div class='ctx'> {</div><div class='del'>-	data_t * data = NULL;</div><div class='del'>-	int      ret  = 0;</div><div class='add'>+    data_t *data = NULL;</div><div class='add'>+    int ret = -EINVAL;</div><div class='ctx'> </div><div class='del'>-	data = data_from_static_ptr (ptr);</div><div class='del'>-	if (!data) {</div><div class='del'>-		ret = -EINVAL;</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='add'>+    if (!this || !key || !str) {</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+    ret = dict_get_with_refn(this, key, keylen, &amp;data);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	ret = dict_set (this, key, data);</div><div class='add'>+    VALIDATE_DATA_AND_LOG(data, GF_DATA_TYPE_STR, key, -EINVAL);</div><div class='add'>+</div><div class='add'>+    *str = data-&gt;data;</div><div class='ctx'> </div><div class='ctx'> err:</div><div class='del'>-	return ret;</div><div class='add'>+    if (data)</div><div class='add'>+        data_unref(data);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-dict_set_dynptr (dict_t *this, char *key, void *ptr, size_t len)</div><div class='add'>+dict_get_str(dict_t *this, char *key, char **str)</div><div class='ctx'> {</div><div class='del'>-	data_t * data = NULL;</div><div class='del'>-	int      ret  = 0;</div><div class='add'>+    data_t *data = NULL;</div><div class='add'>+    int ret = -EINVAL;</div><div class='ctx'> </div><div class='del'>-	data = data_from_dynptr (ptr, len);</div><div class='del'>-	if (!data) {</div><div class='del'>-		ret = -EINVAL;</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='add'>+    if (!str) {</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+    ret = dict_get_with_ref(this, key, &amp;data);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	ret = dict_set (this, key, data);</div><div class='add'>+    VALIDATE_DATA_AND_LOG(data, GF_DATA_TYPE_STR, key, -EINVAL);</div><div class='add'>+</div><div class='add'>+    *str = data-&gt;data;</div><div class='ctx'> </div><div class='ctx'> err:</div><div class='del'>-	return ret;</div><div class='add'>+    if (data)</div><div class='add'>+        data_unref(data);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-dict_get_ptr (dict_t *this, char *key, void **ptr)</div><div class='add'>+dict_set_str(dict_t *this, char *key, char *str)</div><div class='ctx'> {</div><div class='del'>-	data_t * data = NULL;</div><div class='del'>-	int      ret  = 0;</div><div class='add'>+    data_t *data = str_to_data(str);</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    if (!data) {</div><div class='add'>+        ret = -EINVAL;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_set(this, key, data);</div><div class='add'>+    if (ret &lt; 0)</div><div class='add'>+        data_destroy(data);</div><div class='ctx'> </div><div class='del'>-	if (!this || !key || !ptr) {</div><div class='del'>-		ret = -EINVAL;</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='add'>+err:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	ret = dict_get_with_ref (this, key, &amp;data);</div><div class='del'>-	if (ret != 0) {</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='add'>+/* Set string - with known key length */</div><div class='add'>+int</div><div class='add'>+dict_set_strn(dict_t *this, char *key, const int keylen, char *str)</div><div class='add'>+{</div><div class='add'>+    data_t *data = NULL;</div><div class='add'>+    int ret = 0;</div><div class='ctx'> </div><div class='del'>-	ret = _data_to_ptr (data, ptr);</div><div class='del'>-	if (ret != 0) {</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='add'>+    data = str_to_data(str);</div><div class='add'>+    if (!data) {</div><div class='add'>+        ret = -EINVAL;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-err: </div><div class='del'>-	if (data)</div><div class='del'>-		data_unref (data);</div><div class='add'>+    ret = dict_setn(this, key, keylen, data);</div><div class='add'>+    if (ret &lt; 0)</div><div class='add'>+        data_destroy(data);</div><div class='ctx'> </div><div class='del'>-	return ret;</div><div class='add'>+err:</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+/* Set string - with known key length and known value length */</div><div class='ctx'> int</div><div class='del'>-dict_set_ptr (dict_t *this, char *key, void *ptr)</div><div class='add'>+dict_set_nstrn(dict_t *this, char *key, const int keylen, char *str,</div><div class='add'>+               const int vallen)</div><div class='ctx'> {</div><div class='del'>-	data_t * data = NULL;</div><div class='del'>-	int      ret  = 0;</div><div class='add'>+    data_t *data = strn_to_data(str, vallen);</div><div class='add'>+    int ret = 0;</div><div class='ctx'> </div><div class='del'>-	data = data_from_ptr (ptr);</div><div class='del'>-	if (!data) {</div><div class='del'>-		ret = -EINVAL;</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='add'>+    if (!data) {</div><div class='add'>+        ret = -EINVAL;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	ret = dict_set (this, key, data);</div><div class='add'>+    ret = dict_setn(this, key, keylen, data);</div><div class='add'>+    if (ret &lt; 0)</div><div class='add'>+        data_destroy(data);</div><div class='ctx'> </div><div class='ctx'> err:</div><div class='del'>-	return ret;</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+dict_set_dynstr_with_alloc(dict_t *this, char *key, const char *str)</div><div class='add'>+{</div><div class='add'>+    char *alloc_str = gf_strdup(str);</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    if (!alloc_str)</div><div class='add'>+        return ret;</div><div class='add'>+</div><div class='add'>+    ret = dict_set_dynstr(this, key, alloc_str);</div><div class='add'>+    if (ret == -EINVAL)</div><div class='add'>+        GF_FREE(alloc_str);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+int</div><div class='add'>+dict_set_dynstr(dict_t *this, char *key, char *str)</div><div class='add'>+{</div><div class='add'>+    const int keylen = strlen(key);</div><div class='add'>+    return dict_set_dynstrn(this, key, keylen, str);</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-dict_get_str (dict_t *this, char *key, char **str)</div><div class='add'>+dict_set_dynstrn(dict_t *this, char *key, const int keylen, char *str)</div><div class='ctx'> {</div><div class='del'>-	data_t * data = NULL;</div><div class='del'>-	int      ret  = -EINVAL;</div><div class='add'>+    data_t *data = data_from_dynstr(str);</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    if (!data) {</div><div class='add'>+        ret = -EINVAL;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	if (!this || !key || !str) {</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='add'>+    ret = dict_setn(this, key, keylen, data);</div><div class='add'>+    if (ret &lt; 0)</div><div class='add'>+        data_destroy(data);</div><div class='ctx'> </div><div class='del'>-	ret = dict_get_with_ref (this, key, &amp;data);</div><div class='del'>-	if (ret &lt; 0) {</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='add'>+err:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	if (!data || !data-&gt;data) {</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='del'>-	*str = data-&gt;data;</div><div class='add'>+/* This function is called only by the volgen for now.</div><div class='add'>+   Check how else you can handle it */</div><div class='add'>+int</div><div class='add'>+dict_set_option(dict_t *this, char *key, char *str)</div><div class='add'>+{</div><div class='add'>+    data_t *data = data_from_dynstr(str);</div><div class='add'>+    int ret = 0;</div><div class='ctx'> </div><div class='del'>-err: </div><div class='del'>-	if (data)</div><div class='del'>-		data_unref (data);</div><div class='add'>+    if (!data) {</div><div class='add'>+        ret = -EINVAL;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	return ret;</div><div class='add'>+    data-&gt;data_type = GF_DATA_TYPE_STR_OLD;</div><div class='add'>+    ret = dict_set(this, key, data);</div><div class='add'>+    if (ret &lt; 0)</div><div class='add'>+        data_destroy(data);</div><div class='add'>+err:</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-dict_set_str (dict_t *this, char *key, char *str)</div><div class='add'>+dict_add_dynstr_with_alloc(dict_t *this, char *key, char *str)</div><div class='ctx'> {</div><div class='del'>-	data_t * data = NULL;</div><div class='del'>-	int      ret  = 0;</div><div class='add'>+    data_t *data = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    char *alloc_str = gf_strdup(str);</div><div class='ctx'> </div><div class='del'>-	data = str_to_data (str);</div><div class='del'>-	if (!data) {</div><div class='del'>-		ret = -EINVAL;</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='add'>+    if (!alloc_str)</div><div class='add'>+        goto out;</div><div class='ctx'> </div><div class='del'>-	ret = dict_set (this, key, data);</div><div class='add'>+    data = data_from_dynstr(alloc_str);</div><div class='add'>+    if (!data) {</div><div class='add'>+        GF_FREE(alloc_str);</div><div class='add'>+        ret = -EINVAL;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-err:</div><div class='del'>-	return ret;</div><div class='add'>+    ret = dict_add(this, key, data);</div><div class='add'>+    if (ret &lt; 0)</div><div class='add'>+        data_destroy(data);</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-dict_set_dynstr (dict_t *this, char *key, char *str)</div><div class='add'>+dict_get_bin(dict_t *this, char *key, void **bin)</div><div class='ctx'> {</div><div class='del'>-	data_t * data = NULL;</div><div class='del'>-	int      ret  = 0;</div><div class='add'>+    data_t *data = NULL;</div><div class='add'>+    int ret = -EINVAL;</div><div class='ctx'> </div><div class='del'>-	data = data_from_dynstr (str);</div><div class='del'>-	if (!data) {</div><div class='del'>-		ret = -EINVAL;</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='add'>+    if (!bin) {</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	ret = dict_set (this, key, data);</div><div class='add'>+    ret = dict_get_with_ref(this, key, &amp;data);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    VALIDATE_DATA_AND_LOG(data, GF_DATA_TYPE_PTR, key, ret);</div><div class='add'>+</div><div class='add'>+    *bin = data-&gt;data;</div><div class='ctx'> </div><div class='ctx'> err:</div><div class='del'>-	return ret;</div><div class='add'>+    if (data)</div><div class='add'>+        data_unref(data);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+/********************************************************************</div><div class='add'>+ *</div><div class='add'>+ * dict_set_bin_common:</div><div class='add'>+ *      This is the common function to set key and its value in</div><div class='add'>+ *      dictionary. Flag(is_static) should be set appropriately based</div><div class='add'>+ *      on the type of memory type used for value(*ptr). If flag is set</div><div class='add'>+ *      to false value(*ptr) will be freed using GF_FREE() on destroy.</div><div class='add'>+ *</div><div class='add'>+ *******************************************************************/</div><div class='add'>+static int</div><div class='add'>+dict_set_bin_common(dict_t *this, char *key, void *ptr, size_t size,</div><div class='add'>+                    gf_boolean_t is_static, gf_dict_data_type_t type)</div><div class='add'>+{</div><div class='add'>+    data_t *data = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    if (!ptr || (size &gt; DICT_KEY_VALUE_MAX_SIZE)) {</div><div class='add'>+        ret = -EINVAL;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='add'>+    data = bin_to_data(ptr, size);</div><div class='add'>+    if (!data) {</div><div class='add'>+        ret = -EINVAL;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    data-&gt;is_static = is_static;</div><div class='add'>+    data-&gt;data_type = type;</div><div class='add'>+</div><div class='add'>+    ret = dict_set(this, key, data);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        /* don't free data-&gt;data, let callers handle it */</div><div class='add'>+        data-&gt;data = NULL;</div><div class='add'>+        data_destroy(data);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+err:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/********************************************************************</div><div class='add'>+ *</div><div class='add'>+ * dict_set_bin:</div><div class='add'>+ *      Set key and its value in the dictionary. This function should</div><div class='add'>+ *      be called if the value is stored in dynamic memory.</div><div class='add'>+ *</div><div class='add'>+ *******************************************************************/</div><div class='ctx'> int</div><div class='del'>-dict_get_bin (dict_t *this, char *key, void **bin)</div><div class='add'>+dict_set_bin(dict_t *this, char *key, void *ptr, size_t size)</div><div class='ctx'> {</div><div class='del'>-	data_t * data = NULL;</div><div class='del'>-	int      ret  = -EINVAL;</div><div class='add'>+    return dict_set_bin_common(this, key, ptr, size, _gf_false,</div><div class='add'>+                               GF_DATA_TYPE_PTR);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/********************************************************************</div><div class='add'>+ *</div><div class='add'>+ * dict_set_static_bin:</div><div class='add'>+ *      Set key and its value in the dictionary. This function should</div><div class='add'>+ *      be called if the value is stored in static memory.</div><div class='add'>+ *</div><div class='add'>+ *******************************************************************/</div><div class='add'>+int</div><div class='add'>+dict_set_static_bin(dict_t *this, char *key, void *ptr, size_t size)</div><div class='add'>+{</div><div class='add'>+    return dict_set_bin_common(this, key, ptr, size, _gf_true,</div><div class='add'>+                               GF_DATA_TYPE_PTR);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*  */</div><div class='add'>+int</div><div class='add'>+dict_set_gfuuid(dict_t *this, char *key, uuid_t gfid, bool is_static)</div><div class='add'>+{</div><div class='add'>+    return dict_set_bin_common(this, key, gfid, sizeof(uuid_t), is_static,</div><div class='add'>+                               GF_DATA_TYPE_GFUUID);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+dict_get_gfuuid(dict_t *this, char *key, uuid_t *gfid)</div><div class='add'>+{</div><div class='add'>+    data_t *data = NULL;</div><div class='add'>+    int ret = -EINVAL;</div><div class='add'>+</div><div class='add'>+    if (!gfid) {</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+    ret = dict_get_with_ref(this, key, &amp;data);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	if (!this || !key || !bin) {</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='add'>+    VALIDATE_DATA_AND_LOG(data, GF_DATA_TYPE_GFUUID, key, -EINVAL);</div><div class='ctx'> </div><div class='del'>-	ret = dict_get_with_ref (this, key, &amp;data);</div><div class='del'>-	if (ret &lt; 0) {</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='add'>+    memcpy(*gfid, data-&gt;data, min(data-&gt;len, sizeof(uuid_t)));</div><div class='ctx'> </div><div class='del'>-	if (!data || !data-&gt;data) {</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='del'>-	*bin = data-&gt;data;</div><div class='add'>+err:</div><div class='add'>+    if (data)</div><div class='add'>+        data_unref(data);</div><div class='ctx'> </div><div class='del'>-err: </div><div class='del'>-	if (data)</div><div class='del'>-		data_unref (data);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	return ret;</div><div class='add'>+int</div><div class='add'>+dict_set_mdata(dict_t *this, char *key, struct mdata_iatt *mdata,</div><div class='add'>+               bool is_static)</div><div class='add'>+{</div><div class='add'>+    return dict_set_bin_common(this, key, mdata, sizeof(struct mdata_iatt),</div><div class='add'>+                               is_static, GF_DATA_TYPE_MDATA);</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+int</div><div class='add'>+dict_get_mdata(dict_t *this, char *key, struct mdata_iatt *mdata)</div><div class='add'>+{</div><div class='add'>+    data_t *data = NULL;</div><div class='add'>+    int ret = -EINVAL;</div><div class='add'>+</div><div class='add'>+    if (!mdata) {</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+    ret = dict_get_with_ref(this, key, &amp;data);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    VALIDATE_DATA_AND_LOG(data, GF_DATA_TYPE_MDATA, key, -EINVAL);</div><div class='add'>+    if (data-&gt;len &lt; sizeof(struct mdata_iatt)) {</div><div class='add'>+        gf_smsg("glusterfs", GF_LOG_ERROR, ENOBUFS, LG_MSG_UNDERSIZED_BUF,</div><div class='add'>+                "key=%s", key, NULL);</div><div class='add'>+        ret = -ENOBUFS;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    memcpy(mdata, data-&gt;data, min(data-&gt;len, sizeof(struct mdata_iatt)));</div><div class='add'>+</div><div class='add'>+err:</div><div class='add'>+    if (data)</div><div class='add'>+        data_unref(data);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-dict_set_bin (dict_t *this, char *key, void *ptr, size_t size)</div><div class='add'>+dict_set_iatt(dict_t *this, char *key, struct iatt *iatt, bool is_static)</div><div class='ctx'> {</div><div class='del'>-	data_t * data = NULL;</div><div class='del'>-	int      ret  = 0;</div><div class='add'>+    return dict_set_bin_common(this, key, iatt, sizeof(struct iatt), is_static,</div><div class='add'>+                               GF_DATA_TYPE_IATT);</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	if (!ptr || (size &lt; 0)) {</div><div class='del'>-		ret = -EINVAL;</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='add'>+int</div><div class='add'>+dict_get_iatt(dict_t *this, char *key, struct iatt *iatt)</div><div class='add'>+{</div><div class='add'>+    data_t *data = NULL;</div><div class='add'>+    int ret = -EINVAL;</div><div class='ctx'> </div><div class='del'>-	data = bin_to_data (ptr, size);</div><div class='del'>-	if (!data) {</div><div class='del'>-		ret = -EINVAL;</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='add'>+    if (!iatt) {</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+    ret = dict_get_with_ref(this, key, &amp;data);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	data-&gt;data = ptr;</div><div class='del'>-	data-&gt;len  = size;</div><div class='del'>-	data-&gt;is_static = 0;</div><div class='add'>+    VALIDATE_DATA_AND_LOG(data, GF_DATA_TYPE_IATT, key, -EINVAL);</div><div class='ctx'> </div><div class='del'>-	ret = dict_set (this, key, data);</div><div class='add'>+    memcpy(iatt, data-&gt;data, min(data-&gt;len, sizeof(struct iatt)));</div><div class='ctx'> </div><div class='ctx'> err:</div><div class='del'>-	return ret;</div><div class='add'>+    if (data)</div><div class='add'>+        data_unref(data);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+/**</div><div class='add'>+ * dict_get_str_boolean - get a boolean value based on string representation.</div><div class='add'>+ *</div><div class='add'>+ * @this        : dictionary</div><div class='add'>+ * @key         : dictionary key queried</div><div class='add'>+ * @default_val : default value if key not found</div><div class='add'>+ *</div><div class='add'>+ * @return      : @default_val if key not found</div><div class='add'>+ *              : boolean interpretation of @this[@key] if it makes sense</div><div class='add'>+ *                (ie., "on", "true", "enable" ...)</div><div class='add'>+ *              : -1 if error occurs or @this[@key] doesn't make sens as</div><div class='add'>+ *                  boolean</div><div class='add'>+ *</div><div class='add'>+ *   So if you query a boolean option, then via @default_val you can choose</div><div class='add'>+ *   between following patterns:</div><div class='add'>+ *</div><div class='add'>+ *   - fall back to _gf_false if @key is not set  [@default_val = 0]</div><div class='add'>+ *   - fall back to _gf_true if @key is not set   [@default_val = 1]</div><div class='add'>+ *   - regard as failure if @key is not set       [@default_val = -1]</div><div class='add'>+ *   - handle specially (not as error) if @key is not set</div><div class='add'>+ *                                                [@default_val = anything else]</div><div class='add'>+ */</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-dict_set_static_bin (dict_t *this, char *key, void *ptr, size_t size)</div><div class='add'>+dict_get_str_boolean(dict_t *this, char *key, int default_val)</div><div class='ctx'> {</div><div class='del'>-	data_t * data = NULL;</div><div class='del'>-	int      ret  = 0;</div><div class='add'>+    data_t *data = NULL;</div><div class='add'>+    gf_boolean_t boo = _gf_false;</div><div class='add'>+    int ret = 0;</div><div class='ctx'> </div><div class='del'>-	if (!ptr || (size &lt; 0)) {</div><div class='del'>-		ret = -EINVAL;</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='add'>+    ret = dict_get_with_ref(this, key, &amp;data);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        if (ret == -ENOENT)</div><div class='add'>+            ret = default_val;</div><div class='add'>+        else</div><div class='add'>+            ret = -1;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	data = bin_to_data (ptr, size);</div><div class='del'>-	if (!data) {</div><div class='del'>-		ret = -EINVAL;</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='add'>+    VALIDATE_DATA_AND_LOG(data, GF_DATA_TYPE_INT, key, -EINVAL);</div><div class='ctx'> </div><div class='del'>-	data-&gt;data = ptr;</div><div class='del'>-	data-&gt;len  = size;</div><div class='del'>-	data-&gt;is_static = 1;</div><div class='add'>+    ret = gf_strn2boolean(data-&gt;data, data-&gt;len - 1, &amp;boo);</div><div class='add'>+    if (ret == -1)</div><div class='add'>+        goto err;</div><div class='ctx'> </div><div class='del'>-	ret = dict_set (this, key, data);</div><div class='add'>+    ret = boo;</div><div class='ctx'> </div><div class='ctx'> err:</div><div class='del'>-	return ret;</div><div class='add'>+    if (data)</div><div class='add'>+        data_unref(data);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+dict_rename_key(dict_t *this, char *key, char *replace_key)</div><div class='add'>+{</div><div class='add'>+    data_pair_t *pair = NULL;</div><div class='add'>+    int ret = -EINVAL;</div><div class='add'>+    uint32_t hash;</div><div class='add'>+    uint32_t replacekey_hash;</div><div class='add'>+    int replacekey_len;</div><div class='add'>+</div><div class='add'>+    /* replacing a key by itself is a NO-OP */</div><div class='add'>+    if (strcmp(key, replace_key) == 0)</div><div class='add'>+        return 0;</div><div class='add'>+</div><div class='add'>+    if (!this) {</div><div class='add'>+        gf_msg_callingfn("dict", GF_LOG_WARNING, EINVAL, LG_MSG_INVALID_ARG,</div><div class='add'>+                         "dict is NULL");</div><div class='add'>+        return ret;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    hash = (uint32_t)XXH64(key, strlen(key), 0);</div><div class='add'>+    replacekey_len = strlen(replace_key);</div><div class='add'>+    replacekey_hash = (uint32_t)XXH64(replace_key, replacekey_len, 0);</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;this-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        /* no need to data_ref(pair-&gt;value), dict_set_lk() does it */</div><div class='add'>+        pair = dict_lookup_common(this, key, hash);</div><div class='add'>+        if (!pair)</div><div class='add'>+            ret = -ENODATA;</div><div class='add'>+        else</div><div class='add'>+            ret = dict_set_lk(this, replace_key, replacekey_len, pair-&gt;value,</div><div class='add'>+                              replacekey_hash, 1);</div><div class='add'>+    }</div><div class='add'>+    UNLOCK(&amp;this-&gt;lock);</div><div class='add'>+</div><div class='add'>+    if (!ret)</div><div class='add'>+        /* only delete the key on success */</div><div class='add'>+        dict_del(this, key);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> /**</div><div class='hunk'>@@ -2133,13 +2886,9 @@ err:</div><div class='ctx'>  *     4        4         4       &lt;key len&gt;   &lt;value len&gt;</div><div class='ctx'>  */</div><div class='ctx'> </div><div class='del'>-#define DICT_HDR_LEN               4</div><div class='del'>-#define DICT_DATA_HDR_KEY_LEN      4</div><div class='del'>-#define DICT_DATA_HDR_VAL_LEN      4</div><div class='del'>-</div><div class='ctx'> /**</div><div class='del'>- * _dict_serialized_length - return the length of serialized dict. This</div><div class='del'>- *                           procedure has to be called with this-&gt;lock held.</div><div class='add'>+ * dict_serialized_length_lk - return the length of serialized dict. This</div><div class='add'>+ *                             procedure has to be called with this-&gt;lock held.</div><div class='ctx'>  *</div><div class='ctx'>  * @this  : dict to be serialized</div><div class='ctx'>  * @return: success: len</div><div class='hunk'>@@ -2147,167 +2896,103 @@ err:</div><div class='ctx'>  */</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-_dict_serialized_length (dict_t *this)</div><div class='del'>-{</div><div class='del'>-	int ret            = -EINVAL;</div><div class='del'>-	int count          = 0;</div><div class='del'>-	int len            = 0;</div><div class='del'>-	int i              = 0;</div><div class='del'>-	data_pair_t * pair = NULL;</div><div class='del'>-</div><div class='del'>-	len = DICT_HDR_LEN;</div><div class='del'>-	count = this-&gt;count;</div><div class='del'>-</div><div class='del'>-	if (count &lt; 0) {</div><div class='del'>-		gf_log ("dict", GF_LOG_ERROR, "count (%d) &lt; 0!", count);</div><div class='del'>-		goto out;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	pair = this-&gt;members_list;</div><div class='del'>-</div><div class='del'>-	while (count) {</div><div class='del'>-		if (!pair) {</div><div class='del'>-			gf_log ("dict", GF_LOG_ERROR, </div><div class='del'>-				"less than count data pairs found!");</div><div class='del'>-			goto out;</div><div class='del'>-		}</div><div class='del'>-</div><div class='del'>-		len += DICT_DATA_HDR_KEY_LEN + DICT_DATA_HDR_VAL_LEN;</div><div class='del'>-</div><div class='del'>-		if (!pair-&gt;key) {</div><div class='del'>-			gf_log ("dict", GF_LOG_ERROR, "pair-&gt;key is null!");</div><div class='del'>-			goto out;</div><div class='del'>-		}</div><div class='del'>-</div><div class='del'>-		len += strlen (pair-&gt;key) + 1  /* for '\0' */;</div><div class='del'>-</div><div class='del'>-		if (!pair-&gt;value) {</div><div class='del'>-			gf_log ("dict", GF_LOG_ERROR,</div><div class='del'>-				"pair-&gt;value is null!");</div><div class='del'>-			goto out;</div><div class='del'>-		}</div><div class='del'>-</div><div class='del'>-		if (pair-&gt;value-&gt;vec) {</div><div class='del'>-			for (i = 0; i &lt; pair-&gt;value-&gt;len; i++) {</div><div class='del'>-				if (pair-&gt;value-&gt;vec[i].iov_len &lt; 0) {</div><div class='del'>-					gf_log ("dict", GF_LOG_ERROR,</div><div class='del'>-						"iov_len (%"GF_PRI_SIZET") &lt; 0!",</div><div class='del'>-						pair-&gt;value-&gt;vec[i].iov_len);</div><div class='del'>-					goto out;</div><div class='del'>-				}</div><div class='del'>-</div><div class='del'>-				len += pair-&gt;value-&gt;vec[i].iov_len;</div><div class='del'>-			}</div><div class='del'>-		} else {</div><div class='del'>-			if (pair-&gt;value-&gt;len &lt; 0) {</div><div class='del'>-				gf_log ("dict", GF_LOG_ERROR,</div><div class='del'>-					"value-&gt;len (%d) &lt; 0",</div><div class='del'>-					pair-&gt;value-&gt;len);</div><div class='del'>-				goto out;</div><div class='del'>-			}</div><div class='del'>-</div><div class='del'>-			len += pair-&gt;value-&gt;len;</div><div class='del'>-		}</div><div class='del'>-</div><div class='del'>-		pair = pair-&gt;next;</div><div class='del'>-		count--;</div><div class='del'>-	}</div><div class='del'>-	</div><div class='del'>-	ret = len;</div><div class='add'>+dict_serialized_length_lk(dict_t *this)</div><div class='add'>+{</div><div class='add'>+    int ret = -EINVAL;</div><div class='add'>+    int count = this-&gt;count;</div><div class='add'>+    const int keyhdrlen = DICT_DATA_HDR_KEY_LEN + DICT_DATA_HDR_VAL_LEN;</div><div class='add'>+</div><div class='add'>+    if (count &lt; 0) {</div><div class='add'>+        gf_smsg("dict", GF_LOG_ERROR, EINVAL, LG_MSG_COUNT_LESS_THAN_ZERO,</div><div class='add'>+                "count=%d", count, NULL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = DICT_HDR_LEN + this-&gt;totkvlen + (count * keyhdrlen);</div><div class='ctx'> out:</div><div class='del'>-	return ret;</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> /**</div><div class='del'>- * _dict_serialize - serialize a dictionary into a buffer. This procedure has </div><div class='del'>- *                   to be called with this-&gt;lock held.</div><div class='add'>+ * dict_serialize_lk - serialize a dictionary into a buffer. This procedure has</div><div class='add'>+ *                     to be called with this-&gt;lock held.</div><div class='ctx'>  *</div><div class='ctx'>  * @this: dict to serialize</div><div class='del'>- * @buf:  buffer to serialize into. This must be </div><div class='del'>- *        atleast dict_serialized_length (this) large</div><div class='add'>+ * @buf:  buffer to serialize into. This must be</div><div class='add'>+ *        at least dict_serialized_length (this) large</div><div class='ctx'>  *</div><div class='ctx'>  * @return: success: 0</div><div class='ctx'>  *          failure: -errno</div><div class='ctx'>  */</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-_dict_serialize (dict_t *this, char *buf)</div><div class='del'>-{</div><div class='del'>-	int           ret     = -1;</div><div class='del'>-	data_pair_t * pair    = NULL;</div><div class='del'>-	int32_t       count   = 0;</div><div class='del'>-	int32_t       keylen  = 0;</div><div class='del'>-	int32_t       vallen  = 0;</div><div class='del'>-	int32_t       netword = 0;</div><div class='del'>-	</div><div class='del'>-	if (!buf) {</div><div class='del'>-		gf_log ("dict", GF_LOG_ERROR,</div><div class='del'>-			"buf is null!");</div><div class='del'>-		goto out;</div><div class='del'>-	}</div><div class='del'>-	</div><div class='del'>-	count = this-&gt;count;</div><div class='del'>-	if (count &lt; 0) {</div><div class='del'>-		gf_log ("dict", GF_LOG_ERROR, "count (%d) &lt; 0!", count);</div><div class='del'>-		goto out;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	netword = hton32 (count);</div><div class='del'>-	memcpy (buf, &amp;netword, sizeof(netword));</div><div class='del'>-	buf += DICT_HDR_LEN;</div><div class='del'>-	pair = this-&gt;members_list;</div><div class='del'>-</div><div class='del'>-	while (count) {</div><div class='del'>-		if (!pair) {</div><div class='del'>-			gf_log ("dict", GF_LOG_ERROR,</div><div class='del'>-				"less than count data pairs found!");</div><div class='del'>-			goto out;</div><div class='del'>-		}</div><div class='del'>-</div><div class='del'>-		if (!pair-&gt;key) {</div><div class='del'>-			gf_log ("dict", GF_LOG_ERROR,</div><div class='del'>-				"pair-&gt;key is null!");</div><div class='del'>-			goto out;</div><div class='del'>-		}</div><div class='del'>-</div><div class='del'>-		keylen  = strlen (pair-&gt;key);</div><div class='del'>-		netword = hton32 (keylen);</div><div class='del'>-		memcpy (buf, &amp;netword, sizeof(netword));</div><div class='del'>-		buf += DICT_DATA_HDR_KEY_LEN;</div><div class='del'>-</div><div class='del'>-		if (!pair-&gt;value) {</div><div class='del'>-			gf_log ("dict", GF_LOG_ERROR,</div><div class='del'>-				"pair-&gt;value is null!");</div><div class='del'>-			goto out;</div><div class='del'>-		}</div><div class='del'>-</div><div class='del'>-		vallen  = pair-&gt;value-&gt;len;</div><div class='del'>-		netword = hton32 (vallen);</div><div class='del'>-		memcpy (buf, &amp;netword, sizeof(netword));</div><div class='del'>-		buf += DICT_DATA_HDR_VAL_LEN;</div><div class='del'>-</div><div class='del'>-		memcpy (buf, pair-&gt;key, keylen);</div><div class='del'>-		buf += keylen;</div><div class='del'>-		*buf++ = '\0';</div><div class='del'>-</div><div class='del'>-		if (!pair-&gt;value-&gt;data) {</div><div class='del'>-			gf_log ("dict", GF_LOG_ERROR,</div><div class='del'>-				"pair-&gt;value-&gt;data is null!");</div><div class='del'>-			goto out;</div><div class='del'>-		}</div><div class='del'>-		memcpy (buf, pair-&gt;value-&gt;data, vallen);</div><div class='del'>-		buf += vallen;</div><div class='del'>-</div><div class='del'>-		pair = pair-&gt;next;</div><div class='del'>-		count--;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	ret = 0;</div><div class='add'>+static int</div><div class='add'>+dict_serialize_lk(dict_t *this, char *buf)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    data_pair_t *pair = this-&gt;members_list;</div><div class='add'>+    int32_t count = this-&gt;count;</div><div class='add'>+    int32_t keylen = 0;</div><div class='add'>+    int32_t netword = 0;</div><div class='add'>+</div><div class='add'>+    if (!buf) {</div><div class='add'>+        gf_smsg("dict", GF_LOG_ERROR, EINVAL, LG_MSG_INVALID_ARG, NULL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (count &lt; 0) {</div><div class='add'>+        gf_smsg("dict", GF_LOG_ERROR, 0, LG_MSG_COUNT_LESS_THAN_ZERO,</div><div class='add'>+                "count=%d", count, NULL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    netword = hton32(count);</div><div class='add'>+    memcpy(buf, &amp;netword, sizeof(netword));</div><div class='add'>+    buf += DICT_HDR_LEN;</div><div class='add'>+</div><div class='add'>+    while (count) {</div><div class='add'>+        if (!pair) {</div><div class='add'>+            gf_smsg("dict", GF_LOG_ERROR, 0, LG_MSG_PAIRS_LESS_THAN_COUNT,</div><div class='add'>+                    NULL);</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        if (!pair-&gt;key) {</div><div class='add'>+            gf_smsg("dict", GF_LOG_ERROR, 0, LG_MSG_NULL_PTR, NULL);</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        keylen = strlen(pair-&gt;key);</div><div class='add'>+        netword = hton32(keylen);</div><div class='add'>+        memcpy(buf, &amp;netword, sizeof(netword));</div><div class='add'>+        buf += DICT_DATA_HDR_KEY_LEN;</div><div class='add'>+</div><div class='add'>+        if (!pair-&gt;value) {</div><div class='add'>+            gf_smsg("dict", GF_LOG_ERROR, 0, LG_MSG_NULL_PTR, NULL);</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        netword = hton32(pair-&gt;value-&gt;len);</div><div class='add'>+        memcpy(buf, &amp;netword, sizeof(netword));</div><div class='add'>+        buf += DICT_DATA_HDR_VAL_LEN;</div><div class='add'>+</div><div class='add'>+        memcpy(buf, pair-&gt;key, keylen);</div><div class='add'>+        buf += keylen;</div><div class='add'>+        *buf++ = '\0';</div><div class='add'>+</div><div class='add'>+        if (pair-&gt;value-&gt;data) {</div><div class='add'>+            memcpy(buf, pair-&gt;value-&gt;data, pair-&gt;value-&gt;len);</div><div class='add'>+            buf += pair-&gt;value-&gt;len;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        pair = pair-&gt;next;</div><div class='add'>+        count--;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='ctx'> out:</div><div class='del'>-	return ret;</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> /**</div><div class='ctx'>  * dict_serialized_length - return the length of serialized dict</div><div class='ctx'>  *</div><div class='hunk'>@@ -2317,245 +3002,488 @@ out:</div><div class='ctx'>  */</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-dict_serialized_length (dict_t *this)</div><div class='del'>-{</div><div class='del'>-	int ret            = -EINVAL;</div><div class='del'>-</div><div class='del'>-	if (!this) {</div><div class='del'>-		gf_log ("dict", GF_LOG_ERROR, "this is null!");</div><div class='del'>-		goto out;</div><div class='del'>-	}</div><div class='del'>-	</div><div class='del'>-        LOCK (&amp;this-&gt;lock);</div><div class='del'>-        {</div><div class='del'>-                ret = _dict_serialized_length (this);</div><div class='del'>-        }</div><div class='del'>-        UNLOCK (&amp;this-&gt;lock);</div><div class='add'>+dict_serialized_length(dict_t *this)</div><div class='add'>+{</div><div class='add'>+    int ret = -EINVAL;</div><div class='add'>+</div><div class='add'>+    if (!this) {</div><div class='add'>+        gf_msg_callingfn("dict", GF_LOG_WARNING, EINVAL, LG_MSG_INVALID_ARG,</div><div class='add'>+                         "dict is null!");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;this-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        ret = dict_serialized_length_lk(this);</div><div class='add'>+    }</div><div class='add'>+    UNLOCK(&amp;this-&gt;lock);</div><div class='ctx'> </div><div class='ctx'> out:</div><div class='del'>-	return ret;</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> /**</div><div class='ctx'>  * dict_serialize - serialize a dictionary into a buffer</div><div class='ctx'>  *</div><div class='ctx'>  * @this: dict to serialize</div><div class='del'>- * @buf:  buffer to serialize into. This must be </div><div class='del'>- *        atleast dict_serialized_length (this) large</div><div class='add'>+ * @buf:  buffer to serialize into. This must be</div><div class='add'>+ *        at least dict_serialized_length (this) large</div><div class='ctx'>  *</div><div class='ctx'>  * @return: success: 0</div><div class='ctx'>  *          failure: -errno</div><div class='ctx'>  */</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-dict_serialize (dict_t *this, char *buf)</div><div class='del'>-{</div><div class='del'>-	int           ret    = -1;</div><div class='del'>-	</div><div class='del'>-	if (!this) {</div><div class='del'>-		gf_log ("dict", GF_LOG_ERROR,</div><div class='del'>-			"this is null!");</div><div class='del'>-		goto out;</div><div class='del'>-	}</div><div class='del'>-	if (!buf) {</div><div class='del'>-		gf_log ("dict", GF_LOG_ERROR,</div><div class='del'>-			"buf is null!");</div><div class='del'>-		goto out;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-        LOCK (&amp;this-&gt;lock);</div><div class='del'>-        {</div><div class='del'>-                ret = _dict_serialize (this, buf);</div><div class='del'>-        }</div><div class='del'>-        UNLOCK (&amp;this-&gt;lock);</div><div class='add'>+dict_serialize(dict_t *this, char *buf)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    if (!this || !buf) {</div><div class='add'>+        gf_msg_callingfn("dict", GF_LOG_WARNING, EINVAL, LG_MSG_INVALID_ARG,</div><div class='add'>+                         "dict is null!");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;this-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        ret = dict_serialize_lk(this, buf);</div><div class='add'>+    }</div><div class='add'>+    UNLOCK(&amp;this-&gt;lock);</div><div class='ctx'> out:</div><div class='del'>-	return ret;</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> /**</div><div class='ctx'>  * dict_unserialize - unserialize a buffer into a dict</div><div class='ctx'>  *</div><div class='ctx'>  * @buf:  buf containing serialized dict</div><div class='ctx'>  * @size: size of the @buf</div><div class='ctx'>  * @fill: dict to fill in</div><div class='del'>- * </div><div class='add'>+ *</div><div class='ctx'>  * @return: success: 0</div><div class='ctx'>  *          failure: -errno</div><div class='ctx'>  */</div><div class='ctx'> </div><div class='ctx'> int32_t</div><div class='del'>-dict_unserialize (char *orig_buf, int32_t size, dict_t **fill)</div><div class='del'>-{</div><div class='del'>-	char   *buf = NULL;</div><div class='del'>-	int     ret   = -1;</div><div class='del'>-	int32_t count = 0;</div><div class='del'>-	int     i     = 0;</div><div class='del'>-</div><div class='del'>-	data_t * value   = NULL;</div><div class='del'>-	char   * key     = NULL;</div><div class='del'>-	int32_t  keylen  = 0;</div><div class='del'>-	int32_t  vallen  = 0;</div><div class='del'>-	int32_t  hostord = 0;</div><div class='del'>-</div><div class='del'>-	buf = orig_buf;</div><div class='del'>-</div><div class='del'>-	if (!buf) {</div><div class='del'>-		gf_log ("dict", GF_LOG_ERROR,</div><div class='del'>-			"buf is null!");</div><div class='del'>-		goto out;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	if (size == 0) {</div><div class='del'>-		gf_log ("dict", GF_LOG_ERROR,</div><div class='del'>-			"size is 0!");</div><div class='del'>-		goto out;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	if (!fill) {</div><div class='del'>-		gf_log ("dict", GF_LOG_ERROR,</div><div class='del'>-			"fill is null!");</div><div class='del'>-		goto out;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	if (!*fill) {</div><div class='del'>-		gf_log ("dict", GF_LOG_ERROR,</div><div class='del'>-			"*fill is null!");</div><div class='del'>-		goto out;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	if ((buf + DICT_HDR_LEN) &gt; (orig_buf + size)) {</div><div class='del'>-		gf_log ("dict", GF_LOG_ERROR,</div><div class='del'>-			"undersized buffer passed");</div><div class='del'>-		goto out;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	memcpy (&amp;hostord, buf, sizeof(hostord));</div><div class='del'>-	count = ntoh32 (hostord);</div><div class='del'>-	buf += DICT_HDR_LEN;</div><div class='del'>-</div><div class='del'>-	if (count &lt; 0) {</div><div class='del'>-		gf_log ("dict", GF_LOG_ERROR,</div><div class='del'>-			"count (%d) &lt;= 0", count);</div><div class='del'>-		goto out;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	/* count will be set by the dict_set's below */</div><div class='del'>-	(*fill)-&gt;count = 0;</div><div class='del'>-</div><div class='del'>-	for (i = 0; i &lt; count; i++) {</div><div class='del'>-		if ((buf + DICT_DATA_HDR_KEY_LEN) &gt; (orig_buf + size)) {</div><div class='del'>-			gf_log ("dict", GF_LOG_DEBUG,</div><div class='del'>-				"No room for keylen (size %d).",</div><div class='del'>-				DICT_DATA_HDR_KEY_LEN);</div><div class='del'>-			gf_log ("dict", GF_LOG_ERROR,</div><div class='del'>-				"undersized buffer passed");</div><div class='del'>-			goto out;</div><div class='del'>-		}</div><div class='del'>-		memcpy (&amp;hostord, buf, sizeof(hostord));</div><div class='del'>-		keylen = ntoh32 (hostord);</div><div class='del'>-		buf += DICT_DATA_HDR_KEY_LEN;</div><div class='del'>-</div><div class='del'>-		if ((buf + DICT_DATA_HDR_VAL_LEN) &gt; (orig_buf + size)) {</div><div class='del'>-			gf_log ("dict", GF_LOG_DEBUG,</div><div class='del'>-				"No room for vallen (size %d).",</div><div class='del'>-				DICT_DATA_HDR_VAL_LEN);</div><div class='del'>-			gf_log ("dict", GF_LOG_ERROR,</div><div class='del'>-				"undersized buffer passed");</div><div class='del'>-			goto out;</div><div class='del'>-		}</div><div class='del'>-		memcpy (&amp;hostord, buf, sizeof(hostord));</div><div class='del'>-		vallen = ntoh32 (hostord);</div><div class='del'>-		buf += DICT_DATA_HDR_VAL_LEN;</div><div class='del'>-</div><div class='del'>-		if ((buf + keylen) &gt; (orig_buf + size)) {</div><div class='del'>-			gf_log ("dict", GF_LOG_DEBUG,</div><div class='del'>-				"No room for key (size %d).", keylen);</div><div class='del'>-			gf_log ("dict", GF_LOG_ERROR,</div><div class='del'>-				"undersized buffer passed");</div><div class='del'>-			goto out;</div><div class='del'>-		}</div><div class='del'>-		key = buf;</div><div class='del'>-		buf += keylen + 1;  /* for '\0' */</div><div class='del'>-</div><div class='del'>-		if ((buf + vallen) &gt; (orig_buf + size)) {</div><div class='del'>-			gf_log ("dict", GF_LOG_DEBUG,</div><div class='del'>-				"No room for value (size %d).", vallen);</div><div class='del'>-			gf_log ("dict", GF_LOG_ERROR,</div><div class='del'>-				"undersized buffer passed");</div><div class='del'>-			goto out;</div><div class='del'>-		}</div><div class='del'>-		value = get_new_data ();</div><div class='del'>-		value-&gt;len  = vallen;</div><div class='del'>-		value-&gt;data = buf;</div><div class='del'>-		value-&gt;is_static = 1;</div><div class='del'>-		buf += vallen;</div><div class='del'>-</div><div class='del'>-		dict_set (*fill, key, value);</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	ret = 0;</div><div class='add'>+dict_unserialize(char *orig_buf, int32_t size, dict_t **fill)</div><div class='add'>+{</div><div class='add'>+    char *buf = orig_buf;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int32_t count = 0;</div><div class='add'>+    int i = 0;</div><div class='add'>+</div><div class='add'>+    data_t *value = NULL;</div><div class='add'>+    char *key = NULL;</div><div class='add'>+    int32_t keylen = 0;</div><div class='add'>+    int32_t vallen = 0;</div><div class='add'>+    int32_t hostord = 0;</div><div class='add'>+</div><div class='add'>+    if (!buf) {</div><div class='add'>+        gf_msg_callingfn("dict", GF_LOG_WARNING, EINVAL, LG_MSG_INVALID_ARG,</div><div class='add'>+                         "buf is null!");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (size == 0) {</div><div class='add'>+        gf_msg_callingfn("dict", GF_LOG_ERROR, EINVAL, LG_MSG_INVALID_ARG,</div><div class='add'>+                         "size is 0!");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (!fill) {</div><div class='add'>+        gf_msg_callingfn("dict", GF_LOG_ERROR, EINVAL, LG_MSG_INVALID_ARG,</div><div class='add'>+                         "fill is null!");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (!*fill) {</div><div class='add'>+        gf_msg_callingfn("dict", GF_LOG_ERROR, EINVAL, LG_MSG_INVALID_ARG,</div><div class='add'>+                         "*fill is null!");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if ((buf + DICT_HDR_LEN) &gt; (orig_buf + size)) {</div><div class='add'>+        gf_msg_callingfn("dict", GF_LOG_ERROR, 0, LG_MSG_UNDERSIZED_BUF,</div><div class='add'>+                         "undersized buffer "</div><div class='add'>+                         "passed. available (%lu) &lt; required (%lu)",</div><div class='add'>+                         (long)(orig_buf + size), (long)(buf + DICT_HDR_LEN));</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    memcpy(&amp;hostord, buf, sizeof(hostord));</div><div class='add'>+    count = ntoh32(hostord);</div><div class='add'>+    buf += DICT_HDR_LEN;</div><div class='add'>+</div><div class='add'>+    if (count &lt; 0) {</div><div class='add'>+        gf_smsg("dict", GF_LOG_ERROR, 0, LG_MSG_COUNT_LESS_THAN_ZERO,</div><div class='add'>+                "count=%d", count, NULL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* count will be set by the dict_set's below */</div><div class='add'>+    (*fill)-&gt;count = 0;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; count; i++) {</div><div class='add'>+        if ((buf + DICT_DATA_HDR_KEY_LEN) &gt; (orig_buf + size)) {</div><div class='add'>+            gf_msg_callingfn("dict", GF_LOG_ERROR, 0, LG_MSG_UNDERSIZED_BUF,</div><div class='add'>+                             "undersized "</div><div class='add'>+                             "buffer passed. available (%lu) &lt; "</div><div class='add'>+                             "required (%lu)",</div><div class='add'>+                             (long)(orig_buf + size),</div><div class='add'>+                             (long)(buf + DICT_DATA_HDR_KEY_LEN));</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+        memcpy(&amp;hostord, buf, sizeof(hostord));</div><div class='add'>+        keylen = ntoh32(hostord);</div><div class='add'>+        buf += DICT_DATA_HDR_KEY_LEN;</div><div class='add'>+</div><div class='add'>+        if ((buf + DICT_DATA_HDR_VAL_LEN) &gt; (orig_buf + size)) {</div><div class='add'>+            gf_msg_callingfn("dict", GF_LOG_ERROR, 0, LG_MSG_UNDERSIZED_BUF,</div><div class='add'>+                             "undersized "</div><div class='add'>+                             "buffer passed. available (%lu) &lt; "</div><div class='add'>+                             "required (%lu)",</div><div class='add'>+                             (long)(orig_buf + size),</div><div class='add'>+                             (long)(buf + DICT_DATA_HDR_VAL_LEN));</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+        memcpy(&amp;hostord, buf, sizeof(hostord));</div><div class='add'>+        vallen = ntoh32(hostord);</div><div class='add'>+        buf += DICT_DATA_HDR_VAL_LEN;</div><div class='add'>+</div><div class='add'>+        if ((keylen &lt; 0) || (vallen &lt; 0)) {</div><div class='add'>+            gf_msg_callingfn("dict", GF_LOG_ERROR, 0, LG_MSG_UNDERSIZED_BUF,</div><div class='add'>+                             "undersized length passed "</div><div class='add'>+                             "key:%d val:%d",</div><div class='add'>+                             keylen, vallen);</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+        if ((buf + keylen) &gt; (orig_buf + size)) {</div><div class='add'>+            gf_msg_callingfn("dict", GF_LOG_ERROR, 0, LG_MSG_UNDERSIZED_BUF,</div><div class='add'>+                             "undersized buffer passed. "</div><div class='add'>+                             "available (%lu) &lt; required (%lu)",</div><div class='add'>+                             (long)(orig_buf + size), (long)(buf + keylen));</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+        key = buf;</div><div class='add'>+        buf += keylen + 1; /* for '\0' */</div><div class='add'>+</div><div class='add'>+        if ((buf + vallen) &gt; (orig_buf + size)) {</div><div class='add'>+            gf_msg_callingfn("dict", GF_LOG_ERROR, 0, LG_MSG_UNDERSIZED_BUF,</div><div class='add'>+                             "undersized buffer passed. "</div><div class='add'>+                             "available (%lu) &lt; required (%lu)",</div><div class='add'>+                             (long)(orig_buf + size), (long)(buf + vallen));</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+        value = get_new_data();</div><div class='add'>+</div><div class='add'>+        if (!value) {</div><div class='add'>+            ret = -1;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+        value-&gt;len = vallen;</div><div class='add'>+        value-&gt;data = gf_memdup(buf, vallen);</div><div class='add'>+        value-&gt;data_type = GF_DATA_TYPE_STR_OLD;</div><div class='add'>+        value-&gt;is_static = _gf_false;</div><div class='add'>+        buf += vallen;</div><div class='add'>+</div><div class='add'>+        ret = dict_addn(*fill, key, keylen, value);</div><div class='add'>+        if (ret &lt; 0)</div><div class='add'>+            goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='ctx'> out:</div><div class='del'>-	return ret;</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> /**</div><div class='ctx'>  * dict_allocate_and_serialize - serialize a dictionary into an allocated buffer</div><div class='ctx'>  *</div><div class='ctx'>  * @this: dict to serialize</div><div class='ctx'>  * @buf:  pointer to pointer to character. The allocated buffer is stored in</div><div class='del'>- *        this pointer. The buffer has to be freed by the caller. </div><div class='add'>+ *        this pointer. The buffer has to be freed by the caller.</div><div class='ctx'>  *</div><div class='ctx'>  * @return: success: 0</div><div class='ctx'>  *          failure: -errno</div><div class='ctx'>  */</div><div class='ctx'> </div><div class='ctx'> int32_t</div><div class='del'>-dict_allocate_and_serialize (dict_t *this, char **buf, size_t *length)</div><div class='del'>-{</div><div class='del'>-	int           ret    = -EINVAL;</div><div class='del'>-        ssize_t       len = 0; </div><div class='del'>-</div><div class='del'>-	if (!this) {</div><div class='del'>-		gf_log ("dict", GF_LOG_DEBUG,</div><div class='del'>-			"NULL passed as this pointer");</div><div class='del'>-		goto out;</div><div class='del'>-	}</div><div class='del'>-	if (!buf) {</div><div class='del'>-		gf_log ("dict", GF_LOG_DEBUG,</div><div class='del'>-			"NULL passed as buf");</div><div class='del'>-		goto out;</div><div class='del'>-	}</div><div class='del'>-	</div><div class='del'>-        LOCK (&amp;this-&gt;lock);</div><div class='del'>-        { </div><div class='del'>-                len = _dict_serialized_length (this);</div><div class='del'>-                if (len &lt; 0) {</div><div class='del'>-                        ret = len;</div><div class='del'>-                        goto unlock;</div><div class='del'>-                }</div><div class='add'>+dict_allocate_and_serialize(dict_t *this, char **buf, u_int *length)</div><div class='add'>+{</div><div class='add'>+    int ret = -EINVAL;</div><div class='add'>+    ssize_t len = 0;</div><div class='add'>+</div><div class='add'>+    if (!this || !buf) {</div><div class='add'>+        gf_msg_debug("dict", 0, "dict OR buf is NULL");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;this-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        len = dict_serialized_length_lk(this);</div><div class='add'>+        if (len &lt; 0) {</div><div class='add'>+            ret = len;</div><div class='add'>+            goto unlock;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-                *buf = GF_CALLOC (1, len, gf_common_mt_char);</div><div class='del'>-                if (*buf == NULL) {</div><div class='del'>-                        ret = -ENOMEM;</div><div class='del'>-                        gf_log ("dict", GF_LOG_ERROR, "out of memory");</div><div class='del'>-                        goto unlock;</div><div class='del'>-                }</div><div class='add'>+        *buf = GF_MALLOC(len, gf_common_mt_char);</div><div class='add'>+        if (*buf == NULL) {</div><div class='add'>+            ret = -ENOMEM;</div><div class='add'>+            goto unlock;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-                ret = _dict_serialize (this, *buf);</div><div class='del'>-                if (ret &lt; 0) {</div><div class='del'>-                        GF_FREE (*buf);</div><div class='del'>-                        *buf = NULL;</div><div class='del'>-                        goto unlock;</div><div class='del'>-                }</div><div class='add'>+        ret = dict_serialize_lk(this, *buf);</div><div class='add'>+        if (ret &lt; 0) {</div><div class='add'>+            GF_FREE(*buf);</div><div class='add'>+            *buf = NULL;</div><div class='add'>+            goto unlock;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-                if (length != NULL) {</div><div class='del'>-                        *length = len;</div><div class='del'>-                }</div><div class='add'>+        if (length != NULL) {</div><div class='add'>+            *length = len;</div><div class='ctx'>         }</div><div class='add'>+    }</div><div class='ctx'> unlock:</div><div class='del'>-        UNLOCK (&amp;this-&gt;lock);</div><div class='add'>+    UNLOCK(&amp;this-&gt;lock);</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/**</div><div class='add'>+ * dict_serialize_value_with_delim_lk: serialize the values in the dictionary</div><div class='add'>+ * into a buffer separated by delimiter (except the last)</div><div class='add'>+ *</div><div class='add'>+ * @this      : dictionary to serialize</div><div class='add'>+ * @buf       : the buffer to store the serialized data</div><div class='add'>+ * @serz_len  : the length of the serialized data (excluding the last delimiter)</div><div class='add'>+ * @delimiter : the delimiter to separate the values</div><div class='add'>+ *</div><div class='add'>+ * @return    : 0 -&gt; success</div><div class='add'>+ *            : -errno -&gt; failure</div><div class='add'>+ */</div><div class='add'>+int</div><div class='add'>+dict_serialize_value_with_delim_lk(dict_t *this, char *buf, int32_t *serz_len,</div><div class='add'>+                                   char delimiter)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int32_t count = this-&gt;count;</div><div class='add'>+    int32_t vallen = 0;</div><div class='add'>+    int32_t total_len = 0;</div><div class='add'>+    data_pair_t *pair = this-&gt;members_list;</div><div class='add'>+</div><div class='add'>+    if (!buf) {</div><div class='add'>+        gf_smsg("dict", GF_LOG_ERROR, EINVAL, LG_MSG_INVALID_ARG, NULL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (count &lt; 0) {</div><div class='add'>+        gf_smsg("dict", GF_LOG_ERROR, EINVAL, LG_MSG_INVALID_ARG, "count=%d",</div><div class='add'>+                count, NULL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    while (count) {</div><div class='add'>+        if (!pair) {</div><div class='add'>+            gf_smsg("dict", GF_LOG_ERROR, 0, LG_MSG_PAIRS_LESS_THAN_COUNT,</div><div class='add'>+                    NULL);</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        if (!pair-&gt;key || !pair-&gt;value) {</div><div class='add'>+            gf_smsg("dict", GF_LOG_ERROR, 0, LG_MSG_KEY_OR_VALUE_NULL, NULL);</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        if (!pair-&gt;value-&gt;data) {</div><div class='add'>+            gf_smsg("dict", GF_LOG_ERROR, 0, LG_MSG_NULL_VALUE_IN_DICT, NULL);</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        vallen = pair-&gt;value-&gt;len - 1;  // length includes \0</div><div class='add'>+        memcpy(buf, pair-&gt;value-&gt;data, vallen);</div><div class='add'>+        buf += vallen;</div><div class='add'>+        *buf++ = delimiter;</div><div class='add'>+</div><div class='add'>+        total_len += (vallen + 1);</div><div class='add'>+</div><div class='add'>+        pair = pair-&gt;next;</div><div class='add'>+        count--;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    *--buf = '\0';  // remove the last delimiter</div><div class='add'>+    total_len--;    // adjust the length</div><div class='add'>+    ret = 0;</div><div class='add'>+</div><div class='add'>+    if (serz_len)</div><div class='add'>+        *serz_len = total_len;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+dict_serialize_value_with_delim(dict_t *this, char *buf, int32_t *serz_len,</div><div class='add'>+                                char delimiter)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    if (!this || !buf) {</div><div class='add'>+        gf_msg_callingfn("dict", GF_LOG_WARNING, EINVAL, LG_MSG_INVALID_ARG,</div><div class='add'>+                         "dict is null!");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;this-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        ret = dict_serialize_value_with_delim_lk(this, buf, serz_len,</div><div class='add'>+                                                 delimiter);</div><div class='add'>+    }</div><div class='add'>+    UNLOCK(&amp;this-&gt;lock);</div><div class='ctx'> out:</div><div class='del'>-	return ret;</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+dict_dump_to_str(dict_t *dict, char *dump, int dumpsize, char *format)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+    int dumplen = 0;</div><div class='add'>+    data_pair_t *trav = NULL;</div><div class='add'>+</div><div class='add'>+    if (!dict)</div><div class='add'>+        return 0;</div><div class='add'>+</div><div class='add'>+    for (trav = dict-&gt;members_list; trav; trav = trav-&gt;next) {</div><div class='add'>+        ret = snprintf(&amp;dump[dumplen], dumpsize - dumplen, format, trav-&gt;key,</div><div class='add'>+                       trav-&gt;value-&gt;data);</div><div class='add'>+        if ((ret == -1) || !ret)</div><div class='add'>+            return ret;</div><div class='add'>+</div><div class='add'>+        dumplen += ret;</div><div class='add'>+    }</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+dict_dump_to_log(dict_t *dict)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    char *dump = NULL;</div><div class='add'>+    const int dump_size = 64 * 1024;</div><div class='add'>+    char *format = "(%s:%s)";</div><div class='add'>+</div><div class='add'>+    if (!dict) {</div><div class='add'>+        gf_msg_callingfn("dict", GF_LOG_WARNING, EINVAL, LG_MSG_INVALID_ARG,</div><div class='add'>+                         "dict is NULL");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    dump = GF_MALLOC(dump_size, gf_common_mt_char);</div><div class='add'>+    if (!dump) {</div><div class='add'>+        gf_msg_callingfn("dict", GF_LOG_WARNING, ENOMEM, LG_MSG_NO_MEMORY,</div><div class='add'>+                         "dump buffer is NULL");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_dump_to_str(dict, dump, dump_size, format);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_smsg("dict", GF_LOG_WARNING, 0, LG_MSG_FAILED_TO_LOG_DICT, NULL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    gf_smsg("dict", GF_LOG_INFO, 0, LG_MSG_DICT_ERROR, "dict=%p", dict,</div><div class='add'>+            "dump=%s", dump, NULL);</div><div class='add'>+out:</div><div class='add'>+    GF_FREE(dump);</div><div class='add'>+</div><div class='add'>+    return;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+dict_dump_to_statedump(dict_t *dict, char *dict_name, char *domain)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    char *dump = NULL;</div><div class='add'>+    const int dump_size = 64 * 1024;</div><div class='add'>+    char key[4096] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    char *format = "\n\t%s:%s";</div><div class='add'>+</div><div class='add'>+    if (!dict) {</div><div class='add'>+        gf_msg_callingfn(domain, GF_LOG_WARNING, EINVAL, LG_MSG_INVALID_ARG,</div><div class='add'>+                         "dict is NULL");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    dump = GF_MALLOC(dump_size, gf_common_mt_char);</div><div class='add'>+    if (!dump) {</div><div class='add'>+        gf_msg_callingfn(domain, GF_LOG_WARNING, ENOMEM, LG_MSG_NO_MEMORY,</div><div class='add'>+                         "dump buffer is NULL");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_dump_to_str(dict, dump, dump_size, format);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_smsg(domain, GF_LOG_WARNING, 0, LG_MSG_FAILED_TO_LOG_DICT, "name=%s",</div><div class='add'>+                dict_name, NULL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    gf_proc_dump_build_key(key, domain, "%s", dict_name);</div><div class='add'>+    gf_proc_dump_write(key, "%s", dump);</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    GF_FREE(dump);</div><div class='add'>+</div><div class='add'>+    return;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+dict_t *</div><div class='add'>+dict_for_key_value(const char *name, const char *value, size_t size,</div><div class='add'>+                   gf_boolean_t is_static)</div><div class='add'>+{</div><div class='add'>+    dict_t *xattr = dict_new();</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    if (!xattr)</div><div class='add'>+        return NULL;</div><div class='add'>+</div><div class='add'>+    if (is_static)</div><div class='add'>+        ret = dict_set_static_bin(xattr, (char *)name, (void *)value, size);</div><div class='add'>+    else</div><div class='add'>+        ret = dict_set_bin(xattr, (char *)name, (void *)value, size);</div><div class='add'>+</div><div class='add'>+    if (ret) {</div><div class='add'>+        dict_destroy(xattr);</div><div class='add'>+        xattr = NULL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return xattr;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+ * "strings" should be NULL terminated strings array.</div><div class='add'>+ */</div><div class='add'>+int</div><div class='add'>+dict_has_key_from_array(dict_t *dict, char **strings, gf_boolean_t *result)</div><div class='add'>+{</div><div class='add'>+    int i = 0;</div><div class='add'>+    uint32_t hash = 0;</div><div class='add'>+</div><div class='add'>+    if (!dict || !strings || !result)</div><div class='add'>+        return -EINVAL;</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;dict-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        for (i = 0; strings[i]; i++) {</div><div class='add'>+            hash = (uint32_t)XXH64(strings[i], strlen(strings[i]), 0);</div><div class='add'>+            if (dict_lookup_common(dict, strings[i], hash)) {</div><div class='add'>+                *result = _gf_true;</div><div class='add'>+                goto unlock;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+        *result = _gf_false;</div><div class='add'>+    }</div><div class='add'>+unlock:</div><div class='add'>+    UNLOCK(&amp;dict-&gt;lock);</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='head'>diff --git a/libglusterfs/src/dict.h b/libglusterfs/src/dict.h<br/>deleted file mode 100644<br/>index 508b139a288..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/libglusterfs/src/dict.h?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/dict.h</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,185 +0,0 @@</div><div class='del'>-/*</div><div class='del'>-   Copyright (c) 2006-2009 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='del'>-   This file is part of GlusterFS.</div><div class='del'>-</div><div class='del'>-   GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-   it under the terms of the GNU General Public License as published</div><div class='del'>-   by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-   or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-   GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-   WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-   General Public License for more details.</div><div class='del'>-</div><div class='del'>-   You should have received a copy of the GNU General Public License</div><div class='del'>-   along with this program.  If not, see</div><div class='del'>-   &lt;http://www.gnu.org/licenses/&gt;.</div><div class='del'>-*/</div><div class='del'>-</div><div class='del'>-#ifndef _DICT_H</div><div class='del'>-#define _DICT_H</div><div class='del'>-</div><div class='del'>-#ifndef _CONFIG_H</div><div class='del'>-#define _CONFIG_H</div><div class='del'>-#include "config.h"</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-#include &lt;inttypes.h&gt;</div><div class='del'>-#include &lt;sys/uio.h&gt;</div><div class='del'>-#include &lt;pthread.h&gt;</div><div class='del'>-</div><div class='del'>-#include "common-utils.h"</div><div class='del'>-</div><div class='del'>-typedef struct _data data_t;</div><div class='del'>-typedef struct _dict dict_t;</div><div class='del'>-typedef struct _data_pair data_pair_t;</div><div class='del'>-</div><div class='del'>-struct _data {</div><div class='del'>-  unsigned char is_static:1;</div><div class='del'>-  unsigned char is_const:1;</div><div class='del'>-  int32_t len;</div><div class='del'>-  struct iovec *vec;</div><div class='del'>-  char *data;</div><div class='del'>-  int32_t refcount;</div><div class='del'>-  gf_lock_t lock;</div><div class='del'>-};</div><div class='del'>-</div><div class='del'>-struct _data_pair {</div><div class='del'>-  struct _data_pair *hash_next;</div><div class='del'>-  struct _data_pair *prev;</div><div class='del'>-  struct _data_pair *next;</div><div class='del'>-  data_t *value;</div><div class='del'>-  char *key;</div><div class='del'>-};</div><div class='del'>-</div><div class='del'>-struct _dict {</div><div class='del'>-  unsigned char is_static:1;</div><div class='del'>-  int32_t hash_size;</div><div class='del'>-  int32_t count;</div><div class='del'>-  int32_t refcount;</div><div class='del'>-  data_pair_t **members;</div><div class='del'>-  data_pair_t *members_list;</div><div class='del'>-  char *extra_free;</div><div class='del'>-  gf_lock_t lock;</div><div class='del'>-};</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int32_t is_data_equal (data_t *one, data_t *two);</div><div class='del'>-void data_destroy (data_t *data);</div><div class='del'>-</div><div class='del'>-int32_t dict_set (dict_t *this, char *key, data_t *value);</div><div class='del'>-data_t *dict_get (dict_t *this, char *key);</div><div class='del'>-void dict_del (dict_t *this, char *key);</div><div class='del'>-</div><div class='del'>-int32_t dict_serialized_length (dict_t *dict);</div><div class='del'>-int32_t dict_serialize (dict_t *dict, char *buf);</div><div class='del'>-int32_t dict_unserialize (char *buf, int32_t size, dict_t **fill);</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-dict_allocate_and_serialize (dict_t *this, char **buf, size_t *length);</div><div class='del'>-</div><div class='del'>-int32_t dict_iovec_len (dict_t *dict);</div><div class='del'>-int32_t dict_to_iovec (dict_t *dict, struct iovec *vec, int32_t count);</div><div class='del'>-			  </div><div class='del'>-void dict_destroy (dict_t *dict);</div><div class='del'>-void dict_unref (dict_t *dict);</div><div class='del'>-dict_t *dict_ref (dict_t *dict);</div><div class='del'>-data_t *data_ref (data_t *data);</div><div class='del'>-void data_unref (data_t *data);</div><div class='del'>-</div><div class='del'>-/* </div><div class='del'>-   TODO: provide converts for differnt byte sizes, signedness, and void *</div><div class='del'>- */</div><div class='del'>-data_t *int_to_data (int64_t value);</div><div class='del'>-data_t *str_to_data (char *value);</div><div class='del'>-data_t *data_from_dynstr (char *value);</div><div class='del'>-data_t *data_from_dynptr (void *value, int32_t len);</div><div class='del'>-data_t *bin_to_data (void *value, int32_t len);</div><div class='del'>-data_t *static_str_to_data (char *value);</div><div class='del'>-data_t *static_bin_to_data (void *value);</div><div class='del'>-</div><div class='del'>-int64_t data_to_int64 (data_t *data);</div><div class='del'>-int32_t data_to_int32 (data_t *data);</div><div class='del'>-int16_t data_to_int16 (data_t *data);</div><div class='del'>-int8_t data_to_int8 (data_t *data);</div><div class='del'>-</div><div class='del'>-uint64_t data_to_uint64 (data_t *data);</div><div class='del'>-uint32_t data_to_uint32 (data_t *data);</div><div class='del'>-uint16_t data_to_uint16 (data_t *data);</div><div class='del'>-</div><div class='del'>-data_t *data_from_ptr (void *value);</div><div class='del'>-data_t *data_from_static_ptr (void *value);</div><div class='del'>-</div><div class='del'>-data_t *data_from_int64 (int64_t value);</div><div class='del'>-data_t *data_from_int32 (int32_t value);</div><div class='del'>-data_t *data_from_int16 (int16_t value);</div><div class='del'>-data_t *data_from_int8 (int8_t value);</div><div class='del'>-</div><div class='del'>-data_t *data_from_uint64 (uint64_t value);</div><div class='del'>-data_t *data_from_uint32 (uint32_t value);</div><div class='del'>-data_t *data_from_uint16 (uint16_t value);</div><div class='del'>-</div><div class='del'>-char *data_to_str (data_t *data);</div><div class='del'>-void *data_to_bin (data_t *data);</div><div class='del'>-void *data_to_ptr (data_t *data);</div><div class='del'>-</div><div class='del'>-data_t *get_new_data ();</div><div class='del'>-dict_t *get_new_dict_full (int size_hint);</div><div class='del'>-dict_t *get_new_dict ();</div><div class='del'>-</div><div class='del'>-data_pair_t *get_new_data_pair ();</div><div class='del'>-</div><div class='del'>-void dict_foreach (dict_t *this,</div><div class='del'>-		   void (*fn)(dict_t *this,</div><div class='del'>-			      char *key,</div><div class='del'>-			      data_t *value,</div><div class='del'>-			      void *data),</div><div class='del'>-		   void *data);</div><div class='del'>-</div><div class='del'>-dict_t *dict_copy (dict_t *this,</div><div class='del'>-		   dict_t *new);</div><div class='del'>-</div><div class='del'>-/* CLEANED UP FUNCTIONS DECLARATIONS */</div><div class='del'>-GF_MUST_CHECK dict_t *dict_new (void);</div><div class='del'>-dict_t *dict_copy_with_ref (dict_t *this,</div><div class='del'>-			    dict_t *new);</div><div class='del'>-</div><div class='del'>-GF_MUST_CHECK int dict_get_int8 (dict_t *this, char *key, int8_t *val);</div><div class='del'>-GF_MUST_CHECK int dict_set_int8 (dict_t *this, char *key, int8_t val);</div><div class='del'>-</div><div class='del'>-GF_MUST_CHECK int dict_get_int16 (dict_t *this, char *key, int16_t *val);</div><div class='del'>-GF_MUST_CHECK int dict_set_int16 (dict_t *this, char *key, int16_t val);</div><div class='del'>-</div><div class='del'>-GF_MUST_CHECK int dict_get_int32 (dict_t *this, char *key, int32_t *val);</div><div class='del'>-GF_MUST_CHECK int dict_set_int32 (dict_t *this, char *key, int32_t val);</div><div class='del'>-</div><div class='del'>-GF_MUST_CHECK int dict_get_int64 (dict_t *this, char *key, int64_t *val);</div><div class='del'>-GF_MUST_CHECK int dict_set_int64 (dict_t *this, char *key, int64_t val);</div><div class='del'>-</div><div class='del'>-GF_MUST_CHECK int dict_get_uint16 (dict_t *this, char *key, uint16_t *val);</div><div class='del'>-GF_MUST_CHECK int dict_set_uint16 (dict_t *this, char *key, uint16_t val);</div><div class='del'>-</div><div class='del'>-GF_MUST_CHECK int dict_get_uint32 (dict_t *this, char *key, uint32_t *val);</div><div class='del'>-GF_MUST_CHECK int dict_set_uint32 (dict_t *this, char *key, uint32_t val);</div><div class='del'>-</div><div class='del'>-GF_MUST_CHECK int dict_get_uint64 (dict_t *this, char *key, uint64_t *val);</div><div class='del'>-GF_MUST_CHECK int dict_set_uint64 (dict_t *this, char *key, uint64_t val);</div><div class='del'>-</div><div class='del'>-GF_MUST_CHECK int dict_get_double (dict_t *this, char *key, double *val);</div><div class='del'>-GF_MUST_CHECK int dict_set_double (dict_t *this, char *key, double val);</div><div class='del'>-</div><div class='del'>-GF_MUST_CHECK int dict_set_static_ptr (dict_t *this, char *key, void *ptr);</div><div class='del'>-GF_MUST_CHECK int dict_get_ptr (dict_t *this, char *key, void **ptr);</div><div class='del'>-GF_MUST_CHECK int dict_set_ptr (dict_t *this, char *key, void *ptr);</div><div class='del'>-GF_MUST_CHECK int dict_set_dynptr (dict_t *this, char *key, void *ptr, size_t size);</div><div class='del'>-</div><div class='del'>-GF_MUST_CHECK int dict_get_bin (dict_t *this, char *key, void **ptr);</div><div class='del'>-GF_MUST_CHECK int dict_set_bin (dict_t *this, char *key, void *ptr, size_t size);</div><div class='del'>-GF_MUST_CHECK int dict_set_static_bin (dict_t *this, char *key, void *ptr, size_t size);</div><div class='del'>-</div><div class='del'>-GF_MUST_CHECK int dict_set_str (dict_t *this, char *key, char *str);</div><div class='del'>-GF_MUST_CHECK int dict_set_dynstr (dict_t *this, char *key, char *str);</div><div class='del'>-GF_MUST_CHECK int dict_get_str (dict_t *this, char *key, char **str);</div><div class='del'>-</div><div class='del'>-#endif</div><div class='head'>diff --git a/libglusterfs/src/event-epoll.c b/libglusterfs/src/event-epoll.c<br/>new file mode 100644<br/>index 00000000000..fb4fb845b40<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/libglusterfs/src/event-epoll.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>libglusterfs/src/event-epoll.c</a></div><div class='hunk'>@@ -0,0 +1,1032 @@</div><div class='add'>+/*</div><div class='add'>+  Copyright (c) 2012 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#include &lt;pthread.h&gt;</div><div class='add'>+#include &lt;stdlib.h&gt;</div><div class='add'>+#include &lt;errno.h&gt;</div><div class='add'>+</div><div class='add'>+#include "glusterfs/gf-event.h"</div><div class='add'>+#include "glusterfs/common-utils.h"</div><div class='add'>+#include "glusterfs/syscall.h"</div><div class='add'>+#include "glusterfs/libglusterfs-messages.h"</div><div class='add'>+</div><div class='add'>+#ifdef HAVE_SYS_EPOLL_H</div><div class='add'>+#include &lt;sys/epoll.h&gt;</div><div class='add'>+</div><div class='add'>+struct event_slot_epoll {</div><div class='add'>+    int fd;</div><div class='add'>+    int events;</div><div class='add'>+    int gen;</div><div class='add'>+    int idx;</div><div class='add'>+    gf_atomic_t ref;</div><div class='add'>+    int do_close;</div><div class='add'>+    int in_handler;</div><div class='add'>+    int handled_error;</div><div class='add'>+    void *data;</div><div class='add'>+    event_handler_t handler;</div><div class='add'>+    gf_lock_t lock;</div><div class='add'>+    struct list_head poller_death;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct event_thread_data {</div><div class='add'>+    struct event_pool *event_pool;</div><div class='add'>+    int event_index;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+static struct event_slot_epoll *</div><div class='add'>+__event_newtable(struct event_pool *event_pool, int table_idx)</div><div class='add'>+{</div><div class='add'>+    struct event_slot_epoll *table = NULL;</div><div class='add'>+    int i = -1;</div><div class='add'>+</div><div class='add'>+    table = GF_CALLOC(sizeof(*table), EVENT_EPOLL_SLOTS, gf_common_mt_ereg);</div><div class='add'>+    if (!table)</div><div class='add'>+        return NULL;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; EVENT_EPOLL_SLOTS; i++) {</div><div class='add'>+        table[i].fd = -1;</div><div class='add'>+        LOCK_INIT(&amp;table[i].lock);</div><div class='add'>+        INIT_LIST_HEAD(&amp;table[i].poller_death);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    event_pool-&gt;ereg[table_idx] = table;</div><div class='add'>+    event_pool-&gt;slots_used[table_idx] = 0;</div><div class='add'>+</div><div class='add'>+    return table;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+event_slot_ref(struct event_slot_epoll *slot)</div><div class='add'>+{</div><div class='add'>+    if (!slot)</div><div class='add'>+        return -1;</div><div class='add'>+</div><div class='add'>+    return GF_ATOMIC_INC(slot-&gt;ref);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+__event_slot_alloc(struct event_pool *event_pool, int fd,</div><div class='add'>+                   char notify_poller_death, struct event_slot_epoll **slot)</div><div class='add'>+{</div><div class='add'>+    int i = 0;</div><div class='add'>+    int j = 0;</div><div class='add'>+    int table_idx = -1;</div><div class='add'>+    int gen = -1;</div><div class='add'>+    struct event_slot_epoll *table = NULL;</div><div class='add'>+</div><div class='add'>+retry:</div><div class='add'>+</div><div class='add'>+    while (i &lt; EVENT_EPOLL_TABLES) {</div><div class='add'>+        switch (event_pool-&gt;slots_used[i]) {</div><div class='add'>+            case EVENT_EPOLL_SLOTS:</div><div class='add'>+                break;</div><div class='add'>+            case 0:</div><div class='add'>+                if (!event_pool-&gt;ereg[i]) {</div><div class='add'>+                    table = __event_newtable(event_pool, i);</div><div class='add'>+                    if (!table)</div><div class='add'>+                        return -1;</div><div class='add'>+                } else {</div><div class='add'>+                    table = event_pool-&gt;ereg[i];</div><div class='add'>+                }</div><div class='add'>+                break;</div><div class='add'>+            default:</div><div class='add'>+                table = event_pool-&gt;ereg[i];</div><div class='add'>+                break;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        if (table)</div><div class='add'>+            /* break out of the loop */</div><div class='add'>+            break;</div><div class='add'>+        i++;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (!table)</div><div class='add'>+        return -1;</div><div class='add'>+</div><div class='add'>+    table_idx = i;</div><div class='add'>+</div><div class='add'>+    for (j = 0; j &lt; EVENT_EPOLL_SLOTS; j++) {</div><div class='add'>+        if (table[j].fd == -1) {</div><div class='add'>+            /* wipe everything except bump the generation */</div><div class='add'>+            gen = table[j].gen;</div><div class='add'>+            memset(&amp;table[j], 0, sizeof(table[j]));</div><div class='add'>+            table[j].gen = gen + 1;</div><div class='add'>+</div><div class='add'>+            LOCK_INIT(&amp;table[j].lock);</div><div class='add'>+            INIT_LIST_HEAD(&amp;table[j].poller_death);</div><div class='add'>+</div><div class='add'>+            table[j].fd = fd;</div><div class='add'>+            if (notify_poller_death) {</div><div class='add'>+                table[j].idx = table_idx * EVENT_EPOLL_SLOTS + j;</div><div class='add'>+                list_add_tail(&amp;table[j].poller_death,</div><div class='add'>+                              &amp;event_pool-&gt;poller_death);</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            event_pool-&gt;slots_used[table_idx]++;</div><div class='add'>+</div><div class='add'>+            break;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (j == EVENT_EPOLL_SLOTS) {</div><div class='add'>+        table = NULL;</div><div class='add'>+        i++;</div><div class='add'>+        goto retry;</div><div class='add'>+    } else {</div><div class='add'>+        (*slot) = &amp;table[j];</div><div class='add'>+        event_slot_ref(*slot);</div><div class='add'>+        return table_idx * EVENT_EPOLL_SLOTS + j;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+event_slot_alloc(struct event_pool *event_pool, int fd,</div><div class='add'>+                 char notify_poller_death, struct event_slot_epoll **slot)</div><div class='add'>+{</div><div class='add'>+    int idx = -1;</div><div class='add'>+</div><div class='add'>+    pthread_mutex_lock(&amp;event_pool-&gt;mutex);</div><div class='add'>+    {</div><div class='add'>+        idx = __event_slot_alloc(event_pool, fd, notify_poller_death, slot);</div><div class='add'>+    }</div><div class='add'>+    pthread_mutex_unlock(&amp;event_pool-&gt;mutex);</div><div class='add'>+</div><div class='add'>+    return idx;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+__event_slot_dealloc(struct event_pool *event_pool, int idx)</div><div class='add'>+{</div><div class='add'>+    int table_idx = 0;</div><div class='add'>+    int offset = 0;</div><div class='add'>+    struct event_slot_epoll *table = NULL;</div><div class='add'>+    struct event_slot_epoll *slot = NULL;</div><div class='add'>+    int fd = -1;</div><div class='add'>+</div><div class='add'>+    table_idx = idx / EVENT_EPOLL_SLOTS;</div><div class='add'>+    offset = idx % EVENT_EPOLL_SLOTS;</div><div class='add'>+</div><div class='add'>+    table = event_pool-&gt;ereg[table_idx];</div><div class='add'>+    if (!table)</div><div class='add'>+        return;</div><div class='add'>+</div><div class='add'>+    slot = &amp;table[offset];</div><div class='add'>+    slot-&gt;gen++;</div><div class='add'>+</div><div class='add'>+    fd = slot-&gt;fd;</div><div class='add'>+    slot-&gt;fd = -1;</div><div class='add'>+    slot-&gt;handled_error = 0;</div><div class='add'>+    slot-&gt;in_handler = 0;</div><div class='add'>+    list_del_init(&amp;slot-&gt;poller_death);</div><div class='add'>+    if (fd != -1)</div><div class='add'>+        event_pool-&gt;slots_used[table_idx]--;</div><div class='add'>+</div><div class='add'>+    return;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+event_slot_dealloc(struct event_pool *event_pool, int idx)</div><div class='add'>+{</div><div class='add'>+    pthread_mutex_lock(&amp;event_pool-&gt;mutex);</div><div class='add'>+    {</div><div class='add'>+        __event_slot_dealloc(event_pool, idx);</div><div class='add'>+    }</div><div class='add'>+    pthread_mutex_unlock(&amp;event_pool-&gt;mutex);</div><div class='add'>+</div><div class='add'>+    return;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static struct event_slot_epoll *</div><div class='add'>+event_slot_get(struct event_pool *event_pool, int idx)</div><div class='add'>+{</div><div class='add'>+    struct event_slot_epoll *slot = NULL;</div><div class='add'>+    struct event_slot_epoll *table = NULL;</div><div class='add'>+    int table_idx = 0;</div><div class='add'>+    int offset = 0;</div><div class='add'>+</div><div class='add'>+    table_idx = idx / EVENT_EPOLL_SLOTS;</div><div class='add'>+    offset = idx % EVENT_EPOLL_SLOTS;</div><div class='add'>+</div><div class='add'>+    table = event_pool-&gt;ereg[table_idx];</div><div class='add'>+    if (!table)</div><div class='add'>+        return NULL;</div><div class='add'>+</div><div class='add'>+    slot = &amp;table[offset];</div><div class='add'>+</div><div class='add'>+    event_slot_ref(slot);</div><div class='add'>+    return slot;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+__event_slot_unref(struct event_pool *event_pool, struct event_slot_epoll *slot,</div><div class='add'>+                   int idx)</div><div class='add'>+{</div><div class='add'>+    int ref = -1;</div><div class='add'>+    int fd = -1;</div><div class='add'>+    int do_close = 0;</div><div class='add'>+</div><div class='add'>+    ref = GF_ATOMIC_DEC(slot-&gt;ref);</div><div class='add'>+    if (ref)</div><div class='add'>+        /* slot still alive */</div><div class='add'>+        goto done;</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;slot-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        fd = slot-&gt;fd;</div><div class='add'>+        do_close = slot-&gt;do_close;</div><div class='add'>+        slot-&gt;do_close = 0;</div><div class='add'>+    }</div><div class='add'>+    UNLOCK(&amp;slot-&gt;lock);</div><div class='add'>+</div><div class='add'>+    __event_slot_dealloc(event_pool, idx);</div><div class='add'>+</div><div class='add'>+    if (do_close)</div><div class='add'>+        sys_close(fd);</div><div class='add'>+done:</div><div class='add'>+    return;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+event_slot_unref(struct event_pool *event_pool, struct event_slot_epoll *slot,</div><div class='add'>+                 int idx)</div><div class='add'>+{</div><div class='add'>+    int ref = -1;</div><div class='add'>+    int fd = -1;</div><div class='add'>+    int do_close = 0;</div><div class='add'>+</div><div class='add'>+    ref = GF_ATOMIC_DEC(slot-&gt;ref);</div><div class='add'>+    if (ref)</div><div class='add'>+        /* slot still alive */</div><div class='add'>+        goto done;</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;slot-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        fd = slot-&gt;fd;</div><div class='add'>+        do_close = slot-&gt;do_close;</div><div class='add'>+        slot-&gt;do_close = 0;</div><div class='add'>+    }</div><div class='add'>+    UNLOCK(&amp;slot-&gt;lock);</div><div class='add'>+</div><div class='add'>+    event_slot_dealloc(event_pool, idx);</div><div class='add'>+</div><div class='add'>+    if (do_close)</div><div class='add'>+        sys_close(fd);</div><div class='add'>+done:</div><div class='add'>+    return;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static struct event_pool *</div><div class='add'>+event_pool_new_epoll(int count, int eventthreadcount)</div><div class='add'>+{</div><div class='add'>+    struct event_pool *event_pool = NULL;</div><div class='add'>+    int epfd = -1;</div><div class='add'>+</div><div class='add'>+    event_pool = GF_CALLOC(1, sizeof(*event_pool), gf_common_mt_event_pool);</div><div class='add'>+</div><div class='add'>+    if (!event_pool)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    epfd = epoll_create(count);</div><div class='add'>+</div><div class='add'>+    if (epfd == -1) {</div><div class='add'>+        gf_smsg("epoll", GF_LOG_ERROR, errno, LG_MSG_EPOLL_FD_CREATE_FAILED,</div><div class='add'>+                NULL);</div><div class='add'>+        GF_FREE(event_pool-&gt;reg);</div><div class='add'>+        GF_FREE(event_pool);</div><div class='add'>+        event_pool = NULL;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    event_pool-&gt;fd = epfd;</div><div class='add'>+</div><div class='add'>+    event_pool-&gt;count = count;</div><div class='add'>+    INIT_LIST_HEAD(&amp;event_pool-&gt;poller_death);</div><div class='add'>+    event_pool-&gt;eventthreadcount = eventthreadcount;</div><div class='add'>+    event_pool-&gt;auto_thread_count = 0;</div><div class='add'>+</div><div class='add'>+    pthread_mutex_init(&amp;event_pool-&gt;mutex, NULL);</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return event_pool;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+__slot_update_events(struct event_slot_epoll *slot, int poll_in, int poll_out)</div><div class='add'>+{</div><div class='add'>+    switch (poll_in) {</div><div class='add'>+        case 1:</div><div class='add'>+            slot-&gt;events |= EPOLLIN;</div><div class='add'>+            break;</div><div class='add'>+        case 0:</div><div class='add'>+            slot-&gt;events &amp;= ~EPOLLIN;</div><div class='add'>+            break;</div><div class='add'>+        case -1:</div><div class='add'>+            /* do nothing */</div><div class='add'>+            break;</div><div class='add'>+        default:</div><div class='add'>+            gf_smsg("epoll", GF_LOG_ERROR, 0, LG_MSG_INVALID_POLL_IN,</div><div class='add'>+                    "value=%d", poll_in, NULL);</div><div class='add'>+            break;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    switch (poll_out) {</div><div class='add'>+        case 1:</div><div class='add'>+            slot-&gt;events |= EPOLLOUT;</div><div class='add'>+            break;</div><div class='add'>+        case 0:</div><div class='add'>+            slot-&gt;events &amp;= ~EPOLLOUT;</div><div class='add'>+            break;</div><div class='add'>+        case -1:</div><div class='add'>+            /* do nothing */</div><div class='add'>+            break;</div><div class='add'>+        default:</div><div class='add'>+            gf_smsg("epoll", GF_LOG_ERROR, 0, LG_MSG_INVALID_POLL_OUT,</div><div class='add'>+                    "value=%d", poll_out, NULL);</div><div class='add'>+            break;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+event_register_epoll(struct event_pool *event_pool, int fd,</div><div class='add'>+                     event_handler_t handler, void *data, int poll_in,</div><div class='add'>+                     int poll_out, char notify_poller_death)</div><div class='add'>+{</div><div class='add'>+    int idx = -1;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int destroy = 0;</div><div class='add'>+    struct epoll_event epoll_event = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    struct event_data *ev_data = (void *)&amp;epoll_event.data;</div><div class='add'>+    struct event_slot_epoll *slot = NULL;</div><div class='add'>+</div><div class='add'>+    GF_VALIDATE_OR_GOTO("event", event_pool, out);</div><div class='add'>+</div><div class='add'>+    /* TODO: Even with the below check, there is a possibility of race,</div><div class='add'>+     * What if the destroy mode is set after the check is done.</div><div class='add'>+     * Not sure of the best way to prevent this race, ref counting</div><div class='add'>+     * is one possibility.</div><div class='add'>+     * There is no harm in registering and unregistering the fd</div><div class='add'>+     * even after destroy mode is set, just that such fds will remain</div><div class='add'>+     * open until unregister is called, also the events on that fd will be</div><div class='add'>+     * notified, until one of the poller thread is alive.</div><div class='add'>+     */</div><div class='add'>+    pthread_mutex_lock(&amp;event_pool-&gt;mutex);</div><div class='add'>+    {</div><div class='add'>+        destroy = event_pool-&gt;destroy;</div><div class='add'>+    }</div><div class='add'>+    pthread_mutex_unlock(&amp;event_pool-&gt;mutex);</div><div class='add'>+</div><div class='add'>+    if (destroy == 1)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    idx = event_slot_alloc(event_pool, fd, notify_poller_death, &amp;slot);</div><div class='add'>+    if (idx == -1) {</div><div class='add'>+        gf_smsg("epoll", GF_LOG_ERROR, 0, LG_MSG_SLOT_NOT_FOUND, "fd=%d", fd,</div><div class='add'>+                NULL);</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    assert(slot-&gt;fd == fd);</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;slot-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        /* make epoll 'singleshot', which</div><div class='add'>+           means we need to re-add the fd with</div><div class='add'>+           epoll_ctl(EPOLL_CTL_MOD) after delivery of every</div><div class='add'>+           single event. This assures us that while a poller</div><div class='add'>+           thread has picked up and is processing an event,</div><div class='add'>+           another poller will not try to pick this at the same</div><div class='add'>+           time as well.</div><div class='add'>+        */</div><div class='add'>+</div><div class='add'>+        slot-&gt;events = EPOLLPRI | EPOLLHUP | EPOLLERR | EPOLLONESHOT;</div><div class='add'>+        slot-&gt;handler = handler;</div><div class='add'>+        slot-&gt;data = data;</div><div class='add'>+</div><div class='add'>+        __slot_update_events(slot, poll_in, poll_out);</div><div class='add'>+</div><div class='add'>+        epoll_event.events = slot-&gt;events;</div><div class='add'>+        ev_data-&gt;idx = idx;</div><div class='add'>+        ev_data-&gt;gen = slot-&gt;gen;</div><div class='add'>+</div><div class='add'>+        ret = epoll_ctl(event_pool-&gt;fd, EPOLL_CTL_ADD, fd, &amp;epoll_event);</div><div class='add'>+        /* check ret after UNLOCK() to avoid deadlock in</div><div class='add'>+           event_slot_unref()</div><div class='add'>+        */</div><div class='add'>+    }</div><div class='add'>+    UNLOCK(&amp;slot-&gt;lock);</div><div class='add'>+</div><div class='add'>+    if (ret == -1) {</div><div class='add'>+        gf_smsg("epoll", GF_LOG_ERROR, errno, LG_MSG_EPOLL_FD_ADD_FAILED,</div><div class='add'>+                "fd=%d", fd, "epoll_fd=%d", event_pool-&gt;fd, NULL);</div><div class='add'>+        event_slot_unref(event_pool, slot, idx);</div><div class='add'>+        idx = -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* keep slot-&gt;ref (do not event_slot_unref) if successful */</div><div class='add'>+out:</div><div class='add'>+    return idx;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+event_unregister_epoll_common(struct event_pool *event_pool, int fd, int idx,</div><div class='add'>+                              int do_close)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    struct event_slot_epoll *slot = NULL;</div><div class='add'>+</div><div class='add'>+    GF_VALIDATE_OR_GOTO("event", event_pool, out);</div><div class='add'>+</div><div class='add'>+    /* During shutdown, it may happen that a socket registration with</div><div class='add'>+     * the event sub-system may fail and an rpc_transport_unref() may</div><div class='add'>+     * be called for such an unregistered socket with idx == -1. This</div><div class='add'>+     * may cause the following assert(slot-&gt;fd == fd) to fail.</div><div class='add'>+     */</div><div class='add'>+    if (idx &lt; 0)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    slot = event_slot_get(event_pool, idx);</div><div class='add'>+    if (!slot) {</div><div class='add'>+        gf_smsg("epoll", GF_LOG_ERROR, 0, LG_MSG_SLOT_NOT_FOUND, "fd=%d", fd,</div><div class='add'>+                "idx=%d", idx, NULL);</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    assert(slot-&gt;fd == fd);</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;slot-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        ret = epoll_ctl(event_pool-&gt;fd, EPOLL_CTL_DEL, fd, NULL);</div><div class='add'>+</div><div class='add'>+        if (ret == -1) {</div><div class='add'>+            gf_smsg("epoll", GF_LOG_ERROR, errno, LG_MSG_EPOLL_FD_DEL_FAILED,</div><div class='add'>+                    "fd=%d", fd, "epoll_fd=%d", event_pool-&gt;fd, NULL);</div><div class='add'>+            goto unlock;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        slot-&gt;do_close = do_close;</div><div class='add'>+        slot-&gt;gen++; /* detect unregister in dispatch_handler() */</div><div class='add'>+    }</div><div class='add'>+unlock:</div><div class='add'>+    UNLOCK(&amp;slot-&gt;lock);</div><div class='add'>+</div><div class='add'>+    event_slot_unref(event_pool, slot, idx); /* one for event_register() */</div><div class='add'>+    event_slot_unref(event_pool, slot, idx); /* one for event_slot_get() */</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+event_unregister_epoll(struct event_pool *event_pool, int fd, int idx_hint)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    ret = event_unregister_epoll_common(event_pool, fd, idx_hint, 0);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+event_unregister_close_epoll(struct event_pool *event_pool, int fd,</div><div class='add'>+                             int idx_hint)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    ret = event_unregister_epoll_common(event_pool, fd, idx_hint, 1);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+event_select_on_epoll(struct event_pool *event_pool, int fd, int idx,</div><div class='add'>+                      int poll_in, int poll_out)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    struct event_slot_epoll *slot = NULL;</div><div class='add'>+    struct epoll_event epoll_event = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    struct event_data *ev_data = (void *)&amp;epoll_event.data;</div><div class='add'>+</div><div class='add'>+    GF_VALIDATE_OR_GOTO("event", event_pool, out);</div><div class='add'>+</div><div class='add'>+    slot = event_slot_get(event_pool, idx);</div><div class='add'>+    if (!slot) {</div><div class='add'>+        gf_smsg("epoll", GF_LOG_ERROR, 0, LG_MSG_SLOT_NOT_FOUND, "fd=%d", fd,</div><div class='add'>+                "idx=%d", idx, NULL);</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    assert(slot-&gt;fd == fd);</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;slot-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        __slot_update_events(slot, poll_in, poll_out);</div><div class='add'>+</div><div class='add'>+        epoll_event.events = slot-&gt;events;</div><div class='add'>+        ev_data-&gt;idx = idx;</div><div class='add'>+        ev_data-&gt;gen = slot-&gt;gen;</div><div class='add'>+</div><div class='add'>+        if (slot-&gt;in_handler)</div><div class='add'>+            /*</div><div class='add'>+             * in_handler indicates at least one thread</div><div class='add'>+             * executing event_dispatch_epoll_handler()</div><div class='add'>+             * which will perform epoll_ctl(EPOLL_CTL_MOD)</div><div class='add'>+             * anyways (because of EPOLLET)</div><div class='add'>+             *</div><div class='add'>+             * This not only saves a system call, but also</div><div class='add'>+             * avoids possibility of another epoll thread</div><div class='add'>+             * picking up the next event while the ongoing</div><div class='add'>+             * handler is still in progress (and resulting</div><div class='add'>+             * in unnecessary contention on rpc_transport_t-&gt;mutex).</div><div class='add'>+             */</div><div class='add'>+            goto unlock;</div><div class='add'>+</div><div class='add'>+        ret = epoll_ctl(event_pool-&gt;fd, EPOLL_CTL_MOD, fd, &amp;epoll_event);</div><div class='add'>+        if (ret == -1) {</div><div class='add'>+            gf_smsg("epoll", GF_LOG_ERROR, errno, LG_MSG_EPOLL_FD_MODIFY_FAILED,</div><div class='add'>+                    "fd=%d", fd, "events=%d", epoll_event.events, NULL);</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+unlock:</div><div class='add'>+    UNLOCK(&amp;slot-&gt;lock);</div><div class='add'>+</div><div class='add'>+    event_slot_unref(event_pool, slot, idx);</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return idx;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+event_dispatch_epoll_handler(struct event_pool *event_pool,</div><div class='add'>+                             struct epoll_event *event)</div><div class='add'>+{</div><div class='add'>+    struct event_data *ev_data = NULL;</div><div class='add'>+    struct event_slot_epoll *slot = NULL;</div><div class='add'>+    event_handler_t handler = NULL;</div><div class='add'>+    void *data = NULL;</div><div class='add'>+    int idx = -1;</div><div class='add'>+    int gen = -1;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int fd = -1;</div><div class='add'>+    gf_boolean_t handled_error_previously = _gf_false;</div><div class='add'>+</div><div class='add'>+    ev_data = (void *)&amp;event-&gt;data;</div><div class='add'>+    handler = NULL;</div><div class='add'>+    data = NULL;</div><div class='add'>+</div><div class='add'>+    idx = ev_data-&gt;idx;</div><div class='add'>+    gen = ev_data-&gt;gen;</div><div class='add'>+</div><div class='add'>+    slot = event_slot_get(event_pool, idx);</div><div class='add'>+    if (!slot) {</div><div class='add'>+        gf_smsg("epoll", GF_LOG_ERROR, 0, LG_MSG_SLOT_NOT_FOUND, "idx=%d", idx,</div><div class='add'>+                NULL);</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;slot-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        fd = slot-&gt;fd;</div><div class='add'>+        if (fd == -1) {</div><div class='add'>+            gf_smsg("epoll", GF_LOG_ERROR, 0, LG_MSG_STALE_FD_FOUND, "idx=%d",</div><div class='add'>+                    idx, "gen=%d", gen, "events=%d", event-&gt;events,</div><div class='add'>+                    "slot-&gt;gen=%d", slot-&gt;gen, NULL);</div><div class='add'>+            /* fd got unregistered in another thread */</div><div class='add'>+            goto pre_unlock;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        if (gen != slot-&gt;gen) {</div><div class='add'>+            gf_smsg("epoll", GF_LOG_ERROR, 0, LG_MSG_GENERATION_MISMATCH,</div><div class='add'>+                    "idx=%d", idx, "gen=%d", gen, "slot-&gt;gen=%d", slot-&gt;gen,</div><div class='add'>+                    "slot-&gt;fd=%d", slot-&gt;fd, NULL);</div><div class='add'>+            /* slot was re-used and therefore is another fd! */</div><div class='add'>+            goto pre_unlock;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        handler = slot-&gt;handler;</div><div class='add'>+        data = slot-&gt;data;</div><div class='add'>+</div><div class='add'>+        if (slot-&gt;in_handler &gt; 0) {</div><div class='add'>+            /* Another handler is inprogress, skip this one. */</div><div class='add'>+            handler = NULL;</div><div class='add'>+            goto pre_unlock;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        if (slot-&gt;handled_error) {</div><div class='add'>+            handled_error_previously = _gf_true;</div><div class='add'>+        } else {</div><div class='add'>+            slot-&gt;handled_error = (event-&gt;events &amp; (EPOLLERR | EPOLLHUP));</div><div class='add'>+            slot-&gt;in_handler++;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+pre_unlock:</div><div class='add'>+    UNLOCK(&amp;slot-&gt;lock);</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+</div><div class='add'>+    if (!handler)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    if (!handled_error_previously) {</div><div class='add'>+        handler(fd, idx, gen, data, (event-&gt;events &amp; (EPOLLIN | EPOLLPRI)),</div><div class='add'>+                (event-&gt;events &amp; (EPOLLOUT)),</div><div class='add'>+                (event-&gt;events &amp; (EPOLLERR | EPOLLHUP)), 0);</div><div class='add'>+    }</div><div class='add'>+out:</div><div class='add'>+    event_slot_unref(event_pool, slot, idx);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void *</div><div class='add'>+event_dispatch_epoll_worker(void *data)</div><div class='add'>+{</div><div class='add'>+    struct epoll_event event;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    struct event_thread_data *ev_data = data;</div><div class='add'>+    struct event_pool *event_pool;</div><div class='add'>+    int myindex = -1;</div><div class='add'>+    int timetodie = 0, gen = 0;</div><div class='add'>+    struct list_head poller_death_notify;</div><div class='add'>+    struct event_slot_epoll *slot = NULL, *tmp = NULL;</div><div class='add'>+</div><div class='add'>+    GF_VALIDATE_OR_GOTO("event", ev_data, out);</div><div class='add'>+</div><div class='add'>+    event_pool = ev_data-&gt;event_pool;</div><div class='add'>+    myindex = ev_data-&gt;event_index;</div><div class='add'>+</div><div class='add'>+    GF_VALIDATE_OR_GOTO("event", event_pool, out);</div><div class='add'>+</div><div class='add'>+    gf_smsg("epoll", GF_LOG_INFO, 0, LG_MSG_STARTED_EPOLL_THREAD, "index=%d",</div><div class='add'>+            myindex - 1, NULL);</div><div class='add'>+</div><div class='add'>+    pthread_mutex_lock(&amp;event_pool-&gt;mutex);</div><div class='add'>+    {</div><div class='add'>+        event_pool-&gt;activethreadcount++;</div><div class='add'>+    }</div><div class='add'>+    pthread_mutex_unlock(&amp;event_pool-&gt;mutex);</div><div class='add'>+</div><div class='add'>+    for (;;) {</div><div class='add'>+        if (event_pool-&gt;eventthreadcount &lt; myindex) {</div><div class='add'>+            /* ...time to die, thread count was decreased below</div><div class='add'>+             * this threads index */</div><div class='add'>+            /* Start with extra safety at this point, reducing</div><div class='add'>+             * lock conention in normal case when threads are not</div><div class='add'>+             * reconfigured always */</div><div class='add'>+            pthread_mutex_lock(&amp;event_pool-&gt;mutex);</div><div class='add'>+            {</div><div class='add'>+                if (event_pool-&gt;eventthreadcount &lt; myindex) {</div><div class='add'>+                    while (event_pool-&gt;poller_death_sliced) {</div><div class='add'>+                        pthread_cond_wait(&amp;event_pool-&gt;cond,</div><div class='add'>+                                          &amp;event_pool-&gt;mutex);</div><div class='add'>+                    }</div><div class='add'>+</div><div class='add'>+                    INIT_LIST_HEAD(&amp;poller_death_notify);</div><div class='add'>+                    /* if found true in critical section,</div><div class='add'>+                     * die */</div><div class='add'>+                    event_pool-&gt;pollers[myindex - 1] = 0;</div><div class='add'>+                    event_pool-&gt;activethreadcount--;</div><div class='add'>+                    timetodie = 1;</div><div class='add'>+                    gen = ++event_pool-&gt;poller_gen;</div><div class='add'>+                    list_for_each_entry(slot, &amp;event_pool-&gt;poller_death,</div><div class='add'>+                                        poller_death)</div><div class='add'>+                    {</div><div class='add'>+                        event_slot_ref(slot);</div><div class='add'>+                    }</div><div class='add'>+</div><div class='add'>+                    list_splice_init(&amp;event_pool-&gt;poller_death,</div><div class='add'>+                                     &amp;poller_death_notify);</div><div class='add'>+                    event_pool-&gt;poller_death_sliced = 1;</div><div class='add'>+                    pthread_cond_broadcast(&amp;event_pool-&gt;cond);</div><div class='add'>+                }</div><div class='add'>+            }</div><div class='add'>+            pthread_mutex_unlock(&amp;event_pool-&gt;mutex);</div><div class='add'>+            if (timetodie) {</div><div class='add'>+                list_for_each_entry(slot, &amp;poller_death_notify, poller_death)</div><div class='add'>+                {</div><div class='add'>+                    slot-&gt;handler(slot-&gt;fd, 0, gen, slot-&gt;data, 0, 0, 0, 1);</div><div class='add'>+                }</div><div class='add'>+</div><div class='add'>+                pthread_mutex_lock(&amp;event_pool-&gt;mutex);</div><div class='add'>+                {</div><div class='add'>+                    list_for_each_entry_safe(slot, tmp, &amp;poller_death_notify,</div><div class='add'>+                                             poller_death)</div><div class='add'>+                    {</div><div class='add'>+                        __event_slot_unref(event_pool, slot, slot-&gt;idx);</div><div class='add'>+                    }</div><div class='add'>+</div><div class='add'>+                    list_splice(&amp;poller_death_notify,</div><div class='add'>+                                &amp;event_pool-&gt;poller_death);</div><div class='add'>+                    event_pool-&gt;poller_death_sliced = 0;</div><div class='add'>+                    pthread_cond_broadcast(&amp;event_pool-&gt;cond);</div><div class='add'>+                }</div><div class='add'>+                pthread_mutex_unlock(&amp;event_pool-&gt;mutex);</div><div class='add'>+</div><div class='add'>+                gf_smsg("epoll", GF_LOG_INFO, 0, LG_MSG_EXITED_EPOLL_THREAD,</div><div class='add'>+                        "index=%d", myindex, NULL);</div><div class='add'>+</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        ret = epoll_wait(event_pool-&gt;fd, &amp;event, 1, -1);</div><div class='add'>+</div><div class='add'>+        if (ret == 0)</div><div class='add'>+            /* timeout */</div><div class='add'>+            continue;</div><div class='add'>+</div><div class='add'>+        if (ret == -1 &amp;&amp; errno == EINTR)</div><div class='add'>+            /* sys call */</div><div class='add'>+            continue;</div><div class='add'>+</div><div class='add'>+        ret = event_dispatch_epoll_handler(event_pool, &amp;event);</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_smsg("epoll", GF_LOG_ERROR, 0, LG_MSG_DISPATCH_HANDLER_FAILED,</div><div class='add'>+                    NULL);</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+out:</div><div class='add'>+    if (ev_data)</div><div class='add'>+        GF_FREE(ev_data);</div><div class='add'>+    return NULL;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* Attempts to start the # of configured pollers, ensuring at least the first</div><div class='add'>+ * is started in a joinable state */</div><div class='add'>+static int</div><div class='add'>+event_dispatch_epoll(struct event_pool *event_pool)</div><div class='add'>+{</div><div class='add'>+    int i = 0;</div><div class='add'>+    pthread_t t_id;</div><div class='add'>+    int pollercount = 0;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    struct event_thread_data *ev_data = NULL;</div><div class='add'>+</div><div class='add'>+    /* Start the configured number of pollers */</div><div class='add'>+    pthread_mutex_lock(&amp;event_pool-&gt;mutex);</div><div class='add'>+    {</div><div class='add'>+        pollercount = event_pool-&gt;eventthreadcount;</div><div class='add'>+</div><div class='add'>+        /* Set to MAX if greater */</div><div class='add'>+        if (pollercount &gt; EVENT_MAX_THREADS)</div><div class='add'>+            pollercount = EVENT_MAX_THREADS;</div><div class='add'>+</div><div class='add'>+        /* Default pollers to 1 in case this is incorrectly set */</div><div class='add'>+        if (pollercount &lt;= 0)</div><div class='add'>+            pollercount = 1;</div><div class='add'>+</div><div class='add'>+        event_pool-&gt;activethreadcount++;</div><div class='add'>+</div><div class='add'>+        for (i = 0; i &lt; pollercount; i++) {</div><div class='add'>+            ev_data = GF_CALLOC(1, sizeof(*ev_data), gf_common_mt_event_pool);</div><div class='add'>+            if (!ev_data) {</div><div class='add'>+                if (i == 0) {</div><div class='add'>+                    /* Need to succeed creating 0'th</div><div class='add'>+                     * thread, to joinable and wait */</div><div class='add'>+                    break;</div><div class='add'>+                } else {</div><div class='add'>+                    /* Inability to create other threads</div><div class='add'>+                     * are a lesser evil, and ignored */</div><div class='add'>+                    continue;</div><div class='add'>+                }</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            ev_data-&gt;event_pool = event_pool;</div><div class='add'>+            ev_data-&gt;event_index = i + 1;</div><div class='add'>+</div><div class='add'>+            ret = gf_thread_create(&amp;t_id, NULL, event_dispatch_epoll_worker,</div><div class='add'>+                                   ev_data, "epoll%03hx", i &amp; 0x3ff);</div><div class='add'>+            if (!ret) {</div><div class='add'>+                event_pool-&gt;pollers[i] = t_id;</div><div class='add'>+</div><div class='add'>+                /* mark all threads other than one in index 0</div><div class='add'>+                 * as detachable. Errors can be ignored, they</div><div class='add'>+                 * spend their time as zombies if not detched</div><div class='add'>+                 * and the thread counts are decreased */</div><div class='add'>+                if (i != 0)</div><div class='add'>+                    pthread_detach(event_pool-&gt;pollers[i]);</div><div class='add'>+            } else {</div><div class='add'>+                gf_smsg("epoll", GF_LOG_WARNING, 0,</div><div class='add'>+                        LG_MSG_START_EPOLL_THREAD_FAILED, "index=%d", i, NULL);</div><div class='add'>+                if (i == 0) {</div><div class='add'>+                    GF_FREE(ev_data);</div><div class='add'>+                    break;</div><div class='add'>+                } else {</div><div class='add'>+                    GF_FREE(ev_data);</div><div class='add'>+                    continue;</div><div class='add'>+                }</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    pthread_mutex_unlock(&amp;event_pool-&gt;mutex);</div><div class='add'>+</div><div class='add'>+    /* Just wait for the first thread, that is created in a joinable state</div><div class='add'>+     * and will never die, ensuring this function never returns */</div><div class='add'>+    if (event_pool-&gt;pollers[0] != 0)</div><div class='add'>+        pthread_join(event_pool-&gt;pollers[0], NULL);</div><div class='add'>+</div><div class='add'>+    pthread_mutex_lock(&amp;event_pool-&gt;mutex);</div><div class='add'>+    {</div><div class='add'>+        event_pool-&gt;activethreadcount--;</div><div class='add'>+    }</div><div class='add'>+    pthread_mutex_unlock(&amp;event_pool-&gt;mutex);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/**</div><div class='add'>+ * @param event_pool  event_pool on which fds of interest are registered for</div><div class='add'>+ *                     events.</div><div class='add'>+ *</div><div class='add'>+ * @return  1 if at least one epoll worker thread is spawned, 0 otherwise</div><div class='add'>+ *</div><div class='add'>+ * NB This function SHOULD be called under event_pool-&gt;mutex.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+event_pool_dispatched_unlocked(struct event_pool *event_pool)</div><div class='add'>+{</div><div class='add'>+    return (event_pool-&gt;pollers[0] != 0);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+event_reconfigure_threads_epoll(struct event_pool *event_pool, int value)</div><div class='add'>+{</div><div class='add'>+    int i;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    pthread_t t_id;</div><div class='add'>+    int oldthreadcount;</div><div class='add'>+    struct event_thread_data *ev_data = NULL;</div><div class='add'>+</div><div class='add'>+    pthread_mutex_lock(&amp;event_pool-&gt;mutex);</div><div class='add'>+    {</div><div class='add'>+        /* Reconfigure to 0 threads is allowed only in destroy mode */</div><div class='add'>+        if (event_pool-&gt;destroy == 1) {</div><div class='add'>+            value = 0;</div><div class='add'>+        } else {</div><div class='add'>+            /* Set to MAX if greater */</div><div class='add'>+            if (value &gt; EVENT_MAX_THREADS)</div><div class='add'>+                value = EVENT_MAX_THREADS;</div><div class='add'>+</div><div class='add'>+            /* Default pollers to 1 in case this is set incorrectly */</div><div class='add'>+            if (value &lt;= 0)</div><div class='add'>+                value = 1;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        oldthreadcount = event_pool-&gt;eventthreadcount;</div><div class='add'>+</div><div class='add'>+        /* Start 'worker' threads as necessary only if event_dispatch()</div><div class='add'>+         * was called before. If event_dispatch() was not called, there</div><div class='add'>+         * will be no epoll 'worker' threads running yet. */</div><div class='add'>+</div><div class='add'>+        if (event_pool_dispatched_unlocked(event_pool) &amp;&amp;</div><div class='add'>+            (oldthreadcount &lt; value)) {</div><div class='add'>+            /* create more poll threads */</div><div class='add'>+            for (i = oldthreadcount; i &lt; value; i++) {</div><div class='add'>+                /* Start a thread if the index at this location</div><div class='add'>+                 * is a 0, so that the older thread is confirmed</div><div class='add'>+                 * as dead */</div><div class='add'>+                if (event_pool-&gt;pollers[i] == 0) {</div><div class='add'>+                    ev_data = GF_CALLOC(1, sizeof(*ev_data),</div><div class='add'>+                                        gf_common_mt_event_pool);</div><div class='add'>+                    if (!ev_data) {</div><div class='add'>+                        continue;</div><div class='add'>+                    }</div><div class='add'>+</div><div class='add'>+                    ev_data-&gt;event_pool = event_pool;</div><div class='add'>+                    ev_data-&gt;event_index = i + 1;</div><div class='add'>+</div><div class='add'>+                    ret = gf_thread_create(&amp;t_id, NULL,</div><div class='add'>+                                           event_dispatch_epoll_worker, ev_data,</div><div class='add'>+                                           "epoll%03hx", i &amp; 0x3ff);</div><div class='add'>+                    if (ret) {</div><div class='add'>+                        gf_smsg("epoll", GF_LOG_WARNING, 0,</div><div class='add'>+                                LG_MSG_START_EPOLL_THREAD_FAILED, "index=%d", i,</div><div class='add'>+                                NULL);</div><div class='add'>+                        GF_FREE(ev_data);</div><div class='add'>+                    } else {</div><div class='add'>+                        pthread_detach(t_id);</div><div class='add'>+                        event_pool-&gt;pollers[i] = t_id;</div><div class='add'>+                    }</div><div class='add'>+                }</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        /* if value decreases, threads will terminate, themselves */</div><div class='add'>+        event_pool-&gt;eventthreadcount = value;</div><div class='add'>+    }</div><div class='add'>+    pthread_mutex_unlock(&amp;event_pool-&gt;mutex);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* This function is the destructor for the event_pool data structure</div><div class='add'>+ * Should be called only after poller_threads_destroy() is called,</div><div class='add'>+ * else will lead to crashes.</div><div class='add'>+ */</div><div class='add'>+static int</div><div class='add'>+event_pool_destroy_epoll(struct event_pool *event_pool)</div><div class='add'>+{</div><div class='add'>+    int ret = 0, i = 0, j = 0;</div><div class='add'>+    struct event_slot_epoll *table = NULL;</div><div class='add'>+</div><div class='add'>+    ret = sys_close(event_pool-&gt;fd);</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; EVENT_EPOLL_TABLES; i++) {</div><div class='add'>+        if (event_pool-&gt;ereg[i]) {</div><div class='add'>+            table = event_pool-&gt;ereg[i];</div><div class='add'>+            event_pool-&gt;ereg[i] = NULL;</div><div class='add'>+            for (j = 0; j &lt; EVENT_EPOLL_SLOTS; j++) {</div><div class='add'>+                LOCK_DESTROY(&amp;table[j].lock);</div><div class='add'>+            }</div><div class='add'>+            GF_FREE(table);</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    pthread_mutex_destroy(&amp;event_pool-&gt;mutex);</div><div class='add'>+    pthread_cond_destroy(&amp;event_pool-&gt;cond);</div><div class='add'>+</div><div class='add'>+    GF_FREE(event_pool-&gt;evcache);</div><div class='add'>+    GF_FREE(event_pool-&gt;reg);</div><div class='add'>+    GF_FREE(event_pool);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+event_handled_epoll(struct event_pool *event_pool, int fd, int idx, int gen)</div><div class='add'>+{</div><div class='add'>+    struct event_slot_epoll *slot = NULL;</div><div class='add'>+    struct epoll_event epoll_event = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    struct event_data *ev_data = (void *)&amp;epoll_event.data;</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    slot = event_slot_get(event_pool, idx);</div><div class='add'>+    if (!slot) {</div><div class='add'>+        gf_smsg("epoll", GF_LOG_ERROR, 0, LG_MSG_SLOT_NOT_FOUND, "fd=%d", fd,</div><div class='add'>+                "idx=%d", idx, NULL);</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    assert(slot-&gt;fd == fd);</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;slot-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        slot-&gt;in_handler--;</div><div class='add'>+</div><div class='add'>+        if (gen != slot-&gt;gen) {</div><div class='add'>+            /* event_unregister() happened while we were</div><div class='add'>+               in handler()</div><div class='add'>+            */</div><div class='add'>+            gf_msg_debug("epoll", 0,</div><div class='add'>+                         "generation bumped on idx=%d"</div><div class='add'>+                         " from gen=%d to slot-&gt;gen=%d, fd=%d, "</div><div class='add'>+                         "slot-&gt;fd=%d",</div><div class='add'>+                         idx, gen, slot-&gt;gen, fd, slot-&gt;fd);</div><div class='add'>+            goto unlock;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        /* This call also picks up the changes made by another</div><div class='add'>+           thread calling event_select_on_epoll() while this</div><div class='add'>+           thread was busy in handler()</div><div class='add'>+        */</div><div class='add'>+        if (slot-&gt;in_handler == 0) {</div><div class='add'>+            epoll_event.events = slot-&gt;events;</div><div class='add'>+            ev_data-&gt;idx = idx;</div><div class='add'>+            ev_data-&gt;gen = gen;</div><div class='add'>+</div><div class='add'>+            ret = epoll_ctl(event_pool-&gt;fd, EPOLL_CTL_MOD, fd, &amp;epoll_event);</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+unlock:</div><div class='add'>+    UNLOCK(&amp;slot-&gt;lock);</div><div class='add'>+</div><div class='add'>+    event_slot_unref(event_pool, slot, idx);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+struct event_ops event_ops_epoll = {</div><div class='add'>+    .new = event_pool_new_epoll,</div><div class='add'>+    .event_register = event_register_epoll,</div><div class='add'>+    .event_select_on = event_select_on_epoll,</div><div class='add'>+    .event_unregister = event_unregister_epoll,</div><div class='add'>+    .event_unregister_close = event_unregister_close_epoll,</div><div class='add'>+    .event_dispatch = event_dispatch_epoll,</div><div class='add'>+    .event_reconfigure_threads = event_reconfigure_threads_epoll,</div><div class='add'>+    .event_pool_destroy = event_pool_destroy_epoll,</div><div class='add'>+    .event_handled = event_handled_epoll,</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+#endif</div><div class='head'>diff --git a/libglusterfs/src/event-history.c b/libglusterfs/src/event-history.c<br/>new file mode 100644<br/>index 00000000000..379fed866be<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/libglusterfs/src/event-history.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>libglusterfs/src/event-history.c</a></div><div class='hunk'>@@ -0,0 +1,82 @@</div><div class='add'>+/*</div><div class='add'>+  Copyright (c) 2008-2012 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#include "glusterfs/event-history.h"</div><div class='add'>+#include "glusterfs/libglusterfs-messages.h"</div><div class='add'>+</div><div class='add'>+eh_t *</div><div class='add'>+eh_new(size_t buffer_size, gf_boolean_t use_buffer_once,</div><div class='add'>+       void (*destroy_buffer_data)(void *data))</div><div class='add'>+{</div><div class='add'>+    eh_t *history = NULL;</div><div class='add'>+    buffer_t *buffer = NULL;</div><div class='add'>+</div><div class='add'>+    history = GF_CALLOC(1, sizeof(eh_t), gf_common_mt_eh_t);</div><div class='add'>+    if (!history) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    buffer = cb_buffer_new(buffer_size, use_buffer_once, destroy_buffer_data);</div><div class='add'>+    if (!buffer) {</div><div class='add'>+        GF_FREE(history);</div><div class='add'>+        history = NULL;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    history-&gt;buffer = buffer;</div><div class='add'>+</div><div class='add'>+    pthread_mutex_init(&amp;history-&gt;lock, NULL);</div><div class='add'>+out:</div><div class='add'>+    return history;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+eh_dump(eh_t *history, void *data,</div><div class='add'>+        int(dump_fn)(circular_buffer_t *buffer, void *data))</div><div class='add'>+{</div><div class='add'>+    if (!history) {</div><div class='add'>+        gf_msg_debug("event-history", 0, "history is NULL");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    cb_buffer_dump(history-&gt;buffer, data, dump_fn);</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+eh_save_history(eh_t *history, void *data)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    ret = cb_add_entry_buffer(history-&gt;buffer, data);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+eh_destroy(eh_t *history)</div><div class='add'>+{</div><div class='add'>+    if (!history) {</div><div class='add'>+        gf_msg("event-history", GF_LOG_INFO, 0, LG_MSG_INVALID_ARG,</div><div class='add'>+               "history for the xlator is NULL");</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    cb_buffer_destroy(history-&gt;buffer);</div><div class='add'>+    history-&gt;buffer = NULL;</div><div class='add'>+</div><div class='add'>+    pthread_mutex_destroy(&amp;history-&gt;lock);</div><div class='add'>+</div><div class='add'>+    GF_FREE(history);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='head'>diff --git a/libglusterfs/src/event-poll.c b/libglusterfs/src/event-poll.c<br/>new file mode 100644<br/>index 00000000000..2cba963f096<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/libglusterfs/src/event-poll.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>libglusterfs/src/event-poll.c</a></div><div class='hunk'>@@ -0,0 +1,513 @@</div><div class='add'>+/*</div><div class='add'>+  Copyright (c) 2012 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#include &lt;sys/poll.h&gt;</div><div class='add'>+#include &lt;pthread.h&gt;</div><div class='add'>+#include &lt;unistd.h&gt;</div><div class='add'>+#include &lt;fcntl.h&gt;</div><div class='add'>+#include &lt;stdlib.h&gt;</div><div class='add'>+#include &lt;errno.h&gt;</div><div class='add'>+#include &lt;string.h&gt;</div><div class='add'>+</div><div class='add'>+#include "glusterfs/logging.h"</div><div class='add'>+#include "glusterfs/gf-event.h"</div><div class='add'>+#include "glusterfs/mem-pool.h"</div><div class='add'>+#include "glusterfs/common-utils.h"</div><div class='add'>+#include "glusterfs/syscall.h"</div><div class='add'>+#include "glusterfs/libglusterfs-messages.h"</div><div class='add'>+</div><div class='add'>+struct event_slot_poll {</div><div class='add'>+    int fd;</div><div class='add'>+    int events;</div><div class='add'>+    void *data;</div><div class='add'>+    event_handler_t handler;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+event_register_poll(struct event_pool *event_pool, int fd,</div><div class='add'>+                    event_handler_t handler, void *data, int poll_in,</div><div class='add'>+                    int poll_out, char notify_poller_death);</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+__flush_fd(int fd, int idx, int gen, void *data, int poll_in, int poll_out,</div><div class='add'>+           int poll_err, char event_thread_died)</div><div class='add'>+{</div><div class='add'>+    char buf[64];</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    if (!poll_in)</div><div class='add'>+        return;</div><div class='add'>+</div><div class='add'>+    do {</div><div class='add'>+        ret = sys_read(fd, buf, 64);</div><div class='add'>+        if (ret == -1 &amp;&amp; errno != EAGAIN) {</div><div class='add'>+            gf_smsg("poll", GF_LOG_ERROR, errno, LG_MSG_READ_FILE_FAILED,</div><div class='add'>+                    "fd=%d", fd, NULL);</div><div class='add'>+        }</div><div class='add'>+    } while (ret == 64);</div><div class='add'>+</div><div class='add'>+    return;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+__event_getindex(struct event_pool *event_pool, int fd, int idx)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int i = 0;</div><div class='add'>+</div><div class='add'>+    GF_VALIDATE_OR_GOTO("event", event_pool, out);</div><div class='add'>+</div><div class='add'>+    /* lookup in used space based on index provided */</div><div class='add'>+    if (idx &gt; -1 &amp;&amp; idx &lt; event_pool-&gt;used) {</div><div class='add'>+        if (event_pool-&gt;reg[idx].fd == fd) {</div><div class='add'>+            ret = idx;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* search in used space, if lookup fails */</div><div class='add'>+    for (i = 0; i &lt; event_pool-&gt;used; i++) {</div><div class='add'>+        if (event_pool-&gt;reg[i].fd == fd) {</div><div class='add'>+            ret = i;</div><div class='add'>+            break;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static struct event_pool *</div><div class='add'>+event_pool_new_poll(int count, int eventthreadcount)</div><div class='add'>+{</div><div class='add'>+    struct event_pool *event_pool = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    event_pool = GF_CALLOC(1, sizeof(*event_pool), gf_common_mt_event_pool);</div><div class='add'>+</div><div class='add'>+    if (!event_pool)</div><div class='add'>+        return NULL;</div><div class='add'>+</div><div class='add'>+    event_pool-&gt;count = count;</div><div class='add'>+    event_pool-&gt;reg = GF_CALLOC(event_pool-&gt;count, sizeof(*event_pool-&gt;reg),</div><div class='add'>+                                gf_common_mt_reg);</div><div class='add'>+</div><div class='add'>+    if (!event_pool-&gt;reg) {</div><div class='add'>+        GF_FREE(event_pool);</div><div class='add'>+        return NULL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    pthread_mutex_init(&amp;event_pool-&gt;mutex, NULL);</div><div class='add'>+</div><div class='add'>+    ret = pipe(event_pool-&gt;breaker);</div><div class='add'>+</div><div class='add'>+    if (ret == -1) {</div><div class='add'>+        gf_smsg("poll", GF_LOG_ERROR, errno, LG_MSG_PIPE_CREATE_FAILED, NULL);</div><div class='add'>+        GF_FREE(event_pool-&gt;reg);</div><div class='add'>+        GF_FREE(event_pool);</div><div class='add'>+        return NULL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = fcntl(event_pool-&gt;breaker[0], F_SETFL, O_NONBLOCK);</div><div class='add'>+    if (ret == -1) {</div><div class='add'>+        gf_smsg("poll", GF_LOG_ERROR, errno, LG_MSG_SET_PIPE_FAILED, NULL);</div><div class='add'>+        sys_close(event_pool-&gt;breaker[0]);</div><div class='add'>+        sys_close(event_pool-&gt;breaker[1]);</div><div class='add'>+        event_pool-&gt;breaker[0] = event_pool-&gt;breaker[1] = -1;</div><div class='add'>+</div><div class='add'>+        GF_FREE(event_pool-&gt;reg);</div><div class='add'>+        GF_FREE(event_pool);</div><div class='add'>+        return NULL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = fcntl(event_pool-&gt;breaker[1], F_SETFL, O_NONBLOCK);</div><div class='add'>+    if (ret == -1) {</div><div class='add'>+        gf_smsg("poll", GF_LOG_ERROR, errno, LG_MSG_SET_PIPE_FAILED, NULL);</div><div class='add'>+</div><div class='add'>+        sys_close(event_pool-&gt;breaker[0]);</div><div class='add'>+        sys_close(event_pool-&gt;breaker[1]);</div><div class='add'>+        event_pool-&gt;breaker[0] = event_pool-&gt;breaker[1] = -1;</div><div class='add'>+</div><div class='add'>+        GF_FREE(event_pool-&gt;reg);</div><div class='add'>+        GF_FREE(event_pool);</div><div class='add'>+        return NULL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = event_register_poll(event_pool, event_pool-&gt;breaker[0], __flush_fd,</div><div class='add'>+                              NULL, 1, 0, 0);</div><div class='add'>+    if (ret == -1) {</div><div class='add'>+        gf_smsg("poll", GF_LOG_ERROR, 0, LG_MSG_REGISTER_PIPE_FAILED, NULL);</div><div class='add'>+        sys_close(event_pool-&gt;breaker[0]);</div><div class='add'>+        sys_close(event_pool-&gt;breaker[1]);</div><div class='add'>+        event_pool-&gt;breaker[0] = event_pool-&gt;breaker[1] = -1;</div><div class='add'>+</div><div class='add'>+        GF_FREE(event_pool-&gt;reg);</div><div class='add'>+        GF_FREE(event_pool);</div><div class='add'>+        return NULL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (eventthreadcount &gt; 1) {</div><div class='add'>+        gf_smsg("poll", GF_LOG_INFO, 0, LG_MSG_POLL_IGNORE_MULTIPLE_THREADS,</div><div class='add'>+                "count=%d", eventthreadcount, NULL);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* although, eventhreadcount for poll implementation is always</div><div class='add'>+     * going to be 1, eventthreadcount needs to be set to 1 so that</div><div class='add'>+     * rpcsvc_request_handler() thread scaling works flawlessly in</div><div class='add'>+     * both epoll and poll models</div><div class='add'>+     */</div><div class='add'>+    event_pool-&gt;eventthreadcount = 1;</div><div class='add'>+</div><div class='add'>+    return event_pool;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+event_register_poll(struct event_pool *event_pool, int fd,</div><div class='add'>+                    event_handler_t handler, void *data, int poll_in,</div><div class='add'>+                    int poll_out, char notify_poller_death)</div><div class='add'>+{</div><div class='add'>+    int idx = -1;</div><div class='add'>+</div><div class='add'>+    GF_VALIDATE_OR_GOTO("event", event_pool, out);</div><div class='add'>+</div><div class='add'>+    pthread_mutex_lock(&amp;event_pool-&gt;mutex);</div><div class='add'>+    {</div><div class='add'>+        if (event_pool-&gt;count == event_pool-&gt;used) {</div><div class='add'>+            event_pool-&gt;count += 256;</div><div class='add'>+</div><div class='add'>+            event_pool-&gt;reg = GF_REALLOC(</div><div class='add'>+                event_pool-&gt;reg, event_pool-&gt;count * sizeof(*event_pool-&gt;reg));</div><div class='add'>+            if (!event_pool-&gt;reg)</div><div class='add'>+                goto unlock;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        idx = event_pool-&gt;used++;</div><div class='add'>+</div><div class='add'>+        event_pool-&gt;reg[idx].fd = fd;</div><div class='add'>+        event_pool-&gt;reg[idx].events = POLLPRI;</div><div class='add'>+        event_pool-&gt;reg[idx].handler = handler;</div><div class='add'>+        event_pool-&gt;reg[idx].data = data;</div><div class='add'>+</div><div class='add'>+        switch (poll_in) {</div><div class='add'>+            case 1:</div><div class='add'>+                event_pool-&gt;reg[idx].events |= POLLIN;</div><div class='add'>+                break;</div><div class='add'>+            case 0:</div><div class='add'>+                event_pool-&gt;reg[idx].events &amp;= ~POLLIN;</div><div class='add'>+                break;</div><div class='add'>+            case -1:</div><div class='add'>+                /* do nothing */</div><div class='add'>+                break;</div><div class='add'>+            default:</div><div class='add'>+                gf_smsg("poll", GF_LOG_ERROR, 0, LG_MSG_INVALID_POLL_IN,</div><div class='add'>+                        "value=%d", poll_in, NULL);</div><div class='add'>+                break;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        switch (poll_out) {</div><div class='add'>+            case 1:</div><div class='add'>+                event_pool-&gt;reg[idx].events |= POLLOUT;</div><div class='add'>+                break;</div><div class='add'>+            case 0:</div><div class='add'>+                event_pool-&gt;reg[idx].events &amp;= ~POLLOUT;</div><div class='add'>+                break;</div><div class='add'>+            case -1:</div><div class='add'>+                /* do nothing */</div><div class='add'>+                break;</div><div class='add'>+            default:</div><div class='add'>+                gf_smsg("poll", GF_LOG_ERROR, 0, LG_MSG_INVALID_POLL_OUT,</div><div class='add'>+                        "value=%d", poll_out, NULL);</div><div class='add'>+                break;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        event_pool-&gt;changed = 1;</div><div class='add'>+    }</div><div class='add'>+unlock:</div><div class='add'>+    pthread_mutex_unlock(&amp;event_pool-&gt;mutex);</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return idx;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+event_unregister_poll(struct event_pool *event_pool, int fd, int idx_hint)</div><div class='add'>+{</div><div class='add'>+    int idx = -1;</div><div class='add'>+</div><div class='add'>+    GF_VALIDATE_OR_GOTO("event", event_pool, out);</div><div class='add'>+</div><div class='add'>+    pthread_mutex_lock(&amp;event_pool-&gt;mutex);</div><div class='add'>+    {</div><div class='add'>+        idx = __event_getindex(event_pool, fd, idx_hint);</div><div class='add'>+</div><div class='add'>+        if (idx == -1) {</div><div class='add'>+            gf_smsg("poll", GF_LOG_ERROR, 0, LG_MSG_INDEX_NOT_FOUND, "fd=%d",</div><div class='add'>+                    fd, "idx_hint=%d", idx_hint, NULL);</div><div class='add'>+            errno = ENOENT;</div><div class='add'>+            goto unlock;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        event_pool-&gt;reg[idx] = event_pool-&gt;reg[--event_pool-&gt;used];</div><div class='add'>+        event_pool-&gt;changed = 1;</div><div class='add'>+    }</div><div class='add'>+unlock:</div><div class='add'>+    pthread_mutex_unlock(&amp;event_pool-&gt;mutex);</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return idx;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+event_unregister_close_poll(struct event_pool *event_pool, int fd, int idx_hint)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    ret = event_unregister_poll(event_pool, fd, idx_hint);</div><div class='add'>+</div><div class='add'>+    sys_close(fd);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+event_select_on_poll(struct event_pool *event_pool, int fd, int idx_hint,</div><div class='add'>+                     int poll_in, int poll_out)</div><div class='add'>+{</div><div class='add'>+    int idx = -1;</div><div class='add'>+</div><div class='add'>+    GF_VALIDATE_OR_GOTO("event", event_pool, out);</div><div class='add'>+</div><div class='add'>+    pthread_mutex_lock(&amp;event_pool-&gt;mutex);</div><div class='add'>+    {</div><div class='add'>+        idx = __event_getindex(event_pool, fd, idx_hint);</div><div class='add'>+</div><div class='add'>+        if (idx == -1) {</div><div class='add'>+            gf_smsg("poll", GF_LOG_ERROR, 0, LG_MSG_INDEX_NOT_FOUND, "fd=%d",</div><div class='add'>+                    fd, "idx_hint=%d", idx_hint, NULL);</div><div class='add'>+            errno = ENOENT;</div><div class='add'>+            goto unlock;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        switch (poll_in) {</div><div class='add'>+            case 1:</div><div class='add'>+                event_pool-&gt;reg[idx].events |= POLLIN;</div><div class='add'>+                break;</div><div class='add'>+            case 0:</div><div class='add'>+                event_pool-&gt;reg[idx].events &amp;= ~POLLIN;</div><div class='add'>+                break;</div><div class='add'>+            case -1:</div><div class='add'>+                /* do nothing */</div><div class='add'>+                break;</div><div class='add'>+            default:</div><div class='add'>+                /* TODO: log error */</div><div class='add'>+                break;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        switch (poll_out) {</div><div class='add'>+            case 1:</div><div class='add'>+                event_pool-&gt;reg[idx].events |= POLLOUT;</div><div class='add'>+                break;</div><div class='add'>+            case 0:</div><div class='add'>+                event_pool-&gt;reg[idx].events &amp;= ~POLLOUT;</div><div class='add'>+                break;</div><div class='add'>+            case -1:</div><div class='add'>+                /* do nothing */</div><div class='add'>+                break;</div><div class='add'>+            default:</div><div class='add'>+                /* TODO: log error */</div><div class='add'>+                break;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        if (poll_in + poll_out &gt; -2)</div><div class='add'>+            event_pool-&gt;changed = 1;</div><div class='add'>+    }</div><div class='add'>+unlock:</div><div class='add'>+    pthread_mutex_unlock(&amp;event_pool-&gt;mutex);</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return idx;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+event_dispatch_poll_handler(struct event_pool *event_pool, struct pollfd *ufds,</div><div class='add'>+                            int i)</div><div class='add'>+{</div><div class='add'>+    event_handler_t handler = NULL;</div><div class='add'>+    void *data = NULL;</div><div class='add'>+    int idx = -1;</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    handler = NULL;</div><div class='add'>+    data = NULL;</div><div class='add'>+</div><div class='add'>+    pthread_mutex_lock(&amp;event_pool-&gt;mutex);</div><div class='add'>+    {</div><div class='add'>+        idx = __event_getindex(event_pool, ufds[i].fd, i);</div><div class='add'>+</div><div class='add'>+        if (idx == -1) {</div><div class='add'>+            gf_smsg("poll", GF_LOG_ERROR, 0, LG_MSG_INDEX_NOT_FOUND, "fd=%d",</div><div class='add'>+                    ufds[i].fd, "idx_hint=%d", i, NULL);</div><div class='add'>+            goto unlock;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        handler = event_pool-&gt;reg[idx].handler;</div><div class='add'>+        data = event_pool-&gt;reg[idx].data;</div><div class='add'>+    }</div><div class='add'>+unlock:</div><div class='add'>+    pthread_mutex_unlock(&amp;event_pool-&gt;mutex);</div><div class='add'>+</div><div class='add'>+    if (handler)</div><div class='add'>+        handler(ufds[i].fd, idx, 0, data,</div><div class='add'>+                (ufds[i].revents &amp; (POLLIN | POLLPRI)),</div><div class='add'>+                (ufds[i].revents &amp; (POLLOUT)),</div><div class='add'>+                (ufds[i].revents &amp; (POLLERR | POLLHUP | POLLNVAL)), 0);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+event_dispatch_poll_resize(struct event_pool *event_pool, struct pollfd *ufds,</div><div class='add'>+                           int size)</div><div class='add'>+{</div><div class='add'>+    int i = 0;</div><div class='add'>+</div><div class='add'>+    pthread_mutex_lock(&amp;event_pool-&gt;mutex);</div><div class='add'>+    {</div><div class='add'>+        if (event_pool-&gt;changed == 0) {</div><div class='add'>+            goto unlock;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        if (event_pool-&gt;used &gt; event_pool-&gt;evcache_size) {</div><div class='add'>+            GF_FREE(event_pool-&gt;evcache);</div><div class='add'>+</div><div class='add'>+            event_pool-&gt;evcache = ufds = NULL;</div><div class='add'>+</div><div class='add'>+            event_pool-&gt;evcache_size = event_pool-&gt;used;</div><div class='add'>+</div><div class='add'>+            ufds = GF_CALLOC(sizeof(struct pollfd), event_pool-&gt;evcache_size,</div><div class='add'>+                             gf_common_mt_pollfd);</div><div class='add'>+            if (!ufds)</div><div class='add'>+                goto unlock;</div><div class='add'>+            event_pool-&gt;evcache = ufds;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        if (ufds == NULL) {</div><div class='add'>+            goto unlock;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        for (i = 0; i &lt; event_pool-&gt;used; i++) {</div><div class='add'>+            ufds[i].fd = event_pool-&gt;reg[i].fd;</div><div class='add'>+            ufds[i].events = event_pool-&gt;reg[i].events;</div><div class='add'>+            ufds[i].revents = 0;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        size = i;</div><div class='add'>+    }</div><div class='add'>+unlock:</div><div class='add'>+    pthread_mutex_unlock(&amp;event_pool-&gt;mutex);</div><div class='add'>+</div><div class='add'>+    return size;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+event_dispatch_poll(struct event_pool *event_pool)</div><div class='add'>+{</div><div class='add'>+    struct pollfd *ufds = NULL;</div><div class='add'>+    int size = 0;</div><div class='add'>+    int i = 0;</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    GF_VALIDATE_OR_GOTO("event", event_pool, out);</div><div class='add'>+</div><div class='add'>+    pthread_mutex_lock(&amp;event_pool-&gt;mutex);</div><div class='add'>+    {</div><div class='add'>+        event_pool-&gt;activethreadcount = 1;</div><div class='add'>+    }</div><div class='add'>+    pthread_mutex_unlock(&amp;event_pool-&gt;mutex);</div><div class='add'>+</div><div class='add'>+    while (1) {</div><div class='add'>+        pthread_mutex_lock(&amp;event_pool-&gt;mutex);</div><div class='add'>+        {</div><div class='add'>+            if (event_pool-&gt;destroy == 1) {</div><div class='add'>+                event_pool-&gt;activethreadcount = 0;</div><div class='add'>+                pthread_cond_broadcast(&amp;event_pool-&gt;cond);</div><div class='add'>+                pthread_mutex_unlock(&amp;event_pool-&gt;mutex);</div><div class='add'>+                return 0;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+        pthread_mutex_unlock(&amp;event_pool-&gt;mutex);</div><div class='add'>+</div><div class='add'>+        size = event_dispatch_poll_resize(event_pool, ufds, size);</div><div class='add'>+        ufds = event_pool-&gt;evcache;</div><div class='add'>+</div><div class='add'>+        ret = poll(ufds, size, 1);</div><div class='add'>+</div><div class='add'>+        if (ret == 0)</div><div class='add'>+            /* timeout */</div><div class='add'>+            continue;</div><div class='add'>+</div><div class='add'>+        if (ret == -1 &amp;&amp; errno == EINTR)</div><div class='add'>+            /* sys call */</div><div class='add'>+            continue;</div><div class='add'>+</div><div class='add'>+        for (i = 0; i &lt; size; i++) {</div><div class='add'>+            if (!ufds[i].revents)</div><div class='add'>+                continue;</div><div class='add'>+</div><div class='add'>+            event_dispatch_poll_handler(event_pool, ufds, i);</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return -1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+event_reconfigure_threads_poll(struct event_pool *event_pool, int value)</div><div class='add'>+{</div><div class='add'>+    /* No-op for poll */</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* This function is the destructor for the event_pool data structure</div><div class='add'>+ * Should be called only after poller_threads_destroy() is called,</div><div class='add'>+ * else will lead to crashes.</div><div class='add'>+ */</div><div class='add'>+static int</div><div class='add'>+event_pool_destroy_poll(struct event_pool *event_pool)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    ret = sys_close(event_pool-&gt;breaker[0]);</div><div class='add'>+    if (ret)</div><div class='add'>+        return ret;</div><div class='add'>+</div><div class='add'>+    ret = sys_close(event_pool-&gt;breaker[1]);</div><div class='add'>+    if (ret)</div><div class='add'>+        return ret;</div><div class='add'>+</div><div class='add'>+    event_pool-&gt;breaker[0] = event_pool-&gt;breaker[1] = -1;</div><div class='add'>+</div><div class='add'>+    GF_FREE(event_pool-&gt;reg);</div><div class='add'>+    GF_FREE(event_pool);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+struct event_ops event_ops_poll = {</div><div class='add'>+    .new = event_pool_new_poll,</div><div class='add'>+    .event_register = event_register_poll,</div><div class='add'>+    .event_select_on = event_select_on_poll,</div><div class='add'>+    .event_unregister = event_unregister_poll,</div><div class='add'>+    .event_unregister_close = event_unregister_close_poll,</div><div class='add'>+    .event_dispatch = event_dispatch_poll,</div><div class='add'>+    .event_reconfigure_threads = event_reconfigure_threads_poll,</div><div class='add'>+    .event_pool_destroy = event_pool_destroy_poll};</div><div class='head'>diff --git a/libglusterfs/src/event.c b/libglusterfs/src/event.c<br/>index 59b1bd79eac..402c253ca25 100644<br/>--- a/<a href='/cgit/glusterfs.git/tree/libglusterfs/src/event.c?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/event.c</a><br/>+++ b/<a href='/cgit/glusterfs.git/tree/libglusterfs/src/event.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>libglusterfs/src/event.c</a></div><div class='hunk'>@@ -1,20 +1,11 @@</div><div class='ctx'> /*</div><div class='del'>-   Copyright (c) 2008-2009 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='del'>-   This file is part of GlusterFS.</div><div class='del'>-</div><div class='del'>-   GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-   it under the terms of the GNU General Public License as published</div><div class='del'>-   by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-   or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-   GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-   WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-   General Public License for more details.</div><div class='del'>-</div><div class='del'>-   You should have received a copy of the GNU General Public License</div><div class='del'>-   along with this program.  If not, see</div><div class='del'>-   &lt;http://www.gnu.org/licenses/&gt;.</div><div class='add'>+  Copyright (c) 2008-2012 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='ctx'> */</div><div class='ctx'> </div><div class='ctx'> #include &lt;sys/poll.h&gt;</div><div class='hunk'>@@ -25,963 +16,290 @@</div><div class='ctx'> #include &lt;errno.h&gt;</div><div class='ctx'> #include &lt;string.h&gt;</div><div class='ctx'> </div><div class='del'>-#include "logging.h"</div><div class='del'>-#include "event.h"</div><div class='del'>-#include "mem-pool.h"</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-#ifndef _CONFIG_H</div><div class='del'>-#define _CONFIG_H</div><div class='del'>-#include "config.h"</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-static int</div><div class='del'>-event_register_poll (struct event_pool *event_pool, int fd,</div><div class='del'>-		     event_handler_t handler,</div><div class='del'>-		     void *data, int poll_in, int poll_out);</div><div class='del'>-</div><div class='add'>+#include "glusterfs/gf-event.h"</div><div class='add'>+#include "glusterfs/timespec.h"</div><div class='add'>+#include "glusterfs/common-utils.h"</div><div class='add'>+#include "glusterfs/libglusterfs-messages.h"</div><div class='add'>+#include "glusterfs/syscall.h"</div><div class='ctx'> </div><div class='del'>-static int</div><div class='del'>-__flush_fd (int fd, int idx, void *data,</div><div class='del'>-	    int poll_in, int poll_out, int poll_err)</div><div class='del'>-{</div><div class='del'>-	char buf[64];</div><div class='del'>-	int ret = -1;</div><div class='del'>-</div><div class='del'>-	if (!poll_in)</div><div class='del'>-		return ret;</div><div class='del'>-</div><div class='del'>-	do {</div><div class='del'>-		ret = read (fd, buf, 64);</div><div class='del'>-		if (ret == -1 &amp;&amp; errno != EAGAIN) {</div><div class='del'>-			gf_log ("poll", GF_LOG_ERROR,</div><div class='del'>-				"read on %d returned error (%s)",</div><div class='del'>-				fd, strerror (errno));</div><div class='del'>-		}</div><div class='del'>-	} while (ret == 64);</div><div class='del'>-</div><div class='del'>-	return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-static int</div><div class='del'>-__event_getindex (struct event_pool *event_pool, int fd, int idx)</div><div class='add'>+struct event_pool *</div><div class='add'>+gf_event_pool_new(int count, int eventthreadcount)</div><div class='ctx'> {</div><div class='del'>-	int  ret = -1;</div><div class='del'>-	int  i = 0;</div><div class='del'>-  </div><div class='del'>-	if (event_pool == NULL) {</div><div class='del'>-		gf_log ("event", GF_LOG_ERROR, "invalid argument");</div><div class='del'>-		return -1;</div><div class='del'>-	}</div><div class='del'>-  </div><div class='del'>-	if (idx &gt; -1 &amp;&amp; idx &lt; event_pool-&gt;used) {</div><div class='del'>-		if (event_pool-&gt;reg[idx].fd == fd)</div><div class='del'>-			ret = idx;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	for (i=0; ret == -1 &amp;&amp; i&lt;event_pool-&gt;used; i++) {</div><div class='del'>-		if (event_pool-&gt;reg[i].fd == fd) {</div><div class='del'>-			ret = i;</div><div class='del'>-			break;</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	return ret;</div><div class='del'>-}</div><div class='add'>+    struct event_pool *event_pool = NULL;</div><div class='add'>+    extern struct event_ops event_ops_poll;</div><div class='ctx'> </div><div class='add'>+#ifdef HAVE_SYS_EPOLL_H</div><div class='add'>+    extern struct event_ops event_ops_epoll;</div><div class='ctx'> </div><div class='del'>-static struct event_pool *</div><div class='del'>-event_pool_new_poll (int count)</div><div class='del'>-{</div><div class='del'>-	struct event_pool *event_pool = NULL;</div><div class='del'>-	int                ret = -1;</div><div class='del'>-</div><div class='del'>-	event_pool = GF_CALLOC (1, sizeof (*event_pool),</div><div class='del'>-                                gf_common_mt_event_pool);</div><div class='del'>-</div><div class='del'>-	if (!event_pool)</div><div class='del'>-		return NULL;</div><div class='del'>-</div><div class='del'>-	event_pool-&gt;count = count;</div><div class='del'>-	event_pool-&gt;reg = GF_CALLOC (event_pool-&gt;count,</div><div class='del'>-				  sizeof (*event_pool-&gt;reg),</div><div class='del'>-                                  gf_common_mt_reg);</div><div class='del'>-</div><div class='del'>-	if (!event_pool-&gt;reg) {</div><div class='del'>-		gf_log ("poll", GF_LOG_CRITICAL,</div><div class='del'>-			"failed to allocate event registry");</div><div class='del'>-		GF_FREE (event_pool);</div><div class='del'>-		return NULL;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	pthread_mutex_init (&amp;event_pool-&gt;mutex, NULL);</div><div class='del'>-</div><div class='del'>-	ret = pipe (event_pool-&gt;breaker);</div><div class='del'>-</div><div class='del'>-	if (ret == -1) {</div><div class='del'>-		gf_log ("poll", GF_LOG_ERROR,</div><div class='del'>-			"pipe creation failed (%s)", strerror (errno));</div><div class='del'>-		GF_FREE (event_pool-&gt;reg);</div><div class='del'>-		GF_FREE (event_pool);</div><div class='del'>-		return NULL;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	ret = fcntl (event_pool-&gt;breaker[0], F_SETFL, O_NONBLOCK);</div><div class='del'>-	if (ret == -1) {</div><div class='del'>-		gf_log ("poll", GF_LOG_ERROR,</div><div class='del'>-			"could not set pipe to non blocking mode (%s)",</div><div class='del'>-			strerror (errno));</div><div class='del'>-		close (event_pool-&gt;breaker[0]);</div><div class='del'>-		close (event_pool-&gt;breaker[1]);</div><div class='del'>-		event_pool-&gt;breaker[0] = event_pool-&gt;breaker[1] = -1;</div><div class='del'>-</div><div class='del'>-		GF_FREE (event_pool-&gt;reg);</div><div class='del'>-		GF_FREE (event_pool);</div><div class='del'>-		return NULL;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	ret = fcntl (event_pool-&gt;breaker[1], F_SETFL, O_NONBLOCK);</div><div class='del'>-	if (ret == -1) {</div><div class='del'>-		gf_log ("poll", GF_LOG_ERROR,</div><div class='del'>-			"could not set pipe to non blocking mode (%s)",</div><div class='del'>-			strerror (errno));</div><div class='del'>-</div><div class='del'>-		close (event_pool-&gt;breaker[0]);</div><div class='del'>-		close (event_pool-&gt;breaker[1]);</div><div class='del'>-		event_pool-&gt;breaker[0] = event_pool-&gt;breaker[1] = -1;</div><div class='del'>-</div><div class='del'>-		GF_FREE (event_pool-&gt;reg);</div><div class='del'>-		GF_FREE (event_pool);</div><div class='del'>-		return NULL;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	ret = event_register_poll (event_pool, event_pool-&gt;breaker[0],</div><div class='del'>-				   __flush_fd, NULL, 1, 0);</div><div class='del'>-	if (ret == -1) {</div><div class='del'>-		gf_log ("poll", GF_LOG_ERROR,</div><div class='del'>-			"could not register pipe fd with poll event loop");</div><div class='del'>-		close (event_pool-&gt;breaker[0]);</div><div class='del'>-		close (event_pool-&gt;breaker[1]);</div><div class='del'>-		event_pool-&gt;breaker[0] = event_pool-&gt;breaker[1] = -1;</div><div class='del'>-</div><div class='del'>-		GF_FREE (event_pool-&gt;reg);</div><div class='del'>-		GF_FREE (event_pool);</div><div class='del'>-		return NULL;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	return event_pool;</div><div class='del'>-}</div><div class='add'>+    event_pool = event_ops_epoll.new(count, eventthreadcount);</div><div class='ctx'> </div><div class='add'>+    if (event_pool) {</div><div class='add'>+        event_pool-&gt;ops = &amp;event_ops_epoll;</div><div class='add'>+    } else {</div><div class='add'>+        gf_msg("event", GF_LOG_WARNING, 0, LG_MSG_FALLBACK_TO_POLL,</div><div class='add'>+               "falling back to poll based event handling");</div><div class='add'>+    }</div><div class='add'>+#endif</div><div class='ctx'> </div><div class='del'>-static int</div><div class='del'>-event_register_poll (struct event_pool *event_pool, int fd,</div><div class='del'>-		     event_handler_t handler,</div><div class='del'>-		     void *data, int poll_in, int poll_out)</div><div class='del'>-{</div><div class='del'>-	int idx = -1;</div><div class='del'>-</div><div class='del'>-	if (event_pool == NULL) {</div><div class='del'>-		gf_log ("event", GF_LOG_ERROR, "invalid argument");</div><div class='del'>-		return -1;</div><div class='del'>-	}</div><div class='del'>-  </div><div class='del'>-	pthread_mutex_lock (&amp;event_pool-&gt;mutex);</div><div class='del'>-	{</div><div class='del'>-		if (event_pool-&gt;count == event_pool-&gt;used)</div><div class='del'>-		{</div><div class='del'>-			event_pool-&gt;count += 256;</div><div class='del'>-</div><div class='del'>-			event_pool-&gt;reg = GF_REALLOC (event_pool-&gt;reg,</div><div class='del'>-					        event_pool-&gt;count *</div><div class='del'>-						sizeof (*event_pool-&gt;reg));</div><div class='del'>-                        if (!event_pool-&gt;reg)</div><div class='del'>-                                goto unlock;</div><div class='del'>-		}</div><div class='del'>-</div><div class='del'>-		idx = event_pool-&gt;used++;</div><div class='del'>-</div><div class='del'>-		event_pool-&gt;reg[idx].fd = fd;</div><div class='del'>-		event_pool-&gt;reg[idx].events = POLLPRI;</div><div class='del'>-		event_pool-&gt;reg[idx].handler = handler;</div><div class='del'>-		event_pool-&gt;reg[idx].data = data;</div><div class='del'>-</div><div class='del'>-		switch (poll_in) {</div><div class='del'>-		case 1:</div><div class='del'>-			event_pool-&gt;reg[idx].events |= POLLIN;</div><div class='del'>-			break;</div><div class='del'>-		case 0:</div><div class='del'>-			event_pool-&gt;reg[idx].events &amp;= ~POLLIN;</div><div class='del'>-			break;</div><div class='del'>-		case -1:</div><div class='del'>-			/* do nothing */</div><div class='del'>-			break;</div><div class='del'>-		default:</div><div class='del'>-			gf_log ("poll", GF_LOG_ERROR,</div><div class='del'>-				"invalid poll_in value %d", poll_in);</div><div class='del'>-			break;</div><div class='del'>-		}</div><div class='del'>-</div><div class='del'>-		switch (poll_out) {</div><div class='del'>-		case 1:</div><div class='del'>-			event_pool-&gt;reg[idx].events |= POLLOUT;</div><div class='del'>-			break;</div><div class='del'>-		case 0:</div><div class='del'>-			event_pool-&gt;reg[idx].events &amp;= ~POLLOUT;</div><div class='del'>-			break;</div><div class='del'>-		case -1:</div><div class='del'>-			/* do nothing */</div><div class='del'>-			break;</div><div class='del'>-		default:</div><div class='del'>-			gf_log ("poll", GF_LOG_ERROR,</div><div class='del'>-				"invalid poll_out value %d", poll_out);</div><div class='del'>-			break;</div><div class='del'>-		}</div><div class='del'>-</div><div class='del'>-		event_pool-&gt;changed = 1;</div><div class='del'>-</div><div class='del'>-	}</div><div class='del'>-unlock:</div><div class='del'>-	pthread_mutex_unlock (&amp;event_pool-&gt;mutex);</div><div class='del'>-</div><div class='del'>-	return idx;</div><div class='del'>-}</div><div class='add'>+    if (!event_pool) {</div><div class='add'>+        event_pool = event_ops_poll.new(count, eventthreadcount);</div><div class='ctx'> </div><div class='add'>+        if (event_pool)</div><div class='add'>+            event_pool-&gt;ops = &amp;event_ops_poll;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-static int</div><div class='del'>-event_unregister_poll (struct event_pool *event_pool, int fd, int idx_hint)</div><div class='del'>-{</div><div class='del'>-	int idx = -1;</div><div class='del'>-</div><div class='del'>-	if (event_pool == NULL) {</div><div class='del'>-		gf_log ("event", GF_LOG_ERROR, "invalid argument");</div><div class='del'>-		return -1;</div><div class='del'>-	}</div><div class='del'>-  </div><div class='del'>-	pthread_mutex_lock (&amp;event_pool-&gt;mutex);</div><div class='del'>-	{</div><div class='del'>-		idx = __event_getindex (event_pool, fd, idx_hint);</div><div class='del'>-</div><div class='del'>-		if (idx == -1) {</div><div class='del'>-			gf_log ("poll", GF_LOG_ERROR,</div><div class='del'>-				"index not found for fd=%d (idx_hint=%d)",</div><div class='del'>-				fd, idx_hint);</div><div class='del'>-			errno = ENOENT;</div><div class='del'>-			goto unlock;</div><div class='del'>-		}</div><div class='del'>-</div><div class='del'>-		event_pool-&gt;reg[idx] = 	event_pool-&gt;reg[--event_pool-&gt;used];</div><div class='del'>-		event_pool-&gt;changed = 1;</div><div class='del'>-	}</div><div class='del'>-unlock:</div><div class='del'>-	pthread_mutex_unlock (&amp;event_pool-&gt;mutex);</div><div class='del'>-</div><div class='del'>-	return idx;</div><div class='add'>+    return event_pool;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='del'>-static int</div><div class='del'>-event_select_on_poll (struct event_pool *event_pool, int fd, int idx_hint,</div><div class='del'>-		      int poll_in, int poll_out)</div><div class='del'>-{</div><div class='del'>-	int idx = -1;</div><div class='del'>-</div><div class='del'>-	if (event_pool == NULL) {</div><div class='del'>-		gf_log ("event", GF_LOG_ERROR, "invalid argument");</div><div class='del'>-		return -1;</div><div class='del'>-	}</div><div class='del'>-  </div><div class='del'>-	pthread_mutex_lock (&amp;event_pool-&gt;mutex);</div><div class='del'>-	{</div><div class='del'>-		idx = __event_getindex (event_pool, fd, idx_hint);</div><div class='del'>-</div><div class='del'>-		if (idx == -1) {</div><div class='del'>-			gf_log ("poll", GF_LOG_ERROR,</div><div class='del'>-				"index not found for fd=%d (idx_hint=%d)",</div><div class='del'>-				fd, idx_hint);</div><div class='del'>-			errno = ENOENT;</div><div class='del'>-			goto unlock;</div><div class='del'>-		}</div><div class='del'>-</div><div class='del'>-		switch (poll_in) {</div><div class='del'>-		case 1:</div><div class='del'>-			event_pool-&gt;reg[idx].events |= POLLIN;</div><div class='del'>-			break;</div><div class='del'>-		case 0:</div><div class='del'>-			event_pool-&gt;reg[idx].events &amp;= ~POLLIN;</div><div class='del'>-			break;</div><div class='del'>-		case -1:</div><div class='del'>-			/* do nothing */</div><div class='del'>-			break;</div><div class='del'>-		default:</div><div class='del'>-			/* TODO: log error */</div><div class='del'>-			break;</div><div class='del'>-		}</div><div class='del'>-</div><div class='del'>-		switch (poll_out) {</div><div class='del'>-		case 1:</div><div class='del'>-			event_pool-&gt;reg[idx].events |= POLLOUT;</div><div class='del'>-			break;</div><div class='del'>-		case 0:</div><div class='del'>-			event_pool-&gt;reg[idx].events &amp;= ~POLLOUT;</div><div class='del'>-			break;</div><div class='del'>-		case -1:</div><div class='del'>-			/* do nothing */</div><div class='del'>-			break;</div><div class='del'>-		default:</div><div class='del'>-			/* TODO: log error */</div><div class='del'>-			break;</div><div class='del'>-		}</div><div class='del'>-</div><div class='del'>-		if (poll_in + poll_out &gt; -2)</div><div class='del'>-			event_pool-&gt;changed = 1;</div><div class='del'>-	}</div><div class='del'>-unlock:</div><div class='del'>-	pthread_mutex_unlock (&amp;event_pool-&gt;mutex);</div><div class='del'>-</div><div class='del'>-	return idx;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-static int</div><div class='del'>-event_dispatch_poll_handler (struct event_pool *event_pool,</div><div class='del'>-			     struct pollfd *ufds, int i)</div><div class='add'>+int</div><div class='add'>+gf_event_register(struct event_pool *event_pool, int fd,</div><div class='add'>+                  event_handler_t handler, void *data, int poll_in,</div><div class='add'>+                  int poll_out, char notify_poller_death)</div><div class='ctx'> {</div><div class='del'>-	event_handler_t  handler = NULL;</div><div class='del'>-	void            *data = NULL;</div><div class='del'>-	int              idx = -1;</div><div class='del'>-	int              ret = 0;</div><div class='del'>-</div><div class='del'>-	handler = NULL;</div><div class='del'>-	data    = NULL;</div><div class='del'>-</div><div class='del'>-	pthread_mutex_lock (&amp;event_pool-&gt;mutex);</div><div class='del'>-	{</div><div class='del'>-		idx = __event_getindex (event_pool, ufds[i].fd, i);</div><div class='del'>-</div><div class='del'>-		if (idx == -1) {</div><div class='del'>-			gf_log ("poll", GF_LOG_ERROR,</div><div class='del'>-				"index not found for fd=%d (idx_hint=%d)",</div><div class='del'>-				ufds[i].fd, i);</div><div class='del'>-			goto unlock;</div><div class='del'>-		}</div><div class='del'>-</div><div class='del'>-		handler = event_pool-&gt;reg[idx].handler;</div><div class='del'>-		data = event_pool-&gt;reg[idx].data;</div><div class='del'>-	}</div><div class='del'>-unlock:</div><div class='del'>-	pthread_mutex_unlock (&amp;event_pool-&gt;mutex);</div><div class='del'>-</div><div class='del'>-	if (handler)</div><div class='del'>-		ret = handler (ufds[i].fd, idx, data,</div><div class='del'>-			       (ufds[i].revents &amp; (POLLIN|POLLPRI)),</div><div class='del'>-			       (ufds[i].revents &amp; (POLLOUT)),</div><div class='del'>-			       (ufds[i].revents &amp; (POLLERR|POLLHUP|POLLNVAL)));</div><div class='del'>-</div><div class='del'>-	return ret;</div><div class='del'>-}</div><div class='add'>+    int ret = -1;</div><div class='ctx'> </div><div class='add'>+    GF_VALIDATE_OR_GOTO("event", event_pool, out);</div><div class='ctx'> </div><div class='del'>-static int</div><div class='del'>-event_dispatch_poll_resize (struct event_pool *event_pool,</div><div class='del'>-			    struct pollfd *ufds, int size)</div><div class='del'>-{</div><div class='del'>-	int              i = 0;</div><div class='del'>-</div><div class='del'>-	pthread_mutex_lock (&amp;event_pool-&gt;mutex);</div><div class='del'>-	{</div><div class='del'>-		if (event_pool-&gt;changed == 0) {</div><div class='del'>-			goto unlock;</div><div class='del'>-		}</div><div class='del'>-</div><div class='del'>-		if (event_pool-&gt;used &gt; event_pool-&gt;evcache_size) {</div><div class='del'>-			if (event_pool-&gt;evcache)</div><div class='del'>-				GF_FREE (event_pool-&gt;evcache);</div><div class='del'>-</div><div class='del'>-			event_pool-&gt;evcache = ufds = NULL;</div><div class='del'>-</div><div class='del'>-			event_pool-&gt;evcache_size = event_pool-&gt;used;</div><div class='del'>-</div><div class='del'>-			ufds = GF_CALLOC (sizeof (struct pollfd),</div><div class='del'>-					  event_pool-&gt;evcache_size,</div><div class='del'>-                                          gf_common_mt_pollfd);</div><div class='del'>-                        if (!ufds)</div><div class='del'>-                                goto unlock;</div><div class='del'>-			event_pool-&gt;evcache = ufds;</div><div class='del'>-		}</div><div class='del'>-</div><div class='del'>-		for (i = 0; i &lt; event_pool-&gt;used; i++) {</div><div class='del'>-			ufds[i].fd = event_pool-&gt;reg[i].fd;</div><div class='del'>-			ufds[i].events = event_pool-&gt;reg[i].events;</div><div class='del'>-			ufds[i].revents = 0;</div><div class='del'>-		}</div><div class='del'>-</div><div class='del'>-		size = i;</div><div class='del'>-	}</div><div class='del'>-unlock:</div><div class='del'>-	pthread_mutex_unlock (&amp;event_pool-&gt;mutex);</div><div class='del'>-</div><div class='del'>-	return size;</div><div class='add'>+    ret = event_pool-&gt;ops-&gt;event_register(</div><div class='add'>+        event_pool, fd, handler, data, poll_in, poll_out, notify_poller_death);</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='del'>-static int</div><div class='del'>-event_dispatch_poll (struct event_pool *event_pool)</div><div class='add'>+int</div><div class='add'>+gf_event_unregister(struct event_pool *event_pool, int fd, int idx)</div><div class='ctx'> {</div><div class='del'>-	struct pollfd   *ufds = NULL;</div><div class='del'>-	int              size = 0;</div><div class='del'>-	int              i = 0;</div><div class='del'>-	int              ret = -1;</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-	if (event_pool == NULL) {</div><div class='del'>-		gf_log ("event", GF_LOG_ERROR, "invalid argument");</div><div class='del'>-		return -1;</div><div class='del'>-	}</div><div class='del'>-  </div><div class='del'>-	while (1) {</div><div class='del'>-		size = event_dispatch_poll_resize (event_pool, ufds, size);</div><div class='del'>-		ufds = event_pool-&gt;evcache;</div><div class='del'>-</div><div class='del'>-		ret = poll (ufds, size, 1);</div><div class='del'>-</div><div class='del'>-		if (ret == 0)</div><div class='del'>-			/* timeout */</div><div class='del'>-			continue;</div><div class='add'>+    int ret = -1;</div><div class='ctx'> </div><div class='del'>-		if (ret == -1 &amp;&amp; errno == EINTR)</div><div class='del'>-			/* sys call */</div><div class='del'>-			continue;</div><div class='add'>+    GF_VALIDATE_OR_GOTO("event", event_pool, out);</div><div class='ctx'> </div><div class='del'>-		for (i = 0; i &lt; size; i++) {</div><div class='del'>-			if (!ufds[i].revents)</div><div class='del'>-				continue;</div><div class='add'>+    ret = event_pool-&gt;ops-&gt;event_unregister(event_pool, fd, idx);</div><div class='ctx'> </div><div class='del'>-			event_dispatch_poll_handler (event_pool, ufds, i);</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	return -1;</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='del'>-static struct event_ops event_ops_poll = {</div><div class='del'>-	.new              = event_pool_new_poll,</div><div class='del'>-	.event_register   = event_register_poll,</div><div class='del'>-	.event_select_on  = event_select_on_poll,</div><div class='del'>-	.event_unregister = event_unregister_poll,</div><div class='del'>-	.event_dispatch   = event_dispatch_poll</div><div class='del'>-};</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-#ifdef HAVE_SYS_EPOLL_H</div><div class='del'>-#include &lt;sys/epoll.h&gt;</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-static struct event_pool *</div><div class='del'>-event_pool_new_epoll (int count)</div><div class='add'>+int</div><div class='add'>+gf_event_unregister_close(struct event_pool *event_pool, int fd, int idx)</div><div class='ctx'> {</div><div class='del'>-	struct event_pool *event_pool = NULL;</div><div class='del'>-	int                epfd = -1;</div><div class='del'>-</div><div class='del'>-	event_pool = GF_CALLOC (1, sizeof (*event_pool),</div><div class='del'>-                                gf_common_mt_event_pool);</div><div class='add'>+    int ret = -1;</div><div class='ctx'> </div><div class='del'>-	if (!event_pool)</div><div class='del'>-		return NULL;</div><div class='add'>+    GF_VALIDATE_OR_GOTO("event", event_pool, out);</div><div class='ctx'> </div><div class='del'>-	event_pool-&gt;count = count;</div><div class='del'>-	event_pool-&gt;reg = GF_CALLOC (event_pool-&gt;count,</div><div class='del'>-				  sizeof (*event_pool-&gt;reg),</div><div class='del'>-                                  gf_common_mt_reg);</div><div class='add'>+    ret = event_pool-&gt;ops-&gt;event_unregister_close(event_pool, fd, idx);</div><div class='ctx'> </div><div class='del'>-	if (!event_pool-&gt;reg) {</div><div class='del'>-		gf_log ("epoll", GF_LOG_CRITICAL,</div><div class='del'>-			"event registry allocation failed");</div><div class='del'>-		GF_FREE (event_pool);</div><div class='del'>-		return NULL;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	epfd = epoll_create (count);</div><div class='del'>-</div><div class='del'>-	if (epfd == -1) {</div><div class='del'>-		gf_log ("epoll", GF_LOG_ERROR, "epoll fd creation failed (%s)",</div><div class='del'>-			strerror (errno));</div><div class='del'>-		GF_FREE (event_pool-&gt;reg);</div><div class='del'>-		GF_FREE (event_pool);</div><div class='del'>-		return NULL;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	event_pool-&gt;fd = epfd;</div><div class='del'>-</div><div class='del'>-	event_pool-&gt;count = count;</div><div class='del'>-</div><div class='del'>-	pthread_mutex_init (&amp;event_pool-&gt;mutex, NULL);</div><div class='del'>-	pthread_cond_init (&amp;event_pool-&gt;cond, NULL);</div><div class='del'>-</div><div class='del'>-	return event_pool;</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-event_register_epoll (struct event_pool *event_pool, int fd,</div><div class='del'>-		      event_handler_t handler,</div><div class='del'>-		      void *data, int poll_in, int poll_out)</div><div class='add'>+gf_event_select_on(struct event_pool *event_pool, int fd, int idx_hint,</div><div class='add'>+                   int poll_in, int poll_out)</div><div class='ctx'> {</div><div class='del'>-	int                 idx = -1;</div><div class='del'>-	int                 ret = -1;</div><div class='del'>-	struct epoll_event  epoll_event = {0, };</div><div class='del'>-	struct event_data  *ev_data = (void *)&amp;epoll_event.data;</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-	if (event_pool == NULL) {</div><div class='del'>-		gf_log ("event", GF_LOG_ERROR, "invalid argument");</div><div class='del'>-		return -1;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	pthread_mutex_lock (&amp;event_pool-&gt;mutex);</div><div class='del'>-	{</div><div class='del'>-		if (event_pool-&gt;count == event_pool-&gt;used) {</div><div class='del'>-			event_pool-&gt;count *= 2;</div><div class='del'>-</div><div class='del'>-			event_pool-&gt;reg = GF_REALLOC (event_pool-&gt;reg,</div><div class='del'>-						   event_pool-&gt;count *</div><div class='del'>-						   sizeof (*event_pool-&gt;reg));</div><div class='del'>-</div><div class='del'>-			if (!event_pool-&gt;reg) {</div><div class='del'>-				gf_log ("epoll", GF_LOG_ERROR,</div><div class='del'>-					"event registry re-allocation failed");</div><div class='del'>-				goto unlock;</div><div class='del'>-			}</div><div class='del'>-		}</div><div class='del'>-</div><div class='del'>-		idx = event_pool-&gt;used;</div><div class='del'>-		event_pool-&gt;used++;</div><div class='del'>-</div><div class='del'>-		event_pool-&gt;reg[idx].fd = fd;</div><div class='del'>-		event_pool-&gt;reg[idx].events = EPOLLPRI;</div><div class='del'>-		event_pool-&gt;reg[idx].handler = handler;</div><div class='del'>-		event_pool-&gt;reg[idx].data = data;</div><div class='del'>-</div><div class='del'>-		switch (poll_in) {</div><div class='del'>-		case 1:</div><div class='del'>-			event_pool-&gt;reg[idx].events |= EPOLLIN;</div><div class='del'>-			break;</div><div class='del'>-		case 0:</div><div class='del'>-			event_pool-&gt;reg[idx].events &amp;= ~EPOLLIN;</div><div class='del'>-			break;</div><div class='del'>-		case -1:</div><div class='del'>-			/* do nothing */</div><div class='del'>-			break;</div><div class='del'>-		default:</div><div class='del'>-			gf_log ("epoll", GF_LOG_ERROR,</div><div class='del'>-				"invalid poll_in value %d", poll_in);</div><div class='del'>-			break;</div><div class='del'>-		}</div><div class='del'>-</div><div class='del'>-		switch (poll_out) {</div><div class='del'>-		case 1:</div><div class='del'>-			event_pool-&gt;reg[idx].events |= EPOLLOUT;</div><div class='del'>-			break;</div><div class='del'>-		case 0:</div><div class='del'>-			event_pool-&gt;reg[idx].events &amp;= ~EPOLLOUT;</div><div class='del'>-			break;</div><div class='del'>-		case -1:</div><div class='del'>-			/* do nothing */</div><div class='del'>-			break;</div><div class='del'>-		default:</div><div class='del'>-			gf_log ("epoll", GF_LOG_ERROR,</div><div class='del'>-				"invalid poll_out value %d", poll_out);</div><div class='del'>-			break;</div><div class='del'>-		}</div><div class='del'>-</div><div class='del'>-		event_pool-&gt;changed = 1;</div><div class='del'>-</div><div class='del'>-		epoll_event.events = event_pool-&gt;reg[idx].events;</div><div class='del'>-		ev_data-&gt;fd = fd;</div><div class='del'>-		ev_data-&gt;idx = idx;</div><div class='del'>-</div><div class='del'>-		ret = epoll_ctl (event_pool-&gt;fd, EPOLL_CTL_ADD, fd,</div><div class='del'>-				 &amp;epoll_event);</div><div class='del'>-</div><div class='del'>-		if (ret == -1) {</div><div class='del'>-			gf_log ("epoll", GF_LOG_ERROR,</div><div class='del'>-				"failed to add fd(=%d) to epoll fd(=%d) (%s)",</div><div class='del'>-				fd, event_pool-&gt;fd, strerror (errno));</div><div class='del'>-			goto unlock;</div><div class='del'>-		}</div><div class='del'>-</div><div class='del'>-		pthread_cond_broadcast (&amp;event_pool-&gt;cond);</div><div class='del'>-	}</div><div class='del'>-unlock:</div><div class='del'>-	pthread_mutex_unlock (&amp;event_pool-&gt;mutex);</div><div class='del'>-</div><div class='del'>-	return ret;</div><div class='del'>-}</div><div class='add'>+    int ret = -1;</div><div class='ctx'> </div><div class='add'>+    GF_VALIDATE_OR_GOTO("event", event_pool, out);</div><div class='ctx'> </div><div class='del'>-static int</div><div class='del'>-event_unregister_epoll (struct event_pool *event_pool, int fd, int idx_hint)</div><div class='del'>-{</div><div class='del'>-	int  idx = -1;</div><div class='del'>-	int  ret = -1;</div><div class='del'>-</div><div class='del'>-	struct epoll_event epoll_event = {0, };</div><div class='del'>-	struct event_data *ev_data = (void *)&amp;epoll_event.data;</div><div class='del'>-	int                lastidx = -1;</div><div class='del'>-</div><div class='del'>-	if (event_pool == NULL) {</div><div class='del'>-		gf_log ("event", GF_LOG_ERROR, "invalid argument");</div><div class='del'>-		return -1;</div><div class='del'>-	}</div><div class='del'>-  </div><div class='del'>-	pthread_mutex_lock (&amp;event_pool-&gt;mutex);</div><div class='del'>-	{</div><div class='del'>-		idx = __event_getindex (event_pool, fd, idx_hint);</div><div class='del'>-</div><div class='del'>-		if (idx == -1) {</div><div class='del'>-			gf_log ("epoll", GF_LOG_ERROR,</div><div class='del'>-				"index not found for fd=%d (idx_hint=%d)",</div><div class='del'>-				fd, idx_hint);</div><div class='del'>-			errno = ENOENT;</div><div class='del'>-			goto unlock;</div><div class='del'>-		}</div><div class='del'>-</div><div class='del'>-		ret = epoll_ctl (event_pool-&gt;fd, EPOLL_CTL_DEL, fd, NULL);</div><div class='del'>-</div><div class='del'>-		/* if ret is -1, this array member should never be accessed */</div><div class='del'>-		/* if it is 0, the array member might be used by idx_cache</div><div class='del'>-		 * in which case the member should not be accessed till</div><div class='del'>-		 * it is reallocated</div><div class='del'>-		 */</div><div class='del'>-</div><div class='del'>-		event_pool-&gt;reg[idx].fd = -1;</div><div class='del'>-</div><div class='del'>-		if (ret == -1) {</div><div class='del'>-			gf_log ("epoll", GF_LOG_ERROR,</div><div class='del'>-				"fail to del fd(=%d) from epoll fd(=%d) (%s)",</div><div class='del'>-				fd, event_pool-&gt;fd, strerror (errno));</div><div class='del'>-			goto unlock;</div><div class='del'>-		}</div><div class='del'>-</div><div class='del'>-		lastidx = event_pool-&gt;used - 1;</div><div class='del'>-		if (lastidx == idx) {</div><div class='del'>-			event_pool-&gt;used--;</div><div class='del'>-			goto unlock;</div><div class='del'>-		}</div><div class='del'>-</div><div class='del'>-		epoll_event.events = event_pool-&gt;reg[lastidx].events;</div><div class='del'>-		ev_data-&gt;fd = event_pool-&gt;reg[lastidx].fd;</div><div class='del'>-		ev_data-&gt;idx = idx;</div><div class='del'>-</div><div class='del'>-		ret = epoll_ctl (event_pool-&gt;fd, EPOLL_CTL_MOD, ev_data-&gt;fd,</div><div class='del'>-				 &amp;epoll_event);</div><div class='del'>-		if (ret == -1) {</div><div class='del'>-			gf_log ("epoll", GF_LOG_ERROR,</div><div class='del'>-				"fail to modify fd(=%d) index %d to %d (%s)",</div><div class='del'>-				ev_data-&gt;fd, event_pool-&gt;used, idx,</div><div class='del'>-				strerror (errno));</div><div class='del'>-			goto unlock;</div><div class='del'>-		}</div><div class='del'>-</div><div class='del'>-		/* just replace the unregistered idx by last one */</div><div class='del'>-		event_pool-&gt;reg[idx] = event_pool-&gt;reg[lastidx];</div><div class='del'>-		event_pool-&gt;used--;</div><div class='del'>-	}</div><div class='del'>-unlock:</div><div class='del'>-	pthread_mutex_unlock (&amp;event_pool-&gt;mutex);</div><div class='del'>-</div><div class='del'>-	return ret;</div><div class='add'>+    ret = event_pool-&gt;ops-&gt;event_select_on(event_pool, fd, idx_hint, poll_in,</div><div class='add'>+                                           poll_out);</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='del'>-static int</div><div class='del'>-event_select_on_epoll (struct event_pool *event_pool, int fd, int idx_hint,</div><div class='del'>-		       int poll_in, int poll_out)</div><div class='add'>+int</div><div class='add'>+gf_event_dispatch(struct event_pool *event_pool)</div><div class='ctx'> {</div><div class='del'>-	int idx = -1;</div><div class='del'>-	int ret = -1;</div><div class='del'>-</div><div class='del'>-	struct epoll_event epoll_event = {0, };</div><div class='del'>-	struct event_data *ev_data = (void *)&amp;epoll_event.data;</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-	if (event_pool == NULL) {</div><div class='del'>-		gf_log ("event", GF_LOG_ERROR, "invalid argument");</div><div class='del'>-		return -1;</div><div class='del'>-	}</div><div class='del'>-  </div><div class='del'>-	pthread_mutex_lock (&amp;event_pool-&gt;mutex);</div><div class='del'>-	{</div><div class='del'>-		idx = __event_getindex (event_pool, fd, idx_hint);</div><div class='del'>-</div><div class='del'>-		if (idx == -1) {</div><div class='del'>-			gf_log ("epoll", GF_LOG_ERROR,</div><div class='del'>-				"index not found for fd=%d (idx_hint=%d)",</div><div class='del'>-				fd, idx_hint);</div><div class='del'>-			errno = ENOENT;</div><div class='del'>-			goto unlock;</div><div class='del'>-		}</div><div class='del'>-</div><div class='del'>-		switch (poll_in) {</div><div class='del'>-		case 1:</div><div class='del'>-			event_pool-&gt;reg[idx].events |= EPOLLIN;</div><div class='del'>-			break;</div><div class='del'>-		case 0:</div><div class='del'>-			event_pool-&gt;reg[idx].events &amp;= ~EPOLLIN;</div><div class='del'>-			break;</div><div class='del'>-		case -1:</div><div class='del'>-			/* do nothing */</div><div class='del'>-			break;</div><div class='del'>-		default:</div><div class='del'>-			gf_log ("epoll", GF_LOG_ERROR,</div><div class='del'>-				"invalid poll_in value %d", poll_in);</div><div class='del'>-			break;</div><div class='del'>-		}</div><div class='del'>-</div><div class='del'>-		switch (poll_out) {</div><div class='del'>-		case 1:</div><div class='del'>-			event_pool-&gt;reg[idx].events |= EPOLLOUT;</div><div class='del'>-			break;</div><div class='del'>-		case 0:</div><div class='del'>-			event_pool-&gt;reg[idx].events &amp;= ~EPOLLOUT;</div><div class='del'>-			break;</div><div class='del'>-		case -1:</div><div class='del'>-			/* do nothing */</div><div class='del'>-			break;</div><div class='del'>-		default:</div><div class='del'>-			gf_log ("epoll", GF_LOG_ERROR,</div><div class='del'>-				"invalid poll_out value %d", poll_out);</div><div class='del'>-			break;</div><div class='del'>-		}</div><div class='del'>-</div><div class='del'>-		epoll_event.events = event_pool-&gt;reg[idx].events;</div><div class='del'>-		ev_data-&gt;fd = fd;</div><div class='del'>-		ev_data-&gt;idx = idx;</div><div class='del'>-</div><div class='del'>-		ret = epoll_ctl (event_pool-&gt;fd, EPOLL_CTL_MOD, fd,</div><div class='del'>-				 &amp;epoll_event);</div><div class='del'>-		if (ret == -1) {</div><div class='del'>-			gf_log ("epoll", GF_LOG_ERROR,</div><div class='del'>-				"failed to modify fd(=%d) events to %d",</div><div class='del'>-				fd, epoll_event.events);</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='del'>-unlock:</div><div class='del'>-	pthread_mutex_unlock (&amp;event_pool-&gt;mutex);</div><div class='del'>-</div><div class='del'>-	return ret;</div><div class='del'>-}</div><div class='add'>+    int ret = -1;</div><div class='ctx'> </div><div class='add'>+    GF_VALIDATE_OR_GOTO("event", event_pool, out);</div><div class='ctx'> </div><div class='del'>-static int</div><div class='del'>-event_dispatch_epoll_handler (struct event_pool *event_pool,</div><div class='del'>-			      struct epoll_event *events, int i)</div><div class='del'>-{</div><div class='del'>-	struct event_data  *event_data = NULL;</div><div class='del'>-	event_handler_t     handler = NULL;</div><div class='del'>-	void               *data = NULL;</div><div class='del'>-	int                 idx = -1;</div><div class='del'>-	int                 ret = -1;</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-	event_data = (void *)&amp;events[i].data;</div><div class='del'>-	handler = NULL;</div><div class='del'>-	data = NULL;</div><div class='del'>-</div><div class='del'>-	pthread_mutex_lock (&amp;event_pool-&gt;mutex);</div><div class='del'>-	{</div><div class='del'>-		idx = __event_getindex (event_pool, event_data-&gt;fd,</div><div class='del'>-					event_data-&gt;idx);</div><div class='del'>-</div><div class='del'>-		if (idx == -1) {</div><div class='del'>-			gf_log ("epoll", GF_LOG_ERROR,</div><div class='del'>-				"index not found for fd(=%d) (idx_hint=%d)",</div><div class='del'>-				event_data-&gt;fd, event_data-&gt;idx);</div><div class='del'>-			goto unlock;</div><div class='del'>-		}</div><div class='del'>-</div><div class='del'>-		handler = event_pool-&gt;reg[idx].handler;</div><div class='del'>-		data = event_pool-&gt;reg[idx].data;</div><div class='del'>-	}</div><div class='del'>-unlock:</div><div class='del'>-	pthread_mutex_unlock (&amp;event_pool-&gt;mutex);</div><div class='del'>-</div><div class='del'>-	if (handler)</div><div class='del'>-		ret = handler (event_data-&gt;fd, event_data-&gt;idx, data,</div><div class='del'>-			       (events[i].events &amp; (EPOLLIN|EPOLLPRI)),</div><div class='del'>-			       (events[i].events &amp; (EPOLLOUT)),</div><div class='del'>-			       (events[i].events &amp; (EPOLLERR|EPOLLHUP)));</div><div class='del'>-	return ret;</div><div class='del'>-}</div><div class='add'>+    ret = event_pool-&gt;ops-&gt;event_dispatch(event_pool);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='ctx'> </div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-static int</div><div class='del'>-event_dispatch_epoll (struct event_pool *event_pool)</div><div class='add'>+int</div><div class='add'>+gf_event_reconfigure_threads(struct event_pool *event_pool, int value)</div><div class='ctx'> {</div><div class='del'>-	struct epoll_event *events = NULL;</div><div class='del'>-	int                 size = 0;</div><div class='del'>-	int                 i = 0;</div><div class='del'>-	int                 ret = -1;</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-	if (event_pool == NULL) {</div><div class='del'>-		gf_log ("event", GF_LOG_ERROR, "invalid argument");</div><div class='del'>-		return -1;</div><div class='del'>-	}</div><div class='del'>-  </div><div class='del'>-	while (1) {</div><div class='del'>-		pthread_mutex_lock (&amp;event_pool-&gt;mutex);</div><div class='del'>-		{</div><div class='del'>-			while (event_pool-&gt;used == 0)</div><div class='del'>-				pthread_cond_wait (&amp;event_pool-&gt;cond,</div><div class='del'>-						   &amp;event_pool-&gt;mutex);</div><div class='del'>-</div><div class='del'>-			if (event_pool-&gt;used &gt; event_pool-&gt;evcache_size) {</div><div class='del'>-				if (event_pool-&gt;evcache)</div><div class='del'>-					GF_FREE (event_pool-&gt;evcache);</div><div class='del'>-</div><div class='del'>-				event_pool-&gt;evcache = events = NULL;</div><div class='del'>-</div><div class='del'>-				event_pool-&gt;evcache_size =</div><div class='del'>-					event_pool-&gt;used + 256;</div><div class='del'>-</div><div class='del'>-				events = GF_CALLOC (event_pool-&gt;evcache_size,</div><div class='del'>-					            sizeof (struct epoll_event),</div><div class='del'>-                                                    gf_common_mt_epoll_event);</div><div class='add'>+    int ret = -1;</div><div class='ctx'> </div><div class='del'>-				event_pool-&gt;evcache = events;</div><div class='del'>-			}</div><div class='del'>-		}</div><div class='del'>-		pthread_mutex_unlock (&amp;event_pool-&gt;mutex);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("event", event_pool, out);</div><div class='ctx'> </div><div class='del'>-		ret = epoll_wait (event_pool-&gt;fd, event_pool-&gt;evcache,</div><div class='del'>-				  event_pool-&gt;evcache_size, -1);</div><div class='add'>+    /* call event refresh function */</div><div class='add'>+    ret = event_pool-&gt;ops-&gt;event_reconfigure_threads(event_pool, value);</div><div class='ctx'> </div><div class='del'>-		if (ret == 0)</div><div class='del'>-			/* timeout */</div><div class='del'>-			continue;</div><div class='del'>-</div><div class='del'>-		if (ret == -1 &amp;&amp; errno == EINTR)</div><div class='del'>-			/* sys call */</div><div class='del'>-			continue;</div><div class='del'>-</div><div class='del'>-		size = ret;</div><div class='del'>-</div><div class='del'>-		for (i = 0; i &lt; size; i++) {</div><div class='del'>-			if (!events || !events[i].events)</div><div class='del'>-				continue;</div><div class='del'>-</div><div class='del'>-			ret = event_dispatch_epoll_handler (event_pool,</div><div class='del'>-							    events, i);</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	return -1;</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='del'>-static struct event_ops event_ops_epoll = {</div><div class='del'>-	.new              = event_pool_new_epoll,</div><div class='del'>-	.event_register   = event_register_epoll,</div><div class='del'>-	.event_select_on  = event_select_on_epoll,</div><div class='del'>-	.event_unregister = event_unregister_epoll,</div><div class='del'>-	.event_dispatch   = event_dispatch_epoll</div><div class='del'>-};</div><div class='del'>-</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-struct event_pool *</div><div class='del'>-event_pool_new (int count)</div><div class='add'>+int</div><div class='add'>+gf_event_pool_destroy(struct event_pool *event_pool)</div><div class='ctx'> {</div><div class='del'>-	struct event_pool *event_pool = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int destroy = 0, activethreadcount = 0;</div><div class='ctx'> </div><div class='del'>-#ifdef HAVE_SYS_EPOLL_H</div><div class='del'>-	event_pool = event_ops_epoll.new (count);</div><div class='del'>-</div><div class='del'>-	if (event_pool) {</div><div class='del'>-		event_pool-&gt;ops = &amp;event_ops_epoll;</div><div class='del'>-	} else {</div><div class='del'>-		gf_log ("event", GF_LOG_WARNING,</div><div class='del'>-			"failing back to poll based event handling");</div><div class='del'>-	}</div><div class='del'>-#endif</div><div class='add'>+    GF_VALIDATE_OR_GOTO("event", event_pool, out);</div><div class='ctx'> </div><div class='del'>-	if (!event_pool) {</div><div class='del'>-		event_pool = event_ops_poll.new (count);</div><div class='add'>+    pthread_mutex_lock(&amp;event_pool-&gt;mutex);</div><div class='add'>+    {</div><div class='add'>+        destroy = event_pool-&gt;destroy;</div><div class='add'>+        activethreadcount = event_pool-&gt;activethreadcount;</div><div class='add'>+    }</div><div class='add'>+    pthread_mutex_unlock(&amp;event_pool-&gt;mutex);</div><div class='ctx'> </div><div class='del'>-		if (event_pool)</div><div class='del'>-			event_pool-&gt;ops = &amp;event_ops_poll;</div><div class='del'>-	}</div><div class='add'>+    if (!destroy || (activethreadcount &gt; 0)) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	return event_pool;</div><div class='add'>+    ret = event_pool-&gt;ops-&gt;event_pool_destroy(event_pool);</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-event_register (struct event_pool *event_pool, int fd,</div><div class='del'>-		event_handler_t handler,</div><div class='del'>-		void *data, int poll_in, int poll_out)</div><div class='add'>+void</div><div class='add'>+poller_destroy_handler(int fd, int idx, int gen, void *data, int poll_out,</div><div class='add'>+                       int poll_in, int poll_err, char event_thread_exit)</div><div class='ctx'> {</div><div class='del'>-	int ret = -1;</div><div class='del'>-</div><div class='del'>-	if (event_pool == NULL) {</div><div class='del'>-		gf_log ("event", GF_LOG_ERROR, "invalid argument");</div><div class='del'>-		return -1;</div><div class='del'>-	}</div><div class='del'>-  </div><div class='del'>-	ret = event_pool-&gt;ops-&gt;event_register (event_pool, fd, handler, data,</div><div class='del'>-					       poll_in, poll_out);</div><div class='del'>-	return ret;</div><div class='del'>-}</div><div class='add'>+    struct event_destroy_data *destroy = NULL;</div><div class='add'>+    int readfd = -1;</div><div class='add'>+    char buf = '\0';</div><div class='ctx'> </div><div class='add'>+    destroy = data;</div><div class='add'>+    readfd = destroy-&gt;readfd;</div><div class='add'>+    if (readfd &lt; 0) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-event_unregister (struct event_pool *event_pool, int fd, int idx)</div><div class='del'>-{</div><div class='del'>-	int ret = -1;</div><div class='add'>+    while (sys_read(readfd, &amp;buf, 1) &gt; 0) {</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	if (event_pool == NULL) {</div><div class='del'>-		gf_log ("event", GF_LOG_ERROR, "invalid argument");</div><div class='del'>-		return -1;</div><div class='del'>-	}</div><div class='del'>-  </div><div class='del'>-	ret = event_pool-&gt;ops-&gt;event_unregister (event_pool, fd, idx);</div><div class='add'>+out:</div><div class='add'>+    gf_event_handled(destroy-&gt;pool, fd, idx, gen);</div><div class='ctx'> </div><div class='del'>-	return ret;</div><div class='add'>+    return;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='add'>+/* This function destroys all the poller threads.</div><div class='add'>+ * Note: to be called before gf_event_pool_destroy is called.</div><div class='add'>+ * The order in which cleaning is performed:</div><div class='add'>+ * - Register a pipe fd(this is for waking threads in poll()/epoll_wait())</div><div class='add'>+ * - Set the destroy mode, which this no new event registration will succeed</div><div class='add'>+ * - Reconfigure the thread count to 0(this will succeed only in destroy mode)</div><div class='add'>+ * - Wake up all the threads in poll() or epoll_wait(), so that they can</div><div class='add'>+ *   destroy themselves.</div><div class='add'>+ * - Wait for the thread to join(which will happen only after all the other</div><div class='add'>+ *   threads are destroyed)</div><div class='add'>+ */</div><div class='ctx'> int</div><div class='del'>-event_select_on (struct event_pool *event_pool, int fd, int idx_hint,</div><div class='del'>-		 int poll_in, int poll_out)</div><div class='add'>+gf_event_dispatch_destroy(struct event_pool *event_pool)</div><div class='ctx'> {</div><div class='del'>-	int ret = -1;</div><div class='del'>-</div><div class='del'>-	if (event_pool == NULL) {</div><div class='del'>-		gf_log ("event", GF_LOG_ERROR, "invalid argument");</div><div class='del'>-		return -1;</div><div class='del'>-	}</div><div class='del'>-  </div><div class='del'>-	ret = event_pool-&gt;ops-&gt;event_select_on (event_pool, fd, idx_hint,</div><div class='del'>-						poll_in, poll_out);</div><div class='del'>-	return ret;</div><div class='add'>+    int ret = -1, threadcount = 0;</div><div class='add'>+    int fd[2] = {-1};</div><div class='add'>+    int idx = -1;</div><div class='add'>+    int flags = 0;</div><div class='add'>+    struct timespec sleep_till = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    struct event_destroy_data data = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    GF_VALIDATE_OR_GOTO("event", event_pool, out);</div><div class='add'>+</div><div class='add'>+    ret = pipe(fd);</div><div class='add'>+    if (ret &lt; 0)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    /* Make the read end of the pipe nonblocking */</div><div class='add'>+    flags = fcntl(fd[0], F_GETFL);</div><div class='add'>+    flags |= O_NONBLOCK;</div><div class='add'>+    ret = fcntl(fd[0], F_SETFL, flags);</div><div class='add'>+    if (ret &lt; 0)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    /* Make the write end of the pipe nonblocking */</div><div class='add'>+    flags = fcntl(fd[1], F_GETFL);</div><div class='add'>+    flags |= O_NONBLOCK;</div><div class='add'>+    ret = fcntl(fd[1], F_SETFL, flags);</div><div class='add'>+    if (ret &lt; 0)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    data.pool = event_pool;</div><div class='add'>+    data.readfd = fd[1];</div><div class='add'>+</div><div class='add'>+    /* From the main thread register an event on the pipe fd[0],</div><div class='add'>+     */</div><div class='add'>+    idx = gf_event_register(event_pool, fd[0], poller_destroy_handler, &amp;data, 1,</div><div class='add'>+                            0, 0);</div><div class='add'>+    if (idx &lt; 0)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    /* Enter the destroy mode first, set this before reconfiguring to 0</div><div class='add'>+     * threads, to prevent further reconfigure to thread count &gt; 0.</div><div class='add'>+     */</div><div class='add'>+    pthread_mutex_lock(&amp;event_pool-&gt;mutex);</div><div class='add'>+    {</div><div class='add'>+        threadcount = event_pool-&gt;eventthreadcount;</div><div class='add'>+        event_pool-&gt;destroy = 1;</div><div class='add'>+    }</div><div class='add'>+    pthread_mutex_unlock(&amp;event_pool-&gt;mutex);</div><div class='add'>+</div><div class='add'>+    ret = gf_event_reconfigure_threads(event_pool, 0);</div><div class='add'>+    if (ret &lt; 0)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    /* Write something onto the write end of the pipe(fd[1]) so that</div><div class='add'>+     * poll wakes up and calls the handler, poller_destroy_handler()</div><div class='add'>+     */</div><div class='add'>+    pthread_mutex_lock(&amp;event_pool-&gt;mutex);</div><div class='add'>+    {</div><div class='add'>+        /* Write to pipe(fd[1]) and then wait for 1 second or until</div><div class='add'>+         * a poller thread that is dying, broadcasts. Make sure we</div><div class='add'>+         * do not loop forever by limiting to 10 retries</div><div class='add'>+         */</div><div class='add'>+        int retry = 0;</div><div class='add'>+</div><div class='add'>+        while (event_pool-&gt;activethreadcount &gt; 0 &amp;&amp;</div><div class='add'>+               (retry++ &lt; (threadcount + 10))) {</div><div class='add'>+            if (sys_write(fd[1], "dummy", 6) == -1) {</div><div class='add'>+                break;</div><div class='add'>+            }</div><div class='add'>+            timespec_now_realtime(&amp;sleep_till);</div><div class='add'>+            sleep_till.tv_sec += 1;</div><div class='add'>+            ret = pthread_cond_timedwait(&amp;event_pool-&gt;cond, &amp;event_pool-&gt;mutex,</div><div class='add'>+                                         &amp;sleep_till);</div><div class='add'>+            if (ret) {</div><div class='add'>+                gf_msg_debug("event", 0,</div><div class='add'>+                             "thread cond-timedwait failed "</div><div class='add'>+                             "active-thread-count: %d, "</div><div class='add'>+                             "retry: %d",</div><div class='add'>+                             event_pool-&gt;activethreadcount, retry);</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    pthread_mutex_unlock(&amp;event_pool-&gt;mutex);</div><div class='add'>+</div><div class='add'>+    ret = gf_event_unregister(event_pool, fd[0], idx);</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (fd[0] != -1)</div><div class='add'>+        sys_close(fd[0]);</div><div class='add'>+    if (fd[1] != -1)</div><div class='add'>+        sys_close(fd[1]);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-event_dispatch (struct event_pool *event_pool)</div><div class='add'>+gf_event_handled(struct event_pool *event_pool, int fd, int idx, int gen)</div><div class='ctx'> {</div><div class='del'>-	int ret = -1;</div><div class='add'>+    int ret = 0;</div><div class='ctx'> </div><div class='del'>-	if (event_pool == NULL) {</div><div class='del'>-		gf_log ("event", GF_LOG_ERROR, "invalid argument");</div><div class='del'>-		return -1;</div><div class='del'>-	}</div><div class='del'>-  </div><div class='del'>-	ret = event_pool-&gt;ops-&gt;event_dispatch (event_pool);</div><div class='add'>+    if (event_pool-&gt;ops-&gt;event_handled)</div><div class='add'>+        ret = event_pool-&gt;ops-&gt;event_handled(event_pool, fd, idx, gen);</div><div class='ctx'> </div><div class='del'>-	return ret;</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='head'>diff --git a/libglusterfs/src/event.h b/libglusterfs/src/event.h<br/>deleted file mode 100644<br/>index 6baad115075..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/libglusterfs/src/event.h?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/event.h</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,90 +0,0 @@</div><div class='del'>-/*</div><div class='del'>-   Copyright (c) 2008-2009 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='del'>-   This file is part of GlusterFS.</div><div class='del'>-</div><div class='del'>-   GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-   it under the terms of the GNU General Public License as published</div><div class='del'>-   by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-   or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-   GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-   WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-   General Public License for more details.</div><div class='del'>-</div><div class='del'>-   You should have received a copy of the GNU General Public License</div><div class='del'>-   along with this program.  If not, see</div><div class='del'>-   &lt;http://www.gnu.org/licenses/&gt;.</div><div class='del'>-*/</div><div class='del'>-</div><div class='del'>-#ifndef _EVENT_H_</div><div class='del'>-#define _EVENT_H_</div><div class='del'>-</div><div class='del'>-#ifndef _CONFIG_H</div><div class='del'>-#define _CONFIG_H</div><div class='del'>-#include "config.h"</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-#include &lt;pthread.h&gt;</div><div class='del'>-</div><div class='del'>-struct event_pool;</div><div class='del'>-struct event_ops;</div><div class='del'>-struct event_data {</div><div class='del'>-  int fd;</div><div class='del'>-  int idx;</div><div class='del'>-} __attribute__ ((__packed__));</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-typedef int (*event_handler_t) (int fd, int idx, void *data,</div><div class='del'>-				int poll_in, int poll_out, int poll_err);</div><div class='del'>-</div><div class='del'>-struct event_pool {</div><div class='del'>-  struct event_ops *ops;</div><div class='del'>-</div><div class='del'>-  int fd;</div><div class='del'>-  int breaker[2];</div><div class='del'>-</div><div class='del'>-  int count;</div><div class='del'>-  struct {</div><div class='del'>-    int fd;</div><div class='del'>-    int events;</div><div class='del'>-    void *data;</div><div class='del'>-    event_handler_t handler;</div><div class='del'>-  } *reg;</div><div class='del'>-</div><div class='del'>-  int used;</div><div class='del'>-  int idx_cache;</div><div class='del'>-  int changed;</div><div class='del'>-</div><div class='del'>-  pthread_mutex_t mutex;</div><div class='del'>-  pthread_cond_t cond;</div><div class='del'>-</div><div class='del'>-  void *evcache;</div><div class='del'>-  int evcache_size;</div><div class='del'>-};</div><div class='del'>-</div><div class='del'>-struct event_ops {</div><div class='del'>-  struct event_pool * (*new) (int count);</div><div class='del'>-</div><div class='del'>-  int (*event_register) (struct event_pool *event_pool, int fd,</div><div class='del'>-			 event_handler_t handler,</div><div class='del'>-			 void *data, int poll_in, int poll_out);</div><div class='del'>-</div><div class='del'>-  int (*event_select_on) (struct event_pool *event_pool, int fd, int idx,</div><div class='del'>-			  int poll_in, int poll_out);</div><div class='del'>-</div><div class='del'>-  int (*event_unregister) (struct event_pool *event_pool, int fd, int idx);</div><div class='del'>-</div><div class='del'>-  int (*event_dispatch) (struct event_pool *event_pool);</div><div class='del'>-};</div><div class='del'>-</div><div class='del'>-struct event_pool * event_pool_new (int count);</div><div class='del'>-int event_select_on (struct event_pool *event_pool, int fd, int idx,</div><div class='del'>-		     int poll_in, int poll_out);</div><div class='del'>-int event_register (struct event_pool *event_pool, int fd,</div><div class='del'>-		    event_handler_t handler,</div><div class='del'>-		    void *data, int poll_in, int poll_out);</div><div class='del'>-int event_unregister (struct event_pool *event_pool, int fd, int idx);</div><div class='del'>-int event_dispatch (struct event_pool *event_pool);</div><div class='del'>-</div><div class='del'>-#endif /* _EVENT_H_ */</div><div class='head'>diff --git a/libglusterfs/src/events.c b/libglusterfs/src/events.c<br/>new file mode 100644<br/>index 00000000000..33157549897<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/libglusterfs/src/events.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>libglusterfs/src/events.c</a></div><div class='hunk'>@@ -0,0 +1,136 @@</div><div class='add'>+/*</div><div class='add'>+  Copyright (c) 2016 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#include &lt;sys/types.h&gt;</div><div class='add'>+#include &lt;sys/socket.h&gt;</div><div class='add'>+#include &lt;sys/un.h&gt;</div><div class='add'>+#include &lt;stdio.h&gt;</div><div class='add'>+#include &lt;unistd.h&gt;</div><div class='add'>+#include &lt;time.h&gt;</div><div class='add'>+#include &lt;stdarg.h&gt;</div><div class='add'>+#include &lt;string.h&gt;</div><div class='add'>+#include &lt;netinet/in.h&gt;</div><div class='add'>+#include &lt;netdb.h&gt;</div><div class='add'>+</div><div class='add'>+#include "glusterfs/syscall.h"</div><div class='add'>+#include "glusterfs/mem-pool.h"</div><div class='add'>+#include "glusterfs/glusterfs.h"</div><div class='add'>+#include "glusterfs/globals.h"</div><div class='add'>+#include "glusterfs/events.h"</div><div class='add'>+</div><div class='add'>+#define EVENT_HOST "127.0.0.1"</div><div class='add'>+#define EVENT_PORT 24009</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+_gf_event(eventtypes_t event, const char *fmt, ...)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+    int sock = -1;</div><div class='add'>+    char *eventstr = NULL;</div><div class='add'>+    va_list arguments;</div><div class='add'>+    char *msg = NULL;</div><div class='add'>+    glusterfs_ctx_t *ctx = NULL;</div><div class='add'>+    char *host = NULL;</div><div class='add'>+    struct addrinfo hints;</div><div class='add'>+    struct addrinfo *result = NULL;</div><div class='add'>+    struct addrinfo *iter_result_ptr = NULL;</div><div class='add'>+    xlator_t *this = THIS;</div><div class='add'>+    char *volfile_server_transport = NULL;</div><div class='add'>+</div><div class='add'>+    /* Global context */</div><div class='add'>+    ctx = this-&gt;ctx;</div><div class='add'>+</div><div class='add'>+    if (event &lt; 0 || event &gt;= EVENT_LAST) {</div><div class='add'>+        ret = EVENT_ERROR_INVALID_INPUTS;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (ctx) {</div><div class='add'>+        volfile_server_transport = ctx-&gt;cmd_args.volfile_server_transport;</div><div class='add'>+    }</div><div class='add'>+    if (!volfile_server_transport) {</div><div class='add'>+        volfile_server_transport = "tcp";</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* host = NULL returns localhost */</div><div class='add'>+    if (ctx &amp;&amp; ctx-&gt;cmd_args.volfile_server &amp;&amp;</div><div class='add'>+        (strcmp(volfile_server_transport, "unix"))) {</div><div class='add'>+        /* If it is client code then volfile_server is set</div><div class='add'>+           use that information to push the events. */</div><div class='add'>+        host = ctx-&gt;cmd_args.volfile_server;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    memset(&amp;hints, 0, sizeof(hints));</div><div class='add'>+    hints.ai_family = AF_UNSPEC;</div><div class='add'>+    hints.ai_socktype = SOCK_DGRAM;</div><div class='add'>+    hints.ai_flags = AI_ADDRCONFIG;</div><div class='add'>+</div><div class='add'>+    if ((getaddrinfo(host, TOSTRING(EVENT_PORT), &amp;hints, &amp;result)) != 0) {</div><div class='add'>+        ret = EVENT_ERROR_RESOLVE;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    // iterate over the result and break when socket creation is success.</div><div class='add'>+    for (iter_result_ptr = result; iter_result_ptr != NULL;</div><div class='add'>+         iter_result_ptr = iter_result_ptr-&gt;ai_next) {</div><div class='add'>+        sock = socket(iter_result_ptr-&gt;ai_family, iter_result_ptr-&gt;ai_socktype,</div><div class='add'>+                      iter_result_ptr-&gt;ai_protocol);</div><div class='add'>+        if (sock != -1) {</div><div class='add'>+            break;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    /*</div><div class='add'>+     * If none of the addrinfo structures lead to a successful socket</div><div class='add'>+     * creation, socket creation has failed.</div><div class='add'>+     */</div><div class='add'>+    if (sock &lt; 0) {</div><div class='add'>+        ret = EVENT_ERROR_SOCKET;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    va_start(arguments, fmt);</div><div class='add'>+    ret = gf_vasprintf(&amp;msg, fmt, arguments);</div><div class='add'>+    va_end(arguments);</div><div class='add'>+</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        ret = EVENT_ERROR_INVALID_INPUTS;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = gf_asprintf(&amp;eventstr, "%u %d %s", (unsigned)gf_time(), event, msg);</div><div class='add'>+    GF_FREE(msg);</div><div class='add'>+    if (ret &lt;= 0) {</div><div class='add'>+        ret = EVENT_ERROR_MSG_FORMAT;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Send Message */</div><div class='add'>+    if (sendto(sock, eventstr, strlen(eventstr), 0, result-&gt;ai_addr,</div><div class='add'>+               result-&gt;ai_addrlen) &lt;= 0) {</div><div class='add'>+        ret = EVENT_ERROR_SEND;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = EVENT_SEND_OK;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (sock &gt;= 0) {</div><div class='add'>+        sys_close(sock);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Allocated by gf_asprintf */</div><div class='add'>+    if (eventstr)</div><div class='add'>+        GF_FREE(eventstr);</div><div class='add'>+</div><div class='add'>+    if (result)</div><div class='add'>+        freeaddrinfo(result);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='head'>diff --git a/libglusterfs/src/fd-lk.c b/libglusterfs/src/fd-lk.c<br/>new file mode 100644<br/>index 00000000000..c2d34f81c9c<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/libglusterfs/src/fd-lk.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>libglusterfs/src/fd-lk.c</a></div><div class='hunk'>@@ -0,0 +1,433 @@</div><div class='add'>+/*</div><div class='add'>+  Copyright (c) 2008-2012 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#include "glusterfs/fd-lk.h"</div><div class='add'>+#include "glusterfs/common-utils.h"</div><div class='add'>+#include "glusterfs/libglusterfs-messages.h"</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+_fd_lk_delete_lock(fd_lk_ctx_node_t *lock)</div><div class='add'>+{</div><div class='add'>+    int32_t ret = -1;</div><div class='add'>+</div><div class='add'>+    GF_VALIDATE_OR_GOTO("fd-lk", lock, out);</div><div class='add'>+</div><div class='add'>+    list_del_init(&amp;lock-&gt;next);</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+_fd_lk_destroy_lock(fd_lk_ctx_node_t *lock)</div><div class='add'>+{</div><div class='add'>+    int32_t ret = -1;</div><div class='add'>+</div><div class='add'>+    GF_VALIDATE_OR_GOTO("fd-lk", lock, out);</div><div class='add'>+</div><div class='add'>+    GF_FREE(lock);</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+_fd_lk_destroy_lock_list(fd_lk_ctx_t *lk_ctx)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    fd_lk_ctx_node_t *lk = NULL;</div><div class='add'>+    fd_lk_ctx_node_t *tmp = NULL;</div><div class='add'>+</div><div class='add'>+    GF_VALIDATE_OR_GOTO("fd-lk", lk_ctx, out);</div><div class='add'>+</div><div class='add'>+    list_for_each_entry_safe(lk, tmp, &amp;lk_ctx-&gt;lk_list, next)</div><div class='add'>+    {</div><div class='add'>+        _fd_lk_delete_lock(lk);</div><div class='add'>+        _fd_lk_destroy_lock(lk);</div><div class='add'>+    }</div><div class='add'>+    ret = 0;</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+fd_lk_ctx_unref(fd_lk_ctx_t *lk_ctx)</div><div class='add'>+{</div><div class='add'>+    int ref = -1;</div><div class='add'>+</div><div class='add'>+    GF_VALIDATE_OR_GOTO("fd-lk", lk_ctx, err);</div><div class='add'>+</div><div class='add'>+    ref = GF_ATOMIC_DEC(lk_ctx-&gt;ref);</div><div class='add'>+    if (ref &lt; 0)</div><div class='add'>+        GF_ASSERT(!ref);</div><div class='add'>+    if (ref == 0)</div><div class='add'>+        _fd_lk_destroy_lock_list(lk_ctx);</div><div class='add'>+</div><div class='add'>+    if (ref == 0) {</div><div class='add'>+        LOCK_DESTROY(&amp;lk_ctx-&gt;lock);</div><div class='add'>+        GF_FREE(lk_ctx);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+err:</div><div class='add'>+    return -1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+fd_lk_ctx_t *</div><div class='add'>+fd_lk_ctx_ref(fd_lk_ctx_t *lk_ctx)</div><div class='add'>+{</div><div class='add'>+    if (!lk_ctx) {</div><div class='add'>+        gf_msg_callingfn("fd-lk", GF_LOG_WARNING, EINVAL, LG_MSG_INVALID_ARG,</div><div class='add'>+                         "invalid argument");</div><div class='add'>+        return NULL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    GF_ATOMIC_INC(lk_ctx-&gt;ref);</div><div class='add'>+</div><div class='add'>+    return lk_ctx;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+fd_lk_ctx_t *</div><div class='add'>+fd_lk_ctx_create()</div><div class='add'>+{</div><div class='add'>+    fd_lk_ctx_t *fd_lk_ctx = NULL;</div><div class='add'>+</div><div class='add'>+    fd_lk_ctx = GF_CALLOC(1, sizeof(fd_lk_ctx_t), gf_common_mt_fd_lk_ctx_t);</div><div class='add'>+    if (!fd_lk_ctx)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    INIT_LIST_HEAD(&amp;fd_lk_ctx-&gt;lk_list);</div><div class='add'>+</div><div class='add'>+    LOCK_INIT(&amp;fd_lk_ctx-&gt;lock);</div><div class='add'>+</div><div class='add'>+    fd_lk_ctx = fd_lk_ctx_ref(fd_lk_ctx);</div><div class='add'>+out:</div><div class='add'>+    return fd_lk_ctx;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+_fd_lk_insert_lock(fd_lk_ctx_t *lk_ctx, fd_lk_ctx_node_t *lock)</div><div class='add'>+{</div><div class='add'>+    list_add_tail(&amp;lock-&gt;next, &amp;lk_ctx-&gt;lk_list);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static off_t</div><div class='add'>+_fd_lk_get_lock_len(off_t start, off_t end)</div><div class='add'>+{</div><div class='add'>+    if (end == LLONG_MAX)</div><div class='add'>+        return 0;</div><div class='add'>+    else</div><div class='add'>+        return (end - start + 1);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+fd_lk_ctx_node_t *</div><div class='add'>+fd_lk_ctx_node_new(int32_t cmd, struct gf_flock *flock)</div><div class='add'>+{</div><div class='add'>+    fd_lk_ctx_node_t *new_lock = NULL;</div><div class='add'>+</div><div class='add'>+    /* TODO: get from mem-pool */</div><div class='add'>+    new_lock = GF_CALLOC(1, sizeof(fd_lk_ctx_node_t),</div><div class='add'>+                         gf_common_mt_fd_lk_ctx_node_t);</div><div class='add'>+    if (!new_lock)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    new_lock-&gt;cmd = cmd;</div><div class='add'>+</div><div class='add'>+    if (flock) {</div><div class='add'>+        new_lock-&gt;fl_type = flock-&gt;l_type;</div><div class='add'>+        new_lock-&gt;fl_start = flock-&gt;l_start;</div><div class='add'>+</div><div class='add'>+        if (flock-&gt;l_len == 0)</div><div class='add'>+            new_lock-&gt;fl_end = LLONG_MAX;</div><div class='add'>+        else</div><div class='add'>+            new_lock-&gt;fl_end = flock-&gt;l_start + flock-&gt;l_len - 1;</div><div class='add'>+</div><div class='add'>+        memcpy(&amp;new_lock-&gt;user_flock, flock, sizeof(struct gf_flock));</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    INIT_LIST_HEAD(&amp;new_lock-&gt;next);</div><div class='add'>+out:</div><div class='add'>+    return new_lock;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+_fd_lk_delete_unlck_locks(fd_lk_ctx_t *lk_ctx)</div><div class='add'>+{</div><div class='add'>+    int32_t ret = -1;</div><div class='add'>+    fd_lk_ctx_node_t *tmp = NULL;</div><div class='add'>+    fd_lk_ctx_node_t *lk = NULL;</div><div class='add'>+</div><div class='add'>+    GF_VALIDATE_OR_GOTO("fd-lk", lk_ctx, out);</div><div class='add'>+</div><div class='add'>+    list_for_each_entry_safe(lk, tmp, &amp;lk_ctx-&gt;lk_list, next)</div><div class='add'>+    {</div><div class='add'>+        if (lk-&gt;fl_type == F_UNLCK) {</div><div class='add'>+            _fd_lk_delete_lock(lk);</div><div class='add'>+            _fd_lk_destroy_lock(lk);</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+fd_lk_overlap(fd_lk_ctx_node_t *l1, fd_lk_ctx_node_t *l2)</div><div class='add'>+{</div><div class='add'>+    if (l1-&gt;fl_end &gt;= l2-&gt;fl_start &amp;&amp; l2-&gt;fl_end &gt;= l1-&gt;fl_start)</div><div class='add'>+        return 1;</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+fd_lk_ctx_node_t *</div><div class='add'>+_fd_lk_add_locks(fd_lk_ctx_node_t *l1, fd_lk_ctx_node_t *l2)</div><div class='add'>+{</div><div class='add'>+    fd_lk_ctx_node_t *sum = NULL;</div><div class='add'>+</div><div class='add'>+    sum = fd_lk_ctx_node_new(0, NULL);</div><div class='add'>+    if (!sum)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    sum-&gt;fl_start = min(l1-&gt;fl_start, l2-&gt;fl_start);</div><div class='add'>+    sum-&gt;fl_end = max(l1-&gt;fl_end, l2-&gt;fl_end);</div><div class='add'>+</div><div class='add'>+    sum-&gt;user_flock.l_start = sum-&gt;fl_start;</div><div class='add'>+    sum-&gt;user_flock.l_len = _fd_lk_get_lock_len(sum-&gt;fl_start, sum-&gt;fl_end);</div><div class='add'>+out:</div><div class='add'>+    return sum;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* Subtract two locks */</div><div class='add'>+struct _values {</div><div class='add'>+    fd_lk_ctx_node_t *locks[3];</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+_fd_lk_sub_locks(struct _values *v, fd_lk_ctx_node_t *big,</div><div class='add'>+                 fd_lk_ctx_node_t *small)</div><div class='add'>+{</div><div class='add'>+    int32_t ret = -1;</div><div class='add'>+</div><div class='add'>+    if ((big-&gt;fl_start == small-&gt;fl_start) &amp;&amp; (big-&gt;fl_end == small-&gt;fl_end)) {</div><div class='add'>+        /* both edges coincide with big */</div><div class='add'>+        v-&gt;locks[0] = fd_lk_ctx_node_new(small-&gt;cmd, NULL);</div><div class='add'>+        if (!v-&gt;locks[0])</div><div class='add'>+            goto out;</div><div class='add'>+</div><div class='add'>+        memcpy(v-&gt;locks[0], big, sizeof(fd_lk_ctx_node_t));</div><div class='add'>+</div><div class='add'>+        v-&gt;locks[0]-&gt;fl_type = small-&gt;fl_type;</div><div class='add'>+        v-&gt;locks[0]-&gt;user_flock.l_type = small-&gt;fl_type;</div><div class='add'>+    } else if ((small-&gt;fl_start &gt; big-&gt;fl_start) &amp;&amp;</div><div class='add'>+               (small-&gt;fl_end &lt; big-&gt;fl_end)) {</div><div class='add'>+        /* small lock is completely inside big lock,</div><div class='add'>+           break it down into 3 different locks. */</div><div class='add'>+        v-&gt;locks[0] = fd_lk_ctx_node_new(big-&gt;cmd, NULL);</div><div class='add'>+        if (!v-&gt;locks[0])</div><div class='add'>+            goto out;</div><div class='add'>+</div><div class='add'>+        v-&gt;locks[1] = fd_lk_ctx_node_new(small-&gt;cmd, NULL);</div><div class='add'>+        if (!v-&gt;locks[1])</div><div class='add'>+            goto out;</div><div class='add'>+</div><div class='add'>+        v-&gt;locks[2] = fd_lk_ctx_node_new(big-&gt;cmd, NULL);</div><div class='add'>+        if (!v-&gt;locks[2])</div><div class='add'>+            goto out;</div><div class='add'>+</div><div class='add'>+        memcpy(v-&gt;locks[0], big, sizeof(fd_lk_ctx_node_t));</div><div class='add'>+        v-&gt;locks[0]-&gt;fl_end = small-&gt;fl_start - 1;</div><div class='add'>+        v-&gt;locks[0]-&gt;user_flock.l_len = _fd_lk_get_lock_len(</div><div class='add'>+            v-&gt;locks[0]-&gt;fl_start, v-&gt;locks[0]-&gt;fl_end);</div><div class='add'>+</div><div class='add'>+        memcpy(v-&gt;locks[1], small, sizeof(fd_lk_ctx_node_t));</div><div class='add'>+</div><div class='add'>+        memcpy(v-&gt;locks[2], big, sizeof(fd_lk_ctx_node_t));</div><div class='add'>+        v-&gt;locks[2]-&gt;fl_start = small-&gt;fl_end + 1;</div><div class='add'>+        v-&gt;locks[2]-&gt;user_flock.l_len = _fd_lk_get_lock_len(</div><div class='add'>+            v-&gt;locks[2]-&gt;fl_start, v-&gt;locks[2]-&gt;fl_end);</div><div class='add'>+    } else if (small-&gt;fl_start == big-&gt;fl_start) {</div><div class='add'>+        /* One of the ends co-incide, break the</div><div class='add'>+           locks into two separate parts */</div><div class='add'>+        v-&gt;locks[0] = fd_lk_ctx_node_new(small-&gt;cmd, NULL);</div><div class='add'>+        if (!v-&gt;locks[0])</div><div class='add'>+            goto out;</div><div class='add'>+</div><div class='add'>+        v-&gt;locks[1] = fd_lk_ctx_node_new(big-&gt;cmd, NULL);</div><div class='add'>+        if (!v-&gt;locks[1])</div><div class='add'>+            goto out;</div><div class='add'>+</div><div class='add'>+        memcpy(v-&gt;locks[0], small, sizeof(fd_lk_ctx_node_t));</div><div class='add'>+</div><div class='add'>+        memcpy(v-&gt;locks[1], big, sizeof(fd_lk_ctx_node_t));</div><div class='add'>+        v-&gt;locks[1]-&gt;fl_start = small-&gt;fl_end + 1;</div><div class='add'>+        v-&gt;locks[1]-&gt;user_flock.l_start = small-&gt;fl_end + 1;</div><div class='add'>+    } else if (small-&gt;fl_end == big-&gt;fl_end) {</div><div class='add'>+        /* One of the ends co-incide, break the</div><div class='add'>+           locks into two separate parts */</div><div class='add'>+        v-&gt;locks[0] = fd_lk_ctx_node_new(small-&gt;cmd, NULL);</div><div class='add'>+        if (!v-&gt;locks[0])</div><div class='add'>+            goto out;</div><div class='add'>+</div><div class='add'>+        v-&gt;locks[1] = fd_lk_ctx_node_new(big-&gt;cmd, NULL);</div><div class='add'>+        if (!v-&gt;locks[1])</div><div class='add'>+            goto out;</div><div class='add'>+</div><div class='add'>+        memcpy(v-&gt;locks[0], big, sizeof(fd_lk_ctx_node_t));</div><div class='add'>+        v-&gt;locks[0]-&gt;fl_end = small-&gt;fl_start - 1;</div><div class='add'>+        v-&gt;locks[0]-&gt;user_flock.l_len = _fd_lk_get_lock_len(</div><div class='add'>+            v-&gt;locks[0]-&gt;fl_start, v-&gt;locks[0]-&gt;fl_end);</div><div class='add'>+</div><div class='add'>+        memcpy(v-&gt;locks[1], small, sizeof(fd_lk_ctx_node_t));</div><div class='add'>+    } else {</div><div class='add'>+        /* We should never come to this case */</div><div class='add'>+        GF_ASSERT(!"Invalid case");</div><div class='add'>+    }</div><div class='add'>+    ret = 0;</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+_fd_lk_insert_and_merge(fd_lk_ctx_t *lk_ctx, fd_lk_ctx_node_t *lock)</div><div class='add'>+{</div><div class='add'>+    int32_t ret = -1;</div><div class='add'>+    int32_t i = 0;</div><div class='add'>+    fd_lk_ctx_node_t *entry = NULL;</div><div class='add'>+    fd_lk_ctx_node_t *t = NULL;</div><div class='add'>+    fd_lk_ctx_node_t *sum = NULL;</div><div class='add'>+    struct _values v = {.locks = {0, 0, 0}};</div><div class='add'>+</div><div class='add'>+    list_for_each_entry_safe(entry, t, &amp;lk_ctx-&gt;lk_list, next)</div><div class='add'>+    {</div><div class='add'>+        if (!fd_lk_overlap(entry, lock))</div><div class='add'>+            continue;</div><div class='add'>+</div><div class='add'>+        if (entry-&gt;fl_type == lock-&gt;fl_type) {</div><div class='add'>+            sum = _fd_lk_add_locks(entry, lock);</div><div class='add'>+            if (!sum)</div><div class='add'>+                return;</div><div class='add'>+            sum-&gt;fl_type = entry-&gt;fl_type;</div><div class='add'>+            sum-&gt;user_flock.l_type = entry-&gt;fl_type;</div><div class='add'>+            _fd_lk_delete_lock(entry);</div><div class='add'>+            _fd_lk_destroy_lock(entry);</div><div class='add'>+            _fd_lk_destroy_lock(lock);</div><div class='add'>+            _fd_lk_insert_and_merge(lk_ctx, sum);</div><div class='add'>+            return;</div><div class='add'>+        } else {</div><div class='add'>+            sum = _fd_lk_add_locks(entry, lock);</div><div class='add'>+            sum-&gt;fl_type = lock-&gt;fl_type;</div><div class='add'>+            sum-&gt;user_flock.l_type = lock-&gt;fl_type;</div><div class='add'>+            ret = _fd_lk_sub_locks(&amp;v, sum, lock);</div><div class='add'>+            if (ret)</div><div class='add'>+                return;</div><div class='add'>+            _fd_lk_delete_lock(entry);</div><div class='add'>+            _fd_lk_destroy_lock(entry);</div><div class='add'>+</div><div class='add'>+            _fd_lk_delete_lock(lock);</div><div class='add'>+            _fd_lk_destroy_lock(lock);</div><div class='add'>+</div><div class='add'>+            _fd_lk_destroy_lock(sum);</div><div class='add'>+</div><div class='add'>+            for (i = 0; i &lt; 3; i++) {</div><div class='add'>+                if (!v.locks[i])</div><div class='add'>+                    continue;</div><div class='add'>+</div><div class='add'>+                INIT_LIST_HEAD(&amp;v.locks[i]-&gt;next);</div><div class='add'>+                _fd_lk_insert_and_merge(lk_ctx, v.locks[i]);</div><div class='add'>+            }</div><div class='add'>+            _fd_lk_delete_unlck_locks(lk_ctx);</div><div class='add'>+            return;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* no conflicts, so just insert */</div><div class='add'>+    if (lock-&gt;fl_type != F_UNLCK) {</div><div class='add'>+        _fd_lk_insert_lock(lk_ctx, lock);</div><div class='add'>+    } else {</div><div class='add'>+        _fd_lk_destroy_lock(lock);</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+print_lock_list(fd_lk_ctx_t *lk_ctx)</div><div class='add'>+{</div><div class='add'>+    fd_lk_ctx_node_t *lk = NULL;</div><div class='add'>+</div><div class='add'>+    gf_msg_debug("fd-lk", 0, "lock list:");</div><div class='add'>+</div><div class='add'>+    list_for_each_entry(lk, &amp;lk_ctx-&gt;lk_list, next)</div><div class='add'>+        gf_msg_debug("fd-lk", 0,</div><div class='add'>+                     "owner = %s, cmd = %s fl_type = %s,"</div><div class='add'>+                     " fs_start = %" PRId64 ", fs_end = %" PRId64</div><div class='add'>+                     ", "</div><div class='add'>+                     "user_flock: l_type = %s, l_start = %" PRId64</div><div class='add'>+                     ", "</div><div class='add'>+                     "l_len = %" PRId64 ", ",</div><div class='add'>+                     lkowner_utoa(&amp;lk-&gt;user_flock.l_owner), get_lk_cmd(lk-&gt;cmd),</div><div class='add'>+                     get_lk_type(lk-&gt;fl_type), lk-&gt;fl_start, lk-&gt;fl_end,</div><div class='add'>+                     get_lk_type(lk-&gt;user_flock.l_type), lk-&gt;user_flock.l_start,</div><div class='add'>+                     lk-&gt;user_flock.l_len);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+fd_lk_insert_and_merge(fd_t *fd, int32_t cmd, struct gf_flock *flock)</div><div class='add'>+{</div><div class='add'>+    int32_t ret = -1;</div><div class='add'>+    fd_lk_ctx_t *lk_ctx = NULL;</div><div class='add'>+    fd_lk_ctx_node_t *lk = NULL;</div><div class='add'>+</div><div class='add'>+    GF_VALIDATE_OR_GOTO("fd-lk", fd, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("fd-lk", flock, out);</div><div class='add'>+</div><div class='add'>+    lk_ctx = fd_lk_ctx_ref(fd-&gt;lk_ctx);</div><div class='add'>+    lk = fd_lk_ctx_node_new(cmd, flock);</div><div class='add'>+</div><div class='add'>+    gf_msg_debug("fd-lk", 0,</div><div class='add'>+                 "new lock request: owner = %s, fl_type = %s"</div><div class='add'>+                 ", fs_start = %" PRId64 ", fs_end = %" PRId64</div><div class='add'>+                 ", user_flock:"</div><div class='add'>+                 " l_type = %s, l_start = %" PRId64 ", l_len = %" PRId64,</div><div class='add'>+                 lkowner_utoa(&amp;flock-&gt;l_owner), get_lk_type(lk-&gt;fl_type),</div><div class='add'>+                 lk-&gt;fl_start, lk-&gt;fl_end, get_lk_type(lk-&gt;user_flock.l_type),</div><div class='add'>+                 lk-&gt;user_flock.l_start, lk-&gt;user_flock.l_len);</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;lk_ctx-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        _fd_lk_insert_and_merge(lk_ctx, lk);</div><div class='add'>+        print_lock_list(lk_ctx);</div><div class='add'>+    }</div><div class='add'>+    UNLOCK(&amp;lk_ctx-&gt;lock);</div><div class='add'>+</div><div class='add'>+    fd_lk_ctx_unref(lk_ctx);</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+gf_boolean_t</div><div class='add'>+fd_lk_ctx_empty(fd_lk_ctx_t *lk_ctx)</div><div class='add'>+{</div><div class='add'>+    gf_boolean_t verdict = _gf_true;</div><div class='add'>+</div><div class='add'>+    if (!lk_ctx)</div><div class='add'>+        return _gf_true;</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;lk_ctx-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        verdict = list_empty(&amp;lk_ctx-&gt;lk_list);</div><div class='add'>+    }</div><div class='add'>+    UNLOCK(&amp;lk_ctx-&gt;lock);</div><div class='add'>+</div><div class='add'>+    return verdict;</div><div class='add'>+}</div><div class='head'>diff --git a/libglusterfs/src/fd.c b/libglusterfs/src/fd.c<br/>index 870c85e3f32..62606e91164 100644<br/>--- a/<a href='/cgit/glusterfs.git/tree/libglusterfs/src/fd.c?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/fd.c</a><br/>+++ b/<a href='/cgit/glusterfs.git/tree/libglusterfs/src/fd.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>libglusterfs/src/fd.c</a></div><div class='hunk'>@@ -1,808 +1,1203 @@</div><div class='ctx'> /*</div><div class='del'>-  Copyright (c) 2007-2009 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='add'>+  Copyright (c) 2008-2012 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='ctx'>   This file is part of GlusterFS.</div><div class='ctx'> </div><div class='del'>-  GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-  it under the terms of the GNU General Public License as published</div><div class='del'>-  by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-  or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-  GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-  WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-  General Public License for more details.</div><div class='del'>-</div><div class='del'>-  You should have received a copy of the GNU General Public License</div><div class='del'>-  along with this program.  If not, see</div><div class='del'>-  &lt;http://www.gnu.org/licenses/&gt;.</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='ctx'> */</div><div class='ctx'> </div><div class='del'>-#include "fd.h"</div><div class='del'>-#include "glusterfs.h"</div><div class='del'>-#include "inode.h"</div><div class='del'>-#include "dict.h"</div><div class='del'>-#include "statedump.h"</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-#ifndef _CONFIG_H</div><div class='del'>-#define _CONFIG_H</div><div class='del'>-#include "config.h"</div><div class='del'>-#endif</div><div class='del'>-</div><div class='add'>+#include "glusterfs/fd.h"</div><div class='add'>+#include &lt;errno.h&gt;     // for EINVAL, errno, ENOMEM</div><div class='add'>+#include &lt;inttypes.h&gt;  // for PRIu64</div><div class='add'>+#include &lt;stdint.h&gt;    // for UINT32_MAX</div><div class='add'>+#include &lt;string.h&gt;    // for NULL, memcpy, memset, size_t</div><div class='add'>+#include "glusterfs/statedump.h"</div><div class='ctx'> </div><div class='ctx'> static int</div><div class='del'>-gf_fd_fdtable_expand (fdtable_t *fdtable, uint32_t nr);</div><div class='del'>-</div><div class='add'>+gf_fd_fdtable_expand(fdtable_t *fdtable, uint32_t nr);</div><div class='ctx'> </div><div class='ctx'> fd_t *</div><div class='del'>-_fd_ref (fd_t *fd);</div><div class='del'>-</div><div class='del'>-/*</div><div class='del'>-   Allocate in memory chunks of power of 2 starting from 1024B</div><div class='del'>-   Assumes fdtable-&gt;lock is held</div><div class='del'>-*/</div><div class='del'>-static inline int</div><div class='del'>-gf_roundup_power_of_two (uint32_t nr)</div><div class='del'>-{</div><div class='del'>-        uint32_t result = 1;</div><div class='del'>-</div><div class='del'>-        if (nr &lt; 0) {</div><div class='del'>-                gf_log ("server-protocol/fd",</div><div class='del'>-                                GF_LOG_ERROR,</div><div class='del'>-                                "Negative number passed");</div><div class='del'>-                return -1;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        while (result &lt;= nr)</div><div class='del'>-                result *= 2;</div><div class='del'>-</div><div class='del'>-        return result;</div><div class='del'>-}</div><div class='del'>-</div><div class='add'>+__fd_ref(fd_t *fd);</div><div class='ctx'> </div><div class='ctx'> static int</div><div class='del'>-gf_fd_chain_fd_entries (fdentry_t *entries, uint32_t startidx,</div><div class='del'>-                        uint32_t endcount)</div><div class='add'>+gf_fd_chain_fd_entries(fdentry_t *entries, uint32_t startidx, uint32_t endcount)</div><div class='ctx'> {</div><div class='del'>-        uint32_t        i = 0;</div><div class='add'>+    uint32_t i = 0;</div><div class='ctx'> </div><div class='del'>-        if (!entries)</div><div class='del'>-                return -1;</div><div class='add'>+    if (!entries) {</div><div class='add'>+        gf_msg_callingfn("fd", GF_LOG_WARNING, EINVAL, LG_MSG_INVALID_ARG,</div><div class='add'>+                         "!entries");</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        /* Chain only till the second to last entry because we want to</div><div class='del'>-         * ensure that the last entry has GF_FDTABLE_END.</div><div class='del'>-         */</div><div class='del'>-        for (i = startidx; i &lt; (endcount - 1); i++)</div><div class='del'>-                entries[i].next_free = i + 1;</div><div class='add'>+    /* Chain only till the second to last entry because we want to</div><div class='add'>+     * ensure that the last entry has GF_FDTABLE_END.</div><div class='add'>+     */</div><div class='add'>+    for (i = startidx; i &lt; (endcount - 1); i++)</div><div class='add'>+        entries[i].next_free = i + 1;</div><div class='ctx'> </div><div class='del'>-        /* i has already been incremented upto the last entry. */</div><div class='del'>-        entries[i].next_free = GF_FDTABLE_END;</div><div class='add'>+    /* i has already been incremented up to the last entry. */</div><div class='add'>+    entries[i].next_free = GF_FDTABLE_END;</div><div class='ctx'> </div><div class='del'>-        return 0;</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> static int</div><div class='del'>-gf_fd_fdtable_expand (fdtable_t *fdtable, uint32_t nr)</div><div class='add'>+gf_fd_fdtable_expand(fdtable_t *fdtable, uint32_t nr)</div><div class='ctx'> {</div><div class='del'>-	fdentry_t   *oldfds = NULL;</div><div class='del'>-	uint32_t     oldmax_fds = -1;</div><div class='del'>-        int          ret = -1;</div><div class='del'>-</div><div class='del'>-	if (fdtable == NULL || nr &lt; 0) {</div><div class='del'>-		gf_log ("fd", GF_LOG_ERROR, "invalid argument");</div><div class='del'>-                ret = EINVAL;</div><div class='del'>-                goto out;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	nr /= (1024 / sizeof (fdentry_t));</div><div class='del'>-	nr = gf_roundup_power_of_two (nr + 1);</div><div class='del'>-	nr *= (1024 / sizeof (fdentry_t));</div><div class='add'>+    fdentry_t *oldfds = NULL;</div><div class='add'>+    uint32_t oldmax_fds = -1;</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    if (fdtable == NULL || nr &gt; UINT32_MAX) {</div><div class='add'>+        gf_msg_callingfn("fd", GF_LOG_ERROR, EINVAL, LG_MSG_INVALID_ARG,</div><div class='add'>+                         "invalid argument");</div><div class='add'>+        ret = EINVAL;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    nr /= (1024 / sizeof(fdentry_t));</div><div class='add'>+    nr = gf_roundup_next_power_of_two(nr + 1);</div><div class='add'>+    nr *= (1024 / sizeof(fdentry_t));</div><div class='add'>+</div><div class='add'>+    oldfds = fdtable-&gt;fdentries;</div><div class='add'>+    oldmax_fds = fdtable-&gt;max_fds;</div><div class='add'>+</div><div class='add'>+    fdtable-&gt;fdentries = GF_CALLOC(nr, sizeof(fdentry_t),</div><div class='add'>+                                   gf_common_mt_fdentry_t);</div><div class='add'>+    if (!fdtable-&gt;fdentries) {</div><div class='add'>+        ret = ENOMEM;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    fdtable-&gt;max_fds = nr;</div><div class='add'>+</div><div class='add'>+    if (oldfds) {</div><div class='add'>+        uint32_t cpy = oldmax_fds * sizeof(fdentry_t);</div><div class='add'>+        memcpy(fdtable-&gt;fdentries, oldfds, cpy);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    gf_fd_chain_fd_entries(fdtable-&gt;fdentries, oldmax_fds, fdtable-&gt;max_fds);</div><div class='add'>+</div><div class='add'>+    /* Now that expansion is done, we must update the fd list</div><div class='add'>+     * head pointer so that the fd allocation functions can continue</div><div class='add'>+     * using the expanded table.</div><div class='add'>+     */</div><div class='add'>+    fdtable-&gt;first_free = oldmax_fds;</div><div class='add'>+    GF_FREE(oldfds);</div><div class='add'>+    ret = 0;</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	oldfds = fdtable-&gt;fdentries;</div><div class='del'>-	oldmax_fds = fdtable-&gt;max_fds;</div><div class='add'>+fdtable_t *</div><div class='add'>+gf_fd_fdtable_alloc(void)</div><div class='add'>+{</div><div class='add'>+    fdtable_t *fdtable = NULL;</div><div class='ctx'> </div><div class='del'>-	fdtable-&gt;fdentries = GF_CALLOC (nr, sizeof (fdentry_t),</div><div class='del'>-                                        gf_common_mt_fdentry_t);</div><div class='del'>-	if (!fdtable-&gt;fdentries) {</div><div class='del'>-                ret = ENOMEM;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-	fdtable-&gt;max_fds = nr;</div><div class='add'>+    fdtable = GF_CALLOC(1, sizeof(*fdtable), gf_common_mt_fdtable_t);</div><div class='add'>+    if (!fdtable)</div><div class='add'>+        return NULL;</div><div class='ctx'> </div><div class='del'>-	if (oldfds) {</div><div class='del'>-		uint32_t cpy = oldmax_fds * sizeof (fdentry_t);</div><div class='del'>-		memcpy (fdtable-&gt;fdentries, oldfds, cpy);</div><div class='del'>-	}</div><div class='add'>+    pthread_rwlock_init(&amp;fdtable-&gt;lock, NULL);</div><div class='ctx'> </div><div class='del'>-        gf_fd_chain_fd_entries (fdtable-&gt;fdentries, oldmax_fds,</div><div class='del'>-                                fdtable-&gt;max_fds);</div><div class='add'>+    pthread_rwlock_wrlock(&amp;fdtable-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        gf_fd_fdtable_expand(fdtable, 0);</div><div class='add'>+    }</div><div class='add'>+    pthread_rwlock_unlock(&amp;fdtable-&gt;lock);</div><div class='ctx'> </div><div class='del'>-        /* Now that expansion is done, we must update the fd list</div><div class='del'>-         * head pointer so that the fd allocation functions can continue</div><div class='del'>-         * using the expanded table.</div><div class='del'>-         */</div><div class='del'>-        fdtable-&gt;first_free = oldmax_fds;</div><div class='del'>-	GF_FREE (oldfds);</div><div class='del'>-        ret = 0;</div><div class='del'>-out:</div><div class='del'>-	return ret;</div><div class='add'>+    return fdtable;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='del'>-fdtable_t *</div><div class='del'>-gf_fd_fdtable_alloc (void)</div><div class='add'>+static fdentry_t *</div><div class='add'>+__gf_fd_fdtable_get_all_fds(fdtable_t *fdtable, uint32_t *count)</div><div class='ctx'> {</div><div class='del'>-	fdtable_t *fdtable = NULL;</div><div class='del'>-</div><div class='del'>-	fdtable = GF_CALLOC (1, sizeof (*fdtable), gf_common_mt_fdtable_t);</div><div class='del'>-	if (!fdtable) </div><div class='del'>-		return NULL;</div><div class='add'>+    fdentry_t *fdentries = NULL;</div><div class='ctx'> </div><div class='del'>-	pthread_mutex_init (&amp;fdtable-&gt;lock, NULL);</div><div class='add'>+    if (count == NULL) {</div><div class='add'>+        gf_msg_callingfn("fd", GF_LOG_WARNING, EINVAL, LG_MSG_INVALID_ARG,</div><div class='add'>+                         "!count");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	pthread_mutex_lock (&amp;fdtable-&gt;lock);</div><div class='del'>-	{</div><div class='del'>-		gf_fd_fdtable_expand (fdtable, 0);</div><div class='del'>-	}</div><div class='del'>-	pthread_mutex_unlock (&amp;fdtable-&gt;lock);</div><div class='add'>+    fdentries = fdtable-&gt;fdentries;</div><div class='add'>+    fdtable-&gt;fdentries = GF_CALLOC(fdtable-&gt;max_fds, sizeof(fdentry_t),</div><div class='add'>+                                   gf_common_mt_fdentry_t);</div><div class='add'>+    gf_fd_chain_fd_entries(fdtable-&gt;fdentries, 0, fdtable-&gt;max_fds);</div><div class='add'>+    *count = fdtable-&gt;max_fds;</div><div class='ctx'> </div><div class='del'>-	return fdtable;</div><div class='add'>+out:</div><div class='add'>+    return fdentries;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> fdentry_t *</div><div class='del'>-__gf_fd_fdtable_get_all_fds (fdtable_t *fdtable, uint32_t *count)</div><div class='add'>+gf_fd_fdtable_get_all_fds(fdtable_t *fdtable, uint32_t *count)</div><div class='ctx'> {</div><div class='del'>-        fdentry_t       *fdentries = NULL;</div><div class='add'>+    fdentry_t *entries = NULL;</div><div class='ctx'> </div><div class='del'>-        if (count == NULL) {</div><div class='del'>-                goto out;</div><div class='add'>+    if (fdtable) {</div><div class='add'>+        pthread_rwlock_wrlock(&amp;fdtable-&gt;lock);</div><div class='add'>+        {</div><div class='add'>+            entries = __gf_fd_fdtable_get_all_fds(fdtable, count);</div><div class='ctx'>         }</div><div class='add'>+        pthread_rwlock_unlock(&amp;fdtable-&gt;lock);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        fdentries = fdtable-&gt;fdentries;</div><div class='del'>-        fdtable-&gt;fdentries = GF_CALLOC (fdtable-&gt;max_fds, sizeof (fdentry_t),</div><div class='del'>-                                        gf_common_mt_fdentry_t);</div><div class='del'>-        gf_fd_chain_fd_entries (fdtable-&gt;fdentries, 0, fdtable-&gt;max_fds);</div><div class='del'>-        *count = fdtable-&gt;max_fds;</div><div class='add'>+    return entries;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static fdentry_t *</div><div class='add'>+__gf_fd_fdtable_copy_all_fds(fdtable_t *fdtable, uint32_t *count)</div><div class='add'>+{</div><div class='add'>+    fdentry_t *fdentries = NULL;</div><div class='add'>+    int i = 0;</div><div class='add'>+</div><div class='add'>+    if (count == NULL) {</div><div class='add'>+        gf_msg_callingfn("fd", GF_LOG_WARNING, EINVAL, LG_MSG_INVALID_ARG,</div><div class='add'>+                         "!count");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    fdentries = GF_CALLOC(fdtable-&gt;max_fds, sizeof(fdentry_t),</div><div class='add'>+                          gf_common_mt_fdentry_t);</div><div class='add'>+    if (fdentries == NULL) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    *count = fdtable-&gt;max_fds;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; fdtable-&gt;max_fds; i++) {</div><div class='add'>+        if (fdtable-&gt;fdentries[i].fd != NULL) {</div><div class='add'>+            fdentries[i].fd = fd_ref(fdtable-&gt;fdentries[i].fd);</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='ctx'> </div><div class='ctx'> out:</div><div class='del'>-        return fdentries;</div><div class='add'>+    return fdentries;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> fdentry_t *</div><div class='del'>-gf_fd_fdtable_get_all_fds (fdtable_t *fdtable, uint32_t *count)</div><div class='add'>+gf_fd_fdtable_copy_all_fds(fdtable_t *fdtable, uint32_t *count)</div><div class='ctx'> {</div><div class='del'>-        fdentry_t       *entries = NULL;</div><div class='add'>+    fdentry_t *entries = NULL;</div><div class='ctx'> </div><div class='del'>-        if (fdtable) {</div><div class='del'>-                pthread_mutex_lock (&amp;fdtable-&gt;lock);</div><div class='del'>-                {</div><div class='del'>-                        entries = __gf_fd_fdtable_get_all_fds (fdtable, count);</div><div class='del'>-                }</div><div class='del'>-                pthread_mutex_unlock (&amp;fdtable-&gt;lock);</div><div class='add'>+    if (fdtable) {</div><div class='add'>+        pthread_rwlock_rdlock(&amp;fdtable-&gt;lock);</div><div class='add'>+        {</div><div class='add'>+            entries = __gf_fd_fdtable_copy_all_fds(fdtable, count);</div><div class='ctx'>         }</div><div class='add'>+        pthread_rwlock_unlock(&amp;fdtable-&gt;lock);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        return entries;</div><div class='add'>+    return entries;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> void</div><div class='del'>-gf_fd_fdtable_destroy (fdtable_t *fdtable)</div><div class='del'>-{</div><div class='del'>-        struct list_head  list = {0, };</div><div class='del'>-        fd_t             *fd = NULL;</div><div class='del'>-        fdentry_t        *fdentries = NULL;</div><div class='del'>-        uint32_t          fd_count = 0;</div><div class='del'>-        int32_t           i = 0;</div><div class='del'>-</div><div class='del'>-        INIT_LIST_HEAD (&amp;list);</div><div class='del'>-</div><div class='del'>-	if (!fdtable)</div><div class='del'>-                return;</div><div class='del'>-</div><div class='del'>-	pthread_mutex_lock (&amp;fdtable-&gt;lock);</div><div class='del'>-	{</div><div class='del'>-                fdentries = __gf_fd_fdtable_get_all_fds (fdtable, &amp;fd_count);</div><div class='del'>-		GF_FREE (fdtable-&gt;fdentries);</div><div class='del'>-	}</div><div class='del'>-	pthread_mutex_unlock (&amp;fdtable-&gt;lock);</div><div class='del'>-</div><div class='del'>-        if (fdentries != NULL) {</div><div class='del'>-                for (i = 0; i &lt; fd_count; i++) {</div><div class='del'>-                        fd = fdentries[i].fd;</div><div class='del'>-                        if (fd != NULL) {</div><div class='del'>-                                fd_unref (fd);</div><div class='del'>-                        }</div><div class='del'>-                }</div><div class='add'>+gf_fd_fdtable_destroy(fdtable_t *fdtable)</div><div class='add'>+{</div><div class='add'>+    struct list_head list = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    fd_t *fd = NULL;</div><div class='add'>+    fdentry_t *fdentries = NULL;</div><div class='add'>+    uint32_t fd_count = 0;</div><div class='add'>+    int32_t i = 0;</div><div class='add'>+</div><div class='add'>+    INIT_LIST_HEAD(&amp;list);</div><div class='add'>+</div><div class='add'>+    if (!fdtable) {</div><div class='add'>+        gf_msg_callingfn("fd", GF_LOG_WARNING, EINVAL, LG_MSG_INVALID_ARG,</div><div class='add'>+                         "!fdtable");</div><div class='add'>+        return;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    pthread_rwlock_wrlock(&amp;fdtable-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        fdentries = __gf_fd_fdtable_get_all_fds(fdtable, &amp;fd_count);</div><div class='add'>+        GF_FREE(fdtable-&gt;fdentries);</div><div class='add'>+    }</div><div class='add'>+    pthread_rwlock_unlock(&amp;fdtable-&gt;lock);</div><div class='add'>+</div><div class='add'>+    if (fdentries != NULL) {</div><div class='add'>+        for (i = 0; i &lt; fd_count; i++) {</div><div class='add'>+            fd = fdentries[i].fd;</div><div class='add'>+            if (fd != NULL) {</div><div class='add'>+                fd_unref(fd);</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-                GF_FREE (fdentries);</div><div class='del'>-		pthread_mutex_destroy (&amp;fdtable-&gt;lock);</div><div class='del'>-		GF_FREE (fdtable);</div><div class='del'>-	}</div><div class='add'>+        GF_FREE(fdentries);</div><div class='add'>+        pthread_rwlock_destroy(&amp;fdtable-&gt;lock);</div><div class='add'>+        GF_FREE(fdtable);</div><div class='add'>+    }</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-gf_fd_unused_get (fdtable_t *fdtable, fd_t *fdptr)</div><div class='del'>-{</div><div class='del'>-	int32_t         fd = -1;</div><div class='del'>-        fdentry_t       *fde = NULL;</div><div class='del'>-	int             error;</div><div class='del'>-        int             alloc_attempts = 0;</div><div class='del'>-</div><div class='del'>-	if (fdtable == NULL || fdptr == NULL)</div><div class='del'>-	{</div><div class='del'>-		gf_log ("fd", GF_LOG_ERROR, "invalid argument");</div><div class='del'>-		return EINVAL;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	pthread_mutex_lock (&amp;fdtable-&gt;lock);</div><div class='del'>-	{</div><div class='del'>-fd_alloc_try_again:</div><div class='del'>-                if (fdtable-&gt;first_free != GF_FDTABLE_END) {</div><div class='del'>-                        fde = &amp;fdtable-&gt;fdentries[fdtable-&gt;first_free];</div><div class='del'>-                        fd = fdtable-&gt;first_free;</div><div class='del'>-                        fdtable-&gt;first_free = fde-&gt;next_free;</div><div class='del'>-                        fde-&gt;next_free = GF_FDENTRY_ALLOCATED;</div><div class='del'>-                        fde-&gt;fd = fdptr;</div><div class='del'>-		} else {</div><div class='del'>-                        /* If this is true, there is something</div><div class='del'>-                         * seriously wrong with our data structures.</div><div class='del'>-                         */</div><div class='del'>-                        if (alloc_attempts &gt;= 2) {</div><div class='del'>-                                gf_log ("server-protocol.c", GF_LOG_ERROR,</div><div class='del'>-                                        "Multiple attempts to expand fd table"</div><div class='del'>-                                        " have failed.");</div><div class='del'>-                                goto out;</div><div class='del'>-                        }</div><div class='del'>-                        error = gf_fd_fdtable_expand (fdtable,</div><div class='del'>-                                                      fdtable-&gt;max_fds + 1);</div><div class='del'>-			if (error) {</div><div class='del'>-				gf_log ("server-protocol.c",</div><div class='del'>-					GF_LOG_ERROR,</div><div class='del'>-					"Cannot expand fdtable:%s", strerror (error));</div><div class='del'>-                                goto out;</div><div class='del'>-			}</div><div class='del'>-                        ++alloc_attempts;</div><div class='del'>-                        /* At this point, the table stands expanded</div><div class='del'>-                         * with the first_free referring to the first</div><div class='del'>-                         * free entry in the new set of fdentries that</div><div class='del'>-                         * have just been allocated. That means, the</div><div class='del'>-                         * above logic should just work.</div><div class='del'>-                         */</div><div class='del'>-                        goto fd_alloc_try_again;</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='add'>+gf_fd_unused_get(fdtable_t *fdtable, fd_t *fdptr)</div><div class='add'>+{</div><div class='add'>+    int32_t fd = -1;</div><div class='add'>+    fdentry_t *fde = NULL;</div><div class='add'>+    int error;</div><div class='add'>+    int alloc_attempts = 0;</div><div class='add'>+</div><div class='add'>+    if (fdtable == NULL || fdptr == NULL) {</div><div class='add'>+        gf_msg_callingfn("fd", GF_LOG_ERROR, EINVAL, LG_MSG_INVALID_ARG,</div><div class='add'>+                         "invalid argument");</div><div class='add'>+        return EINVAL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    pthread_rwlock_wrlock(&amp;fdtable-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+    fd_alloc_try_again:</div><div class='add'>+        if (fdtable-&gt;first_free != GF_FDTABLE_END) {</div><div class='add'>+            fde = &amp;fdtable-&gt;fdentries[fdtable-&gt;first_free];</div><div class='add'>+            fd = fdtable-&gt;first_free;</div><div class='add'>+            fdtable-&gt;first_free = fde-&gt;next_free;</div><div class='add'>+            fde-&gt;next_free = GF_FDENTRY_ALLOCATED;</div><div class='add'>+            fde-&gt;fd = fdptr;</div><div class='add'>+        } else {</div><div class='add'>+            /* If this is true, there is something</div><div class='add'>+             * seriously wrong with our data structures.</div><div class='add'>+             */</div><div class='add'>+            if (alloc_attempts &gt;= 2) {</div><div class='add'>+                gf_msg("fd", GF_LOG_ERROR, 0, LG_MSG_EXPAND_FD_TABLE_FAILED,</div><div class='add'>+                       "multiple attempts to expand fd table"</div><div class='add'>+                       " have failed.");</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+            error = gf_fd_fdtable_expand(fdtable, fdtable-&gt;max_fds + 1);</div><div class='add'>+            if (error) {</div><div class='add'>+                gf_msg("fd", GF_LOG_ERROR, error, LG_MSG_EXPAND_FD_TABLE_FAILED,</div><div class='add'>+                       "Cannot expand fdtable");</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+            ++alloc_attempts;</div><div class='add'>+            /* At this point, the table stands expanded</div><div class='add'>+             * with the first_free referring to the first</div><div class='add'>+             * free entry in the new set of fdentries that</div><div class='add'>+             * have just been allocated. That means, the</div><div class='add'>+             * above logic should just work.</div><div class='add'>+             */</div><div class='add'>+            goto fd_alloc_try_again;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='ctx'> out:</div><div class='del'>-	pthread_mutex_unlock (&amp;fdtable-&gt;lock);</div><div class='del'>-</div><div class='del'>-	return fd;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-inline void</div><div class='del'>-gf_fd_put (fdtable_t *fdtable, int32_t fd)</div><div class='del'>-{</div><div class='del'>-	fd_t *fdptr = NULL;</div><div class='del'>-        fdentry_t *fde = NULL;</div><div class='del'>-</div><div class='del'>-	if (fdtable == NULL || fd &lt; 0) {</div><div class='del'>-		gf_log ("fd", GF_LOG_ERROR, "invalid argument");</div><div class='del'>-		return;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	if (!(fd &lt; fdtable-&gt;max_fds)) {</div><div class='del'>-		gf_log ("fd", GF_LOG_ERROR, "invalid argument");</div><div class='del'>-		return;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	pthread_mutex_lock (&amp;fdtable-&gt;lock);</div><div class='del'>-	{</div><div class='del'>-                fde = &amp;fdtable-&gt;fdentries[fd];</div><div class='del'>-                /* If the entry is not allocated, put operation must return</div><div class='del'>-                 * without doing anything.</div><div class='del'>-                 * This has the potential of masking out any bugs in a user of</div><div class='del'>-                 * fd that ends up calling gf_fd_put twice for the same fd or</div><div class='del'>-                 * for an unallocated fd, but thats a price we have to pay for</div><div class='del'>-                 * ensuring sanity of our fd-table.</div><div class='del'>-                 */</div><div class='del'>-                if (fde-&gt;next_free != GF_FDENTRY_ALLOCATED)</div><div class='del'>-                        goto unlock_out;</div><div class='del'>-                fdptr = fde-&gt;fd;</div><div class='del'>-                fde-&gt;fd = NULL;</div><div class='del'>-                fde-&gt;next_free = fdtable-&gt;first_free;</div><div class='del'>-                fdtable-&gt;first_free = fd;</div><div class='del'>-	}</div><div class='del'>-unlock_out:</div><div class='del'>-	pthread_mutex_unlock (&amp;fdtable-&gt;lock);</div><div class='add'>+    pthread_rwlock_unlock(&amp;fdtable-&gt;lock);</div><div class='ctx'> </div><div class='del'>-	if (fdptr) {</div><div class='del'>-		fd_unref (fdptr);</div><div class='del'>-	}</div><div class='add'>+    return fd;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='del'>-fd_t *</div><div class='del'>-gf_fd_fdptr_get (fdtable_t *fdtable, int64_t fd)</div><div class='add'>+void</div><div class='add'>+gf_fd_put(fdtable_t *fdtable, int32_t fd)</div><div class='ctx'> {</div><div class='del'>-	fd_t *fdptr = NULL;</div><div class='add'>+    fd_t *fdptr = NULL;</div><div class='add'>+    fdentry_t *fde = NULL;</div><div class='ctx'> </div><div class='del'>-	if (fdtable == NULL || fd &lt; 0) {</div><div class='del'>-		gf_log ("fd", GF_LOG_ERROR, "invalid argument");</div><div class='del'>-		errno = EINVAL;</div><div class='del'>-		return NULL;</div><div class='del'>-	}</div><div class='add'>+    if (fd == GF_ANON_FD_NO)</div><div class='add'>+        return;</div><div class='ctx'> </div><div class='del'>-	if (!(fd &lt; fdtable-&gt;max_fds)) {</div><div class='del'>-		gf_log ("fd", GF_LOG_ERROR, "invalid argument");</div><div class='del'>-		errno = EINVAL;</div><div class='del'>-		return NULL;</div><div class='del'>-	}</div><div class='add'>+    if (fdtable == NULL || fd &lt; 0) {</div><div class='add'>+        gf_msg_callingfn("fd", GF_LOG_ERROR, EINVAL, LG_MSG_INVALID_ARG,</div><div class='add'>+                         "invalid argument");</div><div class='add'>+        return;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	pthread_mutex_lock (&amp;fdtable-&gt;lock);</div><div class='del'>-	{</div><div class='del'>-		fdptr = fdtable-&gt;fdentries[fd].fd;</div><div class='del'>-		if (fdptr) {</div><div class='del'>-			fd_ref (fdptr);</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='del'>-	pthread_mutex_unlock (&amp;fdtable-&gt;lock);</div><div class='add'>+    if (!(fd &lt; fdtable-&gt;max_fds)) {</div><div class='add'>+        gf_msg_callingfn("fd", GF_LOG_ERROR, EINVAL, LG_MSG_INVALID_ARG,</div><div class='add'>+                         "invalid argument");</div><div class='add'>+        return;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    pthread_rwlock_wrlock(&amp;fdtable-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        fde = &amp;fdtable-&gt;fdentries[fd];</div><div class='add'>+        /* If the entry is not allocated, put operation must return</div><div class='add'>+         * without doing anything.</div><div class='add'>+         * This has the potential of masking out any bugs in a user of</div><div class='add'>+         * fd that ends up calling gf_fd_put twice for the same fd or</div><div class='add'>+         * for an unallocated fd, but it is a price we have to pay for</div><div class='add'>+         * ensuring sanity of our fd-table.</div><div class='add'>+         */</div><div class='add'>+        if (fde-&gt;next_free != GF_FDENTRY_ALLOCATED)</div><div class='add'>+            goto unlock_out;</div><div class='add'>+        fdptr = fde-&gt;fd;</div><div class='add'>+        fde-&gt;fd = NULL;</div><div class='add'>+        fde-&gt;next_free = fdtable-&gt;first_free;</div><div class='add'>+        fdtable-&gt;first_free = fd;</div><div class='add'>+    }</div><div class='add'>+unlock_out:</div><div class='add'>+    pthread_rwlock_unlock(&amp;fdtable-&gt;lock);</div><div class='ctx'> </div><div class='del'>-	return fdptr;</div><div class='add'>+    if (fdptr) {</div><div class='add'>+        fd_unref(fdptr);</div><div class='add'>+    }</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='del'>-fd_t *</div><div class='del'>-_fd_ref (fd_t *fd)</div><div class='add'>+void</div><div class='add'>+gf_fdptr_put(fdtable_t *fdtable, fd_t *fd)</div><div class='ctx'> {</div><div class='del'>-	++fd-&gt;refcount;</div><div class='add'>+    fdentry_t *fde = NULL;</div><div class='add'>+    int32_t i = 0;</div><div class='ctx'> </div><div class='del'>-	return fd;</div><div class='del'>-}</div><div class='add'>+    if ((fdtable == NULL) || (fd == NULL)) {</div><div class='add'>+        gf_msg_callingfn("fd", GF_LOG_ERROR, EINVAL, LG_MSG_INVALID_ARG,</div><div class='add'>+                         "invalid argument");</div><div class='add'>+        return;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    pthread_rwlock_wrlock(&amp;fdtable-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        for (i = 0; i &lt; fdtable-&gt;max_fds; i++) {</div><div class='add'>+            if (fdtable-&gt;fdentries[i].fd == fd) {</div><div class='add'>+                fde = &amp;fdtable-&gt;fdentries[i];</div><div class='add'>+                break;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        if (fde == NULL) {</div><div class='add'>+            gf_msg_callingfn("fd", GF_LOG_WARNING, 0,</div><div class='add'>+                             LG_MSG_FD_NOT_FOUND_IN_FDTABLE,</div><div class='add'>+                             "fd (%p) is not present in fdtable", fd);</div><div class='add'>+            goto unlock_out;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='add'>+        /* If the entry is not allocated, put operation must return</div><div class='add'>+         * without doing anything.</div><div class='add'>+         * This has the potential of masking out any bugs in a user of</div><div class='add'>+         * fd that ends up calling gf_fd_put twice for the same fd or</div><div class='add'>+         * for an unallocated fd, but it is a price we have to pay for</div><div class='add'>+         * ensuring sanity of our fd-table.</div><div class='add'>+         */</div><div class='add'>+        if (fde-&gt;next_free != GF_FDENTRY_ALLOCATED)</div><div class='add'>+            goto unlock_out;</div><div class='add'>+        fde-&gt;fd = NULL;</div><div class='add'>+        fde-&gt;next_free = fdtable-&gt;first_free;</div><div class='add'>+        fdtable-&gt;first_free = i;</div><div class='add'>+    }</div><div class='add'>+unlock_out:</div><div class='add'>+    pthread_rwlock_unlock(&amp;fdtable-&gt;lock);</div><div class='add'>+</div><div class='add'>+    if ((fd != NULL) &amp;&amp; (fde != NULL)) {</div><div class='add'>+        fd_unref(fd);</div><div class='add'>+    }</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> fd_t *</div><div class='del'>-fd_ref (fd_t *fd)</div><div class='add'>+gf_fd_fdptr_get(fdtable_t *fdtable, int64_t fd)</div><div class='ctx'> {</div><div class='del'>-	fd_t *refed_fd = NULL;</div><div class='add'>+    fd_t *fdptr = NULL;</div><div class='add'>+</div><div class='add'>+    if (fdtable == NULL || fd &lt; 0) {</div><div class='add'>+        gf_msg_callingfn("fd", GF_LOG_ERROR, EINVAL, LG_MSG_INVALID_ARG,</div><div class='add'>+                         "invalid argument");</div><div class='add'>+        errno = EINVAL;</div><div class='add'>+        return NULL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (!(fd &lt; fdtable-&gt;max_fds)) {</div><div class='add'>+        gf_msg_callingfn("fd", GF_LOG_ERROR, EINVAL, LG_MSG_INVALID_ARG,</div><div class='add'>+                         "invalid argument");</div><div class='add'>+        errno = EINVAL;</div><div class='add'>+        return NULL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    pthread_rwlock_rdlock(&amp;fdtable-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        fdptr = fdtable-&gt;fdentries[fd].fd;</div><div class='add'>+        if (fdptr) {</div><div class='add'>+            fd_ref(fdptr);</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    pthread_rwlock_unlock(&amp;fdtable-&gt;lock);</div><div class='ctx'> </div><div class='del'>-	if (!fd) {</div><div class='del'>-		gf_log ("fd", GF_LOG_ERROR, "@fd=%p", fd);</div><div class='del'>-		return NULL;</div><div class='del'>-	}</div><div class='add'>+    return fdptr;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	LOCK (&amp;fd-&gt;inode-&gt;lock);</div><div class='del'>-	refed_fd = _fd_ref (fd);</div><div class='del'>-	UNLOCK (&amp;fd-&gt;inode-&gt;lock);</div><div class='add'>+fd_t *</div><div class='add'>+__fd_ref(fd_t *fd)</div><div class='add'>+{</div><div class='add'>+    GF_ATOMIC_INC(fd-&gt;refcount);</div><div class='ctx'> </div><div class='del'>-	return refed_fd;</div><div class='add'>+    return fd;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> fd_t *</div><div class='del'>-_fd_unref (fd_t *fd)</div><div class='add'>+fd_ref(fd_t *fd)</div><div class='ctx'> {</div><div class='del'>-	assert (fd-&gt;refcount);</div><div class='del'>-</div><div class='del'>-	--fd-&gt;refcount;</div><div class='add'>+    if (!fd) {</div><div class='add'>+        gf_msg_callingfn("fd", GF_LOG_ERROR, EINVAL, LG_MSG_INVALID_ARG,</div><div class='add'>+                         "null fd");</div><div class='add'>+        return NULL;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	if (fd-&gt;refcount == 0) {</div><div class='del'>-		list_del_init (&amp;fd-&gt;inode_list);</div><div class='del'>-	}</div><div class='add'>+    GF_ATOMIC_INC(fd-&gt;refcount);</div><div class='ctx'> </div><div class='del'>-	return fd;</div><div class='add'>+    return fd;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> static void</div><div class='del'>-fd_destroy (fd_t *fd)</div><div class='add'>+fd_destroy(fd_t *fd, gf_boolean_t bound)</div><div class='ctx'> {</div><div class='del'>-        xlator_t    *xl = NULL;</div><div class='del'>-	int          i = 0;</div><div class='del'>-        xlator_t    *old_THIS = NULL;</div><div class='del'>-	 struct mem_pool *tmp_pool = NULL;</div><div class='del'>-</div><div class='del'>-        if (fd == NULL){</div><div class='del'>-                gf_log ("xlator", GF_LOG_ERROR, "invalid arugument");</div><div class='del'>-                goto out;</div><div class='add'>+    xlator_t *xl = NULL;</div><div class='add'>+    int i = 0;</div><div class='add'>+    xlator_t *old_THIS = NULL;</div><div class='add'>+</div><div class='add'>+    if (fd == NULL) {</div><div class='add'>+        gf_msg_callingfn("xlator", GF_LOG_ERROR, EINVAL, LG_MSG_INVALID_ARG,</div><div class='add'>+                         "invalid argument");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (fd-&gt;inode == NULL) {</div><div class='add'>+        gf_msg_callingfn("xlator", GF_LOG_ERROR, 0, LG_MSG_FD_INODE_NULL,</div><div class='add'>+                         "fd-&gt;inode is NULL");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    if (!fd-&gt;_ctx)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    if (IA_ISDIR(fd-&gt;inode-&gt;ia_type)) {</div><div class='add'>+        for (i = 0; i &lt; fd-&gt;xl_count; i++) {</div><div class='add'>+            if (fd-&gt;_ctx[i].key) {</div><div class='add'>+                xl = fd-&gt;_ctx[i].xl_key;</div><div class='add'>+                old_THIS = THIS;</div><div class='add'>+                THIS = xl;</div><div class='add'>+                if (!xl-&gt;call_cleanup &amp;&amp; xl-&gt;cbks-&gt;releasedir)</div><div class='add'>+                    xl-&gt;cbks-&gt;releasedir(xl, fd);</div><div class='add'>+                THIS = old_THIS;</div><div class='add'>+            }</div><div class='ctx'>         }</div><div class='del'>-</div><div class='del'>-        if (fd-&gt;inode == NULL){</div><div class='del'>-                gf_log ("xlator", GF_LOG_ERROR, "fd-&gt;inode is NULL");</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-	if (!fd-&gt;_ctx)</div><div class='del'>-		goto out;</div><div class='del'>-</div><div class='del'>-	 tmp_pool = fd-&gt;inode-&gt;table-&gt;fd_mem_pool;</div><div class='del'>-</div><div class='del'>-        if (IA_ISDIR (fd-&gt;inode-&gt;ia_type)) {</div><div class='del'>-		for (i = 0; i &lt; fd-&gt;xl_count; i++) {</div><div class='del'>-			if (fd-&gt;_ctx[i].key) {</div><div class='del'>-				xl = fd-&gt;_ctx[i].xl_key;</div><div class='del'>-                                old_THIS = THIS;</div><div class='del'>-                                THIS = xl;</div><div class='del'>-				if (xl-&gt;cbks-&gt;releasedir)</div><div class='del'>-					xl-&gt;cbks-&gt;releasedir (xl, fd);</div><div class='del'>-                                THIS = old_THIS;</div><div class='del'>-			}</div><div class='del'>-		}</div><div class='del'>-        } else {</div><div class='del'>-		for (i = 0; i &lt; fd-&gt;xl_count; i++) {</div><div class='del'>-			if (fd-&gt;_ctx[i].key) {</div><div class='del'>-				xl = fd-&gt;_ctx[i].xl_key;</div><div class='del'>-                                old_THIS = THIS;</div><div class='del'>-                                THIS = xl;</div><div class='del'>-				if (xl-&gt;cbks-&gt;release)</div><div class='del'>-					xl-&gt;cbks-&gt;release (xl, fd);</div><div class='del'>-                                THIS = old_THIS;</div><div class='del'>-			}</div><div class='del'>-		}</div><div class='add'>+    } else {</div><div class='add'>+        for (i = 0; i &lt; fd-&gt;xl_count; i++) {</div><div class='add'>+            if (fd-&gt;_ctx[i].key) {</div><div class='add'>+                xl = fd-&gt;_ctx[i].xl_key;</div><div class='add'>+                old_THIS = THIS;</div><div class='add'>+                THIS = xl;</div><div class='add'>+                if (!xl-&gt;call_cleanup &amp;&amp; xl-&gt;cbks-&gt;release)</div><div class='add'>+                    xl-&gt;cbks-&gt;release(xl, fd);</div><div class='add'>+                THIS = old_THIS;</div><div class='add'>+            }</div><div class='ctx'>         }</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        LOCK_DESTROY (&amp;fd-&gt;lock);</div><div class='add'>+    LOCK_DESTROY(&amp;fd-&gt;lock);</div><div class='ctx'> </div><div class='del'>-	GF_FREE (fd-&gt;_ctx);</div><div class='del'>-        inode_unref (fd-&gt;inode);</div><div class='del'>-        fd-&gt;inode = (inode_t *)0xaaaaaaaa;</div><div class='del'>-        mem_put (tmp_pool,fd);</div><div class='del'>-	 tmp_pool = NULL;</div><div class='add'>+    GF_FREE(fd-&gt;_ctx);</div><div class='add'>+    if (bound) {</div><div class='add'>+        /*Decrease the count only after close happens on file*/</div><div class='add'>+        LOCK(&amp;fd-&gt;inode-&gt;lock);</div><div class='add'>+        {</div><div class='add'>+            fd-&gt;inode-&gt;fd_count--;</div><div class='add'>+        }</div><div class='add'>+        UNLOCK(&amp;fd-&gt;inode-&gt;lock);</div><div class='add'>+    }</div><div class='add'>+    inode_unref(fd-&gt;inode);</div><div class='add'>+    fd-&gt;inode = NULL;</div><div class='add'>+    fd_lk_ctx_unref(fd-&gt;lk_ctx);</div><div class='add'>+    mem_put(fd);</div><div class='ctx'> out:</div><div class='del'>-        return;</div><div class='add'>+    return;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> void</div><div class='del'>-fd_unref (fd_t *fd)</div><div class='add'>+fd_close(fd_t *fd)</div><div class='ctx'> {</div><div class='del'>-        int32_t refcount = 0;</div><div class='add'>+    xlator_t *xl, *old_THIS;</div><div class='ctx'> </div><div class='del'>-        if (!fd) {</div><div class='del'>-                gf_log ("fd.c", GF_LOG_ERROR, "fd is NULL");</div><div class='del'>-                return;</div><div class='del'>-        }</div><div class='add'>+    old_THIS = THIS;</div><div class='ctx'> </div><div class='del'>-        LOCK (&amp;fd-&gt;inode-&gt;lock);</div><div class='del'>-        {</div><div class='del'>-                _fd_unref (fd);</div><div class='del'>-                refcount = fd-&gt;refcount;</div><div class='add'>+    for (xl = fd-&gt;inode-&gt;table-&gt;xl-&gt;graph-&gt;first; xl != NULL; xl = xl-&gt;next) {</div><div class='add'>+        if (!xl-&gt;call_cleanup) {</div><div class='add'>+            THIS = xl;</div><div class='add'>+</div><div class='add'>+            if (IA_ISDIR(fd-&gt;inode-&gt;ia_type)) {</div><div class='add'>+                if (xl-&gt;cbks-&gt;fdclosedir != NULL) {</div><div class='add'>+                    xl-&gt;cbks-&gt;fdclosedir(xl, fd);</div><div class='add'>+                }</div><div class='add'>+            } else {</div><div class='add'>+                if (xl-&gt;cbks-&gt;fdclose != NULL) {</div><div class='add'>+                    xl-&gt;cbks-&gt;fdclose(xl, fd);</div><div class='add'>+                }</div><div class='add'>+            }</div><div class='ctx'>         }</div><div class='del'>-        UNLOCK (&amp;fd-&gt;inode-&gt;lock);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='add'>+    THIS = old_THIS;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+fd_unref(fd_t *fd)</div><div class='add'>+{</div><div class='add'>+    int32_t refcount = 0;</div><div class='add'>+    gf_boolean_t bound = _gf_false;</div><div class='add'>+</div><div class='add'>+    if (!fd) {</div><div class='add'>+        gf_msg_callingfn("fd", GF_LOG_ERROR, EINVAL, LG_MSG_INVALID_ARG,</div><div class='add'>+                         "fd is NULL");</div><div class='add'>+        return;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;fd-&gt;inode-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        refcount = GF_ATOMIC_DEC(fd-&gt;refcount);</div><div class='ctx'>         if (refcount == 0) {</div><div class='del'>-                fd_destroy (fd);</div><div class='add'>+            if (!list_empty(&amp;fd-&gt;inode_list)) {</div><div class='add'>+                list_del_init(&amp;fd-&gt;inode_list);</div><div class='add'>+                fd-&gt;inode-&gt;active_fd_count--;</div><div class='add'>+                bound = _gf_true;</div><div class='add'>+            }</div><div class='ctx'>         }</div><div class='add'>+    }</div><div class='add'>+    UNLOCK(&amp;fd-&gt;inode-&gt;lock);</div><div class='add'>+</div><div class='add'>+    if (refcount == 0) {</div><div class='add'>+        fd_destroy(fd, bound);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        return ;</div><div class='add'>+    return;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+static fd_t *</div><div class='add'>+__fd_bind(fd_t *fd)</div><div class='add'>+{</div><div class='add'>+    list_del_init(&amp;fd-&gt;inode_list);</div><div class='add'>+    list_add(&amp;fd-&gt;inode_list, &amp;fd-&gt;inode-&gt;fd_list);</div><div class='add'>+    fd-&gt;inode-&gt;fd_count++;</div><div class='add'>+    fd-&gt;inode-&gt;active_fd_count++;</div><div class='add'>+</div><div class='add'>+    return fd;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> fd_t *</div><div class='del'>-fd_bind (fd_t *fd)</div><div class='add'>+fd_bind(fd_t *fd)</div><div class='ctx'> {</div><div class='del'>-        inode_t *inode = NULL;</div><div class='add'>+    if (!fd || !fd-&gt;inode) {</div><div class='add'>+        gf_msg_callingfn("fd", GF_LOG_ERROR, EINVAL, LG_MSG_INVALID_ARG,</div><div class='add'>+                         "!fd || !fd-&gt;inode");</div><div class='add'>+        return NULL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;fd-&gt;inode-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        fd = __fd_bind(fd);</div><div class='add'>+    }</div><div class='add'>+    UNLOCK(&amp;fd-&gt;inode-&gt;lock);</div><div class='add'>+</div><div class='add'>+    return fd;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        if (!fd) {</div><div class='del'>-                gf_log ("fd.c", GF_LOG_ERROR, "fd is NULL");</div><div class='del'>-                return NULL;</div><div class='del'>-        }</div><div class='del'>-        inode = fd-&gt;inode;</div><div class='add'>+static fd_t *</div><div class='add'>+fd_allocate(inode_t *inode, uint64_t pid)</div><div class='add'>+{</div><div class='add'>+    fd_t *fd;</div><div class='add'>+</div><div class='add'>+    if (inode == NULL) {</div><div class='add'>+        gf_msg_callingfn("fd", GF_LOG_ERROR, EINVAL, LG_MSG_INVALID_ARG,</div><div class='add'>+                         "invalid argument");</div><div class='add'>+        return NULL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    fd = mem_get0(inode-&gt;table-&gt;fd_mem_pool);</div><div class='add'>+    if (fd == NULL) {</div><div class='add'>+        return NULL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    fd-&gt;xl_count = inode-&gt;table-&gt;xl-&gt;graph-&gt;xl_count + 1;</div><div class='add'>+</div><div class='add'>+    fd-&gt;_ctx = GF_CALLOC(1, (sizeof(struct _fd_ctx) * fd-&gt;xl_count),</div><div class='add'>+                         gf_common_mt_fd_ctx);</div><div class='add'>+    if (fd-&gt;_ctx == NULL) {</div><div class='add'>+        goto failed;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    fd-&gt;lk_ctx = fd_lk_ctx_create();</div><div class='add'>+    if (fd-&gt;lk_ctx != NULL) {</div><div class='add'>+        /* We need to take a reference from the inode, but we cannot do it</div><div class='add'>+         * here because this function can be called with the inode lock taken</div><div class='add'>+         * and inode_ref() takes the inode's table lock. This is the reverse</div><div class='add'>+         * of the logical lock acquisition order and can cause a deadlock. So</div><div class='add'>+         * we simply assign the inode here and we delefate the inode reference</div><div class='add'>+         * responsibility to the caller (when this function succeeds and the</div><div class='add'>+         * inode lock is released). This is safe because the caller must hold</div><div class='add'>+         * a reference of the inode to use it, so it's guaranteed that the</div><div class='add'>+         * number of references won't reach 0 before the caller finishes.</div><div class='add'>+         *</div><div class='add'>+         * TODO: minimize use of locks in favor of atomic operations to avoid</div><div class='add'>+         *       these dependencies. */</div><div class='add'>+        fd-&gt;inode = inode;</div><div class='add'>+        fd-&gt;pid = pid;</div><div class='add'>+        INIT_LIST_HEAD(&amp;fd-&gt;inode_list);</div><div class='add'>+        LOCK_INIT(&amp;fd-&gt;lock);</div><div class='add'>+        GF_ATOMIC_INIT(fd-&gt;refcount, 1);</div><div class='add'>+        return fd;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        LOCK (&amp;inode-&gt;lock);</div><div class='del'>-        {</div><div class='del'>-                list_add (&amp;fd-&gt;inode_list, &amp;inode-&gt;fd_list);</div><div class='del'>-        }</div><div class='del'>-        UNLOCK (&amp;inode-&gt;lock);</div><div class='add'>+    GF_FREE(fd-&gt;_ctx);</div><div class='ctx'> </div><div class='del'>-        return fd;</div><div class='add'>+failed:</div><div class='add'>+    mem_put(fd);</div><div class='add'>+</div><div class='add'>+    return NULL;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> fd_t *</div><div class='del'>-fd_create (inode_t *inode, pid_t pid)</div><div class='add'>+fd_create_uint64(inode_t *inode, uint64_t pid)</div><div class='ctx'> {</div><div class='del'>-        fd_t *fd = NULL;</div><div class='add'>+    fd_t *fd;</div><div class='ctx'> </div><div class='del'>-        if (inode == NULL) {</div><div class='del'>-                gf_log ("fd", GF_LOG_ERROR, "invalid argument");</div><div class='del'>-                return NULL;</div><div class='del'>-        }</div><div class='add'>+    fd = fd_allocate(inode, pid);</div><div class='add'>+    if (fd != NULL) {</div><div class='add'>+        /* fd_allocate() doesn't get a reference from the inode. We need to</div><div class='add'>+         * take it here in case of success. */</div><div class='add'>+        inode_ref(inode);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        fd = mem_get0 (inode-&gt;table-&gt;fd_mem_pool);</div><div class='del'>-        if (!fd)</div><div class='del'>-                goto out;</div><div class='add'>+    return fd;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        fd-&gt;xl_count = inode-&gt;table-&gt;xl-&gt;graph-&gt;xl_count + 1;</div><div class='add'>+fd_t *</div><div class='add'>+fd_create(inode_t *inode, pid_t pid)</div><div class='add'>+{</div><div class='add'>+    return fd_create_uint64(inode, (uint64_t)pid);</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        fd-&gt;_ctx = GF_CALLOC (1, (sizeof (struct _fd_ctx) * fd-&gt;xl_count),</div><div class='del'>-                              gf_common_mt_fd_ctx);</div><div class='del'>-        if (!fd-&gt;_ctx) {</div><div class='del'>-                GF_FREE (fd);</div><div class='del'>-                fd = NULL;</div><div class='del'>-                goto out;</div><div class='add'>+static fd_t *</div><div class='add'>+__fd_lookup(inode_t *inode, uint64_t pid)</div><div class='add'>+{</div><div class='add'>+    fd_t *iter_fd = NULL;</div><div class='add'>+    fd_t *fd = NULL;</div><div class='add'>+</div><div class='add'>+    if (list_empty(&amp;inode-&gt;fd_list))</div><div class='add'>+        return NULL;</div><div class='add'>+</div><div class='add'>+    list_for_each_entry(iter_fd, &amp;inode-&gt;fd_list, inode_list)</div><div class='add'>+    {</div><div class='add'>+        if (iter_fd-&gt;anonymous)</div><div class='add'>+            /* If someone was interested in getting an</div><div class='add'>+               anonymous fd (or was OK getting an anonymous fd),</div><div class='add'>+               they can as well call fd_anonymous() directly */</div><div class='add'>+            continue;</div><div class='add'>+</div><div class='add'>+        if (!pid || iter_fd-&gt;pid == pid) {</div><div class='add'>+            fd = __fd_ref(iter_fd);</div><div class='add'>+            break;</div><div class='ctx'>         }</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        fd-&gt;inode = inode_ref (inode);</div><div class='del'>-        fd-&gt;pid = pid;</div><div class='del'>-        INIT_LIST_HEAD (&amp;fd-&gt;inode_list);</div><div class='add'>+    return fd;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        LOCK_INIT (&amp;fd-&gt;lock);</div><div class='add'>+fd_t *</div><div class='add'>+fd_lookup(inode_t *inode, pid_t pid)</div><div class='add'>+{</div><div class='add'>+    fd_t *fd = NULL;</div><div class='ctx'> </div><div class='del'>-        LOCK (&amp;inode-&gt;lock);</div><div class='del'>-        {</div><div class='del'>-                fd = _fd_ref (fd);</div><div class='del'>-        }</div><div class='del'>-        UNLOCK (&amp;inode-&gt;lock);</div><div class='del'>-out:</div><div class='del'>-        return fd;</div><div class='add'>+    if (!inode) {</div><div class='add'>+        gf_msg_callingfn("fd", GF_LOG_WARNING, EINVAL, LG_MSG_INVALID_ARG,</div><div class='add'>+                         "!inode");</div><div class='add'>+        return NULL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;inode-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        fd = __fd_lookup(inode, (uint64_t)pid);</div><div class='add'>+    }</div><div class='add'>+    UNLOCK(&amp;inode-&gt;lock);</div><div class='add'>+</div><div class='add'>+    return fd;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+fd_t *</div><div class='add'>+fd_lookup_uint64(inode_t *inode, uint64_t pid)</div><div class='add'>+{</div><div class='add'>+    fd_t *fd = NULL;</div><div class='add'>+</div><div class='add'>+    if (!inode) {</div><div class='add'>+        gf_msg_callingfn("fd", GF_LOG_WARNING, EINVAL, LG_MSG_INVALID_ARG,</div><div class='add'>+                         "!inode");</div><div class='add'>+        return NULL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;inode-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        fd = __fd_lookup(inode, pid);</div><div class='add'>+    }</div><div class='add'>+    UNLOCK(&amp;inode-&gt;lock);</div><div class='add'>+</div><div class='add'>+    return fd;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static fd_t *</div><div class='add'>+__fd_lookup_anonymous(inode_t *inode, int32_t flags)</div><div class='add'>+{</div><div class='add'>+    fd_t *iter_fd = NULL;</div><div class='add'>+    fd_t *fd = NULL;</div><div class='add'>+</div><div class='add'>+    if (list_empty(&amp;inode-&gt;fd_list))</div><div class='add'>+        return NULL;</div><div class='add'>+</div><div class='add'>+    list_for_each_entry(iter_fd, &amp;inode-&gt;fd_list, inode_list)</div><div class='add'>+    {</div><div class='add'>+        if ((iter_fd-&gt;anonymous) &amp;&amp; (flags == iter_fd-&gt;flags)) {</div><div class='add'>+            fd = __fd_ref(iter_fd);</div><div class='add'>+            break;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return fd;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> fd_t *</div><div class='del'>-fd_lookup (inode_t *inode, pid_t pid)</div><div class='add'>+fd_anonymous_with_flags(inode_t *inode, int32_t flags)</div><div class='ctx'> {</div><div class='del'>-        fd_t *fd = NULL;</div><div class='del'>-        fd_t *iter_fd = NULL;</div><div class='add'>+    fd_t *fd = NULL;</div><div class='add'>+    bool ref = false;</div><div class='ctx'> </div><div class='del'>-        if (!inode)</div><div class='del'>-                return NULL;</div><div class='add'>+    LOCK(&amp;inode-&gt;lock);</div><div class='ctx'> </div><div class='del'>-        LOCK (&amp;inode-&gt;lock);</div><div class='del'>-        {</div><div class='del'>-                if (list_empty (&amp;inode-&gt;fd_list)) {</div><div class='del'>-                        fd = NULL;</div><div class='del'>-                } else {</div><div class='del'>-                        list_for_each_entry (iter_fd, &amp;inode-&gt;fd_list, inode_list) {</div><div class='del'>-                                if (pid) {</div><div class='del'>-                                        if (iter_fd-&gt;pid == pid) {</div><div class='del'>-                                                fd = _fd_ref (iter_fd);</div><div class='del'>-                                                break;</div><div class='del'>-                                        }</div><div class='del'>-                                } else {</div><div class='del'>-                                        fd = _fd_ref (iter_fd);</div><div class='del'>-                                        break;</div><div class='del'>-                                }</div><div class='del'>-                        }</div><div class='del'>-                }</div><div class='add'>+    fd = __fd_lookup_anonymous(inode, flags);</div><div class='add'>+</div><div class='add'>+    /* if (fd); then we already have increased the refcount in</div><div class='add'>+       __fd_lookup_anonymous(), so no need of one more fd_ref().</div><div class='add'>+       if (!fd); then both create and bind won't bump up the ref</div><div class='add'>+       count, so we have to call fd_ref() after bind. */</div><div class='add'>+    if (fd == NULL) {</div><div class='add'>+        fd = fd_allocate(inode, 0);</div><div class='add'>+        if (fd != NULL) {</div><div class='add'>+            fd-&gt;anonymous = _gf_true;</div><div class='add'>+            fd-&gt;flags = GF_ANON_FD_FLAGS | (flags &amp; O_DIRECT);</div><div class='add'>+</div><div class='add'>+            __fd_bind(fd);</div><div class='add'>+</div><div class='add'>+            ref = true;</div><div class='ctx'>         }</div><div class='del'>-        UNLOCK (&amp;inode-&gt;lock);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        return fd;</div><div class='add'>+    UNLOCK(&amp;inode-&gt;lock);</div><div class='add'>+</div><div class='add'>+    if (ref) {</div><div class='add'>+        /* fd_allocate() doesn't get a reference from the inode. We need to</div><div class='add'>+         * take it here in case of success. */</div><div class='add'>+        inode_ref(inode);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return fd;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+fd_t *</div><div class='add'>+fd_anonymous(inode_t *inode)</div><div class='add'>+{</div><div class='add'>+    return fd_anonymous_with_flags(inode, 0);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+fd_t *</div><div class='add'>+fd_lookup_anonymous(inode_t *inode, int32_t flags)</div><div class='add'>+{</div><div class='add'>+    fd_t *fd = NULL;</div><div class='add'>+</div><div class='add'>+    if (!inode) {</div><div class='add'>+        gf_msg_callingfn("fd", GF_LOG_WARNING, EINVAL, LG_MSG_INVALID_ARG,</div><div class='add'>+                         "!inode");</div><div class='add'>+        return NULL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;inode-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        fd = __fd_lookup_anonymous(inode, flags);</div><div class='add'>+    }</div><div class='add'>+    UNLOCK(&amp;inode-&gt;lock);</div><div class='add'>+    return fd;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+gf_boolean_t</div><div class='add'>+fd_is_anonymous(fd_t *fd)</div><div class='add'>+{</div><div class='add'>+    return (fd &amp;&amp; fd-&gt;anonymous);</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> uint8_t</div><div class='del'>-fd_list_empty (inode_t *inode)</div><div class='add'>+fd_list_empty(inode_t *inode)</div><div class='ctx'> {</div><div class='del'>-        uint8_t empty = 0;</div><div class='add'>+    uint8_t empty = 0;</div><div class='ctx'> </div><div class='del'>-        LOCK (&amp;inode-&gt;lock);</div><div class='del'>-        {</div><div class='del'>-                empty = list_empty (&amp;inode-&gt;fd_list);</div><div class='del'>-        }</div><div class='del'>-        UNLOCK (&amp;inode-&gt;lock);</div><div class='add'>+    LOCK(&amp;inode-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        empty = list_empty(&amp;inode-&gt;fd_list);</div><div class='add'>+    }</div><div class='add'>+    UNLOCK(&amp;inode-&gt;lock);</div><div class='ctx'> </div><div class='del'>-        return empty;</div><div class='add'>+    return empty;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-__fd_ctx_set (fd_t *fd, xlator_t *xlator, uint64_t value)</div><div class='add'>+__fd_ctx_set(fd_t *fd, xlator_t *xlator, uint64_t value)</div><div class='ctx'> {</div><div class='del'>-	int index = 0;</div><div class='del'>-        int ret = 0;</div><div class='del'>-        int set_idx = -1;</div><div class='add'>+    int index = 0, new_xl_count = 0;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    int set_idx = -1;</div><div class='add'>+    void *begin = NULL;</div><div class='add'>+    size_t diff = 0;</div><div class='add'>+    struct _fd_ctx *tmp = NULL;</div><div class='add'>+</div><div class='add'>+    if (!fd || !xlator)</div><div class='add'>+        return -1;</div><div class='add'>+</div><div class='add'>+    for (index = 0; index &lt; fd-&gt;xl_count; index++) {</div><div class='add'>+        if (!fd-&gt;_ctx[index].key) {</div><div class='add'>+            if (set_idx == -1)</div><div class='add'>+                set_idx = index;</div><div class='add'>+            /* don't break, to check if key already exists</div><div class='add'>+               further on */</div><div class='add'>+        }</div><div class='add'>+        if (fd-&gt;_ctx[index].xl_key == xlator) {</div><div class='add'>+            set_idx = index;</div><div class='add'>+            break;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	if (!fd || !xlator)</div><div class='del'>-		return -1;</div><div class='add'>+    if (set_idx == -1) {</div><div class='add'>+        set_idx = fd-&gt;xl_count;</div><div class='ctx'> </div><div class='del'>-        for (index = 0; index &lt; fd-&gt;xl_count; index++) {</div><div class='del'>-                if (!fd-&gt;_ctx[index].key) {</div><div class='del'>-                        if (set_idx == -1)</div><div class='del'>-                                set_idx = index;</div><div class='del'>-                        /* dont break, to check if key already exists</div><div class='del'>-                           further on */</div><div class='del'>-                }</div><div class='del'>-                if (fd-&gt;_ctx[index].xl_key == xlator) {</div><div class='del'>-                        set_idx = index;</div><div class='del'>-                        break;</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='add'>+        new_xl_count = fd-&gt;xl_count + xlator-&gt;graph-&gt;xl_count;</div><div class='ctx'> </div><div class='del'>-        if (set_idx == -1) {</div><div class='del'>-                ret = -1;</div><div class='del'>-                goto out;</div><div class='add'>+        tmp = GF_REALLOC(fd-&gt;_ctx, (sizeof(struct _fd_ctx) * new_xl_count));</div><div class='add'>+        if (tmp == NULL) {</div><div class='add'>+            ret = -1;</div><div class='add'>+            goto out;</div><div class='ctx'>         }</div><div class='ctx'> </div><div class='del'>-        fd-&gt;_ctx[set_idx].xl_key = xlator;</div><div class='del'>-        fd-&gt;_ctx[set_idx].value1  = value;</div><div class='add'>+        fd-&gt;_ctx = tmp;</div><div class='add'>+</div><div class='add'>+        begin = fd-&gt;_ctx;</div><div class='add'>+        begin += (fd-&gt;xl_count * sizeof(struct _fd_ctx));</div><div class='add'>+</div><div class='add'>+        diff = (new_xl_count - fd-&gt;xl_count) * sizeof(struct _fd_ctx);</div><div class='add'>+</div><div class='add'>+        memset(begin, 0, diff);</div><div class='add'>+</div><div class='add'>+        fd-&gt;xl_count = new_xl_count;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    fd-&gt;_ctx[set_idx].xl_key = xlator;</div><div class='add'>+    fd-&gt;_ctx[set_idx].value1 = value;</div><div class='ctx'> </div><div class='ctx'> out:</div><div class='del'>-	return ret;</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-fd_ctx_set (fd_t *fd, xlator_t *xlator, uint64_t value)</div><div class='add'>+fd_ctx_set(fd_t *fd, xlator_t *xlator, uint64_t value)</div><div class='ctx'> {</div><div class='del'>-        int ret = 0;</div><div class='add'>+    int ret = 0;</div><div class='ctx'> </div><div class='del'>-	if (!fd || !xlator)</div><div class='del'>-		return -1;</div><div class='add'>+    if (!fd || !xlator) {</div><div class='add'>+        gf_msg_callingfn("fd", GF_LOG_WARNING, EINVAL, LG_MSG_INVALID_ARG,</div><div class='add'>+                         "%p %p", fd, xlator);</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        LOCK (&amp;fd-&gt;lock);</div><div class='del'>-        {</div><div class='del'>-                ret = __fd_ctx_set (fd, xlator, value);</div><div class='del'>-        }</div><div class='del'>-        UNLOCK (&amp;fd-&gt;lock);</div><div class='add'>+    LOCK(&amp;fd-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        ret = __fd_ctx_set(fd, xlator, value);</div><div class='add'>+    }</div><div class='add'>+    UNLOCK(&amp;fd-&gt;lock);</div><div class='ctx'> </div><div class='del'>-        return ret;</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-__fd_ctx_get (fd_t *fd, xlator_t *xlator, uint64_t *value)</div><div class='add'>+__fd_ctx_get(fd_t *fd, xlator_t *xlator, uint64_t *value)</div><div class='ctx'> {</div><div class='del'>-	int index = 0;</div><div class='del'>-        int ret = 0;</div><div class='add'>+    int index = 0;</div><div class='add'>+    int ret = 0;</div><div class='ctx'> </div><div class='del'>-	if (!fd || !xlator)</div><div class='del'>-		return -1;</div><div class='add'>+    if (!fd || !xlator)</div><div class='add'>+        return -1;</div><div class='ctx'> </div><div class='del'>-        for (index = 0; index &lt; fd-&gt;xl_count; index++) {</div><div class='del'>-                if (fd-&gt;_ctx[index].xl_key == xlator)</div><div class='del'>-                        break;</div><div class='del'>-        }</div><div class='add'>+    for (index = 0; index &lt; fd-&gt;xl_count; index++) {</div><div class='add'>+        if (fd-&gt;_ctx[index].xl_key == xlator)</div><div class='add'>+            break;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        if (index == fd-&gt;xl_count) {</div><div class='del'>-                ret = -1;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='add'>+    if (index == fd-&gt;xl_count) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        if (value)</div><div class='del'>-                *value = fd-&gt;_ctx[index].value1;</div><div class='add'>+    if (value)</div><div class='add'>+        *value = fd-&gt;_ctx[index].value1;</div><div class='ctx'> </div><div class='ctx'> out:</div><div class='del'>-	return ret;</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-fd_ctx_get (fd_t *fd, xlator_t *xlator, uint64_t *value)</div><div class='add'>+fd_ctx_get(fd_t *fd, xlator_t *xlator, uint64_t *value)</div><div class='ctx'> {</div><div class='del'>-        int ret = 0;</div><div class='add'>+    int ret = 0;</div><div class='ctx'> </div><div class='del'>-	if (!fd || !xlator)</div><div class='del'>-		return -1;</div><div class='add'>+    if (!fd || !xlator)</div><div class='add'>+        return -1;</div><div class='ctx'> </div><div class='del'>-        LOCK (&amp;fd-&gt;lock);</div><div class='del'>-        {</div><div class='del'>-                ret = __fd_ctx_get (fd, xlator, value);</div><div class='del'>-        }</div><div class='del'>-        UNLOCK (&amp;fd-&gt;lock);</div><div class='add'>+    LOCK(&amp;fd-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        ret = __fd_ctx_get(fd, xlator, value);</div><div class='add'>+    }</div><div class='add'>+    UNLOCK(&amp;fd-&gt;lock);</div><div class='ctx'> </div><div class='del'>-        return ret;</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-__fd_ctx_del (fd_t *fd, xlator_t *xlator, uint64_t *value)</div><div class='add'>+__fd_ctx_del(fd_t *fd, xlator_t *xlator, uint64_t *value)</div><div class='ctx'> {</div><div class='del'>-	int index = 0;</div><div class='del'>-        int ret = 0;</div><div class='add'>+    int index = 0;</div><div class='add'>+    int ret = 0;</div><div class='ctx'> </div><div class='del'>-	if (!fd || !xlator)</div><div class='del'>-		return -1;</div><div class='add'>+    if (!fd || !xlator)</div><div class='add'>+        return -1;</div><div class='ctx'> </div><div class='del'>-        for (index = 0; index &lt; fd-&gt;xl_count; index++) {</div><div class='del'>-                if (fd-&gt;_ctx[index].xl_key == xlator)</div><div class='del'>-                        break;</div><div class='del'>-        }</div><div class='add'>+    for (index = 0; index &lt; fd-&gt;xl_count; index++) {</div><div class='add'>+        if (fd-&gt;_ctx[index].xl_key == xlator)</div><div class='add'>+            break;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        if (index == fd-&gt;xl_count) {</div><div class='del'>-                ret = -1;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='add'>+    if (index == fd-&gt;xl_count) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        if (value)</div><div class='del'>-                *value = fd-&gt;_ctx[index].value1;</div><div class='add'>+    if (value)</div><div class='add'>+        *value = fd-&gt;_ctx[index].value1;</div><div class='ctx'> </div><div class='del'>-        fd-&gt;_ctx[index].key   = 0;</div><div class='del'>-        fd-&gt;_ctx[index].value1 = 0;</div><div class='add'>+    fd-&gt;_ctx[index].key = 0;</div><div class='add'>+    fd-&gt;_ctx[index].value1 = 0;</div><div class='ctx'> </div><div class='ctx'> out:</div><div class='del'>-	return ret;</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-fd_ctx_del (fd_t *fd, xlator_t *xlator, uint64_t *value)</div><div class='add'>+fd_ctx_del(fd_t *fd, xlator_t *xlator, uint64_t *value)</div><div class='ctx'> {</div><div class='del'>-        int ret = 0;</div><div class='add'>+    int ret = 0;</div><div class='ctx'> </div><div class='del'>-	if (!fd || !xlator)</div><div class='del'>-		return -1;</div><div class='add'>+    if (!fd || !xlator)</div><div class='add'>+        return -1;</div><div class='ctx'> </div><div class='del'>-        LOCK (&amp;fd-&gt;lock);</div><div class='del'>-        {</div><div class='del'>-                ret = __fd_ctx_del (fd, xlator, value);</div><div class='del'>-        }</div><div class='del'>-        UNLOCK (&amp;fd-&gt;lock);</div><div class='add'>+    LOCK(&amp;fd-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        ret = __fd_ctx_del(fd, xlator, value);</div><div class='add'>+    }</div><div class='add'>+    UNLOCK(&amp;fd-&gt;lock);</div><div class='ctx'> </div><div class='del'>-        return ret;</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> void</div><div class='del'>-fd_dump (fd_t *fd, char *prefix)</div><div class='del'>-{</div><div class='del'>-        char        key[GF_DUMP_MAX_BUF_LEN];</div><div class='del'>-</div><div class='del'>-        if (!fd)</div><div class='del'>-                return;</div><div class='del'>-</div><div class='del'>-        memset(key, 0, sizeof(key));</div><div class='del'>-        gf_proc_dump_build_key(key, prefix, "pid");</div><div class='del'>-        gf_proc_dump_write(key, "%d", fd-&gt;pid);</div><div class='del'>-        gf_proc_dump_build_key(key, prefix, "refcount");</div><div class='del'>-        gf_proc_dump_write(key, "%d", fd-&gt;refcount);</div><div class='del'>-        gf_proc_dump_build_key(key, prefix, "flags");</div><div class='del'>-        gf_proc_dump_write(key, "%d", fd-&gt;flags);</div><div class='del'>-        if (fd-&gt;inode) {</div><div class='del'>-                gf_proc_dump_build_key(key, prefix, "inode");</div><div class='del'>-                gf_proc_dump_write(key, "%ld", fd-&gt;inode-&gt;ino);</div><div class='del'>-        }</div><div class='add'>+fd_dump(fd_t *fd, char *prefix)</div><div class='add'>+{</div><div class='add'>+    char key[GF_DUMP_MAX_BUF_LEN];</div><div class='add'>+</div><div class='add'>+    if (!fd)</div><div class='add'>+        return;</div><div class='add'>+</div><div class='add'>+    gf_proc_dump_write("pid", "%" PRIu64, fd-&gt;pid);</div><div class='add'>+    gf_proc_dump_write("refcount", "%" GF_PRI_ATOMIC,</div><div class='add'>+                       GF_ATOMIC_GET(fd-&gt;refcount));</div><div class='add'>+    gf_proc_dump_write("flags", "%d", fd-&gt;flags);</div><div class='add'>+</div><div class='add'>+    if (fd-&gt;inode) {</div><div class='add'>+        gf_proc_dump_build_key(key, "inode", NULL);</div><div class='add'>+        gf_proc_dump_add_section("%s", key);</div><div class='add'>+        inode_dump(fd-&gt;inode, key);</div><div class='add'>+    }</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+void</div><div class='add'>+fdentry_dump(fdentry_t *fdentry, char *prefix)</div><div class='add'>+{</div><div class='add'>+    if (!fdentry)</div><div class='add'>+        return;</div><div class='add'>+</div><div class='add'>+    if (GF_FDENTRY_ALLOCATED != fdentry-&gt;next_free)</div><div class='add'>+        return;</div><div class='add'>+</div><div class='add'>+    if (fdentry-&gt;fd)</div><div class='add'>+        fd_dump(fdentry-&gt;fd, prefix);</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> void</div><div class='del'>-fdentry_dump (fdentry_t *fdentry, char *prefix)</div><div class='add'>+fdtable_dump(fdtable_t *fdtable, char *prefix)</div><div class='ctx'> {</div><div class='del'>-        if (!fdentry)</div><div class='del'>-                return;</div><div class='add'>+    char key[GF_DUMP_MAX_BUF_LEN];</div><div class='add'>+    int i = 0;</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    if (!fdtable)</div><div class='add'>+        return;</div><div class='add'>+</div><div class='add'>+    ret = pthread_rwlock_tryrdlock(&amp;fdtable-&gt;lock);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    gf_proc_dump_build_key(key, prefix, "refcount");</div><div class='add'>+    gf_proc_dump_write(key, "%d", fdtable-&gt;refcount);</div><div class='add'>+    gf_proc_dump_build_key(key, prefix, "maxfds");</div><div class='add'>+    gf_proc_dump_write(key, "%d", fdtable-&gt;max_fds);</div><div class='add'>+    gf_proc_dump_build_key(key, prefix, "first_free");</div><div class='add'>+    gf_proc_dump_write(key, "%d", fdtable-&gt;first_free);</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; fdtable-&gt;max_fds; i++) {</div><div class='add'>+        if (GF_FDENTRY_ALLOCATED == fdtable-&gt;fdentries[i].next_free) {</div><div class='add'>+            gf_proc_dump_build_key(key, prefix, "fdentry[%d]", i);</div><div class='add'>+            gf_proc_dump_add_section("%s", key);</div><div class='add'>+            fdentry_dump(&amp;fdtable-&gt;fdentries[i], key);</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        if (GF_FDENTRY_ALLOCATED != fdentry-&gt;next_free)</div><div class='del'>-                return;</div><div class='add'>+    pthread_rwlock_unlock(&amp;fdtable-&gt;lock);</div><div class='ctx'> </div><div class='del'>-        if (fdentry-&gt;fd)</div><div class='del'>-                fd_dump(fdentry-&gt;fd, prefix);</div><div class='add'>+out:</div><div class='add'>+    if (ret != 0)</div><div class='add'>+        gf_proc_dump_write("Unable to dump the fdtable",</div><div class='add'>+                           "(Lock acquistion failed) %p", fdtable);</div><div class='add'>+    return;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+void</div><div class='add'>+fd_ctx_dump(fd_t *fd, char *prefix)</div><div class='add'>+{</div><div class='add'>+    struct _fd_ctx *fd_ctx = NULL;</div><div class='add'>+    xlator_t *xl = NULL;</div><div class='add'>+    int i = 0;</div><div class='add'>+</div><div class='add'>+    if ((fd == NULL) || (fd-&gt;_ctx == NULL)) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;fd-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        if (fd-&gt;_ctx != NULL) {</div><div class='add'>+            fd_ctx = GF_CALLOC(fd-&gt;xl_count, sizeof(*fd_ctx),</div><div class='add'>+                               gf_common_mt_fd_ctx);</div><div class='add'>+            if (fd_ctx == NULL) {</div><div class='add'>+                goto unlock;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            for (i = 0; i &lt; fd-&gt;xl_count; i++) {</div><div class='add'>+                fd_ctx[i] = fd-&gt;_ctx[i];</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+unlock:</div><div class='add'>+    UNLOCK(&amp;fd-&gt;lock);</div><div class='add'>+</div><div class='add'>+    if (fd_ctx == NULL) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; fd-&gt;xl_count; i++) {</div><div class='add'>+        if (fd_ctx[i].xl_key) {</div><div class='add'>+            xl = (xlator_t *)(long)fd_ctx[i].xl_key;</div><div class='add'>+            if (xl-&gt;dumpops &amp;&amp; xl-&gt;dumpops-&gt;fdctx)</div><div class='add'>+                xl-&gt;dumpops-&gt;fdctx(xl, fd);</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    GF_FREE(fd_ctx);</div><div class='add'>+</div><div class='add'>+    return;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> void</div><div class='del'>-fdtable_dump (fdtable_t *fdtable, char *prefix)</div><div class='add'>+fdentry_dump_to_dict(fdentry_t *fdentry, char *prefix, dict_t *dict,</div><div class='add'>+                     int *openfds)</div><div class='ctx'> {</div><div class='del'>-        char    key[GF_DUMP_MAX_BUF_LEN];</div><div class='del'>-        int     i = 0;</div><div class='del'>-        int     ret = -1;</div><div class='add'>+    char key[GF_DUMP_MAX_BUF_LEN] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int ret = -1;</div><div class='ctx'> </div><div class='del'>-        if (!fdtable)</div><div class='del'>-                return;</div><div class='add'>+    if (!fdentry)</div><div class='add'>+        return;</div><div class='add'>+    if (!dict)</div><div class='add'>+        return;</div><div class='ctx'> </div><div class='del'>-	ret = pthread_mutex_trylock (&amp;fdtable-&gt;lock);</div><div class='add'>+    if (GF_FDENTRY_ALLOCATED != fdentry-&gt;next_free)</div><div class='add'>+        return;</div><div class='ctx'> </div><div class='del'>-        if (ret) {</div><div class='del'>-		gf_log ("fd", GF_LOG_WARNING, "Unable to acquire lock");</div><div class='del'>-                return;</div><div class='del'>-        }</div><div class='add'>+    if (fdentry-&gt;fd) {</div><div class='add'>+        snprintf(key, sizeof(key), "%s.pid", prefix);</div><div class='add'>+        ret = dict_set_uint64(dict, key, fdentry-&gt;fd-&gt;pid);</div><div class='add'>+        if (ret)</div><div class='add'>+            return;</div><div class='add'>+</div><div class='add'>+        snprintf(key, sizeof(key), "%s.refcount", prefix);</div><div class='add'>+        ret = dict_set_int32(dict, key, GF_ATOMIC_GET(fdentry-&gt;fd-&gt;refcount));</div><div class='add'>+        if (ret)</div><div class='add'>+            return;</div><div class='add'>+</div><div class='add'>+        snprintf(key, sizeof(key), "%s.flags", prefix);</div><div class='add'>+        ret = dict_set_int32(dict, key, fdentry-&gt;fd-&gt;flags);</div><div class='add'>+        if (ret)</div><div class='add'>+            return;</div><div class='add'>+</div><div class='add'>+        (*openfds)++;</div><div class='add'>+    }</div><div class='add'>+    return;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        memset(key, 0, sizeof(key));</div><div class='del'>-        gf_proc_dump_build_key(key, prefix, "refcount");</div><div class='del'>-        gf_proc_dump_write(key, "%d", fdtable-&gt;refcount);</div><div class='del'>-        gf_proc_dump_build_key(key, prefix, "maxfds");</div><div class='del'>-        gf_proc_dump_write(key, "%d", fdtable-&gt;max_fds);</div><div class='del'>-        gf_proc_dump_build_key(key, prefix, "first_free");</div><div class='del'>-        gf_proc_dump_write(key, "%d", fdtable-&gt;first_free);</div><div class='del'>-</div><div class='del'>-        for ( i = 0 ; i &lt; fdtable-&gt;max_fds; i++) {</div><div class='del'>-                if (GF_FDENTRY_ALLOCATED ==</div><div class='del'>-                                fdtable-&gt;fdentries[i].next_free) {</div><div class='del'>-                        gf_proc_dump_build_key(key, prefix, "fdentry[%d]", i);</div><div class='del'>-                        gf_proc_dump_add_section(key);</div><div class='del'>-                        fdentry_dump(&amp;fdtable-&gt;fdentries[i], key);</div><div class='del'>-                }</div><div class='add'>+void</div><div class='add'>+fdtable_dump_to_dict(fdtable_t *fdtable, char *prefix, dict_t *dict)</div><div class='add'>+{</div><div class='add'>+    char key[GF_DUMP_MAX_BUF_LEN] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int i = 0;</div><div class='add'>+    int openfds = 0;</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    if (!fdtable)</div><div class='add'>+        return;</div><div class='add'>+    if (!dict)</div><div class='add'>+        return;</div><div class='add'>+</div><div class='add'>+    ret = pthread_rwlock_tryrdlock(&amp;fdtable-&gt;lock);</div><div class='add'>+    if (ret)</div><div class='add'>+        return;</div><div class='add'>+</div><div class='add'>+    snprintf(key, sizeof(key), "%s.fdtable.refcount", prefix);</div><div class='add'>+    ret = dict_set_int32(dict, key, fdtable-&gt;refcount);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    snprintf(key, sizeof(key), "%s.fdtable.maxfds", prefix);</div><div class='add'>+    ret = dict_set_uint32(dict, key, fdtable-&gt;max_fds);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    snprintf(key, sizeof(key), "%s.fdtable.firstfree", prefix);</div><div class='add'>+    ret = dict_set_int32(dict, key, fdtable-&gt;first_free);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; fdtable-&gt;max_fds; i++) {</div><div class='add'>+        if (GF_FDENTRY_ALLOCATED == fdtable-&gt;fdentries[i].next_free) {</div><div class='add'>+            snprintf(key, sizeof(key), "%s.fdtable.fdentry%d", prefix, i);</div><div class='add'>+            fdentry_dump_to_dict(&amp;fdtable-&gt;fdentries[i], key, dict, &amp;openfds);</div><div class='ctx'>         }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    snprintf(key, sizeof(key), "%s.fdtable.openfds", prefix);</div><div class='add'>+    ret = dict_set_int32(dict, key, openfds);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='ctx'> </div><div class='del'>-        pthread_mutex_unlock(&amp;fdtable-&gt;lock);</div><div class='add'>+out:</div><div class='add'>+    pthread_rwlock_unlock(&amp;fdtable-&gt;lock);</div><div class='add'>+    return;</div><div class='ctx'> }</div><div class='head'>diff --git a/libglusterfs/src/fd.h b/libglusterfs/src/fd.h<br/>deleted file mode 100644<br/>index e01ef753e28..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/libglusterfs/src/fd.h?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/fd.h</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,168 +0,0 @@</div><div class='del'>-/*</div><div class='del'>-  Copyright (c) 2007-2009 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='del'>-  This file is part of GlusterFS.</div><div class='del'>-</div><div class='del'>-  GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-  it under the terms of the GNU General Public License as published</div><div class='del'>-  by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-  or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-  GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-  WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-  General Public License for more details.</div><div class='del'>-</div><div class='del'>-  You should have received a copy of the GNU General Public License</div><div class='del'>-  along with this program.  If not, see</div><div class='del'>-  &lt;http://www.gnu.org/licenses/&gt;.</div><div class='del'>-*/</div><div class='del'>-</div><div class='del'>-#ifndef _FD_H</div><div class='del'>-#define _FD_H</div><div class='del'>-</div><div class='del'>-#ifndef _CONFIG_H</div><div class='del'>-#define _CONFIG_H</div><div class='del'>-#include "config.h"</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-#include "list.h"</div><div class='del'>-#include &lt;sys/types.h&gt;</div><div class='del'>-#include &lt;unistd.h&gt;</div><div class='del'>-#include "glusterfs.h"</div><div class='del'>-#include "locking.h"</div><div class='del'>-</div><div class='del'>-struct _inode;</div><div class='del'>-struct _dict;</div><div class='del'>-</div><div class='del'>-struct _fd_ctx {</div><div class='del'>-        union {</div><div class='del'>-                uint64_t  key;</div><div class='del'>-                void     *xl_key;</div><div class='del'>-        };</div><div class='del'>-        union {</div><div class='del'>-                uint64_t  value1;</div><div class='del'>-                void     *ptr1;</div><div class='del'>-        };</div><div class='del'>-};</div><div class='del'>-</div><div class='del'>-/* If this structure changes, please have mercy on the booster maintainer</div><div class='del'>- * and update the fd_t struct in booster/src/booster-fd.h.</div><div class='del'>- * See the comment there to know why.</div><div class='del'>- */</div><div class='del'>-struct _fd {</div><div class='del'>-        pid_t             pid;</div><div class='del'>-	int32_t           flags;</div><div class='del'>-        int32_t           refcount;</div><div class='del'>-        uint64_t          flush_unique;</div><div class='del'>-        struct list_head  inode_list;</div><div class='del'>-        struct _inode    *inode;</div><div class='del'>-        gf_lock_t         lock; /* used ONLY for manipulating</div><div class='del'>-                                   'struct _fd_ctx' array (_ctx).*/</div><div class='del'>-	struct _fd_ctx   *_ctx;</div><div class='del'>-        int               xl_count; /* Number of xl referred in this fd */</div><div class='del'>-};</div><div class='del'>-typedef struct _fd fd_t;</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-struct fd_table_entry {</div><div class='del'>-        fd_t    *fd;</div><div class='del'>-        int     next_free;</div><div class='del'>-};</div><div class='del'>-typedef struct fd_table_entry fdentry_t;</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-struct _fdtable {</div><div class='del'>-        int             refcount;</div><div class='del'>-        uint32_t        max_fds;</div><div class='del'>-        pthread_mutex_t lock;</div><div class='del'>-        fdentry_t       *fdentries;</div><div class='del'>-        int             first_free;</div><div class='del'>-};</div><div class='del'>-typedef struct _fdtable fdtable_t;</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-/* Signifies no more entries in the fd table. */</div><div class='del'>-#define GF_FDTABLE_END  -1</div><div class='del'>-</div><div class='del'>-/* This is used to invalidated</div><div class='del'>- * the next_free value in an fdentry that has been allocated</div><div class='del'>- */</div><div class='del'>-#define GF_FDENTRY_ALLOCATED    -2</div><div class='del'>-</div><div class='del'>-#include "logging.h"</div><div class='del'>-#include "xlator.h"</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-inline void</div><div class='del'>-gf_fd_put (fdtable_t *fdtable, int32_t fd);</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-fd_t *</div><div class='del'>-gf_fd_fdptr_get (fdtable_t *fdtable, int64_t fd);</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-fdtable_t *</div><div class='del'>-gf_fd_fdtable_alloc (void);</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-gf_fd_unused_get (fdtable_t *fdtable, fd_t *fdptr);</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-fdentry_t *</div><div class='del'>-gf_fd_fdtable_get_all_fds (fdtable_t *fdtable, uint32_t *count);</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-void</div><div class='del'>-gf_fd_fdtable_destroy (fdtable_t *fdtable);</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-fd_t *</div><div class='del'>-fd_ref (fd_t *fd);</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-void</div><div class='del'>-fd_unref (fd_t *fd);</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-fd_t *</div><div class='del'>-fd_create (struct _inode *inode, pid_t pid);</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-fd_t *</div><div class='del'>-fd_lookup (struct _inode *inode, pid_t pid);</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-uint8_t</div><div class='del'>-fd_list_empty (struct _inode *inode);</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-fd_t *</div><div class='del'>-fd_bind (fd_t *fd);</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-fd_ctx_set (fd_t *fd, xlator_t *xlator, uint64_t value);</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-fd_ctx_get (fd_t *fd, xlator_t *xlator, uint64_t *value);</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-fd_ctx_del (fd_t *fd, xlator_t *xlator, uint64_t *value);</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-__fd_ctx_set (fd_t *fd, xlator_t *xlator, uint64_t value);</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-__fd_ctx_get (fd_t *fd, xlator_t *xlator, uint64_t *value);</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-__fd_ctx_del (fd_t *fd, xlator_t *xlator, uint64_t *value);</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-#endif /* _FD_H */</div><div class='head'>diff --git a/libglusterfs/src/gen-defaults.py b/libglusterfs/src/gen-defaults.py<br/>new file mode 100755<br/>index 00000000000..e31d3a9fe8a<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/libglusterfs/src/gen-defaults.py?id=d1d7a6f35c816822fab51c820e25023863c239c1'>libglusterfs/src/gen-defaults.py</a></div><div class='hunk'>@@ -0,0 +1,81 @@</div><div class='add'>+#!/usr/bin/python3</div><div class='add'>+</div><div class='add'>+from __future__ import print_function</div><div class='add'>+import sys</div><div class='add'>+from generator import ops, fop_subs, cbk_subs, generate</div><div class='add'>+</div><div class='add'>+FAILURE_CBK_TEMPLATE = """</div><div class='add'>+int32_t</div><div class='add'>+default_@NAME@_failure_cbk (call_frame_t *frame, int32_t op_errno)</div><div class='add'>+{</div><div class='add'>+	STACK_UNWIND_STRICT (@NAME@, frame, -1, op_errno, @ERROR_ARGS@);</div><div class='add'>+	return 0;</div><div class='add'>+}</div><div class='add'>+"""</div><div class='add'>+</div><div class='add'>+CBK_RESUME_TEMPLATE = """</div><div class='add'>+int32_t</div><div class='add'>+default_@NAME@_cbk_resume (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+			   int32_t op_ret, int32_t op_errno, @LONG_ARGS@)</div><div class='add'>+{</div><div class='add'>+	STACK_UNWIND_STRICT (@NAME@, frame, op_ret, op_errno,</div><div class='add'>+			     @SHORT_ARGS@);</div><div class='add'>+	return 0;</div><div class='add'>+}</div><div class='add'>+"""</div><div class='add'>+</div><div class='add'>+CBK_TEMPLATE = """</div><div class='add'>+int32_t</div><div class='add'>+default_@NAME@_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+		    int32_t op_ret, int32_t op_errno, @LONG_ARGS@)</div><div class='add'>+{</div><div class='add'>+	STACK_UNWIND_STRICT (@NAME@, frame, op_ret, op_errno,</div><div class='add'>+			     @SHORT_ARGS@);</div><div class='add'>+	return 0;</div><div class='add'>+}</div><div class='add'>+"""</div><div class='add'>+</div><div class='add'>+RESUME_TEMPLATE = """</div><div class='add'>+int32_t</div><div class='add'>+default_@NAME@_resume (call_frame_t *frame, xlator_t *this, @LONG_ARGS@)</div><div class='add'>+{</div><div class='add'>+	STACK_WIND (frame, default_@NAME@_cbk,</div><div class='add'>+		    FIRST_CHILD(this), FIRST_CHILD(this)-&gt;fops-&gt;@NAME@,</div><div class='add'>+		    @SHORT_ARGS@);</div><div class='add'>+	return 0;</div><div class='add'>+}</div><div class='add'>+"""</div><div class='add'>+</div><div class='add'>+FOP_TEMPLATE = """</div><div class='add'>+int32_t</div><div class='add'>+default_@NAME@ (</div><div class='add'>+	call_frame_t *frame,</div><div class='add'>+	xlator_t *this,</div><div class='add'>+	@LONG_ARGS@)</div><div class='add'>+{</div><div class='add'>+	STACK_WIND_TAIL (frame,</div><div class='add'>+			 FIRST_CHILD(this), FIRST_CHILD(this)-&gt;fops-&gt;@NAME@,</div><div class='add'>+			 @SHORT_ARGS@);</div><div class='add'>+	return 0;</div><div class='add'>+}</div><div class='add'>+"""</div><div class='add'>+</div><div class='add'>+def gen_defaults ():</div><div class='add'>+	for name in list(ops.keys()):</div><div class='add'>+		print(generate(FAILURE_CBK_TEMPLATE, name, cbk_subs))</div><div class='add'>+	for name in list(ops.keys()):</div><div class='add'>+		print(generate(CBK_RESUME_TEMPLATE, name, cbk_subs))</div><div class='add'>+	for name in list(ops.keys()):</div><div class='add'>+		print(generate(CBK_TEMPLATE, name, cbk_subs))</div><div class='add'>+	for name in list(ops.keys()):</div><div class='add'>+		print(generate(RESUME_TEMPLATE, name, fop_subs))</div><div class='add'>+	for name in list(ops.keys()):</div><div class='add'>+		print(generate(FOP_TEMPLATE, name, fop_subs))</div><div class='add'>+</div><div class='add'>+for l in open(sys.argv[1], 'r').readlines():</div><div class='add'>+	if l.find('#pragma generate') != -1:</div><div class='add'>+		print("/* BEGIN GENERATED CODE - DO NOT MODIFY */")</div><div class='add'>+		gen_defaults()</div><div class='add'>+		print("/* END GENERATED CODE */")</div><div class='add'>+	else:</div><div class='add'>+		print(l[:-1])</div><div class='head'>diff --git a/libglusterfs/src/generator.py b/libglusterfs/src/generator.py<br/>new file mode 100755<br/>index 00000000000..5b7aa4764a0<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/libglusterfs/src/generator.py?id=d1d7a6f35c816822fab51c820e25023863c239c1'>libglusterfs/src/generator.py</a></div><div class='hunk'>@@ -0,0 +1,777 @@</div><div class='add'>+#!/usr/bin/python3</div><div class='add'>+</div><div class='add'>+import string</div><div class='add'>+</div><div class='add'>+# ops format: 'fop-arg' name type stub-field [nosync]</div><div class='add'>+#             'cbk-arg' name type</div><div class='add'>+#             'extra'   name type arg-str</div><div class='add'>+#             'journal' fop-type</div><div class='add'>+#             'link'    inode iatt</div><div class='add'>+#</div><div class='add'>+# 'role' indicates the significance of this line to the code generator (sort of</div><div class='add'>+# our own type).</div><div class='add'>+#</div><div class='add'>+# For fop-arg, we first need to know the name and the type of the arg so that</div><div class='add'>+# we can generate SHORT_ARGS (for function calls) and LONG_ARGS (for</div><div class='add'>+# declarations).  For code that uses stubs, we also need to know the name of</div><div class='add'>+# the stub field, which might be different than the argument itself.  Lastly,</div><div class='add'>+# for code that uses syncops, we need to know whether whoever wrote the syncop</div><div class='add'>+# for this fop "forgot" to include this argument.  (Editorial: this kind of</div><div class='add'>+# creeping inconsistency is why we should have used code generation for stubs</div><div class='add'>+# and syncops as well as defaults all along.)  To address this need, we use the</div><div class='add'>+# optional 'nosync' field for arguments (e.g. mkdir.umask) that we should skip</div><div class='add'>+# in generated syncop code.</div><div class='add'>+#</div><div class='add'>+# 'cbk-arg' is like fop-arg but simpler and used for generating callbacks</div><div class='add'>+# instead of fop functions.</div><div class='add'>+#</div><div class='add'>+# 'extra' is also like fop-arg, but it's another hack for syncops.  This time</div><div class='add'>+# the problem is that some of what would normally be *callback* arguments are</div><div class='add'>+# instead created in the caller and passed to the syncop.  We handle that by</div><div class='add'>+# adding an entry at the appropriate place in the fop-arg list, with the name</div><div class='add'>+# and type to generate a declaration and an argument string to generate the</div><div class='add'>+# actual syncop call.</div><div class='add'>+#</div><div class='add'>+# The mere presence of a 'journal' item is sufficient for most of the journal</div><div class='add'>+# code to recognize that it should do something.  However, reconciliation also</div><div class='add'>+# needs to decide how reconciliation builds the arguments it needs to call down</div><div class='add'>+# to the syncop layer, based on what's in the journal.  To do that, we divide</div><div class='add'>+# ops into three types and store those types in the ops table.  In general,</div><div class='add'>+# these three types work as follows.</div><div class='add'>+#</div><div class='add'>+#    For an fd-op, the GFID in the journal is used (in loc.gfid) field to</div><div class='add'>+#    look up an inode, then an anonymous fd is found/created for that inode.</div><div class='add'>+#</div><div class='add'>+#    For an inode-op, the GFID in the journal is used the same way, but no fd</div><div class='add'>+#    is needed.</div><div class='add'>+#</div><div class='add'>+#    For an entry-op, the *parent* GFID and name from the journal are used to</div><div class='add'>+#    look up an inode (via loc.pargfid and par.name respectively).</div><div class='add'>+#</div><div class='add'>+# The only places this seems to fall down is for link and create.  In link,</div><div class='add'>+# which is generally an entry-op, the source is looked up as though it's an</div><div class='add'>+# inode-op.  In create, we have an fd argument but it's really a return</div><div class='add'>+# argument so we get a fresh inode instead of looking one up.  Those two cases</div><div class='add'>+# need to be handled as special cases in the reconciliation code.</div><div class='add'>+#</div><div class='add'>+# 'link' is (hopefully) the last of the journal/syncop hacks.  Much like</div><div class='add'>+# 'extra', some values that are returned as callback arguments in the normal</div><div class='add'>+# case are handled differently for syncops.  For syncops that create objects</div><div class='add'>+# (e.g. mkdir) we need to link those objects into our inode table.  The 'inode'</div><div class='add'>+# and 'iatt' fields here give us the information we need to construct the</div><div class='add'>+# proper inode_link call(s).</div><div class='add'>+</div><div class='add'>+ops = {}</div><div class='add'>+xlator_cbks = {}</div><div class='add'>+xlator_dumpops = {}</div><div class='add'>+</div><div class='add'>+ops['fgetxattr'] = (</div><div class='add'>+	('fop-arg', 'fd',			'fd_t *'),</div><div class='add'>+	('fop-arg',	'name',			'const char *'),</div><div class='add'>+	('fop-arg',	'xdata',		'dict_t *'),</div><div class='add'>+	('cbk-arg',	'dict',			'dict_t *'),</div><div class='add'>+	('cbk-arg',	'xdata',		'dict_t *'),</div><div class='add'>+)</div><div class='add'>+</div><div class='add'>+ops['fsetxattr'] = (</div><div class='add'>+	('fop-arg',	'fd',			'fd_t *',			'fd'),</div><div class='add'>+	('fop-arg',	'dict',			'dict_t *',			'xattr'),</div><div class='add'>+	('fop-arg',	'flags',		'int32_t',			'flags'),</div><div class='add'>+	('fop-arg',	'xdata',		'dict_t *',			'xdata'),</div><div class='add'>+	('cbk-arg',	'xdata',		'dict_t *'),</div><div class='add'>+	('journal',	'fd-op'),</div><div class='add'>+)</div><div class='add'>+</div><div class='add'>+ops['setxattr'] = (</div><div class='add'>+	('fop-arg',	'loc',			'loc_t *',			'loc'),</div><div class='add'>+	('fop-arg',	'dict',			'dict_t *',			'xattr'),</div><div class='add'>+	('fop-arg',	'flags',		'int32_t',			'flags'),</div><div class='add'>+	('fop-arg',	'xdata',		'dict_t *',			'xdata'),</div><div class='add'>+	('cbk-arg',	'xdata',		'dict_t *'),</div><div class='add'>+	('journal',	'inode-op'),</div><div class='add'>+)</div><div class='add'>+</div><div class='add'>+ops['statfs'] = (</div><div class='add'>+	('fop-arg',	'loc',			'loc_t *'),</div><div class='add'>+	('fop-arg',	'xdata',		'dict_t *'),</div><div class='add'>+	('cbk-arg',	'buf',			'struct statvfs *'),</div><div class='add'>+	('cbk-arg',	'xdata',		'dict_t *'),</div><div class='add'>+)</div><div class='add'>+</div><div class='add'>+ops['fsyncdir'] = (</div><div class='add'>+	('fop-arg',	'fd',			'fd_t *'),</div><div class='add'>+	('fop-arg',	'flags',		'int32_t'),</div><div class='add'>+	('fop-arg',	'xdata',		'dict_t *'),</div><div class='add'>+	('cbk-arg',	'xdata',		'dict_t *'),</div><div class='add'>+)</div><div class='add'>+</div><div class='add'>+ops['opendir'] = (</div><div class='add'>+	('fop-arg',	'loc',			'loc_t *'),</div><div class='add'>+	('fop-arg',	'fd',			'fd_t *'),</div><div class='add'>+	('fop-arg',	'xdata',		'dict_t *'),</div><div class='add'>+	('cbk-arg',	'fd',			'fd_t *'),</div><div class='add'>+	('cbk-arg',	'xdata',		'dict_t *'),</div><div class='add'>+)</div><div class='add'>+</div><div class='add'>+ops['fstat'] = (</div><div class='add'>+	('fop-arg',	'fd',			'fd_t *'),</div><div class='add'>+	('fop-arg',	'xdata',		'dict_t *'),</div><div class='add'>+	('cbk-arg',	'buf',			'struct iatt *'),</div><div class='add'>+	('cbk-arg',	'xdata',		'dict_t *'),</div><div class='add'>+)</div><div class='add'>+</div><div class='add'>+ops['fsync'] = (</div><div class='add'>+	('fop-arg',	'fd',			'fd_t *'),</div><div class='add'>+	('fop-arg',	'flags',		'int32_t'),</div><div class='add'>+	('extra',	'preop',		'struct iatt',		'&amp;preop'),</div><div class='add'>+	('extra',	'postop',		'struct iatt',		'&amp;postop'),</div><div class='add'>+	('fop-arg',	'xdata',		'dict_t *'),</div><div class='add'>+	('cbk-arg',	'prebuf',		'struct iatt *'),</div><div class='add'>+	('cbk-arg',	'postbuf',		'struct iatt *'),</div><div class='add'>+	('cbk-arg',	'xdata',		'dict_t *'),</div><div class='add'>+)</div><div class='add'>+</div><div class='add'>+ops['flush'] = (</div><div class='add'>+	('fop-arg',	'fd',			'fd_t *'),</div><div class='add'>+	('fop-arg',	'xdata',		'dict_t *'),</div><div class='add'>+	('cbk-arg',	'xdata',		'dict_t *'),</div><div class='add'>+)</div><div class='add'>+</div><div class='add'>+ops['writev'] = (</div><div class='add'>+	('fop-arg',	'fd',			'fd_t *',			'fd'),</div><div class='add'>+	('fop-arg',	'vector',		'struct iovec *',	'vector'),</div><div class='add'>+	('fop-arg',	'count',		'int32_t'),</div><div class='add'>+	('fop-arg',	'off',			'off_t',			'offset'),</div><div class='add'>+	('fop-arg',	'flags',		'uint32_t',			'flags'),</div><div class='add'>+	('fop-arg',	'iobref',		'struct iobref *'),</div><div class='add'>+	('extra',	'preop',		'struct iatt',		'&amp;preop'),</div><div class='add'>+	('extra',	'postop',		'struct iatt',		'&amp;postop'),</div><div class='add'>+	('fop-arg',	'xdata',		'dict_t *',			'xdata'),</div><div class='add'>+	('cbk-arg',	'prebuf',		'struct iatt *'),</div><div class='add'>+	('cbk-arg',	'postbuf',		'struct iatt *'),</div><div class='add'>+	('cbk-arg',	'xdata',		'dict_t *'),</div><div class='add'>+	('journal',	'fd-op'),</div><div class='add'>+)</div><div class='add'>+</div><div class='add'>+ops['readv'] = (</div><div class='add'>+	('fop-arg',	'fd',			'fd_t *'),</div><div class='add'>+	('fop-arg',	'size',			'size_t'),</div><div class='add'>+	('fop-arg',	'offset',		'off_t'),</div><div class='add'>+	('fop-arg',	'flags',		'uint32_t'),</div><div class='add'>+	('extra',	'iatt',			'struct iatt',		'&amp;iatt'),</div><div class='add'>+	('fop-arg',	'xdata',		'dict_t *'),</div><div class='add'>+	('cbk-arg',	'vector',		'struct iovec *'),</div><div class='add'>+	('cbk-arg',	'count',		'int32_t'),</div><div class='add'>+	('cbk-arg',	'stbuf',		'struct iatt *'),</div><div class='add'>+	('cbk-arg',	'iobref',		'struct iobref *'),</div><div class='add'>+	('cbk-arg',	'xdata',		'dict_t *'),</div><div class='add'>+)</div><div class='add'>+</div><div class='add'>+ops['open'] = (</div><div class='add'>+	('fop-arg',	'loc',			'loc_t *'),</div><div class='add'>+	('fop-arg',	'flags',		'int32_t'),</div><div class='add'>+	('fop-arg',	'fd',			'fd_t *'),</div><div class='add'>+	('fop-arg',	'xdata',		'dict_t *'),</div><div class='add'>+	('cbk-arg',	'fd',			'fd_t *'),</div><div class='add'>+	('cbk-arg',	'xdata',		'dict_t *'),</div><div class='add'>+)</div><div class='add'>+</div><div class='add'>+ops['create'] = (</div><div class='add'>+	('fop-arg',	'loc',			'loc_t *',			'loc'),</div><div class='add'>+	('fop-arg',	'flags',		'int32_t',			'flags'),</div><div class='add'>+	('fop-arg',	'mode',			'mode_t',			'mode'),</div><div class='add'>+	('fop-arg',	'umask',		'mode_t',			'umask',	'nosync'),</div><div class='add'>+	('fop-arg',	'fd',			'fd_t *',			'fd'),</div><div class='add'>+	('extra',	'iatt',			'struct iatt',		'&amp;iatt'),</div><div class='add'>+	('fop-arg',	'xdata',		'dict_t *',			'xdata'),</div><div class='add'>+	('cbk-arg',	'fd',			'fd_t *'),</div><div class='add'>+	('cbk-arg',	'inode',		'inode_t *'),</div><div class='add'>+	('cbk-arg',	'buf',			'struct iatt *'),</div><div class='add'>+	('cbk-arg',	'preparent',	'struct iatt *'),</div><div class='add'>+	('cbk-arg',	'postparent',	'struct iatt *'),</div><div class='add'>+	('cbk-arg',	'xdata',		'dict_t *'),</div><div class='add'>+	('journal',	'entry-op'),</div><div class='add'>+	('link',	'loc.inode',	'&amp;iatt'),</div><div class='add'>+)</div><div class='add'>+</div><div class='add'>+ops['link'] = (</div><div class='add'>+	('fop-arg',	'oldloc',		'loc_t *',			'loc'),</div><div class='add'>+	('fop-arg',	'newloc',		'loc_t *',			'loc2'),</div><div class='add'>+	('extra',	'iatt',			'struct iatt',		'&amp;iatt'),</div><div class='add'>+	('fop-arg',	'xdata',		'dict_t *',			'xdata'),</div><div class='add'>+	('cbk-arg',	'inode',		'inode_t *'),</div><div class='add'>+	('cbk-arg',	'buf',			'struct iatt *'),</div><div class='add'>+	('cbk-arg',	'preparent',	'struct iatt *'),</div><div class='add'>+	('cbk-arg',	'postparent',	'struct iatt *'),</div><div class='add'>+	('cbk-arg',	'xdata',		'dict_t *'),</div><div class='add'>+	('journal',	'entry-op'),</div><div class='add'>+)</div><div class='add'>+</div><div class='add'>+ops['rename'] = (</div><div class='add'>+	('fop-arg',	'oldloc',		'loc_t *',			'loc'),</div><div class='add'>+	('fop-arg',	'newloc',		'loc_t *',			'loc2'),</div><div class='add'>+	('fop-arg',	'xdata',		'dict_t *',			'xdata'),</div><div class='add'>+	('cbk-arg',	'buf',			'struct iatt *'),</div><div class='add'>+	('cbk-arg',	'preoldparent',	'struct iatt *'),</div><div class='add'>+	('cbk-arg',	'postoldparent', 'struct iatt *'),</div><div class='add'>+	('cbk-arg',	'prenewparent',	'struct iatt *'),</div><div class='add'>+	('cbk-arg',	'postnewparent', 'struct iatt *'),</div><div class='add'>+	('cbk-arg',	'xdata',		'dict_t *'),</div><div class='add'>+	('journal',	'entry-op'),</div><div class='add'>+)</div><div class='add'>+</div><div class='add'>+ops['symlink'] = (</div><div class='add'>+	('fop-arg',	'linkpath',		'const char *',		'linkname'),</div><div class='add'>+	('fop-arg',	'loc',			'loc_t *',			'loc'),</div><div class='add'>+	('fop-arg',	'umask',		'mode_t',			'mode',		'nosync'),</div><div class='add'>+	('extra',	'iatt',			'struct iatt',		'&amp;iatt'),</div><div class='add'>+	('fop-arg',	'xdata',		'dict_t *',			'xdata'),</div><div class='add'>+	('cbk-arg',	'inode',		'inode_t *'),</div><div class='add'>+	('cbk-arg',	'buf',			'struct iatt *'),</div><div class='add'>+	('cbk-arg',	'preparent',	'struct iatt *'),</div><div class='add'>+	('cbk-arg',	'postparent',	'struct iatt *'),</div><div class='add'>+	('cbk-arg',	'xdata',		'dict_t *'),</div><div class='add'>+	('journal',	'entry-op'),</div><div class='add'>+)</div><div class='add'>+</div><div class='add'>+ops['rmdir'] = (</div><div class='add'>+	('fop-arg',	'loc',			'loc_t *',			'loc'),</div><div class='add'>+	('fop-arg',	'flags',		'int32_t',			'flags'),</div><div class='add'>+	('fop-arg',	'xdata',		'dict_t *',			'xdata'),</div><div class='add'>+	('cbk-arg',	'preparent',	'struct iatt *'),</div><div class='add'>+	('cbk-arg',	'postparent',	'struct iatt *'),</div><div class='add'>+	('cbk-arg',	'xdata',		'dict_t *'),</div><div class='add'>+	('journal',	'entry-op'),</div><div class='add'>+)</div><div class='add'>+</div><div class='add'>+ops['unlink'] = (</div><div class='add'>+	('fop-arg',	'loc',			'loc_t *',			'loc'),</div><div class='add'>+	('fop-arg',	'flags',		'int32_t',			'flags',	'nosync'),</div><div class='add'>+	('fop-arg',	'xdata',		'dict_t *',			'xdata'),</div><div class='add'>+	('cbk-arg',	'preparent',	'struct iatt *'),</div><div class='add'>+	('cbk-arg',	'postparent',	'struct iatt *'),</div><div class='add'>+	('cbk-arg',	'xdata',		'dict_t *'),</div><div class='add'>+	('journal',	'entry-op'),</div><div class='add'>+)</div><div class='add'>+</div><div class='add'>+ops['mkdir'] = (</div><div class='add'>+	('fop-arg',	'loc',			'loc_t *',			'loc'),</div><div class='add'>+	('fop-arg',	'mode',			'mode_t',			'mode'),</div><div class='add'>+	('fop-arg',	'umask',		'mode_t',			'umask',	'nosync'),</div><div class='add'>+	('extra',	'iatt',			'struct iatt',		'&amp;iatt'),</div><div class='add'>+	('fop-arg',	'xdata',		'dict_t *',			'xdata'),</div><div class='add'>+	('cbk-arg',	'inode',		'inode_t *'),</div><div class='add'>+	('cbk-arg',	'buf',			'struct iatt *'),</div><div class='add'>+	('cbk-arg',	'preparent',	'struct iatt *'),</div><div class='add'>+	('cbk-arg',	'postparent',	'struct iatt *'),</div><div class='add'>+	('cbk-arg',	'xdata',		'dict_t *'),</div><div class='add'>+	('journal',	'entry-op'),</div><div class='add'>+	('link',	'loc.inode',	'&amp;iatt'),</div><div class='add'>+)</div><div class='add'>+</div><div class='add'>+ops['mknod'] = (</div><div class='add'>+	('fop-arg',	'loc',			'loc_t *',			'loc'),</div><div class='add'>+	('fop-arg',	'mode',			'mode_t',			'mode'),</div><div class='add'>+	('fop-arg',	'rdev',			'dev_t',			'rdev'),</div><div class='add'>+	('fop-arg',	'umask',		'mode_t',			'umask',	'nosync'),</div><div class='add'>+	('extra',	'iatt',			'struct iatt',		'&amp;iatt'),</div><div class='add'>+	('fop-arg',	'xdata',		'dict_t *',			'xdata'),</div><div class='add'>+	('cbk-arg',	'inode',		'inode_t *'),</div><div class='add'>+	('cbk-arg',	'buf',			'struct iatt *'),</div><div class='add'>+	('cbk-arg',	'preparent',	'struct iatt *'),</div><div class='add'>+	('cbk-arg',	'postparent',	'struct iatt *'),</div><div class='add'>+	('cbk-arg',	'xdata',		'dict_t *'),</div><div class='add'>+	('journal',	'entry-op'),</div><div class='add'>+)</div><div class='add'>+</div><div class='add'>+ops['readlink'] = (</div><div class='add'>+	('fop-arg',	'loc',			'loc_t *'),</div><div class='add'>+	('fop-arg',	'size',			'size_t'),</div><div class='add'>+	('fop-arg',	'xdata',		'dict_t *'),</div><div class='add'>+	('cbk-arg',	'path',			'const char *'),</div><div class='add'>+	('cbk-arg',	'buf',			'struct iatt *'),</div><div class='add'>+	('cbk-arg',	'xdata',		'dict_t *'),</div><div class='add'>+)</div><div class='add'>+</div><div class='add'>+ops['access'] = (</div><div class='add'>+	('fop-arg',	'loc',			'loc_t *'),</div><div class='add'>+	('fop-arg',	'mask',			'int32_t'),</div><div class='add'>+	('fop-arg',	'xdata',		'dict_t *'),</div><div class='add'>+	('cbk-arg',	'xdata',		'dict_t *'),</div><div class='add'>+)</div><div class='add'>+</div><div class='add'>+ops['ftruncate'] = (</div><div class='add'>+	('fop-arg',	'fd',			'fd_t *',				'fd'),</div><div class='add'>+	('fop-arg',	'offset',		'off_t',				'offset'),</div><div class='add'>+	('extra',	'preop',		'struct iatt',		'&amp;preop'),</div><div class='add'>+	('extra',	'postop',		'struct iatt',		'&amp;postop'),</div><div class='add'>+	('fop-arg',	'xdata',		'dict_t *',				'xdata'),</div><div class='add'>+	('cbk-arg',	'prebuf',		'struct iatt *'),</div><div class='add'>+	('cbk-arg',	'postbuf',		'struct iatt *'),</div><div class='add'>+	('cbk-arg',	'xdata',		'dict_t *'),</div><div class='add'>+	('journal',	'fd-op'),</div><div class='add'>+)</div><div class='add'>+</div><div class='add'>+ops['getxattr'] = (</div><div class='add'>+	('fop-arg',	'loc',			'loc_t *'),</div><div class='add'>+	('fop-arg',	'name',			'const char *'),</div><div class='add'>+	('fop-arg',	'xdata',		'dict_t *'),</div><div class='add'>+	('cbk-arg',	'dict',			'dict_t *'),</div><div class='add'>+	('cbk-arg',	'xdata',		'dict_t *'),</div><div class='add'>+)</div><div class='add'>+</div><div class='add'>+ops['xattrop'] = (</div><div class='add'>+	('fop-arg',	'loc',			'loc_t *',				'loc'),</div><div class='add'>+	('fop-arg',	'flags',		'gf_xattrop_flags_t',	'optype'),</div><div class='add'>+	('fop-arg',	'dict',			'dict_t *',				'xattr'),</div><div class='add'>+	('fop-arg',	'xdata',		'dict_t *',				'xdata'),</div><div class='add'>+	('cbk-arg',	'dict',			'dict_t *'),</div><div class='add'>+	('cbk-arg',	'xdata',		'dict_t *'),</div><div class='add'>+	('journal',	'inode-op'),</div><div class='add'>+)</div><div class='add'>+</div><div class='add'>+ops['fxattrop'] = (</div><div class='add'>+	('fop-arg',	'fd',			'fd_t *',				'fd'),</div><div class='add'>+	('fop-arg',	'flags',		'gf_xattrop_flags_t',	'optype'),</div><div class='add'>+	('fop-arg',	'dict',			'dict_t *',				'xattr'),</div><div class='add'>+	('fop-arg',	'xdata',		'dict_t *',				'xdata'),</div><div class='add'>+	('cbk-arg',	'dict',			'dict_t *'),</div><div class='add'>+	('cbk-arg',	'xdata',		'dict_t *'),</div><div class='add'>+	('journal',	'fd-op'),</div><div class='add'>+)</div><div class='add'>+</div><div class='add'>+ops['removexattr'] = (</div><div class='add'>+	('fop-arg',	'loc',			'loc_t *',			'loc'),</div><div class='add'>+	('fop-arg',	'name',			'const char *',		'name'),</div><div class='add'>+	('fop-arg',	'xdata',		'dict_t *',			'xdata'),</div><div class='add'>+	('cbk-arg',	'xdata',		'dict_t *'),</div><div class='add'>+	('journal',	'inode-op'),</div><div class='add'>+)</div><div class='add'>+</div><div class='add'>+ops['fremovexattr'] = (</div><div class='add'>+	('fop-arg',	'fd',			'fd_t *',			'fd'),</div><div class='add'>+	('fop-arg',	'name',			'const char *',		'name'),</div><div class='add'>+	('fop-arg',	'xdata',		'dict_t *',			'xdata'),</div><div class='add'>+	('cbk-arg',	'xdata',		'dict_t *'),</div><div class='add'>+	('journal',	'fd-op'),</div><div class='add'>+)</div><div class='add'>+</div><div class='add'>+ops['lk'] = (</div><div class='add'>+	('fop-arg',	'fd',			'fd_t *'),</div><div class='add'>+	('fop-arg',	'cmd',			'int32_t'),</div><div class='add'>+	('fop-arg',	'lock',			'struct gf_flock *'),</div><div class='add'>+	('fop-arg',	'xdata',		'dict_t *'),</div><div class='add'>+	('cbk-arg',	'lock',			'struct gf_flock *'),</div><div class='add'>+	('cbk-arg',	'xdata',		'dict_t *'),</div><div class='add'>+)</div><div class='add'>+</div><div class='add'>+ops['inodelk'] = (</div><div class='add'>+	('fop-arg',	'volume',		'const char *'),</div><div class='add'>+	('fop-arg',	'loc',			'loc_t *'),</div><div class='add'>+	('fop-arg',	'cmd',			'int32_t'),</div><div class='add'>+	('fop-arg',	'lock',			'struct gf_flock *'),</div><div class='add'>+	('fop-arg',	'xdata',		'dict_t *'),</div><div class='add'>+	('cbk-arg',	'xdata',		'dict_t *'),</div><div class='add'>+)</div><div class='add'>+</div><div class='add'>+ops['finodelk'] = (</div><div class='add'>+	('fop-arg',	'volume',		'const char *'),</div><div class='add'>+	('fop-arg',	'fd',			'fd_t *'),</div><div class='add'>+	('fop-arg',	'cmd',			'int32_t'),</div><div class='add'>+	('fop-arg',	'lock',			'struct gf_flock *'),</div><div class='add'>+	('fop-arg',	'xdata',		'dict_t *'),</div><div class='add'>+	('cbk-arg',	'xdata',		'dict_t *'),</div><div class='add'>+)</div><div class='add'>+</div><div class='add'>+ops['entrylk'] = (</div><div class='add'>+	('fop-arg',	'volume',		'const char *'),</div><div class='add'>+	('fop-arg',	'loc',			'loc_t *'),</div><div class='add'>+	('fop-arg',	'basename',		'const char *'),</div><div class='add'>+	('fop-arg',	'cmd',			'entrylk_cmd'),</div><div class='add'>+	('fop-arg',	'type',			'entrylk_type'),</div><div class='add'>+	('fop-arg',	'xdata',		'dict_t *'),</div><div class='add'>+	('cbk-arg',	'xdata',		'dict_t *'),</div><div class='add'>+)</div><div class='add'>+</div><div class='add'>+ops['fentrylk'] = (</div><div class='add'>+	('fop-arg',	'volume',		'const char *'),</div><div class='add'>+	('fop-arg',	'fd',			'fd_t *'),</div><div class='add'>+	('fop-arg',	'basename',		'const char *'),</div><div class='add'>+	('fop-arg',	'cmd',			'entrylk_cmd'),</div><div class='add'>+	('fop-arg',	'type',			'entrylk_type'),</div><div class='add'>+	('fop-arg',	'xdata',		'dict_t *'),</div><div class='add'>+	('cbk-arg',	'xdata',		'dict_t *'),</div><div class='add'>+)</div><div class='add'>+</div><div class='add'>+ops['rchecksum'] = (</div><div class='add'>+	('fop-arg',	'fd',			'fd_t *'),</div><div class='add'>+	('fop-arg',	'offset',		'off_t'),</div><div class='add'>+	('fop-arg',	'len',			'int32_t'),</div><div class='add'>+	('fop-arg',	'xdata',		'dict_t *'),</div><div class='add'>+	('cbk-arg',	'weak_cksum',	'uint32_t'),</div><div class='add'>+	('cbk-arg',	'strong_cksum',	'uint8_t *'),</div><div class='add'>+	('cbk-arg',	'xdata',		'dict_t *'),</div><div class='add'>+)</div><div class='add'>+</div><div class='add'>+ops['readdir'] = (</div><div class='add'>+	('fop-arg',	'fd',			'fd_t *'),</div><div class='add'>+	('fop-arg',	'size',			'size_t'),</div><div class='add'>+	('fop-arg',	'off',			'off_t'),</div><div class='add'>+	('fop-arg',	'xdata',		'dict_t *'),</div><div class='add'>+	('cbk-arg',	'entries',		'gf_dirent_t *'),</div><div class='add'>+	('cbk-arg',	'xdata',		'dict_t *'),</div><div class='add'>+)</div><div class='add'>+</div><div class='add'>+ops['readdirp'] = (</div><div class='add'>+	('fop-arg',	'fd',			'fd_t *'),</div><div class='add'>+	('fop-arg',	'size',			'size_t'),</div><div class='add'>+	('fop-arg',	'off',			'off_t'),</div><div class='add'>+	('fop-arg',	'xdata',		'dict_t *'),</div><div class='add'>+	('cbk-arg',	'entries',		'gf_dirent_t *'),</div><div class='add'>+	('cbk-arg',	'xdata',		'dict_t *'),</div><div class='add'>+)</div><div class='add'>+</div><div class='add'>+ops['setattr'] = (</div><div class='add'>+	('fop-arg',	'loc',			'loc_t *',			'loc'),</div><div class='add'>+	('fop-arg',	'stbuf',		'struct iatt *',	'stat'),</div><div class='add'>+	('fop-arg',	'valid',		'int32_t',			'valid'),</div><div class='add'>+	('extra',	'preop',		'struct iatt',		'&amp;preop'),</div><div class='add'>+	('extra',	'postop',		'struct iatt',		'&amp;postop'),</div><div class='add'>+	('fop-arg',	'xdata',		'dict_t *',			'xdata'),</div><div class='add'>+	('cbk-arg',	'statpre',		'struct iatt *'),</div><div class='add'>+	('cbk-arg',	'statpost',		'struct iatt *'),</div><div class='add'>+	('cbk-arg',	'xdata',		'dict_t *'),</div><div class='add'>+	('journal',	'inode-op'),</div><div class='add'>+)</div><div class='add'>+</div><div class='add'>+ops['truncate'] = (</div><div class='add'>+	('fop-arg',	'loc',			'loc_t *',			'loc'),</div><div class='add'>+	('fop-arg',	'offset',		'off_t',			'offset'),</div><div class='add'>+	('fop-arg',	'xdata',		'dict_t *',			'xdata'),</div><div class='add'>+	('cbk-arg',	'prebuf',		'struct iatt *'),</div><div class='add'>+	('cbk-arg',	'postbuf',		'struct iatt *'),</div><div class='add'>+	('cbk-arg',	'xdata',		'dict_t *'),</div><div class='add'>+	('journal',	'inode-op'),</div><div class='add'>+)</div><div class='add'>+</div><div class='add'>+ops['stat'] = (</div><div class='add'>+	('fop-arg',	'loc',			'loc_t *'),</div><div class='add'>+	('fop-arg',	'xdata',		'dict_t *'),</div><div class='add'>+	('cbk-arg',	'buf',			'struct iatt *'),</div><div class='add'>+	('cbk-arg',	'xdata',		'dict_t *'),</div><div class='add'>+)</div><div class='add'>+</div><div class='add'>+ops['lookup'] = (</div><div class='add'>+	('fop-arg',	'loc',			'loc_t *'),</div><div class='add'>+	('fop-arg',	'xdata',		'dict_t *'),</div><div class='add'>+	('cbk-arg',	'inode',		'inode_t *'),</div><div class='add'>+	('cbk-arg',	'buf',			'struct iatt *'),</div><div class='add'>+	('cbk-arg',	'xdata',		'dict_t *'),</div><div class='add'>+	# We could add xdata everywhere automatically if somebody hadn't put</div><div class='add'>+	# something after it here.</div><div class='add'>+	('cbk-arg',	'postparent',	'struct iatt *'),</div><div class='add'>+)</div><div class='add'>+</div><div class='add'>+ops['fsetattr'] = (</div><div class='add'>+	('fop-arg',	'fd',			'fd_t *',			'fd'),</div><div class='add'>+	('fop-arg',	'stbuf',		'struct iatt *',	'stat'),</div><div class='add'>+	('fop-arg',	'valid',		'int32_t',			'valid'),</div><div class='add'>+	('extra',	'preop',		'struct iatt',		'&amp;preop'),</div><div class='add'>+	('extra',	'postop',		'struct iatt',		'&amp;postop'),</div><div class='add'>+	('fop-arg',	'xdata',		'dict_t *',			'xdata'),</div><div class='add'>+	('cbk-arg',	'statpre',		'struct iatt *'),</div><div class='add'>+	('cbk-arg',	'statpost',		'struct iatt *'),</div><div class='add'>+	('cbk-arg',	'xdata',		'dict_t *'),</div><div class='add'>+	('journal',	'fd-op'),</div><div class='add'>+)</div><div class='add'>+</div><div class='add'>+ops['fallocate'] = (</div><div class='add'>+	('fop-arg',	'fd',			'fd_t *',			'fd'),</div><div class='add'>+	('fop-arg',	'keep_size',	'int32_t',			'mode'),</div><div class='add'>+	('fop-arg',	'offset',		'off_t',			'offset'),</div><div class='add'>+	('fop-arg',	'len',			'size_t',			'size'),</div><div class='add'>+	('fop-arg',	'xdata',		'dict_t *',			'xdata'),</div><div class='add'>+	('cbk-arg',	'pre',			'struct iatt *'),</div><div class='add'>+	('cbk-arg',	'post',			'struct iatt *'),</div><div class='add'>+	('cbk-arg',	'xdata',		'dict_t *'),</div><div class='add'>+	('journal',	'fd-op'),</div><div class='add'>+)</div><div class='add'>+</div><div class='add'>+ops['discard'] = (</div><div class='add'>+	('fop-arg',	'fd',			'fd_t *',			'fd'),</div><div class='add'>+	('fop-arg',	'offset',		'off_t',			'offset'),</div><div class='add'>+	('fop-arg',	'len',			'size_t',			'size'),</div><div class='add'>+	('fop-arg',	'xdata',		'dict_t *',			'xdata'),</div><div class='add'>+	('cbk-arg',	'pre',			'struct iatt *'),</div><div class='add'>+	('cbk-arg',	'post',			'struct iatt *'),</div><div class='add'>+	('cbk-arg',	'xdata',		'dict_t *'),</div><div class='add'>+	('journal',	'fd-op'),</div><div class='add'>+)</div><div class='add'>+</div><div class='add'>+ops['zerofill'] = (</div><div class='add'>+	('fop-arg',	'fd',			'fd_t *',			'fd'),</div><div class='add'>+	('fop-arg',	'offset',		'off_t',			'offset'),</div><div class='add'>+	# As e.g. fallocate/discard (above) "len" should really be a size_t.</div><div class='add'>+	('fop-arg',	'len',			'off_t',			'size'),</div><div class='add'>+	('fop-arg',	'xdata',		'dict_t *',			'xdata'),</div><div class='add'>+	('cbk-arg',	'pre',			'struct iatt *'),</div><div class='add'>+	('cbk-arg',	'post',			'struct iatt *'),</div><div class='add'>+	('cbk-arg',	'xdata',		'dict_t *'),</div><div class='add'>+	('journal',	'fd-op'),</div><div class='add'>+)</div><div class='add'>+</div><div class='add'>+ops['ipc'] = (</div><div class='add'>+	('fop-arg',	'op',			'int32_t'),</div><div class='add'>+	('fop-arg',	'xdata',		'dict_t *',			'xdata'),</div><div class='add'>+	('cbk-arg',	'xdata',		'dict_t *'),</div><div class='add'>+	('journal',	'fd-op'),</div><div class='add'>+)</div><div class='add'>+</div><div class='add'>+ops['seek'] = (</div><div class='add'>+	('fop-arg',	'fd',			'fd_t *'),</div><div class='add'>+	('fop-arg',	'offset',		'off_t'),</div><div class='add'>+	('fop-arg',	'what',			'gf_seek_what_t'),</div><div class='add'>+	('fop-arg',	'xdata',		'dict_t *'),</div><div class='add'>+	('cbk-arg',	'offset',		'off_t'),</div><div class='add'>+	('cbk-arg',	'xdata',		'dict_t *'),</div><div class='add'>+)</div><div class='add'>+</div><div class='add'>+ops['getspec'] = (</div><div class='add'>+	('fop-arg',	'key',			'const char *'),</div><div class='add'>+	('fop-arg',	'flags',		'int32_t'),</div><div class='add'>+	('cbk-arg',	'spec_data',	'char *'),</div><div class='add'>+)</div><div class='add'>+</div><div class='add'>+ops['lease'] = (</div><div class='add'>+	('fop-arg',     'loc',                  'loc_t *'),</div><div class='add'>+	('fop-arg',     'lease',                'struct gf_lease *'),</div><div class='add'>+	('fop-arg',     'xdata',                'dict_t *'),</div><div class='add'>+	('cbk-arg',     'lease',                'struct gf_lease *'),</div><div class='add'>+	('cbk-arg',     'xdata',                'dict_t *'),</div><div class='add'>+)</div><div class='add'>+</div><div class='add'>+ops['getactivelk'] = (</div><div class='add'>+	('fop-arg',     'loc',                  'loc_t *'),</div><div class='add'>+	('fop-arg',     'xdata',                'dict_t *'),</div><div class='add'>+	('cbk-arg',     'locklist',             'lock_migration_info_t *'),</div><div class='add'>+	('cbk-arg',     'xdata',                'dict_t *'),</div><div class='add'>+)</div><div class='add'>+</div><div class='add'>+ops['setactivelk'] = (</div><div class='add'>+	('fop-arg',     'loc',                  'loc_t *'),</div><div class='add'>+	('fop-arg',     'locklist',             'lock_migration_info_t *'),</div><div class='add'>+	('fop-arg',     'xdata',                'dict_t *'),</div><div class='add'>+	('cbk-arg',     'xdata',                'dict_t *'),</div><div class='add'>+)</div><div class='add'>+</div><div class='add'>+ops['put'] = (</div><div class='add'>+	('fop-arg',     'loc',                  'loc_t *',                      'loc'),</div><div class='add'>+	('fop-arg',     'mode',                 'mode_t',                       'mode'),</div><div class='add'>+	('fop-arg',     'umask',                'mode_t',                       'umask'),</div><div class='add'>+	('fop-arg',     'flags',                'uint32_t',                     'flags'),</div><div class='add'>+	('fop-arg',     'vector',               'struct iovec *',               'vector'),</div><div class='add'>+	('fop-arg',     'count',                'int32_t'),</div><div class='add'>+	('fop-arg',     'off',                  'off_t',                        'offset'),</div><div class='add'>+	('fop-arg',     'iobref',               'struct iobref *'),</div><div class='add'>+	('fop-arg',     'dict',                 'dict_t *',                     'xattr'),</div><div class='add'>+	('fop-arg',     'xdata',                'dict_t *',                     'xdata'),</div><div class='add'>+	('cbk-arg',     'inode',                'inode_t *'),</div><div class='add'>+	('cbk-arg',     'buf',                  'struct iatt *'),</div><div class='add'>+	('cbk-arg',     'preparent',            'struct iatt *'),</div><div class='add'>+	('cbk-arg',     'postparent',           'struct iatt *'),</div><div class='add'>+	('cbk-arg',     'xdata',                'dict_t *'),</div><div class='add'>+)</div><div class='add'>+</div><div class='add'>+ops['icreate'] = (</div><div class='add'>+	('fop-arg',     'loc',                   'loc_t *'),</div><div class='add'>+	('fop-arg',     'mode',                  'mode_t'),</div><div class='add'>+	('fop-arg',     'xdata',                 'dict_t *'),</div><div class='add'>+	('cbk-arg',     'inode',                 'inode_t *'),</div><div class='add'>+	('cbk-arg',     'buf',                   'struct iatt *'),</div><div class='add'>+	('cbk-arg',     'xdata',                 'dict_t *'),</div><div class='add'>+)</div><div class='add'>+</div><div class='add'>+ops['namelink'] = (</div><div class='add'>+	('fop-arg',     'loc',                   'loc_t *'),</div><div class='add'>+	('fop-arg',     'xdata',                 'dict_t *'),</div><div class='add'>+	('cbk-arg',     'prebuf',                'struct iatt *'),</div><div class='add'>+	('cbk-arg',     'postbuf',               'struct iatt *'),</div><div class='add'>+	('cbk-arg',     'xdata',                 'dict_t *'),</div><div class='add'>+)</div><div class='add'>+</div><div class='add'>+ops['copy_file_range'] = (</div><div class='add'>+        ('fop-arg',     'fd_in',                 'fd_t *'),</div><div class='add'>+        ('fop-arg',     'off_in',                'off64_t '),</div><div class='add'>+        ('fop-arg',     'fd_out',                'fd_t *'),</div><div class='add'>+        ('fop-arg',     'off_out',               'off64_t '),</div><div class='add'>+        ('fop-arg',     'len',                   'size_t'),</div><div class='add'>+        ('fop-arg',     'flags',                 'uint32_t'),</div><div class='add'>+        ('fop-arg',     'xdata',                 'dict_t *'),</div><div class='add'>+        ('cbk-arg',     'stbuf',                 'struct iatt *'),</div><div class='add'>+        ('cbk-arg',     'prebuf_dst',            'struct iatt *'),</div><div class='add'>+        ('cbk-arg',     'postbuf_dst',           'struct iatt *'),</div><div class='add'>+        ('cbk-arg',     'xdata',                 'dict_t *'),</div><div class='add'>+)</div><div class='add'>+#####################################################################</div><div class='add'>+xlator_cbks['forget'] = (</div><div class='add'>+	('fn-arg',      'this',        'xlator_t *'),</div><div class='add'>+	('fn-arg',      'inode',       'inode_t *'),</div><div class='add'>+	('ret-val',     'int32_t',     '0'),</div><div class='add'>+)</div><div class='add'>+</div><div class='add'>+xlator_cbks['release'] = (</div><div class='add'>+	('fn-arg',      'this',        'xlator_t *'),</div><div class='add'>+	('fn-arg',      'fd',          'fd_t *'),</div><div class='add'>+	('ret-val',     'int32_t',     '0'),</div><div class='add'>+)</div><div class='add'>+</div><div class='add'>+xlator_cbks['releasedir'] = (</div><div class='add'>+	('fn-arg',      'this',        'xlator_t *'),</div><div class='add'>+	('fn-arg',      'fd',          'fd_t *'),</div><div class='add'>+	('ret-val',     'int32_t',     '0'),</div><div class='add'>+)</div><div class='add'>+</div><div class='add'>+xlator_cbks['invalidate'] = (</div><div class='add'>+	('fn-arg',      'this',        'xlator_t *'),</div><div class='add'>+	('fn-arg',      'inode',       'inode_t *'),</div><div class='add'>+	('ret-val',     'int32_t',     '0'),</div><div class='add'>+)</div><div class='add'>+</div><div class='add'>+xlator_cbks['client_destroy'] = (</div><div class='add'>+	('fn-arg',      'this',        'xlator_t *'),</div><div class='add'>+	('fn-arg',      'client',      'client_t *'),</div><div class='add'>+	('ret-val',     'int32_t',     '0'),</div><div class='add'>+)</div><div class='add'>+</div><div class='add'>+xlator_cbks['client_disconnect'] = (</div><div class='add'>+	('fn-arg',      'this',        'xlator_t *'),</div><div class='add'>+	('fn-arg',      'client',      'client_t *'),</div><div class='add'>+	('ret-val',     'int32_t',     '0'),</div><div class='add'>+)</div><div class='add'>+</div><div class='add'>+xlator_cbks['ictxmerge'] = (</div><div class='add'>+	('fn-arg',      'this',        'xlator_t *'),</div><div class='add'>+	('fn-arg',      'fd',          'fd_t *'),</div><div class='add'>+	('fn-arg',      'inode',       'inode_t *'),</div><div class='add'>+	('fn-arg',      'linked_inode', 'inode_t *'),</div><div class='add'>+	('ret-val',     'void',        ''),</div><div class='add'>+)</div><div class='add'>+</div><div class='add'>+#####################################################################</div><div class='add'>+xlator_dumpops['priv'] = (</div><div class='add'>+	('fn-arg',      'this',        'xlator_t *'),</div><div class='add'>+	('ret-val',     'int32_t',     '0'),</div><div class='add'>+)</div><div class='add'>+</div><div class='add'>+xlator_dumpops['inode'] = (</div><div class='add'>+	('fn-arg',      'this',        'xlator_t *'),</div><div class='add'>+	('ret-val',     'int32_t',     '0'),</div><div class='add'>+)</div><div class='add'>+</div><div class='add'>+xlator_dumpops['fd'] = (</div><div class='add'>+	('fn-arg',      'this',        'xlator_t *'),</div><div class='add'>+	('ret-val',     'int32_t',     '0'),</div><div class='add'>+)</div><div class='add'>+</div><div class='add'>+xlator_dumpops['inodectx'] = (</div><div class='add'>+	('fn-arg',      'this',        'xlator_t *'),</div><div class='add'>+	('fn-arg',      'ino',         'inode_t *'),</div><div class='add'>+	('ret-val',     'int32_t',     '0'),</div><div class='add'>+)</div><div class='add'>+</div><div class='add'>+xlator_dumpops['fdctx'] = (</div><div class='add'>+	('fn-arg',      'this',        'xlator_t *'),</div><div class='add'>+	('fn-arg',      'fd',          'fd_t *'),</div><div class='add'>+	('ret-val',     'int32_t',     '0'),</div><div class='add'>+)</div><div class='add'>+</div><div class='add'>+xlator_dumpops['priv_to_dict'] = (</div><div class='add'>+	('fn-arg',      'this',        'xlator_t *'),</div><div class='add'>+	('fn-arg',      'dict',        'dict_t *'),</div><div class='add'>+	('ret-val',     'int32_t',     '0'),</div><div class='add'>+)</div><div class='add'>+</div><div class='add'>+xlator_dumpops['inode_to_dict'] = (</div><div class='add'>+	('fn-arg',      'this',        'xlator_t *'),</div><div class='add'>+	('fn-arg',      'dict',        'dict_t *'),</div><div class='add'>+	('ret-val',     'int32_t',     '0'),</div><div class='add'>+)</div><div class='add'>+</div><div class='add'>+xlator_dumpops['fd_to_dict'] = (</div><div class='add'>+	('fn-arg',      'this',        'xlator_t *'),</div><div class='add'>+	('fn-arg',      'dict',        'dict_t *'),</div><div class='add'>+	('ret-val',     'int32_t',     '0'),</div><div class='add'>+)</div><div class='add'>+</div><div class='add'>+xlator_dumpops['inodectx_to_dict'] = (</div><div class='add'>+	('fn-arg',      'this',        'xlator_t *'),</div><div class='add'>+	('fn-arg',      'ino',         'inode_t *'),</div><div class='add'>+	('fn-arg',      'dict',        'dict_t *'),</div><div class='add'>+	('ret-val',     'int32_t',     '0'),</div><div class='add'>+)</div><div class='add'>+</div><div class='add'>+xlator_dumpops['fdctx_to_dict'] = (</div><div class='add'>+	('fn-arg',      'this',        'xlator_t *'),</div><div class='add'>+	('fn-arg',      'fd',          'fd_t *'),</div><div class='add'>+	('fn-arg',      'dict',        'dict_t *'),</div><div class='add'>+	('ret-val',     'int32_t',     '0'),</div><div class='add'>+)</div><div class='add'>+</div><div class='add'>+xlator_dumpops['history'] = (</div><div class='add'>+	('fn-arg',      'this',        'xlator_t *'),</div><div class='add'>+	('ret-val',     'int32_t',     '0'),</div><div class='add'>+)</div><div class='add'>+</div><div class='add'>+def get_error_arg (type_str):</div><div class='add'>+	if type_str.find(" *") != -1:</div><div class='add'>+		return "NULL"</div><div class='add'>+	return "-1"</div><div class='add'>+</div><div class='add'>+def get_subs (names, types, cbktypes=None):</div><div class='add'>+	sdict = {}</div><div class='add'>+	sdict["@SHORT_ARGS@"] = ', '.join(names)</div><div class='add'>+	# Convert two separate tuples to one of (name, type) sub-tuples.</div><div class='add'>+	as_tuples = list(zip(types, names))</div><div class='add'>+	# Convert each sub-tuple into a "type name" string.</div><div class='add'>+	as_strings = [' '.join(item) for item in as_tuples]</div><div class='add'>+	# Join all of those into one big string.</div><div class='add'>+	sdict["@LONG_ARGS@"] = ',\n\t'.join(as_strings)</div><div class='add'>+	# So much more readable than string.join(map(string.join,zip(...))))</div><div class='add'>+	sdict["@ERROR_ARGS@"] = ', '.join(list(map(get_error_arg, types)))</div><div class='add'>+	if cbktypes is not None:</div><div class='add'>+		sdict["@CBK_ERROR_ARGS@"] = ', '.join(list(map(get_error_arg, cbktypes)))</div><div class='add'>+	return sdict</div><div class='add'>+</div><div class='add'>+def generate (tmpl, name, subs):</div><div class='add'>+	text = tmpl.replace("@NAME@", name)</div><div class='add'>+	if name == "writev":</div><div class='add'>+		# More spurious inconsistency.</div><div class='add'>+		text = text.replace("@UPNAME@", "WRITE")</div><div class='add'>+	elif name == "readv":</div><div class='add'>+		text = text.replace("@UPNAME@", "READ")</div><div class='add'>+	else:</div><div class='add'>+		text = text.replace("@UPNAME@", name.upper())</div><div class='add'>+	for old, new in subs[name].items():</div><div class='add'>+		text = text.replace(old, new)</div><div class='add'>+	# TBD: reindent/reformat the result for maximum readability.</div><div class='add'>+	return text</div><div class='add'>+</div><div class='add'>+fop_subs = {}</div><div class='add'>+cbk_subs = {}</div><div class='add'>+</div><div class='add'>+for name, args in ops.items():</div><div class='add'>+</div><div class='add'>+	# Create the necessary substitution strings for fops.</div><div class='add'>+	arg_names = [ a[1] for a in args if a[0] == 'fop-arg']</div><div class='add'>+	arg_types = [ a[2] for a in args if a[0] == 'fop-arg']</div><div class='add'>+	cbk_types = [ a[2] for a in args if a[0] == 'cbk-arg']</div><div class='add'>+	fop_subs[name] = get_subs(arg_names, arg_types, cbk_types)</div><div class='add'>+</div><div class='add'>+	# Same thing for callbacks.</div><div class='add'>+	arg_names = [ a[1] for a in args if a[0] == 'cbk-arg']</div><div class='add'>+	arg_types = [ a[2] for a in args if a[0] == 'cbk-arg']</div><div class='add'>+	cbk_subs[name] = get_subs(arg_names, arg_types)</div><div class='add'>+</div><div class='add'>+	# Callers can add other subs to these tables, or even create their</div><div class='add'>+	# own tables, using these same techniques, and then pass the result</div><div class='add'>+	# to generate() which would Do The Right Thing with them.</div><div class='head'>diff --git a/libglusterfs/src/gf-dirent.c b/libglusterfs/src/gf-dirent.c<br/>index 5ae74f9820a..a809efc97ef 100644<br/>--- a/<a href='/cgit/glusterfs.git/tree/libglusterfs/src/gf-dirent.c?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/gf-dirent.c</a><br/>+++ b/<a href='/cgit/glusterfs.git/tree/libglusterfs/src/gf-dirent.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>libglusterfs/src/gf-dirent.c</a></div><div class='hunk'>@@ -1,94 +1,301 @@</div><div class='ctx'> /*</div><div class='del'>-  Copyright (c) 2008-2009 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='add'>+  Copyright (c) 2008-2012 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='ctx'>   This file is part of GlusterFS.</div><div class='ctx'> </div><div class='del'>-  GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-  it under the terms of the GNU General Public License as published</div><div class='del'>-  by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-  or (at your option) any later version.</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='ctx'> </div><div class='del'>-  GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-  WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-  General Public License for more details.</div><div class='add'>+#include &lt;stdio.h&gt;</div><div class='add'>+#include &lt;string.h&gt;</div><div class='add'>+#include &lt;stdint.h&gt;</div><div class='add'>+#include "glusterfs/compat.h"</div><div class='add'>+#include "glusterfs/syncop.h"</div><div class='ctx'> </div><div class='del'>-  You should have received a copy of the GNU General Public License</div><div class='del'>-  along with this program.  If not, see</div><div class='del'>-  &lt;http://www.gnu.org/licenses/&gt;.</div><div class='del'>-*/</div><div class='add'>+#define ONE 1ULL</div><div class='add'>+#define PRESENT_D_OFF_BITS 63</div><div class='add'>+#define BACKEND_D_OFF_BITS 63</div><div class='add'>+#define TOP_BIT (ONE &lt;&lt; (PRESENT_D_OFF_BITS - 1))</div><div class='add'>+#define MASK (~0ULL)</div><div class='add'>+#define SHIFT_BITS (max(0, (BACKEND_D_OFF_BITS - PRESENT_D_OFF_BITS + 1)))</div><div class='add'>+#define PRESENT_MASK (MASK &gt;&gt; (64 - PRESENT_D_OFF_BITS))</div><div class='ctx'> </div><div class='add'>+static uint64_t</div><div class='add'>+bits_for(uint64_t num)</div><div class='add'>+{</div><div class='add'>+    uint64_t bits = 0, ctrl = 1;</div><div class='ctx'> </div><div class='del'>-#ifndef _CONFIG_H</div><div class='del'>-#define _CONFIG_H</div><div class='del'>-#include "config.h"</div><div class='del'>-#endif</div><div class='add'>+    while (ctrl &lt; num) {</div><div class='add'>+        ctrl *= 2;</div><div class='add'>+        bits++;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='add'>+    return bits;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-#include &lt;stdio.h&gt;</div><div class='del'>-#include &lt;string.h&gt;</div><div class='del'>-#include &lt;stdint.h&gt;</div><div class='del'>-#include "compat.h"</div><div class='del'>-#include "xlator.h"</div><div class='add'>+int</div><div class='add'>+gf_deitransform(xlator_t *this, uint64_t offset)</div><div class='add'>+{</div><div class='add'>+    int cnt = 0;</div><div class='add'>+    int max = 0;</div><div class='add'>+    int max_bits = 0;</div><div class='add'>+    uint64_t off_mask = 0;</div><div class='add'>+    uint64_t host_mask = 0;</div><div class='add'>+</div><div class='add'>+    max = glusterfs_get_leaf_count(this-&gt;graph);</div><div class='add'>+</div><div class='add'>+    if (max == 1) {</div><div class='add'>+        cnt = 0;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (offset &amp; TOP_BIT) {</div><div class='add'>+        /* HUGE d_off */</div><div class='add'>+        max_bits = bits_for(max);</div><div class='add'>+        off_mask = (MASK &lt;&lt; max_bits);</div><div class='add'>+        host_mask = ~(off_mask);</div><div class='add'>+</div><div class='add'>+        cnt = offset &amp; host_mask;</div><div class='add'>+    } else {</div><div class='add'>+        /* small d_off */</div><div class='add'>+        cnt = offset % max;</div><div class='add'>+    }</div><div class='add'>+out:</div><div class='add'>+    return cnt;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+uint64_t</div><div class='add'>+gf_dirent_orig_offset(xlator_t *this, uint64_t offset)</div><div class='add'>+{</div><div class='add'>+    int max = 0;</div><div class='add'>+    int max_bits = 0;</div><div class='add'>+    uint64_t off_mask = 0;</div><div class='add'>+    uint64_t orig_offset;</div><div class='add'>+</div><div class='add'>+    max = glusterfs_get_leaf_count(this-&gt;graph);</div><div class='add'>+</div><div class='add'>+    if (max == 1) {</div><div class='add'>+        orig_offset = offset;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (offset &amp; TOP_BIT) {</div><div class='add'>+        /* HUGE d_off */</div><div class='add'>+        max_bits = bits_for(max);</div><div class='add'>+        off_mask = (MASK &lt;&lt; max_bits);</div><div class='add'>+        orig_offset = ((offset &amp; ~TOP_BIT) &amp; off_mask) &lt;&lt; SHIFT_BITS;</div><div class='add'>+    } else {</div><div class='add'>+        /* small d_off */</div><div class='add'>+        orig_offset = offset / max;</div><div class='add'>+    }</div><div class='add'>+out:</div><div class='add'>+    return orig_offset;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+gf_itransform(xlator_t *this, uint64_t x, uint64_t *y_p, int client_id)</div><div class='add'>+{</div><div class='add'>+    int max = 0;</div><div class='add'>+    uint64_t y = 0;</div><div class='add'>+    uint64_t hi_mask = 0;</div><div class='add'>+    uint64_t off_mask = 0;</div><div class='add'>+    int max_bits = 0;</div><div class='add'>+</div><div class='add'>+    if (x == ((uint64_t)-1)) {</div><div class='add'>+        y = (uint64_t)-1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (!x) {</div><div class='add'>+        y = 0;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    max = glusterfs_get_leaf_count(this-&gt;graph);</div><div class='add'>+</div><div class='add'>+    if (max == 1) {</div><div class='add'>+        y = x;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    max_bits = bits_for(max);</div><div class='add'>+</div><div class='add'>+    hi_mask = ~(PRESENT_MASK &gt;&gt; (max_bits + 1));</div><div class='add'>+</div><div class='add'>+    if (x &amp; hi_mask) {</div><div class='add'>+        /* HUGE d_off */</div><div class='add'>+        off_mask = MASK &lt;&lt; max_bits;</div><div class='add'>+        y = TOP_BIT | ((x &gt;&gt; SHIFT_BITS) &amp; off_mask) | client_id;</div><div class='add'>+    } else {</div><div class='add'>+        /* small d_off */</div><div class='add'>+        y = ((x * max) + client_id);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (y_p)</div><div class='add'>+        *y_p = y;</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> gf_dirent_t *</div><div class='del'>-gf_dirent_for_namelen (int len)</div><div class='add'>+gf_dirent_for_name(const char *name)</div><div class='ctx'> {</div><div class='del'>-	gf_dirent_t *gf_dirent = NULL;</div><div class='add'>+    gf_dirent_t *gf_dirent = NULL;</div><div class='ctx'> </div><div class='del'>-	/* TODO: use mem-pool */</div><div class='del'>-	gf_dirent = CALLOC (len, sizeof(char));</div><div class='del'>-	if (!gf_dirent)</div><div class='del'>-		return NULL;</div><div class='add'>+    /* TODO: use mem-pool */</div><div class='add'>+    gf_dirent = GF_CALLOC(gf_dirent_size(name), 1, gf_common_mt_gf_dirent_t);</div><div class='add'>+    if (!gf_dirent)</div><div class='add'>+        return NULL;</div><div class='ctx'> </div><div class='del'>-	INIT_LIST_HEAD (&amp;gf_dirent-&gt;list);</div><div class='add'>+    INIT_LIST_HEAD(&amp;gf_dirent-&gt;list);</div><div class='add'>+    strcpy(gf_dirent-&gt;d_name, name);</div><div class='ctx'> </div><div class='del'>-	gf_dirent-&gt;d_off = 0;</div><div class='del'>-	gf_dirent-&gt;d_ino = -1;</div><div class='del'>-	gf_dirent-&gt;d_type = 0;</div><div class='add'>+    gf_dirent-&gt;d_off = 0;</div><div class='add'>+    gf_dirent-&gt;d_ino = -1;</div><div class='add'>+    gf_dirent-&gt;d_type = 0;</div><div class='add'>+    gf_dirent-&gt;d_len = strlen(name);</div><div class='ctx'> </div><div class='del'>-	return gf_dirent;</div><div class='add'>+    return gf_dirent;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+void</div><div class='add'>+gf_dirent_entry_free(gf_dirent_t *entry)</div><div class='add'>+{</div><div class='add'>+    if (!entry)</div><div class='add'>+        return;</div><div class='add'>+</div><div class='add'>+    if (entry-&gt;dict)</div><div class='add'>+        dict_unref(entry-&gt;dict);</div><div class='add'>+    if (entry-&gt;inode)</div><div class='add'>+        inode_unref(entry-&gt;inode);</div><div class='add'>+</div><div class='add'>+    list_del_init(&amp;entry-&gt;list);</div><div class='add'>+    GF_FREE(entry);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+gf_dirent_free(gf_dirent_t *entries)</div><div class='add'>+{</div><div class='add'>+    gf_dirent_t *entry = NULL;</div><div class='add'>+    gf_dirent_t *tmp = NULL;</div><div class='add'>+</div><div class='add'>+    if (!entries)</div><div class='add'>+        return;</div><div class='add'>+</div><div class='add'>+    if (list_empty(&amp;entries-&gt;list))</div><div class='add'>+        return;</div><div class='add'>+</div><div class='add'>+    list_for_each_entry_safe(entry, tmp, &amp;entries-&gt;list, list)</div><div class='add'>+    {</div><div class='add'>+        gf_dirent_entry_free(entry);</div><div class='add'>+    }</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> gf_dirent_t *</div><div class='del'>-gf_dirent_for_name (const char *name)</div><div class='add'>+entry_copy(gf_dirent_t *source)</div><div class='ctx'> {</div><div class='del'>-	gf_dirent_t *gf_dirent = NULL;</div><div class='add'>+    gf_dirent_t *sink = NULL;</div><div class='ctx'> </div><div class='del'>-	/* TODO: use mem-pool */</div><div class='del'>-	gf_dirent = GF_CALLOC (gf_dirent_size (name), 1,</div><div class='del'>-                                gf_common_mt_gf_dirent_t);</div><div class='del'>-	if (!gf_dirent)</div><div class='del'>-		return NULL;</div><div class='add'>+    sink = gf_dirent_for_name(source-&gt;d_name);</div><div class='add'>+    if (!sink)</div><div class='add'>+        return NULL;</div><div class='ctx'> </div><div class='del'>-	INIT_LIST_HEAD (&amp;gf_dirent-&gt;list);</div><div class='del'>-	strcpy (gf_dirent-&gt;d_name, name);</div><div class='add'>+    sink-&gt;d_off = source-&gt;d_off;</div><div class='add'>+    sink-&gt;d_ino = source-&gt;d_ino;</div><div class='add'>+    sink-&gt;d_type = source-&gt;d_type;</div><div class='add'>+    sink-&gt;d_stat = source-&gt;d_stat;</div><div class='add'>+    sink-&gt;d_len = source-&gt;d_len;</div><div class='ctx'> </div><div class='del'>-	gf_dirent-&gt;d_off = 0;</div><div class='del'>-	gf_dirent-&gt;d_ino = -1;</div><div class='del'>-	gf_dirent-&gt;d_type = 0;</div><div class='del'>-	gf_dirent-&gt;d_len = strlen (name);</div><div class='add'>+    if (source-&gt;inode)</div><div class='add'>+        sink-&gt;inode = inode_ref(source-&gt;inode);</div><div class='ctx'> </div><div class='del'>-	return gf_dirent;</div><div class='add'>+    if (source-&gt;dict)</div><div class='add'>+        sink-&gt;dict = dict_ref(source-&gt;dict);</div><div class='add'>+    return sink;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> void</div><div class='del'>-gf_dirent_free (gf_dirent_t *entries)</div><div class='add'>+gf_link_inode_from_dirent(xlator_t *this, inode_t *parent, gf_dirent_t *entry)</div><div class='ctx'> {</div><div class='del'>-	gf_dirent_t *entry = NULL;</div><div class='del'>-	gf_dirent_t *tmp = NULL;</div><div class='add'>+    inode_t *link_inode = NULL;</div><div class='add'>+    inode_t *tmp = NULL;</div><div class='add'>+</div><div class='add'>+    if (!entry-&gt;inode)</div><div class='add'>+        return;</div><div class='add'>+    link_inode = inode_link(entry-&gt;inode, parent, entry-&gt;d_name,</div><div class='add'>+                            &amp;entry-&gt;d_stat);</div><div class='add'>+    if (!link_inode)</div><div class='add'>+        return;</div><div class='ctx'> </div><div class='del'>-        if (!entries)</div><div class='del'>-                return;</div><div class='add'>+    inode_lookup(link_inode);</div><div class='add'>+    tmp = entry-&gt;inode;</div><div class='add'>+    entry-&gt;inode = link_inode;</div><div class='add'>+    inode_unref(tmp);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* TODO: Currently, with this function, we will be breaking the</div><div class='add'>+   policy of 1-1 mapping of kernel nlookup refs with our inode_t's</div><div class='add'>+   nlookup count.</div><div class='add'>+   Need more thoughts before finalizing this function</div><div class='add'>+*/</div><div class='add'>+int</div><div class='add'>+gf_link_inodes_from_dirent(xlator_t *this, inode_t *parent,</div><div class='add'>+                           gf_dirent_t *entries)</div><div class='add'>+{</div><div class='add'>+    gf_dirent_t *entry = NULL;</div><div class='ctx'> </div><div class='del'>-        if (list_empty (&amp;entries-&gt;list))</div><div class='del'>-                return;</div><div class='add'>+    list_for_each_entry(entry, &amp;entries-&gt;list, list)</div><div class='add'>+    {</div><div class='add'>+        gf_link_inode_from_dirent(this, parent, entry);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	list_for_each_entry_safe (entry, tmp, &amp;entries-&gt;list, list) {</div><div class='del'>-		list_del (&amp;entry-&gt;list);</div><div class='del'>-		GF_FREE (entry);</div><div class='del'>-	}</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+int</div><div class='add'>+gf_fill_iatt_for_dirent(gf_dirent_t *entry, inode_t *parent, xlator_t *subvol)</div><div class='add'>+{</div><div class='add'>+    loc_t loc = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int ret = -1;</div><div class='add'>+    char *path = NULL;</div><div class='add'>+    struct iatt iatt = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    loc.inode = inode_grep(parent-&gt;table, parent, entry-&gt;d_name);</div><div class='add'>+    if (!loc.inode) {</div><div class='add'>+        loc.inode = inode_new(parent-&gt;table);</div><div class='add'>+        gf_uuid_copy(loc.inode-&gt;gfid, entry-&gt;d_stat.ia_gfid);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    gf_uuid_copy(loc.pargfid, parent-&gt;gfid);</div><div class='add'>+    loc.name = entry-&gt;d_name;</div><div class='add'>+    loc.parent = inode_ref(parent);</div><div class='add'>+    ret = inode_path(loc.parent, entry-&gt;d_name, &amp;path);</div><div class='add'>+    loc.path = path;</div><div class='add'>+    if (ret &lt; 0)</div><div class='add'>+        goto out;</div><div class='ctx'> </div><div class='add'>+    ret = syncop_lookup(subvol, &amp;loc, &amp;iatt, NULL, NULL, NULL);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    entry-&gt;d_stat = iatt;</div><div class='add'>+    entry-&gt;inode = inode_ref(loc.inode);</div><div class='add'>+    /* We don't need to link inode here, because as part of readdirp_cbk</div><div class='add'>+     * we will link all dirents.</div><div class='add'>+     *</div><div class='add'>+     * Since we did a proper lookup, we don't need to set need_lookup</div><div class='add'>+     * flag.</div><div class='add'>+     */</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+out:</div><div class='add'>+    loc_wipe(&amp;loc);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='head'>diff --git a/libglusterfs/src/gf-dirent.h b/libglusterfs/src/gf-dirent.h<br/>deleted file mode 100644<br/>index abac13cf3c6..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/libglusterfs/src/gf-dirent.h?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/gf-dirent.h</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,62 +0,0 @@</div><div class='del'>-/*</div><div class='del'>-  Copyright (c) 2008-2009 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='del'>-  This file is part of GlusterFS.</div><div class='del'>-</div><div class='del'>-  GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-  it under the terms of the GNU General Public License as published</div><div class='del'>-  by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-  or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-  GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-  WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-  General Public License for more details.</div><div class='del'>-</div><div class='del'>-  You should have received a copy of the GNU General Public License</div><div class='del'>-  along with this program.  If not, see</div><div class='del'>-  &lt;http://www.gnu.org/licenses/&gt;.</div><div class='del'>-*/</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-#ifndef _GF_DIRENT_H</div><div class='del'>-#define _GF_DIRENT_H</div><div class='del'>-</div><div class='del'>-#ifndef _CONFIG_H</div><div class='del'>-#define _CONFIG_H</div><div class='del'>-#include "config.h"</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-#include "iatt.h"</div><div class='del'>-</div><div class='del'>-#define gf_dirent_size(name) (sizeof (gf_dirent_t) + strlen (name) + 1)</div><div class='del'>-</div><div class='del'>-struct _dir_entry_t {</div><div class='del'>-        struct _dir_entry_t *next;</div><div class='del'>-	char                *name;</div><div class='del'>-	char                *link;</div><div class='del'>-	struct iatt          buf;</div><div class='del'>-};</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-struct _gf_dirent_t {</div><div class='del'>-	union {</div><div class='del'>-		struct list_head             list;</div><div class='del'>-		struct {</div><div class='del'>-			struct _gf_dirent_t *next;</div><div class='del'>-			struct _gf_dirent_t *prev;</div><div class='del'>-		};</div><div class='del'>-	};</div><div class='del'>-	uint64_t                             d_ino;</div><div class='del'>-	uint64_t                             d_off;</div><div class='del'>-	uint32_t                             d_len;</div><div class='del'>-	uint32_t                             d_type;</div><div class='del'>-        struct iatt                          d_stat;</div><div class='del'>-	char                                 d_name[0];</div><div class='del'>-};</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-gf_dirent_t *gf_dirent_for_name (const char *name);</div><div class='del'>-void gf_dirent_free (gf_dirent_t *entries);</div><div class='del'>-gf_dirent_t * gf_dirent_for_namelen (int len);</div><div class='del'>-</div><div class='del'>-#endif /* _GF_DIRENT_H */</div><div class='head'>diff --git a/libglusterfs/src/gidcache.c b/libglusterfs/src/gidcache.c<br/>new file mode 100644<br/>index 00000000000..64a93802f76<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/libglusterfs/src/gidcache.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>libglusterfs/src/gidcache.c</a></div><div class='hunk'>@@ -0,0 +1,211 @@</div><div class='add'>+/*</div><div class='add'>+  Copyright (c) 2008-2012 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#include "glusterfs/gidcache.h"</div><div class='add'>+#include "glusterfs/mem-pool.h"</div><div class='add'>+#include "glusterfs/common-utils.h"</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+ * We treat this as a very simple set-associative LRU cache, with entries aged</div><div class='add'>+ * out after a configurable interval.  Hardly rocket science, but lots of</div><div class='add'>+ * details to worry about.</div><div class='add'>+ */</div><div class='add'>+#define BUCKET_START(p, n) ((p) + ((n)*AUX_GID_CACHE_ASSOC))</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+ * Initialize the cache.</div><div class='add'>+ */</div><div class='add'>+int</div><div class='add'>+gid_cache_init(gid_cache_t *cache, uint32_t timeout)</div><div class='add'>+{</div><div class='add'>+    if (!cache)</div><div class='add'>+        return -1;</div><div class='add'>+</div><div class='add'>+    LOCK_INIT(&amp;cache-&gt;gc_lock);</div><div class='add'>+    cache-&gt;gc_max_age = timeout;</div><div class='add'>+    cache-&gt;gc_nbuckets = AUX_GID_CACHE_BUCKETS;</div><div class='add'>+    memset(cache-&gt;gc_cache, 0, sizeof(gid_list_t) * AUX_GID_CACHE_SIZE);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+ * Reconfigure the cache timeout.</div><div class='add'>+ */</div><div class='add'>+int</div><div class='add'>+gid_cache_reconf(gid_cache_t *cache, uint32_t timeout)</div><div class='add'>+{</div><div class='add'>+    if (!cache)</div><div class='add'>+        return -1;</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;cache-&gt;gc_lock);</div><div class='add'>+    cache-&gt;gc_max_age = timeout;</div><div class='add'>+    UNLOCK(&amp;cache-&gt;gc_lock);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+ * Look up an ID in the cache. If found, return the actual cache entry to avoid</div><div class='add'>+ * an additional allocation and memory copy. The caller should copy the data and</div><div class='add'>+ * release (unlock) the cache as soon as possible.</div><div class='add'>+ */</div><div class='add'>+const gid_list_t *</div><div class='add'>+gid_cache_lookup(gid_cache_t *cache, uint64_t id, uint64_t uid, uint64_t gid)</div><div class='add'>+{</div><div class='add'>+    int bucket;</div><div class='add'>+    int i;</div><div class='add'>+    time_t now;</div><div class='add'>+    const gid_list_t *agl;</div><div class='add'>+</div><div class='add'>+    now = gf_time();</div><div class='add'>+    LOCK(&amp;cache-&gt;gc_lock);</div><div class='add'>+    bucket = id % cache-&gt;gc_nbuckets;</div><div class='add'>+    agl = BUCKET_START(cache-&gt;gc_cache, bucket);</div><div class='add'>+    for (i = 0; i &lt; AUX_GID_CACHE_ASSOC; i++, agl++) {</div><div class='add'>+        if (!agl-&gt;gl_list)</div><div class='add'>+            continue;</div><div class='add'>+        if (agl-&gt;gl_id != id)</div><div class='add'>+            continue;</div><div class='add'>+</div><div class='add'>+        /*</div><div class='add'>+          @uid and @gid reflect the latest UID/GID of the</div><div class='add'>+           process performing the syscall (taken from frame-&gt;root).</div><div class='add'>+</div><div class='add'>+           If the UID and GID has changed for the PID since the</div><div class='add'>+           time we cached it, we should treat the cache as having</div><div class='add'>+           stale values and query them freshly.</div><div class='add'>+        */</div><div class='add'>+        if (agl-&gt;gl_uid != uid || agl-&gt;gl_gid != gid)</div><div class='add'>+            break;</div><div class='add'>+</div><div class='add'>+        /*</div><div class='add'>+         * We don't put new entries in the cache when expiration=0, but</div><div class='add'>+         * there might be entries still in there if expiration was</div><div class='add'>+         * changed very recently.  Writing the check this way ensures</div><div class='add'>+         * that they're not used.</div><div class='add'>+         */</div><div class='add'>+        if (now &lt; agl-&gt;gl_deadline) {</div><div class='add'>+            return agl;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        /*</div><div class='add'>+         * We're not going to find any more UID matches, and reaping</div><div class='add'>+         * is handled further down to maintain LRU order.</div><div class='add'>+         */</div><div class='add'>+        break;</div><div class='add'>+    }</div><div class='add'>+    UNLOCK(&amp;cache-&gt;gc_lock);</div><div class='add'>+    return NULL;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+ * Release an entry found via lookup.</div><div class='add'>+ */</div><div class='add'>+void</div><div class='add'>+gid_cache_release(gid_cache_t *cache, const gid_list_t *agl)</div><div class='add'>+{</div><div class='add'>+    UNLOCK(&amp;cache-&gt;gc_lock);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+ * Add a new list entry to the cache. If an entry for this ID already exists,</div><div class='add'>+ * update it.</div><div class='add'>+ */</div><div class='add'>+int</div><div class='add'>+gid_cache_add(gid_cache_t *cache, gid_list_t *gl)</div><div class='add'>+{</div><div class='add'>+    gid_list_t *agl;</div><div class='add'>+    int bucket;</div><div class='add'>+    int i;</div><div class='add'>+    time_t now;</div><div class='add'>+</div><div class='add'>+    if (!gl || !gl-&gt;gl_list)</div><div class='add'>+        return -1;</div><div class='add'>+</div><div class='add'>+    if (!cache-&gt;gc_max_age)</div><div class='add'>+        return 0;</div><div class='add'>+</div><div class='add'>+    now = gf_time();</div><div class='add'>+    LOCK(&amp;cache-&gt;gc_lock);</div><div class='add'>+</div><div class='add'>+    /*</div><div class='add'>+     * Scan for the first free entry or one that matches this id. The id</div><div class='add'>+     * check is added to address a bug where the cache might contain an</div><div class='add'>+     * expired entry for this id. Since lookup occurs in LRU order and</div><div class='add'>+     * does not reclaim entries, it will always return failure on discovery</div><div class='add'>+     * of an expired entry. This leads to duplicate entries being added,</div><div class='add'>+     * which still do not satisfy lookups until the expired entry (and</div><div class='add'>+     * everything before it) is reclaimed.</div><div class='add'>+     *</div><div class='add'>+     * We address this through reuse of an entry already allocated to this</div><div class='add'>+     * id, whether expired or not, since we have obviously already received</div><div class='add'>+     * more recent data. The entry is repopulated with the new data and a new</div><div class='add'>+     * deadline and is pushed forward to reside as the last populated entry in</div><div class='add'>+     * the bucket.</div><div class='add'>+     */</div><div class='add'>+    bucket = gl-&gt;gl_id % cache-&gt;gc_nbuckets;</div><div class='add'>+    agl = BUCKET_START(cache-&gt;gc_cache, bucket);</div><div class='add'>+    for (i = 0; i &lt; AUX_GID_CACHE_ASSOC; ++i, ++agl) {</div><div class='add'>+        if (agl-&gt;gl_id == gl-&gt;gl_id)</div><div class='add'>+            break;</div><div class='add'>+        if (!agl-&gt;gl_list)</div><div class='add'>+            break;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /*</div><div class='add'>+     * The way we allocate free entries naturally places the newest</div><div class='add'>+     * ones at the highest indices, so evicting the lowest makes</div><div class='add'>+     * sense, but that also means we can't just replace it with the</div><div class='add'>+     * one that caused the eviction.  That would cause us to thrash</div><div class='add'>+     * the first entry while others remain idle.  Therefore, we</div><div class='add'>+     * need to slide the other entries down and add the new one at</div><div class='add'>+     * the end just as if the *last* slot had been free.</div><div class='add'>+     *</div><div class='add'>+     * Deadline expiration is also handled here, since the oldest</div><div class='add'>+     * expired entry will be in the first position.  This does mean</div><div class='add'>+     * the bucket can stay full of expired entries if we're idle</div><div class='add'>+     * but, if the small amount of extra memory or scan time before</div><div class='add'>+     * we decide to evict someone ever become issues, we could</div><div class='add'>+     * easily add a reaper thread.</div><div class='add'>+     */</div><div class='add'>+</div><div class='add'>+    if (i &gt;= AUX_GID_CACHE_ASSOC) {</div><div class='add'>+        /* cache full, evict the first (LRU) entry */</div><div class='add'>+        i = 0;</div><div class='add'>+        agl = BUCKET_START(cache-&gt;gc_cache, bucket);</div><div class='add'>+        GF_FREE(agl-&gt;gl_list);</div><div class='add'>+    } else if (agl-&gt;gl_list) {</div><div class='add'>+        /* evict the old entry we plan to reuse */</div><div class='add'>+        GF_FREE(agl-&gt;gl_list);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /*</div><div class='add'>+     * If we have evicted an entry, slide the subsequent populated entries</div><div class='add'>+     * back and populate the last entry.</div><div class='add'>+     */</div><div class='add'>+    for (; i &lt; AUX_GID_CACHE_ASSOC - 1; i++) {</div><div class='add'>+        if (!agl[1].gl_list)</div><div class='add'>+            break;</div><div class='add'>+        agl[0] = agl[1];</div><div class='add'>+        agl++;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    agl-&gt;gl_id = gl-&gt;gl_id;</div><div class='add'>+    agl-&gt;gl_uid = gl-&gt;gl_uid;</div><div class='add'>+    agl-&gt;gl_gid = gl-&gt;gl_gid;</div><div class='add'>+    agl-&gt;gl_count = gl-&gt;gl_count;</div><div class='add'>+    agl-&gt;gl_list = gl-&gt;gl_list;</div><div class='add'>+    agl-&gt;gl_deadline = now + cache-&gt;gc_max_age;</div><div class='add'>+</div><div class='add'>+    UNLOCK(&amp;cache-&gt;gc_lock);</div><div class='add'>+</div><div class='add'>+    return 1;</div><div class='add'>+}</div><div class='head'>diff --git a/libglusterfs/src/globals.c b/libglusterfs/src/globals.c<br/>index e845b3dcb66..ae06f8be386 100644<br/>--- a/<a href='/cgit/glusterfs.git/tree/libglusterfs/src/globals.c?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/globals.c</a><br/>+++ b/<a href='/cgit/glusterfs.git/tree/libglusterfs/src/globals.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>libglusterfs/src/globals.c</a></div><div class='hunk'>@@ -1,336 +1,366 @@</div><div class='ctx'> /*</div><div class='del'>-   Copyright (c) 2009 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='del'>-   This file is part of GlusterFS.</div><div class='del'>-</div><div class='del'>-   GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-   it under the terms of the GNU General Public License as published</div><div class='del'>-   by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-   or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-   GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-   WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-   General Public License for more details.</div><div class='del'>-</div><div class='del'>-   You should have received a copy of the GNU General Public License</div><div class='del'>-   along with this program.  If not, see</div><div class='del'>-   &lt;http://www.gnu.org/licenses/&gt;.</div><div class='del'>-*/</div><div class='add'>+  Copyright (c) 2008-2012 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='ctx'> </div><div class='del'>-#ifndef _CONFIG_H</div><div class='del'>-#define _CONFIG_H</div><div class='del'>-#include "config.h"</div><div class='del'>-#endif /* !_CONFIG_H */</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='ctx'> </div><div class='ctx'> #include &lt;pthread.h&gt;</div><div class='ctx'> </div><div class='del'>-#include "glusterfs.h"</div><div class='del'>-#include "globals.h"</div><div class='del'>-#include "xlator.h"</div><div class='del'>-#include "mem-pool.h"</div><div class='add'>+#include "glusterfs/syncop.h"</div><div class='add'>+#include "glusterfs/libglusterfs-messages.h"</div><div class='add'>+</div><div class='add'>+const char *gf_fop_list[GF_FOP_MAXVALUE] = {</div><div class='add'>+    [GF_FOP_NULL] = "NULL",</div><div class='add'>+    [GF_FOP_STAT] = "STAT",</div><div class='add'>+    [GF_FOP_READLINK] = "READLINK",</div><div class='add'>+    [GF_FOP_MKNOD] = "MKNOD",</div><div class='add'>+    [GF_FOP_MKDIR] = "MKDIR",</div><div class='add'>+    [GF_FOP_UNLINK] = "UNLINK",</div><div class='add'>+    [GF_FOP_RMDIR] = "RMDIR",</div><div class='add'>+    [GF_FOP_SYMLINK] = "SYMLINK",</div><div class='add'>+    [GF_FOP_RENAME] = "RENAME",</div><div class='add'>+    [GF_FOP_LINK] = "LINK",</div><div class='add'>+    [GF_FOP_TRUNCATE] = "TRUNCATE",</div><div class='add'>+    [GF_FOP_OPEN] = "OPEN",</div><div class='add'>+    [GF_FOP_READ] = "READ",</div><div class='add'>+    [GF_FOP_WRITE] = "WRITE",</div><div class='add'>+    [GF_FOP_STATFS] = "STATFS",</div><div class='add'>+    [GF_FOP_FLUSH] = "FLUSH",</div><div class='add'>+    [GF_FOP_FSYNC] = "FSYNC",</div><div class='add'>+    [GF_FOP_SETXATTR] = "SETXATTR",</div><div class='add'>+    [GF_FOP_GETXATTR] = "GETXATTR",</div><div class='add'>+    [GF_FOP_REMOVEXATTR] = "REMOVEXATTR",</div><div class='add'>+    [GF_FOP_OPENDIR] = "OPENDIR",</div><div class='add'>+    [GF_FOP_FSYNCDIR] = "FSYNCDIR",</div><div class='add'>+    [GF_FOP_ACCESS] = "ACCESS",</div><div class='add'>+    [GF_FOP_CREATE] = "CREATE",</div><div class='add'>+    [GF_FOP_FTRUNCATE] = "FTRUNCATE",</div><div class='add'>+    [GF_FOP_FSTAT] = "FSTAT",</div><div class='add'>+    [GF_FOP_LK] = "LK",</div><div class='add'>+    [GF_FOP_LOOKUP] = "LOOKUP",</div><div class='add'>+    [GF_FOP_READDIR] = "READDIR",</div><div class='add'>+    [GF_FOP_INODELK] = "INODELK",</div><div class='add'>+    [GF_FOP_FINODELK] = "FINODELK",</div><div class='add'>+    [GF_FOP_ENTRYLK] = "ENTRYLK",</div><div class='add'>+    [GF_FOP_FENTRYLK] = "FENTRYLK",</div><div class='add'>+    [GF_FOP_XATTROP] = "XATTROP",</div><div class='add'>+    [GF_FOP_FXATTROP] = "FXATTROP",</div><div class='add'>+    [GF_FOP_FSETXATTR] = "FSETXATTR",</div><div class='add'>+    [GF_FOP_FGETXATTR] = "FGETXATTR",</div><div class='add'>+    [GF_FOP_RCHECKSUM] = "RCHECKSUM",</div><div class='add'>+    [GF_FOP_SETATTR] = "SETATTR",</div><div class='add'>+    [GF_FOP_FSETATTR] = "FSETATTR",</div><div class='add'>+    [GF_FOP_READDIRP] = "READDIRP",</div><div class='add'>+    [GF_FOP_GETSPEC] = "GETSPEC",</div><div class='add'>+    [GF_FOP_FORGET] = "FORGET",</div><div class='add'>+    [GF_FOP_RELEASE] = "RELEASE",</div><div class='add'>+    [GF_FOP_RELEASEDIR] = "RELEASEDIR",</div><div class='add'>+    [GF_FOP_FREMOVEXATTR] = "FREMOVEXATTR",</div><div class='add'>+    [GF_FOP_FALLOCATE] = "FALLOCATE",</div><div class='add'>+    [GF_FOP_DISCARD] = "DISCARD",</div><div class='add'>+    [GF_FOP_ZEROFILL] = "ZEROFILL",</div><div class='add'>+    [GF_FOP_IPC] = "IPC",</div><div class='add'>+    [GF_FOP_SEEK] = "SEEK",</div><div class='add'>+    [GF_FOP_LEASE] = "LEASE",</div><div class='add'>+    [GF_FOP_COMPOUND] = "COMPOUND",</div><div class='add'>+    [GF_FOP_GETACTIVELK] = "GETACTIVELK",</div><div class='add'>+    [GF_FOP_SETACTIVELK] = "SETACTIVELK",</div><div class='add'>+    [GF_FOP_PUT] = "PUT",</div><div class='add'>+    [GF_FOP_ICREATE] = "ICREATE",</div><div class='add'>+    [GF_FOP_NAMELINK] = "NAMELINK",</div><div class='add'>+    [GF_FOP_COPY_FILE_RANGE] = "COPY_FILE_RANGE",</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+const char *gf_upcall_list[GF_UPCALL_FLAGS_MAXVALUE] = {</div><div class='add'>+    [GF_UPCALL_NULL] = "NULL",</div><div class='add'>+    [GF_UPCALL] = "UPCALL",</div><div class='add'>+    [GF_UPCALL_CI_STAT] = "CI_IATT",</div><div class='add'>+    [GF_UPCALL_CI_XATTR] = "CI_XATTR",</div><div class='add'>+    [GF_UPCALL_CI_RENAME] = "CI_RENAME",</div><div class='add'>+    [GF_UPCALL_CI_NLINK] = "CI_UNLINK",</div><div class='add'>+    [GF_UPCALL_CI_FORGET] = "CI_FORGET",</div><div class='add'>+    [GF_UPCALL_LEASE_RECALL] = "LEASE_RECALL",</div><div class='add'>+};</div><div class='ctx'> </div><div class='add'>+/* THIS */</div><div class='ctx'> </div><div class='del'>-/* gf_*_list[] */</div><div class='add'>+/* This global ctx is a bad hack to prevent some of the libgfapi crashes.</div><div class='add'>+ * This should be removed once the patch on resource pool is accepted</div><div class='add'>+ */</div><div class='add'>+glusterfs_ctx_t *global_ctx = NULL;</div><div class='add'>+pthread_mutex_t global_ctx_mutex = PTHREAD_MUTEX_INITIALIZER;</div><div class='add'>+xlator_t global_xlator;</div><div class='add'>+static int gf_global_mem_acct_enable = 1;</div><div class='add'>+static pthread_once_t globals_inited = PTHREAD_ONCE_INIT;</div><div class='ctx'> </div><div class='del'>-char *gf_fop_list[GF_FOP_MAXVALUE];</div><div class='del'>-char *gf_mgmt_list[GF_MGMT_MAXVALUE];</div><div class='add'>+static pthread_key_t free_key;</div><div class='ctx'> </div><div class='add'>+static __thread xlator_t *thread_xlator = NULL;</div><div class='add'>+static __thread void *thread_synctask = NULL;</div><div class='add'>+static __thread void *thread_leaseid = NULL;</div><div class='add'>+static __thread struct syncopctx thread_syncopctx = {};</div><div class='add'>+static __thread char thread_uuid_buf[GF_UUID_BUF_SIZE] = {};</div><div class='add'>+static __thread char thread_lkowner_buf[GF_LKOWNER_BUF_SIZE] = {};</div><div class='add'>+static __thread char thread_leaseid_buf[GF_LEASE_ID_BUF_SIZE] = {};</div><div class='ctx'> </div><div class='del'>-void</div><div class='del'>-gf_op_list_init()</div><div class='add'>+int</div><div class='add'>+gf_global_mem_acct_enable_get(void)</div><div class='ctx'> {</div><div class='del'>-	gf_fop_list[GF_FOP_NULL]        = "NULL";</div><div class='del'>-	gf_fop_list[GF_FOP_STAT]        = "STAT";</div><div class='del'>-	gf_fop_list[GF_FOP_READLINK]    = "READLINK";</div><div class='del'>-	gf_fop_list[GF_FOP_MKNOD]       = "MKNOD";</div><div class='del'>-	gf_fop_list[GF_FOP_MKDIR]       = "MKDIR";</div><div class='del'>-	gf_fop_list[GF_FOP_UNLINK]      = "UNLINK";</div><div class='del'>-	gf_fop_list[GF_FOP_RMDIR]       = "RMDIR";</div><div class='del'>-	gf_fop_list[GF_FOP_SYMLINK]     = "SYMLINK";</div><div class='del'>-	gf_fop_list[GF_FOP_RENAME]      = "RENAME";</div><div class='del'>-	gf_fop_list[GF_FOP_LINK]        = "LINK";</div><div class='del'>-	gf_fop_list[GF_FOP_TRUNCATE]    = "TRUNCATE";</div><div class='del'>-	gf_fop_list[GF_FOP_OPEN]        = "OPEN";</div><div class='del'>-	gf_fop_list[GF_FOP_READ]        = "READ";</div><div class='del'>-	gf_fop_list[GF_FOP_WRITE]       = "WRITE";</div><div class='del'>-	gf_fop_list[GF_FOP_STATFS]      = "STATFS";</div><div class='del'>-	gf_fop_list[GF_FOP_FLUSH]       = "FLUSH";</div><div class='del'>-	gf_fop_list[GF_FOP_FSYNC]       = "FSYNC";</div><div class='del'>-	gf_fop_list[GF_FOP_SETXATTR]    = "SETXATTR";</div><div class='del'>-	gf_fop_list[GF_FOP_GETXATTR]    = "GETXATTR";</div><div class='del'>-	gf_fop_list[GF_FOP_REMOVEXATTR] = "REMOVEXATTR";</div><div class='del'>-	gf_fop_list[GF_FOP_OPENDIR]     = "OPENDIR";</div><div class='del'>-	gf_fop_list[GF_FOP_FSYNCDIR]    = "FSYNCDIR";</div><div class='del'>-	gf_fop_list[GF_FOP_ACCESS]      = "ACCESS";</div><div class='del'>-	gf_fop_list[GF_FOP_CREATE]      = "CREATE";</div><div class='del'>-	gf_fop_list[GF_FOP_FTRUNCATE]   = "FTRUNCATE";</div><div class='del'>-	gf_fop_list[GF_FOP_FSTAT]       = "FSTAT";</div><div class='del'>-	gf_fop_list[GF_FOP_LK]          = "LK";</div><div class='del'>-	gf_fop_list[GF_FOP_LOOKUP]      = "LOOKUP";</div><div class='del'>-	gf_fop_list[GF_FOP_READDIR]     = "READDIR";</div><div class='del'>-	gf_fop_list[GF_FOP_INODELK]     = "INODELK";</div><div class='del'>-	gf_fop_list[GF_FOP_FINODELK]    = "FINODELK";</div><div class='del'>-	gf_fop_list[GF_FOP_ENTRYLK]     = "ENTRYLK";</div><div class='del'>-	gf_fop_list[GF_FOP_FENTRYLK]    = "FENTRYLK";</div><div class='del'>-	gf_fop_list[GF_FOP_XATTROP]     = "XATTROP";</div><div class='del'>-	gf_fop_list[GF_FOP_FXATTROP]    = "FXATTROP";</div><div class='del'>-	gf_fop_list[GF_FOP_FSETXATTR]   = "FSETXATTR";</div><div class='del'>-	gf_fop_list[GF_FOP_FGETXATTR]   = "FGETXATTR";</div><div class='del'>-        gf_fop_list[GF_FOP_RCHECKSUM]   = "RCHECKSUM";</div><div class='del'>-        gf_fop_list[GF_FOP_SETATTR]     = "SETATTR";</div><div class='del'>-        gf_fop_list[GF_FOP_FSETATTR]    = "FSETATTR";</div><div class='del'>-	gf_fop_list[GF_FOP_READDIRP]    = "READDIRP";</div><div class='del'>-	gf_fop_list[GF_FOP_GETSPEC]     = "GETSPEC";</div><div class='del'>-	gf_fop_list[GF_FOP_FORGET]      = "FORGET";</div><div class='del'>-	gf_fop_list[GF_FOP_RELEASE]     = "RELEASE";</div><div class='del'>-	gf_fop_list[GF_FOP_RELEASEDIR]  = "RELEASEDIR";</div><div class='del'>-</div><div class='del'>-	gf_fop_list[GF_MGMT_NULL]  = "NULL";</div><div class='del'>-	return;</div><div class='add'>+    return gf_global_mem_acct_enable;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='del'>-/* CTX */</div><div class='del'>-static glusterfs_ctx_t *glusterfs_ctx;</div><div class='del'>-</div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-glusterfs_ctx_init ()</div><div class='add'>+gf_global_mem_acct_enable_set(int val)</div><div class='ctx'> {</div><div class='del'>-        int  ret = 0;</div><div class='add'>+    gf_global_mem_acct_enable = val;</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        if (glusterfs_ctx)</div><div class='del'>-                goto out;</div><div class='add'>+static struct xlator_cbks global_cbks = {</div><div class='add'>+    .forget = NULL,</div><div class='add'>+    .release = NULL,</div><div class='add'>+    .releasedir = NULL,</div><div class='add'>+    .invalidate = NULL,</div><div class='add'>+    .client_destroy = NULL,</div><div class='add'>+    .client_disconnect = NULL,</div><div class='add'>+    .ictxmerge = NULL,</div><div class='add'>+    .ictxsize = NULL,</div><div class='add'>+    .fdctxsize = NULL,</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+/* This is required to get through the check in graph.c */</div><div class='add'>+static struct xlator_fops global_fops = {};</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+global_xl_reconfigure(xlator_t *this, dict_t *options)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    gf_boolean_t bool_opt = _gf_false;</div><div class='add'>+</div><div class='add'>+    /* This is not added in volume dump, hence adding the options in log</div><div class='add'>+       would be helpful for debugging later */</div><div class='add'>+    dict_dump_to_log(options);</div><div class='ctx'> </div><div class='del'>-        glusterfs_ctx = CALLOC (1, sizeof (*glusterfs_ctx));</div><div class='del'>-        if (!glusterfs_ctx) {</div><div class='del'>-                ret = -1;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='add'>+    GF_OPTION_RECONF("measure-latency", bool_opt, options, bool, out);</div><div class='add'>+    this-&gt;ctx-&gt;measure_latency = bool_opt;</div><div class='ctx'> </div><div class='del'>-        INIT_LIST_HEAD (&amp;glusterfs_ctx-&gt;graphs);</div><div class='del'>-        ret = pthread_mutex_init (&amp;glusterfs_ctx-&gt;lock, NULL);</div><div class='add'>+    GF_OPTION_RECONF("metrics-dump-path", this-&gt;ctx-&gt;config.metrics_dumppath,</div><div class='add'>+                     options, str, out);</div><div class='ctx'> </div><div class='add'>+    /* TODO: add more things here */</div><div class='add'>+    ret = 0;</div><div class='ctx'> out:</div><div class='del'>-        return ret;</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='del'>-glusterfs_ctx_t *</div><div class='del'>-glusterfs_ctx_get ()</div><div class='add'>+static int</div><div class='add'>+global_xl_init(xlator_t *this)</div><div class='ctx'> {</div><div class='del'>-        return glusterfs_ctx;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    gf_boolean_t bool_opt = false;</div><div class='ctx'> </div><div class='del'>-}</div><div class='add'>+    GF_OPTION_INIT("measure-latency", bool_opt, bool, out);</div><div class='add'>+    this-&gt;ctx-&gt;measure_latency = bool_opt;</div><div class='ctx'> </div><div class='add'>+    GF_OPTION_INIT("metrics-dump-path", this-&gt;ctx-&gt;config.metrics_dumppath, str,</div><div class='add'>+                   out);</div><div class='ctx'> </div><div class='del'>-/* THIS */</div><div class='add'>+    ret = 0;</div><div class='ctx'> </div><div class='del'>-xlator_t global_xlator;</div><div class='del'>-static pthread_key_t this_xlator_key;</div><div class='del'>-</div><div class='del'>-void</div><div class='del'>-glusterfs_this_destroy (void *ptr)</div><div class='del'>-{</div><div class='del'>-        if (ptr)</div><div class='del'>-                FREE (ptr);</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-glusterfs_this_init ()</div><div class='add'>+static void</div><div class='add'>+global_xl_fini(xlator_t *this)</div><div class='ctx'> {</div><div class='del'>-        int  ret = 0;</div><div class='del'>-</div><div class='del'>-        ret = pthread_key_create (&amp;this_xlator_key, glusterfs_this_destroy);</div><div class='del'>-        if (ret != 0) {</div><div class='del'>-                return ret;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        global_xlator.name = "glusterfs";</div><div class='del'>-        global_xlator.type = "global";</div><div class='del'>-        global_xlator.ctx  = glusterfs_ctx;</div><div class='del'>-</div><div class='del'>-        return ret;</div><div class='add'>+    return;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+struct volume_options global_xl_options[] = {</div><div class='add'>+    {.key = {"measure-latency"},</div><div class='add'>+     .type = GF_OPTION_TYPE_BOOL,</div><div class='add'>+     .default_value = "no",</div><div class='add'>+     .op_version = {GD_OP_VERSION_4_0_0},</div><div class='add'>+     .flags = OPT_FLAG_SETTABLE,</div><div class='add'>+     .tags = {"global", "context"},</div><div class='add'>+     .description = "Use this option to toggle measuring latency"},</div><div class='add'>+    {.key = {"metrics-dump-path"},</div><div class='add'>+     .type = GF_OPTION_TYPE_STR,</div><div class='add'>+     .default_value = "{{gluster_workdir}}/metrics",</div><div class='add'>+     .op_version = {GD_OP_VERSION_4_0_0},</div><div class='add'>+     .flags = OPT_FLAG_SETTABLE,</div><div class='add'>+     .tags = {"global", "context"},</div><div class='add'>+     .description = "Use this option to set the metrics dump path"},</div><div class='add'>+</div><div class='add'>+    {</div><div class='add'>+        .key = {NULL},</div><div class='add'>+    },</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+static volume_opt_list_t global_xl_opt_list;</div><div class='ctx'> </div><div class='del'>-xlator_t **</div><div class='del'>-__glusterfs_this_location ()</div><div class='add'>+void</div><div class='add'>+glusterfs_this_init()</div><div class='ctx'> {</div><div class='del'>-        xlator_t **this_location = NULL;</div><div class='del'>-        int        ret = 0;</div><div class='del'>-</div><div class='del'>-        this_location = pthread_getspecific (this_xlator_key);</div><div class='del'>-</div><div class='del'>-        if (!this_location) {</div><div class='del'>-                this_location = CALLOC (1, sizeof (*this_location));</div><div class='del'>-                if (!this_location)</div><div class='del'>-                        goto out;</div><div class='del'>-</div><div class='del'>-                ret = pthread_setspecific (this_xlator_key, this_location);</div><div class='del'>-                if (ret != 0) {</div><div class='del'>-                        FREE (this_location);</div><div class='del'>-                        this_location = NULL;</div><div class='del'>-                        goto out;</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='del'>-out:</div><div class='del'>-        if (this_location) {</div><div class='del'>-                if (!*this_location)</div><div class='del'>-                        *this_location = &amp;global_xlator;</div><div class='del'>-        }</div><div class='del'>-        return this_location;</div><div class='add'>+    global_xlator.name = "glusterfs";</div><div class='add'>+    global_xlator.type = GF_GLOBAL_XLATOR_NAME;</div><div class='add'>+    global_xlator.cbks = &amp;global_cbks;</div><div class='add'>+    global_xlator.fops = &amp;global_fops;</div><div class='add'>+    global_xlator.reconfigure = global_xl_reconfigure;</div><div class='add'>+    global_xlator.init = global_xl_init;</div><div class='add'>+    global_xlator.fini = global_xl_fini;</div><div class='add'>+</div><div class='add'>+    INIT_LIST_HEAD(&amp;global_xlator.volume_options);</div><div class='add'>+    INIT_LIST_HEAD(&amp;global_xl_opt_list.list);</div><div class='add'>+    global_xl_opt_list.given_opt = global_xl_options;</div><div class='add'>+</div><div class='add'>+    list_add_tail(&amp;global_xl_opt_list.list, &amp;global_xlator.volume_options);</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='del'>-xlator_t *</div><div class='del'>-glusterfs_this_get ()</div><div class='add'>+xlator_t **</div><div class='add'>+__glusterfs_this_location()</div><div class='ctx'> {</div><div class='del'>-        xlator_t **this_location = NULL;</div><div class='add'>+    xlator_t **this_location;</div><div class='ctx'> </div><div class='del'>-        this_location = __glusterfs_this_location ();</div><div class='del'>-        if (!this_location)</div><div class='del'>-                return &amp;global_xlator;</div><div class='add'>+    this_location = &amp;thread_xlator;</div><div class='add'>+    if (*this_location == NULL) {</div><div class='add'>+        thread_xlator = &amp;global_xlator;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        return *this_location;</div><div class='add'>+    return this_location;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-glusterfs_this_set (xlator_t *this)</div><div class='add'>+xlator_t *</div><div class='add'>+glusterfs_this_get()</div><div class='ctx'> {</div><div class='del'>-        xlator_t **this_location = NULL;</div><div class='del'>-</div><div class='del'>-        this_location = __glusterfs_this_location ();</div><div class='del'>-        if (!this_location)</div><div class='del'>-                return -ENOMEM;</div><div class='del'>-</div><div class='del'>-        *this_location = this;</div><div class='del'>-</div><div class='del'>-        return 0;</div><div class='add'>+    return *__glusterfs_this_location();</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='del'>-/* IS_CENTRAL_LOG */</div><div class='del'>-</div><div class='del'>-static pthread_key_t central_log_flag_key;</div><div class='del'>-</div><div class='ctx'> void</div><div class='del'>-glusterfs_central_log_flag_destroy (void *ptr)</div><div class='add'>+glusterfs_this_set(xlator_t *this)</div><div class='ctx'> {</div><div class='del'>-        if (ptr)</div><div class='del'>-                FREE (ptr);</div><div class='add'>+    thread_xlator = this;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+/* SYNCOPCTX */</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-glusterfs_central_log_flag_init ()</div><div class='add'>+void *</div><div class='add'>+syncopctx_getctx()</div><div class='ctx'> {</div><div class='del'>-        int ret = 0;</div><div class='del'>-</div><div class='del'>-        ret = pthread_key_create (&amp;central_log_flag_key,</div><div class='del'>-                                  glusterfs_central_log_flag_destroy);</div><div class='del'>-</div><div class='del'>-        if (ret != 0) {</div><div class='del'>-                return ret;</div><div class='del'>-        }</div><div class='add'>+    return &amp;thread_syncopctx;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        pthread_setspecific (central_log_flag_key, (void *) 0);</div><div class='add'>+/* SYNCTASK */</div><div class='ctx'> </div><div class='del'>-        return ret;</div><div class='add'>+void *</div><div class='add'>+synctask_get()</div><div class='add'>+{</div><div class='add'>+    return thread_synctask;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> void</div><div class='del'>-glusterfs_central_log_flag_set ()</div><div class='add'>+synctask_set(void *synctask)</div><div class='ctx'> {</div><div class='del'>-        pthread_setspecific (central_log_flag_key, (void *) 1);</div><div class='add'>+    thread_synctask = synctask;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+// UUID_BUFFER</div><div class='ctx'> </div><div class='del'>-long</div><div class='del'>-glusterfs_central_log_flag_get ()</div><div class='add'>+char *</div><div class='add'>+glusterfs_uuid_buf_get()</div><div class='ctx'> {</div><div class='del'>-        long flag = 0;</div><div class='del'>-</div><div class='del'>-        flag = (long) pthread_getspecific (central_log_flag_key);</div><div class='del'>-</div><div class='del'>-        return flag;</div><div class='add'>+    return thread_uuid_buf;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+/* LKOWNER_BUFFER */</div><div class='ctx'> </div><div class='del'>-void</div><div class='del'>-glusterfs_central_log_flag_unset ()</div><div class='add'>+char *</div><div class='add'>+glusterfs_lkowner_buf_get()</div><div class='ctx'> {</div><div class='del'>-        pthread_setspecific (central_log_flag_key, (void *) 0);</div><div class='add'>+    return thread_lkowner_buf;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+/* Leaseid buffer */</div><div class='ctx'> </div><div class='del'>-</div><div class='del'>-/* SYNCTASK */</div><div class='del'>-</div><div class='del'>-static pthread_key_t synctask_key;</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-synctask_init ()</div><div class='add'>+char *</div><div class='add'>+glusterfs_leaseid_buf_get()</div><div class='ctx'> {</div><div class='del'>-        int  ret = 0;</div><div class='add'>+    char *buf = NULL;</div><div class='ctx'> </div><div class='del'>-        ret = pthread_key_create (&amp;synctask_key, NULL);</div><div class='add'>+    buf = thread_leaseid;</div><div class='add'>+    if (buf == NULL) {</div><div class='add'>+        buf = thread_leaseid_buf;</div><div class='add'>+        thread_leaseid = buf;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        return ret;</div><div class='add'>+    return buf;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='del'>-void *</div><div class='del'>-synctask_get ()</div><div class='add'>+char *</div><div class='add'>+glusterfs_leaseid_exist()</div><div class='ctx'> {</div><div class='del'>-        void   *synctask = NULL;</div><div class='add'>+    return thread_leaseid;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        synctask = pthread_getspecific (synctask_key);</div><div class='add'>+static void</div><div class='add'>+glusterfs_cleanup(void *ptr)</div><div class='add'>+{</div><div class='add'>+    if (thread_syncopctx.groups != NULL) {</div><div class='add'>+        GF_FREE(thread_syncopctx.groups);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        return synctask;</div><div class='add'>+    mem_pool_thread_destructor(NULL);</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+void</div><div class='add'>+gf_thread_needs_cleanup(void)</div><div class='add'>+{</div><div class='add'>+    /* The value stored in free_key TLS is not really used for anything, but</div><div class='add'>+     * pthread implementation doesn't call the TLS destruction function unless</div><div class='add'>+     * it's != NULL. This function must be called whenever something is</div><div class='add'>+     * allocated for this thread so that glusterfs_cleanup() will be called</div><div class='add'>+     * and resources can be released. */</div><div class='add'>+    (void)pthread_setspecific(free_key, (void *)1);</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-synctask_set (void *synctask)</div><div class='add'>+static void</div><div class='add'>+gf_globals_init_once()</div><div class='ctx'> {</div><div class='del'>-        int     ret = 0;</div><div class='add'>+    int ret = 0;</div><div class='ctx'> </div><div class='del'>-        pthread_setspecific (synctask_key, synctask);</div><div class='add'>+    glusterfs_this_init();</div><div class='ctx'> </div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='add'>+    /* This is needed only to cleanup the potential allocation of</div><div class='add'>+     * thread_syncopctx.groups. */</div><div class='add'>+    ret = pthread_key_create(&amp;free_key, glusterfs_cleanup);</div><div class='add'>+    if (ret != 0) {</div><div class='add'>+        gf_msg("", GF_LOG_ERROR, ret, LG_MSG_PTHREAD_KEY_CREATE_FAILED,</div><div class='add'>+               "failed to create the pthread key");</div><div class='ctx'> </div><div class='add'>+        gf_msg("", GF_LOG_CRITICAL, 0, LG_MSG_GLOBAL_INIT_FAILED,</div><div class='add'>+               "Exiting as global initialization failed");</div><div class='add'>+</div><div class='add'>+        exit(ret);</div><div class='add'>+    }</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-glusterfs_globals_init ()</div><div class='add'>+glusterfs_globals_init(glusterfs_ctx_t *ctx)</div><div class='ctx'> {</div><div class='del'>-        int ret = 0;</div><div class='add'>+    int ret = 0;</div><div class='ctx'> </div><div class='del'>-        gf_op_list_init ();</div><div class='add'>+    gf_log_globals_init(ctx, GF_LOG_INFO);</div><div class='ctx'> </div><div class='del'>-        ret = glusterfs_ctx_init ();</div><div class='del'>-        if (ret)</div><div class='del'>-                goto out;</div><div class='add'>+    ret = pthread_once(&amp;globals_inited, gf_globals_init_once);</div><div class='ctx'> </div><div class='del'>-        ret = glusterfs_this_init ();</div><div class='del'>-        if (ret)</div><div class='del'>-                goto out;</div><div class='add'>+    if (ret)</div><div class='add'>+        gf_msg("", GF_LOG_CRITICAL, ret, LG_MSG_PTHREAD_FAILED,</div><div class='add'>+               "pthread_once failed");</div><div class='ctx'> </div><div class='del'>-        ret = glusterfs_central_log_flag_init ();</div><div class='del'>-        if (ret)</div><div class='del'>-                goto out;</div><div class='del'>-</div><div class='del'>-        gf_mem_acct_enable_set ();</div><div class='del'>-</div><div class='del'>-        ret = synctask_init ();</div><div class='del'>-        if (ret)</div><div class='del'>-                goto out;</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        return ret;</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='head'>diff --git a/libglusterfs/src/globals.h b/libglusterfs/src/globals.h<br/>deleted file mode 100644<br/>index bdd9e891046..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/libglusterfs/src/globals.h?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/globals.h</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,58 +0,0 @@</div><div class='del'>-/*</div><div class='del'>-   Copyright (c) 2009 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='del'>-   This file is part of GlusterFS.</div><div class='del'>-</div><div class='del'>-   GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-   it under the terms of the GNU General Public License as published</div><div class='del'>-   by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-   or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-   GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-   WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-   General Public License for more details.</div><div class='del'>-</div><div class='del'>-   You should have received a copy of the GNU General Public License</div><div class='del'>-   along with this program.  If not, see</div><div class='del'>-   &lt;http://www.gnu.org/licenses/&gt;.</div><div class='del'>-*/</div><div class='del'>-</div><div class='del'>-#ifndef _GLOBALS_H</div><div class='del'>-#define _GLOBALS_H</div><div class='del'>-</div><div class='del'>-/* This corresponds to the max 16 number of group IDs that are sent through an</div><div class='del'>- * RPC request. Since NFS is the only one going to set this, we can be safe</div><div class='del'>- * in keeping this size hardcoded.</div><div class='del'>- */</div><div class='del'>-#define GF_REQUEST_MAXGROUPS    16</div><div class='del'>-</div><div class='del'>-#include "glusterfs.h"</div><div class='del'>-</div><div class='del'>-/* CTX */</div><div class='del'>-#define CTX (glusterfs_ctx_get())</div><div class='del'>-</div><div class='del'>-glusterfs_ctx_t *glusterfs_ctx_get ();</div><div class='del'>-</div><div class='del'>-#include "xlator.h"</div><div class='del'>-</div><div class='del'>-/* THIS */</div><div class='del'>-#define THIS (*__glusterfs_this_location())</div><div class='del'>-</div><div class='del'>-xlator_t **__glusterfs_this_location ();</div><div class='del'>-xlator_t *glusterfs_this_get ();</div><div class='del'>-int glusterfs_this_set (xlator_t *);</div><div class='del'>-</div><div class='del'>-/* central log */</div><div class='del'>-</div><div class='del'>-void glusterfs_central_log_flag_set ();</div><div class='del'>-long glusterfs_central_log_flag_get ();</div><div class='del'>-void glusterfs_central_log_flag_unset ();</div><div class='del'>-</div><div class='del'>-/* task */</div><div class='del'>-void *synctask_get ();</div><div class='del'>-int synctask_set (void *);</div><div class='del'>-</div><div class='del'>-/* init */</div><div class='del'>-int glusterfs_globals_init (void);</div><div class='del'>-</div><div class='del'>-#endif /* !_GLOBALS_H */</div><div class='head'>diff --git a/libglusterfs/src/glusterfs.h b/libglusterfs/src/glusterfs.h<br/>deleted file mode 100644<br/>index 1d0369c4d61..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/libglusterfs/src/glusterfs.h?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/glusterfs.h</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,313 +0,0 @@</div><div class='del'>-/*</div><div class='del'>-   Copyright (c) 2006-2009 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='del'>-   This file is part of GlusterFS.</div><div class='del'>-</div><div class='del'>-   GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-   it under the terms of the GNU General Public License as published</div><div class='del'>-   by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-   or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-   GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-   WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-   General Public License for more details.</div><div class='del'>-</div><div class='del'>-   You should have received a copy of the GNU General Public License</div><div class='del'>-   along with this program.  If not, see</div><div class='del'>-   &lt;http://www.gnu.org/licenses/&gt;.</div><div class='del'>-*/</div><div class='del'>-</div><div class='del'>-#ifndef _GLUSTERFS_H</div><div class='del'>-#define _GLUSTERFS_H</div><div class='del'>-</div><div class='del'>-#ifndef _CONFIG_H</div><div class='del'>-#define _CONFIG_H</div><div class='del'>-#include "config.h"</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-#include &lt;stdio.h&gt;</div><div class='del'>-#include &lt;string.h&gt;</div><div class='del'>-#include &lt;stdlib.h&gt;</div><div class='del'>-#include &lt;netinet/in.h&gt;</div><div class='del'>-#include &lt;sys/socket.h&gt;</div><div class='del'>-#include &lt;sys/types.h&gt;</div><div class='del'>-#include &lt;sys/stat.h&gt;</div><div class='del'>-#include &lt;sys/statvfs.h&gt;</div><div class='del'>-#include &lt;netdb.h&gt;</div><div class='del'>-#include &lt;errno.h&gt;</div><div class='del'>-#include &lt;dirent.h&gt;</div><div class='del'>-#include &lt;unistd.h&gt;</div><div class='del'>-#include &lt;fcntl.h&gt;</div><div class='del'>-#include &lt;arpa/inet.h&gt;</div><div class='del'>-#include &lt;sys/poll.h&gt;</div><div class='del'>-#include &lt;pthread.h&gt;</div><div class='del'>-</div><div class='del'>-#include "list.h"</div><div class='del'>-#include "logging.h"</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-#define GF_YES 1</div><div class='del'>-#define GF_NO  0</div><div class='del'>-</div><div class='del'>-#ifndef O_LARGEFILE</div><div class='del'>-/* savannah bug #20053, patch for compiling on darwin */</div><div class='del'>-#define O_LARGEFILE 0</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-#ifndef O_DIRECT</div><div class='del'>-/* savannah bug #20050, #20052 */</div><div class='del'>-#define O_DIRECT 0 /* From asm/fcntl.h */</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-#ifndef O_DIRECTORY</div><div class='del'>-/* FreeBSD does not need O_DIRECTORY */</div><div class='del'>-#define O_DIRECTORY 0</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-#define GF_XATTR_PATHINFO_KEY   "trusted.glusterfs.pathinfo"</div><div class='del'>-#define GF_XATTR_LINKINFO_KEY   "trusted.distribute.linkinfo"</div><div class='del'>-</div><div class='del'>-#define ZR_FILE_CONTENT_STR     "glusterfs.file."</div><div class='del'>-#define ZR_FILE_CONTENT_STRLEN 15</div><div class='del'>-</div><div class='del'>-#define GLUSTERFS_OPEN_FD_COUNT "glusterfs.open-fd-count"</div><div class='del'>-#define GLUSTERFS_INODELK_COUNT "glusterfs.inodelk-count"</div><div class='del'>-#define GLUSTERFS_ENTRYLK_COUNT "glusterfs.entrylk-count"</div><div class='del'>-#define GLUSTERFS_POSIXLK_COUNT "glusterfs.posixlk-count"</div><div class='del'>-</div><div class='del'>-#define ZR_FILE_CONTENT_REQUEST(key) (!strncmp(key, ZR_FILE_CONTENT_STR, \</div><div class='del'>-					       ZR_FILE_CONTENT_STRLEN))</div><div class='del'>-</div><div class='del'>-/* TODO: Should we use PATH-MAX? On some systems it may save space */</div><div class='del'>-#define ZR_PATH_MAX 4096</div><div class='del'>-</div><div class='del'>-/* NOTE: add members ONLY at the end (just before _MAXVALUE) */</div><div class='del'>-typedef enum {</div><div class='del'>-        GF_FOP_NULL = 0,</div><div class='del'>-        GF_FOP_STAT,</div><div class='del'>-        GF_FOP_READLINK,</div><div class='del'>-        GF_FOP_MKNOD,</div><div class='del'>-        GF_FOP_MKDIR,</div><div class='del'>-        GF_FOP_UNLINK,</div><div class='del'>-        GF_FOP_RMDIR,</div><div class='del'>-        GF_FOP_SYMLINK,</div><div class='del'>-        GF_FOP_RENAME,</div><div class='del'>-        GF_FOP_LINK,</div><div class='del'>-        GF_FOP_TRUNCATE,</div><div class='del'>-        GF_FOP_OPEN,</div><div class='del'>-        GF_FOP_READ,</div><div class='del'>-        GF_FOP_WRITE,</div><div class='del'>-        GF_FOP_STATFS,</div><div class='del'>-        GF_FOP_FLUSH,</div><div class='del'>-        GF_FOP_FSYNC,      /* 15 */</div><div class='del'>-        GF_FOP_SETXATTR,</div><div class='del'>-        GF_FOP_GETXATTR,</div><div class='del'>-        GF_FOP_REMOVEXATTR,</div><div class='del'>-        GF_FOP_OPENDIR,</div><div class='del'>-        GF_FOP_FSYNCDIR,</div><div class='del'>-        GF_FOP_ACCESS,</div><div class='del'>-        GF_FOP_CREATE,</div><div class='del'>-        GF_FOP_FTRUNCATE,</div><div class='del'>-        GF_FOP_FSTAT,      /* 25 */</div><div class='del'>-        GF_FOP_LK,</div><div class='del'>-        GF_FOP_LOOKUP,</div><div class='del'>-        GF_FOP_READDIR,</div><div class='del'>-        GF_FOP_INODELK,</div><div class='del'>-        GF_FOP_FINODELK,</div><div class='del'>-	GF_FOP_ENTRYLK,</div><div class='del'>-	GF_FOP_FENTRYLK,</div><div class='del'>-        GF_FOP_XATTROP,</div><div class='del'>-        GF_FOP_FXATTROP,</div><div class='del'>-        GF_FOP_FGETXATTR,</div><div class='del'>-        GF_FOP_FSETXATTR,</div><div class='del'>-        GF_FOP_RCHECKSUM,</div><div class='del'>-        GF_FOP_SETATTR,</div><div class='del'>-        GF_FOP_FSETATTR,</div><div class='del'>-        GF_FOP_READDIRP,</div><div class='del'>-        GF_FOP_FORGET,</div><div class='del'>-        GF_FOP_RELEASE,</div><div class='del'>-        GF_FOP_RELEASEDIR,</div><div class='del'>-        GF_FOP_GETSPEC,</div><div class='del'>-        GF_FOP_MAXVALUE,</div><div class='del'>-} glusterfs_fop_t;</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-typedef enum {</div><div class='del'>-        GF_MGMT_NULL = 0,</div><div class='del'>-        GF_MGMT_MAXVALUE,</div><div class='del'>-} glusterfs_mgmt_t;</div><div class='del'>-</div><div class='del'>-typedef enum {</div><div class='del'>-        GF_OP_TYPE_NULL = 0,</div><div class='del'>-        GF_OP_TYPE_FOP,</div><div class='del'>-        GF_OP_TYPE_MGMT,</div><div class='del'>-        GF_OP_TYPE_MAX,</div><div class='del'>-} gf_op_type_t;</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-/* NOTE: all the miscellaneous flags used by GlusterFS should be listed here */</div><div class='del'>-typedef enum {</div><div class='del'>-        GF_LK_GETLK = 0,</div><div class='del'>-        GF_LK_SETLK,</div><div class='del'>-        GF_LK_SETLKW,</div><div class='del'>-} glusterfs_lk_cmds_t;</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-typedef enum {</div><div class='del'>-        GF_LK_F_RDLCK = 0,</div><div class='del'>-        GF_LK_F_WRLCK,</div><div class='del'>-        GF_LK_F_UNLCK</div><div class='del'>-} glusterfs_lk_types_t;</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-typedef enum {</div><div class='del'>-        GF_LOCK_POSIX,</div><div class='del'>-        GF_LOCK_INTERNAL</div><div class='del'>-} gf_lk_domain_t;</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-typedef enum {</div><div class='del'>-	ENTRYLK_LOCK,</div><div class='del'>-	ENTRYLK_UNLOCK,</div><div class='del'>-	ENTRYLK_LOCK_NB</div><div class='del'>-} entrylk_cmd;</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-typedef enum {</div><div class='del'>-	ENTRYLK_RDLCK,</div><div class='del'>-	ENTRYLK_WRLCK</div><div class='del'>-} entrylk_type;</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-typedef enum {</div><div class='del'>-	GF_XATTROP_ADD_ARRAY,</div><div class='del'>-} gf_xattrop_flags_t;</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-#define GF_SET_IF_NOT_PRESENT 0x1 /* default behaviour */</div><div class='del'>-#define GF_SET_OVERWRITE      0x2 /* Overwrite with the buf given */</div><div class='del'>-#define GF_SET_DIR_ONLY       0x4</div><div class='del'>-#define GF_SET_EPOCH_TIME     0x8 /* used by afr dir lookup selfheal */</div><div class='del'>-</div><div class='del'>-/* Directory into which replicate self-heal will move deleted files and</div><div class='del'>-   directories into. The storage/posix janitor thread will periodically</div><div class='del'>-   clean up this directory */</div><div class='del'>-</div><div class='del'>-#define GF_REPLICATE_TRASH_DIR          ".landfill"</div><div class='del'>-</div><div class='del'>-/* key value which quick read uses to get small files in lookup cbk */</div><div class='del'>-#define GF_CONTENT_KEY "glusterfs.content"</div><div class='del'>-</div><div class='del'>-struct _xlator_cmdline_option {</div><div class='del'>-	struct list_head    cmd_args;</div><div class='del'>-	char               *volume;</div><div class='del'>-	char               *key;</div><div class='del'>-	char               *value;</div><div class='del'>-};</div><div class='del'>-typedef struct _xlator_cmdline_option xlator_cmdline_option_t;</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-#define GF_OPTION_ENABLE   _gf_true</div><div class='del'>-#define GF_OPTION_DISABLE  _gf_false</div><div class='del'>-#define GF_OPTION_DEFERRED 2</div><div class='del'>-</div><div class='del'>-struct _cmd_args {</div><div class='del'>-	/* basic options */</div><div class='del'>-	char            *volfile_server;</div><div class='del'>-	char            *volfile;</div><div class='del'>-        char            *log_server;</div><div class='del'>-	gf_loglevel_t    log_level;</div><div class='del'>-	char            *log_file;</div><div class='del'>-        int32_t          max_connect_attempts;</div><div class='del'>-	/* advanced options */</div><div class='del'>-	uint32_t         volfile_server_port;</div><div class='del'>-	char            *volfile_server_transport;</div><div class='del'>-        uint32_t         log_server_port;</div><div class='del'>-	char            *pid_file;</div><div class='del'>-	int              no_daemon_mode;</div><div class='del'>-	char            *run_id;</div><div class='del'>-	int              debug_mode;</div><div class='del'>-        int              read_only;</div><div class='del'>-        int              mac_compat;</div><div class='del'>-	struct list_head xlator_options;  /* list of xlator_option_t */</div><div class='del'>-</div><div class='del'>-	/* fuse options */</div><div class='del'>-	int              fuse_direct_io_mode;</div><div class='del'>-        int              volfile_check;</div><div class='del'>-	double           fuse_entry_timeout;</div><div class='del'>-	double           fuse_attribute_timeout;</div><div class='del'>-	char            *volume_name;</div><div class='del'>-	int              fuse_nodev;</div><div class='del'>-	int              fuse_nosuid;</div><div class='del'>-	char            *dump_fuse;</div><div class='del'>-</div><div class='del'>-	/* key args */</div><div class='del'>-	char            *mount_point;</div><div class='del'>-	char            *volfile_id;</div><div class='del'>-</div><div class='del'>-        /* required for portmap */</div><div class='del'>-        int             brick_port;</div><div class='del'>-        char           *brick_name;</div><div class='del'>-};</div><div class='del'>-typedef struct _cmd_args cmd_args_t;</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-struct _glusterfs_graph {</div><div class='del'>-        struct list_head          list;</div><div class='del'>-        char                      graph_uuid[128];</div><div class='del'>-        struct timeval            dob;</div><div class='del'>-        void                     *first;</div><div class='del'>-        void                     *top;   /* selected by -n */</div><div class='del'>-        int                       xl_count;</div><div class='del'>-        uint32_t                  volfile_checksum;</div><div class='del'>-};</div><div class='del'>-typedef struct _glusterfs_graph glusterfs_graph_t;</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-struct _glusterfs_ctx {</div><div class='del'>-	cmd_args_t          cmd_args;</div><div class='del'>-	char               *process_uuid;</div><div class='del'>-	FILE               *pidfp;</div><div class='del'>-	char                fin;</div><div class='del'>-	void               *timer;</div><div class='del'>-	void               *ib;</div><div class='del'>-	void               *pool;</div><div class='del'>-	void               *event_pool;</div><div class='del'>-        void               *iobuf_pool;</div><div class='del'>-	pthread_mutex_t     lock;</div><div class='del'>-        size_t              page_size;</div><div class='del'>-        struct list_head    graphs; /* double linked list of graphs - one per volfile parse */</div><div class='del'>-        glusterfs_graph_t  *active; /* the latest graph in use */</div><div class='del'>-        void               *master; /* fuse, or libglusterfsclient (however, not protocol/server) */</div><div class='del'>-        void               *mgmt;   /* xlator implementing MOPs for centralized logging, volfile server */</div><div class='del'>-        unsigned char       measure_latency; /* toggle switch for latency measurement */</div><div class='del'>-        pthread_t           sigwaiter;</div><div class='del'>-        struct mem_pool    *stub_mem_pool;</div><div class='del'>-</div><div class='del'>-};</div><div class='del'>-typedef struct _glusterfs_ctx glusterfs_ctx_t;</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-typedef enum {</div><div class='del'>-        GF_EVENT_PARENT_UP = 1,</div><div class='del'>-        GF_EVENT_POLLIN,</div><div class='del'>-        GF_EVENT_POLLOUT,</div><div class='del'>-        GF_EVENT_POLLERR,</div><div class='del'>-        GF_EVENT_CHILD_UP,</div><div class='del'>-        GF_EVENT_CHILD_DOWN,</div><div class='del'>-        GF_EVENT_CHILD_CONNECTING,</div><div class='del'>-        GF_EVENT_TRANSPORT_CLEANUP,</div><div class='del'>-        GF_EVENT_TRANSPORT_CONNECTED,</div><div class='del'>-        GF_EVENT_VOLFILE_MODIFIED,</div><div class='del'>-        GF_EVENT_GRAPH_NEW,</div><div class='del'>-} glusterfs_event_t;</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-#define GF_MUST_CHECK __attribute__((warn_unused_result))</div><div class='del'>-</div><div class='del'>-int glusterfs_graph_prepare (glusterfs_graph_t *graph, glusterfs_ctx_t *ctx);</div><div class='del'>-int glusterfs_graph_destroy (glusterfs_graph_t *graph);</div><div class='del'>-int glusterfs_graph_activate (glusterfs_graph_t *graph, glusterfs_ctx_t *ctx);</div><div class='del'>-glusterfs_graph_t *glusterfs_graph_construct (FILE *fp);</div><div class='del'>-glusterfs_graph_t *glusterfs_graph_new ();</div><div class='del'>-#endif /* _GLUSTERFS_H */</div><div class='head'>diff --git a/libglusterfs/src/glusterfs/async.h b/libglusterfs/src/glusterfs/async.h<br/>new file mode 100644<br/>index 00000000000..d1d70ae0bc7<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/libglusterfs/src/glusterfs/async.h?id=d1d7a6f35c816822fab51c820e25023863c239c1'>libglusterfs/src/glusterfs/async.h</a></div><div class='hunk'>@@ -0,0 +1,209 @@</div><div class='add'>+/*</div><div class='add'>+  Copyright (c) 2019 Red Hat, Inc &lt;https://www.redhat.com&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#ifndef __GLUSTERFS_ASYNC_H__</div><div class='add'>+#define __GLUSTERFS_ASYNC_H__</div><div class='add'>+</div><div class='add'>+#define _LGPL_SOURCE</div><div class='add'>+</div><div class='add'>+#include &lt;sys/types.h&gt;</div><div class='add'>+#include &lt;signal.h&gt;</div><div class='add'>+#include &lt;errno.h&gt;</div><div class='add'>+</div><div class='add'>+#ifdef URCU_OLD</div><div class='add'>+</div><div class='add'>+/* TODO: Fix the include paths. Since this is a .h included from many places</div><div class='add'>+ *       it makes no sense to append a '-I$(CONTRIBDIR)/userspace-rcu/' to each</div><div class='add'>+ *       Makefile.am. I've also seen some problems with CI builders (they</div><div class='add'>+ *       failed to find the include files, but the same source on another setup</div><div class='add'>+ *       is working fine). */</div><div class='add'>+#include "wfcqueue.h"</div><div class='add'>+#include "wfstack.h"</div><div class='add'>+</div><div class='add'>+#else /* !URCU_OLD */</div><div class='add'>+</div><div class='add'>+#include &lt;urcu/wfcqueue.h&gt;</div><div class='add'>+#include &lt;urcu/wfstack.h&gt;</div><div class='add'>+</div><div class='add'>+#endif /* URCU_OLD */</div><div class='add'>+</div><div class='add'>+#include "glusterfs/xlator.h"</div><div class='add'>+#include "glusterfs/common-utils.h"</div><div class='add'>+#include "glusterfs/list.h"</div><div class='add'>+#include "glusterfs/libglusterfs-messages.h"</div><div class='add'>+</div><div class='add'>+/* This is the name prefix that all worker threads will have. A number will</div><div class='add'>+ * be added to differentiate them. */</div><div class='add'>+#define GF_ASYNC_THREAD_NAME "tpw"</div><div class='add'>+</div><div class='add'>+/* This value determines the maximum number of threads that are allowed. */</div><div class='add'>+#define GF_ASYNC_MAX_THREADS 128</div><div class='add'>+</div><div class='add'>+/* This value determines how many additional threads will be started but will</div><div class='add'>+ * remain inactive until they are explicitly activated by the leader. This is</div><div class='add'>+ * useful to react faster to bursts of load, but at the same time we minimize</div><div class='add'>+ * contention if they are not really needed to handle current load.</div><div class='add'>+ *</div><div class='add'>+ * TODO: Instead of a fixed number, it would probably be better to use a</div><div class='add'>+ *       prcentage of the available cores. */</div><div class='add'>+#define GF_ASYNC_SPARE_THREADS 2</div><div class='add'>+</div><div class='add'>+/* This value determines the signal used to wake the leader when new work has</div><div class='add'>+ * been added to the queue. To do so we reuse SIGALRM, since the most logical</div><div class='add'>+ * candidates (SIGUSR1/SIGUSR2) are already used. This signal must not be used</div><div class='add'>+ * by anything else in the process. */</div><div class='add'>+#define GF_ASYNC_SIGQUEUE SIGALRM</div><div class='add'>+</div><div class='add'>+/* This value determines the signal that will be used to transfer leader role</div><div class='add'>+ * to other workers. */</div><div class='add'>+#define GF_ASYNC_SIGCTRL SIGVTALRM</div><div class='add'>+</div><div class='add'>+#define gf_async_warning(_err, _msg, _args...)                                 \</div><div class='add'>+    gf_msg("async", GF_LOG_WARNING, -(_err), LG_MSG_ASYNC_WARNING, _msg,       \</div><div class='add'>+           ##_args)</div><div class='add'>+</div><div class='add'>+#define gf_async_error(_err, _msg, _args...)                                   \</div><div class='add'>+    gf_msg("async", GF_LOG_ERROR, -(_err), LG_MSG_ASYNC_FAILURE, _msg, ##_args)</div><div class='add'>+</div><div class='add'>+#define gf_async_fatal(_err, _msg, _args...)                                   \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        GF_ABORT("Critical error in async module. Unable to continue. (" _msg  \</div><div class='add'>+                 "). Error %d.",                                               \</div><div class='add'>+                 ##_args, -(_err));                                            \</div><div class='add'>+    } while (0)</div><div class='add'>+</div><div class='add'>+struct _gf_async;</div><div class='add'>+typedef struct _gf_async gf_async_t;</div><div class='add'>+</div><div class='add'>+struct _gf_async_worker;</div><div class='add'>+typedef struct _gf_async_worker gf_async_worker_t;</div><div class='add'>+</div><div class='add'>+struct _gf_async_queue;</div><div class='add'>+typedef struct _gf_async_queue gf_async_queue_t;</div><div class='add'>+</div><div class='add'>+struct _gf_async_control;</div><div class='add'>+typedef struct _gf_async_control gf_async_control_t;</div><div class='add'>+</div><div class='add'>+typedef void (*gf_async_callback_f)(xlator_t *xl, gf_async_t *async);</div><div class='add'>+</div><div class='add'>+struct _gf_async {</div><div class='add'>+    /* TODO: remove dependency on xl/THIS. */</div><div class='add'>+    xlator_t *xl;</div><div class='add'>+    gf_async_callback_f cbk;</div><div class='add'>+    struct cds_wfcq_node queue;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct _gf_async_worker {</div><div class='add'>+    /* Used to send asynchronous jobs related to the worker. */</div><div class='add'>+    gf_async_t async;</div><div class='add'>+</div><div class='add'>+    /* Member of the available workers stack. */</div><div class='add'>+    struct cds_wfs_node stack;</div><div class='add'>+</div><div class='add'>+    /* Thread object of the current worker. */</div><div class='add'>+    pthread_t thread;</div><div class='add'>+</div><div class='add'>+    /* Unique identifier of this worker. */</div><div class='add'>+    int32_t id;</div><div class='add'>+</div><div class='add'>+    /* Indicates if this worker is enabled. */</div><div class='add'>+    bool running;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct _gf_async_queue {</div><div class='add'>+    /* Structures needed to manage a wait-free queue. For better performance</div><div class='add'>+     * they are placed in two different cache lines, as recommended by URCU</div><div class='add'>+     * documentation, even though in our case some threads will be producers</div><div class='add'>+     * and consumers at the same time. */</div><div class='add'>+    struct cds_wfcq_head head __attribute__((aligned(64)));</div><div class='add'>+    struct cds_wfcq_tail tail __attribute__((aligned(64)));</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+#define GF_ASYNC_COUNTS(_run, _stop) (((uint32_t)(_run) &lt;&lt; 16) + (_stop))</div><div class='add'>+#define GF_ASYNC_COUNT_RUNNING(_count) ((_count) &gt;&gt; 16)</div><div class='add'>+#define GF_ASYNC_COUNT_STOPPING(_count) ((_count)&amp;65535)</div><div class='add'>+</div><div class='add'>+struct _gf_async_control {</div><div class='add'>+    gf_async_queue_t queue;</div><div class='add'>+</div><div class='add'>+    /* Stack of unused workers. */</div><div class='add'>+    struct __cds_wfs_stack available;</div><div class='add'>+</div><div class='add'>+    /* Array of preallocated worker structures. */</div><div class='add'>+    gf_async_worker_t *table;</div><div class='add'>+</div><div class='add'>+    /* Used to synchronize main thread with workers on termination. */</div><div class='add'>+    pthread_barrier_t sync;</div><div class='add'>+</div><div class='add'>+    /* The id of the last thread that will be used for synchronization. */</div><div class='add'>+    pthread_t sync_thread;</div><div class='add'>+</div><div class='add'>+    /* Signal mask to wait for control signals from leader. */</div><div class='add'>+    sigset_t sigmask_ctrl;</div><div class='add'>+</div><div class='add'>+    /* Signal mask to wait for queued items. */</div><div class='add'>+    sigset_t sigmask_queue;</div><div class='add'>+</div><div class='add'>+    /* Saved signal handlers. */</div><div class='add'>+    struct sigaction handler_ctrl;</div><div class='add'>+    struct sigaction handler_queue;</div><div class='add'>+</div><div class='add'>+    /* PID of the current process. */</div><div class='add'>+    pid_t pid;</div><div class='add'>+</div><div class='add'>+    /* Maximum number of allowed threads. */</div><div class='add'>+    uint32_t max_threads;</div><div class='add'>+</div><div class='add'>+    /* Current number of running and stopping workers. This value is split</div><div class='add'>+     * into 2 16-bits fields to track both counters atomically at the same</div><div class='add'>+     * time. */</div><div class='add'>+    uint32_t counts;</div><div class='add'>+</div><div class='add'>+    /* It's used to control whether the asynchronous infrastructure is used</div><div class='add'>+     * or not. */</div><div class='add'>+    bool enabled;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+extern gf_async_control_t gf_async_ctrl;</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+gf_async_init(glusterfs_ctx_t *ctx);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+gf_async_fini(void);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+gf_async_adjust_threads(int32_t threads);</div><div class='add'>+</div><div class='add'>+static inline void</div><div class='add'>+gf_async(gf_async_t *async, xlator_t *xl, gf_async_callback_f cbk)</div><div class='add'>+{</div><div class='add'>+    if (!gf_async_ctrl.enabled) {</div><div class='add'>+        cbk(xl, async);</div><div class='add'>+        return;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    async-&gt;xl = xl;</div><div class='add'>+    async-&gt;cbk = cbk;</div><div class='add'>+    cds_wfcq_node_init(&amp;async-&gt;queue);</div><div class='add'>+    if (caa_unlikely(!cds_wfcq_enqueue(&amp;gf_async_ctrl.queue.head,</div><div class='add'>+                                       &amp;gf_async_ctrl.queue.tail,</div><div class='add'>+                                       &amp;async-&gt;queue))) {</div><div class='add'>+        /* The queue was empty, so the leader could be sleeping. We need to</div><div class='add'>+         * wake it so that the new item can be processed. If the queue was not</div><div class='add'>+         * empty, we don't need to do anything special since the leader will</div><div class='add'>+         * take care of it. */</div><div class='add'>+        if (caa_unlikely(kill(gf_async_ctrl.pid, GF_ASYNC_SIGQUEUE) &lt; 0)) {</div><div class='add'>+            gf_async_fatal(errno, "Unable to wake leader worker.");</div><div class='add'>+        };</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#endif /* !__GLUSTERFS_ASYNC_H__ */</div><div class='head'>diff --git a/libglusterfs/src/glusterfs/atomic.h b/libglusterfs/src/glusterfs/atomic.h<br/>new file mode 100644<br/>index 00000000000..ced81748218<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/libglusterfs/src/glusterfs/atomic.h?id=d1d7a6f35c816822fab51c820e25023863c239c1'>libglusterfs/src/glusterfs/atomic.h</a></div><div class='hunk'>@@ -0,0 +1,459 @@</div><div class='add'>+/*</div><div class='add'>+  Copyright (c) 2017 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#ifndef _ATOMIC_H</div><div class='add'>+#define _ATOMIC_H</div><div class='add'>+</div><div class='add'>+#include &lt;inttypes.h&gt;</div><div class='add'>+#include &lt;stdbool.h&gt;</div><div class='add'>+</div><div class='add'>+#include "glusterfs/locking.h"</div><div class='add'>+</div><div class='add'>+/* Macros used to join two arguments and generate a new macro name. */</div><div class='add'>+#define GF_ATOMIC_MACRO_1(_macro) _macro</div><div class='add'>+#define GF_ATOMIC_MACRO(_base, _name) GF_ATOMIC_MACRO_1(_base##_name)</div><div class='add'>+</div><div class='add'>+/* There's a problem on 32-bit architectures when we try to use atomic</div><div class='add'>+ * builtins with 64-bit types. Only way to solve the problem is to use</div><div class='add'>+ * a mutex to protect the access to the atomic, but we don't want to</div><div class='add'>+ * use mutexes for other smaller types that could work with the atomic</div><div class='add'>+ * builtins.</div><div class='add'>+ *</div><div class='add'>+ * So on each atomic type we add a field for the mutex if atomic operation</div><div class='add'>+ * is not supported and a dummy zero size field if it's supported. This way</div><div class='add'>+ * we can have different atomic types, some with a mutex and some without.</div><div class='add'>+ *</div><div class='add'>+ * To define these types, we use two macros:</div><div class='add'>+ *</div><div class='add'>+ *     GF_ATOMIC_MUTEX_FIELD_0 = char lk[0]</div><div class='add'>+ *     GF_ATOMIC_MUTEX_FILED_1 = gf_lock_t lk</div><div class='add'>+ *</div><div class='add'>+ * Both macros define the 'lk' field that will be used in the atomic</div><div class='add'>+ * structure. One when the atomic is supported by the architecture and</div><div class='add'>+ * another when not. We need to define the field even if it won't be</div><div class='add'>+ * used. Otherwise the compiler will return an error.</div><div class='add'>+ *</div><div class='add'>+ * Now we need to take the mutex or not depending on the existence of</div><div class='add'>+ * the mutex field in the structure. To do so we check the size of the</div><div class='add'>+ * structure, and if it's bigger than uint64_t (all structures with a</div><div class='add'>+ * mutex will be bigger), we use the mutex-based version. Otherwise we</div><div class='add'>+ * use the atomic builtin. This check is easily optimized out by the</div><div class='add'>+ * compiler, leaving a clean and efficient compiled code. */</div><div class='add'>+</div><div class='add'>+#define GF_ATOMIC_MUTEX_FIELD_0 char lk[0]</div><div class='add'>+#define GF_ATOMIC_MUTEX_FIELD_1 gf_lock_t lk</div><div class='add'>+</div><div class='add'>+/* We'll use SIZEOF_LONG to determine the architecture. 32-bit machines</div><div class='add'>+ * will have 4 here, while 64-bit machines will have 8. If additional</div><div class='add'>+ * needs or restrictions appear on other platforms, these tests can be</div><div class='add'>+ * extended to handle them. */</div><div class='add'>+</div><div class='add'>+/* GF_ATOMIC_SIZE_X macros map each type size to one of the</div><div class='add'>+ * GF_ATOMIC_MUTEX_FIELD_X macros, depending on detected conditions. */</div><div class='add'>+</div><div class='add'>+#if defined(HAVE_ATOMIC_BUILTINS) || defined(HAVE_SYNC_BUILTINS)</div><div class='add'>+</div><div class='add'>+#define GF_ATOMIC_SIZE_1 GF_ATOMIC_MUTEX_FIELD_0</div><div class='add'>+#define GF_ATOMIC_SIZE_2 GF_ATOMIC_MUTEX_FIELD_0</div><div class='add'>+#define GF_ATOMIC_SIZE_4 GF_ATOMIC_MUTEX_FIELD_0</div><div class='add'>+</div><div class='add'>+#if SIZEOF_LONG &gt;= 8</div><div class='add'>+#define GF_ATOMIC_SIZE_8 GF_ATOMIC_MUTEX_FIELD_0</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#endif /* HAVE_(ATOMIC|SYNC)_BUILTINS */</div><div class='add'>+</div><div class='add'>+/* Any GF_ATOMIC_SIZE_X macro not yet defined will use the mutex version */</div><div class='add'>+#ifndef GF_ATOMIC_SIZE_1</div><div class='add'>+#define GF_ATOMIC_SIZE_1 GF_ATOMIC_MUTEX_FIELD_1</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#ifndef GF_ATOMIC_SIZE_2</div><div class='add'>+#define GF_ATOMIC_SIZE_2 GF_ATOMIC_MUTEX_FIELD_1</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#ifndef GF_ATOMIC_SIZE_4</div><div class='add'>+#define GF_ATOMIC_SIZE_4 GF_ATOMIC_MUTEX_FIELD_1</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#ifndef GF_ATOMIC_SIZE_8</div><div class='add'>+#define GF_ATOMIC_SIZE_8 GF_ATOMIC_MUTEX_FIELD_1</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+/* This macro is used to define all atomic types supported. First field</div><div class='add'>+ * represents the size of the type in bytes, and the second one the name. */</div><div class='add'>+#define GF_ATOMIC_TYPE(_size, _name)                                           \</div><div class='add'>+    typedef struct _gf_atomic_##_name##_t {                                    \</div><div class='add'>+        GF_ATOMIC_MACRO(GF_ATOMIC_SIZE_, _size);                               \</div><div class='add'>+        _name##_t value;                                                       \</div><div class='add'>+    } gf_atomic_##_name##_t</div><div class='add'>+</div><div class='add'>+/* The atomic types we support */</div><div class='add'>+GF_ATOMIC_TYPE(1, int8);              /* gf_atomic_int8_t */</div><div class='add'>+GF_ATOMIC_TYPE(2, int16);             /* gf_atomic_int16_t */</div><div class='add'>+GF_ATOMIC_TYPE(4, int32);             /* gf_atomic_int32_t */</div><div class='add'>+GF_ATOMIC_TYPE(8, int64);             /* gf_atomic_int64_t */</div><div class='add'>+GF_ATOMIC_TYPE(SIZEOF_LONG, intptr);  /* gf_atomic_intptr_t */</div><div class='add'>+GF_ATOMIC_TYPE(1, uint8);             /* gf_atomic_uint8_t */</div><div class='add'>+GF_ATOMIC_TYPE(2, uint16);            /* gf_atomic_uint16_t */</div><div class='add'>+GF_ATOMIC_TYPE(4, uint32);            /* gf_atomic_uint32_t */</div><div class='add'>+GF_ATOMIC_TYPE(8, uint64);            /* gf_atomic_uint64_t */</div><div class='add'>+GF_ATOMIC_TYPE(SIZEOF_LONG, uintptr); /* gf_atomic_uintptr_t */</div><div class='add'>+</div><div class='add'>+/* Define the default atomic type as int64_t */</div><div class='add'>+#define gf_atomic_t gf_atomic_int64_t</div><div class='add'>+</div><div class='add'>+/* This macro will choose between the mutex based version and the atomic</div><div class='add'>+ * builtin version depending on the size of the atomic structure. */</div><div class='add'>+#define GF_ATOMIC_CHOOSE(_atomic, _op, _args...)                               \</div><div class='add'>+    ((sizeof(_atomic) &gt; sizeof(uint64_t))                                      \</div><div class='add'>+         ? ({                                                                  \</div><div class='add'>+               GF_ATOMIC_MACRO(GF_ATOMIC_LOCK_, _op)                           \</div><div class='add'>+               (_atomic, ##_args);                                             \</div><div class='add'>+           })                                                                  \</div><div class='add'>+         : ({                                                                  \</div><div class='add'>+               GF_ATOMIC_MACRO(GF_ATOMIC_BASE_, _op)                           \</div><div class='add'>+               (_atomic, ##_args);                                             \</div><div class='add'>+           }))</div><div class='add'>+</div><div class='add'>+/* Macros to implement the mutex-based atomics. */</div><div class='add'>+#define GF_ATOMIC_OP_PREPARE(_atomic, _name)                                   \</div><div class='add'>+    typeof(_atomic) *__atomic = &amp;(_atomic);                                    \</div><div class='add'>+    gf_lock_t *__lock = (gf_lock_t *)&amp;__atomic-&gt;lk;                            \</div><div class='add'>+    LOCK(__lock);                                                              \</div><div class='add'>+    typeof(__atomic-&gt;value) _name = __atomic-&gt;value</div><div class='add'>+</div><div class='add'>+#define GF_ATOMIC_OP_STORE(_value) (__atomic-&gt;value = (_value))</div><div class='add'>+</div><div class='add'>+#define GF_ATOMIC_OP_RETURN(_value)                                            \</div><div class='add'>+    ({                                                                         \</div><div class='add'>+        UNLOCK(__lock);                                                        \</div><div class='add'>+        _value;                                                                \</div><div class='add'>+    })</div><div class='add'>+</div><div class='add'>+#define GF_ATOMIC_LOCK_INIT(_atomic, _value)                                   \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        typeof(_atomic) *__atomic = &amp;(_atomic);                                \</div><div class='add'>+        LOCK_INIT((gf_lock_t *)&amp;__atomic-&gt;lk);                                 \</div><div class='add'>+        __atomic-&gt;value = (_value);                                            \</div><div class='add'>+    } while (0)</div><div class='add'>+</div><div class='add'>+#define GF_ATOMIC_LOCK_GET(_atomic)                                            \</div><div class='add'>+    ({                                                                         \</div><div class='add'>+        GF_ATOMIC_OP_PREPARE(_atomic, __value);                                \</div><div class='add'>+        GF_ATOMIC_OP_RETURN(__value);                                          \</div><div class='add'>+    })</div><div class='add'>+</div><div class='add'>+#define GF_ATOMIC_LOCK_ADD(_atomic, _value)                                    \</div><div class='add'>+    ({                                                                         \</div><div class='add'>+        GF_ATOMIC_OP_PREPARE(_atomic, __value);                                \</div><div class='add'>+        GF_ATOMIC_OP_STORE(__value += (_value));                               \</div><div class='add'>+        GF_ATOMIC_OP_RETURN(__value);                                          \</div><div class='add'>+    })</div><div class='add'>+</div><div class='add'>+#define GF_ATOMIC_LOCK_SUB(_atomic, _value)                                    \</div><div class='add'>+    ({                                                                         \</div><div class='add'>+        GF_ATOMIC_OP_PREPARE(_atomic, __value);                                \</div><div class='add'>+        GF_ATOMIC_OP_STORE(__value -= (_value));                               \</div><div class='add'>+        GF_ATOMIC_OP_RETURN(__value);                                          \</div><div class='add'>+    })</div><div class='add'>+</div><div class='add'>+#define GF_ATOMIC_LOCK_AND(_atomic, _value)                                    \</div><div class='add'>+    ({                                                                         \</div><div class='add'>+        GF_ATOMIC_OP_PREPARE(_atomic, __value);                                \</div><div class='add'>+        GF_ATOMIC_OP_STORE(__value &amp;= (_value));                               \</div><div class='add'>+        GF_ATOMIC_OP_RETURN(__value);                                          \</div><div class='add'>+    })</div><div class='add'>+</div><div class='add'>+#define GF_ATOMIC_LOCK_OR(_atomic, _value)                                     \</div><div class='add'>+    ({                                                                         \</div><div class='add'>+        GF_ATOMIC_OP_PREPARE(_atomic, __value);                                \</div><div class='add'>+        GF_ATOMIC_OP_STORE(__value |= (_value));                               \</div><div class='add'>+        GF_ATOMIC_OP_RETURN(__value);                                          \</div><div class='add'>+    })</div><div class='add'>+</div><div class='add'>+#define GF_ATOMIC_LOCK_XOR(_atomic, _value)                                    \</div><div class='add'>+    ({                                                                         \</div><div class='add'>+        GF_ATOMIC_OP_PREPARE(_atomic, __value);                                \</div><div class='add'>+        GF_ATOMIC_OP_STORE(__value ^= (_value));                               \</div><div class='add'>+        GF_ATOMIC_OP_RETURN(__value);                                          \</div><div class='add'>+    })</div><div class='add'>+</div><div class='add'>+#define GF_ATOMIC_LOCK_NAND(_atomic, _value)                                   \</div><div class='add'>+    ({                                                                         \</div><div class='add'>+        GF_ATOMIC_OP_PREPARE(_atomic, __value);                                \</div><div class='add'>+        GF_ATOMIC_OP_STORE(__value = ~(__value &amp; (_value)));                   \</div><div class='add'>+        GF_ATOMIC_OP_RETURN(__value);                                          \</div><div class='add'>+    })</div><div class='add'>+</div><div class='add'>+#define GF_ATOMIC_LOCK_FETCH_ADD(_atomic, _value)                              \</div><div class='add'>+    ({                                                                         \</div><div class='add'>+        GF_ATOMIC_OP_PREPARE(_atomic, __value);                                \</div><div class='add'>+        GF_ATOMIC_OP_STORE(__value + (_value));                                \</div><div class='add'>+        GF_ATOMIC_OP_RETURN(__value);                                          \</div><div class='add'>+    })</div><div class='add'>+</div><div class='add'>+#define GF_ATOMIC_LOCK_FETCH_SUB(_atomic, _value)                              \</div><div class='add'>+    ({                                                                         \</div><div class='add'>+        GF_ATOMIC_OP_PREPARE(_atomic, __value);                                \</div><div class='add'>+        GF_ATOMIC_OP_STORE(__value - (_value));                                \</div><div class='add'>+        GF_ATOMIC_OP_RETURN(__value);                                          \</div><div class='add'>+    })</div><div class='add'>+</div><div class='add'>+#define GF_ATOMIC_LOCK_FETCH_AND(_atomic, _value)                              \</div><div class='add'>+    ({                                                                         \</div><div class='add'>+        GF_ATOMIC_OP_PREPARE(_atomic, __value);                                \</div><div class='add'>+        GF_ATOMIC_OP_STORE(__value &amp;(_value));                                 \</div><div class='add'>+        GF_ATOMIC_OP_RETURN(__value);                                          \</div><div class='add'>+    })</div><div class='add'>+</div><div class='add'>+#define GF_ATOMIC_LOCK_FETCH_OR(_atomic, _value)                               \</div><div class='add'>+    ({                                                                         \</div><div class='add'>+        GF_ATOMIC_OP_PREPARE(_atomic, __value);                                \</div><div class='add'>+        GF_ATOMIC_OP_STORE(__value | (_value));                                \</div><div class='add'>+        GF_ATOMIC_OP_RETURN(__value);                                          \</div><div class='add'>+    })</div><div class='add'>+</div><div class='add'>+#define GF_ATOMIC_LOCK_FETCH_XOR(_atomic, _value)                              \</div><div class='add'>+    ({                                                                         \</div><div class='add'>+        GF_ATOMIC_OP_PREPARE(_atomic, __value);                                \</div><div class='add'>+        GF_ATOMIC_OP_STORE(__value ^ (_value));                                \</div><div class='add'>+        GF_ATOMIC_OP_RETURN(__value);                                          \</div><div class='add'>+    })</div><div class='add'>+</div><div class='add'>+#define GF_ATOMIC_LOCK_FETCH_NAND(_atomic, _value)                             \</div><div class='add'>+    ({                                                                         \</div><div class='add'>+        GF_ATOMIC_OP_PREPARE(_atomic, __value);                                \</div><div class='add'>+        GF_ATOMIC_OP_STORE(~(__value &amp; (_value)));                             \</div><div class='add'>+        GF_ATOMIC_OP_RETURN(__value);                                          \</div><div class='add'>+    })</div><div class='add'>+</div><div class='add'>+#define GF_ATOMIC_LOCK_SWAP(_atomic, _value)                                   \</div><div class='add'>+    ({                                                                         \</div><div class='add'>+        GF_ATOMIC_OP_PREPARE(_atomic, __value);                                \</div><div class='add'>+        GF_ATOMIC_OP_STORE(_value);                                            \</div><div class='add'>+        GF_ATOMIC_OP_RETURN(__value);                                          \</div><div class='add'>+    })</div><div class='add'>+</div><div class='add'>+#define GF_ATOMIC_LOCK_CMP_SWAP(_atomic, _expected, _value)                    \</div><div class='add'>+    ({                                                                         \</div><div class='add'>+        GF_ATOMIC_OP_PREPARE(_atomic, __value);                                \</div><div class='add'>+        bool __ret = (__value == (_expected));                                 \</div><div class='add'>+        if (__ret) {                                                           \</div><div class='add'>+            GF_ATOMIC_OP_STORE(_value);                                        \</div><div class='add'>+        }                                                                      \</div><div class='add'>+        GF_ATOMIC_OP_RETURN(__ret);                                            \</div><div class='add'>+    })</div><div class='add'>+</div><div class='add'>+#if defined(HAVE_ATOMIC_BUILTINS)</div><div class='add'>+</div><div class='add'>+/* If compiler supports __atomic builtins, we use them. */</div><div class='add'>+</div><div class='add'>+#define GF_ATOMIC_BASE_INIT(_atomic, _value)                                   \</div><div class='add'>+    __atomic_store_n(&amp;(_atomic).value, (_value), __ATOMIC_RELEASE)</div><div class='add'>+</div><div class='add'>+#define GF_ATOMIC_BASE_GET(_atomic)                                            \</div><div class='add'>+    __atomic_load_n(&amp;(_atomic).value, __ATOMIC_ACQUIRE)</div><div class='add'>+</div><div class='add'>+#define GF_ATOMIC_BASE_ADD(_atomic, _value)                                    \</div><div class='add'>+    __atomic_add_fetch(&amp;(_atomic).value, (_value), __ATOMIC_ACQ_REL)</div><div class='add'>+</div><div class='add'>+#define GF_ATOMIC_BASE_SUB(_atomic, _value)                                    \</div><div class='add'>+    __atomic_sub_fetch(&amp;(_atomic).value, (_value), __ATOMIC_ACQ_REL)</div><div class='add'>+</div><div class='add'>+#define GF_ATOMIC_BASE_AND(_atomic, _value)                                    \</div><div class='add'>+    __atomic_and_fetch(&amp;(_atomic).value, (_value), __ATOMIC_ACQ_REL)</div><div class='add'>+</div><div class='add'>+#define GF_ATOMIC_BASE_OR(_atomic, _value)                                     \</div><div class='add'>+    __atomic_or_fetch(&amp;(_atomic).value, (_value), __ATOMIC_ACQ_REL)</div><div class='add'>+</div><div class='add'>+#define GF_ATOMIC_BASE_XOR(_atomic, _value)                                    \</div><div class='add'>+    __atomic_xor_fetch(&amp;(_atomic).value, (_value), __ATOMIC_ACQ_REL)</div><div class='add'>+</div><div class='add'>+#define GF_ATOMIC_BASE_NAND(_atomic, _value)                                   \</div><div class='add'>+    __atomic_nand_fetch(&amp;(_atomic).value, (_value), __ATOMIC_ACQ_REL)</div><div class='add'>+</div><div class='add'>+#define GF_ATOMIC_BASE_FETCH_ADD(_atomic, _value)                              \</div><div class='add'>+    __atomic_fetch_add(&amp;(_atomic).value, (_value), __ATOMIC_ACQ_REL)</div><div class='add'>+</div><div class='add'>+#define GF_ATOMIC_BASE_FETCH_SUB(_atomic, _value)                              \</div><div class='add'>+    __atomic_fetch_sub(&amp;(_atomic).value, (_value), __ATOMIC_ACQ_REL)</div><div class='add'>+</div><div class='add'>+#define GF_ATOMIC_BASE_FETCH_AND(_atomic, _value)                              \</div><div class='add'>+    __atomic_fetch_and(&amp;(_atomic).value, (_value), __ATOMIC_ACQ_REL)</div><div class='add'>+</div><div class='add'>+#define GF_ATOMIC_BASE_FETCH_OR(_atomic, _value)                               \</div><div class='add'>+    __atomic_fetch_or(&amp;(_atomic).value, (_value), __ATOMIC_ACQ_REL)</div><div class='add'>+</div><div class='add'>+#define GF_ATOMIC_BASE_FETCH_XOR(_atomic, _value)                              \</div><div class='add'>+    __atomic_fetch_xor(&amp;(_atomic).value, (_value), __ATOMIC_ACQ_REL)</div><div class='add'>+</div><div class='add'>+#define GF_ATOMIC_BASE_FETCH_NAND(_atomic, _value)                             \</div><div class='add'>+    __atomic_fetch_nand(&amp;(_atomic).value, (_value), __ATOMIC_ACQ_REL)</div><div class='add'>+</div><div class='add'>+#define GF_ATOMIC_BASE_SWAP(_atomic, _value)                                   \</div><div class='add'>+    __atomic_exchange_n(&amp;(_atomic).value, (_value), __ATOMIC_ACQ_REL)</div><div class='add'>+</div><div class='add'>+#define GF_ATOMIC_BASE_CMP_SWAP(_atomic, _expected, _value)                    \</div><div class='add'>+    ({                                                                         \</div><div class='add'>+        typeof((_atomic).value) __expected = (_expected);                      \</div><div class='add'>+        __atomic_compare_exchange_n(&amp;(_atomic).value, &amp;__expected, (_value),   \</div><div class='add'>+                                    0, __ATOMIC_ACQ_REL, __ATOMIC_ACQUIRE);    \</div><div class='add'>+    })</div><div class='add'>+</div><div class='add'>+#elif defined(HAVE_SYNC_BUILTINS)</div><div class='add'>+</div><div class='add'>+/* If compiler doesn't support __atomic builtins but supports __sync builtins,</div><div class='add'>+ * we use them. */</div><div class='add'>+</div><div class='add'>+#define GF_ATOMIC_BASE_INIT(_atomic, _value)                                   \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        (_atomic).value = (_value);                                            \</div><div class='add'>+        __sync_synchronize();                                                  \</div><div class='add'>+    } while (0)</div><div class='add'>+</div><div class='add'>+#define GF_ATOMIC_BASE_ADD(_atomic, _value)                                    \</div><div class='add'>+    __sync_add_and_fetch(&amp;(_atomic).value, (_value))</div><div class='add'>+</div><div class='add'>+#define GF_ATOMIC_BASE_SUB(_atomic, _value)                                    \</div><div class='add'>+    __sync_sub_and_fetch(&amp;(_atomic).value, (_value))</div><div class='add'>+</div><div class='add'>+#define GF_ATOMIC_BASE_AND(_atomic, _value)                                    \</div><div class='add'>+    __sync_and_and_fetch(&amp;(_atomic).value, (_value))</div><div class='add'>+</div><div class='add'>+#define GF_ATOMIC_BASE_OR(_atomic, _value)                                     \</div><div class='add'>+    __sync_or_and_fetch(&amp;(_atomic).value, (_value))</div><div class='add'>+</div><div class='add'>+#define GF_ATOMIC_BASE_XOR(_atomic, _value)                                    \</div><div class='add'>+    __sync_xor_and_fetch(&amp;(_atomic).value, (_value))</div><div class='add'>+</div><div class='add'>+#define GF_ATOMIC_BASE_NAND(_atomic, _value)                                   \</div><div class='add'>+    __sync_nand_and_fetch(&amp;(_atomic).value, (_value))</div><div class='add'>+</div><div class='add'>+#define GF_ATOMIC_BASE_FETCH_ADD(_atomic, _value)                              \</div><div class='add'>+    __sync_fetch_and_add(&amp;(_atomic).value, (_value))</div><div class='add'>+</div><div class='add'>+#define GF_ATOMIC_BASE_FETCH_SUB(_atomic, _value)                              \</div><div class='add'>+    __sync_fetch_and_sub(&amp;(_atomic).value, (_value))</div><div class='add'>+</div><div class='add'>+#define GF_ATOMIC_BASE_FETCH_AND(_atomic, _value)                              \</div><div class='add'>+    __sync_fetch_and_and(&amp;(_atomic).value, (_value))</div><div class='add'>+</div><div class='add'>+#define GF_ATOMIC_BASE_FETCH_OR(_atomic, _value)                               \</div><div class='add'>+    __sync_fetch_and_or(&amp;(_atomic).value, (_value))</div><div class='add'>+</div><div class='add'>+#define GF_ATOMIC_BASE_FETCH_XOR(_atomic, _value)                              \</div><div class='add'>+    __sync_fetch_and_xor(&amp;(_atomic).value, (_value))</div><div class='add'>+</div><div class='add'>+#define GF_ATOMIC_BASE_FETCH_NAND(_atomic, _value)                             \</div><div class='add'>+    __sync_fetch_and_nand(&amp;(_atomic).value, (_value))</div><div class='add'>+</div><div class='add'>+#define GF_ATOMIC_BASE_SWAP(_atomic, _value)                                   \</div><div class='add'>+    ({                                                                         \</div><div class='add'>+        __sync_synchronize();                                                  \</div><div class='add'>+        __sync_lock_test_and_set(&amp;(_atomic).value, (_value));                  \</div><div class='add'>+    })</div><div class='add'>+</div><div class='add'>+#define GF_ATOMIC_BASE_CMP_SWAP(_atomic, _expected, _value)                    \</div><div class='add'>+    __sync_bool_compare_and_swap(&amp;(_atomic).value, (_expected), (_value))</div><div class='add'>+</div><div class='add'>+#define GF_ATOMIC_BASE_GET(_atomic) GF_ATOMIC_BASE_ADD(_atomic, 0)</div><div class='add'>+</div><div class='add'>+#else /* !HAVE_ATOMIC_BUILTINS &amp;&amp; !HAVE_SYNC_BUILTINS */</div><div class='add'>+</div><div class='add'>+/* The compiler doesn't support any atomic builtin. We fallback to the</div><div class='add'>+ * mutex-based implementation. */</div><div class='add'>+</div><div class='add'>+#define GF_ATOMIC_BASE_INIT(_atomic, _value)                                   \</div><div class='add'>+    GF_ATOMIC_LOCK_INIT(_atomic, _value)</div><div class='add'>+</div><div class='add'>+#define GF_ATOMIC_BASE_GET(_atomic) GF_ATOMIC_LOCK_GET(_atomic)</div><div class='add'>+</div><div class='add'>+#define GF_ATOMIC_BASE_ADD(_atomic, _value) GF_ATOMIC_LOCK_ADD(_atomic, _value)</div><div class='add'>+</div><div class='add'>+#define GF_ATOMIC_BASE_SUB(_atomic, _value) GF_ATOMIC_LOCK_SUB(_atomic, _value)</div><div class='add'>+</div><div class='add'>+#define GF_ATOMIC_BASE_AND(_atomic, _value) GF_ATOMIC_LOCK_AND(_atomic, _value)</div><div class='add'>+</div><div class='add'>+#define GF_ATOMIC_BASE_OR(_atomic, _value) GF_ATOMIC_LOCK_OR(_atomic, _value)</div><div class='add'>+</div><div class='add'>+#define GF_ATOMIC_BASE_XOR(_atomic, _value) GF_ATOMIC_LOCK_XOR(_atomic, _value)</div><div class='add'>+</div><div class='add'>+#define GF_ATOMIC_BASE_NAND(_atomic, _value)                                   \</div><div class='add'>+    GF_ATOMIC_LOCK_NAND(_atomic, _value)</div><div class='add'>+</div><div class='add'>+#define GF_ATOMIC_BASE_FETCH_ADD(_atomic, _value)                              \</div><div class='add'>+    GF_ATOMIC_LOCK_FETCH_ADD(_atomic, _value)</div><div class='add'>+</div><div class='add'>+#define GF_ATOMIC_BASE_FETCH_SUB(_atomic, _value)                              \</div><div class='add'>+    GF_ATOMIC_LOCK_FETCH_SUB(_atomic, _value)</div><div class='add'>+</div><div class='add'>+#define GF_ATOMIC_BASE_FETCH_AND(_atomic, _value)                              \</div><div class='add'>+    GF_ATOMIC_LOCK_FETCH_AND(_atomic, _value)</div><div class='add'>+</div><div class='add'>+#define GF_ATOMIC_BASE_FETCH_OR(_atomic, _value)                               \</div><div class='add'>+    GF_ATOMIC_LOCK_FETCH_OR(_atomic, _value)</div><div class='add'>+</div><div class='add'>+#define GF_ATOMIC_BASE_FETCH_XOR(_atomic, _value)                              \</div><div class='add'>+    GF_ATOMIC_LOCK_FETCH_XOR(_atomic, _value)</div><div class='add'>+</div><div class='add'>+#define GF_ATOMIC_BASE_FETCH_NAND(_atomic, _value)                             \</div><div class='add'>+    GF_ATOMIC_LOCK_FETCH_NAND(_atomic, _value)</div><div class='add'>+</div><div class='add'>+#define GF_ATOMIC_BASE_SWAP(_atomic, _value)                                   \</div><div class='add'>+    GF_ATOMIC_LOCK_SWAP(_atomic, _value)</div><div class='add'>+</div><div class='add'>+#define GF_ATOMIC_BASE_CMP_SWAP(_atomic, _expected, _value)                    \</div><div class='add'>+    GF_ATOMIC_LOCK_CMP_SWAP(_atomic, _expected, _value)</div><div class='add'>+</div><div class='add'>+#endif /* HAVE_(ATOMIC|SYNC)_BUILTINS */</div><div class='add'>+</div><div class='add'>+/* Here we declare the real atomic macros available to the user. */</div><div class='add'>+</div><div class='add'>+/* All macros have a 'gf_atomic_xxx' as 1st argument */</div><div class='add'>+</div><div class='add'>+#define GF_ATOMIC_INIT(_atomic, _value) GF_ATOMIC_CHOOSE(_atomic, INIT, _value)</div><div class='add'>+#define GF_ATOMIC_GET(_atomic) GF_ATOMIC_CHOOSE(_atomic, GET)</div><div class='add'>+#define GF_ATOMIC_ADD(_atomic, _value) GF_ATOMIC_CHOOSE(_atomic, ADD, _value)</div><div class='add'>+#define GF_ATOMIC_SUB(_atomic, _value) GF_ATOMIC_CHOOSE(_atomic, SUB, _value)</div><div class='add'>+#define GF_ATOMIC_AND(_atomic, _value) GF_ATOMIC_CHOOSE(_atomic, AND, _value)</div><div class='add'>+#define GF_ATOMIC_OR(_atomic, _value) GF_ATOMIC_CHOOSE(_atomic, OR, _value)</div><div class='add'>+#define GF_ATOMIC_XOR(_atomic, _value) GF_ATOMIC_CHOOSE(_atomic, XOR, _value)</div><div class='add'>+#define GF_ATOMIC_NAND(_atomic, _value) GF_ATOMIC_CHOOSE(_atomic, NAND, _value)</div><div class='add'>+</div><div class='add'>+#define GF_ATOMIC_FETCH_ADD(_atomic, _value)                                   \</div><div class='add'>+    GF_ATOMIC_CHOOSE(_atomic, FETCH_ADD, _value)</div><div class='add'>+</div><div class='add'>+#define GF_ATOMIC_FETCH_SUB(_atomic, _value)                                   \</div><div class='add'>+    GF_ATOMIC_CHOOSE(_atomic, FETCH_SUB, _value)</div><div class='add'>+</div><div class='add'>+#define GF_ATOMIC_FETCH_AND(_atomic, _value)                                   \</div><div class='add'>+    GF_ATOMIC_CHOOSE(_atomic, FETCH_AND, _value)</div><div class='add'>+</div><div class='add'>+#define GF_ATOMIC_FETCH_OR(_atomic, _value)                                    \</div><div class='add'>+    GF_ATOMIC_CHOOSE(_atomic, FETCH_OR, _value)</div><div class='add'>+</div><div class='add'>+#define GF_ATOMIC_FETCH_XOR(_atomic, _value)                                   \</div><div class='add'>+    GF_ATOMIC_CHOOSE(_atomic, FETCH_XOR, _value)</div><div class='add'>+</div><div class='add'>+#define GF_ATOMIC_FETCH_NAND(_atomic, _value)                                  \</div><div class='add'>+    GF_ATOMIC_CHOOSE(_atomic, FETCH_NAND, _value)</div><div class='add'>+</div><div class='add'>+#define GF_ATOMIC_SWAP(_atomic, _value) GF_ATOMIC_CHOOSE(_atomic, SWAP, _value)</div><div class='add'>+</div><div class='add'>+#define GF_ATOMIC_CMP_SWAP(_atomic, _expected, _value)                         \</div><div class='add'>+    GF_ATOMIC_CHOOSE(_atomic, CMP_SWAP, _expected, _value)</div><div class='add'>+</div><div class='add'>+#define GF_ATOMIC_INC(_atomic) GF_ATOMIC_ADD(_atomic, 1)</div><div class='add'>+#define GF_ATOMIC_DEC(_atomic) GF_ATOMIC_SUB(_atomic, 1)</div><div class='add'>+#define GF_ATOMIC_FETCH_INC(_atomic) GF_ATOMIC_FETCH_ADD(_atomic, 1)</div><div class='add'>+#define GF_ATOMIC_FETCH_DEC(_atomic) GF_ATOMIC_FETCH_SUB(_atomic, 1)</div><div class='add'>+</div><div class='add'>+#endif /* _ATOMIC_H */</div><div class='head'>diff --git a/libglusterfs/src/glusterfs/byte-order.h b/libglusterfs/src/glusterfs/byte-order.h<br/>new file mode 100644<br/>index 00000000000..fd8cef9e58d<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/libglusterfs/src/glusterfs/byte-order.h?id=d1d7a6f35c816822fab51c820e25023863c239c1'>libglusterfs/src/glusterfs/byte-order.h</a></div><div class='hunk'>@@ -0,0 +1,279 @@</div><div class='add'>+/*</div><div class='add'>+  Copyright (c) 2008-2012 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#ifndef _BYTE_ORDER_H</div><div class='add'>+#define _BYTE_ORDER_H</div><div class='add'>+</div><div class='add'>+#include &lt;inttypes.h&gt;</div><div class='add'>+</div><div class='add'>+#define LS1 0x00ffU</div><div class='add'>+#define MS1 0xff00U</div><div class='add'>+#define LS2 0x0000ffffU</div><div class='add'>+#define MS2 0xffff0000U</div><div class='add'>+#define LS4 0x00000000ffffffffULL</div><div class='add'>+#define MS4 0xffffffff00000000ULL</div><div class='add'>+</div><div class='add'>+static uint16_t (*hton16)(uint16_t);</div><div class='add'>+static uint32_t (*hton32)(uint32_t);</div><div class='add'>+static uint64_t (*hton64)(uint64_t);</div><div class='add'>+</div><div class='add'>+#define ntoh16 hton16</div><div class='add'>+#define ntoh32 hton32</div><div class='add'>+#define ntoh64 hton64</div><div class='add'>+</div><div class='add'>+static uint16_t (*htole16)(uint16_t);</div><div class='add'>+static uint32_t (*htole32)(uint32_t);</div><div class='add'>+static uint64_t (*htole64)(uint64_t);</div><div class='add'>+</div><div class='add'>+#define letoh16 htole16</div><div class='add'>+#define letoh32 htole32</div><div class='add'>+#define letoh64 htole64</div><div class='add'>+</div><div class='add'>+static uint16_t (*htobe16)(uint16_t);</div><div class='add'>+static uint32_t (*htobe32)(uint32_t);</div><div class='add'>+static uint64_t (*htobe64)(uint64_t);</div><div class='add'>+</div><div class='add'>+#define betoh16 htobe16</div><div class='add'>+#define betoh32 htobe32</div><div class='add'>+#define betoh64 htobe64</div><div class='add'>+</div><div class='add'>+#define do_swap2(x) (((x &amp; LS1) &lt;&lt; 8) | (((x &amp; MS1) &gt;&gt; 8)))</div><div class='add'>+#define do_swap4(x) ((do_swap2(x &amp; LS2) &lt;&lt; 16) | (do_swap2((x &amp; MS2) &gt;&gt; 16)))</div><div class='add'>+#define do_swap8(x) ((do_swap4(x &amp; LS4) &lt;&lt; 32) | (do_swap4((x &amp; MS4) &gt;&gt; 32)))</div><div class='add'>+</div><div class='add'>+static inline uint16_t</div><div class='add'>+__swap16(uint16_t x)</div><div class='add'>+{</div><div class='add'>+    return do_swap2(x);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static inline uint32_t</div><div class='add'>+__swap32(uint32_t x)</div><div class='add'>+{</div><div class='add'>+    return do_swap4(x);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static inline uint64_t</div><div class='add'>+__swap64(uint64_t x)</div><div class='add'>+{</div><div class='add'>+    return do_swap8(x);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static inline uint16_t</div><div class='add'>+__noswap16(uint16_t x)</div><div class='add'>+{</div><div class='add'>+    return x;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static inline uint32_t</div><div class='add'>+__noswap32(uint32_t x)</div><div class='add'>+{</div><div class='add'>+    return x;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static inline uint64_t</div><div class='add'>+__noswap64(uint64_t x)</div><div class='add'>+{</div><div class='add'>+    return x;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static inline uint16_t</div><div class='add'>+__byte_order_n16(uint16_t i)</div><div class='add'>+{</div><div class='add'>+    uint32_t num = 1;</div><div class='add'>+</div><div class='add'>+    if (((char *)(&amp;num))[0] == 1) {</div><div class='add'>+        /* cpu is le */</div><div class='add'>+        hton16 = __swap16;</div><div class='add'>+        hton32 = __swap32;</div><div class='add'>+        hton64 = __swap64;</div><div class='add'>+    } else {</div><div class='add'>+        /* cpu is be */</div><div class='add'>+        hton16 = __noswap16;</div><div class='add'>+        hton32 = __noswap32;</div><div class='add'>+        hton64 = __noswap64;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return hton16(i);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static inline uint32_t</div><div class='add'>+__byte_order_n32(uint32_t i)</div><div class='add'>+{</div><div class='add'>+    uint32_t num = 1;</div><div class='add'>+</div><div class='add'>+    if (((char *)(&amp;num))[0] == 1) {</div><div class='add'>+        /* cpu is le */</div><div class='add'>+        hton16 = __swap16;</div><div class='add'>+        hton32 = __swap32;</div><div class='add'>+        hton64 = __swap64;</div><div class='add'>+    } else {</div><div class='add'>+        /* cpu is be */</div><div class='add'>+        hton16 = __noswap16;</div><div class='add'>+        hton32 = __noswap32;</div><div class='add'>+        hton64 = __noswap64;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return hton32(i);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static inline uint64_t</div><div class='add'>+__byte_order_n64(uint64_t i)</div><div class='add'>+{</div><div class='add'>+    uint32_t num = 1;</div><div class='add'>+</div><div class='add'>+    if (((char *)(&amp;num))[0] == 1) {</div><div class='add'>+        /* cpu is le */</div><div class='add'>+        hton16 = __swap16;</div><div class='add'>+        hton32 = __swap32;</div><div class='add'>+        hton64 = __swap64;</div><div class='add'>+    } else {</div><div class='add'>+        /* cpu is be */</div><div class='add'>+        hton16 = __noswap16;</div><div class='add'>+        hton32 = __noswap32;</div><div class='add'>+        hton64 = __noswap64;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return hton64(i);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static uint16_t (*hton16)(uint16_t) = __byte_order_n16;</div><div class='add'>+static uint32_t (*hton32)(uint32_t) = __byte_order_n32;</div><div class='add'>+static uint64_t (*hton64)(uint64_t) = __byte_order_n64;</div><div class='add'>+</div><div class='add'>+static inline uint16_t</div><div class='add'>+__byte_order_le16(uint16_t i)</div><div class='add'>+{</div><div class='add'>+    uint32_t num = 1;</div><div class='add'>+</div><div class='add'>+    if (((char *)(&amp;num))[0] == 1) {</div><div class='add'>+        /* cpu is le */</div><div class='add'>+        htole16 = __noswap16;</div><div class='add'>+        htole32 = __noswap32;</div><div class='add'>+        htole64 = __noswap64;</div><div class='add'>+    } else {</div><div class='add'>+        /* cpu is be */</div><div class='add'>+        htole16 = __swap16;</div><div class='add'>+        htole32 = __swap32;</div><div class='add'>+        htole64 = __swap64;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return htole16(i);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static inline uint32_t</div><div class='add'>+__byte_order_le32(uint32_t i)</div><div class='add'>+{</div><div class='add'>+    uint32_t num = 1;</div><div class='add'>+</div><div class='add'>+    if (((char *)(&amp;num))[0] == 1) {</div><div class='add'>+        /* cpu is le */</div><div class='add'>+        htole16 = __noswap16;</div><div class='add'>+        htole32 = __noswap32;</div><div class='add'>+        htole64 = __noswap64;</div><div class='add'>+    } else {</div><div class='add'>+        /* cpu is be */</div><div class='add'>+        htole16 = __swap16;</div><div class='add'>+        htole32 = __swap32;</div><div class='add'>+        htole64 = __swap64;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return htole32(i);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static inline uint64_t</div><div class='add'>+__byte_order_le64(uint64_t i)</div><div class='add'>+{</div><div class='add'>+    uint32_t num = 1;</div><div class='add'>+</div><div class='add'>+    if (((char *)(&amp;num))[0] == 1) {</div><div class='add'>+        /* cpu is le */</div><div class='add'>+        htole16 = __noswap16;</div><div class='add'>+        htole32 = __noswap32;</div><div class='add'>+        htole64 = __noswap64;</div><div class='add'>+    } else {</div><div class='add'>+        /* cpu is be */</div><div class='add'>+        htole16 = __swap16;</div><div class='add'>+        htole32 = __swap32;</div><div class='add'>+        htole64 = __swap64;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return htole64(i);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static uint16_t (*htole16)(uint16_t) = __byte_order_le16;</div><div class='add'>+static uint32_t (*htole32)(uint32_t) = __byte_order_le32;</div><div class='add'>+static uint64_t (*htole64)(uint64_t) = __byte_order_le64;</div><div class='add'>+</div><div class='add'>+static inline uint16_t</div><div class='add'>+__byte_order_be16(uint16_t i)</div><div class='add'>+{</div><div class='add'>+    uint32_t num = 1;</div><div class='add'>+</div><div class='add'>+    if (((char *)(&amp;num))[0] == 1) {</div><div class='add'>+        /* cpu is le */</div><div class='add'>+        htobe16 = __swap16;</div><div class='add'>+        htobe32 = __swap32;</div><div class='add'>+        htobe64 = __swap64;</div><div class='add'>+    } else {</div><div class='add'>+        /* cpu is be */</div><div class='add'>+        htobe16 = __noswap16;</div><div class='add'>+        htobe32 = __noswap32;</div><div class='add'>+        htobe64 = __noswap64;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return htobe16(i);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static inline uint32_t</div><div class='add'>+__byte_order_be32(uint32_t i)</div><div class='add'>+{</div><div class='add'>+    uint32_t num = 1;</div><div class='add'>+</div><div class='add'>+    if (((char *)(&amp;num))[0] == 1) {</div><div class='add'>+        /* cpu is le */</div><div class='add'>+        htobe16 = __swap16;</div><div class='add'>+        htobe32 = __swap32;</div><div class='add'>+        htobe64 = __swap64;</div><div class='add'>+    } else {</div><div class='add'>+        /* cpu is be */</div><div class='add'>+        htobe16 = __noswap16;</div><div class='add'>+        htobe32 = __noswap32;</div><div class='add'>+        htobe64 = __noswap64;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return htobe32(i);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static inline uint64_t</div><div class='add'>+__byte_order_be64(uint64_t i)</div><div class='add'>+{</div><div class='add'>+    uint32_t num = 1;</div><div class='add'>+</div><div class='add'>+    if (((char *)(&amp;num))[0] == 1) {</div><div class='add'>+        /* cpu is le */</div><div class='add'>+        htobe16 = __swap16;</div><div class='add'>+        htobe32 = __swap32;</div><div class='add'>+        htobe64 = __swap64;</div><div class='add'>+    } else {</div><div class='add'>+        /* cpu is be */</div><div class='add'>+        htobe16 = __noswap16;</div><div class='add'>+        htobe32 = __noswap32;</div><div class='add'>+        htobe64 = __noswap64;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return htobe64(i);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static uint16_t (*htobe16)(uint16_t) = __byte_order_be16;</div><div class='add'>+static uint32_t (*htobe32)(uint32_t) = __byte_order_be32;</div><div class='add'>+static uint64_t (*htobe64)(uint64_t) = __byte_order_be64;</div><div class='add'>+</div><div class='add'>+#endif /* _BYTE_ORDER_H */</div><div class='head'>diff --git a/libglusterfs/src/glusterfs/call-stub.h b/libglusterfs/src/glusterfs/call-stub.h<br/>new file mode 100644<br/>index 00000000000..8237ea459bf<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/libglusterfs/src/glusterfs/call-stub.h?id=d1d7a6f35c816822fab51c820e25023863c239c1'>libglusterfs/src/glusterfs/call-stub.h</a></div><div class='hunk'>@@ -0,0 +1,622 @@</div><div class='add'>+/*</div><div class='add'>+  Copyright (c) 2008-2012 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#ifndef _CALL_STUB_H_</div><div class='add'>+#define _CALL_STUB_H_</div><div class='add'>+</div><div class='add'>+#include "glusterfs/xlator.h"</div><div class='add'>+#include "glusterfs/defaults.h"</div><div class='add'>+#include "glusterfs/default-args.h"</div><div class='add'>+#include "glusterfs/stack.h"</div><div class='add'>+#include "glusterfs/list.h"</div><div class='add'>+</div><div class='add'>+typedef struct _call_stub {</div><div class='add'>+    struct list_head list;</div><div class='add'>+    call_frame_t *frame;</div><div class='add'>+    struct mem_pool *stub_mem_pool; /* pointer to stub mempool in ctx_t */</div><div class='add'>+    uint32_t jnl_meta_len;</div><div class='add'>+    uint32_t jnl_data_len;</div><div class='add'>+    void (*serialize)(struct _call_stub *, char *, char *);</div><div class='add'>+    union {</div><div class='add'>+        fop_lookup_t lookup;</div><div class='add'>+        fop_stat_t stat;</div><div class='add'>+        fop_fstat_t fstat;</div><div class='add'>+        fop_truncate_t truncate;</div><div class='add'>+        fop_ftruncate_t ftruncate;</div><div class='add'>+        fop_access_t access;</div><div class='add'>+        fop_readlink_t readlink;</div><div class='add'>+        fop_mknod_t mknod;</div><div class='add'>+        fop_mkdir_t mkdir;</div><div class='add'>+        fop_unlink_t unlink;</div><div class='add'>+        fop_rmdir_t rmdir;</div><div class='add'>+        fop_symlink_t symlink;</div><div class='add'>+        fop_rename_t rename;</div><div class='add'>+        fop_link_t link;</div><div class='add'>+        fop_create_t create;</div><div class='add'>+        fop_open_t open;</div><div class='add'>+        fop_readv_t readv;</div><div class='add'>+        fop_writev_t writev;</div><div class='add'>+        fop_flush_t flush;</div><div class='add'>+        fop_fsync_t fsync;</div><div class='add'>+        fop_opendir_t opendir;</div><div class='add'>+        fop_fsyncdir_t fsyncdir;</div><div class='add'>+        fop_statfs_t statfs;</div><div class='add'>+        fop_setxattr_t setxattr;</div><div class='add'>+        fop_getxattr_t getxattr;</div><div class='add'>+        fop_fgetxattr_t fgetxattr;</div><div class='add'>+        fop_fsetxattr_t fsetxattr;</div><div class='add'>+        fop_removexattr_t removexattr;</div><div class='add'>+        fop_fremovexattr_t fremovexattr;</div><div class='add'>+        fop_lk_t lk;</div><div class='add'>+        fop_inodelk_t inodelk;</div><div class='add'>+        fop_finodelk_t finodelk;</div><div class='add'>+        fop_entrylk_t entrylk;</div><div class='add'>+        fop_fentrylk_t fentrylk;</div><div class='add'>+        fop_readdir_t readdir;</div><div class='add'>+        fop_readdirp_t readdirp;</div><div class='add'>+        fop_rchecksum_t rchecksum;</div><div class='add'>+        fop_xattrop_t xattrop;</div><div class='add'>+        fop_fxattrop_t fxattrop;</div><div class='add'>+        fop_setattr_t setattr;</div><div class='add'>+        fop_fsetattr_t fsetattr;</div><div class='add'>+        fop_fallocate_t fallocate;</div><div class='add'>+        fop_discard_t discard;</div><div class='add'>+        fop_zerofill_t zerofill;</div><div class='add'>+        fop_ipc_t ipc;</div><div class='add'>+        fop_seek_t seek;</div><div class='add'>+        fop_lease_t lease;</div><div class='add'>+        fop_getactivelk_t getactivelk;</div><div class='add'>+        fop_setactivelk_t setactivelk;</div><div class='add'>+        fop_put_t put;</div><div class='add'>+        fop_icreate_t icreate;</div><div class='add'>+        fop_namelink_t namelink;</div><div class='add'>+        fop_copy_file_range_t copy_file_range;</div><div class='add'>+    } fn;</div><div class='add'>+</div><div class='add'>+    union {</div><div class='add'>+        fop_lookup_cbk_t lookup;</div><div class='add'>+        fop_stat_cbk_t stat;</div><div class='add'>+        fop_fstat_cbk_t fstat;</div><div class='add'>+        fop_truncate_cbk_t truncate;</div><div class='add'>+        fop_ftruncate_cbk_t ftruncate;</div><div class='add'>+        fop_access_cbk_t access;</div><div class='add'>+        fop_readlink_cbk_t readlink;</div><div class='add'>+        fop_mknod_cbk_t mknod;</div><div class='add'>+        fop_mkdir_cbk_t mkdir;</div><div class='add'>+        fop_unlink_cbk_t unlink;</div><div class='add'>+        fop_rmdir_cbk_t rmdir;</div><div class='add'>+        fop_symlink_cbk_t symlink;</div><div class='add'>+        fop_rename_cbk_t rename;</div><div class='add'>+        fop_link_cbk_t link;</div><div class='add'>+        fop_create_cbk_t create;</div><div class='add'>+        fop_open_cbk_t open;</div><div class='add'>+        fop_readv_cbk_t readv;</div><div class='add'>+        fop_writev_cbk_t writev;</div><div class='add'>+        fop_flush_cbk_t flush;</div><div class='add'>+        fop_fsync_cbk_t fsync;</div><div class='add'>+        fop_opendir_cbk_t opendir;</div><div class='add'>+        fop_fsyncdir_cbk_t fsyncdir;</div><div class='add'>+        fop_statfs_cbk_t statfs;</div><div class='add'>+        fop_setxattr_cbk_t setxattr;</div><div class='add'>+        fop_getxattr_cbk_t getxattr;</div><div class='add'>+        fop_fgetxattr_cbk_t fgetxattr;</div><div class='add'>+        fop_fsetxattr_cbk_t fsetxattr;</div><div class='add'>+        fop_removexattr_cbk_t removexattr;</div><div class='add'>+        fop_fremovexattr_cbk_t fremovexattr;</div><div class='add'>+        fop_lk_cbk_t lk;</div><div class='add'>+        fop_inodelk_cbk_t inodelk;</div><div class='add'>+        fop_finodelk_cbk_t finodelk;</div><div class='add'>+        fop_entrylk_cbk_t entrylk;</div><div class='add'>+        fop_fentrylk_cbk_t fentrylk;</div><div class='add'>+        fop_readdir_cbk_t readdir;</div><div class='add'>+        fop_readdirp_cbk_t readdirp;</div><div class='add'>+        fop_rchecksum_cbk_t rchecksum;</div><div class='add'>+        fop_xattrop_cbk_t xattrop;</div><div class='add'>+        fop_fxattrop_cbk_t fxattrop;</div><div class='add'>+        fop_setattr_cbk_t setattr;</div><div class='add'>+        fop_fsetattr_cbk_t fsetattr;</div><div class='add'>+        fop_fallocate_cbk_t fallocate;</div><div class='add'>+        fop_discard_cbk_t discard;</div><div class='add'>+        fop_zerofill_cbk_t zerofill;</div><div class='add'>+        fop_ipc_cbk_t ipc;</div><div class='add'>+        fop_seek_cbk_t seek;</div><div class='add'>+        fop_lease_cbk_t lease;</div><div class='add'>+        fop_getactivelk_cbk_t getactivelk;</div><div class='add'>+        fop_setactivelk_cbk_t setactivelk;</div><div class='add'>+        fop_put_cbk_t put;</div><div class='add'>+        fop_icreate_cbk_t icreate;</div><div class='add'>+        fop_namelink_cbk_t namelink;</div><div class='add'>+        fop_copy_file_range_cbk_t copy_file_range;</div><div class='add'>+    } fn_cbk;</div><div class='add'>+    glusterfs_fop_t fop;</div><div class='add'>+    gf_boolean_t poison;</div><div class='add'>+    char wind;</div><div class='add'>+    default_args_t args;</div><div class='add'>+    default_args_cbk_t args_cbk;</div><div class='add'>+} call_stub_t;</div><div class='add'>+</div><div class='add'>+call_stub_t *</div><div class='add'>+fop_lookup_stub(call_frame_t *frame, fop_lookup_t fn, loc_t *loc,</div><div class='add'>+                dict_t *xdata);</div><div class='add'>+</div><div class='add'>+call_stub_t *</div><div class='add'>+fop_lookup_cbk_stub(call_frame_t *frame, fop_lookup_cbk_t fn, int32_t op_ret,</div><div class='add'>+                    int32_t op_errno, inode_t *inode, struct iatt *buf,</div><div class='add'>+                    dict_t *xdata, struct iatt *postparent);</div><div class='add'>+call_stub_t *</div><div class='add'>+fop_stat_stub(call_frame_t *frame, fop_stat_t fn, loc_t *loc, dict_t *xdata);</div><div class='add'>+call_stub_t *</div><div class='add'>+fop_stat_cbk_stub(call_frame_t *frame, fop_stat_cbk_t fn, int32_t op_ret,</div><div class='add'>+                  int32_t op_errno, struct iatt *buf, dict_t *xdata);</div><div class='add'>+call_stub_t *</div><div class='add'>+fop_fstat_stub(call_frame_t *frame, fop_fstat_t fn, fd_t *fd, dict_t *xdata);</div><div class='add'>+call_stub_t *</div><div class='add'>+fop_fstat_cbk_stub(call_frame_t *frame, fop_fstat_cbk_t fn, int32_t op_ret,</div><div class='add'>+                   int32_t op_errno, struct iatt *buf, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+call_stub_t *</div><div class='add'>+fop_truncate_stub(call_frame_t *frame, fop_truncate_t fn, loc_t *loc, off_t off,</div><div class='add'>+                  dict_t *xdata);</div><div class='add'>+</div><div class='add'>+call_stub_t *</div><div class='add'>+fop_truncate_cbk_stub(call_frame_t *frame, fop_truncate_cbk_t fn,</div><div class='add'>+                      int32_t op_ret, int32_t op_errno, struct iatt *prebuf,</div><div class='add'>+                      struct iatt *postbuf, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+call_stub_t *</div><div class='add'>+fop_ftruncate_stub(call_frame_t *frame, fop_ftruncate_t fn, fd_t *fd, off_t off,</div><div class='add'>+                   dict_t *xdata);</div><div class='add'>+</div><div class='add'>+call_stub_t *</div><div class='add'>+fop_ftruncate_cbk_stub(call_frame_t *frame, fop_ftruncate_cbk_t fn,</div><div class='add'>+                       int32_t op_ret, int32_t op_errno, struct iatt *prebuf,</div><div class='add'>+                       struct iatt *postbuf, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+call_stub_t *</div><div class='add'>+fop_access_stub(call_frame_t *frame, fop_access_t fn, loc_t *loc, int32_t mask,</div><div class='add'>+                dict_t *xdata);</div><div class='add'>+</div><div class='add'>+call_stub_t *</div><div class='add'>+fop_access_cbk_stub(call_frame_t *frame, fop_access_cbk_t fn, int32_t op_ret,</div><div class='add'>+                    int32_t op_errno, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+call_stub_t *</div><div class='add'>+fop_readlink_stub(call_frame_t *frame, fop_readlink_t fn, loc_t *loc,</div><div class='add'>+                  size_t size, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+call_stub_t *</div><div class='add'>+fop_readlink_cbk_stub(call_frame_t *frame, fop_readlink_cbk_t fn,</div><div class='add'>+                      int32_t op_ret, int32_t op_errno, const char *path,</div><div class='add'>+                      struct iatt *buf, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+call_stub_t *</div><div class='add'>+fop_mknod_stub(call_frame_t *frame, fop_mknod_t fn, loc_t *loc, mode_t mode,</div><div class='add'>+               dev_t rdev, mode_t umask, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+call_stub_t *</div><div class='add'>+fop_mknod_cbk_stub(call_frame_t *frame, fop_mknod_cbk_t fn, int32_t op_ret,</div><div class='add'>+                   int32_t op_errno, inode_t *inode, struct iatt *buf,</div><div class='add'>+                   struct iatt *preparent, struct iatt *postparent,</div><div class='add'>+                   dict_t *xdata);</div><div class='add'>+</div><div class='add'>+call_stub_t *</div><div class='add'>+fop_mkdir_stub(call_frame_t *frame, fop_mkdir_t fn, loc_t *loc, mode_t mode,</div><div class='add'>+               mode_t umask, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+call_stub_t *</div><div class='add'>+fop_mkdir_cbk_stub(call_frame_t *frame, fop_mkdir_cbk_t fn, int32_t op_ret,</div><div class='add'>+                   int32_t op_errno, inode_t *inode, struct iatt *buf,</div><div class='add'>+                   struct iatt *preparent, struct iatt *postparent,</div><div class='add'>+                   dict_t *xdata);</div><div class='add'>+</div><div class='add'>+call_stub_t *</div><div class='add'>+fop_unlink_stub(call_frame_t *frame, fop_unlink_t fn, loc_t *loc, int xflag,</div><div class='add'>+                dict_t *xdata);</div><div class='add'>+</div><div class='add'>+call_stub_t *</div><div class='add'>+fop_unlink_cbk_stub(call_frame_t *frame, fop_unlink_cbk_t fn, int32_t op_ret,</div><div class='add'>+                    int32_t op_errno, struct iatt *preparent,</div><div class='add'>+                    struct iatt *postparent, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+call_stub_t *</div><div class='add'>+fop_rmdir_stub(call_frame_t *frame, fop_rmdir_t fn, loc_t *loc, int flags,</div><div class='add'>+               dict_t *xdata);</div><div class='add'>+</div><div class='add'>+call_stub_t *</div><div class='add'>+fop_rmdir_cbk_stub(call_frame_t *frame, fop_rmdir_cbk_t fn, int32_t op_ret,</div><div class='add'>+                   int32_t op_errno, struct iatt *preparent,</div><div class='add'>+                   struct iatt *postparent, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+call_stub_t *</div><div class='add'>+fop_symlink_stub(call_frame_t *frame, fop_symlink_t fn, const char *linkname,</div><div class='add'>+                 loc_t *loc, mode_t umask, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+call_stub_t *</div><div class='add'>+fop_symlink_cbk_stub(call_frame_t *frame, fop_symlink_cbk_t fn, int32_t op_ret,</div><div class='add'>+                     int32_t op_errno, inode_t *inode, struct iatt *buf,</div><div class='add'>+                     struct iatt *preparent, struct iatt *postparent,</div><div class='add'>+                     dict_t *xdata);</div><div class='add'>+</div><div class='add'>+call_stub_t *</div><div class='add'>+fop_rename_stub(call_frame_t *frame, fop_rename_t fn, loc_t *oldloc,</div><div class='add'>+                loc_t *newloc, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+call_stub_t *</div><div class='add'>+fop_rename_cbk_stub(call_frame_t *frame, fop_rename_cbk_t fn, int32_t op_ret,</div><div class='add'>+                    int32_t op_errno, struct iatt *buf,</div><div class='add'>+                    struct iatt *preoldparent, struct iatt *postoldparent,</div><div class='add'>+                    struct iatt *prenewparent, struct iatt *postnewparent,</div><div class='add'>+                    dict_t *xdata);</div><div class='add'>+</div><div class='add'>+call_stub_t *</div><div class='add'>+fop_link_stub(call_frame_t *frame, fop_link_t fn, loc_t *oldloc, loc_t *newloc,</div><div class='add'>+              dict_t *xdata);</div><div class='add'>+</div><div class='add'>+call_stub_t *</div><div class='add'>+fop_link_cbk_stub(call_frame_t *frame, fop_link_cbk_t fn, int32_t op_ret,</div><div class='add'>+                  int32_t op_errno, inode_t *inode, struct iatt *buf,</div><div class='add'>+                  struct iatt *preparent, struct iatt *postparent,</div><div class='add'>+                  dict_t *xdata);</div><div class='add'>+</div><div class='add'>+call_stub_t *</div><div class='add'>+fop_create_stub(call_frame_t *frame, fop_create_t fn, loc_t *loc, int32_t flags,</div><div class='add'>+                mode_t mode, mode_t umask, fd_t *fd, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+call_stub_t *</div><div class='add'>+fop_create_cbk_stub(call_frame_t *frame, fop_create_cbk_t fn, int32_t op_ret,</div><div class='add'>+                    int32_t op_errno, fd_t *fd, inode_t *inode,</div><div class='add'>+                    struct iatt *buf, struct iatt *preparent,</div><div class='add'>+                    struct iatt *postparent, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+call_stub_t *</div><div class='add'>+fop_open_stub(call_frame_t *frame, fop_open_t fn, loc_t *loc, int32_t flags,</div><div class='add'>+              fd_t *fd, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+call_stub_t *</div><div class='add'>+fop_open_cbk_stub(call_frame_t *frame, fop_open_cbk_t fn, int32_t op_ret,</div><div class='add'>+                  int32_t op_errno, fd_t *fd, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+call_stub_t *</div><div class='add'>+fop_readv_stub(call_frame_t *frame, fop_readv_t fn, fd_t *fd, size_t size,</div><div class='add'>+               off_t off, uint32_t flags, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+call_stub_t *</div><div class='add'>+fop_readv_cbk_stub(call_frame_t *frame, fop_readv_cbk_t fn, int32_t op_ret,</div><div class='add'>+                   int32_t op_errno, struct iovec *vector, int32_t count,</div><div class='add'>+                   struct iatt *stbuf, struct iobref *iobref, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+call_stub_t *</div><div class='add'>+fop_writev_stub(call_frame_t *frame, fop_writev_t fn, fd_t *fd,</div><div class='add'>+                struct iovec *vector, int32_t count, off_t off, uint32_t flags,</div><div class='add'>+                struct iobref *iobref, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+call_stub_t *</div><div class='add'>+fop_writev_cbk_stub(call_frame_t *frame, fop_writev_cbk_t fn, int32_t op_ret,</div><div class='add'>+                    int32_t op_errno, struct iatt *prebuf, struct iatt *postbuf,</div><div class='add'>+                    dict_t *xdata);</div><div class='add'>+</div><div class='add'>+call_stub_t *</div><div class='add'>+fop_flush_stub(call_frame_t *frame, fop_flush_t fn, fd_t *fd, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+call_stub_t *</div><div class='add'>+fop_flush_cbk_stub(call_frame_t *frame, fop_flush_cbk_t fn, int32_t op_ret,</div><div class='add'>+                   int32_t op_errno, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+call_stub_t *</div><div class='add'>+fop_fsync_stub(call_frame_t *frame, fop_fsync_t fn, fd_t *fd, int32_t datasync,</div><div class='add'>+               dict_t *xdata);</div><div class='add'>+</div><div class='add'>+call_stub_t *</div><div class='add'>+fop_fsync_cbk_stub(call_frame_t *frame, fop_fsync_cbk_t fn, int32_t op_ret,</div><div class='add'>+                   int32_t op_errno, struct iatt *prebuf, struct iatt *postbuf,</div><div class='add'>+                   dict_t *xdata);</div><div class='add'>+</div><div class='add'>+call_stub_t *</div><div class='add'>+fop_opendir_stub(call_frame_t *frame, fop_opendir_t fn, loc_t *loc, fd_t *fd,</div><div class='add'>+                 dict_t *xdata);</div><div class='add'>+</div><div class='add'>+call_stub_t *</div><div class='add'>+fop_opendir_cbk_stub(call_frame_t *frame, fop_opendir_cbk_t fn, int32_t op_ret,</div><div class='add'>+                     int32_t op_errno, fd_t *fd, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+call_stub_t *</div><div class='add'>+fop_fsyncdir_stub(call_frame_t *frame, fop_fsyncdir_t fn, fd_t *fd,</div><div class='add'>+                  int32_t datasync, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+call_stub_t *</div><div class='add'>+fop_fsyncdir_cbk_stub(call_frame_t *frame, fop_fsyncdir_cbk_t fn,</div><div class='add'>+                      int32_t op_ret, int32_t op_errno, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+call_stub_t *</div><div class='add'>+fop_statfs_stub(call_frame_t *frame, fop_statfs_t fn, loc_t *loc,</div><div class='add'>+                dict_t *xdata);</div><div class='add'>+</div><div class='add'>+call_stub_t *</div><div class='add'>+fop_statfs_cbk_stub(call_frame_t *frame, fop_statfs_cbk_t fn, int32_t op_ret,</div><div class='add'>+                    int32_t op_errno, struct statvfs *buf, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+call_stub_t *</div><div class='add'>+fop_setxattr_stub(call_frame_t *frame, fop_setxattr_t fn, loc_t *loc,</div><div class='add'>+                  dict_t *dict, int32_t flags, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+call_stub_t *</div><div class='add'>+fop_setxattr_cbk_stub(call_frame_t *frame, fop_setxattr_cbk_t fn,</div><div class='add'>+                      int32_t op_ret, int32_t op_errno, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+call_stub_t *</div><div class='add'>+fop_getxattr_stub(call_frame_t *frame, fop_getxattr_t fn, loc_t *loc,</div><div class='add'>+                  const char *name, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+call_stub_t *</div><div class='add'>+fop_getxattr_cbk_stub(call_frame_t *frame, fop_getxattr_cbk_t fn,</div><div class='add'>+                      int32_t op_ret, int32_t op_errno, dict_t *value,</div><div class='add'>+                      dict_t *xdata);</div><div class='add'>+</div><div class='add'>+call_stub_t *</div><div class='add'>+fop_fsetxattr_stub(call_frame_t *frame, fop_fsetxattr_t fn, fd_t *fd,</div><div class='add'>+                   dict_t *dict, int32_t flags, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+call_stub_t *</div><div class='add'>+fop_fsetxattr_cbk_stub(call_frame_t *frame, fop_fsetxattr_cbk_t fn,</div><div class='add'>+                       int32_t op_ret, int32_t op_errno, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+call_stub_t *</div><div class='add'>+fop_fgetxattr_stub(call_frame_t *frame, fop_fgetxattr_t fn, fd_t *fd,</div><div class='add'>+                   const char *name, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+call_stub_t *</div><div class='add'>+fop_fgetxattr_cbk_stub(call_frame_t *frame, fop_fgetxattr_cbk_t fn,</div><div class='add'>+                       int32_t op_ret, int32_t op_errno, dict_t *value,</div><div class='add'>+                       dict_t *xdata);</div><div class='add'>+</div><div class='add'>+call_stub_t *</div><div class='add'>+fop_removexattr_stub(call_frame_t *frame, fop_removexattr_t fn, loc_t *loc,</div><div class='add'>+                     const char *name, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+call_stub_t *</div><div class='add'>+fop_removexattr_cbk_stub(call_frame_t *frame, fop_removexattr_cbk_t fn,</div><div class='add'>+                         int32_t op_ret, int32_t op_errno, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+call_stub_t *</div><div class='add'>+fop_fremovexattr_stub(call_frame_t *frame, fop_fremovexattr_t fn, fd_t *fd,</div><div class='add'>+                      const char *name, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+call_stub_t *</div><div class='add'>+fop_fremovexattr_cbk_stub(call_frame_t *frame, fop_fremovexattr_cbk_t fn,</div><div class='add'>+                          int32_t op_ret, int32_t op_errno, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+call_stub_t *</div><div class='add'>+fop_lk_stub(call_frame_t *frame, fop_lk_t fn, fd_t *fd, int32_t cmd,</div><div class='add'>+            struct gf_flock *lock, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+call_stub_t *</div><div class='add'>+fop_lk_cbk_stub(call_frame_t *frame, fop_lk_cbk_t fn, int32_t op_ret,</div><div class='add'>+                int32_t op_errno, struct gf_flock *lock, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+call_stub_t *</div><div class='add'>+fop_inodelk_stub(call_frame_t *frame, fop_inodelk_t fn, const char *volume,</div><div class='add'>+                 loc_t *loc, int32_t cmd, struct gf_flock *lock, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+call_stub_t *</div><div class='add'>+fop_finodelk_stub(call_frame_t *frame, fop_finodelk_t fn, const char *volume,</div><div class='add'>+                  fd_t *fd, int32_t cmd, struct gf_flock *lock, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+call_stub_t *</div><div class='add'>+fop_entrylk_stub(call_frame_t *frame, fop_entrylk_t fn, const char *volume,</div><div class='add'>+                 loc_t *loc, const char *basename, entrylk_cmd cmd,</div><div class='add'>+                 entrylk_type type, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+call_stub_t *</div><div class='add'>+fop_fentrylk_stub(call_frame_t *frame, fop_fentrylk_t fn, const char *volume,</div><div class='add'>+                  fd_t *fd, const char *basename, entrylk_cmd cmd,</div><div class='add'>+                  entrylk_type type, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+call_stub_t *</div><div class='add'>+fop_inodelk_cbk_stub(call_frame_t *frame, fop_inodelk_cbk_t fn, int32_t op_ret,</div><div class='add'>+                     int32_t op_errno, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+call_stub_t *</div><div class='add'>+fop_finodelk_cbk_stub(call_frame_t *frame, fop_inodelk_cbk_t fn, int32_t op_ret,</div><div class='add'>+                      int32_t op_errno, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+call_stub_t *</div><div class='add'>+fop_entrylk_cbk_stub(call_frame_t *frame, fop_entrylk_cbk_t fn, int32_t op_ret,</div><div class='add'>+                     int32_t op_errno, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+call_stub_t *</div><div class='add'>+fop_fentrylk_cbk_stub(call_frame_t *frame, fop_entrylk_cbk_t fn, int32_t op_ret,</div><div class='add'>+                      int32_t op_errno, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+call_stub_t *</div><div class='add'>+fop_readdir_stub(call_frame_t *frame, fop_readdir_t fn, fd_t *fd, size_t size,</div><div class='add'>+                 off_t off, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+call_stub_t *</div><div class='add'>+fop_readdirp_stub(call_frame_t *frame, fop_readdirp_t fn, fd_t *fd, size_t size,</div><div class='add'>+                  off_t off, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+call_stub_t *</div><div class='add'>+fop_readdirp_cbk_stub(call_frame_t *frame, fop_readdir_cbk_t fn, int32_t op_ret,</div><div class='add'>+                      int32_t op_errno, gf_dirent_t *entries, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+call_stub_t *</div><div class='add'>+fop_readdir_cbk_stub(call_frame_t *frame, fop_readdir_cbk_t fn, int32_t op_ret,</div><div class='add'>+                     int32_t op_errno, gf_dirent_t *entries, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+call_stub_t *</div><div class='add'>+fop_rchecksum_stub(call_frame_t *frame, fop_rchecksum_t fn, fd_t *fd,</div><div class='add'>+                   off_t offset, int32_t len, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+call_stub_t *</div><div class='add'>+fop_rchecksum_cbk_stub(call_frame_t *frame, fop_rchecksum_cbk_t fn,</div><div class='add'>+                       int32_t op_ret, int32_t op_errno, uint32_t weak_checksum,</div><div class='add'>+                       uint8_t *strong_checksum, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+call_stub_t *</div><div class='add'>+fop_xattrop_stub(call_frame_t *frame, fop_xattrop_t fn, loc_t *loc,</div><div class='add'>+                 gf_xattrop_flags_t optype, dict_t *xattr, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+call_stub_t *</div><div class='add'>+fop_xattrop_stub_cbk_stub(call_frame_t *frame, fop_xattrop_cbk_t fn,</div><div class='add'>+                          int32_t op_ret, int32_t op_errno, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+call_stub_t *</div><div class='add'>+fop_fxattrop_stub(call_frame_t *frame, fop_fxattrop_t fn, fd_t *fd,</div><div class='add'>+                  gf_xattrop_flags_t optype, dict_t *xattr, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+call_stub_t *</div><div class='add'>+fop_fxattrop_stub_cbk_stub(call_frame_t *frame, fop_xattrop_cbk_t fn,</div><div class='add'>+                           int32_t op_ret, int32_t op_errno, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+call_stub_t *</div><div class='add'>+fop_setattr_stub(call_frame_t *frame, fop_setattr_t fn, loc_t *loc,</div><div class='add'>+                 struct iatt *stbuf, int32_t valid, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+call_stub_t *</div><div class='add'>+fop_setattr_cbk_stub(call_frame_t *frame, fop_setattr_cbk_t fn, int32_t op_ret,</div><div class='add'>+                     int32_t op_errno, struct iatt *statpre,</div><div class='add'>+                     struct iatt *statpost, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+call_stub_t *</div><div class='add'>+fop_fsetattr_stub(call_frame_t *frame, fop_fsetattr_t fn, fd_t *fd,</div><div class='add'>+                  struct iatt *stbuf, int32_t valid, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+call_stub_t *</div><div class='add'>+fop_fsetattr_cbk_stub(call_frame_t *frame, fop_setattr_cbk_t fn, int32_t op_ret,</div><div class='add'>+                      int32_t op_errno, struct iatt *statpre,</div><div class='add'>+                      struct iatt *statpost, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+call_stub_t *</div><div class='add'>+fop_fallocate_stub(call_frame_t *frame, fop_fallocate_t fn, fd_t *fd,</div><div class='add'>+                   int32_t mode, off_t offset, size_t len, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+call_stub_t *</div><div class='add'>+fop_fallocate_cbk_stub(call_frame_t *frame, fop_fallocate_cbk_t fn,</div><div class='add'>+                       int32_t op_ret, int32_t op_errno, struct iatt *statpre,</div><div class='add'>+                       struct iatt *statpost, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+call_stub_t *</div><div class='add'>+fop_discard_stub(call_frame_t *frame, fop_discard_t fn, fd_t *fd, off_t offset,</div><div class='add'>+                 size_t len, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+call_stub_t *</div><div class='add'>+fop_discard_cbk_stub(call_frame_t *frame, fop_discard_cbk_t fn, int32_t op_ret,</div><div class='add'>+                     int32_t op_errno, struct iatt *statpre,</div><div class='add'>+                     struct iatt *statpost, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+call_stub_t *</div><div class='add'>+fop_zerofill_stub(call_frame_t *frame, fop_zerofill_t fn, fd_t *fd,</div><div class='add'>+                  off_t offset, off_t len, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+call_stub_t *</div><div class='add'>+fop_zerofill_cbk_stub(call_frame_t *frame, fop_zerofill_cbk_t fn,</div><div class='add'>+                      int32_t op_ret, int32_t op_errno, struct iatt *statpre,</div><div class='add'>+                      struct iatt *statpost, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+call_stub_t *</div><div class='add'>+fop_ipc_stub(call_frame_t *frame, fop_ipc_t fn, int32_t op, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+call_stub_t *</div><div class='add'>+fop_ipc_cbk_stub(call_frame_t *frame, fop_ipc_cbk_t fn, int32_t op_ret,</div><div class='add'>+                 int32_t op_errno, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+call_stub_t *</div><div class='add'>+fop_seek_stub(call_frame_t *frame, fop_seek_t fn, fd_t *fd, off_t offset,</div><div class='add'>+              gf_seek_what_t what, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+call_stub_t *</div><div class='add'>+fop_seek_cbk_stub(call_frame_t *frame, fop_seek_cbk_t fn, int32_t op_ret,</div><div class='add'>+                  int32_t op_errno, off_t offset, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+call_stub_t *</div><div class='add'>+fop_lease_stub(call_frame_t *frame, fop_lease_t fn, loc_t *loc,</div><div class='add'>+               struct gf_lease *lease, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+call_stub_t *</div><div class='add'>+fop_lease_cbk_stub(call_frame_t *frame, fop_lease_cbk_t fn, int32_t op_ret,</div><div class='add'>+                   int32_t op_errno, struct gf_lease *lease, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+call_stub_t *</div><div class='add'>+fop_getactivelk_stub(call_frame_t *frame, fop_getactivelk_t fn, loc_t *loc,</div><div class='add'>+                     dict_t *xdata);</div><div class='add'>+</div><div class='add'>+call_stub_t *</div><div class='add'>+fop_getactivelk_cbk_stub(call_frame_t *frame, fop_getactivelk_cbk_t fn,</div><div class='add'>+                         int32_t op_ret, int32_t op_errno,</div><div class='add'>+                         lock_migration_info_t *lmi, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+call_stub_t *</div><div class='add'>+fop_setactivelk_stub(call_frame_t *frame, fop_setactivelk_t fn, loc_t *loc,</div><div class='add'>+                     lock_migration_info_t *locklist, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+call_stub_t *</div><div class='add'>+fop_setactivelk_cbk_stub(call_frame_t *frame, fop_setactivelk_cbk_t fn,</div><div class='add'>+                         int32_t op_ret, int32_t op_errno, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+call_stub_t *</div><div class='add'>+fop_put_stub(call_frame_t *frame, fop_put_t fn, loc_t *loc, mode_t mode,</div><div class='add'>+             mode_t umask, uint32_t flags, struct iovec *vector, int32_t count,</div><div class='add'>+             off_t offset, struct iobref *iobref, dict_t *xattr, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+call_stub_t *</div><div class='add'>+fop_put_cbk_stub(call_frame_t *frame, fop_put_cbk_t fn, int32_t op_ret,</div><div class='add'>+                 int32_t op_errno, inode_t *inode, struct iatt *buf,</div><div class='add'>+                 struct iatt *preparent, struct iatt *postparent,</div><div class='add'>+                 dict_t *xdata);</div><div class='add'>+</div><div class='add'>+call_stub_t *</div><div class='add'>+fop_icreate_stub(call_frame_t *frame, fop_icreate_t fn, loc_t *loc, mode_t mode,</div><div class='add'>+                 dict_t *xdata);</div><div class='add'>+</div><div class='add'>+call_stub_t *</div><div class='add'>+fop_namelink_stub(call_frame_t *frame, fop_namelink_t fn, loc_t *loc,</div><div class='add'>+                  dict_t *xdata);</div><div class='add'>+</div><div class='add'>+call_stub_t *</div><div class='add'>+fop_icreate_cbk_stub(call_frame_t *frame, fop_icreate_cbk_t fn, int32_t op_ret,</div><div class='add'>+                     int32_t op_errno, inode_t *inode, struct iatt *buf,</div><div class='add'>+                     dict_t *xdata);</div><div class='add'>+</div><div class='add'>+call_stub_t *</div><div class='add'>+fop_namelink_cbk_stub(call_frame_t *frame, fop_namelink_cbk_t fn,</div><div class='add'>+                      int32_t op_ret, int32_t op_errno, struct iatt *prebuf,</div><div class='add'>+                      struct iatt *postbuf, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+call_stub_t *</div><div class='add'>+fop_copy_file_range_stub(call_frame_t *frame, fop_copy_file_range_t fn,</div><div class='add'>+                         fd_t *fd_in, off64_t off_in, fd_t *fd_out,</div><div class='add'>+                         off64_t off_out, size_t len, uint32_t flags,</div><div class='add'>+                         dict_t *xdata);</div><div class='add'>+</div><div class='add'>+call_stub_t *</div><div class='add'>+fop_copy_file_range_cbk_stub(call_frame_t *frame, fop_copy_file_range_cbk_t fn,</div><div class='add'>+                             int32_t op_ret, int32_t op_errno,</div><div class='add'>+                             struct iatt *stbuf, struct iatt *prebuf_dst,</div><div class='add'>+                             struct iatt *postbuf_dst, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+call_resume(call_stub_t *stub);</div><div class='add'>+void</div><div class='add'>+call_resume_keep_stub(call_stub_t *stub);</div><div class='add'>+void</div><div class='add'>+call_stub_destroy(call_stub_t *stub);</div><div class='add'>+void</div><div class='add'>+call_unwind_error(call_stub_t *stub, int op_ret, int op_errno);</div><div class='add'>+void</div><div class='add'>+call_unwind_error_keep_stub(call_stub_t *stub, int op_ret, int op_errno);</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+ * Sometimes we might want to call just this, perhaps repeatedly, without</div><div class='add'>+ * having (or being able) to destroy and recreate it.</div><div class='add'>+ */</div><div class='add'>+void</div><div class='add'>+call_resume_wind(call_stub_t *stub);</div><div class='add'>+</div><div class='add'>+#endif</div><div class='head'>diff --git a/libglusterfs/src/glusterfs/checksum.h b/libglusterfs/src/glusterfs/checksum.h<br/>new file mode 100644<br/>index 00000000000..019bb14df71<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/libglusterfs/src/glusterfs/checksum.h?id=d1d7a6f35c816822fab51c820e25023863c239c1'>libglusterfs/src/glusterfs/checksum.h</a></div><div class='hunk'>@@ -0,0 +1,22 @@</div><div class='add'>+/*</div><div class='add'>+  Copyright (c) 2008-2012 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#ifndef __CHECKSUM_H__</div><div class='add'>+#define __CHECKSUM_H__</div><div class='add'>+</div><div class='add'>+uint32_t</div><div class='add'>+gf_rsync_weak_checksum(unsigned char *buf, size_t len);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+gf_rsync_strong_checksum(unsigned char *buf, size_t len, unsigned char *sum);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+gf_rsync_md5_checksum(unsigned char *data, size_t len, unsigned char *md5);</div><div class='add'>+#endif /* __CHECKSUM_H__ */</div><div class='head'>diff --git a/libglusterfs/src/glusterfs/circ-buff.h b/libglusterfs/src/glusterfs/circ-buff.h<br/>new file mode 100644<br/>index 00000000000..822345b641b<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/libglusterfs/src/glusterfs/circ-buff.h?id=d1d7a6f35c816822fab51c820e25023863c239c1'>libglusterfs/src/glusterfs/circ-buff.h</a></div><div class='hunk'>@@ -0,0 +1,61 @@</div><div class='add'>+/*</div><div class='add'>+  Copyright (c) 2008-2012 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#ifndef _CB_H</div><div class='add'>+#define _CB_H</div><div class='add'>+</div><div class='add'>+#include "glusterfs/common-utils.h"</div><div class='add'>+</div><div class='add'>+#define BUFFER_SIZE 10</div><div class='add'>+#define TOTAL_SIZE BUFFER_SIZE + 1</div><div class='add'>+</div><div class='add'>+struct _circular_buffer {</div><div class='add'>+    struct timeval tv;</div><div class='add'>+    void *data;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+typedef struct _circular_buffer circular_buffer_t;</div><div class='add'>+</div><div class='add'>+struct _buffer {</div><div class='add'>+    unsigned int w_index;</div><div class='add'>+    size_t size_buffer;</div><div class='add'>+    gf_boolean_t use_once;</div><div class='add'>+    /* This variable is assigned the proper value at the time of initing */</div><div class='add'>+    /* the buffer. It indicates, whether the buffer should be used once */</div><div class='add'>+    /*  it becomes full. */</div><div class='add'>+</div><div class='add'>+    int used_len;</div><div class='add'>+    /* indicates the amount of circular buffer used. */</div><div class='add'>+</div><div class='add'>+    circular_buffer_t **cb;</div><div class='add'>+    void (*destroy_buffer_data)(void *data);</div><div class='add'>+    pthread_mutex_t lock;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+typedef struct _buffer buffer_t;</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+cb_add_entry_buffer(buffer_t *buffer, void *item);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+cb_buffer_show(buffer_t *buffer);</div><div class='add'>+</div><div class='add'>+buffer_t *</div><div class='add'>+cb_buffer_new(size_t buffer_size, gf_boolean_t use_buffer_once,</div><div class='add'>+              void (*destroy_data)(void *data));</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+cb_buffer_destroy(buffer_t *buffer);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+cb_buffer_dump(buffer_t *buffer, void *data,</div><div class='add'>+               int(fn)(circular_buffer_t *buffer, void *data));</div><div class='add'>+</div><div class='add'>+#endif /* _CB_H */</div><div class='head'>diff --git a/libglusterfs/src/glusterfs/client_t.h b/libglusterfs/src/glusterfs/client_t.h<br/>new file mode 100644<br/>index 00000000000..a2c508e1d5c<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/libglusterfs/src/glusterfs/client_t.h?id=d1d7a6f35c816822fab51c820e25023863c239c1'>libglusterfs/src/glusterfs/client_t.h</a></div><div class='hunk'>@@ -0,0 +1,147 @@</div><div class='add'>+/*</div><div class='add'>+  Copyright (c) 2008-2012 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#ifndef _CLIENT_T_H</div><div class='add'>+#define _CLIENT_T_H</div><div class='add'>+</div><div class='add'>+#include "glusterfs/glusterfs.h"</div><div class='add'>+#include "glusterfs/locking.h" /* for gf_lock_t, not included by glusterfs.h */</div><div class='add'>+#include "glusterfs/atomic.h"  /* for gf_atomic_t */</div><div class='add'>+</div><div class='add'>+/* auth_data structure is required by RPC layer. But as it is also used in</div><div class='add'>+ * client_t structure validation, comparision, it is critical that it is defined</div><div class='add'>+ * in the larger scope of libglusterfs, instead of libgfrpc. With this change,</div><div class='add'>+ * even RPC will use this structure */</div><div class='add'>+#define GF_CLIENTT_AUTH_BYTES 400</div><div class='add'>+typedef struct client_auth_data {</div><div class='add'>+    int flavour;</div><div class='add'>+    int datalen;</div><div class='add'>+    char authdata[GF_CLIENTT_AUTH_BYTES];</div><div class='add'>+} client_auth_data_t;</div><div class='add'>+</div><div class='add'>+struct client_ctx {</div><div class='add'>+    void *ctx_key;</div><div class='add'>+    void *ctx_value;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+typedef struct _client {</div><div class='add'>+    struct {</div><div class='add'>+        /* e.g. protocol/server stashes its ctx here */</div><div class='add'>+        gf_lock_t lock;</div><div class='add'>+        unsigned short count;</div><div class='add'>+        struct client_ctx *ctx;</div><div class='add'>+    } scratch_ctx;</div><div class='add'>+    gf_atomic_t bind;</div><div class='add'>+    gf_atomic_t count;</div><div class='add'>+    xlator_t *bound_xl;</div><div class='add'>+    xlator_t *this;</div><div class='add'>+    int tbl_index;</div><div class='add'>+    char *client_uid;</div><div class='add'>+    char *client_name;</div><div class='add'>+    struct {</div><div class='add'>+        int flavour;</div><div class='add'>+        size_t len;</div><div class='add'>+        char *data;</div><div class='add'>+        char *username;</div><div class='add'>+        char *passwd;</div><div class='add'>+    } auth;</div><div class='add'>+</div><div class='add'>+    /* subdir_mount */</div><div class='add'>+    char *subdir_mount;</div><div class='add'>+    inode_t *subdir_inode;</div><div class='add'>+    uuid_t subdir_gfid;</div><div class='add'>+    int32_t opversion;</div><div class='add'>+    /* Variable to save fd_count for detach brick */</div><div class='add'>+    gf_atomic_t fd_cnt;</div><div class='add'>+} client_t;</div><div class='add'>+</div><div class='add'>+#define GF_CLIENTCTX_INITIAL_SIZE 8</div><div class='add'>+</div><div class='add'>+struct client_table_entry {</div><div class='add'>+    client_t *client;</div><div class='add'>+    int next_free;</div><div class='add'>+};</div><div class='add'>+typedef struct client_table_entry cliententry_t;</div><div class='add'>+</div><div class='add'>+struct clienttable {</div><div class='add'>+    unsigned int max_clients;</div><div class='add'>+    gf_lock_t lock;</div><div class='add'>+    cliententry_t *cliententries;</div><div class='add'>+    int first_free;</div><div class='add'>+    client_t *local;</div><div class='add'>+};</div><div class='add'>+typedef struct clienttable clienttable_t;</div><div class='add'>+</div><div class='add'>+#define GF_CLIENTTABLE_INITIAL_SIZE 128</div><div class='add'>+</div><div class='add'>+/* Signifies no more entries in the client table. */</div><div class='add'>+#define GF_CLIENTTABLE_END -1</div><div class='add'>+</div><div class='add'>+/* This is used to invalidate</div><div class='add'>+ * the next_free value in an cliententry that has been allocated</div><div class='add'>+ */</div><div class='add'>+#define GF_CLIENTENTRY_ALLOCATED -2</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+gf_client_put(client_t *client, gf_boolean_t *detached);</div><div class='add'>+</div><div class='add'>+clienttable_t *</div><div class='add'>+gf_clienttable_alloc(void);</div><div class='add'>+</div><div class='add'>+client_t *</div><div class='add'>+gf_client_ref(client_t *client);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+gf_client_unref(client_t *client);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+gf_client_dump_fdtable_to_dict(xlator_t *this, dict_t *dict);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+gf_client_dump_fdtable(xlator_t *this);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+gf_client_dump_inodes_to_dict(xlator_t *this, dict_t *dict);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+gf_client_dump_inodes(xlator_t *this);</div><div class='add'>+</div><div class='add'>+void *</div><div class='add'>+client_ctx_set(client_t *client, void *key, void *value);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+client_ctx_get(client_t *client, void *key, void **value);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+client_ctx_del(client_t *client, void *key, void **value);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+client_ctx_dump(client_t *client, char *prefix);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+gf_client_dump_fdtables_to_dict(xlator_t *this, dict_t *dict);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+gf_client_dump_fdtables(xlator_t *this);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+gf_client_dump_inodes_to_dict(xlator_t *this, dict_t *dict);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+gf_client_dump_inodes(xlator_t *this);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+gf_client_disconnect(client_t *client);</div><div class='add'>+</div><div class='add'>+client_t *</div><div class='add'>+gf_client_get(xlator_t *this, client_auth_data_t *cred, char *client_uid,</div><div class='add'>+              char *subdir_mount);</div><div class='add'>+</div><div class='add'>+#endif /* _CLIENT_T_H */</div><div class='head'>diff --git a/libglusterfs/src/glusterfs/cluster-syncop.h b/libglusterfs/src/glusterfs/cluster-syncop.h<br/>new file mode 100644<br/>index 00000000000..d0ad5ed548c<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/libglusterfs/src/glusterfs/cluster-syncop.h?id=d1d7a6f35c816822fab51c820e25023863c239c1'>libglusterfs/src/glusterfs/cluster-syncop.h</a></div><div class='hunk'>@@ -0,0 +1,227 @@</div><div class='add'>+/*</div><div class='add'>+  Copyright (c) 2015 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#ifndef _CLUSTER_SYNCOP_H</div><div class='add'>+#define _CLUSTER_SYNCOP_H</div><div class='add'>+</div><div class='add'>+#include &lt;sys/time.h&gt;</div><div class='add'>+#include &lt;pthread.h&gt;</div><div class='add'>+#include &lt;ucontext.h&gt;</div><div class='add'>+</div><div class='add'>+#include "glusterfs/defaults.h"</div><div class='add'>+#include "glusterfs/default-args.h"</div><div class='add'>+#include "glusterfs/syncop.h"</div><div class='add'>+</div><div class='add'>+/*********************************************************************</div><div class='add'>+ *</div><div class='add'>+ * PARALLEL_FOP_ONLIST:</div><div class='add'>+ *          Performs file operations in parallel on bricks.</div><div class='add'>+ * This macro expects a helper function(func) to implement the</div><div class='add'>+ * functionality.</div><div class='add'>+ *</div><div class='add'>+ ********************************************************************/</div><div class='add'>+#define PARALLEL_FOP_ONLIST(subvols, on, numsubvols, replies, frame, func,     \</div><div class='add'>+                            args...)                                           \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        int __i = 0;                                                           \</div><div class='add'>+        int __count = 0;                                                       \</div><div class='add'>+        cluster_local_t __local = {                                            \</div><div class='add'>+            0,                                                                 \</div><div class='add'>+        };                                                                     \</div><div class='add'>+        void *__old_local = frame-&gt;local;                                      \</div><div class='add'>+                                                                               \</div><div class='add'>+        __local.replies = replies;                                             \</div><div class='add'>+        cluster_replies_wipe(replies, numsubvols);                             \</div><div class='add'>+        for (__i = 0; __i &lt; numsubvols; __i++)                                 \</div><div class='add'>+            INIT_LIST_HEAD(&amp;replies[__i].entries.list);                        \</div><div class='add'>+        if (syncbarrier_init(&amp;__local.barrier))                                \</div><div class='add'>+            break;                                                             \</div><div class='add'>+        frame-&gt;local = &amp;__local;                                               \</div><div class='add'>+        for (__i = 0; __i &lt; numsubvols; __i++) {                               \</div><div class='add'>+            if (on[__i]) {                                                     \</div><div class='add'>+                __count++;                                                     \</div><div class='add'>+            }                                                                  \</div><div class='add'>+        }                                                                      \</div><div class='add'>+        __local.barrier.waitfor = __count;                                     \</div><div class='add'>+        for (__i = 0; __i &lt; numsubvols; __i++) {                               \</div><div class='add'>+            if (on[__i]) {                                                     \</div><div class='add'>+                func(frame, subvols[__i], __i, ##args);                        \</div><div class='add'>+            }                                                                  \</div><div class='add'>+        }                                                                      \</div><div class='add'>+        syncbarrier_wait(&amp;__local.barrier, __count);                           \</div><div class='add'>+        syncbarrier_destroy(&amp;__local.barrier);                                 \</div><div class='add'>+        frame-&gt;local = __old_local;                                            \</div><div class='add'>+        STACK_RESET(frame-&gt;root);                                              \</div><div class='add'>+    } while (0)</div><div class='add'>+</div><div class='add'>+typedef struct cluster_local_ {</div><div class='add'>+    default_args_cbk_t *replies;</div><div class='add'>+    syncbarrier_t barrier;</div><div class='add'>+} cluster_local_t;</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+cluster_lookup(xlator_t **subvols, unsigned char *on, int numsubvols,</div><div class='add'>+               default_args_cbk_t *replies, unsigned char *output,</div><div class='add'>+               call_frame_t *frame, xlator_t *this, loc_t *loc, dict_t *xdata);</div><div class='add'>+int32_t</div><div class='add'>+cluster_setattr(xlator_t **subvols, unsigned char *on, int numsubvols,</div><div class='add'>+                default_args_cbk_t *replies, unsigned char *output,</div><div class='add'>+                call_frame_t *frame, xlator_t *this, loc_t *loc,</div><div class='add'>+                struct iatt *stbuf, int32_t valid, dict_t *xdata);</div><div class='add'>+int32_t</div><div class='add'>+cluster_getxattr(xlator_t **subvols, unsigned char *on, int numsubvols,</div><div class='add'>+                 default_args_cbk_t *replies, unsigned char *output,</div><div class='add'>+                 call_frame_t *frame, xlator_t *this, loc_t *loc,</div><div class='add'>+                 const char *name, dict_t *xdata);</div><div class='add'>+int32_t</div><div class='add'>+cluster_setxattr(xlator_t **subvols, unsigned char *on, int numsubvols,</div><div class='add'>+                 default_args_cbk_t *replies, unsigned char *output,</div><div class='add'>+                 call_frame_t *frame, xlator_t *this, loc_t *loc, dict_t *dict,</div><div class='add'>+                 int32_t flags, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+cluster_inodelk(xlator_t **subvols, unsigned char *on, int numsubvols,</div><div class='add'>+                default_args_cbk_t *replies, unsigned char *locked_on,</div><div class='add'>+                call_frame_t *frame, xlator_t *this, char *dom, inode_t *inode,</div><div class='add'>+                off_t off, size_t size);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+cluster_uninodelk(xlator_t **subvols, unsigned char *locked_on, int numsubvols,</div><div class='add'>+                  default_args_cbk_t *replies, unsigned char *output,</div><div class='add'>+                  call_frame_t *frame, xlator_t *this, char *dom,</div><div class='add'>+                  inode_t *inode, off_t off, size_t size);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+cluster_entrylk(xlator_t **subvols, unsigned char *on, int numsubvols,</div><div class='add'>+                default_args_cbk_t *replies, unsigned char *locked_on,</div><div class='add'>+                call_frame_t *frame, xlator_t *this, char *dom, inode_t *inode,</div><div class='add'>+                const char *name);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+cluster_rmdir(xlator_t **subvols, unsigned char *on, int numsubvols,</div><div class='add'>+              default_args_cbk_t *replies, unsigned char *output,</div><div class='add'>+              call_frame_t *frame, xlator_t *this, loc_t *loc, int flags,</div><div class='add'>+              dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+cluster_unlink(xlator_t **subvols, unsigned char *on, int numsubvols,</div><div class='add'>+               default_args_cbk_t *replies, unsigned char *output,</div><div class='add'>+               call_frame_t *frame, xlator_t *this, loc_t *loc, int xflag,</div><div class='add'>+               dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+cluster_mkdir(xlator_t **subvols, unsigned char *on, int numsubvols,</div><div class='add'>+              default_args_cbk_t *replies, unsigned char *output,</div><div class='add'>+              call_frame_t *frame, xlator_t *this, loc_t *loc, mode_t mode,</div><div class='add'>+              mode_t umask, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+cluster_readlink(xlator_t **subvols, unsigned char *on, int numsubvols,</div><div class='add'>+                 default_args_cbk_t *replies, unsigned char *output,</div><div class='add'>+                 call_frame_t *frame, xlator_t *this, loc_t *loc, size_t size,</div><div class='add'>+                 dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+cluster_symlink(xlator_t **subvols, unsigned char *on, int numsubvols,</div><div class='add'>+                default_args_cbk_t *replies, unsigned char *output,</div><div class='add'>+                call_frame_t *frame, xlator_t *this, const char *linkpath,</div><div class='add'>+                loc_t *loc, mode_t umask, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+cluster_link(xlator_t **subvols, unsigned char *on, int numsubvols,</div><div class='add'>+             default_args_cbk_t *replies, unsigned char *output,</div><div class='add'>+             call_frame_t *frame, xlator_t *this, loc_t *oldloc, loc_t *newloc,</div><div class='add'>+             dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+cluster_mknod(xlator_t **subvols, unsigned char *on, int numsubvols,</div><div class='add'>+              default_args_cbk_t *replies, unsigned char *output,</div><div class='add'>+              call_frame_t *frame, xlator_t *this, loc_t *loc, mode_t mode,</div><div class='add'>+              dev_t rdev, mode_t umask, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+cluster_unentrylk(xlator_t **subvols, unsigned char *locked_on, int numsubvols,</div><div class='add'>+                  default_args_cbk_t *replies, unsigned char *output,</div><div class='add'>+                  call_frame_t *frame, xlator_t *this, char *dom,</div><div class='add'>+                  inode_t *inode, const char *name);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+cluster_tryentrylk(xlator_t **subvols, unsigned char *on, int numsubvols,</div><div class='add'>+                   default_args_cbk_t *replies, unsigned char *locked_on,</div><div class='add'>+                   call_frame_t *frame, xlator_t *this, char *dom,</div><div class='add'>+                   inode_t *inode, const char *name);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+cluster_fxattrop(xlator_t **subvols, unsigned char *on, int numsubvols,</div><div class='add'>+                 default_args_cbk_t *replies, unsigned char *output,</div><div class='add'>+                 call_frame_t *frame, xlator_t *this, fd_t *fd,</div><div class='add'>+                 gf_xattrop_flags_t flags, dict_t *dict, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+cluster_xattrop(xlator_t **subvols, unsigned char *on, int numsubvols,</div><div class='add'>+                default_args_cbk_t *replies, unsigned char *output,</div><div class='add'>+                call_frame_t *frame, xlator_t *this, loc_t *loc,</div><div class='add'>+                gf_xattrop_flags_t flags, dict_t *dict, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+cluster_fstat(xlator_t **subvols, unsigned char *on, int numsubvols,</div><div class='add'>+              default_args_cbk_t *replies, unsigned char *output,</div><div class='add'>+              call_frame_t *frame, xlator_t *this, fd_t *fd, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+cluster_ftruncate(xlator_t **subvols, unsigned char *on, int numsubvols,</div><div class='add'>+                  default_args_cbk_t *replies, unsigned char *output,</div><div class='add'>+                  call_frame_t *frame, xlator_t *this, fd_t *fd, off_t offset,</div><div class='add'>+                  dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+cluster_open(xlator_t **subvols, unsigned char *on, int numsubvols,</div><div class='add'>+             default_args_cbk_t *replies, unsigned char *output,</div><div class='add'>+             call_frame_t *frame, xlator_t *this, loc_t *loc, int32_t flags,</div><div class='add'>+             fd_t *fd, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+cluster_tryinodelk(xlator_t **subvols, unsigned char *on, int numsubvols,</div><div class='add'>+                   default_args_cbk_t *replies, unsigned char *locked_on,</div><div class='add'>+                   call_frame_t *frame, xlator_t *this, char *dom,</div><div class='add'>+                   inode_t *inode, off_t off, size_t size);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+cluster_fsetattr(xlator_t **subvols, unsigned char *on, int numsubvols,</div><div class='add'>+                 default_args_cbk_t *replies, unsigned char *output,</div><div class='add'>+                 call_frame_t *frame, xlator_t *this, fd_t *fd,</div><div class='add'>+                 struct iatt *stbuf, int32_t valid, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+cluster_put(xlator_t **subvols, unsigned char *on, int numsubvols,</div><div class='add'>+            default_args_cbk_t *replies, unsigned char *output,</div><div class='add'>+            call_frame_t *frame, xlator_t *this, loc_t *loc, mode_t mode,</div><div class='add'>+            mode_t umask, uint32_t flags, struct iovec *vector, int32_t count,</div><div class='add'>+            off_t offset, struct iobref *iobref, dict_t *xattr, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+cluster_replies_wipe(default_args_cbk_t *replies, int num_subvols);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+cluster_fop_success_fill(default_args_cbk_t *replies, int numsubvols,</div><div class='add'>+                         unsigned char *success);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+cluster_xattrop_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                    int32_t op_ret, int32_t op_errno, dict_t *dict,</div><div class='add'>+                    dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+cluster_tiebreaker_inodelk(xlator_t **subvols, unsigned char *on,</div><div class='add'>+                           int numsubvols, default_args_cbk_t *replies,</div><div class='add'>+                           unsigned char *locked_on, call_frame_t *frame,</div><div class='add'>+                           xlator_t *this, char *dom, inode_t *inode, off_t off,</div><div class='add'>+                           size_t size);</div><div class='add'>+#endif /* !_CLUSTER_SYNCOP_H */</div><div class='head'>diff --git a/libglusterfs/src/glusterfs/common-utils.h b/libglusterfs/src/glusterfs/common-utils.h<br/>new file mode 100644<br/>index 00000000000..f297fdab5c9<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/libglusterfs/src/glusterfs/common-utils.h?id=d1d7a6f35c816822fab51c820e25023863c239c1'>libglusterfs/src/glusterfs/common-utils.h</a></div><div class='hunk'>@@ -0,0 +1,1256 @@</div><div class='add'>+/*</div><div class='add'>+  Copyright (c) 2008-2012 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#ifndef _COMMON_UTILS_H</div><div class='add'>+#define _COMMON_UTILS_H</div><div class='add'>+</div><div class='add'>+#include &lt;stdint.h&gt;</div><div class='add'>+#include &lt;sys/uio.h&gt;</div><div class='add'>+#include &lt;netdb.h&gt;</div><div class='add'>+#include &lt;stdlib.h&gt;</div><div class='add'>+#include &lt;string.h&gt;</div><div class='add'>+#include &lt;assert.h&gt;</div><div class='add'>+#include &lt;pthread.h&gt;</div><div class='add'>+#include &lt;unistd.h&gt;</div><div class='add'>+#include &lt;openssl/md5.h&gt;</div><div class='add'>+#ifndef GF_BSD_HOST_OS</div><div class='add'>+#include &lt;alloca.h&gt;</div><div class='add'>+#endif</div><div class='add'>+#include &lt;limits.h&gt;</div><div class='add'>+#include &lt;fnmatch.h&gt;</div><div class='add'>+#include &lt;uuid/uuid.h&gt;</div><div class='add'>+</div><div class='add'>+/* FreeBSD, etc. */</div><div class='add'>+#ifndef __BITS_PER_LONG</div><div class='add'>+#define __BITS_PER_LONG (CHAR_BIT * (sizeof(long)))</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#ifndef ffsll</div><div class='add'>+#define ffsll(x) __builtin_ffsll(x)</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+trap(void);</div><div class='add'>+</div><div class='add'>+#define GF_UNIVERSAL_ANSWER 42 /* :O */</div><div class='add'>+</div><div class='add'>+/* To solve type punned error */</div><div class='add'>+#define VOID(ptr) ((void **)((void *)ptr))</div><div class='add'>+</div><div class='add'>+#include "glusterfs/mem-pool.h"</div><div class='add'>+#include "glusterfs/compat-uuid.h"</div><div class='add'>+#include "glusterfs/iatt.h"</div><div class='add'>+#include "glusterfs/libglusterfs-messages.h"</div><div class='add'>+</div><div class='add'>+#define STRINGIFY(val) #val</div><div class='add'>+#define TOSTRING(val) STRINGIFY(val)</div><div class='add'>+</div><div class='add'>+#define alloca0(size)                                                          \</div><div class='add'>+    ({                                                                         \</div><div class='add'>+        void *__ptr;                                                           \</div><div class='add'>+        __ptr = alloca(size);                                                  \</div><div class='add'>+        memset(__ptr, 0, size);                                                \</div><div class='add'>+        __ptr;                                                                 \</div><div class='add'>+    })</div><div class='add'>+</div><div class='add'>+#define min(a, b) ((a) &lt; (b) ? (a) : (b))</div><div class='add'>+#define max(a, b) ((a) &gt; (b) ? (a) : (b))</div><div class='add'>+#define gf_roof(a, b) ((((a) + (b)-1) / ((b != 0) ? (b) : 1)) * (b))</div><div class='add'>+#define gf_floor(a, b) (((a) / ((b != 0) ? (b) : 1)) * (b))</div><div class='add'>+</div><div class='add'>+#define IPv4_ADDR_SIZE 32</div><div class='add'>+</div><div class='add'>+#define GF_UNIT_KB 1024ULL</div><div class='add'>+#define GF_UNIT_MB 1048576ULL</div><div class='add'>+#define GF_UNIT_GB 1073741824ULL</div><div class='add'>+#define GF_UNIT_TB 1099511627776ULL</div><div class='add'>+#define GF_UNIT_PB 1125899906842624ULL</div><div class='add'>+</div><div class='add'>+#define GF_UNIT_B_STRING "B"</div><div class='add'>+#define GF_UNIT_KB_STRING "KB"</div><div class='add'>+#define GF_UNIT_MB_STRING "MB"</div><div class='add'>+#define GF_UNIT_GB_STRING "GB"</div><div class='add'>+#define GF_UNIT_TB_STRING "TB"</div><div class='add'>+#define GF_UNIT_PB_STRING "PB"</div><div class='add'>+</div><div class='add'>+#define GF_UNIT_PERCENT_STRING "%"</div><div class='add'>+</div><div class='add'>+#define GEOREP "geo-replication"</div><div class='add'>+#define GLUSTERD_NAME "glusterd"</div><div class='add'>+</div><div class='add'>+#define GF_SELINUX_XATTR_KEY "security.selinux"</div><div class='add'>+</div><div class='add'>+#define WIPE(statp)                                                            \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        typeof(*statp) z = {                                                   \</div><div class='add'>+            0,                                                                 \</div><div class='add'>+        };                                                                     \</div><div class='add'>+        if (statp)                                                             \</div><div class='add'>+            *statp = z;                                                        \</div><div class='add'>+    } while (0)</div><div class='add'>+</div><div class='add'>+#define IS_EXT_FS(fs_name)                                                     \</div><div class='add'>+    (!strcmp(fs_name, "ext2") || !strcmp(fs_name, "ext3") ||                   \</div><div class='add'>+     !strcmp(fs_name, "ext4"))</div><div class='add'>+</div><div class='add'>+/* process mode definitions */</div><div class='add'>+#define GF_SERVER_PROCESS 0</div><div class='add'>+#define GF_CLIENT_PROCESS 1</div><div class='add'>+#define GF_GLUSTERD_PROCESS 2</div><div class='add'>+</div><div class='add'>+/* Defining this here as it is needed by glusterd for setting</div><div class='add'>+ * nfs port in volume status.</div><div class='add'>+ */</div><div class='add'>+#define GF_NFS3_PORT 2049</div><div class='add'>+</div><div class='add'>+#define GF_CLIENT_PORT_CEILING 1024</div><div class='add'>+#define GF_IANA_PRIV_PORTS_START 49152 /* RFC 6335 */</div><div class='add'>+#define GF_CLNT_INSECURE_PORT_CEILING (GF_IANA_PRIV_PORTS_START - 1)</div><div class='add'>+#define GF_PORT_MAX 65535</div><div class='add'>+#define GF_PORT_ARRAY_SIZE ((GF_PORT_MAX + 7) / 8)</div><div class='add'>+#define GF_LOCK_TIMER 180</div><div class='add'>+#define GF_MINUTE_IN_SECONDS 60</div><div class='add'>+#define GF_HOUR_IN_SECONDS (60 * 60)</div><div class='add'>+#define GF_DAY_IN_SECONDS (24 * 60 * 60)</div><div class='add'>+#define GF_WEEK_IN_SECONDS (7 * 24 * 60 * 60)</div><div class='add'>+#define GF_SEC_IN_NS 1000000000</div><div class='add'>+#define GF_MS_IN_NS 1000000</div><div class='add'>+#define GF_US_IN_NS 1000</div><div class='add'>+</div><div class='add'>+/* Default timeout for both barrier and changelog translator */</div><div class='add'>+#define BARRIER_TIMEOUT "120"</div><div class='add'>+</div><div class='add'>+/* Default value of signing waiting time to sign a file for bitrot */</div><div class='add'>+#define SIGNING_TIMEOUT "120"</div><div class='add'>+#define BR_WORKERS "4"</div><div class='add'>+</div><div class='add'>+/* xxhash */</div><div class='add'>+#define GF_XXH64_DIGEST_LENGTH 8</div><div class='add'>+#define GF_XXHSUM64_DEFAULT_SEED 0</div><div class='add'>+</div><div class='add'>+/* Shard */</div><div class='add'>+#define GF_XATTR_SHARD_FILE_SIZE "trusted.glusterfs.shard.file-size"</div><div class='add'>+#define SHARD_ROOT_GFID "be318638-e8a0-4c6d-977d-7a937aa84806"</div><div class='add'>+#define DOT_SHARD_REMOVE_ME_GFID "77dd5a45-dbf5-4592-b31b-b440382302e9"</div><div class='add'>+</div><div class='add'>+/* Lease: buffer length for stringified lease id</div><div class='add'>+ * Format: 4hexnum-4hexnum-4hexnum-4hexnum-4hexnum-4hexnum-4hexnum-4hexnum</div><div class='add'>+ * Eg:6c69-6431-2d63-6c6e-7431-0000-0000-0000</div><div class='add'>+ */</div><div class='add'>+#define GF_LEASE_ID_BUF_SIZE ((LEASE_ID_SIZE * 2) + (LEASE_ID_SIZE / 2))</div><div class='add'>+</div><div class='add'>+#define GF_PERCENTAGE(val, total) (((val)*100) / (total))</div><div class='add'>+</div><div class='add'>+/* pthread related */</div><div class='add'>+/* as per the man page, thread-name should be at max 16 bytes */</div><div class='add'>+/* with prefix of 'glfs_' (5), we are left with 11 more bytes */</div><div class='add'>+#define GF_THREAD_NAME_LIMIT 16</div><div class='add'>+#define GF_THREAD_NAME_PREFIX "glfs_"</div><div class='add'>+</div><div class='add'>+/* Advisory buffer size for formatted timestamps (see gf_time_fmt) */</div><div class='add'>+#define GF_TIMESTR_SIZE 256</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+ * we could have initialized these as +ve values and treated</div><div class='add'>+ * them as negative while comparing etc.. (which would have</div><div class='add'>+ * saved us with the pain of assigning values), but since we</div><div class='add'>+ * only have a few clients that use this feature, it's okay.</div><div class='add'>+ */</div><div class='add'>+enum _gf_special_pid {</div><div class='add'>+    GF_CLIENT_PID_MAX = 0,</div><div class='add'>+    GF_CLIENT_PID_GSYNCD = -1,</div><div class='add'>+    GF_CLIENT_PID_HADOOP = -2,</div><div class='add'>+    GF_CLIENT_PID_DEFRAG = -3,</div><div class='add'>+    GF_CLIENT_PID_NO_ROOT_SQUASH = -4,</div><div class='add'>+    GF_CLIENT_PID_QUOTA_MOUNT = -5,</div><div class='add'>+    GF_CLIENT_PID_SELF_HEALD = -6,</div><div class='add'>+    GF_CLIENT_PID_GLFS_HEAL = -7,</div><div class='add'>+    GF_CLIENT_PID_BITD = -8,</div><div class='add'>+    GF_CLIENT_PID_SCRUB = -9,</div><div class='add'>+    GF_CLIENT_PID_TIER_DEFRAG = -10,</div><div class='add'>+    GF_SERVER_PID_TRASH = -11,</div><div class='add'>+    GF_CLIENT_PID_ADD_REPLICA_MOUNT = -12,</div><div class='add'>+    GF_CLIENT_PID_SET_UTIME = -13,</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+enum _gf_xlator_ipc_targets {</div><div class='add'>+    GF_IPC_TARGET_CHANGELOG = 0,</div><div class='add'>+    GF_IPC_TARGET_CTR = 1,</div><div class='add'>+    GF_IPC_TARGET_UPCALL = 2</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+typedef enum _gf_special_pid gf_special_pid_t;</div><div class='add'>+typedef enum _gf_xlator_ipc_targets _gf_xlator_ipc_targets_t;</div><div class='add'>+</div><div class='add'>+/* Array to hold custom xattr keys */</div><div class='add'>+extern char *xattrs_to_heal[];</div><div class='add'>+</div><div class='add'>+char **</div><div class='add'>+get_xattrs_to_heal();</div><div class='add'>+</div><div class='add'>+/* The DHT file rename operation is not a straightforward rename.</div><div class='add'>+ * It involves creating linkto and linkfiles, and can unlink or rename the</div><div class='add'>+ * source file depending on the hashed and cached subvols for the source</div><div class='add'>+ * and target files. this makes it difficult for geo-rep to figure out that</div><div class='add'>+ * a rename operation has taken place.</div><div class='add'>+ *</div><div class='add'>+ * We now send a special key and the values of the source and target pargfids</div><div class='add'>+ * and basenames to indicate to changelog that the operation in question</div><div class='add'>+ * should be treated as a rename. We are explicitly filling and sending this</div><div class='add'>+ * as a binary value in the dictionary as the unlink op will not have the</div><div class='add'>+ * source file information. The lengths of the src and target basenames</div><div class='add'>+ * are used to calculate where to start reading the names in the structure.</div><div class='add'>+ * XFS allows a max of 255 chars for filenames but other file systems might</div><div class='add'>+ * not have such restrictions</div><div class='add'>+ */</div><div class='add'>+typedef struct dht_changelog_rename_info {</div><div class='add'>+    uuid_t old_pargfid;</div><div class='add'>+    uuid_t new_pargfid;</div><div class='add'>+    int32_t oldname_len;</div><div class='add'>+    int32_t newname_len;</div><div class='add'>+    char buffer[1];</div><div class='add'>+} dht_changelog_rename_info_t;</div><div class='add'>+</div><div class='add'>+typedef int (*gf_cmp)(void *, void *);</div><div class='add'>+</div><div class='add'>+struct _dict;</div><div class='add'>+</div><div class='add'>+struct dnscache {</div><div class='add'>+    struct _dict *cache_dict;</div><div class='add'>+    time_t ttl;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct dnscache_entry {</div><div class='add'>+    char *ip;</div><div class='add'>+    char *fqdn;</div><div class='add'>+    time_t timestamp;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct dnscache6 {</div><div class='add'>+    struct addrinfo *first;</div><div class='add'>+    struct addrinfo *next;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct list_node {</div><div class='add'>+    void *ptr;</div><div class='add'>+    struct list_head list;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+extern char *vol_type_str[];</div><div class='add'>+</div><div class='add'>+struct list_node *</div><div class='add'>+list_node_add(void *ptr, struct list_head *list);</div><div class='add'>+struct list_node *</div><div class='add'>+list_node_add_order(void *ptr, struct list_head *list,</div><div class='add'>+                    int (*compare)(struct list_head *, struct list_head *));</div><div class='add'>+void</div><div class='add'>+list_node_del(struct list_node *node);</div><div class='add'>+</div><div class='add'>+struct dnscache *</div><div class='add'>+gf_dnscache_init(time_t ttl);</div><div class='add'>+void</div><div class='add'>+gf_dnscache_deinit(struct dnscache *cache);</div><div class='add'>+struct dnscache_entry *</div><div class='add'>+gf_dnscache_entry_init(void);</div><div class='add'>+void</div><div class='add'>+gf_dnscache_entry_deinit(struct dnscache_entry *entry);</div><div class='add'>+char *</div><div class='add'>+gf_rev_dns_lookup_cached(const char *ip, struct dnscache *dnscache);</div><div class='add'>+</div><div class='add'>+char *</div><div class='add'>+gf_resolve_path_parent(const char *path);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+gf_global_variable_init(void);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+gf_resolve_ip6(const char *hostname, uint16_t port, int family, void **dnscache,</div><div class='add'>+               struct addrinfo **addr_info);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+gf_log_dump_graph(FILE *specfp, glusterfs_graph_t *graph);</div><div class='add'>+void</div><div class='add'>+gf_print_trace(int32_t signal, glusterfs_ctx_t *ctx);</div><div class='add'>+int</div><div class='add'>+gf_set_log_file_path(cmd_args_t *cmd_args, glusterfs_ctx_t *ctx);</div><div class='add'>+int</div><div class='add'>+gf_set_log_ident(cmd_args_t *cmd_args);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+gf_process_getspec_servers_list(cmd_args_t *cmd_args, const char *servers_list);</div><div class='add'>+int</div><div class='add'>+gf_set_volfile_server_common(cmd_args_t *cmd_args, const char *host,</div><div class='add'>+                             const char *transport, int port);</div><div class='add'>+</div><div class='add'>+static inline void</div><div class='add'>+BIT_SET(unsigned char *array, unsigned int index)</div><div class='add'>+{</div><div class='add'>+    unsigned int offset = index / 8;</div><div class='add'>+    unsigned int shift = index % 8;</div><div class='add'>+</div><div class='add'>+    array[offset] |= (1 &lt;&lt; shift);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static inline void</div><div class='add'>+BIT_CLEAR(unsigned char *array, unsigned int index)</div><div class='add'>+{</div><div class='add'>+    unsigned int offset = index / 8;</div><div class='add'>+    unsigned int shift = index % 8;</div><div class='add'>+</div><div class='add'>+    array[offset] &amp;= ~(1 &lt;&lt; shift);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static inline unsigned int</div><div class='add'>+BIT_VALUE(unsigned char *array, unsigned int index)</div><div class='add'>+{</div><div class='add'>+    unsigned int offset = index / 8;</div><div class='add'>+    unsigned int shift = index % 8;</div><div class='add'>+</div><div class='add'>+    return (array[offset] &gt;&gt; shift) &amp; 0x1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#define VECTORSIZE(count) (count * (sizeof(struct iovec)))</div><div class='add'>+</div><div class='add'>+#define STRLEN_0(str) (strlen(str) + 1)</div><div class='add'>+</div><div class='add'>+#define VALIDATE_OR_GOTO(arg, label)                                           \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        if (!arg) {                                                            \</div><div class='add'>+            errno = EINVAL;                                                    \</div><div class='add'>+            gf_msg_callingfn((this ? (this-&gt;name) : "(Govinda! Govinda!)"),    \</div><div class='add'>+                             GF_LOG_WARNING, EINVAL, LG_MSG_INVALID_ARG,       \</div><div class='add'>+                             "invalid argument: " #arg);                       \</div><div class='add'>+            goto label;                                                        \</div><div class='add'>+        }                                                                      \</div><div class='add'>+    } while (0)</div><div class='add'>+</div><div class='add'>+#define GF_VALIDATE_OR_GOTO(name, arg, label)                                  \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        if (!arg) {                                                            \</div><div class='add'>+            errno = EINVAL;                                                    \</div><div class='add'>+            gf_msg_callingfn(name, GF_LOG_ERROR, errno, LG_MSG_INVALID_ARG,    \</div><div class='add'>+                             "invalid argument: " #arg);                       \</div><div class='add'>+            goto label;                                                        \</div><div class='add'>+        }                                                                      \</div><div class='add'>+    } while (0)</div><div class='add'>+</div><div class='add'>+#define GF_VALIDATE_OR_GOTO_WITH_ERROR(name, arg, label, errno, error)         \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        if (!arg) {                                                            \</div><div class='add'>+            errno = error;                                                     \</div><div class='add'>+            gf_msg_callingfn(name, GF_LOG_ERROR, EINVAL, LG_MSG_INVALID_ARG,   \</div><div class='add'>+                             "invalid argument: " #arg);                       \</div><div class='add'>+            goto label;                                                        \</div><div class='add'>+        }                                                                      \</div><div class='add'>+    } while (0)</div><div class='add'>+</div><div class='add'>+#define GF_CHECK_ALLOC(arg, retval, label)                                     \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        if (!(arg)) {                                                          \</div><div class='add'>+            retval = -ENOMEM;                                                  \</div><div class='add'>+            goto label;                                                        \</div><div class='add'>+        }                                                                      \</div><div class='add'>+    } while (0)</div><div class='add'>+</div><div class='add'>+#define GF_CHECK_ALLOC_AND_LOG(name, item, retval, msg, errlabel)              \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        if (!(item)) {                                                         \</div><div class='add'>+            (retval) = -ENOMEM;                                                \</div><div class='add'>+            gf_msg(name, GF_LOG_CRITICAL, ENOMEM, LG_MSG_NO_MEMORY, (msg));    \</div><div class='add'>+            goto errlabel;                                                     \</div><div class='add'>+        }                                                                      \</div><div class='add'>+    } while (0)</div><div class='add'>+</div><div class='add'>+#define GF_ASSERT_AND_GOTO_WITH_ERROR(name, arg, label, errno, error)          \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        if (!arg) {                                                            \</div><div class='add'>+            GF_ASSERT(0);                                                      \</div><div class='add'>+            errno = error;                                                     \</div><div class='add'>+            goto label;                                                        \</div><div class='add'>+        }                                                                      \</div><div class='add'>+    } while (0)</div><div class='add'>+</div><div class='add'>+#define GF_VALIDATE_ABSOLUTE_PATH_OR_GOTO(name, arg, label)                    \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        GF_VALIDATE_OR_GOTO(name, arg, label);                                 \</div><div class='add'>+        if ((arg[0]) != '/') {                                                 \</div><div class='add'>+            errno = EINVAL;                                                    \</div><div class='add'>+            gf_msg_callingfn(name, GF_LOG_ERROR, EINVAL, LG_MSG_INVALID_ARG,   \</div><div class='add'>+                             "invalid argument: " #arg);                       \</div><div class='add'>+            goto label;                                                        \</div><div class='add'>+        }                                                                      \</div><div class='add'>+    } while (0)</div><div class='add'>+</div><div class='add'>+#define GF_REMOVE_SLASH_FROM_PATH(path, string)                                \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        int i = 0;                                                             \</div><div class='add'>+        for (i = 1; i &lt; strlen(path); i++) {                                   \</div><div class='add'>+            string[i - 1] = path[i];                                           \</div><div class='add'>+            if (string[i - 1] == '/')                                          \</div><div class='add'>+                string[i - 1] = '-';                                           \</div><div class='add'>+        }                                                                      \</div><div class='add'>+    } while (0)</div><div class='add'>+</div><div class='add'>+#define GF_REMOVE_INTERNAL_XATTR(pattern, dict)                                \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        if (!dict) {                                                           \</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, 0, LG_MSG_DICT_NULL,              \</div><div class='add'>+                   "dict is null");                                            \</div><div class='add'>+            break;                                                             \</div><div class='add'>+        }                                                                      \</div><div class='add'>+        dict_foreach_fnmatch(dict, pattern, dict_remove_foreach_fn, NULL);     \</div><div class='add'>+    } while (0)</div><div class='add'>+</div><div class='add'>+#define GF_IF_INTERNAL_XATTR_GOTO(pattern, dict, op_errno, label)              \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        if (!dict) {                                                           \</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, 0, LG_MSG_DICT_NULL,              \</div><div class='add'>+                   "setxattr dict is null");                                   \</div><div class='add'>+            goto label;                                                        \</div><div class='add'>+        }                                                                      \</div><div class='add'>+        if (dict_foreach_fnmatch(dict, pattern, dict_null_foreach_fn, NULL) &gt;  \</div><div class='add'>+            0) {                                                               \</div><div class='add'>+            op_errno = EPERM;                                                  \</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, op_errno, LG_MSG_NO_PERM,         \</div><div class='add'>+                   "attempt to set internal"                                   \</div><div class='add'>+                   " xattr: %s",                                               \</div><div class='add'>+                   pattern);                                                   \</div><div class='add'>+            goto label;                                                        \</div><div class='add'>+        }                                                                      \</div><div class='add'>+    } while (0)</div><div class='add'>+</div><div class='add'>+#define GF_IF_NATIVE_XATTR_GOTO(pattern, key, op_errno, label)                 \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        if (!key) {                                                            \</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, 0, LG_MSG_NO_KEY,                 \</div><div class='add'>+                   "no key for removexattr");                                  \</div><div class='add'>+            goto label;                                                        \</div><div class='add'>+        }                                                                      \</div><div class='add'>+        if (!fnmatch(pattern, key, 0)) {                                       \</div><div class='add'>+            op_errno = EPERM;                                                  \</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, op_errno, LG_MSG_NO_PERM,         \</div><div class='add'>+                   "attempt to remove internal "                               \</div><div class='add'>+                   "xattr: %s",                                                \</div><div class='add'>+                   key);                                                       \</div><div class='add'>+            goto label;                                                        \</div><div class='add'>+        }                                                                      \</div><div class='add'>+    } while (0)</div><div class='add'>+</div><div class='add'>+#ifdef DEBUG</div><div class='add'>+#define GF_ASSERT(x) assert(x);</div><div class='add'>+#else</div><div class='add'>+#define GF_ASSERT(x)                                                           \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        if (!(x)) {                                                            \</div><div class='add'>+            gf_msg_callingfn("", GF_LOG_ERROR, 0, LG_MSG_ASSERTION_FAILED,     \</div><div class='add'>+                             "Assertion failed: " #x);                         \</div><div class='add'>+        }                                                                      \</div><div class='add'>+    } while (0)</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+/* Compile-time assert, borrowed from Linux kernel. */</div><div class='add'>+#ifdef HAVE_STATIC_ASSERT</div><div class='add'>+#define GF_STATIC_ASSERT(expr, ...)                                            \</div><div class='add'>+    __gf_static_assert(expr, ##__VA_ARGS__, #expr)</div><div class='add'>+#define __gf_static_assert(expr, msg, ...) _Static_assert(expr, msg)</div><div class='add'>+#else</div><div class='add'>+#define GF_STATIC_ASSERT(expr, ...)</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#define GF_ABORT(msg...)                                                       \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        gf_msg_callingfn("", GF_LOG_CRITICAL, 0, LG_MSG_ASSERTION_FAILED,      \</div><div class='add'>+                         "Assertion failed: " msg);                            \</div><div class='add'>+        abort();                                                               \</div><div class='add'>+    } while (0)</div><div class='add'>+</div><div class='add'>+#define GF_UUID_ASSERT(u)                                                      \</div><div class='add'>+    if (gf_uuid_is_null(u))                                                    \</div><div class='add'>+        GF_ASSERT(!"uuid null");</div><div class='add'>+</div><div class='add'>+#define GF_IGNORE_IF_GSYNCD_SAFE_ERROR(frame, op_errno)                        \</div><div class='add'>+    (((frame-&gt;root-&gt;pid == GF_CLIENT_PID_GSYNCD) &amp;&amp;                            \</div><div class='add'>+      (op_errno == EEXIST || op_errno == ENOENT))                              \</div><div class='add'>+         ? 0                                                                   \</div><div class='add'>+         : 1)</div><div class='add'>+</div><div class='add'>+union gf_sock_union {</div><div class='add'>+    struct sockaddr_storage storage;</div><div class='add'>+    struct sockaddr_in6 sin6;</div><div class='add'>+    struct sockaddr_in sin;</div><div class='add'>+    struct sockaddr sa;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+#define GF_HIDDEN_PATH ".glusterfs"</div><div class='add'>+#define GF_UNLINK_PATH GF_HIDDEN_PATH "/unlink"</div><div class='add'>+#define GF_LANDFILL_PATH GF_HIDDEN_PATH "/landfill"</div><div class='add'>+</div><div class='add'>+#define IOV_MIN(n) min(IOV_MAX, n)</div><div class='add'>+</div><div class='add'>+static inline gf_boolean_t</div><div class='add'>+gf_irrelevant_entry(struct dirent *entry)</div><div class='add'>+{</div><div class='add'>+    GF_ASSERT(entry);</div><div class='add'>+</div><div class='add'>+    return (!strcmp(entry-&gt;d_name, ".") ||</div><div class='add'>+            !fnmatch("*.tmp", entry-&gt;d_name, 0) ||</div><div class='add'>+            !strcmp(entry-&gt;d_name, ".."));</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static inline void</div><div class='add'>+iov_free(struct iovec *vector, int count)</div><div class='add'>+{</div><div class='add'>+    int i;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; count; i++)</div><div class='add'>+        FREE(vector[i].iov_base);</div><div class='add'>+</div><div class='add'>+    GF_FREE(vector);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static inline int</div><div class='add'>+iov_length(const struct iovec *vector, int count)</div><div class='add'>+{</div><div class='add'>+    int i = 0;</div><div class='add'>+    size_t size = 0;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; count; i++)</div><div class='add'>+        size += vector[i].iov_len;</div><div class='add'>+</div><div class='add'>+    return size;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static inline struct iovec *</div><div class='add'>+iov_dup(const struct iovec *vector, int count)</div><div class='add'>+{</div><div class='add'>+    int bytecount = 0;</div><div class='add'>+    struct iovec *newvec = NULL;</div><div class='add'>+</div><div class='add'>+    bytecount = (count * sizeof(struct iovec));</div><div class='add'>+    newvec = GF_MALLOC(bytecount, gf_common_mt_iovec);</div><div class='add'>+    if (newvec != NULL) {</div><div class='add'>+        memcpy(newvec, vector, bytecount);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return newvec;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+typedef struct _iov_iter {</div><div class='add'>+    const struct iovec *iovec;</div><div class='add'>+    void *ptr;</div><div class='add'>+    uint32_t len;</div><div class='add'>+    uint32_t count;</div><div class='add'>+} iov_iter_t;</div><div class='add'>+</div><div class='add'>+static inline bool</div><div class='add'>+iov_iter_init(iov_iter_t *iter, const struct iovec *iovec, uint32_t count,</div><div class='add'>+              uint32_t offset)</div><div class='add'>+{</div><div class='add'>+    uint32_t len;</div><div class='add'>+</div><div class='add'>+    while (count &gt; 0) {</div><div class='add'>+        count--;</div><div class='add'>+        len = iovec-&gt;iov_len;</div><div class='add'>+        if (offset &lt; len) {</div><div class='add'>+            iter-&gt;ptr = iovec-&gt;iov_base + offset;</div><div class='add'>+            iter-&gt;len = len - offset;</div><div class='add'>+            iter-&gt;iovec = iovec + 1;</div><div class='add'>+            iter-&gt;count = count;</div><div class='add'>+</div><div class='add'>+            return true;</div><div class='add'>+        }</div><div class='add'>+        offset -= len;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    memset(iter, 0, sizeof(*iter));</div><div class='add'>+</div><div class='add'>+    return false;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static inline bool</div><div class='add'>+iov_iter_end(iov_iter_t *iter)</div><div class='add'>+{</div><div class='add'>+    return iter-&gt;count == 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static inline bool</div><div class='add'>+iov_iter_next(iov_iter_t *iter, uint32_t size)</div><div class='add'>+{</div><div class='add'>+    GF_ASSERT(size &lt;= iter-&gt;len);</div><div class='add'>+</div><div class='add'>+    if (iter-&gt;len &gt; size) {</div><div class='add'>+        iter-&gt;len -= size;</div><div class='add'>+        iter-&gt;ptr += size;</div><div class='add'>+</div><div class='add'>+        return true;</div><div class='add'>+    }</div><div class='add'>+    if (iter-&gt;count &gt; 0) {</div><div class='add'>+        iter-&gt;count--;</div><div class='add'>+        iter-&gt;ptr = iter-&gt;iovec-&gt;iov_base;</div><div class='add'>+        iter-&gt;len = iter-&gt;iovec-&gt;iov_len;</div><div class='add'>+        iter-&gt;iovec++;</div><div class='add'>+</div><div class='add'>+        return true;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    memset(iter, 0, sizeof(*iter));</div><div class='add'>+</div><div class='add'>+    return false;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static inline uint32_t</div><div class='add'>+iov_iter_copy(iov_iter_t *dst, iov_iter_t *src, uint32_t size)</div><div class='add'>+{</div><div class='add'>+    uint32_t len;</div><div class='add'>+</div><div class='add'>+    len = src-&gt;len;</div><div class='add'>+    if (len &gt; dst-&gt;len) {</div><div class='add'>+        len = dst-&gt;len;</div><div class='add'>+    }</div><div class='add'>+    if (len &gt; size) {</div><div class='add'>+        len = size;</div><div class='add'>+    }</div><div class='add'>+    memcpy(dst-&gt;ptr, src-&gt;ptr, len);</div><div class='add'>+</div><div class='add'>+    return len;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static inline uint32_t</div><div class='add'>+iov_iter_to_iovec(iov_iter_t *iter, struct iovec *iovec, int32_t idx,</div><div class='add'>+                  uint32_t size)</div><div class='add'>+{</div><div class='add'>+    uint32_t len;</div><div class='add'>+</div><div class='add'>+    len = iter-&gt;len;</div><div class='add'>+    if (len &gt; size) {</div><div class='add'>+        len = size;</div><div class='add'>+    }</div><div class='add'>+    iovec[idx].iov_base = iter-&gt;ptr;</div><div class='add'>+    iovec[idx].iov_len = len;</div><div class='add'>+</div><div class='add'>+    return len;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static inline int</div><div class='add'>+iov_subset(struct iovec *src, int src_count, uint32_t start, uint32_t size,</div><div class='add'>+           struct iovec **dst, int32_t dst_count)</div><div class='add'>+{</div><div class='add'>+    struct iovec iovec[src_count];</div><div class='add'>+    iov_iter_t iter;</div><div class='add'>+    uint32_t len;</div><div class='add'>+    int32_t idx;</div><div class='add'>+</div><div class='add'>+    if ((size == 0) || !iov_iter_init(&amp;iter, src, src_count, start)) {</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    idx = 0;</div><div class='add'>+    do {</div><div class='add'>+        len = iov_iter_to_iovec(&amp;iter, iovec, idx, size);</div><div class='add'>+        idx++;</div><div class='add'>+        size -= len;</div><div class='add'>+    } while ((size &gt; 0) &amp;&amp; iov_iter_next(&amp;iter, len));</div><div class='add'>+</div><div class='add'>+    if (*dst == NULL) {</div><div class='add'>+        *dst = iov_dup(iovec, idx);</div><div class='add'>+        if (*dst == NULL) {</div><div class='add'>+            return -1;</div><div class='add'>+        }</div><div class='add'>+    } else if (idx &gt; dst_count) {</div><div class='add'>+        return -1;</div><div class='add'>+    } else {</div><div class='add'>+        memcpy(*dst, iovec, idx * sizeof(struct iovec));</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return idx;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static inline int</div><div class='add'>+iov_skip(struct iovec *iovec, uint32_t count, uint32_t size)</div><div class='add'>+{</div><div class='add'>+    uint32_t len, idx;</div><div class='add'>+</div><div class='add'>+    idx = 0;</div><div class='add'>+    while ((size &gt; 0) &amp;&amp; (idx &lt; count)) {</div><div class='add'>+        len = iovec[idx].iov_len;</div><div class='add'>+        if (len &gt; size) {</div><div class='add'>+            iovec[idx].iov_len -= size;</div><div class='add'>+            iovec[idx].iov_base += size;</div><div class='add'>+            break;</div><div class='add'>+        }</div><div class='add'>+        idx++;</div><div class='add'>+        size -= len;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (idx &gt; 0) {</div><div class='add'>+        memmove(iovec, iovec + idx, (count - idx) * sizeof(struct iovec));</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return count - idx;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static inline size_t</div><div class='add'>+iov_range_copy(const struct iovec *dst, uint32_t dst_count, uint32_t dst_offset,</div><div class='add'>+               const struct iovec *src, uint32_t src_count, uint32_t src_offset,</div><div class='add'>+               uint32_t size)</div><div class='add'>+{</div><div class='add'>+    iov_iter_t src_iter, dst_iter;</div><div class='add'>+    uint32_t len, total;</div><div class='add'>+</div><div class='add'>+    if ((size == 0) || !iov_iter_init(&amp;src_iter, src, src_count, src_offset) ||</div><div class='add'>+        !iov_iter_init(&amp;dst_iter, dst, dst_count, dst_offset)) {</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    total = 0;</div><div class='add'>+    do {</div><div class='add'>+        len = iov_iter_copy(&amp;dst_iter, &amp;src_iter, size);</div><div class='add'>+        total += len;</div><div class='add'>+        size -= len;</div><div class='add'>+    } while ((size &gt; 0) &amp;&amp; iov_iter_next(&amp;src_iter, len) &amp;&amp;</div><div class='add'>+             iov_iter_next(&amp;dst_iter, len));</div><div class='add'>+</div><div class='add'>+    return total;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static inline void</div><div class='add'>+iov_unload(char *buf, const struct iovec *vector, int count)</div><div class='add'>+{</div><div class='add'>+    int i;</div><div class='add'>+    int copied = 0;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; count; i++) {</div><div class='add'>+        memcpy(buf + copied, vector[i].iov_base, vector[i].iov_len);</div><div class='add'>+        copied += vector[i].iov_len;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static inline size_t</div><div class='add'>+iov_load(const struct iovec *vector, int count, char *buf, int size)</div><div class='add'>+{</div><div class='add'>+    size_t left = size;</div><div class='add'>+    size_t cp = 0;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    int i = 0;</div><div class='add'>+</div><div class='add'>+    while (left &amp;&amp; i &lt; count) {</div><div class='add'>+        cp = min(vector[i].iov_len, left);</div><div class='add'>+        if (vector[i].iov_base != buf + (size - left))</div><div class='add'>+            memcpy(vector[i].iov_base, buf + (size - left), cp);</div><div class='add'>+        ret += cp;</div><div class='add'>+        left -= cp;</div><div class='add'>+        if (left)</div><div class='add'>+            i++;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static inline size_t</div><div class='add'>+iov_copy(const struct iovec *dst, int dcnt, const struct iovec *src, int scnt)</div><div class='add'>+{</div><div class='add'>+    return iov_range_copy(dst, dcnt, 0, src, scnt, 0, UINT32_MAX);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* based on the amusing discussion @ https://rusty.ozlabs.org/?p=560 */</div><div class='add'>+static bool</div><div class='add'>+memeqzero(const void *data, size_t length)</div><div class='add'>+{</div><div class='add'>+    const unsigned char *p = data;</div><div class='add'>+    size_t len;</div><div class='add'>+</div><div class='add'>+    /* Check first 16 bytes manually */</div><div class='add'>+    for (len = 0; len &lt; 16; len++) {</div><div class='add'>+        if (!length)</div><div class='add'>+            return true;</div><div class='add'>+        if (*p)</div><div class='add'>+            return false;</div><div class='add'>+        p++;</div><div class='add'>+        length--;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Now we know that's zero, memcmp with self. */</div><div class='add'>+    return memcmp(data, p, length) == 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static inline int</div><div class='add'>+mem_0filled(const char *buf, size_t size)</div><div class='add'>+{</div><div class='add'>+    return !memeqzero(buf, size);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static inline int</div><div class='add'>+iov_0filled(const struct iovec *vector, int count)</div><div class='add'>+{</div><div class='add'>+    int i = 0;</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; count; i++) {</div><div class='add'>+        ret = mem_0filled(vector[i].iov_base, vector[i].iov_len);</div><div class='add'>+        if (ret)</div><div class='add'>+            break;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+typedef enum {</div><div class='add'>+    gf_timefmt_default = 0,</div><div class='add'>+    gf_timefmt_FT = 0, /* YYYY-MM-DD hh:mm:ss */</div><div class='add'>+    gf_timefmt_Ymd_T,  /* YYYY/MM-DD-hh:mm:ss */</div><div class='add'>+    gf_timefmt_bdT,    /* MMM DD hh:mm:ss */</div><div class='add'>+    gf_timefmt_F_HMS,  /* YYYY-MM-DD hhmmss */</div><div class='add'>+    gf_timefmt_dirent,</div><div class='add'>+    gf_timefmt_s,</div><div class='add'>+    gf_timefmt_last</div><div class='add'>+} gf_timefmts;</div><div class='add'>+</div><div class='add'>+static inline char *</div><div class='add'>+gf_time_fmt_tv(char *dst, size_t sz_dst, struct timeval *tv, unsigned int fmt)</div><div class='add'>+{</div><div class='add'>+    extern void _gf_timestuff(const char ***, const char ***);</div><div class='add'>+    static gf_timefmts timefmt_last = (gf_timefmts)-1;</div><div class='add'>+    static const char **fmts;</div><div class='add'>+    static const char **zeros;</div><div class='add'>+    struct tm tm, *res;</div><div class='add'>+    int localtime = 0;</div><div class='add'>+    int len = 0;</div><div class='add'>+    int pos = 0;</div><div class='add'>+</div><div class='add'>+    if (timefmt_last == ((gf_timefmts)-1)) {</div><div class='add'>+        _gf_timestuff(&amp;fmts, &amp;zeros);</div><div class='add'>+        timefmt_last = gf_timefmt_last;</div><div class='add'>+    }</div><div class='add'>+    if (timefmt_last &lt;= fmt) {</div><div class='add'>+        fmt = gf_timefmt_default;</div><div class='add'>+    }</div><div class='add'>+    localtime = gf_log_get_localtime();</div><div class='add'>+    res = localtime ? localtime_r(&amp;tv-&gt;tv_sec, &amp;tm)</div><div class='add'>+                    : gmtime_r(&amp;tv-&gt;tv_sec, &amp;tm);</div><div class='add'>+    if (tv-&gt;tv_sec &amp;&amp; (res != NULL)) {</div><div class='add'>+        len = strftime(dst, sz_dst, fmts[fmt], &amp;tm);</div><div class='add'>+        if (len == 0)</div><div class='add'>+            return dst;</div><div class='add'>+        pos += len;</div><div class='add'>+        if (tv-&gt;tv_usec &gt;= 0) {</div><div class='add'>+            len = snprintf(dst + pos, sz_dst - pos, ".%" GF_PRI_SUSECONDS,</div><div class='add'>+                           tv-&gt;tv_usec);</div><div class='add'>+            if (len &gt;= sz_dst - pos)</div><div class='add'>+                return dst;</div><div class='add'>+            pos += len;</div><div class='add'>+        }</div><div class='add'>+        strftime(dst + pos, sz_dst - pos, " %z", &amp;tm);</div><div class='add'>+    } else {</div><div class='add'>+        strncpy(dst, "N/A", sz_dst);</div><div class='add'>+    }</div><div class='add'>+    return dst;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static inline char *</div><div class='add'>+gf_time_fmt(char *dst, size_t sz_dst, time_t utime, unsigned int fmt)</div><div class='add'>+{</div><div class='add'>+    struct timeval tv = {utime, -1};</div><div class='add'>+</div><div class='add'>+    return gf_time_fmt_tv(dst, sz_dst, &amp;tv, fmt);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* This function helps us use gfid (unique identity) to generate inode's unique</div><div class='add'>+ * number in glusterfs.</div><div class='add'>+ */</div><div class='add'>+ino_t</div><div class='add'>+gfid_to_ino(uuid_t gfid);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+mkdir_p(char *path, mode_t mode, gf_boolean_t allow_symlinks);</div><div class='add'>+/*</div><div class='add'>+ * rounds up nr to power of two. If nr is already a power of two, just returns</div><div class='add'>+ * nr</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+gf_lstat_dir(const char *path, struct stat *stbuf_in);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+gf_roundup_power_of_two(int32_t nr);</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+ * rounds up nr to next power of two. If nr is already a power of two, next</div><div class='add'>+ * power of two is returned.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+gf_roundup_next_power_of_two(int32_t nr);</div><div class='add'>+</div><div class='add'>+char *</div><div class='add'>+gf_trim(char *string);</div><div class='add'>+int</div><div class='add'>+gf_volume_name_validate(const char *volume_name);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+gf_string2long(const char *str, long *n);</div><div class='add'>+int</div><div class='add'>+gf_string2ulong(const char *str, unsigned long *n);</div><div class='add'>+int</div><div class='add'>+gf_string2int(const char *str, int *n);</div><div class='add'>+int</div><div class='add'>+gf_string2uint(const char *str, unsigned int *n);</div><div class='add'>+int</div><div class='add'>+gf_string2double(const char *str, double *n);</div><div class='add'>+int</div><div class='add'>+gf_string2longlong(const char *str, long long *n);</div><div class='add'>+int</div><div class='add'>+gf_string2ulonglong(const char *str, unsigned long long *n);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+gf_string2int8(const char *str, int8_t *n);</div><div class='add'>+int</div><div class='add'>+gf_string2int16(const char *str, int16_t *n);</div><div class='add'>+int</div><div class='add'>+gf_string2int32(const char *str, int32_t *n);</div><div class='add'>+int</div><div class='add'>+gf_string2int64(const char *str, int64_t *n);</div><div class='add'>+int</div><div class='add'>+gf_string2uint8(const char *str, uint8_t *n);</div><div class='add'>+int</div><div class='add'>+gf_string2uint16(const char *str, uint16_t *n);</div><div class='add'>+int</div><div class='add'>+gf_string2uint32(const char *str, uint32_t *n);</div><div class='add'>+int</div><div class='add'>+gf_string2uint64(const char *str, uint64_t *n);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+gf_strstr(const char *str, const char *delim, const char *match);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+gf_string2ulong_base10(const char *str, unsigned long *n);</div><div class='add'>+int</div><div class='add'>+gf_string2uint_base10(const char *str, unsigned int *n);</div><div class='add'>+int</div><div class='add'>+gf_string2uint8_base10(const char *str, uint8_t *n);</div><div class='add'>+int</div><div class='add'>+gf_string2uint16_base10(const char *str, uint16_t *n);</div><div class='add'>+int</div><div class='add'>+gf_string2uint32_base10(const char *str, uint32_t *n);</div><div class='add'>+int</div><div class='add'>+gf_string2uint64_base10(const char *str, uint64_t *n);</div><div class='add'>+int</div><div class='add'>+gf_string2bytesize_uint64(const char *str, uint64_t *n);</div><div class='add'>+int</div><div class='add'>+gf_string2bytesize_int64(const char *str, int64_t *n);</div><div class='add'>+int</div><div class='add'>+gf_string2percent_or_bytesize(const char *str, double *n,</div><div class='add'>+                              gf_boolean_t *is_percent);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+gf_string2boolean(const char *str, gf_boolean_t *b);</div><div class='add'>+int</div><div class='add'>+gf_strn2boolean(const char *str, const int len, gf_boolean_t *b);</div><div class='add'>+int</div><div class='add'>+gf_string2percent(const char *str, double *n);</div><div class='add'>+int</div><div class='add'>+gf_string2time(const char *str, uint32_t *n);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+gf_lockfd(int fd);</div><div class='add'>+int</div><div class='add'>+gf_unlockfd(int fd);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+get_checksum_for_file(int fd, uint32_t *checksum, int op_version);</div><div class='add'>+int</div><div class='add'>+log_base2(unsigned long x);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+get_checksum_for_path(char *path, uint32_t *checksum, int op_version);</div><div class='add'>+int</div><div class='add'>+get_file_mtime(const char *path, time_t *stamp);</div><div class='add'>+char *</div><div class='add'>+gf_resolve_path_parent(const char *path);</div><div class='add'>+</div><div class='add'>+char *</div><div class='add'>+strtail(char *str, const char *pattern);</div><div class='add'>+void</div><div class='add'>+skipwhite(char **s);</div><div class='add'>+char *</div><div class='add'>+nwstrtail(char *str, char *pattern);</div><div class='add'>+/* returns a new string with nth word of given string. n&gt;=1 */</div><div class='add'>+</div><div class='add'>+typedef struct token_iter {</div><div class='add'>+    char *end;</div><div class='add'>+    char sep;</div><div class='add'>+} token_iter_t;</div><div class='add'>+char *</div><div class='add'>+token_iter_init(char *str, char sep, token_iter_t *tit);</div><div class='add'>+gf_boolean_t</div><div class='add'>+next_token(char **tokenp, token_iter_t *tit);</div><div class='add'>+void</div><div class='add'>+drop_token(char *token, token_iter_t *tit);</div><div class='add'>+</div><div class='add'>+gf_boolean_t</div><div class='add'>+mask_match(const uint32_t a, const uint32_t b, const uint32_t m);</div><div class='add'>+gf_boolean_t</div><div class='add'>+gf_is_ip_in_net(const char *network, const char *ip_str);</div><div class='add'>+char</div><div class='add'>+valid_host_name(char *address, int length);</div><div class='add'>+char</div><div class='add'>+valid_ipv4_address(char *address, int length, gf_boolean_t wildcard_acc);</div><div class='add'>+char</div><div class='add'>+valid_ipv6_address(char *address, int length, gf_boolean_t wildcard_acc);</div><div class='add'>+char</div><div class='add'>+valid_internet_address(char *address, gf_boolean_t wildcard_acc,</div><div class='add'>+                       gf_boolean_t cidr);</div><div class='add'>+gf_boolean_t</div><div class='add'>+valid_mount_auth_address(char *address);</div><div class='add'>+gf_boolean_t</div><div class='add'>+valid_ipv4_subnetwork(const char *address);</div><div class='add'>+gf_boolean_t</div><div class='add'>+gf_sock_union_equal_addr(union gf_sock_union *a, union gf_sock_union *b);</div><div class='add'>+char *</div><div class='add'>+gf_rev_dns_lookup(const char *ip);</div><div class='add'>+</div><div class='add'>+char *</div><div class='add'>+uuid_utoa(uuid_t uuid);</div><div class='add'>+char *</div><div class='add'>+uuid_utoa_r(uuid_t uuid, char *dst);</div><div class='add'>+char *</div><div class='add'>+lkowner_utoa(gf_lkowner_t *lkowner);</div><div class='add'>+char *</div><div class='add'>+lkowner_utoa_r(gf_lkowner_t *lkowner, char *dst, int len);</div><div class='add'>+char *</div><div class='add'>+leaseid_utoa(const char *lease_id);</div><div class='add'>+gf_boolean_t</div><div class='add'>+is_valid_lease_id(const char *lease_id);</div><div class='add'>+char *</div><div class='add'>+gf_leaseid_get(void);</div><div class='add'>+char *</div><div class='add'>+gf_existing_leaseid(void);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+gf_array_insertionsort(void *a, int l, int r, size_t elem_size, gf_cmp cmp);</div><div class='add'>+int</div><div class='add'>+gf_is_str_int(const char *value);</div><div class='add'>+</div><div class='add'>+char *gf_uint64_2human_readable(uint64_t);</div><div class='add'>+int</div><div class='add'>+validate_brick_name(char *brick);</div><div class='add'>+char *</div><div class='add'>+get_host_name(char *word, char **host);</div><div class='add'>+char *</div><div class='add'>+get_path_name(char *word, char **path);</div><div class='add'>+void</div><div class='add'>+gf_path_strip_trailing_slashes(char *path);</div><div class='add'>+uint64_t</div><div class='add'>+get_mem_size(void);</div><div class='add'>+int</div><div class='add'>+gf_strip_whitespace(char *str, int len);</div><div class='add'>+int</div><div class='add'>+gf_canonicalize_path(char *path);</div><div class='add'>+char *</div><div class='add'>+generate_glusterfs_ctx_id(void);</div><div class='add'>+char *</div><div class='add'>+gf_get_reserved_ports(void);</div><div class='add'>+int</div><div class='add'>+gf_process_reserved_ports(unsigned char *ports, uint32_t ceiling);</div><div class='add'>+gf_boolean_t</div><div class='add'>+gf_ports_reserved(char *blocked_port, unsigned char *ports, uint32_t ceiling);</div><div class='add'>+int</div><div class='add'>+gf_get_hostname_from_ip(char *client_ip, char **hostname);</div><div class='add'>+gf_boolean_t</div><div class='add'>+gf_is_local_addr(char *hostname);</div><div class='add'>+gf_boolean_t</div><div class='add'>+gf_is_same_address(char *host1, char *host2);</div><div class='add'>+void</div><div class='add'>+gf_xxh64_wrapper(const unsigned char *data, size_t const len,</div><div class='add'>+                 unsigned long long const seed, char *xxh64);</div><div class='add'>+int</div><div class='add'>+gf_gfid_generate_from_xxh64(uuid_t gfid, char *key);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+gf_set_timestamp(const char *src, const char *dest);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+gf_thread_create(pthread_t *thread, const pthread_attr_t *attr,</div><div class='add'>+                 void *(*start_routine)(void *), void *arg, const char *name,</div><div class='add'>+                 ...) __attribute__((__format__(__printf__, 5, 6)));</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+gf_thread_vcreate(pthread_t *thread, const pthread_attr_t *attr,</div><div class='add'>+                  void *(*start_routine)(void *), void *arg, const char *name,</div><div class='add'>+                  va_list args);</div><div class='add'>+int</div><div class='add'>+gf_thread_create_detached(pthread_t *thread, void *(*start_routine)(void *),</div><div class='add'>+                          void *arg, const char *name, ...)</div><div class='add'>+    __attribute__((__format__(__printf__, 4, 5)));</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+gf_thread_set_name(pthread_t thread, const char *name, ...)</div><div class='add'>+    __attribute__((__format__(__printf__, 2, 3)));</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+gf_thread_set_vname(pthread_t thread, const char *name, va_list args);</div><div class='add'>+gf_boolean_t</div><div class='add'>+gf_is_pid_running(int pid);</div><div class='add'>+gf_boolean_t</div><div class='add'>+gf_is_service_running(char *pidfile, int *pid);</div><div class='add'>+gf_boolean_t</div><div class='add'>+gf_valid_pid(const char *pid, int length);</div><div class='add'>+int</div><div class='add'>+gf_skip_header_section(int fd, int header_len);</div><div class='add'>+</div><div class='add'>+struct iatt;</div><div class='add'>+struct _dict;</div><div class='add'>+</div><div class='add'>+gf_boolean_t</div><div class='add'>+dht_is_linkfile(struct iatt *buf, struct _dict *dict);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+gf_check_log_format(const char *value);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+gf_check_logger(const char *value);</div><div class='add'>+</div><div class='add'>+gf_boolean_t</div><div class='add'>+gf_compare_sockaddr(const struct sockaddr *addr1, const struct sockaddr *addr2);</div><div class='add'>+</div><div class='add'>+char *</div><div class='add'>+gf_backtrace_save(char *buf);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+gf_backtrace_done(char *buf);</div><div class='add'>+</div><div class='add'>+gf_loglevel_t</div><div class='add'>+fop_log_level(glusterfs_fop_t fop, int op_errno);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+gf_build_absolute_path(char *current_path, char *relative_path, char **path);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+recursive_rmdir(const char *delete_path);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+gf_get_index_by_elem(char **array, char *elem);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+glusterfs_is_local_pathinfo(char *pathinfo, gf_boolean_t *local);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+gf_thread_cleanup_xint(pthread_t thread);</div><div class='add'>+</div><div class='add'>+ssize_t</div><div class='add'>+gf_nread(int fd, void *buf, size_t count);</div><div class='add'>+</div><div class='add'>+ssize_t</div><div class='add'>+gf_nwrite(int fd, const void *buf, size_t count);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+_mask_cancellation(void);</div><div class='add'>+void</div><div class='add'>+_unmask_cancellation(void);</div><div class='add'>+</div><div class='add'>+gf_boolean_t</div><div class='add'>+gf_is_zero_filled_stat(struct iatt *buf);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+gf_zero_fill_stat(struct iatt *buf);</div><div class='add'>+</div><div class='add'>+gf_boolean_t</div><div class='add'>+gf_is_valid_xattr_namespace(char *k);</div><div class='add'>+</div><div class='add'>+const char *</div><div class='add'>+gf_inode_type_to_str(ia_type_t type);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+gf_bits_count(uint64_t n);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+gf_bits_index(uint64_t n);</div><div class='add'>+</div><div class='add'>+const char *</div><div class='add'>+gf_fop_string(glusterfs_fop_t fop);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+gf_fop_int(char *fop);</div><div class='add'>+</div><div class='add'>+char *</div><div class='add'>+get_ip_from_addrinfo(struct addrinfo *addr, char **ip);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+close_fds_except(int *fdv, size_t count);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+gf_getgrouplist(const char *user, gid_t group, gid_t **groups);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+glusterfs_compute_sha256(const unsigned char *content, size_t size,</div><div class='add'>+                         char *sha256_hash);</div><div class='add'>+</div><div class='add'>+char *</div><div class='add'>+gf_strncpy(char *dest, const char *src, const size_t dest_size);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+gf_strTrim(char **s);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+gf_replace_old_iatt_in_dict(struct _dict *);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+gf_replace_new_iatt_in_dict(struct _dict *);</div><div class='add'>+</div><div class='add'>+xlator_cmdline_option_t *</div><div class='add'>+find_xlator_option_in_cmd_args_t(const char *option_name, cmd_args_t *args);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+gf_d_type_from_ia_type(ia_type_t type);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+gf_syncfs(int fd);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+gf_nanosleep(uint64_t nsec);</div><div class='add'>+</div><div class='add'>+static inline time_t</div><div class='add'>+gf_time(void)</div><div class='add'>+{</div><div class='add'>+    return time(NULL);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* Return delta value in microseconds. */</div><div class='add'>+</div><div class='add'>+static inline double</div><div class='add'>+gf_tvdiff(struct timeval *start, struct timeval *end)</div><div class='add'>+{</div><div class='add'>+    struct timeval t;</div><div class='add'>+</div><div class='add'>+    if (start-&gt;tv_usec &gt; end-&gt;tv_usec)</div><div class='add'>+        t.tv_sec = end-&gt;tv_sec - 1, t.tv_usec = end-&gt;tv_usec + 1000000;</div><div class='add'>+    else</div><div class='add'>+        t.tv_sec = end-&gt;tv_sec, t.tv_usec = end-&gt;tv_usec;</div><div class='add'>+</div><div class='add'>+    return (double)(t.tv_sec - start-&gt;tv_sec) * 1e6 +</div><div class='add'>+           (double)(t.tv_usec - start-&gt;tv_usec);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* Return delta value in nanoseconds. */</div><div class='add'>+</div><div class='add'>+static inline double</div><div class='add'>+gf_tsdiff(struct timespec *start, struct timespec *end)</div><div class='add'>+{</div><div class='add'>+    struct timespec t;</div><div class='add'>+</div><div class='add'>+    if (start-&gt;tv_nsec &gt; end-&gt;tv_nsec)</div><div class='add'>+        t.tv_sec = end-&gt;tv_sec - 1, t.tv_nsec = end-&gt;tv_nsec + 1000000000;</div><div class='add'>+    else</div><div class='add'>+        t.tv_sec = end-&gt;tv_sec, t.tv_nsec = end-&gt;tv_nsec;</div><div class='add'>+</div><div class='add'>+    return (double)(t.tv_sec - start-&gt;tv_sec) * 1e9 +</div><div class='add'>+           (double)(t.tv_nsec - start-&gt;tv_nsec);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#endif /* _COMMON_UTILS_H */</div><div class='head'>diff --git a/libglusterfs/src/glusterfs/compat-errno.h b/libglusterfs/src/glusterfs/compat-errno.h<br/>new file mode 100644<br/>index 00000000000..c4ab09ab0d5<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/libglusterfs/src/glusterfs/compat-errno.h?id=d1d7a6f35c816822fab51c820e25023863c239c1'>libglusterfs/src/glusterfs/compat-errno.h</a></div><div class='hunk'>@@ -0,0 +1,238 @@</div><div class='add'>+/*</div><div class='add'>+  Copyright (c) 2008-2012 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#ifndef __COMPAT_ERRNO_H__</div><div class='add'>+#define __COMPAT_ERRNO_H__</div><div class='add'>+</div><div class='add'>+#include &lt;errno.h&gt;</div><div class='add'>+</div><div class='add'>+#define GF_ERROR_CODE_SUCCESS 0</div><div class='add'>+#define GF_ERROR_CODE_UNKNOWN 1024</div><div class='add'>+#define GF_ERRNO_UNKNOWN 1024</div><div class='add'>+</div><div class='add'>+#define GF_ERROR_CODE_PERM 1         /* Operation not permitted */</div><div class='add'>+#define GF_ERROR_CODE_NOENT 2        /* No such file or directory */</div><div class='add'>+#define GF_ERROR_CODE_SRCH 3         /* No such process */</div><div class='add'>+#define GF_ERROR_CODE_INTR 4         /* Interrupted system call */</div><div class='add'>+#define GF_ERROR_CODE_IO 5           /* I/O error */</div><div class='add'>+#define GF_ERROR_CODE_NXIO 6         /* No such device or address */</div><div class='add'>+#define GF_ERROR_CODE_2BIG 7         /* Argument list too long */</div><div class='add'>+#define GF_ERROR_CODE_NOEXEC 8       /* Exec format error */</div><div class='add'>+#define GF_ERROR_CODE_BADF 9         /* Bad file number */</div><div class='add'>+#define GF_ERROR_CODE_CHILD 10       /* No child processes */</div><div class='add'>+#define GF_ERROR_CODE_AGAIN 11       /* Try again */</div><div class='add'>+#define GF_ERROR_CODE_NOMEM 12       /* Out of memory */</div><div class='add'>+#define GF_ERROR_CODE_ACCES 13       /* Permission denied */</div><div class='add'>+#define GF_ERROR_CODE_FAULT 14       /* Bad address */</div><div class='add'>+#define GF_ERROR_CODE_NOTBLK 15      /* Block device required */</div><div class='add'>+#define GF_ERROR_CODE_BUSY 16        /* Device or resource busy */</div><div class='add'>+#define GF_ERROR_CODE_EXIST 17       /* File exists */</div><div class='add'>+#define GF_ERROR_CODE_XDEV 18        /* Cross-device link */</div><div class='add'>+#define GF_ERROR_CODE_NODEV 19       /* No such device */</div><div class='add'>+#define GF_ERROR_CODE_NOTDIR 20      /* Not a directory */</div><div class='add'>+#define GF_ERROR_CODE_ISDIR 21       /* Is a directory */</div><div class='add'>+#define GF_ERROR_CODE_INVAL 22       /* Invalid argument */</div><div class='add'>+#define GF_ERROR_CODE_NFILE 23       /* File table overflow */</div><div class='add'>+#define GF_ERROR_CODE_MFILE 24       /* Too many open files */</div><div class='add'>+#define GF_ERROR_CODE_NOTTY 25       /* Not a typewriter */</div><div class='add'>+#define GF_ERROR_CODE_TXTBSY 26      /* Text file busy */</div><div class='add'>+#define GF_ERROR_CODE_FBIG 27        /* File too large */</div><div class='add'>+#define GF_ERROR_CODE_NOSPC 28       /* No space left on device */</div><div class='add'>+#define GF_ERROR_CODE_SPIPE 29       /* Illegal seek */</div><div class='add'>+#define GF_ERROR_CODE_ROFS 30        /* Read-only file system */</div><div class='add'>+#define GF_ERROR_CODE_MLINK 31       /* Too many links */</div><div class='add'>+#define GF_ERROR_CODE_PIPE 32        /* Broken pipe */</div><div class='add'>+#define GF_ERROR_CODE_DOM 33         /* Math argument out of domain of func */</div><div class='add'>+#define GF_ERROR_CODE_RANGE 34       /* Math result not representable */</div><div class='add'>+#define GF_ERROR_CODE_DEADLK 35      /* Resource deadlock would occur */</div><div class='add'>+#define GF_ERROR_CODE_NAMETOOLONG 36 /* File name too long */</div><div class='add'>+#define GF_ERROR_CODE_NOLCK 37       /* No record locks available */</div><div class='add'>+#define GF_ERROR_CODE_NOSYS 38       /* Function not implemented */</div><div class='add'>+#define GF_ERROR_CODE_NOTEMPTY 39    /* Directory not empty */</div><div class='add'>+#define GF_ERROR_CODE_LOOP 40        /* Too many symbolic links encountered */</div><div class='add'>+</div><div class='add'>+#define GF_ERROR_CODE_NOMSG 42    /* No message of desired type */</div><div class='add'>+#define GF_ERROR_CODE_IDRM 43     /* Identifier removed */</div><div class='add'>+#define GF_ERROR_CODE_CHRNG 44    /* Channel number out of range */</div><div class='add'>+#define GF_ERROR_CODE_L2NSYNC 45  /* Level 2 not synchronized */</div><div class='add'>+#define GF_ERROR_CODE_L3HLT 46    /* Level 3 halted */</div><div class='add'>+#define GF_ERROR_CODE_L3RST 47    /* Level 3 reset */</div><div class='add'>+#define GF_ERROR_CODE_LNRNG 48    /* Link number out of range */</div><div class='add'>+#define GF_ERROR_CODE_UNATCH 49   /* Protocol driver not attached */</div><div class='add'>+#define GF_ERROR_CODE_NOCSI 50    /* No CSI structure available */</div><div class='add'>+#define GF_ERROR_CODE_L2HLT 51    /* Level 2 halted */</div><div class='add'>+#define GF_ERROR_CODE_BADE 52     /* Invalid exchange */</div><div class='add'>+#define GF_ERROR_CODE_BADR 53     /* Invalid request descriptor */</div><div class='add'>+#define GF_ERROR_CODE_XFULL 54    /* Exchange full */</div><div class='add'>+#define GF_ERROR_CODE_NOANO 55    /* No anode */</div><div class='add'>+#define GF_ERROR_CODE_BADRQC 56   /* Invalid request code */</div><div class='add'>+#define GF_ERROR_CODE_BADSLT 57   /* Invalid slot */</div><div class='add'>+#define GF_ERROR_CODE_BFONT 59    /* Bad font file format */</div><div class='add'>+#define GF_ERROR_CODE_NOSTR 60    /* Device not a stream */</div><div class='add'>+#define GF_ERROR_CODE_NODATA 61   /* No data available */</div><div class='add'>+#define GF_ERROR_CODE_TIME 62     /* Timer expired */</div><div class='add'>+#define GF_ERROR_CODE_NOSR 63     /* Out of streams resources */</div><div class='add'>+#define GF_ERROR_CODE_NONET 64    /* Machine is not on the network */</div><div class='add'>+#define GF_ERROR_CODE_NOPKG 65    /* Package not installed */</div><div class='add'>+#define GF_ERROR_CODE_REMOTE 66   /* Object is remote */</div><div class='add'>+#define GF_ERROR_CODE_NOLINK 67   /* Link has been severed */</div><div class='add'>+#define GF_ERROR_CODE_ADV 68      /* Advertise error */</div><div class='add'>+#define GF_ERROR_CODE_SRMNT 69    /* Srmount error */</div><div class='add'>+#define GF_ERROR_CODE_COMM 70     /* Communication error on send */</div><div class='add'>+#define GF_ERROR_CODE_PROTO 71    /* Protocol error */</div><div class='add'>+#define GF_ERROR_CODE_MULTIHOP 72 /* Multihop attempted */</div><div class='add'>+#define GF_ERROR_CODE_DOTDOT 73   /* RFS specific error */</div><div class='add'>+#define GF_ERROR_CODE_BADMSG 74   /* Not a data message */</div><div class='add'>+#define GF_ERROR_CODE_OVERFLOW 75 /* Value too large for defined data type */</div><div class='add'>+#define GF_ERROR_CODE_NOTUNIQ 76  /* Name not unique on network */</div><div class='add'>+#define GF_ERROR_CODE_BADFD 77    /* File descriptor in bad state */</div><div class='add'>+#define GF_ERROR_CODE_REMCHG 78   /* Remote address changed */</div><div class='add'>+#define GF_ERROR_CODE_LIBACC 79   /* Can not access a needed shared library */</div><div class='add'>+#define GF_ERROR_CODE_LIBBAD 80   /* Accessing a corrupted shared library */</div><div class='add'>+#define GF_ERROR_CODE_LIBSCN 81   /* .lib section in a.out corrupted */</div><div class='add'>+#define GF_ERROR_CODE_LIBMAX                                                   \</div><div class='add'>+    82 /* Attempting to link in too many shared libraries */</div><div class='add'>+#define GF_ERROR_CODE_LIBEXEC 83 /* Cannot exec a shared library directly */</div><div class='add'>+#define GF_ERROR_CODE_ILSEQ 84   /* Illegal byte sequence */</div><div class='add'>+#define GF_ERROR_CODE_RESTART                                                  \</div><div class='add'>+    85 /* Interrupted system call should be restarted */</div><div class='add'>+#define GF_ERROR_CODE_STRPIPE 86        /* Streams pipe error */</div><div class='add'>+#define GF_ERROR_CODE_USERS 87          /* Too many users */</div><div class='add'>+#define GF_ERROR_CODE_NOTSOCK 88        /* Socket operation on non-socket */</div><div class='add'>+#define GF_ERROR_CODE_DESTADDRREQ 89    /* Destination address required */</div><div class='add'>+#define GF_ERROR_CODE_MSGSIZE 90        /* Message too long */</div><div class='add'>+#define GF_ERROR_CODE_PROTOTYPE 91      /* Protocol wrong type for socket */</div><div class='add'>+#define GF_ERROR_CODE_NOPROTOOPT 92     /* Protocol not available */</div><div class='add'>+#define GF_ERROR_CODE_PROTONOSUPPORT 93 /* Protocol not supported */</div><div class='add'>+#define GF_ERROR_CODE_SOCKTNOSUPPORT 94 /* Socket type not supported */</div><div class='add'>+#define GF_ERROR_CODE_OPNOTSUPP                                                \</div><div class='add'>+    95 /* Operation not supported on transport endpoint */</div><div class='add'>+#define GF_ERROR_CODE_PFNOSUPPORT 96 /* Protocol family not supported */</div><div class='add'>+#define GF_ERROR_CODE_AFNOSUPPORT                                              \</div><div class='add'>+    97 /* Address family not supported by protocol */</div><div class='add'>+#define GF_ERROR_CODE_ADDRINUSE 98    /* Address already in use */</div><div class='add'>+#define GF_ERROR_CODE_ADDRNOTAVAIL 99 /* Cannot assign requested address */</div><div class='add'>+#define GF_ERROR_CODE_NETDOWN 100     /* Network is down */</div><div class='add'>+#define GF_ERROR_CODE_NETUNREACH 101  /* Network is unreachable */</div><div class='add'>+#define GF_ERROR_CODE_NETRESET                                                 \</div><div class='add'>+    102 /* Network dropped connection because of reset */</div><div class='add'>+#define GF_ERROR_CODE_CONNABORTED 103 /* Software caused connection abort */</div><div class='add'>+#define GF_ERROR_CODE_CONNRESET 104   /* Connection reset by peer */</div><div class='add'>+#define GF_ERROR_CODE_NOBUFS 105      /* No buffer space available */</div><div class='add'>+#define GF_ERROR_CODE_ISCONN 106  /* Transport endpoint is already connected */</div><div class='add'>+#define GF_ERROR_CODE_NOTCONN 107 /* Transport endpoint is not connected */</div><div class='add'>+#define GF_ERROR_CODE_SHUTDOWN                                                 \</div><div class='add'>+    108 /* Cannot send after transport endpoint shutdown */</div><div class='add'>+#define GF_ERROR_CODE_TOOMANYREFS 109 /* Too many references: cannot splice */</div><div class='add'>+#define GF_ERROR_CODE_TIMEDOUT 110    /* Connection timed out */</div><div class='add'>+#define GF_ERROR_CODE_CONNREFUSED 111 /* Connection refused */</div><div class='add'>+#define GF_ERROR_CODE_HOSTDOWN 112    /* Host is down */</div><div class='add'>+#define GF_ERROR_CODE_HOSTUNREACH 113 /* No route to host */</div><div class='add'>+#define GF_ERROR_CODE_ALREADY 114     /* Operation already in progress */</div><div class='add'>+#define GF_ERROR_CODE_INPROGRESS 115  /* Operation now in progress */</div><div class='add'>+#define GF_ERROR_CODE_ALREADY 114     /* Operation already in progress */</div><div class='add'>+#define GF_ERROR_CODE_INPROGRESS 115  /* Operation now in progress */</div><div class='add'>+#define GF_ERROR_CODE_STALE 116       /* Stale NFS file handle */</div><div class='add'>+#define GF_ERROR_CODE_UCLEAN 117      /* Structure needs cleaning */</div><div class='add'>+#define GF_ERROR_CODE_NOTNAM 118      /* Not a XENIX named type file */</div><div class='add'>+#define GF_ERROR_CODE_NAVAIL 119      /* No XENIX semaphores available */</div><div class='add'>+#define GF_ERROR_CODE_ISNAM 120       /* Is a named type file */</div><div class='add'>+#define GF_ERROR_CODE_REMOTEIO 121    /* Remote I/O error */</div><div class='add'>+#define GF_ERROR_CODE_DQUOT 122       /* Quota exceeded */</div><div class='add'>+#define GF_ERROR_CODE_NOMEDIUM 123    /* No medium found */</div><div class='add'>+#define GF_ERROR_CODE_MEDIUMTYPE 124  /* Wrong medium type */</div><div class='add'>+#define GF_ERROR_CODE_CANCELED 125    /* Operation Canceled */</div><div class='add'>+#define GF_ERROR_CODE_NOKEY 126       /* Required key not available */</div><div class='add'>+#define GF_ERROR_CODE_KEYEXPIRED 127  /* Key has expired */</div><div class='add'>+#define GF_ERROR_CODE_KEYREVOKED 128  /* Key has been revoked */</div><div class='add'>+#define GF_ERROR_CODE_KEYREJECTED 129 /* Key was rejected by service */</div><div class='add'>+</div><div class='add'>+/* for robust mutexes */</div><div class='add'>+#define GF_ERROR_CODE_OWNERDEAD 130      /* Owner died */</div><div class='add'>+#define GF_ERROR_CODE_NOTRECOVERABLE 131 /* State not recoverable */</div><div class='add'>+</div><div class='add'>+/* Should never be seen by user programs */</div><div class='add'>+#define GF_ERROR_CODE_RESTARTSYS 512</div><div class='add'>+#define GF_ERROR_CODE_RESTARTNOINTR 513</div><div class='add'>+#define GF_ERROR_CODE_RESTARTNOHAND 514 /* restart if no handler.. */</div><div class='add'>+#define GF_ERROR_CODE_NOIOCTLCMD 515    /* No ioctl command */</div><div class='add'>+#define GF_ERROR_CODE_RESTART_RESTARTBLOCK                                     \</div><div class='add'>+    516 /* restart by calling sys_restart_syscall */</div><div class='add'>+</div><div class='add'>+/* Defined for the NFSv3 protocol */</div><div class='add'>+#define GF_ERROR_CODE_BADHANDLE 521   /* Illegal NFS file handle */</div><div class='add'>+#define GF_ERROR_CODE_NOTSYNC 522     /* Update synchronization mismatch */</div><div class='add'>+#define GF_ERROR_CODE_BADCOOKIE 523   /* Cookie is stale */</div><div class='add'>+#define GF_ERROR_CODE_NOTSUPP 524     /* Operation is not supported */</div><div class='add'>+#define GF_ERROR_CODE_TOOSMALL 525    /* Buffer or request is too small */</div><div class='add'>+#define GF_ERROR_CODE_SERVERFAULT 526 /* An untranslatable error occurred */</div><div class='add'>+#define GF_ERROR_CODE_BADTYPE 527     /* Type not supported by server */</div><div class='add'>+#define GF_ERROR_CODE_JUKEBOX                                                  \</div><div class='add'>+    528 /* Request initiated, but will not complete before timeout */</div><div class='add'>+#define GF_ERROR_CODE_IOCBQUEUED                                               \</div><div class='add'>+    529                             /* iocb queued, will get completion event */</div><div class='add'>+#define GF_ERROR_CODE_IOCBRETRY 530 /* iocb queued, will trigger a retry */</div><div class='add'>+</div><div class='add'>+/* Darwin OS X */</div><div class='add'>+#define GF_ERROR_CODE_NOPOLICY 701</div><div class='add'>+#define GF_ERROR_CODE_BADMACHO 702</div><div class='add'>+#define GF_ERROR_CODE_PWROFF 703</div><div class='add'>+#define GF_ERROR_CODE_DEVERR 704</div><div class='add'>+#define GF_ERROR_CODE_BADARCH 705</div><div class='add'>+#define GF_ERROR_CODE_BADEXEC 706</div><div class='add'>+#define GF_ERROR_CODE_SHLIBVERS 707</div><div class='add'>+</div><div class='add'>+/* Solaris */</div><div class='add'>+/*	ENOTACTIVE 73	/ * Facility is not active		*/</div><div class='add'>+#define GF_ERROR_CODE_NOTACTIVE 801</div><div class='add'>+/*	ELOCKUNMAPPED	72	/ * locked lock was unmapped */</div><div class='add'>+#define GF_ERROR_CODE_LOCKUNMAPPED 802</div><div class='add'>+</div><div class='add'>+/* BSD system */</div><div class='add'>+#define GF_ERROR_CODE_PROCLIM 901      /* Too many processes */</div><div class='add'>+#define GF_ERROR_CODE_BADRPC 902       /* RPC struct is bad */</div><div class='add'>+#define GF_ERROR_CODE_RPCMISMATCH 903  /* RPC version wrong */</div><div class='add'>+#define GF_ERROR_CODE_PROGUNAVAIL 904  /* RPC prog. not avail */</div><div class='add'>+#define GF_ERROR_CODE_PROGMISMATCH 905 /* Program version wrong */</div><div class='add'>+#define GF_ERROR_CODE_PROCUNAVAIL 905  /* Bad procedure for program */</div><div class='add'>+#define GF_ERROR_CODE_FTYPE 906        /* Inappropriate file type or format */</div><div class='add'>+#define GF_ERROR_CODE_AUTH 907         /* Authentication error */</div><div class='add'>+#define GF_ERROR_CODE_NEEDAUTH 908     /* Need authenticator */</div><div class='add'>+#define GF_ERROR_CODE_DOOFUS 909       /* Programming error */</div><div class='add'>+</div><div class='add'>+#define GF_ERROR_CODE_NOATTR GF_ERROR_CODE_NODATA /* Attribute not found */</div><div class='add'>+</div><div class='add'>+/* Either one of enodata or enoattr will be there in system */</div><div class='add'>+#ifndef ENOATTR</div><div class='add'>+#define ENOATTR ENODATA</div><div class='add'>+#endif /* ENOATTR */</div><div class='add'>+</div><div class='add'>+#ifndef ENODATA</div><div class='add'>+#define ENODATA ENOATTR</div><div class='add'>+#endif /* ENODATA */</div><div class='add'>+</div><div class='add'>+#ifndef EBADFD</div><div class='add'>+#define EBADFD EBADRPC</div><div class='add'>+#endif /* EBADFD */</div><div class='add'>+</div><div class='add'>+#if !defined(ENODATA)</div><div class='add'>+/* This happens on FreeBSD.  Value borrowed from Linux. */</div><div class='add'>+#define ENODATA 61</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+/* These functions are defined for all the OS flags, but content will</div><div class='add'>+ * be different for each OS flag.</div><div class='add'>+ */</div><div class='add'>+int32_t</div><div class='add'>+gf_errno_to_error(int32_t op_errno);</div><div class='add'>+int32_t</div><div class='add'>+gf_error_to_errno(int32_t error);</div><div class='add'>+</div><div class='add'>+#endif /* __COMPAT_ERRNO_H__ */</div><div class='head'>diff --git a/libglusterfs/src/glusterfs/compat-uuid.h b/libglusterfs/src/glusterfs/compat-uuid.h<br/>new file mode 100644<br/>index 00000000000..6e7fdefbfab<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/libglusterfs/src/glusterfs/compat-uuid.h?id=d1d7a6f35c816822fab51c820e25023863c239c1'>libglusterfs/src/glusterfs/compat-uuid.h</a></div><div class='hunk'>@@ -0,0 +1,71 @@</div><div class='add'>+/*</div><div class='add'>+ * Copyright (c) 2015 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+ * This file is part of GlusterFS.</div><div class='add'>+ *</div><div class='add'>+ * This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+ * General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+ * later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+ * cases as published by the Free Software Foundation.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+#ifndef _GF_UUID_H</div><div class='add'>+#define _GF_UUID_H</div><div class='add'>+</div><div class='add'>+#include &lt;uuid/uuid.h&gt;</div><div class='add'>+</div><div class='add'>+static inline void</div><div class='add'>+gf_uuid_clear(uuid_t uuid)</div><div class='add'>+{</div><div class='add'>+    uuid_clear(uuid);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static inline int</div><div class='add'>+gf_uuid_compare(uuid_t u1, uuid_t u2)</div><div class='add'>+{</div><div class='add'>+    return uuid_compare(u1, u2);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static inline void</div><div class='add'>+gf_uuid_copy(uuid_t dst, const uuid_t src)</div><div class='add'>+{</div><div class='add'>+    uuid_copy(dst, src);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static inline void</div><div class='add'>+gf_uuid_generate(uuid_t uuid)</div><div class='add'>+{</div><div class='add'>+    uuid_generate(uuid);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static inline int</div><div class='add'>+gf_uuid_is_null(uuid_t uuid)</div><div class='add'>+{</div><div class='add'>+    return uuid_is_null(uuid);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static inline int</div><div class='add'>+gf_uuid_parse(const char *in, uuid_t uuid)</div><div class='add'>+{</div><div class='add'>+    return uuid_parse(in, uuid);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static inline void</div><div class='add'>+gf_uuid_unparse(const uuid_t uuid, char *out)</div><div class='add'>+{</div><div class='add'>+    uuid_unparse(uuid, out);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* TODO: add more uuid APIs, use constructs like this:</div><div class='add'>+#if defined(__NetBSD__) * NetBSD libc *</div><div class='add'>+</div><div class='add'>+#include &lt;string.h&gt;</div><div class='add'>+</div><div class='add'>+static inline void</div><div class='add'>+gf_uuid_clear (uuid_t uuid)</div><div class='add'>+{</div><div class='add'>+        memset (uuid, 0, sizeof (uuid_t));</div><div class='add'>+}</div><div class='add'>+#endif</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#endif /* _GF_UUID_H */</div><div class='head'>diff --git a/libglusterfs/src/glusterfs/compat.h b/libglusterfs/src/glusterfs/compat.h<br/>new file mode 100644<br/>index 00000000000..bf00d903152<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/libglusterfs/src/glusterfs/compat.h?id=d1d7a6f35c816822fab51c820e25023863c239c1'>libglusterfs/src/glusterfs/compat.h</a></div><div class='hunk'>@@ -0,0 +1,544 @@</div><div class='add'>+/*</div><div class='add'>+  Copyright (c) 2008-2012 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#ifndef __COMPAT_H__</div><div class='add'>+#define __COMPAT_H__</div><div class='add'>+</div><div class='add'>+#include &lt;stdint.h&gt;</div><div class='add'>+</div><div class='add'>+#ifndef LLONG_MAX</div><div class='add'>+#define LLONG_MAX __LONG_LONG_MAX__ /* compat with old gcc */</div><div class='add'>+#endif                              /* LLONG_MAX */</div><div class='add'>+</div><div class='add'>+#ifdef GF_LINUX_HOST_OS</div><div class='add'>+</div><div class='add'>+#define UNIX_PATH_MAX 108</div><div class='add'>+</div><div class='add'>+#include &lt;sys/un.h&gt;</div><div class='add'>+#include &lt;linux/limits.h&gt;</div><div class='add'>+#include &lt;sys/xattr.h&gt;</div><div class='add'>+#include &lt;linux/xattr.h&gt;</div><div class='add'>+#include &lt;endian.h&gt;</div><div class='add'>+#ifdef HAVE_LINUX_FALLOC_H</div><div class='add'>+#include &lt;linux/falloc.h&gt;</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#ifdef HAVE_ENDIAN_H</div><div class='add'>+#include &lt;endian.h&gt;</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#ifndef _PATH_UMOUNT</div><div class='add'>+#define _PATH_UMOUNT "/bin/umount"</div><div class='add'>+#endif</div><div class='add'>+#define GF_XATTR_NAME_MAX XATTR_NAME_MAX</div><div class='add'>+#endif /* GF_LINUX_HOST_OS */</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+ * Define the fallocate flags in case we do not have the header. This also</div><div class='add'>+ * accounts for older systems that do not define FALLOC_FL_PUNCH_HOLE.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+#ifndef FALLOC_FL_KEEP_SIZE</div><div class='add'>+#define FALLOC_FL_KEEP_SIZE 0x01 /* default is extend size */</div><div class='add'>+#endif</div><div class='add'>+#ifndef FALLOC_FL_PUNCH_HOLE</div><div class='add'>+#define FALLOC_FL_PUNCH_HOLE 0x02 /* de-allocates range */</div><div class='add'>+#endif</div><div class='add'>+#ifndef FALLOC_FL_ZERO_RANGE</div><div class='add'>+#define FALLOC_FL_ZERO_RANGE 0x10 /* zeroes out range */</div><div class='add'>+#endif</div><div class='add'>+#ifndef FALLOC_FL_COLLAPSE_RANGE</div><div class='add'>+#define FALLOC_FL_COLLAPSE_RANGE 0x08 /* reduces the size */</div><div class='add'>+#endif</div><div class='add'>+#ifndef FALLOC_FL_INSERT_RANGE</div><div class='add'>+#define FALLOC_FL_INSERT_RANGE 0x20 /* expands the size */</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#ifndef HAVE_LLISTXATTR</div><div class='add'>+</div><div class='add'>+/* This part is valid only in case of old glibc which doesn't support</div><div class='add'>+ * 'llistxattr()' system calls.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+#define lremovexattr(path, key) removexattr(path, key)</div><div class='add'>+#define llistxattr(path, key, size) listxattr(path, key, size)</div><div class='add'>+#define lgetxattr(path, key, value, size) getxattr(path, key, value, size)</div><div class='add'>+#define lsetxattr(path, key, value, size, flags)                               \</div><div class='add'>+    setxattr(path, key, value, size, flags)</div><div class='add'>+</div><div class='add'>+#endif /* HAVE_LLISTXATTR */</div><div class='add'>+</div><div class='add'>+#ifdef GF_DARWIN_HOST_OS</div><div class='add'>+#include &lt;machine/endian.h&gt;</div><div class='add'>+#include &lt;libkern/OSByteOrder.h&gt;</div><div class='add'>+#include &lt;sys/xattr.h&gt;</div><div class='add'>+</div><div class='add'>+#define htobe16(x) OSSwapHostToBigInt16(x)</div><div class='add'>+#define htole16(x) OSSwapHostToLittleInt16(x)</div><div class='add'>+#define be16toh(x) OSSwapBigToHostInt16(x)</div><div class='add'>+#define le16toh(x) OSSwapLittleToHostInt16(x)</div><div class='add'>+</div><div class='add'>+#define htobe32(x) OSSwapHostToBigInt32(x)</div><div class='add'>+#define htole32(x) OSSwapHostToLittleInt32(x)</div><div class='add'>+#define be32toh(x) OSSwapBigToHostInt32(x)</div><div class='add'>+#define le32toh(x) OSSwapLittleToHostInt32(x)</div><div class='add'>+</div><div class='add'>+#define htobe64(x) OSSwapHostToBigInt64(x)</div><div class='add'>+#define htole64(x) OSSwapHostToLittleInt64(x)</div><div class='add'>+#define be64toh(x) OSSwapBigToHostInt64(x)</div><div class='add'>+#define le64toh(x) OSSwapLittleToHostInt64(x)</div><div class='add'>+</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#ifdef GF_BSD_HOST_OS</div><div class='add'>+/* In case of FreeBSD and NetBSD */</div><div class='add'>+</div><div class='add'>+#define UNIX_PATH_MAX 104</div><div class='add'>+#include &lt;sys/types.h&gt;</div><div class='add'>+</div><div class='add'>+#include &lt;sys/un.h&gt;</div><div class='add'>+#include &lt;sys/endian.h&gt;</div><div class='add'>+#include &lt;sys/extattr.h&gt;</div><div class='add'>+#ifdef HAVE_SYS_XATTR_H</div><div class='add'>+#include &lt;sys/xattr.h&gt;</div><div class='add'>+#endif /* HAVE_SYS_XATTR_H */</div><div class='add'>+#include &lt;limits.h&gt;</div><div class='add'>+</div><div class='add'>+#include &lt;libgen.h&gt;</div><div class='add'>+/*</div><div class='add'>+ * This is where things like off64_t are defined.</div><div class='add'>+ * So include it before declaring _OFF64_T_DECLARED.</div><div class='add'>+ * If the freebsd version has support for off64_t</div><div class='add'>+ * including stdio.h should be sufficient.</div><div class='add'>+ */</div><div class='add'>+#include &lt;stdio.h&gt;</div><div class='add'>+</div><div class='add'>+#ifndef _OFF64_T_DECLARED</div><div class='add'>+/*</div><div class='add'>+ * Including &lt;stdio.h&gt; (done above) should actually define</div><div class='add'>+ * _OFF64_T_DECLARED with off64_t data type being available</div><div class='add'>+ * for consumption. But, off64_t data type is not recognizable</div><div class='add'>+ * for FreeBSD versions less than 11. Hence, int64_t is typedefed</div><div class='add'>+ * to off64_t.</div><div class='add'>+ */</div><div class='add'>+#define _OFF64_T_DECLARED</div><div class='add'>+typedef int64_t off64_t;</div><div class='add'>+#endif /* _OFF64_T_DECLARED */</div><div class='add'>+</div><div class='add'>+#ifndef XATTR_CREATE</div><div class='add'>+enum {</div><div class='add'>+    ATTR_CREATE = 1,</div><div class='add'>+#define XATTR_CREATE ATTR_CREATE</div><div class='add'>+    ATTR_REPLACE = 2</div><div class='add'>+#define XATTR_REPLACE ATTR_REPLACE</div><div class='add'>+};</div><div class='add'>+#endif /* XATTR_CREATE */</div><div class='add'>+</div><div class='add'>+#ifndef sighandler_t</div><div class='add'>+#define sighandler_t sig_t</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#ifdef __FreeBSD__</div><div class='add'>+#undef ino_t</div><div class='add'>+#define ino_t uint64_t</div><div class='add'>+#include &lt;sys/types.h&gt;</div><div class='add'>+#include &lt;sys/extattr.h&gt;</div><div class='add'>+/* Using NAME_MAX since EXTATTR_MAXNAMELEN is inside a preprocessor conditional</div><div class='add'>+ * for the kernel</div><div class='add'>+ */</div><div class='add'>+#define GF_XATTR_NAME_MAX NAME_MAX</div><div class='add'>+#endif /* __FreeBSD__ */</div><div class='add'>+</div><div class='add'>+#ifdef __NetBSD__</div><div class='add'>+#define GF_XATTR_NAME_MAX XATTR_NAME_MAX</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#ifndef ino64_t</div><div class='add'>+#define ino64_t ino_t</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#ifndef EUCLEAN</div><div class='add'>+#define EUCLEAN 0</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#include &lt;netinet/in.h&gt;</div><div class='add'>+#ifndef s6_addr16</div><div class='add'>+#define s6_addr16 __u6_addr.__u6_addr16</div><div class='add'>+#endif</div><div class='add'>+#ifndef s6_addr32</div><div class='add'>+#define s6_addr32 __u6_addr.__u6_addr32</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#ifndef LOGIN_NAME_MAX</div><div class='add'>+#define LOGIN_NAME_MAX 256</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+/* Posix dictates NAME_MAX to be used */</div><div class='add'>+#ifndef NAME_MAX</div><div class='add'>+#ifdef MAXNAMLEN</div><div class='add'>+#define NAME_MAX MAXNAMLEN</div><div class='add'>+#else</div><div class='add'>+#define NAME_MAX 255</div><div class='add'>+#endif</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#define F_GETLK64 F_GETLK</div><div class='add'>+#define F_SETLK64 F_SETLK</div><div class='add'>+#define F_SETLKW64 F_SETLKW</div><div class='add'>+#define FALLOC_FL_KEEP_SIZE 0x01      /* default is extend size */</div><div class='add'>+#define FALLOC_FL_PUNCH_HOLE 0x02     /* de-allocates range */</div><div class='add'>+#define FALLOC_FL_ZERO_RANGE 0x10     /* zeroes out range */</div><div class='add'>+#define FALLOC_FL_INSERT_RANGE 0x20   /* Expands the size */</div><div class='add'>+#define FALLOC_FL_COLLAPSE_RANGE 0x08 /* Reduces the size */</div><div class='add'>+</div><div class='add'>+#ifndef _PATH_UMOUNT</div><div class='add'>+#define _PATH_UMOUNT "/sbin/umount"</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+gf_extattr_list_reshape(char *list, ssize_t size);</div><div class='add'>+</div><div class='add'>+#endif /* GF_BSD_HOST_OS */</div><div class='add'>+</div><div class='add'>+#ifdef GF_DARWIN_HOST_OS</div><div class='add'>+#include &lt;machine/endian.h&gt;</div><div class='add'>+#include &lt;libkern/OSByteOrder.h&gt;</div><div class='add'>+</div><div class='add'>+#define htobe16(x) OSSwapHostToBigInt16(x)</div><div class='add'>+#define htole16(x) OSSwapHostToLittleInt16(x)</div><div class='add'>+#define be16toh(x) OSSwapBigToHostInt16(x)</div><div class='add'>+#define le16toh(x) OSSwapLittleToHostInt16(x)</div><div class='add'>+</div><div class='add'>+#define htobe32(x) OSSwapHostToBigInt32(x)</div><div class='add'>+#define htole32(x) OSSwapHostToLittleInt32(x)</div><div class='add'>+#define be32toh(x) OSSwapBigToHostInt32(x)</div><div class='add'>+#define le32toh(x) OSSwapLittleToHostInt32(x)</div><div class='add'>+</div><div class='add'>+#define htobe64(x) OSSwapHostToBigInt64(x)</div><div class='add'>+#define htole64(x) OSSwapHostToLittleInt64(x)</div><div class='add'>+#define be64toh(x) OSSwapBigToHostInt64(x)</div><div class='add'>+#define le64toh(x) OSSwapLittleToHostInt64(x)</div><div class='add'>+</div><div class='add'>+#define UNIX_PATH_MAX 104</div><div class='add'>+/* OSX Yosemite now has this defined */</div><div class='add'>+#ifndef AT_SYMLINK_NOFOLLOW</div><div class='add'>+#define AT_SYMLINK_NOFOLLOW 0x100</div><div class='add'>+#endif</div><div class='add'>+#include &lt;sys/types.h&gt;</div><div class='add'>+</div><div class='add'>+#include &lt;sys/un.h&gt;</div><div class='add'>+#include &lt;sys/xattr.h&gt;</div><div class='add'>+#include &lt;limits.h&gt;</div><div class='add'>+</div><div class='add'>+#include &lt;libgen.h&gt;</div><div class='add'>+</div><div class='add'>+#if __DARWIN_64_BIT_INO_T == 0</div><div class='add'>+#error '64 bit ino_t is must for GlusterFS to work, Compile with "CFLAGS=-D__DARWIN_64_BIT_INO_T"'</div><div class='add'>+#endif /* __DARWIN_64_BIT_INO_T */</div><div class='add'>+</div><div class='add'>+#if __DARWIN_64_BIT_INO_T == 0</div><div class='add'>+#error '64 bit ino_t is must for GlusterFS to work, Compile with "CFLAGS=-D__DARWIN_64_BIT_INO_T"'</div><div class='add'>+#endif /* __DARWIN_64_BIT_INO_T */</div><div class='add'>+</div><div class='add'>+#ifndef sighandler_t</div><div class='add'>+#define sighandler_t sig_t</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#ifndef EUCLEAN</div><div class='add'>+#define EUCLEAN 0</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#include &lt;netinet/in.h&gt;</div><div class='add'>+#ifndef s6_addr16</div><div class='add'>+#define s6_addr16 __u6_addr.__u6_addr16</div><div class='add'>+#endif</div><div class='add'>+#ifndef s6_addr32</div><div class='add'>+#define s6_addr32 __u6_addr.__u6_addr32</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+/* Posix dictates NAME_MAX to be used */</div><div class='add'>+#ifndef NAME_MAX</div><div class='add'>+#ifdef MAXNAMLEN</div><div class='add'>+#define NAME_MAX MAXNAMLEN</div><div class='add'>+#else</div><div class='add'>+#define NAME_MAX 255</div><div class='add'>+#endif</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#define F_GETLK64 F_GETLK</div><div class='add'>+#define F_SETLK64 F_SETLK</div><div class='add'>+#define F_SETLKW64 F_SETLKW</div><div class='add'>+</div><div class='add'>+#ifndef FTW_CONTINUE</div><div class='add'>+#define FTW_CONTINUE 0</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#ifndef _PATH_UMOUNT</div><div class='add'>+#define _PATH_UMOUNT "/sbin/umount"</div><div class='add'>+#endif</div><div class='add'>+#endif /* GF_DARWIN_HOST_OS */</div><div class='add'>+</div><div class='add'>+#ifdef GF_SOLARIS_HOST_OS</div><div class='add'>+</div><div class='add'>+#define UNIX_PATH_MAX 108</div><div class='add'>+#define EUCLEAN 117</div><div class='add'>+</div><div class='add'>+#include &lt;sys/un.h&gt;</div><div class='add'>+#include &lt;limits.h&gt;</div><div class='add'>+#include &lt;sys/stat.h&gt;</div><div class='add'>+#include &lt;unistd.h&gt;</div><div class='add'>+#include &lt;sys/fcntl.h&gt;</div><div class='add'>+#include &lt;libgen.h&gt;</div><div class='add'>+#include &lt;sys/mkdev.h&gt;</div><div class='add'>+</div><div class='add'>+#ifndef lchmod</div><div class='add'>+#define lchmod chmod</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#define lgetxattr(path, key, value, size)                                      \</div><div class='add'>+    solaris_getxattr(path, key, value, size)</div><div class='add'>+enum {</div><div class='add'>+    ATTR_CREATE = 1,</div><div class='add'>+#define XATTR_CREATE ATTR_CREATE</div><div class='add'>+    ATTR_REPLACE = 2</div><div class='add'>+#define XATTR_REPLACE ATTR_REPLACE</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+/* This patch is not present in Solaris 10 and before */</div><div class='add'>+#ifndef dirfd</div><div class='add'>+#define dirfd(dirp) ((dirp)-&gt;dd_fd)</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+/* Posix dictates NAME_MAX to be used */</div><div class='add'>+#ifndef NAME_MAX</div><div class='add'>+#ifdef MAXNAMLEN</div><div class='add'>+#define NAME_MAX MAXNAMLEN</div><div class='add'>+#else</div><div class='add'>+#define NAME_MAX 255</div><div class='add'>+#endif</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#include &lt;netinet/in.h&gt;</div><div class='add'>+#ifndef s6_addr16</div><div class='add'>+#define S6_ADDR16(x) ((uint16_t *)((char *)&amp;(x).s6_addr))</div><div class='add'>+#endif</div><div class='add'>+#ifndef s6_addr32</div><div class='add'>+#define s6_addr32 _S6_un._S6_u32</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#define lutimes(filename, times) utimes(filename, times)</div><div class='add'>+</div><div class='add'>+#ifndef SEEK_SET</div><div class='add'>+#define SEEK_SET 0</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+enum {</div><div class='add'>+    DT_UNKNOWN = 0,</div><div class='add'>+#define DT_UNKNOWN DT_UNKNOWN</div><div class='add'>+    DT_FIFO = 1,</div><div class='add'>+#define DT_FIFO DT_FIFO</div><div class='add'>+    DT_CHR = 2,</div><div class='add'>+#define DT_CHR DT_CHR</div><div class='add'>+    DT_DIR = 4,</div><div class='add'>+#define DT_DIR DT_DIR</div><div class='add'>+    DT_BLK = 6,</div><div class='add'>+#define DT_BLK DT_BLK</div><div class='add'>+    DT_REG = 8,</div><div class='add'>+#define DT_REG DT_REG</div><div class='add'>+    DT_LNK = 10,</div><div class='add'>+#define DT_LNK DT_LNK</div><div class='add'>+    DT_SOCK = 12,</div><div class='add'>+#define DT_SOCK DT_SOCK</div><div class='add'>+    DT_WHT = 14</div><div class='add'>+#define DT_WHT DT_WHT</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+#ifndef _PATH_MOUNTED</div><div class='add'>+#define _PATH_MOUNTED "/etc/mtab"</div><div class='add'>+#endif</div><div class='add'>+#ifndef _PATH_UMOUNT</div><div class='add'>+#define _PATH_UMOUNT "/sbin/umount"</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#ifndef O_ASYNC</div><div class='add'>+#ifdef FASYNC</div><div class='add'>+#define O_ASYNC FASYNC</div><div class='add'>+#else</div><div class='add'>+#define O_ASYNC 0</div><div class='add'>+#endif</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#ifndef FTW_CONTINUE</div><div class='add'>+#define FTW_CONTINUE 0</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+asprintf(char **string_ptr, const char *format, ...);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+vasprintf(char **result, const char *format, va_list args);</div><div class='add'>+char *</div><div class='add'>+strsep(char **str, const char *delims);</div><div class='add'>+int</div><div class='add'>+solaris_listxattr(const char *path, char *list, size_t size);</div><div class='add'>+int</div><div class='add'>+solaris_removexattr(const char *path, const char *key);</div><div class='add'>+int</div><div class='add'>+solaris_getxattr(const char *path, const char *key, char *value, size_t size);</div><div class='add'>+int</div><div class='add'>+solaris_setxattr(const char *path, const char *key, const char *value,</div><div class='add'>+                 size_t size, int flags);</div><div class='add'>+int</div><div class='add'>+solaris_fgetxattr(int fd, const char *key, char *value, size_t size);</div><div class='add'>+int</div><div class='add'>+solaris_fsetxattr(int fd, const char *key, const char *value, size_t size,</div><div class='add'>+                  int flags);</div><div class='add'>+int</div><div class='add'>+solaris_flistxattr(int fd, char *list, size_t size);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+solaris_rename(const char *oldpath, const char *newpath);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+solaris_unlink(const char *pathname);</div><div class='add'>+</div><div class='add'>+char *</div><div class='add'>+mkdtemp(char *temp);</div><div class='add'>+</div><div class='add'>+#define GF_SOLARIS_XATTR_DIR ".glusterfs_xattr_inode"</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+solaris_xattr_resolve_path(const char *real_path, char **path);</div><div class='add'>+</div><div class='add'>+#endif /* GF_SOLARIS_HOST_OS */</div><div class='add'>+</div><div class='add'>+#ifndef HAVE_ARGP</div><div class='add'>+#include "argp.h"</div><div class='add'>+#else</div><div class='add'>+#include &lt;argp.h&gt;</div><div class='add'>+#endif /* HAVE_ARGP */</div><div class='add'>+</div><div class='add'>+#ifndef HAVE_STRNLEN</div><div class='add'>+size_t</div><div class='add'>+strnlen(const char *string, size_t maxlen);</div><div class='add'>+#endif /* STRNLEN */</div><div class='add'>+</div><div class='add'>+#ifndef strdupa</div><div class='add'>+#define strdupa(s)                                                             \</div><div class='add'>+    (__extension__({                                                           \</div><div class='add'>+        __const char *__old = (s);                                             \</div><div class='add'>+        size_t __len = strlen(__old) + 1;                                      \</div><div class='add'>+        char *__new = (char *)__builtin_alloca(__len);                         \</div><div class='add'>+        (char *)memcpy(__new, __old, __len);                                   \</div><div class='add'>+    }))</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#define GF_DIR_ALIGN(x) (((x) + sizeof(uint64_t) - 1) &amp; ~(sizeof(uint64_t) - 1))</div><div class='add'>+</div><div class='add'>+#include &lt;sys/types.h&gt;</div><div class='add'>+#include &lt;dirent.h&gt;</div><div class='add'>+</div><div class='add'>+static inline int32_t</div><div class='add'>+dirent_size(struct dirent *entry)</div><div class='add'>+{</div><div class='add'>+    int32_t size = -1;</div><div class='add'>+</div><div class='add'>+#ifdef GF_BSD_HOST_OS</div><div class='add'>+    size = GF_DIR_ALIGN(24 /* FIX MEEEE!!! */ + entry-&gt;d_namlen);</div><div class='add'>+#endif</div><div class='add'>+#ifdef GF_DARWIN_HOST_OS</div><div class='add'>+    size = GF_DIR_ALIGN(24 /* FIX MEEEE!!! */ + entry-&gt;d_namlen);</div><div class='add'>+#endif</div><div class='add'>+#ifdef GF_LINUX_HOST_OS</div><div class='add'>+    size = GF_DIR_ALIGN(24 /* FIX MEEEE!!! */ + entry-&gt;d_reclen);</div><div class='add'>+#endif</div><div class='add'>+#ifdef GF_SOLARIS_HOST_OS</div><div class='add'>+    size = GF_DIR_ALIGN(24 /* FIX MEEEE!!! */ + entry-&gt;d_reclen);</div><div class='add'>+#endif</div><div class='add'>+    return size;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#ifdef THREAD_UNSAFE_BASENAME</div><div class='add'>+char *</div><div class='add'>+basename_r(const char *);</div><div class='add'>+#define basename(path) basename_r(path)</div><div class='add'>+#endif /* THREAD_UNSAFE_BASENAME */</div><div class='add'>+</div><div class='add'>+#ifdef THREAD_UNSAFE_DIRNAME</div><div class='add'>+char *</div><div class='add'>+dirname_r(char *path);</div><div class='add'>+#define dirname(path) dirname_r(path)</div><div class='add'>+#endif /* THREAD_UNSAFE_DIRNAME */</div><div class='add'>+</div><div class='add'>+#ifdef HAVE_STRUCT_STAT_ST_ATIM_TV_NSEC</div><div class='add'>+/* Linux, Solaris, Cygwin */</div><div class='add'>+#define ST_ATIM_SEC(stbuf) ((stbuf)-&gt;st_atim.tv_sec)</div><div class='add'>+#define ST_CTIM_SEC(stbuf) ((stbuf)-&gt;st_ctim.tv_sec)</div><div class='add'>+#define ST_MTIM_SEC(stbuf) ((stbuf)-&gt;st_mtim.tv_sec)</div><div class='add'>+#define ST_ATIM_SEC_SET(stbuf, val) ((stbuf)-&gt;st_atim.tv_sec = (val))</div><div class='add'>+#define ST_MTIM_SEC_SET(stbuf, val) ((stbuf)-&gt;st_mtim.tv_sec = (val))</div><div class='add'>+#define ST_CTIM_SEC_SET(stbuf, val) ((stbuf)-&gt;st_ctim.tv_sec = (val))</div><div class='add'>+#define ST_ATIM_NSEC(stbuf) ((stbuf)-&gt;st_atim.tv_nsec)</div><div class='add'>+#define ST_CTIM_NSEC(stbuf) ((stbuf)-&gt;st_ctim.tv_nsec)</div><div class='add'>+#define ST_MTIM_NSEC(stbuf) ((stbuf)-&gt;st_mtim.tv_nsec)</div><div class='add'>+#define ST_ATIM_NSEC_SET(stbuf, val) ((stbuf)-&gt;st_atim.tv_nsec = (val))</div><div class='add'>+#define ST_MTIM_NSEC_SET(stbuf, val) ((stbuf)-&gt;st_mtim.tv_nsec = (val))</div><div class='add'>+#define ST_CTIM_NSEC_SET(stbuf, val) ((stbuf)-&gt;st_ctim.tv_nsec = (val))</div><div class='add'>+#elif defined(HAVE_STRUCT_STAT_ST_ATIMESPEC_TV_NSEC)</div><div class='add'>+/* FreeBSD, NetBSD */</div><div class='add'>+#define ST_ATIM_SEC(stbuf) ((stbuf)-&gt;st_atimespec.tv_sec)</div><div class='add'>+#define ST_CTIM_SEC(stbuf) ((stbuf)-&gt;st_ctimespec.tv_sec)</div><div class='add'>+#define ST_MTIM_SEC(stbuf) ((stbuf)-&gt;st_mtimespec.tv_sec)</div><div class='add'>+#define ST_ATIM_SEC_SET(stbuf, val) ((stbuf)-&gt;st_atimespec.tv_sec = (val))</div><div class='add'>+#define ST_MTIM_SEC_SET(stbuf, val) ((stbuf)-&gt;st_mtimespec.tv_sec = (val))</div><div class='add'>+#define ST_CTIM_SEC_SET(stbuf, val) ((stbuf)-&gt;st_ctimespec.tv_sec = (val))</div><div class='add'>+#define ST_ATIM_NSEC(stbuf) ((stbuf)-&gt;st_atimespec.tv_nsec)</div><div class='add'>+#define ST_CTIM_NSEC(stbuf) ((stbuf)-&gt;st_ctimespec.tv_nsec)</div><div class='add'>+#define ST_MTIM_NSEC(stbuf) ((stbuf)-&gt;st_mtimespec.tv_nsec)</div><div class='add'>+#define ST_ATIM_NSEC_SET(stbuf, val) ((stbuf)-&gt;st_atimespec.tv_nsec = (val))</div><div class='add'>+#define ST_MTIM_NSEC_SET(stbuf, val) ((stbuf)-&gt;st_mtimespec.tv_nsec = (val))</div><div class='add'>+#define ST_CTIM_NSEC_SET(stbuf, val) ((stbuf)-&gt;st_ctimespec.tv_nsec = (val))</div><div class='add'>+#else</div><div class='add'>+#define ST_ATIM_NSEC(stbuf) (0)</div><div class='add'>+#define ST_CTIM_NSEC(stbuf) (0)</div><div class='add'>+#define ST_MTIM_NSEC(stbuf) (0)</div><div class='add'>+#define ST_ATIM_NSEC_SET(stbuf, val)                                           \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+    } while (0);</div><div class='add'>+#define ST_MTIM_NSEC_SET(stbuf, val)                                           \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+    } while (0);</div><div class='add'>+#define ST_CTIM_NSEC_SET(stbuf, val)                                           \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+    } while (0);</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#ifdef GF_BSD_HOST_OS</div><div class='add'>+#define CLOCK_REALTIME_COARSE CLOCK_REALTIME</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#if defined(__GNUC__) &amp;&amp; !defined(RELAX_POISONING)</div><div class='add'>+/* Use run API, see run.h */</div><div class='add'>+#include &lt;stdlib.h&gt; /* system(), mkostemp() */</div><div class='add'>+#include &lt;stdio.h&gt;  /* popen() */</div><div class='add'>+#ifdef GF_LINUX_HOST_OS</div><div class='add'>+#include &lt;sys/sysmacros.h&gt;</div><div class='add'>+#endif</div><div class='add'>+#pragma GCC poison system mkostemp popen</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+gf_umount_lazy(char *xlname, char *path, int rmdir);</div><div class='add'>+</div><div class='add'>+#ifndef GF_XATTR_NAME_MAX</div><div class='add'>+#error 'Please define GF_XATTR_NAME_MAX for your OS distribution.'</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#endif /* __COMPAT_H__ */</div><div class='head'>diff --git a/libglusterfs/src/glusterfs/daemon.h b/libglusterfs/src/glusterfs/daemon.h<br/>new file mode 100644<br/>index 00000000000..48850800b5e<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/libglusterfs/src/glusterfs/daemon.h?id=d1d7a6f35c816822fab51c820e25023863c239c1'>libglusterfs/src/glusterfs/daemon.h</a></div><div class='hunk'>@@ -0,0 +1,20 @@</div><div class='add'>+/*</div><div class='add'>+  Copyright (c) 2008-2012 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#ifndef _DAEMON_H</div><div class='add'>+#define _DAEMON_H</div><div class='add'>+</div><div class='add'>+#define DEVNULLPATH "/dev/null"</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+os_daemon_return(int nochdir, int noclose);</div><div class='add'>+int</div><div class='add'>+os_daemon(int nochdir, int noclose);</div><div class='add'>+#endif /*_DAEMON_H */</div><div class='head'>diff --git a/libglusterfs/src/glusterfs/default-args.h b/libglusterfs/src/glusterfs/default-args.h<br/>new file mode 100644<br/>index 00000000000..ca7526fcab6<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/libglusterfs/src/glusterfs/default-args.h?id=d1d7a6f35c816822fab51c820e25023863c239c1'>libglusterfs/src/glusterfs/default-args.h</a></div><div class='hunk'>@@ -0,0 +1,455 @@</div><div class='add'>+/*</div><div class='add'>+  Copyright (c) 2008-2015 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+/* libglusterfs/src/defaults.h:</div><div class='add'>+       This file contains definition of default fops and mops functions.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#ifndef _DEFAULT_ARGS_H</div><div class='add'>+#define _DEFAULT_ARGS_H</div><div class='add'>+</div><div class='add'>+#include "glusterfs/xlator.h"</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+args_lookup_cbk_store(default_args_cbk_t *args, int32_t op_ret,</div><div class='add'>+                      int32_t op_errno, inode_t *inode, struct iatt *buf,</div><div class='add'>+                      dict_t *xdata, struct iatt *postparent);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+args_stat_cbk_store(default_args_cbk_t *args, int32_t op_ret, int32_t op_errno,</div><div class='add'>+                    struct iatt *buf, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+args_fstat_cbk_store(default_args_cbk_t *args, int32_t op_ret, int32_t op_errno,</div><div class='add'>+                     struct iatt *buf, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+args_truncate_cbk_store(default_args_cbk_t *args, int32_t op_ret,</div><div class='add'>+                        int32_t op_errno, struct iatt *prebuf,</div><div class='add'>+                        struct iatt *postbuf, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+args_ftruncate_cbk_store(default_args_cbk_t *args, int32_t op_ret,</div><div class='add'>+                         int32_t op_errno, struct iatt *prebuf,</div><div class='add'>+                         struct iatt *postbuf, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+args_access_cbk_store(default_args_cbk_t *args, int32_t op_ret,</div><div class='add'>+                      int32_t op_errno, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+args_readlink_cbk_store(default_args_cbk_t *args, int32_t op_ret,</div><div class='add'>+                        int32_t op_errno, const char *path, struct iatt *stbuf,</div><div class='add'>+                        dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+args_mknod_cbk_store(default_args_cbk_t *args, int32_t op_ret, int32_t op_errno,</div><div class='add'>+                     inode_t *inode, struct iatt *buf, struct iatt *preparent,</div><div class='add'>+                     struct iatt *postparent, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+args_mkdir_cbk_store(default_args_cbk_t *args, int32_t op_ret, int32_t op_errno,</div><div class='add'>+                     inode_t *inode, struct iatt *buf, struct iatt *preparent,</div><div class='add'>+                     struct iatt *postparent, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+args_unlink_cbk_store(default_args_cbk_t *args, int32_t op_ret,</div><div class='add'>+                      int32_t op_errno, struct iatt *preparent,</div><div class='add'>+                      struct iatt *postparent, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+args_rmdir_cbk_store(default_args_cbk_t *args, int32_t op_ret, int32_t op_errno,</div><div class='add'>+                     struct iatt *preparent, struct iatt *postparent,</div><div class='add'>+                     dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+args_symlink_cbk_store(default_args_cbk_t *args, int32_t op_ret,</div><div class='add'>+                       int32_t op_errno, inode_t *inode, struct iatt *buf,</div><div class='add'>+                       struct iatt *preparent, struct iatt *postparent,</div><div class='add'>+                       dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+args_rename_cbk_store(default_args_cbk_t *args, int32_t op_ret,</div><div class='add'>+                      int32_t op_errno, struct iatt *buf,</div><div class='add'>+                      struct iatt *preoldparent, struct iatt *postoldparent,</div><div class='add'>+                      struct iatt *prenewparent, struct iatt *postnewparent,</div><div class='add'>+                      dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+args_link_cbk_store(default_args_cbk_t *args, int32_t op_ret, int32_t op_errno,</div><div class='add'>+                    inode_t *inode, struct iatt *buf, struct iatt *preparent,</div><div class='add'>+                    struct iatt *postparent, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+args_create_cbk_store(default_args_cbk_t *args, int32_t op_ret,</div><div class='add'>+                      int32_t op_errno, fd_t *fd, inode_t *inode,</div><div class='add'>+                      struct iatt *buf, struct iatt *preparent,</div><div class='add'>+                      struct iatt *postparent, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+args_open_cbk_store(default_args_cbk_t *args, int32_t op_ret, int32_t op_errno,</div><div class='add'>+                    fd_t *fd, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+args_readv_cbk_store(default_args_cbk_t *args, int32_t op_ret, int32_t op_errno,</div><div class='add'>+                     struct iovec *vector, int32_t count, struct iatt *stbuf,</div><div class='add'>+                     struct iobref *iobref, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+args_writev_cbk_store(default_args_cbk_t *args, int32_t op_ret,</div><div class='add'>+                      int32_t op_errno, struct iatt *prebuf,</div><div class='add'>+                      struct iatt *postbuf, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+args_put_cbk_store(default_args_cbk_t *args, int32_t op_ret, int32_t op_errno,</div><div class='add'>+                   inode_t *inode, struct iatt *buf, struct iatt *preparent,</div><div class='add'>+                   struct iatt *postparent, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+args_flush_cbk_store(default_args_cbk_t *args, int32_t op_ret, int32_t op_errno,</div><div class='add'>+                     dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+args_fsync_cbk_store(default_args_cbk_t *args, int32_t op_ret, int32_t op_errno,</div><div class='add'>+                     struct iatt *prebuf, struct iatt *postbuf, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+args_opendir_cbk_store(default_args_cbk_t *args, int32_t op_ret,</div><div class='add'>+                       int32_t op_errno, fd_t *fd, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+args_fsyncdir_cbk_store(default_args_cbk_t *args, int32_t op_ret,</div><div class='add'>+                        int32_t op_errno, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+args_statfs_cbk_store(default_args_cbk_t *args, int32_t op_ret,</div><div class='add'>+                      int32_t op_errno, struct statvfs *buf, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+args_setxattr_cbk_store(default_args_cbk_t *args, int32_t op_ret,</div><div class='add'>+                        int32_t op_errno, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+args_getxattr_cbk_store(default_args_cbk_t *args, int32_t op_ret,</div><div class='add'>+                        int32_t op_errno, dict_t *dict, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+args_fsetxattr_cbk_store(default_args_cbk_t *args, int32_t op_ret,</div><div class='add'>+                         int32_t op_errno, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+args_fgetxattr_cbk_store(default_args_cbk_t *args, int32_t op_ret,</div><div class='add'>+                         int32_t op_errno, dict_t *dict, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+args_removexattr_cbk_store(default_args_cbk_t *args, int32_t op_ret,</div><div class='add'>+                           int32_t op_errno, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+args_fremovexattr_cbk_store(default_args_cbk_t *args, int32_t op_ret,</div><div class='add'>+                            int32_t op_errno, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+args_lk_cbk_store(default_args_cbk_t *args, int32_t op_ret, int32_t op_errno,</div><div class='add'>+                  struct gf_flock *lock, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+args_inodelk_cbk_store(default_args_cbk_t *args, int32_t op_ret,</div><div class='add'>+                       int32_t op_errno, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+args_finodelk_cbk_store(default_args_cbk_t *args, int32_t op_ret,</div><div class='add'>+                        int32_t op_errno, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+args_entrylk_cbk_store(default_args_cbk_t *args, int32_t op_ret,</div><div class='add'>+                       int32_t op_errno, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+args_fentrylk_cbk_store(default_args_cbk_t *args, int32_t op_ret,</div><div class='add'>+                        int32_t op_errno, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+args_readdirp_cbk_store(default_args_cbk_t *args, int32_t op_ret,</div><div class='add'>+                        int32_t op_errno, gf_dirent_t *entries, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+args_readdir_cbk_store(default_args_cbk_t *args, int32_t op_ret,</div><div class='add'>+                       int32_t op_errno, gf_dirent_t *entries, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+args_rchecksum_cbk_store(default_args_cbk_t *args, int32_t op_ret,</div><div class='add'>+                         int32_t op_errno, uint32_t weak_checksum,</div><div class='add'>+                         uint8_t *strong_checksum, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+args_xattrop_cbk_store(default_args_cbk_t *args, int32_t op_ret,</div><div class='add'>+                       int32_t op_errno, dict_t *xattr, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+args_fxattrop_cbk_store(default_args_cbk_t *args, int32_t op_ret,</div><div class='add'>+                        int32_t op_errno, dict_t *xattr, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+args_setattr_cbk_store(default_args_cbk_t *args, int32_t op_ret,</div><div class='add'>+                       int32_t op_errno, struct iatt *statpre,</div><div class='add'>+                       struct iatt *statpost, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+args_fsetattr_cbk_store(default_args_cbk_t *args, int32_t op_ret,</div><div class='add'>+                        int32_t op_errno, struct iatt *statpre,</div><div class='add'>+                        struct iatt *statpost, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+args_fallocate_cbk_store(default_args_cbk_t *args, int32_t op_ret,</div><div class='add'>+                         int32_t op_errno, struct iatt *statpre,</div><div class='add'>+                         struct iatt *statpost, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+args_discard_cbk_store(default_args_cbk_t *args, int32_t op_ret,</div><div class='add'>+                       int32_t op_errno, struct iatt *statpre,</div><div class='add'>+                       struct iatt *statpost, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+args_zerofill_cbk_store(default_args_cbk_t *args, int32_t op_ret,</div><div class='add'>+                        int32_t op_errno, struct iatt *statpre,</div><div class='add'>+                        struct iatt *statpost, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+args_ipc_cbk_store(default_args_cbk_t *args, int32_t op_ret, int32_t op_errno,</div><div class='add'>+                   dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+args_seek_cbk_store(default_args_cbk_t *args, int32_t op_ret, int32_t op_errno,</div><div class='add'>+                    off_t offset, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+args_lease_cbk_store(default_args_cbk_t *args, int32_t op_ret, int32_t op_errno,</div><div class='add'>+                     struct gf_lease *lease, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+args_copy_file_range_cbk_store(default_args_cbk_t *args, int32_t op_ret,</div><div class='add'>+                               int32_t op_errno, struct iatt *stbuf,</div><div class='add'>+                               struct iatt *prebuf_dst,</div><div class='add'>+                               struct iatt *postbuf_dst, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+args_cbk_wipe(default_args_cbk_t *args_cbk);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+args_wipe(default_args_t *args);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+args_lookup_store(default_args_t *args, loc_t *loc, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+args_stat_store(default_args_t *args, loc_t *loc, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+args_fstat_store(default_args_t *args, fd_t *fd, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+args_truncate_store(default_args_t *args, loc_t *loc, off_t off, dict_t *xdata);</div><div class='add'>+int</div><div class='add'>+args_ftruncate_store(default_args_t *args, fd_t *fd, off_t off, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+args_access_store(default_args_t *args, loc_t *loc, int32_t mask,</div><div class='add'>+                  dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+args_readlink_store(default_args_t *args, loc_t *loc, size_t size,</div><div class='add'>+                    dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+args_mknod_store(default_args_t *args, loc_t *loc, mode_t mode, dev_t rdev,</div><div class='add'>+                 mode_t umask, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+args_mkdir_store(default_args_t *args, loc_t *loc, mode_t mode, mode_t umask,</div><div class='add'>+                 dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+args_unlink_store(default_args_t *args, loc_t *loc, int xflag, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+args_rmdir_store(default_args_t *args, loc_t *loc, int flags, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+args_symlink_store(default_args_t *args, const char *linkname, loc_t *loc,</div><div class='add'>+                   mode_t umask, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+args_rename_store(default_args_t *args, loc_t *oldloc, loc_t *newloc,</div><div class='add'>+                  dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+args_link_store(default_args_t *args, loc_t *oldloc, loc_t *newloc,</div><div class='add'>+                dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+args_create_store(default_args_t *args, loc_t *loc, int32_t flags, mode_t mode,</div><div class='add'>+                  mode_t umask, fd_t *fd, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+args_open_store(default_args_t *args, loc_t *loc, int32_t flags, fd_t *fd,</div><div class='add'>+                dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+args_readv_store(default_args_t *args, fd_t *fd, size_t size, off_t off,</div><div class='add'>+                 uint32_t flags, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+args_writev_store(default_args_t *args, fd_t *fd, struct iovec *vector,</div><div class='add'>+                  int32_t count, off_t off, uint32_t flags,</div><div class='add'>+                  struct iobref *iobref, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+args_put_store(default_args_t *args, loc_t *loc, mode_t mode, mode_t umask,</div><div class='add'>+               uint32_t flags, struct iovec *vector, int32_t count, off_t off,</div><div class='add'>+               struct iobref *iobref, dict_t *xattr, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+args_flush_store(default_args_t *args, fd_t *fd, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+args_fsync_store(default_args_t *args, fd_t *fd, int32_t datasync,</div><div class='add'>+                 dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+args_opendir_store(default_args_t *args, loc_t *loc, fd_t *fd, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+args_fsyncdir_store(default_args_t *args, fd_t *fd, int32_t datasync,</div><div class='add'>+                    dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+args_statfs_store(default_args_t *args, loc_t *loc, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+args_setxattr_store(default_args_t *args, loc_t *loc, dict_t *dict,</div><div class='add'>+                    int32_t flags, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+args_getxattr_store(default_args_t *args, loc_t *loc, const char *name,</div><div class='add'>+                    dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+args_fsetxattr_store(default_args_t *args, fd_t *fd, dict_t *dict,</div><div class='add'>+                     int32_t flags, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+args_fgetxattr_store(default_args_t *args, fd_t *fd, const char *name,</div><div class='add'>+                     dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+args_removexattr_store(default_args_t *args, loc_t *loc, const char *name,</div><div class='add'>+                       dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+args_fremovexattr_store(default_args_t *args, fd_t *fd, const char *name,</div><div class='add'>+                        dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+args_lk_store(default_args_t *args, fd_t *fd, int32_t cmd,</div><div class='add'>+              struct gf_flock *lock, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+args_inodelk_store(default_args_t *args, const char *volume, loc_t *loc,</div><div class='add'>+                   int32_t cmd, struct gf_flock *lock, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+args_finodelk_store(default_args_t *args, const char *volume, fd_t *fd,</div><div class='add'>+                    int32_t cmd, struct gf_flock *lock, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+args_entrylk_store(default_args_t *args, const char *volume, loc_t *loc,</div><div class='add'>+                   const char *name, entrylk_cmd cmd, entrylk_type type,</div><div class='add'>+                   dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+args_fentrylk_store(default_args_t *args, const char *volume, fd_t *fd,</div><div class='add'>+                    const char *name, entrylk_cmd cmd, entrylk_type type,</div><div class='add'>+                    dict_t *xdata);</div><div class='add'>+int</div><div class='add'>+args_readdirp_store(default_args_t *args, fd_t *fd, size_t size, off_t off,</div><div class='add'>+                    dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+args_readdir_store(default_args_t *args, fd_t *fd, size_t size, off_t off,</div><div class='add'>+                   dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+args_rchecksum_store(default_args_t *args, fd_t *fd, off_t offset, int32_t len,</div><div class='add'>+                     dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+args_xattrop_store(default_args_t *args, loc_t *loc, gf_xattrop_flags_t optype,</div><div class='add'>+                   dict_t *xattr, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+args_fxattrop_store(default_args_t *args, fd_t *fd, gf_xattrop_flags_t optype,</div><div class='add'>+                    dict_t *xattr, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+args_setattr_store(default_args_t *args, loc_t *loc, struct iatt *stbuf,</div><div class='add'>+                   int32_t valid, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+args_fsetattr_store(default_args_t *args, fd_t *fd, struct iatt *stbuf,</div><div class='add'>+                    int32_t valid, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+args_fallocate_store(default_args_t *args, fd_t *fd, int32_t mode, off_t offset,</div><div class='add'>+                     size_t len, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+args_discard_store(default_args_t *args, fd_t *fd, off_t offset, size_t len,</div><div class='add'>+                   dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+args_zerofill_store(default_args_t *args, fd_t *fd, off_t offset, off_t len,</div><div class='add'>+                    dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+args_ipc_store(default_args_t *args, int32_t op, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+args_seek_store(default_args_t *args, fd_t *fd, off_t offset,</div><div class='add'>+                gf_seek_what_t what, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+args_lease_store(default_args_t *args, loc_t *loc, struct gf_lease *lease,</div><div class='add'>+                 dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+args_getactivelk_cbk_store(default_args_cbk_t *args, int32_t op_ret,</div><div class='add'>+                           int32_t op_errno, lock_migration_info_t *locklist,</div><div class='add'>+                           dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+args_setactivelk_store(default_args_t *args, loc_t *loc,</div><div class='add'>+                       lock_migration_info_t *locklist, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+args_icreate_store(default_args_t *args, loc_t *loc, mode_t mode,</div><div class='add'>+                   dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+args_namelink_store(default_args_t *args, loc_t *loc, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+args_copy_file_range_store(default_args_t *args, fd_t *fd_in, off64_t off_in,</div><div class='add'>+                           fd_t *fd_out, off_t off64_out, size_t len,</div><div class='add'>+                           uint32_t flags, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+args_cbk_init(default_args_cbk_t *args_cbk);</div><div class='add'>+#endif /* _DEFAULT_ARGS_H */</div><div class='head'>diff --git a/libglusterfs/src/glusterfs/defaults.h b/libglusterfs/src/glusterfs/defaults.h<br/>new file mode 100644<br/>index 00000000000..5a818eeb91a<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/libglusterfs/src/glusterfs/defaults.h?id=d1d7a6f35c816822fab51c820e25023863c239c1'>libglusterfs/src/glusterfs/defaults.h</a></div><div class='hunk'>@@ -0,0 +1,1275 @@</div><div class='add'>+/*</div><div class='add'>+  Copyright (c) 2008-2015 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+/* libglusterfs/src/defaults.h:</div><div class='add'>+       This file contains definition of default fops and mops functions.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#ifndef _DEFAULTS_H</div><div class='add'>+#define _DEFAULTS_H</div><div class='add'>+</div><div class='add'>+#include "glusterfs/xlator.h"</div><div class='add'>+</div><div class='add'>+typedef struct {</div><div class='add'>+    int op_ret;</div><div class='add'>+    int op_errno;</div><div class='add'>+    inode_t *inode;</div><div class='add'>+    struct iatt stat;</div><div class='add'>+    struct iatt prestat;</div><div class='add'>+    struct iatt poststat;</div><div class='add'>+    struct iatt preparent;   /* @preoldparent in rename_cbk */</div><div class='add'>+    struct iatt postparent;  /* @postoldparent in rename_cbk */</div><div class='add'>+    struct iatt preparent2;  /* @prenewparent in rename_cbk */</div><div class='add'>+    struct iatt postparent2; /* @postnewparent in rename_cbk */</div><div class='add'>+    const char *buf;</div><div class='add'>+    struct iovec *vector;</div><div class='add'>+    int count;</div><div class='add'>+    struct iobref *iobref;</div><div class='add'>+    fd_t *fd;</div><div class='add'>+    struct statvfs statvfs;</div><div class='add'>+    dict_t *xattr;</div><div class='add'>+    struct gf_flock lock;</div><div class='add'>+    uint32_t weak_checksum;</div><div class='add'>+    uint8_t *strong_checksum;</div><div class='add'>+    dict_t *xdata;</div><div class='add'>+    gf_dirent_t entries;</div><div class='add'>+    off_t offset; /* seek hole/data */</div><div class='add'>+    int valid;    /* If the response is valid or not. For call-stub it is</div><div class='add'>+                     always valid irrespective of this */</div><div class='add'>+    struct gf_lease lease;</div><div class='add'>+    lock_migration_info_t locklist;</div><div class='add'>+} default_args_cbk_t;</div><div class='add'>+</div><div class='add'>+typedef struct {</div><div class='add'>+    loc_t loc;    /* @old in rename(), link() */</div><div class='add'>+    loc_t loc2;   /* @new in rename(), link() */</div><div class='add'>+    fd_t *fd;     /* for all the fd based ops */</div><div class='add'>+    fd_t *fd_dst; /* Only for copy_file_range destination */</div><div class='add'>+    off_t offset;</div><div class='add'>+    /*</div><div class='add'>+     * According to the man page of copy_file_range,</div><div class='add'>+     * the offsets for source and destination file</div><div class='add'>+     * are of type loff_t. But the type loff_t is</div><div class='add'>+     * linux specific and is actual a typedef of</div><div class='add'>+     * off64_t.</div><div class='add'>+     */</div><div class='add'>+    off64_t off_in;  /* For copy_file_range source fd */</div><div class='add'>+    off64_t off_out; /* For copy_file_range destination fd only */</div><div class='add'>+    int mask;</div><div class='add'>+    size_t size;</div><div class='add'>+    mode_t mode;</div><div class='add'>+    dev_t rdev;</div><div class='add'>+    mode_t umask;</div><div class='add'>+    int xflag;</div><div class='add'>+    int flags;</div><div class='add'>+    const char *linkname;</div><div class='add'>+    struct iovec *vector;</div><div class='add'>+    int count;</div><div class='add'>+    struct iobref *iobref;</div><div class='add'>+    int datasync;</div><div class='add'>+    dict_t *xattr;</div><div class='add'>+    const char *name;</div><div class='add'>+    int cmd;</div><div class='add'>+    struct gf_flock lock;</div><div class='add'>+    const char *volume;</div><div class='add'>+    entrylk_cmd entrylkcmd;</div><div class='add'>+    entrylk_type entrylktype;</div><div class='add'>+    gf_xattrop_flags_t optype;</div><div class='add'>+    int valid;</div><div class='add'>+    struct iatt stat;</div><div class='add'>+    gf_seek_what_t what;</div><div class='add'>+    dict_t *xdata;</div><div class='add'>+    struct gf_lease lease;</div><div class='add'>+    lock_migration_info_t locklist;</div><div class='add'>+} default_args_t;</div><div class='add'>+</div><div class='add'>+typedef struct {</div><div class='add'>+    int fop_enum;</div><div class='add'>+    unsigned int fop_length;</div><div class='add'>+    int *enum_list;</div><div class='add'>+    default_args_t *req_list;</div><div class='add'>+    dict_t *xdata;</div><div class='add'>+} compound_args_t;</div><div class='add'>+</div><div class='add'>+typedef struct {</div><div class='add'>+    int fop_enum;</div><div class='add'>+    unsigned int fop_length;</div><div class='add'>+    int *enum_list;</div><div class='add'>+    default_args_cbk_t *rsp_list;</div><div class='add'>+    dict_t *xdata;</div><div class='add'>+} compound_args_cbk_t;</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_notify(xlator_t *this, int32_t event, void *data, ...);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_forget(xlator_t *this, inode_t *inode);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_release(xlator_t *this, fd_t *fd);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_releasedir(xlator_t *this, fd_t *fd);</div><div class='add'>+</div><div class='add'>+extern struct xlator_fops *default_fops;</div><div class='add'>+</div><div class='add'>+/* Management Operations */</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_getspec(call_frame_t *frame, xlator_t *this, const char *key,</div><div class='add'>+                int32_t flag);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_rchecksum(call_frame_t *frame, xlator_t *this, fd_t *fd, off_t offset,</div><div class='add'>+                  int32_t len, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+/* FileSystem operations */</div><div class='add'>+int32_t</div><div class='add'>+default_lookup(call_frame_t *frame, xlator_t *this, loc_t *loc, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_stat(call_frame_t *frame, xlator_t *this, loc_t *loc, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_fstat(call_frame_t *frame, xlator_t *this, fd_t *fd, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_truncate(call_frame_t *frame, xlator_t *this, loc_t *loc, off_t offset,</div><div class='add'>+                 dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_ftruncate(call_frame_t *frame, xlator_t *this, fd_t *fd, off_t offset,</div><div class='add'>+                  dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_access(call_frame_t *frame, xlator_t *this, loc_t *loc, int32_t mask,</div><div class='add'>+               dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_readlink(call_frame_t *frame, xlator_t *this, loc_t *loc, size_t size,</div><div class='add'>+                 dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_mknod(call_frame_t *frame, xlator_t *this, loc_t *loc, mode_t mode,</div><div class='add'>+              dev_t rdev, mode_t umask, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_mkdir(call_frame_t *frame, xlator_t *this, loc_t *loc, mode_t mode,</div><div class='add'>+              mode_t umask, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_unlink(call_frame_t *frame, xlator_t *this, loc_t *loc, int xflag,</div><div class='add'>+               dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_rmdir(call_frame_t *frame, xlator_t *this, loc_t *loc, int xflag,</div><div class='add'>+              dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_symlink(call_frame_t *frame, xlator_t *this, const char *linkpath,</div><div class='add'>+                loc_t *loc, mode_t umask, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_rename(call_frame_t *frame, xlator_t *this, loc_t *oldloc,</div><div class='add'>+               loc_t *newloc, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_link(call_frame_t *frame, xlator_t *this, loc_t *oldloc, loc_t *newloc,</div><div class='add'>+             dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_create(call_frame_t *frame, xlator_t *this, loc_t *loc, int32_t flags,</div><div class='add'>+               mode_t mode, mode_t umask, fd_t *fd, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_open(call_frame_t *frame, xlator_t *this, loc_t *loc, int32_t flags,</div><div class='add'>+             fd_t *fd, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_readv(call_frame_t *frame, xlator_t *this, fd_t *fd, size_t size,</div><div class='add'>+              off_t offset, uint32_t flags, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_writev(call_frame_t *frame, xlator_t *this, fd_t *fd,</div><div class='add'>+               struct iovec *vector, int32_t count, off_t offset,</div><div class='add'>+               uint32_t flags, struct iobref *iobref, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_flush(call_frame_t *frame, xlator_t *this, fd_t *fd, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_fsync(call_frame_t *frame, xlator_t *this, fd_t *fd, int32_t datasync,</div><div class='add'>+              dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_opendir(call_frame_t *frame, xlator_t *this, loc_t *loc, fd_t *fd,</div><div class='add'>+                dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_fsyncdir(call_frame_t *frame, xlator_t *this, fd_t *fd,</div><div class='add'>+                 int32_t datasync, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_statfs(call_frame_t *frame, xlator_t *this, loc_t *loc, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_setxattr(call_frame_t *frame, xlator_t *this, loc_t *loc, dict_t *dict,</div><div class='add'>+                 int32_t flags, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_getxattr(call_frame_t *frame, xlator_t *this, loc_t *loc,</div><div class='add'>+                 const char *name, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_fsetxattr(call_frame_t *frame, xlator_t *this, fd_t *fd, dict_t *dict,</div><div class='add'>+                  int32_t flags, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_fgetxattr(call_frame_t *frame, xlator_t *this, fd_t *fd,</div><div class='add'>+                  const char *name, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_removexattr(call_frame_t *frame, xlator_t *this, loc_t *loc,</div><div class='add'>+                    const char *name, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_fremovexattr(call_frame_t *frame, xlator_t *this, fd_t *fd,</div><div class='add'>+                     const char *name, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_lk(call_frame_t *frame, xlator_t *this, fd_t *fd, int32_t cmd,</div><div class='add'>+           struct gf_flock *flock, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_inodelk(call_frame_t *frame, xlator_t *this, const char *volume,</div><div class='add'>+                loc_t *loc, int32_t cmd, struct gf_flock *flock, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_finodelk(call_frame_t *frame, xlator_t *this, const char *volume,</div><div class='add'>+                 fd_t *fd, int32_t cmd, struct gf_flock *flock, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_entrylk(call_frame_t *frame, xlator_t *this, const char *volume,</div><div class='add'>+                loc_t *loc, const char *basename, entrylk_cmd cmd,</div><div class='add'>+                entrylk_type type, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_fentrylk(call_frame_t *frame, xlator_t *this, const char *volume,</div><div class='add'>+                 fd_t *fd, const char *basename, entrylk_cmd cmd,</div><div class='add'>+                 entrylk_type type, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_readdir(call_frame_t *frame, xlator_t *this, fd_t *fd, size_t size,</div><div class='add'>+                off_t off, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_readdirp(call_frame_t *frame, xlator_t *this, fd_t *fd, size_t size,</div><div class='add'>+                 off_t off, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_xattrop(call_frame_t *frame, xlator_t *this, loc_t *loc,</div><div class='add'>+                gf_xattrop_flags_t flags, dict_t *dict, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_fxattrop(call_frame_t *frame, xlator_t *this, fd_t *fd,</div><div class='add'>+                 gf_xattrop_flags_t flags, dict_t *dict, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_setattr(call_frame_t *frame, xlator_t *this, loc_t *loc,</div><div class='add'>+                struct iatt *stbuf, int32_t valid, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_fsetattr(call_frame_t *frame, xlator_t *this, fd_t *fd,</div><div class='add'>+                 struct iatt *stbuf, int32_t valid, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_fallocate(call_frame_t *frame, xlator_t *this, fd_t *fd,</div><div class='add'>+                  int32_t keep_size, off_t offset, size_t len, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_discard(call_frame_t *frame, xlator_t *this, fd_t *fd, off_t offset,</div><div class='add'>+                size_t len, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_zerofill(call_frame_t *frame, xlator_t *this, fd_t *fd, off_t offset,</div><div class='add'>+                 off_t len, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_ipc(call_frame_t *frame, xlator_t *this, int32_t op, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_seek(call_frame_t *frame, xlator_t *this, fd_t *fd, off_t offset,</div><div class='add'>+             gf_seek_what_t what, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_lease(call_frame_t *frame, xlator_t *this, loc_t *loc,</div><div class='add'>+              struct gf_lease *lease, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_getactivelk(call_frame_t *frame, xlator_t *this, loc_t *loc,</div><div class='add'>+                    dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_setactivelk(call_frame_t *frame, xlator_t *this, loc_t *loc,</div><div class='add'>+                    lock_migration_info_t *locklist, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_put(call_frame_t *frame, xlator_t *this, loc_t *loc, mode_t mode,</div><div class='add'>+            mode_t umask, uint32_t flags, struct iovec *vector, int32_t count,</div><div class='add'>+            off_t off, struct iobref *iobref, dict_t *xattr, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_icreate(call_frame_t *frame, xlator_t *this, loc_t *loc, mode_t mode,</div><div class='add'>+                dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_namelink(call_frame_t *frame, xlator_t *this, loc_t *loc,</div><div class='add'>+                 dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_copy_file_range(call_frame_t *frame, xlator_t *this, fd_t *fd_in,</div><div class='add'>+                        off64_t off_in, fd_t *fd_out, off64_t off_out,</div><div class='add'>+                        size_t len, uint32_t flags, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+/* Resume */</div><div class='add'>+int32_t</div><div class='add'>+default_getspec_resume(call_frame_t *frame, xlator_t *this, const char *key,</div><div class='add'>+                       int32_t flag);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_rchecksum_resume(call_frame_t *frame, xlator_t *this, fd_t *fd,</div><div class='add'>+                         off_t offset, int32_t len, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+/* FileSystem operations */</div><div class='add'>+int32_t</div><div class='add'>+default_lookup_resume(call_frame_t *frame, xlator_t *this, loc_t *loc,</div><div class='add'>+                      dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_stat_resume(call_frame_t *frame, xlator_t *this, loc_t *loc,</div><div class='add'>+                    dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_fstat_resume(call_frame_t *frame, xlator_t *this, fd_t *fd,</div><div class='add'>+                     dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_truncate_resume(call_frame_t *frame, xlator_t *this, loc_t *loc,</div><div class='add'>+                        off_t offset, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_ftruncate_resume(call_frame_t *frame, xlator_t *this, fd_t *fd,</div><div class='add'>+                         off_t offset, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_access_resume(call_frame_t *frame, xlator_t *this, loc_t *loc,</div><div class='add'>+                      int32_t mask, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_readlink_resume(call_frame_t *frame, xlator_t *this, loc_t *loc,</div><div class='add'>+                        size_t size, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_mknod_resume(call_frame_t *frame, xlator_t *this, loc_t *loc,</div><div class='add'>+                     mode_t mode, dev_t rdev, mode_t umask, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_mkdir_resume(call_frame_t *frame, xlator_t *this, loc_t *loc,</div><div class='add'>+                     mode_t mode, mode_t umask, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_unlink_resume(call_frame_t *frame, xlator_t *this, loc_t *loc,</div><div class='add'>+                      int xflag, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_rmdir_resume(call_frame_t *frame, xlator_t *this, loc_t *loc, int xflag,</div><div class='add'>+                     dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_symlink_resume(call_frame_t *frame, xlator_t *this,</div><div class='add'>+                       const char *linkpath, loc_t *loc, mode_t umask,</div><div class='add'>+                       dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_rename_resume(call_frame_t *frame, xlator_t *this, loc_t *oldloc,</div><div class='add'>+                      loc_t *newloc, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_link_resume(call_frame_t *frame, xlator_t *this, loc_t *oldloc,</div><div class='add'>+                    loc_t *newloc, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_create_resume(call_frame_t *frame, xlator_t *this, loc_t *loc,</div><div class='add'>+                      int32_t flags, mode_t mode, mode_t umask, fd_t *fd,</div><div class='add'>+                      dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_open_resume(call_frame_t *frame, xlator_t *this, loc_t *loc,</div><div class='add'>+                    int32_t flags, fd_t *fd, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_readv_resume(call_frame_t *frame, xlator_t *this, fd_t *fd, size_t size,</div><div class='add'>+                     off_t offset, uint32_t flags, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_writev_resume(call_frame_t *frame, xlator_t *this, fd_t *fd,</div><div class='add'>+                      struct iovec *vector, int32_t count, off_t offset,</div><div class='add'>+                      uint32_t flags, struct iobref *iobref, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_flush_resume(call_frame_t *frame, xlator_t *this, fd_t *fd,</div><div class='add'>+                     dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_fsync_resume(call_frame_t *frame, xlator_t *this, fd_t *fd,</div><div class='add'>+                     int32_t datasync, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_opendir_resume(call_frame_t *frame, xlator_t *this, loc_t *loc,</div><div class='add'>+                       fd_t *fd, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_fsyncdir_resume(call_frame_t *frame, xlator_t *this, fd_t *fd,</div><div class='add'>+                        int32_t datasync, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_statfs_resume(call_frame_t *frame, xlator_t *this, loc_t *loc,</div><div class='add'>+                      dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_setxattr_resume(call_frame_t *frame, xlator_t *this, loc_t *loc,</div><div class='add'>+                        dict_t *dict, int32_t flags, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_getxattr_resume(call_frame_t *frame, xlator_t *this, loc_t *loc,</div><div class='add'>+                        const char *name, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_fsetxattr_resume(call_frame_t *frame, xlator_t *this, fd_t *fd,</div><div class='add'>+                         dict_t *dict, int32_t flags, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_fgetxattr_resume(call_frame_t *frame, xlator_t *this, fd_t *fd,</div><div class='add'>+                         const char *name, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_removexattr_resume(call_frame_t *frame, xlator_t *this, loc_t *loc,</div><div class='add'>+                           const char *name, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_fremovexattr_resume(call_frame_t *frame, xlator_t *this, fd_t *fd,</div><div class='add'>+                            const char *name, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_lk_resume(call_frame_t *frame, xlator_t *this, fd_t *fd, int32_t cmd,</div><div class='add'>+                  struct gf_flock *flock, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_inodelk_resume(call_frame_t *frame, xlator_t *this, const char *volume,</div><div class='add'>+                       loc_t *loc, int32_t cmd, struct gf_flock *flock,</div><div class='add'>+                       dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_finodelk_resume(call_frame_t *frame, xlator_t *this, const char *volume,</div><div class='add'>+                        fd_t *fd, int32_t cmd, struct gf_flock *flock,</div><div class='add'>+                        dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_entrylk_resume(call_frame_t *frame, xlator_t *this, const char *volume,</div><div class='add'>+                       loc_t *loc, const char *basename, entrylk_cmd cmd,</div><div class='add'>+                       entrylk_type type, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_fentrylk_resume(call_frame_t *frame, xlator_t *this, const char *volume,</div><div class='add'>+                        fd_t *fd, const char *basename, entrylk_cmd cmd,</div><div class='add'>+                        entrylk_type type, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_readdir_resume(call_frame_t *frame, xlator_t *this, fd_t *fd,</div><div class='add'>+                       size_t size, off_t off, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_readdirp_resume(call_frame_t *frame, xlator_t *this, fd_t *fd,</div><div class='add'>+                        size_t size, off_t off, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_xattrop_resume(call_frame_t *frame, xlator_t *this, loc_t *loc,</div><div class='add'>+                       gf_xattrop_flags_t flags, dict_t *dict, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_fxattrop_resume(call_frame_t *frame, xlator_t *this, fd_t *fd,</div><div class='add'>+                        gf_xattrop_flags_t flags, dict_t *dict, dict_t *xdata);</div><div class='add'>+int32_t</div><div class='add'>+default_rchecksum_resume(call_frame_t *frame, xlator_t *this, fd_t *fd,</div><div class='add'>+                         off_t offset, int32_t len, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_setattr_resume(call_frame_t *frame, xlator_t *this, loc_t *loc,</div><div class='add'>+                       struct iatt *stbuf, int32_t valid, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_fsetattr_resume(call_frame_t *frame, xlator_t *this, fd_t *fd,</div><div class='add'>+                        struct iatt *stbuf, int32_t valid, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_fallocate_resume(call_frame_t *frame, xlator_t *this, fd_t *fd,</div><div class='add'>+                         int32_t keep_size, off_t offset, size_t len,</div><div class='add'>+                         dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_discard_resume(call_frame_t *frame, xlator_t *this, fd_t *fd,</div><div class='add'>+                       off_t offset, size_t len, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_zerofill_resume(call_frame_t *frame, xlator_t *this, fd_t *fd,</div><div class='add'>+                        off_t offset, off_t len, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_ipc_resume(call_frame_t *frame, xlator_t *this, int32_t op,</div><div class='add'>+                   dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_seek_resume(call_frame_t *frame, xlator_t *this, fd_t *fd, off_t offset,</div><div class='add'>+                    gf_seek_what_t what, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_lease_resume(call_frame_t *frame, xlator_t *this, loc_t *loc,</div><div class='add'>+                     struct gf_lease *lease, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_getactivelk_resume(call_frame_t *frame, xlator_t *this, loc_t *loc,</div><div class='add'>+                           dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_setactivelk_resume(call_frame_t *frame, xlator_t *this, loc_t *loc,</div><div class='add'>+                           lock_migration_info_t *locklist, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_put_resume(call_frame_t *frame, xlator_t *this, loc_t *loc, mode_t mode,</div><div class='add'>+                   mode_t umask, uint32_t flags, struct iovec *vector,</div><div class='add'>+                   int32_t count, off_t off, struct iobref *iobref,</div><div class='add'>+                   dict_t *xattr, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_copy_file_range_resume(call_frame_t *frame, xlator_t *this, fd_t *fd_in,</div><div class='add'>+                               off_t off64_in, fd_t *fd_out, off64_t off_out,</div><div class='add'>+                               size_t len, uint32_t flags, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+/* _cbk_resume */</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_lookup_cbk_resume(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                          int32_t op_ret, int32_t op_errno, inode_t *inode,</div><div class='add'>+                          struct iatt *buf, dict_t *xdata,</div><div class='add'>+                          struct iatt *postparent);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_stat_cbk_resume(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                        int32_t op_ret, int32_t op_errno, struct iatt *buf,</div><div class='add'>+                        dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_truncate_cbk_resume(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                            int32_t op_ret, int32_t op_errno,</div><div class='add'>+                            struct iatt *prebuf, struct iatt *postbuf,</div><div class='add'>+                            dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_ftruncate_cbk_resume(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                             int32_t op_ret, int32_t op_errno,</div><div class='add'>+                             struct iatt *prebuf, struct iatt *postbuf,</div><div class='add'>+                             dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_access_cbk_resume(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                          int32_t op_ret, int32_t op_errno, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_readlink_cbk_resume(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                            int32_t op_ret, int32_t op_errno, const char *path,</div><div class='add'>+                            struct iatt *buf, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_mknod_cbk_resume(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                         int32_t op_ret, int32_t op_errno, inode_t *inode,</div><div class='add'>+                         struct iatt *buf, struct iatt *preparent,</div><div class='add'>+                         struct iatt *postparent, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_mkdir_cbk_resume(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                         int32_t op_ret, int32_t op_errno, inode_t *inode,</div><div class='add'>+                         struct iatt *buf, struct iatt *preparent,</div><div class='add'>+                         struct iatt *postparent, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_unlink_cbk_resume(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                          int32_t op_ret, int32_t op_errno,</div><div class='add'>+                          struct iatt *preparent, struct iatt *postparent,</div><div class='add'>+                          dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_rmdir_cbk_resume(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                         int32_t op_ret, int32_t op_errno,</div><div class='add'>+                         struct iatt *preparent, struct iatt *postparent,</div><div class='add'>+                         dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_symlink_cbk_resume(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                           int32_t op_ret, int32_t op_errno, inode_t *inode,</div><div class='add'>+                           struct iatt *buf, struct iatt *preparent,</div><div class='add'>+                           struct iatt *postparent, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_rename_cbk_resume(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                          int32_t op_ret, int32_t op_errno, struct iatt *buf,</div><div class='add'>+                          struct iatt *preoldparent, struct iatt *postoldparent,</div><div class='add'>+                          struct iatt *prenewparent, struct iatt *postnewparent,</div><div class='add'>+                          dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_link_cbk_resume(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                        int32_t op_ret, int32_t op_errno, inode_t *inode,</div><div class='add'>+                        struct iatt *buf, struct iatt *preparent,</div><div class='add'>+                        struct iatt *postparent, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_create_cbk_resume(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                          int32_t op_ret, int32_t op_errno, fd_t *fd,</div><div class='add'>+                          inode_t *inode, struct iatt *buf,</div><div class='add'>+                          struct iatt *preparent, struct iatt *postparent,</div><div class='add'>+                          dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_open_cbk_resume(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                        int32_t op_ret, int32_t op_errno, fd_t *fd,</div><div class='add'>+                        dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_readv_cbk_resume(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                         int32_t op_ret, int32_t op_errno, struct iovec *vector,</div><div class='add'>+                         int32_t count, struct iatt *stbuf,</div><div class='add'>+                         struct iobref *iobref, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_writev_cbk_resume(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                          int32_t op_ret, int32_t op_errno, struct iatt *prebuf,</div><div class='add'>+                          struct iatt *postbuf, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_flush_cbk_resume(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                         int32_t op_ret, int32_t op_errno, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_fsync_cbk_resume(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                         int32_t op_ret, int32_t op_errno, struct iatt *prebuf,</div><div class='add'>+                         struct iatt *postbuf, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_fstat_cbk_resume(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                         int32_t op_ret, int32_t op_errno, struct iatt *buf,</div><div class='add'>+                         dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_opendir_cbk_resume(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                           int32_t op_ret, int32_t op_errno, fd_t *fd,</div><div class='add'>+                           dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_fsyncdir_cbk_resume(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                            int32_t op_ret, int32_t op_errno, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_statfs_cbk_resume(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                          int32_t op_ret, int32_t op_errno, struct statvfs *buf,</div><div class='add'>+                          dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_setxattr_cbk_resume(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                            int32_t op_ret, int32_t op_errno, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_fsetxattr_cbk_resume(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                             int32_t op_ret, int32_t op_errno, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_fgetxattr_cbk_resume(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                             int32_t op_ret, int32_t op_errno, dict_t *dict,</div><div class='add'>+                             dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_getxattr_cbk_resume(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                            int32_t op_ret, int32_t op_errno, dict_t *dict,</div><div class='add'>+                            dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_xattrop_cbk_resume(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                           int32_t op_ret, int32_t op_errno, dict_t *dict,</div><div class='add'>+                           dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_fxattrop_cbk_resume(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                            int32_t op_ret, int32_t op_errno, dict_t *dict,</div><div class='add'>+                            dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_removexattr_cbk_resume(call_frame_t *frame, void *cookie,</div><div class='add'>+                               xlator_t *this, int32_t op_ret, int32_t op_errno,</div><div class='add'>+                               dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_fremovexattr_cbk_resume(call_frame_t *frame, void *cookie,</div><div class='add'>+                                xlator_t *this, int32_t op_ret,</div><div class='add'>+                                int32_t op_errno, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_lk_cbk_resume(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                      int32_t op_ret, int32_t op_errno, struct gf_flock *lock,</div><div class='add'>+                      dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_inodelk_cbk_resume(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                           int32_t op_ret, int32_t op_errno, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_finodelk_cbk_resume(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                            int32_t op_ret, int32_t op_errno, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_entrylk_cbk_resume(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                           int32_t op_ret, int32_t op_errno, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_fentrylk_cbk_resume(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                            int32_t op_ret, int32_t op_errno, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_rchecksum_cbk_resume(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                             int32_t op_ret, int32_t op_errno,</div><div class='add'>+                             uint32_t weak_checksum, uint8_t *strong_checksum,</div><div class='add'>+                             dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_readdir_cbk_resume(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                           int32_t op_ret, int32_t op_errno,</div><div class='add'>+                           gf_dirent_t *entries, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_readdirp_cbk_resume(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                            int32_t op_ret, int32_t op_errno,</div><div class='add'>+                            gf_dirent_t *entries, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_setattr_cbk_resume(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                           int32_t op_ret, int32_t op_errno,</div><div class='add'>+                           struct iatt *statpre, struct iatt *statpost,</div><div class='add'>+                           dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_fsetattr_cbk_resume(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                            int32_t op_ret, int32_t op_errno,</div><div class='add'>+                            struct iatt *statpre, struct iatt *statpost,</div><div class='add'>+                            dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_fallocate_cbk_resume(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                             int32_t op_ret, int32_t op_errno, struct iatt *pre,</div><div class='add'>+                             struct iatt *post, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_discard_cbk_resume(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                           int32_t op_ret, int32_t op_errno, struct iatt *pre,</div><div class='add'>+                           struct iatt *post, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_zerofill_cbk_resume(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                            int32_t op_ret, int32_t op_errno, struct iatt *pre,</div><div class='add'>+                            struct iatt *post, dict_t *xdata);</div><div class='add'>+int32_t</div><div class='add'>+default_ipc_cbk_resume(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                       int32_t op_ret, int32_t op_errno, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_seek_cbk_resume(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                        int32_t op_ret, int32_t op_errno, off_t offset,</div><div class='add'>+                        dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_getspec_cbk_resume(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                           int32_t op_ret, int32_t op_errno, char *spec_data);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_lease_cbk_resume(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                         int32_t op_ret, int32_t op_errno,</div><div class='add'>+                         struct gf_lease *lease, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_getactivelk_cbk_resume(call_frame_t *frame, void *cookie,</div><div class='add'>+                               xlator_t *this, int32_t op_ret, int32_t op_errno,</div><div class='add'>+                               lock_migration_info_t *locklist, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_setactivelk_cbk_resume(call_frame_t *frame, void *cookie,</div><div class='add'>+                               xlator_t *this, int32_t op_ret, int32_t op_errno,</div><div class='add'>+                               dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_put_cbk_resume(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                       int32_t op_ret, int32_t op_errno, inode_t *inode,</div><div class='add'>+                       struct iatt *buf, struct iatt *preparent,</div><div class='add'>+                       struct iatt *postparent, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_icreate_resume(call_frame_t *frame, xlator_t *this, loc_t *loc,</div><div class='add'>+                       mode_t mode, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_namelink_resume(call_frame_t *frame, xlator_t *this, loc_t *loc,</div><div class='add'>+                        dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_copy_file_range_cbk_resume(call_frame_t *frame, void *cookie,</div><div class='add'>+                                   xlator_t *this, int32_t op_ret,</div><div class='add'>+                                   int32_t op_errno, struct iatt *stbuf,</div><div class='add'>+                                   struct iatt *prebuf_dst,</div><div class='add'>+                                   struct iatt *postbuf_dst, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+/* _CBK */</div><div class='add'>+int32_t</div><div class='add'>+default_lookup_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                   int32_t op_ret, int32_t op_errno, inode_t *inode,</div><div class='add'>+                   struct iatt *buf, dict_t *xdata, struct iatt *postparent);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_stat_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                 int32_t op_ret, int32_t op_errno, struct iatt *buf,</div><div class='add'>+                 dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_truncate_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                     int32_t op_ret, int32_t op_errno, struct iatt *prebuf,</div><div class='add'>+                     struct iatt *postbuf, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_ftruncate_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                      int32_t op_ret, int32_t op_errno, struct iatt *prebuf,</div><div class='add'>+                      struct iatt *postbuf, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_access_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                   int32_t op_ret, int32_t op_errno, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_readlink_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                     int32_t op_ret, int32_t op_errno, const char *path,</div><div class='add'>+                     struct iatt *buf, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_mknod_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                  int32_t op_ret, int32_t op_errno, inode_t *inode,</div><div class='add'>+                  struct iatt *buf, struct iatt *preparent,</div><div class='add'>+                  struct iatt *postparent, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_mkdir_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                  int32_t op_ret, int32_t op_errno, inode_t *inode,</div><div class='add'>+                  struct iatt *buf, struct iatt *preparent,</div><div class='add'>+                  struct iatt *postparent, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_unlink_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                   int32_t op_ret, int32_t op_errno, struct iatt *preparent,</div><div class='add'>+                   struct iatt *postparent, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_rmdir_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                  int32_t op_ret, int32_t op_errno, struct iatt *preparent,</div><div class='add'>+                  struct iatt *postparent, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_symlink_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                    int32_t op_ret, int32_t op_errno, inode_t *inode,</div><div class='add'>+                    struct iatt *buf, struct iatt *preparent,</div><div class='add'>+                    struct iatt *postparent, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_rename_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                   int32_t op_ret, int32_t op_errno, struct iatt *buf,</div><div class='add'>+                   struct iatt *preoldparent, struct iatt *postoldparent,</div><div class='add'>+                   struct iatt *prenewparent, struct iatt *postnewparent,</div><div class='add'>+                   dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_link_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                 int32_t op_ret, int32_t op_errno, inode_t *inode,</div><div class='add'>+                 struct iatt *buf, struct iatt *preparent,</div><div class='add'>+                 struct iatt *postparent, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_create_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                   int32_t op_ret, int32_t op_errno, fd_t *fd, inode_t *inode,</div><div class='add'>+                   struct iatt *buf, struct iatt *preparent,</div><div class='add'>+                   struct iatt *postparent, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_open_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                 int32_t op_ret, int32_t op_errno, fd_t *fd, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_readv_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                  int32_t op_ret, int32_t op_errno, struct iovec *vector,</div><div class='add'>+                  int32_t count, struct iatt *stbuf, struct iobref *iobref,</div><div class='add'>+                  dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_writev_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                   int32_t op_ret, int32_t op_errno, struct iatt *prebuf,</div><div class='add'>+                   struct iatt *postbuf, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_flush_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                  int32_t op_ret, int32_t op_errno, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_fsync_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                  int32_t op_ret, int32_t op_errno, struct iatt *prebuf,</div><div class='add'>+                  struct iatt *postbuf, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_fstat_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                  int32_t op_ret, int32_t op_errno, struct iatt *buf,</div><div class='add'>+                  dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_opendir_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                    int32_t op_ret, int32_t op_errno, fd_t *fd, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_fsyncdir_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                     int32_t op_ret, int32_t op_errno, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_statfs_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                   int32_t op_ret, int32_t op_errno, struct statvfs *buf,</div><div class='add'>+                   dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_setxattr_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                     int32_t op_ret, int32_t op_errno, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_fsetxattr_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                      int32_t op_ret, int32_t op_errno, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_fgetxattr_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                      int32_t op_ret, int32_t op_errno, dict_t *dict,</div><div class='add'>+                      dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_getxattr_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                     int32_t op_ret, int32_t op_errno, dict_t *dict,</div><div class='add'>+                     dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_xattrop_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                    int32_t op_ret, int32_t op_errno, dict_t *dict,</div><div class='add'>+                    dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_fxattrop_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                     int32_t op_ret, int32_t op_errno, dict_t *dict,</div><div class='add'>+                     dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_removexattr_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                        int32_t op_ret, int32_t op_errno, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_fremovexattr_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                         int32_t op_ret, int32_t op_errno, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_lk_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+               int32_t op_ret, int32_t op_errno, struct gf_flock *lock,</div><div class='add'>+               dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_inodelk_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                    int32_t op_ret, int32_t op_errno, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_finodelk_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                     int32_t op_ret, int32_t op_errno, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_entrylk_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                    int32_t op_ret, int32_t op_errno, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_fentrylk_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                     int32_t op_ret, int32_t op_errno, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_rchecksum_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                      int32_t op_ret, int32_t op_errno, uint32_t weak_checksum,</div><div class='add'>+                      uint8_t *strong_checksum, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_readdir_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                    int32_t op_ret, int32_t op_errno, gf_dirent_t *entries,</div><div class='add'>+                    dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_readdirp_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                     int32_t op_ret, int32_t op_errno, gf_dirent_t *entries,</div><div class='add'>+                     dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_setattr_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                    int32_t op_ret, int32_t op_errno, struct iatt *statpre,</div><div class='add'>+                    struct iatt *statpost, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_fsetattr_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                     int32_t op_ret, int32_t op_errno, struct iatt *statpre,</div><div class='add'>+                     struct iatt *statpost, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_fallocate_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                      int32_t op_ret, int32_t op_errno, struct iatt *pre,</div><div class='add'>+                      struct iatt *post, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_discard_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                    int32_t op_ret, int32_t op_errno, struct iatt *pre,</div><div class='add'>+                    struct iatt *post, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_zerofill_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                     int32_t op_ret, int32_t op_errno, struct iatt *pre,</div><div class='add'>+                     struct iatt *post, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_ipc_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                int32_t op_ret, int32_t op_errno, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_seek_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                 int32_t op_ret, int32_t op_errno, off_t offset, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_getspec_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                    int32_t op_ret, int32_t op_errno, char *spec_data);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_lease_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                  int32_t op_ret, int32_t op_errno, struct gf_lease *lease,</div><div class='add'>+                  dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_getactivelk_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                        int32_t op_ret, int32_t op_errno,</div><div class='add'>+                        lock_migration_info_t *locklist, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_setactivelk_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                        int32_t op_ret, int32_t op_errno, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_put_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                int32_t op_ret, int32_t op_errno, inode_t *inode,</div><div class='add'>+                struct iatt *buf, struct iatt *preparent,</div><div class='add'>+                struct iatt *postparent, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_icreate_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                    int32_t op_ret, int32_t op_errno, inode_t *inode,</div><div class='add'>+                    struct iatt *buf, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_namelink_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                     int32_t op_ret, int32_t op_errno, struct iatt *prebuf,</div><div class='add'>+                     struct iatt *postbuf, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_copy_file_range_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                            int32_t op_ret, int32_t op_errno,</div><div class='add'>+                            struct iatt *stbuf, struct iatt *prebuf_dst,</div><div class='add'>+                            struct iatt *postbuf_dst, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_lookup_failure_cbk(call_frame_t *frame, int32_t op_errno);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_stat_failure_cbk(call_frame_t *frame, int32_t op_errno);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_truncate_failure_cbk(call_frame_t *frame, int32_t op_errno);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_ftruncate_failure_cbk(call_frame_t *frame, int32_t op_errno);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_access_failure_cbk(call_frame_t *frame, int32_t op_errno);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_readlink_failure_cbk(call_frame_t *frame, int32_t op_errno);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_mknod_failure_cbk(call_frame_t *frame, int32_t op_errno);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_mkdir_failure_cbk(call_frame_t *frame, int32_t op_errno);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_unlink_failure_cbk(call_frame_t *frame, int32_t op_errno);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_rmdir_failure_cbk(call_frame_t *frame, int32_t op_errno);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_symlink_failure_cbk(call_frame_t *frame, int32_t op_errno);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_rename_failure_cbk(call_frame_t *frame, int32_t op_errno);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_link_failure_cbk(call_frame_t *frame, int32_t op_errno);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_create_failure_cbk(call_frame_t *frame, int32_t op_errno);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_open_failure_cbk(call_frame_t *frame, int32_t op_errno);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_readv_failure_cbk(call_frame_t *frame, int32_t op_errno);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_writev_failure_cbk(call_frame_t *frame, int32_t op_errno);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_flush_failure_cbk(call_frame_t *frame, int32_t op_errno);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_fsync_failure_cbk(call_frame_t *frame, int32_t op_errno);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_fstat_failure_cbk(call_frame_t *frame, int32_t op_errno);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_opendir_failure_cbk(call_frame_t *frame, int32_t op_errno);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_fsyncdir_failure_cbk(call_frame_t *frame, int32_t op_errno);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_statfs_failure_cbk(call_frame_t *frame, int32_t op_errno);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_setxattr_failure_cbk(call_frame_t *frame, int32_t op_errno);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_fsetxattr_failure_cbk(call_frame_t *frame, int32_t op_errno);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_fgetxattr_failure_cbk(call_frame_t *frame, int32_t op_errno);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_getxattr_failure_cbk(call_frame_t *frame, int32_t op_errno);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_xattrop_failure_cbk(call_frame_t *frame, int32_t op_errno);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_fxattrop_failure_cbk(call_frame_t *frame, int32_t op_errno);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_removexattr_failure_cbk(call_frame_t *frame, int32_t op_errno);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_fremovexattr_failure_cbk(call_frame_t *frame, int32_t op_errno);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_lk_failure_cbk(call_frame_t *frame, int32_t op_errno);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_inodelk_failure_cbk(call_frame_t *frame, int32_t op_errno);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_finodelk_failure_cbk(call_frame_t *frame, int32_t op_errno);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_entrylk_failure_cbk(call_frame_t *frame, int32_t op_errno);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_fentrylk_failure_cbk(call_frame_t *frame, int32_t op_errno);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_rchecksum_failure_cbk(call_frame_t *frame, int32_t op_errno);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_readdir_failure_cbk(call_frame_t *frame, int32_t op_errno);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_readdirp_failure_cbk(call_frame_t *frame, int32_t op_errno);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_setattr_failure_cbk(call_frame_t *frame, int32_t op_errno);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_fsetattr_failure_cbk(call_frame_t *frame, int32_t op_errno);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_fallocate_failure_cbk(call_frame_t *frame, int32_t op_errno);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_discard_failure_cbk(call_frame_t *frame, int32_t op_errno);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_zerofill_failure_cbk(call_frame_t *frame, int32_t op_errno);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_getspec_failure_cbk(call_frame_t *frame, int32_t op_errno);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_ipc_failure_cbk(call_frame_t *frame, int32_t op_errno);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_seek_failure_cbk(call_frame_t *frame, int32_t op_errno);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_lease_failure_cbk(call_frame_t *frame, int32_t op_errno);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_getactivelk_failure_cbk(call_frame_t *frame, int32_t op_errno);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_setactivelk_failure_cbk(call_frame_t *frame, int32_t op_errno);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_put_failure_cbk(call_frame_t *frame, int32_t op_errno);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_icreate_failure_cbk(call_frame_t *frame, int32_t op_errno);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_namelink_failure_cbk(call_frame_t *frame, int32_t op_errno);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_copy_file_range_failure_cbk(call_frame_t *frame, int32_t op_errno);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+default_mem_acct_init(xlator_t *this);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+default_fini(xlator_t *this);</div><div class='add'>+</div><div class='add'>+#endif /* _DEFAULTS_H */</div><div class='head'>diff --git a/libglusterfs/src/glusterfs/dict.h b/libglusterfs/src/glusterfs/dict.h<br/>new file mode 100644<br/>index 00000000000..d0467c6dfb6<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/libglusterfs/src/glusterfs/dict.h?id=d1d7a6f35c816822fab51c820e25023863c239c1'>libglusterfs/src/glusterfs/dict.h</a></div><div class='hunk'>@@ -0,0 +1,420 @@</div><div class='add'>+/*</div><div class='add'>+  Copyright (c) 2008-2012 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#ifndef _DICT_H</div><div class='add'>+#define _DICT_H</div><div class='add'>+</div><div class='add'>+#include &lt;inttypes.h&gt;</div><div class='add'>+#include &lt;sys/uio.h&gt;</div><div class='add'>+#include &lt;pthread.h&gt;</div><div class='add'>+</div><div class='add'>+#include "glusterfs/common-utils.h"</div><div class='add'>+</div><div class='add'>+typedef struct _data data_t;</div><div class='add'>+typedef struct _dict dict_t;</div><div class='add'>+typedef struct _data_pair data_pair_t;</div><div class='add'>+</div><div class='add'>+#define dict_set_sizen(this, key, value) dict_setn(this, key, SLEN(key), value)</div><div class='add'>+</div><div class='add'>+#define dict_add_sizen(this, key, value) dict_addn(this, key, SLEN(key), value)</div><div class='add'>+</div><div class='add'>+#define dict_get_sizen(this, key) dict_getn(this, key, SLEN(key))</div><div class='add'>+</div><div class='add'>+#define dict_del_sizen(this, key) dict_deln(this, key, SLEN(key))</div><div class='add'>+</div><div class='add'>+#define dict_set_str_sizen(this, key, str)                                     \</div><div class='add'>+    dict_set_strn(this, key, SLEN(key), str)</div><div class='add'>+</div><div class='add'>+#define dict_set_sizen_str_sizen(this, key, str)                               \</div><div class='add'>+    dict_set_nstrn(this, key, SLEN(key), str, SLEN(str))</div><div class='add'>+</div><div class='add'>+#define dict_set_dynstr_sizen(this, key, str)                                  \</div><div class='add'>+    dict_set_dynstrn(this, key, SLEN(key), str)</div><div class='add'>+</div><div class='add'>+#define dict_get_str_sizen(this, key, str)                                     \</div><div class='add'>+    dict_get_strn(this, key, SLEN(key), str)</div><div class='add'>+</div><div class='add'>+#define dict_get_int32_sizen(this, key, val)                                   \</div><div class='add'>+    dict_get_int32n(this, key, SLEN(key), val)</div><div class='add'>+</div><div class='add'>+#define dict_set_int32_sizen(this, key, val)                                   \</div><div class='add'>+    dict_set_int32n(this, key, SLEN(key), val)</div><div class='add'>+</div><div class='add'>+#define GF_PROTOCOL_DICT_SERIALIZE(this, from_dict, to, len, ope, labl)        \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        int _ret = 0;                                                          \</div><div class='add'>+                                                                               \</div><div class='add'>+        if (!from_dict)                                                        \</div><div class='add'>+            break;                                                             \</div><div class='add'>+                                                                               \</div><div class='add'>+        _ret = dict_allocate_and_serialize(from_dict, to, &amp;len);               \</div><div class='add'>+        if (_ret &lt; 0) {                                                        \</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_WARNING, 0, LG_MSG_DICT_SERIAL_FAILED,   \</div><div class='add'>+                   "failed to get serialized dict (%s)", (#from_dict));        \</div><div class='add'>+            ope = EINVAL;                                                      \</div><div class='add'>+            goto labl;                                                         \</div><div class='add'>+        }                                                                      \</div><div class='add'>+    } while (0)</div><div class='add'>+</div><div class='add'>+#define GF_PROTOCOL_DICT_UNSERIALIZE(xl, to, buff, len, ret, ope, labl)        \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        if (!len)                                                              \</div><div class='add'>+            break;                                                             \</div><div class='add'>+        to = dict_new();                                                       \</div><div class='add'>+        GF_VALIDATE_OR_GOTO(xl-&gt;name, to, labl);                               \</div><div class='add'>+                                                                               \</div><div class='add'>+        ret = dict_unserialize(buff, len, &amp;to);                                \</div><div class='add'>+        if (ret &lt; 0) {                                                         \</div><div class='add'>+            gf_msg(xl-&gt;name, GF_LOG_WARNING, 0, LG_MSG_DICT_UNSERIAL_FAILED,   \</div><div class='add'>+                   "failed to unserialize dictionary (%s)", (#to));            \</div><div class='add'>+                                                                               \</div><div class='add'>+            ope = EINVAL;                                                      \</div><div class='add'>+            goto labl;                                                         \</div><div class='add'>+        }                                                                      \</div><div class='add'>+                                                                               \</div><div class='add'>+    } while (0)</div><div class='add'>+</div><div class='add'>+#define dict_foreach_inline(d, c) for (c = d-&gt;members_list; c; c = c-&gt;next)</div><div class='add'>+</div><div class='add'>+#define DICT_KEY_VALUE_MAX_SIZE 1048576</div><div class='add'>+#define DICT_MAX_FLAGS 256</div><div class='add'>+#define DICT_FLAG_SET 1</div><div class='add'>+#define DICT_FLAG_CLEAR 0</div><div class='add'>+#define DICT_HDR_LEN 4</div><div class='add'>+#define DICT_DATA_HDR_KEY_LEN 4</div><div class='add'>+#define DICT_DATA_HDR_VAL_LEN 4</div><div class='add'>+</div><div class='add'>+struct _data {</div><div class='add'>+    char *data;</div><div class='add'>+    gf_atomic_t refcount;</div><div class='add'>+    gf_dict_data_type_t data_type;</div><div class='add'>+    uint32_t len;</div><div class='add'>+    gf_boolean_t is_static;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct _data_pair {</div><div class='add'>+    struct _data_pair *hash_next;</div><div class='add'>+    struct _data_pair *prev;</div><div class='add'>+    struct _data_pair *next;</div><div class='add'>+    data_t *value;</div><div class='add'>+    char *key;</div><div class='add'>+    uint32_t key_hash;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct _dict {</div><div class='add'>+    uint64_t max_count;</div><div class='add'>+    int32_t hash_size;</div><div class='add'>+    int32_t count;</div><div class='add'>+    gf_atomic_t refcount;</div><div class='add'>+    data_pair_t **members;</div><div class='add'>+    data_pair_t *members_list;</div><div class='add'>+    char *extra_stdfree;</div><div class='add'>+    gf_lock_t lock;</div><div class='add'>+    data_pair_t *members_internal;</div><div class='add'>+    data_pair_t free_pair;</div><div class='add'>+    /* Variable to store total keylen + value-&gt;len */</div><div class='add'>+    uint32_t totkvlen;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+typedef gf_boolean_t (*dict_match_t)(dict_t *d, char *k, data_t *v, void *data);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+is_data_equal(data_t *one, data_t *two);</div><div class='add'>+void</div><div class='add'>+data_destroy(data_t *data);</div><div class='add'>+</div><div class='add'>+/* function to set a key/value pair (overwrite existing if matches the key */</div><div class='add'>+int32_t</div><div class='add'>+dict_set(dict_t *this, char *key, data_t *value);</div><div class='add'>+int32_t</div><div class='add'>+dict_setn(dict_t *this, char *key, const int keylen, data_t *value);</div><div class='add'>+</div><div class='add'>+/* function to set a new key/value pair (without checking for duplicate) */</div><div class='add'>+int32_t</div><div class='add'>+dict_add(dict_t *this, char *key, data_t *value);</div><div class='add'>+int32_t</div><div class='add'>+dict_addn(dict_t *this, char *key, const int keylen, data_t *value);</div><div class='add'>+int</div><div class='add'>+dict_get_with_ref(dict_t *this, char *key, data_t **data);</div><div class='add'>+data_t *</div><div class='add'>+dict_get(dict_t *this, char *key);</div><div class='add'>+data_t *</div><div class='add'>+dict_getn(dict_t *this, char *key, const int keylen);</div><div class='add'>+void</div><div class='add'>+dict_del(dict_t *this, char *key);</div><div class='add'>+void</div><div class='add'>+dict_deln(dict_t *this, char *key, const int keylen);</div><div class='add'>+int</div><div class='add'>+dict_reset(dict_t *dict);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+dict_key_count(dict_t *this);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+dict_serialized_length(dict_t *dict);</div><div class='add'>+int32_t</div><div class='add'>+dict_serialize(dict_t *dict, char *buf);</div><div class='add'>+int32_t</div><div class='add'>+dict_unserialize(char *buf, int32_t size, dict_t **fill);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+dict_allocate_and_serialize(dict_t *this, char **buf, u_int *length);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+dict_unref(dict_t *dict);</div><div class='add'>+dict_t *</div><div class='add'>+dict_ref(dict_t *dict);</div><div class='add'>+data_t *</div><div class='add'>+data_ref(data_t *data);</div><div class='add'>+void</div><div class='add'>+data_unref(data_t *data);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+dict_lookup(dict_t *this, char *key, data_t **data);</div><div class='add'>+/*</div><div class='add'>+   TODO: provide converts for different byte sizes, signedness, and void *</div><div class='add'>+ */</div><div class='add'>+data_t *</div><div class='add'>+int_to_data(int64_t value);</div><div class='add'>+data_t *</div><div class='add'>+str_to_data(char *value);</div><div class='add'>+data_t *</div><div class='add'>+strn_to_data(char *value, const int vallen);</div><div class='add'>+data_t *</div><div class='add'>+data_from_dynptr(void *value, int32_t len);</div><div class='add'>+data_t *</div><div class='add'>+bin_to_data(void *value, int32_t len);</div><div class='add'>+data_t *</div><div class='add'>+static_str_to_data(char *value);</div><div class='add'>+data_t *</div><div class='add'>+static_bin_to_data(void *value);</div><div class='add'>+</div><div class='add'>+int64_t</div><div class='add'>+data_to_int64(data_t *data);</div><div class='add'>+int32_t</div><div class='add'>+data_to_int32(data_t *data);</div><div class='add'>+int16_t</div><div class='add'>+data_to_int16(data_t *data);</div><div class='add'>+int8_t</div><div class='add'>+data_to_int8(data_t *data);</div><div class='add'>+</div><div class='add'>+uint64_t</div><div class='add'>+data_to_uint64(data_t *data);</div><div class='add'>+uint32_t</div><div class='add'>+data_to_uint32(data_t *data);</div><div class='add'>+uint16_t</div><div class='add'>+data_to_uint16(data_t *data);</div><div class='add'>+uint8_t</div><div class='add'>+data_to_uint8(data_t *data);</div><div class='add'>+</div><div class='add'>+data_t *</div><div class='add'>+data_from_int64(int64_t value);</div><div class='add'>+data_t *</div><div class='add'>+data_from_int32(int32_t value);</div><div class='add'>+data_t *</div><div class='add'>+data_from_int16(int16_t value);</div><div class='add'>+data_t *</div><div class='add'>+data_from_int8(int8_t value);</div><div class='add'>+</div><div class='add'>+data_t *</div><div class='add'>+data_from_uint64(uint64_t value);</div><div class='add'>+data_t *</div><div class='add'>+data_from_uint32(uint32_t value);</div><div class='add'>+data_t *</div><div class='add'>+data_from_uint16(uint16_t value);</div><div class='add'>+</div><div class='add'>+char *</div><div class='add'>+data_to_str(data_t *data);</div><div class='add'>+void *</div><div class='add'>+data_to_bin(data_t *data);</div><div class='add'>+void *</div><div class='add'>+data_to_ptr(data_t *data);</div><div class='add'>+data_t *</div><div class='add'>+data_copy(data_t *old);</div><div class='add'>+struct iatt *</div><div class='add'>+data_to_iatt(data_t *data, char *key);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+dict_foreach(dict_t *this,</div><div class='add'>+             int (*fn)(dict_t *this, char *key, data_t *value, void *data),</div><div class='add'>+             void *data);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+dict_foreach_fnmatch(dict_t *dict, char *pattern,</div><div class='add'>+                     int (*fn)(dict_t *this, char *key, data_t *value,</div><div class='add'>+                               void *data),</div><div class='add'>+                     void *data);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+dict_foreach_match(dict_t *dict,</div><div class='add'>+                   gf_boolean_t (*match)(dict_t *this, char *key, data_t *value,</div><div class='add'>+                                         void *mdata),</div><div class='add'>+                   void *match_data,</div><div class='add'>+                   int (*action)(dict_t *this, char *key, data_t *value,</div><div class='add'>+                                 void *adata),</div><div class='add'>+                   void *action_data);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+dict_null_foreach_fn(dict_t *d, char *k, data_t *v, void *tmp);</div><div class='add'>+int</div><div class='add'>+dict_remove_foreach_fn(dict_t *d, char *k, data_t *v, void *tmp);</div><div class='add'>+dict_t *</div><div class='add'>+dict_copy(dict_t *this, dict_t *new);</div><div class='add'>+int</div><div class='add'>+dict_keys_join(void *value, int size, dict_t *dict,</div><div class='add'>+               int (*filter_fn)(char *key));</div><div class='add'>+</div><div class='add'>+/* CLEANED UP FUNCTIONS DECLARATIONS */</div><div class='add'>+GF_MUST_CHECK dict_t *</div><div class='add'>+dict_new(void);</div><div class='add'>+dict_t *</div><div class='add'>+dict_copy_with_ref(dict_t *this, dict_t *new);</div><div class='add'>+</div><div class='add'>+GF_MUST_CHECK int</div><div class='add'>+dict_reset(dict_t *dict);</div><div class='add'>+</div><div class='add'>+GF_MUST_CHECK int</div><div class='add'>+dict_get_int8(dict_t *this, char *key, int8_t *val);</div><div class='add'>+GF_MUST_CHECK int</div><div class='add'>+dict_set_int8(dict_t *this, char *key, int8_t val);</div><div class='add'>+</div><div class='add'>+GF_MUST_CHECK int</div><div class='add'>+dict_get_int16(dict_t *this, char *key, int16_t *val);</div><div class='add'>+GF_MUST_CHECK int</div><div class='add'>+dict_set_int16(dict_t *this, char *key, int16_t val);</div><div class='add'>+</div><div class='add'>+GF_MUST_CHECK int</div><div class='add'>+dict_get_int32(dict_t *this, char *key, int32_t *val);</div><div class='add'>+GF_MUST_CHECK int</div><div class='add'>+dict_get_int32n(dict_t *this, char *key, const int keylen, int32_t *val);</div><div class='add'>+GF_MUST_CHECK int</div><div class='add'>+dict_set_int32(dict_t *this, char *key, int32_t val);</div><div class='add'>+GF_MUST_CHECK int</div><div class='add'>+dict_set_int32n(dict_t *this, char *key, const int keylen, int32_t val);</div><div class='add'>+</div><div class='add'>+GF_MUST_CHECK int</div><div class='add'>+dict_get_int64(dict_t *this, char *key, int64_t *val);</div><div class='add'>+GF_MUST_CHECK int</div><div class='add'>+dict_set_int64(dict_t *this, char *key, int64_t val);</div><div class='add'>+</div><div class='add'>+GF_MUST_CHECK int</div><div class='add'>+dict_get_uint16(dict_t *this, char *key, uint16_t *val);</div><div class='add'>+GF_MUST_CHECK int</div><div class='add'>+dict_set_uint16(dict_t *this, char *key, uint16_t val);</div><div class='add'>+</div><div class='add'>+GF_MUST_CHECK int</div><div class='add'>+dict_get_uint32(dict_t *this, char *key, uint32_t *val);</div><div class='add'>+GF_MUST_CHECK int</div><div class='add'>+dict_set_uint32(dict_t *this, char *key, uint32_t val);</div><div class='add'>+</div><div class='add'>+GF_MUST_CHECK int</div><div class='add'>+dict_get_uint64(dict_t *this, char *key, uint64_t *val);</div><div class='add'>+GF_MUST_CHECK int</div><div class='add'>+dict_set_uint64(dict_t *this, char *key, uint64_t val);</div><div class='add'>+</div><div class='add'>+GF_MUST_CHECK int</div><div class='add'>+dict_check_flag(dict_t *this, char *key, int flag);</div><div class='add'>+GF_MUST_CHECK int</div><div class='add'>+dict_set_flag(dict_t *this, char *key, int flag);</div><div class='add'>+GF_MUST_CHECK int</div><div class='add'>+dict_clear_flag(dict_t *this, char *key, int flag);</div><div class='add'>+</div><div class='add'>+GF_MUST_CHECK int</div><div class='add'>+dict_get_double(dict_t *this, char *key, double *val);</div><div class='add'>+GF_MUST_CHECK int</div><div class='add'>+dict_set_double(dict_t *this, char *key, double val);</div><div class='add'>+</div><div class='add'>+GF_MUST_CHECK int</div><div class='add'>+dict_set_static_ptr(dict_t *this, char *key, void *ptr);</div><div class='add'>+GF_MUST_CHECK int</div><div class='add'>+dict_get_ptr(dict_t *this, char *key, void **ptr);</div><div class='add'>+GF_MUST_CHECK int</div><div class='add'>+dict_get_ptr_and_len(dict_t *this, char *key, void **ptr, int *len);</div><div class='add'>+GF_MUST_CHECK int</div><div class='add'>+dict_set_dynptr(dict_t *this, char *key, void *ptr, size_t size);</div><div class='add'>+</div><div class='add'>+GF_MUST_CHECK int</div><div class='add'>+dict_get_bin(dict_t *this, char *key, void **ptr);</div><div class='add'>+GF_MUST_CHECK int</div><div class='add'>+dict_set_bin(dict_t *this, char *key, void *ptr, size_t size);</div><div class='add'>+GF_MUST_CHECK int</div><div class='add'>+dict_set_static_bin(dict_t *this, char *key, void *ptr, size_t size);</div><div class='add'>+</div><div class='add'>+GF_MUST_CHECK int</div><div class='add'>+dict_set_option(dict_t *this, char *key, char *str);</div><div class='add'>+GF_MUST_CHECK int</div><div class='add'>+dict_set_str(dict_t *this, char *key, char *str);</div><div class='add'>+GF_MUST_CHECK int</div><div class='add'>+dict_set_strn(dict_t *this, char *key, const int keylen, char *str);</div><div class='add'>+GF_MUST_CHECK int</div><div class='add'>+dict_set_nstrn(dict_t *this, char *key, const int keylen, char *str,</div><div class='add'>+               const int vallen);</div><div class='add'>+GF_MUST_CHECK int</div><div class='add'>+dict_set_dynstr(dict_t *this, char *key, char *str);</div><div class='add'>+GF_MUST_CHECK int</div><div class='add'>+dict_set_dynstrn(dict_t *this, char *key, const int keylen, char *str);</div><div class='add'>+GF_MUST_CHECK int</div><div class='add'>+dict_set_dynstr_with_alloc(dict_t *this, char *key, const char *str);</div><div class='add'>+GF_MUST_CHECK int</div><div class='add'>+dict_add_dynstr_with_alloc(dict_t *this, char *key, char *str);</div><div class='add'>+GF_MUST_CHECK int</div><div class='add'>+dict_get_str(dict_t *this, char *key, char **str);</div><div class='add'>+GF_MUST_CHECK int</div><div class='add'>+dict_get_strn(dict_t *this, char *key, const int keylen, char **str);</div><div class='add'>+</div><div class='add'>+GF_MUST_CHECK int</div><div class='add'>+dict_get_str_boolean(dict_t *this, char *key, int default_val);</div><div class='add'>+GF_MUST_CHECK int</div><div class='add'>+dict_rename_key(dict_t *this, char *key, char *replace_key);</div><div class='add'>+GF_MUST_CHECK int</div><div class='add'>+dict_serialize_value_with_delim(dict_t *this, char *buf, int32_t *serz_len,</div><div class='add'>+                                char delimiter);</div><div class='add'>+</div><div class='add'>+GF_MUST_CHECK int</div><div class='add'>+dict_set_gfuuid(dict_t *this, char *key, uuid_t uuid, bool is_static);</div><div class='add'>+GF_MUST_CHECK int</div><div class='add'>+dict_get_gfuuid(dict_t *this, char *key, uuid_t *uuid);</div><div class='add'>+</div><div class='add'>+GF_MUST_CHECK int</div><div class='add'>+dict_set_iatt(dict_t *this, char *key, struct iatt *iatt, bool is_static);</div><div class='add'>+GF_MUST_CHECK int</div><div class='add'>+dict_get_iatt(dict_t *this, char *key, struct iatt *iatt);</div><div class='add'>+GF_MUST_CHECK int</div><div class='add'>+dict_set_mdata(dict_t *this, char *key, struct mdata_iatt *mdata,</div><div class='add'>+               bool is_static);</div><div class='add'>+GF_MUST_CHECK int</div><div class='add'>+dict_get_mdata(dict_t *this, char *key, struct mdata_iatt *mdata);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+dict_dump_to_statedump(dict_t *dict, char *dict_name, char *domain);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+dict_dump_to_log(dict_t *dict);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+dict_dump_to_str(dict_t *dict, char *dump, int dumpsize, char *format);</div><div class='add'>+gf_boolean_t</div><div class='add'>+dict_match_everything(dict_t *d, char *k, data_t *v, void *data);</div><div class='add'>+</div><div class='add'>+dict_t *</div><div class='add'>+dict_for_key_value(const char *name, const char *value, size_t size,</div><div class='add'>+                   gf_boolean_t is_static);</div><div class='add'>+</div><div class='add'>+gf_boolean_t</div><div class='add'>+are_dicts_equal(dict_t *one, dict_t *two,</div><div class='add'>+                gf_boolean_t (*match)(dict_t *d, char *k, data_t *v,</div><div class='add'>+                                      void *data),</div><div class='add'>+                gf_boolean_t (*value_ignore)(char *k));</div><div class='add'>+int</div><div class='add'>+dict_has_key_from_array(dict_t *dict, char **strings, gf_boolean_t *result);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+dict_serialized_length_lk(dict_t *this);</div><div class='add'>+#endif</div><div class='head'>diff --git a/libglusterfs/src/glusterfs/event-history.h b/libglusterfs/src/glusterfs/event-history.h<br/>new file mode 100644<br/>index 00000000000..f0e0422418e<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/libglusterfs/src/glusterfs/event-history.h?id=d1d7a6f35c816822fab51c820e25023863c239c1'>libglusterfs/src/glusterfs/event-history.h</a></div><div class='hunk'>@@ -0,0 +1,40 @@</div><div class='add'>+/*</div><div class='add'>+  Copyright (c) 2008-2012 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#ifndef _EH_H</div><div class='add'>+#define _EH_H</div><div class='add'>+</div><div class='add'>+#include &lt;pthread.h&gt;              // for pthread_mutex_t</div><div class='add'>+#include &lt;stddef.h&gt;               // for size_t</div><div class='add'>+#include "glusterfs/circ-buff.h"  // for buffer_t, circular_buffer_t</div><div class='add'>+#include "glusterfs/glusterfs.h"  // for gf_boolean_t</div><div class='add'>+</div><div class='add'>+struct event_hist {</div><div class='add'>+    buffer_t *buffer;</div><div class='add'>+    pthread_mutex_t lock;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+typedef struct event_hist eh_t;</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+eh_dump(eh_t *event, void *data,</div><div class='add'>+        int(fn)(circular_buffer_t *buffer, void *data));</div><div class='add'>+</div><div class='add'>+eh_t *</div><div class='add'>+eh_new(size_t buffer_size, gf_boolean_t use_buffer_once,</div><div class='add'>+       void (*destroy_data)(void *data));</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+eh_save_history(eh_t *history, void *string);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+eh_destroy(eh_t *history);</div><div class='add'>+</div><div class='add'>+#endif /* _EH_H */</div><div class='head'>diff --git a/libglusterfs/src/glusterfs/events.h b/libglusterfs/src/glusterfs/events.h<br/>new file mode 100644<br/>index 00000000000..74c5326427b<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/libglusterfs/src/glusterfs/events.h?id=d1d7a6f35c816822fab51c820e25023863c239c1'>libglusterfs/src/glusterfs/events.h</a></div><div class='hunk'>@@ -0,0 +1,34 @@</div><div class='add'>+/*</div><div class='add'>+  Copyright (c) 2016 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#ifndef __EVENTS_H__</div><div class='add'>+#define __EVENTS_H__</div><div class='add'>+</div><div class='add'>+#include "eventtypes.h"</div><div class='add'>+</div><div class='add'>+#ifdef USE_EVENTS</div><div class='add'>+int</div><div class='add'>+_gf_event(eventtypes_t event, const char *fmt, ...)</div><div class='add'>+    __attribute__((__format__(__printf__, 2, 3)));</div><div class='add'>+#else</div><div class='add'>+__attribute__((__format__(__printf__, 2, 3))) static inline int</div><div class='add'>+_gf_event(eventtypes_t event, const char *fmt, ...)</div><div class='add'>+{</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+#endif /* USE_EVENTS */</div><div class='add'>+</div><div class='add'>+#define gf_event(event, fmt...)                                                \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        FMT_WARN(fmt);                                                         \</div><div class='add'>+        _gf_event(event, ##fmt);                                               \</div><div class='add'>+    } while (0)</div><div class='add'>+</div><div class='add'>+#endif /* __EVENTS_H__ */</div><div class='head'>diff --git a/libglusterfs/src/glusterfs/fd-lk.h b/libglusterfs/src/glusterfs/fd-lk.h<br/>new file mode 100644<br/>index 00000000000..76cc680306a<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/libglusterfs/src/glusterfs/fd-lk.h?id=d1d7a6f35c816822fab51c820e25023863c239c1'>libglusterfs/src/glusterfs/fd-lk.h</a></div><div class='hunk'>@@ -0,0 +1,59 @@</div><div class='add'>+/*</div><div class='add'>+  Copyright (c) 2008-2012 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#ifndef _FD_LK_H</div><div class='add'>+#define _FD_LK_H</div><div class='add'>+</div><div class='add'>+#include "glusterfs/fd.h"</div><div class='add'>+#include "glusterfs/locking.h"</div><div class='add'>+#include "glusterfs/list.h"</div><div class='add'>+#include "glusterfs/glusterfs.h"</div><div class='add'>+</div><div class='add'>+#define get_lk_type(type)                                                      \</div><div class='add'>+    type == F_UNLCK ? "F_UNLCK" : (type == F_RDLCK ? "F_RDLCK" : "F_WRLCK")</div><div class='add'>+</div><div class='add'>+#define get_lk_cmd(cmd)                                                        \</div><div class='add'>+    cmd == F_SETLKW ? "F_SETLKW" : (cmd == F_SETLK ? "F_SETLK" : "F_GETLK")</div><div class='add'>+</div><div class='add'>+struct _fd;</div><div class='add'>+</div><div class='add'>+struct fd_lk_ctx {</div><div class='add'>+    struct list_head lk_list;</div><div class='add'>+    gf_atomic_t ref;</div><div class='add'>+    gf_lock_t lock;</div><div class='add'>+};</div><div class='add'>+typedef struct fd_lk_ctx fd_lk_ctx_t;</div><div class='add'>+</div><div class='add'>+struct fd_lk_ctx_node {</div><div class='add'>+    int32_t cmd;</div><div class='add'>+    struct gf_flock user_flock;</div><div class='add'>+    off_t fl_start;</div><div class='add'>+    off_t fl_end;</div><div class='add'>+    short fl_type;</div><div class='add'>+    struct list_head next;</div><div class='add'>+};</div><div class='add'>+typedef struct fd_lk_ctx_node fd_lk_ctx_node_t;</div><div class='add'>+</div><div class='add'>+fd_lk_ctx_t *</div><div class='add'>+fd_lk_ctx_ref(fd_lk_ctx_t *lk_ctx);</div><div class='add'>+</div><div class='add'>+fd_lk_ctx_t *</div><div class='add'>+fd_lk_ctx_create(void);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+fd_lk_insert_and_merge(struct _fd *lk_ctx, int32_t cmd, struct gf_flock *flock);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+fd_lk_ctx_unref(fd_lk_ctx_t *lk_ctx);</div><div class='add'>+</div><div class='add'>+gf_boolean_t</div><div class='add'>+fd_lk_ctx_empty(fd_lk_ctx_t *lk_ctx);</div><div class='add'>+</div><div class='add'>+#endif /* _FD_LK_H */</div><div class='head'>diff --git a/libglusterfs/src/glusterfs/fd.h b/libglusterfs/src/glusterfs/fd.h<br/>new file mode 100644<br/>index 00000000000..3ffaaa60504<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/libglusterfs/src/glusterfs/fd.h?id=d1d7a6f35c816822fab51c820e25023863c239c1'>libglusterfs/src/glusterfs/fd.h</a></div><div class='hunk'>@@ -0,0 +1,169 @@</div><div class='add'>+/*</div><div class='add'>+  Copyright (c) 2008-2012 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#ifndef _FD_H</div><div class='add'>+#define _FD_H</div><div class='add'>+</div><div class='add'>+#include "glusterfs/list.h"</div><div class='add'>+#include &lt;sys/types.h&gt;</div><div class='add'>+#include &lt;unistd.h&gt;</div><div class='add'>+#include "glusterfs/glusterfs.h"</div><div class='add'>+#include "glusterfs/locking.h"</div><div class='add'>+#include "glusterfs/fd-lk.h"</div><div class='add'>+</div><div class='add'>+#define GF_ANON_FD_NO -2</div><div class='add'>+#define GF_ANON_FD_FLAGS (O_RDWR | O_LARGEFILE)</div><div class='add'>+</div><div class='add'>+struct _inode;</div><div class='add'>+struct _dict;</div><div class='add'>+struct fd_lk_ctx;</div><div class='add'>+</div><div class='add'>+struct _fd_ctx {</div><div class='add'>+    union {</div><div class='add'>+        uint64_t key;</div><div class='add'>+        void *xl_key;</div><div class='add'>+    };</div><div class='add'>+    union {</div><div class='add'>+        uint64_t value1;</div><div class='add'>+        void *ptr1;</div><div class='add'>+    };</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct _fd {</div><div class='add'>+    uint64_t pid;</div><div class='add'>+    int32_t flags;</div><div class='add'>+    gf_atomic_t refcount;</div><div class='add'>+    struct list_head inode_list;</div><div class='add'>+    struct _inode *inode;</div><div class='add'>+    gf_lock_t lock; /* used ONLY for manipulating</div><div class='add'>+                       'struct _fd_ctx' array (_ctx).*/</div><div class='add'>+    struct _fd_ctx *_ctx;</div><div class='add'>+    int xl_count; /* Number of xl referred in this fd */</div><div class='add'>+    struct fd_lk_ctx *lk_ctx;</div><div class='add'>+    gf_boolean_t anonymous; /* fd which does not have counterpart open</div><div class='add'>+                               fd on backend (server for client, posix</div><div class='add'>+                               for server). */</div><div class='add'>+};</div><div class='add'>+typedef struct _fd fd_t;</div><div class='add'>+</div><div class='add'>+struct fd_table_entry {</div><div class='add'>+    fd_t *fd;</div><div class='add'>+    int next_free;</div><div class='add'>+};</div><div class='add'>+typedef struct fd_table_entry fdentry_t;</div><div class='add'>+</div><div class='add'>+struct _fdtable {</div><div class='add'>+    int refcount;</div><div class='add'>+    uint32_t max_fds;</div><div class='add'>+    pthread_rwlock_t lock;</div><div class='add'>+    fdentry_t *fdentries;</div><div class='add'>+    int first_free;</div><div class='add'>+};</div><div class='add'>+typedef struct _fdtable fdtable_t;</div><div class='add'>+</div><div class='add'>+/* Signifies no more entries in the fd table. */</div><div class='add'>+#define GF_FDTABLE_END -1</div><div class='add'>+</div><div class='add'>+/* This is used to invalidated</div><div class='add'>+ * the next_free value in an fdentry that has been allocated</div><div class='add'>+ */</div><div class='add'>+#define GF_FDENTRY_ALLOCATED -2</div><div class='add'>+</div><div class='add'>+#include "glusterfs/logging.h"</div><div class='add'>+#include "glusterfs/xlator.h"</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+gf_fd_put(fdtable_t *fdtable, int32_t fd);</div><div class='add'>+</div><div class='add'>+fd_t *</div><div class='add'>+gf_fd_fdptr_get(fdtable_t *fdtable, int64_t fd);</div><div class='add'>+</div><div class='add'>+fdtable_t *</div><div class='add'>+gf_fd_fdtable_alloc(void);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+gf_fd_unused_get(fdtable_t *fdtable, fd_t *fdptr);</div><div class='add'>+</div><div class='add'>+fdentry_t *</div><div class='add'>+gf_fd_fdtable_get_all_fds(fdtable_t *fdtable, uint32_t *count);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+gf_fd_fdtable_destroy(fdtable_t *fdtable);</div><div class='add'>+</div><div class='add'>+fd_t *</div><div class='add'>+__fd_ref(fd_t *fd);</div><div class='add'>+</div><div class='add'>+fd_t *</div><div class='add'>+fd_ref(fd_t *fd);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+fd_unref(fd_t *fd);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+fd_close(fd_t *fd);</div><div class='add'>+</div><div class='add'>+fd_t *</div><div class='add'>+fd_create(struct _inode *inode, pid_t pid);</div><div class='add'>+</div><div class='add'>+fd_t *</div><div class='add'>+fd_create_uint64(struct _inode *inode, uint64_t pid);</div><div class='add'>+</div><div class='add'>+fd_t *</div><div class='add'>+fd_lookup(struct _inode *inode, pid_t pid);</div><div class='add'>+</div><div class='add'>+fd_t *</div><div class='add'>+fd_lookup_uint64(struct _inode *inode, uint64_t pid);</div><div class='add'>+</div><div class='add'>+fd_t *</div><div class='add'>+fd_lookup_anonymous(inode_t *inode, int32_t flags);</div><div class='add'>+</div><div class='add'>+fd_t *</div><div class='add'>+fd_anonymous(inode_t *inode);</div><div class='add'>+</div><div class='add'>+fd_t *</div><div class='add'>+fd_anonymous_with_flags(inode_t *inode, int32_t flags);</div><div class='add'>+</div><div class='add'>+gf_boolean_t</div><div class='add'>+fd_is_anonymous(fd_t *fd);</div><div class='add'>+</div><div class='add'>+uint8_t</div><div class='add'>+fd_list_empty(struct _inode *inode);</div><div class='add'>+</div><div class='add'>+fd_t *</div><div class='add'>+fd_bind(fd_t *fd);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+fd_ctx_set(fd_t *fd, xlator_t *xlator, uint64_t value);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+fd_ctx_get(fd_t *fd, xlator_t *xlator, uint64_t *value);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+fd_ctx_del(fd_t *fd, xlator_t *xlator, uint64_t *value);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+__fd_ctx_del(fd_t *fd, xlator_t *xlator, uint64_t *value);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+__fd_ctx_set(fd_t *fd, xlator_t *xlator, uint64_t value);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+__fd_ctx_get(fd_t *fd, xlator_t *xlator, uint64_t *value);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+fd_ctx_dump(fd_t *fd, char *prefix);</div><div class='add'>+</div><div class='add'>+fdentry_t *</div><div class='add'>+gf_fd_fdtable_copy_all_fds(fdtable_t *fdtable, uint32_t *count);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+gf_fdptr_put(fdtable_t *fdtable, fd_t *fd);</div><div class='add'>+</div><div class='add'>+#endif /* _FD_H */</div><div class='head'>diff --git a/libglusterfs/src/glusterfs/gf-dirent.h b/libglusterfs/src/glusterfs/gf-dirent.h<br/>new file mode 100644<br/>index 00000000000..e358da30f58<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/libglusterfs/src/glusterfs/gf-dirent.h?id=d1d7a6f35c816822fab51c820e25023863c239c1'>libglusterfs/src/glusterfs/gf-dirent.h</a></div><div class='hunk'>@@ -0,0 +1,71 @@</div><div class='add'>+/*</div><div class='add'>+  Copyright (c) 2008-2012 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#ifndef _GF_DIRENT_H</div><div class='add'>+#define _GF_DIRENT_H</div><div class='add'>+</div><div class='add'>+#include "glusterfs/iatt.h"</div><div class='add'>+#include "glusterfs/inode.h"</div><div class='add'>+</div><div class='add'>+#define gf_dirent_size(name) (sizeof(gf_dirent_t) + strlen(name) + 1)</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+gf_deitransform(xlator_t *this, uint64_t y);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+gf_itransform(xlator_t *this, uint64_t x, uint64_t *y_p, int client_id);</div><div class='add'>+</div><div class='add'>+uint64_t</div><div class='add'>+gf_dirent_orig_offset(xlator_t *this, uint64_t offset);</div><div class='add'>+</div><div class='add'>+struct _dir_entry {</div><div class='add'>+    struct _dir_entry *next;</div><div class='add'>+    char *name;</div><div class='add'>+    char *link;</div><div class='add'>+    struct iatt buf;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct _gf_dirent {</div><div class='add'>+    union {</div><div class='add'>+        struct list_head list;</div><div class='add'>+        struct {</div><div class='add'>+            struct _gf_dirent *next;</div><div class='add'>+            struct _gf_dirent *prev;</div><div class='add'>+        };</div><div class='add'>+    };</div><div class='add'>+    uint64_t d_ino;</div><div class='add'>+    uint64_t d_off;</div><div class='add'>+    uint32_t d_len;</div><div class='add'>+    uint32_t d_type;</div><div class='add'>+    struct iatt d_stat;</div><div class='add'>+    dict_t *dict;</div><div class='add'>+    inode_t *inode;</div><div class='add'>+    char d_name[];</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+#define DT_ISDIR(mode) (mode == DT_DIR)</div><div class='add'>+</div><div class='add'>+gf_dirent_t *</div><div class='add'>+gf_dirent_for_name(const char *name);</div><div class='add'>+gf_dirent_t *</div><div class='add'>+entry_copy(gf_dirent_t *source);</div><div class='add'>+void</div><div class='add'>+gf_dirent_entry_free(gf_dirent_t *entry);</div><div class='add'>+void</div><div class='add'>+gf_dirent_free(gf_dirent_t *entries);</div><div class='add'>+int</div><div class='add'>+gf_link_inodes_from_dirent(xlator_t *this, inode_t *parent,</div><div class='add'>+                           gf_dirent_t *entries);</div><div class='add'>+int</div><div class='add'>+gf_fill_iatt_for_dirent(gf_dirent_t *entry, inode_t *parent, xlator_t *subvol);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+gf_link_inode_from_dirent(xlator_t *this, inode_t *parent, gf_dirent_t *entry);</div><div class='add'>+#endif /* _GF_DIRENT_H */</div><div class='head'>diff --git a/libglusterfs/src/glusterfs/gf-event.h b/libglusterfs/src/glusterfs/gf-event.h<br/>new file mode 100644<br/>index 00000000000..40f8fbdf10a<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/libglusterfs/src/glusterfs/gf-event.h?id=d1d7a6f35c816822fab51c820e25023863c239c1'>libglusterfs/src/glusterfs/gf-event.h</a></div><div class='hunk'>@@ -0,0 +1,140 @@</div><div class='add'>+/*</div><div class='add'>+  Copyright (c) 2008-2012 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#ifndef _GF_EVENT_H_</div><div class='add'>+#define _GF_EVENT_H_</div><div class='add'>+</div><div class='add'>+#include &lt;pthread.h&gt;</div><div class='add'>+#include "common-utils.h"</div><div class='add'>+#include "list.h"</div><div class='add'>+</div><div class='add'>+struct event_pool;</div><div class='add'>+struct event_ops;</div><div class='add'>+struct event_slot_poll;</div><div class='add'>+struct event_slot_epoll;</div><div class='add'>+struct event_data {</div><div class='add'>+    int idx;</div><div class='add'>+    int gen;</div><div class='add'>+} __attribute__((__packed__, __may_alias__));</div><div class='add'>+</div><div class='add'>+typedef void (*event_handler_t)(int fd, int idx, int gen, void *data,</div><div class='add'>+                                int poll_in, int poll_out, int poll_err,</div><div class='add'>+                                char event_thread_exit);</div><div class='add'>+</div><div class='add'>+#define EVENT_EPOLL_TABLES 1024</div><div class='add'>+#define EVENT_EPOLL_SLOTS 1024</div><div class='add'>+#define EVENT_MAX_THREADS 1024</div><div class='add'>+</div><div class='add'>+/* See rpcsvc.h to check why. */</div><div class='add'>+GF_STATIC_ASSERT(EVENT_MAX_THREADS % __BITS_PER_LONG == 0);</div><div class='add'>+</div><div class='add'>+struct event_pool {</div><div class='add'>+    struct event_ops *ops;</div><div class='add'>+</div><div class='add'>+    int fd;</div><div class='add'>+    int breaker[2];</div><div class='add'>+</div><div class='add'>+    int count;</div><div class='add'>+    struct event_slot_poll *reg;</div><div class='add'>+    struct event_slot_epoll *ereg[EVENT_EPOLL_TABLES];</div><div class='add'>+    int slots_used[EVENT_EPOLL_TABLES];</div><div class='add'>+</div><div class='add'>+    struct list_head poller_death;</div><div class='add'>+    int poller_death_sliced; /* track whether the list of fds interested</div><div class='add'>+                              * poller_death is sliced. If yes, new thread death</div><div class='add'>+                              * notification has to wait till the list is added</div><div class='add'>+                              * back</div><div class='add'>+                              */</div><div class='add'>+    int poller_gen;</div><div class='add'>+    int used;</div><div class='add'>+    int changed;</div><div class='add'>+</div><div class='add'>+    pthread_mutex_t mutex;</div><div class='add'>+    pthread_cond_t cond;</div><div class='add'>+</div><div class='add'>+    void *evcache;</div><div class='add'>+    int evcache_size;</div><div class='add'>+</div><div class='add'>+    /* NOTE: Currently used only when event processing is done using</div><div class='add'>+     * epoll. */</div><div class='add'>+    int eventthreadcount; /* number of event threads to execute. */</div><div class='add'>+    pthread_t pollers[EVENT_MAX_THREADS]; /* poller thread_id store, and live</div><div class='add'>+                                             status */</div><div class='add'>+    int destroy;</div><div class='add'>+    int activethreadcount;</div><div class='add'>+</div><div class='add'>+    /*</div><div class='add'>+     * Number of threads created by auto-scaling, *in addition to* the</div><div class='add'>+     * configured number of threads.  This is only applicable on the</div><div class='add'>+     * server, where we try to keep the number of threads around the number</div><div class='add'>+     * of bricks.  In that case, the configured number is just "extra"</div><div class='add'>+     * threads to handle requests in excess of one per brick (including</div><div class='add'>+     * requests on the GlusterD connection).  For clients or GlusterD, this</div><div class='add'>+     * number will always be zero, so the "extra" is all we have.</div><div class='add'>+     *</div><div class='add'>+     * TBD: consider auto-scaling for clients as well</div><div class='add'>+     */</div><div class='add'>+    int auto_thread_count;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct event_destroy_data {</div><div class='add'>+    int readfd;</div><div class='add'>+    struct event_pool *pool;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct event_ops {</div><div class='add'>+    struct event_pool *(*new)(int count, int eventthreadcount);</div><div class='add'>+</div><div class='add'>+    int (*event_register)(struct event_pool *event_pool, int fd,</div><div class='add'>+                          event_handler_t handler, void *data, int poll_in,</div><div class='add'>+                          int poll_out, char notify_poller_death);</div><div class='add'>+</div><div class='add'>+    int (*event_select_on)(struct event_pool *event_pool, int fd, int idx,</div><div class='add'>+                           int poll_in, int poll_out);</div><div class='add'>+</div><div class='add'>+    int (*event_unregister)(struct event_pool *event_pool, int fd, int idx);</div><div class='add'>+</div><div class='add'>+    int (*event_unregister_close)(struct event_pool *event_pool, int fd,</div><div class='add'>+                                  int idx);</div><div class='add'>+</div><div class='add'>+    int (*event_dispatch)(struct event_pool *event_pool);</div><div class='add'>+</div><div class='add'>+    int (*event_reconfigure_threads)(struct event_pool *event_pool,</div><div class='add'>+                                     int newcount);</div><div class='add'>+    int (*event_pool_destroy)(struct event_pool *event_pool);</div><div class='add'>+    int (*event_handled)(struct event_pool *event_pool, int fd, int idx,</div><div class='add'>+                         int gen);</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct event_pool *</div><div class='add'>+gf_event_pool_new(int count, int eventthreadcount);</div><div class='add'>+int</div><div class='add'>+gf_event_select_on(struct event_pool *event_pool, int fd, int idx, int poll_in,</div><div class='add'>+                   int poll_out);</div><div class='add'>+int</div><div class='add'>+gf_event_register(struct event_pool *event_pool, int fd,</div><div class='add'>+                  event_handler_t handler, void *data, int poll_in,</div><div class='add'>+                  int poll_out, char notify_poller_death);</div><div class='add'>+int</div><div class='add'>+gf_event_unregister(struct event_pool *event_pool, int fd, int idx);</div><div class='add'>+int</div><div class='add'>+gf_event_unregister_close(struct event_pool *event_pool, int fd, int idx);</div><div class='add'>+int</div><div class='add'>+gf_event_dispatch(struct event_pool *event_pool);</div><div class='add'>+int</div><div class='add'>+gf_event_reconfigure_threads(struct event_pool *event_pool, int value);</div><div class='add'>+int</div><div class='add'>+gf_event_pool_destroy(struct event_pool *event_pool);</div><div class='add'>+int</div><div class='add'>+gf_event_dispatch_destroy(struct event_pool *event_pool);</div><div class='add'>+int</div><div class='add'>+gf_event_handled(struct event_pool *event_pool, int fd, int idx, int gen);</div><div class='add'>+</div><div class='add'>+#endif /* _GF_EVENT_H_ */</div><div class='head'>diff --git a/libglusterfs/src/glusterfs/gidcache.h b/libglusterfs/src/glusterfs/gidcache.h<br/>new file mode 100644<br/>index 00000000000..ddaabd765b5<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/libglusterfs/src/glusterfs/gidcache.h?id=d1d7a6f35c816822fab51c820e25023863c239c1'>libglusterfs/src/glusterfs/gidcache.h</a></div><div class='hunk'>@@ -0,0 +1,60 @@</div><div class='add'>+/*</div><div class='add'>+  Copyright (c) 2008-2012 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#ifndef __GIDCACHE_H__</div><div class='add'>+#define __GIDCACHE_H__</div><div class='add'>+</div><div class='add'>+#include "glusterfs/glusterfs.h"</div><div class='add'>+#include "glusterfs/locking.h"</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+ * TBD: make the cache size tunable</div><div class='add'>+ *</div><div class='add'>+ * The current size represents a pretty trivial amount of memory, and should</div><div class='add'>+ * provide good hit rates even for quite busy systems.  If we ever want to</div><div class='add'>+ * support really large cache sizes, we'll need to do dynamic allocation</div><div class='add'>+ * instead of just defining an array within a private structure. It doesn't make</div><div class='add'>+ * a whole lot of sense to change the associativity, because it won't improve</div><div class='add'>+ * hit rates all that much and will increase the maintenance cost as we have</div><div class='add'>+ * to scan more entries with every lookup/update.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+#define AUX_GID_CACHE_ASSOC 4</div><div class='add'>+#define AUX_GID_CACHE_BUCKETS 256</div><div class='add'>+#define AUX_GID_CACHE_SIZE (AUX_GID_CACHE_ASSOC * AUX_GID_CACHE_BUCKETS)</div><div class='add'>+</div><div class='add'>+typedef struct {</div><div class='add'>+    uint64_t gl_id;</div><div class='add'>+    uint64_t gl_uid;</div><div class='add'>+    uint64_t gl_gid;</div><div class='add'>+    int gl_count;</div><div class='add'>+    gid_t *gl_list;</div><div class='add'>+    time_t gl_deadline;</div><div class='add'>+} gid_list_t;</div><div class='add'>+</div><div class='add'>+typedef struct {</div><div class='add'>+    gf_lock_t gc_lock;</div><div class='add'>+    uint32_t gc_max_age;</div><div class='add'>+    unsigned int gc_nbuckets;</div><div class='add'>+    gid_list_t gc_cache[AUX_GID_CACHE_SIZE];</div><div class='add'>+} gid_cache_t;</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+gid_cache_init(gid_cache_t *, uint32_t);</div><div class='add'>+int</div><div class='add'>+gid_cache_reconf(gid_cache_t *, uint32_t);</div><div class='add'>+const gid_list_t *</div><div class='add'>+gid_cache_lookup(gid_cache_t *, uint64_t, uint64_t, uint64_t);</div><div class='add'>+void</div><div class='add'>+gid_cache_release(gid_cache_t *, const gid_list_t *);</div><div class='add'>+int</div><div class='add'>+gid_cache_add(gid_cache_t *, gid_list_t *);</div><div class='add'>+</div><div class='add'>+#endif /* __GIDCACHE_H__ */</div><div class='head'>diff --git a/libglusterfs/src/glusterfs/glfs-message-id.h b/libglusterfs/src/glusterfs/glfs-message-id.h<br/>new file mode 100644<br/>index 00000000000..a1a16ca1efb<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/libglusterfs/src/glusterfs/glfs-message-id.h?id=d1d7a6f35c816822fab51c820e25023863c239c1'>libglusterfs/src/glusterfs/glfs-message-id.h</a></div><div class='hunk'>@@ -0,0 +1,102 @@</div><div class='add'>+/*</div><div class='add'>+  Copyright (c) 2015-2016 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#ifndef _GLFS_MESSAGE_ID_H_</div><div class='add'>+#define _GLFS_MESSAGE_ID_H_</div><div class='add'>+</div><div class='add'>+/* Base of all message IDs, all message IDs would be</div><div class='add'>+ * greater than this */</div><div class='add'>+#define GLFS_MSGID_BASE 100000</div><div class='add'>+</div><div class='add'>+/* Segment size of allocated range. Any component needing more than this</div><div class='add'>+ * segment size should take multiple segments (at times non contiguous,</div><div class='add'>+ * if extensions are being made post the next segment already allocated) */</div><div class='add'>+#define GLFS_MSGID_SEGMENT 1000</div><div class='add'>+</div><div class='add'>+/* Macro to define a range of messages for a component. The first argument is</div><div class='add'>+ * the name of the component. The second argument is the number of segments</div><div class='add'>+ * to allocate. The defined values will be GLFS_MSGID_COMP_&lt;name&gt; and</div><div class='add'>+ * GLFS_MSGID_COMP_&lt;name&gt;_END. */</div><div class='add'>+#define GLFS_MSGID_COMP(_name, _blocks)                                        \</div><div class='add'>+    GLFS_MSGID_COMP_##_name,                                                   \</div><div class='add'>+        GLFS_MSGID_COMP_##_name##_END = (GLFS_MSGID_COMP_##_name +             \</div><div class='add'>+                                         (GLFS_MSGID_SEGMENT * (_blocks)) - 1)</div><div class='add'>+</div><div class='add'>+#define GLFS_MSGID(_name, _msgs...)                                            \</div><div class='add'>+    enum _msgid_table_##_name                                                  \</div><div class='add'>+    {                                                                          \</div><div class='add'>+        GLFS_##_name##_COMP_BASE = GLFS_MSGID_COMP_##_name, ##_msgs,           \</div><div class='add'>+        GLGS_##_name##_COMP_END                                                \</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+/* Per module message segments allocated */</div><div class='add'>+/* NOTE: For any new module add to the end the modules */</div><div class='add'>+enum _msgid_comp {</div><div class='add'>+    GLFS_MSGID_RESERVED = GLFS_MSGID_BASE - 1,</div><div class='add'>+</div><div class='add'>+    GLFS_MSGID_COMP(GLUSTERFSD, 1),</div><div class='add'>+    GLFS_MSGID_COMP(LIBGLUSTERFS, 1),</div><div class='add'>+    GLFS_MSGID_COMP(RPC_LIB, 1),</div><div class='add'>+    GLFS_MSGID_COMP(RPC_TRANS_RDMA, 1),</div><div class='add'>+    GLFS_MSGID_COMP(API, 1),</div><div class='add'>+    GLFS_MSGID_COMP(CLI, 1),</div><div class='add'>+    /* glusterd has a lot of messages, taking 2 segments for the same */</div><div class='add'>+    GLFS_MSGID_COMP(GLUSTERD, 2),</div><div class='add'>+    GLFS_MSGID_COMP(AFR, 1),</div><div class='add'>+    GLFS_MSGID_COMP(DHT, 1),</div><div class='add'>+    /* there is no component called 'common', however reserving this segment</div><div class='add'>+     * for common actions/errors like dict_{get/set}, memory accounting*/</div><div class='add'>+    GLFS_MSGID_COMP(COMMON, 1),</div><div class='add'>+    GLFS_MSGID_COMP(UPCALL, 1),</div><div class='add'>+    GLFS_MSGID_COMP(NFS, 1),</div><div class='add'>+    GLFS_MSGID_COMP(POSIX, 1),</div><div class='add'>+    GLFS_MSGID_COMP(PC, 1),</div><div class='add'>+    GLFS_MSGID_COMP(PS, 1),</div><div class='add'>+    GLFS_MSGID_COMP(BITROT_STUB, 1),</div><div class='add'>+    GLFS_MSGID_COMP(CHANGELOG, 1),</div><div class='add'>+    GLFS_MSGID_COMP(BITROT_BITD, 1),</div><div class='add'>+    GLFS_MSGID_COMP(RPC_TRANS_SOCKET, 1),</div><div class='add'>+    GLFS_MSGID_COMP(QUOTA, 1),</div><div class='add'>+    GLFS_MSGID_COMP(CTR, 1),</div><div class='add'>+    GLFS_MSGID_COMP(EC, 1),</div><div class='add'>+    GLFS_MSGID_COMP(IO_CACHE, 1),</div><div class='add'>+    GLFS_MSGID_COMP(IO_THREADS, 1),</div><div class='add'>+    GLFS_MSGID_COMP(MD_CACHE, 1),</div><div class='add'>+    GLFS_MSGID_COMP(OPEN_BEHIND, 1),</div><div class='add'>+    GLFS_MSGID_COMP(QUICK_READ, 1),</div><div class='add'>+    GLFS_MSGID_COMP(READ_AHEAD, 1),</div><div class='add'>+    GLFS_MSGID_COMP(READDIR_AHEAD, 1),</div><div class='add'>+    GLFS_MSGID_COMP(SYMLINK_CACHE, 1),</div><div class='add'>+    GLFS_MSGID_COMP(WRITE_BEHIND, 1),</div><div class='add'>+    GLFS_MSGID_COMP(CHANGELOG_LIB, 1),</div><div class='add'>+    GLFS_MSGID_COMP(SHARD, 1),</div><div class='add'>+    GLFS_MSGID_COMP(JBR, 1),</div><div class='add'>+    GLFS_MSGID_COMP(PL, 1),</div><div class='add'>+    GLFS_MSGID_COMP(DC, 1),</div><div class='add'>+    GLFS_MSGID_COMP(LEASES, 1),</div><div class='add'>+    GLFS_MSGID_COMP(INDEX, 1),</div><div class='add'>+    GLFS_MSGID_COMP(POSIX_ACL, 1),</div><div class='add'>+    GLFS_MSGID_COMP(NLC, 1),</div><div class='add'>+    GLFS_MSGID_COMP(SL, 1),</div><div class='add'>+    GLFS_MSGID_COMP(HAM, 1),</div><div class='add'>+    GLFS_MSGID_COMP(SDFS, 1),</div><div class='add'>+    GLFS_MSGID_COMP(QUIESCE, 1),</div><div class='add'>+    GLFS_MSGID_COMP(TA, 1),</div><div class='add'>+    GLFS_MSGID_COMP(SNAPVIEW_CLIENT, 1),</div><div class='add'>+    GLFS_MSGID_COMP(TEMPLATE, 1),</div><div class='add'>+    GLFS_MSGID_COMP(UTIME, 1),</div><div class='add'>+    GLFS_MSGID_COMP(SNAPVIEW_SERVER, 1),</div><div class='add'>+    GLFS_MSGID_COMP(CVLT, 1),</div><div class='add'>+    /* --- new segments for messages goes above this line --- */</div><div class='add'>+</div><div class='add'>+    GLFS_MSGID_END</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+#endif /* !_GLFS_MESSAGE_ID_H_ */</div><div class='head'>diff --git a/libglusterfs/src/glusterfs/globals.h b/libglusterfs/src/glusterfs/globals.h<br/>new file mode 100644<br/>index 00000000000..b22eaae6c2f<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/libglusterfs/src/glusterfs/globals.h?id=d1d7a6f35c816822fab51c820e25023863c239c1'>libglusterfs/src/glusterfs/globals.h</a></div><div class='hunk'>@@ -0,0 +1,188 @@</div><div class='add'>+/*</div><div class='add'>+  Copyright (c) 2008-2012 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#ifndef _GLOBALS_H</div><div class='add'>+#define _GLOBALS_H</div><div class='add'>+</div><div class='add'>+#define GF_DEFAULT_BASE_PORT 24007</div><div class='add'>+#define GF_DEFAULT_VOLFILE_TRANSPORT "tcp"</div><div class='add'>+</div><div class='add'>+#define GF_GLOBAL_XLATOR_NAME "global"</div><div class='add'>+#define GD_OP_VERSION_KEY "operating-version"</div><div class='add'>+#define GD_MIN_OP_VERSION_KEY "minimum-operating-version"</div><div class='add'>+#define GD_MAX_OP_VERSION_KEY "maximum-operating-version"</div><div class='add'>+</div><div class='add'>+#define GF_PROTECT_FROM_EXTERNAL_WRITES "trusted.glusterfs.protect.writes"</div><div class='add'>+#define GF_AVOID_OVERWRITE "glusterfs.avoid.overwrite"</div><div class='add'>+#define GF_CLEAN_WRITE_PROTECTION "glusterfs.clean.writexattr"</div><div class='add'>+</div><div class='add'>+/* Gluster versions - OP-VERSION mapping</div><div class='add'>+ *</div><div class='add'>+ * 3.3.x                - 1</div><div class='add'>+ * 3.4.x                - 2</div><div class='add'>+ * 3.5.0                - 3</div><div class='add'>+ * 3.5.1                - 30501</div><div class='add'>+ * 3.6.0                - 30600</div><div class='add'>+ * 3.7.0                - 30700</div><div class='add'>+ * 3.7.1                - 30701</div><div class='add'>+ * 3.7.2                - 30702</div><div class='add'>+ *</div><div class='add'>+ * Starting with Gluster v3.6, the op-version will be multi-digit integer values</div><div class='add'>+ * based on the Glusterfs version, instead of a simply incrementing integer</div><div class='add'>+ * value. The op-version for a given X.Y.Z release will be an integer XYZ, with</div><div class='add'>+ * Y and Z 2 digit always 2 digits wide and padded with 0 when needed. This</div><div class='add'>+ * should allow for some gaps between two Y releases for backports of features</div><div class='add'>+ * in Z releases.</div><div class='add'>+ */</div><div class='add'>+#define GD_OP_VERSION_MIN                                                      \</div><div class='add'>+    1 /* MIN is the fresh start op-version, mostly                             \</div><div class='add'>+         should not change */</div><div class='add'>+#define GD_OP_VERSION_MAX                                                      \</div><div class='add'>+    GD_OP_VERSION_9_0 /* MAX VERSION is the maximum                            \</div><div class='add'>+                         count in VME table, should                            \</div><div class='add'>+                         keep changing with                                    \</div><div class='add'>+                         introduction of newer                                 \</div><div class='add'>+                         versions */</div><div class='add'>+</div><div class='add'>+#define GD_OP_VERSION_3_6_0 30600 /* Op-Version for GlusterFS 3.6.0 */</div><div class='add'>+</div><div class='add'>+#define GD_OP_VERSION_3_7_0 30700 /* Op-version for GlusterFS 3.7.0 */</div><div class='add'>+</div><div class='add'>+#define GD_OP_VERSION_3_7_1 30701 /* Op-version for GlusterFS 3.7.1 */</div><div class='add'>+</div><div class='add'>+#define GD_OP_VERSION_3_7_2 30702 /* Op-version for GlusterFS 3.7.2 */</div><div class='add'>+</div><div class='add'>+#define GD_OP_VERSION_3_7_3 30703 /* Op-version for GlusterFS 3.7.3 */</div><div class='add'>+</div><div class='add'>+#define GD_OP_VERSION_3_7_4 30704 /* Op-version for GlusterFS 3.7.4 */</div><div class='add'>+</div><div class='add'>+#define GD_OP_VERSION_3_7_5 30705 /* Op-version for GlusterFS 3.7.5 */</div><div class='add'>+</div><div class='add'>+#define GD_OP_VERSION_3_7_6 30706 /* Op-version for GlusterFS 3.7.6 */</div><div class='add'>+</div><div class='add'>+#define GD_OP_VERSION_3_7_7 30707 /* Op-version for GlusterFS 3.7.7 */</div><div class='add'>+</div><div class='add'>+#define GD_OP_VERSION_3_7_10 30710 /* Op-version for GlusterFS 3.7.10 */</div><div class='add'>+</div><div class='add'>+#define GD_OP_VERSION_3_7_12 30712 /* Op-version for GlusterFS 3.7.12 */</div><div class='add'>+</div><div class='add'>+#define GD_OP_VERSION_3_8_0 30800 /* Op-version for GlusterFS 3.8.0 */</div><div class='add'>+</div><div class='add'>+#define GD_OP_VERSION_3_8_3 30803 /* Op-version for GlusterFS 3.8.3 */</div><div class='add'>+</div><div class='add'>+#define GD_OP_VERSION_3_8_4 30804 /* Op-version for GlusterFS 3.8.4 */</div><div class='add'>+</div><div class='add'>+#define GD_OP_VERSION_3_9_0 30900 /* Op-version for GlusterFS 3.9.0 */</div><div class='add'>+</div><div class='add'>+#define GD_OP_VERSION_3_9_1 30901 /* Op-version for GlusterFS 3.9.1 */</div><div class='add'>+</div><div class='add'>+#define GD_OP_VERSION_3_10_0 31000 /* Op-version for GlusterFS 3.10.0 */</div><div class='add'>+</div><div class='add'>+#define GD_OP_VERSION_3_10_1 31001 /* Op-version for GlusterFS 3.10.1 */</div><div class='add'>+</div><div class='add'>+#define GD_OP_VERSION_3_10_2 31002 /* Op-version for GlusterFS 3.10.2 */</div><div class='add'>+</div><div class='add'>+#define GD_OP_VERSION_3_11_0 31100 /* Op-version for GlusterFS 3.11.0 */</div><div class='add'>+</div><div class='add'>+#define GD_OP_VERSION_3_11_1 31101 /* Op-version for GlusterFS 3.11.1 */</div><div class='add'>+</div><div class='add'>+#define GD_OP_VERSION_3_12_0 31200 /* Op-version for GlusterFS 3.12.0 */</div><div class='add'>+</div><div class='add'>+#define GD_OP_VERSION_3_12_2 31202 /* Op-version for GlusterFS 3.12.2 */</div><div class='add'>+</div><div class='add'>+#define GD_OP_VERSION_3_12_3 31203 /* Op-version for GlusterFS 3.12.3 */</div><div class='add'>+</div><div class='add'>+#define GD_OP_VERSION_3_13_0 31300 /* Op-version for GlusterFS 3.13.0 */</div><div class='add'>+</div><div class='add'>+#define GD_OP_VERSION_3_13_1 31301 /* Op-version for GlusterFS 3.13.1 */</div><div class='add'>+</div><div class='add'>+#define GD_OP_VERSION_3_13_2 31302 /* Op-version for GlusterFS 3.13.2 */</div><div class='add'>+</div><div class='add'>+#define GD_OP_VERSION_4_0_0 40000 /* Op-version for GlusterFS 4.0.0 */</div><div class='add'>+</div><div class='add'>+#define GD_OP_VERSION_4_1_0 40100 /* Op-version for GlusterFS 4.1.0 */</div><div class='add'>+</div><div class='add'>+#define GD_OP_VERSION_5_0 50000 /* Op-version for GlusterFS 5.0 */</div><div class='add'>+</div><div class='add'>+#define GD_OP_VERSION_5_4 50400 /* Op-version for GlusterFS 5.4 */</div><div class='add'>+</div><div class='add'>+#define GD_OP_VERSION_6_0 60000 /* Op-version for GlusterFS 6.0 */</div><div class='add'>+</div><div class='add'>+#define GD_OP_VERSION_7_0 70000 /* Op-version for GlusterFS 7.0 */</div><div class='add'>+#define GD_OP_VERSION_7_1 70100 /* Op-version for GlusterFS 7.1 */</div><div class='add'>+#define GD_OP_VERSION_7_2 70200 /* Op-version for GlusterFS 7.2 */</div><div class='add'>+#define GD_OP_VERSION_7_3 70300 /* Op-version for GlusterFS 7.3 */</div><div class='add'>+</div><div class='add'>+#define GD_OP_VERSION_8_0 80000 /* Op-version for GlusterFS 8.0 */</div><div class='add'>+</div><div class='add'>+#define GD_OP_VERSION_9_0 90000 /* Op-version for GlusterFS 9.0 */</div><div class='add'>+</div><div class='add'>+#define GD_OP_VER_PERSISTENT_AFR_XATTRS GD_OP_VERSION_3_6_0</div><div class='add'>+</div><div class='add'>+#include "glusterfs/xlator.h"</div><div class='add'>+#include "glusterfs/options.h"</div><div class='add'>+</div><div class='add'>+/* THIS */</div><div class='add'>+#define THIS (*__glusterfs_this_location())</div><div class='add'>+#define DECLARE_OLD_THIS xlator_t *old_THIS = THIS</div><div class='add'>+</div><div class='add'>+xlator_t **</div><div class='add'>+__glusterfs_this_location(void);</div><div class='add'>+xlator_t *</div><div class='add'>+glusterfs_this_get(void);</div><div class='add'>+void</div><div class='add'>+glusterfs_this_set(xlator_t *);</div><div class='add'>+</div><div class='add'>+extern xlator_t global_xlator;</div><div class='add'>+extern struct volume_options global_xl_options[];</div><div class='add'>+</div><div class='add'>+/* syncopctx */</div><div class='add'>+void *</div><div class='add'>+syncopctx_getctx(void);</div><div class='add'>+</div><div class='add'>+/* task */</div><div class='add'>+void *</div><div class='add'>+synctask_get(void);</div><div class='add'>+void</div><div class='add'>+synctask_set(void *);</div><div class='add'>+</div><div class='add'>+/* uuid_buf */</div><div class='add'>+char *</div><div class='add'>+glusterfs_uuid_buf_get(void);</div><div class='add'>+/* lkowner_buf */</div><div class='add'>+char *</div><div class='add'>+glusterfs_lkowner_buf_get(void);</div><div class='add'>+/* leaseid buf */</div><div class='add'>+char *</div><div class='add'>+glusterfs_leaseid_buf_get(void);</div><div class='add'>+char *</div><div class='add'>+glusterfs_leaseid_exist(void);</div><div class='add'>+</div><div class='add'>+/* init */</div><div class='add'>+int</div><div class='add'>+glusterfs_globals_init(glusterfs_ctx_t *ctx);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+gf_thread_needs_cleanup(void);</div><div class='add'>+</div><div class='add'>+struct tvec_base *</div><div class='add'>+glusterfs_ctx_tw_get(glusterfs_ctx_t *ctx);</div><div class='add'>+void</div><div class='add'>+glusterfs_ctx_tw_put(glusterfs_ctx_t *ctx);</div><div class='add'>+</div><div class='add'>+extern const char *gf_fop_list[];</div><div class='add'>+extern const char *gf_upcall_list[];</div><div class='add'>+</div><div class='add'>+/* mem acct enable/disable */</div><div class='add'>+int</div><div class='add'>+gf_global_mem_acct_enable_get(void);</div><div class='add'>+int</div><div class='add'>+gf_global_mem_acct_enable_set(int val);</div><div class='add'>+#endif /* !_GLOBALS_H */</div><div class='head'>diff --git a/libglusterfs/src/glusterfs/glusterfs-acl.h b/libglusterfs/src/glusterfs/glusterfs-acl.h<br/>new file mode 100644<br/>index 00000000000..987bf5fab0b<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/libglusterfs/src/glusterfs/glusterfs-acl.h?id=d1d7a6f35c816822fab51c820e25023863c239c1'>libglusterfs/src/glusterfs/glusterfs-acl.h</a></div><div class='hunk'>@@ -0,0 +1,162 @@</div><div class='add'>+/*</div><div class='add'>+  Copyright (c) 2013 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#ifndef _GLUSTERFS_ACL_H</div><div class='add'>+#define _GLUSTERFS_ACL_H</div><div class='add'>+</div><div class='add'>+/* WARNING: Much if this code is restricted to Linux usage.</div><div class='add'>+ *</div><div class='add'>+ * It would be much cleaner to replace the code with something that is based on</div><div class='add'>+ * libacl (or its libc implementation on *BSD).</div><div class='add'>+ *</div><div class='add'>+ * Initial work for replacing this Linux specific implementation has been</div><div class='add'>+ * started as part of the "Improve POSIX ACLs" feature. Functionality for this</div><div class='add'>+ * feature has been added to the end of this file.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+#include &lt;stdint.h&gt;</div><div class='add'>+#include &lt;sys/types.h&gt; /* For uid_t */</div><div class='add'>+</div><div class='add'>+#include "glusterfs/locking.h" /* For gf_lock_t in struct posix_acl_conf */</div><div class='add'>+</div><div class='add'>+#define ACL_PROGRAM 100227</div><div class='add'>+#define ACLV3_VERSION 3</div><div class='add'>+</div><div class='add'>+#define POSIX_ACL_MINIMAL_ACE_COUNT 3</div><div class='add'>+</div><div class='add'>+#define POSIX_ACL_READ (0x04)</div><div class='add'>+#define POSIX_ACL_WRITE (0x02)</div><div class='add'>+#define POSIX_ACL_EXECUTE (0x01)</div><div class='add'>+</div><div class='add'>+#define POSIX_ACL_UNDEFINED_TAG (0x00)</div><div class='add'>+#define POSIX_ACL_USER_OBJ (0x01)</div><div class='add'>+#define POSIX_ACL_USER (0x02)</div><div class='add'>+#define POSIX_ACL_GROUP_OBJ (0x04)</div><div class='add'>+#define POSIX_ACL_GROUP (0x08)</div><div class='add'>+#define POSIX_ACL_MASK (0x10)</div><div class='add'>+#define POSIX_ACL_OTHER (0x20)</div><div class='add'>+</div><div class='add'>+#define POSIX_ACL_UNDEFINED_ID (-1)</div><div class='add'>+</div><div class='add'>+#define POSIX_ACL_XATTR_VERSION (0x02)</div><div class='add'>+</div><div class='add'>+#define POSIX_ACL_ACCESS_XATTR "system.posix_acl_access"</div><div class='add'>+#define POSIX_ACL_DEFAULT_XATTR "system.posix_acl_default"</div><div class='add'>+</div><div class='add'>+struct posix_acl_xattr_entry {</div><div class='add'>+    uint16_t tag;</div><div class='add'>+    uint16_t perm;</div><div class='add'>+    uint32_t id;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct posix_acl_xattr_header {</div><div class='add'>+    uint32_t version;</div><div class='add'>+    struct posix_acl_xattr_entry entries[];</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+typedef struct posix_acl_xattr_entry posix_acl_xattr_entry;</div><div class='add'>+typedef struct posix_acl_xattr_header posix_acl_xattr_header;</div><div class='add'>+</div><div class='add'>+static inline size_t</div><div class='add'>+posix_acl_xattr_size(unsigned int count)</div><div class='add'>+{</div><div class='add'>+    return (sizeof(posix_acl_xattr_header) +</div><div class='add'>+            (count * sizeof(posix_acl_xattr_entry)));</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static inline ssize_t</div><div class='add'>+posix_acl_xattr_count(size_t size)</div><div class='add'>+{</div><div class='add'>+    if (size &lt; sizeof(posix_acl_xattr_header))</div><div class='add'>+        return (-1);</div><div class='add'>+    size -= sizeof(posix_acl_xattr_header);</div><div class='add'>+    if (size % sizeof(posix_acl_xattr_entry))</div><div class='add'>+        return (-1);</div><div class='add'>+    return (size / sizeof(posix_acl_xattr_entry));</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+struct posix_ace {</div><div class='add'>+    uint16_t tag;</div><div class='add'>+    uint16_t perm;</div><div class='add'>+    uint32_t id;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct posix_acl {</div><div class='add'>+    int refcnt;</div><div class='add'>+    int count;</div><div class='add'>+    struct posix_ace entries[];</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct posix_acl_ctx {</div><div class='add'>+    uid_t uid;</div><div class='add'>+    gid_t gid;</div><div class='add'>+    mode_t perm;</div><div class='add'>+    glusterfs_fop_t fop;</div><div class='add'>+    struct posix_acl *acl_access;</div><div class='add'>+    struct posix_acl *acl_default;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct posix_acl_conf {</div><div class='add'>+    gf_lock_t acl_lock;</div><div class='add'>+    uid_t super_uid;</div><div class='add'>+    struct posix_acl *minimal_acl;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+/* Above this comment, the legacy POSIX ACL support is kept until it is not</div><div class='add'>+ * used anymore. Below you will find the more portable version to support POSIX</div><div class='add'>+ * ACls based on the implementation of libacl (see sys/acl.h). */</div><div class='add'>+</div><div class='add'>+/* virtual xattrs passed over RPC, not stored on disk */</div><div class='add'>+#define GF_POSIX_ACL_ACCESS "glusterfs.posix.acl"</div><div class='add'>+#define GF_POSIX_ACL_DEFAULT "glusterfs.posix.default_acl"</div><div class='add'>+#define GF_POSIX_ACL_REQUEST(key)                                              \</div><div class='add'>+    (!strncmp(key, GF_POSIX_ACL_ACCESS, SLEN(GF_POSIX_ACL_ACCESS)) ||          \</div><div class='add'>+     !strncmp(key, GF_POSIX_ACL_DEFAULT, SLEN(GF_POSIX_ACL_DEFAULT)))</div><div class='add'>+</div><div class='add'>+#ifdef HAVE_SYS_ACL_H /* only NetBSD does not support POSIX ACLs */</div><div class='add'>+</div><div class='add'>+#include &lt;sys/acl.h&gt;</div><div class='add'>+</div><div class='add'>+static inline const char *</div><div class='add'>+gf_posix_acl_get_key(const acl_type_t type)</div><div class='add'>+{</div><div class='add'>+    char *acl_key = NULL;</div><div class='add'>+</div><div class='add'>+    switch (type) {</div><div class='add'>+        case ACL_TYPE_ACCESS:</div><div class='add'>+            acl_key = GF_POSIX_ACL_ACCESS;</div><div class='add'>+            break;</div><div class='add'>+        case ACL_TYPE_DEFAULT:</div><div class='add'>+            acl_key = GF_POSIX_ACL_DEFAULT;</div><div class='add'>+            break;</div><div class='add'>+        default:</div><div class='add'>+            errno = EINVAL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return acl_key;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static inline acl_type_t</div><div class='add'>+gf_posix_acl_get_type(const char *key)</div><div class='add'>+{</div><div class='add'>+    acl_type_t type = 0;</div><div class='add'>+</div><div class='add'>+    if (!strncmp(key, GF_POSIX_ACL_ACCESS, SLEN(GF_POSIX_ACL_ACCESS)))</div><div class='add'>+        type = ACL_TYPE_ACCESS;</div><div class='add'>+    else if (!strncmp(key, GF_POSIX_ACL_DEFAULT, SLEN(GF_POSIX_ACL_DEFAULT)))</div><div class='add'>+        type = ACL_TYPE_DEFAULT;</div><div class='add'>+    else</div><div class='add'>+        errno = EINVAL;</div><div class='add'>+</div><div class='add'>+    return type;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#endif /* HAVE_SYS_ACL_H */</div><div class='add'>+#endif /* _GLUSTERFS_ACL_H */</div><div class='head'>diff --git a/libglusterfs/src/glusterfs/glusterfs-fops.h b/libglusterfs/src/glusterfs/glusterfs-fops.h<br/>new file mode 100644<br/>index 00000000000..030b2701608<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/libglusterfs/src/glusterfs/glusterfs-fops.h?id=d1d7a6f35c816822fab51c820e25023863c239c1'>libglusterfs/src/glusterfs/glusterfs-fops.h</a></div><div class='hunk'>@@ -0,0 +1,241 @@</div><div class='add'>+/*</div><div class='add'>+  Copyright (c) 2008-2019 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#ifndef _GLUSTERFS_FOPS_H_</div><div class='add'>+#define _GLUSTERFS_FOPS_H_</div><div class='add'>+</div><div class='add'>+#include &lt;glusterfs/compat.h&gt;</div><div class='add'>+</div><div class='add'>+enum glusterfs_fop_t {</div><div class='add'>+    GF_FOP_NULL = 0,</div><div class='add'>+    GF_FOP_STAT = 0 + 1,</div><div class='add'>+    GF_FOP_READLINK = 0 + 2,</div><div class='add'>+    GF_FOP_MKNOD = 0 + 3,</div><div class='add'>+    GF_FOP_MKDIR = 0 + 4,</div><div class='add'>+    GF_FOP_UNLINK = 0 + 5,</div><div class='add'>+    GF_FOP_RMDIR = 0 + 6,</div><div class='add'>+    GF_FOP_SYMLINK = 0 + 7,</div><div class='add'>+    GF_FOP_RENAME = 0 + 8,</div><div class='add'>+    GF_FOP_LINK = 0 + 9,</div><div class='add'>+    GF_FOP_TRUNCATE = 0 + 10,</div><div class='add'>+    GF_FOP_OPEN = 0 + 11,</div><div class='add'>+    GF_FOP_READ = 0 + 12,</div><div class='add'>+    GF_FOP_WRITE = 0 + 13,</div><div class='add'>+    GF_FOP_STATFS = 0 + 14,</div><div class='add'>+    GF_FOP_FLUSH = 0 + 15,</div><div class='add'>+    GF_FOP_FSYNC = 0 + 16,</div><div class='add'>+    GF_FOP_SETXATTR = 0 + 17,</div><div class='add'>+    GF_FOP_GETXATTR = 0 + 18,</div><div class='add'>+    GF_FOP_REMOVEXATTR = 0 + 19,</div><div class='add'>+    GF_FOP_OPENDIR = 0 + 20,</div><div class='add'>+    GF_FOP_FSYNCDIR = 0 + 21,</div><div class='add'>+    GF_FOP_ACCESS = 0 + 22,</div><div class='add'>+    GF_FOP_CREATE = 0 + 23,</div><div class='add'>+    GF_FOP_FTRUNCATE = 0 + 24,</div><div class='add'>+    GF_FOP_FSTAT = 0 + 25,</div><div class='add'>+    GF_FOP_LK = 0 + 26,</div><div class='add'>+    GF_FOP_LOOKUP = 0 + 27,</div><div class='add'>+    GF_FOP_READDIR = 0 + 28,</div><div class='add'>+    GF_FOP_INODELK = 0 + 29,</div><div class='add'>+    GF_FOP_FINODELK = 0 + 30,</div><div class='add'>+    GF_FOP_ENTRYLK = 0 + 31,</div><div class='add'>+    GF_FOP_FENTRYLK = 0 + 32,</div><div class='add'>+    GF_FOP_XATTROP = 0 + 33,</div><div class='add'>+    GF_FOP_FXATTROP = 0 + 34,</div><div class='add'>+    GF_FOP_FGETXATTR = 0 + 35,</div><div class='add'>+    GF_FOP_FSETXATTR = 0 + 36,</div><div class='add'>+    GF_FOP_RCHECKSUM = 0 + 37,</div><div class='add'>+    GF_FOP_SETATTR = 0 + 38,</div><div class='add'>+    GF_FOP_FSETATTR = 0 + 39,</div><div class='add'>+    GF_FOP_READDIRP = 0 + 40,</div><div class='add'>+    GF_FOP_FORGET = 0 + 41,</div><div class='add'>+    GF_FOP_RELEASE = 0 + 42,</div><div class='add'>+    GF_FOP_RELEASEDIR = 0 + 43,</div><div class='add'>+    GF_FOP_GETSPEC = 0 + 44,</div><div class='add'>+    GF_FOP_FREMOVEXATTR = 0 + 45,</div><div class='add'>+    GF_FOP_FALLOCATE = 0 + 46,</div><div class='add'>+    GF_FOP_DISCARD = 0 + 47,</div><div class='add'>+    GF_FOP_ZEROFILL = 0 + 48,</div><div class='add'>+    GF_FOP_IPC = 0 + 49,</div><div class='add'>+    GF_FOP_SEEK = 0 + 50,</div><div class='add'>+    GF_FOP_LEASE = 0 + 51,</div><div class='add'>+    GF_FOP_COMPOUND = 0 + 52,</div><div class='add'>+    GF_FOP_GETACTIVELK = 0 + 53,</div><div class='add'>+    GF_FOP_SETACTIVELK = 0 + 54,</div><div class='add'>+    GF_FOP_PUT = 0 + 55,</div><div class='add'>+    GF_FOP_ICREATE = 0 + 56,</div><div class='add'>+    GF_FOP_NAMELINK = 0 + 57,</div><div class='add'>+    GF_FOP_COPY_FILE_RANGE = 0 + 58,</div><div class='add'>+    GF_FOP_MAXVALUE = 0 + 59,</div><div class='add'>+};</div><div class='add'>+typedef enum glusterfs_fop_t glusterfs_fop_t;</div><div class='add'>+</div><div class='add'>+enum glusterfs_event_t {</div><div class='add'>+    GF_EVENT_PARENT_UP = 1,</div><div class='add'>+    GF_EVENT_POLLIN = 1 + 1,</div><div class='add'>+    GF_EVENT_POLLOUT = 1 + 2,</div><div class='add'>+    GF_EVENT_POLLERR = 1 + 3,</div><div class='add'>+    GF_EVENT_CHILD_UP = 1 + 4,</div><div class='add'>+    GF_EVENT_CHILD_DOWN = 1 + 5,</div><div class='add'>+    GF_EVENT_CHILD_CONNECTING = 1 + 6,</div><div class='add'>+    GF_EVENT_CLEANUP = 9,</div><div class='add'>+    GF_EVENT_TRANSPORT_CONNECTED = 9 + 1,</div><div class='add'>+    GF_EVENT_VOLFILE_MODIFIED = 9 + 2,</div><div class='add'>+    GF_EVENT_GRAPH_NEW = 9 + 3,</div><div class='add'>+    GF_EVENT_TRANSLATOR_INFO = 9 + 4,</div><div class='add'>+    GF_EVENT_TRANSLATOR_OP = 9 + 5,</div><div class='add'>+    GF_EVENT_AUTH_FAILED = 9 + 6,</div><div class='add'>+    GF_EVENT_VOLUME_DEFRAG = 9 + 7,</div><div class='add'>+    GF_EVENT_PARENT_DOWN = 9 + 8,</div><div class='add'>+    GF_EVENT_VOLUME_BARRIER_OP = 9 + 9,</div><div class='add'>+    GF_EVENT_UPCALL = 9 + 10,</div><div class='add'>+    GF_EVENT_SCRUB_STATUS = 9 + 11,</div><div class='add'>+    GF_EVENT_SOME_DESCENDENT_DOWN = 9 + 12,</div><div class='add'>+    GF_EVENT_SCRUB_ONDEMAND = 9 + 13,</div><div class='add'>+    GF_EVENT_SOME_DESCENDENT_UP = 9 + 14,</div><div class='add'>+    GF_EVENT_CHILD_PING = 9 + 15,</div><div class='add'>+    GF_EVENT_MAXVAL = 9 + 16,</div><div class='add'>+};</div><div class='add'>+typedef enum glusterfs_event_t glusterfs_event_t;</div><div class='add'>+</div><div class='add'>+enum gf_op_type_t {</div><div class='add'>+    GF_OP_TYPE_NULL = 0,</div><div class='add'>+    GF_OP_TYPE_FOP = 0 + 1,</div><div class='add'>+    GF_OP_TYPE_MGMT = 0 + 2,</div><div class='add'>+    GF_OP_TYPE_MAX = 0 + 3,</div><div class='add'>+};</div><div class='add'>+typedef enum gf_op_type_t gf_op_type_t;</div><div class='add'>+</div><div class='add'>+enum glusterfs_lk_cmds_t {</div><div class='add'>+    GF_LK_GETLK = 0,</div><div class='add'>+    GF_LK_SETLK = 0 + 1,</div><div class='add'>+    GF_LK_SETLKW = 0 + 2,</div><div class='add'>+    GF_LK_RESLK_LCK = 0 + 3,</div><div class='add'>+    GF_LK_RESLK_LCKW = 0 + 4,</div><div class='add'>+    GF_LK_RESLK_UNLCK = 0 + 5,</div><div class='add'>+    GF_LK_GETLK_FD = 0 + 6,</div><div class='add'>+};</div><div class='add'>+typedef enum glusterfs_lk_cmds_t glusterfs_lk_cmds_t;</div><div class='add'>+</div><div class='add'>+enum glusterfs_lk_types_t {</div><div class='add'>+    GF_LK_F_RDLCK = 0,</div><div class='add'>+    GF_LK_F_WRLCK = 0 + 1,</div><div class='add'>+    GF_LK_F_UNLCK = 0 + 2,</div><div class='add'>+    GF_LK_EOL = 0 + 3,</div><div class='add'>+};</div><div class='add'>+typedef enum glusterfs_lk_types_t glusterfs_lk_types_t;</div><div class='add'>+</div><div class='add'>+enum gf_lease_types_t {</div><div class='add'>+    NONE = 0,</div><div class='add'>+    GF_RD_LEASE = 1,</div><div class='add'>+    GF_RW_LEASE = 2,</div><div class='add'>+    GF_LEASE_MAX_TYPE = 2 + 1,</div><div class='add'>+};</div><div class='add'>+typedef enum gf_lease_types_t gf_lease_types_t;</div><div class='add'>+</div><div class='add'>+enum gf_lease_cmds_t {</div><div class='add'>+    GF_GET_LEASE = 1,</div><div class='add'>+    GF_SET_LEASE = 2,</div><div class='add'>+    GF_UNLK_LEASE = 3,</div><div class='add'>+};</div><div class='add'>+typedef enum gf_lease_cmds_t gf_lease_cmds_t;</div><div class='add'>+</div><div class='add'>+#define LEASE_ID_SIZE 16 /* 128bits */</div><div class='add'>+</div><div class='add'>+struct gf_lease {</div><div class='add'>+    gf_lease_cmds_t cmd;</div><div class='add'>+    gf_lease_types_t lease_type;</div><div class='add'>+    char lease_id[LEASE_ID_SIZE];</div><div class='add'>+    u_int lease_flags;</div><div class='add'>+};</div><div class='add'>+typedef struct gf_lease gf_lease;</div><div class='add'>+</div><div class='add'>+enum glusterfs_lk_recovery_cmds_t {</div><div class='add'>+    F_RESLK_LCK = 200,</div><div class='add'>+    F_RESLK_LCKW = 200 + 1,</div><div class='add'>+    F_RESLK_UNLCK = 200 + 2,</div><div class='add'>+    F_GETLK_FD = 200 + 3,</div><div class='add'>+};</div><div class='add'>+typedef enum glusterfs_lk_recovery_cmds_t glusterfs_lk_recovery_cmds_t;</div><div class='add'>+</div><div class='add'>+enum gf_lk_domain_t {</div><div class='add'>+    GF_LOCK_POSIX = 0,</div><div class='add'>+    GF_LOCK_INTERNAL = 1,</div><div class='add'>+};</div><div class='add'>+typedef enum gf_lk_domain_t gf_lk_domain_t;</div><div class='add'>+</div><div class='add'>+enum entrylk_cmd {</div><div class='add'>+    ENTRYLK_LOCK = 0,</div><div class='add'>+    ENTRYLK_UNLOCK = 1,</div><div class='add'>+    ENTRYLK_LOCK_NB = 2,</div><div class='add'>+};</div><div class='add'>+typedef enum entrylk_cmd entrylk_cmd;</div><div class='add'>+</div><div class='add'>+enum entrylk_type {</div><div class='add'>+    ENTRYLK_RDLCK = 0,</div><div class='add'>+    ENTRYLK_WRLCK = 1,</div><div class='add'>+};</div><div class='add'>+typedef enum entrylk_type entrylk_type;</div><div class='add'>+#define GF_MAX_LOCK_OWNER_LEN 1024 /* 1kB as per NLM */</div><div class='add'>+#define GF_LKOWNER_BUF_SIZE                                                    \</div><div class='add'>+    ((GF_MAX_LOCK_OWNER_LEN * 2) + (GF_MAX_LOCK_OWNER_LEN / 8))</div><div class='add'>+</div><div class='add'>+struct gf_lkowner_t {</div><div class='add'>+    int len;</div><div class='add'>+    char data[GF_MAX_LOCK_OWNER_LEN];</div><div class='add'>+};</div><div class='add'>+typedef struct gf_lkowner_t gf_lkowner_t;</div><div class='add'>+</div><div class='add'>+enum gf_xattrop_flags_t {</div><div class='add'>+    GF_XATTROP_ADD_ARRAY = 0,</div><div class='add'>+    GF_XATTROP_ADD_ARRAY64 = 1,</div><div class='add'>+    GF_XATTROP_OR_ARRAY = 2,</div><div class='add'>+    GF_XATTROP_AND_ARRAY = 3,</div><div class='add'>+    GF_XATTROP_GET_AND_SET = 4,</div><div class='add'>+    GF_XATTROP_ADD_ARRAY_WITH_DEFAULT = 5,</div><div class='add'>+    GF_XATTROP_ADD_ARRAY64_WITH_DEFAULT = 6,</div><div class='add'>+};</div><div class='add'>+typedef enum gf_xattrop_flags_t gf_xattrop_flags_t;</div><div class='add'>+</div><div class='add'>+enum gf_seek_what_t {</div><div class='add'>+    GF_SEEK_DATA = 0,</div><div class='add'>+    GF_SEEK_HOLE = 1,</div><div class='add'>+};</div><div class='add'>+typedef enum gf_seek_what_t gf_seek_what_t;</div><div class='add'>+</div><div class='add'>+enum gf_upcall_flags_t {</div><div class='add'>+    GF_UPCALL_NULL = 0,</div><div class='add'>+    GF_UPCALL = 1,</div><div class='add'>+    GF_UPCALL_CI_STAT = 2,</div><div class='add'>+    GF_UPCALL_CI_XATTR = 3,</div><div class='add'>+    GF_UPCALL_CI_RENAME = 4,</div><div class='add'>+    GF_UPCALL_CI_NLINK = 5,</div><div class='add'>+    GF_UPCALL_CI_FORGET = 6,</div><div class='add'>+    GF_UPCALL_LEASE_RECALL = 7,</div><div class='add'>+    GF_UPCALL_FLAGS_MAXVALUE = 8,</div><div class='add'>+};</div><div class='add'>+typedef enum gf_upcall_flags_t gf_upcall_flags_t;</div><div class='add'>+</div><div class='add'>+enum gf_dict_data_type_t {</div><div class='add'>+    GF_DATA_TYPE_UNKNOWN = 0,</div><div class='add'>+    GF_DATA_TYPE_STR_OLD = 1,</div><div class='add'>+    GF_DATA_TYPE_INT = 2,</div><div class='add'>+    GF_DATA_TYPE_UINT = 3,</div><div class='add'>+    GF_DATA_TYPE_DOUBLE = 4,</div><div class='add'>+    GF_DATA_TYPE_STR = 5,</div><div class='add'>+    GF_DATA_TYPE_PTR = 6,</div><div class='add'>+    GF_DATA_TYPE_GFUUID = 7,</div><div class='add'>+    GF_DATA_TYPE_IATT = 8,</div><div class='add'>+    GF_DATA_TYPE_MDATA = 9,</div><div class='add'>+    GF_DATA_TYPE_MAX = 10,</div><div class='add'>+};</div><div class='add'>+typedef enum gf_dict_data_type_t gf_dict_data_type_t;</div><div class='add'>+</div><div class='add'>+#endif /* !_GLUSTERFS_FOPS_H */</div><div class='head'>diff --git a/libglusterfs/src/glusterfs/glusterfs.h b/libglusterfs/src/glusterfs/glusterfs.h<br/>new file mode 100644<br/>index 00000000000..e6425618b7f<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/libglusterfs/src/glusterfs/glusterfs.h?id=d1d7a6f35c816822fab51c820e25023863c239c1'>libglusterfs/src/glusterfs/glusterfs.h</a></div><div class='hunk'>@@ -0,0 +1,838 @@</div><div class='add'>+/*</div><div class='add'>+  Copyright (c) 2008-2016 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#ifndef _GLUSTERFS_H</div><div class='add'>+#define _GLUSTERFS_H</div><div class='add'>+</div><div class='add'>+#include &lt;stdio.h&gt;</div><div class='add'>+#include &lt;string.h&gt;</div><div class='add'>+#include &lt;stdlib.h&gt;</div><div class='add'>+#include &lt;stdbool.h&gt;</div><div class='add'>+#include &lt;netinet/in.h&gt;</div><div class='add'>+#include &lt;sys/socket.h&gt;</div><div class='add'>+#include &lt;sys/types.h&gt;</div><div class='add'>+#include &lt;sys/stat.h&gt;</div><div class='add'>+#include &lt;sys/statvfs.h&gt;</div><div class='add'>+#include &lt;netdb.h&gt;</div><div class='add'>+#include &lt;errno.h&gt;</div><div class='add'>+#include &lt;dirent.h&gt;</div><div class='add'>+#include &lt;unistd.h&gt;</div><div class='add'>+#include &lt;fcntl.h&gt;</div><div class='add'>+#include &lt;arpa/inet.h&gt;</div><div class='add'>+#include &lt;sys/poll.h&gt;</div><div class='add'>+#include &lt;pthread.h&gt;</div><div class='add'>+#include &lt;limits.h&gt; /* For PATH_MAX */</div><div class='add'>+#include &lt;openssl/sha.h&gt;</div><div class='add'>+</div><div class='add'>+#include "glusterfs/glusterfs-fops.h"</div><div class='add'>+#include "glusterfs/list.h"</div><div class='add'>+#include "glusterfs/locking.h"</div><div class='add'>+#include "glusterfs/logging.h"</div><div class='add'>+#include "glusterfs/lkowner.h"</div><div class='add'>+#include "glusterfs/compat-uuid.h"</div><div class='add'>+#include "glusterfs/refcount.h"</div><div class='add'>+#include "glusterfs/atomic.h"</div><div class='add'>+</div><div class='add'>+#define GF_YES 1</div><div class='add'>+#define GF_NO 0</div><div class='add'>+</div><div class='add'>+#define IS_ERROR(ret) ((ret) &lt; 0)</div><div class='add'>+#define IS_SUCCESS(ret) ((ret) &gt;= 0)</div><div class='add'>+</div><div class='add'>+#ifndef O_LARGEFILE</div><div class='add'>+/* savannah bug #20053, patch for compiling on darwin */</div><div class='add'>+#define O_LARGEFILE 0100000 /* from bits/fcntl.h */</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#ifndef O_FMODE_EXEC</div><div class='add'>+/* redhat bug 843080, added from linux/fs.h */</div><div class='add'>+#define O_FMODE_EXEC 040  // 0x20</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#ifndef O_DIRECT</div><div class='add'>+/* savannah bug #20050, #20052 */</div><div class='add'>+#define O_DIRECT 0 /* From asm/fcntl.h */</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#ifndef O_DIRECTORY</div><div class='add'>+/* FreeBSD does not need O_DIRECTORY */</div><div class='add'>+#define O_DIRECTORY 0</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#ifndef EBADFD</div><div class='add'>+/* Mac OS X does not have EBADFD */</div><div class='add'>+#define EBADFD EBADF</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#ifndef FNM_EXTMATCH</div><div class='add'>+#define FNM_EXTMATCH 0</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+/*gets max-offset on all architectures correctly*/</div><div class='add'>+#define GF_OFF_MAX ((1ULL &lt;&lt; (sizeof(off_t) * 8 - 1)) - 1ULL)</div><div class='add'>+</div><div class='add'>+#define GLUSTERD_MAX_SNAP_NAME 255</div><div class='add'>+#define GLUSTERFS_SOCKET_LISTEN_BACKLOG 1024</div><div class='add'>+#define GLUSTERD_BRICK_SERVERS "cluster.brick-vol-servers"</div><div class='add'>+#define SLEN(str) (sizeof(str) - 1)</div><div class='add'>+</div><div class='add'>+#define ZR_MOUNTPOINT_OPT "mountpoint"</div><div class='add'>+#define ZR_ATTR_TIMEOUT_OPT "attribute-timeout"</div><div class='add'>+#define ZR_ENTRY_TIMEOUT_OPT "entry-timeout"</div><div class='add'>+#define ZR_NEGATIVE_TIMEOUT_OPT "negative-timeout"</div><div class='add'>+#define ZR_DIRECT_IO_OPT "direct-io-mode"</div><div class='add'>+#define ZR_STRICT_VOLFILE_CHECK "strict-volfile-check"</div><div class='add'>+#define ZR_DUMP_FUSE "dump-fuse"</div><div class='add'>+#define ZR_FUSE_MOUNTOPTS "fuse-mountopts"</div><div class='add'>+#define IO_THREADS_QUEUE_SIZE_KEY "io-thread-queue-size"</div><div class='add'>+</div><div class='add'>+#define GF_XATTR_CLRLK_CMD "glusterfs.clrlk"</div><div class='add'>+#define GF_XATTR_PATHINFO_KEY "trusted.glusterfs.pathinfo"</div><div class='add'>+#define GF_XATTR_NODE_UUID_KEY "trusted.glusterfs.node-uuid"</div><div class='add'>+#define GF_XATTR_LIST_NODE_UUIDS_KEY "trusted.glusterfs.list-node-uuids"</div><div class='add'>+#define GF_REBAL_FIND_LOCAL_SUBVOL "glusterfs.find-local-subvol"</div><div class='add'>+#define GF_REBAL_OLD_FIND_LOCAL_SUBVOL "glusterfs.old-find-local-subvol"</div><div class='add'>+#define GF_XATTR_VOL_ID_KEY "trusted.glusterfs.volume-id"</div><div class='add'>+#define GF_XATTR_LOCKINFO_KEY "trusted.glusterfs.lockinfo"</div><div class='add'>+#define GF_META_LOCK_KEY "glusterfs.lock-migration-meta-lock"</div><div class='add'>+#define GF_META_UNLOCK_KEY "glusterfs.lock-migration-meta-unlock"</div><div class='add'>+#define GF_XATTR_GET_REAL_FILENAME_KEY "glusterfs.get_real_filename:"</div><div class='add'>+#define GF_XATTR_USER_PATHINFO_KEY "glusterfs.pathinfo"</div><div class='add'>+#define GF_INTERNAL_IGNORE_DEEM_STATFS "ignore-deem-statfs"</div><div class='add'>+#define GF_XATTR_IOSTATS_DUMP_KEY "trusted.io-stats-dump"</div><div class='add'>+</div><div class='add'>+#define GF_READDIR_SKIP_DIRS "readdir-filter-directories"</div><div class='add'>+#define GF_MDC_LOADED_KEY_NAMES "glusterfs.mdc.loaded.key.names"</div><div class='add'>+</div><div class='add'>+#define BD_XATTR_KEY "user.glusterfs"</div><div class='add'>+#define GF_PREOP_PARENT_KEY "glusterfs.preop.parent.key"</div><div class='add'>+#define GF_PREOP_CHECK_FAILED "glusterfs.preop.check.failed"</div><div class='add'>+</div><div class='add'>+#define XATTR_IS_PATHINFO(x)                                                   \</div><div class='add'>+    ((strncmp(x, GF_XATTR_PATHINFO_KEY, strlen(x)) == 0) ||                    \</div><div class='add'>+     (strncmp(x, GF_XATTR_USER_PATHINFO_KEY, strlen(x)) == 0))</div><div class='add'>+#define XATTR_IS_NODE_UUID(x)                                                  \</div><div class='add'>+    (strncmp(x, GF_XATTR_NODE_UUID_KEY, SLEN(GF_XATTR_NODE_UUID_KEY)) == 0)</div><div class='add'>+#define XATTR_IS_NODE_UUID_LIST(x)                                             \</div><div class='add'>+    (strncmp(x, GF_XATTR_LIST_NODE_UUIDS_KEY,                                  \</div><div class='add'>+             SLEN(GF_XATTR_LIST_NODE_UUIDS_KEY)) == 0)</div><div class='add'>+#define XATTR_IS_LOCKINFO(x)                                                   \</div><div class='add'>+    (strncmp(x, GF_XATTR_LOCKINFO_KEY, SLEN(GF_XATTR_LOCKINFO_KEY)) == 0)</div><div class='add'>+</div><div class='add'>+#define XATTR_IS_BD(x) (strncmp(x, BD_XATTR_KEY, SLEN(BD_XATTR_KEY)) == 0)</div><div class='add'>+</div><div class='add'>+#define GF_XATTR_LINKINFO_KEY "trusted.distribute.linkinfo"</div><div class='add'>+#define GFID_XATTR_KEY "trusted.gfid"</div><div class='add'>+#define PGFID_XATTR_KEY_PREFIX "trusted.pgfid."</div><div class='add'>+#define GFID2PATH_VIRT_XATTR_KEY "glusterfs.gfidtopath"</div><div class='add'>+#define GFID2PATH_XATTR_KEY_PREFIX "trusted.gfid2path."</div><div class='add'>+#define GFID2PATH_XATTR_KEY_PREFIX_LENGTH 18</div><div class='add'>+#define VIRTUAL_GFID_XATTR_KEY_STR "glusterfs.gfid.string"</div><div class='add'>+#define VIRTUAL_GFID_XATTR_KEY "glusterfs.gfid"</div><div class='add'>+#define GF_XATTR_MDATA_KEY "trusted.glusterfs.mdata"</div><div class='add'>+#define UUID_CANONICAL_FORM_LEN 36</div><div class='add'>+</div><div class='add'>+#define GET_ANCESTRY_PATH_KEY "glusterfs.ancestry.path"</div><div class='add'>+#define GET_ANCESTRY_DENTRY_KEY "glusterfs.ancestry.dentry"</div><div class='add'>+</div><div class='add'>+#define BITROT_DEFAULT_CURRENT_VERSION (unsigned long)1</div><div class='add'>+#define BITROT_DEFAULT_SIGNING_VERSION (unsigned long)0</div><div class='add'>+</div><div class='add'>+/* on-disk object signature keys */</div><div class='add'>+#define BITROT_OBJECT_BAD_KEY "trusted.bit-rot.bad-file"</div><div class='add'>+#define BITROT_CURRENT_VERSION_KEY "trusted.bit-rot.version"</div><div class='add'>+#define BITROT_SIGNING_VERSION_KEY "trusted.bit-rot.signature"</div><div class='add'>+</div><div class='add'>+/* globally usable bad file marker */</div><div class='add'>+#define GLUSTERFS_BAD_INODE "glusterfs.bad-inode"</div><div class='add'>+</div><div class='add'>+/* on-disk size of signing xattr (not the signature itself) */</div><div class='add'>+#define BITROT_SIGNING_XATTR_SIZE_KEY "trusted.glusterfs.bit-rot.size"</div><div class='add'>+</div><div class='add'>+/* GET/SET object signature */</div><div class='add'>+#define GLUSTERFS_GET_OBJECT_SIGNATURE "trusted.glusterfs.get-signature"</div><div class='add'>+#define GLUSTERFS_SET_OBJECT_SIGNATURE "trusted.glusterfs.set-signature"</div><div class='add'>+</div><div class='add'>+/* operation needs to be durable on-disk */</div><div class='add'>+#define GLUSTERFS_DURABLE_OP "trusted.glusterfs.durable-op"</div><div class='add'>+</div><div class='add'>+/* key for version exchange b/w bitrot stub and changelog */</div><div class='add'>+#define GLUSTERFS_VERSION_XCHG_KEY "glusterfs.version.xchg"</div><div class='add'>+</div><div class='add'>+#define GLUSTERFS_INTERNAL_FOP_KEY "glusterfs-internal-fop"</div><div class='add'>+</div><div class='add'>+#define GF_ENFORCE_MANDATORY_LOCK "trusted.glusterfs.enforce-mandatory-lock"</div><div class='add'>+</div><div class='add'>+/* GlusterFS Internal FOP Indicator flags</div><div class='add'>+ * (To pass information on the context in which a paritcular</div><div class='add'>+ *  fop is performed between translators)</div><div class='add'>+ * The presence of a particular flag must be treated as an</div><div class='add'>+ * indicator of the context, however the flag is added only in</div><div class='add'>+ * a scenario where there is a need for such context across translators.</div><div class='add'>+ * So it cannot be an absolute information on context.</div><div class='add'>+ */</div><div class='add'>+#define GF_INTERNAL_CTX_KEY "glusterfs.internal-ctx"</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+ * Always append entries to end of the enum, do not delete entries.</div><div class='add'>+ * Currently dict_set_flag allows to set up to 256 flag, if the enum</div><div class='add'>+ * needs to grow beyond this dict_set_flag has to be changed accordingly</div><div class='add'>+ */</div><div class='add'>+enum gf_internal_fop_indicator {</div><div class='add'>+    GF_DHT_HEAL_DIR /* Index 0 in bit array*/</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+/* Todo:</div><div class='add'>+ * Add GF_FOP_LINK_FILE         0x2ULL</div><div class='add'>+ * address GLUSTERFS_MARKER_DONT_ACCOUNT_KEY and</div><div class='add'>+ * GLUSTERFS_INTERNAL_FOP_KEY with this flag</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+#define DHT_CHANGELOG_RENAME_OP_KEY "changelog.rename-op"</div><div class='add'>+</div><div class='add'>+#define GLUSTERFS_WRITE_IS_APPEND "glusterfs.write-is-append"</div><div class='add'>+#define GLUSTERFS_WRITE_UPDATE_ATOMIC "glusterfs.write-update-atomic"</div><div class='add'>+#define GLUSTERFS_OPEN_FD_COUNT "glusterfs.open-fd-count"</div><div class='add'>+#define GLUSTERFS_ACTIVE_FD_COUNT "glusterfs.open-active-fd-count"</div><div class='add'>+#define GLUSTERFS_INODELK_COUNT "glusterfs.inodelk-count"</div><div class='add'>+#define GLUSTERFS_ENTRYLK_COUNT "glusterfs.entrylk-count"</div><div class='add'>+#define GLUSTERFS_POSIXLK_COUNT "glusterfs.posixlk-count"</div><div class='add'>+#define GLUSTERFS_PARENT_ENTRYLK "glusterfs.parent-entrylk"</div><div class='add'>+#define GLUSTERFS_INODELK_DOM_COUNT "glusterfs.inodelk-dom-count"</div><div class='add'>+#define GLUSTERFS_INODELK_DOM_PREFIX "glusterfs.inodelk-dom-prefix"</div><div class='add'>+#define GLUSTERFS_MULTIPLE_DOM_LK_CNT_REQUESTS "glusterfs.multi-dom-lk-cnt-req"</div><div class='add'>+#define GFID_TO_PATH_KEY "glusterfs.gfid2path"</div><div class='add'>+#define GF_XATTR_STIME_PATTERN "trusted.glusterfs.*.stime"</div><div class='add'>+#define GF_XATTR_XTIME_PATTERN "trusted.glusterfs.*.xtime"</div><div class='add'>+#define GF_XATTR_TRIGGER_SYNC "glusterfs.geo-rep.trigger-sync"</div><div class='add'>+</div><div class='add'>+/* quota xattrs */</div><div class='add'>+#define QUOTA_SIZE_KEY "trusted.glusterfs.quota.size"</div><div class='add'>+#define QUOTA_LIMIT_KEY "trusted.glusterfs.quota.limit-set"</div><div class='add'>+#define QUOTA_LIMIT_OBJECTS_KEY "trusted.glusterfs.quota.limit-objects"</div><div class='add'>+#define VIRTUAL_QUOTA_XATTR_CLEANUP_KEY "glusterfs.quota-xattr-cleanup"</div><div class='add'>+#define QUOTA_READ_ONLY_KEY "trusted.glusterfs.quota.read-only"</div><div class='add'>+</div><div class='add'>+/* ctime related */</div><div class='add'>+#define CTIME_MDATA_XDATA_KEY "set-ctime-mdata"</div><div class='add'>+</div><div class='add'>+/* afr related */</div><div class='add'>+#define AFR_XATTR_PREFIX "trusted.afr"</div><div class='add'>+</div><div class='add'>+/* Index xlator related */</div><div class='add'>+#define GF_XATTROP_INDEX_GFID "glusterfs.xattrop_index_gfid"</div><div class='add'>+#define GF_XATTROP_ENTRY_CHANGES_GFID "glusterfs.xattrop_entry_changes_gfid"</div><div class='add'>+#define GF_XATTROP_INDEX_COUNT "glusterfs.xattrop_index_count"</div><div class='add'>+#define GF_XATTROP_DIRTY_GFID "glusterfs.xattrop_dirty_gfid"</div><div class='add'>+#define GF_XATTROP_DIRTY_COUNT "glusterfs.xattrop_dirty_count"</div><div class='add'>+#define GF_XATTROP_ENTRY_IN_KEY "glusterfs.xattrop-entry-create"</div><div class='add'>+#define GF_XATTROP_ENTRY_OUT_KEY "glusterfs.xattrop-entry-delete"</div><div class='add'>+#define GF_INDEX_IA_TYPE_GET_REQ "glusterfs.index-ia-type-get-req"</div><div class='add'>+#define GF_INDEX_IA_TYPE_GET_RSP "glusterfs.index-ia-type-get-rsp"</div><div class='add'>+</div><div class='add'>+#define GF_HEAL_INFO "glusterfs.heal-info"</div><div class='add'>+#define GF_AFR_HEAL_SBRAIN "glusterfs.heal-sbrain"</div><div class='add'>+#define GF_AFR_SBRAIN_STATUS "replica.split-brain-status"</div><div class='add'>+#define GF_AFR_SBRAIN_CHOICE "replica.split-brain-choice"</div><div class='add'>+#define GF_AFR_SPB_CHOICE_TIMEOUT "replica.split-brain-choice-timeout"</div><div class='add'>+#define GF_AFR_SBRAIN_RESOLVE "replica.split-brain-heal-finalize"</div><div class='add'>+#define GF_AFR_ADD_BRICK "trusted.add-brick"</div><div class='add'>+#define GF_AFR_REPLACE_BRICK "trusted.replace-brick"</div><div class='add'>+#define GF_AFR_DIRTY "trusted.afr.dirty"</div><div class='add'>+#define GF_XATTROP_ENTRY_OUT "glusterfs.xattrop-entry-delete"</div><div class='add'>+#define GF_XATTROP_PURGE_INDEX "glusterfs.xattrop-purge-index"</div><div class='add'>+</div><div class='add'>+#define GF_GFIDLESS_LOOKUP "gfidless-lookup"</div><div class='add'>+/* replace-brick and pump related internal xattrs */</div><div class='add'>+#define RB_PUMP_CMD_START "glusterfs.pump.start"</div><div class='add'>+#define RB_PUMP_CMD_PAUSE "glusterfs.pump.pause"</div><div class='add'>+#define RB_PUMP_CMD_COMMIT "glusterfs.pump.commit"</div><div class='add'>+#define RB_PUMP_CMD_ABORT "glusterfs.pump.abort"</div><div class='add'>+#define RB_PUMP_CMD_STATUS "glusterfs.pump.status"</div><div class='add'>+</div><div class='add'>+#define GLUSTERFS_MARKER_DONT_ACCOUNT_KEY "glusters.marker.dont-account"</div><div class='add'>+#define GLUSTERFS_RDMA_INLINE_THRESHOLD (2048)</div><div class='add'>+#define GLUSTERFS_RDMA_MAX_HEADER_SIZE                                         \</div><div class='add'>+    (228) /* (sizeof (rdma_header_t)                                           \</div><div class='add'>+             + RDMA_MAX_SEGMENTS                                               \</div><div class='add'>+             * sizeof (rdma_read_chunk_t))                                     \</div><div class='add'>+             */</div><div class='add'>+</div><div class='add'>+#define GLUSTERFS_RPC_REPLY_SIZE 24</div><div class='add'>+</div><div class='add'>+#define STARTING_EVENT_THREADS 2</div><div class='add'>+</div><div class='add'>+#define DEFAULT_VAR_RUN_DIRECTORY DATADIR "/run/gluster"</div><div class='add'>+#define DEFAULT_GLUSTERFSD_MISC_DIRETORY DATADIR "/lib/misc/glusterfsd"</div><div class='add'>+#ifdef GF_LINUX_HOST_OS</div><div class='add'>+#define GLUSTERD_DEFAULT_WORKDIR DATADIR "/lib/glusterd"</div><div class='add'>+#else</div><div class='add'>+#define GLUSTERD_DEFAULT_WORKDIR DATADIR "/db/glusterd"</div><div class='add'>+#endif</div><div class='add'>+#define GF_REPLICATE_TRASH_DIR ".landfill"</div><div class='add'>+</div><div class='add'>+/* GlusterFS's maximum supported Auxiliary GIDs */</div><div class='add'>+#define GF_MAX_AUX_GROUPS 65535</div><div class='add'>+</div><div class='add'>+#define GF_UUID_BUF_SIZE 37          /* UUID_CANONICAL_FORM_LEN + NULL */</div><div class='add'>+#define GF_UUID_BNAME_BUF_SIZE (320) /* (64 + 256) */</div><div class='add'>+</div><div class='add'>+#define GF_REBALANCE_TID_KEY "rebalance-id"</div><div class='add'>+#define GF_REMOVE_BRICK_TID_KEY "remove-brick-id"</div><div class='add'>+#define GF_TIER_TID_KEY "tier-id"</div><div class='add'>+#define GF_TIER_ENABLED "tier-enabled"</div><div class='add'>+</div><div class='add'>+#define UUID_CANONICAL_FORM_LEN 36</div><div class='add'>+</div><div class='add'>+/* Adding this here instead of any glusterd*.h files as it is also required by</div><div class='add'>+ * cli</div><div class='add'>+ */</div><div class='add'>+#define DEFAULT_GLUSTERD_SOCKFILE DATADIR "/run/glusterd.socket"</div><div class='add'>+</div><div class='add'>+/* features/marker-quota also needs to have knowledge of link-files so as to</div><div class='add'>+ * exclude them from accounting.</div><div class='add'>+ */</div><div class='add'>+#define DHT_LINKFILE_MODE (S_ISVTX)</div><div class='add'>+</div><div class='add'>+#define IS_DHT_LINKFILE_MODE(iabuf)                                            \</div><div class='add'>+    ((st_mode_from_ia((iabuf)-&gt;ia_prot, (iabuf)-&gt;ia_type) &amp; ~S_IFMT) ==        \</div><div class='add'>+     DHT_LINKFILE_MODE)</div><div class='add'>+#define DHT_LINKFILE_STR "linkto"</div><div class='add'>+#define DHT_COMMITHASH_STR "commithash"</div><div class='add'>+</div><div class='add'>+#define DHT_SKIP_NON_LINKTO_UNLINK "unlink-only-if-dht-linkto-file"</div><div class='add'>+#define TIER_SKIP_NON_LINKTO_UNLINK "unlink-only-if-tier-linkto-file"</div><div class='add'>+#define DHT_SKIP_OPEN_FD_UNLINK "dont-unlink-for-open-fd"</div><div class='add'>+#define DHT_IATT_IN_XDATA_KEY "dht-get-iatt-in-xattr"</div><div class='add'>+#define DHT_MODE_IN_XDATA_KEY "dht-get-mode-in-xattr"</div><div class='add'>+#define GET_LINK_COUNT "get-link-count"</div><div class='add'>+#define GF_GET_SIZE "get-size"</div><div class='add'>+#define GF_PRESTAT "virt-gf-prestat"</div><div class='add'>+#define GF_POSTSTAT "virt-gf-poststat"</div><div class='add'>+</div><div class='add'>+/*CTR and Marker requires inode dentry link count from posix*/</div><div class='add'>+#define GF_RESPONSE_LINK_COUNT_XDATA "gf_response_link_count"</div><div class='add'>+#define GF_REQUEST_LINK_COUNT_XDATA "gf_request_link_count"</div><div class='add'>+</div><div class='add'>+#define GF_GET_FILE_BLOCK_COUNT "gf_get_file_block_count"</div><div class='add'>+</div><div class='add'>+#define CTR_ATTACH_TIER_LOOKUP "ctr_attach_tier_lookup"</div><div class='add'>+</div><div class='add'>+#define CLIENT_CMD_CONNECT "trusted.glusterfs.client-connect"</div><div class='add'>+#define CLIENT_CMD_DISCONNECT "trusted.glusterfs.client-disconnect"</div><div class='add'>+</div><div class='add'>+#define GF_LOG_LRU_BUFSIZE_DEFAULT 5</div><div class='add'>+#define GF_LOG_LRU_BUFSIZE_MIN 0</div><div class='add'>+#define GF_LOG_LRU_BUFSIZE_MAX 20</div><div class='add'>+#define GF_LOG_LRU_BUFSIZE_MIN_STR "0"</div><div class='add'>+#define GF_LOG_LRU_BUFSIZE_MAX_STR "20"</div><div class='add'>+</div><div class='add'>+#define GF_LOG_FLUSH_TIMEOUT_DEFAULT 120</div><div class='add'>+#define GF_LOG_FLUSH_TIMEOUT_MIN 30</div><div class='add'>+#define GF_LOG_FLUSH_TIMEOUT_MAX 300</div><div class='add'>+#define GF_LOG_FLUSH_TIMEOUT_MIN_STR "30"</div><div class='add'>+#define GF_LOG_FLUSH_TIMEOUT_MAX_STR "300"</div><div class='add'>+#define GF_LOG_LOCALTIME_DEFAULT 0</div><div class='add'>+</div><div class='add'>+#define GF_NETWORK_TIMEOUT 42</div><div class='add'>+</div><div class='add'>+#define GF_BACKTRACE_LEN 4096</div><div class='add'>+#define GF_BACKTRACE_FRAME_COUNT 7</div><div class='add'>+</div><div class='add'>+#define GF_LK_ADVISORY 0  /* maps to GLFS_LK_ADVISORY from libgfapi*/</div><div class='add'>+#define GF_LK_MANDATORY 1 /* maps to GLFS_LK_MANDATORY from libgfapi*/</div><div class='add'>+#define GF_LOCK_MODE "glusterfs.lk.lkmode"</div><div class='add'>+</div><div class='add'>+#define GF_CHECK_XATTR_KEY_AND_GOTO(key, cmpkey, errval, lbl)                  \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        if (key &amp;&amp; strcmp(key, cmpkey) == 0) {                                 \</div><div class='add'>+            errval = -EINVAL;                                                  \</div><div class='add'>+            goto lbl;                                                          \</div><div class='add'>+        }                                                                      \</div><div class='add'>+    } while (0)</div><div class='add'>+</div><div class='add'>+#define GF_CS_OBJECT_SIZE "trusted.glusterfs.cs.object_size"</div><div class='add'>+#define GF_CS_BLOCK_SIZE "trusted.glusterfs.cs.block_size"</div><div class='add'>+#define GF_CS_NUM_BLOCKS "trusted.glusterfs.cs.num_blocks"</div><div class='add'>+</div><div class='add'>+#define GF_CS_XATTR_ARCHIVE_UUID "trusted.cloudsync.uuid"</div><div class='add'>+</div><div class='add'>+#define GF_CS_OBJECT_UPLOAD_COMPLETE "trusted.glusterfs.csou.complete"</div><div class='add'>+#define GF_CS_OBJECT_REMOTE "trusted.glusterfs.cs.remote"</div><div class='add'>+#define GF_CS_OBJECT_DOWNLOADING "trusted.glusterfs.cs.downloading"</div><div class='add'>+#define GF_CS_OBJECT_DOWNLOADED "trusted.glusterfs.cs.downloaded"</div><div class='add'>+#define GF_CS_OBJECT_STATUS "trusted.glusterfs.cs.status"</div><div class='add'>+#define GF_CS_OBJECT_REPAIR "trusted.glusterfs.cs.repair"</div><div class='add'>+</div><div class='add'>+#define gf_boolean_t bool</div><div class='add'>+#define _gf_false false</div><div class='add'>+#define _gf_true true</div><div class='add'>+</div><div class='add'>+typedef enum {</div><div class='add'>+    GF_CS_LOCAL = 1,</div><div class='add'>+    GF_CS_REMOTE = 2,</div><div class='add'>+    GF_CS_REPAIR = 4,</div><div class='add'>+    GF_CS_DOWNLOADING = 8,</div><div class='add'>+    GF_CS_ERROR = 16,</div><div class='add'>+} gf_cs_obj_state;</div><div class='add'>+</div><div class='add'>+typedef enum {</div><div class='add'>+    GF_FOP_PRI_UNSPEC = -1, /* Priority not specified */</div><div class='add'>+    GF_FOP_PRI_HI = 0,      /* low latency */</div><div class='add'>+    GF_FOP_PRI_NORMAL,      /* normal */</div><div class='add'>+    GF_FOP_PRI_LO,          /* bulk */</div><div class='add'>+    GF_FOP_PRI_LEAST,       /* least */</div><div class='add'>+    GF_FOP_PRI_MAX,         /* Highest */</div><div class='add'>+} gf_fop_pri_t;</div><div class='add'>+</div><div class='add'>+typedef enum {</div><div class='add'>+    /* The 'component' (xlator / option) is not yet setting the flag */</div><div class='add'>+    GF_UNCLASSIFIED = 0,</div><div class='add'>+    /* The 'component' is experimental, should not be recommened</div><div class='add'>+       in production mode */</div><div class='add'>+    GF_EXPERIMENTAL,</div><div class='add'>+    /* The 'component' is tech preview, ie, it is 'mostly' working as</div><div class='add'>+       expected, but can have some of the corner cases, which is not</div><div class='add'>+       handled. */</div><div class='add'>+    GF_TECH_PREVIEW,</div><div class='add'>+    /* The 'component' is good to run. Has good enough test and</div><div class='add'>+       documentation coverage. */</div><div class='add'>+    GF_MAINTAINED,</div><div class='add'>+    /* The component is:</div><div class='add'>+       - no more a focus</div><div class='add'>+       - no more solving a valid use case</div><div class='add'>+       - no more maintained, no volunteers to maintain</div><div class='add'>+       - there is 'maintained' or 'tech-preview' feature,</div><div class='add'>+       which does the same thing, better.</div><div class='add'>+    */</div><div class='add'>+    GF_DEPRECATED,</div><div class='add'>+    /* The 'component' is no more 'built'. */</div><div class='add'>+    GF_OBSOLETE,</div><div class='add'>+    /* The 'component' exist for Documentation purposes.</div><div class='add'>+       No real usecase */</div><div class='add'>+    GF_DOCUMENT_PURPOSE,</div><div class='add'>+} gf_category_t;</div><div class='add'>+</div><div class='add'>+static const char *const FOP_PRI_STRINGS[] = {"HIGH", "NORMAL", "LOW", "LEAST"};</div><div class='add'>+</div><div class='add'>+static inline const char *</div><div class='add'>+fop_pri_to_string(gf_fop_pri_t pri)</div><div class='add'>+{</div><div class='add'>+    if (IS_ERROR(pri))</div><div class='add'>+        return "UNSPEC";</div><div class='add'>+</div><div class='add'>+    if (pri &gt;= GF_FOP_PRI_MAX)</div><div class='add'>+        return "INVALID";</div><div class='add'>+</div><div class='add'>+    return FOP_PRI_STRINGS[pri];</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+const char *</div><div class='add'>+fop_enum_to_pri_string(glusterfs_fop_t fop);</div><div class='add'>+</div><div class='add'>+#define GF_SET_IF_NOT_PRESENT 0x1 /* default behaviour */</div><div class='add'>+#define GF_SET_OVERWRITE 0x2      /* Overwrite with the buf given */</div><div class='add'>+#define GF_SET_DIR_ONLY 0x4</div><div class='add'>+#define GF_SET_EPOCH_TIME 0x8    /* used by afr dir lookup selfheal */</div><div class='add'>+#define GF_AUXILLARY_PARGFID 0xd /* RIO dummy parent gfid */</div><div class='add'>+</div><div class='add'>+/* key value which quick read uses to get small files in lookup cbk */</div><div class='add'>+#define GF_CONTENT_KEY "glusterfs.content"</div><div class='add'>+</div><div class='add'>+struct _xlator_cmdline_option {</div><div class='add'>+    struct list_head cmd_args;</div><div class='add'>+    char *volume;</div><div class='add'>+    char *key;</div><div class='add'>+    char *value;</div><div class='add'>+};</div><div class='add'>+typedef struct _xlator_cmdline_option xlator_cmdline_option_t;</div><div class='add'>+</div><div class='add'>+struct _server_cmdline {</div><div class='add'>+    struct list_head list;</div><div class='add'>+    char *volfile_server;</div><div class='add'>+    char *transport;</div><div class='add'>+    int port;</div><div class='add'>+};</div><div class='add'>+typedef struct _server_cmdline server_cmdline_t;</div><div class='add'>+</div><div class='add'>+#define GF_OPTION_ENABLE _gf_true</div><div class='add'>+#define GF_OPTION_DISABLE _gf_false</div><div class='add'>+#define GF_OPTION_DEFERRED 2</div><div class='add'>+</div><div class='add'>+typedef enum { _gf_none, _gf_memcheck, _gf_drd } gf_valgrind_tool;</div><div class='add'>+</div><div class='add'>+struct _cmd_args {</div><div class='add'>+    /* basic options */</div><div class='add'>+    char *volfile_server;</div><div class='add'>+    server_cmdline_t *curr_server;</div><div class='add'>+    /* List of backup  volfile servers, including original */</div><div class='add'>+    struct list_head volfile_servers;</div><div class='add'>+    char *volfile;</div><div class='add'>+    char *log_server;</div><div class='add'>+    gf_loglevel_t log_level;</div><div class='add'>+    char *log_file;</div><div class='add'>+    char *log_ident;</div><div class='add'>+    gf_log_logger_t logger;</div><div class='add'>+    gf_log_format_t log_format;</div><div class='add'>+    uint32_t log_buf_size;</div><div class='add'>+    uint32_t log_flush_timeout;</div><div class='add'>+    int32_t max_connect_attempts;</div><div class='add'>+    char *print_exports;</div><div class='add'>+    char *print_netgroups;</div><div class='add'>+    int print_xlatordir;</div><div class='add'>+    int print_statedumpdir;</div><div class='add'>+    int print_logdir;</div><div class='add'>+    int print_libexecdir;</div><div class='add'>+    /* advanced options */</div><div class='add'>+    uint32_t volfile_server_port;</div><div class='add'>+    char *volfile_server_transport;</div><div class='add'>+    uint32_t log_server_port;</div><div class='add'>+    char *pid_file;</div><div class='add'>+    char *sock_file;</div><div class='add'>+    int no_daemon_mode;</div><div class='add'>+    char *run_id;</div><div class='add'>+    int debug_mode;</div><div class='add'>+    int read_only;</div><div class='add'>+    int acl;</div><div class='add'>+    int selinux;</div><div class='add'>+    int capability;</div><div class='add'>+    int enable_ino32;</div><div class='add'>+    int worm;</div><div class='add'>+    int mac_compat;</div><div class='add'>+    int fopen_keep_cache;</div><div class='add'>+    int gid_timeout;</div><div class='add'>+    char gid_timeout_set;</div><div class='add'>+    int aux_gfid_mount;</div><div class='add'>+</div><div class='add'>+    /* need a process wide timer-wheel? */</div><div class='add'>+    int global_timer_wheel;</div><div class='add'>+</div><div class='add'>+    /* list of xlator_option_t */</div><div class='add'>+    struct list_head xlator_options;</div><div class='add'>+</div><div class='add'>+    /* fuse options */</div><div class='add'>+    int fuse_direct_io_mode;</div><div class='add'>+    char *use_readdirp;</div><div class='add'>+    int no_root_squash;</div><div class='add'>+    int volfile_check;</div><div class='add'>+    double fuse_entry_timeout;</div><div class='add'>+    double fuse_negative_timeout;</div><div class='add'>+    double fuse_attribute_timeout;</div><div class='add'>+    char *volume_name;</div><div class='add'>+    int fuse_nodev;</div><div class='add'>+    int fuse_nosuid;</div><div class='add'>+    char *dump_fuse;</div><div class='add'>+    pid_t client_pid;</div><div class='add'>+    int client_pid_set;</div><div class='add'>+    unsigned uid_map_root;</div><div class='add'>+    int32_t lru_limit;</div><div class='add'>+    int32_t invalidate_limit;</div><div class='add'>+    int background_qlen;</div><div class='add'>+    int congestion_threshold;</div><div class='add'>+    char *fuse_mountopts;</div><div class='add'>+    int mem_acct;</div><div class='add'>+    int resolve_gids;</div><div class='add'>+</div><div class='add'>+    /* key args */</div><div class='add'>+    char *mount_point;</div><div class='add'>+    char *volfile_id;</div><div class='add'>+</div><div class='add'>+    /* required for portmap */</div><div class='add'>+    int brick_port;</div><div class='add'>+    char *brick_name;</div><div class='add'>+    int brick_port2;</div><div class='add'>+</div><div class='add'>+    /* Should management connections use SSL? */</div><div class='add'>+    int secure_mgmt;</div><div class='add'>+</div><div class='add'>+    /* Linux-only OOM killer adjustment */</div><div class='add'>+#ifdef GF_LINUX_HOST_OS</div><div class='add'>+    char *oom_score_adj;</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+    /* Run this process with valgrind? Might want to prevent calling</div><div class='add'>+     * functions that prevent valgrind from working correctly, like</div><div class='add'>+     * dlclose(). */</div><div class='add'>+    gf_valgrind_tool vgtool;</div><div class='add'>+</div><div class='add'>+    int localtime_logging;</div><div class='add'>+</div><div class='add'>+    /* For the subdir mount */</div><div class='add'>+    char *subdir_mount;</div><div class='add'>+</div><div class='add'>+    char *process_name;</div><div class='add'>+    char *event_history;</div><div class='add'>+    int thin_client;</div><div class='add'>+    uint32_t reader_thread_count;</div><div class='add'>+</div><div class='add'>+    /* FUSE writeback cache support */</div><div class='add'>+    int kernel_writeback_cache;</div><div class='add'>+    uint32_t attr_times_granularity;</div><div class='add'>+</div><div class='add'>+    int fuse_flush_handle_interrupt;</div><div class='add'>+    int fuse_auto_inval;</div><div class='add'>+</div><div class='add'>+    bool global_threading;</div><div class='add'>+    bool brick_mux;</div><div class='add'>+</div><div class='add'>+    uint32_t fuse_dev_eperm_ratelimit_ns;</div><div class='add'>+};</div><div class='add'>+typedef struct _cmd_args cmd_args_t;</div><div class='add'>+</div><div class='add'>+struct _glusterfs_graph {</div><div class='add'>+    struct list_head list;</div><div class='add'>+    struct timeval dob;</div><div class='add'>+    void *first;</div><div class='add'>+    void *top; /* selected by -n */</div><div class='add'>+    int xl_count;</div><div class='add'>+    int id;   /* Used in logging */</div><div class='add'>+    int used; /* Should be set when fuse gets</div><div class='add'>+                        first CHILD_UP */</div><div class='add'>+    uint32_t volfile_checksum;</div><div class='add'>+    uint32_t leaf_count;</div><div class='add'>+    void *last_xl; /* Stores the last xl of the graph, as of now only populated</div><div class='add'>+                      in client multiplexed code path */</div><div class='add'>+    pthread_mutex_t mutex;</div><div class='add'>+    pthread_cond_t child_down_cond; /* for broadcasting CHILD_DOWN */</div><div class='add'>+    int parent_down;</div><div class='add'>+    char graph_uuid[128];</div><div class='add'>+    char volume_id[GF_UUID_BUF_SIZE];</div><div class='add'>+};</div><div class='add'>+typedef struct _glusterfs_graph glusterfs_graph_t;</div><div class='add'>+</div><div class='add'>+typedef int32_t (*glusterfsd_mgmt_event_notify_fn_t)(int32_t event, void *data,</div><div class='add'>+                                                     ...);</div><div class='add'>+</div><div class='add'>+typedef enum {</div><div class='add'>+    MGMT_SSL_NEVER = 0,</div><div class='add'>+    MGMT_SSL_COPY_IO,</div><div class='add'>+    MGMT_SSL_ALWAYS</div><div class='add'>+} mgmt_ssl_t;</div><div class='add'>+</div><div class='add'>+struct tvec_base;</div><div class='add'>+</div><div class='add'>+/* reference counting for the global (per ctx) timer-wheel */</div><div class='add'>+struct gf_ctx_tw {</div><div class='add'>+    GF_REF_DECL;</div><div class='add'>+    struct tvec_base *timer_wheel; /* global timer-wheel instance */</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct _glusterfs_ctx {</div><div class='add'>+    cmd_args_t cmd_args;</div><div class='add'>+    char *process_uuid;</div><div class='add'>+    FILE *pidfp;</div><div class='add'>+    char fin;</div><div class='add'>+    void *timer;</div><div class='add'>+    void *ib;</div><div class='add'>+    struct call_pool *pool;</div><div class='add'>+    void *event_pool;</div><div class='add'>+    void *iobuf_pool;</div><div class='add'>+    void *logbuf_pool;</div><div class='add'>+    gf_lock_t lock;</div><div class='add'>+    size_t page_size;</div><div class='add'>+</div><div class='add'>+    /* one per volfile parse */</div><div class='add'>+    struct list_head graphs;</div><div class='add'>+</div><div class='add'>+    /* the latest graph in use */</div><div class='add'>+    glusterfs_graph_t *active;</div><div class='add'>+</div><div class='add'>+    /* fuse or nfs (but not protocol/server) */</div><div class='add'>+    void *master;</div><div class='add'>+</div><div class='add'>+    /* xlator implementing MOPs for centralized logging, volfile server */</div><div class='add'>+    void *mgmt;</div><div class='add'>+</div><div class='add'>+    /* listener of the commands from glusterd */</div><div class='add'>+    void *listener;</div><div class='add'>+</div><div class='add'>+    /* toggle switch for latency measurement */</div><div class='add'>+    unsigned char measure_latency;</div><div class='add'>+    pthread_t sigwaiter;</div><div class='add'>+    char *cmdlinestr;</div><div class='add'>+    struct mem_pool *stub_mem_pool;</div><div class='add'>+    unsigned char cleanup_started;</div><div class='add'>+    int graph_id;        /* Incremented per graph, value should</div><div class='add'>+                            indicate how many times the graph has</div><div class='add'>+                            got changed */</div><div class='add'>+    pid_t mnt_pid;       /* pid of the mount agent */</div><div class='add'>+    int process_mode;    /*mode in which process is runninng*/</div><div class='add'>+    struct syncenv *env; /* The env pointer to the synctasks */</div><div class='add'>+</div><div class='add'>+    struct list_head mempool_list; /* used to keep a global list of</div><div class='add'>+                                      mempools, used to log details of</div><div class='add'>+                                      mempool in statedump */</div><div class='add'>+    char *statedump_path;</div><div class='add'>+</div><div class='add'>+    struct mem_pool *dict_pool;</div><div class='add'>+    struct mem_pool *dict_pair_pool;</div><div class='add'>+    struct mem_pool *dict_data_pool;</div><div class='add'>+</div><div class='add'>+    glusterfsd_mgmt_event_notify_fn_t notify; /* Used for xlators to make</div><div class='add'>+                                                 call to fsd-mgmt */</div><div class='add'>+    gf_log_handle_t log; /* all logging related variables */</div><div class='add'>+</div><div class='add'>+    int mem_acct_enable;</div><div class='add'>+</div><div class='add'>+    int daemon_pipe[2];</div><div class='add'>+</div><div class='add'>+    struct clienttable *clienttable;</div><div class='add'>+</div><div class='add'>+    /*</div><div class='add'>+     * Should management connections use SSL?  This is the only place we</div><div class='add'>+     * can put it where both daemon-startup and socket code will see it.</div><div class='add'>+     *</div><div class='add'>+     * Why is it an int?  Because we're included before common-utils.h,</div><div class='add'>+     * which defines gf_boolean_t (what we really want).  It doesn't make</div><div class='add'>+     * any sense, but it's not worth turning the codebase upside-down to</div><div class='add'>+     * fix it.  Thus, an int.</div><div class='add'>+     */</div><div class='add'>+    int secure_mgmt;</div><div class='add'>+</div><div class='add'>+    /* The option is use to set cert_depth while management connection</div><div class='add'>+       use SSL</div><div class='add'>+     */</div><div class='add'>+    int ssl_cert_depth;</div><div class='add'>+</div><div class='add'>+    /*</div><div class='add'>+     * Should *our* server/inbound connections use SSL?  This is only true</div><div class='add'>+     * if we're glusterd and secure_mgmt is set, or if we're glusterfsd</div><div class='add'>+     * and SSL is set on the I/O path.  It should never be set e.g. for</div><div class='add'>+     * NFS.</div><div class='add'>+     */</div><div class='add'>+    mgmt_ssl_t secure_srvr;</div><div class='add'>+    /* Buffer to 'save' backtrace even under OOM-kill like situations*/</div><div class='add'>+    char btbuf[GF_BACKTRACE_LEN];</div><div class='add'>+</div><div class='add'>+    pthread_mutex_t notify_lock;</div><div class='add'>+    pthread_mutex_t cleanup_lock;</div><div class='add'>+    pthread_cond_t notify_cond;</div><div class='add'>+    int notifying;</div><div class='add'>+</div><div class='add'>+    struct gf_ctx_tw *tw; /* refcounted timer_wheel */</div><div class='add'>+</div><div class='add'>+    gf_lock_t volfile_lock;</div><div class='add'>+</div><div class='add'>+    /* configuration related elements, which gets changed</div><div class='add'>+       from global xlator */</div><div class='add'>+    struct {</div><div class='add'>+        char *metrics_dumppath;</div><div class='add'>+    } config;</div><div class='add'>+</div><div class='add'>+    struct {</div><div class='add'>+        gf_atomic_t max_dict_pairs;</div><div class='add'>+        gf_atomic_t total_pairs_used;</div><div class='add'>+        gf_atomic_t total_dicts_used;</div><div class='add'>+    } stats;</div><div class='add'>+</div><div class='add'>+    struct list_head volfile_list;</div><div class='add'>+    /* Add members to manage janitor threads for cleanup fd */</div><div class='add'>+    struct list_head janitor_fds;</div><div class='add'>+    pthread_cond_t fd_cond;</div><div class='add'>+    pthread_mutex_t fd_lock;</div><div class='add'>+    pthread_t janitor;</div><div class='add'>+    /* The variable is use to save total posix xlator count */</div><div class='add'>+    uint32_t pxl_count;</div><div class='add'>+</div><div class='add'>+    char volume_id[GF_UUID_BUF_SIZE]; /* Used only in protocol/client */</div><div class='add'>+};</div><div class='add'>+typedef struct _glusterfs_ctx glusterfs_ctx_t;</div><div class='add'>+</div><div class='add'>+typedef struct {</div><div class='add'>+    char volfile_checksum[SHA256_DIGEST_LENGTH];</div><div class='add'>+    char vol_id[NAME_MAX + 1];</div><div class='add'>+    struct list_head volfile_list;</div><div class='add'>+    glusterfs_graph_t *graph;</div><div class='add'>+    FILE *pidfp;</div><div class='add'>+} gf_volfile_t;</div><div class='add'>+</div><div class='add'>+glusterfs_ctx_t *</div><div class='add'>+glusterfs_ctx_new(void);</div><div class='add'>+</div><div class='add'>+struct gf_flock {</div><div class='add'>+    short l_type;</div><div class='add'>+    short l_whence;</div><div class='add'>+    off_t l_start;</div><div class='add'>+    off_t l_len;</div><div class='add'>+    pid_t l_pid;</div><div class='add'>+    gf_lkowner_t l_owner;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+typedef struct lock_migration_info {</div><div class='add'>+    struct list_head list;</div><div class='add'>+    struct gf_flock flock;</div><div class='add'>+    char *client_uid;</div><div class='add'>+    uint32_t lk_flags;</div><div class='add'>+} lock_migration_info_t;</div><div class='add'>+</div><div class='add'>+#define GF_MUST_CHECK __attribute__((warn_unused_result))</div><div class='add'>+/*</div><div class='add'>+ * Some macros (e.g. ALLOC_OR_GOTO) set variables in function scope, but the</div><div class='add'>+ * calling function might not only declare the variable to keep the macro happy</div><div class='add'>+ * and not use it otherwise.  In such cases, the following can be used to</div><div class='add'>+ * suppress the "set but not used" warning that would otherwise occur.</div><div class='add'>+ */</div><div class='add'>+#define GF_UNUSED __attribute__((unused))</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+ * If present, this has the following effects:</div><div class='add'>+ *</div><div class='add'>+ *      glusterd enables privileged commands over TCP</div><div class='add'>+ *</div><div class='add'>+ *      all code enables SSL for outbound connections to management port</div><div class='add'>+ *</div><div class='add'>+ *      glusterd enables SSL for inbound connections</div><div class='add'>+ *</div><div class='add'>+ * Servers and clients enable/disable SSL among themselves by other means.</div><div class='add'>+ * Making secure management connections conditional on a file is a bit of a</div><div class='add'>+ * hack, but we don't have any other place for such global settings across</div><div class='add'>+ * all of the affected components.  Making it a compile-time option would</div><div class='add'>+ * reduce functionality, both for users and for testing (which can now be</div><div class='add'>+ * done using secure connections for all tests without change elsewhere).</div><div class='add'>+ *</div><div class='add'>+ */</div><div class='add'>+#define SECURE_ACCESS_FILE GLUSTERD_DEFAULT_WORKDIR "/secure-access"</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+glusterfs_graph_prepare(glusterfs_graph_t *graph, glusterfs_ctx_t *ctx,</div><div class='add'>+                        char *volume_name);</div><div class='add'>+int</div><div class='add'>+glusterfs_graph_destroy_residual(glusterfs_graph_t *graph);</div><div class='add'>+int</div><div class='add'>+glusterfs_graph_deactivate(glusterfs_graph_t *graph);</div><div class='add'>+int</div><div class='add'>+glusterfs_graph_destroy(glusterfs_graph_t *graph);</div><div class='add'>+int</div><div class='add'>+glusterfs_get_leaf_count(glusterfs_graph_t *graph);</div><div class='add'>+int</div><div class='add'>+glusterfs_graph_activate(glusterfs_graph_t *graph, glusterfs_ctx_t *ctx);</div><div class='add'>+glusterfs_graph_t *</div><div class='add'>+glusterfs_graph_construct(FILE *fp);</div><div class='add'>+int</div><div class='add'>+glusterfs_graph_init(glusterfs_graph_t *graph);</div><div class='add'>+glusterfs_graph_t *</div><div class='add'>+glusterfs_graph_new(void);</div><div class='add'>+int</div><div class='add'>+glusterfs_graph_reconfigure(glusterfs_graph_t *oldgraph,</div><div class='add'>+                            glusterfs_graph_t *newgraph);</div><div class='add'>+int</div><div class='add'>+glusterfs_graph_attach(glusterfs_graph_t *orig_graph, char *path,</div><div class='add'>+                       glusterfs_graph_t **newgraph);</div><div class='add'>+int</div><div class='add'>+glusterfs_graph_parent_up(glusterfs_graph_t *graph);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+gf_free_mig_locks(lock_migration_info_t *locks);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+glusterfs_read_secure_access_file(void);</div><div class='add'>+int</div><div class='add'>+glusterfs_graph_fini(glusterfs_graph_t *graph);</div><div class='add'>+#endif /* _GLUSTERFS_H */</div><div class='head'>diff --git a/libglusterfs/src/glusterfs/graph-utils.h b/libglusterfs/src/glusterfs/graph-utils.h<br/>new file mode 100644<br/>index 00000000000..247f1a55d5a<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/libglusterfs/src/glusterfs/graph-utils.h?id=d1d7a6f35c816822fab51c820e25023863c239c1'>libglusterfs/src/glusterfs/graph-utils.h</a></div><div class='hunk'>@@ -0,0 +1,20 @@</div><div class='add'>+/*</div><div class='add'>+  Copyright (c) 2008-2012 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#ifndef _GRAPH_H_</div><div class='add'>+#define _GRAPH_H_</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+glusterfs_graph_print_file(FILE *file, glusterfs_graph_t *graph);</div><div class='add'>+int</div><div class='add'>+glusterfs_xlator_link(xlator_t *pxl, xlator_t *cxl);</div><div class='add'>+void</div><div class='add'>+glusterfs_graph_set_first(glusterfs_graph_t *graph, xlator_t *xl);</div><div class='add'>+#endif</div><div class='head'>diff --git a/libglusterfs/src/glusterfs/hashfn.h b/libglusterfs/src/glusterfs/hashfn.h<br/>new file mode 100644<br/>index 00000000000..6e92e706d8c<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/libglusterfs/src/glusterfs/hashfn.h?id=d1d7a6f35c816822fab51c820e25023863c239c1'>libglusterfs/src/glusterfs/hashfn.h</a></div><div class='hunk'>@@ -0,0 +1,23 @@</div><div class='add'>+/*</div><div class='add'>+  Copyright (c) 2008-2012 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#ifndef __HASHFN_H__</div><div class='add'>+#define __HASHFN_H__</div><div class='add'>+</div><div class='add'>+#include &lt;sys/types.h&gt;</div><div class='add'>+#include &lt;stdint.h&gt;</div><div class='add'>+</div><div class='add'>+uint32_t</div><div class='add'>+SuperFastHash(const char *data, int32_t len);</div><div class='add'>+</div><div class='add'>+uint32_t</div><div class='add'>+gf_dm_hashfn(const char *msg, int len);</div><div class='add'>+</div><div class='add'>+#endif /* __HASHFN_H__ */</div><div class='head'>diff --git a/libglusterfs/src/glusterfs/iatt.h b/libglusterfs/src/glusterfs/iatt.h<br/>new file mode 100644<br/>index 00000000000..f03d68b02f0<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/libglusterfs/src/glusterfs/iatt.h?id=d1d7a6f35c816822fab51c820e25023863c239c1'>libglusterfs/src/glusterfs/iatt.h</a></div><div class='hunk'>@@ -0,0 +1,489 @@</div><div class='add'>+/*</div><div class='add'>+  Copyright (c) 2008-2012 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#ifndef _IATT_H</div><div class='add'>+#define _IATT_H</div><div class='add'>+</div><div class='add'>+#if defined(GF_LINUX_HOST_OS)</div><div class='add'>+#include &lt;sys/sysmacros.h&gt; /* for makedev(3), major(3), minor(3) */</div><div class='add'>+#endif</div><div class='add'>+#include &lt;sys/types.h&gt;</div><div class='add'>+#include &lt;sys/stat.h&gt; /* for iatt &lt;--&gt; stat conversions */</div><div class='add'>+#include &lt;unistd.h&gt;</div><div class='add'>+</div><div class='add'>+#include "glusterfs/compat.h"</div><div class='add'>+#include "glusterfs/compat-uuid.h"</div><div class='add'>+</div><div class='add'>+typedef enum {</div><div class='add'>+    IA_INVAL = 0,</div><div class='add'>+    IA_IFREG,</div><div class='add'>+    IA_IFDIR,</div><div class='add'>+    IA_IFLNK,</div><div class='add'>+    IA_IFBLK,</div><div class='add'>+    IA_IFCHR,</div><div class='add'>+    IA_IFIFO,</div><div class='add'>+    IA_IFSOCK</div><div class='add'>+} ia_type_t;</div><div class='add'>+</div><div class='add'>+typedef struct {</div><div class='add'>+    uint8_t suid : 1;</div><div class='add'>+    uint8_t sgid : 1;</div><div class='add'>+    uint8_t sticky : 1;</div><div class='add'>+    struct {</div><div class='add'>+        uint8_t read : 1;</div><div class='add'>+        uint8_t write : 1;</div><div class='add'>+        uint8_t exec : 1;</div><div class='add'>+    } owner, group, other;</div><div class='add'>+} ia_prot_t;</div><div class='add'>+</div><div class='add'>+struct iatt {</div><div class='add'>+    uint64_t ia_flags;</div><div class='add'>+    uint64_t ia_ino;     /* inode number */</div><div class='add'>+    uint64_t ia_dev;     /* backing device ID */</div><div class='add'>+    uint64_t ia_rdev;    /* device ID (if special file) */</div><div class='add'>+    uint64_t ia_size;    /* file size in bytes */</div><div class='add'>+    uint32_t ia_nlink;   /* Link count */</div><div class='add'>+    uint32_t ia_uid;     /* user ID of owner */</div><div class='add'>+    uint32_t ia_gid;     /* group ID of owner */</div><div class='add'>+    uint32_t ia_blksize; /* blocksize for filesystem I/O */</div><div class='add'>+    uint64_t ia_blocks;  /* number of 512B blocks allocated */</div><div class='add'>+    int64_t ia_atime;    /* last access time */</div><div class='add'>+    int64_t ia_mtime;    /* last modification time */</div><div class='add'>+    int64_t ia_ctime;    /* last status change time */</div><div class='add'>+    int64_t ia_btime;    /* creation time. Fill using statx */</div><div class='add'>+    uint32_t ia_atime_nsec;</div><div class='add'>+    uint32_t ia_mtime_nsec;</div><div class='add'>+    uint32_t ia_ctime_nsec;</div><div class='add'>+    uint32_t ia_btime_nsec;</div><div class='add'>+    uint64_t ia_attributes;      /* chattr related:compressed, immutable,</div><div class='add'>+                                  * append only, encrypted etc.*/</div><div class='add'>+    uint64_t ia_attributes_mask; /* Mask for the attributes */</div><div class='add'>+</div><div class='add'>+    uuid_t ia_gfid;</div><div class='add'>+    ia_type_t ia_type; /* type of file */</div><div class='add'>+    ia_prot_t ia_prot; /* protection */</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct old_iatt {</div><div class='add'>+    uint64_t ia_ino; /* inode number */</div><div class='add'>+    uuid_t ia_gfid;</div><div class='add'>+    uint64_t ia_dev;     /* backing device ID */</div><div class='add'>+    ia_type_t ia_type;   /* type of file */</div><div class='add'>+    ia_prot_t ia_prot;   /* protection */</div><div class='add'>+    uint32_t ia_nlink;   /* Link count */</div><div class='add'>+    uint32_t ia_uid;     /* user ID of owner */</div><div class='add'>+    uint32_t ia_gid;     /* group ID of owner */</div><div class='add'>+    uint64_t ia_rdev;    /* device ID (if special file) */</div><div class='add'>+    uint64_t ia_size;    /* file size in bytes */</div><div class='add'>+    uint32_t ia_blksize; /* blocksize for filesystem I/O */</div><div class='add'>+    uint64_t ia_blocks;  /* number of 512B blocks allocated */</div><div class='add'>+    uint32_t ia_atime;   /* last access time */</div><div class='add'>+    uint32_t ia_atime_nsec;</div><div class='add'>+    uint32_t ia_mtime; /* last modification time */</div><div class='add'>+    uint32_t ia_mtime_nsec;</div><div class='add'>+    uint32_t ia_ctime; /* last status change time */</div><div class='add'>+    uint32_t ia_ctime_nsec;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct mdata_iatt {</div><div class='add'>+    int64_t ia_atime; /* last access time */</div><div class='add'>+    int64_t ia_mtime; /* last modification time */</div><div class='add'>+    int64_t ia_ctime; /* last status change time */</div><div class='add'>+    uint32_t ia_atime_nsec;</div><div class='add'>+    uint32_t ia_mtime_nsec;</div><div class='add'>+    uint32_t ia_ctime_nsec;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+/* 64-bit mask for valid members in struct iatt. */</div><div class='add'>+#define IATT_TYPE 0x0000000000000001U</div><div class='add'>+#define IATT_MODE 0x0000000000000002U</div><div class='add'>+#define IATT_NLINK 0x0000000000000004U</div><div class='add'>+#define IATT_UID 0x0000000000000008U</div><div class='add'>+#define IATT_GID 0x0000000000000010U</div><div class='add'>+#define IATT_ATIME 0x0000000000000020U</div><div class='add'>+#define IATT_MTIME 0x0000000000000040U</div><div class='add'>+#define IATT_CTIME 0x0000000000000080U</div><div class='add'>+#define IATT_INO 0x0000000000000100U</div><div class='add'>+#define IATT_SIZE 0x0000000000000200U</div><div class='add'>+#define IATT_BLOCKS 0x0000000000000400U</div><div class='add'>+#define IATT_BTIME 0x0000000000000800U</div><div class='add'>+#define IATT_GFID 0x0000000000001000U</div><div class='add'>+</div><div class='add'>+/* Macros for checking validity of struct iatt members.*/</div><div class='add'>+#define IATT_TYPE_VALID(iaflags) (iaflags &amp; IATT_TYPE)</div><div class='add'>+#define IATT_MODE_VALID(iaflags) (iaflags &amp; IATT_MODE)</div><div class='add'>+#define IATT_NLINK_VALID(iaflags) (iaflags &amp; IATT_NLINK)</div><div class='add'>+#define IATT_UID_VALID(iaflags) (iaflags &amp; IATT_UID)</div><div class='add'>+#define IATT_GID_VALID(iaflags) (iaflags &amp; IATT_GID)</div><div class='add'>+#define IATT_ATIME_VALID(iaflags) (iaflags &amp; IATT_ATIME)</div><div class='add'>+#define IATT_MTIME_VALID(iaflags) (iaflags &amp; IATT_MTIME)</div><div class='add'>+#define IATT_CTIME_VALID(iaflags) (iaflags &amp; IATT_CTIME)</div><div class='add'>+#define IATT_INO_VALID(iaflags) (iaflags &amp; IATT_INO)</div><div class='add'>+#define IATT_SIZE_VALID(iaflags) (iaflags &amp; IATT_SIZE)</div><div class='add'>+#define IATT_BLOCKS_VALID(iaflags) (iaflags &amp; IATT_BLOCKS)</div><div class='add'>+#define IATT_BTIME_VALID(iaflags) (iaflags &amp; IATT_BTIME)</div><div class='add'>+#define IATT_GFID_VALID(iaflags) (iaflags &amp; IATT_GFID)</div><div class='add'>+</div><div class='add'>+#define IA_ISREG(t) (t == IA_IFREG)</div><div class='add'>+#define IA_ISDIR(t) (t == IA_IFDIR)</div><div class='add'>+#define IA_ISLNK(t) (t == IA_IFLNK)</div><div class='add'>+#define IA_ISBLK(t) (t == IA_IFBLK)</div><div class='add'>+#define IA_ISCHR(t) (t == IA_IFCHR)</div><div class='add'>+#define IA_ISFIFO(t) (t == IA_IFIFO)</div><div class='add'>+#define IA_ISSOCK(t) (t == IA_IFSOCK)</div><div class='add'>+#define IA_ISINVAL(t) (t == IA_INVAL)</div><div class='add'>+</div><div class='add'>+#define IA_PROT_RUSR(prot) ((prot).owner.read == 1)</div><div class='add'>+#define IA_PROT_WUSR(prot) ((prot).owner.write == 1)</div><div class='add'>+#define IA_PROT_XUSR(prot) ((prot).owner.exec == 1)</div><div class='add'>+</div><div class='add'>+#define IA_PROT_RGRP(prot) ((prot).group.read == 1)</div><div class='add'>+#define IA_PROT_WGRP(prot) ((prot).group.write == 1)</div><div class='add'>+#define IA_PROT_XGRP(prot) ((prot).group.exec == 1)</div><div class='add'>+</div><div class='add'>+#define IA_PROT_ROTH(prot) ((prot).other.read == 1)</div><div class='add'>+#define IA_PROT_WOTH(prot) ((prot).other.write == 1)</div><div class='add'>+#define IA_PROT_XOTH(prot) ((prot).other.exec == 1)</div><div class='add'>+</div><div class='add'>+#define IA_PROT_SUID(prot) ((prot).suid == 1)</div><div class='add'>+#define IA_PROT_SGID(prot) ((prot).sgid == 1)</div><div class='add'>+#define IA_PROT_STCKY(prot) ((prot).sticky == 1)</div><div class='add'>+</div><div class='add'>+#define IA_FILE_OR_DIR(t) (IA_ISREG(t) || IA_ISDIR(t))</div><div class='add'>+</div><div class='add'>+static inline uint32_t</div><div class='add'>+ia_major(uint64_t ia_dev)</div><div class='add'>+{</div><div class='add'>+    return (uint32_t)(ia_dev &gt;&gt; 32);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static inline uint32_t</div><div class='add'>+ia_minor(uint64_t ia_dev)</div><div class='add'>+{</div><div class='add'>+    return (uint32_t)(ia_dev &amp; 0xffffffff);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static inline uint64_t</div><div class='add'>+ia_makedev(uint32_t ia_maj, uint32_t ia_min)</div><div class='add'>+{</div><div class='add'>+    return ((((uint64_t)ia_maj) &lt;&lt; 32) | ia_min);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static inline ia_prot_t</div><div class='add'>+ia_prot_from_st_mode(mode_t mode)</div><div class='add'>+{</div><div class='add'>+    ia_prot_t ia_prot = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    if (mode &amp; S_ISUID)</div><div class='add'>+        ia_prot.suid = 1;</div><div class='add'>+    if (mode &amp; S_ISGID)</div><div class='add'>+        ia_prot.sgid = 1;</div><div class='add'>+    if (mode &amp; S_ISVTX)</div><div class='add'>+        ia_prot.sticky = 1;</div><div class='add'>+</div><div class='add'>+    if (mode &amp; S_IRUSR)</div><div class='add'>+        ia_prot.owner.read = 1;</div><div class='add'>+    if (mode &amp; S_IWUSR)</div><div class='add'>+        ia_prot.owner.write = 1;</div><div class='add'>+    if (mode &amp; S_IXUSR)</div><div class='add'>+        ia_prot.owner.exec = 1;</div><div class='add'>+</div><div class='add'>+    if (mode &amp; S_IRGRP)</div><div class='add'>+        ia_prot.group.read = 1;</div><div class='add'>+    if (mode &amp; S_IWGRP)</div><div class='add'>+        ia_prot.group.write = 1;</div><div class='add'>+    if (mode &amp; S_IXGRP)</div><div class='add'>+        ia_prot.group.exec = 1;</div><div class='add'>+</div><div class='add'>+    if (mode &amp; S_IROTH)</div><div class='add'>+        ia_prot.other.read = 1;</div><div class='add'>+    if (mode &amp; S_IWOTH)</div><div class='add'>+        ia_prot.other.write = 1;</div><div class='add'>+    if (mode &amp; S_IXOTH)</div><div class='add'>+        ia_prot.other.exec = 1;</div><div class='add'>+</div><div class='add'>+    return ia_prot;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static inline ia_type_t</div><div class='add'>+ia_type_from_st_mode(mode_t mode)</div><div class='add'>+{</div><div class='add'>+    ia_type_t type = IA_INVAL;</div><div class='add'>+</div><div class='add'>+    if (S_ISREG(mode))</div><div class='add'>+        type = IA_IFREG;</div><div class='add'>+    if (S_ISDIR(mode))</div><div class='add'>+        type = IA_IFDIR;</div><div class='add'>+    if (S_ISLNK(mode))</div><div class='add'>+        type = IA_IFLNK;</div><div class='add'>+    if (S_ISBLK(mode))</div><div class='add'>+        type = IA_IFBLK;</div><div class='add'>+    if (S_ISCHR(mode))</div><div class='add'>+        type = IA_IFCHR;</div><div class='add'>+    if (S_ISFIFO(mode))</div><div class='add'>+        type = IA_IFIFO;</div><div class='add'>+    if (S_ISSOCK(mode))</div><div class='add'>+        type = IA_IFSOCK;</div><div class='add'>+</div><div class='add'>+    return type;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static inline uint32_t</div><div class='add'>+st_mode_prot_from_ia(ia_prot_t prot)</div><div class='add'>+{</div><div class='add'>+    uint32_t prot_bit = 0;</div><div class='add'>+</div><div class='add'>+    if (prot.suid)</div><div class='add'>+        prot_bit |= S_ISUID;</div><div class='add'>+    if (prot.sgid)</div><div class='add'>+        prot_bit |= S_ISGID;</div><div class='add'>+    if (prot.sticky)</div><div class='add'>+        prot_bit |= S_ISVTX;</div><div class='add'>+</div><div class='add'>+    if (prot.owner.read)</div><div class='add'>+        prot_bit |= S_IRUSR;</div><div class='add'>+    if (prot.owner.write)</div><div class='add'>+        prot_bit |= S_IWUSR;</div><div class='add'>+    if (prot.owner.exec)</div><div class='add'>+        prot_bit |= S_IXUSR;</div><div class='add'>+</div><div class='add'>+    if (prot.group.read)</div><div class='add'>+        prot_bit |= S_IRGRP;</div><div class='add'>+    if (prot.group.write)</div><div class='add'>+        prot_bit |= S_IWGRP;</div><div class='add'>+    if (prot.group.exec)</div><div class='add'>+        prot_bit |= S_IXGRP;</div><div class='add'>+</div><div class='add'>+    if (prot.other.read)</div><div class='add'>+        prot_bit |= S_IROTH;</div><div class='add'>+    if (prot.other.write)</div><div class='add'>+        prot_bit |= S_IWOTH;</div><div class='add'>+    if (prot.other.exec)</div><div class='add'>+        prot_bit |= S_IXOTH;</div><div class='add'>+</div><div class='add'>+    return prot_bit;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static inline uint32_t</div><div class='add'>+st_mode_type_from_ia(ia_type_t type)</div><div class='add'>+{</div><div class='add'>+    uint32_t type_bit = 0;</div><div class='add'>+</div><div class='add'>+    switch (type) {</div><div class='add'>+        case IA_IFREG:</div><div class='add'>+            type_bit = S_IFREG;</div><div class='add'>+            break;</div><div class='add'>+        case IA_IFDIR:</div><div class='add'>+            type_bit = S_IFDIR;</div><div class='add'>+            break;</div><div class='add'>+        case IA_IFLNK:</div><div class='add'>+            type_bit = S_IFLNK;</div><div class='add'>+            break;</div><div class='add'>+        case IA_IFBLK:</div><div class='add'>+            type_bit = S_IFBLK;</div><div class='add'>+            break;</div><div class='add'>+        case IA_IFCHR:</div><div class='add'>+            type_bit = S_IFCHR;</div><div class='add'>+            break;</div><div class='add'>+        case IA_IFIFO:</div><div class='add'>+            type_bit = S_IFIFO;</div><div class='add'>+            break;</div><div class='add'>+        case IA_IFSOCK:</div><div class='add'>+            type_bit = S_IFSOCK;</div><div class='add'>+            break;</div><div class='add'>+        case IA_INVAL:</div><div class='add'>+            break;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return type_bit;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static inline mode_t</div><div class='add'>+st_mode_from_ia(ia_prot_t prot, ia_type_t type)</div><div class='add'>+{</div><div class='add'>+    mode_t st_mode = 0;</div><div class='add'>+    uint32_t type_bit = 0;</div><div class='add'>+    uint32_t prot_bit = 0;</div><div class='add'>+</div><div class='add'>+    type_bit = st_mode_type_from_ia(type);</div><div class='add'>+    prot_bit = st_mode_prot_from_ia(prot);</div><div class='add'>+</div><div class='add'>+    st_mode = (type_bit | prot_bit);</div><div class='add'>+</div><div class='add'>+    return st_mode;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static inline void</div><div class='add'>+iatt_to_mdata(struct mdata_iatt *mdata, struct iatt *iatt)</div><div class='add'>+{</div><div class='add'>+    mdata-&gt;ia_atime = iatt-&gt;ia_atime;</div><div class='add'>+    mdata-&gt;ia_atime_nsec = iatt-&gt;ia_atime_nsec;</div><div class='add'>+    mdata-&gt;ia_mtime = iatt-&gt;ia_mtime;</div><div class='add'>+    mdata-&gt;ia_mtime_nsec = iatt-&gt;ia_mtime_nsec;</div><div class='add'>+    mdata-&gt;ia_ctime = iatt-&gt;ia_ctime;</div><div class='add'>+    mdata-&gt;ia_ctime_nsec = iatt-&gt;ia_ctime_nsec;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static inline int</div><div class='add'>+iatt_from_stat(struct iatt *iatt, struct stat *stat)</div><div class='add'>+{</div><div class='add'>+    iatt-&gt;ia_dev = stat-&gt;st_dev;</div><div class='add'>+    iatt-&gt;ia_ino = stat-&gt;st_ino;</div><div class='add'>+</div><div class='add'>+    iatt-&gt;ia_type = ia_type_from_st_mode(stat-&gt;st_mode);</div><div class='add'>+    iatt-&gt;ia_prot = ia_prot_from_st_mode(stat-&gt;st_mode);</div><div class='add'>+</div><div class='add'>+    iatt-&gt;ia_nlink = stat-&gt;st_nlink;</div><div class='add'>+    iatt-&gt;ia_uid = stat-&gt;st_uid;</div><div class='add'>+    iatt-&gt;ia_gid = stat-&gt;st_gid;</div><div class='add'>+</div><div class='add'>+    iatt-&gt;ia_rdev = ia_makedev(major(stat-&gt;st_rdev), minor(stat-&gt;st_rdev));</div><div class='add'>+</div><div class='add'>+    iatt-&gt;ia_size = stat-&gt;st_size;</div><div class='add'>+    iatt-&gt;ia_blksize = stat-&gt;st_blksize;</div><div class='add'>+    iatt-&gt;ia_blocks = stat-&gt;st_blocks;</div><div class='add'>+</div><div class='add'>+    /* There is a possibility that the backend FS (like XFS) can</div><div class='add'>+       allocate blocks beyond EOF for better performance reasons, which</div><div class='add'>+       results in 'st_blocks' with higher values than what is consumed by</div><div class='add'>+       the file descriptor. This would break few logic inside GlusterFS,</div><div class='add'>+       like quota behavior etc, thus we need the exact number of blocks</div><div class='add'>+       which are consumed by the file to the higher layers inside GlusterFS.</div><div class='add'>+       Currently, this logic won't work for sparse files (ie, file with</div><div class='add'>+       holes)</div><div class='add'>+    */</div><div class='add'>+    {</div><div class='add'>+        uint64_t maxblocks;</div><div class='add'>+</div><div class='add'>+        maxblocks = (iatt-&gt;ia_size + 511) / 512;</div><div class='add'>+</div><div class='add'>+        if (iatt-&gt;ia_blocks &gt; maxblocks)</div><div class='add'>+            iatt-&gt;ia_blocks = maxblocks;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    iatt-&gt;ia_atime = stat-&gt;st_atime;</div><div class='add'>+    iatt-&gt;ia_atime_nsec = ST_ATIM_NSEC(stat);</div><div class='add'>+</div><div class='add'>+    iatt-&gt;ia_mtime = stat-&gt;st_mtime;</div><div class='add'>+    iatt-&gt;ia_mtime_nsec = ST_MTIM_NSEC(stat);</div><div class='add'>+</div><div class='add'>+    iatt-&gt;ia_ctime = stat-&gt;st_ctime;</div><div class='add'>+    iatt-&gt;ia_ctime_nsec = ST_CTIM_NSEC(stat);</div><div class='add'>+</div><div class='add'>+    /* Setting IATT_INO in ia_flags is done in posix_fill_ino_from_gfid. */</div><div class='add'>+    iatt-&gt;ia_flags = iatt-&gt;ia_flags | IATT_TYPE | IATT_MODE | IATT_NLINK |</div><div class='add'>+                     IATT_UID | IATT_GID | IATT_SIZE | IATT_BLOCKS |</div><div class='add'>+                     IATT_ATIME | IATT_MTIME | IATT_CTIME;</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static inline int</div><div class='add'>+iatt_to_stat(struct iatt *iatt, struct stat *stat)</div><div class='add'>+{</div><div class='add'>+    stat-&gt;st_dev = iatt-&gt;ia_dev;</div><div class='add'>+    stat-&gt;st_ino = iatt-&gt;ia_ino;</div><div class='add'>+</div><div class='add'>+    stat-&gt;st_mode = st_mode_from_ia(iatt-&gt;ia_prot, iatt-&gt;ia_type);</div><div class='add'>+</div><div class='add'>+    stat-&gt;st_nlink = iatt-&gt;ia_nlink;</div><div class='add'>+    stat-&gt;st_uid = iatt-&gt;ia_uid;</div><div class='add'>+    stat-&gt;st_gid = iatt-&gt;ia_gid;</div><div class='add'>+</div><div class='add'>+    stat-&gt;st_rdev = makedev(ia_major(iatt-&gt;ia_rdev), ia_minor(iatt-&gt;ia_rdev));</div><div class='add'>+</div><div class='add'>+    stat-&gt;st_size = iatt-&gt;ia_size;</div><div class='add'>+    stat-&gt;st_blksize = iatt-&gt;ia_blksize;</div><div class='add'>+    stat-&gt;st_blocks = iatt-&gt;ia_blocks;</div><div class='add'>+</div><div class='add'>+    stat-&gt;st_atime = iatt-&gt;ia_atime;</div><div class='add'>+    ST_ATIM_NSEC_SET(stat, iatt-&gt;ia_atime_nsec);</div><div class='add'>+</div><div class='add'>+    stat-&gt;st_mtime = iatt-&gt;ia_mtime;</div><div class='add'>+    ST_MTIM_NSEC_SET(stat, iatt-&gt;ia_mtime_nsec);</div><div class='add'>+</div><div class='add'>+    stat-&gt;st_ctime = iatt-&gt;ia_ctime;</div><div class='add'>+    ST_CTIM_NSEC_SET(stat, iatt-&gt;ia_ctime_nsec);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static inline void</div><div class='add'>+oldiatt_from_iatt(struct old_iatt *o_iatt, struct iatt *c_iatt)</div><div class='add'>+{</div><div class='add'>+    o_iatt-&gt;ia_dev = c_iatt-&gt;ia_dev;</div><div class='add'>+    o_iatt-&gt;ia_ino = c_iatt-&gt;ia_ino;</div><div class='add'>+    o_iatt-&gt;ia_type = c_iatt-&gt;ia_type;</div><div class='add'>+    o_iatt-&gt;ia_prot = c_iatt-&gt;ia_prot;</div><div class='add'>+    o_iatt-&gt;ia_nlink = c_iatt-&gt;ia_nlink;</div><div class='add'>+    o_iatt-&gt;ia_uid = c_iatt-&gt;ia_uid;</div><div class='add'>+    o_iatt-&gt;ia_gid = c_iatt-&gt;ia_gid;</div><div class='add'>+    o_iatt-&gt;ia_rdev = c_iatt-&gt;ia_rdev;</div><div class='add'>+    o_iatt-&gt;ia_size = c_iatt-&gt;ia_size;</div><div class='add'>+    o_iatt-&gt;ia_blksize = c_iatt-&gt;ia_blksize;</div><div class='add'>+    o_iatt-&gt;ia_blocks = c_iatt-&gt;ia_blocks;</div><div class='add'>+    o_iatt-&gt;ia_atime = c_iatt-&gt;ia_atime;</div><div class='add'>+    o_iatt-&gt;ia_atime_nsec = c_iatt-&gt;ia_atime_nsec;</div><div class='add'>+    o_iatt-&gt;ia_mtime = c_iatt-&gt;ia_mtime;</div><div class='add'>+    o_iatt-&gt;ia_mtime_nsec = c_iatt-&gt;ia_mtime_nsec;</div><div class='add'>+    o_iatt-&gt;ia_ctime = c_iatt-&gt;ia_ctime;</div><div class='add'>+    o_iatt-&gt;ia_ctime_nsec = c_iatt-&gt;ia_ctime_nsec;</div><div class='add'>+</div><div class='add'>+    gf_uuid_copy(o_iatt-&gt;ia_gfid, c_iatt-&gt;ia_gfid);</div><div class='add'>+</div><div class='add'>+    return;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static inline void</div><div class='add'>+iatt_from_oldiatt(struct iatt *c_iatt, struct old_iatt *o_iatt)</div><div class='add'>+{</div><div class='add'>+    c_iatt-&gt;ia_dev = o_iatt-&gt;ia_dev;</div><div class='add'>+    c_iatt-&gt;ia_ino = o_iatt-&gt;ia_ino;</div><div class='add'>+    c_iatt-&gt;ia_type = o_iatt-&gt;ia_type;</div><div class='add'>+    c_iatt-&gt;ia_prot = o_iatt-&gt;ia_prot;</div><div class='add'>+    c_iatt-&gt;ia_nlink = o_iatt-&gt;ia_nlink;</div><div class='add'>+    c_iatt-&gt;ia_uid = o_iatt-&gt;ia_uid;</div><div class='add'>+    c_iatt-&gt;ia_gid = o_iatt-&gt;ia_gid;</div><div class='add'>+    c_iatt-&gt;ia_rdev = o_iatt-&gt;ia_rdev;</div><div class='add'>+    c_iatt-&gt;ia_size = o_iatt-&gt;ia_size;</div><div class='add'>+    c_iatt-&gt;ia_blksize = o_iatt-&gt;ia_blksize;</div><div class='add'>+    c_iatt-&gt;ia_blocks = o_iatt-&gt;ia_blocks;</div><div class='add'>+    c_iatt-&gt;ia_atime = o_iatt-&gt;ia_atime;</div><div class='add'>+    c_iatt-&gt;ia_atime_nsec = o_iatt-&gt;ia_atime_nsec;</div><div class='add'>+    c_iatt-&gt;ia_mtime = o_iatt-&gt;ia_mtime;</div><div class='add'>+    c_iatt-&gt;ia_mtime_nsec = o_iatt-&gt;ia_mtime_nsec;</div><div class='add'>+    c_iatt-&gt;ia_ctime = o_iatt-&gt;ia_ctime;</div><div class='add'>+    c_iatt-&gt;ia_ctime_nsec = o_iatt-&gt;ia_ctime_nsec;</div><div class='add'>+</div><div class='add'>+    gf_uuid_copy(c_iatt-&gt;ia_gfid, o_iatt-&gt;ia_gfid);</div><div class='add'>+</div><div class='add'>+    c_iatt-&gt;ia_attributes = 0;</div><div class='add'>+</div><div class='add'>+    c_iatt-&gt;ia_flags = IATT_TYPE | IATT_MODE | IATT_NLINK | IATT_INO |</div><div class='add'>+                       IATT_UID | IATT_GID | IATT_SIZE | IATT_BLOCKS |</div><div class='add'>+                       IATT_ATIME | IATT_MTIME | IATT_CTIME | IATT_GFID;</div><div class='add'>+</div><div class='add'>+    return;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static inline int</div><div class='add'>+is_same_mode(ia_prot_t prot1, ia_prot_t prot2)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    if (st_mode_prot_from_ia(prot1) != st_mode_prot_from_ia(prot2))</div><div class='add'>+        ret = -1;</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#endif /* _IATT_H */</div><div class='head'>diff --git a/libglusterfs/src/glusterfs/inode.h b/libglusterfs/src/glusterfs/inode.h<br/>new file mode 100644<br/>index 00000000000..4b28da510c7<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/libglusterfs/src/glusterfs/inode.h?id=d1d7a6f35c816822fab51c820e25023863c239c1'>libglusterfs/src/glusterfs/inode.h</a></div><div class='hunk'>@@ -0,0 +1,306 @@</div><div class='add'>+/*</div><div class='add'>+  Copyright (c) 2008-2012 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#ifndef _INODE_H</div><div class='add'>+#define _INODE_H</div><div class='add'>+</div><div class='add'>+#include &lt;stdint.h&gt;</div><div class='add'>+#include &lt;sys/types.h&gt;</div><div class='add'>+</div><div class='add'>+#define LOOKUP_NEEDED 1</div><div class='add'>+#define LOOKUP_NOT_NEEDED 2</div><div class='add'>+</div><div class='add'>+#define DEFAULT_INODE_MEMPOOL_ENTRIES 32 * 1024</div><div class='add'>+#define INODE_PATH_FMT "&lt;gfid:%s&gt;"</div><div class='add'>+struct _inode_table;</div><div class='add'>+typedef struct _inode_table inode_table_t;</div><div class='add'>+</div><div class='add'>+struct _inode;</div><div class='add'>+typedef struct _inode inode_t;</div><div class='add'>+</div><div class='add'>+struct _dentry;</div><div class='add'>+typedef struct _dentry dentry_t;</div><div class='add'>+</div><div class='add'>+#include "glusterfs/list.h"</div><div class='add'>+#include "glusterfs/iatt.h"</div><div class='add'>+#include "glusterfs/compat-uuid.h"</div><div class='add'>+#include "glusterfs/fd.h"</div><div class='add'>+</div><div class='add'>+struct _inode_table {</div><div class='add'>+    pthread_mutex_t lock;</div><div class='add'>+    size_t hashsize;    /* bucket size of inode hash and dentry hash */</div><div class='add'>+    char *name;         /* name of the inode table, just for gf_log() */</div><div class='add'>+    inode_t *root;      /* root directory inode, with number 1 */</div><div class='add'>+    xlator_t *xl;       /* xlator to be called to do purge */</div><div class='add'>+    uint32_t lru_limit; /* maximum LRU cache size */</div><div class='add'>+    struct list_head *inode_hash; /* buckets for inode hash table */</div><div class='add'>+    struct list_head *name_hash;  /* buckets for dentry hash table */</div><div class='add'>+    struct list_head active; /* list of inodes currently active (in an fop) */</div><div class='add'>+    uint32_t active_size;    /* count of inodes in active list */</div><div class='add'>+    struct list_head lru;    /* list of inodes recently used.</div><div class='add'>+                                lru.next most recent */</div><div class='add'>+    uint32_t lru_size;       /* count of inodes in lru list  */</div><div class='add'>+    struct list_head purge;  /* list of inodes to be purged soon */</div><div class='add'>+    uint32_t purge_size;     /* count of inodes in purge list */</div><div class='add'>+</div><div class='add'>+    struct mem_pool *inode_pool;  /* memory pool for inodes */</div><div class='add'>+    struct mem_pool *dentry_pool; /* memory pool for dentrys */</div><div class='add'>+    struct mem_pool *fd_mem_pool; /* memory pool for fd_t */</div><div class='add'>+    int ctxcount;                 /* number of slots in inode-&gt;ctx */</div><div class='add'>+</div><div class='add'>+    /* This is required for 'invalidation' when 'nlookup' would be used,</div><div class='add'>+       specially in case of fuse-bridge */</div><div class='add'>+    int32_t (*invalidator_fn)(xlator_t *, inode_t *);</div><div class='add'>+    xlator_t *invalidator_xl;</div><div class='add'>+    struct list_head invalidate; /* inodes which are in invalidation queue */</div><div class='add'>+    uint32_t invalidate_size;    /* count of inodes in invalidation list */</div><div class='add'>+</div><div class='add'>+    /* flag to indicate whether the cleanup of the inode</div><div class='add'>+       table started or not */</div><div class='add'>+    gf_boolean_t cleanup_started;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct _dentry {</div><div class='add'>+    struct list_head inode_list; /* list of dentries of inode */</div><div class='add'>+    struct list_head hash;       /* hash table pointers */</div><div class='add'>+    inode_t *inode;              /* inode of this directory entry */</div><div class='add'>+    char *name;                  /* name of the directory entry */</div><div class='add'>+    inode_t *parent;             /* directory of the entry */</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct _inode_ctx {</div><div class='add'>+    union {</div><div class='add'>+        uint64_t key;</div><div class='add'>+        xlator_t *xl_key;</div><div class='add'>+    };</div><div class='add'>+    /* if value1 is 0, then field is not set.. */</div><div class='add'>+    union {</div><div class='add'>+        uint64_t value1;</div><div class='add'>+        void *ptr1;</div><div class='add'>+    };</div><div class='add'>+    /* if value2 is 0, then field is not set.. */</div><div class='add'>+    union {</div><div class='add'>+        uint64_t value2;</div><div class='add'>+        void *ptr2;</div><div class='add'>+    };</div><div class='add'>+    int ref; /* This is for debugging inode ref leaks,</div><div class='add'>+                basically helps in identifying the xlator</div><div class='add'>+                causing th ref leak, it is printed in</div><div class='add'>+                statedump */</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct _inode {</div><div class='add'>+    inode_table_t *table; /* the table this inode belongs to */</div><div class='add'>+    uuid_t gfid;</div><div class='add'>+    gf_lock_t lock;</div><div class='add'>+    gf_atomic_t nlookup;</div><div class='add'>+    uint32_t fd_count;            /* Open fd count */</div><div class='add'>+    uint32_t active_fd_count;     /* Active open fd count */</div><div class='add'>+    uint32_t ref;                 /* reference count on this inode */</div><div class='add'>+    ia_type_t ia_type;            /* what kind of file */</div><div class='add'>+    struct list_head fd_list;     /* list of open files on this inode */</div><div class='add'>+    struct list_head dentry_list; /* list of directory entries for this inode */</div><div class='add'>+    struct list_head hash;        /* hash table pointers */</div><div class='add'>+    struct list_head list;        /* active/lru/purge */</div><div class='add'>+</div><div class='add'>+    struct _inode_ctx *_ctx; /* replacement for dict_t *(inode-&gt;ctx) */</div><div class='add'>+    bool in_invalidate_list; /* Set if inode is in table invalidate list */</div><div class='add'>+    bool invalidate_sent;    /* Set it if invalidator_fn is called for inode */</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+#define UUID0_STR "00000000-0000-0000-0000-000000000000"</div><div class='add'>+#define GFID_STR_PFX "&lt;gfid:" UUID0_STR "&gt;"</div><div class='add'>+#define GFID_STR_PFX_LEN (sizeof(GFID_STR_PFX) - 1)</div><div class='add'>+</div><div class='add'>+inode_table_t *</div><div class='add'>+inode_table_new(uint32_t lru_limit, xlator_t *xl);</div><div class='add'>+</div><div class='add'>+inode_table_t *</div><div class='add'>+inode_table_with_invalidator(uint32_t lru_limit, xlator_t *xl,</div><div class='add'>+                             int32_t (*invalidator_fn)(xlator_t *, inode_t *),</div><div class='add'>+                             xlator_t *invalidator_xl);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+inode_table_destroy_all(glusterfs_ctx_t *ctx);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+inode_table_destroy(inode_table_t *inode_table);</div><div class='add'>+</div><div class='add'>+inode_t *</div><div class='add'>+inode_new(inode_table_t *table);</div><div class='add'>+</div><div class='add'>+inode_t *</div><div class='add'>+inode_link(inode_t *inode, inode_t *parent, const char *name,</div><div class='add'>+           struct iatt *stbuf);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+inode_unlink(inode_t *inode, inode_t *parent, const char *name);</div><div class='add'>+</div><div class='add'>+inode_t *</div><div class='add'>+inode_parent(inode_t *inode, uuid_t pargfid, const char *name);</div><div class='add'>+</div><div class='add'>+inode_t *</div><div class='add'>+inode_ref(inode_t *inode);</div><div class='add'>+</div><div class='add'>+inode_t *</div><div class='add'>+inode_unref(inode_t *inode);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+inode_lookup(inode_t *inode);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+inode_forget(inode_t *inode, uint64_t nlookup);</div><div class='add'>+int</div><div class='add'>+inode_forget_with_unref(inode_t *inode, uint64_t nlookup);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+inode_ref_reduce_by_n(inode_t *inode, uint64_t nref);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+inode_invalidate(inode_t *inode);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+inode_rename(inode_table_t *table, inode_t *olddir, const char *oldname,</div><div class='add'>+             inode_t *newdir, const char *newname, inode_t *inode,</div><div class='add'>+             struct iatt *stbuf);</div><div class='add'>+</div><div class='add'>+inode_t *</div><div class='add'>+inode_grep(inode_table_t *table, inode_t *parent, const char *name);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+inode_grep_for_gfid(inode_table_t *table, inode_t *parent, const char *name,</div><div class='add'>+                    uuid_t gfid, ia_type_t *type);</div><div class='add'>+</div><div class='add'>+inode_t *</div><div class='add'>+inode_find(inode_table_t *table, uuid_t gfid);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+inode_path(inode_t *inode, const char *name, char **bufp);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+__inode_path(inode_t *inode, const char *name, char **bufp);</div><div class='add'>+</div><div class='add'>+inode_t *</div><div class='add'>+inode_from_path(inode_table_t *table, const char *path);</div><div class='add'>+</div><div class='add'>+inode_t *</div><div class='add'>+inode_resolve(inode_table_t *table, char *path);</div><div class='add'>+</div><div class='add'>+/* deal with inode ctx's both values */</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+inode_ctx_set2(inode_t *inode, xlator_t *xlator, uint64_t *value1,</div><div class='add'>+               uint64_t *value2);</div><div class='add'>+int</div><div class='add'>+__inode_ctx_set2(inode_t *inode, xlator_t *xlator, uint64_t *value1,</div><div class='add'>+                 uint64_t *value2);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+inode_ctx_get2(inode_t *inode, xlator_t *xlator, uint64_t *value1,</div><div class='add'>+               uint64_t *value2);</div><div class='add'>+int</div><div class='add'>+__inode_ctx_get2(inode_t *inode, xlator_t *xlator, uint64_t *value1,</div><div class='add'>+                 uint64_t *value2);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+inode_ctx_del2(inode_t *inode, xlator_t *xlator, uint64_t *value1,</div><div class='add'>+               uint64_t *value2);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+inode_ctx_reset2(inode_t *inode, xlator_t *xlator, uint64_t *value1,</div><div class='add'>+                 uint64_t *value2);</div><div class='add'>+</div><div class='add'>+/* deal with inode ctx's 1st value */</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+inode_ctx_set0(inode_t *inode, xlator_t *xlator, uint64_t *value1);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+__inode_ctx_set0(inode_t *inode, xlator_t *xlator, uint64_t *value1);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+inode_ctx_get0(inode_t *inode, xlator_t *xlator, uint64_t *value1);</div><div class='add'>+int</div><div class='add'>+__inode_ctx_get0(inode_t *inode, xlator_t *xlator, uint64_t *value1);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+inode_ctx_reset0(inode_t *inode, xlator_t *xlator, uint64_t *value1);</div><div class='add'>+</div><div class='add'>+/* deal with inode ctx's 2st value */</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+inode_ctx_set1(inode_t *inode, xlator_t *xlator, uint64_t *value2);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+__inode_ctx_set1(inode_t *inode, xlator_t *xlator, uint64_t *value2);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+inode_ctx_get1(inode_t *inode, xlator_t *xlator, uint64_t *value2);</div><div class='add'>+int</div><div class='add'>+__inode_ctx_get1(inode_t *inode, xlator_t *xlator, uint64_t *value2);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+inode_ctx_reset1(inode_t *inode, xlator_t *xlator, uint64_t *value2);</div><div class='add'>+</div><div class='add'>+static inline int</div><div class='add'>+__inode_ctx_put(inode_t *inode, xlator_t *this, uint64_t v)</div><div class='add'>+{</div><div class='add'>+    return __inode_ctx_set0(inode, this, &amp;v);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static inline int</div><div class='add'>+inode_ctx_put(inode_t *inode, xlator_t *this, uint64_t v)</div><div class='add'>+{</div><div class='add'>+    return inode_ctx_set0(inode, this, &amp;v);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#define __inode_ctx_set(i, x, v_p) __inode_ctx_set0(i, x, v_p)</div><div class='add'>+</div><div class='add'>+#define inode_ctx_set(i, x, v_p) inode_ctx_set0(i, x, v_p)</div><div class='add'>+</div><div class='add'>+#define inode_ctx_reset(i, x, v) inode_ctx_reset0(i, x, v)</div><div class='add'>+</div><div class='add'>+#define __inode_ctx_get(i, x, v) __inode_ctx_get0(i, x, v)</div><div class='add'>+</div><div class='add'>+#define inode_ctx_get(i, x, v) inode_ctx_get0(i, x, v)</div><div class='add'>+</div><div class='add'>+#define inode_ctx_del(i, x, v) inode_ctx_del2(i, x, v, 0)</div><div class='add'>+#define inode_ctx_del1(i, x, v) inode_ctx_del2(i, x, 0, v)</div><div class='add'>+</div><div class='add'>+gf_boolean_t</div><div class='add'>+__is_root_gfid(uuid_t gfid);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+__inode_table_set_lru_limit(inode_table_t *table, uint32_t lru_limit);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+inode_table_set_lru_limit(inode_table_t *table, uint32_t lru_limit);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+inode_ctx_merge(fd_t *fd, inode_t *inode, inode_t *linked_inode);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+inode_is_linked(inode_t *inode);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+inode_set_need_lookup(inode_t *inode, xlator_t *this);</div><div class='add'>+</div><div class='add'>+gf_boolean_t</div><div class='add'>+inode_needs_lookup(inode_t *inode, xlator_t *this);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+inode_has_dentry(inode_t *inode);</div><div class='add'>+</div><div class='add'>+size_t</div><div class='add'>+inode_ctx_size(inode_t *inode);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+inode_find_directory_name(inode_t *inode, const char **name);</div><div class='add'>+#endif /* _INODE_H */</div><div class='head'>diff --git a/libglusterfs/src/glusterfs/iobuf.h b/libglusterfs/src/glusterfs/iobuf.h<br/>new file mode 100644<br/>index 00000000000..4bd443efd5e<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/libglusterfs/src/glusterfs/iobuf.h?id=d1d7a6f35c816822fab51c820e25023863c239c1'>libglusterfs/src/glusterfs/iobuf.h</a></div><div class='hunk'>@@ -0,0 +1,194 @@</div><div class='add'>+/*</div><div class='add'>+  Copyright (c) 2008-2012 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#ifndef _IOBUF_H_</div><div class='add'>+#define _IOBUF_H_</div><div class='add'>+</div><div class='add'>+#include &lt;stddef.h&gt;  // for size_t</div><div class='add'>+#include &lt;sys/mman.h&gt;</div><div class='add'>+#include "glusterfs/atomic.h"   // for gf_atomic_t</div><div class='add'>+#include &lt;sys/uio.h&gt;            // for struct iovec</div><div class='add'>+#include "glusterfs/locking.h"  // for gf_lock_t</div><div class='add'>+#include "glusterfs/list.h"</div><div class='add'>+</div><div class='add'>+#define GF_VARIABLE_IOBUF_COUNT 32</div><div class='add'>+</div><div class='add'>+#define GF_RDMA_DEVICE_COUNT 8</div><div class='add'>+</div><div class='add'>+/* Lets try to define the new anonymous mapping</div><div class='add'>+ * flag, in case the system is still using the</div><div class='add'>+ * now deprecated MAP_ANON flag.</div><div class='add'>+ *</div><div class='add'>+ * Also, this should ideally be in a centralized/common</div><div class='add'>+ * header which can be used by other source files also.</div><div class='add'>+ */</div><div class='add'>+#ifndef MAP_ANONYMOUS</div><div class='add'>+#define MAP_ANONYMOUS MAP_ANON</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#define GF_ALIGN_BUF(ptr, bound)                                               \</div><div class='add'>+    ((void *)((unsigned long)(ptr + bound - 1) &amp; (unsigned long)(~(bound - 1))))</div><div class='add'>+</div><div class='add'>+#define GF_IOBUF_ALIGN_SIZE 512</div><div class='add'>+</div><div class='add'>+/* one allocatable unit for the consumers of the IOBUF API */</div><div class='add'>+/* each unit hosts @page_size bytes of memory */</div><div class='add'>+struct iobuf;</div><div class='add'>+</div><div class='add'>+/* one region of memory mapped from the operating system */</div><div class='add'>+/* each region MMAPs @arena_size bytes of memory */</div><div class='add'>+/* each arena hosts @arena_size / @page_size IOBUFs */</div><div class='add'>+struct iobuf_arena;</div><div class='add'>+</div><div class='add'>+/* expandable and contractable pool of memory, internally broken into arenas */</div><div class='add'>+struct iobuf_pool;</div><div class='add'>+</div><div class='add'>+struct iobuf_init_config {</div><div class='add'>+    size_t pagesize;</div><div class='add'>+    int32_t num_pages;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct iobuf {</div><div class='add'>+    union {</div><div class='add'>+        struct list_head list;</div><div class='add'>+        struct {</div><div class='add'>+            struct iobuf *next;</div><div class='add'>+            struct iobuf *prev;</div><div class='add'>+        };</div><div class='add'>+    };</div><div class='add'>+    struct iobuf_arena *iobuf_arena;</div><div class='add'>+</div><div class='add'>+    gf_lock_t lock;  /* for -&gt;ptr and -&gt;ref */</div><div class='add'>+    gf_atomic_t ref; /* 0 == passive, &gt;0 == active */</div><div class='add'>+</div><div class='add'>+    void *ptr; /* usable memory region by the consumer */</div><div class='add'>+</div><div class='add'>+    void *free_ptr; /* in case of stdalloc, this is the</div><div class='add'>+                       one to be freed */</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct iobuf_arena {</div><div class='add'>+    union {</div><div class='add'>+        struct list_head list;</div><div class='add'>+        struct {</div><div class='add'>+            struct iobuf_arena *next;</div><div class='add'>+            struct iobuf_arena *prev;</div><div class='add'>+        };</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    struct list_head all_list;</div><div class='add'>+    size_t page_size; /* size of all iobufs in this arena */</div><div class='add'>+    size_t arena_size;</div><div class='add'>+    /* this is equal to rounded_size * num_iobufs.</div><div class='add'>+       (rounded_size comes with gf_iobuf_get_pagesize().) */</div><div class='add'>+    size_t page_count;</div><div class='add'>+</div><div class='add'>+    struct iobuf_pool *iobuf_pool;</div><div class='add'>+</div><div class='add'>+    void *mem_base;</div><div class='add'>+    struct iobuf *iobufs; /* allocated iobufs list */</div><div class='add'>+</div><div class='add'>+    struct iobuf active;  /* head node iobuf</div><div class='add'>+                             (unused by itself) */</div><div class='add'>+    struct iobuf passive; /* head node iobuf</div><div class='add'>+                             (unused by itself) */</div><div class='add'>+    uint64_t alloc_cnt;   /* total allocs in this pool */</div><div class='add'>+    int active_cnt;</div><div class='add'>+    int passive_cnt;</div><div class='add'>+    int max_active; /* max active buffers at a given time */</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct iobuf_pool {</div><div class='add'>+    pthread_mutex_t mutex;</div><div class='add'>+    size_t arena_size;        /* size of memory region in</div><div class='add'>+                                 arena */</div><div class='add'>+    size_t default_page_size; /* default size of iobuf */</div><div class='add'>+</div><div class='add'>+    struct list_head all_arenas;</div><div class='add'>+    struct list_head arenas[GF_VARIABLE_IOBUF_COUNT];</div><div class='add'>+    /* array of arenas. Each element of the array is a list of arenas</div><div class='add'>+       holding iobufs of particular page_size */</div><div class='add'>+</div><div class='add'>+    struct list_head filled[GF_VARIABLE_IOBUF_COUNT];</div><div class='add'>+    /* array of arenas without free iobufs */</div><div class='add'>+</div><div class='add'>+    struct list_head purge[GF_VARIABLE_IOBUF_COUNT];</div><div class='add'>+    /* array of of arenas which can be purged */</div><div class='add'>+</div><div class='add'>+    uint64_t request_misses; /* mostly the requests for higher</div><div class='add'>+                               value of iobufs */</div><div class='add'>+    int arena_cnt;</div><div class='add'>+    int rdma_device_count;</div><div class='add'>+    struct list_head *mr_list[GF_RDMA_DEVICE_COUNT];</div><div class='add'>+    void *device[GF_RDMA_DEVICE_COUNT];</div><div class='add'>+    int (*rdma_registration)(void **, void *);</div><div class='add'>+    int (*rdma_deregistration)(struct list_head **, struct iobuf_arena *);</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct iobuf_pool *</div><div class='add'>+iobuf_pool_new(void);</div><div class='add'>+void</div><div class='add'>+iobuf_pool_destroy(struct iobuf_pool *iobuf_pool);</div><div class='add'>+struct iobuf *</div><div class='add'>+iobuf_get(struct iobuf_pool *iobuf_pool);</div><div class='add'>+void</div><div class='add'>+iobuf_unref(struct iobuf *iobuf);</div><div class='add'>+struct iobuf *</div><div class='add'>+iobuf_ref(struct iobuf *iobuf);</div><div class='add'>+void</div><div class='add'>+iobuf_pool_destroy(struct iobuf_pool *iobuf_pool);</div><div class='add'>+void</div><div class='add'>+iobuf_to_iovec(struct iobuf *iob, struct iovec *iov);</div><div class='add'>+</div><div class='add'>+#define iobuf_ptr(iob) ((iob)-&gt;ptr)</div><div class='add'>+#define iobpool_default_pagesize(iobpool) ((iobpool)-&gt;default_page_size)</div><div class='add'>+#define iobuf_pagesize(iob) (iob-&gt;iobuf_arena-&gt;page_size)</div><div class='add'>+</div><div class='add'>+struct iobref {</div><div class='add'>+    gf_lock_t lock;</div><div class='add'>+    gf_atomic_t ref;</div><div class='add'>+    struct iobuf **iobrefs;</div><div class='add'>+    int allocated;</div><div class='add'>+    int used;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct iobref *</div><div class='add'>+iobref_new(void);</div><div class='add'>+struct iobref *</div><div class='add'>+iobref_ref(struct iobref *iobref);</div><div class='add'>+void</div><div class='add'>+iobref_unref(struct iobref *iobref);</div><div class='add'>+int</div><div class='add'>+iobref_add(struct iobref *iobref, struct iobuf *iobuf);</div><div class='add'>+int</div><div class='add'>+iobref_merge(struct iobref *to, struct iobref *from);</div><div class='add'>+void</div><div class='add'>+iobref_clear(struct iobref *iobref);</div><div class='add'>+</div><div class='add'>+size_t</div><div class='add'>+iobuf_size(struct iobuf *iobuf);</div><div class='add'>+size_t</div><div class='add'>+iobref_size(struct iobref *iobref);</div><div class='add'>+void</div><div class='add'>+iobuf_stats_dump(struct iobuf_pool *iobuf_pool);</div><div class='add'>+</div><div class='add'>+struct iobuf *</div><div class='add'>+iobuf_get2(struct iobuf_pool *iobuf_pool, size_t page_size);</div><div class='add'>+</div><div class='add'>+struct iobuf *</div><div class='add'>+iobuf_get_page_aligned(struct iobuf_pool *iobuf_pool, size_t page_size,</div><div class='add'>+                       size_t align_size);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+iobuf_copy(struct iobuf_pool *iobuf_pool, const struct iovec *iovec_src,</div><div class='add'>+           int iovcnt, struct iobref **iobref, struct iobuf **iobuf,</div><div class='add'>+           struct iovec *iov_dst);</div><div class='add'>+</div><div class='add'>+#endif /* !_IOBUF_H_ */</div><div class='head'>diff --git a/libglusterfs/src/glusterfs/latency.h b/libglusterfs/src/glusterfs/latency.h<br/>new file mode 100644<br/>index 00000000000..4d601bbcbd6<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/libglusterfs/src/glusterfs/latency.h?id=d1d7a6f35c816822fab51c820e25023863c239c1'>libglusterfs/src/glusterfs/latency.h</a></div><div class='hunk'>@@ -0,0 +1,33 @@</div><div class='add'>+/*</div><div class='add'>+  Copyright (c) 2008-2012 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#ifndef __LATENCY_H__</div><div class='add'>+#define __LATENCY_H__</div><div class='add'>+</div><div class='add'>+#include &lt;inttypes.h&gt;</div><div class='add'>+#include &lt;time.h&gt;</div><div class='add'>+</div><div class='add'>+typedef struct _gf_latency {</div><div class='add'>+    uint64_t min;   /* min time for the call (nanoseconds) */</div><div class='add'>+    uint64_t max;   /* max time for the call (nanoseconds) */</div><div class='add'>+    uint64_t total; /* total time (nanoseconds) */</div><div class='add'>+    uint64_t count;</div><div class='add'>+} gf_latency_t;</div><div class='add'>+</div><div class='add'>+gf_latency_t *</div><div class='add'>+gf_latency_new(size_t n);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+gf_latency_reset(gf_latency_t *lat);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+gf_latency_update(gf_latency_t *lat, struct timespec *begin,</div><div class='add'>+                  struct timespec *end);</div><div class='add'>+#endif /* __LATENCY_H__ */</div><div class='head'>diff --git a/libglusterfs/src/glusterfs/libglusterfs-messages.h b/libglusterfs/src/glusterfs/libglusterfs-messages.h<br/>new file mode 100644<br/>index 00000000000..cb31dd7614b<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/libglusterfs/src/glusterfs/libglusterfs-messages.h?id=d1d7a6f35c816822fab51c820e25023863c239c1'>libglusterfs/src/glusterfs/libglusterfs-messages.h</a></div><div class='hunk'>@@ -0,0 +1,245 @@</div><div class='add'>+/*</div><div class='add'>+ Copyright (c) 2015 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+ This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+ This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+ General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+ later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+ cases as published by the Free Software Foundation.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+#ifndef _LG_MESSAGES_H_</div><div class='add'>+#define _LG_MESSAGES_H_</div><div class='add'>+</div><div class='add'>+#include "glusterfs/glfs-message-id.h"</div><div class='add'>+</div><div class='add'>+/* To add new message IDs, append new identifiers at the end of the list.</div><div class='add'>+ *</div><div class='add'>+ * Never remove a message ID. If it's not used anymore, you can rename it or</div><div class='add'>+ * leave it as it is, but not delete it. This is to prevent reutilization of</div><div class='add'>+ * IDs by other messages.</div><div class='add'>+ *</div><div class='add'>+ * The component name must match one of the entries defined in</div><div class='add'>+ * glfs-message-id.h.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+GLFS_MSGID(</div><div class='add'>+    LIBGLUSTERFS, LG_MSG_ASPRINTF_FAILED, LG_MSG_INVALID_ENTRY,</div><div class='add'>+    LG_MSG_COUNT_LESS_THAN_ZERO, LG_MSG_COUNT_LESS_THAN_DATA_PAIRS,</div><div class='add'>+    LG_MSG_VALUE_LENGTH_LESS_THAN_ZERO, LG_MSG_PAIRS_LESS_THAN_COUNT,</div><div class='add'>+    LG_MSG_KEY_OR_VALUE_NULL, LG_MSG_FAILED_TO_LOG_DICT,</div><div class='add'>+    LG_MSG_NULL_VALUE_IN_DICT, LG_MSG_DIR_OP_FAILED,</div><div class='add'>+    LG_MSG_STORE_HANDLE_CREATE_FAILED, LG_MSG_FILE_OP_FAILED,</div><div class='add'>+    LG_MSG_FILE_STAT_FAILED, LG_MSG_LOCK_FAILED, LG_MSG_UNLOCK_FAILED,</div><div class='add'>+    LG_MSG_DICT_SERIAL_FAILED, LG_MSG_DICT_UNSERIAL_FAILED, LG_MSG_NO_MEMORY,</div><div class='add'>+    LG_MSG_VOLUME_ERROR, LG_MSG_SUB_VOLUME_ERROR, LG_MSG_SYNTAX_ERROR,</div><div class='add'>+    LG_MSG_BACKTICK_PARSE_FAILED, LG_MSG_BUFFER_ERROR, LG_MSG_STRDUP_ERROR,</div><div class='add'>+    LG_MSG_HASH_FUNC_ERROR, LG_MSG_GET_BUCKET_FAILED, LG_MSG_INSERT_FAILED,</div><div class='add'>+    LG_MSG_OUT_OF_RANGE, LG_MSG_VALIDATE_RETURNS, LG_MSG_VALIDATE_REC_FAILED,</div><div class='add'>+    LG_MSG_RB_TABLE_CREATE_FAILED, LG_MSG_PATH_NOT_FOUND,</div><div class='add'>+    LG_MSG_EXPAND_FD_TABLE_FAILED, LG_MSG_MAPPING_FAILED,</div><div class='add'>+    LG_MSG_INIT_IOBUF_FAILED, LG_MSG_PAGE_SIZE_EXCEEDED, LG_MSG_ARENA_NOT_FOUND,</div><div class='add'>+    LG_MSG_IOBUF_NOT_FOUND, LG_MSG_POOL_NOT_FOUND, LG_MSG_SET_ATTRIBUTE_FAILED,</div><div class='add'>+    LG_MSG_READ_ATTRIBUTE_FAILED, LG_MSG_UNMOUNT_FAILED,</div><div class='add'>+    LG_MSG_LATENCY_MEASUREMENT_STATE, LG_MSG_NO_PERM, LG_MSG_NO_KEY,</div><div class='add'>+    LG_MSG_DICT_NULL, LG_MSG_INIT_TIMER_FAILED, LG_MSG_FD_ANONYMOUS_FAILED,</div><div class='add'>+    LG_MSG_FD_CREATE_FAILED, LG_MSG_BUFFER_FULL, LG_MSG_FWRITE_FAILED,</div><div class='add'>+    LG_MSG_PRINT_FAILED, LG_MSG_MEM_POOL_DESTROY,</div><div class='add'>+    LG_MSG_EXPAND_CLIENT_TABLE_FAILED, LG_MSG_DISCONNECT_CLIENT,</div><div class='add'>+    LG_MSG_PIPE_CREATE_FAILED, LG_MSG_SET_PIPE_FAILED,</div><div class='add'>+    LG_MSG_REGISTER_PIPE_FAILED, LG_MSG_POLL_IGNORE_MULTIPLE_THREADS,</div><div class='add'>+    LG_MSG_INDEX_NOT_FOUND, LG_MSG_EPOLL_FD_CREATE_FAILED,</div><div class='add'>+    LG_MSG_SLOT_NOT_FOUND, LG_MSG_STALE_FD_FOUND, LG_MSG_GENERATION_MISMATCH,</div><div class='add'>+    LG_MSG_PTHREAD_KEY_CREATE_FAILED, LG_MSG_TRANSLATOR_INIT_FAILED,</div><div class='add'>+    LG_MSG_UUID_BUF_INIT_FAILED, LG_MSG_LKOWNER_BUF_INIT_FAILED,</div><div class='add'>+    LG_MSG_SYNCTASK_INIT_FAILED, LG_MSG_SYNCOPCTX_INIT_FAILED,</div><div class='add'>+    LG_MSG_GLOBAL_INIT_FAILED, LG_MSG_PTHREAD_FAILED, LG_MSG_DIR_IS_SYMLINK,</div><div class='add'>+    LG_MSG_RESOLVE_HOSTNAME_FAILED, LG_MSG_GETADDRINFO_FAILED,</div><div class='add'>+    LG_MSG_GETNAMEINFO_FAILED, LG_MSG_PATH_ERROR, LG_MSG_INET_PTON_FAILED,</div><div class='add'>+    LG_MSG_NEGATIVE_NUM_PASSED, LG_MSG_GETHOSTNAME_FAILED,</div><div class='add'>+    LG_MSG_RESERVED_PORTS_ERROR, LG_MSG_INVALID_PORT, LG_MSG_INVALID_FAMILY,</div><div class='add'>+    LG_MSG_CONVERSION_FAILED, LG_MSG_SKIP_HEADER_FAILED, LG_MSG_INVALID_LOG,</div><div class='add'>+    LG_MSG_UTIMES_FAILED, LG_MSG_BACKTRACE_SAVE_FAILED, LG_MSG_INIT_FAILED,</div><div class='add'>+    LG_MSG_VALIDATION_FAILED, LG_MSG_GRAPH_ERROR, LG_MSG_UNKNOWN_OPTIONS_FAILED,</div><div class='add'>+    LG_MSG_CTX_NULL, LG_MSG_TMPFILE_CREATE_FAILED, LG_MSG_DLOPEN_FAILED,</div><div class='add'>+    LG_MSG_LOAD_FAILED, LG_MSG_DLSYM_ERROR, LG_MSG_TREE_NOT_FOUND,</div><div class='add'>+    LG_MSG_PER_DENTRY, LG_MSG_DENTRY, LG_MSG_GETIFADDRS_FAILED,</div><div class='add'>+    LG_MSG_REGEX_OP_FAILED, LG_MSG_FRAME_ERROR, LG_MSG_SET_PARAM_FAILED,</div><div class='add'>+    LG_MSG_GET_PARAM_FAILED, LG_MSG_PREPARE_FAILED, LG_MSG_EXEC_FAILED,</div><div class='add'>+    LG_MSG_BINDING_FAILED, LG_MSG_DELETE_FAILED, LG_MSG_GET_ID_FAILED,</div><div class='add'>+    LG_MSG_CREATE_FAILED, LG_MSG_PARSE_FAILED, LG_MSG_GETCONTEXT_FAILED,</div><div class='add'>+    LG_MSG_UPDATE_FAILED, LG_MSG_QUERY_CALL_BACK_FAILED,</div><div class='add'>+    LG_MSG_GET_RECORD_FAILED, LG_MSG_DB_ERROR, LG_MSG_CONNECTION_ERROR,</div><div class='add'>+    LG_MSG_NOT_MULTITHREAD_MODE, LG_MSG_SKIP_PATH, LG_MSG_INVALID_FOP,</div><div class='add'>+    LG_MSG_QUERY_FAILED, LG_MSG_CLEAR_COUNTER_FAILED, LG_MSG_LOCK_LIST_FAILED,</div><div class='add'>+    LG_MSG_UNLOCK_LIST_FAILED, LG_MSG_ADD_TO_LIST_FAILED, LG_MSG_INIT_DB_FAILED,</div><div class='add'>+    LG_MSG_DELETE_FROM_LIST_FAILED, LG_MSG_CLOSE_CONNECTION_FAILED,</div><div class='add'>+    LG_MSG_INSERT_OR_UPDATE_FAILED, LG_MSG_FIND_OP_FAILED,</div><div class='add'>+    LG_MSG_CONNECTION_INIT_FAILED, LG_MSG_COMPLETED_TASK, LG_MSG_WAKE_UP_ZOMBIE,</div><div class='add'>+    LG_MSG_REWAITING_TASK, LG_MSG_SLEEP_ZOMBIE, LG_MSG_SWAPCONTEXT_FAILED,</div><div class='add'>+    LG_MSG_UNSUPPORTED_PLUGIN, LG_MSG_INVALID_DB_TYPE, LG_MSG_UNDERSIZED_BUF,</div><div class='add'>+    LG_MSG_DATA_CONVERSION_ERROR, LG_MSG_DICT_ERROR, LG_MSG_IOBUFS_NOT_FOUND,</div><div class='add'>+    LG_MSG_ENTRIES_NULL, LG_MSG_FD_NOT_FOUND_IN_FDTABLE,</div><div class='add'>+    LG_MSG_REALLOC_FOR_FD_PTR_FAILED, LG_MSG_DICT_SET_FAILED, LG_MSG_NULL_PTR,</div><div class='add'>+    LG_MSG_RBTHASH_INIT_BUCKET_FAILED, LG_MSG_ASSERTION_FAILED,</div><div class='add'>+    LG_MSG_HOSTNAME_NULL, LG_MSG_INVALID_IPV4_FORMAT,</div><div class='add'>+    LG_MSG_CTX_CLEANUP_STARTED, LG_MSG_TIMER_REGISTER_ERROR,</div><div class='add'>+    LG_MSG_PTR_HEADER_CORRUPTED, LG_MSG_INVALID_UPLINK, LG_MSG_CLIENT_NULL,</div><div class='add'>+    LG_MSG_XLATOR_DOES_NOT_IMPLEMENT, LG_MSG_DENTRY_NOT_FOUND,</div><div class='add'>+    LG_MSG_INODE_NOT_FOUND, LG_MSG_INODE_TABLE_NOT_FOUND,</div><div class='add'>+    LG_MSG_DENTRY_CREATE_FAILED, LG_MSG_INODE_CONTEXT_FREED,</div><div class='add'>+    LG_MSG_UNKNOWN_LOCK_TYPE, LG_MSG_UNLOCK_BEFORE_LOCK,</div><div class='add'>+    LG_MSG_LOCK_OWNER_ERROR, LG_MSG_MEMPOOL_PTR_NULL,</div><div class='add'>+    LG_MSG_QUOTA_XATTRS_MISSING, LG_MSG_INVALID_STRING, LG_MSG_BIND_REF,</div><div class='add'>+    LG_MSG_REF_COUNT, LG_MSG_INVALID_ARG, LG_MSG_VOL_OPTION_ADD,</div><div class='add'>+    LG_MSG_XLATOR_OPTION_INVALID, LG_MSG_GETTIMEOFDAY_FAILED,</div><div class='add'>+    LG_MSG_GRAPH_INIT_FAILED, LG_MSG_EVENT_NOTIFY_FAILED,</div><div class='add'>+    LG_MSG_ACTIVE_GRAPH_NULL, LG_MSG_VOLFILE_PARSE_ERROR, LG_MSG_FD_INODE_NULL,</div><div class='add'>+    LG_MSG_INVALID_VOLFILE_ENTRY, LG_MSG_PER_DENTRY_FAILED,</div><div class='add'>+    LG_MSG_PARENT_DENTRY_NOT_FOUND, LG_MSG_DENTRY_CYCLIC_LOOP,</div><div class='add'>+    LG_MSG_INVALID_POLL_IN, LG_MSG_INVALID_POLL_OUT, LG_MSG_EPOLL_FD_ADD_FAILED,</div><div class='add'>+    LG_MSG_EPOLL_FD_DEL_FAILED, LG_MSG_EPOLL_FD_MODIFY_FAILED,</div><div class='add'>+    LG_MSG_STARTED_EPOLL_THREAD, LG_MSG_EXITED_EPOLL_THREAD,</div><div class='add'>+    LG_MSG_START_EPOLL_THREAD_FAILED, LG_MSG_FALLBACK_TO_POLL,</div><div class='add'>+    LG_MSG_QUOTA_CONF_ERROR, LG_MSG_RBTHASH_GET_ENTRY_FAILED,</div><div class='add'>+    LG_MSG_RBTHASH_GET_BUCKET_FAILED, LG_MSG_RBTHASH_INSERT_FAILED,</div><div class='add'>+    LG_MSG_RBTHASH_INIT_ENTRY_FAILED, LG_MSG_TMPFILE_DELETE_FAILED,</div><div class='add'>+    LG_MSG_MEMPOOL_INVALID_FREE, LG_MSG_LOCK_FAILURE, LG_MSG_SET_LOG_LEVEL,</div><div class='add'>+    LG_MSG_VERIFY_PLATFORM, LG_MSG_RUNNER_LOG, LG_MSG_LEASEID_BUF_INIT_FAILED,</div><div class='add'>+    LG_MSG_PTHREAD_ATTR_INIT_FAILED, LG_MSG_INVALID_INODE_LIST,</div><div class='add'>+    LG_MSG_COMPACT_FAILED, LG_MSG_COMPACT_STATUS, LG_MSG_UTIMENSAT_FAILED,</div><div class='add'>+    LG_MSG_PTHREAD_NAMING_FAILED, LG_MSG_SYSCALL_RETURNS_WRONG,</div><div class='add'>+    LG_MSG_XXH64_TO_GFID_FAILED, LG_MSG_ASYNC_WARNING, LG_MSG_ASYNC_FAILURE,</div><div class='add'>+    LG_MSG_GRAPH_CLEANUP_FAILED, LG_MSG_GRAPH_SETUP_FAILED,</div><div class='add'>+    LG_MSG_GRAPH_DETACH_STARTED, LG_MSG_GRAPH_ATTACH_FAILED,</div><div class='add'>+    LG_MSG_GRAPH_ATTACH_PID_FILE_UPDATED, LG_MSG_DUPLICATE_ENTRY,</div><div class='add'>+    LG_MSG_THREAD_NAME_TOO_LONG, LG_MSG_SET_THREAD_FAILED,</div><div class='add'>+    LG_MSG_THREAD_CREATE_FAILED, LG_MSG_FILE_DELETE_FAILED, LG_MSG_WRONG_VALUE,</div><div class='add'>+    LG_MSG_PATH_OPEN_FAILED, LG_MSG_DISPATCH_HANDLER_FAILED,</div><div class='add'>+    LG_MSG_READ_FILE_FAILED, LG_MSG_ENTRIES_NOT_PROVIDED,</div><div class='add'>+    LG_MSG_ENTRIES_PROVIDED, LG_MSG_UNKNOWN_OPTION_TYPE,</div><div class='add'>+    LG_MSG_OPTION_DEPRECATED, LG_MSG_INVALID_INIT, LG_MSG_OBJECT_NULL,</div><div class='add'>+    LG_MSG_GRAPH_NOT_SET, LG_MSG_FILENAME_NOT_SPECIFIED, LG_MSG_STRUCT_MISS,</div><div class='add'>+    LG_MSG_METHOD_MISS, LG_MSG_INPUT_DATA_NULL, LG_MSG_OPEN_LOGFILE_FAILED);</div><div class='add'>+</div><div class='add'>+#define LG_MSG_EPOLL_FD_CREATE_FAILED_STR "epoll fd creation failed"</div><div class='add'>+#define LG_MSG_INVALID_POLL_IN_STR "invalid poll_in value"</div><div class='add'>+#define LG_MSG_INVALID_POLL_OUT_STR "invalid poll_out value"</div><div class='add'>+#define LG_MSG_SLOT_NOT_FOUND_STR "could not find slot"</div><div class='add'>+#define LG_MSG_EPOLL_FD_ADD_FAILED_STR "failed to add fd to epoll"</div><div class='add'>+#define LG_MSG_EPOLL_FD_DEL_FAILED_STR "fail to delete fd to epoll"</div><div class='add'>+#define LG_MSG_EPOLL_FD_MODIFY_FAILED_STR "failed to modify fd events"</div><div class='add'>+#define LG_MSG_STALE_FD_FOUND_STR "stale fd found"</div><div class='add'>+#define LG_MSG_GENERATION_MISMATCH_STR "generation mismatch"</div><div class='add'>+#define LG_MSG_STARTED_EPOLL_THREAD_STR "Started thread with index"</div><div class='add'>+#define LG_MSG_EXITED_EPOLL_THREAD_STR "Exited thread"</div><div class='add'>+#define LG_MSG_DISPATCH_HANDLER_FAILED_STR "Failed to dispatch handler"</div><div class='add'>+#define LG_MSG_START_EPOLL_THREAD_FAILED_STR "Failed to start thread"</div><div class='add'>+#define LG_MSG_PIPE_CREATE_FAILED_STR "pipe creation failed"</div><div class='add'>+#define LG_MSG_SET_PIPE_FAILED_STR "could not set pipe to non blocking mode"</div><div class='add'>+#define LG_MSG_REGISTER_PIPE_FAILED_STR                                        \</div><div class='add'>+    "could not register pipe fd with poll event loop"</div><div class='add'>+#define LG_MSG_POLL_IGNORE_MULTIPLE_THREADS_STR                                \</div><div class='add'>+    "Currently poll does not use multiple event processing threads, count "    \</div><div class='add'>+    "ignored"</div><div class='add'>+#define LG_MSG_INDEX_NOT_FOUND_STR "index not found"</div><div class='add'>+#define LG_MSG_READ_FILE_FAILED_STR "read on file returned error"</div><div class='add'>+#define LG_MSG_RB_TABLE_CREATE_FAILED_STR "Failed to create rb table bucket"</div><div class='add'>+#define LG_MSG_HASH_FUNC_ERROR_STR "Hash function not given"</div><div class='add'>+#define LG_MSG_ENTRIES_NOT_PROVIDED_STR                                        \</div><div class='add'>+    "Both mem-pool and expected entries not provided"</div><div class='add'>+#define LG_MSG_ENTRIES_PROVIDED_STR                                            \</div><div class='add'>+    "Both mem-pool and expected entries are provided"</div><div class='add'>+#define LG_MSG_RBTHASH_INIT_BUCKET_FAILED_STR "failed to init buckets"</div><div class='add'>+#define LG_MSG_RBTHASH_GET_ENTRY_FAILED_STR "Failed to get entry from mem-pool"</div><div class='add'>+#define LG_MSG_RBTHASH_GET_BUCKET_FAILED_STR "Failed to get bucket"</div><div class='add'>+#define LG_MSG_RBTHASH_INSERT_FAILED_STR "Failed to insert entry"</div><div class='add'>+#define LG_MSG_RBTHASH_INIT_ENTRY_FAILED_STR "Failed to init entry"</div><div class='add'>+#define LG_MSG_FILE_STAT_FAILED_STR "failed to stat"</div><div class='add'>+#define LG_MSG_INET_PTON_FAILED_STR "inet_pton() failed"</div><div class='add'>+#define LG_MSG_INVALID_ENTRY_STR "Invalid arguments"</div><div class='add'>+#define LG_MSG_NEGATIVE_NUM_PASSED_STR "negative number passed"</div><div class='add'>+#define LG_MSG_PATH_ERROR_STR "Path manipulation failed"</div><div class='add'>+#define LG_MSG_FILE_OP_FAILED_STR "could not open/read file, getting ports info"</div><div class='add'>+#define LG_MSG_RESERVED_PORTS_ERROR_STR                                        \</div><div class='add'>+    "Not able to get reserved ports, hence there is a possibility that "       \</div><div class='add'>+    "glusterfs may consume reserved port"</div><div class='add'>+#define LG_MSG_INVALID_PORT_STR "invalid port"</div><div class='add'>+#define LG_MSG_GETNAMEINFO_FAILED_STR "Could not lookup hostname"</div><div class='add'>+#define LG_MSG_GETIFADDRS_FAILED_STR "getifaddrs() failed"</div><div class='add'>+#define LG_MSG_INVALID_FAMILY_STR "Invalid family"</div><div class='add'>+#define LG_MSG_CONVERSION_FAILED_STR "String conversion failed"</div><div class='add'>+#define LG_MSG_GETADDRINFO_FAILED_STR "error in getaddrinfo"</div><div class='add'>+#define LG_MSG_DUPLICATE_ENTRY_STR "duplicate entry for volfile-server"</div><div class='add'>+#define LG_MSG_PTHREAD_NAMING_FAILED_STR "Failed to compose thread name"</div><div class='add'>+#define LG_MSG_THREAD_NAME_TOO_LONG_STR                                        \</div><div class='add'>+    "Thread name is too long. It has been truncated"</div><div class='add'>+#define LG_MSG_SET_THREAD_FAILED_STR "Could not set thread name"</div><div class='add'>+#define LG_MSG_THREAD_CREATE_FAILED_STR "Thread creation failed"</div><div class='add'>+#define LG_MSG_PTHREAD_ATTR_INIT_FAILED_STR                                    \</div><div class='add'>+    "Thread attribute initialization failed"</div><div class='add'>+#define LG_MSG_SKIP_HEADER_FAILED_STR "Failed to skip header section"</div><div class='add'>+#define LG_MSG_INVALID_LOG_STR "Invalid log-format"</div><div class='add'>+#define LG_MSG_UTIMENSAT_FAILED_STR "utimenstat failed"</div><div class='add'>+#define LG_MSG_UTIMES_FAILED_STR "utimes failed"</div><div class='add'>+#define LG_MSG_FILE_DELETE_FAILED_STR "Unable to delete file"</div><div class='add'>+#define LG_MSG_BACKTRACE_SAVE_FAILED_STR "Failed to save the backtrace"</div><div class='add'>+#define LG_MSG_WRONG_VALUE_STR "wrong value"</div><div class='add'>+#define LG_MSG_DIR_OP_FAILED_STR "Failed to create directory"</div><div class='add'>+#define LG_MSG_DIR_IS_SYMLINK_STR "dir is symlink"</div><div class='add'>+#define LG_MSG_RESOLVE_HOSTNAME_FAILED_STR "couldnot resolve hostname"</div><div class='add'>+#define LG_MSG_PATH_OPEN_FAILED_STR "Unable to open path"</div><div class='add'>+#define LG_MSG_NO_MEMORY_STR "Error allocating memory"</div><div class='add'>+#define LG_MSG_EVENT_NOTIFY_FAILED_STR "notification failed"</div><div class='add'>+#define LG_MSG_PER_DENTRY_FAILED_STR "per dentry fn returned"</div><div class='add'>+#define LG_MSG_PARENT_DENTRY_NOT_FOUND_STR "parent not found"</div><div class='add'>+#define LG_MSG_DENTRY_CYCLIC_LOOP_STR                                          \</div><div class='add'>+    "detected cyclic loop formation during inode linkage"</div><div class='add'>+#define LG_MSG_CTX_NULL_STR "_ctx not found"</div><div class='add'>+#define LG_MSG_DENTRY_NOT_FOUND_STR "dentry not found"</div><div class='add'>+#define LG_MSG_OUT_OF_RANGE_STR "out of range"</div><div class='add'>+#define LG_MSG_UNKNOWN_OPTION_TYPE_STR "unknown option type"</div><div class='add'>+#define LG_MSG_VALIDATE_RETURNS_STR "validate of returned"</div><div class='add'>+#define LG_MSG_OPTION_DEPRECATED_STR                                           \</div><div class='add'>+    "option is deprecated, continuing with correction"</div><div class='add'>+#define LG_MSG_VALIDATE_REC_FAILED_STR "validate_rec failed"</div><div class='add'>+#define LG_MSG_MAPPING_FAILED_STR "mapping failed"</div><div class='add'>+#define LG_MSG_INIT_IOBUF_FAILED_STR "init failed"</div><div class='add'>+#define LG_MSG_ARENA_NOT_FOUND_STR "arena not found"</div><div class='add'>+#define LG_MSG_PAGE_SIZE_EXCEEDED_STR                                          \</div><div class='add'>+    "page_size of iobufs in arena being added is greater than max available"</div><div class='add'>+#define LG_MSG_POOL_NOT_FOUND_STR "pool not found"</div><div class='add'>+#define LG_MSG_IOBUF_NOT_FOUND_STR "iobuf not found"</div><div class='add'>+#define LG_MSG_DLOPEN_FAILED_STR "DL open failed"</div><div class='add'>+#define LG_MSG_DLSYM_ERROR_STR "dlsym missing"</div><div class='add'>+#define LG_MSG_LOAD_FAILED_STR "Failed to load xlator options table"</div><div class='add'>+#define LG_MSG_INPUT_DATA_NULL_STR                                             \</div><div class='add'>+    "input data is null. cannot update the lru limit of the inode table. "     \</div><div class='add'>+    "continuing with older value."</div><div class='add'>+#define LG_MSG_INIT_FAILED_STR "No init() found"</div><div class='add'>+#define LG_MSG_VOLUME_ERROR_STR                                                \</div><div class='add'>+    "Initialization of volume failed. review your volfile again."</div><div class='add'>+#define LG_MSG_TREE_NOT_FOUND_STR "Translator tree not found"</div><div class='add'>+#define LG_MSG_SET_LOG_LEVEL_STR "setting log level"</div><div class='add'>+#define LG_MSG_INVALID_INIT_STR                                                \</div><div class='add'>+    "Invalid log-level. possible values are DEBUG|WARNING|ERROR|NONE|TRACE"</div><div class='add'>+#define LG_MSG_OBJECT_NULL_STR "object is null, returning false."</div><div class='add'>+#define LG_MSG_GRAPH_NOT_SET_STR "Graph is not set for xlator"</div><div class='add'>+#define LG_MSG_OPEN_LOGFILE_FAILED_STR "failed to open logfile"</div><div class='add'>+#define LG_MSG_STRDUP_ERROR_STR "failed to create metrics dir"</div><div class='add'>+#define LG_MSG_FILENAME_NOT_SPECIFIED_STR "no filename specified"</div><div class='add'>+#define LG_MSG_UNDERSIZED_BUF_STR "data value is smaller than expected"</div><div class='add'>+#define LG_MSG_DICT_SET_FAILED_STR "unable to set dict"</div><div class='add'>+#define LG_MSG_COUNT_LESS_THAN_ZERO_STR "count &lt; 0!"</div><div class='add'>+#define LG_MSG_PAIRS_LESS_THAN_COUNT_STR "less than count data pairs found"</div><div class='add'>+#define LG_MSG_NULL_PTR_STR "pair-&gt;key is null!"</div><div class='add'>+#define LG_MSG_VALUE_LENGTH_LESS_THAN_ZERO_STR "value-&gt;len &lt; 0"</div><div class='add'>+#define LG_MSG_INVALID_ARG_STR "buf is null"</div><div class='add'>+#define LG_MSG_KEY_OR_VALUE_NULL_STR "key or value is null"</div><div class='add'>+#define LG_MSG_NULL_VALUE_IN_DICT_STR "null value found in dict"</div><div class='add'>+#define LG_MSG_FAILED_TO_LOG_DICT_STR "Failed to log dictionary"</div><div class='add'>+#define LG_MSG_DICT_ERROR_STR "dict error"</div><div class='add'>+#define LG_MSG_STRUCT_MISS_STR "struct missing"</div><div class='add'>+#define LG_MSG_METHOD_MISS_STR "method missing(init)"</div><div class='add'>+</div><div class='add'>+#endif /* !_LG_MESSAGES_H_ */</div><div class='head'>diff --git a/libglusterfs/src/glusterfs/list.h b/libglusterfs/src/glusterfs/list.h<br/>new file mode 100644<br/>index 00000000000..221a710ca30<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/libglusterfs/src/glusterfs/list.h?id=d1d7a6f35c816822fab51c820e25023863c239c1'>libglusterfs/src/glusterfs/list.h</a></div><div class='hunk'>@@ -0,0 +1,273 @@</div><div class='add'>+/*</div><div class='add'>+  Copyright (c) 2008-2012 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#ifndef _LLIST_H</div><div class='add'>+#define _LLIST_H</div><div class='add'>+</div><div class='add'>+struct list_head {</div><div class='add'>+    struct list_head *next;</div><div class='add'>+    struct list_head *prev;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+#define INIT_LIST_HEAD(head)                                                   \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        (head)-&gt;next = (head)-&gt;prev = head;                                    \</div><div class='add'>+    } while (0)</div><div class='add'>+</div><div class='add'>+static inline void</div><div class='add'>+list_add(struct list_head *new, struct list_head *head)</div><div class='add'>+{</div><div class='add'>+    new-&gt;prev = head;</div><div class='add'>+    new-&gt;next = head-&gt;next;</div><div class='add'>+</div><div class='add'>+    new-&gt;prev-&gt;next = new;</div><div class='add'>+    new-&gt;next-&gt;prev = new;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static inline void</div><div class='add'>+list_add_tail(struct list_head *new, struct list_head *head)</div><div class='add'>+{</div><div class='add'>+    new-&gt;next = head;</div><div class='add'>+    new-&gt;prev = head-&gt;prev;</div><div class='add'>+</div><div class='add'>+    new-&gt;prev-&gt;next = new;</div><div class='add'>+    new-&gt;next-&gt;prev = new;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* This function will insert the element to the list in a order.</div><div class='add'>+   Order will be based on the compare function provided as a input.</div><div class='add'>+   If element to be inserted in ascending order compare should return:</div><div class='add'>+    0: if both the arguments are equal</div><div class='add'>+   &gt;0: if first argument is greater than second argument</div><div class='add'>+   &lt;0: if first argument is less than second argument */</div><div class='add'>+static inline void</div><div class='add'>+list_add_order(struct list_head *new, struct list_head *head,</div><div class='add'>+               int (*compare)(struct list_head *, struct list_head *))</div><div class='add'>+{</div><div class='add'>+    struct list_head *pos = head-&gt;prev;</div><div class='add'>+</div><div class='add'>+    while (pos != head) {</div><div class='add'>+        if (compare(new, pos) &gt;= 0)</div><div class='add'>+            break;</div><div class='add'>+</div><div class='add'>+        /* Iterate the list in the reverse order. This will have</div><div class='add'>+           better efficiency if the elements are inserted in the</div><div class='add'>+           ascending order */</div><div class='add'>+        pos = pos-&gt;prev;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    list_add(new, pos);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static inline void</div><div class='add'>+list_del(struct list_head *old)</div><div class='add'>+{</div><div class='add'>+    old-&gt;prev-&gt;next = old-&gt;next;</div><div class='add'>+    old-&gt;next-&gt;prev = old-&gt;prev;</div><div class='add'>+</div><div class='add'>+    old-&gt;next = (void *)0xbabebabe;</div><div class='add'>+    old-&gt;prev = (void *)0xcafecafe;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static inline void</div><div class='add'>+list_del_init(struct list_head *old)</div><div class='add'>+{</div><div class='add'>+    old-&gt;prev-&gt;next = old-&gt;next;</div><div class='add'>+    old-&gt;next-&gt;prev = old-&gt;prev;</div><div class='add'>+</div><div class='add'>+    old-&gt;next = old;</div><div class='add'>+    old-&gt;prev = old;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static inline void</div><div class='add'>+list_move(struct list_head *list, struct list_head *head)</div><div class='add'>+{</div><div class='add'>+    list_del(list);</div><div class='add'>+    list_add(list, head);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static inline void</div><div class='add'>+list_move_tail(struct list_head *list, struct list_head *head)</div><div class='add'>+{</div><div class='add'>+    list_del(list);</div><div class='add'>+    list_add_tail(list, head);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static inline int</div><div class='add'>+list_empty(struct list_head *head)</div><div class='add'>+{</div><div class='add'>+    return (head-&gt;next == head);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static inline void</div><div class='add'>+__list_splice(struct list_head *list, struct list_head *head)</div><div class='add'>+{</div><div class='add'>+    (list-&gt;prev)-&gt;next = (head-&gt;next);</div><div class='add'>+    (head-&gt;next)-&gt;prev = (list-&gt;prev);</div><div class='add'>+</div><div class='add'>+    (head)-&gt;next = (list-&gt;next);</div><div class='add'>+    (list-&gt;next)-&gt;prev = (head);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static inline void</div><div class='add'>+list_splice(struct list_head *list, struct list_head *head)</div><div class='add'>+{</div><div class='add'>+    if (list_empty(list))</div><div class='add'>+        return;</div><div class='add'>+</div><div class='add'>+    __list_splice(list, head);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* Splice moves @list to the head of the list at @head. */</div><div class='add'>+static inline void</div><div class='add'>+list_splice_init(struct list_head *list, struct list_head *head)</div><div class='add'>+{</div><div class='add'>+    if (list_empty(list))</div><div class='add'>+        return;</div><div class='add'>+</div><div class='add'>+    __list_splice(list, head);</div><div class='add'>+    INIT_LIST_HEAD(list);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static inline void</div><div class='add'>+__list_append(struct list_head *list, struct list_head *head)</div><div class='add'>+{</div><div class='add'>+    (head-&gt;prev)-&gt;next = (list-&gt;next);</div><div class='add'>+    (list-&gt;next)-&gt;prev = (head-&gt;prev);</div><div class='add'>+    (head-&gt;prev) = (list-&gt;prev);</div><div class='add'>+    (list-&gt;prev)-&gt;next = head;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static inline void</div><div class='add'>+list_append(struct list_head *list, struct list_head *head)</div><div class='add'>+{</div><div class='add'>+    if (list_empty(list))</div><div class='add'>+        return;</div><div class='add'>+</div><div class='add'>+    __list_append(list, head);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* Append moves @list to the end of @head */</div><div class='add'>+static inline void</div><div class='add'>+list_append_init(struct list_head *list, struct list_head *head)</div><div class='add'>+{</div><div class='add'>+    if (list_empty(list))</div><div class='add'>+        return;</div><div class='add'>+</div><div class='add'>+    __list_append(list, head);</div><div class='add'>+    INIT_LIST_HEAD(list);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static inline int</div><div class='add'>+list_is_last(struct list_head *list, struct list_head *head)</div><div class='add'>+{</div><div class='add'>+    return (list-&gt;next == head);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static inline int</div><div class='add'>+list_is_singular(struct list_head *head)</div><div class='add'>+{</div><div class='add'>+    return !list_empty(head) &amp;&amp; (head-&gt;next == head-&gt;prev);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/**</div><div class='add'>+ * list_replace - replace old entry by new one</div><div class='add'>+ * @old : the element to be replaced</div><div class='add'>+ * @new : the new element to insert</div><div class='add'>+ *</div><div class='add'>+ * If @old was empty, it will be overwritten.</div><div class='add'>+ */</div><div class='add'>+static inline void</div><div class='add'>+list_replace(struct list_head *old, struct list_head *new)</div><div class='add'>+{</div><div class='add'>+    new-&gt;next = old-&gt;next;</div><div class='add'>+    new-&gt;next-&gt;prev = new;</div><div class='add'>+    new-&gt;prev = old-&gt;prev;</div><div class='add'>+    new-&gt;prev-&gt;next = new;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static inline void</div><div class='add'>+list_replace_init(struct list_head *old, struct list_head *new)</div><div class='add'>+{</div><div class='add'>+    list_replace(old, new);</div><div class='add'>+    INIT_LIST_HEAD(old);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/**</div><div class='add'>+ * list_rotate_left - rotate the list to the left</div><div class='add'>+ * @head: the head of the list</div><div class='add'>+ */</div><div class='add'>+static inline void</div><div class='add'>+list_rotate_left(struct list_head *head)</div><div class='add'>+{</div><div class='add'>+    struct list_head *first;</div><div class='add'>+</div><div class='add'>+    if (!list_empty(head)) {</div><div class='add'>+        first = head-&gt;next;</div><div class='add'>+        list_move_tail(first, head);</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#define list_entry(ptr, type, member)                                          \</div><div class='add'>+    ((type *)((char *)(ptr) - (unsigned long)(&amp;((type *)0)-&gt;member)))</div><div class='add'>+</div><div class='add'>+#define list_first_entry(ptr, type, member)                                    \</div><div class='add'>+    list_entry((ptr)-&gt;next, type, member)</div><div class='add'>+</div><div class='add'>+#define list_last_entry(ptr, type, member) list_entry((ptr)-&gt;prev, type, member)</div><div class='add'>+</div><div class='add'>+#define list_next_entry(pos, member)                                           \</div><div class='add'>+    list_entry((pos)-&gt;member.next, typeof(*(pos)), member)</div><div class='add'>+</div><div class='add'>+#define list_prev_entry(pos, member)                                           \</div><div class='add'>+    list_entry((pos)-&gt;member.prev, typeof(*(pos)), member)</div><div class='add'>+</div><div class='add'>+#define list_for_each(pos, head)                                               \</div><div class='add'>+    for (pos = (head)-&gt;next; pos != (head); pos = pos-&gt;next)</div><div class='add'>+</div><div class='add'>+#define list_for_each_entry(pos, head, member)                                 \</div><div class='add'>+    for (pos = list_entry((head)-&gt;next, typeof(*pos), member);                 \</div><div class='add'>+         &amp;pos-&gt;member != (head);                                               \</div><div class='add'>+         pos = list_entry(pos-&gt;member.next, typeof(*pos), member))</div><div class='add'>+</div><div class='add'>+#define list_for_each_entry_safe(pos, n, head, member)                         \</div><div class='add'>+    for (pos = list_entry((head)-&gt;next, typeof(*pos), member),                 \</div><div class='add'>+        n = list_entry(pos-&gt;member.next, typeof(*pos), member);                \</div><div class='add'>+         &amp;pos-&gt;member != (head);                                               \</div><div class='add'>+         pos = n, n = list_entry(n-&gt;member.next, typeof(*n), member))</div><div class='add'>+</div><div class='add'>+#define list_for_each_entry_reverse(pos, head, member)                         \</div><div class='add'>+    for (pos = list_entry((head)-&gt;prev, typeof(*pos), member);                 \</div><div class='add'>+         &amp;pos-&gt;member != (head);                                               \</div><div class='add'>+         pos = list_entry(pos-&gt;member.prev, typeof(*pos), member))</div><div class='add'>+</div><div class='add'>+#define list_for_each_entry_safe_reverse(pos, n, head, member)                 \</div><div class='add'>+    for (pos = list_entry((head)-&gt;prev, typeof(*pos), member),                 \</div><div class='add'>+        n = list_entry(pos-&gt;member.prev, typeof(*pos), member);                \</div><div class='add'>+         &amp;pos-&gt;member != (head);                                               \</div><div class='add'>+         pos = n, n = list_entry(n-&gt;member.prev, typeof(*n), member))</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+ * This list implementation has some advantages, but one disadvantage: you</div><div class='add'>+ * can't use NULL to check whether you're at the head or tail.  Thus, the</div><div class='add'>+ * address of the head has to be an argument for these macros.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+#define list_next(ptr, head, type, member)                                     \</div><div class='add'>+    (((ptr)-&gt;member.next == head)                                              \</div><div class='add'>+         ? NULL                                                                \</div><div class='add'>+         : list_entry((ptr)-&gt;member.next, type, member))</div><div class='add'>+</div><div class='add'>+#define list_prev(ptr, head, type, member)                                     \</div><div class='add'>+    (((ptr)-&gt;member.prev == head)                                              \</div><div class='add'>+         ? NULL                                                                \</div><div class='add'>+         : list_entry((ptr)-&gt;member.prev, type, member))</div><div class='add'>+</div><div class='add'>+#endif /* _LLIST_H */</div><div class='head'>diff --git a/libglusterfs/src/glusterfs/lkowner.h b/libglusterfs/src/glusterfs/lkowner.h<br/>new file mode 100644<br/>index 00000000000..692de34bc7a<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/libglusterfs/src/glusterfs/lkowner.h?id=d1d7a6f35c816822fab51c820e25023863c239c1'>libglusterfs/src/glusterfs/lkowner.h</a></div><div class='hunk'>@@ -0,0 +1,93 @@</div><div class='add'>+/*</div><div class='add'>+  Copyright (c) 2008-2012 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#ifndef _LK_OWNER_H</div><div class='add'>+#define _LK_OWNER_H</div><div class='add'>+</div><div class='add'>+#include "glusterfs/glusterfs-fops.h"</div><div class='add'>+</div><div class='add'>+/* LKOWNER to string functions */</div><div class='add'>+static inline void</div><div class='add'>+lkowner_unparse(gf_lkowner_t *lkowner, char *buf, int buf_len)</div><div class='add'>+{</div><div class='add'>+    int i = 0;</div><div class='add'>+    int j = 0;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; lkowner-&gt;len; i++) {</div><div class='add'>+        if (i &amp;&amp; !(i % 8)) {</div><div class='add'>+            buf[j] = '-';</div><div class='add'>+            j++;</div><div class='add'>+        }</div><div class='add'>+        sprintf(&amp;buf[j], "%02hhx", lkowner-&gt;data[i]);</div><div class='add'>+        j += 2;</div><div class='add'>+        if (j == buf_len)</div><div class='add'>+            break;</div><div class='add'>+    }</div><div class='add'>+    if (j &lt; buf_len)</div><div class='add'>+        buf[j] = '\0';</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static inline void</div><div class='add'>+set_lk_owner_from_ptr(gf_lkowner_t *lkowner, void *data)</div><div class='add'>+{</div><div class='add'>+    int i = 0;</div><div class='add'>+    int j = 0;</div><div class='add'>+</div><div class='add'>+    lkowner-&gt;len = sizeof(unsigned long);</div><div class='add'>+    for (i = 0, j = 0; i &lt; lkowner-&gt;len; i++, j += 8) {</div><div class='add'>+        lkowner-&gt;data[i] = (char)((((unsigned long)data) &gt;&gt; j) &amp; 0xff);</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static inline void</div><div class='add'>+set_lk_owner_from_uint64(gf_lkowner_t *lkowner, uint64_t data)</div><div class='add'>+{</div><div class='add'>+    int i = 0;</div><div class='add'>+    int j = 0;</div><div class='add'>+</div><div class='add'>+    lkowner-&gt;len = 8;</div><div class='add'>+    for (i = 0, j = 0; i &lt; lkowner-&gt;len; i++, j += 8) {</div><div class='add'>+        lkowner-&gt;data[i] = (char)((data &gt;&gt; j) &amp; 0xff);</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* Return true if the locks have the same owner */</div><div class='add'>+static inline int</div><div class='add'>+is_same_lkowner(gf_lkowner_t *l1, gf_lkowner_t *l2)</div><div class='add'>+{</div><div class='add'>+    return ((l1-&gt;len == l2-&gt;len) &amp;&amp; !memcmp(l1-&gt;data, l2-&gt;data, l1-&gt;len));</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static inline int</div><div class='add'>+is_lk_owner_null(gf_lkowner_t *lkowner)</div><div class='add'>+{</div><div class='add'>+    int is_null = 1;</div><div class='add'>+    int i = 0;</div><div class='add'>+</div><div class='add'>+    if (lkowner == NULL || lkowner-&gt;len == 0)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; lkowner-&gt;len; i++) {</div><div class='add'>+        if (lkowner-&gt;data[i] != 0) {</div><div class='add'>+            is_null = 0;</div><div class='add'>+            break;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+out:</div><div class='add'>+    return is_null;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static inline void</div><div class='add'>+lk_owner_copy(gf_lkowner_t *dst, gf_lkowner_t *src)</div><div class='add'>+{</div><div class='add'>+    dst-&gt;len = src-&gt;len;</div><div class='add'>+    memcpy(dst-&gt;data, src-&gt;data, src-&gt;len);</div><div class='add'>+}</div><div class='add'>+#endif /* _LK_OWNER_H */</div><div class='head'>diff --git a/libglusterfs/src/glusterfs/locking.h b/libglusterfs/src/glusterfs/locking.h<br/>new file mode 100644<br/>index 00000000000..43cc87735d1<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/libglusterfs/src/glusterfs/locking.h?id=d1d7a6f35c816822fab51c820e25023863c239c1'>libglusterfs/src/glusterfs/locking.h</a></div><div class='hunk'>@@ -0,0 +1,84 @@</div><div class='add'>+/*</div><div class='add'>+  Copyright (c) 2008-2012 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#ifndef _LOCKING_H</div><div class='add'>+#define _LOCKING_H</div><div class='add'>+</div><div class='add'>+#include &lt;pthread.h&gt;</div><div class='add'>+</div><div class='add'>+#if defined(GF_DARWIN_HOST_OS)</div><div class='add'>+#include &lt;libkern/OSAtomic.h&gt;</div><div class='add'>+#define pthread_spinlock_t OSSpinLock</div><div class='add'>+#define pthread_spin_lock(l) OSSpinLockLock(l)</div><div class='add'>+#define pthread_spin_unlock(l) OSSpinLockUnlock(l)</div><div class='add'>+#define pthread_spin_destroy(l) 0</div><div class='add'>+#define pthread_spin_init(l, v) (*l = v)</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#if defined(HAVE_SPINLOCK)</div><div class='add'>+</div><div class='add'>+typedef union {</div><div class='add'>+    pthread_spinlock_t spinlock;</div><div class='add'>+    pthread_mutex_t mutex;</div><div class='add'>+} gf_lock_t;</div><div class='add'>+</div><div class='add'>+#if !defined(LOCKING_IMPL)</div><div class='add'>+extern int use_spinlocks;</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+ * Using a dispatch table would be unpleasant because we're dealing with two</div><div class='add'>+ * different types.  If the dispatch contains direct pointers to pthread_xx</div><div class='add'>+ * or mutex_xxx then we have to hope that every possible union alternative</div><div class='add'>+ * starts at the same address as the union itself.  I'm old enough to remember</div><div class='add'>+ * compilers where this was not the case (for alignment reasons) so I'm a bit</div><div class='add'>+ * paranoid about that.  Also, I don't like casting arguments through "void *"</div><div class='add'>+ * which we'd also have to do to avoid type errors.  The other alternative would</div><div class='add'>+ * be to define actual functions which pick out the right union member, and put</div><div class='add'>+ * those in the dispatch tables.  Now we have a pointer dereference through the</div><div class='add'>+ * dispatch table plus a function call, which is likely to be worse than the</div><div class='add'>+ * branching here from the ?: construct.  If it were a clear win it might be</div><div class='add'>+ * worth the extra complexity, but for now this way seems preferable.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+#define LOCK_INIT(x)                                                           \</div><div class='add'>+    (use_spinlocks ? pthread_spin_init(&amp;((x)-&gt;spinlock), 0)                    \</div><div class='add'>+                   : pthread_mutex_init(&amp;((x)-&gt;mutex), 0))</div><div class='add'>+</div><div class='add'>+#define LOCK(x)                                                                \</div><div class='add'>+    (use_spinlocks ? pthread_spin_lock(&amp;((x)-&gt;spinlock))                       \</div><div class='add'>+                   : pthread_mutex_lock(&amp;((x)-&gt;mutex)))</div><div class='add'>+</div><div class='add'>+#define TRY_LOCK(x)                                                            \</div><div class='add'>+    (use_spinlocks ? pthread_spin_trylock(&amp;((x)-&gt;spinlock))                    \</div><div class='add'>+                   : pthread_mutex_trylock(&amp;((x)-&gt;mutex)))</div><div class='add'>+</div><div class='add'>+#define UNLOCK(x)                                                              \</div><div class='add'>+    (use_spinlocks ? pthread_spin_unlock(&amp;((x)-&gt;spinlock))                     \</div><div class='add'>+                   : pthread_mutex_unlock(&amp;((x)-&gt;mutex)))</div><div class='add'>+</div><div class='add'>+#define LOCK_DESTROY(x)                                                        \</div><div class='add'>+    (use_spinlocks ? pthread_spin_destroy(&amp;((x)-&gt;spinlock))                    \</div><div class='add'>+                   : pthread_mutex_destroy(&amp;((x)-&gt;mutex)))</div><div class='add'>+</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#else</div><div class='add'>+</div><div class='add'>+typedef pthread_mutex_t gf_lock_t;</div><div class='add'>+</div><div class='add'>+#define LOCK_INIT(x) pthread_mutex_init(x, 0)</div><div class='add'>+#define LOCK(x) pthread_mutex_lock(x)</div><div class='add'>+#define TRY_LOCK(x) pthread_mutex_trylock(x)</div><div class='add'>+#define UNLOCK(x) pthread_mutex_unlock(x)</div><div class='add'>+#define LOCK_DESTROY(x) pthread_mutex_destroy(x)</div><div class='add'>+</div><div class='add'>+#endif /* HAVE_SPINLOCK */</div><div class='add'>+</div><div class='add'>+#endif /* _LOCKING_H */</div><div class='head'>diff --git a/libglusterfs/src/glusterfs/logging.h b/libglusterfs/src/glusterfs/logging.h<br/>new file mode 100644<br/>index 00000000000..b3a6ac191f0<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/libglusterfs/src/glusterfs/logging.h?id=d1d7a6f35c816822fab51c820e25023863c239c1'>libglusterfs/src/glusterfs/logging.h</a></div><div class='hunk'>@@ -0,0 +1,383 @@</div><div class='add'>+/*</div><div class='add'>+  Copyright (c) 2008-2012 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#ifndef __LOGGING_H__</div><div class='add'>+#define __LOGGING_H__</div><div class='add'>+</div><div class='add'>+#include &lt;sys/time.h&gt;</div><div class='add'>+#include &lt;stdint.h&gt;</div><div class='add'>+#include &lt;stdio.h&gt;</div><div class='add'>+#include &lt;stdarg.h&gt;</div><div class='add'>+#include &lt;pthread.h&gt;</div><div class='add'>+#include "glusterfs/list.h"</div><div class='add'>+</div><div class='add'>+#ifdef GF_DARWIN_HOST_OS</div><div class='add'>+#define GF_PRI_FSBLK "u"</div><div class='add'>+#define GF_PRI_DEV PRId32</div><div class='add'>+#define GF_PRI_INODE PRIu64</div><div class='add'>+#define GF_PRI_NLINK PRIu32</div><div class='add'>+#define GF_PRI_SECOND "ld"</div><div class='add'>+#define GF_PRI_SUSECONDS "06d"</div><div class='add'>+#define GF_PRI_SNSECONDS "09ld"</div><div class='add'>+#define GF_PRI_USEC "d"</div><div class='add'>+#else</div><div class='add'>+#define GF_PRI_FSBLK PRIu64</div><div class='add'>+#define GF_PRI_DEV PRIu64</div><div class='add'>+#define GF_PRI_INODE PRIu64</div><div class='add'>+#define GF_PRI_NLINK PRIu32</div><div class='add'>+#define GF_PRI_SECOND "lu"</div><div class='add'>+#define GF_PRI_SUSECONDS "06ld"</div><div class='add'>+#define GF_PRI_SNSECONDS "09ld"</div><div class='add'>+#define GF_PRI_USEC "ld"</div><div class='add'>+#endif</div><div class='add'>+#define GF_PRI_BLKSIZE PRId32</div><div class='add'>+#define GF_PRI_SIZET "zu"</div><div class='add'>+#define GF_PRI_ATOMIC PRIu64</div><div class='add'>+</div><div class='add'>+#ifdef GF_DARWIN_HOST_OS</div><div class='add'>+#define GF_PRI_TIME "ld"</div><div class='add'>+#else</div><div class='add'>+#define GF_PRI_TIME PRIu64</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#if 0</div><div class='add'>+/* Syslog definitions :-) */</div><div class='add'>+#define LOG_EMERG 0   /* system is unusable */</div><div class='add'>+#define LOG_ALERT 1   /* action must be taken immediately */</div><div class='add'>+#define LOG_CRIT 2    /* critical conditions */</div><div class='add'>+#define LOG_ERR 3     /* error conditions */</div><div class='add'>+#define LOG_WARNING 4 /* warning conditions */</div><div class='add'>+#define LOG_NOTICE 5  /* normal but significant condition */</div><div class='add'>+#define LOG_INFO 6    /* informational */</div><div class='add'>+#define LOG_DEBUG 7   /* debug-level messages */</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#define GF_LOG_FORMAT_NO_MSG_ID "no-msg-id"</div><div class='add'>+#define GF_LOG_FORMAT_WITH_MSG_ID "with-msg-id"</div><div class='add'>+</div><div class='add'>+#define GF_LOGGER_GLUSTER_LOG "gluster-log"</div><div class='add'>+#define GF_LOGGER_SYSLOG "syslog"</div><div class='add'>+</div><div class='add'>+typedef enum {</div><div class='add'>+    GF_LOG_NONE,</div><div class='add'>+    GF_LOG_EMERG,</div><div class='add'>+    GF_LOG_ALERT,</div><div class='add'>+    GF_LOG_CRITICAL, /* fatal errors */</div><div class='add'>+    GF_LOG_ERROR,    /* major failures (not necessarily fatal) */</div><div class='add'>+    GF_LOG_WARNING,  /* info about normal operation */</div><div class='add'>+    GF_LOG_NOTICE,</div><div class='add'>+    GF_LOG_INFO,  /* Normal information */</div><div class='add'>+    GF_LOG_DEBUG, /* internal errors */</div><div class='add'>+    GF_LOG_TRACE, /* full trace of operation */</div><div class='add'>+} gf_loglevel_t;</div><div class='add'>+</div><div class='add'>+/* format for the logs */</div><div class='add'>+typedef enum {</div><div class='add'>+    gf_logformat_traditional = 0, /* Format as in gluster 3.5 */</div><div class='add'>+    gf_logformat_withmsgid, /* Format enhanced with MsgID, ident, errstr */</div><div class='add'>+    gf_logformat_cee        /* log enhanced format in cee */</div><div class='add'>+} gf_log_format_t;</div><div class='add'>+</div><div class='add'>+/* log infrastructure to log to */</div><div class='add'>+typedef enum {</div><div class='add'>+    gf_logger_glusterlog = 0, /* locations and files as in gluster 3.5 */</div><div class='add'>+    gf_logger_syslog          /* log to (r)syslog, based on (r)syslog conf */</div><div class='add'>+    /* NOTE: In the future journald, lumberjack, next new thing here */</div><div class='add'>+} gf_log_logger_t;</div><div class='add'>+</div><div class='add'>+#define DEFAULT_LOG_FILE_DIRECTORY DATADIR "/log/glusterfs"</div><div class='add'>+#define DEFAULT_QUOTA_CRAWL_LOG_DIRECTORY DATADIR "/log/glusterfs/quota_crawl"</div><div class='add'>+#define DEFAULT_LOG_LEVEL GF_LOG_INFO</div><div class='add'>+</div><div class='add'>+typedef struct gf_log_handle_ {</div><div class='add'>+    pthread_mutex_t logfile_mutex;</div><div class='add'>+    gf_loglevel_t loglevel;</div><div class='add'>+    gf_loglevel_t sys_log_level;</div><div class='add'>+    int gf_log_syslog;</div><div class='add'>+    char *filename;</div><div class='add'>+    FILE *logfile;</div><div class='add'>+    FILE *gf_log_logfile;</div><div class='add'>+    char *cmd_log_filename;</div><div class='add'>+    FILE *cmdlogfile;</div><div class='add'>+    gf_log_logger_t logger;</div><div class='add'>+    gf_log_format_t logformat;</div><div class='add'>+    char *ident;</div><div class='add'>+    int log_control_file_found;</div><div class='add'>+    struct list_head lru_queue;</div><div class='add'>+    pthread_mutex_t log_buf_lock;</div><div class='add'>+    struct _gf_timer *log_flush_timer;</div><div class='add'>+    int localtime;</div><div class='add'>+    uint32_t lru_size;</div><div class='add'>+    uint32_t lru_cur_size;</div><div class='add'>+    uint32_t timeout;</div><div class='add'>+    uint8_t logrotate;</div><div class='add'>+    uint8_t cmd_history_logrotate;</div><div class='add'>+} gf_log_handle_t;</div><div class='add'>+</div><div class='add'>+typedef struct log_buf_ {</div><div class='add'>+    char *msg;</div><div class='add'>+    uint64_t msg_id;</div><div class='add'>+    int errnum;</div><div class='add'>+    struct timeval oldest;</div><div class='add'>+    struct timeval latest;</div><div class='add'>+    char *domain;</div><div class='add'>+    char *file;</div><div class='add'>+    char *function;</div><div class='add'>+    int32_t line;</div><div class='add'>+    gf_loglevel_t level;</div><div class='add'>+    int refcount;</div><div class='add'>+    int graph_id;</div><div class='add'>+    struct list_head msg_list;</div><div class='add'>+} log_buf_t;</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+gf_log_globals_init(void *ctx, gf_loglevel_t level);</div><div class='add'>+int</div><div class='add'>+gf_log_init(void *data, const char *filename, const char *ident);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+gf_log_logrotate(int signum);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+gf_log_cleanup(void);</div><div class='add'>+</div><div class='add'>+/* Internal interfaces to log messages with message IDs */</div><div class='add'>+int</div><div class='add'>+_gf_msg(const char *domain, const char *file, const char *function,</div><div class='add'>+        int32_t line, gf_loglevel_t level, int errnum, int trace,</div><div class='add'>+        uint64_t msgid, const char *fmt, ...)</div><div class='add'>+    __attribute__((__format__(__printf__, 9, 10)));</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+_gf_msg_backtrace_nomem(gf_loglevel_t level, int stacksize);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+_gf_msg_plain(gf_loglevel_t level, const char *fmt, ...)</div><div class='add'>+    __attribute__((__format__(__printf__, 2, 3)));</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+_gf_msg_plain_nomem(gf_loglevel_t level, const char *msg);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+_gf_msg_vplain(gf_loglevel_t level, const char *fmt, va_list ap);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+_gf_msg_nomem(const char *domain, const char *file, const char *function,</div><div class='add'>+              int line, gf_loglevel_t level, size_t size);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+_gf_log(const char *domain, const char *file, const char *function,</div><div class='add'>+        int32_t line, gf_loglevel_t level, const char *fmt, ...)</div><div class='add'>+    __attribute__((__format__(__printf__, 6, 7)));</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+_gf_log_callingfn(const char *domain, const char *file, const char *function,</div><div class='add'>+                  int32_t line, gf_loglevel_t level, const char *fmt, ...)</div><div class='add'>+    __attribute__((__format__(__printf__, 6, 7)));</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+_gf_log_eh(const char *function, const char *fmt, ...)</div><div class='add'>+    __attribute__((__format__(__printf__, 2, 3)));</div><div class='add'>+</div><div class='add'>+/* treat GF_LOG_TRACE and GF_LOG_NONE as LOG_DEBUG and</div><div class='add'>+ * other level as is */</div><div class='add'>+#define SET_LOG_PRIO(level, priority)                                          \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        if (GF_LOG_TRACE == (level) || GF_LOG_NONE == (level)) {               \</div><div class='add'>+            priority = LOG_DEBUG;                                              \</div><div class='add'>+        } else {                                                               \</div><div class='add'>+            priority = (level)-1;                                              \</div><div class='add'>+        }                                                                      \</div><div class='add'>+    } while (0)</div><div class='add'>+</div><div class='add'>+/* extract just the file name from the path */</div><div class='add'>+#define GET_FILE_NAME_TO_LOG(file, basename)                                   \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        basename = strrchr((file), '/');                                       \</div><div class='add'>+        if (basename)                                                          \</div><div class='add'>+            basename++;                                                        \</div><div class='add'>+        else                                                                   \</div><div class='add'>+            basename = (file);                                                 \</div><div class='add'>+    } while (0)</div><div class='add'>+</div><div class='add'>+#define PRINT_SIZE_CHECK(ret, label, strsize)                                  \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        if (ret &lt; 0)                                                           \</div><div class='add'>+            goto label;                                                        \</div><div class='add'>+        if ((strsize - ret) &gt; 0) {                                             \</div><div class='add'>+            strsize -= ret;                                                    \</div><div class='add'>+        } else {                                                               \</div><div class='add'>+            ret = 0;                                                           \</div><div class='add'>+            goto label;                                                        \</div><div class='add'>+        }                                                                      \</div><div class='add'>+    } while (0)</div><div class='add'>+</div><div class='add'>+#define FMT_WARN(fmt...)                                                       \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        if (0)                                                                 \</div><div class='add'>+            printf(fmt);                                                       \</div><div class='add'>+    } while (0)</div><div class='add'>+</div><div class='add'>+/* Interface to log messages with message IDs */</div><div class='add'>+#define gf_msg(dom, level, errnum, msgid, fmt...)                              \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        _gf_msg(dom, __FILE__, __FUNCTION__, __LINE__, level, errnum, 0,       \</div><div class='add'>+                msgid, ##fmt);                                                 \</div><div class='add'>+    } while (0)</div><div class='add'>+</div><div class='add'>+/* no frills, no thrills, just a vanilla message, used to print the graph */</div><div class='add'>+#define gf_msg_plain(level, fmt...)                                            \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        _gf_msg_plain(level, ##fmt);                                           \</div><div class='add'>+    } while (0)</div><div class='add'>+</div><div class='add'>+#define gf_msg_plain_nomem(level, msg)                                         \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        _gf_msg_plain_nomem(level, msg);                                       \</div><div class='add'>+    } while (0)</div><div class='add'>+</div><div class='add'>+#define gf_msg_vplain(level, fmt, va)                                          \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        _gf_msg_vplain(level, fmt, va);                                        \</div><div class='add'>+    } while (0)</div><div class='add'>+</div><div class='add'>+#define gf_msg_backtrace_nomem(level, stacksize)                               \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        _gf_msg_backtrace_nomem(level, stacksize);                             \</div><div class='add'>+    } while (0)</div><div class='add'>+</div><div class='add'>+#define gf_msg_callingfn(dom, level, errnum, msgid, fmt...)                    \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        _gf_msg(dom, __FILE__, __FUNCTION__, __LINE__, level, errnum, 1,       \</div><div class='add'>+                msgid, ##fmt);                                                 \</div><div class='add'>+    } while (0)</div><div class='add'>+</div><div class='add'>+/* No malloc or calloc should be called in this function */</div><div class='add'>+#define gf_msg_nomem(dom, level, size)                                         \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        _gf_msg_nomem(dom, __FILE__, __FUNCTION__, __LINE__, level, size);     \</div><div class='add'>+    } while (0)</div><div class='add'>+</div><div class='add'>+/* Debug or trace messages do not need message IDs as these are more developer</div><div class='add'>+ * related. Hence, the following abstractions are provided for the same */</div><div class='add'>+#define gf_msg_debug(dom, errnum, fmt...)                                      \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        _gf_msg(dom, __FILE__, __FUNCTION__, __LINE__, GF_LOG_DEBUG, errnum,   \</div><div class='add'>+                0, 0, ##fmt);                                                  \</div><div class='add'>+    } while (0)</div><div class='add'>+</div><div class='add'>+#define gf_msg_trace(dom, errnum, fmt...)                                      \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        _gf_msg(dom, __FILE__, __FUNCTION__, __LINE__, GF_LOG_TRACE, errnum,   \</div><div class='add'>+                0, 0, ##fmt);                                                  \</div><div class='add'>+    } while (0)</div><div class='add'>+</div><div class='add'>+#define gf_log(dom, level, fmt...)                                             \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        FMT_WARN(fmt);                                                         \</div><div class='add'>+        _gf_log(dom, __FILE__, __FUNCTION__, __LINE__, level, ##fmt);          \</div><div class='add'>+    } while (0)</div><div class='add'>+</div><div class='add'>+#define gf_log_eh(fmt...)                                                      \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        FMT_WARN(fmt);                                                         \</div><div class='add'>+        _gf_log_eh(__FUNCTION__, ##fmt);                                       \</div><div class='add'>+    } while (0)</div><div class='add'>+</div><div class='add'>+#define gf_log_callingfn(dom, level, fmt...)                                   \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        FMT_WARN(fmt);                                                         \</div><div class='add'>+        _gf_log_callingfn(dom, __FILE__, __FUNCTION__, __LINE__, level,        \</div><div class='add'>+                          ##fmt);                                              \</div><div class='add'>+    } while (0)</div><div class='add'>+</div><div class='add'>+/* Log once in GF_UNIVERSAL_ANSWER times */</div><div class='add'>+#define GF_LOG_OCCASIONALLY(var, args...)                                      \</div><div class='add'>+    if (var++ == 0 || !((var - 1) % GF_UNIVERSAL_ANSWER)) {                    \</div><div class='add'>+        gf_log(args);                                                          \</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+struct _glusterfs_ctx;</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+gf_log_disable_syslog(void);</div><div class='add'>+void</div><div class='add'>+gf_log_enable_syslog(void);</div><div class='add'>+gf_loglevel_t</div><div class='add'>+gf_log_get_loglevel(void);</div><div class='add'>+void</div><div class='add'>+gf_log_set_loglevel(struct _glusterfs_ctx *ctx, gf_loglevel_t level);</div><div class='add'>+int</div><div class='add'>+gf_log_get_localtime(void);</div><div class='add'>+void</div><div class='add'>+gf_log_set_localtime(int);</div><div class='add'>+void</div><div class='add'>+gf_log_flush(void);</div><div class='add'>+gf_loglevel_t</div><div class='add'>+gf_log_get_xl_loglevel(void *xl);</div><div class='add'>+void</div><div class='add'>+gf_log_set_xl_loglevel(void *xl, gf_loglevel_t level);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+gf_cmd_log(const char *domain, const char *fmt, ...)</div><div class='add'>+    __attribute__((__format__(__printf__, 2, 3)));</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+gf_cmd_log_init(const char *filename);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+set_sys_log_level(gf_loglevel_t level);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+gf_log_fini(void *data);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+gf_log_set_logger(gf_log_logger_t logger);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+gf_log_set_logformat(gf_log_format_t format);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+gf_log_set_log_buf_size(uint32_t buf_size);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+gf_log_set_log_flush_timeout(uint32_t timeout);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+gf_log_flush_msgs(struct _glusterfs_ctx *ctx);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+gf_log_inject_timer_event(struct _glusterfs_ctx *ctx);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+gf_log_disable_suppression_before_exit(struct _glusterfs_ctx *ctx);</div><div class='add'>+</div><div class='add'>+#define GF_DEBUG(xl, format, args...)                                          \</div><div class='add'>+    gf_log((xl)-&gt;name, GF_LOG_DEBUG, format, ##args)</div><div class='add'>+#define GF_INFO(xl, format, args...)                                           \</div><div class='add'>+    gf_log((xl)-&gt;name, GF_LOG_INFO, format, ##args)</div><div class='add'>+#define GF_WARNING(xl, format, args...)                                        \</div><div class='add'>+    gf_log((xl)-&gt;name, GF_LOG_WARNING, format, ##args)</div><div class='add'>+#define GF_ERROR(xl, format, args...)                                          \</div><div class='add'>+    gf_log((xl)-&gt;name, GF_LOG_ERROR, format, ##args)</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+_gf_smsg(const char *domain, const char *file, const char *function,</div><div class='add'>+         int32_t line, gf_loglevel_t level, int errnum, int trace,</div><div class='add'>+         uint64_t msgid, const char *event, ...);</div><div class='add'>+</div><div class='add'>+/* Interface to log messages with message IDs */</div><div class='add'>+#define gf_smsg(dom, level, errnum, msgid, event...)                           \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        _gf_smsg(dom, __FILE__, __FUNCTION__, __LINE__, level, errnum, 0,      \</div><div class='add'>+                 msgid, msgid##_STR, ##event);                                 \</div><div class='add'>+    } while (0)</div><div class='add'>+</div><div class='add'>+#endif /* __LOGGING_H__ */</div><div class='head'>diff --git a/libglusterfs/src/glusterfs/lvm-defaults.h b/libglusterfs/src/glusterfs/lvm-defaults.h<br/>new file mode 100644<br/>index 00000000000..32feebf3f6e<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/libglusterfs/src/glusterfs/lvm-defaults.h?id=d1d7a6f35c816822fab51c820e25023863c239c1'>libglusterfs/src/glusterfs/lvm-defaults.h</a></div><div class='hunk'>@@ -0,0 +1,20 @@</div><div class='add'>+/*</div><div class='add'>+  Copyright (c) 2014 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#ifndef _LVM_DEFAULTS_H</div><div class='add'>+#define _LVM_DEFAULTS_H</div><div class='add'>+</div><div class='add'>+#define LVM_RESIZE "/sbin/lvresize"</div><div class='add'>+#define LVM_CREATE "/sbin/lvcreate"</div><div class='add'>+#define LVM_CONVERT "/sbin/lvconvert"</div><div class='add'>+#define LVM_REMOVE "/sbin/lvremove"</div><div class='add'>+#define LVS "/sbin/lvs"</div><div class='add'>+</div><div class='add'>+#endif /* _LVM_DEFAULTS_H */</div><div class='head'>diff --git a/libglusterfs/src/glusterfs/mem-pool.h b/libglusterfs/src/glusterfs/mem-pool.h<br/>new file mode 100644<br/>index 00000000000..e5b3276d047<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/libglusterfs/src/glusterfs/mem-pool.h?id=d1d7a6f35c816822fab51c820e25023863c239c1'>libglusterfs/src/glusterfs/mem-pool.h</a></div><div class='hunk'>@@ -0,0 +1,336 @@</div><div class='add'>+/*</div><div class='add'>+  Copyright (c) 2008-2012 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#ifndef _MEM_POOL_H_</div><div class='add'>+#define _MEM_POOL_H_</div><div class='add'>+</div><div class='add'>+#include "glusterfs/list.h"</div><div class='add'>+#include "glusterfs/atomic.h"</div><div class='add'>+#include "glusterfs/logging.h"</div><div class='add'>+#include "glusterfs/mem-types.h"</div><div class='add'>+#include "glusterfs/glusterfs.h" /* for glusterfs_ctx_t */</div><div class='add'>+#include &lt;stdlib.h&gt;</div><div class='add'>+#include &lt;inttypes.h&gt;</div><div class='add'>+#include &lt;string.h&gt;</div><div class='add'>+#include &lt;stdarg.h&gt;</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+ * Need this for unit tests since inline functions</div><div class='add'>+ * access memory allocation and need to use the</div><div class='add'>+ * unit test versions</div><div class='add'>+ */</div><div class='add'>+#ifdef UNIT_TESTING</div><div class='add'>+#include &lt;stddef.h&gt;</div><div class='add'>+#include &lt;setjmp.h&gt;</div><div class='add'>+#include &lt;cmocka.h&gt;</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#define GF_MEM_TRAILER_SIZE 8</div><div class='add'>+#define GF_MEM_HEADER_MAGIC 0xCAFEBABE</div><div class='add'>+#define GF_MEM_TRAILER_MAGIC 0xBAADF00D</div><div class='add'>+#define GF_MEM_INVALID_MAGIC 0xDEADC0DE</div><div class='add'>+</div><div class='add'>+#define POOL_SMALLEST 7 /* i.e. 128 */</div><div class='add'>+#define POOL_LARGEST 20 /* i.e. 1048576 */</div><div class='add'>+#define NPOOLS (POOL_LARGEST - POOL_SMALLEST + 1)</div><div class='add'>+</div><div class='add'>+struct mem_acct_rec {</div><div class='add'>+    const char *typestr;</div><div class='add'>+    uint64_t size;</div><div class='add'>+    uint64_t max_size;</div><div class='add'>+    uint64_t total_allocs;</div><div class='add'>+    uint32_t num_allocs;</div><div class='add'>+    uint32_t max_num_allocs;</div><div class='add'>+    gf_lock_t lock;</div><div class='add'>+#ifdef DEBUG</div><div class='add'>+    struct list_head obj_list;</div><div class='add'>+#endif</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct mem_acct {</div><div class='add'>+    uint32_t num_types;</div><div class='add'>+    gf_atomic_t refcnt;</div><div class='add'>+    struct mem_acct_rec rec[0];</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct mem_header {</div><div class='add'>+    uint32_t type;</div><div class='add'>+    size_t size;</div><div class='add'>+    struct mem_acct *mem_acct;</div><div class='add'>+    uint32_t magic;</div><div class='add'>+#ifdef DEBUG</div><div class='add'>+    struct list_head acct_list;</div><div class='add'>+#endif</div><div class='add'>+    int padding[8];</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+#define GF_MEM_HEADER_SIZE (sizeof(struct mem_header))</div><div class='add'>+</div><div class='add'>+#ifdef DEBUG</div><div class='add'>+struct mem_invalid {</div><div class='add'>+    uint32_t magic;</div><div class='add'>+    void *mem_acct;</div><div class='add'>+    uint32_t type;</div><div class='add'>+    size_t size;</div><div class='add'>+    void *baseaddr;</div><div class='add'>+};</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+void *</div><div class='add'>+__gf_calloc(size_t cnt, size_t size, uint32_t type, const char *typestr);</div><div class='add'>+</div><div class='add'>+void *</div><div class='add'>+__gf_malloc(size_t size, uint32_t type, const char *typestr);</div><div class='add'>+</div><div class='add'>+void *</div><div class='add'>+__gf_realloc(void *ptr, size_t size);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+gf_vasprintf(char **string_ptr, const char *format, va_list arg);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+gf_asprintf(char **string_ptr, const char *format, ...)</div><div class='add'>+    __attribute__((__format__(__printf__, 2, 3)));</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+__gf_free(void *ptr);</div><div class='add'>+</div><div class='add'>+static inline void *</div><div class='add'>+__gf_default_malloc(size_t size)</div><div class='add'>+{</div><div class='add'>+    void *ptr = NULL;</div><div class='add'>+</div><div class='add'>+    ptr = malloc(size);</div><div class='add'>+    if (!ptr)</div><div class='add'>+        gf_msg_nomem("", GF_LOG_ALERT, size);</div><div class='add'>+</div><div class='add'>+    return ptr;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static inline void *</div><div class='add'>+__gf_default_calloc(int cnt, size_t size)</div><div class='add'>+{</div><div class='add'>+    void *ptr = NULL;</div><div class='add'>+</div><div class='add'>+    ptr = calloc(cnt, size);</div><div class='add'>+    if (!ptr)</div><div class='add'>+        gf_msg_nomem("", GF_LOG_ALERT, (cnt * size));</div><div class='add'>+</div><div class='add'>+    return ptr;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static inline void *</div><div class='add'>+__gf_default_realloc(void *oldptr, size_t size)</div><div class='add'>+{</div><div class='add'>+    void *ptr = NULL;</div><div class='add'>+</div><div class='add'>+    ptr = realloc(oldptr, size);</div><div class='add'>+    if (!ptr)</div><div class='add'>+        gf_msg_nomem("", GF_LOG_ALERT, size);</div><div class='add'>+</div><div class='add'>+    return ptr;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#define MALLOC(size) __gf_default_malloc(size)</div><div class='add'>+#define CALLOC(cnt, size) __gf_default_calloc(cnt, size)</div><div class='add'>+#define REALLOC(ptr, size) __gf_default_realloc(ptr, size)</div><div class='add'>+</div><div class='add'>+#define FREE(ptr)                                                              \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        if (ptr != NULL) {                                                     \</div><div class='add'>+            free((void *)ptr);                                                 \</div><div class='add'>+            ptr = (void *)0xeeeeeeee;                                          \</div><div class='add'>+        }                                                                      \</div><div class='add'>+    } while (0)</div><div class='add'>+</div><div class='add'>+#define GF_CALLOC(nmemb, size, type) __gf_calloc(nmemb, size, type, #type)</div><div class='add'>+</div><div class='add'>+#define GF_MALLOC(size, type) __gf_malloc(size, type, #type)</div><div class='add'>+</div><div class='add'>+#define GF_REALLOC(ptr, size) __gf_realloc(ptr, size)</div><div class='add'>+</div><div class='add'>+#define GF_FREE(free_ptr) __gf_free(free_ptr)</div><div class='add'>+</div><div class='add'>+static inline char *</div><div class='add'>+gf_strndup(const char *src, size_t len)</div><div class='add'>+{</div><div class='add'>+    char *dup_str = NULL;</div><div class='add'>+</div><div class='add'>+    if (!src) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    dup_str = GF_MALLOC(len + 1, gf_common_mt_strdup);</div><div class='add'>+    if (!dup_str) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    memcpy(dup_str, src, len);</div><div class='add'>+    dup_str[len] = '\0';</div><div class='add'>+out:</div><div class='add'>+    return dup_str;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static inline char *</div><div class='add'>+gf_strdup(const char *src)</div><div class='add'>+{</div><div class='add'>+    if (!src)</div><div class='add'>+        return NULL;</div><div class='add'>+</div><div class='add'>+    return gf_strndup(src, strlen(src));</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static inline void *</div><div class='add'>+gf_memdup(const void *src, size_t size)</div><div class='add'>+{</div><div class='add'>+    void *dup_mem = NULL;</div><div class='add'>+</div><div class='add'>+    dup_mem = GF_MALLOC(size, gf_common_mt_memdup);</div><div class='add'>+    if (!dup_mem)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    memcpy(dup_mem, src, size);</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return dup_mem;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#ifdef GF_DISABLE_MEMPOOL</div><div class='add'>+</div><div class='add'>+/* No-op memory pool enough to fit current API without massive redesign. */</div><div class='add'>+</div><div class='add'>+struct mem_pool {</div><div class='add'>+    unsigned long sizeof_type;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+#define mem_pools_init()                                                       \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+    } while (0)</div><div class='add'>+#define mem_pools_fini()                                                       \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+    } while (0)</div><div class='add'>+#define mem_pool_thread_destructor(pool_list) (void)pool_list</div><div class='add'>+</div><div class='add'>+#else /* !GF_DISABLE_MEMPOOL */</div><div class='add'>+</div><div class='add'>+/* kind of 'header' for the actual mem_pool_shared structure, this might make</div><div class='add'>+ * it possible to dump some more details in a statedump */</div><div class='add'>+struct mem_pool {</div><div class='add'>+    /* object size, without pooled_obj_hdr_t */</div><div class='add'>+    unsigned long sizeof_type;</div><div class='add'>+    unsigned long count; /* requested pool size (unused) */</div><div class='add'>+    char *name;</div><div class='add'>+    char *xl_name;</div><div class='add'>+    gf_atomic_t active;     /* current allocations */</div><div class='add'>+#ifdef DEBUG</div><div class='add'>+    gf_atomic_t hit;        /* number of allocations served from pt_pool */</div><div class='add'>+    gf_atomic_t miss;       /* number of std allocs due to miss */</div><div class='add'>+#endif</div><div class='add'>+    struct list_head owner; /* glusterfs_ctx_t-&gt;mempool_list */</div><div class='add'>+    glusterfs_ctx_t *ctx;   /* take ctx-&gt;lock when updating owner */</div><div class='add'>+</div><div class='add'>+    struct mem_pool_shared *pool; /* the initial pool that was returned */</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+typedef struct pooled_obj_hdr {</div><div class='add'>+    unsigned long magic;</div><div class='add'>+    struct pooled_obj_hdr *next;</div><div class='add'>+    struct per_thread_pool_list *pool_list;</div><div class='add'>+    unsigned int power_of_two;</div><div class='add'>+</div><div class='add'>+    /* track the pool that was used to request this object */</div><div class='add'>+    struct mem_pool *pool;</div><div class='add'>+} pooled_obj_hdr_t;</div><div class='add'>+</div><div class='add'>+/* Each memory block inside a pool has a fixed size that is a power of two.</div><div class='add'>+ * However each object will have a header that will reduce the available</div><div class='add'>+ * space. */</div><div class='add'>+#define AVAILABLE_SIZE(p2) ((1UL &lt;&lt; (p2)) - sizeof(pooled_obj_hdr_t))</div><div class='add'>+</div><div class='add'>+typedef struct per_thread_pool {</div><div class='add'>+    /* the pool that was used to request this allocation */</div><div class='add'>+    struct mem_pool_shared *parent;</div><div class='add'>+    /* Everything else is protected by our own lock. */</div><div class='add'>+    pooled_obj_hdr_t *hot_list;</div><div class='add'>+    pooled_obj_hdr_t *cold_list;</div><div class='add'>+} per_thread_pool_t;</div><div class='add'>+</div><div class='add'>+typedef struct per_thread_pool_list {</div><div class='add'>+    /* thr_list is used to place the TLS pool_list into the active global list</div><div class='add'>+     * (pool_threads) or the inactive global list (pool_free_threads). It's</div><div class='add'>+     * protected by the global pool_lock. */</div><div class='add'>+    struct list_head thr_list;</div><div class='add'>+</div><div class='add'>+    /* This lock is used to update poison and the hot/cold lists of members</div><div class='add'>+     * of 'pools' array. */</div><div class='add'>+    pthread_spinlock_t lock;</div><div class='add'>+</div><div class='add'>+    /* This field is used to mark a pool_list as not being owned by any thread.</div><div class='add'>+     * This means that the sweeper thread won't be cleaning objects stored in</div><div class='add'>+     * its pools. mem_put() uses it to decide if the object being released is</div><div class='add'>+     * placed into its original pool_list or directly destroyed. */</div><div class='add'>+    bool poison;</div><div class='add'>+</div><div class='add'>+    /*</div><div class='add'>+     * There's really more than one pool, but the actual number is hidden</div><div class='add'>+     * in the implementation code so we just make it a single-element array</div><div class='add'>+     * here.</div><div class='add'>+     */</div><div class='add'>+    per_thread_pool_t pools[1];</div><div class='add'>+} per_thread_pool_list_t;</div><div class='add'>+</div><div class='add'>+/* actual pool structure, shared between different mem_pools */</div><div class='add'>+struct mem_pool_shared {</div><div class='add'>+    unsigned int power_of_two;</div><div class='add'>+    /*</div><div class='add'>+     * Updates to these are *not* protected by a global lock, so races</div><div class='add'>+     * could occur and the numbers might be slightly off.  Don't expect</div><div class='add'>+     * them to line up exactly.  It's the general trends that matter, and</div><div class='add'>+     * it's not worth the locked-bus-cycle overhead to make these precise.</div><div class='add'>+     */</div><div class='add'>+    gf_atomic_t allocs_hot;</div><div class='add'>+    gf_atomic_t allocs_cold;</div><div class='add'>+    gf_atomic_t allocs_stdc;</div><div class='add'>+    gf_atomic_t frees_to_list;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+mem_pools_init(void); /* start the pool_sweeper thread */</div><div class='add'>+void</div><div class='add'>+mem_pools_fini(void); /* cleanup memory pools */</div><div class='add'>+void</div><div class='add'>+mem_pool_thread_destructor(per_thread_pool_list_t *pool_list);</div><div class='add'>+</div><div class='add'>+#endif /* GF_DISABLE_MEMPOOL */</div><div class='add'>+</div><div class='add'>+struct mem_pool *</div><div class='add'>+mem_pool_new_fn(glusterfs_ctx_t *ctx, unsigned long sizeof_type,</div><div class='add'>+                unsigned long count, char *name);</div><div class='add'>+</div><div class='add'>+#define mem_pool_new(type, count)                                              \</div><div class='add'>+    mem_pool_new_fn(THIS-&gt;ctx, sizeof(type), count, #type)</div><div class='add'>+</div><div class='add'>+#define mem_pool_new_ctx(ctx, type, count)                                     \</div><div class='add'>+    mem_pool_new_fn(ctx, sizeof(type), count, #type)</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+mem_put(void *ptr);</div><div class='add'>+void *</div><div class='add'>+mem_get(struct mem_pool *pool);</div><div class='add'>+void *</div><div class='add'>+mem_get0(struct mem_pool *pool);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+mem_pool_destroy(struct mem_pool *pool);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+gf_mem_acct_enable_set(void *ctx);</div><div class='add'>+</div><div class='add'>+#endif /* _MEM_POOL_H */</div><div class='head'>diff --git a/libglusterfs/src/glusterfs/mem-types.h b/libglusterfs/src/glusterfs/mem-types.h<br/>new file mode 100644<br/>index 00000000000..d45d5b68c91<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/libglusterfs/src/glusterfs/mem-types.h?id=d1d7a6f35c816822fab51c820e25023863c239c1'>libglusterfs/src/glusterfs/mem-types.h</a></div><div class='hunk'>@@ -0,0 +1,139 @@</div><div class='add'>+/*</div><div class='add'>+  Copyright (c) 2008-2016 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#ifndef __MEM_TYPES_H__</div><div class='add'>+#define __MEM_TYPES_H__</div><div class='add'>+</div><div class='add'>+enum gf_common_mem_types_ {</div><div class='add'>+    gf_common_mt_dnscache6, /* used only in one location */</div><div class='add'>+    gf_common_mt_event_pool,</div><div class='add'>+    gf_common_mt_reg,</div><div class='add'>+    gf_common_mt_pollfd,    /* used only in one location */</div><div class='add'>+    gf_common_mt_fdentry_t, /* used only in one location */</div><div class='add'>+    gf_common_mt_fdtable_t, /* used only in one location */</div><div class='add'>+    gf_common_mt_fd_ctx,    /* used only in one location */</div><div class='add'>+    gf_common_mt_gf_dirent_t,</div><div class='add'>+    gf_common_mt_inode_t,   /* used only in one location */</div><div class='add'>+    gf_common_mt_inode_ctx, /* used only in one location */</div><div class='add'>+    gf_common_mt_list_head,</div><div class='add'>+    gf_common_mt_inode_table_t, /* used only in one location */</div><div class='add'>+    gf_common_mt_xlator_t,</div><div class='add'>+    gf_common_mt_xlator_list_t, /* used only in one location */</div><div class='add'>+    gf_common_mt_volume_opt_list_t,</div><div class='add'>+    gf_common_mt_gf_timer_t,          /* used only in one location */</div><div class='add'>+    gf_common_mt_gf_timer_registry_t, /* used only in one location */</div><div class='add'>+    gf_common_mt_auth_handle_t,       /* used only in one location */</div><div class='add'>+    gf_common_mt_iobuf,               /* used only in one location */</div><div class='add'>+    gf_common_mt_iobuf_arena,         /* used only in one location */</div><div class='add'>+    gf_common_mt_iobref,              /* used only in one location */</div><div class='add'>+    gf_common_mt_iobuf_pool,          /* used only in one location */</div><div class='add'>+    gf_common_mt_iovec,</div><div class='add'>+    gf_common_mt_memdup,   /* used only in one location */</div><div class='add'>+    gf_common_mt_asprintf, /* used only in one location */</div><div class='add'>+    gf_common_mt_strdup,</div><div class='add'>+    gf_common_mt_socket_private_t, /* used only in one location */</div><div class='add'>+    gf_common_mt_ioq,              /* used only in one location */</div><div class='add'>+    gf_common_mt_char,</div><div class='add'>+    gf_common_mt_rbthash_table_t,      /* used only in one location */</div><div class='add'>+    gf_common_mt_rbthash_bucket,       /* used only in one location */</div><div class='add'>+    gf_common_mt_mem_pool,             /* used only in one location */</div><div class='add'>+    gf_common_mt_rpcsvc_auth_list,     /* used only in one location */</div><div class='add'>+    gf_common_mt_rpcsvc_t,             /* used only in one location */</div><div class='add'>+    gf_common_mt_rpcsvc_program_t,     /* used only in one location */</div><div class='add'>+    gf_common_mt_rpcsvc_listener_t,    /* used only in one location */</div><div class='add'>+    gf_common_mt_rpcsvc_wrapper_t,     /* used only in one location */</div><div class='add'>+    gf_common_mt_rpcclnt_t,            /* used only in one location */</div><div class='add'>+    gf_common_mt_rpcclnt_savedframe_t, /* used only in one location */</div><div class='add'>+    gf_common_mt_rpc_trans_t,</div><div class='add'>+    gf_common_mt_rpc_trans_pollin_t,  /* used only in one location */</div><div class='add'>+    gf_common_mt_rpc_trans_reqinfo_t, /* used only in one location */</div><div class='add'>+    gf_common_mt_glusterfs_graph_t,</div><div class='add'>+    gf_common_mt_rdma_private_t,       /* used only in one location */</div><div class='add'>+    gf_common_mt_rpc_transport_t,      /* used only in one location */</div><div class='add'>+    gf_common_mt_rdma_post_t,          /* used only in one location */</div><div class='add'>+    gf_common_mt_qpent,                /* used only in one location */</div><div class='add'>+    gf_common_mt_rdma_device_t,        /* used only in one location */</div><div class='add'>+    gf_common_mt_rdma_arena_mr,        /* used only in one location */</div><div class='add'>+    gf_common_mt_sge,                  /* used only in one location */</div><div class='add'>+    gf_common_mt_rpcclnt_cb_program_t, /* used only in one location */</div><div class='add'>+    gf_common_mt_libxl_marker_local,   /* used only in one location */</div><div class='add'>+    gf_common_mt_graph_buf,            /* used only in one location */</div><div class='add'>+    gf_common_mt_trie_trie,            /* used only in one location */</div><div class='add'>+    gf_common_mt_trie_data,            /* used only in one location */</div><div class='add'>+    gf_common_mt_trie_node,            /* used only in one location */</div><div class='add'>+    gf_common_mt_trie_buf,             /* used only in one location */</div><div class='add'>+    gf_common_mt_run_argv,             /* used only in one location */</div><div class='add'>+    gf_common_mt_run_logbuf,           /* used only in one location */</div><div class='add'>+    gf_common_mt_fd_lk_ctx_t,          /* used only in one location */</div><div class='add'>+    gf_common_mt_fd_lk_ctx_node_t,     /* used only in one location */</div><div class='add'>+    gf_common_mt_buffer_t,             /* used only in one location */</div><div class='add'>+    gf_common_mt_circular_buffer_t,    /* used only in one location */</div><div class='add'>+    gf_common_mt_eh_t,</div><div class='add'>+    gf_common_mt_store_handle_t, /* used only in one location */</div><div class='add'>+    gf_common_mt_store_iter_t,   /* used only in one location */</div><div class='add'>+    gf_common_mt_drc_client_t,   /* used only in one location */</div><div class='add'>+    gf_common_mt_drc_globals_t,  /* used only in one location */</div><div class='add'>+    gf_common_mt_groups_t,</div><div class='add'>+    gf_common_mt_cliententry_t, /* used only in one location */</div><div class='add'>+    gf_common_mt_clienttable_t, /* used only in one location */</div><div class='add'>+    gf_common_mt_client_t,      /* used only in one location */</div><div class='add'>+    gf_common_mt_client_ctx,    /* used only in one location */</div><div class='add'>+    gf_common_mt_auxgids,       /* used only in one location */</div><div class='add'>+    gf_common_mt_syncopctx,     /* used only in one location */</div><div class='add'>+    gf_common_mt_iobrefs,       /* used only in one location */</div><div class='add'>+    gf_common_mt_gsync_status_t,</div><div class='add'>+    gf_common_mt_uuid_t,</div><div class='add'>+    gf_common_mt_mgmt_v3_lock_obj_t, /* used only in one location */</div><div class='add'>+    gf_common_mt_txn_opinfo_obj_t,   /* used only in one location */</div><div class='add'>+    gf_common_mt_strfd_t,            /* used only in one location */</div><div class='add'>+    gf_common_mt_strfd_data_t,       /* used only in one location */</div><div class='add'>+    gf_common_mt_regex_t,            /* used only in one location */</div><div class='add'>+    gf_common_mt_ereg,               /* used only in one location */</div><div class='add'>+    gf_common_mt_wr,                 /* used only in one location */</div><div class='add'>+    gf_common_mt_dnscache,           /* used only in one location */</div><div class='add'>+    gf_common_mt_dnscache_entry,     /* used only in one location */</div><div class='add'>+    gf_common_mt_parser_t,           /* used only in one location */</div><div class='add'>+    gf_common_quota_meta_t,</div><div class='add'>+    gf_common_mt_rbuf_t,  /* used only in one location */</div><div class='add'>+    gf_common_mt_rlist_t, /* used only in one location */</div><div class='add'>+    gf_common_mt_rvec_t,  /* used only in one location */</div><div class='add'>+    /* glusterd can load the nfs-xlator dynamically and needs these two */</div><div class='add'>+    gf_common_mt_nfs_netgroups,   /* used only in one location */</div><div class='add'>+    gf_common_mt_nfs_exports,     /* used only in one location */</div><div class='add'>+    gf_common_mt_gf_brick_spec_t, /* used only in one location */</div><div class='add'>+    gf_common_mt_int,</div><div class='add'>+    gf_common_mt_pointer,</div><div class='add'>+    gf_common_mt_synctask,  /* used only in one location */</div><div class='add'>+    gf_common_mt_syncstack, /* used only in one location */</div><div class='add'>+    gf_common_mt_syncenv,   /* used only in one location */</div><div class='add'>+    gf_common_mt_scan_data, /* used only in one location */</div><div class='add'>+    gf_common_list_node,</div><div class='add'>+    gf_mt_default_args_t,     /* used only in one location */</div><div class='add'>+    gf_mt_default_args_cbk_t, /* used only in one location */</div><div class='add'>+    /*used for compound fops*/</div><div class='add'>+    gf_mt_compound_req_t, /* used only in one location */</div><div class='add'>+    gf_mt_compound_rsp_t, /* used only in one location */</div><div class='add'>+    gf_common_mt_tw_ctx,  /* used only in one location */</div><div class='add'>+    gf_common_mt_tw_timer_list,</div><div class='add'>+    /*lock migration*/</div><div class='add'>+    gf_common_mt_lock_mig,</div><div class='add'>+    /* throttle */</div><div class='add'>+    gf_common_mt_tbf_t,          /* used only in one location */</div><div class='add'>+    gf_common_mt_tbf_bucket_t,   /* used only in one location */</div><div class='add'>+    gf_common_mt_tbf_throttle_t, /* used only in one location */</div><div class='add'>+    gf_common_mt_pthread_t,      /* used only in one location */</div><div class='add'>+    gf_common_ping_local_t,      /* used only in one location */</div><div class='add'>+    gf_common_volfile_t,</div><div class='add'>+    gf_common_mt_mgmt_v3_lock_timer_t, /* used only in one location */</div><div class='add'>+    gf_common_mt_server_cmdline_t,     /* used only in one location */</div><div class='add'>+    gf_common_mt_latency_t,</div><div class='add'>+    gf_common_mt_end</div><div class='add'>+};</div><div class='add'>+#endif</div><div class='head'>diff --git a/libglusterfs/src/glusterfs/monitoring.h b/libglusterfs/src/glusterfs/monitoring.h<br/>new file mode 100644<br/>index 00000000000..09d9f54e734<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/libglusterfs/src/glusterfs/monitoring.h?id=d1d7a6f35c816822fab51c820e25023863c239c1'>libglusterfs/src/glusterfs/monitoring.h</a></div><div class='hunk'>@@ -0,0 +1,21 @@</div><div class='add'>+/*</div><div class='add'>+  Copyright (c) 2017 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#ifndef __MONITORING_H__</div><div class='add'>+#define __MONITORING_H__</div><div class='add'>+</div><div class='add'>+#include "glusterfs/glusterfs.h"</div><div class='add'>+</div><div class='add'>+#define GLUSTER_METRICS_DIR "/var/run/gluster/metrics"</div><div class='add'>+</div><div class='add'>+char *</div><div class='add'>+gf_monitor_metrics(glusterfs_ctx_t *ctx);</div><div class='add'>+</div><div class='add'>+#endif /* __MONITORING_H__ */</div><div class='head'>diff --git a/libglusterfs/src/glusterfs/options.h b/libglusterfs/src/glusterfs/options.h<br/>new file mode 100644<br/>index 00000000000..747b13ba375<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/libglusterfs/src/glusterfs/options.h?id=d1d7a6f35c816822fab51c820e25023863c239c1'>libglusterfs/src/glusterfs/options.h</a></div><div class='hunk'>@@ -0,0 +1,327 @@</div><div class='add'>+/*</div><div class='add'>+  Copyright (c) 2008-2012 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#ifndef _OPTIONS_H</div><div class='add'>+#define _OPTIONS_H</div><div class='add'>+</div><div class='add'>+#include &lt;stdio.h&gt;</div><div class='add'>+#include &lt;stdint.h&gt;</div><div class='add'>+#include &lt;inttypes.h&gt;</div><div class='add'>+</div><div class='add'>+#include "glusterfs/xlator.h"</div><div class='add'>+#include "glusterfs/libglusterfs-messages.h"</div><div class='add'>+/* Add possible new type of option you may need */</div><div class='add'>+typedef enum {</div><div class='add'>+    GF_OPTION_TYPE_ANY = 0,</div><div class='add'>+    GF_OPTION_TYPE_STR,</div><div class='add'>+    GF_OPTION_TYPE_INT,</div><div class='add'>+    GF_OPTION_TYPE_SIZET,</div><div class='add'>+    GF_OPTION_TYPE_PERCENT,</div><div class='add'>+    GF_OPTION_TYPE_PERCENT_OR_SIZET,</div><div class='add'>+    GF_OPTION_TYPE_BOOL,</div><div class='add'>+    GF_OPTION_TYPE_XLATOR,</div><div class='add'>+    GF_OPTION_TYPE_PATH,</div><div class='add'>+    GF_OPTION_TYPE_TIME,</div><div class='add'>+    GF_OPTION_TYPE_DOUBLE,</div><div class='add'>+    GF_OPTION_TYPE_INTERNET_ADDRESS,</div><div class='add'>+    GF_OPTION_TYPE_INTERNET_ADDRESS_LIST,</div><div class='add'>+    GF_OPTION_TYPE_PRIORITY_LIST,</div><div class='add'>+    GF_OPTION_TYPE_SIZE_LIST,</div><div class='add'>+    GF_OPTION_TYPE_CLIENT_AUTH_ADDR,</div><div class='add'>+    GF_OPTION_TYPE_MAX,</div><div class='add'>+} volume_option_type_t;</div><div class='add'>+</div><div class='add'>+typedef enum {</div><div class='add'>+    GF_OPT_VALIDATE_BOTH = 0,</div><div class='add'>+    GF_OPT_VALIDATE_MIN,</div><div class='add'>+    GF_OPT_VALIDATE_MAX,</div><div class='add'>+} opt_validate_type_t;</div><div class='add'>+</div><div class='add'>+typedef enum {</div><div class='add'>+    OPT_FLAG_NONE = 0,</div><div class='add'>+    OPT_FLAG_SETTABLE = 1 &lt;&lt; 0,   /* can be set using volume set */</div><div class='add'>+    OPT_FLAG_CLIENT_OPT = 1 &lt;&lt; 1, /* affects clients */</div><div class='add'>+    OPT_FLAG_GLOBAL = 1</div><div class='add'>+                      &lt;&lt; 2, /* affects all instances of the particular xlator */</div><div class='add'>+    OPT_FLAG_FORCE = 1 &lt;&lt; 3,       /* needs force to be reset */</div><div class='add'>+    OPT_FLAG_NEVER_RESET = 1 &lt;&lt; 4, /* which should not be reset */</div><div class='add'>+    OPT_FLAG_DOC = 1 &lt;&lt; 5,         /* can be shown in volume set help */</div><div class='add'>+} opt_flags_t;</div><div class='add'>+</div><div class='add'>+typedef enum {</div><div class='add'>+    OPT_STATUS_ADVANCED = 0,</div><div class='add'>+    OPT_STATUS_BASIC = 1,</div><div class='add'>+    OPT_STATUS_EXPERIMENTAL = 2,</div><div class='add'>+    OPT_STATUS_DEPRECATED = 3,</div><div class='add'>+} opt_level_t;</div><div class='add'>+</div><div class='add'>+#define ZR_VOLUME_MAX_NUM_KEY 4</div><div class='add'>+#define ZR_OPTION_MAX_ARRAY_SIZE 64</div><div class='add'>+/* The maximum number of releases that an option could be backported to</div><div class='add'>+ * based on the release schedule as in August 2017 (3), plus one more</div><div class='add'>+ * Refer comment on volume_options.op_version for more information.</div><div class='add'>+ */</div><div class='add'>+#define GF_MAX_RELEASES 4</div><div class='add'>+</div><div class='add'>+/* Custom validation functoins for options</div><div class='add'>+ * TODO: Need to check what sorts of validation is being done, and decide if</div><div class='add'>+ * passing the volinfo is actually required. If it is, then we should possibly</div><div class='add'>+ * try a solution in GD2 for this.</div><div class='add'>+ */</div><div class='add'>+/* typedef int (*option_validation_fn) (glusterd_volinfo_t *volinfo, dict_t</div><div class='add'>+ *dict, char *key, char *value, char **op_errstr);</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+/* Each translator should define this structure */</div><div class='add'>+/* XXX: This structure is in use by GD2, and SHOULD NOT be modified.</div><div class='add'>+ * If there is a need to add new members, add them to the end of the structure.</div><div class='add'>+ * If the struct must be modified, GD2 MUST be updated as well</div><div class='add'>+ */</div><div class='add'>+typedef struct volume_options {</div><div class='add'>+    char *key[ZR_VOLUME_MAX_NUM_KEY];</div><div class='add'>+    /* different key, same meaning */</div><div class='add'>+    volume_option_type_t type;</div><div class='add'>+    double min; /* 0 means no range */</div><div class='add'>+    double max; /* 0 means no range */</div><div class='add'>+    char *value[ZR_OPTION_MAX_ARRAY_SIZE];</div><div class='add'>+    /* If specified, will check for one of</div><div class='add'>+       the value from this array */</div><div class='add'>+    char *default_value;</div><div class='add'>+    char *description; /* about the key */</div><div class='add'>+    /* Required for int options where only the min value</div><div class='add'>+     * is given and is 0. This will cause validation not to</div><div class='add'>+     * happen</div><div class='add'>+     */</div><div class='add'>+    opt_validate_type_t validate;</div><div class='add'>+</div><div class='add'>+    /* The op-version at which this option was introduced.</div><div class='add'>+     * This is an array to support options that get backported to supported</div><div class='add'>+     * releases.</div><div class='add'>+     * Normally, an option introduced for a major release just has a single</div><div class='add'>+     * entry in the array, with op-version of the major release</div><div class='add'>+     * For an option that is backported, the op-versions of the all the</div><div class='add'>+     * releases it was ported to should be added, starting from the newest,</div><div class='add'>+     * to the oldest.</div><div class='add'>+     */</div><div class='add'>+    uint32_t op_version[GF_MAX_RELEASES];</div><div class='add'>+    /* The op-version at which this option was deprecated.</div><div class='add'>+     * Follows the same rules as above.</div><div class='add'>+     */</div><div class='add'>+    uint32_t deprecated[GF_MAX_RELEASES];</div><div class='add'>+    /* Additional flags for an option</div><div class='add'>+     * Check the OPT_FLAG_* enums for available flags</div><div class='add'>+     */</div><div class='add'>+    uint32_t flags;</div><div class='add'>+    /* Tags applicable to this option, which can be used to group similar</div><div class='add'>+     * options</div><div class='add'>+     */</div><div class='add'>+    char *tags[ZR_OPTION_MAX_ARRAY_SIZE];</div><div class='add'>+    /* A custom validation function if required</div><div class='add'>+     * TODO: See todo above for option_validation_fn</div><div class='add'>+     */</div><div class='add'>+    /* option_validation_fn validate_fn; */</div><div class='add'>+    /* This is actual key that should be set in the options dict. Can</div><div class='add'>+     * contain varstrings</div><div class='add'>+     */</div><div class='add'>+    char *setkey;</div><div class='add'>+</div><div class='add'>+    /* A 'level' is about the technical depth / understanding one</div><div class='add'>+       needs to handle the option. 'category' is based on</div><div class='add'>+       quality (ie, tests, people behind it, documentation available) */</div><div class='add'>+</div><div class='add'>+    /* The level at which the option is classified */</div><div class='add'>+    opt_level_t level;</div><div class='add'>+</div><div class='add'>+    /* Flag to understand how this option is categorized */</div><div class='add'>+    gf_category_t category;</div><div class='add'>+} volume_option_t;</div><div class='add'>+</div><div class='add'>+typedef struct vol_opt_list {</div><div class='add'>+    struct list_head list;</div><div class='add'>+    volume_option_t *given_opt;</div><div class='add'>+} volume_opt_list_t;</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+xlator_tree_reconfigure(xlator_t *old_xl, xlator_t *new_xl);</div><div class='add'>+int</div><div class='add'>+xlator_validate_rec(xlator_t *xlator, char **op_errstr);</div><div class='add'>+int</div><div class='add'>+graph_reconf_validateopt(glusterfs_graph_t *graph, char **op_errstr);</div><div class='add'>+int</div><div class='add'>+xlator_option_info_list(volume_opt_list_t *list, char *key, char **def_val,</div><div class='add'>+                        char **descr);</div><div class='add'>+/*</div><div class='add'>+int validate_xlator_volume_options (xlator_t *xl, dict_t *options,</div><div class='add'>+                                    volume_option_t *opt, char **op_errstr);</div><div class='add'>+*/</div><div class='add'>+int</div><div class='add'>+xlator_options_validate_list(xlator_t *xl, dict_t *options,</div><div class='add'>+                             volume_opt_list_t *list, char **op_errstr);</div><div class='add'>+int</div><div class='add'>+xlator_option_validate(xlator_t *xl, char *key, char *value,</div><div class='add'>+                       volume_option_t *opt, char **op_errstr);</div><div class='add'>+int</div><div class='add'>+xlator_options_validate(xlator_t *xl, dict_t *options, char **errstr);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+xlator_option_validate_addr_list(xlator_t *xl, const char *key,</div><div class='add'>+                                 const char *value, volume_option_t *opt,</div><div class='add'>+                                 char **op_errstr);</div><div class='add'>+</div><div class='add'>+volume_option_t *</div><div class='add'>+xlator_volume_option_get(xlator_t *xl, const char *key);</div><div class='add'>+</div><div class='add'>+volume_option_t *</div><div class='add'>+xlator_volume_option_get_list(volume_opt_list_t *vol_list, const char *key);</div><div class='add'>+</div><div class='add'>+#define DECLARE_INIT_OPT(type_t, type)                                         \</div><div class='add'>+    int xlator_option_init_##type(xlator_t *this, dict_t *options, char *key,  \</div><div class='add'>+                                  type_t *val_p);</div><div class='add'>+</div><div class='add'>+DECLARE_INIT_OPT(char *, str);</div><div class='add'>+DECLARE_INIT_OPT(uint64_t, uint64);</div><div class='add'>+DECLARE_INIT_OPT(int64_t, int64);</div><div class='add'>+DECLARE_INIT_OPT(uint32_t, uint32);</div><div class='add'>+DECLARE_INIT_OPT(int32_t, int32);</div><div class='add'>+DECLARE_INIT_OPT(uint64_t, size);</div><div class='add'>+DECLARE_INIT_OPT(uint64_t, size_uint64);</div><div class='add'>+DECLARE_INIT_OPT(double, percent);</div><div class='add'>+DECLARE_INIT_OPT(double, percent_or_size);</div><div class='add'>+DECLARE_INIT_OPT(gf_boolean_t, bool);</div><div class='add'>+DECLARE_INIT_OPT(xlator_t *, xlator);</div><div class='add'>+DECLARE_INIT_OPT(char *, path);</div><div class='add'>+DECLARE_INIT_OPT(double, double);</div><div class='add'>+DECLARE_INIT_OPT(uint32_t, time);</div><div class='add'>+</div><div class='add'>+#define DEFINE_INIT_OPT(type_t, type, conv)                                    \</div><div class='add'>+    int xlator_option_init_##type(xlator_t *this, dict_t *options, char *key,  \</div><div class='add'>+                                  type_t *val_p)                               \</div><div class='add'>+    {                                                                          \</div><div class='add'>+        int ret = 0;                                                           \</div><div class='add'>+        volume_option_t *opt = NULL;                                           \</div><div class='add'>+        char *def_value = NULL;                                                \</div><div class='add'>+        char *set_value = NULL;                                                \</div><div class='add'>+        char *value = NULL;                                                    \</div><div class='add'>+        xlator_t *old_THIS = NULL;                                             \</div><div class='add'>+                                                                               \</div><div class='add'>+        opt = xlator_volume_option_get(this, key);                             \</div><div class='add'>+        if (!opt) {                                                            \</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_WARNING, EINVAL, LG_MSG_INVALID_ENTRY,   \</div><div class='add'>+                   "unknown option: %s", key);                                 \</div><div class='add'>+            ret = -1;                                                          \</div><div class='add'>+            return ret;                                                        \</div><div class='add'>+        }                                                                      \</div><div class='add'>+        def_value = opt-&gt;default_value;                                        \</div><div class='add'>+        ret = dict_get_str(options, key, &amp;set_value);                          \</div><div class='add'>+                                                                               \</div><div class='add'>+        if (def_value)                                                         \</div><div class='add'>+            value = def_value;                                                 \</div><div class='add'>+        if (set_value)                                                         \</div><div class='add'>+            value = set_value;                                                 \</div><div class='add'>+        if (!value) {                                                          \</div><div class='add'>+            gf_msg_trace(this-&gt;name, 0, "option %s not set", key);             \</div><div class='add'>+            *val_p = (type_t)0;                                                \</div><div class='add'>+            return 0;                                                          \</div><div class='add'>+        }                                                                      \</div><div class='add'>+        if (value == def_value) {                                              \</div><div class='add'>+            gf_msg_trace(this-&gt;name, 0,                                        \</div><div class='add'>+                         "option %s using default"                             \</div><div class='add'>+                         " value %s",                                          \</div><div class='add'>+                         key, value);                                          \</div><div class='add'>+        } else {                                                               \</div><div class='add'>+            gf_msg_debug(this-&gt;name, 0,                                        \</div><div class='add'>+                         "option %s using set"                                 \</div><div class='add'>+                         " value %s",                                          \</div><div class='add'>+                         key, value);                                          \</div><div class='add'>+        }                                                                      \</div><div class='add'>+        old_THIS = THIS;                                                       \</div><div class='add'>+        THIS = this;                                                           \</div><div class='add'>+        ret = conv(value, val_p);                                              \</div><div class='add'>+        THIS = old_THIS;                                                       \</div><div class='add'>+        if (ret) {                                                             \</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_INFO, 0, LG_MSG_CONVERSION_FAILED,       \</div><div class='add'>+                   "option %s conversion failed value %s", key, value);        \</div><div class='add'>+            return ret;                                                        \</div><div class='add'>+        }                                                                      \</div><div class='add'>+        ret = xlator_option_validate(this, key, value, opt, NULL);             \</div><div class='add'>+        return ret;                                                            \</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+#define GF_OPTION_INIT(key, val, type, err_label)                              \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        int val_ret = 0;                                                       \</div><div class='add'>+        val_ret = xlator_option_init_##type(THIS, THIS-&gt;options, key, &amp;(val)); \</div><div class='add'>+        if (val_ret)                                                           \</div><div class='add'>+            goto err_label;                                                    \</div><div class='add'>+    } while (0)</div><div class='add'>+</div><div class='add'>+#define DECLARE_RECONF_OPT(type_t, type)                                       \</div><div class='add'>+    int xlator_option_reconf_##type(xlator_t *this, dict_t *options,           \</div><div class='add'>+                                    char *key, int keylen, type_t *val_p);</div><div class='add'>+</div><div class='add'>+DECLARE_RECONF_OPT(char *, str);</div><div class='add'>+DECLARE_RECONF_OPT(uint64_t, uint64);</div><div class='add'>+DECLARE_RECONF_OPT(int64_t, int64);</div><div class='add'>+DECLARE_RECONF_OPT(uint32_t, uint32);</div><div class='add'>+DECLARE_RECONF_OPT(int32_t, int32);</div><div class='add'>+DECLARE_RECONF_OPT(uint64_t, size);</div><div class='add'>+DECLARE_RECONF_OPT(uint64_t, size_uint64);</div><div class='add'>+DECLARE_RECONF_OPT(double, percent);</div><div class='add'>+DECLARE_RECONF_OPT(double, percent_or_size);</div><div class='add'>+DECLARE_RECONF_OPT(gf_boolean_t, bool);</div><div class='add'>+DECLARE_RECONF_OPT(xlator_t *, xlator);</div><div class='add'>+DECLARE_RECONF_OPT(char *, path);</div><div class='add'>+DECLARE_RECONF_OPT(double, double);</div><div class='add'>+DECLARE_RECONF_OPT(uint32_t, time);</div><div class='add'>+</div><div class='add'>+#define DEFINE_RECONF_OPT(type_t, type, conv)                                  \</div><div class='add'>+    int xlator_option_reconf_##type(xlator_t *this, dict_t *options,           \</div><div class='add'>+                                    char *key, int keylen, type_t *val_p)      \</div><div class='add'>+    {                                                                          \</div><div class='add'>+        int ret = 0;                                                           \</div><div class='add'>+        char *value = NULL;                                                    \</div><div class='add'>+        xlator_t *old_THIS = NULL;                                             \</div><div class='add'>+                                                                               \</div><div class='add'>+        volume_option_t *opt = xlator_volume_option_get(this, key);            \</div><div class='add'>+        if (!opt) {                                                            \</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_WARNING, EINVAL, LG_MSG_INVALID_ENTRY,   \</div><div class='add'>+                   "unknown option: %s", key);                                 \</div><div class='add'>+            return -1;                                                         \</div><div class='add'>+        }                                                                      \</div><div class='add'>+        ret = dict_get_strn(options, key, keylen, &amp;value);                     \</div><div class='add'>+        if (ret == 0 &amp;&amp; value) {                                               \</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_INFO, 0, 0,                              \</div><div class='add'>+                   "option %s using set value %s", key, value);                \</div><div class='add'>+        } else if (opt-&gt;default_value) {                                       \</div><div class='add'>+            value = opt-&gt;default_value;                                        \</div><div class='add'>+            gf_msg_trace(this-&gt;name, 0, "option %s using default value %s",    \</div><div class='add'>+                         key, value);                                          \</div><div class='add'>+        } else {                                                               \</div><div class='add'>+            gf_msg_trace(this-&gt;name, 0, "option %s not set", key);             \</div><div class='add'>+            *val_p = (type_t)0;                                                \</div><div class='add'>+            return 0;                                                          \</div><div class='add'>+        }                                                                      \</div><div class='add'>+                                                                               \</div><div class='add'>+        old_THIS = THIS;                                                       \</div><div class='add'>+        THIS = this;                                                           \</div><div class='add'>+        ret = conv(value, val_p);                                              \</div><div class='add'>+        THIS = old_THIS;                                                       \</div><div class='add'>+        if (ret)                                                               \</div><div class='add'>+            return ret;                                                        \</div><div class='add'>+        return xlator_option_validate(this, key, value, opt, NULL);            \</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+#define GF_OPTION_RECONF(key, val, opt, type, err_label)                       \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        if (xlator_option_reconf_##type(THIS, opt, key, SLEN(key), &amp;(val)))    \</div><div class='add'>+            goto err_label;                                                    \</div><div class='add'>+    } while (0)</div><div class='add'>+</div><div class='add'>+#endif /* !_OPTIONS_H */</div><div class='head'>diff --git a/libglusterfs/src/glusterfs/parse-utils.h b/libglusterfs/src/glusterfs/parse-utils.h<br/>new file mode 100644<br/>index 00000000000..8653b9dd180<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/libglusterfs/src/glusterfs/parse-utils.h?id=d1d7a6f35c816822fab51c820e25023863c239c1'>libglusterfs/src/glusterfs/parse-utils.h</a></div><div class='hunk'>@@ -0,0 +1,50 @@</div><div class='add'>+/*</div><div class='add'>+   Copyright 2014-present Facebook. All Rights Reserved</div><div class='add'>+</div><div class='add'>+   This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+   Author :</div><div class='add'>+   Shreyas Siravara &lt;shreyas.siravara@gmail.com&gt;</div><div class='add'>+</div><div class='add'>+   This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+   General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+   later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+   cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#ifndef _PARSE_UTILS_H</div><div class='add'>+#define _PARSE_UTILS_H</div><div class='add'>+</div><div class='add'>+#include &lt;regex.h&gt;</div><div class='add'>+</div><div class='add'>+#define GF_PARSE "parse-utils"</div><div class='add'>+</div><div class='add'>+struct parser {</div><div class='add'>+    regex_t preg;         /* Compiled regex */</div><div class='add'>+    regmatch_t pmatch[1]; /* The match */</div><div class='add'>+    char *complete_str;   /* The string we are parsing */</div><div class='add'>+    char *regex;          /* Regex used to parse the string */</div><div class='add'>+    char *_rstr;          /* Temp string to hold offsets */</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+/* Initializes some of the parsers variables */</div><div class='add'>+struct parser *</div><div class='add'>+parser_init(const char *regex);</div><div class='add'>+</div><div class='add'>+/* Sets the string to parse */</div><div class='add'>+int</div><div class='add'>+parser_set_string(struct parser *parser, const char *complete_str);</div><div class='add'>+</div><div class='add'>+/* Frees memory used by the string after all matches are found */</div><div class='add'>+int</div><div class='add'>+parser_unset_string(struct parser *parser);</div><div class='add'>+</div><div class='add'>+/* Free memory used by the parser */</div><div class='add'>+void</div><div class='add'>+parser_deinit(struct parser *ptr);</div><div class='add'>+</div><div class='add'>+/* Get the next matching string */</div><div class='add'>+char *</div><div class='add'>+parser_get_next_match(struct parser *parser);</div><div class='add'>+</div><div class='add'>+#endif /* _PARSE_UTILS_H */</div><div class='head'>diff --git a/libglusterfs/src/glusterfs/quota-common-utils.h b/libglusterfs/src/glusterfs/quota-common-utils.h<br/>new file mode 100644<br/>index 00000000000..0096e340756<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/libglusterfs/src/glusterfs/quota-common-utils.h?id=d1d7a6f35c816822fab51c820e25023863c239c1'>libglusterfs/src/glusterfs/quota-common-utils.h</a></div><div class='hunk'>@@ -0,0 +1,68 @@</div><div class='add'>+/*</div><div class='add'>+   Copyright (c) 2015 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+   This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+   This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+   General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+   later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+   cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#ifndef _QUOTA_COMMON_UTILS_H</div><div class='add'>+#define _QUOTA_COMMON_UTILS_H</div><div class='add'>+</div><div class='add'>+#include "glusterfs/iatt.h"</div><div class='add'>+</div><div class='add'>+#define GF_QUOTA_CONF_VERSION 1.2</div><div class='add'>+#define QUOTA_CONF_HEADER "GlusterFS Quota conf | version: v1.2\n"</div><div class='add'>+#define QUOTA_CONF_HEADER_1_1 "GlusterFS Quota conf | version: v1.1\n"</div><div class='add'>+</div><div class='add'>+typedef enum {</div><div class='add'>+    GF_QUOTA_CONF_TYPE_USAGE = 1,</div><div class='add'>+    GF_QUOTA_CONF_TYPE_OBJECTS</div><div class='add'>+} gf_quota_conf_type_t;</div><div class='add'>+</div><div class='add'>+struct _quota_limits {</div><div class='add'>+    int64_t hl;</div><div class='add'>+    int64_t sl;</div><div class='add'>+} __attribute__((__packed__));</div><div class='add'>+typedef struct _quota_limits quota_limits_t;</div><div class='add'>+</div><div class='add'>+struct _quota_meta {</div><div class='add'>+    int64_t size;</div><div class='add'>+    int64_t file_count;</div><div class='add'>+    int64_t dir_count;</div><div class='add'>+} __attribute__((__packed__));</div><div class='add'>+typedef struct _quota_meta quota_meta_t;</div><div class='add'>+</div><div class='add'>+gf_boolean_t</div><div class='add'>+quota_meta_is_null(const quota_meta_t *meta);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+quota_data_to_meta(data_t *data, quota_meta_t *meta);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+quota_dict_get_inode_meta(dict_t *dict, char *key, const int keylen,</div><div class='add'>+                          quota_meta_t *meta);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+quota_dict_get_meta(dict_t *dict, char *key, const int keylen,</div><div class='add'>+                    quota_meta_t *meta);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+quota_dict_set_meta(dict_t *dict, char *key, const quota_meta_t *meta,</div><div class='add'>+                    ia_type_t ia_type);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+quota_conf_read_header(int fd, char *buf);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+quota_conf_read_version(int fd, float *version);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+quota_conf_read_gfid(int fd, void *buf, char *type, float version);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+quota_conf_skip_header(int fd);</div><div class='add'>+</div><div class='add'>+#endif /* _QUOTA_COMMON_UTILS_H */</div><div class='head'>diff --git a/libglusterfs/src/glusterfs/rbthash.h b/libglusterfs/src/glusterfs/rbthash.h<br/>new file mode 100644<br/>index 00000000000..4c731de69c2<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/libglusterfs/src/glusterfs/rbthash.h?id=d1d7a6f35c816822fab51c820e25023863c239c1'>libglusterfs/src/glusterfs/rbthash.h</a></div><div class='hunk'>@@ -0,0 +1,75 @@</div><div class='add'>+/*</div><div class='add'>+  Copyright (c) 2008-2012 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#ifndef __RBTHASH_TABLE_H_</div><div class='add'>+#define __RBTHASH_TABLE_H_</div><div class='add'>+</div><div class='add'>+#include &lt;stdint.h&gt;               // for uint32_t</div><div class='add'>+#include "glusterfs/glusterfs.h"  // for gf_boolean_t, glusterfs_ctx_t</div><div class='add'>+#include "glusterfs/list.h"       // for list_head</div><div class='add'>+#include "glusterfs/locking.h"    // for gf_lock_t</div><div class='add'>+struct mem_pool;</div><div class='add'>+</div><div class='add'>+#define GF_RBTHASH_MEMPOOL 16384  // 1048576</div><div class='add'>+#define GF_RBTHASH "rbthash"</div><div class='add'>+</div><div class='add'>+struct rbthash_bucket {</div><div class='add'>+    struct rb_table *bucket;</div><div class='add'>+    gf_lock_t bucketlock;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+typedef struct rbthash_entry {</div><div class='add'>+    void *data;</div><div class='add'>+    void *key;</div><div class='add'>+    int keylen;</div><div class='add'>+    uint32_t keyhash;</div><div class='add'>+    struct list_head list;</div><div class='add'>+} rbthash_entry_t;</div><div class='add'>+</div><div class='add'>+typedef uint32_t (*rbt_hasher_t)(void *data, int len);</div><div class='add'>+typedef void (*rbt_data_destroyer_t)(void *data);</div><div class='add'>+typedef void (*rbt_traverse_t)(void *data, void *mydata);</div><div class='add'>+</div><div class='add'>+typedef struct rbthash_table {</div><div class='add'>+    int size;</div><div class='add'>+    int numbuckets;</div><div class='add'>+    struct mem_pool *entrypool;</div><div class='add'>+    gf_lock_t tablelock;</div><div class='add'>+    struct rbthash_bucket *buckets;</div><div class='add'>+    rbt_hasher_t hashfunc;</div><div class='add'>+    rbt_data_destroyer_t dfunc;</div><div class='add'>+    gf_boolean_t pool_alloced;</div><div class='add'>+    struct list_head list;</div><div class='add'>+} rbthash_table_t;</div><div class='add'>+</div><div class='add'>+extern rbthash_table_t *</div><div class='add'>+rbthash_table_init(glusterfs_ctx_t *ctx, int buckets, rbt_hasher_t hfunc,</div><div class='add'>+                   rbt_data_destroyer_t dfunc, unsigned long expected_entries,</div><div class='add'>+                   struct mem_pool *entrypool);</div><div class='add'>+</div><div class='add'>+extern int</div><div class='add'>+rbthash_insert(rbthash_table_t *tbl, void *data, void *key, int keylen);</div><div class='add'>+</div><div class='add'>+extern void *</div><div class='add'>+rbthash_get(rbthash_table_t *tbl, void *key, int keylen);</div><div class='add'>+</div><div class='add'>+extern void *</div><div class='add'>+rbthash_remove(rbthash_table_t *tbl, void *key, int keylen);</div><div class='add'>+</div><div class='add'>+extern void *</div><div class='add'>+rbthash_replace(rbthash_table_t *tbl, void *key, int keylen, void *newdata);</div><div class='add'>+</div><div class='add'>+extern void</div><div class='add'>+rbthash_table_destroy(rbthash_table_t *tbl);</div><div class='add'>+</div><div class='add'>+extern void</div><div class='add'>+rbthash_table_traverse(rbthash_table_t *tbl, rbt_traverse_t traverse,</div><div class='add'>+                       void *mydata);</div><div class='add'>+#endif</div><div class='head'>diff --git a/libglusterfs/src/glusterfs/refcount.h b/libglusterfs/src/glusterfs/refcount.h<br/>new file mode 100644<br/>index 00000000000..cf922dabb05<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/libglusterfs/src/glusterfs/refcount.h?id=d1d7a6f35c816822fab51c820e25023863c239c1'>libglusterfs/src/glusterfs/refcount.h</a></div><div class='hunk'>@@ -0,0 +1,101 @@</div><div class='add'>+/*</div><div class='add'>+  Copyright (c) 2015 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#ifndef _REFCOUNT_H</div><div class='add'>+#define _REFCOUNT_H</div><div class='add'>+</div><div class='add'>+/* check for compiler support for __sync_*_and_fetch()</div><div class='add'>+ *</div><div class='add'>+ * a more comprehensive feature test is shown at</div><div class='add'>+ * http://lists.iptel.org/pipermail/semsdev/2010-October/005075.html</div><div class='add'>+ * this is sufficient for RHEL5 i386 builds</div><div class='add'>+ */</div><div class='add'>+#if (__GNUC__ &gt; 4 || (__GNUC__ == 4 &amp;&amp; __GNUC_MINOR__ &gt;= 1)) &amp;&amp;                \</div><div class='add'>+    !defined(__i386__)</div><div class='add'>+#undef REFCOUNT_NEEDS_LOCK</div><div class='add'>+#else</div><div class='add'>+#define REFCOUNT_NEEDS_LOCK</div><div class='add'>+#include "glusterfs/locking.h"</div><div class='add'>+#endif /* compiler support for __sync_*_and_fetch() */</div><div class='add'>+</div><div class='add'>+typedef void (*gf_ref_release_t)(void *data);</div><div class='add'>+</div><div class='add'>+struct _gf_ref {</div><div class='add'>+#ifdef REFCOUNT_NEEDS_LOCK</div><div class='add'>+    gf_lock_t lk; /* lock for atomically adjust cnt */</div><div class='add'>+#endif</div><div class='add'>+    unsigned int cnt; /* number of users, free on 0 */</div><div class='add'>+</div><div class='add'>+    gf_ref_release_t release; /* cleanup when cnt == 0 */</div><div class='add'>+    void *data;               /* parameter passed to release() */</div><div class='add'>+};</div><div class='add'>+typedef struct _gf_ref gf_ref_t;</div><div class='add'>+</div><div class='add'>+/* _gf_ref_get -- increase the refcount</div><div class='add'>+ *</div><div class='add'>+ * @return: greater then 0 when a reference was taken, 0 when not</div><div class='add'>+ */</div><div class='add'>+void *</div><div class='add'>+_gf_ref_get(gf_ref_t *ref);</div><div class='add'>+</div><div class='add'>+/* _gf_ref_put -- decrease the refcount</div><div class='add'>+ *</div><div class='add'>+ * @return: greater then 0 when there are still references, 0 when cleanup</div><div class='add'>+ *          should be done, gf_ref_release_t is called on cleanup</div><div class='add'>+ */</div><div class='add'>+unsigned int</div><div class='add'>+_gf_ref_put(gf_ref_t *ref);</div><div class='add'>+</div><div class='add'>+/* _gf_ref_init -- initialize an embedded refcount object</div><div class='add'>+ *</div><div class='add'>+ * @release: function to call when the refcount == 0</div><div class='add'>+ * @data: parameter to be passed to @release</div><div class='add'>+ */</div><div class='add'>+void</div><div class='add'>+_gf_ref_init(gf_ref_t *ref, gf_ref_release_t release, void *data);</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+ * Strong suggestion to use the simplified GF_REF_* API.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+/* GF_REF_DECL -- declaration to put inside your structure</div><div class='add'>+ *</div><div class='add'>+ * Example:</div><div class='add'>+ *   struct my_struct {</div><div class='add'>+ *       GF_REF_DECL;</div><div class='add'>+ *</div><div class='add'>+ *       ... // additional members</div><div class='add'>+ *   };</div><div class='add'>+ */</div><div class='add'>+#define GF_REF_DECL gf_ref_t _ref</div><div class='add'>+</div><div class='add'>+/* GF_REF_INIT -- initialize a GF_REF_DECL structure</div><div class='add'>+ *</div><div class='add'>+ * @p: allocated structure with GF_REF_DECL</div><div class='add'>+ * @d: destructor to call once refcounting reaches 0</div><div class='add'>+ *</div><div class='add'>+ * Sets the refcount to 1.</div><div class='add'>+ */</div><div class='add'>+#define GF_REF_INIT(p, d) _gf_ref_init(&amp;(p)-&gt;_ref, (gf_ref_release_t)d, p)</div><div class='add'>+</div><div class='add'>+/* GF_REF_GET -- increase the refcount of a GF_REF_DECL structure</div><div class='add'>+ *</div><div class='add'>+ * @return: greater then 0 when a reference was taken, 0 when not</div><div class='add'>+ */</div><div class='add'>+#define GF_REF_GET(p) _gf_ref_get(&amp;(p)-&gt;_ref)</div><div class='add'>+</div><div class='add'>+/* GF_REF_PUT -- decrease the refcount of a GF_REF_DECL structure</div><div class='add'>+ *</div><div class='add'>+ * @return: greater then 0 when there are still references, 0 when cleanup</div><div class='add'>+ *          should be done, gf_ref_release_t is called on cleanup</div><div class='add'>+ */</div><div class='add'>+#define GF_REF_PUT(p) _gf_ref_put(&amp;(p)-&gt;_ref)</div><div class='add'>+</div><div class='add'>+#endif /* _REFCOUNT_H */</div><div class='head'>diff --git a/libglusterfs/src/glusterfs/revision.h b/libglusterfs/src/glusterfs/revision.h<br/>new file mode 100644<br/>index 00000000000..3c404d30e78<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/libglusterfs/src/glusterfs/revision.h?id=d1d7a6f35c816822fab51c820e25023863c239c1'>libglusterfs/src/glusterfs/revision.h</a></div><div class='hunk'>@@ -0,0 +1 @@</div><div class='add'>+#define GLUSTERFS_REPOSITORY_REVISION "git://git.gluster.org/glusterfs.git"</div><div class='head'>diff --git a/libglusterfs/src/glusterfs/rot-buffs.h b/libglusterfs/src/glusterfs/rot-buffs.h<br/>new file mode 100644<br/>index 00000000000..9dc227d58b8<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/libglusterfs/src/glusterfs/rot-buffs.h?id=d1d7a6f35c816822fab51c820e25023863c239c1'>libglusterfs/src/glusterfs/rot-buffs.h</a></div><div class='hunk'>@@ -0,0 +1,125 @@</div><div class='add'>+/*</div><div class='add'>+  Copyright (c) 2008-2015 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#ifndef __ROT_BUFFS_H</div><div class='add'>+#define __ROT_BUFFS_H</div><div class='add'>+</div><div class='add'>+#include "glusterfs/list.h"</div><div class='add'>+#include "glusterfs/locking.h"</div><div class='add'>+#include "glusterfs/common-utils.h"</div><div class='add'>+</div><div class='add'>+typedef struct rbuf_iovec {</div><div class='add'>+    struct iovec iov;</div><div class='add'>+</div><div class='add'>+    struct list_head list;</div><div class='add'>+} rbuf_iovec_t;</div><div class='add'>+</div><div class='add'>+#define RBUF_IOVEC_SIZE (sizeof(rbuf_iovec_t))</div><div class='add'>+</div><div class='add'>+typedef struct rbuf_list {</div><div class='add'>+    gf_lock_t c_lock;</div><div class='add'>+</div><div class='add'>+    pthread_mutex_t b_lock; /* protects this structure */</div><div class='add'>+    pthread_cond_t b_cond;  /* signal for writer completion */</div><div class='add'>+</div><div class='add'>+    gf_boolean_t awaiting;</div><div class='add'>+</div><div class='add'>+    unsigned long long pending;   /* pending writers */</div><div class='add'>+    unsigned long long completed; /* completed writers */</div><div class='add'>+</div><div class='add'>+    rbuf_iovec_t *rvec; /* currently used IO vector */</div><div class='add'>+</div><div class='add'>+    struct list_head veclist; /* list of attached rbuf_iov */</div><div class='add'>+</div><div class='add'>+    unsigned long long used;  /* consumable entries</div><div class='add'>+                                  attached in -&gt;veclist */</div><div class='add'>+    unsigned long long total; /* total entries in -&gt;veclist (used</div><div class='add'>+                                 during deallocation) */</div><div class='add'>+</div><div class='add'>+    unsigned long seq[2]; /* if interested, this whould store</div><div class='add'>+                             the start sequence number and the</div><div class='add'>+                             range */</div><div class='add'>+</div><div class='add'>+    struct list_head list; /* attachment to rbuf_t */</div><div class='add'>+} rbuf_list_t;</div><div class='add'>+</div><div class='add'>+struct rlist_iter {</div><div class='add'>+    struct list_head veclist;</div><div class='add'>+</div><div class='add'>+    unsigned long long iter;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+#define RLIST_ENTRY_COUNT(rlist) rlist-&gt;used</div><div class='add'>+</div><div class='add'>+#define rlist_iter_init(riter, rlist)                                          \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        (riter)-&gt;iter = rlist-&gt;used;                                           \</div><div class='add'>+        (riter)-&gt;veclist = rlist-&gt;veclist;                                     \</div><div class='add'>+    } while (0)</div><div class='add'>+</div><div class='add'>+#define rvec_for_each_entry(pos, riter)                                        \</div><div class='add'>+    for (pos = list_entry((riter)-&gt;veclist.next, typeof(*pos), list);          \</div><div class='add'>+         (riter)-&gt;iter &gt; 0;                                                    \</div><div class='add'>+         pos = list_entry(pos-&gt;list.next, typeof(*pos), list),                 \</div><div class='add'>+        --((riter)-&gt;iter))</div><div class='add'>+</div><div class='add'>+/**</div><div class='add'>+ * Sequence number assignment routine is called during buffer</div><div class='add'>+ * switch under rbuff -&gt;lock.</div><div class='add'>+ */</div><div class='add'>+typedef void(sequence_fn)(rbuf_list_t *, void *);</div><div class='add'>+</div><div class='add'>+#define RLIST_STORE_SEQ(rlist, start, range)                                   \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        rlist-&gt;seq[0] = start;                                                 \</div><div class='add'>+        rlist-&gt;seq[1] = range;                                                 \</div><div class='add'>+    } while (0)</div><div class='add'>+</div><div class='add'>+#define RLIST_GET_SEQ(rlist, start, range)                                     \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        start = rlist-&gt;seq[0];                                                 \</div><div class='add'>+        range = rlist-&gt;seq[1];                                                 \</div><div class='add'>+    } while (0)</div><div class='add'>+</div><div class='add'>+typedef struct rbuf {</div><div class='add'>+    gf_lock_t lock; /* protects "current" rlist */</div><div class='add'>+</div><div class='add'>+    rbuf_list_t *current; /* cached pointer to first free rlist */</div><div class='add'>+</div><div class='add'>+    struct list_head freelist;</div><div class='add'>+} rbuf_t;</div><div class='add'>+</div><div class='add'>+typedef enum {</div><div class='add'>+    RBUF_CONSUMABLE = 1,</div><div class='add'>+    RBUF_BUSY,</div><div class='add'>+    RBUF_EMPTY,</div><div class='add'>+    RBUF_WOULD_STARVE,</div><div class='add'>+} rlist_retval_t;</div><div class='add'>+</div><div class='add'>+/* Initialization/Destruction */</div><div class='add'>+rbuf_t *</div><div class='add'>+rbuf_init(int);</div><div class='add'>+void</div><div class='add'>+rbuf_dtor(rbuf_t *);</div><div class='add'>+</div><div class='add'>+/* Producer API */</div><div class='add'>+char *</div><div class='add'>+rbuf_reserve_write_area(rbuf_t *, size_t, void **);</div><div class='add'>+int</div><div class='add'>+rbuf_write_complete(void *);</div><div class='add'>+</div><div class='add'>+/* Consumer API */</div><div class='add'>+int</div><div class='add'>+rbuf_get_buffer(rbuf_t *, void **, sequence_fn *, void *);</div><div class='add'>+int</div><div class='add'>+rbuf_wait_for_completion(rbuf_t *, void *, void (*)(rbuf_list_t *, void *),</div><div class='add'>+                         void *);</div><div class='add'>+</div><div class='add'>+#endif</div><div class='head'>diff --git a/libglusterfs/src/glusterfs/run.h b/libglusterfs/src/glusterfs/run.h<br/>new file mode 100644<br/>index 00000000000..76af95fd27f<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/libglusterfs/src/glusterfs/run.h?id=d1d7a6f35c816822fab51c820e25023863c239c1'>libglusterfs/src/glusterfs/run.h</a></div><div class='hunk'>@@ -0,0 +1,207 @@</div><div class='add'>+/*</div><div class='add'>+  Copyright (c) 2008-2012 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#ifndef __RUN_H__</div><div class='add'>+#define __RUN_H__</div><div class='add'>+</div><div class='add'>+#define RUN_PIPE -1</div><div class='add'>+</div><div class='add'>+struct runner {</div><div class='add'>+    char **argv;</div><div class='add'>+    unsigned argvlen;</div><div class='add'>+    int runerr;</div><div class='add'>+    pid_t chpid;</div><div class='add'>+    int chfd[3];</div><div class='add'>+    FILE *chio[3];</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+typedef struct runner runner_t;</div><div class='add'>+</div><div class='add'>+/**</div><div class='add'>+ * initialize runner_t instance.</div><div class='add'>+ *</div><div class='add'>+ * @param runner pointer to runner_t instance</div><div class='add'>+ */</div><div class='add'>+void</div><div class='add'>+runinit(runner_t *runner);</div><div class='add'>+</div><div class='add'>+/**</div><div class='add'>+ * get FILE pointer to which child's stdio is redirected.</div><div class='add'>+ *</div><div class='add'>+ * @param runner pointer to runner_t instance</div><div class='add'>+ * @param fd specifies which standard file descriptor is</div><div class='add'>+ *        is asked for</div><div class='add'>+ *</div><div class='add'>+ * @see runner_redir()</div><div class='add'>+ */</div><div class='add'>+FILE *</div><div class='add'>+runner_chio(runner_t *runner, int fd);</div><div class='add'>+</div><div class='add'>+/**</div><div class='add'>+ * add an argument.</div><div class='add'>+ *</div><div class='add'>+ * 'arg' is duplicated.</div><div class='add'>+ *</div><div class='add'>+ * Errors are deferred, no error handling is necessary.</div><div class='add'>+ *</div><div class='add'>+ * @param runner pointer to runner_t instance</div><div class='add'>+ * @param arg    command line argument</div><div class='add'>+ */</div><div class='add'>+void</div><div class='add'>+runner_add_arg(runner_t *runner, const char *arg);</div><div class='add'>+</div><div class='add'>+/**</div><div class='add'>+ * add a sequence of arguments.</div><div class='add'>+ *</div><div class='add'>+ * Variadic function, calls runner_add_arg() on each vararg.</div><div class='add'>+ * Argument sequence MUST be NULL terminated.</div><div class='add'>+ *</div><div class='add'>+ * Errors are deferred, no error handling is necessary.</div><div class='add'>+ *</div><div class='add'>+ * @param runner pointer to runner_t instance</div><div class='add'>+ *</div><div class='add'>+ * @see runner_add_arg()</div><div class='add'>+ */</div><div class='add'>+void</div><div class='add'>+runner_add_args(runner_t *runner, ...);</div><div class='add'>+</div><div class='add'>+/**</div><div class='add'>+ * add an argument with printf style formatting.</div><div class='add'>+ *</div><div class='add'>+ * Errors are deferred, no error handling is necessary.</div><div class='add'>+ *</div><div class='add'>+ * @param runner pointer to runner_t instance</div><div class='add'>+ * @param format printf style format specifier</div><div class='add'>+ */</div><div class='add'>+void</div><div class='add'>+runner_argprintf(runner_t *runner, const char *format, ...)</div><div class='add'>+    __attribute__((__format__(__printf__, 2, 3)));</div><div class='add'>+/**</div><div class='add'>+ * log a message about the command to be run.</div><div class='add'>+ *</div><div class='add'>+ * @param runner  pointer to runner_t instance</div><div class='add'>+ *</div><div class='add'>+ * @param dom  log domain</div><div class='add'>+ * @param lvl  log level</div><div class='add'>+ * @param msg  message with which the command is prefixed in log</div><div class='add'>+ *</div><div class='add'>+ * @see gf_log()</div><div class='add'>+ */</div><div class='add'>+void</div><div class='add'>+runner_log(runner_t *runner, const char *dom, gf_loglevel_t lvl,</div><div class='add'>+           const char *msg);</div><div class='add'>+</div><div class='add'>+/**</div><div class='add'>+ * set up redirection for child.</div><div class='add'>+ *</div><div class='add'>+ * @param runner  pointer to runner_t instance</div><div class='add'>+ *</div><div class='add'>+ * @param fd      fd of child to redirect (0, 1, or 2)</div><div class='add'>+ * @param tgt_fd  fd on parent side to redirect to.</div><div class='add'>+ *                Note that runner_end() will close tgt_fd,</div><div class='add'>+ *                if user needs it in another context it should</div><div class='add'>+ *                be dup'd beforehand.</div><div class='add'>+ *                RUN_PIPE can be used for requiring a</div><div class='add'>+ *                pipe from child to parent. The FILE</div><div class='add'>+ *                created for this purpose will be</div><div class='add'>+ *                accessible via runner_chio() (after</div><div class='add'>+ *                runner_start() has been invoked).</div><div class='add'>+ *</div><div class='add'>+ * @see  runner_start(), dup(2), runner_chio(), runner_start()</div><div class='add'>+ */</div><div class='add'>+void</div><div class='add'>+runner_redir(runner_t *runner, int fd, int tgt_fd);</div><div class='add'>+</div><div class='add'>+/**</div><div class='add'>+ * spawn child with accumulated arg list.</div><div class='add'>+ *</div><div class='add'>+ * @param runner  pointer to runner_t instance</div><div class='add'>+ *</div><div class='add'>+ * @return  0 on successful spawn</div><div class='add'>+ *          -1 on failure (either due to earlier errors or execve(2) failing)</div><div class='add'>+ *</div><div class='add'>+ * @see runner_cout()</div><div class='add'>+ */</div><div class='add'>+int</div><div class='add'>+runner_start(runner_t *runner);</div><div class='add'>+</div><div class='add'>+/**</div><div class='add'>+ * complete operation and free resources.</div><div class='add'>+ *</div><div class='add'>+ * If child exists, waits for it. Redirections will be closed.</div><div class='add'>+ * Dynamically allocated memory shall be freed.</div><div class='add'>+ *</div><div class='add'>+ * @param runner  pointer to runner_t instance</div><div class='add'>+ *</div><div class='add'>+ * @return  0 if child terminated successfully</div><div class='add'>+ *          -1 if there is no running child</div><div class='add'>+ *          n &gt; 0 if child failed; value to be interpreted as status</div><div class='add'>+ *                in waitpid(2)</div><div class='add'>+ *</div><div class='add'>+ * @see waitpid(2)</div><div class='add'>+ */</div><div class='add'>+int</div><div class='add'>+runner_end(runner_t *runner);</div><div class='add'>+</div><div class='add'>+/**</div><div class='add'>+ * variant of runner_end() which does not free internal data</div><div class='add'>+ * so that the runner instance can be run again.</div><div class='add'>+ *</div><div class='add'>+ * @see runner_end()</div><div class='add'>+ */</div><div class='add'>+int</div><div class='add'>+runner_end_reuse(runner_t *runner);</div><div class='add'>+</div><div class='add'>+/**</div><div class='add'>+ * spawn and child, take it to completion and free resources.</div><div class='add'>+ *</div><div class='add'>+ * Essentially it's a concatenation of runner_start() and runner_end()</div><div class='add'>+ * with simplified return semantics.</div><div class='add'>+ *</div><div class='add'>+ * @param runner  pointer to runner_t instance</div><div class='add'>+ *</div><div class='add'>+ * @return  0 on success</div><div class='add'>+ *          -1 on failuire</div><div class='add'>+ *</div><div class='add'>+ * @see runner_start(), runner_end()</div><div class='add'>+ */</div><div class='add'>+int</div><div class='add'>+runner_run(runner_t *runner);</div><div class='add'>+</div><div class='add'>+/**</div><div class='add'>+ * variant for runner_run() which does not wait for acknowledgement</div><div class='add'>+ * from child, and always assumes it succeeds.</div><div class='add'>+ */</div><div class='add'>+int</div><div class='add'>+runner_run_nowait(runner_t *runner);</div><div class='add'>+</div><div class='add'>+/**</div><div class='add'>+ * variant of runner_run() which does not free internal data</div><div class='add'>+ * so that the runner instance can be run again.</div><div class='add'>+ *</div><div class='add'>+ * @see runner_run()</div><div class='add'>+ */</div><div class='add'>+int</div><div class='add'>+runner_run_reuse(runner_t *runner);</div><div class='add'>+</div><div class='add'>+/**</div><div class='add'>+ * run a command with args.</div><div class='add'>+ *</div><div class='add'>+ * Variadic function, child process is spawned with</div><div class='add'>+ * the given sequence of args and waited for.</div><div class='add'>+ * Argument sequence MUST be NULL terminated.</div><div class='add'>+ *</div><div class='add'>+ * @return 0 on success</div><div class='add'>+ *         -1 on failure</div><div class='add'>+ */</div><div class='add'>+int</div><div class='add'>+runcmd(const char *arg, ...);</div><div class='add'>+</div><div class='add'>+#endif</div><div class='head'>diff --git a/libglusterfs/src/glusterfs/stack.h b/libglusterfs/src/glusterfs/stack.h<br/>new file mode 100644<br/>index 00000000000..536a330d38b<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/libglusterfs/src/glusterfs/stack.h?id=d1d7a6f35c816822fab51c820e25023863c239c1'>libglusterfs/src/glusterfs/stack.h</a></div><div class='hunk'>@@ -0,0 +1,555 @@</div><div class='add'>+/*</div><div class='add'>+  Copyright (c) 2008-2012 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+  This file defines MACROS and static inlines used to emulate a function</div><div class='add'>+  call over asynchronous communication with remote server</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#ifndef _STACK_H</div><div class='add'>+#define _STACK_H</div><div class='add'>+</div><div class='add'>+struct _call_stack;</div><div class='add'>+typedef struct _call_stack call_stack_t;</div><div class='add'>+struct _call_frame;</div><div class='add'>+typedef struct _call_frame call_frame_t;</div><div class='add'>+struct call_pool;</div><div class='add'>+typedef struct call_pool call_pool_t;</div><div class='add'>+</div><div class='add'>+#include &lt;sys/time.h&gt;</div><div class='add'>+</div><div class='add'>+#include "glusterfs/xlator.h"</div><div class='add'>+#include "glusterfs/dict.h"</div><div class='add'>+#include "glusterfs/list.h"</div><div class='add'>+#include "glusterfs/common-utils.h"</div><div class='add'>+#include "glusterfs/lkowner.h"</div><div class='add'>+#include "glusterfs/client_t.h"</div><div class='add'>+#include "glusterfs/libglusterfs-messages.h"</div><div class='add'>+#include "glusterfs/timespec.h"</div><div class='add'>+</div><div class='add'>+#define NFS_PID 1</div><div class='add'>+#define LOW_PRIO_PROC_PID -1</div><div class='add'>+</div><div class='add'>+#define STACK_ERR_XL_NAME(stack) (stack-&gt;err_xl ? stack-&gt;err_xl-&gt;name : "-")</div><div class='add'>+#define STACK_CLIENT_NAME(stack)                                               \</div><div class='add'>+    (stack-&gt;client ? stack-&gt;client-&gt;client_uid : "-")</div><div class='add'>+</div><div class='add'>+typedef int32_t (*ret_fn_t)(call_frame_t *frame, call_frame_t *prev_frame,</div><div class='add'>+                            xlator_t *this, int32_t op_ret, int32_t op_errno,</div><div class='add'>+                            ...);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+gf_frame_latency_update(call_frame_t *frame);</div><div class='add'>+</div><div class='add'>+struct call_pool {</div><div class='add'>+    union {</div><div class='add'>+        struct list_head all_frames;</div><div class='add'>+        struct {</div><div class='add'>+            call_stack_t *next_call;</div><div class='add'>+            call_stack_t *prev_call;</div><div class='add'>+        } all_stacks;</div><div class='add'>+    };</div><div class='add'>+    int64_t cnt;</div><div class='add'>+    gf_atomic_t total_count;</div><div class='add'>+    gf_lock_t lock;</div><div class='add'>+    struct mem_pool *frame_mem_pool;</div><div class='add'>+    struct mem_pool *stack_mem_pool;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct _call_frame {</div><div class='add'>+    call_stack_t *root;   /* stack root */</div><div class='add'>+    call_frame_t *parent; /* previous BP */</div><div class='add'>+    struct list_head frames;</div><div class='add'>+    void *local;    /* local variables */</div><div class='add'>+    xlator_t *this; /* implicit object */</div><div class='add'>+    ret_fn_t ret;   /* op_return address */</div><div class='add'>+    int32_t ref_count;</div><div class='add'>+    gf_lock_t lock;</div><div class='add'>+    void *cookie; /* unique cookie */</div><div class='add'>+    gf_boolean_t complete;</div><div class='add'>+</div><div class='add'>+    glusterfs_fop_t op;</div><div class='add'>+    struct timespec begin; /* when this frame was created */</div><div class='add'>+    struct timespec end;   /* when this frame completed */</div><div class='add'>+    const char *wind_from;</div><div class='add'>+    const char *wind_to;</div><div class='add'>+    const char *unwind_from;</div><div class='add'>+    const char *unwind_to;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct _ns_info {</div><div class='add'>+    uint32_t hash;      /* Hash of the namespace from SuperFastHash */</div><div class='add'>+    gf_boolean_t found; /* Set to true if we found a namespace */</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+typedef struct _ns_info ns_info_t;</div><div class='add'>+</div><div class='add'>+#define SMALL_GROUP_COUNT 128</div><div class='add'>+</div><div class='add'>+struct _call_stack {</div><div class='add'>+    union {</div><div class='add'>+        struct list_head all_frames;</div><div class='add'>+        struct {</div><div class='add'>+            call_stack_t *next_call;</div><div class='add'>+            call_stack_t *prev_call;</div><div class='add'>+        };</div><div class='add'>+    };</div><div class='add'>+    call_pool_t *pool;</div><div class='add'>+    gf_lock_t stack_lock;</div><div class='add'>+    client_t *client;</div><div class='add'>+    uint64_t unique;</div><div class='add'>+    void *state; /* pointer to request state */</div><div class='add'>+    uid_t uid;</div><div class='add'>+    gid_t gid;</div><div class='add'>+    pid_t pid;</div><div class='add'>+    char identifier[UNIX_PATH_MAX];</div><div class='add'>+    uint16_t ngrps;</div><div class='add'>+    uint32_t groups_small[SMALL_GROUP_COUNT];</div><div class='add'>+    uint32_t *groups_large;</div><div class='add'>+    uint32_t *groups;</div><div class='add'>+    gf_lkowner_t lk_owner;</div><div class='add'>+    glusterfs_ctx_t *ctx;</div><div class='add'>+</div><div class='add'>+    struct list_head myframes; /* List of call_frame_t that go</div><div class='add'>+                                  to make the call stack */</div><div class='add'>+</div><div class='add'>+    int32_t op;</div><div class='add'>+    int8_t type;</div><div class='add'>+    struct timespec tv;</div><div class='add'>+    xlator_t *err_xl;</div><div class='add'>+    int32_t error;</div><div class='add'>+</div><div class='add'>+    uint32_t flags;        /* use it wisely, think of it as a mechanism to</div><div class='add'>+                              send information over the wire too */</div><div class='add'>+    struct timespec ctime; /* timestamp, most probably set at</div><div class='add'>+                              creation of stack. */</div><div class='add'>+</div><div class='add'>+    ns_info_t ns_info;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+/* call_stack flags field users */</div><div class='add'>+#define MDATA_CTIME (1 &lt;&lt; 0)</div><div class='add'>+#define MDATA_MTIME (1 &lt;&lt; 1)</div><div class='add'>+#define MDATA_ATIME (1 &lt;&lt; 2)</div><div class='add'>+#define MDATA_PAR_CTIME (1 &lt;&lt; 3)</div><div class='add'>+#define MDATA_PAR_MTIME (1 &lt;&lt; 4)</div><div class='add'>+#define MDATA_PAR_ATIME (1 &lt;&lt; 5)</div><div class='add'>+</div><div class='add'>+#define frame_set_uid_gid(frm, u, g)                                           \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        if (frm) {                                                             \</div><div class='add'>+            (frm)-&gt;root-&gt;uid = u;                                              \</div><div class='add'>+            (frm)-&gt;root-&gt;gid = g;                                              \</div><div class='add'>+            (frm)-&gt;root-&gt;ngrps = 0;                                            \</div><div class='add'>+        }                                                                      \</div><div class='add'>+    } while (0);</div><div class='add'>+</div><div class='add'>+struct xlator_fops;</div><div class='add'>+</div><div class='add'>+static inline void</div><div class='add'>+FRAME_DESTROY(call_frame_t *frame)</div><div class='add'>+{</div><div class='add'>+    void *local = NULL;</div><div class='add'>+</div><div class='add'>+    if (frame-&gt;root-&gt;ctx-&gt;measure_latency)</div><div class='add'>+        gf_frame_latency_update(frame);</div><div class='add'>+</div><div class='add'>+    list_del_init(&amp;frame-&gt;frames);</div><div class='add'>+    if (frame-&gt;local) {</div><div class='add'>+        local = frame-&gt;local;</div><div class='add'>+        frame-&gt;local = NULL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    LOCK_DESTROY(&amp;frame-&gt;lock);</div><div class='add'>+    mem_put(frame);</div><div class='add'>+</div><div class='add'>+    if (local)</div><div class='add'>+        mem_put(local);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static inline void</div><div class='add'>+STACK_DESTROY(call_stack_t *stack)</div><div class='add'>+{</div><div class='add'>+    call_frame_t *frame = NULL;</div><div class='add'>+    call_frame_t *tmp = NULL;</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;stack-&gt;pool-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        list_del_init(&amp;stack-&gt;all_frames);</div><div class='add'>+        stack-&gt;pool-&gt;cnt--;</div><div class='add'>+    }</div><div class='add'>+    UNLOCK(&amp;stack-&gt;pool-&gt;lock);</div><div class='add'>+</div><div class='add'>+    LOCK_DESTROY(&amp;stack-&gt;stack_lock);</div><div class='add'>+</div><div class='add'>+    list_for_each_entry_safe(frame, tmp, &amp;stack-&gt;myframes, frames)</div><div class='add'>+    {</div><div class='add'>+        FRAME_DESTROY(frame);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    GF_FREE(stack-&gt;groups_large);</div><div class='add'>+</div><div class='add'>+    mem_put(stack);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static inline void</div><div class='add'>+STACK_RESET(call_stack_t *stack)</div><div class='add'>+{</div><div class='add'>+    call_frame_t *frame = NULL;</div><div class='add'>+    call_frame_t *tmp = NULL;</div><div class='add'>+    call_frame_t *last = NULL;</div><div class='add'>+    struct list_head toreset = {0};</div><div class='add'>+</div><div class='add'>+    INIT_LIST_HEAD(&amp;toreset);</div><div class='add'>+</div><div class='add'>+    /* We acquire call_pool-&gt;lock only to remove the frames from this stack</div><div class='add'>+     * to preserve atomicity. This synchronizes across concurrent requests</div><div class='add'>+     * like statedump, STACK_DESTROY etc. */</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;stack-&gt;pool-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        last = list_last_entry(&amp;stack-&gt;myframes, call_frame_t, frames);</div><div class='add'>+        list_del_init(&amp;last-&gt;frames);</div><div class='add'>+        list_splice_init(&amp;stack-&gt;myframes, &amp;toreset);</div><div class='add'>+        list_add(&amp;last-&gt;frames, &amp;stack-&gt;myframes);</div><div class='add'>+    }</div><div class='add'>+    UNLOCK(&amp;stack-&gt;pool-&gt;lock);</div><div class='add'>+</div><div class='add'>+    list_for_each_entry_safe(frame, tmp, &amp;toreset, frames)</div><div class='add'>+    {</div><div class='add'>+        FRAME_DESTROY(frame);</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#define FRAME_SU_DO(frm, local_type)                                           \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        local_type *__local = (frm)-&gt;local;                                    \</div><div class='add'>+        __local-&gt;uid = frm-&gt;root-&gt;uid;                                         \</div><div class='add'>+        __local-&gt;gid = frm-&gt;root-&gt;gid;                                         \</div><div class='add'>+        __local-&gt;pid = frm-&gt;root-&gt;pid;                                         \</div><div class='add'>+        frm-&gt;root-&gt;uid = 0;                                                    \</div><div class='add'>+        frm-&gt;root-&gt;gid = 0;                                                    \</div><div class='add'>+        frm-&gt;root-&gt;pid = GF_CLIENT_PID_NO_ROOT_SQUASH;                         \</div><div class='add'>+    } while (0);</div><div class='add'>+</div><div class='add'>+#define FRAME_SU_UNDO(frm, local_type)                                         \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        local_type *__local = (frm)-&gt;local;                                    \</div><div class='add'>+        frm-&gt;root-&gt;uid = __local-&gt;uid;                                         \</div><div class='add'>+        frm-&gt;root-&gt;gid = __local-&gt;gid;                                         \</div><div class='add'>+        frm-&gt;root-&gt;pid = __local-&gt;pid;                                         \</div><div class='add'>+    } while (0);</div><div class='add'>+</div><div class='add'>+/* NOTE: make sure to keep this as an macro, mainly because, we need 'fn'</div><div class='add'>+   field here to be the proper fn ptr, so its address is valid entry in</div><div class='add'>+   'xlator_fops' struct.</div><div class='add'>+   To understand this, check the `xlator.h:struct xlator_fops`, and then</div><div class='add'>+   see a STACK_WIND call, which generally calls `subvol-&gt;fops-&gt;fop`, so</div><div class='add'>+   the address offset should give the index */</div><div class='add'>+</div><div class='add'>+/* +1 is required as 0 means NULL fop, and we don't have a variable for it */</div><div class='add'>+#define get_fop_index_from_fn(xl, fn)                                          \</div><div class='add'>+    (1 + (((long)&amp;(fn) - (long)&amp;((xl)-&gt;fops-&gt;stat)) / sizeof(void *)))</div><div class='add'>+</div><div class='add'>+/* NOTE: the above reason holds good here too. But notice that we are getting</div><div class='add'>+ the base address of the 'stat' fop, which is the first entry in the fop</div><div class='add'>+ structure. All we need to do is move as much as 'idx' fields, and get the</div><div class='add'>+ actual pointer from that field. */</div><div class='add'>+</div><div class='add'>+static inline void *</div><div class='add'>+get_the_pt_fop(void *base_fop, int fop_idx)</div><div class='add'>+{</div><div class='add'>+    void *target_addr = (base_fop + ((fop_idx - 1) * sizeof(void *)));</div><div class='add'>+    /* all below type casting is for not getting warning. */</div><div class='add'>+    return (void *)*(unsigned long *)target_addr;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* make a call without switching frames */</div><div class='add'>+#define STACK_WIND_TAIL(frame, obj, fn, params...)                             \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        xlator_t *old_THIS = NULL;                                             \</div><div class='add'>+        xlator_t *next_xl = obj;                                               \</div><div class='add'>+        typeof(fn) next_xl_fn = fn;                                            \</div><div class='add'>+        int opn = get_fop_index_from_fn((next_xl), (fn));                      \</div><div class='add'>+                                                                               \</div><div class='add'>+        frame-&gt;this = next_xl;                                                 \</div><div class='add'>+        frame-&gt;wind_to = #fn;                                                  \</div><div class='add'>+        old_THIS = THIS;                                                       \</div><div class='add'>+        THIS = next_xl;                                                        \</div><div class='add'>+        gf_msg_trace("stack-trace", 0,                                         \</div><div class='add'>+                     "stack-address: %p, "                                     \</div><div class='add'>+                     "winding from %s to %s",                                  \</div><div class='add'>+                     frame-&gt;root, old_THIS-&gt;name, THIS-&gt;name);                 \</div><div class='add'>+        /* Need to capture counts at leaf node */                              \</div><div class='add'>+        if (!next_xl-&gt;pass_through &amp;&amp; !next_xl-&gt;children) {                    \</div><div class='add'>+            GF_ATOMIC_INC(next_xl-&gt;stats.total.metrics[opn].fop);              \</div><div class='add'>+            GF_ATOMIC_INC(next_xl-&gt;stats.interval.metrics[opn].fop);           \</div><div class='add'>+            GF_ATOMIC_INC(next_xl-&gt;stats.total.count);                         \</div><div class='add'>+            GF_ATOMIC_INC(next_xl-&gt;stats.interval.count);                      \</div><div class='add'>+        }                                                                      \</div><div class='add'>+                                                                               \</div><div class='add'>+        if (next_xl-&gt;pass_through) {                                           \</div><div class='add'>+            next_xl_fn = get_the_pt_fop(&amp;next_xl-&gt;pass_through_fops-&gt;stat,     \</div><div class='add'>+                                        opn);                                  \</div><div class='add'>+        }                                                                      \</div><div class='add'>+        next_xl_fn(frame, next_xl, params);                                    \</div><div class='add'>+        THIS = old_THIS;                                                       \</div><div class='add'>+    } while (0)</div><div class='add'>+</div><div class='add'>+/* make a call */</div><div class='add'>+#define STACK_WIND(frame, rfn, obj, fn, params...)                             \</div><div class='add'>+    STACK_WIND_COMMON(frame, rfn, 0, NULL, obj, fn, params)</div><div class='add'>+</div><div class='add'>+/* make a call with a cookie */</div><div class='add'>+#define STACK_WIND_COOKIE(frame, rfn, cky, obj, fn, params...)                 \</div><div class='add'>+    STACK_WIND_COMMON(frame, rfn, 1, cky, obj, fn, params)</div><div class='add'>+</div><div class='add'>+/* Cookie passed as the argument can be NULL (ptr) or 0 (int). Hence we</div><div class='add'>+   have to have a mechanism to separate out the two STACK_WIND formats.</div><div class='add'>+   Needed a common macro, as other than for cookie, all the other code</div><div class='add'>+   is common across.</div><div class='add'>+ */</div><div class='add'>+#define STACK_WIND_COMMON(frame, rfn, has_cookie, cky, obj, fn, params...)     \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        call_frame_t *_new = NULL;                                             \</div><div class='add'>+        xlator_t *old_THIS = NULL;                                             \</div><div class='add'>+        typeof(fn) next_xl_fn = fn;                                            \</div><div class='add'>+                                                                               \</div><div class='add'>+        _new = mem_get0(frame-&gt;root-&gt;pool-&gt;frame_mem_pool);                    \</div><div class='add'>+        if (!_new) {                                                           \</div><div class='add'>+            break;                                                             \</div><div class='add'>+        }                                                                      \</div><div class='add'>+        typeof(fn##_cbk) tmp_cbk = rfn;                                        \</div><div class='add'>+        _new-&gt;root = frame-&gt;root;                                              \</div><div class='add'>+        _new-&gt;this = obj;                                                      \</div><div class='add'>+        _new-&gt;ret = (ret_fn_t)tmp_cbk;                                         \</div><div class='add'>+        _new-&gt;parent = frame;                                                  \</div><div class='add'>+        /* (void *) is required for avoiding gcc warning */                    \</div><div class='add'>+        _new-&gt;cookie = ((has_cookie == 1) ? (void *)(cky) : (void *)_new);     \</div><div class='add'>+        _new-&gt;wind_from = __FUNCTION__;                                        \</div><div class='add'>+        _new-&gt;wind_to = #fn;                                                   \</div><div class='add'>+        _new-&gt;unwind_to = #rfn;                                                \</div><div class='add'>+        LOCK_INIT(&amp;_new-&gt;lock);                                                \</div><div class='add'>+        LOCK(&amp;frame-&gt;root-&gt;stack_lock);                                        \</div><div class='add'>+        {                                                                      \</div><div class='add'>+            list_add(&amp;_new-&gt;frames, &amp;frame-&gt;root-&gt;myframes);                   \</div><div class='add'>+            frame-&gt;ref_count++;                                                \</div><div class='add'>+        }                                                                      \</div><div class='add'>+        UNLOCK(&amp;frame-&gt;root-&gt;stack_lock);                                      \</div><div class='add'>+        fn##_cbk = rfn;                                                        \</div><div class='add'>+        old_THIS = THIS;                                                       \</div><div class='add'>+        THIS = obj;                                                            \</div><div class='add'>+        gf_msg_trace("stack-trace", 0,                                         \</div><div class='add'>+                     "stack-address: %p, "                                     \</div><div class='add'>+                     "winding from %s to %s",                                  \</div><div class='add'>+                     frame-&gt;root, old_THIS-&gt;name, THIS-&gt;name);                 \</div><div class='add'>+        if (obj-&gt;ctx-&gt;measure_latency)                                         \</div><div class='add'>+            timespec_now(&amp;_new-&gt;begin);                                        \</div><div class='add'>+        _new-&gt;op = get_fop_index_from_fn((_new-&gt;this), (fn));                  \</div><div class='add'>+        if (!obj-&gt;pass_through) {                                              \</div><div class='add'>+            GF_ATOMIC_INC(obj-&gt;stats.total.metrics[_new-&gt;op].fop);             \</div><div class='add'>+            GF_ATOMIC_INC(obj-&gt;stats.interval.metrics[_new-&gt;op].fop);          \</div><div class='add'>+            GF_ATOMIC_INC(obj-&gt;stats.total.count);                             \</div><div class='add'>+            GF_ATOMIC_INC(obj-&gt;stats.interval.count);                          \</div><div class='add'>+        } else {                                                               \</div><div class='add'>+            /* we want to get to the actual fop to call */                     \</div><div class='add'>+            next_xl_fn = get_the_pt_fop(&amp;obj-&gt;pass_through_fops-&gt;stat,         \</div><div class='add'>+                                        _new-&gt;op);                             \</div><div class='add'>+        }                                                                      \</div><div class='add'>+        next_xl_fn(_new, obj, params);                                         \</div><div class='add'>+        THIS = old_THIS;                                                       \</div><div class='add'>+    } while (0)</div><div class='add'>+</div><div class='add'>+#define STACK_UNWIND STACK_UNWIND_STRICT</div><div class='add'>+</div><div class='add'>+/* return from function in type-safe way */</div><div class='add'>+#define STACK_UNWIND_STRICT(fop, frame, op_ret, op_errno, params...)           \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        fop_##fop##_cbk_t fn = NULL;                                           \</div><div class='add'>+        call_frame_t *_parent = NULL;                                          \</div><div class='add'>+        xlator_t *old_THIS = NULL;                                             \</div><div class='add'>+                                                                               \</div><div class='add'>+        if (!frame) {                                                          \</div><div class='add'>+            gf_msg("stack", GF_LOG_CRITICAL, 0, LG_MSG_FRAME_ERROR, "!frame"); \</div><div class='add'>+            break;                                                             \</div><div class='add'>+        }                                                                      \</div><div class='add'>+        if ((op_ret) &lt; 0) {                                                    \</div><div class='add'>+            gf_msg_debug("stack-trace", op_errno,                              \</div><div class='add'>+                         "stack-address: %p, "                                 \</div><div class='add'>+                         "%s returned %d error: %s",                           \</div><div class='add'>+                         frame-&gt;root, THIS-&gt;name, (int32_t)(op_ret),           \</div><div class='add'>+                         strerror(op_errno));                                  \</div><div class='add'>+        } else {                                                               \</div><div class='add'>+            gf_msg_trace("stack-trace", 0,                                     \</div><div class='add'>+                         "stack-address: %p, "                                 \</div><div class='add'>+                         "%s returned %d",                                     \</div><div class='add'>+                         frame-&gt;root, THIS-&gt;name, (int32_t)(op_ret));          \</div><div class='add'>+        }                                                                      \</div><div class='add'>+        fn = (fop_##fop##_cbk_t)frame-&gt;ret;                                    \</div><div class='add'>+        _parent = frame-&gt;parent;                                               \</div><div class='add'>+        LOCK(&amp;frame-&gt;root-&gt;stack_lock);                                        \</div><div class='add'>+        {                                                                      \</div><div class='add'>+            _parent-&gt;ref_count--;                                              \</div><div class='add'>+            if ((op_ret) &lt; 0 &amp;&amp; (op_errno) != frame-&gt;root-&gt;error) {            \</div><div class='add'>+                frame-&gt;root-&gt;err_xl = frame-&gt;this;                             \</div><div class='add'>+                frame-&gt;root-&gt;error = (op_errno);                               \</div><div class='add'>+            } else if ((op_ret) == 0) {                                        \</div><div class='add'>+                frame-&gt;root-&gt;err_xl = NULL;                                    \</div><div class='add'>+                frame-&gt;root-&gt;error = 0;                                        \</div><div class='add'>+            }                                                                  \</div><div class='add'>+        }                                                                      \</div><div class='add'>+        UNLOCK(&amp;frame-&gt;root-&gt;stack_lock);                                      \</div><div class='add'>+        old_THIS = THIS;                                                       \</div><div class='add'>+        THIS = _parent-&gt;this;                                                  \</div><div class='add'>+        frame-&gt;complete = _gf_true;                                            \</div><div class='add'>+        frame-&gt;unwind_from = __FUNCTION__;                                     \</div><div class='add'>+        if (frame-&gt;this-&gt;ctx-&gt;measure_latency) {                               \</div><div class='add'>+            timespec_now(&amp;frame-&gt;end);                                         \</div><div class='add'>+            /* required for top most xlator */                                 \</div><div class='add'>+            if (_parent-&gt;ret == NULL)                                          \</div><div class='add'>+                timespec_now(&amp;_parent-&gt;end);                                   \</div><div class='add'>+        }                                                                      \</div><div class='add'>+        if (op_ret &lt; 0) {                                                      \</div><div class='add'>+            GF_ATOMIC_INC(THIS-&gt;stats.total.metrics[frame-&gt;op].cbk);           \</div><div class='add'>+            GF_ATOMIC_INC(THIS-&gt;stats.interval.metrics[frame-&gt;op].cbk);        \</div><div class='add'>+        }                                                                      \</div><div class='add'>+        fn(_parent, frame-&gt;cookie, _parent-&gt;this, op_ret, op_errno, params);   \</div><div class='add'>+        THIS = old_THIS;                                                       \</div><div class='add'>+    } while (0)</div><div class='add'>+</div><div class='add'>+static inline int</div><div class='add'>+call_stack_alloc_groups(call_stack_t *stack, int ngrps)</div><div class='add'>+{</div><div class='add'>+    if (ngrps &lt;= SMALL_GROUP_COUNT) {</div><div class='add'>+        stack-&gt;groups = stack-&gt;groups_small;</div><div class='add'>+    } else {</div><div class='add'>+        GF_FREE(stack-&gt;groups_large);</div><div class='add'>+        stack-&gt;groups_large = GF_CALLOC(ngrps, sizeof(gid_t),</div><div class='add'>+                                        gf_common_mt_groups_t);</div><div class='add'>+        if (!stack-&gt;groups_large)</div><div class='add'>+            return -1;</div><div class='add'>+        stack-&gt;groups = stack-&gt;groups_large;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    stack-&gt;ngrps = ngrps;</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static inline int</div><div class='add'>+call_stack_groups_capacity(call_stack_t *stack)</div><div class='add'>+{</div><div class='add'>+    return max(stack-&gt;ngrps, SMALL_GROUP_COUNT);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static inline int</div><div class='add'>+call_frames_count(call_stack_t *call_stack)</div><div class='add'>+{</div><div class='add'>+    call_frame_t *pos;</div><div class='add'>+    int32_t count = 0;</div><div class='add'>+</div><div class='add'>+    if (!call_stack)</div><div class='add'>+        return count;</div><div class='add'>+</div><div class='add'>+    list_for_each_entry(pos, &amp;call_stack-&gt;myframes, frames) count++;</div><div class='add'>+</div><div class='add'>+    return count;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static inline call_frame_t *</div><div class='add'>+copy_frame(call_frame_t *frame)</div><div class='add'>+{</div><div class='add'>+    call_stack_t *newstack = NULL;</div><div class='add'>+    call_stack_t *oldstack = NULL;</div><div class='add'>+    call_frame_t *newframe = NULL;</div><div class='add'>+</div><div class='add'>+    if (!frame) {</div><div class='add'>+        return NULL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    newstack = mem_get0(frame-&gt;root-&gt;pool-&gt;stack_mem_pool);</div><div class='add'>+    if (newstack == NULL) {</div><div class='add'>+        return NULL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    INIT_LIST_HEAD(&amp;newstack-&gt;myframes);</div><div class='add'>+</div><div class='add'>+    newframe = mem_get0(frame-&gt;root-&gt;pool-&gt;frame_mem_pool);</div><div class='add'>+    if (!newframe) {</div><div class='add'>+        mem_put(newstack);</div><div class='add'>+        return NULL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    newframe-&gt;this = frame-&gt;this;</div><div class='add'>+    newframe-&gt;root = newstack;</div><div class='add'>+    INIT_LIST_HEAD(&amp;newframe-&gt;frames);</div><div class='add'>+    list_add(&amp;newframe-&gt;frames, &amp;newstack-&gt;myframes);</div><div class='add'>+</div><div class='add'>+    oldstack = frame-&gt;root;</div><div class='add'>+</div><div class='add'>+    newstack-&gt;uid = oldstack-&gt;uid;</div><div class='add'>+    newstack-&gt;gid = oldstack-&gt;gid;</div><div class='add'>+    newstack-&gt;pid = oldstack-&gt;pid;</div><div class='add'>+    newstack-&gt;op = oldstack-&gt;op;</div><div class='add'>+    newstack-&gt;type = oldstack-&gt;type;</div><div class='add'>+    newstack-&gt;ctime = oldstack-&gt;ctime;</div><div class='add'>+    newstack-&gt;flags = oldstack-&gt;flags;</div><div class='add'>+    if (call_stack_alloc_groups(newstack, oldstack-&gt;ngrps) != 0) {</div><div class='add'>+        mem_put(newstack);</div><div class='add'>+        return NULL;</div><div class='add'>+    }</div><div class='add'>+    if (!oldstack-&gt;groups) {</div><div class='add'>+        gf_msg_debug("stack", EINVAL, "groups is null (ngrps: %d)",</div><div class='add'>+                     oldstack-&gt;ngrps);</div><div class='add'>+        /* Considering 'groups' is NULL, set ngrps to 0 */</div><div class='add'>+        oldstack-&gt;ngrps = 0;</div><div class='add'>+</div><div class='add'>+        if (oldstack-&gt;groups_large)</div><div class='add'>+            oldstack-&gt;groups = oldstack-&gt;groups_large;</div><div class='add'>+        else</div><div class='add'>+            oldstack-&gt;groups = oldstack-&gt;groups_small;</div><div class='add'>+    }</div><div class='add'>+    newstack-&gt;ngrps = oldstack-&gt;ngrps;</div><div class='add'>+    memcpy(newstack-&gt;groups, oldstack-&gt;groups, sizeof(gid_t) * oldstack-&gt;ngrps);</div><div class='add'>+    newstack-&gt;unique = oldstack-&gt;unique;</div><div class='add'>+    newstack-&gt;pool = oldstack-&gt;pool;</div><div class='add'>+    newstack-&gt;lk_owner = oldstack-&gt;lk_owner;</div><div class='add'>+    newstack-&gt;ctx = oldstack-&gt;ctx;</div><div class='add'>+</div><div class='add'>+    if (newstack-&gt;ctx-&gt;measure_latency) {</div><div class='add'>+        timespec_now(&amp;newstack-&gt;tv);</div><div class='add'>+        memcpy(&amp;newframe-&gt;begin, &amp;newstack-&gt;tv, sizeof(newstack-&gt;tv));</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    LOCK_INIT(&amp;newframe-&gt;lock);</div><div class='add'>+    LOCK_INIT(&amp;newstack-&gt;stack_lock);</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;oldstack-&gt;pool-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        list_add(&amp;newstack-&gt;all_frames, &amp;oldstack-&gt;all_frames);</div><div class='add'>+        newstack-&gt;pool-&gt;cnt++;</div><div class='add'>+    }</div><div class='add'>+    UNLOCK(&amp;oldstack-&gt;pool-&gt;lock);</div><div class='add'>+    GF_ATOMIC_INC(newstack-&gt;pool-&gt;total_count);</div><div class='add'>+</div><div class='add'>+    return newframe;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+call_stack_set_groups(call_stack_t *stack, int ngrps, gid_t **groupbuf_p);</div><div class='add'>+void</div><div class='add'>+gf_proc_dump_pending_frames(call_pool_t *call_pool);</div><div class='add'>+void</div><div class='add'>+gf_proc_dump_pending_frames_to_dict(call_pool_t *call_pool, dict_t *dict);</div><div class='add'>+call_frame_t *</div><div class='add'>+create_frame(xlator_t *xl, call_pool_t *pool);</div><div class='add'>+gf_boolean_t</div><div class='add'>+__is_fuse_call(call_frame_t *frame);</div><div class='add'>+#endif /* _STACK_H */</div><div class='head'>diff --git a/libglusterfs/src/glusterfs/statedump.h b/libglusterfs/src/glusterfs/statedump.h<br/>new file mode 100644<br/>index 00000000000..ce082706bdf<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/libglusterfs/src/glusterfs/statedump.h?id=d1d7a6f35c816822fab51c820e25023863c239c1'>libglusterfs/src/glusterfs/statedump.h</a></div><div class='hunk'>@@ -0,0 +1,132 @@</div><div class='add'>+/*</div><div class='add'>+  Copyright (c) 2008-2012 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#ifndef STATEDUMP_H</div><div class='add'>+#define STATEDUMP_H</div><div class='add'>+</div><div class='add'>+#include &lt;stdarg.h&gt;</div><div class='add'>+#include "glusterfs/inode.h"</div><div class='add'>+#include "glusterfs/strfd.h"</div><div class='add'>+</div><div class='add'>+#define GF_DUMP_MAX_BUF_LEN 4096</div><div class='add'>+</div><div class='add'>+typedef struct gf_dump_xl_options_ {</div><div class='add'>+    gf_boolean_t dump_priv;</div><div class='add'>+    gf_boolean_t dump_inode;</div><div class='add'>+    gf_boolean_t dump_fd;</div><div class='add'>+    gf_boolean_t dump_inodectx;</div><div class='add'>+    gf_boolean_t dump_fdctx;</div><div class='add'>+    gf_boolean_t dump_history;</div><div class='add'>+} gf_dump_xl_options_t;</div><div class='add'>+</div><div class='add'>+typedef struct gf_dump_options_ {</div><div class='add'>+    gf_boolean_t dump_mem;</div><div class='add'>+    gf_boolean_t dump_iobuf;</div><div class='add'>+    gf_boolean_t dump_callpool;</div><div class='add'>+    gf_dump_xl_options_t xl_options;  // options for all xlators</div><div class='add'>+    char *dump_path;</div><div class='add'>+} gf_dump_options_t;</div><div class='add'>+</div><div class='add'>+extern gf_dump_options_t dump_options;</div><div class='add'>+</div><div class='add'>+__attribute__((__format__(__printf__, 3, 4))) static inline void</div><div class='add'>+_gf_proc_dump_build_key(char *key, const char *prefix, const char *fmt, ...)</div><div class='add'>+{</div><div class='add'>+    va_list ap;</div><div class='add'>+    int32_t len;</div><div class='add'>+</div><div class='add'>+    len = snprintf(key, GF_DUMP_MAX_BUF_LEN, "%s.", prefix);</div><div class='add'>+    if (len &gt;= 0) {</div><div class='add'>+        va_start(ap, fmt);</div><div class='add'>+        len = vsnprintf(key + len, GF_DUMP_MAX_BUF_LEN - len, fmt, ap);</div><div class='add'>+        va_end(ap);</div><div class='add'>+    }</div><div class='add'>+    if (len &lt; 0) {</div><div class='add'>+        *key = 0;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#define gf_proc_dump_build_key(key, key_prefix, fmt...)                        \</div><div class='add'>+    {                                                                          \</div><div class='add'>+        _gf_proc_dump_build_key(key, key_prefix, ##fmt);                       \</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+#define GF_PROC_DUMP_SET_OPTION(opt, val) opt = val</div><div class='add'>+</div><div class='add'>+#define GF_CHECK_DUMP_OPTION_ENABLED(option_dump, var, label)                  \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        if (option_dump == _gf_true) {                                         \</div><div class='add'>+            var = _gf_false;                                                   \</div><div class='add'>+            goto label;                                                        \</div><div class='add'>+        }                                                                      \</div><div class='add'>+    } while (0);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+gf_proc_dump_init();</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+gf_proc_dump_fini(void);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+gf_proc_dump_cleanup(void);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+gf_proc_dump_info(int signum, glusterfs_ctx_t *ctx);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+gf_proc_dump_add_section(char *key, ...)</div><div class='add'>+    __attribute__((__format__(__printf__, 1, 2)));</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+gf_proc_dump_write(char *key, char *value, ...)</div><div class='add'>+    __attribute__((__format__(__printf__, 2, 3)));</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+inode_table_dump(inode_table_t *itable, char *prefix);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+inode_table_dump_to_dict(inode_table_t *itable, char *prefix, dict_t *dict);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+fdtable_dump(fdtable_t *fdtable, char *prefix);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+fdtable_dump_to_dict(fdtable_t *fdtable, char *prefix, dict_t *dict);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+inode_dump(inode_t *inode, char *prefix);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+gf_proc_dump_mem_info_to_dict(dict_t *dict);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+gf_proc_dump_mempool_info_to_dict(glusterfs_ctx_t *ctx, dict_t *dict);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+glusterd_init(int sig);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+gf_proc_dump_xlator_private(xlator_t *this, strfd_t *strfd);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+gf_proc_dump_mallinfo(strfd_t *strfd);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+gf_proc_dump_xlator_history(xlator_t *this, strfd_t *strfd);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+gf_proc_dump_xlator_meminfo(xlator_t *this, strfd_t *strfd);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+gf_proc_dump_xlator_profile(xlator_t *this, strfd_t *strfd);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+gf_latency_statedump_and_reset(char *key, gf_latency_t *lat);</div><div class='add'>+#endif /* STATEDUMP_H */</div><div class='head'>diff --git a/libglusterfs/src/glusterfs/store.h b/libglusterfs/src/glusterfs/store.h<br/>new file mode 100644<br/>index 00000000000..a1f70c7b840<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/libglusterfs/src/glusterfs/store.h?id=d1d7a6f35c816822fab51c820e25023863c239c1'>libglusterfs/src/glusterfs/store.h</a></div><div class='hunk'>@@ -0,0 +1,112 @@</div><div class='add'>+/*</div><div class='add'>+   Copyright (c) 2013 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+   This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+   This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+   General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+   later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+   cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+#ifndef _GLUSTERD_STORE_H_</div><div class='add'>+#define _GLUSTERD_STORE_H_</div><div class='add'>+</div><div class='add'>+#include "glusterfs/compat.h"</div><div class='add'>+#include "glusterfs/glusterfs.h"</div><div class='add'>+</div><div class='add'>+struct gf_store_handle_ {</div><div class='add'>+    char *path;</div><div class='add'>+    int fd;</div><div class='add'>+    int tmp_fd;</div><div class='add'>+    FILE *read;</div><div class='add'>+    int locked; /* state of lockf() */</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+typedef struct gf_store_handle_ gf_store_handle_t;</div><div class='add'>+</div><div class='add'>+struct gf_store_iter_ {</div><div class='add'>+    FILE *file;</div><div class='add'>+    char filepath[PATH_MAX];</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+typedef struct gf_store_iter_ gf_store_iter_t;</div><div class='add'>+</div><div class='add'>+typedef enum {</div><div class='add'>+    GD_STORE_SUCCESS,</div><div class='add'>+    GD_STORE_KEY_NULL,</div><div class='add'>+    GD_STORE_VALUE_NULL,</div><div class='add'>+    GD_STORE_KEY_VALUE_NULL,</div><div class='add'>+    GD_STORE_EOF,</div><div class='add'>+    GD_STORE_ENOMEM,</div><div class='add'>+    GD_STORE_STAT_FAILED</div><div class='add'>+} gf_store_op_errno_t;</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+gf_store_mkdir(char *path);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+gf_store_handle_create_on_absence(gf_store_handle_t **shandle, char *path);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+gf_store_mkstemp(gf_store_handle_t *shandle);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+gf_store_sync_direntry(char *path);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+gf_store_rename_tmppath(gf_store_handle_t *shandle);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+gf_store_unlink_tmppath(gf_store_handle_t *shandle);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+gf_store_read_and_tokenize(FILE *file, char **iter_key, char **iter_val,</div><div class='add'>+                           gf_store_op_errno_t *store_errno);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+gf_store_retrieve_value(gf_store_handle_t *handle, char *key, char **value);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+gf_store_save_value(int fd, char *key, char *value);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+gf_store_save_items(int fd, char *items);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+gf_store_handle_new(const char *path, gf_store_handle_t **handle);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+gf_store_handle_retrieve(char *path, gf_store_handle_t **handle);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+gf_store_handle_destroy(gf_store_handle_t *handle);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+gf_store_iter_new(gf_store_handle_t *shandle, gf_store_iter_t **iter);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+gf_store_validate_key_value(char *storepath, char *key, char *val,</div><div class='add'>+                            gf_store_op_errno_t *op_errno);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+gf_store_iter_get_next(gf_store_iter_t *iter, char **key, char **value,</div><div class='add'>+                       gf_store_op_errno_t *op_errno);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+gf_store_iter_get_matching(gf_store_iter_t *iter, char *key, char **value);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+gf_store_iter_destroy(gf_store_iter_t **iter);</div><div class='add'>+</div><div class='add'>+char *</div><div class='add'>+gf_store_strerror(gf_store_op_errno_t op_errno);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+gf_store_lock(gf_store_handle_t *sh);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+gf_store_unlock(gf_store_handle_t *sh);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+gf_store_locked_local(gf_store_handle_t *sh);</div><div class='add'>+</div><div class='add'>+#endif</div><div class='head'>diff --git a/libglusterfs/src/glusterfs/strfd.h b/libglusterfs/src/glusterfs/strfd.h<br/>new file mode 100644<br/>index 00000000000..861cd02e005<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/libglusterfs/src/glusterfs/strfd.h?id=d1d7a6f35c816822fab51c820e25023863c239c1'>libglusterfs/src/glusterfs/strfd.h</a></div><div class='hunk'>@@ -0,0 +1,34 @@</div><div class='add'>+/*</div><div class='add'>+   Copyright (c) 2014 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+   This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+   This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+   General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+   later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+   cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#ifndef _STRFD_H</div><div class='add'>+#define _STRFD_H</div><div class='add'>+</div><div class='add'>+typedef struct {</div><div class='add'>+    void *data;</div><div class='add'>+    size_t alloc_size;</div><div class='add'>+    size_t size;</div><div class='add'>+    off_t pos;</div><div class='add'>+} strfd_t;</div><div class='add'>+</div><div class='add'>+strfd_t *</div><div class='add'>+strfd_open();</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+strprintf(strfd_t *strfd, const char *fmt, ...)</div><div class='add'>+    __attribute__((__format__(__printf__, 2, 3)));</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+strvprintf(strfd_t *strfd, const char *fmt, va_list ap);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+strfd_close(strfd_t *strfd);</div><div class='add'>+</div><div class='add'>+#endif</div><div class='head'>diff --git a/libglusterfs/src/glusterfs/syncop-utils.h b/libglusterfs/src/glusterfs/syncop-utils.h<br/>new file mode 100644<br/>index 00000000000..1f3ee403edc<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/libglusterfs/src/glusterfs/syncop-utils.h?id=d1d7a6f35c816822fab51c820e25023863c239c1'>libglusterfs/src/glusterfs/syncop-utils.h</a></div><div class='hunk'>@@ -0,0 +1,54 @@</div><div class='add'>+/*</div><div class='add'>+  Copyright (c) 2015, Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#ifndef _SYNCOP_UTILS_H</div><div class='add'>+#define _SYNCOP_UTILS_H</div><div class='add'>+</div><div class='add'>+typedef int (*syncop_dir_scan_fn_t)(xlator_t *subvol, gf_dirent_t *entry,</div><div class='add'>+                                    loc_t *parent, void *data);</div><div class='add'>+int</div><div class='add'>+syncop_ftw(xlator_t *subvol, loc_t *loc, int pid, void *data,</div><div class='add'>+           int (*fn)(xlator_t *subvol, gf_dirent_t *entry, loc_t *parent,</div><div class='add'>+                     void *data));</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+syncop_mt_dir_scan(call_frame_t *frame, xlator_t *subvol, loc_t *loc, int pid,</div><div class='add'>+                   void *data, syncop_dir_scan_fn_t fn, dict_t *xdata,</div><div class='add'>+                   uint32_t max_jobs, uint32_t max_qlen);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+syncop_dir_scan(xlator_t *subvol, loc_t *loc, int pid, void *data,</div><div class='add'>+                int (*fn)(xlator_t *subvol, gf_dirent_t *entry, loc_t *parent,</div><div class='add'>+                          void *data));</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+syncop_dirfd(xlator_t *subvol, loc_t *loc, fd_t **fd, int pid);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+syncop_is_subvol_local(xlator_t *this, loc_t *loc, gf_boolean_t *is_local);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+syncop_gfid_to_path(inode_table_t *itable, xlator_t *subvol, uuid_t gfid,</div><div class='add'>+                    char **path_p);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+syncop_ftw_throttle(xlator_t *subvol, loc_t *loc, int pid, void *data,</div><div class='add'>+                    int (*fn)(xlator_t *subvol, gf_dirent_t *entry,</div><div class='add'>+                              loc_t *parent, void *data),</div><div class='add'>+                    int count, int sleep_time);</div><div class='add'>+int</div><div class='add'>+syncop_inode_find(xlator_t *this, xlator_t *subvol, uuid_t gfid,</div><div class='add'>+                  inode_t **inode, dict_t *xdata, dict_t **rsp_dict);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+syncop_gfid_to_path_hard(inode_table_t *itable, xlator_t *subvol, uuid_t gfid,</div><div class='add'>+                         inode_t *inode, char **path_p,</div><div class='add'>+                         gf_boolean_t hard_resolve);</div><div class='add'>+#endif /* _SYNCOP_H */</div><div class='head'>diff --git a/libglusterfs/src/glusterfs/syncop.h b/libglusterfs/src/glusterfs/syncop.h<br/>new file mode 100644<br/>index 00000000000..4e9241a32fc<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/libglusterfs/src/glusterfs/syncop.h?id=d1d7a6f35c816822fab51c820e25023863c239c1'>libglusterfs/src/glusterfs/syncop.h</a></div><div class='hunk'>@@ -0,0 +1,718 @@</div><div class='add'>+/*</div><div class='add'>+  Copyright (c) 2008-2012 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#ifndef _SYNCOP_H</div><div class='add'>+#define _SYNCOP_H</div><div class='add'>+</div><div class='add'>+#include &lt;sys/time.h&gt;</div><div class='add'>+#include &lt;pthread.h&gt;</div><div class='add'>+#include &lt;ucontext.h&gt;</div><div class='add'>+#include "glusterfs/dict.h"   // for dict_t</div><div class='add'>+#include "glusterfs/stack.h"  // for call_frame_t, STACK_DESTROY, STACK_...</div><div class='add'>+#include "glusterfs/timer.h"</div><div class='add'>+</div><div class='add'>+#define SYNCENV_PROC_MAX 16</div><div class='add'>+#define SYNCENV_PROC_MIN 2</div><div class='add'>+#define SYNCPROC_IDLE_TIME 600</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+ * Flags for syncopctx valid elements</div><div class='add'>+ */</div><div class='add'>+#define SYNCOPCTX_UID 0x00000001</div><div class='add'>+#define SYNCOPCTX_GID 0x00000002</div><div class='add'>+#define SYNCOPCTX_GROUPS 0x00000004</div><div class='add'>+#define SYNCOPCTX_PID 0x00000008</div><div class='add'>+#define SYNCOPCTX_LKOWNER 0x00000010</div><div class='add'>+</div><div class='add'>+#ifdef HAVE_TSAN_API</div><div class='add'>+/* Currently hardcoded within thread context maintained by the sanitizer. */</div><div class='add'>+#define TSAN_THREAD_NAMELEN 64</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+struct synctask;</div><div class='add'>+struct syncproc;</div><div class='add'>+struct syncenv;</div><div class='add'>+struct synccond;</div><div class='add'>+</div><div class='add'>+typedef int (*synctask_cbk_t)(int ret, call_frame_t *frame, void *opaque);</div><div class='add'>+</div><div class='add'>+typedef int (*synctask_fn_t)(void *opaque);</div><div class='add'>+</div><div class='add'>+typedef enum {</div><div class='add'>+    SYNCTASK_INIT = 0,</div><div class='add'>+    SYNCTASK_RUN,</div><div class='add'>+    SYNCTASK_SUSPEND,</div><div class='add'>+    SYNCTASK_WAIT,</div><div class='add'>+    SYNCTASK_DONE,</div><div class='add'>+    SYNCTASK_ZOMBIE,</div><div class='add'>+} synctask_state_t;</div><div class='add'>+</div><div class='add'>+/* for one sequential execution of @syncfn */</div><div class='add'>+struct synctask {</div><div class='add'>+    struct list_head all_tasks;</div><div class='add'>+    struct syncenv *env;</div><div class='add'>+    xlator_t *xl;</div><div class='add'>+    call_frame_t *frame;</div><div class='add'>+    call_frame_t *opframe;</div><div class='add'>+    synctask_cbk_t synccbk;</div><div class='add'>+    synctask_fn_t syncfn;</div><div class='add'>+    struct timespec *delta;</div><div class='add'>+    gf_timer_t *timer;</div><div class='add'>+    struct synccond *synccond;</div><div class='add'>+    void *opaque;</div><div class='add'>+    void *stack;</div><div class='add'>+    synctask_state_t state;</div><div class='add'>+    int woken;</div><div class='add'>+    int slept;</div><div class='add'>+    int ret;</div><div class='add'>+</div><div class='add'>+    uid_t uid;</div><div class='add'>+    gid_t gid;</div><div class='add'>+</div><div class='add'>+#ifdef HAVE_TSAN_API</div><div class='add'>+    struct {</div><div class='add'>+        void *fiber;</div><div class='add'>+        char name[TSAN_THREAD_NAMELEN];</div><div class='add'>+    } tsan;</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+    ucontext_t ctx;</div><div class='add'>+    struct syncproc *proc;</div><div class='add'>+</div><div class='add'>+    pthread_mutex_t mutex; /* for synchronous spawning of synctask */</div><div class='add'>+    pthread_cond_t cond;</div><div class='add'>+    int done;</div><div class='add'>+</div><div class='add'>+    struct list_head waitq; /* can wait only "once" at a time */</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct syncproc {</div><div class='add'>+    pthread_t processor;</div><div class='add'>+</div><div class='add'>+#ifdef HAVE_TSAN_API</div><div class='add'>+    struct {</div><div class='add'>+        void *fiber;</div><div class='add'>+        char name[TSAN_THREAD_NAMELEN];</div><div class='add'>+    } tsan;</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+    ucontext_t sched;</div><div class='add'>+    struct syncenv *env;</div><div class='add'>+    struct synctask *current;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+/* hosts the scheduler thread and framework for executing synctasks */</div><div class='add'>+struct syncenv {</div><div class='add'>+    struct syncproc proc[SYNCENV_PROC_MAX];</div><div class='add'>+</div><div class='add'>+    pthread_mutex_t mutex;</div><div class='add'>+    pthread_cond_t cond;</div><div class='add'>+</div><div class='add'>+    struct list_head runq;</div><div class='add'>+    struct list_head waitq;</div><div class='add'>+</div><div class='add'>+    int procs;</div><div class='add'>+    int procs_idle;</div><div class='add'>+</div><div class='add'>+    int runcount;</div><div class='add'>+</div><div class='add'>+    int procmin;</div><div class='add'>+    int procmax;</div><div class='add'>+</div><div class='add'>+    size_t stacksize;</div><div class='add'>+</div><div class='add'>+    int destroy; /* FLAG to mark syncenv is in destroy mode</div><div class='add'>+                    so that no more synctasks are accepted*/</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+typedef enum { LOCK_NULL = 0, LOCK_TASK, LOCK_THREAD } lock_type_t;</div><div class='add'>+</div><div class='add'>+typedef enum {</div><div class='add'>+    SYNC_LOCK_DEFAULT = 0,</div><div class='add'>+    SYNC_LOCK_RECURSIVE, /*it allows recursive locking*/</div><div class='add'>+} lock_attr_t;</div><div class='add'>+</div><div class='add'>+struct synclock {</div><div class='add'>+    pthread_mutex_t guard;  /* guard the remaining members, pair @cond */</div><div class='add'>+    pthread_cond_t cond;    /* waiting non-synctasks */</div><div class='add'>+    struct list_head waitq; /* waiting synctasks */</div><div class='add'>+    volatile int lock;      /* true(non zero) or false(zero), lock status */</div><div class='add'>+    lock_attr_t attr;</div><div class='add'>+    struct synctask *owner; /* NULL if current owner is not a synctask */</div><div class='add'>+    pthread_t owner_tid;</div><div class='add'>+    lock_type_t type;</div><div class='add'>+};</div><div class='add'>+typedef struct synclock synclock_t;</div><div class='add'>+</div><div class='add'>+struct synccond {</div><div class='add'>+    pthread_mutex_t pmutex;</div><div class='add'>+    pthread_cond_t pcond;</div><div class='add'>+    struct list_head waitq;</div><div class='add'>+};</div><div class='add'>+typedef struct synccond synccond_t;</div><div class='add'>+</div><div class='add'>+struct syncbarrier {</div><div class='add'>+    gf_boolean_t initialized; /*Set on successful initialization*/</div><div class='add'>+    pthread_mutex_t guard;    /* guard the remaining members, pair @cond */</div><div class='add'>+    pthread_cond_t cond;      /* waiting non-synctasks */</div><div class='add'>+    struct list_head waitq;   /* waiting synctasks */</div><div class='add'>+    int count;                /* count the number of wakes */</div><div class='add'>+    int waitfor;              /* no. of wakes until which task can be in</div><div class='add'>+                                 waitq before being woken up. */</div><div class='add'>+};</div><div class='add'>+typedef struct syncbarrier syncbarrier_t;</div><div class='add'>+</div><div class='add'>+struct syncargs {</div><div class='add'>+    int op_ret;</div><div class='add'>+    int op_errno;</div><div class='add'>+</div><div class='add'>+    /*</div><div class='add'>+     * The below 3 iatt structures are used in the fops</div><div class='add'>+     * whose callbacks get struct iatt as one of the</div><div class='add'>+     * a return arguments. Currently, the maximum number</div><div class='add'>+     * of iatt structures returned is 3 for some fops</div><div class='add'>+     * such as mknod, copy_file_range, mkdir etc. So</div><div class='add'>+     * all the following 3 iatt structures would be used</div><div class='add'>+     * for those fops.</div><div class='add'>+     */</div><div class='add'>+    struct iatt iatt1;</div><div class='add'>+    struct iatt iatt2;</div><div class='add'>+    struct iatt iatt3;</div><div class='add'>+    dict_t *xattr;</div><div class='add'>+    struct statvfs statvfs_buf;</div><div class='add'>+    struct iovec *vector;</div><div class='add'>+    int count;</div><div class='add'>+    struct iobref *iobref;</div><div class='add'>+    char *buffer;</div><div class='add'>+    dict_t *xdata;</div><div class='add'>+    struct gf_flock flock;</div><div class='add'>+    struct gf_lease lease;</div><div class='add'>+    dict_t *dict_out;</div><div class='add'>+</div><div class='add'>+    /* some more _cbk needs */</div><div class='add'>+    uuid_t uuid;</div><div class='add'>+    char *errstr;</div><div class='add'>+    dict_t *dict;</div><div class='add'>+    pthread_mutex_t lock_dict;</div><div class='add'>+</div><div class='add'>+    syncbarrier_t barrier;</div><div class='add'>+</div><div class='add'>+    /* do not touch */</div><div class='add'>+    struct synctask *task;</div><div class='add'>+    pthread_mutex_t mutex;</div><div class='add'>+    pthread_cond_t cond;</div><div class='add'>+    int done;</div><div class='add'>+</div><div class='add'>+    gf_dirent_t entries;</div><div class='add'>+    off_t offset;</div><div class='add'>+</div><div class='add'>+    lock_migration_info_t locklist;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct syncopctx {</div><div class='add'>+    unsigned int valid; /* valid flags for elements that are set */</div><div class='add'>+    uid_t uid;</div><div class='add'>+    gid_t gid;</div><div class='add'>+    int grpsize;</div><div class='add'>+    int ngrps;</div><div class='add'>+    gid_t *groups;</div><div class='add'>+    pid_t pid;</div><div class='add'>+    gf_lkowner_t lk_owner;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+#define __yawn(args)                                                           \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        args-&gt;task = synctask_get();                                           \</div><div class='add'>+        if (args-&gt;task)                                                        \</div><div class='add'>+            break;                                                             \</div><div class='add'>+        pthread_mutex_init(&amp;args-&gt;mutex, NULL);                                \</div><div class='add'>+        pthread_cond_init(&amp;args-&gt;cond, NULL);                                  \</div><div class='add'>+        args-&gt;done = 0;                                                        \</div><div class='add'>+    } while (0)</div><div class='add'>+</div><div class='add'>+#define __wake(args)                                                           \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        if (args-&gt;task) {                                                      \</div><div class='add'>+            synctask_wake(args-&gt;task);                                         \</div><div class='add'>+        } else {                                                               \</div><div class='add'>+            pthread_mutex_lock(&amp;args-&gt;mutex);                                  \</div><div class='add'>+            {                                                                  \</div><div class='add'>+                args-&gt;done = 1;                                                \</div><div class='add'>+                pthread_cond_signal(&amp;args-&gt;cond);                              \</div><div class='add'>+            }                                                                  \</div><div class='add'>+            pthread_mutex_unlock(&amp;args-&gt;mutex);                                \</div><div class='add'>+        }                                                                      \</div><div class='add'>+    } while (0)</div><div class='add'>+</div><div class='add'>+#define __yield(args)                                                          \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        if (args-&gt;task) {                                                      \</div><div class='add'>+            synctask_yield(args-&gt;task, NULL);                                  \</div><div class='add'>+        } else {                                                               \</div><div class='add'>+            pthread_mutex_lock(&amp;args-&gt;mutex);                                  \</div><div class='add'>+            {                                                                  \</div><div class='add'>+                while (!args-&gt;done)                                            \</div><div class='add'>+                    pthread_cond_wait(&amp;args-&gt;cond, &amp;args-&gt;mutex);              \</div><div class='add'>+            }                                                                  \</div><div class='add'>+            pthread_mutex_unlock(&amp;args-&gt;mutex);                                \</div><div class='add'>+            pthread_mutex_destroy(&amp;args-&gt;mutex);                               \</div><div class='add'>+            pthread_cond_destroy(&amp;args-&gt;cond);                                 \</div><div class='add'>+        }                                                                      \</div><div class='add'>+    } while (0)</div><div class='add'>+</div><div class='add'>+#define SYNCOP(subvol, stb, cbk, fn_op, params...)                             \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        struct synctask *task = NULL;                                          \</div><div class='add'>+        call_frame_t *frame = NULL;                                            \</div><div class='add'>+                                                                               \</div><div class='add'>+        task = synctask_get();                                                 \</div><div class='add'>+        stb-&gt;task = task;                                                      \</div><div class='add'>+        if (task)                                                              \</div><div class='add'>+            frame = copy_frame(task-&gt;opframe);                                 \</div><div class='add'>+        else                                                                   \</div><div class='add'>+            frame = syncop_create_frame(THIS);                                 \</div><div class='add'>+                                                                               \</div><div class='add'>+        if (!frame) {                                                          \</div><div class='add'>+            stb-&gt;op_ret = -1;                                                  \</div><div class='add'>+            stb-&gt;op_errno = errno;                                             \</div><div class='add'>+            break;                                                             \</div><div class='add'>+        }                                                                      \</div><div class='add'>+                                                                               \</div><div class='add'>+        if (task) {                                                            \</div><div class='add'>+            frame-&gt;root-&gt;uid = task-&gt;uid;                                      \</div><div class='add'>+            frame-&gt;root-&gt;gid = task-&gt;gid;                                      \</div><div class='add'>+        }                                                                      \</div><div class='add'>+                                                                               \</div><div class='add'>+        __yawn(stb);                                                           \</div><div class='add'>+                                                                               \</div><div class='add'>+        frame-&gt;op = get_fop_index_from_fn(subvol, fn_op);                      \</div><div class='add'>+        STACK_WIND_COOKIE(frame, cbk, (void *)stb, subvol, fn_op, params);     \</div><div class='add'>+                                                                               \</div><div class='add'>+        __yield(stb);                                                          \</div><div class='add'>+        STACK_DESTROY(frame-&gt;root);                                            \</div><div class='add'>+    } while (0)</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+ * syncop_xxx() calls are executed in two ways, one is inside a synctask where</div><div class='add'>+ * the executing function will do 'swapcontext' and the other is without</div><div class='add'>+ * synctask where the executing thread is made to wait using pthread_cond_wait.</div><div class='add'>+ * Executing thread may change when syncop_xxx() is executed inside a synctask.</div><div class='add'>+ * This leads to errno_location change i.e. errno may give errno of</div><div class='add'>+ * non-executing thread. So errno is not touched inside a synctask execution.</div><div class='add'>+ * All gfapi calls are executed using the second way of executing syncop_xxx()</div><div class='add'>+ * where the executing thread waits using pthread_cond_wait so it is ok to set</div><div class='add'>+ * errno in these cases. The following macro makes syncop_xxx() behave just</div><div class='add'>+ * like a system call, where -1 is returned and errno is set when a failure</div><div class='add'>+ * occurs.</div><div class='add'>+ */</div><div class='add'>+#define DECODE_SYNCOP_ERR(ret)                                                 \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        if (ret &lt; 0) {                                                         \</div><div class='add'>+            errno = -ret;                                                      \</div><div class='add'>+            ret = -1;                                                          \</div><div class='add'>+        } else {                                                               \</div><div class='add'>+            errno = 0;                                                         \</div><div class='add'>+        }                                                                      \</div><div class='add'>+    } while (0)</div><div class='add'>+</div><div class='add'>+#define SYNCENV_DEFAULT_STACKSIZE (2 * 1024 * 1024)</div><div class='add'>+</div><div class='add'>+struct syncenv *</div><div class='add'>+syncenv_new(size_t stacksize, int procmin, int procmax);</div><div class='add'>+void</div><div class='add'>+syncenv_destroy(struct syncenv *);</div><div class='add'>+void</div><div class='add'>+syncenv_scale(struct syncenv *env);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+synctask_new1(struct syncenv *, size_t stacksize, synctask_fn_t, synctask_cbk_t,</div><div class='add'>+              call_frame_t *frame, void *);</div><div class='add'>+int</div><div class='add'>+synctask_new(struct syncenv *, synctask_fn_t, synctask_cbk_t,</div><div class='add'>+             call_frame_t *frame, void *);</div><div class='add'>+struct synctask *</div><div class='add'>+synctask_create(struct syncenv *, size_t stacksize, synctask_fn_t,</div><div class='add'>+                synctask_cbk_t, call_frame_t *, void *);</div><div class='add'>+int</div><div class='add'>+synctask_join(struct synctask *task);</div><div class='add'>+void</div><div class='add'>+synctask_wake(struct synctask *task);</div><div class='add'>+void</div><div class='add'>+synctask_yield(struct synctask *task, struct timespec *delta);</div><div class='add'>+void</div><div class='add'>+synctask_sleep(int32_t secs);</div><div class='add'>+void</div><div class='add'>+synctask_waitfor(struct synctask *task, int count);</div><div class='add'>+</div><div class='add'>+#define synctask_barrier_init(args) syncbarrier_init(&amp;args-&gt;barrier)</div><div class='add'>+#define synctask_barrier_wait(args, n) syncbarrier_wait(&amp;args-&gt;barrier, n)</div><div class='add'>+#define synctask_barrier_wake(args) syncbarrier_wake(&amp;args-&gt;barrier)</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+synctask_setid(struct synctask *task, uid_t uid, gid_t gid);</div><div class='add'>+#define SYNCTASK_SETID(uid, gid) synctask_setid(synctask_get(), uid, gid);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+syncopctx_setfsuid(void *uid);</div><div class='add'>+int</div><div class='add'>+syncopctx_setfsgid(void *gid);</div><div class='add'>+int</div><div class='add'>+syncopctx_setfsgroups(int count, const void *groups);</div><div class='add'>+int</div><div class='add'>+syncopctx_setfspid(void *pid);</div><div class='add'>+int</div><div class='add'>+syncopctx_setfslkowner(gf_lkowner_t *lk_owner);</div><div class='add'>+</div><div class='add'>+static inline call_frame_t *</div><div class='add'>+syncop_create_frame(xlator_t *this)</div><div class='add'>+{</div><div class='add'>+    call_frame_t *frame = NULL;</div><div class='add'>+    int ngrps = -1;</div><div class='add'>+    struct syncopctx *opctx = NULL;</div><div class='add'>+</div><div class='add'>+    frame = create_frame(this, this-&gt;ctx-&gt;pool);</div><div class='add'>+    if (!frame)</div><div class='add'>+        return NULL;</div><div class='add'>+</div><div class='add'>+    frame-&gt;root-&gt;type = GF_OP_TYPE_FOP;</div><div class='add'>+    opctx = syncopctx_getctx();</div><div class='add'>+</div><div class='add'>+    if (opctx &amp;&amp; (opctx-&gt;valid &amp; SYNCOPCTX_PID))</div><div class='add'>+        frame-&gt;root-&gt;pid = opctx-&gt;pid;</div><div class='add'>+    else</div><div class='add'>+        frame-&gt;root-&gt;pid = getpid();</div><div class='add'>+</div><div class='add'>+    if (opctx &amp;&amp; (opctx-&gt;valid &amp; SYNCOPCTX_UID))</div><div class='add'>+        frame-&gt;root-&gt;uid = opctx-&gt;uid;</div><div class='add'>+    else</div><div class='add'>+        frame-&gt;root-&gt;uid = geteuid();</div><div class='add'>+</div><div class='add'>+    if (opctx &amp;&amp; (opctx-&gt;valid &amp; SYNCOPCTX_GID))</div><div class='add'>+        frame-&gt;root-&gt;gid = opctx-&gt;gid;</div><div class='add'>+    else</div><div class='add'>+        frame-&gt;root-&gt;gid = getegid();</div><div class='add'>+</div><div class='add'>+    if (opctx &amp;&amp; (opctx-&gt;valid &amp; SYNCOPCTX_GROUPS)) {</div><div class='add'>+        ngrps = opctx-&gt;ngrps;</div><div class='add'>+</div><div class='add'>+        if (ngrps != 0 &amp;&amp; opctx-&gt;groups != NULL) {</div><div class='add'>+            if (call_stack_alloc_groups(frame-&gt;root, ngrps) != 0) {</div><div class='add'>+                STACK_DESTROY(frame-&gt;root);</div><div class='add'>+                return NULL;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            memcpy(frame-&gt;root-&gt;groups, opctx-&gt;groups, (sizeof(gid_t) * ngrps));</div><div class='add'>+        }</div><div class='add'>+    } else {</div><div class='add'>+        ngrps = getgroups(0, 0);</div><div class='add'>+        if (ngrps &lt; 0) {</div><div class='add'>+            STACK_DESTROY(frame-&gt;root);</div><div class='add'>+            return NULL;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        if (call_stack_alloc_groups(frame-&gt;root, ngrps) != 0) {</div><div class='add'>+            STACK_DESTROY(frame-&gt;root);</div><div class='add'>+            return NULL;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        if (getgroups(ngrps, frame-&gt;root-&gt;groups) &lt; 0) {</div><div class='add'>+            STACK_DESTROY(frame-&gt;root);</div><div class='add'>+            return NULL;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (opctx &amp;&amp; (opctx-&gt;valid &amp; SYNCOPCTX_LKOWNER))</div><div class='add'>+        frame-&gt;root-&gt;lk_owner = opctx-&gt;lk_owner;</div><div class='add'>+</div><div class='add'>+    return frame;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+synclock_init(synclock_t *lock, lock_attr_t attr);</div><div class='add'>+int</div><div class='add'>+synclock_destroy(synclock_t *lock);</div><div class='add'>+int</div><div class='add'>+synclock_lock(synclock_t *lock);</div><div class='add'>+int</div><div class='add'>+synclock_trylock(synclock_t *lock);</div><div class='add'>+int</div><div class='add'>+synclock_unlock(synclock_t *lock);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+synccond_init(synccond_t *cond);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+synccond_destroy(synccond_t *cond);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+synccond_wait(synccond_t *cond, synclock_t *lock);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+synccond_timedwait(synccond_t *cond, synclock_t *lock, struct timespec *delta);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+synccond_signal(synccond_t *cond);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+synccond_broadcast(synccond_t *cond);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+syncbarrier_init(syncbarrier_t *barrier);</div><div class='add'>+int</div><div class='add'>+syncbarrier_wait(syncbarrier_t *barrier, int waitfor);</div><div class='add'>+int</div><div class='add'>+syncbarrier_wake(syncbarrier_t *barrier);</div><div class='add'>+int</div><div class='add'>+syncbarrier_destroy(syncbarrier_t *barrier);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+syncop_lookup(xlator_t *subvol, loc_t *loc,</div><div class='add'>+              /* out */</div><div class='add'>+              struct iatt *iatt, struct iatt *parent,</div><div class='add'>+              /* xdata */</div><div class='add'>+              dict_t *xdata_in, dict_t **xdata_out);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+syncop_readdirp(xlator_t *subvol, fd_t *fd, size_t size, off_t off,</div><div class='add'>+                /* out */</div><div class='add'>+                gf_dirent_t *entries, dict_t *xdata_in, dict_t **xdata_out);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+syncop_readdir(xlator_t *subvol, fd_t *fd, size_t size, off_t off,</div><div class='add'>+               gf_dirent_t *entries, dict_t *xdata_in, dict_t **xdata_out);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+syncop_opendir(xlator_t *subvol, loc_t *loc, fd_t *fd, dict_t *xdata_in,</div><div class='add'>+               dict_t **xdata_out);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+syncop_setattr(xlator_t *subvol, loc_t *loc, struct iatt *iatt, int valid,</div><div class='add'>+               /* out */</div><div class='add'>+               struct iatt *preop, struct iatt *postop, dict_t *xdata_in,</div><div class='add'>+               dict_t **xdata_out);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+syncop_fsetattr(xlator_t *subvol, fd_t *fd, struct iatt *iatt, int valid,</div><div class='add'>+                /* out */</div><div class='add'>+                struct iatt *preop, struct iatt *postop, dict_t *xdata_in,</div><div class='add'>+                dict_t **xdata_out);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+syncop_statfs(xlator_t *subvol, loc_t *loc,</div><div class='add'>+              /* out */</div><div class='add'>+              struct statvfs *buf, dict_t *xdata_in, dict_t **xdata_out);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+syncop_setxattr(xlator_t *subvol, loc_t *loc, dict_t *dict, int32_t flags,</div><div class='add'>+                dict_t *xdata_in, dict_t **xdata_out);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+syncop_fsetxattr(xlator_t *subvol, fd_t *fd, dict_t *dict, int32_t flags,</div><div class='add'>+                 dict_t *xdata_in, dict_t **xdata_out);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+syncop_listxattr(xlator_t *subvol, loc_t *loc, dict_t **dict, dict_t *xdata_in,</div><div class='add'>+                 dict_t **xdata_out);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+syncop_getxattr(xlator_t *xl, loc_t *loc, dict_t **dict, const char *key,</div><div class='add'>+                dict_t *xdata_in, dict_t **xdata_out);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+syncop_fgetxattr(xlator_t *xl, fd_t *fd, dict_t **dict, const char *key,</div><div class='add'>+                 dict_t *xdata_in, dict_t **xdata_out);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+syncop_removexattr(xlator_t *subvol, loc_t *loc, const char *name,</div><div class='add'>+                   dict_t *xdata_in, dict_t **xdata_out);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+syncop_fremovexattr(xlator_t *subvol, fd_t *fd, const char *name,</div><div class='add'>+                    dict_t *xdata_in, dict_t **xdata_out);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+syncop_create(xlator_t *subvol, loc_t *loc, int32_t flags, mode_t mode,</div><div class='add'>+              fd_t *fd, struct iatt *iatt, dict_t *xdata_in,</div><div class='add'>+              dict_t **xdata_out);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+syncop_open(xlator_t *subvol, loc_t *loc, int32_t flags, fd_t *fd,</div><div class='add'>+            dict_t *xdata_in, dict_t **xdata_out);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+syncop_close(fd_t *fd);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+syncop_write(xlator_t *subvol, fd_t *fd, const char *buf, int size,</div><div class='add'>+             off_t offset, struct iobref *iobref, uint32_t flags,</div><div class='add'>+             dict_t *xdata_in, dict_t **xdata_out);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+syncop_writev(xlator_t *subvol, fd_t *fd, const struct iovec *vector,</div><div class='add'>+              int32_t count, off_t offset, struct iobref *iobref,</div><div class='add'>+              uint32_t flags, struct iatt *preiatt, struct iatt *postiatt,</div><div class='add'>+              dict_t *xdata_in, dict_t **xdata_out);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+syncop_readv(xlator_t *subvol, fd_t *fd, size_t size, off_t off, uint32_t flags,</div><div class='add'>+             /* out */</div><div class='add'>+             struct iovec **vector, int *count, struct iobref **iobref,</div><div class='add'>+             struct iatt *iatt, dict_t *xdata_in, dict_t **xdata_out);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+syncop_ftruncate(xlator_t *subvol, fd_t *fd, off_t offset, struct iatt *preiatt,</div><div class='add'>+                 struct iatt *postiatt, dict_t *xdata_in, dict_t **xdata_out);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+syncop_truncate(xlator_t *subvol, loc_t *loc, off_t offset, dict_t *xdata_in,</div><div class='add'>+                dict_t **xdata_out);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+syncop_unlink(xlator_t *subvol, loc_t *loc, dict_t *xdata_in,</div><div class='add'>+              dict_t **xdata_out);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+syncop_rmdir(xlator_t *subvol, loc_t *loc, int flags, dict_t *xdata_in,</div><div class='add'>+             dict_t **xdata_out);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+syncop_fsync(xlator_t *subvol, fd_t *fd, int dataonly, struct iatt *preiatt,</div><div class='add'>+             struct iatt *postiatt, dict_t *xdata_in, dict_t **xdata_out);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+syncop_flush(xlator_t *subvol, fd_t *fd, dict_t *xdata_in, dict_t **xdata_out);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+syncop_fstat(xlator_t *subvol, fd_t *fd, struct iatt *stbuf, dict_t *xdata_in,</div><div class='add'>+             dict_t **xdata_out);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+syncop_stat(xlator_t *subvol, loc_t *loc, struct iatt *stbuf, dict_t *xdata_in,</div><div class='add'>+            dict_t **xdata_out);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+syncop_symlink(xlator_t *subvol, loc_t *loc, const char *newpath,</div><div class='add'>+               struct iatt *iatt, dict_t *xdata_in, dict_t **xdata_out);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+syncop_readlink(xlator_t *subvol, loc_t *loc, char **buffer, size_t size,</div><div class='add'>+                dict_t *xdata_in, dict_t **xdata_out);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+syncop_mknod(xlator_t *subvol, loc_t *loc, mode_t mode, dev_t rdev,</div><div class='add'>+             struct iatt *iatt, dict_t *xdata_in, dict_t **xdata_out);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+syncop_mkdir(xlator_t *subvol, loc_t *loc, mode_t mode, struct iatt *iatt,</div><div class='add'>+             dict_t *xdata_in, dict_t **xdata_out);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+syncop_link(xlator_t *subvol, loc_t *oldloc, loc_t *newloc, struct iatt *iatt,</div><div class='add'>+            dict_t *xdata_in, dict_t **xdata_out);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+syncop_fsyncdir(xlator_t *subvol, fd_t *fd, int datasync, dict_t *xdata_in,</div><div class='add'>+                dict_t **xdata_out);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+syncop_access(xlator_t *subvol, loc_t *loc, int32_t mask, dict_t *xdata_in,</div><div class='add'>+              dict_t **xdata_out);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+syncop_fallocate(xlator_t *subvol, fd_t *fd, int32_t keep_size, off_t offset,</div><div class='add'>+                 size_t len, dict_t *xdata_in, dict_t **xdata_out);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+syncop_discard(xlator_t *subvol, fd_t *fd, off_t offset, size_t len,</div><div class='add'>+               dict_t *xdata_in, dict_t **xdata_out);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+syncop_zerofill(xlator_t *subvol, fd_t *fd, off_t offset, off_t len,</div><div class='add'>+                dict_t *xdata_in, dict_t **xdata_out);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+syncop_rename(xlator_t *subvol, loc_t *oldloc, loc_t *newloc, dict_t *xdata_in,</div><div class='add'>+              dict_t **xdata_out);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+syncop_lk(xlator_t *subvol, fd_t *fd, int cmd, struct gf_flock *flock,</div><div class='add'>+          dict_t *xdata_in, dict_t **xdata_out);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+syncop_inodelk(xlator_t *subvol, const char *volume, loc_t *loc, int32_t cmd,</div><div class='add'>+               struct gf_flock *lock, dict_t *xdata_in, dict_t **xdata_out);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+syncop_lease(xlator_t *subvol, loc_t *loc, struct gf_lease *lease,</div><div class='add'>+             dict_t *xdata_in, dict_t **xdata_out);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+syncop_ipc(xlator_t *subvol, int op, dict_t *xdata_in, dict_t **xdata_out);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+syncop_xattrop(xlator_t *subvol, loc_t *loc, gf_xattrop_flags_t flags,</div><div class='add'>+               dict_t *dict, dict_t *xdata_in, dict_t **dict_out,</div><div class='add'>+               dict_t **xdata_out);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+syncop_fxattrop(xlator_t *subvol, fd_t *fd, gf_xattrop_flags_t flags,</div><div class='add'>+                dict_t *dict, dict_t *xdata_in, dict_t **dict_out,</div><div class='add'>+                dict_t **xdata_out);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+syncop_seek(xlator_t *subvol, fd_t *fd, off_t offset, gf_seek_what_t what,</div><div class='add'>+            dict_t *xdata_in, off_t *off);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+syncop_getactivelk(xlator_t *subvol, loc_t *loc,</div><div class='add'>+                   lock_migration_info_t *locklist, dict_t *xdata_in,</div><div class='add'>+                   dict_t **xdata_out);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+syncop_setactivelk_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                       int32_t op_ret, int32_t op_errno, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+syncop_setactivelk(xlator_t *subvol, loc_t *loc,</div><div class='add'>+                   lock_migration_info_t *locklist, dict_t *xdata_in,</div><div class='add'>+                   dict_t **xdata_out);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+syncop_put(xlator_t *subvol, loc_t *loc, mode_t mode, mode_t umask,</div><div class='add'>+           uint32_t flags, struct iovec *vector, int32_t count, off_t offset,</div><div class='add'>+           struct iobref *iobref, dict_t *xattr, struct iatt *iatt,</div><div class='add'>+           dict_t *xdata_in, dict_t **xdata_out);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+syncop_setactivelk_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                       int32_t op_ret, int32_t op_errno, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+syncop_icreate(xlator_t *subvol, loc_t *loc, mode_t mode, dict_t *xdata_out);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+syncop_entrylk(xlator_t *subvol, const char *volume, loc_t *loc,</div><div class='add'>+               const char *basename, entrylk_cmd cmd, entrylk_type type,</div><div class='add'>+               dict_t *xdata_in, dict_t **xdata_out);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+syncop_copy_file_range(xlator_t *subvol, fd_t *fd_in, off64_t off_in,</div><div class='add'>+                       fd_t *fd_out, off64_t off_out, size_t len,</div><div class='add'>+                       uint32_t flags, struct iatt *stbuf,</div><div class='add'>+                       struct iatt *preiatt_dst, struct iatt *postiatt_dst,</div><div class='add'>+                       dict_t *xdata_in, dict_t **xdata_out);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+syncop_copy_file_range_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                           int op_ret, int op_errno, struct iatt *stbuf,</div><div class='add'>+                           struct iatt *prebuf_dst, struct iatt *postbuf_dst,</div><div class='add'>+                           dict_t *xdata);</div><div class='add'>+</div><div class='add'>+#endif /* _SYNCOP_H */</div><div class='head'>diff --git a/libglusterfs/src/glusterfs/syscall.h b/libglusterfs/src/glusterfs/syscall.h<br/>new file mode 100644<br/>index 00000000000..b6d3ab4f2ad<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/libglusterfs/src/glusterfs/syscall.h?id=d1d7a6f35c816822fab51c820e25023863c239c1'>libglusterfs/src/glusterfs/syscall.h</a></div><div class='hunk'>@@ -0,0 +1,278 @@</div><div class='add'>+/*</div><div class='add'>+  Copyright (c) 2008-2012 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#ifndef __SYSCALL_H__</div><div class='add'>+#define __SYSCALL_H__</div><div class='add'>+</div><div class='add'>+#include &lt;dirent.h&gt;</div><div class='add'>+#include &lt;sys/uio.h&gt;</div><div class='add'>+#include &lt;sys/statvfs.h&gt;</div><div class='add'>+#include &lt;sys/stat.h&gt;</div><div class='add'>+#include &lt;sys/time.h&gt;</div><div class='add'>+#include &lt;sys/socket.h&gt;</div><div class='add'>+#include &lt;stdio.h&gt;</div><div class='add'>+</div><div class='add'>+/* GF follows the Linux XATTR definition, which differs in Darwin. */</div><div class='add'>+#define GF_XATTR_CREATE 0x1  /* set value, fail if attr already exists */</div><div class='add'>+#define GF_XATTR_REPLACE 0x2 /* set value, fail if attr does not exist */</div><div class='add'>+</div><div class='add'>+/* Linux kernel version 2.6.x don't have these defined</div><div class='add'>+   define if not defined */</div><div class='add'>+</div><div class='add'>+#ifndef XATTR_SECURITY_PREFIX</div><div class='add'>+#define XATTR_SECURITY_PREFIX "security."</div><div class='add'>+#define XATTR_SECURITY_PREFIX_LEN (sizeof(XATTR_SECURITY_PREFIX) - 1)</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#ifndef XATTR_SYSTEM_PREFIX</div><div class='add'>+#define XATTR_SYSTEM_PREFIX "system."</div><div class='add'>+#define XATTR_SYSTEM_PREFIX_LEN (sizeof(XATTR_SYSTEM_PREFIX) - 1)</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#ifndef XATTR_TRUSTED_PREFIX</div><div class='add'>+#define XATTR_TRUSTED_PREFIX "trusted."</div><div class='add'>+#define XATTR_TRUSTED_PREFIX_LEN (sizeof(XATTR_TRUSTED_PREFIX) - 1)</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#ifndef XATTR_USER_PREFIX</div><div class='add'>+#define XATTR_USER_PREFIX "user."</div><div class='add'>+#define XATTR_USER_PREFIX_LEN (sizeof(XATTR_USER_PREFIX) - 1)</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#if defined(GF_DARWIN_HOST_OS)</div><div class='add'>+#include &lt;sys/xattr.h&gt;</div><div class='add'>+#define XATTR_DARWIN_NOSECURITY XATTR_NOSECURITY</div><div class='add'>+#define XATTR_DARWIN_NODEFAULT XATTR_NODEFAULT</div><div class='add'>+#define XATTR_DARWIN_SHOWCOMPRESSION XATTR_SHOWCOMPRESSION</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+sys_lstat(const char *path, struct stat *buf);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+sys_stat(const char *path, struct stat *buf);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+sys_fstat(int fd, struct stat *buf);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+sys_fstatat(int dirfd, const char *pathname, struct stat *buf, int flags);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+sys_open(const char *pathname, int flags, int mode);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+sys_openat(int dirfd, const char *pathname, int flags, int mode);</div><div class='add'>+</div><div class='add'>+DIR *</div><div class='add'>+sys_opendir(const char *name);</div><div class='add'>+</div><div class='add'>+struct dirent *</div><div class='add'>+sys_readdir(DIR *dir, struct dirent *de);</div><div class='add'>+</div><div class='add'>+ssize_t</div><div class='add'>+sys_readlink(const char *path, char *buf, size_t bufsiz);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+sys_closedir(DIR *dir);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+sys_mknod(const char *pathname, mode_t mode, dev_t dev);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+sys_mkdir(const char *pathname, mode_t mode);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+sys_mkdirat(int dirfd, const char *pathname, mode_t mode);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+sys_unlink(const char *pathname);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+sys_unlinkat(int dfd, const char *pathname);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+sys_rmdir(const char *pathname);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+sys_symlink(const char *oldpath, const char *newpath);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+sys_symlinkat(const char *oldpath, int dirfd, const char *newpath);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+sys_rename(const char *oldpath, const char *newpath);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+sys_link(const char *oldpath, const char *newpath);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+sys_linkat(int oldfd, const char *oldpath, int newfd, const char *newpath);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+sys_chmod(const char *path, mode_t mode);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+sys_fchmod(int fd, mode_t mode);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+sys_chown(const char *path, uid_t owner, gid_t group);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+sys_fchown(int fd, uid_t owner, gid_t group);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+sys_lchown(const char *path, uid_t owner, gid_t group);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+sys_truncate(const char *path, off_t length);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+sys_ftruncate(int fd, off_t length);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+sys_utimes(const char *filename, const struct timeval times[2]);</div><div class='add'>+</div><div class='add'>+#if defined(HAVE_UTIMENSAT)</div><div class='add'>+int</div><div class='add'>+sys_utimensat(int dirfd, const char *filename, const struct timespec times[2],</div><div class='add'>+              int flags);</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+sys_futimes(int fd, const struct timeval times[2]);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+sys_creat(const char *pathname, mode_t mode);</div><div class='add'>+</div><div class='add'>+ssize_t</div><div class='add'>+sys_readv(int fd, const struct iovec *iov, int iovcnt);</div><div class='add'>+</div><div class='add'>+ssize_t</div><div class='add'>+sys_writev(int fd, const struct iovec *iov, int iovcnt);</div><div class='add'>+</div><div class='add'>+ssize_t</div><div class='add'>+sys_read(int fd, void *buf, size_t count);</div><div class='add'>+</div><div class='add'>+ssize_t</div><div class='add'>+sys_write(int fd, const void *buf, size_t count);</div><div class='add'>+</div><div class='add'>+off_t</div><div class='add'>+sys_lseek(int fd, off_t offset, int whence);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+sys_statvfs(const char *path, struct statvfs *buf);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+sys_fstatvfs(int fd, struct statvfs *buf);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+sys_close(int fd);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+sys_fsync(int fd);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+sys_fdatasync(int fd);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+gf_add_prefix(const char *ns, const char *key, char **newkey);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+gf_remove_prefix(const char *ns, const char *key, char **newkey);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+sys_lsetxattr(const char *path, const char *name, const void *value,</div><div class='add'>+              size_t size, int flags);</div><div class='add'>+</div><div class='add'>+ssize_t</div><div class='add'>+sys_llistxattr(const char *path, char *list, size_t size);</div><div class='add'>+</div><div class='add'>+ssize_t</div><div class='add'>+sys_lgetxattr(const char *path, const char *name, void *value, size_t size);</div><div class='add'>+</div><div class='add'>+ssize_t</div><div class='add'>+sys_fgetxattr(int filedes, const char *name, void *value, size_t size);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+sys_fsetxattr(int filedes, const char *name, const void *value, size_t size,</div><div class='add'>+              int flags);</div><div class='add'>+</div><div class='add'>+ssize_t</div><div class='add'>+sys_flistxattr(int filedes, char *list, size_t size);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+sys_lremovexattr(const char *path, const char *name);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+sys_fremovexattr(int filedes, const char *name);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+sys_access(const char *pathname, int mode);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+sys_fallocate(int fd, int mode, off_t offset, off_t len);</div><div class='add'>+</div><div class='add'>+ssize_t</div><div class='add'>+sys_preadv(int fd, const struct iovec *iov, int iovcnt, off_t offset);</div><div class='add'>+</div><div class='add'>+ssize_t</div><div class='add'>+sys_pwritev(int fd, const struct iovec *iov, int iovcnt, off_t offset);</div><div class='add'>+</div><div class='add'>+ssize_t</div><div class='add'>+sys_pread(int fd, void *buf, size_t count, off_t offset);</div><div class='add'>+</div><div class='add'>+ssize_t</div><div class='add'>+sys_pwrite(int fd, const void *buf, size_t count, off_t offset);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+sys_socket(int domain, int type, int protocol);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+sys_accept(int sock, struct sockaddr *sockaddr, socklen_t *socklen, int flags);</div><div class='add'>+</div><div class='add'>+#ifdef GF_BSD_HOST_OS</div><div class='add'>+#ifndef _OFF64_T_DECLARED</div><div class='add'>+/*</div><div class='add'>+ * Including &lt;stdio.h&gt; (done above) should actually define</div><div class='add'>+ * _OFF64_T_DECLARED with off64_t data type being available</div><div class='add'>+ * for consumption. But, off64_t data type is not recognizable</div><div class='add'>+ * for FreeBSD versions less than 11. Hence, int64_t is typedefed</div><div class='add'>+ * to off64_t.</div><div class='add'>+ */</div><div class='add'>+#define _OFF64_T_DECLARED</div><div class='add'>+typedef int64_t off64_t;</div><div class='add'>+#endif /* _OFF64_T_DECLARED */</div><div class='add'>+#endif /* GF_BSD_HOST_OS */</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+ * According to the man page of copy_file_range, both off_in and off_out are</div><div class='add'>+ * pointers to the data type loff_t (i.e. loff_t *). But, freebsd does not</div><div class='add'>+ * have (and recognize) loff_t. Since loff_t is 64 bits, use off64_t</div><div class='add'>+ * instead.  Since it's a pointer type it should be okay. It just needs</div><div class='add'>+ * to be a pointer-to-64-bit pointer for both 32- and 64-bit platforms.</div><div class='add'>+ * off64_t is recognized by freebsd.</div><div class='add'>+ * TODO: In future, when freebsd can recognize loff_t, probably revisit this</div><div class='add'>+ *       and change the off_in and off_out to (loff_t *).</div><div class='add'>+ */</div><div class='add'>+ssize_t</div><div class='add'>+sys_copy_file_range(int fd_in, off64_t *off_in, int fd_out, off64_t *off_out,</div><div class='add'>+                    size_t len, unsigned int flags);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+sys_kill(pid_t pid, int sig);</div><div class='add'>+</div><div class='add'>+#ifdef __FreeBSD__</div><div class='add'>+int</div><div class='add'>+sys_sysctl(const int *name, u_int namelen, void *oldp, size_t *oldlenp,</div><div class='add'>+           const void *newp, size_t newlen);</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#endif /* __SYSCALL_H__ */</div><div class='head'>diff --git a/libglusterfs/src/glusterfs/template-component-messages.h b/libglusterfs/src/glusterfs/template-component-messages.h<br/>new file mode 100644<br/>index 00000000000..aa7ad3d1baa<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/libglusterfs/src/glusterfs/template-component-messages.h?id=d1d7a6f35c816822fab51c820e25023863c239c1'>libglusterfs/src/glusterfs/template-component-messages.h</a></div><div class='hunk'>@@ -0,0 +1,28 @@</div><div class='add'>+/*</div><div class='add'>+ Copyright (c) 2013 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+ This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+ This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+ General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+ later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+ cases as published by the Free Software Foundation.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+#ifndef _component_MESSAGES_H_</div><div class='add'>+#define _component_MESSAGES_H_</div><div class='add'>+</div><div class='add'>+#include "glusterfs/glfs-message-id.h"</div><div class='add'>+</div><div class='add'>+/* To add new message IDs, append new identifiers at the end of the list.</div><div class='add'>+ *</div><div class='add'>+ * Never remove a message ID. If it's not used anymore, you can rename it or</div><div class='add'>+ * leave it as it is, but not delete it. This is to prevent reutilization of</div><div class='add'>+ * IDs by other messages.</div><div class='add'>+ *</div><div class='add'>+ * The component name must match one of the entries defined in</div><div class='add'>+ * glfs-message-id.h.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+GLFS_MSGID(component, message id, message id, ...);</div><div class='add'>+</div><div class='add'>+#endif /* !_component_MESSAGES_H_ */</div><div class='head'>diff --git a/libglusterfs/src/glusterfs/throttle-tbf.h b/libglusterfs/src/glusterfs/throttle-tbf.h<br/>new file mode 100644<br/>index 00000000000..cccb13c83d9<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/libglusterfs/src/glusterfs/throttle-tbf.h?id=d1d7a6f35c816822fab51c820e25023863c239c1'>libglusterfs/src/glusterfs/throttle-tbf.h</a></div><div class='hunk'>@@ -0,0 +1,74 @@</div><div class='add'>+/*</div><div class='add'>+   Copyright (c) 2015 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+   This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+   This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+   General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+   later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+   cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#include "glusterfs/list.h"</div><div class='add'>+#include "glusterfs/xlator.h"</div><div class='add'>+#include "glusterfs/locking.h"</div><div class='add'>+</div><div class='add'>+#ifndef THROTTLE_TBF_H__</div><div class='add'>+#define THROTTLE_TBF_H__</div><div class='add'>+</div><div class='add'>+typedef enum tbf_ops {</div><div class='add'>+    TBF_OP_MIN = -1,</div><div class='add'>+    TBF_OP_HASH = 0,    /* checksum calculation  */</div><div class='add'>+    TBF_OP_READ = 1,    /* inode read(s)         */</div><div class='add'>+    TBF_OP_READDIR = 2, /* dentry read(s)        */</div><div class='add'>+    TBF_OP_MAX = 3,</div><div class='add'>+} tbf_ops_t;</div><div class='add'>+</div><div class='add'>+/**</div><div class='add'>+ * Operation rate specification</div><div class='add'>+ */</div><div class='add'>+typedef struct tbf_opspec {</div><div class='add'>+    tbf_ops_t op;</div><div class='add'>+</div><div class='add'>+    unsigned long rate;</div><div class='add'>+</div><div class='add'>+    unsigned long maxlimit;</div><div class='add'>+</div><div class='add'>+    unsigned long token_gen_interval; /* Token generation interval in usec */</div><div class='add'>+} tbf_opspec_t;</div><div class='add'>+</div><div class='add'>+/**</div><div class='add'>+ * Token bucket for each operation type</div><div class='add'>+ */</div><div class='add'>+typedef struct tbf_bucket {</div><div class='add'>+    gf_lock_t lock;</div><div class='add'>+</div><div class='add'>+    pthread_t tokener; /* token generator thread          */</div><div class='add'>+</div><div class='add'>+    unsigned long tokenrate; /* token generation rate           */</div><div class='add'>+</div><div class='add'>+    unsigned long tokens; /* number of current tokens        */</div><div class='add'>+</div><div class='add'>+    unsigned long maxtokens; /* maximum token in the bucket     */</div><div class='add'>+</div><div class='add'>+    struct list_head queued; /* list of non-conformant requests */</div><div class='add'>+</div><div class='add'>+    unsigned long token_gen_interval; /* Token generation interval in usec */</div><div class='add'>+} tbf_bucket_t;</div><div class='add'>+</div><div class='add'>+typedef struct tbf {</div><div class='add'>+    tbf_bucket_t **bucket;</div><div class='add'>+} tbf_t;</div><div class='add'>+</div><div class='add'>+tbf_t *</div><div class='add'>+tbf_init(tbf_opspec_t *, unsigned int);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+tbf_mod(tbf_t *, tbf_opspec_t *);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+tbf_throttle(tbf_t *, tbf_ops_t, unsigned long);</div><div class='add'>+</div><div class='add'>+#define TBF_THROTTLE_BEGIN(tbf, op, tokens) (tbf_throttle(tbf, op, tokens))</div><div class='add'>+#define TBF_THROTTLE_END(tbf, op, tokens)</div><div class='add'>+</div><div class='add'>+#endif /** THROTTLE_TBF_H__ */</div><div class='head'>diff --git a/libglusterfs/src/glusterfs/timer.h b/libglusterfs/src/glusterfs/timer.h<br/>new file mode 100644<br/>index 00000000000..ae5b2edf451<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/libglusterfs/src/glusterfs/timer.h?id=d1d7a6f35c816822fab51c820e25023863c239c1'>libglusterfs/src/glusterfs/timer.h</a></div><div class='hunk'>@@ -0,0 +1,56 @@</div><div class='add'>+/*</div><div class='add'>+  Copyright (c) 2008-2012 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#ifndef _TIMER_H</div><div class='add'>+#define _TIMER_H</div><div class='add'>+</div><div class='add'>+#include "glusterfs/glusterfs.h"</div><div class='add'>+#include "glusterfs/xlator.h"</div><div class='add'>+#include &lt;sys/time.h&gt;</div><div class='add'>+#include &lt;pthread.h&gt;</div><div class='add'>+</div><div class='add'>+typedef void (*gf_timer_cbk_t)(void *);</div><div class='add'>+</div><div class='add'>+struct _gf_timer {</div><div class='add'>+    union {</div><div class='add'>+        struct list_head list;</div><div class='add'>+        struct {</div><div class='add'>+            struct _gf_timer *next;</div><div class='add'>+            struct _gf_timer *prev;</div><div class='add'>+        };</div><div class='add'>+    };</div><div class='add'>+    struct timespec at;</div><div class='add'>+    gf_timer_cbk_t callbk;</div><div class='add'>+    void *data;</div><div class='add'>+    xlator_t *xl;</div><div class='add'>+    gf_boolean_t fired;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct _gf_timer_registry {</div><div class='add'>+    struct list_head active;</div><div class='add'>+    pthread_mutex_t lock;</div><div class='add'>+    pthread_cond_t cond;</div><div class='add'>+    pthread_t th;</div><div class='add'>+    char fin;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+typedef struct _gf_timer gf_timer_t;</div><div class='add'>+typedef struct _gf_timer_registry gf_timer_registry_t;</div><div class='add'>+</div><div class='add'>+gf_timer_t *</div><div class='add'>+gf_timer_call_after(glusterfs_ctx_t *ctx, struct timespec delta,</div><div class='add'>+                    gf_timer_cbk_t cbk, void *data);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+gf_timer_call_cancel(glusterfs_ctx_t *ctx, gf_timer_t *event);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+gf_timer_registry_destroy(glusterfs_ctx_t *ctx);</div><div class='add'>+#endif /* _TIMER_H */</div><div class='head'>diff --git a/libglusterfs/src/glusterfs/timespec.h b/libglusterfs/src/glusterfs/timespec.h<br/>new file mode 100644<br/>index 00000000000..bb9ab446a5f<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/libglusterfs/src/glusterfs/timespec.h?id=d1d7a6f35c816822fab51c820e25023863c239c1'>libglusterfs/src/glusterfs/timespec.h</a></div><div class='hunk'>@@ -0,0 +1,33 @@</div><div class='add'>+/*</div><div class='add'>+  Copyright (c) 2013 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#ifndef __INCLUDE_TIMESPEC_H__</div><div class='add'>+#define __INCLUDE_TIMESPEC_H__</div><div class='add'>+</div><div class='add'>+#include &lt;stdint.h&gt;</div><div class='add'>+#include &lt;sys/time.h&gt;</div><div class='add'>+</div><div class='add'>+#define TS(ts) ((ts.tv_sec * 1000000000LL) + ts.tv_nsec)</div><div class='add'>+#define NANO (+1.0E-9)</div><div class='add'>+#define GIGA UINT64_C(1000000000)</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+timespec_now(struct timespec *ts);</div><div class='add'>+void</div><div class='add'>+timespec_now_realtime(struct timespec *ts);</div><div class='add'>+void</div><div class='add'>+timespec_adjust_delta(struct timespec *ts, struct timespec delta);</div><div class='add'>+void</div><div class='add'>+timespec_sub(const struct timespec *begin, const struct timespec *end,</div><div class='add'>+             struct timespec *res);</div><div class='add'>+int</div><div class='add'>+timespec_cmp(const struct timespec *lhs_ts, const struct timespec *rhs_ts);</div><div class='add'>+</div><div class='add'>+#endif /*  __INCLUDE_TIMESPEC_H__ */</div><div class='head'>diff --git a/libglusterfs/src/glusterfs/trie.h b/libglusterfs/src/glusterfs/trie.h<br/>new file mode 100644<br/>index 00000000000..6d2d8015964<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/libglusterfs/src/glusterfs/trie.h?id=d1d7a6f35c816822fab51c820e25023863c239c1'>libglusterfs/src/glusterfs/trie.h</a></div><div class='hunk'>@@ -0,0 +1,52 @@</div><div class='add'>+/*</div><div class='add'>+  Copyright (c) 2008-2012 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#ifndef _TRIE_H_</div><div class='add'>+#define _TRIE_H_</div><div class='add'>+</div><div class='add'>+struct trienode;</div><div class='add'>+typedef struct trienode trienode_t;</div><div class='add'>+</div><div class='add'>+struct trie;</div><div class='add'>+typedef struct trie trie_t;</div><div class='add'>+</div><div class='add'>+struct trienodevec {</div><div class='add'>+    trienode_t **nodes;</div><div class='add'>+    unsigned cnt;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+trie_t *</div><div class='add'>+trie_new();</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+trie_add(trie_t *trie, const char *word);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+trie_destroy(trie_t *trie);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+trie_destroy_bynode(trienode_t *node);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+trie_measure(trie_t *trie, const char *word, trienode_t **nodes, int nodecnt);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+trie_measure_vec(trie_t *trie, const char *word, struct trienodevec *nodevec);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+trie_reset_search(trie_t *trie);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+trienode_get_dist(trienode_t *node);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+trienode_get_word(trienode_t *node, char **buf);</div><div class='add'>+</div><div class='add'>+#endif</div><div class='head'>diff --git a/libglusterfs/src/glusterfs/upcall-utils.h b/libglusterfs/src/glusterfs/upcall-utils.h<br/>new file mode 100644<br/>index 00000000000..0de8428c5fc<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/libglusterfs/src/glusterfs/upcall-utils.h?id=d1d7a6f35c816822fab51c820e25023863c239c1'>libglusterfs/src/glusterfs/upcall-utils.h</a></div><div class='hunk'>@@ -0,0 +1,110 @@</div><div class='add'>+/*</div><div class='add'>+  Copyright (c) 2015, Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#ifndef _UPCALL_UTILS_H</div><div class='add'>+#define _UPCALL_UTILS_H</div><div class='add'>+</div><div class='add'>+#include "glusterfs/iatt.h"</div><div class='add'>+#include "glusterfs/compat-uuid.h"</div><div class='add'>+#include "glusterfs/compat.h"</div><div class='add'>+</div><div class='add'>+/* Flags sent for cache_invalidation */</div><div class='add'>+#define UP_NLINK 0x00000001 /* update nlink */</div><div class='add'>+#define UP_MODE 0x00000002  /* update mode and ctime */</div><div class='add'>+#define UP_OWN 0x00000004   /* update mode,uid,gid and ctime */</div><div class='add'>+#define UP_SIZE 0x00000008  /* update fsize */</div><div class='add'>+#define UP_TIMES 0x00000010 /* update all times */</div><div class='add'>+#define UP_ATIME 0x00000020 /* update atime only */</div><div class='add'>+#define UP_PERM                                                                \</div><div class='add'>+    0x00000040 /* update fields needed for permission                          \</div><div class='add'>+                  checking */</div><div class='add'>+#define UP_RENAME                                                              \</div><div class='add'>+    0x00000080 /* this is a rename op - delete the cache                       \</div><div class='add'>+                  entry */</div><div class='add'>+#define UP_FORGET                                                              \</div><div class='add'>+    0x00000100                     /* inode_forget on server side -            \</div><div class='add'>+                                      invalidate the cache entry */</div><div class='add'>+#define UP_PARENT_TIMES 0x00000200 /* update parent dir times */</div><div class='add'>+</div><div class='add'>+#define UP_XATTR 0x00000400    /* update the xattrs and ctime */</div><div class='add'>+#define UP_XATTR_RM 0x00000800 /* Remove the xattrs and update ctime */</div><div class='add'>+</div><div class='add'>+#define UP_EXPLICIT_LOOKUP 0x00001000 /* Request an explicit lookup */</div><div class='add'>+</div><div class='add'>+#define UP_INVAL_ATTR 0x00002000 /* Request to invalidate iatt and xatt */</div><div class='add'>+</div><div class='add'>+/* for fops - open, read, lk, */</div><div class='add'>+#define UP_UPDATE_CLIENT (UP_ATIME)</div><div class='add'>+</div><div class='add'>+/* for fop - write, truncate */</div><div class='add'>+#define UP_WRITE_FLAGS (UP_SIZE | UP_TIMES)</div><div class='add'>+</div><div class='add'>+/* for fop - setattr */</div><div class='add'>+#define UP_ATTR_FLAGS (UP_SIZE | UP_TIMES | UP_OWN | UP_MODE | UP_PERM)</div><div class='add'>+/* for fop - rename */</div><div class='add'>+#define UP_RENAME_FLAGS (UP_RENAME)</div><div class='add'>+</div><div class='add'>+/* to invalidate parent directory entries for fops -rename, unlink, rmdir,</div><div class='add'>+ * mkdir, create */</div><div class='add'>+#define UP_PARENT_DENTRY_FLAGS (UP_PARENT_TIMES)</div><div class='add'>+</div><div class='add'>+/* for fop - unlink, link, rmdir, mkdir */</div><div class='add'>+#define UP_NLINK_FLAGS (UP_NLINK | UP_TIMES)</div><div class='add'>+</div><div class='add'>+#define IATT_UPDATE_FLAGS                                                      \</div><div class='add'>+    (UP_NLINK | UP_MODE | UP_OWN | UP_SIZE | UP_TIMES | UP_ATIME | UP_PERM)</div><div class='add'>+</div><div class='add'>+typedef enum {</div><div class='add'>+    GF_UPCALL_EVENT_NULL,</div><div class='add'>+    GF_UPCALL_CACHE_INVALIDATION,</div><div class='add'>+    GF_UPCALL_RECALL_LEASE,</div><div class='add'>+    GF_UPCALL_INODELK_CONTENTION,</div><div class='add'>+    GF_UPCALL_ENTRYLK_CONTENTION,</div><div class='add'>+} gf_upcall_event_t;</div><div class='add'>+</div><div class='add'>+struct gf_upcall {</div><div class='add'>+    char *client_uid;</div><div class='add'>+    uuid_t gfid;</div><div class='add'>+    uint32_t event_type;</div><div class='add'>+    void *data;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct gf_upcall_cache_invalidation {</div><div class='add'>+    uint32_t flags;</div><div class='add'>+    uint32_t expire_time_attr;</div><div class='add'>+    struct iatt stat;</div><div class='add'>+    struct iatt p_stat;    /* parent dir stat */</div><div class='add'>+    struct iatt oldp_stat; /* oldparent dir stat */</div><div class='add'>+    dict_t *dict;          /* For xattrs */</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct gf_upcall_recall_lease {</div><div class='add'>+    uint32_t lease_type; /* Lease type to which client can downgrade to*/</div><div class='add'>+    uuid_t tid;          /* transaction id of the fop that caused</div><div class='add'>+                            the recall */</div><div class='add'>+    dict_t *dict;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct gf_upcall_inodelk_contention {</div><div class='add'>+    struct gf_flock flock;</div><div class='add'>+    pid_t pid;</div><div class='add'>+    const char *domain;</div><div class='add'>+    dict_t *xdata;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct gf_upcall_entrylk_contention {</div><div class='add'>+    uint32_t type;</div><div class='add'>+    pid_t pid;</div><div class='add'>+    const char *name;</div><div class='add'>+    const char *domain;</div><div class='add'>+    dict_t *xdata;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+#endif /* _UPCALL_UTILS_H */</div><div class='head'>diff --git a/libglusterfs/src/glusterfs/xlator.h b/libglusterfs/src/glusterfs/xlator.h<br/>new file mode 100644<br/>index 00000000000..4fd3abdaeff<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/libglusterfs/src/glusterfs/xlator.h?id=d1d7a6f35c816822fab51c820e25023863c239c1'>libglusterfs/src/glusterfs/xlator.h</a></div><div class='hunk'>@@ -0,0 +1,1106 @@</div><div class='add'>+/*</div><div class='add'>+  Copyright (c) 2008-2012 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#ifndef _XLATOR_H</div><div class='add'>+#define _XLATOR_H</div><div class='add'>+</div><div class='add'>+#include &lt;stdint.h&gt;                    // for int32_t</div><div class='add'>+#include &lt;sys/types.h&gt;                 // for off_t, mode_t, off64_t, dev_t</div><div class='add'>+#include "glusterfs/glusterfs-fops.h"  // for GF_FOP_MAXVALUE, entrylk_cmd</div><div class='add'>+#include "glusterfs/atomic.h"          // for gf_atomic_t</div><div class='add'>+#include "glusterfs/glusterfs.h"       // for gf_boolean_t, glusterfs_ctx_t</div><div class='add'>+#include "glusterfs/compat-uuid.h"     // for uuid_t</div><div class='add'>+#include "glusterfs/compat.h"</div><div class='add'>+#include "glusterfs/event-history.h"</div><div class='add'>+#include "glusterfs/dict.h"</div><div class='add'>+#include "glusterfs/latency.h"</div><div class='add'>+</div><div class='add'>+#define FIRST_CHILD(xl) (xl-&gt;children-&gt;xlator)</div><div class='add'>+#define SECOND_CHILD(xl) (xl-&gt;children-&gt;next-&gt;xlator)</div><div class='add'>+</div><div class='add'>+#define GF_SET_ATTR_MODE 0x1</div><div class='add'>+#define GF_SET_ATTR_UID 0x2</div><div class='add'>+#define GF_SET_ATTR_GID 0x4</div><div class='add'>+#define GF_SET_ATTR_SIZE 0x8</div><div class='add'>+#define GF_SET_ATTR_ATIME 0x10</div><div class='add'>+#define GF_SET_ATTR_MTIME 0x20</div><div class='add'>+#define GF_SET_ATTR_CTIME 0x40</div><div class='add'>+#define GF_ATTR_ATIME_NOW 0x80</div><div class='add'>+#define GF_ATTR_MTIME_NOW 0x100</div><div class='add'>+</div><div class='add'>+#define gf_attr_mode_set(mode) ((mode)&amp;GF_SET_ATTR_MODE)</div><div class='add'>+#define gf_attr_uid_set(mode) ((mode)&amp;GF_SET_ATTR_UID)</div><div class='add'>+#define gf_attr_gid_set(mode) ((mode)&amp;GF_SET_ATTR_GID)</div><div class='add'>+#define gf_attr_size_set(mode) ((mode)&amp;GF_SET_ATTR_SIZE)</div><div class='add'>+#define gf_attr_atime_set(mode) ((mode)&amp;GF_SET_ATTR_ATIME)</div><div class='add'>+#define gf_attr_mtime_set(mode) ((mode)&amp;GF_SET_ATTR_MTIME)</div><div class='add'>+</div><div class='add'>+struct _xlator;</div><div class='add'>+typedef struct _xlator xlator_t;</div><div class='add'>+struct _dir_entry;</div><div class='add'>+typedef struct _dir_entry dir_entry_t;</div><div class='add'>+struct _gf_dirent;</div><div class='add'>+typedef struct _gf_dirent gf_dirent_t;</div><div class='add'>+struct _loc;</div><div class='add'>+typedef struct _loc loc_t;</div><div class='add'>+</div><div class='add'>+typedef int32_t (*event_notify_fn_t)(xlator_t *this, int32_t event, void *data,</div><div class='add'>+                                     ...);</div><div class='add'>+</div><div class='add'>+#include "glusterfs/list.h"</div><div class='add'>+#include "glusterfs/gf-dirent.h"</div><div class='add'>+#include "glusterfs/stack.h"</div><div class='add'>+#include "glusterfs/iobuf.h"</div><div class='add'>+#include "glusterfs/globals.h"</div><div class='add'>+#include "glusterfs/iatt.h"</div><div class='add'>+#include "glusterfs/options.h"</div><div class='add'>+#include "glusterfs/client_t.h"</div><div class='add'>+</div><div class='add'>+struct _loc {</div><div class='add'>+    const char *path;</div><div class='add'>+    const char *name;</div><div class='add'>+    inode_t *inode;</div><div class='add'>+    inode_t *parent;</div><div class='add'>+    /* Currently all location based operations are through 'gfid' of inode.</div><div class='add'>+     * But the 'inode-&gt;gfid' only gets set in higher most layer (as in,</div><div class='add'>+     * 'fuse', 'protocol/server', or 'nfs/server'). So if translators want</div><div class='add'>+     * to send fops on a inode before the 'inode-&gt;gfid' is set, they have to</div><div class='add'>+     * make use of below 'gfid' fields</div><div class='add'>+     */</div><div class='add'>+    uuid_t gfid;</div><div class='add'>+    uuid_t pargfid;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+typedef int32_t (*fop_getspec_cbk_t)(call_frame_t *frame, void *cookie,</div><div class='add'>+                                     xlator_t *this, int32_t op_ret,</div><div class='add'>+                                     int32_t op_errno, char *spec_data);</div><div class='add'>+</div><div class='add'>+typedef int32_t (*fop_rchecksum_cbk_t)(call_frame_t *frame, void *cookie,</div><div class='add'>+                                       xlator_t *this, int32_t op_ret,</div><div class='add'>+                                       int32_t op_errno, uint32_t weak_checksum,</div><div class='add'>+                                       uint8_t *strong_checksum, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+typedef int32_t (*fop_getspec_t)(call_frame_t *frame, xlator_t *this,</div><div class='add'>+                                 const char *key, int32_t flag);</div><div class='add'>+</div><div class='add'>+typedef int32_t (*fop_rchecksum_t)(call_frame_t *frame, xlator_t *this,</div><div class='add'>+                                   fd_t *fd, off_t offset, int32_t len,</div><div class='add'>+                                   dict_t *xdata);</div><div class='add'>+</div><div class='add'>+typedef int32_t (*fop_lookup_cbk_t)(call_frame_t *frame, void *cookie,</div><div class='add'>+                                    xlator_t *this, int32_t op_ret,</div><div class='add'>+                                    int32_t op_errno, inode_t *inode,</div><div class='add'>+                                    struct iatt *buf, dict_t *xdata,</div><div class='add'>+                                    struct iatt *postparent);</div><div class='add'>+</div><div class='add'>+typedef int32_t (*fop_stat_cbk_t)(call_frame_t *frame, void *cookie,</div><div class='add'>+                                  xlator_t *this, int32_t op_ret,</div><div class='add'>+                                  int32_t op_errno, struct iatt *buf,</div><div class='add'>+                                  dict_t *xdata);</div><div class='add'>+</div><div class='add'>+typedef int32_t (*fop_fstat_cbk_t)(call_frame_t *frame, void *cookie,</div><div class='add'>+                                   xlator_t *this, int32_t op_ret,</div><div class='add'>+                                   int32_t op_errno, struct iatt *buf,</div><div class='add'>+                                   dict_t *xdata);</div><div class='add'>+</div><div class='add'>+typedef int32_t (*fop_truncate_cbk_t)(call_frame_t *frame, void *cookie,</div><div class='add'>+                                      xlator_t *this, int32_t op_ret,</div><div class='add'>+                                      int32_t op_errno, struct iatt *prebuf,</div><div class='add'>+                                      struct iatt *postbuf, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+typedef int32_t (*fop_ftruncate_cbk_t)(call_frame_t *frame, void *cookie,</div><div class='add'>+                                       xlator_t *this, int32_t op_ret,</div><div class='add'>+                                       int32_t op_errno, struct iatt *prebuf,</div><div class='add'>+                                       struct iatt *postbuf, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+typedef int32_t (*fop_access_cbk_t)(call_frame_t *frame, void *cookie,</div><div class='add'>+                                    xlator_t *this, int32_t op_ret,</div><div class='add'>+                                    int32_t op_errno, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+typedef int32_t (*fop_readlink_cbk_t)(call_frame_t *frame, void *cookie,</div><div class='add'>+                                      xlator_t *this, int32_t op_ret,</div><div class='add'>+                                      int32_t op_errno, const char *path,</div><div class='add'>+                                      struct iatt *buf, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+typedef int32_t (*fop_mknod_cbk_t)(call_frame_t *frame, void *cookie,</div><div class='add'>+                                   xlator_t *this, int32_t op_ret,</div><div class='add'>+                                   int32_t op_errno, inode_t *inode,</div><div class='add'>+                                   struct iatt *buf, struct iatt *preparent,</div><div class='add'>+                                   struct iatt *postparent, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+typedef int32_t (*fop_mkdir_cbk_t)(call_frame_t *frame, void *cookie,</div><div class='add'>+                                   xlator_t *this, int32_t op_ret,</div><div class='add'>+                                   int32_t op_errno, inode_t *inode,</div><div class='add'>+                                   struct iatt *buf, struct iatt *preparent,</div><div class='add'>+                                   struct iatt *postparent, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+typedef int32_t (*fop_unlink_cbk_t)(call_frame_t *frame, void *cookie,</div><div class='add'>+                                    xlator_t *this, int32_t op_ret,</div><div class='add'>+                                    int32_t op_errno, struct iatt *preparent,</div><div class='add'>+                                    struct iatt *postparent, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+typedef int32_t (*fop_rmdir_cbk_t)(call_frame_t *frame, void *cookie,</div><div class='add'>+                                   xlator_t *this, int32_t op_ret,</div><div class='add'>+                                   int32_t op_errno, struct iatt *preparent,</div><div class='add'>+                                   struct iatt *postparent, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+typedef int32_t (*fop_symlink_cbk_t)(call_frame_t *frame, void *cookie,</div><div class='add'>+                                     xlator_t *this, int32_t op_ret,</div><div class='add'>+                                     int32_t op_errno, inode_t *inode,</div><div class='add'>+                                     struct iatt *buf, struct iatt *preparent,</div><div class='add'>+                                     struct iatt *postparent, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+typedef int32_t (*fop_rename_cbk_t)(call_frame_t *frame, void *cookie,</div><div class='add'>+                                    xlator_t *this, int32_t op_ret,</div><div class='add'>+                                    int32_t op_errno, struct iatt *buf,</div><div class='add'>+                                    struct iatt *preoldparent,</div><div class='add'>+                                    struct iatt *postoldparent,</div><div class='add'>+                                    struct iatt *prenewparent,</div><div class='add'>+                                    struct iatt *postnewparent, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+typedef int32_t (*fop_link_cbk_t)(call_frame_t *frame, void *cookie,</div><div class='add'>+                                  xlator_t *this, int32_t op_ret,</div><div class='add'>+                                  int32_t op_errno, inode_t *inode,</div><div class='add'>+                                  struct iatt *buf, struct iatt *preparent,</div><div class='add'>+                                  struct iatt *postparent, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+typedef int32_t (*fop_create_cbk_t)(call_frame_t *frame, void *cookie,</div><div class='add'>+                                    xlator_t *this, int32_t op_ret,</div><div class='add'>+                                    int32_t op_errno, fd_t *fd, inode_t *inode,</div><div class='add'>+                                    struct iatt *buf, struct iatt *preparent,</div><div class='add'>+                                    struct iatt *postparent, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+typedef int32_t (*fop_open_cbk_t)(call_frame_t *frame, void *cookie,</div><div class='add'>+                                  xlator_t *this, int32_t op_ret,</div><div class='add'>+                                  int32_t op_errno, fd_t *fd, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+typedef int32_t (*fop_readv_cbk_t)(call_frame_t *frame, void *cookie,</div><div class='add'>+                                   xlator_t *this, int32_t op_ret,</div><div class='add'>+                                   int32_t op_errno, struct iovec *vector,</div><div class='add'>+                                   int32_t count, struct iatt *stbuf,</div><div class='add'>+                                   struct iobref *iobref, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+typedef int32_t (*fop_writev_cbk_t)(call_frame_t *frame, void *cookie,</div><div class='add'>+                                    xlator_t *this, int32_t op_ret,</div><div class='add'>+                                    int32_t op_errno, struct iatt *prebuf,</div><div class='add'>+                                    struct iatt *postbuf, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+typedef int32_t (*fop_flush_cbk_t)(call_frame_t *frame, void *cookie,</div><div class='add'>+                                   xlator_t *this, int32_t op_ret,</div><div class='add'>+                                   int32_t op_errno, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+typedef int32_t (*fop_fsync_cbk_t)(call_frame_t *frame, void *cookie,</div><div class='add'>+                                   xlator_t *this, int32_t op_ret,</div><div class='add'>+                                   int32_t op_errno, struct iatt *prebuf,</div><div class='add'>+                                   struct iatt *postbuf, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+typedef int32_t (*fop_opendir_cbk_t)(call_frame_t *frame, void *cookie,</div><div class='add'>+                                     xlator_t *this, int32_t op_ret,</div><div class='add'>+                                     int32_t op_errno, fd_t *fd, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+typedef int32_t (*fop_fsyncdir_cbk_t)(call_frame_t *frame, void *cookie,</div><div class='add'>+                                      xlator_t *this, int32_t op_ret,</div><div class='add'>+                                      int32_t op_errno, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+typedef int32_t (*fop_statfs_cbk_t)(call_frame_t *frame, void *cookie,</div><div class='add'>+                                    xlator_t *this, int32_t op_ret,</div><div class='add'>+                                    int32_t op_errno, struct statvfs *buf,</div><div class='add'>+                                    dict_t *xdata);</div><div class='add'>+</div><div class='add'>+typedef int32_t (*fop_setxattr_cbk_t)(call_frame_t *frame, void *cookie,</div><div class='add'>+                                      xlator_t *this, int32_t op_ret,</div><div class='add'>+                                      int32_t op_errno, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+typedef int32_t (*fop_getxattr_cbk_t)(call_frame_t *frame, void *cookie,</div><div class='add'>+                                      xlator_t *this, int32_t op_ret,</div><div class='add'>+                                      int32_t op_errno, dict_t *dict,</div><div class='add'>+                                      dict_t *xdata);</div><div class='add'>+</div><div class='add'>+typedef int32_t (*fop_fsetxattr_cbk_t)(call_frame_t *frame, void *cookie,</div><div class='add'>+                                       xlator_t *this, int32_t op_ret,</div><div class='add'>+                                       int32_t op_errno, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+typedef int32_t (*fop_fgetxattr_cbk_t)(call_frame_t *frame, void *cookie,</div><div class='add'>+                                       xlator_t *this, int32_t op_ret,</div><div class='add'>+                                       int32_t op_errno, dict_t *dict,</div><div class='add'>+                                       dict_t *xdata);</div><div class='add'>+</div><div class='add'>+typedef int32_t (*fop_removexattr_cbk_t)(call_frame_t *frame, void *cookie,</div><div class='add'>+                                         xlator_t *this, int32_t op_ret,</div><div class='add'>+                                         int32_t op_errno, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+typedef int32_t (*fop_fremovexattr_cbk_t)(call_frame_t *frame, void *cookie,</div><div class='add'>+                                          xlator_t *this, int32_t op_ret,</div><div class='add'>+                                          int32_t op_errno, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+typedef int32_t (*fop_lk_cbk_t)(call_frame_t *frame, void *cookie,</div><div class='add'>+                                xlator_t *this, int32_t op_ret,</div><div class='add'>+                                int32_t op_errno, struct gf_flock *flock,</div><div class='add'>+                                dict_t *xdata);</div><div class='add'>+</div><div class='add'>+typedef int32_t (*fop_inodelk_cbk_t)(call_frame_t *frame, void *cookie,</div><div class='add'>+                                     xlator_t *this, int32_t op_ret,</div><div class='add'>+                                     int32_t op_errno, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+typedef int32_t (*fop_finodelk_cbk_t)(call_frame_t *frame, void *cookie,</div><div class='add'>+                                      xlator_t *this, int32_t op_ret,</div><div class='add'>+                                      int32_t op_errno, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+typedef int32_t (*fop_entrylk_cbk_t)(call_frame_t *frame, void *cookie,</div><div class='add'>+                                     xlator_t *this, int32_t op_ret,</div><div class='add'>+                                     int32_t op_errno, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+typedef int32_t (*fop_fentrylk_cbk_t)(call_frame_t *frame, void *cookie,</div><div class='add'>+                                      xlator_t *this, int32_t op_ret,</div><div class='add'>+                                      int32_t op_errno, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+typedef int32_t (*fop_readdir_cbk_t)(call_frame_t *frame, void *cookie,</div><div class='add'>+                                     xlator_t *this, int32_t op_ret,</div><div class='add'>+                                     int32_t op_errno, gf_dirent_t *entries,</div><div class='add'>+                                     dict_t *xdata);</div><div class='add'>+</div><div class='add'>+typedef int32_t (*fop_readdirp_cbk_t)(call_frame_t *frame, void *cookie,</div><div class='add'>+                                      xlator_t *this, int32_t op_ret,</div><div class='add'>+                                      int32_t op_errno, gf_dirent_t *entries,</div><div class='add'>+                                      dict_t *xdata);</div><div class='add'>+</div><div class='add'>+typedef int32_t (*fop_xattrop_cbk_t)(call_frame_t *frame, void *cookie,</div><div class='add'>+                                     xlator_t *this, int32_t op_ret,</div><div class='add'>+                                     int32_t op_errno, dict_t *xattr,</div><div class='add'>+                                     dict_t *xdata);</div><div class='add'>+</div><div class='add'>+typedef int32_t (*fop_fxattrop_cbk_t)(call_frame_t *frame, void *cookie,</div><div class='add'>+                                      xlator_t *this, int32_t op_ret,</div><div class='add'>+                                      int32_t op_errno, dict_t *xattr,</div><div class='add'>+                                      dict_t *xdata);</div><div class='add'>+</div><div class='add'>+typedef int32_t (*fop_setattr_cbk_t)(call_frame_t *frame, void *cookie,</div><div class='add'>+                                     xlator_t *this, int32_t op_ret,</div><div class='add'>+                                     int32_t op_errno, struct iatt *preop_stbuf,</div><div class='add'>+                                     struct iatt *postop_stbuf, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+typedef int32_t (*fop_fsetattr_cbk_t)(call_frame_t *frame, void *cookie,</div><div class='add'>+                                      xlator_t *this, int32_t op_ret,</div><div class='add'>+                                      int32_t op_errno,</div><div class='add'>+                                      struct iatt *preop_stbuf,</div><div class='add'>+                                      struct iatt *postop_stbuf, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+typedef int32_t (*fop_fallocate_cbk_t)(call_frame_t *frame, void *cookie,</div><div class='add'>+                                       xlator_t *this, int32_t op_ret,</div><div class='add'>+                                       int32_t op_errno,</div><div class='add'>+                                       struct iatt *preop_stbuf,</div><div class='add'>+                                       struct iatt *postop_stbuf,</div><div class='add'>+                                       dict_t *xdata);</div><div class='add'>+</div><div class='add'>+typedef int32_t (*fop_discard_cbk_t)(call_frame_t *frame, void *cookie,</div><div class='add'>+                                     xlator_t *this, int32_t op_ret,</div><div class='add'>+                                     int32_t op_errno, struct iatt *preop_stbuf,</div><div class='add'>+                                     struct iatt *postop_stbuf, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+typedef int32_t (*fop_zerofill_cbk_t)(call_frame_t *frame, void *cookie,</div><div class='add'>+                                      xlator_t *this, int32_t op_ret,</div><div class='add'>+                                      int32_t op_errno,</div><div class='add'>+                                      struct iatt *preop_stbuf,</div><div class='add'>+                                      struct iatt *postop_stbuf, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+typedef int32_t (*fop_ipc_cbk_t)(call_frame_t *frame, void *cookie,</div><div class='add'>+                                 xlator_t *this, int32_t op_ret,</div><div class='add'>+                                 int32_t op_errno, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+typedef int32_t (*fop_seek_cbk_t)(call_frame_t *frame, void *cookie,</div><div class='add'>+                                  xlator_t *this, int32_t op_ret,</div><div class='add'>+                                  int32_t op_errno, off_t offset,</div><div class='add'>+                                  dict_t *xdata);</div><div class='add'>+</div><div class='add'>+typedef int32_t (*fop_lease_cbk_t)(call_frame_t *frame, void *cookie,</div><div class='add'>+                                   xlator_t *this, int32_t op_ret,</div><div class='add'>+                                   int32_t op_errno, struct gf_lease *lease,</div><div class='add'>+                                   dict_t *xdata);</div><div class='add'>+typedef int32_t (*fop_compound_cbk_t)(call_frame_t *frame, void *cookie,</div><div class='add'>+                                      xlator_t *this, int32_t op_ret,</div><div class='add'>+                                      int32_t op_errno, void *data,</div><div class='add'>+                                      dict_t *xdata);</div><div class='add'>+</div><div class='add'>+typedef int32_t (*fop_getactivelk_cbk_t)(call_frame_t *frame, void *cookie,</div><div class='add'>+                                         xlator_t *this, int32_t op_ret,</div><div class='add'>+                                         int32_t op_errno,</div><div class='add'>+                                         lock_migration_info_t *locklist,</div><div class='add'>+                                         dict_t *xdata);</div><div class='add'>+</div><div class='add'>+typedef int32_t (*fop_setactivelk_cbk_t)(call_frame_t *frame, void *cookie,</div><div class='add'>+                                         xlator_t *this, int32_t op_ret,</div><div class='add'>+                                         int32_t op_errno, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+typedef int32_t (*fop_put_cbk_t)(call_frame_t *frame, void *cookie,</div><div class='add'>+                                 xlator_t *this, int32_t op_ret,</div><div class='add'>+                                 int32_t op_errno, inode_t *inode,</div><div class='add'>+                                 struct iatt *buf, struct iatt *preparent,</div><div class='add'>+                                 struct iatt *postparent, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+typedef int32_t (*fop_icreate_cbk_t)(call_frame_t *frame, void *cookie,</div><div class='add'>+                                     xlator_t *this, int32_t op_ret,</div><div class='add'>+                                     int32_t op_errno, inode_t *inode,</div><div class='add'>+                                     struct iatt *buf, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+typedef int32_t (*fop_namelink_cbk_t)(call_frame_t *frame, void *cookie,</div><div class='add'>+                                      xlator_t *this, int32_t op_ret,</div><div class='add'>+                                      int32_t op_errno, struct iatt *prebuf,</div><div class='add'>+                                      struct iatt *postbuf, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+typedef int32_t (*fop_copy_file_range_cbk_t)(</div><div class='add'>+    call_frame_t *frame, void *cookie, xlator_t *this, int32_t op_ret,</div><div class='add'>+    int32_t op_errno, struct iatt *stbuf, struct iatt *prebuf_dst,</div><div class='add'>+    struct iatt *postbuf_dst, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+typedef int32_t (*fop_lookup_t)(call_frame_t *frame, xlator_t *this, loc_t *loc,</div><div class='add'>+                                dict_t *xdata);</div><div class='add'>+</div><div class='add'>+typedef int32_t (*fop_stat_t)(call_frame_t *frame, xlator_t *this, loc_t *loc,</div><div class='add'>+                              dict_t *xdata);</div><div class='add'>+</div><div class='add'>+typedef int32_t (*fop_fstat_t)(call_frame_t *frame, xlator_t *this, fd_t *fd,</div><div class='add'>+                               dict_t *xdata);</div><div class='add'>+</div><div class='add'>+typedef int32_t (*fop_truncate_t)(call_frame_t *frame, xlator_t *this,</div><div class='add'>+                                  loc_t *loc, off_t offset, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+typedef int32_t (*fop_ftruncate_t)(call_frame_t *frame, xlator_t *this,</div><div class='add'>+                                   fd_t *fd, off_t offset, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+typedef int32_t (*fop_access_t)(call_frame_t *frame, xlator_t *this, loc_t *loc,</div><div class='add'>+                                int32_t mask, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+typedef int32_t (*fop_readlink_t)(call_frame_t *frame, xlator_t *this,</div><div class='add'>+                                  loc_t *loc, size_t size, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+typedef int32_t (*fop_mknod_t)(call_frame_t *frame, xlator_t *this, loc_t *loc,</div><div class='add'>+                               mode_t mode, dev_t rdev, mode_t umask,</div><div class='add'>+                               dict_t *xdata);</div><div class='add'>+</div><div class='add'>+typedef int32_t (*fop_mkdir_t)(call_frame_t *frame, xlator_t *this, loc_t *loc,</div><div class='add'>+                               mode_t mode, mode_t umask, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+typedef int32_t (*fop_unlink_t)(call_frame_t *frame, xlator_t *this, loc_t *loc,</div><div class='add'>+                                int xflags, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+typedef int32_t (*fop_rmdir_t)(call_frame_t *frame, xlator_t *this, loc_t *loc,</div><div class='add'>+                               int xflags, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+typedef int32_t (*fop_symlink_t)(call_frame_t *frame, xlator_t *this,</div><div class='add'>+                                 const char *linkname, loc_t *loc, mode_t umask,</div><div class='add'>+                                 dict_t *xdata);</div><div class='add'>+</div><div class='add'>+typedef int32_t (*fop_rename_t)(call_frame_t *frame, xlator_t *this,</div><div class='add'>+                                loc_t *oldloc, loc_t *newloc, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+typedef int32_t (*fop_link_t)(call_frame_t *frame, xlator_t *this,</div><div class='add'>+                              loc_t *oldloc, loc_t *newloc, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+typedef int32_t (*fop_create_t)(call_frame_t *frame, xlator_t *this, loc_t *loc,</div><div class='add'>+                                int32_t flags, mode_t mode, mode_t umask,</div><div class='add'>+                                fd_t *fd, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+/* Tell subsequent writes on the fd_t to fsync after every writev fop without</div><div class='add'>+ * requiring a fsync fop.</div><div class='add'>+ */</div><div class='add'>+#define GF_OPEN_FSYNC 0x01</div><div class='add'>+</div><div class='add'>+/* Tell write-behind to disable writing behind despite O_SYNC not being set.</div><div class='add'>+ */</div><div class='add'>+#define GF_OPEN_NOWB 0x02</div><div class='add'>+</div><div class='add'>+typedef int32_t (*fop_open_t)(call_frame_t *frame, xlator_t *this, loc_t *loc,</div><div class='add'>+                              int32_t flags, fd_t *fd, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+typedef int32_t (*fop_readv_t)(call_frame_t *frame, xlator_t *this, fd_t *fd,</div><div class='add'>+                               size_t size, off_t offset, uint32_t flags,</div><div class='add'>+                               dict_t *xdata);</div><div class='add'>+</div><div class='add'>+typedef int32_t (*fop_writev_t)(call_frame_t *frame, xlator_t *this, fd_t *fd,</div><div class='add'>+                                struct iovec *vector, int32_t count,</div><div class='add'>+                                off_t offset, uint32_t flags,</div><div class='add'>+                                struct iobref *iobref, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+typedef int32_t (*fop_flush_t)(call_frame_t *frame, xlator_t *this, fd_t *fd,</div><div class='add'>+                               dict_t *xdata);</div><div class='add'>+</div><div class='add'>+typedef int32_t (*fop_fsync_t)(call_frame_t *frame, xlator_t *this, fd_t *fd,</div><div class='add'>+                               int32_t datasync, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+typedef int32_t (*fop_opendir_t)(call_frame_t *frame, xlator_t *this,</div><div class='add'>+                                 loc_t *loc, fd_t *fd, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+typedef int32_t (*fop_fsyncdir_t)(call_frame_t *frame, xlator_t *this, fd_t *fd,</div><div class='add'>+                                  int32_t datasync, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+typedef int32_t (*fop_statfs_t)(call_frame_t *frame, xlator_t *this, loc_t *loc,</div><div class='add'>+                                dict_t *xdata);</div><div class='add'>+</div><div class='add'>+typedef int32_t (*fop_setxattr_t)(call_frame_t *frame, xlator_t *this,</div><div class='add'>+                                  loc_t *loc, dict_t *dict, int32_t flags,</div><div class='add'>+                                  dict_t *xdata);</div><div class='add'>+</div><div class='add'>+typedef int32_t (*fop_getxattr_t)(call_frame_t *frame, xlator_t *this,</div><div class='add'>+                                  loc_t *loc, const char *name, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+typedef int32_t (*fop_fsetxattr_t)(call_frame_t *frame, xlator_t *this,</div><div class='add'>+                                   fd_t *fd, dict_t *dict, int32_t flags,</div><div class='add'>+                                   dict_t *xdata);</div><div class='add'>+</div><div class='add'>+typedef int32_t (*fop_fgetxattr_t)(call_frame_t *frame, xlator_t *this,</div><div class='add'>+                                   fd_t *fd, const char *name, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+typedef int32_t (*fop_removexattr_t)(call_frame_t *frame, xlator_t *this,</div><div class='add'>+                                     loc_t *loc, const char *name,</div><div class='add'>+                                     dict_t *xdata);</div><div class='add'>+</div><div class='add'>+typedef int32_t (*fop_fremovexattr_t)(call_frame_t *frame, xlator_t *this,</div><div class='add'>+                                      fd_t *fd, const char *name,</div><div class='add'>+                                      dict_t *xdata);</div><div class='add'>+</div><div class='add'>+typedef int32_t (*fop_lk_t)(call_frame_t *frame, xlator_t *this, fd_t *fd,</div><div class='add'>+                            int32_t cmd, struct gf_flock *flock, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+typedef int32_t (*fop_inodelk_t)(call_frame_t *frame, xlator_t *this,</div><div class='add'>+                                 const char *volume, loc_t *loc, int32_t cmd,</div><div class='add'>+                                 struct gf_flock *flock, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+typedef int32_t (*fop_finodelk_t)(call_frame_t *frame, xlator_t *this,</div><div class='add'>+                                  const char *volume, fd_t *fd, int32_t cmd,</div><div class='add'>+                                  struct gf_flock *flock, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+typedef int32_t (*fop_entrylk_t)(call_frame_t *frame, xlator_t *this,</div><div class='add'>+                                 const char *volume, loc_t *loc,</div><div class='add'>+                                 const char *basename, entrylk_cmd cmd,</div><div class='add'>+                                 entrylk_type type, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+typedef int32_t (*fop_fentrylk_t)(call_frame_t *frame, xlator_t *this,</div><div class='add'>+                                  const char *volume, fd_t *fd,</div><div class='add'>+                                  const char *basename, entrylk_cmd cmd,</div><div class='add'>+                                  entrylk_type type, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+typedef int32_t (*fop_readdir_t)(call_frame_t *frame, xlator_t *this, fd_t *fd,</div><div class='add'>+                                 size_t size, off_t offset, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+typedef int32_t (*fop_readdirp_t)(call_frame_t *frame, xlator_t *this, fd_t *fd,</div><div class='add'>+                                  size_t size, off_t offset, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+typedef int32_t (*fop_xattrop_t)(call_frame_t *frame, xlator_t *this,</div><div class='add'>+                                 loc_t *loc, gf_xattrop_flags_t optype,</div><div class='add'>+                                 dict_t *xattr, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+typedef int32_t (*fop_fxattrop_t)(call_frame_t *frame, xlator_t *this, fd_t *fd,</div><div class='add'>+                                  gf_xattrop_flags_t optype, dict_t *xattr,</div><div class='add'>+                                  dict_t *xdata);</div><div class='add'>+</div><div class='add'>+typedef int32_t (*fop_setattr_t)(call_frame_t *frame, xlator_t *this,</div><div class='add'>+                                 loc_t *loc, struct iatt *stbuf, int32_t valid,</div><div class='add'>+                                 dict_t *xdata);</div><div class='add'>+</div><div class='add'>+typedef int32_t (*fop_fsetattr_t)(call_frame_t *frame, xlator_t *this, fd_t *fd,</div><div class='add'>+                                  struct iatt *stbuf, int32_t valid,</div><div class='add'>+                                  dict_t *xdata);</div><div class='add'>+</div><div class='add'>+typedef int32_t (*fop_fallocate_t)(call_frame_t *frame, xlator_t *this,</div><div class='add'>+                                   fd_t *fd, int32_t keep_size, off_t offset,</div><div class='add'>+                                   size_t len, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+typedef int32_t (*fop_discard_t)(call_frame_t *frame, xlator_t *this, fd_t *fd,</div><div class='add'>+                                 off_t offset, size_t len, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+typedef int32_t (*fop_zerofill_t)(call_frame_t *frame, xlator_t *this, fd_t *fd,</div><div class='add'>+                                  off_t offset, off_t len, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+typedef int32_t (*fop_ipc_t)(call_frame_t *frame, xlator_t *this, int32_t op,</div><div class='add'>+                             dict_t *xdata);</div><div class='add'>+</div><div class='add'>+typedef int32_t (*fop_seek_t)(call_frame_t *frame, xlator_t *this, fd_t *fd,</div><div class='add'>+                              off_t offset, gf_seek_what_t what, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+typedef int32_t (*fop_lease_t)(call_frame_t *frame, xlator_t *this, loc_t *loc,</div><div class='add'>+                               struct gf_lease *lease, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+typedef int32_t (*fop_compound_t)(call_frame_t *frame, xlator_t *this,</div><div class='add'>+                                  void *args, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+typedef int32_t (*fop_getactivelk_t)(call_frame_t *frame, xlator_t *this,</div><div class='add'>+                                     loc_t *loc, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+typedef int32_t (*fop_setactivelk_t)(call_frame_t *frame, xlator_t *this,</div><div class='add'>+                                     loc_t *loc,</div><div class='add'>+                                     lock_migration_info_t *locklist,</div><div class='add'>+                                     dict_t *xdata);</div><div class='add'>+</div><div class='add'>+typedef int32_t (*fop_put_t)(call_frame_t *frame, xlator_t *this, loc_t *loc,</div><div class='add'>+                             mode_t mode, mode_t umask, uint32_t flags,</div><div class='add'>+                             struct iovec *vector, int32_t count, off_t offset,</div><div class='add'>+                             struct iobref *iobref, dict_t *xattr,</div><div class='add'>+                             dict_t *xdata);</div><div class='add'>+</div><div class='add'>+typedef int32_t (*fop_icreate_t)(call_frame_t *frame, xlator_t *this,</div><div class='add'>+                                 loc_t *loc, mode_t mode, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+typedef int32_t (*fop_namelink_t)(call_frame_t *frame, xlator_t *this,</div><div class='add'>+                                  loc_t *loc, dict_t *xdata);</div><div class='add'>+typedef int32_t (*fop_copy_file_range_t)(call_frame_t *frame, xlator_t *this,</div><div class='add'>+                                         fd_t *fd_in, off64_t off_in,</div><div class='add'>+                                         fd_t *fd_out, off64_t off_out,</div><div class='add'>+                                         size_t len, uint32_t flags,</div><div class='add'>+                                         dict_t *xdata);</div><div class='add'>+</div><div class='add'>+/* WARNING: make sure the list is in order with FOP definition in</div><div class='add'>+   `rpc/xdr/src/glusterfs-fops.x`.</div><div class='add'>+   If it is not in order, mainly the metrics related feature would be broken */</div><div class='add'>+struct xlator_fops {</div><div class='add'>+    fop_stat_t stat;</div><div class='add'>+    fop_readlink_t readlink;</div><div class='add'>+    fop_mknod_t mknod;</div><div class='add'>+    fop_mkdir_t mkdir;</div><div class='add'>+    fop_unlink_t unlink;</div><div class='add'>+    fop_rmdir_t rmdir;</div><div class='add'>+    fop_symlink_t symlink;</div><div class='add'>+    fop_rename_t rename;</div><div class='add'>+    fop_link_t link;</div><div class='add'>+    fop_truncate_t truncate;</div><div class='add'>+    fop_open_t open;</div><div class='add'>+    fop_readv_t readv;</div><div class='add'>+    fop_writev_t writev;</div><div class='add'>+    fop_statfs_t statfs;</div><div class='add'>+    fop_flush_t flush;</div><div class='add'>+    fop_fsync_t fsync;</div><div class='add'>+    fop_setxattr_t setxattr;</div><div class='add'>+    fop_getxattr_t getxattr;</div><div class='add'>+    fop_removexattr_t removexattr;</div><div class='add'>+    fop_opendir_t opendir;</div><div class='add'>+    fop_fsyncdir_t fsyncdir;</div><div class='add'>+    fop_access_t access;</div><div class='add'>+    fop_create_t create;</div><div class='add'>+    fop_ftruncate_t ftruncate;</div><div class='add'>+    fop_fstat_t fstat;</div><div class='add'>+    fop_lk_t lk;</div><div class='add'>+    fop_lookup_t lookup;</div><div class='add'>+    fop_readdir_t readdir;</div><div class='add'>+    fop_inodelk_t inodelk;</div><div class='add'>+    fop_finodelk_t finodelk;</div><div class='add'>+    fop_entrylk_t entrylk;</div><div class='add'>+    fop_fentrylk_t fentrylk;</div><div class='add'>+    fop_xattrop_t xattrop;</div><div class='add'>+    fop_fxattrop_t fxattrop;</div><div class='add'>+    fop_fgetxattr_t fgetxattr;</div><div class='add'>+    fop_fsetxattr_t fsetxattr;</div><div class='add'>+    fop_rchecksum_t rchecksum;</div><div class='add'>+    fop_setattr_t setattr;</div><div class='add'>+    fop_fsetattr_t fsetattr;</div><div class='add'>+    fop_readdirp_t readdirp;</div><div class='add'>+</div><div class='add'>+    /* These 3 are required to keep the index same as GF_FOP_##FOP */</div><div class='add'>+    void *forget_placeholder;</div><div class='add'>+    void *release_placeholder;</div><div class='add'>+    void *releasedir_placeholder;</div><div class='add'>+</div><div class='add'>+    fop_getspec_t getspec;</div><div class='add'>+    fop_fremovexattr_t fremovexattr;</div><div class='add'>+    fop_fallocate_t fallocate;</div><div class='add'>+    fop_discard_t discard;</div><div class='add'>+    fop_zerofill_t zerofill;</div><div class='add'>+    fop_ipc_t ipc;</div><div class='add'>+    fop_seek_t seek;</div><div class='add'>+    fop_lease_t lease;</div><div class='add'>+    fop_compound_t compound;</div><div class='add'>+    fop_getactivelk_t getactivelk;</div><div class='add'>+    fop_setactivelk_t setactivelk;</div><div class='add'>+    fop_put_t put;</div><div class='add'>+    fop_icreate_t icreate;</div><div class='add'>+    fop_namelink_t namelink;</div><div class='add'>+    fop_copy_file_range_t copy_file_range;</div><div class='add'>+</div><div class='add'>+    /* these entries are used for a typechecking hack in STACK_WIND _only_ */</div><div class='add'>+    /* make sure to add _cbk variables only after defining regular fops as</div><div class='add'>+       its relative position is used to get the index */</div><div class='add'>+    fop_stat_cbk_t stat_cbk;</div><div class='add'>+    fop_readlink_cbk_t readlink_cbk;</div><div class='add'>+    fop_mknod_cbk_t mknod_cbk;</div><div class='add'>+    fop_mkdir_cbk_t mkdir_cbk;</div><div class='add'>+    fop_unlink_cbk_t unlink_cbk;</div><div class='add'>+    fop_rmdir_cbk_t rmdir_cbk;</div><div class='add'>+    fop_symlink_cbk_t symlink_cbk;</div><div class='add'>+    fop_rename_cbk_t rename_cbk;</div><div class='add'>+    fop_link_cbk_t link_cbk;</div><div class='add'>+    fop_truncate_cbk_t truncate_cbk;</div><div class='add'>+    fop_open_cbk_t open_cbk;</div><div class='add'>+    fop_readv_cbk_t readv_cbk;</div><div class='add'>+    fop_writev_cbk_t writev_cbk;</div><div class='add'>+    fop_statfs_cbk_t statfs_cbk;</div><div class='add'>+    fop_flush_cbk_t flush_cbk;</div><div class='add'>+    fop_fsync_cbk_t fsync_cbk;</div><div class='add'>+    fop_setxattr_cbk_t setxattr_cbk;</div><div class='add'>+    fop_getxattr_cbk_t getxattr_cbk;</div><div class='add'>+    fop_removexattr_cbk_t removexattr_cbk;</div><div class='add'>+    fop_opendir_cbk_t opendir_cbk;</div><div class='add'>+    fop_fsyncdir_cbk_t fsyncdir_cbk;</div><div class='add'>+    fop_access_cbk_t access_cbk;</div><div class='add'>+    fop_create_cbk_t create_cbk;</div><div class='add'>+    fop_ftruncate_cbk_t ftruncate_cbk;</div><div class='add'>+    fop_fstat_cbk_t fstat_cbk;</div><div class='add'>+    fop_lk_cbk_t lk_cbk;</div><div class='add'>+    fop_lookup_cbk_t lookup_cbk;</div><div class='add'>+    fop_readdir_cbk_t readdir_cbk;</div><div class='add'>+    fop_inodelk_cbk_t inodelk_cbk;</div><div class='add'>+    fop_finodelk_cbk_t finodelk_cbk;</div><div class='add'>+    fop_entrylk_cbk_t entrylk_cbk;</div><div class='add'>+    fop_fentrylk_cbk_t fentrylk_cbk;</div><div class='add'>+    fop_xattrop_cbk_t xattrop_cbk;</div><div class='add'>+    fop_fxattrop_cbk_t fxattrop_cbk;</div><div class='add'>+    fop_fgetxattr_cbk_t fgetxattr_cbk;</div><div class='add'>+    fop_fsetxattr_cbk_t fsetxattr_cbk;</div><div class='add'>+    fop_rchecksum_cbk_t rchecksum_cbk;</div><div class='add'>+    fop_setattr_cbk_t setattr_cbk;</div><div class='add'>+    fop_fsetattr_cbk_t fsetattr_cbk;</div><div class='add'>+    fop_readdirp_cbk_t readdirp_cbk;</div><div class='add'>+</div><div class='add'>+    /* These 3 are required to keep the index same as GF_FOP_##FOP */</div><div class='add'>+    void *forget_placeholder_cbk;</div><div class='add'>+    void *release_placeholder_cbk;</div><div class='add'>+    void *releasedir_placeholder_cbk;</div><div class='add'>+</div><div class='add'>+    fop_getspec_cbk_t getspec_cbk;</div><div class='add'>+    fop_fremovexattr_cbk_t fremovexattr_cbk;</div><div class='add'>+    fop_fallocate_cbk_t fallocate_cbk;</div><div class='add'>+    fop_discard_cbk_t discard_cbk;</div><div class='add'>+    fop_zerofill_cbk_t zerofill_cbk;</div><div class='add'>+    fop_ipc_cbk_t ipc_cbk;</div><div class='add'>+    fop_seek_cbk_t seek_cbk;</div><div class='add'>+    fop_lease_cbk_t lease_cbk;</div><div class='add'>+    fop_compound_cbk_t compound_cbk;</div><div class='add'>+    fop_getactivelk_cbk_t getactivelk_cbk;</div><div class='add'>+    fop_setactivelk_cbk_t setactivelk_cbk;</div><div class='add'>+    fop_put_cbk_t put_cbk;</div><div class='add'>+    fop_icreate_cbk_t icreate_cbk;</div><div class='add'>+    fop_namelink_cbk_t namelink_cbk;</div><div class='add'>+    fop_copy_file_range_cbk_t copy_file_range_cbk;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+typedef int32_t (*cbk_forget_t)(xlator_t *this, inode_t *inode);</div><div class='add'>+</div><div class='add'>+typedef int32_t (*cbk_release_t)(xlator_t *this, fd_t *fd);</div><div class='add'>+</div><div class='add'>+typedef int32_t (*cbk_invalidate_t)(xlator_t *this, inode_t *inode);</div><div class='add'>+</div><div class='add'>+typedef int32_t (*cbk_client_t)(xlator_t *this, client_t *client);</div><div class='add'>+</div><div class='add'>+typedef void (*cbk_ictxmerge_t)(xlator_t *this, fd_t *fd, inode_t *inode,</div><div class='add'>+                                inode_t *linked_inode);</div><div class='add'>+</div><div class='add'>+typedef size_t (*cbk_inodectx_size_t)(xlator_t *this, inode_t *inode);</div><div class='add'>+</div><div class='add'>+typedef size_t (*cbk_fdctx_size_t)(xlator_t *this, fd_t *fd);</div><div class='add'>+</div><div class='add'>+typedef void (*cbk_fdclose_t)(xlator_t *this, fd_t *fd);</div><div class='add'>+</div><div class='add'>+struct xlator_cbks {</div><div class='add'>+    cbk_forget_t forget;</div><div class='add'>+    cbk_release_t release;</div><div class='add'>+    cbk_release_t releasedir;</div><div class='add'>+    cbk_invalidate_t invalidate;</div><div class='add'>+    cbk_client_t client_destroy;</div><div class='add'>+    cbk_client_t client_disconnect;</div><div class='add'>+    cbk_ictxmerge_t ictxmerge;</div><div class='add'>+    cbk_inodectx_size_t ictxsize;</div><div class='add'>+    cbk_fdctx_size_t fdctxsize;</div><div class='add'>+    cbk_fdclose_t fdclose;</div><div class='add'>+    cbk_fdclose_t fdclosedir;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+typedef int32_t (*dumpop_priv_t)(xlator_t *this);</div><div class='add'>+</div><div class='add'>+typedef int32_t (*dumpop_inode_t)(xlator_t *this);</div><div class='add'>+</div><div class='add'>+typedef int32_t (*dumpop_fd_t)(xlator_t *this);</div><div class='add'>+</div><div class='add'>+typedef int32_t (*dumpop_inodectx_t)(xlator_t *this, inode_t *ino);</div><div class='add'>+</div><div class='add'>+typedef int32_t (*dumpop_fdctx_t)(xlator_t *this, fd_t *fd);</div><div class='add'>+</div><div class='add'>+typedef int32_t (*dumpop_priv_to_dict_t)(xlator_t *this, dict_t *dict,</div><div class='add'>+                                         char *brickname);</div><div class='add'>+</div><div class='add'>+typedef int32_t (*dumpop_inode_to_dict_t)(xlator_t *this, dict_t *dict);</div><div class='add'>+</div><div class='add'>+typedef int32_t (*dumpop_fd_to_dict_t)(xlator_t *this, dict_t *dict);</div><div class='add'>+</div><div class='add'>+typedef int32_t (*dumpop_inodectx_to_dict_t)(xlator_t *this, inode_t *ino,</div><div class='add'>+                                             dict_t *dict);</div><div class='add'>+</div><div class='add'>+typedef int32_t (*dumpop_fdctx_to_dict_t)(xlator_t *this, fd_t *fd,</div><div class='add'>+                                          dict_t *dict);</div><div class='add'>+</div><div class='add'>+typedef int32_t (*dumpop_eh_t)(xlator_t *this);</div><div class='add'>+</div><div class='add'>+struct xlator_dumpops {</div><div class='add'>+    dumpop_priv_t priv;</div><div class='add'>+    dumpop_inode_t inode;</div><div class='add'>+    dumpop_fd_t fd;</div><div class='add'>+    dumpop_inodectx_t inodectx;</div><div class='add'>+    dumpop_fdctx_t fdctx;</div><div class='add'>+    dumpop_priv_to_dict_t priv_to_dict;</div><div class='add'>+    dumpop_inode_to_dict_t inode_to_dict;</div><div class='add'>+    dumpop_fd_to_dict_t fd_to_dict;</div><div class='add'>+    dumpop_inodectx_to_dict_t inodectx_to_dict;</div><div class='add'>+    dumpop_fdctx_to_dict_t fdctx_to_dict;</div><div class='add'>+    dumpop_eh_t history;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+typedef struct xlator_list {</div><div class='add'>+    xlator_t *xlator;</div><div class='add'>+    struct xlator_list *next;</div><div class='add'>+} xlator_list_t;</div><div class='add'>+</div><div class='add'>+typedef struct fop_metrics {</div><div class='add'>+    gf_atomic_t fop;</div><div class='add'>+    gf_atomic_t cbk; /* only updaed when there is failure */</div><div class='add'>+} fop_metrics_t;</div><div class='add'>+</div><div class='add'>+struct _xlator {</div><div class='add'>+    /* Built during parsing */</div><div class='add'>+    char *name;</div><div class='add'>+    char *type;</div><div class='add'>+    char *instance_name; /* Used for multi NFSd */</div><div class='add'>+    xlator_t *next;</div><div class='add'>+    xlator_t *prev;</div><div class='add'>+    xlator_list_t *parents;</div><div class='add'>+    xlator_list_t *children;</div><div class='add'>+    dict_t *options;</div><div class='add'>+</div><div class='add'>+    /* Set after doing dlopen() */</div><div class='add'>+    void *dlhandle;</div><div class='add'>+    struct xlator_fops *fops;</div><div class='add'>+    struct xlator_cbks *cbks;</div><div class='add'>+    struct xlator_dumpops *dumpops;</div><div class='add'>+    struct list_head volume_options; /* list of volume_option_t */</div><div class='add'>+</div><div class='add'>+    void (*fini)(xlator_t *this);</div><div class='add'>+    int32_t (*init)(xlator_t *this);</div><div class='add'>+    int32_t (*reconfigure)(xlator_t *this, dict_t *options);</div><div class='add'>+    int32_t (*mem_acct_init)(xlator_t *this);</div><div class='add'>+    int32_t (*dump_metrics)(xlator_t *this, int fd);</div><div class='add'>+</div><div class='add'>+    event_notify_fn_t notify;</div><div class='add'>+</div><div class='add'>+    gf_loglevel_t loglevel; /* Log level for translator */</div><div class='add'>+</div><div class='add'>+    struct {</div><div class='add'>+        struct {</div><div class='add'>+            /* for latency measurement */</div><div class='add'>+            fop_metrics_t metrics[GF_FOP_MAXVALUE];</div><div class='add'>+</div><div class='add'>+            gf_atomic_t count;</div><div class='add'>+        } total;</div><div class='add'>+</div><div class='add'>+        struct {</div><div class='add'>+            /* for latency measurement */</div><div class='add'>+            gf_latency_t latencies[GF_FOP_MAXVALUE];</div><div class='add'>+            /* for latency measurement */</div><div class='add'>+            fop_metrics_t metrics[GF_FOP_MAXVALUE];</div><div class='add'>+</div><div class='add'>+            gf_atomic_t count;</div><div class='add'>+        } interval;</div><div class='add'>+    } stats;</div><div class='add'>+</div><div class='add'>+    /* Misc */</div><div class='add'>+    eh_t *history; /* event history context */</div><div class='add'>+    glusterfs_ctx_t *ctx;</div><div class='add'>+    glusterfs_graph_t *graph; /* not set for fuse */</div><div class='add'>+    inode_table_t *itable;</div><div class='add'>+    char init_succeeded;</div><div class='add'>+    void *private;</div><div class='add'>+    struct mem_acct *mem_acct;</div><div class='add'>+    uint64_t winds;</div><div class='add'>+    char switched;</div><div class='add'>+</div><div class='add'>+    /* for the memory pool of 'frame-&gt;local' */</div><div class='add'>+    struct mem_pool *local_pool;</div><div class='add'>+    gf_boolean_t is_autoloaded;</div><div class='add'>+</div><div class='add'>+    /* Saved volfile ID (used for multiplexing) */</div><div class='add'>+    char *volfile_id;</div><div class='add'>+</div><div class='add'>+    /* Its used as an index to inode_ctx*/</div><div class='add'>+    uint32_t xl_id;</div><div class='add'>+</div><div class='add'>+    /* op_version: initialized in xlator code itself */</div><div class='add'>+    uint32_t op_version[GF_MAX_RELEASES];</div><div class='add'>+</div><div class='add'>+    /* flags: initialized in xlator code itself */</div><div class='add'>+    uint32_t flags;</div><div class='add'>+</div><div class='add'>+    /* id: unique, initialized in xlator code itself */</div><div class='add'>+    uint32_t id;</div><div class='add'>+</div><div class='add'>+    /* identifier: a full string which can unique identify the xlator */</div><div class='add'>+    char *identifier;</div><div class='add'>+</div><div class='add'>+    /* Is this pass_through? */</div><div class='add'>+    gf_boolean_t pass_through;</div><div class='add'>+    struct xlator_fops *pass_through_fops;</div><div class='add'>+</div><div class='add'>+    /* cleanup flag to avoid races during xlator cleanup */</div><div class='add'>+    uint32_t cleanup_starting;</div><div class='add'>+</div><div class='add'>+    /* flag to avoid recall of xlator_mem_cleanup for xame xlator */</div><div class='add'>+    uint32_t call_cleanup;</div><div class='add'>+</div><div class='add'>+    /* Flag to understand how this xlator is categorized */</div><div class='add'>+    gf_category_t category;</div><div class='add'>+</div><div class='add'>+    /* Variable to save xprt associated for detach brick */</div><div class='add'>+    gf_atomic_t xprtrefcnt;</div><div class='add'>+</div><div class='add'>+    /* Flag to notify got CHILD_DOWN event for detach brick */</div><div class='add'>+    uint32_t notify_down;</div><div class='add'>+</div><div class='add'>+    /* Flag to avoid throw duplicate PARENT_DOWN event */</div><div class='add'>+    uint32_t parent_down;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+/* This would be the only structure which needs to be exported by</div><div class='add'>+   the translators. For the backward compatibility, in 4.x series</div><div class='add'>+   even the old exported fields will be supported */</div><div class='add'>+/* XXX: This struct is in use by GD2, and hence SHOULD NOT be modified.</div><div class='add'>+ * If the struct must be modified, see instructions at the comment with</div><div class='add'>+ * GD2MARKER below.</div><div class='add'>+ */</div><div class='add'>+typedef struct {</div><div class='add'>+    /* op_version: will be used by volume generation logic to figure</div><div class='add'>+       out whether to insert it in graph or no, based on cluster's</div><div class='add'>+       operating version.</div><div class='add'>+       default value: 0, which means good to insert always */</div><div class='add'>+    uint32_t op_version[GF_MAX_RELEASES];</div><div class='add'>+</div><div class='add'>+    /* flags: will be used by volume generation logic to optimize the</div><div class='add'>+       placements etc.</div><div class='add'>+       default value: 0, which means don't treat it specially */</div><div class='add'>+    uint32_t flags;</div><div class='add'>+</div><div class='add'>+    /* xlator_id: unique per xlator. make sure to have no collission</div><div class='add'>+       in this ID */</div><div class='add'>+    uint32_t xlator_id;</div><div class='add'>+</div><div class='add'>+    /* identifier: a string constant */</div><div class='add'>+    char *identifier;</div><div class='add'>+</div><div class='add'>+    /* struct options: if the translator takes any 'options' from the</div><div class='add'>+       volume file, then that should be defined here. optional. */</div><div class='add'>+    volume_option_t *options;</div><div class='add'>+</div><div class='add'>+    /* Flag to understand how this xlator is categorized */</div><div class='add'>+    gf_category_t category;</div><div class='add'>+</div><div class='add'>+    /* XXX: GD2MARKER</div><div class='add'>+     * If a new member that needs to be visible to GD2 is introduced,</div><div class='add'>+     * add it above this comment.</div><div class='add'>+     * Any other new members need to be added below this comment, or at the</div><div class='add'>+     * end of the struct</div><div class='add'>+     */</div><div class='add'>+</div><div class='add'>+    /* init(): mandatory method, will be called during the</div><div class='add'>+       graph initialization */</div><div class='add'>+    int32_t (*init)(xlator_t *this);</div><div class='add'>+</div><div class='add'>+    /* fini(): optional method, will be initialized to default</div><div class='add'>+       method which would just free the 'xlator-&gt;private' variable.</div><div class='add'>+       This method is called when the graph is no more in use, and</div><div class='add'>+       is being destroyed. Also when SIGTERM is received */</div><div class='add'>+    void (*fini)(xlator_t *this);</div><div class='add'>+</div><div class='add'>+    /* reconfigure(): optional method, will be initialized to default</div><div class='add'>+       method in case not provided by xlator. This method is called</div><div class='add'>+       when there are only option changes in xlator, and no graph change.</div><div class='add'>+       eg., a 'gluster volume set' command */</div><div class='add'>+    int32_t (*reconfigure)(xlator_t *this, dict_t *options);</div><div class='add'>+</div><div class='add'>+    /* mem_acct_init(): used for memory accounting inside of the xlator.</div><div class='add'>+       optional. called during translator initialization */</div><div class='add'>+    int32_t (*mem_acct_init)(xlator_t *this);</div><div class='add'>+</div><div class='add'>+    /* dump_metrics(): used for providing internal metrics. optional */</div><div class='add'>+    int32_t (*dump_metrics)(xlator_t *this, int fd);</div><div class='add'>+</div><div class='add'>+    /* notify(): used for handling the notification of events from either</div><div class='add'>+       the parent or child in the graph. optional. */</div><div class='add'>+    event_notify_fn_t notify;</div><div class='add'>+</div><div class='add'>+    /* struct fops: mandatory. provides all the filesystem operations</div><div class='add'>+       methods of the xlator */</div><div class='add'>+    struct xlator_fops *fops;</div><div class='add'>+    /* struct cbks: optional. provides methods to handle</div><div class='add'>+       inode forgets, and fd releases */</div><div class='add'>+    struct xlator_cbks *cbks;</div><div class='add'>+</div><div class='add'>+    /* dumpops: a structure again, with methods to dump the details.</div><div class='add'>+       optional. */</div><div class='add'>+    struct xlator_dumpops *dumpops;</div><div class='add'>+</div><div class='add'>+    /* struct pass_through_fops: optional. provides all the filesystem</div><div class='add'>+       operations which should be used if the xlator is marked as pass_through</div><div class='add'>+     */</div><div class='add'>+    /* by default, the default_fops would be used */</div><div class='add'>+    struct xlator_fops *pass_through_fops;</div><div class='add'>+} xlator_api_t;</div><div class='add'>+</div><div class='add'>+#define xlator_has_parent(xl) (xl-&gt;parents != NULL)</div><div class='add'>+</div><div class='add'>+#define XLATOR_NOTIFY(ret, _xl, params...)                                     \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        xlator_t *_old_THIS = NULL;                                            \</div><div class='add'>+                                                                               \</div><div class='add'>+        _old_THIS = THIS;                                                      \</div><div class='add'>+        THIS = _xl;                                                            \</div><div class='add'>+                                                                               \</div><div class='add'>+        ret = _xl-&gt;notify(_xl, params);                                        \</div><div class='add'>+                                                                               \</div><div class='add'>+        THIS = _old_THIS;                                                      \</div><div class='add'>+    } while (0);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+xlator_set_type_virtual(xlator_t *xl, const char *type);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+xlator_set_type(xlator_t *xl, const char *type);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+xlator_dynload(xlator_t *xl);</div><div class='add'>+</div><div class='add'>+xlator_t *</div><div class='add'>+file_to_xlator_tree(glusterfs_ctx_t *ctx, FILE *fp);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+xlator_notify(xlator_t *this, int32_t event, void *data, ...);</div><div class='add'>+int</div><div class='add'>+xlator_init(xlator_t *this);</div><div class='add'>+int</div><div class='add'>+xlator_destroy(xlator_t *xl);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+xlator_tree_init(xlator_t *xl);</div><div class='add'>+int32_t</div><div class='add'>+xlator_tree_free_members(xlator_t *xl);</div><div class='add'>+int32_t</div><div class='add'>+xlator_tree_free_memacct(xlator_t *xl);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+xlator_tree_fini(xlator_t *xl);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+xlator_foreach(xlator_t *this, void (*fn)(xlator_t *each, void *data),</div><div class='add'>+               void *data);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+xlator_foreach_depth_first(xlator_t *this,</div><div class='add'>+                           void (*fn)(xlator_t *each, void *data), void *data);</div><div class='add'>+</div><div class='add'>+xlator_t *</div><div class='add'>+xlator_search_by_name(xlator_t *any, const char *name);</div><div class='add'>+xlator_t *</div><div class='add'>+get_xlator_by_name(xlator_t *this, char *target);</div><div class='add'>+xlator_t *</div><div class='add'>+get_xlator_by_type(xlator_t *this, char *target);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+xlator_set_inode_lru_limit(xlator_t *this, void *data);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+inode_destroy_notify(inode_t *inode, const char *xlname);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+loc_copy(loc_t *dst, loc_t *src);</div><div class='add'>+int</div><div class='add'>+loc_copy_overload_parent(loc_t *dst, loc_t *src, inode_t *parent);</div><div class='add'>+#define loc_dup(src, dst) loc_copy(dst, src)</div><div class='add'>+void</div><div class='add'>+loc_wipe(loc_t *loc);</div><div class='add'>+int</div><div class='add'>+loc_path(loc_t *loc, const char *bname);</div><div class='add'>+void</div><div class='add'>+loc_gfid(loc_t *loc, uuid_t gfid);</div><div class='add'>+void</div><div class='add'>+loc_pargfid(loc_t *loc, uuid_t pargfid);</div><div class='add'>+char *</div><div class='add'>+loc_gfid_utoa(loc_t *loc);</div><div class='add'>+gf_boolean_t</div><div class='add'>+loc_is_root(loc_t *loc);</div><div class='add'>+int32_t</div><div class='add'>+loc_build_child(loc_t *child, loc_t *parent, char *name);</div><div class='add'>+gf_boolean_t</div><div class='add'>+loc_is_nameless(loc_t *loc);</div><div class='add'>+int</div><div class='add'>+xlator_mem_acct_init(xlator_t *xl, int num_types);</div><div class='add'>+void</div><div class='add'>+xlator_mem_acct_unref(struct mem_acct *mem_acct);</div><div class='add'>+int</div><div class='add'>+is_gf_log_command(xlator_t *trans, const char *name, char *value, size_t size);</div><div class='add'>+int</div><div class='add'>+glusterd_check_log_level(const char *value);</div><div class='add'>+int</div><div class='add'>+xlator_volopt_dynload(char *xlator_type, void **dl_handle,</div><div class='add'>+                      volume_opt_list_t *vol_opt_handle);</div><div class='add'>+enum gf_hdsk_event_notify_op {</div><div class='add'>+    GF_EN_DEFRAG_STATUS,</div><div class='add'>+    GF_EN_MAX,</div><div class='add'>+};</div><div class='add'>+gf_boolean_t</div><div class='add'>+is_graph_topology_equal(glusterfs_graph_t *graph1, glusterfs_graph_t *graph2);</div><div class='add'>+int</div><div class='add'>+glusterfs_volfile_reconfigure(FILE *newvolfile_fp, glusterfs_ctx_t *ctx);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+gf_volfile_reconfigure(int oldvollen, FILE *newvolfile_fp, glusterfs_ctx_t *ctx,</div><div class='add'>+                       const char *oldvolfile);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+loc_touchup(loc_t *loc, const char *name);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+glusterfs_leaf_position(xlator_t *tgt);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+glusterfs_reachable_leaves(xlator_t *base, dict_t *leaves);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+xlator_subvolume_count(xlator_t *this);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+xlator_init_lock(void);</div><div class='add'>+void</div><div class='add'>+xlator_init_unlock(void);</div><div class='add'>+int</div><div class='add'>+copy_opts_to_child(xlator_t *src, xlator_t *dst, char *glob);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+glusterfs_delete_volfile_checksum(glusterfs_ctx_t *ctx, const char *volfile_id);</div><div class='add'>+int</div><div class='add'>+xlator_memrec_free(xlator_t *xl);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+xlator_mem_cleanup(xlator_t *this);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+handle_default_options(xlator_t *xl, dict_t *options);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+gluster_graph_take_reference(xlator_t *tree);</div><div class='add'>+</div><div class='add'>+gf_boolean_t</div><div class='add'>+mgmt_is_multiplexed_daemon(char *name);</div><div class='add'>+</div><div class='add'>+gf_boolean_t</div><div class='add'>+xlator_is_cleanup_starting(xlator_t *this);</div><div class='add'>+int</div><div class='add'>+graph_total_client_xlator(glusterfs_graph_t *graph);</div><div class='add'>+#endif /* _XLATOR_H */</div><div class='head'>diff --git a/libglusterfs/src/graph-print.c b/libglusterfs/src/graph-print.c<br/>new file mode 100644<br/>index 00000000000..595d74330a1<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/libglusterfs/src/graph-print.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>libglusterfs/src/graph-print.c</a></div><div class='hunk'>@@ -0,0 +1,135 @@</div><div class='add'>+/*</div><div class='add'>+  Copyright (c) 2008-2012 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#include &lt;sys/uio.h&gt;</div><div class='add'>+</div><div class='add'>+#include "glusterfs/common-utils.h"</div><div class='add'>+#include "glusterfs/xlator.h"</div><div class='add'>+#include "glusterfs/graph-utils.h"</div><div class='add'>+#include "glusterfs/libglusterfs-messages.h"</div><div class='add'>+</div><div class='add'>+struct gf_printer {</div><div class='add'>+    ssize_t (*write)(struct gf_printer *gp, char *buf, size_t len);</div><div class='add'>+    void *priv;</div><div class='add'>+    int len;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+static ssize_t</div><div class='add'>+gp_write_file(struct gf_printer *gp, char *buf, size_t len)</div><div class='add'>+{</div><div class='add'>+    FILE *f = gp-&gt;priv;</div><div class='add'>+</div><div class='add'>+    if (fwrite(buf, len, 1, f) != 1) {</div><div class='add'>+        gf_msg("graph-print", GF_LOG_ERROR, errno, LG_MSG_FWRITE_FAILED,</div><div class='add'>+               "fwrite failed");</div><div class='add'>+</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return len;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+gpprintf(struct gf_printer *gp, const char *format, ...)</div><div class='add'>+{</div><div class='add'>+    va_list arg;</div><div class='add'>+    char *str = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    va_start(arg, format);</div><div class='add'>+    ret = gf_vasprintf(&amp;str, format, arg);</div><div class='add'>+    va_end(arg);</div><div class='add'>+</div><div class='add'>+    if (ret &lt; 0)</div><div class='add'>+        return ret;</div><div class='add'>+</div><div class='add'>+    ret = gp-&gt;write(gp, str, ret);</div><div class='add'>+</div><div class='add'>+    GF_FREE(str);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#define GPPRINTF(gp, fmt, ...)                                                 \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        ret = gpprintf(gp, fmt, ##__VA_ARGS__);                                \</div><div class='add'>+        if (ret == -1)                                                         \</div><div class='add'>+            goto out;                                                          \</div><div class='add'>+        else                                                                   \</div><div class='add'>+            gp-&gt;len += ret;                                                    \</div><div class='add'>+    } while (0)</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+_print_volume_options(dict_t *d, char *k, data_t *v, void *tmp)</div><div class='add'>+{</div><div class='add'>+    struct gf_printer *gp = tmp;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    GPPRINTF(gp, "    option %s %s\n", k, v-&gt;data);</div><div class='add'>+    return 0;</div><div class='add'>+out:</div><div class='add'>+    /* means, it is a failure */</div><div class='add'>+    return -1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+glusterfs_graph_print(struct gf_printer *gp, glusterfs_graph_t *graph)</div><div class='add'>+{</div><div class='add'>+    xlator_t *trav = NULL;</div><div class='add'>+    xlator_list_t *xch = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    ssize_t len = 0;</div><div class='add'>+</div><div class='add'>+    if (!graph-&gt;first)</div><div class='add'>+        return 0;</div><div class='add'>+</div><div class='add'>+    for (trav = graph-&gt;first; trav-&gt;next; trav = trav-&gt;next)</div><div class='add'>+        ;</div><div class='add'>+    for (; trav; trav = trav-&gt;prev) {</div><div class='add'>+        GPPRINTF(gp, "volume %s\n    type %s\n", trav-&gt;name, trav-&gt;type);</div><div class='add'>+</div><div class='add'>+        ret = dict_foreach(trav-&gt;options, _print_volume_options, gp);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+</div><div class='add'>+        if (trav-&gt;children) {</div><div class='add'>+            GPPRINTF(gp, "    subvolumes");</div><div class='add'>+</div><div class='add'>+            for (xch = trav-&gt;children; xch; xch = xch-&gt;next)</div><div class='add'>+                GPPRINTF(gp, " %s", xch-&gt;xlator-&gt;name);</div><div class='add'>+</div><div class='add'>+            GPPRINTF(gp, "\n");</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        GPPRINTF(gp, "end-volume\n");</div><div class='add'>+        if (trav != graph-&gt;first)</div><div class='add'>+            GPPRINTF(gp, "\n");</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    len = gp-&gt;len;</div><div class='add'>+    if (ret == -1) {</div><div class='add'>+        gf_msg("graph-print", GF_LOG_ERROR, 0, LG_MSG_PRINT_FAILED,</div><div class='add'>+               "printing failed");</div><div class='add'>+</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return len;</div><div class='add'>+</div><div class='add'>+#undef GPPRINTF</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+glusterfs_graph_print_file(FILE *file, glusterfs_graph_t *graph)</div><div class='add'>+{</div><div class='add'>+    struct gf_printer gp = {.write = gp_write_file, .priv = file};</div><div class='add'>+</div><div class='add'>+    return glusterfs_graph_print(&amp;gp, graph);</div><div class='add'>+}</div><div class='head'>diff --git a/libglusterfs/src/graph.c b/libglusterfs/src/graph.c<br/>index 4adb04a39c3..13f298eb3bd 100644<br/>--- a/<a href='/cgit/glusterfs.git/tree/libglusterfs/src/graph.c?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/graph.c</a><br/>+++ b/<a href='/cgit/glusterfs.git/tree/libglusterfs/src/graph.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>libglusterfs/src/graph.c</a></div><div class='hunk'>@@ -1,35 +1,39 @@</div><div class='ctx'> /*</div><div class='del'>-  Copyright (c) 2010 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='add'>+  Copyright (c) 2008-2012 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='ctx'>   This file is part of GlusterFS.</div><div class='ctx'> </div><div class='del'>-  GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-  it under the terms of the GNU General Public License as published</div><div class='del'>-  by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-  or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-  GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-  WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-  General Public License for more details.</div><div class='del'>-</div><div class='del'>-  You should have received a copy of the GNU General Public License</div><div class='del'>-  along with this program.  If not, see</div><div class='del'>-  &lt;http://www.gnu.org/licenses/&gt;.</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='ctx'> */</div><div class='ctx'> </div><div class='del'>-#ifndef _CONFIG_H</div><div class='del'>-#define _CONFIG_H</div><div class='del'>-#include "config.h"</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-#include "xlator.h"</div><div class='del'>-#include &lt;dlfcn.h&gt;</div><div class='del'>-#include &lt;netdb.h&gt;</div><div class='del'>-#include &lt;fnmatch.h&gt;</div><div class='del'>-#include "defaults.h"</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-</div><div class='add'>+#include &lt;stdint.h&gt;                  // for uint32_t</div><div class='add'>+#include &lt;sys/time.h&gt;                // for timeval</div><div class='add'>+#include &lt;errno.h&gt;                   // for EIO, errno, EINVAL, ENOMEM</div><div class='add'>+#include &lt;fnmatch.h&gt;                 // for fnmatch, FNM_NOESCAPE</div><div class='add'>+#include &lt;openssl/sha.h&gt;             // for SHA256_DIGEST_LENGTH</div><div class='add'>+#include &lt;regex.h&gt;                   // for regmatch_t, regcomp</div><div class='add'>+#include &lt;stdio.h&gt;                   // for fclose, fopen, snprintf</div><div class='add'>+#include &lt;stdlib.h&gt;                  // for NULL, atoi, mkstemp</div><div class='add'>+#include &lt;string.h&gt;                  // for strcmp, strerror, memcpy</div><div class='add'>+#include &lt;strings.h&gt;                 // for rindex</div><div class='add'>+#include &lt;sys/stat.h&gt;                // for stat</div><div class='add'>+#include &lt;sys/time.h&gt;                // for gettimeofday</div><div class='add'>+#include &lt;unistd.h&gt;                  // for gethostname, getpid</div><div class='add'>+#include "glusterfs/common-utils.h"  // for gf_strncpy, gf_time_fmt</div><div class='add'>+#include "glusterfs/defaults.h"</div><div class='add'>+#include "glusterfs/dict.h"                   // for dict_foreach, dict_set_...</div><div class='add'>+#include "glusterfs/globals.h"                // for xlator_t, xlator_list_t</div><div class='add'>+#include "glusterfs/glusterfs.h"              // for glusterfs_graph_t, glus...</div><div class='add'>+#include "glusterfs/glusterfs-fops.h"         // for GF_EVENT_GRAPH_NEW, GF_...</div><div class='add'>+#include "glusterfs/libglusterfs-messages.h"  // for LG_MSG_GRAPH_ERROR, LG_...</div><div class='add'>+#include "glusterfs/list.h"                   // for list_add, list_del_init</div><div class='add'>+#include "glusterfs/logging.h"                // for gf_msg, GF_LOG_ERROR</div><div class='add'>+#include "glusterfs/mem-pool.h"               // for GF_FREE, gf_strdup, GF_...</div><div class='add'>+#include "glusterfs/mem-types.h"              // for gf_common_mt_xlator_list_t</div><div class='add'>+#include "glusterfs/options.h"                // for xlator_tree_reconfigure</div><div class='add'>+#include "glusterfs/syscall.h"                // for sys_close, sys_stat</div><div class='ctx'> </div><div class='ctx'> #if 0</div><div class='ctx'> static void</div><div class='hunk'>@@ -37,20 +41,17 @@ _gf_dump_details (int argc, char **argv)</div><div class='ctx'> {</div><div class='ctx'>         extern FILE *gf_log_logfile;</div><div class='ctx'>         int          i = 0;</div><div class='del'>-        char         timestr[256];</div><div class='add'>+        char         timestr[GF_TIMESTR_SIZE];</div><div class='ctx'>         time_t       utime = 0;</div><div class='del'>-        struct tm   *tm = NULL;</div><div class='ctx'>         pid_t        mypid = 0;</div><div class='ctx'>         struct utsname uname_buf = {{0, }, };</div><div class='ctx'>         int            uname_ret = -1;</div><div class='ctx'> </div><div class='del'>-        utime = time (NULL);</div><div class='del'>-        tm    = localtime (&amp;utime);</div><div class='ctx'>         mypid = getpid ();</div><div class='ctx'>         uname_ret   = uname (&amp;uname_buf);</div><div class='ctx'> </div><div class='del'>-        /* Which git? What time? */</div><div class='del'>-        strftime (timestr, 256, "%Y-%m-%d %H:%M:%S", tm);</div><div class='add'>+        utime = time (NULL);</div><div class='add'>+        gf_time_fmt (timestr, sizeof timestr, utime, gf_timefmt_FT);</div><div class='ctx'>         fprintf (gf_log_logfile,</div><div class='ctx'>                  "========================================"</div><div class='ctx'>                  "========================================\n");</div><div class='hunk'>@@ -83,423 +84,1797 @@ _gf_dump_details (int argc, char **argv)</div><div class='ctx'> }</div><div class='ctx'> #endif</div><div class='ctx'> </div><div class='del'>-</div><div class='del'>-static int</div><div class='del'>-_log_if_option_is_invalid (xlator_t *xl, data_pair_t *pair)</div><div class='del'>-{</div><div class='del'>-        volume_opt_list_t *vol_opt = NULL;</div><div class='del'>-        volume_option_t   *opt     = NULL;</div><div class='del'>-        int                i     = 0;</div><div class='del'>-        int                index = 0;</div><div class='del'>-        int                found = 0;</div><div class='del'>-</div><div class='del'>-        /* Get the first volume_option */</div><div class='del'>-        list_for_each_entry (vol_opt, &amp;xl-&gt;volume_options, list) {</div><div class='del'>-                /* Warn for extra option */</div><div class='del'>-                if (!vol_opt-&gt;given_opt)</div><div class='del'>-                        break;</div><div class='del'>-</div><div class='del'>-                opt = vol_opt-&gt;given_opt;</div><div class='del'>-                for (index = 0;</div><div class='del'>-                     ((index &lt; ZR_OPTION_MAX_ARRAY_SIZE) &amp;&amp;</div><div class='del'>-                      (opt[index].key &amp;&amp; opt[index].key[0]));  index++)</div><div class='del'>-                        for (i = 0; (i &lt; ZR_VOLUME_MAX_NUM_KEY) &amp;&amp;</div><div class='del'>-                                     opt[index].key[i]; i++) {</div><div class='del'>-                                if (fnmatch (opt[index].key[i],</div><div class='del'>-                                             pair-&gt;key,</div><div class='del'>-                                             FNM_NOESCAPE) == 0) {</div><div class='del'>-                                        found = 1;</div><div class='del'>-                                        break;</div><div class='del'>-                                }</div><div class='del'>-                        }</div><div class='add'>+int</div><div class='add'>+glusterfs_read_secure_access_file(void)</div><div class='add'>+{</div><div class='add'>+    FILE *fp = NULL;</div><div class='add'>+    char line[100] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int cert_depth = 1; /* Default SSL CERT DEPTH */</div><div class='add'>+    regex_t regcmpl;</div><div class='add'>+    char *key = {"^option transport.socket.ssl-cert-depth"};</div><div class='add'>+    char keyval[50] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int start = 0, end = 0, copy_len = 0;</div><div class='add'>+    regmatch_t result[1] = {{0}};</div><div class='add'>+</div><div class='add'>+    fp = fopen(SECURE_ACCESS_FILE, "r");</div><div class='add'>+    if (!fp)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    /* Check if any line matches with key */</div><div class='add'>+    while (fgets(line, sizeof(line), fp) != NULL) {</div><div class='add'>+        if (regcomp(&amp;regcmpl, key, REG_EXTENDED)) {</div><div class='add'>+            goto out;</div><div class='ctx'>         }</div><div class='del'>-</div><div class='del'>-        if (!found) {</div><div class='del'>-                gf_log (xl-&gt;name, GF_LOG_WARNING,</div><div class='del'>-                        "option '%s' is not recognized",</div><div class='del'>-                        pair-&gt;key);</div><div class='add'>+        if (!regexec(&amp;regcmpl, line, 1, result, 0)) {</div><div class='add'>+            start = result[0].rm_so;</div><div class='add'>+            end = result[0].rm_eo;</div><div class='add'>+            copy_len = end - start;</div><div class='add'>+            gf_strncpy(keyval, line + copy_len, sizeof(keyval));</div><div class='add'>+            if (keyval[0]) {</div><div class='add'>+                cert_depth = atoi(keyval);</div><div class='add'>+                if (cert_depth == 0)</div><div class='add'>+                    cert_depth = 1; /* Default SSL CERT DEPTH */</div><div class='add'>+                break;</div><div class='add'>+            }</div><div class='ctx'>         }</div><div class='del'>-        return 0;</div><div class='add'>+        regfree(&amp;regcmpl);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (fp)</div><div class='add'>+        fclose(fp);</div><div class='add'>+    return cert_depth;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+xlator_t *</div><div class='add'>+glusterfs_get_last_xlator(glusterfs_graph_t *graph)</div><div class='add'>+{</div><div class='add'>+    xlator_t *trav = graph-&gt;first;</div><div class='add'>+    if (!trav)</div><div class='add'>+        return NULL;</div><div class='add'>+</div><div class='add'>+    while (trav-&gt;next)</div><div class='add'>+        trav = trav-&gt;next;</div><div class='add'>+</div><div class='add'>+    return trav;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+xlator_t *</div><div class='add'>+glusterfs_mux_xlator_unlink(xlator_t *pxl, xlator_t *cxl)</div><div class='add'>+{</div><div class='add'>+    xlator_list_t *unlink = NULL;</div><div class='add'>+    xlator_list_t *prev = NULL;</div><div class='add'>+    xlator_list_t **tmp = NULL;</div><div class='add'>+    xlator_t *next_child = NULL;</div><div class='add'>+    xlator_t *xl = NULL;</div><div class='add'>+</div><div class='add'>+    for (tmp = &amp;pxl-&gt;children; *tmp; tmp = &amp;(*tmp)-&gt;next) {</div><div class='add'>+        if ((*tmp)-&gt;xlator == cxl) {</div><div class='add'>+            unlink = *tmp;</div><div class='add'>+            *tmp = (*tmp)-&gt;next;</div><div class='add'>+            if (*tmp)</div><div class='add'>+                next_child = (*tmp)-&gt;xlator;</div><div class='add'>+            break;</div><div class='add'>+        }</div><div class='add'>+        prev = *tmp;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (!prev)</div><div class='add'>+        xl = pxl;</div><div class='add'>+    else if (prev-&gt;xlator)</div><div class='add'>+        xl = prev-&gt;xlator-&gt;graph-&gt;last_xl;</div><div class='add'>+</div><div class='add'>+    if (xl)</div><div class='add'>+        xl-&gt;next = next_child;</div><div class='add'>+    if (next_child)</div><div class='add'>+        next_child-&gt;prev = xl;</div><div class='add'>+</div><div class='add'>+    GF_FREE(unlink);</div><div class='add'>+    return next_child;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-glusterfs_graph_insert (glusterfs_graph_t *graph, glusterfs_ctx_t *ctx,</div><div class='del'>-                        const char *type, const char *name)</div><div class='add'>+glusterfs_xlator_link(xlator_t *pxl, xlator_t *cxl)</div><div class='ctx'> {</div><div class='del'>-        xlator_t        *ixl = NULL;</div><div class='del'>-        xlator_list_t   *xlchild = NULL;</div><div class='del'>-        xlator_list_t   *xlparent = NULL;</div><div class='add'>+    xlator_list_t *xlchild = NULL;</div><div class='add'>+    xlator_list_t *xlparent = NULL;</div><div class='add'>+    xlator_list_t **tmp = NULL;</div><div class='ctx'> </div><div class='del'>-        if (!ctx-&gt;master) {</div><div class='del'>-                gf_log ("glusterfs", GF_LOG_ERROR,</div><div class='del'>-                        "volume \"%s\" can be added from command line only "</div><div class='del'>-                        "on client side", type);</div><div class='add'>+    xlparent = (void *)GF_CALLOC(1, sizeof(*xlparent),</div><div class='add'>+                                 gf_common_mt_xlator_list_t);</div><div class='add'>+    if (!xlparent)</div><div class='add'>+        return -1;</div><div class='ctx'> </div><div class='del'>-                return -1;</div><div class='del'>-        }</div><div class='add'>+    xlchild = (void *)GF_CALLOC(1, sizeof(*xlchild),</div><div class='add'>+                                gf_common_mt_xlator_list_t);</div><div class='add'>+    if (!xlchild) {</div><div class='add'>+        GF_FREE(xlparent);</div><div class='ctx'> </div><div class='del'>-        ixl = GF_CALLOC (1, sizeof (*ixl), gf_common_mt_xlator_t);</div><div class='del'>-        if (!ixl)</div><div class='del'>-                return -1;</div><div class='del'>-</div><div class='del'>-        ixl-&gt;ctx      = ctx;</div><div class='del'>-        ixl-&gt;graph    = graph;</div><div class='del'>-        ixl-&gt;options  = get_new_dict ();</div><div class='del'>-        if (!ixl-&gt;options)</div><div class='del'>-                goto err;</div><div class='del'>-</div><div class='del'>-        ixl-&gt;name  = gf_strdup (name);</div><div class='del'>-        if (!ixl-&gt;name)</div><div class='del'>-                goto err;</div><div class='del'>-</div><div class='del'>-        if (xlator_set_type (ixl, type) == -1) {</div><div class='del'>-                gf_log ("glusterfs", GF_LOG_ERROR,</div><div class='del'>-                        "%s (%s) initialization failed",</div><div class='del'>-                        name, type);</div><div class='del'>-                return -1;</div><div class='del'>-        }</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='add'>+    xlparent-&gt;xlator = pxl;</div><div class='add'>+    for (tmp = &amp;cxl-&gt;parents; *tmp; tmp = &amp;(*tmp)-&gt;next)</div><div class='add'>+        ;</div><div class='add'>+    *tmp = xlparent;</div><div class='ctx'> </div><div class='del'>-        /* children */</div><div class='del'>-        xlchild = GF_CALLOC (sizeof (*xlchild), 1, gf_common_mt_xlator_list_t);</div><div class='del'>-        if (!xlchild)</div><div class='del'>-                goto err;</div><div class='del'>-        xlchild-&gt;xlator = graph-&gt;top;</div><div class='del'>-        ixl-&gt;children = xlchild; xlchild = NULL;</div><div class='add'>+    xlchild-&gt;xlator = cxl;</div><div class='add'>+    for (tmp = &amp;pxl-&gt;children; *tmp; tmp = &amp;(*tmp)-&gt;next)</div><div class='add'>+        ;</div><div class='add'>+    *tmp = xlchild;</div><div class='ctx'> </div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        /* parent */</div><div class='del'>-        xlparent = GF_CALLOC (sizeof (*xlparent), 1,</div><div class='del'>-                              gf_common_mt_xlator_list_t);</div><div class='del'>-        if (!xlparent)</div><div class='del'>-                goto err;</div><div class='del'>-        xlparent-&gt;xlator = ixl;</div><div class='add'>+void</div><div class='add'>+glusterfs_graph_set_first(glusterfs_graph_t *graph, xlator_t *xl)</div><div class='add'>+{</div><div class='add'>+    xl-&gt;next = graph-&gt;first;</div><div class='add'>+    if (graph-&gt;first)</div><div class='add'>+        ((xlator_t *)graph-&gt;first)-&gt;prev = xl;</div><div class='add'>+    graph-&gt;first = xl;</div><div class='ctx'> </div><div class='del'>-        ixl-&gt;next = graph-&gt;first;</div><div class='del'>-        graph-&gt;first = ixl;</div><div class='add'>+    graph-&gt;xl_count++;</div><div class='add'>+    xl-&gt;xl_id = graph-&gt;xl_count;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        xlparent-&gt;next = ((xlator_t *)graph-&gt;top)-&gt;parents;</div><div class='del'>-        ((xlator_t *)graph-&gt;top)-&gt;parents = xlparent;</div><div class='add'>+int</div><div class='add'>+glusterfs_graph_insert(glusterfs_graph_t *graph, glusterfs_ctx_t *ctx,</div><div class='add'>+                       const char *type, const char *name,</div><div class='add'>+                       gf_boolean_t autoload)</div><div class='add'>+{</div><div class='add'>+    xlator_t *ixl = NULL;</div><div class='ctx'> </div><div class='del'>-        graph-&gt;top = ixl;</div><div class='add'>+    if (!ctx-&gt;master) {</div><div class='add'>+        gf_msg("glusterfs", GF_LOG_ERROR, 0, LG_MSG_VOLUME_ERROR,</div><div class='add'>+               "volume \"%s\" can be added from command line only "</div><div class='add'>+               "on client side",</div><div class='add'>+               type);</div><div class='ctx'> </div><div class='del'>-        graph-&gt;xl_count++;</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        return 0;</div><div class='del'>-err:</div><div class='del'>-        xlator_destroy (ixl);</div><div class='add'>+    ixl = GF_CALLOC(1, sizeof(*ixl), gf_common_mt_xlator_t);</div><div class='add'>+    if (!ixl)</div><div class='ctx'>         return -1;</div><div class='add'>+</div><div class='add'>+    ixl-&gt;ctx = ctx;</div><div class='add'>+    ixl-&gt;graph = graph;</div><div class='add'>+    ixl-&gt;options = dict_new();</div><div class='add'>+    if (!ixl-&gt;options)</div><div class='add'>+        goto err;</div><div class='add'>+</div><div class='add'>+    ixl-&gt;name = gf_strdup(name);</div><div class='add'>+    if (!ixl-&gt;name)</div><div class='add'>+        goto err;</div><div class='add'>+</div><div class='add'>+    ixl-&gt;is_autoloaded = autoload;</div><div class='add'>+</div><div class='add'>+    if (xlator_set_type(ixl, type) == -1) {</div><div class='add'>+        gf_msg("glusterfs", GF_LOG_ERROR, 0, LG_MSG_INIT_FAILED,</div><div class='add'>+               "%s (%s) initialization failed", name, type);</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (glusterfs_xlator_link(ixl, graph-&gt;top) == -1)</div><div class='add'>+        goto err;</div><div class='add'>+    glusterfs_graph_set_first(graph, ixl);</div><div class='add'>+    graph-&gt;top = ixl;</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+err:</div><div class='add'>+    xlator_destroy(ixl);</div><div class='add'>+    return -1;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+int</div><div class='add'>+glusterfs_graph_acl(glusterfs_graph_t *graph, glusterfs_ctx_t *ctx)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+    cmd_args_t *cmd_args = NULL;</div><div class='add'>+</div><div class='add'>+    cmd_args = &amp;ctx-&gt;cmd_args;</div><div class='add'>+</div><div class='add'>+    if (!cmd_args-&gt;acl)</div><div class='add'>+        return 0;</div><div class='add'>+</div><div class='add'>+    ret = glusterfs_graph_insert(graph, ctx, "system/posix-acl",</div><div class='add'>+                                 "posix-acl-autoload", 1);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-glusterfs_graph_readonly (glusterfs_graph_t *graph, glusterfs_ctx_t *ctx)</div><div class='add'>+glusterfs_graph_worm(glusterfs_graph_t *graph, glusterfs_ctx_t *ctx)</div><div class='ctx'> {</div><div class='del'>-        int ret = 0;</div><div class='del'>-        cmd_args_t      *cmd_args = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    cmd_args_t *cmd_args = NULL;</div><div class='ctx'> </div><div class='del'>-        cmd_args = &amp;ctx-&gt;cmd_args;</div><div class='add'>+    cmd_args = &amp;ctx-&gt;cmd_args;</div><div class='ctx'> </div><div class='del'>-        if (!cmd_args-&gt;read_only)</div><div class='del'>-                return 0;</div><div class='add'>+    if (!cmd_args-&gt;worm)</div><div class='add'>+        return 0;</div><div class='ctx'> </div><div class='del'>-        ret = glusterfs_graph_insert (graph, ctx, "features/read-only",</div><div class='del'>-                                      "readonly-autoload");</div><div class='del'>-        return ret;</div><div class='add'>+    ret = glusterfs_graph_insert(graph, ctx, "features/worm", "worm-autoload",</div><div class='add'>+                                 1);</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+int</div><div class='add'>+glusterfs_graph_meta(glusterfs_graph_t *graph, glusterfs_ctx_t *ctx)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    if (!ctx-&gt;master)</div><div class='add'>+        return 0;</div><div class='add'>+</div><div class='add'>+    ret = glusterfs_graph_insert(graph, ctx, "meta", "meta-autoload", 1);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-glusterfs_graph_mac_compat (glusterfs_graph_t *graph, glusterfs_ctx_t *ctx)</div><div class='add'>+glusterfs_graph_mac_compat(glusterfs_graph_t *graph, glusterfs_ctx_t *ctx)</div><div class='ctx'> {</div><div class='del'>-        int ret = 0;</div><div class='del'>-        cmd_args_t      *cmd_args = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    cmd_args_t *cmd_args = NULL;</div><div class='ctx'> </div><div class='del'>-        cmd_args = &amp;ctx-&gt;cmd_args;</div><div class='add'>+    cmd_args = &amp;ctx-&gt;cmd_args;</div><div class='ctx'> </div><div class='del'>-        if (cmd_args-&gt;mac_compat == GF_OPTION_DISABLE)</div><div class='del'>-                return 0;</div><div class='add'>+    if (cmd_args-&gt;mac_compat == GF_OPTION_DISABLE)</div><div class='add'>+        return 0;</div><div class='ctx'> </div><div class='del'>-        ret = glusterfs_graph_insert (graph, ctx, "features/mac-compat",</div><div class='del'>-                                      "mac-compat-autoload");</div><div class='add'>+    ret = glusterfs_graph_insert(graph, ctx, "features/mac-compat",</div><div class='add'>+                                 "mac-compat-autoload", 1);</div><div class='ctx'> </div><div class='del'>-        return ret;</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+int</div><div class='add'>+glusterfs_graph_gfid_access(glusterfs_graph_t *graph, glusterfs_ctx_t *ctx)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+    cmd_args_t *cmd_args = NULL;</div><div class='add'>+</div><div class='add'>+    cmd_args = &amp;ctx-&gt;cmd_args;</div><div class='add'>+</div><div class='add'>+    if (!cmd_args-&gt;aux_gfid_mount)</div><div class='add'>+        return 0;</div><div class='add'>+</div><div class='add'>+    ret = glusterfs_graph_insert(graph, ctx, "features/gfid-access",</div><div class='add'>+                                 "gfid-access-autoload", 1);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> static void</div><div class='del'>-gf_add_cmdline_options (glusterfs_graph_t *graph, cmd_args_t *cmd_args)</div><div class='del'>-{</div><div class='del'>-        int                      ret = 0;</div><div class='del'>-        xlator_t                *trav = NULL;</div><div class='del'>-        xlator_cmdline_option_t *cmd_option = NULL;</div><div class='del'>-</div><div class='del'>-        trav = graph-&gt;first;</div><div class='del'>-</div><div class='del'>-        while (trav) {</div><div class='del'>-                list_for_each_entry (cmd_option,</div><div class='del'>-                                     &amp;cmd_args-&gt;xlator_options, cmd_args) {</div><div class='del'>-                        if (!fnmatch (cmd_option-&gt;volume,</div><div class='del'>-                                      trav-&gt;name, FNM_NOESCAPE)) {</div><div class='del'>-                                ret = dict_set_str (trav-&gt;options,</div><div class='del'>-                                                    cmd_option-&gt;key,</div><div class='del'>-                                                    cmd_option-&gt;value);</div><div class='del'>-                                if (ret == 0) {</div><div class='del'>-                                        gf_log (trav-&gt;name, GF_LOG_WARNING,</div><div class='del'>-                                                "adding option '%s' for "</div><div class='del'>-                                                "volume '%s' with value '%s'",</div><div class='del'>-                                                cmd_option-&gt;key, trav-&gt;name,</div><div class='del'>-                                                cmd_option-&gt;value);</div><div class='del'>-                                } else {</div><div class='del'>-                                        gf_log (trav-&gt;name, GF_LOG_WARNING,</div><div class='del'>-                                                "adding option '%s' for "</div><div class='del'>-                                                "volume '%s' failed: %s",</div><div class='del'>-                                                cmd_option-&gt;key, trav-&gt;name,</div><div class='del'>-                                                strerror (-ret));</div><div class='del'>-                                }</div><div class='del'>-                        }</div><div class='add'>+gf_add_cmdline_options(glusterfs_graph_t *graph, cmd_args_t *cmd_args)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+    xlator_t *trav = NULL;</div><div class='add'>+    xlator_cmdline_option_t *cmd_option = NULL;</div><div class='add'>+</div><div class='add'>+    trav = graph-&gt;first;</div><div class='add'>+</div><div class='add'>+    while (trav) {</div><div class='add'>+        list_for_each_entry(cmd_option, &amp;cmd_args-&gt;xlator_options, cmd_args)</div><div class='add'>+        {</div><div class='add'>+            if (!fnmatch(cmd_option-&gt;volume, trav-&gt;name, FNM_NOESCAPE)) {</div><div class='add'>+                ret = dict_set_str(trav-&gt;options, cmd_option-&gt;key,</div><div class='add'>+                                   cmd_option-&gt;value);</div><div class='add'>+                if (ret == 0) {</div><div class='add'>+                    gf_msg(trav-&gt;name, GF_LOG_TRACE, 0, LG_MSG_VOL_OPTION_ADD,</div><div class='add'>+                           "adding option '%s' for "</div><div class='add'>+                           "volume '%s' with value '%s'",</div><div class='add'>+                           cmd_option-&gt;key, trav-&gt;name, cmd_option-&gt;value);</div><div class='add'>+                } else {</div><div class='add'>+                    gf_msg(trav-&gt;name, GF_LOG_WARNING, -ret,</div><div class='add'>+                           LG_MSG_VOL_OPTION_ADD,</div><div class='add'>+                           "adding option '%s' for "</div><div class='add'>+                           "volume '%s' failed",</div><div class='add'>+                           cmd_option-&gt;key, trav-&gt;name);</div><div class='ctx'>                 }</div><div class='del'>-                trav = trav-&gt;next;</div><div class='add'>+            }</div><div class='ctx'>         }</div><div class='add'>+        trav = trav-&gt;next;</div><div class='add'>+    }</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-glusterfs_graph_validate_options (glusterfs_graph_t *graph)</div><div class='add'>+glusterfs_graph_validate_options(glusterfs_graph_t *graph)</div><div class='ctx'> {</div><div class='del'>-        volume_opt_list_t  *vol_opt = NULL;</div><div class='del'>-        xlator_t           *trav = NULL;</div><div class='del'>-        int                 ret = -1;</div><div class='add'>+    xlator_t *trav = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    char *errstr = NULL;</div><div class='ctx'> </div><div class='del'>-        trav = graph-&gt;first;</div><div class='add'>+    trav = graph-&gt;first;</div><div class='ctx'> </div><div class='del'>-        while (trav) {</div><div class='del'>-                if (list_empty (&amp;trav-&gt;volume_options))</div><div class='del'>-                        continue;</div><div class='del'>-</div><div class='del'>-                vol_opt = list_entry (trav-&gt;volume_options.next,</div><div class='del'>-                                      volume_opt_list_t, list);</div><div class='add'>+    while (trav) {</div><div class='add'>+        if (list_empty(&amp;trav-&gt;volume_options)) {</div><div class='add'>+            trav = trav-&gt;next;</div><div class='add'>+            continue;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-                ret = validate_xlator_volume_options (trav,</div><div class='del'>-                                                      vol_opt-&gt;given_opt);</div><div class='del'>-                if (ret) {</div><div class='del'>-                        gf_log (trav-&gt;name, GF_LOG_ERROR,</div><div class='del'>-                                "validating translator failed");</div><div class='del'>-                        return ret;</div><div class='del'>-                }</div><div class='del'>-                trav = trav-&gt;next;</div><div class='add'>+        ret = xlator_options_validate(trav, trav-&gt;options, &amp;errstr);</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_msg(trav-&gt;name, GF_LOG_ERROR, 0, LG_MSG_VALIDATION_FAILED,</div><div class='add'>+                   "validation failed: "</div><div class='add'>+                   "%s",</div><div class='add'>+                   errstr);</div><div class='add'>+            return ret;</div><div class='ctx'>         }</div><div class='add'>+        trav = trav-&gt;next;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        return 0;</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-glusterfs_graph_init (glusterfs_graph_t *graph)</div><div class='add'>+glusterfs_graph_init(glusterfs_graph_t *graph)</div><div class='ctx'> {</div><div class='del'>-        xlator_t           *trav = NULL;</div><div class='del'>-        int                 ret = -1;</div><div class='add'>+    xlator_t *trav = NULL;</div><div class='add'>+    int ret = -1;</div><div class='ctx'> </div><div class='del'>-        trav = graph-&gt;first;</div><div class='add'>+    trav = graph-&gt;first;</div><div class='ctx'> </div><div class='del'>-        while (trav) {</div><div class='del'>-                ret = xlator_init (trav);</div><div class='del'>-                if (ret) {</div><div class='del'>-                        gf_log (trav-&gt;name, GF_LOG_ERROR,</div><div class='del'>-                                "initializing translator failed");</div><div class='del'>-                        return ret;</div><div class='del'>-                }</div><div class='del'>-                trav = trav-&gt;next;</div><div class='add'>+    while (trav) {</div><div class='add'>+        ret = xlator_init(trav);</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_msg(trav-&gt;name, GF_LOG_ERROR, 0, LG_MSG_TRANSLATOR_INIT_FAILED,</div><div class='add'>+                   "initializing translator failed");</div><div class='add'>+            return ret;</div><div class='ctx'>         }</div><div class='add'>+        trav = trav-&gt;next;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        return 0;</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-glusterfs_graph_unknown_options (glusterfs_graph_t *graph)</div><div class='add'>+glusterfs_graph_deactivate(glusterfs_graph_t *graph)</div><div class='ctx'> {</div><div class='del'>-        data_pair_t        *pair = NULL;</div><div class='del'>-        xlator_t           *trav = NULL;</div><div class='add'>+    xlator_t *top = NULL;</div><div class='ctx'> </div><div class='del'>-        trav = graph-&gt;first;</div><div class='add'>+    if (graph == NULL)</div><div class='add'>+        goto out;</div><div class='ctx'> </div><div class='del'>-        /* Validate again phase */</div><div class='del'>-        while (trav) {</div><div class='del'>-                pair = trav-&gt;options-&gt;members_list;</div><div class='del'>-                while (pair) {</div><div class='del'>-                        _log_if_option_is_invalid (trav, pair);</div><div class='del'>-                        pair = pair-&gt;next;</div><div class='del'>-                }</div><div class='del'>-                trav = trav-&gt;next;</div><div class='del'>-        }</div><div class='add'>+    top = graph-&gt;top;</div><div class='add'>+    xlator_tree_fini(top);</div><div class='add'>+out:</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        return 0;</div><div class='add'>+static int</div><div class='add'>+_log_if_unknown_option(dict_t *dict, char *key, data_t *value, void *data)</div><div class='add'>+{</div><div class='add'>+    volume_option_t *found = NULL;</div><div class='add'>+    xlator_t *xl = NULL;</div><div class='add'>+</div><div class='add'>+    xl = data;</div><div class='add'>+</div><div class='add'>+    found = xlator_volume_option_get(xl, key);</div><div class='add'>+</div><div class='add'>+    if (!found) {</div><div class='add'>+        gf_msg(xl-&gt;name, GF_LOG_DEBUG, 0, LG_MSG_XLATOR_OPTION_INVALID,</div><div class='add'>+               "option '%s' is not recognized", key);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+static void</div><div class='add'>+_xlator_check_unknown_options(xlator_t *xl, void *data)</div><div class='add'>+{</div><div class='add'>+    dict_foreach(xl-&gt;options, _log_if_unknown_option, xl);</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-void</div><div class='del'>-fill_uuid (char *uuid, int size)</div><div class='add'>+static int</div><div class='add'>+glusterfs_graph_unknown_options(glusterfs_graph_t *graph)</div><div class='ctx'> {</div><div class='del'>-        char           hostname[256] = {0,};</div><div class='del'>-        struct timeval tv = {0,};</div><div class='del'>-        struct tm      now = {0, };</div><div class='del'>-        char           now_str[32];</div><div class='add'>+    xlator_foreach(graph-&gt;first, _xlator_check_unknown_options, NULL);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        if (gettimeofday (&amp;tv, NULL) == -1) {</div><div class='del'>-                gf_log ("graph", GF_LOG_ERROR,</div><div class='del'>-                        "gettimeofday: failed %s",</div><div class='del'>-                        strerror (errno));</div><div class='del'>-        }</div><div class='add'>+static void</div><div class='add'>+fill_uuid(char *uuid, int size, struct timeval tv)</div><div class='add'>+{</div><div class='add'>+    char hostname[50] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    char now_str[GF_TIMESTR_SIZE];</div><div class='ctx'> </div><div class='del'>-        if (gethostname (hostname, 256) == -1) {</div><div class='del'>-                gf_log ("graph", GF_LOG_ERROR,</div><div class='del'>-                        "gethostname: failed %s",</div><div class='del'>-                        strerror (errno));</div><div class='del'>-        }</div><div class='add'>+    if (gethostname(hostname, sizeof(hostname) - 1) != 0) {</div><div class='add'>+        gf_msg("graph", GF_LOG_ERROR, errno, LG_MSG_GETHOSTNAME_FAILED,</div><div class='add'>+               "gethostname failed");</div><div class='add'>+        hostname[sizeof(hostname) - 1] = '\0';</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        localtime_r (&amp;tv.tv_sec, &amp;now);</div><div class='del'>-        strftime (now_str, 32, "%Y/%m/%d-%H:%M:%S", &amp;now);</div><div class='del'>-        snprintf (uuid, size, "%s-%d-%s:%"GF_PRI_SUSECONDS,</div><div class='del'>-                  hostname, getpid(), now_str, tv.tv_usec);</div><div class='add'>+    gf_time_fmt_tv(now_str, sizeof now_str, &amp;tv, gf_timefmt_dirent);</div><div class='add'>+    snprintf(uuid, size, "%s-%d-%s", hostname, getpid(), now_str);</div><div class='ctx'> </div><div class='del'>-        return;</div><div class='add'>+    return;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+static int</div><div class='add'>+glusterfs_graph_settop(glusterfs_graph_t *graph, char *volume_name,</div><div class='add'>+                       gf_boolean_t exact_match)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    xlator_t *trav = NULL;</div><div class='add'>+</div><div class='add'>+    if (!volume_name || !exact_match) {</div><div class='add'>+        graph-&gt;top = graph-&gt;first;</div><div class='add'>+        ret = 0;</div><div class='add'>+    } else {</div><div class='add'>+        for (trav = graph-&gt;first; trav; trav = trav-&gt;next) {</div><div class='add'>+            if (strcmp(trav-&gt;name, volume_name) == 0) {</div><div class='add'>+                graph-&gt;top = trav;</div><div class='add'>+                ret = 0;</div><div class='add'>+                break;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-glusterfs_graph_settop (glusterfs_graph_t *graph, glusterfs_ctx_t *ctx)</div><div class='add'>+glusterfs_graph_parent_up(glusterfs_graph_t *graph)</div><div class='ctx'> {</div><div class='del'>-        const char *volume_name = NULL;</div><div class='del'>-        xlator_t   *trav = NULL;</div><div class='add'>+    xlator_t *trav = NULL;</div><div class='add'>+    int ret = -1;</div><div class='ctx'> </div><div class='del'>-        volume_name = ctx-&gt;cmd_args.volume_name;</div><div class='add'>+    trav = graph-&gt;first;</div><div class='ctx'> </div><div class='del'>-        if (!volume_name) {</div><div class='del'>-                graph-&gt;top = graph-&gt;first;</div><div class='del'>-                return 0;</div><div class='add'>+    while (trav) {</div><div class='add'>+        if (!xlator_has_parent(trav)) {</div><div class='add'>+            ret = xlator_notify(trav, GF_EVENT_PARENT_UP, trav);</div><div class='ctx'>         }</div><div class='ctx'> </div><div class='del'>-        for (trav = graph-&gt;first; trav; trav = trav-&gt;next) {</div><div class='del'>-                if (strcmp (trav-&gt;name, volume_name) == 0) {</div><div class='del'>-                        graph-&gt;top = trav;</div><div class='del'>-                        return 0;</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='add'>+        if (ret)</div><div class='add'>+            break;</div><div class='add'>+</div><div class='add'>+        trav = trav-&gt;next;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+glusterfs_graph_prepare(glusterfs_graph_t *graph, glusterfs_ctx_t *ctx,</div><div class='add'>+                        char *volume_name)</div><div class='add'>+{</div><div class='add'>+    xlator_t *trav = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    /* XXX: CHECKSUM */</div><div class='add'>+</div><div class='add'>+    /* XXX: attach to -n volname */</div><div class='add'>+    /* A '/' in the volume name suggests brick multiplexing is used, find</div><div class='add'>+     * the top of the (sub)graph. The volname MUST match the subvol in this</div><div class='add'>+     * case. In other cases (like for gfapi) the default top for the</div><div class='add'>+     * (sub)graph is ok. */</div><div class='add'>+    if (!volume_name) {</div><div class='add'>+        /* GlusterD does not pass a volume_name */</div><div class='add'>+        ret = glusterfs_graph_settop(graph, volume_name, _gf_false);</div><div class='add'>+    } else if (strncmp(volume_name, "/snaps/", 7) == 0) {</div><div class='add'>+        /* snap shots have their top xlator named like "/snaps/..."  */</div><div class='add'>+        ret = glusterfs_graph_settop(graph, volume_name, _gf_false);</div><div class='add'>+    } else if (volume_name[0] == '/') {</div><div class='add'>+        /* brick multiplexing passes the brick path */</div><div class='add'>+        ret = glusterfs_graph_settop(graph, volume_name, _gf_true);</div><div class='add'>+    } else {</div><div class='add'>+        ret = glusterfs_graph_settop(graph, volume_name, _gf_false);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_msg("graph", GF_LOG_ERROR, EINVAL, LG_MSG_GRAPH_ERROR,</div><div class='add'>+               "glusterfs graph settop failed");</div><div class='add'>+        errno = EINVAL;</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* XXX: WORM VOLUME */</div><div class='add'>+    ret = glusterfs_graph_worm(graph, ctx);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_msg("graph", GF_LOG_ERROR, 0, LG_MSG_GRAPH_ERROR,</div><div class='add'>+               "glusterfs graph worm failed");</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+    ret = glusterfs_graph_acl(graph, ctx);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_msg("graph", GF_LOG_ERROR, 0, LG_MSG_GRAPH_ERROR,</div><div class='add'>+               "glusterfs graph ACL failed");</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='add'>+    /* XXX: MAC COMPAT */</div><div class='add'>+    ret = glusterfs_graph_mac_compat(graph, ctx);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_msg("graph", GF_LOG_ERROR, 0, LG_MSG_GRAPH_ERROR,</div><div class='add'>+               "glusterfs graph mac compat failed");</div><div class='ctx'>         return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* XXX: gfid-access */</div><div class='add'>+    ret = glusterfs_graph_gfid_access(graph, ctx);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_msg("graph", GF_LOG_ERROR, 0, LG_MSG_GRAPH_ERROR,</div><div class='add'>+               "glusterfs graph 'gfid-access' failed");</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* XXX: topmost xlator */</div><div class='add'>+    ret = glusterfs_graph_meta(graph, ctx);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_msg("graph", GF_LOG_ERROR, 0, LG_MSG_GRAPH_ERROR,</div><div class='add'>+               "glusterfs graph meta failed");</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* XXX: this-&gt;ctx setting */</div><div class='add'>+    for (trav = graph-&gt;first; trav; trav = trav-&gt;next) {</div><div class='add'>+        trav-&gt;ctx = ctx;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* XXX: DOB setting */</div><div class='add'>+    gettimeofday(&amp;graph-&gt;dob, NULL);</div><div class='add'>+</div><div class='add'>+    fill_uuid(graph-&gt;graph_uuid, sizeof(graph-&gt;graph_uuid), graph-&gt;dob);</div><div class='add'>+</div><div class='add'>+    graph-&gt;id = ctx-&gt;graph_id++;</div><div class='add'>+</div><div class='add'>+    /* XXX: --xlator-option additions */</div><div class='add'>+    gf_add_cmdline_options(graph, &amp;ctx-&gt;cmd_args);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static xlator_t *</div><div class='add'>+glusterfs_root(glusterfs_graph_t *graph)</div><div class='add'>+{</div><div class='add'>+    return graph-&gt;first;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+glusterfs_is_leaf(xlator_t *xl)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    if (!xl-&gt;children)</div><div class='add'>+        ret = 1;</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static uint32_t</div><div class='add'>+glusterfs_count_leaves(xlator_t *xl)</div><div class='add'>+{</div><div class='add'>+    int n = 0;</div><div class='add'>+    xlator_list_t *list = NULL;</div><div class='add'>+</div><div class='add'>+    if (glusterfs_is_leaf(xl))</div><div class='add'>+        n = 1;</div><div class='add'>+    else</div><div class='add'>+        for (list = xl-&gt;children; list; list = list-&gt;next)</div><div class='add'>+            n += glusterfs_count_leaves(list-&gt;xlator);</div><div class='add'>+</div><div class='add'>+    return n;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+int</div><div class='add'>+glusterfs_get_leaf_count(glusterfs_graph_t *graph)</div><div class='add'>+{</div><div class='add'>+    return graph-&gt;leaf_count;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+_glusterfs_leaf_position(xlator_t *tgt, int *id, xlator_t *xl)</div><div class='add'>+{</div><div class='add'>+    xlator_list_t *list = NULL;</div><div class='add'>+    int found = 0;</div><div class='add'>+</div><div class='add'>+    if (xl == tgt)</div><div class='add'>+        found = 1;</div><div class='add'>+    else if (glusterfs_is_leaf(xl))</div><div class='add'>+        *id += 1;</div><div class='add'>+    else</div><div class='add'>+        for (list = xl-&gt;children; !found &amp;&amp; list; list = list-&gt;next)</div><div class='add'>+            found = _glusterfs_leaf_position(tgt, id, list-&gt;xlator);</div><div class='add'>+</div><div class='add'>+    return found;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-glusterfs_graph_parent_up (glusterfs_graph_t *graph)</div><div class='add'>+glusterfs_leaf_position(xlator_t *tgt)</div><div class='ctx'> {</div><div class='del'>-        xlator_t *trav = NULL;</div><div class='del'>-        int       ret = -1;</div><div class='add'>+    xlator_t *root = NULL;</div><div class='add'>+    int pos = 0;</div><div class='ctx'> </div><div class='del'>-        trav = graph-&gt;first;</div><div class='add'>+    root = glusterfs_root(tgt-&gt;graph);</div><div class='ctx'> </div><div class='del'>-        while (trav) {</div><div class='del'>-                if (!xlator_has_parent (trav)) {</div><div class='del'>-                        ret = xlator_notify (trav, GF_EVENT_PARENT_UP, trav);</div><div class='del'>-                }</div><div class='add'>+    if (!_glusterfs_leaf_position(tgt, &amp;pos, root))</div><div class='add'>+        pos = -1;</div><div class='ctx'> </div><div class='del'>-                if (ret)</div><div class='del'>-                        break;</div><div class='add'>+    return pos;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-                trav = trav-&gt;next;</div><div class='add'>+static int</div><div class='add'>+_glusterfs_reachable_leaves(xlator_t *base, xlator_t *xl, dict_t *leaves)</div><div class='add'>+{</div><div class='add'>+    xlator_list_t *list = NULL;</div><div class='add'>+    int err = 1;</div><div class='add'>+    int pos = 0;</div><div class='add'>+    char *strpos = NULL;</div><div class='add'>+</div><div class='add'>+    if (glusterfs_is_leaf(xl)) {</div><div class='add'>+        pos = glusterfs_leaf_position(xl);</div><div class='add'>+        if (pos &lt; 0)</div><div class='add'>+            goto out;</div><div class='add'>+</div><div class='add'>+        err = gf_asprintf(&amp;strpos, "%d", pos);</div><div class='add'>+</div><div class='add'>+        if (err &gt;= 0) {</div><div class='add'>+            err = dict_set_static_ptr(leaves, strpos, base);</div><div class='add'>+            GF_FREE(strpos);</div><div class='ctx'>         }</div><div class='add'>+    } else {</div><div class='add'>+        for (err = 0, list = xl-&gt;children; !err &amp;&amp; list; list = list-&gt;next)</div><div class='add'>+            err = _glusterfs_reachable_leaves(base, list-&gt;xlator, leaves);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        return ret;</div><div class='add'>+out:</div><div class='add'>+    return err;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+/*</div><div class='add'>+ * This function determines which leaves are children (or grandchildren)</div><div class='add'>+ * of the given base. The base may have multiple sub volumes. Each sub</div><div class='add'>+ * volumes in turn may have sub volumes.. until the leaves are reached.</div><div class='add'>+ * Each leaf is numbered 1,2,3,...etc.</div><div class='add'>+ *</div><div class='add'>+ * The base translator calls this function to see which of *its* subvolumes</div><div class='add'>+ * it would forward an FOP to, to *get to* a particular leaf.</div><div class='add'>+ * That information is built into the "leaves" dictionary.</div><div class='add'>+ * key:destination leaf# -&gt; value:base subvolume xlator.</div><div class='add'>+ */</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-glusterfs_graph_prepare (glusterfs_graph_t *graph, glusterfs_ctx_t *ctx)</div><div class='add'>+glusterfs_reachable_leaves(xlator_t *base, dict_t *leaves)</div><div class='ctx'> {</div><div class='del'>-        xlator_t    *trav = NULL;</div><div class='del'>-        int          ret = 0;</div><div class='add'>+    xlator_list_t *list = NULL;</div><div class='add'>+    int err = 0;</div><div class='ctx'> </div><div class='del'>-        /* XXX: CHECKSUM */</div><div class='add'>+    for (list = base-&gt;children; !err &amp;&amp; list; list = list-&gt;next)</div><div class='add'>+        err = _glusterfs_reachable_leaves(list-&gt;xlator, list-&gt;xlator, leaves);</div><div class='ctx'> </div><div class='del'>-        /* XXX: attach to -n volname */</div><div class='del'>-        ret = glusterfs_graph_settop (graph, ctx);</div><div class='del'>-        if (ret)</div><div class='del'>-                return -1;</div><div class='add'>+    return err;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        /* XXX: RO VOLUME */</div><div class='del'>-        ret = glusterfs_graph_readonly (graph, ctx);</div><div class='del'>-        if (ret)</div><div class='del'>-                return -1;</div><div class='add'>+int</div><div class='add'>+glusterfs_graph_activate(glusterfs_graph_t *graph, glusterfs_ctx_t *ctx)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+    xlator_t *root = NULL;</div><div class='ctx'> </div><div class='del'>-        /* XXX: MAC COMPAT */</div><div class='del'>-        ret = glusterfs_graph_mac_compat (graph, ctx);</div><div class='del'>-        if (ret)</div><div class='del'>-                return -1;</div><div class='add'>+    root = glusterfs_root(graph);</div><div class='ctx'> </div><div class='del'>-        /* XXX: this-&gt;ctx setting */</div><div class='del'>-        for (trav = graph-&gt;first; trav; trav = trav-&gt;next) {</div><div class='del'>-                trav-&gt;ctx = ctx;</div><div class='add'>+    graph-&gt;leaf_count = glusterfs_count_leaves(root);</div><div class='add'>+</div><div class='add'>+    /* XXX: all xlator options validation */</div><div class='add'>+    ret = glusterfs_graph_validate_options(graph);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_msg("graph", GF_LOG_ERROR, 0, LG_MSG_VALIDATION_FAILED,</div><div class='add'>+               "validate options failed");</div><div class='add'>+        return ret;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* XXX: perform init () */</div><div class='add'>+    ret = glusterfs_graph_init(graph);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_msg("graph", GF_LOG_ERROR, 0, LG_MSG_GRAPH_INIT_FAILED,</div><div class='add'>+               "init failed");</div><div class='add'>+        return ret;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = glusterfs_graph_unknown_options(graph);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_msg("graph", GF_LOG_ERROR, 0, LG_MSG_UNKNOWN_OPTIONS_FAILED,</div><div class='add'>+               "unknown options "</div><div class='add'>+               "failed");</div><div class='add'>+        return ret;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* XXX: log full graph (_gf_dump_details) */</div><div class='add'>+</div><div class='add'>+    list_add(&amp;graph-&gt;list, &amp;ctx-&gt;graphs);</div><div class='add'>+    ctx-&gt;active = graph;</div><div class='add'>+</div><div class='add'>+    /* XXX: attach to master and set active pointer */</div><div class='add'>+    if (ctx-&gt;master) {</div><div class='add'>+        ret = xlator_notify(ctx-&gt;master, GF_EVENT_GRAPH_NEW, graph);</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_msg("graph", GF_LOG_ERROR, 0, LG_MSG_EVENT_NOTIFY_FAILED,</div><div class='add'>+                   "graph new notification failed");</div><div class='add'>+            return ret;</div><div class='ctx'>         }</div><div class='add'>+        ((xlator_t *)ctx-&gt;master)-&gt;next = graph-&gt;top;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* XXX: perform parent up */</div><div class='add'>+    ret = glusterfs_graph_parent_up(graph);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_msg("graph", GF_LOG_ERROR, 0, LG_MSG_EVENT_NOTIFY_FAILED,</div><div class='add'>+               "parent up notification failed");</div><div class='add'>+        return ret;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        /* XXX: DOB setting */</div><div class='del'>-        gettimeofday (&amp;graph-&gt;dob, NULL);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        fill_uuid (graph-&gt;graph_uuid, 128);</div><div class='add'>+int</div><div class='add'>+xlator_equal_rec(xlator_t *xl1, xlator_t *xl2)</div><div class='add'>+{</div><div class='add'>+    xlator_list_t *trav1 = NULL;</div><div class='add'>+    xlator_list_t *trav2 = NULL;</div><div class='add'>+    int ret = 0;</div><div class='ctx'> </div><div class='del'>-        /* XXX: --xlator-option additions */</div><div class='del'>-        gf_add_cmdline_options (graph, &amp;ctx-&gt;cmd_args);</div><div class='add'>+    if (xl1 == NULL || xl2 == NULL) {</div><div class='add'>+        gf_msg_debug("xlator", 0, "invalid argument");</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    trav1 = xl1-&gt;children;</div><div class='add'>+    trav2 = xl2-&gt;children;</div><div class='add'>+</div><div class='add'>+    while (trav1 &amp;&amp; trav2) {</div><div class='add'>+        ret = xlator_equal_rec(trav1-&gt;xlator, trav2-&gt;xlator);</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_msg_debug("glusterfsd-mgmt", 0,</div><div class='add'>+                         "xlators children "</div><div class='add'>+                         "not equal");</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='add'>+        trav1 = trav1-&gt;next;</div><div class='add'>+        trav2 = trav2-&gt;next;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (trav1 || trav2) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (strcmp(xl1-&gt;name, xl2-&gt;name)) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* type could have changed even if xlator names match,</div><div class='add'>+       e.g cluster/distribute and cluster/nufa share the same</div><div class='add'>+       xlator name</div><div class='add'>+    */</div><div class='add'>+    if (strcmp(xl1-&gt;type, xl2-&gt;type)) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        return 0;</div><div class='add'>+gf_boolean_t</div><div class='add'>+is_graph_topology_equal(glusterfs_graph_t *graph1, glusterfs_graph_t *graph2)</div><div class='add'>+{</div><div class='add'>+    xlator_t *trav1 = NULL;</div><div class='add'>+    xlator_t *trav2 = NULL;</div><div class='add'>+    gf_boolean_t ret = _gf_true;</div><div class='add'>+    xlator_list_t *ltrav;</div><div class='add'>+</div><div class='add'>+    trav1 = graph1-&gt;first;</div><div class='add'>+    trav2 = graph2-&gt;first;</div><div class='add'>+</div><div class='add'>+    if (strcmp(trav2-&gt;type, "protocol/server") == 0) {</div><div class='add'>+        trav2 = trav2-&gt;children-&gt;xlator;</div><div class='add'>+        for (ltrav = trav1-&gt;children; ltrav; ltrav = ltrav-&gt;next) {</div><div class='add'>+            trav1 = ltrav-&gt;xlator;</div><div class='add'>+            if (!trav1-&gt;cleanup_starting &amp;&amp; !strcmp(trav1-&gt;name, trav2-&gt;name)) {</div><div class='add'>+                break;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+        if (!ltrav) {</div><div class='add'>+            return _gf_false;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = xlator_equal_rec(trav1, trav2);</div><div class='add'>+</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_msg_debug("glusterfsd-mgmt", 0, "graphs are not equal");</div><div class='add'>+        ret = _gf_false;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = _gf_true;</div><div class='add'>+    gf_msg_debug("glusterfsd-mgmt", 0, "graphs are equal");</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+/* Function has 3types of return value 0, -ve , 1</div><div class='add'>+ *   return 0          =======&gt; reconfiguration of options has succeeded</div><div class='add'>+ *   return 1          =======&gt; the graph has to be reconstructed and all the</div><div class='add'>+ * xlators should be inited return -1(or -ve) =======&gt; Some Internal Error</div><div class='add'>+ * occurred during the operation</div><div class='add'>+ */</div><div class='add'>+int</div><div class='add'>+glusterfs_volfile_reconfigure(FILE *newvolfile_fp, glusterfs_ctx_t *ctx)</div><div class='add'>+{</div><div class='add'>+    glusterfs_graph_t *oldvolfile_graph = NULL;</div><div class='add'>+    glusterfs_graph_t *newvolfile_graph = NULL;</div><div class='add'>+</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    if (!ctx) {</div><div class='add'>+        gf_msg("glusterfsd-mgmt", GF_LOG_ERROR, 0, LG_MSG_CTX_NULL,</div><div class='add'>+               "ctx is NULL");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    oldvolfile_graph = ctx-&gt;active;</div><div class='add'>+    if (!oldvolfile_graph) {</div><div class='add'>+        ret = 1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    newvolfile_graph = glusterfs_graph_construct(newvolfile_fp);</div><div class='add'>+</div><div class='add'>+    if (!newvolfile_graph) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    glusterfs_graph_prepare(newvolfile_graph, ctx, ctx-&gt;cmd_args.volume_name);</div><div class='add'>+</div><div class='add'>+    if (!is_graph_topology_equal(oldvolfile_graph, newvolfile_graph)) {</div><div class='add'>+        ret = 1;</div><div class='add'>+        gf_msg_debug("glusterfsd-mgmt", 0,</div><div class='add'>+                     "Graph topology not "</div><div class='add'>+                     "equal(should call INIT)");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    gf_msg_debug("glusterfsd-mgmt", 0,</div><div class='add'>+                 "Only options have changed in the"</div><div class='add'>+                 " new graph");</div><div class='add'>+</div><div class='add'>+    ret = glusterfs_graph_reconfigure(oldvolfile_graph, newvolfile_graph);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_msg_debug("glusterfsd-mgmt", 0,</div><div class='add'>+                     "Could not reconfigure "</div><div class='add'>+                     "new options in old graph");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+out:</div><div class='add'>+</div><div class='add'>+    if (newvolfile_graph)</div><div class='add'>+        glusterfs_graph_destroy(newvolfile_graph);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* This function need to remove. This added to support gfapi volfile</div><div class='add'>+ * reconfigure.</div><div class='add'>+ */</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-glusterfs_graph_activate (glusterfs_graph_t *graph, glusterfs_ctx_t *ctx)</div><div class='add'>+gf_volfile_reconfigure(int oldvollen, FILE *newvolfile_fp, glusterfs_ctx_t *ctx,</div><div class='add'>+                       const char *oldvolfile)</div><div class='ctx'> {</div><div class='del'>-        int ret = 0;</div><div class='add'>+    glusterfs_graph_t *oldvolfile_graph = NULL;</div><div class='add'>+    glusterfs_graph_t *newvolfile_graph = NULL;</div><div class='add'>+    FILE *oldvolfile_fp = NULL;</div><div class='add'>+    /*Since the function mkstemp() replaces XXXXXX,</div><div class='add'>+     * assigning it to a variable</div><div class='add'>+     */</div><div class='add'>+    char temp_file[] = "/tmp/temp_vol_file_XXXXXX";</div><div class='add'>+    gf_boolean_t active_graph_found = _gf_true;</div><div class='add'>+</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int u_ret = -1;</div><div class='add'>+    int file_desc = -1;</div><div class='add'>+</div><div class='add'>+    if (!oldvollen) {</div><div class='add'>+        ret = 1;  // Has to call INIT for the whole graph</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (!ctx) {</div><div class='add'>+        gf_msg("glusterfsd-mgmt", GF_LOG_ERROR, 0, LG_MSG_CTX_NULL,</div><div class='add'>+               "ctx is NULL");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    oldvolfile_graph = ctx-&gt;active;</div><div class='add'>+    if (!oldvolfile_graph) {</div><div class='add'>+        active_graph_found = _gf_false;</div><div class='add'>+        gf_msg("glusterfsd-mgmt", GF_LOG_ERROR, 0, LG_MSG_ACTIVE_GRAPH_NULL,</div><div class='add'>+               "glusterfs_ctx-&gt;active is NULL");</div><div class='add'>+</div><div class='add'>+        /* coverity[secure_temp] mkstemp uses 0600 as the mode and is safe */</div><div class='add'>+        file_desc = mkstemp(temp_file);</div><div class='add'>+        if (file_desc &lt; 0) {</div><div class='add'>+            gf_msg("glusterfsd-mgmt", GF_LOG_ERROR, errno,</div><div class='add'>+                   LG_MSG_TMPFILE_CREATE_FAILED,</div><div class='add'>+                   "Unable to "</div><div class='add'>+                   "create temporary volfile");</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-        /* XXX: all xlator options validation */</div><div class='del'>-        ret = glusterfs_graph_validate_options (graph);</div><div class='del'>-        if (ret)</div><div class='del'>-                return ret;</div><div class='add'>+        /*Calling unlink so that when the file is closed or program</div><div class='add'>+         *terminates the tempfile is deleted.</div><div class='add'>+         */</div><div class='add'>+        u_ret = sys_unlink(temp_file);</div><div class='add'>+</div><div class='add'>+        if (u_ret &lt; 0) {</div><div class='add'>+            gf_msg("glusterfsd-mgmt", GF_LOG_ERROR, errno,</div><div class='add'>+                   LG_MSG_TMPFILE_DELETE_FAILED,</div><div class='add'>+                   "Temporary file"</div><div class='add'>+                   " delete failed.");</div><div class='add'>+            sys_close(file_desc);</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-        /* XXX: perform init () */</div><div class='del'>-        ret = glusterfs_graph_init (graph);</div><div class='del'>-        if (ret)</div><div class='del'>-                return ret;</div><div class='add'>+        oldvolfile_fp = fdopen(file_desc, "w+b");</div><div class='add'>+        if (!oldvolfile_fp)</div><div class='add'>+            goto out;</div><div class='ctx'> </div><div class='del'>-        ret = glusterfs_graph_unknown_options (graph);</div><div class='del'>-        if (ret)</div><div class='del'>-                return ret;</div><div class='add'>+        fwrite(oldvolfile, oldvollen, 1, oldvolfile_fp);</div><div class='add'>+        fflush(oldvolfile_fp);</div><div class='add'>+        if (ferror(oldvolfile_fp)) {</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        oldvolfile_graph = glusterfs_graph_construct(oldvolfile_fp);</div><div class='add'>+        if (!oldvolfile_graph)</div><div class='add'>+            goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    newvolfile_graph = glusterfs_graph_construct(newvolfile_fp);</div><div class='add'>+    if (!newvolfile_graph) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    glusterfs_graph_prepare(newvolfile_graph, ctx, ctx-&gt;cmd_args.volume_name);</div><div class='add'>+</div><div class='add'>+    if (!is_graph_topology_equal(oldvolfile_graph, newvolfile_graph)) {</div><div class='add'>+        ret = 1;</div><div class='add'>+        gf_msg_debug("glusterfsd-mgmt", 0,</div><div class='add'>+                     "Graph topology not "</div><div class='add'>+                     "equal(should call INIT)");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    gf_msg_debug("glusterfsd-mgmt", 0,</div><div class='add'>+                 "Only options have changed in the"</div><div class='add'>+                 " new graph");</div><div class='add'>+</div><div class='add'>+    /* */</div><div class='add'>+    ret = glusterfs_graph_reconfigure(oldvolfile_graph, newvolfile_graph);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_msg_debug("glusterfsd-mgmt", 0,</div><div class='add'>+                     "Could not reconfigure "</div><div class='add'>+                     "new options in old graph");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+out:</div><div class='add'>+    if (oldvolfile_fp)</div><div class='add'>+        fclose(oldvolfile_fp);</div><div class='add'>+</div><div class='add'>+    /*  Do not simply destroy the old graph here. If the oldgraph</div><div class='add'>+        is constructed here in this function itself instead of getting</div><div class='add'>+        it from ctx-&gt;active (which happens only of ctx-&gt;active is NULL),</div><div class='add'>+        then destroy the old graph. If some i/o is still happening in</div><div class='add'>+        the old graph and the old graph is obtained from ctx-&gt;active,</div><div class='add'>+        then destroying the graph will cause problems.</div><div class='add'>+    */</div><div class='add'>+    if (!active_graph_found &amp;&amp; oldvolfile_graph)</div><div class='add'>+        glusterfs_graph_destroy(oldvolfile_graph);</div><div class='add'>+    if (newvolfile_graph)</div><div class='add'>+        glusterfs_graph_destroy(newvolfile_graph);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+glusterfs_graph_reconfigure(glusterfs_graph_t *oldgraph,</div><div class='add'>+                            glusterfs_graph_t *newgraph)</div><div class='add'>+{</div><div class='add'>+    xlator_t *old_xl = NULL;</div><div class='add'>+    xlator_t *new_xl = NULL;</div><div class='add'>+    xlator_list_t *trav;</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(oldgraph);</div><div class='add'>+    GF_ASSERT(newgraph);</div><div class='add'>+</div><div class='add'>+    old_xl = oldgraph-&gt;first;</div><div class='add'>+    while (old_xl-&gt;is_autoloaded) {</div><div class='add'>+        old_xl = old_xl-&gt;children-&gt;xlator;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    new_xl = newgraph-&gt;first;</div><div class='add'>+    while (new_xl-&gt;is_autoloaded) {</div><div class='add'>+        new_xl = new_xl-&gt;children-&gt;xlator;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (strcmp(old_xl-&gt;type, "protocol/server") != 0) {</div><div class='add'>+        return xlator_tree_reconfigure(old_xl, new_xl);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Some options still need to be handled by the server translator. */</div><div class='add'>+    if (old_xl-&gt;reconfigure) {</div><div class='add'>+        old_xl-&gt;reconfigure(old_xl, new_xl-&gt;options);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    (void)copy_opts_to_child(new_xl, FIRST_CHILD(new_xl), "*auth*");</div><div class='add'>+    new_xl = FIRST_CHILD(new_xl);</div><div class='add'>+</div><div class='add'>+    for (trav = old_xl-&gt;children; trav; trav = trav-&gt;next) {</div><div class='add'>+        if (!trav-&gt;xlator-&gt;cleanup_starting &amp;&amp;</div><div class='add'>+            !strcmp(trav-&gt;xlator-&gt;name, new_xl-&gt;name)) {</div><div class='add'>+            return xlator_tree_reconfigure(trav-&gt;xlator, new_xl);</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        /* XXX: log full graph (_gf_dump_details) */</div><div class='add'>+    return -1;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        list_add (&amp;graph-&gt;list, &amp;ctx-&gt;graphs);</div><div class='del'>-        ctx-&gt;active = graph;</div><div class='add'>+int</div><div class='add'>+glusterfs_graph_destroy_residual(glusterfs_graph_t *graph)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='ctx'> </div><div class='del'>-        /* XXX: attach to master and set active pointer */</div><div class='del'>-        if (ctx-&gt;master)</div><div class='del'>-                ret = xlator_notify (ctx-&gt;master, GF_EVENT_GRAPH_NEW, graph);</div><div class='del'>-        if (ret)</div><div class='del'>-                return ret;</div><div class='add'>+    if (graph == NULL)</div><div class='add'>+        return ret;</div><div class='ctx'> </div><div class='del'>-        /* XXX: perform parent up */</div><div class='del'>-        ret = glusterfs_graph_parent_up (graph);</div><div class='del'>-        if (ret)</div><div class='del'>-                return ret;</div><div class='add'>+    ret = xlator_tree_free_memacct(graph-&gt;first);</div><div class='ctx'> </div><div class='add'>+    list_del_init(&amp;graph-&gt;list);</div><div class='add'>+    pthread_mutex_destroy(&amp;graph-&gt;mutex);</div><div class='add'>+    pthread_cond_destroy(&amp;graph-&gt;child_down_cond);</div><div class='add'>+    GF_FREE(graph);</div><div class='ctx'> </div><div class='del'>-        return 0;</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+/* This function destroys all the xlator members except for the</div><div class='add'>+ * xlator strcuture and its mem accounting field.</div><div class='add'>+ *</div><div class='add'>+ * If otherwise, it would destroy the master xlator object as well</div><div class='add'>+ * its mem accounting, which would mean after calling glusterfs_graph_destroy()</div><div class='add'>+ * there cannot be any reference to GF_FREE() from the master xlator, this is</div><div class='add'>+ * not possible because of the following dependencies:</div><div class='add'>+ * - glusterfs_ctx_t will have mem pools allocated by the master xlators</div><div class='add'>+ * - xlator objects will have references to those mem pools(g: dict)</div><div class='add'>+ *</div><div class='add'>+ * Ordering the freeing in any of the order will also not solve the dependency:</div><div class='add'>+ * - Freeing xlator objects(including memory accounting) before mem pools</div><div class='add'>+ *   destruction will mean not use GF_FREE while destroying mem pools.</div><div class='add'>+ * - Freeing mem pools and then destroying xlator objects would lead to crashes</div><div class='add'>+ *   when xlator tries to unref dict or other mem pool objects.</div><div class='add'>+ *</div><div class='add'>+ * Hence the way chosen out of this interdependency is to split xlator object</div><div class='add'>+ * free into two stages:</div><div class='add'>+ * - Free all the xlator members excpet for its mem accounting structure</div><div class='add'>+ * - Free all the mem accouting structures of xlator along with the xlator</div><div class='add'>+ *   object itself.</div><div class='add'>+ */</div><div class='add'>+int</div><div class='add'>+glusterfs_graph_destroy(glusterfs_graph_t *graph)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    GF_VALIDATE_OR_GOTO("graph", graph, out);</div><div class='add'>+</div><div class='add'>+    ret = xlator_tree_free_members(graph-&gt;first);</div><div class='add'>+</div><div class='add'>+    ret = glusterfs_graph_destroy_residual(graph);</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-glusterfs_graph_destroy (glusterfs_graph_t *graph)</div><div class='add'>+glusterfs_graph_fini(glusterfs_graph_t *graph)</div><div class='ctx'> {</div><div class='add'>+    xlator_t *trav = NULL;</div><div class='add'>+</div><div class='add'>+    trav = graph-&gt;first;</div><div class='add'>+</div><div class='add'>+    while (trav) {</div><div class='add'>+        if (trav-&gt;init_succeeded) {</div><div class='add'>+            trav-&gt;cleanup_starting = 1;</div><div class='add'>+            trav-&gt;fini(trav);</div><div class='add'>+            if (trav-&gt;local_pool) {</div><div class='add'>+                mem_pool_destroy(trav-&gt;local_pool);</div><div class='add'>+                trav-&gt;local_pool = NULL;</div><div class='add'>+            }</div><div class='add'>+            if (trav-&gt;itable) {</div><div class='add'>+                inode_table_destroy(trav-&gt;itable);</div><div class='add'>+                trav-&gt;itable = NULL;</div><div class='add'>+            }</div><div class='add'>+            trav-&gt;init_succeeded = 0;</div><div class='add'>+        }</div><div class='add'>+        trav = trav-&gt;next;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+glusterfs_graph_attach(glusterfs_graph_t *orig_graph, char *path,</div><div class='add'>+                       glusterfs_graph_t **newgraph)</div><div class='add'>+{</div><div class='add'>+    xlator_t *this = THIS;</div><div class='add'>+    FILE *fp;</div><div class='add'>+    glusterfs_graph_t *graph;</div><div class='add'>+    xlator_t *xl;</div><div class='add'>+    char *volfile_id = NULL;</div><div class='add'>+    char *volfile_content = NULL;</div><div class='add'>+    struct stat stbuf = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    size_t file_len = -1;</div><div class='add'>+    gf_volfile_t *volfile_obj = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    char sha256_hash[SHA256_DIGEST_LENGTH] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    if (!orig_graph) {</div><div class='add'>+        return -EINVAL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = sys_stat(path, &amp;stbuf);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        gf_log(THIS-&gt;name, GF_LOG_ERROR, "Unable to stat %s (%s)", path,</div><div class='add'>+               strerror(errno));</div><div class='add'>+        return -EINVAL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    file_len = stbuf.st_size;</div><div class='add'>+    volfile_content = GF_MALLOC(file_len + 1, gf_common_mt_char);</div><div class='add'>+    if (!volfile_content)</div><div class='add'>+        return -ENOMEM;</div><div class='add'>+</div><div class='add'>+    fp = fopen(path, "r");</div><div class='add'>+    if (!fp) {</div><div class='add'>+        gf_log(THIS-&gt;name, GF_LOG_WARNING, "oops, %s disappeared on us", path);</div><div class='add'>+        GF_FREE(volfile_content);</div><div class='add'>+        return -EIO;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = fread(volfile_content, sizeof(char), file_len, fp);</div><div class='add'>+    if (ret == file_len) {</div><div class='add'>+        glusterfs_compute_sha256((const unsigned char *)volfile_content,</div><div class='add'>+                                 file_len, sha256_hash);</div><div class='add'>+    } else {</div><div class='add'>+        gf_log(THIS-&gt;name, GF_LOG_ERROR,</div><div class='add'>+               "read failed on path %s. File size=%" GF_PRI_SIZET</div><div class='add'>+               "read size=%d",</div><div class='add'>+               path, file_len, ret);</div><div class='add'>+        GF_FREE(volfile_content);</div><div class='add'>+        fclose(fp);</div><div class='add'>+        return -EIO;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    GF_FREE(volfile_content);</div><div class='add'>+</div><div class='add'>+    graph = glusterfs_graph_construct(fp);</div><div class='add'>+    fclose(fp);</div><div class='add'>+    if (!graph) {</div><div class='add'>+        gf_log(this-&gt;name, GF_LOG_WARNING, "could not create graph from %s",</div><div class='add'>+               path);</div><div class='add'>+        return -EIO;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /*</div><div class='add'>+     * If there's a server translator on top, we want whatever's below</div><div class='add'>+     * that.</div><div class='add'>+     */</div><div class='add'>+    xl = graph-&gt;first;</div><div class='add'>+    if (strcmp(xl-&gt;type, "protocol/server") == 0) {</div><div class='add'>+        (void)copy_opts_to_child(xl, FIRST_CHILD(xl), "*auth*");</div><div class='add'>+        xl = FIRST_CHILD(xl);</div><div class='add'>+    }</div><div class='add'>+    graph-&gt;first = xl;</div><div class='add'>+    *newgraph = graph;</div><div class='add'>+</div><div class='add'>+    volfile_id = strstr(path, "/snaps/");</div><div class='add'>+    if (!volfile_id) {</div><div class='add'>+        volfile_id = rindex(path, '/');</div><div class='add'>+        if (volfile_id) {</div><div class='add'>+            ++volfile_id;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    if (volfile_id) {</div><div class='add'>+        xl-&gt;volfile_id = gf_strdup(volfile_id);</div><div class='add'>+        /* There's a stray ".vol" at the end. */</div><div class='add'>+        xl-&gt;volfile_id[strlen(xl-&gt;volfile_id) - 4] = '\0';</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* TODO memory leaks everywhere need to free graph in case of error */</div><div class='add'>+    if (glusterfs_graph_prepare(graph, this-&gt;ctx, xl-&gt;name)) {</div><div class='add'>+        gf_log(this-&gt;name, GF_LOG_WARNING,</div><div class='add'>+               "failed to prepare graph for xlator %s", xl-&gt;name);</div><div class='add'>+        return -EIO;</div><div class='add'>+    } else if (glusterfs_graph_init(graph)) {</div><div class='add'>+        gf_log(this-&gt;name, GF_LOG_WARNING,</div><div class='add'>+               "failed to initialize graph for xlator %s", xl-&gt;name);</div><div class='add'>+        return -EIO;</div><div class='add'>+    } else if (glusterfs_xlator_link(orig_graph-&gt;top, graph-&gt;top)) {</div><div class='add'>+        gf_log(this-&gt;name, GF_LOG_WARNING,</div><div class='add'>+               "failed to link the graphs for xlator %s ", xl-&gt;name);</div><div class='add'>+        return -EIO;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (!volfile_obj) {</div><div class='add'>+        volfile_obj = GF_CALLOC(1, sizeof(gf_volfile_t), gf_common_volfile_t);</div><div class='add'>+        if (!volfile_obj) {</div><div class='add'>+            return -EIO;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    INIT_LIST_HEAD(&amp;volfile_obj-&gt;volfile_list);</div><div class='add'>+    snprintf(volfile_obj-&gt;vol_id, sizeof(volfile_obj-&gt;vol_id), "%s",</div><div class='add'>+             xl-&gt;volfile_id);</div><div class='add'>+    memcpy(volfile_obj-&gt;volfile_checksum, sha256_hash,</div><div class='add'>+           sizeof(volfile_obj-&gt;volfile_checksum));</div><div class='add'>+    list_add(&amp;volfile_obj-&gt;volfile_list, &amp;this-&gt;ctx-&gt;volfile_list);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+int</div><div class='add'>+glusterfs_muxsvc_cleanup_parent(glusterfs_ctx_t *ctx,</div><div class='add'>+                                glusterfs_graph_t *parent_graph)</div><div class='add'>+{</div><div class='add'>+    if (parent_graph) {</div><div class='add'>+        if (parent_graph-&gt;first) {</div><div class='add'>+            xlator_destroy(parent_graph-&gt;first);</div><div class='add'>+        }</div><div class='add'>+        ctx-&gt;active = NULL;</div><div class='add'>+        GF_FREE(parent_graph);</div><div class='add'>+        parent_graph = NULL;</div><div class='add'>+    }</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void *</div><div class='add'>+glusterfs_graph_cleanup(void *arg)</div><div class='add'>+{</div><div class='add'>+    glusterfs_graph_t *graph = NULL;</div><div class='add'>+    glusterfs_ctx_t *ctx = THIS-&gt;ctx;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    graph = arg;</div><div class='add'>+</div><div class='add'>+    if (!graph)</div><div class='add'>+        return NULL;</div><div class='add'>+</div><div class='add'>+    /* To destroy the graph, fitst sent a GF_EVENT_PARENT_DOWN</div><div class='add'>+     * Then wait for GF_EVENT_CHILD_DOWN to get on the top</div><div class='add'>+     * xl. Once we have GF_EVENT_CHILD_DOWN event, then proceed</div><div class='add'>+     * to fini.</div><div class='add'>+     *</div><div class='add'>+     * During fini call, this will take a last unref on rpc and</div><div class='add'>+     * rpc_transport_object.</div><div class='add'>+     */</div><div class='add'>+    if (graph-&gt;first)</div><div class='add'>+        default_notify(graph-&gt;first, GF_EVENT_PARENT_DOWN, graph-&gt;first);</div><div class='add'>+</div><div class='add'>+    ret = pthread_mutex_lock(&amp;graph-&gt;mutex);</div><div class='add'>+    if (ret != 0) {</div><div class='add'>+        gf_msg("glusterfs", GF_LOG_ERROR, EAGAIN, LG_MSG_GRAPH_CLEANUP_FAILED,</div><div class='add'>+               "Failed to acquire a lock");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    /* check and wait for CHILD_DOWN for top xlator*/</div><div class='add'>+    while (graph-&gt;used) {</div><div class='add'>+        ret = pthread_cond_wait(&amp;graph-&gt;child_down_cond, &amp;graph-&gt;mutex);</div><div class='add'>+        if (ret != 0)</div><div class='add'>+            gf_msg("glusterfs", GF_LOG_INFO, 0, LG_MSG_GRAPH_CLEANUP_FAILED,</div><div class='add'>+                   "cond wait failed ");</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = pthread_mutex_unlock(&amp;graph-&gt;mutex);</div><div class='add'>+    if (ret != 0) {</div><div class='add'>+        gf_msg("glusterfs", GF_LOG_ERROR, EAGAIN, LG_MSG_GRAPH_CLEANUP_FAILED,</div><div class='add'>+               "Failed to release a lock");</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Though we got a child down on top xlator, we have to wait until</div><div class='add'>+     * all the notifier to exit. Because there should not be any threads</div><div class='add'>+     * that access xl variables.</div><div class='add'>+     */</div><div class='add'>+    pthread_mutex_lock(&amp;ctx-&gt;notify_lock);</div><div class='add'>+    {</div><div class='add'>+        while (ctx-&gt;notifying)</div><div class='add'>+            pthread_cond_wait(&amp;ctx-&gt;notify_cond, &amp;ctx-&gt;notify_lock);</div><div class='add'>+    }</div><div class='add'>+    pthread_mutex_unlock(&amp;ctx-&gt;notify_lock);</div><div class='add'>+</div><div class='add'>+    pthread_mutex_lock(&amp;ctx-&gt;cleanup_lock);</div><div class='add'>+    {</div><div class='add'>+        glusterfs_graph_fini(graph);</div><div class='add'>+        glusterfs_graph_destroy(graph);</div><div class='add'>+    }</div><div class='add'>+    pthread_mutex_unlock(&amp;ctx-&gt;cleanup_lock);</div><div class='add'>+out:</div><div class='add'>+    return NULL;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+glusterfs_graph_t *</div><div class='add'>+glusterfs_muxsvc_setup_parent_graph(glusterfs_ctx_t *ctx, char *name,</div><div class='add'>+                                    char *type)</div><div class='add'>+{</div><div class='add'>+    glusterfs_graph_t *parent_graph = NULL;</div><div class='add'>+    xlator_t *ixl = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    parent_graph = GF_CALLOC(1, sizeof(*parent_graph),</div><div class='add'>+                             gf_common_mt_glusterfs_graph_t);</div><div class='add'>+    if (!parent_graph)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    INIT_LIST_HEAD(&amp;parent_graph-&gt;list);</div><div class='add'>+</div><div class='add'>+    ctx-&gt;active = parent_graph;</div><div class='add'>+    ixl = GF_CALLOC(1, sizeof(*ixl), gf_common_mt_xlator_t);</div><div class='add'>+    if (!ixl)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    ixl-&gt;ctx = ctx;</div><div class='add'>+    ixl-&gt;graph = parent_graph;</div><div class='add'>+    ixl-&gt;options = dict_new();</div><div class='add'>+    if (!ixl-&gt;options)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    ixl-&gt;name = gf_strdup(name);</div><div class='add'>+    if (!ixl-&gt;name)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    ixl-&gt;is_autoloaded = 1;</div><div class='add'>+</div><div class='add'>+    if (xlator_set_type(ixl, type) == -1) {</div><div class='add'>+        gf_msg("glusterfs", GF_LOG_ERROR, EINVAL, LG_MSG_GRAPH_SETUP_FAILED,</div><div class='add'>+               "%s (%s) set type failed", name, type);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    glusterfs_graph_set_first(parent_graph, ixl);</div><div class='add'>+    parent_graph-&gt;top = ixl;</div><div class='add'>+    ixl = NULL;</div><div class='add'>+</div><div class='add'>+    gettimeofday(&amp;parent_graph-&gt;dob, NULL);</div><div class='add'>+    fill_uuid(parent_graph-&gt;graph_uuid, 128, parent_graph-&gt;dob);</div><div class='add'>+    parent_graph-&gt;id = ctx-&gt;graph_id++;</div><div class='add'>+    ret = 0;</div><div class='add'>+out:</div><div class='add'>+    if (ixl)</div><div class='add'>+        xlator_destroy(ixl);</div><div class='add'>+</div><div class='add'>+    if (ret) {</div><div class='add'>+        glusterfs_muxsvc_cleanup_parent(ctx, parent_graph);</div><div class='add'>+        parent_graph = NULL;</div><div class='add'>+    }</div><div class='add'>+    return parent_graph;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+glusterfs_svc_mux_pidfile_cleanup(gf_volfile_t *volfile_obj)</div><div class='add'>+{</div><div class='add'>+    if (!volfile_obj || !volfile_obj-&gt;pidfp)</div><div class='ctx'>         return 0;</div><div class='add'>+</div><div class='add'>+    gf_msg_trace("glusterfsd", 0, "pidfile %s cleanup", volfile_obj-&gt;vol_id);</div><div class='add'>+</div><div class='add'>+    lockf(fileno(volfile_obj-&gt;pidfp), F_ULOCK, 0);</div><div class='add'>+    fclose(volfile_obj-&gt;pidfp);</div><div class='add'>+    volfile_obj-&gt;pidfp = NULL;</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+glusterfs_process_svc_detach(glusterfs_ctx_t *ctx, gf_volfile_t *volfile_obj)</div><div class='add'>+{</div><div class='add'>+    xlator_t *last_xl = NULL;</div><div class='add'>+    glusterfs_graph_t *graph = NULL;</div><div class='add'>+    glusterfs_graph_t *parent_graph = NULL;</div><div class='add'>+    pthread_t clean_graph = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int ret = -1;</div><div class='add'>+    xlator_t *xl = NULL;</div><div class='add'>+</div><div class='add'>+    if (!ctx || !ctx-&gt;active || !volfile_obj)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    pthread_mutex_lock(&amp;ctx-&gt;cleanup_lock);</div><div class='add'>+    {</div><div class='add'>+        parent_graph = ctx-&gt;active;</div><div class='add'>+        graph = volfile_obj-&gt;graph;</div><div class='add'>+        if (!graph)</div><div class='add'>+            goto unlock;</div><div class='add'>+        if (graph-&gt;first)</div><div class='add'>+            xl = graph-&gt;first;</div><div class='add'>+</div><div class='add'>+        last_xl = graph-&gt;last_xl;</div><div class='add'>+        if (last_xl)</div><div class='add'>+            last_xl-&gt;next = NULL;</div><div class='add'>+        if (!xl || xl-&gt;cleanup_starting)</div><div class='add'>+            goto unlock;</div><div class='add'>+</div><div class='add'>+        xl-&gt;cleanup_starting = 1;</div><div class='add'>+        gf_msg("mgmt", GF_LOG_INFO, 0, LG_MSG_GRAPH_DETACH_STARTED,</div><div class='add'>+               "detaching child %s", volfile_obj-&gt;vol_id);</div><div class='add'>+</div><div class='add'>+        list_del_init(&amp;volfile_obj-&gt;volfile_list);</div><div class='add'>+        glusterfs_mux_xlator_unlink(parent_graph-&gt;top, xl);</div><div class='add'>+        glusterfs_svc_mux_pidfile_cleanup(volfile_obj);</div><div class='add'>+        parent_graph-&gt;last_xl = glusterfs_get_last_xlator(parent_graph);</div><div class='add'>+        parent_graph-&gt;xl_count -= graph-&gt;xl_count;</div><div class='add'>+        parent_graph-&gt;leaf_count -= graph-&gt;leaf_count;</div><div class='add'>+        parent_graph-&gt;id++;</div><div class='add'>+        ret = 0;</div><div class='add'>+    }</div><div class='add'>+unlock:</div><div class='add'>+    pthread_mutex_unlock(&amp;ctx-&gt;cleanup_lock);</div><div class='add'>+out:</div><div class='add'>+    if (!ret) {</div><div class='add'>+        list_del_init(&amp;volfile_obj-&gt;volfile_list);</div><div class='add'>+        if (graph) {</div><div class='add'>+            ret = gf_thread_create_detached(</div><div class='add'>+                &amp;clean_graph, glusterfs_graph_cleanup, graph, "graph_clean");</div><div class='add'>+            if (ret) {</div><div class='add'>+                gf_msg("glusterfs", GF_LOG_ERROR, EINVAL,</div><div class='add'>+                       LG_MSG_GRAPH_CLEANUP_FAILED,</div><div class='add'>+                       "%s failed to create clean "</div><div class='add'>+                       "up thread",</div><div class='add'>+                       volfile_obj-&gt;vol_id);</div><div class='add'>+                ret = 0;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+        GF_FREE(volfile_obj);</div><div class='add'>+    }</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+glusterfs_svc_mux_pidfile_setup(gf_volfile_t *volfile_obj, const char *pid_file)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    FILE *pidfp = NULL;</div><div class='add'>+</div><div class='add'>+    if (!pid_file || !volfile_obj)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    if (volfile_obj-&gt;pidfp) {</div><div class='add'>+        ret = 0;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    pidfp = fopen(pid_file, "a+");</div><div class='add'>+    if (!pidfp) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    volfile_obj-&gt;pidfp = pidfp;</div><div class='add'>+</div><div class='add'>+    ret = lockf(fileno(pidfp), F_TLOCK, 0);</div><div class='add'>+    if (ret) {</div><div class='add'>+        ret = 0;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+int</div><div class='add'>+glusterfs_svc_mux_pidfile_update(gf_volfile_t *volfile_obj,</div><div class='add'>+                                 const char *pid_file, pid_t pid)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+    FILE *pidfp = NULL;</div><div class='add'>+    int old_pid;</div><div class='add'>+</div><div class='add'>+    if (!volfile_obj-&gt;pidfp) {</div><div class='add'>+        ret = glusterfs_svc_mux_pidfile_setup(volfile_obj, pid_file);</div><div class='add'>+        if (ret == -1)</div><div class='add'>+            goto out;</div><div class='add'>+    }</div><div class='add'>+    pidfp = volfile_obj-&gt;pidfp;</div><div class='add'>+    ret = fscanf(pidfp, "%d", &amp;old_pid);</div><div class='add'>+    if (ret &lt;= 0) {</div><div class='add'>+        goto update;</div><div class='add'>+    }</div><div class='add'>+    if (old_pid == pid) {</div><div class='add'>+        ret = 0;</div><div class='add'>+        goto out;</div><div class='add'>+    } else {</div><div class='add'>+        gf_msg("mgmt", GF_LOG_INFO, 0, LG_MSG_GRAPH_ATTACH_PID_FILE_UPDATED,</div><div class='add'>+               "Old pid=%d found in pidfile %s. Cleaning the old pid and "</div><div class='add'>+               "Updating new pid=%d",</div><div class='add'>+               old_pid, pid_file, pid);</div><div class='add'>+    }</div><div class='add'>+update:</div><div class='add'>+    ret = sys_ftruncate(fileno(pidfp), 0);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_msg("glusterfsd", GF_LOG_ERROR, errno,</div><div class='add'>+               LG_MSG_GRAPH_ATTACH_PID_FILE_UPDATED,</div><div class='add'>+               "pidfile %s truncation failed", pid_file);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = fprintf(pidfp, "%d\n", pid);</div><div class='add'>+    if (ret &lt;= 0) {</div><div class='add'>+        gf_msg("glusterfsd", GF_LOG_ERROR, errno,</div><div class='add'>+               LG_MSG_GRAPH_ATTACH_PID_FILE_UPDATED, "pidfile %s write failed",</div><div class='add'>+               pid_file);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = fflush(pidfp);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_msg("glusterfsd", GF_LOG_ERROR, errno,</div><div class='add'>+               LG_MSG_GRAPH_ATTACH_PID_FILE_UPDATED, "pidfile %s write failed",</div><div class='add'>+               pid_file);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='add'>+int</div><div class='add'>+glusterfs_update_mux_pid(dict_t *dict, gf_volfile_t *volfile_obj)</div><div class='add'>+{</div><div class='add'>+    char *file = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    GF_VALIDATE_OR_GOTO("graph", dict, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("graph", volfile_obj, out);</div><div class='add'>+</div><div class='add'>+    ret = dict_get_str(dict, "pidfile", &amp;file);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        gf_msg("mgmt", GF_LOG_ERROR, EINVAL, LG_MSG_GRAPH_SETUP_FAILED,</div><div class='add'>+               "Failed to get pidfile from dict for  volfile_id=%s",</div><div class='add'>+               volfile_obj-&gt;vol_id);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = glusterfs_svc_mux_pidfile_update(volfile_obj, file, getpid());</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        gf_msg("mgmt", GF_LOG_ERROR, EINVAL, LG_MSG_GRAPH_SETUP_FAILED,</div><div class='add'>+               "Failed to update "</div><div class='add'>+               "the pidfile for volfile_id=%s",</div><div class='add'>+               volfile_obj-&gt;vol_id);</div><div class='add'>+</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (ret == 1)</div><div class='add'>+        gf_msg("mgmt", GF_LOG_INFO, 0, LG_MSG_GRAPH_ATTACH_PID_FILE_UPDATED,</div><div class='add'>+               "PID %d updated in pidfile=%s", getpid(), file);</div><div class='add'>+    ret = 0;</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+int</div><div class='add'>+glusterfs_process_svc_attach_volfp(glusterfs_ctx_t *ctx, FILE *fp,</div><div class='add'>+                                   char *volfile_id, char *checksum,</div><div class='add'>+                                   dict_t *dict)</div><div class='add'>+{</div><div class='add'>+    glusterfs_graph_t *graph = NULL;</div><div class='add'>+    glusterfs_graph_t *parent_graph = NULL;</div><div class='add'>+    glusterfs_graph_t *clean_graph = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    xlator_t *xl = NULL;</div><div class='add'>+    xlator_t *last_xl = NULL;</div><div class='add'>+    gf_volfile_t *volfile_obj = NULL;</div><div class='add'>+    pthread_t thread_id = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    if (!ctx)</div><div class='add'>+        goto out;</div><div class='add'>+    parent_graph = ctx-&gt;active;</div><div class='add'>+    graph = glusterfs_graph_construct(fp);</div><div class='add'>+    if (!graph) {</div><div class='add'>+        gf_msg("glusterfsd", GF_LOG_ERROR, EINVAL, LG_MSG_GRAPH_ATTACH_FAILED,</div><div class='add'>+               "failed to construct the graph");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    graph-&gt;parent_down = 0;</div><div class='add'>+    graph-&gt;last_xl = glusterfs_get_last_xlator(graph);</div><div class='add'>+</div><div class='add'>+    for (xl = graph-&gt;first; xl; xl = xl-&gt;next) {</div><div class='add'>+        if (strcmp(xl-&gt;type, "mount/fuse") == 0) {</div><div class='add'>+            gf_msg("glusterfsd", GF_LOG_ERROR, EINVAL,</div><div class='add'>+                   LG_MSG_GRAPH_ATTACH_FAILED,</div><div class='add'>+                   "fuse xlator cannot be specified in volume file");</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    graph-&gt;leaf_count = glusterfs_count_leaves(glusterfs_root(graph));</div><div class='add'>+    xl = graph-&gt;first;</div><div class='add'>+    /* TODO memory leaks everywhere need to free graph in case of error */</div><div class='add'>+    if (glusterfs_graph_prepare(graph, ctx, xl-&gt;name)) {</div><div class='add'>+        gf_msg("glusterfsd", GF_LOG_WARNING, EINVAL, LG_MSG_GRAPH_ATTACH_FAILED,</div><div class='add'>+               "failed to prepare graph for xlator %s", xl-&gt;name);</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    } else if (glusterfs_graph_init(graph)) {</div><div class='add'>+        gf_msg("glusterfsd", GF_LOG_WARNING, EINVAL, LG_MSG_GRAPH_ATTACH_FAILED,</div><div class='add'>+               "failed to initialize graph for xlator %s", xl-&gt;name);</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    } else if (glusterfs_graph_parent_up(graph)) {</div><div class='add'>+        gf_msg("glusterfsd", GF_LOG_WARNING, EINVAL, LG_MSG_GRAPH_ATTACH_FAILED,</div><div class='add'>+               "failed to link the graphs for xlator %s ", xl-&gt;name);</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (!parent_graph) {</div><div class='add'>+        parent_graph = glusterfs_muxsvc_setup_parent_graph(ctx, "glustershd",</div><div class='add'>+                                                           "debug/io-stats");</div><div class='add'>+        if (!parent_graph)</div><div class='add'>+            goto out;</div><div class='add'>+        ((xlator_t *)parent_graph-&gt;top)-&gt;next = xl;</div><div class='add'>+        clean_graph = parent_graph;</div><div class='add'>+    } else {</div><div class='add'>+        last_xl = parent_graph-&gt;last_xl;</div><div class='add'>+        if (last_xl)</div><div class='add'>+            last_xl-&gt;next = xl;</div><div class='add'>+        xl-&gt;prev = last_xl;</div><div class='add'>+    }</div><div class='add'>+    parent_graph-&gt;last_xl = graph-&gt;last_xl;</div><div class='add'>+</div><div class='add'>+    ret = glusterfs_xlator_link(parent_graph-&gt;top, xl);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_msg("graph", GF_LOG_ERROR, 0, LG_MSG_EVENT_NOTIFY_FAILED,</div><div class='add'>+               "parent up notification failed");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    parent_graph-&gt;xl_count += graph-&gt;xl_count;</div><div class='add'>+    parent_graph-&gt;leaf_count += graph-&gt;leaf_count;</div><div class='add'>+    parent_graph-&gt;id++;</div><div class='add'>+</div><div class='add'>+    volfile_obj = GF_CALLOC(1, sizeof(gf_volfile_t), gf_common_volfile_t);</div><div class='add'>+    if (!volfile_obj) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    volfile_obj-&gt;pidfp = NULL;</div><div class='add'>+    snprintf(volfile_obj-&gt;vol_id, sizeof(volfile_obj-&gt;vol_id), "%s",</div><div class='add'>+             volfile_id);</div><div class='add'>+</div><div class='add'>+    if (strcmp(ctx-&gt;cmd_args.process_name, "glustershd") == 0) {</div><div class='add'>+        ret = glusterfs_update_mux_pid(dict, volfile_obj);</div><div class='add'>+        if (ret == -1) {</div><div class='add'>+            GF_FREE(volfile_obj);</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    graph-&gt;used = 1;</div><div class='add'>+    parent_graph-&gt;id++;</div><div class='add'>+    list_add(&amp;graph-&gt;list, &amp;ctx-&gt;graphs);</div><div class='add'>+    INIT_LIST_HEAD(&amp;volfile_obj-&gt;volfile_list);</div><div class='add'>+    volfile_obj-&gt;graph = graph;</div><div class='add'>+    memcpy(volfile_obj-&gt;volfile_checksum, checksum,</div><div class='add'>+           sizeof(volfile_obj-&gt;volfile_checksum));</div><div class='add'>+    list_add_tail(&amp;volfile_obj-&gt;volfile_list, &amp;ctx-&gt;volfile_list);</div><div class='add'>+    gf_log_dump_graph(fp, graph);</div><div class='add'>+    graph = NULL;</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+out:</div><div class='add'>+    if (ret) {</div><div class='add'>+        if (graph) {</div><div class='add'>+            gluster_graph_take_reference(graph-&gt;first);</div><div class='add'>+            ret = gf_thread_create_detached(&amp;thread_id, glusterfs_graph_cleanup,</div><div class='add'>+                                            graph, "graph_clean");</div><div class='add'>+            if (ret) {</div><div class='add'>+                gf_msg("glusterfs", GF_LOG_ERROR, EINVAL,</div><div class='add'>+                       LG_MSG_GRAPH_CLEANUP_FAILED,</div><div class='add'>+                       "%s failed to create clean "</div><div class='add'>+                       "up thread",</div><div class='add'>+                       volfile_id);</div><div class='add'>+                ret = 0;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+        if (clean_graph)</div><div class='add'>+            glusterfs_muxsvc_cleanup_parent(ctx, clean_graph);</div><div class='add'>+    }</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+glusterfs_mux_volfile_reconfigure(FILE *newvolfile_fp, glusterfs_ctx_t *ctx,</div><div class='add'>+                                  gf_volfile_t *volfile_obj, char *checksum,</div><div class='add'>+                                  dict_t *dict)</div><div class='add'>+{</div><div class='add'>+    glusterfs_graph_t *oldvolfile_graph = NULL;</div><div class='add'>+    glusterfs_graph_t *newvolfile_graph = NULL;</div><div class='add'>+    char vol_id[NAME_MAX + 1];</div><div class='add'>+</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    if (!ctx) {</div><div class='add'>+        gf_msg("glusterfsd-mgmt", GF_LOG_ERROR, 0, LG_MSG_CTX_NULL,</div><div class='add'>+               "ctx is NULL");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Change the message id */</div><div class='add'>+    if (!volfile_obj) {</div><div class='add'>+        gf_msg("glusterfsd-mgmt", GF_LOG_ERROR, 0, LG_MSG_CTX_NULL,</div><div class='add'>+               "failed to get volfile object");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    oldvolfile_graph = volfile_obj-&gt;graph;</div><div class='add'>+    if (!oldvolfile_graph) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    newvolfile_graph = glusterfs_graph_construct(newvolfile_fp);</div><div class='add'>+</div><div class='add'>+    if (!newvolfile_graph) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    newvolfile_graph-&gt;last_xl = glusterfs_get_last_xlator(newvolfile_graph);</div><div class='add'>+</div><div class='add'>+    glusterfs_graph_prepare(newvolfile_graph, ctx, newvolfile_graph-&gt;first);</div><div class='add'>+</div><div class='add'>+    if (!is_graph_topology_equal(oldvolfile_graph, newvolfile_graph)) {</div><div class='add'>+        ret = snprintf(vol_id, sizeof(vol_id), "%s", volfile_obj-&gt;vol_id);</div><div class='add'>+        if (ret &lt; 0)</div><div class='add'>+            goto out;</div><div class='add'>+        ret = glusterfs_process_svc_detach(ctx, volfile_obj);</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_msg("glusterfsd-mgmt", GF_LOG_ERROR, EINVAL,</div><div class='add'>+                   LG_MSG_GRAPH_CLEANUP_FAILED,</div><div class='add'>+                   "Could not detach "</div><div class='add'>+                   "old graph. Aborting the reconfiguration operation");</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+        volfile_obj = NULL;</div><div class='add'>+        ret = glusterfs_process_svc_attach_volfp(ctx, newvolfile_fp, vol_id,</div><div class='add'>+                                                 checksum, dict);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    gf_msg_debug("glusterfsd-mgmt", 0,</div><div class='add'>+                 "Only options have changed in the"</div><div class='add'>+                 " new graph");</div><div class='add'>+</div><div class='add'>+    ret = glusterfs_graph_reconfigure(oldvolfile_graph, newvolfile_graph);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_msg_debug("glusterfsd-mgmt", 0,</div><div class='add'>+                     "Could not reconfigure "</div><div class='add'>+                     "new options in old graph");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    memcpy(volfile_obj-&gt;volfile_checksum, checksum,</div><div class='add'>+           sizeof(volfile_obj-&gt;volfile_checksum));</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+out:</div><div class='add'>+</div><div class='add'>+    if (newvolfile_graph)</div><div class='add'>+        glusterfs_graph_destroy(newvolfile_graph);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='head'>diff --git a/libglusterfs/src/graph.l b/libglusterfs/src/graph.l<br/>index f7a02e48107..b9d4b2b6828 100644<br/>--- a/<a href='/cgit/glusterfs.git/tree/libglusterfs/src/graph.l?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/graph.l</a><br/>+++ b/<a href='/cgit/glusterfs.git/tree/libglusterfs/src/graph.l?id=d1d7a6f35c816822fab51c820e25023863c239c1'>libglusterfs/src/graph.l</a></div><div class='hunk'>@@ -1,60 +1,40 @@</div><div class='ctx'> /*</div><div class='del'>-   Copyright (c) 2006-2009 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='add'>+   Copyright (c) 2006-2012 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='ctx'>    This file is part of GlusterFS.</div><div class='ctx'> </div><div class='del'>-   GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-   it under the terms of the GNU General Public License as published</div><div class='del'>-   by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-   or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-   GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-   WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-   General Public License for more details.</div><div class='del'>-</div><div class='del'>-   You should have received a copy of the GNU General Public License</div><div class='del'>-   along with this program.  If not, see</div><div class='del'>-   &lt;http://www.gnu.org/licenses/&gt;.</div><div class='add'>+   This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+   General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+   later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+   cases as published by the Free Software Foundation.</div><div class='ctx'> */</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> %x STRING</div><div class='ctx'> %option yylineno</div><div class='ctx'> %option noinput</div><div class='ctx'> %{</div><div class='ctx'> </div><div class='ctx'> #define YYSTYPE char *</div><div class='del'>-#include "xlator.h"</div><div class='add'>+#include "glusterfs/xlator.h"</div><div class='ctx'> #include "y.tab.h"</div><div class='ctx'> #include &lt;string.h&gt;</div><div class='del'>-#define START_STRSIZE	32</div><div class='ctx'> </div><div class='ctx'> static char *text;</div><div class='del'>-static int text_asize;</div><div class='ctx'> static int text_size;</div><div class='ctx'> </div><div class='ctx'> void append_string(const char *str, int size)</div><div class='ctx'> {</div><div class='del'>-	int new_size = text_size + size + 1;</div><div class='del'>-	if (new_size &gt; text_asize) {</div><div class='del'>-		new_size += START_STRSIZE - 1;</div><div class='del'>-		new_size &amp;= -START_STRSIZE;</div><div class='del'>-                if (!text) {</div><div class='del'>-                        text = GF_CALLOC (1, new_size,</div><div class='del'>-                                          gf_common_mt_char);</div><div class='del'>-                } else {</div><div class='del'>-                        text = GF_REALLOC (text, new_size);</div><div class='del'>-                }</div><div class='del'>-                if (!text) {</div><div class='del'>-                        gf_log ("parser", GF_LOG_ERROR,</div><div class='del'>-                                "out of memory");</div><div class='del'>-                        return;</div><div class='del'>-                }</div><div class='del'>-		text_asize = new_size;</div><div class='del'>-	}</div><div class='del'>-        memcpy(text + text_size, str, size);</div><div class='del'>-	text_size += size;</div><div class='del'>-	text[text_size] = 0;</div><div class='add'>+    int new_size = text_size + size + 1;</div><div class='add'>+    if (!text) {</div><div class='add'>+        text = GF_CALLOC (1, new_size, gf_common_mt_char);</div><div class='add'>+    } else {</div><div class='add'>+        text = GF_REALLOC (text, new_size);</div><div class='add'>+    }</div><div class='add'>+    if (!text) {</div><div class='add'>+        return;</div><div class='add'>+    }</div><div class='add'>+    memcpy(text + text_size, str, size);</div><div class='add'>+    text_size += size;</div><div class='add'>+    text[text_size] = 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> %}</div><div class='hunk'>@@ -77,13 +57,15 @@ TYPE   [t][y][p][e]</div><div class='ctx'>        \\.        {    append_string (yytext + 1, yyleng - 1); }</div><div class='ctx'>        \"         {</div><div class='ctx'>                        if (0) {</div><div class='del'>-                              yyunput (0, NULL);</div><div class='add'>+                           yyunput (0, NULL);</div><div class='ctx'>                        }</div><div class='ctx'>                        BEGIN (INITIAL);</div><div class='del'>-                       yylval = text;</div><div class='add'>+                       graphyylval = text;</div><div class='add'>+                       text = NULL;</div><div class='add'>+                       text_size = 0;</div><div class='ctx'>                        return STRING_TOK;</div><div class='del'>-       }</div><div class='add'>+                  }</div><div class='ctx'> }</div><div class='del'>-[^ \t\r\n\"\\]+ {    yylval = gf_strdup (yytext) ; return ID; }</div><div class='add'>+[^ \t\r\n\"\\]+ {    graphyylval = gf_strdup (yytext) ; return ID; }</div><div class='ctx'> [ \t\r\n]+             ;</div><div class='ctx'> %%</div><div class='head'>diff --git a/libglusterfs/src/graph.y b/libglusterfs/src/graph.y<br/>index 14afaae6475..e63febdc08b 100644<br/>--- a/<a href='/cgit/glusterfs.git/tree/libglusterfs/src/graph.y?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/graph.y</a><br/>+++ b/<a href='/cgit/glusterfs.git/tree/libglusterfs/src/graph.y?id=d1d7a6f35c816822fab51c820e25023863c239c1'>libglusterfs/src/graph.y</a></div><div class='hunk'>@@ -1,23 +1,13 @@</div><div class='ctx'> /*</div><div class='del'>-   Copyright (c) 2006-2009 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='add'>+   Copyright (c) 2006-2012 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='ctx'>    This file is part of GlusterFS.</div><div class='ctx'> </div><div class='del'>-   GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-   it under the terms of the GNU General Public License as published</div><div class='del'>-   by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-   or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-   GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-   WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-   General Public License for more details.</div><div class='del'>-</div><div class='del'>-   You should have received a copy of the GNU General Public License</div><div class='del'>-   along with this program.  If not, see</div><div class='del'>-   &lt;http://www.gnu.org/licenses/&gt;.</div><div class='add'>+   This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+   General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+   later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+   cases as published by the Free Software Foundation.</div><div class='ctx'> */</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> %token VOLUME_BEGIN VOLUME_END OPTION NEWLINE SUBVOLUME ID WHITESPACE COMMENT TYPE STRING_TOK</div><div class='ctx'> </div><div class='ctx'> %{</div><div class='hunk'>@@ -28,9 +18,15 @@</div><div class='ctx'> #include &lt;sys/mman.h&gt;</div><div class='ctx'> #include &lt;sys/types.h&gt;</div><div class='ctx'> #include &lt;sys/wait.h&gt;</div><div class='add'>+#include &lt;pthread.h&gt;</div><div class='ctx'> </div><div class='del'>-#include "xlator.h"</div><div class='del'>-#include "logging.h"</div><div class='add'>+#define RELAX_POISONING</div><div class='add'>+</div><div class='add'>+#include "glusterfs/xlator.h"</div><div class='add'>+#include "glusterfs/graph-utils.h"</div><div class='add'>+#include "glusterfs/logging.h"</div><div class='add'>+#include "glusterfs/syscall.h"</div><div class='add'>+#include "glusterfs/libglusterfs-messages.h"</div><div class='ctx'> </div><div class='ctx'> static int new_volume (char *name);</div><div class='ctx'> static int volume_type (char *type);</div><div class='hunk'>@@ -44,8 +40,8 @@ static void option_error (void);</div><div class='ctx'> #define YYSTYPE char *</div><div class='ctx'> #define GF_CMD_BUFFER_LEN (8 * GF_UNIT_KB)</div><div class='ctx'> </div><div class='del'>-int yyerror (const char *);</div><div class='del'>-int yylex ();</div><div class='add'>+int graphyyerror (const char *);</div><div class='add'>+int graphyylex ();</div><div class='ctx'> %}</div><div class='ctx'> </div><div class='ctx'> </div><div class='hunk'>@@ -85,11 +81,11 @@ glusterfs_graph_t *construct;</div><div class='ctx'> static void</div><div class='ctx'> type_error (void)</div><div class='ctx'> {</div><div class='del'>-        extern int yylineno;</div><div class='add'>+        extern int graphyylineno;</div><div class='ctx'> </div><div class='del'>-        gf_log ("parser", GF_LOG_ERROR,</div><div class='add'>+        gf_msg ("parser", GF_LOG_ERROR, 0, LG_MSG_VOLFILE_PARSE_ERROR,</div><div class='ctx'>                 "Volume %s, before line %d: Please specify volume type",</div><div class='del'>-                curr-&gt;name, yylineno);</div><div class='add'>+                curr-&gt;name, graphyylineno);</div><div class='ctx'>         return;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='hunk'>@@ -97,11 +93,11 @@ type_error (void)</div><div class='ctx'> static void</div><div class='ctx'> sub_error (void)</div><div class='ctx'> {</div><div class='del'>-        extern int yylineno;</div><div class='add'>+        extern int graphyylineno;</div><div class='ctx'> </div><div class='del'>-        gf_log ("parser", GF_LOG_ERROR,</div><div class='add'>+        gf_msg ("parser", GF_LOG_ERROR, 0, LG_MSG_VOLFILE_PARSE_ERROR,</div><div class='ctx'>                 "Volume %s, before line %d: Please specify subvolumes",</div><div class='del'>-                curr-&gt;name, yylineno);</div><div class='add'>+                curr-&gt;name, graphyylineno);</div><div class='ctx'>         return;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='hunk'>@@ -109,12 +105,12 @@ sub_error (void)</div><div class='ctx'> static void</div><div class='ctx'> option_error (void)</div><div class='ctx'> {</div><div class='del'>-        extern int yylineno;</div><div class='add'>+        extern int graphyylineno;</div><div class='ctx'> </div><div class='del'>-        gf_log ("parser", GF_LOG_ERROR,</div><div class='add'>+        gf_msg ("parser", GF_LOG_ERROR, 0, LG_MSG_VOLFILE_PARSE_ERROR,</div><div class='ctx'>                 "Volume %s, before line %d: Please specify "</div><div class='ctx'>                 "option &lt;key&gt; &lt;value&gt;",</div><div class='del'>-                curr-&gt;name, yylineno);</div><div class='add'>+                curr-&gt;name, graphyylineno);</div><div class='ctx'>         return;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='hunk'>@@ -122,21 +118,20 @@ option_error (void)</div><div class='ctx'> static int</div><div class='ctx'> new_volume (char *name)</div><div class='ctx'> {</div><div class='del'>-        extern int   yylineno;</div><div class='add'>+        extern int   graphyylineno;</div><div class='ctx'>         xlator_t    *trav = NULL;</div><div class='ctx'>         int          ret = 0;</div><div class='ctx'> </div><div class='ctx'>         if (!name) {</div><div class='del'>-                gf_log ("parser", GF_LOG_DEBUG,</div><div class='del'>-			"Invalid argument name: '%s'", name);</div><div class='add'>+                gf_msg_debug ("parser", 0,"Invalid argument name");</div><div class='ctx'>                 ret = -1;</div><div class='ctx'>                 goto out;</div><div class='ctx'>         }</div><div class='ctx'> </div><div class='ctx'>         if (curr) {</div><div class='del'>-                gf_log ("parser", GF_LOG_ERROR,</div><div class='del'>-                        "new volume (%s) defintion in line %d unexpected",</div><div class='del'>-                        name, yylineno);</div><div class='add'>+                gf_msg ("parser", GF_LOG_ERROR, 0, LG_MSG_INVALID_ENTRY,</div><div class='add'>+                        "new volume (%s) definition in line %d unexpected",</div><div class='add'>+                        name, graphyylineno);</div><div class='ctx'>                 ret = -1;</div><div class='ctx'>                 goto out;</div><div class='ctx'>         }</div><div class='hunk'>@@ -145,7 +140,6 @@ new_volume (char *name)</div><div class='ctx'>                                    gf_common_mt_xlator_t);</div><div class='ctx'> </div><div class='ctx'>         if (!curr) {</div><div class='del'>-                gf_log ("parser", GF_LOG_ERROR, "Out of memory");</div><div class='ctx'>                 ret = -1;</div><div class='ctx'>                 goto out;</div><div class='ctx'>         }</div><div class='hunk'>@@ -154,9 +148,9 @@ new_volume (char *name)</div><div class='ctx'> </div><div class='ctx'>         while (trav) {</div><div class='ctx'>                 if (!strcmp (name, trav-&gt;name)) {</div><div class='del'>-                        gf_log ("parser", GF_LOG_ERROR,</div><div class='del'>-				"Line %d: volume '%s' defined again",</div><div class='del'>-                                yylineno, name);</div><div class='add'>+                        gf_msg ("parser", GF_LOG_ERROR, 0,</div><div class='add'>+                                LG_MSG_VOLFILE_PARSE_ERROR, "Line %d: volume "</div><div class='add'>+                                "'%s' defined again", graphyylineno, name);</div><div class='ctx'>                         ret = -1;</div><div class='ctx'>                         goto out;</div><div class='ctx'>                 }</div><div class='hunk'>@@ -170,7 +164,8 @@ new_volume (char *name)</div><div class='ctx'>                 goto out;</div><div class='ctx'>         }</div><div class='ctx'> </div><div class='del'>-        curr-&gt;options = get_new_dict ();</div><div class='add'>+        INIT_LIST_HEAD(&amp;curr-&gt;volume_options);</div><div class='add'>+        curr-&gt;options = dict_new ();</div><div class='ctx'> </div><div class='ctx'>         if (!curr-&gt;options) {</div><div class='ctx'>                 GF_FREE (curr-&gt;name);</div><div class='hunk'>@@ -188,8 +183,9 @@ new_volume (char *name)</div><div class='ctx'>         construct-&gt;first = curr;</div><div class='ctx'> </div><div class='ctx'>         construct-&gt;xl_count++;</div><div class='add'>+        curr-&gt;xl_id = construct-&gt;xl_count;</div><div class='ctx'> </div><div class='del'>-        gf_log ("parser", GF_LOG_TRACE, "New node for '%s'", name);</div><div class='add'>+        gf_msg_trace ("parser", 0, "New node for '%s'", name);</div><div class='ctx'> </div><div class='ctx'> out:</div><div class='ctx'>         GF_FREE (name);</div><div class='hunk'>@@ -201,26 +197,26 @@ out:</div><div class='ctx'> static int</div><div class='ctx'> volume_type (char *type)</div><div class='ctx'> {</div><div class='del'>-        extern int   yylineno;</div><div class='add'>+        extern int   graphyylineno;</div><div class='ctx'>         int32_t      ret = 0;</div><div class='ctx'> </div><div class='ctx'>         if (!type) {</div><div class='del'>-                gf_log ("parser", GF_LOG_DEBUG, "Invalid argument type");</div><div class='add'>+                gf_msg_debug ("parser", 0, "Invalid argument type");</div><div class='ctx'>                 ret = -1;</div><div class='ctx'>                 goto out;</div><div class='ctx'>         }</div><div class='ctx'> </div><div class='ctx'>         ret = xlator_set_type (curr, type);</div><div class='ctx'>         if (ret) {</div><div class='del'>-                gf_log ("parser", GF_LOG_ERROR,</div><div class='add'>+                gf_msg ("parser", GF_LOG_ERROR, 0, LG_MSG_INVALID_ENTRY,</div><div class='ctx'>                         "Volume '%s', line %d: type '%s' is not valid or "</div><div class='ctx'> 			"not found on this machine",</div><div class='del'>-                        curr-&gt;name, yylineno, type);</div><div class='add'>+                        curr-&gt;name, graphyylineno, type);</div><div class='ctx'>                 ret = -1;</div><div class='ctx'>                 goto out;</div><div class='ctx'>         }</div><div class='ctx'> </div><div class='del'>-        gf_log ("parser", GF_LOG_TRACE, "Type:%s:%s", curr-&gt;name, type);</div><div class='add'>+        gf_msg_trace ("parser", 0, "Type:%s:%s", curr-&gt;name, type);</div><div class='ctx'> </div><div class='ctx'> out:</div><div class='ctx'>         GF_FREE (type);</div><div class='hunk'>@@ -232,30 +228,30 @@ out:</div><div class='ctx'> static int</div><div class='ctx'> volume_option (char *key, char *value)</div><div class='ctx'> {</div><div class='del'>-        extern int  yylineno;</div><div class='add'>+        extern int  graphyylineno;</div><div class='ctx'>         int         ret = 0;</div><div class='ctx'>         char       *set_value = NULL;</div><div class='ctx'> </div><div class='ctx'>         if (!key || !value){</div><div class='del'>-                gf_log ("parser", GF_LOG_ERROR, "Invalid argument");</div><div class='add'>+                gf_msg ("parser", GF_LOG_ERROR, 0,</div><div class='add'>+                        LG_MSG_INVALID_VOLFILE_ENTRY, "Invalid argument");</div><div class='ctx'>                 ret = -1;</div><div class='ctx'>                 goto out;</div><div class='ctx'>         }</div><div class='ctx'> </div><div class='ctx'>         set_value = gf_strdup (value);</div><div class='del'>-	ret = dict_set_dynstr (curr-&gt;options, key, set_value);</div><div class='add'>+	ret = dict_set_option (curr-&gt;options, key, set_value);</div><div class='ctx'> </div><div class='ctx'>         if (ret == 1) {</div><div class='del'>-                gf_log ("parser", GF_LOG_ERROR,</div><div class='del'>-                        "Volume '%s', line %d: duplicate entry "</div><div class='del'>-			"('option %s') present",</div><div class='del'>-                        curr-&gt;name, yylineno, key);</div><div class='add'>+                gf_msg ("parser", GF_LOG_ERROR, 0,</div><div class='add'>+                        LG_MSG_INVALID_VOLFILE_ENTRY, "Volume '%s', line %d: "</div><div class='add'>+                        "duplicate entry ('option %s') present",</div><div class='add'>+                        curr-&gt;name, graphyylineno, key);</div><div class='ctx'>                 ret = -1;</div><div class='ctx'>                 goto out;</div><div class='ctx'>         }</div><div class='ctx'> </div><div class='del'>-        gf_log ("parser", GF_LOG_TRACE, "Option:%s:%s:%s",</div><div class='del'>-                curr-&gt;name, key, value);</div><div class='add'>+        gf_msg_trace ("parser", 0, "Option:%s:%s:%s", curr-&gt;name, key, value);</div><div class='ctx'> </div><div class='ctx'> out:</div><div class='ctx'>         GF_FREE (key);</div><div class='hunk'>@@ -268,15 +264,13 @@ out:</div><div class='ctx'> static int</div><div class='ctx'> volume_sub (char *sub)</div><div class='ctx'> {</div><div class='del'>-        extern int       yylineno;</div><div class='add'>+        extern int       graphyylineno;</div><div class='ctx'>         xlator_t        *trav = NULL;</div><div class='del'>-        xlator_list_t   *xlchild = NULL;</div><div class='del'>-        xlator_list_t   *tmp = NULL;</div><div class='del'>-        xlator_list_t   *xlparent = NULL;</div><div class='ctx'>         int              ret = 0;</div><div class='ctx'> </div><div class='ctx'>         if (!sub) {</div><div class='del'>-                gf_log ("parser", GF_LOG_ERROR, "Invalid subvolumes argument");</div><div class='add'>+                gf_msg ("parser", GF_LOG_ERROR, 0, LG_MSG_INVALID_ENTRY,</div><div class='add'>+                        "Invalid subvolumes argument");</div><div class='ctx'>                 ret = -1;</div><div class='ctx'>                 goto out;</div><div class='ctx'>         }</div><div class='hunk'>@@ -290,62 +284,28 @@ volume_sub (char *sub)</div><div class='ctx'>         }</div><div class='ctx'> </div><div class='ctx'>         if (!trav) {</div><div class='del'>-                gf_log ("parser", GF_LOG_ERROR,</div><div class='add'>+                gf_msg ("parser", GF_LOG_ERROR, 0, LG_MSG_SUB_VOLUME_ERROR,</div><div class='ctx'>                         "Volume '%s', line %d: subvolume '%s' is not defined "</div><div class='del'>-			"prior to usage",</div><div class='del'>-                        curr-&gt;name, yylineno, sub);</div><div class='add'>+			"prior to usage",curr-&gt;name, graphyylineno, sub);</div><div class='ctx'>                 ret = -1;</div><div class='ctx'>                 goto out;</div><div class='ctx'>         }</div><div class='ctx'> </div><div class='ctx'>         if (trav == curr) {</div><div class='del'>-                gf_log ("parser", GF_LOG_ERROR,</div><div class='add'>+                gf_msg ("parser", GF_LOG_ERROR, 0, LG_MSG_INVALID_ENTRY,</div><div class='ctx'>                         "Volume '%s', line %d: has '%s' itself as subvolume",</div><div class='del'>-                        curr-&gt;name, yylineno, sub);</div><div class='add'>+                        curr-&gt;name, graphyylineno, sub);</div><div class='ctx'>                 ret = -1;</div><div class='ctx'>                 goto out;</div><div class='ctx'>         }</div><div class='ctx'> </div><div class='del'>-        xlparent = (void *) GF_CALLOC (1, sizeof (*xlparent),</div><div class='del'>-                                       gf_common_mt_xlator_list_t);</div><div class='del'>-</div><div class='del'>-        if (!xlparent) {</div><div class='del'>-                gf_log ("parser", GF_LOG_ERROR, "Out of memory");</div><div class='add'>+	ret = glusterfs_xlator_link (curr, trav);</div><div class='add'>+	if (ret) {</div><div class='ctx'>                 ret = -1;</div><div class='ctx'>                 goto out;</div><div class='ctx'>         }</div><div class='ctx'> </div><div class='del'>-        xlparent-&gt;xlator = curr;</div><div class='del'>-</div><div class='del'>-        tmp = trav-&gt;parents;</div><div class='del'>-        if (tmp == NULL) {</div><div class='del'>-                trav-&gt;parents = xlparent;</div><div class='del'>-        } else {</div><div class='del'>-                while (tmp-&gt;next)</div><div class='del'>-                        tmp = tmp-&gt;next;</div><div class='del'>-                tmp-&gt;next = xlparent;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        xlchild = (void *) GF_CALLOC (1, sizeof(*xlchild),</div><div class='del'>-                                      gf_common_mt_xlator_list_t);</div><div class='del'>-        if (!xlchild) {</div><div class='del'>-                gf_log ("parser", GF_LOG_ERROR, "Out of memory");</div><div class='del'>-                ret = -1;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        xlchild-&gt;xlator = trav;</div><div class='del'>-</div><div class='del'>-        tmp = curr-&gt;children;</div><div class='del'>-        if (tmp == NULL) {</div><div class='del'>-                curr-&gt;children = xlchild;</div><div class='del'>-        } else {</div><div class='del'>-                while (tmp-&gt;next)</div><div class='del'>-                        tmp = tmp-&gt;next;</div><div class='del'>-                tmp-&gt;next = xlchild;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        gf_log ("parser", GF_LOG_TRACE, "child:%s-&gt;%s", curr-&gt;name, sub);</div><div class='add'>+        gf_msg_trace ("parser", 0, "child:%s-&gt;%s", curr-&gt;name, sub);</div><div class='ctx'> </div><div class='ctx'> out:</div><div class='ctx'>         GF_FREE (sub);</div><div class='hunk'>@@ -358,11 +318,11 @@ static int</div><div class='ctx'> volume_end (void)</div><div class='ctx'> {</div><div class='ctx'>         if (!curr-&gt;fops) {</div><div class='del'>-                gf_log ("parser", GF_LOG_ERROR,</div><div class='add'>+                gf_msg ("parser", GF_LOG_ERROR, 0, LG_MSG_VOLUME_ERROR,</div><div class='ctx'>                         "\"type\" not specified for volume %s", curr-&gt;name);</div><div class='ctx'>                 return -1;</div><div class='ctx'>         }</div><div class='del'>-        gf_log ("parser", GF_LOG_TRACE, "end:%s", curr-&gt;name);</div><div class='add'>+        gf_msg_trace ("parser", 0, "end:%s", curr-&gt;name);</div><div class='ctx'> </div><div class='ctx'>         curr = NULL;</div><div class='ctx'>         return 0;</div><div class='hunk'>@@ -370,55 +330,52 @@ volume_end (void)</div><div class='ctx'> </div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-yywrap ()</div><div class='add'>+graphyywrap ()</div><div class='ctx'> {</div><div class='ctx'>         return 1;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-yyerror (const char *str)</div><div class='add'>+graphyyerror (const char *str)</div><div class='ctx'> {</div><div class='del'>-        extern char  *yytext;</div><div class='del'>-        extern int    yylineno;</div><div class='del'>-</div><div class='del'>-        if (curr &amp;&amp; curr-&gt;name &amp;&amp; yytext) {</div><div class='del'>-                if (!strcmp (yytext, "volume")) {</div><div class='del'>-                        gf_log ("parser", GF_LOG_ERROR,</div><div class='del'>-                                "'end-volume' not defined for volume '%s'",</div><div class='del'>-				curr-&gt;name);</div><div class='del'>-                } else if (!strcmp (yytext, "type")) {</div><div class='del'>-                        gf_log ("parser", GF_LOG_ERROR,</div><div class='add'>+        extern char  *graphyytext;</div><div class='add'>+        extern int    graphyylineno;</div><div class='add'>+</div><div class='add'>+        if (curr &amp;&amp; curr-&gt;name &amp;&amp; graphyytext) {</div><div class='add'>+                if (!strcmp (graphyytext, "volume")) {</div><div class='add'>+                        gf_msg ("parser", GF_LOG_ERROR, 0,</div><div class='add'>+                                LG_MSG_VOLUME_ERROR, "'end-volume' not"</div><div class='add'>+                                " defined for volume '%s'", curr-&gt;name);</div><div class='add'>+                } else if (!strcmp (graphyytext, "type")) {</div><div class='add'>+                        gf_msg ("parser", GF_LOG_ERROR, 0, LG_MSG_VOLUME_ERROR,</div><div class='ctx'>                                 "line %d: duplicate 'type' defined for "</div><div class='del'>-				"volume '%s'",</div><div class='del'>-                                yylineno, curr-&gt;name);</div><div class='del'>-                } else if (!strcmp (yytext, "subvolumes")) {</div><div class='del'>-                        gf_log ("parser", GF_LOG_ERROR,</div><div class='del'>-                                "line %d: duplicate 'subvolumes' defined for "</div><div class='del'>-				"volume '%s'",</div><div class='del'>-                                yylineno, curr-&gt;name);</div><div class='add'>+				"volume '%s'", graphyylineno, curr-&gt;name);</div><div class='add'>+                } else if (!strcmp (graphyytext, "subvolumes")) {</div><div class='add'>+                        gf_msg ("parser", GF_LOG_ERROR, 0,</div><div class='add'>+                                LG_MSG_SUB_VOLUME_ERROR, "line %d: duplicate "</div><div class='add'>+                                "'subvolumes' defined for volume '%s'",</div><div class='add'>+                                graphyylineno, curr-&gt;name);</div><div class='ctx'>                 } else if (curr) {</div><div class='del'>-                        gf_log ("parser", GF_LOG_ERROR,</div><div class='add'>+                        gf_msg ("parser", GF_LOG_ERROR, 0, LG_MSG_SYNTAX_ERROR,</div><div class='ctx'>                                 "syntax error: line %d (volume '%s'): \"%s\""</div><div class='ctx'> 				"\nallowed tokens are 'volume', 'type', "</div><div class='ctx'> 				"'subvolumes', 'option', 'end-volume'()",</div><div class='del'>-                                yylineno, curr-&gt;name,</div><div class='del'>-				yytext);</div><div class='add'>+                                graphyylineno, curr-&gt;name, graphyytext);</div><div class='ctx'>                 } else {</div><div class='del'>-                        gf_log ("parser", GF_LOG_ERROR,</div><div class='add'>+                        gf_msg ("parser", GF_LOG_ERROR, 0, LG_MSG_SYNTAX_ERROR,</div><div class='ctx'>                                 "syntax error: line %d (just after volume "</div><div class='ctx'> 				"'%s'): \"%s\"\n(%s)",</div><div class='del'>-                                yylineno, curr-&gt;name,</div><div class='del'>-				yytext,</div><div class='add'>+                                graphyylineno, curr-&gt;name, graphyytext,</div><div class='ctx'>                                 "allowed tokens are 'volume', 'type', "</div><div class='ctx'> 				"'subvolumes', 'option', 'end-volume'");</div><div class='ctx'>                 }</div><div class='ctx'>         } else {</div><div class='del'>-                gf_log ("parser", GF_LOG_ERROR,</div><div class='del'>-                        "syntax error in line %d: \"%s\" \n"</div><div class='add'>+                gf_msg ("parser", GF_LOG_ERROR, 0, LG_MSG_SYNTAX_ERROR,</div><div class='add'>+                        "syntax error in line %d: \"%s\"\n"</div><div class='ctx'>                         "(allowed tokens are 'volume', 'type', "</div><div class='ctx'> 			"'subvolumes', 'option', 'end-volume')\n",</div><div class='del'>-                        yylineno, yytext);</div><div class='add'>+                        graphyylineno, graphyytext);</div><div class='ctx'>         }</div><div class='ctx'> </div><div class='ctx'>         return -1;</div><div class='hunk'>@@ -436,7 +393,8 @@ execute_cmd (char *cmd, char **result, size_t size)</div><div class='ctx'> </div><div class='ctx'> 	fpp = popen (cmd, "r");</div><div class='ctx'> 	if (!fpp) {</div><div class='del'>-		gf_log ("parser", GF_LOG_ERROR, "%s: failed to popen", cmd);</div><div class='add'>+		gf_msg ("parser", GF_LOG_ERROR, 0, LG_MSG_FILE_OP_FAILED,</div><div class='add'>+                        "%s: failed to popen", cmd);</div><div class='ctx'> 		return -1;</div><div class='ctx'> 	}</div><div class='ctx'> </div><div class='hunk'>@@ -477,8 +435,6 @@ preprocess (FILE *srcfp, FILE *dstfp)</div><div class='ctx'>         char    in_backtick = 0;</div><div class='ctx'> 	int     line = 1;</div><div class='ctx'>         int     column = 0;</div><div class='del'>-        int     backtick_line = 0;</div><div class='del'>-        int     backtick_column = 0;</div><div class='ctx'>         int     character = 0;</div><div class='ctx'> </div><div class='ctx'> </div><div class='hunk'>@@ -488,7 +444,6 @@ preprocess (FILE *srcfp, FILE *dstfp)</div><div class='ctx'> 	cmd = GF_CALLOC (cmd_buf_size, 1,</div><div class='ctx'>                          gf_common_mt_char);</div><div class='ctx'>         if (cmd == NULL) {</div><div class='del'>-                gf_log ("parser", GF_LOG_ERROR, "Out of memory");</div><div class='ctx'>                 return -1;</div><div class='ctx'>         }</div><div class='ctx'> </div><div class='hunk'>@@ -496,7 +451,6 @@ preprocess (FILE *srcfp, FILE *dstfp)</div><div class='ctx'>                             gf_common_mt_char);</div><div class='ctx'>         if (result == NULL) {</div><div class='ctx'>                 GF_FREE (cmd);</div><div class='del'>-                gf_log ("parser", GF_LOG_ERROR, "Out of memory");</div><div class='ctx'>                 return -1;</div><div class='ctx'>         }</div><div class='ctx'> </div><div class='hunk'>@@ -516,9 +470,6 @@ preprocess (FILE *srcfp, FILE *dstfp)</div><div class='ctx'> 			} else {</div><div class='ctx'> 				i = 0;</div><div class='ctx'> 				cmd[i] = '\0';</div><div class='del'>-</div><div class='del'>-				backtick_column = column;</div><div class='del'>-				backtick_line = line;</div><div class='ctx'> 			}</div><div class='ctx'> </div><div class='ctx'> 			in_backtick = !in_backtick;</div><div class='hunk'>@@ -528,6 +479,7 @@ preprocess (FILE *srcfp, FILE *dstfp)</div><div class='ctx'> 					cmd_buf_size *= 2;</div><div class='ctx'> 					cmd = GF_REALLOC (cmd, cmd_buf_size);</div><div class='ctx'>                                         if (cmd == NULL) {</div><div class='add'>+                                                GF_FREE (result);</div><div class='ctx'>                                                 return -1;</div><div class='ctx'>                                         }</div><div class='ctx'> </div><div class='hunk'>@@ -560,15 +512,16 @@ preprocess (FILE *srcfp, FILE *dstfp)</div><div class='ctx'>         }</div><div class='ctx'> </div><div class='ctx'> 	if (in_backtick) {</div><div class='del'>-		gf_log ("parser", GF_LOG_ERROR,</div><div class='del'>-			"Unterminated backtick in volume specfication file at line (%d), column (%d).",</div><div class='del'>-			line, column);</div><div class='add'>+		gf_msg ("parser", GF_LOG_ERROR, 0, LG_MSG_VOLUME_ERROR,</div><div class='add'>+			"Unterminated backtick in volume specification file at "</div><div class='add'>+                        "line (%d), column (%d).", line, column);</div><div class='ctx'>                 ret = -1;</div><div class='ctx'> 	}</div><div class='ctx'> </div><div class='ctx'> out:</div><div class='ctx'> 	fseek (srcfp, 0L, SEEK_SET);</div><div class='ctx'> 	fseek (dstfp, 0L, SEEK_SET);</div><div class='add'>+</div><div class='ctx'> 	GF_FREE (cmd);</div><div class='ctx'> 	GF_FREE (result);</div><div class='ctx'> </div><div class='hunk'>@@ -576,7 +529,7 @@ out:</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> </div><div class='del'>-extern FILE *yyin;</div><div class='add'>+extern FILE *graphyyin;</div><div class='ctx'> </div><div class='ctx'> glusterfs_graph_t *</div><div class='ctx'> glusterfs_graph_new ()</div><div class='hunk'>@@ -590,6 +543,9 @@ glusterfs_graph_new ()</div><div class='ctx'> </div><div class='ctx'>         INIT_LIST_HEAD (&amp;graph-&gt;list);</div><div class='ctx'> </div><div class='add'>+        pthread_mutex_init(&amp;graph-&gt;mutex, NULL);</div><div class='add'>+        pthread_cond_init(&amp;graph-&gt;child_down_cond, NULL);</div><div class='add'>+</div><div class='ctx'>         gettimeofday (&amp;graph-&gt;dob, NULL);</div><div class='ctx'> </div><div class='ctx'>         return graph;</div><div class='hunk'>@@ -600,52 +556,66 @@ glusterfs_graph_t *</div><div class='ctx'> glusterfs_graph_construct (FILE *fp)</div><div class='ctx'> {</div><div class='ctx'>         int                ret = 0;</div><div class='add'>+        int                tmp_fd = -1;</div><div class='ctx'>         glusterfs_graph_t *graph = NULL;</div><div class='del'>-	FILE              *tmp_file = NULL;</div><div class='add'>+        FILE              *tmp_file = NULL;</div><div class='add'>+        char               template[] = "/tmp/tmp.XXXXXX";</div><div class='add'>+	static pthread_mutex_t graph_mutex = PTHREAD_MUTEX_INITIALIZER;</div><div class='ctx'> </div><div class='ctx'>         graph = glusterfs_graph_new ();</div><div class='ctx'>         if (!graph)</div><div class='del'>-                return NULL;</div><div class='add'>+                goto err;</div><div class='ctx'> </div><div class='del'>-	tmp_file = tmpfile ();</div><div class='add'>+        /* coverity[secure_temp] mkstemp uses 0600 as the mode and is safe */</div><div class='add'>+        tmp_fd = mkstemp (template);</div><div class='add'>+        if (-1 == tmp_fd)</div><div class='add'>+                goto err;</div><div class='ctx'> </div><div class='del'>-	if (tmp_file == NULL) {</div><div class='del'>-		gf_log ("parser", GF_LOG_ERROR,</div><div class='del'>-			"cannot create temparory file");</div><div class='add'>+        ret = sys_unlink (template);</div><div class='add'>+        if (ret &lt; 0) {</div><div class='add'>+                gf_msg ("parser", GF_LOG_WARNING, 0, LG_MSG_FILE_OP_FAILED,</div><div class='add'>+                        "Unable to delete file: %s", template);</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-                glusterfs_graph_destroy (graph);</div><div class='del'>-		return NULL;</div><div class='del'>-	}</div><div class='add'>+        tmp_file = fdopen (tmp_fd, "w+b");</div><div class='add'>+        if (!tmp_file)</div><div class='add'>+                goto err;</div><div class='ctx'> </div><div class='del'>-	ret = preprocess (fp, tmp_file);</div><div class='del'>-	if (ret &lt; 0) {</div><div class='del'>-		gf_log ("parser", GF_LOG_ERROR,</div><div class='del'>-			"parsing of backticks failed");</div><div class='add'>+        ret = preprocess (fp, tmp_file);</div><div class='add'>+        if (ret &lt; 0) {</div><div class='add'>+                gf_msg ("parser", GF_LOG_ERROR, 0, LG_MSG_BACKTICK_PARSE_FAILED,</div><div class='add'>+                        "parsing of backticks failed");</div><div class='add'>+                goto err;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-                glusterfs_graph_destroy (graph);</div><div class='del'>-		fclose (tmp_file);</div><div class='del'>-		return NULL;</div><div class='add'>+	pthread_mutex_lock (&amp;graph_mutex);</div><div class='add'>+	{</div><div class='add'>+		graphyyin = tmp_file;</div><div class='add'>+		construct = graph;</div><div class='add'>+		ret = yyparse ();</div><div class='add'>+		construct = NULL;</div><div class='ctx'> 	}</div><div class='del'>-</div><div class='del'>-        yyin = tmp_file;</div><div class='del'>-</div><div class='del'>-        construct = graph;</div><div class='del'>-</div><div class='del'>-        ret = yyparse ();</div><div class='del'>-</div><div class='del'>-        construct = NULL;</div><div class='del'>-</div><div class='del'>-	fclose (tmp_file);</div><div class='add'>+	pthread_mutex_unlock (&amp;graph_mutex);</div><div class='ctx'> </div><div class='ctx'>         if (ret == 1) {</div><div class='del'>-                gf_log ("parser", GF_LOG_DEBUG,</div><div class='del'>-			"parsing of volfile failed, please review it "</div><div class='del'>-			"once more");</div><div class='del'>-</div><div class='del'>-                glusterfs_graph_destroy (graph);</div><div class='del'>-                return NULL;</div><div class='add'>+                gf_msg_debug ("parser", 0, "parsing of volfile failed, please "</div><div class='add'>+                              "review it once more");</div><div class='add'>+                goto err;</div><div class='ctx'>         }</div><div class='ctx'> </div><div class='add'>+        fclose (tmp_file);</div><div class='ctx'>         return graph;</div><div class='add'>+err:</div><div class='add'>+        if (tmp_file) {</div><div class='add'>+                fclose (tmp_file);</div><div class='add'>+        } else {</div><div class='add'>+                gf_msg ("parser", GF_LOG_ERROR, 0, LG_MSG_FILE_OP_FAILED,</div><div class='add'>+                        "cannot create temporary file");</div><div class='add'>+                if (-1 != tmp_fd)</div><div class='add'>+                        sys_close (tmp_fd);</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        glusterfs_graph_destroy (graph);</div><div class='add'>+        return NULL;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='head'>diff --git a/libglusterfs/src/hashfn.c b/libglusterfs/src/hashfn.c<br/>index 134e729e80a..d2237e99f83 100644<br/>--- a/<a href='/cgit/glusterfs.git/tree/libglusterfs/src/hashfn.c?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/hashfn.c</a><br/>+++ b/<a href='/cgit/glusterfs.git/tree/libglusterfs/src/hashfn.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>libglusterfs/src/hashfn.c</a></div><div class='hunk'>@@ -1,48 +1,21 @@</div><div class='ctx'> /*</div><div class='del'>-   Copyright (c) 2006-2009 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='del'>-   This file is part of GlusterFS.</div><div class='del'>-</div><div class='del'>-   GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-   it under the terms of the GNU General Public License as published</div><div class='del'>-   by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-   or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-   GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-   WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-   General Public License for more details.</div><div class='del'>-</div><div class='del'>-   You should have received a copy of the GNU General Public License</div><div class='del'>-   along with this program.  If not, see</div><div class='del'>-   &lt;http://www.gnu.org/licenses/&gt;.</div><div class='add'>+  Copyright (c) 2008-2012 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='ctx'> */</div><div class='ctx'> </div><div class='ctx'> #include &lt;stdint.h&gt;</div><div class='ctx'> #include &lt;stdlib.h&gt;</div><div class='ctx'> </div><div class='del'>-#ifndef _CONFIG_H</div><div class='del'>-#define _CONFIG_H</div><div class='del'>-#include "config.h"</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-#include "hashfn.h"</div><div class='del'>-</div><div class='del'>-#define get16bits(d) (*((const uint16_t *) (d)))</div><div class='add'>+#define get16bits(d) (*((const uint16_t *)(d)))</div><div class='ctx'> </div><div class='ctx'> #define DM_DELTA 0x9E3779B9</div><div class='del'>-#define DM_FULLROUNDS 10        /* 32 is overkill, 16 is strong crypto */</div><div class='del'>-#define DM_PARTROUNDS 6	        /* 6 gets complete mixing */</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-uint32_t</div><div class='del'>-ReallySimpleHash (char *path, int len)</div><div class='del'>-{</div><div class='del'>-        uint32_t        hash = 0;</div><div class='del'>-        for (;len &gt; 0; len--)</div><div class='del'>-                hash ^= (char)path[len];</div><div class='del'>-</div><div class='del'>-        return hash;</div><div class='del'>-}</div><div class='add'>+#define DM_FULLROUNDS 10 /* 32 is overkill, 16 is strong crypto */</div><div class='add'>+#define DM_PARTROUNDS 6  /* 6 gets complete mixing */</div><div class='ctx'> </div><div class='ctx'> /*</div><div class='ctx'>   This is apparently the "fastest hash function for strings".</div><div class='hunk'>@@ -51,146 +24,145 @@ ReallySimpleHash (char *path, int len)</div><div class='ctx'> </div><div class='ctx'> /* In any case make sure, you return 1 */</div><div class='ctx'> </div><div class='del'>-uint32_t SuperFastHash (const char * data, int32_t len) {</div><div class='del'>-  uint32_t hash = len, tmp;</div><div class='del'>-  int32_t rem;</div><div class='del'>-</div><div class='del'>-  if (len &lt;= 1 || data == NULL) return 1;</div><div class='del'>-</div><div class='del'>-  rem = len &amp; 3;</div><div class='del'>-  len &gt;&gt;= 2;</div><div class='del'>-</div><div class='del'>-  /* Main loop */</div><div class='del'>-  for (;len &gt; 0; len--) {</div><div class='del'>-    hash  += get16bits (data);</div><div class='del'>-    tmp    = (get16bits (data+2) &lt;&lt; 11) ^ hash;</div><div class='del'>-    hash   = (hash &lt;&lt; 16) ^ tmp;</div><div class='del'>-    data  += 2*sizeof (uint16_t);</div><div class='del'>-    hash  += hash &gt;&gt; 11;</div><div class='del'>-  }</div><div class='del'>-</div><div class='del'>-  /* Handle end cases */</div><div class='del'>-  switch (rem) {</div><div class='del'>-  case 3: hash += get16bits (data);</div><div class='del'>-    hash ^= hash &lt;&lt; 16;</div><div class='del'>-    hash ^= data[sizeof (uint16_t)] &lt;&lt; 18;</div><div class='del'>-    hash += hash &gt;&gt; 11;</div><div class='del'>-    break;</div><div class='del'>-  case 2: hash += get16bits (data);</div><div class='del'>-    hash ^= hash &lt;&lt; 11;</div><div class='add'>+uint32_t</div><div class='add'>+SuperFastHash(const char *data, int32_t len)</div><div class='add'>+{</div><div class='add'>+    uint32_t hash = len, tmp;</div><div class='add'>+    int32_t rem;</div><div class='add'>+</div><div class='add'>+    if (len &lt;= 1 || data == NULL)</div><div class='add'>+        return 1;</div><div class='add'>+</div><div class='add'>+    rem = len &amp; 3;</div><div class='add'>+    len &gt;&gt;= 2;</div><div class='add'>+</div><div class='add'>+    /* Main loop */</div><div class='add'>+    for (; len &gt; 0; len--) {</div><div class='add'>+        hash += get16bits(data);</div><div class='add'>+        tmp = (get16bits(data + 2) &lt;&lt; 11) ^ hash;</div><div class='add'>+        hash = (hash &lt;&lt; 16) ^ tmp;</div><div class='add'>+        data += 2 * sizeof(uint16_t);</div><div class='add'>+        hash += hash &gt;&gt; 11;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Handle end cases */</div><div class='add'>+    switch (rem) {</div><div class='add'>+        case 3:</div><div class='add'>+            hash += get16bits(data);</div><div class='add'>+            hash ^= hash &lt;&lt; 16;</div><div class='add'>+            hash ^= data[sizeof(uint16_t)] &lt;&lt; 18;</div><div class='add'>+            hash += hash &gt;&gt; 11;</div><div class='add'>+            break;</div><div class='add'>+        case 2:</div><div class='add'>+            hash += get16bits(data);</div><div class='add'>+            hash ^= hash &lt;&lt; 11;</div><div class='add'>+            hash += hash &gt;&gt; 17;</div><div class='add'>+            break;</div><div class='add'>+        case 1:</div><div class='add'>+            hash += *data;</div><div class='add'>+            hash ^= hash &lt;&lt; 10;</div><div class='add'>+            hash += hash &gt;&gt; 1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Force "avalanching" of final 127 bits */</div><div class='add'>+    hash ^= hash &lt;&lt; 3;</div><div class='add'>+    hash += hash &gt;&gt; 5;</div><div class='add'>+    hash ^= hash &lt;&lt; 4;</div><div class='ctx'>     hash += hash &gt;&gt; 17;</div><div class='del'>-    break;</div><div class='del'>-  case 1: hash += *data;</div><div class='del'>-    hash ^= hash &lt;&lt; 10;</div><div class='del'>-    hash += hash &gt;&gt; 1;</div><div class='del'>-  }</div><div class='del'>-</div><div class='del'>-  /* Force "avalanching" of final 127 bits */</div><div class='del'>-  hash ^= hash &lt;&lt; 3;</div><div class='del'>-  hash += hash &gt;&gt; 5;</div><div class='del'>-  hash ^= hash &lt;&lt; 4;</div><div class='del'>-  hash += hash &gt;&gt; 17;</div><div class='del'>-  hash ^= hash &lt;&lt; 25;</div><div class='del'>-  hash += hash &gt;&gt; 6;</div><div class='del'>-</div><div class='del'>-  return hash;</div><div class='del'>-}</div><div class='add'>+    hash ^= hash &lt;&lt; 25;</div><div class='add'>+    hash += hash &gt;&gt; 6;</div><div class='ctx'> </div><div class='add'>+    return hash;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> /* Davies-Meyer hashing function implementation</div><div class='ctx'>  */</div><div class='ctx'> static int</div><div class='del'>-dm_round (int rounds, uint32_t *array, uint32_t *h0, uint32_t *h1)</div><div class='add'>+dm_round(int rounds, uint32_t *array, uint32_t *h0, uint32_t *h1)</div><div class='ctx'> {</div><div class='del'>-	uint32_t sum = 0;</div><div class='del'>-	int      n = 0;</div><div class='del'>-	uint32_t b0  = 0;</div><div class='del'>-	uint32_t b1  = 0;</div><div class='del'>-</div><div class='del'>-	b0 = *h0;</div><div class='del'>-	b1 = *h1;</div><div class='del'>-</div><div class='del'>-	n = rounds;</div><div class='del'>-</div><div class='del'>-	do {</div><div class='del'>-		sum += DM_DELTA;</div><div class='del'>-		b0  += ((b1 &lt;&lt; 4) + array[0])</div><div class='del'>-			^ (b1 + sum)</div><div class='del'>-			^ ((b1 &gt;&gt; 5) + array[1]);</div><div class='del'>-		b1  += ((b0 &lt;&lt; 4) + array[2])</div><div class='del'>-			^ (b0 + sum)</div><div class='del'>-			^ ((b0 &gt;&gt; 5) + array[3]);</div><div class='del'>-	} while (--n);</div><div class='del'>-</div><div class='del'>-	*h0 += b0;</div><div class='del'>-	*h1 += b1;</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='add'>+    uint32_t sum = 0;</div><div class='add'>+    int n = 0;</div><div class='add'>+    uint32_t b0 = 0;</div><div class='add'>+    uint32_t b1 = 0;</div><div class='add'>+</div><div class='add'>+    b0 = *h0;</div><div class='add'>+    b1 = *h1;</div><div class='ctx'> </div><div class='add'>+    n = rounds;</div><div class='add'>+</div><div class='add'>+    do {</div><div class='add'>+        sum += DM_DELTA;</div><div class='add'>+        b0 += ((b1 &lt;&lt; 4) + array[0]) ^ (b1 + sum) ^ ((b1 &gt;&gt; 5) + array[1]);</div><div class='add'>+        b1 += ((b0 &lt;&lt; 4) + array[2]) ^ (b0 + sum) ^ ((b0 &gt;&gt; 5) + array[3]);</div><div class='add'>+    } while (--n);</div><div class='add'>+</div><div class='add'>+    *h0 += b0;</div><div class='add'>+    *h1 += b1;</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> uint32_t</div><div class='del'>-__pad (int len)</div><div class='add'>+__pad(int len)</div><div class='ctx'> {</div><div class='del'>-	uint32_t pad = 0;</div><div class='add'>+    uint32_t pad = 0;</div><div class='ctx'> </div><div class='del'>-	pad = (uint32_t) len | ((uint32_t) len &lt;&lt; 8);</div><div class='del'>-	pad |= pad &lt;&lt; 16;</div><div class='add'>+    pad = (uint32_t)len | ((uint32_t)len &lt;&lt; 8);</div><div class='add'>+    pad |= pad &lt;&lt; 16;</div><div class='ctx'> </div><div class='del'>-	return pad;</div><div class='add'>+    return pad;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> uint32_t</div><div class='del'>-gf_dm_hashfn (const char *msg, int len)</div><div class='add'>+gf_dm_hashfn(const char *msg, int len)</div><div class='ctx'> {</div><div class='del'>-	uint32_t  h0 = 0x9464a485;</div><div class='del'>-	uint32_t  h1 = 0x542e1a94;</div><div class='del'>-	uint32_t  array[4];</div><div class='del'>-	uint32_t  pad = 0;</div><div class='del'>-	int       i = 0;</div><div class='del'>-	int       j = 0;</div><div class='del'>-	int       full_quads = 0;</div><div class='del'>-	int       full_words = 0;</div><div class='del'>-	int       full_bytes = 0;</div><div class='del'>-	uint32_t *intmsg = NULL;</div><div class='del'>-	int       word = 0;</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-	intmsg = (uint32_t *) msg;</div><div class='del'>-	pad = __pad (len);</div><div class='del'>-</div><div class='del'>-	full_bytes   = len;</div><div class='del'>-	full_words   = len / 4;</div><div class='del'>-	full_quads   = len / 16;</div><div class='del'>-</div><div class='del'>-	for (i = 0; i &lt; full_quads; i++) {</div><div class='del'>-		for (j = 0; j &lt; 4; j++) {</div><div class='del'>-			word     = *intmsg;</div><div class='del'>-			array[j] = word;</div><div class='del'>-			intmsg++;</div><div class='del'>-			full_words--;</div><div class='del'>-			full_bytes -= 4;</div><div class='del'>-		}</div><div class='del'>-		dm_round (DM_PARTROUNDS, &amp;array[0], &amp;h0, &amp;h1);</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	for (j = 0; j &lt; 4; j++) {</div><div class='del'>-		if (full_words) {</div><div class='del'>-			word     = *intmsg;</div><div class='del'>-			array[j] = word;</div><div class='del'>-			intmsg++;</div><div class='del'>-			full_words--;</div><div class='del'>-			full_bytes -= 4;</div><div class='del'>-		} else {</div><div class='del'>-			array[j] = pad;</div><div class='del'>-			while (full_bytes) {</div><div class='del'>-				array[j] &lt;&lt;= 8;</div><div class='del'>-				array[j] |= msg[len - full_bytes];</div><div class='del'>-				full_bytes--;</div><div class='del'>-			}</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='del'>-	dm_round (DM_FULLROUNDS, &amp;array[0], &amp;h0, &amp;h1);</div><div class='del'>-</div><div class='del'>-	return h0 ^ h1;</div><div class='add'>+    uint32_t h0 = 0x9464a485;</div><div class='add'>+    uint32_t h1 = 0x542e1a94;</div><div class='add'>+    uint32_t array[4];</div><div class='add'>+    uint32_t pad = 0;</div><div class='add'>+    int i = 0;</div><div class='add'>+    int j = 0;</div><div class='add'>+    int full_quads = 0;</div><div class='add'>+    int full_words = 0;</div><div class='add'>+    int full_bytes = 0;</div><div class='add'>+    uint32_t *intmsg = NULL;</div><div class='add'>+    int word = 0;</div><div class='add'>+</div><div class='add'>+    intmsg = (uint32_t *)msg;</div><div class='add'>+    pad = __pad(len);</div><div class='add'>+</div><div class='add'>+    full_bytes = len;</div><div class='add'>+    full_words = len / 4;</div><div class='add'>+    full_quads = len / 16;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; full_quads; i++) {</div><div class='add'>+        for (j = 0; j &lt; 4; j++) {</div><div class='add'>+            word = *intmsg;</div><div class='add'>+            array[j] = word;</div><div class='add'>+            intmsg++;</div><div class='add'>+            full_words--;</div><div class='add'>+            full_bytes -= 4;</div><div class='add'>+        }</div><div class='add'>+        dm_round(DM_PARTROUNDS, &amp;array[0], &amp;h0, &amp;h1);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    for (j = 0; j &lt; 4; j++) {</div><div class='add'>+        if (full_words) {</div><div class='add'>+            word = *intmsg;</div><div class='add'>+            array[j] = word;</div><div class='add'>+            intmsg++;</div><div class='add'>+            full_words--;</div><div class='add'>+            full_bytes -= 4;</div><div class='add'>+        } else {</div><div class='add'>+            array[j] = pad;</div><div class='add'>+            while (full_bytes) {</div><div class='add'>+                array[j] &lt;&lt;= 8;</div><div class='add'>+                array[j] |= msg[len - full_bytes];</div><div class='add'>+                full_bytes--;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    dm_round(DM_FULLROUNDS, &amp;array[0], &amp;h0, &amp;h1);</div><div class='add'>+</div><div class='add'>+    return h0 ^ h1;</div><div class='ctx'> }</div><div class='head'>diff --git a/libglusterfs/src/hashfn.h b/libglusterfs/src/hashfn.h<br/>deleted file mode 100644<br/>index 4cda48a092e..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/libglusterfs/src/hashfn.h?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/hashfn.h</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,37 +0,0 @@</div><div class='del'>-/*</div><div class='del'>-   Copyright (c) 2006-2009 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='del'>-   This file is part of GlusterFS.</div><div class='del'>-</div><div class='del'>-   GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-   it under the terms of the GNU General Public License as published</div><div class='del'>-   by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-   or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-   GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-   WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-   General Public License for more details.</div><div class='del'>-</div><div class='del'>-   You should have received a copy of the GNU General Public License</div><div class='del'>-   along with this program.  If not, see</div><div class='del'>-   &lt;http://www.gnu.org/licenses/&gt;.</div><div class='del'>-*/</div><div class='del'>-</div><div class='del'>-#ifndef __HASHFN_H__</div><div class='del'>-#define __HASHFN_H__</div><div class='del'>-</div><div class='del'>-#ifndef _CONFIG_H</div><div class='del'>-#define _CONFIG_H</div><div class='del'>-#include "config.h"</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-#include &lt;sys/types.h&gt;</div><div class='del'>-#include &lt;stdint.h&gt;</div><div class='del'>-</div><div class='del'>-uint32_t SuperFastHash (const char * data, int32_t len);</div><div class='del'>-</div><div class='del'>-uint32_t gf_dm_hashfn (const char *msg, int len);</div><div class='del'>-</div><div class='del'>-uint32_t</div><div class='del'>-ReallySimpleHash (char *path, int len);</div><div class='del'>-#endif /* __HASHFN_H__ */</div><div class='head'>diff --git a/libglusterfs/src/iatt.h b/libglusterfs/src/iatt.h<br/>deleted file mode 100644<br/>index e67d714c2a7..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/libglusterfs/src/iatt.h?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/iatt.h</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,325 +0,0 @@</div><div class='del'>-/*</div><div class='del'>-  Copyright (c) 2010 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='del'>-  This file is part of GlusterFS.</div><div class='del'>-</div><div class='del'>-  GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-  it under the terms of the GNU General Public License as published</div><div class='del'>-  by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-  or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-  GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-  WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-  General Public License for more details.</div><div class='del'>-</div><div class='del'>-  You should have received a copy of the GNU General Public License</div><div class='del'>-  along with this program.  If not, see</div><div class='del'>-  &lt;http://www.gnu.org/licenses/&gt;.</div><div class='del'>-*/</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-#ifndef _IATT_H</div><div class='del'>-#define _IATT_H</div><div class='del'>-</div><div class='del'>-#ifndef _CONFIG_H</div><div class='del'>-#define _CONFIG_H</div><div class='del'>-#include "config.h"</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-#include &lt;sys/types.h&gt;</div><div class='del'>-#include &lt;sys/stat.h&gt; /* for iatt &lt;--&gt; stat conversions */</div><div class='del'>-#include &lt;unistd.h&gt;</div><div class='del'>-</div><div class='del'>-#include "compat.h"</div><div class='del'>-#include "uuid.h"</div><div class='del'>-</div><div class='del'>-typedef enum {</div><div class='del'>-        IA_INVAL = 0,</div><div class='del'>-        IA_IFREG,</div><div class='del'>-        IA_IFDIR,</div><div class='del'>-        IA_IFLNK,</div><div class='del'>-        IA_IFBLK,</div><div class='del'>-        IA_IFCHR,</div><div class='del'>-        IA_IFIFO,</div><div class='del'>-        IA_IFSOCK</div><div class='del'>-} ia_type_t;</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-typedef struct {</div><div class='del'>-        uint8_t    suid:1;</div><div class='del'>-        uint8_t    sgid:1;</div><div class='del'>-        uint8_t    sticky:1;</div><div class='del'>-        struct {</div><div class='del'>-                uint8_t    read:1;</div><div class='del'>-                uint8_t    write:1;</div><div class='del'>-                uint8_t    exec:1;</div><div class='del'>-        } owner, group, other;</div><div class='del'>-} ia_prot_t;</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-struct iatt {</div><div class='del'>-        uint64_t     ia_ino;        /* inode number */</div><div class='del'>-        uint64_t     ia_gen;        /* generation number */</div><div class='del'>-        uuid_t       ia_gfid;</div><div class='del'>-        uint64_t     ia_dev;        /* backing device ID */</div><div class='del'>-        ia_type_t    ia_type;       /* type of file */</div><div class='del'>-        ia_prot_t    ia_prot;       /* protection */</div><div class='del'>-        uint32_t     ia_nlink;      /* Link count */</div><div class='del'>-        uint32_t     ia_uid;        /* user ID of owner */</div><div class='del'>-        uint32_t     ia_gid;        /* group ID of owner */</div><div class='del'>-        uint64_t     ia_rdev;       /* device ID (if special file) */</div><div class='del'>-        uint64_t     ia_size;       /* file size in bytes */</div><div class='del'>-        uint32_t     ia_blksize;    /* blocksize for filesystem I/O */</div><div class='del'>-        uint64_t     ia_blocks;     /* number of 512B blocks allocated */</div><div class='del'>-        uint32_t     ia_atime;      /* last access time */</div><div class='del'>-        uint32_t     ia_atime_nsec;</div><div class='del'>-        uint32_t     ia_mtime;      /* last modification time */</div><div class='del'>-        uint32_t     ia_mtime_nsec;</div><div class='del'>-        uint32_t     ia_ctime;      /* last status change time */</div><div class='del'>-        uint32_t     ia_ctime_nsec;</div><div class='del'>-};</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-#define IA_ISREG(t) (t == IA_IFREG)</div><div class='del'>-#define IA_ISDIR(t) (t == IA_IFDIR)</div><div class='del'>-#define IA_ISLNK(t) (t == IA_IFLNK)</div><div class='del'>-#define IA_ISBLK(t) (t == IA_IFBLK)</div><div class='del'>-#define IA_ISCHR(t) (t == IA_IFCHR)</div><div class='del'>-#define IA_ISFIFO(t) (t == IA_IFIFO)</div><div class='del'>-#define IA_ISSOCK(t) (t == IA_IFSOCK)</div><div class='del'>-</div><div class='del'>-#define IA_PROT_RUSR(prot)      ((prot).owner.read == 1)</div><div class='del'>-#define IA_PROT_WUSR(prot)      ((prot).owner.write == 1)</div><div class='del'>-#define IA_PROT_XUSR(prot)      ((prot).owner.exec == 1)</div><div class='del'>-</div><div class='del'>-#define IA_PROT_RGRP(prot)      ((prot).group.read == 1)</div><div class='del'>-#define IA_PROT_WGRP(prot)      ((prot).group.write == 1)</div><div class='del'>-#define IA_PROT_XGRP(prot)      ((prot).group.exec == 1)</div><div class='del'>-</div><div class='del'>-#define IA_PROT_ROTH(prot)      ((prot).other.read == 1)</div><div class='del'>-#define IA_PROT_WOTH(prot)      ((prot).other.write == 1)</div><div class='del'>-#define IA_PROT_XOTH(prot)      ((prot).other.exec == 1)</div><div class='del'>-</div><div class='del'>-#define IA_PROT_SUID(prot)      ((prot).suid == 1)</div><div class='del'>-#define IA_PROT_SGID(prot)      ((prot).sgid == 1)</div><div class='del'>-#define IA_PROT_STCKY(prot)     ((prot).sticky == 1)</div><div class='del'>-</div><div class='del'>-static inline uint32_t</div><div class='del'>-ia_major (uint64_t ia_dev)</div><div class='del'>-{</div><div class='del'>-        return (uint32_t) (ia_dev &gt;&gt; 32);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-static inline uint32_t</div><div class='del'>-ia_minor (uint64_t ia_dev)</div><div class='del'>-{</div><div class='del'>-        return (uint32_t) (ia_dev &amp; 0xffffffff);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-static inline uint64_t</div><div class='del'>-ia_makedev (uint32_t ia_maj, uint32_t ia_min)</div><div class='del'>-{</div><div class='del'>-        return ((((uint64_t) ia_maj) &lt;&lt; 32) &amp; ia_min);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-static inline ia_prot_t</div><div class='del'>-ia_prot_from_st_mode (mode_t mode)</div><div class='del'>-{</div><div class='del'>-        ia_prot_t ia_prot = {0, };</div><div class='del'>-</div><div class='del'>-        if (mode &amp; S_ISUID)</div><div class='del'>-                ia_prot.suid = 1;</div><div class='del'>-        if (mode &amp; S_ISGID)</div><div class='del'>-                ia_prot.sgid = 1;</div><div class='del'>-        if (mode &amp; S_ISVTX)</div><div class='del'>-                ia_prot.sticky = 1;</div><div class='del'>-</div><div class='del'>-        if (mode &amp; S_IRUSR)</div><div class='del'>-                ia_prot.owner.read = 1;</div><div class='del'>-        if (mode &amp; S_IWUSR)</div><div class='del'>-                ia_prot.owner.write = 1;</div><div class='del'>-        if (mode &amp; S_IXUSR)</div><div class='del'>-                ia_prot.owner.exec = 1;</div><div class='del'>-</div><div class='del'>-        if (mode &amp; S_IRGRP)</div><div class='del'>-                ia_prot.group.read = 1;</div><div class='del'>-        if (mode &amp; S_IWGRP)</div><div class='del'>-                ia_prot.group.write = 1;</div><div class='del'>-        if (mode &amp; S_IXGRP)</div><div class='del'>-                ia_prot.group.exec = 1;</div><div class='del'>-</div><div class='del'>-        if (mode &amp; S_IROTH)</div><div class='del'>-                ia_prot.other.read = 1;</div><div class='del'>-        if (mode &amp; S_IWOTH)</div><div class='del'>-                ia_prot.other.write = 1;</div><div class='del'>-        if (mode &amp; S_IXOTH)</div><div class='del'>-                ia_prot.other.exec = 1;</div><div class='del'>-</div><div class='del'>-        return ia_prot;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-static inline ia_type_t</div><div class='del'>-ia_type_from_st_mode (mode_t mode)</div><div class='del'>-{</div><div class='del'>-        ia_type_t type = IA_INVAL;</div><div class='del'>-</div><div class='del'>-        if (S_ISREG (mode))</div><div class='del'>-                type = IA_IFREG;</div><div class='del'>-        if (S_ISDIR (mode))</div><div class='del'>-                type = IA_IFDIR;</div><div class='del'>-        if (S_ISLNK (mode))</div><div class='del'>-                type = IA_IFLNK;</div><div class='del'>-        if (S_ISBLK (mode))</div><div class='del'>-                type = IA_IFBLK;</div><div class='del'>-        if (S_ISCHR (mode))</div><div class='del'>-                type = IA_IFCHR;</div><div class='del'>-        if (S_ISFIFO (mode))</div><div class='del'>-                type = IA_IFIFO;</div><div class='del'>-        if (S_ISSOCK (mode))</div><div class='del'>-                type = IA_IFSOCK;</div><div class='del'>-</div><div class='del'>-        return type;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-static inline mode_t</div><div class='del'>-st_mode_from_ia (ia_prot_t prot, ia_type_t type)</div><div class='del'>-{</div><div class='del'>-        mode_t    st_mode = 0;</div><div class='del'>-        uint32_t  type_bit = 0;</div><div class='del'>-        uint32_t  prot_bit = 0;</div><div class='del'>-</div><div class='del'>-        switch (type) {</div><div class='del'>-        case IA_IFREG:</div><div class='del'>-                type_bit = S_IFREG;</div><div class='del'>-                break;</div><div class='del'>-        case IA_IFDIR:</div><div class='del'>-                type_bit = S_IFDIR;</div><div class='del'>-                break;</div><div class='del'>-        case IA_IFLNK:</div><div class='del'>-                type_bit = S_IFLNK;</div><div class='del'>-                break;</div><div class='del'>-        case IA_IFBLK:</div><div class='del'>-                type_bit = S_IFBLK;</div><div class='del'>-                break;</div><div class='del'>-        case IA_IFCHR:</div><div class='del'>-                type_bit = S_IFCHR;</div><div class='del'>-                break;</div><div class='del'>-        case IA_IFIFO:</div><div class='del'>-                type_bit = S_IFIFO;</div><div class='del'>-                break;</div><div class='del'>-        case IA_IFSOCK:</div><div class='del'>-                type_bit = S_IFSOCK;</div><div class='del'>-                break;</div><div class='del'>-        case IA_INVAL:</div><div class='del'>-                break;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (prot.suid)</div><div class='del'>-                prot_bit |= S_ISUID;</div><div class='del'>-        if (prot.sgid)</div><div class='del'>-                prot_bit |= S_ISGID;</div><div class='del'>-        if (prot.sticky)</div><div class='del'>-                prot_bit |= S_ISVTX;</div><div class='del'>-</div><div class='del'>-        if (prot.owner.read)</div><div class='del'>-                prot_bit |= S_IRUSR;</div><div class='del'>-        if (prot.owner.write)</div><div class='del'>-                prot_bit |= S_IWUSR;</div><div class='del'>-        if (prot.owner.exec)</div><div class='del'>-                prot_bit |= S_IXUSR;</div><div class='del'>-</div><div class='del'>-        if (prot.group.read)</div><div class='del'>-                prot_bit |= S_IRGRP;</div><div class='del'>-        if (prot.group.write)</div><div class='del'>-                prot_bit |= S_IWGRP;</div><div class='del'>-        if (prot.group.exec)</div><div class='del'>-                prot_bit |= S_IXGRP;</div><div class='del'>-</div><div class='del'>-        if (prot.other.read)</div><div class='del'>-                prot_bit |= S_IROTH;</div><div class='del'>-        if (prot.other.write)</div><div class='del'>-                prot_bit |= S_IWOTH;</div><div class='del'>-        if (prot.other.exec)</div><div class='del'>-                prot_bit |= S_IXOTH;</div><div class='del'>-</div><div class='del'>-        st_mode = (type_bit | prot_bit);</div><div class='del'>-</div><div class='del'>-        return st_mode;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-static inline int</div><div class='del'>-iatt_from_stat (struct iatt *iatt, struct stat *stat)</div><div class='del'>-{</div><div class='del'>-        iatt-&gt;ia_dev        = stat-&gt;st_dev;</div><div class='del'>-        iatt-&gt;ia_ino        = stat-&gt;st_ino;</div><div class='del'>-</div><div class='del'>-        (void) iatt-&gt;ia_gen;</div><div class='del'>-</div><div class='del'>-        iatt-&gt;ia_type       = ia_type_from_st_mode (stat-&gt;st_mode);</div><div class='del'>-        iatt-&gt;ia_prot       = ia_prot_from_st_mode (stat-&gt;st_mode);</div><div class='del'>-</div><div class='del'>-        iatt-&gt;ia_nlink      = stat-&gt;st_nlink;</div><div class='del'>-        iatt-&gt;ia_uid        = stat-&gt;st_uid;</div><div class='del'>-        iatt-&gt;ia_gid        = stat-&gt;st_gid;</div><div class='del'>-</div><div class='del'>-        iatt-&gt;ia_rdev       = ia_makedev (major (stat-&gt;st_rdev),</div><div class='del'>-                                          minor (stat-&gt;st_rdev));</div><div class='del'>-</div><div class='del'>-        iatt-&gt;ia_size       = stat-&gt;st_size;</div><div class='del'>-        iatt-&gt;ia_blksize    = stat-&gt;st_blksize;</div><div class='del'>-        iatt-&gt;ia_blocks     = stat-&gt;st_blocks;</div><div class='del'>-</div><div class='del'>-        iatt-&gt;ia_atime      = stat-&gt;st_atime;</div><div class='del'>-        iatt-&gt;ia_atime_nsec = ST_ATIM_NSEC (stat);</div><div class='del'>-</div><div class='del'>-        iatt-&gt;ia_mtime      = stat-&gt;st_mtime;</div><div class='del'>-        iatt-&gt;ia_mtime_nsec = ST_MTIM_NSEC (stat);</div><div class='del'>-</div><div class='del'>-        iatt-&gt;ia_ctime      = stat-&gt;st_ctime;</div><div class='del'>-        iatt-&gt;ia_ctime_nsec = ST_CTIM_NSEC (stat);</div><div class='del'>-</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-static inline int</div><div class='del'>-iatt_to_stat (struct iatt *iatt, struct stat *stat)</div><div class='del'>-{</div><div class='del'>-        stat-&gt;st_dev        = iatt-&gt;ia_dev;</div><div class='del'>-        stat-&gt;st_ino        = iatt-&gt;ia_ino;</div><div class='del'>-</div><div class='del'>-        (void) iatt-&gt;ia_gen;</div><div class='del'>-</div><div class='del'>-        stat-&gt;st_mode       = st_mode_from_ia (iatt-&gt;ia_prot, iatt-&gt;ia_type);</div><div class='del'>-</div><div class='del'>-        stat-&gt;st_nlink      = iatt-&gt;ia_nlink;</div><div class='del'>-        stat-&gt;st_uid        = iatt-&gt;ia_uid;</div><div class='del'>-        stat-&gt;st_gid        = iatt-&gt;ia_gid;</div><div class='del'>-</div><div class='del'>-        stat-&gt;st_rdev       = makedev (ia_major (iatt-&gt;ia_rdev),</div><div class='del'>-                                       ia_minor (iatt-&gt;ia_rdev));</div><div class='del'>-</div><div class='del'>-        stat-&gt;st_size       = iatt-&gt;ia_size;</div><div class='del'>-        stat-&gt;st_blksize    = iatt-&gt;ia_blksize;</div><div class='del'>-        stat-&gt;st_blocks     = iatt-&gt;ia_blocks;</div><div class='del'>-</div><div class='del'>-        stat-&gt;st_atime      = iatt-&gt;ia_atime;</div><div class='del'>-        ST_ATIM_NSEC_SET (stat, iatt-&gt;ia_atime_nsec);</div><div class='del'>-</div><div class='del'>-        stat-&gt;st_mtime      = iatt-&gt;ia_mtime;</div><div class='del'>-        ST_MTIM_NSEC_SET (stat, iatt-&gt;ia_mtime_nsec);</div><div class='del'>-</div><div class='del'>-        stat-&gt;st_ctime      = iatt-&gt;ia_ctime;</div><div class='del'>-        ST_CTIM_NSEC_SET (stat, iatt-&gt;ia_ctime_nsec);</div><div class='del'>-</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-#endif /* _IATT_H */</div><div class='head'>diff --git a/libglusterfs/src/inode.c b/libglusterfs/src/inode.c<br/>index 45d151ef04b..dbadf77442d 100644<br/>--- a/<a href='/cgit/glusterfs.git/tree/libglusterfs/src/inode.c?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/inode.c</a><br/>+++ b/<a href='/cgit/glusterfs.git/tree/libglusterfs/src/inode.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>libglusterfs/src/inode.c</a></div><div class='hunk'>@@ -1,1436 +1,2677 @@</div><div class='ctx'> /*</div><div class='del'>-  Copyright (c) 2007-2009 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='add'>+  Copyright (c) 2008-2012 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='ctx'>   This file is part of GlusterFS.</div><div class='ctx'> </div><div class='del'>-  GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-  it under the terms of the GNU General Public License as published</div><div class='del'>-  by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-  or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-  GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-  WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-  General Public License for more details.</div><div class='del'>-</div><div class='del'>-  You should have received a copy of the GNU General Public License</div><div class='del'>-  along with this program.  If not, see</div><div class='del'>-  &lt;http://www.gnu.org/licenses/&gt;.</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='ctx'> */</div><div class='ctx'> </div><div class='del'>-#ifndef _CONFIG_H</div><div class='del'>-#define _CONFIG_H</div><div class='del'>-#include "config.h"</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-#include "inode.h"</div><div class='del'>-#include "common-utils.h"</div><div class='del'>-#include "statedump.h"</div><div class='add'>+#include "glusterfs/inode.h"</div><div class='add'>+#include "glusterfs/common-utils.h"</div><div class='add'>+#include "glusterfs/statedump.h"</div><div class='ctx'> #include &lt;pthread.h&gt;</div><div class='ctx'> #include &lt;sys/types.h&gt;</div><div class='ctx'> #include &lt;stdint.h&gt;</div><div class='del'>-#include "list.h"</div><div class='del'>-#include &lt;time.h&gt;</div><div class='add'>+#include "glusterfs/list.h"</div><div class='ctx'> #include &lt;assert.h&gt;</div><div class='add'>+#include "glusterfs/libglusterfs-messages.h"</div><div class='ctx'> </div><div class='ctx'> /* TODO:</div><div class='ctx'>    move latest accessed dentry to list_head of inode</div><div class='ctx'> */</div><div class='ctx'> </div><div class='del'>-#define INODE_DUMP_LIST(head, key_buf, key_prefix, list_type)           \</div><div class='del'>-        {                                                               \</div><div class='del'>-                int i = 1;                                              \</div><div class='del'>-                inode_t *inode = NULL;                                  \</div><div class='del'>-                list_for_each_entry (inode, head, list) {               \</div><div class='del'>-                        gf_proc_dump_build_key(key_buf, key_prefix, "%s.%d",list_type, \</div><div class='del'>-                                               i++);                    \</div><div class='del'>-                        gf_proc_dump_add_section(key_buf);              \</div><div class='del'>-                        inode_dump(inode, key);                         \</div><div class='del'>-                }                                                       \</div><div class='add'>+// clang-format off</div><div class='add'>+/*</div><div class='add'>+</div><div class='add'>+Details as per Xavi:</div><div class='add'>+</div><div class='add'>+ I think we should have 3 lists: active, lru and invalidate.</div><div class='add'>+</div><div class='add'>+We'll need 3 things: refs, nlookups and invalidate_sent flag. Any change of</div><div class='add'>+refs, invalidate_sent flag and moving from one list to another must be done</div><div class='add'>+atomically.</div><div class='add'>+</div><div class='add'>+With this information, these are the states that cause a transition:</div><div class='add'>+</div><div class='add'>+    refs nlookups inv_sent    op</div><div class='add'>+      1      0        0      unref  -&gt; refs = 0, active---&gt;destroy</div><div class='add'>+      1      1        0      unref  -&gt; refs = 0, active---&gt;lru</div><div class='add'>+      1      1        0     forget  -&gt; nlookups = 0, active---&gt;active</div><div class='add'>+     *0      1        0     forget  -&gt; nlookups = 0, lru---&gt;destroy</div><div class='add'>+     *0      1        1     forget  -&gt; nlookups = 0, invalidate---&gt;destroy</div><div class='add'>+      0      1        0       ref   -&gt; refs = 1, lru---&gt;active</div><div class='add'>+      0      1        1       ref   -&gt; refs = 1, inv_sent = 0, invalidate---&gt;active</div><div class='add'>+      0      1        0    overflow -&gt; refs = 1, inv_sent = 1, lru---&gt;invalidate</div><div class='add'>+      1      1        1      unref  -&gt; refs = 0, invalidate---&gt;invalidate</div><div class='add'>+      1      1        1     forget  -&gt; nlookups = 0, inv_sent = 0, invalidate---&gt;active</div><div class='add'>+</div><div class='add'>+(*) technically these combinations cannot happen because a forget sent by the</div><div class='add'>+kernel first calls ref() and then unref(). However it's equivalent.</div><div class='add'>+</div><div class='add'>+overflow means that lru list has grown beyond the limit and the inode needs to</div><div class='add'>+be invalidated. All other combinations do not cause a change in state or are not</div><div class='add'>+possible.</div><div class='add'>+</div><div class='add'>+Based on this, the code could be similar to this:</div><div class='add'>+</div><div class='add'>+    ref(inode, inv)</div><div class='add'>+    {</div><div class='add'>+        if (refs == 0) {</div><div class='add'>+            if (inv_sent) {</div><div class='add'>+                invalidate_count--;</div><div class='add'>+                inv_sent = 0;</div><div class='add'>+            } else {</div><div class='add'>+                lru_count--;</div><div class='add'>+            }</div><div class='add'>+            if (inv) {</div><div class='add'>+                inv_sent = 1;</div><div class='add'>+                invalidate_count++;</div><div class='add'>+                list_move(inode, invalidate);</div><div class='add'>+            } else {</div><div class='add'>+                active_count++;</div><div class='add'>+                list_move(inode, active);</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+        refs++;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    unref(inode, clear)</div><div class='add'>+    {</div><div class='add'>+        if (clear &amp;&amp; inv_sent) {</div><div class='add'>+            // there is a case of fuse itself sending forget, without</div><div class='add'>+            // invalidate, after entry delete, like unlink(), rmdir().</div><div class='add'>+            inv_sent = 0;</div><div class='add'>+            invalidate_count--;</div><div class='add'>+            active_count++;</div><div class='add'>+            list_move(inode, active);</div><div class='add'>+        }</div><div class='add'>+        refs--;</div><div class='add'>+        if ((refs == 0) &amp;&amp; !inv_sent) {</div><div class='add'>+            active_count--;</div><div class='add'>+            if (nlookups == 0) {</div><div class='add'>+                destroy(inode);</div><div class='add'>+            } else {</div><div class='add'>+                lru_count++;</div><div class='add'>+                list_move(inode, lru);</div><div class='add'>+            }</div><div class='ctx'>         }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    forget(inode)</div><div class='add'>+    {</div><div class='add'>+        ref(inode, false);</div><div class='add'>+        nlookups--;</div><div class='add'>+        unref(inode, true);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    overflow(inode)</div><div class='add'>+    {</div><div class='add'>+        ref(inode, true);</div><div class='add'>+        invalidator(inode);</div><div class='add'>+        unref(inode, false);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+*/</div><div class='add'>+// clang-format on</div><div class='add'>+</div><div class='add'>+#define INODE_DUMP_LIST(head, key_buf, key_prefix, list_type)                  \</div><div class='add'>+    {                                                                          \</div><div class='add'>+        int i = 1;                                                             \</div><div class='add'>+        inode_t *inode = NULL;                                                 \</div><div class='add'>+        list_for_each_entry(inode, head, list)                                 \</div><div class='add'>+        {                                                                      \</div><div class='add'>+            gf_proc_dump_build_key(key_buf, key_prefix, "%s.%d", list_type,    \</div><div class='add'>+                                   i++);                                       \</div><div class='add'>+            gf_proc_dump_add_section("%s", key_buf);                           \</div><div class='add'>+            inode_dump(inode, key);                                            \</div><div class='add'>+        }                                                                      \</div><div class='add'>+    }</div><div class='ctx'> </div><div class='ctx'> static inode_t *</div><div class='del'>-__inode_unref (inode_t *inode);</div><div class='add'>+__inode_unref(inode_t *inode, bool clear);</div><div class='ctx'> </div><div class='ctx'> static int</div><div class='del'>-inode_table_prune (inode_table_t *table);</div><div class='add'>+inode_table_prune(inode_table_t *table);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+fd_dump(struct list_head *head, char *prefix);</div><div class='ctx'> </div><div class='ctx'> static int</div><div class='del'>-hash_dentry (inode_t *parent, const char *name, int mod)</div><div class='add'>+hash_dentry(inode_t *parent, const char *name, int mod)</div><div class='ctx'> {</div><div class='del'>-        int hash = 0;</div><div class='del'>-        int ret = 0;</div><div class='add'>+    int hash = 0;</div><div class='add'>+    int ret = 0;</div><div class='ctx'> </div><div class='del'>-        hash = *name;</div><div class='del'>-        if (hash) {</div><div class='del'>-                for (name += 1; *name != '\0'; name++) {</div><div class='del'>-                        hash = (hash &lt;&lt; 5) - hash + *name;</div><div class='del'>-                }</div><div class='add'>+    hash = *name;</div><div class='add'>+    if (hash) {</div><div class='add'>+        for (name += 1; *name != '\0'; name++) {</div><div class='add'>+            hash = (hash &lt;&lt; 5) - hash + *name;</div><div class='ctx'>         }</div><div class='del'>-        ret = (hash + (unsigned long)parent) % mod;</div><div class='add'>+    }</div><div class='add'>+    ret = (hash + (unsigned long)parent) % mod;</div><div class='ctx'> </div><div class='del'>-        return ret;</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> static int</div><div class='del'>-hash_gfid (uuid_t uuid, int mod)</div><div class='add'>+hash_gfid(uuid_t uuid, int mod)</div><div class='ctx'> {</div><div class='del'>-        int ret = 0;</div><div class='del'>-</div><div class='del'>-        ret = uuid[15] + (uuid[14] &lt;&lt; 8);</div><div class='del'>-</div><div class='del'>-        return ret;</div><div class='add'>+    return ((uuid[15] + (uuid[14] &lt;&lt; 8)) % mod);</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> static void</div><div class='del'>-__dentry_hash (dentry_t *dentry)</div><div class='add'>+__dentry_hash(dentry_t *dentry, const int hash)</div><div class='ctx'> {</div><div class='del'>-        inode_table_t   *table = NULL;</div><div class='del'>-        int              hash = 0;</div><div class='del'>-</div><div class='del'>-        if (!dentry)</div><div class='del'>-                return;</div><div class='add'>+    inode_table_t *table = NULL;</div><div class='ctx'> </div><div class='del'>-        table = dentry-&gt;inode-&gt;table;</div><div class='del'>-        hash = hash_dentry (dentry-&gt;parent, dentry-&gt;name,</div><div class='del'>-                            table-&gt;hashsize);</div><div class='add'>+    table = dentry-&gt;inode-&gt;table;</div><div class='ctx'> </div><div class='del'>-        list_del_init (&amp;dentry-&gt;hash);</div><div class='del'>-        list_add (&amp;dentry-&gt;hash, &amp;table-&gt;name_hash[hash]);</div><div class='add'>+    list_del_init(&amp;dentry-&gt;hash);</div><div class='add'>+    list_add(&amp;dentry-&gt;hash, &amp;table-&gt;name_hash[hash]);</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> static int</div><div class='del'>-__is_dentry_hashed (dentry_t *dentry)</div><div class='add'>+__is_dentry_hashed(dentry_t *dentry)</div><div class='ctx'> {</div><div class='del'>-        if (!dentry)</div><div class='del'>-                return 0;</div><div class='del'>-</div><div class='del'>-        return !list_empty (&amp;dentry-&gt;hash);</div><div class='add'>+    return !list_empty(&amp;dentry-&gt;hash);</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> static void</div><div class='del'>-__dentry_unhash (dentry_t *dentry)</div><div class='add'>+__dentry_unhash(dentry_t *dentry)</div><div class='ctx'> {</div><div class='del'>-        if (!dentry)</div><div class='del'>-                return;</div><div class='del'>-</div><div class='del'>-        list_del_init (&amp;dentry-&gt;hash);</div><div class='add'>+    list_del_init(&amp;dentry-&gt;hash);</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> static void</div><div class='del'>-__dentry_unset (dentry_t *dentry)</div><div class='add'>+dentry_destroy(dentry_t *dentry)</div><div class='ctx'> {</div><div class='del'>-        struct mem_pool *tmp_pool = NULL;</div><div class='add'>+    if (!dentry)</div><div class='add'>+        return;</div><div class='ctx'> </div><div class='del'>-        if (!dentry)</div><div class='del'>-                return;</div><div class='add'>+    GF_FREE(dentry-&gt;name);</div><div class='add'>+    dentry-&gt;name = NULL;</div><div class='add'>+    mem_put(dentry);</div><div class='ctx'> </div><div class='del'>-        tmp_pool = dentry-&gt;inode-&gt;table-&gt;dentry_pool;</div><div class='del'>-        __dentry_unhash (dentry);</div><div class='add'>+    return;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        list_del_init (&amp;dentry-&gt;inode_list);</div><div class='add'>+static dentry_t *</div><div class='add'>+__dentry_unset(dentry_t *dentry)</div><div class='add'>+{</div><div class='add'>+    if (!dentry)</div><div class='add'>+        return NULL;</div><div class='ctx'> </div><div class='del'>-        if (dentry-&gt;name)</div><div class='del'>-                GF_FREE (dentry-&gt;name);</div><div class='add'>+    __dentry_unhash(dentry);</div><div class='ctx'> </div><div class='del'>-        if (dentry-&gt;parent) {</div><div class='del'>-                __inode_unref (dentry-&gt;parent);</div><div class='del'>-                dentry-&gt;parent = NULL;</div><div class='del'>-        }</div><div class='add'>+    list_del_init(&amp;dentry-&gt;inode_list);</div><div class='ctx'> </div><div class='del'>-        mem_put (tmp_pool, dentry);</div><div class='del'>-        tmp_pool = NULL;</div><div class='add'>+    if (dentry-&gt;parent) {</div><div class='add'>+        __inode_unref(dentry-&gt;parent, false);</div><div class='add'>+        dentry-&gt;parent = NULL;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='add'>+    return dentry;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+static int</div><div class='add'>+__foreach_ancestor_dentry(dentry_t *dentry,</div><div class='add'>+                          int(per_dentry_fn)(dentry_t *dentry, void *data),</div><div class='add'>+                          void *data)</div><div class='add'>+{</div><div class='add'>+    inode_t *parent = NULL;</div><div class='add'>+    dentry_t *each = NULL;</div><div class='add'>+    int ret = 0;</div><div class='ctx'> </div><div class='add'>+    if (!dentry) {</div><div class='add'>+        gf_msg_callingfn(THIS-&gt;name, GF_LOG_WARNING, 0, LG_MSG_DENTRY_NOT_FOUND,</div><div class='add'>+                         "dentry not found");</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = per_dentry_fn(dentry, data);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_smsg(THIS-&gt;name, GF_LOG_WARNING, 0, LG_MSG_PER_DENTRY_FAILED,</div><div class='add'>+                "ret=%d", ret, NULL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    parent = dentry-&gt;parent;</div><div class='add'>+    if (!parent) {</div><div class='add'>+        gf_smsg(THIS-&gt;name, GF_LOG_WARNING, 0, LG_MSG_PARENT_DENTRY_NOT_FOUND,</div><div class='add'>+                NULL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    list_for_each_entry(each, &amp;parent-&gt;dentry_list, inode_list)</div><div class='add'>+    {</div><div class='add'>+        ret = __foreach_ancestor_dentry(each, per_dentry_fn, data);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+    }</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-static void</div><div class='del'>-__inode_unhash (inode_t *inode)</div><div class='add'>+static int</div><div class='add'>+__check_cycle(dentry_t *a_dentry, void *data)</div><div class='ctx'> {</div><div class='del'>-        if (!inode)</div><div class='del'>-                return;</div><div class='add'>+    inode_t *link_inode = NULL;</div><div class='ctx'> </div><div class='del'>-        list_del_init (&amp;inode-&gt;hash);</div><div class='del'>-}</div><div class='add'>+    link_inode = data;</div><div class='add'>+</div><div class='add'>+    if (a_dentry-&gt;parent == link_inode)</div><div class='add'>+        return 1;</div><div class='ctx'> </div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> static int</div><div class='del'>-__is_inode_hashed (inode_t *inode)</div><div class='add'>+__is_dentry_cyclic(dentry_t *dentry)</div><div class='ctx'> {</div><div class='del'>-        if (!inode)</div><div class='del'>-                return 0;</div><div class='add'>+    int ret = 0;</div><div class='ctx'> </div><div class='del'>-        return !list_empty (&amp;inode-&gt;hash);</div><div class='del'>-}</div><div class='add'>+    ret = __foreach_ancestor_dentry(dentry, __check_cycle, dentry-&gt;inode);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_smsg(dentry-&gt;inode-&gt;table-&gt;name, GF_LOG_CRITICAL, 0,</div><div class='add'>+                LG_MSG_DENTRY_CYCLIC_LOOP, "gfid=%s name=-%s",</div><div class='add'>+                uuid_utoa(dentry-&gt;inode-&gt;gfid), dentry-&gt;name, NULL);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> static void</div><div class='del'>-__inode_hash (inode_t *inode)</div><div class='add'>+__inode_unhash(inode_t *inode)</div><div class='ctx'> {</div><div class='del'>-        inode_table_t *table = NULL;</div><div class='del'>-        int            hash = 0;</div><div class='add'>+    list_del_init(&amp;inode-&gt;hash);</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        if (!inode)</div><div class='del'>-                return;</div><div class='add'>+static int</div><div class='add'>+__is_inode_hashed(inode_t *inode)</div><div class='add'>+{</div><div class='add'>+    return !list_empty(&amp;inode-&gt;hash);</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        table = inode-&gt;table;</div><div class='del'>-        hash = hash_gfid (inode-&gt;gfid, 65536);</div><div class='add'>+static void</div><div class='add'>+__inode_hash(inode_t *inode, const int hash)</div><div class='add'>+{</div><div class='add'>+    inode_table_t *table = inode-&gt;table;</div><div class='ctx'> </div><div class='del'>-        list_del_init (&amp;inode-&gt;hash);</div><div class='del'>-        list_add (&amp;inode-&gt;hash, &amp;table-&gt;inode_hash[hash]);</div><div class='add'>+    list_del_init(&amp;inode-&gt;hash);</div><div class='add'>+    list_add(&amp;inode-&gt;hash, &amp;table-&gt;inode_hash[hash]);</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> static dentry_t *</div><div class='del'>-__dentry_search_for_inode (inode_t *inode, ino_t par, const char *name)</div><div class='add'>+__dentry_search_for_inode(inode_t *inode, uuid_t pargfid, const char *name)</div><div class='ctx'> {</div><div class='del'>-        dentry_t *dentry = NULL;</div><div class='del'>-        dentry_t *tmp = NULL;</div><div class='add'>+    dentry_t *dentry = NULL;</div><div class='add'>+    dentry_t *tmp = NULL;</div><div class='ctx'> </div><div class='del'>-        if (!inode || !name)</div><div class='del'>-                return NULL;</div><div class='add'>+    /* earlier, just the ino was sent, which could have been 0, now</div><div class='add'>+       we deal with gfid, and if sent gfid is null or 0, no need to</div><div class='add'>+       continue with the check */</div><div class='add'>+    if (!pargfid || gf_uuid_is_null(pargfid))</div><div class='add'>+        return NULL;</div><div class='ctx'> </div><div class='del'>-        list_for_each_entry (tmp, &amp;inode-&gt;dentry_list, inode_list) {</div><div class='del'>-                if (tmp-&gt;parent-&gt;ino == par &amp;&amp; !strcmp (tmp-&gt;name, name)) {</div><div class='del'>-                        dentry = tmp;</div><div class='del'>-                        break;</div><div class='del'>-                }</div><div class='add'>+    list_for_each_entry(tmp, &amp;inode-&gt;dentry_list, inode_list)</div><div class='add'>+    {</div><div class='add'>+        if ((gf_uuid_compare(tmp-&gt;parent-&gt;gfid, pargfid) == 0) &amp;&amp;</div><div class='add'>+            !strcmp(tmp-&gt;name, name)) {</div><div class='add'>+            dentry = tmp;</div><div class='add'>+            break;</div><div class='ctx'>         }</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        return dentry;</div><div class='add'>+    return dentry;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> static void</div><div class='del'>-__inode_destroy (inode_t *inode)</div><div class='add'>+__inode_ctx_free(inode_t *inode)</div><div class='ctx'> {</div><div class='del'>-        int          index = 0;</div><div class='del'>-        xlator_t    *xl = NULL;</div><div class='del'>-        xlator_t    *old_THIS = NULL;</div><div class='del'>-        struct mem_pool *tmp_pool = NULL;</div><div class='del'>-</div><div class='del'>-        if (!inode)</div><div class='del'>-                return;</div><div class='del'>-</div><div class='del'>-        if (!inode-&gt;_ctx)</div><div class='del'>-                goto noctx;</div><div class='del'>-</div><div class='del'>-        tmp_pool = inode-&gt;table-&gt;inode_pool;</div><div class='del'>-</div><div class='del'>-        for (index = 0; index &lt; inode-&gt;table-&gt;xl-&gt;graph-&gt;xl_count; index++) {</div><div class='del'>-                if (inode-&gt;_ctx[index].xl_key) {</div><div class='del'>-                        xl = (xlator_t *)(long)inode-&gt;_ctx[index].xl_key;</div><div class='del'>-                        old_THIS = THIS;</div><div class='del'>-                        THIS = xl;</div><div class='del'>-                        if (xl-&gt;cbks-&gt;forget)</div><div class='del'>-                                xl-&gt;cbks-&gt;forget (xl, inode);</div><div class='del'>-                        THIS = old_THIS;</div><div class='del'>-                }</div><div class='add'>+    int index = 0;</div><div class='add'>+    xlator_t *xl = NULL;</div><div class='add'>+    xlator_t *old_THIS = NULL;</div><div class='add'>+</div><div class='add'>+    if (!inode-&gt;_ctx) {</div><div class='add'>+        gf_smsg(THIS-&gt;name, GF_LOG_WARNING, 0, LG_MSG_CTX_NULL, NULL);</div><div class='add'>+        goto noctx;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    for (index = 0; index &lt; inode-&gt;table-&gt;ctxcount; index++) {</div><div class='add'>+        if (inode-&gt;_ctx[index].value1 || inode-&gt;_ctx[index].value2) {</div><div class='add'>+            xl = (xlator_t *)(long)inode-&gt;_ctx[index].xl_key;</div><div class='add'>+            if (xl &amp;&amp; !xl-&gt;call_cleanup &amp;&amp; xl-&gt;cbks-&gt;forget) {</div><div class='add'>+                old_THIS = THIS;</div><div class='add'>+                THIS = xl;</div><div class='add'>+                xl-&gt;cbks-&gt;forget(xl, inode);</div><div class='add'>+                THIS = old_THIS;</div><div class='add'>+            }</div><div class='ctx'>         }</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        GF_FREE (inode-&gt;_ctx);</div><div class='del'>-noctx:</div><div class='del'>-        LOCK_DESTROY (&amp;inode-&gt;lock);</div><div class='del'>-        //  memset (inode, 0xb, sizeof (*inode));</div><div class='del'>-        mem_put (tmp_pool, inode);</div><div class='del'>-	 tmp_pool = NULL;</div><div class='add'>+    GF_FREE(inode-&gt;_ctx);</div><div class='add'>+    inode-&gt;_ctx = NULL;</div><div class='ctx'> </div><div class='add'>+noctx:</div><div class='add'>+    return;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> static void</div><div class='del'>-__inode_activate (inode_t *inode)</div><div class='add'>+__inode_destroy(inode_t *inode)</div><div class='ctx'> {</div><div class='del'>-        if (!inode)</div><div class='del'>-                return;</div><div class='add'>+    __inode_ctx_free(inode);</div><div class='ctx'> </div><div class='del'>-        list_move (&amp;inode-&gt;list, &amp;inode-&gt;table-&gt;active);</div><div class='del'>-        inode-&gt;table-&gt;active_size++;</div><div class='add'>+    LOCK_DESTROY(&amp;inode-&gt;lock);</div><div class='add'>+    //  memset (inode, 0xb, sizeof (*inode));</div><div class='add'>+    mem_put(inode);</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='del'>-static void</div><div class='del'>-__inode_passivate (inode_t *inode)</div><div class='add'>+void</div><div class='add'>+inode_ctx_merge(fd_t *fd, inode_t *inode, inode_t *linked_inode)</div><div class='ctx'> {</div><div class='del'>-        dentry_t      *dentry = NULL;</div><div class='del'>-        dentry_t      *t = NULL;</div><div class='add'>+    int index = 0;</div><div class='add'>+    xlator_t *xl = NULL;</div><div class='add'>+    xlator_t *old_THIS = NULL;</div><div class='ctx'> </div><div class='del'>-        if (!inode)</div><div class='del'>-                return;</div><div class='add'>+    if (!fd || !inode || !linked_inode) {</div><div class='add'>+        gf_msg_callingfn(THIS-&gt;name, GF_LOG_WARNING, EINVAL, LG_MSG_INVALID_ARG,</div><div class='add'>+                         "invalid inode");</div><div class='add'>+        return;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (!inode-&gt;_ctx || !linked_inode-&gt;_ctx) {</div><div class='add'>+        gf_msg_callingfn(THIS-&gt;name, GF_LOG_WARNING, EINVAL, LG_MSG_INVALID_ARG,</div><div class='add'>+                         "invalid inode context");</div><div class='add'>+        return;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        list_move_tail (&amp;inode-&gt;list, &amp;inode-&gt;table-&gt;lru);</div><div class='del'>-        inode-&gt;table-&gt;lru_size++;</div><div class='add'>+    for (; index &lt; inode-&gt;table-&gt;ctxcount; index++) {</div><div class='add'>+        if (inode-&gt;_ctx[index].xl_key) {</div><div class='add'>+            xl = (xlator_t *)(long)inode-&gt;_ctx[index].xl_key;</div><div class='ctx'> </div><div class='del'>-        list_for_each_entry_safe (dentry, t, &amp;inode-&gt;dentry_list, inode_list) {</div><div class='del'>-                if (!__is_dentry_hashed (dentry))</div><div class='del'>-                        __dentry_unset (dentry);</div><div class='add'>+            old_THIS = THIS;</div><div class='add'>+            THIS = xl;</div><div class='add'>+            if (xl-&gt;cbks-&gt;ictxmerge)</div><div class='add'>+                xl-&gt;cbks-&gt;ictxmerge(xl, fd, inode, linked_inode);</div><div class='add'>+            THIS = old_THIS;</div><div class='ctx'>         }</div><div class='add'>+    }</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+static void</div><div class='add'>+__inode_activate(inode_t *inode)</div><div class='add'>+{</div><div class='add'>+    list_move(&amp;inode-&gt;list, &amp;inode-&gt;table-&gt;active);</div><div class='add'>+    inode-&gt;table-&gt;active_size++;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> static void</div><div class='del'>-__inode_retire (inode_t *inode)</div><div class='add'>+__inode_passivate(inode_t *inode)</div><div class='ctx'> {</div><div class='del'>-        dentry_t      *dentry = NULL;</div><div class='del'>-        dentry_t      *t = NULL;</div><div class='add'>+    dentry_t *dentry = NULL;</div><div class='add'>+    dentry_t *t = NULL;</div><div class='add'>+</div><div class='add'>+    list_move_tail(&amp;inode-&gt;list, &amp;inode-&gt;table-&gt;lru);</div><div class='add'>+    inode-&gt;table-&gt;lru_size++;</div><div class='add'>+</div><div class='add'>+    list_for_each_entry_safe(dentry, t, &amp;inode-&gt;dentry_list, inode_list)</div><div class='add'>+    {</div><div class='add'>+        if (!__is_dentry_hashed(dentry))</div><div class='add'>+            dentry_destroy(__dentry_unset(dentry));</div><div class='add'>+    }</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        if (!inode)</div><div class='del'>-                return;</div><div class='add'>+static void</div><div class='add'>+__inode_retire(inode_t *inode)</div><div class='add'>+{</div><div class='add'>+    dentry_t *dentry = NULL;</div><div class='add'>+    dentry_t *t = NULL;</div><div class='ctx'> </div><div class='del'>-        list_move_tail (&amp;inode-&gt;list, &amp;inode-&gt;table-&gt;purge);</div><div class='del'>-        inode-&gt;table-&gt;purge_size++;</div><div class='add'>+    list_move_tail(&amp;inode-&gt;list, &amp;inode-&gt;table-&gt;purge);</div><div class='add'>+    inode-&gt;table-&gt;purge_size++;</div><div class='ctx'> </div><div class='del'>-        __inode_unhash (inode);</div><div class='add'>+    __inode_unhash(inode);</div><div class='ctx'> </div><div class='del'>-        list_for_each_entry_safe (dentry, t, &amp;inode-&gt;dentry_list, inode_list) {</div><div class='del'>-                __dentry_unset (dentry);</div><div class='del'>-        }</div><div class='add'>+    list_for_each_entry_safe(dentry, t, &amp;inode-&gt;dentry_list, inode_list)</div><div class='add'>+    {</div><div class='add'>+        dentry_destroy(__dentry_unset(dentry));</div><div class='add'>+    }</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+static int</div><div class='add'>+__inode_get_xl_index(inode_t *inode, xlator_t *xlator)</div><div class='add'>+{</div><div class='add'>+    int set_idx = -1;</div><div class='add'>+</div><div class='add'>+    if ((inode-&gt;_ctx[xlator-&gt;xl_id].xl_key != NULL) &amp;&amp;</div><div class='add'>+        (inode-&gt;_ctx[xlator-&gt;xl_id].xl_key != xlator))</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    set_idx = xlator-&gt;xl_id;</div><div class='add'>+    inode-&gt;_ctx[set_idx].xl_key = xlator;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return set_idx;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> static inode_t *</div><div class='del'>-__inode_unref (inode_t *inode)</div><div class='add'>+__inode_unref(inode_t *inode, bool clear)</div><div class='ctx'> {</div><div class='del'>-        if (!inode)</div><div class='del'>-                return NULL;</div><div class='add'>+    int index = 0;</div><div class='add'>+    xlator_t *this = NULL;</div><div class='add'>+    uint64_t nlookup = 0;</div><div class='add'>+</div><div class='add'>+    /*</div><div class='add'>+     * Root inode should always be in active list of inode table. So unrefs</div><div class='add'>+     * on root inode are no-ops.</div><div class='add'>+     */</div><div class='add'>+    if (__is_root_gfid(inode-&gt;gfid))</div><div class='add'>+        return inode;</div><div class='ctx'> </div><div class='del'>-        if (inode-&gt;ino == 1)</div><div class='del'>-                return inode;</div><div class='add'>+    /*</div><div class='add'>+     * No need to acquire inode table's lock</div><div class='add'>+     * as __inode_unref is called after acquiding</div><div class='add'>+     * the inode table's lock.</div><div class='add'>+     */</div><div class='add'>+    if (inode-&gt;table-&gt;cleanup_started &amp;&amp; !inode-&gt;ref)</div><div class='add'>+        /*</div><div class='add'>+         * There is a good chance that, the inode</div><div class='add'>+         * on which unref came has already been</div><div class='add'>+         * zero refed and added to the purge list.</div><div class='add'>+         * This can happen when inode table is</div><div class='add'>+         * being destroyed (glfs_fini is something</div><div class='add'>+         * which destroys the inode table).</div><div class='add'>+         *</div><div class='add'>+         * Consider a directory 'a' which has a file</div><div class='add'>+         * 'b'. Now as part of inode table destruction</div><div class='add'>+         * zero refing of inodes does not happen from</div><div class='add'>+         * leaf to the root. It happens in the order</div><div class='add'>+         * inodes are present in the list. So, in this</div><div class='add'>+         * example, the dentry of 'b' would have its</div><div class='add'>+         * parent set to the inode of 'a'. So if</div><div class='add'>+         * 'a' gets zero refed first (as part of</div><div class='add'>+         * inode table cleanup) and then 'b' has to</div><div class='add'>+         * zero refed, then dentry_unset is called on</div><div class='add'>+         * the dentry of 'b' and it further goes on to</div><div class='add'>+         * call inode_unref on b's parent which is 'a'.</div><div class='add'>+         * In this situation, GF_ASSERT would be called</div><div class='add'>+         * below as the refcount of 'a' has been already set</div><div class='add'>+         * to zero.</div><div class='add'>+         *</div><div class='add'>+         * So return the inode if the inode table cleanup</div><div class='add'>+         * has already started and inode refcount is 0.</div><div class='add'>+         */</div><div class='add'>+        return inode;</div><div class='ctx'> </div><div class='del'>-        assert (inode-&gt;ref);</div><div class='add'>+    this = THIS;</div><div class='ctx'> </div><div class='del'>-        --inode-&gt;ref;</div><div class='add'>+    if (clear &amp;&amp; inode-&gt;in_invalidate_list) {</div><div class='add'>+        inode-&gt;in_invalidate_list = false;</div><div class='add'>+        inode-&gt;table-&gt;invalidate_size--;</div><div class='add'>+        __inode_activate(inode);</div><div class='add'>+    }</div><div class='add'>+    GF_ASSERT(inode-&gt;ref);</div><div class='ctx'> </div><div class='del'>-        if (!inode-&gt;ref) {</div><div class='del'>-                inode-&gt;table-&gt;active_size--;</div><div class='add'>+    --inode-&gt;ref;</div><div class='ctx'> </div><div class='del'>-                if (inode-&gt;nlookup)</div><div class='del'>-                        __inode_passivate (inode);</div><div class='del'>-                else</div><div class='del'>-                        __inode_retire (inode);</div><div class='del'>-        }</div><div class='add'>+    index = __inode_get_xl_index(inode, this);</div><div class='add'>+    if (index &gt;= 0) {</div><div class='add'>+        inode-&gt;_ctx[index].xl_key = this;</div><div class='add'>+        inode-&gt;_ctx[index].ref--;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        return inode;</div><div class='del'>-}</div><div class='add'>+    if (!inode-&gt;ref &amp;&amp; !inode-&gt;in_invalidate_list) {</div><div class='add'>+        inode-&gt;table-&gt;active_size--;</div><div class='add'>+</div><div class='add'>+        nlookup = GF_ATOMIC_GET(inode-&gt;nlookup);</div><div class='add'>+        if (nlookup)</div><div class='add'>+            __inode_passivate(inode);</div><div class='add'>+        else</div><div class='add'>+            __inode_retire(inode);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='add'>+    return inode;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> static inode_t *</div><div class='del'>-__inode_ref (inode_t *inode)</div><div class='add'>+__inode_ref(inode_t *inode, bool is_invalidate)</div><div class='ctx'> {</div><div class='del'>-        if (!inode)</div><div class='del'>-                return NULL;</div><div class='add'>+    int index = 0;</div><div class='add'>+    xlator_t *this = NULL;</div><div class='ctx'> </div><div class='del'>-        if (!inode-&gt;ref) {</div><div class='del'>-                inode-&gt;table-&gt;lru_size--;</div><div class='del'>-                __inode_activate (inode);</div><div class='del'>-        }</div><div class='del'>-        inode-&gt;ref++;</div><div class='add'>+    if (!inode)</div><div class='add'>+        return NULL;</div><div class='ctx'> </div><div class='add'>+    this = THIS;</div><div class='add'>+</div><div class='add'>+    /*</div><div class='add'>+     * Root inode should always be in active list of inode table. So unrefs</div><div class='add'>+     * on root inode are no-ops. If we do not allow unrefs but allow refs,</div><div class='add'>+     * it leads to refcount overflows and deleting and adding the inode</div><div class='add'>+     * to active-list, which is ugly. active_size (check __inode_activate)</div><div class='add'>+     * in inode table increases which is wrong. So just keep the ref</div><div class='add'>+     * count as 1 always</div><div class='add'>+     */</div><div class='add'>+    if (__is_root_gfid(inode-&gt;gfid) &amp;&amp; inode-&gt;ref)</div><div class='ctx'>         return inode;</div><div class='del'>-}</div><div class='ctx'> </div><div class='add'>+    if (!inode-&gt;ref) {</div><div class='add'>+        if (inode-&gt;in_invalidate_list) {</div><div class='add'>+            inode-&gt;in_invalidate_list = false;</div><div class='add'>+            inode-&gt;table-&gt;invalidate_size--;</div><div class='add'>+        } else {</div><div class='add'>+            inode-&gt;table-&gt;lru_size--;</div><div class='add'>+        }</div><div class='add'>+        if (is_invalidate) {</div><div class='add'>+            inode-&gt;in_invalidate_list = true;</div><div class='add'>+            inode-&gt;table-&gt;invalidate_size++;</div><div class='add'>+            list_move_tail(&amp;inode-&gt;list, &amp;inode-&gt;table-&gt;invalidate);</div><div class='add'>+        } else {</div><div class='add'>+            __inode_activate(inode);</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    inode-&gt;ref++;</div><div class='add'>+</div><div class='add'>+    index = __inode_get_xl_index(inode, this);</div><div class='add'>+    if (index &gt;= 0) {</div><div class='add'>+        inode-&gt;_ctx[index].xl_key = this;</div><div class='add'>+        inode-&gt;_ctx[index].ref++;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return inode;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> inode_t *</div><div class='del'>-inode_unref (inode_t *inode)</div><div class='add'>+inode_unref(inode_t *inode)</div><div class='ctx'> {</div><div class='del'>-        inode_table_t *table = NULL;</div><div class='add'>+    inode_table_t *table = NULL;</div><div class='ctx'> </div><div class='del'>-        if (!inode)</div><div class='del'>-                return NULL;</div><div class='add'>+    if (!inode)</div><div class='add'>+        return NULL;</div><div class='ctx'> </div><div class='del'>-        table = inode-&gt;table;</div><div class='add'>+    table = inode-&gt;table;</div><div class='ctx'> </div><div class='del'>-        pthread_mutex_lock (&amp;table-&gt;lock);</div><div class='del'>-        {</div><div class='del'>-                inode = __inode_unref (inode);</div><div class='del'>-        }</div><div class='del'>-        pthread_mutex_unlock (&amp;table-&gt;lock);</div><div class='add'>+    pthread_mutex_lock(&amp;table-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        inode = __inode_unref(inode, false);</div><div class='add'>+    }</div><div class='add'>+    pthread_mutex_unlock(&amp;table-&gt;lock);</div><div class='ctx'> </div><div class='del'>-        inode_table_prune (table);</div><div class='add'>+    inode_table_prune(table);</div><div class='ctx'> </div><div class='del'>-        return inode;</div><div class='add'>+    return inode;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> inode_t *</div><div class='del'>-inode_ref (inode_t *inode)</div><div class='add'>+inode_ref(inode_t *inode)</div><div class='ctx'> {</div><div class='del'>-        inode_table_t *table = NULL;</div><div class='add'>+    inode_table_t *table = NULL;</div><div class='ctx'> </div><div class='del'>-        if (!inode)</div><div class='del'>-                return NULL;</div><div class='add'>+    if (!inode)</div><div class='add'>+        return NULL;</div><div class='ctx'> </div><div class='del'>-        table = inode-&gt;table;</div><div class='add'>+    table = inode-&gt;table;</div><div class='ctx'> </div><div class='del'>-        pthread_mutex_lock (&amp;table-&gt;lock);</div><div class='del'>-        {</div><div class='del'>-                inode = __inode_ref (inode);</div><div class='del'>-        }</div><div class='del'>-        pthread_mutex_unlock (&amp;table-&gt;lock);</div><div class='add'>+    pthread_mutex_lock(&amp;table-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        inode = __inode_ref(inode, false);</div><div class='add'>+    }</div><div class='add'>+    pthread_mutex_unlock(&amp;table-&gt;lock);</div><div class='ctx'> </div><div class='del'>-        return inode;</div><div class='add'>+    return inode;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> static dentry_t *</div><div class='del'>-__dentry_create (inode_t *inode, inode_t *parent, const char *name)</div><div class='add'>+dentry_create(inode_t *inode, inode_t *parent, const char *name)</div><div class='ctx'> {</div><div class='del'>-        dentry_t      *newd = NULL;</div><div class='del'>-</div><div class='del'>-        if (!inode || !parent || !name)</div><div class='del'>-                return NULL;</div><div class='del'>-</div><div class='del'>-        newd = mem_get0 (parent-&gt;table-&gt;dentry_pool);</div><div class='add'>+    dentry_t *newd = NULL;</div><div class='ctx'> </div><div class='del'>-        if (newd == NULL) {</div><div class='del'>-                gf_log ("inode", GF_LOG_ERROR, "out of memory");</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        INIT_LIST_HEAD (&amp;newd-&gt;inode_list);</div><div class='del'>-        INIT_LIST_HEAD (&amp;newd-&gt;hash);</div><div class='add'>+    newd = mem_get0(parent-&gt;table-&gt;dentry_pool);</div><div class='add'>+    if (newd == NULL) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        newd-&gt;name = gf_strdup (name);</div><div class='del'>-        if (newd-&gt;name == NULL) {</div><div class='del'>-                gf_log ("inode", GF_LOG_ERROR, "out of memory");</div><div class='del'>-                mem_put (parent-&gt;table-&gt;dentry_pool, newd);</div><div class='del'>-                newd = NULL;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='add'>+    INIT_LIST_HEAD(&amp;newd-&gt;inode_list);</div><div class='add'>+    INIT_LIST_HEAD(&amp;newd-&gt;hash);</div><div class='ctx'> </div><div class='del'>-        if (parent)</div><div class='del'>-                newd-&gt;parent = __inode_ref (parent);</div><div class='add'>+    newd-&gt;name = gf_strdup(name);</div><div class='add'>+    if (newd-&gt;name == NULL) {</div><div class='add'>+        mem_put(newd);</div><div class='add'>+        newd = NULL;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        list_add (&amp;newd-&gt;inode_list, &amp;inode-&gt;dentry_list);</div><div class='del'>-        newd-&gt;inode = inode;</div><div class='add'>+    newd-&gt;inode = inode;</div><div class='ctx'> </div><div class='ctx'> out:</div><div class='del'>-        return newd;</div><div class='add'>+    return newd;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> static inode_t *</div><div class='del'>-__inode_create (inode_table_t *table)</div><div class='add'>+inode_create(inode_table_t *table)</div><div class='ctx'> {</div><div class='del'>-        inode_t  *newi = NULL;</div><div class='del'>-</div><div class='del'>-        if (!table)</div><div class='del'>-                return NULL;</div><div class='add'>+    inode_t *newi = NULL;</div><div class='ctx'> </div><div class='del'>-        newi = mem_get0 (table-&gt;inode_pool);</div><div class='del'>-        if (!newi) {</div><div class='del'>-                gf_log ("inode", GF_LOG_ERROR, "out of memory");</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='add'>+    newi = mem_get0(table-&gt;inode_pool);</div><div class='add'>+    if (!newi) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        newi-&gt;table = table;</div><div class='add'>+    newi-&gt;table = table;</div><div class='ctx'> </div><div class='del'>-        LOCK_INIT (&amp;newi-&gt;lock);</div><div class='add'>+    LOCK_INIT(&amp;newi-&gt;lock);</div><div class='ctx'> </div><div class='del'>-        INIT_LIST_HEAD (&amp;newi-&gt;fd_list);</div><div class='del'>-        INIT_LIST_HEAD (&amp;newi-&gt;list);</div><div class='del'>-        INIT_LIST_HEAD (&amp;newi-&gt;hash);</div><div class='del'>-        INIT_LIST_HEAD (&amp;newi-&gt;dentry_list);</div><div class='del'>-</div><div class='del'>-        newi-&gt;_ctx = GF_CALLOC (1, (sizeof (struct _inode_ctx) *</div><div class='del'>-                                    table-&gt;xl-&gt;graph-&gt;xl_count),</div><div class='del'>-                                    gf_common_mt_inode_ctx);</div><div class='del'>-</div><div class='del'>-        if (newi-&gt;_ctx == NULL) {</div><div class='del'>-                gf_log ("inode", GF_LOG_ERROR, "out of memory");</div><div class='del'>-                LOCK_DESTROY (&amp;newi-&gt;lock);</div><div class='del'>-                mem_put (table-&gt;inode_pool, newi);</div><div class='del'>-                newi = NULL;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='add'>+    INIT_LIST_HEAD(&amp;newi-&gt;fd_list);</div><div class='add'>+    INIT_LIST_HEAD(&amp;newi-&gt;list);</div><div class='add'>+    INIT_LIST_HEAD(&amp;newi-&gt;hash);</div><div class='add'>+    INIT_LIST_HEAD(&amp;newi-&gt;dentry_list);</div><div class='ctx'> </div><div class='del'>-        list_add (&amp;newi-&gt;list, &amp;table-&gt;lru);</div><div class='del'>-        table-&gt;lru_size++;</div><div class='add'>+    newi-&gt;_ctx = GF_CALLOC(1, (sizeof(struct _inode_ctx) * table-&gt;ctxcount),</div><div class='add'>+                           gf_common_mt_inode_ctx);</div><div class='add'>+    if (newi-&gt;_ctx == NULL) {</div><div class='add'>+        LOCK_DESTROY(&amp;newi-&gt;lock);</div><div class='add'>+        mem_put(newi);</div><div class='add'>+        newi = NULL;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='ctx'> out:</div><div class='del'>-</div><div class='del'>-        return newi;</div><div class='add'>+    return newi;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> inode_t *</div><div class='del'>-inode_new (inode_table_t *table)</div><div class='add'>+inode_new(inode_table_t *table)</div><div class='ctx'> {</div><div class='del'>-        inode_t *inode = NULL;</div><div class='add'>+    inode_t *inode = NULL;</div><div class='ctx'> </div><div class='del'>-        if (!table)</div><div class='del'>-                return NULL;</div><div class='add'>+    if (!table) {</div><div class='add'>+        gf_msg_callingfn(THIS-&gt;name, GF_LOG_WARNING, 0,</div><div class='add'>+                         LG_MSG_INODE_TABLE_NOT_FOUND,</div><div class='add'>+                         "inode not "</div><div class='add'>+                         "found");</div><div class='add'>+        return NULL;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        pthread_mutex_lock (&amp;table-&gt;lock);</div><div class='add'>+    inode = inode_create(table);</div><div class='add'>+    if (inode) {</div><div class='add'>+        pthread_mutex_lock(&amp;table-&gt;lock);</div><div class='ctx'>         {</div><div class='del'>-                inode = __inode_create (table);</div><div class='del'>-                if (inode != NULL) {</div><div class='del'>-                        __inode_ref (inode);</div><div class='del'>-                }</div><div class='add'>+            list_add(&amp;inode-&gt;list, &amp;table-&gt;lru);</div><div class='add'>+            table-&gt;lru_size++;</div><div class='add'>+            __inode_ref(inode, false);</div><div class='ctx'>         }</div><div class='del'>-        pthread_mutex_unlock (&amp;table-&gt;lock);</div><div class='add'>+        pthread_mutex_unlock(&amp;table-&gt;lock);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        return inode;</div><div class='add'>+    return inode;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='add'>+/* Reduce the ref count by value 'nref'</div><div class='add'>+ * Args:</div><div class='add'>+ * inode - address of the inode to operate on</div><div class='add'>+ * nref - number to subtracted from inode-&gt;ref</div><div class='add'>+ *        if nref is 0, then the ref count is overwritten 0</div><div class='add'>+ *</div><div class='add'>+ * This function may cause the purging of the inode,</div><div class='add'>+ * hence to be used only in destructor functions and not otherwise.</div><div class='add'>+ */</div><div class='ctx'> static inode_t *</div><div class='del'>-__inode_lookup (inode_t *inode)</div><div class='add'>+__inode_ref_reduce_by_n(inode_t *inode, uint64_t nref)</div><div class='ctx'> {</div><div class='del'>-        if (!inode)</div><div class='del'>-                return NULL;</div><div class='add'>+    uint64_t nlookup = 0;</div><div class='ctx'> </div><div class='del'>-        inode-&gt;nlookup++;</div><div class='add'>+    GF_ASSERT(inode-&gt;ref &gt;= nref);</div><div class='ctx'> </div><div class='del'>-        return inode;</div><div class='del'>-}</div><div class='add'>+    inode-&gt;ref -= nref;</div><div class='add'>+</div><div class='add'>+    if (!nref)</div><div class='add'>+        inode-&gt;ref = 0;</div><div class='add'>+</div><div class='add'>+    if (!inode-&gt;ref) {</div><div class='add'>+        inode-&gt;table-&gt;active_size--;</div><div class='ctx'> </div><div class='add'>+        nlookup = GF_ATOMIC_GET(inode-&gt;nlookup);</div><div class='add'>+        if (nlookup)</div><div class='add'>+            __inode_passivate(inode);</div><div class='add'>+        else</div><div class='add'>+            __inode_retire(inode);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return inode;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> static inode_t *</div><div class='del'>-__inode_forget (inode_t *inode, uint64_t nlookup)</div><div class='add'>+inode_forget_atomic(inode_t *inode, uint64_t nlookup)</div><div class='ctx'> {</div><div class='del'>-        if (!inode)</div><div class='del'>-                return NULL;</div><div class='del'>-</div><div class='del'>-        assert (inode-&gt;nlookup &gt;= nlookup);</div><div class='add'>+    uint64_t inode_lookup = 0;</div><div class='ctx'> </div><div class='del'>-        inode-&gt;nlookup -= nlookup;</div><div class='add'>+    if (!inode)</div><div class='add'>+        return NULL;</div><div class='ctx'> </div><div class='del'>-        if (!nlookup)</div><div class='del'>-                inode-&gt;nlookup = 0;</div><div class='add'>+    if (nlookup == 0) {</div><div class='add'>+        GF_ATOMIC_INIT(inode-&gt;nlookup, 0);</div><div class='add'>+    } else {</div><div class='add'>+        inode_lookup = GF_ATOMIC_FETCH_SUB(inode-&gt;nlookup, nlookup);</div><div class='add'>+        GF_ASSERT(inode_lookup &gt;= nlookup);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        return inode;</div><div class='add'>+    return inode;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> dentry_t *</div><div class='del'>-__dentry_grep (inode_table_t *table, inode_t *parent, const char *name)</div><div class='add'>+__dentry_grep(inode_table_t *table, inode_t *parent, const char *name,</div><div class='add'>+              const int hash)</div><div class='ctx'> {</div><div class='del'>-        int       hash = 0;</div><div class='del'>-        dentry_t *dentry = NULL;</div><div class='del'>-        dentry_t *tmp = NULL;</div><div class='del'>-</div><div class='del'>-        if (!table || !name || !parent)</div><div class='del'>-                return NULL;</div><div class='del'>-</div><div class='del'>-        hash = hash_dentry (parent, name, table-&gt;hashsize);</div><div class='del'>-</div><div class='del'>-        list_for_each_entry (tmp, &amp;table-&gt;name_hash[hash], hash) {</div><div class='del'>-                if (tmp-&gt;parent == parent &amp;&amp; !strcmp (tmp-&gt;name, name)) {</div><div class='del'>-                        dentry = tmp;</div><div class='del'>-                        break;</div><div class='del'>-                }</div><div class='add'>+    dentry_t *dentry = NULL;</div><div class='add'>+    dentry_t *tmp = NULL;</div><div class='add'>+</div><div class='add'>+    list_for_each_entry(tmp, &amp;table-&gt;name_hash[hash], hash)</div><div class='add'>+    {</div><div class='add'>+        if (tmp-&gt;parent == parent &amp;&amp; !strcmp(tmp-&gt;name, name)) {</div><div class='add'>+            dentry = tmp;</div><div class='add'>+            break;</div><div class='ctx'>         }</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        return dentry;</div><div class='add'>+    return dentry;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> inode_t *</div><div class='del'>-inode_grep (inode_table_t *table, inode_t *parent, const char *name)</div><div class='add'>+inode_grep(inode_table_t *table, inode_t *parent, const char *name)</div><div class='ctx'> {</div><div class='del'>-        inode_t   *inode = NULL;</div><div class='del'>-        dentry_t  *dentry = NULL;</div><div class='del'>-</div><div class='del'>-        if (!table || !parent || !name)</div><div class='del'>-                return NULL;</div><div class='add'>+    inode_t *inode = NULL;</div><div class='add'>+    dentry_t *dentry = NULL;</div><div class='ctx'> </div><div class='del'>-        pthread_mutex_lock (&amp;table-&gt;lock);</div><div class='del'>-        {</div><div class='del'>-                dentry = __dentry_grep (table, parent, name);</div><div class='add'>+    if (!table || !parent || !name) {</div><div class='add'>+        gf_msg_callingfn(THIS-&gt;name, GF_LOG_WARNING, EINVAL, LG_MSG_INVALID_ARG,</div><div class='add'>+                         "table || parent || name"</div><div class='add'>+                         " not found");</div><div class='add'>+        return NULL;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-                if (dentry)</div><div class='del'>-                        inode = dentry-&gt;inode;</div><div class='add'>+    int hash = hash_dentry(parent, name, table-&gt;hashsize);</div><div class='ctx'> </div><div class='del'>-                if (inode)</div><div class='del'>-                        __inode_ref (inode);</div><div class='add'>+    pthread_mutex_lock(&amp;table-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        dentry = __dentry_grep(table, parent, name, hash);</div><div class='add'>+        if (dentry) {</div><div class='add'>+            inode = dentry-&gt;inode;</div><div class='add'>+            if (inode)</div><div class='add'>+                __inode_ref(inode, false);</div><div class='ctx'>         }</div><div class='del'>-        pthread_mutex_unlock (&amp;table-&gt;lock);</div><div class='add'>+    }</div><div class='add'>+    pthread_mutex_unlock(&amp;table-&gt;lock);</div><div class='ctx'> </div><div class='del'>-        return inode;</div><div class='add'>+    return inode;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> inode_t *</div><div class='del'>-inode_get (inode_table_t *table, ino_t ino, uint64_t gen)</div><div class='add'>+inode_resolve(inode_table_t *table, char *path)</div><div class='ctx'> {</div><div class='del'>-        return NULL;</div><div class='del'>-}</div><div class='add'>+    char *tmp = NULL, *bname = NULL, *str = NULL, *saveptr = NULL;</div><div class='add'>+    inode_t *inode = NULL, *parent = NULL;</div><div class='add'>+</div><div class='add'>+    if ((path == NULL) || (table == NULL)) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    parent = inode_ref(table-&gt;root);</div><div class='add'>+    str = tmp = gf_strdup(path);</div><div class='add'>+    if (str == NULL) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    while (1) {</div><div class='add'>+        bname = strtok_r(str, "/", &amp;saveptr);</div><div class='add'>+        if (bname == NULL) {</div><div class='add'>+            break;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='add'>+        if (inode != NULL) {</div><div class='add'>+            inode_unref(inode);</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-static int</div><div class='del'>-__is_root_gfid (uuid_t gfid)</div><div class='del'>-{</div><div class='del'>-        uuid_t  root;</div><div class='del'>-        int     ret;</div><div class='add'>+        inode = inode_grep(table, parent, bname);</div><div class='add'>+        if (inode == NULL) {</div><div class='add'>+            break;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-        memset (root, 0, 16);</div><div class='del'>-        root[15] = 1;</div><div class='add'>+        if (parent != NULL) {</div><div class='add'>+            inode_unref(parent);</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-        ret = uuid_compare (gfid, root);</div><div class='add'>+        parent = inode_ref(inode);</div><div class='add'>+        str = NULL;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        return ret;</div><div class='add'>+    inode_unref(parent);</div><div class='add'>+    GF_FREE(tmp);</div><div class='add'>+out:</div><div class='add'>+    return inode;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+int</div><div class='add'>+inode_grep_for_gfid(inode_table_t *table, inode_t *parent, const char *name,</div><div class='add'>+                    uuid_t gfid, ia_type_t *type)</div><div class='add'>+{</div><div class='add'>+    inode_t *inode = NULL;</div><div class='add'>+    dentry_t *dentry = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    if (!table || !parent || !name) {</div><div class='add'>+        gf_msg_callingfn(THIS-&gt;name, GF_LOG_WARNING, EINVAL, LG_MSG_INVALID_ARG,</div><div class='add'>+                         "table || parent || name"</div><div class='add'>+                         " not found");</div><div class='add'>+        return ret;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    int hash = hash_dentry(parent, name, table-&gt;hashsize);</div><div class='add'>+</div><div class='add'>+    pthread_mutex_lock(&amp;table-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        dentry = __dentry_grep(table, parent, name, hash);</div><div class='add'>+        if (dentry) {</div><div class='add'>+            inode = dentry-&gt;inode;</div><div class='add'>+            if (inode) {</div><div class='add'>+                gf_uuid_copy(gfid, inode-&gt;gfid);</div><div class='add'>+                *type = inode-&gt;ia_type;</div><div class='add'>+                ret = 0;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    pthread_mutex_unlock(&amp;table-&gt;lock);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-inode_t *</div><div class='del'>-__inode_find (inode_table_t *table, uuid_t gfid)</div><div class='add'>+/* return 1 if gfid is of root, 0 if not */</div><div class='add'>+gf_boolean_t</div><div class='add'>+__is_root_gfid(uuid_t gfid)</div><div class='ctx'> {</div><div class='del'>-        inode_t   *inode = NULL;</div><div class='del'>-        inode_t   *tmp = NULL;</div><div class='del'>-        int        hash = 0;</div><div class='add'>+    static uuid_t root = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1};</div><div class='ctx'> </div><div class='del'>-        if (!table)</div><div class='del'>-                goto out;</div><div class='add'>+    if (gf_uuid_compare(gfid, root) == 0)</div><div class='add'>+        return _gf_true;</div><div class='ctx'> </div><div class='del'>-        if (__is_root_gfid (gfid) == 0)</div><div class='del'>-                return table-&gt;root;</div><div class='add'>+    return _gf_false;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        hash = hash_gfid (gfid, 65536);</div><div class='add'>+inode_t *</div><div class='add'>+__inode_find(inode_table_t *table, uuid_t gfid, const int hash)</div><div class='add'>+{</div><div class='add'>+    inode_t *inode = NULL;</div><div class='add'>+    inode_t *tmp = NULL;</div><div class='ctx'> </div><div class='del'>-        list_for_each_entry (tmp, &amp;table-&gt;inode_hash[hash], hash) {</div><div class='del'>-                if (uuid_compare (tmp-&gt;gfid, gfid) == 0) {</div><div class='del'>-                        inode = tmp;</div><div class='del'>-                        break;</div><div class='del'>-                }</div><div class='add'>+    if (__is_root_gfid(gfid))</div><div class='add'>+        return table-&gt;root;</div><div class='add'>+</div><div class='add'>+    list_for_each_entry(tmp, &amp;table-&gt;inode_hash[hash], hash)</div><div class='add'>+    {</div><div class='add'>+        if (gf_uuid_compare(tmp-&gt;gfid, gfid) == 0) {</div><div class='add'>+            inode = tmp;</div><div class='add'>+            break;</div><div class='ctx'>         }</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-out:</div><div class='del'>-        return inode;</div><div class='add'>+    return inode;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> inode_t *</div><div class='del'>-inode_find (inode_table_t *table, uuid_t gfid)</div><div class='add'>+inode_find(inode_table_t *table, uuid_t gfid)</div><div class='ctx'> {</div><div class='del'>-        inode_t   *inode = NULL;</div><div class='add'>+    inode_t *inode = NULL;</div><div class='ctx'> </div><div class='del'>-        if (!table)</div><div class='del'>-                return NULL;</div><div class='add'>+    if (!table) {</div><div class='add'>+        gf_msg_callingfn(THIS-&gt;name, GF_LOG_WARNING, 0,</div><div class='add'>+                         LG_MSG_INODE_TABLE_NOT_FOUND,</div><div class='add'>+                         "table not "</div><div class='add'>+                         "found");</div><div class='add'>+        return NULL;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        pthread_mutex_lock (&amp;table-&gt;lock);</div><div class='del'>-        {</div><div class='del'>-                inode = __inode_find (table, gfid);</div><div class='del'>-                if (inode)</div><div class='del'>-                        __inode_ref (inode);</div><div class='del'>-        }</div><div class='del'>-        pthread_mutex_unlock (&amp;table-&gt;lock);</div><div class='add'>+    int hash = hash_gfid(gfid, 65536);</div><div class='ctx'> </div><div class='del'>-        return inode;</div><div class='del'>-}</div><div class='add'>+    pthread_mutex_lock(&amp;table-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        inode = __inode_find(table, gfid, hash);</div><div class='add'>+        if (inode)</div><div class='add'>+            __inode_ref(inode, false);</div><div class='add'>+    }</div><div class='add'>+    pthread_mutex_unlock(&amp;table-&gt;lock);</div><div class='ctx'> </div><div class='add'>+    return inode;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> static inode_t *</div><div class='del'>-__inode_link (inode_t *inode, inode_t *parent, const char *name,</div><div class='del'>-              struct iatt *iatt)</div><div class='add'>+__inode_link(inode_t *inode, inode_t *parent, const char *name,</div><div class='add'>+             struct iatt *iatt, const int dhash)</div><div class='ctx'> {</div><div class='del'>-        dentry_t      *dentry = NULL;</div><div class='del'>-        dentry_t      *old_dentry = NULL;</div><div class='del'>-        inode_t       *old_inode = NULL;</div><div class='del'>-        inode_table_t *table = NULL;</div><div class='del'>-        inode_t       *link_inode = NULL;</div><div class='add'>+    dentry_t *dentry = NULL;</div><div class='add'>+    dentry_t *old_dentry = NULL;</div><div class='add'>+    inode_t *old_inode = NULL;</div><div class='add'>+    inode_table_t *table = NULL;</div><div class='add'>+    inode_t *link_inode = NULL;</div><div class='add'>+    char link_uuid_str[64] = {0}, parent_uuid_str[64] = {0};</div><div class='add'>+</div><div class='add'>+    table = inode-&gt;table;</div><div class='add'>+</div><div class='add'>+    if (parent) {</div><div class='add'>+        /* We should prevent inode linking between different</div><div class='add'>+           inode tables. This can cause errors which is very</div><div class='add'>+           hard to catch/debug. */</div><div class='add'>+        if (inode-&gt;table != parent-&gt;table) {</div><div class='add'>+            errno = EINVAL;</div><div class='add'>+            GF_ASSERT(!"link attempted b/w inodes of diff table");</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-        if (!inode)</div><div class='del'>-                return NULL;</div><div class='add'>+        if (parent-&gt;ia_type != IA_IFDIR) {</div><div class='add'>+            errno = EINVAL;</div><div class='add'>+            GF_ASSERT(!"link attempted on non-directory parent");</div><div class='add'>+            return NULL;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-        table = inode-&gt;table;</div><div class='del'>-        if (!table)</div><div class='del'>-                return NULL;</div><div class='add'>+        if (!name || strlen(name) == 0) {</div><div class='add'>+            errno = EINVAL;</div><div class='add'>+            GF_ASSERT (!"link attempted with no basename on "</div><div class='add'>+                                    "parent");</div><div class='add'>+            return NULL;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        link_inode = inode;</div><div class='add'>+    link_inode = inode;</div><div class='ctx'> </div><div class='del'>-        if (!__is_inode_hashed (inode)) {</div><div class='del'>-                if (!iatt)</div><div class='del'>-                        return NULL;</div><div class='add'>+    if (!__is_inode_hashed(inode)) {</div><div class='add'>+        if (!iatt) {</div><div class='add'>+            errno = EINVAL;</div><div class='add'>+            return NULL;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-                if (uuid_is_null (iatt-&gt;ia_gfid))</div><div class='del'>-                        return NULL;</div><div class='add'>+        if (gf_uuid_is_null(iatt-&gt;ia_gfid)) {</div><div class='add'>+            errno = EINVAL;</div><div class='add'>+            return NULL;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-                uuid_copy (inode-&gt;gfid, iatt-&gt;ia_gfid);</div><div class='del'>-                inode-&gt;ino        = iatt-&gt;ia_ino;</div><div class='del'>-                inode-&gt;ia_type    = iatt-&gt;ia_type;</div><div class='add'>+        int ihash = hash_gfid(iatt-&gt;ia_gfid, 65536);</div><div class='ctx'> </div><div class='del'>-                old_inode = __inode_find (table, inode-&gt;gfid);</div><div class='add'>+        old_inode = __inode_find(table, iatt-&gt;ia_gfid, ihash);</div><div class='ctx'> </div><div class='del'>-                if (old_inode) {</div><div class='del'>-                        link_inode = old_inode;</div><div class='del'>-                } else {</div><div class='del'>-                        __inode_hash (inode);</div><div class='del'>-                }</div><div class='add'>+        if (old_inode) {</div><div class='add'>+            link_inode = old_inode;</div><div class='add'>+        } else {</div><div class='add'>+            gf_uuid_copy(inode-&gt;gfid, iatt-&gt;ia_gfid);</div><div class='add'>+            inode-&gt;ia_type = iatt-&gt;ia_type;</div><div class='add'>+            __inode_hash(inode, ihash);</div><div class='ctx'>         }</div><div class='add'>+    } else {</div><div class='add'>+        /* @old_inode serves another important purpose - it indicates</div><div class='add'>+           to the code further below whether a dentry cycle check is</div><div class='add'>+           required or not (a new inode linkage can never result in</div><div class='add'>+           creation of a loop.)</div><div class='add'>+</div><div class='add'>+           if the given @inode is already hashed, it actually means</div><div class='add'>+           it is an "old" inode and deserves to undergo the cyclic</div><div class='add'>+           check.</div><div class='add'>+        */</div><div class='add'>+        old_inode = inode;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (name &amp;&amp; (!strcmp(name, ".") || !strcmp(name, ".."))) {</div><div class='add'>+        return link_inode;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* use only link_inode beyond this point */</div><div class='add'>+    if (parent) {</div><div class='add'>+        old_dentry = __dentry_grep(table, parent, name, dhash);</div><div class='add'>+</div><div class='add'>+        if (!old_dentry || old_dentry-&gt;inode != link_inode) {</div><div class='add'>+            dentry = dentry_create(link_inode, parent, name);</div><div class='add'>+            if (!dentry) {</div><div class='add'>+                gf_msg_callingfn(THIS-&gt;name, GF_LOG_ERROR, 0,</div><div class='add'>+                                 LG_MSG_DENTRY_CREATE_FAILED,</div><div class='add'>+                                 "dentry create failed on "</div><div class='add'>+                                 "inode %s with parent %s",</div><div class='add'>+                                 uuid_utoa_r(link_inode-&gt;gfid, link_uuid_str),</div><div class='add'>+                                 uuid_utoa_r(parent-&gt;gfid, parent_uuid_str));</div><div class='add'>+                errno = ENOMEM;</div><div class='add'>+                return NULL;</div><div class='add'>+            }</div><div class='ctx'> </div><div class='del'>-        /* use only link_inode beyond this point */</div><div class='del'>-        if (parent) {</div><div class='del'>-                old_dentry = __dentry_grep (table, parent, name);</div><div class='add'>+            /* dentry linking needs to happen inside lock */</div><div class='add'>+            dentry-&gt;parent = __inode_ref(parent, false);</div><div class='add'>+            list_add(&amp;dentry-&gt;inode_list, &amp;link_inode-&gt;dentry_list);</div><div class='ctx'> </div><div class='del'>-                if (!old_dentry || old_dentry-&gt;inode != link_inode) {</div><div class='del'>-                        dentry = __dentry_create (link_inode, parent, name);</div><div class='del'>-                        __dentry_hash (dentry);</div><div class='add'>+            if (old_inode &amp;&amp; __is_dentry_cyclic(dentry)) {</div><div class='add'>+                errno = ELOOP;</div><div class='add'>+                dentry_destroy(__dentry_unset(dentry));</div><div class='add'>+                return NULL;</div><div class='add'>+            }</div><div class='add'>+            __dentry_hash(dentry, dhash);</div><div class='ctx'> </div><div class='del'>-                        if (old_dentry)</div><div class='del'>-                                __dentry_unset (old_dentry);</div><div class='del'>-                }</div><div class='add'>+            if (old_dentry)</div><div class='add'>+                dentry_destroy(__dentry_unset(old_dentry));</div><div class='ctx'>         }</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        return link_inode;</div><div class='add'>+    return link_inode;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> inode_t *</div><div class='del'>-inode_link (inode_t *inode, inode_t *parent, const char *name,</div><div class='del'>-            struct iatt *iatt)</div><div class='add'>+inode_link(inode_t *inode, inode_t *parent, const char *name, struct iatt *iatt)</div><div class='ctx'> {</div><div class='del'>-        inode_table_t *table = NULL;</div><div class='del'>-        inode_t       *linked_inode = NULL;</div><div class='add'>+    int hash = 0;</div><div class='add'>+    inode_table_t *table = NULL;</div><div class='add'>+    inode_t *linked_inode = NULL;</div><div class='ctx'> </div><div class='del'>-        if (!inode)</div><div class='del'>-                return NULL;</div><div class='add'>+    if (!inode) {</div><div class='add'>+        gf_msg_callingfn(THIS-&gt;name, GF_LOG_WARNING, 0, LG_MSG_INODE_NOT_FOUND,</div><div class='add'>+                         "inode not found");</div><div class='add'>+        return NULL;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        table = inode-&gt;table;</div><div class='add'>+    table = inode-&gt;table;</div><div class='ctx'> </div><div class='del'>-        pthread_mutex_lock (&amp;table-&gt;lock);</div><div class='del'>-        {</div><div class='del'>-                linked_inode = __inode_link (inode, parent, name, iatt);</div><div class='add'>+    if (parent &amp;&amp; name) {</div><div class='add'>+        hash = hash_dentry(parent, name, table-&gt;hashsize);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-                if (linked_inode)</div><div class='del'>-                        __inode_ref (linked_inode);</div><div class='del'>-        }</div><div class='del'>-        pthread_mutex_unlock (&amp;table-&gt;lock);</div><div class='add'>+    if (name &amp;&amp; strchr(name, '/')) {</div><div class='add'>+        GF_ASSERT(!"inode link attempted with '/' in name");</div><div class='add'>+        return NULL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    pthread_mutex_lock(&amp;table-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        linked_inode = __inode_link(inode, parent, name, iatt, hash);</div><div class='add'>+        if (linked_inode)</div><div class='add'>+            __inode_ref(linked_inode, false);</div><div class='add'>+    }</div><div class='add'>+    pthread_mutex_unlock(&amp;table-&gt;lock);</div><div class='ctx'> </div><div class='del'>-        inode_table_prune (table);</div><div class='add'>+    inode_table_prune(table);</div><div class='ctx'> </div><div class='del'>-        return linked_inode;</div><div class='add'>+    return linked_inode;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+int</div><div class='add'>+inode_lookup(inode_t *inode)</div><div class='add'>+{</div><div class='add'>+    if (!inode) {</div><div class='add'>+        gf_msg_callingfn(THIS-&gt;name, GF_LOG_WARNING, 0, LG_MSG_INODE_NOT_FOUND,</div><div class='add'>+                         "inode not found");</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    GF_ATOMIC_INC(inode-&gt;nlookup);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-inode_lookup (inode_t *inode)</div><div class='add'>+inode_ref_reduce_by_n(inode_t *inode, uint64_t nref)</div><div class='ctx'> {</div><div class='del'>-        inode_table_t *table = NULL;</div><div class='add'>+    inode_table_t *table = NULL;</div><div class='ctx'> </div><div class='del'>-        if (!inode)</div><div class='del'>-                return -1;</div><div class='add'>+    if (!inode) {</div><div class='add'>+        gf_msg_callingfn(THIS-&gt;name, GF_LOG_WARNING, 0, LG_MSG_INODE_NOT_FOUND,</div><div class='add'>+                         "inode not found");</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        table = inode-&gt;table;</div><div class='add'>+    table = inode-&gt;table;</div><div class='ctx'> </div><div class='del'>-        pthread_mutex_lock (&amp;table-&gt;lock);</div><div class='del'>-        {</div><div class='del'>-                __inode_lookup (inode);</div><div class='del'>-        }</div><div class='del'>-        pthread_mutex_unlock (&amp;table-&gt;lock);</div><div class='add'>+    pthread_mutex_lock(&amp;table-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        __inode_ref_reduce_by_n(inode, nref);</div><div class='add'>+    }</div><div class='add'>+    pthread_mutex_unlock(&amp;table-&gt;lock);</div><div class='ctx'> </div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='add'>+    inode_table_prune(table);</div><div class='ctx'> </div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-inode_forget (inode_t *inode, uint64_t nlookup)</div><div class='add'>+inode_forget(inode_t *inode, uint64_t nlookup)</div><div class='ctx'> {</div><div class='del'>-        inode_table_t *table = NULL;</div><div class='add'>+    inode_table_t *table = NULL;</div><div class='ctx'> </div><div class='del'>-        if (!inode)</div><div class='del'>-                return -1;</div><div class='add'>+    if (!inode) {</div><div class='add'>+        gf_msg_callingfn(THIS-&gt;name, GF_LOG_WARNING, 0, LG_MSG_INODE_NOT_FOUND,</div><div class='add'>+                         "inode not found");</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        table = inode-&gt;table;</div><div class='add'>+    table = inode-&gt;table;</div><div class='ctx'> </div><div class='del'>-        pthread_mutex_lock (&amp;table-&gt;lock);</div><div class='del'>-        {</div><div class='del'>-                __inode_forget (inode, nlookup);</div><div class='del'>-        }</div><div class='del'>-        pthread_mutex_unlock (&amp;table-&gt;lock);</div><div class='add'>+    inode_forget_atomic(inode, nlookup);</div><div class='ctx'> </div><div class='del'>-        inode_table_prune (table);</div><div class='add'>+    inode_table_prune(table);</div><div class='ctx'> </div><div class='del'>-        return 0;</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='del'>-static void</div><div class='del'>-__inode_unlink (inode_t *inode, inode_t *parent, const char *name)</div><div class='add'>+int</div><div class='add'>+inode_forget_with_unref(inode_t *inode, uint64_t nlookup)</div><div class='ctx'> {</div><div class='del'>-        dentry_t *dentry = NULL;</div><div class='add'>+    inode_table_t *table = NULL;</div><div class='ctx'> </div><div class='del'>-        if (!inode || !parent || !name)</div><div class='del'>-                return;</div><div class='add'>+    if (!inode) {</div><div class='add'>+        gf_msg_callingfn(THIS-&gt;name, GF_LOG_WARNING, 0, LG_MSG_INODE_NOT_FOUND,</div><div class='add'>+                         "inode not found");</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        dentry = __dentry_search_for_inode (inode, parent-&gt;ino, name);</div><div class='add'>+    table = inode-&gt;table;</div><div class='ctx'> </div><div class='del'>-        /* dentry NULL for corrupted backend */</div><div class='del'>-        if (dentry)</div><div class='del'>-                __dentry_unset (dentry);</div><div class='add'>+    pthread_mutex_lock(&amp;table-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        inode_forget_atomic(inode, nlookup);</div><div class='add'>+        __inode_unref(inode, true);</div><div class='add'>+    }</div><div class='add'>+    pthread_mutex_unlock(&amp;table-&gt;lock);</div><div class='add'>+</div><div class='add'>+    inode_table_prune(table);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+ * Invalidate an inode. This is invoked when a translator decides that an</div><div class='add'>+ * inode's cache is no longer valid. Any translator interested in taking action</div><div class='add'>+ * in this situation can define the invalidate callback.</div><div class='add'>+ */</div><div class='add'>+int</div><div class='add'>+inode_invalidate(inode_t *inode)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+    xlator_t *xl = NULL;</div><div class='add'>+    xlator_t *old_THIS = NULL;</div><div class='add'>+</div><div class='add'>+    if (!inode) {</div><div class='add'>+        gf_msg_callingfn(THIS-&gt;name, GF_LOG_WARNING, 0, LG_MSG_INODE_NOT_FOUND,</div><div class='add'>+                         "inode not found");</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /*</div><div class='add'>+     * The master xlator is not in the graph but it can define an invalidate</div><div class='add'>+     * handler.</div><div class='add'>+     */</div><div class='add'>+    xl = inode-&gt;table-&gt;xl-&gt;ctx-&gt;master;</div><div class='add'>+    if (xl &amp;&amp; xl-&gt;cbks-&gt;invalidate) {</div><div class='add'>+        old_THIS = THIS;</div><div class='add'>+        THIS = xl;</div><div class='add'>+        ret = xl-&gt;cbks-&gt;invalidate(xl, inode);</div><div class='add'>+        THIS = old_THIS;</div><div class='add'>+        if (ret)</div><div class='add'>+            return ret;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    xl = inode-&gt;table-&gt;xl-&gt;graph-&gt;first;</div><div class='add'>+    while (xl) {</div><div class='add'>+        old_THIS = THIS;</div><div class='add'>+        THIS = xl;</div><div class='add'>+        if (xl-&gt;cbks-&gt;invalidate)</div><div class='add'>+            ret = xl-&gt;cbks-&gt;invalidate(xl, inode);</div><div class='add'>+        THIS = old_THIS;</div><div class='add'>+</div><div class='add'>+        if (ret)</div><div class='add'>+            break;</div><div class='add'>+</div><div class='add'>+        xl = xl-&gt;next;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+static dentry_t *</div><div class='add'>+__inode_unlink(inode_t *inode, inode_t *parent, const char *name)</div><div class='add'>+{</div><div class='add'>+    dentry_t *dentry = NULL;</div><div class='add'>+    char pgfid[64] = {0};</div><div class='add'>+    char gfid[64] = {0};</div><div class='add'>+</div><div class='add'>+    dentry = __dentry_search_for_inode(inode, parent-&gt;gfid, name);</div><div class='add'>+</div><div class='add'>+    /* dentry NULL for corrupted backend */</div><div class='add'>+    if (dentry) {</div><div class='add'>+        dentry = __dentry_unset(dentry);</div><div class='add'>+    } else {</div><div class='add'>+        gf_smsg("inode", GF_LOG_WARNING, 0, LG_MSG_DENTRY_NOT_FOUND,</div><div class='add'>+                "parent-gfid=%s name=%s gfid%s",</div><div class='add'>+                uuid_utoa_r(parent-&gt;gfid, pgfid), name,</div><div class='add'>+                uuid_utoa_r(inode-&gt;gfid, gfid), NULL);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return dentry;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> void</div><div class='del'>-inode_unlink (inode_t *inode, inode_t *parent, const char *name)</div><div class='add'>+inode_unlink(inode_t *inode, inode_t *parent, const char *name)</div><div class='ctx'> {</div><div class='del'>-        inode_table_t *table = NULL;</div><div class='add'>+    inode_table_t *table;</div><div class='add'>+    dentry_t *dentry;</div><div class='ctx'> </div><div class='del'>-        if (!inode)</div><div class='del'>-                return;</div><div class='add'>+    if (!inode || !parent || !name)</div><div class='add'>+        return;</div><div class='ctx'> </div><div class='del'>-        table = inode-&gt;table;</div><div class='add'>+    table = inode-&gt;table;</div><div class='ctx'> </div><div class='del'>-        pthread_mutex_lock (&amp;table-&gt;lock);</div><div class='del'>-        {</div><div class='del'>-                __inode_unlink (inode, parent, name);</div><div class='del'>-        }</div><div class='del'>-        pthread_mutex_unlock (&amp;table-&gt;lock);</div><div class='add'>+    pthread_mutex_lock(&amp;table-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        dentry = __inode_unlink(inode, parent, name);</div><div class='add'>+    }</div><div class='add'>+    pthread_mutex_unlock(&amp;table-&gt;lock);</div><div class='ctx'> </div><div class='del'>-        inode_table_prune (table);</div><div class='del'>-}</div><div class='add'>+    dentry_destroy(dentry);</div><div class='ctx'> </div><div class='add'>+    inode_table_prune(table);</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-inode_rename (inode_table_t *table, inode_t *srcdir, const char *srcname,</div><div class='del'>-              inode_t *dstdir, const char *dstname, inode_t *inode,</div><div class='del'>-              struct iatt *iatt)</div><div class='add'>+inode_rename(inode_table_t *table, inode_t *srcdir, const char *srcname,</div><div class='add'>+             inode_t *dstdir, const char *dstname, inode_t *inode,</div><div class='add'>+             struct iatt *iatt)</div><div class='ctx'> {</div><div class='del'>-        if (!inode)</div><div class='del'>-                return -1;</div><div class='add'>+    int hash = 0;</div><div class='add'>+    dentry_t *dentry = NULL;</div><div class='ctx'> </div><div class='del'>-        table = inode-&gt;table;</div><div class='add'>+    if (!inode) {</div><div class='add'>+        gf_msg_callingfn(THIS-&gt;name, GF_LOG_WARNING, 0, LG_MSG_INODE_NOT_FOUND,</div><div class='add'>+                         "inode not found");</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        pthread_mutex_lock (&amp;table-&gt;lock);</div><div class='del'>-        {</div><div class='del'>-                __inode_link (inode, dstdir, dstname, iatt);</div><div class='del'>-                __inode_unlink (inode, srcdir, srcname);</div><div class='del'>-        }</div><div class='del'>-        pthread_mutex_unlock (&amp;table-&gt;lock);</div><div class='add'>+    table = inode-&gt;table;</div><div class='ctx'> </div><div class='del'>-        inode_table_prune (table);</div><div class='add'>+    if (dstname &amp;&amp; strchr(dstname, '/')) {</div><div class='add'>+        GF_ASSERT(!"inode link attempted with '/' in name");</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='add'>+    if (dstdir &amp;&amp; dstname) {</div><div class='add'>+        hash = hash_dentry(dstdir, dstname, table-&gt;hashsize);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='add'>+    pthread_mutex_lock(&amp;table-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        __inode_link(inode, dstdir, dstname, iatt, hash);</div><div class='add'>+        /* pick the old dentry */</div><div class='add'>+        dentry = __inode_unlink(inode, srcdir, srcname);</div><div class='add'>+    }</div><div class='add'>+    pthread_mutex_unlock(&amp;table-&gt;lock);</div><div class='add'>+</div><div class='add'>+    /* free the old dentry */</div><div class='add'>+    dentry_destroy(dentry);</div><div class='add'>+</div><div class='add'>+    inode_table_prune(table);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> static dentry_t *</div><div class='del'>-__dentry_search_arbit (inode_t *inode)</div><div class='add'>+__dentry_search_arbit(inode_t *inode)</div><div class='ctx'> {</div><div class='del'>-        dentry_t *dentry = NULL;</div><div class='del'>-        dentry_t *trav = NULL;</div><div class='add'>+    dentry_t *dentry = NULL;</div><div class='add'>+    dentry_t *trav = NULL;</div><div class='ctx'> </div><div class='del'>-        if (!inode)</div><div class='del'>-                return NULL;</div><div class='add'>+    if (!inode)</div><div class='add'>+        return NULL;</div><div class='ctx'> </div><div class='del'>-        list_for_each_entry (trav, &amp;inode-&gt;dentry_list, inode_list) {</div><div class='del'>-                if (__is_dentry_hashed (trav)) {</div><div class='del'>-                        dentry = trav;</div><div class='del'>-                        break;</div><div class='del'>-                }</div><div class='add'>+    list_for_each_entry(trav, &amp;inode-&gt;dentry_list, inode_list)</div><div class='add'>+    {</div><div class='add'>+        if (__is_dentry_hashed(trav)) {</div><div class='add'>+            dentry = trav;</div><div class='add'>+            break;</div><div class='ctx'>         }</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        if (!dentry) {</div><div class='del'>-                list_for_each_entry (trav, &amp;inode-&gt;dentry_list, inode_list) {</div><div class='del'>-                        dentry = trav;</div><div class='del'>-                        break;</div><div class='del'>-                }</div><div class='add'>+    if (!dentry) {</div><div class='add'>+        list_for_each_entry(trav, &amp;inode-&gt;dentry_list, inode_list)</div><div class='add'>+        {</div><div class='add'>+            dentry = trav;</div><div class='add'>+            break;</div><div class='ctx'>         }</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        return dentry;</div><div class='add'>+    return dentry;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> inode_t *</div><div class='del'>-inode_parent (inode_t *inode, ino_t par, const char *name)</div><div class='add'>+inode_parent(inode_t *inode, uuid_t pargfid, const char *name)</div><div class='ctx'> {</div><div class='del'>-        inode_t       *parent = NULL;</div><div class='del'>-        inode_table_t *table = NULL;</div><div class='del'>-        dentry_t      *dentry = NULL;</div><div class='add'>+    inode_t *parent = NULL;</div><div class='add'>+    inode_table_t *table = NULL;</div><div class='add'>+    dentry_t *dentry = NULL;</div><div class='ctx'> </div><div class='del'>-        if (!inode)</div><div class='del'>-                return NULL;</div><div class='add'>+    if (!inode) {</div><div class='add'>+        gf_msg_callingfn(THIS-&gt;name, GF_LOG_WARNING, 0, LG_MSG_INODE_NOT_FOUND,</div><div class='add'>+                         "inode not found");</div><div class='add'>+        return NULL;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        table = inode-&gt;table;</div><div class='add'>+    table = inode-&gt;table;</div><div class='ctx'> </div><div class='del'>-        pthread_mutex_lock (&amp;table-&gt;lock);</div><div class='del'>-        {</div><div class='del'>-                if (par &amp;&amp; name) {</div><div class='del'>-                        dentry = __dentry_search_for_inode (inode, par, name);</div><div class='del'>-                } else {</div><div class='del'>-                        dentry = __dentry_search_arbit (inode);</div><div class='del'>-                }</div><div class='add'>+    pthread_mutex_lock(&amp;table-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        if (pargfid &amp;&amp; !gf_uuid_is_null(pargfid) &amp;&amp; name) {</div><div class='add'>+            dentry = __dentry_search_for_inode(inode, pargfid, name);</div><div class='add'>+        } else {</div><div class='add'>+            dentry = __dentry_search_arbit(inode);</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-                if (dentry)</div><div class='del'>-                        parent = dentry-&gt;parent;</div><div class='add'>+        if (dentry)</div><div class='add'>+            parent = dentry-&gt;parent;</div><div class='ctx'> </div><div class='del'>-                if (parent)</div><div class='del'>-                        __inode_ref (parent);</div><div class='del'>-        }</div><div class='del'>-        pthread_mutex_unlock (&amp;table-&gt;lock);</div><div class='add'>+        if (parent)</div><div class='add'>+            __inode_ref(parent, false);</div><div class='add'>+    }</div><div class='add'>+    pthread_mutex_unlock(&amp;table-&gt;lock);</div><div class='ctx'> </div><div class='del'>-        return parent;</div><div class='add'>+    return parent;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+static int</div><div class='add'>+__inode_has_dentry(inode_t *inode)</div><div class='add'>+{</div><div class='add'>+    return !list_empty(&amp;inode-&gt;dentry_list);</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-inode_path (inode_t *inode, const char *name, char **bufp)</div><div class='add'>+inode_has_dentry(inode_t *inode)</div><div class='ctx'> {</div><div class='del'>-        inode_table_t *table = NULL;</div><div class='del'>-        dentry_t      *trav = NULL;</div><div class='del'>-        size_t         i = 0, size = 0;</div><div class='del'>-        int64_t        ret = 0;</div><div class='del'>-        int            len = 0;</div><div class='del'>-        char          *buf = NULL;</div><div class='add'>+    int dentry_present = 0;</div><div class='ctx'> </div><div class='del'>-        if (!inode)</div><div class='del'>-                return -1;</div><div class='add'>+    if (!inode) {</div><div class='add'>+        gf_msg_callingfn(THIS-&gt;name, GF_LOG_WARNING, 0, LG_MSG_INODE_NOT_FOUND,</div><div class='add'>+                         "inode not found");</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        table = inode-&gt;table;</div><div class='add'>+    LOCK(&amp;inode-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        dentry_present = __inode_has_dentry(inode);</div><div class='add'>+    }</div><div class='add'>+    UNLOCK(&amp;inode-&gt;lock);</div><div class='ctx'> </div><div class='del'>-        pthread_mutex_lock (&amp;table-&gt;lock);</div><div class='del'>-        {</div><div class='del'>-                for (trav = __dentry_search_arbit (inode); trav;</div><div class='del'>-                     trav = __dentry_search_arbit (trav-&gt;parent)) {</div><div class='del'>-                        i ++; /* "/" */</div><div class='del'>-                        i += strlen (trav-&gt;name);</div><div class='del'>-                        if (i &gt; PATH_MAX) {</div><div class='del'>-                                gf_log (table-&gt;name, GF_LOG_CRITICAL,</div><div class='del'>-                                        "possible infinite loop detected, "</div><div class='del'>-                                        "forcing break. name=(%s)", name);</div><div class='del'>-                                ret = -ENOENT;</div><div class='del'>-                                goto unlock;</div><div class='del'>-                        }</div><div class='del'>-                }</div><div class='add'>+    return dentry_present;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-                if ((inode-&gt;ino != 1) &amp;&amp;</div><div class='del'>-                    (i == 0)) {</div><div class='del'>-                        gf_log (table-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-                                "no dentry for non-root inode %"PRId64,</div><div class='del'>-                                inode-&gt;ino);</div><div class='del'>-                        ret = -ENOENT;</div><div class='del'>-                        goto unlock;</div><div class='del'>-                }</div><div class='add'>+int</div><div class='add'>+__inode_path(inode_t *inode, const char *name, char **bufp)</div><div class='add'>+{</div><div class='add'>+    inode_table_t *table = NULL;</div><div class='add'>+    inode_t *itrav = NULL;</div><div class='add'>+    dentry_t *trav = NULL;</div><div class='add'>+    size_t i = 0, size = 0;</div><div class='add'>+    int64_t ret = 0;</div><div class='add'>+    int len = 0;</div><div class='add'>+    char *buf = NULL;</div><div class='add'>+</div><div class='add'>+    if (!inode || gf_uuid_is_null(inode-&gt;gfid)) {</div><div class='add'>+        GF_ASSERT(0);</div><div class='add'>+        gf_msg_callingfn(THIS-&gt;name, GF_LOG_WARNING, EINVAL, LG_MSG_INVALID_ARG,</div><div class='add'>+                         "invalid inode");</div><div class='add'>+        return -EINVAL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    table = inode-&gt;table;</div><div class='add'>+</div><div class='add'>+    itrav = inode;</div><div class='add'>+    for (trav = __dentry_search_arbit(itrav); trav;</div><div class='add'>+         trav = __dentry_search_arbit(itrav)) {</div><div class='add'>+        itrav = trav-&gt;parent;</div><div class='add'>+        i++; /* "/" */</div><div class='add'>+        i += strlen(trav-&gt;name);</div><div class='add'>+        if (i &gt; PATH_MAX) {</div><div class='add'>+            gf_smsg(table-&gt;name, GF_LOG_CRITICAL, 0, LG_MSG_DENTRY_CYCLIC_LOOP,</div><div class='add'>+                    "name=%s", name, NULL);</div><div class='add'>+            ret = -ENOENT;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (!__is_root_gfid(itrav-&gt;gfid)) {</div><div class='add'>+        /* "&lt;gfid:00000000-0000-0000-0000-000000000000&gt;"/path */</div><div class='add'>+        i += GFID_STR_PFX_LEN;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (name) {</div><div class='add'>+        i++;</div><div class='add'>+        i += strlen(name);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = i;</div><div class='add'>+    size = i + 1;</div><div class='add'>+    buf = GF_CALLOC(size, sizeof(char), gf_common_mt_char);</div><div class='add'>+    if (buf) {</div><div class='add'>+        buf[size - 1] = 0;</div><div class='add'>+</div><div class='add'>+        if (name) {</div><div class='add'>+            len = strlen(name);</div><div class='add'>+            memcpy(buf + (i - len), name, len);</div><div class='add'>+            buf[i - len - 1] = '/';</div><div class='add'>+            i -= (len + 1);</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-                if (name) {</div><div class='del'>-                        i++;</div><div class='del'>-                        i += strlen (name);</div><div class='del'>-                }</div><div class='add'>+        itrav = inode;</div><div class='add'>+        for (trav = __dentry_search_arbit(itrav); trav;</div><div class='add'>+             trav = __dentry_search_arbit(itrav)) {</div><div class='add'>+            itrav = trav-&gt;parent;</div><div class='add'>+            len = strlen(trav-&gt;name);</div><div class='add'>+            memcpy(buf + (i - len), trav-&gt;name, len);</div><div class='add'>+            buf[i - len - 1] = '/';</div><div class='add'>+            i -= (len + 1);</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-                ret = i;</div><div class='del'>-                size = i + 1;</div><div class='del'>-                buf = GF_CALLOC (size, sizeof (char), gf_common_mt_char);</div><div class='del'>-                if (buf) {</div><div class='del'>-</div><div class='del'>-                        buf[size - 1] = 0;</div><div class='del'>-</div><div class='del'>-                        if (name) {</div><div class='del'>-                                len = strlen (name);</div><div class='del'>-                                strncpy (buf + (i - len), name, len);</div><div class='del'>-                                buf[i-len-1] = '/';</div><div class='del'>-                                i -= (len + 1);</div><div class='del'>-                        }</div><div class='del'>-</div><div class='del'>-                        for (trav = __dentry_search_arbit (inode); trav;</div><div class='del'>-                             trav = __dentry_search_arbit (trav-&gt;parent)) {</div><div class='del'>-                                len = strlen (trav-&gt;name);</div><div class='del'>-                                strncpy (buf + (i - len), trav-&gt;name, len);</div><div class='del'>-                                buf[i-len-1] = '/';</div><div class='del'>-                                i -= (len + 1);</div><div class='del'>-                        }</div><div class='del'>-                        *bufp = buf;</div><div class='del'>-                } else {</div><div class='del'>-                        gf_log (table-&gt;name, GF_LOG_ERROR,</div><div class='del'>-                                "out of memory");</div><div class='del'>-                        ret = -ENOMEM;</div><div class='del'>-                }</div><div class='add'>+        if (!__is_root_gfid(itrav-&gt;gfid)) {</div><div class='add'>+            snprintf(&amp;buf[i - GFID_STR_PFX_LEN], GFID_STR_PFX_LEN,</div><div class='add'>+                     INODE_PATH_FMT, uuid_utoa(itrav-&gt;gfid));</div><div class='add'>+            buf[i - 1] = '&gt;';</div><div class='ctx'>         }</div><div class='del'>-unlock:</div><div class='del'>-        pthread_mutex_unlock (&amp;table-&gt;lock);</div><div class='ctx'> </div><div class='del'>-        if (inode-&gt;ino == 1 &amp;&amp; !name) {</div><div class='del'>-                ret = 1;</div><div class='del'>-                if (buf) {</div><div class='del'>-                        GF_FREE (buf);</div><div class='del'>-                }</div><div class='del'>-                buf = GF_CALLOC (ret + 1, sizeof (char), gf_common_mt_char);</div><div class='del'>-                if (buf) {</div><div class='del'>-                        strcpy (buf, "/");</div><div class='del'>-                        *bufp = buf;</div><div class='del'>-                } else {</div><div class='del'>-                        gf_log (table-&gt;name, GF_LOG_ERROR,</div><div class='del'>-                                "out of memory");</div><div class='del'>-                        ret = -ENOMEM;</div><div class='del'>-                }</div><div class='add'>+        *bufp = buf;</div><div class='add'>+    } else {</div><div class='add'>+        ret = -ENOMEM;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (__is_root_gfid(inode-&gt;gfid) &amp;&amp; !name) {</div><div class='add'>+        ret = 1;</div><div class='add'>+        GF_FREE(buf);</div><div class='add'>+        buf = GF_CALLOC(ret + 1, sizeof(char), gf_common_mt_char);</div><div class='add'>+        if (buf) {</div><div class='add'>+            strcpy(buf, "/");</div><div class='add'>+            *bufp = buf;</div><div class='add'>+        } else {</div><div class='add'>+            ret = -ENOMEM;</div><div class='ctx'>         }</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        return ret;</div><div class='add'>+    if (ret &lt; 0)</div><div class='add'>+        *bufp = NULL;</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-static int</div><div class='del'>-inode_table_prune (inode_table_t *table)</div><div class='add'>+int</div><div class='add'>+inode_path(inode_t *inode, const char *name, char **bufp)</div><div class='ctx'> {</div><div class='del'>-        int               ret = 0;</div><div class='del'>-        struct list_head  purge = {0, };</div><div class='del'>-        inode_t          *del = NULL;</div><div class='del'>-        inode_t          *tmp = NULL;</div><div class='del'>-        inode_t          *entry = NULL;</div><div class='add'>+    inode_table_t *table = NULL;</div><div class='add'>+    int ret = -1;</div><div class='ctx'> </div><div class='del'>-        if (!table)</div><div class='del'>-                return -1;</div><div class='add'>+    if (!inode)</div><div class='add'>+        return -EINVAL;</div><div class='ctx'> </div><div class='del'>-        INIT_LIST_HEAD (&amp;purge);</div><div class='add'>+    table = inode-&gt;table;</div><div class='ctx'> </div><div class='del'>-        pthread_mutex_lock (&amp;table-&gt;lock);</div><div class='del'>-        {</div><div class='del'>-                while (table-&gt;lru_limit</div><div class='del'>-                       &amp;&amp; table-&gt;lru_size &gt; (table-&gt;lru_limit)) {</div><div class='add'>+    pthread_mutex_lock(&amp;table-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        ret = __inode_path(inode, name, bufp);</div><div class='add'>+    }</div><div class='add'>+    pthread_mutex_unlock(&amp;table-&gt;lock);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+__inode_table_set_lru_limit(inode_table_t *table, uint32_t lru_limit)</div><div class='add'>+{</div><div class='add'>+    table-&gt;lru_limit = lru_limit;</div><div class='add'>+    return;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+inode_table_set_lru_limit(inode_table_t *table, uint32_t lru_limit)</div><div class='add'>+{</div><div class='add'>+    pthread_mutex_lock(&amp;table-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        __inode_table_set_lru_limit(table, lru_limit);</div><div class='add'>+    }</div><div class='add'>+    pthread_mutex_unlock(&amp;table-&gt;lock);</div><div class='ctx'> </div><div class='del'>-                        entry = list_entry (table-&gt;lru.next, inode_t, list);</div><div class='add'>+    inode_table_prune(table);</div><div class='ctx'> </div><div class='del'>-                        table-&gt;lru_size--;</div><div class='del'>-                        __inode_retire (entry);</div><div class='add'>+    return;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-                        ret++;</div><div class='add'>+static int</div><div class='add'>+inode_table_prune(inode_table_t *table)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+    int ret1 = 0;</div><div class='add'>+    struct list_head purge = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    inode_t *del = NULL;</div><div class='add'>+    inode_t *tmp = NULL;</div><div class='add'>+    inode_t *entry = NULL;</div><div class='add'>+    uint64_t nlookup = 0;</div><div class='add'>+    int64_t lru_size = 0;</div><div class='add'>+</div><div class='add'>+    if (!table)</div><div class='add'>+        return -1;</div><div class='add'>+</div><div class='add'>+    INIT_LIST_HEAD(&amp;purge);</div><div class='add'>+</div><div class='add'>+    pthread_mutex_lock(&amp;table-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        if (!table-&gt;lru_limit)</div><div class='add'>+            goto purge_list;</div><div class='add'>+</div><div class='add'>+        lru_size = table-&gt;lru_size;</div><div class='add'>+        while (lru_size &gt; (table-&gt;lru_limit)) {</div><div class='add'>+            if (list_empty(&amp;table-&gt;lru)) {</div><div class='add'>+                gf_msg_callingfn(THIS-&gt;name, GF_LOG_WARNING, 0,</div><div class='add'>+                                 LG_MSG_INVALID_INODE_LIST,</div><div class='add'>+                                 "Empty inode lru list found"</div><div class='add'>+                                 " but with (%d) lru_size",</div><div class='add'>+                                 table-&gt;lru_size);</div><div class='add'>+                break;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            lru_size--;</div><div class='add'>+            entry = list_entry(table-&gt;lru.next, inode_t, list);</div><div class='add'>+            /* The logic of invalidation is required only if invalidator_fn</div><div class='add'>+               is present */</div><div class='add'>+            if (table-&gt;invalidator_fn) {</div><div class='add'>+                /* check for valid inode with 'nlookup' */</div><div class='add'>+                nlookup = GF_ATOMIC_GET(entry-&gt;nlookup);</div><div class='add'>+                if (nlookup) {</div><div class='add'>+                    if (entry-&gt;invalidate_sent) {</div><div class='add'>+                        list_move_tail(&amp;entry-&gt;list, &amp;table-&gt;lru);</div><div class='add'>+                        continue;</div><div class='add'>+                    }</div><div class='add'>+                    __inode_ref(entry, true);</div><div class='add'>+                    tmp = entry;</div><div class='add'>+                    break;</div><div class='ctx'>                 }</div><div class='add'>+            }</div><div class='ctx'> </div><div class='del'>-                list_splice_init (&amp;table-&gt;purge, &amp;purge);</div><div class='del'>-                table-&gt;purge_size = 0;</div><div class='add'>+            table-&gt;lru_size--;</div><div class='add'>+            __inode_retire(entry);</div><div class='add'>+            ret++;</div><div class='ctx'>         }</div><div class='del'>-        pthread_mutex_unlock (&amp;table-&gt;lock);</div><div class='ctx'> </div><div class='add'>+    purge_list:</div><div class='add'>+        list_splice_init(&amp;table-&gt;purge, &amp;purge);</div><div class='add'>+        table-&gt;purge_size = 0;</div><div class='add'>+    }</div><div class='add'>+    pthread_mutex_unlock(&amp;table-&gt;lock);</div><div class='add'>+</div><div class='add'>+    /* Pick 1 inode for invalidation */</div><div class='add'>+    if (tmp) {</div><div class='add'>+        xlator_t *old_THIS = THIS;</div><div class='add'>+        THIS = table-&gt;invalidator_xl;</div><div class='add'>+        ret1 = table-&gt;invalidator_fn(table-&gt;invalidator_xl, tmp);</div><div class='add'>+        THIS = old_THIS;</div><div class='add'>+        pthread_mutex_lock(&amp;table-&gt;lock);</div><div class='ctx'>         {</div><div class='del'>-                list_for_each_entry_safe (del, tmp, &amp;purge, list) {</div><div class='del'>-                        list_del_init (&amp;del-&gt;list);</div><div class='del'>-                        __inode_forget (del, 0);</div><div class='del'>-                        __inode_destroy (del);</div><div class='del'>-                }</div><div class='add'>+            if (!ret1) {</div><div class='add'>+                tmp-&gt;invalidate_sent = true;</div><div class='add'>+                __inode_unref(tmp, false);</div><div class='add'>+            } else {</div><div class='add'>+                /* Move this back to the lru list*/</div><div class='add'>+                __inode_unref(tmp, true);</div><div class='add'>+            }</div><div class='ctx'>         }</div><div class='del'>-</div><div class='del'>-        return ret;</div><div class='add'>+        pthread_mutex_unlock(&amp;table-&gt;lock);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Just so that if purge list is handled too, then clear it off */</div><div class='add'>+    list_for_each_entry_safe(del, tmp, &amp;purge, list)</div><div class='add'>+    {</div><div class='add'>+        list_del_init(&amp;del-&gt;list);</div><div class='add'>+        inode_forget_atomic(del, 0);</div><div class='add'>+        __inode_destroy(del);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> static void</div><div class='del'>-__inode_table_init_root (inode_table_t *table)</div><div class='add'>+__inode_table_init_root(inode_table_t *table)</div><div class='ctx'> {</div><div class='del'>-        inode_t     *root = NULL;</div><div class='del'>-        struct iatt  iatt = {0, };</div><div class='add'>+    inode_t *root = NULL;</div><div class='add'>+    struct iatt iatt = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    if (!table)</div><div class='add'>+        return;</div><div class='ctx'> </div><div class='del'>-        if (!table)</div><div class='del'>-                return;</div><div class='add'>+    root = inode_create(table);</div><div class='ctx'> </div><div class='del'>-        root = __inode_create (table);</div><div class='add'>+    list_add(&amp;root-&gt;list, &amp;table-&gt;lru);</div><div class='add'>+    table-&gt;lru_size++;</div><div class='ctx'> </div><div class='del'>-        iatt.ia_gfid[15] = 1;</div><div class='del'>-        iatt.ia_ino = 1;</div><div class='del'>-        iatt.ia_type = IA_IFDIR;</div><div class='add'>+    iatt.ia_gfid[15] = 1;</div><div class='add'>+    iatt.ia_ino = 1;</div><div class='add'>+    iatt.ia_type = IA_IFDIR;</div><div class='ctx'> </div><div class='del'>-        table-&gt;root = root;</div><div class='del'>-        __inode_link (root, NULL, NULL, &amp;iatt);</div><div class='add'>+    __inode_link(root, NULL, NULL, &amp;iatt, 0);</div><div class='add'>+    table-&gt;root = root;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> inode_table_t *</div><div class='del'>-inode_table_new (size_t lru_limit, xlator_t *xl)</div><div class='add'>+inode_table_with_invalidator(uint32_t lru_limit, xlator_t *xl,</div><div class='add'>+                             int32_t (*invalidator_fn)(xlator_t *, inode_t *),</div><div class='add'>+                             xlator_t *invalidator_xl)</div><div class='ctx'> {</div><div class='del'>-        inode_table_t *new = NULL;</div><div class='del'>-        int            ret = 0;</div><div class='del'>-        int            i = 0;</div><div class='add'>+    inode_table_t *new = NULL;</div><div class='add'>+    uint32_t mem_pool_size = lru_limit;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int i = 0;</div><div class='ctx'> </div><div class='del'>-        new = (void *)GF_CALLOC(1, sizeof (*new), gf_common_mt_inode_table_t);</div><div class='del'>-        if (!new)</div><div class='del'>-                return NULL;</div><div class='add'>+    new = (void *)GF_CALLOC(1, sizeof(*new), gf_common_mt_inode_table_t);</div><div class='add'>+    if (!new)</div><div class='add'>+        return NULL;</div><div class='ctx'> </div><div class='del'>-        new-&gt;xl = xl;</div><div class='add'>+    new-&gt;xl = xl;</div><div class='add'>+    new-&gt;ctxcount = xl-&gt;graph-&gt;xl_count + 1;</div><div class='ctx'> </div><div class='del'>-        new-&gt;lru_limit = lru_limit;</div><div class='add'>+    new-&gt;lru_limit = lru_limit;</div><div class='add'>+    new-&gt;invalidator_fn = invalidator_fn;</div><div class='add'>+    new-&gt;invalidator_xl = invalidator_xl;</div><div class='ctx'> </div><div class='del'>-        new-&gt;hashsize = 14057; /* TODO: Random Number?? */</div><div class='add'>+    new-&gt;hashsize = 14057; /* TODO: Random Number?? */</div><div class='ctx'> </div><div class='del'>-        new-&gt;inode_pool = mem_pool_new (inode_t, 204654);</div><div class='add'>+    /* In case FUSE is initing the inode table. */</div><div class='add'>+    if (!mem_pool_size || (mem_pool_size &gt; DEFAULT_INODE_MEMPOOL_ENTRIES))</div><div class='add'>+        mem_pool_size = DEFAULT_INODE_MEMPOOL_ENTRIES;</div><div class='ctx'> </div><div class='del'>-        if (!new-&gt;inode_pool) {</div><div class='del'>-                GF_FREE (new);</div><div class='del'>-                return NULL;</div><div class='add'>+    new-&gt;inode_pool = mem_pool_new(inode_t, mem_pool_size);</div><div class='add'>+    if (!new-&gt;inode_pool)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    new-&gt;dentry_pool = mem_pool_new(dentry_t, mem_pool_size);</div><div class='add'>+    if (!new-&gt;dentry_pool)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    new-&gt;inode_hash = (void *)GF_CALLOC(65536, sizeof(struct list_head),</div><div class='add'>+                                        gf_common_mt_list_head);</div><div class='add'>+    if (!new-&gt;inode_hash)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    new-&gt;name_hash = (void *)GF_CALLOC(new-&gt;hashsize, sizeof(struct list_head),</div><div class='add'>+                                       gf_common_mt_list_head);</div><div class='add'>+    if (!new-&gt;name_hash)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    /* if number of fd open in one process is more than this,</div><div class='add'>+       we may hit perf issues */</div><div class='add'>+    new-&gt;fd_mem_pool = mem_pool_new(fd_t, 1024);</div><div class='add'>+</div><div class='add'>+    if (!new-&gt;fd_mem_pool)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; 65536; i++) {</div><div class='add'>+        INIT_LIST_HEAD(&amp;new-&gt;inode_hash[i]);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; new-&gt;hashsize; i++) {</div><div class='add'>+        INIT_LIST_HEAD(&amp;new-&gt;name_hash[i]);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    INIT_LIST_HEAD(&amp;new-&gt;active);</div><div class='add'>+    INIT_LIST_HEAD(&amp;new-&gt;lru);</div><div class='add'>+    INIT_LIST_HEAD(&amp;new-&gt;purge);</div><div class='add'>+    INIT_LIST_HEAD(&amp;new-&gt;invalidate);</div><div class='add'>+</div><div class='add'>+    ret = gf_asprintf(&amp;new-&gt;name, "%s/inode", xl-&gt;name);</div><div class='add'>+    if (-1 == ret) {</div><div class='add'>+        /* TODO: This should be ok to continue, check with avati */</div><div class='add'>+        ;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    new-&gt;cleanup_started = _gf_false;</div><div class='add'>+</div><div class='add'>+    __inode_table_init_root(new);</div><div class='add'>+</div><div class='add'>+    pthread_mutex_init(&amp;new-&gt;lock, NULL);</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+out:</div><div class='add'>+    if (ret) {</div><div class='add'>+        if (new) {</div><div class='add'>+            GF_FREE(new-&gt;inode_hash);</div><div class='add'>+            GF_FREE(new-&gt;name_hash);</div><div class='add'>+            if (new-&gt;dentry_pool)</div><div class='add'>+                mem_pool_destroy(new-&gt;dentry_pool);</div><div class='add'>+            if (new-&gt;inode_pool)</div><div class='add'>+                mem_pool_destroy(new-&gt;inode_pool);</div><div class='add'>+            GF_FREE(new);</div><div class='add'>+            new = NULL;</div><div class='ctx'>         }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return new;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        new-&gt;dentry_pool = mem_pool_new (dentry_t, 204654);</div><div class='add'>+inode_table_t *</div><div class='add'>+inode_table_new(uint32_t lru_limit, xlator_t *xl)</div><div class='add'>+{</div><div class='add'>+    /* Only fuse for now requires the inode table with invalidator */</div><div class='add'>+    return inode_table_with_invalidator(lru_limit, xl, NULL, NULL);</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        if (!new-&gt;dentry_pool) {</div><div class='del'>-                GF_FREE (new);</div><div class='del'>-                return NULL;</div><div class='add'>+int</div><div class='add'>+inode_table_ctx_free(inode_table_t *table)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+    inode_t *del = NULL;</div><div class='add'>+    inode_t *tmp = NULL;</div><div class='add'>+    int purge_count = 0;</div><div class='add'>+    int lru_count = 0;</div><div class='add'>+    int active_count = 0;</div><div class='add'>+    xlator_t *this = NULL;</div><div class='add'>+    int itable_size = 0;</div><div class='add'>+</div><div class='add'>+    if (!table)</div><div class='add'>+        return -1;</div><div class='add'>+</div><div class='add'>+    this = THIS;</div><div class='add'>+</div><div class='add'>+    pthread_mutex_lock(&amp;table-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        list_for_each_entry_safe(del, tmp, &amp;table-&gt;purge, list)</div><div class='add'>+        {</div><div class='add'>+            if (del-&gt;_ctx) {</div><div class='add'>+                __inode_ctx_free(del);</div><div class='add'>+                purge_count++;</div><div class='add'>+            }</div><div class='ctx'>         }</div><div class='ctx'> </div><div class='del'>-        new-&gt;inode_hash = (void *)GF_CALLOC (65536,</div><div class='del'>-                                             sizeof (struct list_head),</div><div class='del'>-                                             gf_common_mt_list_head);</div><div class='del'>-        if (!new-&gt;inode_hash) {</div><div class='del'>-                GF_FREE (new);</div><div class='del'>-                return NULL;</div><div class='add'>+        list_for_each_entry_safe(del, tmp, &amp;table-&gt;lru, list)</div><div class='add'>+        {</div><div class='add'>+            if (del-&gt;_ctx) {</div><div class='add'>+                __inode_ctx_free(del);</div><div class='add'>+                lru_count++;</div><div class='add'>+            }</div><div class='ctx'>         }</div><div class='ctx'> </div><div class='del'>-        new-&gt;name_hash = (void *)GF_CALLOC (new-&gt;hashsize,</div><div class='del'>-                                            sizeof (struct list_head),</div><div class='del'>-                                            gf_common_mt_list_head);</div><div class='del'>-        if (!new-&gt;name_hash) {</div><div class='del'>-                GF_FREE (new-&gt;inode_hash);</div><div class='del'>-                GF_FREE (new);</div><div class='del'>-                return NULL;</div><div class='add'>+        /* should the contexts of active inodes be freed?</div><div class='add'>+         * Since before this function being called fds would have</div><div class='add'>+         * been migrated and would have held the ref on the new</div><div class='add'>+         * inode from the new inode table, the older inode would not</div><div class='add'>+         * be used.</div><div class='add'>+         */</div><div class='add'>+        list_for_each_entry_safe(del, tmp, &amp;table-&gt;active, list)</div><div class='add'>+        {</div><div class='add'>+            if (del-&gt;_ctx) {</div><div class='add'>+                __inode_ctx_free(del);</div><div class='add'>+                active_count++;</div><div class='add'>+            }</div><div class='ctx'>         }</div><div class='add'>+    }</div><div class='add'>+    pthread_mutex_unlock(&amp;table-&gt;lock);</div><div class='add'>+</div><div class='add'>+    ret = purge_count + lru_count + active_count;</div><div class='add'>+    itable_size = table-&gt;active_size + table-&gt;lru_size + table-&gt;purge_size;</div><div class='add'>+    gf_msg_callingfn(this-&gt;name, GF_LOG_INFO, 0, LG_MSG_INODE_CONTEXT_FREED,</div><div class='add'>+                     "total %d (itable size: "</div><div class='add'>+                     "%d) inode contexts have been freed (active: %d, ("</div><div class='add'>+                     "active size: %d), lru: %d, (lru size: %d),  purge: "</div><div class='add'>+                     "%d, (purge size: %d))",</div><div class='add'>+                     ret, itable_size, active_count, table-&gt;active_size,</div><div class='add'>+                     lru_count, table-&gt;lru_size, purge_count,</div><div class='add'>+                     table-&gt;purge_size);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+inode_table_destroy_all(glusterfs_ctx_t *ctx)</div><div class='add'>+{</div><div class='add'>+    glusterfs_graph_t *trav_graph = NULL, *tmp = NULL;</div><div class='add'>+    xlator_t *tree = NULL;</div><div class='add'>+    inode_table_t *inode_table = NULL;</div><div class='add'>+</div><div class='add'>+    if (ctx == NULL)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    /* TODO: Traverse ctx-&gt;graphs with in ctx-&gt;lock and also the other</div><div class='add'>+     * graph additions and traversals in ctx-&gt;lock.</div><div class='add'>+     */</div><div class='add'>+    list_for_each_entry_safe(trav_graph, tmp, &amp;ctx-&gt;graphs, list)</div><div class='add'>+    {</div><div class='add'>+        tree = trav_graph-&gt;first;</div><div class='add'>+        inode_table = tree-&gt;itable;</div><div class='add'>+        tree-&gt;itable = NULL;</div><div class='add'>+        if (inode_table)</div><div class='add'>+            inode_table_destroy(inode_table);</div><div class='add'>+    }</div><div class='add'>+out:</div><div class='add'>+    return;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	 new-&gt;fd_mem_pool = mem_pool_new (fd_t, 16384);</div><div class='add'>+void</div><div class='add'>+inode_table_destroy(inode_table_t *inode_table)</div><div class='add'>+{</div><div class='add'>+    inode_t *trav = NULL;</div><div class='ctx'> </div><div class='del'>-	 if (!new-&gt;fd_mem_pool) {</div><div class='del'>-		  GF_FREE (new-&gt;inode_hash);</div><div class='del'>-		  GF_FREE (new);</div><div class='del'>-	 }</div><div class='add'>+    if (inode_table == NULL)</div><div class='add'>+        return;</div><div class='ctx'> </div><div class='del'>-        for (i = 0; i &lt; 65536; i++) {</div><div class='del'>-                INIT_LIST_HEAD (&amp;new-&gt;inode_hash[i]);</div><div class='add'>+    /* Ideally at this point in time, there should be no inodes with</div><div class='add'>+     * refs remaining. But there are quite a few chances where the inodes</div><div class='add'>+     * leak. So we can take three approaches for cleaning up the inode table:</div><div class='add'>+     * 1. Assume there are no leaks and then send a forget on all the inodes</div><div class='add'>+     *    in lru list.(If no leaks there should be no inodes in active list)</div><div class='add'>+     * 2. Knowing there could be leaks and not freeing those inodes will</div><div class='add'>+     *    also not free its inode context and this could leak a lot of</div><div class='add'>+     *    memory, force free the inodes by changing the ref to 0.</div><div class='add'>+     *    The problem with this is that any reference to inode after this</div><div class='add'>+     *    calling this function will lead to a crash.</div><div class='add'>+     * 3. Knowing there could be leakes, just free the inode contexts of</div><div class='add'>+     *    all the inodes. and let the inodes be alive. This way the major</div><div class='add'>+     *    memory consumed by the inode contexts are freed, but there can</div><div class='add'>+     *    be errors when any inode contexts are accessed after destroying</div><div class='add'>+     *    this table.</div><div class='add'>+     *</div><div class='add'>+     * Not sure which is the approach to be taken, going by approach 2.</div><div class='add'>+     */</div><div class='add'>+</div><div class='add'>+    /* Approach 3:</div><div class='add'>+     * ret = inode_table_ctx_free (inode_table);</div><div class='add'>+     */</div><div class='add'>+    pthread_mutex_lock(&amp;inode_table-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        inode_table-&gt;cleanup_started = _gf_true;</div><div class='add'>+        /* Process lru list first as we need to unset their dentry</div><div class='add'>+         * entries (the ones which may not be unset during</div><div class='add'>+         * '__inode_passivate' as they were hashed) which in turn</div><div class='add'>+         * shall unref their parent</div><div class='add'>+         *</div><div class='add'>+         * These parent inodes when unref'ed may well again fall</div><div class='add'>+         * into lru list and if we are at the end of traversing</div><div class='add'>+         * the list, we may miss to delete/retire that entry. Hence</div><div class='add'>+         * traverse the lru list till it gets empty.</div><div class='add'>+         */</div><div class='add'>+        while (!list_empty(&amp;inode_table-&gt;lru)) {</div><div class='add'>+            trav = list_first_entry(&amp;inode_table-&gt;lru, inode_t, list);</div><div class='add'>+            inode_forget_atomic(trav, 0);</div><div class='add'>+            __inode_retire(trav);</div><div class='add'>+            inode_table-&gt;lru_size--;</div><div class='ctx'>         }</div><div class='ctx'> </div><div class='add'>+        /* Same logic for invalidate list */</div><div class='add'>+        while (!list_empty(&amp;inode_table-&gt;invalidate)) {</div><div class='add'>+            trav = list_first_entry(&amp;inode_table-&gt;invalidate, inode_t, list);</div><div class='add'>+            inode_forget_atomic(trav, 0);</div><div class='add'>+            __inode_retire(trav);</div><div class='add'>+            inode_table-&gt;invalidate_size--;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-        for (i = 0; i &lt; new-&gt;hashsize; i++) {</div><div class='del'>-                INIT_LIST_HEAD (&amp;new-&gt;name_hash[i]);</div><div class='add'>+        while (!list_empty(&amp;inode_table-&gt;active)) {</div><div class='add'>+            trav = list_first_entry(&amp;inode_table-&gt;active, inode_t, list);</div><div class='add'>+            /* forget and unref the inode to retire and add it to</div><div class='add'>+             * purge list. By this time there should not be any</div><div class='add'>+             * inodes present in the active list except for root</div><div class='add'>+             * inode. Its a ref_leak otherwise. */</div><div class='add'>+            if (trav &amp;&amp; (trav != inode_table-&gt;root))</div><div class='add'>+                gf_msg_callingfn(THIS-&gt;name, GF_LOG_WARNING, 0,</div><div class='add'>+                                 LG_MSG_REF_COUNT,</div><div class='add'>+                                 "Active inode(%p) with refcount"</div><div class='add'>+                                 "(%d) found during cleanup",</div><div class='add'>+                                 trav, trav-&gt;ref);</div><div class='add'>+            inode_forget_atomic(trav, 0);</div><div class='add'>+            __inode_ref_reduce_by_n(trav, 0);</div><div class='ctx'>         }</div><div class='add'>+    }</div><div class='add'>+    pthread_mutex_unlock(&amp;inode_table-&gt;lock);</div><div class='ctx'> </div><div class='del'>-        INIT_LIST_HEAD (&amp;new-&gt;active);</div><div class='del'>-        INIT_LIST_HEAD (&amp;new-&gt;lru);</div><div class='del'>-        INIT_LIST_HEAD (&amp;new-&gt;purge);</div><div class='add'>+    inode_table_prune(inode_table);</div><div class='ctx'> </div><div class='del'>-        ret = gf_asprintf (&amp;new-&gt;name, "%s/inode", xl-&gt;name);</div><div class='del'>-        if (-1 == ret) {</div><div class='del'>-                /* TODO: This should be ok to continue, check with avati */</div><div class='del'>-                ;</div><div class='del'>-        }</div><div class='add'>+    GF_FREE(inode_table-&gt;inode_hash);</div><div class='add'>+    GF_FREE(inode_table-&gt;name_hash);</div><div class='add'>+    if (inode_table-&gt;dentry_pool)</div><div class='add'>+        mem_pool_destroy(inode_table-&gt;dentry_pool);</div><div class='add'>+    if (inode_table-&gt;inode_pool)</div><div class='add'>+        mem_pool_destroy(inode_table-&gt;inode_pool);</div><div class='add'>+    if (inode_table-&gt;fd_mem_pool)</div><div class='add'>+        mem_pool_destroy(inode_table-&gt;fd_mem_pool);</div><div class='ctx'> </div><div class='del'>-        __inode_table_init_root (new);</div><div class='add'>+    pthread_mutex_destroy(&amp;inode_table-&gt;lock);</div><div class='ctx'> </div><div class='del'>-        pthread_mutex_init (&amp;new-&gt;lock, NULL);</div><div class='add'>+    GF_FREE(inode_table-&gt;name);</div><div class='add'>+    GF_FREE(inode_table);</div><div class='ctx'> </div><div class='del'>-        return new;</div><div class='add'>+    return;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> inode_t *</div><div class='del'>-inode_from_path (inode_table_t *itable, const char *path)</div><div class='add'>+inode_from_path(inode_table_t *itable, const char *path)</div><div class='ctx'> {</div><div class='del'>-        inode_t  *inode = NULL;</div><div class='del'>-        inode_t  *parent = NULL;</div><div class='del'>-        inode_t  *root = NULL;</div><div class='del'>-        inode_t  *curr = NULL;</div><div class='del'>-        char     *pathname = NULL;</div><div class='del'>-        char     *component = NULL, *next_component = NULL;</div><div class='del'>-        char     *strtokptr = NULL;</div><div class='add'>+    inode_t *inode = NULL;</div><div class='add'>+    inode_t *parent = NULL;</div><div class='add'>+    inode_t *root = NULL;</div><div class='add'>+    inode_t *curr = NULL;</div><div class='add'>+    char *pathname = NULL;</div><div class='add'>+    char *component = NULL, *next_component = NULL;</div><div class='add'>+    char *strtokptr = NULL;</div><div class='add'>+</div><div class='add'>+    if (!itable || !path)</div><div class='add'>+        return NULL;</div><div class='ctx'> </div><div class='del'>-        if (!itable || !path)</div><div class='del'>-                return NULL;</div><div class='add'>+    /* top-down approach */</div><div class='add'>+    pathname = gf_strdup(path);</div><div class='add'>+    if (pathname == NULL) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    root = itable-&gt;root;</div><div class='add'>+    parent = inode_ref(root);</div><div class='add'>+    component = strtok_r(pathname, "/", &amp;strtokptr);</div><div class='add'>+</div><div class='add'>+    if (component == NULL)</div><div class='add'>+        /* root inode */</div><div class='add'>+        inode = inode_ref(parent);</div><div class='ctx'> </div><div class='del'>-        /* top-down approach */</div><div class='del'>-        pathname = gf_strdup (path);</div><div class='del'>-        if (pathname == NULL) {</div><div class='del'>-                gf_log ("inode", GF_LOG_ERROR, "out of memory");</div><div class='del'>-                goto out;</div><div class='add'>+    while (component) {</div><div class='add'>+        curr = inode_grep(itable, parent, component);</div><div class='add'>+</div><div class='add'>+        if (curr == NULL) {</div><div class='add'>+            strtok_r(NULL, "/", &amp;strtokptr);</div><div class='add'>+            break;</div><div class='ctx'>         }</div><div class='ctx'> </div><div class='del'>-        root = itable-&gt;root;</div><div class='del'>-        parent = inode_ref (root);</div><div class='del'>-        component = strtok_r (pathname, "/", &amp;strtokptr);</div><div class='add'>+        next_component = strtok_r(NULL, "/", &amp;strtokptr);</div><div class='ctx'> </div><div class='del'>-        if (component == NULL)</div><div class='del'>-                /* root inode */</div><div class='del'>-                inode = inode_ref (parent);</div><div class='add'>+        if (next_component) {</div><div class='add'>+            inode_unref(parent);</div><div class='add'>+            parent = curr;</div><div class='add'>+            curr = NULL;</div><div class='add'>+        } else {</div><div class='add'>+            inode = curr;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-        while (component) {</div><div class='del'>-                curr = inode_grep (itable, parent, component);</div><div class='add'>+        component = next_component;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-                if (curr == NULL) {</div><div class='del'>-                        strtok_r (NULL, "/", &amp;strtokptr);</div><div class='del'>-                        break;</div><div class='del'>-                }</div><div class='add'>+    if (parent)</div><div class='add'>+        inode_unref(parent);</div><div class='ctx'> </div><div class='del'>-                next_component = strtok_r (NULL, "/", &amp;strtokptr);</div><div class='add'>+    GF_FREE(pathname);</div><div class='ctx'> </div><div class='del'>-                if (next_component) {</div><div class='del'>-                        inode_unref (parent);</div><div class='del'>-                        parent = curr;</div><div class='del'>-                        curr = NULL;</div><div class='del'>-                } else {</div><div class='del'>-                        inode = curr;</div><div class='del'>-                }</div><div class='add'>+out:</div><div class='add'>+    return inode;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-                component = next_component;</div><div class='del'>-        }</div><div class='add'>+void</div><div class='add'>+inode_set_need_lookup(inode_t *inode, xlator_t *this)</div><div class='add'>+{</div><div class='add'>+    uint64_t need_lookup = LOOKUP_NEEDED;</div><div class='ctx'> </div><div class='del'>-        if (parent)</div><div class='del'>-                inode_unref (parent);</div><div class='add'>+    if (!inode || !this)</div><div class='add'>+        return;</div><div class='ctx'> </div><div class='del'>-        if (pathname)</div><div class='del'>-                GF_FREE (pathname);</div><div class='add'>+    inode_ctx_set(inode, this, &amp;need_lookup);</div><div class='ctx'> </div><div class='del'>-out:</div><div class='del'>-        return inode;</div><div class='add'>+    return;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+/* Function behaviour:</div><div class='add'>+ * Function return true if inode_ctx is not present,</div><div class='add'>+ * or value stored in inode_ctx is LOOKUP_NEEDED.</div><div class='add'>+ * If inode_ctx value is LOOKUP_NOT_NEEDED, which means</div><div class='add'>+ * inode_ctx is present for xlator this, but no lookup</div><div class='add'>+ * needed.</div><div class='add'>+ */</div><div class='add'>+gf_boolean_t</div><div class='add'>+inode_needs_lookup(inode_t *inode, xlator_t *this)</div><div class='add'>+{</div><div class='add'>+    uint64_t need_lookup = 0;</div><div class='add'>+    gf_boolean_t ret = _gf_false;</div><div class='add'>+    int op_ret = -1;</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-__inode_ctx_put2 (inode_t *inode, xlator_t *xlator, uint64_t value1,</div><div class='del'>-                  uint64_t value2)</div><div class='del'>-{</div><div class='del'>-        int ret = 0;</div><div class='del'>-        int index = 0;</div><div class='del'>-        int put_idx = -1;</div><div class='del'>-</div><div class='del'>-        if (!inode || !xlator)</div><div class='del'>-                return -1;</div><div class='del'>-</div><div class='del'>-        for (index = 0; index &lt; xlator-&gt;graph-&gt;xl_count; index++) {</div><div class='del'>-                if (!inode-&gt;_ctx[index].xl_key) {</div><div class='del'>-                        if (put_idx == -1)</div><div class='del'>-                                put_idx = index;</div><div class='del'>-                        /* dont break, to check if key already exists</div><div class='del'>-                           further on */</div><div class='del'>-                }</div><div class='del'>-                if (inode-&gt;_ctx[index].xl_key == xlator) {</div><div class='del'>-                        put_idx = index;</div><div class='del'>-                        break;</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='add'>+    if (!inode || !this)</div><div class='add'>+        return ret;</div><div class='ctx'> </div><div class='del'>-        if (put_idx == -1) {</div><div class='del'>-                ret = -1;</div><div class='del'>-                goto out;;</div><div class='del'>-        }</div><div class='add'>+    op_ret = inode_ctx_get(inode, this, &amp;need_lookup);</div><div class='add'>+    if (op_ret == -1) {</div><div class='add'>+        ret = _gf_true;</div><div class='add'>+    } else if (need_lookup == LOOKUP_NEEDED) {</div><div class='add'>+        ret = _gf_true;</div><div class='add'>+        need_lookup = LOOKUP_NOT_NEEDED;</div><div class='add'>+        inode_ctx_set(inode, this, &amp;need_lookup);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        inode-&gt;_ctx[put_idx].xl_key = xlator;</div><div class='del'>-        inode-&gt;_ctx[put_idx].value1 = value1;</div><div class='del'>-        inode-&gt;_ctx[put_idx].value2 = value2;</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+__inode_ctx_set2(inode_t *inode, xlator_t *xlator, uint64_t *value1_p,</div><div class='add'>+                 uint64_t *value2_p)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+    int set_idx = -1;</div><div class='add'>+</div><div class='add'>+    if (!inode || !xlator || !inode-&gt;_ctx)</div><div class='add'>+        return -1;</div><div class='add'>+</div><div class='add'>+    set_idx = __inode_get_xl_index(inode, xlator);</div><div class='add'>+    if (set_idx == -1) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+        ;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    inode-&gt;_ctx[set_idx].xl_key = xlator;</div><div class='add'>+    if (value1_p)</div><div class='add'>+        inode-&gt;_ctx[set_idx].value1 = *value1_p;</div><div class='add'>+    if (value2_p)</div><div class='add'>+        inode-&gt;_ctx[set_idx].value2 = *value2_p;</div><div class='ctx'> out:</div><div class='del'>-        return ret;</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+int</div><div class='add'>+__inode_ctx_set0(inode_t *inode, xlator_t *xlator, uint64_t *value1_p)</div><div class='add'>+{</div><div class='add'>+    return __inode_ctx_set2(inode, xlator, value1_p, NULL);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+__inode_ctx_set1(inode_t *inode, xlator_t *xlator, uint64_t *value2_p)</div><div class='add'>+{</div><div class='add'>+    return __inode_ctx_set2(inode, xlator, NULL, value2_p);</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-inode_ctx_put2 (inode_t *inode, xlator_t *xlator, uint64_t value1,</div><div class='del'>-                uint64_t value2)</div><div class='add'>+inode_ctx_set2(inode_t *inode, xlator_t *xlator, uint64_t *value1_p,</div><div class='add'>+               uint64_t *value2_p)</div><div class='ctx'> {</div><div class='del'>-        int ret = 0;</div><div class='add'>+    int ret = 0;</div><div class='ctx'> </div><div class='del'>-        if (!inode || !xlator)</div><div class='del'>-                return -1;</div><div class='add'>+    if (!inode || !xlator)</div><div class='add'>+        return -1;</div><div class='ctx'> </div><div class='del'>-        LOCK (&amp;inode-&gt;lock);</div><div class='del'>-        {</div><div class='del'>-                ret = __inode_ctx_put2 (inode, xlator, value1, value2);</div><div class='del'>-        }</div><div class='del'>-        UNLOCK (&amp;inode-&gt;lock);</div><div class='add'>+    LOCK(&amp;inode-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        ret = __inode_ctx_set2(inode, xlator, value1_p, value2_p);</div><div class='add'>+    }</div><div class='add'>+    UNLOCK(&amp;inode-&gt;lock);</div><div class='ctx'> </div><div class='del'>-        return ret;</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+int</div><div class='add'>+inode_ctx_set1(inode_t *inode, xlator_t *xlator, uint64_t *value2_p)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    if (!inode || !xlator)</div><div class='add'>+        return -1;</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;inode-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        ret = __inode_ctx_set1(inode, xlator, value2_p);</div><div class='add'>+    }</div><div class='add'>+    UNLOCK(&amp;inode-&gt;lock);</div><div class='ctx'> </div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> int</div><div class='del'>-__inode_ctx_get2 (inode_t *inode, xlator_t *xlator, uint64_t *value1,</div><div class='del'>-                  uint64_t *value2)</div><div class='add'>+inode_ctx_set0(inode_t *inode, xlator_t *xlator, uint64_t *value1_p)</div><div class='ctx'> {</div><div class='del'>-        int index = 0;</div><div class='del'>-        int ret = 0;</div><div class='add'>+    int ret = 0;</div><div class='ctx'> </div><div class='del'>-        if (!inode || !xlator)</div><div class='del'>-                return -1;</div><div class='add'>+    if (!inode || !xlator)</div><div class='add'>+        return -1;</div><div class='ctx'> </div><div class='del'>-        for (index = 0; index &lt; xlator-&gt;graph-&gt;xl_count; index++) {</div><div class='del'>-                if (inode-&gt;_ctx[index].xl_key == xlator)</div><div class='del'>-                        break;</div><div class='del'>-        }</div><div class='add'>+    LOCK(&amp;inode-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        ret = __inode_ctx_set0(inode, xlator, value1_p);</div><div class='add'>+    }</div><div class='add'>+    UNLOCK(&amp;inode-&gt;lock);</div><div class='ctx'> </div><div class='del'>-        if (index == xlator-&gt;graph-&gt;xl_count) {</div><div class='del'>-                ret = -1;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        if (value1)</div><div class='del'>-                *value1 = inode-&gt;_ctx[index].value1;</div><div class='add'>+int</div><div class='add'>+__inode_ctx_get2(inode_t *inode, xlator_t *xlator, uint64_t *value1,</div><div class='add'>+                 uint64_t *value2)</div><div class='add'>+{</div><div class='add'>+    int index = 0;</div><div class='add'>+    int ret = -1;</div><div class='ctx'> </div><div class='del'>-        if (value2)</div><div class='del'>-                *value2 = inode-&gt;_ctx[index].value2;</div><div class='add'>+    if (!inode || !xlator || !inode-&gt;_ctx)</div><div class='add'>+        goto out;</div><div class='ctx'> </div><div class='add'>+    index = xlator-&gt;xl_id;</div><div class='add'>+    if (inode-&gt;_ctx[index].xl_key != xlator)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    if (inode-&gt;_ctx[index].value1) {</div><div class='add'>+        if (value1) {</div><div class='add'>+            *value1 = inode-&gt;_ctx[index].value1;</div><div class='add'>+            ret = 0;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    if (inode-&gt;_ctx[index].value2) {</div><div class='add'>+        if (value2) {</div><div class='add'>+            *value2 = inode-&gt;_ctx[index].value2;</div><div class='add'>+            ret = 0;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='ctx'> out:</div><div class='del'>-        return ret;</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+int</div><div class='add'>+__inode_ctx_get0(inode_t *inode, xlator_t *xlator, uint64_t *value1)</div><div class='add'>+{</div><div class='add'>+    uint64_t tmp_value = 0;</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    ret = __inode_ctx_get2(inode, xlator, &amp;tmp_value, NULL);</div><div class='add'>+    if (!ret &amp;&amp; value1)</div><div class='add'>+        *value1 = tmp_value;</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-inode_ctx_get2 (inode_t *inode, xlator_t *xlator, uint64_t *value1,</div><div class='del'>-                uint64_t *value2)</div><div class='add'>+__inode_ctx_get1(inode_t *inode, xlator_t *xlator, uint64_t *value2)</div><div class='ctx'> {</div><div class='del'>-        int ret = 0;</div><div class='add'>+    uint64_t tmp_value = 0;</div><div class='add'>+    int ret = 0;</div><div class='ctx'> </div><div class='del'>-        if (!inode || !xlator)</div><div class='del'>-                return -1;</div><div class='add'>+    ret = __inode_ctx_get2(inode, xlator, NULL, &amp;tmp_value);</div><div class='add'>+    if (!ret &amp;&amp; value2)</div><div class='add'>+        *value2 = tmp_value;</div><div class='ctx'> </div><div class='del'>-        LOCK (&amp;inode-&gt;lock);</div><div class='del'>-        {</div><div class='del'>-                ret = __inode_ctx_get2 (inode, xlator, value1, value2);</div><div class='del'>-        }</div><div class='del'>-        UNLOCK (&amp;inode-&gt;lock);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        return ret;</div><div class='add'>+int</div><div class='add'>+inode_ctx_get2(inode_t *inode, xlator_t *xlator, uint64_t *value1,</div><div class='add'>+               uint64_t *value2)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    if (!inode || !xlator)</div><div class='add'>+        return -1;</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;inode-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        ret = __inode_ctx_get2(inode, xlator, value1, value2);</div><div class='add'>+    }</div><div class='add'>+    UNLOCK(&amp;inode-&gt;lock);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+int</div><div class='add'>+inode_ctx_get1(inode_t *inode, xlator_t *xlator, uint64_t *value2)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    if (!inode || !xlator)</div><div class='add'>+        return -1;</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;inode-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        ret = __inode_ctx_get1(inode, xlator, value2);</div><div class='add'>+    }</div><div class='add'>+    UNLOCK(&amp;inode-&gt;lock);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-inode_ctx_del2 (inode_t *inode, xlator_t *xlator, uint64_t *value1,</div><div class='del'>-                uint64_t *value2)</div><div class='add'>+inode_ctx_get0(inode_t *inode, xlator_t *xlator, uint64_t *value1)</div><div class='ctx'> {</div><div class='del'>-        int index = 0;</div><div class='del'>-        int ret = 0;</div><div class='add'>+    int ret = 0;</div><div class='ctx'> </div><div class='del'>-        if (!inode || !xlator)</div><div class='del'>-                return -1;</div><div class='add'>+    if (!inode || !xlator)</div><div class='add'>+        return -1;</div><div class='ctx'> </div><div class='del'>-        LOCK (&amp;inode-&gt;lock);</div><div class='del'>-        {</div><div class='del'>-                for (index = 0; index &lt; xlator-&gt;graph-&gt;xl_count; index++) {</div><div class='del'>-                        if (inode-&gt;_ctx[index].xl_key == xlator)</div><div class='del'>-                                break;</div><div class='del'>-                }</div><div class='add'>+    LOCK(&amp;inode-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        ret = __inode_ctx_get0(inode, xlator, value1);</div><div class='add'>+    }</div><div class='add'>+    UNLOCK(&amp;inode-&gt;lock);</div><div class='ctx'> </div><div class='del'>-                if (index == xlator-&gt;graph-&gt;xl_count) {</div><div class='del'>-                        ret = -1;</div><div class='del'>-                        goto unlock;</div><div class='del'>-                }</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-                if (value1)</div><div class='del'>-                        *value1 = inode-&gt;_ctx[index].value1;</div><div class='del'>-                if (value2)</div><div class='del'>-                        *value2 = inode-&gt;_ctx[index].value2;</div><div class='add'>+int</div><div class='add'>+inode_ctx_del2(inode_t *inode, xlator_t *xlator, uint64_t *value1,</div><div class='add'>+               uint64_t *value2)</div><div class='add'>+{</div><div class='add'>+    int index = 0;</div><div class='add'>+    int ret = 0;</div><div class='ctx'> </div><div class='del'>-                inode-&gt;_ctx[index].key    = 0;</div><div class='del'>-                inode-&gt;_ctx[index].value1 = 0;</div><div class='del'>-                inode-&gt;_ctx[index].value2 = 0;</div><div class='add'>+    if (!inode || !xlator)</div><div class='add'>+        return -1;</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;inode-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        if (!inode-&gt;_ctx)</div><div class='add'>+            goto unlock;</div><div class='add'>+</div><div class='add'>+        index = xlator-&gt;xl_id;</div><div class='add'>+        if (inode-&gt;_ctx[index].xl_key != xlator) {</div><div class='add'>+            ret = -1;</div><div class='add'>+            goto unlock;</div><div class='ctx'>         }</div><div class='add'>+</div><div class='add'>+        if (inode-&gt;_ctx[index].value1 &amp;&amp; value1)</div><div class='add'>+            *value1 = inode-&gt;_ctx[index].value1;</div><div class='add'>+        if (inode-&gt;_ctx[index].value2 &amp;&amp; value2)</div><div class='add'>+            *value2 = inode-&gt;_ctx[index].value2;</div><div class='add'>+</div><div class='add'>+        inode-&gt;_ctx[index].key = 0;</div><div class='add'>+        inode-&gt;_ctx[index].xl_key = NULL;</div><div class='add'>+        inode-&gt;_ctx[index].value1 = 0;</div><div class='add'>+        inode-&gt;_ctx[index].value2 = 0;</div><div class='add'>+    }</div><div class='ctx'> unlock:</div><div class='del'>-        UNLOCK (&amp;inode-&gt;lock);</div><div class='add'>+    UNLOCK(&amp;inode-&gt;lock);</div><div class='ctx'> </div><div class='del'>-        return ret;</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-__inode_ctx_put (inode_t *inode, xlator_t *key, uint64_t value)</div><div class='add'>+/* function behavior:</div><div class='add'>+ - if value1 is set, value1 in ctx is reset to 0 with current value passed</div><div class='add'>+ back in value1 address.</div><div class='add'>+ - if value2 is set, value2 in ctx is reset to 0 with current value passed</div><div class='add'>+ back in value2 address.</div><div class='add'>+ - if both are set, both fields are reset.</div><div class='add'>+*/</div><div class='add'>+static int</div><div class='add'>+__inode_ctx_reset2(inode_t *inode, xlator_t *xlator, uint64_t *value1,</div><div class='add'>+                   uint64_t *value2)</div><div class='ctx'> {</div><div class='del'>-        return __inode_ctx_put2 (inode, key, value, 0);</div><div class='del'>-}</div><div class='add'>+    int index = 0;</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    if (!inode || !xlator)</div><div class='add'>+        return -1;</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;inode-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        index = xlator-&gt;xl_id;</div><div class='add'>+        if (inode-&gt;_ctx[index].xl_key != xlator) {</div><div class='add'>+            ret = -1;</div><div class='add'>+            goto unlock;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        if (inode-&gt;_ctx[index].value1 &amp;&amp; value1) {</div><div class='add'>+            *value1 = inode-&gt;_ctx[index].value1;</div><div class='add'>+            inode-&gt;_ctx[index].value1 = 0;</div><div class='add'>+        }</div><div class='add'>+        if (inode-&gt;_ctx[index].value2 &amp;&amp; value2) {</div><div class='add'>+            *value2 = inode-&gt;_ctx[index].value2;</div><div class='add'>+            inode-&gt;_ctx[index].value2 = 0;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+unlock:</div><div class='add'>+    UNLOCK(&amp;inode-&gt;lock);</div><div class='ctx'> </div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-inode_ctx_put (inode_t *inode, xlator_t *key, uint64_t value)</div><div class='add'>+inode_ctx_reset2(inode_t *inode, xlator_t *xlator, uint64_t *value1_p,</div><div class='add'>+                 uint64_t *value2_p)</div><div class='ctx'> {</div><div class='del'>-        return inode_ctx_put2 (inode, key, value, 0);</div><div class='add'>+    uint64_t tmp_value1 = 0;</div><div class='add'>+    uint64_t tmp_value2 = 0;</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    ret = __inode_ctx_reset2(inode, xlator, &amp;tmp_value1, &amp;tmp_value2);</div><div class='add'>+    if (!ret) {</div><div class='add'>+        if (value1_p)</div><div class='add'>+            *value1_p = tmp_value1;</div><div class='add'>+        if (value2_p)</div><div class='add'>+            *value2_p = tmp_value2;</div><div class='add'>+    }</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-__inode_ctx_get (inode_t *inode, xlator_t *key, uint64_t *value)</div><div class='add'>+inode_ctx_reset1(inode_t *inode, xlator_t *xlator, uint64_t *value2_p)</div><div class='ctx'> {</div><div class='del'>-        return __inode_ctx_get2 (inode, key, value, 0);</div><div class='del'>-}</div><div class='add'>+    uint64_t tmp_value2 = 0;</div><div class='add'>+    int ret = 0;</div><div class='ctx'> </div><div class='add'>+    ret = __inode_ctx_reset2(inode, xlator, NULL, &amp;tmp_value2);</div><div class='ctx'> </div><div class='add'>+    if (!ret &amp;&amp; value2_p)</div><div class='add'>+        *value2_p = tmp_value2;</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> int</div><div class='del'>-inode_ctx_get (inode_t *inode, xlator_t *key, uint64_t *value)</div><div class='add'>+inode_ctx_reset0(inode_t *inode, xlator_t *xlator, uint64_t *value1_p)</div><div class='ctx'> {</div><div class='del'>-        return inode_ctx_get2 (inode, key, value, 0);</div><div class='del'>-}</div><div class='add'>+    uint64_t tmp_value1 = 0;</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    ret = __inode_ctx_reset2(inode, xlator, &amp;tmp_value1, NULL);</div><div class='ctx'> </div><div class='add'>+    if (!ret &amp;&amp; value1_p)</div><div class='add'>+        *value1_p = tmp_value1;</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-inode_ctx_del (inode_t *inode, xlator_t *key, uint64_t *value)</div><div class='add'>+inode_is_linked(inode_t *inode)</div><div class='ctx'> {</div><div class='del'>-        return inode_ctx_del2 (inode, key, value, 0);</div><div class='del'>-}</div><div class='add'>+    int ret = 0;</div><div class='add'>+    inode_table_t *table = NULL;</div><div class='add'>+</div><div class='add'>+    if (!inode) {</div><div class='add'>+        gf_msg_callingfn(THIS-&gt;name, GF_LOG_WARNING, 0, LG_MSG_INODE_NOT_FOUND,</div><div class='add'>+                         "inode not found");</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    table = inode-&gt;table;</div><div class='ctx'> </div><div class='add'>+    pthread_mutex_lock(&amp;table-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        ret = __is_inode_hashed(inode);</div><div class='add'>+    }</div><div class='add'>+    pthread_mutex_unlock(&amp;table-&gt;lock);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> void</div><div class='del'>-inode_dump (inode_t *inode, char *prefix)</div><div class='add'>+inode_dump(inode_t *inode, char *prefix)</div><div class='ctx'> {</div><div class='del'>-        char            key[GF_DUMP_MAX_BUF_LEN];</div><div class='del'>-        int             ret = -1;</div><div class='del'>-        xlator_t        *xl = NULL;</div><div class='del'>-        int             i = 0;</div><div class='del'>-        char            uuidbuf[256];</div><div class='del'>-</div><div class='del'>-        if (!inode)</div><div class='del'>-                return;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    xlator_t *xl = NULL;</div><div class='add'>+    int i = 0;</div><div class='add'>+    fd_t *fd = NULL;</div><div class='add'>+    struct _inode_ctx *inode_ctx = NULL;</div><div class='add'>+    struct list_head fd_list;</div><div class='add'>+    int ref = 0;</div><div class='add'>+    char key[GF_DUMP_MAX_BUF_LEN];</div><div class='add'>+    uint64_t nlookup = 0;</div><div class='add'>+</div><div class='add'>+    if (!inode)</div><div class='add'>+        return;</div><div class='ctx'> </div><div class='del'>-        ret = TRY_LOCK(&amp;inode-&gt;lock);</div><div class='add'>+    INIT_LIST_HEAD(&amp;fd_list);</div><div class='ctx'> </div><div class='del'>-        if (ret != 0) {</div><div class='del'>-                gf_log("", GF_LOG_WARNING, "Unable to dump inode"</div><div class='del'>-                       " errno: %d", errno);</div><div class='del'>-                return;</div><div class='add'>+    ret = TRY_LOCK(&amp;inode-&gt;lock);</div><div class='add'>+    if (ret != 0) {</div><div class='add'>+        return;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    {</div><div class='add'>+        nlookup = GF_ATOMIC_GET(inode-&gt;nlookup);</div><div class='add'>+        gf_proc_dump_write("gfid", "%s", uuid_utoa(inode-&gt;gfid));</div><div class='add'>+        gf_proc_dump_write("nlookup", "%" PRIu64, nlookup);</div><div class='add'>+        gf_proc_dump_write("fd-count", "%u", inode-&gt;fd_count);</div><div class='add'>+        gf_proc_dump_write("active-fd-count", "%u", inode-&gt;active_fd_count);</div><div class='add'>+        gf_proc_dump_write("ref", "%u", inode-&gt;ref);</div><div class='add'>+        gf_proc_dump_write("invalidate-sent", "%d", inode-&gt;invalidate_sent);</div><div class='add'>+        gf_proc_dump_write("ia_type", "%d", inode-&gt;ia_type);</div><div class='add'>+        if (inode-&gt;_ctx) {</div><div class='add'>+            inode_ctx = GF_CALLOC(inode-&gt;table-&gt;ctxcount, sizeof(*inode_ctx),</div><div class='add'>+                                  gf_common_mt_inode_ctx);</div><div class='add'>+            if (inode_ctx == NULL) {</div><div class='add'>+                goto unlock;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            for (i = 0; i &lt; inode-&gt;table-&gt;ctxcount; i++) {</div><div class='add'>+                inode_ctx[i] = inode-&gt;_ctx[i];</div><div class='add'>+                xl = inode_ctx[i].xl_key;</div><div class='add'>+                ref = inode_ctx[i].ref;</div><div class='add'>+                if (ref != 0 &amp;&amp; xl) {</div><div class='add'>+                    gf_proc_dump_build_key(key, "ref_by_xl:", "%s", xl-&gt;name);</div><div class='add'>+                    gf_proc_dump_write(key, "%d", ref);</div><div class='add'>+                }</div><div class='add'>+            }</div><div class='ctx'>         }</div><div class='ctx'> </div><div class='del'>-        uuid_unparse (inode-&gt;gfid, uuidbuf);</div><div class='del'>-        gf_proc_dump_build_key(key, prefix, "gfid");</div><div class='del'>-        gf_proc_dump_write(key, "%s", uuidbuf);</div><div class='del'>-        gf_proc_dump_build_key(key, prefix, "nlookup");</div><div class='del'>-        gf_proc_dump_write(key, "%ld", inode-&gt;nlookup);</div><div class='del'>-        gf_proc_dump_build_key(key, prefix, "ref");</div><div class='del'>-        gf_proc_dump_write(key, "%u", inode-&gt;ref);</div><div class='del'>-        gf_proc_dump_build_key(key, prefix, "ino");</div><div class='del'>-        gf_proc_dump_write(key, "%ld", inode-&gt;ino);</div><div class='del'>-        gf_proc_dump_build_key(key, prefix, "ia_type");</div><div class='del'>-        gf_proc_dump_write(key, "%d", inode-&gt;ia_type);</div><div class='del'>-        UNLOCK(&amp;inode-&gt;lock);</div><div class='del'>-        if (!inode-&gt;_ctx)</div><div class='del'>-                goto out;</div><div class='add'>+        if (dump_options.xl_options.dump_fdctx != _gf_true)</div><div class='add'>+            goto unlock;</div><div class='ctx'> </div><div class='del'>-        for (i = 0; i &lt; inode-&gt;table-&gt;xl-&gt;graph-&gt;xl_count; i++) {</div><div class='del'>-                if (inode-&gt;_ctx[i].xl_key) {</div><div class='del'>-                        xl = (xlator_t *)(long)inode-&gt;_ctx[i].xl_key;</div><div class='del'>-                        if (xl-&gt;dumpops &amp;&amp; xl-&gt;dumpops-&gt;inodectx)</div><div class='del'>-                                xl-&gt;dumpops-&gt;inodectx (xl, inode);</div><div class='del'>-                }</div><div class='add'>+        list_for_each_entry(fd, &amp;inode-&gt;fd_list, inode_list)</div><div class='add'>+        {</div><div class='add'>+            fd_ctx_dump(fd, prefix);</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+unlock:</div><div class='add'>+    UNLOCK(&amp;inode-&gt;lock);</div><div class='add'>+</div><div class='add'>+    if (inode_ctx &amp;&amp; (dump_options.xl_options.dump_inodectx == _gf_true)) {</div><div class='add'>+        for (i = 0; i &lt; inode-&gt;table-&gt;ctxcount; i++) {</div><div class='add'>+            if (inode_ctx[i].xl_key) {</div><div class='add'>+                xl = (xlator_t *)(long)inode_ctx[i].xl_key;</div><div class='add'>+                if (xl-&gt;dumpops &amp;&amp; xl-&gt;dumpops-&gt;inodectx)</div><div class='add'>+                    xl-&gt;dumpops-&gt;inodectx(xl, inode);</div><div class='add'>+            }</div><div class='ctx'>         }</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-out:</div><div class='add'>+    GF_FREE(inode_ctx);</div><div class='add'>+</div><div class='add'>+    return;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+inode_table_dump(inode_table_t *itable, char *prefix)</div><div class='add'>+{</div><div class='add'>+    char key[GF_DUMP_MAX_BUF_LEN];</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    if (!itable)</div><div class='ctx'>         return;</div><div class='add'>+</div><div class='add'>+    ret = pthread_mutex_trylock(&amp;itable-&gt;lock);</div><div class='add'>+</div><div class='add'>+    if (ret != 0) {</div><div class='add'>+        return;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    gf_proc_dump_build_key(key, prefix, "hashsize");</div><div class='add'>+    gf_proc_dump_write(key, "%" GF_PRI_SIZET, itable-&gt;hashsize);</div><div class='add'>+    gf_proc_dump_build_key(key, prefix, "name");</div><div class='add'>+    gf_proc_dump_write(key, "%s", itable-&gt;name);</div><div class='add'>+</div><div class='add'>+    gf_proc_dump_build_key(key, prefix, "lru_limit");</div><div class='add'>+    gf_proc_dump_write(key, "%d", itable-&gt;lru_limit);</div><div class='add'>+    gf_proc_dump_build_key(key, prefix, "active_size");</div><div class='add'>+    gf_proc_dump_write(key, "%d", itable-&gt;active_size);</div><div class='add'>+    gf_proc_dump_build_key(key, prefix, "lru_size");</div><div class='add'>+    gf_proc_dump_write(key, "%d", itable-&gt;lru_size);</div><div class='add'>+    gf_proc_dump_build_key(key, prefix, "purge_size");</div><div class='add'>+    gf_proc_dump_write(key, "%d", itable-&gt;purge_size);</div><div class='add'>+    gf_proc_dump_build_key(key, prefix, "invalidate_size");</div><div class='add'>+    gf_proc_dump_write(key, "%d", itable-&gt;invalidate_size);</div><div class='add'>+</div><div class='add'>+    INODE_DUMP_LIST(&amp;itable-&gt;active, key, prefix, "active");</div><div class='add'>+    INODE_DUMP_LIST(&amp;itable-&gt;lru, key, prefix, "lru");</div><div class='add'>+    INODE_DUMP_LIST(&amp;itable-&gt;purge, key, prefix, "purge");</div><div class='add'>+    INODE_DUMP_LIST(&amp;itable-&gt;invalidate, key, prefix, "invalidate");</div><div class='add'>+</div><div class='add'>+    pthread_mutex_unlock(&amp;itable-&gt;lock);</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> void</div><div class='del'>-inode_table_dump (inode_table_t *itable, char *prefix)</div><div class='add'>+inode_dump_to_dict(inode_t *inode, char *prefix, dict_t *dict)</div><div class='ctx'> {</div><div class='add'>+    int ret = -1;</div><div class='add'>+    char key[GF_DUMP_MAX_BUF_LEN] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    uint64_t nlookup = 0;</div><div class='add'>+</div><div class='add'>+    ret = TRY_LOCK(&amp;inode-&gt;lock);</div><div class='add'>+    if (ret)</div><div class='add'>+        return;</div><div class='add'>+</div><div class='add'>+    snprintf(key, sizeof(key), "%s.gfid", prefix);</div><div class='add'>+    ret = dict_set_dynstr(dict, key, gf_strdup(uuid_utoa(inode-&gt;gfid)));</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    snprintf(key, sizeof(key), "%s.nlookup", prefix);</div><div class='add'>+    nlookup = GF_ATOMIC_GET(inode-&gt;nlookup);</div><div class='add'>+    ret = dict_set_uint64(dict, key, nlookup);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    snprintf(key, sizeof(key), "%s.ref", prefix);</div><div class='add'>+    ret = dict_set_uint32(dict, key, inode-&gt;ref);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    snprintf(key, sizeof(key), "%s.ia_type", prefix);</div><div class='add'>+    ret = dict_set_int32(dict, key, inode-&gt;ia_type);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='ctx'> </div><div class='del'>-        char    key[GF_DUMP_MAX_BUF_LEN];</div><div class='del'>-        int     ret = 0;</div><div class='add'>+out:</div><div class='add'>+    UNLOCK(&amp;inode-&gt;lock);</div><div class='add'>+    return;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        if (!itable)</div><div class='del'>-                return;</div><div class='add'>+void</div><div class='add'>+inode_table_dump_to_dict(inode_table_t *itable, char *prefix, dict_t *dict)</div><div class='add'>+{</div><div class='add'>+    char key[GF_DUMP_MAX_BUF_LEN] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int ret = 0;</div><div class='add'>+#ifdef DEBUG</div><div class='add'>+    inode_t *inode = NULL;</div><div class='add'>+    int count = 0;</div><div class='add'>+#endif</div><div class='add'>+    ret = pthread_mutex_trylock(&amp;itable-&gt;lock);</div><div class='add'>+    if (ret)</div><div class='add'>+        return;</div><div class='ctx'> </div><div class='del'>-        memset(key, 0, sizeof(key));</div><div class='del'>-        ret = pthread_mutex_trylock(&amp;itable-&gt;lock);</div><div class='add'>+    snprintf(key, sizeof(key), "%s.itable.lru_limit", prefix);</div><div class='add'>+    ret = dict_set_uint32(dict, key, itable-&gt;lru_limit);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    snprintf(key, sizeof(key), "%s.itable.active_size", prefix);</div><div class='add'>+    ret = dict_set_uint32(dict, key, itable-&gt;active_size);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    snprintf(key, sizeof(key), "%s.itable.lru_size", prefix);</div><div class='add'>+    ret = dict_set_uint32(dict, key, itable-&gt;lru_size);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    snprintf(key, sizeof(key), "%s.itable.purge_size", prefix);</div><div class='add'>+    ret = dict_set_uint32(dict, key, itable-&gt;purge_size);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+#ifdef DEBUG</div><div class='add'>+    /* Dumping inode details in dictionary and sending it to CLI is not</div><div class='add'>+       required as when a developer (or support team) asks for this command</div><div class='add'>+       output, they just want to get top level detail of inode table.</div><div class='add'>+       If one wants to debug, let them take statedump and debug, this</div><div class='add'>+       wouldn't be available in CLI during production setup.</div><div class='add'>+    */</div><div class='add'>+    list_for_each_entry(inode, &amp;itable-&gt;active, list)</div><div class='add'>+    {</div><div class='add'>+        snprintf(key, sizeof(key), "%s.itable.active%d", prefix, count++);</div><div class='add'>+        inode_dump_to_dict(inode, key, dict);</div><div class='add'>+    }</div><div class='add'>+    count = 0;</div><div class='add'>+</div><div class='add'>+    list_for_each_entry(inode, &amp;itable-&gt;lru, list)</div><div class='add'>+    {</div><div class='add'>+        snprintf(key, sizeof(key), "%s.itable.lru%d", prefix, count++);</div><div class='add'>+        inode_dump_to_dict(inode, key, dict);</div><div class='add'>+    }</div><div class='add'>+    count = 0;</div><div class='add'>+</div><div class='add'>+    list_for_each_entry(inode, &amp;itable-&gt;purge, list)</div><div class='add'>+    {</div><div class='add'>+        snprintf(key, sizeof(key), "%s.itable.purge%d", prefix, count++);</div><div class='add'>+        inode_dump_to_dict(inode, key, dict);</div><div class='add'>+    }</div><div class='add'>+#endif</div><div class='ctx'> </div><div class='del'>-        if (ret != 0) {</div><div class='del'>-                gf_log("", GF_LOG_WARNING, "Unable to dump inode table"</div><div class='del'>-                       " errno: %d", errno);</div><div class='del'>-                return;</div><div class='add'>+out:</div><div class='add'>+    pthread_mutex_unlock(&amp;itable-&gt;lock);</div><div class='add'>+</div><div class='add'>+    return;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+size_t</div><div class='add'>+inode_ctx_size(inode_t *inode)</div><div class='add'>+{</div><div class='add'>+    int i = 0;</div><div class='add'>+    size_t size = 0;</div><div class='add'>+    xlator_t *xl = NULL, *old_THIS = NULL;</div><div class='add'>+</div><div class='add'>+    if (!inode)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;inode-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        for (i = 0; i &lt; inode-&gt;table-&gt;ctxcount; i++) {</div><div class='add'>+            if (!inode-&gt;_ctx[i].xl_key)</div><div class='add'>+                continue;</div><div class='add'>+</div><div class='add'>+            xl = (xlator_t *)(long)inode-&gt;_ctx[i].xl_key;</div><div class='add'>+            old_THIS = THIS;</div><div class='add'>+            THIS = xl;</div><div class='add'>+</div><div class='add'>+            /* If inode ref is taken when THIS is global xlator,</div><div class='add'>+             * the ctx xl_key is set, but the value is NULL.</div><div class='add'>+             * For global xlator the cbks can be NULL, hence check</div><div class='add'>+             * for the same */</div><div class='add'>+            if (!xl-&gt;cbks) {</div><div class='add'>+                THIS = old_THIS;</div><div class='add'>+                continue;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            if (xl-&gt;cbks-&gt;ictxsize)</div><div class='add'>+                size += xl-&gt;cbks-&gt;ictxsize(xl, inode);</div><div class='add'>+</div><div class='add'>+            THIS = old_THIS;</div><div class='ctx'>         }</div><div class='add'>+    }</div><div class='add'>+    UNLOCK(&amp;inode-&gt;lock);</div><div class='ctx'> </div><div class='del'>-        gf_proc_dump_build_key(key, prefix, "hashsize");</div><div class='del'>-        gf_proc_dump_write(key, "%d", itable-&gt;hashsize);</div><div class='del'>-        gf_proc_dump_build_key(key, prefix, "name");</div><div class='del'>-        gf_proc_dump_write(key, "%s", itable-&gt;name);</div><div class='del'>-</div><div class='del'>-        gf_proc_dump_build_key(key, prefix, "lru_limit");</div><div class='del'>-        gf_proc_dump_write(key, "%d", itable-&gt;lru_limit);</div><div class='del'>-        gf_proc_dump_build_key(key, prefix, "active_size");</div><div class='del'>-        gf_proc_dump_write(key, "%d", itable-&gt;active_size);</div><div class='del'>-        gf_proc_dump_build_key(key, prefix, "lru_size");</div><div class='del'>-        gf_proc_dump_write(key, "%d", itable-&gt;lru_size);</div><div class='del'>-        gf_proc_dump_build_key(key, prefix, "purge_size");</div><div class='del'>-        gf_proc_dump_write(key, "%d", itable-&gt;purge_size);</div><div class='del'>-</div><div class='del'>-        INODE_DUMP_LIST(&amp;itable-&gt;active, key, prefix, "active");</div><div class='del'>-        INODE_DUMP_LIST(&amp;itable-&gt;lru, key, prefix, "lru");</div><div class='del'>-        INODE_DUMP_LIST(&amp;itable-&gt;purge, key, prefix, "purge");</div><div class='del'>-</div><div class='del'>-        pthread_mutex_unlock(&amp;itable-&gt;lock);</div><div class='add'>+out:</div><div class='add'>+    return size;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* *</div><div class='add'>+ * This function finds name of the inode, if it has dentry. The dentry will be</div><div class='add'>+ * created only if inode_link happens with valid parent and name. And this</div><div class='add'>+ * function is only applicable for directories because multiple dentries are</div><div class='add'>+ * not possible(no hardlinks)</div><div class='add'>+ * */</div><div class='add'>+void</div><div class='add'>+inode_find_directory_name(inode_t *inode, const char **name)</div><div class='add'>+{</div><div class='add'>+    dentry_t *dentry = NULL;</div><div class='add'>+</div><div class='add'>+    GF_VALIDATE_OR_GOTO("inode", inode, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("inode", name, out);</div><div class='add'>+</div><div class='add'>+    if (!IA_ISDIR(inode-&gt;ia_type))</div><div class='add'>+        return;</div><div class='add'>+</div><div class='add'>+    pthread_mutex_lock(&amp;inode-&gt;table-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        dentry = __dentry_search_arbit(inode);</div><div class='add'>+        if (dentry) {</div><div class='add'>+            *name = dentry-&gt;name;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    pthread_mutex_unlock(&amp;inode-&gt;table-&gt;lock);</div><div class='add'>+out:</div><div class='add'>+    return;</div><div class='ctx'> }</div><div class='head'>diff --git a/libglusterfs/src/inode.h b/libglusterfs/src/inode.h<br/>deleted file mode 100644<br/>index 71d53366946..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/libglusterfs/src/inode.h?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/inode.h</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,184 +0,0 @@</div><div class='del'>-/*</div><div class='del'>-   Copyright (c) 2007-2009 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='del'>-   This file is part of GlusterFS.</div><div class='del'>-</div><div class='del'>-   GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-   it under the terms of the GNU General Public License as published</div><div class='del'>-   by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-   or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-   GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-   WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-   General Public License for more details.</div><div class='del'>-</div><div class='del'>-   You should have received a copy of the GNU General Public License</div><div class='del'>-   along with this program.  If not, see</div><div class='del'>-   &lt;http://www.gnu.org/licenses/&gt;.</div><div class='del'>-*/</div><div class='del'>-</div><div class='del'>-#ifndef _INODE_H</div><div class='del'>-#define _INODE_H</div><div class='del'>-</div><div class='del'>-#ifndef _CONFIG_H</div><div class='del'>-#define _CONFIG_H</div><div class='del'>-#include "config.h"</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-#include &lt;stdint.h&gt;</div><div class='del'>-#include &lt;sys/types.h&gt;</div><div class='del'>-</div><div class='del'>-struct _inode_table;</div><div class='del'>-typedef struct _inode_table inode_table_t;</div><div class='del'>-</div><div class='del'>-struct _inode;</div><div class='del'>-typedef struct _inode inode_t;</div><div class='del'>-</div><div class='del'>-struct _dentry;</div><div class='del'>-typedef struct _dentry dentry_t;</div><div class='del'>-</div><div class='del'>-#include "list.h"</div><div class='del'>-#include "xlator.h"</div><div class='del'>-#include "iatt.h"</div><div class='del'>-#include "uuid.h"</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-struct _inode_table {</div><div class='del'>-        pthread_mutex_t    lock;</div><div class='del'>-        size_t             hashsize;    /* bucket size of inode hash and dentry hash */</div><div class='del'>-        char              *name;        /* name of the inode table, just for gf_log() */</div><div class='del'>-        inode_t           *root;        /* root directory inode, with number 1 */</div><div class='del'>-        xlator_t          *xl;          /* xlator to be called to do purge */</div><div class='del'>-        uint32_t           lru_limit;   /* maximum LRU cache size */</div><div class='del'>-        struct list_head  *inode_hash;  /* buckets for inode hash table */</div><div class='del'>-        struct list_head  *name_hash;   /* buckets for dentry hash table */</div><div class='del'>-        struct list_head   active;      /* list of inodes currently active (in an fop) */</div><div class='del'>-        uint32_t           active_size; /* count of inodes in active list */</div><div class='del'>-        struct list_head   lru;         /* list of inodes recently used.</div><div class='del'>-                                           lru.next most recent */</div><div class='del'>-        uint32_t           lru_size;    /* count of inodes in lru list  */</div><div class='del'>-        struct list_head   purge;       /* list of inodes to be purged soon */</div><div class='del'>-        uint32_t           purge_size;  /* count of inodes in purge list */</div><div class='del'>-</div><div class='del'>-        struct mem_pool   *inode_pool;  /* memory pool for inodes */</div><div class='del'>-        struct mem_pool   *dentry_pool; /* memory pool for dentrys */</div><div class='del'>-        struct mem_pool   *fd_mem_pool; /* memory pool for fd_t */</div><div class='del'>-};</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-struct _dentry {</div><div class='del'>-        struct list_head   inode_list;   /* list of dentries of inode */</div><div class='del'>-        struct list_head   hash;         /* hash table pointers */</div><div class='del'>-        inode_t           *inode;        /* inode of this directory entry */</div><div class='del'>-        char              *name;         /* name of the directory entry */</div><div class='del'>-        inode_t           *parent;       /* directory of the entry */</div><div class='del'>-};</div><div class='del'>-</div><div class='del'>-struct _inode_ctx {</div><div class='del'>-        union {</div><div class='del'>-                uint64_t    key;</div><div class='del'>-                xlator_t   *xl_key;</div><div class='del'>-        };</div><div class='del'>-        union {</div><div class='del'>-                uint64_t    value1;</div><div class='del'>-                void       *ptr1;</div><div class='del'>-        };</div><div class='del'>-        union {</div><div class='del'>-                uint64_t    value2;</div><div class='del'>-                void       *ptr2;</div><div class='del'>-        };</div><div class='del'>-};</div><div class='del'>-</div><div class='del'>-struct _inode {</div><div class='del'>-        inode_table_t       *table;         /* the table this inode belongs to */</div><div class='del'>-        uuid_t               gfid;</div><div class='del'>-        gf_lock_t            lock;</div><div class='del'>-        uint64_t             nlookup;</div><div class='del'>-        uint32_t             ref;           /* reference count on this inode */</div><div class='del'>-        ino_t                ino;           /* inode number in the storage (persistent) */</div><div class='del'>-        ia_type_t            ia_type;       /* what kind of file */</div><div class='del'>-        struct list_head     fd_list;       /* list of open files on this inode */</div><div class='del'>-        struct list_head     dentry_list;   /* list of directory entries for this inode */</div><div class='del'>-        struct list_head     hash;          /* hash table pointers */</div><div class='del'>-        struct list_head     list;          /* active/lru/purge */</div><div class='del'>-</div><div class='del'>-	struct _inode_ctx   *_ctx;    /* replacement for dict_t *(inode-&gt;ctx) */</div><div class='del'>-};</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-inode_table_t *</div><div class='del'>-inode_table_new (size_t lru_limit, xlator_t *xl);</div><div class='del'>-</div><div class='del'>-inode_t *</div><div class='del'>-inode_new (inode_table_t *table);</div><div class='del'>-</div><div class='del'>-inode_t *</div><div class='del'>-inode_link (inode_t *inode, inode_t *parent,</div><div class='del'>-            const char *name, struct iatt *stbuf);</div><div class='del'>-</div><div class='del'>-void</div><div class='del'>-inode_unlink (inode_t *inode, inode_t *parent, const char *name);</div><div class='del'>-</div><div class='del'>-inode_t *</div><div class='del'>-inode_parent (inode_t *inode, ino_t par, const char *name);</div><div class='del'>-</div><div class='del'>-inode_t *</div><div class='del'>-inode_ref (inode_t *inode);</div><div class='del'>-</div><div class='del'>-inode_t *</div><div class='del'>-inode_unref (inode_t *inode);</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-inode_lookup (inode_t *inode);</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-inode_forget (inode_t *inode, uint64_t nlookup);</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-inode_rename (inode_table_t *table, inode_t *olddir, const char *oldname,</div><div class='del'>-	      inode_t *newdir, const char *newname,</div><div class='del'>-	      inode_t *inode, struct iatt *stbuf);</div><div class='del'>-</div><div class='del'>-inode_t *</div><div class='del'>-inode_grep (inode_table_t *table, inode_t *parent, const char *name);</div><div class='del'>-</div><div class='del'>-inode_t *</div><div class='del'>-inode_get (inode_table_t *table, ino_t ino, uint64_t gen);</div><div class='del'>-</div><div class='del'>-inode_t *</div><div class='del'>-inode_find (inode_table_t *table, uuid_t gfid);</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-inode_path (inode_t *inode, const char *name, char **bufp);</div><div class='del'>-</div><div class='del'>-inode_t *</div><div class='del'>-inode_from_path (inode_table_t *table, const char *path);</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-__inode_ctx_put (inode_t *inode, xlator_t *xlator, uint64_t value);</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-inode_ctx_put (inode_t *inode, xlator_t *xlator, uint64_t value);</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-__inode_ctx_get (inode_t *inode, xlator_t *xlator, uint64_t *value);</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-inode_ctx_get (inode_t *inode, xlator_t *xlator, uint64_t *value);</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-inode_ctx_del (inode_t *inode, xlator_t *xlator, uint64_t *value);</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-inode_ctx_put2 (inode_t *inode, xlator_t *xlator, uint64_t value1,</div><div class='del'>-                uint64_t value2);</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-inode_ctx_get2 (inode_t *inode, xlator_t *xlator, uint64_t *value1,</div><div class='del'>-                uint64_t *value2);</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-inode_ctx_del2 (inode_t *inode, xlator_t *xlator, uint64_t *value1,</div><div class='del'>-                uint64_t *value2);</div><div class='del'>-</div><div class='del'>-#endif /* _INODE_H */</div><div class='head'>diff --git a/libglusterfs/src/iobuf.c b/libglusterfs/src/iobuf.c<br/>index b25a94e7f1e..4e7d2958764 100644<br/>--- a/<a href='/cgit/glusterfs.git/tree/libglusterfs/src/iobuf.c?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/iobuf.c</a><br/>+++ b/<a href='/cgit/glusterfs.git/tree/libglusterfs/src/iobuf.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>libglusterfs/src/iobuf.c</a></div><div class='hunk'>@@ -1,747 +1,1146 @@</div><div class='ctx'> /*</div><div class='del'>-   Copyright (c) 2009 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='del'>-   This file is part of GlusterFS.</div><div class='del'>-</div><div class='del'>-   GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-   it under the terms of the GNU General Public License as published</div><div class='del'>-   by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-   or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-   GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-   WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-   General Public License for more details.</div><div class='del'>-</div><div class='del'>-   You should have received a copy of the GNU General Public License</div><div class='del'>-   along with this program.  If not, see</div><div class='del'>-   &lt;http://www.gnu.org/licenses/&gt;.</div><div class='del'>-*/</div><div class='add'>+  Copyright (c) 2008-2012 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='ctx'> </div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='ctx'> </div><div class='del'>-#include "iobuf.h"</div><div class='del'>-#include "statedump.h"</div><div class='add'>+#include "glusterfs/iobuf.h"</div><div class='add'>+#include "glusterfs/statedump.h"</div><div class='ctx'> #include &lt;stdio.h&gt;</div><div class='del'>-</div><div class='add'>+#include "glusterfs/libglusterfs-messages.h"</div><div class='ctx'> </div><div class='ctx'> /*</div><div class='ctx'>   TODO: implement destroy margins and prefetching of arenas</div><div class='ctx'> */</div><div class='ctx'> </div><div class='del'>-void</div><div class='del'>-__iobuf_arena_init_iobufs (struct iobuf_arena *iobuf_arena)</div><div class='del'>-{</div><div class='del'>-        size_t              arena_size = 0;</div><div class='del'>-        size_t              page_size = 0;</div><div class='del'>-        int                 iobuf_cnt = 0;</div><div class='del'>-        struct iobuf       *iobuf = NULL;</div><div class='del'>-        int                 offset = 0;</div><div class='del'>-        int                 i = 0;</div><div class='del'>-</div><div class='del'>-        arena_size = iobuf_arena-&gt;iobuf_pool-&gt;arena_size;</div><div class='del'>-        page_size  = iobuf_arena-&gt;iobuf_pool-&gt;page_size;</div><div class='del'>-        iobuf_cnt  = arena_size / page_size;</div><div class='del'>-</div><div class='del'>-        iobuf_arena-&gt;iobufs = GF_CALLOC (sizeof (*iobuf), iobuf_cnt,</div><div class='del'>-                                        gf_common_mt_iobuf);</div><div class='del'>-        if (!iobuf_arena-&gt;iobufs)</div><div class='del'>-                return;</div><div class='add'>+#define IOBUF_ARENA_MAX_INDEX                                                  \</div><div class='add'>+    (sizeof(gf_iobuf_init_config) / (sizeof(struct iobuf_init_config)))</div><div class='ctx'> </div><div class='del'>-        iobuf = iobuf_arena-&gt;iobufs;</div><div class='del'>-        for (i = 0; i &lt; iobuf_cnt; i++) {</div><div class='del'>-                INIT_LIST_HEAD (&amp;iobuf-&gt;list);</div><div class='del'>-                LOCK_INIT (&amp;iobuf-&gt;lock);</div><div class='add'>+/* Make sure this array is sorted based on pagesize */</div><div class='add'>+static const struct iobuf_init_config gf_iobuf_init_config[] = {</div><div class='add'>+    /* { pagesize, num_pages }, */</div><div class='add'>+    {128, 1024},     {512, 512},       {2 * 1024, 512}, {8 * 1024, 128},</div><div class='add'>+    {32 * 1024, 64}, {128 * 1024, 32}, {256 * 1024, 8}, {1 * 1024 * 1024, 2},</div><div class='add'>+};</div><div class='ctx'> </div><div class='del'>-                iobuf-&gt;iobuf_arena = iobuf_arena;</div><div class='add'>+static int</div><div class='add'>+gf_iobuf_get_arena_index(const size_t page_size)</div><div class='add'>+{</div><div class='add'>+    int i;</div><div class='ctx'> </div><div class='del'>-                iobuf-&gt;ptr = iobuf_arena-&gt;mem_base + offset;</div><div class='add'>+    for (i = 0; i &lt; IOBUF_ARENA_MAX_INDEX; i++) {</div><div class='add'>+        if (page_size &lt;= gf_iobuf_init_config[i].pagesize)</div><div class='add'>+            return i;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-                list_add (&amp;iobuf-&gt;list, &amp;iobuf_arena-&gt;passive.list);</div><div class='del'>-                iobuf_arena-&gt;passive_cnt++;</div><div class='add'>+    return -1;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-                offset += page_size;</div><div class='del'>-                iobuf++;</div><div class='add'>+static size_t</div><div class='add'>+gf_iobuf_get_pagesize(const size_t page_size, int *index)</div><div class='add'>+{</div><div class='add'>+    int i;</div><div class='add'>+    size_t size = 0;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; IOBUF_ARENA_MAX_INDEX; i++) {</div><div class='add'>+        size = gf_iobuf_init_config[i].pagesize;</div><div class='add'>+        if (page_size &lt;= size) {</div><div class='add'>+            if (index != NULL)</div><div class='add'>+                *index = i;</div><div class='add'>+            return size;</div><div class='ctx'>         }</div><div class='del'>-}</div><div class='add'>+    }</div><div class='ctx'> </div><div class='add'>+    return -1;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-void</div><div class='del'>-__iobuf_arena_destroy_iobufs (struct iobuf_arena *iobuf_arena)</div><div class='add'>+static void</div><div class='add'>+__iobuf_arena_init_iobufs(struct iobuf_arena *iobuf_arena)</div><div class='ctx'> {</div><div class='del'>-        size_t              arena_size = 0;</div><div class='del'>-        size_t              page_size = 0;</div><div class='del'>-        int                 iobuf_cnt = 0;</div><div class='del'>-        struct iobuf       *iobuf = NULL;</div><div class='del'>-        int                 i = 0;</div><div class='add'>+    const int iobuf_cnt = iobuf_arena-&gt;page_count;</div><div class='add'>+    struct iobuf *iobuf = NULL;</div><div class='add'>+    int offset = 0;</div><div class='add'>+    int i = 0;</div><div class='add'>+</div><div class='add'>+    iobuf_arena-&gt;iobufs = GF_CALLOC(sizeof(*iobuf), iobuf_cnt,</div><div class='add'>+                                    gf_common_mt_iobuf);</div><div class='add'>+    if (!iobuf_arena-&gt;iobufs)</div><div class='add'>+        return;</div><div class='ctx'> </div><div class='del'>-        arena_size = iobuf_arena-&gt;iobuf_pool-&gt;arena_size;</div><div class='del'>-        page_size  = iobuf_arena-&gt;iobuf_pool-&gt;page_size;</div><div class='del'>-        iobuf_cnt  = arena_size / page_size;</div><div class='add'>+    iobuf = iobuf_arena-&gt;iobufs;</div><div class='add'>+    for (i = 0; i &lt; iobuf_cnt; i++) {</div><div class='add'>+        INIT_LIST_HEAD(&amp;iobuf-&gt;list);</div><div class='add'>+        LOCK_INIT(&amp;iobuf-&gt;lock);</div><div class='ctx'> </div><div class='del'>-        if (!iobuf_arena-&gt;iobufs)</div><div class='del'>-                return;</div><div class='add'>+        iobuf-&gt;iobuf_arena = iobuf_arena;</div><div class='ctx'> </div><div class='del'>-        iobuf = iobuf_arena-&gt;iobufs;</div><div class='del'>-        for (i = 0; i &lt; iobuf_cnt; i++) {</div><div class='del'>-                assert (iobuf-&gt;ref == 0);</div><div class='add'>+        iobuf-&gt;ptr = iobuf_arena-&gt;mem_base + offset;</div><div class='ctx'> </div><div class='del'>-                list_del_init (&amp;iobuf-&gt;list);</div><div class='del'>-                iobuf++;</div><div class='del'>-        }</div><div class='add'>+        list_add(&amp;iobuf-&gt;list, &amp;iobuf_arena-&gt;passive.list);</div><div class='add'>+        iobuf_arena-&gt;passive_cnt++;</div><div class='ctx'> </div><div class='del'>-        GF_FREE (iobuf_arena-&gt;iobufs);</div><div class='del'>-}</div><div class='add'>+        offset += iobuf_arena-&gt;page_size;</div><div class='add'>+        iobuf++;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='add'>+    return;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-void</div><div class='del'>-__iobuf_arena_destroy (struct iobuf_arena *iobuf_arena)</div><div class='add'>+static void</div><div class='add'>+__iobuf_arena_destroy_iobufs(struct iobuf_arena *iobuf_arena)</div><div class='ctx'> {</div><div class='del'>-        struct iobuf_pool *iobuf_pool = NULL;</div><div class='add'>+    int iobuf_cnt = 0;</div><div class='add'>+    struct iobuf *iobuf = NULL;</div><div class='add'>+    int i = 0;</div><div class='ctx'> </div><div class='del'>-        if (!iobuf_arena)</div><div class='del'>-                return;</div><div class='add'>+    if (!iobuf_arena-&gt;iobufs) {</div><div class='add'>+        gf_msg_callingfn(THIS-&gt;name, GF_LOG_ERROR, 0, LG_MSG_IOBUFS_NOT_FOUND,</div><div class='add'>+                         "iobufs not found");</div><div class='add'>+        return;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        iobuf_pool = iobuf_arena-&gt;iobuf_pool;</div><div class='add'>+    iobuf_cnt = iobuf_arena-&gt;page_count;</div><div class='add'>+    iobuf = iobuf_arena-&gt;iobufs;</div><div class='add'>+    for (i = 0; i &lt; iobuf_cnt; i++) {</div><div class='add'>+        GF_ASSERT(GF_ATOMIC_GET(iobuf-&gt;ref) == 0);</div><div class='ctx'> </div><div class='del'>-        __iobuf_arena_destroy_iobufs (iobuf_arena);</div><div class='add'>+        LOCK_DESTROY(&amp;iobuf-&gt;lock);</div><div class='add'>+        list_del_init(&amp;iobuf-&gt;list);</div><div class='add'>+        iobuf++;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        if (iobuf_arena-&gt;mem_base</div><div class='del'>-            &amp;&amp; iobuf_arena-&gt;mem_base != MAP_FAILED)</div><div class='del'>-                munmap (iobuf_arena-&gt;mem_base, iobuf_pool-&gt;arena_size);</div><div class='add'>+    GF_FREE(iobuf_arena-&gt;iobufs);</div><div class='ctx'> </div><div class='del'>-        GF_FREE (iobuf_arena);</div><div class='add'>+    return;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='del'>-struct iobuf_arena *</div><div class='del'>-__iobuf_arena_alloc (struct iobuf_pool *iobuf_pool)</div><div class='add'>+static void</div><div class='add'>+__iobuf_arena_destroy(struct iobuf_pool *iobuf_pool,</div><div class='add'>+                      struct iobuf_arena *iobuf_arena)</div><div class='ctx'> {</div><div class='del'>-        struct iobuf_arena *iobuf_arena = NULL;</div><div class='del'>-        size_t              arena_size = 0;</div><div class='add'>+    GF_VALIDATE_OR_GOTO("iobuf", iobuf_arena, out);</div><div class='ctx'> </div><div class='del'>-        iobuf_arena = GF_CALLOC (sizeof (*iobuf_arena), 1,</div><div class='del'>-                             gf_common_mt_iobuf_arena);</div><div class='del'>-        if (!iobuf_arena)</div><div class='del'>-                goto err;</div><div class='add'>+    if (iobuf_pool-&gt;rdma_deregistration)</div><div class='add'>+        iobuf_pool-&gt;rdma_deregistration(iobuf_pool-&gt;mr_list, iobuf_arena);</div><div class='ctx'> </div><div class='del'>-        INIT_LIST_HEAD (&amp;iobuf_arena-&gt;list);</div><div class='del'>-        INIT_LIST_HEAD (&amp;iobuf_arena-&gt;active.list);</div><div class='del'>-        INIT_LIST_HEAD (&amp;iobuf_arena-&gt;passive.list);</div><div class='del'>-        iobuf_arena-&gt;iobuf_pool = iobuf_pool;</div><div class='add'>+    __iobuf_arena_destroy_iobufs(iobuf_arena);</div><div class='ctx'> </div><div class='del'>-        arena_size = iobuf_pool-&gt;arena_size;</div><div class='del'>-        iobuf_arena-&gt;mem_base = mmap (NULL, arena_size, PROT_READ|PROT_WRITE,</div><div class='del'>-                                      MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);</div><div class='del'>-        if (iobuf_arena-&gt;mem_base == MAP_FAILED)</div><div class='del'>-                goto err;</div><div class='add'>+    if (iobuf_arena-&gt;mem_base &amp;&amp; iobuf_arena-&gt;mem_base != MAP_FAILED)</div><div class='add'>+        munmap(iobuf_arena-&gt;mem_base, iobuf_arena-&gt;arena_size);</div><div class='ctx'> </div><div class='del'>-        __iobuf_arena_init_iobufs (iobuf_arena);</div><div class='del'>-        if (!iobuf_arena-&gt;iobufs)</div><div class='del'>-                goto err;</div><div class='add'>+    GF_FREE(iobuf_arena);</div><div class='add'>+out:</div><div class='add'>+    return;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        iobuf_pool-&gt;arena_cnt++;</div><div class='add'>+static struct iobuf_arena *</div><div class='add'>+__iobuf_arena_alloc(struct iobuf_pool *iobuf_pool, size_t page_size,</div><div class='add'>+                    int32_t num_iobufs)</div><div class='add'>+{</div><div class='add'>+    struct iobuf_arena *iobuf_arena = NULL;</div><div class='add'>+    size_t rounded_size = 0;</div><div class='add'>+    int index = 0; /* unused */</div><div class='ctx'> </div><div class='del'>-        return iobuf_arena;</div><div class='add'>+    GF_VALIDATE_OR_GOTO("iobuf", iobuf_pool, out);</div><div class='ctx'> </div><div class='del'>-err:</div><div class='del'>-        __iobuf_arena_destroy (iobuf_arena);</div><div class='del'>-        return NULL;</div><div class='del'>-}</div><div class='add'>+    iobuf_arena = GF_CALLOC(sizeof(*iobuf_arena), 1, gf_common_mt_iobuf_arena);</div><div class='add'>+    if (!iobuf_arena)</div><div class='add'>+        goto err;</div><div class='ctx'> </div><div class='add'>+    INIT_LIST_HEAD(&amp;iobuf_arena-&gt;list);</div><div class='add'>+    INIT_LIST_HEAD(&amp;iobuf_arena-&gt;all_list);</div><div class='add'>+    INIT_LIST_HEAD(&amp;iobuf_arena-&gt;active.list);</div><div class='add'>+    INIT_LIST_HEAD(&amp;iobuf_arena-&gt;passive.list);</div><div class='add'>+    iobuf_arena-&gt;iobuf_pool = iobuf_pool;</div><div class='ctx'> </div><div class='del'>-struct iobuf_arena *</div><div class='del'>-__iobuf_arena_unprune (struct iobuf_pool *iobuf_pool)</div><div class='del'>-{</div><div class='del'>-        struct iobuf_arena *iobuf_arena = NULL;</div><div class='del'>-        struct iobuf_arena *tmp = NULL;</div><div class='add'>+    rounded_size = gf_iobuf_get_pagesize(page_size, &amp;index);</div><div class='ctx'> </div><div class='del'>-        list_for_each_entry (tmp, &amp;iobuf_pool-&gt;purge.list, list) {</div><div class='del'>-                list_del_init (&amp;tmp-&gt;list);</div><div class='del'>-                iobuf_arena = tmp;</div><div class='del'>-                break;</div><div class='del'>-        }</div><div class='add'>+    iobuf_arena-&gt;page_size = rounded_size;</div><div class='add'>+    iobuf_arena-&gt;page_count = num_iobufs;</div><div class='ctx'> </div><div class='del'>-        return iobuf_arena;</div><div class='del'>-}</div><div class='add'>+    iobuf_arena-&gt;arena_size = rounded_size * num_iobufs;</div><div class='ctx'> </div><div class='add'>+    iobuf_arena-&gt;mem_base = mmap(NULL, iobuf_arena-&gt;arena_size,</div><div class='add'>+                                 PROT_READ | PROT_WRITE,</div><div class='add'>+                                 MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);</div><div class='add'>+    if (iobuf_arena-&gt;mem_base == MAP_FAILED) {</div><div class='add'>+        gf_smsg(THIS-&gt;name, GF_LOG_WARNING, 0, LG_MSG_MAPPING_FAILED, NULL);</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-struct iobuf_arena *</div><div class='del'>-__iobuf_pool_add_arena (struct iobuf_pool *iobuf_pool)</div><div class='del'>-{</div><div class='del'>-        struct iobuf_arena *iobuf_arena = NULL;</div><div class='add'>+    if (iobuf_pool-&gt;rdma_registration) {</div><div class='add'>+        iobuf_pool-&gt;rdma_registration(iobuf_pool-&gt;device, iobuf_arena);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        iobuf_arena = __iobuf_arena_unprune (iobuf_pool);</div><div class='add'>+    list_add_tail(&amp;iobuf_arena-&gt;all_list, &amp;iobuf_pool-&gt;all_arenas);</div><div class='ctx'> </div><div class='del'>-        if (!iobuf_arena)</div><div class='del'>-                iobuf_arena = __iobuf_arena_alloc (iobuf_pool);</div><div class='add'>+    __iobuf_arena_init_iobufs(iobuf_arena);</div><div class='add'>+    if (!iobuf_arena-&gt;iobufs) {</div><div class='add'>+        gf_smsg(THIS-&gt;name, GF_LOG_ERROR, 0, LG_MSG_INIT_IOBUF_FAILED, NULL);</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        if (!iobuf_arena)</div><div class='del'>-                return NULL;</div><div class='add'>+    iobuf_pool-&gt;arena_cnt++;</div><div class='ctx'> </div><div class='del'>-        list_add_tail (&amp;iobuf_arena-&gt;list, &amp;iobuf_pool-&gt;arenas.list);</div><div class='add'>+    return iobuf_arena;</div><div class='ctx'> </div><div class='del'>-        return iobuf_arena;</div><div class='add'>+err:</div><div class='add'>+    __iobuf_arena_destroy(iobuf_pool, iobuf_arena);</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return NULL;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+static struct iobuf_arena *</div><div class='add'>+__iobuf_arena_unprune(struct iobuf_pool *iobuf_pool, const size_t page_size,</div><div class='add'>+                      const int index)</div><div class='add'>+{</div><div class='add'>+    struct iobuf_arena *iobuf_arena = NULL;</div><div class='add'>+    struct iobuf_arena *tmp = NULL;</div><div class='add'>+</div><div class='add'>+    GF_VALIDATE_OR_GOTO("iobuf", iobuf_pool, out);</div><div class='ctx'> </div><div class='del'>-struct iobuf_arena *</div><div class='del'>-iobuf_pool_add_arena (struct iobuf_pool *iobuf_pool)</div><div class='add'>+    list_for_each_entry(tmp, &amp;iobuf_pool-&gt;purge[index], list)</div><div class='add'>+    {</div><div class='add'>+        list_del_init(&amp;tmp-&gt;list);</div><div class='add'>+        iobuf_arena = tmp;</div><div class='add'>+        break;</div><div class='add'>+    }</div><div class='add'>+out:</div><div class='add'>+    return iobuf_arena;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static struct iobuf_arena *</div><div class='add'>+__iobuf_pool_add_arena(struct iobuf_pool *iobuf_pool, const size_t page_size,</div><div class='add'>+                       const int32_t num_pages, const int index)</div><div class='ctx'> {</div><div class='del'>-        struct iobuf_arena *iobuf_arena = NULL;</div><div class='add'>+    struct iobuf_arena *iobuf_arena = NULL;</div><div class='ctx'> </div><div class='del'>-        pthread_mutex_lock (&amp;iobuf_pool-&gt;mutex);</div><div class='del'>-        {</div><div class='del'>-                iobuf_arena = __iobuf_pool_add_arena (iobuf_pool);</div><div class='add'>+    iobuf_arena = __iobuf_arena_unprune(iobuf_pool, page_size, index);</div><div class='add'>+</div><div class='add'>+    if (!iobuf_arena) {</div><div class='add'>+        iobuf_arena = __iobuf_arena_alloc(iobuf_pool, page_size, num_pages);</div><div class='add'>+        if (!iobuf_arena) {</div><div class='add'>+            gf_smsg(THIS-&gt;name, GF_LOG_WARNING, 0, LG_MSG_ARENA_NOT_FOUND,</div><div class='add'>+                    NULL);</div><div class='add'>+            return NULL;</div><div class='ctx'>         }</div><div class='del'>-        pthread_mutex_unlock (&amp;iobuf_pool-&gt;mutex);</div><div class='add'>+    }</div><div class='add'>+    list_add(&amp;iobuf_arena-&gt;list, &amp;iobuf_pool-&gt;arenas[index]);</div><div class='ctx'> </div><div class='del'>-        return iobuf_arena;</div><div class='add'>+    return iobuf_arena;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='add'>+/* This function destroys all the iobufs and the iobuf_pool */</div><div class='ctx'> void</div><div class='del'>-iobuf_pool_destroy (struct iobuf_pool *iobuf_pool)</div><div class='add'>+iobuf_pool_destroy(struct iobuf_pool *iobuf_pool)</div><div class='ctx'> {</div><div class='del'>-        struct iobuf_arena *iobuf_arena = NULL;</div><div class='del'>-        struct iobuf_arena *tmp = NULL;</div><div class='add'>+    struct iobuf_arena *iobuf_arena = NULL;</div><div class='add'>+    struct iobuf_arena *tmp = NULL;</div><div class='add'>+    int i = 0;</div><div class='add'>+</div><div class='add'>+    GF_VALIDATE_OR_GOTO("iobuf", iobuf_pool, out);</div><div class='add'>+</div><div class='add'>+    pthread_mutex_lock(&amp;iobuf_pool-&gt;mutex);</div><div class='add'>+    {</div><div class='add'>+        for (i = 0; i &lt; IOBUF_ARENA_MAX_INDEX; i++) {</div><div class='add'>+            list_for_each_entry_safe(iobuf_arena, tmp, &amp;iobuf_pool-&gt;arenas[i],</div><div class='add'>+                                     list)</div><div class='add'>+            {</div><div class='add'>+                list_del_init(&amp;iobuf_arena-&gt;list);</div><div class='add'>+                iobuf_pool-&gt;arena_cnt--;</div><div class='ctx'> </div><div class='del'>-        if (!iobuf_pool)</div><div class='del'>-                return;</div><div class='add'>+                __iobuf_arena_destroy(iobuf_pool, iobuf_arena);</div><div class='add'>+            }</div><div class='add'>+            list_for_each_entry_safe(iobuf_arena, tmp, &amp;iobuf_pool-&gt;purge[i],</div><div class='add'>+                                     list)</div><div class='add'>+            {</div><div class='add'>+                list_del_init(&amp;iobuf_arena-&gt;list);</div><div class='add'>+                iobuf_pool-&gt;arena_cnt--;</div><div class='add'>+                __iobuf_arena_destroy(iobuf_pool, iobuf_arena);</div><div class='add'>+            }</div><div class='add'>+            /* If there are no iobuf leaks, there should be no</div><div class='add'>+             * arenas in the filled list. If at all there are any</div><div class='add'>+             * arenas in the filled list, the below function will</div><div class='add'>+             * assert.</div><div class='add'>+             */</div><div class='add'>+            list_for_each_entry_safe(iobuf_arena, tmp, &amp;iobuf_pool-&gt;filled[i],</div><div class='add'>+                                     list)</div><div class='add'>+            {</div><div class='add'>+                list_del_init(&amp;iobuf_arena-&gt;list);</div><div class='add'>+                iobuf_pool-&gt;arena_cnt--;</div><div class='add'>+                __iobuf_arena_destroy(iobuf_pool, iobuf_arena);</div><div class='add'>+            }</div><div class='add'>+            /* If there are no iobuf leaks, there shoould be</div><div class='add'>+             * no standard allocated arenas, iobuf_put will free</div><div class='add'>+             * such arenas.</div><div class='add'>+             * TODO: Free the stdalloc arenas forcefully if present?</div><div class='add'>+             */</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    pthread_mutex_unlock(&amp;iobuf_pool-&gt;mutex);</div><div class='ctx'> </div><div class='del'>-        list_for_each_entry_safe (iobuf_arena, tmp, &amp;iobuf_pool-&gt;arenas.list,</div><div class='del'>-                                  list) {</div><div class='add'>+    pthread_mutex_destroy(&amp;iobuf_pool-&gt;mutex);</div><div class='ctx'> </div><div class='del'>-                list_del_init (&amp;iobuf_arena-&gt;list);</div><div class='del'>-                iobuf_pool-&gt;arena_cnt--;</div><div class='add'>+    GF_FREE(iobuf_pool);</div><div class='ctx'> </div><div class='del'>-                __iobuf_arena_destroy (iobuf_arena);</div><div class='del'>-        }</div><div class='add'>+out:</div><div class='add'>+    return;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='del'>-struct iobuf_pool *</div><div class='del'>-iobuf_pool_new (size_t arena_size, size_t page_size)</div><div class='add'>+static void</div><div class='add'>+iobuf_create_stdalloc_arena(struct iobuf_pool *iobuf_pool)</div><div class='ctx'> {</div><div class='del'>-        struct iobuf_pool  *iobuf_pool = NULL;</div><div class='add'>+    struct iobuf_arena *iobuf_arena = NULL;</div><div class='ctx'> </div><div class='del'>-        if (arena_size &lt; page_size)</div><div class='del'>-                return NULL;</div><div class='add'>+    /* No locking required here as its called only once during init */</div><div class='add'>+    iobuf_arena = GF_CALLOC(sizeof(*iobuf_arena), 1, gf_common_mt_iobuf_arena);</div><div class='add'>+    if (!iobuf_arena)</div><div class='add'>+        goto err;</div><div class='ctx'> </div><div class='del'>-        iobuf_pool = GF_CALLOC (sizeof (*iobuf_pool), 1,</div><div class='del'>-                                gf_common_mt_iobuf_pool);</div><div class='del'>-        if (!iobuf_pool)</div><div class='del'>-                return NULL;</div><div class='add'>+    INIT_LIST_HEAD(&amp;iobuf_arena-&gt;list);</div><div class='add'>+    INIT_LIST_HEAD(&amp;iobuf_arena-&gt;active.list);</div><div class='add'>+    INIT_LIST_HEAD(&amp;iobuf_arena-&gt;passive.list);</div><div class='ctx'> </div><div class='del'>-        pthread_mutex_init (&amp;iobuf_pool-&gt;mutex, NULL);</div><div class='del'>-        INIT_LIST_HEAD (&amp;iobuf_pool-&gt;arenas.list);</div><div class='del'>-        INIT_LIST_HEAD (&amp;iobuf_pool-&gt;filled.list);</div><div class='del'>-        INIT_LIST_HEAD (&amp;iobuf_pool-&gt;purge.list);</div><div class='add'>+    iobuf_arena-&gt;iobuf_pool = iobuf_pool;</div><div class='ctx'> </div><div class='del'>-        iobuf_pool-&gt;arena_size = arena_size;</div><div class='del'>-        iobuf_pool-&gt;page_size  = page_size;</div><div class='add'>+    iobuf_arena-&gt;page_size = 0x7fffffff;</div><div class='ctx'> </div><div class='del'>-        iobuf_pool_add_arena (iobuf_pool);</div><div class='add'>+    list_add_tail(&amp;iobuf_arena-&gt;list,</div><div class='add'>+                  &amp;iobuf_pool-&gt;arenas[IOBUF_ARENA_MAX_INDEX]);</div><div class='ctx'> </div><div class='del'>-        return iobuf_pool;</div><div class='add'>+err:</div><div class='add'>+    return;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='del'>-void</div><div class='del'>-__iobuf_pool_prune (struct iobuf_pool *iobuf_pool)</div><div class='add'>+struct iobuf_pool *</div><div class='add'>+iobuf_pool_new(void)</div><div class='ctx'> {</div><div class='del'>-        struct iobuf_arena *iobuf_arena = NULL;</div><div class='del'>-        struct iobuf_arena *tmp = NULL;</div><div class='add'>+    struct iobuf_pool *iobuf_pool = NULL;</div><div class='add'>+    int i = 0;</div><div class='add'>+    size_t page_size = 0;</div><div class='add'>+    size_t arena_size = 0;</div><div class='add'>+    int32_t num_pages = 0;</div><div class='add'>+</div><div class='add'>+    iobuf_pool = GF_CALLOC(sizeof(*iobuf_pool), 1, gf_common_mt_iobuf_pool);</div><div class='add'>+    if (!iobuf_pool)</div><div class='add'>+        goto out;</div><div class='add'>+    INIT_LIST_HEAD(&amp;iobuf_pool-&gt;all_arenas);</div><div class='add'>+    pthread_mutex_init(&amp;iobuf_pool-&gt;mutex, NULL);</div><div class='add'>+    for (i = 0; i &lt;= IOBUF_ARENA_MAX_INDEX; i++) {</div><div class='add'>+        INIT_LIST_HEAD(&amp;iobuf_pool-&gt;arenas[i]);</div><div class='add'>+        INIT_LIST_HEAD(&amp;iobuf_pool-&gt;filled[i]);</div><div class='add'>+        INIT_LIST_HEAD(&amp;iobuf_pool-&gt;purge[i]);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    iobuf_pool-&gt;default_page_size = 128 * GF_UNIT_KB;</div><div class='add'>+</div><div class='add'>+    iobuf_pool-&gt;rdma_registration = NULL;</div><div class='add'>+    iobuf_pool-&gt;rdma_deregistration = NULL;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; GF_RDMA_DEVICE_COUNT; i++) {</div><div class='add'>+        iobuf_pool-&gt;device[i] = NULL;</div><div class='add'>+        iobuf_pool-&gt;mr_list[i] = NULL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* No locking required here</div><div class='add'>+     * as no one else can use this pool yet</div><div class='add'>+     */</div><div class='add'>+    for (i = 0; i &lt; IOBUF_ARENA_MAX_INDEX; i++) {</div><div class='add'>+        page_size = gf_iobuf_init_config[i].pagesize;</div><div class='add'>+        num_pages = gf_iobuf_init_config[i].num_pages;</div><div class='add'>+</div><div class='add'>+        if (__iobuf_pool_add_arena(iobuf_pool, page_size, num_pages, i) != NULL)</div><div class='add'>+            arena_size += page_size * num_pages;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Need an arena to handle all the bigger iobuf requests */</div><div class='add'>+    iobuf_create_stdalloc_arena(iobuf_pool);</div><div class='add'>+</div><div class='add'>+    iobuf_pool-&gt;arena_size = arena_size;</div><div class='add'>+out:</div><div class='ctx'> </div><div class='del'>-        if (list_empty (&amp;iobuf_pool-&gt;arenas.list))</div><div class='del'>-                /* buffering - preserve this one arena (if at all)</div><div class='del'>-                   for __iobuf_arena_unprune */</div><div class='del'>-                return;</div><div class='add'>+    return iobuf_pool;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        list_for_each_entry_safe (iobuf_arena, tmp, &amp;iobuf_pool-&gt;purge.list,</div><div class='del'>-                                  list) {</div><div class='del'>-                if (iobuf_arena-&gt;active_cnt)</div><div class='del'>-                        continue;</div><div class='add'>+static void</div><div class='add'>+__iobuf_arena_prune(struct iobuf_pool *iobuf_pool,</div><div class='add'>+                    struct iobuf_arena *iobuf_arena, const int index)</div><div class='add'>+{</div><div class='add'>+    /* code flow comes here only if the arena is in purge list and we can</div><div class='add'>+     * free the arena only if we have at least one arena in 'arenas' list</div><div class='add'>+     * (ie, at least few iobufs free in arena), that way, there won't</div><div class='add'>+     * be spurious mmap/unmap of buffers</div><div class='add'>+     */</div><div class='add'>+    if (list_empty(&amp;iobuf_pool-&gt;arenas[index]))</div><div class='add'>+        goto out;</div><div class='ctx'> </div><div class='del'>-                list_del_init (&amp;iobuf_arena-&gt;list);</div><div class='del'>-                iobuf_pool-&gt;arena_cnt--;</div><div class='add'>+    /* All cases matched, destroy */</div><div class='add'>+    list_del_init(&amp;iobuf_arena-&gt;list);</div><div class='add'>+    list_del_init(&amp;iobuf_arena-&gt;all_list);</div><div class='add'>+    iobuf_pool-&gt;arena_cnt--;</div><div class='ctx'> </div><div class='del'>-                __iobuf_arena_destroy (iobuf_arena);</div><div class='del'>-        }</div><div class='del'>-}</div><div class='add'>+    __iobuf_arena_destroy(iobuf_pool, iobuf_arena);</div><div class='ctx'> </div><div class='add'>+out:</div><div class='add'>+    return;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> void</div><div class='del'>-iobuf_pool_prune (struct iobuf_pool *iobuf_pool)</div><div class='add'>+iobuf_pool_prune(struct iobuf_pool *iobuf_pool)</div><div class='ctx'> {</div><div class='del'>-        pthread_mutex_lock (&amp;iobuf_pool-&gt;mutex);</div><div class='del'>-        {</div><div class='del'>-                __iobuf_pool_prune (iobuf_pool);</div><div class='add'>+    struct iobuf_arena *iobuf_arena = NULL;</div><div class='add'>+    struct iobuf_arena *tmp = NULL;</div><div class='add'>+    int i = 0;</div><div class='add'>+</div><div class='add'>+    GF_VALIDATE_OR_GOTO("iobuf", iobuf_pool, out);</div><div class='add'>+</div><div class='add'>+    pthread_mutex_lock(&amp;iobuf_pool-&gt;mutex);</div><div class='add'>+    {</div><div class='add'>+        for (i = 0; i &lt; IOBUF_ARENA_MAX_INDEX; i++) {</div><div class='add'>+            if (list_empty(&amp;iobuf_pool-&gt;arenas[i])) {</div><div class='add'>+                continue;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            list_for_each_entry_safe(iobuf_arena, tmp, &amp;iobuf_pool-&gt;purge[i],</div><div class='add'>+                                     list)</div><div class='add'>+            {</div><div class='add'>+                __iobuf_arena_prune(iobuf_pool, iobuf_arena, i);</div><div class='add'>+            }</div><div class='ctx'>         }</div><div class='del'>-        pthread_mutex_unlock (&amp;iobuf_pool-&gt;mutex);</div><div class='del'>-}</div><div class='add'>+    }</div><div class='add'>+    pthread_mutex_unlock(&amp;iobuf_pool-&gt;mutex);</div><div class='ctx'> </div><div class='add'>+out:</div><div class='add'>+    return;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-struct iobuf_arena *</div><div class='del'>-__iobuf_select_arena (struct iobuf_pool *iobuf_pool)</div><div class='add'>+/* Always called under the iobuf_pool mutex lock */</div><div class='add'>+static struct iobuf_arena *</div><div class='add'>+__iobuf_select_arena(struct iobuf_pool *iobuf_pool, const size_t page_size,</div><div class='add'>+                     const int index)</div><div class='ctx'> {</div><div class='del'>-        struct iobuf_arena *iobuf_arena = NULL;</div><div class='del'>-        struct iobuf_arena *trav = NULL;</div><div class='del'>-</div><div class='del'>-        /* look for unused iobuf from the head-most arena */</div><div class='del'>-        list_for_each_entry (trav, &amp;iobuf_pool-&gt;arenas.list, list) {</div><div class='del'>-                if (trav-&gt;passive_cnt) {</div><div class='del'>-                        iobuf_arena = trav;</div><div class='del'>-                        break;</div><div class='del'>-                }</div><div class='add'>+    struct iobuf_arena *iobuf_arena = NULL;</div><div class='add'>+    struct iobuf_arena *trav = NULL;</div><div class='add'>+</div><div class='add'>+    /* look for unused iobuf from the head-most arena */</div><div class='add'>+    list_for_each_entry(trav, &amp;iobuf_pool-&gt;arenas[index], list)</div><div class='add'>+    {</div><div class='add'>+        if (trav-&gt;passive_cnt) {</div><div class='add'>+            iobuf_arena = trav;</div><div class='add'>+            break;</div><div class='ctx'>         }</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        if (!iobuf_arena) {</div><div class='del'>-                /* all arenas were full */</div><div class='del'>-                iobuf_arena = __iobuf_pool_add_arena (iobuf_pool);</div><div class='del'>-        }</div><div class='add'>+    if (!iobuf_arena) {</div><div class='add'>+        /* all arenas were full, find the right count to add */</div><div class='add'>+        iobuf_arena = __iobuf_pool_add_arena(</div><div class='add'>+            iobuf_pool, page_size, gf_iobuf_init_config[index].num_pages,</div><div class='add'>+            index);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        return iobuf_arena;</div><div class='add'>+    return iobuf_arena;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='del'>-struct iobuf *</div><div class='del'>-__iobuf_ref (struct iobuf *iobuf)</div><div class='add'>+/* Always called under the iobuf_pool mutex lock */</div><div class='add'>+static struct iobuf *</div><div class='add'>+__iobuf_get(struct iobuf_pool *iobuf_pool, const size_t page_size,</div><div class='add'>+            const int index)</div><div class='ctx'> {</div><div class='del'>-        iobuf-&gt;ref++;</div><div class='add'>+    struct iobuf *iobuf = NULL;</div><div class='add'>+    struct iobuf_arena *iobuf_arena = NULL;</div><div class='ctx'> </div><div class='del'>-        return iobuf;</div><div class='del'>-}</div><div class='add'>+    /* most eligible arena for picking an iobuf */</div><div class='add'>+    iobuf_arena = __iobuf_select_arena(iobuf_pool, page_size, index);</div><div class='add'>+    if (!iobuf_arena)</div><div class='add'>+        return NULL;</div><div class='ctx'> </div><div class='add'>+    list_for_each_entry(iobuf, &amp;iobuf_arena-&gt;passive.list, list) break;</div><div class='ctx'> </div><div class='del'>-struct iobuf *</div><div class='del'>-__iobuf_unref (struct iobuf *iobuf)</div><div class='del'>-{</div><div class='del'>-        iobuf-&gt;ref--;</div><div class='add'>+    list_del(&amp;iobuf-&gt;list);</div><div class='add'>+    iobuf_arena-&gt;passive_cnt--;</div><div class='ctx'> </div><div class='del'>-        return iobuf;</div><div class='del'>-}</div><div class='add'>+    list_add(&amp;iobuf-&gt;list, &amp;iobuf_arena-&gt;active.list);</div><div class='add'>+    iobuf_arena-&gt;active_cnt++;</div><div class='ctx'> </div><div class='add'>+    /* no resetting requied for this element */</div><div class='add'>+    iobuf_arena-&gt;alloc_cnt++;</div><div class='ctx'> </div><div class='del'>-struct iobuf *</div><div class='del'>-__iobuf_get (struct iobuf_arena *iobuf_arena)</div><div class='del'>-{</div><div class='del'>-        struct iobuf      *iobuf = NULL;</div><div class='del'>-        struct iobuf_pool *iobuf_pool = NULL;</div><div class='add'>+    if (iobuf_arena-&gt;max_active &lt; iobuf_arena-&gt;active_cnt)</div><div class='add'>+        iobuf_arena-&gt;max_active = iobuf_arena-&gt;active_cnt;</div><div class='ctx'> </div><div class='del'>-        iobuf_pool = iobuf_arena-&gt;iobuf_pool;</div><div class='add'>+    if (iobuf_arena-&gt;passive_cnt == 0) {</div><div class='add'>+        list_del(&amp;iobuf_arena-&gt;list);</div><div class='add'>+        list_add(&amp;iobuf_arena-&gt;list, &amp;iobuf_pool-&gt;filled[index]);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        list_for_each_entry (iobuf, &amp;iobuf_arena-&gt;passive.list, list)</div><div class='del'>-                break;</div><div class='add'>+    return iobuf;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        list_del (&amp;iobuf-&gt;list);</div><div class='del'>-        iobuf_arena-&gt;passive_cnt--;</div><div class='add'>+static struct iobuf *</div><div class='add'>+iobuf_get_from_stdalloc(struct iobuf_pool *iobuf_pool, const size_t page_size)</div><div class='add'>+{</div><div class='add'>+    struct iobuf *iobuf = NULL;</div><div class='add'>+    struct iobuf_arena *iobuf_arena = NULL;</div><div class='add'>+    struct iobuf_arena *trav = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    /* The first arena in the 'MAX-INDEX' will always be used for misc */</div><div class='add'>+    list_for_each_entry(trav, &amp;iobuf_pool-&gt;arenas[IOBUF_ARENA_MAX_INDEX], list)</div><div class='add'>+    {</div><div class='add'>+        iobuf_arena = trav;</div><div class='add'>+        break;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    iobuf = GF_CALLOC(1, sizeof(*iobuf), gf_common_mt_iobuf);</div><div class='add'>+    if (!iobuf)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    /* 4096 is the alignment */</div><div class='add'>+    iobuf-&gt;free_ptr = GF_CALLOC(1, ((page_size + GF_IOBUF_ALIGN_SIZE) - 1),</div><div class='add'>+                                gf_common_mt_char);</div><div class='add'>+    if (!iobuf-&gt;free_ptr)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    iobuf-&gt;ptr = GF_ALIGN_BUF(iobuf-&gt;free_ptr, GF_IOBUF_ALIGN_SIZE);</div><div class='add'>+    iobuf-&gt;iobuf_arena = iobuf_arena;</div><div class='add'>+    LOCK_INIT(&amp;iobuf-&gt;lock);</div><div class='add'>+</div><div class='add'>+    /* Hold a ref because you are allocating and using it */</div><div class='add'>+    GF_ATOMIC_INIT(iobuf-&gt;ref, 1);</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+out:</div><div class='add'>+    if (ret &amp;&amp; iobuf) {</div><div class='add'>+        GF_FREE(iobuf-&gt;free_ptr);</div><div class='add'>+        GF_FREE(iobuf);</div><div class='add'>+        iobuf = NULL;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        list_add (&amp;iobuf-&gt;list, &amp;iobuf_arena-&gt;active.list);</div><div class='del'>-        iobuf_arena-&gt;active_cnt++;</div><div class='add'>+    return iobuf;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        if (iobuf_arena-&gt;passive_cnt == 0) {</div><div class='del'>-                list_del (&amp;iobuf_arena-&gt;list);</div><div class='del'>-                list_add (&amp;iobuf_arena-&gt;list, &amp;iobuf_pool-&gt;filled.list);</div><div class='add'>+struct iobuf *</div><div class='add'>+iobuf_get2(struct iobuf_pool *iobuf_pool, size_t page_size)</div><div class='add'>+{</div><div class='add'>+    struct iobuf *iobuf = NULL;</div><div class='add'>+    size_t rounded_size = 0;</div><div class='add'>+    int index = 0;</div><div class='add'>+</div><div class='add'>+    if (page_size == 0) {</div><div class='add'>+        page_size = iobuf_pool-&gt;default_page_size;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    rounded_size = gf_iobuf_get_pagesize(page_size, &amp;index);</div><div class='add'>+    if (rounded_size == -1) {</div><div class='add'>+        /* make sure to provide the requested buffer with standard</div><div class='add'>+           memory allocations */</div><div class='add'>+        iobuf = iobuf_get_from_stdalloc(iobuf_pool, page_size);</div><div class='add'>+</div><div class='add'>+        gf_msg_debug("iobuf", 0,</div><div class='add'>+                     "request for iobuf of size %zu "</div><div class='add'>+                     "is serviced using standard calloc() (%p) as it "</div><div class='add'>+                     "exceeds the maximum available buffer size",</div><div class='add'>+                     page_size, iobuf);</div><div class='add'>+</div><div class='add'>+        iobuf_pool-&gt;request_misses++;</div><div class='add'>+        return iobuf;</div><div class='add'>+    } else if (index == -1) {</div><div class='add'>+        gf_smsg("iobuf", GF_LOG_ERROR, 0, LG_MSG_PAGE_SIZE_EXCEEDED,</div><div class='add'>+                "page_size=%zu", page_size, NULL);</div><div class='add'>+        return NULL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    pthread_mutex_lock(&amp;iobuf_pool-&gt;mutex);</div><div class='add'>+    {</div><div class='add'>+        iobuf = __iobuf_get(iobuf_pool, rounded_size, index);</div><div class='add'>+        if (!iobuf) {</div><div class='add'>+            pthread_mutex_unlock(&amp;iobuf_pool-&gt;mutex);</div><div class='add'>+            gf_smsg(THIS-&gt;name, GF_LOG_WARNING, 0, LG_MSG_IOBUF_NOT_FOUND,</div><div class='add'>+                    NULL);</div><div class='add'>+            goto post_unlock;</div><div class='ctx'>         }</div><div class='ctx'> </div><div class='del'>-        return iobuf;</div><div class='add'>+        iobuf_ref(iobuf);</div><div class='add'>+    }</div><div class='add'>+    pthread_mutex_unlock(&amp;iobuf_pool-&gt;mutex);</div><div class='add'>+post_unlock:</div><div class='add'>+    return iobuf;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> struct iobuf *</div><div class='del'>-iobuf_get (struct iobuf_pool *iobuf_pool)</div><div class='add'>+iobuf_get_page_aligned(struct iobuf_pool *iobuf_pool, size_t page_size,</div><div class='add'>+                       size_t align_size)</div><div class='ctx'> {</div><div class='del'>-        struct iobuf       *iobuf = NULL;</div><div class='del'>-        struct iobuf_arena *iobuf_arena = NULL;</div><div class='del'>-</div><div class='del'>-        pthread_mutex_lock (&amp;iobuf_pool-&gt;mutex);</div><div class='del'>-        {</div><div class='del'>-                /* most eligible arena for picking an iobuf */</div><div class='del'>-                iobuf_arena = __iobuf_select_arena (iobuf_pool);</div><div class='del'>-                if (!iobuf_arena)</div><div class='del'>-                        goto unlock;</div><div class='add'>+    size_t req_size = 0;</div><div class='add'>+    struct iobuf *iobuf = NULL;</div><div class='ctx'> </div><div class='del'>-                iobuf = __iobuf_get (iobuf_arena);</div><div class='del'>-                if (!iobuf)</div><div class='del'>-                        goto unlock;</div><div class='add'>+    req_size = page_size;</div><div class='ctx'> </div><div class='del'>-                __iobuf_ref (iobuf);</div><div class='del'>-        }</div><div class='del'>-unlock:</div><div class='del'>-        pthread_mutex_unlock (&amp;iobuf_pool-&gt;mutex);</div><div class='add'>+    if (req_size == 0) {</div><div class='add'>+        req_size = iobuf_pool-&gt;default_page_size;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        return iobuf;</div><div class='add'>+    iobuf = iobuf_get2(iobuf_pool, req_size + align_size);</div><div class='add'>+    if (!iobuf)</div><div class='add'>+        return NULL;</div><div class='add'>+    /* If std allocation was used, then free_ptr will be non-NULL. In this</div><div class='add'>+     * case, we do not want to modify the original free_ptr.</div><div class='add'>+     * On the other hand, if the buf was gotten through the available</div><div class='add'>+     * arenas, then we use iobuf-&gt;free_ptr to store the original</div><div class='add'>+     * pointer to the offset into the mmap'd block of memory and in turn</div><div class='add'>+     * reuse iobuf-&gt;ptr to hold the page-aligned address. And finally, in</div><div class='add'>+     * iobuf_put(), we copy iobuf-&gt;free_ptr into iobuf-&gt;ptr - back to where</div><div class='add'>+     * it was originally when __iobuf_get() returned this iobuf.</div><div class='add'>+     */</div><div class='add'>+    if (!iobuf-&gt;free_ptr)</div><div class='add'>+        iobuf-&gt;free_ptr = iobuf-&gt;ptr;</div><div class='add'>+    iobuf-&gt;ptr = GF_ALIGN_BUF(iobuf-&gt;ptr, align_size);</div><div class='add'>+</div><div class='add'>+    return iobuf;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='del'>-void</div><div class='del'>-__iobuf_put (struct iobuf *iobuf, struct iobuf_arena *iobuf_arena)</div><div class='add'>+struct iobuf *</div><div class='add'>+iobuf_get(struct iobuf_pool *iobuf_pool)</div><div class='ctx'> {</div><div class='del'>-        struct iobuf_pool *iobuf_pool = NULL;</div><div class='add'>+    struct iobuf *iobuf = NULL;</div><div class='add'>+    int index = 0;</div><div class='ctx'> </div><div class='del'>-        iobuf_pool = iobuf_arena-&gt;iobuf_pool;</div><div class='add'>+    GF_VALIDATE_OR_GOTO("iobuf", iobuf_pool, out);</div><div class='ctx'> </div><div class='del'>-        if (iobuf_arena-&gt;passive_cnt == 0) {</div><div class='del'>-                list_del (&amp;iobuf_arena-&gt;list);</div><div class='del'>-                list_add_tail (&amp;iobuf_arena-&gt;list, &amp;iobuf_pool-&gt;arenas.list);</div><div class='add'>+    index = gf_iobuf_get_arena_index(iobuf_pool-&gt;default_page_size);</div><div class='add'>+    if (index == -1) {</div><div class='add'>+        gf_smsg("iobuf", GF_LOG_ERROR, 0, LG_MSG_PAGE_SIZE_EXCEEDED,</div><div class='add'>+                "page_size=%zu", iobuf_pool-&gt;default_page_size, NULL);</div><div class='add'>+        return NULL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    pthread_mutex_lock(&amp;iobuf_pool-&gt;mutex);</div><div class='add'>+    {</div><div class='add'>+        iobuf = __iobuf_get(iobuf_pool, iobuf_pool-&gt;default_page_size, index);</div><div class='add'>+        if (!iobuf) {</div><div class='add'>+            pthread_mutex_unlock(&amp;iobuf_pool-&gt;mutex);</div><div class='add'>+            gf_smsg(THIS-&gt;name, GF_LOG_WARNING, 0, LG_MSG_IOBUF_NOT_FOUND,</div><div class='add'>+                    NULL);</div><div class='add'>+            goto out;</div><div class='ctx'>         }</div><div class='ctx'> </div><div class='del'>-        list_del_init (&amp;iobuf-&gt;list);</div><div class='del'>-        iobuf_arena-&gt;active_cnt--;</div><div class='add'>+        iobuf_ref(iobuf);</div><div class='add'>+    }</div><div class='add'>+    pthread_mutex_unlock(&amp;iobuf_pool-&gt;mutex);</div><div class='ctx'> </div><div class='del'>-        list_add (&amp;iobuf-&gt;list, &amp;iobuf_arena-&gt;passive.list);</div><div class='del'>-        iobuf_arena-&gt;passive_cnt++;</div><div class='del'>-</div><div class='del'>-        if (iobuf_arena-&gt;active_cnt == 0) {</div><div class='del'>-                list_del (&amp;iobuf_arena-&gt;list);</div><div class='del'>-                list_add_tail (&amp;iobuf_arena-&gt;list, &amp;iobuf_pool-&gt;purge.list);</div><div class='del'>-        }</div><div class='add'>+out:</div><div class='add'>+    return iobuf;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+static void</div><div class='add'>+__iobuf_put(struct iobuf *iobuf, struct iobuf_arena *iobuf_arena)</div><div class='add'>+{</div><div class='add'>+    struct iobuf_pool *iobuf_pool = NULL;</div><div class='add'>+    int index = 0;</div><div class='add'>+</div><div class='add'>+    iobuf_pool = iobuf_arena-&gt;iobuf_pool;</div><div class='add'>+</div><div class='add'>+    index = gf_iobuf_get_arena_index(iobuf_arena-&gt;page_size);</div><div class='add'>+    if (index == -1) {</div><div class='add'>+        gf_msg_debug("iobuf", 0,</div><div class='add'>+                     "freeing the iobuf (%p) "</div><div class='add'>+                     "allocated with standard calloc()",</div><div class='add'>+                     iobuf);</div><div class='add'>+</div><div class='add'>+        /* free up properly without bothering about lists and all */</div><div class='add'>+        LOCK_DESTROY(&amp;iobuf-&gt;lock);</div><div class='add'>+        GF_FREE(iobuf-&gt;free_ptr);</div><div class='add'>+        GF_FREE(iobuf);</div><div class='add'>+        return;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (iobuf_arena-&gt;passive_cnt == 0) {</div><div class='add'>+        list_del(&amp;iobuf_arena-&gt;list);</div><div class='add'>+        list_add_tail(&amp;iobuf_arena-&gt;list, &amp;iobuf_pool-&gt;arenas[index]);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    list_del_init(&amp;iobuf-&gt;list);</div><div class='add'>+    iobuf_arena-&gt;active_cnt--;</div><div class='add'>+</div><div class='add'>+    if (iobuf-&gt;free_ptr) {</div><div class='add'>+        iobuf-&gt;ptr = iobuf-&gt;free_ptr;</div><div class='add'>+        iobuf-&gt;free_ptr = NULL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    list_add(&amp;iobuf-&gt;list, &amp;iobuf_arena-&gt;passive.list);</div><div class='add'>+    iobuf_arena-&gt;passive_cnt++;</div><div class='add'>+</div><div class='add'>+    if (iobuf_arena-&gt;active_cnt == 0) {</div><div class='add'>+        list_del(&amp;iobuf_arena-&gt;list);</div><div class='add'>+        list_add_tail(&amp;iobuf_arena-&gt;list, &amp;iobuf_pool-&gt;purge[index]);</div><div class='add'>+        GF_VALIDATE_OR_GOTO("iobuf", iobuf_pool, out);</div><div class='add'>+        __iobuf_arena_prune(iobuf_pool, iobuf_arena, index);</div><div class='add'>+    }</div><div class='add'>+out:</div><div class='add'>+    return;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> void</div><div class='del'>-iobuf_put (struct iobuf *iobuf)</div><div class='add'>+iobuf_put(struct iobuf *iobuf)</div><div class='ctx'> {</div><div class='del'>-        struct iobuf_arena *iobuf_arena = NULL;</div><div class='del'>-        struct iobuf_pool  *iobuf_pool = NULL;</div><div class='add'>+    struct iobuf_arena *iobuf_arena = NULL;</div><div class='add'>+    struct iobuf_pool *iobuf_pool = NULL;</div><div class='ctx'> </div><div class='del'>-        if (!iobuf)</div><div class='del'>-                return;</div><div class='add'>+    GF_VALIDATE_OR_GOTO("iobuf", iobuf, out);</div><div class='ctx'> </div><div class='del'>-        iobuf_arena = iobuf-&gt;iobuf_arena;</div><div class='del'>-        if (!iobuf_arena)</div><div class='del'>-                return;</div><div class='add'>+    iobuf_arena = iobuf-&gt;iobuf_arena;</div><div class='add'>+    if (!iobuf_arena) {</div><div class='add'>+        gf_smsg(THIS-&gt;name, GF_LOG_WARNING, 0, LG_MSG_ARENA_NOT_FOUND, NULL);</div><div class='add'>+        return;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        iobuf_pool = iobuf_arena-&gt;iobuf_pool;</div><div class='del'>-        if (!iobuf_pool)</div><div class='del'>-                return;</div><div class='add'>+    iobuf_pool = iobuf_arena-&gt;iobuf_pool;</div><div class='add'>+    if (!iobuf_pool) {</div><div class='add'>+        gf_smsg(THIS-&gt;name, GF_LOG_WARNING, 0, LG_MSG_POOL_NOT_FOUND, "iobuf",</div><div class='add'>+                NULL);</div><div class='add'>+        return;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        pthread_mutex_lock (&amp;iobuf_pool-&gt;mutex);</div><div class='del'>-        {</div><div class='del'>-                __iobuf_put (iobuf, iobuf_arena);</div><div class='del'>-        }</div><div class='del'>-        pthread_mutex_unlock (&amp;iobuf_pool-&gt;mutex);</div><div class='add'>+    pthread_mutex_lock(&amp;iobuf_pool-&gt;mutex);</div><div class='add'>+    {</div><div class='add'>+        __iobuf_put(iobuf, iobuf_arena);</div><div class='add'>+    }</div><div class='add'>+    pthread_mutex_unlock(&amp;iobuf_pool-&gt;mutex);</div><div class='ctx'> </div><div class='del'>-        iobuf_pool_prune (iobuf_pool);</div><div class='add'>+out:</div><div class='add'>+    return;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> void</div><div class='del'>-iobuf_unref (struct iobuf *iobuf)</div><div class='add'>+iobuf_unref(struct iobuf *iobuf)</div><div class='ctx'> {</div><div class='del'>-        int  ref = 0;</div><div class='add'>+    int ref = 0;</div><div class='ctx'> </div><div class='del'>-        if (!iobuf)</div><div class='del'>-                return;</div><div class='add'>+    GF_VALIDATE_OR_GOTO("iobuf", iobuf, out);</div><div class='ctx'> </div><div class='del'>-        LOCK (&amp;iobuf-&gt;lock);</div><div class='del'>-        {</div><div class='del'>-                __iobuf_unref (iobuf);</div><div class='del'>-                ref = iobuf-&gt;ref;</div><div class='del'>-        }</div><div class='del'>-        UNLOCK (&amp;iobuf-&gt;lock);</div><div class='add'>+    ref = GF_ATOMIC_DEC(iobuf-&gt;ref);</div><div class='ctx'> </div><div class='del'>-        if (!ref)</div><div class='del'>-                iobuf_put (iobuf);</div><div class='del'>-}</div><div class='add'>+    if (!ref)</div><div class='add'>+        iobuf_put(iobuf);</div><div class='ctx'> </div><div class='add'>+out:</div><div class='add'>+    return;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> struct iobuf *</div><div class='del'>-iobuf_ref (struct iobuf *iobuf)</div><div class='add'>+iobuf_ref(struct iobuf *iobuf)</div><div class='ctx'> {</div><div class='del'>-        if (!iobuf)</div><div class='del'>-                return NULL;</div><div class='del'>-</div><div class='del'>-        LOCK (&amp;iobuf-&gt;lock);</div><div class='del'>-        {</div><div class='del'>-                __iobuf_ref (iobuf);</div><div class='del'>-        }</div><div class='del'>-        UNLOCK (&amp;iobuf-&gt;lock);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("iobuf", iobuf, out);</div><div class='add'>+    GF_ATOMIC_INC(iobuf-&gt;ref);</div><div class='ctx'> </div><div class='del'>-        return iobuf;</div><div class='add'>+out:</div><div class='add'>+    return iobuf;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> struct iobref *</div><div class='del'>-iobref_new ()</div><div class='add'>+iobref_new()</div><div class='ctx'> {</div><div class='del'>-        struct iobref *iobref = NULL;</div><div class='add'>+    struct iobref *iobref = NULL;</div><div class='ctx'> </div><div class='del'>-        iobref = GF_CALLOC (sizeof (*iobref), 1,</div><div class='del'>-                            gf_common_mt_iobref);</div><div class='del'>-        if (!iobref)</div><div class='del'>-                return NULL;</div><div class='add'>+    iobref = GF_MALLOC(sizeof(*iobref), gf_common_mt_iobref);</div><div class='add'>+    if (!iobref)</div><div class='add'>+        return NULL;</div><div class='ctx'> </div><div class='del'>-        LOCK_INIT (&amp;iobref-&gt;lock);</div><div class='add'>+    iobref-&gt;iobrefs = GF_CALLOC(sizeof(*iobref-&gt;iobrefs), 16,</div><div class='add'>+                                gf_common_mt_iobrefs);</div><div class='add'>+    if (!iobref-&gt;iobrefs) {</div><div class='add'>+        GF_FREE(iobref);</div><div class='add'>+        return NULL;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        iobref-&gt;ref++;</div><div class='add'>+    iobref-&gt;allocated = 16;</div><div class='add'>+    iobref-&gt;used = 0;</div><div class='ctx'> </div><div class='del'>-        return iobref;</div><div class='del'>-}</div><div class='add'>+    LOCK_INIT(&amp;iobref-&gt;lock);</div><div class='ctx'> </div><div class='add'>+    GF_ATOMIC_INIT(iobref-&gt;ref, 1);</div><div class='add'>+    return iobref;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> struct iobref *</div><div class='del'>-iobref_ref (struct iobref *iobref)</div><div class='add'>+iobref_ref(struct iobref *iobref)</div><div class='ctx'> {</div><div class='del'>-        if (!iobref)</div><div class='del'>-                return NULL;</div><div class='del'>-</div><div class='del'>-        LOCK (&amp;iobref-&gt;lock);</div><div class='del'>-        {</div><div class='del'>-                iobref-&gt;ref++;</div><div class='del'>-        }</div><div class='del'>-        UNLOCK (&amp;iobref-&gt;lock);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("iobuf", iobref, out);</div><div class='add'>+    GF_ATOMIC_INC(iobref-&gt;ref);</div><div class='ctx'> </div><div class='del'>-        return iobref;</div><div class='add'>+out:</div><div class='add'>+    return iobref;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> void</div><div class='del'>-iobref_destroy (struct iobref *iobref)</div><div class='add'>+iobref_destroy(struct iobref *iobref)</div><div class='ctx'> {</div><div class='del'>-        int            i = 0;</div><div class='del'>-        struct iobuf  *iobuf = NULL;</div><div class='add'>+    int i = 0;</div><div class='add'>+    struct iobuf *iobuf = NULL;</div><div class='ctx'> </div><div class='del'>-        if (!iobref)</div><div class='del'>-                return;</div><div class='add'>+    GF_VALIDATE_OR_GOTO("iobuf", iobref, out);</div><div class='ctx'> </div><div class='del'>-        for (i = 0; i &lt; 8; i++) {</div><div class='del'>-                iobuf = iobref-&gt;iobrefs[i];</div><div class='add'>+    for (i = 0; i &lt; iobref-&gt;allocated; i++) {</div><div class='add'>+        iobuf = iobref-&gt;iobrefs[i];</div><div class='ctx'> </div><div class='del'>-                iobref-&gt;iobrefs[i] = NULL;</div><div class='del'>-                if (iobuf)</div><div class='del'>-                        iobuf_unref (iobuf);</div><div class='del'>-        }</div><div class='add'>+        iobref-&gt;iobrefs[i] = NULL;</div><div class='add'>+        if (iobuf)</div><div class='add'>+            iobuf_unref(iobuf);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        GF_FREE (iobref);</div><div class='del'>-}</div><div class='add'>+    GF_FREE(iobref-&gt;iobrefs);</div><div class='add'>+    GF_FREE(iobref);</div><div class='ctx'> </div><div class='add'>+out:</div><div class='add'>+    return;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> void</div><div class='del'>-iobref_unref (struct iobref *iobref)</div><div class='add'>+iobref_unref(struct iobref *iobref)</div><div class='ctx'> {</div><div class='del'>-        int ref = 0;</div><div class='add'>+    int ref = 0;</div><div class='ctx'> </div><div class='del'>-        if (!iobref)</div><div class='del'>-                return;</div><div class='add'>+    GF_VALIDATE_OR_GOTO("iobuf", iobref, out);</div><div class='add'>+    ref = GF_ATOMIC_DEC(iobref-&gt;ref);</div><div class='ctx'> </div><div class='del'>-        LOCK (&amp;iobref-&gt;lock);</div><div class='del'>-        {</div><div class='del'>-                ref = (--iobref-&gt;ref);</div><div class='del'>-        }</div><div class='del'>-        UNLOCK (&amp;iobref-&gt;lock);</div><div class='add'>+    if (!ref)</div><div class='add'>+        iobref_destroy(iobref);</div><div class='ctx'> </div><div class='del'>-        if (!ref)</div><div class='del'>-                iobref_destroy (iobref);</div><div class='add'>+out:</div><div class='add'>+    return;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-__iobref_add (struct iobref *iobref, struct iobuf *iobuf)</div><div class='add'>+void</div><div class='add'>+iobref_clear(struct iobref *iobref)</div><div class='ctx'> {</div><div class='del'>-        int  i = 0;</div><div class='del'>-        int  ret = -ENOMEM;</div><div class='add'>+    int i = 0;</div><div class='add'>+</div><div class='add'>+    GF_VALIDATE_OR_GOTO("iobuf", iobref, out);</div><div class='ctx'> </div><div class='del'>-        for (i = 0; i &lt; 8; i++) {</div><div class='del'>-                if (iobref-&gt;iobrefs[i] == NULL) {</div><div class='del'>-                        iobref-&gt;iobrefs[i] = iobuf_ref (iobuf);</div><div class='del'>-                        ret = 0;</div><div class='del'>-                        break;</div><div class='del'>-                }</div><div class='add'>+    for (; i &lt; iobref-&gt;allocated; i++) {</div><div class='add'>+        if (iobref-&gt;iobrefs[i] != NULL) {</div><div class='add'>+            iobuf_unref(iobref-&gt;iobrefs[i]);</div><div class='add'>+        } else {</div><div class='add'>+            /** iobuf's are attached serially */</div><div class='add'>+            break;</div><div class='ctx'>         }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    iobref_unref(iobref);</div><div class='ctx'> </div><div class='del'>-        return ret;</div><div class='add'>+out:</div><div class='add'>+    return;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+static void</div><div class='add'>+__iobref_grow(struct iobref *iobref)</div><div class='add'>+{</div><div class='add'>+    void *newptr = NULL;</div><div class='add'>+    int i = 0;</div><div class='add'>+</div><div class='add'>+    newptr = GF_REALLOC(iobref-&gt;iobrefs,</div><div class='add'>+                        iobref-&gt;allocated * 2 * (sizeof(*iobref-&gt;iobrefs)));</div><div class='add'>+    if (newptr) {</div><div class='add'>+        iobref-&gt;iobrefs = newptr;</div><div class='add'>+        iobref-&gt;allocated *= 2;</div><div class='add'>+</div><div class='add'>+        for (i = iobref-&gt;used; i &lt; iobref-&gt;allocated; i++)</div><div class='add'>+            iobref-&gt;iobrefs[i] = NULL;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-iobref_add (struct iobref *iobref, struct iobuf *iobuf)</div><div class='add'>+__iobref_add(struct iobref *iobref, struct iobuf *iobuf)</div><div class='ctx'> {</div><div class='del'>-        int  ret = 0;</div><div class='add'>+    int i = 0;</div><div class='add'>+    int ret = -ENOMEM;</div><div class='ctx'> </div><div class='del'>-        if (!iobref)</div><div class='del'>-                return -EINVAL;</div><div class='add'>+    GF_VALIDATE_OR_GOTO("iobuf", iobref, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("iobuf", iobuf, out);</div><div class='ctx'> </div><div class='del'>-        if (!iobuf)</div><div class='del'>-                return -EINVAL;</div><div class='add'>+    if (iobref-&gt;used == iobref-&gt;allocated) {</div><div class='add'>+        __iobref_grow(iobref);</div><div class='ctx'> </div><div class='del'>-        LOCK (&amp;iobref-&gt;lock);</div><div class='del'>-        {</div><div class='del'>-                ret = __iobref_add (iobref, iobuf);</div><div class='add'>+        if (iobref-&gt;used == iobref-&gt;allocated) {</div><div class='add'>+            ret = -ENOMEM;</div><div class='add'>+            goto out;</div><div class='ctx'>         }</div><div class='del'>-        UNLOCK (&amp;iobref-&gt;lock);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; iobref-&gt;allocated; i++) {</div><div class='add'>+        if (iobref-&gt;iobrefs[i] == NULL) {</div><div class='add'>+            iobref-&gt;iobrefs[i] = iobuf_ref(iobuf);</div><div class='add'>+            iobref-&gt;used++;</div><div class='add'>+            ret = 0;</div><div class='add'>+            break;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        return ret;</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+int</div><div class='add'>+iobref_add(struct iobref *iobref, struct iobuf *iobuf)</div><div class='add'>+{</div><div class='add'>+    int ret = -EINVAL;</div><div class='add'>+</div><div class='add'>+    GF_VALIDATE_OR_GOTO("iobuf", iobref, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("iobuf", iobuf, out);</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;iobref-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        ret = __iobref_add(iobref, iobuf);</div><div class='add'>+    }</div><div class='add'>+    UNLOCK(&amp;iobref-&gt;lock);</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-iobref_merge (struct iobref *to, struct iobref *from)</div><div class='add'>+iobref_merge(struct iobref *to, struct iobref *from)</div><div class='ctx'> {</div><div class='del'>-        int           i = 0;</div><div class='del'>-        int           ret = 0;</div><div class='del'>-        struct iobuf *iobuf = NULL;</div><div class='add'>+    int i = 0;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    struct iobuf *iobuf = NULL;</div><div class='ctx'> </div><div class='del'>-        LOCK (&amp;from-&gt;lock);</div><div class='del'>-        {</div><div class='del'>-                for (i = 0; i &lt; 8; i++) {</div><div class='del'>-                        iobuf = from-&gt;iobrefs[i];</div><div class='add'>+    GF_VALIDATE_OR_GOTO("iobuf", to, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("iobuf", from, out);</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;from-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        for (i = 0; i &lt; from-&gt;allocated; i++) {</div><div class='add'>+            iobuf = from-&gt;iobrefs[i];</div><div class='ctx'> </div><div class='del'>-                        if (!iobuf)</div><div class='del'>-                                break;</div><div class='add'>+            if (!iobuf)</div><div class='add'>+                break;</div><div class='ctx'> </div><div class='del'>-                        ret = iobref_add (to, iobuf);</div><div class='add'>+            ret = iobref_add(to, iobuf);</div><div class='ctx'> </div><div class='del'>-                        if (ret &lt; 0)</div><div class='del'>-                                break;</div><div class='del'>-                }</div><div class='add'>+            if (ret &lt; 0)</div><div class='add'>+                break;</div><div class='ctx'>         }</div><div class='del'>-        UNLOCK (&amp;from-&gt;lock);</div><div class='add'>+    }</div><div class='add'>+    UNLOCK(&amp;from-&gt;lock);</div><div class='ctx'> </div><div class='del'>-        return ret;</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> size_t</div><div class='del'>-iobuf_size (struct iobuf *iobuf)</div><div class='add'>+iobuf_size(struct iobuf *iobuf)</div><div class='ctx'> {</div><div class='del'>-        size_t size = 0;</div><div class='add'>+    size_t size = 0;</div><div class='ctx'> </div><div class='del'>-        if (!iobuf)</div><div class='del'>-                goto out;</div><div class='add'>+    GF_VALIDATE_OR_GOTO("iobuf", iobuf, out);</div><div class='ctx'> </div><div class='del'>-        if (!iobuf-&gt;iobuf_arena)</div><div class='del'>-                goto out;</div><div class='add'>+    if (!iobuf-&gt;iobuf_arena) {</div><div class='add'>+        gf_smsg(THIS-&gt;name, GF_LOG_WARNING, 0, LG_MSG_ARENA_NOT_FOUND, NULL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        if (!iobuf-&gt;iobuf_arena-&gt;iobuf_pool)</div><div class='del'>-                goto out;</div><div class='add'>+    if (!iobuf-&gt;iobuf_arena-&gt;iobuf_pool) {</div><div class='add'>+        gf_smsg(THIS-&gt;name, GF_LOG_WARNING, 0, LG_MSG_POOL_NOT_FOUND, NULL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        size = iobuf-&gt;iobuf_arena-&gt;iobuf_pool-&gt;page_size;</div><div class='add'>+    size = iobuf-&gt;iobuf_arena-&gt;page_size;</div><div class='ctx'> out:</div><div class='del'>-        return size;</div><div class='add'>+    return size;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> size_t</div><div class='del'>-iobref_size (struct iobref *iobref)</div><div class='add'>+iobref_size(struct iobref *iobref)</div><div class='ctx'> {</div><div class='del'>-        size_t size = 0;</div><div class='del'>-        int    i = 0;</div><div class='add'>+    size_t size = 0;</div><div class='add'>+    int i = 0;</div><div class='ctx'> </div><div class='del'>-        if (!iobref)</div><div class='del'>-                goto out;</div><div class='add'>+    GF_VALIDATE_OR_GOTO("iobuf", iobref, out);</div><div class='ctx'> </div><div class='del'>-        LOCK (&amp;iobref-&gt;lock);</div><div class='del'>-        {</div><div class='del'>-                for (i = 0; i &lt; 8; i++) {</div><div class='del'>-                        if (iobref-&gt;iobrefs[i])</div><div class='del'>-                                size += iobuf_size (iobref-&gt;iobrefs[i]);</div><div class='del'>-                }</div><div class='add'>+    LOCK(&amp;iobref-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        for (i = 0; i &lt; iobref-&gt;allocated; i++) {</div><div class='add'>+            if (iobref-&gt;iobrefs[i])</div><div class='add'>+                size += iobuf_size(iobref-&gt;iobrefs[i]);</div><div class='ctx'>         }</div><div class='del'>-        UNLOCK (&amp;iobref-&gt;lock);</div><div class='add'>+    }</div><div class='add'>+    UNLOCK(&amp;iobref-&gt;lock);</div><div class='add'>+</div><div class='ctx'> out:</div><div class='del'>-        return size;</div><div class='add'>+    return size;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-void </div><div class='del'>-iobuf_info_dump (struct iobuf *iobuf, const char *key_prefix)</div><div class='add'>+void</div><div class='add'>+iobuf_info_dump(struct iobuf *iobuf, const char *key_prefix)</div><div class='ctx'> {</div><div class='del'>-        char   key[GF_DUMP_MAX_BUF_LEN];</div><div class='del'>-        struct iobuf my_iobuf;</div><div class='del'>-        int    ret = 0;</div><div class='add'>+    char key[GF_DUMP_MAX_BUF_LEN];</div><div class='add'>+    struct iobuf my_iobuf;</div><div class='add'>+    int ret = 0;</div><div class='ctx'> </div><div class='del'>-        if (!iobuf) </div><div class='del'>-                return;</div><div class='add'>+    GF_VALIDATE_OR_GOTO("iobuf", iobuf, out);</div><div class='ctx'> </div><div class='del'>-        memset(&amp;my_iobuf, 0, sizeof(my_iobuf));</div><div class='del'>-        </div><div class='del'>-        ret = TRY_LOCK(&amp;iobuf-&gt;lock);</div><div class='del'>-        if (ret) {</div><div class='del'>-                gf_log("", GF_LOG_WARNING, "Unable to dump iobuf"</div><div class='del'>-                " errno: %d", errno);</div><div class='del'>-                return;</div><div class='del'>-        }</div><div class='del'>-        memcpy(&amp;my_iobuf, iobuf, sizeof(my_iobuf));</div><div class='del'>-        UNLOCK(&amp;iobuf-&gt;lock);</div><div class='add'>+    ret = TRY_LOCK(&amp;iobuf-&gt;lock);</div><div class='add'>+    if (ret) {</div><div class='add'>+        return;</div><div class='add'>+    }</div><div class='add'>+    memcpy(&amp;my_iobuf, iobuf, sizeof(my_iobuf));</div><div class='add'>+    UNLOCK(&amp;iobuf-&gt;lock);</div><div class='ctx'> </div><div class='del'>-	gf_proc_dump_build_key(key, key_prefix,"ref");</div><div class='del'>-        gf_proc_dump_write(key, "%d", my_iobuf.ref);</div><div class='del'>-	gf_proc_dump_build_key(key, key_prefix,"ptr");</div><div class='del'>-        gf_proc_dump_write(key, "%p", my_iobuf.ptr);</div><div class='add'>+    gf_proc_dump_build_key(key, key_prefix, "ref");</div><div class='add'>+    gf_proc_dump_write(key, "%" GF_PRI_ATOMIC, GF_ATOMIC_GET(my_iobuf.ref));</div><div class='add'>+    gf_proc_dump_build_key(key, key_prefix, "ptr");</div><div class='add'>+    gf_proc_dump_write(key, "%p", my_iobuf.ptr);</div><div class='ctx'> </div><div class='add'>+out:</div><div class='add'>+    return;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-void </div><div class='del'>-iobuf_arena_info_dump (struct iobuf_arena *iobuf_arena, const char *key_prefix)</div><div class='add'>+void</div><div class='add'>+iobuf_arena_info_dump(struct iobuf_arena *iobuf_arena, const char *key_prefix)</div><div class='ctx'> {</div><div class='del'>-	char key[GF_DUMP_MAX_BUF_LEN];</div><div class='del'>-	int  i = 1;</div><div class='del'>-        struct iobuf *trav;</div><div class='del'>-</div><div class='del'>-	if (!iobuf_arena)</div><div class='del'>-                return;</div><div class='del'>-</div><div class='del'>-        gf_proc_dump_build_key(key, key_prefix,"mem_base");</div><div class='del'>-        gf_proc_dump_write(key, "%p", iobuf_arena-&gt;mem_base);</div><div class='del'>-	gf_proc_dump_build_key(key, key_prefix, "active_cnt");</div><div class='del'>-        gf_proc_dump_write(key, "%d", iobuf_arena-&gt;active_cnt);</div><div class='del'>-	gf_proc_dump_build_key(key, key_prefix, "passive_cnt");</div><div class='del'>-        gf_proc_dump_write(key, "%d", iobuf_arena-&gt;passive_cnt);</div><div class='del'>-	list_for_each_entry (trav, &amp;iobuf_arena-&gt;active.list, list) {</div><div class='del'>-                gf_proc_dump_build_key(key, key_prefix,"active_iobuf.%d", i++);</div><div class='del'>-                gf_proc_dump_add_section(key);</div><div class='del'>-                iobuf_info_dump(trav, key);</div><div class='del'>-        }</div><div class='add'>+    char key[GF_DUMP_MAX_BUF_LEN];</div><div class='add'>+    int i = 1;</div><div class='add'>+    struct iobuf *trav;</div><div class='add'>+</div><div class='add'>+    GF_VALIDATE_OR_GOTO("iobuf", iobuf_arena, out);</div><div class='add'>+</div><div class='add'>+    gf_proc_dump_build_key(key, key_prefix, "mem_base");</div><div class='add'>+    gf_proc_dump_write(key, "%p", iobuf_arena-&gt;mem_base);</div><div class='add'>+    gf_proc_dump_build_key(key, key_prefix, "active_cnt");</div><div class='add'>+    gf_proc_dump_write(key, "%d", iobuf_arena-&gt;active_cnt);</div><div class='add'>+    gf_proc_dump_build_key(key, key_prefix, "passive_cnt");</div><div class='add'>+    gf_proc_dump_write(key, "%d", iobuf_arena-&gt;passive_cnt);</div><div class='add'>+    gf_proc_dump_build_key(key, key_prefix, "alloc_cnt");</div><div class='add'>+    gf_proc_dump_write(key, "%" PRIu64, iobuf_arena-&gt;alloc_cnt);</div><div class='add'>+    gf_proc_dump_build_key(key, key_prefix, "max_active");</div><div class='add'>+    gf_proc_dump_write(key, "%d", iobuf_arena-&gt;max_active);</div><div class='add'>+    gf_proc_dump_build_key(key, key_prefix, "page_size");</div><div class='add'>+    gf_proc_dump_write(key, "%" GF_PRI_SIZET, iobuf_arena-&gt;page_size);</div><div class='add'>+    list_for_each_entry(trav, &amp;iobuf_arena-&gt;active.list, list)</div><div class='add'>+    {</div><div class='add'>+        gf_proc_dump_build_key(key, key_prefix, "active_iobuf.%d", i++);</div><div class='add'>+        gf_proc_dump_add_section("%s", key);</div><div class='add'>+        iobuf_info_dump(trav, key);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='add'>+out:</div><div class='add'>+    return;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> void</div><div class='del'>-iobuf_stats_dump (struct iobuf_pool *iobuf_pool)</div><div class='add'>+iobuf_stats_dump(struct iobuf_pool *iobuf_pool)</div><div class='ctx'> {</div><div class='del'>-    </div><div class='del'>-        char               msg[1024];</div><div class='del'>-        struct iobuf_arena *trav = NULL;</div><div class='del'>-        int                i = 1;</div><div class='del'>-        int                ret = -1;</div><div class='add'>+    char msg[1024];</div><div class='add'>+    struct iobuf_arena *trav = NULL;</div><div class='add'>+    int i = 1;</div><div class='add'>+    int j = 0;</div><div class='add'>+    int ret = -1;</div><div class='ctx'> </div><div class='del'>-        if (!iobuf_pool)</div><div class='del'>-                return;</div><div class='add'>+    GF_VALIDATE_OR_GOTO("iobuf", iobuf_pool, out);</div><div class='ctx'> </div><div class='del'>-        memset(msg, 0, sizeof(msg));</div><div class='add'>+    ret = pthread_mutex_trylock(&amp;iobuf_pool-&gt;mutex);</div><div class='ctx'> </div><div class='del'>-        ret = pthread_mutex_trylock(&amp;iobuf_pool-&gt;mutex);</div><div class='del'>-</div><div class='del'>-        if (ret) {</div><div class='del'>-                gf_log("", GF_LOG_WARNING, "Unable to dump iobuf pool"</div><div class='del'>-                " errno: %d", errno);</div><div class='del'>-                return;</div><div class='add'>+    if (ret) {</div><div class='add'>+        return;</div><div class='add'>+    }</div><div class='add'>+    gf_proc_dump_add_section("iobuf.global");</div><div class='add'>+    gf_proc_dump_write("iobuf_pool", "%p", iobuf_pool);</div><div class='add'>+    gf_proc_dump_write("iobuf_pool.default_page_size", "%" GF_PRI_SIZET,</div><div class='add'>+                       iobuf_pool-&gt;default_page_size);</div><div class='add'>+    gf_proc_dump_write("iobuf_pool.arena_size", "%" GF_PRI_SIZET,</div><div class='add'>+                       iobuf_pool-&gt;arena_size);</div><div class='add'>+    gf_proc_dump_write("iobuf_pool.arena_cnt", "%d", iobuf_pool-&gt;arena_cnt);</div><div class='add'>+    gf_proc_dump_write("iobuf_pool.request_misses", "%" PRId64,</div><div class='add'>+                       iobuf_pool-&gt;request_misses);</div><div class='add'>+</div><div class='add'>+    for (j = 0; j &lt; IOBUF_ARENA_MAX_INDEX; j++) {</div><div class='add'>+        list_for_each_entry(trav, &amp;iobuf_pool-&gt;arenas[j], list)</div><div class='add'>+        {</div><div class='add'>+            snprintf(msg, sizeof(msg), "arena.%d", i);</div><div class='add'>+            gf_proc_dump_add_section("%s", msg);</div><div class='add'>+            iobuf_arena_info_dump(trav, msg);</div><div class='add'>+            i++;</div><div class='ctx'>         }</div><div class='del'>-        gf_proc_dump_add_section("iobuf.global");</div><div class='del'>-        gf_proc_dump_write("iobuf.global.iobuf_pool","%p", iobuf_pool);</div><div class='del'>-        gf_proc_dump_write("iobuf.global.iobuf_pool.page_size", "%d",</div><div class='del'>-						 iobuf_pool-&gt;page_size);</div><div class='del'>-        gf_proc_dump_write("iobuf.global.iobuf_pool.arena_size", "%d",</div><div class='del'>-						 iobuf_pool-&gt;arena_size);</div><div class='del'>-        gf_proc_dump_write("iobuf.global.iobuf_pool.arena_cnt", "%d",</div><div class='del'>-						 iobuf_pool-&gt;arena_cnt);</div><div class='del'>-</div><div class='del'>-        list_for_each_entry (trav, &amp;iobuf_pool-&gt;arenas.list, list) {</div><div class='del'>-                snprintf(msg, sizeof(msg), "iobuf.global.iobuf_pool.arena.%d",</div><div class='del'>-                                                                            i);</div><div class='del'>-		gf_proc_dump_add_section(msg);</div><div class='del'>-                iobuf_arena_info_dump(trav,msg);</div><div class='del'>-                i++;</div><div class='add'>+        list_for_each_entry(trav, &amp;iobuf_pool-&gt;purge[j], list)</div><div class='add'>+        {</div><div class='add'>+            snprintf(msg, sizeof(msg), "purge.%d", i);</div><div class='add'>+            gf_proc_dump_add_section("%s", msg);</div><div class='add'>+            iobuf_arena_info_dump(trav, msg);</div><div class='add'>+            i++;</div><div class='add'>+        }</div><div class='add'>+        list_for_each_entry(trav, &amp;iobuf_pool-&gt;filled[j], list)</div><div class='add'>+        {</div><div class='add'>+            snprintf(msg, sizeof(msg), "filled.%d", i);</div><div class='add'>+            gf_proc_dump_add_section("%s", msg);</div><div class='add'>+            iobuf_arena_info_dump(trav, msg);</div><div class='add'>+            i++;</div><div class='ctx'>         }</div><div class='del'>-        </div><div class='del'>-        pthread_mutex_unlock(&amp;iobuf_pool-&gt;mutex);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        return;</div><div class='del'>-}</div><div class='add'>+    pthread_mutex_unlock(&amp;iobuf_pool-&gt;mutex);</div><div class='ctx'> </div><div class='add'>+out:</div><div class='add'>+    return;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> void</div><div class='ctx'> iobuf_to_iovec(struct iobuf *iob, struct iovec *iov)</div><div class='ctx'> {</div><div class='del'>-        iov-&gt;iov_base = iobuf_ptr (iob);</div><div class='del'>-        iov-&gt;iov_len =  iobuf_pagesize (iob);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("iobuf", iob, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("iobuf", iov, out);</div><div class='add'>+</div><div class='add'>+    iov-&gt;iov_base = iobuf_ptr(iob);</div><div class='add'>+    iov-&gt;iov_len = iobuf_pagesize(iob);</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+int</div><div class='add'>+iobuf_copy(struct iobuf_pool *iobuf_pool, const struct iovec *iovec_src,</div><div class='add'>+           int iovcnt, struct iobref **iobref, struct iobuf **iobuf,</div><div class='add'>+           struct iovec *iov_dst)</div><div class='add'>+{</div><div class='add'>+    size_t size = -1;</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    size = iov_length(iovec_src, iovcnt);</div><div class='add'>+</div><div class='add'>+    *iobuf = iobuf_get2(iobuf_pool, size);</div><div class='add'>+    if (!(*iobuf)) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        errno = ENOMEM;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    *iobref = iobref_new();</div><div class='add'>+    if (!(*iobref)) {</div><div class='add'>+        iobuf_unref(*iobuf);</div><div class='add'>+        errno = ENOMEM;</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = iobref_add(*iobref, *iobuf);</div><div class='add'>+    if (ret) {</div><div class='add'>+        iobuf_unref(*iobuf);</div><div class='add'>+        iobref_unref(*iobref);</div><div class='add'>+        errno = ENOMEM;</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    iov_unload(iobuf_ptr(*iobuf), iovec_src, iovcnt);</div><div class='add'>+</div><div class='add'>+    iov_dst-&gt;iov_base = iobuf_ptr(*iobuf);</div><div class='add'>+    iov_dst-&gt;iov_len = size;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='head'>diff --git a/libglusterfs/src/iobuf.h b/libglusterfs/src/iobuf.h<br/>deleted file mode 100644<br/>index bc2209958cf..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/libglusterfs/src/iobuf.h?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/iobuf.h</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,137 +0,0 @@</div><div class='del'>-/*</div><div class='del'>-   Copyright (c) 2009 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='del'>-   This file is part of GlusterFS.</div><div class='del'>-</div><div class='del'>-   GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-   it under the terms of the GNU General Public License as published</div><div class='del'>-   by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-   or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-   GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-   WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-   General Public License for more details.</div><div class='del'>-</div><div class='del'>-   You should have received a copy of the GNU General Public License</div><div class='del'>-   along with this program.  If not, see</div><div class='del'>-   &lt;http://www.gnu.org/licenses/&gt;.</div><div class='del'>-*/</div><div class='del'>-</div><div class='del'>-#ifndef _IOBUF_H_</div><div class='del'>-#define _IOBUF_H_</div><div class='del'>-</div><div class='del'>-#include "list.h"</div><div class='del'>-#include "common-utils.h"</div><div class='del'>-#include &lt;pthread.h&gt;</div><div class='del'>-#include &lt;sys/mman.h&gt;</div><div class='del'>-#include &lt;sys/uio.h&gt;</div><div class='del'>-</div><div class='del'>-/* Lets try to define the new anonymous mapping</div><div class='del'>- * flag, in case the system is still using the</div><div class='del'>- * now deprecated MAP_ANON flag.</div><div class='del'>- *</div><div class='del'>- * Also, this should ideally be in a centralized/common</div><div class='del'>- * header which can be used by other source files also.</div><div class='del'>- */</div><div class='del'>-#ifndef MAP_ANONYMOUS</div><div class='del'>-#define MAP_ANONYMOUS MAP_ANON</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-/* one allocatable unit for the consumers of the IOBUF API */</div><div class='del'>-/* each unit hosts @page_size bytes of memory */</div><div class='del'>-struct iobuf;</div><div class='del'>-</div><div class='del'>-/* one region of memory MMAPed from the operating system */</div><div class='del'>-/* each region MMAPs @arena_size bytes of memory */</div><div class='del'>-/* each arena hosts @arena_size / @page_size IOBUFs */</div><div class='del'>-struct iobuf_arena;</div><div class='del'>-</div><div class='del'>-/* expandable and contractable pool of memory, internally broken into arenas */</div><div class='del'>-struct iobuf_pool;</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-struct iobuf {</div><div class='del'>-        union {</div><div class='del'>-                struct list_head      list;</div><div class='del'>-                struct {</div><div class='del'>-                        struct iobuf *next;</div><div class='del'>-                        struct iobuf *prev;</div><div class='del'>-                };</div><div class='del'>-        };</div><div class='del'>-        struct iobuf_arena  *iobuf_arena;</div><div class='del'>-</div><div class='del'>-        gf_lock_t            lock; /* for -&gt;ptr and -&gt;ref */</div><div class='del'>-        int                  ref;  /* 0 == passive, &gt;0 == active */</div><div class='del'>-</div><div class='del'>-        void                *ptr;  /* usable memory region by the consumer */</div><div class='del'>-};</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-struct iobuf_arena {</div><div class='del'>-        union {</div><div class='del'>-                struct list_head            list;</div><div class='del'>-                struct {</div><div class='del'>-                        struct iobuf_arena *next;</div><div class='del'>-                        struct iobuf_arena *prev;</div><div class='del'>-                };</div><div class='del'>-        };</div><div class='del'>-        struct iobuf_pool  *iobuf_pool;</div><div class='del'>-</div><div class='del'>-        void               *mem_base;</div><div class='del'>-        struct iobuf       *iobufs;     /* allocated iobufs list */</div><div class='del'>-</div><div class='del'>-        int                 active_cnt;</div><div class='del'>-        struct iobuf        active;     /* head node iobuf</div><div class='del'>-                                           (unused by itself) */</div><div class='del'>-        int                 passive_cnt;</div><div class='del'>-        struct iobuf        passive;    /* head node iobuf</div><div class='del'>-                                           (unused by itself) */</div><div class='del'>-};</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-struct iobuf_pool {</div><div class='del'>-        pthread_mutex_t     mutex;</div><div class='del'>-        size_t              page_size;  /* size of all iobufs in this pool */</div><div class='del'>-        size_t              arena_size; /* size of memory region in arena */</div><div class='del'>-</div><div class='del'>-        int                 arena_cnt;</div><div class='del'>-        struct iobuf_arena  arenas;     /* head node arena</div><div class='del'>-                                           (unused by itself) */</div><div class='del'>-        struct iobuf_arena  filled;     /* arenas without  free iobufs */</div><div class='del'>-        struct iobuf_arena  purge;      /* arenas which can be purged */</div><div class='del'>-};</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-struct iobuf_pool *iobuf_pool_new (size_t arena_size, size_t page_size);</div><div class='del'>-void iobuf_pool_destroy (struct iobuf_pool *iobuf_pool);</div><div class='del'>-struct iobuf *iobuf_get (struct iobuf_pool *iobuf_pool);</div><div class='del'>-void iobuf_unref (struct iobuf *iobuf);</div><div class='del'>-struct iobuf *iobuf_ref (struct iobuf *iobuf);</div><div class='del'>-void iobuf_pool_destroy (struct iobuf_pool *iobuf_pool);</div><div class='del'>-void iobuf_to_iovec(struct iobuf *iob, struct iovec *iov);</div><div class='del'>-</div><div class='del'>-#define iobuf_ptr(iob) ((iob)-&gt;ptr)</div><div class='del'>-#define iobpool_pagesize(iobpool) ((iobpool)-&gt;page_size)</div><div class='del'>-#define iobuf_pagesize(iob) (iobpool_pagesize((iob)-&gt;iobuf_arena-&gt;iobuf_pool))</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-struct iobref {</div><div class='del'>-        gf_lock_t          lock;</div><div class='del'>-        int                ref;</div><div class='del'>-        struct iobuf      *iobrefs[8];</div><div class='del'>-};</div><div class='del'>-</div><div class='del'>-struct iobref *iobref_new ();</div><div class='del'>-struct iobref *iobref_ref (struct iobref *iobref);</div><div class='del'>-void iobref_unref (struct iobref *iobref);</div><div class='del'>-int iobref_add (struct iobref *iobref, struct iobuf *iobuf);</div><div class='del'>-int iobref_merge (struct iobref *to, struct iobref *from);</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-size_t iobuf_size (struct iobuf *iobuf);</div><div class='del'>-size_t iobref_size (struct iobref *iobref);</div><div class='del'>-void   iobuf_stats_dump (struct iobuf_pool *iobuf_pool);</div><div class='del'>-</div><div class='del'>-#endif /* !_IOBUF_H_ */</div><div class='head'>diff --git a/libglusterfs/src/latency.c b/libglusterfs/src/latency.c<br/>index d8f405148a3..ce4b0e8255d 100644<br/>--- a/<a href='/cgit/glusterfs.git/tree/libglusterfs/src/latency.c?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/latency.c</a><br/>+++ b/<a href='/cgit/glusterfs.git/tree/libglusterfs/src/latency.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>libglusterfs/src/latency.c</a></div><div class='hunk'>@@ -1,183 +1,84 @@</div><div class='ctx'> /*</div><div class='del'>-  Copyright (c) 2009 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='add'>+  Copyright (c) 2008-2012 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='ctx'>   This file is part of GlusterFS.</div><div class='ctx'> </div><div class='del'>-  GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-  it under the terms of the GNU General Public License as published</div><div class='del'>-  by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-  or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-  GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-  WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-  General Public License for more details.</div><div class='del'>-</div><div class='del'>-  You should have received a copy of the GNU General Public License</div><div class='del'>-  along with this program.  If not, see</div><div class='del'>-  &lt;http://www.gnu.org/licenses/&gt;.</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='ctx'> */</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> /*</div><div class='ctx'>  * This file contains functions to support dumping of</div><div class='ctx'>  * latencies of FOPs broken down by subvolumes.</div><div class='ctx'>  */</div><div class='ctx'> </div><div class='del'>-#include "glusterfs.h"</div><div class='del'>-#include "stack.h"</div><div class='del'>-#include "xlator.h"</div><div class='del'>-#include "common-utils.h"</div><div class='del'>-#include "statedump.h"</div><div class='del'>-</div><div class='add'>+#include "glusterfs/glusterfs.h"</div><div class='add'>+#include "glusterfs/statedump.h"</div><div class='ctx'> </div><div class='del'>-void</div><div class='del'>-gf_set_fop_from_fn_pointer (call_frame_t *frame, struct xlator_fops *fops, void *fn)</div><div class='add'>+gf_latency_t *</div><div class='add'>+gf_latency_new(size_t n)</div><div class='ctx'> {</div><div class='del'>-        glusterfs_fop_t fop = -1;</div><div class='add'>+    int i = 0;</div><div class='add'>+    gf_latency_t *lat = NULL;</div><div class='ctx'> </div><div class='del'>-        if (fops-&gt;stat == fn)</div><div class='del'>-                fop = GF_FOP_STAT;</div><div class='del'>-        else if (fops-&gt;readlink == fn)</div><div class='del'>-                fop = GF_FOP_READLINK;</div><div class='del'>-        else if (fops-&gt;mknod == fn)</div><div class='del'>-                fop = GF_FOP_MKNOD;</div><div class='del'>-        else if (fops-&gt;mkdir == fn)</div><div class='del'>-                fop = GF_FOP_MKDIR;</div><div class='del'>-        else if (fops-&gt;unlink == fn)</div><div class='del'>-                fop = GF_FOP_UNLINK;</div><div class='del'>-        else if (fops-&gt;rmdir == fn)</div><div class='del'>-                fop = GF_FOP_RMDIR;</div><div class='del'>-        else if (fops-&gt;symlink == fn)</div><div class='del'>-                fop = GF_FOP_SYMLINK;</div><div class='del'>-        else if (fops-&gt;rename == fn)</div><div class='del'>-                fop = GF_FOP_RENAME;</div><div class='del'>-        else if (fops-&gt;link == fn)</div><div class='del'>-                fop = GF_FOP_LINK;</div><div class='del'>-        else if (fops-&gt;truncate == fn)</div><div class='del'>-                fop = GF_FOP_TRUNCATE;</div><div class='del'>-        else if (fops-&gt;open == fn)</div><div class='del'>-                fop = GF_FOP_OPEN;</div><div class='del'>-        else if (fops-&gt;readv == fn)</div><div class='del'>-                fop = GF_FOP_READ;</div><div class='del'>-        else if (fops-&gt;writev == fn)</div><div class='del'>-                fop = GF_FOP_WRITE;</div><div class='del'>-        else if (fops-&gt;statfs == fn)</div><div class='del'>-                fop = GF_FOP_STATFS;</div><div class='del'>-        else if (fops-&gt;flush == fn)</div><div class='del'>-                fop = GF_FOP_FLUSH;</div><div class='del'>-        else if (fops-&gt;fsync == fn)</div><div class='del'>-                fop = GF_FOP_FSYNC;</div><div class='del'>-        else if (fops-&gt;setxattr == fn)</div><div class='del'>-                fop = GF_FOP_SETXATTR;</div><div class='del'>-        else if (fops-&gt;getxattr == fn)</div><div class='del'>-                fop = GF_FOP_GETXATTR;</div><div class='del'>-        else if (fops-&gt;removexattr == fn)</div><div class='del'>-                fop = GF_FOP_REMOVEXATTR;</div><div class='del'>-        else if (fops-&gt;opendir == fn)</div><div class='del'>-                fop = GF_FOP_OPENDIR;</div><div class='del'>-        else if (fops-&gt;fsyncdir == fn)</div><div class='del'>-                fop = GF_FOP_FSYNCDIR;</div><div class='del'>-        else if (fops-&gt;access == fn)</div><div class='del'>-                fop = GF_FOP_ACCESS;</div><div class='del'>-        else if (fops-&gt;create == fn)</div><div class='del'>-                fop = GF_FOP_CREATE;</div><div class='del'>-        else if (fops-&gt;ftruncate == fn)</div><div class='del'>-                fop = GF_FOP_FTRUNCATE;</div><div class='del'>-        else if (fops-&gt;fstat == fn)</div><div class='del'>-                fop = GF_FOP_FSTAT;</div><div class='del'>-        else if (fops-&gt;lk == fn)</div><div class='del'>-                fop = GF_FOP_LK;</div><div class='del'>-        else if (fops-&gt;lookup == fn)</div><div class='del'>-                fop = GF_FOP_LOOKUP;</div><div class='del'>-        else if (fops-&gt;readdir == fn)</div><div class='del'>-                fop = GF_FOP_READDIR;</div><div class='del'>-        else if (fops-&gt;inodelk == fn)</div><div class='del'>-                fop = GF_FOP_INODELK;</div><div class='del'>-        else if (fops-&gt;finodelk == fn)</div><div class='del'>-                fop = GF_FOP_FINODELK;</div><div class='del'>-	else if (fops-&gt;entrylk == fn)</div><div class='del'>-                fop = GF_FOP_ENTRYLK;</div><div class='del'>-	else if (fops-&gt;fentrylk == fn)</div><div class='del'>-                fop = GF_FOP_FENTRYLK;</div><div class='del'>-        else if (fops-&gt;xattrop == fn)</div><div class='del'>-                fop = GF_FOP_XATTROP;</div><div class='del'>-        else if (fops-&gt;fxattrop == fn)</div><div class='del'>-                fop = GF_FOP_FXATTROP;</div><div class='del'>-        else if (fops-&gt;fgetxattr == fn)</div><div class='del'>-                fop = GF_FOP_FGETXATTR;</div><div class='del'>-        else if (fops-&gt;fsetxattr == fn)</div><div class='del'>-                fop = GF_FOP_FSETXATTR;</div><div class='del'>-        else if (fops-&gt;rchecksum == fn)</div><div class='del'>-                fop = GF_FOP_RCHECKSUM;</div><div class='del'>-        else if (fops-&gt;setattr == fn)</div><div class='del'>-                fop = GF_FOP_SETATTR;</div><div class='del'>-        else if (fops-&gt;fsetattr == fn)</div><div class='del'>-                fop = GF_FOP_FSETATTR;</div><div class='del'>-        else if (fops-&gt;readdirp == fn)</div><div class='del'>-                fop = GF_FOP_READDIRP;</div><div class='del'>-        else if (fops-&gt;getspec == fn)</div><div class='del'>-                fop = GF_FOP_GETSPEC;</div><div class='del'>-        else</div><div class='del'>-                fop = -1;</div><div class='add'>+    lat = GF_MALLOC(n * sizeof(*lat), gf_common_mt_latency_t);</div><div class='add'>+    if (!lat)</div><div class='add'>+        return NULL;</div><div class='ctx'> </div><div class='del'>-        frame-&gt;op   = fop;</div><div class='add'>+    for (i = 0; i &lt; n; i++) {</div><div class='add'>+        gf_latency_reset(lat + i);</div><div class='add'>+    }</div><div class='add'>+    return lat;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> void</div><div class='del'>-gf_update_latency (call_frame_t *frame)</div><div class='add'>+gf_latency_update(gf_latency_t *lat, struct timespec *begin,</div><div class='add'>+                  struct timespec *end)</div><div class='ctx'> {</div><div class='del'>-        double elapsed;</div><div class='del'>-        struct timeval *begin, *end;</div><div class='del'>-</div><div class='del'>-        fop_latency_t *lat;</div><div class='add'>+    if (!(begin-&gt;tv_sec &amp;&amp; end-&gt;tv_sec)) {</div><div class='add'>+        /*Measure latency might have been enabled/disabled during the op*/</div><div class='add'>+        return;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        begin = &amp;frame-&gt;begin;</div><div class='del'>-        end   = &amp;frame-&gt;end;</div><div class='add'>+    double elapsed = gf_tsdiff(begin, end);</div><div class='ctx'> </div><div class='del'>-        elapsed = (end-&gt;tv_sec - begin-&gt;tv_sec) * 1e6</div><div class='del'>-                + (end-&gt;tv_usec - begin-&gt;tv_usec);</div><div class='add'>+    if (lat-&gt;max &lt; elapsed)</div><div class='add'>+        lat-&gt;max = elapsed;</div><div class='ctx'> </div><div class='del'>-        lat = &amp;frame-&gt;this-&gt;latencies[frame-&gt;op];</div><div class='add'>+    if (lat-&gt;min &gt; elapsed)</div><div class='add'>+        lat-&gt;min = elapsed;</div><div class='ctx'> </div><div class='del'>-	lat-&gt;total += elapsed;</div><div class='del'>-        lat-&gt;count++;</div><div class='del'>-        lat-&gt;mean = lat-&gt;mean + (elapsed - lat-&gt;mean) / lat-&gt;count;</div><div class='add'>+    lat-&gt;total += elapsed;</div><div class='add'>+    lat-&gt;count++;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> void</div><div class='del'>-gf_proc_dump_latency_info (xlator_t *xl)</div><div class='add'>+gf_latency_reset(gf_latency_t *lat)</div><div class='ctx'> {</div><div class='del'>-        char key_prefix[GF_DUMP_MAX_BUF_LEN];</div><div class='del'>-        char key[GF_DUMP_MAX_BUF_LEN];</div><div class='del'>-        int i;</div><div class='del'>-</div><div class='del'>-        snprintf (key_prefix, GF_DUMP_MAX_BUF_LEN, "%s.latency", xl-&gt;name);</div><div class='del'>-        gf_proc_dump_add_section (key_prefix);</div><div class='del'>-</div><div class='del'>-        for (i = 0; i &lt; GF_FOP_MAXVALUE; i++) {</div><div class='del'>-                gf_proc_dump_build_key (key, key_prefix, gf_fop_list[i]);</div><div class='del'>-</div><div class='del'>-                gf_proc_dump_write (key, "%.03f,%"PRId64",%.03f",</div><div class='del'>-                                    xl-&gt;latencies[i].mean,</div><div class='del'>-                                    xl-&gt;latencies[i].count,</div><div class='del'>-				    xl-&gt;latencies[i].total);</div><div class='del'>-        }</div><div class='add'>+    if (!lat)</div><div class='add'>+        return;</div><div class='add'>+    memset(lat, 0, sizeof(*lat));</div><div class='add'>+    lat-&gt;min = ULLONG_MAX;</div><div class='add'>+    /* make sure 'min' is set to high value, so it would be</div><div class='add'>+       properly set later */</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> void</div><div class='del'>-gf_latency_toggle (int signum)</div><div class='add'>+gf_frame_latency_update(call_frame_t *frame)</div><div class='ctx'> {</div><div class='del'>-        glusterfs_ctx_t *ctx = NULL;</div><div class='del'>-</div><div class='del'>-        ctx = glusterfs_ctx_get ();</div><div class='del'>-</div><div class='del'>-        if (ctx) {</div><div class='del'>-                ctx-&gt;measure_latency = !ctx-&gt;measure_latency;</div><div class='del'>-                gf_log ("[core]", GF_LOG_NORMAL,</div><div class='del'>-                        "Latency measurement turned %s",</div><div class='del'>-                        ctx-&gt;measure_latency ? "on" : "off");</div><div class='del'>-        }</div><div class='add'>+    gf_latency_t *lat;</div><div class='add'>+    /* Can happen mostly at initiator xlator, as STACK_WIND/UNWIND macros</div><div class='add'>+       set it right anyways for those frames */</div><div class='add'>+    if (!frame-&gt;op)</div><div class='add'>+        frame-&gt;op = frame-&gt;root-&gt;op;</div><div class='add'>+</div><div class='add'>+    if (frame-&gt;op &lt; 0 || frame-&gt;op &gt;= GF_FOP_MAXVALUE) {</div><div class='add'>+        gf_log("[core]", GF_LOG_WARNING, "Invalid frame op value: %d",</div><div class='add'>+               frame-&gt;op);</div><div class='add'>+        return;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    lat = &amp;frame-&gt;this-&gt;stats.interval.latencies[frame-&gt;op];</div><div class='add'>+    gf_latency_update(lat, &amp;frame-&gt;begin, &amp;frame-&gt;end);</div><div class='ctx'> }</div><div class='head'>diff --git a/libglusterfs/src/latency.h b/libglusterfs/src/latency.h<br/>deleted file mode 100644<br/>index ba7d76cddca..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/libglusterfs/src/latency.h?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/latency.h</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,36 +0,0 @@</div><div class='del'>-/*</div><div class='del'>-  Copyright (c) 2009 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='del'>-  This file is part of GlusterFS.</div><div class='del'>-</div><div class='del'>-  GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-  it under the terms of the GNU General Public License as published</div><div class='del'>-  by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-  or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-  GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-  WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-  General Public License for more details.</div><div class='del'>-</div><div class='del'>-  You should have received a copy of the GNU General Public License</div><div class='del'>-  along with this program.  If not, see</div><div class='del'>-  &lt;http://www.gnu.org/licenses/&gt;.</div><div class='del'>-*/</div><div class='del'>-</div><div class='del'>-#ifndef __LATENCY_H__</div><div class='del'>-#define __LATENCY_H__</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-typedef struct fop_latency {</div><div class='del'>-        uint64_t min;           /* min time for the call (microseconds) */</div><div class='del'>-        uint64_t max;           /* max time for the call (microseconds) */</div><div class='del'>-	double total;           /* total time (microseconds) */</div><div class='del'>-        double std;             /* standard deviation */</div><div class='del'>-        double mean;            /* mean (microseconds) */</div><div class='del'>-        uint64_t count;</div><div class='del'>-} fop_latency_t;</div><div class='del'>-</div><div class='del'>-void</div><div class='del'>-gf_latency_toggle (int signum);</div><div class='del'>-</div><div class='del'>-#endif /* __LATENCY_H__ */</div><div class='head'>diff --git a/libglusterfs/src/libglusterfs.sym b/libglusterfs/src/libglusterfs.sym<br/>new file mode 100644<br/>index 00000000000..5f18cd56cbe<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/libglusterfs/src/libglusterfs.sym?id=d1d7a6f35c816822fab51c820e25023863c239c1'>libglusterfs/src/libglusterfs.sym</a></div><div class='hunk'>@@ -0,0 +1,1193 @@</div><div class='add'>+are_dicts_equal</div><div class='add'>+args_access_cbk_store</div><div class='add'>+args_access_store</div><div class='add'>+args_create_cbk_store</div><div class='add'>+args_create_store</div><div class='add'>+args_discard_cbk_store</div><div class='add'>+args_discard_store</div><div class='add'>+args_entrylk_cbk_store</div><div class='add'>+args_entrylk_store</div><div class='add'>+args_fallocate_cbk_store</div><div class='add'>+args_fallocate_store</div><div class='add'>+args_fentrylk_cbk_store</div><div class='add'>+args_fentrylk_store</div><div class='add'>+args_fgetxattr_cbk_store</div><div class='add'>+args_fgetxattr_store</div><div class='add'>+args_finodelk_cbk_store</div><div class='add'>+args_finodelk_store</div><div class='add'>+args_flush_cbk_store</div><div class='add'>+args_flush_store</div><div class='add'>+args_fremovexattr_cbk_store</div><div class='add'>+args_fremovexattr_store</div><div class='add'>+args_fsetattr_cbk_store</div><div class='add'>+args_fsetattr_store</div><div class='add'>+args_fsetxattr_cbk_store</div><div class='add'>+args_fsetxattr_store</div><div class='add'>+args_fstat_cbk_store</div><div class='add'>+args_fstat_store</div><div class='add'>+args_fsync_cbk_store</div><div class='add'>+args_fsyncdir_cbk_store</div><div class='add'>+args_fsyncdir_store</div><div class='add'>+args_fsync_store</div><div class='add'>+args_ftruncate_cbk_store</div><div class='add'>+args_ftruncate_store</div><div class='add'>+args_fxattrop_cbk_store</div><div class='add'>+args_fxattrop_store</div><div class='add'>+args_getxattr_cbk_store</div><div class='add'>+args_getxattr_store</div><div class='add'>+args_inodelk_cbk_store</div><div class='add'>+args_inodelk_store</div><div class='add'>+args_ipc_cbk_store</div><div class='add'>+args_lease_cbk_store</div><div class='add'>+args_lease_store</div><div class='add'>+args_link_cbk_store</div><div class='add'>+args_link_store</div><div class='add'>+args_lk_cbk_store</div><div class='add'>+args_lk_store</div><div class='add'>+args_lookup_cbk_store</div><div class='add'>+args_lookup_store</div><div class='add'>+args_mkdir_cbk_store</div><div class='add'>+args_mkdir_store</div><div class='add'>+args_mknod_cbk_store</div><div class='add'>+args_mknod_store</div><div class='add'>+args_open_cbk_store</div><div class='add'>+args_opendir_cbk_store</div><div class='add'>+args_opendir_store</div><div class='add'>+args_open_store</div><div class='add'>+args_rchecksum_cbk_store</div><div class='add'>+args_rchecksum_store</div><div class='add'>+args_readdir_cbk_store</div><div class='add'>+args_readdirp_cbk_store</div><div class='add'>+args_readdirp_store</div><div class='add'>+args_readdir_store</div><div class='add'>+args_readlink_cbk_store</div><div class='add'>+args_readlink_store</div><div class='add'>+args_readv_cbk_store</div><div class='add'>+args_readv_store</div><div class='add'>+args_removexattr_cbk_store</div><div class='add'>+args_removexattr_store</div><div class='add'>+args_rename_cbk_store</div><div class='add'>+args_rename_store</div><div class='add'>+args_rmdir_cbk_store</div><div class='add'>+args_rmdir_store</div><div class='add'>+args_seek_cbk_store</div><div class='add'>+args_seek_store</div><div class='add'>+args_setattr_cbk_store</div><div class='add'>+args_setattr_store</div><div class='add'>+args_setxattr_cbk_store</div><div class='add'>+args_setxattr_store</div><div class='add'>+args_stat_cbk_store</div><div class='add'>+args_statfs_cbk_store</div><div class='add'>+args_statfs_store</div><div class='add'>+args_stat_store</div><div class='add'>+args_symlink_cbk_store</div><div class='add'>+args_symlink_store</div><div class='add'>+args_truncate_cbk_store</div><div class='add'>+args_truncate_store</div><div class='add'>+args_unlink_cbk_store</div><div class='add'>+args_unlink_store</div><div class='add'>+args_writev_cbk_store</div><div class='add'>+args_writev_store</div><div class='add'>+args_xattrop_cbk_store</div><div class='add'>+args_xattrop_store</div><div class='add'>+args_zerofill_cbk_store</div><div class='add'>+args_zerofill_store</div><div class='add'>+args_copy_file_range_cbk_store</div><div class='add'>+args_copy_file_range_store</div><div class='add'>+bin_to_data</div><div class='add'>+call_resume</div><div class='add'>+call_resume_keep_stub</div><div class='add'>+call_resume_wind</div><div class='add'>+call_stack_set_groups</div><div class='add'>+call_stub_destroy</div><div class='add'>+call_unwind_error</div><div class='add'>+call_unwind_error_keep_stub</div><div class='add'>+client_ctx_del</div><div class='add'>+client_ctx_get</div><div class='add'>+client_ctx_set</div><div class='add'>+client_dump</div><div class='add'>+close_fds_except</div><div class='add'>+cluster_fop_success_fill</div><div class='add'>+cluster_fstat</div><div class='add'>+cluster_ftruncate</div><div class='add'>+cluster_fxattrop</div><div class='add'>+cluster_getxattr</div><div class='add'>+cluster_inodelk</div><div class='add'>+cluster_link</div><div class='add'>+cluster_lookup</div><div class='add'>+cluster_mkdir</div><div class='add'>+cluster_mknod</div><div class='add'>+cluster_open</div><div class='add'>+cluster_readlink</div><div class='add'>+cluster_replies_wipe</div><div class='add'>+cluster_rmdir</div><div class='add'>+cluster_setattr</div><div class='add'>+cluster_setxattr</div><div class='add'>+cluster_symlink</div><div class='add'>+cluster_tiebreaker_inodelk</div><div class='add'>+cluster_uninodelk</div><div class='add'>+cluster_unlink</div><div class='add'>+cluster_xattrop</div><div class='add'>+cluster_xattrop_cbk</div><div class='add'>+copy_opts_to_child</div><div class='add'>+create_frame</div><div class='add'>+data_copy</div><div class='add'>+data_destroy</div><div class='add'>+data_from_dynptr</div><div class='add'>+data_from_uint64</div><div class='add'>+data_ref</div><div class='add'>+data_to_bin</div><div class='add'>+data_to_int32</div><div class='add'>+data_to_int64</div><div class='add'>+data_to_ptr</div><div class='add'>+data_to_str</div><div class='add'>+data_to_uint16</div><div class='add'>+data_to_uint32</div><div class='add'>+data_to_uint64</div><div class='add'>+data_to_uint8</div><div class='add'>+data_to_iatt</div><div class='add'>+data_unref</div><div class='add'>+default_access</div><div class='add'>+default_access_cbk</div><div class='add'>+default_access_failure_cbk</div><div class='add'>+default_access_resume</div><div class='add'>+default_create</div><div class='add'>+default_create_cbk</div><div class='add'>+default_create_failure_cbk</div><div class='add'>+default_create_resume</div><div class='add'>+default_discard</div><div class='add'>+default_discard_cbk</div><div class='add'>+default_discard_failure_cbk</div><div class='add'>+default_discard_resume</div><div class='add'>+default_entrylk</div><div class='add'>+default_entrylk_cbk</div><div class='add'>+default_entrylk_failure_cbk</div><div class='add'>+default_entrylk_resume</div><div class='add'>+default_fallocate</div><div class='add'>+default_fallocate_cbk</div><div class='add'>+default_fallocate_failure_cbk</div><div class='add'>+default_fallocate_resume</div><div class='add'>+default_fentrylk</div><div class='add'>+default_fentrylk_cbk</div><div class='add'>+default_fentrylk_failure_cbk</div><div class='add'>+default_fentrylk_resume</div><div class='add'>+default_fgetxattr</div><div class='add'>+default_fgetxattr_cbk</div><div class='add'>+default_fgetxattr_failure_cbk</div><div class='add'>+default_fgetxattr_resume</div><div class='add'>+default_finodelk</div><div class='add'>+default_finodelk_cbk</div><div class='add'>+default_finodelk_failure_cbk</div><div class='add'>+default_finodelk_resume</div><div class='add'>+default_flush</div><div class='add'>+default_flush_cbk</div><div class='add'>+default_flush_failure_cbk</div><div class='add'>+default_flush_resume</div><div class='add'>+default_forget</div><div class='add'>+default_fremovexattr</div><div class='add'>+default_fremovexattr_cbk</div><div class='add'>+default_fremovexattr_failure_cbk</div><div class='add'>+default_fremovexattr_resume</div><div class='add'>+default_fsetattr</div><div class='add'>+default_fsetattr_cbk</div><div class='add'>+default_fsetattr_failure_cbk</div><div class='add'>+default_fsetattr_resume</div><div class='add'>+default_fsetxattr</div><div class='add'>+default_fsetxattr_cbk</div><div class='add'>+default_fsetxattr_failure_cbk</div><div class='add'>+default_fsetxattr_resume</div><div class='add'>+default_fstat</div><div class='add'>+default_fstat_cbk</div><div class='add'>+default_fstat_failure_cbk</div><div class='add'>+default_fstat_resume</div><div class='add'>+default_fsync</div><div class='add'>+default_fsync_cbk</div><div class='add'>+default_fsyncdir</div><div class='add'>+default_fsyncdir_cbk</div><div class='add'>+default_fsyncdir_failure_cbk</div><div class='add'>+default_fsyncdir_resume</div><div class='add'>+default_fsync_failure_cbk</div><div class='add'>+default_fsync_resume</div><div class='add'>+default_ftruncate</div><div class='add'>+default_ftruncate_cbk</div><div class='add'>+default_ftruncate_failure_cbk</div><div class='add'>+default_ftruncate_resume</div><div class='add'>+default_fxattrop</div><div class='add'>+default_fxattrop_cbk</div><div class='add'>+default_fxattrop_failure_cbk</div><div class='add'>+default_fxattrop_resume</div><div class='add'>+default_getactivelk</div><div class='add'>+default_getactivelk_failure_cbk</div><div class='add'>+default_getactivelk_resume</div><div class='add'>+default_getspec</div><div class='add'>+default_getspec_cbk</div><div class='add'>+default_getxattr</div><div class='add'>+default_getxattr_cbk</div><div class='add'>+default_getxattr_failure_cbk</div><div class='add'>+default_getxattr_resume</div><div class='add'>+default_inodelk</div><div class='add'>+default_inodelk_cbk</div><div class='add'>+default_inodelk_failure_cbk</div><div class='add'>+default_inodelk_resume</div><div class='add'>+default_ipc</div><div class='add'>+default_ipc_cbk</div><div class='add'>+default_lease</div><div class='add'>+default_lease_failure_cbk</div><div class='add'>+default_lease_resume</div><div class='add'>+default_link</div><div class='add'>+default_link_cbk</div><div class='add'>+default_link_failure_cbk</div><div class='add'>+default_link_resume</div><div class='add'>+default_lk</div><div class='add'>+default_lk_cbk</div><div class='add'>+default_lk_failure_cbk</div><div class='add'>+default_lk_resume</div><div class='add'>+default_lookup</div><div class='add'>+default_lookup_cbk</div><div class='add'>+default_lookup_failure_cbk</div><div class='add'>+default_lookup_resume</div><div class='add'>+default_mem_acct_init</div><div class='add'>+default_mkdir</div><div class='add'>+default_mkdir_cbk</div><div class='add'>+default_mkdir_failure_cbk</div><div class='add'>+default_mkdir_resume</div><div class='add'>+default_mknod</div><div class='add'>+default_mknod_cbk</div><div class='add'>+default_mknod_failure_cbk</div><div class='add'>+default_mknod_resume</div><div class='add'>+default_notify</div><div class='add'>+default_open</div><div class='add'>+default_open_cbk</div><div class='add'>+default_opendir</div><div class='add'>+default_opendir_cbk</div><div class='add'>+default_opendir_failure_cbk</div><div class='add'>+default_opendir_resume</div><div class='add'>+default_open_failure_cbk</div><div class='add'>+default_open_resume</div><div class='add'>+default_rchecksum</div><div class='add'>+default_rchecksum_cbk</div><div class='add'>+default_rchecksum_failure_cbk</div><div class='add'>+default_rchecksum_resume</div><div class='add'>+default_readdir</div><div class='add'>+default_readdir_cbk</div><div class='add'>+default_readdir_failure_cbk</div><div class='add'>+default_readdirp</div><div class='add'>+default_readdirp_cbk</div><div class='add'>+default_readdirp_failure_cbk</div><div class='add'>+default_readdirp_resume</div><div class='add'>+default_readdir_resume</div><div class='add'>+default_readlink</div><div class='add'>+default_readlink_cbk</div><div class='add'>+default_readlink_failure_cbk</div><div class='add'>+default_readlink_resume</div><div class='add'>+default_readv</div><div class='add'>+default_readv_cbk</div><div class='add'>+default_readv_failure_cbk</div><div class='add'>+default_readv_resume</div><div class='add'>+default_release</div><div class='add'>+default_releasedir</div><div class='add'>+default_removexattr</div><div class='add'>+default_removexattr_cbk</div><div class='add'>+default_removexattr_failure_cbk</div><div class='add'>+default_removexattr_resume</div><div class='add'>+default_rename</div><div class='add'>+default_rename_cbk</div><div class='add'>+default_rename_failure_cbk</div><div class='add'>+default_rename_resume</div><div class='add'>+default_rmdir</div><div class='add'>+default_rmdir_cbk</div><div class='add'>+default_rmdir_failure_cbk</div><div class='add'>+default_rmdir_resume</div><div class='add'>+default_seek</div><div class='add'>+default_seek_cbk</div><div class='add'>+default_seek_failure_cbk</div><div class='add'>+default_seek_resume</div><div class='add'>+default_setactivelk</div><div class='add'>+default_setactivelk_failure_cbk</div><div class='add'>+default_setactivelk_resume</div><div class='add'>+default_setattr</div><div class='add'>+default_setattr_cbk</div><div class='add'>+default_setattr_failure_cbk</div><div class='add'>+default_setattr_resume</div><div class='add'>+default_setxattr</div><div class='add'>+default_setxattr_cbk</div><div class='add'>+default_setxattr_failure_cbk</div><div class='add'>+default_setxattr_resume</div><div class='add'>+default_stat</div><div class='add'>+default_stat_cbk</div><div class='add'>+default_stat_failure_cbk</div><div class='add'>+default_statfs</div><div class='add'>+default_statfs_cbk</div><div class='add'>+default_statfs_failure_cbk</div><div class='add'>+default_statfs_resume</div><div class='add'>+default_stat_resume</div><div class='add'>+default_symlink</div><div class='add'>+default_symlink_cbk</div><div class='add'>+default_symlink_failure_cbk</div><div class='add'>+default_symlink_resume</div><div class='add'>+default_truncate</div><div class='add'>+default_truncate_cbk</div><div class='add'>+default_truncate_failure_cbk</div><div class='add'>+default_truncate_resume</div><div class='add'>+default_unlink</div><div class='add'>+default_unlink_cbk</div><div class='add'>+default_unlink_failure_cbk</div><div class='add'>+default_unlink_resume</div><div class='add'>+default_writev</div><div class='add'>+default_writev_cbk</div><div class='add'>+default_writev_failure_cbk</div><div class='add'>+default_writev_resume</div><div class='add'>+default_xattrop</div><div class='add'>+default_xattrop_cbk</div><div class='add'>+default_xattrop_failure_cbk</div><div class='add'>+default_xattrop_resume</div><div class='add'>+default_zerofill</div><div class='add'>+default_zerofill_cbk</div><div class='add'>+default_zerofill_failure_cbk</div><div class='add'>+default_zerofill_resume</div><div class='add'>+default_put</div><div class='add'>+default_put_cbk</div><div class='add'>+default_put_failure_cbk</div><div class='add'>+default_put_resume</div><div class='add'>+default_copy_file_range</div><div class='add'>+default_copy_file_range_cbk</div><div class='add'>+default_copy_file_range_failure_cbk</div><div class='add'>+default_copy_file_range_resume</div><div class='add'>+dht_is_linkfile</div><div class='add'>+dict_add</div><div class='add'>+dict_addn</div><div class='add'>+dict_add_dynstr_with_alloc</div><div class='add'>+dict_allocate_and_serialize</div><div class='add'>+dict_copy</div><div class='add'>+dict_copy_with_ref</div><div class='add'>+dict_del</div><div class='add'>+dict_deln</div><div class='add'>+dict_dump_to_statedump</div><div class='add'>+dict_dump_to_str</div><div class='add'>+dict_dump_to_log</div><div class='add'>+dict_foreach</div><div class='add'>+dict_foreach_fnmatch</div><div class='add'>+dict_foreach_match</div><div class='add'>+dict_for_key_value</div><div class='add'>+dict_get</div><div class='add'>+dict_getn</div><div class='add'>+dict_get_bin</div><div class='add'>+dict_get_double</div><div class='add'>+dict_get_gfuuid</div><div class='add'>+dict_get_iatt</div><div class='add'>+dict_get_mdata</div><div class='add'>+dict_get_int16</div><div class='add'>+dict_get_int32</div><div class='add'>+dict_get_int32n</div><div class='add'>+dict_get_int64</div><div class='add'>+dict_get_int8</div><div class='add'>+dict_get_ptr</div><div class='add'>+dict_get_ptr_and_len</div><div class='add'>+dict_get_str</div><div class='add'>+dict_get_strn</div><div class='add'>+dict_get_str_boolean</div><div class='add'>+dict_get_uint32</div><div class='add'>+dict_get_uint64</div><div class='add'>+dict_get_with_ref</div><div class='add'>+dict_has_key_from_array</div><div class='add'>+dict_key_count</div><div class='add'>+dict_keys_join</div><div class='add'>+dict_lookup</div><div class='add'>+dict_new</div><div class='add'>+dict_null_foreach_fn</div><div class='add'>+dict_ref</div><div class='add'>+dict_remove_foreach_fn</div><div class='add'>+dict_rename_key</div><div class='add'>+dict_reset</div><div class='add'>+dict_serialize</div><div class='add'>+dict_serialized_length</div><div class='add'>+dict_serialized_length_lk</div><div class='add'>+dict_serialize_value_with_delim</div><div class='add'>+dict_set</div><div class='add'>+dict_setn</div><div class='add'>+dict_set_bin</div><div class='add'>+dict_set_double</div><div class='add'>+dict_set_dynptr</div><div class='add'>+dict_set_dynstr</div><div class='add'>+dict_set_dynstrn</div><div class='add'>+dict_set_dynstr_with_alloc</div><div class='add'>+dict_set_gfuuid</div><div class='add'>+dict_set_iatt</div><div class='add'>+dict_set_mdata</div><div class='add'>+dict_set_int16</div><div class='add'>+dict_set_int32</div><div class='add'>+dict_set_int32n</div><div class='add'>+dict_set_int64</div><div class='add'>+dict_set_int8</div><div class='add'>+dict_set_static_bin</div><div class='add'>+dict_set_static_ptr</div><div class='add'>+dict_set_str</div><div class='add'>+dict_set_strn</div><div class='add'>+dict_setn_nstrn</div><div class='add'>+dict_set_nstrn</div><div class='add'>+dict_set_uint32</div><div class='add'>+dict_set_uint64</div><div class='add'>+dict_set_flag</div><div class='add'>+dict_clear_flag</div><div class='add'>+dict_check_flag</div><div class='add'>+dict_unref</div><div class='add'>+dict_unserialize</div><div class='add'>+drop_token</div><div class='add'>+eh_destroy</div><div class='add'>+eh_dump</div><div class='add'>+eh_new</div><div class='add'>+eh_save_history</div><div class='add'>+entry_copy</div><div class='add'>+gf_event_dispatch</div><div class='add'>+gf_event_dispatch_destroy</div><div class='add'>+gf_event_handled</div><div class='add'>+gf_event_pool_destroy</div><div class='add'>+gf_event_pool_new</div><div class='add'>+gf_event_reconfigure_threads</div><div class='add'>+gf_event_register</div><div class='add'>+gf_event_select_on</div><div class='add'>+gf_event_unregister</div><div class='add'>+gf_event_unregister_close</div><div class='add'>+fd_anonymous</div><div class='add'>+fd_anonymous_with_flags</div><div class='add'>+fd_bind</div><div class='add'>+fd_close</div><div class='add'>+fd_create</div><div class='add'>+fd_create_uint64</div><div class='add'>+__fd_ctx_del</div><div class='add'>+fd_ctx_del</div><div class='add'>+fd_ctx_dump</div><div class='add'>+__fd_ctx_get</div><div class='add'>+fd_ctx_get</div><div class='add'>+__fd_ctx_set</div><div class='add'>+fd_ctx_set</div><div class='add'>+fd_is_anonymous</div><div class='add'>+fd_list_empty</div><div class='add'>+fd_lk_ctx_empty</div><div class='add'>+fd_lk_ctx_ref</div><div class='add'>+fd_lk_ctx_unref</div><div class='add'>+fd_lk_insert_and_merge</div><div class='add'>+fd_lookup</div><div class='add'>+fd_lookup_anonymous</div><div class='add'>+fd_lookup_uint64</div><div class='add'>+__fd_ref</div><div class='add'>+fd_ref</div><div class='add'>+fd_unref</div><div class='add'>+_fini</div><div class='add'>+fop_access_stub</div><div class='add'>+fop_create_stub</div><div class='add'>+fop_copy_file_range_stub</div><div class='add'>+fop_copy_file_range_cbk_stub</div><div class='add'>+fop_discard_stub</div><div class='add'>+fop_entrylk_stub</div><div class='add'>+fop_enum_to_pri_string</div><div class='add'>+fop_fallocate_stub</div><div class='add'>+fop_fentrylk_stub</div><div class='add'>+fop_fgetxattr_stub</div><div class='add'>+fop_finodelk_stub</div><div class='add'>+fop_flush_stub</div><div class='add'>+fop_fremovexattr_cbk_stub</div><div class='add'>+fop_fremovexattr_stub</div><div class='add'>+fop_fsetattr_stub</div><div class='add'>+fop_fsetxattr_cbk_stub</div><div class='add'>+fop_fsetxattr_stub</div><div class='add'>+fop_fstat_stub</div><div class='add'>+fop_fsync_cbk_stub</div><div class='add'>+fop_fsyncdir_stub</div><div class='add'>+fop_fsync_stub</div><div class='add'>+fop_ftruncate_cbk_stub</div><div class='add'>+fop_ftruncate_stub</div><div class='add'>+fop_fxattrop_stub</div><div class='add'>+fop_getactivelk_stub</div><div class='add'>+fop_getxattr_stub</div><div class='add'>+fop_icreate_stub</div><div class='add'>+fop_inodelk_stub</div><div class='add'>+fop_ipc_stub</div><div class='add'>+fop_lease_stub</div><div class='add'>+fop_link_stub</div><div class='add'>+fop_lk_stub</div><div class='add'>+fop_log_level</div><div class='add'>+fop_lookup_cbk_stub</div><div class='add'>+fop_lookup_stub</div><div class='add'>+fop_mkdir_stub</div><div class='add'>+fop_mknod_stub</div><div class='add'>+fop_namelink_stub</div><div class='add'>+fop_opendir_stub</div><div class='add'>+fop_open_stub</div><div class='add'>+fop_put_stub</div><div class='add'>+fop_rchecksum_stub</div><div class='add'>+fop_readdirp_stub</div><div class='add'>+fop_readdir_stub</div><div class='add'>+fop_readlink_stub</div><div class='add'>+fop_readv_stub</div><div class='add'>+fop_removexattr_cbk_stub</div><div class='add'>+fop_removexattr_stub</div><div class='add'>+fop_rename_cbk_stub</div><div class='add'>+fop_rename_stub</div><div class='add'>+fop_rmdir_cbk_stub</div><div class='add'>+fop_rmdir_stub</div><div class='add'>+fop_seek_stub</div><div class='add'>+fop_setactivelk_stub</div><div class='add'>+fop_setattr_stub</div><div class='add'>+fop_setxattr_stub</div><div class='add'>+fop_statfs_stub</div><div class='add'>+fop_stat_stub</div><div class='add'>+fop_symlink_stub</div><div class='add'>+fop_truncate_cbk_stub</div><div class='add'>+fop_truncate_stub</div><div class='add'>+fop_unlink_cbk_stub</div><div class='add'>+fop_unlink_stub</div><div class='add'>+fop_writev_cbk_stub</div><div class='add'>+fop_writev_stub</div><div class='add'>+fop_xattrop_stub</div><div class='add'>+fop_zerofill_stub</div><div class='add'>+generate_glusterfs_ctx_id</div><div class='add'>+get_checksum_for_file</div><div class='add'>+get_checksum_for_path</div><div class='add'>+get_file_mtime</div><div class='add'>+get_host_name</div><div class='add'>+get_mem_size</div><div class='add'>+get_path_name</div><div class='add'>+get_xlator_by_name</div><div class='add'>+get_xlator_by_type</div><div class='add'>+gf_array_insertionsort</div><div class='add'>+gf_asprintf</div><div class='add'>+gf_async</div><div class='add'>+gf_async_adjust_threads</div><div class='add'>+gf_async_ctrl</div><div class='add'>+gf_async_init</div><div class='add'>+gf_async_fini</div><div class='add'>+gf_backtrace_save</div><div class='add'>+gf_bits_count</div><div class='add'>+gf_bits_index</div><div class='add'>+gf_build_absolute_path</div><div class='add'>+__gf_calloc</div><div class='add'>+gf_canonicalize_path</div><div class='add'>+gf_check_log_format</div><div class='add'>+gf_check_logger</div><div class='add'>+gf_client_disconnect</div><div class='add'>+gf_client_dump_fdtables</div><div class='add'>+gf_client_dump_fdtables_to_dict</div><div class='add'>+gf_client_dump_inodes</div><div class='add'>+gf_client_dump_inodes_to_dict</div><div class='add'>+gf_client_get</div><div class='add'>+gf_client_put</div><div class='add'>+gf_client_ref</div><div class='add'>+gf_clienttable_alloc</div><div class='add'>+gf_client_unref</div><div class='add'>+gf_cmd_log</div><div class='add'>+gf_cmd_log_init</div><div class='add'>+gf_compare_sockaddr</div><div class='add'>+gf_deitransform</div><div class='add'>+gf_dirent_entry_free</div><div class='add'>+gf_dirent_for_name</div><div class='add'>+gf_dirent_free</div><div class='add'>+gf_dirent_orig_offset</div><div class='add'>+gf_dm_hashfn</div><div class='add'>+gf_dnscache_init</div><div class='add'>+gf_dnscache_deinit</div><div class='add'>+gf_errno_to_error</div><div class='add'>+gf_error_to_errno</div><div class='add'>+_gf_event</div><div class='add'>+gf_fd_fdptr_get</div><div class='add'>+gf_fd_fdtable_alloc</div><div class='add'>+gf_fd_fdtable_copy_all_fds</div><div class='add'>+gf_fd_fdtable_destroy</div><div class='add'>+gf_fd_fdtable_get_all_fds</div><div class='add'>+gf_fdptr_put</div><div class='add'>+gf_fd_put</div><div class='add'>+gf_fd_unused_get</div><div class='add'>+gf_fill_iatt_for_dirent</div><div class='add'>+gf_fop_int</div><div class='add'>+gf_fop_string</div><div class='add'>+__gf_free</div><div class='add'>+gf_free_mig_locks</div><div class='add'>+gf_getgrouplist</div><div class='add'>+gf_get_hostname_from_ip</div><div class='add'>+gf_get_index_by_elem</div><div class='add'>+gf_global_mem_acct_enable_set</div><div class='add'>+gfid_to_ino</div><div class='add'>+gf_inode_type_to_str</div><div class='add'>+gf_is_ip_in_net</div><div class='add'>+gf_is_local_addr</div><div class='add'>+gf_is_same_address</div><div class='add'>+gf_is_service_running</div><div class='add'>+gf_is_str_int</div><div class='add'>+gf_is_valid_xattr_namespace</div><div class='add'>+gf_is_zero_filled_stat</div><div class='add'>+gf_itransform</div><div class='add'>+gf_link_inodes_from_dirent</div><div class='add'>+_gf_log</div><div class='add'>+_gf_log_callingfn</div><div class='add'>+gf_log_disable_suppression_before_exit</div><div class='add'>+gf_log_dump_graph</div><div class='add'>+_gf_log_eh</div><div class='add'>+gf_log_fini</div><div class='add'>+gf_log_get_localtime</div><div class='add'>+gf_log_get_loglevel</div><div class='add'>+gf_log_globals_init</div><div class='add'>+gf_log_init</div><div class='add'>+gf_log_inject_timer_event</div><div class='add'>+gf_log_logrotate</div><div class='add'>+gf_log_set_localtime</div><div class='add'>+gf_log_set_log_buf_size</div><div class='add'>+gf_log_set_log_flush_timeout</div><div class='add'>+gf_log_set_logformat</div><div class='add'>+gf_log_set_logger</div><div class='add'>+gf_log_set_loglevel</div><div class='add'>+gf_lstat_dir</div><div class='add'>+__gf_malloc</div><div class='add'>+gf_mem_acct_enable_set</div><div class='add'>+gf_monitor_metrics</div><div class='add'>+_gf_msg</div><div class='add'>+_gf_msg_nomem</div><div class='add'>+gf_nwrite</div><div class='add'>+gf_path_strip_trailing_slashes</div><div class='add'>+gf_print_trace</div><div class='add'>+gf_proc_dump_add_section</div><div class='add'>+gf_proc_dump_info</div><div class='add'>+gf_proc_dump_init</div><div class='add'>+gf_proc_dump_mallinfo</div><div class='add'>+gf_proc_dump_mem_info</div><div class='add'>+gf_proc_dump_mem_info_to_dict</div><div class='add'>+gf_proc_dump_mempool_info</div><div class='add'>+gf_proc_dump_mempool_info_to_dict</div><div class='add'>+gf_proc_dump_pending_frames</div><div class='add'>+gf_proc_dump_pending_frames_to_dict</div><div class='add'>+gf_proc_dump_write</div><div class='add'>+gf_proc_dump_xlator_history</div><div class='add'>+gf_proc_dump_xlator_meminfo</div><div class='add'>+gf_proc_dump_xlator_private</div><div class='add'>+gf_proc_dump_xlator_profile</div><div class='add'>+gf_process_getspec_servers_list</div><div class='add'>+gf_process_reserved_ports</div><div class='add'>+__gf_realloc</div><div class='add'>+_gf_ref_get</div><div class='add'>+_gf_ref_init</div><div class='add'>+_gf_ref_put</div><div class='add'>+gf_resolve_ip6</div><div class='add'>+gf_resolve_path_parent</div><div class='add'>+gf_rev_dns_lookup</div><div class='add'>+gf_rev_dns_lookup_cached</div><div class='add'>+gf_rsync_strong_checksum</div><div class='add'>+gf_rsync_md5_checksum</div><div class='add'>+gf_rsync_weak_checksum</div><div class='add'>+gf_set_log_file_path</div><div class='add'>+gf_set_log_ident</div><div class='add'>+gf_set_timestamp</div><div class='add'>+gf_set_volfile_server_common</div><div class='add'>+_gf_smsg</div><div class='add'>+gf_sock_union_equal_addr</div><div class='add'>+gf_store_handle_create_on_absence</div><div class='add'>+gf_store_handle_destroy</div><div class='add'>+gf_store_handle_new</div><div class='add'>+gf_store_handle_retrieve</div><div class='add'>+gf_store_iter_destroy</div><div class='add'>+gf_store_iter_get_matching</div><div class='add'>+gf_store_iter_get_next</div><div class='add'>+gf_store_iter_new</div><div class='add'>+gf_store_lock</div><div class='add'>+gf_store_locked_local</div><div class='add'>+gf_store_mkdir</div><div class='add'>+gf_store_mkstemp</div><div class='add'>+gf_store_read_and_tokenize</div><div class='add'>+gf_store_rename_tmppath</div><div class='add'>+gf_store_retrieve_value</div><div class='add'>+gf_store_save_value</div><div class='add'>+gf_store_save_items</div><div class='add'>+gf_store_unlink_tmppath</div><div class='add'>+gf_store_unlock</div><div class='add'>+gf_string2boolean</div><div class='add'>+gf_string2bytesize_int64</div><div class='add'>+gf_string2bytesize_uint64</div><div class='add'>+gf_string2double</div><div class='add'>+gf_string2int</div><div class='add'>+gf_string2int32</div><div class='add'>+gf_string2percent</div><div class='add'>+gf_string2time</div><div class='add'>+gf_string2uint</div><div class='add'>+gf_string2uint32</div><div class='add'>+gf_string2uint64</div><div class='add'>+gf_string2uint_base10</div><div class='add'>+gf_strip_whitespace</div><div class='add'>+gf_strncpy</div><div class='add'>+gf_strTrim</div><div class='add'>+gf_strstr</div><div class='add'>+gf_thread_cleanup_xint</div><div class='add'>+gf_thread_create</div><div class='add'>+gf_thread_vcreate</div><div class='add'>+gf_thread_create_detached</div><div class='add'>+gf_thread_set_name</div><div class='add'>+gf_thread_set_vname</div><div class='add'>+gf_timer_call_after</div><div class='add'>+gf_timer_call_cancel</div><div class='add'>+gf_timer_registry_destroy</div><div class='add'>+_gf_timestuff</div><div class='add'>+gf_trim</div><div class='add'>+gf_tw_add_timer</div><div class='add'>+gf_tw_del_timer</div><div class='add'>+gf_tw_mod_timer</div><div class='add'>+gf_tw_mod_timer_pending</div><div class='add'>+gf_uint64_2human_readable</div><div class='add'>+gf_umount_lazy</div><div class='add'>+gf_update_latency</div><div class='add'>+gf_uuid_clear</div><div class='add'>+gf_uuid_compare</div><div class='add'>+gf_uuid_copy</div><div class='add'>+gf_uuid_is_null</div><div class='add'>+gf_uuid_generate</div><div class='add'>+gf_uuid_parse</div><div class='add'>+gf_uuid_unparse</div><div class='add'>+gf_valid_pid</div><div class='add'>+gf_vasprintf</div><div class='add'>+gf_volfile_reconfigure</div><div class='add'>+gf_xxh64_wrapper</div><div class='add'>+gf_zero_fill_stat</div><div class='add'>+gid_cache_add</div><div class='add'>+gid_cache_init</div><div class='add'>+gid_cache_lookup</div><div class='add'>+gid_cache_reconf</div><div class='add'>+gid_cache_release</div><div class='add'>+glusterd_check_log_level</div><div class='add'>+glusterfs_compute_sha256</div><div class='add'>+glusterfs_ctx_new</div><div class='add'>+glusterfs_ctx_tw_get</div><div class='add'>+glusterfs_ctx_tw_put</div><div class='add'>+glusterfs_delete_volfile_checksum</div><div class='add'>+glusterfs_globals_init</div><div class='add'>+glusterfs_graph_activate</div><div class='add'>+glusterfs_graph_attach</div><div class='add'>+glusterfs_graph_construct</div><div class='add'>+glusterfs_graph_deactivate</div><div class='add'>+glusterfs_graph_destroy</div><div class='add'>+glusterfs_graph_destroy_residual</div><div class='add'>+glusterfs_graph_prepare</div><div class='add'>+glusterfs_read_secure_access_file</div><div class='add'>+glusterfs_graph_print_file</div><div class='add'>+glusterfs_graph_set_first</div><div class='add'>+glusterfs_is_local_pathinfo</div><div class='add'>+glusterfs_leaf_position</div><div class='add'>+glusterfs_reachable_leaves</div><div class='add'>+__glusterfs_this_location</div><div class='add'>+glusterfs_this_set</div><div class='add'>+glusterfs_volfile_reconfigure</div><div class='add'>+glusterfs_xlator_link</div><div class='add'>+graph_reconf_validateopt</div><div class='add'>+_init</div><div class='add'>+inode_ctx_del2</div><div class='add'>+__inode_ctx_get0</div><div class='add'>+inode_ctx_get0</div><div class='add'>+__inode_ctx_get1</div><div class='add'>+inode_ctx_get1</div><div class='add'>+__inode_ctx_get2</div><div class='add'>+inode_ctx_get2</div><div class='add'>+inode_ctx_merge</div><div class='add'>+inode_ctx_reset0</div><div class='add'>+inode_ctx_reset1</div><div class='add'>+inode_ctx_reset2</div><div class='add'>+__inode_ctx_set0</div><div class='add'>+inode_ctx_set0</div><div class='add'>+__inode_ctx_set1</div><div class='add'>+inode_ctx_set1</div><div class='add'>+__inode_ctx_set2</div><div class='add'>+inode_ctx_set2</div><div class='add'>+inode_ctx_size</div><div class='add'>+inode_dump</div><div class='add'>+inode_dump_to_dict</div><div class='add'>+__inode_find</div><div class='add'>+inode_find</div><div class='add'>+inode_find_directory_name</div><div class='add'>+inode_forget</div><div class='add'>+inode_forget_with_unref</div><div class='add'>+inode_from_path</div><div class='add'>+inode_grep</div><div class='add'>+inode_grep_for_gfid</div><div class='add'>+inode_has_dentry</div><div class='add'>+inode_invalidate</div><div class='add'>+inode_is_linked</div><div class='add'>+inode_link</div><div class='add'>+inode_lookup</div><div class='add'>+inode_needs_lookup</div><div class='add'>+inode_new</div><div class='add'>+inode_parent</div><div class='add'>+__inode_path</div><div class='add'>+inode_path</div><div class='add'>+inode_ref</div><div class='add'>+inode_ref_reduce_by_n</div><div class='add'>+inode_rename</div><div class='add'>+inode_resolve</div><div class='add'>+inode_set_need_lookup</div><div class='add'>+inode_table_ctx_free</div><div class='add'>+inode_table_destroy</div><div class='add'>+inode_table_destroy_all</div><div class='add'>+inode_table_dump</div><div class='add'>+inode_table_dump_to_dict</div><div class='add'>+inode_table_new</div><div class='add'>+inode_table_with_invalidator</div><div class='add'>+__inode_table_set_lru_limit</div><div class='add'>+inode_table_set_lru_limit</div><div class='add'>+inode_unlink</div><div class='add'>+inode_unref</div><div class='add'>+int_to_data</div><div class='add'>+iobref_add</div><div class='add'>+iobref_clear</div><div class='add'>+iobref_merge</div><div class='add'>+iobref_new</div><div class='add'>+iobref_ref</div><div class='add'>+iobref_size</div><div class='add'>+iobref_unref</div><div class='add'>+iobuf_get</div><div class='add'>+iobuf_get2</div><div class='add'>+iobuf_get_page_aligned</div><div class='add'>+iobuf_pool_destroy</div><div class='add'>+iobuf_pool_new</div><div class='add'>+iobuf_size</div><div class='add'>+iobuf_to_iovec</div><div class='add'>+iobuf_unref</div><div class='add'>+iobuf_copy</div><div class='add'>+is_data_equal</div><div class='add'>+__is_fuse_call</div><div class='add'>+is_gf_log_command</div><div class='add'>+is_graph_topology_equal</div><div class='add'>+__is_root_gfid</div><div class='add'>+is_valid_lease_id</div><div class='add'>+leaseid_utoa</div><div class='add'>+gf_existing_leaseid</div><div class='add'>+gf_leaseid_get</div><div class='add'>+list_node_add</div><div class='add'>+list_node_add_order</div><div class='add'>+list_node_del</div><div class='add'>+lkowner_utoa</div><div class='add'>+loc_copy</div><div class='add'>+loc_copy_overload_parent</div><div class='add'>+loc_gfid</div><div class='add'>+loc_gfid_utoa</div><div class='add'>+loc_is_nameless</div><div class='add'>+loc_is_root</div><div class='add'>+loc_pargfid</div><div class='add'>+loc_path</div><div class='add'>+loc_touchup</div><div class='add'>+loc_wipe</div><div class='add'>+log_base2</div><div class='add'>+_mask_cancellation</div><div class='add'>+mask_match</div><div class='add'>+mem_get</div><div class='add'>+mem_get0</div><div class='add'>+mem_pool_destroy</div><div class='add'>+mem_pool_new_fn</div><div class='add'>+mem_pools_fini</div><div class='add'>+mem_pools_init</div><div class='add'>+mem_put</div><div class='add'>+mkdir_p</div><div class='add'>+next_token</div><div class='add'>+nwstrtail</div><div class='add'>+os_daemon</div><div class='add'>+os_daemon_return</div><div class='add'>+parser_deinit</div><div class='add'>+parser_get_next_match</div><div class='add'>+parser_init</div><div class='add'>+parser_set_string</div><div class='add'>+parser_unset_string</div><div class='add'>+quota_conf_read_gfid</div><div class='add'>+quota_conf_read_version</div><div class='add'>+quota_conf_skip_header</div><div class='add'>+quota_data_to_meta</div><div class='add'>+quota_dict_get_inode_meta</div><div class='add'>+quota_dict_get_meta</div><div class='add'>+quota_dict_set_meta</div><div class='add'>+quota_meta_is_null</div><div class='add'>+rb_create</div><div class='add'>+rb_delete</div><div class='add'>+rb_destroy</div><div class='add'>+rb_find</div><div class='add'>+rb_probe</div><div class='add'>+rbthash_get</div><div class='add'>+rbthash_insert</div><div class='add'>+rbthash_remove</div><div class='add'>+rbthash_table_destroy</div><div class='add'>+rbthash_table_init</div><div class='add'>+rbuf_dtor</div><div class='add'>+rbuf_get_buffer</div><div class='add'>+rbuf_init</div><div class='add'>+rbuf_reserve_write_area</div><div class='add'>+rbuf_wait_for_completion</div><div class='add'>+rbuf_write_complete</div><div class='add'>+recursive_rmdir</div><div class='add'>+runcmd</div><div class='add'>+runinit</div><div class='add'>+runner</div><div class='add'>+runner_add_arg</div><div class='add'>+runner_add_args</div><div class='add'>+runner_argprintf</div><div class='add'>+runner_chio</div><div class='add'>+runner_end</div><div class='add'>+runner_log</div><div class='add'>+runner_redir</div><div class='add'>+runner_run</div><div class='add'>+runner_run_nowait</div><div class='add'>+runner_run_reuse</div><div class='add'>+runner_start</div><div class='add'>+set_sys_log_level</div><div class='add'>+skipwhite</div><div class='add'>+strfd_close</div><div class='add'>+strfd_open</div><div class='add'>+strprintf</div><div class='add'>+strtail</div><div class='add'>+str_to_data</div><div class='add'>+SuperFastHash</div><div class='add'>+syncbarrier_destroy</div><div class='add'>+syncbarrier_init</div><div class='add'>+syncbarrier_wait</div><div class='add'>+syncbarrier_wake</div><div class='add'>+synccond_init</div><div class='add'>+synccond_destroy</div><div class='add'>+synccond_wait</div><div class='add'>+synccond_timedwait</div><div class='add'>+synccond_signal</div><div class='add'>+synccond_broadcast</div><div class='add'>+syncenv_destroy</div><div class='add'>+syncenv_new</div><div class='add'>+synclock_destroy</div><div class='add'>+synclock_init</div><div class='add'>+synclock_lock</div><div class='add'>+synclock_trylock</div><div class='add'>+synclock_unlock</div><div class='add'>+syncop_access</div><div class='add'>+syncop_close</div><div class='add'>+syncop_create</div><div class='add'>+syncop_copy_file_range</div><div class='add'>+syncopctx_getctx</div><div class='add'>+syncopctx_setfsgid</div><div class='add'>+syncopctx_setfsgroups</div><div class='add'>+syncopctx_setfslkowner</div><div class='add'>+syncopctx_setfspid</div><div class='add'>+syncopctx_setfsuid</div><div class='add'>+syncop_dirfd</div><div class='add'>+syncop_dir_scan</div><div class='add'>+syncop_discard</div><div class='add'>+syncop_fallocate</div><div class='add'>+syncop_flush</div><div class='add'>+syncop_fgetxattr</div><div class='add'>+syncop_fremovexattr</div><div class='add'>+syncop_fsetattr</div><div class='add'>+syncop_fsetxattr</div><div class='add'>+syncop_fstat</div><div class='add'>+syncop_fsync</div><div class='add'>+syncop_fsyncdir</div><div class='add'>+syncop_ftruncate</div><div class='add'>+syncop_ftw</div><div class='add'>+syncop_ftw_throttle</div><div class='add'>+syncop_fxattrop</div><div class='add'>+syncop_getactivelk</div><div class='add'>+syncop_getxattr</div><div class='add'>+syncop_gfid_to_path</div><div class='add'>+syncop_gfid_to_path_hard</div><div class='add'>+syncop_inode_find</div><div class='add'>+syncop_inodelk</div><div class='add'>+syncop_entrylk</div><div class='add'>+syncop_ipc</div><div class='add'>+syncop_is_subvol_local</div><div class='add'>+syncop_link</div><div class='add'>+syncop_listxattr</div><div class='add'>+syncop_lk</div><div class='add'>+syncop_lookup</div><div class='add'>+syncop_mkdir</div><div class='add'>+syncop_mknod</div><div class='add'>+syncop_mt_dir_scan</div><div class='add'>+syncop_open</div><div class='add'>+syncop_opendir</div><div class='add'>+syncop_readdir</div><div class='add'>+syncop_readdirp</div><div class='add'>+syncop_readlink</div><div class='add'>+syncop_readv</div><div class='add'>+syncop_removexattr</div><div class='add'>+syncop_rename</div><div class='add'>+syncop_rmdir</div><div class='add'>+syncop_seek</div><div class='add'>+syncop_setactivelk</div><div class='add'>+syncop_setattr</div><div class='add'>+syncop_setxattr</div><div class='add'>+syncop_stat</div><div class='add'>+syncop_statfs</div><div class='add'>+syncop_symlink</div><div class='add'>+syncop_truncate</div><div class='add'>+syncop_unlink</div><div class='add'>+syncop_write</div><div class='add'>+syncop_writev</div><div class='add'>+syncop_xattrop</div><div class='add'>+syncop_zerofill</div><div class='add'>+syncop_lease</div><div class='add'>+synctask_get</div><div class='add'>+synctask_new</div><div class='add'>+synctask_new1</div><div class='add'>+synctask_set</div><div class='add'>+synctask_setid</div><div class='add'>+synctask_sleep</div><div class='add'>+synctask_wake</div><div class='add'>+synctask_yield</div><div class='add'>+sys_access</div><div class='add'>+sys_chmod</div><div class='add'>+sys_chown</div><div class='add'>+sys_close</div><div class='add'>+sys_closedir</div><div class='add'>+sys_copy_file_range</div><div class='add'>+sys_creat</div><div class='add'>+sys_fallocate</div><div class='add'>+sys_fchmod</div><div class='add'>+sys_fchown</div><div class='add'>+sys_fdatasync</div><div class='add'>+sys_fgetxattr</div><div class='add'>+sys_flistxattr</div><div class='add'>+sys_fremovexattr</div><div class='add'>+sys_fsetxattr</div><div class='add'>+sys_fstat</div><div class='add'>+sys_fstatat</div><div class='add'>+sys_fsync</div><div class='add'>+sys_ftruncate</div><div class='add'>+sys_futimes</div><div class='add'>+sys_lchown</div><div class='add'>+sys_lgetxattr</div><div class='add'>+sys_link</div><div class='add'>+sys_linkat</div><div class='add'>+sys_llistxattr</div><div class='add'>+sys_lremovexattr</div><div class='add'>+sys_lseek</div><div class='add'>+sys_lsetxattr</div><div class='add'>+sys_lstat</div><div class='add'>+sys_mkdir</div><div class='add'>+sys_mkdirat</div><div class='add'>+sys_mknod</div><div class='add'>+sys_open</div><div class='add'>+sys_openat</div><div class='add'>+sys_opendir</div><div class='add'>+sys_pread</div><div class='add'>+sys_pwrite</div><div class='add'>+sys_pwritev</div><div class='add'>+sys_read</div><div class='add'>+sys_readdir</div><div class='add'>+sys_readlink</div><div class='add'>+sys_readv</div><div class='add'>+sys_rename</div><div class='add'>+sys_rmdir</div><div class='add'>+sys_stat</div><div class='add'>+sys_statvfs</div><div class='add'>+sys_symlink</div><div class='add'>+sys_symlinkat</div><div class='add'>+sys_truncate</div><div class='add'>+sys_unlink</div><div class='add'>+sys_unlinkat</div><div class='add'>+sys_utimensat</div><div class='add'>+sys_write</div><div class='add'>+sys_writev</div><div class='add'>+sys_socket</div><div class='add'>+sys_accept</div><div class='add'>+sys_kill</div><div class='add'>+sys_sysctl</div><div class='add'>+tbf_init</div><div class='add'>+tbf_throttle</div><div class='add'>+timespec_now</div><div class='add'>+timespec_now_realtime</div><div class='add'>+timespec_sub</div><div class='add'>+timespec_adjust_delta</div><div class='add'>+timespec_cmp</div><div class='add'>+token_iter_init</div><div class='add'>+trap</div><div class='add'>+trie_add</div><div class='add'>+trie_destroy</div><div class='add'>+trie_measure</div><div class='add'>+trie_measure_vec</div><div class='add'>+trie_new</div><div class='add'>+trienode_get_word</div><div class='add'>+_unmask_cancellation</div><div class='add'>+uuid_utoa</div><div class='add'>+uuid_utoa_r</div><div class='add'>+validate_brick_name</div><div class='add'>+valid_host_name</div><div class='add'>+valid_ipv4_address</div><div class='add'>+valid_internet_address</div><div class='add'>+xlator_destroy</div><div class='add'>+xlator_foreach</div><div class='add'>+xlator_foreach_depth_first</div><div class='add'>+xlator_init</div><div class='add'>+xlator_mem_acct_init</div><div class='add'>+xlator_mem_acct_unref</div><div class='add'>+xlator_notify</div><div class='add'>+xlator_option_info_list</div><div class='add'>+xlator_option_init_bool</div><div class='add'>+xlator_option_init_double</div><div class='add'>+xlator_option_init_int32</div><div class='add'>+xlator_option_init_path</div><div class='add'>+xlator_option_init_percent</div><div class='add'>+xlator_option_init_percent_or_size</div><div class='add'>+xlator_option_init_size</div><div class='add'>+xlator_option_init_size_uint64</div><div class='add'>+xlator_option_init_size_int64</div><div class='add'>+xlator_option_init_str</div><div class='add'>+xlator_option_init_time</div><div class='add'>+xlator_option_init_uint32</div><div class='add'>+xlator_option_init_uint64</div><div class='add'>+xlator_option_init_int64</div><div class='add'>+xlator_option_init_xlator</div><div class='add'>+xlator_option_reconf_bool</div><div class='add'>+xlator_option_reconf_int32</div><div class='add'>+xlator_option_reconf_path</div><div class='add'>+xlator_option_reconf_percent</div><div class='add'>+xlator_option_reconf_percent_or_size</div><div class='add'>+xlator_option_reconf_size</div><div class='add'>+xlator_option_reconf_size_uint64</div><div class='add'>+xlator_option_reconf_size_int64</div><div class='add'>+xlator_option_reconf_str</div><div class='add'>+xlator_option_reconf_time</div><div class='add'>+xlator_option_reconf_uint32</div><div class='add'>+xlator_option_reconf_uint64</div><div class='add'>+xlator_option_reconf_int64</div><div class='add'>+xlator_option_reconf_xlator</div><div class='add'>+xlator_options_validate</div><div class='add'>+xlator_options_validate_list</div><div class='add'>+xlator_option_validate</div><div class='add'>+xlator_option_validate_addr_list</div><div class='add'>+xlator_search_by_name</div><div class='add'>+xlator_set_inode_lru_limit</div><div class='add'>+xlator_set_type</div><div class='add'>+xlator_set_type_virtual</div><div class='add'>+xlator_subvolume_count</div><div class='add'>+xlator_tree_free_members</div><div class='add'>+xlator_volopt_dynload</div><div class='add'>+xlator_volume_option_get</div><div class='add'>+xlator_volume_option_get_list</div><div class='add'>+xlator_memrec_free</div><div class='add'>+xlator_mem_cleanup</div><div class='add'>+gluster_graph_take_reference</div><div class='add'>+default_fops</div><div class='add'>+gf_fop_list</div><div class='add'>+gf_upcall_list</div><div class='add'>+vol_type_str</div><div class='add'>+global_ctx</div><div class='add'>+global_ctx_mutex</div><div class='add'>+global_xlator</div><div class='add'>+use_spinlocks</div><div class='add'>+dump_options</div><div class='add'>+glusterfs_leaseid_buf_get</div><div class='add'>+glusterfs_leaseid_exist</div><div class='add'>+gf_replace_old_iatt_in_dict</div><div class='add'>+gf_replace_new_iatt_in_dict</div><div class='add'>+gf_changelog_init</div><div class='add'>+gf_changelog_register_generic</div><div class='add'>+gf_gfid_generate_from_xxh64</div><div class='add'>+find_xlator_option_in_cmd_args_t</div><div class='add'>+gf_d_type_from_ia_type</div><div class='add'>+glusterfs_graph_fini</div><div class='add'>+glusterfs_process_svc_attach_volfp</div><div class='add'>+glusterfs_mux_volfile_reconfigure</div><div class='add'>+glusterfs_process_svc_detach</div><div class='add'>+mgmt_is_multiplexed_daemon</div><div class='add'>+xlator_is_cleanup_starting</div><div class='add'>+gf_nanosleep</div><div class='add'>+gf_syncfs</div><div class='add'>+graph_total_client_xlator</div><div class='add'>+get_xattrs_to_heal</div><div class='add'>+gf_latency_statedump_and_reset</div><div class='add'>+gf_latency_new</div><div class='add'>+gf_latency_reset</div><div class='add'>+gf_latency_update</div><div class='add'>+gf_frame_latency_update</div><div class='head'>diff --git a/libglusterfs/src/list.h b/libglusterfs/src/list.h<br/>deleted file mode 100644<br/>index 6e0f048bd5f..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/libglusterfs/src/list.h?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/list.h</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,154 +0,0 @@</div><div class='del'>-/*</div><div class='del'>-   Copyright (c) 2008-2009 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='del'>-   This file is part of GlusterFS.</div><div class='del'>-</div><div class='del'>-   GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-   it under the terms of the GNU General Public License as published</div><div class='del'>-   by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-   or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-   GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-   WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-   General Public License for more details.</div><div class='del'>-</div><div class='del'>-   You should have received a copy of the GNU General Public License</div><div class='del'>-   along with this program.  If not, see</div><div class='del'>-   &lt;http://www.gnu.org/licenses/&gt;.</div><div class='del'>-*/</div><div class='del'>-</div><div class='del'>-#ifndef _LLIST_H</div><div class='del'>-#define _LLIST_H</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-struct list_head {</div><div class='del'>-	struct list_head *next;</div><div class='del'>-	struct list_head *prev;</div><div class='del'>-};</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-#define INIT_LIST_HEAD(head) do {			\</div><div class='del'>-		(head)-&gt;next = (head)-&gt;prev = head;	\</div><div class='del'>-	} while (0)</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-static inline void</div><div class='del'>-list_add (struct list_head *new, struct list_head *head)</div><div class='del'>-{</div><div class='del'>-	new-&gt;prev = head;</div><div class='del'>-	new-&gt;next = head-&gt;next;</div><div class='del'>-</div><div class='del'>-	new-&gt;prev-&gt;next = new;</div><div class='del'>-	new-&gt;next-&gt;prev = new;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-static inline void</div><div class='del'>-list_add_tail (struct list_head *new, struct list_head *head)</div><div class='del'>-{</div><div class='del'>-	new-&gt;next = head;</div><div class='del'>-	new-&gt;prev = head-&gt;prev;</div><div class='del'>-</div><div class='del'>-	new-&gt;prev-&gt;next = new;</div><div class='del'>-	new-&gt;next-&gt;prev = new;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-static inline void</div><div class='del'>-list_del (struct list_head *old)</div><div class='del'>-{</div><div class='del'>-	old-&gt;prev-&gt;next = old-&gt;next;</div><div class='del'>-	old-&gt;next-&gt;prev = old-&gt;prev;</div><div class='del'>-</div><div class='del'>-	old-&gt;next = (void *)0xbabebabe;</div><div class='del'>-	old-&gt;prev = (void *)0xcafecafe;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-static inline void</div><div class='del'>-list_del_init (struct list_head *old)</div><div class='del'>-{</div><div class='del'>-	old-&gt;prev-&gt;next = old-&gt;next;</div><div class='del'>-	old-&gt;next-&gt;prev = old-&gt;prev;</div><div class='del'>-</div><div class='del'>-	old-&gt;next = old;</div><div class='del'>-	old-&gt;prev = old;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-static inline void</div><div class='del'>-list_move (struct list_head *list, struct list_head *head)</div><div class='del'>-{</div><div class='del'>-	list_del (list);</div><div class='del'>-	list_add (list, head);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-static inline void</div><div class='del'>-list_move_tail (struct list_head *list, struct list_head *head)</div><div class='del'>-{</div><div class='del'>-	list_del (list);</div><div class='del'>-	list_add_tail (list, head);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-static inline int</div><div class='del'>-list_empty (struct list_head *head)</div><div class='del'>-{</div><div class='del'>-	return (head-&gt;next == head);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-static inline void</div><div class='del'>-__list_splice (struct list_head *list, struct list_head *head)</div><div class='del'>-{</div><div class='del'>-	(list-&gt;prev)-&gt;next = (head-&gt;next);</div><div class='del'>-	(head-&gt;next)-&gt;prev = (list-&gt;prev);</div><div class='del'>-</div><div class='del'>-	(head)-&gt;next = (list-&gt;next);</div><div class='del'>-	(list-&gt;next)-&gt;prev = (head);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-static inline void</div><div class='del'>-list_splice (struct list_head *list, struct list_head *head)</div><div class='del'>-{</div><div class='del'>-	if (list_empty (list))</div><div class='del'>-		return;</div><div class='del'>-</div><div class='del'>-	__list_splice (list, head);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-static inline void</div><div class='del'>-list_splice_init (struct list_head *list, struct list_head *head)</div><div class='del'>-{</div><div class='del'>-	if (list_empty (list))</div><div class='del'>-		return;</div><div class='del'>-</div><div class='del'>-	__list_splice (list, head);</div><div class='del'>-	INIT_LIST_HEAD (list);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-#define list_entry(ptr, type, member)					\</div><div class='del'>-	((type *)((char *)(ptr)-(unsigned long)(&amp;((type *)0)-&gt;member)))</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-#define list_for_each(pos, head)				     \</div><div class='del'>-	for (pos = (head)-&gt;next; pos != (head); pos = pos-&gt;next)</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-#define list_for_each_entry(pos, head, member)				\</div><div class='del'>-	for (pos = list_entry((head)-&gt;next, typeof(*pos), member);	\</div><div class='del'>-	     &amp;pos-&gt;member != (head); 					\</div><div class='del'>-	     pos = list_entry(pos-&gt;member.next, typeof(*pos), member))</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-#define list_for_each_entry_safe(pos, n, head, member)			\</div><div class='del'>-	for (pos = list_entry((head)-&gt;next, typeof(*pos), member),	\</div><div class='del'>-		n = list_entry(pos-&gt;member.next, typeof(*pos), member);	\</div><div class='del'>-	     &amp;pos-&gt;member != (head); 					\</div><div class='del'>-	     pos = n, n = list_entry(n-&gt;member.next, typeof(*n), member))</div><div class='del'>-</div><div class='del'>-#endif /* _LLIST_H */</div><div class='head'>diff --git a/libglusterfs/src/locking.c b/libglusterfs/src/locking.c<br/>new file mode 100644<br/>index 00000000000..7577054e33a<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/libglusterfs/src/locking.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>libglusterfs/src/locking.c</a></div><div class='hunk'>@@ -0,0 +1,27 @@</div><div class='add'>+/*</div><div class='add'>+  Copyright (c) 2015 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#if defined(HAVE_SPINLOCK)</div><div class='add'>+/* None of this matters otherwise. */</div><div class='add'>+</div><div class='add'>+#include &lt;pthread.h&gt;</div><div class='add'>+#include &lt;unistd.h&gt;</div><div class='add'>+</div><div class='add'>+#define LOCKING_IMPL</div><div class='add'>+#include "glusterfs/locking.h"</div><div class='add'>+</div><div class='add'>+int use_spinlocks = 0;</div><div class='add'>+</div><div class='add'>+static void __attribute__((constructor)) gf_lock_setup(void)</div><div class='add'>+{</div><div class='add'>+    // use_spinlocks = (sysconf(_SC_NPROCESSORS_ONLN) &gt; 1);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#endif</div><div class='head'>diff --git a/libglusterfs/src/locking.h b/libglusterfs/src/locking.h<br/>deleted file mode 100644<br/>index 4b1ac164c39..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/libglusterfs/src/locking.h?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/locking.h</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,49 +0,0 @@</div><div class='del'>-/*</div><div class='del'>-   Copyright (c) 2008-2009 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='del'>-   This file is part of GlusterFS.</div><div class='del'>-</div><div class='del'>-   GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-   it under the terms of the GNU General Public License as published</div><div class='del'>-   by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-   or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-   GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-   WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-   General Public License for more details.</div><div class='del'>-</div><div class='del'>-   You should have received a copy of the GNU General Public License</div><div class='del'>-   along with this program.  If not, see</div><div class='del'>-   &lt;http://www.gnu.org/licenses/&gt;.</div><div class='del'>-*/</div><div class='del'>-</div><div class='del'>-#ifndef _LOCKING_H</div><div class='del'>-#define _LOCKING_H</div><div class='del'>-</div><div class='del'>-#ifndef _CONFIG_H</div><div class='del'>-#define _CONFIG_H</div><div class='del'>-#include "config.h"</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-#include &lt;pthread.h&gt;</div><div class='del'>-</div><div class='del'>-#if HAVE_SPINLOCK</div><div class='del'>-#define LOCK_INIT(x)    pthread_spin_init (x, 0)</div><div class='del'>-#define LOCK(x)         pthread_spin_lock (x)</div><div class='del'>-#define TRY_LOCK(x)     pthread_spin_trylock (x)</div><div class='del'>-#define UNLOCK(x)       pthread_spin_unlock (x)</div><div class='del'>-#define LOCK_DESTROY(x) pthread_spin_destroy (x)</div><div class='del'>-</div><div class='del'>-typedef pthread_spinlock_t gf_lock_t;</div><div class='del'>-#else</div><div class='del'>-#define LOCK_INIT(x)    pthread_mutex_init (x, 0)</div><div class='del'>-#define LOCK(x)         pthread_mutex_lock (x)</div><div class='del'>-#define TRY_LOCK(x)     pthread_mutex_trylock (x)</div><div class='del'>-#define UNLOCK(x)       pthread_mutex_unlock (x)</div><div class='del'>-#define LOCK_DESTROY(x) pthread_mutex_destroy (x)</div><div class='del'>-</div><div class='del'>-typedef pthread_mutex_t gf_lock_t;</div><div class='del'>-#endif /* HAVE_SPINLOCK */</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-#endif /* _LOCKING_H */</div><div class='head'>diff --git a/libglusterfs/src/logging.c b/libglusterfs/src/logging.c<br/>index 4493b05c7cd..a930d3e3b63 100644<br/>--- a/<a href='/cgit/glusterfs.git/tree/libglusterfs/src/logging.c?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/logging.c</a><br/>+++ b/<a href='/cgit/glusterfs.git/tree/libglusterfs/src/logging.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>libglusterfs/src/logging.c</a></div><div class='hunk'>@@ -1,27 +1,13 @@</div><div class='ctx'> /*</div><div class='del'>-  Copyright (c) 2006-2009 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='add'>+  Copyright (c) 2008-2012 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='ctx'>   This file is part of GlusterFS.</div><div class='ctx'> </div><div class='del'>-  GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-  it under the terms of the GNU General Public License as published</div><div class='del'>-  by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-  or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-  GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-  WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-  General Public License for more details.</div><div class='del'>-</div><div class='del'>-  You should have received a copy of the GNU General Public License</div><div class='del'>-  along with this program.  If not, see</div><div class='del'>-  &lt;http://www.gnu.org/licenses/&gt;.</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='ctx'> */</div><div class='ctx'> </div><div class='del'>-#ifndef _CONFIG_H</div><div class='del'>-#define _CONFIG_H</div><div class='del'>-#include "config.h"</div><div class='del'>-#endif</div><div class='del'>-</div><div class='ctx'> #include &lt;errno.h&gt;</div><div class='ctx'> #include &lt;pthread.h&gt;</div><div class='ctx'> #include &lt;stdio.h&gt;</div><div class='hunk'>@@ -30,481 +16,2431 @@</div><div class='ctx'> #include &lt;locale.h&gt;</div><div class='ctx'> #include &lt;string.h&gt;</div><div class='ctx'> #include &lt;stdlib.h&gt;</div><div class='del'>-</div><div class='del'>-#include "xlator.h"</div><div class='del'>-#include "logging.h"</div><div class='del'>-#include "defaults.h"</div><div class='del'>-</div><div class='del'>-#ifdef GF_LINUX_HOST_OS</div><div class='ctx'> #include &lt;syslog.h&gt;</div><div class='add'>+#include &lt;sys/resource.h&gt;</div><div class='add'>+</div><div class='add'>+#ifdef HAVE_BACKTRACE</div><div class='add'>+#include &lt;execinfo.h&gt;</div><div class='add'>+#else</div><div class='add'>+#include "execinfo_compat.h"</div><div class='ctx'> #endif</div><div class='ctx'> </div><div class='add'>+#include &lt;sys/stat.h&gt;</div><div class='add'>+</div><div class='add'>+#include "glusterfs/syscall.h"</div><div class='add'>+</div><div class='add'>+#define GF_JSON_MSG_LENGTH 8192</div><div class='add'>+#define GF_SYSLOG_CEE_FORMAT                                                   \</div><div class='add'>+    "@cee: {\"msg\": \"%s\", \"gf_code\": \"%u\", \"gf_message\": \"%s\"}"</div><div class='add'>+#define GF_LOG_CONTROL_FILE "/etc/glusterfs/logger.conf"</div><div class='add'>+#define GF_LOG_BACKTRACE_DEPTH 5</div><div class='add'>+#define GF_LOG_BACKTRACE_SIZE 4096</div><div class='add'>+#define GF_MAX_SLOG_PAIR_COUNT 100</div><div class='add'>+</div><div class='add'>+#include "glusterfs/logging.h"</div><div class='add'>+#include "glusterfs/glusterfs.h"</div><div class='add'>+#include "glusterfs/timer.h"</div><div class='add'>+#include "glusterfs/libglusterfs-messages.h"</div><div class='ctx'> </div><div class='del'>-static pthread_mutex_t  logfile_mutex;</div><div class='del'>-static char            *filename = NULL;</div><div class='del'>-static uint8_t          logrotate = 0;</div><div class='del'>-static FILE            *logfile = NULL;</div><div class='del'>-static gf_loglevel_t    loglevel = GF_LOG_MAX;</div><div class='del'>-static int              gf_log_syslog = 0;</div><div class='add'>+/* Do not replace gf_log in TEST_LOG with gf_msg, as there is a slight chance</div><div class='add'>+ * that it could lead to an infinite recursion.*/</div><div class='add'>+#define TEST_LOG(__msg, __args...)                                             \</div><div class='add'>+    gf_log("logging-infra", GF_LOG_DEBUG, __msg, ##__args);</div><div class='ctx'> </div><div class='del'>-char                    gf_log_xl_log_set;</div><div class='del'>-gf_loglevel_t           gf_log_loglevel; /* extern'd */</div><div class='del'>-FILE                   *gf_log_logfile;</div><div class='add'>+static void</div><div class='add'>+gf_log_flush_timeout_cbk(void *data);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+gf_log_inject_timer_event(glusterfs_ctx_t *ctx);</div><div class='ctx'> </div><div class='del'>-static char            *cmd_log_filename = NULL;</div><div class='del'>-static FILE            *cmdlogfile = NULL;</div><div class='add'>+static void</div><div class='add'>+gf_log_flush_extra_msgs(glusterfs_ctx_t *ctx, uint32_t new);</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+log_buf_init(log_buf_t *buf, const char *domain, const char *file,</div><div class='add'>+             const char *function, int32_t line, gf_loglevel_t level,</div><div class='add'>+             int errnum, uint64_t msgid, char **appmsgstr, int graph_id);</div><div class='add'>+static void</div><div class='add'>+gf_log_rotate(glusterfs_ctx_t *ctx);</div><div class='add'>+</div><div class='add'>+static char gf_level_strings[] = {</div><div class='add'>+    ' ', /* NONE */</div><div class='add'>+    'M', /* EMERGENCY */</div><div class='add'>+    'A', /* ALERT */</div><div class='add'>+    'C', /* CRITICAL */</div><div class='add'>+    'E', /* ERROR */</div><div class='add'>+    'W', /* WARNING */</div><div class='add'>+    'N', /* NOTICE */</div><div class='add'>+    'I', /* INFO */</div><div class='add'>+    'D', /* DEBUG */</div><div class='add'>+    'T', /* TRACE */</div><div class='add'>+};</div><div class='ctx'> </div><div class='ctx'> void</div><div class='del'>-gf_log_logrotate (int signum)</div><div class='add'>+gf_log_logrotate(int signum)</div><div class='ctx'> {</div><div class='del'>-	logrotate = 1;</div><div class='add'>+    if (THIS-&gt;ctx) {</div><div class='add'>+        THIS-&gt;ctx-&gt;log.logrotate = 1;</div><div class='add'>+        THIS-&gt;ctx-&gt;log.cmd_history_logrotate = 1;</div><div class='add'>+    }</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> void</div><div class='del'>-gf_log_enable_syslog (void)</div><div class='add'>+gf_log_enable_syslog(void)</div><div class='ctx'> {</div><div class='del'>-        gf_log_syslog = 1;</div><div class='add'>+    if (THIS-&gt;ctx)</div><div class='add'>+        THIS-&gt;ctx-&gt;log.gf_log_syslog = 1;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> void</div><div class='del'>-gf_log_disable_syslog (void)</div><div class='add'>+gf_log_disable_syslog(void)</div><div class='ctx'> {</div><div class='del'>-        gf_log_syslog = 0;</div><div class='add'>+    if (THIS-&gt;ctx)</div><div class='add'>+        THIS-&gt;ctx-&gt;log.gf_log_syslog = 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> gf_loglevel_t</div><div class='del'>-gf_log_get_loglevel (void)</div><div class='add'>+gf_log_get_loglevel(void)</div><div class='ctx'> {</div><div class='del'>-	return loglevel;</div><div class='add'>+    if (THIS-&gt;ctx)</div><div class='add'>+        return THIS-&gt;ctx-&gt;log.loglevel;</div><div class='add'>+    else</div><div class='add'>+        /* return global defaults (see gf_log_globals_init) */</div><div class='add'>+        return GF_LOG_INFO;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> void</div><div class='del'>-gf_log_set_loglevel (gf_loglevel_t level)</div><div class='add'>+gf_log_set_loglevel(glusterfs_ctx_t *ctx, gf_loglevel_t level)</div><div class='ctx'> {</div><div class='del'>-        gf_log_loglevel = loglevel = level;</div><div class='add'>+    if (ctx)</div><div class='add'>+        ctx-&gt;log.loglevel = level;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+int</div><div class='add'>+gf_log_get_localtime(void)</div><div class='add'>+{</div><div class='add'>+    if (THIS-&gt;ctx)</div><div class='add'>+        return THIS-&gt;ctx-&gt;log.localtime;</div><div class='add'>+    else</div><div class='add'>+        /* return global defaults (see gf_log_globals_init) */</div><div class='add'>+        return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-gf_loglevel_t</div><div class='del'>-gf_log_get_xl_loglevel (void *this)</div><div class='add'>+void</div><div class='add'>+gf_log_set_localtime(int on_off)</div><div class='ctx'> {</div><div class='del'>-        xlator_t *xl = this;</div><div class='del'>-        if (!xl)</div><div class='del'>-                return 0;</div><div class='del'>-        return xl-&gt;loglevel;</div><div class='add'>+    if (THIS-&gt;ctx)</div><div class='add'>+        THIS-&gt;ctx-&gt;log.localtime = on_off;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> void</div><div class='del'>-gf_log_set_xl_loglevel (void *this, gf_loglevel_t level)</div><div class='add'>+gf_log_flush(void)</div><div class='ctx'> {</div><div class='del'>-        xlator_t *xl = this;</div><div class='del'>-        if (!xl)</div><div class='del'>-                return;</div><div class='del'>-        gf_log_xl_log_set = 1;</div><div class='del'>-        xl-&gt;loglevel = level;</div><div class='add'>+    xlator_t *this = THIS;</div><div class='add'>+    glusterfs_ctx_t *ctx = this-&gt;ctx;</div><div class='add'>+</div><div class='add'>+    if (ctx &amp;&amp; ctx-&gt;log.logger == gf_logger_glusterlog) {</div><div class='add'>+        pthread_mutex_lock(&amp;ctx-&gt;log.logfile_mutex);</div><div class='add'>+        fflush(ctx-&gt;log.gf_log_logfile);</div><div class='add'>+        pthread_mutex_unlock(&amp;ctx-&gt;log.logfile_mutex);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> void</div><div class='del'>-gf_log_fini (void)</div><div class='add'>+gf_log_set_xl_loglevel(void *this, gf_loglevel_t level)</div><div class='ctx'> {</div><div class='del'>-	pthread_mutex_destroy (&amp;logfile_mutex);</div><div class='add'>+    xlator_t *xl = this;</div><div class='add'>+    if (!xl)</div><div class='add'>+        return;</div><div class='add'>+    xl-&gt;loglevel = level;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+/* TODO: The following get/set functions are yet not invoked from anywhere</div><div class='add'>+ * in the code. The _intention_ is to pass CLI arguments to various daemons</div><div class='add'>+ * that are started, which would then invoke these set APIs as required.</div><div class='add'>+ *</div><div class='add'>+ * glusterd would read the defaults from its .vol file configuration shipped</div><div class='add'>+ * as a part of the packages distributed.</div><div class='add'>+ *</div><div class='add'>+ * For any gluster* daemon that is started the shipped configuration becomes the</div><div class='add'>+ * default, if a volume has to change its logging format or logger, then a</div><div class='add'>+ * gluster CLI is invoked to set this property for the volume in question.</div><div class='add'>+ *</div><div class='add'>+ * The property is maintained by glusterd, and passed to the daemon as a CLI</div><div class='add'>+ * option, IOW persistence of the option is maintained by glusterd persistent</div><div class='add'>+ * storage (i.e .vol file) only</div><div class='add'>+ *</div><div class='add'>+ * care needs to be taken to configure and start daemons based on the versions</div><div class='add'>+ * that supports these features */</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-gf_log_init (const char *file)</div><div class='del'>-{</div><div class='del'>-	if (!file){</div><div class='del'>-		fprintf (stderr, "gf_log_init: no filename specified\n");</div><div class='del'>-		return -1;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	pthread_mutex_init (&amp;logfile_mutex, NULL);</div><div class='del'>-</div><div class='del'>-        filename = gf_strdup (file);</div><div class='del'>-	if (!filename) {</div><div class='del'>-		fprintf (stderr, "gf_log_init: strdup error\n");</div><div class='del'>-		return -1;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	logfile = fopen (file, "a");</div><div class='del'>-	if (!logfile){</div><div class='del'>-		fprintf (stderr,</div><div class='del'>-			 "gf_log_init: failed to open logfile \"%s\" (%s)\n",</div><div class='del'>-			 file,</div><div class='del'>-			 strerror (errno));</div><div class='del'>-		return -1;</div><div class='del'>-	}</div><div class='add'>+void</div><div class='add'>+gf_log_set_logformat(gf_log_format_t format)</div><div class='add'>+{</div><div class='add'>+    if (THIS-&gt;ctx)</div><div class='add'>+        THIS-&gt;ctx-&gt;log.logformat = format;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-#ifdef GF_LINUX_HOST_OS</div><div class='del'>-        /* For the 'syslog' output. one can grep 'GlusterFS' in syslog</div><div class='del'>-           for serious logs */</div><div class='del'>-        openlog ("GlusterFS", LOG_PID, LOG_DAEMON);</div><div class='del'>-#endif</div><div class='add'>+void</div><div class='add'>+gf_log_set_logger(gf_log_logger_t logger)</div><div class='add'>+{</div><div class='add'>+    if (THIS-&gt;ctx)</div><div class='add'>+        THIS-&gt;ctx-&gt;log.logger = logger;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	gf_log_logfile = logfile;</div><div class='add'>+gf_loglevel_t</div><div class='add'>+gf_log_get_xl_loglevel(void *this)</div><div class='add'>+{</div><div class='add'>+    xlator_t *xl = this;</div><div class='add'>+    if (!xl)</div><div class='add'>+        return 0;</div><div class='add'>+    return xl-&gt;loglevel;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	return 0;</div><div class='add'>+void</div><div class='add'>+gf_log_set_log_buf_size(uint32_t buf_size)</div><div class='add'>+{</div><div class='add'>+    uint32_t old = 0;</div><div class='add'>+    glusterfs_ctx_t *ctx = THIS-&gt;ctx;</div><div class='add'>+</div><div class='add'>+    pthread_mutex_lock(&amp;ctx-&gt;log.log_buf_lock);</div><div class='add'>+    {</div><div class='add'>+        old = ctx-&gt;log.lru_size;</div><div class='add'>+        ctx-&gt;log.lru_size = buf_size;</div><div class='add'>+    }</div><div class='add'>+    pthread_mutex_unlock(&amp;ctx-&gt;log.log_buf_lock);</div><div class='add'>+</div><div class='add'>+    /* If the old size is less than/equal to the new size, then do nothing.</div><div class='add'>+     *</div><div class='add'>+     * But if the new size is less than the old size, then</div><div class='add'>+     *   a. If the cur size of the buf is less than or equal the new size,</div><div class='add'>+     *      then do nothing.</div><div class='add'>+     *   b. But if the current size of the buf is greater than the new size,</div><div class='add'>+     *      then flush the least recently used (cur size - new_size) msgs</div><div class='add'>+     *      to disk.</div><div class='add'>+     */</div><div class='add'>+    if (buf_size &lt; old)</div><div class='add'>+        gf_log_flush_extra_msgs(ctx, buf_size);</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+void</div><div class='add'>+gf_log_set_log_flush_timeout(uint32_t timeout)</div><div class='add'>+{</div><div class='add'>+    THIS-&gt;ctx-&gt;log.timeout = timeout;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-/*</div><div class='del'>- * Initialize logging to a central server.</div><div class='del'>- * If successful, log messages will be written both to</div><div class='del'>- * the local file and to the remote server.</div><div class='add'>+/* If log_buf_init() fails (indicated by a return value of -1),</div><div class='add'>+ * call log_buf_destroy() to clean up memory allocated in heap and to return</div><div class='add'>+ * the log_buf_t object back to its memory pool.</div><div class='ctx'>  */</div><div class='add'>+static int</div><div class='add'>+log_buf_init(log_buf_t *buf, const char *domain, const char *file,</div><div class='add'>+             const char *function, int32_t line, gf_loglevel_t level,</div><div class='add'>+             int errnum, uint64_t msgid, char **appmsgstr, int graph_id)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='ctx'> </div><div class='del'>-static int __central_log_enabled = 0;</div><div class='add'>+    if (!buf || !domain || !file || !function || !appmsgstr || !*appmsgstr)</div><div class='add'>+        goto out;</div><div class='ctx'> </div><div class='del'>-struct _msg_queue {</div><div class='del'>-        struct list_head msgs;</div><div class='del'>-};</div><div class='add'>+    buf-&gt;msg = gf_strdup(*appmsgstr);</div><div class='add'>+    if (!buf-&gt;msg)</div><div class='add'>+        goto out;</div><div class='ctx'> </div><div class='del'>-struct _log_msg {</div><div class='del'>-        const char *msg;</div><div class='del'>-        struct list_head queue;</div><div class='del'>-};</div><div class='add'>+    buf-&gt;msg_id = msgid;</div><div class='add'>+    buf-&gt;errnum = errnum;</div><div class='add'>+    buf-&gt;domain = gf_strdup(domain);</div><div class='add'>+    if (!buf-&gt;domain)</div><div class='add'>+        goto out;</div><div class='ctx'> </div><div class='add'>+    buf-&gt;file = gf_strdup(file);</div><div class='add'>+    if (!buf-&gt;file)</div><div class='add'>+        goto out;</div><div class='ctx'> </div><div class='add'>+    buf-&gt;function = gf_strdup(function);</div><div class='add'>+    if (!buf-&gt;function)</div><div class='add'>+        goto out;</div><div class='ctx'> </div><div class='add'>+    buf-&gt;line = line;</div><div class='add'>+    buf-&gt;level = level;</div><div class='add'>+    buf-&gt;refcount = 0;</div><div class='add'>+    buf-&gt;graph_id = graph_id;</div><div class='add'>+    INIT_LIST_HEAD(&amp;buf-&gt;msg_list);</div><div class='ctx'> </div><div class='del'>-void </div><div class='del'>-gf_log_lock (void)</div><div class='del'>-{</div><div class='del'>-	pthread_mutex_lock (&amp;logfile_mutex);</div><div class='add'>+    ret = 0;</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='del'>-void </div><div class='del'>-gf_log_unlock (void)</div><div class='add'>+static int</div><div class='add'>+log_buf_destroy(log_buf_t *buf)</div><div class='ctx'> {</div><div class='del'>-	pthread_mutex_unlock (&amp;logfile_mutex);</div><div class='add'>+    if (!buf)</div><div class='add'>+        return -1;</div><div class='add'>+</div><div class='add'>+    GF_FREE(buf-&gt;msg);</div><div class='add'>+    GF_FREE(buf-&gt;domain);</div><div class='add'>+    GF_FREE(buf-&gt;file);</div><div class='add'>+    GF_FREE(buf-&gt;function);</div><div class='add'>+</div><div class='add'>+    mem_put(buf);</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+static void</div><div class='add'>+gf_log_rotate(glusterfs_ctx_t *ctx)</div><div class='add'>+{</div><div class='add'>+    int fd = -1;</div><div class='add'>+    FILE *new_logfile = NULL;</div><div class='add'>+    FILE *old_logfile = NULL;</div><div class='add'>+</div><div class='add'>+    /* not involving locks on initial check to speed it up */</div><div class='add'>+    if (ctx-&gt;log.logrotate) {</div><div class='add'>+        /* let only one winner through on races */</div><div class='add'>+        pthread_mutex_lock(&amp;ctx-&gt;log.logfile_mutex);</div><div class='add'>+</div><div class='add'>+        if (!ctx-&gt;log.logrotate) {</div><div class='add'>+            pthread_mutex_unlock(&amp;ctx-&gt;log.logfile_mutex);</div><div class='add'>+            return;</div><div class='add'>+        } else {</div><div class='add'>+            ctx-&gt;log.logrotate = 0;</div><div class='add'>+            pthread_mutex_unlock(&amp;ctx-&gt;log.logfile_mutex);</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        fd = sys_open(ctx-&gt;log.filename, O_CREAT | O_WRONLY | O_APPEND,</div><div class='add'>+                      S_IRUSR | S_IWUSR);</div><div class='add'>+        if (fd &lt; 0) {</div><div class='add'>+            gf_smsg("logrotate", GF_LOG_ERROR, errno,</div><div class='add'>+                    LG_MSG_OPEN_LOGFILE_FAILED, NULL);</div><div class='add'>+            return;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        new_logfile = fdopen(fd, "a");</div><div class='add'>+        if (!new_logfile) {</div><div class='add'>+            gf_smsg("logrotate", GF_LOG_CRITICAL, errno,</div><div class='add'>+                    LG_MSG_OPEN_LOGFILE_FAILED, "filename=%s",</div><div class='add'>+                    ctx-&gt;log.filename, NULL);</div><div class='add'>+            sys_close(fd);</div><div class='add'>+            return;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        pthread_mutex_lock(&amp;ctx-&gt;log.logfile_mutex);</div><div class='add'>+        {</div><div class='add'>+            if (ctx-&gt;log.logfile)</div><div class='add'>+                old_logfile = ctx-&gt;log.logfile;</div><div class='add'>+</div><div class='add'>+            ctx-&gt;log.gf_log_logfile = ctx-&gt;log.logfile = new_logfile;</div><div class='add'>+        }</div><div class='add'>+        pthread_mutex_unlock(&amp;ctx-&gt;log.logfile_mutex);</div><div class='add'>+</div><div class='add'>+        if (old_logfile != NULL)</div><div class='add'>+            fclose(old_logfile);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> void</div><div class='del'>-gf_log_cleanup (void)</div><div class='add'>+gf_log_globals_fini(void)</div><div class='ctx'> {</div><div class='del'>-	pthread_mutex_destroy (&amp;logfile_mutex);</div><div class='add'>+    /* TODO: Nobody is invoking the fini, but cleanup needs to happen here,</div><div class='add'>+     * needs cleanup for, log.ident, log.filename, closelog, log file close</div><div class='add'>+     * rotate state, possibly under a lock */</div><div class='add'>+    pthread_mutex_destroy(&amp;THIS-&gt;ctx-&gt;log.logfile_mutex);</div><div class='add'>+    pthread_mutex_destroy(&amp;THIS-&gt;ctx-&gt;log.log_buf_lock);</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+void</div><div class='add'>+gf_log_disable_suppression_before_exit(glusterfs_ctx_t *ctx)</div><div class='add'>+{</div><div class='add'>+    /*</div><div class='add'>+     * First set log buf size to 0. This would ensure two things:</div><div class='add'>+     * i. that all outstanding log messages are flushed to disk, and</div><div class='add'>+     * ii. all subsequent calls to gf_msg will result in the logs getting</div><div class='add'>+     *     directly flushed to disk without being buffered.</div><div class='add'>+     *</div><div class='add'>+     * Then, cancel the current log timer event.</div><div class='add'>+     */</div><div class='add'>+</div><div class='add'>+    gf_log_set_log_buf_size(0);</div><div class='add'>+    pthread_mutex_lock(&amp;ctx-&gt;log.log_buf_lock);</div><div class='add'>+    {</div><div class='add'>+        if (ctx-&gt;log.log_flush_timer) {</div><div class='add'>+            gf_timer_call_cancel(ctx, ctx-&gt;log.log_flush_timer);</div><div class='add'>+            ctx-&gt;log.log_flush_timer = NULL;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    pthread_mutex_unlock(&amp;ctx-&gt;log.log_buf_lock);</div><div class='add'>+}</div><div class='ctx'> </div><div class='add'>+/** gf_log_fini - function to perform the cleanup of the log information</div><div class='add'>+ * @data - glusterfs context</div><div class='add'>+ * @return: success: 0</div><div class='add'>+ *          failure: -1</div><div class='add'>+ */</div><div class='ctx'> int</div><div class='del'>-_gf_log (const char *domain, const char *file, const char *function, int line,</div><div class='del'>-	 gf_loglevel_t level, const char *fmt, ...)</div><div class='del'>-{</div><div class='del'>-	const char  *basename = NULL;</div><div class='del'>-	FILE        *new_logfile = NULL;</div><div class='del'>-	va_list      ap;</div><div class='del'>-	struct tm   *tm = NULL;</div><div class='del'>-	char         timestr[256];</div><div class='del'>-        struct timeval tv = {0,};</div><div class='del'>-</div><div class='del'>-        char        *str1 = NULL;</div><div class='del'>-        char        *str2 = NULL;</div><div class='del'>-        char        *msg  = NULL;</div><div class='del'>-        size_t       len  = 0;</div><div class='del'>-        int          ret  = 0;</div><div class='del'>-        xlator_t    *this = NULL;</div><div class='del'>-        gf_loglevel_t xlator_loglevel = 0;</div><div class='del'>-</div><div class='del'>-	if (!logfile)</div><div class='del'>-		return -1;</div><div class='del'>-</div><div class='del'>-        this = THIS;</div><div class='del'>-</div><div class='del'>-        xlator_loglevel = this-&gt;loglevel;</div><div class='del'>-        if (xlator_loglevel == 0)</div><div class='del'>-                xlator_loglevel = loglevel;</div><div class='del'>-</div><div class='del'>-        if (level &gt; xlator_loglevel)</div><div class='del'>-                goto out;</div><div class='add'>+gf_log_fini(void *data)</div><div class='add'>+{</div><div class='add'>+    glusterfs_ctx_t *ctx = data;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    FILE *old_logfile = NULL;</div><div class='add'>+</div><div class='add'>+    if (ctx == NULL) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    gf_log_disable_suppression_before_exit(ctx);</div><div class='add'>+</div><div class='add'>+    pthread_mutex_lock(&amp;ctx-&gt;log.logfile_mutex);</div><div class='add'>+    {</div><div class='add'>+        if (ctx-&gt;log.logfile) {</div><div class='add'>+            old_logfile = ctx-&gt;log.logfile;</div><div class='add'>+</div><div class='add'>+            /* Logfile needs to be set to NULL, so that any</div><div class='add'>+               call to gf_log after calling gf_log_fini, will</div><div class='add'>+               log the message to stderr.</div><div class='add'>+            */</div><div class='add'>+            ctx-&gt;log.loglevel = GF_LOG_NONE;</div><div class='add'>+            ctx-&gt;log.logfile = NULL;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    pthread_mutex_unlock(&amp;ctx-&gt;log.logfile_mutex);</div><div class='ctx'> </div><div class='del'>-	static char *level_strings[] = {"",  /* NONE */</div><div class='del'>-                                        "M", /* EMERGENCY */</div><div class='del'>-                                        "A", /* ALERT */</div><div class='del'>-					"C", /* CRITICAL */</div><div class='del'>-					"E", /* ERROR */</div><div class='del'>-					"W", /* WARNING */</div><div class='del'>-					"N", /* NOTICE */</div><div class='del'>-                                        "I", /* INFO/NORMAL */</div><div class='del'>-					"D", /* DEBUG */</div><div class='del'>-                                        "T", /* TRACE */</div><div class='del'>-					""};</div><div class='del'>-</div><div class='del'>-	if (!domain || !file || !function || !fmt) {</div><div class='del'>-		fprintf (stderr,</div><div class='del'>-			 "logging: %s:%s():%d: invalid argument\n",</div><div class='del'>-			 __FILE__, __PRETTY_FUNCTION__, __LINE__);</div><div class='del'>-		return -1;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-	if (logrotate) {</div><div class='del'>-		logrotate = 0;</div><div class='del'>-</div><div class='del'>-		new_logfile = fopen (filename, "a");</div><div class='del'>-		if (!new_logfile) {</div><div class='del'>-			gf_log ("logrotate", GF_LOG_CRITICAL,</div><div class='del'>-				"failed to open logfile %s (%s)",</div><div class='del'>-				filename, strerror (errno));</div><div class='del'>-			goto log;</div><div class='del'>-		}</div><div class='del'>-</div><div class='del'>-		fclose (logfile);</div><div class='del'>-		gf_log_logfile = logfile = new_logfile;</div><div class='del'>-	}</div><div class='add'>+    if (old_logfile &amp;&amp; (fclose(old_logfile) != 0))</div><div class='add'>+        ret = -1;</div><div class='ctx'> </div><div class='del'>-log:</div><div class='del'>-        ret = gettimeofday (&amp;tv, NULL);</div><div class='del'>-        if (-1 == ret)</div><div class='del'>-                goto out;</div><div class='add'>+    GF_FREE(ctx-&gt;log.ident);</div><div class='add'>+    GF_FREE(ctx-&gt;log.filename);</div><div class='ctx'> </div><div class='del'>-	tm    = localtime (&amp;tv.tv_sec);</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	pthread_mutex_lock (&amp;logfile_mutex);</div><div class='del'>-	{</div><div class='del'>-		va_start (ap, fmt);</div><div class='add'>+/**</div><div class='add'>+ * gf_openlog -function to open syslog specific to gluster based on</div><div class='add'>+ *             existence of file /etc/glusterfs/logger.conf</div><div class='add'>+ * @ident:    optional identification string similar to openlog()</div><div class='add'>+ * @option:   optional value to option to openlog().  Passing -1 uses</div><div class='add'>+ *            'LOG_PID | LOG_NDELAY' as default</div><div class='add'>+ * @facility: optional facility code similar to openlog().  Passing -1</div><div class='add'>+ *            uses LOG_DAEMON as default</div><div class='add'>+ *</div><div class='add'>+ * @return: void</div><div class='add'>+ */</div><div class='add'>+static void</div><div class='add'>+gf_openlog(const char *ident, int option, int facility)</div><div class='add'>+{</div><div class='add'>+    int _option = option;</div><div class='add'>+    int _facility = facility;</div><div class='add'>+</div><div class='add'>+    if (-1 == _option) {</div><div class='add'>+        _option = LOG_PID | LOG_NDELAY;</div><div class='add'>+    }</div><div class='add'>+    if (-1 == _facility) {</div><div class='add'>+        _facility = LOG_LOCAL1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* TODO: Should check for errors here and return appropriately */</div><div class='add'>+    setlocale(LC_ALL, "");</div><div class='add'>+    setlocale(LC_NUMERIC, "C"); /* C-locale for strtod, ... */</div><div class='add'>+    /* close the previous syslog if open as we are changing settings */</div><div class='add'>+    closelog();</div><div class='add'>+    openlog(ident, _option, _facility);</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-		strftime (timestr, 256, "%Y-%m-%d %H:%M:%S", tm); </div><div class='del'>-                snprintf (timestr + strlen (timestr), 256 - strlen (timestr),</div><div class='del'>-                          ".%"GF_PRI_SUSECONDS, tv.tv_usec);</div><div class='add'>+/**</div><div class='add'>+ * _json_escape -function to convert string to json encoded string</div><div class='add'>+ * @str: input string</div><div class='add'>+ * @buf: buffer to store encoded string</div><div class='add'>+ * @len: length of @buf</div><div class='add'>+ *</div><div class='add'>+ * @return: success: last unprocessed character position by pointer in @str</div><div class='add'>+ *          failure: NULL</div><div class='add'>+ *</div><div class='add'>+ * Internal function. Heavily inspired by _ul_str_escape() function in</div><div class='add'>+ * libumberlog</div><div class='add'>+ *</div><div class='add'>+ * Sample output:</div><div class='add'>+ * [1] str = "devel error"</div><div class='add'>+ *     buf = "devel error"</div><div class='add'>+ * [2] str = "devel	error"</div><div class='add'>+ *     buf = "devel\terror"</div><div class='add'>+ * [3] str = "I/O error on "/tmp/foo" file"</div><div class='add'>+ *     buf = "I/O error on \"/tmp/foo\" file"</div><div class='add'>+ * [4] str = "I/O erroron /tmp/bar file"</div><div class='add'>+ *     buf = "I/O error\u001bon /tmp/bar file"</div><div class='add'>+ *</div><div class='add'>+ */</div><div class='add'>+static char *</div><div class='add'>+_json_escape(const char *str, char *buf, size_t len)</div><div class='add'>+{</div><div class='add'>+    static const unsigned char json_exceptions[UCHAR_MAX + 1] = {</div><div class='add'>+        [0x01] = 1, [0x02] = 1, [0x03] = 1, [0x04] = 1, [0x05] = 1, [0x06] = 1,</div><div class='add'>+        [0x07] = 1, [0x08] = 1, [0x09] = 1, [0x0a] = 1, [0x0b] = 1, [0x0c] = 1,</div><div class='add'>+        [0x0d] = 1, [0x0e] = 1, [0x0f] = 1, [0x10] = 1, [0x11] = 1, [0x12] = 1,</div><div class='add'>+        [0x13] = 1, [0x14] = 1, [0x15] = 1, [0x16] = 1, [0x17] = 1, [0x18] = 1,</div><div class='add'>+        [0x19] = 1, [0x1a] = 1, [0x1b] = 1, [0x1c] = 1, [0x1d] = 1, [0x1e] = 1,</div><div class='add'>+        [0x1f] = 1, ['\\'] = 1, ['"'] = 1};</div><div class='add'>+    static const char json_hex_chars[16] = "0123456789abcdef";</div><div class='add'>+    unsigned char *p = NULL;</div><div class='add'>+    size_t pos = 0;</div><div class='add'>+</div><div class='add'>+    if (!str || !buf || len &lt;= 0) {</div><div class='add'>+        return NULL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    for (p = (unsigned char *)str; *p &amp;&amp; (pos + 1) &lt; len; p++) {</div><div class='add'>+        if (json_exceptions[*p] == 0) {</div><div class='add'>+            buf[pos++] = *p;</div><div class='add'>+            continue;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-		basename = strrchr (file, '/');</div><div class='del'>-		if (basename)</div><div class='del'>-			basename++;</div><div class='del'>-		else</div><div class='del'>-			basename = file;</div><div class='add'>+        if ((pos + 2) &gt;= len) {</div><div class='add'>+            break;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-                ret = gf_asprintf (&amp;str1, "[%s] %s [%s:%d:%s] %s: ",</div><div class='del'>-                                   timestr, level_strings[level],</div><div class='del'>-                                   basename, line, function,</div><div class='del'>-                                   domain);</div><div class='del'>-                if (-1 == ret) {</div><div class='del'>-                        goto unlock;</div><div class='add'>+        switch (*p) {</div><div class='add'>+            case '\b':</div><div class='add'>+                buf[pos++] = '\\';</div><div class='add'>+                buf[pos++] = 'b';</div><div class='add'>+                break;</div><div class='add'>+            case '\n':</div><div class='add'>+                buf[pos++] = '\\';</div><div class='add'>+                buf[pos++] = 'n';</div><div class='add'>+                break;</div><div class='add'>+            case '\r':</div><div class='add'>+                buf[pos++] = '\\';</div><div class='add'>+                buf[pos++] = 'r';</div><div class='add'>+                break;</div><div class='add'>+            case '\t':</div><div class='add'>+                buf[pos++] = '\\';</div><div class='add'>+                buf[pos++] = 't';</div><div class='add'>+                break;</div><div class='add'>+            case '\\':</div><div class='add'>+                buf[pos++] = '\\';</div><div class='add'>+                buf[pos++] = '\\';</div><div class='add'>+                break;</div><div class='add'>+            case '"':</div><div class='add'>+                buf[pos++] = '\\';</div><div class='add'>+                buf[pos++] = '"';</div><div class='add'>+                break;</div><div class='add'>+            default:</div><div class='add'>+                if ((pos + 6) &gt;= len) {</div><div class='add'>+                    buf[pos] = '\0';</div><div class='add'>+                    return (char *)p;</div><div class='ctx'>                 }</div><div class='add'>+                buf[pos++] = '\\';</div><div class='add'>+                buf[pos++] = 'u';</div><div class='add'>+                buf[pos++] = '0';</div><div class='add'>+                buf[pos++] = '0';</div><div class='add'>+                buf[pos++] = json_hex_chars[(*p) &gt;&gt; 4];</div><div class='add'>+                buf[pos++] = json_hex_chars[(*p) &amp; 0xf];</div><div class='add'>+                break;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-                ret = vasprintf (&amp;str2, fmt, ap);</div><div class='del'>-                if (-1 == ret) {</div><div class='del'>-                        goto unlock;</div><div class='del'>-                }</div><div class='add'>+    buf[pos] = '\0';</div><div class='add'>+    return (char *)p;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/**</div><div class='add'>+ * gf_syslog -function to submit message to syslog specific to gluster</div><div class='add'>+ * @facility_priority: facility_priority of syslog()</div><div class='add'>+ * @format:            optional format string to syslog()</div><div class='add'>+ *</div><div class='add'>+ * @return: void</div><div class='add'>+ */</div><div class='add'>+static void</div><div class='add'>+gf_syslog(int facility_priority, char *format, ...)</div><div class='add'>+{</div><div class='add'>+    char *msg = NULL;</div><div class='add'>+    char json_msg[GF_JSON_MSG_LENGTH];</div><div class='add'>+    GF_UNUSED char *p = NULL;</div><div class='add'>+    va_list ap;</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(format);</div><div class='add'>+</div><div class='add'>+    va_start(ap, format);</div><div class='add'>+    if (vasprintf(&amp;msg, format, ap) != -1) {</div><div class='add'>+        p = _json_escape(msg, json_msg, GF_JSON_MSG_LENGTH);</div><div class='add'>+        syslog(facility_priority, "%s", msg);</div><div class='add'>+        free(msg);</div><div class='add'>+    } else</div><div class='add'>+        syslog(GF_LOG_CRITICAL, "vasprintf() failed, out of memory?");</div><div class='add'>+    va_end(ap);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+gf_log_globals_init(void *data, gf_loglevel_t level)</div><div class='add'>+{</div><div class='add'>+    glusterfs_ctx_t *ctx = data;</div><div class='ctx'> </div><div class='del'>-		va_end (ap);</div><div class='add'>+    pthread_mutex_init(&amp;ctx-&gt;log.logfile_mutex, NULL);</div><div class='ctx'> </div><div class='del'>-                len = strlen (str1);</div><div class='del'>-                msg = GF_MALLOC (len + strlen (str2) + 1, gf_common_mt_char);</div><div class='add'>+    ctx-&gt;log.loglevel = level;</div><div class='add'>+    ctx-&gt;log.gf_log_syslog = 1;</div><div class='add'>+    ctx-&gt;log.sys_log_level = GF_LOG_CRITICAL;</div><div class='add'>+    ctx-&gt;log.logger = gf_logger_glusterlog;</div><div class='add'>+    ctx-&gt;log.logformat = gf_logformat_withmsgid;</div><div class='add'>+    ctx-&gt;log.lru_size = GF_LOG_LRU_BUFSIZE_DEFAULT;</div><div class='add'>+    ctx-&gt;log.timeout = GF_LOG_FLUSH_TIMEOUT_DEFAULT;</div><div class='add'>+    ctx-&gt;log.localtime = GF_LOG_LOCALTIME_DEFAULT;</div><div class='ctx'> </div><div class='del'>-                strcpy (msg, str1);</div><div class='del'>-                strcpy (msg + len, str2);</div><div class='add'>+    pthread_mutex_init(&amp;ctx-&gt;log.log_buf_lock, NULL);</div><div class='ctx'> </div><div class='del'>-		fprintf (logfile, "%s\n", msg);</div><div class='del'>-		fflush (logfile);</div><div class='add'>+    INIT_LIST_HEAD(&amp;ctx-&gt;log.lru_queue);</div><div class='ctx'> </div><div class='ctx'> #ifdef GF_LINUX_HOST_OS</div><div class='del'>-                /* We want only serious log in 'syslog', not our debug</div><div class='del'>-                   and trace logs */</div><div class='del'>-                if (gf_log_syslog &amp;&amp; level &amp;&amp; (level &lt;= GF_LOG_ERROR))</div><div class='del'>-                        syslog ((level-1), "%s\n", msg);</div><div class='add'>+    /* For the 'syslog' output. one can grep 'GlusterFS' in syslog</div><div class='add'>+       for serious logs */</div><div class='add'>+    openlog("GlusterFS", LOG_PID, LOG_DAEMON);</div><div class='ctx'> #endif</div><div class='del'>-	}</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-unlock:</div><div class='del'>-	pthread_mutex_unlock (&amp;logfile_mutex);</div><div class='add'>+int</div><div class='add'>+gf_log_init(void *data, const char *file, const char *ident)</div><div class='add'>+{</div><div class='add'>+    glusterfs_ctx_t *ctx = data;</div><div class='add'>+    int fd = -1;</div><div class='add'>+    struct stat buf;</div><div class='add'>+</div><div class='add'>+    if (ctx == NULL) {</div><div class='add'>+        fprintf(stderr, "ERROR: ctx is NULL\n");</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+    if (ident) {</div><div class='add'>+        GF_FREE(ctx-&gt;log.ident);</div><div class='add'>+        ctx-&gt;log.ident = gf_strdup(ident);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* we keep the files and the syslog open, so that on logger change, we</div><div class='add'>+     * are ready to log anywhere, that the new value specifies */</div><div class='add'>+    if (ctx-&gt;log.ident) {</div><div class='add'>+        gf_openlog(ctx-&gt;log.ident, -1, LOG_DAEMON);</div><div class='add'>+    } else {</div><div class='add'>+        gf_openlog(NULL, -1, LOG_DAEMON);</div><div class='add'>+    }</div><div class='add'>+    /* TODO: make FACILITY configurable than LOG_DAEMON */</div><div class='add'>+    if (sys_stat(GF_LOG_CONTROL_FILE, &amp;buf) == 0) {</div><div class='add'>+        /* use syslog logging */</div><div class='add'>+        ctx-&gt;log.log_control_file_found = 1;</div><div class='add'>+    } else {</div><div class='add'>+        /* use old style logging */</div><div class='add'>+        ctx-&gt;log.log_control_file_found = 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (!file) {</div><div class='add'>+        fprintf(stderr, "ERROR: no filename specified\n");</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* free the (possible) previous filename */</div><div class='add'>+    GF_FREE(ctx-&gt;log.filename);</div><div class='add'>+    ctx-&gt;log.filename = NULL;</div><div class='add'>+</div><div class='add'>+    /* close and reopen logfile for log rotate */</div><div class='add'>+    if (ctx-&gt;log.logfile) {</div><div class='add'>+        fclose(ctx-&gt;log.logfile);</div><div class='add'>+        ctx-&gt;log.logfile = NULL;</div><div class='add'>+        ctx-&gt;log.gf_log_logfile = NULL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (strcmp(file, "-") == 0) {</div><div class='add'>+        int dupfd = -1;</div><div class='add'>+</div><div class='add'>+        ctx-&gt;log.filename = gf_strdup("/dev/stderr");</div><div class='add'>+        if (!ctx-&gt;log.filename) {</div><div class='add'>+            fprintf(stderr, "ERROR: strdup failed\n");</div><div class='add'>+            return -1;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-        if (msg) {</div><div class='del'>-                if ((ret != -1) &amp;&amp; __central_log_enabled &amp;&amp;</div><div class='del'>-                    ((glusterfs_central_log_flag_get ()) == 0)) {</div><div class='add'>+        dupfd = dup(fileno(stderr));</div><div class='add'>+        if (dupfd == -1) {</div><div class='add'>+            fprintf(stderr, "ERROR: could not dup %d (%s)\n", fileno(stderr),</div><div class='add'>+                    strerror(errno));</div><div class='add'>+            return -1;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-                        glusterfs_central_log_flag_set ();</div><div class='del'>-                        {</div><div class='del'>-                                //gf_log_central (msg);</div><div class='del'>-                        }</div><div class='del'>-                        glusterfs_central_log_flag_unset ();</div><div class='del'>-                }</div><div class='del'>-                GF_FREE (msg);</div><div class='add'>+        ctx-&gt;log.logfile = fdopen(dupfd, "a");</div><div class='add'>+        if (!ctx-&gt;log.logfile) {</div><div class='add'>+            fprintf(stderr, "ERROR: could not fdopen on %d (%s)\n", dupfd,</div><div class='add'>+                    strerror(errno));</div><div class='add'>+            sys_close(dupfd);</div><div class='add'>+            return -1;</div><div class='add'>+        }</div><div class='add'>+    } else {</div><div class='add'>+        /* Also create parent dir */</div><div class='add'>+        char *logdir = gf_strdup(file);</div><div class='add'>+        if (!logdir) {</div><div class='add'>+            return -1;</div><div class='add'>+        }</div><div class='add'>+        char *tmp_index = rindex(logdir, '/');</div><div class='add'>+        if (tmp_index) {</div><div class='add'>+            tmp_index[0] = '\0';</div><div class='add'>+        }</div><div class='add'>+        if (mkdir_p(logdir, 0755, true)) {</div><div class='add'>+            /* EEXIST is handled in mkdir_p() itself */</div><div class='add'>+            gf_smsg("logging", GF_LOG_ERROR, 0, LG_MSG_STRDUP_ERROR,</div><div class='add'>+                    "logdir=%s", logdir, "errno=%s", strerror(errno), NULL);</div><div class='add'>+            GF_FREE(logdir);</div><div class='add'>+            return -1;</div><div class='add'>+        }</div><div class='add'>+        /* no need of this variable */</div><div class='add'>+        GF_FREE(logdir);</div><div class='add'>+</div><div class='add'>+        ctx-&gt;log.filename = gf_strdup(file);</div><div class='add'>+        if (!ctx-&gt;log.filename) {</div><div class='add'>+            fprintf(stderr,</div><div class='add'>+                    "ERROR: updating log-filename failed: "</div><div class='add'>+                    "%s\n",</div><div class='add'>+                    strerror(errno));</div><div class='add'>+            return -1;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        fd = sys_open(file, O_CREAT | O_WRONLY | O_APPEND, S_IRUSR | S_IWUSR);</div><div class='add'>+        if (fd &lt; 0) {</div><div class='add'>+            fprintf(stderr,</div><div class='add'>+                    "ERROR: failed to create logfile"</div><div class='add'>+                    " \"%s\" (%s)\n",</div><div class='add'>+                    file, strerror(errno));</div><div class='add'>+            return -1;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        ctx-&gt;log.logfile = fdopen(fd, "a");</div><div class='add'>+        if (!ctx-&gt;log.logfile) {</div><div class='add'>+            fprintf(stderr,</div><div class='add'>+                    "ERROR: failed to open logfile \"%s\" "</div><div class='add'>+                    "(%s)\n",</div><div class='add'>+                    file, strerror(errno));</div><div class='add'>+            sys_close(fd);</div><div class='add'>+            return -1;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ctx-&gt;log.gf_log_logfile = ctx-&gt;log.logfile;</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+set_sys_log_level(gf_loglevel_t level)</div><div class='add'>+{</div><div class='add'>+    if (THIS-&gt;ctx)</div><div class='add'>+        THIS-&gt;ctx-&gt;log.sys_log_level = level;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* Check if we should be logging</div><div class='add'>+ * Return value: _gf_false : Print the log</div><div class='add'>+ *               _gf_true : Do not Print the log</div><div class='add'>+ */</div><div class='add'>+static gf_boolean_t</div><div class='add'>+skip_logging(xlator_t *this, gf_loglevel_t level)</div><div class='add'>+{</div><div class='add'>+    gf_loglevel_t existing_level = this-&gt;loglevel ? this-&gt;loglevel</div><div class='add'>+                                                  : this-&gt;ctx-&gt;log.loglevel;</div><div class='add'>+    if (level &gt; existing_level) {</div><div class='add'>+        return _gf_true;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (level == GF_LOG_NONE) {</div><div class='add'>+        return _gf_true;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return _gf_false;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+_gf_log_callingfn(const char *domain, const char *file, const char *function,</div><div class='add'>+                  int line, gf_loglevel_t level, const char *fmt, ...)</div><div class='add'>+{</div><div class='add'>+    const char *basename = NULL;</div><div class='add'>+    xlator_t *this = THIS;</div><div class='add'>+    char *logline = NULL;</div><div class='add'>+    char *msg = NULL;</div><div class='add'>+    char timestr[GF_TIMESTR_SIZE] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    char *callstr = NULL;</div><div class='add'>+    struct timeval tv = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int ret = 0;</div><div class='add'>+    va_list ap;</div><div class='add'>+    glusterfs_ctx_t *ctx = this-&gt;ctx;</div><div class='add'>+</div><div class='add'>+    if (!ctx)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    if (skip_logging(this, level))</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    if (!domain || !file || !function || !fmt) {</div><div class='add'>+        fprintf(stderr, "logging: %s:%s():%d: invalid argument\n", __FILE__,</div><div class='add'>+                __PRETTY_FUNCTION__, __LINE__);</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    basename = strrchr(file, '/');</div><div class='add'>+    if (basename)</div><div class='add'>+        basename++;</div><div class='add'>+    else</div><div class='add'>+        basename = file;</div><div class='add'>+</div><div class='add'>+    /*Saving the backtrace to pre-allocated ctx-&gt;btbuf</div><div class='add'>+     * to avoid allocating memory from the heap*/</div><div class='add'>+    callstr = gf_backtrace_save(NULL);</div><div class='add'>+</div><div class='add'>+    va_start(ap, fmt);</div><div class='add'>+    ret = vasprintf(&amp;msg, fmt, ap);</div><div class='add'>+    va_end(ap);</div><div class='add'>+    if (-1 == ret) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (ctx-&gt;log.log_control_file_found) {</div><div class='add'>+        int priority;</div><div class='add'>+        /* treat GF_LOG_TRACE and GF_LOG_NONE as LOG_DEBUG and</div><div class='add'>+           other level as is */</div><div class='add'>+        if (GF_LOG_TRACE == level || GF_LOG_NONE == level) {</div><div class='add'>+            priority = LOG_DEBUG;</div><div class='add'>+        } else {</div><div class='add'>+            priority = level - 1;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        gf_syslog(priority, "[%s:%d:%s] %s %d-%s: %s", basename, line, function,</div><div class='add'>+                  callstr, ((this-&gt;graph) ? this-&gt;graph-&gt;id : 0), domain, msg);</div><div class='add'>+</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = gettimeofday(&amp;tv, NULL);</div><div class='add'>+    if (-1 == ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    gf_time_fmt_tv(timestr, sizeof timestr, &amp;tv, gf_timefmt_FT);</div><div class='add'>+</div><div class='add'>+    ret = gf_asprintf(&amp;logline, "[%s] %c [%s:%d:%s] %s %d-%s: %s\n", timestr,</div><div class='add'>+                      gf_level_strings[level], basename, line, function,</div><div class='add'>+                      callstr, ((this-&gt;graph) ? this-&gt;graph-&gt;id : 0), domain,</div><div class='add'>+                      msg);</div><div class='add'>+    if (-1 == ret) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    pthread_mutex_lock(&amp;ctx-&gt;log.logfile_mutex);</div><div class='add'>+    {</div><div class='add'>+        if (ctx-&gt;log.logfile) {</div><div class='add'>+            fputs(logline, ctx-&gt;log.logfile);</div><div class='add'>+            fflush(ctx-&gt;log.logfile);</div><div class='add'>+        } else if (ctx-&gt;log.loglevel &gt;= level) {</div><div class='add'>+            fputs(logline, stderr);</div><div class='add'>+            fflush(stderr);</div><div class='ctx'>         }</div><div class='ctx'> </div><div class='del'>-        if (str1)</div><div class='del'>-                GF_FREE (str1);</div><div class='add'>+#ifdef GF_LINUX_HOST_OS</div><div class='add'>+        /* We want only serious log in 'syslog', not our debug</div><div class='add'>+           and trace logs */</div><div class='add'>+        if (ctx-&gt;log.gf_log_syslog &amp;&amp; level &amp;&amp;</div><div class='add'>+            (level &lt;= ctx-&gt;log.sys_log_level))</div><div class='add'>+            syslog((level - 1), "%s", logline);</div><div class='add'>+#endif</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        if (str2)</div><div class='del'>-                FREE (str2);</div><div class='add'>+    pthread_mutex_unlock(&amp;ctx-&gt;log.logfile_mutex);</div><div class='ctx'> </div><div class='ctx'> out:</div><div class='del'>-	return (0);</div><div class='add'>+</div><div class='add'>+    GF_FREE(logline);</div><div class='add'>+</div><div class='add'>+    FREE(msg);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+static int</div><div class='add'>+_gf_msg_plain_internal(gf_loglevel_t level, const char *msg)</div><div class='add'>+{</div><div class='add'>+    xlator_t *this = NULL;</div><div class='add'>+    glusterfs_ctx_t *ctx = NULL;</div><div class='add'>+    int priority;</div><div class='add'>+</div><div class='add'>+    this = THIS;</div><div class='add'>+    ctx = this-&gt;ctx;</div><div class='add'>+</div><div class='add'>+    /* log to the configured logging service */</div><div class='add'>+    switch (ctx-&gt;log.logger) {</div><div class='add'>+        case gf_logger_syslog:</div><div class='add'>+            if (ctx-&gt;log.log_control_file_found &amp;&amp; ctx-&gt;log.gf_log_syslog) {</div><div class='add'>+                SET_LOG_PRIO(level, priority);</div><div class='add'>+</div><div class='add'>+                syslog(priority, "%s", msg);</div><div class='add'>+                break;</div><div class='add'>+            }</div><div class='add'>+            /* NOTE: If syslog control file is absent, which is another</div><div class='add'>+             * way to control logging to syslog, then we will fall through</div><div class='add'>+             * to the gluster log. The ideal way to do things would be to</div><div class='add'>+             * not have the extra control file check */</div><div class='add'>+        case gf_logger_glusterlog:</div><div class='add'>+            pthread_mutex_lock(&amp;ctx-&gt;log.logfile_mutex);</div><div class='add'>+            {</div><div class='add'>+                if (ctx-&gt;log.logfile) {</div><div class='add'>+                    fprintf(ctx-&gt;log.logfile, "%s\n", msg);</div><div class='add'>+                    fflush(ctx-&gt;log.logfile);</div><div class='add'>+                } else {</div><div class='add'>+                    fprintf(stderr, "%s\n", msg);</div><div class='add'>+                    fflush(stderr);</div><div class='add'>+                }</div><div class='ctx'> </div><div class='del'>-struct _client_log {</div><div class='del'>-        char *identifier;</div><div class='del'>-        FILE *file;</div><div class='del'>-        struct list_head list;</div><div class='del'>-};</div><div class='add'>+#ifdef GF_LINUX_HOST_OS</div><div class='add'>+                /* We want only serious logs in 'syslog', not our debug</div><div class='add'>+                 * and trace logs */</div><div class='add'>+                if (ctx-&gt;log.gf_log_syslog &amp;&amp; level &amp;&amp;</div><div class='add'>+                    (level &lt;= ctx-&gt;log.sys_log_level))</div><div class='add'>+                    syslog((level - 1), "%s\n", msg);</div><div class='add'>+#endif</div><div class='add'>+            }</div><div class='add'>+            pthread_mutex_unlock(&amp;ctx-&gt;log.logfile_mutex);</div><div class='ctx'> </div><div class='del'>-struct _client_log *client_logs = NULL;</div><div class='add'>+            break;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-static void</div><div class='del'>-client_log_init (struct _client_log *cl, char *identifier)</div><div class='add'>+int</div><div class='add'>+_gf_msg_plain(gf_loglevel_t level, const char *fmt, ...)</div><div class='ctx'> {</div><div class='del'>-        int   ret = 0;</div><div class='del'>-        char *path = NULL;</div><div class='add'>+    xlator_t *this = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    va_list ap;</div><div class='add'>+    char *msg = NULL;</div><div class='add'>+    glusterfs_ctx_t *ctx = NULL;</div><div class='add'>+</div><div class='add'>+    this = THIS;</div><div class='add'>+    ctx = this-&gt;ctx;</div><div class='ctx'> </div><div class='del'>-        cl-&gt;identifier = identifier;</div><div class='add'>+    if (!ctx)</div><div class='add'>+        goto out;</div><div class='ctx'> </div><div class='del'>-        ret = gf_asprintf (&amp;path, "%s.client-%s", filename, identifier);</div><div class='del'>-        if (-1 == ret) {</div><div class='del'>-                return;</div><div class='add'>+    if (skip_logging(this, level))</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    va_start(ap, fmt);</div><div class='add'>+    ret = vasprintf(&amp;msg, fmt, ap);</div><div class='add'>+    va_end(ap);</div><div class='add'>+    if (-1 == ret) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = _gf_msg_plain_internal(level, msg);</div><div class='add'>+</div><div class='add'>+    FREE(msg);</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+_gf_msg_vplain(gf_loglevel_t level, const char *fmt, va_list ap)</div><div class='add'>+{</div><div class='add'>+    xlator_t *this = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    char *msg = NULL;</div><div class='add'>+    glusterfs_ctx_t *ctx = NULL;</div><div class='add'>+</div><div class='add'>+    this = THIS;</div><div class='add'>+    ctx = this-&gt;ctx;</div><div class='add'>+</div><div class='add'>+    if (!ctx)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    if (skip_logging(this, level))</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    ret = vasprintf(&amp;msg, fmt, ap);</div><div class='add'>+    if (-1 == ret) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = _gf_msg_plain_internal(level, msg);</div><div class='add'>+</div><div class='add'>+    FREE(msg);</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+_gf_msg_plain_nomem(gf_loglevel_t level, const char *msg)</div><div class='add'>+{</div><div class='add'>+    xlator_t *this = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    glusterfs_ctx_t *ctx = NULL;</div><div class='add'>+</div><div class='add'>+    this = THIS;</div><div class='add'>+    ctx = this-&gt;ctx;</div><div class='add'>+</div><div class='add'>+    if (!ctx)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    if (skip_logging(this, level))</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    ret = _gf_msg_plain_internal(level, msg);</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+_gf_msg_backtrace_nomem(gf_loglevel_t level, int stacksize)</div><div class='add'>+{</div><div class='add'>+    xlator_t *this = NULL;</div><div class='add'>+    glusterfs_ctx_t *ctx = NULL;</div><div class='add'>+    void *array[200];</div><div class='add'>+    size_t bt_size = 0;</div><div class='add'>+    int fd = -1;</div><div class='add'>+</div><div class='add'>+    this = THIS;</div><div class='add'>+    ctx = this-&gt;ctx;</div><div class='add'>+</div><div class='add'>+    if (!ctx)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    /* syslog does not have fd support, hence no no-mem variant */</div><div class='add'>+    if (ctx-&gt;log.logger != gf_logger_glusterlog)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    if (skip_logging(this, level))</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    bt_size = backtrace(array, ((stacksize &lt;= 200) ? stacksize : 200));</div><div class='add'>+    if (!bt_size)</div><div class='add'>+        goto out;</div><div class='add'>+    pthread_mutex_lock(&amp;ctx-&gt;log.logfile_mutex);</div><div class='add'>+    {</div><div class='add'>+        fd = ctx-&gt;log.logfile ? fileno(ctx-&gt;log.logfile) : fileno(stderr);</div><div class='add'>+        if (fd != -1) {</div><div class='add'>+            /* print to the file fd, to prevent any</div><div class='add'>+               allocations from backtrace_symbols</div><div class='add'>+             */</div><div class='add'>+            backtrace_symbols_fd(&amp;array[0], bt_size, fd);</div><div class='ctx'>         }</div><div class='del'>-        cl-&gt;file = fopen (path, "a");</div><div class='del'>-        GF_FREE (path);</div><div class='del'>-        </div><div class='del'>-        INIT_LIST_HEAD (&amp;cl-&gt;list);</div><div class='add'>+    }</div><div class='add'>+    pthread_mutex_unlock(&amp;ctx-&gt;log.logfile_mutex);</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+int</div><div class='add'>+_gf_msg_backtrace(int stacksize, char *callstr, size_t strsize)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int i = 0;</div><div class='add'>+    int size = 0;</div><div class='add'>+    int savstrsize = strsize;</div><div class='add'>+    void *array[200];</div><div class='add'>+    char **callingfn = NULL;</div><div class='add'>+</div><div class='add'>+    /* We chop off last 2 anyway, so if request is less than tolerance</div><div class='add'>+     * nothing to do */</div><div class='add'>+    if (stacksize &lt; 3)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    size = backtrace(array, ((stacksize &lt;= 200) ? stacksize : 200));</div><div class='add'>+    if ((size - 3) &lt; 0)</div><div class='add'>+        goto out;</div><div class='add'>+    if (size)</div><div class='add'>+        callingfn = backtrace_symbols(&amp;array[2], size - 2);</div><div class='add'>+    if (!callingfn)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    ret = snprintf(callstr, strsize, "(");</div><div class='add'>+    PRINT_SIZE_CHECK(ret, out, strsize);</div><div class='add'>+</div><div class='add'>+    for ((i = size - 3); i &gt;= 0; i--) {</div><div class='add'>+        ret = snprintf(callstr + savstrsize - strsize, strsize, "--&gt;%s ",</div><div class='add'>+                       callingfn[i]);</div><div class='add'>+        PRINT_SIZE_CHECK(ret, out, strsize);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = snprintf(callstr + savstrsize - strsize, strsize, ")");</div><div class='add'>+    PRINT_SIZE_CHECK(ret, out, strsize);</div><div class='add'>+out:</div><div class='add'>+    FREE(callingfn);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-static FILE *</div><div class='del'>-__logfile_for_client (char *identifier)</div><div class='add'>+int</div><div class='add'>+_gf_msg_nomem(const char *domain, const char *file, const char *function,</div><div class='add'>+              int line, gf_loglevel_t level, size_t size)</div><div class='ctx'> {</div><div class='del'>-        struct _client_log *client = NULL;</div><div class='add'>+    const char *basename = NULL;</div><div class='add'>+    xlator_t *this = NULL;</div><div class='add'>+    struct timeval tv = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int ret = 0;</div><div class='add'>+    int fd = -1;</div><div class='add'>+    char msg[2048] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    char timestr[GF_TIMESTR_SIZE] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    glusterfs_ctx_t *ctx = NULL;</div><div class='add'>+    int wlen = 0;</div><div class='add'>+    int priority;</div><div class='add'>+    struct rusage r_usage;</div><div class='add'>+</div><div class='add'>+    this = THIS;</div><div class='add'>+    ctx = this-&gt;ctx;</div><div class='add'>+</div><div class='add'>+    if (!ctx)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    if (skip_logging(this, level))</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    if (!domain || !file || !function) {</div><div class='add'>+        fprintf(stderr, "logging: %s:%s():%d: invalid argument\n", __FILE__,</div><div class='add'>+                __PRETTY_FUNCTION__, __LINE__);</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    GET_FILE_NAME_TO_LOG(file, basename);</div><div class='add'>+</div><div class='add'>+    ret = gettimeofday(&amp;tv, NULL);</div><div class='add'>+    if (-1 == ret)</div><div class='add'>+        goto out;</div><div class='add'>+    gf_time_fmt_tv(timestr, sizeof timestr, &amp;tv, gf_timefmt_FT);</div><div class='add'>+</div><div class='add'>+    /* TODO: Currently we print in the enhanced format, with a message ID</div><div class='add'>+     * of 0. Need to enhance this to support format as configured */</div><div class='add'>+    wlen = snprintf(</div><div class='add'>+        msg, sizeof msg,</div><div class='add'>+        "[%s] %c [MSGID: %" PRIu64</div><div class='add'>+        "]"</div><div class='add'>+        " [%s:%d:%s] %s: no memory "</div><div class='add'>+        "available for size (%" GF_PRI_SIZET</div><div class='add'>+        ") current memory usage in kilobytes %ld"</div><div class='add'>+        " [call stack follows]\n",</div><div class='add'>+        timestr, gf_level_strings[level], (uint64_t)0, basename, line, function,</div><div class='add'>+        domain, size,</div><div class='add'>+        (!getrusage(RUSAGE_SELF, &amp;r_usage) ? r_usage.ru_maxrss : 0));</div><div class='add'>+    if (-1 == wlen) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* log to the configured logging service */</div><div class='add'>+    switch (ctx-&gt;log.logger) {</div><div class='add'>+        case gf_logger_syslog:</div><div class='add'>+            if (ctx-&gt;log.log_control_file_found &amp;&amp; ctx-&gt;log.gf_log_syslog) {</div><div class='add'>+                SET_LOG_PRIO(level, priority);</div><div class='add'>+</div><div class='add'>+                /* if syslog allocates, then this may fail, but we</div><div class='add'>+                 * cannot do much about it at the moment */</div><div class='add'>+                /* There is no fd for syslog, hence no stack printed */</div><div class='add'>+                syslog(priority, "%s", msg);</div><div class='add'>+                break;</div><div class='add'>+            }</div><div class='add'>+            /* NOTE: If syslog control file is absent, which is another</div><div class='add'>+             * way to control logging to syslog, then we will fall through</div><div class='add'>+             * to the gluster log. The ideal way to do things would be to</div><div class='add'>+             * not have the extra control file check */</div><div class='add'>+        case gf_logger_glusterlog:</div><div class='add'>+            pthread_mutex_lock(&amp;ctx-&gt;log.logfile_mutex);</div><div class='add'>+            {</div><div class='add'>+                fd = ctx-&gt;log.logfile ? fileno(ctx-&gt;log.logfile)</div><div class='add'>+                                      : fileno(stderr);</div><div class='add'>+                if (fd == -1) {</div><div class='add'>+                    pthread_mutex_unlock(&amp;ctx-&gt;log.logfile_mutex);</div><div class='add'>+                    goto out;</div><div class='add'>+                }</div><div class='add'>+</div><div class='add'>+                /* write directly to the fd to prevent out of order</div><div class='add'>+                 * message and stack */</div><div class='add'>+                ret = sys_write(fd, msg, wlen);</div><div class='add'>+                if (ret == -1) {</div><div class='add'>+                    pthread_mutex_unlock(&amp;ctx-&gt;log.logfile_mutex);</div><div class='add'>+                    goto out;</div><div class='add'>+                }</div><div class='add'>+#ifdef GF_LINUX_HOST_OS</div><div class='add'>+                /* We want only serious log in 'syslog', not our debug</div><div class='add'>+                 * and trace logs */</div><div class='add'>+                if (ctx-&gt;log.gf_log_syslog &amp;&amp; level &amp;&amp;</div><div class='add'>+                    (level &lt;= ctx-&gt;log.sys_log_level))</div><div class='add'>+                    syslog((level - 1), "%s\n", msg);</div><div class='add'>+#endif</div><div class='add'>+            }</div><div class='add'>+            pthread_mutex_unlock(&amp;ctx-&gt;log.logfile_mutex);</div><div class='ctx'> </div><div class='del'>-        if (!client_logs) {</div><div class='del'>-                client = GF_CALLOC (1, sizeof (*client),</div><div class='del'>-                                        gf_common_mt_client_log);</div><div class='del'>-                if (!client)</div><div class='del'>-                        return NULL;</div><div class='add'>+            _gf_msg_backtrace_nomem(level, GF_LOG_BACKTRACE_DEPTH);</div><div class='ctx'> </div><div class='del'>-                client_log_init (client, identifier);</div><div class='add'>+            break;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-                client_logs = client;</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+gf_log_syslog(glusterfs_ctx_t *ctx, const char *domain, const char *file,</div><div class='add'>+              const char *function, int32_t line, gf_loglevel_t level,</div><div class='add'>+              int errnum, uint64_t msgid, char **appmsgstr, char *callstr,</div><div class='add'>+              int graph_id, gf_log_format_t fmt)</div><div class='add'>+{</div><div class='add'>+    int priority;</div><div class='add'>+</div><div class='add'>+    SET_LOG_PRIO(level, priority);</div><div class='add'>+</div><div class='add'>+    /* log with appropriate format */</div><div class='add'>+    switch (fmt) {</div><div class='add'>+        case gf_logformat_traditional:</div><div class='add'>+            if (!callstr) {</div><div class='add'>+                if (errnum)</div><div class='add'>+                    syslog(priority, "[%s:%d:%s] %d-%s: %s [%s]", file, line,</div><div class='add'>+                           function, graph_id, domain, *appmsgstr,</div><div class='add'>+                           strerror(errnum));</div><div class='add'>+                else</div><div class='add'>+                    syslog(priority, "[%s:%d:%s] %d-%s: %s", file, line,</div><div class='add'>+                           function, graph_id, domain, *appmsgstr);</div><div class='add'>+            } else {</div><div class='add'>+                if (errnum)</div><div class='add'>+                    syslog(priority,</div><div class='add'>+                           "[%s:%d:%s] %s %d-%s:"</div><div class='add'>+                           " %s [%s]",</div><div class='add'>+                           file, line, function, callstr, graph_id, domain,</div><div class='add'>+                           *appmsgstr, strerror(errnum));</div><div class='add'>+                else</div><div class='add'>+                    syslog(priority, "[%s:%d:%s] %s %d-%s: %s", file, line,</div><div class='add'>+                           function, callstr, graph_id, domain, *appmsgstr);</div><div class='add'>+            }</div><div class='add'>+            break;</div><div class='add'>+        case gf_logformat_withmsgid:</div><div class='add'>+            if (!callstr) {</div><div class='add'>+                if (errnum)</div><div class='add'>+                    syslog(priority,</div><div class='add'>+                           "[MSGID: %" PRIu64</div><div class='add'>+                           "]"</div><div class='add'>+                           " [%s:%d:%s] %d-%s: %s [%s]",</div><div class='add'>+                           msgid, file, line, function, graph_id, domain,</div><div class='add'>+                           *appmsgstr, strerror(errnum));</div><div class='add'>+                else</div><div class='add'>+                    syslog(priority,</div><div class='add'>+                           "[MSGID: %" PRIu64</div><div class='add'>+                           "]"</div><div class='add'>+                           " [%s:%d:%s] %d-%s: %s",</div><div class='add'>+                           msgid, file, line, function, graph_id, domain,</div><div class='add'>+                           *appmsgstr);</div><div class='add'>+            } else {</div><div class='add'>+                if (errnum)</div><div class='add'>+                    syslog(priority,</div><div class='add'>+                           "[MSGID: %" PRIu64</div><div class='add'>+                           "]"</div><div class='add'>+                           " [%s:%d:%s] %s %d-%s: %s [%s]",</div><div class='add'>+                           msgid, file, line, function, callstr, graph_id,</div><div class='add'>+                           domain, *appmsgstr, strerror(errnum));</div><div class='add'>+                else</div><div class='add'>+                    syslog(priority,</div><div class='add'>+                           "[MSGID: %" PRIu64</div><div class='add'>+                           "]"</div><div class='add'>+                           " [%s:%d:%s] %s %d-%s: %s",</div><div class='add'>+                           msgid, file, line, function, callstr, graph_id,</div><div class='add'>+                           domain, *appmsgstr);</div><div class='add'>+            }</div><div class='add'>+            break;</div><div class='add'>+        case gf_logformat_cee:</div><div class='add'>+            /* TODO: Enhance CEE with additional parameters */</div><div class='add'>+            gf_syslog(priority, "[%s:%d:%s] %d-%s: %s", file, line, function,</div><div class='add'>+                      graph_id, domain, *appmsgstr);</div><div class='add'>+            break;</div><div class='add'>+</div><div class='add'>+        default:</div><div class='add'>+            /* NOTE: should not get here without logging */</div><div class='add'>+            break;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* TODO: There can be no errors from gf_syslog? */</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+gf_log_glusterlog(glusterfs_ctx_t *ctx, const char *domain, const char *file,</div><div class='add'>+                  const char *function, int32_t line, gf_loglevel_t level,</div><div class='add'>+                  int errnum, uint64_t msgid, char **appmsgstr, char *callstr,</div><div class='add'>+                  struct timeval tv, int graph_id, gf_log_format_t fmt)</div><div class='add'>+{</div><div class='add'>+    char timestr[GF_TIMESTR_SIZE] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    char *header = NULL;</div><div class='add'>+    char *footer = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    /* rotate if required */</div><div class='add'>+    gf_log_rotate(ctx);</div><div class='add'>+</div><div class='add'>+    /* format the time stamp */</div><div class='add'>+    gf_time_fmt_tv(timestr, sizeof timestr, &amp;tv, gf_timefmt_FT);</div><div class='add'>+</div><div class='add'>+    /* generate footer */</div><div class='add'>+    if (errnum) {</div><div class='add'>+        ret = gf_asprintf(&amp;footer, " [%s]\n", strerror(errnum));</div><div class='add'>+    } else {</div><div class='add'>+        ret = gf_asprintf(&amp;footer, " \n");</div><div class='add'>+    }</div><div class='add'>+    if (-1 == ret) {</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* generate message, inc. the header */</div><div class='add'>+    if (fmt == gf_logformat_traditional) {</div><div class='add'>+        if (!callstr) {</div><div class='add'>+            ret = gf_asprintf(&amp;header,</div><div class='add'>+                              "[%s] %c [%s:%d:%s]"</div><div class='add'>+                              " %d-%s: %s",</div><div class='add'>+                              timestr, gf_level_strings[level], file, line,</div><div class='add'>+                              function, graph_id, domain, *appmsgstr);</div><div class='add'>+        } else {</div><div class='add'>+            ret = gf_asprintf(&amp;header,</div><div class='add'>+                              "[%s] %c [%s:%d:%s] %s"</div><div class='add'>+                              " %d-%s: %s",</div><div class='add'>+                              timestr, gf_level_strings[level], file, line,</div><div class='add'>+                              function, callstr, graph_id, domain, *appmsgstr);</div><div class='add'>+        }</div><div class='add'>+    } else { /* gf_logformat_withmsgid */</div><div class='add'>+        /* CEE log format unsupported in logger_glusterlog, so just</div><div class='add'>+         * print enhanced log format */</div><div class='add'>+        if (!callstr) {</div><div class='add'>+            ret = gf_asprintf(&amp;header,</div><div class='add'>+                              "[%s] %c [MSGID: %" PRIu64</div><div class='add'>+                              "]"</div><div class='add'>+                              " [%s:%d:%s] %d-%s: %s",</div><div class='add'>+                              timestr, gf_level_strings[level], msgid, file,</div><div class='add'>+                              line, function, graph_id, domain, *appmsgstr);</div><div class='add'>+        } else {</div><div class='add'>+            ret = gf_asprintf(&amp;header,</div><div class='add'>+                              "[%s] %c [MSGID: %" PRIu64</div><div class='add'>+                              "]"</div><div class='add'>+                              " [%s:%d:%s] %s %d-%s: %s",</div><div class='add'>+                              timestr, gf_level_strings[level], msgid, file,</div><div class='add'>+                              line, function, callstr, graph_id, domain,</div><div class='add'>+                              *appmsgstr);</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    if (-1 == ret) {</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* send the full message to log */</div><div class='add'>+</div><div class='add'>+    pthread_mutex_lock(&amp;ctx-&gt;log.logfile_mutex);</div><div class='add'>+    {</div><div class='add'>+        if (ctx-&gt;log.logfile) {</div><div class='add'>+            fprintf(ctx-&gt;log.logfile, "%s%s", header, footer);</div><div class='add'>+            fflush(ctx-&gt;log.logfile);</div><div class='add'>+        } else if (ctx-&gt;log.loglevel &gt;= level) {</div><div class='add'>+            fprintf(stderr, "%s%s", header, footer);</div><div class='add'>+            fflush(stderr);</div><div class='ctx'>         }</div><div class='ctx'> </div><div class='del'>-        list_for_each_entry (client, &amp;client_logs-&gt;list, list) {</div><div class='del'>-                if (!strcmp (client-&gt;identifier, identifier))</div><div class='del'>-                        break;</div><div class='add'>+#ifdef GF_LINUX_HOST_OS</div><div class='add'>+        /* We want only serious logs in 'syslog', not our debug</div><div class='add'>+         * and trace logs */</div><div class='add'>+        if (ctx-&gt;log.gf_log_syslog &amp;&amp; level &amp;&amp;</div><div class='add'>+            (level &lt;= ctx-&gt;log.sys_log_level)) {</div><div class='add'>+            syslog((level - 1), "%s%s", header, footer);</div><div class='ctx'>         }</div><div class='add'>+#endif</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        if (!client) {</div><div class='del'>-                client = GF_CALLOC (1, sizeof (*client),</div><div class='del'>-                                        gf_common_mt_client_log);</div><div class='del'>-                if (!client)</div><div class='del'>-                        return NULL;</div><div class='add'>+    /* TODO: Plugin in memory log buffer retention here. For logs not</div><div class='add'>+     * flushed during cores, it would be useful to retain some of the last</div><div class='add'>+     * few messages in memory */</div><div class='add'>+    pthread_mutex_unlock(&amp;ctx-&gt;log.logfile_mutex);</div><div class='add'>+    ret = 0;</div><div class='ctx'> </div><div class='del'>-                client_log_init (client, identifier);</div><div class='add'>+err:</div><div class='add'>+    GF_FREE(header);</div><div class='add'>+    GF_FREE(footer);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+gf_syslog_log_repetitions(const char *domain, const char *file,</div><div class='add'>+                          const char *function, int32_t line,</div><div class='add'>+                          gf_loglevel_t level, int errnum, uint64_t msgid,</div><div class='add'>+                          char **appmsgstr, char *callstr, int refcount,</div><div class='add'>+                          struct timeval oldest, struct timeval latest,</div><div class='add'>+                          int graph_id)</div><div class='add'>+{</div><div class='add'>+    int priority;</div><div class='add'>+    char timestr_latest[GF_TIMESTR_SIZE] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    char timestr_oldest[GF_TIMESTR_SIZE] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    SET_LOG_PRIO(level, priority);</div><div class='add'>+</div><div class='add'>+    gf_time_fmt_tv(timestr_latest, sizeof timestr_latest, &amp;latest,</div><div class='add'>+                   gf_timefmt_FT);</div><div class='add'>+    gf_time_fmt_tv(timestr_oldest, sizeof timestr_oldest, &amp;oldest,</div><div class='add'>+                   gf_timefmt_FT);</div><div class='add'>+</div><div class='add'>+    if (errnum) {</div><div class='add'>+        syslog(priority,</div><div class='add'>+               "The message \"[MSGID: %" PRIu64</div><div class='add'>+               "] [%s:%d:%s] "</div><div class='add'>+               "%d-%s: %s [%s] \" repeated %d times between %s"</div><div class='add'>+               " and %s",</div><div class='add'>+               msgid, file, line, function, graph_id, domain, *appmsgstr,</div><div class='add'>+               strerror(errnum), refcount, timestr_oldest, timestr_latest);</div><div class='add'>+    } else {</div><div class='add'>+        syslog(priority,</div><div class='add'>+               "The message \"[MSGID: %" PRIu64</div><div class='add'>+               "] [%s:%d:%s] "</div><div class='add'>+               "%d-%s: %s \" repeated %d times between %s"</div><div class='add'>+               " and %s",</div><div class='add'>+               msgid, file, line, function, graph_id, domain, *appmsgstr,</div><div class='add'>+               refcount, timestr_oldest, timestr_latest);</div><div class='add'>+    }</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-                list_add_tail (&amp;client-&gt;list, &amp;client_logs-&gt;list);</div><div class='add'>+static int</div><div class='add'>+gf_glusterlog_log_repetitions(glusterfs_ctx_t *ctx, const char *domain,</div><div class='add'>+                              const char *file, const char *function,</div><div class='add'>+                              int32_t line, gf_loglevel_t level, int errnum,</div><div class='add'>+                              uint64_t msgid, char **appmsgstr, char *callstr,</div><div class='add'>+                              int refcount, struct timeval oldest,</div><div class='add'>+                              struct timeval latest, int graph_id)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+    char timestr_latest[GF_TIMESTR_SIZE] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    char timestr_oldest[GF_TIMESTR_SIZE] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    char errstr[256] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    char *header = NULL;</div><div class='add'>+    char *footer = NULL;</div><div class='add'>+</div><div class='add'>+    if (!ctx)</div><div class='add'>+        goto err;</div><div class='add'>+</div><div class='add'>+    gf_log_rotate(ctx);</div><div class='add'>+</div><div class='add'>+    ret = gf_asprintf(&amp;header,</div><div class='add'>+                      "The message \"%c [MSGID: %" PRIu64</div><div class='add'>+                      "]"</div><div class='add'>+                      " [%s:%d:%s] %d-%s: %s",</div><div class='add'>+                      gf_level_strings[level], msgid, file, line, function,</div><div class='add'>+                      graph_id, domain, *appmsgstr);</div><div class='add'>+    if (-1 == ret) {</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    gf_time_fmt_tv(timestr_latest, sizeof timestr_latest, &amp;latest,</div><div class='add'>+                   gf_timefmt_FT);</div><div class='add'>+</div><div class='add'>+    gf_time_fmt_tv(timestr_oldest, sizeof timestr_oldest, &amp;oldest,</div><div class='add'>+                   gf_timefmt_FT);</div><div class='add'>+</div><div class='add'>+    if (errnum)</div><div class='add'>+        snprintf(errstr, sizeof(errstr) - 1, " [%s]", strerror(errnum));</div><div class='add'>+</div><div class='add'>+    ret = gf_asprintf(&amp;footer, "%s\" repeated %d times between [%s] and [%s]",</div><div class='add'>+                      errstr, refcount, timestr_oldest, timestr_latest);</div><div class='add'>+    if (-1 == ret) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    pthread_mutex_lock(&amp;ctx-&gt;log.logfile_mutex);</div><div class='add'>+    {</div><div class='add'>+        if (ctx-&gt;log.logfile) {</div><div class='add'>+            fprintf(ctx-&gt;log.logfile, "%s%s\n", header, footer);</div><div class='add'>+            fflush(ctx-&gt;log.logfile);</div><div class='add'>+        } else if (ctx-&gt;log.loglevel &gt;= level) {</div><div class='add'>+            fprintf(stderr, "%s%s\n", header, footer);</div><div class='add'>+            fflush(stderr);</div><div class='ctx'>         }</div><div class='ctx'> </div><div class='del'>-        return client-&gt;file;</div><div class='add'>+#ifdef GF_LINUX_HOST_OS</div><div class='add'>+        /* We want only serious logs in 'syslog', not our debug</div><div class='add'>+         * and trace logs */</div><div class='add'>+        if (ctx-&gt;log.gf_log_syslog &amp;&amp; level &amp;&amp;</div><div class='add'>+            (level &lt;= ctx-&gt;log.sys_log_level))</div><div class='add'>+            syslog((level - 1), "%s%s\n", header, footer);</div><div class='add'>+#endif</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* TODO: Plugin in memory log buffer retention here. For logs not</div><div class='add'>+     * flushed during cores, it would be useful to retain some of the last</div><div class='add'>+     * few messages in memory */</div><div class='add'>+    pthread_mutex_unlock(&amp;ctx-&gt;log.logfile_mutex);</div><div class='add'>+    ret = 0;</div><div class='add'>+</div><div class='add'>+err:</div><div class='add'>+    GF_FREE(header);</div><div class='add'>+    GF_FREE(footer);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+gf_log_print_with_repetitions(glusterfs_ctx_t *ctx, const char *domain,</div><div class='add'>+                              const char *file, const char *function,</div><div class='add'>+                              int32_t line, gf_loglevel_t level, int errnum,</div><div class='add'>+                              uint64_t msgid, char **appmsgstr, char *callstr,</div><div class='add'>+                              int refcount, struct timeval oldest,</div><div class='add'>+                              struct timeval latest, int graph_id)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    gf_log_logger_t logger = ctx-&gt;log.logger;</div><div class='add'>+</div><div class='add'>+    switch (logger) {</div><div class='add'>+        case gf_logger_syslog:</div><div class='add'>+            if (ctx-&gt;log.log_control_file_found &amp;&amp; ctx-&gt;log.gf_log_syslog) {</div><div class='add'>+                ret = gf_syslog_log_repetitions(</div><div class='add'>+                    domain, file, function, line, level, errnum, msgid,</div><div class='add'>+                    appmsgstr, callstr, refcount, oldest, latest, graph_id);</div><div class='add'>+                break;</div><div class='add'>+            }</div><div class='add'>+            /* NOTE: If syslog control file is absent, which is another</div><div class='add'>+             * way to control logging to syslog, then we will fall through</div><div class='add'>+             * to the gluster log. The ideal way to do things would be to</div><div class='add'>+             * not have the extra control file check */</div><div class='add'>+</div><div class='add'>+        case gf_logger_glusterlog:</div><div class='add'>+            ret = gf_glusterlog_log_repetitions(</div><div class='add'>+                ctx, domain, file, function, line, level, errnum, msgid,</div><div class='add'>+                appmsgstr, callstr, refcount, oldest, latest, graph_id);</div><div class='add'>+            break;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+gf_log_print_plain_fmt(glusterfs_ctx_t *ctx, const char *domain,</div><div class='add'>+                       const char *file, const char *function, int32_t line,</div><div class='add'>+                       gf_loglevel_t level, int errnum, uint64_t msgid,</div><div class='add'>+                       char **appmsgstr, char *callstr, struct timeval tv,</div><div class='add'>+                       int graph_id, gf_log_format_t fmt)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    gf_log_logger_t logger = 0;</div><div class='add'>+</div><div class='add'>+    logger = ctx-&gt;log.logger;</div><div class='add'>+</div><div class='add'>+    /* log to the configured logging service */</div><div class='add'>+    switch (logger) {</div><div class='add'>+        case gf_logger_syslog:</div><div class='add'>+            if (ctx-&gt;log.log_control_file_found &amp;&amp; ctx-&gt;log.gf_log_syslog) {</div><div class='add'>+                ret = gf_log_syslog(ctx, domain, file, function, line, level,</div><div class='add'>+                                    errnum, msgid, appmsgstr, callstr, graph_id,</div><div class='add'>+                                    fmt);</div><div class='add'>+                break;</div><div class='add'>+            }</div><div class='add'>+            /* NOTE: If syslog control file is absent, which is another</div><div class='add'>+             * way to control logging to syslog, then we will fall through</div><div class='add'>+             * to the gluster log. The ideal way to do things would be to</div><div class='add'>+             * not have the extra control file check */</div><div class='add'>+        case gf_logger_glusterlog:</div><div class='add'>+            ret = gf_log_glusterlog(ctx, domain, file, function, line, level,</div><div class='add'>+                                    errnum, msgid, appmsgstr, callstr, tv,</div><div class='add'>+                                    graph_id, fmt);</div><div class='add'>+            break;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+gf_log_flush_message(log_buf_t *buf, glusterfs_ctx_t *ctx)</div><div class='add'>+{</div><div class='add'>+    if (buf-&gt;refcount == 1) {</div><div class='add'>+        (void)gf_log_print_plain_fmt(ctx, buf-&gt;domain, buf-&gt;file, buf-&gt;function,</div><div class='add'>+                                     buf-&gt;line, buf-&gt;level, buf-&gt;errnum,</div><div class='add'>+                                     buf-&gt;msg_id, &amp;buf-&gt;msg, NULL, buf-&gt;latest,</div><div class='add'>+                                     buf-&gt;graph_id, gf_logformat_withmsgid);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (buf-&gt;refcount &gt; 1) {</div><div class='add'>+        gf_log_print_with_repetitions(</div><div class='add'>+            ctx, buf-&gt;domain, buf-&gt;file, buf-&gt;function, buf-&gt;line, buf-&gt;level,</div><div class='add'>+            buf-&gt;errnum, buf-&gt;msg_id, &amp;buf-&gt;msg, NULL, buf-&gt;refcount,</div><div class='add'>+            buf-&gt;oldest, buf-&gt;latest, buf-&gt;graph_id);</div><div class='add'>+    }</div><div class='add'>+    return;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+static void</div><div class='add'>+gf_log_flush_list(struct list_head *copy, glusterfs_ctx_t *ctx)</div><div class='add'>+{</div><div class='add'>+    log_buf_t *iter = NULL;</div><div class='add'>+    log_buf_t *tmp = NULL;</div><div class='add'>+</div><div class='add'>+    list_for_each_entry_safe(iter, tmp, copy, msg_list)</div><div class='add'>+    {</div><div class='add'>+        gf_log_flush_message(iter, ctx);</div><div class='add'>+        list_del_init(&amp;iter-&gt;msg_list);</div><div class='add'>+        log_buf_destroy(iter);</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+gf_log_flush_msgs(glusterfs_ctx_t *ctx)</div><div class='add'>+{</div><div class='add'>+    struct list_head copy;</div><div class='add'>+</div><div class='add'>+    INIT_LIST_HEAD(&amp;copy);</div><div class='add'>+</div><div class='add'>+    pthread_mutex_lock(&amp;ctx-&gt;log.log_buf_lock);</div><div class='add'>+    {</div><div class='add'>+        list_splice_init(&amp;ctx-&gt;log.lru_queue, &amp;copy);</div><div class='add'>+        ctx-&gt;log.lru_cur_size = 0;</div><div class='add'>+    }</div><div class='add'>+    pthread_mutex_unlock(&amp;ctx-&gt;log.log_buf_lock);</div><div class='add'>+</div><div class='add'>+    gf_log_flush_list(&amp;copy, ctx);</div><div class='add'>+</div><div class='add'>+    return;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf_log_flush_extra_msgs(glusterfs_ctx_t *ctx, uint32_t new)</div><div class='add'>+{</div><div class='add'>+    int count = 0;</div><div class='add'>+    int i = 0;</div><div class='add'>+    log_buf_t *iter = NULL;</div><div class='add'>+    log_buf_t *tmp = NULL;</div><div class='add'>+    struct list_head copy;</div><div class='add'>+</div><div class='add'>+    INIT_LIST_HEAD(&amp;copy);</div><div class='add'>+</div><div class='add'>+    /* If the number of outstanding log messages does not cause list</div><div class='add'>+     * overflow even after reducing the size of the list, then do nothing.</div><div class='add'>+     * Otherwise (that is if there are more items in the list than there</div><div class='add'>+     * need to be after reducing its size), move the least recently used</div><div class='add'>+     * 'diff' elements to be flushed into a separate list...</div><div class='add'>+     */</div><div class='add'>+</div><div class='add'>+    pthread_mutex_lock(&amp;ctx-&gt;log.log_buf_lock);</div><div class='add'>+    {</div><div class='add'>+        if (ctx-&gt;log.lru_cur_size &lt;= new)</div><div class='add'>+            goto unlock;</div><div class='add'>+        count = ctx-&gt;log.lru_cur_size - new;</div><div class='add'>+        list_for_each_entry_safe(iter, tmp, &amp;ctx-&gt;log.lru_queue, msg_list)</div><div class='add'>+        {</div><div class='add'>+            if (i == count)</div><div class='add'>+                break;</div><div class='add'>+</div><div class='add'>+            list_del_init(&amp;iter-&gt;msg_list);</div><div class='add'>+            list_add_tail(&amp;iter-&gt;msg_list, &amp;copy);</div><div class='add'>+            i++;</div><div class='add'>+        }</div><div class='add'>+        ctx-&gt;log.lru_cur_size = ctx-&gt;log.lru_cur_size - count;</div><div class='add'>+    }</div><div class='add'>+    // ... quickly unlock ...</div><div class='add'>+unlock:</div><div class='add'>+    pthread_mutex_unlock(&amp;ctx-&gt;log.log_buf_lock);</div><div class='add'>+    if (list_empty(&amp;copy))</div><div class='add'>+        return;</div><div class='add'>+</div><div class='add'>+    TEST_LOG(</div><div class='add'>+        "Log buffer size reduced. About to flush %d extra log "</div><div class='add'>+        "messages",</div><div class='add'>+        count);</div><div class='add'>+    // ... and then flush them outside the lock.</div><div class='add'>+    gf_log_flush_list(&amp;copy, ctx);</div><div class='add'>+    TEST_LOG("Just flushed %d extra log messages", count);</div><div class='add'>+</div><div class='add'>+    return;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+__gf_log_inject_timer_event(glusterfs_ctx_t *ctx)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    struct timespec timeout = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    if (!ctx)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    if (ctx-&gt;log.log_flush_timer) {</div><div class='add'>+        gf_timer_call_cancel(ctx, ctx-&gt;log.log_flush_timer);</div><div class='add'>+        ctx-&gt;log.log_flush_timer = NULL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    timeout.tv_sec = ctx-&gt;log.timeout;</div><div class='add'>+    timeout.tv_nsec = 0;</div><div class='add'>+</div><div class='add'>+    TEST_LOG("Starting timer now. Timeout = %u, current buf size = %d",</div><div class='add'>+             ctx-&gt;log.timeout, ctx-&gt;log.lru_size);</div><div class='add'>+    ctx-&gt;log.log_flush_timer = gf_timer_call_after(</div><div class='add'>+        ctx, timeout, gf_log_flush_timeout_cbk, (void *)ctx);</div><div class='add'>+    if (!ctx-&gt;log.log_flush_timer)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-gf_log_from_client (const char *msg, char *identifier)</div><div class='add'>+gf_log_inject_timer_event(glusterfs_ctx_t *ctx)</div><div class='ctx'> {</div><div class='del'>-        FILE *client_log = NULL;</div><div class='add'>+    int ret = -1;</div><div class='ctx'> </div><div class='del'>-        client_log = __logfile_for_client (identifier);</div><div class='add'>+    if (!ctx)</div><div class='add'>+        return -1;</div><div class='ctx'> </div><div class='del'>-        fprintf (client_log, "%s\n", msg);</div><div class='del'>-        fflush (client_log);</div><div class='add'>+    pthread_mutex_lock(&amp;ctx-&gt;log.log_buf_lock);</div><div class='add'>+    {</div><div class='add'>+        ret = __gf_log_inject_timer_event(ctx);</div><div class='add'>+    }</div><div class='add'>+    pthread_mutex_unlock(&amp;ctx-&gt;log.log_buf_lock);</div><div class='ctx'> </div><div class='del'>-        return 0;</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+gf_log_flush_timeout_cbk(void *data)</div><div class='add'>+{</div><div class='add'>+    glusterfs_ctx_t *ctx = NULL;</div><div class='add'>+</div><div class='add'>+    ctx = (glusterfs_ctx_t *)data;</div><div class='add'>+</div><div class='add'>+    TEST_LOG(</div><div class='add'>+        "Log timer timed out. About to flush outstanding messages if "</div><div class='add'>+        "present");</div><div class='add'>+    gf_log_flush_msgs(ctx);</div><div class='add'>+</div><div class='add'>+    (void)gf_log_inject_timer_event(ctx);</div><div class='add'>+</div><div class='add'>+    return;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+_gf_msg_internal(const char *domain, const char *file, const char *function,</div><div class='add'>+                 int32_t line, gf_loglevel_t level, int errnum, uint64_t msgid,</div><div class='add'>+                 char **appmsgstr, char *callstr, int graph_id)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    uint32_t size = 0;</div><div class='add'>+    const char *basename = NULL;</div><div class='add'>+    xlator_t *this = NULL;</div><div class='add'>+    glusterfs_ctx_t *ctx = NULL;</div><div class='add'>+    log_buf_t *iter = NULL;</div><div class='add'>+    log_buf_t *buf_tmp = NULL;</div><div class='add'>+    log_buf_t *buf_new = NULL;</div><div class='add'>+    log_buf_t *first = NULL;</div><div class='add'>+    struct timeval tv = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    gf_boolean_t found = _gf_false;</div><div class='add'>+    gf_boolean_t flush_lru = _gf_false;</div><div class='add'>+    gf_boolean_t flush_logged_msg = _gf_false;</div><div class='add'>+</div><div class='add'>+    this = THIS;</div><div class='add'>+    ctx = this-&gt;ctx;</div><div class='add'>+</div><div class='add'>+    if (!ctx)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    GET_FILE_NAME_TO_LOG(file, basename);</div><div class='add'>+</div><div class='add'>+    ret = gettimeofday(&amp;tv, NULL);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    /* If this function is called via _gf_msg_callingfn () (indicated by a</div><div class='add'>+     * non-NULL callstr), or if the logformat is traditional, flush the</div><div class='add'>+     * message directly to disk.</div><div class='add'>+     */</div><div class='add'>+</div><div class='add'>+    if ((callstr) || (ctx-&gt;log.logformat == gf_logformat_traditional)) {</div><div class='add'>+        ret = gf_log_print_plain_fmt(ctx, domain, basename, function, line,</div><div class='add'>+                                     level, errnum, msgid, appmsgstr, callstr,</div><div class='add'>+                                     tv, graph_id, gf_logformat_traditional);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    pthread_mutex_lock(&amp;ctx-&gt;log.log_buf_lock);</div><div class='add'>+    {</div><div class='add'>+        /* Check if the msg being logged is already part of the list */</div><div class='add'>+        list_for_each_entry_safe_reverse(iter, buf_tmp, &amp;ctx-&gt;log.lru_queue,</div><div class='add'>+                                         msg_list)</div><div class='add'>+        {</div><div class='add'>+            if (first == NULL)</div><div class='add'>+                // Remember the first (lru) element in first ptr</div><div class='add'>+                first = iter;</div><div class='add'>+</div><div class='add'>+            /* Try to fail the search early on by doing the less</div><div class='add'>+             * expensive integer comparisons and continue to string</div><div class='add'>+             * parameter comparisons only after all int parameters</div><div class='add'>+             * are found to be matching.</div><div class='add'>+             */</div><div class='add'>+            if (line != iter-&gt;line)</div><div class='add'>+                continue;</div><div class='add'>+</div><div class='add'>+            if (errnum != iter-&gt;errnum)</div><div class='add'>+                continue;</div><div class='add'>+</div><div class='add'>+            if (msgid != iter-&gt;msg_id)</div><div class='add'>+                continue;</div><div class='add'>+</div><div class='add'>+            if (level != iter-&gt;level)</div><div class='add'>+                continue;</div><div class='add'>+</div><div class='add'>+            if (graph_id != iter-&gt;graph_id)</div><div class='add'>+                continue;</div><div class='add'>+</div><div class='add'>+            if (strcmp(domain, iter-&gt;domain))</div><div class='add'>+                continue;</div><div class='add'>+</div><div class='add'>+            if (strcmp(basename, iter-&gt;file))</div><div class='add'>+                continue;</div><div class='add'>+</div><div class='add'>+            if (strcmp(function, iter-&gt;function))</div><div class='add'>+                continue;</div><div class='add'>+</div><div class='add'>+            if (strcmp(*appmsgstr, iter-&gt;msg))</div><div class='add'>+                continue;</div><div class='add'>+</div><div class='add'>+            // Ah! Found a match!</div><div class='add'>+            list_move_tail(&amp;iter-&gt;msg_list, &amp;ctx-&gt;log.lru_queue);</div><div class='add'>+            iter-&gt;refcount++;</div><div class='add'>+            found = _gf_true;</div><div class='add'>+            // Update the 'latest' timestamp.</div><div class='add'>+            memcpy((void *)&amp;(iter-&gt;latest), (void *)&amp;tv,</div><div class='add'>+                   sizeof(struct timeval));</div><div class='add'>+            break;</div><div class='add'>+        }</div><div class='add'>+        if (found) {</div><div class='add'>+            ret = 0;</div><div class='add'>+            goto unlock;</div><div class='add'>+        }</div><div class='add'>+        // else ...</div><div class='add'>+</div><div class='add'>+        size = ctx-&gt;log.lru_size;</div><div class='add'>+        /* If the upper limit on the log buf size is 0, flush the msg to</div><div class='add'>+         * disk directly after unlock. There's no need to buffer the</div><div class='add'>+         * msg here.</div><div class='add'>+         */</div><div class='add'>+        if (size == 0) {</div><div class='add'>+            flush_logged_msg = _gf_true;</div><div class='add'>+            goto unlock;</div><div class='add'>+        } else if (((ctx-&gt;log.lru_cur_size + 1) &gt; size) &amp;&amp; (first)) {</div><div class='add'>+            /* If the list is full, flush the lru msg to disk and also</div><div class='add'>+             * release it after unlock, and ...</div><div class='add'>+             * */</div><div class='add'>+            if (first-&gt;refcount &gt;= 1)</div><div class='add'>+                TEST_LOG(</div><div class='add'>+                    "Buffer overflow of a buffer whose size limit "</div><div class='add'>+                    "is %d. About to flush least recently used log"</div><div class='add'>+                    " message to disk",</div><div class='add'>+                    size);</div><div class='add'>+            list_del_init(&amp;first-&gt;msg_list);</div><div class='add'>+            ctx-&gt;log.lru_cur_size--;</div><div class='add'>+            flush_lru = _gf_true;</div><div class='add'>+        }</div><div class='add'>+        /* create a new list element, initialise and enqueue it.</div><div class='add'>+         * Additionally, this being the first occurrence of the msg,</div><div class='add'>+         * log it directly to disk after unlock. */</div><div class='add'>+        buf_new = mem_get0(THIS-&gt;ctx-&gt;logbuf_pool);</div><div class='add'>+        if (!buf_new) {</div><div class='add'>+            ret = -1;</div><div class='add'>+            goto unlock;</div><div class='add'>+        }</div><div class='add'>+        ret = log_buf_init(buf_new, domain, basename, function, line, level,</div><div class='add'>+                           errnum, msgid, appmsgstr, graph_id);</div><div class='add'>+        if (ret) {</div><div class='add'>+            log_buf_destroy(buf_new);</div><div class='add'>+            goto unlock;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        memcpy((void *)&amp;(buf_new-&gt;latest), (void *)&amp;tv, sizeof(struct timeval));</div><div class='add'>+        memcpy((void *)&amp;(buf_new-&gt;oldest), (void *)&amp;tv, sizeof(struct timeval));</div><div class='add'>+</div><div class='add'>+        list_add_tail(&amp;buf_new-&gt;msg_list, &amp;ctx-&gt;log.lru_queue);</div><div class='add'>+        ctx-&gt;log.lru_cur_size++;</div><div class='add'>+        flush_logged_msg = _gf_true;</div><div class='add'>+        ret = 0;</div><div class='add'>+    }</div><div class='add'>+unlock:</div><div class='add'>+    pthread_mutex_unlock(&amp;ctx-&gt;log.log_buf_lock);</div><div class='add'>+</div><div class='add'>+    /* Value of @ret is a don't-care below since irrespective of success or</div><div class='add'>+     * failure post setting of @flush_lru, @first must be flushed and freed.</div><div class='add'>+     */</div><div class='add'>+    if (flush_lru) {</div><div class='add'>+        gf_log_flush_message(first, ctx);</div><div class='add'>+        log_buf_destroy(first);</div><div class='add'>+    }</div><div class='add'>+    /* Similarly, irrespective of whether all operations since setting of</div><div class='add'>+     * @flush_logged_msg were successful or not, flush the message being</div><div class='add'>+     * logged to disk in the plain format.</div><div class='add'>+     */</div><div class='add'>+    if (flush_logged_msg) {</div><div class='add'>+        ret = gf_log_print_plain_fmt(ctx, domain, basename, function, line,</div><div class='add'>+                                     level, errnum, msgid, appmsgstr, callstr,</div><div class='add'>+                                     tv, graph_id, gf_logformat_withmsgid);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-gf_cmd_log_init (const char *filename) </div><div class='add'>+_gf_msg(const char *domain, const char *file, const char *function,</div><div class='add'>+        int32_t line, gf_loglevel_t level, int errnum, int trace,</div><div class='add'>+        uint64_t msgid, const char *fmt, ...)</div><div class='ctx'> {</div><div class='del'>-        if (!filename){</div><div class='del'>-                gf_log ("glusterd",GF_LOG_CRITICAL, "gf_cmd_log_init: no "</div><div class='del'>-                        "filename specified\n");</div><div class='add'>+    int ret = 0;</div><div class='add'>+    char *msgstr = NULL;</div><div class='add'>+    va_list ap;</div><div class='add'>+    xlator_t *this = THIS;</div><div class='add'>+    glusterfs_ctx_t *ctx = NULL;</div><div class='add'>+    char *callstr = NULL;</div><div class='add'>+    int log_inited = 0;</div><div class='add'>+</div><div class='add'>+    if (this == NULL)</div><div class='add'>+        return -1;</div><div class='add'>+</div><div class='add'>+    ctx = this-&gt;ctx;</div><div class='add'>+    if (ctx == NULL) {</div><div class='add'>+        /* messages before context initialization are ignored */</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* check if we should be logging */</div><div class='add'>+    if (skip_logging(this, level))</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    /* in args check */</div><div class='add'>+    if (!domain || !file || !function || !fmt) {</div><div class='add'>+        fprintf(stderr, "logging: %s:%s():%d: invalid argument\n", __FILE__,</div><div class='add'>+                __PRETTY_FUNCTION__, __LINE__);</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* form the message */</div><div class='add'>+    va_start(ap, fmt);</div><div class='add'>+    ret = vasprintf(&amp;msgstr, fmt, ap);</div><div class='add'>+    va_end(ap);</div><div class='add'>+</div><div class='add'>+    /* log */</div><div class='add'>+    if (ret != -1) {</div><div class='add'>+        if (trace) {</div><div class='add'>+            callstr = GF_MALLOC(GF_LOG_BACKTRACE_SIZE, gf_common_mt_char);</div><div class='add'>+            if (callstr == NULL)</div><div class='ctx'>                 return -1;</div><div class='add'>+</div><div class='add'>+            ret = _gf_msg_backtrace(GF_LOG_BACKTRACE_DEPTH, callstr,</div><div class='add'>+                                    GF_LOG_BACKTRACE_SIZE);</div><div class='add'>+            if (ret &lt; 0) {</div><div class='add'>+                GF_FREE(callstr);</div><div class='add'>+                callstr = NULL;</div><div class='add'>+            }</div><div class='ctx'>         }</div><div class='ctx'> </div><div class='del'>-        cmd_log_filename = gf_strdup (filename);</div><div class='del'>-        if (!filename) {</div><div class='del'>-                gf_log ("glusterd",GF_LOG_CRITICAL, "gf_cmd_log_init: strdup"</div><div class='del'>-                        " error\n");</div><div class='del'>-                return -1;</div><div class='add'>+        pthread_mutex_lock(&amp;ctx-&gt;log.logfile_mutex);</div><div class='add'>+        {</div><div class='add'>+            if (ctx-&gt;log.logfile) {</div><div class='add'>+                log_inited = 1;</div><div class='add'>+            }</div><div class='ctx'>         }</div><div class='add'>+        pthread_mutex_unlock(&amp;ctx-&gt;log.logfile_mutex);</div><div class='add'>+</div><div class='add'>+        if (!log_inited &amp;&amp; ctx-&gt;log.gf_log_syslog) {</div><div class='add'>+            ret = gf_log_syslog(</div><div class='add'>+                ctx, domain, file, function, line, level, errnum, msgid,</div><div class='add'>+                &amp;msgstr, (callstr ? callstr : NULL),</div><div class='add'>+                (this-&gt;graph) ? this-&gt;graph-&gt;id : 0, gf_logformat_traditional);</div><div class='add'>+        } else {</div><div class='add'>+            ret = _gf_msg_internal(domain, file, function, line, level, errnum,</div><div class='add'>+                                   msgid, &amp;msgstr, (callstr ? callstr : NULL),</div><div class='add'>+                                   (this-&gt;graph) ? this-&gt;graph-&gt;id : 0);</div><div class='add'>+        }</div><div class='add'>+    } else {</div><div class='add'>+        /* man (3) vasprintf states on error strp contents</div><div class='add'>+         * are undefined, be safe */</div><div class='add'>+        msgstr = NULL;</div><div class='add'>+    }</div><div class='add'>+    if (callstr)</div><div class='add'>+        GF_FREE(callstr);</div><div class='add'>+    FREE(msgstr);</div><div class='ctx'> </div><div class='del'>-        cmdlogfile = fopen (cmd_log_filename, "a");</div><div class='del'>-        if (!cmdlogfile){</div><div class='del'>-                gf_log ("glusterd", GF_LOG_CRITICAL,</div><div class='del'>-                         "gf_cmd_log_init: failed to open logfile \"%s\" "</div><div class='del'>-                         "(%s)\n", cmd_log_filename, strerror (errno));</div><div class='del'>-                return -1;</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* TODO: Deprecate (delete) _gf_log, _gf_log_callingfn,</div><div class='add'>+ * once messages are changed to use _gf_msgXXX APIs for logging */</div><div class='add'>+int</div><div class='add'>+_gf_log(const char *domain, const char *file, const char *function, int line,</div><div class='add'>+        gf_loglevel_t level, const char *fmt, ...)</div><div class='add'>+{</div><div class='add'>+    const char *basename = NULL;</div><div class='add'>+    FILE *new_logfile = NULL;</div><div class='add'>+    va_list ap;</div><div class='add'>+    char timestr[GF_TIMESTR_SIZE] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    struct timeval tv = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    char *logline = NULL;</div><div class='add'>+    char *msg = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    int fd = -1;</div><div class='add'>+    xlator_t *this = THIS;</div><div class='add'>+    glusterfs_ctx_t *ctx = this-&gt;ctx;</div><div class='add'>+</div><div class='add'>+    if (!ctx)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    if (skip_logging(this, level))</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    if (!domain || !file || !function || !fmt) {</div><div class='add'>+        fprintf(stderr, "logging: %s:%s():%d: invalid argument\n", __FILE__,</div><div class='add'>+                __PRETTY_FUNCTION__, __LINE__);</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    basename = strrchr(file, '/');</div><div class='add'>+    if (basename)</div><div class='add'>+        basename++;</div><div class='add'>+    else</div><div class='add'>+        basename = file;</div><div class='add'>+</div><div class='add'>+    va_start(ap, fmt);</div><div class='add'>+    ret = vasprintf(&amp;msg, fmt, ap);</div><div class='add'>+    va_end(ap);</div><div class='add'>+    if (-1 == ret) {</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (ctx-&gt;log.log_control_file_found) {</div><div class='add'>+        int priority;</div><div class='add'>+        /* treat GF_LOG_TRACE and GF_LOG_NONE as LOG_DEBUG and</div><div class='add'>+           other level as is */</div><div class='add'>+        if (GF_LOG_TRACE == level || GF_LOG_NONE == level) {</div><div class='add'>+            priority = LOG_DEBUG;</div><div class='add'>+        } else {</div><div class='add'>+            priority = level - 1;</div><div class='ctx'>         }</div><div class='del'>-        return 0;</div><div class='add'>+</div><div class='add'>+        gf_syslog(priority, "[%s:%d:%s] %d-%s: %s", basename, line, function,</div><div class='add'>+                  ((this-&gt;graph) ? this-&gt;graph-&gt;id : 0), domain, msg);</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (ctx-&gt;log.logrotate) {</div><div class='add'>+        ctx-&gt;log.logrotate = 0;</div><div class='add'>+</div><div class='add'>+        fd = sys_open(ctx-&gt;log.filename, O_CREAT | O_RDONLY, S_IRUSR | S_IWUSR);</div><div class='add'>+        if (fd &lt; 0) {</div><div class='add'>+            gf_smsg("logrotate", GF_LOG_ERROR, errno,</div><div class='add'>+                    LG_MSG_OPEN_LOGFILE_FAILED, NULL);</div><div class='add'>+            return -1;</div><div class='add'>+        }</div><div class='add'>+        sys_close(fd);</div><div class='add'>+</div><div class='add'>+        new_logfile = fopen(ctx-&gt;log.filename, "a");</div><div class='add'>+        if (!new_logfile) {</div><div class='add'>+            gf_smsg("logrotate", GF_LOG_CRITICAL, errno,</div><div class='add'>+                    LG_MSG_OPEN_LOGFILE_FAILED, "filename=%s",</div><div class='add'>+                    ctx-&gt;log.filename, NULL);</div><div class='add'>+            goto log;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        pthread_mutex_lock(&amp;ctx-&gt;log.logfile_mutex);</div><div class='add'>+        {</div><div class='add'>+            if (ctx-&gt;log.logfile)</div><div class='add'>+                fclose(ctx-&gt;log.logfile);</div><div class='add'>+</div><div class='add'>+            ctx-&gt;log.gf_log_logfile = ctx-&gt;log.logfile = new_logfile;</div><div class='add'>+        }</div><div class='add'>+        pthread_mutex_unlock(&amp;ctx-&gt;log.logfile_mutex);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+log:</div><div class='add'>+    ret = gettimeofday(&amp;tv, NULL);</div><div class='add'>+    if (-1 == ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    gf_time_fmt_tv(timestr, sizeof timestr, &amp;tv, gf_timefmt_FT);</div><div class='add'>+</div><div class='add'>+    ret = gf_asprintf(&amp;logline, "[%s] %c [%s:%d:%s] %d-%s: %s\n", timestr,</div><div class='add'>+                      gf_level_strings[level], basename, line, function,</div><div class='add'>+                      ((this-&gt;graph) ? this-&gt;graph-&gt;id : 0), domain, msg);</div><div class='add'>+    if (-1 == ret) {</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    pthread_mutex_lock(&amp;ctx-&gt;log.logfile_mutex);</div><div class='add'>+    {</div><div class='add'>+        if (ctx-&gt;log.logfile) {</div><div class='add'>+            fputs(logline, ctx-&gt;log.logfile);</div><div class='add'>+            fflush(ctx-&gt;log.logfile);</div><div class='add'>+        } else if (ctx-&gt;log.loglevel &gt;= level) {</div><div class='add'>+            fputs(logline, stderr);</div><div class='add'>+            fflush(stderr);</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+#ifdef GF_LINUX_HOST_OS</div><div class='add'>+        /* We want only serious log in 'syslog', not our debug</div><div class='add'>+           and trace logs */</div><div class='add'>+        if (ctx-&gt;log.gf_log_syslog &amp;&amp; level &amp;&amp;</div><div class='add'>+            (level &lt;= ctx-&gt;log.sys_log_level))</div><div class='add'>+            syslog((level - 1), "%s", logline);</div><div class='add'>+#endif</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    pthread_mutex_unlock(&amp;ctx-&gt;log.logfile_mutex);</div><div class='add'>+</div><div class='add'>+err:</div><div class='add'>+    GF_FREE(logline);</div><div class='add'>+</div><div class='add'>+    FREE(msg);</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return (0);</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-gf_cmd_log (const char *domain, const char *fmt, ...)</div><div class='del'>-{</div><div class='del'>-        va_list      ap;</div><div class='del'>-        struct tm   *tm = NULL;</div><div class='del'>-        char         timestr[256];</div><div class='del'>-        struct timeval tv = {0,};</div><div class='del'>-        char        *str1 = NULL;</div><div class='del'>-        char        *str2 = NULL;</div><div class='del'>-        char        *msg  = NULL;</div><div class='del'>-        size_t       len  = 0;</div><div class='del'>-        int          ret  = 0;</div><div class='del'>-</div><div class='del'>-        if (!cmdlogfile)</div><div class='del'>-                return -1;</div><div class='add'>+_gf_log_eh(const char *function, const char *fmt, ...)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    va_list ap;</div><div class='add'>+    char *logline = NULL;</div><div class='add'>+    char *msg = NULL;</div><div class='add'>+    xlator_t *this = NULL;</div><div class='ctx'> </div><div class='add'>+    this = THIS;</div><div class='ctx'> </div><div class='del'>-        if (!domain || !fmt) {</div><div class='del'>-                gf_log ("glusterd", GF_LOG_TRACE,</div><div class='del'>-                         "logging: invalid argument\n");</div><div class='del'>-                return -1;</div><div class='add'>+    va_start(ap, fmt);</div><div class='add'>+    ret = vasprintf(&amp;msg, fmt, ap);</div><div class='add'>+    va_end(ap);</div><div class='add'>+    if (-1 == ret) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = gf_asprintf(&amp;logline, "[%d] %s: %s",</div><div class='add'>+                      ((this-&gt;graph) ? this-&gt;graph-&gt;id : 0), function, msg);</div><div class='add'>+    if (-1 == ret) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = eh_save_history(this-&gt;history, logline);</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    GF_FREE(logline);</div><div class='add'>+</div><div class='add'>+    FREE(msg);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+gf_cmd_log_init(const char *filename)</div><div class='add'>+{</div><div class='add'>+    int fd = -1;</div><div class='add'>+    xlator_t *this = NULL;</div><div class='add'>+    glusterfs_ctx_t *ctx = NULL;</div><div class='add'>+</div><div class='add'>+    this = THIS;</div><div class='add'>+    ctx = this-&gt;ctx;</div><div class='add'>+</div><div class='add'>+    if (!ctx)</div><div class='add'>+        return -1;</div><div class='add'>+</div><div class='add'>+    if (!filename) {</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_CRITICAL, 0, LG_MSG_FILENAME_NOT_SPECIFIED,</div><div class='add'>+                "gf_cmd_log_init", NULL);</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ctx-&gt;log.cmd_log_filename = gf_strdup(filename);</div><div class='add'>+    if (!ctx-&gt;log.cmd_log_filename) {</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+    /* close and reopen cmdlogfile for log rotate*/</div><div class='add'>+    if (ctx-&gt;log.cmdlogfile) {</div><div class='add'>+        fclose(ctx-&gt;log.cmdlogfile);</div><div class='add'>+        ctx-&gt;log.cmdlogfile = NULL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    fd = sys_open(ctx-&gt;log.cmd_log_filename, O_CREAT | O_WRONLY | O_APPEND,</div><div class='add'>+                  S_IRUSR | S_IWUSR);</div><div class='add'>+    if (fd &lt; 0) {</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_CRITICAL, errno, LG_MSG_OPEN_LOGFILE_FAILED,</div><div class='add'>+                "cmd_log_file", NULL);</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ctx-&gt;log.cmdlogfile = fdopen(fd, "a");</div><div class='add'>+    if (!ctx-&gt;log.cmdlogfile) {</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_CRITICAL, errno, LG_MSG_OPEN_LOGFILE_FAILED,</div><div class='add'>+                "gf_cmd_log_init: %s", ctx-&gt;log.cmd_log_filename, NULL);</div><div class='add'>+        sys_close(fd);</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+gf_cmd_log(const char *domain, const char *fmt, ...)</div><div class='add'>+{</div><div class='add'>+    va_list ap;</div><div class='add'>+    char timestr[GF_TIMESTR_SIZE];</div><div class='add'>+    struct timeval tv = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    char *logline = NULL;</div><div class='add'>+    char *msg = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    int fd = -1;</div><div class='add'>+    glusterfs_ctx_t *ctx = NULL;</div><div class='add'>+</div><div class='add'>+    ctx = THIS-&gt;ctx;</div><div class='add'>+</div><div class='add'>+    if (!ctx)</div><div class='add'>+        return -1;</div><div class='add'>+</div><div class='add'>+    if (!ctx-&gt;log.cmdlogfile)</div><div class='add'>+        return -1;</div><div class='add'>+</div><div class='add'>+    if (!domain || !fmt) {</div><div class='add'>+        gf_msg_trace("glusterd", 0, "logging: invalid argument\n");</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = gettimeofday(&amp;tv, NULL);</div><div class='add'>+    if (ret == -1)</div><div class='add'>+        goto out;</div><div class='add'>+    va_start(ap, fmt);</div><div class='add'>+    ret = vasprintf(&amp;msg, fmt, ap);</div><div class='add'>+    va_end(ap);</div><div class='add'>+    if (ret == -1) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    gf_time_fmt_tv(timestr, sizeof timestr, &amp;tv, gf_timefmt_FT);</div><div class='add'>+</div><div class='add'>+    ret = gf_asprintf(&amp;logline, "[%s] %s : %s\n", timestr, domain, msg);</div><div class='add'>+    if (ret == -1) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* close and reopen cmdlogfile fd for in case of log rotate*/</div><div class='add'>+    if (ctx-&gt;log.cmd_history_logrotate) {</div><div class='add'>+        ctx-&gt;log.cmd_history_logrotate = 0;</div><div class='add'>+</div><div class='add'>+        if (ctx-&gt;log.cmdlogfile) {</div><div class='add'>+            fclose(ctx-&gt;log.cmdlogfile);</div><div class='add'>+            ctx-&gt;log.cmdlogfile = NULL;</div><div class='ctx'>         }</div><div class='ctx'> </div><div class='del'>-        ret = gettimeofday (&amp;tv, NULL);</div><div class='del'>-        if (ret == -1)</div><div class='del'>-                goto out;</div><div class='add'>+        fd = sys_open(ctx-&gt;log.cmd_log_filename, O_CREAT | O_WRONLY | O_APPEND,</div><div class='add'>+                      S_IRUSR | S_IWUSR);</div><div class='add'>+        if (fd &lt; 0) {</div><div class='add'>+            gf_smsg(THIS-&gt;name, GF_LOG_CRITICAL, errno,</div><div class='add'>+                    LG_MSG_OPEN_LOGFILE_FAILED, "name=%s",</div><div class='add'>+                    ctx-&gt;log.cmd_log_filename, NULL);</div><div class='add'>+            ret = -1;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        ctx-&gt;log.cmdlogfile = fdopen(fd, "a");</div><div class='add'>+        if (!ctx-&gt;log.cmdlogfile) {</div><div class='add'>+            gf_smsg(THIS-&gt;name, GF_LOG_CRITICAL, errno,</div><div class='add'>+                    LG_MSG_OPEN_LOGFILE_FAILED, "name=%s",</div><div class='add'>+                    ctx-&gt;log.cmd_log_filename, NULL);</div><div class='add'>+            ret = -1;</div><div class='add'>+            sys_close(fd);</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    fputs(logline, ctx-&gt;log.cmdlogfile);</div><div class='add'>+    fflush(ctx-&gt;log.cmdlogfile);</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    GF_FREE(logline);</div><div class='ctx'> </div><div class='del'>-        tm = localtime (&amp;tv.tv_sec);</div><div class='add'>+    FREE(msg);</div><div class='ctx'> </div><div class='del'>-        va_start (ap, fmt);</div><div class='del'>-        strftime (timestr, 256, "%Y-%m-%d %H:%M:%S", tm);</div><div class='del'>-        snprintf (timestr + strlen (timestr), 256 - strlen (timestr),</div><div class='del'>-                  ".%"GF_PRI_SUSECONDS, tv.tv_usec);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        ret = gf_asprintf (&amp;str1, "[%s] %s : ",</div><div class='del'>-                          timestr, domain);</div><div class='del'>-        if (ret == -1) {</div><div class='del'>-              goto out;</div><div class='add'>+static int</div><div class='add'>+_do_slog_format(int errnum, const char *event, va_list inp, char **msg)</div><div class='add'>+{</div><div class='add'>+    va_list valist_tmp;</div><div class='add'>+    int i = 0;</div><div class='add'>+    int j = 0;</div><div class='add'>+    int k = 0;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    char *fmt = NULL;</div><div class='add'>+    char *buffer = NULL;</div><div class='add'>+    int num_format_chars = 0;</div><div class='add'>+    char format_char = '%';</div><div class='add'>+    char *tmp1 = NULL;</div><div class='add'>+    char *tmp2 = NULL;</div><div class='add'>+    char temp_sep[3] = "";</div><div class='add'>+</div><div class='add'>+    tmp2 = gf_strdup("");</div><div class='add'>+    if (!tmp2) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Hardcoded value for max key value pairs, exits early */</div><div class='add'>+    /* from loop if found NULL */</div><div class='add'>+    for (i = 0; i &lt; GF_MAX_SLOG_PAIR_COUNT; i++) {</div><div class='add'>+        fmt = va_arg(inp, char *);</div><div class='add'>+        if (fmt == NULL) {</div><div class='add'>+            break;</div><div class='ctx'>         }</div><div class='ctx'> </div><div class='del'>-        ret = vasprintf (&amp;str2, fmt, ap);</div><div class='del'>-        if (ret == -1) {</div><div class='del'>-               goto out;</div><div class='add'>+        /* Get number of times % is used in input for formatting, */</div><div class='add'>+        /* this count will be used to skip those many args from the */</div><div class='add'>+        /* main list and will be used to format inner format */</div><div class='add'>+        num_format_chars = 0;</div><div class='add'>+        for (k = 0; fmt[k] != '\0'; k++) {</div><div class='add'>+            /* If %% is used then that is escaped */</div><div class='add'>+            if (fmt[k] == format_char &amp;&amp; fmt[k + 1] == format_char) {</div><div class='add'>+                k++;</div><div class='add'>+            } else if (fmt[k] == format_char) {</div><div class='add'>+                num_format_chars++;</div><div class='add'>+            }</div><div class='ctx'>         }</div><div class='ctx'> </div><div class='del'>-        va_end (ap);</div><div class='add'>+        tmp1 = gf_strdup(tmp2);</div><div class='add'>+        if (!tmp1) {</div><div class='add'>+            ret = -1;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-        len = strlen (str1);</div><div class='del'>-        msg = GF_MALLOC (len + strlen (str2) + 1, gf_common_mt_char);</div><div class='add'>+        GF_FREE(tmp2);</div><div class='add'>+        tmp2 = NULL;</div><div class='ctx'> </div><div class='del'>-        strcpy (msg, str1);</div><div class='del'>-        strcpy (msg + len, str2);</div><div class='add'>+        if (num_format_chars &gt; 0) {</div><div class='add'>+            /* Make separate valist and format the string */</div><div class='add'>+            va_copy(valist_tmp, inp);</div><div class='add'>+            ret = gf_vasprintf(&amp;buffer, fmt, valist_tmp);</div><div class='add'>+            if (ret &lt; 0) {</div><div class='add'>+                va_end(valist_tmp);</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+            va_end(valist_tmp);</div><div class='ctx'> </div><div class='del'>-        fprintf (cmdlogfile, "%s\n", msg);</div><div class='del'>-        fflush (cmdlogfile);</div><div class='add'>+            for (j = 0; j &lt; num_format_chars; j++) {</div><div class='add'>+                /* Skip the va_arg value since these values</div><div class='add'>+                   are already used for internal formatting */</div><div class='add'>+                (void)va_arg(inp, void *);</div><div class='add'>+            }</div><div class='ctx'> </div><div class='del'>-out:</div><div class='del'>-        if (msg) {</div><div class='del'>-               GF_FREE (msg);</div><div class='add'>+            ret = gf_asprintf(&amp;tmp2, "%s%s{%s}", tmp1, temp_sep, buffer);</div><div class='add'>+            if (ret &lt; 0)</div><div class='add'>+                goto out;</div><div class='add'>+</div><div class='add'>+            GF_FREE(buffer);</div><div class='add'>+            buffer = NULL;</div><div class='add'>+        } else {</div><div class='add'>+            ret = gf_asprintf(&amp;tmp2, "%s%s{%s}", tmp1, temp_sep, fmt);</div><div class='add'>+            if (ret &lt; 0)</div><div class='add'>+                goto out;</div><div class='ctx'>         }</div><div class='ctx'> </div><div class='del'>-        if (str1)</div><div class='del'>-                GF_FREE (str1);</div><div class='add'>+        /* Set seperator for next iteration */</div><div class='add'>+        temp_sep[0] = ',';</div><div class='add'>+        temp_sep[1] = ' ';</div><div class='add'>+        temp_sep[2] = 0;</div><div class='add'>+</div><div class='add'>+        GF_FREE(tmp1);</div><div class='add'>+        tmp1 = NULL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    tmp1 = gf_strdup(tmp2);</div><div class='add'>+    if (!tmp1) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    GF_FREE(tmp2);</div><div class='add'>+    tmp2 = NULL;</div><div class='add'>+</div><div class='add'>+    if (errnum) {</div><div class='add'>+        ret = gf_asprintf(&amp;tmp2, "%s [%s%s{errno=%d}, {error=%s}]", event, tmp1,</div><div class='add'>+                          temp_sep, errnum, strerror(errnum));</div><div class='add'>+    } else {</div><div class='add'>+        ret = gf_asprintf(&amp;tmp2, "%s [%s]", event, tmp1);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (ret == -1)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    *msg = gf_strdup(tmp2);</div><div class='add'>+    if (!*msg)</div><div class='add'>+        ret = -1;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (buffer)</div><div class='add'>+        GF_FREE(buffer);</div><div class='ctx'> </div><div class='del'>-        if (str2)</div><div class='del'>-                FREE (str2);</div><div class='add'>+    if (tmp1)</div><div class='add'>+        GF_FREE(tmp1);</div><div class='ctx'> </div><div class='del'>-        return (0);</div><div class='del'>-                                                  </div><div class='add'>+    if (tmp2)</div><div class='add'>+        GF_FREE(tmp2);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+_gf_smsg(const char *domain, const char *file, const char *function,</div><div class='add'>+         int32_t line, gf_loglevel_t level, int errnum, int trace,</div><div class='add'>+         uint64_t msgid, const char *event, ...)</div><div class='add'>+{</div><div class='add'>+    va_list valist;</div><div class='add'>+    char *msg = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    xlator_t *this = THIS;</div><div class='add'>+</div><div class='add'>+    if (skip_logging(this, level))</div><div class='add'>+        return ret;</div><div class='add'>+</div><div class='add'>+    va_start(valist, event);</div><div class='add'>+    ret = _do_slog_format(errnum, event, valist, &amp;msg);</div><div class='add'>+    if (ret == -1)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    /* Pass errnum as zero since it is already formated as required */</div><div class='add'>+    ret = _gf_msg(domain, file, function, line, level, 0, trace, msgid, "%s",</div><div class='add'>+                  msg);</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    va_end(valist);</div><div class='add'>+    if (msg)</div><div class='add'>+        GF_FREE(msg);</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='head'>diff --git a/libglusterfs/src/logging.h b/libglusterfs/src/logging.h<br/>deleted file mode 100644<br/>index e440d597549..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/libglusterfs/src/logging.h?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/logging.h</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,128 +0,0 @@</div><div class='del'>-/*</div><div class='del'>-   Copyright (c) 2006-2010 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='del'>-   This file is part of GlusterFS.</div><div class='del'>-</div><div class='del'>-   GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-   it under the terms of the GNU General Public License as published</div><div class='del'>-   by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-   or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-   GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-   WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-   General Public License for more details.</div><div class='del'>-</div><div class='del'>-   You should have received a copy of the GNU General Public License</div><div class='del'>-   along with this program.  If not, see</div><div class='del'>-   &lt;http://www.gnu.org/licenses/&gt;.</div><div class='del'>-*/</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-#ifndef __LOGGING_H__</div><div class='del'>-#define __LOGGING_H__</div><div class='del'>-</div><div class='del'>-#ifndef _CONFIG_H</div><div class='del'>-#define _CONFIG_H</div><div class='del'>-#include "config.h"</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-#include &lt;stdint.h&gt;</div><div class='del'>-#include &lt;stdio.h&gt;</div><div class='del'>-#include &lt;stdarg.h&gt;</div><div class='del'>-</div><div class='del'>-#ifdef GF_DARWIN_HOST_OS</div><div class='del'>-#define GF_PRI_FSBLK       "u"</div><div class='del'>-#define GF_PRI_DEV         PRId32</div><div class='del'>-#define GF_PRI_NLINK       PRIu16</div><div class='del'>-#define GF_PRI_SUSECONDS   PRId32</div><div class='del'>-#else</div><div class='del'>-#define GF_PRI_FSBLK       PRIu64</div><div class='del'>-#define GF_PRI_DEV         PRIu64</div><div class='del'>-#define GF_PRI_NLINK       PRIu32</div><div class='del'>-#define GF_PRI_SUSECONDS   "ld"</div><div class='del'>-#endif</div><div class='del'>-#define GF_PRI_BLKSIZE     PRId32</div><div class='del'>-#define GF_PRI_SIZET       "zu"</div><div class='del'>-</div><div class='del'>-#if 0</div><div class='del'>-/* Syslog definitions :-) */</div><div class='del'>-#define LOG_EMERG   0           /* system is unusable */</div><div class='del'>-#define LOG_ALERT   1           /* action must be taken immediately */</div><div class='del'>-#define LOG_CRIT    2           /* critical conditions */</div><div class='del'>-#define LOG_ERR     3           /* error conditions */</div><div class='del'>-#define LOG_WARNING 4           /* warning conditions */</div><div class='del'>-#define LOG_NOTICE  5           /* normal but significant condition */</div><div class='del'>-#define LOG_INFO    6           /* informational */</div><div class='del'>-#define LOG_DEBUG   7           /* debug-level messages */</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-typedef enum {</div><div class='del'>-	GF_LOG_NONE,</div><div class='del'>-        GF_LOG_EMERG,</div><div class='del'>-        GF_LOG_ALERT,</div><div class='del'>-	GF_LOG_CRITICAL,   /* fatal errors */</div><div class='del'>-	GF_LOG_ERROR,      /* major failures (not necessarily fatal) */</div><div class='del'>-	GF_LOG_WARNING,    /* info about normal operation */</div><div class='del'>-        GF_LOG_NOTICE,</div><div class='del'>-	GF_LOG_INFO,       /* Normal information */</div><div class='del'>-#define GF_LOG_NORMAL      GF_LOG_INFO</div><div class='del'>-	GF_LOG_DEBUG,      /* internal errors */</div><div class='del'>-        GF_LOG_TRACE,      /* full trace of operation */</div><div class='del'>-} gf_loglevel_t;</div><div class='del'>-</div><div class='del'>-#define GF_LOG_MAX GF_LOG_DEBUG</div><div class='del'>-</div><div class='del'>-extern gf_loglevel_t gf_log_loglevel;</div><div class='del'>-extern char gf_log_xl_log_set;</div><div class='del'>-</div><div class='del'>-#define gf_log(dom, levl, fmt...) do {					\</div><div class='del'>-                if ((levl &gt; gf_log_loglevel) &amp;&amp; !gf_log_xl_log_set)     \</div><div class='del'>-                        break;                                          \</div><div class='del'>-                _gf_log (dom, __FILE__, __FUNCTION__, __LINE__,         \</div><div class='del'>-                         levl, ##fmt);                                  \</div><div class='del'>-        } while (0)</div><div class='del'>-</div><div class='del'>-/* Log once in GF_UNIVERSAL_ANSWER times */</div><div class='del'>-#define GF_LOG_OCCASIONALLY(var, args...) if (!(var++%GF_UNIVERSAL_ANSWER)) { \</div><div class='del'>-                gf_log (args);                                                \</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-void</div><div class='del'>-gf_log_logrotate (int signum);</div><div class='del'>-</div><div class='del'>-int gf_log_init (const char *filename);</div><div class='del'>-void gf_log_cleanup (void);</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-_gf_log (const char *domain, const char *file, const char *function,</div><div class='del'>-	 int32_t line, gf_loglevel_t level, const char *fmt, ...);</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-gf_log_from_client (const char *msg, char *identifier);</div><div class='del'>-</div><div class='del'>-void gf_log_lock (void);</div><div class='del'>-void gf_log_unlock (void);</div><div class='del'>-</div><div class='del'>-void gf_log_disable_syslog (void);</div><div class='del'>-void gf_log_enable_syslog (void);</div><div class='del'>-gf_loglevel_t gf_log_get_loglevel (void);</div><div class='del'>-void gf_log_set_loglevel (gf_loglevel_t level);</div><div class='del'>-gf_loglevel_t gf_log_get_xl_loglevel (void *xl);</div><div class='del'>-void gf_log_set_xl_loglevel (void *xl, gf_loglevel_t level);</div><div class='del'>-</div><div class='del'>-#define GF_DEBUG(xl, format, args...) \</div><div class='del'>-	gf_log ((xl)-&gt;name, GF_LOG_DEBUG, format, ##args)</div><div class='del'>-#define GF_INFO(xl, format, args...) \</div><div class='del'>-	gf_log ((xl)-&gt;name, GF_LOG_INFO, format, ##args)</div><div class='del'>-#define GF_WARNING(xl, format, args...) \</div><div class='del'>-	gf_log ((xl)-&gt;name, GF_LOG_WARNING, format, ##args)</div><div class='del'>-#define GF_ERROR(xl, format, args...) \</div><div class='del'>-	gf_log ((xl)-&gt;name, GF_LOG_ERROR, format, ##args)</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-gf_cmd_log (const char *domain, const char *fmt, ...);</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-gf_cmd_log_init (const char *filename);</div><div class='del'>-#endif /* __LOGGING_H__ */</div><div class='head'>diff --git a/libglusterfs/src/mem-pool.c b/libglusterfs/src/mem-pool.c<br/>index aec1d909dde..2d5a12b0a00 100644<br/>--- a/<a href='/cgit/glusterfs.git/tree/libglusterfs/src/mem-pool.c?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/mem-pool.c</a><br/>+++ b/<a href='/cgit/glusterfs.git/tree/libglusterfs/src/mem-pool.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>libglusterfs/src/mem-pool.c</a></div><div class='hunk'>@@ -1,517 +1,932 @@</div><div class='ctx'> /*</div><div class='del'>-   Copyright (c) 2008-2009 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='del'>-   This file is part of GlusterFS.</div><div class='del'>-</div><div class='del'>-   GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-   it under the terms of the GNU General Public License as published</div><div class='del'>-   by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-   or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-   GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-   WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-   General Public License for more details.</div><div class='del'>-</div><div class='del'>-   You should have received a copy of the GNU General Public License</div><div class='del'>-   along with this program.  If not, see</div><div class='del'>-   &lt;http://www.gnu.org/licenses/&gt;.</div><div class='add'>+  Copyright (c) 2008-2012 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='ctx'> */</div><div class='ctx'> </div><div class='del'>-#include "mem-pool.h"</div><div class='del'>-#include "logging.h"</div><div class='del'>-#include "xlator.h"</div><div class='add'>+#include "glusterfs/mem-pool.h"</div><div class='add'>+#include "glusterfs/common-utils.h"  // for GF_ASSERT, gf_thread_cr...</div><div class='add'>+#include "glusterfs/globals.h"       // for xlator_t, THIS</div><div class='ctx'> #include &lt;stdlib.h&gt;</div><div class='ctx'> #include &lt;stdarg.h&gt;</div><div class='ctx'> </div><div class='add'>+#include "unittest/unittest.h"</div><div class='add'>+#include "glusterfs/libglusterfs-messages.h"</div><div class='ctx'> </div><div class='del'>-#define GF_MEM_POOL_PAD_BOUNDARY         (sizeof(struct list_head))</div><div class='del'>-#define mem_pool_chunkhead2ptr(head)     ((head) + GF_MEM_POOL_PAD_BOUNDARY)</div><div class='del'>-#define mem_pool_ptr2chunkhead(ptr)      ((ptr) - GF_MEM_POOL_PAD_BOUNDARY)</div><div class='add'>+void</div><div class='add'>+gf_mem_acct_enable_set(void *data)</div><div class='add'>+{</div><div class='add'>+    glusterfs_ctx_t *ctx = NULL;</div><div class='ctx'> </div><div class='del'>-#define GF_MEM_HEADER_SIZE  (4 + sizeof (size_t) + sizeof (xlator_t *) + 4)</div><div class='del'>-#define GF_MEM_TRAILER_SIZE 4</div><div class='add'>+    REQUIRE(data != NULL);</div><div class='ctx'> </div><div class='del'>-#define GF_MEM_HEADER_MAGIC  0xCAFEBABE</div><div class='del'>-#define GF_MEM_TRAILER_MAGIC 0xBAADF00D</div><div class='add'>+    ctx = data;</div><div class='ctx'> </div><div class='del'>-#define GLUSTERFS_ENV_MEM_ACCT_STR  "GLUSTERFS_DISABLE_MEM_ACCT"</div><div class='add'>+    GF_ASSERT(ctx != NULL);</div><div class='ctx'> </div><div class='del'>-static int gf_mem_acct_enable = 1;</div><div class='add'>+    ctx-&gt;mem_acct_enable = 1;</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-gf_mem_acct_is_enabled ()</div><div class='del'>-{</div><div class='del'>-        return gf_mem_acct_enable;</div><div class='add'>+    ENSURE(1 == ctx-&gt;mem_acct_enable);</div><div class='add'>+</div><div class='add'>+    return;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-void</div><div class='del'>-gf_mem_acct_enable_set ()</div><div class='add'>+static void *</div><div class='add'>+gf_mem_header_prepare(struct mem_header *header, size_t size)</div><div class='ctx'> {</div><div class='del'>-        char    *opt = NULL;</div><div class='del'>-        long    val = -1;</div><div class='add'>+    void *ptr;</div><div class='ctx'> </div><div class='del'>-        opt = getenv (GLUSTERFS_ENV_MEM_ACCT_STR);</div><div class='add'>+    header-&gt;size = size;</div><div class='ctx'> </div><div class='del'>-        if (!opt)</div><div class='del'>-                return;</div><div class='add'>+    ptr = header + 1;</div><div class='ctx'> </div><div class='del'>-        val = strtol (opt, NULL, 0);</div><div class='del'>-</div><div class='del'>-        if (val)</div><div class='del'>-                gf_mem_acct_enable = 0;</div><div class='del'>-        else</div><div class='del'>-                gf_mem_acct_enable = 1;</div><div class='add'>+    /* data follows in this gap of 'size' bytes */</div><div class='add'>+    *(uint32_t *)(ptr + size) = GF_MEM_TRAILER_MAGIC;</div><div class='ctx'> </div><div class='add'>+    return ptr;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-void</div><div class='del'>-gf_mem_set_acct_info (xlator_t *xl, char **alloc_ptr,</div><div class='del'>-                      size_t size, uint32_t type)</div><div class='add'>+static void *</div><div class='add'>+gf_mem_set_acct_info(struct mem_acct *mem_acct, struct mem_header *header,</div><div class='add'>+                     size_t size, uint32_t type, const char *typestr)</div><div class='ctx'> {</div><div class='add'>+    struct mem_acct_rec *rec = NULL;</div><div class='add'>+    bool new_ref = false;</div><div class='ctx'> </div><div class='del'>-        char    *ptr = NULL;</div><div class='del'>-</div><div class='del'>-        if (!alloc_ptr)</div><div class='del'>-                return;</div><div class='add'>+    if (mem_acct != NULL) {</div><div class='add'>+        GF_ASSERT(type &lt;= mem_acct-&gt;num_types);</div><div class='ctx'> </div><div class='del'>-        ptr = (char *) (*alloc_ptr);</div><div class='del'>-</div><div class='del'>-        if (!xl) {</div><div class='del'>-                assert (0);</div><div class='add'>+        rec = &amp;mem_acct-&gt;rec[type];</div><div class='add'>+        LOCK(&amp;rec-&gt;lock);</div><div class='add'>+        {</div><div class='add'>+            if (!rec-&gt;typestr) {</div><div class='add'>+                rec-&gt;typestr = typestr;</div><div class='add'>+            }</div><div class='add'>+            rec-&gt;size += size;</div><div class='add'>+            new_ref = (rec-&gt;num_allocs == 0);</div><div class='add'>+            rec-&gt;num_allocs++;</div><div class='add'>+            rec-&gt;total_allocs++;</div><div class='add'>+            rec-&gt;max_size = max(rec-&gt;max_size, rec-&gt;size);</div><div class='add'>+            rec-&gt;max_num_allocs = max(rec-&gt;max_num_allocs, rec-&gt;num_allocs);</div><div class='add'>+</div><div class='add'>+#ifdef DEBUG</div><div class='add'>+            list_add(&amp;header-&gt;acct_list, &amp;rec-&gt;obj_list);</div><div class='add'>+#endif</div><div class='ctx'>         }</div><div class='add'>+        UNLOCK(&amp;rec-&gt;lock);</div><div class='ctx'> </div><div class='del'>-        if (!(xl-&gt;mem_acct.rec)) {</div><div class='del'>-                assert (0);</div><div class='add'>+        /* We only take a reference for each memory type used, not for each</div><div class='add'>+         * allocation. This minimizes the use of atomic operations. */</div><div class='add'>+        if (new_ref) {</div><div class='add'>+            GF_ATOMIC_INC(mem_acct-&gt;refcnt);</div><div class='ctx'>         }</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        if (type &gt; xl-&gt;mem_acct.num_types) {</div><div class='del'>-                assert (0);</div><div class='del'>-        }</div><div class='add'>+    header-&gt;type = type;</div><div class='add'>+    header-&gt;mem_acct = mem_acct;</div><div class='add'>+    header-&gt;magic = GF_MEM_HEADER_MAGIC;</div><div class='ctx'> </div><div class='del'>-        LOCK(&amp;xl-&gt;mem_acct.rec[type].lock);</div><div class='add'>+    return gf_mem_header_prepare(header, size);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void *</div><div class='add'>+gf_mem_update_acct_info(struct mem_acct *mem_acct, struct mem_header *header,</div><div class='add'>+                        size_t size)</div><div class='add'>+{</div><div class='add'>+    struct mem_acct_rec *rec = NULL;</div><div class='add'>+</div><div class='add'>+    if (mem_acct != NULL) {</div><div class='add'>+        rec = &amp;mem_acct-&gt;rec[header-&gt;type];</div><div class='add'>+        LOCK(&amp;rec-&gt;lock);</div><div class='ctx'>         {</div><div class='del'>-                xl-&gt;mem_acct.rec[type].size += size;</div><div class='del'>-                xl-&gt;mem_acct.rec[type].num_allocs++;</div><div class='del'>-                xl-&gt;mem_acct.rec[type].max_size =</div><div class='del'>-                           max (xl-&gt;mem_acct.rec[type].max_size,</div><div class='del'>-                                xl-&gt;mem_acct.rec[type].size);</div><div class='del'>-                xl-&gt;mem_acct.rec[type].max_num_allocs =</div><div class='del'>-                           max (xl-&gt;mem_acct.rec[type].max_num_allocs,</div><div class='del'>-                                xl-&gt;mem_acct.rec[type].num_allocs);</div><div class='add'>+            rec-&gt;size += size - header-&gt;size;</div><div class='add'>+            rec-&gt;total_allocs++;</div><div class='add'>+            rec-&gt;max_size = max(rec-&gt;max_size, rec-&gt;size);</div><div class='add'>+</div><div class='add'>+#ifdef DEBUG</div><div class='add'>+            /* The old 'header' already was present in 'obj_list', but</div><div class='add'>+             * realloc() could have changed its address. We need to remove</div><div class='add'>+             * the old item from the list and add the new one. This can be</div><div class='add'>+             * done this way because list_move() doesn't use the pointers</div><div class='add'>+             * to the old location (which are not valid anymore) already</div><div class='add'>+             * present in the list, it simply overwrites them. */</div><div class='add'>+            list_move(&amp;header-&gt;acct_list, &amp;rec-&gt;obj_list);</div><div class='add'>+#endif</div><div class='ctx'>         }</div><div class='del'>-        UNLOCK(&amp;xl-&gt;mem_acct.rec[type].lock);</div><div class='del'>-</div><div class='del'>-        *(uint32_t *)(ptr) = type;</div><div class='del'>-        ptr = ptr + 4;</div><div class='del'>-        memcpy (ptr, &amp;size, sizeof(size_t));</div><div class='del'>-        ptr += sizeof (size_t);</div><div class='del'>-        memcpy (ptr, &amp;xl, sizeof(xlator_t *));</div><div class='del'>-        ptr += sizeof (xlator_t *);</div><div class='del'>-        *(uint32_t *)(ptr) = GF_MEM_HEADER_MAGIC;</div><div class='del'>-        ptr = ptr + 4;</div><div class='del'>-        *(uint32_t *) (ptr + size) = GF_MEM_TRAILER_MAGIC;</div><div class='del'>-</div><div class='del'>-        *alloc_ptr = (void *)ptr;</div><div class='del'>-        return;</div><div class='add'>+        UNLOCK(&amp;rec-&gt;lock);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return gf_mem_header_prepare(header, size);</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+static bool</div><div class='add'>+gf_mem_acct_enabled(void)</div><div class='add'>+{</div><div class='add'>+    xlator_t *x = THIS;</div><div class='add'>+    /* Low-level __gf_xxx() may be called</div><div class='add'>+       before ctx is initialized. */</div><div class='add'>+    return x-&gt;ctx &amp;&amp; x-&gt;ctx-&gt;mem_acct_enable;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> void *</div><div class='del'>-__gf_calloc (size_t nmemb, size_t size, uint32_t type)</div><div class='add'>+__gf_calloc(size_t nmemb, size_t size, uint32_t type, const char *typestr)</div><div class='ctx'> {</div><div class='del'>-        size_t          tot_size = 0;</div><div class='del'>-        size_t          req_size = 0;</div><div class='del'>-        char            *ptr = NULL;</div><div class='del'>-        xlator_t        *xl = NULL;</div><div class='del'>-</div><div class='del'>-        if (!gf_mem_acct_enable)</div><div class='del'>-                return CALLOC (nmemb, size);</div><div class='add'>+    size_t tot_size = 0;</div><div class='add'>+    size_t req_size = 0;</div><div class='add'>+    void *ptr = NULL;</div><div class='add'>+    xlator_t *xl = NULL;</div><div class='ctx'> </div><div class='del'>-        xl = THIS;</div><div class='add'>+    if (!gf_mem_acct_enabled())</div><div class='add'>+        return CALLOC(nmemb, size);</div><div class='ctx'> </div><div class='del'>-        req_size = nmemb * size;</div><div class='del'>-        tot_size = req_size + GF_MEM_HEADER_SIZE + GF_MEM_TRAILER_SIZE;</div><div class='add'>+    xl = THIS;</div><div class='ctx'> </div><div class='del'>-        ptr = calloc (1, tot_size);</div><div class='add'>+    req_size = nmemb * size;</div><div class='add'>+    tot_size = req_size + GF_MEM_HEADER_SIZE + GF_MEM_TRAILER_SIZE;</div><div class='ctx'> </div><div class='del'>-        if (!ptr)</div><div class='del'>-                return NULL;</div><div class='add'>+    ptr = calloc(1, tot_size);</div><div class='ctx'> </div><div class='del'>-        gf_mem_set_acct_info (xl, &amp;ptr, req_size, type);</div><div class='add'>+    if (!ptr) {</div><div class='add'>+        gf_msg_nomem("", GF_LOG_ALERT, tot_size);</div><div class='add'>+        return NULL;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        return (void *)ptr;</div><div class='add'>+    return gf_mem_set_acct_info(xl-&gt;mem_acct, ptr, req_size, type, typestr);</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> void *</div><div class='del'>-__gf_malloc (size_t size, uint32_t type)</div><div class='add'>+__gf_malloc(size_t size, uint32_t type, const char *typestr)</div><div class='ctx'> {</div><div class='del'>-        size_t          tot_size = 0;</div><div class='del'>-        char            *ptr = NULL;</div><div class='del'>-        xlator_t        *xl = NULL;</div><div class='add'>+    size_t tot_size = 0;</div><div class='add'>+    void *ptr = NULL;</div><div class='add'>+    xlator_t *xl = NULL;</div><div class='ctx'> </div><div class='del'>-        if (!gf_mem_acct_enable)</div><div class='del'>-                return MALLOC (size);</div><div class='add'>+    if (!gf_mem_acct_enabled())</div><div class='add'>+        return MALLOC(size);</div><div class='ctx'> </div><div class='del'>-        xl = THIS;</div><div class='add'>+    xl = THIS;</div><div class='ctx'> </div><div class='del'>-        tot_size = size + GF_MEM_HEADER_SIZE + GF_MEM_TRAILER_SIZE;</div><div class='add'>+    tot_size = size + GF_MEM_HEADER_SIZE + GF_MEM_TRAILER_SIZE;</div><div class='ctx'> </div><div class='del'>-        ptr = malloc (tot_size);</div><div class='del'>-        if (!ptr)</div><div class='del'>-                return NULL;</div><div class='add'>+    ptr = malloc(tot_size);</div><div class='add'>+    if (!ptr) {</div><div class='add'>+        gf_msg_nomem("", GF_LOG_ALERT, tot_size);</div><div class='add'>+        return NULL;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        gf_mem_set_acct_info (xl, &amp;ptr, size, type);</div><div class='del'>-</div><div class='del'>-        return (void *)ptr;</div><div class='add'>+    return gf_mem_set_acct_info(xl-&gt;mem_acct, ptr, size, type, typestr);</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> void *</div><div class='del'>-__gf_realloc (void *ptr, size_t size)</div><div class='add'>+__gf_realloc(void *ptr, size_t size)</div><div class='ctx'> {</div><div class='del'>-        size_t          tot_size = 0;</div><div class='del'>-        char            *orig_ptr = NULL;</div><div class='del'>-        xlator_t        *xl = NULL;</div><div class='del'>-        uint32_t        type = 0;</div><div class='add'>+    size_t tot_size = 0;</div><div class='add'>+    struct mem_header *header = NULL;</div><div class='ctx'> </div><div class='add'>+    if (!gf_mem_acct_enabled())</div><div class='add'>+        return REALLOC(ptr, size);</div><div class='ctx'> </div><div class='del'>-        tot_size = size + GF_MEM_HEADER_SIZE + GF_MEM_TRAILER_SIZE;</div><div class='add'>+    REQUIRE(NULL != ptr);</div><div class='ctx'> </div><div class='del'>-        orig_ptr = (char *)ptr - 4;</div><div class='add'>+    header = (struct mem_header *)(ptr - GF_MEM_HEADER_SIZE);</div><div class='add'>+    GF_ASSERT(header-&gt;magic == GF_MEM_HEADER_MAGIC);</div><div class='ctx'> </div><div class='del'>-        assert (*(uint32_t *)orig_ptr == GF_MEM_HEADER_MAGIC);</div><div class='add'>+    tot_size = size + GF_MEM_HEADER_SIZE + GF_MEM_TRAILER_SIZE;</div><div class='add'>+    header = realloc(header, tot_size);</div><div class='add'>+    if (!header) {</div><div class='add'>+        gf_msg_nomem("", GF_LOG_ALERT, tot_size);</div><div class='add'>+        return NULL;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        orig_ptr = orig_ptr - sizeof(xlator_t *);</div><div class='del'>-        xl = *((xlator_t **)orig_ptr);</div><div class='add'>+    return gf_mem_update_acct_info(header-&gt;mem_acct, header, size);</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        orig_ptr = (char *)ptr - GF_MEM_HEADER_SIZE;</div><div class='del'>-        type = *(uint32_t *)orig_ptr;</div><div class='add'>+int</div><div class='add'>+gf_vasprintf(char **string_ptr, const char *format, va_list arg)</div><div class='add'>+{</div><div class='add'>+    va_list arg_save;</div><div class='add'>+    char *str = NULL;</div><div class='add'>+    int size = 0;</div><div class='add'>+    int rv = 0;</div><div class='add'>+</div><div class='add'>+    if (!string_ptr || !format)</div><div class='add'>+        return -1;</div><div class='add'>+</div><div class='add'>+    va_copy(arg_save, arg);</div><div class='add'>+</div><div class='add'>+    size = vsnprintf(NULL, 0, format, arg);</div><div class='add'>+    size++;</div><div class='add'>+    str = GF_MALLOC(size, gf_common_mt_asprintf);</div><div class='add'>+    if (str == NULL) {</div><div class='add'>+        /* log is done in GF_MALLOC itself */</div><div class='add'>+        va_end(arg_save);</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+    rv = vsnprintf(str, size, format, arg_save);</div><div class='add'>+</div><div class='add'>+    *string_ptr = str;</div><div class='add'>+    va_end(arg_save);</div><div class='add'>+    return (rv);</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        ptr = realloc (orig_ptr, tot_size);</div><div class='del'>-        if (!ptr)</div><div class='del'>-                return NULL;</div><div class='add'>+int</div><div class='add'>+gf_asprintf(char **string_ptr, const char *format, ...)</div><div class='add'>+{</div><div class='add'>+    va_list arg;</div><div class='add'>+    int rv = 0;</div><div class='ctx'> </div><div class='del'>-        gf_mem_set_acct_info (xl, (char **)&amp;ptr, size, type);</div><div class='add'>+    va_start(arg, format);</div><div class='add'>+    rv = gf_vasprintf(string_ptr, format, arg);</div><div class='add'>+    va_end(arg);</div><div class='ctx'> </div><div class='del'>-        return (void *)ptr;</div><div class='add'>+    return rv;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-gf_asprintf (char **string_ptr, const char *format, ...)</div><div class='add'>+#ifdef DEBUG</div><div class='add'>+void</div><div class='add'>+__gf_mem_invalidate(void *ptr)</div><div class='add'>+{</div><div class='add'>+    struct mem_header *header = ptr;</div><div class='add'>+    void *end = NULL;</div><div class='add'>+</div><div class='add'>+    struct mem_invalid inval = {</div><div class='add'>+        .magic = GF_MEM_INVALID_MAGIC,</div><div class='add'>+        .mem_acct = header-&gt;mem_acct,</div><div class='add'>+        .type = header-&gt;type,</div><div class='add'>+        .size = header-&gt;size,</div><div class='add'>+        .baseaddr = ptr + GF_MEM_HEADER_SIZE,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    /* calculate the last byte of the allocated area */</div><div class='add'>+    end = ptr + GF_MEM_HEADER_SIZE + inval.size + GF_MEM_TRAILER_SIZE;</div><div class='add'>+</div><div class='add'>+    /* overwrite the old mem_header */</div><div class='add'>+    memcpy(ptr, &amp;inval, sizeof(inval));</div><div class='add'>+    ptr += sizeof(inval);</div><div class='add'>+</div><div class='add'>+    /* zero out remaining (old) mem_header bytes) */</div><div class='add'>+    memset(ptr, 0x00, sizeof(*header) - sizeof(inval));</div><div class='add'>+    ptr += sizeof(*header) - sizeof(inval);</div><div class='add'>+</div><div class='add'>+    /* zero out the first byte of data */</div><div class='add'>+    *(uint32_t *)(ptr) = 0x00;</div><div class='add'>+    ptr += 1;</div><div class='add'>+</div><div class='add'>+    /* repeated writes of invalid structurein data area */</div><div class='add'>+    while ((ptr + (sizeof(inval))) &lt; (end - 1)) {</div><div class='add'>+        memcpy(ptr, &amp;inval, sizeof(inval));</div><div class='add'>+        ptr += sizeof(inval);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* fill out remaining data area with 0xff */</div><div class='add'>+    memset(ptr, 0xff, end - ptr);</div><div class='add'>+}</div><div class='add'>+#endif /* DEBUG */</div><div class='add'>+</div><div class='add'>+/* Coverity taint NOTE: pointers passed to free, would operate on</div><div class='add'>+pointer-GF_MEM_HEADER_SIZE content and if the pointer was used for any IO</div><div class='add'>+related purpose, the pointer stands tainted, and hence coverity would consider</div><div class='add'>+access to the said region as tainted. The following directive to coverity hence</div><div class='add'>+sanitizes the pointer, thus removing any taint to the same within this function.</div><div class='add'>+If the pointer is accessed outside the scope of this function without any</div><div class='add'>+checks on content read from an IO operation, taints will still be reported, and</div><div class='add'>+needs appropriate addressing. */</div><div class='add'>+</div><div class='add'>+/* coverity[ +tainted_data_sanitize : arg-0 ] */</div><div class='add'>+static void</div><div class='add'>+gf_free_sanitize(void *s)</div><div class='ctx'> {</div><div class='del'>-	va_list arg;</div><div class='del'>-	char    *str = NULL;</div><div class='del'>-	int     size = 0;</div><div class='del'>-	int     rv = 0;</div><div class='del'>-</div><div class='del'>-	if (!string_ptr || !format)</div><div class='del'>-		return -1;</div><div class='del'>-</div><div class='del'>-	va_start (arg, format);</div><div class='del'>-	size = vsnprintf (NULL, 0, format, arg);</div><div class='del'>-	size++;</div><div class='del'>-	va_start (arg, format);</div><div class='del'>-	str = GF_MALLOC (size, gf_common_mt_asprintf);</div><div class='del'>-	if (str == NULL) {</div><div class='del'>-		va_end (arg);</div><div class='del'>-		/*</div><div class='del'>-		 * Strictly speaking, GNU asprintf doesn't do this,</div><div class='del'>-		 * but the caller isn't checking the return value.</div><div class='del'>-		 */</div><div class='del'>-		gf_log ("libglusterfs", GF_LOG_CRITICAL,</div><div class='del'>-                         "failed to allocate memory");</div><div class='del'>-		return -1;</div><div class='del'>-	}</div><div class='del'>-	rv = vsnprintf( str, size, format, arg);</div><div class='del'>-	va_end (arg);</div><div class='del'>-</div><div class='del'>-	*string_ptr = str;</div><div class='del'>-	return (rv);</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> void</div><div class='del'>-__gf_free (void *free_ptr)</div><div class='add'>+__gf_free(void *free_ptr)</div><div class='ctx'> {</div><div class='del'>-        size_t          req_size = 0;</div><div class='del'>-        char            *ptr = NULL;</div><div class='del'>-        uint32_t        type = 0;</div><div class='del'>-        xlator_t        *xl = NULL;</div><div class='del'>-</div><div class='del'>-        if (!gf_mem_acct_enable) {</div><div class='del'>-                FREE (free_ptr);</div><div class='del'>-                return;</div><div class='add'>+    void *ptr = NULL;</div><div class='add'>+    struct mem_acct *mem_acct;</div><div class='add'>+    struct mem_header *header = NULL;</div><div class='add'>+    bool last_ref = false;</div><div class='add'>+</div><div class='add'>+    if (!gf_mem_acct_enabled()) {</div><div class='add'>+        FREE(free_ptr);</div><div class='add'>+        return;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (!free_ptr)</div><div class='add'>+        return;</div><div class='add'>+</div><div class='add'>+    gf_free_sanitize(free_ptr);</div><div class='add'>+    ptr = free_ptr - GF_MEM_HEADER_SIZE;</div><div class='add'>+    header = (struct mem_header *)ptr;</div><div class='add'>+</div><div class='add'>+    // Possible corruption, assert here</div><div class='add'>+    GF_ASSERT(GF_MEM_HEADER_MAGIC == header-&gt;magic);</div><div class='add'>+</div><div class='add'>+    mem_acct = header-&gt;mem_acct;</div><div class='add'>+    if (!mem_acct) {</div><div class='add'>+        goto free;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    // This points to a memory overrun</div><div class='add'>+    GF_ASSERT(GF_MEM_TRAILER_MAGIC ==</div><div class='add'>+              *(uint32_t *)((char *)free_ptr + header-&gt;size));</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;mem_acct-&gt;rec[header-&gt;type].lock);</div><div class='add'>+    {</div><div class='add'>+        mem_acct-&gt;rec[header-&gt;type].size -= header-&gt;size;</div><div class='add'>+        mem_acct-&gt;rec[header-&gt;type].num_allocs--;</div><div class='add'>+        /* If all the instances are freed up then ensure typestr is set</div><div class='add'>+         * to NULL */</div><div class='add'>+        if (!mem_acct-&gt;rec[header-&gt;type].num_allocs) {</div><div class='add'>+            last_ref = true;</div><div class='add'>+            mem_acct-&gt;rec[header-&gt;type].typestr = NULL;</div><div class='ctx'>         }</div><div class='add'>+#ifdef DEBUG</div><div class='add'>+        list_del(&amp;header-&gt;acct_list);</div><div class='add'>+#endif</div><div class='add'>+    }</div><div class='add'>+    UNLOCK(&amp;mem_acct-&gt;rec[header-&gt;type].lock);</div><div class='ctx'> </div><div class='del'>-        if (!free_ptr)</div><div class='del'>-                return;</div><div class='add'>+    if (last_ref) {</div><div class='add'>+        xlator_mem_acct_unref(mem_acct);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='add'>+free:</div><div class='add'>+#ifdef DEBUG</div><div class='add'>+    __gf_mem_invalidate(ptr);</div><div class='add'>+#endif</div><div class='ctx'> </div><div class='del'>-        ptr = (char *)free_ptr - 4;</div><div class='add'>+    FREE(ptr);</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        if (GF_MEM_HEADER_MAGIC != *(uint32_t *)ptr) {</div><div class='del'>-                //Possible corruption, assert here</div><div class='del'>-                assert (0);</div><div class='del'>-        }</div><div class='add'>+#if defined(GF_DISABLE_MEMPOOL)</div><div class='ctx'> </div><div class='del'>-        *(uint32_t *)ptr = 0;</div><div class='add'>+struct mem_pool *</div><div class='add'>+mem_pool_new_fn(glusterfs_ctx_t *ctx, unsigned long sizeof_type,</div><div class='add'>+                unsigned long count, char *name)</div><div class='add'>+{</div><div class='add'>+    struct mem_pool *new;</div><div class='ctx'> </div><div class='del'>-        ptr = ptr - sizeof(xlator_t *);</div><div class='del'>-        memcpy (&amp;xl, ptr, sizeof(xlator_t *));</div><div class='add'>+    new = GF_MALLOC(sizeof(struct mem_pool), gf_common_mt_mem_pool);</div><div class='add'>+    if (!new)</div><div class='add'>+        return NULL;</div><div class='ctx'> </div><div class='del'>-        if (!xl) {</div><div class='del'>-                //gf_free expects xl to be available</div><div class='del'>-                assert (0);</div><div class='del'>-        }</div><div class='add'>+    new-&gt;sizeof_type = sizeof_type;</div><div class='add'>+    return new;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        if (!xl-&gt;mem_acct.rec) {</div><div class='del'>-                ptr = (char *)free_ptr - GF_MEM_HEADER_SIZE;</div><div class='del'>-                goto free;</div><div class='del'>-        }</div><div class='add'>+void</div><div class='add'>+mem_pool_destroy(struct mem_pool *pool)</div><div class='add'>+{</div><div class='add'>+    GF_FREE(pool);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#else /* !GF_DISABLE_MEMPOOL */</div><div class='add'>+</div><div class='add'>+static pthread_mutex_t pool_lock = PTHREAD_MUTEX_INITIALIZER;</div><div class='add'>+static struct list_head pool_threads;</div><div class='add'>+static pthread_mutex_t pool_free_lock = PTHREAD_MUTEX_INITIALIZER;</div><div class='add'>+static struct list_head pool_free_threads;</div><div class='add'>+static struct mem_pool_shared pools[NPOOLS];</div><div class='add'>+static size_t pool_list_size;</div><div class='add'>+</div><div class='add'>+static __thread per_thread_pool_list_t *thread_pool_list = NULL;</div><div class='add'>+</div><div class='add'>+#define N_COLD_LISTS 1024</div><div class='add'>+#define POOL_SWEEP_SECS 30</div><div class='add'>+</div><div class='add'>+typedef struct {</div><div class='add'>+    pooled_obj_hdr_t *cold_lists[N_COLD_LISTS];</div><div class='add'>+    unsigned int n_cold_lists;</div><div class='add'>+} sweep_state_t;</div><div class='ctx'> </div><div class='add'>+enum init_state {</div><div class='add'>+    GF_MEMPOOL_INIT_NONE = 0,</div><div class='add'>+    GF_MEMPOOL_INIT_EARLY,</div><div class='add'>+    GF_MEMPOOL_INIT_LATE,</div><div class='add'>+    GF_MEMPOOL_INIT_DESTROY</div><div class='add'>+};</div><div class='ctx'> </div><div class='del'>-        ptr = ptr - sizeof(size_t);</div><div class='del'>-        memcpy (&amp;req_size, ptr, sizeof (size_t));</div><div class='del'>-        ptr = ptr - 4;</div><div class='del'>-        type = *(uint32_t *)ptr;</div><div class='add'>+static enum init_state init_done = GF_MEMPOOL_INIT_NONE;</div><div class='add'>+static pthread_mutex_t init_mutex = PTHREAD_MUTEX_INITIALIZER;</div><div class='add'>+static unsigned int init_count = 0;</div><div class='add'>+static pthread_t sweeper_tid;</div><div class='ctx'> </div><div class='del'>-        if (GF_MEM_TRAILER_MAGIC != *(uint32_t *)</div><div class='del'>-                                    ((char *)free_ptr + req_size)) {</div><div class='del'>-                // This points to a memory overrun</div><div class='del'>-                assert (0);</div><div class='add'>+static bool</div><div class='add'>+collect_garbage(sweep_state_t *state, per_thread_pool_list_t *pool_list)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    per_thread_pool_t *pt_pool;</div><div class='add'>+</div><div class='add'>+    (void)pthread_spin_lock(&amp;pool_list-&gt;lock);</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; NPOOLS; ++i) {</div><div class='add'>+        pt_pool = &amp;pool_list-&gt;pools[i];</div><div class='add'>+        if (pt_pool-&gt;cold_list) {</div><div class='add'>+            if (state-&gt;n_cold_lists &gt;= N_COLD_LISTS) {</div><div class='add'>+                (void)pthread_spin_unlock(&amp;pool_list-&gt;lock);</div><div class='add'>+                return true;</div><div class='add'>+            }</div><div class='add'>+            state-&gt;cold_lists[state-&gt;n_cold_lists++] = pt_pool-&gt;cold_list;</div><div class='ctx'>         }</div><div class='del'>-        *(uint32_t *) ((char *)free_ptr + req_size) = 0;</div><div class='add'>+        pt_pool-&gt;cold_list = pt_pool-&gt;hot_list;</div><div class='add'>+        pt_pool-&gt;hot_list = NULL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    (void)pthread_spin_unlock(&amp;pool_list-&gt;lock);</div><div class='add'>+</div><div class='add'>+    return false;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+free_obj_list(pooled_obj_hdr_t *victim)</div><div class='add'>+{</div><div class='add'>+    pooled_obj_hdr_t *next;</div><div class='add'>+</div><div class='add'>+    while (victim) {</div><div class='add'>+        next = victim-&gt;next;</div><div class='add'>+        free(victim);</div><div class='add'>+        victim = next;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        LOCK (&amp;xl-&gt;mem_acct.rec[type].lock);</div><div class='add'>+static void *</div><div class='add'>+pool_sweeper(void *arg)</div><div class='add'>+{</div><div class='add'>+    sweep_state_t state;</div><div class='add'>+    per_thread_pool_list_t *pool_list;</div><div class='add'>+    uint32_t i;</div><div class='add'>+    bool pending;</div><div class='add'>+</div><div class='add'>+    /*</div><div class='add'>+     * This is all a bit inelegant, but the point is to avoid doing</div><div class='add'>+     * expensive things (like freeing thousands of objects) while holding a</div><div class='add'>+     * global lock.  Thus, we split each iteration into two passes, with</div><div class='add'>+     * only the first and fastest holding the lock.</div><div class='add'>+     */</div><div class='add'>+</div><div class='add'>+    pending = true;</div><div class='add'>+</div><div class='add'>+    for (;;) {</div><div class='add'>+        /* If we know there's pending work to do (or it's the first run), we</div><div class='add'>+         * do collect garbage more often. */</div><div class='add'>+        sleep(pending ? POOL_SWEEP_SECS / 5 : POOL_SWEEP_SECS);</div><div class='add'>+</div><div class='add'>+        (void)pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, NULL);</div><div class='add'>+        state.n_cold_lists = 0;</div><div class='add'>+        pending = false;</div><div class='add'>+</div><div class='add'>+        /* First pass: collect stuff that needs our attention. */</div><div class='add'>+        (void)pthread_mutex_lock(&amp;pool_lock);</div><div class='add'>+        list_for_each_entry(pool_list, &amp;pool_threads, thr_list)</div><div class='ctx'>         {</div><div class='del'>-                xl-&gt;mem_acct.rec[type].size -= req_size;</div><div class='del'>-                xl-&gt;mem_acct.rec[type].num_allocs--;</div><div class='add'>+            if (collect_garbage(&amp;state, pool_list)) {</div><div class='add'>+                pending = true;</div><div class='add'>+            }</div><div class='ctx'>         }</div><div class='del'>-        UNLOCK (&amp;xl-&gt;mem_acct.rec[type].lock);</div><div class='del'>-free:</div><div class='del'>-        FREE (ptr);</div><div class='del'>-}</div><div class='add'>+        (void)pthread_mutex_unlock(&amp;pool_lock);</div><div class='ctx'> </div><div class='add'>+        /* Second pass: free cold objects from live pools. */</div><div class='add'>+        for (i = 0; i &lt; state.n_cold_lists; ++i) {</div><div class='add'>+            free_obj_list(state.cold_lists[i]);</div><div class='add'>+        }</div><div class='add'>+        (void)pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='add'>+    return NULL;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-struct mem_pool *</div><div class='del'>-mem_pool_new_fn (unsigned long sizeof_type,</div><div class='del'>-		 unsigned long count)</div><div class='add'>+void</div><div class='add'>+mem_pool_thread_destructor(per_thread_pool_list_t *pool_list)</div><div class='ctx'> {</div><div class='del'>-	struct mem_pool  *mem_pool = NULL;</div><div class='del'>-	unsigned long     padded_sizeof_type = 0;</div><div class='del'>-	void             *pool = NULL;</div><div class='del'>-	int               i = 0;</div><div class='del'>-	struct list_head *list = NULL;</div><div class='del'>-</div><div class='del'>-	if (!sizeof_type || !count) {</div><div class='del'>-		gf_log ("mem-pool", GF_LOG_ERROR, "invalid argument");</div><div class='del'>-		return NULL;</div><div class='del'>-	}</div><div class='del'>-        padded_sizeof_type = sizeof_type + GF_MEM_POOL_PAD_BOUNDARY;</div><div class='del'>-</div><div class='del'>-	mem_pool = GF_CALLOC (sizeof (*mem_pool), 1, gf_common_mt_mem_pool);</div><div class='del'>-	if (!mem_pool)</div><div class='del'>-		return NULL;</div><div class='del'>-</div><div class='del'>-	LOCK_INIT (&amp;mem_pool-&gt;lock);</div><div class='del'>-	INIT_LIST_HEAD (&amp;mem_pool-&gt;list);</div><div class='del'>-</div><div class='del'>-	mem_pool-&gt;padded_sizeof_type = padded_sizeof_type;</div><div class='del'>-	mem_pool-&gt;cold_count = count;</div><div class='del'>-        mem_pool-&gt;real_sizeof_type = sizeof_type;</div><div class='del'>-</div><div class='del'>-        pool = GF_CALLOC (count, padded_sizeof_type, gf_common_mt_long);</div><div class='del'>-	if (!pool) {</div><div class='del'>-                GF_FREE (mem_pool);</div><div class='del'>-		return NULL;</div><div class='add'>+    per_thread_pool_t *pt_pool;</div><div class='add'>+    uint32_t i;</div><div class='add'>+</div><div class='add'>+    if (pool_list == NULL) {</div><div class='add'>+        pool_list = thread_pool_list;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* The current thread is terminating. None of the allocated objects will</div><div class='add'>+     * be used again. We can directly destroy them here instead of delaying</div><div class='add'>+     * it until the next sweeper loop. */</div><div class='add'>+    if (pool_list != NULL) {</div><div class='add'>+        /* Remove pool_list from the global list to avoid that sweeper</div><div class='add'>+         * could touch it. */</div><div class='add'>+        pthread_mutex_lock(&amp;pool_lock);</div><div class='add'>+        list_del(&amp;pool_list-&gt;thr_list);</div><div class='add'>+        pthread_mutex_unlock(&amp;pool_lock);</div><div class='add'>+</div><div class='add'>+        /* We need to protect hot/cold changes from potential mem_put() calls</div><div class='add'>+         * that reference this pool_list. Once poison is set to true, we are</div><div class='add'>+         * sure that no one else will touch hot/cold lists. The only possible</div><div class='add'>+         * race is when at the same moment a mem_put() is adding a new item</div><div class='add'>+         * to the hot list. We protect from that by taking pool_list-&gt;lock.</div><div class='add'>+         * After that we don't need the lock to destroy the hot/cold lists. */</div><div class='add'>+        pthread_spin_lock(&amp;pool_list-&gt;lock);</div><div class='add'>+        pool_list-&gt;poison = true;</div><div class='add'>+        pthread_spin_unlock(&amp;pool_list-&gt;lock);</div><div class='add'>+</div><div class='add'>+        for (i = 0; i &lt; NPOOLS; i++) {</div><div class='add'>+            pt_pool = &amp;pool_list-&gt;pools[i];</div><div class='add'>+</div><div class='add'>+            free_obj_list(pt_pool-&gt;hot_list);</div><div class='add'>+            pt_pool-&gt;hot_list = NULL;</div><div class='add'>+</div><div class='add'>+            free_obj_list(pt_pool-&gt;cold_list);</div><div class='add'>+            pt_pool-&gt;cold_list = NULL;</div><div class='ctx'>         }</div><div class='ctx'> </div><div class='del'>-	for (i = 0; i &lt; count; i++) {</div><div class='del'>-		list = pool + (i * (padded_sizeof_type));</div><div class='del'>-		INIT_LIST_HEAD (list);</div><div class='del'>-		list_add_tail (list, &amp;mem_pool-&gt;list);</div><div class='del'>-	}</div><div class='add'>+        pthread_mutex_lock(&amp;pool_free_lock);</div><div class='add'>+        list_add(&amp;pool_list-&gt;thr_list, &amp;pool_free_threads);</div><div class='add'>+        pthread_mutex_unlock(&amp;pool_free_lock);</div><div class='add'>+</div><div class='add'>+        thread_pool_list = NULL;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static __attribute__((constructor)) void</div><div class='add'>+mem_pools_preinit(void)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+</div><div class='add'>+    INIT_LIST_HEAD(&amp;pool_threads);</div><div class='add'>+    INIT_LIST_HEAD(&amp;pool_free_threads);</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; NPOOLS; ++i) {</div><div class='add'>+        pools[i].power_of_two = POOL_SMALLEST + i;</div><div class='ctx'> </div><div class='del'>-	mem_pool-&gt;pool = pool;</div><div class='del'>-	mem_pool-&gt;pool_end = pool + (count * (padded_sizeof_type));</div><div class='add'>+        GF_ATOMIC_INIT(pools[i].allocs_hot, 0);</div><div class='add'>+        GF_ATOMIC_INIT(pools[i].allocs_cold, 0);</div><div class='add'>+        GF_ATOMIC_INIT(pools[i].allocs_stdc, 0);</div><div class='add'>+        GF_ATOMIC_INIT(pools[i].frees_to_list, 0);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	return mem_pool;</div><div class='add'>+    pool_list_size = sizeof(per_thread_pool_list_t) +</div><div class='add'>+                     sizeof(per_thread_pool_t) * (NPOOLS - 1);</div><div class='add'>+</div><div class='add'>+    init_done = GF_MEMPOOL_INIT_EARLY;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-void*</div><div class='del'>-mem_get0 (struct mem_pool *mem_pool)</div><div class='add'>+static __attribute__((destructor)) void</div><div class='add'>+mem_pools_postfini(void)</div><div class='ctx'> {</div><div class='del'>-        struct list_head *list = NULL;</div><div class='del'>-        void             *ptr = NULL;</div><div class='add'>+    /* TODO: This function should destroy all per thread memory pools that</div><div class='add'>+     *       are still alive, but this is not possible right now because glibc</div><div class='add'>+     *       starts calling destructors as soon as exit() is called, and</div><div class='add'>+     *       gluster doesn't ensure that all threads have been stopped before</div><div class='add'>+     *       calling exit(). Existing threads would crash when they try to use</div><div class='add'>+     *       memory or they terminate if we destroy things here.</div><div class='add'>+     *</div><div class='add'>+     *       When we propertly terminate all threads, we can add the needed</div><div class='add'>+     *       code here. Till then we need to leave the memory allocated. Most</div><div class='add'>+     *       probably this function will be executed on process termination,</div><div class='add'>+     *       so the memory will be released anyway by the system. */</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        if (!mem_pool) {</div><div class='del'>-                gf_log ("mem-pool", GF_LOG_ERROR, "invalid argument");</div><div class='del'>-                return NULL;</div><div class='del'>-        }</div><div class='add'>+/* Call mem_pools_init() once threading has been configured completely. This</div><div class='add'>+ * prevent the pool_sweeper thread from getting killed once the main() thread</div><div class='add'>+ * exits during deamonizing. */</div><div class='add'>+void</div><div class='add'>+mem_pools_init(void)</div><div class='add'>+{</div><div class='add'>+    pthread_mutex_lock(&amp;init_mutex);</div><div class='add'>+    if ((init_count++) == 0) {</div><div class='add'>+        (void)gf_thread_create(&amp;sweeper_tid, NULL, pool_sweeper, NULL,</div><div class='add'>+                               "memsweep");</div><div class='add'>+</div><div class='add'>+        init_done = GF_MEMPOOL_INIT_LATE;</div><div class='add'>+    }</div><div class='add'>+    pthread_mutex_unlock(&amp;init_mutex);</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        LOCK (&amp;mem_pool-&gt;lock);</div><div class='del'>-        {</div><div class='del'>-                if (mem_pool-&gt;cold_count) {</div><div class='del'>-                        list = mem_pool-&gt;list.next;</div><div class='del'>-                        list_del (list);</div><div class='del'>-</div><div class='del'>-                        mem_pool-&gt;hot_count++;</div><div class='del'>-                        mem_pool-&gt;cold_count--;</div><div class='del'>-</div><div class='del'>-                        ptr = list;</div><div class='del'>-                        goto fwd_addr_out;</div><div class='del'>-                }</div><div class='del'>-                ptr = MALLOC (mem_pool-&gt;real_sizeof_type);</div><div class='del'>-                goto unlocked_out;</div><div class='add'>+void</div><div class='add'>+mem_pools_fini(void)</div><div class='add'>+{</div><div class='add'>+    pthread_mutex_lock(&amp;init_mutex);</div><div class='add'>+    switch (init_count) {</div><div class='add'>+        case 0:</div><div class='add'>+            /*</div><div class='add'>+             * If init_count is already zero (as e.g. if somebody called this</div><div class='add'>+             * before mem_pools_init) then the sweeper was probably never even</div><div class='add'>+             * started so we don't need to stop it. Even if there's some crazy</div><div class='add'>+             * circumstance where there is a sweeper but init_count is still</div><div class='add'>+             * zero, that just means we'll leave it running. Not perfect, but</div><div class='add'>+             * far better than any known alternative.</div><div class='add'>+             */</div><div class='add'>+            break;</div><div class='add'>+        case 1: {</div><div class='add'>+            /* if mem_pools_init() was not called, sweeper_tid will be invalid</div><div class='add'>+             * and the functions will error out. That is not critical. In all</div><div class='add'>+             * other cases, the sweeper_tid will be valid and the thread gets</div><div class='add'>+             * stopped. */</div><div class='add'>+            (void)pthread_cancel(sweeper_tid);</div><div class='add'>+            (void)pthread_join(sweeper_tid, NULL);</div><div class='add'>+</div><div class='add'>+            /* There could be threads still running in some cases, so we can't</div><div class='add'>+             * destroy pool_lists in use. We can also not destroy unused</div><div class='add'>+             * pool_lists because some allocated objects may still be pointing</div><div class='add'>+             * to them. */</div><div class='add'>+            mem_pool_thread_destructor(NULL);</div><div class='add'>+</div><div class='add'>+            init_done = GF_MEMPOOL_INIT_DESTROY;</div><div class='add'>+            /* Fall through. */</div><div class='ctx'>         }</div><div class='del'>-fwd_addr_out:</div><div class='del'>-        ptr = mem_pool_chunkhead2ptr (ptr);</div><div class='del'>-unlocked_out:</div><div class='add'>+        default:</div><div class='add'>+            --init_count;</div><div class='add'>+    }</div><div class='add'>+    pthread_mutex_unlock(&amp;init_mutex);</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-         memset(ptr, 0, mem_pool-&gt;real_sizeof_type);</div><div class='del'>-        UNLOCK (&amp;mem_pool-&gt;lock);</div><div class='add'>+void</div><div class='add'>+mem_pool_destroy(struct mem_pool *pool)</div><div class='add'>+{</div><div class='add'>+    if (!pool)</div><div class='add'>+        return;</div><div class='ctx'> </div><div class='del'>-        return ptr;</div><div class='add'>+    /* remove this pool from the owner (glusterfs_ctx_t) */</div><div class='add'>+    LOCK(&amp;pool-&gt;ctx-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        list_del(&amp;pool-&gt;owner);</div><div class='add'>+    }</div><div class='add'>+    UNLOCK(&amp;pool-&gt;ctx-&gt;lock);</div><div class='add'>+</div><div class='add'>+    /* free this pool, but keep the mem_pool_shared */</div><div class='add'>+    GF_FREE(pool);</div><div class='add'>+</div><div class='add'>+    /*</div><div class='add'>+     * Pools are now permanent, so the mem_pool-&gt;pool is kept around. All</div><div class='add'>+     * of the objects *in* the pool will eventually be freed via the</div><div class='add'>+     * pool-sweeper thread, and this way we don't have to add a lot of</div><div class='add'>+     * reference-counting complexity.</div><div class='add'>+     */</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-void *</div><div class='del'>-mem_get (struct mem_pool *mem_pool)</div><div class='add'>+struct mem_pool *</div><div class='add'>+mem_pool_new_fn(glusterfs_ctx_t *ctx, unsigned long sizeof_type,</div><div class='add'>+                unsigned long count, char *name)</div><div class='ctx'> {</div><div class='del'>-	struct list_head *list = NULL;</div><div class='del'>-	void             *ptr = NULL;</div><div class='del'>-</div><div class='del'>-	if (!mem_pool) {</div><div class='del'>-		gf_log ("mem-pool", GF_LOG_ERROR, "invalid argument");</div><div class='del'>-		return NULL;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	LOCK (&amp;mem_pool-&gt;lock);</div><div class='del'>-	{</div><div class='del'>-		if (mem_pool-&gt;cold_count) {</div><div class='del'>-			list = mem_pool-&gt;list.next;</div><div class='del'>-			list_del (list);</div><div class='del'>-</div><div class='del'>-			mem_pool-&gt;hot_count++;</div><div class='del'>-			mem_pool-&gt;cold_count--;</div><div class='del'>-</div><div class='del'>-			ptr = list;</div><div class='del'>-                        goto fwd_addr_out;</div><div class='del'>-		}</div><div class='del'>-</div><div class='del'>-                /* This is a problem area. If we've run out of</div><div class='del'>-                 * chunks in our slab above, we need to allocate</div><div class='del'>-                 * enough memory to service this request.</div><div class='del'>-                 * The problem is, these indvidual chunks will fail</div><div class='del'>-                 * the first address range check in __is_member. Now, since</div><div class='del'>-                 * we're not allocating a full second slab, we wont have</div><div class='del'>-                 * enough info perform the range check in __is_member.</div><div class='del'>-                 *</div><div class='del'>-                 * I am working around this by performing a regular allocation</div><div class='del'>-                 * , just the way the caller would've done when not using the</div><div class='del'>-                 * mem-pool. That also means, we're not padding the size with</div><div class='del'>-                 * the list_head structure because, this will not be added to</div><div class='del'>-                 * the list of chunks that belong to the mem-pool allocated</div><div class='del'>-                 * initially.</div><div class='del'>-                 *</div><div class='del'>-                 * This is the best we can do without adding functionality for</div><div class='del'>-                 * managing multiple slabs. That does not interest us at present</div><div class='del'>-                 * because it is too much work knowing that a better slab</div><div class='del'>-                 * allocator is coming RSN.</div><div class='del'>-                 */</div><div class='del'>-		ptr = MALLOC (mem_pool-&gt;real_sizeof_type);</div><div class='del'>-</div><div class='del'>-                /* Memory coming from the heap need not be transformed from a</div><div class='del'>-                 * chunkhead to a usable pointer since it is not coming from</div><div class='del'>-                 * the pool.</div><div class='del'>-                 */</div><div class='del'>-                goto unlocked_out;</div><div class='del'>-	}</div><div class='del'>-fwd_addr_out:</div><div class='del'>-        ptr = mem_pool_chunkhead2ptr (ptr);</div><div class='del'>-unlocked_out:</div><div class='del'>-        UNLOCK (&amp;mem_pool-&gt;lock);</div><div class='del'>-</div><div class='del'>-	return ptr;</div><div class='add'>+    unsigned long extra_size, size;</div><div class='add'>+    unsigned int power;</div><div class='add'>+    struct mem_pool *new = NULL;</div><div class='add'>+    struct mem_pool_shared *pool = NULL;</div><div class='add'>+</div><div class='add'>+    if (!sizeof_type) {</div><div class='add'>+        gf_msg_callingfn("mem-pool", GF_LOG_ERROR, EINVAL, LG_MSG_INVALID_ARG,</div><div class='add'>+                         "invalid argument");</div><div class='add'>+        return NULL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* This is the overhead we'll have because of memory accounting for each</div><div class='add'>+     * memory block. */</div><div class='add'>+    extra_size = sizeof(pooled_obj_hdr_t);</div><div class='add'>+</div><div class='add'>+    /* We need to compute the total space needed to hold the data type and</div><div class='add'>+     * the header. Given that the smallest block size we have in the pools</div><div class='add'>+     * is 2^POOL_SMALLEST, we need to take the MAX(size, 2^POOL_SMALLEST).</div><div class='add'>+     * However, since this value is only needed to compute its rounded</div><div class='add'>+     * logarithm in base 2, and this only depends on the highest bit set,</div><div class='add'>+     * we can simply do a bitwise or with the minimum size. We need to</div><div class='add'>+     * subtract 1 for correct handling of sizes that are exactly a power</div><div class='add'>+     * of 2. */</div><div class='add'>+    size = (sizeof_type + extra_size - 1UL) | ((1UL &lt;&lt; POOL_SMALLEST) - 1UL);</div><div class='add'>+</div><div class='add'>+    /* We compute the logarithm in base 2 rounded up of the resulting size.</div><div class='add'>+     * This value will identify which pool we need to use from the pools of</div><div class='add'>+     * powers of 2. This is equivalent to finding the position of the highest</div><div class='add'>+     * bit set. */</div><div class='add'>+    power = sizeof(size) * 8 - __builtin_clzl(size);</div><div class='add'>+    if (power &gt; POOL_LARGEST) {</div><div class='add'>+        gf_msg_callingfn("mem-pool", GF_LOG_ERROR, EINVAL, LG_MSG_INVALID_ARG,</div><div class='add'>+                         "invalid argument");</div><div class='add'>+        return NULL;</div><div class='add'>+    }</div><div class='add'>+    pool = &amp;pools[power - POOL_SMALLEST];</div><div class='add'>+</div><div class='add'>+    new = GF_MALLOC(sizeof(struct mem_pool), gf_common_mt_mem_pool);</div><div class='add'>+    if (!new)</div><div class='add'>+        return NULL;</div><div class='add'>+</div><div class='add'>+    new-&gt;ctx = ctx;</div><div class='add'>+    new-&gt;sizeof_type = sizeof_type;</div><div class='add'>+    new-&gt;count = count;</div><div class='add'>+    new-&gt;name = name;</div><div class='add'>+    new-&gt;xl_name = THIS-&gt;name;</div><div class='add'>+    new-&gt;pool = pool;</div><div class='add'>+    GF_ATOMIC_INIT(new-&gt;active, 0);</div><div class='add'>+#ifdef DEBUG</div><div class='add'>+    GF_ATOMIC_INIT(new-&gt;hit, 0);</div><div class='add'>+    GF_ATOMIC_INIT(new-&gt;miss, 0);</div><div class='add'>+#endif</div><div class='add'>+    INIT_LIST_HEAD(&amp;new-&gt;owner);</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;ctx-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        list_add(&amp;new-&gt;owner, &amp;ctx-&gt;mempool_list);</div><div class='add'>+    }</div><div class='add'>+    UNLOCK(&amp;ctx-&gt;lock);</div><div class='add'>+</div><div class='add'>+    return new;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='del'>-static int</div><div class='del'>-__is_member (struct mem_pool *pool, void *ptr)</div><div class='add'>+per_thread_pool_list_t *</div><div class='add'>+mem_get_pool_list(void)</div><div class='ctx'> {</div><div class='del'>-	if (!pool || !ptr) {</div><div class='del'>-		gf_log ("mem-pool", GF_LOG_ERROR, "invalid argument");</div><div class='del'>-		return -1;</div><div class='del'>-	}</div><div class='add'>+    per_thread_pool_list_t *pool_list;</div><div class='add'>+    unsigned int i;</div><div class='add'>+</div><div class='add'>+    pool_list = thread_pool_list;</div><div class='add'>+    if (pool_list) {</div><div class='add'>+        return pool_list;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    (void)pthread_mutex_lock(&amp;pool_free_lock);</div><div class='add'>+    if (!list_empty(&amp;pool_free_threads)) {</div><div class='add'>+        pool_list = list_entry(pool_free_threads.next, per_thread_pool_list_t,</div><div class='add'>+                               thr_list);</div><div class='add'>+        list_del(&amp;pool_list-&gt;thr_list);</div><div class='add'>+    }</div><div class='add'>+    (void)pthread_mutex_unlock(&amp;pool_free_lock);</div><div class='add'>+</div><div class='add'>+    if (!pool_list) {</div><div class='add'>+        pool_list = MALLOC(pool_list_size);</div><div class='add'>+        if (!pool_list) {</div><div class='add'>+            return NULL;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        INIT_LIST_HEAD(&amp;pool_list-&gt;thr_list);</div><div class='add'>+        (void)pthread_spin_init(&amp;pool_list-&gt;lock, PTHREAD_PROCESS_PRIVATE);</div><div class='add'>+        for (i = 0; i &lt; NPOOLS; ++i) {</div><div class='add'>+            pool_list-&gt;pools[i].parent = &amp;pools[i];</div><div class='add'>+            pool_list-&gt;pools[i].hot_list = NULL;</div><div class='add'>+            pool_list-&gt;pools[i].cold_list = NULL;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* There's no need to take pool_list-&gt;lock, because this is already an</div><div class='add'>+     * atomic operation and we don't need to synchronize it with any change</div><div class='add'>+     * in hot/cold lists. */</div><div class='add'>+    pool_list-&gt;poison = false;</div><div class='add'>+</div><div class='add'>+    (void)pthread_mutex_lock(&amp;pool_lock);</div><div class='add'>+    list_add(&amp;pool_list-&gt;thr_list, &amp;pool_threads);</div><div class='add'>+    (void)pthread_mutex_unlock(&amp;pool_lock);</div><div class='ctx'> </div><div class='del'>-	if (ptr &lt; pool-&gt;pool || ptr &gt;= pool-&gt;pool_end)</div><div class='del'>-		return 0;</div><div class='add'>+    thread_pool_list = pool_list;</div><div class='ctx'> </div><div class='del'>-	if ((mem_pool_ptr2chunkhead (ptr) - pool-&gt;pool)</div><div class='del'>-                        % pool-&gt;padded_sizeof_type)</div><div class='del'>-		return -1;</div><div class='add'>+    /* Ensure that all memory objects associated to the new pool_list are</div><div class='add'>+     * destroyed when the thread terminates. */</div><div class='add'>+    gf_thread_needs_cleanup();</div><div class='ctx'> </div><div class='del'>-	return 1;</div><div class='add'>+    return pool_list;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+static pooled_obj_hdr_t *</div><div class='add'>+mem_get_from_pool(struct mem_pool *mem_pool)</div><div class='add'>+{</div><div class='add'>+    per_thread_pool_list_t *pool_list;</div><div class='add'>+    per_thread_pool_t *pt_pool;</div><div class='add'>+    pooled_obj_hdr_t *retval;</div><div class='add'>+#ifdef DEBUG</div><div class='add'>+    gf_boolean_t hit = _gf_true;</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+    pool_list = mem_get_pool_list();</div><div class='add'>+    if (!pool_list || pool_list-&gt;poison) {</div><div class='add'>+        return NULL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    pt_pool = &amp;pool_list-&gt;pools[mem_pool-&gt;pool-&gt;power_of_two - POOL_SMALLEST];</div><div class='add'>+</div><div class='add'>+    (void)pthread_spin_lock(&amp;pool_list-&gt;lock);</div><div class='add'>+</div><div class='add'>+    retval = pt_pool-&gt;hot_list;</div><div class='add'>+    if (retval) {</div><div class='add'>+        pt_pool-&gt;hot_list = retval-&gt;next;</div><div class='add'>+        (void)pthread_spin_unlock(&amp;pool_list-&gt;lock);</div><div class='add'>+        GF_ATOMIC_INC(pt_pool-&gt;parent-&gt;allocs_hot);</div><div class='add'>+    } else {</div><div class='add'>+        retval = pt_pool-&gt;cold_list;</div><div class='add'>+        if (retval) {</div><div class='add'>+            pt_pool-&gt;cold_list = retval-&gt;next;</div><div class='add'>+            (void)pthread_spin_unlock(&amp;pool_list-&gt;lock);</div><div class='add'>+            GF_ATOMIC_INC(pt_pool-&gt;parent-&gt;allocs_cold);</div><div class='add'>+        } else {</div><div class='add'>+            (void)pthread_spin_unlock(&amp;pool_list-&gt;lock);</div><div class='add'>+            GF_ATOMIC_INC(pt_pool-&gt;parent-&gt;allocs_stdc);</div><div class='add'>+            retval = malloc(1 &lt;&lt; pt_pool-&gt;parent-&gt;power_of_two);</div><div class='add'>+#ifdef DEBUG</div><div class='add'>+            hit = _gf_false;</div><div class='add'>+#endif</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (retval != NULL) {</div><div class='add'>+        retval-&gt;pool = mem_pool;</div><div class='add'>+        retval-&gt;power_of_two = mem_pool-&gt;pool-&gt;power_of_two;</div><div class='add'>+#ifdef DEBUG</div><div class='add'>+        if (hit == _gf_true)</div><div class='add'>+            GF_ATOMIC_INC(mem_pool-&gt;hit);</div><div class='add'>+        else</div><div class='add'>+            GF_ATOMIC_INC(mem_pool-&gt;miss);</div><div class='add'>+#endif</div><div class='add'>+        retval-&gt;magic = GF_MEM_HEADER_MAGIC;</div><div class='add'>+        retval-&gt;pool_list = pool_list;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-void</div><div class='del'>-mem_put (struct mem_pool *pool, void *ptr)</div><div class='add'>+    return retval;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#endif /* GF_DISABLE_MEMPOOL */</div><div class='add'>+</div><div class='add'>+void *</div><div class='add'>+mem_get0(struct mem_pool *mem_pool)</div><div class='ctx'> {</div><div class='del'>-	struct list_head *list = NULL;</div><div class='del'>-</div><div class='del'>-	if (!pool || !ptr) {</div><div class='del'>-		gf_log ("mem-pool", GF_LOG_ERROR, "invalid argument");</div><div class='del'>-		return;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	LOCK (&amp;pool-&gt;lock);</div><div class='del'>-	{</div><div class='del'>-</div><div class='del'>-		switch (__is_member (pool, ptr))</div><div class='del'>-		{</div><div class='del'>-		case 1:</div><div class='del'>-	                list = mem_pool_ptr2chunkhead (ptr);</div><div class='del'>-		        pool-&gt;hot_count--;</div><div class='del'>-			pool-&gt;cold_count++;</div><div class='del'>-			list_add (list, &amp;pool-&gt;list);</div><div class='del'>-			break;</div><div class='del'>-		case -1:</div><div class='del'>-                        /* For some reason, the address given is within</div><div class='del'>-                         * the address range of the mem-pool but does not align</div><div class='del'>-                         * with the expected start of a chunk that includes</div><div class='del'>-                         * the list headers also. Sounds like a problem in</div><div class='del'>-                         * layers of clouds up above us. ;)</div><div class='del'>-                         */</div><div class='del'>-			abort ();</div><div class='del'>-			break;</div><div class='del'>-		case 0:</div><div class='del'>-                        /* The address is outside the range of the mem-pool. We</div><div class='del'>-                         * assume here that this address was allocated at a</div><div class='del'>-                         * point when the mem-pool was out of chunks in mem_get</div><div class='del'>-                         * or the programmer has made a mistake by calling the</div><div class='del'>-                         * wrong de-allocation interface. We do</div><div class='del'>-                         * not have enough info to distinguish between the two</div><div class='del'>-                         * situations.</div><div class='del'>-                         */</div><div class='del'>-			FREE (ptr);</div><div class='del'>-			break;</div><div class='del'>-		default:</div><div class='del'>-			/* log error */</div><div class='del'>-			break;</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='del'>-	UNLOCK (&amp;pool-&gt;lock);</div><div class='add'>+    void *ptr = mem_get(mem_pool);</div><div class='add'>+    if (ptr) {</div><div class='add'>+#if defined(GF_DISABLE_MEMPOOL)</div><div class='add'>+        memset(ptr, 0, mem_pool-&gt;sizeof_type);</div><div class='add'>+#else</div><div class='add'>+        memset(ptr, 0, AVAILABLE_SIZE(mem_pool-&gt;pool-&gt;power_of_two));</div><div class='add'>+#endif</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return ptr;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+void *</div><div class='add'>+mem_get(struct mem_pool *mem_pool)</div><div class='add'>+{</div><div class='add'>+    if (!mem_pool) {</div><div class='add'>+        gf_msg_callingfn("mem-pool", GF_LOG_ERROR, EINVAL, LG_MSG_INVALID_ARG,</div><div class='add'>+                         "invalid argument");</div><div class='add'>+        return NULL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+#if defined(GF_DISABLE_MEMPOOL)</div><div class='add'>+    return GF_MALLOC(mem_pool-&gt;sizeof_type, gf_common_mt_mem_pool);</div><div class='add'>+#else</div><div class='add'>+    pooled_obj_hdr_t *retval = mem_get_from_pool(mem_pool);</div><div class='add'>+    if (!retval) {</div><div class='add'>+        return NULL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    GF_ATOMIC_INC(mem_pool-&gt;active);</div><div class='add'>+</div><div class='add'>+    return retval + 1;</div><div class='add'>+#endif /* GF_DISABLE_MEMPOOL */</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> void</div><div class='del'>-mem_pool_destroy (struct mem_pool *pool)</div><div class='add'>+mem_put(void *ptr)</div><div class='ctx'> {</div><div class='del'>-        if (!pool)</div><div class='del'>-                return;</div><div class='add'>+#if defined(GF_DISABLE_MEMPOOL)</div><div class='add'>+    GF_FREE(ptr);</div><div class='add'>+#else</div><div class='add'>+    pooled_obj_hdr_t *hdr;</div><div class='add'>+    per_thread_pool_list_t *pool_list;</div><div class='add'>+    per_thread_pool_t *pt_pool;</div><div class='add'>+</div><div class='add'>+    if (!ptr) {</div><div class='add'>+        gf_msg_callingfn("mem-pool", GF_LOG_ERROR, EINVAL, LG_MSG_INVALID_ARG,</div><div class='add'>+                         "invalid argument");</div><div class='add'>+        return;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        LOCK_DESTROY (&amp;pool-&gt;lock);</div><div class='del'>-        GF_FREE (pool-&gt;pool);</div><div class='del'>-        GF_FREE (pool);</div><div class='add'>+    hdr = ((pooled_obj_hdr_t *)ptr) - 1;</div><div class='add'>+    if (hdr-&gt;magic != GF_MEM_HEADER_MAGIC) {</div><div class='add'>+        /* Not one of ours; don't touch it. */</div><div class='add'>+        return;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='add'>+    if (!hdr-&gt;pool_list) {</div><div class='add'>+        gf_msg_callingfn("mem-pool", GF_LOG_CRITICAL, EINVAL,</div><div class='add'>+                         LG_MSG_INVALID_ARG,</div><div class='add'>+                         "invalid argument hdr-&gt;pool_list NULL");</div><div class='ctx'>         return;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    pool_list = hdr-&gt;pool_list;</div><div class='add'>+    pt_pool = &amp;pool_list-&gt;pools[hdr-&gt;power_of_two - POOL_SMALLEST];</div><div class='add'>+</div><div class='add'>+    if (hdr-&gt;pool)</div><div class='add'>+        GF_ATOMIC_DEC(hdr-&gt;pool-&gt;active);</div><div class='add'>+</div><div class='add'>+    hdr-&gt;magic = GF_MEM_INVALID_MAGIC;</div><div class='add'>+</div><div class='add'>+    (void)pthread_spin_lock(&amp;pool_list-&gt;lock);</div><div class='add'>+    if (!pool_list-&gt;poison) {</div><div class='add'>+        hdr-&gt;next = pt_pool-&gt;hot_list;</div><div class='add'>+        pt_pool-&gt;hot_list = hdr;</div><div class='add'>+        (void)pthread_spin_unlock(&amp;pool_list-&gt;lock);</div><div class='add'>+        GF_ATOMIC_INC(pt_pool-&gt;parent-&gt;frees_to_list);</div><div class='add'>+    } else {</div><div class='add'>+        /* If the owner thread of this element has terminated, we simply</div><div class='add'>+         * release its memory. */</div><div class='add'>+        (void)pthread_spin_unlock(&amp;pool_list-&gt;lock);</div><div class='add'>+        free(hdr);</div><div class='add'>+    }</div><div class='add'>+#endif /* GF_DISABLE_MEMPOOL */</div><div class='ctx'> }</div><div class='head'>diff --git a/libglusterfs/src/mem-pool.h b/libglusterfs/src/mem-pool.h<br/>deleted file mode 100644<br/>index 0b467bb2cdb..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/libglusterfs/src/mem-pool.h?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/mem-pool.h</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,124 +0,0 @@</div><div class='del'>-/*</div><div class='del'>-   Copyright (c) 2008-2009 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='del'>-   This file is part of GlusterFS.</div><div class='del'>-</div><div class='del'>-   GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-   it under the terms of the GNU General Public License as published</div><div class='del'>-   by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-   or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-   GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-   WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-   General Public License for more details.</div><div class='del'>-</div><div class='del'>-   You should have received a copy of the GNU General Public License</div><div class='del'>-   along with this program.  If not, see</div><div class='del'>-   &lt;http://www.gnu.org/licenses/&gt;.</div><div class='del'>-*/</div><div class='del'>-</div><div class='del'>-#ifndef _MEM_POOL_H_</div><div class='del'>-#define _MEM_POOL_H_</div><div class='del'>-</div><div class='del'>-#include "list.h"</div><div class='del'>-#include "locking.h"</div><div class='del'>-#include "mem-types.h"</div><div class='del'>-#include &lt;stdlib.h&gt;</div><div class='del'>-#include &lt;inttypes.h&gt;</div><div class='del'>-#include &lt;string.h&gt;</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-#define MALLOC(size) malloc(size)</div><div class='del'>-#define CALLOC(cnt,size) calloc(cnt,size)</div><div class='del'>-</div><div class='del'>-#define FREE(ptr)				\</div><div class='del'>-	if (ptr != NULL) {			\</div><div class='del'>-		free ((void *)ptr);		\</div><div class='del'>-		ptr = (void *)0xeeeeeeee;	\</div><div class='del'>-	}                      </div><div class='del'>-</div><div class='del'>-struct mem_acct {</div><div class='del'>-        uint32_t            num_types;</div><div class='del'>-        struct mem_acct_rec     *rec;</div><div class='del'>-};</div><div class='del'>-</div><div class='del'>-struct mem_acct_rec {</div><div class='del'>-        size_t          size;</div><div class='del'>-        size_t          max_size;</div><div class='del'>-        uint32_t        num_allocs;</div><div class='del'>-        uint32_t        max_num_allocs;</div><div class='del'>-        gf_lock_t       lock;</div><div class='del'>-};</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-void *</div><div class='del'>-__gf_calloc (size_t cnt, size_t size, uint32_t type);</div><div class='del'>-</div><div class='del'>-void *</div><div class='del'>-__gf_malloc (size_t size, uint32_t type);</div><div class='del'>-</div><div class='del'>-void *</div><div class='del'>-__gf_realloc (void *ptr, size_t size);</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-gf_asprintf (char **string_ptr, const char *format, ...);</div><div class='del'>-</div><div class='del'>-#define GF_CALLOC(nmemb, size, type) __gf_calloc (nmemb, size, type)</div><div class='del'>-</div><div class='del'>-#define GF_MALLOC(size, type)  __gf_malloc (size, type)</div><div class='del'>-</div><div class='del'>-#define GF_REALLOC(ptr, size)  __gf_realloc (ptr, size)</div><div class='del'>-</div><div class='del'>-void </div><div class='del'>-__gf_free (void *ptr);</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-#define GF_FREE(free_ptr) __gf_free (free_ptr);</div><div class='del'>-</div><div class='del'>-static inline</div><div class='del'>-char * gf_strdup (const char *src)</div><div class='del'>-{</div><div class='del'>-</div><div class='del'>-        char    *dup_str = NULL;</div><div class='del'>-        size_t  len = 0;</div><div class='del'>-</div><div class='del'>-        len = strlen (src) + 1;</div><div class='del'>-</div><div class='del'>-        dup_str = GF_CALLOC(1, len, gf_common_mt_strdup);</div><div class='del'>-</div><div class='del'>-        if (!dup_str)</div><div class='del'>-                return NULL;</div><div class='del'>-</div><div class='del'>-        memcpy (dup_str, src, len);</div><div class='del'>-</div><div class='del'>-        return dup_str;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-struct mem_pool {</div><div class='del'>-	struct list_head  list;</div><div class='del'>-	int               hot_count;</div><div class='del'>-	int               cold_count;</div><div class='del'>-	gf_lock_t         lock;</div><div class='del'>-	unsigned long     padded_sizeof_type;</div><div class='del'>-	void             *pool;</div><div class='del'>-	void             *pool_end;</div><div class='del'>-        int               real_sizeof_type;</div><div class='del'>-};</div><div class='del'>-</div><div class='del'>-struct mem_pool *</div><div class='del'>-mem_pool_new_fn (unsigned long sizeof_type, unsigned long count);</div><div class='del'>-</div><div class='del'>-#define mem_pool_new(type,count) mem_pool_new_fn (sizeof(type), count)</div><div class='del'>-</div><div class='del'>-void mem_put (struct mem_pool *pool, void *ptr);</div><div class='del'>-void *mem_get (struct mem_pool *pool);</div><div class='del'>-void *mem_get0 (struct mem_pool *pool);</div><div class='del'>-</div><div class='del'>-void mem_pool_destroy (struct mem_pool *pool);</div><div class='del'>-</div><div class='del'>-int gf_mem_acct_is_enabled ();</div><div class='del'>-void gf_mem_acct_enable_set ();</div><div class='del'>-</div><div class='del'>-#endif /* _MEM_POOL_H */</div><div class='head'>diff --git a/libglusterfs/src/mem-types.h b/libglusterfs/src/mem-types.h<br/>deleted file mode 100644<br/>index ace869d708a..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/libglusterfs/src/mem-types.h?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/mem-types.h</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,101 +0,0 @@</div><div class='del'>-/*</div><div class='del'>-   Copyright (c) 2006-2009 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='del'>-   This file is part of GlusterFS.</div><div class='del'>-</div><div class='del'>-   GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-   it under the terms of the GNU General Public License as published</div><div class='del'>-   by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-   or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-   GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-   WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-   General Public License for more details.</div><div class='del'>-</div><div class='del'>-   You should have received a copy of the GNU General Public License</div><div class='del'>-   along with this program.  If not, see</div><div class='del'>-   &lt;http://www.gnu.org/licenses/&gt;.</div><div class='del'>-*/</div><div class='del'>-</div><div class='del'>-#ifndef __MEM_TYPES_H__</div><div class='del'>-#define __MEM_TYPES_H__</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-enum gf_common_mem_types_ {</div><div class='del'>-        gf_common_mt_call_stub_t        =       0,</div><div class='del'>-        gf_common_mt_dnscache6          =       1,</div><div class='del'>-        gf_common_mt_data_pair_t        =       2,</div><div class='del'>-        gf_common_mt_data_t             =       3,</div><div class='del'>-        gf_common_mt_dict_t             =       4,</div><div class='del'>-        gf_common_mt_event_pool         =       5,</div><div class='del'>-        gf_common_mt_reg                =       6,</div><div class='del'>-        gf_common_mt_pollfd             =       7,</div><div class='del'>-        gf_common_mt_epoll_event        =       8,</div><div class='del'>-        gf_common_mt_fdentry_t          =       9,</div><div class='del'>-        gf_common_mt_fdtable_t          =       10,</div><div class='del'>-        gf_common_mt_fd_t               =       11,</div><div class='del'>-        gf_common_mt_fd_ctx             =       12,</div><div class='del'>-        gf_common_mt_gf_dirent_t        =       13,</div><div class='del'>-        gf_common_mt_glusterfs_ctx_t    =       14,</div><div class='del'>-        gf_common_mt_dentry_t           =       15,</div><div class='del'>-        gf_common_mt_inode_t            =       16,</div><div class='del'>-        gf_common_mt_inode_ctx          =       17,</div><div class='del'>-        gf_common_mt_list_head          =       18,</div><div class='del'>-        gf_common_mt_inode_table_t      =       19,</div><div class='del'>-        gf_common_mt_xlator_t           =       20,</div><div class='del'>-        gf_common_mt_xlator_list_t      =       21,</div><div class='del'>-        gf_common_mt_log_msg            =       22,</div><div class='del'>-        gf_common_mt_client_log         =       23,</div><div class='del'>-        gf_common_mt_volume_opt_list_t  =       24,</div><div class='del'>-        gf_common_mt_gf_hdr_common_t    =       25,</div><div class='del'>-        gf_common_mt_call_frame_t       =       26,</div><div class='del'>-        gf_common_mt_call_stack_t       =       27,</div><div class='del'>-        gf_common_mt_gf_timer_t         =       28,</div><div class='del'>-        gf_common_mt_gf_timer_registry_t=       29,</div><div class='del'>-        gf_common_mt_transport          =       30,</div><div class='del'>-        gf_common_mt_transport_msg      =       31,</div><div class='del'>-        gf_common_mt_auth_handle_t      =       32,</div><div class='del'>-        gf_common_mt_iobuf              =       33,</div><div class='del'>-        gf_common_mt_iobuf_arena        =       34,</div><div class='del'>-        gf_common_mt_iobref             =       35,</div><div class='del'>-        gf_common_mt_iobuf_pool         =       36,</div><div class='del'>-        gf_common_mt_iovec              =       37,</div><div class='del'>-        gf_common_mt_memdup             =       38,</div><div class='del'>-        gf_common_mt_asprintf           =       39,</div><div class='del'>-        gf_common_mt_strdup             =       40,</div><div class='del'>-        gf_common_mt_socket_private_t   =       41,</div><div class='del'>-        gf_common_mt_ioq                =       42,</div><div class='del'>-        gf_common_mt_transport_t        =       43,</div><div class='del'>-        gf_common_mt_socket_local_t     =       44,</div><div class='del'>-        gf_common_mt_char               =       45,</div><div class='del'>-        gf_common_mt_rbthash_table_t    =       46,</div><div class='del'>-        gf_common_mt_rbthash_bucket     =       47,</div><div class='del'>-        gf_common_mt_mem_pool           =       48,</div><div class='del'>-        gf_common_mt_long               =       49,</div><div class='del'>-        gf_common_mt_rpcsvc_auth_list   =       50,</div><div class='del'>-        gf_common_mt_rpcsvc_t           =       51,</div><div class='del'>-        gf_common_mt_rpcsvc_conn_t      =       52,</div><div class='del'>-        gf_common_mt_rpcsvc_program_t   =       53,</div><div class='del'>-        gf_common_mt_rpcsvc_listener_t  =       54,</div><div class='del'>-        gf_common_mt_rpcsvc_wrapper_t   =       55,</div><div class='del'>-        gf_common_mt_rpcsvc_stage_t     =       56,</div><div class='del'>-        gf_common_mt_rpcclnt_t          =       57,</div><div class='del'>-        gf_common_mt_rpcclnt_savedframe_t =     58,</div><div class='del'>-        gf_common_mt_rpc_trans_t        =       59,</div><div class='del'>-        gf_common_mt_rpc_trans_pollin_t =       60,</div><div class='del'>-        gf_common_mt_rpc_trans_handover_t =     61,</div><div class='del'>-        gf_common_mt_rpc_trans_reqinfo_t=       62,</div><div class='del'>-        gf_common_mt_rpc_trans_rsp_t    =       63,</div><div class='del'>-        gf_common_mt_glusterfs_graph_t  =       64,</div><div class='del'>-        gf_common_mt_rdma_private_t     =       65,</div><div class='del'>-        gf_common_mt_rdma_ioq_t         =       66,</div><div class='del'>-        gf_common_mt_rpc_transport_t    =       67,</div><div class='del'>-        gf_common_mt_rdma_local_t       =       68,</div><div class='del'>-        gf_common_mt_rdma_post_t        =       69,</div><div class='del'>-        gf_common_mt_qpent              =       70,</div><div class='del'>-        gf_common_mt_rdma_device_t      =       71,</div><div class='del'>-        gf_common_mt_rdma_context_t     =       72,</div><div class='del'>-        gf_common_mt_sge                =       73,</div><div class='del'>-        gf_common_mt_end                =       74</div><div class='del'>-};</div><div class='del'>-#endif</div><div class='head'>diff --git a/libglusterfs/src/monitoring.c b/libglusterfs/src/monitoring.c<br/>new file mode 100644<br/>index 00000000000..fbb68dc8622<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/libglusterfs/src/monitoring.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>libglusterfs/src/monitoring.c</a></div><div class='hunk'>@@ -0,0 +1,282 @@</div><div class='add'>+/*</div><div class='add'>+  Copyright (c) 2017 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#include "glusterfs/monitoring.h"</div><div class='add'>+#include "glusterfs/xlator.h"</div><div class='add'>+#include "glusterfs/syscall.h"</div><div class='add'>+</div><div class='add'>+#include &lt;stdlib.h&gt;</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+dump_mem_acct_details(xlator_t *xl, int fd)</div><div class='add'>+{</div><div class='add'>+    struct mem_acct_rec *mem_rec;</div><div class='add'>+    int i = 0;</div><div class='add'>+</div><div class='add'>+    if (!xl || !xl-&gt;mem_acct || (xl-&gt;ctx-&gt;active != xl-&gt;graph))</div><div class='add'>+        return;</div><div class='add'>+</div><div class='add'>+    dprintf(fd, "# %s.%s.total.num_types %d\n", xl-&gt;type, xl-&gt;name,</div><div class='add'>+            xl-&gt;mem_acct-&gt;num_types);</div><div class='add'>+</div><div class='add'>+    dprintf(fd,</div><div class='add'>+            "# type, in-use-size, in-use-units, max-size, "</div><div class='add'>+            "max-units, total-allocs\n");</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; xl-&gt;mem_acct-&gt;num_types; i++) {</div><div class='add'>+        mem_rec = &amp;xl-&gt;mem_acct-&gt;rec[i];</div><div class='add'>+        if (mem_rec-&gt;num_allocs == 0)</div><div class='add'>+            continue;</div><div class='add'>+        dprintf(fd, "# %s, %" PRIu64 ", %u, %" PRIu64 ", %u, %" PRIu64 "\n",</div><div class='add'>+                mem_rec-&gt;typestr, mem_rec-&gt;size, mem_rec-&gt;num_allocs,</div><div class='add'>+                mem_rec-&gt;max_size, mem_rec-&gt;max_num_allocs,</div><div class='add'>+                mem_rec-&gt;total_allocs);</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+dump_global_memory_accounting(int fd)</div><div class='add'>+{</div><div class='add'>+#if MEMORY_ACCOUNTING_STATS</div><div class='add'>+    int i = 0;</div><div class='add'>+    uint64_t count = 0;</div><div class='add'>+</div><div class='add'>+    uint64_t tcalloc = GF_ATOMIC_GET(gf_memory_stat_counts.total_calloc);</div><div class='add'>+    uint64_t tmalloc = GF_ATOMIC_GET(gf_memory_stat_counts.total_malloc);</div><div class='add'>+    uint64_t tfree = GF_ATOMIC_GET(gf_memory_stat_counts.total_free);</div><div class='add'>+</div><div class='add'>+    dprintf(fd, "memory.total.calloc %lu\n", tcalloc);</div><div class='add'>+    dprintf(fd, "memory.total.malloc %lu\n", tmalloc);</div><div class='add'>+    dprintf(fd, "memory.total.realloc %lu\n",</div><div class='add'>+            GF_ATOMIC_GET(gf_memory_stat_counts.total_realloc));</div><div class='add'>+    dprintf(fd, "memory.total.free %lu\n", tfree);</div><div class='add'>+    dprintf(fd, "memory.total.in-use %lu\n", ((tcalloc + tmalloc) - tfree));</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; GF_BLK_MAX_VALUE; i++) {</div><div class='add'>+        count = GF_ATOMIC_GET(gf_memory_stat_counts.blk_size[i]);</div><div class='add'>+        dprintf(fd, "memory.total.blk_size.%s %lu\n",</div><div class='add'>+                gf_mem_stats_blk[i].blk_size_str, count);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    dprintf(fd, "#----\n");</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+    /* This is not a metric to be watched in admin guide,</div><div class='add'>+       but keeping it here till we resolve all leak-issues</div><div class='add'>+       would be great */</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+dump_latency_and_count(xlator_t *xl, int fd)</div><div class='add'>+{</div><div class='add'>+    int32_t index = 0;</div><div class='add'>+    uint64_t fop;</div><div class='add'>+    uint64_t cbk;</div><div class='add'>+    uint64_t count;</div><div class='add'>+</div><div class='add'>+    if (xl-&gt;winds) {</div><div class='add'>+        dprintf(fd, "%s.total.pending-winds.count %" PRIu64 "\n", xl-&gt;name,</div><div class='add'>+                xl-&gt;winds);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Need 'fuse' data, and don't need all the old graph info */</div><div class='add'>+    if ((xl != xl-&gt;ctx-&gt;master) &amp;&amp; (xl-&gt;ctx-&gt;active != xl-&gt;graph))</div><div class='add'>+        return;</div><div class='add'>+</div><div class='add'>+    count = GF_ATOMIC_GET(xl-&gt;stats.total.count);</div><div class='add'>+    dprintf(fd, "%s.total.fop-count %" PRIu64 "\n", xl-&gt;name, count);</div><div class='add'>+</div><div class='add'>+    count = GF_ATOMIC_GET(xl-&gt;stats.interval.count);</div><div class='add'>+    dprintf(fd, "%s.interval.fop-count %" PRIu64 "\n", xl-&gt;name, count);</div><div class='add'>+    GF_ATOMIC_INIT(xl-&gt;stats.interval.count, 0);</div><div class='add'>+</div><div class='add'>+    for (index = 0; index &lt; GF_FOP_MAXVALUE; index++) {</div><div class='add'>+        fop = GF_ATOMIC_GET(xl-&gt;stats.total.metrics[index].fop);</div><div class='add'>+        if (fop) {</div><div class='add'>+            dprintf(fd, "%s.total.%s.count %" PRIu64 "\n", xl-&gt;name,</div><div class='add'>+                    gf_fop_list[index], fop);</div><div class='add'>+        }</div><div class='add'>+        fop = GF_ATOMIC_GET(xl-&gt;stats.interval.metrics[index].fop);</div><div class='add'>+        if (fop) {</div><div class='add'>+            dprintf(fd, "%s.interval.%s.count %" PRIu64 "\n", xl-&gt;name,</div><div class='add'>+                    gf_fop_list[index], fop);</div><div class='add'>+        }</div><div class='add'>+        cbk = GF_ATOMIC_GET(xl-&gt;stats.interval.metrics[index].cbk);</div><div class='add'>+        if (cbk) {</div><div class='add'>+            dprintf(fd, "%s.interval.%s.fail_count %" PRIu64 "\n", xl-&gt;name,</div><div class='add'>+                    gf_fop_list[index], cbk);</div><div class='add'>+        }</div><div class='add'>+        if (xl-&gt;stats.interval.latencies[index].count != 0) {</div><div class='add'>+            dprintf(fd, "%s.interval.%s.latency %lf\n", xl-&gt;name,</div><div class='add'>+                    gf_fop_list[index],</div><div class='add'>+                    (((double)xl-&gt;stats.interval.latencies[index].total) /</div><div class='add'>+                     xl-&gt;stats.interval.latencies[index].count));</div><div class='add'>+            dprintf(fd, "%s.interval.%s.max %" PRIu64 "\n", xl-&gt;name,</div><div class='add'>+                    gf_fop_list[index],</div><div class='add'>+                    xl-&gt;stats.interval.latencies[index].max);</div><div class='add'>+            dprintf(fd, "%s.interval.%s.min %" PRIu64 "\n", xl-&gt;name,</div><div class='add'>+                    gf_fop_list[index],</div><div class='add'>+                    xl-&gt;stats.interval.latencies[index].min);</div><div class='add'>+        }</div><div class='add'>+        GF_ATOMIC_INIT(xl-&gt;stats.interval.metrics[index].cbk, 0);</div><div class='add'>+        GF_ATOMIC_INIT(xl-&gt;stats.interval.metrics[index].fop, 0);</div><div class='add'>+    }</div><div class='add'>+    memset(xl-&gt;stats.interval.latencies, 0,</div><div class='add'>+           sizeof(xl-&gt;stats.interval.latencies));</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static inline void</div><div class='add'>+dump_call_stack_details(glusterfs_ctx_t *ctx, int fd)</div><div class='add'>+{</div><div class='add'>+    dprintf(fd, "total.stack.count %" PRIu64 "\n",</div><div class='add'>+            GF_ATOMIC_GET(ctx-&gt;pool-&gt;total_count));</div><div class='add'>+    dprintf(fd, "total.stack.in-flight %" PRIu64 "\n", ctx-&gt;pool-&gt;cnt);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static inline void</div><div class='add'>+dump_dict_details(glusterfs_ctx_t *ctx, int fd)</div><div class='add'>+{</div><div class='add'>+    uint64_t total_dicts = 0;</div><div class='add'>+    uint64_t total_pairs = 0;</div><div class='add'>+</div><div class='add'>+    total_dicts = GF_ATOMIC_GET(ctx-&gt;stats.total_dicts_used);</div><div class='add'>+    total_pairs = GF_ATOMIC_GET(ctx-&gt;stats.total_pairs_used);</div><div class='add'>+</div><div class='add'>+    dprintf(fd, "total.dict.max-pairs-per %" PRIu64 "\n",</div><div class='add'>+            GF_ATOMIC_GET(ctx-&gt;stats.max_dict_pairs));</div><div class='add'>+    dprintf(fd, "total.dict.pairs-used %" PRIu64 "\n", total_pairs);</div><div class='add'>+    dprintf(fd, "total.dict.used %" PRIu64 "\n", total_dicts);</div><div class='add'>+    dprintf(fd, "total.dict.average-pairs %" PRIu64 "\n",</div><div class='add'>+            (total_pairs / total_dicts));</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+dump_inode_stats(glusterfs_ctx_t *ctx, int fd)</div><div class='add'>+{</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+dump_global_metrics(glusterfs_ctx_t *ctx, int fd)</div><div class='add'>+{</div><div class='add'>+    struct timeval tv;</div><div class='add'>+    time_t nowtime;</div><div class='add'>+    struct tm *nowtm;</div><div class='add'>+    char tmbuf[64] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    gettimeofday(&amp;tv, NULL);</div><div class='add'>+    nowtime = tv.tv_sec;</div><div class='add'>+    nowtm = localtime(&amp;nowtime);</div><div class='add'>+    strftime(tmbuf, sizeof tmbuf, "%Y-%m-%d %H:%M:%S", nowtm);</div><div class='add'>+</div><div class='add'>+    /* Let every file have information on which process dumped info */</div><div class='add'>+    dprintf(fd, "## %s\n", ctx-&gt;cmdlinestr);</div><div class='add'>+    dprintf(fd, "### %s\n", tmbuf);</div><div class='add'>+    dprintf(fd, "### BrickName: %s\n", ctx-&gt;cmd_args.brick_name);</div><div class='add'>+    dprintf(fd, "### MountName: %s\n", ctx-&gt;cmd_args.mount_point);</div><div class='add'>+    dprintf(fd, "### VolumeName: %s\n", ctx-&gt;cmd_args.volume_name);</div><div class='add'>+</div><div class='add'>+    /* Dump memory accounting */</div><div class='add'>+    dump_global_memory_accounting(fd);</div><div class='add'>+    dprintf(fd, "# -----\n");</div><div class='add'>+</div><div class='add'>+    dump_call_stack_details(ctx, fd);</div><div class='add'>+    dump_dict_details(ctx, fd);</div><div class='add'>+    dprintf(fd, "# -----\n");</div><div class='add'>+</div><div class='add'>+    dump_inode_stats(ctx, fd);</div><div class='add'>+    dprintf(fd, "# -----\n");</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+dump_xl_metrics(glusterfs_ctx_t *ctx, int fd)</div><div class='add'>+{</div><div class='add'>+    xlator_t *xl;</div><div class='add'>+</div><div class='add'>+    xl = ctx-&gt;active-&gt;top;</div><div class='add'>+</div><div class='add'>+    while (xl) {</div><div class='add'>+        dump_latency_and_count(xl, fd);</div><div class='add'>+        dump_mem_acct_details(xl, fd);</div><div class='add'>+        if (xl-&gt;dump_metrics)</div><div class='add'>+            xl-&gt;dump_metrics(xl, fd);</div><div class='add'>+        xl = xl-&gt;next;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (ctx-&gt;master) {</div><div class='add'>+        xl = ctx-&gt;master;</div><div class='add'>+</div><div class='add'>+        dump_latency_and_count(xl, fd);</div><div class='add'>+        dump_mem_acct_details(xl, fd);</div><div class='add'>+        if (xl-&gt;dump_metrics)</div><div class='add'>+            xl-&gt;dump_metrics(xl, fd);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+char *</div><div class='add'>+gf_monitor_metrics(glusterfs_ctx_t *ctx)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int fd = 0;</div><div class='add'>+    char *filepath = NULL, *dumppath = NULL;</div><div class='add'>+</div><div class='add'>+    gf_msg_trace("monitoring", 0, "received monitoring request (sig:USR2)");</div><div class='add'>+</div><div class='add'>+    dumppath = ctx-&gt;config.metrics_dumppath;</div><div class='add'>+    if (dumppath == NULL) {</div><div class='add'>+        dumppath = GLUSTER_METRICS_DIR;</div><div class='add'>+    }</div><div class='add'>+    ret = mkdir_p(dumppath, 0755, true);</div><div class='add'>+    if (ret) {</div><div class='add'>+        /* EEXIST is handled in mkdir_p() itself */</div><div class='add'>+        gf_msg("monitoring", GF_LOG_ERROR, 0, LG_MSG_STRDUP_ERROR,</div><div class='add'>+               "failed to create metrics dir %s (%s)", dumppath,</div><div class='add'>+               strerror(errno));</div><div class='add'>+        return NULL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = gf_asprintf(&amp;filepath, "%s/gmetrics.XXXXXX", dumppath);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        return NULL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* coverity[secure_temp] mkstemp uses 0600 as the mode and is safe */</div><div class='add'>+    fd = mkstemp(filepath);</div><div class='add'>+    if (fd &lt; 0) {</div><div class='add'>+        gf_msg("monitoring", GF_LOG_ERROR, 0, LG_MSG_STRDUP_ERROR,</div><div class='add'>+               "failed to open tmp file %s (%s)", filepath, strerror(errno));</div><div class='add'>+        GF_FREE(filepath);</div><div class='add'>+        return NULL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    dump_global_metrics(ctx, fd);</div><div class='add'>+</div><div class='add'>+    dump_xl_metrics(ctx, fd);</div><div class='add'>+</div><div class='add'>+    /* This below line is used just to capture any errors with dprintf() */</div><div class='add'>+    ret = dprintf(fd, "\n# End of metrics\n");</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        gf_msg("monitoring", GF_LOG_WARNING, 0, LG_MSG_STRDUP_ERROR,</div><div class='add'>+               "dprintf() failed: %s", strerror(errno));</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = sys_fsync(fd);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        gf_msg("monitoring", GF_LOG_WARNING, 0, LG_MSG_STRDUP_ERROR,</div><div class='add'>+               "fsync() failed: %s", strerror(errno));</div><div class='add'>+    }</div><div class='add'>+    sys_close(fd);</div><div class='add'>+</div><div class='add'>+    /* Figure this out, not happy with returning this string */</div><div class='add'>+    return filepath;</div><div class='add'>+}</div><div class='head'>diff --git a/libglusterfs/src/options.c b/libglusterfs/src/options.c<br/>new file mode 100644<br/>index 00000000000..f6b5aa0ea23<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/libglusterfs/src/options.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>libglusterfs/src/options.c</a></div><div class='hunk'>@@ -0,0 +1,1249 @@</div><div class='add'>+/*</div><div class='add'>+  Copyright (c) 2008-2012 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#include &lt;fnmatch.h&gt;</div><div class='add'>+</div><div class='add'>+#include "glusterfs/xlator.h"</div><div class='add'>+#include "glusterfs/defaults.h"</div><div class='add'>+#include "glusterfs/libglusterfs-messages.h"</div><div class='add'>+</div><div class='add'>+#define GF_OPTION_LIST_EMPTY(_opt) (_opt-&gt;value[0] == NULL)</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+xlator_option_validate_path(xlator_t *xl, const char *key, const char *value,</div><div class='add'>+                            volume_option_t *opt, char **op_errstr)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    char errstr[256];</div><div class='add'>+</div><div class='add'>+    if (strstr(value, "../")) {</div><div class='add'>+        snprintf(errstr, 256, "invalid path given '%s'", value);</div><div class='add'>+        gf_smsg(xl-&gt;name, GF_LOG_ERROR, 0, LG_MSG_INVALID_ENTRY, "error=%s",</div><div class='add'>+                errstr, NULL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Make sure the given path is valid */</div><div class='add'>+    if (value[0] != '/') {</div><div class='add'>+        snprintf(errstr, 256,</div><div class='add'>+                 "option %s %s: '%s' is not an "</div><div class='add'>+                 "absolute path name",</div><div class='add'>+                 key, value, value);</div><div class='add'>+        gf_smsg(xl-&gt;name, GF_LOG_ERROR, 0, LG_MSG_INVALID_ENTRY, "error=%s",</div><div class='add'>+                errstr, NULL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+out:</div><div class='add'>+    if (ret &amp;&amp; op_errstr)</div><div class='add'>+        *op_errstr = gf_strdup(errstr);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+xlator_option_validate_int(xlator_t *xl, const char *key, const char *value,</div><div class='add'>+                           volume_option_t *opt, char **op_errstr)</div><div class='add'>+{</div><div class='add'>+    long long inputll = 0;</div><div class='add'>+    unsigned long long uinputll = 0;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    char errstr[256];</div><div class='add'>+</div><div class='add'>+    /* Check the range */</div><div class='add'>+    if (gf_string2longlong(value, &amp;inputll) != 0) {</div><div class='add'>+        snprintf(errstr, 256, "invalid number format \"%s\" in option \"%s\"",</div><div class='add'>+                 value, key);</div><div class='add'>+        gf_smsg(xl-&gt;name, GF_LOG_ERROR, 0, LG_MSG_INVALID_ENTRY, "error=%s",</div><div class='add'>+                errstr, NULL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Handle '-0' */</div><div class='add'>+    if ((inputll == 0) &amp;&amp; (gf_string2ulonglong(value, &amp;uinputll) != 0)) {</div><div class='add'>+        snprintf(errstr, 256, "invalid number format \"%s\" in option \"%s\"",</div><div class='add'>+                 value, key);</div><div class='add'>+        gf_smsg(xl-&gt;name, GF_LOG_ERROR, 0, LG_MSG_INVALID_ENTRY, "error=%s",</div><div class='add'>+                errstr, NULL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if ((opt-&gt;min == 0) &amp;&amp; (opt-&gt;max == 0) &amp;&amp;</div><div class='add'>+        (opt-&gt;validate == GF_OPT_VALIDATE_BOTH)) {</div><div class='add'>+        gf_msg_trace(xl-&gt;name, 0,</div><div class='add'>+                     "no range check required for "</div><div class='add'>+                     "'option %s %s'",</div><div class='add'>+                     key, value);</div><div class='add'>+        ret = 0;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (opt-&gt;validate == GF_OPT_VALIDATE_MIN) {</div><div class='add'>+        if (inputll &lt; opt-&gt;min) {</div><div class='add'>+            snprintf(errstr, 256,</div><div class='add'>+                     "'%lld' in 'option %s %s' is smaller than "</div><div class='add'>+                     "minimum value '%.0f'",</div><div class='add'>+                     inputll, key, value, opt-&gt;min);</div><div class='add'>+            gf_smsg(xl-&gt;name, GF_LOG_ERROR, 0, LG_MSG_INVALID_ENTRY, "error=%s",</div><div class='add'>+                    errstr, NULL);</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    } else if (opt-&gt;validate == GF_OPT_VALIDATE_MAX) {</div><div class='add'>+        if (inputll &gt; opt-&gt;max) {</div><div class='add'>+            snprintf(errstr, 256,</div><div class='add'>+                     "'%lld' in 'option %s %s' is greater than "</div><div class='add'>+                     "maximum value '%.0f'",</div><div class='add'>+                     inputll, key, value, opt-&gt;max);</div><div class='add'>+            gf_smsg(xl-&gt;name, GF_LOG_ERROR, 0, LG_MSG_INVALID_ENTRY, "error=%s",</div><div class='add'>+                    errstr, NULL);</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    } else if ((inputll &lt; opt-&gt;min) || (inputll &gt; opt-&gt;max)) {</div><div class='add'>+        snprintf(errstr, 256,</div><div class='add'>+                 "'%lld' in 'option %s %s' is out of range "</div><div class='add'>+                 "[%.0f - %.0f]",</div><div class='add'>+                 inputll, key, value, opt-&gt;min, opt-&gt;max);</div><div class='add'>+        gf_smsg(xl-&gt;name, GF_LOG_ERROR, 0, LG_MSG_OUT_OF_RANGE, "error=%s",</div><div class='add'>+                errstr, NULL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+out:</div><div class='add'>+    if (ret &amp;&amp; op_errstr)</div><div class='add'>+        *op_errstr = gf_strdup(errstr);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+xlator_option_validate_sizet(xlator_t *xl, const char *key, const char *value,</div><div class='add'>+                             volume_option_t *opt, char **op_errstr)</div><div class='add'>+{</div><div class='add'>+    uint64_t size = 0;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    char errstr[256];</div><div class='add'>+</div><div class='add'>+    /* Check the range */</div><div class='add'>+    if (gf_string2bytesize_uint64(value, &amp;size) != 0) {</div><div class='add'>+        snprintf(errstr, 256, "invalid number format \"%s\" in option \"%s\"",</div><div class='add'>+                 value, key);</div><div class='add'>+        gf_smsg(xl-&gt;name, GF_LOG_ERROR, 0, LG_MSG_INVALID_ENTRY, "error=%s",</div><div class='add'>+                errstr, NULL);</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if ((opt-&gt;min == 0) &amp;&amp; (opt-&gt;max == 0)) {</div><div class='add'>+        gf_msg_trace(xl-&gt;name, 0,</div><div class='add'>+                     "no range check required for "</div><div class='add'>+                     "'option %s %s'",</div><div class='add'>+                     key, value);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if ((size &lt; opt-&gt;min) || (size &gt; opt-&gt;max)) {</div><div class='add'>+        snprintf(errstr, 256,</div><div class='add'>+                 "'%" PRIu64</div><div class='add'>+                 "' in 'option %s %s' is out of range [%.0f - %.0f]",</div><div class='add'>+                 size, key, value, opt-&gt;min, opt-&gt;max);</div><div class='add'>+        gf_smsg(xl-&gt;name, GF_LOG_ERROR, 0, LG_MSG_OUT_OF_RANGE, "error=%s",</div><div class='add'>+                errstr, NULL);</div><div class='add'>+        ret = -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (ret &amp;&amp; op_errstr)</div><div class='add'>+        *op_errstr = gf_strdup(errstr);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+xlator_option_validate_bool(xlator_t *xl, const char *key, const char *value,</div><div class='add'>+                            volume_option_t *opt, char **op_errstr)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    char errstr[256];</div><div class='add'>+    gf_boolean_t is_valid;</div><div class='add'>+</div><div class='add'>+    /* Check if the value is one of</div><div class='add'>+       '0|1|on|off|no|yes|true|false|enable|disable' */</div><div class='add'>+</div><div class='add'>+    if (gf_string2boolean(value, &amp;is_valid) != 0) {</div><div class='add'>+        snprintf(errstr, 256, "option %s %s: '%s' is not a valid boolean value",</div><div class='add'>+                 key, value, value);</div><div class='add'>+        gf_smsg(xl-&gt;name, GF_LOG_ERROR, 0, LG_MSG_INVALID_ENTRY, "error=%s",</div><div class='add'>+                errstr, NULL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+out:</div><div class='add'>+    if (ret &amp;&amp; op_errstr)</div><div class='add'>+        *op_errstr = gf_strdup(errstr);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+xlator_option_validate_xlator(xlator_t *xl, const char *key, const char *value,</div><div class='add'>+                              volume_option_t *opt, char **op_errstr)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    char errstr[256];</div><div class='add'>+    xlator_t *xlopt = NULL;</div><div class='add'>+</div><div class='add'>+    /* Check if the value is one of the xlators */</div><div class='add'>+    xlopt = xl;</div><div class='add'>+    while (xlopt-&gt;prev)</div><div class='add'>+        xlopt = xlopt-&gt;prev;</div><div class='add'>+</div><div class='add'>+    while (xlopt) {</div><div class='add'>+        if (strcmp(value, xlopt-&gt;name) == 0) {</div><div class='add'>+            ret = 0;</div><div class='add'>+            break;</div><div class='add'>+        }</div><div class='add'>+        xlopt = xlopt-&gt;next;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (!xlopt) {</div><div class='add'>+        snprintf(errstr, 256, "option %s %s: '%s' is not a valid volume name",</div><div class='add'>+                 key, value, value);</div><div class='add'>+        gf_smsg(xl-&gt;name, GF_LOG_ERROR, 0, LG_MSG_INVALID_ENTRY, "error=%s",</div><div class='add'>+                errstr, NULL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+out:</div><div class='add'>+    if (ret &amp;&amp; op_errstr)</div><div class='add'>+        *op_errstr = gf_strdup(errstr);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+set_error_str(char *errstr, size_t len, volume_option_t *opt, const char *key,</div><div class='add'>+              const char *value)</div><div class='add'>+{</div><div class='add'>+    int i = 0;</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    ret = snprintf(errstr, len,</div><div class='add'>+                   "option %s %s: '%s' is not valid "</div><div class='add'>+                   "(possible options are ",</div><div class='add'>+                   key, value, value);</div><div class='add'>+</div><div class='add'>+    for (i = 0; (i &lt; ZR_OPTION_MAX_ARRAY_SIZE) &amp;&amp; opt-&gt;value[i];) {</div><div class='add'>+        ret += snprintf(errstr + ret, len - ret, "%s", opt-&gt;value[i]);</div><div class='add'>+        if (((++i) &lt; ZR_OPTION_MAX_ARRAY_SIZE) &amp;&amp; (opt-&gt;value[i]))</div><div class='add'>+            ret += snprintf(errstr + ret, len - ret, ", ");</div><div class='add'>+        else</div><div class='add'>+            ret += snprintf(errstr + ret, len - ret, ".)");</div><div class='add'>+    }</div><div class='add'>+    return;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+is_all_whitespaces(const char *value)</div><div class='add'>+{</div><div class='add'>+    int i = 0;</div><div class='add'>+</div><div class='add'>+    if (value == NULL)</div><div class='add'>+        return -1;</div><div class='add'>+</div><div class='add'>+    for (i = 0; value[i] != '\0'; i++) {</div><div class='add'>+        if (value[i] == ' ')</div><div class='add'>+            continue;</div><div class='add'>+        else</div><div class='add'>+            return 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+xlator_option_validate_str(xlator_t *xl, const char *key, const char *value,</div><div class='add'>+                           volume_option_t *opt, char **op_errstr)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int i = 0;</div><div class='add'>+</div><div class='add'>+    /* Check if the '*str' is valid */</div><div class='add'>+    if (GF_OPTION_LIST_EMPTY(opt)) {</div><div class='add'>+        ret = 0;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (is_all_whitespaces(value) == 1)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; (i &lt; ZR_OPTION_MAX_ARRAY_SIZE) &amp;&amp; opt-&gt;value[i]; i++) {</div><div class='add'>+#ifdef GF_DARWIN_HOST_OS</div><div class='add'>+        if (fnmatch(opt-&gt;value[i], value, 0) == 0) {</div><div class='add'>+            ret = 0;</div><div class='add'>+            break;</div><div class='add'>+        }</div><div class='add'>+#else</div><div class='add'>+        if (fnmatch(opt-&gt;value[i], value, FNM_EXTMATCH) == 0) {</div><div class='add'>+            ret = 0;</div><div class='add'>+            break;</div><div class='add'>+        }</div><div class='add'>+#endif</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if ((i == ZR_OPTION_MAX_ARRAY_SIZE) || (!opt-&gt;value[i]))</div><div class='add'>+        goto out;</div><div class='add'>+    /* enter here only if</div><div class='add'>+     * 1. reached end of opt-&gt;value array and haven't</div><div class='add'>+     *    validated input</div><div class='add'>+     *                      OR</div><div class='add'>+     * 2. valid input list is less than</div><div class='add'>+     *    ZR_OPTION_MAX_ARRAY_SIZE and input has not</div><div class='add'>+     *    matched all possible input values.</div><div class='add'>+     */</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (ret) {</div><div class='add'>+        char errstr[4096];</div><div class='add'>+        set_error_str(errstr, sizeof(errstr), opt, key, value);</div><div class='add'>+</div><div class='add'>+        gf_smsg(xl-&gt;name, GF_LOG_ERROR, 0, LG_MSG_INVALID_ENTRY, "error=%s",</div><div class='add'>+                errstr, NULL);</div><div class='add'>+        if (op_errstr)</div><div class='add'>+            *op_errstr = gf_strdup(errstr);</div><div class='add'>+    }</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+xlator_option_validate_percent(xlator_t *xl, const char *key, const char *value,</div><div class='add'>+                               volume_option_t *opt, char **op_errstr)</div><div class='add'>+{</div><div class='add'>+    double percent = 0;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    char errstr[256];</div><div class='add'>+</div><div class='add'>+    /* Check if the value is valid percentage */</div><div class='add'>+    if (gf_string2percent(value, &amp;percent) != 0) {</div><div class='add'>+        snprintf(errstr, 256, "invalid percent format \"%s\" in \"option %s\"",</div><div class='add'>+                 value, key);</div><div class='add'>+        gf_smsg(xl-&gt;name, GF_LOG_ERROR, 0, LG_MSG_INVALID_ENTRY, "error=%s",</div><div class='add'>+                errstr, NULL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if ((percent &lt; 0.0) || (percent &gt; 100.0)) {</div><div class='add'>+        snprintf(errstr, 256,</div><div class='add'>+                 "'%lf' in 'option %s %s' is out of range [0 - 100]", percent,</div><div class='add'>+                 key, value);</div><div class='add'>+        gf_smsg(xl-&gt;name, GF_LOG_ERROR, 0, LG_MSG_OUT_OF_RANGE, "error=%s",</div><div class='add'>+                errstr, NULL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+out:</div><div class='add'>+    if (ret &amp;&amp; op_errstr)</div><div class='add'>+        *op_errstr = gf_strdup(errstr);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+xlator_option_validate_fractional_value(const char *value)</div><div class='add'>+{</div><div class='add'>+    const char *s = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    s = strchr(value, '.');</div><div class='add'>+    if (s) {</div><div class='add'>+        for (s = s + 1; *s != '\0'; s++) {</div><div class='add'>+            if (*s != '0') {</div><div class='add'>+                return -1;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+xlator_option_validate_percent_or_sizet(xlator_t *xl, const char *key,</div><div class='add'>+                                        const char *value, volume_option_t *opt,</div><div class='add'>+                                        char **op_errstr)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    char errstr[256];</div><div class='add'>+    double size = 0;</div><div class='add'>+    gf_boolean_t is_percent = _gf_false;</div><div class='add'>+</div><div class='add'>+    if (gf_string2percent_or_bytesize(value, &amp;size, &amp;is_percent) == 0) {</div><div class='add'>+        if (is_percent) {</div><div class='add'>+            if ((size &lt; 0.0) || (size &gt; 100.0)) {</div><div class='add'>+                snprintf(errstr, sizeof(errstr),</div><div class='add'>+                         "'%lf' in 'option %s %s' is out"</div><div class='add'>+                         " of range [0 - 100]",</div><div class='add'>+                         size, key, value);</div><div class='add'>+                gf_smsg(xl-&gt;name, GF_LOG_ERROR, 0, LG_MSG_OUT_OF_RANGE,</div><div class='add'>+                        "error=%s", errstr, NULL);</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+            ret = 0;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        /*Input value of size(in byte) should not be fractional*/</div><div class='add'>+        ret = xlator_option_validate_fractional_value(value);</div><div class='add'>+        if (ret) {</div><div class='add'>+            snprintf(errstr, sizeof(errstr),</div><div class='add'>+                     "'%lf' in 'option %s"</div><div class='add'>+                     " %s' should not be fractional value. Use "</div><div class='add'>+                     "valid unsigned integer value.",</div><div class='add'>+                     size, key, value);</div><div class='add'>+            gf_smsg(xl-&gt;name, GF_LOG_ERROR, 0, LG_MSG_INVALID_ENTRY, "error=%s",</div><div class='add'>+                    errstr, NULL);</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        /* Check the range */</div><div class='add'>+        if ((opt-&gt;min == 0) &amp;&amp; (opt-&gt;max == 0)) {</div><div class='add'>+            gf_msg_trace(xl-&gt;name, 0,</div><div class='add'>+                         "no range check required "</div><div class='add'>+                         "for 'option %s %s'",</div><div class='add'>+                         key, value);</div><div class='add'>+            ret = 0;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+        if ((size &lt; opt-&gt;min) || (size &gt; opt-&gt;max)) {</div><div class='add'>+            snprintf(errstr, 256,</div><div class='add'>+                     "'%lf' in 'option %s %s'"</div><div class='add'>+                     " is out of range [%.0f - %.0f]",</div><div class='add'>+                     size, key, value, opt-&gt;min, opt-&gt;max);</div><div class='add'>+            gf_smsg(xl-&gt;name, GF_LOG_ERROR, 0, LG_MSG_OUT_OF_RANGE, "error=%s",</div><div class='add'>+                    errstr, NULL);</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+        ret = 0;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* If control reaches here, invalid argument */</div><div class='add'>+</div><div class='add'>+    snprintf(errstr, 256, "invalid number format \"%s\" in \"option %s\"",</div><div class='add'>+             value, key);</div><div class='add'>+    gf_smsg(xl-&gt;name, GF_LOG_ERROR, 0, LG_MSG_INVALID_ENTRY, "error=%s", errstr,</div><div class='add'>+            NULL);</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (ret &amp;&amp; op_errstr)</div><div class='add'>+        *op_errstr = gf_strdup(errstr);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+xlator_option_validate_time(xlator_t *xl, const char *key, const char *value,</div><div class='add'>+                            volume_option_t *opt, char **op_errstr)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    char errstr[256];</div><div class='add'>+    uint32_t input_time = 0;</div><div class='add'>+</div><div class='add'>+    /* Check if the value is valid time */</div><div class='add'>+    if (gf_string2time(value, &amp;input_time) != 0) {</div><div class='add'>+        snprintf(errstr, 256,</div><div class='add'>+                 "invalid time format \"%s\" in "</div><div class='add'>+                 "\"option %s\"",</div><div class='add'>+                 value, key);</div><div class='add'>+        gf_smsg(xl-&gt;name, GF_LOG_ERROR, 0, LG_MSG_INVALID_ENTRY, "error=%s",</div><div class='add'>+                errstr, NULL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if ((opt-&gt;min == 0) &amp;&amp; (opt-&gt;max == 0)) {</div><div class='add'>+        gf_msg_trace(xl-&gt;name, 0,</div><div class='add'>+                     "no range check required for "</div><div class='add'>+                     "'option %s %s'",</div><div class='add'>+                     key, value);</div><div class='add'>+        ret = 0;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if ((input_time &lt; opt-&gt;min) || (input_time &gt; opt-&gt;max)) {</div><div class='add'>+        snprintf(errstr, 256,</div><div class='add'>+                 "'%" PRIu32</div><div class='add'>+                 "' in 'option %s %s' is "</div><div class='add'>+                 "out of range [%.0f - %.0f]",</div><div class='add'>+                 input_time, key, value, opt-&gt;min, opt-&gt;max);</div><div class='add'>+        gf_smsg(xl-&gt;name, GF_LOG_ERROR, 0, LG_MSG_OUT_OF_RANGE, "error=%s",</div><div class='add'>+                errstr, NULL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+out:</div><div class='add'>+    if (ret &amp;&amp; op_errstr)</div><div class='add'>+        *op_errstr = gf_strdup(errstr);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+xlator_option_validate_double(xlator_t *xl, const char *key, const char *value,</div><div class='add'>+                              volume_option_t *opt, char **op_errstr)</div><div class='add'>+{</div><div class='add'>+    double input = 0.0;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    char errstr[256];</div><div class='add'>+</div><div class='add'>+    /* Check the range */</div><div class='add'>+    if (gf_string2double(value, &amp;input) != 0) {</div><div class='add'>+        snprintf(errstr, 256, "invalid number format \"%s\" in option \"%s\"",</div><div class='add'>+                 value, key);</div><div class='add'>+        gf_smsg(xl-&gt;name, GF_LOG_ERROR, 0, LG_MSG_INVALID_ENTRY, "error=%s",</div><div class='add'>+                errstr, NULL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if ((opt-&gt;min == 0) &amp;&amp; (opt-&gt;max == 0) &amp;&amp;</div><div class='add'>+        (opt-&gt;validate == GF_OPT_VALIDATE_BOTH)) {</div><div class='add'>+        gf_msg_trace(xl-&gt;name, 0,</div><div class='add'>+                     "no range check required for "</div><div class='add'>+                     "'option %s %s'",</div><div class='add'>+                     key, value);</div><div class='add'>+        ret = 0;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (opt-&gt;validate == GF_OPT_VALIDATE_MIN) {</div><div class='add'>+        if (input &lt; opt-&gt;min) {</div><div class='add'>+            snprintf(errstr, 256,</div><div class='add'>+                     "'%f' in 'option %s %s' is smaller than "</div><div class='add'>+                     "minimum value '%f'",</div><div class='add'>+                     input, key, value, opt-&gt;min);</div><div class='add'>+            gf_smsg(xl-&gt;name, GF_LOG_ERROR, 0, LG_MSG_INVALID_ENTRY, "error=%s",</div><div class='add'>+                    errstr, NULL);</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    } else if (opt-&gt;validate == GF_OPT_VALIDATE_MAX) {</div><div class='add'>+        if (input &gt; opt-&gt;max) {</div><div class='add'>+            snprintf(errstr, 256,</div><div class='add'>+                     "'%f' in 'option %s %s' is greater than "</div><div class='add'>+                     "maximum value '%f'",</div><div class='add'>+                     input, key, value, opt-&gt;max);</div><div class='add'>+            gf_smsg(xl-&gt;name, GF_LOG_ERROR, 0, LG_MSG_INVALID_ENTRY, "error=%s",</div><div class='add'>+                    errstr, NULL);</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    } else if ((input &lt; opt-&gt;min) || (input &gt; opt-&gt;max)) {</div><div class='add'>+        snprintf(errstr, 256,</div><div class='add'>+                 "'%f' in 'option %s %s' is out of range "</div><div class='add'>+                 "[%f - %f]",</div><div class='add'>+                 input, key, value, opt-&gt;min, opt-&gt;max);</div><div class='add'>+        gf_smsg(xl-&gt;name, GF_LOG_ERROR, 0, LG_MSG_OUT_OF_RANGE, "error=%s",</div><div class='add'>+                errstr, NULL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+out:</div><div class='add'>+    if (ret &amp;&amp; op_errstr)</div><div class='add'>+        *op_errstr = gf_strdup(errstr);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+xlator_option_validate_addr(xlator_t *xl, const char *key, const char *value,</div><div class='add'>+                            volume_option_t *opt, char **op_errstr)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    char errstr[256];</div><div class='add'>+</div><div class='add'>+    if (!valid_internet_address((char *)value, _gf_false, _gf_false)) {</div><div class='add'>+        snprintf(errstr, 256, "option %s %s: Can not parse %s address", key,</div><div class='add'>+                 value, value);</div><div class='add'>+        gf_smsg(xl-&gt;name, GF_LOG_ERROR, 0, LG_MSG_INVALID_ENTRY, "error=%s",</div><div class='add'>+                errstr, NULL);</div><div class='add'>+        if (op_errstr)</div><div class='add'>+            *op_errstr = gf_strdup(errstr);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+xlator_option_validate_addr_list(xlator_t *xl, const char *key,</div><div class='add'>+                                 const char *value, volume_option_t *opt,</div><div class='add'>+                                 char **op_errstr)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    char *dup_val = NULL;</div><div class='add'>+    char *addr_tok = NULL;</div><div class='add'>+    char *save_ptr = NULL;</div><div class='add'>+    char *entry = NULL;</div><div class='add'>+    char *entry_ptr = NULL;</div><div class='add'>+    char *dir_and_addr = NULL;</div><div class='add'>+    char *addr_ptr = NULL;</div><div class='add'>+    char *addr_list = NULL;</div><div class='add'>+    char *addr = NULL;</div><div class='add'>+    char *dir = NULL;</div><div class='add'>+</div><div class='add'>+    dup_val = gf_strdup(value);</div><div class='add'>+    if (!dup_val)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    if (dup_val[0] != '/' &amp;&amp; !strchr(dup_val, '(')) {</div><div class='add'>+        /* Possible old format, handle it for back-ward compatibility */</div><div class='add'>+        addr_tok = strtok_r(dup_val, ",", &amp;save_ptr);</div><div class='add'>+        while (addr_tok) {</div><div class='add'>+            if (!valid_internet_address(addr_tok, _gf_true, _gf_true))</div><div class='add'>+                goto out;</div><div class='add'>+</div><div class='add'>+            addr_tok = strtok_r(NULL, ",", &amp;save_ptr);</div><div class='add'>+        }</div><div class='add'>+        ret = 0;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Lets handle the value with new format */</div><div class='add'>+    entry = strtok_r(dup_val, ",", &amp;entry_ptr);</div><div class='add'>+    while (entry) {</div><div class='add'>+        dir_and_addr = gf_strdup(entry);</div><div class='add'>+        if (!dir_and_addr)</div><div class='add'>+            goto out;</div><div class='add'>+</div><div class='add'>+        dir = strtok_r(dir_and_addr, "(", &amp;addr_ptr);</div><div class='add'>+        if (dir[0] != '/') {</div><div class='add'>+            /* Valid format should be starting from '/' */</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+        /* dir = strtok_r (NULL, " =", &amp;addr_tmp); */</div><div class='add'>+        addr = strtok_r(NULL, ")", &amp;addr_ptr);</div><div class='add'>+        if (!addr)</div><div class='add'>+            goto out;</div><div class='add'>+</div><div class='add'>+        addr_list = gf_strdup(addr);</div><div class='add'>+        if (!addr_list)</div><div class='add'>+            goto out;</div><div class='add'>+</div><div class='add'>+        /* This format be separated by '|' */</div><div class='add'>+        addr_tok = strtok_r(addr_list, "|", &amp;save_ptr);</div><div class='add'>+        if (addr_tok == NULL)</div><div class='add'>+            goto out;</div><div class='add'>+        while (addr_tok) {</div><div class='add'>+            if (!valid_internet_address(addr_tok, _gf_true, _gf_true))</div><div class='add'>+                goto out;</div><div class='add'>+</div><div class='add'>+            addr_tok = strtok_r(NULL, "|", &amp;save_ptr);</div><div class='add'>+        }</div><div class='add'>+        entry = strtok_r(NULL, ",", &amp;entry_ptr);</div><div class='add'>+        GF_FREE(dir_and_addr);</div><div class='add'>+        GF_FREE(addr_list);</div><div class='add'>+        addr_list = NULL;</div><div class='add'>+        dir_and_addr = NULL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (ret) {</div><div class='add'>+        char errstr[4096];</div><div class='add'>+        snprintf(errstr, sizeof(errstr),</div><div class='add'>+                 "option %s %s: '%s' is not "</div><div class='add'>+                 "a valid internet-address-list",</div><div class='add'>+                 key, value, value);</div><div class='add'>+        gf_smsg(xl-&gt;name, GF_LOG_ERROR, 0, LG_MSG_INVALID_ENTRY, "error=%s",</div><div class='add'>+                errstr, NULL);</div><div class='add'>+        if (op_errstr)</div><div class='add'>+            *op_errstr = gf_strdup(errstr);</div><div class='add'>+    }</div><div class='add'>+    GF_FREE(dup_val);</div><div class='add'>+    GF_FREE(dir_and_addr);</div><div class='add'>+    GF_FREE(addr_list);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+xlator_option_validate_mntauth(xlator_t *xl, const char *key, const char *value,</div><div class='add'>+                               volume_option_t *opt, char **op_errstr)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    char *dup_val = NULL;</div><div class='add'>+    char *addr_tok = NULL;</div><div class='add'>+    char *save_ptr = NULL;</div><div class='add'>+</div><div class='add'>+    dup_val = gf_strdup(value);</div><div class='add'>+    if (!dup_val)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    addr_tok = strtok_r(dup_val, ",", &amp;save_ptr);</div><div class='add'>+    if (addr_tok == NULL)</div><div class='add'>+        goto out;</div><div class='add'>+    while (addr_tok) {</div><div class='add'>+        if (!valid_mount_auth_address(addr_tok))</div><div class='add'>+            goto out;</div><div class='add'>+</div><div class='add'>+        addr_tok = strtok_r(NULL, ",", &amp;save_ptr);</div><div class='add'>+    }</div><div class='add'>+    ret = 0;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (ret) {</div><div class='add'>+        char errstr[4096];</div><div class='add'>+        snprintf(errstr, sizeof(errstr),</div><div class='add'>+                 "option %s %s: '%s' is not "</div><div class='add'>+                 "a valid mount-auth-address",</div><div class='add'>+                 key, value, value);</div><div class='add'>+        gf_smsg(xl-&gt;name, GF_LOG_ERROR, 0, LG_MSG_INVALID_ENTRY, "error=%s",</div><div class='add'>+                errstr, NULL);</div><div class='add'>+        if (op_errstr)</div><div class='add'>+            *op_errstr = gf_strdup(errstr);</div><div class='add'>+    }</div><div class='add'>+    GF_FREE(dup_val);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*XXX: the rules to validate are as per block-size required for stripe xlator */</div><div class='add'>+static int</div><div class='add'>+gf_validate_size(const char *sizestr, volume_option_t *opt)</div><div class='add'>+{</div><div class='add'>+    uint64_t value = 0;</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(opt);</div><div class='add'>+</div><div class='add'>+    if (gf_string2bytesize_uint64(sizestr, &amp;value) != 0 || value &lt; opt-&gt;min ||</div><div class='add'>+        value % 512) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    gf_msg_debug(THIS-&gt;name, 0, "Returning %d", ret);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+gf_validate_number(const char *numstr, volume_option_t *opt)</div><div class='add'>+{</div><div class='add'>+    int32_t value;</div><div class='add'>+    return gf_string2int32(numstr, &amp;value);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*  Parses the string to be of the form &lt;key1&gt;:&lt;value1&gt;,&lt;key2&gt;:&lt;value2&gt;...  *</div><div class='add'>+ *  takes two optional validaters key_validator and value_validator         */</div><div class='add'>+static int</div><div class='add'>+validate_list_elements(const char *string, volume_option_t *opt,</div><div class='add'>+                       int(key_validator)(const char *),</div><div class='add'>+                       int(value_validator)(const char *, volume_option_t *))</div><div class='add'>+{</div><div class='add'>+    char *dup_string = NULL;</div><div class='add'>+    char *str_sav = NULL;</div><div class='add'>+    char *substr_sav = NULL;</div><div class='add'>+    char *str_ptr = NULL;</div><div class='add'>+    char *key = NULL;</div><div class='add'>+    char *value = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(string);</div><div class='add'>+</div><div class='add'>+    dup_string = gf_strdup(string);</div><div class='add'>+    if (NULL == dup_string)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    str_ptr = strtok_r(dup_string, ",", &amp;str_sav);</div><div class='add'>+    if (str_ptr == NULL) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    while (str_ptr) {</div><div class='add'>+        key = strtok_r(str_ptr, ":", &amp;substr_sav);</div><div class='add'>+        if (!key || (key_validator &amp;&amp; key_validator(key))) {</div><div class='add'>+            ret = -1;</div><div class='add'>+            gf_smsg(THIS-&gt;name, GF_LOG_WARNING, 0, LG_MSG_INVALID_ENTRY,</div><div class='add'>+                    "list=%s", string, "key=%s", key ? key : "", NULL);</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        value = strtok_r(NULL, ":", &amp;substr_sav);</div><div class='add'>+        if (!value || (value_validator &amp;&amp; value_validator(value, opt))) {</div><div class='add'>+            ret = -1;</div><div class='add'>+            gf_smsg(THIS-&gt;name, GF_LOG_WARNING, 0, LG_MSG_INVALID_ENTRY,</div><div class='add'>+                    "list=%s", string, "value=%s", key, NULL);</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        str_ptr = strtok_r(NULL, ",", &amp;str_sav);</div><div class='add'>+        substr_sav = NULL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    GF_FREE(dup_string);</div><div class='add'>+    gf_msg_debug(THIS-&gt;name, 0, "Returning %d", ret);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+xlator_option_validate_priority_list(xlator_t *xl, const char *key,</div><div class='add'>+                                     const char *value, volume_option_t *opt,</div><div class='add'>+                                     char **op_errstr)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+    char errstr[1024] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(value);</div><div class='add'>+</div><div class='add'>+    ret = validate_list_elements(value, opt, NULL, &amp;gf_validate_number);</div><div class='add'>+    if (ret) {</div><div class='add'>+        snprintf(errstr, 1024,</div><div class='add'>+                 "option %s %s: '%s' is not a valid "</div><div class='add'>+                 "priority-list",</div><div class='add'>+                 key, value, value);</div><div class='add'>+        *op_errstr = gf_strdup(errstr);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+xlator_option_validate_size_list(xlator_t *xl, const char *key,</div><div class='add'>+                                 const char *value, volume_option_t *opt,</div><div class='add'>+                                 char **op_errstr)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+    char errstr[1024] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(value);</div><div class='add'>+</div><div class='add'>+    ret = gf_validate_size(value, opt);</div><div class='add'>+    if (ret)</div><div class='add'>+        ret = validate_list_elements(value, opt, NULL, &amp;gf_validate_size);</div><div class='add'>+</div><div class='add'>+    if (ret) {</div><div class='add'>+        snprintf(errstr, 1024,</div><div class='add'>+                 "option %s %s: '%s' is not a valid "</div><div class='add'>+                 "size-list",</div><div class='add'>+                 key, value, value);</div><div class='add'>+        *op_errstr = gf_strdup(errstr);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+xlator_option_validate_any(xlator_t *xl, const char *key, const char *value,</div><div class='add'>+                           volume_option_t *opt, char **op_errstr)</div><div class='add'>+{</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+typedef int(xlator_option_validator_t)(xlator_t *xl, const char *key,</div><div class='add'>+                                       const char *value, volume_option_t *opt,</div><div class='add'>+                                       char **operrstr);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+xlator_option_validate(xlator_t *xl, char *key, char *value,</div><div class='add'>+                       volume_option_t *opt, char **op_errstr)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    xlator_option_validator_t *validate;</div><div class='add'>+    xlator_option_validator_t *validators[] = {</div><div class='add'>+        [GF_OPTION_TYPE_PATH] = xlator_option_validate_path,</div><div class='add'>+        [GF_OPTION_TYPE_INT] = xlator_option_validate_int,</div><div class='add'>+        [GF_OPTION_TYPE_SIZET] = xlator_option_validate_sizet,</div><div class='add'>+        [GF_OPTION_TYPE_BOOL] = xlator_option_validate_bool,</div><div class='add'>+        [GF_OPTION_TYPE_XLATOR] = xlator_option_validate_xlator,</div><div class='add'>+        [GF_OPTION_TYPE_STR] = xlator_option_validate_str,</div><div class='add'>+        [GF_OPTION_TYPE_PERCENT] = xlator_option_validate_percent,</div><div class='add'>+        [GF_OPTION_TYPE_PERCENT_OR_SIZET] =</div><div class='add'>+            xlator_option_validate_percent_or_sizet,</div><div class='add'>+        [GF_OPTION_TYPE_TIME] = xlator_option_validate_time,</div><div class='add'>+        [GF_OPTION_TYPE_DOUBLE] = xlator_option_validate_double,</div><div class='add'>+        [GF_OPTION_TYPE_INTERNET_ADDRESS] = xlator_option_validate_addr,</div><div class='add'>+        [GF_OPTION_TYPE_INTERNET_ADDRESS_LIST] =</div><div class='add'>+            xlator_option_validate_addr_list,</div><div class='add'>+        [GF_OPTION_TYPE_PRIORITY_LIST] = xlator_option_validate_priority_list,</div><div class='add'>+        [GF_OPTION_TYPE_SIZE_LIST] = xlator_option_validate_size_list,</div><div class='add'>+        [GF_OPTION_TYPE_ANY] = xlator_option_validate_any,</div><div class='add'>+        [GF_OPTION_TYPE_CLIENT_AUTH_ADDR] = xlator_option_validate_mntauth,</div><div class='add'>+        [GF_OPTION_TYPE_MAX] = NULL,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    if (opt-&gt;type &gt; GF_OPTION_TYPE_MAX) {</div><div class='add'>+        gf_smsg(xl-&gt;name, GF_LOG_ERROR, 0, LG_MSG_UNKNOWN_OPTION_TYPE,</div><div class='add'>+                "type=%d", opt-&gt;type, NULL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    validate = validators[opt-&gt;type];</div><div class='add'>+</div><div class='add'>+    ret = validate(xl, key, value, opt, op_errstr);</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+volume_option_t *</div><div class='add'>+xlator_volume_option_get_list(volume_opt_list_t *vol_list, const char *key)</div><div class='add'>+{</div><div class='add'>+    volume_option_t *opt = NULL;</div><div class='add'>+    volume_opt_list_t *opt_list = NULL;</div><div class='add'>+    int index = 0;</div><div class='add'>+    int i = 0;</div><div class='add'>+    char *cmp_key = NULL;</div><div class='add'>+</div><div class='add'>+    if (!vol_list-&gt;given_opt) {</div><div class='add'>+        opt_list = list_entry(vol_list-&gt;list.next, volume_opt_list_t, list);</div><div class='add'>+        opt = opt_list-&gt;given_opt;</div><div class='add'>+    } else</div><div class='add'>+        opt = vol_list-&gt;given_opt;</div><div class='add'>+</div><div class='add'>+    for (index = 0; opt[index].key[0]; index++) {</div><div class='add'>+        for (i = 0; i &lt; ZR_VOLUME_MAX_NUM_KEY; i++) {</div><div class='add'>+            cmp_key = opt[index].key[i];</div><div class='add'>+            if (!cmp_key)</div><div class='add'>+                break;</div><div class='add'>+            if (fnmatch(cmp_key, key, FNM_NOESCAPE) == 0) {</div><div class='add'>+                return &amp;opt[index];</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return NULL;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+volume_option_t *</div><div class='add'>+xlator_volume_option_get(xlator_t *xl, const char *key)</div><div class='add'>+{</div><div class='add'>+    volume_opt_list_t *vol_list = NULL;</div><div class='add'>+    volume_option_t *found = NULL;</div><div class='add'>+</div><div class='add'>+    list_for_each_entry(vol_list, &amp;xl-&gt;volume_options, list)</div><div class='add'>+    {</div><div class='add'>+        found = xlator_volume_option_get_list(vol_list, key);</div><div class='add'>+        if (found)</div><div class='add'>+            break;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return found;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+xl_opt_validate(dict_t *dict, char *key, data_t *value, void *data)</div><div class='add'>+{</div><div class='add'>+    xlator_t *xl = NULL;</div><div class='add'>+    volume_opt_list_t *vol_opt = NULL;</div><div class='add'>+    volume_option_t *opt = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    char *errstr = NULL;</div><div class='add'>+</div><div class='add'>+    struct {</div><div class='add'>+        xlator_t *this;</div><div class='add'>+        volume_opt_list_t *vol_opt;</div><div class='add'>+        char *errstr;</div><div class='add'>+    } * stub;</div><div class='add'>+</div><div class='add'>+    stub = data;</div><div class='add'>+    xl = stub-&gt;this;</div><div class='add'>+    vol_opt = stub-&gt;vol_opt;</div><div class='add'>+</div><div class='add'>+    opt = xlator_volume_option_get_list(vol_opt, key);</div><div class='add'>+    if (!opt)</div><div class='add'>+        return 0;</div><div class='add'>+</div><div class='add'>+    ret = xlator_option_validate(xl, key, value-&gt;data, opt, &amp;errstr);</div><div class='add'>+    if (ret)</div><div class='add'>+        gf_smsg(xl-&gt;name, GF_LOG_WARNING, 0, LG_MSG_VALIDATE_RETURNS, "key=%s",</div><div class='add'>+                key, "ret=%d", ret, NULL);</div><div class='add'>+</div><div class='add'>+    if (errstr)</div><div class='add'>+        /* possible small leak of previously set stub-&gt;errstr */</div><div class='add'>+        stub-&gt;errstr = errstr;</div><div class='add'>+</div><div class='add'>+    if (fnmatch(opt-&gt;key[0], key, FNM_NOESCAPE) != 0) {</div><div class='add'>+        gf_smsg(xl-&gt;name, GF_LOG_DEBUG, 0, LG_MSG_OPTION_DEPRECATED, "key=%s",</div><div class='add'>+                key, "preferred=%s", opt-&gt;key[0], NULL);</div><div class='add'>+        dict_set(dict, opt-&gt;key[0], value);</div><div class='add'>+        dict_del(dict, key);</div><div class='add'>+    }</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+xlator_options_validate_list(xlator_t *xl, dict_t *options,</div><div class='add'>+                             volume_opt_list_t *vol_opt, char **op_errstr)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+    struct {</div><div class='add'>+        xlator_t *this;</div><div class='add'>+        volume_opt_list_t *vol_opt;</div><div class='add'>+        char *errstr;</div><div class='add'>+    } stub;</div><div class='add'>+</div><div class='add'>+    stub.this = xl;</div><div class='add'>+    stub.vol_opt = vol_opt;</div><div class='add'>+    stub.errstr = NULL;</div><div class='add'>+</div><div class='add'>+    dict_foreach(options, xl_opt_validate, &amp;stub);</div><div class='add'>+    if (stub.errstr) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        if (op_errstr)</div><div class='add'>+            *op_errstr = stub.errstr;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+xlator_options_validate(xlator_t *xl, dict_t *options, char **op_errstr)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+    volume_opt_list_t *vol_opt = NULL;</div><div class='add'>+</div><div class='add'>+    if (!xl) {</div><div class='add'>+        gf_msg_debug(THIS-&gt;name, 0, "'this' not a valid ptr");</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (list_empty(&amp;xl-&gt;volume_options))</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    list_for_each_entry(vol_opt, &amp;xl-&gt;volume_options, list)</div><div class='add'>+    {</div><div class='add'>+        ret = xlator_options_validate_list(xl, options, vol_opt, op_errstr);</div><div class='add'>+    }</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+xlator_validate_rec(xlator_t *xlator, char **op_errstr)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    xlator_list_t *trav = NULL;</div><div class='add'>+    xlator_t *old_THIS = NULL;</div><div class='add'>+</div><div class='add'>+    GF_VALIDATE_OR_GOTO("xlator", xlator, out);</div><div class='add'>+</div><div class='add'>+    trav = xlator-&gt;children;</div><div class='add'>+</div><div class='add'>+    while (trav) {</div><div class='add'>+        if (xlator_validate_rec(trav-&gt;xlator, op_errstr)) {</div><div class='add'>+            gf_smsg("xlator", GF_LOG_WARNING, 0, LG_MSG_VALIDATE_REC_FAILED,</div><div class='add'>+                    NULL);</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        trav = trav-&gt;next;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (xlator_dynload(xlator))</div><div class='add'>+        gf_msg_debug(xlator-&gt;name, 0, "Did not load the symbols");</div><div class='add'>+</div><div class='add'>+    old_THIS = THIS;</div><div class='add'>+    THIS = xlator;</div><div class='add'>+</div><div class='add'>+    /* Need this here, as this graph has not yet called init() */</div><div class='add'>+    if (!xlator-&gt;mem_acct) {</div><div class='add'>+        if (!xlator-&gt;mem_acct_init)</div><div class='add'>+            xlator-&gt;mem_acct_init = default_mem_acct_init;</div><div class='add'>+        xlator-&gt;mem_acct_init(xlator);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = xlator_options_validate(xlator, xlator-&gt;options, op_errstr);</div><div class='add'>+    THIS = old_THIS;</div><div class='add'>+</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_smsg(xlator-&gt;name, GF_LOG_INFO, 0, LG_MSG_INVALID_ENTRY, "%s",</div><div class='add'>+                *op_errstr, NULL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    gf_msg_debug(xlator-&gt;name, 0, "Validated options");</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+graph_reconf_validateopt(glusterfs_graph_t *graph, char **op_errstr)</div><div class='add'>+{</div><div class='add'>+    xlator_t *xlator = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(graph);</div><div class='add'>+</div><div class='add'>+    xlator = graph-&gt;first;</div><div class='add'>+</div><div class='add'>+    ret = xlator_validate_rec(xlator, op_errstr);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+xlator_reconfigure_rec(xlator_t *old_xl, xlator_t *new_xl)</div><div class='add'>+{</div><div class='add'>+    xlator_list_t *trav1 = NULL;</div><div class='add'>+    xlator_list_t *trav2 = NULL;</div><div class='add'>+    int32_t ret = -1;</div><div class='add'>+    xlator_t *old_THIS = NULL;</div><div class='add'>+</div><div class='add'>+    GF_VALIDATE_OR_GOTO("xlator", old_xl, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("xlator", new_xl, out);</div><div class='add'>+</div><div class='add'>+    trav1 = old_xl-&gt;children;</div><div class='add'>+    trav2 = new_xl-&gt;children;</div><div class='add'>+</div><div class='add'>+    while (trav1 &amp;&amp; trav2) {</div><div class='add'>+        ret = xlator_reconfigure_rec(trav1-&gt;xlator, trav2-&gt;xlator);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+</div><div class='add'>+        gf_msg_debug(trav1-&gt;xlator-&gt;name, 0, "reconfigured");</div><div class='add'>+</div><div class='add'>+        trav1 = trav1-&gt;next;</div><div class='add'>+        trav2 = trav2-&gt;next;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (old_xl-&gt;reconfigure) {</div><div class='add'>+        old_THIS = THIS;</div><div class='add'>+        THIS = old_xl;</div><div class='add'>+</div><div class='add'>+        xlator_init_lock();</div><div class='add'>+        handle_default_options(old_xl, new_xl-&gt;options);</div><div class='add'>+        ret = old_xl-&gt;reconfigure(old_xl, new_xl-&gt;options);</div><div class='add'>+        xlator_init_unlock();</div><div class='add'>+</div><div class='add'>+        THIS = old_THIS;</div><div class='add'>+</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+    } else {</div><div class='add'>+        gf_msg_debug(old_xl-&gt;name, 0, "No reconfigure() found");</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+xlator_tree_reconfigure(xlator_t *old_xl, xlator_t *new_xl)</div><div class='add'>+{</div><div class='add'>+    xlator_t *new_top = NULL;</div><div class='add'>+    xlator_t *old_top = NULL;</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(old_xl);</div><div class='add'>+    GF_ASSERT(new_xl);</div><div class='add'>+</div><div class='add'>+    old_top = old_xl;</div><div class='add'>+    new_top = new_xl;</div><div class='add'>+</div><div class='add'>+    return xlator_reconfigure_rec(old_top, new_top);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+xlator_option_info_list(volume_opt_list_t *list, char *key, char **def_val,</div><div class='add'>+                        char **descr)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    volume_option_t *opt = NULL;</div><div class='add'>+</div><div class='add'>+    opt = xlator_volume_option_get_list(list, key);</div><div class='add'>+    if (!opt)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    if (def_val)</div><div class='add'>+        *def_val = opt-&gt;default_value;</div><div class='add'>+    if (descr)</div><div class='add'>+        *descr = opt-&gt;description;</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+pass(char *in, char **out)</div><div class='add'>+{</div><div class='add'>+    *out = in;</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+xl_by_name(char *in, xlator_t **out)</div><div class='add'>+{</div><div class='add'>+    xlator_t *xl = NULL;</div><div class='add'>+</div><div class='add'>+    xl = xlator_search_by_name(THIS, in);</div><div class='add'>+</div><div class='add'>+    if (!xl)</div><div class='add'>+        return -1;</div><div class='add'>+    *out = xl;</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+pc_or_size(char *in, double *out)</div><div class='add'>+{</div><div class='add'>+    double pc = 0;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    uint64_t size = 0;</div><div class='add'>+</div><div class='add'>+    if (gf_string2percent(in, &amp;pc) == 0) {</div><div class='add'>+        if (pc &gt; 100.0) {</div><div class='add'>+            ret = gf_string2bytesize_uint64(in, &amp;size);</div><div class='add'>+            if (!ret)</div><div class='add'>+                *out = size;</div><div class='add'>+        } else {</div><div class='add'>+            *out = pc;</div><div class='add'>+        }</div><div class='add'>+    } else {</div><div class='add'>+        ret = gf_string2bytesize_uint64(in, &amp;size);</div><div class='add'>+        if (!ret)</div><div class='add'>+            *out = size;</div><div class='add'>+    }</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+DEFINE_INIT_OPT(char *, str, pass);</div><div class='add'>+DEFINE_INIT_OPT(uint64_t, uint64, gf_string2uint64);</div><div class='add'>+DEFINE_INIT_OPT(int64_t, int64, gf_string2int64);</div><div class='add'>+DEFINE_INIT_OPT(uint32_t, uint32, gf_string2uint32);</div><div class='add'>+DEFINE_INIT_OPT(int32_t, int32, gf_string2int32);</div><div class='add'>+DEFINE_INIT_OPT(uint64_t, size, gf_string2bytesize_uint64);</div><div class='add'>+DEFINE_INIT_OPT(uint64_t, size_uint64, gf_string2bytesize_uint64);</div><div class='add'>+DEFINE_INIT_OPT(double, percent, gf_string2percent);</div><div class='add'>+DEFINE_INIT_OPT(double, percent_or_size, pc_or_size);</div><div class='add'>+DEFINE_INIT_OPT(gf_boolean_t, bool, gf_string2boolean);</div><div class='add'>+DEFINE_INIT_OPT(xlator_t *, xlator, xl_by_name);</div><div class='add'>+DEFINE_INIT_OPT(char *, path, pass);</div><div class='add'>+DEFINE_INIT_OPT(double, double, gf_string2double);</div><div class='add'>+DEFINE_INIT_OPT(uint32_t, time, gf_string2time);</div><div class='add'>+</div><div class='add'>+DEFINE_RECONF_OPT(char *, str, pass);</div><div class='add'>+DEFINE_RECONF_OPT(uint64_t, uint64, gf_string2uint64);</div><div class='add'>+DEFINE_RECONF_OPT(int64_t, int64, gf_string2int64);</div><div class='add'>+DEFINE_RECONF_OPT(uint32_t, uint32, gf_string2uint32);</div><div class='add'>+DEFINE_RECONF_OPT(int32_t, int32, gf_string2int32);</div><div class='add'>+DEFINE_RECONF_OPT(uint64_t, size, gf_string2bytesize_uint64);</div><div class='add'>+DEFINE_RECONF_OPT(uint64_t, size_uint64, gf_string2bytesize_uint64);</div><div class='add'>+DEFINE_RECONF_OPT(double, percent, gf_string2percent);</div><div class='add'>+DEFINE_RECONF_OPT(double, percent_or_size, pc_or_size);</div><div class='add'>+DEFINE_RECONF_OPT(gf_boolean_t, bool, gf_string2boolean);</div><div class='add'>+DEFINE_RECONF_OPT(xlator_t *, xlator, xl_by_name);</div><div class='add'>+DEFINE_RECONF_OPT(char *, path, pass);</div><div class='add'>+DEFINE_RECONF_OPT(double, double, gf_string2double);</div><div class='add'>+DEFINE_RECONF_OPT(uint32_t, time, gf_string2time);</div><div class='head'>diff --git a/libglusterfs/src/parse-utils.c b/libglusterfs/src/parse-utils.c<br/>new file mode 100644<br/>index 00000000000..4531d5f0170<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/libglusterfs/src/parse-utils.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>libglusterfs/src/parse-utils.c</a></div><div class='hunk'>@@ -0,0 +1,174 @@</div><div class='add'>+/*</div><div class='add'>+   Copyright 2014-present Facebook. All Rights Reserved</div><div class='add'>+</div><div class='add'>+   This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+   Author :</div><div class='add'>+   Shreyas Siravara &lt;shreyas.siravara@gmail.com&gt;</div><div class='add'>+</div><div class='add'>+   This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+   General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+   later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+   cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#include &lt;regex.h&gt;</div><div class='add'>+#include &lt;stdio.h&gt;</div><div class='add'>+</div><div class='add'>+#include "glusterfs/parse-utils.h"</div><div class='add'>+#include "glusterfs/mem-pool.h"</div><div class='add'>+#include "glusterfs/common-utils.h"</div><div class='add'>+#include "glusterfs/libglusterfs-messages.h"</div><div class='add'>+</div><div class='add'>+/**</div><div class='add'>+ * parser_init: Initialize a parser with the a string to parse and</div><div class='add'>+ * the regex we want to use to parse it.</div><div class='add'>+ *</div><div class='add'>+ * @complete_str: the string to parse</div><div class='add'>+ * @regex       : the regex to use</div><div class='add'>+ *</div><div class='add'>+ * Notes        : It is up to the caller to call the parser_deinit () function</div><div class='add'>+ *                to free the allocated parser.</div><div class='add'>+ *</div><div class='add'>+ * @return      : success: parser ptr (on successful compilation and allocation)</div><div class='add'>+ *              : failure: NULL (on failure to compile regex or allocate memory)</div><div class='add'>+ */</div><div class='add'>+struct parser *</div><div class='add'>+parser_init(const char *regex)</div><div class='add'>+{</div><div class='add'>+    int rc = 0;</div><div class='add'>+    struct parser *parser = NULL;</div><div class='add'>+</div><div class='add'>+    parser = GF_MALLOC(sizeof(*parser), gf_common_mt_parser_t);</div><div class='add'>+    if (!parser)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    parser-&gt;regex = gf_strdup(regex);</div><div class='add'>+    if (!parser-&gt;regex) {</div><div class='add'>+        GF_FREE(parser);</div><div class='add'>+        parser = NULL;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    rc = regcomp(&amp;parser-&gt;preg, parser-&gt;regex, REG_EXTENDED);</div><div class='add'>+    if (rc != 0) {</div><div class='add'>+        gf_msg(GF_PARSE, GF_LOG_INFO, 0, LG_MSG_REGEX_OP_FAILED,</div><div class='add'>+               "Failed to compile regex pattern.");</div><div class='add'>+        parser_deinit(parser);</div><div class='add'>+        parser = NULL;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    parser-&gt;complete_str = NULL;</div><div class='add'>+out:</div><div class='add'>+    return parser;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/**</div><div class='add'>+ * parser_set_string -- Set the string in the parser that we want to parse.</div><div class='add'>+ *                      Subsequent calls to get_next_match () will use this</div><div class='add'>+ *                      string along with the regex that the parser was</div><div class='add'>+ *                      initialized with.</div><div class='add'>+ *</div><div class='add'>+ * @parser      : The parser to use</div><div class='add'>+ * @complete_str: The string to set in the parser (what we are going parse)</div><div class='add'>+ *</div><div class='add'>+ * @return: success: 0</div><div class='add'>+ *          failure: -EINVAL for NULL args, -ENOMEM for allocation errors</div><div class='add'>+ */</div><div class='add'>+int</div><div class='add'>+parser_set_string(struct parser *parser, const char *complete_str)</div><div class='add'>+{</div><div class='add'>+    int ret = -EINVAL;</div><div class='add'>+</div><div class='add'>+    GF_VALIDATE_OR_GOTO(GF_PARSE, parser, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(GF_PARSE, complete_str, out);</div><div class='add'>+</div><div class='add'>+    parser-&gt;complete_str = gf_strdup(complete_str);</div><div class='add'>+    GF_CHECK_ALLOC_AND_LOG(GF_PARSE, parser, ret, "Failed to duplicate string!",</div><div class='add'>+                           out);</div><div class='add'>+</div><div class='add'>+    /* Point the temp internal string to what we just dup'ed */</div><div class='add'>+    parser-&gt;_rstr = (char *)parser-&gt;complete_str;</div><div class='add'>+    ret = 0;</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/**</div><div class='add'>+ * parser_unset_string -- Free the string that was set to be parsed.</div><div class='add'>+ *                        This function needs to be called after</div><div class='add'>+ *                        parser_set_string and parser_get_next_match</div><div class='add'>+ *                        in order to free memory used by the string.</div><div class='add'>+ *</div><div class='add'>+ * @parser      : The parser to free memory in</div><div class='add'>+ * @return      : success: 0</div><div class='add'>+ *              : failure: -EINVAL on NULL args</div><div class='add'>+ */</div><div class='add'>+int</div><div class='add'>+parser_unset_string(struct parser *parser)</div><div class='add'>+{</div><div class='add'>+    int ret = -EINVAL;</div><div class='add'>+</div><div class='add'>+    GF_VALIDATE_OR_GOTO(GF_PARSE, parser, out);</div><div class='add'>+</div><div class='add'>+    GF_FREE(parser-&gt;complete_str);</div><div class='add'>+    parser-&gt;complete_str = NULL; /* Avoid double frees in parser_deinit */</div><div class='add'>+    ret = 0;</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/**</div><div class='add'>+ * parser_deinit: Free the parser and all the memory allocated by it</div><div class='add'>+ *</div><div class='add'>+ * @parser    : Parser to free</div><div class='add'>+ *</div><div class='add'>+ * @return    : nothing</div><div class='add'>+ */</div><div class='add'>+void</div><div class='add'>+parser_deinit(struct parser *ptr)</div><div class='add'>+{</div><div class='add'>+    if (!ptr)</div><div class='add'>+        return;</div><div class='add'>+</div><div class='add'>+    regfree(&amp;ptr-&gt;preg);</div><div class='add'>+    GF_FREE(ptr-&gt;complete_str);</div><div class='add'>+    GF_FREE(ptr-&gt;regex);</div><div class='add'>+    GF_FREE(ptr);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/**</div><div class='add'>+ * parser_get_match: Given the parser that is configured with a compiled regex,</div><div class='add'>+ * return the next match in the string.</div><div class='add'>+ *</div><div class='add'>+ * @parser    : Parser to use</div><div class='add'>+ *</div><div class='add'>+ * @return    : success: Pointer to matched character</div><div class='add'>+ *            : failure: NULL</div><div class='add'>+ */</div><div class='add'>+char *</div><div class='add'>+parser_get_next_match(struct parser *parser)</div><div class='add'>+{</div><div class='add'>+    int rc = -EINVAL;</div><div class='add'>+    size_t copy_len = 0;</div><div class='add'>+    char *match = NULL;</div><div class='add'>+</div><div class='add'>+    GF_VALIDATE_OR_GOTO(GF_PARSE, parser, out);</div><div class='add'>+</div><div class='add'>+    rc = regexec(&amp;parser-&gt;preg, parser-&gt;_rstr, 1, parser-&gt;pmatch, 0);</div><div class='add'>+    if (rc != 0) {</div><div class='add'>+        gf_msg_debug(GF_PARSE, 0, "Could not match %s with regex %s",</div><div class='add'>+                     parser-&gt;_rstr, parser-&gt;regex);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    copy_len = parser-&gt;pmatch[0].rm_eo - parser-&gt;pmatch[0].rm_so;</div><div class='add'>+</div><div class='add'>+    match = gf_strndup(parser-&gt;_rstr + parser-&gt;pmatch[0].rm_so, copy_len);</div><div class='add'>+    GF_CHECK_ALLOC_AND_LOG(GF_PARSE, match, rc, "Duplicating match failed!",</div><div class='add'>+                           out);</div><div class='add'>+</div><div class='add'>+    parser-&gt;_rstr = &amp;parser-&gt;_rstr[parser-&gt;pmatch[0].rm_eo];</div><div class='add'>+out:</div><div class='add'>+    return match;</div><div class='add'>+}</div><div class='head'>diff --git a/libglusterfs/src/quota-common-utils.c b/libglusterfs/src/quota-common-utils.c<br/>new file mode 100644<br/>index 00000000000..804e2f0ad4b<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/libglusterfs/src/quota-common-utils.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>libglusterfs/src/quota-common-utils.c</a></div><div class='hunk'>@@ -0,0 +1,241 @@</div><div class='add'>+/*</div><div class='add'>+   Copyright (c) 2015 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+   This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+   This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+   General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+   later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+   cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#include "glusterfs/dict.h"</div><div class='add'>+#include "glusterfs/logging.h"</div><div class='add'>+#include "glusterfs/byte-order.h"</div><div class='add'>+#include "glusterfs/quota-common-utils.h"</div><div class='add'>+#include "glusterfs/common-utils.h"</div><div class='add'>+#include "glusterfs/libglusterfs-messages.h"</div><div class='add'>+</div><div class='add'>+gf_boolean_t</div><div class='add'>+quota_meta_is_null(const quota_meta_t *meta)</div><div class='add'>+{</div><div class='add'>+    if (meta-&gt;size == 0 &amp;&amp; meta-&gt;file_count == 0 &amp;&amp; meta-&gt;dir_count == 0)</div><div class='add'>+        return _gf_true;</div><div class='add'>+</div><div class='add'>+    return _gf_false;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+quota_data_to_meta(data_t *data, quota_meta_t *meta)</div><div class='add'>+{</div><div class='add'>+    int32_t ret = -1;</div><div class='add'>+    quota_meta_t *value = NULL;</div><div class='add'>+    int64_t *size = NULL;</div><div class='add'>+</div><div class='add'>+    if (!data || !meta)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    if (data-&gt;len &gt; sizeof(int64_t)) {</div><div class='add'>+        value = (quota_meta_t *)data-&gt;data;</div><div class='add'>+        meta-&gt;size = ntoh64(value-&gt;size);</div><div class='add'>+        meta-&gt;file_count = ntoh64(value-&gt;file_count);</div><div class='add'>+        if (data-&gt;len &gt; (sizeof(int64_t)) * 2)</div><div class='add'>+            meta-&gt;dir_count = ntoh64(value-&gt;dir_count);</div><div class='add'>+        else</div><div class='add'>+            meta-&gt;dir_count = 0;</div><div class='add'>+    } else {</div><div class='add'>+        size = (int64_t *)data-&gt;data;</div><div class='add'>+        meta-&gt;size = ntoh64(*size);</div><div class='add'>+        meta-&gt;file_count = 0;</div><div class='add'>+        meta-&gt;dir_count = 0;</div><div class='add'>+        /* This can happen during software upgrade.</div><div class='add'>+         * Older version of glusterfs will not have inode count.</div><div class='add'>+         * Return failure, this will be healed as part of lookup</div><div class='add'>+         */</div><div class='add'>+        gf_msg_callingfn("quota", GF_LOG_DEBUG, 0, LG_MSG_QUOTA_XATTRS_MISSING,</div><div class='add'>+                         "Object quota "</div><div class='add'>+                         "xattrs missing: len = %d",</div><div class='add'>+                         data-&gt;len);</div><div class='add'>+        ret = -2;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+out:</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+quota_dict_get_inode_meta(dict_t *dict, char *key, const int keylen,</div><div class='add'>+                          quota_meta_t *meta)</div><div class='add'>+{</div><div class='add'>+    int32_t ret = -1;</div><div class='add'>+    data_t *data = NULL;</div><div class='add'>+</div><div class='add'>+    if (!dict || !key || !meta)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    data = dict_getn(dict, key, keylen);</div><div class='add'>+    if (!data || !data-&gt;data)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    ret = quota_data_to_meta(data, meta);</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+quota_dict_get_meta(dict_t *dict, char *key, const int keylen,</div><div class='add'>+                    quota_meta_t *meta)</div><div class='add'>+{</div><div class='add'>+    int32_t ret = -1;</div><div class='add'>+</div><div class='add'>+    ret = quota_dict_get_inode_meta(dict, key, keylen, meta);</div><div class='add'>+    if (ret == -2)</div><div class='add'>+        ret = 0;</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+quota_dict_set_meta(dict_t *dict, char *key, const quota_meta_t *meta,</div><div class='add'>+                    ia_type_t ia_type)</div><div class='add'>+{</div><div class='add'>+    int32_t ret = -ENOMEM;</div><div class='add'>+    quota_meta_t *value = NULL;</div><div class='add'>+</div><div class='add'>+    value = GF_MALLOC(sizeof(quota_meta_t), gf_common_quota_meta_t);</div><div class='add'>+    if (value == NULL) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    value-&gt;size = hton64(meta-&gt;size);</div><div class='add'>+    value-&gt;file_count = hton64(meta-&gt;file_count);</div><div class='add'>+    value-&gt;dir_count = hton64(meta-&gt;dir_count);</div><div class='add'>+</div><div class='add'>+    if (ia_type == IA_IFDIR) {</div><div class='add'>+        ret = dict_set_bin(dict, key, value, sizeof(*value));</div><div class='add'>+    } else {</div><div class='add'>+        /* For a file we don't need to store dir_count in the</div><div class='add'>+         * quota size xattr, so we set the len of the data in the dict</div><div class='add'>+         * as 128bits, so when the posix xattrop reads the dict, it only</div><div class='add'>+         * performs operations on size and file_count</div><div class='add'>+         */</div><div class='add'>+        ret = dict_set_bin(dict, key, value, sizeof(*value) - sizeof(int64_t));</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        gf_msg_callingfn("quota", GF_LOG_ERROR, 0, LG_MSG_DICT_SET_FAILED,</div><div class='add'>+                         "dict set failed");</div><div class='add'>+        GF_FREE(value);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+quota_conf_read_header(int fd, char *buf)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+    const int header_len = SLEN(QUOTA_CONF_HEADER);</div><div class='add'>+</div><div class='add'>+    ret = gf_nread(fd, buf, header_len);</div><div class='add'>+    if (ret &lt;= 0) {</div><div class='add'>+        goto out;</div><div class='add'>+    } else if (ret &gt; 0 &amp;&amp; ret != header_len) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    buf[header_len - 1] = 0;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (ret &lt; 0)</div><div class='add'>+        gf_msg_callingfn("quota", GF_LOG_ERROR, 0, LG_MSG_QUOTA_CONF_ERROR,</div><div class='add'>+                         "failed to read "</div><div class='add'>+                         "header from a quota conf");</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+quota_conf_read_version(int fd, float *version)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+    char buf[PATH_MAX] = "";</div><div class='add'>+    char *tail = NULL;</div><div class='add'>+    float value = 0.0f;</div><div class='add'>+</div><div class='add'>+    ret = quota_conf_read_header(fd, buf);</div><div class='add'>+    if (ret == 0) {</div><div class='add'>+        /* quota.conf is empty */</div><div class='add'>+        value = GF_QUOTA_CONF_VERSION;</div><div class='add'>+        goto out;</div><div class='add'>+    } else if (ret &lt; 0) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    value = strtof((buf + strlen(buf) - 3), &amp;tail);</div><div class='add'>+    if (tail[0] != '\0') {</div><div class='add'>+        ret = -1;</div><div class='add'>+        gf_msg_callingfn("quota", GF_LOG_ERROR, 0, LG_MSG_QUOTA_CONF_ERROR,</div><div class='add'>+                         "invalid quota conf"</div><div class='add'>+                         " version");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (ret &gt;= 0)</div><div class='add'>+        *version = value;</div><div class='add'>+    else</div><div class='add'>+        gf_msg_callingfn("quota", GF_LOG_ERROR, 0, LG_MSG_QUOTA_CONF_ERROR,</div><div class='add'>+                         "failed to "</div><div class='add'>+                         "read version from a quota conf header");</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+quota_conf_read_gfid(int fd, void *buf, char *type, float version)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    ret = gf_nread(fd, buf, 16);</div><div class='add'>+    if (ret &lt;= 0)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    if (ret != 16) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (version &gt;= 1.2f) {</div><div class='add'>+        ret = gf_nread(fd, type, 1);</div><div class='add'>+        if (ret != 1) {</div><div class='add'>+            ret = -1;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+        ret = 17;</div><div class='add'>+    } else {</div><div class='add'>+        *type = GF_QUOTA_CONF_TYPE_USAGE;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (ret &lt; 0)</div><div class='add'>+        gf_msg_callingfn("quota", GF_LOG_ERROR, 0, LG_MSG_QUOTA_CONF_ERROR,</div><div class='add'>+                         "failed to "</div><div class='add'>+                         "read gfid from a quota conf");</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+quota_conf_skip_header(int fd)</div><div class='add'>+{</div><div class='add'>+    return gf_skip_header_section(fd, strlen(QUOTA_CONF_HEADER));</div><div class='add'>+}</div><div class='head'>diff --git a/libglusterfs/src/rbthash.c b/libglusterfs/src/rbthash.c<br/>index b5e684def18..c90b5a21f44 100644<br/>--- a/<a href='/cgit/glusterfs.git/tree/libglusterfs/src/rbthash.c?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/rbthash.c</a><br/>+++ b/<a href='/cgit/glusterfs.git/tree/libglusterfs/src/rbthash.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>libglusterfs/src/rbthash.c</a></div><div class='hunk'>@@ -1,84 +1,73 @@</div><div class='ctx'> /*</div><div class='del'>-  Copyright (c) 2008-2009 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='add'>+  Copyright (c) 2008-2012 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='ctx'>   This file is part of GlusterFS.</div><div class='ctx'> </div><div class='del'>-  GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-  it under the terms of the GNU General Public License as published</div><div class='del'>-  by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-  or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-  GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-  WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-  General Public License for more details.</div><div class='del'>-</div><div class='del'>-  You should have received a copy of the GNU General Public License</div><div class='del'>-  along with this program.  If not, see</div><div class='del'>-  &lt;http://www.gnu.org/licenses/&gt;.</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='ctx'> */</div><div class='ctx'> </div><div class='del'>-</div><div class='del'>-#include "rbthash.h"</div><div class='add'>+#include "glusterfs/rbthash.h"</div><div class='ctx'> #include "rb.h"</div><div class='del'>-#include "locking.h"</div><div class='del'>-#include "mem-pool.h"</div><div class='del'>-#include "logging.h"</div><div class='add'>+#include "glusterfs/locking.h"</div><div class='add'>+#include "glusterfs/mem-pool.h"</div><div class='add'>+#include "glusterfs/logging.h"</div><div class='add'>+#include "glusterfs/libglusterfs-messages.h"</div><div class='ctx'> </div><div class='ctx'> #include &lt;pthread.h&gt;</div><div class='ctx'> #include &lt;string.h&gt;</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-rbthash_comparator (void *entry1, void *entry2, void *param)</div><div class='add'>+rbthash_comparator(void *entry1, void *entry2, void *param)</div><div class='ctx'> {</div><div class='del'>-        int             ret = 0;</div><div class='del'>-        rbthash_entry_t *e1 = NULL;</div><div class='del'>-        rbthash_entry_t *e2 = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    rbthash_entry_t *e1 = NULL;</div><div class='add'>+    rbthash_entry_t *e2 = NULL;</div><div class='ctx'> </div><div class='del'>-        if ((!entry1) || (!entry2) || (!param))</div><div class='del'>-                return -1;</div><div class='add'>+    if ((!entry1) || (!entry2) || (!param))</div><div class='add'>+        return -1;</div><div class='ctx'> </div><div class='del'>-        e1 = (rbthash_entry_t *)entry1;</div><div class='del'>-        e2 = (rbthash_entry_t *)entry2;</div><div class='add'>+    e1 = (rbthash_entry_t *)entry1;</div><div class='add'>+    e2 = (rbthash_entry_t *)entry2;</div><div class='ctx'> </div><div class='del'>-        if (e1-&gt;keylen != e2-&gt;keylen) {</div><div class='del'>-                if (e1-&gt;keylen &lt; e2-&gt;keylen)</div><div class='del'>-                        ret = -1;</div><div class='del'>-                else if (e1-&gt;keylen &gt; e2-&gt;keylen)</div><div class='del'>-                        ret = 1;</div><div class='del'>-        } else</div><div class='del'>-                ret = memcmp (e1-&gt;key, e2-&gt;key, e1-&gt;keylen);</div><div class='add'>+    if (e1-&gt;keylen != e2-&gt;keylen) {</div><div class='add'>+        if (e1-&gt;keylen &lt; e2-&gt;keylen)</div><div class='add'>+            ret = -1;</div><div class='add'>+        else if (e1-&gt;keylen &gt; e2-&gt;keylen)</div><div class='add'>+            ret = 1;</div><div class='add'>+    } else</div><div class='add'>+        ret = memcmp(e1-&gt;key, e2-&gt;key, e1-&gt;keylen);</div><div class='ctx'> </div><div class='del'>-        return ret;</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-__rbthash_init_buckets (rbthash_table_t *tbl, int buckets)</div><div class='add'>+__rbthash_init_buckets(rbthash_table_t *tbl, int buckets)</div><div class='ctx'> {</div><div class='del'>-        int     i = 0;</div><div class='del'>-        int     ret = -1;</div><div class='del'>-</div><div class='del'>-        if (!tbl)</div><div class='del'>-                return -1;</div><div class='del'>-</div><div class='del'>-        for (; i &lt; buckets; i++) {</div><div class='del'>-                LOCK_INIT (&amp;tbl-&gt;buckets[i].bucketlock);</div><div class='del'>-                tbl-&gt;buckets[i].bucket = rb_create ((rb_comparison_func *)rbthash_comparator, tbl, NULL);</div><div class='del'>-                if (!tbl-&gt;buckets[i].bucket) {</div><div class='del'>-                        gf_log (GF_RBTHASH, GF_LOG_ERROR, "Failed to create rb"</div><div class='del'>-                                " table bucket");</div><div class='del'>-                        ret = -1;</div><div class='del'>-                        goto err;</div><div class='del'>-                }</div><div class='add'>+    int i = 0;</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    if (!tbl)</div><div class='add'>+        return -1;</div><div class='add'>+</div><div class='add'>+    for (; i &lt; buckets; i++) {</div><div class='add'>+        LOCK_INIT(&amp;tbl-&gt;buckets[i].bucketlock);</div><div class='add'>+        tbl-&gt;buckets[i].bucket = rb_create(</div><div class='add'>+            (rb_comparison_func *)rbthash_comparator, tbl, NULL);</div><div class='add'>+        if (!tbl-&gt;buckets[i].bucket) {</div><div class='add'>+            gf_smsg(GF_RBTHASH, GF_LOG_ERROR, 0, LG_MSG_RB_TABLE_CREATE_FAILED,</div><div class='add'>+                    NULL);</div><div class='add'>+            ret = -1;</div><div class='add'>+            goto err;</div><div class='ctx'>         }</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        ret = 0;</div><div class='add'>+    ret = 0;</div><div class='ctx'> err:</div><div class='del'>-        return ret;</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> /*</div><div class='ctx'>  * rbthash_table_init - Initialize a RBT based hash table</div><div class='ctx'>  * @buckets - Number of buckets in the hash table</div><div class='hunk'>@@ -90,337 +79,376 @@ err:</div><div class='ctx'>  */</div><div class='ctx'> </div><div class='ctx'> rbthash_table_t *</div><div class='del'>-rbthash_table_init (int buckets, rbt_hasher_t hfunc,</div><div class='del'>-                    rbt_data_destroyer_t dfunc,</div><div class='del'>-                    unsigned long expected_entries,</div><div class='del'>-                    struct mem_pool *entrypool)</div><div class='add'>+rbthash_table_init(glusterfs_ctx_t *ctx, int buckets, rbt_hasher_t hfunc,</div><div class='add'>+                   rbt_data_destroyer_t dfunc, unsigned long expected_entries,</div><div class='add'>+                   struct mem_pool *entrypool)</div><div class='ctx'> {</div><div class='del'>-        rbthash_table_t         *newtab = NULL;</div><div class='del'>-        int                     ret = -1;</div><div class='del'>-</div><div class='del'>-        if (!hfunc) {</div><div class='del'>-                gf_log (GF_RBTHASH, GF_LOG_ERROR, "Hash function not given");</div><div class='del'>-                return NULL;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (!entrypool &amp;&amp; !expected_entries) {</div><div class='del'>-                gf_log (GF_RBTHASH, GF_LOG_ERROR,</div><div class='del'>-                        "Both mem-pool and expected entries not provided");</div><div class='del'>-                return NULL;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (entrypool &amp;&amp; expected_entries) {</div><div class='del'>-                gf_log (GF_RBTHASH, GF_LOG_ERROR,</div><div class='del'>-                        "Both mem-pool and expected entries are provided");</div><div class='del'>-                return NULL;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-        newtab = GF_CALLOC (1, sizeof (*newtab),</div><div class='del'>-                            gf_common_mt_rbthash_table_t);</div><div class='del'>-        if (!newtab)</div><div class='del'>-                return NULL;</div><div class='del'>-</div><div class='del'>-        newtab-&gt;buckets = GF_CALLOC (buckets, sizeof (struct rbthash_bucket),</div><div class='del'>-                                     gf_common_mt_rbthash_bucket);</div><div class='del'>-        if (!newtab-&gt;buckets) {</div><div class='del'>-                gf_log (GF_RBTHASH, GF_LOG_ERROR, "Failed to allocate memory");</div><div class='del'>-                goto free_newtab;</div><div class='add'>+    rbthash_table_t *newtab = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    if (!hfunc) {</div><div class='add'>+        gf_smsg(GF_RBTHASH, GF_LOG_ERROR, 0, LG_MSG_HASH_FUNC_ERROR, NULL);</div><div class='add'>+        return NULL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (!entrypool &amp;&amp; !expected_entries) {</div><div class='add'>+        gf_smsg(GF_RBTHASH, GF_LOG_ERROR, 0, LG_MSG_ENTRIES_NOT_PROVIDED, NULL);</div><div class='add'>+        return NULL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (entrypool &amp;&amp; expected_entries) {</div><div class='add'>+        gf_smsg(GF_RBTHASH, GF_LOG_ERROR, 0, LG_MSG_ENTRIES_PROVIDED, NULL);</div><div class='add'>+        return NULL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    newtab = GF_CALLOC(1, sizeof(*newtab), gf_common_mt_rbthash_table_t);</div><div class='add'>+    if (!newtab)</div><div class='add'>+        return NULL;</div><div class='add'>+</div><div class='add'>+    newtab-&gt;buckets = GF_CALLOC(buckets, sizeof(struct rbthash_bucket),</div><div class='add'>+                                gf_common_mt_rbthash_bucket);</div><div class='add'>+    if (!newtab-&gt;buckets) {</div><div class='add'>+        goto free_newtab;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (expected_entries) {</div><div class='add'>+        newtab-&gt;entrypool = mem_pool_new_ctx(ctx, rbthash_entry_t,</div><div class='add'>+                                             expected_entries);</div><div class='add'>+        if (!newtab-&gt;entrypool) {</div><div class='add'>+            goto free_buckets;</div><div class='ctx'>         }</div><div class='del'>-</div><div class='del'>-        if (expected_entries) {</div><div class='del'>-                newtab-&gt;entrypool =</div><div class='del'>-                        mem_pool_new (rbthash_entry_t, expected_entries);</div><div class='del'>-                if (!newtab-&gt;entrypool) {</div><div class='del'>-                        gf_log (GF_RBTHASH, GF_LOG_ERROR,</div><div class='del'>-                                "Failed to allocate mem-pool");</div><div class='del'>-                        goto free_buckets;</div><div class='del'>-                }</div><div class='del'>-                newtab-&gt;pool_alloced = _gf_true;</div><div class='del'>-        } else {</div><div class='del'>-                newtab-&gt;entrypool = entrypool;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        LOCK_INIT (&amp;newtab-&gt;tablelock);</div><div class='del'>-        newtab-&gt;numbuckets = buckets;</div><div class='del'>-        ret = __rbthash_init_buckets (newtab, buckets);</div><div class='del'>-</div><div class='del'>-        if (ret == -1) {</div><div class='del'>-                gf_log (GF_RBTHASH, GF_LOG_ERROR, "Failed to init buckets");</div><div class='del'>-                if (newtab-&gt;pool_alloced)</div><div class='del'>-                        mem_pool_destroy (newtab-&gt;entrypool);</div><div class='del'>-        } else {</div><div class='del'>-                gf_log (GF_RBTHASH, GF_LOG_TRACE, "Inited hash table: buckets:"</div><div class='del'>-                        " %d", buckets);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        newtab-&gt;hashfunc = hfunc;</div><div class='del'>-        newtab-&gt;dfunc = dfunc;</div><div class='add'>+        newtab-&gt;pool_alloced = _gf_true;</div><div class='add'>+    } else {</div><div class='add'>+        newtab-&gt;entrypool = entrypool;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    LOCK_INIT(&amp;newtab-&gt;tablelock);</div><div class='add'>+    INIT_LIST_HEAD(&amp;newtab-&gt;list);</div><div class='add'>+    newtab-&gt;numbuckets = buckets;</div><div class='add'>+    ret = __rbthash_init_buckets(newtab, buckets);</div><div class='add'>+</div><div class='add'>+    if (ret == -1) {</div><div class='add'>+        gf_smsg(GF_RBTHASH, GF_LOG_ERROR, 0, LG_MSG_RBTHASH_INIT_BUCKET_FAILED,</div><div class='add'>+                NULL);</div><div class='add'>+        if (newtab-&gt;pool_alloced)</div><div class='add'>+            mem_pool_destroy(newtab-&gt;entrypool);</div><div class='add'>+    } else {</div><div class='add'>+        gf_msg_trace(GF_RBTHASH, 0,</div><div class='add'>+                     "Inited hash table: buckets:"</div><div class='add'>+                     " %d",</div><div class='add'>+                     buckets);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    newtab-&gt;hashfunc = hfunc;</div><div class='add'>+    newtab-&gt;dfunc = dfunc;</div><div class='ctx'> </div><div class='ctx'> free_buckets:</div><div class='del'>-        if (ret == -1)</div><div class='del'>-                GF_FREE (newtab-&gt;buckets);</div><div class='add'>+    if (ret == -1)</div><div class='add'>+        GF_FREE(newtab-&gt;buckets);</div><div class='ctx'> </div><div class='ctx'> free_newtab:</div><div class='del'>-        if (ret == -1) {</div><div class='del'>-                GF_FREE (newtab);</div><div class='del'>-                newtab = NULL;</div><div class='del'>-        }</div><div class='add'>+    if (ret == -1) {</div><div class='add'>+        GF_FREE(newtab);</div><div class='add'>+        newtab = NULL;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        return newtab;</div><div class='add'>+    return newtab;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> rbthash_entry_t *</div><div class='del'>-rbthash_init_entry (rbthash_table_t *tbl, void *data, void *key, int keylen)</div><div class='add'>+rbthash_init_entry(rbthash_table_t *tbl, void *data, void *key, int keylen)</div><div class='ctx'> {</div><div class='del'>-        int             ret = -1;</div><div class='del'>-        rbthash_entry_t *entry = NULL;</div><div class='del'>-</div><div class='del'>-        if ((!tbl) || (!data) || (!key))</div><div class='del'>-                return NULL;</div><div class='del'>-</div><div class='del'>-        entry = mem_get (tbl-&gt;entrypool);</div><div class='del'>-        if (!entry) {</div><div class='del'>-                gf_log (GF_RBTHASH, GF_LOG_ERROR, "Failed to get entry from"</div><div class='del'>-                        " mem-pool");</div><div class='del'>-                goto ret;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        entry-&gt;data = data;</div><div class='del'>-        entry-&gt;key = GF_CALLOC (keylen, sizeof (char), gf_common_mt_char);</div><div class='del'>-        if (!entry-&gt;key) {</div><div class='del'>-                gf_log (GF_RBTHASH, GF_LOG_ERROR, "Memory allocation failed");</div><div class='del'>-                goto free_entry;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        memcpy (entry-&gt;key, key, keylen);</div><div class='del'>-        entry-&gt;keylen = keylen;</div><div class='del'>-        entry-&gt;keyhash = tbl-&gt;hashfunc (entry-&gt;key, entry-&gt;keylen);</div><div class='del'>-        gf_log (GF_RBTHASH, GF_LOG_TRACE, "HASH: %u", entry-&gt;keyhash);</div><div class='del'>-</div><div class='del'>-        ret = 0;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    rbthash_entry_t *entry = NULL;</div><div class='add'>+</div><div class='add'>+    if ((!tbl) || (!data) || (!key))</div><div class='add'>+        return NULL;</div><div class='add'>+</div><div class='add'>+    entry = mem_get(tbl-&gt;entrypool);</div><div class='add'>+    if (!entry) {</div><div class='add'>+        gf_smsg(GF_RBTHASH, GF_LOG_ERROR, 0, LG_MSG_RBTHASH_GET_ENTRY_FAILED,</div><div class='add'>+                NULL);</div><div class='add'>+        goto ret;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    entry-&gt;data = data;</div><div class='add'>+    entry-&gt;key = GF_MALLOC(keylen, gf_common_mt_char);</div><div class='add'>+    if (!entry-&gt;key) {</div><div class='add'>+        goto free_entry;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    INIT_LIST_HEAD(&amp;entry-&gt;list);</div><div class='add'>+    memcpy(entry-&gt;key, key, keylen);</div><div class='add'>+    entry-&gt;keylen = keylen;</div><div class='add'>+    entry-&gt;keyhash = tbl-&gt;hashfunc(entry-&gt;key, entry-&gt;keylen);</div><div class='add'>+    gf_msg_trace(GF_RBTHASH, 0, "HASH: %u", entry-&gt;keyhash);</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='ctx'> free_entry:</div><div class='del'>-        if (ret == -1) {</div><div class='del'>-                mem_put (tbl-&gt;entrypool, entry);</div><div class='del'>-                entry = NULL;</div><div class='del'>-        }</div><div class='add'>+    if (ret == -1) {</div><div class='add'>+        mem_put(entry);</div><div class='add'>+        entry = NULL;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='ctx'> ret:</div><div class='del'>-        return entry;</div><div class='add'>+    return entry;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> void</div><div class='del'>-rbthash_deinit_entry (rbthash_table_t *tbl, rbthash_entry_t *entry)</div><div class='add'>+rbthash_deinit_entry(rbthash_table_t *tbl, rbthash_entry_t *entry)</div><div class='ctx'> {</div><div class='add'>+    if (!entry)</div><div class='add'>+        return;</div><div class='ctx'> </div><div class='del'>-        if (!entry)</div><div class='del'>-                return;</div><div class='add'>+    GF_FREE(entry-&gt;key);</div><div class='ctx'> </div><div class='del'>-        if (entry-&gt;key)</div><div class='del'>-                GF_FREE (entry-&gt;key);</div><div class='add'>+    if (tbl) {</div><div class='add'>+        if ((entry-&gt;data) &amp;&amp; (tbl-&gt;dfunc))</div><div class='add'>+            tbl-&gt;dfunc(entry-&gt;data);</div><div class='ctx'> </div><div class='del'>-        if (tbl) {</div><div class='del'>-                if ((entry-&gt;data) &amp;&amp; (tbl-&gt;dfunc))</div><div class='del'>-                        tbl-&gt;dfunc (entry-&gt;data);</div><div class='del'>-                mem_put (tbl-&gt;entrypool, entry);</div><div class='add'>+        LOCK(&amp;tbl-&gt;tablelock);</div><div class='add'>+        {</div><div class='add'>+            list_del_init(&amp;entry-&gt;list);</div><div class='ctx'>         }</div><div class='add'>+        UNLOCK(&amp;tbl-&gt;tablelock);</div><div class='ctx'> </div><div class='del'>-        return;</div><div class='del'>-}</div><div class='add'>+        mem_put(entry);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='add'>+    return;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-inline struct rbthash_bucket *</div><div class='del'>-rbthash_entry_bucket (rbthash_table_t *tbl, rbthash_entry_t * entry)</div><div class='add'>+static struct rbthash_bucket *</div><div class='add'>+rbthash_entry_bucket(rbthash_table_t *tbl, rbthash_entry_t *entry)</div><div class='ctx'> {</div><div class='del'>-        int     nbucket = 0;</div><div class='add'>+    int nbucket = 0;</div><div class='ctx'> </div><div class='del'>-        nbucket = (entry-&gt;keyhash % tbl-&gt;numbuckets);</div><div class='del'>-        gf_log (GF_RBTHASH, GF_LOG_TRACE, "BUCKET: %d", nbucket);</div><div class='del'>-        return &amp;tbl-&gt;buckets[nbucket];</div><div class='add'>+    nbucket = (entry-&gt;keyhash % tbl-&gt;numbuckets);</div><div class='add'>+    gf_msg_trace(GF_RBTHASH, 0, "BUCKET: %d", nbucket);</div><div class='add'>+    return &amp;tbl-&gt;buckets[nbucket];</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-rbthash_insert_entry (rbthash_table_t *tbl, rbthash_entry_t *entry)</div><div class='add'>+rbthash_insert_entry(rbthash_table_t *tbl, rbthash_entry_t *entry)</div><div class='ctx'> {</div><div class='del'>-        struct rbthash_bucket   *bucket = NULL;</div><div class='del'>-        int                     ret = -1;</div><div class='del'>-</div><div class='del'>-        if ((!tbl) || (!entry))</div><div class='del'>-                return -1;</div><div class='del'>-</div><div class='del'>-        bucket = rbthash_entry_bucket (tbl, entry);</div><div class='del'>-        if (!bucket) {</div><div class='del'>-                gf_log (GF_RBTHASH, GF_LOG_ERROR, "Failed to get bucket");</div><div class='del'>-                goto err;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        ret = 0;</div><div class='del'>-        LOCK (&amp;bucket-&gt;bucketlock);</div><div class='del'>-        {</div><div class='del'>-                if (!rb_probe (bucket-&gt;bucket, (void *)entry)) {</div><div class='del'>-                        gf_log (GF_RBTHASH, GF_LOG_ERROR, "Failed to insert"</div><div class='del'>-                                " entry");</div><div class='del'>-                        ret = -1;</div><div class='del'>-                }</div><div class='add'>+    struct rbthash_bucket *bucket = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    if ((!tbl) || (!entry))</div><div class='add'>+        return -1;</div><div class='add'>+</div><div class='add'>+    bucket = rbthash_entry_bucket(tbl, entry);</div><div class='add'>+    if (!bucket) {</div><div class='add'>+        gf_smsg(GF_RBTHASH, GF_LOG_ERROR, 0, LG_MSG_RBTHASH_GET_BUCKET_FAILED,</div><div class='add'>+                NULL);</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+    LOCK(&amp;bucket-&gt;bucketlock);</div><div class='add'>+    {</div><div class='add'>+        if (!rb_probe(bucket-&gt;bucket, (void *)entry)) {</div><div class='add'>+            UNLOCK(&amp;bucket-&gt;bucketlock);</div><div class='add'>+            gf_smsg(GF_RBTHASH, GF_LOG_ERROR, 0, LG_MSG_RBTHASH_INSERT_FAILED,</div><div class='add'>+                    NULL);</div><div class='add'>+            ret = -1;</div><div class='add'>+            goto err;</div><div class='ctx'>         }</div><div class='del'>-        UNLOCK (&amp;bucket-&gt;bucketlock);</div><div class='add'>+    }</div><div class='add'>+    UNLOCK(&amp;bucket-&gt;bucketlock);</div><div class='ctx'> </div><div class='ctx'> err:</div><div class='del'>-        return ret;</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-rbthash_insert (rbthash_table_t *tbl, void *data, void *key, int keylen)</div><div class='add'>+rbthash_insert(rbthash_table_t *tbl, void *data, void *key, int keylen)</div><div class='ctx'> {</div><div class='del'>-        rbthash_entry_t         *entry = NULL;</div><div class='del'>-        int                     ret = -1;</div><div class='del'>-</div><div class='del'>-        if ((!tbl) || (!data) || (!key))</div><div class='del'>-                return -1;</div><div class='del'>-</div><div class='del'>-        entry = rbthash_init_entry (tbl, data, key, keylen);</div><div class='del'>-        if (!entry) {</div><div class='del'>-                gf_log (GF_RBTHASH, GF_LOG_ERROR, "Failed to init entry");</div><div class='del'>-                goto err;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        ret = rbthash_insert_entry (tbl, entry);</div><div class='del'>-</div><div class='del'>-        if (ret == -1) {</div><div class='del'>-                gf_log (GF_RBTHASH, GF_LOG_ERROR, "Failed to insert entry");</div><div class='del'>-                rbthash_deinit_entry (tbl, entry);</div><div class='del'>-        }</div><div class='add'>+    rbthash_entry_t *entry = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    if ((!tbl) || (!data) || (!key))</div><div class='add'>+        return -1;</div><div class='add'>+</div><div class='add'>+    entry = rbthash_init_entry(tbl, data, key, keylen);</div><div class='add'>+    if (!entry) {</div><div class='add'>+        gf_smsg(GF_RBTHASH, GF_LOG_ERROR, 0, LG_MSG_RBTHASH_INIT_ENTRY_FAILED,</div><div class='add'>+                NULL);</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = rbthash_insert_entry(tbl, entry);</div><div class='add'>+</div><div class='add'>+    if (ret == -1) {</div><div class='add'>+        gf_smsg(GF_RBTHASH, GF_LOG_ERROR, 0, LG_MSG_RBTHASH_INSERT_FAILED,</div><div class='add'>+                NULL);</div><div class='add'>+        rbthash_deinit_entry(tbl, entry);</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;tbl-&gt;tablelock);</div><div class='add'>+    {</div><div class='add'>+        list_add_tail(&amp;entry-&gt;list, &amp;tbl-&gt;list);</div><div class='add'>+    }</div><div class='add'>+    UNLOCK(&amp;tbl-&gt;tablelock);</div><div class='ctx'> </div><div class='ctx'> err:</div><div class='del'>-        return ret;</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-inline struct rbthash_bucket *</div><div class='del'>-rbthash_key_bucket (rbthash_table_t *tbl, void *key, int keylen)</div><div class='add'>+static struct rbthash_bucket *</div><div class='add'>+rbthash_key_bucket(rbthash_table_t *tbl, void *key, int keylen)</div><div class='ctx'> {</div><div class='del'>-        uint32_t        keyhash = 0;</div><div class='del'>-        int             nbucket = 0;</div><div class='add'>+    uint32_t keyhash = 0;</div><div class='add'>+    int nbucket = 0;</div><div class='ctx'> </div><div class='del'>-        if ((!tbl) || (!key))</div><div class='del'>-                return NULL;</div><div class='add'>+    if ((!tbl) || (!key))</div><div class='add'>+        return NULL;</div><div class='ctx'> </div><div class='del'>-        keyhash =  tbl-&gt;hashfunc (key, keylen);</div><div class='del'>-        gf_log (GF_RBTHASH, GF_LOG_TRACE, "HASH: %u", keyhash);</div><div class='del'>-        nbucket = (keyhash % tbl-&gt;numbuckets);</div><div class='del'>-        gf_log (GF_RBTHASH, GF_LOG_TRACE, "BUCKET: %u", nbucket);</div><div class='add'>+    keyhash = tbl-&gt;hashfunc(key, keylen);</div><div class='add'>+    gf_msg_trace(GF_RBTHASH, 0, "HASH: %u", keyhash);</div><div class='add'>+    nbucket = (keyhash % tbl-&gt;numbuckets);</div><div class='add'>+    gf_msg_trace(GF_RBTHASH, 0, "BUCKET: %u", nbucket);</div><div class='ctx'> </div><div class='del'>-        return &amp;tbl-&gt;buckets[nbucket];</div><div class='add'>+    return &amp;tbl-&gt;buckets[nbucket];</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> void *</div><div class='del'>-rbthash_get (rbthash_table_t *tbl, void *key, int keylen)</div><div class='add'>+rbthash_get(rbthash_table_t *tbl, void *key, int keylen)</div><div class='ctx'> {</div><div class='del'>-        struct rbthash_bucket           *bucket = NULL;</div><div class='del'>-        rbthash_entry_t                 *entry = NULL;</div><div class='del'>-        rbthash_entry_t                 searchentry = {0, };</div><div class='del'>-</div><div class='del'>-        if ((!tbl) || (!key))</div><div class='del'>-                return NULL;</div><div class='del'>-</div><div class='del'>-        bucket = rbthash_key_bucket (tbl, key, keylen);</div><div class='del'>-        if (!bucket) {</div><div class='del'>-                gf_log (GF_RBTHASH, GF_LOG_ERROR, "Failed to get bucket");</div><div class='del'>-                return NULL;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        searchentry.key = key;</div><div class='del'>-        searchentry.keylen = keylen;</div><div class='del'>-        LOCK (&amp;bucket-&gt;bucketlock);</div><div class='del'>-        {</div><div class='del'>-                entry = rb_find (bucket-&gt;bucket, &amp;searchentry);</div><div class='del'>-        }</div><div class='del'>-        UNLOCK (&amp;bucket-&gt;bucketlock);</div><div class='del'>-</div><div class='del'>-        if (!entry)</div><div class='del'>-                return NULL;</div><div class='del'>-</div><div class='del'>-        return entry-&gt;data;</div><div class='add'>+    struct rbthash_bucket *bucket = NULL;</div><div class='add'>+    rbthash_entry_t *entry = NULL;</div><div class='add'>+    rbthash_entry_t searchentry = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    if ((!tbl) || (!key))</div><div class='add'>+        return NULL;</div><div class='add'>+</div><div class='add'>+    bucket = rbthash_key_bucket(tbl, key, keylen);</div><div class='add'>+    if (!bucket) {</div><div class='add'>+        gf_smsg(GF_RBTHASH, GF_LOG_ERROR, 0, LG_MSG_RBTHASH_GET_BUCKET_FAILED,</div><div class='add'>+                NULL);</div><div class='add'>+        return NULL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    searchentry.key = key;</div><div class='add'>+    searchentry.keylen = keylen;</div><div class='add'>+    LOCK(&amp;bucket-&gt;bucketlock);</div><div class='add'>+    {</div><div class='add'>+        entry = rb_find(bucket-&gt;bucket, &amp;searchentry);</div><div class='add'>+    }</div><div class='add'>+    UNLOCK(&amp;bucket-&gt;bucketlock);</div><div class='add'>+</div><div class='add'>+    if (!entry)</div><div class='add'>+        return NULL;</div><div class='add'>+</div><div class='add'>+    return entry-&gt;data;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> void *</div><div class='del'>-rbthash_remove (rbthash_table_t *tbl, void *key, int keylen)</div><div class='add'>+rbthash_remove(rbthash_table_t *tbl, void *key, int keylen)</div><div class='ctx'> {</div><div class='del'>-        struct rbthash_bucket   *bucket = NULL;</div><div class='del'>-        rbthash_entry_t         *entry = NULL;</div><div class='del'>-        rbthash_entry_t         searchentry = {0, };</div><div class='del'>-        void                    *dataref = NULL;</div><div class='del'>-</div><div class='del'>-        if ((!tbl) || (!key))</div><div class='del'>-                return NULL;</div><div class='del'>-</div><div class='del'>-        bucket = rbthash_key_bucket (tbl, key, keylen);</div><div class='del'>-        if (!bucket) {</div><div class='del'>-                gf_log (GF_RBTHASH, GF_LOG_ERROR, "Failed to get bucket");</div><div class='del'>-                return NULL;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        searchentry.key = key;</div><div class='del'>-        searchentry.keylen = keylen;</div><div class='del'>-</div><div class='del'>-        LOCK (&amp;bucket-&gt;bucketlock);</div><div class='del'>-        {</div><div class='del'>-                entry = rb_delete (bucket-&gt;bucket, &amp;searchentry);</div><div class='del'>-        }</div><div class='del'>-        UNLOCK (&amp;bucket-&gt;bucketlock);</div><div class='del'>-</div><div class='del'>-        if (!entry)</div><div class='del'>-                return NULL;</div><div class='add'>+    struct rbthash_bucket *bucket = NULL;</div><div class='add'>+    rbthash_entry_t *entry = NULL;</div><div class='add'>+    rbthash_entry_t searchentry = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    void *dataref = NULL;</div><div class='add'>+</div><div class='add'>+    if ((!tbl) || (!key))</div><div class='add'>+        return NULL;</div><div class='add'>+</div><div class='add'>+    bucket = rbthash_key_bucket(tbl, key, keylen);</div><div class='add'>+    if (!bucket) {</div><div class='add'>+        gf_smsg(GF_RBTHASH, GF_LOG_ERROR, 0, LG_MSG_RBTHASH_GET_BUCKET_FAILED,</div><div class='add'>+                NULL);</div><div class='add'>+        return NULL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    searchentry.key = key;</div><div class='add'>+    searchentry.keylen = keylen;</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;bucket-&gt;bucketlock);</div><div class='add'>+    {</div><div class='add'>+        entry = rb_delete(bucket-&gt;bucket, &amp;searchentry);</div><div class='add'>+    }</div><div class='add'>+    UNLOCK(&amp;bucket-&gt;bucketlock);</div><div class='add'>+</div><div class='add'>+    if (!entry)</div><div class='add'>+        return NULL;</div><div class='add'>+</div><div class='add'>+    GF_FREE(entry-&gt;key);</div><div class='add'>+    dataref = entry-&gt;data;</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;tbl-&gt;tablelock);</div><div class='add'>+    {</div><div class='add'>+        list_del_init(&amp;entry-&gt;list);</div><div class='add'>+    }</div><div class='add'>+    UNLOCK(&amp;tbl-&gt;tablelock);</div><div class='add'>+</div><div class='add'>+    mem_put(entry);</div><div class='add'>+</div><div class='add'>+    return dataref;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        GF_FREE (entry-&gt;key);</div><div class='del'>-        dataref = entry-&gt;data;</div><div class='del'>-        mem_put (tbl-&gt;entrypool, entry);</div><div class='add'>+void</div><div class='add'>+rbthash_entry_deiniter(void *entry, void *rbparam)</div><div class='add'>+{</div><div class='add'>+    if (!entry)</div><div class='add'>+        return;</div><div class='ctx'> </div><div class='del'>-        return dataref;</div><div class='add'>+    rbthash_deinit_entry(rbparam, entry);</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> void</div><div class='del'>-rbthash_entry_deiniter (void *entry, void *rbparam)</div><div class='add'>+rbthash_table_destroy_buckets(rbthash_table_t *tbl)</div><div class='ctx'> {</div><div class='del'>-        if (!entry)</div><div class='del'>-                return;</div><div class='add'>+    int x = 0;</div><div class='add'>+    if (!tbl)</div><div class='add'>+        return;</div><div class='ctx'> </div><div class='del'>-        rbthash_deinit_entry (rbparam, entry);</div><div class='del'>-}</div><div class='add'>+    for (; x &lt; tbl-&gt;numbuckets; x++) {</div><div class='add'>+        LOCK_DESTROY(&amp;tbl-&gt;buckets[x].bucketlock);</div><div class='add'>+        rb_destroy(tbl-&gt;buckets[x].bucket, rbthash_entry_deiniter);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='add'>+    return;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> void</div><div class='del'>-rbthash_table_destroy_buckets (rbthash_table_t *tbl)</div><div class='add'>+rbthash_table_destroy(rbthash_table_t *tbl)</div><div class='ctx'> {</div><div class='del'>-        int x = 0;</div><div class='del'>-        if (!tbl)</div><div class='del'>-                return;</div><div class='add'>+    if (!tbl)</div><div class='add'>+        return;</div><div class='ctx'> </div><div class='del'>-        for (;x &lt; tbl-&gt;numbuckets; x++) {</div><div class='del'>-                LOCK_DESTROY (&amp;tbl-&gt;buckets[x].bucketlock);</div><div class='del'>-                rb_destroy (tbl-&gt;buckets[x].bucket, rbthash_entry_deiniter);</div><div class='del'>-        }</div><div class='add'>+    rbthash_table_destroy_buckets(tbl);</div><div class='add'>+    if (tbl-&gt;pool_alloced)</div><div class='add'>+        mem_pool_destroy(tbl-&gt;entrypool);</div><div class='ctx'> </div><div class='del'>-        return;</div><div class='add'>+    GF_FREE(tbl-&gt;buckets);</div><div class='add'>+    GF_FREE(tbl);</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> void</div><div class='del'>-rbthash_table_destroy (rbthash_table_t *tbl)</div><div class='add'>+rbthash_table_traverse(rbthash_table_t *tbl, rbt_traverse_t traverse,</div><div class='add'>+                       void *mydata)</div><div class='ctx'> {</div><div class='del'>-        if (!tbl)</div><div class='del'>-                return;</div><div class='add'>+    rbthash_entry_t *entry = NULL;</div><div class='ctx'> </div><div class='del'>-        rbthash_table_destroy_buckets (tbl);</div><div class='del'>-        if (tbl-&gt;pool_alloced)</div><div class='del'>-                mem_pool_destroy (tbl-&gt;entrypool);</div><div class='add'>+    if ((tbl == NULL) || (traverse == NULL)) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        GF_FREE (tbl-&gt;buckets);</div><div class='del'>-        GF_FREE (tbl);</div><div class='del'>-}</div><div class='add'>+    LOCK(&amp;tbl-&gt;tablelock);</div><div class='add'>+    {</div><div class='add'>+        list_for_each_entry(entry, &amp;tbl-&gt;list, list)</div><div class='add'>+        {</div><div class='add'>+            traverse(entry-&gt;data, mydata);</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    UNLOCK(&amp;tbl-&gt;tablelock);</div><div class='ctx'> </div><div class='add'>+out:</div><div class='add'>+    return;</div><div class='add'>+}</div><div class='head'>diff --git a/libglusterfs/src/rbthash.h b/libglusterfs/src/rbthash.h<br/>deleted file mode 100644<br/>index e4c11e51cee..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/libglusterfs/src/rbthash.h?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/rbthash.h</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,78 +0,0 @@</div><div class='del'>-/*</div><div class='del'>-  Copyright (c) 2008-2009 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='del'>-  This file is part of GlusterFS.</div><div class='del'>-</div><div class='del'>-  GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-  it under the terms of the GNU General Public License as published</div><div class='del'>-  by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-  or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-  GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-  WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-  General Public License for more details.</div><div class='del'>-</div><div class='del'>-  You should have received a copy of the GNU General Public License</div><div class='del'>-  along with this program.  If not, see</div><div class='del'>-  &lt;http://www.gnu.org/licenses/&gt;.</div><div class='del'>-*/</div><div class='del'>-</div><div class='del'>-#ifndef __RBTHASH_TABLE_H_</div><div class='del'>-#define __RBTHASH_TABLE_H_</div><div class='del'>-#include "rb.h"</div><div class='del'>-#include "locking.h"</div><div class='del'>-#include "mem-pool.h"</div><div class='del'>-#include "logging.h"</div><div class='del'>-#include "common-utils.h"</div><div class='del'>-</div><div class='del'>-#include &lt;pthread.h&gt;</div><div class='del'>-</div><div class='del'>-#define GF_RBTHASH_MEMPOOL      16384 //1048576</div><div class='del'>-#define GF_RBTHASH              "rbthash"</div><div class='del'>-</div><div class='del'>-struct rbthash_bucket {</div><div class='del'>-        struct rb_table *bucket;</div><div class='del'>-        gf_lock_t       bucketlock;</div><div class='del'>-};</div><div class='del'>-</div><div class='del'>-typedef struct rbthash_entry {</div><div class='del'>-        void            *data;</div><div class='del'>-        void            *key;</div><div class='del'>-        int             keylen;</div><div class='del'>-        uint32_t        keyhash;</div><div class='del'>-} rbthash_entry_t;</div><div class='del'>-</div><div class='del'>-typedef uint32_t (*rbt_hasher_t) (void *data, int len);</div><div class='del'>-typedef void (*rbt_data_destroyer_t) (void *data);</div><div class='del'>-</div><div class='del'>-typedef struct rbthash_table {</div><div class='del'>-        int                     size;</div><div class='del'>-        int                     numbuckets;</div><div class='del'>-        struct mem_pool         *entrypool;</div><div class='del'>-        gf_lock_t               tablelock;</div><div class='del'>-        struct rbthash_bucket   *buckets;</div><div class='del'>-        rbt_hasher_t            hashfunc;</div><div class='del'>-        rbt_data_destroyer_t    dfunc;</div><div class='del'>-        gf_boolean_t            pool_alloced;</div><div class='del'>-} rbthash_table_t;</div><div class='del'>-</div><div class='del'>-extern rbthash_table_t *</div><div class='del'>-rbthash_table_init (int buckets, rbt_hasher_t hfunc,</div><div class='del'>-                    rbt_data_destroyer_t dfunc, unsigned long expected_entries,</div><div class='del'>-                    struct mem_pool *entrypool);</div><div class='del'>-</div><div class='del'>-extern int</div><div class='del'>-rbthash_insert (rbthash_table_t *tbl, void *data, void *key, int keylen);</div><div class='del'>-</div><div class='del'>-extern void *</div><div class='del'>-rbthash_get (rbthash_table_t *tbl, void *key, int keylen);</div><div class='del'>-</div><div class='del'>-extern void *</div><div class='del'>-rbthash_remove (rbthash_table_t *tbl, void *key, int keylen);</div><div class='del'>-</div><div class='del'>-extern void *</div><div class='del'>-rbthash_replace (rbthash_table_t *tbl, void *key, int keylen, void *newdata);</div><div class='del'>-</div><div class='del'>-extern void</div><div class='del'>-rbthash_table_destroy (rbthash_table_t *tbl);</div><div class='del'>-#endif</div><div class='head'>diff --git a/libglusterfs/src/refcount.c b/libglusterfs/src/refcount.c<br/>new file mode 100644<br/>index 00000000000..d5a5a82fa0f<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/libglusterfs/src/refcount.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>libglusterfs/src/refcount.c</a></div><div class='hunk'>@@ -0,0 +1,108 @@</div><div class='add'>+/*</div><div class='add'>+  Copyright (c) 2015 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#include "glusterfs/common-utils.h"</div><div class='add'>+#include "glusterfs/refcount.h"</div><div class='add'>+</div><div class='add'>+#ifndef REFCOUNT_NEEDS_LOCK</div><div class='add'>+</div><div class='add'>+void *</div><div class='add'>+_gf_ref_get(gf_ref_t *ref)</div><div class='add'>+{</div><div class='add'>+    unsigned int cnt = __sync_fetch_and_add(&amp;ref-&gt;cnt, 1);</div><div class='add'>+</div><div class='add'>+    /* if cnt == 0, we're in a fatal position, the object will be free'd</div><div class='add'>+     *</div><div class='add'>+     * There is a race when two threads do a _gf_ref_get(). Only one of</div><div class='add'>+     * them may get a 0 returned. That is acceptable, because one</div><div class='add'>+     * _gf_ref_get() returning 0 should be handled as a fatal problem and</div><div class='add'>+     * when correct usage/locking is used, it should never happen.</div><div class='add'>+     */</div><div class='add'>+    GF_ASSERT(cnt != 0);</div><div class='add'>+</div><div class='add'>+    return cnt ? ref-&gt;data : NULL;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+unsigned int</div><div class='add'>+_gf_ref_put(gf_ref_t *ref)</div><div class='add'>+{</div><div class='add'>+    unsigned int cnt = __sync_fetch_and_sub(&amp;ref-&gt;cnt, 1);</div><div class='add'>+</div><div class='add'>+    /* if cnt == 1, the last user just did a _gf_ref_put()</div><div class='add'>+     *</div><div class='add'>+     * When cnt == 0, one _gf_ref_put() was done too much and there has</div><div class='add'>+     * been a thread using the refcounted structure when it was not</div><div class='add'>+     * supposed to.</div><div class='add'>+     */</div><div class='add'>+    GF_ASSERT(cnt != 0);</div><div class='add'>+</div><div class='add'>+    if (cnt == 1 &amp;&amp; ref-&gt;release)</div><div class='add'>+        ref-&gt;release(ref-&gt;data);</div><div class='add'>+</div><div class='add'>+    return (cnt != 1);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#else</div><div class='add'>+</div><div class='add'>+void *</div><div class='add'>+_gf_ref_get(gf_ref_t *ref)</div><div class='add'>+{</div><div class='add'>+    unsigned int cnt = 0;</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;ref-&gt;lk);</div><div class='add'>+    {</div><div class='add'>+        /* never can be 0, should have been free'd */</div><div class='add'>+        if (ref-&gt;cnt &gt; 0)</div><div class='add'>+            cnt = ++ref-&gt;cnt;</div><div class='add'>+        else</div><div class='add'>+            GF_ASSERT(ref-&gt;cnt &gt; 0);</div><div class='add'>+    }</div><div class='add'>+    UNLOCK(&amp;ref-&gt;lk);</div><div class='add'>+</div><div class='add'>+    return cnt ? ref-&gt;data : NULL;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+unsigned int</div><div class='add'>+_gf_ref_put(gf_ref_t *ref)</div><div class='add'>+{</div><div class='add'>+    unsigned int cnt = 0;</div><div class='add'>+    int release = 0;</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;ref-&gt;lk);</div><div class='add'>+    {</div><div class='add'>+        if (ref-&gt;cnt != 0) {</div><div class='add'>+            cnt = --ref-&gt;cnt;</div><div class='add'>+            /* call release() only when cnt == 0 */</div><div class='add'>+            release = (cnt == 0);</div><div class='add'>+        } else</div><div class='add'>+            GF_ASSERT(ref-&gt;cnt != 0);</div><div class='add'>+    }</div><div class='add'>+    UNLOCK(&amp;ref-&gt;lk);</div><div class='add'>+</div><div class='add'>+    if (release &amp;&amp; ref-&gt;release)</div><div class='add'>+        ref-&gt;release(ref-&gt;data);</div><div class='add'>+</div><div class='add'>+    return !release;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#endif /* REFCOUNT_NEEDS_LOCK */</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+_gf_ref_init(gf_ref_t *ref, gf_ref_release_t release, void *data)</div><div class='add'>+{</div><div class='add'>+    GF_ASSERT(ref);</div><div class='add'>+</div><div class='add'>+#ifdef REFCOUNT_NEEDS_LOCK</div><div class='add'>+    LOCK_INIT(&amp;ref-&gt;lk);</div><div class='add'>+#endif</div><div class='add'>+    ref-&gt;cnt = 1;</div><div class='add'>+    ref-&gt;release = release;</div><div class='add'>+    ref-&gt;data = data;</div><div class='add'>+}</div><div class='head'>diff --git a/libglusterfs/src/revision.h b/libglusterfs/src/revision.h<br/>deleted file mode 100644<br/>index 03c887fc078..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/libglusterfs/src/revision.h?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/revision.h</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1 +0,0 @@</div><div class='del'>-#define GLUSTERFS_REPOSITORY_REVISION "git://git.sv.gnu.org/gluster.git"</div><div class='head'>diff --git a/libglusterfs/src/rot-buffs.c b/libglusterfs/src/rot-buffs.c<br/>new file mode 100644<br/>index 00000000000..260bf16ecea<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/libglusterfs/src/rot-buffs.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>libglusterfs/src/rot-buffs.c</a></div><div class='hunk'>@@ -0,0 +1,490 @@</div><div class='add'>+/*</div><div class='add'>+  Copyright (c) 2008-2015 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#include &lt;math.h&gt;</div><div class='add'>+</div><div class='add'>+#include "glusterfs/mem-types.h"</div><div class='add'>+#include "glusterfs/mem-pool.h"</div><div class='add'>+</div><div class='add'>+#include "glusterfs/rot-buffs.h"</div><div class='add'>+</div><div class='add'>+/**</div><div class='add'>+ * Producer-Consumer based on top of rotational buffers.</div><div class='add'>+ *</div><div class='add'>+ * This favours writers (producer) and keeps the critical section</div><div class='add'>+ * light weight. Buffer switch happens when a consumer wants to</div><div class='add'>+ * consume data. This is the slow path and waits for pending</div><div class='add'>+ * writes to finish.</div><div class='add'>+ *</div><div class='add'>+ * TODO: do away with opaques (use arrays with indexing).</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+#define ROT_BUFF_DEFAULT_COUNT 2</div><div class='add'>+#define ROT_BUFF_ALLOC_SIZE (1 * 1024 * 1024) /* 1MB per iovec */</div><div class='add'>+</div><div class='add'>+#define RLIST_IOV_MELDED_ALLOC_SIZE (RBUF_IOVEC_SIZE + ROT_BUFF_ALLOC_SIZE)</div><div class='add'>+</div><div class='add'>+/**</div><div class='add'>+ * iovec list is not shrunk (deallocated) if usage/total count</div><div class='add'>+ * falls in this range. this is the fast path and should satisfy</div><div class='add'>+ * most of the workloads. for the rest shrinking iovec list is</div><div class='add'>+ * generous.</div><div class='add'>+ */</div><div class='add'>+#define RVEC_LOW_WATERMARK_COUNT 1</div><div class='add'>+#define RVEC_HIGH_WATERMARK_COUNT (1 &lt;&lt; 4)</div><div class='add'>+</div><div class='add'>+static inline rbuf_list_t *</div><div class='add'>+rbuf_current_buffer(rbuf_t *rbuf)</div><div class='add'>+{</div><div class='add'>+    return rbuf-&gt;current;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+rlist_mark_waiting(rbuf_list_t *rlist)</div><div class='add'>+{</div><div class='add'>+    LOCK(&amp;rlist-&gt;c_lock);</div><div class='add'>+    {</div><div class='add'>+        rlist-&gt;awaiting = _gf_true;</div><div class='add'>+    }</div><div class='add'>+    UNLOCK(&amp;rlist-&gt;c_lock);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+__rlist_has_waiter(rbuf_list_t *rlist)</div><div class='add'>+{</div><div class='add'>+    return (rlist-&gt;awaiting == _gf_true);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void *</div><div class='add'>+rbuf_alloc_rvec()</div><div class='add'>+{</div><div class='add'>+    return GF_CALLOC(1, RLIST_IOV_MELDED_ALLOC_SIZE, gf_common_mt_rvec_t);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+rlist_reset_vector_usage(rbuf_list_t *rlist)</div><div class='add'>+{</div><div class='add'>+    rlist-&gt;used = 1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+rlist_increment_vector_usage(rbuf_list_t *rlist)</div><div class='add'>+{</div><div class='add'>+    rlist-&gt;used++;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+rlist_increment_total_usage(rbuf_list_t *rlist)</div><div class='add'>+{</div><div class='add'>+    rlist-&gt;total++;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+rvec_in_watermark_range(rbuf_list_t *rlist)</div><div class='add'>+{</div><div class='add'>+    return ((rlist-&gt;total &gt;= RVEC_LOW_WATERMARK_COUNT) &amp;&amp;</div><div class='add'>+            (rlist-&gt;total &lt;= RVEC_HIGH_WATERMARK_COUNT));</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+rbuf_reset_rvec(rbuf_iovec_t *rvec)</div><div class='add'>+{</div><div class='add'>+    GF_VALIDATE_OR_GOTO("libglusterfs", rvec, err);</div><div class='add'>+    /* iov_base is _never_ modified */</div><div class='add'>+    rvec-&gt;iov.iov_len = 0;</div><div class='add'>+err:</div><div class='add'>+    return;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* TODO: alloc multiple rbuf_iovec_t */</div><div class='add'>+static int</div><div class='add'>+rlist_add_new_vec(rbuf_list_t *rlist)</div><div class='add'>+{</div><div class='add'>+    rbuf_iovec_t *rvec = NULL;</div><div class='add'>+</div><div class='add'>+    rvec = (rbuf_iovec_t *)rbuf_alloc_rvec();</div><div class='add'>+    if (!rvec)</div><div class='add'>+        return -1;</div><div class='add'>+    INIT_LIST_HEAD(&amp;rvec-&gt;list);</div><div class='add'>+    rvec-&gt;iov.iov_base = ((char *)rvec) + RBUF_IOVEC_SIZE;</div><div class='add'>+    rvec-&gt;iov.iov_len = 0;</div><div class='add'>+</div><div class='add'>+    list_add_tail(&amp;rvec-&gt;list, &amp;rlist-&gt;veclist);</div><div class='add'>+</div><div class='add'>+    rlist-&gt;rvec = rvec; /* cache the latest */</div><div class='add'>+</div><div class='add'>+    rlist_increment_vector_usage(rlist);</div><div class='add'>+    rlist_increment_total_usage(rlist);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+rlist_free_rvec(rbuf_iovec_t *rvec)</div><div class='add'>+{</div><div class='add'>+    if (!rvec)</div><div class='add'>+        return;</div><div class='add'>+    list_del(&amp;rvec-&gt;list);</div><div class='add'>+    GF_FREE(rvec);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+rlist_purge_all_rvec(rbuf_list_t *rlist)</div><div class='add'>+{</div><div class='add'>+    rbuf_iovec_t *rvec = NULL;</div><div class='add'>+</div><div class='add'>+    if (!rlist)</div><div class='add'>+        return;</div><div class='add'>+    while (!list_empty(&amp;rlist-&gt;veclist)) {</div><div class='add'>+        rvec = list_first_entry(&amp;rlist-&gt;veclist, rbuf_iovec_t, list);</div><div class='add'>+        rlist_free_rvec(rvec);</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+rlist_shrink_rvec(rbuf_list_t *rlist, unsigned long long shrink)</div><div class='add'>+{</div><div class='add'>+    rbuf_iovec_t *rvec = NULL;</div><div class='add'>+</div><div class='add'>+    while (!list_empty(&amp;rlist-&gt;veclist) &amp;&amp; (shrink-- &gt; 0)) {</div><div class='add'>+        rvec = list_first_entry(&amp;rlist-&gt;veclist, rbuf_iovec_t, list);</div><div class='add'>+        rlist_free_rvec(rvec);</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+rbuf_purge_rlist(rbuf_t *rbuf)</div><div class='add'>+{</div><div class='add'>+    rbuf_list_t *rlist = NULL;</div><div class='add'>+</div><div class='add'>+    while (!list_empty(&amp;rbuf-&gt;freelist)) {</div><div class='add'>+        rlist = list_first_entry(&amp;rbuf-&gt;freelist, rbuf_list_t, list);</div><div class='add'>+        list_del(&amp;rlist-&gt;list);</div><div class='add'>+</div><div class='add'>+        rlist_purge_all_rvec(rlist);</div><div class='add'>+</div><div class='add'>+        LOCK_DESTROY(&amp;rlist-&gt;c_lock);</div><div class='add'>+</div><div class='add'>+        (void)pthread_mutex_destroy(&amp;rlist-&gt;b_lock);</div><div class='add'>+        (void)pthread_cond_destroy(&amp;rlist-&gt;b_cond);</div><div class='add'>+</div><div class='add'>+        GF_FREE(rlist);</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+rbuf_t *</div><div class='add'>+rbuf_init(int bufcount)</div><div class='add'>+{</div><div class='add'>+    int j = 0;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    rbuf_t *rbuf = NULL;</div><div class='add'>+    rbuf_list_t *rlist = NULL;</div><div class='add'>+</div><div class='add'>+    if (bufcount &lt;= 0)</div><div class='add'>+        bufcount = ROT_BUFF_DEFAULT_COUNT;</div><div class='add'>+</div><div class='add'>+    rbuf = GF_CALLOC(1, sizeof(rbuf_t), gf_common_mt_rbuf_t);</div><div class='add'>+    if (!rbuf)</div><div class='add'>+        goto error_return;</div><div class='add'>+</div><div class='add'>+    LOCK_INIT(&amp;rbuf-&gt;lock);</div><div class='add'>+    INIT_LIST_HEAD(&amp;rbuf-&gt;freelist);</div><div class='add'>+</div><div class='add'>+    /* it could have been one big calloc() but this is just once.. */</div><div class='add'>+    for (j = 0; j &lt; bufcount; j++) {</div><div class='add'>+        rlist = GF_CALLOC(1, sizeof(rbuf_list_t), gf_common_mt_rlist_t);</div><div class='add'>+        if (!rlist) {</div><div class='add'>+            ret = -1;</div><div class='add'>+            break;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        INIT_LIST_HEAD(&amp;rlist-&gt;list);</div><div class='add'>+        INIT_LIST_HEAD(&amp;rlist-&gt;veclist);</div><div class='add'>+</div><div class='add'>+        rlist-&gt;pending = rlist-&gt;completed = 0;</div><div class='add'>+</div><div class='add'>+        ret = rlist_add_new_vec(rlist);</div><div class='add'>+        if (ret)</div><div class='add'>+            break;</div><div class='add'>+</div><div class='add'>+        LOCK_INIT(&amp;rlist-&gt;c_lock);</div><div class='add'>+</div><div class='add'>+        rlist-&gt;awaiting = _gf_false;</div><div class='add'>+        ret = pthread_mutex_init(&amp;rlist-&gt;b_lock, 0);</div><div class='add'>+        if (ret != 0) {</div><div class='add'>+            GF_FREE(rlist);</div><div class='add'>+            break;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        ret = pthread_cond_init(&amp;rlist-&gt;b_cond, 0);</div><div class='add'>+        if (ret != 0) {</div><div class='add'>+            GF_FREE(rlist);</div><div class='add'>+            break;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        list_add_tail(&amp;rlist-&gt;list, &amp;rbuf-&gt;freelist);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (ret != 0)</div><div class='add'>+        goto dealloc_rlist;</div><div class='add'>+</div><div class='add'>+    /* cache currently used buffer: first in the list */</div><div class='add'>+    rbuf-&gt;current = list_first_entry(&amp;rbuf-&gt;freelist, rbuf_list_t, list);</div><div class='add'>+    return rbuf;</div><div class='add'>+</div><div class='add'>+dealloc_rlist:</div><div class='add'>+    rbuf_purge_rlist(rbuf);</div><div class='add'>+    LOCK_DESTROY(&amp;rbuf-&gt;lock);</div><div class='add'>+    GF_FREE(rbuf);</div><div class='add'>+error_return:</div><div class='add'>+    return NULL;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+rbuf_dtor(rbuf_t *rbuf)</div><div class='add'>+{</div><div class='add'>+    if (!rbuf)</div><div class='add'>+        return;</div><div class='add'>+    rbuf-&gt;current = NULL;</div><div class='add'>+    rbuf_purge_rlist(rbuf);</div><div class='add'>+    LOCK_DESTROY(&amp;rbuf-&gt;lock);</div><div class='add'>+</div><div class='add'>+    GF_FREE(rbuf);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static char *</div><div class='add'>+rbuf_adjust_write_area(struct iovec *iov, size_t bytes)</div><div class='add'>+{</div><div class='add'>+    char *wbuf = NULL;</div><div class='add'>+</div><div class='add'>+    wbuf = iov-&gt;iov_base + iov-&gt;iov_len;</div><div class='add'>+    iov-&gt;iov_len += bytes;</div><div class='add'>+    return wbuf;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static char *</div><div class='add'>+rbuf_alloc_write_area(rbuf_list_t *rlist, size_t bytes)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+    struct iovec *iov = NULL;</div><div class='add'>+</div><div class='add'>+    /* check for available space in _current_ IO buffer */</div><div class='add'>+    iov = &amp;rlist-&gt;rvec-&gt;iov;</div><div class='add'>+    if (iov-&gt;iov_len + bytes &lt;= ROT_BUFF_ALLOC_SIZE)</div><div class='add'>+        return rbuf_adjust_write_area(iov, bytes); /* fast path */</div><div class='add'>+</div><div class='add'>+    /* not enough bytes, try next available buffers */</div><div class='add'>+    if (list_is_last(&amp;rlist-&gt;rvec-&gt;list, &amp;rlist-&gt;veclist)) {</div><div class='add'>+        /* OH! consumed all vector buffers */</div><div class='add'>+        GF_ASSERT(rlist-&gt;used == rlist-&gt;total);</div><div class='add'>+        ret = rlist_add_new_vec(rlist);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto error_return;</div><div class='add'>+    } else {</div><div class='add'>+        /* not the end, have available rbuf_iovec's */</div><div class='add'>+        rlist-&gt;rvec = list_next_entry(rlist-&gt;rvec, list);</div><div class='add'>+        rlist-&gt;used++;</div><div class='add'>+        rbuf_reset_rvec(rlist-&gt;rvec);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    iov = &amp;rlist-&gt;rvec-&gt;iov;</div><div class='add'>+    return rbuf_adjust_write_area(iov, bytes);</div><div class='add'>+</div><div class='add'>+error_return:</div><div class='add'>+    return NULL;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+char *</div><div class='add'>+rbuf_reserve_write_area(rbuf_t *rbuf, size_t bytes, void **opaque)</div><div class='add'>+{</div><div class='add'>+    char *wbuf = NULL;</div><div class='add'>+    rbuf_list_t *rlist = NULL;</div><div class='add'>+</div><div class='add'>+    if (!rbuf || (bytes &lt;= 0) || (bytes &gt; ROT_BUFF_ALLOC_SIZE) || !opaque)</div><div class='add'>+        return NULL;</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;rbuf-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        rlist = rbuf_current_buffer(rbuf);</div><div class='add'>+        wbuf = rbuf_alloc_write_area(rlist, bytes);</div><div class='add'>+        if (!wbuf)</div><div class='add'>+            goto unblock;</div><div class='add'>+        rlist-&gt;pending++;</div><div class='add'>+    }</div><div class='add'>+unblock:</div><div class='add'>+    UNLOCK(&amp;rbuf-&gt;lock);</div><div class='add'>+</div><div class='add'>+    if (wbuf)</div><div class='add'>+        *opaque = rlist;</div><div class='add'>+    return wbuf;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+rbuf_notify_waiter(rbuf_list_t *rlist)</div><div class='add'>+{</div><div class='add'>+    pthread_mutex_lock(&amp;rlist-&gt;b_lock);</div><div class='add'>+    {</div><div class='add'>+        pthread_cond_signal(&amp;rlist-&gt;b_cond);</div><div class='add'>+    }</div><div class='add'>+    pthread_mutex_unlock(&amp;rlist-&gt;b_lock);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+rbuf_write_complete(void *opaque)</div><div class='add'>+{</div><div class='add'>+    rbuf_list_t *rlist = NULL;</div><div class='add'>+    gf_boolean_t notify = _gf_false;</div><div class='add'>+</div><div class='add'>+    if (!opaque)</div><div class='add'>+        return -1;</div><div class='add'>+</div><div class='add'>+    rlist = opaque;</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;rlist-&gt;c_lock);</div><div class='add'>+    {</div><div class='add'>+        rlist-&gt;completed++;</div><div class='add'>+        /**</div><div class='add'>+         * it's safe to test -&gt;pending without rbuf-&gt;lock *only* if</div><div class='add'>+         * there's a waiter as there can be no new incoming writes.</div><div class='add'>+         */</div><div class='add'>+        if (__rlist_has_waiter(rlist) &amp;&amp; (rlist-&gt;completed == rlist-&gt;pending))</div><div class='add'>+            notify = _gf_true;</div><div class='add'>+    }</div><div class='add'>+    UNLOCK(&amp;rlist-&gt;c_lock);</div><div class='add'>+</div><div class='add'>+    if (notify)</div><div class='add'>+        rbuf_notify_waiter(rlist);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+rbuf_get_buffer(rbuf_t *rbuf, void **opaque, sequence_fn *seqfn, void *mydata)</div><div class='add'>+{</div><div class='add'>+    int retval = RBUF_CONSUMABLE;</div><div class='add'>+    rbuf_list_t *rlist = NULL;</div><div class='add'>+</div><div class='add'>+    if (!rbuf || !opaque)</div><div class='add'>+        return -1;</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;rbuf-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        rlist = rbuf_current_buffer(rbuf);</div><div class='add'>+        if (!rlist-&gt;pending) {</div><div class='add'>+            retval = RBUF_EMPTY;</div><div class='add'>+            goto unblock;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        if (list_is_singular(&amp;rbuf-&gt;freelist)) {</div><div class='add'>+            /**</div><div class='add'>+             * removal would lead to writer starvation, disallow</div><div class='add'>+             * switching.</div><div class='add'>+             */</div><div class='add'>+            retval = RBUF_WOULD_STARVE;</div><div class='add'>+            goto unblock;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        list_del_init(&amp;rlist-&gt;list);</div><div class='add'>+        if (seqfn)</div><div class='add'>+            seqfn(rlist, mydata);</div><div class='add'>+        rbuf-&gt;current = list_first_entry(&amp;rbuf-&gt;freelist, rbuf_list_t, list);</div><div class='add'>+    }</div><div class='add'>+unblock:</div><div class='add'>+    UNLOCK(&amp;rbuf-&gt;lock);</div><div class='add'>+</div><div class='add'>+    if (retval == RBUF_CONSUMABLE)</div><div class='add'>+        *opaque = rlist; /* caller _owns_ the buffer */</div><div class='add'>+</div><div class='add'>+    return retval;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/**</div><div class='add'>+ * Wait for completion of pending writers and invoke dispatcher</div><div class='add'>+ * routine (for buffer consumption).</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+__rbuf_wait_for_writers(rbuf_list_t *rlist)</div><div class='add'>+{</div><div class='add'>+    while (rlist-&gt;completed != rlist-&gt;pending)</div><div class='add'>+        pthread_cond_wait(&amp;rlist-&gt;b_cond, &amp;rlist-&gt;b_lock);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#ifndef M_E</div><div class='add'>+#define M_E 2.7</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+rlist_shrink_vector(rbuf_list_t *rlist)</div><div class='add'>+{</div><div class='add'>+    unsigned long long shrink = 0;</div><div class='add'>+</div><div class='add'>+    /**</div><div class='add'>+     * fast path: don't bother to deallocate if vectors are hardly</div><div class='add'>+     * used.</div><div class='add'>+     */</div><div class='add'>+    if (rvec_in_watermark_range(rlist))</div><div class='add'>+        return;</div><div class='add'>+</div><div class='add'>+    /**</div><div class='add'>+     * Calculate the shrink count based on total allocated vectors.</div><div class='add'>+     * Note that the calculation sticks to rlist-&gt;total irrespective</div><div class='add'>+     * of the actual usage count (rlist-&gt;used). Later, -&gt;used could</div><div class='add'>+     * be used to apply slack to the calculation based on how much</div><div class='add'>+     * it lags from -&gt;total. For now, let's stick to slow decay.</div><div class='add'>+     */</div><div class='add'>+    shrink = rlist-&gt;total - (rlist-&gt;total * pow(M_E, -0.2));</div><div class='add'>+</div><div class='add'>+    rlist_shrink_rvec(rlist, shrink);</div><div class='add'>+    rlist-&gt;total -= shrink;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+rbuf_wait_for_completion(rbuf_t *rbuf, void *opaque,</div><div class='add'>+                         void (*fn)(rbuf_list_t *, void *), void *arg)</div><div class='add'>+{</div><div class='add'>+    rbuf_list_t *rlist = NULL;</div><div class='add'>+</div><div class='add'>+    if (!rbuf || !opaque)</div><div class='add'>+        return -1;</div><div class='add'>+</div><div class='add'>+    rlist = opaque;</div><div class='add'>+</div><div class='add'>+    pthread_mutex_lock(&amp;rlist-&gt;b_lock);</div><div class='add'>+    {</div><div class='add'>+        rlist_mark_waiting(rlist);</div><div class='add'>+        __rbuf_wait_for_writers(rlist);</div><div class='add'>+    }</div><div class='add'>+    pthread_mutex_unlock(&amp;rlist-&gt;b_lock);</div><div class='add'>+</div><div class='add'>+    /**</div><div class='add'>+     * from here on, no need of locking until the rlist is put</div><div class='add'>+     * back into rotation.</div><div class='add'>+     */</div><div class='add'>+</div><div class='add'>+    fn(rlist, arg); /* invoke dispatcher */</div><div class='add'>+</div><div class='add'>+    rlist-&gt;awaiting = _gf_false;</div><div class='add'>+    rlist-&gt;pending = rlist-&gt;completed = 0;</div><div class='add'>+</div><div class='add'>+    rlist_shrink_vector(rlist);</div><div class='add'>+    rlist_reset_vector_usage(rlist);</div><div class='add'>+</div><div class='add'>+    rlist-&gt;rvec = list_first_entry(&amp;rlist-&gt;veclist, rbuf_iovec_t, list);</div><div class='add'>+    rbuf_reset_rvec(rlist-&gt;rvec);</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;rbuf-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        list_add_tail(&amp;rlist-&gt;list, &amp;rbuf-&gt;freelist);</div><div class='add'>+    }</div><div class='add'>+    UNLOCK(&amp;rbuf-&gt;lock);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='head'>diff --git a/libglusterfs/src/run.c b/libglusterfs/src/run.c<br/>new file mode 100644<br/>index 00000000000..58f95a7e610<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/libglusterfs/src/run.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>libglusterfs/src/run.c</a></div><div class='hunk'>@@ -0,0 +1,570 @@</div><div class='add'>+/*</div><div class='add'>+  Copyright (c) 2008-2012 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#ifndef _GNU_SOURCE</div><div class='add'>+#define _GNU_SOURCE</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#include &lt;stdio.h&gt;</div><div class='add'>+#include &lt;unistd.h&gt;</div><div class='add'>+#include &lt;stdlib.h&gt;</div><div class='add'>+#include &lt;stdarg.h&gt;</div><div class='add'>+#include &lt;string.h&gt;</div><div class='add'>+#include &lt;errno.h&gt;</div><div class='add'>+#include &lt;fcntl.h&gt;</div><div class='add'>+#include &lt;dirent.h&gt;</div><div class='add'>+#include &lt;assert.h&gt;</div><div class='add'>+#include &lt;signal.h&gt;</div><div class='add'>+#include &lt;sys/wait.h&gt;</div><div class='add'>+#include "glusterfs/syscall.h"</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+ * Following defines are available for helping development:</div><div class='add'>+ * RUN_STANDALONE and RUN_DO_DEMO.</div><div class='add'>+ *</div><div class='add'>+ * Compiling a standalone object file with no dependencies</div><div class='add'>+ * on glusterfs:</div><div class='add'>+ * $ cc -DRUN_STANDALONE -c run.c</div><div class='add'>+ *</div><div class='add'>+ * Compiling a demo program that exercises bits of run.c</div><div class='add'>+ * functionality (linking to glusterfs):</div><div class='add'>+ * $ cc -DRUN_DO_DEMO -orun run.c  `pkg-config --libs --cflags glusterfs-api`</div><div class='add'>+ *</div><div class='add'>+ * Compiling a demo program that exercises bits of run.c</div><div class='add'>+ * functionality (with no dependence on glusterfs):</div><div class='add'>+ *</div><div class='add'>+ * $ cc -DRUN_DO_DEMO -DRUN_STANDALONE -orun run.c</div><div class='add'>+ */</div><div class='add'>+#if defined(RUN_STANDALONE) || defined(RUN_DO_DEMO)</div><div class='add'>+int</div><div class='add'>+close_fds_except(int *fdv, size_t count);</div><div class='add'>+#define sys_read(f, b, c) read(f, b, c)</div><div class='add'>+#define sys_write(f, b, c) write(f, b, c)</div><div class='add'>+#define sys_close(f) close(f)</div><div class='add'>+#define GF_CALLOC(n, s, t) calloc(n, s)</div><div class='add'>+#define GF_ASSERT(cond) assert(cond)</div><div class='add'>+#define GF_REALLOC(p, s) realloc(p, s)</div><div class='add'>+#define GF_FREE(p) free(p)</div><div class='add'>+#define gf_strdup(s) strdup(s)</div><div class='add'>+#define gf_vasprintf(p, f, va) vasprintf(p, f, va)</div><div class='add'>+#define gf_loglevel_t int</div><div class='add'>+#define gf_msg_callingfn(dom, level, errnum, msgid, fmt, args...)              \</div><div class='add'>+    printf("LOG: " fmt "\n", ##args)</div><div class='add'>+#define LOG_DEBUG 0</div><div class='add'>+#ifdef RUN_STANDALONE</div><div class='add'>+#include &lt;stdbool.h&gt;</div><div class='add'>+#include &lt;sys/resource.h&gt;</div><div class='add'>+int</div><div class='add'>+close_fds_except(int *fdv, size_t count)</div><div class='add'>+{</div><div class='add'>+    int i = 0;</div><div class='add'>+    size_t j = 0;</div><div class='add'>+    bool should_close = true;</div><div class='add'>+    struct rlimit rl;</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    ret = getrlimit(RLIMIT_NOFILE, &amp;rl);</div><div class='add'>+    if (ret)</div><div class='add'>+        return ret;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; rl.rlim_cur; i++) {</div><div class='add'>+        should_close = true;</div><div class='add'>+        for (j = 0; j &lt; count; j++) {</div><div class='add'>+            if (i == fdv[j]) {</div><div class='add'>+                should_close = false;</div><div class='add'>+                break;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+        if (should_close)</div><div class='add'>+            sys_close(i);</div><div class='add'>+    }</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+#endif</div><div class='add'>+#ifdef __linux__</div><div class='add'>+#define GF_LINUX_HOST_OS</div><div class='add'>+#endif</div><div class='add'>+#else /* ! RUN_STANDALONE || RUN_DO_DEMO */</div><div class='add'>+#include "glusterfs/glusterfs.h"</div><div class='add'>+#include "glusterfs/common-utils.h"</div><div class='add'>+#include "glusterfs/libglusterfs-messages.h"</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#include "glusterfs/run.h"</div><div class='add'>+void</div><div class='add'>+runinit(runner_t *runner)</div><div class='add'>+{</div><div class='add'>+    int i = 0;</div><div class='add'>+</div><div class='add'>+    runner-&gt;argvlen = 64;</div><div class='add'>+    runner-&gt;argv = GF_CALLOC(runner-&gt;argvlen, sizeof(*runner-&gt;argv),</div><div class='add'>+                             gf_common_mt_run_argv);</div><div class='add'>+    runner-&gt;runerr = runner-&gt;argv ? 0 : errno;</div><div class='add'>+    runner-&gt;chpid = -1;</div><div class='add'>+    for (i = 0; i &lt; 3; i++) {</div><div class='add'>+        runner-&gt;chfd[i] = -1;</div><div class='add'>+        runner-&gt;chio[i] = NULL;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+FILE *</div><div class='add'>+runner_chio(runner_t *runner, int fd)</div><div class='add'>+{</div><div class='add'>+    GF_ASSERT(fd &gt; 0 &amp;&amp; fd &lt; 3);</div><div class='add'>+</div><div class='add'>+    if ((fd &gt; 0) &amp;&amp; (fd &lt; 3))</div><div class='add'>+        return runner-&gt;chio[fd];</div><div class='add'>+</div><div class='add'>+    return NULL;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+runner_insert_arg(runner_t *runner, char *arg)</div><div class='add'>+{</div><div class='add'>+    int i = 0;</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(arg);</div><div class='add'>+</div><div class='add'>+    if (runner-&gt;runerr || !runner-&gt;argv)</div><div class='add'>+        return;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; runner-&gt;argvlen; i++) {</div><div class='add'>+        if (runner-&gt;argv[i] == NULL)</div><div class='add'>+            break;</div><div class='add'>+    }</div><div class='add'>+    GF_ASSERT(i &lt; runner-&gt;argvlen);</div><div class='add'>+</div><div class='add'>+    if (i == runner-&gt;argvlen - 1) {</div><div class='add'>+        runner-&gt;argv = GF_REALLOC(runner-&gt;argv,</div><div class='add'>+                                  runner-&gt;argvlen * 2 * sizeof(*runner-&gt;argv));</div><div class='add'>+        if (!runner-&gt;argv) {</div><div class='add'>+            runner-&gt;runerr = errno;</div><div class='add'>+            return;</div><div class='add'>+        }</div><div class='add'>+        memset(/* "+" is aware of the type of its left side,</div><div class='add'>+                * no need to multiply with type-size */</div><div class='add'>+               runner-&gt;argv + runner-&gt;argvlen, 0,</div><div class='add'>+               runner-&gt;argvlen * sizeof(*runner-&gt;argv));</div><div class='add'>+        runner-&gt;argvlen *= 2;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    runner-&gt;argv[i] = arg;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+runner_add_arg(runner_t *runner, const char *arg)</div><div class='add'>+{</div><div class='add'>+    arg = gf_strdup(arg);</div><div class='add'>+    if (!arg) {</div><div class='add'>+        runner-&gt;runerr = errno;</div><div class='add'>+        return;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    runner_insert_arg(runner, (char *)arg);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+runner_va_add_args(runner_t *runner, va_list argp)</div><div class='add'>+{</div><div class='add'>+    const char *arg;</div><div class='add'>+</div><div class='add'>+    while ((arg = va_arg(argp, const char *)))</div><div class='add'>+        runner_add_arg(runner, arg);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+runner_add_args(runner_t *runner, ...)</div><div class='add'>+{</div><div class='add'>+    va_list argp;</div><div class='add'>+</div><div class='add'>+    va_start(argp, runner);</div><div class='add'>+    runner_va_add_args(runner, argp);</div><div class='add'>+    va_end(argp);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+runner_argprintf(runner_t *runner, const char *format, ...)</div><div class='add'>+{</div><div class='add'>+    va_list argva;</div><div class='add'>+    char *arg = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    va_start(argva, format);</div><div class='add'>+    ret = gf_vasprintf(&amp;arg, format, argva);</div><div class='add'>+    va_end(argva);</div><div class='add'>+</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        runner-&gt;runerr = errno;</div><div class='add'>+        return;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    runner_insert_arg(runner, arg);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+runner_log(runner_t *runner, const char *dom, gf_loglevel_t lvl,</div><div class='add'>+           const char *msg)</div><div class='add'>+{</div><div class='add'>+    char *buf = NULL;</div><div class='add'>+    size_t len = 0;</div><div class='add'>+    int i = 0;</div><div class='add'>+</div><div class='add'>+    if (runner-&gt;runerr)</div><div class='add'>+        return;</div><div class='add'>+</div><div class='add'>+    for (i = 0;; i++) {</div><div class='add'>+        if (runner-&gt;argv[i] == NULL)</div><div class='add'>+            break;</div><div class='add'>+        len += (strlen(runner-&gt;argv[i]) + 1);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    buf = GF_CALLOC(1, len + 1, gf_common_mt_run_logbuf);</div><div class='add'>+    if (!buf) {</div><div class='add'>+        runner-&gt;runerr = errno;</div><div class='add'>+        return;</div><div class='add'>+    }</div><div class='add'>+    for (i = 0;; i++) {</div><div class='add'>+        if (runner-&gt;argv[i] == NULL)</div><div class='add'>+            break;</div><div class='add'>+        strcat(buf, runner-&gt;argv[i]);</div><div class='add'>+        strcat(buf, " ");</div><div class='add'>+    }</div><div class='add'>+    if (len &gt; 0)</div><div class='add'>+        buf[len - 1] = '\0';</div><div class='add'>+</div><div class='add'>+    gf_msg_callingfn(dom, lvl, 0, LG_MSG_RUNNER_LOG, "%s: %s", msg, buf);</div><div class='add'>+</div><div class='add'>+    GF_FREE(buf);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+runner_redir(runner_t *runner, int fd, int tgt_fd)</div><div class='add'>+{</div><div class='add'>+    GF_ASSERT(fd &gt; 0 &amp;&amp; fd &lt; 3);</div><div class='add'>+</div><div class='add'>+    if ((fd &gt; 0) &amp;&amp; (fd &lt; 3))</div><div class='add'>+        runner-&gt;chfd[fd] = (tgt_fd &gt;= 0) ? tgt_fd : -2;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+runner_start(runner_t *runner)</div><div class='add'>+{</div><div class='add'>+    int pi[3][2] = {{-1, -1}, {-1, -1}, {-1, -1}};</div><div class='add'>+    int xpi[2];</div><div class='add'>+    int ret = 0;</div><div class='add'>+    int errno_priv = 0;</div><div class='add'>+    int i = 0;</div><div class='add'>+    sigset_t set;</div><div class='add'>+</div><div class='add'>+    if (runner-&gt;runerr || !runner-&gt;argv) {</div><div class='add'>+        errno = (runner-&gt;runerr) ? runner-&gt;runerr : EINVAL;</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(runner-&gt;argv[0]);</div><div class='add'>+</div><div class='add'>+    /* set up a channel to child to communicate back</div><div class='add'>+     * possible execve(2) failures</div><div class='add'>+     */</div><div class='add'>+    ret = pipe(xpi);</div><div class='add'>+    if (ret != -1)</div><div class='add'>+        ret = fcntl(xpi[1], F_SETFD, FD_CLOEXEC);</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; 3; i++) {</div><div class='add'>+        if (runner-&gt;chfd[i] != -2)</div><div class='add'>+            continue;</div><div class='add'>+        ret = pipe(pi[i]);</div><div class='add'>+        if (ret != -1) {</div><div class='add'>+            runner-&gt;chio[i] = fdopen(pi[i][i ? 0 : 1], i ? "r" : "w");</div><div class='add'>+            if (!runner-&gt;chio[i])</div><div class='add'>+                ret = -1;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (ret != -1)</div><div class='add'>+        runner-&gt;chpid = fork();</div><div class='add'>+    switch (runner-&gt;chpid) {</div><div class='add'>+        case -1:</div><div class='add'>+            errno_priv = errno;</div><div class='add'>+            sys_close(xpi[0]);</div><div class='add'>+            sys_close(xpi[1]);</div><div class='add'>+            for (i = 0; i &lt; 3; i++) {</div><div class='add'>+                sys_close(pi[i][0]);</div><div class='add'>+                sys_close(pi[i][1]);</div><div class='add'>+            }</div><div class='add'>+            errno = errno_priv;</div><div class='add'>+            return -1;</div><div class='add'>+        case 0:</div><div class='add'>+            for (i = 0; i &lt; 3; i++)</div><div class='add'>+                sys_close(pi[i][i ? 0 : 1]);</div><div class='add'>+            sys_close(xpi[0]);</div><div class='add'>+            ret = 0;</div><div class='add'>+</div><div class='add'>+            for (i = 0; i &lt; 3; i++) {</div><div class='add'>+                if (ret == -1)</div><div class='add'>+                    break;</div><div class='add'>+                switch (runner-&gt;chfd[i]) {</div><div class='add'>+                    case -1:</div><div class='add'>+                        /* no redir */</div><div class='add'>+                        break;</div><div class='add'>+                    case -2:</div><div class='add'>+                        /* redir to pipe */</div><div class='add'>+                        ret = dup2(pi[i][i ? 1 : 0], i);</div><div class='add'>+                        break;</div><div class='add'>+                    default:</div><div class='add'>+                        /* redir to file */</div><div class='add'>+                        ret = dup2(runner-&gt;chfd[i], i);</div><div class='add'>+                }</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            if (ret != -1) {</div><div class='add'>+                int fdv[4] = {0, 1, 2, xpi[1]};</div><div class='add'>+</div><div class='add'>+                ret = close_fds_except(fdv, sizeof(fdv) / sizeof(*fdv));</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            if (ret != -1) {</div><div class='add'>+                /* save child from inheriting our signal handling */</div><div class='add'>+                sigemptyset(&amp;set);</div><div class='add'>+                sigprocmask(SIG_SETMASK, &amp;set, NULL);</div><div class='add'>+</div><div class='add'>+                execvp(runner-&gt;argv[0], runner-&gt;argv);</div><div class='add'>+            }</div><div class='add'>+            ret = sys_write(xpi[1], &amp;errno, sizeof(errno));</div><div class='add'>+            _exit(1);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    errno_priv = errno;</div><div class='add'>+    for (i = 0; i &lt; 3; i++)</div><div class='add'>+        sys_close(pi[i][i ? 1 : 0]);</div><div class='add'>+    sys_close(xpi[1]);</div><div class='add'>+    if (ret == -1) {</div><div class='add'>+        for (i = 0; i &lt; 3; i++) {</div><div class='add'>+            if (runner-&gt;chio[i]) {</div><div class='add'>+                fclose(runner-&gt;chio[i]);</div><div class='add'>+                runner-&gt;chio[i] = NULL;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+    } else {</div><div class='add'>+        ret = sys_read(xpi[0], (char *)&amp;errno_priv, sizeof(errno_priv));</div><div class='add'>+        sys_close(xpi[0]);</div><div class='add'>+        if (ret &lt;= 0)</div><div class='add'>+            return 0;</div><div class='add'>+        GF_ASSERT(ret == sizeof(errno_priv));</div><div class='add'>+    }</div><div class='add'>+    errno = errno_priv;</div><div class='add'>+    return -1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+runner_end_reuse(runner_t *runner)</div><div class='add'>+{</div><div class='add'>+    int i = 0;</div><div class='add'>+    int ret = 1;</div><div class='add'>+    int chstat = 0;</div><div class='add'>+</div><div class='add'>+    if (runner-&gt;chpid &gt; 0) {</div><div class='add'>+        if (waitpid(runner-&gt;chpid, &amp;chstat, 0) == runner-&gt;chpid) {</div><div class='add'>+            if (WIFEXITED(chstat)) {</div><div class='add'>+                ret = WEXITSTATUS(chstat);</div><div class='add'>+            } else {</div><div class='add'>+                ret = chstat;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; 3; i++) {</div><div class='add'>+        if (runner-&gt;chio[i]) {</div><div class='add'>+            fclose(runner-&gt;chio[i]);</div><div class='add'>+            runner-&gt;chio[i] = NULL;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return -ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+runner_end(runner_t *runner)</div><div class='add'>+{</div><div class='add'>+    int i = 0;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    char **p = NULL;</div><div class='add'>+</div><div class='add'>+    ret = runner_end_reuse(runner);</div><div class='add'>+</div><div class='add'>+    if (runner-&gt;argv) {</div><div class='add'>+        for (p = runner-&gt;argv; *p; p++)</div><div class='add'>+            GF_FREE(*p);</div><div class='add'>+        GF_FREE(runner-&gt;argv);</div><div class='add'>+    }</div><div class='add'>+    for (i = 0; i &lt; 3; i++)</div><div class='add'>+        sys_close(runner-&gt;chfd[i]);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+runner_run_generic(runner_t *runner, int (*rfin)(runner_t *runner))</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    ret = runner_start(runner);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+    ret = rfin(runner);</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+runner_run(runner_t *runner)</div><div class='add'>+{</div><div class='add'>+    return runner_run_generic(runner, runner_end);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+runner_run_nowait(runner_t *runner)</div><div class='add'>+{</div><div class='add'>+    int pid;</div><div class='add'>+</div><div class='add'>+    pid = fork();</div><div class='add'>+</div><div class='add'>+    if (!pid) {</div><div class='add'>+        setsid();</div><div class='add'>+        _exit(runner_start(runner));</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (pid &gt; 0)</div><div class='add'>+        runner-&gt;chpid = pid;</div><div class='add'>+    return runner_end(runner);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+runner_run_reuse(runner_t *runner)</div><div class='add'>+{</div><div class='add'>+    return runner_run_generic(runner, runner_end_reuse);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+runcmd(const char *arg, ...)</div><div class='add'>+{</div><div class='add'>+    runner_t runner;</div><div class='add'>+    va_list argp;</div><div class='add'>+</div><div class='add'>+    runinit(&amp;runner);</div><div class='add'>+    /* ISO C requires a named argument before '...' */</div><div class='add'>+    runner_add_arg(&amp;runner, arg);</div><div class='add'>+</div><div class='add'>+    va_start(argp, arg);</div><div class='add'>+    runner_va_add_args(&amp;runner, argp);</div><div class='add'>+    va_end(argp);</div><div class='add'>+</div><div class='add'>+    return runner_run(&amp;runner);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#ifdef RUN_DO_DEMO</div><div class='add'>+static void</div><div class='add'>+TBANNER(const char *txt)</div><div class='add'>+{</div><div class='add'>+    printf("######\n### demoing %s\n", txt);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+main(int argc, char **argv)</div><div class='add'>+{</div><div class='add'>+    runner_t runner;</div><div class='add'>+    char buf[80];</div><div class='add'>+    char *wdbuf;</div><div class='add'>+    ;</div><div class='add'>+    int ret;</div><div class='add'>+    int fd;</div><div class='add'>+    long pathmax = pathconf("/", _PC_PATH_MAX);</div><div class='add'>+    struct timeval tv = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    struct timeval *tvp = NULL;</div><div class='add'>+    char *tfile;</div><div class='add'>+</div><div class='add'>+    wdbuf = malloc(pathmax);</div><div class='add'>+    assert(wdbuf);</div><div class='add'>+    getcwd(wdbuf, pathmax);</div><div class='add'>+</div><div class='add'>+    TBANNER("basic functionality: running \"echo a b\"");</div><div class='add'>+    runcmd("echo", "a", "b", NULL);</div><div class='add'>+</div><div class='add'>+    TBANNER("argv extension: running \"echo 1 2 ... 100\"");</div><div class='add'>+    runcmd("echo", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11",</div><div class='add'>+           "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22",</div><div class='add'>+           "23", "24", "25", "26", "27", "28", "29", "30", "31", "32", "33",</div><div class='add'>+           "34", "35", "36", "37", "38", "39", "40", "41", "42", "43", "44",</div><div class='add'>+           "45", "46", "47", "48", "49", "50", "51", "52", "53", "54", "55",</div><div class='add'>+           "56", "57", "58", "59", "60", "61", "62", "63", "64", "65", "66",</div><div class='add'>+           "67", "68", "69", "70", "71", "72", "73", "74", "75", "76", "77",</div><div class='add'>+           "78", "79", "80", "81", "82", "83", "84", "85", "86", "87", "88",</div><div class='add'>+           "89", "90", "91", "92", "93", "94", "95", "96", "97", "98", "99",</div><div class='add'>+           "100", NULL);</div><div class='add'>+</div><div class='add'>+    TBANNER(</div><div class='add'>+        "add_args, argprintf, log, and popen-style functionality:\n"</div><div class='add'>+        "    running a multiline echo command, emit a log about it,\n"</div><div class='add'>+        "    redirect it to a pipe, read output lines\n"</div><div class='add'>+        "    and print them prefixed with \"got: \"");</div><div class='add'>+    runinit(&amp;runner);</div><div class='add'>+    runner_add_args(&amp;runner, "echo", "pid:", NULL);</div><div class='add'>+    runner_argprintf(&amp;runner, "%d\n", getpid());</div><div class='add'>+    runner_add_arg(&amp;runner, "wd:");</div><div class='add'>+    runner_add_arg(&amp;runner, wdbuf);</div><div class='add'>+    runner_redir(&amp;runner, 1, RUN_PIPE);</div><div class='add'>+    runner_start(&amp;runner);</div><div class='add'>+    runner_log(&amp;runner, "(x)", LOG_DEBUG, "starting program");</div><div class='add'>+    while (fgets(buf, sizeof(buf), runner_chio(&amp;runner, 1)))</div><div class='add'>+        printf("got: %s", buf);</div><div class='add'>+    runner_end(&amp;runner);</div><div class='add'>+</div><div class='add'>+    TBANNER("execve error reporting: running a non-existent command");</div><div class='add'>+    ret = runcmd("bafflavvitty", NULL);</div><div class='add'>+    printf("%d %d [%s]\n", ret, errno, strerror(errno));</div><div class='add'>+</div><div class='add'>+    TBANNER(</div><div class='add'>+        "output redirection: running \"echo foo\" redirected "</div><div class='add'>+        "to a temp file");</div><div class='add'>+    tfile = strdup("/tmp/foofXXXXXX");</div><div class='add'>+    assert(tfile);</div><div class='add'>+    fd = mkstemp(tfile);</div><div class='add'>+    assert(fd != -1);</div><div class='add'>+    printf("redirecting to %s\n", tfile);</div><div class='add'>+    runinit(&amp;runner);</div><div class='add'>+    runner_add_args(&amp;runner, "echo", "foo", NULL);</div><div class='add'>+    runner_redir(&amp;runner, 1, fd);</div><div class='add'>+    ret = runner_run(&amp;runner);</div><div class='add'>+    printf("runner_run returned: %d", ret);</div><div class='add'>+    if (ret != 0)</div><div class='add'>+        printf(", with errno %d [%s]", errno, strerror(errno));</div><div class='add'>+    putchar('\n');</div><div class='add'>+</div><div class='add'>+    /* sleep for seconds given as argument (0 means forever)</div><div class='add'>+     * to allow investigation of post-execution state to</div><div class='add'>+     * cbeck for resource leaks (eg. zombies).</div><div class='add'>+     */</div><div class='add'>+    if (argc &gt; 1) {</div><div class='add'>+        tv.tv_sec = strtoul(argv[1], NULL, 10);</div><div class='add'>+        printf("### %s", "sleeping for");</div><div class='add'>+        if (tv.tv_sec &gt; 0) {</div><div class='add'>+            printf(" %d seconds\n", tv.tv_sec);</div><div class='add'>+            tvp = &amp;tv;</div><div class='add'>+        } else</div><div class='add'>+            printf("%s\n", "ever");</div><div class='add'>+        select(0, 0, 0, 0, tvp);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+#endif</div><div class='head'>diff --git a/libglusterfs/src/scheduler.c b/libglusterfs/src/scheduler.c<br/>deleted file mode 100644<br/>index 3fcaef73b57..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/libglusterfs/src/scheduler.c?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/scheduler.c</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,91 +0,0 @@</div><div class='del'>-/*</div><div class='del'>-   Copyright (c) 2006-2009 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='del'>-   This file is part of GlusterFS.</div><div class='del'>-</div><div class='del'>-   GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-   it under the terms of the GNU General Public License as published</div><div class='del'>-   by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-   or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-   GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-   WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-   General Public License for more details.</div><div class='del'>-</div><div class='del'>-   You should have received a copy of the GNU General Public License</div><div class='del'>-   along with this program.  If not, see</div><div class='del'>-   &lt;http://www.gnu.org/licenses/&gt;.</div><div class='del'>-*/</div><div class='del'>-</div><div class='del'>-#ifndef _CONFIG_H</div><div class='del'>-#define _CONFIG_H</div><div class='del'>-#include "config.h"</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-#include &lt;dlfcn.h&gt;</div><div class='del'>-#include &lt;netdb.h&gt;</div><div class='del'>-#include "xlator.h"</div><div class='del'>-#include "scheduler.h"</div><div class='del'>-#include "list.h"</div><div class='del'>-</div><div class='del'>-struct sched_ops *</div><div class='del'>-get_scheduler (xlator_t *xl, const char *name)</div><div class='del'>-{</div><div class='del'>-	struct sched_ops  *tmp_sched = NULL;</div><div class='del'>-	volume_opt_list_t *vol_opt   = NULL;</div><div class='del'>-	char *sched_file             = NULL;</div><div class='del'>-	void *handle                 = NULL;</div><div class='del'>-        int   ret                    = 0;</div><div class='del'>-</div><div class='del'>-	if (name == NULL) {</div><div class='del'>-		gf_log ("scheduler", GF_LOG_ERROR, </div><div class='del'>-			"'name' not specified, EINVAL");</div><div class='del'>-		return NULL;</div><div class='del'>-	}</div><div class='del'>-  </div><div class='del'>-	ret = gf_asprintf (&amp;sched_file, "%s/%s.so", SCHEDULERDIR, name);</div><div class='del'>-        if (-1 == ret) {</div><div class='del'>-                gf_log ("scheduler", GF_LOG_ERROR, "asprintf failed");</div><div class='del'>-                return NULL;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-	gf_log ("scheduler", GF_LOG_DEBUG,</div><div class='del'>-		"attempt to load file %s.so", name);</div><div class='del'>-</div><div class='del'>-	handle = dlopen (sched_file, RTLD_LAZY);</div><div class='del'>-	if (!handle) {</div><div class='del'>-                gf_log ("scheduler", GF_LOG_ERROR,</div><div class='del'>-                        "dlopen(%s): %s", sched_file, dlerror ());</div><div class='del'>-                GF_FREE(sched_file);</div><div class='del'>-                return NULL;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	tmp_sched = dlsym (handle, "sched");</div><div class='del'>-	if (!tmp_sched) {</div><div class='del'>-                gf_log ("scheduler", GF_LOG_ERROR,</div><div class='del'>-                        "dlsym(sched) on %s", dlerror ());</div><div class='del'>-                GF_FREE(sched_file);</div><div class='del'>-                return NULL;</div><div class='del'>-	}</div><div class='del'>-  </div><div class='del'>-	vol_opt = GF_CALLOC (1, sizeof (volume_opt_list_t),</div><div class='del'>-                             gf_common_mt_volume_opt_list_t);</div><div class='del'>-	vol_opt-&gt;given_opt = dlsym (handle, "options");</div><div class='del'>-	if (vol_opt-&gt;given_opt == NULL) {</div><div class='del'>-		gf_log ("scheduler", GF_LOG_DEBUG,</div><div class='del'>-			"volume option validation not specified");</div><div class='del'>-	} else {</div><div class='del'>-		list_add_tail (&amp;vol_opt-&gt;list, &amp;xl-&gt;volume_options);</div><div class='del'>-		if (validate_xlator_volume_options (xl, vol_opt-&gt;given_opt)</div><div class='del'>-		    == -1) {</div><div class='del'>-			gf_log ("scheduler", GF_LOG_ERROR,</div><div class='del'>-				"volume option validation failed");</div><div class='del'>-                        GF_FREE(sched_file);</div><div class='del'>-			return NULL;</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='del'>-        GF_FREE(sched_file);</div><div class='del'>-        GF_FREE (vol_opt);</div><div class='del'>-	</div><div class='del'>-	return tmp_sched;</div><div class='del'>-}</div><div class='head'>diff --git a/libglusterfs/src/scheduler.h b/libglusterfs/src/scheduler.h<br/>deleted file mode 100644<br/>index 3e4acaaddcc..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/libglusterfs/src/scheduler.h?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/scheduler.h</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,41 +0,0 @@</div><div class='del'>-/*</div><div class='del'>-   Copyright (c) 2006-2009 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='del'>-   This file is part of GlusterFS.</div><div class='del'>-</div><div class='del'>-   GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-   it under the terms of the GNU General Public License as published</div><div class='del'>-   by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-   or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-   GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-   WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-   General Public License for more details.</div><div class='del'>-</div><div class='del'>-   You should have received a copy of the GNU General Public License</div><div class='del'>-   along with this program.  If not, see</div><div class='del'>-   &lt;http://www.gnu.org/licenses/&gt;.</div><div class='del'>-*/</div><div class='del'>-</div><div class='del'>-#ifndef _SCHEDULER_H</div><div class='del'>-#define _SCHEDULER_H</div><div class='del'>-</div><div class='del'>-#ifndef _CONFIG_H</div><div class='del'>-#define _CONFIG_H</div><div class='del'>-#include "config.h"</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-#include "xlator.h"</div><div class='del'>-</div><div class='del'>-struct sched_ops {</div><div class='del'>-  int32_t (*init) (xlator_t *this);</div><div class='del'>-  void (*fini) (xlator_t *this);</div><div class='del'>-  void (*update) (xlator_t *this);</div><div class='del'>-  xlator_t *(*schedule) (xlator_t *this, const void *path);</div><div class='del'>-  void (*notify) (xlator_t *xl, int32_t event, void *data);</div><div class='del'>-  int32_t (*mem_acct_init) (xlator_t *this);</div><div class='del'>-};</div><div class='del'>-</div><div class='del'>-extern struct sched_ops *get_scheduler (xlator_t *xl, const char *name);</div><div class='del'>-</div><div class='del'>-#endif /* _SCHEDULER_H */</div><div class='head'>diff --git a/libglusterfs/src/stack.c b/libglusterfs/src/stack.c<br/>index 0723557b36d..1531f0da43f 100644<br/>--- a/<a href='/cgit/glusterfs.git/tree/libglusterfs/src/stack.c?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/stack.c</a><br/>+++ b/<a href='/cgit/glusterfs.git/tree/libglusterfs/src/stack.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>libglusterfs/src/stack.c</a></div><div class='hunk'>@@ -1,165 +1,452 @@</div><div class='ctx'> /*</div><div class='del'>-  Copyright (c) 2009 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='add'>+  Copyright (c) 2008-2012 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='ctx'>   This file is part of GlusterFS.</div><div class='ctx'> </div><div class='del'>-  GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-  it under the terms of the GNU General Public License as published</div><div class='del'>-  by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-  or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-  GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-  WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-  General Public License for more details.</div><div class='del'>-</div><div class='del'>-  You should have received a copy of the GNU General Public License</div><div class='del'>-  along with this program.  If not, see</div><div class='del'>-  &lt;http://www.gnu.org/licenses/&gt;.</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='ctx'> */</div><div class='ctx'> </div><div class='del'>-#include "statedump.h"</div><div class='del'>-#include "stack.h"</div><div class='add'>+#include "glusterfs/statedump.h"</div><div class='add'>+#include "glusterfs/stack.h"</div><div class='add'>+#include "glusterfs/libglusterfs-messages.h"</div><div class='ctx'> </div><div class='del'>-static inline</div><div class='del'>-int call_frames_count (call_frame_t *call_frame) </div><div class='add'>+call_frame_t *</div><div class='add'>+create_frame(xlator_t *xl, call_pool_t *pool)</div><div class='ctx'> {</div><div class='del'>-        call_frame_t *pos;</div><div class='del'>-        int32_t count = 0;</div><div class='add'>+    call_stack_t *stack = NULL;</div><div class='add'>+    call_frame_t *frame = NULL;</div><div class='add'>+    static uint64_t unique = 0;</div><div class='add'>+</div><div class='add'>+    if (!xl || !pool) {</div><div class='add'>+        return NULL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    stack = mem_get0(pool-&gt;stack_mem_pool);</div><div class='add'>+    if (!stack)</div><div class='add'>+        return NULL;</div><div class='add'>+</div><div class='add'>+    INIT_LIST_HEAD(&amp;stack-&gt;myframes);</div><div class='add'>+</div><div class='add'>+    frame = mem_get0(pool-&gt;frame_mem_pool);</div><div class='add'>+    if (!frame) {</div><div class='add'>+        mem_put(stack);</div><div class='add'>+        return NULL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    frame-&gt;root = stack;</div><div class='add'>+    frame-&gt;this = xl;</div><div class='add'>+    LOCK_INIT(&amp;frame-&gt;lock);</div><div class='add'>+    INIT_LIST_HEAD(&amp;frame-&gt;frames);</div><div class='add'>+    list_add(&amp;frame-&gt;frames, &amp;stack-&gt;myframes);</div><div class='add'>+</div><div class='add'>+    stack-&gt;pool = pool;</div><div class='add'>+    stack-&gt;ctx = xl-&gt;ctx;</div><div class='add'>+</div><div class='add'>+    if (frame-&gt;root-&gt;ctx-&gt;measure_latency) {</div><div class='add'>+        timespec_now(&amp;stack-&gt;tv);</div><div class='add'>+        memcpy(&amp;frame-&gt;begin, &amp;stack-&gt;tv, sizeof(stack-&gt;tv));</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;pool-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        list_add(&amp;stack-&gt;all_frames, &amp;pool-&gt;all_frames);</div><div class='add'>+        pool-&gt;cnt++;</div><div class='add'>+        stack-&gt;unique = unique++;</div><div class='add'>+    }</div><div class='add'>+    UNLOCK(&amp;pool-&gt;lock);</div><div class='add'>+    GF_ATOMIC_INC(pool-&gt;total_count);</div><div class='add'>+</div><div class='add'>+    LOCK_INIT(&amp;stack-&gt;stack_lock);</div><div class='add'>+</div><div class='add'>+    return frame;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        if (!call_frame)</div><div class='del'>-                return count;</div><div class='add'>+void</div><div class='add'>+call_stack_set_groups(call_stack_t *stack, int ngrps, gid_t **groupbuf_p)</div><div class='add'>+{</div><div class='add'>+    /* We take the ownership of the passed group buffer. */</div><div class='add'>+</div><div class='add'>+    if (ngrps &lt;= SMALL_GROUP_COUNT) {</div><div class='add'>+        memcpy(stack-&gt;groups_small, *groupbuf_p, sizeof(gid_t) * ngrps);</div><div class='add'>+        stack-&gt;groups = stack-&gt;groups_small;</div><div class='add'>+        GF_FREE(*groupbuf_p);</div><div class='add'>+    } else {</div><div class='add'>+        stack-&gt;groups_large = *groupbuf_p;</div><div class='add'>+        stack-&gt;groups = stack-&gt;groups_large;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    stack-&gt;ngrps = ngrps;</div><div class='add'>+    /* Set a canary. */</div><div class='add'>+    *groupbuf_p = (void *)0xdeadf00d;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        for (pos = call_frame; pos != NULL; pos = pos-&gt;next)</div><div class='del'>-                count++;</div><div class='add'>+void</div><div class='add'>+gf_proc_dump_call_frame(call_frame_t *call_frame, const char *key_buf, ...)</div><div class='add'>+{</div><div class='add'>+    char prefix[GF_DUMP_MAX_BUF_LEN];</div><div class='add'>+    va_list ap;</div><div class='add'>+    call_frame_t my_frame = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    int ret = -1;</div><div class='add'>+    char timestr[GF_TIMESTR_SIZE] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int len;</div><div class='add'>+</div><div class='add'>+    if (!call_frame)</div><div class='add'>+        return;</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(key_buf);</div><div class='add'>+</div><div class='add'>+    va_start(ap, key_buf);</div><div class='add'>+    vsnprintf(prefix, GF_DUMP_MAX_BUF_LEN, key_buf, ap);</div><div class='add'>+    va_end(ap);</div><div class='add'>+</div><div class='add'>+    ret = TRY_LOCK(&amp;call_frame-&gt;lock);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    memcpy(&amp;my_frame, call_frame, sizeof(my_frame));</div><div class='add'>+    UNLOCK(&amp;call_frame-&gt;lock);</div><div class='add'>+</div><div class='add'>+    if (my_frame.root-&gt;ctx-&gt;measure_latency) {</div><div class='add'>+        gf_time_fmt(timestr, sizeof(timestr), my_frame.begin.tv_sec,</div><div class='add'>+                    gf_timefmt_FT);</div><div class='add'>+        len = strlen(timestr);</div><div class='add'>+        snprintf(timestr + len, sizeof(timestr) - len, ".%" GF_PRI_SNSECONDS,</div><div class='add'>+                 my_frame.begin.tv_nsec);</div><div class='add'>+        gf_proc_dump_write("frame-creation-time", "%s", timestr);</div><div class='add'>+        gf_proc_dump_write(</div><div class='add'>+            "timings", "%ld.%" GF_PRI_SNSECONDS " -&gt; %ld.%" GF_PRI_SNSECONDS,</div><div class='add'>+            my_frame.begin.tv_sec, my_frame.begin.tv_nsec, my_frame.end.tv_sec,</div><div class='add'>+            my_frame.end.tv_nsec);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    gf_proc_dump_write("frame", "%p", call_frame);</div><div class='add'>+    gf_proc_dump_write("ref_count", "%d", my_frame.ref_count);</div><div class='add'>+    gf_proc_dump_write("translator", "%s", my_frame.this-&gt;name);</div><div class='add'>+    gf_proc_dump_write("complete", "%d", my_frame.complete);</div><div class='add'>+</div><div class='add'>+    if (my_frame.parent)</div><div class='add'>+        gf_proc_dump_write("parent", "%s", my_frame.parent-&gt;this-&gt;name);</div><div class='add'>+</div><div class='add'>+    if (my_frame.wind_from)</div><div class='add'>+        gf_proc_dump_write("wind_from", "%s", my_frame.wind_from);</div><div class='add'>+</div><div class='add'>+    if (my_frame.wind_to)</div><div class='add'>+        gf_proc_dump_write("wind_to", "%s", my_frame.wind_to);</div><div class='add'>+</div><div class='add'>+    if (my_frame.unwind_from)</div><div class='add'>+        gf_proc_dump_write("unwind_from", "%s", my_frame.unwind_from);</div><div class='add'>+</div><div class='add'>+    if (my_frame.unwind_to)</div><div class='add'>+        gf_proc_dump_write("unwind_to", "%s", my_frame.unwind_to);</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+out:</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_proc_dump_write("Unable to dump the frame information",</div><div class='add'>+                           "(Lock acquisition failed)");</div><div class='add'>+        return;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        return count;</div><div class='add'>+void</div><div class='add'>+gf_proc_dump_call_stack(call_stack_t *call_stack, const char *key_buf, ...)</div><div class='add'>+{</div><div class='add'>+    char prefix[GF_DUMP_MAX_BUF_LEN];</div><div class='add'>+    va_list ap;</div><div class='add'>+    call_frame_t *trav;</div><div class='add'>+    int32_t i = 1, cnt = 0;</div><div class='add'>+    char timestr[GF_TIMESTR_SIZE] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int len;</div><div class='add'>+</div><div class='add'>+    if (!call_stack)</div><div class='add'>+        return;</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(key_buf);</div><div class='add'>+</div><div class='add'>+    va_start(ap, key_buf);</div><div class='add'>+    vsnprintf(prefix, GF_DUMP_MAX_BUF_LEN, key_buf, ap);</div><div class='add'>+    va_end(ap);</div><div class='add'>+</div><div class='add'>+    cnt = call_frames_count(call_stack);</div><div class='add'>+    gf_time_fmt(timestr, sizeof(timestr), call_stack-&gt;tv.tv_sec, gf_timefmt_FT);</div><div class='add'>+    len = strlen(timestr);</div><div class='add'>+    snprintf(timestr + len, sizeof(timestr) - len, ".%" GF_PRI_SNSECONDS,</div><div class='add'>+             call_stack-&gt;tv.tv_nsec);</div><div class='add'>+    gf_proc_dump_write("callstack-creation-time", "%s", timestr);</div><div class='add'>+</div><div class='add'>+    gf_proc_dump_write("stack", "%p", call_stack);</div><div class='add'>+    gf_proc_dump_write("uid", "%d", call_stack-&gt;uid);</div><div class='add'>+    gf_proc_dump_write("gid", "%d", call_stack-&gt;gid);</div><div class='add'>+    gf_proc_dump_write("pid", "%d", call_stack-&gt;pid);</div><div class='add'>+    gf_proc_dump_write("unique", "%" PRIu64, call_stack-&gt;unique);</div><div class='add'>+    gf_proc_dump_write("lk-owner", "%s", lkowner_utoa(&amp;call_stack-&gt;lk_owner));</div><div class='add'>+    gf_proc_dump_write("ctime", "%" GF_PRI_SECOND ".%" GF_PRI_SNSECONDS,</div><div class='add'>+                       call_stack-&gt;tv.tv_sec, call_stack-&gt;tv.tv_nsec);</div><div class='add'>+</div><div class='add'>+    if (call_stack-&gt;type == GF_OP_TYPE_FOP)</div><div class='add'>+        gf_proc_dump_write("op", "%s", (char *)gf_fop_list[call_stack-&gt;op]);</div><div class='add'>+    else</div><div class='add'>+        gf_proc_dump_write("op", "stack");</div><div class='add'>+</div><div class='add'>+    gf_proc_dump_write("type", "%d", call_stack-&gt;type);</div><div class='add'>+    gf_proc_dump_write("cnt", "%d", cnt);</div><div class='add'>+</div><div class='add'>+    list_for_each_entry(trav, &amp;call_stack-&gt;myframes, frames)</div><div class='add'>+    {</div><div class='add'>+        gf_proc_dump_add_section("%s.frame.%d", prefix, i);</div><div class='add'>+        gf_proc_dump_call_frame(trav, "%s.frame.%d", prefix, i);</div><div class='add'>+        i++;</div><div class='add'>+    }</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> void</div><div class='del'>-gf_proc_dump_call_frame (call_frame_t *call_frame, const char *key_buf,...)</div><div class='add'>+gf_proc_dump_pending_frames(call_pool_t *call_pool)</div><div class='ctx'> {</div><div class='del'>-    </div><div class='del'>-        char prefix[GF_DUMP_MAX_BUF_LEN];</div><div class='del'>-        va_list ap;</div><div class='del'>-        char key[GF_DUMP_MAX_BUF_LEN];</div><div class='del'>-        call_frame_t my_frame;</div><div class='del'>-        int  ret = -1;</div><div class='del'>-</div><div class='del'>-        if (!call_frame)</div><div class='del'>-                return;</div><div class='del'>-</div><div class='del'>-        assert(key_buf);</div><div class='del'>-</div><div class='del'>-        memset(prefix, 0, sizeof(prefix));</div><div class='del'>-        memset(&amp;my_frame, 0, sizeof(my_frame));</div><div class='del'>-        va_start(ap, key_buf);</div><div class='del'>-        vsnprintf(prefix, GF_DUMP_MAX_BUF_LEN, key_buf, ap); </div><div class='del'>-        va_end(ap);</div><div class='del'>-</div><div class='del'>-        ret = TRY_LOCK(&amp;call_frame-&gt;lock);</div><div class='del'>-        if (ret) {</div><div class='del'>-                gf_log("", GF_LOG_WARNING, "Unable to dump call frame"</div><div class='del'>-                " errno: %d", errno);</div><div class='del'>-                return;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        memcpy(&amp;my_frame, call_frame, sizeof(my_frame));</div><div class='del'>-        UNLOCK(&amp;call_frame-&gt;lock);</div><div class='del'>-</div><div class='del'>-	gf_proc_dump_build_key(key, prefix,"ref_count");</div><div class='del'>-        gf_proc_dump_write(key, "%d", my_frame.ref_count);</div><div class='del'>-	gf_proc_dump_build_key(key, prefix,"translator");</div><div class='del'>-        gf_proc_dump_write(key, "%s", my_frame.this-&gt;name);</div><div class='del'>-	gf_proc_dump_build_key(key, prefix,"complete");</div><div class='del'>-        gf_proc_dump_write(key, "%d", my_frame.complete);</div><div class='del'>-        if (my_frame.parent) {</div><div class='del'>-                gf_proc_dump_build_key(key, prefix,"parent");</div><div class='del'>-                gf_proc_dump_write(key, "%s", my_frame.parent-&gt;this-&gt;name);</div><div class='del'>-        }</div><div class='add'>+    call_stack_t *trav = NULL;</div><div class='add'>+    int i = 1;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    gf_boolean_t section_added = _gf_false;</div><div class='add'>+</div><div class='add'>+    if (!call_pool)</div><div class='add'>+        return;</div><div class='add'>+</div><div class='add'>+    ret = TRY_LOCK(&amp;(call_pool-&gt;lock));</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    gf_proc_dump_add_section("global.callpool");</div><div class='add'>+    section_added = _gf_true;</div><div class='add'>+    gf_proc_dump_write("callpool_address", "%p", call_pool);</div><div class='add'>+    gf_proc_dump_write("callpool.cnt", "%" PRId64, call_pool-&gt;cnt);</div><div class='add'>+</div><div class='add'>+    list_for_each_entry(trav, &amp;call_pool-&gt;all_frames, all_frames)</div><div class='add'>+    {</div><div class='add'>+        gf_proc_dump_add_section("global.callpool.stack.%d", i);</div><div class='add'>+        gf_proc_dump_call_stack(trav, "global.callpool.stack.%d", i);</div><div class='add'>+        i++;</div><div class='add'>+    }</div><div class='add'>+    UNLOCK(&amp;(call_pool-&gt;lock));</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+out:</div><div class='add'>+    if (ret) {</div><div class='add'>+        if (_gf_false == section_added)</div><div class='add'>+            gf_proc_dump_add_section("global.callpool");</div><div class='add'>+        gf_proc_dump_write("Unable to dump the callpool",</div><div class='add'>+                           "(Lock acquisition failed) %p", call_pool);</div><div class='add'>+    }</div><div class='add'>+    return;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+void</div><div class='add'>+gf_proc_dump_call_frame_to_dict(call_frame_t *call_frame, char *prefix,</div><div class='add'>+                                dict_t *dict)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    char key[GF_DUMP_MAX_BUF_LEN] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    char msg[GF_DUMP_MAX_BUF_LEN] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    call_frame_t tmp_frame = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    if (!call_frame || !dict)</div><div class='add'>+        return;</div><div class='add'>+</div><div class='add'>+    ret = TRY_LOCK(&amp;call_frame-&gt;lock);</div><div class='add'>+    if (ret)</div><div class='add'>+        return;</div><div class='add'>+    memcpy(&amp;tmp_frame, call_frame, sizeof(tmp_frame));</div><div class='add'>+    UNLOCK(&amp;call_frame-&gt;lock);</div><div class='add'>+</div><div class='add'>+    snprintf(key, sizeof(key), "%s.refcount", prefix);</div><div class='add'>+    ret = dict_set_int32(dict, key, tmp_frame.ref_count);</div><div class='add'>+    if (ret)</div><div class='add'>+        return;</div><div class='add'>+</div><div class='add'>+    snprintf(key, sizeof(key), "%s.translator", prefix);</div><div class='add'>+    ret = dict_set_dynstr(dict, key, gf_strdup(tmp_frame.this-&gt;name));</div><div class='add'>+    if (ret)</div><div class='add'>+        return;</div><div class='add'>+</div><div class='add'>+    snprintf(key, sizeof(key), "%s.complete", prefix);</div><div class='add'>+    ret = dict_set_int32(dict, key, tmp_frame.complete);</div><div class='add'>+    if (ret)</div><div class='add'>+        return;</div><div class='add'>+</div><div class='add'>+    if (tmp_frame.root-&gt;ctx-&gt;measure_latency) {</div><div class='add'>+        snprintf(key, sizeof(key), "%s.timings", prefix);</div><div class='add'>+        snprintf(msg, sizeof(msg),</div><div class='add'>+                 "%ld.%" GF_PRI_SNSECONDS " -&gt; %ld.%" GF_PRI_SNSECONDS,</div><div class='add'>+                 tmp_frame.begin.tv_sec, tmp_frame.begin.tv_nsec,</div><div class='add'>+                 tmp_frame.end.tv_sec, tmp_frame.end.tv_nsec);</div><div class='add'>+        ret = dict_set_str(dict, key, msg);</div><div class='add'>+        if (ret)</div><div class='add'>+            return;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (tmp_frame.parent) {</div><div class='add'>+        snprintf(key, sizeof(key), "%s.parent", prefix);</div><div class='add'>+        ret = dict_set_dynstr(dict, key,</div><div class='add'>+                              gf_strdup(tmp_frame.parent-&gt;this-&gt;name));</div><div class='add'>+        if (ret)</div><div class='add'>+            return;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (tmp_frame.wind_from) {</div><div class='add'>+        snprintf(key, sizeof(key), "%s.windfrom", prefix);</div><div class='add'>+        ret = dict_set_dynstr(dict, key, gf_strdup(tmp_frame.wind_from));</div><div class='add'>+        if (ret)</div><div class='add'>+            return;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (tmp_frame.wind_to) {</div><div class='add'>+        snprintf(key, sizeof(key), "%s.windto", prefix);</div><div class='add'>+        ret = dict_set_dynstr(dict, key, gf_strdup(tmp_frame.wind_to));</div><div class='add'>+        if (ret)</div><div class='add'>+            return;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (tmp_frame.unwind_from) {</div><div class='add'>+        snprintf(key, sizeof(key), "%s.unwindfrom", prefix);</div><div class='add'>+        ret = dict_set_dynstr(dict, key, gf_strdup(tmp_frame.unwind_from));</div><div class='add'>+        if (ret)</div><div class='add'>+            return;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (tmp_frame.unwind_to) {</div><div class='add'>+        snprintf(key, sizeof(key), "%s.unwind_to", prefix);</div><div class='add'>+        ret = dict_set_dynstr(dict, key, gf_strdup(tmp_frame.unwind_to));</div><div class='add'>+        if (ret)</div><div class='add'>+            return;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> void</div><div class='del'>-gf_proc_dump_call_stack (call_stack_t *call_stack, const char *key_buf,...)</div><div class='add'>+gf_proc_dump_call_stack_to_dict(call_stack_t *call_stack, char *prefix,</div><div class='add'>+                                dict_t *dict)</div><div class='ctx'> {</div><div class='del'>-        char prefix[GF_DUMP_MAX_BUF_LEN];</div><div class='del'>-        va_list ap;</div><div class='del'>-        call_frame_t *trav;</div><div class='del'>-        int32_t cnt, i;</div><div class='del'>-        char key[GF_DUMP_MAX_BUF_LEN];</div><div class='del'>-</div><div class='del'>-        if (!call_stack)</div><div class='del'>-                return;</div><div class='del'>-</div><div class='del'>-        assert(key_buf);</div><div class='del'>-</div><div class='del'>-        cnt = call_frames_count(&amp;call_stack-&gt;frames);</div><div class='del'>-</div><div class='del'>-        memset(prefix, 0, sizeof(prefix));</div><div class='del'>-        va_start(ap, key_buf);</div><div class='del'>-        vsnprintf(prefix, GF_DUMP_MAX_BUF_LEN, key_buf, ap); </div><div class='del'>-        va_end(ap);</div><div class='del'>-</div><div class='del'>-	gf_proc_dump_build_key(key, prefix,"uid");</div><div class='del'>-        gf_proc_dump_write(key, "%d", call_stack-&gt;uid);</div><div class='del'>-	gf_proc_dump_build_key(key, prefix,"gid");</div><div class='del'>-        gf_proc_dump_write(key, "%d", call_stack-&gt;gid);</div><div class='del'>-	gf_proc_dump_build_key(key, prefix,"pid");</div><div class='del'>-        gf_proc_dump_write(key, "%d", call_stack-&gt;pid);</div><div class='del'>-	gf_proc_dump_build_key(key, prefix,"unique");</div><div class='del'>-        gf_proc_dump_write(key, "%Ld", call_stack-&gt;unique);</div><div class='del'>-</div><div class='del'>-	gf_proc_dump_build_key(key, prefix,"op");</div><div class='del'>-        if (call_stack-&gt;type == GF_OP_TYPE_FOP)</div><div class='del'>-                gf_proc_dump_write(key, "%s", gf_fop_list[call_stack-&gt;op]);</div><div class='del'>-        else if (call_stack-&gt;type == GF_OP_TYPE_MGMT)</div><div class='del'>-                gf_proc_dump_write(key, "%s", gf_mgmt_list[call_stack-&gt;op]);</div><div class='del'>-</div><div class='del'>-	gf_proc_dump_build_key(key, prefix,"type");</div><div class='del'>-        gf_proc_dump_write(key, "%d", call_stack-&gt;type);</div><div class='del'>-	gf_proc_dump_build_key(key, prefix,"cnt");</div><div class='del'>-        gf_proc_dump_write(key, "%d", cnt);</div><div class='del'>-</div><div class='del'>-        trav = &amp;call_stack-&gt;frames;</div><div class='del'>-</div><div class='del'>-        for (i = 1; i &lt;= cnt; i++) {</div><div class='del'>-                if (trav) {</div><div class='del'>-                        gf_proc_dump_add_section("%s.frame.%d", prefix, i);</div><div class='del'>-                        gf_proc_dump_call_frame(trav, "%s.frame.%d", prefix, i);</div><div class='del'>-                        trav = trav-&gt;next; </div><div class='del'>-                }</div><div class='del'>-        }</div><div class='add'>+    int ret = -1;</div><div class='add'>+    char key[GF_DUMP_MAX_BUF_LEN] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    call_frame_t *trav = NULL;</div><div class='add'>+    int i = 0;</div><div class='add'>+    int count = 0;</div><div class='add'>+</div><div class='add'>+    if (!call_stack || !dict)</div><div class='add'>+        return;</div><div class='add'>+</div><div class='add'>+    count = call_frames_count(call_stack);</div><div class='add'>+    snprintf(key, sizeof(key), "%s.uid", prefix);</div><div class='add'>+    ret = dict_set_int32(dict, key, call_stack-&gt;uid);</div><div class='add'>+    if (ret)</div><div class='add'>+        return;</div><div class='add'>+</div><div class='add'>+    snprintf(key, sizeof(key), "%s.gid", prefix);</div><div class='add'>+    ret = dict_set_int32(dict, key, call_stack-&gt;gid);</div><div class='add'>+    if (ret)</div><div class='add'>+        return;</div><div class='add'>+</div><div class='add'>+    snprintf(key, sizeof(key), "%s.pid", prefix);</div><div class='add'>+    ret = dict_set_int32(dict, key, call_stack-&gt;pid);</div><div class='add'>+    if (ret)</div><div class='add'>+        return;</div><div class='add'>+</div><div class='add'>+    snprintf(key, sizeof(key), "%s.unique", prefix);</div><div class='add'>+    ret = dict_set_uint64(dict, key, call_stack-&gt;unique);</div><div class='add'>+    if (ret)</div><div class='add'>+        return;</div><div class='add'>+</div><div class='add'>+    snprintf(key, sizeof(key), "%s.op", prefix);</div><div class='add'>+    if (call_stack-&gt;type == GF_OP_TYPE_FOP)</div><div class='add'>+        ret = dict_set_str(dict, key, (char *)gf_fop_list[call_stack-&gt;op]);</div><div class='add'>+    else</div><div class='add'>+        ret = dict_set_str(dict, key, "other");</div><div class='add'>+</div><div class='add'>+    if (ret)</div><div class='add'>+        return;</div><div class='add'>+</div><div class='add'>+    snprintf(key, sizeof(key), "%s.type", prefix);</div><div class='add'>+    ret = dict_set_int32(dict, key, call_stack-&gt;type);</div><div class='add'>+    if (ret)</div><div class='add'>+        return;</div><div class='add'>+</div><div class='add'>+    snprintf(key, sizeof(key), "%s.count", prefix);</div><div class='add'>+    ret = dict_set_int32(dict, key, count);</div><div class='add'>+    if (ret)</div><div class='add'>+        return;</div><div class='add'>+</div><div class='add'>+    list_for_each_entry(trav, &amp;call_stack-&gt;myframes, frames)</div><div class='add'>+    {</div><div class='add'>+        snprintf(key, sizeof(key), "%s.frame%d", prefix, i);</div><div class='add'>+        gf_proc_dump_call_frame_to_dict(trav, key, dict);</div><div class='add'>+        i++;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> void</div><div class='del'>-gf_proc_dump_pending_frames (call_pool_t *call_pool)</div><div class='add'>+gf_proc_dump_pending_frames_to_dict(call_pool_t *call_pool, dict_t *dict)</div><div class='ctx'> {</div><div class='del'>-		</div><div class='del'>-        call_stack_t     *trav = NULL;</div><div class='del'>-        int              i = 1;</div><div class='del'>-        int              ret = -1;</div><div class='del'>-</div><div class='del'>-        if (!call_pool)</div><div class='del'>-                return;</div><div class='del'>-</div><div class='del'>-        ret = TRY_LOCK (&amp;(call_pool-&gt;lock));</div><div class='del'>-        if (ret) {</div><div class='del'>-                gf_log("", GF_LOG_WARNING, "Unable to dump call pool"</div><div class='del'>-                " errno: %d", errno);</div><div class='del'>-                return;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        </div><div class='del'>-        gf_proc_dump_add_section("global.callpool");</div><div class='del'>-        gf_proc_dump_write("global.callpool","%p", call_pool);</div><div class='del'>-        gf_proc_dump_write("global.callpool.cnt","%d", call_pool-&gt;cnt);</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-        list_for_each_entry (trav, &amp;call_pool-&gt;all_frames, all_frames) {</div><div class='del'>-                gf_proc_dump_add_section("global.callpool.stack.%d",i);</div><div class='del'>-                gf_proc_dump_call_stack(trav, "global.callpool.stack.%d", i);</div><div class='del'>-                i++;</div><div class='del'>-        }</div><div class='del'>-	UNLOCK (&amp;(call_pool-&gt;lock));</div><div class='add'>+    int ret = -1;</div><div class='add'>+    call_stack_t *trav = NULL;</div><div class='add'>+    char key[GF_DUMP_MAX_BUF_LEN] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int i = 0;</div><div class='add'>+</div><div class='add'>+    if (!call_pool || !dict)</div><div class='add'>+        return;</div><div class='add'>+</div><div class='add'>+    ret = TRY_LOCK(&amp;call_pool-&gt;lock);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_msg(THIS-&gt;name, GF_LOG_WARNING, errno, LG_MSG_LOCK_FAILURE,</div><div class='add'>+               "Unable to dump call "</div><div class='add'>+               "pool to dict.");</div><div class='add'>+        return;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_set_int32(dict, "callpool.count", call_pool-&gt;cnt);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    list_for_each_entry(trav, &amp;call_pool-&gt;all_frames, all_frames)</div><div class='add'>+    {</div><div class='add'>+        snprintf(key, sizeof(key), "callpool.stack%d", i);</div><div class='add'>+        gf_proc_dump_call_stack_to_dict(trav, key, dict);</div><div class='add'>+        i++;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    UNLOCK(&amp;call_pool-&gt;lock);</div><div class='add'>+</div><div class='add'>+    return;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+gf_boolean_t</div><div class='add'>+__is_fuse_call(call_frame_t *frame)</div><div class='add'>+{</div><div class='add'>+    gf_boolean_t is_fuse_call = _gf_false;</div><div class='add'>+    GF_ASSERT(frame);</div><div class='add'>+    GF_ASSERT(frame-&gt;root);</div><div class='add'>+</div><div class='add'>+    if (NFS_PID != frame-&gt;root-&gt;pid)</div><div class='add'>+        is_fuse_call = _gf_true;</div><div class='add'>+    return is_fuse_call;</div><div class='add'>+}</div><div class='head'>diff --git a/libglusterfs/src/stack.h b/libglusterfs/src/stack.h<br/>deleted file mode 100644<br/>index 55bcecc4b80..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/libglusterfs/src/stack.h?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/stack.h</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,403 +0,0 @@</div><div class='del'>-/* </div><div class='del'>-  Copyright (c) 2006-2009 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='del'>-  This file is part of GlusterFS.</div><div class='del'>-</div><div class='del'>-  GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-  it under the terms of the GNU General Public License as published</div><div class='del'>-  by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-  or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-  GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-  WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-  General Public License for more details.</div><div class='del'>-</div><div class='del'>-  You should have received a copy of the GNU General Public License</div><div class='del'>-  along with this program.  If not, see</div><div class='del'>-  &lt;http://www.gnu.org/licenses/&gt;.</div><div class='del'>-*/</div><div class='del'>-</div><div class='del'>-/*</div><div class='del'>-  This file defines MACROS and static inlines used to emulate a function</div><div class='del'>-  call over asynchronous communication with remote server</div><div class='del'>-*/</div><div class='del'>-</div><div class='del'>-#ifndef _STACK_H</div><div class='del'>-#define _STACK_H</div><div class='del'>-</div><div class='del'>-#ifndef _CONFIG_H</div><div class='del'>-#define _CONFIG_H</div><div class='del'>-#include "config.h"</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-struct _call_stack_t;</div><div class='del'>-typedef struct _call_stack_t call_stack_t;</div><div class='del'>-struct _call_frame_t;</div><div class='del'>-typedef struct _call_frame_t call_frame_t;</div><div class='del'>-struct _call_pool_t;</div><div class='del'>-typedef struct _call_pool_t call_pool_t;</div><div class='del'>-</div><div class='del'>-#include &lt;sys/time.h&gt;</div><div class='del'>-</div><div class='del'>-#include "xlator.h"</div><div class='del'>-#include "dict.h"</div><div class='del'>-#include "list.h"</div><div class='del'>-#include "common-utils.h"</div><div class='del'>-#include "globals.h"</div><div class='del'>-</div><div class='del'>-typedef int32_t (*ret_fn_t) (call_frame_t *frame,</div><div class='del'>-			     call_frame_t *prev_frame,</div><div class='del'>-			     xlator_t *this,</div><div class='del'>-			     int32_t op_ret,</div><div class='del'>-			     int32_t op_errno,</div><div class='del'>-			     ...);</div><div class='del'>-</div><div class='del'>-struct _call_pool_t {</div><div class='del'>-	union {</div><div class='del'>-		struct list_head   all_frames;</div><div class='del'>-		struct {</div><div class='del'>-			call_stack_t *next_call;</div><div class='del'>-			call_stack_t *prev_call;</div><div class='del'>-		} all_stacks;</div><div class='del'>-	};</div><div class='del'>-	int64_t                     cnt;</div><div class='del'>-	gf_lock_t                   lock;</div><div class='del'>-       struct mem_pool             *frame_mem_pool;</div><div class='del'>-       struct mem_pool             *stack_mem_pool;</div><div class='del'>-};</div><div class='del'>-</div><div class='del'>-struct _call_frame_t {</div><div class='del'>-	call_stack_t *root;        /* stack root */</div><div class='del'>-	call_frame_t *parent;      /* previous BP */</div><div class='del'>-	call_frame_t *next;</div><div class='del'>-	call_frame_t *prev;        /* maintainence list */</div><div class='del'>-	void         *local;       /* local variables */</div><div class='del'>-	xlator_t     *this;        /* implicit object */</div><div class='del'>-	ret_fn_t      ret;         /* op_return address */</div><div class='del'>-	int32_t       ref_count;</div><div class='del'>-	gf_lock_t     lock;</div><div class='del'>-	void         *cookie;      /* unique cookie */</div><div class='del'>-	gf_boolean_t  complete;</div><div class='del'>-</div><div class='del'>-	glusterfs_fop_t op;</div><div class='del'>-        struct timeval begin;      /* when this frame was created */</div><div class='del'>-        struct timeval end;        /* when this frame completed */</div><div class='del'>-};</div><div class='del'>-</div><div class='del'>-struct _call_stack_t {</div><div class='del'>-	union {</div><div class='del'>-		struct list_head      all_frames;</div><div class='del'>-		struct {</div><div class='del'>-			call_stack_t *next_call;</div><div class='del'>-			call_stack_t *prev_call;</div><div class='del'>-		};</div><div class='del'>-	};</div><div class='del'>-	call_pool_t                  *pool;</div><div class='del'>-	void                         *trans;</div><div class='del'>-	uint64_t                      unique;</div><div class='del'>-	void                         *state;  /* pointer to request state */</div><div class='del'>-	uid_t                         uid;</div><div class='del'>-	gid_t                         gid;</div><div class='del'>-	pid_t                         pid;</div><div class='del'>-        uint32_t                      ngrps;</div><div class='del'>-        uint32_t                      groups[GF_REQUEST_MAXGROUPS];</div><div class='del'>-        uint64_t                      lk_owner;</div><div class='del'>-</div><div class='del'>-	call_frame_t                  frames;</div><div class='del'>-</div><div class='del'>-	int32_t                       op;</div><div class='del'>-	int8_t                        type;</div><div class='del'>-};</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-#define frame_set_uid_gid(frm, u, g)                                    \</div><div class='del'>-        do {                                                            \</div><div class='del'>-                if (frm) {                                              \</div><div class='del'>-                        (frm)-&gt;root-&gt;uid = u;                           \</div><div class='del'>-                        (frm)-&gt;root-&gt;gid = g;                           \</div><div class='del'>-                        (frm)-&gt;root-&gt;ngrps = 0;                         \</div><div class='del'>-                }                                                       \</div><div class='del'>-        } while (0);                                                    \</div><div class='del'>-</div><div class='del'>-struct xlator_fops;</div><div class='del'>-</div><div class='del'>-void</div><div class='del'>-gf_set_fop_from_fn_pointer (call_frame_t *frame, struct xlator_fops *fops,</div><div class='del'>-                            void *fn);</div><div class='del'>-</div><div class='del'>-void</div><div class='del'>-gf_update_latency (call_frame_t *frame);</div><div class='del'>-</div><div class='del'>-static inline void</div><div class='del'>-FRAME_DESTROY (call_frame_t *frame)</div><div class='del'>-{</div><div class='del'>-       void *local = NULL;</div><div class='del'>-	if (frame-&gt;next)</div><div class='del'>-		frame-&gt;next-&gt;prev = frame-&gt;prev;</div><div class='del'>-	if (frame-&gt;prev)</div><div class='del'>-		frame-&gt;prev-&gt;next = frame-&gt;next;</div><div class='del'>-	if (frame-&gt;local) {</div><div class='del'>-               local = frame-&gt;local;</div><div class='del'>-               frame-&gt;local = NULL;</div><div class='del'>-                </div><div class='del'>-       } </div><div class='del'>-</div><div class='del'>-	LOCK_DESTROY (&amp;frame-&gt;lock);</div><div class='del'>-	mem_put (frame-&gt;root-&gt;pool-&gt;frame_mem_pool, frame);</div><div class='del'>-</div><div class='del'>-       if (local)</div><div class='del'>-               GF_FREE (local);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-static inline void</div><div class='del'>-STACK_DESTROY (call_stack_t *stack)</div><div class='del'>-{</div><div class='del'>-        glusterfs_ctx_t *ctx = glusterfs_ctx_get ();</div><div class='del'>-        void *local = NULL;</div><div class='del'>-</div><div class='del'>-        if (ctx &amp;&amp; ctx-&gt;measure_latency) {</div><div class='del'>-                gettimeofday (&amp;stack-&gt;frames.end, NULL);</div><div class='del'>-                gf_update_latency (&amp;stack-&gt;frames);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-	LOCK (&amp;stack-&gt;pool-&gt;lock);</div><div class='del'>-	{</div><div class='del'>-		list_del_init (&amp;stack-&gt;all_frames);</div><div class='del'>-		stack-&gt;pool-&gt;cnt--;</div><div class='del'>-	}</div><div class='del'>-	UNLOCK (&amp;stack-&gt;pool-&gt;lock);</div><div class='del'>-</div><div class='del'>-	if (stack-&gt;frames.local) {</div><div class='del'>-               local = stack-&gt;frames.local;</div><div class='del'>-		stack-&gt;frames.local = NULL;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	LOCK_DESTROY (&amp;stack-&gt;frames.lock);</div><div class='del'>-</div><div class='del'>-	while (stack-&gt;frames.next) {</div><div class='del'>-                if (ctx &amp;&amp; ctx-&gt;measure_latency) {</div><div class='del'>-                        gf_update_latency (stack-&gt;frames.next);</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-		FRAME_DESTROY (stack-&gt;frames.next);</div><div class='del'>-	}</div><div class='del'>-	mem_put (stack-&gt;pool-&gt;stack_mem_pool, stack);</div><div class='del'>-</div><div class='del'>-       if (local)</div><div class='del'>-               GF_FREE (local);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-#define cbk(x) cbk_##x</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-/* make a call */</div><div class='del'>-#define STACK_WIND(frame, rfn, obj, fn, params ...)			\</div><div class='del'>-	do {								\</div><div class='del'>-		call_frame_t *_new = NULL;				\</div><div class='del'>-                xlator_t     *old_THIS = NULL;                          \</div><div class='del'>-                                                                        \</div><div class='del'>-		 _new = mem_get0 (frame-&gt;root-&gt;pool-&gt;frame_mem_pool);     \</div><div class='del'>-                if (!_new) {                                            \</div><div class='del'>-                        gf_log ("stack", GF_LOG_ERROR, "alloc failed"); \</div><div class='del'>-                        break;                                          \</div><div class='del'>-                }                                                       \</div><div class='del'>-		typeof(fn##_cbk) tmp_cbk = rfn;				\</div><div class='del'>-		_new-&gt;root = frame-&gt;root;				\</div><div class='del'>-		_new-&gt;next = frame-&gt;root-&gt;frames.next;			\</div><div class='del'>-		_new-&gt;prev = &amp;frame-&gt;root-&gt;frames;			\</div><div class='del'>-		if (frame-&gt;root-&gt;frames.next)				\</div><div class='del'>-			frame-&gt;root-&gt;frames.next-&gt;prev = _new;		\</div><div class='del'>-		frame-&gt;root-&gt;frames.next = _new;			\</div><div class='del'>-		_new-&gt;this = obj;					\</div><div class='del'>-		_new-&gt;ret = (ret_fn_t) tmp_cbk;				\</div><div class='del'>-		_new-&gt;parent = frame;					\</div><div class='del'>-		_new-&gt;cookie = _new;					\</div><div class='del'>-		LOCK_INIT (&amp;_new-&gt;lock);				\</div><div class='del'>-		frame-&gt;ref_count++;					\</div><div class='del'>-                                                                        \</div><div class='del'>-                if (((xlator_t *) obj)-&gt;ctx-&gt;measure_latency) {         \</div><div class='del'>-                        gettimeofday (&amp;_new-&gt;begin, NULL);              \</div><div class='del'>-                        gf_set_fop_from_fn_pointer (_new, ((xlator_t *)obj)-&gt;fops, fn); \</div><div class='del'>-                }                                                       \</div><div class='del'>-                                                                        \</div><div class='del'>-                old_THIS = THIS;                                        \</div><div class='del'>-                THIS = obj;                                             \</div><div class='del'>-		fn (_new, obj, params);					\</div><div class='del'>-                THIS = old_THIS;                                        \</div><div class='del'>-	} while (0)</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-/* make a call with a cookie */</div><div class='del'>-#define STACK_WIND_COOKIE(frame, rfn, cky, obj, fn, params ...)		\</div><div class='del'>-	do {								\</div><div class='del'>-                call_frame_t *_new = NULL;                              \</div><div class='del'>-                xlator_t     *old_THIS = NULL;                          \</div><div class='del'>-                                                                        \</div><div class='del'>-                _new = mem_get0 (frame-&gt;root-&gt;pool-&gt;frame_mem_pool);      \</div><div class='del'>-                if (!_new) {                                            \</div><div class='del'>-                        gf_log ("stack", GF_LOG_ERROR, "alloc failed"); \</div><div class='del'>-                        break;                                          \</div><div class='del'>-                }                                                       \</div><div class='del'>-		typeof(fn##_cbk) tmp_cbk = rfn;				\</div><div class='del'>-		_new-&gt;root = frame-&gt;root;				\</div><div class='del'>-		_new-&gt;next = frame-&gt;root-&gt;frames.next;			\</div><div class='del'>-		_new-&gt;prev = &amp;frame-&gt;root-&gt;frames;			\</div><div class='del'>-		if (frame-&gt;root-&gt;frames.next)				\</div><div class='del'>-			frame-&gt;root-&gt;frames.next-&gt;prev = _new;		\</div><div class='del'>-		frame-&gt;root-&gt;frames.next = _new;			\</div><div class='del'>-		_new-&gt;this = obj;					\</div><div class='del'>-		_new-&gt;ret = (ret_fn_t) tmp_cbk;				\</div><div class='del'>-		_new-&gt;parent = frame;					\</div><div class='del'>-		_new-&gt;cookie = cky;					\</div><div class='del'>-		LOCK_INIT (&amp;_new-&gt;lock);				\</div><div class='del'>-		frame-&gt;ref_count++;					\</div><div class='del'>-		fn##_cbk = rfn;						\</div><div class='del'>-                                                                        \</div><div class='del'>-                if (((xlator_t *) obj)-&gt;ctx-&gt;measure_latency) {         \</div><div class='del'>-                        gettimeofday (&amp;_new-&gt;begin, NULL);              \</div><div class='del'>-                        gf_set_fop_from_fn_pointer (_new, ((xlator_t *)obj)-&gt;fops, fn); \</div><div class='del'>-                }                                                       \</div><div class='del'>-                                                                        \</div><div class='del'>-                old_THIS = THIS;                                        \</div><div class='del'>-                THIS = obj;                                             \</div><div class='del'>-		fn (_new, obj, params);					\</div><div class='del'>-                THIS = old_THIS;                                        \</div><div class='del'>-	} while (0)</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-/* return from function */</div><div class='del'>-#define STACK_UNWIND(frame, params ...)					\</div><div class='del'>-	do {								\</div><div class='del'>-		ret_fn_t      fn = NULL;                                \</div><div class='del'>-		call_frame_t *_parent = NULL;                           \</div><div class='del'>-                xlator_t     *old_THIS = NULL;                          \</div><div class='del'>-                if (!frame) {                                           \</div><div class='del'>-                        gf_log ("stack", GF_LOG_CRITICAL, "!frame");    \</div><div class='del'>-                        break;                                          \</div><div class='del'>-                }                                                       \</div><div class='del'>-                fn = frame-&gt;ret;                                        \</div><div class='del'>-                _parent = frame-&gt;parent;                                \</div><div class='del'>-		_parent-&gt;ref_count--;					\</div><div class='del'>-                old_THIS = THIS;                                        \</div><div class='del'>-                THIS = _parent-&gt;this;                                   \</div><div class='del'>-                frame-&gt;complete = _gf_true;                             \</div><div class='del'>-                                                                        \</div><div class='del'>-                if (((xlator_t *) old_THIS)-&gt;ctx-&gt;measure_latency) {	\</div><div class='del'>-			gettimeofday (&amp;frame-&gt;end, NULL);		\</div><div class='del'>-                }                                                       \</div><div class='del'>-                                                                        \</div><div class='del'>-		fn (_parent, frame-&gt;cookie, _parent-&gt;this, params);	\</div><div class='del'>-                THIS = old_THIS;                                        \</div><div class='del'>-	} while (0)</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-/* return from function in type-safe way */</div><div class='del'>-#define STACK_UNWIND_STRICT(op, frame, params ...)                      \</div><div class='del'>-	do {								\</div><div class='del'>-		fop_##op##_cbk_t      fn = NULL;                        \</div><div class='del'>-		call_frame_t *_parent = NULL;                           \</div><div class='del'>-                xlator_t     *old_THIS = NULL;                          \</div><div class='del'>-                                                                        \</div><div class='del'>-                if (!frame) {                                           \</div><div class='del'>-                        gf_log ("stack", GF_LOG_CRITICAL, "!frame");    \</div><div class='del'>-                        break;                                          \</div><div class='del'>-                }                                                       \</div><div class='del'>-                fn = (fop_##op##_cbk_t )frame-&gt;ret;                     \</div><div class='del'>-                _parent = frame-&gt;parent;                                \</div><div class='del'>-		_parent-&gt;ref_count--;					\</div><div class='del'>-                old_THIS = THIS;                                        \</div><div class='del'>-                THIS = _parent-&gt;this;                                   \</div><div class='del'>-                frame-&gt;complete = _gf_true;                             \</div><div class='del'>-                                                                        \</div><div class='del'>-                if (((xlator_t *) old_THIS)-&gt;ctx-&gt;measure_latency) {	\</div><div class='del'>-                        gettimeofday (&amp;frame-&gt;end, NULL);               \</div><div class='del'>-                }                                                       \</div><div class='del'>-                                                                        \</div><div class='del'>-		fn (_parent, frame-&gt;cookie, _parent-&gt;this, params);	\</div><div class='del'>-                THIS = old_THIS;                                        \</div><div class='del'>-	} while (0)</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-static inline call_frame_t *</div><div class='del'>-copy_frame (call_frame_t *frame)</div><div class='del'>-{</div><div class='del'>-	call_stack_t *newstack = NULL;</div><div class='del'>-	call_stack_t *oldstack = NULL;</div><div class='del'>-</div><div class='del'>-	if (!frame) {</div><div class='del'>-		return NULL;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	newstack = mem_get0 (frame-&gt;root-&gt;pool-&gt;stack_mem_pool);</div><div class='del'>-        if (newstack == NULL) {</div><div class='del'>-                return NULL;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-	oldstack = frame-&gt;root;</div><div class='del'>-</div><div class='del'>-	newstack-&gt;uid = oldstack-&gt;uid;</div><div class='del'>-	newstack-&gt;gid = oldstack-&gt;gid;</div><div class='del'>-	newstack-&gt;pid = oldstack-&gt;pid;</div><div class='del'>-        newstack-&gt;ngrps = oldstack-&gt;ngrps;</div><div class='del'>-        memcpy (newstack-&gt;groups, oldstack-&gt;groups,</div><div class='del'>-                sizeof (uint32_t) * GF_REQUEST_MAXGROUPS);</div><div class='del'>-	newstack-&gt;unique = oldstack-&gt;unique;</div><div class='del'>-</div><div class='del'>-	newstack-&gt;frames.this = frame-&gt;this;</div><div class='del'>-	newstack-&gt;frames.root = newstack;</div><div class='del'>-	newstack-&gt;pool = oldstack-&gt;pool;</div><div class='del'>-        newstack-&gt;lk_owner = oldstack-&gt;lk_owner;</div><div class='del'>-</div><div class='del'>-	LOCK_INIT (&amp;newstack-&gt;frames.lock);</div><div class='del'>-</div><div class='del'>-	LOCK (&amp;oldstack-&gt;pool-&gt;lock);</div><div class='del'>-	{</div><div class='del'>-		list_add (&amp;newstack-&gt;all_frames, &amp;oldstack-&gt;all_frames);</div><div class='del'>-		newstack-&gt;pool-&gt;cnt++;</div><div class='del'>-	}</div><div class='del'>-	UNLOCK (&amp;oldstack-&gt;pool-&gt;lock);</div><div class='del'>-</div><div class='del'>-	return &amp;newstack-&gt;frames;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-static inline call_frame_t *</div><div class='del'>-create_frame (xlator_t *xl, call_pool_t *pool)</div><div class='del'>-{</div><div class='del'>-	call_stack_t    *stack = NULL;</div><div class='del'>-        glusterfs_ctx_t *ctx = glusterfs_ctx_get ();</div><div class='del'>-</div><div class='del'>-	if (!xl || !pool) {</div><div class='del'>-		return NULL;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	stack = mem_get0 (pool-&gt;stack_mem_pool);</div><div class='del'>-	if (!stack)</div><div class='del'>-		return NULL;</div><div class='del'>-</div><div class='del'>-	stack-&gt;pool = pool;</div><div class='del'>-	stack-&gt;frames.root = stack;</div><div class='del'>-	stack-&gt;frames.this = xl;</div><div class='del'>-</div><div class='del'>-	LOCK (&amp;pool-&gt;lock);</div><div class='del'>-	{</div><div class='del'>-		list_add (&amp;stack-&gt;all_frames, &amp;pool-&gt;all_frames);</div><div class='del'>-		pool-&gt;cnt++;</div><div class='del'>-	}</div><div class='del'>-	UNLOCK (&amp;pool-&gt;lock);</div><div class='del'>-</div><div class='del'>-	LOCK_INIT (&amp;stack-&gt;frames.lock);</div><div class='del'>-</div><div class='del'>-        if (ctx &amp;&amp; ctx-&gt;measure_latency) {</div><div class='del'>-                gettimeofday (&amp;stack-&gt;frames.begin, NULL);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-	return &amp;stack-&gt;frames;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-void</div><div class='del'>-gf_proc_dump_pending_frames(call_pool_t *call_pool);</div><div class='del'>-</div><div class='del'>-#endif /* _STACK_H */</div><div class='head'>diff --git a/libglusterfs/src/statedump.c b/libglusterfs/src/statedump.c<br/>index 05f1a777fad..65f0eb5c7f3 100644<br/>--- a/<a href='/cgit/glusterfs.git/tree/libglusterfs/src/statedump.c?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/statedump.c</a><br/>+++ b/<a href='/cgit/glusterfs.git/tree/libglusterfs/src/statedump.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>libglusterfs/src/statedump.c</a></div><div class='hunk'>@@ -1,458 +1,1053 @@</div><div class='ctx'> /*</div><div class='del'>-  Copyright (c) 2009 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='add'>+  Copyright (c) 2008-2012 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='ctx'>   This file is part of GlusterFS.</div><div class='ctx'> </div><div class='del'>-  GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-  it under the terms of the GNU General Public License as published</div><div class='del'>-  by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-  or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-  GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-  WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-  General Public License for more details.</div><div class='del'>-</div><div class='del'>-  You should have received a copy of the GNU General Public License</div><div class='del'>-  along with this program.  If not, see</div><div class='del'>-  &lt;http://www.gnu.org/licenses/&gt;.</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='ctx'> */</div><div class='ctx'> </div><div class='ctx'> #include &lt;stdarg.h&gt;</div><div class='del'>-#include "glusterfs.h"</div><div class='del'>-#include "logging.h"</div><div class='del'>-#include "iobuf.h"</div><div class='del'>-#include "statedump.h"</div><div class='del'>-#include "stack.h"</div><div class='add'>+#include "glusterfs/glusterfs.h"</div><div class='add'>+#include "glusterfs/logging.h"</div><div class='add'>+#include "glusterfs/statedump.h"</div><div class='add'>+#include "glusterfs/stack.h"</div><div class='add'>+#include "glusterfs/syscall.h"</div><div class='ctx'> </div><div class='ctx'> #ifdef HAVE_MALLOC_H</div><div class='ctx'> #include &lt;malloc.h&gt;</div><div class='ctx'> #endif /* MALLOC_H */</div><div class='ctx'> </div><div class='add'>+/* We don't want gf_log in this function because it may cause</div><div class='add'>+   'deadlock' with statedump. This is because statedump happens</div><div class='add'>+   inside a signal handler and cannot afford to block on a lock.*/</div><div class='add'>+#ifdef gf_log</div><div class='add'>+#undef gf_log</div><div class='add'>+#endif</div><div class='ctx'> </div><div class='del'>-#define GF_PROC_DUMP_IS_OPTION_ENABLED(opt) \</div><div class='del'>-        (dump_options.dump_##opt == _gf_true)</div><div class='add'>+#define GF_PROC_DUMP_IS_OPTION_ENABLED(opt)                                    \</div><div class='add'>+    (dump_options.dump_##opt == _gf_true)</div><div class='ctx'> </div><div class='del'>-#define GF_PROC_DUMP_IS_XL_OPTION_ENABLED(opt)\</div><div class='del'>-        (dump_options.xl_options.dump_##opt == _gf_true)</div><div class='add'>+#define GF_PROC_DUMP_IS_XL_OPTION_ENABLED(opt)                                 \</div><div class='add'>+    (dump_options.xl_options.dump_##opt == _gf_true)</div><div class='ctx'> </div><div class='ctx'> extern xlator_t global_xlator;</div><div class='ctx'> </div><div class='del'>-static pthread_mutex_t  gf_proc_dump_mutex;</div><div class='add'>+static pthread_mutex_t gf_proc_dump_mutex;</div><div class='ctx'> static int gf_dump_fd = -1;</div><div class='del'>-static gf_dump_options_t dump_options;</div><div class='add'>+gf_dump_options_t dump_options;</div><div class='ctx'> </div><div class='add'>+static strfd_t *gf_dump_strfd = NULL;</div><div class='ctx'> </div><div class='ctx'> static void</div><div class='del'>-gf_proc_dump_lock (void)</div><div class='add'>+gf_proc_dump_lock(void)</div><div class='ctx'> {</div><div class='del'>-	pthread_mutex_lock (&amp;gf_proc_dump_mutex);</div><div class='add'>+    pthread_mutex_lock(&amp;gf_proc_dump_mutex);</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> static void</div><div class='del'>-gf_proc_dump_unlock (void)</div><div class='add'>+gf_proc_dump_unlock(void)</div><div class='add'>+{</div><div class='add'>+    pthread_mutex_unlock(&amp;gf_proc_dump_mutex);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+gf_proc_dump_open(char *tmpname)</div><div class='ctx'> {</div><div class='del'>-	pthread_mutex_unlock (&amp;gf_proc_dump_mutex);</div><div class='add'>+    int dump_fd = -1;</div><div class='add'>+</div><div class='add'>+    mode_t mask = umask(S_IRWXG | S_IRWXO);</div><div class='add'>+    dump_fd = mkstemp(tmpname);</div><div class='add'>+    umask(mask);</div><div class='add'>+    if (dump_fd &lt; 0)</div><div class='add'>+        return -1;</div><div class='add'>+</div><div class='add'>+    gf_dump_fd = dump_fd;</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+static void</div><div class='add'>+gf_proc_dump_close(void)</div><div class='add'>+{</div><div class='add'>+    sys_close(gf_dump_fd);</div><div class='add'>+    gf_dump_fd = -1;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> static int</div><div class='del'>-gf_proc_dump_open (void)</div><div class='add'>+gf_proc_dump_set_path(char *dump_options_file)</div><div class='ctx'> {</div><div class='del'>-        char path[256];</div><div class='del'>-        int  dump_fd = -1;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    FILE *fp = NULL;</div><div class='add'>+    char buf[256];</div><div class='add'>+    char *key = NULL, *value = NULL;</div><div class='add'>+    char *saveptr = NULL;</div><div class='add'>+</div><div class='add'>+    fp = fopen(dump_options_file, "r");</div><div class='add'>+    if (!fp)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    ret = fscanf(fp, "%255s", buf);</div><div class='add'>+</div><div class='add'>+    while (ret != EOF) {</div><div class='add'>+        key = strtok_r(buf, "=", &amp;saveptr);</div><div class='add'>+        if (!key) {</div><div class='add'>+            ret = fscanf(fp, "%255s", buf);</div><div class='add'>+            continue;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-        memset (path, 0, sizeof (path));</div><div class='del'>-        snprintf (path, sizeof (path), "%s.%d", GF_DUMP_LOGFILE_ROOT, getpid ());</div><div class='add'>+        value = strtok_r(NULL, "=", &amp;saveptr);</div><div class='ctx'> </div><div class='del'>-        dump_fd = open (path, O_CREAT|O_RDWR|O_TRUNC|O_APPEND, 0600);</div><div class='del'>-        if (dump_fd &lt; 0) {</div><div class='del'>-                gf_log("", GF_LOG_ERROR, "Unable to open file: %s"</div><div class='del'>-                " errno: %d", path, errno);</div><div class='del'>-                return -1;</div><div class='add'>+        if (!value) {</div><div class='add'>+            ret = fscanf(fp, "%255s", buf);</div><div class='add'>+            continue;</div><div class='ctx'>         }</div><div class='add'>+        if (!strcmp(key, "path")) {</div><div class='add'>+            dump_options.dump_path = gf_strdup(value);</div><div class='add'>+            break;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	gf_dump_fd = dump_fd;</div><div class='del'>-        return 0;</div><div class='add'>+out:</div><div class='add'>+    if (fp)</div><div class='add'>+        fclose(fp);</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+static int</div><div class='add'>+gf_proc_dump_add_section_fd(char *key, va_list ap)</div><div class='add'>+{</div><div class='add'>+    char buf[GF_DUMP_MAX_BUF_LEN];</div><div class='add'>+    int len;</div><div class='ctx'> </div><div class='del'>-static void</div><div class='del'>-gf_proc_dump_close (void)</div><div class='add'>+    GF_ASSERT(key);</div><div class='add'>+</div><div class='add'>+    len = snprintf(buf, GF_DUMP_MAX_BUF_LEN, "\n[");</div><div class='add'>+    len += vsnprintf(buf + len, GF_DUMP_MAX_BUF_LEN - len, key, ap);</div><div class='add'>+    len += snprintf(buf + len, GF_DUMP_MAX_BUF_LEN - len, "]\n");</div><div class='add'>+    return sys_write(gf_dump_fd, buf, len);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+gf_proc_dump_add_section_strfd(char *key, va_list ap)</div><div class='ctx'> {</div><div class='del'>-        close (gf_dump_fd);</div><div class='del'>-        gf_dump_fd = -1;</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    ret += strprintf(gf_dump_strfd, "[");</div><div class='add'>+    ret += strvprintf(gf_dump_strfd, key, ap);</div><div class='add'>+    ret += strprintf(gf_dump_strfd, "]\n");</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+int</div><div class='add'>+gf_proc_dump_add_section(char *key, ...)</div><div class='add'>+{</div><div class='add'>+    va_list ap;</div><div class='add'>+    int ret = 0;</div><div class='ctx'> </div><div class='del'>-void</div><div class='del'>-gf_proc_dump_add_section (char *key, ...)</div><div class='add'>+    va_start(ap, key);</div><div class='add'>+    if (gf_dump_strfd)</div><div class='add'>+        ret = gf_proc_dump_add_section_strfd(key, ap);</div><div class='add'>+    else</div><div class='add'>+        ret = gf_proc_dump_add_section_fd(key, ap);</div><div class='add'>+    va_end(ap);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+gf_proc_dump_write_fd(char *key, char *value, va_list ap)</div><div class='ctx'> {</div><div class='add'>+    char buf[GF_DUMP_MAX_BUF_LEN];</div><div class='add'>+    int len = 0;</div><div class='ctx'> </div><div class='del'>-        char buf[GF_DUMP_MAX_BUF_LEN];</div><div class='del'>-        va_list ap;</div><div class='del'>-        int     ret;</div><div class='add'>+    GF_ASSERT(key);</div><div class='ctx'> </div><div class='del'>-	GF_ASSERT(key);</div><div class='add'>+    len = snprintf(buf, GF_DUMP_MAX_BUF_LEN, "%s=", key);</div><div class='add'>+    len += vsnprintf(buf + len, GF_DUMP_MAX_BUF_LEN - len, value, ap);</div><div class='ctx'> </div><div class='del'>-        memset (buf, 0, sizeof(buf));</div><div class='del'>-        snprintf (buf, GF_DUMP_MAX_BUF_LEN, "\n[");</div><div class='del'>-        va_start (ap, key);</div><div class='del'>-        vsnprintf (buf + strlen(buf),</div><div class='del'>-                   GF_DUMP_MAX_BUF_LEN - strlen (buf), key, ap);</div><div class='del'>-        va_end (ap);</div><div class='del'>-        snprintf (buf + strlen(buf),</div><div class='del'>-                  GF_DUMP_MAX_BUF_LEN - strlen (buf),  "]\n");</div><div class='del'>-        ret = write (gf_dump_fd, buf, strlen (buf));</div><div class='del'>-        if (ret &lt; 0)</div><div class='del'>-                gf_log("", GF_LOG_ERROR, "write error: %s", strerror(errno));</div><div class='add'>+    len += snprintf(buf + len, GF_DUMP_MAX_BUF_LEN - len, "\n");</div><div class='add'>+    return sys_write(gf_dump_fd, buf, len);</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+static int</div><div class='add'>+gf_proc_dump_write_strfd(char *key, char *value, va_list ap)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    ret += strprintf(gf_dump_strfd, "%s = ", key);</div><div class='add'>+    ret += strvprintf(gf_dump_strfd, value, ap);</div><div class='add'>+    ret += strprintf(gf_dump_strfd, "\n");</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+gf_proc_dump_write(char *key, char *value, ...)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+    va_list ap;</div><div class='add'>+</div><div class='add'>+    va_start(ap, value);</div><div class='add'>+    if (gf_dump_strfd)</div><div class='add'>+        ret = gf_proc_dump_write_strfd(key, value, ap);</div><div class='add'>+    else</div><div class='add'>+        ret = gf_proc_dump_write_fd(key, value, ap);</div><div class='add'>+    va_end(ap);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> void</div><div class='del'>-gf_proc_dump_write (char *key, char *value,...)</div><div class='add'>+gf_latency_statedump_and_reset(char *key, gf_latency_t *lat)</div><div class='ctx'> {</div><div class='add'>+    /* Doesn't make sense to continue if there are no fops</div><div class='add'>+       came in the given interval */</div><div class='add'>+    if (!lat || !lat-&gt;count)</div><div class='add'>+        return;</div><div class='add'>+    gf_proc_dump_write(key,</div><div class='add'>+                       "AVG:%lf CNT:%" PRIu64 " TOTAL:%" PRIu64 " MIN:%" PRIu64</div><div class='add'>+                       " MAX:%" PRIu64,</div><div class='add'>+                       (((double)lat-&gt;total) / lat-&gt;count), lat-&gt;count,</div><div class='add'>+                       lat-&gt;total, lat-&gt;min, lat-&gt;max);</div><div class='add'>+    gf_latency_reset(lat);</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        char         buf[GF_DUMP_MAX_BUF_LEN];</div><div class='del'>-        int          offset = 0;</div><div class='del'>-	va_list      ap;</div><div class='del'>-        int          ret;</div><div class='add'>+void</div><div class='add'>+gf_proc_dump_xl_latency_info(xlator_t *xl)</div><div class='add'>+{</div><div class='add'>+    char key_prefix[GF_DUMP_MAX_BUF_LEN];</div><div class='add'>+    char key[GF_DUMP_MAX_BUF_LEN];</div><div class='add'>+    int i;</div><div class='ctx'> </div><div class='del'>-	GF_ASSERT (key);</div><div class='add'>+    snprintf(key_prefix, GF_DUMP_MAX_BUF_LEN, "%s.latency", xl-&gt;name);</div><div class='add'>+    gf_proc_dump_add_section("%s", key_prefix);</div><div class='ctx'> </div><div class='del'>-        offset = strlen (key);</div><div class='add'>+    for (i = 0; i &lt; GF_FOP_MAXVALUE; i++) {</div><div class='add'>+        gf_proc_dump_build_key(key, key_prefix, "%s", (char *)gf_fop_list[i]);</div><div class='ctx'> </div><div class='del'>-        memset (buf, 0, GF_DUMP_MAX_BUF_LEN);</div><div class='del'>-        snprintf (buf, GF_DUMP_MAX_BUF_LEN, "%s", key);</div><div class='del'>-        snprintf (buf + offset, GF_DUMP_MAX_BUF_LEN - offset, "=");</div><div class='del'>-        offset += 1;</div><div class='del'>-        va_start (ap, value);</div><div class='del'>-        vsnprintf (buf + offset, GF_DUMP_MAX_BUF_LEN - offset, value, ap);</div><div class='del'>-        va_end (ap);</div><div class='add'>+        gf_latency_t *lat = &amp;xl-&gt;stats.interval.latencies[i];</div><div class='ctx'> </div><div class='del'>-        offset = strlen (buf);</div><div class='del'>-        snprintf (buf + offset, GF_DUMP_MAX_BUF_LEN - offset, "\n");</div><div class='del'>-        ret = write (gf_dump_fd, buf, strlen (buf));</div><div class='del'>-        if (ret &lt; 0)</div><div class='del'>-                gf_log("", GF_LOG_ERROR, "write error: %s", strerror(errno));</div><div class='add'>+        gf_latency_statedump_and_reset(key, lat);</div><div class='add'>+    }</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> static void</div><div class='del'>-gf_proc_dump_xlator_mem_info (xlator_t *xl)</div><div class='del'>-{</div><div class='del'>-        char    key[GF_DUMP_MAX_BUF_LEN];</div><div class='del'>-        char    prefix[GF_DUMP_MAX_BUF_LEN];</div><div class='del'>-        int     i = 0;</div><div class='del'>-        struct mem_acct rec = {0,};</div><div class='del'>-</div><div class='del'>-        if (!xl)</div><div class='del'>-                return;</div><div class='del'>-</div><div class='del'>-        if (!xl-&gt;mem_acct.rec)</div><div class='del'>-                return;</div><div class='del'>-</div><div class='del'>-        gf_proc_dump_add_section ("%s.%s - Memory usage", xl-&gt;type,xl-&gt;name);</div><div class='del'>-        gf_proc_dump_write ("num_types", "%d", xl-&gt;mem_acct.num_types);</div><div class='del'>-</div><div class='del'>-        for (i = 0; i &lt; xl-&gt;mem_acct.num_types; i++) {</div><div class='del'>-                if (!(memcmp (&amp;xl-&gt;mem_acct.rec[i], &amp;rec, </div><div class='del'>-                                          sizeof (struct mem_acct))))</div><div class='del'>-                                continue;</div><div class='del'>-</div><div class='del'>-                gf_proc_dump_add_section ("%s.%s - usage-type %d", xl-&gt;type, </div><div class='del'>-                                         xl-&gt;name,i);</div><div class='del'>-                gf_proc_dump_build_key (prefix, "memusage", "%s.%s.type.%d",</div><div class='del'>-                                        xl-&gt;type, xl-&gt;name, i);</div><div class='del'>-                gf_proc_dump_build_key (key, prefix, "size"); </div><div class='del'>-                gf_proc_dump_write (key, "%u", xl-&gt;mem_acct.rec[i].size);</div><div class='del'>-                gf_proc_dump_build_key (key, prefix, "num_allocs");</div><div class='del'>-                gf_proc_dump_write (key, "%u", xl-&gt;mem_acct.rec[i].num_allocs);</div><div class='del'>-                gf_proc_dump_build_key (key, prefix, "max_size");</div><div class='del'>-                gf_proc_dump_write (key, "%u", xl-&gt;mem_acct.rec[i].max_size);</div><div class='del'>-                gf_proc_dump_build_key (key, prefix, "max_num_allocs");</div><div class='del'>-                gf_proc_dump_write (key, "%u", xl-&gt;mem_acct.rec[i].max_num_allocs);</div><div class='del'>-        }</div><div class='add'>+gf_proc_dump_xlator_mem_info(xlator_t *xl)</div><div class='add'>+{</div><div class='add'>+    int i = 0;</div><div class='add'>+</div><div class='add'>+    if (!xl)</div><div class='add'>+        return;</div><div class='ctx'> </div><div class='add'>+    if (!xl-&gt;mem_acct)</div><div class='ctx'>         return;</div><div class='add'>+</div><div class='add'>+    gf_proc_dump_add_section("%s.%s - Memory usage", xl-&gt;type, xl-&gt;name);</div><div class='add'>+    gf_proc_dump_write("num_types", "%d", xl-&gt;mem_acct-&gt;num_types);</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; xl-&gt;mem_acct-&gt;num_types; i++) {</div><div class='add'>+        if (xl-&gt;mem_acct-&gt;rec[i].num_allocs == 0)</div><div class='add'>+            continue;</div><div class='add'>+</div><div class='add'>+        gf_proc_dump_add_section("%s.%s - usage-type %s memusage", xl-&gt;type,</div><div class='add'>+                                 xl-&gt;name, xl-&gt;mem_acct-&gt;rec[i].typestr);</div><div class='add'>+        gf_proc_dump_write("size", "%" PRIu64, xl-&gt;mem_acct-&gt;rec[i].size);</div><div class='add'>+        gf_proc_dump_write("num_allocs", "%u", xl-&gt;mem_acct-&gt;rec[i].num_allocs);</div><div class='add'>+        gf_proc_dump_write("max_size", "%" PRIu64,</div><div class='add'>+                           xl-&gt;mem_acct-&gt;rec[i].max_size);</div><div class='add'>+        gf_proc_dump_write("max_num_allocs", "%u",</div><div class='add'>+                           xl-&gt;mem_acct-&gt;rec[i].max_num_allocs);</div><div class='add'>+        gf_proc_dump_write("total_allocs", "%" PRIu64,</div><div class='add'>+                           xl-&gt;mem_acct-&gt;rec[i].total_allocs);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+static void</div><div class='add'>+gf_proc_dump_xlator_mem_info_only_in_use(xlator_t *xl)</div><div class='add'>+{</div><div class='add'>+    int i = 0;</div><div class='ctx'> </div><div class='add'>+    if (!xl)</div><div class='add'>+        return;</div><div class='add'>+</div><div class='add'>+    if (!xl-&gt;mem_acct)</div><div class='add'>+        return;</div><div class='add'>+</div><div class='add'>+    gf_proc_dump_add_section("%s.%s - Memory usage", xl-&gt;type, xl-&gt;name);</div><div class='add'>+    gf_proc_dump_write("num_types", "%d", xl-&gt;mem_acct-&gt;num_types);</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; xl-&gt;mem_acct-&gt;num_types; i++) {</div><div class='add'>+        if (!xl-&gt;mem_acct-&gt;rec[i].size)</div><div class='add'>+            continue;</div><div class='add'>+</div><div class='add'>+        gf_proc_dump_add_section("%s.%s - usage-type %d", xl-&gt;type, xl-&gt;name,</div><div class='add'>+                                 i);</div><div class='add'>+</div><div class='add'>+        gf_proc_dump_write("size", "%" PRIu64, xl-&gt;mem_acct-&gt;rec[i].size);</div><div class='add'>+        gf_proc_dump_write("max_size", "%" PRIu64,</div><div class='add'>+                           xl-&gt;mem_acct-&gt;rec[i].max_size);</div><div class='add'>+        gf_proc_dump_write("num_allocs", "%u", xl-&gt;mem_acct-&gt;rec[i].num_allocs);</div><div class='add'>+        gf_proc_dump_write("max_num_allocs", "%u",</div><div class='add'>+                           xl-&gt;mem_acct-&gt;rec[i].max_num_allocs);</div><div class='add'>+        gf_proc_dump_write("total_allocs", "%" PRIu64,</div><div class='add'>+                           xl-&gt;mem_acct-&gt;rec[i].total_allocs);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> /* Currently this dumps only mallinfo. More can be built on here */</div><div class='ctx'> void</div><div class='del'>-gf_proc_dump_mem_info ()</div><div class='del'>-{</div><div class='del'>-#ifdef HAVE_MALLOC_STATS</div><div class='del'>-        struct mallinfo info;</div><div class='del'>-</div><div class='del'>-        memset (&amp;info, 0, sizeof (struct mallinfo));</div><div class='del'>-        info = mallinfo ();</div><div class='del'>-</div><div class='del'>-        gf_proc_dump_add_section ("mallinfo");</div><div class='del'>-        gf_proc_dump_write ("mallinfo_arena", "%d", info.arena);</div><div class='del'>-        gf_proc_dump_write ("mallinfo_ordblks", "%d", info.ordblks);</div><div class='del'>-        gf_proc_dump_write ("mallinfo_smblks", "%d", info.smblks);</div><div class='del'>-        gf_proc_dump_write ("mallinfo_hblks", "%d", info.hblks);</div><div class='del'>-        gf_proc_dump_write ("mallinfo_hblkhd", "%d", info.hblkhd);</div><div class='del'>-        gf_proc_dump_write ("mallinfo_usmblks", "%d", info.usmblks);</div><div class='del'>-        gf_proc_dump_write ("mallinfo_fsmblks", "%d", info.fsmblks);</div><div class='del'>-        gf_proc_dump_write ("mallinfo_uordblks", "%d", info.uordblks);</div><div class='del'>-        gf_proc_dump_write ("mallinfo_fordblks", "%d", info.fordblks);</div><div class='del'>-        gf_proc_dump_write ("mallinfo_keepcost", "%d", info.keepcost);</div><div class='add'>+gf_proc_dump_mem_info()</div><div class='add'>+{</div><div class='add'>+#ifdef HAVE_MALLINFO</div><div class='add'>+    struct mallinfo info;</div><div class='add'>+</div><div class='add'>+    memset(&amp;info, 0, sizeof(struct mallinfo));</div><div class='add'>+    info = mallinfo();</div><div class='add'>+</div><div class='add'>+    gf_proc_dump_add_section("mallinfo");</div><div class='add'>+    gf_proc_dump_write("mallinfo_arena", "%d", info.arena);</div><div class='add'>+    gf_proc_dump_write("mallinfo_ordblks", "%d", info.ordblks);</div><div class='add'>+    gf_proc_dump_write("mallinfo_smblks", "%d", info.smblks);</div><div class='add'>+    gf_proc_dump_write("mallinfo_hblks", "%d", info.hblks);</div><div class='add'>+    gf_proc_dump_write("mallinfo_hblkhd", "%d", info.hblkhd);</div><div class='add'>+    gf_proc_dump_write("mallinfo_usmblks", "%d", info.usmblks);</div><div class='add'>+    gf_proc_dump_write("mallinfo_fsmblks", "%d", info.fsmblks);</div><div class='add'>+    gf_proc_dump_write("mallinfo_uordblks", "%d", info.uordblks);</div><div class='add'>+    gf_proc_dump_write("mallinfo_fordblks", "%d", info.fordblks);</div><div class='add'>+    gf_proc_dump_write("mallinfo_keepcost", "%d", info.keepcost);</div><div class='ctx'> #endif</div><div class='del'>-        gf_proc_dump_xlator_mem_info(&amp;global_xlator);</div><div class='add'>+    gf_proc_dump_xlator_mem_info(&amp;global_xlator);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+gf_proc_dump_mem_info_to_dict(dict_t *dict)</div><div class='add'>+{</div><div class='add'>+    if (!dict)</div><div class='add'>+        return;</div><div class='add'>+#ifdef HAVE_MALLINFO</div><div class='add'>+    struct mallinfo info;</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    memset(&amp;info, 0, sizeof(struct mallinfo));</div><div class='add'>+    info = mallinfo();</div><div class='add'>+</div><div class='add'>+    ret = dict_set_int32(dict, "mallinfo.arena", info.arena);</div><div class='add'>+    if (ret)</div><div class='add'>+        return;</div><div class='add'>+</div><div class='add'>+    ret = dict_set_int32(dict, "mallinfo.ordblks", info.ordblks);</div><div class='add'>+    if (ret)</div><div class='add'>+        return;</div><div class='add'>+</div><div class='add'>+    ret = dict_set_int32(dict, "mallinfo.smblks", info.smblks);</div><div class='add'>+    if (ret)</div><div class='add'>+        return;</div><div class='add'>+</div><div class='add'>+    ret = dict_set_int32(dict, "mallinfo.hblks", info.hblks);</div><div class='add'>+    if (ret)</div><div class='add'>+        return;</div><div class='add'>+</div><div class='add'>+    ret = dict_set_int32(dict, "mallinfo.hblkhd", info.hblkhd);</div><div class='add'>+    if (ret)</div><div class='add'>+        return;</div><div class='ctx'> </div><div class='add'>+    ret = dict_set_int32(dict, "mallinfo.usmblks", info.usmblks);</div><div class='add'>+    if (ret)</div><div class='add'>+        return;</div><div class='add'>+</div><div class='add'>+    ret = dict_set_int32(dict, "mallinfo.fsmblks", info.fsmblks);</div><div class='add'>+    if (ret)</div><div class='add'>+        return;</div><div class='add'>+</div><div class='add'>+    ret = dict_set_int32(dict, "mallinfo.uordblks", info.uordblks);</div><div class='add'>+    if (ret)</div><div class='add'>+        return;</div><div class='add'>+</div><div class='add'>+    ret = dict_set_int32(dict, "mallinfo.fordblks", info.fordblks);</div><div class='add'>+    if (ret)</div><div class='add'>+        return;</div><div class='add'>+</div><div class='add'>+    ret = dict_set_int32(dict, "mallinfo.keepcost", info.keepcost);</div><div class='add'>+    if (ret)</div><div class='add'>+        return;</div><div class='add'>+#endif</div><div class='add'>+    return;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-void gf_proc_dump_latency_info (xlator_t *xl);</div><div class='add'>+void</div><div class='add'>+gf_proc_dump_mempool_info(glusterfs_ctx_t *ctx)</div><div class='add'>+{</div><div class='add'>+#ifdef GF_DISABLE_MEMPOOL</div><div class='add'>+    gf_proc_dump_write("built with --disable-mempool", " so no memory pools");</div><div class='add'>+#else</div><div class='add'>+    struct mem_pool *pool = NULL;</div><div class='add'>+</div><div class='add'>+    gf_proc_dump_add_section("mempool");</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;ctx-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        list_for_each_entry(pool, &amp;ctx-&gt;mempool_list, owner)</div><div class='add'>+        {</div><div class='add'>+            int64_t active = GF_ATOMIC_GET(pool-&gt;active);</div><div class='add'>+</div><div class='add'>+            gf_proc_dump_write("-----", "-----");</div><div class='add'>+            gf_proc_dump_write("pool-name", "%s", pool-&gt;name);</div><div class='add'>+            gf_proc_dump_write("xlator-name", "%s", pool-&gt;xl_name);</div><div class='add'>+            gf_proc_dump_write("active-count", "%" GF_PRI_ATOMIC, active);</div><div class='add'>+            gf_proc_dump_write("sizeof-type", "%lu", pool-&gt;sizeof_type);</div><div class='add'>+            gf_proc_dump_write("padded-sizeof", "%d",</div><div class='add'>+                               1 &lt;&lt; pool-&gt;pool-&gt;power_of_two);</div><div class='add'>+            gf_proc_dump_write("size", "%" PRId64,</div><div class='add'>+                               (1 &lt;&lt; pool-&gt;pool-&gt;power_of_two) * active);</div><div class='add'>+            gf_proc_dump_write("shared-pool", "%p", pool-&gt;pool);</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    UNLOCK(&amp;ctx-&gt;lock);</div><div class='add'>+#endif /* GF_DISABLE_MEMPOOL */</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> void</div><div class='del'>-gf_proc_dump_xlator_info (xlator_t *this_xl)</div><div class='del'>-{</div><div class='del'>-	glusterfs_ctx_t   *ctx = NULL;</div><div class='del'>-	xlator_t *fuse_xlator, *this_xlator;</div><div class='del'>-	</div><div class='del'>-        if (!this_xl)</div><div class='del'>-                return;</div><div class='del'>-	</div><div class='del'>-	ctx = glusterfs_ctx_get ();</div><div class='del'>-	if (!ctx)</div><div class='del'>-		return;</div><div class='del'>-</div><div class='del'>-	if (ctx-&gt;master){</div><div class='del'>-		</div><div class='del'>-		gf_log ("", GF_LOG_DEBUG, "Dumping Proc for fuse Xlator");</div><div class='del'>-		fuse_xlator = (xlator_t *) ctx-&gt;master;</div><div class='del'>-</div><div class='del'>-		if (!fuse_xlator-&gt;dumpops)</div><div class='del'>-			return;</div><div class='del'>-</div><div class='del'>-		if (fuse_xlator-&gt;dumpops-&gt;priv &amp;&amp;</div><div class='del'>-                    GF_PROC_DUMP_IS_XL_OPTION_ENABLED (priv))</div><div class='del'>-                         fuse_xlator-&gt;dumpops-&gt;priv (fuse_xlator);</div><div class='del'>-</div><div class='del'>-                if (fuse_xlator-&gt;dumpops-&gt;inode &amp;&amp;</div><div class='del'>-                    GF_PROC_DUMP_IS_XL_OPTION_ENABLED (inode)) {</div><div class='del'>-			</div><div class='del'>-			if (!ctx-&gt;active)</div><div class='del'>-				return;</div><div class='del'>-			this_xlator = (xlator_t *) ctx-&gt;active-&gt;top;</div><div class='del'>-</div><div class='del'>-			if (this_xlator &amp;&amp; this_xlator-&gt;itable)</div><div class='del'>-				inode_table_dump (this_xlator-&gt;itable,</div><div class='del'>-						  "xlator.mount.fuse.itable");</div><div class='del'>-			else</div><div class='del'>-				return;</div><div class='del'>-		}</div><div class='del'>-</div><div class='del'>-                if (fuse_xlator-&gt;dumpops-&gt;fd &amp;&amp;</div><div class='del'>-                    GF_PROC_DUMP_IS_XL_OPTION_ENABLED (fd))</div><div class='del'>-                        fuse_xlator-&gt;dumpops-&gt;fd (fuse_xlator);</div><div class='del'>-	}</div><div class='del'>-			</div><div class='del'>-</div><div class='del'>-        while (this_xl) {</div><div class='del'>-		</div><div class='del'>-		if (ctx-&gt;measure_latency)</div><div class='del'>-			gf_proc_dump_latency_info (this_xl);</div><div class='del'>-</div><div class='del'>-		gf_proc_dump_xlator_mem_info(this_xl);</div><div class='del'>-</div><div class='del'>-                if (!this_xl-&gt;dumpops) {</div><div class='del'>-                        this_xl = this_xl-&gt;next;</div><div class='del'>-                        continue;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                if (this_xl-&gt;dumpops-&gt;priv &amp;&amp;</div><div class='del'>-                    GF_PROC_DUMP_IS_XL_OPTION_ENABLED (priv))</div><div class='del'>-                         this_xl-&gt;dumpops-&gt;priv (this_xl);</div><div class='del'>-</div><div class='del'>-                if (this_xl-&gt;dumpops-&gt;inode &amp;&amp;</div><div class='del'>-                    GF_PROC_DUMP_IS_XL_OPTION_ENABLED (inode))</div><div class='del'>-                        this_xl-&gt;dumpops-&gt;inode (this_xl);</div><div class='del'>-			</div><div class='del'>-		</div><div class='del'>-                if (this_xl-&gt;dumpops-&gt;fd &amp;&amp;</div><div class='del'>-                    GF_PROC_DUMP_IS_XL_OPTION_ENABLED (fd))</div><div class='del'>-                        this_xl-&gt;dumpops-&gt;fd (this_xl);</div><div class='del'>-	</div><div class='del'>-                this_xl = this_xl-&gt;next;</div><div class='add'>+gf_proc_dump_mempool_info_to_dict(glusterfs_ctx_t *ctx, dict_t *dict)</div><div class='add'>+{</div><div class='add'>+#ifndef GF_DISABLE_MEMPOOL</div><div class='add'>+    struct mem_pool *pool = NULL;</div><div class='add'>+    char key[GF_DUMP_MAX_BUF_LEN] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int count = 0;</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    if (!ctx || !dict)</div><div class='add'>+        return;</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;ctx-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        list_for_each_entry(pool, &amp;ctx-&gt;mempool_list, owner)</div><div class='add'>+        {</div><div class='add'>+            int64_t active = GF_ATOMIC_GET(pool-&gt;active);</div><div class='add'>+</div><div class='add'>+            snprintf(key, sizeof(key), "pool%d.name", count);</div><div class='add'>+            ret = dict_set_str(dict, key, pool-&gt;name);</div><div class='add'>+            if (ret)</div><div class='add'>+                goto out;</div><div class='add'>+</div><div class='add'>+            snprintf(key, sizeof(key), "pool%d.active-count", count);</div><div class='add'>+            ret = dict_set_uint64(dict, key, active);</div><div class='add'>+            if (ret)</div><div class='add'>+                goto out;</div><div class='add'>+</div><div class='add'>+            snprintf(key, sizeof(key), "pool%d.sizeof-type", count);</div><div class='add'>+            ret = dict_set_uint64(dict, key, pool-&gt;sizeof_type);</div><div class='add'>+            if (ret)</div><div class='add'>+                goto out;</div><div class='add'>+</div><div class='add'>+            snprintf(key, sizeof(key), "pool%d.padded-sizeof", count);</div><div class='add'>+            ret = dict_set_uint64(dict, key, 1 &lt;&lt; pool-&gt;pool-&gt;power_of_two);</div><div class='add'>+            if (ret)</div><div class='add'>+                goto out;</div><div class='add'>+</div><div class='add'>+            snprintf(key, sizeof(key), "pool%d.size", count);</div><div class='add'>+            ret = dict_set_uint64(dict, key,</div><div class='add'>+                                  (1 &lt;&lt; pool-&gt;pool-&gt;power_of_two) * active);</div><div class='add'>+            if (ret)</div><div class='add'>+                goto out;</div><div class='add'>+</div><div class='add'>+            snprintf(key, sizeof(key), "pool%d.shared-pool", count);</div><div class='add'>+            ret = dict_set_static_ptr(dict, key, pool-&gt;pool);</div><div class='add'>+            if (ret)</div><div class='add'>+                goto out;</div><div class='ctx'>         }</div><div class='add'>+    }</div><div class='add'>+out:</div><div class='add'>+    UNLOCK(&amp;ctx-&gt;lock);</div><div class='add'>+#endif /* !GF_DISABLE_MEMPOOL */</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+gf_proc_dump_latency_info(xlator_t *xl);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+gf_proc_dump_dict_info(glusterfs_ctx_t *ctx)</div><div class='add'>+{</div><div class='add'>+    int64_t total_dicts = 0;</div><div class='add'>+    int64_t total_pairs = 0;</div><div class='add'>+</div><div class='add'>+    total_dicts = GF_ATOMIC_GET(ctx-&gt;stats.total_dicts_used);</div><div class='add'>+    total_pairs = GF_ATOMIC_GET(ctx-&gt;stats.total_pairs_used);</div><div class='add'>+</div><div class='add'>+    gf_proc_dump_write("max-pairs-per-dict", "%" GF_PRI_ATOMIC,</div><div class='add'>+                       GF_ATOMIC_GET(ctx-&gt;stats.max_dict_pairs));</div><div class='add'>+    gf_proc_dump_write("total-pairs-used", "%" PRId64, total_pairs);</div><div class='add'>+    gf_proc_dump_write("total-dicts-used", "%" PRId64, total_dicts);</div><div class='add'>+    gf_proc_dump_write("average-pairs-per-dict", "%" PRId64,</div><div class='add'>+                       (total_pairs / total_dicts));</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf_proc_dump_single_xlator_info(xlator_t *trav)</div><div class='add'>+{</div><div class='add'>+    glusterfs_ctx_t *ctx = trav-&gt;ctx;</div><div class='add'>+    char itable_key[1024] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='ctx'> </div><div class='add'>+    if (trav-&gt;cleanup_starting)</div><div class='ctx'>         return;</div><div class='add'>+</div><div class='add'>+    if (ctx-&gt;measure_latency)</div><div class='add'>+        gf_proc_dump_xl_latency_info(trav);</div><div class='add'>+</div><div class='add'>+    gf_proc_dump_xlator_mem_info(trav);</div><div class='add'>+</div><div class='add'>+    if (GF_PROC_DUMP_IS_XL_OPTION_ENABLED(inode) &amp;&amp; (trav-&gt;itable)) {</div><div class='add'>+        snprintf(itable_key, sizeof(itable_key), "%d.%s.itable", ctx-&gt;graph_id,</div><div class='add'>+                 trav-&gt;name);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (!trav-&gt;dumpops) {</div><div class='add'>+        return;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (trav-&gt;dumpops-&gt;priv &amp;&amp; GF_PROC_DUMP_IS_XL_OPTION_ENABLED(priv))</div><div class='add'>+        trav-&gt;dumpops-&gt;priv(trav);</div><div class='add'>+</div><div class='add'>+    if (GF_PROC_DUMP_IS_XL_OPTION_ENABLED(inode) &amp;&amp; (trav-&gt;dumpops-&gt;inode))</div><div class='add'>+        trav-&gt;dumpops-&gt;inode(trav);</div><div class='add'>+    if (trav-&gt;dumpops-&gt;fd &amp;&amp; GF_PROC_DUMP_IS_XL_OPTION_ENABLED(fd))</div><div class='add'>+        trav-&gt;dumpops-&gt;fd(trav);</div><div class='add'>+</div><div class='add'>+    if (trav-&gt;dumpops-&gt;history &amp;&amp; GF_PROC_DUMP_IS_XL_OPTION_ENABLED(history))</div><div class='add'>+        trav-&gt;dumpops-&gt;history(trav);</div><div class='ctx'> }</div><div class='del'>-static int</div><div class='del'>-gf_proc_dump_parse_set_option (char *key, char *value)</div><div class='del'>-{</div><div class='del'>-        gf_boolean_t    *opt_key = NULL;</div><div class='del'>-        gf_boolean_t    opt_value = _gf_false;</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-        if (!strncasecmp (key, "mem", 3)) {</div><div class='del'>-                opt_key = &amp;dump_options.dump_mem;</div><div class='del'>-        } else if (!strncasecmp (key, "iobuf", 5)) {</div><div class='del'>-                opt_key = &amp;dump_options.dump_iobuf;</div><div class='del'>-        } else if (!strncasecmp (key, "callpool", 8)) {</div><div class='del'>-                opt_key = &amp;dump_options.dump_callpool;</div><div class='del'>-        } else if (!strncasecmp (key, "priv", 4)) {</div><div class='del'>-                opt_key = &amp;dump_options.xl_options.dump_priv;</div><div class='del'>-        } else if (!strncasecmp (key, "fd", 2)) {</div><div class='del'>-                opt_key = &amp;dump_options.xl_options.dump_fd;</div><div class='del'>-        } else if (!strncasecmp (key, "inode", 5)) {</div><div class='del'>-                opt_key = &amp;dump_options.xl_options.dump_inode;</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf_proc_dump_per_xlator_info(xlator_t *top)</div><div class='add'>+{</div><div class='add'>+    xlator_t *trav = top;</div><div class='add'>+</div><div class='add'>+    while (trav &amp;&amp; !trav-&gt;cleanup_starting) {</div><div class='add'>+        gf_proc_dump_single_xlator_info(trav);</div><div class='add'>+        trav = trav-&gt;next;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+gf_proc_dump_xlator_info(xlator_t *top, gf_boolean_t brick_mux)</div><div class='add'>+{</div><div class='add'>+    xlator_t *trav = NULL;</div><div class='add'>+    xlator_list_t **trav_p = NULL;</div><div class='add'>+</div><div class='add'>+    if (!top)</div><div class='add'>+        return;</div><div class='add'>+</div><div class='add'>+    trav = top;</div><div class='add'>+    gf_proc_dump_per_xlator_info(trav);</div><div class='add'>+</div><div class='add'>+    if (brick_mux) {</div><div class='add'>+        trav_p = &amp;top-&gt;children;</div><div class='add'>+        while (*trav_p) {</div><div class='add'>+            trav = (*trav_p)-&gt;xlator;</div><div class='add'>+            gf_proc_dump_per_xlator_info(trav);</div><div class='add'>+            trav_p = &amp;(*trav_p)-&gt;next;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf_proc_dump_oldgraph_xlator_info(xlator_t *top)</div><div class='add'>+{</div><div class='add'>+    xlator_t *trav = NULL;</div><div class='add'>+</div><div class='add'>+    if (!top)</div><div class='add'>+        return;</div><div class='add'>+</div><div class='add'>+    trav = top;</div><div class='add'>+    while (trav) {</div><div class='add'>+        gf_proc_dump_xlator_mem_info_only_in_use(trav);</div><div class='add'>+</div><div class='add'>+        if (GF_PROC_DUMP_IS_XL_OPTION_ENABLED(inode) &amp;&amp; (trav-&gt;itable)) {</div><div class='add'>+            /*TODO: dump inode table info if necessary by</div><div class='add'>+              printing the graph id (taken by glusterfs_cbtx_t)</div><div class='add'>+              in the key</div><div class='add'>+            */</div><div class='ctx'>         }</div><div class='ctx'> </div><div class='del'>-        if (!opt_key) {</div><div class='del'>-                //None of dump options match the key, return back</div><div class='del'>-                gf_log ("", GF_LOG_WARNING, "None of the options matched key"</div><div class='del'>-                        ": %s", key);</div><div class='del'>-                return -1;</div><div class='add'>+        if (!trav-&gt;dumpops) {</div><div class='add'>+            trav = trav-&gt;next;</div><div class='add'>+            continue;</div><div class='ctx'>         }</div><div class='ctx'> </div><div class='del'>-        opt_value = (strncasecmp (value, "yes", 3) ?</div><div class='del'>-                                  _gf_false: _gf_true);</div><div class='add'>+        if (GF_PROC_DUMP_IS_XL_OPTION_ENABLED(inode) &amp;&amp; (trav-&gt;dumpops-&gt;inode))</div><div class='add'>+            trav-&gt;dumpops-&gt;inode(trav);</div><div class='ctx'> </div><div class='del'>-        GF_PROC_DUMP_SET_OPTION (*opt_key, opt_value);</div><div class='add'>+        if (trav-&gt;dumpops-&gt;fd &amp;&amp; GF_PROC_DUMP_IS_XL_OPTION_ENABLED(fd))</div><div class='add'>+            trav-&gt;dumpops-&gt;fd(trav);</div><div class='ctx'> </div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='add'>+        trav = trav-&gt;next;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='add'>+    return;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> static int</div><div class='del'>-gf_proc_dump_enable_all_options ()</div><div class='add'>+gf_proc_dump_enable_all_options()</div><div class='ctx'> {</div><div class='add'>+    GF_PROC_DUMP_SET_OPTION(dump_options.dump_mem, _gf_true);</div><div class='add'>+    GF_PROC_DUMP_SET_OPTION(dump_options.dump_iobuf, _gf_true);</div><div class='add'>+    GF_PROC_DUMP_SET_OPTION(dump_options.dump_callpool, _gf_true);</div><div class='add'>+    GF_PROC_DUMP_SET_OPTION(dump_options.xl_options.dump_priv, _gf_true);</div><div class='add'>+    GF_PROC_DUMP_SET_OPTION(dump_options.xl_options.dump_inode, _gf_true);</div><div class='add'>+    GF_PROC_DUMP_SET_OPTION(dump_options.xl_options.dump_fd, _gf_true);</div><div class='add'>+    GF_PROC_DUMP_SET_OPTION(dump_options.xl_options.dump_inodectx, _gf_true);</div><div class='add'>+    GF_PROC_DUMP_SET_OPTION(dump_options.xl_options.dump_fdctx, _gf_true);</div><div class='add'>+    GF_PROC_DUMP_SET_OPTION(dump_options.xl_options.dump_history, _gf_true);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        GF_PROC_DUMP_SET_OPTION (dump_options.dump_mem, _gf_true);</div><div class='del'>-        GF_PROC_DUMP_SET_OPTION (dump_options.dump_iobuf, _gf_true);</div><div class='del'>-        GF_PROC_DUMP_SET_OPTION (dump_options.dump_callpool, _gf_true);</div><div class='del'>-        GF_PROC_DUMP_SET_OPTION (dump_options.xl_options.dump_priv, _gf_true);</div><div class='del'>-        GF_PROC_DUMP_SET_OPTION (dump_options.xl_options.dump_inode, _gf_true);</div><div class='del'>-        GF_PROC_DUMP_SET_OPTION (dump_options.xl_options.dump_fd, _gf_true);</div><div class='add'>+gf_boolean_t</div><div class='add'>+is_gf_proc_dump_all_disabled()</div><div class='add'>+{</div><div class='add'>+    gf_boolean_t all_disabled = _gf_true;</div><div class='add'>+</div><div class='add'>+    GF_CHECK_DUMP_OPTION_ENABLED(dump_options.dump_mem, all_disabled, out);</div><div class='add'>+    GF_CHECK_DUMP_OPTION_ENABLED(dump_options.dump_iobuf, all_disabled, out);</div><div class='add'>+    GF_CHECK_DUMP_OPTION_ENABLED(dump_options.dump_callpool, all_disabled, out);</div><div class='add'>+    GF_CHECK_DUMP_OPTION_ENABLED(dump_options.xl_options.dump_priv,</div><div class='add'>+                                 all_disabled, out);</div><div class='add'>+    GF_CHECK_DUMP_OPTION_ENABLED(dump_options.xl_options.dump_inode,</div><div class='add'>+                                 all_disabled, out);</div><div class='add'>+    GF_CHECK_DUMP_OPTION_ENABLED(dump_options.xl_options.dump_fd, all_disabled,</div><div class='add'>+                                 out);</div><div class='add'>+    GF_CHECK_DUMP_OPTION_ENABLED(dump_options.xl_options.dump_inodectx,</div><div class='add'>+                                 all_disabled, out);</div><div class='add'>+    GF_CHECK_DUMP_OPTION_ENABLED(dump_options.xl_options.dump_fdctx,</div><div class='add'>+                                 all_disabled, out);</div><div class='add'>+    GF_CHECK_DUMP_OPTION_ENABLED(dump_options.xl_options.dump_history,</div><div class='add'>+                                 all_disabled, out);</div><div class='ctx'> </div><div class='del'>-        return 0;</div><div class='add'>+out:</div><div class='add'>+    return all_disabled;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+/* These options are dumped by default if glusterdump.options</div><div class='add'>+   file exists and it is emtpty</div><div class='add'>+*/</div><div class='ctx'> static int</div><div class='del'>-gf_proc_dump_disable_all_options ()</div><div class='add'>+gf_proc_dump_enable_default_options()</div><div class='ctx'> {</div><div class='add'>+    GF_PROC_DUMP_SET_OPTION(dump_options.dump_mem, _gf_true);</div><div class='add'>+    GF_PROC_DUMP_SET_OPTION(dump_options.dump_callpool, _gf_true);</div><div class='ctx'> </div><div class='del'>-        GF_PROC_DUMP_SET_OPTION (dump_options.dump_mem, _gf_false);</div><div class='del'>-        GF_PROC_DUMP_SET_OPTION (dump_options.dump_iobuf, _gf_false);</div><div class='del'>-        GF_PROC_DUMP_SET_OPTION (dump_options.dump_callpool, _gf_false);</div><div class='del'>-        GF_PROC_DUMP_SET_OPTION (dump_options.xl_options.dump_priv, _gf_false);</div><div class='del'>-        GF_PROC_DUMP_SET_OPTION (dump_options.xl_options.dump_inode,</div><div class='del'>-                                                                _gf_false);</div><div class='del'>-        GF_PROC_DUMP_SET_OPTION (dump_options.xl_options.dump_fd, _gf_false);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='add'>+static int</div><div class='add'>+gf_proc_dump_disable_all_options()</div><div class='add'>+{</div><div class='add'>+    GF_PROC_DUMP_SET_OPTION(dump_options.dump_mem, _gf_false);</div><div class='add'>+    GF_PROC_DUMP_SET_OPTION(dump_options.dump_iobuf, _gf_false);</div><div class='add'>+    GF_PROC_DUMP_SET_OPTION(dump_options.dump_callpool, _gf_false);</div><div class='add'>+    GF_PROC_DUMP_SET_OPTION(dump_options.xl_options.dump_priv, _gf_false);</div><div class='add'>+    GF_PROC_DUMP_SET_OPTION(dump_options.xl_options.dump_inode, _gf_false);</div><div class='add'>+    GF_PROC_DUMP_SET_OPTION(dump_options.xl_options.dump_fd, _gf_false);</div><div class='add'>+    GF_PROC_DUMP_SET_OPTION(dump_options.xl_options.dump_inodectx, _gf_false);</div><div class='add'>+    GF_PROC_DUMP_SET_OPTION(dump_options.xl_options.dump_fdctx, _gf_false);</div><div class='add'>+    GF_PROC_DUMP_SET_OPTION(dump_options.xl_options.dump_history, _gf_false);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+gf_proc_dump_parse_set_option(char *key, char *value)</div><div class='add'>+{</div><div class='add'>+    gf_boolean_t *opt_key = NULL;</div><div class='add'>+    gf_boolean_t opt_value = _gf_false;</div><div class='add'>+    char buf[GF_DUMP_MAX_BUF_LEN];</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int len;</div><div class='add'>+</div><div class='add'>+    if (!strcasecmp(key, "all")) {</div><div class='add'>+        (void)gf_proc_dump_enable_all_options();</div><div class='ctx'>         return 0;</div><div class='add'>+    } else if (!strcasecmp(key, "mem")) {</div><div class='add'>+        opt_key = &amp;dump_options.dump_mem;</div><div class='add'>+    } else if (!strcasecmp(key, "iobuf")) {</div><div class='add'>+        opt_key = &amp;dump_options.dump_iobuf;</div><div class='add'>+    } else if (!strcasecmp(key, "callpool")) {</div><div class='add'>+        opt_key = &amp;dump_options.dump_callpool;</div><div class='add'>+    } else if (!strcasecmp(key, "priv")) {</div><div class='add'>+        opt_key = &amp;dump_options.xl_options.dump_priv;</div><div class='add'>+    } else if (!strcasecmp(key, "fd")) {</div><div class='add'>+        opt_key = &amp;dump_options.xl_options.dump_fd;</div><div class='add'>+    } else if (!strcasecmp(key, "inode")) {</div><div class='add'>+        opt_key = &amp;dump_options.xl_options.dump_inode;</div><div class='add'>+    } else if (!strcasecmp(key, "inodectx")) {</div><div class='add'>+        opt_key = &amp;dump_options.xl_options.dump_inodectx;</div><div class='add'>+    } else if (!strcasecmp(key, "fdctx")) {</div><div class='add'>+        opt_key = &amp;dump_options.xl_options.dump_fdctx;</div><div class='add'>+    } else if (!strcasecmp(key, "history")) {</div><div class='add'>+        opt_key = &amp;dump_options.xl_options.dump_history;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (!opt_key) {</div><div class='add'>+        // None of dump options match the key, return back</div><div class='add'>+        len = snprintf(buf, sizeof(buf),</div><div class='add'>+                       "[Warning]:None of the options "</div><div class='add'>+                       "matched key : %s\n",</div><div class='add'>+                       key);</div><div class='add'>+        if (len &lt; 0)</div><div class='add'>+            ret = -1;</div><div class='add'>+        else {</div><div class='add'>+            ret = sys_write(gf_dump_fd, buf, len);</div><div class='add'>+            if (ret &gt;= 0)</div><div class='add'>+                ret = -1;</div><div class='add'>+        }</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    opt_value = (strncasecmp(value, "yes", 3) ? _gf_false : _gf_true);</div><div class='add'>+</div><div class='add'>+    GF_PROC_DUMP_SET_OPTION(*opt_key, opt_value);</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> static int</div><div class='del'>-gf_proc_dump_options_init ()</div><div class='add'>+gf_proc_dump_options_init()</div><div class='ctx'> {</div><div class='del'>-        int     ret = -1;</div><div class='del'>-        FILE    *fp = NULL;</div><div class='del'>-        char    buf[256];</div><div class='del'>-        char    *key = NULL, *value = NULL;</div><div class='del'>-        char    *saveptr = NULL;</div><div class='del'>-	</div><div class='del'>-	</div><div class='del'>-        fp = fopen (GF_DUMP_OPTIONFILE, "r");</div><div class='add'>+    int ret = -1;</div><div class='add'>+    FILE *fp = NULL;</div><div class='add'>+    char buf[256];</div><div class='add'>+    char *key = NULL, *value = NULL;</div><div class='add'>+    char *saveptr = NULL;</div><div class='add'>+    char dump_option_file[PATH_MAX];</div><div class='add'>+</div><div class='add'>+    /* glusterd will create a file glusterdump.&lt;pid&gt;.options and</div><div class='add'>+       sets the statedump options for the process and the file is removed</div><div class='add'>+       after the statedump is taken. Direct issue of SIGUSR1 does not have</div><div class='add'>+       mechanism for considering the statedump options. So to have a way</div><div class='add'>+       of configuring the statedump of all the glusterfs processes through</div><div class='add'>+       both cli command and SIGUSR1, glusterdump.options file is searched</div><div class='add'>+       and the options mentioned in it are given the higher priority.</div><div class='add'>+    */</div><div class='add'>+    snprintf(dump_option_file, sizeof(dump_option_file),</div><div class='add'>+             DEFAULT_VAR_RUN_DIRECTORY "/glusterdump.options");</div><div class='add'>+    fp = fopen(dump_option_file, "r");</div><div class='add'>+    if (!fp) {</div><div class='add'>+        snprintf(dump_option_file, sizeof(dump_option_file),</div><div class='add'>+                 DEFAULT_VAR_RUN_DIRECTORY "/glusterdump.%d.options", getpid());</div><div class='add'>+</div><div class='add'>+        fp = fopen(dump_option_file, "r");</div><div class='ctx'> </div><div class='ctx'>         if (!fp) {</div><div class='del'>-                //ENOENT, return success</div><div class='del'>-                (void) gf_proc_dump_enable_all_options ();</div><div class='del'>-                return 0;</div><div class='add'>+            // ENOENT, return success</div><div class='add'>+            (void)gf_proc_dump_enable_all_options();</div><div class='add'>+            return 0;</div><div class='ctx'>         }</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        (void) gf_proc_dump_disable_all_options ();</div><div class='add'>+    (void)gf_proc_dump_disable_all_options();</div><div class='ctx'> </div><div class='del'>-        ret = fscanf (fp, "%s", buf);</div><div class='add'>+    // swallow the errors if setting statedump file path is failed.</div><div class='add'>+    (void)gf_proc_dump_set_path(dump_option_file);</div><div class='ctx'> </div><div class='del'>-        while (ret != EOF) {</div><div class='add'>+    ret = fscanf(fp, "%255s", buf);</div><div class='ctx'> </div><div class='del'>-                key = strtok_r (buf, "=", &amp;saveptr);</div><div class='del'>-                if (!key) {</div><div class='del'>-                        ret = fscanf (fp, "%s", buf);</div><div class='del'>-                        continue;</div><div class='del'>-                }</div><div class='add'>+    while (ret != EOF) {</div><div class='add'>+        key = strtok_r(buf, "=", &amp;saveptr);</div><div class='add'>+        if (!key) {</div><div class='add'>+            ret = fscanf(fp, "%255s", buf);</div><div class='add'>+            continue;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-                value = strtok_r (NULL, "=", &amp;saveptr);</div><div class='add'>+        value = strtok_r(NULL, "=", &amp;saveptr);</div><div class='ctx'> </div><div class='del'>-                if (!value) {</div><div class='del'>-                        ret = fscanf (fp, "%s", buf);</div><div class='del'>-                        continue;</div><div class='del'>-                }</div><div class='add'>+        if (!value) {</div><div class='add'>+            ret = fscanf(fp, "%255s", buf);</div><div class='add'>+            continue;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-                gf_log ("", GF_LOG_DEBUG, "key = %s, value = %s",</div><div class='del'>-                        key, value);</div><div class='add'>+        gf_proc_dump_parse_set_option(key, value);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-                gf_proc_dump_parse_set_option (key, value);</div><div class='add'>+    if (is_gf_proc_dump_all_disabled())</div><div class='add'>+        (void)gf_proc_dump_enable_default_options();</div><div class='ctx'> </div><div class='del'>-        }</div><div class='add'>+    if (fp)</div><div class='add'>+        fclose(fp);</div><div class='ctx'> </div><div class='del'>-        return 0;</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> void</div><div class='del'>-gf_proc_dump_info (int signum)</div><div class='add'>+gf_proc_dump_info(int signum, glusterfs_ctx_t *ctx)</div><div class='ctx'> {</div><div class='del'>-        int               ret = -1;</div><div class='del'>-        glusterfs_ctx_t   *ctx = NULL;</div><div class='add'>+    int i = 0;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    glusterfs_graph_t *trav = NULL;</div><div class='add'>+    char brick_name[PATH_MAX] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    char timestr[GF_TIMESTR_SIZE] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    char sign_string[512] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    char tmp_dump_name[PATH_MAX] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    char path[PATH_MAX] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    struct timeval tv = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    gf_boolean_t is_brick_mux = _gf_false;</div><div class='add'>+    xlator_t *top = NULL;</div><div class='add'>+    xlator_list_t **trav_p = NULL;</div><div class='add'>+    int brick_count = 0;</div><div class='add'>+    int len = 0;</div><div class='add'>+</div><div class='add'>+    gf_msg_trace("dump", 0, "received statedump request (sig:USR1)");</div><div class='add'>+</div><div class='add'>+    if (!ctx)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    /*</div><div class='add'>+     * Multiplexed daemons can change the active graph when attach/detach</div><div class='add'>+     * is called. So this has to be protected with the cleanup lock.</div><div class='add'>+     */</div><div class='add'>+    if (mgmt_is_multiplexed_daemon(ctx-&gt;cmd_args.process_name))</div><div class='add'>+        pthread_mutex_lock(&amp;ctx-&gt;cleanup_lock);</div><div class='add'>+    gf_proc_dump_lock();</div><div class='add'>+</div><div class='add'>+    if (!mgmt_is_multiplexed_daemon(ctx-&gt;cmd_args.process_name) &amp;&amp;</div><div class='add'>+        (ctx &amp;&amp; ctx-&gt;active)) {</div><div class='add'>+        top = ctx-&gt;active-&gt;first;</div><div class='add'>+        for (trav_p = &amp;top-&gt;children; *trav_p; trav_p = &amp;(*trav_p)-&gt;next) {</div><div class='add'>+            brick_count++;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-	</div><div class='del'>-        gf_proc_dump_lock ();</div><div class='del'>-        ret = gf_proc_dump_open ();</div><div class='del'>-        if (ret &lt; 0)</div><div class='del'>-                goto out;</div><div class='add'>+        if (brick_count &gt; 1)</div><div class='add'>+            is_brick_mux = _gf_true;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (ctx-&gt;cmd_args.brick_name) {</div><div class='add'>+        GF_REMOVE_SLASH_FROM_PATH(ctx-&gt;cmd_args.brick_name, brick_name);</div><div class='add'>+    } else</div><div class='add'>+        snprintf(brick_name, sizeof(brick_name), "glusterdump");</div><div class='add'>+</div><div class='add'>+    ret = gf_proc_dump_options_init();</div><div class='add'>+    if (ret &lt; 0)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    ret = snprintf(</div><div class='add'>+        path, sizeof(path), "%s/%s.%d.dump.%" PRIu64,</div><div class='add'>+        ((dump_options.dump_path != NULL)</div><div class='add'>+             ? dump_options.dump_path</div><div class='add'>+             : ((ctx-&gt;statedump_path != NULL) ? ctx-&gt;statedump_path</div><div class='add'>+                                              : DEFAULT_VAR_RUN_DIRECTORY)),</div><div class='add'>+        brick_name, getpid(), (uint64_t)gf_time());</div><div class='add'>+    if ((ret &lt; 0) || (ret &gt;= sizeof(path))) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    snprintf(</div><div class='add'>+        tmp_dump_name, PATH_MAX, "%s/dumpXXXXXX",</div><div class='add'>+        ((dump_options.dump_path != NULL)</div><div class='add'>+             ? dump_options.dump_path</div><div class='add'>+             : ((ctx-&gt;statedump_path != NULL) ? ctx-&gt;statedump_path</div><div class='add'>+                                              : DEFAULT_VAR_RUN_DIRECTORY)));</div><div class='add'>+</div><div class='add'>+    ret = gf_proc_dump_open(tmp_dump_name);</div><div class='add'>+    if (ret &lt; 0)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    // continue even though gettimeofday() has failed</div><div class='add'>+    ret = gettimeofday(&amp;tv, NULL);</div><div class='add'>+    if (0 == ret) {</div><div class='add'>+        gf_time_fmt_tv(timestr, sizeof timestr, &amp;tv, gf_timefmt_FT);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    len = snprintf(sign_string, sizeof(sign_string), "DUMP-START-TIME: %s\n",</div><div class='add'>+                   timestr);</div><div class='add'>+</div><div class='add'>+    // swallow the errors of write for start and end marker</div><div class='add'>+    (void)sys_write(gf_dump_fd, sign_string, len);</div><div class='add'>+</div><div class='add'>+    memset(timestr, 0, sizeof(timestr));</div><div class='add'>+</div><div class='add'>+    if (GF_PROC_DUMP_IS_OPTION_ENABLED(mem)) {</div><div class='add'>+        gf_proc_dump_mem_info();</div><div class='add'>+        gf_proc_dump_mempool_info(ctx);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (GF_PROC_DUMP_IS_OPTION_ENABLED(iobuf))</div><div class='add'>+        iobuf_stats_dump(ctx-&gt;iobuf_pool);</div><div class='add'>+    if (GF_PROC_DUMP_IS_OPTION_ENABLED(callpool))</div><div class='add'>+        gf_proc_dump_pending_frames(ctx-&gt;pool);</div><div class='add'>+</div><div class='add'>+    /* dictionary stats */</div><div class='add'>+    gf_proc_dump_add_section("dict");</div><div class='add'>+    gf_proc_dump_dict_info(ctx);</div><div class='add'>+</div><div class='add'>+    if (ctx-&gt;master) {</div><div class='add'>+        gf_proc_dump_add_section("fuse");</div><div class='add'>+        gf_proc_dump_single_xlator_info(ctx-&gt;master);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (ctx-&gt;active) {</div><div class='add'>+        gf_proc_dump_add_section("active graph - %d", ctx-&gt;graph_id);</div><div class='add'>+        gf_proc_dump_xlator_info(ctx-&gt;active-&gt;top, is_brick_mux);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    i = 0;</div><div class='add'>+    list_for_each_entry(trav, &amp;ctx-&gt;graphs, list)</div><div class='add'>+    {</div><div class='add'>+        if (trav == ctx-&gt;active)</div><div class='add'>+            continue;</div><div class='add'>+</div><div class='add'>+        gf_proc_dump_add_section("oldgraph[%d]", i);</div><div class='add'>+</div><div class='add'>+        gf_proc_dump_oldgraph_xlator_info(trav-&gt;top);</div><div class='add'>+        i++;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = gettimeofday(&amp;tv, NULL);</div><div class='add'>+    if (0 == ret) {</div><div class='add'>+        gf_time_fmt_tv(timestr, sizeof timestr, &amp;tv, gf_timefmt_FT);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    len = snprintf(sign_string, sizeof(sign_string), "\nDUMP-END-TIME: %s",</div><div class='add'>+                   timestr);</div><div class='add'>+    (void)sys_write(gf_dump_fd, sign_string, len);</div><div class='add'>+</div><div class='add'>+    if (gf_dump_fd != -1)</div><div class='add'>+        gf_proc_dump_close();</div><div class='add'>+    sys_rename(tmp_dump_name, path);</div><div class='add'>+out:</div><div class='add'>+    GF_FREE(dump_options.dump_path);</div><div class='add'>+    dump_options.dump_path = NULL;</div><div class='add'>+    if (ctx) {</div><div class='add'>+        gf_proc_dump_unlock();</div><div class='add'>+        if (mgmt_is_multiplexed_daemon(ctx-&gt;cmd_args.process_name))</div><div class='add'>+            pthread_mutex_unlock(&amp;ctx-&gt;cleanup_lock);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        ret = gf_proc_dump_options_init ();</div><div class='del'>-	</div><div class='del'>-        if (ret &lt; 0)</div><div class='del'>-                goto out;</div><div class='add'>+void</div><div class='add'>+gf_proc_dump_fini(void)</div><div class='add'>+{</div><div class='add'>+    pthread_mutex_destroy(&amp;gf_proc_dump_mutex);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+gf_proc_dump_init()</div><div class='add'>+{</div><div class='add'>+    pthread_mutex_init(&amp;gf_proc_dump_mutex, NULL);</div><div class='ctx'> </div><div class='del'>-        if (GF_PROC_DUMP_IS_OPTION_ENABLED (mem))</div><div class='del'>-                gf_proc_dump_mem_info ();</div><div class='add'>+    return;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        ctx = glusterfs_ctx_get ();</div><div class='del'>-        </div><div class='del'>-        if (ctx) {</div><div class='del'>-		if (GF_PROC_DUMP_IS_OPTION_ENABLED (iobuf))</div><div class='del'>-			iobuf_stats_dump (ctx-&gt;iobuf_pool);</div><div class='del'>-                if (GF_PROC_DUMP_IS_OPTION_ENABLED (callpool))</div><div class='del'>-                        gf_proc_dump_pending_frames (ctx-&gt;pool);</div><div class='del'>-                gf_proc_dump_xlator_info (ctx-&gt;active-&gt;top); </div><div class='add'>+void</div><div class='add'>+gf_proc_dump_cleanup(void)</div><div class='add'>+{</div><div class='add'>+    pthread_mutex_destroy(&amp;gf_proc_dump_mutex);</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        }</div><div class='add'>+void</div><div class='add'>+gf_proc_dump_xlator_private(xlator_t *this, strfd_t *strfd)</div><div class='add'>+{</div><div class='add'>+    gf_proc_dump_lock();</div><div class='add'>+    {</div><div class='add'>+        gf_dump_strfd = strfd;</div><div class='ctx'> </div><div class='del'>-        gf_proc_dump_close ();</div><div class='del'>-out:</div><div class='del'>-        gf_proc_dump_unlock ();</div><div class='add'>+        if (this-&gt;dumpops &amp;&amp; this-&gt;dumpops-&gt;priv)</div><div class='add'>+            this-&gt;dumpops-&gt;priv(this);</div><div class='ctx'> </div><div class='del'>-        return;</div><div class='add'>+        gf_dump_strfd = NULL;</div><div class='add'>+    }</div><div class='add'>+    gf_proc_dump_unlock();</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> void</div><div class='del'>-gf_proc_dump_fini (void)</div><div class='add'>+gf_proc_dump_mallinfo(strfd_t *strfd)</div><div class='ctx'> {</div><div class='del'>-	pthread_mutex_destroy (&amp;gf_proc_dump_mutex);</div><div class='del'>-}</div><div class='add'>+    gf_proc_dump_lock();</div><div class='add'>+    {</div><div class='add'>+        gf_dump_strfd = strfd;</div><div class='ctx'> </div><div class='add'>+        gf_proc_dump_mem_info();</div><div class='add'>+</div><div class='add'>+        gf_dump_strfd = NULL;</div><div class='add'>+    }</div><div class='add'>+    gf_proc_dump_unlock();</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> void</div><div class='del'>-gf_proc_dump_init ()</div><div class='add'>+gf_proc_dump_xlator_history(xlator_t *this, strfd_t *strfd)</div><div class='ctx'> {</div><div class='del'>-	pthread_mutex_init (&amp;gf_proc_dump_mutex, NULL);</div><div class='add'>+    gf_proc_dump_lock();</div><div class='add'>+    {</div><div class='add'>+        gf_dump_strfd = strfd;</div><div class='ctx'> </div><div class='del'>-	return;</div><div class='add'>+        if (this-&gt;dumpops &amp;&amp; this-&gt;dumpops-&gt;history)</div><div class='add'>+            this-&gt;dumpops-&gt;history(this);</div><div class='add'>+</div><div class='add'>+        gf_dump_strfd = NULL;</div><div class='add'>+    }</div><div class='add'>+    gf_proc_dump_unlock();</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+void</div><div class='add'>+gf_proc_dump_xlator_itable(xlator_t *this, strfd_t *strfd)</div><div class='add'>+{</div><div class='add'>+    gf_proc_dump_lock();</div><div class='add'>+    {</div><div class='add'>+        gf_dump_strfd = strfd;</div><div class='add'>+</div><div class='add'>+        gf_dump_strfd = NULL;</div><div class='add'>+    }</div><div class='add'>+    gf_proc_dump_unlock();</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> void</div><div class='del'>-gf_proc_dump_cleanup (void)</div><div class='add'>+gf_proc_dump_xlator_meminfo(xlator_t *this, strfd_t *strfd)</div><div class='ctx'> {</div><div class='del'>-	pthread_mutex_destroy (&amp;gf_proc_dump_mutex);</div><div class='add'>+    gf_proc_dump_lock();</div><div class='add'>+    {</div><div class='add'>+        gf_dump_strfd = strfd;</div><div class='add'>+</div><div class='add'>+        gf_proc_dump_xlator_mem_info(this);</div><div class='add'>+</div><div class='add'>+        gf_dump_strfd = NULL;</div><div class='add'>+    }</div><div class='add'>+    gf_proc_dump_unlock();</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+void</div><div class='add'>+gf_proc_dump_xlator_profile(xlator_t *this, strfd_t *strfd)</div><div class='add'>+{</div><div class='add'>+    gf_proc_dump_lock();</div><div class='add'>+    {</div><div class='add'>+        gf_dump_strfd = strfd;</div><div class='add'>+</div><div class='add'>+        gf_proc_dump_xl_latency_info(this);</div><div class='ctx'> </div><div class='add'>+        gf_dump_strfd = NULL;</div><div class='add'>+    }</div><div class='add'>+    gf_proc_dump_unlock();</div><div class='add'>+}</div><div class='head'>diff --git a/libglusterfs/src/statedump.h b/libglusterfs/src/statedump.h<br/>deleted file mode 100644<br/>index 02cba5bac51..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/libglusterfs/src/statedump.h?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/statedump.h</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,96 +0,0 @@</div><div class='del'>-/*</div><div class='del'>-  Copyright (c) 2009 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='del'>-  This file is part of GlusterFS.</div><div class='del'>-</div><div class='del'>-  GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-  it under the terms of the GNU General Public License as published</div><div class='del'>-  by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-  or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-  GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-  WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-  General Public License for more details.</div><div class='del'>-</div><div class='del'>-  You should have received a copy of the GNU General Public License</div><div class='del'>-  along with this program.  If not, see</div><div class='del'>-  &lt;http://www.gnu.org/licenses/&gt;.</div><div class='del'>-*/</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-#ifndef STATEDUMP_H</div><div class='del'>-#define STATEDUMP_H   </div><div class='del'>-</div><div class='del'>-#include &lt;stdarg.h&gt;</div><div class='del'>-#include "inode.h"</div><div class='del'>-</div><div class='del'>-#define GF_DUMP_MAX_BUF_LEN 4096</div><div class='del'>-</div><div class='del'>-#define GF_DUMP_LOGFILE_ROOT "/tmp/glusterdump"</div><div class='del'>-#define GF_DUMP_LOGFILE_ROOT_LEN 256</div><div class='del'>-</div><div class='del'>-#define GF_DUMP_OPTIONFILE "/tmp/glusterdump.input"</div><div class='del'>-</div><div class='del'>-typedef struct gf_dump_xl_options_ {</div><div class='del'>-        gf_boolean_t    dump_priv;</div><div class='del'>-        gf_boolean_t    dump_inode;</div><div class='del'>-        gf_boolean_t    dump_fd;</div><div class='del'>-} gf_dump_xl_options_t;</div><div class='del'>-</div><div class='del'>-typedef struct gf_dump_options_ {</div><div class='del'>-        gf_boolean_t            dump_mem;</div><div class='del'>-        gf_boolean_t            dump_iobuf;</div><div class='del'>-        gf_boolean_t            dump_callpool;</div><div class='del'>-        gf_dump_xl_options_t    xl_options; //options for all xlators</div><div class='del'>-} gf_dump_options_t;</div><div class='del'>-</div><div class='del'>-static inline</div><div class='del'>-void _gf_proc_dump_build_key (char *key, const char *prefix, char *fmt,...)</div><div class='del'>-{</div><div class='del'>-        char buf[GF_DUMP_MAX_BUF_LEN];</div><div class='del'>-        va_list ap;</div><div class='del'>-</div><div class='del'>-        memset(buf, 0, sizeof(buf));</div><div class='del'>-        va_start(ap, fmt);</div><div class='del'>-        vsnprintf(buf, GF_DUMP_MAX_BUF_LEN, fmt, ap);</div><div class='del'>-        va_end(ap);</div><div class='del'>-        snprintf(key, GF_DUMP_MAX_BUF_LEN, "%s.%s", prefix, buf);  </div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-#define gf_proc_dump_build_key(key, key_prefix, fmt...) \</div><div class='del'>-{\</div><div class='del'>-        _gf_proc_dump_build_key(key, key_prefix, ##fmt);\</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-#define GF_PROC_DUMP_SET_OPTION(opt,val) opt = val</div><div class='del'>-</div><div class='del'>-void</div><div class='del'>-gf_proc_dump_init();</div><div class='del'>-</div><div class='del'>-void </div><div class='del'>-gf_proc_dump_fini(void);</div><div class='del'>-</div><div class='del'>-void</div><div class='del'>-gf_proc_dump_cleanup(void);</div><div class='del'>-</div><div class='del'>-void</div><div class='del'>-gf_proc_dump_info(int signum);</div><div class='del'>-</div><div class='del'>-void</div><div class='del'>-gf_proc_dump_add_section(char *key,...);</div><div class='del'>-</div><div class='del'>-void</div><div class='del'>-gf_proc_dump_write(char *key, char *value,...);</div><div class='del'>-</div><div class='del'>-void</div><div class='del'>-inode_table_dump(inode_table_t *itable, char *prefix);</div><div class='del'>-</div><div class='del'>-void</div><div class='del'>-fdtable_dump(fdtable_t *fdtable, char *prefix);</div><div class='del'>-</div><div class='del'>-void</div><div class='del'>-inode_dump(inode_t *inode, char *prefix);</div><div class='del'>-</div><div class='del'>-void</div><div class='del'>-glusterd_init (int sig);</div><div class='del'>-#endif /* STATEDUMP_H */</div><div class='head'>diff --git a/libglusterfs/src/store.c b/libglusterfs/src/store.c<br/>new file mode 100644<br/>index 00000000000..5c316b9291a<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/libglusterfs/src/store.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>libglusterfs/src/store.c</a></div><div class='hunk'>@@ -0,0 +1,744 @@</div><div class='add'>+/*</div><div class='add'>+   Copyright (c) 2013 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+   This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+   This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+   General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+   later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+   cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#include &lt;inttypes.h&gt;</div><div class='add'>+#include &lt;libgen.h&gt;</div><div class='add'>+</div><div class='add'>+#include "glusterfs/glusterfs.h"</div><div class='add'>+#include "glusterfs/store.h"</div><div class='add'>+#include "glusterfs/xlator.h"</div><div class='add'>+#include "glusterfs/syscall.h"</div><div class='add'>+#include "glusterfs/libglusterfs-messages.h"</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+gf_store_mkdir(char *path)</div><div class='add'>+{</div><div class='add'>+    int32_t ret = -1;</div><div class='add'>+</div><div class='add'>+    ret = mkdir_p(path, 0755, _gf_true);</div><div class='add'>+</div><div class='add'>+    if ((-1 == ret) &amp;&amp; (EEXIST != errno)) {</div><div class='add'>+        gf_msg("", GF_LOG_ERROR, errno, LG_MSG_DIR_OP_FAILED,</div><div class='add'>+               "mkdir()"</div><div class='add'>+               " failed on path %s.",</div><div class='add'>+               path);</div><div class='add'>+    } else {</div><div class='add'>+        ret = 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+gf_store_handle_create_on_absence(gf_store_handle_t **shandle, char *path)</div><div class='add'>+{</div><div class='add'>+    GF_ASSERT(shandle);</div><div class='add'>+    int32_t ret = 0;</div><div class='add'>+</div><div class='add'>+    if (*shandle == NULL) {</div><div class='add'>+        ret = gf_store_handle_new(path, shandle);</div><div class='add'>+</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_msg("", GF_LOG_ERROR, 0, LG_MSG_STORE_HANDLE_CREATE_FAILED,</div><div class='add'>+                   "Unable to"</div><div class='add'>+                   " create store handle for path: %s",</div><div class='add'>+                   path);</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+gf_store_mkstemp(gf_store_handle_t *shandle)</div><div class='add'>+{</div><div class='add'>+    char tmppath[PATH_MAX] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    GF_VALIDATE_OR_GOTO("store", shandle, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("store", shandle-&gt;path, out);</div><div class='add'>+</div><div class='add'>+    snprintf(tmppath, sizeof(tmppath), "%s.tmp", shandle-&gt;path);</div><div class='add'>+    shandle-&gt;tmp_fd = open(tmppath, O_RDWR | O_CREAT | O_TRUNC, 0600);</div><div class='add'>+    if (shandle-&gt;tmp_fd &lt; 0) {</div><div class='add'>+        gf_msg("", GF_LOG_ERROR, errno, LG_MSG_FILE_OP_FAILED,</div><div class='add'>+               "Failed to open %s.", tmppath);</div><div class='add'>+    }</div><div class='add'>+out:</div><div class='add'>+    return shandle-&gt;tmp_fd;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+gf_store_sync_direntry(char *path)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int dirfd = -1;</div><div class='add'>+    char *dir = NULL;</div><div class='add'>+    char *pdir = NULL;</div><div class='add'>+    xlator_t *this = NULL;</div><div class='add'>+</div><div class='add'>+    this = THIS;</div><div class='add'>+</div><div class='add'>+    dir = gf_strdup(path);</div><div class='add'>+    if (!dir)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    pdir = dirname(dir);</div><div class='add'>+    dirfd = open(pdir, O_RDONLY);</div><div class='add'>+    if (dirfd == -1) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_ERROR, errno, LG_MSG_DIR_OP_FAILED,</div><div class='add'>+               "Failed to open directory %s.", pdir);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = sys_fsync(dirfd);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_ERROR, errno, LG_MSG_DIR_OP_FAILED,</div><div class='add'>+               "Failed to fsync %s.", pdir);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+out:</div><div class='add'>+    if (dirfd &gt;= 0) {</div><div class='add'>+        ret = sys_close(dirfd);</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, errno, LG_MSG_DIR_OP_FAILED,</div><div class='add'>+                   "Failed to close %s", pdir);</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (dir)</div><div class='add'>+        GF_FREE(dir);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+gf_store_rename_tmppath(gf_store_handle_t *shandle)</div><div class='add'>+{</div><div class='add'>+    int32_t ret = -1;</div><div class='add'>+    char tmppath[PATH_MAX] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    GF_VALIDATE_OR_GOTO("store", shandle, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("store", shandle-&gt;path, out);</div><div class='add'>+</div><div class='add'>+    ret = sys_fsync(shandle-&gt;tmp_fd);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_msg(THIS-&gt;name, GF_LOG_ERROR, errno, LG_MSG_FILE_OP_FAILED,</div><div class='add'>+               "Failed to fsync %s", shandle-&gt;path);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    snprintf(tmppath, sizeof(tmppath), "%s.tmp", shandle-&gt;path);</div><div class='add'>+    ret = sys_rename(tmppath, shandle-&gt;path);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_msg(THIS-&gt;name, GF_LOG_ERROR, errno, LG_MSG_FILE_OP_FAILED,</div><div class='add'>+               "Failed to rename %s to %s", tmppath, shandle-&gt;path);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = gf_store_sync_direntry(tmppath);</div><div class='add'>+out:</div><div class='add'>+    if (shandle &amp;&amp; shandle-&gt;tmp_fd &gt;= 0) {</div><div class='add'>+        sys_close(shandle-&gt;tmp_fd);</div><div class='add'>+        shandle-&gt;tmp_fd = -1;</div><div class='add'>+    }</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+gf_store_unlink_tmppath(gf_store_handle_t *shandle)</div><div class='add'>+{</div><div class='add'>+    int32_t ret = -1;</div><div class='add'>+    char tmppath[PATH_MAX] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    GF_VALIDATE_OR_GOTO("store", shandle, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("store", shandle-&gt;path, out);</div><div class='add'>+</div><div class='add'>+    snprintf(tmppath, sizeof(tmppath), "%s.tmp", shandle-&gt;path);</div><div class='add'>+    ret = sys_unlink(tmppath);</div><div class='add'>+    if (ret &amp;&amp; (errno != ENOENT)) {</div><div class='add'>+        gf_msg("", GF_LOG_ERROR, errno, LG_MSG_FILE_OP_FAILED,</div><div class='add'>+               "Failed to mv %s to %s", tmppath, shandle-&gt;path);</div><div class='add'>+    } else {</div><div class='add'>+        ret = 0;</div><div class='add'>+    }</div><div class='add'>+out:</div><div class='add'>+    if (shandle &amp;&amp; shandle-&gt;tmp_fd &gt;= 0) {</div><div class='add'>+        sys_close(shandle-&gt;tmp_fd);</div><div class='add'>+        shandle-&gt;tmp_fd = -1;</div><div class='add'>+    }</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+gf_store_read_and_tokenize(FILE *file, char **iter_key, char **iter_val,</div><div class='add'>+                           gf_store_op_errno_t *store_errno)</div><div class='add'>+{</div><div class='add'>+    int32_t ret = -1;</div><div class='add'>+    char *savetok = NULL;</div><div class='add'>+    char *key = NULL;</div><div class='add'>+    char *value = NULL;</div><div class='add'>+    char *temp = NULL;</div><div class='add'>+    size_t str_len = 0;</div><div class='add'>+    char str[8192];</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(file);</div><div class='add'>+    GF_ASSERT(iter_key);</div><div class='add'>+    GF_ASSERT(iter_val);</div><div class='add'>+    GF_ASSERT(store_errno);</div><div class='add'>+</div><div class='add'>+retry:</div><div class='add'>+    temp = fgets(str, 8192, file);</div><div class='add'>+    if (temp == NULL || feof(file)) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        *store_errno = GD_STORE_EOF;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (strcmp(str, "\n") == 0)</div><div class='add'>+        goto retry;</div><div class='add'>+</div><div class='add'>+    str_len = strlen(str);</div><div class='add'>+    str[str_len - 1] = '\0';</div><div class='add'>+    /* Truncate the "\n", as fgets stores "\n" in str */</div><div class='add'>+</div><div class='add'>+    key = strtok_r(str, "=", &amp;savetok);</div><div class='add'>+    if (!key) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        *store_errno = GD_STORE_KEY_NULL;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    value = strtok_r(NULL, "", &amp;savetok);</div><div class='add'>+    if (!value) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        *store_errno = GD_STORE_VALUE_NULL;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    *iter_key = key;</div><div class='add'>+    *iter_val = value;</div><div class='add'>+    *store_errno = GD_STORE_SUCCESS;</div><div class='add'>+    ret = 0;</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+gf_store_retrieve_value(gf_store_handle_t *handle, char *key, char **value)</div><div class='add'>+{</div><div class='add'>+    int32_t ret = -1;</div><div class='add'>+    char *iter_key = NULL;</div><div class='add'>+    char *iter_val = NULL;</div><div class='add'>+    gf_store_op_errno_t store_errno = GD_STORE_SUCCESS;</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(handle);</div><div class='add'>+</div><div class='add'>+    if (handle-&gt;locked == F_ULOCK)</div><div class='add'>+        /* no locking is used handle-&gt;fd gets closed() after usage */</div><div class='add'>+        handle-&gt;fd = open(handle-&gt;path, O_RDWR);</div><div class='add'>+    else</div><div class='add'>+        /* handle-&gt;fd is valid already, kept open for lockf() */</div><div class='add'>+        sys_lseek(handle-&gt;fd, 0, SEEK_SET);</div><div class='add'>+</div><div class='add'>+    if (handle-&gt;fd == -1) {</div><div class='add'>+        gf_msg("", GF_LOG_ERROR, errno, LG_MSG_FILE_OP_FAILED,</div><div class='add'>+               "Unable to open file %s", handle-&gt;path);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    if (!handle-&gt;read) {</div><div class='add'>+        int duped_fd = dup(handle-&gt;fd);</div><div class='add'>+</div><div class='add'>+        if (duped_fd &gt;= 0)</div><div class='add'>+            handle-&gt;read = fdopen(duped_fd, "r");</div><div class='add'>+        if (!handle-&gt;read) {</div><div class='add'>+            if (duped_fd != -1)</div><div class='add'>+                sys_close(duped_fd);</div><div class='add'>+            gf_msg("", GF_LOG_ERROR, errno, LG_MSG_FILE_OP_FAILED,</div><div class='add'>+                   "Unable to open file %s", handle-&gt;path);</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    } else {</div><div class='add'>+        fseek(handle-&gt;read, 0, SEEK_SET);</div><div class='add'>+    }</div><div class='add'>+    do {</div><div class='add'>+        ret = gf_store_read_and_tokenize(handle-&gt;read, &amp;iter_key, &amp;iter_val,</div><div class='add'>+                                         &amp;store_errno);</div><div class='add'>+        if (ret &lt; 0) {</div><div class='add'>+            gf_msg_trace("", 0,</div><div class='add'>+                         "error while reading key '%s': "</div><div class='add'>+                         "%s",</div><div class='add'>+                         key, gf_store_strerror(store_errno));</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        gf_msg_trace("", 0, "key %s read", iter_key);</div><div class='add'>+</div><div class='add'>+        if (!strcmp(key, iter_key)) {</div><div class='add'>+            gf_msg_debug("", 0, "key %s found", key);</div><div class='add'>+            ret = 0;</div><div class='add'>+            if (iter_val)</div><div class='add'>+                *value = gf_strdup(iter_val);</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    } while (1);</div><div class='add'>+out:</div><div class='add'>+    if (handle-&gt;read) {</div><div class='add'>+        fclose(handle-&gt;read);</div><div class='add'>+        handle-&gt;read = NULL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (handle-&gt;fd &gt; 0 &amp;&amp; handle-&gt;locked == F_ULOCK) {</div><div class='add'>+        /* only invalidate handle-&gt;fd if not locked */</div><div class='add'>+        sys_close(handle-&gt;fd);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+gf_store_save_value(int fd, char *key, char *value)</div><div class='add'>+{</div><div class='add'>+    int32_t ret = -1;</div><div class='add'>+    int dup_fd = -1;</div><div class='add'>+    FILE *fp = NULL;</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(fd &gt; 0);</div><div class='add'>+    GF_ASSERT(key);</div><div class='add'>+    GF_ASSERT(value);</div><div class='add'>+</div><div class='add'>+    dup_fd = dup(fd);</div><div class='add'>+    if (dup_fd == -1)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    fp = fdopen(dup_fd, "a+");</div><div class='add'>+    if (fp == NULL) {</div><div class='add'>+        gf_msg(THIS-&gt;name, GF_LOG_WARNING, errno, LG_MSG_FILE_OP_FAILED,</div><div class='add'>+               "fdopen failed.");</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = fprintf(fp, "%s=%s\n", key, value);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        gf_msg(THIS-&gt;name, GF_LOG_WARNING, errno, LG_MSG_FILE_OP_FAILED,</div><div class='add'>+               "Unable to store key: %s, value: %s.", key, value);</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = fflush(fp);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_msg(THIS-&gt;name, GF_LOG_WARNING, errno, LG_MSG_FILE_OP_FAILED,</div><div class='add'>+               "fflush failed.");</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+out:</div><div class='add'>+    if (fp)</div><div class='add'>+        fclose(fp);</div><div class='add'>+</div><div class='add'>+    gf_msg_debug(THIS-&gt;name, 0, "returning: %d", ret);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+gf_store_save_items(int fd, char *items)</div><div class='add'>+{</div><div class='add'>+    int32_t ret = -1;</div><div class='add'>+    int dup_fd = -1;</div><div class='add'>+    FILE *fp = NULL;</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(fd &gt; 0);</div><div class='add'>+    GF_ASSERT(items);</div><div class='add'>+</div><div class='add'>+    dup_fd = dup(fd);</div><div class='add'>+    if (dup_fd == -1)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    fp = fdopen(dup_fd, "a+");</div><div class='add'>+    if (fp == NULL) {</div><div class='add'>+        gf_msg(THIS-&gt;name, GF_LOG_WARNING, errno, LG_MSG_FILE_OP_FAILED,</div><div class='add'>+               "fdopen failed.");</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = fputs(items, fp);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        gf_msg(THIS-&gt;name, GF_LOG_WARNING, errno, LG_MSG_FILE_OP_FAILED,</div><div class='add'>+               "Unable to store items: %s", items);</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = fflush(fp);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_msg(THIS-&gt;name, GF_LOG_WARNING, errno, LG_MSG_FILE_OP_FAILED,</div><div class='add'>+               "fflush failed.");</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+out:</div><div class='add'>+    if (fp)</div><div class='add'>+        fclose(fp);</div><div class='add'>+</div><div class='add'>+    gf_msg_debug(THIS-&gt;name, 0, "returning: %d", ret);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+gf_store_handle_new(const char *path, gf_store_handle_t **handle)</div><div class='add'>+{</div><div class='add'>+    int32_t ret = -1;</div><div class='add'>+    gf_store_handle_t *shandle = NULL;</div><div class='add'>+    int fd = -1;</div><div class='add'>+    char *spath = NULL;</div><div class='add'>+</div><div class='add'>+    shandle = GF_CALLOC(1, sizeof(*shandle), gf_common_mt_store_handle_t);</div><div class='add'>+    if (!shandle)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    spath = gf_strdup(path);</div><div class='add'>+    if (!spath)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    fd = open(path, O_RDWR | O_CREAT | O_APPEND, 0600);</div><div class='add'>+    if (fd &lt; 0) {</div><div class='add'>+        gf_msg("", GF_LOG_ERROR, errno, LG_MSG_FILE_OP_FAILED,</div><div class='add'>+               "Failed to open file: %s.", path);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = gf_store_sync_direntry(spath);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    shandle-&gt;path = spath;</div><div class='add'>+    shandle-&gt;locked = F_ULOCK;</div><div class='add'>+    *handle = shandle;</div><div class='add'>+    shandle-&gt;tmp_fd = -1;</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+out:</div><div class='add'>+    if (fd &gt;= 0)</div><div class='add'>+        sys_close(fd);</div><div class='add'>+</div><div class='add'>+    if (ret) {</div><div class='add'>+        GF_FREE(spath);</div><div class='add'>+        GF_FREE(shandle);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    gf_msg_debug("", 0, "Returning %d", ret);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+gf_store_handle_retrieve(char *path, gf_store_handle_t **handle)</div><div class='add'>+{</div><div class='add'>+    int32_t ret = -1;</div><div class='add'>+    struct stat statbuf = {0};</div><div class='add'>+</div><div class='add'>+    ret = sys_stat(path, &amp;statbuf);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_msg("", GF_LOG_ERROR, errno, LG_MSG_PATH_NOT_FOUND,</div><div class='add'>+               "Path "</div><div class='add'>+               "corresponding to %s.",</div><div class='add'>+               path);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    ret = gf_store_handle_new(path, handle);</div><div class='add'>+out:</div><div class='add'>+    gf_msg_debug("", 0, "Returning %d", ret);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+gf_store_handle_destroy(gf_store_handle_t *handle)</div><div class='add'>+{</div><div class='add'>+    int32_t ret = -1;</div><div class='add'>+</div><div class='add'>+    if (!handle) {</div><div class='add'>+        ret = 0;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    GF_FREE(handle-&gt;path);</div><div class='add'>+</div><div class='add'>+    GF_FREE(handle);</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    gf_msg_debug("", 0, "Returning %d", ret);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+gf_store_iter_new(gf_store_handle_t *shandle, gf_store_iter_t **iter)</div><div class='add'>+{</div><div class='add'>+    int32_t ret = -1;</div><div class='add'>+    FILE *fp = NULL;</div><div class='add'>+    gf_store_iter_t *tmp_iter = NULL;</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(shandle);</div><div class='add'>+    GF_ASSERT(iter);</div><div class='add'>+</div><div class='add'>+    fp = fopen(shandle-&gt;path, "r");</div><div class='add'>+    if (!fp) {</div><div class='add'>+        gf_msg("", GF_LOG_ERROR, errno, LG_MSG_FILE_OP_FAILED,</div><div class='add'>+               "Unable to open file %s", shandle-&gt;path);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    tmp_iter = GF_CALLOC(1, sizeof(*tmp_iter), gf_common_mt_store_iter_t);</div><div class='add'>+    if (!tmp_iter)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    if (snprintf(tmp_iter-&gt;filepath, sizeof(tmp_iter-&gt;filepath), "%s",</div><div class='add'>+                 shandle-&gt;path) &gt;= sizeof(tmp_iter-&gt;filepath))</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    tmp_iter-&gt;file = fp;</div><div class='add'>+</div><div class='add'>+    *iter = tmp_iter;</div><div class='add'>+    tmp_iter = NULL;</div><div class='add'>+    ret = 0;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (ret &amp;&amp; fp)</div><div class='add'>+        fclose(fp);</div><div class='add'>+</div><div class='add'>+    GF_FREE(tmp_iter);</div><div class='add'>+</div><div class='add'>+    gf_msg_debug("", 0, "Returning with %d", ret);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+gf_store_validate_key_value(char *storepath, char *key, char *val,</div><div class='add'>+                            gf_store_op_errno_t *op_errno)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(op_errno);</div><div class='add'>+    GF_ASSERT(storepath);</div><div class='add'>+</div><div class='add'>+    if ((key == NULL) &amp;&amp; (val == NULL)) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        gf_msg("", GF_LOG_ERROR, 0, LG_MSG_INVALID_ENTRY,</div><div class='add'>+               "Glusterd "</div><div class='add'>+               "store may be corrupted, Invalid key and value (null)"</div><div class='add'>+               " in %s",</div><div class='add'>+               storepath);</div><div class='add'>+        *op_errno = GD_STORE_KEY_VALUE_NULL;</div><div class='add'>+    } else if (key == NULL) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        gf_msg("", GF_LOG_ERROR, 0, LG_MSG_INVALID_ENTRY,</div><div class='add'>+               "Glusterd "</div><div class='add'>+               "store may be corrupted, Invalid key (null) in %s",</div><div class='add'>+               storepath);</div><div class='add'>+        *op_errno = GD_STORE_KEY_NULL;</div><div class='add'>+    } else if (val == NULL) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        gf_msg("", GF_LOG_ERROR, 0, LG_MSG_INVALID_ENTRY,</div><div class='add'>+               "Glusterd "</div><div class='add'>+               "store may be corrupted, Invalid value (null) for key"</div><div class='add'>+               " %s in %s",</div><div class='add'>+               key, storepath);</div><div class='add'>+        *op_errno = GD_STORE_VALUE_NULL;</div><div class='add'>+    } else {</div><div class='add'>+        ret = 0;</div><div class='add'>+        *op_errno = GD_STORE_SUCCESS;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+gf_store_iter_get_next(gf_store_iter_t *iter, char **key, char **value,</div><div class='add'>+                       gf_store_op_errno_t *op_errno)</div><div class='add'>+{</div><div class='add'>+    int32_t ret = -1;</div><div class='add'>+    char *iter_key = NULL;</div><div class='add'>+    char *iter_val = NULL;</div><div class='add'>+    gf_store_op_errno_t store_errno = GD_STORE_SUCCESS;</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(iter);</div><div class='add'>+    GF_ASSERT(key);</div><div class='add'>+    GF_ASSERT(value);</div><div class='add'>+</div><div class='add'>+    ret = gf_store_read_and_tokenize(iter-&gt;file, &amp;iter_key, &amp;iter_val,</div><div class='add'>+                                     &amp;store_errno);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = gf_store_validate_key_value(iter-&gt;filepath, iter_key, iter_val,</div><div class='add'>+                                      &amp;store_errno);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    *key = gf_strdup(iter_key);</div><div class='add'>+    if (!*key) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        store_errno = GD_STORE_ENOMEM;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    *value = gf_strdup(iter_val);</div><div class='add'>+    if (!*value) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        store_errno = GD_STORE_ENOMEM;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    ret = 0;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (ret) {</div><div class='add'>+        GF_FREE(*key);</div><div class='add'>+        GF_FREE(*value);</div><div class='add'>+        *key = NULL;</div><div class='add'>+        *value = NULL;</div><div class='add'>+    }</div><div class='add'>+    if (op_errno)</div><div class='add'>+        *op_errno = store_errno;</div><div class='add'>+</div><div class='add'>+    gf_msg_debug("", 0, "Returning with %d", ret);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+gf_store_iter_get_matching(gf_store_iter_t *iter, char *key, char **value)</div><div class='add'>+{</div><div class='add'>+    int32_t ret = -1;</div><div class='add'>+    char *tmp_key = NULL;</div><div class='add'>+    char *tmp_value = NULL;</div><div class='add'>+</div><div class='add'>+    ret = gf_store_iter_get_next(iter, &amp;tmp_key, &amp;tmp_value, NULL);</div><div class='add'>+    while (!ret) {</div><div class='add'>+        if (!strncmp(key, tmp_key, strlen(key))) {</div><div class='add'>+            *value = tmp_value;</div><div class='add'>+            GF_FREE(tmp_key);</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+        GF_FREE(tmp_key);</div><div class='add'>+        tmp_key = NULL;</div><div class='add'>+        GF_FREE(tmp_value);</div><div class='add'>+        tmp_value = NULL;</div><div class='add'>+        ret = gf_store_iter_get_next(iter, &amp;tmp_key, &amp;tmp_value, NULL);</div><div class='add'>+    }</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+gf_store_iter_destroy(gf_store_iter_t **iter)</div><div class='add'>+{</div><div class='add'>+    int32_t ret = -1;</div><div class='add'>+</div><div class='add'>+    if (!(*iter))</div><div class='add'>+        return 0;</div><div class='add'>+</div><div class='add'>+    /* gf_store_iter_new will not return a valid iter object with iter-&gt;file</div><div class='add'>+     * being NULL*/</div><div class='add'>+    ret = fclose((*iter)-&gt;file);</div><div class='add'>+    if (ret)</div><div class='add'>+        gf_msg("", GF_LOG_ERROR, errno, LG_MSG_FILE_OP_FAILED,</div><div class='add'>+               "Unable"</div><div class='add'>+               " to close file: %s, ret: %d",</div><div class='add'>+               (*iter)-&gt;filepath, ret);</div><div class='add'>+</div><div class='add'>+    GF_FREE(*iter);</div><div class='add'>+    *iter = NULL;</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+char *</div><div class='add'>+gf_store_strerror(gf_store_op_errno_t op_errno)</div><div class='add'>+{</div><div class='add'>+    switch (op_errno) {</div><div class='add'>+        case GD_STORE_SUCCESS:</div><div class='add'>+            return "Success";</div><div class='add'>+        case GD_STORE_KEY_NULL:</div><div class='add'>+            return "Invalid Key";</div><div class='add'>+        case GD_STORE_VALUE_NULL:</div><div class='add'>+            return "Invalid Value";</div><div class='add'>+        case GD_STORE_KEY_VALUE_NULL:</div><div class='add'>+            return "Invalid Key and Value";</div><div class='add'>+        case GD_STORE_EOF:</div><div class='add'>+            return "No data";</div><div class='add'>+        case GD_STORE_ENOMEM:</div><div class='add'>+            return "No memory";</div><div class='add'>+        default:</div><div class='add'>+            return "Invalid errno";</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+gf_store_lock(gf_store_handle_t *sh)</div><div class='add'>+{</div><div class='add'>+    int ret;</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(sh);</div><div class='add'>+    GF_ASSERT(sh-&gt;path);</div><div class='add'>+    GF_ASSERT(sh-&gt;locked == F_ULOCK);</div><div class='add'>+</div><div class='add'>+    sh-&gt;fd = open(sh-&gt;path, O_RDWR);</div><div class='add'>+    if (sh-&gt;fd == -1) {</div><div class='add'>+        gf_msg("", GF_LOG_ERROR, errno, LG_MSG_FILE_OP_FAILED,</div><div class='add'>+               "Failed to open '%s'", sh-&gt;path);</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = lockf(sh-&gt;fd, F_LOCK, 0);</div><div class='add'>+    if (ret)</div><div class='add'>+        gf_msg("", GF_LOG_ERROR, errno, LG_MSG_LOCK_FAILED,</div><div class='add'>+               "Failed to gain lock on '%s'", sh-&gt;path);</div><div class='add'>+    else</div><div class='add'>+        /* sh-&gt;locked is protected by the lockf(sh-&gt;fd) above */</div><div class='add'>+        sh-&gt;locked = F_LOCK;</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+gf_store_unlock(gf_store_handle_t *sh)</div><div class='add'>+{</div><div class='add'>+    GF_ASSERT(sh);</div><div class='add'>+    GF_ASSERT(sh-&gt;locked == F_LOCK);</div><div class='add'>+</div><div class='add'>+    sh-&gt;locked = F_ULOCK;</div><div class='add'>+</div><div class='add'>+    /* does not matter if this fails, locks are released on close anyway */</div><div class='add'>+    if (lockf(sh-&gt;fd, F_ULOCK, 0) == -1)</div><div class='add'>+        gf_msg("", GF_LOG_ERROR, errno, LG_MSG_UNLOCK_FAILED,</div><div class='add'>+               "Failed to release lock on '%s'", sh-&gt;path);</div><div class='add'>+</div><div class='add'>+    sys_close(sh-&gt;fd);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+gf_store_locked_local(gf_store_handle_t *sh)</div><div class='add'>+{</div><div class='add'>+    GF_ASSERT(sh);</div><div class='add'>+</div><div class='add'>+    return (sh-&gt;locked == F_LOCK);</div><div class='add'>+}</div><div class='head'>diff --git a/libglusterfs/src/strfd.c b/libglusterfs/src/strfd.c<br/>new file mode 100644<br/>index 00000000000..8a2580edc85<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/libglusterfs/src/strfd.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>libglusterfs/src/strfd.c</a></div><div class='hunk'>@@ -0,0 +1,93 @@</div><div class='add'>+/*</div><div class='add'>+   Copyright (c) 2014 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+   This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+   This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+   General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+   later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+   cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#include &lt;stdarg.h&gt;</div><div class='add'>+</div><div class='add'>+#include "glusterfs/mem-types.h"</div><div class='add'>+#include "glusterfs/mem-pool.h"</div><div class='add'>+#include "glusterfs/strfd.h"</div><div class='add'>+#include "glusterfs/common-utils.h"</div><div class='add'>+</div><div class='add'>+strfd_t *</div><div class='add'>+strfd_open()</div><div class='add'>+{</div><div class='add'>+    strfd_t *strfd = NULL;</div><div class='add'>+</div><div class='add'>+    strfd = GF_CALLOC(1, sizeof(*strfd), gf_common_mt_strfd_t);</div><div class='add'>+</div><div class='add'>+    return strfd;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+strvprintf(strfd_t *strfd, const char *fmt, va_list ap)</div><div class='add'>+{</div><div class='add'>+    char *str = NULL;</div><div class='add'>+    int size = 0;</div><div class='add'>+</div><div class='add'>+    size = vasprintf(&amp;str, fmt, ap);</div><div class='add'>+</div><div class='add'>+    if (size &lt; 0)</div><div class='add'>+        return size;</div><div class='add'>+</div><div class='add'>+    if (!strfd-&gt;alloc_size) {</div><div class='add'>+        strfd-&gt;data = GF_CALLOC(max(size + 1, 4096), 1,</div><div class='add'>+                                gf_common_mt_strfd_data_t);</div><div class='add'>+        if (!strfd-&gt;data) {</div><div class='add'>+            free(str); /* NOT GF_FREE */</div><div class='add'>+            return -1;</div><div class='add'>+        }</div><div class='add'>+        strfd-&gt;alloc_size = max(size + 1, 4096);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (strfd-&gt;alloc_size &lt;= (strfd-&gt;size + size)) {</div><div class='add'>+        char *tmp_ptr = NULL;</div><div class='add'>+        int new_size = max(</div><div class='add'>+            (strfd-&gt;alloc_size * 2),</div><div class='add'>+            gf_roundup_next_power_of_two(strfd-&gt;size + size + 1));</div><div class='add'>+        tmp_ptr = GF_REALLOC(strfd-&gt;data, new_size);</div><div class='add'>+        if (!tmp_ptr) {</div><div class='add'>+            free(str); /* NOT GF_FREE */</div><div class='add'>+            return -1;</div><div class='add'>+        }</div><div class='add'>+        strfd-&gt;alloc_size = new_size;</div><div class='add'>+        strfd-&gt;data = tmp_ptr;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Copy the trailing '\0', but do not account for it in -&gt;size.</div><div class='add'>+       This allows safe use of strfd-&gt;data as a string. */</div><div class='add'>+    memcpy(strfd-&gt;data + strfd-&gt;size, str, size + 1);</div><div class='add'>+    strfd-&gt;size += size;</div><div class='add'>+</div><div class='add'>+    free(str); /* NOT GF_FREE */</div><div class='add'>+</div><div class='add'>+    return size;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+strprintf(strfd_t *strfd, const char *fmt, ...)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+    va_list ap;</div><div class='add'>+</div><div class='add'>+    va_start(ap, fmt);</div><div class='add'>+    ret = strvprintf(strfd, fmt, ap);</div><div class='add'>+    va_end(ap);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+strfd_close(strfd_t *strfd)</div><div class='add'>+{</div><div class='add'>+    GF_FREE(strfd-&gt;data);</div><div class='add'>+    GF_FREE(strfd);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='head'>diff --git a/libglusterfs/src/syncop-utils.c b/libglusterfs/src/syncop-utils.c<br/>new file mode 100644<br/>index 00000000000..d9f1723856d<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/libglusterfs/src/syncop-utils.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>libglusterfs/src/syncop-utils.c</a></div><div class='hunk'>@@ -0,0 +1,669 @@</div><div class='add'>+/*</div><div class='add'>+  Copyright (c) 2015 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#include "glusterfs/syncop.h"</div><div class='add'>+#include "glusterfs/syncop-utils.h"</div><div class='add'>+#include "glusterfs/common-utils.h"</div><div class='add'>+#include "glusterfs/libglusterfs-messages.h"</div><div class='add'>+</div><div class='add'>+struct syncop_dir_scan_data {</div><div class='add'>+    xlator_t *subvol;</div><div class='add'>+    loc_t *parent;</div><div class='add'>+    void *data;</div><div class='add'>+    gf_dirent_t *q;</div><div class='add'>+    gf_dirent_t *entry;</div><div class='add'>+    pthread_cond_t *cond;</div><div class='add'>+    pthread_mutex_t *mut;</div><div class='add'>+    syncop_dir_scan_fn_t fn;</div><div class='add'>+    uint32_t *jobs_running;</div><div class='add'>+    uint32_t *qlen;</div><div class='add'>+    int32_t *retval;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+syncop_dirfd(xlator_t *subvol, loc_t *loc, fd_t **fd, int pid)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+    fd_t *dirfd = NULL;</div><div class='add'>+</div><div class='add'>+    if (!fd)</div><div class='add'>+        return -EINVAL;</div><div class='add'>+</div><div class='add'>+    dirfd = fd_create(loc-&gt;inode, pid);</div><div class='add'>+    if (!dirfd) {</div><div class='add'>+        gf_msg(subvol-&gt;name, GF_LOG_ERROR, errno, LG_MSG_FD_CREATE_FAILED,</div><div class='add'>+               "fd_create of %s", uuid_utoa(loc-&gt;gfid));</div><div class='add'>+        ret = -errno;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = syncop_opendir(subvol, loc, dirfd, NULL, NULL);</div><div class='add'>+    if (ret) {</div><div class='add'>+        /*</div><div class='add'>+         * On Linux, if the brick was not updated, opendir will</div><div class='add'>+         * fail. We therefore use backward compatible code</div><div class='add'>+         * that violate the standards by reusing offsets</div><div class='add'>+         * in seekdir() from different DIR *, but it works on Linux.</div><div class='add'>+         *</div><div class='add'>+         * On other systems it never worked, hence we do not need</div><div class='add'>+         * to provide backward-compatibility.</div><div class='add'>+         */</div><div class='add'>+#ifdef GF_LINUX_HOST_OS</div><div class='add'>+        fd_unref(dirfd);</div><div class='add'>+        dirfd = fd_anonymous(loc-&gt;inode);</div><div class='add'>+        if (!dirfd) {</div><div class='add'>+            gf_msg(subvol-&gt;name, GF_LOG_ERROR, errno,</div><div class='add'>+                   LG_MSG_FD_ANONYMOUS_FAILED,</div><div class='add'>+                   "fd_anonymous of "</div><div class='add'>+                   "%s",</div><div class='add'>+                   uuid_utoa(loc-&gt;gfid));</div><div class='add'>+            ret = -errno;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+        ret = 0;</div><div class='add'>+#else  /* GF_LINUX_HOST_OS */</div><div class='add'>+        fd_unref(dirfd);</div><div class='add'>+        gf_msg(subvol-&gt;name, GF_LOG_ERROR, errno, LG_MSG_DIR_OP_FAILED,</div><div class='add'>+               "opendir of %s", uuid_utoa(loc-&gt;gfid));</div><div class='add'>+        goto out;</div><div class='add'>+#endif /* GF_LINUX_HOST_OS */</div><div class='add'>+    } else {</div><div class='add'>+        fd_bind(dirfd);</div><div class='add'>+    }</div><div class='add'>+out:</div><div class='add'>+    if (ret == 0)</div><div class='add'>+        *fd = dirfd;</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+syncop_ftw(xlator_t *subvol, loc_t *loc, int pid, void *data,</div><div class='add'>+           int (*fn)(xlator_t *subvol, gf_dirent_t *entry, loc_t *parent,</div><div class='add'>+                     void *data))</div><div class='add'>+{</div><div class='add'>+    loc_t child_loc = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    fd_t *fd = NULL;</div><div class='add'>+    uint64_t offset = 0;</div><div class='add'>+    gf_dirent_t *entry = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    gf_dirent_t entries;</div><div class='add'>+</div><div class='add'>+    ret = syncop_dirfd(subvol, loc, &amp;fd, pid);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    INIT_LIST_HEAD(&amp;entries.list);</div><div class='add'>+</div><div class='add'>+    while ((ret = syncop_readdirp(subvol, fd, 131072, offset, &amp;entries, NULL,</div><div class='add'>+                                  NULL))) {</div><div class='add'>+        if (ret &lt; 0)</div><div class='add'>+            break;</div><div class='add'>+</div><div class='add'>+        if (ret &gt; 0) {</div><div class='add'>+            /* If the entries are only '.', and '..' then ret</div><div class='add'>+             * value will be non-zero. so set it to zero here. */</div><div class='add'>+            ret = 0;</div><div class='add'>+        }</div><div class='add'>+        list_for_each_entry(entry, &amp;entries.list, list)</div><div class='add'>+        {</div><div class='add'>+            offset = entry-&gt;d_off;</div><div class='add'>+</div><div class='add'>+            if (!strcmp(entry-&gt;d_name, ".") || !strcmp(entry-&gt;d_name, ".."))</div><div class='add'>+                continue;</div><div class='add'>+</div><div class='add'>+            gf_link_inode_from_dirent(NULL, fd-&gt;inode, entry);</div><div class='add'>+</div><div class='add'>+            ret = fn(subvol, entry, loc, data);</div><div class='add'>+            if (ret)</div><div class='add'>+                break;</div><div class='add'>+</div><div class='add'>+            if (entry-&gt;d_stat.ia_type == IA_IFDIR) {</div><div class='add'>+                child_loc.inode = inode_ref(entry-&gt;inode);</div><div class='add'>+                gf_uuid_copy(child_loc.gfid, entry-&gt;inode-&gt;gfid);</div><div class='add'>+                ret = syncop_ftw(subvol, &amp;child_loc, pid, data, fn);</div><div class='add'>+                loc_wipe(&amp;child_loc);</div><div class='add'>+                if (ret)</div><div class='add'>+                    break;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        gf_dirent_free(&amp;entries);</div><div class='add'>+        if (ret)</div><div class='add'>+            break;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (fd)</div><div class='add'>+        fd_unref(fd);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/**</div><div class='add'>+ * Syncop_ftw_throttle can be used in a configurable way to control</div><div class='add'>+ * the speed at which crawling is done. It takes 2 more arguments</div><div class='add'>+ * compared to syncop_ftw.</div><div class='add'>+ * After @count entries are finished in a directory (to be</div><div class='add'>+ * precise, @count files) sleep for @sleep_time seconds.</div><div class='add'>+ * If either @count or @sleep_time is &lt;=0, then it behaves similar to</div><div class='add'>+ * syncop_ftw.</div><div class='add'>+ */</div><div class='add'>+int</div><div class='add'>+syncop_ftw_throttle(xlator_t *subvol, loc_t *loc, int pid, void *data,</div><div class='add'>+                    int (*fn)(xlator_t *subvol, gf_dirent_t *entry,</div><div class='add'>+                              loc_t *parent, void *data),</div><div class='add'>+                    int count, int sleep_time)</div><div class='add'>+{</div><div class='add'>+    loc_t child_loc = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    fd_t *fd = NULL;</div><div class='add'>+    uint64_t offset = 0;</div><div class='add'>+    gf_dirent_t *entry = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    gf_dirent_t entries;</div><div class='add'>+    int tmp = 0;</div><div class='add'>+</div><div class='add'>+    if (sleep_time &lt;= 0) {</div><div class='add'>+        ret = syncop_ftw(subvol, loc, pid, data, fn);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = syncop_dirfd(subvol, loc, &amp;fd, pid);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    INIT_LIST_HEAD(&amp;entries.list);</div><div class='add'>+</div><div class='add'>+    while ((ret = syncop_readdirp(subvol, fd, 131072, offset, &amp;entries, NULL,</div><div class='add'>+                                  NULL))) {</div><div class='add'>+        if (ret &lt; 0)</div><div class='add'>+            break;</div><div class='add'>+</div><div class='add'>+        if (ret &gt; 0) {</div><div class='add'>+            /* If the entries are only '.', and '..' then ret</div><div class='add'>+             * value will be non-zero. so set it to zero here. */</div><div class='add'>+            ret = 0;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        tmp = 0;</div><div class='add'>+</div><div class='add'>+        list_for_each_entry(entry, &amp;entries.list, list)</div><div class='add'>+        {</div><div class='add'>+            offset = entry-&gt;d_off;</div><div class='add'>+</div><div class='add'>+            if (!strcmp(entry-&gt;d_name, ".") || !strcmp(entry-&gt;d_name, ".."))</div><div class='add'>+                continue;</div><div class='add'>+</div><div class='add'>+            if (++tmp &gt;= count) {</div><div class='add'>+                tmp = 0;</div><div class='add'>+                sleep(sleep_time);</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            gf_link_inode_from_dirent(NULL, fd-&gt;inode, entry);</div><div class='add'>+</div><div class='add'>+            ret = fn(subvol, entry, loc, data);</div><div class='add'>+            if (ret)</div><div class='add'>+                continue;</div><div class='add'>+</div><div class='add'>+            if (entry-&gt;d_stat.ia_type == IA_IFDIR) {</div><div class='add'>+                child_loc.inode = inode_ref(entry-&gt;inode);</div><div class='add'>+                gf_uuid_copy(child_loc.gfid, entry-&gt;inode-&gt;gfid);</div><div class='add'>+                ret = syncop_ftw_throttle(subvol, &amp;child_loc, pid, data, fn,</div><div class='add'>+                                          count, sleep_time);</div><div class='add'>+                loc_wipe(&amp;child_loc);</div><div class='add'>+                if (ret)</div><div class='add'>+                    continue;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        gf_dirent_free(&amp;entries);</div><div class='add'>+        if (ret)</div><div class='add'>+            break;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (fd)</div><div class='add'>+        fd_unref(fd);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+_scan_data_destroy(struct syncop_dir_scan_data *data)</div><div class='add'>+{</div><div class='add'>+    GF_FREE(data);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+_dir_scan_job_fn_cbk(int ret, call_frame_t *frame, void *opaque)</div><div class='add'>+{</div><div class='add'>+    struct syncop_dir_scan_data *scan_data = opaque;</div><div class='add'>+</div><div class='add'>+    _scan_data_destroy(scan_data);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+_dir_scan_job_fn(void *data)</div><div class='add'>+{</div><div class='add'>+    struct syncop_dir_scan_data *scan_data = data;</div><div class='add'>+    gf_dirent_t *entry = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    entry = scan_data-&gt;entry;</div><div class='add'>+    scan_data-&gt;entry = NULL;</div><div class='add'>+    do {</div><div class='add'>+        ret = scan_data-&gt;fn(scan_data-&gt;subvol, entry, scan_data-&gt;parent,</div><div class='add'>+                            scan_data-&gt;data);</div><div class='add'>+        gf_dirent_entry_free(entry);</div><div class='add'>+        entry = NULL;</div><div class='add'>+        pthread_mutex_lock(scan_data-&gt;mut);</div><div class='add'>+        {</div><div class='add'>+            if (ret)</div><div class='add'>+                *scan_data-&gt;retval |= ret;</div><div class='add'>+            if (list_empty(&amp;scan_data-&gt;q-&gt;list)) {</div><div class='add'>+                (*scan_data-&gt;jobs_running)--;</div><div class='add'>+                pthread_cond_broadcast(scan_data-&gt;cond);</div><div class='add'>+            } else {</div><div class='add'>+                entry = list_first_entry(&amp;scan_data-&gt;q-&gt;list,</div><div class='add'>+                                         typeof(*scan_data-&gt;q), list);</div><div class='add'>+                list_del_init(&amp;entry-&gt;list);</div><div class='add'>+                (*scan_data-&gt;qlen)--;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+        pthread_mutex_unlock(scan_data-&gt;mut);</div><div class='add'>+    } while (entry);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+_run_dir_scan_task(call_frame_t *frame, xlator_t *subvol, loc_t *parent,</div><div class='add'>+                   gf_dirent_t *q, gf_dirent_t *entry, int *retval,</div><div class='add'>+                   pthread_mutex_t *mut, pthread_cond_t *cond,</div><div class='add'>+                   uint32_t *jobs_running, uint32_t *qlen,</div><div class='add'>+                   syncop_dir_scan_fn_t fn, void *data)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+    struct syncop_dir_scan_data *scan_data = NULL;</div><div class='add'>+</div><div class='add'>+    scan_data = GF_CALLOC(1, sizeof(struct syncop_dir_scan_data),</div><div class='add'>+                          gf_common_mt_scan_data);</div><div class='add'>+    if (!scan_data) {</div><div class='add'>+        ret = -ENOMEM;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    scan_data-&gt;subvol = subvol;</div><div class='add'>+    scan_data-&gt;parent = parent;</div><div class='add'>+    scan_data-&gt;data = data;</div><div class='add'>+    scan_data-&gt;mut = mut;</div><div class='add'>+    scan_data-&gt;cond = cond;</div><div class='add'>+    scan_data-&gt;fn = fn;</div><div class='add'>+    scan_data-&gt;jobs_running = jobs_running;</div><div class='add'>+    scan_data-&gt;entry = entry;</div><div class='add'>+    scan_data-&gt;q = q;</div><div class='add'>+    scan_data-&gt;qlen = qlen;</div><div class='add'>+    scan_data-&gt;retval = retval;</div><div class='add'>+</div><div class='add'>+    ret = synctask_new(subvol-&gt;ctx-&gt;env, _dir_scan_job_fn, _dir_scan_job_fn_cbk,</div><div class='add'>+                       frame, scan_data);</div><div class='add'>+out:</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        gf_dirent_entry_free(entry);</div><div class='add'>+        _scan_data_destroy(scan_data);</div><div class='add'>+        pthread_mutex_lock(mut);</div><div class='add'>+        {</div><div class='add'>+            *jobs_running = *jobs_running - 1;</div><div class='add'>+        }</div><div class='add'>+        pthread_mutex_unlock(mut);</div><div class='add'>+        /*No need to cond-broadcast*/</div><div class='add'>+    }</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+syncop_mt_dir_scan(call_frame_t *frame, xlator_t *subvol, loc_t *loc, int pid,</div><div class='add'>+                   void *data, syncop_dir_scan_fn_t fn, dict_t *xdata,</div><div class='add'>+                   uint32_t max_jobs, uint32_t max_qlen)</div><div class='add'>+{</div><div class='add'>+    fd_t *fd = NULL;</div><div class='add'>+    uint64_t offset = 0;</div><div class='add'>+    gf_dirent_t *last = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    int retval = 0;</div><div class='add'>+    gf_dirent_t q;</div><div class='add'>+    gf_dirent_t *entry = NULL;</div><div class='add'>+    gf_dirent_t *tmp = NULL;</div><div class='add'>+    uint32_t jobs_running = 0;</div><div class='add'>+    uint32_t qlen = 0;</div><div class='add'>+    pthread_cond_t cond = PTHREAD_COND_INITIALIZER;</div><div class='add'>+    pthread_mutex_t mut = PTHREAD_MUTEX_INITIALIZER;</div><div class='add'>+    gf_dirent_t entries;</div><div class='add'>+    xlator_t *this = NULL;</div><div class='add'>+</div><div class='add'>+    if (frame) {</div><div class='add'>+        this = frame-&gt;this;</div><div class='add'>+    } else {</div><div class='add'>+        this = THIS;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /*For this functionality to be implemented in general, we need</div><div class='add'>+     * synccond_t infra which doesn't block the executing thread. Until then</div><div class='add'>+     * return failures inside synctask if they use this.*/</div><div class='add'>+    if (synctask_get())</div><div class='add'>+        return -ENOTSUP;</div><div class='add'>+</div><div class='add'>+    if (max_jobs == 0)</div><div class='add'>+        return -EINVAL;</div><div class='add'>+</div><div class='add'>+    /*Code becomes simpler this way. cond_wait just on qlength.</div><div class='add'>+     * Little bit of cheating*/</div><div class='add'>+    if (max_qlen == 0)</div><div class='add'>+        max_qlen = 1;</div><div class='add'>+</div><div class='add'>+    ret = syncop_dirfd(subvol, loc, &amp;fd, pid);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    INIT_LIST_HEAD(&amp;entries.list);</div><div class='add'>+    INIT_LIST_HEAD(&amp;q.list);</div><div class='add'>+</div><div class='add'>+    while ((ret = syncop_readdir(subvol, fd, 131072, offset, &amp;entries, xdata,</div><div class='add'>+                                 NULL))) {</div><div class='add'>+        if (ret &lt; 0)</div><div class='add'>+            break;</div><div class='add'>+</div><div class='add'>+        if (ret &gt; 0) {</div><div class='add'>+            /* If the entries are only '.', and '..' then ret</div><div class='add'>+             * value will be non-zero. so set it to zero here. */</div><div class='add'>+            ret = 0;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        last = list_last_entry(&amp;entries.list, typeof(*last), list);</div><div class='add'>+        offset = last-&gt;d_off;</div><div class='add'>+</div><div class='add'>+        list_for_each_entry_safe(entry, tmp, &amp;entries.list, list)</div><div class='add'>+        {</div><div class='add'>+            if (this &amp;&amp; this-&gt;cleanup_starting)</div><div class='add'>+                goto out;</div><div class='add'>+</div><div class='add'>+            list_del_init(&amp;entry-&gt;list);</div><div class='add'>+            if (!strcmp(entry-&gt;d_name, ".") || !strcmp(entry-&gt;d_name, "..")) {</div><div class='add'>+                gf_dirent_entry_free(entry);</div><div class='add'>+                continue;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            if (entry-&gt;d_stat.ia_type == IA_IFDIR) {</div><div class='add'>+                ret = fn(subvol, entry, loc, data);</div><div class='add'>+                gf_dirent_entry_free(entry);</div><div class='add'>+                if (ret)</div><div class='add'>+                    goto out;</div><div class='add'>+                continue;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            if (retval) /*Any jobs failed?*/</div><div class='add'>+                goto out;</div><div class='add'>+</div><div class='add'>+            pthread_mutex_lock(&amp;mut);</div><div class='add'>+            {</div><div class='add'>+                while (qlen == max_qlen)</div><div class='add'>+                    pthread_cond_wait(&amp;cond, &amp;mut);</div><div class='add'>+                if (max_jobs == jobs_running) {</div><div class='add'>+                    list_add_tail(&amp;entry-&gt;list, &amp;q.list);</div><div class='add'>+                    qlen++;</div><div class='add'>+                    entry = NULL;</div><div class='add'>+                } else {</div><div class='add'>+                    jobs_running++;</div><div class='add'>+                }</div><div class='add'>+            }</div><div class='add'>+            pthread_mutex_unlock(&amp;mut);</div><div class='add'>+</div><div class='add'>+            if (!entry)</div><div class='add'>+                continue;</div><div class='add'>+</div><div class='add'>+            ret = _run_dir_scan_task(frame, subvol, loc, &amp;q, entry, &amp;retval,</div><div class='add'>+                                     &amp;mut, &amp;cond, &amp;jobs_running, &amp;qlen, fn,</div><div class='add'>+                                     data);</div><div class='add'>+            if (ret)</div><div class='add'>+                goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (fd)</div><div class='add'>+        fd_unref(fd);</div><div class='add'>+</div><div class='add'>+    pthread_mutex_lock(&amp;mut);</div><div class='add'>+    {</div><div class='add'>+        while (jobs_running)</div><div class='add'>+            pthread_cond_wait(&amp;cond, &amp;mut);</div><div class='add'>+    }</div><div class='add'>+    pthread_mutex_unlock(&amp;mut);</div><div class='add'>+</div><div class='add'>+    gf_dirent_free(&amp;q);</div><div class='add'>+    gf_dirent_free(&amp;entries);</div><div class='add'>+</div><div class='add'>+    return ret | retval;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+syncop_dir_scan(xlator_t *subvol, loc_t *loc, int pid, void *data,</div><div class='add'>+                int (*fn)(xlator_t *subvol, gf_dirent_t *entry, loc_t *parent,</div><div class='add'>+                          void *data))</div><div class='add'>+{</div><div class='add'>+    fd_t *fd = NULL;</div><div class='add'>+    uint64_t offset = 0;</div><div class='add'>+    gf_dirent_t *entry = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    gf_dirent_t entries;</div><div class='add'>+</div><div class='add'>+    ret = syncop_dirfd(subvol, loc, &amp;fd, pid);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    INIT_LIST_HEAD(&amp;entries.list);</div><div class='add'>+</div><div class='add'>+    while ((ret = syncop_readdir(subvol, fd, 131072, offset, &amp;entries, NULL,</div><div class='add'>+                                 NULL))) {</div><div class='add'>+        if (ret &lt; 0)</div><div class='add'>+            break;</div><div class='add'>+</div><div class='add'>+        if (ret &gt; 0) {</div><div class='add'>+            /* If the entries are only '.', and '..' then ret</div><div class='add'>+             * value will be non-zero. so set it to zero here. */</div><div class='add'>+            ret = 0;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        list_for_each_entry(entry, &amp;entries.list, list)</div><div class='add'>+        {</div><div class='add'>+            offset = entry-&gt;d_off;</div><div class='add'>+</div><div class='add'>+            if (!strcmp(entry-&gt;d_name, ".") || !strcmp(entry-&gt;d_name, ".."))</div><div class='add'>+                continue;</div><div class='add'>+</div><div class='add'>+            ret = fn(subvol, entry, loc, data);</div><div class='add'>+            if (ret)</div><div class='add'>+                break;</div><div class='add'>+        }</div><div class='add'>+        gf_dirent_free(&amp;entries);</div><div class='add'>+        if (ret)</div><div class='add'>+            break;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (fd)</div><div class='add'>+        fd_unref(fd);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+syncop_is_subvol_local(xlator_t *this, loc_t *loc, gf_boolean_t *is_local)</div><div class='add'>+{</div><div class='add'>+    char *pathinfo = NULL;</div><div class='add'>+    dict_t *xattr = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    if (!this || !this-&gt;type || !is_local)</div><div class='add'>+        return -EINVAL;</div><div class='add'>+</div><div class='add'>+    if (strcmp(this-&gt;type, "protocol/client") != 0)</div><div class='add'>+        return -EINVAL;</div><div class='add'>+</div><div class='add'>+    *is_local = _gf_false;</div><div class='add'>+</div><div class='add'>+    ret = syncop_getxattr(this, loc, &amp;xattr, GF_XATTR_PATHINFO_KEY, NULL, NULL);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (!xattr) {</div><div class='add'>+        ret = -EINVAL;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_get_str(xattr, GF_XATTR_PATHINFO_KEY, &amp;pathinfo);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    ret = glusterfs_is_local_pathinfo(pathinfo, is_local);</div><div class='add'>+</div><div class='add'>+    gf_msg_debug(this-&gt;name, 0, "subvol %s is %slocal", this-&gt;name,</div><div class='add'>+                 *is_local ? "" : "not ");</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (xattr)</div><div class='add'>+        dict_unref(xattr);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/**</div><div class='add'>+ * For hard resove, it it telling posix to make use of the</div><div class='add'>+ * gfid2path extended attribute stored on disk. Otherwise</div><div class='add'>+ * posix xlator (with GFID_TO_PATH_KEY as the key) will just</div><div class='add'>+ * do a in memory inode_path to get the path. Depending upon</div><div class='add'>+ * the consumer of this function, they can choose how they want</div><div class='add'>+ * to proceed. If doing a xattr operation sounds costly, then</div><div class='add'>+ * use GFID_TO_PATH_KEY as the key for getxattr.</div><div class='add'>+ **/</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+syncop_gfid_to_path_hard(inode_table_t *itable, xlator_t *subvol, uuid_t gfid,</div><div class='add'>+                         inode_t *inode, char **path_p,</div><div class='add'>+                         gf_boolean_t hard_resolve)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+    char *path = NULL;</div><div class='add'>+    loc_t loc = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    dict_t *xattr = NULL;</div><div class='add'>+</div><div class='add'>+    gf_uuid_copy(loc.gfid, gfid);</div><div class='add'>+</div><div class='add'>+    if (!inode)</div><div class='add'>+        loc.inode = inode_new(itable);</div><div class='add'>+    else</div><div class='add'>+        loc.inode = inode_ref(inode);</div><div class='add'>+</div><div class='add'>+    if (!hard_resolve)</div><div class='add'>+        ret = syncop_getxattr(subvol, &amp;loc, &amp;xattr, GFID_TO_PATH_KEY, NULL,</div><div class='add'>+                              NULL);</div><div class='add'>+    else</div><div class='add'>+        ret = syncop_getxattr(subvol, &amp;loc, &amp;xattr, GFID2PATH_VIRT_XATTR_KEY,</div><div class='add'>+                              NULL, NULL);</div><div class='add'>+</div><div class='add'>+    if (ret &lt; 0)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    /*</div><div class='add'>+     * posix will do dict_set_dynstr for GFID_TO_PATH_KEY i.e.</div><div class='add'>+     * for in memory search for the path. And for on disk xattr</div><div class='add'>+     * fetching of the path for the key GFID2PATH_VIRT_XATTR_KEY</div><div class='add'>+     * it uses dict_set_dynptr. So, for GFID2PATH_VIRT_XATTR_KEY</div><div class='add'>+     * use dict_get_ptr to avoid dict complaining about type</div><div class='add'>+     * mismatch (i.e. str vs ptr)</div><div class='add'>+     */</div><div class='add'>+    if (!hard_resolve)</div><div class='add'>+        ret = dict_get_str(xattr, GFID_TO_PATH_KEY, &amp;path);</div><div class='add'>+    else</div><div class='add'>+        ret = dict_get_ptr(xattr, GFID2PATH_VIRT_XATTR_KEY, (void **)&amp;path);</div><div class='add'>+</div><div class='add'>+    if (ret || !path) {</div><div class='add'>+        ret = -EINVAL;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (path_p) {</div><div class='add'>+        *path_p = gf_strdup(path);</div><div class='add'>+        if (!*path_p) {</div><div class='add'>+            ret = -ENOMEM;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (xattr)</div><div class='add'>+        dict_unref(xattr);</div><div class='add'>+    loc_wipe(&amp;loc);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+syncop_gfid_to_path(inode_table_t *itable, xlator_t *subvol, uuid_t gfid,</div><div class='add'>+                    char **path_p)</div><div class='add'>+{</div><div class='add'>+    return syncop_gfid_to_path_hard(itable, subvol, gfid, NULL, path_p,</div><div class='add'>+                                    _gf_false);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+syncop_inode_find(xlator_t *this, xlator_t *subvol, uuid_t gfid,</div><div class='add'>+                  inode_t **inode, dict_t *xdata, dict_t **rsp_dict)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+    loc_t loc = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    struct iatt iatt = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    *inode = NULL;</div><div class='add'>+</div><div class='add'>+    *inode = inode_find(this-&gt;itable, gfid);</div><div class='add'>+    if (*inode)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    loc.inode = inode_new(this-&gt;itable);</div><div class='add'>+    if (!loc.inode) {</div><div class='add'>+        ret = -ENOMEM;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    gf_uuid_copy(loc.gfid, gfid);</div><div class='add'>+</div><div class='add'>+    ret = syncop_lookup(subvol, &amp;loc, &amp;iatt, NULL, xdata, rsp_dict);</div><div class='add'>+    if (ret &lt; 0)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    *inode = inode_link(loc.inode, NULL, NULL, &amp;iatt);</div><div class='add'>+    if (!*inode) {</div><div class='add'>+        ret = -ENOMEM;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+out:</div><div class='add'>+    loc_wipe(&amp;loc);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='head'>diff --git a/libglusterfs/src/syncop.c b/libglusterfs/src/syncop.c<br/>index cfece659171..df20cec559f 100644<br/>--- a/<a href='/cgit/glusterfs.git/tree/libglusterfs/src/syncop.c?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/syncop.c</a><br/>+++ b/<a href='/cgit/glusterfs.git/tree/libglusterfs/src/syncop.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>libglusterfs/src/syncop.c</a></div><div class='hunk'>@@ -1,540 +1,3572 @@</div><div class='ctx'> /*</div><div class='del'>-   Copyright (c) 2010 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='del'>-   This file is part of GlusterFS.</div><div class='del'>-</div><div class='del'>-   GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-   it under the terms of the GNU General Public License as published</div><div class='del'>-   by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-   or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-   GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-   WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-   General Public License for more details.</div><div class='del'>-</div><div class='del'>-   You should have received a copy of the GNU General Public License</div><div class='del'>-   along with this program.  If not, see</div><div class='del'>-   &lt;http://www.gnu.org/licenses/&gt;.</div><div class='add'>+  Copyright (c) 2008-2013 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='ctx'> */</div><div class='ctx'> </div><div class='del'>-#ifndef _CONFIG_H</div><div class='del'>-#define _CONFIG_H</div><div class='del'>-#include "config.h"</div><div class='add'>+#include "glusterfs/syncop.h"</div><div class='add'>+#include "glusterfs/libglusterfs-messages.h"</div><div class='add'>+</div><div class='add'>+#ifdef HAVE_TSAN_API</div><div class='add'>+#include &lt;sanitizer/tsan_interface.h&gt;</div><div class='ctx'> #endif</div><div class='ctx'> </div><div class='del'>-#include "syncop.h"</div><div class='add'>+int</div><div class='add'>+syncopctx_setfsuid(void *uid)</div><div class='add'>+{</div><div class='add'>+    struct syncopctx *opctx = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    /* In args check */</div><div class='add'>+    if (!uid) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        errno = EINVAL;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    opctx = syncopctx_getctx();</div><div class='ctx'> </div><div class='del'>-call_frame_t *</div><div class='del'>-syncop_create_frame ()</div><div class='add'>+    opctx-&gt;uid = *(uid_t *)uid;</div><div class='add'>+    opctx-&gt;valid |= SYNCOPCTX_UID;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+syncopctx_setfsgid(void *gid)</div><div class='ctx'> {</div><div class='del'>-        struct synctask *task = NULL;</div><div class='del'>-        struct call_frame_t *frame = NULL;</div><div class='add'>+    struct syncopctx *opctx = NULL;</div><div class='add'>+    int ret = 0;</div><div class='ctx'> </div><div class='del'>-        task = synctask_get ();</div><div class='add'>+    /* In args check */</div><div class='add'>+    if (!gid) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        errno = EINVAL;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        if (task) {</div><div class='del'>-                frame = task-&gt;opaque;</div><div class='add'>+    opctx = syncopctx_getctx();</div><div class='add'>+</div><div class='add'>+    opctx-&gt;gid = *(gid_t *)gid;</div><div class='add'>+    opctx-&gt;valid |= SYNCOPCTX_GID;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+syncopctx_setfsgroups(int count, const void *groups)</div><div class='add'>+{</div><div class='add'>+    struct syncopctx *opctx = NULL;</div><div class='add'>+    gid_t *tmpgroups = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    /* In args check */</div><div class='add'>+    if (count != 0 &amp;&amp; !groups) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        errno = EINVAL;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    opctx = syncopctx_getctx();</div><div class='add'>+</div><div class='add'>+    /* resize internal groups as required */</div><div class='add'>+    if (count &amp;&amp; opctx-&gt;grpsize &lt; count) {</div><div class='add'>+        if (opctx-&gt;groups) {</div><div class='add'>+            /* Group list will be updated later, so no need to keep current</div><div class='add'>+             * data and waste time copying it. It's better to free the current</div><div class='add'>+             * allocation and then allocate a fresh new memory block. */</div><div class='add'>+            GF_FREE(opctx-&gt;groups);</div><div class='add'>+            opctx-&gt;groups = NULL;</div><div class='add'>+            opctx-&gt;grpsize = 0;</div><div class='ctx'>         }</div><div class='add'>+        tmpgroups = GF_MALLOC(count * sizeof(gid_t), gf_common_mt_syncopctx);</div><div class='add'>+        if (tmpgroups == NULL) {</div><div class='add'>+            ret = -1;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        opctx-&gt;groups = tmpgroups;</div><div class='add'>+        opctx-&gt;grpsize = count;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* copy out the groups passed */</div><div class='add'>+    if (count)</div><div class='add'>+        memcpy(opctx-&gt;groups, groups, (sizeof(gid_t) * count));</div><div class='add'>+</div><div class='add'>+    /* set/reset the ngrps, this is where reset of groups is handled */</div><div class='add'>+    opctx-&gt;ngrps = count;</div><div class='add'>+</div><div class='add'>+    if ((opctx-&gt;valid &amp; SYNCOPCTX_GROUPS) == 0) {</div><div class='add'>+        /* This is the first time we are storing groups into the TLS structure</div><div class='add'>+         * so we mark the current thread so that it will be properly cleaned</div><div class='add'>+         * up when the thread terminates. */</div><div class='add'>+        gf_thread_needs_cleanup();</div><div class='add'>+    }</div><div class='add'>+    opctx-&gt;valid |= SYNCOPCTX_GROUPS;</div><div class='ctx'> </div><div class='del'>-        return (call_frame_t *)frame;</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-void</div><div class='del'>-synctask_yield (struct synctask *task)</div><div class='add'>+int</div><div class='add'>+syncopctx_setfspid(void *pid)</div><div class='add'>+{</div><div class='add'>+    struct syncopctx *opctx = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    /* In args check */</div><div class='add'>+    if (!pid) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        errno = EINVAL;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    opctx = syncopctx_getctx();</div><div class='add'>+</div><div class='add'>+    opctx-&gt;pid = *(pid_t *)pid;</div><div class='add'>+    opctx-&gt;valid |= SYNCOPCTX_PID;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+syncopctx_setfslkowner(gf_lkowner_t *lk_owner)</div><div class='ctx'> {</div><div class='del'>-        struct syncenv   *env = NULL;</div><div class='add'>+    struct syncopctx *opctx = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    /* In args check */</div><div class='add'>+    if (!lk_owner) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        errno = EINVAL;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        env = task-&gt;env;</div><div class='add'>+    opctx = syncopctx_getctx();</div><div class='ctx'> </div><div class='del'>-        if (swapcontext (&amp;task-&gt;ctx, &amp;env-&gt;sched) &lt; 0) {</div><div class='del'>-                gf_log ("syncop", GF_LOG_ERROR,</div><div class='del'>-                        "swapcontext failed (%s)", strerror (errno));</div><div class='add'>+    opctx-&gt;lk_owner = *lk_owner;</div><div class='add'>+    opctx-&gt;valid |= SYNCOPCTX_LKOWNER;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void *</div><div class='add'>+syncenv_processor(void *thdata);</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+__run(struct synctask *task)</div><div class='add'>+{</div><div class='add'>+    struct syncenv *env = NULL;</div><div class='add'>+    int32_t total, ret, i;</div><div class='add'>+</div><div class='add'>+    env = task-&gt;env;</div><div class='add'>+</div><div class='add'>+    list_del_init(&amp;task-&gt;all_tasks);</div><div class='add'>+    switch (task-&gt;state) {</div><div class='add'>+        case SYNCTASK_INIT:</div><div class='add'>+        case SYNCTASK_SUSPEND:</div><div class='add'>+            break;</div><div class='add'>+        case SYNCTASK_RUN:</div><div class='add'>+            gf_msg_debug(task-&gt;xl-&gt;name, 0,</div><div class='add'>+                         "re-running already running"</div><div class='add'>+                         " task");</div><div class='add'>+            env-&gt;runcount--;</div><div class='add'>+            break;</div><div class='add'>+        case SYNCTASK_WAIT:</div><div class='add'>+            break;</div><div class='add'>+        case SYNCTASK_DONE:</div><div class='add'>+            gf_msg(task-&gt;xl-&gt;name, GF_LOG_WARNING, 0, LG_MSG_COMPLETED_TASK,</div><div class='add'>+                   "running completed task");</div><div class='add'>+            return;</div><div class='add'>+        case SYNCTASK_ZOMBIE:</div><div class='add'>+            gf_msg(task-&gt;xl-&gt;name, GF_LOG_WARNING, 0, LG_MSG_WAKE_UP_ZOMBIE,</div><div class='add'>+                   "attempted to wake up "</div><div class='add'>+                   "zombie!!");</div><div class='add'>+            return;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    list_add_tail(&amp;task-&gt;all_tasks, &amp;env-&gt;runq);</div><div class='add'>+    task-&gt;state = SYNCTASK_RUN;</div><div class='add'>+</div><div class='add'>+    env-&gt;runcount++;</div><div class='add'>+</div><div class='add'>+    total = env-&gt;procs + env-&gt;runcount - env-&gt;procs_idle;</div><div class='add'>+    if (total &gt; env-&gt;procmax) {</div><div class='add'>+        total = env-&gt;procmax;</div><div class='add'>+    }</div><div class='add'>+    if (total &gt; env-&gt;procs) {</div><div class='add'>+        for (i = 0; i &lt; env-&gt;procmax; i++) {</div><div class='add'>+            if (env-&gt;proc[i].env == NULL) {</div><div class='add'>+                env-&gt;proc[i].env = env;</div><div class='add'>+                ret = gf_thread_create(&amp;env-&gt;proc[i].processor, NULL,</div><div class='add'>+                                       syncenv_processor, &amp;env-&gt;proc[i],</div><div class='add'>+                                       "sproc%d", i);</div><div class='add'>+                if ((ret &lt; 0) || (++env-&gt;procs &gt;= total)) {</div><div class='add'>+                    break;</div><div class='add'>+                }</div><div class='add'>+            }</div><div class='ctx'>         }</div><div class='add'>+    }</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+static void</div><div class='add'>+__wait(struct synctask *task)</div><div class='add'>+{</div><div class='add'>+    struct syncenv *env = NULL;</div><div class='add'>+</div><div class='add'>+    env = task-&gt;env;</div><div class='add'>+</div><div class='add'>+    list_del_init(&amp;task-&gt;all_tasks);</div><div class='add'>+    switch (task-&gt;state) {</div><div class='add'>+        case SYNCTASK_INIT:</div><div class='add'>+        case SYNCTASK_SUSPEND:</div><div class='add'>+            break;</div><div class='add'>+        case SYNCTASK_RUN:</div><div class='add'>+            env-&gt;runcount--;</div><div class='add'>+            break;</div><div class='add'>+        case SYNCTASK_WAIT:</div><div class='add'>+            gf_msg(task-&gt;xl-&gt;name, GF_LOG_WARNING, 0, LG_MSG_REWAITING_TASK,</div><div class='add'>+                   "re-waiting already waiting "</div><div class='add'>+                   "task");</div><div class='add'>+            break;</div><div class='add'>+        case SYNCTASK_DONE:</div><div class='add'>+            gf_msg(task-&gt;xl-&gt;name, GF_LOG_WARNING, 0, LG_MSG_COMPLETED_TASK,</div><div class='add'>+                   "running completed task");</div><div class='add'>+            return;</div><div class='add'>+        case SYNCTASK_ZOMBIE:</div><div class='add'>+            gf_msg(task-&gt;xl-&gt;name, GF_LOG_WARNING, 0, LG_MSG_SLEEP_ZOMBIE,</div><div class='add'>+                   "attempted to sleep a zombie!!");</div><div class='add'>+            return;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    list_add_tail(&amp;task-&gt;all_tasks, &amp;env-&gt;waitq);</div><div class='add'>+    task-&gt;state = SYNCTASK_WAIT;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> void</div><div class='del'>-synctask_yawn (struct synctask *task)</div><div class='add'>+synctask_yield(struct synctask *task, struct timespec *delta)</div><div class='ctx'> {</div><div class='del'>-        struct syncenv  *env = NULL;</div><div class='add'>+    xlator_t *oldTHIS = THIS;</div><div class='ctx'> </div><div class='del'>-        env  = task-&gt;env;</div><div class='add'>+#if defined(__NetBSD__) &amp;&amp; defined(_UC_TLSBASE)</div><div class='add'>+    /* Preserve pthread private pointer through swapcontex() */</div><div class='add'>+    task-&gt;proc-&gt;sched.uc_flags &amp;= ~_UC_TLSBASE;</div><div class='add'>+#endif</div><div class='ctx'> </div><div class='del'>-        pthread_mutex_lock (&amp;env-&gt;mutex);</div><div class='del'>-        {</div><div class='del'>-                list_del_init (&amp;task-&gt;all_tasks);</div><div class='del'>-                list_add (&amp;task-&gt;all_tasks, &amp;env-&gt;waitq);</div><div class='del'>-        }</div><div class='del'>-        pthread_mutex_unlock (&amp;env-&gt;mutex);</div><div class='del'>-}</div><div class='add'>+    task-&gt;delta = delta;</div><div class='ctx'> </div><div class='add'>+    if (task-&gt;state != SYNCTASK_DONE) {</div><div class='add'>+        task-&gt;state = SYNCTASK_SUSPEND;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+#ifdef HAVE_TSAN_API</div><div class='add'>+    __tsan_switch_to_fiber(task-&gt;proc-&gt;tsan.fiber, 0);</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+    if (swapcontext(&amp;task-&gt;ctx, &amp;task-&gt;proc-&gt;sched) &lt; 0) {</div><div class='add'>+        gf_msg("syncop", GF_LOG_ERROR, errno, LG_MSG_SWAPCONTEXT_FAILED,</div><div class='add'>+               "swapcontext failed");</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    THIS = oldTHIS;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> void</div><div class='del'>-synctask_zzzz (struct synctask *task)</div><div class='add'>+synctask_sleep(int32_t secs)</div><div class='ctx'> {</div><div class='del'>-        synctask_yawn (task);</div><div class='add'>+    struct timespec delta;</div><div class='add'>+    struct synctask *task;</div><div class='ctx'> </div><div class='del'>-        synctask_yield (task);</div><div class='add'>+    task = synctask_get();</div><div class='add'>+</div><div class='add'>+    if (task == NULL) {</div><div class='add'>+        sleep(secs);</div><div class='add'>+    } else {</div><div class='add'>+        delta.tv_sec = secs;</div><div class='add'>+        delta.tv_nsec = 0;</div><div class='add'>+</div><div class='add'>+        synctask_yield(task, &amp;delta);</div><div class='add'>+    }</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+static void</div><div class='add'>+__synctask_wake(struct synctask *task)</div><div class='add'>+{</div><div class='add'>+    task-&gt;woken = 1;</div><div class='add'>+</div><div class='add'>+    if (task-&gt;slept)</div><div class='add'>+        __run(task);</div><div class='add'>+</div><div class='add'>+    pthread_cond_broadcast(&amp;task-&gt;env-&gt;cond);</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> void</div><div class='del'>-synctask_wake (struct synctask *task)</div><div class='add'>+synctask_wake(struct synctask *task)</div><div class='ctx'> {</div><div class='del'>-        struct syncenv *env = NULL;</div><div class='add'>+    struct syncenv *env = NULL;</div><div class='ctx'> </div><div class='del'>-        env = task-&gt;env;</div><div class='add'>+    env = task-&gt;env;</div><div class='ctx'> </div><div class='del'>-        pthread_mutex_lock (&amp;env-&gt;mutex);</div><div class='del'>-        {</div><div class='del'>-                list_del_init (&amp;task-&gt;all_tasks);</div><div class='del'>-                list_add_tail (&amp;task-&gt;all_tasks, &amp;env-&gt;runq);</div><div class='add'>+    pthread_mutex_lock(&amp;env-&gt;mutex);</div><div class='add'>+    {</div><div class='add'>+        if (task-&gt;timer != NULL) {</div><div class='add'>+            if (gf_timer_call_cancel(task-&gt;xl-&gt;ctx, task-&gt;timer) != 0) {</div><div class='add'>+                goto unlock;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            task-&gt;timer = NULL;</div><div class='add'>+            task-&gt;synccond = NULL;</div><div class='ctx'>         }</div><div class='del'>-        pthread_mutex_unlock (&amp;env-&gt;mutex);</div><div class='ctx'> </div><div class='del'>-        pthread_cond_broadcast (&amp;env-&gt;cond);</div><div class='add'>+        __synctask_wake(task);</div><div class='add'>+    }</div><div class='add'>+unlock:</div><div class='add'>+    pthread_mutex_unlock(&amp;env-&gt;mutex);</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> void</div><div class='del'>-synctask_wrap (struct synctask *task)</div><div class='add'>+synctask_wrap(void)</div><div class='ctx'> {</div><div class='del'>-        int              ret;</div><div class='add'>+    struct synctask *task = NULL;</div><div class='ctx'> </div><div class='del'>-        ret = task-&gt;syncfn (task-&gt;opaque);</div><div class='del'>-        task-&gt;synccbk (ret, task-&gt;opaque);</div><div class='add'>+    /* Do not trust the pointer received. It may be</div><div class='add'>+       wrong and can lead to crashes. */</div><div class='ctx'> </div><div class='del'>-        /* cannot destroy @task right here as we are</div><div class='del'>-           in the execution stack of @task itself</div><div class='del'>-        */</div><div class='del'>-        task-&gt;complete = 1;</div><div class='del'>-        synctask_wake (task);</div><div class='add'>+    task = synctask_get();</div><div class='add'>+    task-&gt;ret = task-&gt;syncfn(task-&gt;opaque);</div><div class='add'>+    if (task-&gt;synccbk)</div><div class='add'>+        task-&gt;synccbk(task-&gt;ret, task-&gt;frame, task-&gt;opaque);</div><div class='ctx'> </div><div class='del'>-        synctask_yield (task);</div><div class='del'>-}</div><div class='add'>+    task-&gt;state = SYNCTASK_DONE;</div><div class='ctx'> </div><div class='add'>+    synctask_yield(task, NULL);</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> void</div><div class='del'>-synctask_destroy (struct synctask *task)</div><div class='add'>+synctask_destroy(struct synctask *task)</div><div class='ctx'> {</div><div class='del'>-        if (!task)</div><div class='del'>-                return;</div><div class='add'>+    if (!task)</div><div class='add'>+        return;</div><div class='ctx'> </div><div class='del'>-        if (task-&gt;stack)</div><div class='del'>-                FREE (task-&gt;stack);</div><div class='del'>-        FREE (task);</div><div class='add'>+    GF_FREE(task-&gt;stack);</div><div class='add'>+</div><div class='add'>+    if (task-&gt;opframe)</div><div class='add'>+        STACK_DESTROY(task-&gt;opframe-&gt;root);</div><div class='add'>+</div><div class='add'>+    if (task-&gt;synccbk == NULL) {</div><div class='add'>+        pthread_mutex_destroy(&amp;task-&gt;mutex);</div><div class='add'>+        pthread_cond_destroy(&amp;task-&gt;cond);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+#ifdef HAVE_TSAN_API</div><div class='add'>+    __tsan_destroy_fiber(task-&gt;tsan.fiber);</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+    GF_FREE(task);</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+void</div><div class='add'>+synctask_done(struct synctask *task)</div><div class='add'>+{</div><div class='add'>+    if (task-&gt;synccbk) {</div><div class='add'>+        synctask_destroy(task);</div><div class='add'>+        return;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    pthread_mutex_lock(&amp;task-&gt;mutex);</div><div class='add'>+    {</div><div class='add'>+        task-&gt;state = SYNCTASK_ZOMBIE;</div><div class='add'>+        task-&gt;done = 1;</div><div class='add'>+        pthread_cond_broadcast(&amp;task-&gt;cond);</div><div class='add'>+    }</div><div class='add'>+    pthread_mutex_unlock(&amp;task-&gt;mutex);</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-synctask_new (struct syncenv *env, synctask_fn_t fn, synctask_cbk_t cbk,</div><div class='del'>-              void *opaque)</div><div class='add'>+synctask_setid(struct synctask *task, uid_t uid, gid_t gid)</div><div class='ctx'> {</div><div class='del'>-        struct synctask *newtask = NULL;</div><div class='add'>+    if (!task)</div><div class='add'>+        return -1;</div><div class='ctx'> </div><div class='del'>-        newtask = CALLOC (1, sizeof (*newtask));</div><div class='del'>-        if (!newtask)</div><div class='del'>-                return -ENOMEM;</div><div class='add'>+    if (uid != -1)</div><div class='add'>+        task-&gt;uid = uid;</div><div class='ctx'> </div><div class='del'>-        newtask-&gt;env        = env;</div><div class='del'>-        newtask-&gt;xl         = THIS;</div><div class='del'>-        newtask-&gt;syncfn     = fn;</div><div class='del'>-        newtask-&gt;synccbk    = cbk;</div><div class='del'>-        newtask-&gt;opaque     = opaque;</div><div class='add'>+    if (gid != -1)</div><div class='add'>+        task-&gt;gid = gid;</div><div class='ctx'> </div><div class='del'>-        INIT_LIST_HEAD (&amp;newtask-&gt;all_tasks);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        if (getcontext (&amp;newtask-&gt;ctx) &lt; 0) {</div><div class='del'>-                gf_log ("syncop", GF_LOG_ERROR,</div><div class='del'>-                        "getcontext failed (%s)",</div><div class='del'>-                        strerror (errno));</div><div class='del'>-                goto err;</div><div class='del'>-        }</div><div class='add'>+struct synctask *</div><div class='add'>+synctask_create(struct syncenv *env, size_t stacksize, synctask_fn_t fn,</div><div class='add'>+                synctask_cbk_t cbk, call_frame_t *frame, void *opaque)</div><div class='add'>+{</div><div class='add'>+    struct synctask *newtask = NULL;</div><div class='add'>+    xlator_t *this = THIS;</div><div class='add'>+    int destroymode = 0;</div><div class='add'>+</div><div class='add'>+    VALIDATE_OR_GOTO(env, err);</div><div class='add'>+    VALIDATE_OR_GOTO(fn, err);</div><div class='add'>+</div><div class='add'>+    /* Check if the syncenv is in destroymode i.e. destroy is SET.</div><div class='add'>+     * If YES, then don't allow any new synctasks on it. Return NULL.</div><div class='add'>+     */</div><div class='add'>+    pthread_mutex_lock(&amp;env-&gt;mutex);</div><div class='add'>+    {</div><div class='add'>+        destroymode = env-&gt;destroy;</div><div class='add'>+    }</div><div class='add'>+    pthread_mutex_unlock(&amp;env-&gt;mutex);</div><div class='add'>+</div><div class='add'>+    /* syncenv is in DESTROY mode, return from here */</div><div class='add'>+    if (destroymode)</div><div class='add'>+        return NULL;</div><div class='ctx'> </div><div class='del'>-        newtask-&gt;stack = CALLOC (1, env-&gt;stacksize);</div><div class='del'>-        if (!newtask-&gt;stack) {</div><div class='del'>-                gf_log ("syncop", GF_LOG_ERROR,</div><div class='del'>-                        "out of memory for stack");</div><div class='del'>-                goto err;</div><div class='del'>-        }</div><div class='add'>+    newtask = GF_CALLOC(1, sizeof(*newtask), gf_common_mt_synctask);</div><div class='add'>+    if (!newtask)</div><div class='add'>+        return NULL;</div><div class='ctx'> </div><div class='del'>-        newtask-&gt;ctx.uc_stack.ss_sp   = newtask-&gt;stack;</div><div class='add'>+    newtask-&gt;frame = frame;</div><div class='add'>+    if (!frame) {</div><div class='add'>+        newtask-&gt;opframe = create_frame(this, this-&gt;ctx-&gt;pool);</div><div class='add'>+        if (!newtask-&gt;opframe)</div><div class='add'>+            goto err;</div><div class='add'>+        set_lk_owner_from_ptr(&amp;newtask-&gt;opframe-&gt;root-&gt;lk_owner,</div><div class='add'>+                              newtask-&gt;opframe-&gt;root);</div><div class='add'>+    } else {</div><div class='add'>+        newtask-&gt;opframe = copy_frame(frame);</div><div class='add'>+    }</div><div class='add'>+    if (!newtask-&gt;opframe)</div><div class='add'>+        goto err;</div><div class='add'>+    newtask-&gt;env = env;</div><div class='add'>+    newtask-&gt;xl = this;</div><div class='add'>+    newtask-&gt;syncfn = fn;</div><div class='add'>+    newtask-&gt;synccbk = cbk;</div><div class='add'>+    newtask-&gt;opaque = opaque;</div><div class='add'>+</div><div class='add'>+    /* default to the uid/gid of the passed frame */</div><div class='add'>+    newtask-&gt;uid = newtask-&gt;opframe-&gt;root-&gt;uid;</div><div class='add'>+    newtask-&gt;gid = newtask-&gt;opframe-&gt;root-&gt;gid;</div><div class='add'>+</div><div class='add'>+    INIT_LIST_HEAD(&amp;newtask-&gt;all_tasks);</div><div class='add'>+    INIT_LIST_HEAD(&amp;newtask-&gt;waitq);</div><div class='add'>+</div><div class='add'>+    if (getcontext(&amp;newtask-&gt;ctx) &lt; 0) {</div><div class='add'>+        gf_msg("syncop", GF_LOG_ERROR, errno, LG_MSG_GETCONTEXT_FAILED,</div><div class='add'>+               "getcontext failed");</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (stacksize &lt;= 0) {</div><div class='add'>+        newtask-&gt;stack = GF_CALLOC(1, env-&gt;stacksize, gf_common_mt_syncstack);</div><div class='ctx'>         newtask-&gt;ctx.uc_stack.ss_size = env-&gt;stacksize;</div><div class='add'>+    } else {</div><div class='add'>+        newtask-&gt;stack = GF_CALLOC(1, stacksize, gf_common_mt_syncstack);</div><div class='add'>+        newtask-&gt;ctx.uc_stack.ss_size = stacksize;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        makecontext (&amp;newtask-&gt;ctx, (void *) synctask_wrap, 2, newtask);</div><div class='add'>+    if (!newtask-&gt;stack) {</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        synctask_wake (newtask);</div><div class='add'>+    newtask-&gt;ctx.uc_stack.ss_sp = newtask-&gt;stack;</div><div class='ctx'> </div><div class='del'>-        return 0;</div><div class='add'>+    makecontext(&amp;newtask-&gt;ctx, (void (*)(void))synctask_wrap, 0);</div><div class='add'>+</div><div class='add'>+#ifdef HAVE_TSAN_API</div><div class='add'>+    newtask-&gt;tsan.fiber = __tsan_create_fiber(0);</div><div class='add'>+    snprintf(newtask-&gt;tsan.name, TSAN_THREAD_NAMELEN, "&lt;synctask of %s&gt;",</div><div class='add'>+             this-&gt;name);</div><div class='add'>+    __tsan_set_fiber_name(newtask-&gt;tsan.fiber, newtask-&gt;tsan.name);</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+    newtask-&gt;state = SYNCTASK_INIT;</div><div class='add'>+</div><div class='add'>+    newtask-&gt;slept = 1;</div><div class='add'>+</div><div class='add'>+    if (!cbk) {</div><div class='add'>+        pthread_mutex_init(&amp;newtask-&gt;mutex, NULL);</div><div class='add'>+        pthread_cond_init(&amp;newtask-&gt;cond, NULL);</div><div class='add'>+        newtask-&gt;done = 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    synctask_wake(newtask);</div><div class='add'>+</div><div class='add'>+    return newtask;</div><div class='ctx'> err:</div><div class='del'>-        if (newtask) {</div><div class='del'>-                if (newtask-&gt;stack)</div><div class='del'>-                        FREE (newtask-&gt;stack);</div><div class='del'>-                FREE (newtask);</div><div class='del'>-        }</div><div class='add'>+    if (newtask) {</div><div class='add'>+        GF_FREE(newtask-&gt;stack);</div><div class='add'>+        if (newtask-&gt;opframe)</div><div class='add'>+            STACK_DESTROY(newtask-&gt;opframe-&gt;root);</div><div class='add'>+        GF_FREE(newtask);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return NULL;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+synctask_join(struct synctask *task)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    pthread_mutex_lock(&amp;task-&gt;mutex);</div><div class='add'>+    {</div><div class='add'>+        while (!task-&gt;done)</div><div class='add'>+            pthread_cond_wait(&amp;task-&gt;cond, &amp;task-&gt;mutex);</div><div class='add'>+    }</div><div class='add'>+    pthread_mutex_unlock(&amp;task-&gt;mutex);</div><div class='add'>+</div><div class='add'>+    ret = task-&gt;ret;</div><div class='add'>+</div><div class='add'>+    synctask_destroy(task);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+synctask_new1(struct syncenv *env, size_t stacksize, synctask_fn_t fn,</div><div class='add'>+              synctask_cbk_t cbk, call_frame_t *frame, void *opaque)</div><div class='add'>+{</div><div class='add'>+    struct synctask *newtask = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    newtask = synctask_create(env, stacksize, fn, cbk, frame, opaque);</div><div class='add'>+    if (!newtask)</div><div class='ctx'>         return -1;</div><div class='add'>+</div><div class='add'>+    if (!cbk)</div><div class='add'>+        ret = synctask_join(newtask);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+int</div><div class='add'>+synctask_new(struct syncenv *env, synctask_fn_t fn, synctask_cbk_t cbk,</div><div class='add'>+             call_frame_t *frame, void *opaque)</div><div class='add'>+{</div><div class='add'>+    return synctask_new1(env, 0, fn, cbk, frame, opaque);</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> struct synctask *</div><div class='del'>-syncenv_task (struct syncenv *env)</div><div class='add'>+syncenv_task(struct syncproc *proc)</div><div class='ctx'> {</div><div class='del'>-        struct synctask  *task = NULL;</div><div class='add'>+    struct syncenv *env = NULL;</div><div class='add'>+    struct synctask *task = NULL;</div><div class='add'>+    struct timespec sleep_till = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    env = proc-&gt;env;</div><div class='add'>+</div><div class='add'>+    pthread_mutex_lock(&amp;env-&gt;mutex);</div><div class='add'>+    {</div><div class='add'>+        while (list_empty(&amp;env-&gt;runq)) {</div><div class='add'>+            /* If either of the conditions are met then exit</div><div class='add'>+             * the current thread:</div><div class='add'>+             * 1. syncenv has to scale down(procs &gt; procmin)</div><div class='add'>+             * 2. syncenv is in destroy mode and no tasks in</div><div class='add'>+             *    either waitq or runq.</div><div class='add'>+             *</div><div class='add'>+             * At any point in time, a task can be either in runq,</div><div class='add'>+             * or in executing state or in the waitq. Once the</div><div class='add'>+             * destroy mode is set, no new synctask creates will</div><div class='add'>+             * be allowed, but whatever in waitq or runq should be</div><div class='add'>+             * allowed to finish before exiting any of the syncenv</div><div class='add'>+             * processor threads.</div><div class='add'>+             */</div><div class='add'>+            if (((ret == ETIMEDOUT) &amp;&amp; (env-&gt;procs &gt; env-&gt;procmin)) ||</div><div class='add'>+                (env-&gt;destroy &amp;&amp; list_empty(&amp;env-&gt;waitq))) {</div><div class='add'>+                task = NULL;</div><div class='add'>+                env-&gt;procs--;</div><div class='add'>+                memset(proc, 0, sizeof(*proc));</div><div class='add'>+                pthread_cond_broadcast(&amp;env-&gt;cond);</div><div class='add'>+                goto unlock;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            env-&gt;procs_idle++;</div><div class='add'>+</div><div class='add'>+            sleep_till.tv_sec = gf_time() + SYNCPROC_IDLE_TIME;</div><div class='add'>+            ret = pthread_cond_timedwait(&amp;env-&gt;cond, &amp;env-&gt;mutex, &amp;sleep_till);</div><div class='add'>+</div><div class='add'>+            env-&gt;procs_idle--;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-        pthread_mutex_lock (&amp;env-&gt;mutex);</div><div class='del'>-        {</div><div class='del'>-                while (list_empty (&amp;env-&gt;runq))</div><div class='del'>-                        pthread_cond_wait (&amp;env-&gt;cond, &amp;env-&gt;mutex);</div><div class='add'>+        task = list_entry(env-&gt;runq.next, struct synctask, all_tasks);</div><div class='ctx'> </div><div class='del'>-                task = list_entry (env-&gt;runq.next, struct synctask, all_tasks);</div><div class='add'>+        list_del_init(&amp;task-&gt;all_tasks);</div><div class='add'>+        env-&gt;runcount--;</div><div class='ctx'> </div><div class='del'>-                list_del_init (&amp;task-&gt;all_tasks);</div><div class='del'>-        }</div><div class='del'>-        pthread_mutex_unlock (&amp;env-&gt;mutex);</div><div class='add'>+        task-&gt;woken = 0;</div><div class='add'>+        task-&gt;slept = 0;</div><div class='ctx'> </div><div class='del'>-        return task;</div><div class='add'>+        task-&gt;proc = proc;</div><div class='add'>+    }</div><div class='add'>+unlock:</div><div class='add'>+    pthread_mutex_unlock(&amp;env-&gt;mutex);</div><div class='add'>+</div><div class='add'>+    return task;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+static void</div><div class='add'>+synctask_timer(void *data)</div><div class='add'>+{</div><div class='add'>+    struct synctask *task = data;</div><div class='add'>+    struct synccond *cond;</div><div class='add'>+</div><div class='add'>+    cond = task-&gt;synccond;</div><div class='add'>+    if (cond != NULL) {</div><div class='add'>+        pthread_mutex_lock(&amp;cond-&gt;pmutex);</div><div class='add'>+</div><div class='add'>+        list_del_init(&amp;task-&gt;waitq);</div><div class='add'>+        task-&gt;synccond = NULL;</div><div class='add'>+</div><div class='add'>+        pthread_mutex_unlock(&amp;cond-&gt;pmutex);</div><div class='add'>+</div><div class='add'>+        task-&gt;ret = -ETIMEDOUT;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    pthread_mutex_lock(&amp;task-&gt;env-&gt;mutex);</div><div class='add'>+</div><div class='add'>+    gf_timer_call_cancel(task-&gt;xl-&gt;ctx, task-&gt;timer);</div><div class='add'>+    task-&gt;timer = NULL;</div><div class='add'>+</div><div class='add'>+    __synctask_wake(task);</div><div class='add'>+</div><div class='add'>+    pthread_mutex_unlock(&amp;task-&gt;env-&gt;mutex);</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> void</div><div class='del'>-synctask_switchto (struct synctask *task)</div><div class='add'>+synctask_switchto(struct synctask *task)</div><div class='ctx'> {</div><div class='del'>-        struct syncenv *env = NULL;</div><div class='add'>+    struct syncenv *env = NULL;</div><div class='ctx'> </div><div class='del'>-        env = task-&gt;env;</div><div class='add'>+    env = task-&gt;env;</div><div class='ctx'> </div><div class='del'>-        synctask_set (task);</div><div class='del'>-        THIS = task-&gt;xl;</div><div class='add'>+    synctask_set(task);</div><div class='add'>+    THIS = task-&gt;xl;</div><div class='add'>+</div><div class='add'>+#if defined(__NetBSD__) &amp;&amp; defined(_UC_TLSBASE)</div><div class='add'>+    /* Preserve pthread private pointer through swapcontex() */</div><div class='add'>+    task-&gt;ctx.uc_flags &amp;= ~_UC_TLSBASE;</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#ifdef HAVE_TSAN_API</div><div class='add'>+    __tsan_switch_to_fiber(task-&gt;tsan.fiber, 0);</div><div class='add'>+#endif</div><div class='ctx'> </div><div class='del'>-        if (swapcontext (&amp;env-&gt;sched, &amp;task-&gt;ctx) &lt; 0) {</div><div class='del'>-                gf_log ("syncop", GF_LOG_ERROR,</div><div class='del'>-                        "swapcontext failed (%s)", strerror (errno));</div><div class='add'>+    if (swapcontext(&amp;task-&gt;proc-&gt;sched, &amp;task-&gt;ctx) &lt; 0) {</div><div class='add'>+        gf_msg("syncop", GF_LOG_ERROR, errno, LG_MSG_SWAPCONTEXT_FAILED,</div><div class='add'>+               "swapcontext failed");</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (task-&gt;state == SYNCTASK_DONE) {</div><div class='add'>+        synctask_done(task);</div><div class='add'>+        return;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    pthread_mutex_lock(&amp;env-&gt;mutex);</div><div class='add'>+    {</div><div class='add'>+        if (task-&gt;woken) {</div><div class='add'>+            __run(task);</div><div class='add'>+        } else {</div><div class='add'>+            task-&gt;slept = 1;</div><div class='add'>+            __wait(task);</div><div class='add'>+</div><div class='add'>+            if (task-&gt;delta != NULL) {</div><div class='add'>+                task-&gt;timer = gf_timer_call_after(task-&gt;xl-&gt;ctx, *task-&gt;delta,</div><div class='add'>+                                                  synctask_timer, task);</div><div class='add'>+            }</div><div class='ctx'>         }</div><div class='del'>-}</div><div class='ctx'> </div><div class='add'>+        task-&gt;delta = NULL;</div><div class='add'>+    }</div><div class='add'>+    pthread_mutex_unlock(&amp;env-&gt;mutex);</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> void *</div><div class='del'>-syncenv_processor (void *thdata)</div><div class='add'>+syncenv_processor(void *thdata)</div><div class='ctx'> {</div><div class='del'>-        struct syncenv  *env = NULL;</div><div class='del'>-        struct synctask *task = NULL;</div><div class='add'>+    struct syncproc *proc = NULL;</div><div class='add'>+    struct synctask *task = NULL;</div><div class='ctx'> </div><div class='del'>-        env = thdata;</div><div class='add'>+    proc = thdata;</div><div class='ctx'> </div><div class='del'>-        for (;;) {</div><div class='del'>-                task = syncenv_task (env);</div><div class='add'>+#ifdef HAVE_TSAN_API</div><div class='add'>+    proc-&gt;tsan.fiber = __tsan_create_fiber(0);</div><div class='add'>+    snprintf(proc-&gt;tsan.name, TSAN_THREAD_NAMELEN, "&lt;sched of syncenv@%p&gt;",</div><div class='add'>+             proc);</div><div class='add'>+    __tsan_set_fiber_name(proc-&gt;tsan.fiber, proc-&gt;tsan.name);</div><div class='add'>+#endif</div><div class='ctx'> </div><div class='del'>-                if (task-&gt;complete) {</div><div class='del'>-                        synctask_destroy (task);</div><div class='del'>-                        continue;</div><div class='del'>-                }</div><div class='add'>+    while ((task = syncenv_task(proc)) != NULL) {</div><div class='add'>+        synctask_switchto(task);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-                synctask_switchto (task);</div><div class='add'>+#ifdef HAVE_TSAN_API</div><div class='add'>+    __tsan_destroy_fiber(proc-&gt;tsan.fiber);</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+    return NULL;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* The syncenv threads are cleaned up in this routine.</div><div class='add'>+ */</div><div class='add'>+void</div><div class='add'>+syncenv_destroy(struct syncenv *env)</div><div class='add'>+{</div><div class='add'>+    if (env == NULL)</div><div class='add'>+        return;</div><div class='add'>+</div><div class='add'>+    /* SET the 'destroy' in syncenv structure to prohibit any</div><div class='add'>+     * further synctask(s) on this syncenv which is in destroy mode.</div><div class='add'>+     *</div><div class='add'>+     * If syncenv threads are in pthread cond wait with no tasks in</div><div class='add'>+     * their run or wait queue, then the threads are woken up by</div><div class='add'>+     * broadcasting the cond variable and if destroy field is set,</div><div class='add'>+     * the infinite loop in syncenv_processor is broken and the</div><div class='add'>+     * threads return.</div><div class='add'>+     *</div><div class='add'>+     * If syncenv threads have tasks in runq or waitq, the tasks are</div><div class='add'>+     * completed and only then the thread returns.</div><div class='add'>+     */</div><div class='add'>+    pthread_mutex_lock(&amp;env-&gt;mutex);</div><div class='add'>+    {</div><div class='add'>+        env-&gt;destroy = 1;</div><div class='add'>+        /* This broadcast will wake threads in pthread_cond_wait</div><div class='add'>+         * in syncenv_task</div><div class='add'>+         */</div><div class='add'>+        pthread_cond_broadcast(&amp;env-&gt;cond);</div><div class='add'>+</div><div class='add'>+        /* when the syncenv_task() thread is exiting, it broadcasts to</div><div class='add'>+         * wake the below wait.</div><div class='add'>+         */</div><div class='add'>+        while (env-&gt;procs != 0) {</div><div class='add'>+            pthread_cond_wait(&amp;env-&gt;cond, &amp;env-&gt;mutex);</div><div class='ctx'>         }</div><div class='add'>+    }</div><div class='add'>+    pthread_mutex_unlock(&amp;env-&gt;mutex);</div><div class='add'>+</div><div class='add'>+    pthread_mutex_destroy(&amp;env-&gt;mutex);</div><div class='add'>+    pthread_cond_destroy(&amp;env-&gt;cond);</div><div class='add'>+</div><div class='add'>+    GF_FREE(env);</div><div class='add'>+</div><div class='add'>+    return;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+struct syncenv *</div><div class='add'>+syncenv_new(size_t stacksize, int procmin, int procmax)</div><div class='add'>+{</div><div class='add'>+    struct syncenv *newenv = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    int i = 0;</div><div class='add'>+</div><div class='add'>+    if (!procmin || procmin &lt; 0)</div><div class='add'>+        procmin = SYNCENV_PROC_MIN;</div><div class='add'>+    if (!procmax || procmax &gt; SYNCENV_PROC_MAX)</div><div class='add'>+        procmax = SYNCENV_PROC_MAX;</div><div class='add'>+</div><div class='add'>+    if (procmin &gt; procmax)</div><div class='add'>+        return NULL;</div><div class='add'>+</div><div class='add'>+    newenv = GF_CALLOC(1, sizeof(*newenv), gf_common_mt_syncenv);</div><div class='ctx'> </div><div class='add'>+    if (!newenv)</div><div class='ctx'>         return NULL;</div><div class='add'>+</div><div class='add'>+    pthread_mutex_init(&amp;newenv-&gt;mutex, NULL);</div><div class='add'>+    pthread_cond_init(&amp;newenv-&gt;cond, NULL);</div><div class='add'>+</div><div class='add'>+    INIT_LIST_HEAD(&amp;newenv-&gt;runq);</div><div class='add'>+    INIT_LIST_HEAD(&amp;newenv-&gt;waitq);</div><div class='add'>+</div><div class='add'>+    newenv-&gt;stacksize = SYNCENV_DEFAULT_STACKSIZE;</div><div class='add'>+    if (stacksize)</div><div class='add'>+        newenv-&gt;stacksize = stacksize;</div><div class='add'>+    newenv-&gt;procmin = procmin;</div><div class='add'>+    newenv-&gt;procmax = procmax;</div><div class='add'>+    newenv-&gt;procs_idle = 0;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; newenv-&gt;procmin; i++) {</div><div class='add'>+        newenv-&gt;proc[i].env = newenv;</div><div class='add'>+        ret = gf_thread_create(&amp;newenv-&gt;proc[i].processor, NULL,</div><div class='add'>+                               syncenv_processor, &amp;newenv-&gt;proc[i], "sproc%d",</div><div class='add'>+                               i);</div><div class='add'>+        if (ret)</div><div class='add'>+            break;</div><div class='add'>+        newenv-&gt;procs++;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (ret != 0) {</div><div class='add'>+        syncenv_destroy(newenv);</div><div class='add'>+        newenv = NULL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return newenv;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+synclock_init(synclock_t *lock, lock_attr_t attr)</div><div class='add'>+{</div><div class='add'>+    if (!lock)</div><div class='add'>+        return -1;</div><div class='add'>+</div><div class='add'>+    pthread_cond_init(&amp;lock-&gt;cond, 0);</div><div class='add'>+    lock-&gt;type = LOCK_NULL;</div><div class='add'>+    lock-&gt;owner = NULL;</div><div class='add'>+    lock-&gt;owner_tid = 0;</div><div class='add'>+    lock-&gt;lock = 0;</div><div class='add'>+    lock-&gt;attr = attr;</div><div class='add'>+    INIT_LIST_HEAD(&amp;lock-&gt;waitq);</div><div class='add'>+</div><div class='add'>+    return pthread_mutex_init(&amp;lock-&gt;guard, 0);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+synclock_destroy(synclock_t *lock)</div><div class='add'>+{</div><div class='add'>+    if (!lock)</div><div class='add'>+        return -1;</div><div class='add'>+</div><div class='add'>+    pthread_cond_destroy(&amp;lock-&gt;cond);</div><div class='add'>+    return pthread_mutex_destroy(&amp;lock-&gt;guard);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+__synclock_lock(struct synclock *lock)</div><div class='add'>+{</div><div class='add'>+    struct synctask *task = NULL;</div><div class='add'>+</div><div class='add'>+    if (!lock)</div><div class='add'>+        return -1;</div><div class='add'>+</div><div class='add'>+    task = synctask_get();</div><div class='add'>+</div><div class='add'>+    if (lock-&gt;lock &amp;&amp; (lock-&gt;attr == SYNC_LOCK_RECURSIVE)) {</div><div class='add'>+        /*Recursive lock (if same owner requested for lock again then</div><div class='add'>+         *increment lock count and return success).</div><div class='add'>+         *Note:same number of unlocks required.</div><div class='add'>+         */</div><div class='add'>+        switch (lock-&gt;type) {</div><div class='add'>+            case LOCK_TASK:</div><div class='add'>+                if (task == lock-&gt;owner) {</div><div class='add'>+                    lock-&gt;lock++;</div><div class='add'>+                    gf_msg_trace("", 0,</div><div class='add'>+                                 "Recursive lock called by"</div><div class='add'>+                                 " sync task.owner= %p,lock=%d",</div><div class='add'>+                                 lock-&gt;owner, lock-&gt;lock);</div><div class='add'>+                    return 0;</div><div class='add'>+                }</div><div class='add'>+                break;</div><div class='add'>+            case LOCK_THREAD:</div><div class='add'>+                if (pthread_equal(pthread_self(), lock-&gt;owner_tid)) {</div><div class='add'>+                    lock-&gt;lock++;</div><div class='add'>+                    gf_msg_trace("", 0,</div><div class='add'>+                                 "Recursive lock called by"</div><div class='add'>+                                 " thread ,owner=%u lock=%d",</div><div class='add'>+                                 (unsigned int)lock-&gt;owner_tid, lock-&gt;lock);</div><div class='add'>+                    return 0;</div><div class='add'>+                }</div><div class='add'>+                break;</div><div class='add'>+            default:</div><div class='add'>+                gf_msg("", GF_LOG_CRITICAL, 0, LG_MSG_UNKNOWN_LOCK_TYPE,</div><div class='add'>+                       "unknown lock type");</div><div class='add'>+                break;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    while (lock-&gt;lock) {</div><div class='add'>+        if (task) {</div><div class='add'>+            /* called within a synctask */</div><div class='add'>+            task-&gt;woken = 0;</div><div class='add'>+            list_add_tail(&amp;task-&gt;waitq, &amp;lock-&gt;waitq);</div><div class='add'>+            pthread_mutex_unlock(&amp;lock-&gt;guard);</div><div class='add'>+            synctask_yield(task, NULL);</div><div class='add'>+            /* task is removed from waitq in unlock,</div><div class='add'>+             * under lock-&gt;guard.*/</div><div class='add'>+            pthread_mutex_lock(&amp;lock-&gt;guard);</div><div class='add'>+        } else {</div><div class='add'>+            /* called by a non-synctask */</div><div class='add'>+            pthread_cond_wait(&amp;lock-&gt;cond, &amp;lock-&gt;guard);</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (task) {</div><div class='add'>+        lock-&gt;type = LOCK_TASK;</div><div class='add'>+        lock-&gt;owner = task; /* for synctask*/</div><div class='add'>+</div><div class='add'>+    } else {</div><div class='add'>+        lock-&gt;type = LOCK_THREAD;</div><div class='add'>+        lock-&gt;owner_tid = pthread_self(); /* for non-synctask */</div><div class='add'>+    }</div><div class='add'>+    lock-&gt;lock = 1;</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+synclock_lock(synclock_t *lock)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    pthread_mutex_lock(&amp;lock-&gt;guard);</div><div class='add'>+    {</div><div class='add'>+        ret = __synclock_lock(lock);</div><div class='add'>+    }</div><div class='add'>+    pthread_mutex_unlock(&amp;lock-&gt;guard);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+int</div><div class='add'>+synclock_trylock(synclock_t *lock)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    errno = 0;</div><div class='add'>+</div><div class='add'>+    pthread_mutex_lock(&amp;lock-&gt;guard);</div><div class='add'>+    {</div><div class='add'>+        if (lock-&gt;lock) {</div><div class='add'>+            errno = EBUSY;</div><div class='add'>+            ret = -1;</div><div class='add'>+            goto unlock;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        ret = __synclock_lock(lock);</div><div class='add'>+    }</div><div class='add'>+unlock:</div><div class='add'>+    pthread_mutex_unlock(&amp;lock-&gt;guard);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+__synclock_unlock(synclock_t *lock)</div><div class='add'>+{</div><div class='add'>+    struct synctask *task = NULL;</div><div class='add'>+    struct synctask *curr = NULL;</div><div class='add'>+</div><div class='add'>+    if (!lock)</div><div class='add'>+        return -1;</div><div class='add'>+</div><div class='add'>+    if (lock-&gt;lock == 0) {</div><div class='add'>+        gf_msg("", GF_LOG_CRITICAL, 0, LG_MSG_UNLOCK_BEFORE_LOCK,</div><div class='add'>+               "Unlock called  before lock ");</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+    curr = synctask_get();</div><div class='add'>+    /*unlock should be called by lock owner</div><div class='add'>+     *i.e this will not allow the lock in nonsync task and unlock</div><div class='add'>+     * in sync task and vice-versa</div><div class='add'>+     */</div><div class='add'>+    switch (lock-&gt;type) {</div><div class='add'>+        case LOCK_TASK:</div><div class='add'>+            if (curr == lock-&gt;owner) {</div><div class='add'>+                lock-&gt;lock--;</div><div class='add'>+                gf_msg_trace("", 0,</div><div class='add'>+                             "Unlock success %p, remaining"</div><div class='add'>+                             " locks=%d",</div><div class='add'>+                             lock-&gt;owner, lock-&gt;lock);</div><div class='add'>+            } else {</div><div class='add'>+                gf_msg("", GF_LOG_WARNING, 0, LG_MSG_LOCK_OWNER_ERROR,</div><div class='add'>+                       "Unlock called by %p, but lock held by %p", curr,</div><div class='add'>+                       lock-&gt;owner);</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            break;</div><div class='add'>+        case LOCK_THREAD:</div><div class='add'>+            if (pthread_equal(pthread_self(), lock-&gt;owner_tid)) {</div><div class='add'>+                lock-&gt;lock--;</div><div class='add'>+                gf_msg_trace("", 0,</div><div class='add'>+                             "Unlock success %u, remaining "</div><div class='add'>+                             "locks=%d",</div><div class='add'>+                             (unsigned int)lock-&gt;owner_tid, lock-&gt;lock);</div><div class='add'>+            } else {</div><div class='add'>+                gf_msg("", GF_LOG_WARNING, 0, LG_MSG_LOCK_OWNER_ERROR,</div><div class='add'>+                       "Unlock called by %u, but lock held by %u",</div><div class='add'>+                       (unsigned int)pthread_self(),</div><div class='add'>+                       (unsigned int)lock-&gt;owner_tid);</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            break;</div><div class='add'>+        default:</div><div class='add'>+            break;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (lock-&gt;lock &gt; 0) {</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='add'>+    lock-&gt;type = LOCK_NULL;</div><div class='add'>+    lock-&gt;owner = NULL;</div><div class='add'>+    lock-&gt;owner_tid = 0;</div><div class='add'>+    lock-&gt;lock = 0;</div><div class='add'>+    /* There could be both synctasks and non synctasks</div><div class='add'>+       waiting (or none, or either). As a mid-approach</div><div class='add'>+       between maintaining too many waiting counters</div><div class='add'>+       at one extreme and a thundering herd on unlock</div><div class='add'>+       at the other, call a cond_signal (which wakes</div><div class='add'>+       one waiter) and first synctask waiter. So at</div><div class='add'>+       most we have two threads waking up to grab the</div><div class='add'>+       just released lock.</div><div class='add'>+    */</div><div class='add'>+    pthread_cond_signal(&amp;lock-&gt;cond);</div><div class='add'>+    if (!list_empty(&amp;lock-&gt;waitq)) {</div><div class='add'>+        task = list_entry(lock-&gt;waitq.next, struct synctask, waitq);</div><div class='add'>+        list_del_init(&amp;task-&gt;waitq);</div><div class='add'>+        synctask_wake(task);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+synclock_unlock(synclock_t *lock)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    pthread_mutex_lock(&amp;lock-&gt;guard);</div><div class='add'>+    {</div><div class='add'>+        ret = __synclock_unlock(lock);</div><div class='add'>+    }</div><div class='add'>+    pthread_mutex_unlock(&amp;lock-&gt;guard);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* Condition variables */</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+synccond_init(synccond_t *cond)</div><div class='add'>+{</div><div class='add'>+    int32_t ret;</div><div class='add'>+</div><div class='add'>+    INIT_LIST_HEAD(&amp;cond-&gt;waitq);</div><div class='add'>+</div><div class='add'>+    ret = pthread_mutex_init(&amp;cond-&gt;pmutex, NULL);</div><div class='add'>+    if (ret != 0) {</div><div class='add'>+        return -ret;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = pthread_cond_init(&amp;cond-&gt;pcond, NULL);</div><div class='add'>+    if (ret != 0) {</div><div class='add'>+        pthread_mutex_destroy(&amp;cond-&gt;pmutex);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return -ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> void</div><div class='del'>-syncenv_destroy (struct syncenv *env)</div><div class='add'>+synccond_destroy(synccond_t *cond)</div><div class='ctx'> {</div><div class='add'>+    pthread_cond_destroy(&amp;cond-&gt;pcond);</div><div class='add'>+    pthread_mutex_destroy(&amp;cond-&gt;pmutex);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+synccond_timedwait(synccond_t *cond, synclock_t *lock, struct timespec *delta)</div><div class='add'>+{</div><div class='add'>+    struct timespec now;</div><div class='add'>+    struct synctask *task = NULL;</div><div class='add'>+    int ret;</div><div class='add'>+</div><div class='add'>+    task = synctask_get();</div><div class='ctx'> </div><div class='add'>+    if (task == NULL) {</div><div class='add'>+        if (delta != NULL) {</div><div class='add'>+            timespec_now_realtime(&amp;now);</div><div class='add'>+            timespec_adjust_delta(&amp;now, *delta);</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        pthread_mutex_lock(&amp;cond-&gt;pmutex);</div><div class='add'>+</div><div class='add'>+        if (delta == NULL) {</div><div class='add'>+            ret = -pthread_cond_wait(&amp;cond-&gt;pcond, &amp;cond-&gt;pmutex);</div><div class='add'>+        } else {</div><div class='add'>+            ret = -pthread_cond_timedwait(&amp;cond-&gt;pcond, &amp;cond-&gt;pmutex, &amp;now);</div><div class='add'>+        }</div><div class='add'>+    } else {</div><div class='add'>+        pthread_mutex_lock(&amp;cond-&gt;pmutex);</div><div class='add'>+</div><div class='add'>+        list_add_tail(&amp;task-&gt;waitq, &amp;cond-&gt;waitq);</div><div class='add'>+        task-&gt;synccond = cond;</div><div class='add'>+</div><div class='add'>+        ret = synclock_unlock(lock);</div><div class='add'>+        if (ret == 0) {</div><div class='add'>+            pthread_mutex_unlock(&amp;cond-&gt;pmutex);</div><div class='add'>+</div><div class='add'>+            synctask_yield(task, delta);</div><div class='add'>+</div><div class='add'>+            ret = synclock_lock(lock);</div><div class='add'>+            if (ret == 0) {</div><div class='add'>+                ret = task-&gt;ret;</div><div class='add'>+            }</div><div class='add'>+            task-&gt;ret = 0;</div><div class='add'>+</div><div class='add'>+            return ret;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        list_del_init(&amp;task-&gt;waitq);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    pthread_mutex_unlock(&amp;cond-&gt;pmutex);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+int</div><div class='add'>+synccond_wait(synccond_t *cond, synclock_t *lock)</div><div class='add'>+{</div><div class='add'>+    return synccond_timedwait(cond, lock, NULL);</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-struct syncenv *</div><div class='del'>-syncenv_new (size_t stacksize)</div><div class='add'>+void</div><div class='add'>+synccond_signal(synccond_t *cond)</div><div class='ctx'> {</div><div class='del'>-        struct syncenv *newenv = NULL;</div><div class='del'>-        int             ret = 0;</div><div class='add'>+    struct synctask *task;</div><div class='ctx'> </div><div class='del'>-        newenv = CALLOC (1, sizeof (*newenv));</div><div class='add'>+    pthread_mutex_lock(&amp;cond-&gt;pmutex);</div><div class='ctx'> </div><div class='del'>-        if (!newenv)</div><div class='del'>-                return NULL;</div><div class='add'>+    if (!list_empty(&amp;cond-&gt;waitq)) {</div><div class='add'>+        task = list_first_entry(&amp;cond-&gt;waitq, struct synctask, waitq);</div><div class='add'>+        list_del_init(&amp;task-&gt;waitq);</div><div class='ctx'> </div><div class='del'>-        pthread_mutex_init (&amp;newenv-&gt;mutex, NULL);</div><div class='del'>-        pthread_cond_init (&amp;newenv-&gt;cond, NULL);</div><div class='add'>+        pthread_mutex_unlock(&amp;cond-&gt;pmutex);</div><div class='ctx'> </div><div class='del'>-        INIT_LIST_HEAD (&amp;newenv-&gt;runq);</div><div class='del'>-        INIT_LIST_HEAD (&amp;newenv-&gt;waitq);</div><div class='add'>+        synctask_wake(task);</div><div class='add'>+    } else {</div><div class='add'>+        pthread_cond_signal(&amp;cond-&gt;pcond);</div><div class='ctx'> </div><div class='del'>-        newenv-&gt;stacksize    = SYNCENV_DEFAULT_STACKSIZE;</div><div class='del'>-        if (stacksize)</div><div class='del'>-                newenv-&gt;stacksize = stacksize;</div><div class='add'>+        pthread_mutex_unlock(&amp;cond-&gt;pmutex);</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+synccond_broadcast(synccond_t *cond)</div><div class='add'>+{</div><div class='add'>+    struct list_head list;</div><div class='add'>+    struct synctask *task;</div><div class='ctx'> </div><div class='del'>-        ret = pthread_create (&amp;newenv-&gt;processor, NULL,</div><div class='del'>-                              syncenv_processor, newenv);</div><div class='add'>+    INIT_LIST_HEAD(&amp;list);</div><div class='ctx'> </div><div class='del'>-        if (ret != 0)</div><div class='del'>-                syncenv_destroy (newenv);</div><div class='add'>+    pthread_mutex_lock(&amp;cond-&gt;pmutex);</div><div class='ctx'> </div><div class='del'>-        return newenv;</div><div class='add'>+    list_splice_init(&amp;cond-&gt;waitq, &amp;list);</div><div class='add'>+    pthread_cond_broadcast(&amp;cond-&gt;pcond);</div><div class='add'>+</div><div class='add'>+    pthread_mutex_unlock(&amp;cond-&gt;pmutex);</div><div class='add'>+</div><div class='add'>+    while (!list_empty(&amp;list)) {</div><div class='add'>+        task = list_first_entry(&amp;list, struct synctask, waitq);</div><div class='add'>+        list_del_init(&amp;task-&gt;waitq);</div><div class='add'>+</div><div class='add'>+        synctask_wake(task);</div><div class='add'>+    }</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+/* Barriers */</div><div class='ctx'> </div><div class='del'>-/* FOPS */</div><div class='add'>+int</div><div class='add'>+syncbarrier_init(struct syncbarrier *barrier)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+    if (!barrier) {</div><div class='add'>+        errno = EINVAL;</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='add'>+    ret = pthread_cond_init(&amp;barrier-&gt;cond, 0);</div><div class='add'>+    if (ret) {</div><div class='add'>+        errno = ret;</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+    barrier-&gt;count = 0;</div><div class='add'>+    barrier-&gt;waitfor = 0;</div><div class='add'>+    INIT_LIST_HEAD(&amp;barrier-&gt;waitq);</div><div class='add'>+</div><div class='add'>+    ret = pthread_mutex_init(&amp;barrier-&gt;guard, 0);</div><div class='add'>+    if (ret) {</div><div class='add'>+        (void)pthread_cond_destroy(&amp;barrier-&gt;cond);</div><div class='add'>+        errno = ret;</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+    barrier-&gt;initialized = _gf_true;</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-syncop_lookup_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-                   int op_ret, int op_errno, inode_t *inode,</div><div class='del'>-                   struct iatt *iatt, dict_t *xattr, struct iatt *parent)</div><div class='add'>+syncbarrier_destroy(struct syncbarrier *barrier)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+    int ret1 = 0;</div><div class='add'>+    if (!barrier) {</div><div class='add'>+        errno = EINVAL;</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (barrier-&gt;initialized) {</div><div class='add'>+        ret = pthread_cond_destroy(&amp;barrier-&gt;cond);</div><div class='add'>+        ret1 = pthread_mutex_destroy(&amp;barrier-&gt;guard);</div><div class='add'>+        barrier-&gt;initialized = _gf_false;</div><div class='add'>+    }</div><div class='add'>+    if (ret || ret1) {</div><div class='add'>+        errno = ret ? ret : ret1;</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+__syncbarrier_wait(struct syncbarrier *barrier, int waitfor)</div><div class='ctx'> {</div><div class='del'>-        struct syncargs *args = NULL;</div><div class='add'>+    struct synctask *task = NULL;</div><div class='ctx'> </div><div class='del'>-        args = cookie;</div><div class='add'>+    if (!barrier) {</div><div class='add'>+        errno = EINVAL;</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        args-&gt;op_ret   = op_ret;</div><div class='del'>-        args-&gt;op_errno = op_errno;</div><div class='add'>+    task = synctask_get();</div><div class='ctx'> </div><div class='del'>-        if (op_ret == 0) {</div><div class='del'>-                args-&gt;iatt1  = *iatt;</div><div class='del'>-                args-&gt;xattr  = xattr;</div><div class='del'>-                args-&gt;iatt2  = *parent;</div><div class='add'>+    while (barrier-&gt;count &lt; waitfor) {</div><div class='add'>+        if (task) {</div><div class='add'>+            /* called within a synctask */</div><div class='add'>+            list_add_tail(&amp;task-&gt;waitq, &amp;barrier-&gt;waitq);</div><div class='add'>+            pthread_mutex_unlock(&amp;barrier-&gt;guard);</div><div class='add'>+            synctask_yield(task, NULL);</div><div class='add'>+            pthread_mutex_lock(&amp;barrier-&gt;guard);</div><div class='add'>+        } else {</div><div class='add'>+            /* called by a non-synctask */</div><div class='add'>+            pthread_cond_wait(&amp;barrier-&gt;cond, &amp;barrier-&gt;guard);</div><div class='ctx'>         }</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        __wake (args);</div><div class='add'>+    barrier-&gt;count = 0;</div><div class='ctx'> </div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+syncbarrier_wait(struct syncbarrier *barrier, int waitfor)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    pthread_mutex_lock(&amp;barrier-&gt;guard);</div><div class='add'>+    {</div><div class='add'>+        ret = __syncbarrier_wait(barrier, waitfor);</div><div class='add'>+    }</div><div class='add'>+    pthread_mutex_unlock(&amp;barrier-&gt;guard);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+__syncbarrier_wake(struct syncbarrier *barrier)</div><div class='add'>+{</div><div class='add'>+    struct synctask *task = NULL;</div><div class='add'>+</div><div class='add'>+    if (!barrier) {</div><div class='add'>+        errno = EINVAL;</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    barrier-&gt;count++;</div><div class='add'>+    if (barrier-&gt;waitfor &amp;&amp; (barrier-&gt;count &lt; barrier-&gt;waitfor))</div><div class='ctx'>         return 0;</div><div class='add'>+</div><div class='add'>+    pthread_cond_signal(&amp;barrier-&gt;cond);</div><div class='add'>+    if (!list_empty(&amp;barrier-&gt;waitq)) {</div><div class='add'>+        task = list_entry(barrier-&gt;waitq.next, struct synctask, waitq);</div><div class='add'>+        list_del_init(&amp;task-&gt;waitq);</div><div class='add'>+        synctask_wake(task);</div><div class='add'>+    }</div><div class='add'>+    barrier-&gt;waitfor = 0;</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+syncbarrier_wake(struct syncbarrier *barrier)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    pthread_mutex_lock(&amp;barrier-&gt;guard);</div><div class='add'>+    {</div><div class='add'>+        ret = __syncbarrier_wake(barrier);</div><div class='add'>+    }</div><div class='add'>+    pthread_mutex_unlock(&amp;barrier-&gt;guard);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+/* FOPS */</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-syncop_lookup (xlator_t *subvol, loc_t *loc, dict_t *xattr_req,</div><div class='del'>-               struct iatt *iatt, dict_t **xattr_rsp, struct iatt *parent)</div><div class='add'>+syncop_lookup_cbk(call_frame_t *frame, void *cookie, xlator_t *this, int op_ret,</div><div class='add'>+                  int op_errno, inode_t *inode, struct iatt *iatt,</div><div class='add'>+                  dict_t *xdata, struct iatt *parent)</div><div class='ctx'> {</div><div class='del'>-        struct syncargs args = {0, };</div><div class='add'>+    struct syncargs *args = NULL;</div><div class='ctx'> </div><div class='del'>-        SYNCOP (subvol, (&amp;args), syncop_lookup_cbk, subvol-&gt;fops-&gt;lookup,</div><div class='del'>-                loc, xattr_req);</div><div class='add'>+    args = cookie;</div><div class='ctx'> </div><div class='del'>-        if (iatt)</div><div class='del'>-                *iatt = args.iatt1;</div><div class='del'>-        if (xattr_rsp)</div><div class='del'>-                *xattr_rsp = args.xattr;</div><div class='del'>-        if (parent)</div><div class='del'>-                *parent = args.iatt2;</div><div class='add'>+    args-&gt;op_ret = op_ret;</div><div class='add'>+    args-&gt;op_errno = op_errno;</div><div class='add'>+    if (xdata)</div><div class='add'>+        args-&gt;xdata = dict_ref(xdata);</div><div class='ctx'> </div><div class='del'>-        errno = args.op_errno;</div><div class='del'>-        return args.op_ret;</div><div class='add'>+    if (op_ret == 0) {</div><div class='add'>+        args-&gt;iatt1 = *iatt;</div><div class='add'>+        args-&gt;iatt2 = *parent;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    __wake(args);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+syncop_lookup(xlator_t *subvol, loc_t *loc, struct iatt *iatt,</div><div class='add'>+              struct iatt *parent, dict_t *xdata_in, dict_t **xdata_out)</div><div class='add'>+{</div><div class='add'>+    struct syncargs args = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    SYNCOP(subvol, (&amp;args), syncop_lookup_cbk, subvol-&gt;fops-&gt;lookup, loc,</div><div class='add'>+           xdata_in);</div><div class='add'>+</div><div class='add'>+    if (iatt)</div><div class='add'>+        *iatt = args.iatt1;</div><div class='add'>+    if (parent)</div><div class='add'>+        *parent = args.iatt2;</div><div class='add'>+    if (xdata_out)</div><div class='add'>+        *xdata_out = args.xdata;</div><div class='add'>+    else if (args.xdata)</div><div class='add'>+        dict_unref(args.xdata);</div><div class='add'>+</div><div class='add'>+    if (args.op_ret &lt; 0)</div><div class='add'>+        return -args.op_errno;</div><div class='add'>+    return args.op_ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-static gf_dirent_t *</div><div class='del'>-entry_copy (gf_dirent_t *source)</div><div class='add'>+int32_t</div><div class='add'>+syncop_readdirp_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                    int32_t op_ret, int32_t op_errno, gf_dirent_t *entries,</div><div class='add'>+                    dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-        gf_dirent_t *sink = NULL;</div><div class='add'>+    struct syncargs *args = NULL;</div><div class='add'>+    gf_dirent_t *entry = NULL;</div><div class='add'>+    gf_dirent_t *tmp = NULL;</div><div class='add'>+</div><div class='add'>+    int count = 0;</div><div class='add'>+</div><div class='add'>+    args = cookie;</div><div class='add'>+</div><div class='add'>+    INIT_LIST_HEAD(&amp;args-&gt;entries.list);</div><div class='ctx'> </div><div class='del'>-        sink = gf_dirent_for_name (source-&gt;d_name);</div><div class='add'>+    args-&gt;op_ret = op_ret;</div><div class='add'>+    args-&gt;op_errno = op_errno;</div><div class='add'>+    if (xdata)</div><div class='add'>+        args-&gt;xdata = dict_ref(xdata);</div><div class='ctx'> </div><div class='del'>-        sink-&gt;d_off = source-&gt;d_off;</div><div class='del'>-        sink-&gt;d_ino = source-&gt;d_ino;</div><div class='del'>-        sink-&gt;d_type = source-&gt;d_type;</div><div class='add'>+    if (op_ret &gt;= 0) {</div><div class='add'>+        list_for_each_entry(entry, &amp;entries-&gt;list, list)</div><div class='add'>+        {</div><div class='add'>+            tmp = entry_copy(entry);</div><div class='add'>+            if (!tmp) {</div><div class='add'>+                args-&gt;op_ret = -1;</div><div class='add'>+                args-&gt;op_errno = ENOMEM;</div><div class='add'>+                gf_dirent_free(&amp;(args-&gt;entries));</div><div class='add'>+                break;</div><div class='add'>+            }</div><div class='add'>+            gf_msg_trace(this-&gt;name, 0,</div><div class='add'>+                         "adding entry=%s, "</div><div class='add'>+                         "count=%d",</div><div class='add'>+                         tmp-&gt;d_name, count);</div><div class='add'>+            list_add_tail(&amp;tmp-&gt;list, &amp;(args-&gt;entries.list));</div><div class='add'>+            count++;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    __wake(args);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        return sink;</div><div class='add'>+int</div><div class='add'>+syncop_readdirp(xlator_t *subvol, fd_t *fd, size_t size, off_t off,</div><div class='add'>+                gf_dirent_t *entries, dict_t *xdata_in, dict_t **xdata_out)</div><div class='add'>+{</div><div class='add'>+    struct syncargs args = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    SYNCOP(subvol, (&amp;args), syncop_readdirp_cbk, subvol-&gt;fops-&gt;readdirp, fd,</div><div class='add'>+           size, off, xdata_in);</div><div class='add'>+</div><div class='add'>+    if (entries)</div><div class='add'>+        list_splice_init(&amp;args.entries.list, &amp;entries-&gt;list);</div><div class='add'>+    else</div><div class='add'>+        gf_dirent_free(&amp;args.entries);</div><div class='add'>+</div><div class='add'>+    if (xdata_out)</div><div class='add'>+        *xdata_out = args.xdata;</div><div class='add'>+    else if (args.xdata)</div><div class='add'>+        dict_unref(args.xdata);</div><div class='add'>+</div><div class='add'>+    if (args.op_ret &lt; 0)</div><div class='add'>+        return -args.op_errno;</div><div class='add'>+    return args.op_ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> int32_t</div><div class='del'>-syncop_readdirp_cbk (call_frame_t *frame,</div><div class='del'>-		      void *cookie,</div><div class='del'>-		      xlator_t *this,</div><div class='del'>-		      int32_t op_ret,</div><div class='del'>-		      int32_t op_errno,</div><div class='del'>-		      gf_dirent_t *entries)</div><div class='del'>-{</div><div class='del'>-        struct syncargs *args = NULL;</div><div class='del'>-        gf_dirent_t *entry = NULL;</div><div class='del'>-        gf_dirent_t  *tmp = NULL;</div><div class='del'>-</div><div class='del'>-        int count = 0;</div><div class='del'>-</div><div class='del'>-        args = cookie;</div><div class='del'>-</div><div class='del'>-        INIT_LIST_HEAD (&amp;args-&gt;entries.list);</div><div class='del'>-</div><div class='del'>-        args-&gt;op_ret   = op_ret;</div><div class='del'>-        args-&gt;op_errno = op_errno;</div><div class='del'>-</div><div class='del'>-        if (op_ret &gt;= 0) {</div><div class='del'>-                list_for_each_entry (entry, &amp;entries-&gt;list, list) {</div><div class='del'>-                        tmp = entry_copy (entry);</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_TRACE,</div><div class='del'>-                                "adding entry=%s, count=%d",</div><div class='del'>-                                tmp-&gt;d_name, count);</div><div class='del'>-                        list_add_tail (&amp;tmp-&gt;list, &amp;(args-&gt;entries.list));</div><div class='del'>-                        count++;</div><div class='del'>-                }</div><div class='add'>+syncop_readdir_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                   int32_t op_ret, int32_t op_errno, gf_dirent_t *entries,</div><div class='add'>+                   dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    struct syncargs *args = NULL;</div><div class='add'>+    gf_dirent_t *entry = NULL;</div><div class='add'>+    gf_dirent_t *tmp = NULL;</div><div class='add'>+</div><div class='add'>+    int count = 0;</div><div class='add'>+</div><div class='add'>+    args = cookie;</div><div class='add'>+</div><div class='add'>+    INIT_LIST_HEAD(&amp;args-&gt;entries.list);</div><div class='add'>+</div><div class='add'>+    args-&gt;op_ret = op_ret;</div><div class='add'>+    args-&gt;op_errno = op_errno;</div><div class='add'>+    if (xdata)</div><div class='add'>+        args-&gt;xdata = dict_ref(xdata);</div><div class='add'>+</div><div class='add'>+    if (op_ret &gt;= 0) {</div><div class='add'>+        list_for_each_entry(entry, &amp;entries-&gt;list, list)</div><div class='add'>+        {</div><div class='add'>+            tmp = entry_copy(entry);</div><div class='add'>+            if (!tmp) {</div><div class='add'>+                args-&gt;op_ret = -1;</div><div class='add'>+                args-&gt;op_errno = ENOMEM;</div><div class='add'>+                gf_dirent_free(&amp;(args-&gt;entries));</div><div class='add'>+                break;</div><div class='add'>+            }</div><div class='add'>+            gf_msg_trace(this-&gt;name, 0,</div><div class='add'>+                         "adding "</div><div class='add'>+                         "entry=%s, count=%d",</div><div class='add'>+                         tmp-&gt;d_name, count);</div><div class='add'>+            list_add_tail(&amp;tmp-&gt;list, &amp;(args-&gt;entries.list));</div><div class='add'>+            count++;</div><div class='ctx'>         }</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        __wake (args);</div><div class='add'>+    __wake(args);</div><div class='ctx'> </div><div class='del'>-        return 0;</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+syncop_readdir(xlator_t *subvol, fd_t *fd, size_t size, off_t off,</div><div class='add'>+               gf_dirent_t *entries, dict_t *xdata_in, dict_t **xdata_out)</div><div class='add'>+{</div><div class='add'>+    struct syncargs args = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    SYNCOP(subvol, (&amp;args), syncop_readdir_cbk, subvol-&gt;fops-&gt;readdir, fd, size,</div><div class='add'>+           off, xdata_in);</div><div class='add'>+</div><div class='add'>+    if (entries)</div><div class='add'>+        list_splice_init(&amp;args.entries.list, &amp;entries-&gt;list);</div><div class='add'>+    else</div><div class='add'>+        gf_dirent_free(&amp;args.entries);</div><div class='add'>+</div><div class='add'>+    if (xdata_out)</div><div class='add'>+        *xdata_out = args.xdata;</div><div class='add'>+    else if (args.xdata)</div><div class='add'>+        dict_unref(args.xdata);</div><div class='add'>+</div><div class='add'>+    if (args.op_ret &lt; 0)</div><div class='add'>+        return -args.op_errno;</div><div class='add'>+    return args.op_ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+syncop_opendir_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                   int32_t op_ret, int32_t op_errno, fd_t *fd, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    struct syncargs *args = NULL;</div><div class='add'>+</div><div class='add'>+    args = cookie;</div><div class='add'>+</div><div class='add'>+    args-&gt;op_ret = op_ret;</div><div class='add'>+    args-&gt;op_errno = op_errno;</div><div class='add'>+    if (xdata)</div><div class='add'>+        args-&gt;xdata = dict_ref(xdata);</div><div class='ctx'> </div><div class='add'>+    __wake(args);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-syncop_readdirp (xlator_t *subvol,</div><div class='del'>-		 fd_t *fd,</div><div class='del'>-		 size_t size,</div><div class='del'>-		 off_t off,</div><div class='del'>-                 gf_dirent_t *entries)</div><div class='add'>+syncop_opendir(xlator_t *subvol, loc_t *loc, fd_t *fd, dict_t *xdata_in,</div><div class='add'>+               dict_t **xdata_out)</div><div class='ctx'> {</div><div class='del'>-        struct syncargs args = {0, };</div><div class='add'>+    struct syncargs args = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='ctx'> </div><div class='del'>-        SYNCOP (subvol, (&amp;args), syncop_readdirp_cbk, subvol-&gt;fops-&gt;readdirp,</div><div class='del'>-                fd, size, off);</div><div class='add'>+    SYNCOP(subvol, (&amp;args), syncop_opendir_cbk, subvol-&gt;fops-&gt;opendir, loc, fd,</div><div class='add'>+           xdata_in);</div><div class='ctx'> </div><div class='del'>-        if (entries)</div><div class='del'>-                list_splice_init (&amp;args.entries.list, &amp;entries-&gt;list);</div><div class='add'>+    if (xdata_out)</div><div class='add'>+        *xdata_out = args.xdata;</div><div class='add'>+    else if (args.xdata)</div><div class='add'>+        dict_unref(args.xdata);</div><div class='ctx'> </div><div class='del'>-        errno = args.op_errno;</div><div class='del'>-        return args.op_ret;</div><div class='add'>+    if (args.op_ret &lt; 0)</div><div class='add'>+        return -args.op_errno;</div><div class='add'>+    return args.op_ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+syncop_fsyncdir_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                    int op_ret, int op_errno, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    struct syncargs *args = NULL;</div><div class='add'>+</div><div class='add'>+    args = cookie;</div><div class='add'>+</div><div class='add'>+    args-&gt;op_ret = op_ret;</div><div class='add'>+    args-&gt;op_errno = op_errno;</div><div class='add'>+    if (xdata)</div><div class='add'>+        args-&gt;xdata = dict_ref(xdata);</div><div class='add'>+</div><div class='add'>+    __wake(args);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+syncop_fsyncdir(xlator_t *subvol, fd_t *fd, int datasync, dict_t *xdata_in,</div><div class='add'>+                dict_t **xdata_out)</div><div class='add'>+{</div><div class='add'>+    struct syncargs args = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    SYNCOP(subvol, (&amp;args), syncop_fsyncdir_cbk, subvol-&gt;fops-&gt;fsyncdir, fd,</div><div class='add'>+           datasync, xdata_in);</div><div class='add'>+</div><div class='add'>+    if (xdata_out)</div><div class='add'>+        *xdata_out = args.xdata;</div><div class='add'>+    else if (args.xdata)</div><div class='add'>+        dict_unref(args.xdata);</div><div class='add'>+</div><div class='add'>+    if (args.op_ret &lt; 0)</div><div class='add'>+        return -args.op_errno;</div><div class='add'>+    return args.op_ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+syncop_removexattr_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                       int op_ret, int op_errno, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    struct syncargs *args = NULL;</div><div class='add'>+</div><div class='add'>+    args = cookie;</div><div class='add'>+</div><div class='add'>+    args-&gt;op_ret = op_ret;</div><div class='add'>+    args-&gt;op_errno = op_errno;</div><div class='add'>+    if (xdata)</div><div class='add'>+        args-&gt;xdata = dict_ref(xdata);</div><div class='add'>+</div><div class='add'>+    __wake(args);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+syncop_removexattr(xlator_t *subvol, loc_t *loc, const char *name,</div><div class='add'>+                   dict_t *xdata_in, dict_t **xdata_out)</div><div class='add'>+{</div><div class='add'>+    struct syncargs args = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    SYNCOP(subvol, (&amp;args), syncop_removexattr_cbk, subvol-&gt;fops-&gt;removexattr,</div><div class='add'>+           loc, name, xdata_in);</div><div class='add'>+</div><div class='add'>+    if (xdata_out)</div><div class='add'>+        *xdata_out = args.xdata;</div><div class='add'>+    else if (args.xdata)</div><div class='add'>+        dict_unref(args.xdata);</div><div class='ctx'> </div><div class='add'>+    if (args.op_ret &lt; 0)</div><div class='add'>+        return -args.op_errno;</div><div class='add'>+    return args.op_ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+syncop_fremovexattr_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                        int op_ret, int op_errno, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    struct syncargs *args = NULL;</div><div class='add'>+</div><div class='add'>+    args = cookie;</div><div class='add'>+</div><div class='add'>+    args-&gt;op_ret = op_ret;</div><div class='add'>+    args-&gt;op_errno = op_errno;</div><div class='add'>+    if (xdata)</div><div class='add'>+        args-&gt;xdata = dict_ref(xdata);</div><div class='add'>+</div><div class='add'>+    __wake(args);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+syncop_fremovexattr(xlator_t *subvol, fd_t *fd, const char *name,</div><div class='add'>+                    dict_t *xdata_in, dict_t **xdata_out)</div><div class='add'>+{</div><div class='add'>+    struct syncargs args = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    SYNCOP(subvol, (&amp;args), syncop_fremovexattr_cbk, subvol-&gt;fops-&gt;fremovexattr,</div><div class='add'>+           fd, name, xdata_in);</div><div class='add'>+</div><div class='add'>+    if (xdata_out)</div><div class='add'>+        *xdata_out = args.xdata;</div><div class='add'>+    else if (args.xdata)</div><div class='add'>+        dict_unref(args.xdata);</div><div class='add'>+</div><div class='add'>+    if (args.op_ret &lt; 0)</div><div class='add'>+        return -args.op_errno;</div><div class='add'>+    return args.op_ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+syncop_setxattr_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                    int op_ret, int op_errno, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    struct syncargs *args = NULL;</div><div class='add'>+</div><div class='add'>+    args = cookie;</div><div class='add'>+</div><div class='add'>+    args-&gt;op_ret = op_ret;</div><div class='add'>+    args-&gt;op_errno = op_errno;</div><div class='add'>+    if (xdata)</div><div class='add'>+        args-&gt;xdata = dict_ref(xdata);</div><div class='add'>+</div><div class='add'>+    __wake(args);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+syncop_setxattr(xlator_t *subvol, loc_t *loc, dict_t *dict, int32_t flags,</div><div class='add'>+                dict_t *xdata_in, dict_t **xdata_out)</div><div class='add'>+{</div><div class='add'>+    struct syncargs args = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    SYNCOP(subvol, (&amp;args), syncop_setxattr_cbk, subvol-&gt;fops-&gt;setxattr, loc,</div><div class='add'>+           dict, flags, xdata_in);</div><div class='add'>+</div><div class='add'>+    if (xdata_out)</div><div class='add'>+        *xdata_out = args.xdata;</div><div class='add'>+    else if (args.xdata)</div><div class='add'>+        dict_unref(args.xdata);</div><div class='add'>+</div><div class='add'>+    if (args.op_ret &lt; 0)</div><div class='add'>+        return -args.op_errno;</div><div class='add'>+    return args.op_ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+syncop_fsetxattr_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                     int op_ret, int op_errno, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    struct syncargs *args = NULL;</div><div class='add'>+</div><div class='add'>+    args = cookie;</div><div class='add'>+</div><div class='add'>+    args-&gt;op_ret = op_ret;</div><div class='add'>+    args-&gt;op_errno = op_errno;</div><div class='add'>+    if (xdata)</div><div class='add'>+        args-&gt;xdata = dict_ref(xdata);</div><div class='add'>+</div><div class='add'>+    __wake(args);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+syncop_fsetxattr(xlator_t *subvol, fd_t *fd, dict_t *dict, int32_t flags,</div><div class='add'>+                 dict_t *xdata_in, dict_t **xdata_out)</div><div class='add'>+{</div><div class='add'>+    struct syncargs args = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    SYNCOP(subvol, (&amp;args), syncop_fsetxattr_cbk, subvol-&gt;fops-&gt;fsetxattr, fd,</div><div class='add'>+           dict, flags, xdata_in);</div><div class='add'>+</div><div class='add'>+    if (xdata_out)</div><div class='add'>+        *xdata_out = args.xdata;</div><div class='add'>+    else if (args.xdata)</div><div class='add'>+        dict_unref(args.xdata);</div><div class='add'>+</div><div class='add'>+    if (args.op_ret &lt; 0)</div><div class='add'>+        return -args.op_errno;</div><div class='add'>+    return args.op_ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+syncop_getxattr_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                    int op_ret, int op_errno, dict_t *dict, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    struct syncargs *args = NULL;</div><div class='add'>+</div><div class='add'>+    args = cookie;</div><div class='add'>+</div><div class='add'>+    args-&gt;op_ret = op_ret;</div><div class='add'>+    args-&gt;op_errno = op_errno;</div><div class='add'>+    if (xdata)</div><div class='add'>+        args-&gt;xdata = dict_ref(xdata);</div><div class='add'>+</div><div class='add'>+    if (op_ret &gt;= 0)</div><div class='add'>+        args-&gt;xattr = dict_ref(dict);</div><div class='add'>+</div><div class='add'>+    __wake(args);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+syncop_listxattr(xlator_t *subvol, loc_t *loc, dict_t **dict, dict_t *xdata_in,</div><div class='add'>+                 dict_t **xdata_out)</div><div class='add'>+{</div><div class='add'>+    struct syncargs args = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    SYNCOP(subvol, (&amp;args), syncop_getxattr_cbk, subvol-&gt;fops-&gt;getxattr, loc,</div><div class='add'>+           NULL, xdata_in);</div><div class='add'>+</div><div class='add'>+    if (dict)</div><div class='add'>+        *dict = args.xattr;</div><div class='add'>+    else if (args.xattr)</div><div class='add'>+        dict_unref(args.xattr);</div><div class='add'>+</div><div class='add'>+    if (xdata_out)</div><div class='add'>+        *xdata_out = args.xdata;</div><div class='add'>+    else if (args.xdata)</div><div class='add'>+        dict_unref(args.xdata);</div><div class='add'>+</div><div class='add'>+    if (args.op_ret &lt; 0)</div><div class='add'>+        return -args.op_errno;</div><div class='add'>+    return args.op_ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+syncop_getxattr(xlator_t *subvol, loc_t *loc, dict_t **dict, const char *key,</div><div class='add'>+                dict_t *xdata_in, dict_t **xdata_out)</div><div class='add'>+{</div><div class='add'>+    struct syncargs args = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    SYNCOP(subvol, (&amp;args), syncop_getxattr_cbk, subvol-&gt;fops-&gt;getxattr, loc,</div><div class='add'>+           key, xdata_in);</div><div class='add'>+</div><div class='add'>+    if (dict)</div><div class='add'>+        *dict = args.xattr;</div><div class='add'>+    else if (args.xattr)</div><div class='add'>+        dict_unref(args.xattr);</div><div class='add'>+</div><div class='add'>+    if (xdata_out)</div><div class='add'>+        *xdata_out = args.xdata;</div><div class='add'>+    else if (args.xdata)</div><div class='add'>+        dict_unref(args.xdata);</div><div class='add'>+</div><div class='add'>+    if (args.op_ret &lt; 0)</div><div class='add'>+        return -args.op_errno;</div><div class='add'>+    return args.op_ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+syncop_fgetxattr(xlator_t *subvol, fd_t *fd, dict_t **dict, const char *key,</div><div class='add'>+                 dict_t *xdata_in, dict_t **xdata_out)</div><div class='add'>+{</div><div class='add'>+    struct syncargs args = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    SYNCOP(subvol, (&amp;args), syncop_getxattr_cbk, subvol-&gt;fops-&gt;fgetxattr, fd,</div><div class='add'>+           key, xdata_in);</div><div class='add'>+</div><div class='add'>+    if (dict)</div><div class='add'>+        *dict = args.xattr;</div><div class='add'>+    else if (args.xattr)</div><div class='add'>+        dict_unref(args.xattr);</div><div class='add'>+</div><div class='add'>+    if (xdata_out)</div><div class='add'>+        *xdata_out = args.xdata;</div><div class='add'>+    else if (args.xdata)</div><div class='add'>+        dict_unref(args.xdata);</div><div class='add'>+</div><div class='add'>+    if (args.op_ret &lt; 0)</div><div class='add'>+        return -args.op_errno;</div><div class='add'>+    return args.op_ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+syncop_statfs_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                  int32_t op_ret, int32_t op_errno, struct statvfs *buf,</div><div class='add'>+                  dict_t *xdata)</div><div class='add'>+</div><div class='add'>+{</div><div class='add'>+    struct syncargs *args = NULL;</div><div class='add'>+</div><div class='add'>+    args = cookie;</div><div class='add'>+</div><div class='add'>+    args-&gt;op_ret = op_ret;</div><div class='add'>+    args-&gt;op_errno = op_errno;</div><div class='add'>+    if (xdata)</div><div class='add'>+        args-&gt;xdata = dict_ref(xdata);</div><div class='add'>+</div><div class='add'>+    if (op_ret == 0) {</div><div class='add'>+        args-&gt;statvfs_buf = *buf;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    __wake(args);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+syncop_statfs(xlator_t *subvol, loc_t *loc, struct statvfs *buf,</div><div class='add'>+              dict_t *xdata_in, dict_t **xdata_out)</div><div class='add'>+</div><div class='add'>+{</div><div class='add'>+    struct syncargs args = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    SYNCOP(subvol, (&amp;args), syncop_statfs_cbk, subvol-&gt;fops-&gt;statfs, loc,</div><div class='add'>+           xdata_in);</div><div class='add'>+</div><div class='add'>+    if (buf)</div><div class='add'>+        *buf = args.statvfs_buf;</div><div class='add'>+    if (xdata_out)</div><div class='add'>+        *xdata_out = args.xdata;</div><div class='add'>+    else if (args.xdata)</div><div class='add'>+        dict_unref(args.xdata);</div><div class='add'>+</div><div class='add'>+    if (args.op_ret &lt; 0)</div><div class='add'>+        return -args.op_errno;</div><div class='add'>+    return args.op_ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+syncop_setattr_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                   int op_ret, int op_errno, struct iatt *preop,</div><div class='add'>+                   struct iatt *postop, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    struct syncargs *args = NULL;</div><div class='add'>+</div><div class='add'>+    args = cookie;</div><div class='add'>+</div><div class='add'>+    args-&gt;op_ret = op_ret;</div><div class='add'>+    args-&gt;op_errno = op_errno;</div><div class='add'>+    if (xdata)</div><div class='add'>+        args-&gt;xdata = dict_ref(xdata);</div><div class='add'>+</div><div class='add'>+    if (op_ret == 0) {</div><div class='add'>+        args-&gt;iatt1 = *preop;</div><div class='add'>+        args-&gt;iatt2 = *postop;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    __wake(args);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+syncop_setattr(xlator_t *subvol, loc_t *loc, struct iatt *iatt, int valid,</div><div class='add'>+               struct iatt *preop, struct iatt *postop, dict_t *xdata_in,</div><div class='add'>+               dict_t **xdata_out)</div><div class='add'>+{</div><div class='add'>+    struct syncargs args = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    SYNCOP(subvol, (&amp;args), syncop_setattr_cbk, subvol-&gt;fops-&gt;setattr, loc,</div><div class='add'>+           iatt, valid, xdata_in);</div><div class='add'>+</div><div class='add'>+    if (preop)</div><div class='add'>+        *preop = args.iatt1;</div><div class='add'>+    if (postop)</div><div class='add'>+        *postop = args.iatt2;</div><div class='add'>+</div><div class='add'>+    if (xdata_out)</div><div class='add'>+        *xdata_out = args.xdata;</div><div class='add'>+    else if (args.xdata)</div><div class='add'>+        dict_unref(args.xdata);</div><div class='add'>+</div><div class='add'>+    if (args.op_ret &lt; 0)</div><div class='add'>+        return -args.op_errno;</div><div class='add'>+    return args.op_ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+syncop_fsetattr(xlator_t *subvol, fd_t *fd, struct iatt *iatt, int valid,</div><div class='add'>+                struct iatt *preop, struct iatt *postop, dict_t *xdata_in,</div><div class='add'>+                dict_t **xdata_out)</div><div class='add'>+{</div><div class='add'>+    struct syncargs args = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    SYNCOP(subvol, (&amp;args), syncop_setattr_cbk, subvol-&gt;fops-&gt;fsetattr, fd,</div><div class='add'>+           iatt, valid, xdata_in);</div><div class='add'>+</div><div class='add'>+    if (preop)</div><div class='add'>+        *preop = args.iatt1;</div><div class='add'>+    if (postop)</div><div class='add'>+        *postop = args.iatt2;</div><div class='add'>+</div><div class='add'>+    if (xdata_out)</div><div class='add'>+        *xdata_out = args.xdata;</div><div class='add'>+    else if (args.xdata)</div><div class='add'>+        dict_unref(args.xdata);</div><div class='add'>+</div><div class='add'>+    if (args.op_ret &lt; 0)</div><div class='add'>+        return -args.op_errno;</div><div class='add'>+    return args.op_ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> int32_t</div><div class='del'>-syncop_opendir_cbk (call_frame_t *frame,</div><div class='del'>-                    void *cookie,</div><div class='del'>-                    xlator_t *this,</div><div class='del'>-                    int32_t op_ret,</div><div class='del'>-                    int32_t op_errno,</div><div class='del'>-                    fd_t *fd)</div><div class='add'>+syncop_open_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                int32_t op_ret, int32_t op_errno, fd_t *fd, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-        struct syncargs *args = NULL;</div><div class='add'>+    struct syncargs *args = NULL;</div><div class='ctx'> </div><div class='del'>-        args = cookie;</div><div class='add'>+    args = cookie;</div><div class='ctx'> </div><div class='del'>-        args-&gt;op_ret   = op_ret;</div><div class='del'>-        args-&gt;op_errno = op_errno;</div><div class='add'>+    args-&gt;op_ret = op_ret;</div><div class='add'>+    args-&gt;op_errno = op_errno;</div><div class='add'>+    if (xdata)</div><div class='add'>+        args-&gt;xdata = dict_ref(xdata);</div><div class='ctx'> </div><div class='del'>-        __wake (args);</div><div class='add'>+    __wake(args);</div><div class='ctx'> </div><div class='del'>-        return 0;</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-syncop_opendir (xlator_t *subvol,</div><div class='del'>-                loc_t *loc,</div><div class='del'>-                fd_t *fd)</div><div class='add'>+syncop_open(xlator_t *subvol, loc_t *loc, int32_t flags, fd_t *fd,</div><div class='add'>+            dict_t *xdata_in, dict_t **xdata_out)</div><div class='ctx'> {</div><div class='del'>-        struct syncargs args = {0, };</div><div class='add'>+    struct syncargs args = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='ctx'> </div><div class='del'>-        SYNCOP (subvol, (&amp;args), syncop_opendir_cbk, subvol-&gt;fops-&gt;opendir,</div><div class='del'>-                loc, fd);</div><div class='add'>+    SYNCOP(subvol, (&amp;args), syncop_open_cbk, subvol-&gt;fops-&gt;open, loc, flags, fd,</div><div class='add'>+           xdata_in);</div><div class='ctx'> </div><div class='del'>-        errno = args.op_errno;</div><div class='del'>-        return args.op_ret;</div><div class='add'>+    if (xdata_out)</div><div class='add'>+        *xdata_out = args.xdata;</div><div class='add'>+    else if (args.xdata)</div><div class='add'>+        dict_unref(args.xdata);</div><div class='ctx'> </div><div class='add'>+    if (args.op_ret &lt; 0)</div><div class='add'>+        return -args.op_errno;</div><div class='add'>+    return args.op_ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+int32_t</div><div class='add'>+syncop_readv_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                 int32_t op_ret, int32_t op_errno, struct iovec *vector,</div><div class='add'>+                 int32_t count, struct iatt *stbuf, struct iobref *iobref,</div><div class='add'>+                 dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    struct syncargs *args = NULL;</div><div class='add'>+</div><div class='add'>+    args = cookie;</div><div class='add'>+</div><div class='add'>+    INIT_LIST_HEAD(&amp;args-&gt;entries.list);</div><div class='add'>+</div><div class='add'>+    args-&gt;op_ret = op_ret;</div><div class='add'>+    args-&gt;op_errno = op_errno;</div><div class='add'>+    if (xdata)</div><div class='add'>+        args-&gt;xdata = dict_ref(xdata);</div><div class='add'>+</div><div class='add'>+    if (args-&gt;op_ret &gt;= 0) {</div><div class='add'>+        if (iobref)</div><div class='add'>+            args-&gt;iobref = iobref_ref(iobref);</div><div class='add'>+        args-&gt;vector = iov_dup(vector, count);</div><div class='add'>+        args-&gt;count = count;</div><div class='add'>+        args-&gt;iatt1 = *stbuf;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    __wake(args);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-syncop_setxattr_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-                     int op_ret, int op_errno)</div><div class='add'>+syncop_readv(xlator_t *subvol, fd_t *fd, size_t size, off_t off, uint32_t flags,</div><div class='add'>+             struct iovec **vector, int *count, struct iobref **iobref,</div><div class='add'>+             struct iatt *iatt, dict_t *xdata_in, dict_t **xdata_out)</div><div class='ctx'> {</div><div class='del'>-        struct syncargs *args = NULL;</div><div class='add'>+    struct syncargs args = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    SYNCOP(subvol, (&amp;args), syncop_readv_cbk, subvol-&gt;fops-&gt;readv, fd, size,</div><div class='add'>+           off, flags, xdata_in);</div><div class='add'>+</div><div class='add'>+    if (xdata_out)</div><div class='add'>+        *xdata_out = args.xdata;</div><div class='add'>+    else if (args.xdata)</div><div class='add'>+        dict_unref(args.xdata);</div><div class='add'>+</div><div class='add'>+    if (iatt)</div><div class='add'>+        *iatt = args.iatt1;</div><div class='add'>+</div><div class='add'>+    if (args.op_ret &lt; 0)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    if (vector)</div><div class='add'>+        *vector = args.vector;</div><div class='add'>+    else</div><div class='add'>+        GF_FREE(args.vector);</div><div class='add'>+</div><div class='add'>+    if (count)</div><div class='add'>+        *count = args.count;</div><div class='add'>+</div><div class='add'>+    /* Do we need a 'ref' here? */</div><div class='add'>+    if (iobref)</div><div class='add'>+        *iobref = args.iobref;</div><div class='add'>+    else if (args.iobref)</div><div class='add'>+        iobref_unref(args.iobref);</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (args.op_ret &lt; 0)</div><div class='add'>+        return -args.op_errno;</div><div class='add'>+    return args.op_ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        args = cookie;</div><div class='add'>+int</div><div class='add'>+syncop_writev_cbk(call_frame_t *frame, void *cookie, xlator_t *this, int op_ret,</div><div class='add'>+                  int op_errno, struct iatt *prebuf, struct iatt *postbuf,</div><div class='add'>+                  dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    struct syncargs *args = NULL;</div><div class='ctx'> </div><div class='del'>-        args-&gt;op_ret   = op_ret;</div><div class='del'>-        args-&gt;op_errno = op_errno;</div><div class='add'>+    args = cookie;</div><div class='ctx'> </div><div class='del'>-        __wake (args);</div><div class='add'>+    args-&gt;op_ret = op_ret;</div><div class='add'>+    args-&gt;op_errno = op_errno;</div><div class='add'>+    if (xdata)</div><div class='add'>+        args-&gt;xdata = dict_ref(xdata);</div><div class='ctx'> </div><div class='del'>-        return 0;</div><div class='add'>+    if (op_ret &gt;= 0) {</div><div class='add'>+        args-&gt;iatt1 = *prebuf;</div><div class='add'>+        args-&gt;iatt2 = *postbuf;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    __wake(args);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+int</div><div class='add'>+syncop_writev(xlator_t *subvol, fd_t *fd, const struct iovec *vector,</div><div class='add'>+              int32_t count, off_t offset, struct iobref *iobref,</div><div class='add'>+              uint32_t flags, struct iatt *preiatt, struct iatt *postiatt,</div><div class='add'>+              dict_t *xdata_in, dict_t **xdata_out)</div><div class='add'>+{</div><div class='add'>+    struct syncargs args = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    SYNCOP(subvol, (&amp;args), syncop_writev_cbk, subvol-&gt;fops-&gt;writev, fd,</div><div class='add'>+           (struct iovec *)vector, count, offset, flags, iobref, xdata_in);</div><div class='add'>+</div><div class='add'>+    if (preiatt)</div><div class='add'>+        *preiatt = args.iatt1;</div><div class='add'>+    if (postiatt)</div><div class='add'>+        *postiatt = args.iatt2;</div><div class='add'>+</div><div class='add'>+    if (xdata_out)</div><div class='add'>+        *xdata_out = args.xdata;</div><div class='add'>+    else if (args.xdata)</div><div class='add'>+        dict_unref(args.xdata);</div><div class='add'>+</div><div class='add'>+    if (args.op_ret &lt; 0)</div><div class='add'>+        return -args.op_errno;</div><div class='add'>+    return args.op_ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-syncop_setxattr (xlator_t *subvol, loc_t *loc, dict_t *dict, int32_t flags)</div><div class='add'>+syncop_write(xlator_t *subvol, fd_t *fd, const char *buf, int size,</div><div class='add'>+             off_t offset, struct iobref *iobref, uint32_t flags,</div><div class='add'>+             dict_t *xdata_in, dict_t **xdata_out)</div><div class='ctx'> {</div><div class='del'>-        struct syncargs args = {0, };</div><div class='add'>+    struct syncargs args = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    struct iovec vec = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    vec.iov_len = size;</div><div class='add'>+    vec.iov_base = (void *)buf;</div><div class='add'>+</div><div class='add'>+    SYNCOP(subvol, (&amp;args), syncop_writev_cbk, subvol-&gt;fops-&gt;writev, fd, &amp;vec,</div><div class='add'>+           1, offset, flags, iobref, xdata_in);</div><div class='add'>+</div><div class='add'>+    if (xdata_out)</div><div class='add'>+        *xdata_out = args.xdata;</div><div class='add'>+    else if (args.xdata)</div><div class='add'>+        dict_unref(args.xdata);</div><div class='add'>+</div><div class='add'>+    if (args.op_ret &lt; 0)</div><div class='add'>+        return -args.op_errno;</div><div class='add'>+    return args.op_ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        SYNCOP (subvol, (&amp;args), syncop_setxattr_cbk, subvol-&gt;fops-&gt;setxattr,</div><div class='del'>-                loc, dict, flags);</div><div class='add'>+int</div><div class='add'>+syncop_close(fd_t *fd)</div><div class='add'>+{</div><div class='add'>+    if (fd)</div><div class='add'>+        fd_unref(fd);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        errno = args.op_errno;</div><div class='del'>-        return args.op_ret;</div><div class='add'>+int32_t</div><div class='add'>+syncop_create_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                  int32_t op_ret, int32_t op_errno, fd_t *fd, inode_t *inode,</div><div class='add'>+                  struct iatt *buf, struct iatt *preparent,</div><div class='add'>+                  struct iatt *postparent, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    struct syncargs *args = NULL;</div><div class='add'>+</div><div class='add'>+    args = cookie;</div><div class='add'>+</div><div class='add'>+    args-&gt;op_ret = op_ret;</div><div class='add'>+    args-&gt;op_errno = op_errno;</div><div class='add'>+    if (xdata)</div><div class='add'>+        args-&gt;xdata = dict_ref(xdata);</div><div class='add'>+</div><div class='add'>+    if (buf)</div><div class='add'>+        args-&gt;iatt1 = *buf;</div><div class='add'>+</div><div class='add'>+    __wake(args);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-syncop_statfs_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-		    int32_t op_ret, int32_t op_errno,</div><div class='del'>-		    struct statvfs *buf)</div><div class='add'>+syncop_create(xlator_t *subvol, loc_t *loc, int32_t flags, mode_t mode,</div><div class='add'>+              fd_t *fd, struct iatt *iatt, dict_t *xdata_in, dict_t **xdata_out)</div><div class='add'>+{</div><div class='add'>+    struct syncargs args = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    SYNCOP(subvol, (&amp;args), syncop_create_cbk, subvol-&gt;fops-&gt;create, loc, flags,</div><div class='add'>+           mode, 0, fd, xdata_in);</div><div class='add'>+</div><div class='add'>+    if (iatt)</div><div class='add'>+        *iatt = args.iatt1;</div><div class='add'>+</div><div class='add'>+    if (xdata_out)</div><div class='add'>+        *xdata_out = args.xdata;</div><div class='add'>+    else if (args.xdata)</div><div class='add'>+        dict_unref(args.xdata);</div><div class='add'>+</div><div class='add'>+    if (args.op_ret &lt; 0)</div><div class='add'>+        return -args.op_errno;</div><div class='add'>+    return args.op_ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='add'>+int32_t</div><div class='add'>+syncop_put_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+               int32_t op_ret, int32_t op_errno, inode_t *inode,</div><div class='add'>+               struct iatt *buf, struct iatt *preparent,</div><div class='add'>+               struct iatt *postparent, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-        struct syncargs *args = NULL;</div><div class='add'>+    struct syncargs *args = NULL;</div><div class='ctx'> </div><div class='del'>-        args = cookie;</div><div class='add'>+    args = cookie;</div><div class='ctx'> </div><div class='del'>-        args-&gt;op_ret   = op_ret;</div><div class='del'>-        args-&gt;op_errno = op_errno;</div><div class='add'>+    args-&gt;op_ret = op_ret;</div><div class='add'>+    args-&gt;op_errno = op_errno;</div><div class='add'>+    if (xdata)</div><div class='add'>+        args-&gt;xdata = dict_ref(xdata);</div><div class='ctx'> </div><div class='del'>-        if (op_ret == 0) {</div><div class='del'>-                args-&gt;statvfs_buf  = *buf;</div><div class='del'>-        }</div><div class='add'>+    if (buf)</div><div class='add'>+        args-&gt;iatt1 = *buf;</div><div class='ctx'> </div><div class='del'>-        __wake (args);</div><div class='add'>+    __wake(args);</div><div class='ctx'> </div><div class='del'>-        return 0;</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+syncop_put(xlator_t *subvol, loc_t *loc, mode_t mode, mode_t umask,</div><div class='add'>+           uint32_t flags, struct iovec *vector, int32_t count, off_t offset,</div><div class='add'>+           struct iobref *iobref, dict_t *xattr, struct iatt *iatt,</div><div class='add'>+           dict_t *xdata_in, dict_t **xdata_out)</div><div class='add'>+{</div><div class='add'>+    struct syncargs args = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    SYNCOP(subvol, (&amp;args), syncop_put_cbk, subvol-&gt;fops-&gt;put, loc, mode, umask,</div><div class='add'>+           flags, (struct iovec *)vector, count, offset, iobref, xattr,</div><div class='add'>+           xdata_in);</div><div class='add'>+</div><div class='add'>+    if (iatt)</div><div class='add'>+        *iatt = args.iatt1;</div><div class='add'>+</div><div class='add'>+    if (xdata_out)</div><div class='add'>+        *xdata_out = args.xdata;</div><div class='add'>+    else if (args.xdata)</div><div class='add'>+        dict_unref(args.xdata);</div><div class='add'>+</div><div class='add'>+    if (args.op_ret &lt; 0)</div><div class='add'>+        return -args.op_errno;</div><div class='add'>+    return args.op_ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+int</div><div class='add'>+syncop_unlink_cbk(call_frame_t *frame, void *cookie, xlator_t *this, int op_ret,</div><div class='add'>+                  int op_errno, struct iatt *preparent, struct iatt *postparent,</div><div class='add'>+                  dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    struct syncargs *args = NULL;</div><div class='add'>+</div><div class='add'>+    args = cookie;</div><div class='add'>+</div><div class='add'>+    args-&gt;op_ret = op_ret;</div><div class='add'>+    args-&gt;op_errno = op_errno;</div><div class='add'>+    if (xdata)</div><div class='add'>+        args-&gt;xdata = dict_ref(xdata);</div><div class='add'>+</div><div class='add'>+    __wake(args);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-syncop_statfs (xlator_t *subvol, loc_t *loc, struct statvfs *buf)</div><div class='add'>+syncop_unlink(xlator_t *subvol, loc_t *loc, dict_t *xdata_in,</div><div class='add'>+              dict_t **xdata_out)</div><div class='add'>+{</div><div class='add'>+    struct syncargs args = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    SYNCOP(subvol, (&amp;args), syncop_unlink_cbk, subvol-&gt;fops-&gt;unlink, loc, 0,</div><div class='add'>+           xdata_in);</div><div class='add'>+</div><div class='add'>+    if (xdata_out)</div><div class='add'>+        *xdata_out = args.xdata;</div><div class='add'>+    else if (args.xdata)</div><div class='add'>+        dict_unref(args.xdata);</div><div class='add'>+</div><div class='add'>+    if (args.op_ret &lt; 0)</div><div class='add'>+        return -args.op_errno;</div><div class='add'>+    return args.op_ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+syncop_rmdir_cbk(call_frame_t *frame, void *cookie, xlator_t *this, int op_ret,</div><div class='add'>+                 int op_errno, struct iatt *preparent, struct iatt *postparent,</div><div class='add'>+                 dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    struct syncargs *args = NULL;</div><div class='add'>+</div><div class='add'>+    args = cookie;</div><div class='add'>+</div><div class='add'>+    args-&gt;op_ret = op_ret;</div><div class='add'>+    args-&gt;op_errno = op_errno;</div><div class='add'>+    if (xdata)</div><div class='add'>+        args-&gt;xdata = dict_ref(xdata);</div><div class='add'>+</div><div class='add'>+    __wake(args);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+syncop_rmdir(xlator_t *subvol, loc_t *loc, int flags, dict_t *xdata_in,</div><div class='add'>+             dict_t **xdata_out)</div><div class='add'>+{</div><div class='add'>+    struct syncargs args = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    SYNCOP(subvol, (&amp;args), syncop_rmdir_cbk, subvol-&gt;fops-&gt;rmdir, loc, flags,</div><div class='add'>+           xdata_in);</div><div class='add'>+</div><div class='add'>+    if (xdata_out)</div><div class='add'>+        *xdata_out = args.xdata;</div><div class='add'>+    else if (args.xdata)</div><div class='add'>+        dict_unref(args.xdata);</div><div class='ctx'> </div><div class='add'>+    if (args.op_ret &lt; 0)</div><div class='add'>+        return -args.op_errno;</div><div class='add'>+    return args.op_ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+syncop_link_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                int32_t op_ret, int32_t op_errno, inode_t *inode,</div><div class='add'>+                struct iatt *buf, struct iatt *preparent,</div><div class='add'>+                struct iatt *postparent, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    struct syncargs *args = NULL;</div><div class='add'>+</div><div class='add'>+    args = cookie;</div><div class='add'>+</div><div class='add'>+    args-&gt;op_ret = op_ret;</div><div class='add'>+    args-&gt;op_errno = op_errno;</div><div class='add'>+    if (xdata)</div><div class='add'>+        args-&gt;xdata = dict_ref(xdata);</div><div class='add'>+</div><div class='add'>+    if (buf)</div><div class='add'>+        args-&gt;iatt1 = *buf;</div><div class='add'>+</div><div class='add'>+    __wake(args);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+syncop_link(xlator_t *subvol, loc_t *oldloc, loc_t *newloc, struct iatt *iatt,</div><div class='add'>+            dict_t *xdata_in, dict_t **xdata_out)</div><div class='add'>+{</div><div class='add'>+    struct syncargs args = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    SYNCOP(subvol, (&amp;args), syncop_link_cbk, subvol-&gt;fops-&gt;link, oldloc, newloc,</div><div class='add'>+           xdata_in);</div><div class='add'>+</div><div class='add'>+    if (iatt)</div><div class='add'>+        *iatt = args.iatt1;</div><div class='add'>+</div><div class='add'>+    if (xdata_out)</div><div class='add'>+        *xdata_out = args.xdata;</div><div class='add'>+    else if (args.xdata)</div><div class='add'>+        dict_unref(args.xdata);</div><div class='add'>+</div><div class='add'>+    if (args.op_ret &lt; 0)</div><div class='add'>+        return -args.op_errno;</div><div class='add'>+</div><div class='add'>+    return args.op_ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+syncop_rename_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                  int32_t op_ret, int32_t op_errno, struct iatt *buf,</div><div class='add'>+                  struct iatt *preoldparent, struct iatt *postoldparent,</div><div class='add'>+                  struct iatt *prenewparent, struct iatt *postnewparent,</div><div class='add'>+                  dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    struct syncargs *args = NULL;</div><div class='add'>+</div><div class='add'>+    args = cookie;</div><div class='add'>+</div><div class='add'>+    args-&gt;op_ret = op_ret;</div><div class='add'>+    args-&gt;op_errno = op_errno;</div><div class='add'>+    if (xdata)</div><div class='add'>+        args-&gt;xdata = dict_ref(xdata);</div><div class='add'>+</div><div class='add'>+    __wake(args);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+syncop_rename(xlator_t *subvol, loc_t *oldloc, loc_t *newloc, dict_t *xdata_in,</div><div class='add'>+              dict_t **xdata_out)</div><div class='add'>+{</div><div class='add'>+    struct syncargs args = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    SYNCOP(subvol, (&amp;args), syncop_rename_cbk, subvol-&gt;fops-&gt;rename, oldloc,</div><div class='add'>+           newloc, xdata_in);</div><div class='add'>+</div><div class='add'>+    if (xdata_out)</div><div class='add'>+        *xdata_out = args.xdata;</div><div class='add'>+    else if (args.xdata)</div><div class='add'>+        dict_unref(args.xdata);</div><div class='add'>+</div><div class='add'>+    if (args.op_ret &lt; 0)</div><div class='add'>+        return -args.op_errno;</div><div class='add'>+</div><div class='add'>+    return args.op_ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+syncop_ftruncate_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                     int op_ret, int op_errno, struct iatt *prebuf,</div><div class='add'>+                     struct iatt *postbuf, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    struct syncargs *args = NULL;</div><div class='add'>+</div><div class='add'>+    args = cookie;</div><div class='add'>+</div><div class='add'>+    args-&gt;op_ret = op_ret;</div><div class='add'>+    args-&gt;op_errno = op_errno;</div><div class='add'>+    if (xdata)</div><div class='add'>+        args-&gt;xdata = dict_ref(xdata);</div><div class='add'>+</div><div class='add'>+    if (op_ret &gt;= 0) {</div><div class='add'>+        args-&gt;iatt1 = *prebuf;</div><div class='add'>+        args-&gt;iatt2 = *postbuf;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    __wake(args);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+syncop_ftruncate(xlator_t *subvol, fd_t *fd, off_t offset, struct iatt *preiatt,</div><div class='add'>+                 struct iatt *postiatt, dict_t *xdata_in, dict_t **xdata_out)</div><div class='add'>+{</div><div class='add'>+    struct syncargs args = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    SYNCOP(subvol, (&amp;args), syncop_ftruncate_cbk, subvol-&gt;fops-&gt;ftruncate, fd,</div><div class='add'>+           offset, xdata_in);</div><div class='add'>+</div><div class='add'>+    if (preiatt)</div><div class='add'>+        *preiatt = args.iatt1;</div><div class='add'>+    if (postiatt)</div><div class='add'>+        *postiatt = args.iatt2;</div><div class='add'>+</div><div class='add'>+    if (xdata_out)</div><div class='add'>+        *xdata_out = args.xdata;</div><div class='add'>+    else if (args.xdata)</div><div class='add'>+        dict_unref(args.xdata);</div><div class='add'>+</div><div class='add'>+    if (args.op_ret &lt; 0)</div><div class='add'>+        return -args.op_errno;</div><div class='add'>+    return args.op_ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+syncop_truncate(xlator_t *subvol, loc_t *loc, off_t offset, dict_t *xdata_in,</div><div class='add'>+                dict_t **xdata_out)</div><div class='add'>+{</div><div class='add'>+    struct syncargs args = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    SYNCOP(subvol, (&amp;args), syncop_ftruncate_cbk, subvol-&gt;fops-&gt;truncate, loc,</div><div class='add'>+           offset, xdata_in);</div><div class='add'>+</div><div class='add'>+    if (xdata_out)</div><div class='add'>+        *xdata_out = args.xdata;</div><div class='add'>+    else if (args.xdata)</div><div class='add'>+        dict_unref(args.xdata);</div><div class='add'>+</div><div class='add'>+    if (args.op_ret &lt; 0)</div><div class='add'>+        return -args.op_errno;</div><div class='add'>+    return args.op_ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+syncop_fsync_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                 int32_t op_ret, int32_t op_errno, struct iatt *prebuf,</div><div class='add'>+                 struct iatt *postbuf, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-        struct syncargs args = {0, };</div><div class='add'>+    struct syncargs *args = NULL;</div><div class='ctx'> </div><div class='del'>-        SYNCOP (subvol, (&amp;args), syncop_statfs_cbk, subvol-&gt;fops-&gt;statfs,</div><div class='del'>-                loc);</div><div class='add'>+    args = cookie;</div><div class='ctx'> </div><div class='del'>-        if (buf)</div><div class='del'>-                *buf = args.statvfs_buf;</div><div class='add'>+    args-&gt;op_ret = op_ret;</div><div class='add'>+    args-&gt;op_errno = op_errno;</div><div class='add'>+    if (xdata)</div><div class='add'>+        args-&gt;xdata = dict_ref(xdata);</div><div class='ctx'> </div><div class='del'>-        errno = args.op_errno;</div><div class='add'>+    if (op_ret &gt;= 0) {</div><div class='add'>+        args-&gt;iatt1 = *prebuf;</div><div class='add'>+        args-&gt;iatt2 = *postbuf;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    __wake(args);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+syncop_fsync(xlator_t *subvol, fd_t *fd, int dataonly, struct iatt *preiatt,</div><div class='add'>+             struct iatt *postiatt, dict_t *xdata_in, dict_t **xdata_out)</div><div class='add'>+{</div><div class='add'>+    struct syncargs args = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    SYNCOP(subvol, (&amp;args), syncop_fsync_cbk, subvol-&gt;fops-&gt;fsync, fd, dataonly,</div><div class='add'>+           xdata_in);</div><div class='add'>+</div><div class='add'>+    if (preiatt)</div><div class='add'>+        *preiatt = args.iatt1;</div><div class='add'>+    if (postiatt)</div><div class='add'>+        *postiatt = args.iatt2;</div><div class='add'>+</div><div class='add'>+    if (xdata_out)</div><div class='add'>+        *xdata_out = args.xdata;</div><div class='add'>+    else if (args.xdata)</div><div class='add'>+        dict_unref(args.xdata);</div><div class='add'>+</div><div class='add'>+    if (args.op_ret &lt; 0)</div><div class='add'>+        return -args.op_errno;</div><div class='add'>+    return args.op_ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+syncop_flush_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                 int32_t op_ret, int32_t op_errno, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    struct syncargs *args = NULL;</div><div class='add'>+</div><div class='add'>+    args = cookie;</div><div class='add'>+</div><div class='add'>+    args-&gt;op_ret = op_ret;</div><div class='add'>+    args-&gt;op_errno = op_errno;</div><div class='add'>+    if (xdata)</div><div class='add'>+        args-&gt;xdata = dict_ref(xdata);</div><div class='add'>+</div><div class='add'>+    __wake(args);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+syncop_flush(xlator_t *subvol, fd_t *fd, dict_t *xdata_in, dict_t **xdata_out)</div><div class='add'>+{</div><div class='add'>+    struct syncargs args = {0};</div><div class='add'>+</div><div class='add'>+    SYNCOP(subvol, (&amp;args), syncop_flush_cbk, subvol-&gt;fops-&gt;flush, fd,</div><div class='add'>+           xdata_in);</div><div class='add'>+</div><div class='add'>+    if (xdata_out)</div><div class='add'>+        *xdata_out = args.xdata;</div><div class='add'>+    else if (args.xdata)</div><div class='add'>+        dict_unref(args.xdata);</div><div class='add'>+</div><div class='add'>+    if (args.op_ret &lt; 0)</div><div class='add'>+        return -args.op_errno;</div><div class='add'>+    return args.op_ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+syncop_fstat_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                 int32_t op_ret, int32_t op_errno, struct iatt *stbuf,</div><div class='add'>+                 dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    struct syncargs *args = NULL;</div><div class='add'>+</div><div class='add'>+    args = cookie;</div><div class='add'>+</div><div class='add'>+    args-&gt;op_ret = op_ret;</div><div class='add'>+    args-&gt;op_errno = op_errno;</div><div class='add'>+    if (xdata)</div><div class='add'>+        args-&gt;xdata = dict_ref(xdata);</div><div class='add'>+</div><div class='add'>+    if (op_ret == 0)</div><div class='add'>+        args-&gt;iatt1 = *stbuf;</div><div class='add'>+</div><div class='add'>+    __wake(args);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+syncop_fstat(xlator_t *subvol, fd_t *fd, struct iatt *stbuf, dict_t *xdata_in,</div><div class='add'>+             dict_t **xdata_out)</div><div class='add'>+{</div><div class='add'>+    struct syncargs args = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    SYNCOP(subvol, (&amp;args), syncop_fstat_cbk, subvol-&gt;fops-&gt;fstat, fd,</div><div class='add'>+           xdata_in);</div><div class='add'>+</div><div class='add'>+    if (stbuf)</div><div class='add'>+        *stbuf = args.iatt1;</div><div class='add'>+</div><div class='add'>+    if (xdata_out)</div><div class='add'>+        *xdata_out = args.xdata;</div><div class='add'>+    else if (args.xdata)</div><div class='add'>+        dict_unref(args.xdata);</div><div class='add'>+</div><div class='add'>+    if (args.op_ret &lt; 0)</div><div class='add'>+        return -args.op_errno;</div><div class='add'>+    return args.op_ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+syncop_stat(xlator_t *subvol, loc_t *loc, struct iatt *stbuf, dict_t *xdata_in,</div><div class='add'>+            dict_t **xdata_out)</div><div class='add'>+{</div><div class='add'>+    struct syncargs args = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    SYNCOP(subvol, (&amp;args), syncop_fstat_cbk, subvol-&gt;fops-&gt;stat, loc,</div><div class='add'>+           xdata_in);</div><div class='add'>+</div><div class='add'>+    if (stbuf)</div><div class='add'>+        *stbuf = args.iatt1;</div><div class='add'>+</div><div class='add'>+    if (xdata_out)</div><div class='add'>+        *xdata_out = args.xdata;</div><div class='add'>+    else if (args.xdata)</div><div class='add'>+        dict_unref(args.xdata);</div><div class='add'>+</div><div class='add'>+    if (args.op_ret &lt; 0)</div><div class='add'>+        return -args.op_errno;</div><div class='add'>+    return args.op_ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+syncop_symlink_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                   int32_t op_ret, int32_t op_errno, inode_t *inode,</div><div class='add'>+                   struct iatt *buf, struct iatt *preparent,</div><div class='add'>+                   struct iatt *postparent, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    struct syncargs *args = NULL;</div><div class='add'>+</div><div class='add'>+    args = cookie;</div><div class='add'>+</div><div class='add'>+    args-&gt;op_ret = op_ret;</div><div class='add'>+    args-&gt;op_errno = op_errno;</div><div class='add'>+    if (xdata)</div><div class='add'>+        args-&gt;xdata = dict_ref(xdata);</div><div class='add'>+</div><div class='add'>+    if (buf)</div><div class='add'>+        args-&gt;iatt1 = *buf;</div><div class='add'>+</div><div class='add'>+    __wake(args);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+syncop_symlink(xlator_t *subvol, loc_t *loc, const char *newpath,</div><div class='add'>+               struct iatt *iatt, dict_t *xdata_in, dict_t **xdata_out)</div><div class='add'>+{</div><div class='add'>+    struct syncargs args = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    SYNCOP(subvol, (&amp;args), syncop_symlink_cbk, subvol-&gt;fops-&gt;symlink, newpath,</div><div class='add'>+           loc, 0, xdata_in);</div><div class='add'>+</div><div class='add'>+    if (iatt)</div><div class='add'>+        *iatt = args.iatt1;</div><div class='add'>+</div><div class='add'>+    if (xdata_out)</div><div class='add'>+        *xdata_out = args.xdata;</div><div class='add'>+    else if (args.xdata)</div><div class='add'>+        dict_unref(args.xdata);</div><div class='add'>+</div><div class='add'>+    if (args.op_ret &lt; 0)</div><div class='add'>+        return -args.op_errno;</div><div class='add'>+    return args.op_ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+syncop_readlink_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                    int op_ret, int op_errno, const char *path,</div><div class='add'>+                    struct iatt *stbuf, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    struct syncargs *args = NULL;</div><div class='add'>+</div><div class='add'>+    args = cookie;</div><div class='add'>+</div><div class='add'>+    args-&gt;op_ret = op_ret;</div><div class='add'>+    args-&gt;op_errno = op_errno;</div><div class='add'>+    if (xdata)</div><div class='add'>+        args-&gt;xdata = dict_ref(xdata);</div><div class='add'>+</div><div class='add'>+    if ((op_ret != -1) &amp;&amp; path)</div><div class='add'>+        args-&gt;buffer = gf_strdup(path);</div><div class='add'>+</div><div class='add'>+    __wake(args);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+syncop_readlink(xlator_t *subvol, loc_t *loc, char **buffer, size_t size,</div><div class='add'>+                dict_t *xdata_in, dict_t **xdata_out)</div><div class='add'>+{</div><div class='add'>+    struct syncargs args = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    SYNCOP(subvol, (&amp;args), syncop_readlink_cbk, subvol-&gt;fops-&gt;readlink, loc,</div><div class='add'>+           size, xdata_in);</div><div class='add'>+</div><div class='add'>+    if (buffer)</div><div class='add'>+        *buffer = args.buffer;</div><div class='add'>+    else</div><div class='add'>+        GF_FREE(args.buffer);</div><div class='add'>+</div><div class='add'>+    if (xdata_out)</div><div class='add'>+        *xdata_out = args.xdata;</div><div class='add'>+    else if (args.xdata)</div><div class='add'>+        dict_unref(args.xdata);</div><div class='add'>+</div><div class='add'>+    if (args.op_ret &lt; 0)</div><div class='add'>+        return -args.op_errno;</div><div class='add'>+    return args.op_ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+syncop_mknod_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                 int32_t op_ret, int32_t op_errno, inode_t *inode,</div><div class='add'>+                 struct iatt *buf, struct iatt *preparent,</div><div class='add'>+                 struct iatt *postparent, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    struct syncargs *args = NULL;</div><div class='add'>+</div><div class='add'>+    args = cookie;</div><div class='add'>+</div><div class='add'>+    args-&gt;op_ret = op_ret;</div><div class='add'>+    args-&gt;op_errno = op_errno;</div><div class='add'>+    if (xdata)</div><div class='add'>+        args-&gt;xdata = dict_ref(xdata);</div><div class='add'>+</div><div class='add'>+    if (buf)</div><div class='add'>+        args-&gt;iatt1 = *buf;</div><div class='add'>+</div><div class='add'>+    __wake(args);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+syncop_mknod(xlator_t *subvol, loc_t *loc, mode_t mode, dev_t rdev,</div><div class='add'>+             struct iatt *iatt, dict_t *xdata_in, dict_t **xdata_out)</div><div class='add'>+{</div><div class='add'>+    struct syncargs args = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    SYNCOP(subvol, (&amp;args), syncop_mknod_cbk, subvol-&gt;fops-&gt;mknod, loc, mode,</div><div class='add'>+           rdev, 0, xdata_in);</div><div class='add'>+</div><div class='add'>+    if (iatt)</div><div class='add'>+        *iatt = args.iatt1;</div><div class='add'>+</div><div class='add'>+    if (xdata_out)</div><div class='add'>+        *xdata_out = args.xdata;</div><div class='add'>+    else if (args.xdata)</div><div class='add'>+        dict_unref(args.xdata);</div><div class='add'>+</div><div class='add'>+    if (args.op_ret &lt; 0)</div><div class='add'>+        return -args.op_errno;</div><div class='add'>+    return args.op_ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+syncop_mkdir_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                 int32_t op_ret, int32_t op_errno, inode_t *inode,</div><div class='add'>+                 struct iatt *buf, struct iatt *preparent,</div><div class='add'>+                 struct iatt *postparent, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    struct syncargs *args = NULL;</div><div class='add'>+</div><div class='add'>+    args = cookie;</div><div class='add'>+</div><div class='add'>+    args-&gt;op_ret = op_ret;</div><div class='add'>+    args-&gt;op_errno = op_errno;</div><div class='add'>+    if (xdata)</div><div class='add'>+        args-&gt;xdata = dict_ref(xdata);</div><div class='add'>+</div><div class='add'>+    if (buf)</div><div class='add'>+        args-&gt;iatt1 = *buf;</div><div class='add'>+</div><div class='add'>+    __wake(args);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+syncop_mkdir(xlator_t *subvol, loc_t *loc, mode_t mode, struct iatt *iatt,</div><div class='add'>+             dict_t *xdata_in, dict_t **xdata_out)</div><div class='add'>+{</div><div class='add'>+    struct syncargs args = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    SYNCOP(subvol, (&amp;args), syncop_mkdir_cbk, subvol-&gt;fops-&gt;mkdir, loc, mode, 0,</div><div class='add'>+           xdata_in);</div><div class='add'>+</div><div class='add'>+    if (iatt)</div><div class='add'>+        *iatt = args.iatt1;</div><div class='add'>+</div><div class='add'>+    if (xdata_out)</div><div class='add'>+        *xdata_out = args.xdata;</div><div class='add'>+    else if (args.xdata)</div><div class='add'>+        dict_unref(args.xdata);</div><div class='add'>+</div><div class='add'>+    if (args.op_ret &lt; 0)</div><div class='add'>+        return -args.op_errno;</div><div class='add'>+    return args.op_ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+syncop_access_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                  int32_t op_ret, int32_t op_errno, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    struct syncargs *args = NULL;</div><div class='add'>+</div><div class='add'>+    args = cookie;</div><div class='add'>+</div><div class='add'>+    args-&gt;op_ret = op_ret;</div><div class='add'>+    args-&gt;op_errno = op_errno;</div><div class='add'>+    if (xdata)</div><div class='add'>+        args-&gt;xdata = dict_ref(xdata);</div><div class='add'>+</div><div class='add'>+    __wake(args);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* posix_acl xlator will respond in different ways for access calls from</div><div class='add'>+   fuse and access calls from nfs. For fuse, checking op_ret is sufficient</div><div class='add'>+   to check whether the access call is successful or not. But for nfs the</div><div class='add'>+   mode of the access that is permitted is put into op_errno before unwind.</div><div class='add'>+   With syncop, the caller of syncop_access will not be able to get the</div><div class='add'>+   mode of the access despite call being successul (since syncop_access</div><div class='add'>+   returns only the op_ret collected in args).</div><div class='add'>+   Now, if access call is failed, then args.op_ret is returned to recognise</div><div class='add'>+   the failure. But if op_ret is zero, then the mode of access which is</div><div class='add'>+   set in args.op_errno is returned. Thus the caller of syncop_access</div><div class='add'>+   has to check whether the return value is less than zero or not. If the</div><div class='add'>+   return value it got is less than zero, then access call is failed.</div><div class='add'>+   If it is not, then the access call is successful and the value the caller</div><div class='add'>+   got is the mode of the access.</div><div class='add'>+*/</div><div class='add'>+int</div><div class='add'>+syncop_access(xlator_t *subvol, loc_t *loc, int32_t mask, dict_t *xdata_in,</div><div class='add'>+              dict_t **xdata_out)</div><div class='add'>+{</div><div class='add'>+    struct syncargs args = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    SYNCOP(subvol, (&amp;args), syncop_access_cbk, subvol-&gt;fops-&gt;access, loc, mask,</div><div class='add'>+           xdata_in);</div><div class='add'>+</div><div class='add'>+    if (xdata_out)</div><div class='add'>+        *xdata_out = args.xdata;</div><div class='add'>+    else if (args.xdata)</div><div class='add'>+        dict_unref(args.xdata);</div><div class='add'>+</div><div class='add'>+    if (args.op_ret &lt; 0)</div><div class='add'>+        return -args.op_errno;</div><div class='add'>+    return args.op_errno;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+syncop_fallocate_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                     int op_ret, int op_errno, struct iatt *prebuf,</div><div class='add'>+                     struct iatt *postbuf, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    struct syncargs *args = NULL;</div><div class='add'>+</div><div class='add'>+    args = cookie;</div><div class='add'>+</div><div class='add'>+    args-&gt;op_ret = op_ret;</div><div class='add'>+    args-&gt;op_errno = op_errno;</div><div class='add'>+    if (xdata)</div><div class='add'>+        args-&gt;xdata = dict_ref(xdata);</div><div class='add'>+</div><div class='add'>+    __wake(args);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+syncop_fallocate(xlator_t *subvol, fd_t *fd, int32_t keep_size, off_t offset,</div><div class='add'>+                 size_t len, dict_t *xdata_in, dict_t **xdata_out)</div><div class='add'>+{</div><div class='add'>+    struct syncargs args = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    SYNCOP(subvol, (&amp;args), syncop_fallocate_cbk, subvol-&gt;fops-&gt;fallocate, fd,</div><div class='add'>+           keep_size, offset, len, xdata_in);</div><div class='add'>+</div><div class='add'>+    if (xdata_out)</div><div class='add'>+        *xdata_out = args.xdata;</div><div class='add'>+    else if (args.xdata)</div><div class='add'>+        dict_unref(args.xdata);</div><div class='add'>+</div><div class='add'>+    if (args.op_ret &lt; 0)</div><div class='add'>+        return -args.op_errno;</div><div class='add'>+    return args.op_ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+syncop_discard_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                   int op_ret, int op_errno, struct iatt *prebuf,</div><div class='add'>+                   struct iatt *postbuf, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    struct syncargs *args = NULL;</div><div class='add'>+</div><div class='add'>+    args = cookie;</div><div class='add'>+</div><div class='add'>+    args-&gt;op_ret = op_ret;</div><div class='add'>+    args-&gt;op_errno = op_errno;</div><div class='add'>+    if (xdata)</div><div class='add'>+        args-&gt;xdata = dict_ref(xdata);</div><div class='add'>+</div><div class='add'>+    __wake(args);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+syncop_discard(xlator_t *subvol, fd_t *fd, off_t offset, size_t len,</div><div class='add'>+               dict_t *xdata_in, dict_t **xdata_out)</div><div class='add'>+{</div><div class='add'>+    struct syncargs args = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    SYNCOP(subvol, (&amp;args), syncop_discard_cbk, subvol-&gt;fops-&gt;discard, fd,</div><div class='add'>+           offset, len, xdata_in);</div><div class='add'>+</div><div class='add'>+    if (xdata_out)</div><div class='add'>+        *xdata_out = args.xdata;</div><div class='add'>+    else if (args.xdata)</div><div class='add'>+        dict_unref(args.xdata);</div><div class='add'>+</div><div class='add'>+    if (args.op_ret &lt; 0)</div><div class='add'>+        return -args.op_errno;</div><div class='add'>+    return args.op_ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+syncop_zerofill_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                    int op_ret, int op_errno, struct iatt *prebuf,</div><div class='add'>+                    struct iatt *postbuf, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    struct syncargs *args = NULL;</div><div class='add'>+</div><div class='add'>+    args = cookie;</div><div class='add'>+</div><div class='add'>+    args-&gt;op_ret = op_ret;</div><div class='add'>+    args-&gt;op_errno = op_errno;</div><div class='add'>+    if (xdata)</div><div class='add'>+        args-&gt;xdata = dict_ref(xdata);</div><div class='add'>+</div><div class='add'>+    __wake(args);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+syncop_zerofill(xlator_t *subvol, fd_t *fd, off_t offset, off_t len,</div><div class='add'>+                dict_t *xdata_in, dict_t **xdata_out)</div><div class='add'>+{</div><div class='add'>+    struct syncargs args = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    SYNCOP(subvol, (&amp;args), syncop_zerofill_cbk, subvol-&gt;fops-&gt;zerofill, fd,</div><div class='add'>+           offset, len, xdata_in);</div><div class='add'>+</div><div class='add'>+    if (xdata_out)</div><div class='add'>+        *xdata_out = args.xdata;</div><div class='add'>+    else if (args.xdata)</div><div class='add'>+        dict_unref(args.xdata);</div><div class='add'>+</div><div class='add'>+    if (args.op_ret &lt; 0)</div><div class='add'>+        return -args.op_errno;</div><div class='add'>+    return args.op_ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+syncop_ipc_cbk(call_frame_t *frame, void *cookie, xlator_t *this, int op_ret,</div><div class='add'>+               int op_errno, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    struct syncargs *args = NULL;</div><div class='add'>+</div><div class='add'>+    args = cookie;</div><div class='add'>+</div><div class='add'>+    args-&gt;op_ret = op_ret;</div><div class='add'>+    args-&gt;op_errno = op_errno;</div><div class='add'>+    if (xdata)</div><div class='add'>+        args-&gt;xdata = dict_ref(xdata);</div><div class='add'>+</div><div class='add'>+    __wake(args);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+syncop_ipc(xlator_t *subvol, int32_t op, dict_t *xdata_in, dict_t **xdata_out)</div><div class='add'>+{</div><div class='add'>+    struct syncargs args = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    SYNCOP(subvol, (&amp;args), syncop_ipc_cbk, subvol-&gt;fops-&gt;ipc, op, xdata_in);</div><div class='add'>+</div><div class='add'>+    if (args.xdata) {</div><div class='add'>+        if (xdata_out) {</div><div class='add'>+            /*</div><div class='add'>+             * We're passing this reference to the caller, along</div><div class='add'>+             * with the pointer itself.  That means they're</div><div class='add'>+             * responsible for calling dict_unref at some point.</div><div class='add'>+             */</div><div class='add'>+            *xdata_out = args.xdata;</div><div class='add'>+        } else {</div><div class='add'>+            dict_unref(args.xdata);</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (args.op_ret &lt; 0)</div><div class='add'>+        return -args.op_errno;</div><div class='add'>+    return args.op_ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+syncop_seek_cbk(call_frame_t *frame, void *cookie, xlator_t *this, int op_ret,</div><div class='add'>+                int op_errno, off_t offset, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    struct syncargs *args = NULL;</div><div class='add'>+</div><div class='add'>+    args = cookie;</div><div class='add'>+</div><div class='add'>+    args-&gt;op_ret = op_ret;</div><div class='add'>+    args-&gt;op_errno = op_errno;</div><div class='add'>+    args-&gt;offset = offset;</div><div class='add'>+    if (xdata)</div><div class='add'>+        args-&gt;xdata = dict_ref(xdata);</div><div class='add'>+</div><div class='add'>+    __wake(args);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+syncop_seek(xlator_t *subvol, fd_t *fd, off_t offset, gf_seek_what_t what,</div><div class='add'>+            dict_t *xdata_in, off_t *off)</div><div class='add'>+{</div><div class='add'>+    struct syncargs args = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    SYNCOP(subvol, (&amp;args), syncop_seek_cbk, subvol-&gt;fops-&gt;seek, fd, offset,</div><div class='add'>+           what, xdata_in);</div><div class='add'>+</div><div class='add'>+    if (args.op_ret &lt; 0) {</div><div class='add'>+        return -args.op_errno;</div><div class='add'>+    } else {</div><div class='add'>+        if (off)</div><div class='add'>+            *off = args.offset;</div><div class='ctx'>         return args.op_ret;</div><div class='add'>+    }</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-syncop_setattr_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-                    int op_ret, int op_errno,</div><div class='del'>-                    struct iatt *preop, struct iatt *postop)</div><div class='add'>+syncop_lease_cbk(call_frame_t *frame, void *cookie, xlator_t *this, int op_ret,</div><div class='add'>+                 int op_errno, struct gf_lease *lease, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-        struct syncargs *args = NULL;</div><div class='add'>+    struct syncargs *args = NULL;</div><div class='ctx'> </div><div class='del'>-        args = cookie;</div><div class='add'>+    args = cookie;</div><div class='ctx'> </div><div class='del'>-        args-&gt;op_ret   = op_ret;</div><div class='del'>-        args-&gt;op_errno = op_errno;</div><div class='add'>+    args-&gt;op_ret = op_ret;</div><div class='add'>+    args-&gt;op_errno = op_errno;</div><div class='add'>+    if (xdata)</div><div class='add'>+        args-&gt;xdata = dict_ref(xdata);</div><div class='add'>+    if (lease)</div><div class='add'>+        args-&gt;lease = *lease;</div><div class='add'>+</div><div class='add'>+    __wake(args);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        if (op_ret == 0) {</div><div class='del'>-                args-&gt;iatt1  = *preop;</div><div class='del'>-                args-&gt;iatt2  = *postop;</div><div class='add'>+int</div><div class='add'>+syncop_lease(xlator_t *subvol, loc_t *loc, struct gf_lease *lease,</div><div class='add'>+             dict_t *xdata_in, dict_t **xdata_out)</div><div class='add'>+{</div><div class='add'>+    struct syncargs args = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    SYNCOP(subvol, (&amp;args), syncop_lease_cbk, subvol-&gt;fops-&gt;lease, loc, lease,</div><div class='add'>+           xdata_in);</div><div class='add'>+</div><div class='add'>+    *lease = args.lease;</div><div class='add'>+</div><div class='add'>+    if (args.xdata) {</div><div class='add'>+        if (xdata_out) {</div><div class='add'>+            /*</div><div class='add'>+             * We're passing this reference to the caller, along</div><div class='add'>+             * with the pointer itself.  That means they're</div><div class='add'>+             * responsible for calling dict_unref at some point.</div><div class='add'>+             */</div><div class='add'>+            *xdata_out = args.xdata;</div><div class='add'>+        } else {</div><div class='add'>+            dict_unref(args.xdata);</div><div class='ctx'>         }</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        __wake (args);</div><div class='add'>+    if (args.op_ret &lt; 0)</div><div class='add'>+        return -args.op_errno;</div><div class='add'>+    return args.op_ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        return 0;</div><div class='add'>+int</div><div class='add'>+syncop_lk_cbk(call_frame_t *frame, void *cookie, xlator_t *this, int op_ret,</div><div class='add'>+              int op_errno, struct gf_flock *flock, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    struct syncargs *args = NULL;</div><div class='add'>+</div><div class='add'>+    args = cookie;</div><div class='add'>+</div><div class='add'>+    args-&gt;op_ret = op_ret;</div><div class='add'>+    args-&gt;op_errno = op_errno;</div><div class='add'>+    if (xdata)</div><div class='add'>+        args-&gt;xdata = dict_ref(xdata);</div><div class='add'>+</div><div class='add'>+    if (flock)</div><div class='add'>+        args-&gt;flock = *flock;</div><div class='add'>+    __wake(args);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+syncop_lk(xlator_t *subvol, fd_t *fd, int cmd, struct gf_flock *flock,</div><div class='add'>+          dict_t *xdata_in, dict_t **xdata_out)</div><div class='add'>+{</div><div class='add'>+    struct syncargs args = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    SYNCOP(subvol, (&amp;args), syncop_lk_cbk, subvol-&gt;fops-&gt;lk, fd, cmd, flock,</div><div class='add'>+           xdata_in);</div><div class='add'>+</div><div class='add'>+    *flock = args.flock;</div><div class='add'>+</div><div class='add'>+    if (xdata_out)</div><div class='add'>+        *xdata_out = args.xdata;</div><div class='add'>+    else if (args.xdata)</div><div class='add'>+        dict_unref(args.xdata);</div><div class='add'>+</div><div class='add'>+    if (args.op_ret &lt; 0)</div><div class='add'>+        return -args.op_errno;</div><div class='add'>+    return args.op_ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+int32_t</div><div class='add'>+syncop_inodelk_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                   int32_t op_ret, int32_t op_errno, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    struct syncargs *args = NULL;</div><div class='add'>+</div><div class='add'>+    args = cookie;</div><div class='add'>+</div><div class='add'>+    args-&gt;op_ret = op_ret;</div><div class='add'>+    args-&gt;op_errno = op_errno;</div><div class='add'>+    if (xdata)</div><div class='add'>+        args-&gt;xdata = dict_ref(xdata);</div><div class='add'>+</div><div class='add'>+    __wake(args);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-syncop_setattr (xlator_t *subvol, loc_t *loc, struct iatt *iatt, int valid,</div><div class='del'>-                struct iatt *preop, struct iatt *postop)</div><div class='add'>+syncop_inodelk(xlator_t *subvol, const char *volume, loc_t *loc, int32_t cmd,</div><div class='add'>+               struct gf_flock *lock, dict_t *xdata_in, dict_t **xdata_out)</div><div class='ctx'> {</div><div class='del'>-        struct syncargs args = {0, };</div><div class='add'>+    struct syncargs args = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='ctx'> </div><div class='del'>-        SYNCOP (subvol, (&amp;args), syncop_setattr_cbk, subvol-&gt;fops-&gt;setattr,</div><div class='del'>-                loc, iatt, valid);</div><div class='add'>+    SYNCOP(subvol, (&amp;args), syncop_inodelk_cbk, subvol-&gt;fops-&gt;inodelk, volume,</div><div class='add'>+           loc, cmd, lock, xdata_in);</div><div class='ctx'> </div><div class='del'>-        if (preop)</div><div class='del'>-                *preop = args.iatt1;</div><div class='del'>-        if (postop)</div><div class='del'>-                *postop = args.iatt2;</div><div class='add'>+    if (xdata_out)</div><div class='add'>+        *xdata_out = args.xdata;</div><div class='add'>+    else if (args.xdata)</div><div class='add'>+        dict_unref(args.xdata);</div><div class='ctx'> </div><div class='del'>-        errno = args.op_errno;</div><div class='del'>-        return args.op_ret;</div><div class='add'>+    if (args.op_ret &lt; 0)</div><div class='add'>+        return -args.op_errno;</div><div class='add'>+</div><div class='add'>+    return args.op_ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+syncop_entrylk_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                   int32_t op_ret, int32_t op_errno, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    struct syncargs *args = NULL;</div><div class='add'>+</div><div class='add'>+    args = cookie;</div><div class='add'>+    args-&gt;op_ret = op_ret;</div><div class='add'>+    args-&gt;op_errno = op_errno;</div><div class='add'>+    if (xdata)</div><div class='add'>+        args-&gt;xdata = dict_ref(xdata);</div><div class='add'>+</div><div class='add'>+    __wake(args);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+syncop_entrylk(xlator_t *subvol, const char *volume, loc_t *loc,</div><div class='add'>+               const char *basename, entrylk_cmd cmd, entrylk_type type,</div><div class='add'>+               dict_t *xdata_in, dict_t **xdata_out)</div><div class='add'>+{</div><div class='add'>+    struct syncargs args = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    SYNCOP(subvol, (&amp;args), syncop_entrylk_cbk, subvol-&gt;fops-&gt;entrylk, volume,</div><div class='add'>+           loc, basename, cmd, type, xdata_in);</div><div class='add'>+</div><div class='add'>+    if (xdata_out)</div><div class='add'>+        *xdata_out = args.xdata;</div><div class='add'>+    else if (args.xdata)</div><div class='add'>+        dict_unref(args.xdata);</div><div class='add'>+</div><div class='add'>+    if (args.op_ret &lt; 0)</div><div class='add'>+        return -args.op_errno;</div><div class='add'>+</div><div class='add'>+    return args.op_ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+syncop_xattrop_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                   int32_t op_ret, int32_t op_errno, dict_t *dict,</div><div class='add'>+                   dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    struct syncargs *args = NULL;</div><div class='add'>+</div><div class='add'>+    args = cookie;</div><div class='add'>+</div><div class='add'>+    args-&gt;op_ret = op_ret;</div><div class='add'>+    args-&gt;op_errno = op_errno;</div><div class='add'>+    if (xdata)</div><div class='add'>+        args-&gt;xdata = dict_ref(xdata);</div><div class='add'>+    if (dict)</div><div class='add'>+        args-&gt;dict_out = dict_ref(dict);</div><div class='add'>+</div><div class='add'>+    __wake(args);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+syncop_xattrop(xlator_t *subvol, loc_t *loc, gf_xattrop_flags_t flags,</div><div class='add'>+               dict_t *dict, dict_t *xdata_in, dict_t **dict_out,</div><div class='add'>+               dict_t **xdata_out)</div><div class='add'>+{</div><div class='add'>+    struct syncargs args = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    SYNCOP(subvol, (&amp;args), syncop_xattrop_cbk, subvol-&gt;fops-&gt;xattrop, loc,</div><div class='add'>+           flags, dict, xdata_in);</div><div class='add'>+</div><div class='add'>+    if (xdata_out)</div><div class='add'>+        *xdata_out = args.xdata;</div><div class='add'>+    else if (args.xdata)</div><div class='add'>+        dict_unref(args.xdata);</div><div class='add'>+</div><div class='add'>+    if (dict_out)</div><div class='add'>+        *dict_out = args.dict_out;</div><div class='add'>+    else if (args.dict_out)</div><div class='add'>+        dict_unref(args.dict_out);</div><div class='add'>+</div><div class='add'>+    if (args.op_ret &lt; 0)</div><div class='add'>+        return -args.op_errno;</div><div class='add'>+</div><div class='add'>+    return args.op_ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+syncop_fxattrop(xlator_t *subvol, fd_t *fd, gf_xattrop_flags_t flags,</div><div class='add'>+                dict_t *dict, dict_t *xdata_in, dict_t **dict_out,</div><div class='add'>+                dict_t **xdata_out)</div><div class='add'>+{</div><div class='add'>+    struct syncargs args = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    SYNCOP(subvol, (&amp;args), syncop_xattrop_cbk, subvol-&gt;fops-&gt;fxattrop, fd,</div><div class='add'>+           flags, dict, xdata_in);</div><div class='add'>+</div><div class='add'>+    if (xdata_out)</div><div class='add'>+        *xdata_out = args.xdata;</div><div class='add'>+    else if (args.xdata)</div><div class='add'>+        dict_unref(args.xdata);</div><div class='add'>+</div><div class='add'>+    if (dict_out)</div><div class='add'>+        *dict_out = args.dict_out;</div><div class='add'>+    else if (args.dict_out)</div><div class='add'>+        dict_unref(args.dict_out);</div><div class='add'>+</div><div class='add'>+    if (args.op_ret &lt; 0)</div><div class='add'>+        return -args.op_errno;</div><div class='add'>+</div><div class='add'>+    return args.op_ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+syncop_getactivelk_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                       int32_t op_ret, int32_t op_errno,</div><div class='add'>+                       lock_migration_info_t *locklist, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    struct syncargs *args = NULL;</div><div class='add'>+    lock_migration_info_t *tmp = NULL;</div><div class='add'>+    lock_migration_info_t *entry = NULL;</div><div class='add'>+</div><div class='add'>+    args = cookie;</div><div class='add'>+</div><div class='add'>+    INIT_LIST_HEAD(&amp;args-&gt;locklist.list);</div><div class='add'>+</div><div class='add'>+    args-&gt;op_ret = op_ret;</div><div class='add'>+    args-&gt;op_errno = op_errno;</div><div class='add'>+    if (xdata)</div><div class='add'>+        args-&gt;xdata = dict_ref(xdata);</div><div class='add'>+</div><div class='add'>+    if (op_ret &gt; 0) {</div><div class='add'>+        list_for_each_entry(tmp, &amp;locklist-&gt;list, list)</div><div class='add'>+        {</div><div class='add'>+            entry = GF_CALLOC(1, sizeof(lock_migration_info_t),</div><div class='add'>+                              gf_common_mt_char);</div><div class='add'>+</div><div class='add'>+            if (!entry) {</div><div class='add'>+                gf_msg(THIS-&gt;name, GF_LOG_ERROR, 0, 0,</div><div class='add'>+                       "lock mem allocation  failed");</div><div class='add'>+                gf_free_mig_locks(&amp;args-&gt;locklist);</div><div class='add'>+</div><div class='add'>+                break;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            INIT_LIST_HEAD(&amp;entry-&gt;list);</div><div class='add'>+</div><div class='add'>+            entry-&gt;flock = tmp-&gt;flock;</div><div class='add'>+</div><div class='add'>+            entry-&gt;lk_flags = tmp-&gt;lk_flags;</div><div class='add'>+</div><div class='add'>+            entry-&gt;client_uid = gf_strdup(tmp-&gt;client_uid);</div><div class='add'>+</div><div class='add'>+            list_add_tail(&amp;entry-&gt;list, &amp;args-&gt;locklist.list);</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    __wake(args);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+int</div><div class='add'>+syncop_getactivelk(xlator_t *subvol, loc_t *loc,</div><div class='add'>+                   lock_migration_info_t *locklist, dict_t *xdata_in,</div><div class='add'>+                   dict_t **xdata_out)</div><div class='add'>+{</div><div class='add'>+    struct syncargs args = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    SYNCOP(subvol, (&amp;args), syncop_getactivelk_cbk, subvol-&gt;fops-&gt;getactivelk,</div><div class='add'>+           loc, xdata_in);</div><div class='add'>+</div><div class='add'>+    if (locklist)</div><div class='add'>+        list_splice_init(&amp;args.locklist.list, &amp;locklist-&gt;list);</div><div class='add'>+    else</div><div class='add'>+        gf_free_mig_locks(&amp;args.locklist);</div><div class='add'>+</div><div class='add'>+    if (xdata_out)</div><div class='add'>+        *xdata_out = args.xdata;</div><div class='add'>+    else if (args.xdata)</div><div class='add'>+        dict_unref(args.xdata);</div><div class='add'>+</div><div class='add'>+    if (args.op_ret &lt; 0)</div><div class='add'>+        return -args.op_errno;</div><div class='add'>+</div><div class='add'>+    return args.op_ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+syncop_setactivelk_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                       int32_t op_ret, int32_t op_errno, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    struct syncargs *args = NULL;</div><div class='add'>+</div><div class='add'>+    args = cookie;</div><div class='add'>+</div><div class='add'>+    args-&gt;op_ret = op_ret;</div><div class='add'>+    args-&gt;op_errno = op_errno;</div><div class='add'>+</div><div class='add'>+    if (xdata)</div><div class='add'>+        args-&gt;xdata = dict_ref(xdata);</div><div class='add'>+</div><div class='add'>+    __wake(args);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+syncop_setactivelk(xlator_t *subvol, loc_t *loc,</div><div class='add'>+                   lock_migration_info_t *locklist, dict_t *xdata_in,</div><div class='add'>+                   dict_t **xdata_out)</div><div class='add'>+{</div><div class='add'>+    struct syncargs args = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    SYNCOP(subvol, (&amp;args), syncop_setactivelk_cbk, subvol-&gt;fops-&gt;setactivelk,</div><div class='add'>+           loc, locklist, xdata_in);</div><div class='add'>+</div><div class='add'>+    if (xdata_out)</div><div class='add'>+        *xdata_out = args.xdata;</div><div class='add'>+    else if (args.xdata)</div><div class='add'>+        dict_unref(args.xdata);</div><div class='add'>+</div><div class='add'>+    if (args.op_ret &lt; 0)</div><div class='add'>+        return -args.op_errno;</div><div class='add'>+</div><div class='add'>+    return args.op_ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+syncop_icreate_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                   int32_t op_ret, int32_t op_errno, inode_t *inode,</div><div class='add'>+                   struct iatt *buf, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    struct syncargs *args = NULL;</div><div class='add'>+</div><div class='add'>+    args = cookie;</div><div class='add'>+</div><div class='add'>+    args-&gt;op_ret = op_ret;</div><div class='add'>+    args-&gt;op_errno = op_errno;</div><div class='add'>+    if (xdata)</div><div class='add'>+        args-&gt;xdata = dict_ref(xdata);</div><div class='add'>+</div><div class='add'>+    if (buf)</div><div class='add'>+        args-&gt;iatt1 = *buf;</div><div class='add'>+</div><div class='add'>+    __wake(args);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+syncop_namelink_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                    int32_t op_ret, int32_t op_errno, struct iatt *prebuf,</div><div class='add'>+                    struct iatt *postbuf, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    struct syncargs *args = NULL;</div><div class='add'>+</div><div class='add'>+    args = cookie;</div><div class='add'>+</div><div class='add'>+    args-&gt;op_ret = op_ret;</div><div class='add'>+    args-&gt;op_errno = op_errno;</div><div class='add'>+</div><div class='add'>+    if (xdata)</div><div class='add'>+        args-&gt;xdata = dict_ref(xdata);</div><div class='add'>+</div><div class='add'>+    __wake(args);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+syncop_copy_file_range(xlator_t *subvol, fd_t *fd_in, off64_t off_in,</div><div class='add'>+                       fd_t *fd_out, off64_t off_out, size_t len,</div><div class='add'>+                       uint32_t flags, struct iatt *stbuf,</div><div class='add'>+                       struct iatt *preiatt_dst, struct iatt *postiatt_dst,</div><div class='add'>+                       dict_t *xdata_in, dict_t **xdata_out)</div><div class='add'>+{</div><div class='add'>+    struct syncargs args = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    SYNCOP(subvol, (&amp;args), syncop_copy_file_range_cbk,</div><div class='add'>+           subvol-&gt;fops-&gt;copy_file_range, fd_in, off_in, fd_out, off_out, len,</div><div class='add'>+           flags, xdata_in);</div><div class='add'>+</div><div class='add'>+    if (stbuf) {</div><div class='add'>+        *stbuf = args.iatt1;</div><div class='add'>+    }</div><div class='add'>+    if (preiatt_dst) {</div><div class='add'>+        *preiatt_dst = args.iatt2;</div><div class='add'>+    }</div><div class='add'>+    if (postiatt_dst) {</div><div class='add'>+        *postiatt_dst = args.iatt3;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (xdata_out) {</div><div class='add'>+        *xdata_out = args.xdata;</div><div class='add'>+    } else if (args.xdata) {</div><div class='add'>+        dict_unref(args.xdata);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    errno = args.op_errno;</div><div class='add'>+    return args.op_ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+syncop_copy_file_range_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                           int op_ret, int op_errno, struct iatt *stbuf,</div><div class='add'>+                           struct iatt *prebuf_dst, struct iatt *postbuf_dst,</div><div class='add'>+                           dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    struct syncargs *args = NULL;</div><div class='add'>+</div><div class='add'>+    args = cookie;</div><div class='add'>+</div><div class='add'>+    args-&gt;op_ret = op_ret;</div><div class='add'>+    args-&gt;op_errno = op_errno;</div><div class='add'>+    if (xdata)</div><div class='add'>+        args-&gt;xdata = dict_ref(xdata);</div><div class='add'>+</div><div class='add'>+    if (op_ret &gt;= 0) {</div><div class='add'>+        args-&gt;iatt1 = *stbuf;</div><div class='add'>+        args-&gt;iatt2 = *prebuf_dst;</div><div class='add'>+        args-&gt;iatt3 = *postbuf_dst;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    __wake(args);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='head'>diff --git a/libglusterfs/src/syncop.h b/libglusterfs/src/syncop.h<br/>deleted file mode 100644<br/>index 13b07ed31fd..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/libglusterfs/src/syncop.h?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/syncop.h</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,181 +0,0 @@</div><div class='del'>-/*</div><div class='del'>-   Copyright (c) 2010 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='del'>-   This file is part of GlusterFS.</div><div class='del'>-</div><div class='del'>-   GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-   it under the terms of the GNU General Public License as published</div><div class='del'>-   by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-   or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-   GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-   WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-   General Public License for more details.</div><div class='del'>-</div><div class='del'>-   You should have received a copy of the GNU General Public License</div><div class='del'>-   along with this program.  If not, see</div><div class='del'>-   &lt;http://www.gnu.org/licenses/&gt;.</div><div class='del'>-*/</div><div class='del'>-</div><div class='del'>-#ifndef _SYNCOP_H</div><div class='del'>-#define _SYNCOP_H</div><div class='del'>-</div><div class='del'>-#ifndef _CONFIG_H</div><div class='del'>-#define _CONFIG_H</div><div class='del'>-#include "config.h"</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-#include "xlator.h"</div><div class='del'>-#include &lt;sys/time.h&gt;</div><div class='del'>-#include &lt;pthread.h&gt;</div><div class='del'>-#include &lt;ucontext.h&gt;</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-struct synctask;</div><div class='del'>-struct syncenv;</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-typedef int (*synctask_cbk_t) (int ret, void *opaque);</div><div class='del'>-</div><div class='del'>-typedef int (*synctask_fn_t) (void *opaque);</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-/* for one sequential execution of @syncfn */</div><div class='del'>-struct synctask {</div><div class='del'>-        struct list_head    all_tasks;</div><div class='del'>-        struct syncenv     *env;</div><div class='del'>-        xlator_t           *xl;</div><div class='del'>-        synctask_cbk_t      synccbk;</div><div class='del'>-        synctask_fn_t       syncfn;</div><div class='del'>-        void               *opaque;</div><div class='del'>-        void               *stack;</div><div class='del'>-        int                 complete;</div><div class='del'>-</div><div class='del'>-        ucontext_t          ctx;</div><div class='del'>-};</div><div class='del'>-</div><div class='del'>-/* hosts the scheduler thread and framework for executing synctasks */</div><div class='del'>-struct syncenv {</div><div class='del'>-        pthread_t           processor;</div><div class='del'>-        struct synctask    *current;</div><div class='del'>-</div><div class='del'>-        struct list_head    runq;</div><div class='del'>-        struct list_head    waitq;</div><div class='del'>-</div><div class='del'>-        pthread_mutex_t     mutex;</div><div class='del'>-        pthread_cond_t      cond;</div><div class='del'>-</div><div class='del'>-        ucontext_t          sched;</div><div class='del'>-        size_t              stacksize;</div><div class='del'>-};</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-struct syncargs {</div><div class='del'>-        int                 op_ret;</div><div class='del'>-        int                 op_errno;</div><div class='del'>-        struct iatt         iatt1;</div><div class='del'>-        struct iatt         iatt2;</div><div class='del'>-        dict_t             *xattr;</div><div class='del'>-        gf_dirent_t        entries;</div><div class='del'>-        struct statvfs     statvfs_buf;</div><div class='del'>-</div><div class='del'>-        /* do not touch */</div><div class='del'>-        pthread_mutex_t     mutex;</div><div class='del'>-        char                complete;</div><div class='del'>-        pthread_cond_t      cond;</div><div class='del'>-        struct synctask    *task;</div><div class='del'>-};</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-#define __yawn(args) do {                                               \</div><div class='del'>-        struct synctask *task = NULL;                                   \</div><div class='del'>-                                                                        \</div><div class='del'>-        task = synctask_get ();                                         \</div><div class='del'>-        if (task) {                                                     \</div><div class='del'>-                args-&gt;task = task;                                      \</div><div class='del'>-                synctask_yawn (task);                                   \</div><div class='del'>-        } else {                                                        \</div><div class='del'>-                pthread_mutex_init (&amp;args-&gt;mutex, NULL);                \</div><div class='del'>-                pthread_cond_init (&amp;args-&gt;cond, NULL);                  \</div><div class='del'>-        }                                                               \</div><div class='del'>-} while (0)</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-#define __yield(args) do {                                              \</div><div class='del'>-        if (args-&gt;task) {                                               \</div><div class='del'>-                synctask_yield (args-&gt;task);                            \</div><div class='del'>-        } else {                                                        \</div><div class='del'>-                pthread_mutex_lock (&amp;args-&gt;mutex);                      \</div><div class='del'>-                {                                                       \</div><div class='del'>-                        while (!args-&gt;complete)                         \</div><div class='del'>-                                pthread_cond_wait (&amp;args-&gt;cond,         \</div><div class='del'>-                                                   &amp;args-&gt;mutex);       \</div><div class='del'>-                }                                                       \</div><div class='del'>-                pthread_mutex_unlock (&amp;args-&gt;mutex);                    \</div><div class='del'>-                                                                        \</div><div class='del'>-                pthread_mutex_destroy (&amp;args-&gt;mutex);                   \</div><div class='del'>-                pthread_cond_destroy (&amp;args-&gt;cond);                     \</div><div class='del'>-        }                                                               \</div><div class='del'>-} while (0)</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-#define __wake(args) do {                                               \</div><div class='del'>-        if (args-&gt;task) {                                               \</div><div class='del'>-                synctask_wake (args-&gt;task);                             \</div><div class='del'>-        } else {                                                        \</div><div class='del'>-                pthread_mutex_lock (&amp;args-&gt;mutex);                      \</div><div class='del'>-                {                                                       \</div><div class='del'>-                        args-&gt;complete = 1;                             \</div><div class='del'>-                        pthread_cond_broadcast (&amp;args-&gt;cond);           \</div><div class='del'>-                }                                                       \</div><div class='del'>-                pthread_mutex_unlock (&amp;args-&gt;mutex);                    \</div><div class='del'>-        }                                                               \</div><div class='del'>-} while (0)</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-#define SYNCOP(subvol, stb, cbk, op, params ...) do {                   \</div><div class='del'>-        call_frame_t    *frame = NULL;                                  \</div><div class='del'>-                                                                        \</div><div class='del'>-        frame = syncop_create_frame ();                                 \</div><div class='del'>-                                                                        \</div><div class='del'>-        __yawn (stb);                                                   \</div><div class='del'>-        STACK_WIND_COOKIE (frame, cbk, (void *)stb, subvol, op, params);\</div><div class='del'>-        __yield (stb);                                                  \</div><div class='del'>-} while (0)</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-#define SYNCENV_DEFAULT_STACKSIZE (16 * 1024)</div><div class='del'>-</div><div class='del'>-struct syncenv * syncenv_new ();</div><div class='del'>-void syncenv_destroy (struct syncenv *);</div><div class='del'>-</div><div class='del'>-int synctask_new (struct syncenv *, synctask_fn_t, synctask_cbk_t, void *);</div><div class='del'>-void synctask_zzzz (struct synctask *task);</div><div class='del'>-void synctask_yawn (struct synctask *task);</div><div class='del'>-void synctask_wake (struct synctask *task);</div><div class='del'>-void synctask_yield (struct synctask *task);</div><div class='del'>-</div><div class='del'>-int syncop_lookup (xlator_t *subvol, loc_t *loc, dict_t *xattr_req,</div><div class='del'>-                   /* out */</div><div class='del'>-                   struct iatt *iatt, dict_t **xattr_rsp, struct iatt *parent);</div><div class='del'>-</div><div class='del'>-int syncop_readdirp (xlator_t *subvol, fd_t *fd, size_t size, off_t off,</div><div class='del'>-                     /* out */</div><div class='del'>-                     gf_dirent_t *entries);</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-syncop_opendir (xlator_t *subvol,</div><div class='del'>-                loc_t *loc,</div><div class='del'>-                fd_t *fd);</div><div class='del'>-</div><div class='del'>-int syncop_setattr (xlator_t *subvol, loc_t *loc, struct iatt *iatt, int valid,</div><div class='del'>-                    /* out */</div><div class='del'>-                    struct iatt *preop, struct iatt *postop);</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-syncop_statfs (xlator_t *subvol, loc_t *loc, struct statvfs *buf);</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-syncop_setxattr (xlator_t *subvol, loc_t *loc, dict_t *dict, int32_t flags);</div><div class='del'>-</div><div class='del'>-#endif /* _SYNCOP_H */</div><div class='head'>diff --git a/libglusterfs/src/syscall.c b/libglusterfs/src/syscall.c<br/>index e0d0b13fa3a..04400f98b6c 100644<br/>--- a/<a href='/cgit/glusterfs.git/tree/libglusterfs/src/syscall.c?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/syscall.c</a><br/>+++ b/<a href='/cgit/glusterfs.git/tree/libglusterfs/src/syscall.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>libglusterfs/src/syscall.c</a></div><div class='hunk'>@@ -1,432 +1,876 @@</div><div class='ctx'> /*</div><div class='del'>-  Copyright (c) 2009 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='add'>+  Copyright (c) 2008-2012 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='ctx'>   This file is part of GlusterFS.</div><div class='ctx'> </div><div class='del'>-  GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-  it under the terms of the GNU General Public License as published</div><div class='del'>-  by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-  or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-  GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-  WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-  General Public License for more details.</div><div class='del'>-</div><div class='del'>-  You should have received a copy of the GNU General Public License</div><div class='del'>-  along with this program.  If not, see</div><div class='del'>-  &lt;http://www.gnu.org/licenses/&gt;.</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='ctx'> */</div><div class='ctx'> </div><div class='del'>-#ifndef _CONFIG_H</div><div class='del'>-#define _CONFIG_H</div><div class='del'>-#include "config.h"</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-#include "compat.h"</div><div class='del'>-#include "syscall.h"</div><div class='add'>+#include "glusterfs/compat.h"</div><div class='add'>+#include "glusterfs/syscall.h"</div><div class='add'>+#include "glusterfs/mem-pool.h"</div><div class='add'>+#include "glusterfs/libglusterfs-messages.h"</div><div class='ctx'> </div><div class='add'>+#ifdef __FreeBSD__</div><div class='add'>+#include &lt;sys/sysctl.h&gt;</div><div class='add'>+#include &lt;signal.h&gt;</div><div class='add'>+#endif</div><div class='ctx'> #include &lt;sys/types.h&gt;</div><div class='ctx'> #include &lt;utime.h&gt;</div><div class='ctx'> #include &lt;sys/time.h&gt;</div><div class='add'>+#include &lt;fcntl.h&gt;</div><div class='add'>+#include &lt;unistd.h&gt;</div><div class='add'>+#include &lt;stdarg.h&gt;</div><div class='add'>+#ifdef HAVE_COPY_FILE_RANGE_SYS</div><div class='add'>+#include &lt;sys/syscall.h&gt;</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#define FS_ERROR_LOG(result)                                                   \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        gf_msg_callingfn("FS", GF_LOG_CRITICAL, EIO,                           \</div><div class='add'>+                         LG_MSG_SYSCALL_RETURNS_WRONG,                         \</div><div class='add'>+                         "returned %zd for the syscall", (ssize_t)result);     \</div><div class='add'>+    } while (0)</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+ * Input to these macros is generally a function call, so capture the result</div><div class='add'>+ * i.e. (_ret) in another variable and use that instead of using _ret again</div><div class='add'>+ */</div><div class='add'>+#define FS_RET_CHECK(_ret, err)                                                \</div><div class='add'>+    ({                                                                         \</div><div class='add'>+        typeof(_ret) _result = (_ret);                                         \</div><div class='add'>+        if (_result &lt; -1) {                                                    \</div><div class='add'>+            FS_ERROR_LOG(_result);                                             \</div><div class='add'>+            _result = -1;                                                      \</div><div class='add'>+            err = EIO;                                                         \</div><div class='add'>+        }                                                                      \</div><div class='add'>+        _result;                                                               \</div><div class='add'>+    })</div><div class='add'>+</div><div class='add'>+#define FS_RET_CHECK0(_ret, err)                                               \</div><div class='add'>+    ({                                                                         \</div><div class='add'>+        typeof(_ret) _result0 = (_ret);                                        \</div><div class='add'>+        if (_result0 &lt; -1 || _result0 &gt; 0) {                                   \</div><div class='add'>+            FS_ERROR_LOG(_result0);                                            \</div><div class='add'>+            _result0 = -1;                                                     \</div><div class='add'>+            err = EIO;                                                         \</div><div class='add'>+        }                                                                      \</div><div class='add'>+        _result0;                                                              \</div><div class='add'>+    })</div><div class='add'>+</div><div class='add'>+#define FS_RET_CHECK_ERRNO(_ret, err)                                          \</div><div class='add'>+    ({                                                                         \</div><div class='add'>+        typeof(_ret) _result1 = (_ret);                                        \</div><div class='add'>+        if (_result1 &lt; 0) {                                                    \</div><div class='add'>+            FS_ERROR_LOG(_result1);                                            \</div><div class='add'>+            _result1 = -1;                                                     \</div><div class='add'>+            err = EIO;                                                         \</div><div class='add'>+        } else if (_result1 &gt; 0) {                                             \</div><div class='add'>+            err = _result1;                                                    \</div><div class='add'>+            _result1 = -1;                                                     \</div><div class='add'>+        }                                                                      \</div><div class='add'>+        _result1;                                                              \</div><div class='add'>+    })</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-sys_lstat (const char *path, struct stat *buf)</div><div class='add'>+sys_lstat(const char *path, struct stat *buf)</div><div class='ctx'> {</div><div class='del'>-        return lstat (path, buf);</div><div class='add'>+    return FS_RET_CHECK0(lstat(path, buf), errno);</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+int</div><div class='add'>+sys_stat(const char *path, struct stat *buf)</div><div class='add'>+{</div><div class='add'>+    return FS_RET_CHECK0(stat(path, buf), errno);</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-sys_stat (const char *path, struct stat *buf)</div><div class='add'>+sys_fstat(int fd, struct stat *buf)</div><div class='ctx'> {</div><div class='del'>-        return stat (path, buf);</div><div class='add'>+    return FS_RET_CHECK0(fstat(fd, buf), errno);</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+int</div><div class='add'>+sys_fstatat(int dirfd, const char *pathname, struct stat *buf, int flags)</div><div class='add'>+{</div><div class='add'>+#ifdef GF_DARWIN_HOST_OS</div><div class='add'>+    if (fchdir(dirfd) &lt; 0)</div><div class='add'>+        return -1;</div><div class='add'>+    if (flags &amp; AT_SYMLINK_NOFOLLOW)</div><div class='add'>+        return FS_RET_CHECK0(lstat(pathname, buf), errno);</div><div class='add'>+    else</div><div class='add'>+        return FS_RET_CHECK0(stat(pathname, buf), errno);</div><div class='add'>+#else</div><div class='add'>+    return FS_RET_CHECK0(fstatat(dirfd, pathname, buf, flags), errno);</div><div class='add'>+#endif</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-sys_fstat (int fd, struct stat *buf)</div><div class='add'>+sys_openat(int dirfd, const char *pathname, int flags, int mode)</div><div class='ctx'> {</div><div class='del'>-        return fstat (fd, buf);</div><div class='add'>+    int fd;</div><div class='add'>+</div><div class='add'>+#ifdef GF_DARWIN_HOST_OS</div><div class='add'>+    if (fchdir(dirfd) &lt; 0)</div><div class='add'>+        return -1;</div><div class='add'>+    fd = open(pathname, flags, mode);</div><div class='add'>+    /* TODO: Shouldn't we restore the old current directory */</div><div class='add'>+#else /* GF_DARWIN_HOST_OS */</div><div class='add'>+    fd = openat(dirfd, pathname, flags, mode);</div><div class='add'>+#ifdef __FreeBSD__</div><div class='add'>+    /* On FreeBSD S_ISVTX flag is ignored for an open() with O_CREAT set.</div><div class='add'>+     * We need to force the flag using fchmod(). */</div><div class='add'>+    if ((fd &gt;= 0) &amp;&amp; ((flags &amp; O_CREAT) != 0) &amp;&amp; ((mode &amp; S_ISVTX) != 0)) {</div><div class='add'>+        sys_fchmod(fd, mode);</div><div class='add'>+        /* TODO: It's unlikely that fchmod could fail here. However,</div><div class='add'>+                 if it fails we cannot always restore the old state</div><div class='add'>+                 (if the file existed, we cannot recover it). We would</div><div class='add'>+                 need many more system calls to correctly handle all</div><div class='add'>+                 possible cases and it doesn't worth it. For now we</div><div class='add'>+                 simply ignore the error. */</div><div class='add'>+    }</div><div class='add'>+#endif /* __FreeBSD__ */</div><div class='add'>+#endif /* !GF_DARWIN_HOST_OS */</div><div class='add'>+</div><div class='add'>+    return FS_RET_CHECK(fd, errno);</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+int</div><div class='add'>+sys_open(const char *pathname, int flags, int mode)</div><div class='add'>+{</div><div class='add'>+    return FS_RET_CHECK(sys_openat(AT_FDCWD, pathname, flags, mode), errno);</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> DIR *</div><div class='del'>-sys_opendir (const char *name)</div><div class='add'>+sys_opendir(const char *name)</div><div class='ctx'> {</div><div class='del'>-        return opendir (name);</div><div class='add'>+    return opendir(name);</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='del'>-struct dirent *</div><div class='del'>-sys_readdir (DIR *dir)</div><div class='add'>+int</div><div class='add'>+sys_mkdirat(int dirfd, const char *pathname, mode_t mode)</div><div class='ctx'> {</div><div class='del'>-        return readdir (dir);</div><div class='add'>+#ifdef GF_DARWIN_HOST_OS</div><div class='add'>+    if (fchdir(dirfd) &lt; 0)</div><div class='add'>+        return -1;</div><div class='add'>+    return FS_RET_CHECK0(mkdir(pathname, mode), errno);</div><div class='add'>+#else</div><div class='add'>+    return FS_RET_CHECK0(mkdirat(dirfd, pathname, mode), errno);</div><div class='add'>+#endif</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+struct dirent *</div><div class='add'>+sys_readdir(DIR *dir, struct dirent *de)</div><div class='add'>+{</div><div class='add'>+#if !defined(__GLIBC__)</div><div class='add'>+    /*</div><div class='add'>+     * World+Dog says glibc's readdir(3) is MT-SAFE as long as</div><div class='add'>+     * two threads are not accessing the same DIR; there's a</div><div class='add'>+     * potential buffer overflow in glibc's readdir_r(3); and</div><div class='add'>+     * glibc's readdir_r(3) is deprecated after version 2.22</div><div class='add'>+     * with presumed eventual removal.</div><div class='add'>+     * Given all that, World+Dog says everyone should just use</div><div class='add'>+     * readdir(3). But it's unknown, unclear whether the same</div><div class='add'>+     * is also true for *BSD, MacOS, and, etc.</div><div class='add'>+     */</div><div class='add'>+    struct dirent *entry = NULL;</div><div class='add'>+</div><div class='add'>+    (void)readdir_r(dir, de, &amp;entry);</div><div class='add'>+    return entry;</div><div class='add'>+#else</div><div class='add'>+    return readdir(dir);</div><div class='add'>+#endif</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-ssize_t </div><div class='del'>-sys_readlink (const char *path, char *buf, size_t bufsiz)</div><div class='add'>+ssize_t</div><div class='add'>+sys_readlink(const char *path, char *buf, size_t bufsiz)</div><div class='ctx'> {</div><div class='del'>-        return readlink (path, buf, bufsiz);</div><div class='add'>+    return FS_RET_CHECK(readlink(path, buf, bufsiz), errno);</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='del'>-int </div><div class='del'>-sys_closedir (DIR *dir)</div><div class='add'>+int</div><div class='add'>+sys_closedir(DIR *dir)</div><div class='ctx'> {</div><div class='del'>-        return closedir (dir);</div><div class='add'>+    return FS_RET_CHECK0(closedir(dir), errno);</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-sys_mknod (const char *pathname, mode_t mode, dev_t dev)</div><div class='add'>+sys_mknod(const char *pathname, mode_t mode, dev_t dev)</div><div class='ctx'> {</div><div class='del'>-        return mknod (pathname, mode, dev);</div><div class='add'>+    return FS_RET_CHECK0(mknod(pathname, mode, dev), errno);</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='del'>-int </div><div class='del'>-sys_mkdir (const char *pathname, mode_t mode)</div><div class='add'>+int</div><div class='add'>+sys_mkdir(const char *pathname, mode_t mode)</div><div class='ctx'> {</div><div class='del'>-        return mkdir (pathname, mode);</div><div class='add'>+    return FS_RET_CHECK0(mkdir(pathname, mode), errno);</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='del'>-int </div><div class='del'>-sys_unlink (const char *pathname)</div><div class='add'>+int</div><div class='add'>+sys_unlink(const char *pathname)</div><div class='ctx'> {</div><div class='del'>-        return unlink (pathname);</div><div class='add'>+#ifdef GF_SOLARIS_HOST_OS</div><div class='add'>+    return FS_RET_CHECK0(solaris_unlink(pathname), errno);</div><div class='add'>+#endif</div><div class='add'>+    return FS_RET_CHECK0(unlink(pathname), errno);</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='del'>-int </div><div class='del'>-sys_rmdir (const char *pathname)</div><div class='add'>+int</div><div class='add'>+sys_unlinkat(int dfd, const char *pathname)</div><div class='ctx'> {</div><div class='del'>-        return rmdir (pathname);</div><div class='add'>+#ifdef GF_SOLARIS_HOST_OS</div><div class='add'>+    return FS_RET_CHECK0(solaris_unlinkat(dfd, pathname, 0), errno);</div><div class='add'>+#endif</div><div class='add'>+    return FS_RET_CHECK0(unlinkat(dfd, pathname, 0), errno);</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='del'>-int </div><div class='del'>-sys_symlink (const char *oldpath, const char *newpath)</div><div class='add'>+int</div><div class='add'>+sys_rmdir(const char *pathname)</div><div class='ctx'> {</div><div class='del'>-        return symlink (oldpath, newpath);</div><div class='add'>+    return FS_RET_CHECK0(rmdir(pathname), errno);</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-sys_rename (const char *oldpath, const char *newpath)</div><div class='add'>+sys_symlink(const char *oldpath, const char *newpath)</div><div class='ctx'> {</div><div class='del'>-        return rename (oldpath, newpath);</div><div class='add'>+    return FS_RET_CHECK0(symlink(oldpath, newpath), errno);</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='del'>-int </div><div class='del'>-sys_link (const char *oldpath, const char *newpath)</div><div class='add'>+int</div><div class='add'>+sys_symlinkat(const char *oldpath, int dirfd, const char *newpath)</div><div class='ctx'> {</div><div class='del'>-        return link (oldpath, newpath);</div><div class='add'>+    return FS_RET_CHECK0(symlinkat(oldpath, dirfd, newpath), errno);</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-sys_chmod (const char *path, mode_t mode)</div><div class='add'>+sys_rename(const char *oldpath, const char *newpath)</div><div class='ctx'> {</div><div class='del'>-        return chmod (path, mode);</div><div class='add'>+#ifdef GF_SOLARIS_HOST_OS</div><div class='add'>+    return FS_RET_CHECK0(solaris_rename(oldpath, newpath), errno);</div><div class='add'>+#endif</div><div class='add'>+    return FS_RET_CHECK0(rename(oldpath, newpath), errno);</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+int</div><div class='add'>+sys_link(const char *oldpath, const char *newpath)</div><div class='add'>+{</div><div class='add'>+#ifdef HAVE_LINKAT</div><div class='add'>+    /*</div><div class='add'>+     * On most systems (Linux being the notable exception), link(2)</div><div class='add'>+     * first resolves symlinks. If the target is a directory or</div><div class='add'>+     * is nonexistent, it will fail. linkat(2) operates on the</div><div class='add'>+     * symlink instead of its target when the AT_SYMLINK_FOLLOW</div><div class='add'>+     * flag is not supplied.</div><div class='add'>+     */</div><div class='add'>+    return FS_RET_CHECK0(linkat(AT_FDCWD, oldpath, AT_FDCWD, newpath, 0),</div><div class='add'>+                         errno);</div><div class='add'>+#else</div><div class='add'>+    return FS_RET_CHECK0(link(oldpath, newpath), errno);</div><div class='add'>+#endif</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-sys_fchmod (int fd, mode_t mode)</div><div class='add'>+sys_linkat(int oldfd, const char *oldpath, int newfd, const char *newpath)</div><div class='ctx'> {</div><div class='del'>-        return fchmod (fd, mode);</div><div class='add'>+    return FS_RET_CHECK0(linkat(oldfd, oldpath, newfd, newpath, 0), errno);</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='del'>-int </div><div class='del'>-sys_chown (const char *path, uid_t owner, gid_t group)</div><div class='add'>+int</div><div class='add'>+sys_chmod(const char *path, mode_t mode)</div><div class='ctx'> {</div><div class='del'>-        return chown (path, owner, group);</div><div class='add'>+    return FS_RET_CHECK0(chmod(path, mode), errno);</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-sys_fchown (int fd, uid_t owner, gid_t group)</div><div class='add'>+sys_fchmod(int fd, mode_t mode)</div><div class='ctx'> {</div><div class='del'>-        return fchown (fd, owner, group);</div><div class='add'>+    return FS_RET_CHECK0(fchmod(fd, mode), errno);</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-sys_lchown (const char *path, uid_t owner, gid_t group)</div><div class='add'>+sys_chown(const char *path, uid_t owner, gid_t group)</div><div class='ctx'> {</div><div class='del'>-        return lchown (path, owner, group);</div><div class='add'>+    return FS_RET_CHECK0(chown(path, owner, group), errno);</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='del'>-int </div><div class='del'>-sys_truncate (const char *path, off_t length)</div><div class='add'>+int</div><div class='add'>+sys_fchown(int fd, uid_t owner, gid_t group)</div><div class='ctx'> {</div><div class='del'>-        return truncate (path, length);</div><div class='add'>+    return FS_RET_CHECK0(fchown(fd, owner, group), errno);</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+int</div><div class='add'>+sys_lchown(const char *path, uid_t owner, gid_t group)</div><div class='add'>+{</div><div class='add'>+    return FS_RET_CHECK0(lchown(path, owner, group), errno);</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-int </div><div class='del'>-sys_ftruncate (int fd, off_t length)</div><div class='add'>+int</div><div class='add'>+sys_truncate(const char *path, off_t length)</div><div class='ctx'> {</div><div class='del'>-        return ftruncate (fd, length);</div><div class='add'>+    return FS_RET_CHECK0(truncate(path, length), errno);</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+int</div><div class='add'>+sys_ftruncate(int fd, off_t length)</div><div class='add'>+{</div><div class='add'>+    return FS_RET_CHECK0(ftruncate(fd, length), errno);</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-int </div><div class='del'>-sys_utimes (const char *filename, const struct timeval times[2])</div><div class='add'>+int</div><div class='add'>+sys_utimes(const char *filename, const struct timeval times[2])</div><div class='ctx'> {</div><div class='del'>-        return utimes (filename, times);</div><div class='add'>+    return FS_RET_CHECK0(utimes(filename, times), errno);</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+#if defined(HAVE_UTIMENSAT)</div><div class='add'>+int</div><div class='add'>+sys_utimensat(int dirfd, const char *filename, const struct timespec times[2],</div><div class='add'>+              int flags)</div><div class='add'>+{</div><div class='add'>+    return FS_RET_CHECK0(utimensat(dirfd, filename, times, flags), errno);</div><div class='add'>+}</div><div class='add'>+#endif</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-sys_creat (const char *pathname, mode_t mode)</div><div class='add'>+sys_futimes(int fd, const struct timeval times[2])</div><div class='ctx'> {</div><div class='del'>-        return creat (pathname, mode);</div><div class='add'>+    return futimes(fd, times);</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+int</div><div class='add'>+sys_creat(const char *pathname, mode_t mode)</div><div class='add'>+{</div><div class='add'>+    return FS_RET_CHECK(sys_open(pathname, O_CREAT | O_TRUNC | O_WRONLY, mode),</div><div class='add'>+                        errno);</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> ssize_t</div><div class='del'>-sys_readv (int fd, const struct iovec *iov, int iovcnt)</div><div class='add'>+sys_readv(int fd, const struct iovec *iov, int iovcnt)</div><div class='ctx'> {</div><div class='del'>-        return readv (fd, iov, iovcnt);</div><div class='add'>+    return FS_RET_CHECK(readv(fd, iov, iovcnt), errno);</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+ssize_t</div><div class='add'>+sys_writev(int fd, const struct iovec *iov, int iovcnt)</div><div class='add'>+{</div><div class='add'>+    return FS_RET_CHECK(writev(fd, iov, iovcnt), errno);</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> ssize_t</div><div class='del'>-sys_writev (int fd, const struct iovec *iov, int iovcnt)</div><div class='add'>+sys_read(int fd, void *buf, size_t count)</div><div class='ctx'> {</div><div class='del'>-        return writev (fd, iov, iovcnt);</div><div class='add'>+    return FS_RET_CHECK(read(fd, buf, count), errno);</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+ssize_t</div><div class='add'>+sys_write(int fd, const void *buf, size_t count)</div><div class='add'>+{</div><div class='add'>+    return FS_RET_CHECK(write(fd, buf, count), errno);</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> ssize_t</div><div class='del'>-sys_read (int fd, void *buf, size_t count)</div><div class='add'>+sys_preadv(int fd, const struct iovec *iov, int iovcnt, off_t offset)</div><div class='ctx'> {</div><div class='del'>-        return read (fd, buf, count);</div><div class='add'>+    return FS_RET_CHECK(preadv(fd, iov, iovcnt, offset), errno);</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+ssize_t</div><div class='add'>+sys_pwritev(int fd, const struct iovec *iov, int iovcnt, off_t offset)</div><div class='add'>+{</div><div class='add'>+    return FS_RET_CHECK(pwritev(fd, iov, iovcnt, offset), errno);</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-ssize_t </div><div class='del'>-sys_write (int fd, const void *buf, size_t count)</div><div class='add'>+ssize_t</div><div class='add'>+sys_pread(int fd, void *buf, size_t count, off_t offset)</div><div class='ctx'> {</div><div class='del'>-        return write (fd, buf, count);</div><div class='add'>+    return FS_RET_CHECK(pread(fd, buf, count, offset), errno);</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+ssize_t</div><div class='add'>+sys_pwrite(int fd, const void *buf, size_t count, off_t offset)</div><div class='add'>+{</div><div class='add'>+    return FS_RET_CHECK(pwrite(fd, buf, count, offset), errno);</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> off_t</div><div class='del'>-sys_lseek (int fd, off_t offset, int whence)</div><div class='add'>+sys_lseek(int fd, off_t offset, int whence)</div><div class='ctx'> {</div><div class='del'>-        return lseek (fd, offset, whence);</div><div class='add'>+    return FS_RET_CHECK(lseek(fd, offset, whence), errno);</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-sys_statvfs (const char *path, struct statvfs *buf)</div><div class='add'>+sys_statvfs(const char *path, struct statvfs *buf)</div><div class='ctx'> {</div><div class='del'>-        return statvfs (path, buf);</div><div class='del'>-}</div><div class='add'>+    int ret;</div><div class='ctx'> </div><div class='add'>+    ret = statvfs(path, buf);</div><div class='add'>+#ifdef __FreeBSD__</div><div class='add'>+    /* FreeBSD doesn't return the expected value in buf-&gt;f_bsize. It</div><div class='add'>+     * contains the optimal I/O size instead of the file system block</div><div class='add'>+     * size. Gluster expects that this field contains the block size.</div><div class='add'>+     */</div><div class='add'>+    if (ret == 0) {</div><div class='add'>+        buf-&gt;f_bsize = buf-&gt;f_frsize;</div><div class='add'>+    }</div><div class='add'>+#endif /* __FreeBSD__ */</div><div class='ctx'> </div><div class='del'>-int </div><div class='del'>-sys_close (int fd)</div><div class='del'>-{</div><div class='del'>-        return close (fd);</div><div class='add'>+    return FS_RET_CHECK0(ret, errno);</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+int</div><div class='add'>+sys_fstatvfs(int fd, struct statvfs *buf)</div><div class='add'>+{</div><div class='add'>+    int ret;</div><div class='ctx'> </div><div class='del'>-int </div><div class='del'>-sys_fsync (int fd)</div><div class='add'>+    ret = fstatvfs(fd, buf);</div><div class='add'>+#ifdef __FreeBSD__</div><div class='add'>+    /* FreeBSD doesn't return the expected value in buf-&gt;f_bsize. It</div><div class='add'>+     * contains the optimal I/O size instead of the file system block</div><div class='add'>+     * size. Gluster expects this field to contain the block size.</div><div class='add'>+     */</div><div class='add'>+    if (ret == 0) {</div><div class='add'>+        buf-&gt;f_bsize = buf-&gt;f_frsize;</div><div class='add'>+    }</div><div class='add'>+#endif /* __FreeBSD__ */</div><div class='add'>+</div><div class='add'>+    return FS_RET_CHECK0(ret, errno);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+sys_close(int fd)</div><div class='ctx'> {</div><div class='del'>-        return fsync (fd);</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    if (fd &gt;= 0)</div><div class='add'>+        ret = close(fd);</div><div class='add'>+</div><div class='add'>+    return FS_RET_CHECK0(ret, errno);</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+int</div><div class='add'>+sys_fsync(int fd)</div><div class='add'>+{</div><div class='add'>+    return FS_RET_CHECK0(fsync(fd), errno);</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-int </div><div class='del'>-sys_fdatasync (int fd)</div><div class='add'>+int</div><div class='add'>+sys_fdatasync(int fd)</div><div class='ctx'> {</div><div class='del'>-#ifdef HAVE_FDATASYNC</div><div class='del'>-        return fdatasync (fd);</div><div class='add'>+#ifdef GF_DARWIN_HOST_OS</div><div class='add'>+    return FS_RET_CHECK0(fcntl(fd, F_FULLFSYNC), errno);</div><div class='add'>+#elif __FreeBSD__</div><div class='add'>+    return FS_RET_CHECK0(fsync(fd), errno);</div><div class='ctx'> #else</div><div class='del'>-        return 0;</div><div class='add'>+    return FS_RET_CHECK0(fdatasync(fd), errno);</div><div class='ctx'> #endif</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+void</div><div class='add'>+gf_add_prefix(const char *ns, const char *key, char **newkey)</div><div class='add'>+{</div><div class='add'>+    /* if we don't have any namespace, append USER NS */</div><div class='add'>+    if (strncmp(key, XATTR_USER_PREFIX, XATTR_USER_PREFIX_LEN) &amp;&amp;</div><div class='add'>+        strncmp(key, XATTR_TRUSTED_PREFIX, XATTR_TRUSTED_PREFIX_LEN) &amp;&amp;</div><div class='add'>+        strncmp(key, XATTR_SECURITY_PREFIX, XATTR_SECURITY_PREFIX_LEN) &amp;&amp;</div><div class='add'>+        strncmp(key, XATTR_SYSTEM_PREFIX, XATTR_SYSTEM_PREFIX_LEN)) {</div><div class='add'>+        int ns_length = strlen(ns);</div><div class='add'>+        *newkey = GF_MALLOC(ns_length + strlen(key) + 10, gf_common_mt_char);</div><div class='add'>+        if (!*newkey)</div><div class='add'>+            return;</div><div class='add'>+        strcpy(*newkey, ns);</div><div class='add'>+        strcat(*newkey, key);</div><div class='add'>+    } else {</div><div class='add'>+        *newkey = gf_strdup(key);</div><div class='add'>+    }</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-int </div><div class='del'>-sys_lsetxattr (const char *path, const char *name, const void *value, </div><div class='del'>-               size_t size, int flags) </div><div class='add'>+void</div><div class='add'>+gf_remove_prefix(const char *ns, const char *key, char **newkey)</div><div class='ctx'> {</div><div class='del'>-        </div><div class='del'>-#ifdef GF_LINUX_HOST_OS</div><div class='del'>-        return lsetxattr (path, name, value, size, flags);</div><div class='add'>+    int ns_length = strlen(ns);</div><div class='add'>+    if (strncmp(key, ns, ns_length) == 0) {</div><div class='add'>+        *newkey = GF_MALLOC(-ns_length + strlen(key) + 10, gf_common_mt_char);</div><div class='add'>+        if (!*newkey)</div><div class='add'>+            return;</div><div class='add'>+        strcpy(*newkey, key + ns_length);</div><div class='add'>+    } else {</div><div class='add'>+        *newkey = gf_strdup(key);</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+sys_lsetxattr(const char *path, const char *name, const void *value,</div><div class='add'>+              size_t size, int flags)</div><div class='add'>+{</div><div class='add'>+#if defined(GF_LINUX_HOST_OS) || defined(__NetBSD__)</div><div class='add'>+    return FS_RET_CHECK0(lsetxattr(path, name, value, size, flags), errno);</div><div class='ctx'> #endif</div><div class='ctx'> </div><div class='ctx'> #ifdef GF_BSD_HOST_OS</div><div class='del'>-        return extattr_set_link (path, EXTATTR_NAMESPACE_USER, </div><div class='del'>-                                 name, value, size);</div><div class='add'>+    return FS_RET_CHECK(</div><div class='add'>+        extattr_set_link(path, EXTATTR_NAMESPACE_USER, name, value, size),</div><div class='add'>+        errno);</div><div class='ctx'> #endif</div><div class='del'>-        </div><div class='add'>+</div><div class='ctx'> #ifdef GF_SOLARIS_HOST_OS</div><div class='del'>-        return solaris_setxattr (path, name, value, size, flags);</div><div class='add'>+    return FS_RET_CHECK0(solaris_setxattr(path, name, value, size, flags),</div><div class='add'>+                         errno);</div><div class='ctx'> #endif</div><div class='ctx'> </div><div class='ctx'> #ifdef GF_DARWIN_HOST_OS</div><div class='del'>-        return setxattr (path, name, value, size, 0, </div><div class='del'>-                         flags|XATTR_NOFOLLOW);</div><div class='add'>+    /* OS X clients will carry other flags, which will be used on a</div><div class='add'>+       OS X host, but masked out on others. GF assume NOFOLLOW on Linux,</div><div class='add'>+       enforcing  */</div><div class='add'>+    return FS_RET_CHECK0(setxattr(path, name, value, size, 0,</div><div class='add'>+                                  (flags &amp; ~XATTR_NOSECURITY) | XATTR_NOFOLLOW),</div><div class='add'>+                         errno);</div><div class='ctx'> #endif</div><div class='del'>-        </div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> ssize_t</div><div class='del'>-sys_llistxattr (const char *path, char *list, size_t size) </div><div class='add'>+sys_llistxattr(const char *path, char *list, size_t size)</div><div class='ctx'> {</div><div class='del'>-        </div><div class='del'>-#ifdef GF_LINUX_HOST_OS</div><div class='del'>-        return llistxattr (path, list, size);</div><div class='add'>+#if defined(GF_LINUX_HOST_OS) || defined(__NetBSD__)</div><div class='add'>+    return FS_RET_CHECK(llistxattr(path, list, size), errno);</div><div class='ctx'> #endif</div><div class='ctx'> </div><div class='ctx'> #ifdef GF_BSD_HOST_OS</div><div class='del'>-        return extattr_list_link (path, EXTATTR_NAMESPACE_USER, list, size);</div><div class='add'>+    ssize_t ret = FS_RET_CHECK(</div><div class='add'>+        extattr_list_link(path, EXTATTR_NAMESPACE_USER, list, size), errno);</div><div class='add'>+    gf_extattr_list_reshape(list, ret);</div><div class='add'>+    return ret;</div><div class='ctx'> #endif</div><div class='del'>-        </div><div class='add'>+</div><div class='ctx'> #ifdef GF_SOLARIS_HOST_OS</div><div class='del'>-        return solaris_listxattr (path, list, size);</div><div class='add'>+    return FS_RET_CHECK(solaris_listxattr(path, list, size), errno);</div><div class='ctx'> #endif</div><div class='ctx'> </div><div class='ctx'> #ifdef GF_DARWIN_HOST_OS</div><div class='del'>-        return listxattr (path, list, size, XATTR_NOFOLLOW);</div><div class='add'>+    return FS_RET_CHECK(listxattr(path, list, size, XATTR_NOFOLLOW), errno);</div><div class='ctx'> #endif</div><div class='del'>-        </div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> ssize_t</div><div class='del'>-sys_lgetxattr (const char *path, const char *name, void *value, size_t size) </div><div class='add'>+sys_lgetxattr(const char *path, const char *name, void *value, size_t size)</div><div class='ctx'> {</div><div class='del'>-        </div><div class='del'>-#ifdef GF_LINUX_HOST_OS</div><div class='del'>-        return lgetxattr (path, name, value, size);</div><div class='add'>+#if defined(GF_LINUX_HOST_OS) || defined(__NetBSD__)</div><div class='add'>+    return FS_RET_CHECK(lgetxattr(path, name, value, size), errno);</div><div class='ctx'> #endif</div><div class='ctx'> </div><div class='ctx'> #ifdef GF_BSD_HOST_OS</div><div class='del'>-        return extattr_get_link (path, EXTATTR_NAMESPACE_USER, name, value, </div><div class='del'>-                                 size);</div><div class='add'>+    return FS_RET_CHECK(</div><div class='add'>+        extattr_get_link(path, EXTATTR_NAMESPACE_USER, name, value, size),</div><div class='add'>+        errno);</div><div class='ctx'> #endif</div><div class='del'>-        </div><div class='add'>+</div><div class='ctx'> #ifdef GF_SOLARIS_HOST_OS</div><div class='del'>-        return solaris_getxattr (path, name, value, size);</div><div class='add'>+    return FS_RET_CHECK(solaris_getxattr(path, name, value, size), errno);</div><div class='ctx'> #endif</div><div class='ctx'> </div><div class='ctx'> #ifdef GF_DARWIN_HOST_OS</div><div class='del'>-        return getxattr (path, name, value, size, 0, XATTR_NOFOLLOW);</div><div class='add'>+    return FS_RET_CHECK(getxattr(path, name, value, size, 0, XATTR_NOFOLLOW),</div><div class='add'>+                        errno);</div><div class='ctx'> #endif</div><div class='del'>-</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='del'>-ssize_t </div><div class='del'>-sys_fgetxattr (int filedes, const char *name, void *value, size_t size) </div><div class='add'>+ssize_t</div><div class='add'>+sys_fgetxattr(int filedes, const char *name, void *value, size_t size)</div><div class='ctx'> {</div><div class='del'>-        </div><div class='del'>-#ifdef GF_LINUX_HOST_OS</div><div class='del'>-        return fgetxattr (filedes, name, value, size);</div><div class='add'>+#if defined(GF_LINUX_HOST_OS) || defined(__NetBSD__)</div><div class='add'>+    return FS_RET_CHECK(fgetxattr(filedes, name, value, size), errno);</div><div class='ctx'> #endif</div><div class='ctx'> </div><div class='ctx'> #ifdef GF_BSD_HOST_OS</div><div class='del'>-        return extattr_get_fd (filedes, EXTATTR_NAMESPACE_USER, name, </div><div class='del'>-                               value, size);</div><div class='add'>+    return FS_RET_CHECK(</div><div class='add'>+        extattr_get_fd(filedes, EXTATTR_NAMESPACE_USER, name, value, size),</div><div class='add'>+        errno);</div><div class='ctx'> #endif</div><div class='del'>-        </div><div class='add'>+</div><div class='ctx'> #ifdef GF_SOLARIS_HOST_OS</div><div class='del'>-        return solaris_fgetxattr (filedes, name, value, size);</div><div class='add'>+    return FS_RET_CHECK(solaris_fgetxattr(filedes, name, value, size), errno);</div><div class='ctx'> #endif</div><div class='ctx'> </div><div class='ctx'> #ifdef GF_DARWIN_HOST_OS</div><div class='del'>-        return fgetxattr (filedes, name, value, size, 0, 0);</div><div class='add'>+    return FS_RET_CHECK(fgetxattr(filedes, name, value, size, 0, 0), errno);</div><div class='ctx'> #endif</div><div class='del'>-</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='del'>-int </div><div class='del'>-sys_fsetxattr (int filedes, const char *name, const void *value, </div><div class='del'>-               size_t size, int flags)</div><div class='add'>+int</div><div class='add'>+sys_fremovexattr(int filedes, const char *name)</div><div class='ctx'> {</div><div class='del'>-</div><div class='del'>-#ifdef GF_LINUX_HOST_OS</div><div class='del'>-        return fsetxattr (filedes, name, value, size, flags);</div><div class='add'>+#if defined(GF_LINUX_HOST_OS) || defined(__NetBSD__)</div><div class='add'>+    return FS_RET_CHECK0(fremovexattr(filedes, name), errno);</div><div class='ctx'> #endif</div><div class='ctx'> </div><div class='ctx'> #ifdef GF_BSD_HOST_OS</div><div class='del'>-        return extattr_set_fd (filedes, EXTATTR_NAMESPACE_USER, name, </div><div class='del'>-                               value, size);</div><div class='add'>+    return FS_RET_CHECK0(</div><div class='add'>+        extattr_delete_fd(filedes, EXTATTR_NAMESPACE_USER, name), errno);</div><div class='ctx'> #endif</div><div class='del'>-        </div><div class='add'>+</div><div class='ctx'> #ifdef GF_SOLARIS_HOST_OS</div><div class='del'>-        return solaris_fsetxattr (filedes, name, value, size, flags);</div><div class='add'>+    return FS_RET_CHECK0(solaris_fremovexattr(filedes, name), errno);</div><div class='ctx'> #endif</div><div class='ctx'> </div><div class='ctx'> #ifdef GF_DARWIN_HOST_OS</div><div class='del'>-        return fsetxattr (filedes, name, value, size, 0, flags);</div><div class='add'>+    return FS_RET_CHECK0(fremovexattr(filedes, name, 0), errno);</div><div class='ctx'> #endif</div><div class='del'>-</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='del'>-ssize_t </div><div class='del'>-sys_flistxattr (int filedes, char *list, size_t size) </div><div class='add'>+int</div><div class='add'>+sys_fsetxattr(int filedes, const char *name, const void *value, size_t size,</div><div class='add'>+              int flags)</div><div class='ctx'> {</div><div class='del'>-        </div><div class='del'>-#ifdef GF_LINUX_HOST_OS</div><div class='del'>-        return flistxattr (filedes, list, size);</div><div class='add'>+#if defined(GF_LINUX_HOST_OS) || defined(__NetBSD__)</div><div class='add'>+    return FS_RET_CHECK0(fsetxattr(filedes, name, value, size, flags), errno);</div><div class='ctx'> #endif</div><div class='ctx'> </div><div class='ctx'> #ifdef GF_BSD_HOST_OS</div><div class='del'>-        return extattr_list_fd (filedes, EXTATTR_NAMESPACE_USER, list, size);</div><div class='add'>+    return FS_RET_CHECK(</div><div class='add'>+        extattr_set_fd(filedes, EXTATTR_NAMESPACE_USER, name, value, size),</div><div class='add'>+        errno);</div><div class='ctx'> #endif</div><div class='ctx'> </div><div class='ctx'> #ifdef GF_SOLARIS_HOST_OS</div><div class='del'>-        return solaris_flistxattr (filedes, list, size);</div><div class='add'>+    return FS_RET_CHECK0(solaris_fsetxattr(filedes, name, value, size, flags),</div><div class='add'>+                         errno);</div><div class='ctx'> #endif</div><div class='ctx'> </div><div class='ctx'> #ifdef GF_DARWIN_HOST_OS</div><div class='del'>-        return flistxattr (filedes, list, size, XATTR_NOFOLLOW);</div><div class='add'>+    return FS_RET_CHECK0(</div><div class='add'>+        fsetxattr(filedes, name, value, size, 0, flags &amp; ~XATTR_NOSECURITY),</div><div class='add'>+        errno);</div><div class='ctx'> #endif</div><div class='del'>-</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+ssize_t</div><div class='add'>+sys_flistxattr(int filedes, char *list, size_t size)</div><div class='add'>+{</div><div class='add'>+#if defined(GF_LINUX_HOST_OS) || defined(__NetBSD__)</div><div class='add'>+    return FS_RET_CHECK(flistxattr(filedes, list, size), errno);</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#ifdef GF_BSD_HOST_OS</div><div class='add'>+    ssize_t ret = FS_RET_CHECK(</div><div class='add'>+        extattr_list_fd(filedes, EXTATTR_NAMESPACE_USER, list, size), errno);</div><div class='add'>+    gf_extattr_list_reshape(list, ret);</div><div class='add'>+    return ret;</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#ifdef GF_SOLARIS_HOST_OS</div><div class='add'>+    return FS_RET_CHECK(solaris_flistxattr(filedes, list, size), errno);</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#ifdef GF_DARWIN_HOST_OS</div><div class='add'>+    return FS_RET_CHECK(flistxattr(filedes, list, size, XATTR_NOFOLLOW), errno);</div><div class='add'>+#endif</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-int </div><div class='del'>-sys_lremovexattr (const char *path, const char *name)</div><div class='add'>+int</div><div class='add'>+sys_lremovexattr(const char *path, const char *name)</div><div class='ctx'> {</div><div class='del'>-        </div><div class='del'>-#ifdef GF_LINUX_HOST_OS</div><div class='del'>-        return lremovexattr (path, name);</div><div class='add'>+#if defined(GF_LINUX_HOST_OS) || defined(__NetBSD__)</div><div class='add'>+    return FS_RET_CHECK0(lremovexattr(path, name), errno);</div><div class='ctx'> #endif</div><div class='ctx'> </div><div class='ctx'> #ifdef GF_BSD_HOST_OS</div><div class='del'>-        return extattr_delete_link (path, EXTATTR_NAMESPACE_USER, name);</div><div class='add'>+    return FS_RET_CHECK0(</div><div class='add'>+        extattr_delete_link(path, EXTATTR_NAMESPACE_USER, name), errno);</div><div class='ctx'> #endif</div><div class='del'>-        </div><div class='add'>+</div><div class='ctx'> #ifdef GF_SOLARIS_HOST_OS</div><div class='del'>-        return solaris_removexattr (path, name);</div><div class='add'>+    return FS_RET_CHECK0(solaris_removexattr(path, name), errno);</div><div class='ctx'> #endif</div><div class='ctx'> </div><div class='ctx'> #ifdef GF_DARWIN_HOST_OS</div><div class='del'>-        return removexattr (path, name, XATTR_NOFOLLOW);</div><div class='add'>+    return FS_RET_CHECK0(removexattr(path, name, XATTR_NOFOLLOW), errno);</div><div class='add'>+#endif</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+sys_access(const char *pathname, int mode)</div><div class='add'>+{</div><div class='add'>+    return FS_RET_CHECK0(access(pathname, mode), errno);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+sys_fallocate(int fd, int mode, off_t offset, off_t len)</div><div class='add'>+{</div><div class='add'>+#ifdef HAVE_FALLOCATE</div><div class='add'>+    return FS_RET_CHECK0(fallocate(fd, mode, offset, len), errno);</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#ifdef HAVE_POSIX_FALLOCATE</div><div class='add'>+    if (mode) {</div><div class='add'>+        /* keep size not supported */</div><div class='add'>+        errno = EOPNOTSUPP;</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return FS_RET_CHECK_ERRNO(posix_fallocate(fd, offset, len), errno);</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#if defined(F_ALLOCATECONTIG) &amp;&amp; defined(GF_DARWIN_HOST_OS)</div><div class='add'>+    /* C conversion from C++ implementation for OSX by Mozilla Foundation */</div><div class='add'>+    if (mode) {</div><div class='add'>+        /* keep size not supported */</div><div class='add'>+        errno = EOPNOTSUPP;</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+    /*</div><div class='add'>+     *   The F_PREALLOCATE command operates on the following structure:</div><div class='add'>+     *</div><div class='add'>+     *    typedef struct fstore {</div><div class='add'>+     *    u_int32_t fst_flags;      // IN: flags word</div><div class='add'>+     *    int       fst_posmode;    // IN: indicates offset field</div><div class='add'>+     *    off_t     fst_offset;     // IN: start of the region</div><div class='add'>+     *    off_t     fst_length;     // IN: size of the region</div><div class='add'>+     *    off_t     fst_bytesalloc; // OUT: number of bytes allocated</div><div class='add'>+     *    } fstore_t;</div><div class='add'>+     *</div><div class='add'>+     * The flags (fst_flags) for the F_PREALLOCATE command are as follows:</div><div class='add'>+     *    F_ALLOCATECONTIG   Allocate contiguous space.</div><div class='add'>+     *    F_ALLOCATEALL      Allocate all requested space or no space at all.</div><div class='add'>+     *</div><div class='add'>+     * The position modes (fst_posmode) for the F_PREALLOCATE command</div><div class='add'>+     * indicate how to use the offset field.  The modes are as follows:</div><div class='add'>+     *    F_PEOFPOSMODE   Allocate from the physical end of file.</div><div class='add'>+     *    F_VOLPOSMODE    Allocate from the volume offset.</div><div class='add'>+     *</div><div class='add'>+     */</div><div class='add'>+</div><div class='add'>+    int ret;</div><div class='add'>+    fstore_t store = {F_ALLOCATECONTIG, F_PEOFPOSMODE, offset, len, 0};</div><div class='add'>+    ret = fcntl(fd, F_PREALLOCATE, &amp;store);</div><div class='add'>+    if (ret == -1) {</div><div class='add'>+        store.fst_flags = F_ALLOCATEALL;</div><div class='add'>+        ret = fcntl(fd, F_PREALLOCATE, &amp;store);</div><div class='add'>+    }</div><div class='add'>+    if (ret == -1)</div><div class='add'>+        return ret;</div><div class='add'>+    return FS_RET_CHECK0(ftruncate(fd, offset + len), errno);</div><div class='add'>+#endif</div><div class='add'>+    errno = ENOSYS;</div><div class='add'>+    return -1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+sys_socket(int domain, int type, int protocol)</div><div class='add'>+{</div><div class='add'>+#ifdef SOCK_CLOEXEC</div><div class='add'>+    return socket(domain, type | SOCK_CLOEXEC, protocol);</div><div class='add'>+#else</div><div class='add'>+    int fd = -1;</div><div class='add'>+</div><div class='add'>+    fd = socket(domain, type, protocol);</div><div class='add'>+    if (fd &gt;= 0)</div><div class='add'>+        fcntl(fd, F_SETFD, FD_CLOEXEC);</div><div class='add'>+    return fd;</div><div class='add'>+#endif</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#if (defined(HAVE_ACCEPT4) || defined(HAVE_PACCEPT))</div><div class='add'>+static inline int</div><div class='add'>+prep_accept_flags(int flags)</div><div class='add'>+{</div><div class='add'>+    if (flags &amp; O_NONBLOCK) {</div><div class='add'>+        flags &amp;= ~O_NONBLOCK;</div><div class='add'>+        flags |= SOCK_NONBLOCK;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    flags |= SOCK_CLOEXEC;</div><div class='add'>+</div><div class='add'>+    return flags;</div><div class='add'>+}</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+sys_accept(int sock, struct sockaddr *sockaddr, socklen_t *socklen, int flags)</div><div class='add'>+{</div><div class='add'>+    int newsock = -1;</div><div class='add'>+</div><div class='add'>+#ifdef HAVE_ACCEPT4</div><div class='add'>+</div><div class='add'>+    flags = prep_accept_flags(flags);</div><div class='add'>+    newsock = accept4(sock, sockaddr, socklen, flags);</div><div class='add'>+</div><div class='add'>+#elif HAVE_PACCEPT</div><div class='add'>+    flags = prep_accept_flags(flags);</div><div class='add'>+    newsock = paccept(sock, sockaddr, socklen, NULL, flags);</div><div class='add'>+</div><div class='add'>+#else</div><div class='add'>+    int op_errno = 0;</div><div class='add'>+    int curflag = 0;</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    newsock = accept(sock, sockaddr, socklen);</div><div class='add'>+    if (newsock != -1) {</div><div class='add'>+        curflag = fcntl(newsock, F_GETFL);</div><div class='add'>+        if (fcntl(newsock, F_SETFL, curflag | flags) == -1) {</div><div class='add'>+            op_errno = errno;</div><div class='add'>+            goto err;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        curflag = fcntl(newsock, F_GETFD);</div><div class='add'>+        if (fcntl(newsock, F_SETFD, curflag | FD_CLOEXEC) == -1) {</div><div class='add'>+            op_errno = errno;</div><div class='add'>+            goto err;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+err:</div><div class='add'>+    if (op_errno) {</div><div class='add'>+        close(newsock);</div><div class='add'>+        errno = op_errno;</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='ctx'> #endif</div><div class='add'>+    return newsock;</div><div class='add'>+}</div><div class='ctx'> </div><div class='add'>+ssize_t</div><div class='add'>+sys_copy_file_range(int fd_in, off64_t *off_in, int fd_out, off64_t *off_out,</div><div class='add'>+                    size_t len, unsigned int flags)</div><div class='add'>+{</div><div class='add'>+    /*</div><div class='add'>+     * TODO: Add check for other platofrms like freebsd etc if this syscall is</div><div class='add'>+     *       not generic.</div><div class='add'>+     * This is what the function does.</div><div class='add'>+     *       1) Check whether copy_file_range API is present. If so call it.</div><div class='add'>+     *       2) If copy_file_range API is not present, then check whether</div><div class='add'>+     *          the system call is there. If so, then use syscall to invoke</div><div class='add'>+     *          SYS_copy_file_range system call.</div><div class='add'>+     *       3) If neither of the above is present, then return ENOSYS.</div><div class='add'>+     */</div><div class='add'>+#ifdef HAVE_COPY_FILE_RANGE</div><div class='add'>+    return FS_RET_CHECK(</div><div class='add'>+        copy_file_range(fd_in, off_in, fd_out, off_out, len, flags), errno);</div><div class='add'>+#else</div><div class='add'>+#ifdef HAVE_COPY_FILE_RANGE_SYS</div><div class='add'>+    return syscall(SYS_copy_file_range, fd_in, off_in, fd_out, off_out, len,</div><div class='add'>+                   flags);</div><div class='add'>+#else</div><div class='add'>+    errno = ENOSYS;</div><div class='add'>+    return -1;</div><div class='add'>+#endif /* HAVE_COPY_FILE_RANGE_SYS */</div><div class='add'>+#endif /* HAVE_COPY_FILE_RANGE */</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+#ifdef __FreeBSD__</div><div class='add'>+int</div><div class='add'>+sys_kill(pid_t pid, int sig)</div><div class='add'>+{</div><div class='add'>+    return FS_RET_CHECK0(kill(pid, sig), errno);</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-int </div><div class='del'>-sys_access (const char *pathname, int mode)</div><div class='add'>+int</div><div class='add'>+sys_sysctl(const int *name, u_int namelen, void *oldp, size_t *oldlenp,</div><div class='add'>+           const void *newp, size_t newlen)</div><div class='ctx'> {</div><div class='del'>-        return access (pathname, mode);</div><div class='add'>+    return FS_RET_CHECK0(sysctl(name, namelen, oldp, oldlenp, newp, newlen),</div><div class='add'>+                         errno);</div><div class='ctx'> }</div><div class='add'>+#endif</div><div class='head'>diff --git a/libglusterfs/src/syscall.h b/libglusterfs/src/syscall.h<br/>deleted file mode 100644<br/>index 2bc29508b37..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/libglusterfs/src/syscall.h?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/syscall.h</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,148 +0,0 @@</div><div class='del'>-/*</div><div class='del'>-  Copyright (c) 2009 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='del'>-  This file is part of GlusterFS.</div><div class='del'>-</div><div class='del'>-  GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-  it under the terms of the GNU General Public License as published</div><div class='del'>-  by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-  or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-  GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-  WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-  General Public License for more details.</div><div class='del'>-</div><div class='del'>-  You should have received a copy of the GNU General Public License</div><div class='del'>-  along with this program.  If not, see</div><div class='del'>-  &lt;http://www.gnu.org/licenses/&gt;.</div><div class='del'>-*/</div><div class='del'>-</div><div class='del'>-#ifndef __SYSCALL_H__</div><div class='del'>-#define __SYSCALL_H__</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-sys_lstat (const char *path, struct stat *buf);</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-sys_stat (const char *path, struct stat *buf);</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-sys_fstat (int fd, struct stat *buf);</div><div class='del'>-</div><div class='del'>-DIR *</div><div class='del'>-sys_opendir (const char *name);</div><div class='del'>-</div><div class='del'>-struct dirent *</div><div class='del'>-sys_readdir (DIR *dir);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-sys_readlink (const char *path, char *buf, size_t bufsiz);</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-sys_closedir (DIR *dir);</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-sys_mknod (const char *pathname, mode_t mode, dev_t dev);</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-sys_mkdir (const char *pathname, mode_t mode);</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-sys_unlink (const char *pathname);</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-sys_rmdir (const char *pathname);</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-sys_symlink (const char *oldpath, const char *newpath);</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-sys_rename (const char *oldpath, const char *newpath);</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-sys_link (const char *oldpath, const char *newpath);</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-sys_chmod (const char *path, mode_t mode);</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-sys_fchmod (int fd, mode_t mode);</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-sys_chown (const char *path, uid_t owner, gid_t group);</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-sys_fchown (int fd, uid_t owner, gid_t group);</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-sys_lchown (const char *path, uid_t owner, gid_t group);</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-sys_truncate (const char *path, off_t length);</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-sys_ftruncate (int fd, off_t length);</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-sys_utimes (const char *filename, const struct timeval times[2]);</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-sys_creat (const char *pathname, mode_t mode);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-sys_readv (int fd, const struct iovec *iov, int iovcnt);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-sys_writev (int fd, const struct iovec *iov, int iovcnt);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-sys_read (int fd, void *buf, size_t count);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-sys_write (int fd, const void *buf, size_t count);</div><div class='del'>-</div><div class='del'>-off_t</div><div class='del'>-sys_lseek (int fd, off_t offset, int whence);</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-sys_statvfs (const char *path, struct statvfs *buf);</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-sys_close (int fd);</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-sys_fsync (int fd);</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-sys_fdatasync (int fd);</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-sys_lsetxattr (const char *path, const char *name, const void *value,</div><div class='del'>-               size_t size, int flags);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-sys_llistxattr (const char *path, char *list, size_t size);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-sys_lgetxattr (const char *path, const char *name, void *value, size_t size);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-sys_fgetxattr (int filedes, const char *name, void *value, size_t size);</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-sys_fsetxattr (int filedes, const char *name, const void *value,</div><div class='del'>-               size_t size, int flags);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-sys_flistxattr (int filedes, char *list, size_t size);</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-sys_lremovexattr (const char *path, const char *name);</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-sys_access (const char *pathname, int mode);</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-sys_ftruncate (int fd, off_t length);</div><div class='del'>-</div><div class='del'>-#endif /* __SYSCALL_H__ */</div><div class='head'>diff --git a/libglusterfs/src/throttle-tbf.c b/libglusterfs/src/throttle-tbf.c<br/>new file mode 100644<br/>index 00000000000..e11ca4f9d35<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/libglusterfs/src/throttle-tbf.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>libglusterfs/src/throttle-tbf.c</a></div><div class='hunk'>@@ -0,0 +1,290 @@</div><div class='add'>+/*</div><div class='add'>+   Copyright (c) 2015 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+   This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+   This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+   General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+   later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+   cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+/**</div><div class='add'>+ *</div><div class='add'>+ * Basic token bucket implementation for rate limiting. As of now interfaces</div><div class='add'>+ * to throttle disk read request, directory entry scan and hash calculation</div><div class='add'>+ * are available. To throttle a particular request (operation), the call needs</div><div class='add'>+ * to be wrapped in-between throttling APIs, for e.g.</div><div class='add'>+ *</div><div class='add'>+ *  TBF_THROTTLE_BEGIN (...);  &lt;-- induces "delays" if required</div><div class='add'>+ *  {</div><div class='add'>+ *      call (...);</div><div class='add'>+ *  }</div><div class='add'>+ *  TBF_THROTTLE_END (...);  &lt;-- not used atm, maybe needed later</div><div class='add'>+ *</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+#include "glusterfs/mem-pool.h"</div><div class='add'>+#include "glusterfs/throttle-tbf.h"</div><div class='add'>+</div><div class='add'>+typedef struct tbf_throttle {</div><div class='add'>+    char done;</div><div class='add'>+</div><div class='add'>+    pthread_mutex_t mutex;</div><div class='add'>+    pthread_cond_t cond;</div><div class='add'>+</div><div class='add'>+    unsigned long tokens;</div><div class='add'>+</div><div class='add'>+    struct list_head list;</div><div class='add'>+} tbf_throttle_t;</div><div class='add'>+</div><div class='add'>+static tbf_throttle_t *</div><div class='add'>+tbf_init_throttle(unsigned long tokens_required)</div><div class='add'>+{</div><div class='add'>+    tbf_throttle_t *throttle = NULL;</div><div class='add'>+</div><div class='add'>+    throttle = GF_CALLOC(1, sizeof(*throttle), gf_common_mt_tbf_throttle_t);</div><div class='add'>+    if (!throttle)</div><div class='add'>+        return NULL;</div><div class='add'>+</div><div class='add'>+    throttle-&gt;done = 0;</div><div class='add'>+    throttle-&gt;tokens = tokens_required;</div><div class='add'>+    INIT_LIST_HEAD(&amp;throttle-&gt;list);</div><div class='add'>+</div><div class='add'>+    (void)pthread_mutex_init(&amp;throttle-&gt;mutex, NULL);</div><div class='add'>+    (void)pthread_cond_init(&amp;throttle-&gt;cond, NULL);</div><div class='add'>+</div><div class='add'>+    return throttle;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+_tbf_dispatch_queued(tbf_bucket_t *bucket)</div><div class='add'>+{</div><div class='add'>+    gf_boolean_t xcont = _gf_false;</div><div class='add'>+    tbf_throttle_t *tmp = NULL;</div><div class='add'>+    tbf_throttle_t *throttle = NULL;</div><div class='add'>+</div><div class='add'>+    list_for_each_entry_safe(throttle, tmp, &amp;bucket-&gt;queued, list)</div><div class='add'>+    {</div><div class='add'>+        pthread_mutex_lock(&amp;throttle-&gt;mutex);</div><div class='add'>+        {</div><div class='add'>+            if (bucket-&gt;tokens &lt; throttle-&gt;tokens) {</div><div class='add'>+                xcont = _gf_true;</div><div class='add'>+                goto unblock;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            /* this request can now be serviced */</div><div class='add'>+            throttle-&gt;done = 1;</div><div class='add'>+            list_del_init(&amp;throttle-&gt;list);</div><div class='add'>+</div><div class='add'>+            bucket-&gt;tokens -= throttle-&gt;tokens;</div><div class='add'>+            pthread_cond_signal(&amp;throttle-&gt;cond);</div><div class='add'>+        }</div><div class='add'>+    unblock:</div><div class='add'>+        pthread_mutex_unlock(&amp;throttle-&gt;mutex);</div><div class='add'>+        if (xcont)</div><div class='add'>+            break;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void *</div><div class='add'>+tbf_tokengenerator(void *arg)</div><div class='add'>+{</div><div class='add'>+    unsigned long tokenrate = 0;</div><div class='add'>+    unsigned long maxtokens = 0;</div><div class='add'>+    unsigned long token_gen_interval = 0;</div><div class='add'>+    tbf_bucket_t *bucket = arg;</div><div class='add'>+</div><div class='add'>+    tokenrate = bucket-&gt;tokenrate;</div><div class='add'>+    maxtokens = bucket-&gt;maxtokens;</div><div class='add'>+    token_gen_interval = bucket-&gt;token_gen_interval;</div><div class='add'>+</div><div class='add'>+    while (1) {</div><div class='add'>+        gf_nanosleep(token_gen_interval * GF_US_IN_NS);</div><div class='add'>+</div><div class='add'>+        LOCK(&amp;bucket-&gt;lock);</div><div class='add'>+        {</div><div class='add'>+            bucket-&gt;tokens += tokenrate;</div><div class='add'>+            if (bucket-&gt;tokens &gt; maxtokens)</div><div class='add'>+                bucket-&gt;tokens = maxtokens;</div><div class='add'>+</div><div class='add'>+            if (!list_empty(&amp;bucket-&gt;queued))</div><div class='add'>+                _tbf_dispatch_queued(bucket);</div><div class='add'>+        }</div><div class='add'>+        UNLOCK(&amp;bucket-&gt;lock);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return NULL;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/**</div><div class='add'>+ * There is lazy synchronization between this routine (when invoked</div><div class='add'>+ * under tbf_mod() context) and tbf_throttle(). *bucket is</div><div class='add'>+ * updated _after_ all the required variables are initialized.</div><div class='add'>+ */</div><div class='add'>+static int32_t</div><div class='add'>+tbf_init_bucket(tbf_t *tbf, tbf_opspec_t *spec)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+    tbf_bucket_t *curr = NULL;</div><div class='add'>+    tbf_bucket_t **bucket = NULL;</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(spec-&gt;op &gt;= TBF_OP_MIN);</div><div class='add'>+    GF_ASSERT(spec-&gt;op &lt;= TBF_OP_MAX);</div><div class='add'>+</div><div class='add'>+    /* no rate? no throttling. */</div><div class='add'>+    if (!spec-&gt;rate)</div><div class='add'>+        return 0;</div><div class='add'>+</div><div class='add'>+    bucket = tbf-&gt;bucket + spec-&gt;op;</div><div class='add'>+</div><div class='add'>+    curr = GF_CALLOC(1, sizeof(*curr), gf_common_mt_tbf_bucket_t);</div><div class='add'>+    if (!curr)</div><div class='add'>+        goto error_return;</div><div class='add'>+</div><div class='add'>+    LOCK_INIT(&amp;curr-&gt;lock);</div><div class='add'>+    INIT_LIST_HEAD(&amp;curr-&gt;queued);</div><div class='add'>+</div><div class='add'>+    curr-&gt;tokens = 0;</div><div class='add'>+    curr-&gt;tokenrate = spec-&gt;rate;</div><div class='add'>+    curr-&gt;maxtokens = spec-&gt;maxlimit;</div><div class='add'>+    curr-&gt;token_gen_interval = spec-&gt;token_gen_interval;</div><div class='add'>+</div><div class='add'>+    ret = gf_thread_create(&amp;curr-&gt;tokener, NULL, tbf_tokengenerator, curr,</div><div class='add'>+                           "tbfclock");</div><div class='add'>+    if (ret != 0)</div><div class='add'>+        goto freemem;</div><div class='add'>+</div><div class='add'>+    *bucket = curr;</div><div class='add'>+    return 0;</div><div class='add'>+</div><div class='add'>+freemem:</div><div class='add'>+    LOCK_DESTROY(&amp;curr-&gt;lock);</div><div class='add'>+    GF_FREE(curr);</div><div class='add'>+error_return:</div><div class='add'>+    return -1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#define TBF_ALLOC_SIZE (sizeof(tbf_t) + (TBF_OP_MAX * sizeof(tbf_bucket_t)))</div><div class='add'>+</div><div class='add'>+tbf_t *</div><div class='add'>+tbf_init(tbf_opspec_t *tbfspec, unsigned int count)</div><div class='add'>+{</div><div class='add'>+    int32_t i = 0;</div><div class='add'>+    int32_t ret = 0;</div><div class='add'>+    tbf_t *tbf = NULL;</div><div class='add'>+    tbf_opspec_t *opspec = NULL;</div><div class='add'>+</div><div class='add'>+    tbf = GF_CALLOC(1, TBF_ALLOC_SIZE, gf_common_mt_tbf_t);</div><div class='add'>+    if (!tbf)</div><div class='add'>+        goto error_return;</div><div class='add'>+</div><div class='add'>+    tbf-&gt;bucket = (tbf_bucket_t **)((char *)tbf + sizeof(*tbf));</div><div class='add'>+    for (i = 0; i &lt; TBF_OP_MAX; i++) {</div><div class='add'>+        *(tbf-&gt;bucket + i) = NULL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; count; i++) {</div><div class='add'>+        opspec = tbfspec + i;</div><div class='add'>+</div><div class='add'>+        ret = tbf_init_bucket(tbf, opspec);</div><div class='add'>+        if (ret)</div><div class='add'>+            break;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (ret)</div><div class='add'>+        goto error_return;</div><div class='add'>+</div><div class='add'>+    return tbf;</div><div class='add'>+</div><div class='add'>+error_return:</div><div class='add'>+    return NULL;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+tbf_mod_bucket(tbf_bucket_t *bucket, tbf_opspec_t *spec)</div><div class='add'>+{</div><div class='add'>+    LOCK(&amp;bucket-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        bucket-&gt;tokens = 0;</div><div class='add'>+        bucket-&gt;tokenrate = spec-&gt;rate;</div><div class='add'>+        bucket-&gt;maxtokens = spec-&gt;maxlimit;</div><div class='add'>+    }</div><div class='add'>+    UNLOCK(&amp;bucket-&gt;lock);</div><div class='add'>+</div><div class='add'>+    /* next token tick would unqueue pending operations */</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+tbf_mod(tbf_t *tbf, tbf_opspec_t *tbfspec)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+    tbf_bucket_t *bucket = NULL;</div><div class='add'>+    tbf_ops_t op = TBF_OP_MIN;</div><div class='add'>+</div><div class='add'>+    if (!tbf || !tbfspec)</div><div class='add'>+        return -1;</div><div class='add'>+</div><div class='add'>+    op = tbfspec-&gt;op;</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(op &gt;= TBF_OP_MIN);</div><div class='add'>+    GF_ASSERT(op &lt;= TBF_OP_MAX);</div><div class='add'>+</div><div class='add'>+    bucket = *(tbf-&gt;bucket + op);</div><div class='add'>+    if (bucket) {</div><div class='add'>+        tbf_mod_bucket(bucket, tbfspec);</div><div class='add'>+    } else {</div><div class='add'>+        ret = tbf_init_bucket(tbf, tbfspec);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+tbf_throttle(tbf_t *tbf, tbf_ops_t op, unsigned long tokens_requested)</div><div class='add'>+{</div><div class='add'>+    char waitq = 0;</div><div class='add'>+    tbf_bucket_t *bucket = NULL;</div><div class='add'>+    tbf_throttle_t *throttle = NULL;</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(op &gt;= TBF_OP_MIN);</div><div class='add'>+    GF_ASSERT(op &lt;= TBF_OP_MAX);</div><div class='add'>+</div><div class='add'>+    bucket = *(tbf-&gt;bucket + op);</div><div class='add'>+    if (!bucket)</div><div class='add'>+        return;</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;bucket-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        /**</div><div class='add'>+         * if there are enough tokens in the bucket there is no need</div><div class='add'>+         * to throttle the request: therefore, consume the required</div><div class='add'>+         * number of tokens and continue.</div><div class='add'>+         */</div><div class='add'>+        if (tokens_requested &lt;= bucket-&gt;tokens) {</div><div class='add'>+            bucket-&gt;tokens -= tokens_requested;</div><div class='add'>+        } else {</div><div class='add'>+            throttle = tbf_init_throttle(tokens_requested);</div><div class='add'>+            if (!throttle) /* let it slip through for now.. */</div><div class='add'>+                goto unblock;</div><div class='add'>+</div><div class='add'>+            waitq = 1;</div><div class='add'>+            pthread_mutex_lock(&amp;throttle-&gt;mutex);</div><div class='add'>+            list_add_tail(&amp;throttle-&gt;list, &amp;bucket-&gt;queued);</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+unblock:</div><div class='add'>+    UNLOCK(&amp;bucket-&gt;lock);</div><div class='add'>+</div><div class='add'>+    if (waitq) {</div><div class='add'>+        while (!throttle-&gt;done) {</div><div class='add'>+            pthread_cond_wait(&amp;throttle-&gt;cond, &amp;throttle-&gt;mutex);</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        pthread_mutex_unlock(&amp;throttle-&gt;mutex);</div><div class='add'>+</div><div class='add'>+        pthread_mutex_destroy(&amp;throttle-&gt;mutex);</div><div class='add'>+        pthread_cond_destroy(&amp;throttle-&gt;cond);</div><div class='add'>+</div><div class='add'>+        GF_FREE(throttle);</div><div class='add'>+    }</div><div class='add'>+}</div><div class='head'>diff --git a/libglusterfs/src/timer.c b/libglusterfs/src/timer.c<br/>index 0ef1190c324..66c861b04cd 100644<br/>--- a/<a href='/cgit/glusterfs.git/tree/libglusterfs/src/timer.c?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/timer.c</a><br/>+++ b/<a href='/cgit/glusterfs.git/tree/libglusterfs/src/timer.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>libglusterfs/src/timer.c</a></div><div class='hunk'>@@ -1,229 +1,256 @@</div><div class='ctx'> /*</div><div class='del'>-   Copyright (c) 2007-2009 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='del'>-   This file is part of GlusterFS.</div><div class='del'>-</div><div class='del'>-   GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-   it under the terms of the GNU General Public License as published</div><div class='del'>-   by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-   or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-   GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-   WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-   General Public License for more details.</div><div class='del'>-</div><div class='del'>-   You should have received a copy of the GNU General Public License</div><div class='del'>-   along with this program.  If not, see</div><div class='del'>-   &lt;http://www.gnu.org/licenses/&gt;.</div><div class='del'>-*/</div><div class='add'>+  Copyright (c) 2008-2012 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='ctx'> </div><div class='del'>-#ifndef _CONFIG_H</div><div class='del'>-#define _CONFIG_H</div><div class='del'>-#include "config.h"</div><div class='del'>-#endif</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='ctx'> </div><div class='del'>-#include "timer.h"</div><div class='del'>-#include "logging.h"</div><div class='del'>-#include "common-utils.h"</div><div class='del'>-#include "globals.h"</div><div class='add'>+#include "glusterfs/timer.h"</div><div class='add'>+#include "glusterfs/logging.h"</div><div class='add'>+#include "glusterfs/common-utils.h"</div><div class='add'>+#include "glusterfs/globals.h"</div><div class='add'>+#include "glusterfs/timespec.h"</div><div class='add'>+#include "glusterfs/libglusterfs-messages.h"</div><div class='ctx'> </div><div class='del'>-#define TS(tv) ((((unsigned long long) tv.tv_sec) * 1000000) + (tv.tv_usec))</div><div class='add'>+/* fwd decl */</div><div class='add'>+static gf_timer_registry_t *</div><div class='add'>+gf_timer_registry_init(glusterfs_ctx_t *);</div><div class='ctx'> </div><div class='ctx'> gf_timer_t *</div><div class='del'>-gf_timer_call_after (glusterfs_ctx_t *ctx,</div><div class='del'>-                     struct timeval delta,</div><div class='del'>-                     gf_timer_cbk_t callbk,</div><div class='del'>-                     void *data)</div><div class='add'>+gf_timer_call_after(glusterfs_ctx_t *ctx, struct timespec delta,</div><div class='add'>+                    gf_timer_cbk_t callbk, void *data)</div><div class='ctx'> {</div><div class='del'>-        gf_timer_registry_t *reg = NULL;</div><div class='del'>-        gf_timer_t *event = NULL;</div><div class='del'>-        gf_timer_t *trav = NULL;</div><div class='del'>-        unsigned long long at = 0L;</div><div class='del'>-  </div><div class='del'>-        if (ctx == NULL)</div><div class='del'>-        {</div><div class='del'>-                gf_log ("timer", GF_LOG_ERROR, "invalid argument");</div><div class='del'>-                return NULL;</div><div class='del'>-        }</div><div class='add'>+    gf_timer_registry_t *reg = NULL;</div><div class='add'>+    gf_timer_t *event = NULL;</div><div class='add'>+    gf_timer_t *trav = NULL;</div><div class='add'>+    uint64_t at = 0;</div><div class='ctx'> </div><div class='del'>-        reg = gf_timer_registry_init (ctx);</div><div class='add'>+    if ((ctx == NULL) || (ctx-&gt;cleanup_started)) {</div><div class='add'>+        gf_msg_callingfn("timer", GF_LOG_ERROR, EINVAL, LG_MSG_INVALID_ARG,</div><div class='add'>+                         "Either ctx is NULL or"</div><div class='add'>+                         " ctx cleanup started");</div><div class='add'>+        return NULL;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        if (!reg) {</div><div class='del'>-                gf_log ("timer", GF_LOG_ERROR, "!reg");</div><div class='del'>-                return NULL;</div><div class='del'>-        }</div><div class='add'>+    reg = gf_timer_registry_init(ctx);</div><div class='ctx'> </div><div class='del'>-        event = GF_CALLOC (1, sizeof (*event), gf_common_mt_gf_timer_t);</div><div class='del'>-        if (!event) {</div><div class='del'>-                gf_log ("timer", GF_LOG_CRITICAL, "Not enough memory");</div><div class='del'>-                return NULL;</div><div class='del'>-        }</div><div class='del'>-        gettimeofday (&amp;event-&gt;at, NULL);</div><div class='del'>-        event-&gt;at.tv_usec = ((event-&gt;at.tv_usec + delta.tv_usec) % 1000000);</div><div class='del'>-        event-&gt;at.tv_sec += ((event-&gt;at.tv_usec + delta.tv_usec) / 1000000);</div><div class='del'>-        event-&gt;at.tv_sec += delta.tv_sec;</div><div class='del'>-        at = TS (event-&gt;at);</div><div class='del'>-        event-&gt;callbk = callbk;</div><div class='del'>-        event-&gt;data = data;</div><div class='del'>-        event-&gt;xl = THIS;</div><div class='del'>-        pthread_mutex_lock (&amp;reg-&gt;lock);</div><div class='add'>+    if (!reg) {</div><div class='add'>+        gf_msg_callingfn("timer", GF_LOG_ERROR, 0, LG_MSG_TIMER_REGISTER_ERROR,</div><div class='add'>+                         "!reg");</div><div class='add'>+        return NULL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    event = GF_CALLOC(1, sizeof(*event), gf_common_mt_gf_timer_t);</div><div class='add'>+    if (!event) {</div><div class='add'>+        return NULL;</div><div class='add'>+    }</div><div class='add'>+    timespec_now(&amp;event-&gt;at);</div><div class='add'>+    timespec_adjust_delta(&amp;event-&gt;at, delta);</div><div class='add'>+    at = TS(event-&gt;at);</div><div class='add'>+    event-&gt;callbk = callbk;</div><div class='add'>+    event-&gt;data = data;</div><div class='add'>+    event-&gt;xl = THIS;</div><div class='add'>+    pthread_mutex_lock(&amp;reg-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        list_for_each_entry_reverse(trav, &amp;reg-&gt;active, list)</div><div class='ctx'>         {</div><div class='del'>-                trav = reg-&gt;active.prev;</div><div class='del'>-                while (trav != &amp;reg-&gt;active) {</div><div class='del'>-                        if (TS (trav-&gt;at) &lt; at)</div><div class='del'>-                                break;</div><div class='del'>-                        trav = trav-&gt;prev;</div><div class='del'>-                }</div><div class='del'>-                event-&gt;prev = trav;</div><div class='del'>-                event-&gt;next = event-&gt;prev-&gt;next;</div><div class='del'>-                event-&gt;prev-&gt;next = event;</div><div class='del'>-                event-&gt;next-&gt;prev = event;</div><div class='add'>+            if (TS(trav-&gt;at) &lt; at)</div><div class='add'>+                break;</div><div class='add'>+        }</div><div class='add'>+        list_add(&amp;event-&gt;list, &amp;trav-&gt;list);</div><div class='add'>+        if (&amp;trav-&gt;list == &amp;reg-&gt;active) {</div><div class='add'>+            pthread_cond_signal(&amp;reg-&gt;cond);</div><div class='ctx'>         }</div><div class='del'>-        pthread_mutex_unlock (&amp;reg-&gt;lock);</div><div class='del'>-        return event;</div><div class='add'>+    }</div><div class='add'>+    pthread_mutex_unlock(&amp;reg-&gt;lock);</div><div class='add'>+    return event;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> int32_t</div><div class='del'>-gf_timer_call_stale (gf_timer_registry_t *reg,</div><div class='del'>-                     gf_timer_t *event)</div><div class='add'>+gf_timer_call_cancel(glusterfs_ctx_t *ctx, gf_timer_t *event)</div><div class='ctx'> {</div><div class='del'>-        if (reg == NULL || event == NULL)</div><div class='del'>-        {</div><div class='del'>-                gf_log ("timer", GF_LOG_ERROR, "invalid argument");</div><div class='del'>-                return 0;</div><div class='del'>-        }</div><div class='del'>-  </div><div class='del'>-        event-&gt;next-&gt;prev = event-&gt;prev;</div><div class='del'>-        event-&gt;prev-&gt;next = event-&gt;next;</div><div class='del'>-        event-&gt;next = &amp;reg-&gt;stale;</div><div class='del'>-        event-&gt;prev = event-&gt;next-&gt;prev;</div><div class='del'>-        event-&gt;next-&gt;prev = event;</div><div class='del'>-        event-&gt;prev-&gt;next = event;</div><div class='add'>+    gf_timer_registry_t *reg = NULL;</div><div class='add'>+    gf_boolean_t fired = _gf_false;</div><div class='add'>+</div><div class='add'>+    if (ctx == NULL || event == NULL) {</div><div class='add'>+        gf_msg_callingfn("timer", GF_LOG_ERROR, EINVAL, LG_MSG_INVALID_ARG,</div><div class='add'>+                         "invalid argument");</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (ctx-&gt;cleanup_started) {</div><div class='add'>+        gf_msg_callingfn("timer", GF_LOG_INFO, 0, LG_MSG_CTX_CLEANUP_STARTED,</div><div class='add'>+                         "ctx cleanup started");</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;ctx-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        reg = ctx-&gt;timer;</div><div class='add'>+    }</div><div class='add'>+    UNLOCK(&amp;ctx-&gt;lock);</div><div class='ctx'> </div><div class='add'>+    if (!reg) {</div><div class='add'>+        /* This can happen when cleanup may have just started and</div><div class='add'>+         * gf_timer_registry_destroy() sets ctx-&gt;timer to NULL.</div><div class='add'>+         * gf_timer_proc() takes care of cleaning up the events.</div><div class='add'>+         */</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    pthread_mutex_lock(&amp;reg-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        fired = event-&gt;fired;</div><div class='add'>+        if (fired)</div><div class='add'>+            goto unlock;</div><div class='add'>+        list_del(&amp;event-&gt;list);</div><div class='add'>+    }</div><div class='add'>+unlock:</div><div class='add'>+    pthread_mutex_unlock(&amp;reg-&gt;lock);</div><div class='add'>+</div><div class='add'>+    if (!fired) {</div><div class='add'>+        GF_FREE(event);</div><div class='ctx'>         return 0;</div><div class='add'>+    }</div><div class='add'>+    return -1;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-int32_t</div><div class='del'>-gf_timer_call_cancel (glusterfs_ctx_t *ctx,</div><div class='del'>-                      gf_timer_t *event)</div><div class='add'>+static void *</div><div class='add'>+gf_timer_proc(void *data)</div><div class='ctx'> {</div><div class='del'>-        gf_timer_registry_t *reg = NULL;</div><div class='del'>-  </div><div class='del'>-        if (ctx == NULL || event == NULL)</div><div class='del'>-        {</div><div class='del'>-                gf_log ("timer", GF_LOG_ERROR, "invalid argument");</div><div class='del'>-                return 0;</div><div class='del'>-        }</div><div class='del'>-  </div><div class='del'>-        reg = gf_timer_registry_init (ctx);</div><div class='del'>-        if (!reg) {</div><div class='del'>-                gf_log ("timer", GF_LOG_ERROR, "!reg");</div><div class='del'>-                GF_FREE (event);</div><div class='del'>-                return 0;</div><div class='del'>-        }</div><div class='add'>+    gf_timer_registry_t *reg = data;</div><div class='add'>+    gf_timer_t *event = NULL;</div><div class='add'>+    gf_timer_t *tmp = NULL;</div><div class='add'>+    xlator_t *old_THIS = NULL;</div><div class='ctx'> </div><div class='del'>-        pthread_mutex_lock (&amp;reg-&gt;lock);</div><div class='del'>-        {</div><div class='del'>-                event-&gt;next-&gt;prev = event-&gt;prev;</div><div class='del'>-                event-&gt;prev-&gt;next = event-&gt;next;</div><div class='add'>+    pthread_mutex_lock(&amp;reg-&gt;lock);</div><div class='add'>+</div><div class='add'>+    while (!reg-&gt;fin) {</div><div class='add'>+        if (list_empty(&amp;reg-&gt;active)) {</div><div class='add'>+            pthread_cond_wait(&amp;reg-&gt;cond, &amp;reg-&gt;lock);</div><div class='add'>+        } else {</div><div class='add'>+            struct timespec now;</div><div class='add'>+</div><div class='add'>+            timespec_now(&amp;now);</div><div class='add'>+            event = list_first_entry(&amp;reg-&gt;active, gf_timer_t, list);</div><div class='add'>+            if (TS(now) &lt; TS(event-&gt;at)) {</div><div class='add'>+                now = event-&gt;at;</div><div class='add'>+                pthread_cond_timedwait(&amp;reg-&gt;cond, &amp;reg-&gt;lock, &amp;now);</div><div class='add'>+            } else {</div><div class='add'>+                event-&gt;fired = _gf_true;</div><div class='add'>+                list_del_init(&amp;event-&gt;list);</div><div class='add'>+</div><div class='add'>+                pthread_mutex_unlock(&amp;reg-&gt;lock);</div><div class='add'>+</div><div class='add'>+                old_THIS = NULL;</div><div class='add'>+                if (event-&gt;xl) {</div><div class='add'>+                    old_THIS = THIS;</div><div class='add'>+                    THIS = event-&gt;xl;</div><div class='add'>+                }</div><div class='add'>+                event-&gt;callbk(event-&gt;data);</div><div class='add'>+                GF_FREE(event);</div><div class='add'>+                if (old_THIS) {</div><div class='add'>+                    THIS = old_THIS;</div><div class='add'>+                }</div><div class='add'>+</div><div class='add'>+                pthread_mutex_lock(&amp;reg-&gt;lock);</div><div class='add'>+            }</div><div class='ctx'>         }</div><div class='del'>-        pthread_mutex_unlock (&amp;reg-&gt;lock);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        GF_FREE (event);</div><div class='del'>-        return 0;</div><div class='add'>+    /* Do not call gf_timer_call_cancel(),</div><div class='add'>+     * it will lead to deadlock</div><div class='add'>+     */</div><div class='add'>+    list_for_each_entry_safe(event, tmp, &amp;reg-&gt;active, list)</div><div class='add'>+    {</div><div class='add'>+        list_del(&amp;event-&gt;list);</div><div class='add'>+        /* TODO Possible resource leak</div><div class='add'>+         * Before freeing the event, we need to call the respective</div><div class='add'>+         * event functions and free any resources.</div><div class='add'>+         * For example, In case of rpc_clnt_reconnect, we need to</div><div class='add'>+         * unref rpc object which was taken when added to timer</div><div class='add'>+         * wheel.</div><div class='add'>+         */</div><div class='add'>+        GF_FREE(event);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    pthread_mutex_unlock(&amp;reg-&gt;lock);</div><div class='add'>+</div><div class='add'>+    return NULL;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-void *</div><div class='del'>-gf_timer_proc (void *ctx)</div><div class='add'>+static gf_timer_registry_t *</div><div class='add'>+gf_timer_registry_init(glusterfs_ctx_t *ctx)</div><div class='ctx'> {</div><div class='del'>-        gf_timer_registry_t *reg = NULL;</div><div class='del'>-  </div><div class='del'>-        if (ctx == NULL)</div><div class='del'>-        {</div><div class='del'>-                gf_log ("timer", GF_LOG_ERROR, "invalid argument");</div><div class='del'>-                return NULL;</div><div class='add'>+    gf_timer_registry_t *reg = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    pthread_condattr_t attr;</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;ctx-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        reg = ctx-&gt;timer;</div><div class='add'>+        if (reg) {</div><div class='add'>+            UNLOCK(&amp;ctx-&gt;lock);</div><div class='add'>+            goto out;</div><div class='ctx'>         }</div><div class='del'>-  </div><div class='del'>-        reg = gf_timer_registry_init (ctx);</div><div class='add'>+        reg = GF_CALLOC(1, sizeof(*reg), gf_common_mt_gf_timer_registry_t);</div><div class='ctx'>         if (!reg) {</div><div class='del'>-                gf_log ("timer", GF_LOG_ERROR, "!reg");</div><div class='del'>-                return NULL;</div><div class='add'>+            UNLOCK(&amp;ctx-&gt;lock);</div><div class='add'>+            goto out;</div><div class='ctx'>         }</div><div class='add'>+        ctx-&gt;timer = reg;</div><div class='add'>+        pthread_mutex_init(&amp;reg-&gt;lock, NULL);</div><div class='add'>+        pthread_condattr_init(&amp;attr);</div><div class='add'>+        pthread_condattr_setclock(&amp;attr, CLOCK_MONOTONIC);</div><div class='add'>+        pthread_cond_init(&amp;reg-&gt;cond, &amp;attr);</div><div class='add'>+        INIT_LIST_HEAD(&amp;reg-&gt;active);</div><div class='add'>+    }</div><div class='add'>+    UNLOCK(&amp;ctx-&gt;lock);</div><div class='add'>+    ret = gf_thread_create(&amp;reg-&gt;th, NULL, gf_timer_proc, reg, "timer");</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_msg(THIS-&gt;name, GF_LOG_ERROR, ret, LG_MSG_PTHREAD_FAILED,</div><div class='add'>+               "Thread creation failed");</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        while (!reg-&gt;fin) {</div><div class='del'>-                unsigned long long now;</div><div class='del'>-                struct timeval now_tv;</div><div class='del'>-                gf_timer_t *event = NULL;</div><div class='del'>-</div><div class='del'>-                gettimeofday (&amp;now_tv, NULL);</div><div class='del'>-                now = TS (now_tv);</div><div class='del'>-                while (1) {</div><div class='del'>-                        unsigned long long at;</div><div class='del'>-                        char need_cbk = 0;</div><div class='del'>-</div><div class='del'>-                        pthread_mutex_lock (&amp;reg-&gt;lock);</div><div class='del'>-                        {</div><div class='del'>-                                event = reg-&gt;active.next;</div><div class='del'>-                                at = TS (event-&gt;at);</div><div class='del'>-                                if (event != &amp;reg-&gt;active &amp;&amp; now &gt;= at) {</div><div class='del'>-                                        need_cbk = 1;</div><div class='del'>-                                        gf_timer_call_stale (reg, event);</div><div class='del'>-                                }</div><div class='del'>-                        }</div><div class='del'>-                        pthread_mutex_unlock (&amp;reg-&gt;lock);</div><div class='del'>-                        if (event-&gt;xl)</div><div class='del'>-                                THIS = event-&gt;xl;</div><div class='del'>-                        if (need_cbk)</div><div class='del'>-                                event-&gt;callbk  (event-&gt;data);</div><div class='del'>-</div><div class='del'>-                        else</div><div class='del'>-                                break;</div><div class='del'>-                }</div><div class='del'>-                usleep (1000000);</div><div class='del'>-        }</div><div class='add'>+out:</div><div class='add'>+    return reg;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        pthread_mutex_lock (&amp;reg-&gt;lock);</div><div class='del'>-        {</div><div class='del'>-                while (reg-&gt;active.next != &amp;reg-&gt;active) {</div><div class='del'>-                        gf_timer_call_cancel (ctx, reg-&gt;active.next);</div><div class='del'>-                }</div><div class='add'>+void</div><div class='add'>+gf_timer_registry_destroy(glusterfs_ctx_t *ctx)</div><div class='add'>+{</div><div class='add'>+    pthread_t thr_id;</div><div class='add'>+    gf_timer_registry_t *reg = NULL;</div><div class='ctx'> </div><div class='del'>-                while (reg-&gt;stale.next != &amp;reg-&gt;stale) {</div><div class='del'>-                        gf_timer_call_cancel (ctx, reg-&gt;stale.next);</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='del'>-        pthread_mutex_unlock (&amp;reg-&gt;lock);</div><div class='del'>-        pthread_mutex_destroy (&amp;reg-&gt;lock);</div><div class='del'>-        GF_FREE (((glusterfs_ctx_t *)ctx)-&gt;timer);</div><div class='add'>+    if (ctx == NULL)</div><div class='add'>+        return;</div><div class='ctx'> </div><div class='del'>-        return NULL;</div><div class='del'>-}</div><div class='add'>+    LOCK(&amp;ctx-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        reg = ctx-&gt;timer;</div><div class='add'>+        ctx-&gt;timer = NULL;</div><div class='add'>+    }</div><div class='add'>+    UNLOCK(&amp;ctx-&gt;lock);</div><div class='ctx'> </div><div class='del'>-gf_timer_registry_t *</div><div class='del'>-gf_timer_registry_init (glusterfs_ctx_t *ctx)</div><div class='del'>-{</div><div class='del'>-        if (ctx == NULL) {</div><div class='del'>-                gf_log ("timer", GF_LOG_ERROR, "invalid argument");</div><div class='del'>-                return NULL;</div><div class='del'>-        }</div><div class='add'>+    if (!reg)</div><div class='add'>+        return;</div><div class='ctx'> </div><div class='del'>-        if (!ctx-&gt;timer) {</div><div class='del'>-                gf_timer_registry_t *reg = NULL;</div><div class='add'>+    thr_id = reg-&gt;th;</div><div class='ctx'> </div><div class='del'>-                reg = GF_CALLOC (1, sizeof (*reg),</div><div class='del'>-                                 gf_common_mt_gf_timer_registry_t);</div><div class='del'>-                if (!reg)</div><div class='del'>-                        goto out;</div><div class='add'>+    pthread_mutex_lock(&amp;reg-&gt;lock);</div><div class='ctx'> </div><div class='del'>-                pthread_mutex_init (&amp;reg-&gt;lock, NULL);</div><div class='del'>-                reg-&gt;active.next = &amp;reg-&gt;active;</div><div class='del'>-                reg-&gt;active.prev = &amp;reg-&gt;active;</div><div class='del'>-                reg-&gt;stale.next = &amp;reg-&gt;stale;</div><div class='del'>-                reg-&gt;stale.prev = &amp;reg-&gt;stale;</div><div class='add'>+    reg-&gt;fin = 1;</div><div class='add'>+    pthread_cond_signal(&amp;reg-&gt;cond);</div><div class='ctx'> </div><div class='del'>-                ctx-&gt;timer = reg;</div><div class='del'>-                pthread_create (&amp;reg-&gt;th, NULL, gf_timer_proc, ctx);</div><div class='del'>-        }</div><div class='del'>-out:</div><div class='del'>-        return ctx-&gt;timer;</div><div class='add'>+    pthread_mutex_unlock(&amp;reg-&gt;lock);</div><div class='add'>+</div><div class='add'>+    pthread_join(thr_id, NULL);</div><div class='add'>+</div><div class='add'>+    pthread_cond_destroy(&amp;reg-&gt;cond);</div><div class='add'>+    pthread_mutex_destroy(&amp;reg-&gt;lock);</div><div class='add'>+</div><div class='add'>+    GF_FREE(reg);</div><div class='ctx'> }</div><div class='head'>diff --git a/libglusterfs/src/timer.h b/libglusterfs/src/timer.h<br/>deleted file mode 100644<br/>index e5fa5e2c679..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/libglusterfs/src/timer.h?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/timer.h</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,70 +0,0 @@</div><div class='del'>-/*</div><div class='del'>-   Copyright (c) 2007-2009 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='del'>-   This file is part of GlusterFS.</div><div class='del'>-</div><div class='del'>-   GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-   it under the terms of the GNU General Public License as published</div><div class='del'>-   by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-   or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-   GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-   WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-   General Public License for more details.</div><div class='del'>-</div><div class='del'>-   You should have received a copy of the GNU General Public License</div><div class='del'>-   along with this program.  If not, see</div><div class='del'>-   &lt;http://www.gnu.org/licenses/&gt;.</div><div class='del'>-*/</div><div class='del'>-</div><div class='del'>-#ifndef _TIMER_H</div><div class='del'>-#define _TIMER_H</div><div class='del'>-</div><div class='del'>-#ifndef _CONFIG_H</div><div class='del'>-#define _CONFIG_H</div><div class='del'>-#include "config.h"</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-#include "glusterfs.h"</div><div class='del'>-#include "xlator.h"</div><div class='del'>-#include &lt;sys/time.h&gt;</div><div class='del'>-#include &lt;pthread.h&gt;</div><div class='del'>-</div><div class='del'>-typedef void (*gf_timer_cbk_t) (void *);</div><div class='del'>-</div><div class='del'>-struct _gf_timer {</div><div class='del'>-  struct _gf_timer *next, *prev;</div><div class='del'>-  struct timeval at;</div><div class='del'>-  gf_timer_cbk_t callbk;</div><div class='del'>-  void *data;</div><div class='del'>-  xlator_t *xl;</div><div class='del'>-};</div><div class='del'>-</div><div class='del'>-struct _gf_timer_registry {</div><div class='del'>-  pthread_t th;</div><div class='del'>-  char fin;</div><div class='del'>-  struct _gf_timer stale;</div><div class='del'>-  struct _gf_timer active;</div><div class='del'>-  pthread_mutex_t lock;</div><div class='del'>-};</div><div class='del'>-</div><div class='del'>-typedef struct _gf_timer gf_timer_t;</div><div class='del'>-typedef struct _gf_timer_registry gf_timer_registry_t;</div><div class='del'>-</div><div class='del'>-gf_timer_t *</div><div class='del'>-gf_timer_call_after (glusterfs_ctx_t *ctx,</div><div class='del'>-		     struct timeval delta,</div><div class='del'>-		     gf_timer_cbk_t cbk,</div><div class='del'>-		     void *data);</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-gf_timer_call_cancel (glusterfs_ctx_t *ctx,</div><div class='del'>-		      gf_timer_t *event);</div><div class='del'>-</div><div class='del'>-void *</div><div class='del'>-gf_timer_proc (void *data);</div><div class='del'>-</div><div class='del'>-gf_timer_registry_t *</div><div class='del'>-gf_timer_registry_init (glusterfs_ctx_t *ctx);</div><div class='del'>-</div><div class='del'>-#endif /* _TIMER_H */</div><div class='head'>diff --git a/libglusterfs/src/timespec.c b/libglusterfs/src/timespec.c<br/>new file mode 100644<br/>index 00000000000..96cef5c6f07<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/libglusterfs/src/timespec.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>libglusterfs/src/timespec.c</a></div><div class='hunk'>@@ -0,0 +1,129 @@</div><div class='add'>+/*</div><div class='add'>+  Copyright (c) 2013 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#include &lt;stdio.h&gt;</div><div class='add'>+#include &lt;inttypes.h&gt;</div><div class='add'>+#include &lt;time.h&gt;</div><div class='add'>+#include &lt;sys/time.h&gt;</div><div class='add'>+#include &lt;string.h&gt;</div><div class='add'>+</div><div class='add'>+#if defined GF_DARWIN_HOST_OS</div><div class='add'>+#include &lt;mach/mach_time.h&gt;</div><div class='add'>+static mach_timebase_info_data_t gf_timebase;</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#include "glusterfs/timespec.h"</div><div class='add'>+#include "glusterfs/libglusterfs-messages.h"</div><div class='add'>+#include "glusterfs/common-utils.h"</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+timespec_now(struct timespec *ts)</div><div class='add'>+{</div><div class='add'>+#if defined GF_LINUX_HOST_OS || defined GF_SOLARIS_HOST_OS ||                  \</div><div class='add'>+    defined GF_BSD_HOST_OS</div><div class='add'>+    if (0 == clock_gettime(CLOCK_MONOTONIC, ts)) {</div><div class='add'>+        /* All good */</div><div class='add'>+        return;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Fall back, but there is hope in gettimeofday() syscall */</div><div class='add'>+    struct timeval tv;</div><div class='add'>+    if (0 == gettimeofday(&amp;tv, NULL)) {</div><div class='add'>+        /* Again, all good */</div><div class='add'>+        TIMEVAL_TO_TIMESPEC(&amp;tv, ts);</div><div class='add'>+        return;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* If control hits here, there is surely a problem,</div><div class='add'>+       mainly because, as per man page too, these syscalls</div><div class='add'>+       shouldn't fail. Best way is to ABORT, because it is</div><div class='add'>+       not right */</div><div class='add'>+    GF_ABORT("gettimeofday() failed!!");</div><div class='add'>+</div><div class='add'>+#elif defined GF_DARWIN_HOST_OS</div><div class='add'>+    uint64_t time = mach_absolute_time();</div><div class='add'>+    static double scaling = 0.0;</div><div class='add'>+</div><div class='add'>+    if (mach_timebase_info(&amp;gf_timebase) != KERN_SUCCESS) {</div><div class='add'>+        gf_timebase.numer = 1;</div><div class='add'>+        gf_timebase.denom = 1;</div><div class='add'>+    }</div><div class='add'>+    if (gf_timebase.denom == 0) {</div><div class='add'>+        gf_timebase.numer = 1;</div><div class='add'>+        gf_timebase.denom = 1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    scaling = (double)gf_timebase.numer / (double)gf_timebase.denom;</div><div class='add'>+    time *= scaling;</div><div class='add'>+</div><div class='add'>+    ts-&gt;tv_sec = (time * NANO);</div><div class='add'>+    ts-&gt;tv_nsec = (time - (ts-&gt;tv_sec * GIGA));</div><div class='add'>+</div><div class='add'>+#endif /* Platform verification */</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+timespec_now_realtime(struct timespec *ts)</div><div class='add'>+{</div><div class='add'>+#if defined GF_LINUX_HOST_OS || defined GF_SOLARIS_HOST_OS ||                  \</div><div class='add'>+    defined GF_BSD_HOST_OS</div><div class='add'>+    if (0 == clock_gettime(CLOCK_REALTIME, ts)) {</div><div class='add'>+        return;</div><div class='add'>+    }</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+    /* Fall back to gettimeofday()*/</div><div class='add'>+    struct timeval tv = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    if (0 == gettimeofday(&amp;tv, NULL)) {</div><div class='add'>+        TIMEVAL_TO_TIMESPEC(&amp;tv, ts);</div><div class='add'>+        return;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+timespec_adjust_delta(struct timespec *ts, struct timespec delta)</div><div class='add'>+{</div><div class='add'>+    ts-&gt;tv_nsec = ((ts-&gt;tv_nsec + delta.tv_nsec) % 1000000000);</div><div class='add'>+    ts-&gt;tv_sec += ((ts-&gt;tv_nsec + delta.tv_nsec) / 1000000000);</div><div class='add'>+    ts-&gt;tv_sec += delta.tv_sec;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+timespec_sub(const struct timespec *begin, const struct timespec *end,</div><div class='add'>+             struct timespec *res)</div><div class='add'>+{</div><div class='add'>+    if (end-&gt;tv_nsec &lt; begin-&gt;tv_nsec) {</div><div class='add'>+        res-&gt;tv_sec = end-&gt;tv_sec - begin-&gt;tv_sec - 1;</div><div class='add'>+        res-&gt;tv_nsec = end-&gt;tv_nsec + 1000000000 - begin-&gt;tv_nsec;</div><div class='add'>+    } else {</div><div class='add'>+        res-&gt;tv_sec = end-&gt;tv_sec - begin-&gt;tv_sec;</div><div class='add'>+        res-&gt;tv_nsec = end-&gt;tv_nsec - begin-&gt;tv_nsec;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+timespec_cmp(const struct timespec *lhs_ts, const struct timespec *rhs_ts)</div><div class='add'>+{</div><div class='add'>+    if (lhs_ts-&gt;tv_sec &lt; rhs_ts-&gt;tv_sec) {</div><div class='add'>+        return -1;</div><div class='add'>+    } else if (lhs_ts-&gt;tv_sec &gt; rhs_ts-&gt;tv_sec) {</div><div class='add'>+        return 1;</div><div class='add'>+    } else if (lhs_ts-&gt;tv_nsec &lt; rhs_ts-&gt;tv_nsec) {</div><div class='add'>+        return -1;</div><div class='add'>+    } else if (lhs_ts-&gt;tv_nsec &gt; rhs_ts-&gt;tv_nsec) {</div><div class='add'>+        return 1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='head'>diff --git a/libglusterfs/src/trie.c b/libglusterfs/src/trie.c<br/>new file mode 100644<br/>index 00000000000..809550b864c<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/libglusterfs/src/trie.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>libglusterfs/src/trie.c</a></div><div class='hunk'>@@ -0,0 +1,366 @@</div><div class='add'>+/*</div><div class='add'>+  Copyright (c) 2008-2012 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#include &lt;stdio.h&gt;</div><div class='add'>+#include &lt;string.h&gt;</div><div class='add'>+</div><div class='add'>+#include "glusterfs/common-utils.h"</div><div class='add'>+#include "glusterfs/trie.h"</div><div class='add'>+</div><div class='add'>+#define DISTANCE_EDIT 1</div><div class='add'>+#define DISTANCE_INS 1</div><div class='add'>+#define DISTANCE_DEL 1</div><div class='add'>+</div><div class='add'>+struct trienode {</div><div class='add'>+    char id;</div><div class='add'>+    char eow;</div><div class='add'>+    int depth;</div><div class='add'>+    void *data;</div><div class='add'>+    struct trie *trie;</div><div class='add'>+    struct trienode *parent;</div><div class='add'>+    struct trienode *subnodes[255];</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct trie {</div><div class='add'>+    struct trienode root;</div><div class='add'>+    int nodecnt;</div><div class='add'>+    size_t len;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+trie_t *</div><div class='add'>+trie_new()</div><div class='add'>+{</div><div class='add'>+    trie_t *trie = NULL;</div><div class='add'>+</div><div class='add'>+    trie = GF_CALLOC(1, sizeof(*trie), gf_common_mt_trie_trie);</div><div class='add'>+    if (!trie)</div><div class='add'>+        return NULL;</div><div class='add'>+</div><div class='add'>+    trie-&gt;root.trie = trie;</div><div class='add'>+</div><div class='add'>+    return trie;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static trienode_t *</div><div class='add'>+trie_subnode(trienode_t *node, int id)</div><div class='add'>+{</div><div class='add'>+    trienode_t *subnode = NULL;</div><div class='add'>+</div><div class='add'>+    subnode = node-&gt;subnodes[id];</div><div class='add'>+    if (!subnode) {</div><div class='add'>+        subnode = GF_CALLOC(1, sizeof(*subnode), gf_common_mt_trie_node);</div><div class='add'>+        if (!subnode)</div><div class='add'>+            return NULL;</div><div class='add'>+</div><div class='add'>+        subnode-&gt;id = id;</div><div class='add'>+        subnode-&gt;depth = node-&gt;depth + 1;</div><div class='add'>+        node-&gt;subnodes[id] = subnode;</div><div class='add'>+        subnode-&gt;parent = node;</div><div class='add'>+        subnode-&gt;trie = node-&gt;trie;</div><div class='add'>+        node-&gt;trie-&gt;nodecnt++;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return subnode;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+trie_add(trie_t *trie, const char *dword)</div><div class='add'>+{</div><div class='add'>+    trienode_t *node = NULL;</div><div class='add'>+    int i = 0;</div><div class='add'>+    char id = 0;</div><div class='add'>+    trienode_t *subnode = NULL;</div><div class='add'>+</div><div class='add'>+    node = &amp;trie-&gt;root;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; strlen(dword); i++) {</div><div class='add'>+        id = dword[i];</div><div class='add'>+</div><div class='add'>+        subnode = trie_subnode(node, id);</div><div class='add'>+        if (!subnode)</div><div class='add'>+            return -1;</div><div class='add'>+        node = subnode;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    node-&gt;eow = 1;</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+trienode_free(trienode_t *node)</div><div class='add'>+{</div><div class='add'>+    trienode_t *trav = NULL;</div><div class='add'>+    int i = 0;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; 255; i++) {</div><div class='add'>+        trav = node-&gt;subnodes[i];</div><div class='add'>+</div><div class='add'>+        if (trav)</div><div class='add'>+            trienode_free(trav);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    GF_FREE(node-&gt;data);</div><div class='add'>+    GF_FREE(node);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+trie_destroy(trie_t *trie)</div><div class='add'>+{</div><div class='add'>+    trienode_free((trienode_t *)trie);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+trie_destroy_bynode(trienode_t *node)</div><div class='add'>+{</div><div class='add'>+    trie_destroy(node-&gt;trie);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+trienode_walk(trienode_t *node, int (*fn)(trienode_t *node, void *data),</div><div class='add'>+              void *data, int eowonly)</div><div class='add'>+{</div><div class='add'>+    trienode_t *trav = NULL;</div><div class='add'>+    int i = 0;</div><div class='add'>+    int cret = 0;</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    if (!eowonly || node-&gt;eow)</div><div class='add'>+        ret = fn(node, data);</div><div class='add'>+</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; 255; i++) {</div><div class='add'>+        trav = node-&gt;subnodes[i];</div><div class='add'>+        if (!trav)</div><div class='add'>+            continue;</div><div class='add'>+</div><div class='add'>+        cret = trienode_walk(trav, fn, data, eowonly);</div><div class='add'>+        if (cret &lt; 0) {</div><div class='add'>+            ret = cret;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+        ret += cret;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+trie_walk(trie_t *trie, int (*fn)(trienode_t *node, void *data), void *data,</div><div class='add'>+          int eowonly)</div><div class='add'>+{</div><div class='add'>+    return trienode_walk(&amp;trie-&gt;root, fn, data, eowonly);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+print_node(trienode_t *node, char **buf)</div><div class='add'>+{</div><div class='add'>+    if (!node-&gt;parent)</div><div class='add'>+        return;</div><div class='add'>+</div><div class='add'>+    if (node-&gt;parent) {</div><div class='add'>+        print_node(node-&gt;parent, buf);</div><div class='add'>+        *(*buf)++ = node-&gt;id;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+trienode_get_word(trienode_t *node, char **bufp)</div><div class='add'>+{</div><div class='add'>+    char *buf = NULL;</div><div class='add'>+</div><div class='add'>+    buf = GF_CALLOC(1, node-&gt;depth + 1, gf_common_mt_trie_buf);</div><div class='add'>+    if (!buf)</div><div class='add'>+        return -1;</div><div class='add'>+    *bufp = buf;</div><div class='add'>+</div><div class='add'>+    print_node(node, &amp;buf);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+calc_dist(trienode_t *node, void *data)</div><div class='add'>+{</div><div class='add'>+    const char *word = NULL;</div><div class='add'>+    int i = 0;</div><div class='add'>+    int *row = NULL;</div><div class='add'>+    int *uprow = NULL;</div><div class='add'>+    int distu = 0;</div><div class='add'>+    int distl = 0;</div><div class='add'>+    int distul = 0;</div><div class='add'>+</div><div class='add'>+    word = data;</div><div class='add'>+</div><div class='add'>+    node-&gt;data = GF_CALLOC(node-&gt;trie-&gt;len, sizeof(int),</div><div class='add'>+                           gf_common_mt_trie_data);</div><div class='add'>+    if (!node-&gt;data)</div><div class='add'>+        return -1;</div><div class='add'>+    row = node-&gt;data;</div><div class='add'>+</div><div class='add'>+    if (!node-&gt;parent) {</div><div class='add'>+        for (i = 0; i &lt; node-&gt;trie-&gt;len; i++)</div><div class='add'>+            row[i] = i + 1;</div><div class='add'>+</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    uprow = node-&gt;parent-&gt;data;</div><div class='add'>+</div><div class='add'>+    distu = node-&gt;depth;          /* up node */</div><div class='add'>+    distul = node-&gt;parent-&gt;depth; /* up-left node */</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; node-&gt;trie-&gt;len; i++) {</div><div class='add'>+        distl = uprow[i]; /* left node */</div><div class='add'>+</div><div class='add'>+        if (word[i] == node-&gt;id)</div><div class='add'>+            row[i] = distul;</div><div class='add'>+        else</div><div class='add'>+            row[i] = min((distul + DISTANCE_EDIT),</div><div class='add'>+                         min((distu + DISTANCE_DEL), (distl + DISTANCE_INS)));</div><div class='add'>+</div><div class='add'>+        distu = row[i];</div><div class='add'>+        distul = distl;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+trienode_get_dist(trienode_t *node)</div><div class='add'>+{</div><div class='add'>+    int *row = NULL;</div><div class='add'>+</div><div class='add'>+    row = node-&gt;data;</div><div class='add'>+</div><div class='add'>+    return row[node-&gt;trie-&gt;len - 1];</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+struct trienodevec_w {</div><div class='add'>+    struct trienodevec *vec;</div><div class='add'>+    const char *word;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+trienodevec_clear(struct trienodevec *nodevec)</div><div class='add'>+{</div><div class='add'>+    memset(nodevec-&gt;nodes, 0, sizeof(*nodevec-&gt;nodes) * nodevec-&gt;cnt);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+collect_closest(trienode_t *node, void *data)</div><div class='add'>+{</div><div class='add'>+    struct trienodevec_w *nodevec_w = NULL;</div><div class='add'>+    struct trienodevec *nodevec = NULL;</div><div class='add'>+    int dist = 0;</div><div class='add'>+    int i = 0;</div><div class='add'>+</div><div class='add'>+    nodevec_w = data;</div><div class='add'>+    nodevec = nodevec_w-&gt;vec;</div><div class='add'>+</div><div class='add'>+    if (calc_dist(node, (void *)nodevec_w-&gt;word))</div><div class='add'>+        return -1;</div><div class='add'>+</div><div class='add'>+    if (!node-&gt;eow || !nodevec-&gt;cnt)</div><div class='add'>+        return 0;</div><div class='add'>+</div><div class='add'>+    dist = trienode_get_dist(node);</div><div class='add'>+</div><div class='add'>+    /*</div><div class='add'>+     * I thought that when descending further after some dictionary word dw,</div><div class='add'>+     * if we see that child's distance is bigger than it was for dw, then we</div><div class='add'>+     * can prune this branch, as it can contain only worse nodes.</div><div class='add'>+     *</div><div class='add'>+     * This conjecture fails, see eg:</div><div class='add'>+     *</div><div class='add'>+     * d("AB", "B") = 1;</div><div class='add'>+     * d("AB", "BA") = 2;</div><div class='add'>+     * d("AB", "BAB") = 1;</div><div class='add'>+     *</div><div class='add'>+     * -- if both "B" and "BAB" are in dict., then pruning at "BA" * would</div><div class='add'>+     * miss "BAB".</div><div class='add'>+     *</div><div class='add'>+     * (example courtesy of Richard Bann &lt;richardbann at gmail.com&gt;)</div><div class='add'>+</div><div class='add'>+    if (node-&gt;parent-&gt;eow &amp;&amp; dist &gt; trienode_get_dist (node-&gt;parent))</div><div class='add'>+            return 1;</div><div class='add'>+</div><div class='add'>+     */</div><div class='add'>+</div><div class='add'>+    if (nodevec-&gt;nodes[0] &amp;&amp; dist &lt; trienode_get_dist(nodevec-&gt;nodes[0])) {</div><div class='add'>+        /* improving over the findings so far */</div><div class='add'>+        trienodevec_clear(nodevec);</div><div class='add'>+        nodevec-&gt;nodes[0] = node;</div><div class='add'>+    } else if (!nodevec-&gt;nodes[0] ||</div><div class='add'>+               dist == trienode_get_dist(nodevec-&gt;nodes[0])) {</div><div class='add'>+        /* as good as the best so far, add if there is free space */</div><div class='add'>+        for (i = 0; i &lt; nodevec-&gt;cnt; i++) {</div><div class='add'>+            if (!nodevec-&gt;nodes[i]) {</div><div class='add'>+                nodevec-&gt;nodes[i] = node;</div><div class='add'>+                break;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+trie_measure(trie_t *trie, const char *word, trienode_t **nodes, int nodecnt)</div><div class='add'>+{</div><div class='add'>+    struct trienodevec nodevec = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    nodevec.nodes = nodes;</div><div class='add'>+    nodevec.cnt = nodecnt;</div><div class='add'>+</div><div class='add'>+    return trie_measure_vec(trie, word, &amp;nodevec);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+trie_measure_vec(trie_t *trie, const char *word, struct trienodevec *nodevec)</div><div class='add'>+{</div><div class='add'>+    struct trienodevec_w nodevec_w = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    trie-&gt;len = strlen(word);</div><div class='add'>+</div><div class='add'>+    trienodevec_clear(nodevec);</div><div class='add'>+    nodevec_w.vec = nodevec;</div><div class='add'>+    nodevec_w.word = word;</div><div class='add'>+</div><div class='add'>+    ret = trie_walk(trie, collect_closest, &amp;nodevec_w, 0);</div><div class='add'>+    if (ret &gt; 0)</div><div class='add'>+        ret = 0;</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+trienode_reset(trienode_t *node, void *data)</div><div class='add'>+{</div><div class='add'>+    GF_FREE(node-&gt;data);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+trie_reset_search(trie_t *trie)</div><div class='add'>+{</div><div class='add'>+    trie-&gt;len = 0;</div><div class='add'>+</div><div class='add'>+    trie_walk(trie, trienode_reset, NULL, 0);</div><div class='add'>+}</div><div class='head'>diff --git a/libglusterfs/src/unittest/global_mock.c b/libglusterfs/src/unittest/global_mock.c<br/>new file mode 100644<br/>index 00000000000..2fcf96dbad8<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/libglusterfs/src/unittest/global_mock.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>libglusterfs/src/unittest/global_mock.c</a></div><div class='hunk'>@@ -0,0 +1,25 @@</div><div class='add'>+/*</div><div class='add'>+  Copyright (c) 2014 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#include "glusterfs/logging.h"</div><div class='add'>+#include "glusterfs/xlator.h"</div><div class='add'>+</div><div class='add'>+#include &lt;stdarg.h&gt;</div><div class='add'>+#include &lt;stddef.h&gt;</div><div class='add'>+#include &lt;setjmp.h&gt;</div><div class='add'>+#include &lt;inttypes.h&gt;</div><div class='add'>+</div><div class='add'>+#include &lt;cmocka.h&gt;</div><div class='add'>+</div><div class='add'>+xlator_t **</div><div class='add'>+__glusterfs_this_location()</div><div class='add'>+{</div><div class='add'>+    return ((xlator_t **)(uintptr_t)mock());</div><div class='add'>+}</div><div class='head'>diff --git a/libglusterfs/src/unittest/log_mock.c b/libglusterfs/src/unittest/log_mock.c<br/>new file mode 100644<br/>index 00000000000..60f6530726b<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/libglusterfs/src/unittest/log_mock.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>libglusterfs/src/unittest/log_mock.c</a></div><div class='hunk'>@@ -0,0 +1,52 @@</div><div class='add'>+/*</div><div class='add'>+  Copyright (c) 2014 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#include "glusterfs/logging.h"</div><div class='add'>+#include "glusterfs/xlator.h"</div><div class='add'>+</div><div class='add'>+#include &lt;stdarg.h&gt;</div><div class='add'>+#include &lt;stddef.h&gt;</div><div class='add'>+#include &lt;setjmp.h&gt;</div><div class='add'>+#include &lt;inttypes.h&gt;</div><div class='add'>+</div><div class='add'>+#include &lt;cmocka.h&gt;</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+_gf_log(const char *domain, const char *file, const char *function,</div><div class='add'>+        int32_t line, gf_loglevel_t level, const char *fmt, ...)</div><div class='add'>+{</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+_gf_log_callingfn(const char *domain, const char *file, const char *function,</div><div class='add'>+                  int32_t line, gf_loglevel_t level, const char *fmt, ...)</div><div class='add'>+{</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+_gf_log_nomem(const char *domain, const char *file, const char *function,</div><div class='add'>+              int line, gf_loglevel_t level, size_t size)</div><div class='add'>+{</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+_gf_msg_nomem(const char *domain, const char *file, const char *function,</div><div class='add'>+              int line, gf_loglevel_t level, size_t size)</div><div class='add'>+{</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+gf_log_globals_init(void *data, gf_loglevel_t level)</div><div class='add'>+{</div><div class='add'>+}</div><div class='head'>diff --git a/libglusterfs/src/unittest/mem_pool_unittest.c b/libglusterfs/src/unittest/mem_pool_unittest.c<br/>new file mode 100644<br/>index 00000000000..9ca324329ba<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/libglusterfs/src/unittest/mem_pool_unittest.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>libglusterfs/src/unittest/mem_pool_unittest.c</a></div><div class='hunk'>@@ -0,0 +1,483 @@</div><div class='add'>+/*</div><div class='add'>+  Copyright (c) 2014 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#include "glusterfs/mem-pool.h"</div><div class='add'>+#include "glusterfs/logging.h"</div><div class='add'>+#include "glusterfs/xlator.h"</div><div class='add'>+</div><div class='add'>+#include &lt;stdarg.h&gt;</div><div class='add'>+#include &lt;stddef.h&gt;</div><div class='add'>+#include &lt;setjmp.h&gt;</div><div class='add'>+#include &lt;inttypes.h&gt;</div><div class='add'>+#include &lt;string.h&gt;</div><div class='add'>+#include &lt;cmocka_pbc.h&gt;</div><div class='add'>+#include &lt;cmocka.h&gt;</div><div class='add'>+</div><div class='add'>+#ifndef assert_ptr_equal</div><div class='add'>+#define assert_ptr_equal(a, b)                                                 \</div><div class='add'>+    _assert_int_equal(cast_ptr_to_largest_integral_type(a),                    \</div><div class='add'>+                      cast_ptr_to_largest_integral_type(b), __FILE__,          \</div><div class='add'>+                      __LINE__)</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+ * memory header for gf_mem_set_acct_info</div><div class='add'>+ */</div><div class='add'>+typedef struct __attribute__((packed)) {</div><div class='add'>+    uint32_t type;</div><div class='add'>+    size_t size;</div><div class='add'>+    xlator_t *xl;</div><div class='add'>+    uint32_t header_magic;</div><div class='add'>+    uint8_t pad[8];</div><div class='add'>+} mem_header_t;</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+ * Prototypes to private functions</div><div class='add'>+ */</div><div class='add'>+int</div><div class='add'>+gf_mem_set_acct_info(xlator_t *xl, char **alloc_ptr, size_t size, uint32_t type,</div><div class='add'>+                     const char *typestr);</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+ * Helper functions</div><div class='add'>+ */</div><div class='add'>+static xlator_t *</div><div class='add'>+helper_xlator_init(uint32_t num_types)</div><div class='add'>+{</div><div class='add'>+    xlator_t *xl;</div><div class='add'>+    int i, ret;</div><div class='add'>+</div><div class='add'>+    REQUIRE(num_types &gt; 0);</div><div class='add'>+</div><div class='add'>+    xl = test_calloc(1, sizeof(xlator_t));</div><div class='add'>+    assert_non_null(xl);</div><div class='add'>+    xl-&gt;mem_acct-&gt;num_types = num_types;</div><div class='add'>+    xl-&gt;mem_acct = test_calloc(sizeof(struct mem_acct) +</div><div class='add'>+                               sizeof(struct mem_acct_rec) * num_types);</div><div class='add'>+    assert_non_null(xl-&gt;mem_acct);</div><div class='add'>+</div><div class='add'>+    xl-&gt;ctx = test_calloc(1, sizeof(glusterfs_ctx_t));</div><div class='add'>+    assert_non_null(xl-&gt;ctx);</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; num_types; i++) {</div><div class='add'>+        ret = LOCK_INIT(&amp;(xl-&gt;mem_acct-&gt;rec[i].lock));</div><div class='add'>+        assert_int_equal(ret, 0);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ENSURE(num_types == xl-&gt;mem_acct-&gt;num_types);</div><div class='add'>+    ENSURE(NULL != xl);</div><div class='add'>+</div><div class='add'>+    return xl;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+helper_xlator_destroy(xlator_t *xl)</div><div class='add'>+{</div><div class='add'>+    int i, ret;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; xl-&gt;mem_acct-&gt;num_types; i++) {</div><div class='add'>+        ret = LOCK_DESTROY(&amp;(xl-&gt;mem_acct-&gt;rec[i].lock));</div><div class='add'>+        assert_int_equal(ret, 0);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    free(xl-&gt;mem_acct-&gt;rec);</div><div class='add'>+    free(xl-&gt;ctx);</div><div class='add'>+    free(xl);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+helper_check_memory_headers(char *mem, xlator_t *xl, size_t size, uint32_t type)</div><div class='add'>+{</div><div class='add'>+    mem_header_t *p;</div><div class='add'>+</div><div class='add'>+    p = (mem_header_t *)mem, assert_int_equal(p-&gt;type, type);</div><div class='add'>+    assert_int_equal(p-&gt;size, size);</div><div class='add'>+    assert_true(p-&gt;xl == xl);</div><div class='add'>+    assert_int_equal(p-&gt;header_magic, GF_MEM_HEADER_MAGIC);</div><div class='add'>+    assert_true(*(uint32_t *)(mem + sizeof(mem_header_t) + size) ==</div><div class='add'>+                GF_MEM_TRAILER_MAGIC);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+ * Tests</div><div class='add'>+ */</div><div class='add'>+static void</div><div class='add'>+test_gf_mem_acct_enable_set(void **state)</div><div class='add'>+{</div><div class='add'>+    (void)state;</div><div class='add'>+    glusterfs_ctx_t test_ctx;</div><div class='add'>+</div><div class='add'>+    expect_assert_failure(gf_mem_acct_enable_set(NULL));</div><div class='add'>+</div><div class='add'>+    memset(&amp;test_ctx, 0, sizeof(test_ctx));</div><div class='add'>+    assert_true(NULL == test_ctx.process_uuid);</div><div class='add'>+    gf_mem_acct_enable_set((void *)&amp;test_ctx);</div><div class='add'>+    assert_true(1 == test_ctx.mem_acct_enable);</div><div class='add'>+    assert_true(NULL == test_ctx.process_uuid);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+test_gf_mem_set_acct_info_asserts(void **state)</div><div class='add'>+{</div><div class='add'>+    xlator_t *xl;</div><div class='add'>+    xlator_t xltest;</div><div class='add'>+    char *alloc_ptr;</div><div class='add'>+    size_t size;</div><div class='add'>+    uint32_t type;</div><div class='add'>+</div><div class='add'>+    memset(&amp;xltest, 0, sizeof(xlator_t));</div><div class='add'>+    xl = (xlator_t *)0xBADD;</div><div class='add'>+    alloc_ptr = (char *)0xBADD;</div><div class='add'>+    size = 8196;</div><div class='add'>+    type = 0;</div><div class='add'>+</div><div class='add'>+    // Check xl is NULL</div><div class='add'>+    expect_assert_failure(</div><div class='add'>+        gf_mem_set_acct_info(NULL, &amp;alloc_ptr, size, type, ""));</div><div class='add'>+    // Check xl-&gt;mem_acct = NULL</div><div class='add'>+    expect_assert_failure(</div><div class='add'>+        gf_mem_set_acct_info(&amp;xltest, &amp;alloc_ptr, 0, type, ""));</div><div class='add'>+    // Check type &lt;= xl-&gt;mem_acct-&gt;num_types</div><div class='add'>+    type = 100;</div><div class='add'>+    expect_assert_failure(</div><div class='add'>+        gf_mem_set_acct_info(&amp;xltest, &amp;alloc_ptr, 0, type, ""));</div><div class='add'>+    // Check alloc is NULL</div><div class='add'>+    assert_int_equal(-1, gf_mem_set_acct_info(&amp;xltest, NULL, size, type, ""));</div><div class='add'>+</div><div class='add'>+    // Initialize xl</div><div class='add'>+    xl = helper_xlator_init(10);</div><div class='add'>+</div><div class='add'>+    // Test number of types</div><div class='add'>+    type = 100;</div><div class='add'>+    assert_true(NULL != xl-&gt;mem_acct);</div><div class='add'>+    assert_true(type &gt; xl-&gt;mem_acct-&gt;num_types);</div><div class='add'>+    expect_assert_failure(gf_mem_set_acct_info(xl, &amp;alloc_ptr, size, type, ""));</div><div class='add'>+</div><div class='add'>+    helper_xlator_destroy(xl);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+test_gf_mem_set_acct_info_memory(void **state)</div><div class='add'>+{</div><div class='add'>+    xlator_t *xl;</div><div class='add'>+    char *alloc_ptr;</div><div class='add'>+    char *temp_ptr;</div><div class='add'>+    size_t size;</div><div class='add'>+    uint32_t type;</div><div class='add'>+    const char *typestr = "TEST";</div><div class='add'>+</div><div class='add'>+    size = 8196;</div><div class='add'>+    type = 9;</div><div class='add'>+</div><div class='add'>+    // Initialize xl</div><div class='add'>+    xl = helper_xlator_init(10);</div><div class='add'>+    assert_null(xl-&gt;mem_acct-&gt;rec[type].typestr);</div><div class='add'>+</div><div class='add'>+    // Test allocation</div><div class='add'>+    temp_ptr = test_calloc(1, size + GF_MEM_HEADER_SIZE + GF_MEM_TRAILER_SIZE);</div><div class='add'>+    assert_non_null(temp_ptr);</div><div class='add'>+    alloc_ptr = temp_ptr;</div><div class='add'>+    gf_mem_set_acct_info(xl, &amp;alloc_ptr, size, type, typestr);</div><div class='add'>+</div><div class='add'>+    // Check values</div><div class='add'>+    assert_ptr_equal(typestr, xl-&gt;mem_acct-&gt;rec[type].typestr);</div><div class='add'>+    assert_int_equal(xl-&gt;mem_acct-&gt;rec[type].size, size);</div><div class='add'>+    assert_int_equal(xl-&gt;mem_acct-&gt;rec[type].num_allocs, 1);</div><div class='add'>+    assert_int_equal(xl-&gt;mem_acct-&gt;rec[type].total_allocs, 1);</div><div class='add'>+    assert_int_equal(xl-&gt;mem_acct-&gt;rec[type].max_size, size);</div><div class='add'>+    assert_int_equal(xl-&gt;mem_acct-&gt;rec[type].max_num_allocs, 1);</div><div class='add'>+</div><div class='add'>+    // Check memory</div><div class='add'>+    helper_check_memory_headers(temp_ptr, xl, size, type);</div><div class='add'>+</div><div class='add'>+    // Check that alloc_ptr has been moved correctly</div><div class='add'>+    // by gf_mem_set_acct_info</div><div class='add'>+    {</div><div class='add'>+        mem_header_t *p;</div><div class='add'>+</div><div class='add'>+        p = (mem_header_t *)temp_ptr;</div><div class='add'>+        p++;</div><div class='add'>+        p-&gt;type = 1234;</div><div class='add'>+        assert_int_equal(*(uint32_t *)alloc_ptr, p-&gt;type);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    free(temp_ptr);</div><div class='add'>+    helper_xlator_destroy(xl);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+test_gf_calloc_default_calloc(void **state)</div><div class='add'>+{</div><div class='add'>+    xlator_t *xl;</div><div class='add'>+    void *mem;</div><div class='add'>+    size_t size;</div><div class='add'>+    uint32_t type;</div><div class='add'>+</div><div class='add'>+    // Initialize xl</div><div class='add'>+    xl = helper_xlator_init(10);</div><div class='add'>+    assert_int_equal(xl-&gt;ctx-&gt;mem_acct_enable, 0);</div><div class='add'>+    will_return(__glusterfs_this_location, &amp;xl);</div><div class='add'>+</div><div class='add'>+    // Call __gf_calloc</div><div class='add'>+    size = 1024;</div><div class='add'>+    type = 3;</div><div class='add'>+    mem = __gf_calloc(1, size, type, "3");</div><div class='add'>+    assert_non_null(mem);</div><div class='add'>+    memset(mem, 0x5A, size);</div><div class='add'>+</div><div class='add'>+    // Check xl did not change</div><div class='add'>+    assert_int_equal(xl-&gt;mem_acct-&gt;rec[type].size, 0);</div><div class='add'>+    assert_int_equal(xl-&gt;mem_acct-&gt;rec[type].num_allocs, 0);</div><div class='add'>+    assert_int_equal(xl-&gt;mem_acct-&gt;rec[type].total_allocs, 0);</div><div class='add'>+    assert_int_equal(xl-&gt;mem_acct-&gt;rec[type].max_size, 0);</div><div class='add'>+    assert_int_equal(xl-&gt;mem_acct-&gt;rec[type].max_num_allocs, 0);</div><div class='add'>+</div><div class='add'>+    free(mem);</div><div class='add'>+    helper_xlator_destroy(xl);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+test_gf_calloc_mem_acct_enabled(void **state)</div><div class='add'>+{</div><div class='add'>+    xlator_t *xl;</div><div class='add'>+    void *mem;</div><div class='add'>+    size_t size;</div><div class='add'>+    uint32_t type;</div><div class='add'>+</div><div class='add'>+    // Initialize xl</div><div class='add'>+    xl = helper_xlator_init(10);</div><div class='add'>+    assert_int_equal(xl-&gt;ctx-&gt;mem_acct_enable, 0);</div><div class='add'>+    xl-&gt;ctx-&gt;mem_acct_enable = 1;</div><div class='add'>+</div><div class='add'>+    // For line mem-pool.c:115 and mem-pool:118</div><div class='add'>+    will_return_always(__glusterfs_this_location, &amp;xl);</div><div class='add'>+</div><div class='add'>+    // Call __gf_calloc</div><div class='add'>+    size = 1024;</div><div class='add'>+    type = 3;</div><div class='add'>+    mem = __gf_calloc(1, size, type, "3");</div><div class='add'>+    assert_non_null(mem);</div><div class='add'>+    memset(mem, 0x5A, size);</div><div class='add'>+</div><div class='add'>+    // Check xl values</div><div class='add'>+    assert_int_equal(xl-&gt;mem_acct-&gt;rec[type].size, size);</div><div class='add'>+    assert_int_equal(xl-&gt;mem_acct-&gt;rec[type].num_allocs, 1);</div><div class='add'>+    assert_int_equal(xl-&gt;mem_acct-&gt;rec[type].total_allocs, 1);</div><div class='add'>+    assert_int_equal(xl-&gt;mem_acct-&gt;rec[type].max_size, size);</div><div class='add'>+    assert_int_equal(xl-&gt;mem_acct-&gt;rec[type].max_num_allocs, 1);</div><div class='add'>+</div><div class='add'>+    // Check memory</div><div class='add'>+    helper_check_memory_headers(mem - sizeof(mem_header_t), xl, size, type);</div><div class='add'>+    free(mem - sizeof(mem_header_t));</div><div class='add'>+    helper_xlator_destroy(xl);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+test_gf_malloc_default_malloc(void **state)</div><div class='add'>+{</div><div class='add'>+    xlator_t *xl;</div><div class='add'>+    void *mem;</div><div class='add'>+    size_t size;</div><div class='add'>+    uint32_t type;</div><div class='add'>+</div><div class='add'>+    // Initialize xl</div><div class='add'>+    xl = helper_xlator_init(10);</div><div class='add'>+    assert_int_equal(xl-&gt;ctx-&gt;mem_acct_enable, 0);</div><div class='add'>+    will_return(__glusterfs_this_location, &amp;xl);</div><div class='add'>+</div><div class='add'>+    // Call __gf_malloc</div><div class='add'>+    size = 1024;</div><div class='add'>+    type = 3;</div><div class='add'>+    mem = __gf_malloc(size, type, "3");</div><div class='add'>+    assert_non_null(mem);</div><div class='add'>+    memset(mem, 0x5A, size);</div><div class='add'>+</div><div class='add'>+    // Check xl did not change</div><div class='add'>+    assert_int_equal(xl-&gt;mem_acct-&gt;rec[type].size, 0);</div><div class='add'>+    assert_int_equal(xl-&gt;mem_acct-&gt;rec[type].num_allocs, 0);</div><div class='add'>+    assert_int_equal(xl-&gt;mem_acct-&gt;rec[type].total_allocs, 0);</div><div class='add'>+    assert_int_equal(xl-&gt;mem_acct-&gt;rec[type].max_size, 0);</div><div class='add'>+    assert_int_equal(xl-&gt;mem_acct-&gt;rec[type].max_num_allocs, 0);</div><div class='add'>+</div><div class='add'>+    free(mem);</div><div class='add'>+    helper_xlator_destroy(xl);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+test_gf_malloc_mem_acct_enabled(void **state)</div><div class='add'>+{</div><div class='add'>+    xlator_t *xl;</div><div class='add'>+    void *mem;</div><div class='add'>+    size_t size;</div><div class='add'>+    uint32_t type;</div><div class='add'>+</div><div class='add'>+    // Initialize xl</div><div class='add'>+    xl = helper_xlator_init(10);</div><div class='add'>+    assert_int_equal(xl-&gt;ctx-&gt;mem_acct_enable, 0);</div><div class='add'>+    xl-&gt;ctx-&gt;mem_acct_enable = 1;</div><div class='add'>+</div><div class='add'>+    // For line mem-pool.c:115 and mem-pool:118</div><div class='add'>+    will_return_always(__glusterfs_this_location, &amp;xl);</div><div class='add'>+</div><div class='add'>+    // Call __gf_malloc</div><div class='add'>+    size = 1024;</div><div class='add'>+    type = 3;</div><div class='add'>+    mem = __gf_malloc(size, type, "3");</div><div class='add'>+    assert_non_null(mem);</div><div class='add'>+    memset(mem, 0x5A, size);</div><div class='add'>+</div><div class='add'>+    // Check xl values</div><div class='add'>+    assert_int_equal(xl-&gt;mem_acct-&gt;rec[type].size, size);</div><div class='add'>+    assert_int_equal(xl-&gt;mem_acct-&gt;rec[type].num_allocs, 1);</div><div class='add'>+    assert_int_equal(xl-&gt;mem_acct-&gt;rec[type].total_allocs, 1);</div><div class='add'>+    assert_int_equal(xl-&gt;mem_acct-&gt;rec[type].max_size, size);</div><div class='add'>+    assert_int_equal(xl-&gt;mem_acct-&gt;rec[type].max_num_allocs, 1);</div><div class='add'>+</div><div class='add'>+    // Check memory</div><div class='add'>+    helper_check_memory_headers(mem - sizeof(mem_header_t), xl, size, type);</div><div class='add'>+    free(mem - sizeof(mem_header_t));</div><div class='add'>+    helper_xlator_destroy(xl);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+test_gf_realloc_default_realloc(void **state)</div><div class='add'>+{</div><div class='add'>+    xlator_t *xl;</div><div class='add'>+    void *mem;</div><div class='add'>+    size_t size;</div><div class='add'>+    uint32_t type;</div><div class='add'>+</div><div class='add'>+    // Initialize xl</div><div class='add'>+    xl = helper_xlator_init(10);</div><div class='add'>+    assert_int_equal(xl-&gt;ctx-&gt;mem_acct_enable, 0);</div><div class='add'>+    will_return_always(__glusterfs_this_location, &amp;xl);</div><div class='add'>+</div><div class='add'>+    // Call __gf_malloc then realloc</div><div class='add'>+    size = 10;</div><div class='add'>+    type = 3;</div><div class='add'>+    mem = __gf_malloc(size, type, "3");</div><div class='add'>+    assert_non_null(mem);</div><div class='add'>+    memset(mem, 0xA5, size);</div><div class='add'>+</div><div class='add'>+    size = 1024;</div><div class='add'>+    mem = __gf_realloc(mem, size);</div><div class='add'>+    assert_non_null(mem);</div><div class='add'>+    memset(mem, 0x5A, size);</div><div class='add'>+</div><div class='add'>+    // Check xl did not change</div><div class='add'>+    assert_int_equal(xl-&gt;mem_acct-&gt;rec[type].size, 0);</div><div class='add'>+    assert_int_equal(xl-&gt;mem_acct-&gt;rec[type].num_allocs, 0);</div><div class='add'>+    assert_int_equal(xl-&gt;mem_acct-&gt;rec[type].total_allocs, 0);</div><div class='add'>+    assert_int_equal(xl-&gt;mem_acct-&gt;rec[type].max_size, 0);</div><div class='add'>+    assert_int_equal(xl-&gt;mem_acct-&gt;rec[type].max_num_allocs, 0);</div><div class='add'>+</div><div class='add'>+    free(mem);</div><div class='add'>+    helper_xlator_destroy(xl);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+test_gf_realloc_mem_acct_enabled(void **state)</div><div class='add'>+{</div><div class='add'>+    xlator_t *xl;</div><div class='add'>+    void *mem;</div><div class='add'>+    size_t size;</div><div class='add'>+    uint32_t type;</div><div class='add'>+</div><div class='add'>+    // Initialize xl</div><div class='add'>+    xl = helper_xlator_init(10);</div><div class='add'>+    assert_int_equal(xl-&gt;ctx-&gt;mem_acct_enable, 0);</div><div class='add'>+    xl-&gt;ctx-&gt;mem_acct_enable = 1;</div><div class='add'>+</div><div class='add'>+    // For line mem-pool.c:115 and mem-pool:118</div><div class='add'>+    will_return_always(__glusterfs_this_location, &amp;xl);</div><div class='add'>+</div><div class='add'>+    // Call __gf_malloc then realloc</div><div class='add'>+    size = 1024;</div><div class='add'>+    type = 3;</div><div class='add'>+    mem = __gf_malloc(size, type, "3");</div><div class='add'>+    assert_non_null(mem);</div><div class='add'>+    memset(mem, 0xA5, size);</div><div class='add'>+</div><div class='add'>+    size = 2048;</div><div class='add'>+    mem = __gf_realloc(mem, size);</div><div class='add'>+    assert_non_null(mem);</div><div class='add'>+    memset(mem, 0x5A, size);</div><div class='add'>+</div><div class='add'>+    // Check xl values</div><div class='add'>+    //</div><div class='add'>+    // :TODO: This is really weird.  I would have expected</div><div class='add'>+    // xl to only have a size equal to that of the realloc</div><div class='add'>+    // not to the realloc + the malloc.</div><div class='add'>+    // Is this a bug?</div><div class='add'>+    //</div><div class='add'>+    assert_int_equal(xl-&gt;mem_acct-&gt;rec[type].size, size + 1024);</div><div class='add'>+    assert_int_equal(xl-&gt;mem_acct-&gt;rec[type].num_allocs, 2);</div><div class='add'>+    assert_int_equal(xl-&gt;mem_acct-&gt;rec[type].total_allocs, 2);</div><div class='add'>+    assert_int_equal(xl-&gt;mem_acct-&gt;rec[type].max_size, size + 1024);</div><div class='add'>+    assert_int_equal(xl-&gt;mem_acct-&gt;rec[type].max_num_allocs, 2);</div><div class='add'>+</div><div class='add'>+    // Check memory</div><div class='add'>+    helper_check_memory_headers(mem - sizeof(mem_header_t), xl, size, type);</div><div class='add'>+    free(mem - sizeof(mem_header_t));</div><div class='add'>+    helper_xlator_destroy(xl);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+test_gf_realloc_ptr(void **state)</div><div class='add'>+{</div><div class='add'>+    xlator_t *xl;</div><div class='add'>+    void *mem;</div><div class='add'>+    size_t size;</div><div class='add'>+</div><div class='add'>+    // Initialize xl</div><div class='add'>+    xl = helper_xlator_init(10);</div><div class='add'>+    assert_int_equal(xl-&gt;ctx-&gt;mem_acct_enable, 0);</div><div class='add'>+</div><div class='add'>+    // For line mem-pool.c:115 and mem-pool:118</div><div class='add'>+    will_return_always(__glusterfs_this_location, &amp;xl);</div><div class='add'>+</div><div class='add'>+    // Tests according to the manpage for realloc</div><div class='add'>+</div><div class='add'>+    // Like a malloc</div><div class='add'>+    size = 1024;</div><div class='add'>+    mem = __gf_realloc(NULL, size);</div><div class='add'>+    assert_non_null(mem);</div><div class='add'>+    memset(mem, 0xA5, size);</div><div class='add'>+</div><div class='add'>+    // Like a free</div><div class='add'>+    mem = __gf_realloc(mem, 0);</div><div class='add'>+    assert_null(mem);</div><div class='add'>+</div><div class='add'>+    // Now enable xl context</div><div class='add'>+    xl-&gt;ctx-&gt;mem_acct_enable = 1;</div><div class='add'>+    expect_assert_failure(__gf_realloc(NULL, size));</div><div class='add'>+</div><div class='add'>+    helper_xlator_destroy(xl);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+main(void)</div><div class='add'>+{</div><div class='add'>+    const struct CMUnitTest libglusterfs_mem_pool_tests[] = {</div><div class='add'>+        cmocka_unit_test(test_gf_mem_acct_enable_set),</div><div class='add'>+        cmocka_unit_test(test_gf_mem_set_acct_info_asserts),</div><div class='add'>+        cmocka_unit_test(test_gf_mem_set_acct_info_memory),</div><div class='add'>+        cmocka_unit_test(test_gf_calloc_default_calloc),</div><div class='add'>+        cmocka_unit_test(test_gf_calloc_mem_acct_enabled),</div><div class='add'>+        cmocka_unit_test(test_gf_malloc_default_malloc),</div><div class='add'>+        cmocka_unit_test(test_gf_malloc_mem_acct_enabled),</div><div class='add'>+        cmocka_unit_test(test_gf_realloc_default_realloc),</div><div class='add'>+        cmocka_unit_test(test_gf_realloc_mem_acct_enabled),</div><div class='add'>+        cmocka_unit_test(test_gf_realloc_ptr),</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    return cmocka_run_group_tests(libglusterfs_mem_pool_tests, NULL, NULL);</div><div class='add'>+}</div><div class='head'>diff --git a/libglusterfs/src/unittest/unittest.h b/libglusterfs/src/unittest/unittest.h<br/>new file mode 100644<br/>index 00000000000..58b3e28bb6e<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/libglusterfs/src/unittest/unittest.h?id=d1d7a6f35c816822fab51c820e25023863c239c1'>libglusterfs/src/unittest/unittest.h</a></div><div class='hunk'>@@ -0,0 +1,47 @@</div><div class='add'>+/*</div><div class='add'>+  Copyright (c) 2015 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#ifndef _GF_UNITTEST_H_</div><div class='add'>+#define _GF_UNITTEST_H_</div><div class='add'>+</div><div class='add'>+#ifdef UNIT_TESTING</div><div class='add'>+#include &lt;stdarg.h&gt;</div><div class='add'>+#include &lt;stddef.h&gt;</div><div class='add'>+#include &lt;setjmp.h&gt;</div><div class='add'>+#include &lt;cmocka_pbc.h&gt;</div><div class='add'>+#include &lt;cmocka.h&gt;</div><div class='add'>+</div><div class='add'>+extern void</div><div class='add'>+mock_assert(const int result, const char *const expression,</div><div class='add'>+            const char *const file, const int line);</div><div class='add'>+</div><div class='add'>+// Change GF_CALLOC and GF_FREE to use</div><div class='add'>+// cmocka memory allocation versions</div><div class='add'>+#ifdef UNIT_TESTING</div><div class='add'>+#undef GF_CALLOC</div><div class='add'>+#define GF_CALLOC(n, s, t) test_calloc(n, s)</div><div class='add'>+#undef GF_FREE</div><div class='add'>+#define GF_FREE test_free</div><div class='add'>+</div><div class='add'>+/* Catch intended assert()'s while unit-testing */</div><div class='add'>+extern void</div><div class='add'>+mock_assert(const int result, const char *const expression,</div><div class='add'>+            const char *const file, const int line);</div><div class='add'>+</div><div class='add'>+#undef assert</div><div class='add'>+#define assert(expression)                                                     \</div><div class='add'>+    mock_assert((int)(expression), #expression, __FILE__, __LINE__);</div><div class='add'>+#endif</div><div class='add'>+#else</div><div class='add'>+#define REQUIRE(p) /**/</div><div class='add'>+#define ENSURE(p)  /**/</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#endif /* _GF_UNITTEST */</div><div class='head'>diff --git a/libglusterfs/src/xlator.c b/libglusterfs/src/xlator.c<br/>index 2074c143c8c..9a2582d45d5 100644<br/>--- a/<a href='/cgit/glusterfs.git/tree/libglusterfs/src/xlator.c?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/xlator.c</a><br/>+++ b/<a href='/cgit/glusterfs.git/tree/libglusterfs/src/xlator.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>libglusterfs/src/xlator.c</a></div><div class='hunk'>@@ -1,1087 +1,1593 @@</div><div class='ctx'> /*</div><div class='del'>-  Copyright (c) 2006-2009 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='add'>+  Copyright (c) 2008-2012 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='ctx'>   This file is part of GlusterFS.</div><div class='ctx'> </div><div class='del'>-  GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-  it under the terms of the GNU General Public License as published</div><div class='del'>-  by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-  or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-  GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-  WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-  General Public License for more details.</div><div class='del'>-</div><div class='del'>-  You should have received a copy of the GNU General Public License</div><div class='del'>-  along with this program.  If not, see</div><div class='del'>-  &lt;http://www.gnu.org/licenses/&gt;.</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='ctx'> */</div><div class='ctx'> </div><div class='del'>-#ifndef _CONFIG_H</div><div class='del'>-#define _CONFIG_H</div><div class='del'>-#include "config.h"</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-#include "xlator.h"</div><div class='add'>+#include "glusterfs/xlator.h"</div><div class='ctx'> #include &lt;dlfcn.h&gt;</div><div class='ctx'> #include &lt;netdb.h&gt;</div><div class='ctx'> #include &lt;fnmatch.h&gt;</div><div class='del'>-#include "defaults.h"</div><div class='add'>+#include "glusterfs/defaults.h"</div><div class='add'>+#include "glusterfs/libglusterfs-messages.h"</div><div class='ctx'> </div><div class='add'>+#define SET_DEFAULT_FOP(fn)                                                    \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        if (!xl-&gt;fops-&gt;fn)                                                     \</div><div class='add'>+            xl-&gt;fops-&gt;fn = default_##fn;                                       \</div><div class='add'>+        if (!xl-&gt;pass_through_fops-&gt;fn)                                        \</div><div class='add'>+            xl-&gt;pass_through_fops-&gt;fn = default_##fn;                          \</div><div class='add'>+    } while (0)</div><div class='ctx'> </div><div class='del'>-#define SET_DEFAULT_FOP(fn) do {			\</div><div class='del'>-		if (!xl-&gt;fops-&gt;fn)			\</div><div class='del'>-			xl-&gt;fops-&gt;fn = default_##fn;	\</div><div class='del'>-	} while (0)</div><div class='add'>+#define SET_DEFAULT_CBK(fn)                                                    \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        if (!xl-&gt;cbks-&gt;fn)                                                     \</div><div class='add'>+            xl-&gt;cbks-&gt;fn = default_##fn;                                       \</div><div class='add'>+    } while (0)</div><div class='ctx'> </div><div class='del'>-#define SET_DEFAULT_CBK(fn) do {			\</div><div class='del'>-		if (!xl-&gt;cbks-&gt;fn)			\</div><div class='del'>-			xl-&gt;cbks-&gt;fn = default_##fn;	\</div><div class='del'>-	} while (0)</div><div class='add'>+pthread_mutex_t xlator_init_mutex = PTHREAD_MUTEX_INITIALIZER;</div><div class='ctx'> </div><div class='add'>+void</div><div class='add'>+xlator_init_lock(void)</div><div class='add'>+{</div><div class='add'>+    (void)pthread_mutex_lock(&amp;xlator_init_mutex);</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-#define GF_OPTION_LIST_EMPTY(_opt) (_opt-&gt;value[0] == NULL)</div><div class='add'>+void</div><div class='add'>+xlator_init_unlock(void)</div><div class='add'>+{</div><div class='add'>+    (void)pthread_mutex_unlock(&amp;xlator_init_mutex);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static struct xlator_cbks default_cbks = {};</div><div class='add'>+struct volume_options default_options[] = {</div><div class='add'>+    {</div><div class='add'>+        .key = {"log-level"},</div><div class='add'>+        .type = GF_OPTION_TYPE_STR,</div><div class='add'>+        .op_version = {GD_OP_VERSION_6_0},</div><div class='add'>+        .flags = OPT_FLAG_SETTABLE,</div><div class='add'>+        .tags = {"generic"},</div><div class='add'>+        .value = {"DEBUG", "WARNING", "ERROR", "INFO", "CRITICAL", "NONE",</div><div class='add'>+                  "TRACE"},</div><div class='add'>+        .description = "Option to set log-level of given translator",</div><div class='add'>+    },</div><div class='add'>+    {</div><div class='add'>+        .key = {NULL},</div><div class='add'>+    },</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+/* Handle the common options in each translator */</div><div class='add'>+void</div><div class='add'>+handle_default_options(xlator_t *xl, dict_t *options)</div><div class='add'>+{</div><div class='add'>+    int ret;</div><div class='add'>+    char *value;</div><div class='add'>+</div><div class='add'>+    /* log-level */</div><div class='add'>+    ret = dict_get_str(options, "log-level", &amp;value);</div><div class='add'>+    if (!ret) {</div><div class='add'>+        int log_level = glusterd_check_log_level(value);</div><div class='add'>+        if (log_level != -1) {</div><div class='add'>+            xl-&gt;loglevel = log_level;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> static void</div><div class='del'>-fill_defaults (xlator_t *xl)</div><div class='add'>+fill_defaults(xlator_t *xl)</div><div class='ctx'> {</div><div class='del'>-	if (xl == NULL)	{</div><div class='del'>-		gf_log ("xlator", GF_LOG_DEBUG, "invalid argument");</div><div class='del'>-		return;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	SET_DEFAULT_FOP (create);</div><div class='del'>-	SET_DEFAULT_FOP (open);</div><div class='del'>-	SET_DEFAULT_FOP (stat);</div><div class='del'>-	SET_DEFAULT_FOP (readlink);</div><div class='del'>-	SET_DEFAULT_FOP (mknod);</div><div class='del'>-	SET_DEFAULT_FOP (mkdir);</div><div class='del'>-	SET_DEFAULT_FOP (unlink);</div><div class='del'>-	SET_DEFAULT_FOP (rmdir);</div><div class='del'>-	SET_DEFAULT_FOP (symlink);</div><div class='del'>-	SET_DEFAULT_FOP (rename);</div><div class='del'>-	SET_DEFAULT_FOP (link);</div><div class='del'>-	SET_DEFAULT_FOP (truncate);</div><div class='del'>-	SET_DEFAULT_FOP (readv);</div><div class='del'>-	SET_DEFAULT_FOP (writev);</div><div class='del'>-	SET_DEFAULT_FOP (statfs);</div><div class='del'>-	SET_DEFAULT_FOP (flush);</div><div class='del'>-	SET_DEFAULT_FOP (fsync);</div><div class='del'>-	SET_DEFAULT_FOP (setxattr);</div><div class='del'>-	SET_DEFAULT_FOP (getxattr);</div><div class='del'>-	SET_DEFAULT_FOP (fsetxattr);</div><div class='del'>-	SET_DEFAULT_FOP (fgetxattr);</div><div class='del'>-	SET_DEFAULT_FOP (removexattr);</div><div class='del'>-	SET_DEFAULT_FOP (opendir);</div><div class='del'>-	SET_DEFAULT_FOP (readdir);</div><div class='del'>-	SET_DEFAULT_FOP (readdirp);</div><div class='del'>-	SET_DEFAULT_FOP (fsyncdir);</div><div class='del'>-	SET_DEFAULT_FOP (access);</div><div class='del'>-	SET_DEFAULT_FOP (ftruncate);</div><div class='del'>-	SET_DEFAULT_FOP (fstat);</div><div class='del'>-	SET_DEFAULT_FOP (lk);</div><div class='del'>-	SET_DEFAULT_FOP (inodelk);</div><div class='del'>-	SET_DEFAULT_FOP (finodelk);</div><div class='del'>-	SET_DEFAULT_FOP (entrylk);</div><div class='del'>-	SET_DEFAULT_FOP (fentrylk);</div><div class='del'>-	SET_DEFAULT_FOP (lookup);</div><div class='del'>-	SET_DEFAULT_FOP (rchecksum);</div><div class='del'>-	SET_DEFAULT_FOP (xattrop);</div><div class='del'>-	SET_DEFAULT_FOP (fxattrop);</div><div class='del'>-        SET_DEFAULT_FOP (setattr);</div><div class='del'>-        SET_DEFAULT_FOP (fsetattr);</div><div class='del'>-</div><div class='del'>-        SET_DEFAULT_FOP (getspec);</div><div class='del'>-</div><div class='del'>-	SET_DEFAULT_CBK (release);</div><div class='del'>-	SET_DEFAULT_CBK (releasedir);</div><div class='del'>-	SET_DEFAULT_CBK (forget);</div><div class='del'>-</div><div class='del'>-	if (!xl-&gt;notify)</div><div class='del'>-		xl-&gt;notify = default_notify;</div><div class='del'>-</div><div class='del'>-        if (!xl-&gt;mem_acct_init)</div><div class='del'>-                xl-&gt;mem_acct_init = default_mem_acct_init;</div><div class='del'>-</div><div class='del'>-	return;</div><div class='add'>+    if (xl == NULL) {</div><div class='add'>+        gf_msg_callingfn("xlator", GF_LOG_WARNING, EINVAL, LG_MSG_INVALID_ARG,</div><div class='add'>+                         "invalid argument");</div><div class='add'>+        return;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (!xl-&gt;pass_through_fops)</div><div class='add'>+        xl-&gt;pass_through_fops = default_fops;</div><div class='add'>+</div><div class='add'>+    SET_DEFAULT_FOP(create);</div><div class='add'>+    SET_DEFAULT_FOP(open);</div><div class='add'>+    SET_DEFAULT_FOP(stat);</div><div class='add'>+    SET_DEFAULT_FOP(readlink);</div><div class='add'>+    SET_DEFAULT_FOP(mknod);</div><div class='add'>+    SET_DEFAULT_FOP(mkdir);</div><div class='add'>+    SET_DEFAULT_FOP(unlink);</div><div class='add'>+    SET_DEFAULT_FOP(rmdir);</div><div class='add'>+    SET_DEFAULT_FOP(symlink);</div><div class='add'>+    SET_DEFAULT_FOP(rename);</div><div class='add'>+    SET_DEFAULT_FOP(link);</div><div class='add'>+    SET_DEFAULT_FOP(truncate);</div><div class='add'>+    SET_DEFAULT_FOP(readv);</div><div class='add'>+    SET_DEFAULT_FOP(writev);</div><div class='add'>+    SET_DEFAULT_FOP(statfs);</div><div class='add'>+    SET_DEFAULT_FOP(flush);</div><div class='add'>+    SET_DEFAULT_FOP(fsync);</div><div class='add'>+    SET_DEFAULT_FOP(setxattr);</div><div class='add'>+    SET_DEFAULT_FOP(getxattr);</div><div class='add'>+    SET_DEFAULT_FOP(fsetxattr);</div><div class='add'>+    SET_DEFAULT_FOP(fgetxattr);</div><div class='add'>+    SET_DEFAULT_FOP(removexattr);</div><div class='add'>+    SET_DEFAULT_FOP(fremovexattr);</div><div class='add'>+    SET_DEFAULT_FOP(opendir);</div><div class='add'>+    SET_DEFAULT_FOP(readdir);</div><div class='add'>+    SET_DEFAULT_FOP(readdirp);</div><div class='add'>+    SET_DEFAULT_FOP(fsyncdir);</div><div class='add'>+    SET_DEFAULT_FOP(access);</div><div class='add'>+    SET_DEFAULT_FOP(ftruncate);</div><div class='add'>+    SET_DEFAULT_FOP(fstat);</div><div class='add'>+    SET_DEFAULT_FOP(lk);</div><div class='add'>+    SET_DEFAULT_FOP(inodelk);</div><div class='add'>+    SET_DEFAULT_FOP(finodelk);</div><div class='add'>+    SET_DEFAULT_FOP(entrylk);</div><div class='add'>+    SET_DEFAULT_FOP(fentrylk);</div><div class='add'>+    SET_DEFAULT_FOP(lookup);</div><div class='add'>+    SET_DEFAULT_FOP(rchecksum);</div><div class='add'>+    SET_DEFAULT_FOP(xattrop);</div><div class='add'>+    SET_DEFAULT_FOP(fxattrop);</div><div class='add'>+    SET_DEFAULT_FOP(setattr);</div><div class='add'>+    SET_DEFAULT_FOP(fsetattr);</div><div class='add'>+    SET_DEFAULT_FOP(fallocate);</div><div class='add'>+    SET_DEFAULT_FOP(discard);</div><div class='add'>+    SET_DEFAULT_FOP(zerofill);</div><div class='add'>+    SET_DEFAULT_FOP(ipc);</div><div class='add'>+    SET_DEFAULT_FOP(seek);</div><div class='add'>+    SET_DEFAULT_FOP(lease);</div><div class='add'>+    SET_DEFAULT_FOP(getactivelk);</div><div class='add'>+    SET_DEFAULT_FOP(setactivelk);</div><div class='add'>+    SET_DEFAULT_FOP(put);</div><div class='add'>+</div><div class='add'>+    SET_DEFAULT_FOP(getspec);</div><div class='add'>+    SET_DEFAULT_FOP(icreate);</div><div class='add'>+    SET_DEFAULT_FOP(namelink);</div><div class='add'>+    SET_DEFAULT_FOP(copy_file_range);</div><div class='add'>+</div><div class='add'>+    if (!xl-&gt;cbks)</div><div class='add'>+        xl-&gt;cbks = &amp;default_cbks;</div><div class='add'>+</div><div class='add'>+    SET_DEFAULT_CBK(release);</div><div class='add'>+    SET_DEFAULT_CBK(releasedir);</div><div class='add'>+    SET_DEFAULT_CBK(forget);</div><div class='add'>+</div><div class='add'>+    if (!xl-&gt;fini)</div><div class='add'>+        xl-&gt;fini = default_fini;</div><div class='add'>+</div><div class='add'>+    if (!xl-&gt;notify)</div><div class='add'>+        xl-&gt;notify = default_notify;</div><div class='add'>+</div><div class='add'>+    if (!xl-&gt;mem_acct_init)</div><div class='add'>+        xl-&gt;mem_acct_init = default_mem_acct_init;</div><div class='add'>+</div><div class='add'>+    return;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-/* RFC 1123 &amp; 952 */</div><div class='del'>-static char </div><div class='del'>-valid_host_name (char *address, int length)</div><div class='add'>+int</div><div class='add'>+xlator_set_type_virtual(xlator_t *xl, const char *type)</div><div class='ctx'> {</div><div class='del'>-        int i = 0;</div><div class='del'>-        char ret = 1;</div><div class='add'>+    GF_VALIDATE_OR_GOTO("xlator", xl, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("xlator", type, out);</div><div class='ctx'> </div><div class='del'>-        if ((length &gt; 75) || (length == 1)) {</div><div class='del'>-                ret = 0;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='add'>+    xl-&gt;type = gf_strdup(type);</div><div class='add'>+</div><div class='add'>+    if (xl-&gt;type)</div><div class='add'>+        return 0;</div><div class='ctx'> </div><div class='del'>-        if (!isalnum (address[length - 1])) {</div><div class='del'>-                ret = 0;</div><div class='del'>-                goto out;</div><div class='add'>+out:</div><div class='add'>+    return -1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+xlator_volopt_dynload(char *xlator_type, void **dl_handle,</div><div class='add'>+                      volume_opt_list_t *opt_list)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int flag = 0;</div><div class='add'>+    char *name = NULL;</div><div class='add'>+    void *handle = NULL;</div><div class='add'>+    xlator_api_t *xlapi = NULL;</div><div class='add'>+    volume_option_t *opt = NULL;</div><div class='add'>+</div><div class='add'>+    GF_VALIDATE_OR_GOTO("xlator", xlator_type, out);</div><div class='add'>+</div><div class='add'>+    /* socket.so doesn't fall under the default xlator directory, hence we</div><div class='add'>+     * need this check */</div><div class='add'>+    if (!strstr(xlator_type, "rpc-transport"))</div><div class='add'>+        ret = gf_asprintf(&amp;name, "%s/%s.so", XLATORDIR, xlator_type);</div><div class='add'>+    else {</div><div class='add'>+        flag = 1;</div><div class='add'>+        ret = gf_asprintf(&amp;name, "%s/%s.so", XLATORPARENTDIR, xlator_type);</div><div class='add'>+    }</div><div class='add'>+    if (-1 == ret) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = -1;</div><div class='add'>+</div><div class='add'>+    gf_msg_trace("xlator", 0, "attempt to load file %s", name);</div><div class='add'>+</div><div class='add'>+    handle = dlopen(name, RTLD_NOW);</div><div class='add'>+    if (!handle) {</div><div class='add'>+        gf_smsg("xlator", GF_LOG_WARNING, 0, LG_MSG_DLOPEN_FAILED, "error=%s",</div><div class='add'>+                dlerror(), NULL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (flag == 0) {</div><div class='add'>+        /* check new struct first, and then check this */</div><div class='add'>+        xlapi = dlsym(handle, "xlator_api");</div><div class='add'>+        if (!xlapi) {</div><div class='add'>+            gf_smsg("xlator", GF_LOG_ERROR, 0, LG_MSG_DLSYM_ERROR, "error=%s",</div><div class='add'>+                    dlerror(), NULL);</div><div class='add'>+            goto out;</div><div class='ctx'>         }</div><div class='ctx'> </div><div class='del'>-        for (i = 0; i &lt; length; i++) {</div><div class='del'>-                if (!isalnum (address[i]) &amp;&amp; (address[i] != '.')</div><div class='del'>-                    &amp;&amp; (address[i] != '-')) {</div><div class='del'>-                        ret = 0;</div><div class='del'>-                        goto out;</div><div class='del'>-                }</div><div class='add'>+        opt_list-&gt;given_opt = xlapi-&gt;options;</div><div class='add'>+        if (!opt_list-&gt;given_opt) {</div><div class='add'>+            gf_smsg("xlator", GF_LOG_ERROR, 0, LG_MSG_LOAD_FAILED, NULL);</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    } else {</div><div class='add'>+        opt = dlsym(handle, "options");</div><div class='add'>+        if (!opt) {</div><div class='add'>+            gf_smsg("xlator", GF_LOG_ERROR, 0, LG_MSG_DLSYM_ERROR, "error=%s",</div><div class='add'>+                    dlerror(), NULL);</div><div class='add'>+            goto out;</div><div class='ctx'>         }</div><div class='ctx'> </div><div class='add'>+        opt_list-&gt;given_opt = opt;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    *dl_handle = handle;</div><div class='add'>+    handle = NULL;</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='ctx'> out:</div><div class='del'>-        return ret;</div><div class='add'>+    GF_FREE(name);</div><div class='add'>+    if (handle)</div><div class='add'>+        dlclose(handle);</div><div class='add'>+</div><div class='add'>+    gf_msg_debug("xlator", 0, "Returning %d", ret);</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-static char</div><div class='del'>-valid_ipv4_address (char *address, int length)</div><div class='add'>+static int</div><div class='add'>+xlator_dynload_apis(xlator_t *xl)</div><div class='ctx'> {</div><div class='del'>-        int octets = 0;</div><div class='del'>-        int value = 0;</div><div class='del'>-        char *tmp = NULL, *ptr = NULL, *prev = NULL, *endptr = NULL;</div><div class='del'>-        char ret = 1;</div><div class='del'>-</div><div class='del'>-        tmp = gf_strdup (address);</div><div class='del'>-        prev = tmp; </div><div class='del'>-        prev = strtok_r (tmp, ".", &amp;ptr);</div><div class='del'>-</div><div class='del'>-        while (prev != NULL) </div><div class='del'>-        {</div><div class='del'>-                octets++;</div><div class='del'>-                value = strtol (prev, &amp;endptr, 10);</div><div class='del'>-                if ((value &gt; 255) || (value &lt; 0) || (endptr != NULL)) {</div><div class='del'>-                        ret = 0;</div><div class='del'>-                        goto out;</div><div class='del'>-                }</div><div class='del'>-   </div><div class='del'>-                prev = strtok_r (NULL, ".", &amp;ptr);</div><div class='add'>+    int ret = -1;</div><div class='add'>+    void *handle = NULL;</div><div class='add'>+    volume_opt_list_t *vol_opt = NULL;</div><div class='add'>+    xlator_api_t *xlapi = NULL;</div><div class='add'>+    int i = 0;</div><div class='add'>+</div><div class='add'>+    handle = xl-&gt;dlhandle;</div><div class='add'>+</div><div class='add'>+    xlapi = dlsym(handle, "xlator_api");</div><div class='add'>+    if (!xlapi) {</div><div class='add'>+        gf_smsg("xlator", GF_LOG_ERROR, 0, LG_MSG_DLSYM_ERROR, "dlsym=%s",</div><div class='add'>+                dlerror(), NULL);</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    xl-&gt;fops = xlapi-&gt;fops;</div><div class='add'>+    if (!xl-&gt;fops) {</div><div class='add'>+        gf_smsg("xlator", GF_LOG_WARNING, 0, LG_MSG_STRUCT_MISS, "name=%s",</div><div class='add'>+                xl-&gt;name, NULL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    xl-&gt;cbks = xlapi-&gt;cbks;</div><div class='add'>+    if (!xl-&gt;cbks) {</div><div class='add'>+        gf_msg_trace("xlator", 0, "%s: struct missing (cbks)", xl-&gt;name);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    xl-&gt;init = xlapi-&gt;init;</div><div class='add'>+    if (!xl-&gt;init) {</div><div class='add'>+        gf_smsg("xlator", GF_LOG_WARNING, 0, LG_MSG_METHOD_MISS, "name=%s",</div><div class='add'>+                xl-&gt;name, NULL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    xl-&gt;fini = xlapi-&gt;fini;</div><div class='add'>+    if (!xl-&gt;fini) {</div><div class='add'>+        gf_msg_trace("xlator", 0, "%s: method missing (fini)", xl-&gt;name);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    xl-&gt;reconfigure = xlapi-&gt;reconfigure;</div><div class='add'>+    if (!xl-&gt;reconfigure) {</div><div class='add'>+        gf_msg_trace("xlator", 0, "%s: method missing (reconfigure)", xl-&gt;name);</div><div class='add'>+    }</div><div class='add'>+    xl-&gt;notify = xlapi-&gt;notify;</div><div class='add'>+    if (!xl-&gt;notify) {</div><div class='add'>+        gf_msg_trace("xlator", 0, "%s: method missing (notify)", xl-&gt;name);</div><div class='add'>+    }</div><div class='add'>+    xl-&gt;dumpops = xlapi-&gt;dumpops;</div><div class='add'>+    if (!xl-&gt;dumpops) {</div><div class='add'>+        gf_msg_trace("xlator", 0, "%s: method missing (dumpops)", xl-&gt;name);</div><div class='add'>+    }</div><div class='add'>+    xl-&gt;mem_acct_init = xlapi-&gt;mem_acct_init;</div><div class='add'>+    if (!xl-&gt;mem_acct_init) {</div><div class='add'>+        gf_msg_trace("xlator", 0, "%s: method missing (mem_acct_init)",</div><div class='add'>+                     xl-&gt;name);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    xl-&gt;dump_metrics = xlapi-&gt;dump_metrics;</div><div class='add'>+    if (!xl-&gt;dump_metrics) {</div><div class='add'>+        gf_msg_trace("xlator", 0, "%s: method missing (dump_metrics)",</div><div class='add'>+                     xl-&gt;name);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    xl-&gt;pass_through_fops = xlapi-&gt;pass_through_fops;</div><div class='add'>+    if (!xl-&gt;pass_through_fops) {</div><div class='add'>+        gf_msg_trace("xlator", 0,</div><div class='add'>+                     "%s: method missing (pass_through_fops), "</div><div class='add'>+                     "falling back to default",</div><div class='add'>+                     xl-&gt;name);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    vol_opt = GF_CALLOC(1, sizeof(volume_opt_list_t),</div><div class='add'>+                        gf_common_mt_volume_opt_list_t);</div><div class='add'>+    if (!vol_opt) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    INIT_LIST_HEAD(&amp;vol_opt-&gt;list);</div><div class='add'>+</div><div class='add'>+    vol_opt-&gt;given_opt = default_options;</div><div class='add'>+    list_add_tail(&amp;vol_opt-&gt;list, &amp;xl-&gt;volume_options);</div><div class='add'>+</div><div class='add'>+    if (xlapi-&gt;options) {</div><div class='add'>+        vol_opt = GF_CALLOC(1, sizeof(volume_opt_list_t),</div><div class='add'>+                            gf_common_mt_volume_opt_list_t);</div><div class='add'>+        if (!vol_opt) {</div><div class='add'>+            goto out;</div><div class='ctx'>         }</div><div class='add'>+        INIT_LIST_HEAD(&amp;vol_opt-&gt;list);</div><div class='ctx'> </div><div class='del'>-        if (octets != 4) {</div><div class='del'>-                ret = 0;</div><div class='del'>-        }</div><div class='add'>+        vol_opt-&gt;given_opt = xlapi-&gt;options;</div><div class='add'>+        list_add_tail(&amp;vol_opt-&gt;list, &amp;xl-&gt;volume_options);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    xl-&gt;id = xlapi-&gt;xlator_id;</div><div class='add'>+    xl-&gt;flags = xlapi-&gt;flags;</div><div class='add'>+    xl-&gt;identifier = xlapi-&gt;identifier;</div><div class='add'>+    xl-&gt;category = xlapi-&gt;category;</div><div class='ctx'> </div><div class='add'>+    memcpy(xl-&gt;op_version, xlapi-&gt;op_version,</div><div class='add'>+           sizeof(uint32_t) * GF_MAX_RELEASES);</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; GF_FOP_MAXVALUE; i++) {</div><div class='add'>+        gf_latency_reset(&amp;xl-&gt;stats.interval.latencies[i]);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='ctx'> out:</div><div class='del'>-        GF_FREE (tmp);</div><div class='del'>-        return ret;</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-static char</div><div class='del'>-valid_ipv6_address (char *address, int length)</div><div class='add'>+int</div><div class='add'>+xlator_dynload(xlator_t *xl)</div><div class='ctx'> {</div><div class='del'>-        int hex_numbers = 0;</div><div class='del'>-        int value = 0;</div><div class='del'>-        char *tmp = NULL, *ptr = NULL, *prev = NULL, *endptr = NULL;</div><div class='del'>-        char ret = 1;</div><div class='del'>-</div><div class='del'>-        tmp = gf_strdup (address);</div><div class='del'>-        prev = strtok_r (tmp, ":", &amp;ptr);</div><div class='del'>-</div><div class='del'>-        while (prev != NULL) </div><div class='del'>-        {</div><div class='del'>-                hex_numbers++;</div><div class='del'>-                value = strtol (prev, &amp;endptr, 16);</div><div class='del'>-                if ((value &gt; 0xffff) || (value &lt; 0)</div><div class='del'>-                    || (endptr != NULL &amp;&amp; *endptr != '\0')) {</div><div class='del'>-                        ret = 0;</div><div class='del'>-                        goto out;</div><div class='del'>-                }</div><div class='del'>-   </div><div class='del'>-                prev = strtok_r (NULL, ":", &amp;ptr);</div><div class='del'>-        }</div><div class='del'>-        </div><div class='del'>-        if (hex_numbers &gt; 8) {</div><div class='del'>-                ret = 0;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    char *name = NULL;</div><div class='add'>+    void *handle = NULL;</div><div class='add'>+</div><div class='add'>+    GF_VALIDATE_OR_GOTO("xlator", xl, out);</div><div class='add'>+</div><div class='add'>+    INIT_LIST_HEAD(&amp;xl-&gt;volume_options);</div><div class='add'>+</div><div class='add'>+    ret = gf_asprintf(&amp;name, "%s/%s.so", XLATORDIR, xl-&gt;type);</div><div class='add'>+    if (-1 == ret) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = -1;</div><div class='add'>+</div><div class='add'>+    gf_msg_trace("xlator", 0, "attempt to load file %s", name);</div><div class='add'>+</div><div class='add'>+    handle = dlopen(name, RTLD_NOW);</div><div class='add'>+    if (!handle) {</div><div class='add'>+        gf_smsg("xlator", GF_LOG_WARNING, 0, LG_MSG_DLOPEN_FAILED, "error=%s",</div><div class='add'>+                dlerror(), NULL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    xl-&gt;dlhandle = handle;</div><div class='add'>+</div><div class='add'>+    ret = xlator_dynload_apis(xl);</div><div class='add'>+    if (-1 == ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    fill_defaults(xl);</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    GF_FREE(name);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+xlator_set_type(xlator_t *xl, const char *type)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    /* Handle 'global' translator differently */</div><div class='add'>+    if (!strncmp(GF_GLOBAL_XLATOR_NAME, type, SLEN(GF_GLOBAL_XLATOR_NAME))) {</div><div class='add'>+        volume_opt_list_t *vol_opt = NULL;</div><div class='add'>+</div><div class='add'>+        /* set the required values from Global xlator */</div><div class='add'>+        xl-&gt;type = gf_strdup(GF_GLOBAL_XLATOR_NAME);</div><div class='add'>+        xl-&gt;cbks = global_xlator.cbks;</div><div class='add'>+        xl-&gt;fops = global_xlator.fops;</div><div class='add'>+        xl-&gt;init = global_xlator.init;</div><div class='add'>+        xl-&gt;fini = global_xlator.fini;</div><div class='add'>+        xl-&gt;reconfigure = global_xlator.reconfigure;</div><div class='add'>+</div><div class='add'>+        vol_opt = GF_CALLOC(1, sizeof(volume_opt_list_t),</div><div class='add'>+                            gf_common_mt_volume_opt_list_t);</div><div class='add'>+        if (!vol_opt) {</div><div class='add'>+            ret = -1;</div><div class='add'>+            goto out;</div><div class='ctx'>         }</div><div class='ctx'> </div><div class='add'>+        vol_opt-&gt;given_opt = global_xl_options;</div><div class='add'>+</div><div class='add'>+        INIT_LIST_HEAD(&amp;xl-&gt;volume_options);</div><div class='add'>+        INIT_LIST_HEAD(&amp;vol_opt-&gt;list);</div><div class='add'>+        list_add_tail(&amp;vol_opt-&gt;list, &amp;xl-&gt;volume_options);</div><div class='add'>+</div><div class='add'>+        fill_defaults(xl);</div><div class='add'>+        ret = 0;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = xlator_set_type_virtual(xl, type);</div><div class='add'>+    if (!ret)</div><div class='add'>+        ret = xlator_dynload(xl);</div><div class='ctx'> out:</div><div class='del'>-        GF_FREE (tmp);</div><div class='del'>-        return ret;</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-static char</div><div class='del'>-valid_internet_address (char *address)</div><div class='add'>+void</div><div class='add'>+xlator_set_inode_lru_limit(xlator_t *this, void *data)</div><div class='ctx'> {</div><div class='del'>-        char ret = 0;</div><div class='del'>-        int length = 0;</div><div class='add'>+    int inode_lru_limit = 0;</div><div class='ctx'> </div><div class='del'>-        if (address == NULL) {</div><div class='del'>-                goto out;</div><div class='add'>+    if (this-&gt;itable) {</div><div class='add'>+        if (!data) {</div><div class='add'>+            gf_smsg(this-&gt;name, GF_LOG_WARNING, 0, LG_MSG_INPUT_DATA_NULL,</div><div class='add'>+                    NULL);</div><div class='add'>+            goto out;</div><div class='ctx'>         }</div><div class='add'>+        inode_lru_limit = *(int *)data;</div><div class='add'>+        inode_table_set_lru_limit(this-&gt;itable, inode_lru_limit);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        length = strlen (address);</div><div class='del'>-        if (length == 0) {</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='add'>+out:</div><div class='add'>+    return;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        if (valid_ipv4_address (address, length) </div><div class='del'>-            || valid_ipv6_address (address, length)</div><div class='del'>-            || valid_host_name (address, length)) {</div><div class='del'>-                ret = 1;</div><div class='del'>-        }</div><div class='add'>+void</div><div class='add'>+xlator_foreach(xlator_t *this, void (*fn)(xlator_t *each, void *data),</div><div class='add'>+               void *data)</div><div class='add'>+{</div><div class='add'>+    xlator_t *first = NULL;</div><div class='add'>+    xlator_t *old_THIS = NULL;</div><div class='add'>+</div><div class='add'>+    GF_VALIDATE_OR_GOTO("xlator", this, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("xlator", fn, out);</div><div class='ctx'> </div><div class='del'>-out:        </div><div class='del'>-        return ret;</div><div class='add'>+    first = this;</div><div class='add'>+</div><div class='add'>+    while (first-&gt;prev)</div><div class='add'>+        first = first-&gt;prev;</div><div class='add'>+</div><div class='add'>+    while (first) {</div><div class='add'>+        old_THIS = THIS;</div><div class='add'>+        THIS = first;</div><div class='add'>+</div><div class='add'>+        fn(first, data);</div><div class='add'>+</div><div class='add'>+        THIS = old_THIS;</div><div class='add'>+        first = first-&gt;next;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-int </div><div class='del'>-_volume_option_value_validate (xlator_t *xl, </div><div class='del'>-			       data_pair_t *pair, </div><div class='del'>-			       volume_option_t *opt)</div><div class='add'>+void</div><div class='add'>+xlator_foreach_depth_first(xlator_t *this,</div><div class='add'>+                           void (*fn)(xlator_t *each, void *data), void *data)</div><div class='ctx'> {</div><div class='del'>-	int       i = 0;</div><div class='del'>-	int       ret = -1;</div><div class='del'>- 	uint64_t  input_size = 0;</div><div class='del'>-	long long inputll = 0;</div><div class='del'>-	</div><div class='del'>-	/* Key is valid, validate the option */</div><div class='del'>-	switch (opt-&gt;type) {</div><div class='del'>-	case GF_OPTION_TYPE_PATH:</div><div class='del'>-	{</div><div class='del'>-                if (strstr (pair-&gt;value-&gt;data, "../")) {</div><div class='del'>-                        gf_log (xl-&gt;name, GF_LOG_ERROR,</div><div class='del'>-                                "invalid path given '%s'",</div><div class='del'>-                                pair-&gt;value-&gt;data);</div><div class='del'>-                        ret = -1;</div><div class='del'>-                        goto out;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                /* Make sure the given path is valid */</div><div class='del'>-		if (pair-&gt;value-&gt;data[0] != '/') {</div><div class='del'>-			gf_log (xl-&gt;name, GF_LOG_WARNING,</div><div class='del'>-				"option %s %s: '%s' is not an "</div><div class='del'>-				"absolute path name",</div><div class='del'>-				pair-&gt;key, pair-&gt;value-&gt;data, </div><div class='del'>-				pair-&gt;value-&gt;data);</div><div class='del'>-		}</div><div class='del'>-		ret = 0;</div><div class='del'>-	}</div><div class='del'>-	break;</div><div class='del'>-	case GF_OPTION_TYPE_INT:</div><div class='del'>-	{</div><div class='del'>-		/* Check the range */</div><div class='del'>-		if (gf_string2longlong (pair-&gt;value-&gt;data, </div><div class='del'>-					&amp;inputll) != 0) {</div><div class='del'>-			gf_log (xl-&gt;name, GF_LOG_ERROR,</div><div class='del'>-				"invalid number format \"%s\" in "</div><div class='del'>-				"\"option %s\"",</div><div class='del'>-				pair-&gt;value-&gt;data, pair-&gt;key);</div><div class='del'>-			goto out;</div><div class='del'>-		}</div><div class='del'>-</div><div class='del'>-		if ((opt-&gt;min == 0) &amp;&amp; (opt-&gt;max == 0)) {</div><div class='del'>-			gf_log (xl-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-				"no range check required for "</div><div class='del'>-				"'option %s %s'",</div><div class='del'>-				pair-&gt;key, pair-&gt;value-&gt;data);</div><div class='del'>-			ret = 0;</div><div class='del'>-			break;</div><div class='del'>-		}</div><div class='del'>-		if ((inputll &lt; opt-&gt;min) || </div><div class='del'>-		    (inputll &gt; opt-&gt;max)) {</div><div class='del'>-			gf_log (xl-&gt;name, GF_LOG_WARNING,</div><div class='del'>-				"'%lld' in 'option %s %s' is out of "</div><div class='del'>-				"range [%"PRId64" - %"PRId64"]",</div><div class='del'>-				inputll, pair-&gt;key, </div><div class='del'>-				pair-&gt;value-&gt;data,</div><div class='del'>-				opt-&gt;min, opt-&gt;max);</div><div class='del'>-		}</div><div class='del'>-		ret = 0;</div><div class='del'>-	}</div><div class='del'>-	break;</div><div class='del'>-	case GF_OPTION_TYPE_SIZET:</div><div class='del'>-	{</div><div class='del'>-		/* Check the range */</div><div class='del'>-		if (gf_string2bytesize (pair-&gt;value-&gt;data, </div><div class='del'>-					&amp;input_size) != 0) {</div><div class='del'>-			gf_log (xl-&gt;name, GF_LOG_ERROR,</div><div class='del'>-				"invalid size format \"%s\" in "</div><div class='del'>-				"\"option %s\"",</div><div class='del'>-				pair-&gt;value-&gt;data, pair-&gt;key);</div><div class='del'>-			goto out;</div><div class='del'>-		}</div><div class='del'>-</div><div class='del'>-		if ((opt-&gt;min == 0) &amp;&amp; (opt-&gt;max == 0)) {</div><div class='del'>-			gf_log (xl-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-				"no range check required for "</div><div class='del'>-				"'option %s %s'",</div><div class='del'>-				pair-&gt;key, pair-&gt;value-&gt;data);</div><div class='del'>-			ret = 0;</div><div class='del'>-			break;</div><div class='del'>-		}</div><div class='del'>-		if ((input_size &lt; opt-&gt;min) || </div><div class='del'>-		    (input_size &gt; opt-&gt;max)) {</div><div class='del'>-			gf_log (xl-&gt;name, GF_LOG_ERROR,</div><div class='del'>-				"'%"PRId64"' in 'option %s %s' is "</div><div class='del'>-				"out of range [%"PRId64" - %"PRId64"]",</div><div class='del'>-				input_size, pair-&gt;key, </div><div class='del'>-				pair-&gt;value-&gt;data,</div><div class='del'>-				opt-&gt;min, opt-&gt;max);</div><div class='del'>-		}</div><div class='del'>-		ret = 0;</div><div class='del'>-	}</div><div class='del'>-	break;</div><div class='del'>-	case GF_OPTION_TYPE_BOOL:</div><div class='del'>-	{</div><div class='del'>-		/* Check if the value is one of </div><div class='del'>-		   '0|1|on|off|no|yes|true|false|enable|disable' */</div><div class='del'>-		gf_boolean_t bool_value;</div><div class='del'>-		if (gf_string2boolean (pair-&gt;value-&gt;data, </div><div class='del'>-				       &amp;bool_value) != 0) {</div><div class='del'>-			gf_log (xl-&gt;name, GF_LOG_ERROR,</div><div class='del'>-				"option %s %s: '%s' is not a valid "</div><div class='del'>-				"boolean value",</div><div class='del'>-				pair-&gt;key, pair-&gt;value-&gt;data, </div><div class='del'>-				pair-&gt;value-&gt;data);</div><div class='del'>-			goto out;</div><div class='del'>-		}</div><div class='del'>-		ret = 0;</div><div class='del'>-	}</div><div class='del'>-	break;</div><div class='del'>-	case GF_OPTION_TYPE_XLATOR:</div><div class='del'>-	{</div><div class='del'>-		/* Check if the value is one of the xlators */</div><div class='del'>-		xlator_t *xlopt = xl;</div><div class='del'>-		while (xlopt-&gt;prev)</div><div class='del'>-			xlopt = xlopt-&gt;prev;</div><div class='del'>-</div><div class='del'>-		while (xlopt) {</div><div class='del'>-			if (strcmp (pair-&gt;value-&gt;data, </div><div class='del'>-				    xlopt-&gt;name) == 0) {</div><div class='del'>-				ret = 0;</div><div class='del'>-				break;</div><div class='del'>-			}</div><div class='del'>-			xlopt = xlopt-&gt;next;</div><div class='del'>-		}</div><div class='del'>-		if (!xlopt) {</div><div class='del'>-			gf_log (xl-&gt;name, GF_LOG_ERROR,</div><div class='del'>-				"option %s %s: '%s' is not a "</div><div class='del'>-				"valid volume name",</div><div class='del'>-				pair-&gt;key, pair-&gt;value-&gt;data, </div><div class='del'>-				pair-&gt;value-&gt;data);</div><div class='del'>-		}</div><div class='del'>-		ret = 0;</div><div class='del'>-	}</div><div class='del'>-	break;</div><div class='del'>-	case GF_OPTION_TYPE_STR:</div><div class='del'>-	{</div><div class='del'>-		/* Check if the '*str' is valid */</div><div class='del'>-                if (GF_OPTION_LIST_EMPTY(opt)) {</div><div class='del'>-                        ret = 0;</div><div class='del'>-                        goto out;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-		for (i = 0; (i &lt; ZR_OPTION_MAX_ARRAY_SIZE) &amp;&amp;</div><div class='del'>-			     opt-&gt;value[i]; i++) {</div><div class='del'>-                        if (fnmatch (opt-&gt;value[i], pair-&gt;value-&gt;data,</div><div class='del'>-                                     FNM_EXTMATCH) == 0) {</div><div class='del'>-				ret = 0;</div><div class='del'>-				break;</div><div class='del'>-			}</div><div class='del'>-		}</div><div class='del'>-</div><div class='del'>-		if ((i == ZR_OPTION_MAX_ARRAY_SIZE) </div><div class='del'>-		    || ((i &lt; ZR_OPTION_MAX_ARRAY_SIZE) </div><div class='del'>-			&amp;&amp; (!opt-&gt;value[i]))) {</div><div class='del'>-			/* enter here only if</div><div class='del'>-			 * 1. reached end of opt-&gt;value array and haven't </div><div class='del'>-                         *    validated input</div><div class='del'>-			 *                      OR</div><div class='del'>-			 * 2. valid input list is less than </div><div class='del'>-                         *    ZR_OPTION_MAX_ARRAY_SIZE and input has not </div><div class='del'>-                         *    matched all possible input values.</div><div class='del'>-			 */</div><div class='del'>-			char given_array[4096] = {0,};</div><div class='del'>-			for (i = 0; (i &lt; ZR_OPTION_MAX_ARRAY_SIZE) &amp;&amp;</div><div class='del'>-				     opt-&gt;value[i]; i++) {</div><div class='del'>-				strcat (given_array, opt-&gt;value[i]);</div><div class='del'>-				strcat (given_array, ", ");</div><div class='del'>-			}</div><div class='del'>-</div><div class='del'>-			gf_log (xl-&gt;name, GF_LOG_ERROR,</div><div class='del'>-				"option %s %s: '%s' is not valid "</div><div class='del'>-				"(possible options are %s)",</div><div class='del'>-				pair-&gt;key, pair-&gt;value-&gt;data, </div><div class='del'>-				pair-&gt;value-&gt;data, given_array);</div><div class='del'>-			</div><div class='del'>-			goto out;</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='del'>-	break;</div><div class='del'>-	case GF_OPTION_TYPE_PERCENT:</div><div class='del'>-	{</div><div class='del'>-		uint32_t percent = 0;</div><div class='del'>-</div><div class='del'>-		</div><div class='del'>-		/* Check if the value is valid percentage */</div><div class='del'>-		if (gf_string2percent (pair-&gt;value-&gt;data, </div><div class='del'>-				       &amp;percent) != 0) {</div><div class='del'>-			gf_log (xl-&gt;name, GF_LOG_ERROR,</div><div class='del'>-				"invalid percent format \"%s\" "</div><div class='del'>-				"in \"option %s\"",</div><div class='del'>-				pair-&gt;value-&gt;data, pair-&gt;key);</div><div class='del'>-			goto out;</div><div class='del'>-		}</div><div class='del'>-</div><div class='del'>-		if ((percent &lt; 0) || (percent &gt; 100)) {</div><div class='del'>-			gf_log (xl-&gt;name, GF_LOG_ERROR,</div><div class='del'>-				"'%d' in 'option %s %s' is out of "</div><div class='del'>-				"range [0 - 100]",</div><div class='del'>-				percent, pair-&gt;key, </div><div class='del'>-				pair-&gt;value-&gt;data);</div><div class='del'>-		}</div><div class='del'>-		ret = 0;</div><div class='del'>-	}</div><div class='del'>-	break;</div><div class='del'>-	case GF_OPTION_TYPE_PERCENT_OR_SIZET:</div><div class='del'>-	{</div><div class='del'>-		uint32_t percent = 0;</div><div class='del'>-		uint64_t input_size = 0;</div><div class='del'>-		</div><div class='del'>-		/* Check if the value is valid percentage */</div><div class='del'>-		if (gf_string2percent (pair-&gt;value-&gt;data,</div><div class='del'>-				       &amp;percent) == 0) {</div><div class='del'>-			if (percent &gt; 100) {</div><div class='del'>-				gf_log (xl-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-					"value given was greater than 100, "</div><div class='del'>-					"assuming this is actually a size");</div><div class='del'>-        		        if (gf_string2bytesize (pair-&gt;value-&gt;data,</div><div class='del'>-      	        			                &amp;input_size) == 0) {</div><div class='del'>-			       	        /* Check the range */</div><div class='del'>-	        			if ((opt-&gt;min == 0) &amp;&amp; </div><div class='del'>-                                            (opt-&gt;max == 0)) {</div><div class='del'>-	       	        		        gf_log (xl-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-        	      	        		        "no range check "</div><div class='del'>-                                                        "required for "</div><div class='del'>-                	      		       		"'option %s %s'",</div><div class='del'>-	               	        	        	pair-&gt;key, </div><div class='del'>-                                                        pair-&gt;value-&gt;data);</div><div class='del'>-						// It is a size</div><div class='del'>-			                        ret = 0;</div><div class='del'>-       				                goto out;</div><div class='del'>-              				}</div><div class='del'>-	        	        	if ((input_size &lt; opt-&gt;min) ||</div><div class='del'>-	      			            (input_size &gt; opt-&gt;max)) {</div><div class='del'>-        	       			        gf_log (xl-&gt;name, GF_LOG_ERROR,</div><div class='del'>-                	      			        "'%"PRId64"' in "</div><div class='del'>-                                                        "'option %s %s' is out"</div><div class='del'>-                       	       				" of range [%"PRId64""</div><div class='del'>-                                                        "- %"PRId64"]",</div><div class='del'>-               	        	        		input_size, pair-&gt;key,</div><div class='del'>-	       		                        	pair-&gt;value-&gt;data,</div><div class='del'>-	       		        	                opt-&gt;min, opt-&gt;max);</div><div class='del'>-		       	        	}</div><div class='del'>-					// It is a size</div><div class='del'>-		       			ret = 0;</div><div class='del'>-					goto out;</div><div class='del'>-				} else {</div><div class='del'>-					// It's not a percent or size</div><div class='del'>-					gf_log (xl-&gt;name, GF_LOG_ERROR,</div><div class='del'>-					"invalid number format \"%s\" "</div><div class='del'>-					"in \"option %s\"",</div><div class='del'>-					pair-&gt;value-&gt;data, pair-&gt;key);</div><div class='del'>-				}</div><div class='del'>-</div><div class='del'>-			}</div><div class='del'>-			// It is a percent</div><div class='del'>-			ret = 0;</div><div class='del'>-			goto out;</div><div class='del'>-		} else {</div><div class='del'>-       		        if (gf_string2bytesize (pair-&gt;value-&gt;data,</div><div class='del'>-     	        			        &amp;input_size) == 0) {</div><div class='del'>-		       	        /* Check the range */</div><div class='del'>-        			if ((opt-&gt;min == 0) &amp;&amp; (opt-&gt;max == 0)) {</div><div class='del'>-       	        		        gf_log (xl-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-       	      	        		        "no range check required for "</div><div class='del'>-               	      		      		"'option %s %s'",</div><div class='del'>-               	        	        	pair-&gt;key, pair-&gt;value-&gt;data);</div><div class='del'>-					// It is a size</div><div class='del'>-		                        ret = 0;</div><div class='del'>-      				        goto out;</div><div class='del'>-             			}</div><div class='del'>-	        	        if ((input_size &lt; opt-&gt;min) ||</div><div class='del'>-      			            (input_size &gt; opt-&gt;max)) {</div><div class='del'>-       	       				gf_log (xl-&gt;name, GF_LOG_ERROR,</div><div class='del'>-               	      			        "'%"PRId64"' in 'option %s %s'"</div><div class='del'>-                                                " is out of range [%"PRId64" -"</div><div class='del'>-                                                " %"PRId64"]",</div><div class='del'>-              	        	        	input_size, pair-&gt;key,</div><div class='del'>-       		                        	pair-&gt;value-&gt;data,</div><div class='del'>-       		        	                opt-&gt;min, opt-&gt;max);</div><div class='del'>-				}</div><div class='del'>-			} else {</div><div class='del'>-				// It's not a percent or size</div><div class='del'>-				gf_log (xl-&gt;name, GF_LOG_ERROR,</div><div class='del'>-					"invalid number format \"%s\" "</div><div class='del'>-					"in \"option %s\"",</div><div class='del'>-					pair-&gt;value-&gt;data, pair-&gt;key);</div><div class='del'>-			}</div><div class='del'>-			//It is a size</div><div class='del'>-                        ret = 0;</div><div class='del'>- 		        goto out;</div><div class='del'>-		}</div><div class='del'>-</div><div class='del'>-	}</div><div class='del'>-	break;</div><div class='del'>-	case GF_OPTION_TYPE_TIME:</div><div class='del'>-	{</div><div class='del'>-		uint32_t input_time = 0;</div><div class='del'>-</div><div class='del'>-		/* Check if the value is valid percentage */</div><div class='del'>-		if (gf_string2time (pair-&gt;value-&gt;data, </div><div class='del'>-				    &amp;input_time) != 0) {</div><div class='del'>-			gf_log (xl-&gt;name,</div><div class='del'>-				GF_LOG_ERROR,</div><div class='del'>-				"invalid time format \"%s\" in "</div><div class='del'>-				"\"option %s\"",</div><div class='del'>-				pair-&gt;value-&gt;data, pair-&gt;key);</div><div class='del'>-			goto out;</div><div class='del'>-		}</div><div class='del'>-</div><div class='del'>-		if ((opt-&gt;min == 0) &amp;&amp; (opt-&gt;max == 0)) {</div><div class='del'>-			gf_log (xl-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-				"no range check required for "</div><div class='del'>-				"'option %s %s'",</div><div class='del'>-				pair-&gt;key, pair-&gt;value-&gt;data);</div><div class='del'>-			ret = 0;</div><div class='del'>-			goto out;</div><div class='del'>-		}</div><div class='del'>-		if ((input_time &lt; opt-&gt;min) || </div><div class='del'>-		    (input_time &gt; opt-&gt;max)) {</div><div class='del'>-			gf_log (xl-&gt;name, GF_LOG_ERROR,</div><div class='del'>-				"'%"PRIu32"' in 'option %s %s' is "</div><div class='del'>-				"out of range [%"PRId64" - %"PRId64"]",</div><div class='del'>-				input_time, pair-&gt;key, </div><div class='del'>-				pair-&gt;value-&gt;data,</div><div class='del'>-				opt-&gt;min, opt-&gt;max);</div><div class='del'>-		}</div><div class='del'>-		ret = 0;</div><div class='del'>-	}</div><div class='del'>-	break;</div><div class='del'>-	case GF_OPTION_TYPE_DOUBLE:</div><div class='del'>-	{</div><div class='del'>-		double input_time = 0.0;</div><div class='del'>-</div><div class='del'>-		/* Check if the value is valid double */</div><div class='del'>-		if (gf_string2double (pair-&gt;value-&gt;data, </div><div class='del'>-				      &amp;input_time) != 0) {</div><div class='del'>-			gf_log (xl-&gt;name,</div><div class='del'>-				GF_LOG_ERROR,</div><div class='del'>-				"invalid time format \"%s\" in \"option %s\"",</div><div class='del'>-				pair-&gt;value-&gt;data, pair-&gt;key);</div><div class='del'>-			goto out;</div><div class='del'>-		}</div><div class='del'>-		</div><div class='del'>-		if (input_time &lt; 0.0) {</div><div class='del'>-			gf_log (xl-&gt;name,</div><div class='del'>-				GF_LOG_ERROR,</div><div class='del'>-				"invalid time format \"%s\" in \"option %s\"",</div><div class='del'>-				pair-&gt;value-&gt;data, pair-&gt;key);</div><div class='del'>-			goto out;</div><div class='del'>-		}</div><div class='del'>-</div><div class='del'>-		if ((opt-&gt;min == 0) &amp;&amp; (opt-&gt;max == 0)) {</div><div class='del'>-			gf_log (xl-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-				"no range check required for 'option %s %s'",</div><div class='del'>-				pair-&gt;key, pair-&gt;value-&gt;data);</div><div class='del'>-			ret = 0;</div><div class='del'>-			goto out;</div><div class='del'>-		}</div><div class='del'>-		ret = 0;</div><div class='del'>-	}</div><div class='del'>-	break;</div><div class='del'>-        case GF_OPTION_TYPE_INTERNET_ADDRESS:</div><div class='del'>-        {</div><div class='del'>-                if (valid_internet_address (pair-&gt;value-&gt;data)) {</div><div class='del'>-                        ret = 0;</div><div class='del'>-                } else {</div><div class='del'>-			gf_log (xl-&gt;name, GF_LOG_ERROR, "internet address '%s'"</div><div class='del'>-				" does not conform to standards.",</div><div class='del'>-				pair-&gt;value-&gt;data);</div><div class='del'>-			goto out;</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='del'>-        break;</div><div class='del'>-	case GF_OPTION_TYPE_ANY:</div><div class='del'>-		/* NO CHECK */</div><div class='del'>-		ret = 0;</div><div class='del'>-		break;</div><div class='del'>-	}</div><div class='del'>-	</div><div class='add'>+    xlator_list_t *subv = NULL;</div><div class='add'>+</div><div class='add'>+    subv = this-&gt;children;</div><div class='add'>+</div><div class='add'>+    while (subv) {</div><div class='add'>+        xlator_foreach_depth_first(subv-&gt;xlator, fn, data);</div><div class='add'>+        subv = subv-&gt;next;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    fn(this, data);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+xlator_t *</div><div class='add'>+xlator_search_by_name(xlator_t *any, const char *name)</div><div class='add'>+{</div><div class='add'>+    xlator_t *search = NULL;</div><div class='add'>+</div><div class='add'>+    GF_VALIDATE_OR_GOTO("xlator", any, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("xlator", name, out);</div><div class='add'>+</div><div class='add'>+    search = any;</div><div class='add'>+</div><div class='add'>+    while (search-&gt;prev)</div><div class='add'>+        search = search-&gt;prev;</div><div class='add'>+</div><div class='add'>+    while (search) {</div><div class='add'>+        if (!strcmp(search-&gt;name, name))</div><div class='add'>+            break;</div><div class='add'>+        search = search-&gt;next;</div><div class='add'>+    }</div><div class='add'>+</div><div class='ctx'> out:</div><div class='del'>-	return ret;</div><div class='add'>+    return search;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+ * With brick multiplexing, we sort of have multiple graphs, so</div><div class='add'>+ * xlator_search_by_name might not find what we want.  Also, the translator</div><div class='add'>+ * we're looking for might not be a direct child if something else was put in</div><div class='add'>+ * between (as already happened with decompounder before that was fixed) and</div><div class='add'>+ * it's hard to debug why our translator wasn't found.  Using a recursive tree</div><div class='add'>+ * search instead of a linear search works around both problems.</div><div class='add'>+ */</div><div class='add'>+static xlator_t *</div><div class='add'>+get_xlator_by_name_or_type(xlator_t *this, char *target, int is_name)</div><div class='add'>+{</div><div class='add'>+    xlator_list_t *trav;</div><div class='add'>+    xlator_t *child_xl;</div><div class='add'>+    char *value;</div><div class='add'>+</div><div class='add'>+    for (trav = this-&gt;children; trav; trav = trav-&gt;next) {</div><div class='add'>+        value = is_name ? trav-&gt;xlator-&gt;name : trav-&gt;xlator-&gt;type;</div><div class='add'>+        if (!strcmp(value, target) &amp;&amp; !trav-&gt;xlator-&gt;cleanup_starting) {</div><div class='add'>+            return trav-&gt;xlator;</div><div class='add'>+        }</div><div class='add'>+        child_xl = get_xlator_by_name_or_type(trav-&gt;xlator, target, is_name);</div><div class='add'>+        if (child_xl) {</div><div class='add'>+            /*</div><div class='add'>+             * If the xlator we're looking for is somewhere down</div><div class='add'>+             * the stack, get_xlator_by_name expects to get a</div><div class='add'>+             * pointer to the top of its subtree (child of "this")</div><div class='add'>+             * while get_xlator_by_type expects a pointer to what</div><div class='add'>+             * we actually found.  Handle both cases here.</div><div class='add'>+             *</div><div class='add'>+             * TBD: rename the functions and fix callers to better</div><div class='add'>+             * reflect the difference in semantics.</div><div class='add'>+             */</div><div class='add'>+            return is_name ? trav-&gt;xlator : child_xl;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return NULL;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+xlator_t *</div><div class='add'>+get_xlator_by_name(xlator_t *this, char *target)</div><div class='add'>+{</div><div class='add'>+    return get_xlator_by_name_or_type(this, target, 1);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+xlator_t *</div><div class='add'>+get_xlator_by_type(xlator_t *this, char *target)</div><div class='add'>+{</div><div class='add'>+    return get_xlator_by_name_or_type(this, target, 0);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+__xlator_init(xlator_t *xl)</div><div class='add'>+{</div><div class='add'>+    xlator_t *old_THIS = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    int fop_idx = 0;</div><div class='add'>+</div><div class='add'>+    old_THIS = THIS;</div><div class='add'>+    THIS = xl;</div><div class='add'>+</div><div class='add'>+    /* initialize the metrics related locks */</div><div class='add'>+    for (fop_idx = 0; fop_idx &lt; GF_FOP_MAXVALUE; fop_idx++) {</div><div class='add'>+        GF_ATOMIC_INIT(xl-&gt;stats.total.metrics[fop_idx].fop, 0);</div><div class='add'>+        GF_ATOMIC_INIT(xl-&gt;stats.total.metrics[fop_idx].cbk, 0);</div><div class='add'>+</div><div class='add'>+        GF_ATOMIC_INIT(xl-&gt;stats.interval.metrics[fop_idx].fop, 0);</div><div class='add'>+        GF_ATOMIC_INIT(xl-&gt;stats.interval.metrics[fop_idx].cbk, 0);</div><div class='add'>+    }</div><div class='add'>+    GF_ATOMIC_INIT(xl-&gt;stats.total.count, 0);</div><div class='add'>+    GF_ATOMIC_INIT(xl-&gt;stats.interval.count, 0);</div><div class='add'>+</div><div class='add'>+    xlator_init_lock();</div><div class='add'>+    handle_default_options(xl, xl-&gt;options);</div><div class='add'>+    ret = xl-&gt;init(xl);</div><div class='add'>+    xlator_init_unlock();</div><div class='add'>+</div><div class='add'>+    THIS = old_THIS;</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-validate_xlator_volume_options (xlator_t *xl, volume_option_t *opt)</div><div class='add'>+xlator_init(xlator_t *xl)</div><div class='ctx'> {</div><div class='del'>-	int i = 0;</div><div class='del'>-	int ret = -1;</div><div class='del'>- 	int index = 0;</div><div class='del'>- 	volume_option_t *trav  = NULL;</div><div class='del'>- 	data_pair_t     *pairs = NULL;</div><div class='del'>-</div><div class='del'>- 	if (!opt) {</div><div class='del'>-		ret = 0;</div><div class='del'>- 		goto out;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>- 	/* First search for not supported options, if any report error */</div><div class='del'>- 	pairs = xl-&gt;options-&gt;members_list;</div><div class='del'>- 	while (pairs) {</div><div class='del'>-		ret = -1;</div><div class='del'>-  		for (index = 0; </div><div class='del'>-		     opt[index].key &amp;&amp; opt[index].key[0] ; index++) {</div><div class='del'>-  			trav = &amp;(opt[index]);</div><div class='del'>-			for (i = 0 ; </div><div class='del'>-			     (i &lt; ZR_VOLUME_MAX_NUM_KEY) &amp;&amp; </div><div class='del'>-				     trav-&gt;key[i]; i++) {</div><div class='del'>-				/* Check if the key is valid */</div><div class='del'>-				if (fnmatch (trav-&gt;key[i], </div><div class='del'>-					     pairs-&gt;key, FNM_NOESCAPE) == 0) {</div><div class='del'>-					ret = 0;</div><div class='del'>-					break;</div><div class='del'>-				}</div><div class='del'>-			}</div><div class='del'>-			if (!ret) {</div><div class='del'>-				if (i) {</div><div class='del'>-					gf_log (xl-&gt;name, GF_LOG_WARNING,</div><div class='del'>-						"option '%s' is deprecated, "</div><div class='del'>-						"preferred is '%s', continuing"</div><div class='del'>-						" with correction",</div><div class='del'>-						trav-&gt;key[i], trav-&gt;key[0]);</div><div class='del'>-					/* TODO: some bytes lost */</div><div class='del'>-                                        pairs-&gt;key = gf_strdup (trav-&gt;key[0]);</div><div class='del'>-				}</div><div class='del'>-				break;</div><div class='del'>-			}</div><div class='del'>-  		}</div><div class='del'>-  		if (!ret) {</div><div class='del'>-			ret = _volume_option_value_validate (xl, pairs, trav);</div><div class='del'>-			if (-1 == ret) {</div><div class='del'>-				goto out;</div><div class='del'>-			}</div><div class='del'>-		}</div><div class='del'>-</div><div class='del'>-  		pairs = pairs-&gt;next;</div><div class='del'>-  	}</div><div class='del'>-	</div><div class='del'>-	ret = 0;</div><div class='del'>- out:</div><div class='del'>-  	return ret;</div><div class='add'>+    int32_t ret = -1;</div><div class='add'>+</div><div class='add'>+    GF_VALIDATE_OR_GOTO("xlator", xl, out);</div><div class='add'>+</div><div class='add'>+    if (xl-&gt;mem_acct_init)</div><div class='add'>+        xl-&gt;mem_acct_init(xl);</div><div class='add'>+</div><div class='add'>+    xl-&gt;instance_name = NULL;</div><div class='add'>+    GF_ATOMIC_INIT(xl-&gt;xprtrefcnt, 0);</div><div class='add'>+    if (!xl-&gt;init) {</div><div class='add'>+        gf_smsg(xl-&gt;name, GF_LOG_WARNING, 0, LG_MSG_INIT_FAILED, NULL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = __xlator_init(xl);</div><div class='add'>+</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_smsg(xl-&gt;name, GF_LOG_ERROR, 0, LG_MSG_VOLUME_ERROR, "name=%s",</div><div class='add'>+                xl-&gt;name, NULL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    xl-&gt;init_succeeded = 1;</div><div class='add'>+    /*xl-&gt;cleanup_starting = 0;</div><div class='add'>+      xl-&gt;call_cleanup = 0;</div><div class='add'>+    */</div><div class='add'>+    ret = 0;</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-int32_t</div><div class='del'>-xlator_set_type (xlator_t *xl,</div><div class='del'>-		 const char *type)</div><div class='add'>+static void</div><div class='add'>+xlator_fini_rec(xlator_t *xl)</div><div class='ctx'> {</div><div class='del'>-        int   ret = 0;</div><div class='del'>-	char *name = NULL;</div><div class='del'>-	void *handle = NULL;</div><div class='del'>-	volume_opt_list_t *vol_opt = NULL;</div><div class='del'>-</div><div class='del'>-	if (xl == NULL || type == NULL)	{</div><div class='del'>-		gf_log ("xlator", GF_LOG_DEBUG, "invalid argument");</div><div class='del'>-		return -1;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-        xl-&gt;type = gf_strdup (type);</div><div class='del'>-</div><div class='del'>-	ret = gf_asprintf (&amp;name, "%s/%s.so", XLATORDIR, type);</div><div class='del'>-        if (-1 == ret) {</div><div class='del'>-                gf_log ("xlator", GF_LOG_ERROR, "asprintf failed");</div><div class='del'>-                return -1;</div><div class='add'>+    xlator_list_t *trav = NULL;</div><div class='add'>+    xlator_t *old_THIS = NULL;</div><div class='add'>+</div><div class='add'>+    GF_VALIDATE_OR_GOTO("xlator", xl, out);</div><div class='add'>+</div><div class='add'>+    trav = xl-&gt;children;</div><div class='add'>+</div><div class='add'>+    while (trav) {</div><div class='add'>+        if (!trav-&gt;xlator-&gt;init_succeeded) {</div><div class='add'>+            break;</div><div class='ctx'>         }</div><div class='ctx'> </div><div class='del'>-	gf_log ("xlator", GF_LOG_TRACE, "attempt to load file %s", name);</div><div class='del'>-</div><div class='del'>-	handle = dlopen (name, RTLD_NOW|RTLD_GLOBAL);</div><div class='del'>-	if (!handle) {</div><div class='del'>-		gf_log ("xlator", GF_LOG_DEBUG, "%s", dlerror ());</div><div class='del'>-                GF_FREE (name);</div><div class='del'>-		return -1;</div><div class='del'>-	}</div><div class='del'>-        xl-&gt;dlhandle = handle;</div><div class='del'>-</div><div class='del'>-	if (!(xl-&gt;fops = dlsym (handle, "fops"))) {</div><div class='del'>-		gf_log ("xlator", GF_LOG_DEBUG, "dlsym(fops) on %s",</div><div class='del'>-			dlerror ());</div><div class='del'>-                GF_FREE (name);</div><div class='del'>-		return -1;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	if (!(xl-&gt;cbks = dlsym (handle, "cbks"))) {</div><div class='del'>-		gf_log ("xlator", GF_LOG_DEBUG, "dlsym(cbks) on %s",</div><div class='del'>-			dlerror ());</div><div class='del'>-                GF_FREE (name);</div><div class='del'>-		return -1;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	if (!(xl-&gt;init = dlsym (handle, "init"))) {</div><div class='del'>-		gf_log ("xlator", GF_LOG_DEBUG, "dlsym(init) on %s",</div><div class='del'>-			dlerror ());</div><div class='del'>-                GF_FREE (name);</div><div class='del'>-		return -1;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	if (!(xl-&gt;fini = dlsym (handle, "fini"))) {</div><div class='del'>-		gf_log ("xlator", GF_LOG_DEBUG, "dlsym(fini) on %s",</div><div class='del'>-			dlerror ());</div><div class='del'>-                GF_FREE (name);</div><div class='del'>-		return -1;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	if (!(xl-&gt;notify = dlsym (handle, "notify"))) {</div><div class='del'>-		gf_log ("xlator", GF_LOG_DEBUG,</div><div class='del'>-			"dlsym(notify) on %s -- neglecting", dlerror ());</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	if (!(xl-&gt;dumpops = dlsym (handle, "dumpops"))) {</div><div class='del'>-		gf_log ("xlator", GF_LOG_DEBUG,</div><div class='del'>-			"dlsym(dumpops) on %s -- neglecting", dlerror ());</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-        if (!(xl-&gt;mem_acct_init = dlsym (handle, "mem_acct_init"))) {</div><div class='del'>-                gf_log (xl-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-                        "dlsym(mem_acct_init) on %s -- neglecting",</div><div class='del'>-                        dlerror ());</div><div class='add'>+        xlator_fini_rec(trav-&gt;xlator);</div><div class='add'>+        gf_msg_debug(trav-&gt;xlator-&gt;name, 0, "fini done");</div><div class='add'>+        trav = trav-&gt;next;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    xl-&gt;cleanup_starting = 1;</div><div class='add'>+    if (xl-&gt;init_succeeded) {</div><div class='add'>+        if (xl-&gt;fini) {</div><div class='add'>+            old_THIS = THIS;</div><div class='add'>+            THIS = xl;</div><div class='add'>+</div><div class='add'>+            xl-&gt;fini(xl);</div><div class='add'>+</div><div class='add'>+            if (xl-&gt;local_pool) {</div><div class='add'>+                mem_pool_destroy(xl-&gt;local_pool);</div><div class='add'>+                xl-&gt;local_pool = NULL;</div><div class='add'>+            }</div><div class='add'>+            if (xl-&gt;itable) {</div><div class='add'>+                inode_table_destroy(xl-&gt;itable);</div><div class='add'>+                xl-&gt;itable = NULL;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            THIS = old_THIS;</div><div class='add'>+        } else {</div><div class='add'>+            gf_msg_debug(xl-&gt;name, 0, "No fini() found");</div><div class='ctx'>         }</div><div class='add'>+        xl-&gt;init_succeeded = 0;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	INIT_LIST_HEAD (&amp;xl-&gt;volume_options);</div><div class='add'>+out:</div><div class='add'>+    return;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	vol_opt = GF_CALLOC (1, sizeof (volume_opt_list_t),</div><div class='del'>-                         gf_common_mt_volume_opt_list_t);</div><div class='add'>+int</div><div class='add'>+xlator_notify(xlator_t *xl, int event, void *data, ...)</div><div class='add'>+{</div><div class='add'>+    xlator_t *old_THIS = NULL;</div><div class='add'>+    int ret = 0;</div><div class='ctx'> </div><div class='del'>-        if (!vol_opt) {</div><div class='del'>-                GF_FREE (name);</div><div class='del'>-                return -1;</div><div class='del'>-        }</div><div class='add'>+    old_THIS = THIS;</div><div class='add'>+    THIS = xl;</div><div class='ctx'> </div><div class='del'>-	if (!(vol_opt-&gt;given_opt = dlsym (handle, "options"))) {</div><div class='del'>-		dlerror ();</div><div class='del'>-		gf_log (xl-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-			"Strict option validation not enforced -- neglecting");</div><div class='del'>-	}</div><div class='del'>-	list_add_tail (&amp;vol_opt-&gt;list, &amp;xl-&gt;volume_options);</div><div class='add'>+    ret = xl-&gt;notify(xl, event, data);</div><div class='ctx'> </div><div class='del'>-	fill_defaults (xl);</div><div class='add'>+    THIS = old_THIS;</div><div class='ctx'> </div><div class='del'>-	GF_FREE (name);</div><div class='del'>-	return 0;</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+int</div><div class='add'>+xlator_mem_acct_init(xlator_t *xl, int num_types)</div><div class='add'>+{</div><div class='add'>+    int i = 0;</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    if (!xl)</div><div class='add'>+        return -1;</div><div class='add'>+</div><div class='add'>+    if (!xl-&gt;ctx)</div><div class='add'>+        return -1;</div><div class='add'>+</div><div class='add'>+    if (!xl-&gt;ctx-&gt;mem_acct_enable)</div><div class='add'>+        return 0;</div><div class='add'>+</div><div class='add'>+    xl-&gt;mem_acct = MALLOC(sizeof(struct mem_acct) +</div><div class='add'>+                          sizeof(struct mem_acct_rec) * num_types);</div><div class='add'>+</div><div class='add'>+    if (!xl-&gt;mem_acct) {</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    xl-&gt;mem_acct-&gt;num_types = num_types;</div><div class='add'>+    GF_ATOMIC_INIT(xl-&gt;mem_acct-&gt;refcnt, 1);</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; num_types; i++) {</div><div class='add'>+        memset(&amp;xl-&gt;mem_acct-&gt;rec[i], 0, sizeof(struct mem_acct_rec));</div><div class='add'>+        ret = LOCK_INIT(&amp;(xl-&gt;mem_acct-&gt;rec[i].lock));</div><div class='add'>+        if (ret) {</div><div class='add'>+            fprintf(stderr, "Unable to lock..errno : %d", errno);</div><div class='add'>+        }</div><div class='add'>+#ifdef DEBUG</div><div class='add'>+        INIT_LIST_HEAD(&amp;(xl-&gt;mem_acct-&gt;rec[i].obj_list));</div><div class='add'>+#endif</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+xlator_mem_acct_unref(struct mem_acct *mem_acct)</div><div class='add'>+{</div><div class='add'>+    uint32_t i;</div><div class='add'>+</div><div class='add'>+    if (GF_ATOMIC_DEC(mem_acct-&gt;refcnt) == 0) {</div><div class='add'>+        for (i = 0; i &lt; mem_acct-&gt;num_types; i++) {</div><div class='add'>+            LOCK_DESTROY(&amp;(mem_acct-&gt;rec[i].lock));</div><div class='add'>+        }</div><div class='add'>+        FREE(mem_acct);</div><div class='add'>+    }</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> void</div><div class='del'>-xlator_foreach (xlator_t *this,</div><div class='del'>-		void (*fn)(xlator_t *each,</div><div class='del'>-			   void *data),</div><div class='del'>-		void *data)</div><div class='add'>+xlator_tree_fini(xlator_t *xl)</div><div class='ctx'> {</div><div class='del'>-	xlator_t *first = NULL;</div><div class='add'>+    xlator_t *top = NULL;</div><div class='add'>+</div><div class='add'>+    GF_VALIDATE_OR_GOTO("xlator", xl, out);</div><div class='add'>+</div><div class='add'>+    top = xl;</div><div class='add'>+    xlator_fini_rec(top);</div><div class='ctx'> </div><div class='del'>-	if (this == NULL || fn == NULL || data == NULL)	{</div><div class='del'>-		gf_log ("xlator", GF_LOG_DEBUG, "invalid argument");</div><div class='del'>-		return;</div><div class='del'>-	}</div><div class='add'>+out:</div><div class='add'>+    return;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	first = this;</div><div class='add'>+int</div><div class='add'>+xlator_list_destroy(xlator_list_t *list)</div><div class='add'>+{</div><div class='add'>+    xlator_list_t *next = NULL;</div><div class='ctx'> </div><div class='del'>-	while (first-&gt;prev)</div><div class='del'>-		first = first-&gt;prev;</div><div class='add'>+    while (list) {</div><div class='add'>+        next = list-&gt;next;</div><div class='add'>+        GF_FREE(list);</div><div class='add'>+        list = next;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	while (first) {</div><div class='del'>-		fn (first, data);</div><div class='del'>-		first = first-&gt;next;</div><div class='del'>-	}</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+int</div><div class='add'>+xlator_memrec_free(xlator_t *xl)</div><div class='add'>+{</div><div class='add'>+    struct mem_acct *mem_acct = NULL;</div><div class='ctx'> </div><div class='del'>-xlator_t *</div><div class='del'>-xlator_search_by_name (xlator_t *any, const char *name)</div><div class='add'>+    if (!xl) {</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='add'>+    mem_acct = xl-&gt;mem_acct;</div><div class='add'>+</div><div class='add'>+    if (mem_acct) {</div><div class='add'>+        xlator_mem_acct_unref(mem_acct);</div><div class='add'>+        xl-&gt;mem_acct = NULL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+xlator_members_free(xlator_t *xl)</div><div class='ctx'> {</div><div class='del'>-	xlator_t *search = NULL;</div><div class='add'>+    volume_opt_list_t *vol_opt = NULL;</div><div class='add'>+    volume_opt_list_t *tmp = NULL;</div><div class='add'>+</div><div class='add'>+    if (!xl)</div><div class='add'>+        return 0;</div><div class='ctx'> </div><div class='del'>-	if (any == NULL || name == NULL) {</div><div class='del'>-		gf_log ("xlator", GF_LOG_DEBUG, "invalid argument");</div><div class='del'>-		return NULL;</div><div class='del'>-	}</div><div class='add'>+    GF_FREE(xl-&gt;name);</div><div class='add'>+    GF_FREE(xl-&gt;type);</div><div class='add'>+    if (!(xl-&gt;ctx &amp;&amp; xl-&gt;ctx-&gt;cmd_args.vgtool != _gf_none) &amp;&amp; xl-&gt;dlhandle)</div><div class='add'>+        dlclose(xl-&gt;dlhandle);</div><div class='add'>+    if (xl-&gt;options)</div><div class='add'>+        dict_unref(xl-&gt;options);</div><div class='ctx'> </div><div class='del'>-	search = any;</div><div class='add'>+    xlator_list_destroy(xl-&gt;children);</div><div class='ctx'> </div><div class='del'>-	while (search-&gt;prev)</div><div class='del'>-		search = search-&gt;prev;</div><div class='add'>+    xlator_list_destroy(xl-&gt;parents);</div><div class='ctx'> </div><div class='del'>-	while (search) {</div><div class='del'>-		if (!strcmp (search-&gt;name, name))</div><div class='del'>-			break;</div><div class='del'>-		search = search-&gt;next;</div><div class='del'>-	}</div><div class='add'>+    list_for_each_entry_safe(vol_opt, tmp, &amp;xl-&gt;volume_options, list)</div><div class='add'>+    {</div><div class='add'>+        list_del_init(&amp;vol_opt-&gt;list);</div><div class='add'>+        GF_FREE(vol_opt);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	return search;</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+/* This function destroys all the xlator members except for the</div><div class='add'>+ * xlator strcuture and its mem accounting field.</div><div class='add'>+ *</div><div class='add'>+ * If otherwise, it would destroy the master xlator object as well</div><div class='add'>+ * its mem accounting, which would mean after calling glusterfs_graph_destroy()</div><div class='add'>+ * there cannot be any reference to GF_FREE() from the master xlator, this is</div><div class='add'>+ * not possible because of the following dependencies:</div><div class='add'>+ * - glusterfs_ctx_t will have mem pools allocated by the master xlators</div><div class='add'>+ * - xlator objects will have references to those mem pools(g: dict)</div><div class='add'>+ *</div><div class='add'>+ * Ordering the freeing in any of the order will also not solve the dependency:</div><div class='add'>+ * - Freeing xlator objects(including memory accounting) before mem pools</div><div class='add'>+ *   destruction will mean not use GF_FREE while destroying mem pools.</div><div class='add'>+ * - Freeing mem pools and then destroying xlator objects would lead to crashes</div><div class='add'>+ *   when xlator tries to unref dict or other mem pool objects.</div><div class='add'>+ *</div><div class='add'>+ * Hence the way chosen out of this interdependency is to split xlator object</div><div class='add'>+ * free into two stages:</div><div class='add'>+ * - Free all the xlator members excpet for its mem accounting structure</div><div class='add'>+ * - Free all the mem accouting structures of xlator along with the xlator</div><div class='add'>+ *   object itself.</div><div class='add'>+ *</div><div class='add'>+ * This two stages of destruction, is mainly required for glfs_fini().</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+xlator_tree_free_members(xlator_t *tree)</div><div class='add'>+{</div><div class='add'>+    xlator_t *trav = tree;</div><div class='add'>+    xlator_t *prev = tree;</div><div class='add'>+</div><div class='add'>+    if (!tree) {</div><div class='add'>+        gf_smsg("parser", GF_LOG_ERROR, 0, LG_MSG_TREE_NOT_FOUND, NULL);</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    while (prev) {</div><div class='add'>+        trav = prev-&gt;next;</div><div class='add'>+        xlator_members_free(prev);</div><div class='add'>+        prev = trav;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+xlator_tree_free_memacct(xlator_t *tree)</div><div class='add'>+{</div><div class='add'>+    xlator_t *trav = tree;</div><div class='add'>+    xlator_t *prev = tree;</div><div class='add'>+</div><div class='add'>+    if (!tree) {</div><div class='add'>+        gf_smsg("parser", GF_LOG_ERROR, 0, LG_MSG_TREE_NOT_FOUND, NULL);</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    while (prev) {</div><div class='add'>+        trav = prev-&gt;next;</div><div class='add'>+        xlator_memrec_free(prev);</div><div class='add'>+        GF_FREE(prev);</div><div class='add'>+        prev = trav;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> static int</div><div class='del'>-__xlator_init(xlator_t *xl)</div><div class='add'>+xlator_mem_free(xlator_t *xl)</div><div class='ctx'> {</div><div class='del'>-        xlator_t *old_THIS = NULL;</div><div class='del'>-        int       ret = 0;</div><div class='add'>+    volume_opt_list_t *vol_opt = NULL;</div><div class='add'>+    volume_opt_list_t *tmp = NULL;</div><div class='ctx'> </div><div class='del'>-        old_THIS = THIS;</div><div class='del'>-        THIS = xl;</div><div class='add'>+    if (!xl)</div><div class='add'>+        return 0;</div><div class='ctx'> </div><div class='del'>-        ret = xl-&gt;init (xl);</div><div class='add'>+    if (xl-&gt;options) {</div><div class='add'>+        dict_unref(xl-&gt;options);</div><div class='add'>+        xl-&gt;options = NULL;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        THIS = old_THIS;</div><div class='add'>+    list_for_each_entry_safe(vol_opt, tmp, &amp;xl-&gt;volume_options, list)</div><div class='add'>+    {</div><div class='add'>+        list_del_init(&amp;vol_opt-&gt;list);</div><div class='add'>+        GF_FREE(vol_opt);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    xlator_memrec_free(xl);</div><div class='ctx'> </div><div class='del'>-        return ret;</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+static void</div><div class='add'>+xlator_call_fini(xlator_t *this)</div><div class='add'>+{</div><div class='add'>+    if (!this || this-&gt;call_cleanup)</div><div class='add'>+        return;</div><div class='add'>+    this-&gt;cleanup_starting = 1;</div><div class='add'>+    this-&gt;call_cleanup = 1;</div><div class='add'>+    xlator_call_fini(this-&gt;next);</div><div class='add'>+    this-&gt;fini(this);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+xlator_mem_cleanup(xlator_t *this)</div><div class='add'>+{</div><div class='add'>+    xlator_list_t *list = this-&gt;children;</div><div class='add'>+    xlator_t *trav = list-&gt;xlator;</div><div class='add'>+    inode_table_t *inode_table = NULL;</div><div class='add'>+    xlator_t *prev = trav;</div><div class='add'>+    glusterfs_ctx_t *ctx = NULL;</div><div class='add'>+    xlator_list_t **trav_p = NULL;</div><div class='add'>+    xlator_t *top = NULL;</div><div class='add'>+    xlator_t *victim = NULL;</div><div class='add'>+    glusterfs_graph_t *graph = NULL;</div><div class='add'>+    gf_boolean_t graph_cleanup = _gf_false;</div><div class='add'>+</div><div class='add'>+    if (this-&gt;call_cleanup || !this-&gt;ctx)</div><div class='add'>+        return;</div><div class='add'>+</div><div class='add'>+    this-&gt;call_cleanup = 1;</div><div class='add'>+    ctx = this-&gt;ctx;</div><div class='add'>+</div><div class='add'>+    inode_table = this-&gt;itable;</div><div class='add'>+    if (inode_table) {</div><div class='add'>+        inode_table_destroy(inode_table);</div><div class='add'>+        this-&gt;itable = NULL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    xlator_call_fini(trav);</div><div class='add'>+</div><div class='add'>+    while (prev) {</div><div class='add'>+        trav = prev-&gt;next;</div><div class='add'>+        xlator_mem_free(prev);</div><div class='add'>+        prev = trav;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (this-&gt;fini) {</div><div class='add'>+        this-&gt;fini(this);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    xlator_mem_free(this);</div><div class='add'>+</div><div class='add'>+    if (ctx-&gt;active) {</div><div class='add'>+        top = ctx-&gt;active-&gt;first;</div><div class='add'>+        LOCK(&amp;ctx-&gt;volfile_lock);</div><div class='add'>+        for (trav_p = &amp;top-&gt;children; *trav_p; trav_p = &amp;(*trav_p)-&gt;next) {</div><div class='add'>+            victim = (*trav_p)-&gt;xlator;</div><div class='add'>+            if (victim-&gt;call_cleanup &amp;&amp; !strcmp(victim-&gt;name, this-&gt;name)) {</div><div class='add'>+                graph_cleanup = _gf_true;</div><div class='add'>+                (*trav_p) = (*trav_p)-&gt;next;</div><div class='add'>+                break;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+        UNLOCK(&amp;ctx-&gt;volfile_lock);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (graph_cleanup) {</div><div class='add'>+        prev = this;</div><div class='add'>+        graph = ctx-&gt;active;</div><div class='add'>+        pthread_mutex_lock(&amp;graph-&gt;mutex);</div><div class='add'>+        while (prev) {</div><div class='add'>+            trav = prev-&gt;next;</div><div class='add'>+            GF_FREE(prev);</div><div class='add'>+            prev = trav;</div><div class='add'>+        }</div><div class='add'>+        pthread_mutex_unlock(&amp;graph-&gt;mutex);</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+loc_wipe(loc_t *loc)</div><div class='add'>+{</div><div class='add'>+    if (loc-&gt;inode) {</div><div class='add'>+        inode_unref(loc-&gt;inode);</div><div class='add'>+        loc-&gt;inode = NULL;</div><div class='add'>+    }</div><div class='add'>+    if (loc-&gt;path) {</div><div class='add'>+        GF_FREE((char *)loc-&gt;path);</div><div class='add'>+        loc-&gt;path = NULL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (loc-&gt;parent) {</div><div class='add'>+        inode_unref(loc-&gt;parent);</div><div class='add'>+        loc-&gt;parent = NULL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    memset(loc, 0, sizeof(*loc));</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-xlator_init (xlator_t *xl)</div><div class='add'>+loc_path(loc_t *loc, const char *bname)</div><div class='ctx'> {</div><div class='del'>-	int32_t ret = 0;</div><div class='add'>+    int ret = 0;</div><div class='ctx'> </div><div class='del'>-	if (xl == NULL)	{</div><div class='del'>-		gf_log ("xlator", GF_LOG_DEBUG, "invalid argument");</div><div class='del'>-		return 0;</div><div class='del'>-	}</div><div class='add'>+    if (loc-&gt;path)</div><div class='add'>+        goto out;</div><div class='ctx'> </div><div class='del'>-        ret = -1;</div><div class='add'>+    ret = -1;</div><div class='ctx'> </div><div class='del'>-        if (xl-&gt;mem_acct_init)</div><div class='del'>-                xl-&gt;mem_acct_init (xl);</div><div class='add'>+    if (bname &amp;&amp; !strlen(bname))</div><div class='add'>+        bname = NULL;</div><div class='ctx'> </div><div class='del'>-        if (!xl-&gt;init) {</div><div class='del'>-                gf_log (xl-&gt;name, GF_LOG_DEBUG, "No init() found");</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='add'>+    if (!bname)</div><div class='add'>+        goto inode_path;</div><div class='ctx'> </div><div class='del'>-        ret = __xlator_init (xl);</div><div class='add'>+    if (loc-&gt;parent &amp;&amp; !gf_uuid_is_null(loc-&gt;parent-&gt;gfid)) {</div><div class='add'>+        ret = inode_path(loc-&gt;parent, bname, (char **)&amp;loc-&gt;path);</div><div class='add'>+    } else if (!gf_uuid_is_null(loc-&gt;pargfid)) {</div><div class='add'>+        ret = gf_asprintf((char **)&amp;loc-&gt;path, INODE_PATH_FMT "/%s",</div><div class='add'>+                          uuid_utoa(loc-&gt;pargfid), bname);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        if (ret) {</div><div class='del'>-                gf_log (xl-&gt;name, GF_LOG_ERROR,</div><div class='del'>-                        "Initialization of volume '%s' failed,"</div><div class='del'>-                        " review your volfile again",</div><div class='del'>-                        xl-&gt;name);</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='add'>+    if (loc-&gt;path)</div><div class='add'>+        goto out;</div><div class='ctx'> </div><div class='del'>-        xl-&gt;init_succeeded = 1;</div><div class='add'>+inode_path:</div><div class='add'>+    if (loc-&gt;inode &amp;&amp; !gf_uuid_is_null(loc-&gt;inode-&gt;gfid)) {</div><div class='add'>+        ret = inode_path(loc-&gt;inode, NULL, (char **)&amp;loc-&gt;path);</div><div class='add'>+    } else if (!gf_uuid_is_null(loc-&gt;gfid)) {</div><div class='add'>+        ret = gf_asprintf((char **)&amp;loc-&gt;path, INODE_PATH_FMT,</div><div class='add'>+                          uuid_utoa(loc-&gt;gfid));</div><div class='add'>+    }</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        ret = 0;</div><div class='add'>+void</div><div class='add'>+loc_gfid(loc_t *loc, uuid_t gfid)</div><div class='add'>+{</div><div class='add'>+    if (!gfid)</div><div class='add'>+        goto out;</div><div class='add'>+    gf_uuid_clear(gfid);</div><div class='add'>+</div><div class='add'>+    if (!loc)</div><div class='add'>+        goto out;</div><div class='add'>+    else if (!gf_uuid_is_null(loc-&gt;gfid))</div><div class='add'>+        gf_uuid_copy(gfid, loc-&gt;gfid);</div><div class='add'>+    else if (loc-&gt;inode &amp;&amp; (!gf_uuid_is_null(loc-&gt;inode-&gt;gfid)))</div><div class='add'>+        gf_uuid_copy(gfid, loc-&gt;inode-&gt;gfid);</div><div class='ctx'> out:</div><div class='del'>-	return ret;</div><div class='add'>+    return;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+void</div><div class='add'>+loc_pargfid(loc_t *loc, uuid_t gfid)</div><div class='add'>+{</div><div class='add'>+    if (!gfid)</div><div class='add'>+        goto out;</div><div class='add'>+    gf_uuid_clear(gfid);</div><div class='add'>+</div><div class='add'>+    if (!loc)</div><div class='add'>+        goto out;</div><div class='add'>+    else if (!gf_uuid_is_null(loc-&gt;pargfid))</div><div class='add'>+        gf_uuid_copy(gfid, loc-&gt;pargfid);</div><div class='add'>+    else if (loc-&gt;parent &amp;&amp; (!gf_uuid_is_null(loc-&gt;parent-&gt;gfid)))</div><div class='add'>+        gf_uuid_copy(gfid, loc-&gt;parent-&gt;gfid);</div><div class='add'>+out:</div><div class='add'>+    return;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-static void</div><div class='del'>-xlator_fini_rec (xlator_t *xl)</div><div class='add'>+char *</div><div class='add'>+loc_gfid_utoa(loc_t *loc)</div><div class='ctx'> {</div><div class='del'>-	xlator_list_t *trav = NULL;</div><div class='del'>-</div><div class='del'>-	if (xl == NULL)	{</div><div class='del'>-		gf_log ("xlator", GF_LOG_DEBUG, "invalid argument");</div><div class='del'>-		return;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	trav = xl-&gt;children;</div><div class='del'>-</div><div class='del'>-	while (trav) {</div><div class='del'>-		if (!trav-&gt;xlator-&gt;init_succeeded) {</div><div class='del'>-			break;</div><div class='del'>-		}</div><div class='del'>-</div><div class='del'>-		xlator_fini_rec (trav-&gt;xlator);</div><div class='del'>-		gf_log (trav-&gt;xlator-&gt;name, GF_LOG_DEBUG, "fini done");</div><div class='del'>-		trav = trav-&gt;next;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	if (xl-&gt;init_succeeded) {</div><div class='del'>-		if (xl-&gt;fini) {</div><div class='del'>-			xl-&gt;fini (xl);</div><div class='del'>-		} else {</div><div class='del'>-			gf_log (xl-&gt;name, GF_LOG_DEBUG, "No fini() found");</div><div class='del'>-		}</div><div class='del'>-		xl-&gt;init_succeeded = 0;</div><div class='del'>-	}</div><div class='add'>+    uuid_t gfid = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    loc_gfid(loc, gfid);</div><div class='add'>+    return uuid_utoa(gfid);</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+int</div><div class='add'>+loc_touchup(loc_t *loc, const char *name)</div><div class='add'>+{</div><div class='add'>+    char *path = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    if (loc-&gt;path)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    if (loc-&gt;parent &amp;&amp; name &amp;&amp; strlen(name)) {</div><div class='add'>+        ret = inode_path(loc-&gt;parent, name, &amp;path);</div><div class='add'>+        if (path) /*Guaranteed to have trailing '/' */</div><div class='add'>+            loc-&gt;name = strrchr(path, '/') + 1;</div><div class='add'>+</div><div class='add'>+        if (gf_uuid_is_null(loc-&gt;pargfid))</div><div class='add'>+            gf_uuid_copy(loc-&gt;pargfid, loc-&gt;parent-&gt;gfid);</div><div class='add'>+    } else if (loc-&gt;inode) {</div><div class='add'>+        ret = inode_path(loc-&gt;inode, 0, &amp;path);</div><div class='add'>+        if (gf_uuid_is_null(loc-&gt;gfid))</div><div class='add'>+            gf_uuid_copy(loc-&gt;gfid, loc-&gt;inode-&gt;gfid);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (ret &lt; 0 || !path) {</div><div class='add'>+        ret = -ENOMEM;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    loc-&gt;path = path;</div><div class='add'>+    ret = 0;</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-xlator_notify (xlator_t *xl, int event, void *data, ...)</div><div class='add'>+loc_copy_overload_parent(loc_t *dst, loc_t *src, inode_t *parent)</div><div class='ctx'> {</div><div class='del'>-        xlator_t *old_THIS = NULL;</div><div class='del'>-        int       ret = 0;</div><div class='add'>+    int ret = -1;</div><div class='ctx'> </div><div class='del'>-        old_THIS = THIS;</div><div class='del'>-        THIS = xl;</div><div class='add'>+    GF_VALIDATE_OR_GOTO("xlator", dst, err);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("xlator", src, err);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("xlator", parent, err);</div><div class='ctx'> </div><div class='del'>-        ret = xl-&gt;notify (xl, event, data);</div><div class='add'>+    gf_uuid_copy(dst-&gt;gfid, src-&gt;gfid);</div><div class='add'>+    gf_uuid_copy(dst-&gt;pargfid, parent-&gt;gfid);</div><div class='ctx'> </div><div class='del'>-        THIS = old_THIS;</div><div class='add'>+    if (src-&gt;inode)</div><div class='add'>+        dst-&gt;inode = inode_ref(src-&gt;inode);</div><div class='ctx'> </div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='add'>+    if (parent)</div><div class='add'>+        dst-&gt;parent = inode_ref(parent);</div><div class='add'>+</div><div class='add'>+    if (src-&gt;path) {</div><div class='add'>+        dst-&gt;path = gf_strdup(src-&gt;path);</div><div class='ctx'> </div><div class='add'>+        if (!dst-&gt;path)</div><div class='add'>+            goto out;</div><div class='add'>+</div><div class='add'>+        if (src-&gt;name)</div><div class='add'>+            dst-&gt;name = strrchr(dst-&gt;path, '/');</div><div class='add'>+        if (dst-&gt;name)</div><div class='add'>+            dst-&gt;name++;</div><div class='add'>+    } else if (src-&gt;name) {</div><div class='add'>+        dst-&gt;name = src-&gt;name;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+out:</div><div class='add'>+    if (ret == -1)</div><div class='add'>+        loc_wipe(dst);</div><div class='add'>+</div><div class='add'>+err:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-xlator_mem_acct_init (xlator_t *xl, int num_types)</div><div class='add'>+loc_copy(loc_t *dst, loc_t *src)</div><div class='ctx'> {</div><div class='del'>-        int             i = 0;</div><div class='del'>-        int             ret = 0;</div><div class='add'>+    int ret = -1;</div><div class='ctx'> </div><div class='del'>-        if (!gf_mem_acct_is_enabled())</div><div class='del'>-                return 0;</div><div class='add'>+    GF_VALIDATE_OR_GOTO("xlator", dst, err);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("xlator", src, err);</div><div class='ctx'> </div><div class='del'>-        if (!xl)</div><div class='del'>-                return -1;</div><div class='add'>+    if (!gf_uuid_is_null(src-&gt;gfid))</div><div class='add'>+        gf_uuid_copy(dst-&gt;gfid, src-&gt;gfid);</div><div class='add'>+    else if (src-&gt;inode &amp;&amp; !gf_uuid_is_null(src-&gt;inode-&gt;gfid))</div><div class='add'>+        gf_uuid_copy(dst-&gt;gfid, src-&gt;inode-&gt;gfid);</div><div class='ctx'> </div><div class='del'>-        xl-&gt;mem_acct.num_types = num_types;</div><div class='add'>+    gf_uuid_copy(dst-&gt;pargfid, src-&gt;pargfid);</div><div class='ctx'> </div><div class='del'>-        xl-&gt;mem_acct.rec = calloc(num_types, sizeof(struct mem_acct_rec));</div><div class='add'>+    if (src-&gt;inode)</div><div class='add'>+        dst-&gt;inode = inode_ref(src-&gt;inode);</div><div class='ctx'> </div><div class='del'>-        if (!xl-&gt;mem_acct.rec) {</div><div class='del'>-                gf_log("xlator", GF_LOG_ERROR, "Out of Memory");</div><div class='del'>-                return -1;</div><div class='del'>-        }</div><div class='add'>+    if (src-&gt;parent)</div><div class='add'>+        dst-&gt;parent = inode_ref(src-&gt;parent);</div><div class='ctx'> </div><div class='del'>-        for (i = 0; i &lt; num_types; i++) {</div><div class='del'>-                ret = LOCK_INIT(&amp;(xl-&gt;mem_acct.rec[i].lock));</div><div class='del'>-                if (ret) {</div><div class='del'>-                        fprintf(stderr, "Unable to lock..errno : %d",errno);</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='add'>+    if (src-&gt;path) {</div><div class='add'>+        dst-&gt;path = gf_strdup(src-&gt;path);</div><div class='ctx'> </div><div class='del'>-        gf_log(xl-&gt;name, GF_LOG_DEBUG, "Allocated mem_acct_rec for %d types",</div><div class='del'>-                        num_types);</div><div class='add'>+        if (!dst-&gt;path)</div><div class='add'>+            goto out;</div><div class='ctx'> </div><div class='del'>-        return 0;</div><div class='add'>+        if (src-&gt;name)</div><div class='add'>+            dst-&gt;name = strrchr(dst-&gt;path, '/');</div><div class='add'>+        if (dst-&gt;name)</div><div class='add'>+            dst-&gt;name++;</div><div class='add'>+    } else if (src-&gt;name) {</div><div class='add'>+        dst-&gt;name = src-&gt;name;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+out:</div><div class='add'>+    if (ret == -1)</div><div class='add'>+        loc_wipe(dst);</div><div class='add'>+</div><div class='add'>+err:</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-void</div><div class='del'>-xlator_tree_fini (xlator_t *xl)</div><div class='add'>+gf_boolean_t</div><div class='add'>+loc_is_root(loc_t *loc)</div><div class='ctx'> {</div><div class='del'>-	xlator_t *top = NULL;</div><div class='add'>+    if (loc &amp;&amp; __is_root_gfid(loc-&gt;gfid)) {</div><div class='add'>+        return _gf_true;</div><div class='add'>+    } else if (loc &amp;&amp; loc-&gt;inode &amp;&amp; __is_root_gfid(loc-&gt;inode-&gt;gfid)) {</div><div class='add'>+        return _gf_true;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return _gf_false;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+loc_build_child(loc_t *child, loc_t *parent, char *name)</div><div class='add'>+{</div><div class='add'>+    int32_t ret = -1;</div><div class='add'>+</div><div class='add'>+    GF_VALIDATE_OR_GOTO("xlator", child, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("xlator", parent, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("xlator", name, out);</div><div class='add'>+</div><div class='add'>+    loc_gfid(parent, child-&gt;pargfid);</div><div class='add'>+</div><div class='add'>+    if (strcmp(parent-&gt;path, "/") == 0)</div><div class='add'>+        ret = gf_asprintf((char **)&amp;child-&gt;path, "/%s", name);</div><div class='add'>+    else</div><div class='add'>+        ret = gf_asprintf((char **)&amp;child-&gt;path, "%s/%s", parent-&gt;path, name);</div><div class='add'>+</div><div class='add'>+    if (ret &lt; 0 || !child-&gt;path) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    child-&gt;name = strrchr(child-&gt;path, '/') + 1;</div><div class='ctx'> </div><div class='del'>-	if (xl == NULL)	{</div><div class='del'>-		gf_log ("xlator", GF_LOG_DEBUG, "invalid argument");</div><div class='del'>-		return;</div><div class='del'>-	}</div><div class='add'>+    child-&gt;parent = inode_ref(parent-&gt;inode);</div><div class='add'>+    child-&gt;inode = inode_new(parent-&gt;inode-&gt;table);</div><div class='ctx'> </div><div class='del'>-	top = xl;</div><div class='del'>-	xlator_fini_rec (top);</div><div class='add'>+    if (!child-&gt;inode) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if ((ret &lt; 0) &amp;&amp; child)</div><div class='add'>+        loc_wipe(child);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+gf_boolean_t</div><div class='add'>+loc_is_nameless(loc_t *loc)</div><div class='add'>+{</div><div class='add'>+    gf_boolean_t ret = _gf_false;</div><div class='add'>+</div><div class='add'>+    GF_VALIDATE_OR_GOTO("xlator", loc, out);</div><div class='add'>+</div><div class='add'>+    if ((!loc-&gt;parent &amp;&amp; gf_uuid_is_null(loc-&gt;pargfid)) || !loc-&gt;name)</div><div class='add'>+        ret = _gf_true;</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-xlator_tree_free (xlator_t *tree)</div><div class='add'>+xlator_destroy(xlator_t *xl)</div><div class='ctx'> {</div><div class='del'>-  xlator_t *trav = tree, *prev = tree;</div><div class='add'>+    if (!xl)</div><div class='add'>+        return 0;</div><div class='ctx'> </div><div class='del'>-  if (!tree) {</div><div class='del'>-    gf_log ("parser", GF_LOG_ERROR, "Translator tree not found");</div><div class='del'>-    return -1;</div><div class='del'>-  }</div><div class='del'>-</div><div class='del'>-  while (prev) {</div><div class='del'>-    trav = prev-&gt;next;</div><div class='del'>-    dict_destroy (prev-&gt;options);</div><div class='del'>-    GF_FREE (prev-&gt;name);</div><div class='del'>-    GF_FREE (prev-&gt;type);</div><div class='del'>-    GF_FREE (prev);</div><div class='del'>-    prev = trav;</div><div class='del'>-  }</div><div class='del'>-  </div><div class='del'>-  return 0;</div><div class='add'>+    xlator_members_free(xl);</div><div class='add'>+    xlator_memrec_free(xl);</div><div class='add'>+    GF_FREE(xl);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+static int32_t</div><div class='add'>+gf_bin_to_string(char *dst, size_t size, void *src, size_t len)</div><div class='add'>+{</div><div class='add'>+    if (len &gt;= size) {</div><div class='add'>+        return EINVAL;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-void</div><div class='del'>-loc_wipe (loc_t *loc)</div><div class='add'>+    memcpy(dst, src, len);</div><div class='add'>+    dst[len] = 0;</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+is_gf_log_command(xlator_t *this, const char *name, char *value, size_t size)</div><div class='ctx'> {</div><div class='del'>-        if (loc-&gt;inode) {</div><div class='del'>-                inode_unref (loc-&gt;inode);</div><div class='del'>-                loc-&gt;inode = NULL;</div><div class='add'>+    xlator_t *trav = NULL;</div><div class='add'>+    char key[1024] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int log_level = -1;</div><div class='add'>+    gf_boolean_t syslog_flag = 0;</div><div class='add'>+    glusterfs_ctx_t *ctx = NULL;</div><div class='add'>+</div><div class='add'>+    if (!strcmp("trusted.glusterfs.syslog", name)) {</div><div class='add'>+        ret = gf_bin_to_string(key, sizeof(key), value, size);</div><div class='add'>+        if (ret != 0) {</div><div class='add'>+            goto out;</div><div class='ctx'>         }</div><div class='del'>-        if (loc-&gt;path) {</div><div class='del'>-                GF_FREE ((char *)loc-&gt;path);</div><div class='del'>-                loc-&gt;path = NULL;</div><div class='add'>+        ret = gf_string2boolean(key, &amp;syslog_flag);</div><div class='add'>+        if (ret) {</div><div class='add'>+            ret = EOPNOTSUPP;</div><div class='add'>+            goto out;</div><div class='ctx'>         }</div><div class='del'>-  </div><div class='del'>-        if (loc-&gt;parent) {</div><div class='del'>-                inode_unref (loc-&gt;parent);</div><div class='del'>-                loc-&gt;parent = NULL;</div><div class='add'>+        if (syslog_flag)</div><div class='add'>+            gf_log_enable_syslog();</div><div class='add'>+        else</div><div class='add'>+            gf_log_disable_syslog();</div><div class='add'>+</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (fnmatch("trusted.glusterfs*set-log-level", name, FNM_NOESCAPE))</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    ret = gf_bin_to_string(key, sizeof(key), value, size);</div><div class='add'>+    if (ret != 0) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    log_level = glusterd_check_log_level(key);</div><div class='add'>+    if (log_level == -1) {</div><div class='add'>+        ret = EOPNOTSUPP;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Some crude way to change the log-level of process */</div><div class='add'>+    if (!strcmp(name, "trusted.glusterfs.set-log-level")) {</div><div class='add'>+        gf_smsg("glusterfs", gf_log_get_loglevel(), 0, LG_MSG_SET_LOG_LEVEL,</div><div class='add'>+                "new-value=%d", log_level, "old-value=%d",</div><div class='add'>+                gf_log_get_loglevel(), NULL);</div><div class='add'>+        gf_log_set_loglevel(this-&gt;ctx, log_level);</div><div class='add'>+        ret = 0;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (!strcmp(name, "trusted.glusterfs.fuse.set-log-level")) {</div><div class='add'>+        /* */</div><div class='add'>+        gf_smsg(this-&gt;name, gf_log_get_xl_loglevel(this), 0,</div><div class='add'>+                LG_MSG_SET_LOG_LEVEL, "new-value=%d", log_level, "old-value=%d",</div><div class='add'>+                gf_log_get_xl_loglevel(this), NULL);</div><div class='add'>+        gf_log_set_xl_loglevel(this, log_level);</div><div class='add'>+        ret = 0;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ctx = this-&gt;ctx;</div><div class='add'>+    if (!ctx)</div><div class='add'>+        goto out;</div><div class='add'>+    if (!ctx-&gt;active)</div><div class='add'>+        goto out;</div><div class='add'>+    trav = ctx-&gt;active-&gt;top;</div><div class='add'>+</div><div class='add'>+    while (trav) {</div><div class='add'>+        snprintf(key, 1024, "trusted.glusterfs.%s.set-log-level", trav-&gt;name);</div><div class='add'>+        if (fnmatch(name, key, FNM_NOESCAPE) == 0) {</div><div class='add'>+            gf_smsg(trav-&gt;name, gf_log_get_xl_loglevel(trav), 0,</div><div class='add'>+                    LG_MSG_SET_LOG_LEVEL, "new-value%d", log_level,</div><div class='add'>+                    "old-value=%d", gf_log_get_xl_loglevel(trav), NULL);</div><div class='add'>+            gf_log_set_xl_loglevel(trav, log_level);</div><div class='add'>+            ret = 0;</div><div class='ctx'>         }</div><div class='add'>+        trav = trav-&gt;next;</div><div class='add'>+    }</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-loc_copy (loc_t *dst, loc_t *src)</div><div class='add'>+glusterd_check_log_level(const char *value)</div><div class='ctx'> {</div><div class='del'>-	int ret = -1;</div><div class='del'>-</div><div class='del'>-	dst-&gt;ino = src-&gt;ino;</div><div class='del'>-</div><div class='del'>-	if (src-&gt;inode)</div><div class='del'>-		dst-&gt;inode = inode_ref (src-&gt;inode);</div><div class='add'>+    int log_level = -1;</div><div class='add'>+</div><div class='add'>+    if (!strcasecmp(value, "CRITICAL")) {</div><div class='add'>+        log_level = GF_LOG_CRITICAL;</div><div class='add'>+    } else if (!strcasecmp(value, "ERROR")) {</div><div class='add'>+        log_level = GF_LOG_ERROR;</div><div class='add'>+    } else if (!strcasecmp(value, "WARNING")) {</div><div class='add'>+        log_level = GF_LOG_WARNING;</div><div class='add'>+    } else if (!strcasecmp(value, "INFO")) {</div><div class='add'>+        log_level = GF_LOG_INFO;</div><div class='add'>+    } else if (!strcasecmp(value, "DEBUG")) {</div><div class='add'>+        log_level = GF_LOG_DEBUG;</div><div class='add'>+    } else if (!strcasecmp(value, "TRACE")) {</div><div class='add'>+        log_level = GF_LOG_TRACE;</div><div class='add'>+    } else if (!strcasecmp(value, "NONE")) {</div><div class='add'>+        log_level = GF_LOG_NONE;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (log_level == -1)</div><div class='add'>+        gf_smsg(THIS-&gt;name, GF_LOG_ERROR, 0, LG_MSG_INVALID_INIT, NULL);</div><div class='add'>+</div><div class='add'>+    return log_level;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	if (src-&gt;parent)</div><div class='del'>-		dst-&gt;parent = inode_ref (src-&gt;parent);</div><div class='add'>+int</div><div class='add'>+xlator_subvolume_count(xlator_t *this)</div><div class='add'>+{</div><div class='add'>+    int i = 0;</div><div class='add'>+    xlator_list_t *list = NULL;</div><div class='ctx'> </div><div class='del'>-        dst-&gt;path = gf_strdup (src-&gt;path);</div><div class='add'>+    for (list = this-&gt;children; list; list = list-&gt;next)</div><div class='add'>+        i++;</div><div class='add'>+    return i;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	if (!dst-&gt;path)</div><div class='del'>-		goto out;</div><div class='add'>+static int</div><div class='add'>+_copy_opt_to_child(dict_t *options, char *key, data_t *value, void *data)</div><div class='add'>+{</div><div class='add'>+    xlator_t *child = data;</div><div class='ctx'> </div><div class='del'>-	dst-&gt;name = strrchr (dst-&gt;path, '/');</div><div class='del'>-	if (dst-&gt;name)</div><div class='del'>-		dst-&gt;name++;</div><div class='add'>+    gf_log(__func__, GF_LOG_DEBUG, "copying %s to child %s", key, child-&gt;name);</div><div class='add'>+    dict_set(child-&gt;options, key, value);</div><div class='ctx'> </div><div class='del'>-	ret = 0;</div><div class='del'>-out:</div><div class='del'>-	return ret;</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-xlator_list_destroy (xlator_list_t *list)</div><div class='add'>+copy_opts_to_child(xlator_t *src, xlator_t *dst, char *glob)</div><div class='ctx'> {</div><div class='del'>-        xlator_list_t *next = NULL;</div><div class='add'>+    return dict_foreach_fnmatch(src-&gt;options, glob, _copy_opt_to_child, dst);</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        while (list) {</div><div class='del'>-                next = list-&gt;next;</div><div class='del'>-                GF_FREE (list);</div><div class='del'>-                list = next;</div><div class='add'>+int</div><div class='add'>+glusterfs_delete_volfile_checksum(glusterfs_ctx_t *ctx, const char *volfile_id)</div><div class='add'>+{</div><div class='add'>+    gf_volfile_t *volfile_tmp = NULL;</div><div class='add'>+    gf_volfile_t *volfile_obj = NULL;</div><div class='add'>+</div><div class='add'>+    list_for_each_entry(volfile_tmp, &amp;ctx-&gt;volfile_list, volfile_list)</div><div class='add'>+    {</div><div class='add'>+        if (!strcmp(volfile_id, volfile_tmp-&gt;vol_id)) {</div><div class='add'>+            list_del_init(&amp;volfile_tmp-&gt;volfile_list);</div><div class='add'>+            volfile_obj = volfile_tmp;</div><div class='add'>+            break;</div><div class='ctx'>         }</div><div class='del'>-</div><div class='del'>-        return 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (volfile_obj) {</div><div class='add'>+        GF_FREE(volfile_obj);</div><div class='add'>+    } else {</div><div class='add'>+        gf_log(THIS-&gt;name, GF_LOG_ERROR,</div><div class='add'>+               "failed to get volfile "</div><div class='add'>+               "checksum for volfile id %s.",</div><div class='add'>+               volfile_id);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+/*</div><div class='add'>+   The function is required to take dict ref for every xlator at graph.</div><div class='add'>+   At the time of compare graph topology create a graph and populate</div><div class='add'>+   key values in the dictionary, after finished graph comparison we do destroy</div><div class='add'>+   the new graph.At the time of construct graph we don't take any reference</div><div class='add'>+   so to avoid dict leak at the of destroying graph due to ref counter underflow</div><div class='add'>+   we need to call dict_ref here.</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-xlator_destroy (xlator_t *xl)</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+gluster_graph_take_reference(xlator_t *tree)</div><div class='ctx'> {</div><div class='del'>-        if (!xl)</div><div class='del'>-                return 0;</div><div class='add'>+    xlator_t *trav = tree;</div><div class='add'>+    xlator_t *prev = tree;</div><div class='add'>+</div><div class='add'>+    if (!tree) {</div><div class='add'>+        gf_smsg("parser", GF_LOG_ERROR, 0, LG_MSG_TREE_NOT_FOUND, NULL);</div><div class='add'>+        return;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    while (prev) {</div><div class='add'>+        trav = prev-&gt;next;</div><div class='add'>+        if (prev-&gt;options)</div><div class='add'>+            dict_ref(prev-&gt;options);</div><div class='add'>+        prev = trav;</div><div class='add'>+    }</div><div class='add'>+    return;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        if (xl-&gt;name)</div><div class='del'>-                GF_FREE (xl-&gt;name);</div><div class='del'>-        if (xl-&gt;type)</div><div class='del'>-                GF_FREE (xl-&gt;type);</div><div class='del'>-        if (xl-&gt;dlhandle)</div><div class='del'>-                dlclose (xl-&gt;dlhandle);</div><div class='del'>-        if (xl-&gt;options)</div><div class='del'>-                dict_destroy (xl-&gt;options);</div><div class='add'>+gf_boolean_t</div><div class='add'>+mgmt_is_multiplexed_daemon(char *name)</div><div class='add'>+{</div><div class='add'>+    const char *mux_daemons[] = {"glustershd", NULL};</div><div class='add'>+    int i;</div><div class='ctx'> </div><div class='del'>-        xlator_list_destroy (xl-&gt;children);</div><div class='add'>+    if (!name)</div><div class='add'>+        return _gf_false;</div><div class='ctx'> </div><div class='del'>-        xlator_list_destroy (xl-&gt;parents);</div><div class='add'>+    for (i = 0; mux_daemons[i]; i++) {</div><div class='add'>+        if (!strcmp(name, mux_daemons[i]))</div><div class='add'>+            return _gf_true;</div><div class='add'>+    }</div><div class='add'>+    return _gf_false;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        GF_FREE (xl);</div><div class='add'>+gf_boolean_t</div><div class='add'>+xlator_is_cleanup_starting(xlator_t *this)</div><div class='add'>+{</div><div class='add'>+    gf_boolean_t cleanup = _gf_false;</div><div class='add'>+    glusterfs_graph_t *graph = NULL;</div><div class='add'>+    xlator_t *xl = NULL;</div><div class='add'>+</div><div class='add'>+    if (!this) {</div><div class='add'>+        gf_smsg("xlator", GF_LOG_WARNING, EINVAL, LG_MSG_OBJECT_NULL, "xlator",</div><div class='add'>+                NULL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    graph = this-&gt;graph;</div><div class='add'>+    if (!graph) {</div><div class='add'>+        gf_smsg("xlator", GF_LOG_WARNING, EINVAL, LG_MSG_GRAPH_NOT_SET,</div><div class='add'>+                "name=%s", this-&gt;name, NULL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    xl = graph-&gt;first;</div><div class='add'>+    if (xl &amp;&amp; xl-&gt;cleanup_starting)</div><div class='add'>+        cleanup = _gf_true;</div><div class='add'>+out:</div><div class='add'>+    return cleanup;</div><div class='add'>+}</div><div class='ctx'> </div><div class='add'>+int</div><div class='add'>+graph_total_client_xlator(glusterfs_graph_t *graph)</div><div class='add'>+{</div><div class='add'>+    xlator_t *xl = NULL;</div><div class='add'>+    int count = 0;</div><div class='add'>+</div><div class='add'>+    if (!graph) {</div><div class='add'>+        gf_smsg("xlator", GF_LOG_WARNING, EINVAL, LG_MSG_OBJECT_NULL, "graph",</div><div class='add'>+                NULL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    xl = graph-&gt;first;</div><div class='add'>+    if (!strcmp(xl-&gt;type, "protocol/server")) {</div><div class='add'>+        gf_msg_debug(xl-&gt;name, 0, "Return because it is a server graph");</div><div class='ctx'>         return 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    while (xl) {</div><div class='add'>+        if (strcmp(xl-&gt;type, "protocol/client") == 0) {</div><div class='add'>+            count++;</div><div class='add'>+        }</div><div class='add'>+        xl = xl-&gt;next;</div><div class='add'>+    }</div><div class='add'>+out:</div><div class='add'>+    return count;</div><div class='ctx'> }</div><div class='head'>diff --git a/libglusterfs/src/xlator.h b/libglusterfs/src/xlator.h<br/>deleted file mode 100644<br/>index c71aa7bb3cc..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/libglusterfs/src/xlator.h?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfs/src/xlator.h</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,864 +0,0 @@</div><div class='del'>-/*</div><div class='del'>-  Copyright (c) 2006-2009 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='del'>-  This file is part of GlusterFS.</div><div class='del'>-</div><div class='del'>-  GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-  it under the terms of the GNU General Public License as published</div><div class='del'>-  by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-  or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-  GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-  WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-  General Public License for more details.</div><div class='del'>-</div><div class='del'>-  You should have received a copy of the GNU General Public License</div><div class='del'>-  along with this program.  If not, see</div><div class='del'>-  &lt;http://www.gnu.org/licenses/&gt;.</div><div class='del'>-*/</div><div class='del'>-</div><div class='del'>-#ifndef _XLATOR_H</div><div class='del'>-#define _XLATOR_H</div><div class='del'>-</div><div class='del'>-#ifndef _CONFIG_H</div><div class='del'>-#define _CONFIG_H</div><div class='del'>-#include "config.h"</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-#include &lt;stdio.h&gt;</div><div class='del'>-#include &lt;stdint.h&gt;</div><div class='del'>-#include &lt;inttypes.h&gt;</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-#include "logging.h"</div><div class='del'>-#include "common-utils.h"</div><div class='del'>-#include "dict.h"</div><div class='del'>-#include "compat.h"</div><div class='del'>-#include "list.h"</div><div class='del'>-#include "latency.h"</div><div class='del'>-</div><div class='del'>-#define FIRST_CHILD(xl) (xl-&gt;children-&gt;xlator)</div><div class='del'>-</div><div class='del'>-#define GF_SET_ATTR_MODE  0x1</div><div class='del'>-#define GF_SET_ATTR_UID   0x2</div><div class='del'>-#define GF_SET_ATTR_GID   0x4</div><div class='del'>-#define GF_SET_ATTR_SIZE  0x8</div><div class='del'>-#define GF_SET_ATTR_ATIME 0x10</div><div class='del'>-#define GF_SET_ATTR_MTIME 0x20</div><div class='del'>-</div><div class='del'>-#define gf_attr_mode_set(mode)  ((mode) &amp; GF_SET_ATTR_MODE)</div><div class='del'>-#define gf_attr_uid_set(mode)   ((mode) &amp; GF_SET_ATTR_UID)</div><div class='del'>-#define gf_attr_gid_set(mode)   ((mode) &amp; GF_SET_ATTR_GID)</div><div class='del'>-#define gf_attr_size_set(mode)  ((mode) &amp; GF_SET_ATTR_SIZE)</div><div class='del'>-#define gf_attr_atime_set(mode) ((mode) &amp; GF_SET_ATTR_ATIME)</div><div class='del'>-#define gf_attr_mtime_set(mode) ((mode) &amp; GF_SET_ATTR_MTIME)</div><div class='del'>-</div><div class='del'>-struct _xlator;</div><div class='del'>-typedef struct _xlator xlator_t;</div><div class='del'>-struct _dir_entry_t;</div><div class='del'>-typedef struct _dir_entry_t dir_entry_t;</div><div class='del'>-struct _gf_dirent_t;</div><div class='del'>-typedef struct _gf_dirent_t gf_dirent_t;</div><div class='del'>-struct _loc;</div><div class='del'>-typedef struct _loc loc_t;</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-typedef int32_t (*event_notify_fn_t) (xlator_t *this, int32_t event, void *data,</div><div class='del'>-				      ...);</div><div class='del'>-</div><div class='del'>-#include "list.h"</div><div class='del'>-#include "gf-dirent.h"</div><div class='del'>-#include "stack.h"</div><div class='del'>-#include "iobuf.h"</div><div class='del'>-#include "inode.h"</div><div class='del'>-#include "fd.h"</div><div class='del'>-#include "globals.h"</div><div class='del'>-#include "iatt.h"</div><div class='del'>-</div><div class='del'>-struct _loc {</div><div class='del'>-	const char *path;</div><div class='del'>-	const char *name;</div><div class='del'>-	ino_t       ino;</div><div class='del'>-	inode_t    *inode;</div><div class='del'>-	inode_t    *parent;</div><div class='del'>-};</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-typedef int32_t (*fop_getspec_cbk_t) (call_frame_t *frame,</div><div class='del'>-				      void *cookie,</div><div class='del'>-				      xlator_t *this,</div><div class='del'>-				      int32_t op_ret,</div><div class='del'>-				      int32_t op_errno,</div><div class='del'>-				      char *spec_data);</div><div class='del'>-</div><div class='del'>-typedef int32_t (*fop_rchecksum_cbk_t) (call_frame_t *frame,</div><div class='del'>-                                        void *cookie,</div><div class='del'>-                                        xlator_t *this,</div><div class='del'>-                                        int32_t op_ret,</div><div class='del'>-                                        int32_t op_errno,</div><div class='del'>-                                        uint32_t weak_checksum,</div><div class='del'>-                                        uint8_t *strong_checksum);</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-typedef int32_t (*fop_getspec_t) (call_frame_t *frame,</div><div class='del'>-				  xlator_t *this,</div><div class='del'>-				  const char *key,</div><div class='del'>-				  int32_t flag);</div><div class='del'>-</div><div class='del'>-typedef int32_t (*fop_rchecksum_t) (call_frame_t *frame,</div><div class='del'>-                                    xlator_t *this,</div><div class='del'>-                                    fd_t *fd, off_t offset,</div><div class='del'>-                                    int32_t len);</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-typedef int32_t (*fop_lookup_cbk_t) (call_frame_t *frame,</div><div class='del'>-				     void *cookie,</div><div class='del'>-				     xlator_t *this,</div><div class='del'>-				     int32_t op_ret,</div><div class='del'>-				     int32_t op_errno,</div><div class='del'>-				     inode_t *inode,</div><div class='del'>-				     struct iatt *buf,</div><div class='del'>-                                     dict_t *xattr,</div><div class='del'>-                                     struct iatt *postparent);</div><div class='del'>-</div><div class='del'>-typedef int32_t (*fop_stat_cbk_t) (call_frame_t *frame,</div><div class='del'>-				   void *cookie,</div><div class='del'>-				   xlator_t *this,</div><div class='del'>-				   int32_t op_ret,</div><div class='del'>-				   int32_t op_errno,</div><div class='del'>-				   struct iatt *buf);</div><div class='del'>-</div><div class='del'>-typedef int32_t (*fop_fstat_cbk_t) (call_frame_t *frame,</div><div class='del'>-				    void *cookie,</div><div class='del'>-				    xlator_t *this,</div><div class='del'>-				    int32_t op_ret,</div><div class='del'>-				    int32_t op_errno,</div><div class='del'>-				    struct iatt *buf);</div><div class='del'>-</div><div class='del'>-typedef int32_t (*fop_truncate_cbk_t) (call_frame_t *frame,</div><div class='del'>-				       void *cookie,</div><div class='del'>-				       xlator_t *this,</div><div class='del'>-				       int32_t op_ret,</div><div class='del'>-				       int32_t op_errno,</div><div class='del'>-				       struct iatt *prebuf,</div><div class='del'>-                                       struct iatt *postbuf);</div><div class='del'>-</div><div class='del'>-typedef int32_t (*fop_ftruncate_cbk_t) (call_frame_t *frame,</div><div class='del'>-					void *cookie,</div><div class='del'>-					xlator_t *this,</div><div class='del'>-					int32_t op_ret,</div><div class='del'>-					int32_t op_errno,</div><div class='del'>-					struct iatt *prebuf,</div><div class='del'>-                                        struct iatt *postbuf);</div><div class='del'>-</div><div class='del'>-typedef int32_t (*fop_access_cbk_t) (call_frame_t *frame,</div><div class='del'>-				     void *cookie,</div><div class='del'>-				     xlator_t *this,</div><div class='del'>-				     int32_t op_ret,</div><div class='del'>-				     int32_t op_errno);</div><div class='del'>-</div><div class='del'>-typedef int32_t (*fop_readlink_cbk_t) (call_frame_t *frame,</div><div class='del'>-				       void *cookie,</div><div class='del'>-				       xlator_t *this,</div><div class='del'>-				       int32_t op_ret,</div><div class='del'>-				       int32_t op_errno,</div><div class='del'>-				       const char *path,</div><div class='del'>-                                       struct iatt *buf);</div><div class='del'>-</div><div class='del'>-typedef int32_t (*fop_mknod_cbk_t) (call_frame_t *frame,</div><div class='del'>-				    void *cookie,</div><div class='del'>-				    xlator_t *this,</div><div class='del'>-				    int32_t op_ret,</div><div class='del'>-				    int32_t op_errno,</div><div class='del'>-				    inode_t *inode,</div><div class='del'>-                                    struct iatt *buf,</div><div class='del'>-                                    struct iatt *preparent,</div><div class='del'>-                                    struct iatt *postparent);</div><div class='del'>-</div><div class='del'>-typedef int32_t (*fop_mkdir_cbk_t) (call_frame_t *frame,</div><div class='del'>-				    void *cookie,</div><div class='del'>-				    xlator_t *this,</div><div class='del'>-				    int32_t op_ret,</div><div class='del'>-				    int32_t op_errno,</div><div class='del'>-				    inode_t *inode,</div><div class='del'>-                                    struct iatt *buf,</div><div class='del'>-                                    struct iatt *preparent,</div><div class='del'>-                                    struct iatt *postparent);</div><div class='del'>-</div><div class='del'>-typedef int32_t (*fop_unlink_cbk_t) (call_frame_t *frame,</div><div class='del'>-				     void *cookie,</div><div class='del'>-				     xlator_t *this,</div><div class='del'>-				     int32_t op_ret,</div><div class='del'>-				     int32_t op_errno,</div><div class='del'>-                                     struct iatt *preparent,</div><div class='del'>-                                     struct iatt *postparent);</div><div class='del'>-</div><div class='del'>-typedef int32_t (*fop_rmdir_cbk_t) (call_frame_t *frame,</div><div class='del'>-				    void *cookie,</div><div class='del'>-				    xlator_t *this,</div><div class='del'>-				    int32_t op_ret,</div><div class='del'>-				    int32_t op_errno,</div><div class='del'>-                                    struct iatt *preparent,</div><div class='del'>-                                    struct iatt *postparent);</div><div class='del'>-</div><div class='del'>-typedef int32_t (*fop_symlink_cbk_t) (call_frame_t *frame,</div><div class='del'>-				      void *cookie,</div><div class='del'>-				      xlator_t *this,</div><div class='del'>-				      int32_t op_ret,</div><div class='del'>-				      int32_t op_errno,</div><div class='del'>-				      inode_t *inode,</div><div class='del'>-                                      struct iatt *buf,</div><div class='del'>-                                      struct iatt *preparent,</div><div class='del'>-                                      struct iatt *postparent);</div><div class='del'>-</div><div class='del'>-typedef int32_t (*fop_rename_cbk_t) (call_frame_t *frame,</div><div class='del'>-				     void *cookie,</div><div class='del'>-				     xlator_t *this,</div><div class='del'>-				     int32_t op_ret,</div><div class='del'>-				     int32_t op_errno,</div><div class='del'>-				     struct iatt *buf,</div><div class='del'>-                                     struct iatt *preoldparent,</div><div class='del'>-                                     struct iatt *postoldparent,</div><div class='del'>-                                     struct iatt *prenewparent,</div><div class='del'>-                                     struct iatt *postnewparent);</div><div class='del'>-</div><div class='del'>-typedef int32_t (*fop_link_cbk_t) (call_frame_t *frame,</div><div class='del'>-				   void *cookie,</div><div class='del'>-				   xlator_t *this,</div><div class='del'>-				   int32_t op_ret,</div><div class='del'>-				   int32_t op_errno,</div><div class='del'>-				   inode_t *inode,</div><div class='del'>-                                   struct iatt *buf,</div><div class='del'>-                                   struct iatt *preparent,</div><div class='del'>-                                   struct iatt *postparent);</div><div class='del'>-</div><div class='del'>-typedef int32_t (*fop_create_cbk_t) (call_frame_t *frame,</div><div class='del'>-				     void *cookie,</div><div class='del'>-				     xlator_t *this,</div><div class='del'>-				     int32_t op_ret,</div><div class='del'>-				     int32_t op_errno,</div><div class='del'>-				     fd_t *fd,</div><div class='del'>-				     inode_t *inode,</div><div class='del'>-				     struct iatt *buf,</div><div class='del'>-                                     struct iatt *preparent,</div><div class='del'>-                                     struct iatt *postparent);</div><div class='del'>-</div><div class='del'>-typedef int32_t (*fop_open_cbk_t) (call_frame_t *frame,</div><div class='del'>-				   void *cookie,</div><div class='del'>-				   xlator_t *this,</div><div class='del'>-				   int32_t op_ret,</div><div class='del'>-				   int32_t op_errno,</div><div class='del'>-				   fd_t *fd);</div><div class='del'>-</div><div class='del'>-typedef int32_t (*fop_readv_cbk_t) (call_frame_t *frame,</div><div class='del'>-				    void *cookie,</div><div class='del'>-				    xlator_t *this,</div><div class='del'>-				    int32_t op_ret,</div><div class='del'>-				    int32_t op_errno,</div><div class='del'>-				    struct iovec *vector,</div><div class='del'>-				    int32_t count,</div><div class='del'>-				    struct iatt *stbuf,</div><div class='del'>-                                    struct iobref *iobref);</div><div class='del'>-</div><div class='del'>-typedef int32_t (*fop_writev_cbk_t) (call_frame_t *frame,</div><div class='del'>-				     void *cookie,</div><div class='del'>-				     xlator_t *this,</div><div class='del'>-				     int32_t op_ret,</div><div class='del'>-				     int32_t op_errno,</div><div class='del'>-				     struct iatt *prebuf,</div><div class='del'>-                                     struct iatt *postbuf);</div><div class='del'>-</div><div class='del'>-typedef int32_t (*fop_flush_cbk_t) (call_frame_t *frame,</div><div class='del'>-				    void *cookie,</div><div class='del'>-				    xlator_t *this,</div><div class='del'>-				    int32_t op_ret,</div><div class='del'>-				    int32_t op_errno);</div><div class='del'>-</div><div class='del'>-typedef int32_t (*fop_fsync_cbk_t) (call_frame_t *frame,</div><div class='del'>-				    void *cookie,</div><div class='del'>-				    xlator_t *this,</div><div class='del'>-				    int32_t op_ret,</div><div class='del'>-				    int32_t op_errno,</div><div class='del'>-                                    struct iatt *prebuf,</div><div class='del'>-                                    struct iatt *postbuf);</div><div class='del'>-</div><div class='del'>-typedef int32_t (*fop_opendir_cbk_t) (call_frame_t *frame,</div><div class='del'>-				      void *cookie,</div><div class='del'>-				      xlator_t *this,</div><div class='del'>-				      int32_t op_ret,</div><div class='del'>-				      int32_t op_errno,</div><div class='del'>-				      fd_t *fd);</div><div class='del'>-</div><div class='del'>-typedef int32_t (*fop_fsyncdir_cbk_t) (call_frame_t *frame,</div><div class='del'>-				       void *cookie,</div><div class='del'>-				       xlator_t *this,</div><div class='del'>-				       int32_t op_ret,</div><div class='del'>-				       int32_t op_errno);</div><div class='del'>-</div><div class='del'>-typedef int32_t (*fop_statfs_cbk_t) (call_frame_t *frame,</div><div class='del'>-				     void *cookie,</div><div class='del'>-				     xlator_t *this,</div><div class='del'>-				     int32_t op_ret,</div><div class='del'>-				     int32_t op_errno,</div><div class='del'>-				     struct statvfs *buf);</div><div class='del'>-</div><div class='del'>-typedef int32_t (*fop_setxattr_cbk_t) (call_frame_t *frame,</div><div class='del'>-				       void *cookie,</div><div class='del'>-				       xlator_t *this,</div><div class='del'>-				       int32_t op_ret,</div><div class='del'>-				       int32_t op_errno);</div><div class='del'>-</div><div class='del'>-typedef int32_t (*fop_getxattr_cbk_t) (call_frame_t *frame,</div><div class='del'>-				       void *cookie,</div><div class='del'>-				       xlator_t *this,</div><div class='del'>-				       int32_t op_ret,</div><div class='del'>-				       int32_t op_errno,</div><div class='del'>-				       dict_t *dict);</div><div class='del'>-</div><div class='del'>-typedef int32_t (*fop_fsetxattr_cbk_t) (call_frame_t *frame,</div><div class='del'>-                                        void *cookie,</div><div class='del'>-                                        xlator_t *this,</div><div class='del'>-                                        int32_t op_ret,</div><div class='del'>-                                        int32_t op_errno);</div><div class='del'>-</div><div class='del'>-typedef int32_t (*fop_fgetxattr_cbk_t) (call_frame_t *frame,</div><div class='del'>-                                        void *cookie,</div><div class='del'>-                                        xlator_t *this,</div><div class='del'>-                                        int32_t op_ret,</div><div class='del'>-                                        int32_t op_errno,</div><div class='del'>-                                        dict_t *dict);</div><div class='del'>-</div><div class='del'>-typedef int32_t (*fop_removexattr_cbk_t) (call_frame_t *frame,</div><div class='del'>-					  void *cookie,</div><div class='del'>-					  xlator_t *this,</div><div class='del'>-					  int32_t op_ret,</div><div class='del'>-					  int32_t op_errno);</div><div class='del'>-</div><div class='del'>-typedef int32_t (*fop_lk_cbk_t) (call_frame_t *frame,</div><div class='del'>-				 void *cookie,</div><div class='del'>-				 xlator_t *this,</div><div class='del'>-				 int32_t op_ret,</div><div class='del'>-				 int32_t op_errno,</div><div class='del'>-				 struct flock *flock);</div><div class='del'>-</div><div class='del'>-typedef int32_t (*fop_inodelk_cbk_t) (call_frame_t *frame,</div><div class='del'>-				      void *cookie,</div><div class='del'>-				      xlator_t *this,</div><div class='del'>-				      int32_t op_ret,</div><div class='del'>-				      int32_t op_errno);</div><div class='del'>-</div><div class='del'>-typedef int32_t (*fop_finodelk_cbk_t) (call_frame_t *frame,</div><div class='del'>-				       void *cookie,</div><div class='del'>-				       xlator_t *this,</div><div class='del'>-				       int32_t op_ret,</div><div class='del'>-				       int32_t op_errno);</div><div class='del'>-</div><div class='del'>-typedef int32_t (*fop_entrylk_cbk_t) (call_frame_t *frame,</div><div class='del'>-				      void *cookie,</div><div class='del'>-				      xlator_t *this,</div><div class='del'>-				      int32_t op_ret,</div><div class='del'>-				      int32_t op_errno);</div><div class='del'>-</div><div class='del'>-typedef int32_t (*fop_fentrylk_cbk_t) (call_frame_t *frame,</div><div class='del'>-				       void *cookie,</div><div class='del'>-				       xlator_t *this,</div><div class='del'>-				       int32_t op_ret,</div><div class='del'>-				       int32_t op_errno);</div><div class='del'>-</div><div class='del'>-typedef int32_t (*fop_readdir_cbk_t) (call_frame_t *frame,</div><div class='del'>-				      void *cookie,</div><div class='del'>-				      xlator_t *this,</div><div class='del'>-				      int32_t op_ret,</div><div class='del'>-				      int32_t op_errno,</div><div class='del'>-				      gf_dirent_t *entries);</div><div class='del'>-</div><div class='del'>-typedef int32_t (*fop_readdirp_cbk_t) (call_frame_t *frame,</div><div class='del'>-				       void *cookie,</div><div class='del'>-				       xlator_t *this,</div><div class='del'>-				       int32_t op_ret,</div><div class='del'>-				       int32_t op_errno,</div><div class='del'>-				       gf_dirent_t *entries);</div><div class='del'>-</div><div class='del'>-typedef int32_t (*fop_xattrop_cbk_t) (call_frame_t *frame,</div><div class='del'>-				      void *cookie,</div><div class='del'>-				      xlator_t *this,</div><div class='del'>-				      int32_t op_ret,</div><div class='del'>-				      int32_t op_errno,</div><div class='del'>-				      dict_t *xattr);</div><div class='del'>-</div><div class='del'>-typedef int32_t (*fop_fxattrop_cbk_t) (call_frame_t *frame,</div><div class='del'>-				       void *cookie,</div><div class='del'>-				       xlator_t *this,</div><div class='del'>-				       int32_t op_ret,</div><div class='del'>-				       int32_t op_errno,</div><div class='del'>-				       dict_t *xattr);</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-typedef int32_t (*fop_setattr_cbk_t) (call_frame_t *frame,</div><div class='del'>-                                      void *cookie,</div><div class='del'>-                                      xlator_t *this,</div><div class='del'>-                                      int32_t op_ret,</div><div class='del'>-                                      int32_t op_errno,</div><div class='del'>-                                      struct iatt *preop_stbuf,</div><div class='del'>-                                      struct iatt *postop_stbuf);</div><div class='del'>-</div><div class='del'>-typedef int32_t (*fop_fsetattr_cbk_t) (call_frame_t *frame,</div><div class='del'>-                                       void *cookie,</div><div class='del'>-                                       xlator_t *this,</div><div class='del'>-                                       int32_t op_ret,</div><div class='del'>-                                       int32_t op_errno,</div><div class='del'>-                                       struct iatt *preop_stbuf,</div><div class='del'>-                                       struct iatt *postop_stbuf);</div><div class='del'>-</div><div class='del'>-typedef int32_t (*fop_lookup_t) (call_frame_t *frame,</div><div class='del'>-				 xlator_t *this,</div><div class='del'>-				 loc_t *loc,</div><div class='del'>-				 dict_t *xattr_req);</div><div class='del'>-</div><div class='del'>-typedef int32_t (*fop_stat_t) (call_frame_t *frame,</div><div class='del'>-			       xlator_t *this,</div><div class='del'>-			       loc_t *loc);</div><div class='del'>-</div><div class='del'>-typedef int32_t (*fop_fstat_t) (call_frame_t *frame,</div><div class='del'>-				xlator_t *this,</div><div class='del'>-				fd_t *fd);</div><div class='del'>-</div><div class='del'>-typedef int32_t (*fop_truncate_t) (call_frame_t *frame,</div><div class='del'>-				   xlator_t *this,</div><div class='del'>-				   loc_t *loc,</div><div class='del'>-				   off_t offset);</div><div class='del'>-</div><div class='del'>-typedef int32_t (*fop_ftruncate_t) (call_frame_t *frame,</div><div class='del'>-				    xlator_t *this,</div><div class='del'>-				    fd_t *fd,</div><div class='del'>-				    off_t offset);</div><div class='del'>-</div><div class='del'>-typedef int32_t (*fop_access_t) (call_frame_t *frame,</div><div class='del'>-				 xlator_t *this,</div><div class='del'>-				 loc_t *loc,</div><div class='del'>-				 int32_t mask);</div><div class='del'>-</div><div class='del'>-typedef int32_t (*fop_readlink_t) (call_frame_t *frame,</div><div class='del'>-				   xlator_t *this,</div><div class='del'>-				   loc_t *loc,</div><div class='del'>-				   size_t size);</div><div class='del'>-</div><div class='del'>-typedef int32_t (*fop_mknod_t) (call_frame_t *frame, xlator_t *this,</div><div class='del'>-				loc_t *loc, mode_t mode, dev_t rdev,</div><div class='del'>-                                dict_t *params);</div><div class='del'>-</div><div class='del'>-typedef int32_t (*fop_mkdir_t) (call_frame_t *frame, xlator_t *this,</div><div class='del'>-				loc_t *loc, mode_t mode, dict_t *params);</div><div class='del'>-</div><div class='del'>-typedef int32_t (*fop_unlink_t) (call_frame_t *frame,</div><div class='del'>-				 xlator_t *this,</div><div class='del'>-				 loc_t *loc);</div><div class='del'>-</div><div class='del'>-typedef int32_t (*fop_rmdir_t) (call_frame_t *frame,</div><div class='del'>-				xlator_t *this,</div><div class='del'>-				loc_t *loc);</div><div class='del'>-</div><div class='del'>-typedef int32_t (*fop_symlink_t) (call_frame_t *frame, xlator_t *this,</div><div class='del'>-				  const char *linkname, loc_t *loc,</div><div class='del'>-                                  dict_t *params);</div><div class='del'>-</div><div class='del'>-typedef int32_t (*fop_rename_t) (call_frame_t *frame,</div><div class='del'>-				 xlator_t *this,</div><div class='del'>-				 loc_t *oldloc,</div><div class='del'>-				 loc_t *newloc);</div><div class='del'>-</div><div class='del'>-typedef int32_t (*fop_link_t) (call_frame_t *frame,</div><div class='del'>-			       xlator_t *this,</div><div class='del'>-			       loc_t *oldloc,</div><div class='del'>-			       loc_t *newloc);</div><div class='del'>-</div><div class='del'>-typedef int32_t (*fop_create_t) (call_frame_t *frame, xlator_t *this,</div><div class='del'>-				 loc_t *loc, int32_t flags, mode_t mode,</div><div class='del'>-				 fd_t *fd, dict_t *params);</div><div class='del'>-</div><div class='del'>-/* Tell subsequent writes on the fd_t to fsync after every writev fop without</div><div class='del'>- * requiring a fsync fop.</div><div class='del'>- */</div><div class='del'>-#define GF_OPEN_FSYNC   0x01</div><div class='del'>-</div><div class='del'>-/* Tell write-behind to disable writing behind despite O_SYNC not being set.</div><div class='del'>- */</div><div class='del'>-#define GF_OPEN_NOWB    0x02</div><div class='del'>-</div><div class='del'>-typedef int32_t (*fop_open_t) (call_frame_t *frame,</div><div class='del'>-			       xlator_t *this,</div><div class='del'>-			       loc_t *loc,</div><div class='del'>-			       int32_t flags,</div><div class='del'>-			       fd_t *fd,</div><div class='del'>-                               int32_t wbflags);</div><div class='del'>-</div><div class='del'>-typedef int32_t (*fop_readv_t) (call_frame_t *frame,</div><div class='del'>-				xlator_t *this,</div><div class='del'>-				fd_t *fd,</div><div class='del'>-				size_t size,</div><div class='del'>-				off_t offset);</div><div class='del'>-</div><div class='del'>-typedef int32_t (*fop_writev_t) (call_frame_t *frame,</div><div class='del'>-				 xlator_t *this,</div><div class='del'>-				 fd_t *fd,</div><div class='del'>-				 struct iovec *vector,</div><div class='del'>-				 int32_t count,</div><div class='del'>-				 off_t offset,</div><div class='del'>-                                 struct iobref *iobref);</div><div class='del'>-</div><div class='del'>-typedef int32_t (*fop_flush_t) (call_frame_t *frame,</div><div class='del'>-				xlator_t *this,</div><div class='del'>-				fd_t *fd);</div><div class='del'>-</div><div class='del'>-typedef int32_t (*fop_fsync_t) (call_frame_t *frame,</div><div class='del'>-				xlator_t *this,</div><div class='del'>-				fd_t *fd,</div><div class='del'>-				int32_t datasync);</div><div class='del'>-</div><div class='del'>-typedef int32_t (*fop_opendir_t) (call_frame_t *frame,</div><div class='del'>-				  xlator_t *this,</div><div class='del'>-				  loc_t *loc,</div><div class='del'>-				  fd_t *fd);</div><div class='del'>-</div><div class='del'>-typedef int32_t (*fop_fsyncdir_t) (call_frame_t *frame,</div><div class='del'>-				   xlator_t *this,</div><div class='del'>-				   fd_t *fd,</div><div class='del'>-				   int32_t datasync);</div><div class='del'>-</div><div class='del'>-typedef int32_t (*fop_statfs_t) (call_frame_t *frame,</div><div class='del'>-				 xlator_t *this,</div><div class='del'>-				 loc_t *loc);</div><div class='del'>-</div><div class='del'>-typedef int32_t (*fop_setxattr_t) (call_frame_t *frame,</div><div class='del'>-				   xlator_t *this,</div><div class='del'>-				   loc_t *loc,</div><div class='del'>-				   dict_t *dict,</div><div class='del'>-				   int32_t flags);</div><div class='del'>-</div><div class='del'>-typedef int32_t (*fop_getxattr_t) (call_frame_t *frame,</div><div class='del'>-				   xlator_t *this,</div><div class='del'>-				   loc_t *loc,</div><div class='del'>-				   const char *name);</div><div class='del'>-</div><div class='del'>-typedef int32_t (*fop_fsetxattr_t) (call_frame_t *frame,</div><div class='del'>-                                    xlator_t *this,</div><div class='del'>-                                    fd_t *fd,</div><div class='del'>-                                    dict_t *dict,</div><div class='del'>-                                    int32_t flags);</div><div class='del'>-</div><div class='del'>-typedef int32_t (*fop_fgetxattr_t) (call_frame_t *frame,</div><div class='del'>-                                    xlator_t *this,</div><div class='del'>-                                    fd_t *fd,</div><div class='del'>-                                    const char *name);</div><div class='del'>-</div><div class='del'>-typedef int32_t (*fop_removexattr_t) (call_frame_t *frame,</div><div class='del'>-				      xlator_t *this,</div><div class='del'>-				      loc_t *loc,</div><div class='del'>-				      const char *name);</div><div class='del'>-</div><div class='del'>-typedef int32_t (*fop_lk_t) (call_frame_t *frame,</div><div class='del'>-			     xlator_t *this,</div><div class='del'>-			     fd_t *fd,</div><div class='del'>-			     int32_t cmd,</div><div class='del'>-			     struct flock *flock);</div><div class='del'>-</div><div class='del'>-typedef int32_t (*fop_inodelk_t) (call_frame_t *frame,</div><div class='del'>-				  xlator_t *this,</div><div class='del'>-                                  const char *volume,</div><div class='del'>-				  loc_t *loc,</div><div class='del'>-				  int32_t cmd,</div><div class='del'>-				  struct flock *flock);</div><div class='del'>-</div><div class='del'>-typedef int32_t (*fop_finodelk_t) (call_frame_t *frame,</div><div class='del'>-				   xlator_t *this,</div><div class='del'>-                                   const char *volume,</div><div class='del'>-				   fd_t *fd,</div><div class='del'>-				   int32_t cmd,</div><div class='del'>-				   struct flock *flock);</div><div class='del'>-</div><div class='del'>-typedef int32_t (*fop_entrylk_t) (call_frame_t *frame,</div><div class='del'>-				  xlator_t *this,</div><div class='del'>-                                  const char *volume, loc_t *loc,</div><div class='del'>-				  const char *basename, entrylk_cmd cmd,</div><div class='del'>-				  entrylk_type type);</div><div class='del'>-</div><div class='del'>-typedef int32_t (*fop_fentrylk_t) (call_frame_t *frame,</div><div class='del'>-				   xlator_t *this,</div><div class='del'>-                                   const char *volume, fd_t *fd,</div><div class='del'>-				   const char *basename, entrylk_cmd cmd,</div><div class='del'>-				   entrylk_type type);</div><div class='del'>-</div><div class='del'>-typedef int32_t (*fop_readdir_t) (call_frame_t *frame,</div><div class='del'>-				  xlator_t *this,</div><div class='del'>-				  fd_t *fd,</div><div class='del'>-				  size_t size,</div><div class='del'>-				  off_t offset);</div><div class='del'>-</div><div class='del'>-typedef int32_t (*fop_readdirp_t) (call_frame_t *frame,</div><div class='del'>-			           xlator_t *this,</div><div class='del'>-				   fd_t *fd,</div><div class='del'>-				   size_t size,</div><div class='del'>-				   off_t offset);</div><div class='del'>-</div><div class='del'>-typedef int32_t (*fop_xattrop_t) (call_frame_t *frame,</div><div class='del'>-				  xlator_t *this,</div><div class='del'>-				  loc_t *loc,</div><div class='del'>-				  gf_xattrop_flags_t optype,</div><div class='del'>-				  dict_t *xattr);</div><div class='del'>-</div><div class='del'>-typedef int32_t (*fop_fxattrop_t) (call_frame_t *frame,</div><div class='del'>-				   xlator_t *this,</div><div class='del'>-				   fd_t *fd,</div><div class='del'>-				   gf_xattrop_flags_t optype,</div><div class='del'>-				   dict_t *xattr);</div><div class='del'>-</div><div class='del'>-typedef int32_t (*fop_setattr_t) (call_frame_t *frame,</div><div class='del'>-                                  xlator_t *this,</div><div class='del'>-                                  loc_t *loc,</div><div class='del'>-                                  struct iatt *stbuf,</div><div class='del'>-                                  int32_t valid);</div><div class='del'>-</div><div class='del'>-typedef int32_t (*fop_fsetattr_t) (call_frame_t *frame,</div><div class='del'>-                                   xlator_t *this,</div><div class='del'>-                                   fd_t *fd,</div><div class='del'>-                                   struct iatt *stbuf,</div><div class='del'>-                                   int32_t valid);</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-struct xlator_fops {</div><div class='del'>-	fop_lookup_t         lookup;</div><div class='del'>-	fop_stat_t           stat;</div><div class='del'>-	fop_fstat_t          fstat;</div><div class='del'>-	fop_truncate_t       truncate;</div><div class='del'>-	fop_ftruncate_t      ftruncate;</div><div class='del'>-	fop_access_t         access;</div><div class='del'>-	fop_readlink_t       readlink;</div><div class='del'>-	fop_mknod_t          mknod;</div><div class='del'>-	fop_mkdir_t          mkdir;</div><div class='del'>-	fop_unlink_t         unlink;</div><div class='del'>-	fop_rmdir_t          rmdir;</div><div class='del'>-	fop_symlink_t        symlink;</div><div class='del'>-	fop_rename_t         rename;</div><div class='del'>-	fop_link_t           link;</div><div class='del'>-	fop_create_t         create;</div><div class='del'>-	fop_open_t           open;</div><div class='del'>-	fop_readv_t          readv;</div><div class='del'>-	fop_writev_t         writev;</div><div class='del'>-	fop_flush_t          flush;</div><div class='del'>-	fop_fsync_t          fsync;</div><div class='del'>-	fop_opendir_t        opendir;</div><div class='del'>-	fop_readdir_t        readdir;</div><div class='del'>-	fop_readdirp_t       readdirp;</div><div class='del'>-	fop_fsyncdir_t       fsyncdir;</div><div class='del'>-	fop_statfs_t         statfs;</div><div class='del'>-	fop_setxattr_t       setxattr;</div><div class='del'>-	fop_getxattr_t       getxattr;</div><div class='del'>-	fop_fsetxattr_t      fsetxattr;</div><div class='del'>-	fop_fgetxattr_t      fgetxattr;</div><div class='del'>-	fop_removexattr_t    removexattr;</div><div class='del'>-	fop_lk_t             lk;</div><div class='del'>-	fop_inodelk_t        inodelk;</div><div class='del'>-	fop_finodelk_t       finodelk;</div><div class='del'>-	fop_entrylk_t        entrylk;</div><div class='del'>-	fop_fentrylk_t       fentrylk;</div><div class='del'>-	fop_rchecksum_t      rchecksum;</div><div class='del'>-	fop_xattrop_t        xattrop;</div><div class='del'>-	fop_fxattrop_t       fxattrop;</div><div class='del'>-        fop_setattr_t        setattr;</div><div class='del'>-        fop_fsetattr_t       fsetattr;</div><div class='del'>-        fop_getspec_t        getspec;</div><div class='del'>-</div><div class='del'>-	/* these entries are used for a typechecking hack in STACK_WIND _only_ */</div><div class='del'>-	fop_lookup_cbk_t         lookup_cbk;</div><div class='del'>-	fop_stat_cbk_t           stat_cbk;</div><div class='del'>-	fop_fstat_cbk_t          fstat_cbk;</div><div class='del'>-	fop_truncate_cbk_t       truncate_cbk;</div><div class='del'>-	fop_ftruncate_cbk_t      ftruncate_cbk;</div><div class='del'>-	fop_access_cbk_t         access_cbk;</div><div class='del'>-	fop_readlink_cbk_t       readlink_cbk;</div><div class='del'>-	fop_mknod_cbk_t          mknod_cbk;</div><div class='del'>-	fop_mkdir_cbk_t          mkdir_cbk;</div><div class='del'>-	fop_unlink_cbk_t         unlink_cbk;</div><div class='del'>-	fop_rmdir_cbk_t          rmdir_cbk;</div><div class='del'>-	fop_symlink_cbk_t        symlink_cbk;</div><div class='del'>-	fop_rename_cbk_t         rename_cbk;</div><div class='del'>-	fop_link_cbk_t           link_cbk;</div><div class='del'>-	fop_create_cbk_t         create_cbk;</div><div class='del'>-	fop_open_cbk_t           open_cbk;</div><div class='del'>-	fop_readv_cbk_t          readv_cbk;</div><div class='del'>-	fop_writev_cbk_t         writev_cbk;</div><div class='del'>-	fop_flush_cbk_t          flush_cbk;</div><div class='del'>-	fop_fsync_cbk_t          fsync_cbk;</div><div class='del'>-	fop_opendir_cbk_t        opendir_cbk;</div><div class='del'>-	fop_readdir_cbk_t        readdir_cbk;</div><div class='del'>-	fop_readdirp_cbk_t       readdirp_cbk;</div><div class='del'>-	fop_fsyncdir_cbk_t       fsyncdir_cbk;</div><div class='del'>-	fop_statfs_cbk_t         statfs_cbk;</div><div class='del'>-	fop_setxattr_cbk_t       setxattr_cbk;</div><div class='del'>-	fop_getxattr_cbk_t       getxattr_cbk;</div><div class='del'>-	fop_fsetxattr_cbk_t      fsetxattr_cbk;</div><div class='del'>-	fop_fgetxattr_cbk_t      fgetxattr_cbk;</div><div class='del'>-	fop_removexattr_cbk_t    removexattr_cbk;</div><div class='del'>-	fop_lk_cbk_t             lk_cbk;</div><div class='del'>-	fop_inodelk_cbk_t        inodelk_cbk;</div><div class='del'>-	fop_finodelk_cbk_t       finodelk_cbk;</div><div class='del'>-	fop_entrylk_cbk_t        entrylk_cbk;</div><div class='del'>-	fop_fentrylk_cbk_t       fentrylk_cbk;</div><div class='del'>-	fop_rchecksum_cbk_t      rchecksum_cbk;</div><div class='del'>-	fop_xattrop_cbk_t        xattrop_cbk;</div><div class='del'>-	fop_fxattrop_cbk_t       fxattrop_cbk;</div><div class='del'>-        fop_setattr_cbk_t        setattr_cbk;</div><div class='del'>-        fop_fsetattr_cbk_t       fsetattr_cbk;</div><div class='del'>-        fop_getspec_cbk_t        getspec_cbk;</div><div class='del'>-};</div><div class='del'>-</div><div class='del'>-typedef int32_t (*cbk_forget_t) (xlator_t *this,</div><div class='del'>-				 inode_t *inode);</div><div class='del'>-</div><div class='del'>-typedef int32_t (*cbk_release_t) (xlator_t *this,</div><div class='del'>-				  fd_t *fd);</div><div class='del'>-</div><div class='del'>-struct xlator_cbks {</div><div class='del'>-	cbk_forget_t    forget;</div><div class='del'>-	cbk_release_t   release;</div><div class='del'>-	cbk_release_t   releasedir;</div><div class='del'>-};</div><div class='del'>-</div><div class='del'>-typedef int32_t (*dumpop_priv_t) (xlator_t *this);</div><div class='del'>-</div><div class='del'>-typedef int32_t (*dumpop_inode_t) (xlator_t *this);</div><div class='del'>-</div><div class='del'>-typedef int32_t (*dumpop_fd_t)  (xlator_t   *this);</div><div class='del'>-</div><div class='del'>-typedef int32_t (*dumpop_inodectx_t) (xlator_t *this, inode_t *ino);</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-struct xlator_dumpops {</div><div class='del'>-	dumpop_priv_t            priv;</div><div class='del'>-	dumpop_inode_t           inode;</div><div class='del'>-        dumpop_fd_t              fd;</div><div class='del'>-	dumpop_inodectx_t        inodectx;</div><div class='del'>-};</div><div class='del'>-</div><div class='del'>-typedef struct xlator_list {</div><div class='del'>-	xlator_t           *xlator;</div><div class='del'>-	struct xlator_list *next;</div><div class='del'>-} xlator_list_t;</div><div class='del'>-</div><div class='del'>-/* Add possible new type of option you may need */</div><div class='del'>-typedef enum {</div><div class='del'>-        GF_OPTION_TYPE_ANY = 0,</div><div class='del'>-        GF_OPTION_TYPE_STR,</div><div class='del'>-        GF_OPTION_TYPE_INT,</div><div class='del'>-        GF_OPTION_TYPE_SIZET,</div><div class='del'>-        GF_OPTION_TYPE_PERCENT,</div><div class='del'>-        GF_OPTION_TYPE_PERCENT_OR_SIZET,</div><div class='del'>-        GF_OPTION_TYPE_BOOL,</div><div class='del'>-        GF_OPTION_TYPE_XLATOR,</div><div class='del'>-        GF_OPTION_TYPE_PATH,</div><div class='del'>-        GF_OPTION_TYPE_TIME,</div><div class='del'>-	GF_OPTION_TYPE_DOUBLE,</div><div class='del'>-        GF_OPTION_TYPE_INTERNET_ADDRESS,</div><div class='del'>-} volume_option_type_t;</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-#define ZR_VOLUME_MAX_NUM_KEY    4</div><div class='del'>-#define ZR_OPTION_MAX_ARRAY_SIZE 64</div><div class='del'>-</div><div class='del'>-/* Each translator should define this structure */</div><div class='del'>-typedef struct volume_options {</div><div class='del'>-        char                *key[ZR_VOLUME_MAX_NUM_KEY];</div><div class='del'>-	                           /* different key, same meaning */</div><div class='del'>-        volume_option_type_t type;</div><div class='del'>-        int64_t              min;  /* -1 means no range */</div><div class='del'>-        int64_t              max;  /* -1 means no range */</div><div class='del'>-        char                *value[ZR_OPTION_MAX_ARRAY_SIZE];</div><div class='del'>-                                   /* If specified, will check for one of</div><div class='del'>-				      the value from this array */</div><div class='del'>-	char                *description; /* about the key */</div><div class='del'>-} volume_option_t;</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-typedef struct vol_opt_list {</div><div class='del'>-	struct list_head  list;</div><div class='del'>-	volume_option_t  *given_opt;</div><div class='del'>-} volume_opt_list_t;</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-struct _xlator {</div><div class='del'>-	/* Built during parsing */</div><div class='del'>-	char          *name;</div><div class='del'>-	char          *type;</div><div class='del'>-	xlator_t      *next;</div><div class='del'>-	xlator_t      *prev;</div><div class='del'>-	xlator_list_t *parents;</div><div class='del'>-	xlator_list_t *children;</div><div class='del'>-	dict_t        *options;</div><div class='del'>-</div><div class='del'>-	/* Set after doing dlopen() */</div><div class='del'>-        void                  *dlhandle;</div><div class='del'>-	struct xlator_fops    *fops;</div><div class='del'>-	struct xlator_cbks    *cbks;</div><div class='del'>-	struct xlator_dumpops *dumpops;</div><div class='del'>-	struct list_head       volume_options;  /* list of volume_option_t */</div><div class='del'>-</div><div class='del'>-	void              (*fini) (xlator_t *this);</div><div class='del'>-	int32_t           (*init) (xlator_t *this);</div><div class='del'>-	int32_t           (*mem_acct_init) (xlator_t *this);</div><div class='del'>-	event_notify_fn_t notify;</div><div class='del'>-</div><div class='del'>-        gf_loglevel_t    loglevel;   /* Log level for translator */</div><div class='del'>-</div><div class='del'>-        /* for latency measurement */</div><div class='del'>-        fop_latency_t latencies[GF_FOP_MAXVALUE];</div><div class='del'>-</div><div class='del'>-	/* Misc */</div><div class='del'>-	glusterfs_ctx_t    *ctx;</div><div class='del'>-	glusterfs_graph_t  *graph; /* not set for fuse */</div><div class='del'>-	inode_table_t      *itable;</div><div class='del'>-	char                init_succeeded;</div><div class='del'>-	void               *private;</div><div class='del'>-        struct mem_acct     mem_acct;</div><div class='del'>-};</div><div class='del'>-</div><div class='del'>-#define xlator_has_parent(xl) (xl-&gt;parents != NULL)</div><div class='del'>-</div><div class='del'>-int validate_xlator_volume_options (xlator_t *xl, volume_option_t *opt);</div><div class='del'>-</div><div class='del'>-int32_t xlator_set_type (xlator_t *xl, const char *type);</div><div class='del'>-</div><div class='del'>-xlator_t *file_to_xlator_tree (glusterfs_ctx_t *ctx,</div><div class='del'>-			       FILE *fp);</div><div class='del'>-</div><div class='del'>-int xlator_notify (xlator_t *this, int32_t event, void *data, ...);</div><div class='del'>-int xlator_init (xlator_t *this);</div><div class='del'>-int xlator_destroy (xlator_t *xl);</div><div class='del'>-</div><div class='del'>-int32_t xlator_tree_init (xlator_t *xl);</div><div class='del'>-int32_t xlator_tree_free (xlator_t *xl);</div><div class='del'>-</div><div class='del'>-void xlator_tree_fini (xlator_t *xl);</div><div class='del'>-</div><div class='del'>-void xlator_foreach (xlator_t *this,</div><div class='del'>-		     void (*fn) (xlator_t *each,</div><div class='del'>-				 void *data),</div><div class='del'>-		     void *data);</div><div class='del'>-</div><div class='del'>-xlator_t *xlator_search_by_name (xlator_t *any, const char *name);</div><div class='del'>-</div><div class='del'>-void inode_destroy_notify (inode_t *inode, const char *xlname);</div><div class='del'>-</div><div class='del'>-int loc_copy (loc_t *dst, loc_t *src);</div><div class='del'>-#define loc_dup(src, dst) loc_copy(dst, src)</div><div class='del'>-void loc_wipe (loc_t *loc);</div><div class='del'>-int xlator_mem_acct_init (xlator_t *xl, int num_types);</div><div class='del'>-</div><div class='del'>-#define GF_STAT_PRINT_FMT_STR "%"PRIx64",%"PRIx64",%"PRIx32",%"PRIx32",%"PRIx32",%"PRIx32",%"PRIx64",%"PRIx64",%"PRIx32",%"PRIx64",%"PRIx32",%"PRIx32",%"PRIx32",%"PRIx32",%"PRIx32",%"PRIx32"\n"</div><div class='del'>-</div><div class='del'>-#define GF_STAT_SCAN_FMT_STR "%"SCNx64",%"SCNx64",%"SCNx32",%"SCNx32",%"SCNx32",%"SCNx32",%"SCNx64",%"SCNx64",%"SCNx32",%"SCNx64",%"SCNx32",%"SCNx32",%"SCNx32",%"SCNx32",%"SCNx32",%"SCNx32"\n"</div><div class='del'>-</div><div class='del'>-#define GF_STATFS_PRINT_FMT_STR "%"PRIx32",%"PRIx32",%"PRIx64",%"PRIx64",%"PRIx64",%"PRIx64",%"PRIx64",%"PRIx64",%"PRIx32",%"PRIx32",%"PRIx32"\n"</div><div class='del'>-</div><div class='del'>-#define GF_STATFS_SCAN_FMT_STR "%"SCNx32",%"SCNx32",%"SCNx64",%"SCNx64",%"SCNx64",%"SCNx64",%"SCNx64",%"SCNx64",%"SCNx32",%"SCNx32",%"SCNx32"\n"</div><div class='del'>-</div><div class='del'>-#endif /* _XLATOR_H */</div><div class='head'>diff --git a/libglusterfsclient/src/Makefile.am b/libglusterfsclient/src/Makefile.am<br/>deleted file mode 100644<br/>index 32811c0d5bf..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/libglusterfsclient/src/Makefile.am?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfsclient/src/Makefile.am</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,16 +0,0 @@</div><div class='del'>-lib_LTLIBRARIES = libglusterfsclient.la</div><div class='del'>-noinst_HEADERS = libglusterfsclient-internals.h</div><div class='del'>-libglusterfsclient_HEADERS = libglusterfsclient.h </div><div class='del'>-libglusterfsclientdir = $(includedir)</div><div class='del'>-</div><div class='del'>-libglusterfsclient_la_SOURCES = libglusterfsclient.c libglusterfsclient-dentry.c</div><div class='del'>-libglusterfsclient_la_CFLAGS =  -fPIC -Wall</div><div class='del'>-libglusterfsclient_la_LIBADD = $(top_builddir)/libglusterfs/src/libglusterfs.la</div><div class='del'>-libglusterfsclient_la_CPPFLAGS = -D_FILE_OFFSET_BITS=64 -D$(GF_HOST_OS) -D__USE_FILE_OFFSET64 -D_GNU_SOURCE -I$(top_srcdir)/libglusterfs/src -DDATADIR=\"$(localstatedir)\" -DCONFDIR=\"$(sysconfdir)/glusterfs\" $(GF_CFLAGS)</div><div class='del'>-libglusterfsclient_la_LDFLAGS = -shared -nostartfiles</div><div class='del'>-</div><div class='del'>-CLEANFILES = </div><div class='del'>-</div><div class='del'>-$(top_builddir)/libglusterfs/src/libglusterfs.la:</div><div class='del'>-	$(MAKE) -C $(top_builddir)/libglusterfs/src/ all</div><div class='del'>-</div><div class='head'>diff --git a/libglusterfsclient/src/libglusterfsclient-dentry.c b/libglusterfsclient/src/libglusterfsclient-dentry.c<br/>deleted file mode 100644<br/>index 24273bb868b..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/libglusterfsclient/src/libglusterfsclient-dentry.c?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfsclient/src/libglusterfsclient-dentry.c</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,413 +0,0 @@</div><div class='del'>-/*</div><div class='del'>-  Copyright (c) 2008, 2009 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='del'>-  This file is part of GlusterFS.</div><div class='del'>-</div><div class='del'>-  GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-  it under the terms of the GNU General Public License as published</div><div class='del'>-  by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-  or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-  GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-  WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-  General Public License for more details.</div><div class='del'>-</div><div class='del'>-  You should have received a copy of the GNU General Public License</div><div class='del'>-  along with this program.  If not, see</div><div class='del'>-  &lt;http://www.gnu.org/licenses/&gt;.</div><div class='del'>-*/</div><div class='del'>-</div><div class='del'>-#include "libglusterfsclient.h"</div><div class='del'>-#include "libglusterfsclient-internals.h"</div><div class='del'>-#include &lt;libgen.h&gt;</div><div class='del'>-</div><div class='del'>-#define LIBGLUSTERFS_CLIENT_DENTRY_LOC_PREPARE(_new_loc, _loc, _parent, \</div><div class='del'>-                                               _resolved) do {          \</div><div class='del'>-                size_t pathlen = 0;                                     \</div><div class='del'>-                size_t resolvedlen = 0;                                 \</div><div class='del'>-                char *path = NULL;                                      \</div><div class='del'>-                int pad = 0;                                            \</div><div class='del'>-                pathlen   = strlen (_loc-&gt;path) + 1;                    \</div><div class='del'>-                path = CALLOC (1, pathlen);                             \</div><div class='del'>-                _new_loc.parent =  _parent;                             \</div><div class='del'>-                resolvedlen = strlen (_resolved);                       \</div><div class='del'>-                strncpy (path, _resolved, resolvedlen);                 \</div><div class='del'>-                if (resolvedlen == 1) /* only root resolved */          \</div><div class='del'>-                        pad = 0;                                        \</div><div class='del'>-                else {                                                  \</div><div class='del'>-                        pad = 1;                                        \</div><div class='del'>-                        path[resolvedlen] = '/';                        \</div><div class='del'>-                }                                                       \</div><div class='del'>-                strcpy_till (path + resolvedlen + pad,                  \</div><div class='del'>-                             loc-&gt;path + resolvedlen + pad, '/');       \</div><div class='del'>-                _new_loc.path = path;                                   \</div><div class='del'>-                _new_loc.name = strrchr (path, '/');                    \</div><div class='del'>-                if (_new_loc.name)                                      \</div><div class='del'>-                        _new_loc.name++;                                \</div><div class='del'>-        }while (0);</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-/* strcpy_till - copy @dname to @dest, until 'delim' is encountered in @dest</div><div class='del'>- * @dest - destination string</div><div class='del'>- * @dname - source string</div><div class='del'>- * @delim - delimiter character</div><div class='del'>- *</div><div class='del'>- * return - NULL is returned if '0' is encountered in @dname, otherwise returns</div><div class='del'>- *          a pointer to remaining string begining in @dest.</div><div class='del'>- */</div><div class='del'>-static char *</div><div class='del'>-strcpy_till (char *dest, const char *dname, char delim)</div><div class='del'>-{</div><div class='del'>-        char *src = NULL;</div><div class='del'>-        int idx = 0;</div><div class='del'>-        char *ret = NULL;</div><div class='del'>-</div><div class='del'>-        src = (char *)dname;</div><div class='del'>-        while (src[idx] &amp;&amp; (src[idx] != delim)) {</div><div class='del'>-                dest[idx] = src[idx];</div><div class='del'>-                idx++;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        dest[idx] = 0;</div><div class='del'>-</div><div class='del'>-        if (src[idx] == 0)</div><div class='del'>-                ret = NULL;</div><div class='del'>-        else</div><div class='del'>-                ret = &amp;(src[idx]);</div><div class='del'>-</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-/* __libgf_client_path_to_parenti - derive parent inode for @path. if immediate </div><div class='del'>- *                            parent is not available in the dentry cache, return nearest</div><div class='del'>- *                            available parent inode and set @reslv to the path of</div><div class='del'>- *                            the returned directory.</div><div class='del'>- *</div><div class='del'>- * @itable - inode table</div><div class='del'>- * @path   - path whose parent has to be looked up.</div><div class='del'>- * @reslv  - if immediate parent is not available, reslv will be set to path of the</div><div class='del'>- *           resolved parent.</div><div class='del'>- *</div><div class='del'>- * return - should never return NULL. should at least return '/' inode.</div><div class='del'>- */</div><div class='del'>-static inode_t *</div><div class='del'>-__libgf_client_path_to_parenti (libglusterfs_client_ctx_t *ctx,</div><div class='del'>-                                inode_table_t *itable, const char *path,</div><div class='del'>-                                char **reslv)</div><div class='del'>-{</div><div class='del'>-        char *resolved_till = NULL;</div><div class='del'>-        char *strtokptr = NULL;</div><div class='del'>-        char *component = NULL;</div><div class='del'>-        char *next_component = NULL;</div><div class='del'>-        char *pathdup = NULL;</div><div class='del'>-        inode_t *curr = NULL;</div><div class='del'>-        inode_t *parent = NULL;</div><div class='del'>-        size_t pathlen = 0;</div><div class='del'>-        loc_t rootloc = {0, };</div><div class='del'>-        int ret = -1;</div><div class='del'>-</div><div class='del'>-        pathlen = STRLEN_0 (path);</div><div class='del'>-        resolved_till = CALLOC (1, pathlen);</div><div class='del'>-</div><div class='del'>-        GF_VALIDATE_OR_GOTO("libglusterfsclient-dentry", resolved_till, out);</div><div class='del'>-        pathdup = strdup (path);</div><div class='del'>-        GF_VALIDATE_OR_GOTO("libglusterfsclient-dentry", pathdup, out);</div><div class='del'>-</div><div class='del'>-        parent = inode_ref (itable-&gt;root);</div><div class='del'>-        /* If the root inode's is outdated, send a revalidate on it.</div><div class='del'>-         * A revalidate on root inode also reduces the window in which an</div><div class='del'>-         * op will fail over distribute because the layout of the root</div><div class='del'>-         * directory did not  get constructed when we sent the lookup on</div><div class='del'>-         * root in glusterfs_init. That can happen when not all children of a</div><div class='del'>-         * distribute volume were up at the time of glusterfs_init.</div><div class='del'>-         */</div><div class='del'>-        if (!libgf_is_iattr_cache_valid (ctx, parent, NULL,</div><div class='del'>-                                        LIBGF_VALIDATE_LOOKUP)) {</div><div class='del'>-                libgf_client_loc_fill (&amp;rootloc, ctx, 1, 0, "/");</div><div class='del'>-                ret = libgf_client_lookup (ctx, &amp;rootloc, NULL, NULL, NULL);</div><div class='del'>-                if (ret == -1) {</div><div class='del'>-                        gf_log ("libglusterfsclient-dentry", GF_LOG_ERROR,</div><div class='del'>-                                "Root inode revalidation failed");</div><div class='del'>-                        inode_unref (parent);</div><div class='del'>-                        parent = NULL;</div><div class='del'>-                        goto out;</div><div class='del'>-                }</div><div class='del'>-                libgf_client_loc_wipe (&amp;rootloc);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        curr = NULL;</div><div class='del'>-</div><div class='del'>-        component = strtok_r (pathdup, "/", &amp;strtokptr);</div><div class='del'>-</div><div class='del'>-        while (component) {</div><div class='del'>-                curr = inode_search (itable, parent-&gt;ino, component);</div><div class='del'>-                if (!curr) {</div><div class='del'>-                        break;</div><div class='del'>-                }</div><div class='del'>-                if (!libgf_is_iattr_cache_valid (ctx, curr, NULL,</div><div class='del'>-                                                LIBGF_VALIDATE_LOOKUP))</div><div class='del'>-                        break;</div><div class='del'>-</div><div class='del'>-                /* It is OK to append the component even if it is the       </div><div class='del'>-                   last component in the path, because, if 'next_component'</div><div class='del'>-                   returns NULL, @parent will remain the same and</div><div class='del'>-                   @resolved_till will not be sent back               </div><div class='del'>-                */</div><div class='del'>-                strcat (resolved_till, "/");</div><div class='del'>-                strcat (resolved_till, component);</div><div class='del'>-</div><div class='del'>-                next_component = strtok_r (NULL, "/", &amp;strtokptr);</div><div class='del'>-</div><div class='del'>-                if (next_component) {</div><div class='del'>-                        inode_unref (parent);</div><div class='del'>-                        parent = curr;</div><div class='del'>-                        curr = NULL;</div><div class='del'>-                } else {</div><div class='del'>-                        /* will break */</div><div class='del'>-                        inode_unref (curr);</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                component = next_component;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (resolved_till[0] == '\0') {</div><div class='del'>-                strcat (resolved_till, "/");</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        free (pathdup);</div><div class='del'>-        </div><div class='del'>-        if (reslv) {</div><div class='del'>-                *reslv = resolved_till;</div><div class='del'>-        } else {</div><div class='del'>-                FREE (resolved_till);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        return parent;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-static inline void</div><div class='del'>-libgf_client_update_resolved (const char *path, char *resolved)</div><div class='del'>-{</div><div class='del'>-        int32_t pathlen = 0;</div><div class='del'>-        char *tmp = NULL, *dest = NULL, *dname = NULL;</div><div class='del'>-        char append_slash = 0;</div><div class='del'>-</div><div class='del'>-        pathlen = strlen (resolved); </div><div class='del'>-        tmp = (char *)(resolved + pathlen);</div><div class='del'>-        if (*((char *) (resolved + pathlen - 1)) != '/') {</div><div class='del'>-                tmp[0] = '/';</div><div class='del'>-                append_slash = 1;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (append_slash) {</div><div class='del'>-                dest = tmp + 1;</div><div class='del'>-        } else {</div><div class='del'>-                dest = tmp;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (*((char *) path + pathlen) == '/') {</div><div class='del'>-                dname = (char *) path + pathlen + 1;</div><div class='del'>-        } else {</div><div class='del'>-                dname = (char *) path + pathlen;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        strcpy_till (dest, dname, '/');</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-/* __do_path_resolve - resolve @loc-&gt;path into @loc-&gt;inode and @loc-&gt;parent. also</div><div class='del'>- *                     update the dentry cache</div><div class='del'>- *</div><div class='del'>- * @loc             - loc to resolve. </div><div class='del'>- * @ctx             - libglusterfsclient context</div><div class='del'>- * @lookup_basename - flag whether to lookup basename(loc-&gt;path)</div><div class='del'>- *</div><div class='del'>- * return - 0 on success</div><div class='del'>- *         -1 on failure </div><div class='del'>- *          </div><div class='del'>- */</div><div class='del'>-static int32_t</div><div class='del'>-__do_path_resolve (loc_t *loc, libglusterfs_client_ctx_t *ctx,</div><div class='del'>-                   char lookup_basename)</div><div class='del'>-{</div><div class='del'>-        int32_t         op_ret = -1;</div><div class='del'>-        char           *resolved  = NULL;</div><div class='del'>-        inode_t        *parent = NULL, *inode = NULL;</div><div class='del'>-        dentry_t       *dentry = NULL;</div><div class='del'>-        loc_t          new_loc = {0, };</div><div class='del'>-	char           *pathname = NULL, *directory = NULL;</div><div class='del'>-	char           *file = NULL;   </div><div class='del'>-        </div><div class='del'>-        parent = loc-&gt;parent;</div><div class='del'>-        if (parent) {</div><div class='del'>-                inode_ref (parent);</div><div class='del'>-                gf_log ("libglusterfsclient-dentry", GF_LOG_DEBUG,</div><div class='del'>-                        "loc-&gt;parent(%"PRId64") already present. sending "</div><div class='del'>-                        "lookup for %"PRId64"/%s", parent-&gt;ino, parent-&gt;ino,</div><div class='del'>-                        loc-&gt;path);</div><div class='del'>-                resolved = strdup (loc-&gt;path);</div><div class='del'>-                resolved = dirname (resolved);</div><div class='del'>-        } else {</div><div class='del'>-                parent = __libgf_client_path_to_parenti (ctx, ctx-&gt;itable,</div><div class='del'>-                                                         loc-&gt;path, &amp;resolved);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (parent == NULL) {</div><div class='del'>-                /* fire in the bush.. run! run!! run!!! */</div><div class='del'>-                gf_log ("libglusterfsclient-dentry",</div><div class='del'>-                        GF_LOG_CRITICAL,</div><div class='del'>-                        "failed to get parent inode number");</div><div class='del'>-                op_ret = -1;</div><div class='del'>-                goto out;</div><div class='del'>-        }               </div><div class='del'>-</div><div class='del'>-        gf_log ("libglusterfsclient-dentry",</div><div class='del'>-                GF_LOG_DEBUG,</div><div class='del'>-                "resolved path(%s) till %"PRId64"(%s). "</div><div class='del'>-                "sending lookup for remaining path",</div><div class='del'>-                loc-&gt;path, parent-&gt;ino, resolved);</div><div class='del'>-</div><div class='del'>-	pathname = strdup (loc-&gt;path);</div><div class='del'>-	directory = dirname (pathname);</div><div class='del'>-        pathname = NULL;</div><div class='del'>-</div><div class='del'>-        while (strcmp (resolved, directory) != 0) </div><div class='del'>-        {</div><div class='del'>-                dentry = NULL;</div><div class='del'>-</div><div class='del'>-                LIBGLUSTERFS_CLIENT_DENTRY_LOC_PREPARE (new_loc, loc, parent,</div><div class='del'>-                                                        resolved);</div><div class='del'>-</div><div class='del'>-		if (pathname) {</div><div class='del'>-			free (pathname);</div><div class='del'>-			pathname = NULL;</div><div class='del'>-		}</div><div class='del'>-</div><div class='del'>-		pathname = strdup (new_loc.path);</div><div class='del'>-		file = basename (pathname);</div><div class='del'>-</div><div class='del'>-                new_loc.inode = inode_search (ctx-&gt;itable, parent-&gt;ino, file);</div><div class='del'>-                if (new_loc.inode) {</div><div class='del'>-                        if (libgf_is_iattr_cache_valid (ctx, new_loc.inode,</div><div class='del'>-                                                        NULL,</div><div class='del'>-                                                        LIBGF_VALIDATE_LOOKUP))</div><div class='del'>-                                dentry = dentry_search_for_inode (new_loc.inode,</div><div class='del'>-                                                                  parent-&gt;ino,</div><div class='del'>-                                                                  file);</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                if (dentry == NULL) {</div><div class='del'>-                        op_ret = libgf_client_lookup (ctx, &amp;new_loc, NULL, NULL,</div><div class='del'>-                                                      0);</div><div class='del'>-                        if (op_ret == -1) {</div><div class='del'>-                                inode_ref (new_loc.parent);</div><div class='del'>-                                libgf_client_loc_wipe (&amp;new_loc);</div><div class='del'>-                                goto out;</div><div class='del'>-                        }</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                parent = inode_ref (new_loc.inode);</div><div class='del'>-                libgf_client_loc_wipe (&amp;new_loc);</div><div class='del'>-</div><div class='del'>-                libgf_client_update_resolved (loc-&gt;path, resolved);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-	if (pathname) {</div><div class='del'>-		free (pathname);</div><div class='del'>-		pathname = NULL;</div><div class='del'>-	} </div><div class='del'>-</div><div class='del'>-        if (lookup_basename) {</div><div class='del'>-                pathname = strdup (loc-&gt;path);</div><div class='del'>-                file = basename (pathname);</div><div class='del'>-</div><div class='del'>-                inode = inode_search (ctx-&gt;itable, parent-&gt;ino, file);</div><div class='del'>-                if (!inode) {</div><div class='del'>-                        libgf_client_loc_fill (&amp;new_loc, ctx, 0, parent-&gt;ino,</div><div class='del'>-                                               file);</div><div class='del'>-</div><div class='del'>-                        op_ret = libgf_client_lookup (ctx, &amp;new_loc, NULL, NULL,</div><div class='del'>-                                                      0);</div><div class='del'>-                        if (op_ret == -1) {</div><div class='del'>-                                libgf_client_loc_wipe (&amp;new_loc);</div><div class='del'>-                                goto out;</div><div class='del'>-                        }</div><div class='del'>-                </div><div class='del'>-                        inode = inode_ref (new_loc.inode);</div><div class='del'>-                        libgf_client_loc_wipe (&amp;new_loc);</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        op_ret = 0;</div><div class='del'>-out:</div><div class='del'>-        loc-&gt;inode = inode;</div><div class='del'>-        loc-&gt;parent = parent;</div><div class='del'>-</div><div class='del'>-        FREE (resolved);</div><div class='del'>-	if (pathname) {</div><div class='del'>-		FREE (pathname);</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	if (directory) {</div><div class='del'>-		FREE (directory);</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-        return op_ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-/* resolves loc-&gt;path to loc-&gt;parent and loc-&gt;inode */</div><div class='del'>-int32_t</div><div class='del'>-libgf_client_path_lookup (loc_t *loc,</div><div class='del'>-                          libglusterfs_client_ctx_t *ctx,</div><div class='del'>-                          char lookup_basename)</div><div class='del'>-{</div><div class='del'>-        char       *pathname  = NULL;</div><div class='del'>-        char       *directory = NULL;</div><div class='del'>-        inode_t    *inode = NULL;</div><div class='del'>-        inode_t    *parent = NULL;</div><div class='del'>-        int32_t     op_ret = 0;</div><div class='del'>-</div><div class='del'>-        pathname  = strdup (loc-&gt;path);</div><div class='del'>-        directory = dirname (pathname);</div><div class='del'>-        parent = inode_from_path (ctx-&gt;itable, directory);</div><div class='del'>-</div><div class='del'>-        if (parent != NULL) {</div><div class='del'>-                loc-&gt;parent = parent;</div><div class='del'>-</div><div class='del'>-                if (!lookup_basename) {</div><div class='del'>-                        gf_log ("libglusterfsclient",</div><div class='del'>-                                GF_LOG_DEBUG,</div><div class='del'>-                                "resolved dirname(%s) to %"PRId64,</div><div class='del'>-                                loc-&gt;path, parent-&gt;ino);</div><div class='del'>-                        goto out;</div><div class='del'>-                } else {</div><div class='del'>-                        inode = inode_from_path (ctx-&gt;itable, loc-&gt;path);</div><div class='del'>-                        if (inode != NULL) {</div><div class='del'>-                                gf_log ("libglusterfsclient",</div><div class='del'>-                                        GF_LOG_DEBUG,</div><div class='del'>-                                        "resolved path(%s) to %"PRId64"/%"PRId64,</div><div class='del'>-                                        loc-&gt;path, parent-&gt;ino, inode-&gt;ino);</div><div class='del'>-                                loc-&gt;inode = inode;</div><div class='del'>-                                goto out;</div><div class='del'>-                        }</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (parent) {</div><div class='del'>-                inode_unref (parent);</div><div class='del'>-        } else if (inode) {</div><div class='del'>-                inode_unref (inode);</div><div class='del'>-                gf_log ("libglusterfsclient",</div><div class='del'>-                        GF_LOG_ERROR,</div><div class='del'>-                        "undesired behaviour. inode(%"PRId64") for %s "</div><div class='del'>-                        "exists without parent (%s)",</div><div class='del'>-                        inode-&gt;ino, loc-&gt;path, directory);</div><div class='del'>-        }</div><div class='del'>-        op_ret = __do_path_resolve (loc, ctx, lookup_basename);</div><div class='del'>-out:    </div><div class='del'>-        if (pathname)</div><div class='del'>-                free (pathname);</div><div class='del'>-</div><div class='del'>-        return op_ret;</div><div class='del'>-}</div><div class='head'>diff --git a/libglusterfsclient/src/libglusterfsclient-internals.h b/libglusterfsclient/src/libglusterfsclient-internals.h<br/>deleted file mode 100755<br/>index ed62f397f60..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/libglusterfsclient/src/libglusterfsclient-internals.h?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfsclient/src/libglusterfsclient-internals.h</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,298 +0,0 @@</div><div class='del'>-/*</div><div class='del'>-   Copyright (c) 2008-2009 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='del'>-   This file is part of GlusterFS.</div><div class='del'>-</div><div class='del'>-   GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-   it under the terms of the GNU General Public License as published</div><div class='del'>-   by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-   or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-   GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-   WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-   General Public License for more details.</div><div class='del'>-</div><div class='del'>-   You should have received a copy of the GNU General Public License</div><div class='del'>-   along with this program.  If not, see</div><div class='del'>-   &lt;http://www.gnu.org/licenses/&gt;.</div><div class='del'>-*/</div><div class='del'>-</div><div class='del'>-#ifndef __LIBGLUSTERFSCLIENT_INTERNALS_H</div><div class='del'>-#define __LIBGLUSTERFSCLIENT_INTERNALS_H</div><div class='del'>-</div><div class='del'>-#include &lt;glusterfs.h&gt;</div><div class='del'>-#include &lt;logging.h&gt;</div><div class='del'>-#include &lt;inode.h&gt;</div><div class='del'>-#include &lt;pthread.h&gt;</div><div class='del'>-#include &lt;stack.h&gt;</div><div class='del'>-#include &lt;list.h&gt;</div><div class='del'>-#include &lt;signal.h&gt;</div><div class='del'>-#include &lt;call-stub.h&gt;</div><div class='del'>-#include &lt;sys/time.h&gt;</div><div class='del'>-#include &lt;sys/resource.h&gt;</div><div class='del'>-#include &lt;fd.h&gt;</div><div class='del'>-#include &lt;dirent.h&gt;</div><div class='del'>-</div><div class='del'>-#define LIBGF_IOBUF_SIZE        (128 *GF_UNIT_KB)</div><div class='del'>-typedef void (*sighandler_t) (int);</div><div class='del'>-typedef struct list_head list_head_t;</div><div class='del'>-</div><div class='del'>-typedef struct libglusterfs_client_ctx {</div><div class='del'>-        glusterfs_ctx_t gf_ctx;</div><div class='del'>-        inode_table_t *itable;</div><div class='del'>-        pthread_t reply_thread;</div><div class='del'>-        call_pool_t pool;</div><div class='del'>-        uint32_t counter;</div><div class='del'>-        time_t lookup_timeout;</div><div class='del'>-        time_t stat_timeout;</div><div class='del'>-        /* We generate a fake fsid for the subvolume being</div><div class='del'>-         * accessed through this context.</div><div class='del'>-         */</div><div class='del'>-        dev_t fake_fsid;</div><div class='del'>-        pid_t pid;</div><div class='del'>-}libglusterfs_client_ctx_t;</div><div class='del'>-</div><div class='del'>-typedef struct signal_handler {</div><div class='del'>-        int signo;</div><div class='del'>-        sighandler_t handler;</div><div class='del'>-        list_head_t next;</div><div class='del'>-}libgf_client_signal_handler_t ;</div><div class='del'>-</div><div class='del'>-typedef struct {</div><div class='del'>-        pthread_mutex_t lock;</div><div class='del'>-        pthread_cond_t reply_cond;</div><div class='del'>-        call_stub_t *reply_stub;</div><div class='del'>-        char complete;</div><div class='del'>-        union {</div><div class='del'>-                struct {</div><div class='del'>-                        char is_revalidate;</div><div class='del'>-                        loc_t *loc;</div><div class='del'>-                        int32_t size;</div><div class='del'>-                } lookup;</div><div class='del'>-        }fop;</div><div class='del'>-        fd_t *fd;          /* Needed here because we need a ref to the dir</div><div class='del'>-                              fd in the libgf_client_readdir_cbk in order</div><div class='del'>-                              to process the dirents received, without</div><div class='del'>-                              having them added to the reply stub.</div><div class='del'>-                              Also used in updating iattr cache. See</div><div class='del'>-                              readv_cbk for eg.</div><div class='del'>-                              */</div><div class='del'>-}libgf_client_local_t;</div><div class='del'>-</div><div class='del'>-typedef struct {</div><div class='del'>-        pthread_cond_t init_con_established;</div><div class='del'>-        pthread_mutex_t lock;</div><div class='del'>-        char complete;</div><div class='del'>-}libglusterfs_client_private_t;</div><div class='del'>-</div><div class='del'>-typedef struct {</div><div class='del'>-        pthread_mutex_t lock;</div><div class='del'>-        uint32_t previous_lookup_time;</div><div class='del'>-        uint32_t previous_stat_time;</div><div class='del'>-        struct iatt stbuf;</div><div class='del'>-} libglusterfs_client_inode_ctx_t;</div><div class='del'>-</div><div class='del'>-/* Our dirent cache is very simplistic when it comes to directory</div><div class='del'>- * reading workloads. It assumes that all directory traversal operations happen</div><div class='del'>- * sequentially and that readdir callers dont go jumping around the directory</div><div class='del'>- * using seekdir, rewinddir. Thats why you'll notice that seekdir, rewinddir</div><div class='del'>- * API in libglusterfsclient only set the offset. The consequence is that when</div><div class='del'>- * libgf_dcache_readdir finds that the offset presented to it, is not</div><div class='del'>- * the same as the offset of the previous dirent returned by dcache (..stored</div><div class='del'>- * in struct direntcache-&gt;prev_off..), it realises that a non-sequential</div><div class='del'>- * directory read is in progress and returns 0 to signify that the cache is</div><div class='del'>- * not valid.</div><div class='del'>- * This could be made a bit more intelligent by using a data structure like</div><div class='del'>- * a hash-table or a balanced binary tree that allows us to search for the</div><div class='del'>- * existence of particular offsets in the cache without performing a list or</div><div class='del'>- * array traversal.</div><div class='del'>- * Dont use a simple binary search tree because</div><div class='del'>- * there is no guarantee that offsets in a sequential reading of the directory</div><div class='del'>- * will be just random integers. If for some reason they are sequential, a BST</div><div class='del'>- * will end up becoming a list.</div><div class='del'>- */</div><div class='del'>-struct direntcache {</div><div class='del'>-        gf_dirent_t entries;            /* Head of list of cached dirents. */</div><div class='del'>-        gf_dirent_t *next;              /* Pointer to the next entry that</div><div class='del'>-                                         * should be sent by readdir */</div><div class='del'>-        uint64_t prev_off;              /* Offset where the next read will</div><div class='del'>-                                         * happen.</div><div class='del'>-                                         */</div><div class='del'>-};</div><div class='del'>-</div><div class='del'>-typedef struct {</div><div class='del'>-        pthread_mutex_t lock;</div><div class='del'>-        off_t offset;</div><div class='del'>-        libglusterfs_client_ctx_t *ctx;</div><div class='del'>-        /* `man readdir` says readdir is non-re-entrant</div><div class='del'>-         * only if two readdirs are racing on the same</div><div class='del'>-         * handle.</div><div class='del'>-         */</div><div class='del'>-	struct dirent dirp;</div><div class='del'>-        struct direntcache *dcache;</div><div class='del'>-        char   vpath[PATH_MAX]; </div><div class='del'>-} libglusterfs_client_fd_ctx_t;</div><div class='del'>-</div><div class='del'>-typedef struct libglusterfs_client_async_local {</div><div class='del'>-        void *cbk_data;</div><div class='del'>-        union {</div><div class='del'>-                struct {</div><div class='del'>-                        fd_t *fd;</div><div class='del'>-                        glusterfs_readv_cbk_t cbk;</div><div class='del'>-                        char update_offset;</div><div class='del'>-                }readv_cbk;</div><div class='del'>-    </div><div class='del'>-                struct {</div><div class='del'>-                        fd_t *fd;</div><div class='del'>-                        glusterfs_write_cbk_t cbk;</div><div class='del'>-                }write_cbk;</div><div class='del'>-</div><div class='del'>-                struct {</div><div class='del'>-                        fd_t *fd;</div><div class='del'>-                }close_cbk;</div><div class='del'>-</div><div class='del'>-                struct {</div><div class='del'>-                        void *buf;</div><div class='del'>-                        size_t size;</div><div class='del'>-                        loc_t *loc;</div><div class='del'>-                        char is_revalidate;</div><div class='del'>-                        glusterfs_get_cbk_t cbk;</div><div class='del'>-                }lookup_cbk;</div><div class='del'>-        }fop;</div><div class='del'>-}libglusterfs_client_async_local_t;</div><div class='del'>-</div><div class='del'>-#define LIBGF_STACK_WIND_AND_WAIT(frame, rfn, obj, fn, params ...)      \</div><div class='del'>-        do {                                                            \</div><div class='del'>-                STACK_WIND (frame, rfn, obj, fn, params);               \</div><div class='del'>-                pthread_mutex_lock (&amp;local-&gt;lock);                      \</div><div class='del'>-                {                                                       \</div><div class='del'>-                        while (!local-&gt;complete) {                      \</div><div class='del'>-                                pthread_cond_wait (&amp;local-&gt;reply_cond,  \</div><div class='del'>-                                                   &amp;local-&gt;lock);       \</div><div class='del'>-                        }                                               \</div><div class='del'>-                }                                                       \</div><div class='del'>-                pthread_mutex_unlock (&amp;local-&gt;lock);                    \</div><div class='del'>-        } while (0)</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-#define LIBGF_CLIENT_SIGNAL(signal_handler_list, signo, handler)        \</div><div class='del'>-        do {                                                            \</div><div class='del'>-                libgf_client_signal_handler_t *libgf_handler = CALLOC (1, \</div><div class='del'>-                                                    sizeof (*libgf_handler)); \</div><div class='del'>-                ERR_ABORT (libgf_handler);                              \</div><div class='del'>-                libgf_handler-&gt;signo = signo;                           \</div><div class='del'>-                libgf_handler-&gt;handler = signal (signo, handler);       \</div><div class='del'>-                list_add (&amp;libgf_handler-&gt;next, signal_handler_list);   \</div><div class='del'>-        } while (0)                                                           </div><div class='del'>-</div><div class='del'>-#define LIBGF_INSTALL_SIGNAL_HANDLERS(signal_handlers)                  \</div><div class='del'>-        do {                                                            \</div><div class='del'>-                INIT_LIST_HEAD (&amp;signal_handlers);                      \</div><div class='del'>-                /* Handle SIGABORT and SIGSEGV */                       \</div><div class='del'>-                LIBGF_CLIENT_SIGNAL (&amp;signal_handlers, SIGSEGV, gf_print_trace); \</div><div class='del'>-                LIBGF_CLIENT_SIGNAL (&amp;signal_handlers, SIGABRT, gf_print_trace); \</div><div class='del'>-                LIBGF_CLIENT_SIGNAL (&amp;signal_handlers, SIGHUP, gf_log_logrotate); \</div><div class='del'>-                /* LIBGF_CLIENT_SIGNAL (SIGTERM, glusterfs_cleanup_and_exit); */ \</div><div class='del'>-        } while (0)</div><div class='del'>-</div><div class='del'>-#define LIBGF_RESTORE_SIGNAL_HANDLERS(local)                            \</div><div class='del'>-        do {                                                            \</div><div class='del'>-                libgf_client_signal_handler_t *ptr = NULL, *tmp = NULL; \</div><div class='del'>-                list_for_each_entry_safe (ptr, tmp, &amp;local-&gt;signal_handlers,\</div><div class='del'>-                                          next) {                       \</div><div class='del'>-                        signal (ptr-&gt;signo, ptr-&gt;handler);              \</div><div class='del'>-                        FREE (ptr);                                     \</div><div class='del'>-                }                                                       \</div><div class='del'>-        } while (0)                                       </div><div class='del'>-</div><div class='del'>-#define LIBGF_CLIENT_FOP_ASYNC(ctx, local, ret_fn, op, args ...)        \</div><div class='del'>-        do {                                                            \</div><div class='del'>-                call_frame_t *frame = get_call_frame_for_req (ctx, 1);  \</div><div class='del'>-                xlator_t *xl = frame-&gt;this-&gt;children ?                  \</div><div class='del'>-                        frame-&gt;this-&gt;children-&gt;xlator : NULL;           \</div><div class='del'>-                frame-&gt;root-&gt;state = ctx;                               \</div><div class='del'>-                frame-&gt;local = local;                                   \</div><div class='del'>-                STACK_WIND (frame, ret_fn, xl, xl-&gt;fops-&gt;op, args);     \</div><div class='del'>-        } while (0)</div><div class='del'>-</div><div class='del'>-#define LIBGF_CLIENT_FOP(ctx, stub, op, local, args ...)                \</div><div class='del'>-        do {                                                            \</div><div class='del'>-                call_frame_t *frame = get_call_frame_for_req (ctx, 1);  \</div><div class='del'>-                xlator_t *xl = frame-&gt;this-&gt;children ?                  \</div><div class='del'>-                        frame-&gt;this-&gt;children-&gt;xlator : NULL;           \</div><div class='del'>-                if (!local) {                                           \</div><div class='del'>-                        local = CALLOC (1, sizeof (*local));            \</div><div class='del'>-                }                                                       \</div><div class='del'>-                ERR_ABORT (local);                                      \</div><div class='del'>-                frame-&gt;local = local;                                   \</div><div class='del'>-                frame-&gt;root-&gt;state = ctx;                               \</div><div class='del'>-                pthread_cond_init (&amp;local-&gt;reply_cond, NULL);           \</div><div class='del'>-                pthread_mutex_init (&amp;local-&gt;lock, NULL);                \</div><div class='del'>-                LIBGF_STACK_WIND_AND_WAIT (frame, libgf_client_##op##_cbk, xl, \</div><div class='del'>-                                           xl-&gt;fops-&gt;op, args);         \</div><div class='del'>-                stub = local-&gt;reply_stub;                               \</div><div class='del'>-                FREE (frame-&gt;local);                                    \</div><div class='del'>-                frame-&gt;local = NULL;                                    \</div><div class='del'>-                STACK_DESTROY (frame-&gt;root);                            \</div><div class='del'>-        } while (0)</div><div class='del'>-</div><div class='del'>-#define LIBGF_REPLY_NOTIFY(local)                                       \</div><div class='del'>-        do {                                                            \</div><div class='del'>-                pthread_mutex_lock (&amp;local-&gt;lock);                      \</div><div class='del'>-                {                                                       \</div><div class='del'>-                        local-&gt;complete = 1;                            \</div><div class='del'>-                        pthread_cond_broadcast (&amp;local-&gt;reply_cond);    \</div><div class='del'>-                }                                                       \</div><div class='del'>-                pthread_mutex_unlock (&amp;local-&gt;lock);                    \</div><div class='del'>-        } while (0)</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-void</div><div class='del'>-libgf_client_loc_wipe (loc_t *loc);</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-libgf_client_loc_fill (loc_t *loc,</div><div class='del'>-                       libglusterfs_client_ctx_t *ctx,</div><div class='del'>-                       ino_t ino,</div><div class='del'>-                       ino_t par,</div><div class='del'>-                       const char *name);</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-libgf_client_path_lookup (loc_t *loc,</div><div class='del'>-                          libglusterfs_client_ctx_t *ctx,</div><div class='del'>-                          char lookup_basename);</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-libgf_client_lookup (libglusterfs_client_ctx_t *ctx,</div><div class='del'>-                     loc_t *loc,</div><div class='del'>-                     struct iatt *stbuf,</div><div class='del'>-                     dict_t **dict,</div><div class='del'>-                     dict_t *xattr_req);</div><div class='del'>-</div><div class='del'>-/* We're not expecting more than 10-15</div><div class='del'>- * VMPs per process so a list is acceptable.</div><div class='del'>- */</div><div class='del'>-struct vmp_entry {</div><div class='del'>-        struct list_head list;</div><div class='del'>-        char * vmp;</div><div class='del'>-        int vmplen;</div><div class='del'>-        glusterfs_handle_t handle;</div><div class='del'>-};</div><div class='del'>-</div><div class='del'>-#define LIBGF_UPDATE_LOOKUP     0x1</div><div class='del'>-#define LIBGF_UPDATE_STAT       0x2</div><div class='del'>-#define LIBGF_UPDATE_ALL        (LIBGF_UPDATE_LOOKUP | LIBGF_UPDATE_STAT)</div><div class='del'>-</div><div class='del'>-#define LIBGF_VALIDATE_LOOKUP  0x1</div><div class='del'>-#define LIBGF_VALIDATE_STAT     0x2</div><div class='del'>-</div><div class='del'>-#define LIBGF_INVALIDATE_LOOKUP  0x1</div><div class='del'>-#define LIBGF_INVALIDATE_STAT     0x2</div><div class='del'>-int</div><div class='del'>-libgf_is_iattr_cache_valid (libglusterfs_client_ctx_t *ctx, inode_t *inode,</div><div class='del'>-                            struct iatt *sbuf, int flags);</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-libgf_update_iattr_cache (inode_t *inode, int flags, struct iatt *buf);</div><div class='del'>-</div><div class='del'>-#endif</div><div class='head'>diff --git a/libglusterfsclient/src/libglusterfsclient.c b/libglusterfsclient/src/libglusterfsclient.c<br/>deleted file mode 100755<br/>index 61ca2d1e0f8..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/libglusterfsclient/src/libglusterfsclient.c?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfsclient/src/libglusterfsclient.c</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,8169 +0,0 @@</div><div class='del'>-/*</div><div class='del'>-  Copyright (c) 2008-2009 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='del'>-  This file is part of GlusterFS.</div><div class='del'>-</div><div class='del'>-  GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-  it under the terms of the GNU General Public License as published</div><div class='del'>-  by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-  or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-  GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-  WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-  General Public License for more details.</div><div class='del'>-</div><div class='del'>-  You should have received a copy of the GNU General Public License</div><div class='del'>-  along with this program.  If not, see</div><div class='del'>-  &lt;http://www.gnu.org/licenses/&gt;.</div><div class='del'>-*/</div><div class='del'>-</div><div class='del'>-#ifndef _GNU_SOURCE</div><div class='del'>-#define _GNU_SOURCE</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-#include &lt;stdio.h&gt;</div><div class='del'>-#include &lt;errno.h&gt;</div><div class='del'>-#include &lt;libgen.h&gt;</div><div class='del'>-#include &lt;stddef.h&gt;</div><div class='del'>-</div><div class='del'>-#include &lt;sys/time.h&gt;</div><div class='del'>-#include &lt;sys/types.h&gt;</div><div class='del'>-#include &lt;sys/stat.h&gt;</div><div class='del'>-#ifdef GF_SOLARIS_HOST_OS</div><div class='del'>-#include &lt;sys/statfs.h&gt;</div><div class='del'>-#endif</div><div class='del'>-#include &lt;unistd.h&gt;</div><div class='del'>-#include &lt;xlator.h&gt;</div><div class='del'>-#include &lt;timer.h&gt;</div><div class='del'>-#include "defaults.h"</div><div class='del'>-#include &lt;time.h&gt;</div><div class='del'>-#include &lt;poll.h&gt;</div><div class='del'>-#include "transport.h"</div><div class='del'>-#include "event.h"</div><div class='del'>-#include "libglusterfsclient.h"</div><div class='del'>-#include "libglusterfsclient-internals.h"</div><div class='del'>-#include "compat.h"</div><div class='del'>-#include "compat-errno.h"</div><div class='del'>-#ifndef GF_SOLARIS_HOST_OS</div><div class='del'>-#include &lt;sys/vfs.h&gt;</div><div class='del'>-#endif</div><div class='del'>-#include &lt;utime.h&gt;</div><div class='del'>-#include &lt;sys/param.h&gt;</div><div class='del'>-#include &lt;list.h&gt;</div><div class='del'>-#include &lt;stdarg.h&gt;</div><div class='del'>-#include &lt;sys/statvfs.h&gt;</div><div class='del'>-#include "hashfn.h"</div><div class='del'>-#include &lt;sys/select.h&gt;</div><div class='del'>-</div><div class='del'>-#define LIBGF_XL_NAME "libglusterfsclient"</div><div class='del'>-#define LIBGLUSTERFS_INODE_TABLE_LRU_LIMIT 1000 //14057</div><div class='del'>-#define LIBGF_SENDFILE_BLOCK_SIZE 4096</div><div class='del'>-#define LIBGF_READDIR_BLOCK     4096</div><div class='del'>-#define libgf_path_absolute(path) ((path)[0] == '/')</div><div class='del'>-</div><div class='del'>-static inline xlator_t *</div><div class='del'>-libglusterfs_graph (xlator_t *graph);</div><div class='del'>-int32_t libgf_client_readlink (libglusterfs_client_ctx_t *ctx, loc_t *loc,</div><div class='del'>-                                        char *buf, size_t bufsize);</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-libgf_realpath_loc_fill (libglusterfs_client_ctx_t *ctx, char *link,</div><div class='del'>-                         loc_t *targetloc);</div><div class='del'>-static int first_init = 1;</div><div class='del'>-</div><div class='del'>-/* The global list of virtual mount points */</div><div class='del'>-struct {</div><div class='del'>-        struct list_head list;</div><div class='del'>-        int              entries;</div><div class='del'>-}vmplist;</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-/* Protects the VMP list above. */</div><div class='del'>-pthread_mutex_t vmplock = PTHREAD_MUTEX_INITIALIZER;</div><div class='del'>-</div><div class='del'>-/* Ensures only one thread is ever calling glusterfs_mount.</div><div class='del'>- * Since that function internally calls routines which</div><div class='del'>- * use the yacc parser code using global vars, this process</div><div class='del'>- * needs to be syncronised.</div><div class='del'>- */</div><div class='del'>-pthread_mutex_t mountlock = PTHREAD_MUTEX_INITIALIZER;</div><div class='del'>-</div><div class='del'>-static char cwd[PATH_MAX];</div><div class='del'>-static char cwd_inited = 0;</div><div class='del'>-static pthread_mutex_t cwdlock   = PTHREAD_MUTEX_INITIALIZER;</div><div class='del'>-</div><div class='del'>-char *</div><div class='del'>-libgf_vmp_virtual_path (struct vmp_entry *entry, const char *path, char *vpath)</div><div class='del'>-{</div><div class='del'>-        char    *tmp = NULL;</div><div class='del'>-</div><div class='del'>-        tmp = ((char *)(path + (entry-&gt;vmplen-1)));</div><div class='del'>-        if (strlen (tmp) &gt; 0) {</div><div class='del'>-                if (tmp[0] != '/') {</div><div class='del'>-                        vpath[0] = '/';</div><div class='del'>-                        vpath[1] = '\0';</div><div class='del'>-                        strcat (&amp;vpath[1], tmp);</div><div class='del'>-                } else</div><div class='del'>-                        strcpy (vpath, tmp);</div><div class='del'>-        } else {</div><div class='del'>-                vpath[0] = '/';</div><div class='del'>-                vpath[1] = '\0';</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        return vpath;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-char *</div><div class='del'>-zr_build_process_uuid ()</div><div class='del'>-{</div><div class='del'>-	char           tmp_str[1024] = {0,};</div><div class='del'>-	char           hostname[256] = {0,};</div><div class='del'>-	struct timeval tv = {0,};</div><div class='del'>-	struct tm      now = {0, };</div><div class='del'>-	char           now_str[32];</div><div class='del'>-</div><div class='del'>-	if (-1 == gettimeofday(&amp;tv, NULL)) {</div><div class='del'>-		gf_log ("", GF_LOG_ERROR, </div><div class='del'>-			"gettimeofday: failed %s",</div><div class='del'>-			strerror (errno));		</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	if (-1 == gethostname (hostname, 256)) {</div><div class='del'>-		gf_log ("", GF_LOG_ERROR, </div><div class='del'>-			"gethostname: failed %s",</div><div class='del'>-			strerror (errno));</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	localtime_r (&amp;tv.tv_sec, &amp;now);</div><div class='del'>-	strftime (now_str, 32, "%Y/%m/%d-%H:%M:%S", &amp;now);</div><div class='del'>-	snprintf (tmp_str, 1024, "%s-%d-%s:%ld", </div><div class='del'>-		  hostname, getpid(), now_str, tv.tv_usec);</div><div class='del'>-	</div><div class='del'>-	return strdup (tmp_str);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-libgf_client_forget (xlator_t *this,</div><div class='del'>-		     inode_t *inode)</div><div class='del'>-{</div><div class='del'>-        uint64_t ptr = 0;</div><div class='del'>-	libglusterfs_client_inode_ctx_t *ctx = NULL;</div><div class='del'>-	</div><div class='del'>-	inode_ctx_del (inode, this, &amp;ptr);</div><div class='del'>-        ctx = (libglusterfs_client_inode_ctx_t *)(long) ptr;</div><div class='del'>-</div><div class='del'>-	FREE (ctx);</div><div class='del'>-</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-xlator_t *</div><div class='del'>-libgf_inode_to_xlator (inode_t *inode)</div><div class='del'>-{</div><div class='del'>-        if (!inode)</div><div class='del'>-                return NULL;</div><div class='del'>-</div><div class='del'>-        if (!inode-&gt;table)</div><div class='del'>-                return NULL;</div><div class='del'>-</div><div class='del'>-        if (!inode-&gt;table-&gt;xl)</div><div class='del'>-                return NULL;</div><div class='del'>-</div><div class='del'>-        if (!inode-&gt;table-&gt;xl-&gt;ctx)</div><div class='del'>-                return NULL;</div><div class='del'>-</div><div class='del'>-        return inode-&gt;table-&gt;xl-&gt;ctx-&gt;top;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-libglusterfs_client_fd_ctx_t *</div><div class='del'>-libgf_get_fd_ctx (fd_t *fd)</div><div class='del'>-{</div><div class='del'>-        uint64_t                        ctxaddr = 0;</div><div class='del'>-        libglusterfs_client_fd_ctx_t    *ctx = NULL;</div><div class='del'>-</div><div class='del'>-        GF_VALIDATE_OR_GOTO (LIBGF_XL_NAME, fd, out);</div><div class='del'>-</div><div class='del'>-        if (fd_ctx_get (fd, libgf_inode_to_xlator (fd-&gt;inode), &amp;ctxaddr) == -1)</div><div class='del'>-                goto out;</div><div class='del'>-</div><div class='del'>-        ctx = (libglusterfs_client_fd_ctx_t *)(long)ctxaddr;</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        return ctx;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-libglusterfs_client_fd_ctx_t *</div><div class='del'>-libgf_alloc_fd_ctx (libglusterfs_client_ctx_t *ctx, fd_t *fd, char *vpath)</div><div class='del'>-{</div><div class='del'>-        libglusterfs_client_fd_ctx_t    *fdctx = NULL;</div><div class='del'>-        uint64_t                        ctxaddr = 0;</div><div class='del'>-</div><div class='del'>-        fdctx = CALLOC (1, sizeof (*fdctx));</div><div class='del'>-        if (fdctx == NULL) {</div><div class='del'>-                gf_log (LIBGF_XL_NAME, GF_LOG_ERROR,</div><div class='del'>-                        "memory allocation failure");</div><div class='del'>-                fdctx = NULL;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        pthread_mutex_init (&amp;fdctx-&gt;lock, NULL);</div><div class='del'>-        fdctx-&gt;ctx = ctx;</div><div class='del'>-        ctxaddr = (uint64_t) (long)fdctx;</div><div class='del'>-</div><div class='del'>-        if (fd-&gt;inode) {</div><div class='del'>-                if (IA_ISDIR (fd-&gt;inode-&gt;ia_type)) {</div><div class='del'>-                        fdctx-&gt;dcache = CALLOC (1, sizeof (struct direntcache));</div><div class='del'>-                        if (fdctx-&gt;dcache)</div><div class='del'>-                                INIT_LIST_HEAD (&amp;fdctx-&gt;dcache-&gt;entries.list);</div><div class='del'>-                        /* If the calloc fails, we can still continue</div><div class='del'>-                         * working as the dcache is not required for correct</div><div class='del'>-                         * operation.</div><div class='del'>-                         */</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (vpath != NULL) {</div><div class='del'>-                strcpy (fdctx-&gt;vpath, vpath);</div><div class='del'>-                if (vpath[strlen(vpath) - 1] != '/') {</div><div class='del'>-                        strcat (fdctx-&gt;vpath, "/");</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        fd_ctx_set (fd, libgf_inode_to_xlator (fd-&gt;inode), ctxaddr);</div><div class='del'>-out:</div><div class='del'>-        return fdctx;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-libglusterfs_client_fd_ctx_t *</div><div class='del'>-libgf_del_fd_ctx (fd_t *fd)</div><div class='del'>-{</div><div class='del'>-        uint64_t                        ctxaddr = 0;</div><div class='del'>-        libglusterfs_client_fd_ctx_t    *ctx = NULL;</div><div class='del'>-</div><div class='del'>-        GF_VALIDATE_OR_GOTO (LIBGF_XL_NAME, fd, out);</div><div class='del'>-</div><div class='del'>-        if (fd_ctx_del (fd, libgf_inode_to_xlator (fd-&gt;inode) , &amp;ctxaddr) == -1)</div><div class='del'>-                goto out;</div><div class='del'>-</div><div class='del'>-        ctx = (libglusterfs_client_fd_ctx_t *)(long)ctxaddr;</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        return ctx;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-void</div><div class='del'>-libgf_dcache_invalidate (fd_t *fd)</div><div class='del'>-{</div><div class='del'>-        libglusterfs_client_fd_ctx_t    *fd_ctx = NULL;</div><div class='del'>-</div><div class='del'>-        if (!fd)</div><div class='del'>-                return;</div><div class='del'>-</div><div class='del'>-        fd_ctx = libgf_get_fd_ctx (fd);</div><div class='del'>-        if (!fd_ctx) {</div><div class='del'>-                gf_log (LIBGF_XL_NAME, GF_LOG_ERROR, "No fd context present");</div><div class='del'>-                errno = EBADF;</div><div class='del'>-                return;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (!fd_ctx-&gt;dcache) {</div><div class='del'>-                gf_log (LIBGF_XL_NAME, GF_LOG_ERROR, "No dcache present");</div><div class='del'>-                return;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (!list_empty (&amp;fd_ctx-&gt;dcache-&gt;entries.list))</div><div class='del'>-                gf_dirent_free (&amp;fd_ctx-&gt;dcache-&gt;entries);</div><div class='del'>-</div><div class='del'>-        INIT_LIST_HEAD (&amp;fd_ctx-&gt;dcache-&gt;entries.list);</div><div class='del'>-</div><div class='del'>-        fd_ctx-&gt;dcache-&gt;next = NULL;</div><div class='del'>-        fd_ctx-&gt;dcache-&gt;prev_off = 0;</div><div class='del'>-</div><div class='del'>-        return;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-/* The first entry in the entries is always a placeholder</div><div class='del'>- * or the list head. The real entries begin from entries-&gt;next.</div><div class='del'>- */</div><div class='del'>-int</div><div class='del'>-libgf_dcache_update (libglusterfs_client_ctx_t *ctx, fd_t *fd,</div><div class='del'>-                     gf_dirent_t *entries)</div><div class='del'>-{</div><div class='del'>-        libglusterfs_client_fd_ctx_t    *fd_ctx = NULL;</div><div class='del'>-        int                             op_ret = -1;</div><div class='del'>-</div><div class='del'>-        if ((!ctx) || (!fd) || (!entries)) {</div><div class='del'>-                errno = EINVAL;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        fd_ctx = libgf_get_fd_ctx (fd);</div><div class='del'>-        if (!fd_ctx) {</div><div class='del'>-                gf_log (LIBGF_XL_NAME, GF_LOG_ERROR, "No fd context present");</div><div class='del'>-                errno = EBADF;</div><div class='del'>-		goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        /* dcache is not enabled. */</div><div class='del'>-        if (!fd_ctx-&gt;dcache) {</div><div class='del'>-                gf_log (LIBGF_XL_NAME, GF_LOG_ERROR, "No dcache present");</div><div class='del'>-                op_ret = 0;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        /* If we're updating, we must begin with invalidating any previous</div><div class='del'>-         * entries.</div><div class='del'>-         */</div><div class='del'>-        libgf_dcache_invalidate (fd);</div><div class='del'>-</div><div class='del'>-        fd_ctx-&gt;dcache-&gt;next = entries-&gt;next;</div><div class='del'>-        /* We still need to store a pointer to the head</div><div class='del'>-         * so we start free'ing from the head when invalidation</div><div class='del'>-         * is required.</div><div class='del'>-         *</div><div class='del'>-         * Need to delink the entries from the list</div><div class='del'>-         * given to us by an underlying translators. Most translators will</div><div class='del'>-         * free this list after this call so we must preserve the dirents in</div><div class='del'>-         * order to cache them.</div><div class='del'>-         */</div><div class='del'>-        list_splice_init (&amp;entries-&gt;list, &amp;fd_ctx-&gt;dcache-&gt;entries.list);</div><div class='del'>-        op_ret = 0;</div><div class='del'>-out:</div><div class='del'>-        return op_ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-libgf_dcache_readdir (libglusterfs_client_ctx_t *ctx, fd_t *fd,</div><div class='del'>-                      struct dirent *dirp, off_t *offset)</div><div class='del'>-{</div><div class='del'>-        libglusterfs_client_fd_ctx_t    *fd_ctx = NULL;</div><div class='del'>-        int                             cachevalid = 0;</div><div class='del'>-</div><div class='del'>-        if ((!ctx) || (!fd) || (!dirp) || (!offset))</div><div class='del'>-                return 0;</div><div class='del'>-</div><div class='del'>-        fd_ctx = libgf_get_fd_ctx (fd);</div><div class='del'>-        if (!fd_ctx) {</div><div class='del'>-                gf_log (LIBGF_XL_NAME, GF_LOG_ERROR, "No fd context present");</div><div class='del'>-                errno = EBADF;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (!fd_ctx-&gt;dcache) {</div><div class='del'>-                gf_log (LIBGF_XL_NAME, GF_LOG_ERROR, "No dcache present");</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        /* We've either run out of entries in the cache</div><div class='del'>-         * or the cache is empty.</div><div class='del'>-         */</div><div class='del'>-        if (!fd_ctx-&gt;dcache-&gt;next) {</div><div class='del'>-                gf_log (LIBGF_XL_NAME, GF_LOG_TRACE, "No entries present");</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        /* The dirent list is created as a circular linked list</div><div class='del'>-         * so this check is needed to ensure, we dont start</div><div class='del'>-         * reading old entries again.</div><div class='del'>-         * If we're reached this situation, the cache is exhausted</div><div class='del'>-         * and we'll need to pre-fetch more entries to continue serving.</div><div class='del'>-         */</div><div class='del'>-        if (fd_ctx-&gt;dcache-&gt;next == &amp;fd_ctx-&gt;dcache-&gt;entries) {</div><div class='del'>-                gf_log (LIBGF_XL_NAME, GF_LOG_TRACE, "Entries exhausted");</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        /* During sequential reading we generally expect that the offset</div><div class='del'>-         * requested is the same as the offset we served in the previous call</div><div class='del'>-         * to readdir. But, seekdir, rewinddir and libgf_dcache_invalidate</div><div class='del'>-         * require special handling because seekdir/rewinddir change the offset</div><div class='del'>-         * in the fd_ctx and libgf_dcache_invalidate changes the prev_off.</div><div class='del'>-         */</div><div class='del'>-        if (*offset != fd_ctx-&gt;dcache-&gt;prev_off) {</div><div class='del'>-                /* For all cases of the if branch above, we know that the</div><div class='del'>-                 * cache is now invalid except for the case below. It handles</div><div class='del'>-                 * the case where the two offset values above are different</div><div class='del'>-                 * but different because the previous readdir block was</div><div class='del'>-                 * exhausted, resulting in a prev_off being set to 0 in</div><div class='del'>-                 * libgf_dcache_invalidate, while the requested offset is non</div><div class='del'>-                 * zero because that is what we returned for the last dirent</div><div class='del'>-                 * of the previous readdir block.</div><div class='del'>-                 */</div><div class='del'>-                if ((*offset != 0) &amp;&amp; (fd_ctx-&gt;dcache-&gt;prev_off == 0)) {</div><div class='del'>-                        gf_log (LIBGF_XL_NAME, GF_LOG_TRACE, "Entries"</div><div class='del'>-                                " exhausted");</div><div class='del'>-                        cachevalid = 1;</div><div class='del'>-                } else</div><div class='del'>-                        gf_log (LIBGF_XL_NAME, GF_LOG_TRACE, "Dcache"</div><div class='del'>-                                " invalidated previously");</div><div class='del'>-        } else</div><div class='del'>-                cachevalid = 1;</div><div class='del'>-</div><div class='del'>-        if (!cachevalid)</div><div class='del'>-                goto out;</div><div class='del'>-</div><div class='del'>-        dirp-&gt;d_ino = fd_ctx-&gt;dcache-&gt;next-&gt;d_ino;</div><div class='del'>-        strncpy (dirp-&gt;d_name, fd_ctx-&gt;dcache-&gt;next-&gt;d_name,</div><div class='del'>-                 fd_ctx-&gt;dcache-&gt;next-&gt;d_len);</div><div class='del'>-</div><div class='del'>-        *offset = fd_ctx-&gt;dcache-&gt;next-&gt;d_off;</div><div class='del'>-        dirp-&gt;d_off = *offset;</div><div class='del'>-        fd_ctx-&gt;dcache-&gt;prev_off = fd_ctx-&gt;dcache-&gt;next-&gt;d_off;</div><div class='del'>-        fd_ctx-&gt;dcache-&gt;next = fd_ctx-&gt;dcache-&gt;next-&gt;next;</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        return cachevalid;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-libgf_client_release (xlator_t *this,</div><div class='del'>-		      fd_t *fd)</div><div class='del'>-{</div><div class='del'>-	libglusterfs_client_fd_ctx_t *fd_ctx = NULL;</div><div class='del'>-        fd_ctx = libgf_get_fd_ctx (fd);</div><div class='del'>-        if (IA_ISDIR (fd-&gt;inode-&gt;ia_type)) {</div><div class='del'>-                libgf_dcache_invalidate (fd);</div><div class='del'>-                FREE (fd_ctx-&gt;dcache);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        libgf_del_fd_ctx (fd);</div><div class='del'>-        if (fd_ctx != NULL) {</div><div class='del'>-                pthread_mutex_destroy (&amp;fd_ctx-&gt;lock);</div><div class='del'>-                FREE (fd_ctx);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-libglusterfs_client_inode_ctx_t *</div><div class='del'>-libgf_get_inode_ctx (inode_t *inode)</div><div class='del'>-{</div><div class='del'>-        uint64_t                                ctxaddr = 0;</div><div class='del'>-        libglusterfs_client_inode_ctx_t         *ictx = NULL;</div><div class='del'>-</div><div class='del'>-        GF_VALIDATE_OR_GOTO (LIBGF_XL_NAME, inode, out);</div><div class='del'>-        if (inode_ctx_get (inode, libgf_inode_to_xlator (inode), &amp;ctxaddr) &lt; 0)</div><div class='del'>-                goto out;</div><div class='del'>-</div><div class='del'>-        ictx = (libglusterfs_client_inode_ctx_t *)(long)ctxaddr;</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        return ictx;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-libglusterfs_client_inode_ctx_t *</div><div class='del'>-libgf_del_inode_ctx (inode_t *inode)</div><div class='del'>-{</div><div class='del'>-        uint64_t                                ctxaddr = 0;</div><div class='del'>-        libglusterfs_client_inode_ctx_t         *ictx = NULL;</div><div class='del'>-</div><div class='del'>-        GF_VALIDATE_OR_GOTO (LIBGF_XL_NAME, inode, out);</div><div class='del'>-        if (inode_ctx_del (inode, libgf_inode_to_xlator (inode), &amp;ctxaddr) &lt; 0)</div><div class='del'>-                goto out;</div><div class='del'>-</div><div class='del'>-        ictx = (libglusterfs_client_inode_ctx_t *)(long)ctxaddr;</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        return ictx;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-libglusterfs_client_inode_ctx_t *</div><div class='del'>-libgf_alloc_inode_ctx (libglusterfs_client_ctx_t *ctx, inode_t *inode)</div><div class='del'>-{</div><div class='del'>-        uint64_t                                ctxaddr = 0;</div><div class='del'>-        libglusterfs_client_inode_ctx_t         *ictx = NULL;</div><div class='del'>-</div><div class='del'>-        GF_VALIDATE_OR_GOTO (LIBGF_XL_NAME, inode, out);</div><div class='del'>-        GF_VALIDATE_OR_GOTO (LIBGF_XL_NAME, ctx, out);</div><div class='del'>-        ictx = CALLOC (1, sizeof (*ictx));</div><div class='del'>-        if (ictx == NULL) {</div><div class='del'>-                gf_log (LIBGF_XL_NAME, GF_LOG_ERROR,</div><div class='del'>-                                "memory allocation failure");</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        pthread_mutex_init (&amp;ictx-&gt;lock, NULL);</div><div class='del'>-        ctxaddr = (uint64_t) (long)ictx;</div><div class='del'>-        if (inode_ctx_put (inode, libgf_inode_to_xlator (inode), ctxaddr) &lt; 0){</div><div class='del'>-                FREE (ictx);</div><div class='del'>-                ictx = NULL;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        return ictx;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-libgf_transform_iattr (libglusterfs_client_ctx_t *libctx, inode_t *inode,</div><div class='del'>-                       struct iatt *buf)</div><div class='del'>-{</div><div class='del'>-</div><div class='del'>-        if ((!libctx) || (!buf) || (!inode))</div><div class='del'>-                return -1;</div><div class='del'>-</div><div class='del'>-        buf-&gt;ia_dev = libctx-&gt;fake_fsid;</div><div class='del'>-        /* If the inode is root, the inode number must be 1 not the</div><div class='del'>-         * ino received from the file system.</div><div class='del'>-         */</div><div class='del'>-        if ((inode-&gt;ino == 1) &amp;&amp; (buf))</div><div class='del'>-                buf-&gt;ia_ino = 1;</div><div class='del'>-</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-libgf_update_iattr_cache (inode_t *inode, int flags, struct iatt *buf)</div><div class='del'>-{</div><div class='del'>-        libglusterfs_client_inode_ctx_t *inode_ctx = NULL;</div><div class='del'>-        time_t                          current = 0;</div><div class='del'>-        int                             op_ret = -1;</div><div class='del'>-</div><div class='del'>-        GF_VALIDATE_OR_GOTO (LIBGF_XL_NAME, inode, out);</div><div class='del'>-</div><div class='del'>-        inode_ctx = libgf_get_inode_ctx (inode);</div><div class='del'>-        if (!inode_ctx) {</div><div class='del'>-                gf_log (LIBGF_XL_NAME, GF_LOG_ERROR, "No inode context"</div><div class='del'>-                        " present");</div><div class='del'>-                errno = EINVAL;</div><div class='del'>-                op_ret = -1;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        pthread_mutex_lock (&amp;inode_ctx-&gt;lock);</div><div class='del'>-        {</div><div class='del'>-                /* Take a timestamp only after we've acquired the</div><div class='del'>-                 * lock.</div><div class='del'>-                 */</div><div class='del'>-                current = time (NULL);</div><div class='del'>-                if (flags &amp; LIBGF_UPDATE_LOOKUP) {</div><div class='del'>-                        gf_log (LIBGF_XL_NAME, GF_LOG_TRACE, "Updating lookup");</div><div class='del'>-                        inode_ctx-&gt;previous_lookup_time = current;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                if (flags &amp; LIBGF_UPDATE_STAT) {</div><div class='del'>-                        gf_log (LIBGF_XL_NAME, GF_LOG_TRACE, "Updating stat");</div><div class='del'>-</div><div class='del'>-                        /* Update the cached stat struct only if a new</div><div class='del'>-                         * stat buf is given.</div><div class='del'>-                         */</div><div class='del'>-                        if (buf != NULL) {</div><div class='del'>-                                inode_ctx-&gt;previous_stat_time = current;</div><div class='del'>-                                memcpy (&amp;inode_ctx-&gt;stbuf, buf,</div><div class='del'>-                                                sizeof (inode_ctx-&gt;stbuf));</div><div class='del'>-                        }</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='del'>-        pthread_mutex_unlock (&amp;inode_ctx-&gt;lock);</div><div class='del'>-        op_ret = 0;</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        return op_ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-libgf_invalidate_iattr_cache (inode_t *inode, int flags)</div><div class='del'>-{</div><div class='del'>-        libglusterfs_client_inode_ctx_t         *ictx = NULL;</div><div class='del'>-</div><div class='del'>-        if (!inode)</div><div class='del'>-                return -1;</div><div class='del'>-</div><div class='del'>-        ictx = libgf_get_inode_ctx (inode);</div><div class='del'>-        if (!ictx) {</div><div class='del'>-                gf_log (LIBGF_XL_NAME, GF_LOG_ERROR, "No inode context"</div><div class='del'>-                        " present");</div><div class='del'>-                return -1;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        pthread_mutex_lock (&amp;ictx-&gt;lock);</div><div class='del'>-        {</div><div class='del'>-                if (flags &amp; LIBGF_INVALIDATE_LOOKUP) {</div><div class='del'>-                        gf_log (LIBGF_XL_NAME, GF_LOG_TRACE, "Invalidating"</div><div class='del'>-                                " lookup");</div><div class='del'>-                        ictx-&gt;previous_lookup_time = 0;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                if (flags &amp; LIBGF_INVALIDATE_STAT) {</div><div class='del'>-                        gf_log (LIBGF_XL_NAME, GF_LOG_TRACE, "Invalidating"</div><div class='del'>-                                " stat");</div><div class='del'>-                        ictx-&gt;previous_stat_time = 0;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-        }</div><div class='del'>-        pthread_mutex_unlock (&amp;ictx-&gt;lock);</div><div class='del'>-</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-libgf_is_iattr_cache_valid (libglusterfs_client_ctx_t *ctx, inode_t *inode,</div><div class='del'>-                            struct iatt *sbuf, int flags)</div><div class='del'>-{</div><div class='del'>-        time_t                                  current = 0;</div><div class='del'>-        time_t                                  prev = 0;</div><div class='del'>-        libglusterfs_client_inode_ctx_t         *inode_ctx = NULL;</div><div class='del'>-        int                                     cache_valid = 0;</div><div class='del'>-        time_t                                  timeout = 0;</div><div class='del'>-</div><div class='del'>-        if (inode == NULL)</div><div class='del'>-                return 0;</div><div class='del'>-</div><div class='del'>-        inode_ctx = libgf_get_inode_ctx (inode);</div><div class='del'>-        if (!inode_ctx) {</div><div class='del'>-                gf_log (LIBGF_XL_NAME, GF_LOG_ERROR, "No inode context"</div><div class='del'>-                        " present\n");</div><div class='del'>-                return 0;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        pthread_mutex_lock (&amp;inode_ctx-&gt;lock);</div><div class='del'>-        {</div><div class='del'>-                current = time (NULL);</div><div class='del'>-                if (flags &amp; LIBGF_VALIDATE_LOOKUP) {</div><div class='del'>-                        gf_log (LIBGF_XL_NAME, GF_LOG_TRACE, "Checking lookup");</div><div class='del'>-                        prev = inode_ctx-&gt;previous_lookup_time;</div><div class='del'>-                        timeout = ctx-&gt;lookup_timeout;</div><div class='del'>-                } else {</div><div class='del'>-                        gf_log (LIBGF_XL_NAME, GF_LOG_TRACE, "Checking stat");</div><div class='del'>-                        prev = inode_ctx-&gt;previous_stat_time;</div><div class='del'>-                        timeout = ctx-&gt;stat_timeout;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                /* Even if the timeout is set to -1 to cache</div><div class='del'>-                 * infinitely, fops like write must invalidate the</div><div class='del'>-                 * stat cache because writev_cbk cannot update</div><div class='del'>-                 * the cache using the stat returned to it. This is</div><div class='del'>-                 * because write-behind can return a stat bufs filled</div><div class='del'>-                 * with zeroes.</div><div class='del'>-                 */</div><div class='del'>-                if (prev == 0) {</div><div class='del'>-                        cache_valid = 0;</div><div class='del'>-                        gf_log (LIBGF_XL_NAME, GF_LOG_TRACE, "Cache Invalid");</div><div class='del'>-                        goto iattr_unlock_out;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                /* Cache infinitely */</div><div class='del'>-                if (timeout == (time_t)-1) {</div><div class='del'>-                        cache_valid = 1;</div><div class='del'>-                        gf_log (LIBGF_XL_NAME, GF_LOG_TRACE, "Caching On and "</div><div class='del'>-                                "valid");</div><div class='del'>-                        goto iattr_unlock_out;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                /* Disable caching completely */</div><div class='del'>-                if (timeout == 0) {</div><div class='del'>-                        cache_valid = 0;</div><div class='del'>-                        gf_log (LIBGF_XL_NAME, GF_LOG_TRACE, "Cache disabled");</div><div class='del'>-                        goto iattr_unlock_out;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                if ((prev &gt; 0) &amp;&amp; (timeout &gt;= (current - prev))) {</div><div class='del'>-                        gf_log (LIBGF_XL_NAME, GF_LOG_TRACE, "Cache valid");</div><div class='del'>-                        cache_valid = 1;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                if (flags &amp; LIBGF_VALIDATE_LOOKUP)</div><div class='del'>-                        goto iattr_unlock_out;</div><div class='del'>-</div><div class='del'>-                if ((cache_valid) &amp;&amp; (sbuf))</div><div class='del'>-                        *sbuf = inode_ctx-&gt;stbuf;</div><div class='del'>-        }</div><div class='del'>-iattr_unlock_out:</div><div class='del'>-        pthread_mutex_unlock (&amp;inode_ctx-&gt;lock);</div><div class='del'>-</div><div class='del'>-        return cache_valid;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-libgf_client_releasedir (xlator_t *this,</div><div class='del'>-			 fd_t *fd)</div><div class='del'>-{</div><div class='del'>-	libglusterfs_client_fd_ctx_t *fd_ctx = NULL;</div><div class='del'>-        fd_ctx = libgf_get_fd_ctx (fd);</div><div class='del'>-        if (IA_ISDIR (fd-&gt;inode-&gt;ia_type)) {</div><div class='del'>-                libgf_dcache_invalidate (fd);</div><div class='del'>-                FREE (fd_ctx-&gt;dcache);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        libgf_del_fd_ctx (fd);</div><div class='del'>-        if (fd_ctx != NULL) {</div><div class='del'>-                pthread_mutex_destroy (&amp;fd_ctx-&gt;lock);</div><div class='del'>-                FREE (fd_ctx);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-void *poll_proc (void *ptr)</div><div class='del'>-{</div><div class='del'>-        glusterfs_ctx_t *ctx = ptr;</div><div class='del'>-</div><div class='del'>-        event_dispatch (ctx-&gt;event_pool);</div><div class='del'>-</div><div class='del'>-        return NULL;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-xlator_graph_init (xlator_t *xl)</div><div class='del'>-{</div><div class='del'>-        xlator_t *trav = xl;</div><div class='del'>-        int32_t ret = -1;</div><div class='del'>-</div><div class='del'>-        while (trav-&gt;prev)</div><div class='del'>-                trav = trav-&gt;prev;</div><div class='del'>-</div><div class='del'>-        while (trav) {</div><div class='del'>-                if (!trav-&gt;ready) {</div><div class='del'>-                        ret = xlator_tree_init (trav);</div><div class='del'>-                        if (ret &lt; 0)</div><div class='del'>-                                break;</div><div class='del'>-                }</div><div class='del'>-                trav = trav-&gt;next;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-void</div><div class='del'>-xlator_graph_fini (xlator_t *xl)</div><div class='del'>-{</div><div class='del'>-	xlator_t *trav = xl;</div><div class='del'>-	while (trav-&gt;prev)</div><div class='del'>-		trav = trav-&gt;prev;</div><div class='del'>-</div><div class='del'>-	while (trav) {</div><div class='del'>-		if (!trav-&gt;init_succeeded) {</div><div class='del'>-			break;</div><div class='del'>-		}</div><div class='del'>-</div><div class='del'>-		xlator_tree_fini (trav);</div><div class='del'>-		trav = trav-&gt;next;</div><div class='del'>-	}</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-/* Returns a pointer to the @n'th char matching</div><div class='del'>- * @c in string @str, starting the search from right or</div><div class='del'>- * end-of-string, rather than starting from left, as rindex</div><div class='del'>- * function does.</div><div class='del'>- */</div><div class='del'>-char *</div><div class='del'>-libgf_rrindex (char *str, int c, int n)</div><div class='del'>-{</div><div class='del'>-        int     len = 0;</div><div class='del'>-        int     occurrence = 0;</div><div class='del'>-</div><div class='del'>-        if (str == NULL)</div><div class='del'>-                return NULL;</div><div class='del'>-</div><div class='del'>-        len = strlen (str);</div><div class='del'>-        /* Point to last character of string. */</div><div class='del'>-        str += (len - 1);</div><div class='del'>-        while (len &gt; 0) {</div><div class='del'>-                if ((int)*str == c) {</div><div class='del'>-                        ++occurrence;</div><div class='del'>-                        if (occurrence == n)</div><div class='del'>-                                break;</div><div class='del'>-                }</div><div class='del'>-                --len;</div><div class='del'>-                --str;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        return str;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-char *</div><div class='del'>-libgf_trim_to_prev_dir (char * path)</div><div class='del'>-{</div><div class='del'>-        char    *idx = NULL;</div><div class='del'>-        int      len = 0;</div><div class='del'>-</div><div class='del'>-        if (!path)</div><div class='del'>-                return NULL;</div><div class='del'>-</div><div class='del'>-        /* Check if we're already at root, if yes</div><div class='del'>-         * then there is no prev dir.</div><div class='del'>-         */</div><div class='del'>-        len = strlen (path);</div><div class='del'>-        if (len == 1)</div><div class='del'>-                return path;</div><div class='del'>-</div><div class='del'>-        if (path[len - 1] == '/') {</div><div class='del'>-                path[len - 1] = '\0';</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        idx = libgf_rrindex (path, '/', 1);</div><div class='del'>-        /* Move to the char after the / */</div><div class='del'>-        ++idx;</div><div class='del'>-        *idx = '\0';</div><div class='del'>-</div><div class='del'>-        return path;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-char *</div><div class='del'>-libgf_prepend_cwd (const char *userpath, char *abspath, int size)</div><div class='del'>-{</div><div class='del'>-        if ((!userpath) || (!abspath))</div><div class='del'>-                return NULL;</div><div class='del'>-</div><div class='del'>-        if (!getcwd (abspath, size))</div><div class='del'>-                return NULL;</div><div class='del'>-</div><div class='del'>-        strcat (abspath, "/");</div><div class='del'>-        strcat (abspath, userpath);</div><div class='del'>-</div><div class='del'>-        return abspath;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-/* Performs a lightweight path resolution that only</div><div class='del'>- * looks for . and  .. and replaces those with the</div><div class='del'>- * proper names.</div><div class='del'>- *</div><div class='del'>- * FIXME: This is a stop-gap measure till we have full</div><div class='del'>- * fledge path resolution going in here.</div><div class='del'>- * Function returns path strdup'ed so remember to FREE the</div><div class='del'>- * string as required.</div><div class='del'>- */</div><div class='del'>-char *</div><div class='del'>-libgf_resolve_path_light (char *path)</div><div class='del'>-{</div><div class='del'>-        char            *respath = NULL;</div><div class='del'>-        char            *saveptr = NULL;</div><div class='del'>-        char            *tok = NULL;</div><div class='del'>-        int             len = 0;</div><div class='del'>-        int             addslash = 0;</div><div class='del'>-        char            mypath[PATH_MAX];</div><div class='del'>-</div><div class='del'>-        if (!path)</div><div class='del'>-                goto out;</div><div class='del'>-</div><div class='del'>-        memset (mypath, 0, PATH_MAX);</div><div class='del'>-</div><div class='del'>-        if (!libgf_path_absolute (path))</div><div class='del'>-                libgf_prepend_cwd (path, mypath, PATH_MAX);</div><div class='del'>-        else</div><div class='del'>-                strcpy (mypath, path);</div><div class='del'>-</div><div class='del'>-        len = strlen (mypath);</div><div class='del'>-        if (len == 0) {</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        respath = calloc (PATH_MAX, sizeof (char));</div><div class='del'>-        if (respath == NULL) {</div><div class='del'>-                gf_log (LIBGF_XL_NAME, GF_LOG_ERROR,"Memory allocation failed");</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        /* The path only contains a / or a //, so simply add a /</div><div class='del'>-         * and return.</div><div class='del'>-         * This needs special handling because the loop below does</div><div class='del'>-         * not allow us to do so through strtok.</div><div class='del'>-         */</div><div class='del'>-        if (((mypath[0] == '/') &amp;&amp; (len == 1))</div><div class='del'>-                        || (strcmp (mypath, "//") == 0)) {</div><div class='del'>-                strcat (respath, "/");</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        tok = strtok_r (mypath, "/", &amp;saveptr);</div><div class='del'>-        addslash = 0;</div><div class='del'>-        strcat (respath, "/");</div><div class='del'>-        while (tok) {</div><div class='del'>-                if (addslash) {</div><div class='del'>-                        if ((strcmp (tok, ".") != 0)</div><div class='del'>-                                        &amp;&amp; (strcmp (tok, "..") != 0)) {</div><div class='del'>-                                strcat (respath, "/");</div><div class='del'>-                        }</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                if ((strcmp (tok, ".") != 0) &amp;&amp; (strcmp (tok, "..") != 0)) {</div><div class='del'>-                        strcat (respath, tok);</div><div class='del'>-                        addslash = 1;</div><div class='del'>-                } else if ((strcmp (tok, "..") == 0)) {</div><div class='del'>-                        libgf_trim_to_prev_dir (respath);</div><div class='del'>-                        addslash = 0;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                tok = strtok_r (NULL, "/", &amp;saveptr);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        gf_log (LIBGF_XL_NAME, GF_LOG_DEBUG, "Path: %s, Resolved Path: %s",</div><div class='del'>-                path, respath);</div><div class='del'>-out:</div><div class='del'>-        return respath;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-void </div><div class='del'>-libgf_client_loc_wipe (loc_t *loc)</div><div class='del'>-{</div><div class='del'>-	if (loc-&gt;path) {</div><div class='del'>-		FREE (loc-&gt;path);</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	if (loc-&gt;parent) { </div><div class='del'>-		inode_unref (loc-&gt;parent);</div><div class='del'>-		loc-&gt;parent = NULL;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	if (loc-&gt;inode) {</div><div class='del'>-		inode_unref (loc-&gt;inode);</div><div class='del'>-		loc-&gt;inode = NULL;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	loc-&gt;path = loc-&gt;name = NULL;</div><div class='del'>-        loc-&gt;ino = 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-libgf_client_loc_fill (loc_t *loc,</div><div class='del'>-		       libglusterfs_client_ctx_t *ctx,</div><div class='del'>-		       ino_t ino,</div><div class='del'>-		       ino_t par,</div><div class='del'>-		       const char *name)</div><div class='del'>-{</div><div class='del'>-        inode_t *inode = NULL, *parent = NULL;</div><div class='del'>-	int32_t ret = -1;</div><div class='del'>-	char *path = NULL;</div><div class='del'>-</div><div class='del'>-        /* resistance against multiple invocation of loc_fill not to get</div><div class='del'>-           reference leaks via inode_search() */</div><div class='del'>-</div><div class='del'>-        inode = loc-&gt;inode;</div><div class='del'>-	</div><div class='del'>-        if (!inode) {</div><div class='del'>-                if (ino)</div><div class='del'>-                        inode = inode_search (ctx-&gt;itable, ino, NULL);</div><div class='del'>-</div><div class='del'>-                if (inode)</div><div class='del'>-                        goto inode_found;</div><div class='del'>-</div><div class='del'>-                if (par &amp;&amp; name)</div><div class='del'>-                        inode = inode_search (ctx-&gt;itable, par, name);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-inode_found:</div><div class='del'>-        if (inode) {</div><div class='del'>-                loc-&gt;ino = inode-&gt;ino;</div><div class='del'>-                loc-&gt;inode = inode;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        parent = loc-&gt;parent;</div><div class='del'>-        if (!parent) {</div><div class='del'>-                if (inode)</div><div class='del'>-                        parent = inode_parent (inode, par, name);</div><div class='del'>-                else</div><div class='del'>-                        parent = inode_search (ctx-&gt;itable, par, NULL);</div><div class='del'>-                loc-&gt;parent = parent;</div><div class='del'>-        }</div><div class='del'>-  </div><div class='del'>-	if (!loc-&gt;path) {</div><div class='del'>-		if (name &amp;&amp; parent) {</div><div class='del'>-			ret = inode_path (parent, name, &amp;path);</div><div class='del'>-			if (ret &lt;= 0) {</div><div class='del'>-				gf_log ("glusterfs-fuse", GF_LOG_ERROR,</div><div class='del'>-					"inode_path failed for %"PRId64"/%s",</div><div class='del'>-					parent-&gt;ino, name);</div><div class='del'>-				goto fail;</div><div class='del'>-			} else {</div><div class='del'>-				loc-&gt;path = path;</div><div class='del'>-			}</div><div class='del'>-		} else 	if (inode) {</div><div class='del'>-			ret = inode_path (inode, NULL, &amp;path);</div><div class='del'>-			if (ret &lt;= 0) {</div><div class='del'>-				gf_log ("glusterfs-fuse", GF_LOG_ERROR,</div><div class='del'>-					"inode_path failed for %"PRId64,</div><div class='del'>-					inode-&gt;ino);</div><div class='del'>-				goto fail;</div><div class='del'>-			} else {</div><div class='del'>-				loc-&gt;path = path;</div><div class='del'>-			}</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	if (loc-&gt;path) {</div><div class='del'>-		loc-&gt;name = strrchr (loc-&gt;path, '/');</div><div class='del'>-		if (loc-&gt;name)</div><div class='del'>-			loc-&gt;name++;</div><div class='del'>-		else loc-&gt;name = "";</div><div class='del'>-	}</div><div class='del'>-	</div><div class='del'>-	if ((ino != 1) &amp;&amp;</div><div class='del'>-	    (parent == NULL)) {</div><div class='del'>-		gf_log ("fuse-bridge", GF_LOG_ERROR,</div><div class='del'>-			"failed to search parent for %"PRId64"/%s (%"PRId64")",</div><div class='del'>-			(ino_t)par, name, (ino_t)ino);</div><div class='del'>-		ret = -1;</div><div class='del'>-		goto fail;</div><div class='del'>-	}</div><div class='del'>-	ret = 0;</div><div class='del'>-fail:</div><div class='del'>-	return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-static call_frame_t *</div><div class='del'>-get_call_frame_for_req (libglusterfs_client_ctx_t *ctx, char d)</div><div class='del'>-{</div><div class='del'>-        call_pool_t  *pool = ctx-&gt;gf_ctx.pool;</div><div class='del'>-        xlator_t     *this = ctx-&gt;gf_ctx.graph;</div><div class='del'>-        call_frame_t *frame = NULL;</div><div class='del'>-  </div><div class='del'>-</div><div class='del'>-        frame = create_frame (this, pool);</div><div class='del'>-</div><div class='del'>-        frame-&gt;root-&gt;uid = geteuid ();</div><div class='del'>-        frame-&gt;root-&gt;gid = getegid ();</div><div class='del'>-        frame-&gt;root-&gt;pid = ctx-&gt;pid;</div><div class='del'>-        frame-&gt;root-&gt;unique = ctx-&gt;counter++;</div><div class='del'>-  </div><div class='del'>-        return frame;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-void </div><div class='del'>-libgf_client_fini (xlator_t *this)</div><div class='del'>-{</div><div class='del'>-	FREE (this-&gt;private);</div><div class='del'>-        return;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-libgf_client_notify (xlator_t *this, </div><div class='del'>-                     int32_t event,</div><div class='del'>-                     void *data, </div><div class='del'>-                     ...)</div><div class='del'>-{</div><div class='del'>-        libglusterfs_client_private_t *priv = this-&gt;private;</div><div class='del'>-</div><div class='del'>-        switch (event)</div><div class='del'>-        {</div><div class='del'>-        case GF_EVENT_CHILD_UP:</div><div class='del'>-                pthread_mutex_lock (&amp;priv-&gt;lock);</div><div class='del'>-                {</div><div class='del'>-                        priv-&gt;complete = 1;</div><div class='del'>-                        pthread_cond_broadcast (&amp;priv-&gt;init_con_established);</div><div class='del'>-                }</div><div class='del'>-                pthread_mutex_unlock (&amp;priv-&gt;lock);</div><div class='del'>-                break;</div><div class='del'>-</div><div class='del'>-        default:</div><div class='del'>-                default_notify (this, event, data);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t </div><div class='del'>-libgf_client_init (xlator_t *this)</div><div class='del'>-{</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-glusterfs_handle_t </div><div class='del'>-glusterfs_init (glusterfs_init_params_t *init_ctx, uint32_t fakefsid)</div><div class='del'>-{</div><div class='del'>-        libglusterfs_client_ctx_t *ctx = NULL;</div><div class='del'>-        libglusterfs_client_private_t *priv = NULL;</div><div class='del'>-        FILE *specfp = NULL;</div><div class='del'>-        xlator_t *graph = NULL, *trav = NULL;</div><div class='del'>-        call_pool_t *pool = NULL;</div><div class='del'>-        int32_t ret = 0;</div><div class='del'>-        struct rlimit lim;</div><div class='del'>-	uint32_t xl_count = 0;</div><div class='del'>-        loc_t       new_loc = {0, };</div><div class='del'>-        struct timeval tv = {0, };</div><div class='del'>-        uint32_t       len = 0;</div><div class='del'>-        char           buf[PATH_MAX];</div><div class='del'>-</div><div class='del'>-        if (!init_ctx || (!init_ctx-&gt;specfile &amp;&amp; !init_ctx-&gt;specfp)) {</div><div class='del'>-                errno = EINVAL;</div><div class='del'>-                return NULL;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        ctx = CALLOC (1, sizeof (*ctx));</div><div class='del'>-        if (!ctx) {</div><div class='del'>-		fprintf (stderr, </div><div class='del'>-			 "libglusterfsclient: %s:%s():%d: out of memory\n",</div><div class='del'>-			 __FILE__, __PRETTY_FUNCTION__, __LINE__);</div><div class='del'>-</div><div class='del'>-                errno = ENOMEM;</div><div class='del'>-                return NULL;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        ctx-&gt;lookup_timeout = init_ctx-&gt;lookup_timeout;</div><div class='del'>-        ctx-&gt;stat_timeout = init_ctx-&gt;stat_timeout;</div><div class='del'>-        ctx-&gt;fake_fsid = fakefsid;</div><div class='del'>-        ctx-&gt;pid = getpid ();</div><div class='del'>-        pthread_mutex_init (&amp;ctx-&gt;gf_ctx.lock, NULL);</div><div class='del'>-  </div><div class='del'>-        pool = ctx-&gt;gf_ctx.pool = CALLOC (1, sizeof (call_pool_t));</div><div class='del'>-        if (!pool) {</div><div class='del'>-                errno = ENOMEM;</div><div class='del'>-                FREE (ctx);</div><div class='del'>-                return NULL;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        LOCK_INIT (&amp;pool-&gt;lock);</div><div class='del'>-        INIT_LIST_HEAD (&amp;pool-&gt;all_frames);</div><div class='del'>-</div><div class='del'>-	/* FIXME: why is count hardcoded to 16384 */</div><div class='del'>-        ctx-&gt;gf_ctx.event_pool = event_pool_new (16384);</div><div class='del'>-        ctx-&gt;gf_ctx.page_size  = LIBGF_IOBUF_SIZE;</div><div class='del'>-        ctx-&gt;gf_ctx.iobuf_pool = iobuf_pool_new (8 * 1048576,</div><div class='del'>-                                                 ctx-&gt;gf_ctx.page_size);</div><div class='del'>-</div><div class='del'>-        lim.rlim_cur = RLIM_INFINITY;</div><div class='del'>-        lim.rlim_max = RLIM_INFINITY;</div><div class='del'>-        setrlimit (RLIMIT_CORE, &amp;lim);</div><div class='del'>-        setrlimit (RLIMIT_NOFILE, &amp;lim);</div><div class='del'>-</div><div class='del'>-        ctx-&gt;gf_ctx.cmd_args.log_level = GF_LOG_WARNING;</div><div class='del'>-</div><div class='del'>-        if (init_ctx-&gt;logfile)</div><div class='del'>-                ctx-&gt;gf_ctx.cmd_args.log_file = strdup (init_ctx-&gt;logfile);</div><div class='del'>-        else</div><div class='del'>-                ctx-&gt;gf_ctx.cmd_args.log_file = strdup ("/dev/stderr");</div><div class='del'>-</div><div class='del'>-        if (init_ctx-&gt;loglevel) {</div><div class='del'>-                if (!strncasecmp (init_ctx-&gt;loglevel, "DEBUG",</div><div class='del'>-                                  strlen ("DEBUG"))) {</div><div class='del'>-                        ctx-&gt;gf_ctx.cmd_args.log_level = GF_LOG_DEBUG;</div><div class='del'>-                } else if (!strncasecmp (init_ctx-&gt;loglevel, "WARNING",</div><div class='del'>-                                         strlen ("WARNING"))) {</div><div class='del'>-                        ctx-&gt;gf_ctx.cmd_args.log_level = GF_LOG_WARNING;</div><div class='del'>-                } else if (!strncasecmp (init_ctx-&gt;loglevel, "CRITICAL",</div><div class='del'>-                                         strlen ("CRITICAL"))) {</div><div class='del'>-                        ctx-&gt;gf_ctx.cmd_args.log_level = GF_LOG_CRITICAL;</div><div class='del'>-                } else if (!strncasecmp (init_ctx-&gt;loglevel, "NONE",</div><div class='del'>-                                         strlen ("NONE"))) {</div><div class='del'>-                        ctx-&gt;gf_ctx.cmd_args.log_level = GF_LOG_NONE;</div><div class='del'>-                } else if (!strncasecmp (init_ctx-&gt;loglevel, "ERROR",</div><div class='del'>-                                         strlen ("ERROR"))) {</div><div class='del'>-                        ctx-&gt;gf_ctx.cmd_args.log_level = GF_LOG_ERROR;</div><div class='del'>-                } else if (!strncasecmp (init_ctx-&gt;loglevel, "TRACE",</div><div class='del'>-                                         strlen ("TRACE"))) {</div><div class='del'>-                        ctx-&gt;gf_ctx.cmd_args.log_level = GF_LOG_TRACE;</div><div class='del'>-                } else {</div><div class='del'>-			fprintf (stderr, </div><div class='del'>-				 "libglusterfsclient: %s:%s():%d: Unrecognized log-level \"%s\", possible values are \"DEBUG|WARNING|[ERROR]|CRITICAL|NONE|TRACE\"\n",</div><div class='del'>-                                 __FILE__, __PRETTY_FUNCTION__, __LINE__,</div><div class='del'>-                                 init_ctx-&gt;loglevel);</div><div class='del'>-			FREE (ctx-&gt;gf_ctx.cmd_args.log_file);</div><div class='del'>-                        FREE (ctx-&gt;gf_ctx.pool);</div><div class='del'>-                        FREE (ctx-&gt;gf_ctx.event_pool);</div><div class='del'>-                        FREE (ctx);</div><div class='del'>-                        errno = EINVAL;</div><div class='del'>-                        return NULL;</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-	if (first_init)</div><div class='del'>-        {</div><div class='del'>-                memset (buf, 0, PATH_MAX);</div><div class='del'>-</div><div class='del'>-                if (getcwd (buf, PATH_MAX) == NULL) {</div><div class='del'>-                        fprintf (stderr, "libglusterfsclient: cannot get "</div><div class='del'>-                                 "current working directory (%s)",</div><div class='del'>-                                 strerror (errno));</div><div class='del'>-			FREE (ctx-&gt;gf_ctx.cmd_args.log_file);</div><div class='del'>-                        FREE (ctx-&gt;gf_ctx.pool);</div><div class='del'>-                        FREE (ctx-&gt;gf_ctx.event_pool);</div><div class='del'>-                        FREE (ctx);</div><div class='del'>-                        return NULL;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                len = strlen (buf);</div><div class='del'>-                if ((buf[len - 1] != '/')) {</div><div class='del'>-                        if ((len + 2) &gt; PATH_MAX) {</div><div class='del'>-                                errno = ENAMETOOLONG;</div><div class='del'>-                                fprintf (stderr, "libglusterfsclient: cannot"</div><div class='del'>-                                         "get current working directory (%s)",</div><div class='del'>-                                         strerror (errno));</div><div class='del'>-                                FREE (ctx-&gt;gf_ctx.cmd_args.log_file);</div><div class='del'>-                                FREE (ctx-&gt;gf_ctx.pool);</div><div class='del'>-                                FREE (ctx-&gt;gf_ctx.event_pool);</div><div class='del'>-                                FREE (ctx);</div><div class='del'>-                                return NULL;</div><div class='del'>-                        }</div><div class='del'>-</div><div class='del'>-                        strcat (buf, "/");</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                pthread_mutex_lock (&amp;cwdlock);</div><div class='del'>-                {</div><div class='del'>-                        strcpy (cwd, buf);</div><div class='del'>-                        cwd_inited = 1;</div><div class='del'>-                }</div><div class='del'>-                pthread_mutex_unlock (&amp;cwdlock);</div><div class='del'>-</div><div class='del'>-                ret = gf_log_init (ctx-&gt;gf_ctx.cmd_args.log_file);</div><div class='del'>-                if (ret == -1) {</div><div class='del'>-			fprintf (stderr, </div><div class='del'>-				 "libglusterfsclient: %s:%s():%d: failed to open logfile \"%s\"\n", </div><div class='del'>-				 __FILE__, __PRETTY_FUNCTION__, __LINE__, </div><div class='del'>-				 ctx-&gt;gf_ctx.cmd_args.log_file);</div><div class='del'>-			FREE (ctx-&gt;gf_ctx.cmd_args.log_file);</div><div class='del'>-                        FREE (ctx-&gt;gf_ctx.pool);</div><div class='del'>-                        FREE (ctx-&gt;gf_ctx.event_pool);</div><div class='del'>-                        FREE (ctx);</div><div class='del'>-                        return NULL;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                gf_log_set_loglevel (ctx-&gt;gf_ctx.cmd_args.log_level);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (init_ctx-&gt;specfp) {</div><div class='del'>-                specfp = init_ctx-&gt;specfp;</div><div class='del'>-                if (fseek (specfp, 0L, SEEK_SET)) {</div><div class='del'>-			fprintf (stderr, </div><div class='del'>-				 "libglusterfsclient: %s:%s():%d: fseek on volume file stream failed (%s)\n",</div><div class='del'>-                                 __FILE__, __PRETTY_FUNCTION__, __LINE__,</div><div class='del'>-                                 strerror (errno));</div><div class='del'>-			FREE (ctx-&gt;gf_ctx.cmd_args.log_file);</div><div class='del'>-                        FREE (ctx-&gt;gf_ctx.pool);</div><div class='del'>-                        FREE (ctx-&gt;gf_ctx.event_pool);</div><div class='del'>-                        FREE (ctx);</div><div class='del'>-                        return NULL;</div><div class='del'>-                }</div><div class='del'>-        } else if (init_ctx-&gt;specfile) { </div><div class='del'>-                specfp = fopen (init_ctx-&gt;specfile, "r");</div><div class='del'>-                ctx-&gt;gf_ctx.cmd_args.volume_file = strdup (init_ctx-&gt;specfile);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (!specfp) {</div><div class='del'>-		fprintf (stderr, </div><div class='del'>-			 "libglusterfsclient: %s:%s():%d: could not open volfile: %s\n", </div><div class='del'>-			 __FILE__, __PRETTY_FUNCTION__, __LINE__,</div><div class='del'>-                         strerror (errno));</div><div class='del'>-		FREE (ctx-&gt;gf_ctx.cmd_args.log_file);</div><div class='del'>-                FREE (ctx-&gt;gf_ctx.cmd_args.volume_file);</div><div class='del'>-                FREE (ctx-&gt;gf_ctx.pool);</div><div class='del'>-                FREE (ctx-&gt;gf_ctx.event_pool);</div><div class='del'>-                FREE (ctx);</div><div class='del'>-                return NULL;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (init_ctx-&gt;volume_name) {</div><div class='del'>-                ctx-&gt;gf_ctx.cmd_args.volume_name = strdup (init_ctx-&gt;volume_name);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-	graph = file_to_xlator_tree (&amp;ctx-&gt;gf_ctx, specfp);</div><div class='del'>-        if (!graph) {</div><div class='del'>-		fprintf (stderr, </div><div class='del'>-			 "libglusterfsclient: %s:%s():%d: cannot create configuration graph (%s)\n",</div><div class='del'>-			 __FILE__, __PRETTY_FUNCTION__, __LINE__,</div><div class='del'>-                         strerror (errno));</div><div class='del'>-</div><div class='del'>-		FREE (ctx-&gt;gf_ctx.cmd_args.log_file);</div><div class='del'>-                FREE (ctx-&gt;gf_ctx.cmd_args.volume_file);</div><div class='del'>-                FREE (ctx-&gt;gf_ctx.cmd_args.volume_name);</div><div class='del'>-                FREE (ctx-&gt;gf_ctx.pool);</div><div class='del'>-                FREE (ctx-&gt;gf_ctx.event_pool);</div><div class='del'>-                FREE (ctx);</div><div class='del'>-                return NULL;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (init_ctx-&gt;volume_name) {</div><div class='del'>-                trav = graph;</div><div class='del'>-                while (trav) {</div><div class='del'>-                        if (strcmp (trav-&gt;name, init_ctx-&gt;volume_name) == 0) {</div><div class='del'>-                                graph = trav;</div><div class='del'>-                                break;</div><div class='del'>-                        }</div><div class='del'>-                        trav = trav-&gt;next;</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        ctx-&gt;gf_ctx.graph = libglusterfs_graph (graph);</div><div class='del'>-        if (!ctx-&gt;gf_ctx.graph) {</div><div class='del'>-		fprintf (stderr, </div><div class='del'>-			 "libglusterfsclient: %s:%s():%d: graph creation failed (%s)\n",</div><div class='del'>-			 __FILE__, __PRETTY_FUNCTION__, __LINE__,</div><div class='del'>-                         strerror (errno));</div><div class='del'>-</div><div class='del'>-		xlator_tree_free (graph);</div><div class='del'>-		FREE (ctx-&gt;gf_ctx.cmd_args.log_file);</div><div class='del'>-                FREE (ctx-&gt;gf_ctx.cmd_args.volume_file);</div><div class='del'>-                FREE (ctx-&gt;gf_ctx.cmd_args.volume_name);</div><div class='del'>-                FREE (ctx-&gt;gf_ctx.pool);</div><div class='del'>-                FREE (ctx-&gt;gf_ctx.event_pool);</div><div class='del'>-                FREE (ctx);</div><div class='del'>-                return NULL;</div><div class='del'>-        }</div><div class='del'>-        graph = ctx-&gt;gf_ctx.graph;</div><div class='del'>-        ctx-&gt;gf_ctx.top = graph;</div><div class='del'>-</div><div class='del'>-	trav = graph;</div><div class='del'>-	while (trav) {</div><div class='del'>-		xl_count++;  /* Getting this value right is very important */</div><div class='del'>-		trav = trav-&gt;next;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	ctx-&gt;gf_ctx.xl_count = xl_count + 1;</div><div class='del'>-</div><div class='del'>-        priv = CALLOC (1, sizeof (*priv));</div><div class='del'>-        if (!priv) {</div><div class='del'>-		fprintf (stderr, </div><div class='del'>-			 "libglusterfsclient: %s:%s():%d: cannot allocate memory (%s)\n",</div><div class='del'>-			 __FILE__, __PRETTY_FUNCTION__, __LINE__,</div><div class='del'>-                         strerror (errno));</div><div class='del'>-</div><div class='del'>-		xlator_tree_free (graph);</div><div class='del'>-		FREE (ctx-&gt;gf_ctx.cmd_args.log_file);</div><div class='del'>-                FREE (ctx-&gt;gf_ctx.cmd_args.volume_file);</div><div class='del'>-                FREE (ctx-&gt;gf_ctx.cmd_args.volume_name);</div><div class='del'>-                FREE (ctx-&gt;gf_ctx.pool);</div><div class='del'>-                FREE (ctx-&gt;gf_ctx.event_pool);</div><div class='del'>-                /* inode_table_destroy (ctx-&gt;itable); */</div><div class='del'>-                FREE (ctx);</div><div class='del'>-         </div><div class='del'>-                return NULL;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        pthread_cond_init (&amp;priv-&gt;init_con_established, NULL);</div><div class='del'>-        pthread_mutex_init (&amp;priv-&gt;lock, NULL);</div><div class='del'>-</div><div class='del'>-        graph-&gt;private = priv;</div><div class='del'>-        ctx-&gt;itable = inode_table_new (LIBGLUSTERFS_INODE_TABLE_LRU_LIMIT,</div><div class='del'>-                                       graph);</div><div class='del'>-        if (!ctx-&gt;itable) {</div><div class='del'>-		fprintf (stderr, </div><div class='del'>-			 "libglusterfsclient: %s:%s():%d: cannot create inode table\n",</div><div class='del'>-			 __FILE__, __PRETTY_FUNCTION__, __LINE__);</div><div class='del'>-		xlator_tree_free (graph); </div><div class='del'>-		FREE (ctx-&gt;gf_ctx.cmd_args.log_file);</div><div class='del'>-                FREE (ctx-&gt;gf_ctx.cmd_args.volume_file);</div><div class='del'>-                FREE (ctx-&gt;gf_ctx.cmd_args.volume_name);</div><div class='del'>-</div><div class='del'>-                FREE (ctx-&gt;gf_ctx.pool);</div><div class='del'>-                FREE (ctx-&gt;gf_ctx.event_pool);</div><div class='del'>-		xlator_tree_free (graph); </div><div class='del'>-                /* TODO: destroy graph */</div><div class='del'>-                /* inode_table_destroy (ctx-&gt;itable); */</div><div class='del'>-                FREE (ctx);</div><div class='del'>-         </div><div class='del'>-                return NULL;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-	set_global_ctx_ptr (&amp;ctx-&gt;gf_ctx);</div><div class='del'>-	ctx-&gt;gf_ctx.process_uuid = zr_build_process_uuid ();</div><div class='del'>-</div><div class='del'>-        if (xlator_graph_init (graph) == -1) {</div><div class='del'>-		fprintf (stderr, </div><div class='del'>-			 "libglusterfsclient: %s:%s():%d: graph initialization failed\n",</div><div class='del'>-			 __FILE__, __PRETTY_FUNCTION__, __LINE__);</div><div class='del'>-		xlator_tree_free (graph);</div><div class='del'>-		FREE (ctx-&gt;gf_ctx.cmd_args.log_file);</div><div class='del'>-                FREE (ctx-&gt;gf_ctx.cmd_args.volume_file);</div><div class='del'>-                FREE (ctx-&gt;gf_ctx.cmd_args.volume_name);</div><div class='del'>-                FREE (ctx-&gt;gf_ctx.pool);</div><div class='del'>-                FREE (ctx-&gt;gf_ctx.event_pool);</div><div class='del'>-                /* TODO: destroy graph */</div><div class='del'>-                /* inode_table_destroy (ctx-&gt;itable); */</div><div class='del'>-                FREE (ctx);</div><div class='del'>-                return NULL;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-	/* Send notify to all translator saying things are ready */</div><div class='del'>-	graph-&gt;notify (graph, GF_EVENT_PARENT_UP, graph);</div><div class='del'>-</div><div class='del'>-        if (gf_timer_registry_init (&amp;ctx-&gt;gf_ctx) == NULL) {</div><div class='del'>-		fprintf (stderr, </div><div class='del'>-			 "libglusterfsclient: %s:%s():%d: timer init failed (%s)\n", </div><div class='del'>-			 __FILE__, __PRETTY_FUNCTION__, __LINE__,</div><div class='del'>-                         strerror (errno));</div><div class='del'>-</div><div class='del'>-		xlator_graph_fini (graph);</div><div class='del'>-		xlator_tree_free (graph);</div><div class='del'>-		FREE (ctx-&gt;gf_ctx.cmd_args.log_file);</div><div class='del'>-                FREE (ctx-&gt;gf_ctx.cmd_args.volume_file);</div><div class='del'>-                FREE (ctx-&gt;gf_ctx.cmd_args.volume_name);</div><div class='del'>-</div><div class='del'>-                FREE (ctx-&gt;gf_ctx.pool);</div><div class='del'>-                FREE (ctx-&gt;gf_ctx.event_pool);</div><div class='del'>-                /* TODO: destroy graph */</div><div class='del'>-                /* inode_table_destroy (ctx-&gt;itable); */</div><div class='del'>-                FREE (ctx);</div><div class='del'>-                return NULL;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if ((ret = pthread_create (&amp;ctx-&gt;reply_thread, NULL, poll_proc,</div><div class='del'>-                                   (void *)&amp;ctx-&gt;gf_ctx))) {</div><div class='del'>-		fprintf (stderr, </div><div class='del'>-			 "libglusterfsclient: %s:%s():%d: reply thread creation failed\n", </div><div class='del'>-			 __FILE__, __PRETTY_FUNCTION__, __LINE__);</div><div class='del'>-		xlator_graph_fini (graph);</div><div class='del'>-		xlator_tree_free (graph);</div><div class='del'>-		FREE (ctx-&gt;gf_ctx.cmd_args.log_file);</div><div class='del'>-                FREE (ctx-&gt;gf_ctx.cmd_args.volume_file);</div><div class='del'>-                FREE (ctx-&gt;gf_ctx.cmd_args.volume_name);</div><div class='del'>-</div><div class='del'>-                FREE (ctx-&gt;gf_ctx.pool);</div><div class='del'>-                FREE (ctx-&gt;gf_ctx.event_pool);</div><div class='del'>-                /* TODO: destroy graph */</div><div class='del'>-                /* inode_table_destroy (ctx-&gt;itable); */</div><div class='del'>-                FREE (ctx);</div><div class='del'>-                return NULL;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        pthread_mutex_lock (&amp;priv-&gt;lock); </div><div class='del'>-        {</div><div class='del'>-                while (!priv-&gt;complete) {</div><div class='del'>-                        pthread_cond_wait (&amp;priv-&gt;init_con_established,</div><div class='del'>-                                           &amp;priv-&gt;lock);</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='del'>-        pthread_mutex_unlock (&amp;priv-&gt;lock);</div><div class='del'>-</div><div class='del'>-        /* </div><div class='del'>-         * wait for some time to allow initialization of all children of </div><div class='del'>-         * distribute before sending lookup on '/'</div><div class='del'>-         */</div><div class='del'>-</div><div class='del'>-        tv.tv_sec = 0;</div><div class='del'>-        tv.tv_usec = (100 * 1000);</div><div class='del'>-        select (0, NULL, NULL, NULL, &amp;tv);</div><div class='del'>-</div><div class='del'>-        /* workaround for xlators like dht which require lookup to be sent</div><div class='del'>-         * on / */</div><div class='del'>-        libgf_client_loc_fill (&amp;new_loc, ctx, 1, 0, "/");</div><div class='del'>-        ret = libgf_client_lookup (ctx, &amp;new_loc, NULL, NULL, NULL);</div><div class='del'>-        if (ret == -1) {</div><div class='del'>-                gf_log ("libglusterfsclient", GF_LOG_ERROR, "lookup of /"</div><div class='del'>-                        " failed");</div><div class='del'>-                return NULL;</div><div class='del'>-        }</div><div class='del'>-        libgf_client_loc_wipe (&amp;new_loc);</div><div class='del'>-</div><div class='del'>-	first_init = 0;</div><div class='del'>- </div><div class='del'>-        return ctx;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-struct vmp_entry *</div><div class='del'>-libgf_init_vmpentry (char *vmp, glusterfs_handle_t *vmphandle)</div><div class='del'>-{</div><div class='del'>-        struct vmp_entry        *entry = NULL;</div><div class='del'>-        int                     vmplen = 0;</div><div class='del'>-        int                     appendslash = 0;</div><div class='del'>-        int                     ret = -1;</div><div class='del'>-</div><div class='del'>-        entry = CALLOC (1, sizeof (struct vmp_entry));</div><div class='del'>-        if (!entry) {</div><div class='del'>-                gf_log (LIBGF_XL_NAME, GF_LOG_ERROR,"Memory allocation failed");</div><div class='del'>-                return NULL;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        vmplen = strlen (vmp);</div><div class='del'>-        if (vmp[vmplen - 1] != '/') {</div><div class='del'>-                vmplen++;</div><div class='del'>-                appendslash = 1;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        entry-&gt;vmp = CALLOC (vmplen + 1, sizeof (char));</div><div class='del'>-        if (!entry-&gt;vmp) {</div><div class='del'>-                gf_log (LIBGF_XL_NAME, GF_LOG_ERROR, "Memory allocation "</div><div class='del'>-                        "failed");</div><div class='del'>-                goto free_entry;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        strcpy (entry-&gt;vmp, vmp);</div><div class='del'>-        if (appendslash) {</div><div class='del'>-                entry-&gt;vmp[vmplen-1] = '/';</div><div class='del'>-                entry-&gt;vmp[vmplen] = '\0';</div><div class='del'>-        }</div><div class='del'>- </div><div class='del'>-        entry-&gt;vmplen = vmplen;</div><div class='del'>-        entry-&gt;handle = vmphandle;</div><div class='del'>-        INIT_LIST_HEAD (&amp;entry-&gt;list);</div><div class='del'>-        gf_log (LIBGF_XL_NAME, GF_LOG_DEBUG, "New VMP entry: %s", vmp);</div><div class='del'>-</div><div class='del'>-        ret = 0;</div><div class='del'>-</div><div class='del'>-free_entry:</div><div class='del'>-        if (ret == -1) {</div><div class='del'>-                if (entry-&gt;vmp)</div><div class='del'>-                        FREE (entry-&gt;vmp);</div><div class='del'>-                if (entry)</div><div class='del'>-                        FREE (entry);</div><div class='del'>-                entry = NULL;</div><div class='del'>-        }</div><div class='del'>-        return entry;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-void</div><div class='del'>-libgf_free_vmp_entry (struct vmp_entry *entry)</div><div class='del'>-{</div><div class='del'>-        FREE (entry-&gt;vmp);</div><div class='del'>-        FREE (entry);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-libgf_count_path_components (char *path)</div><div class='del'>-{</div><div class='del'>-        int     compos = 0;</div><div class='del'>-        char    *pathdup = NULL;</div><div class='del'>-        int     len = 0;</div><div class='del'>-</div><div class='del'>-        if (!path)</div><div class='del'>-                return -1;</div><div class='del'>-</div><div class='del'>-        pathdup = strdup (path);</div><div class='del'>-        if (!pathdup)</div><div class='del'>-                return -1;</div><div class='del'>-</div><div class='del'>-        len = strlen (pathdup);</div><div class='del'>-        if (pathdup[len - 1] == '/')</div><div class='del'>-                pathdup[len - 1] = '\0';</div><div class='del'>-</div><div class='del'>-        path = pathdup;</div><div class='del'>-        while ((path = strchr (path, '/'))) {</div><div class='del'>-                compos++;</div><div class='del'>-                ++path;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        free (pathdup);</div><div class='del'>-        return compos;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-/* Returns the number of components that match between</div><div class='del'>- * the VMP and the path. Assumes string1 is vmp entry.</div><div class='del'>- * Assumes both are absolute paths.</div><div class='del'>- */</div><div class='del'>-int</div><div class='del'>-libgf_strmatchcount (char *string1, char *string2)</div><div class='del'>-{</div><div class='del'>-        int     matchcount = 0;</div><div class='del'>-        char    *s1dup = NULL, *s2dup = NULL;</div><div class='del'>-        char    *tok1 = NULL, *saveptr1 = NULL;</div><div class='del'>-        char    *tok2 = NULL, *saveptr2 = NULL;</div><div class='del'>-</div><div class='del'>-        if ((!string1) || (!string2))</div><div class='del'>-                return 0;</div><div class='del'>-</div><div class='del'>-        s1dup = strdup (string1);</div><div class='del'>-        if (!s1dup)</div><div class='del'>-                return 0;</div><div class='del'>-</div><div class='del'>-        s2dup  = strdup (string2);</div><div class='del'>-        if (!s2dup)</div><div class='del'>-                goto free_s1;</div><div class='del'>-</div><div class='del'>-        string1 = s1dup;</div><div class='del'>-        string2 = s2dup;</div><div class='del'>-</div><div class='del'>-        tok1 = strtok_r(string1, "/", &amp;saveptr1);</div><div class='del'>-        tok2 = strtok_r (string2, "/", &amp;saveptr2);</div><div class='del'>-        while (tok1) {</div><div class='del'>-                if (!tok2)</div><div class='del'>-                        break;</div><div class='del'>-</div><div class='del'>-                if (strcmp (tok1, tok2) != 0)</div><div class='del'>-                        break;</div><div class='del'>-</div><div class='del'>-                matchcount++;</div><div class='del'>-                tok1 = strtok_r(NULL, "/", &amp;saveptr1);</div><div class='del'>-                tok2 = strtok_r (NULL, "/", &amp;saveptr2);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        free (s2dup);</div><div class='del'>-free_s1:</div><div class='del'>-        free (s1dup);</div><div class='del'>-        return matchcount;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-libgf_vmp_entry_match (struct vmp_entry *entry, char *path)</div><div class='del'>-{</div><div class='del'>-        return libgf_strmatchcount (entry-&gt;vmp, path);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-#define LIBGF_VMP_EXACT          1</div><div class='del'>-#define LIBGF_VMP_LONGESTPREFIX  0</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-/* copies vmp from the vmp-entry having glusterfs handle @handle, into @vmp */</div><div class='del'>-char *</div><div class='del'>-libgf_vmp_search_vmp (glusterfs_handle_t handle, char *vmp, size_t vmp_size)</div><div class='del'>-{</div><div class='del'>-        char             *res   = NULL;</div><div class='del'>-        struct vmp_entry *entry = NULL;</div><div class='del'>-</div><div class='del'>-        if (handle == NULL) {</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        pthread_mutex_lock (&amp;vmplock);</div><div class='del'>-        {</div><div class='del'>-                if (vmplist.entries == 0) {</div><div class='del'>-                        gf_log (LIBGF_XL_NAME, GF_LOG_DEBUG, "Virtual Mount Point "</div><div class='del'>-                                "list is empty.");</div><div class='del'>-                        goto unlock;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                list_for_each_entry(entry, &amp;vmplist.list, list) {</div><div class='del'>-                        if (entry-&gt;handle == handle) {</div><div class='del'>-                                if ((vmp_size) &lt; (strlen (entry-&gt;vmp) + 1)) {</div><div class='del'>-                                        errno = ENAMETOOLONG;</div><div class='del'>-                                        goto unlock;</div><div class='del'>-                                }</div><div class='del'>-</div><div class='del'>-                                strcpy (vmp, entry-&gt;vmp);</div><div class='del'>-                                res = vmp;</div><div class='del'>-                                break;</div><div class='del'>-                        }</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='del'>-unlock:</div><div class='del'>-        pthread_mutex_unlock (&amp;vmplock);</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        return res;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-struct vmp_entry *</div><div class='del'>-_libgf_vmp_search_entry (char *path, int searchtype)</div><div class='del'>-{</div><div class='del'>-        struct vmp_entry        *entry = NULL;</div><div class='del'>-        int                     matchcount = 0;</div><div class='del'>-        struct vmp_entry        *maxentry = NULL;</div><div class='del'>-        int                     maxcount = 0;</div><div class='del'>-        int                     vmpcompcount = 0;</div><div class='del'>-</div><div class='del'>-        gf_log (LIBGF_XL_NAME, GF_LOG_DEBUG, "VMP Search: path %s, type: %s",</div><div class='del'>-                path, (searchtype == LIBGF_VMP_EXACT)?"Exact":"LongestPrefix");</div><div class='del'>-        if (vmplist.entries == 0) {</div><div class='del'>-                gf_log (LIBGF_XL_NAME, GF_LOG_DEBUG, "Virtual Mount Point "</div><div class='del'>-                        "list is empty.");</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        list_for_each_entry(entry, &amp;vmplist.list, list) {</div><div class='del'>-                vmpcompcount = libgf_count_path_components (entry-&gt;vmp);</div><div class='del'>-                matchcount = libgf_vmp_entry_match (entry, path);</div><div class='del'>-                gf_log (LIBGF_XL_NAME, GF_LOG_TRACE, "Candidate VMP:  %s,"</div><div class='del'>-                        " Matchcount: %d", entry-&gt;vmp, matchcount);</div><div class='del'>-                if ((matchcount &gt; maxcount) &amp;&amp; (matchcount == vmpcompcount)) {</div><div class='del'>-                        maxcount = matchcount;</div><div class='del'>-                        maxentry = entry;</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        /* To ensure that the longest prefix matched entry is also an exact</div><div class='del'>-         * match, this is used to check whether duplicate entries are present</div><div class='del'>-         * in the vmplist.</div><div class='del'>-         */</div><div class='del'>-        vmpcompcount = 0;</div><div class='del'>-        if ((searchtype == LIBGF_VMP_EXACT) &amp;&amp; (maxentry)) {</div><div class='del'>-                vmpcompcount = libgf_count_path_components (maxentry-&gt;vmp);</div><div class='del'>-                matchcount = libgf_count_path_components (path);</div><div class='del'>-                gf_log (LIBGF_XL_NAME, GF_LOG_TRACE, "Exact Check: VMP: %s,"</div><div class='del'>-                        " CompCount: %d, Path: %s, CompCount: %d",</div><div class='del'>-                        maxentry-&gt;vmp, vmpcompcount, path, matchcount);</div><div class='del'>-                if (vmpcompcount != matchcount) {</div><div class='del'>-                        gf_log (LIBGF_XL_NAME, GF_LOG_TRACE, "No Match");</div><div class='del'>-                        maxentry = NULL;</div><div class='del'>-                } else</div><div class='del'>-                        gf_log (LIBGF_XL_NAME, GF_LOG_TRACE, "Matches!");</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-out:        </div><div class='del'>-        return maxentry;</div><div class='del'>-} </div><div class='del'>-</div><div class='del'>-/* Used to search for a exactly matching VMP entry.</div><div class='del'>- */</div><div class='del'>-struct vmp_entry *</div><div class='del'>-libgf_vmp_search_exact_entry (char *path)</div><div class='del'>-{</div><div class='del'>-        struct vmp_entry        *entry = NULL;</div><div class='del'>-</div><div class='del'>-        if (!path)</div><div class='del'>-                goto out;</div><div class='del'>-</div><div class='del'>-        pthread_mutex_lock (&amp;vmplock);</div><div class='del'>-        {</div><div class='del'>-                entry = _libgf_vmp_search_entry (path, LIBGF_VMP_EXACT);</div><div class='del'>-        }</div><div class='del'>-        pthread_mutex_unlock (&amp;vmplock);</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        if (entry)</div><div class='del'>-                gf_log (LIBGF_XL_NAME, GF_LOG_DEBUG, "VMP Entry found: path :%s"</div><div class='del'>-                        " vmp: %s", path, entry-&gt;vmp);</div><div class='del'>-        else</div><div class='del'>-                gf_log (LIBGF_XL_NAME, GF_LOG_DEBUG, "VMP Entry not found: path"</div><div class='del'>-                        ": %s", path);</div><div class='del'>-</div><div class='del'>-        return entry;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-/* Used to search for a longest prefix matching VMP entry.</div><div class='del'>- */</div><div class='del'>-struct vmp_entry *</div><div class='del'>-libgf_vmp_search_entry (char *path)</div><div class='del'>-{</div><div class='del'>-        struct vmp_entry        *entry = NULL;</div><div class='del'>-</div><div class='del'>-        if (!path)</div><div class='del'>-                goto out;</div><div class='del'>-</div><div class='del'>-        pthread_mutex_lock (&amp;vmplock);</div><div class='del'>-        {</div><div class='del'>-                entry = _libgf_vmp_search_entry (path, LIBGF_VMP_LONGESTPREFIX);</div><div class='del'>-        }</div><div class='del'>-        pthread_mutex_unlock (&amp;vmplock);</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        if (entry)</div><div class='del'>-                gf_log (LIBGF_XL_NAME, GF_LOG_DEBUG, "VMP Entry found: path :%s"</div><div class='del'>-                        " vmp: %s", path, entry-&gt;vmp);</div><div class='del'>-        else</div><div class='del'>-                gf_log (LIBGF_XL_NAME, GF_LOG_DEBUG, "VMP Entry not found: path"</div><div class='del'>-                        ": %s", path);</div><div class='del'>-</div><div class='del'>-        return entry;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-libgf_vmp_map_ghandle (char *vmp, glusterfs_handle_t *vmphandle)</div><div class='del'>-{</div><div class='del'>-        int                     ret = -1;</div><div class='del'>-        struct vmp_entry        *vmpentry = NULL;</div><div class='del'>-</div><div class='del'>-        gf_log (LIBGF_XL_NAME, GF_LOG_DEBUG, "New Entry: %s", vmp);</div><div class='del'>-        vmpentry = libgf_init_vmpentry (vmp, vmphandle);</div><div class='del'>-        if (!vmpentry) {</div><div class='del'>-                gf_log (LIBGF_XL_NAME, GF_LOG_ERROR, "Failed to create VMP"</div><div class='del'>-                        " entry");</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        pthread_mutex_lock (&amp;vmplock);</div><div class='del'>-        {</div><div class='del'>-                if (vmplist.entries == 0) {</div><div class='del'>-                        gf_log (LIBGF_XL_NAME, GF_LOG_DEBUG, "Empty list");</div><div class='del'>-                        INIT_LIST_HEAD (&amp;vmplist.list);</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                list_add_tail (&amp;vmpentry-&gt;list, &amp;vmplist.list);</div><div class='del'>-                ++vmplist.entries;</div><div class='del'>-        }</div><div class='del'>-        pthread_mutex_unlock (&amp;vmplock);</div><div class='del'>-        ret = 0;</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-/* Path must be validated already. */</div><div class='del'>-glusterfs_handle_t</div><div class='del'>-libgf_vmp_get_ghandle (char * path)</div><div class='del'>-{</div><div class='del'>-        struct vmp_entry        *entry = NULL;</div><div class='del'>-</div><div class='del'>-        entry = libgf_vmp_search_entry (path);</div><div class='del'>-</div><div class='del'>-        if (entry == NULL)</div><div class='del'>-                return NULL;</div><div class='del'>-</div><div class='del'>-        return entry-&gt;handle;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-/* Returns the handle for the path given in @path,</div><div class='del'>- * @path can be a relative path. The point is, here we</div><div class='del'>- * perform any path resolution that is needed and then</div><div class='del'>- * search for the corresponding vmp handle.</div><div class='del'>- * @vpath is a result-value argument in that the virtual</div><div class='del'>- * path inside the handle is copied into it.</div><div class='del'>- */</div><div class='del'>-glusterfs_handle_t</div><div class='del'>-libgf_resolved_path_handle (const char *path, char *vpath)</div><div class='del'>-{</div><div class='del'>-        char                    *respath = NULL;</div><div class='del'>-        struct vmp_entry        *entry = NULL;</div><div class='del'>-        glusterfs_handle_t      handle = NULL;</div><div class='del'>-        char                    *tmp = NULL;</div><div class='del'>-</div><div class='del'>-        if ((!path) || (!vpath))</div><div class='del'>-                return NULL;</div><div class='del'>-</div><div class='del'>-        /* We only want compaction before VMP entry search because the</div><div class='del'>-         * VMP cannot be search unless we have an absolute path.</div><div class='del'>-         * For absolute paths, we search for VMP first, then perform the</div><div class='del'>-         * path compaction on the  given virtual path.</div><div class='del'>-         */</div><div class='del'>-        if (!libgf_path_absolute (path)) {</div><div class='del'>-                respath = libgf_resolve_path_light ((char *)path);</div><div class='del'>-                if (respath == NULL)</div><div class='del'>-                        return NULL;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        /* This condition is needed because in case of absolute paths, the path</div><div class='del'>-         * would already include the VMP and we want to ensure that any path</div><div class='del'>-         * compaction that happens does not exclude the VMP. In the absence of</div><div class='del'>-         * this condition an absolute path might get compacted to "/", i.e.</div><div class='del'>-         * exclude the VMP, and the search will fail.</div><div class='del'>-         *</div><div class='del'>-         * For relative paths, respath will aleady include a potential VMP</div><div class='del'>-         * as a consequence of us prepending the CWD in resolve_light above.</div><div class='del'>-         */</div><div class='del'>-        if (libgf_path_absolute (path)) {</div><div class='del'>-                entry = libgf_vmp_search_entry ((char *)path);</div><div class='del'>-                if (!entry)</div><div class='del'>-                        goto free_respath;</div><div class='del'>-                tmp = libgf_vmp_virtual_path (entry, path, vpath);</div><div class='del'>-                if (!tmp)</div><div class='del'>-                        goto free_respath;</div><div class='del'>-</div><div class='del'>-                respath = libgf_resolve_path_light (vpath);</div><div class='del'>-                strcpy (vpath, respath);</div><div class='del'>-        } else {</div><div class='del'>-                entry = libgf_vmp_search_entry (respath);</div><div class='del'>-                if (!entry)</div><div class='del'>-                        goto free_respath;</div><div class='del'>-                tmp = libgf_vmp_virtual_path (entry, respath, vpath);</div><div class='del'>-                if (!tmp)</div><div class='del'>-                        goto free_respath;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        handle = entry-&gt;handle;</div><div class='del'>-free_respath:</div><div class='del'>-        if (respath)</div><div class='del'>-                free (respath); /* Alloced in libgf_resolve_path_light */</div><div class='del'>-</div><div class='del'>-        return handle;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-glusterfs_mount (char *vmp, glusterfs_init_params_t *ipars)</div><div class='del'>-{</div><div class='del'>-        glusterfs_handle_t      vmphandle = NULL;</div><div class='del'>-        int                     ret = -1;</div><div class='del'>-        char                    *vmp_resolved = NULL;</div><div class='del'>-        struct vmp_entry        *vmp_entry = NULL;</div><div class='del'>-        uint32_t                vmphash = 0;</div><div class='del'>-        </div><div class='del'>-        GF_VALIDATE_OR_GOTO (LIBGF_XL_NAME, vmp, out);</div><div class='del'>-        GF_VALIDATE_OR_GOTO (LIBGF_XL_NAME, ipars, out);</div><div class='del'>-</div><div class='del'>-        vmp_resolved = libgf_resolve_path_light (vmp);</div><div class='del'>-        if (!vmp_resolved) {</div><div class='del'>-                gf_log (LIBGF_XL_NAME, GF_LOG_ERROR, "Path compaction failed");</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        vmphash = (dev_t)ReallySimpleHash (vmp, strlen (vmp));</div><div class='del'>-        pthread_mutex_lock (&amp;mountlock);</div><div class='del'>-        {</div><div class='del'>-                vmp_entry = libgf_vmp_search_exact_entry (vmp);</div><div class='del'>-                if (vmp_entry) {</div><div class='del'>-                        gf_log (LIBGF_XL_NAME, GF_LOG_DEBUG, "Entry exists");</div><div class='del'>-                        ret = 0;</div><div class='del'>-                        goto unlock;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                vmphandle = glusterfs_init (ipars, vmphash);</div><div class='del'>-                if (!vmphandle) {</div><div class='del'>-                        errno = EINVAL;</div><div class='del'>-                        gf_log (LIBGF_XL_NAME, GF_LOG_ERROR, "GlusterFS context"</div><div class='del'>-                                " init failed");</div><div class='del'>-                        goto unlock;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                ret = libgf_vmp_map_ghandle (vmp_resolved, vmphandle);</div><div class='del'>-                if (ret == -1) {</div><div class='del'>-                        gf_log (LIBGF_XL_NAME, GF_LOG_ERROR, "Failed to map new"</div><div class='del'>-                                " handle: %s", vmp);</div><div class='del'>-                        glusterfs_fini (vmphandle);</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='del'>-unlock:</div><div class='del'>-        pthread_mutex_unlock (&amp;mountlock);</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        if (vmp_resolved)</div><div class='del'>-                FREE (vmp_resolved);</div><div class='del'>-</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-inline int</div><div class='del'>-_libgf_umount (char *vmp)</div><div class='del'>-{</div><div class='del'>-        struct vmp_entry *entry= NULL;</div><div class='del'>-        int               ret = -1;</div><div class='del'>-</div><div class='del'>-        entry = _libgf_vmp_search_entry (vmp, LIBGF_VMP_EXACT);</div><div class='del'>-        if (entry == NULL) {</div><div class='del'>-                gf_log ("libglusterfsclient", GF_LOG_ERROR,</div><div class='del'>-                        "path (%s) not mounted", vmp);</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (entry-&gt;handle == NULL) {</div><div class='del'>-                gf_log ("libglusterfsclient", GF_LOG_ERROR,</div><div class='del'>-                        "path (%s) has no corresponding glusterfs handle",</div><div class='del'>-                        vmp);</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-/*        ret = glusterfs_fini (entry-&gt;handle); */</div><div class='del'>-        list_del_init (&amp;entry-&gt;list);</div><div class='del'>-        libgf_free_vmp_entry (entry);</div><div class='del'>-</div><div class='del'>-        vmplist.entries--; </div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-inline int</div><div class='del'>-libgf_umount (char *vmp)</div><div class='del'>-{</div><div class='del'>-        int ret = -1;</div><div class='del'>-</div><div class='del'>-        pthread_mutex_lock (&amp;vmplock);</div><div class='del'>-        { </div><div class='del'>-                ret = _libgf_umount (vmp);</div><div class='del'>-        }</div><div class='del'>-        pthread_mutex_unlock (&amp;vmplock);</div><div class='del'>-        </div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-glusterfs_umount (char *vmp)</div><div class='del'>-{ </div><div class='del'>-        int    ret = -1; </div><div class='del'>-        char *vmp_resolved = NULL;</div><div class='del'>-</div><div class='del'>-        GF_VALIDATE_OR_GOTO (LIBGF_XL_NAME, vmp, out);</div><div class='del'>-</div><div class='del'>-        vmp_resolved = libgf_resolve_path_light (vmp);</div><div class='del'>-        if (!vmp_resolved) {</div><div class='del'>-                gf_log (LIBGF_XL_NAME, GF_LOG_ERROR, "Path compaction failed");</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        ret = libgf_umount (vmp_resolved);</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        if (vmp_resolved)</div><div class='del'>-                FREE (vmp_resolved);</div><div class='del'>-</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-glusterfs_umount_all (void)</div><div class='del'>-{</div><div class='del'>-        struct vmp_entry *entry = NULL, *tmp = NULL;</div><div class='del'>-</div><div class='del'>-        pthread_mutex_lock (&amp;vmplock);</div><div class='del'>-        {</div><div class='del'>-                if (vmplist.entries &gt; 0) {</div><div class='del'>-                        list_for_each_entry_safe (entry, tmp, &amp;vmplist.list,</div><div class='del'>-                                                  list) {</div><div class='del'>-                                /* even if there are errors, continue with other</div><div class='del'>-                                   mounts</div><div class='del'>-                                */</div><div class='del'>-                                _libgf_umount (entry-&gt;vmp);</div><div class='del'>-                        }</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='del'>-        pthread_mutex_unlock (&amp;vmplock);</div><div class='del'>-        </div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-void</div><div class='del'>-glusterfs_reset (void)</div><div class='del'>-{</div><div class='del'>-        INIT_LIST_HEAD (&amp;vmplist.list);</div><div class='del'>-        vmplist.entries = 0;</div><div class='del'>-</div><div class='del'>-        memset (&amp;vmplock, 0, sizeof (vmplock));</div><div class='del'>-        pthread_mutex_init (&amp;vmplock, NULL);</div><div class='del'>-</div><div class='del'>-	first_init = 1;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-void </div><div class='del'>-glusterfs_log_lock (void)</div><div class='del'>-{</div><div class='del'>-	gf_log_lock ();</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-void glusterfs_log_unlock (void)</div><div class='del'>-{</div><div class='del'>-	gf_log_unlock ();</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-void</div><div class='del'>-libgf_wait_for_frames_unwind (libglusterfs_client_ctx_t *ctx)</div><div class='del'>-{</div><div class='del'>-        call_pool_t     *pool = NULL;</div><div class='del'>-        int             canreturn = 0;</div><div class='del'>-</div><div class='del'>-        if (!ctx)</div><div class='del'>-                return;</div><div class='del'>-</div><div class='del'>-        pool = (call_pool_t *)ctx-&gt;gf_ctx.pool;</div><div class='del'>-        while (1) {</div><div class='del'>-                LOCK (&amp;pool-&gt;lock);</div><div class='del'>-                {</div><div class='del'>-                        if (pool-&gt;cnt == 0) {</div><div class='del'>-                                canreturn = 1;</div><div class='del'>-                                goto unlock_out;</div><div class='del'>-                        }</div><div class='del'>-                }</div><div class='del'>-unlock_out:</div><div class='del'>-                UNLOCK (&amp;pool-&gt;lock);</div><div class='del'>-</div><div class='del'>-                if (canreturn)</div><div class='del'>-                        break;</div><div class='del'>-</div><div class='del'>-                gf_log (LIBGF_XL_NAME, GF_LOG_DEBUG, "Waiting for call frames");</div><div class='del'>-                sleep (1);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        return;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int </div><div class='del'>-glusterfs_fini (glusterfs_handle_t handle)</div><div class='del'>-{</div><div class='del'>-	libglusterfs_client_ctx_t *ctx = handle;</div><div class='del'>-</div><div class='del'>-        libgf_wait_for_frames_unwind (ctx);</div><div class='del'>-</div><div class='del'>-	FREE (ctx-&gt;gf_ctx.cmd_args.log_file);</div><div class='del'>-	FREE (ctx-&gt;gf_ctx.cmd_args.volume_file);</div><div class='del'>-	FREE (ctx-&gt;gf_ctx.cmd_args.volume_name);</div><div class='del'>-	FREE (ctx-&gt;gf_ctx.pool);</div><div class='del'>-        FREE (ctx-&gt;gf_ctx.event_pool);</div><div class='del'>-        mem_pool_destroy (ctx-&gt;itable-&gt;inode_pool);</div><div class='del'>-	 mem_pool_destroy (ctx-&gt;itable-&gt;dentry_pool);</div><div class='del'>-	 mem_pool_destroy (ctx-&gt;itable-&gt;fd_mem_pool);</div><div class='del'>-        /* iobuf_pool_destroy (ctx-&gt;gf_ctx.iobuf_pool); */</div><div class='del'>-        ((gf_timer_registry_t *)ctx-&gt;gf_ctx.timer)-&gt;fin = 1;</div><div class='del'>-</div><div class='del'>-	xlator_graph_fini (ctx-&gt;gf_ctx.graph);</div><div class='del'>-	xlator_tree_free (ctx-&gt;gf_ctx.graph);</div><div class='del'>-	ctx-&gt;gf_ctx.graph = NULL;</div><div class='del'>-        pthread_cancel (ctx-&gt;reply_thread);</div><div class='del'>-</div><div class='del'>-        FREE (ctx);</div><div class='del'>-</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int32_t </div><div class='del'>-libgf_client_lookup_cbk (call_frame_t *frame,</div><div class='del'>-                         void *cookie,</div><div class='del'>-                         xlator_t *this,</div><div class='del'>-                         int32_t op_ret,</div><div class='del'>-                         int32_t op_errno,</div><div class='del'>-                         inode_t *inode,</div><div class='del'>-                         struct iatt *buf,</div><div class='del'>-                         dict_t *dict,</div><div class='del'>-                         struct iatt *postparent)</div><div class='del'>-{</div><div class='del'>-        libgf_client_local_t *local = frame-&gt;local;</div><div class='del'>-        libglusterfs_client_ctx_t *ctx = frame-&gt;root-&gt;state;</div><div class='del'>-	dict_t *xattr_req = NULL;</div><div class='del'>-</div><div class='del'>-        if (op_ret == 0) {</div><div class='del'>-		inode_t *parent = NULL;</div><div class='del'>-</div><div class='del'>-		if (local-&gt;fop.lookup.loc-&gt;ino == 1) {</div><div class='del'>-			buf-&gt;ia_ino = 1;</div><div class='del'>-		}</div><div class='del'>-</div><div class='del'>-		parent = local-&gt;fop.lookup.loc-&gt;parent;</div><div class='del'>-                if (inode-&gt;ino != 1) {</div><div class='del'>-                        inode = inode_link (inode, parent,</div><div class='del'>-                                            local-&gt;fop.lookup.loc-&gt;name, buf);</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                libgf_transform_iattr (ctx, inode, buf);</div><div class='del'>-		inode_lookup (inode);</div><div class='del'>-        } else {</div><div class='del'>-                if ((local-&gt;fop.lookup.is_revalidate == 0) </div><div class='del'>-                    &amp;&amp; (op_errno == ENOENT)) {</div><div class='del'>-                        gf_log ("libglusterfsclient", GF_LOG_DEBUG,</div><div class='del'>-                                "%"PRId64": (op_num=%d) %s =&gt; -1 (%s)",</div><div class='del'>-				frame-&gt;root-&gt;unique, frame-&gt;root-&gt;op,</div><div class='del'>-				local-&gt;fop.lookup.loc-&gt;path,</div><div class='del'>-				strerror (op_errno));</div><div class='del'>-                } else {</div><div class='del'>-                        gf_log ("libglusterfsclient", GF_LOG_ERROR,</div><div class='del'>-                                "%"PRId64": (op_num=%d) %s =&gt; -1 (%s)",</div><div class='del'>-				frame-&gt;root-&gt;unique, frame-&gt;root-&gt;op,</div><div class='del'>-				local-&gt;fop.lookup.loc-&gt;path,</div><div class='del'>-				strerror (op_errno));</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                if (local-&gt;fop.lookup.is_revalidate == 1) {</div><div class='del'>-			int32_t ret = 0;</div><div class='del'>-                        inode_unref (local-&gt;fop.lookup.loc-&gt;inode);</div><div class='del'>-                        local-&gt;fop.lookup.loc-&gt;inode = inode_new (ctx-&gt;itable);</div><div class='del'>-                        local-&gt;fop.lookup.is_revalidate = 2;</div><div class='del'>-</div><div class='del'>-                        if (local-&gt;fop.lookup.size &gt; 0) {</div><div class='del'>-                                xattr_req = dict_new ();</div><div class='del'>-                                ret = dict_set (xattr_req, "glusterfs.content",</div><div class='del'>-                                                data_from_uint64 (local-&gt;fop.lookup.size));</div><div class='del'>-                                if (ret == -1) {</div><div class='del'>-                                        op_ret = -1;</div><div class='del'>-                                        /* TODO: set proper error code */</div><div class='del'>-                                        op_errno = errno;</div><div class='del'>-                                        inode = NULL;</div><div class='del'>-                                        buf = NULL;</div><div class='del'>-                                        dict = NULL;</div><div class='del'>-                                        dict_unref (xattr_req);</div><div class='del'>-                                        goto out;</div><div class='del'>-                                }</div><div class='del'>-                        }</div><div class='del'>-</div><div class='del'>-                        STACK_WIND (frame, libgf_client_lookup_cbk,</div><div class='del'>-                                    FIRST_CHILD (this),</div><div class='del'>-                                    FIRST_CHILD (this)-&gt;fops-&gt;lookup,</div><div class='del'>-                                    local-&gt;fop.lookup.loc, xattr_req);</div><div class='del'>-</div><div class='del'>-			if (xattr_req) {</div><div class='del'>-				dict_unref (xattr_req);</div><div class='del'>-				xattr_req = NULL;</div><div class='del'>-			}</div><div class='del'>-</div><div class='del'>-                        return 0;</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        local-&gt;reply_stub = fop_lookup_cbk_stub (frame, NULL, op_ret, op_errno,</div><div class='del'>-                                                 inode, buf, dict, postparent);</div><div class='del'>-</div><div class='del'>-        LIBGF_REPLY_NOTIFY (local);</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-libgf_client_lookup (libglusterfs_client_ctx_t *ctx,</div><div class='del'>-                     loc_t *loc,</div><div class='del'>-                     struct iatt *stbuf,</div><div class='del'>-                     dict_t **dict,</div><div class='del'>-		     dict_t *xattr_req)</div><div class='del'>-{</div><div class='del'>-        call_stub_t  *stub = NULL;</div><div class='del'>-        int32_t op_ret;</div><div class='del'>-        libgf_client_local_t *local = NULL;</div><div class='del'>-        inode_t *inode = NULL;</div><div class='del'>-        </div><div class='del'>-        local = CALLOC (1, sizeof (*local));</div><div class='del'>-        if (!local) {</div><div class='del'>-                gf_log (LIBGF_XL_NAME, GF_LOG_ERROR, "Memory allocation"</div><div class='del'>-                        " failed");</div><div class='del'>-                errno = ENOMEM;</div><div class='del'>-                return -1;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (loc-&gt;inode) {</div><div class='del'>-                local-&gt;fop.lookup.is_revalidate = 1;</div><div class='del'>-                loc-&gt;ino = loc-&gt;inode-&gt;ino;</div><div class='del'>-        }</div><div class='del'>-        else</div><div class='del'>-                loc-&gt;inode = inode_new (ctx-&gt;itable);</div><div class='del'>-</div><div class='del'>-        local-&gt;fop.lookup.loc = loc;</div><div class='del'>-</div><div class='del'>-        LIBGF_CLIENT_FOP(ctx, stub, lookup, local, loc, xattr_req);</div><div class='del'>-</div><div class='del'>-        op_ret = stub-&gt;args.lookup_cbk.op_ret;</div><div class='del'>-        errno = stub-&gt;args.lookup_cbk.op_errno;</div><div class='del'>-</div><div class='del'>-        if (op_ret == -1)</div><div class='del'>-                goto out;</div><div class='del'>-</div><div class='del'>-        inode = stub-&gt;args.lookup_cbk.inode;</div><div class='del'>-        if (!(libgf_get_inode_ctx (inode)))</div><div class='del'>-                libgf_alloc_inode_ctx (ctx, inode);</div><div class='del'>-        libgf_transform_iattr (ctx, inode, &amp;stub-&gt;args.lookup_cbk.buf);</div><div class='del'>-        libgf_update_iattr_cache (inode, LIBGF_UPDATE_ALL,</div><div class='del'>-                                        &amp;stub-&gt;args.lookup_cbk.buf);</div><div class='del'>-        if (stbuf)</div><div class='del'>-                *stbuf = stub-&gt;args.lookup_cbk.buf;</div><div class='del'>-</div><div class='del'>-        if (dict)</div><div class='del'>-                *dict = dict_ref (stub-&gt;args.lookup_cbk.dict);</div><div class='del'>-</div><div class='del'>-        if (inode != loc-&gt;inode) {</div><div class='del'>-                inode_unref (loc-&gt;inode);</div><div class='del'>-                loc-&gt;inode = inode_ref (inode);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-	call_stub_destroy (stub);</div><div class='del'>-        return op_ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int </div><div class='del'>-glusterfs_glh_get (glusterfs_handle_t handle, const char *path, void *buf,</div><div class='del'>-                   size_t size, struct stat *stbuf)</div><div class='del'>-{</div><div class='del'>-        int32_t op_ret = -1;</div><div class='del'>-        loc_t loc = {0, };</div><div class='del'>-        libglusterfs_client_ctx_t *ctx = handle;</div><div class='del'>-        dict_t *dict = NULL;</div><div class='del'>-	dict_t *xattr_req = NULL;</div><div class='del'>-	char *name = NULL, *pathname = NULL;</div><div class='del'>-        struct iatt iatt = {0,};</div><div class='del'>-</div><div class='del'>-        GF_VALIDATE_OR_GOTO (LIBGF_XL_NAME, ctx, out);</div><div class='del'>-        GF_VALIDATE_ABSOLUTE_PATH_OR_GOTO (LIBGF_XL_NAME, path, out);</div><div class='del'>-</div><div class='del'>-        gf_log (LIBGF_XL_NAME, GF_LOG_DEBUG, "path %s, size %lu", path,</div><div class='del'>-                (long unsigned)size);</div><div class='del'>-        if (size &lt; 0) {</div><div class='del'>-                gf_log (LIBGF_XL_NAME, GF_LOG_ERROR, "Invalid size");</div><div class='del'>-                errno = EINVAL;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (size == 0) {</div><div class='del'>-                op_ret = 0;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        loc.path = strdup (path);</div><div class='del'>-        if (!loc.path) {</div><div class='del'>-                gf_log (LIBGF_XL_NAME, GF_LOG_ERROR, "Path compaction failed");</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-	op_ret = libgf_client_path_lookup (&amp;loc, ctx, 0);</div><div class='del'>-	if (op_ret == -1) {</div><div class='del'>-		gf_log ("libglusterfsclient", GF_LOG_ERROR,</div><div class='del'>-			"path lookup failed for (%s)", loc.path);</div><div class='del'>-		goto out;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	pathname = strdup (loc.path);</div><div class='del'>-	name = basename (pathname);</div><div class='del'>-</div><div class='del'>-        op_ret = libgf_client_loc_fill (&amp;loc, ctx, 0, loc.parent-&gt;ino, name);</div><div class='del'>-        if (op_ret &lt; 0) {</div><div class='del'>-                gf_log ("libglusterfsclient",</div><div class='del'>-                        GF_LOG_ERROR,</div><div class='del'>-                        "libgf_client_loc_fill returned -1, returning EINVAL");</div><div class='del'>-                errno = EINVAL;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (size) { </div><div class='del'>-                xattr_req = dict_new ();</div><div class='del'>-                op_ret = dict_set (xattr_req, "glusterfs.content",</div><div class='del'>-                                   data_from_uint64 (size));</div><div class='del'>-                if (op_ret &lt; 0) {</div><div class='del'>-                        gf_log ("libglusterfsclient",</div><div class='del'>-                                GF_LOG_ERROR,</div><div class='del'>-                                "setting requested content size dictionary failed");</div><div class='del'>-                        goto out;</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        op_ret = libgf_client_lookup (ctx, &amp;loc, &amp;iatt, &amp;dict, xattr_req);</div><div class='del'>-        iatt_to_stat (&amp;iatt, stbuf);</div><div class='del'>-        if (!op_ret &amp;&amp; stbuf &amp;&amp; (iatt.ia_size &lt;= size) &amp;&amp; dict &amp;&amp; buf) {</div><div class='del'>-                data_t *mem_data = NULL;</div><div class='del'>-                void *mem = NULL;</div><div class='del'>-                </div><div class='del'>-                mem_data = dict_get (dict, "glusterfs.content");</div><div class='del'>-                if (mem_data) {</div><div class='del'>-                        mem = data_to_ptr (mem_data);</div><div class='del'>-                }</div><div class='del'>-                        </div><div class='del'>-                if (mem != NULL) { </div><div class='del'>-                        memcpy (buf, mem, iatt.ia_size);</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-	if (xattr_req) {</div><div class='del'>-		dict_unref (xattr_req);</div><div class='del'>-	}</div><div class='del'>-        </div><div class='del'>-	if (dict) {</div><div class='del'>-		dict_unref (dict);</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	if (pathname) {</div><div class='del'>-		FREE (pathname);</div><div class='del'>-	}</div><div class='del'>-	libgf_client_loc_wipe (&amp;loc);</div><div class='del'>-</div><div class='del'>-        return op_ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-glusterfs_get (const char *path, void *buf, size_t size, struct stat *stbuf)</div><div class='del'>-{</div><div class='del'>-        int                     op_ret = -1;</div><div class='del'>-        glusterfs_handle_t      h      = NULL;</div><div class='del'>-        char                    vpath[PATH_MAX];</div><div class='del'>-</div><div class='del'>-        GF_VALIDATE_OR_GOTO (LIBGF_XL_NAME, path, out);</div><div class='del'>-        GF_VALIDATE_OR_GOTO (LIBGF_XL_NAME, buf, out);</div><div class='del'>-        GF_VALIDATE_OR_GOTO (LIBGF_XL_NAME, stbuf, out);</div><div class='del'>-</div><div class='del'>-        gf_log (LIBGF_XL_NAME, GF_LOG_DEBUG, "path %s, size %lu", path,</div><div class='del'>-                (long unsigned)size);</div><div class='del'>-</div><div class='del'>-        h = libgf_resolved_path_handle (path, vpath);</div><div class='del'>-        if (!h) {</div><div class='del'>-                errno = ENODEV;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        op_ret = glusterfs_glh_get (h, vpath, buf, size, stbuf);</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        return op_ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-libgf_client_lookup_async_cbk (call_frame_t *frame,</div><div class='del'>-                               void *cookie,</div><div class='del'>-                               xlator_t *this,</div><div class='del'>-                               int32_t op_ret,</div><div class='del'>-                               int32_t op_errno,</div><div class='del'>-                               inode_t *inode,</div><div class='del'>-                               struct iatt *stbuf,</div><div class='del'>-                               dict_t *dict,</div><div class='del'>-                               struct iatt *postparent)</div><div class='del'>-{</div><div class='del'>-        libglusterfs_client_async_local_t *local = frame-&gt;local;</div><div class='del'>-        glusterfs_get_cbk_t lookup_cbk = local-&gt;fop.lookup_cbk.cbk;</div><div class='del'>-        libglusterfs_client_ctx_t *ctx = frame-&gt;root-&gt;state;</div><div class='del'>-	glusterfs_iobuf_t *iobuf = NULL;</div><div class='del'>-	dict_t *xattr_req = NULL;</div><div class='del'>-        inode_t *parent = NULL;</div><div class='del'>-        struct stat stat = {0,};</div><div class='del'>-</div><div class='del'>-        if (op_ret == 0) {</div><div class='del'>-                parent = local-&gt;fop.lookup_cbk.loc-&gt;parent;</div><div class='del'>-                inode_link (inode, parent, local-&gt;fop.lookup_cbk.loc-&gt;name,</div><div class='del'>-                            stbuf);</div><div class='del'>-                libgf_transform_iattr (ctx, inode, stbuf);</div><div class='del'>-                if (!(libgf_get_inode_ctx (inode)))</div><div class='del'>-                        libgf_alloc_inode_ctx (ctx, inode);</div><div class='del'>-                libgf_update_iattr_cache (inode, LIBGF_UPDATE_ALL, stbuf);</div><div class='del'>-                inode_lookup (inode);</div><div class='del'>-        } else {</div><div class='del'>-                if ((local-&gt;fop.lookup_cbk.is_revalidate == 0) </div><div class='del'>-                    &amp;&amp; (op_errno == ENOENT)) {</div><div class='del'>-                        gf_log ("libglusterfsclient", GF_LOG_DEBUG,</div><div class='del'>-                                "%"PRId64": (op_num=%d) %s =&gt; -1 (%s)",</div><div class='del'>-				frame-&gt;root-&gt;unique, frame-&gt;root-&gt;op,</div><div class='del'>-				local-&gt;fop.lookup_cbk.loc-&gt;path,</div><div class='del'>-				strerror (op_errno));</div><div class='del'>-                } else {</div><div class='del'>-                        gf_log ("libglusterfsclient", GF_LOG_ERROR,</div><div class='del'>-                                "%"PRId64": (op_num=%d) %s =&gt; -1 (%s)",</div><div class='del'>-				frame-&gt;root-&gt;unique, frame-&gt;root-&gt;op,</div><div class='del'>-                                local-&gt;fop.lookup_cbk.loc-&gt;path,</div><div class='del'>-				strerror (op_errno));</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                if (local-&gt;fop.lookup_cbk.is_revalidate == 1) {</div><div class='del'>-			int32_t ret = 0;</div><div class='del'>-                        inode_unref (local-&gt;fop.lookup_cbk.loc-&gt;inode);</div><div class='del'>-                        local-&gt;fop.lookup_cbk.loc-&gt;inode = inode_new (ctx-&gt;itable);</div><div class='del'>-                        local-&gt;fop.lookup_cbk.is_revalidate = 2;</div><div class='del'>-</div><div class='del'>-                        if (local-&gt;fop.lookup_cbk.size &gt; 0) {</div><div class='del'>-                                xattr_req = dict_new ();</div><div class='del'>-                                ret = dict_set (xattr_req, "glusterfs.content",</div><div class='del'>-                                                data_from_uint64 (local-&gt;fop.lookup_cbk.size));</div><div class='del'>-                                if (ret == -1) {</div><div class='del'>-                                        op_ret = -1;</div><div class='del'>-                                        /* TODO: set proper error code */</div><div class='del'>-                                        op_errno = errno;</div><div class='del'>-                                        inode = NULL;</div><div class='del'>-                                        stbuf = NULL;</div><div class='del'>-                                        dict = NULL;</div><div class='del'>-                                        dict_unref (xattr_req);</div><div class='del'>-                                        goto out;</div><div class='del'>-                                }</div><div class='del'>-                        }</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-                        STACK_WIND (frame, libgf_client_lookup_async_cbk,</div><div class='del'>-                                    FIRST_CHILD (this),</div><div class='del'>-                                    FIRST_CHILD (this)-&gt;fops-&gt;lookup,</div><div class='del'>-                                    local-&gt;fop.lookup_cbk.loc, xattr_req);</div><div class='del'>-			</div><div class='del'>-			if (xattr_req) {</div><div class='del'>-				dict_unref (xattr_req);</div><div class='del'>-				xattr_req = NULL;</div><div class='del'>-			}</div><div class='del'>-</div><div class='del'>-                        return 0;</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        if (!op_ret &amp;&amp; local-&gt;fop.lookup_cbk.size &amp;&amp; dict) {</div><div class='del'>-                data_t *mem_data = NULL;</div><div class='del'>-                void *mem = NULL;</div><div class='del'>-		struct iovec *vector = NULL;</div><div class='del'>-</div><div class='del'>-                mem_data = dict_get (dict, "glusterfs.content");</div><div class='del'>-                if (mem_data) {</div><div class='del'>-                        mem = data_to_ptr (mem_data);</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                if (mem &amp;&amp; stbuf-&gt;ia_size &lt;= local-&gt;fop.lookup_cbk.size) {</div><div class='del'>-			iobuf = CALLOC (1, sizeof (*iobuf));</div><div class='del'>-			ERR_ABORT (iobuf);</div><div class='del'>-</div><div class='del'>-			vector = CALLOC (1, sizeof (*vector));</div><div class='del'>-			ERR_ABORT (vector);</div><div class='del'>-			vector-&gt;iov_base = mem;</div><div class='del'>-			vector-&gt;iov_len = stbuf-&gt;ia_size;  </div><div class='del'>-</div><div class='del'>-			iobuf-&gt;vector = vector;</div><div class='del'>-			iobuf-&gt;count = 1;</div><div class='del'>-			iobuf-&gt;dictref = dict_ref (dict);</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-        iatt_to_stat (stbuf, &amp;stat);</div><div class='del'>-        lookup_cbk (op_ret, op_errno, iobuf, &amp;stat, local-&gt;cbk_data);</div><div class='del'>-</div><div class='del'>-	libgf_client_loc_wipe (local-&gt;fop.lookup_cbk.loc);</div><div class='del'>-        free (local-&gt;fop.lookup_cbk.loc);</div><div class='del'>-</div><div class='del'>-        free (local);</div><div class='del'>-        frame-&gt;local = NULL;</div><div class='del'>-        STACK_DESTROY (frame-&gt;root);</div><div class='del'>-</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-/* TODO: implement async dentry lookup */</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-glusterfs_get_async (glusterfs_handle_t handle, </div><div class='del'>-		     const char *path,</div><div class='del'>-		     size_t size, </div><div class='del'>-		     glusterfs_get_cbk_t cbk,</div><div class='del'>-		     void *cbk_data)</div><div class='del'>-{</div><div class='del'>-        loc_t *loc = NULL;</div><div class='del'>-        libglusterfs_client_ctx_t *ctx = handle;</div><div class='del'>-        libglusterfs_client_async_local_t *local = NULL;</div><div class='del'>-	int32_t op_ret = 0;</div><div class='del'>-	dict_t *xattr_req = NULL;</div><div class='del'>-	char *name = NULL, *pathname = NULL;</div><div class='del'>-</div><div class='del'>-	if (!ctx || !path || path[0] != '/') {</div><div class='del'>-		errno = EINVAL;</div><div class='del'>-		op_ret = -1;</div><div class='del'>-		goto out;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-        if (size &lt; 0) {</div><div class='del'>-                errno = EINVAL;</div><div class='del'>-                op_ret = -1;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (size == 0) {</div><div class='del'>-                op_ret = 0;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        local = CALLOC (1, sizeof (*local));</div><div class='del'>-        local-&gt;fop.lookup_cbk.is_revalidate = 1;</div><div class='del'>-</div><div class='del'>-        loc = CALLOC (1, sizeof (*loc));</div><div class='del'>-	loc-&gt;path = strdup (path);</div><div class='del'>-	op_ret = libgf_client_path_lookup (loc, ctx, 1);</div><div class='del'>-	if (op_ret == -1) {</div><div class='del'>-		gf_log ("libglusterfsclient",</div><div class='del'>-			GF_LOG_ERROR,</div><div class='del'>-			"path lookup failed for (%s)", path);</div><div class='del'>-		goto out;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	pathname = strdup (path);</div><div class='del'>-	name = basename (pathname);</div><div class='del'>-        op_ret = libgf_client_loc_fill (loc, ctx, 0, loc-&gt;parent-&gt;ino, name);</div><div class='del'>-	if (op_ret &lt; 0) {</div><div class='del'>-		gf_log ("libglusterfsclient",</div><div class='del'>-			GF_LOG_ERROR,</div><div class='del'>-			"libgf_client_loc_fill returned -1, returning EINVAL");</div><div class='del'>-		errno = EINVAL;</div><div class='del'>-		goto out;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-        if (!loc-&gt;inode) {</div><div class='del'>-                loc-&gt;inode = inode_new (ctx-&gt;itable);</div><div class='del'>-                local-&gt;fop.lookup_cbk.is_revalidate = 0;</div><div class='del'>-        } </div><div class='del'>-</div><div class='del'>-        local-&gt;fop.lookup_cbk.cbk = cbk;</div><div class='del'>-        local-&gt;fop.lookup_cbk.size = size;</div><div class='del'>-        local-&gt;fop.lookup_cbk.loc = loc;</div><div class='del'>-        local-&gt;cbk_data = cbk_data;</div><div class='del'>-</div><div class='del'>-        if (size &gt; 0) {</div><div class='del'>-                xattr_req = dict_new ();</div><div class='del'>-                op_ret = dict_set (xattr_req, "glusterfs.content",</div><div class='del'>-                                   data_from_uint64 (size));</div><div class='del'>-                if (op_ret &lt; 0) {</div><div class='del'>-                        dict_unref (xattr_req);</div><div class='del'>-                        xattr_req = NULL;</div><div class='del'>-                        goto out;</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        LIBGF_CLIENT_FOP_ASYNC (ctx,</div><div class='del'>-                                local,</div><div class='del'>-                                libgf_client_lookup_async_cbk,</div><div class='del'>-                                lookup,</div><div class='del'>-                                loc,</div><div class='del'>-                                xattr_req);</div><div class='del'>-	if (xattr_req) {</div><div class='del'>-		dict_unref (xattr_req);</div><div class='del'>-		xattr_req = NULL;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-	if (pathname) {</div><div class='del'>-		FREE (pathname);</div><div class='del'>-	}</div><div class='del'>- </div><div class='del'>-        return op_ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-libgf_client_getxattr_cbk (call_frame_t *frame,</div><div class='del'>-                           void *cookie,</div><div class='del'>-                           xlator_t *this,</div><div class='del'>-                           int32_t op_ret,</div><div class='del'>-                           int32_t op_errno,</div><div class='del'>-                           dict_t *dict)</div><div class='del'>-{</div><div class='del'>-</div><div class='del'>-        libgf_client_local_t *local = frame-&gt;local;</div><div class='del'>-</div><div class='del'>-        local-&gt;reply_stub = fop_getxattr_cbk_stub (frame, NULL, op_ret,</div><div class='del'>-                                                   op_errno, dict);</div><div class='del'>-</div><div class='del'>-        LIBGF_REPLY_NOTIFY (local);</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-size_t </div><div class='del'>-libgf_client_getxattr (libglusterfs_client_ctx_t *ctx, </div><div class='del'>-                       loc_t *loc,</div><div class='del'>-                       const char *name,</div><div class='del'>-                       void *value,</div><div class='del'>-                       size_t size)</div><div class='del'>-{</div><div class='del'>-        call_stub_t  *stub = NULL;</div><div class='del'>-        int32_t op_ret = 0;</div><div class='del'>-        libgf_client_local_t *local = NULL;</div><div class='del'>-</div><div class='del'>-        LIBGF_CLIENT_FOP (ctx, stub, getxattr, local, loc, name);</div><div class='del'>-</div><div class='del'>-        op_ret = stub-&gt;args.getxattr_cbk.op_ret;</div><div class='del'>-        errno = stub-&gt;args.getxattr_cbk.op_errno;</div><div class='del'>-</div><div class='del'>-        if (op_ret &gt;= 0) {</div><div class='del'>-                /*</div><div class='del'>-                  gf_log ("LIBGF_CLIENT", GF_LOG_DEBUG,</div><div class='del'>-                  "%"PRId64": %s =&gt; %d", frame-&gt;root-&gt;unique,</div><div class='del'>-                  state-&gt;fuse_loc.loc.path, op_ret);</div><div class='del'>-                */</div><div class='del'>-</div><div class='del'>-                data_t *value_data = dict_get (stub-&gt;args.getxattr_cbk.dict,</div><div class='del'>-                                               (char *)name);</div><div class='del'>-    </div><div class='del'>-                if (value_data) {</div><div class='del'>-                        int32_t copy_len = 0;</div><div class='del'>-</div><div class='del'>-                        /* Don't return the value for '\0' */</div><div class='del'>-                        op_ret = value_data-&gt;len; </div><div class='del'>-                        if ((size &gt; 0) &amp;&amp; (value != NULL)) {</div><div class='del'>-                                copy_len = size &lt; value_data-&gt;len ? </div><div class='del'>-                                        size : value_data-&gt;len;</div><div class='del'>-                                memcpy (value, value_data-&gt;data, copy_len);</div><div class='del'>-                                op_ret = copy_len;</div><div class='del'>-                        }</div><div class='del'>-                } else {</div><div class='del'>-                        errno = ENODATA;</div><div class='del'>-                        op_ret = -1;</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='del'>-	</div><div class='del'>-	call_stub_destroy (stub);</div><div class='del'>-        return op_ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-#define LIBGF_DO_GETXATTR       1</div><div class='del'>-#define LIBGF_DO_LGETXATTR      2</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-__glusterfs_glh_getxattr (glusterfs_handle_t handle, const char *path,</div><div class='del'>-                          const char *name, void *value, size_t size,</div><div class='del'>-                          int whichop)</div><div class='del'>-{</div><div class='del'>-        int32_t op_ret = -1;</div><div class='del'>-        loc_t loc = {0, };</div><div class='del'>-	libglusterfs_client_ctx_t *ctx = handle;</div><div class='del'>-	char *file = NULL;</div><div class='del'>-        char *pathres = NULL, *tmp = NULL;</div><div class='del'>-</div><div class='del'>-        GF_VALIDATE_OR_GOTO (LIBGF_XL_NAME, ctx, out);</div><div class='del'>-        GF_VALIDATE_ABSOLUTE_PATH_OR_GOTO (LIBGF_XL_NAME, path, out);</div><div class='del'>-        GF_VALIDATE_OR_GOTO (LIBGF_XL_NAME, name, out);</div><div class='del'>-</div><div class='del'>-        gf_log (LIBGF_XL_NAME, GF_LOG_DEBUG, "path %s, name %s, size %lu,"</div><div class='del'>-                " op %d", path, name, (long unsigned)size, whichop);</div><div class='del'>-        if (name[0] == '\0') {</div><div class='del'>-		errno = EINVAL;</div><div class='del'>-                gf_log (LIBGF_XL_NAME, GF_LOG_ERROR, "Invalid argument: Name"</div><div class='del'>-                        " not NULL terminated");</div><div class='del'>-		goto out;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-        if (size &lt; 0) {</div><div class='del'>-                errno = EINVAL;</div><div class='del'>-                gf_log (LIBGF_XL_NAME, GF_LOG_ERROR, "Invalid argument: size is"</div><div class='del'>-                        " less than zero");</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        pathres = strdup (path);</div><div class='del'>-        if (!pathres) {</div><div class='del'>-                gf_log (LIBGF_XL_NAME, GF_LOG_ERROR, "strdup failed");</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        loc.path = strdup (pathres);</div><div class='del'>-	op_ret = libgf_client_path_lookup (&amp;loc, ctx, 1);</div><div class='del'>-	if (op_ret == -1) {</div><div class='del'>-                gf_log ("libglusterfsclient", GF_LOG_ERROR,</div><div class='del'>-			"path lookup failed for (%s)", loc.path);</div><div class='del'>-		goto out;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	tmp = strdup (pathres);</div><div class='del'>-	file = basename (tmp);</div><div class='del'>-        op_ret = libgf_client_loc_fill (&amp;loc, ctx, 0, loc.parent-&gt;ino, file);</div><div class='del'>-	if (op_ret == -1) {</div><div class='del'>-		gf_log ("libglusterfsclient",</div><div class='del'>-			GF_LOG_ERROR,</div><div class='del'>-			"libgf_client_loc_fill returned -1, returning EINVAL");</div><div class='del'>-		errno = EINVAL;</div><div class='del'>-		goto out;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-        if (whichop == LIBGF_DO_LGETXATTR)</div><div class='del'>-                goto do_getx;</div><div class='del'>-</div><div class='del'>-        if (!IA_ISLNK (loc.inode-&gt;ia_type))</div><div class='del'>-                goto do_getx;</div><div class='del'>-</div><div class='del'>-        libgf_client_loc_wipe (&amp;loc); </div><div class='del'>-        op_ret = libgf_realpath_loc_fill (ctx, (char *)pathres, &amp;loc);</div><div class='del'>-        if (op_ret == -1) {</div><div class='del'>-                gf_log (LIBGF_XL_NAME, GF_LOG_ERROR, "realpath failed");</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-do_getx:</div><div class='del'>-	op_ret = libgf_client_getxattr (ctx, &amp;loc, name, value, size);</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-	if (tmp) {</div><div class='del'>-		FREE (tmp);</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-        if (pathres)</div><div class='del'>-                FREE (pathres);</div><div class='del'>-</div><div class='del'>-        libgf_client_loc_wipe (&amp;loc);</div><div class='del'>-</div><div class='del'>-        return op_ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-glusterfs_glh_getxattr (glusterfs_handle_t handle, const char *path,</div><div class='del'>-                        const char *name, void *value, size_t size)</div><div class='del'>-{</div><div class='del'>-        return __glusterfs_glh_getxattr (handle, path, name, value, size,</div><div class='del'>-                                         LIBGF_DO_GETXATTR);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-glusterfs_glh_lgetxattr (glusterfs_handle_t handle, const char *path,</div><div class='del'>-                         const char *name, void *value, size_t size)</div><div class='del'>-{</div><div class='del'>-        return __glusterfs_glh_getxattr (handle, path, name, value, size,</div><div class='del'>-                                         LIBGF_DO_LGETXATTR);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-glusterfs_getxattr (const char *path, const char *name, void *value,</div><div class='del'>-                        size_t size)</div><div class='del'>-{</div><div class='del'>-        int                     op_ret = -1;</div><div class='del'>-        char                    vpath[PATH_MAX];</div><div class='del'>-        glusterfs_handle_t      h = NULL;</div><div class='del'>-</div><div class='del'>-        GF_VALIDATE_OR_GOTO (LIBGF_XL_NAME, path, out);</div><div class='del'>-        GF_VALIDATE_OR_GOTO (LIBGF_XL_NAME, name, out);</div><div class='del'>-</div><div class='del'>-        if ((size &gt; 0) &amp;&amp; (value == NULL)) {</div><div class='del'>-                errno = EINVAL;</div><div class='del'>-                gf_log (LIBGF_XL_NAME, GF_LOG_ERROR, "Invalid argument value");</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        gf_log (LIBGF_XL_NAME, GF_LOG_DEBUG, "path %s, name %s, size %lu",</div><div class='del'>-                path, name, (long unsigned)size);</div><div class='del'>-</div><div class='del'>-        h = libgf_resolved_path_handle (path, vpath);</div><div class='del'>-        if (!h) {</div><div class='del'>-                errno = ENODEV;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        op_ret = __glusterfs_glh_getxattr (h, vpath, name, value, size,</div><div class='del'>-                                           LIBGF_DO_GETXATTR);</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        return op_ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-glusterfs_lgetxattr (const char *path, const char *name, void *value,</div><div class='del'>-                     size_t size)</div><div class='del'>-{</div><div class='del'>-        int                     op_ret = -1;</div><div class='del'>-        char                    vpath[PATH_MAX];</div><div class='del'>-        glusterfs_handle_t      h = NULL;</div><div class='del'>-</div><div class='del'>-        GF_VALIDATE_OR_GOTO (LIBGF_XL_NAME, path, out);</div><div class='del'>-        GF_VALIDATE_OR_GOTO (LIBGF_XL_NAME, name, out);</div><div class='del'>-</div><div class='del'>-        if ((size &gt; 0) &amp;&amp; (value == NULL)) {</div><div class='del'>-                errno = EINVAL;</div><div class='del'>-                gf_log (LIBGF_XL_NAME, GF_LOG_ERROR, "Invalid argument value");</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        gf_log (LIBGF_XL_NAME, GF_LOG_DEBUG, "path %s, name %s, size %lu",</div><div class='del'>-                path, name, (long unsigned)size);</div><div class='del'>-</div><div class='del'>-        h = libgf_resolved_path_handle (path, vpath);</div><div class='del'>-        if (!h) {</div><div class='del'>-                errno = ENODEV;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        op_ret = __glusterfs_glh_getxattr (h, vpath, name, value, size,</div><div class='del'>-                                           LIBGF_DO_LGETXATTR);</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        return op_ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-static int32_t</div><div class='del'>-libgf_client_open_cbk (call_frame_t *frame,</div><div class='del'>-                       void *cookie,</div><div class='del'>-                       xlator_t *this,</div><div class='del'>-                       int32_t op_ret,</div><div class='del'>-                       int32_t op_errno,</div><div class='del'>-                       fd_t *fd)</div><div class='del'>-{</div><div class='del'>-        libgf_client_local_t *local = frame-&gt;local;</div><div class='del'>-</div><div class='del'>-        local-&gt;reply_stub = fop_open_cbk_stub (frame, NULL, op_ret, op_errno,</div><div class='del'>-                                               fd);</div><div class='del'>-</div><div class='del'>-        LIBGF_REPLY_NOTIFY (local);</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int </div><div class='del'>-libgf_client_open (libglusterfs_client_ctx_t *ctx, </div><div class='del'>-                   loc_t *loc, </div><div class='del'>-                   fd_t *fd, </div><div class='del'>-                   int flags)</div><div class='del'>-{</div><div class='del'>-        call_stub_t *stub = NULL;</div><div class='del'>-        int32_t op_ret = 0;</div><div class='del'>-        libgf_client_local_t *local = NULL;</div><div class='del'>-</div><div class='del'>-        LIBGF_CLIENT_FOP (ctx, stub, open, local, loc, flags, fd, 0);</div><div class='del'>-</div><div class='del'>-        op_ret = stub-&gt;args.open_cbk.op_ret;</div><div class='del'>-        errno = stub-&gt;args.open_cbk.op_errno;</div><div class='del'>-</div><div class='del'>-        gf_log (LIBGF_XL_NAME, GF_LOG_DEBUG, "open: path %s, status: %d, errno"</div><div class='del'>-                " %d", loc-&gt;path, op_ret, errno);</div><div class='del'>-        if (op_ret != -1)</div><div class='del'>-                fd_bind (fd);</div><div class='del'>-	call_stub_destroy (stub);</div><div class='del'>-        return op_ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-static int32_t</div><div class='del'>-libgf_client_create_cbk (call_frame_t *frame,</div><div class='del'>-                         void *cookie,</div><div class='del'>-                         xlator_t *this,</div><div class='del'>-                         int32_t op_ret,</div><div class='del'>-                         int32_t op_errno,</div><div class='del'>-                         fd_t *fd,</div><div class='del'>-                         inode_t *inode,</div><div class='del'>-                         struct iatt *buf,</div><div class='del'>-                         struct iatt *preparent,</div><div class='del'>-                         struct iatt *postparent)</div><div class='del'>-{</div><div class='del'>-        libgf_client_local_t *local = frame-&gt;local;</div><div class='del'>-</div><div class='del'>-        local-&gt;reply_stub = fop_create_cbk_stub (frame, NULL, op_ret, op_errno,</div><div class='del'>-                                                 fd, inode, buf, preparent,</div><div class='del'>-                                                 postparent);</div><div class='del'>-</div><div class='del'>-        LIBGF_REPLY_NOTIFY (local);</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int </div><div class='del'>-libgf_client_creat (libglusterfs_client_ctx_t *ctx,</div><div class='del'>-                    loc_t *loc,</div><div class='del'>-                    fd_t *fd,</div><div class='del'>-                    int flags,</div><div class='del'>-                    mode_t mode)</div><div class='del'>-{</div><div class='del'>-        call_stub_t *stub = NULL;</div><div class='del'>-        int32_t op_ret = 0;</div><div class='del'>-        libgf_client_local_t *local = NULL;</div><div class='del'>-        inode_t *libgf_inode = NULL;</div><div class='del'>-</div><div class='del'>-        LIBGF_CLIENT_FOP (ctx, stub, create, local, loc, flags, mode, fd);</div><div class='del'>-  </div><div class='del'>-        op_ret = stub-&gt;args.create_cbk.op_ret;</div><div class='del'>-        errno = stub-&gt;args.create_cbk.op_errno;</div><div class='del'>-        gf_log (LIBGF_XL_NAME, GF_LOG_DEBUG, "Create: path %s, status: %d,"</div><div class='del'>-                " errno: %d", loc-&gt;path, op_ret, errno);</div><div class='del'>-        if (op_ret == -1)</div><div class='del'>-                goto out;</div><div class='del'>-</div><div class='del'>-	libgf_inode = stub-&gt;args.create_cbk.inode;</div><div class='del'>-        inode_link (libgf_inode, loc-&gt;parent, loc-&gt;name,</div><div class='del'>-                        &amp;stub-&gt;args.create_cbk.buf);</div><div class='del'>-        libgf_transform_iattr (ctx, libgf_inode, &amp;stub-&gt;args.create_cbk.buf);</div><div class='del'>-</div><div class='del'>-        inode_lookup (libgf_inode);</div><div class='del'>-</div><div class='del'>-        libgf_alloc_inode_ctx (ctx, libgf_inode);</div><div class='del'>-        libgf_update_iattr_cache (libgf_inode, LIBGF_UPDATE_ALL,</div><div class='del'>-                                        &amp;stub-&gt;args.create_cbk.buf);</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-	call_stub_destroy (stub);</div><div class='del'>-        return op_ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-libgf_client_opendir_cbk (call_frame_t *frame,</div><div class='del'>-                          void *cookie,</div><div class='del'>-                          xlator_t *this,</div><div class='del'>-                          int32_t op_ret,</div><div class='del'>-                          int32_t op_errno,</div><div class='del'>-                          fd_t *fd)</div><div class='del'>-{</div><div class='del'>-        libgf_client_local_t *local = frame-&gt;local;</div><div class='del'>-</div><div class='del'>-        local-&gt;reply_stub = fop_opendir_cbk_stub (frame, NULL, op_ret, op_errno,</div><div class='del'>-                                                  fd);</div><div class='del'>-</div><div class='del'>-        LIBGF_REPLY_NOTIFY (local);</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int </div><div class='del'>-libgf_client_opendir (libglusterfs_client_ctx_t *ctx,</div><div class='del'>-                      loc_t *loc,</div><div class='del'>-                      fd_t *fd)</div><div class='del'>-{</div><div class='del'>-        call_stub_t *stub = NULL;</div><div class='del'>-        int32_t op_ret = -1;</div><div class='del'>-        libgf_client_local_t *local = NULL;</div><div class='del'>-</div><div class='del'>-        if (((fd-&gt;flags &amp; O_ACCMODE) == O_WRONLY)</div><div class='del'>-                || ((fd-&gt;flags &amp; O_ACCMODE) == O_RDWR)) {</div><div class='del'>-                errno = EISDIR;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-        LIBGF_CLIENT_FOP (ctx, stub, opendir, local, loc, fd);</div><div class='del'>-</div><div class='del'>-        op_ret = stub-&gt;args.opendir_cbk.op_ret;</div><div class='del'>-        errno = stub-&gt;args.opendir_cbk.op_errno;</div><div class='del'>-        gf_log (LIBGF_XL_NAME, GF_LOG_DEBUG, "opendir: path %s, status %d,"</div><div class='del'>-                " errno %d", loc-&gt;path, op_ret, errno);</div><div class='del'>-        if (op_ret != -1)</div><div class='del'>-                fd_bind (fd);</div><div class='del'>-</div><div class='del'>-	call_stub_destroy (stub);</div><div class='del'>-out:</div><div class='del'>-        return op_ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-glusterfs_file_t </div><div class='del'>-glusterfs_glh_open (glusterfs_handle_t handle, const char *path, int flags,...)</div><div class='del'>-{</div><div class='del'>-        loc_t loc = {0, };</div><div class='del'>-        long op_ret = -1;</div><div class='del'>-        fd_t *fd = NULL;</div><div class='del'>-	int32_t ret = -1;</div><div class='del'>-	libglusterfs_client_ctx_t *ctx = handle;</div><div class='del'>-	char *name = NULL, *pathname = NULL;</div><div class='del'>-        libglusterfs_client_inode_ctx_t *inode_ctx = NULL;</div><div class='del'>-        mode_t mode = 0;</div><div class='del'>-        va_list ap;</div><div class='del'>-        char *pathres = NULL;</div><div class='del'>-        char *vpath = NULL;</div><div class='del'>-</div><div class='del'>-        GF_VALIDATE_OR_GOTO (LIBGF_XL_NAME, ctx, out);</div><div class='del'>-        GF_VALIDATE_ABSOLUTE_PATH_OR_GOTO (LIBGF_XL_NAME, path, out);</div><div class='del'>-</div><div class='del'>-        pathres = strdup (path);</div><div class='del'>-        if (!pathres) {</div><div class='del'>-                gf_log (LIBGF_XL_NAME, GF_LOG_ERROR, "strdup failed");</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-	loc.path = strdup (pathres);</div><div class='del'>-	op_ret = libgf_client_path_lookup (&amp;loc, ctx, 1);</div><div class='del'>-</div><div class='del'>-        if ((op_ret == -1) &amp;&amp; ((flags &amp; O_CREAT) != O_CREAT)) {</div><div class='del'>-		gf_log ("libglusterfsclient", GF_LOG_ERROR,</div><div class='del'>-			"path lookup failed for (%s)", loc.path);</div><div class='del'>-		goto out;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-        if (!op_ret &amp;&amp; ((flags &amp; O_CREAT) == O_CREAT) </div><div class='del'>-            &amp;&amp; ((flags &amp; O_EXCL) == O_EXCL)) {</div><div class='del'>-                errno = EEXIST;</div><div class='del'>-                op_ret = -1;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (op_ret == 0) {</div><div class='del'>-                flags &amp;= ~O_CREAT;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if ((op_ret == -1) &amp;&amp; ((flags &amp; O_CREAT) == O_CREAT)) {</div><div class='del'>-                libgf_client_loc_wipe (&amp;loc);</div><div class='del'>-                loc.path = strdup (pathres);</div><div class='del'>-</div><div class='del'>-                op_ret = libgf_client_path_lookup (&amp;loc, ctx, 0);</div><div class='del'>-                if (op_ret == -1) {</div><div class='del'>-                        gf_log ("libglusterfsclient", GF_LOG_ERROR,</div><div class='del'>-                                "path lookup failed for parent while trying to"</div><div class='del'>-                                " create (%s)", pathres);</div><div class='del'>-                        goto out;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                loc.inode = inode_new (ctx-&gt;itable);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-	pathname = strdup (pathres);</div><div class='del'>-	name = basename (pathname);</div><div class='del'>-</div><div class='del'>-        ret = libgf_client_loc_fill (&amp;loc, ctx, 0, loc.parent-&gt;ino, name);</div><div class='del'>-	if (ret == -1) {</div><div class='del'>-		gf_log ("libglusterfsclient",</div><div class='del'>-			GF_LOG_ERROR,</div><div class='del'>-			"libgf_client_loc_fill returned -1, returning EINVAL");</div><div class='del'>-		errno = EINVAL;</div><div class='del'>-		goto out;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-        fd = fd_create (loc.inode, ctx-&gt;pid);</div><div class='del'>-        fd-&gt;flags = flags;</div><div class='del'>-</div><div class='del'>-        if (((flags &amp; O_CREAT) == O_CREAT)) {</div><div class='del'>-                /* If we have the st_mode for the basename, check if</div><div class='del'>-                 * it is a directory here itself, rather than sending</div><div class='del'>-                 * a network message through libgf_client_creat, and</div><div class='del'>-                 * then receiving a EISDIR.</div><div class='del'>-                 */</div><div class='del'>-                if (IA_ISDIR (loc.inode-&gt;ia_type)) {</div><div class='del'>-                        errno = EISDIR;</div><div class='del'>-                        op_ret = -1;</div><div class='del'>-                        goto op_over;</div><div class='del'>-                }</div><div class='del'>-                va_start (ap, flags);</div><div class='del'>-                mode = va_arg (ap, mode_t);</div><div class='del'>-                va_end (ap);</div><div class='del'>-                op_ret = libgf_client_creat (ctx, &amp;loc, fd, flags, mode);</div><div class='del'>-        } else {</div><div class='del'>-                if (IA_ISDIR (loc.inode-&gt;ia_type))</div><div class='del'>-                        op_ret = libgf_client_opendir (ctx, &amp;loc, fd);</div><div class='del'>-                else</div><div class='del'>-                        op_ret = libgf_client_open (ctx, &amp;loc, fd, flags);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-op_over:</div><div class='del'>-        if (op_ret == -1) {</div><div class='del'>-                fd_unref (fd);</div><div class='del'>-                fd = NULL;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        vpath = NULL;</div><div class='del'>-        if (IA_ISDIR (loc.inode-&gt;ia_type)) {</div><div class='del'>-                vpath = (char *)path;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (!libgf_get_fd_ctx (fd)) {</div><div class='del'>-                if (!libgf_alloc_fd_ctx (ctx, fd, vpath)) {</div><div class='del'>-                        gf_log (LIBGF_XL_NAME, GF_LOG_ERROR, "Failed to"</div><div class='del'>-                                " allocate fd context");</div><div class='del'>-                        errno = EINVAL;</div><div class='del'>-                        op_ret = -1;</div><div class='del'>-                        goto out;</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if ((flags &amp; O_TRUNC) &amp;&amp; (((flags &amp; O_ACCMODE) == O_RDWR)</div><div class='del'>-                                  || ((flags &amp; O_ACCMODE) == O_WRONLY))) {</div><div class='del'>-                inode_ctx = libgf_get_inode_ctx (fd-&gt;inode);</div><div class='del'>-                if (IA_ISREG (inode_ctx-&gt;stbuf.ia_type)) {</div><div class='del'>-                                inode_ctx-&gt;stbuf.ia_size = 0;</div><div class='del'>-                                inode_ctx-&gt;stbuf.ia_blocks = 0;</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        libgf_client_loc_wipe (&amp;loc);</div><div class='del'>-</div><div class='del'>-	if (pathname) {</div><div class='del'>-		FREE (pathname);</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-        if (pathres)</div><div class='del'>-                FREE (pathres);</div><div class='del'>-</div><div class='del'>-        return fd;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-glusterfs_file_t</div><div class='del'>-glusterfs_open (const char *path, int flags, ...)</div><div class='del'>-{</div><div class='del'>-        va_list                 ap;</div><div class='del'>-        glusterfs_file_t        fh   = NULL;</div><div class='del'>-        glusterfs_handle_t      h    = NULL; </div><div class='del'>-        mode_t                  mode = 0;</div><div class='del'>-        char                    vpath[PATH_MAX];</div><div class='del'>-</div><div class='del'>-        GF_VALIDATE_OR_GOTO (LIBGF_XL_NAME, path, out);</div><div class='del'>-</div><div class='del'>-        gf_log (LIBGF_XL_NAME, GF_LOG_DEBUG, "path %s", path);</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-        h = libgf_resolved_path_handle (path, vpath);</div><div class='del'>-        if (!h) {</div><div class='del'>-                errno = ENODEV;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (flags &amp; O_CREAT) {</div><div class='del'>-                va_start (ap, flags);</div><div class='del'>-                mode = va_arg (ap, mode_t);</div><div class='del'>-                va_end (ap);</div><div class='del'>-                fh = glusterfs_glh_open (h, vpath, flags, mode);</div><div class='del'>-        } else</div><div class='del'>-                fh = glusterfs_glh_open (h, vpath, flags);</div><div class='del'>-out:</div><div class='del'>-        return fh;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-glusterfs_file_t </div><div class='del'>-glusterfs_glh_creat (glusterfs_handle_t handle, const char *path, mode_t mode)</div><div class='del'>-{</div><div class='del'>-        gf_log (LIBGF_XL_NAME, GF_LOG_DEBUG, "path %s", path);</div><div class='del'>-	return glusterfs_glh_open (handle, path,</div><div class='del'>-			       (O_CREAT | O_WRONLY | O_TRUNC), mode);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-glusterfs_file_t</div><div class='del'>-glusterfs_creat (const char *path, mode_t mode)</div><div class='del'>-{</div><div class='del'>-        glusterfs_file_t        fh = NULL;</div><div class='del'>-        char                    vpath[PATH_MAX];</div><div class='del'>-        glusterfs_handle_t      h = NULL;</div><div class='del'>-</div><div class='del'>-        GF_VALIDATE_OR_GOTO (LIBGF_XL_NAME, path, out);</div><div class='del'>-</div><div class='del'>-        gf_log (LIBGF_XL_NAME, GF_LOG_DEBUG, "path %s", path);</div><div class='del'>-</div><div class='del'>-        h = libgf_resolved_path_handle (path, vpath);</div><div class='del'>-        if (!h) {</div><div class='del'>-                errno = ENODEV;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        fh = glusterfs_glh_creat (h, vpath, mode);</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        return fh;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-libgf_client_flush_cbk (call_frame_t *frame,</div><div class='del'>-                        void *cookie,</div><div class='del'>-                        xlator_t *this,</div><div class='del'>-                        int32_t op_ret,</div><div class='del'>-                        int32_t op_errno)</div><div class='del'>-{</div><div class='del'>-        libgf_client_local_t *local = frame-&gt;local;</div><div class='del'>-        </div><div class='del'>-        local-&gt;reply_stub = fop_flush_cbk_stub (frame, NULL, op_ret, op_errno);</div><div class='del'>-        </div><div class='del'>-        LIBGF_REPLY_NOTIFY (local);</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int </div><div class='del'>-libgf_client_flush (libglusterfs_client_ctx_t *ctx, fd_t *fd)</div><div class='del'>-{</div><div class='del'>-        call_stub_t *stub;</div><div class='del'>-        int32_t op_ret;</div><div class='del'>-        libgf_client_local_t *local = NULL;</div><div class='del'>-</div><div class='del'>-        LIBGF_CLIENT_FOP (ctx, stub, flush, local, fd);</div><div class='del'>-        </div><div class='del'>-        op_ret = stub-&gt;args.flush_cbk.op_ret;</div><div class='del'>-        errno = stub-&gt;args.flush_cbk.op_errno;</div><div class='del'>-        </div><div class='del'>-	call_stub_destroy (stub);        </div><div class='del'>-        return op_ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int </div><div class='del'>-glusterfs_close (glusterfs_file_t fd)</div><div class='del'>-{</div><div class='del'>-        int32_t op_ret = -1;</div><div class='del'>-        libglusterfs_client_ctx_t *ctx = NULL;</div><div class='del'>-        libglusterfs_client_fd_ctx_t *fd_ctx = NULL;</div><div class='del'>-</div><div class='del'>-        if (!fd) {</div><div class='del'>-                errno = EINVAL;</div><div class='del'>-		goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        fd_ctx = libgf_get_fd_ctx (fd);</div><div class='del'>-        if (!fd_ctx) {</div><div class='del'>-                gf_log (LIBGF_XL_NAME, GF_LOG_ERROR, "No fd context present");</div><div class='del'>-                errno = EBADF;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-        ctx = fd_ctx-&gt;ctx;</div><div class='del'>-</div><div class='del'>-        op_ret = libgf_client_flush (ctx, (fd_t *)fd);</div><div class='del'>-</div><div class='del'>-        fd_unref ((fd_t *)fd);</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        return op_ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-libgf_client_setxattr_cbk (call_frame_t *frame,</div><div class='del'>-                           void *cookie,</div><div class='del'>-                           xlator_t *this,</div><div class='del'>-                           int32_t op_ret,</div><div class='del'>-                           int32_t op_errno)</div><div class='del'>-{</div><div class='del'>-        libgf_client_local_t *local = frame-&gt;local;</div><div class='del'>-</div><div class='del'>-        local-&gt;reply_stub = fop_setxattr_cbk_stub (frame, NULL, op_ret,</div><div class='del'>-                                                   op_errno);</div><div class='del'>-</div><div class='del'>-        LIBGF_REPLY_NOTIFY (local);</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-libgf_client_setxattr (libglusterfs_client_ctx_t *ctx, </div><div class='del'>-                       loc_t *loc,</div><div class='del'>-                       const char *name,</div><div class='del'>-                       const void *value,</div><div class='del'>-                       size_t size,</div><div class='del'>-                       int flags)</div><div class='del'>-{</div><div class='del'>-        call_stub_t  *stub = NULL;</div><div class='del'>-        int32_t op_ret = 0;</div><div class='del'>-        dict_t *dict;</div><div class='del'>-        libgf_client_local_t *local = NULL;</div><div class='del'>-</div><div class='del'>-        dict = get_new_dict ();</div><div class='del'>-</div><div class='del'>-        dict_set (dict, (char *)name,</div><div class='del'>-                  bin_to_data ((void *)value, size));</div><div class='del'>-        dict_ref (dict);</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-        LIBGF_CLIENT_FOP (ctx, stub, setxattr, local, loc, dict, flags);</div><div class='del'>-</div><div class='del'>-        op_ret = stub-&gt;args.setxattr_cbk.op_ret;</div><div class='del'>-        errno = stub-&gt;args.setxattr_cbk.op_errno;</div><div class='del'>-</div><div class='del'>-        gf_log (LIBGF_XL_NAME, GF_LOG_ERROR, "path %s, name %s, status %d,"</div><div class='del'>-                "errno %d", loc-&gt;path, name, op_ret, errno);</div><div class='del'>-        dict_unref (dict);</div><div class='del'>-	call_stub_destroy (stub);</div><div class='del'>-        return op_ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-#define LIBGF_DO_SETXATTR       1</div><div class='del'>-#define LIBGF_DO_LSETXATTR      2</div><div class='del'>-</div><div class='del'>-int </div><div class='del'>-__glusterfs_glh_setxattr (glusterfs_handle_t handle, const char *path,</div><div class='del'>-                          const char *name, const void *value,</div><div class='del'>-                          size_t size, int flags, int whichop)</div><div class='del'>-{</div><div class='del'>-        int32_t op_ret = -1;</div><div class='del'>-        loc_t loc = {0, };</div><div class='del'>-	libglusterfs_client_ctx_t *ctx = handle;</div><div class='del'>-        char *tmppath = NULL;</div><div class='del'>-        loc_t *realloc = NULL;</div><div class='del'>-        char *pathres = NULL;</div><div class='del'>-</div><div class='del'>-        GF_VALIDATE_OR_GOTO (LIBGF_XL_NAME, ctx, out);</div><div class='del'>-        GF_VALIDATE_ABSOLUTE_PATH_OR_GOTO (LIBGF_XL_NAME, path, out);</div><div class='del'>-</div><div class='del'>-        gf_log (LIBGF_XL_NAME, GF_LOG_ERROR, "path %s, name %s, op %d", path</div><div class='del'>-                ,name, whichop);</div><div class='del'>-        if (size &lt;= 0) {</div><div class='del'>-                errno = EINVAL;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        pathres = strdup (path);</div><div class='del'>-        if (!pathres) {</div><div class='del'>-                gf_log (LIBGF_XL_NAME, GF_LOG_ERROR, "strdup failed");</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        loc.path = strdup (pathres);</div><div class='del'>-	op_ret = libgf_client_path_lookup (&amp;loc, ctx, 1);</div><div class='del'>-	if (op_ret == -1) {</div><div class='del'>-		gf_log ("libglusterfsclient", GF_LOG_ERROR,</div><div class='del'>-			"path lookup failed for (%s)", pathres);</div><div class='del'>-		goto out;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-        tmppath = strdup (pathres);</div><div class='del'>-</div><div class='del'>-        op_ret = libgf_client_loc_fill (&amp;loc, ctx, 0, loc.parent-&gt;ino,</div><div class='del'>-                                        basename (tmppath));</div><div class='del'>-        FREE (tmppath);</div><div class='del'>-	if (op_ret == -1) {</div><div class='del'>-		gf_log ("libglusterfsclient",</div><div class='del'>-			GF_LOG_ERROR,</div><div class='del'>-			"libgf_client_loc_fill returned -1, returning EINVAL");</div><div class='del'>-		errno = EINVAL;</div><div class='del'>-		goto out;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-        realloc = &amp;loc;</div><div class='del'>-        if (whichop == LIBGF_DO_LSETXATTR)</div><div class='del'>-                goto do_setx;</div><div class='del'>-</div><div class='del'>-        if (!IA_ISLNK (loc.inode-&gt;ia_type))</div><div class='del'>-                goto do_setx;</div><div class='del'>-</div><div class='del'>-        libgf_client_loc_wipe (&amp;loc);</div><div class='del'>-        realloc = &amp;loc;</div><div class='del'>-        libgf_realpath_loc_fill (ctx, (char *)pathres, realloc);</div><div class='del'>-</div><div class='del'>-do_setx:</div><div class='del'>-        if (!op_ret)</div><div class='del'>-                op_ret = libgf_client_setxattr (ctx, realloc, name, value,</div><div class='del'>-                                                size, flags);</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        if (pathres)</div><div class='del'>-                FREE (pathres);</div><div class='del'>-</div><div class='del'>-        libgf_client_loc_wipe (realloc);</div><div class='del'>-        return op_ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-glusterfs_glh_setxattr (glusterfs_handle_t handle, const char *path,</div><div class='del'>-                        const char *name, const void *value, size_t size,</div><div class='del'>-                        int flags)</div><div class='del'>-{</div><div class='del'>-        return __glusterfs_glh_setxattr (handle, path, name, value, size, flags</div><div class='del'>-                                         , LIBGF_DO_SETXATTR);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-glusterfs_glh_lsetxattr (glusterfs_handle_t handle, const char *path,</div><div class='del'>-                         const char *name, const void *value, size_t size,</div><div class='del'>-                         int flags)</div><div class='del'>-{</div><div class='del'>-        return __glusterfs_glh_setxattr (handle, path, name, value, size, flags</div><div class='del'>-                                         , LIBGF_DO_LSETXATTR);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-glusterfs_setxattr (const char *path, const char *name, const void *value,</div><div class='del'>-                        size_t size, int flags)</div><div class='del'>-{</div><div class='del'>-        int                     op_ret = -1;</div><div class='del'>-        char                    vpath[PATH_MAX];</div><div class='del'>-        glusterfs_handle_t      h = NULL;</div><div class='del'>-</div><div class='del'>-        GF_VALIDATE_OR_GOTO (LIBGF_XL_NAME, path, out);</div><div class='del'>-        GF_VALIDATE_OR_GOTO (LIBGF_XL_NAME, name, out);</div><div class='del'>-        GF_VALIDATE_OR_GOTO (LIBGF_XL_NAME, value, out);</div><div class='del'>-</div><div class='del'>-        gf_log (LIBGF_XL_NAME, GF_LOG_ERROR, "path %s, name %s", path, name);</div><div class='del'>-</div><div class='del'>-        h = libgf_resolved_path_handle (path, vpath);</div><div class='del'>-        if (!h) {</div><div class='del'>-                errno = ENODEV;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        op_ret = __glusterfs_glh_setxattr (h, vpath, name, value, size, flags,</div><div class='del'>-                                           LIBGF_DO_SETXATTR);</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        return op_ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-glusterfs_lsetxattr (const char *path, const char *name, const void *value,</div><div class='del'>-                     size_t size, int flags)</div><div class='del'>-{</div><div class='del'>-        int                     op_ret = -1;</div><div class='del'>-        char                    vpath[PATH_MAX];</div><div class='del'>-        glusterfs_handle_t      h = NULL;</div><div class='del'>-</div><div class='del'>-        GF_VALIDATE_OR_GOTO (LIBGF_XL_NAME, path, out);</div><div class='del'>-        GF_VALIDATE_OR_GOTO (LIBGF_XL_NAME, name, out);</div><div class='del'>-        GF_VALIDATE_OR_GOTO (LIBGF_XL_NAME, value, out);</div><div class='del'>-</div><div class='del'>-        gf_log (LIBGF_XL_NAME, GF_LOG_ERROR, "path %s, name %s", path, name);</div><div class='del'>-</div><div class='del'>-        h = libgf_resolved_path_handle (path, vpath);</div><div class='del'>-        if (!h) {</div><div class='del'>-                errno = ENODEV;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        op_ret = __glusterfs_glh_setxattr (h, vpath, name, value, size, flags,</div><div class='del'>-                                           LIBGF_DO_LSETXATTR);</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        return op_ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-libgf_client_fsetxattr_cbk (call_frame_t *frame,</div><div class='del'>-                            void *cookie,</div><div class='del'>-                            xlator_t *this,</div><div class='del'>-                            int32_t op_ret,</div><div class='del'>-                            int32_t op_errno)</div><div class='del'>-{</div><div class='del'>-        libgf_client_local_t *local = frame-&gt;local;</div><div class='del'>-</div><div class='del'>-        local-&gt;reply_stub = fop_fsetxattr_cbk_stub (frame, NULL, op_ret,</div><div class='del'>-                                                    op_errno);</div><div class='del'>-</div><div class='del'>-        LIBGF_REPLY_NOTIFY (local);</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-libgf_client_fsetxattr (libglusterfs_client_ctx_t *ctx, </div><div class='del'>-                        fd_t *fd,</div><div class='del'>-                        const char *name,</div><div class='del'>-                        const void *value,</div><div class='del'>-                        size_t size,</div><div class='del'>-                        int flags)</div><div class='del'>-{</div><div class='del'>-        call_stub_t  *stub = NULL;</div><div class='del'>-        int32_t op_ret = 0;</div><div class='del'>-        dict_t *dict;</div><div class='del'>-        libgf_client_local_t *local = NULL;</div><div class='del'>-</div><div class='del'>-        dict = get_new_dict ();</div><div class='del'>-</div><div class='del'>-        dict_set (dict, (char *)name,</div><div class='del'>-                  bin_to_data ((void *)value, size));</div><div class='del'>-        dict_ref (dict);</div><div class='del'>-</div><div class='del'>-        LIBGF_CLIENT_FOP (ctx, stub, fsetxattr, local, fd, dict, flags);</div><div class='del'>-</div><div class='del'>-        op_ret = stub-&gt;args.fsetxattr_cbk.op_ret;</div><div class='del'>-        errno = stub-&gt;args.fsetxattr_cbk.op_errno;</div><div class='del'>-</div><div class='del'>-        gf_log (LIBGF_XL_NAME, GF_LOG_ERROR, "name %s, status %d, errno %d",</div><div class='del'>-                name, op_ret, errno);</div><div class='del'>-        dict_unref (dict);</div><div class='del'>-	call_stub_destroy (stub);</div><div class='del'>-</div><div class='del'>-        return op_ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int </div><div class='del'>-glusterfs_fsetxattr (glusterfs_file_t fd, </div><div class='del'>-                     const char *name,</div><div class='del'>-                     const void *value, </div><div class='del'>-                     size_t size, </div><div class='del'>-                     int flags)</div><div class='del'>-{</div><div class='del'>-	int32_t op_ret = 0;</div><div class='del'>-        fd_t *__fd = fd;</div><div class='del'>-        libglusterfs_client_fd_ctx_t *fd_ctx = NULL;</div><div class='del'>-        libglusterfs_client_ctx_t *ctx = NULL;</div><div class='del'>-        </div><div class='del'>-        if (!fd) {</div><div class='del'>-                errno = EINVAL;</div><div class='del'>-                op_ret = -1;</div><div class='del'>-                gf_log("libglusterfsclient",</div><div class='del'>-                       GF_LOG_ERROR,</div><div class='del'>-                       "invalid fd");</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (size &lt;= 0) {</div><div class='del'>-                gf_log (LIBGF_XL_NAME, GF_LOG_ERROR, "Invalid argument: size is"</div><div class='del'>-                        " less than or equal to zero");</div><div class='del'>-                errno = EINVAL;</div><div class='del'>-                op_ret = -1;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        fd_ctx = libgf_get_fd_ctx (fd);</div><div class='del'>-        if (!fd_ctx) {</div><div class='del'>-                gf_log (LIBGF_XL_NAME, GF_LOG_ERROR, "No fd context present");</div><div class='del'>-                errno = EBADF;</div><div class='del'>-		op_ret = -1;</div><div class='del'>-		goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        ctx = fd_ctx-&gt;ctx;</div><div class='del'>-        op_ret = libgf_client_fsetxattr (ctx, __fd, name, value, size,</div><div class='del'>-                                         flags);</div><div class='del'>-        </div><div class='del'>-out:</div><div class='del'>-	return op_ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-libgf_client_fgetxattr_cbk (call_frame_t *frame,</div><div class='del'>-                            void *cookie,</div><div class='del'>-                            xlator_t *this,</div><div class='del'>-                            int32_t op_ret,</div><div class='del'>-                            int32_t op_errno,</div><div class='del'>-                            dict_t *dict)</div><div class='del'>-{</div><div class='del'>-</div><div class='del'>-        libgf_client_local_t *local = frame-&gt;local;</div><div class='del'>-</div><div class='del'>-        local-&gt;reply_stub = fop_fgetxattr_cbk_stub (frame, NULL, op_ret,</div><div class='del'>-                                                    op_errno, dict);</div><div class='del'>-</div><div class='del'>-        LIBGF_REPLY_NOTIFY (local);</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-size_t </div><div class='del'>-libgf_client_fgetxattr (libglusterfs_client_ctx_t *ctx, </div><div class='del'>-                        fd_t *fd,</div><div class='del'>-                        const char *name,</div><div class='del'>-                        void *value,</div><div class='del'>-                        size_t size)</div><div class='del'>-{</div><div class='del'>-        call_stub_t  *stub = NULL;</div><div class='del'>-        int32_t op_ret = 0;</div><div class='del'>-        libgf_client_local_t *local = NULL;</div><div class='del'>-</div><div class='del'>-        LIBGF_CLIENT_FOP (ctx, stub, fgetxattr, local, fd, name);</div><div class='del'>-</div><div class='del'>-        op_ret = stub-&gt;args.fgetxattr_cbk.op_ret;</div><div class='del'>-        errno = stub-&gt;args.fgetxattr_cbk.op_errno;</div><div class='del'>-</div><div class='del'>-        if (op_ret &gt;= 0) {</div><div class='del'>-                /*</div><div class='del'>-                  gf_log ("LIBGF_CLIENT", GF_LOG_DEBUG,</div><div class='del'>-                  "%"PRId64": %s =&gt; %d", frame-&gt;root-&gt;unique,</div><div class='del'>-                  state-&gt;fuse_loc.loc.path, op_ret);</div><div class='del'>-                */</div><div class='del'>-</div><div class='del'>-                data_t *value_data = dict_get (stub-&gt;args.fgetxattr_cbk.dict,</div><div class='del'>-                                               (char *)name);</div><div class='del'>-    </div><div class='del'>-                if (value_data) {</div><div class='del'>-                        int32_t copy_len = 0;</div><div class='del'>-</div><div class='del'>-                        /* Don't return the value for '\0' */</div><div class='del'>-                        op_ret = value_data-&gt;len; </div><div class='del'>-                        copy_len = size &lt; value_data-&gt;len ? </div><div class='del'>-                                size : value_data-&gt;len;</div><div class='del'>-                        memcpy (value, value_data-&gt;data, copy_len);</div><div class='del'>-                } else {</div><div class='del'>-                        errno = ENODATA;</div><div class='del'>-                        op_ret = -1;</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='del'>-	</div><div class='del'>-        gf_log (LIBGF_XL_NAME, GF_LOG_DEBUG, "name %s, status %d, errno %d",</div><div class='del'>-                name, op_ret, errno);</div><div class='del'>-	call_stub_destroy (stub);</div><div class='del'>-        return op_ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-ssize_t </div><div class='del'>-glusterfs_fgetxattr (glusterfs_file_t fd, </div><div class='del'>-                     const char *name,</div><div class='del'>-                     void *value, </div><div class='del'>-                     size_t size)</div><div class='del'>-{</div><div class='del'>-	int32_t op_ret = 0;</div><div class='del'>-        libglusterfs_client_ctx_t *ctx;</div><div class='del'>-        fd_t *__fd = (fd_t *)fd;</div><div class='del'>-        libglusterfs_client_fd_ctx_t *fd_ctx = NULL;</div><div class='del'>-</div><div class='del'>-        gf_log (LIBGF_XL_NAME, GF_LOG_DEBUG, "name %s", name);</div><div class='del'>-        if (size &lt; 0) {</div><div class='del'>-                errno = EINVAL;</div><div class='del'>-                op_ret = -1;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (size == 0)</div><div class='del'>-                goto out;</div><div class='del'>-</div><div class='del'>-        fd_ctx = libgf_get_fd_ctx (fd);</div><div class='del'>-        if (!fd_ctx) {</div><div class='del'>-                gf_log (LIBGF_XL_NAME, GF_LOG_ERROR, "No fd context present");</div><div class='del'>-                errno = EBADF;</div><div class='del'>-		op_ret = -1;</div><div class='del'>-		goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        ctx = fd_ctx-&gt;ctx;</div><div class='del'>-        op_ret = libgf_client_fgetxattr (ctx, __fd, name, value, size);</div><div class='del'>-out:</div><div class='del'>-	return op_ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-ssize_t </div><div class='del'>-glusterfs_listxattr (glusterfs_handle_t handle,</div><div class='del'>-                     const char *path, </div><div class='del'>-                     char *list,</div><div class='del'>-                     size_t size)</div><div class='del'>-{</div><div class='del'>-        return ENOSYS;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-ssize_t </div><div class='del'>-glusterfs_llistxattr (glusterfs_handle_t handle,</div><div class='del'>-                      const char *path, </div><div class='del'>-                      char *list,</div><div class='del'>-                      size_t size)</div><div class='del'>-{</div><div class='del'>-        return ENOSYS;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-ssize_t </div><div class='del'>-glusterfs_flistxattr (glusterfs_file_t fd, </div><div class='del'>-                      char *list,</div><div class='del'>-                      size_t size)</div><div class='del'>-{</div><div class='del'>-        return ENOSYS;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int </div><div class='del'>-glusterfs_removexattr (glusterfs_handle_t handle, </div><div class='del'>-                       const char *path, </div><div class='del'>-                       const char *name)</div><div class='del'>-{</div><div class='del'>-        return ENOSYS;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int </div><div class='del'>-glusterfs_lremovexattr (glusterfs_handle_t handle, </div><div class='del'>-                        const char *path, </div><div class='del'>-                        const char *name)</div><div class='del'>-{</div><div class='del'>-        return ENOSYS;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int </div><div class='del'>-glusterfs_fremovexattr (glusterfs_file_t fd, </div><div class='del'>-                        const char *name)</div><div class='del'>-{</div><div class='del'>-        return ENOSYS;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-libgf_client_readv_cbk (call_frame_t *frame,</div><div class='del'>-                        void *cookie,</div><div class='del'>-                        xlator_t *this,</div><div class='del'>-                        int32_t op_ret,</div><div class='del'>-                        int32_t op_errno,</div><div class='del'>-                        struct iovec *vector,</div><div class='del'>-                        int32_t count,</div><div class='del'>-                        struct iatt *stbuf,</div><div class='del'>-                        struct iobref *iobref)</div><div class='del'>-{</div><div class='del'>-        libgf_client_local_t *local = frame-&gt;local;</div><div class='del'>-</div><div class='del'>-        local-&gt;reply_stub = fop_readv_cbk_stub (frame, NULL, op_ret, op_errno,</div><div class='del'>-                                                vector, count, stbuf, iobref);</div><div class='del'>-        LIBGF_REPLY_NOTIFY (local);</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-libgf_client_iobuf_read (libglusterfs_client_ctx_t *ctx, fd_t *fd, void *buf,</div><div class='del'>-                         size_t size, off_t offset)</div><div class='del'>-{</div><div class='del'>-        call_stub_t          *stub = NULL;</div><div class='del'>-        struct iovec         *vector = NULL;</div><div class='del'>-        int32_t               op_ret = -1;</div><div class='del'>-        int                   count = 0;</div><div class='del'>-        libgf_client_local_t *local = NULL;</div><div class='del'>-        struct iatt          *stbuf = NULL;</div><div class='del'>-</div><div class='del'>-        local = CALLOC (1, sizeof (*local));</div><div class='del'>-        ERR_ABORT (local);</div><div class='del'>-        local-&gt;fd = fd;</div><div class='del'>-        LIBGF_CLIENT_FOP (ctx, stub, readv, local, fd, size, offset);</div><div class='del'>-</div><div class='del'>-        op_ret = stub-&gt;args.readv_cbk.op_ret;</div><div class='del'>-        errno = stub-&gt;args.readv_cbk.op_errno;</div><div class='del'>-        count = stub-&gt;args.readv_cbk.count;</div><div class='del'>-        vector = stub-&gt;args.readv_cbk.vector;</div><div class='del'>-        if (op_ret &gt; 0) {</div><div class='del'>-                int i = 0;</div><div class='del'>-                op_ret = 0;</div><div class='del'>-                while (size &amp;&amp; (i &lt; count)) {</div><div class='del'>-                        int len = (size &lt; vector[i].iov_len) ?</div><div class='del'>-                                size : vector[i].iov_len;</div><div class='del'>-                        memcpy (buf, vector[i++].iov_base, len);</div><div class='del'>-                        buf += len;</div><div class='del'>-                        size -= len;</div><div class='del'>-                        op_ret += len;</div><div class='del'>-                }</div><div class='del'>-                stbuf = &amp;stub-&gt;args.readv_cbk.stbuf;</div><div class='del'>-                libgf_transform_iattr (ctx, fd-&gt;inode, stbuf);</div><div class='del'>-                libgf_invalidate_iattr_cache (fd-&gt;inode, LIBGF_INVALIDATE_STAT);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        gf_log (LIBGF_XL_NAME, GF_LOG_DEBUG, "size %lu, offset %"PRIu64,</div><div class='del'>-                (long unsigned)size, offset);</div><div class='del'>-	call_stub_destroy (stub);</div><div class='del'>-        return op_ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-libgf_client_read (libglusterfs_client_ctx_t *ctx, fd_t *fd, void *buf,</div><div class='del'>-                   size_t size, off_t offset)</div><div class='del'>-{</div><div class='del'>-        int32_t op_ret = -1;</div><div class='del'>-        int32_t ret = 0;</div><div class='del'>-        size_t  tmp   = 0;</div><div class='del'>-</div><div class='del'>-        while (size != 0) {</div><div class='del'>-                tmp = ((size &gt; LIBGF_IOBUF_SIZE) ? LIBGF_IOBUF_SIZE :</div><div class='del'>-                       size);</div><div class='del'>-                op_ret = libgf_client_iobuf_read (ctx, fd, buf, tmp, offset);</div><div class='del'>-                if (op_ret &lt; 0) {</div><div class='del'>-                        ret = op_ret;</div><div class='del'>-                        break;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                ret += op_ret;</div><div class='del'>-</div><div class='del'>-                if (op_ret &lt; tmp)</div><div class='del'>-                        break;</div><div class='del'>-</div><div class='del'>-                size -= op_ret;</div><div class='del'>-                offset += op_ret;</div><div class='del'>-                buf = (char *)buf + op_ret;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-glusterfs_read (glusterfs_file_t fd, void *buf, size_t nbytes)</div><div class='del'>-{</div><div class='del'>-        int32_t op_ret = -1;</div><div class='del'>-        off_t offset = 0;</div><div class='del'>-        libglusterfs_client_ctx_t *ctx = NULL;</div><div class='del'>-        libglusterfs_client_fd_ctx_t *fd_ctx = NULL;</div><div class='del'>-</div><div class='del'>-        if (nbytes &lt; 0) {</div><div class='del'>-                errno = EINVAL;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (nbytes == 0) {</div><div class='del'>-                op_ret = 0;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (fd == 0) {</div><div class='del'>-                errno = EINVAL;</div><div class='del'>-		goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        fd_ctx = libgf_get_fd_ctx (fd);</div><div class='del'>-        if (!fd_ctx) {</div><div class='del'>-                gf_log (LIBGF_XL_NAME, GF_LOG_ERROR, "No fd context present");</div><div class='del'>-                errno = EBADF;</div><div class='del'>-		goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        pthread_mutex_lock (&amp;fd_ctx-&gt;lock);</div><div class='del'>-        {</div><div class='del'>-                ctx = fd_ctx-&gt;ctx;</div><div class='del'>-                offset = fd_ctx-&gt;offset;</div><div class='del'>-        }</div><div class='del'>-        pthread_mutex_unlock (&amp;fd_ctx-&gt;lock);</div><div class='del'>-</div><div class='del'>-        op_ret = libgf_client_read (ctx, (fd_t *)fd, buf, nbytes, offset);</div><div class='del'>-</div><div class='del'>-        if (op_ret &gt; 0) {</div><div class='del'>-                offset += op_ret;</div><div class='del'>-                pthread_mutex_lock (&amp;fd_ctx-&gt;lock);</div><div class='del'>-                {</div><div class='del'>-                        fd_ctx-&gt;offset = offset;</div><div class='del'>-                }</div><div class='del'>-                pthread_mutex_unlock (&amp;fd_ctx-&gt;lock);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        return op_ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-libgf_client_iobuf_readv (libglusterfs_client_ctx_t *ctx, fd_t *fd,</div><div class='del'>-                          const struct iovec *dst_vector, int count,</div><div class='del'>-                          size_t size, off_t offset, int *idx,</div><div class='del'>-                          off_t *vec_offset)</div><div class='del'>-{</div><div class='del'>-        call_stub_t          *stub       = NULL;</div><div class='del'>-        struct iovec         *src_vector = NULL;</div><div class='del'>-        int32_t               op_ret     = -1;</div><div class='del'>-        libgf_client_local_t *local      = NULL;</div><div class='del'>-        int                   src        = 0, dst = 0;</div><div class='del'>-        int                   src_count  = 0, dst_count = 0;</div><div class='del'>-        int                   len        = 0, src_len = 0, dst_len = 0;</div><div class='del'>-        off_t                 src_offset = 0, dst_offset = 0;</div><div class='del'>-        struct iatt          *stbuf      = NULL;</div><div class='del'>-</div><div class='del'>-        dst = *idx;</div><div class='del'>-        dst_offset = *vec_offset;</div><div class='del'>-</div><div class='del'>-        local = CALLOC (1, sizeof (*local));</div><div class='del'>-        ERR_ABORT (local);</div><div class='del'>-        local-&gt;fd = fd;</div><div class='del'>-        LIBGF_CLIENT_FOP (ctx, stub, readv, local, fd, size, offset);</div><div class='del'>-</div><div class='del'>-        op_ret = stub-&gt;args.readv_cbk.op_ret;</div><div class='del'>-        errno = stub-&gt;args.readv_cbk.op_errno;</div><div class='del'>-        src_count = stub-&gt;args.readv_cbk.count;</div><div class='del'>-        src_vector = stub-&gt;args.readv_cbk.vector;</div><div class='del'>-        if (op_ret &gt; 0) {</div><div class='del'>-                while ((size != 0) &amp;&amp; (dst &lt; dst_count) &amp;&amp; (src &lt; src_count)) {</div><div class='del'>-                        src_len = src_vector[src].iov_len - src_offset;</div><div class='del'>-                        dst_len = dst_vector[dst].iov_len - dst_offset;</div><div class='del'>-</div><div class='del'>-                        len = (src_len &lt; dst_len) ? src_len : dst_len;</div><div class='del'>-                        if (len &gt; size) {</div><div class='del'>-                                len = size;</div><div class='del'>-                        }</div><div class='del'>-</div><div class='del'>-                        memcpy (dst_vector[dst].iov_base + dst_offset,</div><div class='del'>-				src_vector[src].iov_base + src_offset, len);</div><div class='del'>-</div><div class='del'>-                        size -= len;</div><div class='del'>-                        src_offset += len;</div><div class='del'>-                        dst_offset += len;</div><div class='del'>-</div><div class='del'>-                        if (src_offset == src_vector[src].iov_len) {</div><div class='del'>-                                src_offset = 0;</div><div class='del'>-                                src++;</div><div class='del'>-                        }</div><div class='del'>-</div><div class='del'>-                        if (dst_offset == dst_vector[dst].iov_len) {</div><div class='del'>-                                dst_offset = 0;</div><div class='del'>-                                dst++;</div><div class='del'>-                        }</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                stbuf = &amp;stub-&gt;args.readv_cbk.stbuf;</div><div class='del'>-                libgf_transform_iattr (ctx, fd-&gt;inode, stbuf);</div><div class='del'>-                libgf_invalidate_iattr_cache (fd-&gt;inode, LIBGF_UPDATE_STAT);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        *idx = dst;</div><div class='del'>-        *vec_offset = dst_offset;</div><div class='del'>-</div><div class='del'>-	call_stub_destroy (stub);</div><div class='del'>-        return op_ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-libgf_client_readv (libglusterfs_client_ctx_t *ctx, fd_t *fd,</div><div class='del'>-                    const struct iovec *dst_vector, int dst_count, off_t offset)</div><div class='del'>-{</div><div class='del'>-        int32_t               op_ret     = -1;</div><div class='del'>-        size_t                size       = 0, tmp = 0, ret = 0;</div><div class='del'>-        int                   i          = 0;</div><div class='del'>-        int                   dst_idx    = 0;</div><div class='del'>-        off_t                 dst_offset = 0;</div><div class='del'>-</div><div class='del'>-        for (i = 0; i &lt; dst_count; i++)</div><div class='del'>-        {</div><div class='del'>-                size += dst_vector[i].iov_len;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        while (size != 0) {</div><div class='del'>-                tmp = ((size &gt; LIBGF_IOBUF_SIZE) ? LIBGF_IOBUF_SIZE : size);</div><div class='del'>-                op_ret = libgf_client_iobuf_readv (ctx, fd, dst_vector,</div><div class='del'>-                                                   dst_count, tmp, offset,</div><div class='del'>-                                                   &amp;dst_idx, &amp;dst_offset);</div><div class='del'>-                if (op_ret &lt;= 0) {</div><div class='del'>-                        break;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                offset += op_ret;</div><div class='del'>-                size -= op_ret;</div><div class='del'>-                ret += op_ret;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-glusterfs_readv (glusterfs_file_t fd, const struct iovec *vec, int count)</div><div class='del'>-{</div><div class='del'>-        int32_t op_ret = -1;</div><div class='del'>-        off_t offset = 0;</div><div class='del'>-        libglusterfs_client_ctx_t *ctx = NULL;</div><div class='del'>-        libglusterfs_client_fd_ctx_t *fd_ctx = NULL;</div><div class='del'>-</div><div class='del'>-        if (count &lt; 0) {</div><div class='del'>-                errno = EINVAL;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (count == 0) {</div><div class='del'>-                op_ret = 0;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (!fd) {</div><div class='del'>-                errno = EINVAL;</div><div class='del'>-		goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        fd_ctx = libgf_get_fd_ctx (fd);</div><div class='del'>-        if (!fd_ctx) {</div><div class='del'>-                errno = EBADF;</div><div class='del'>-		goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        pthread_mutex_lock (&amp;fd_ctx-&gt;lock);</div><div class='del'>-        {</div><div class='del'>-                ctx = fd_ctx-&gt;ctx;</div><div class='del'>-                offset = fd_ctx-&gt;offset;</div><div class='del'>-        }</div><div class='del'>-        pthread_mutex_unlock (&amp;fd_ctx-&gt;lock);</div><div class='del'>-</div><div class='del'>-        op_ret = libgf_client_readv (ctx, (fd_t *)fd, vec, count, offset);</div><div class='del'>-</div><div class='del'>-        if (op_ret &gt; 0) {</div><div class='del'>-                offset += op_ret;</div><div class='del'>-                pthread_mutex_lock (&amp;fd_ctx-&gt;lock);</div><div class='del'>-                {</div><div class='del'>-                        fd_ctx-&gt;offset = offset;</div><div class='del'>-                }</div><div class='del'>-                pthread_mutex_unlock (&amp;fd_ctx-&gt;lock);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        return op_ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-ssize_t </div><div class='del'>-glusterfs_pread (glusterfs_file_t fd, </div><div class='del'>-                 void *buf, </div><div class='del'>-                 size_t count, </div><div class='del'>-                 off_t offset)</div><div class='del'>-{</div><div class='del'>-        int32_t op_ret = -1;</div><div class='del'>-        libglusterfs_client_ctx_t *ctx = NULL;</div><div class='del'>-        libglusterfs_client_fd_ctx_t *fd_ctx = NULL;</div><div class='del'>-</div><div class='del'>-        if (count &lt; 0) {</div><div class='del'>-                errno = EINVAL;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (count == 0) {</div><div class='del'>-                op_ret = 0;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (!fd) {</div><div class='del'>-                errno = EINVAL;</div><div class='del'>-		goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        fd_ctx = libgf_get_fd_ctx (fd);</div><div class='del'>-        if (!fd_ctx) {</div><div class='del'>-                errno = EBADF;</div><div class='del'>-		goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        ctx = fd_ctx-&gt;ctx;</div><div class='del'>-</div><div class='del'>-        op_ret = libgf_client_read (ctx, (fd_t *)fd, buf, count, offset);</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        return op_ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-libgf_client_writev_cbk (call_frame_t *frame,</div><div class='del'>-                         void *cookie,</div><div class='del'>-                         xlator_t *this,</div><div class='del'>-                         int32_t op_ret,</div><div class='del'>-                         int32_t op_errno,</div><div class='del'>-                         struct iatt *prebuf,</div><div class='del'>-                         struct iatt *postbuf)</div><div class='del'>-{</div><div class='del'>-        libgf_client_local_t *local = frame-&gt;local;</div><div class='del'>-</div><div class='del'>-        local-&gt;reply_stub = fop_writev_cbk_stub (frame, NULL, op_ret, op_errno,</div><div class='del'>-                                                 prebuf, postbuf);</div><div class='del'>-</div><div class='del'>-        LIBGF_REPLY_NOTIFY (local);</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-libgf_client_iobuf_write (libglusterfs_client_ctx_t *ctx, fd_t *fd, char *addr,</div><div class='del'>-                          size_t size, off_t offset)</div><div class='del'>-{</div><div class='del'>-        struct iobref        *ioref = NULL;</div><div class='del'>-        struct iobuf         *iob = NULL;</div><div class='del'>-        int                   op_ret = -1;</div><div class='del'>-        struct iovec          iov = {0, };</div><div class='del'>-        call_stub_t          *stub = NULL;</div><div class='del'>-        libgf_client_local_t *local = NULL;</div><div class='del'>-</div><div class='del'>-        GF_VALIDATE_OR_GOTO (LIBGF_XL_NAME, ctx, out);</div><div class='del'>-        GF_VALIDATE_OR_GOTO (LIBGF_XL_NAME, fd, out);</div><div class='del'>-        GF_VALIDATE_OR_GOTO (LIBGF_XL_NAME, addr, out);</div><div class='del'>-</div><div class='del'>-        ioref = iobref_new ();</div><div class='del'>-        if (!ioref) {</div><div class='del'>-                gf_log (LIBGF_XL_NAME, GF_LOG_ERROR, "Out of memory");</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        iob = iobuf_get (ctx-&gt;gf_ctx.iobuf_pool);</div><div class='del'>-        if (!iob) {</div><div class='del'>-                gf_log (LIBGF_XL_NAME, GF_LOG_ERROR, "Out of memory");</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        memcpy (iob-&gt;ptr, addr, size);</div><div class='del'>-        iobref_add (ioref, iob);</div><div class='del'>-</div><div class='del'>-        iov.iov_base = iob-&gt;ptr;</div><div class='del'>-        iov.iov_len = size;</div><div class='del'>-</div><div class='del'>-        LIBGF_CLIENT_FOP (ctx, stub, writev, local, fd, &amp;iov,</div><div class='del'>-                          1, offset, ioref);</div><div class='del'>-</div><div class='del'>-        op_ret = stub-&gt;args.writev_cbk.op_ret;</div><div class='del'>-        errno = stub-&gt;args.writev_cbk.op_errno;</div><div class='del'>-</div><div class='del'>-        /* We need to invalidate because it is possible that write-behind</div><div class='del'>-         * is a translator below us and returns a stat filled with zeroes.</div><div class='del'>-         */</div><div class='del'>-        libgf_invalidate_iattr_cache (fd-&gt;inode, LIBGF_INVALIDATE_STAT);</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        if (iob) {</div><div class='del'>-                iobuf_unref (iob);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (ioref) {</div><div class='del'>-                iobref_unref (ioref);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        call_stub_destroy (stub);</div><div class='del'>-        return op_ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-libgf_client_writev (libglusterfs_client_ctx_t *ctx, </div><div class='del'>-                     fd_t *fd, </div><div class='del'>-                     struct iovec *vector, </div><div class='del'>-                     int count, </div><div class='del'>-                     off_t offset)</div><div class='del'>-{</div><div class='del'>-        int                     op_ret = 0;</div><div class='del'>-        int                     written = 0;</div><div class='del'>-        int                     writesize = 0;</div><div class='del'>-        int                     size = 0;</div><div class='del'>-        char                   *base = NULL;</div><div class='del'>-        int                     i = 0;</div><div class='del'>-</div><div class='del'>-        for (i = 0; i &lt; count; i++) {</div><div class='del'>-                size = vector[i].iov_len;</div><div class='del'>-                base = vector[i].iov_base;</div><div class='del'>-</div><div class='del'>-                while (size &gt; 0) {</div><div class='del'>-                        writesize = (size &gt; LIBGF_IOBUF_SIZE) ?</div><div class='del'>-                                LIBGF_IOBUF_SIZE : size;</div><div class='del'>-</div><div class='del'>-                        written = libgf_client_iobuf_write (ctx, fd, base,</div><div class='del'>-                                                            writesize, offset);</div><div class='del'>-</div><div class='del'>-                        if (written == -1)</div><div class='del'>-                                goto out;</div><div class='del'>-</div><div class='del'>-                        op_ret += written;</div><div class='del'>-                        base += written;</div><div class='del'>-                        size -= written;</div><div class='del'>-                        offset += written;</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        return op_ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-ssize_t </div><div class='del'>-glusterfs_write (glusterfs_file_t fd, </div><div class='del'>-                 const void *buf, </div><div class='del'>-                 size_t n)</div><div class='del'>-{</div><div class='del'>-        int32_t op_ret = -1;</div><div class='del'>-        off_t offset = 0;</div><div class='del'>-        struct iovec vector;</div><div class='del'>-        libglusterfs_client_ctx_t *ctx = NULL;</div><div class='del'>-        libglusterfs_client_fd_ctx_t *fd_ctx = NULL;</div><div class='del'>-</div><div class='del'>-        if (n &lt; 0) {</div><div class='del'>-                errno = EINVAL;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (n == 0) {</div><div class='del'>-                op_ret = 0;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (!fd) {</div><div class='del'>-                errno = EINVAL;</div><div class='del'>-		goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        fd_ctx = libgf_get_fd_ctx (fd);</div><div class='del'>-        if (!fd_ctx) {</div><div class='del'>-                errno = EBADF;</div><div class='del'>-		goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        ctx = fd_ctx-&gt;ctx;</div><div class='del'>-</div><div class='del'>-        pthread_mutex_lock (&amp;fd_ctx-&gt;lock);</div><div class='del'>-        {</div><div class='del'>-                offset = fd_ctx-&gt;offset;</div><div class='del'>-        }</div><div class='del'>-        pthread_mutex_unlock (&amp;fd_ctx-&gt;lock);</div><div class='del'>-</div><div class='del'>-        vector.iov_base = (void *)buf;</div><div class='del'>-        vector.iov_len = n;</div><div class='del'>-</div><div class='del'>-        op_ret = libgf_client_writev (ctx,</div><div class='del'>-                                      (fd_t *)fd, </div><div class='del'>-                                      &amp;vector, </div><div class='del'>-                                      1, </div><div class='del'>-                                      offset);</div><div class='del'>-</div><div class='del'>-        if (op_ret &gt;= 0) {</div><div class='del'>-                offset += op_ret;</div><div class='del'>-                pthread_mutex_lock (&amp;fd_ctx-&gt;lock);</div><div class='del'>-                {</div><div class='del'>-                        fd_ctx-&gt;offset = offset;</div><div class='del'>-                }</div><div class='del'>-                pthread_mutex_unlock (&amp;fd_ctx-&gt;lock);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        return op_ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-ssize_t </div><div class='del'>-glusterfs_writev (glusterfs_file_t fd, </div><div class='del'>-                  const struct iovec *vector,</div><div class='del'>-                  int count)</div><div class='del'>-{</div><div class='del'>-        int32_t op_ret = -1;</div><div class='del'>-        off_t offset = 0;</div><div class='del'>-        libglusterfs_client_ctx_t *ctx = NULL;</div><div class='del'>-        libglusterfs_client_fd_ctx_t *fd_ctx = NULL;</div><div class='del'>-</div><div class='del'>-        if (count &lt; 0) {</div><div class='del'>-                errno = EINVAL;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (count == 0) {</div><div class='del'>-                op_ret = 0;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (!fd) {</div><div class='del'>-                errno = EINVAL;</div><div class='del'>-		goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        fd_ctx = libgf_get_fd_ctx (fd);</div><div class='del'>-        if (!fd_ctx) {</div><div class='del'>-                errno = EBADF;</div><div class='del'>-		goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        ctx = fd_ctx-&gt;ctx;</div><div class='del'>-</div><div class='del'>-        pthread_mutex_lock (&amp;fd_ctx-&gt;lock);</div><div class='del'>-        {</div><div class='del'>-                offset = fd_ctx-&gt;offset;</div><div class='del'>-        }</div><div class='del'>-        pthread_mutex_unlock (&amp;fd_ctx-&gt;lock);</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-        op_ret = libgf_client_writev (ctx,</div><div class='del'>-                                      (fd_t *)fd, </div><div class='del'>-                                      (struct iovec *)vector, </div><div class='del'>-                                      count,</div><div class='del'>-                                      offset);</div><div class='del'>-</div><div class='del'>-        if (op_ret &gt;= 0) {</div><div class='del'>-                offset += op_ret;</div><div class='del'>-                pthread_mutex_lock (&amp;fd_ctx-&gt;lock);</div><div class='del'>-                {</div><div class='del'>-                        fd_ctx-&gt;offset = offset;</div><div class='del'>-                }</div><div class='del'>-                pthread_mutex_unlock (&amp;fd_ctx-&gt;lock);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        return op_ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-ssize_t </div><div class='del'>-glusterfs_pwrite (glusterfs_file_t fd, </div><div class='del'>-                  const void *buf, </div><div class='del'>-                  size_t count, </div><div class='del'>-                  off_t offset)</div><div class='del'>-{</div><div class='del'>-        int32_t op_ret = -1;</div><div class='del'>-        struct iovec vector;</div><div class='del'>-        libglusterfs_client_ctx_t *ctx = NULL;</div><div class='del'>-        libglusterfs_client_fd_ctx_t *fd_ctx = NULL;</div><div class='del'>-</div><div class='del'>-        if (count &lt; 0) {</div><div class='del'>-                errno = EINVAL;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (count == 0) {</div><div class='del'>-                op_ret = 0;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (!fd) {</div><div class='del'>-                errno = EINVAL;</div><div class='del'>-		goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        fd_ctx = libgf_get_fd_ctx (fd);</div><div class='del'>-        if (!fd_ctx) {</div><div class='del'>-                errno = EBADF;</div><div class='del'>-		goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        ctx = fd_ctx-&gt;ctx;</div><div class='del'>-</div><div class='del'>-        vector.iov_base = (void *)buf;</div><div class='del'>-        vector.iov_len = count;</div><div class='del'>-</div><div class='del'>-        op_ret = libgf_client_writev (ctx,</div><div class='del'>-                                      (fd_t *)fd, </div><div class='del'>-                                      &amp;vector, </div><div class='del'>-                                      1, </div><div class='del'>-                                      offset);</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        return op_ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-libgf_client_readdirp_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-                           int32_t op_ret, int32_t op_errno,</div><div class='del'>-                           gf_dirent_t *entries)</div><div class='del'>-{</div><div class='del'>-        libgf_client_local_t *local = frame-&gt;local;</div><div class='del'>-</div><div class='del'>-        /* Note, we dont let entries reach the stub because there it gets copied</div><div class='del'>-         * while we can simply delink the entries here and link them into our</div><div class='del'>-         * dcache, thereby avoiding the need to perform more allocations and</div><div class='del'>-         * copies.</div><div class='del'>-         */</div><div class='del'>-        local-&gt;reply_stub = fop_readdirp_cbk_stub (frame, NULL, op_ret,</div><div class='del'>-                                                   op_errno, NULL);</div><div class='del'>-        if (op_ret &gt; 0)</div><div class='del'>-                libgf_dcache_update (frame-&gt;root-&gt;state, local-&gt;fd, entries);</div><div class='del'>-        LIBGF_REPLY_NOTIFY (local);</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int </div><div class='del'>-libgf_client_readdir (libglusterfs_client_ctx_t *ctx, fd_t *fd,</div><div class='del'>-                      struct dirent *dirp, off_t *offset)</div><div class='del'>-{  </div><div class='del'>-        call_stub_t *stub = NULL;</div><div class='del'>-        int op_ret = -1;</div><div class='del'>-        libgf_client_local_t *local = NULL;</div><div class='del'>-</div><div class='del'>-        if (libgf_dcache_readdir (ctx, fd, dirp, offset))</div><div class='del'>-                return 1;</div><div class='del'>-        local = CALLOC (1, sizeof (*local));</div><div class='del'>-        ERR_ABORT (local);</div><div class='del'>-        local-&gt;fd = fd;</div><div class='del'>-        LIBGF_CLIENT_FOP (ctx, stub, readdirp, local, fd,</div><div class='del'>-                          LIBGF_READDIR_BLOCK, *offset);</div><div class='del'>-</div><div class='del'>-        errno = stub-&gt;args.readdir_cbk.op_errno;</div><div class='del'>-</div><div class='del'>-        op_ret = libgf_dcache_readdir (ctx, fd, dirp, offset);</div><div class='del'>-	call_stub_destroy (stub);</div><div class='del'>-        return op_ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-glusterfs_readdir_r (glusterfs_dir_t dirfd, struct dirent *entry,</div><div class='del'>-                     struct dirent **result)</div><div class='del'>-{</div><div class='del'>-        int                           op_ret = -1;</div><div class='del'>-        libglusterfs_client_ctx_t    *ctx = NULL;</div><div class='del'>-        off_t                         offset = 0;</div><div class='del'>-        libglusterfs_client_fd_ctx_t *fd_ctx = NULL;</div><div class='del'>-        struct dirent                *dirp = NULL;</div><div class='del'>-</div><div class='del'>-        GF_VALIDATE_OR_GOTO (LIBGF_XL_NAME, entry, out);</div><div class='del'>-</div><div class='del'>-        fd_ctx = libgf_get_fd_ctx (dirfd);</div><div class='del'>-        if (!fd_ctx) {</div><div class='del'>-                gf_log (LIBGF_XL_NAME, GF_LOG_ERROR, "fd context not present");</div><div class='del'>-                errno = EBADF;</div><div class='del'>-		goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        pthread_mutex_lock (&amp;fd_ctx-&gt;lock);</div><div class='del'>-        {</div><div class='del'>-                ctx = fd_ctx-&gt;ctx;</div><div class='del'>-                offset = fd_ctx-&gt;offset;</div><div class='del'>-                dirp = &amp;fd_ctx-&gt;dirp;</div><div class='del'>-</div><div class='del'>-                gf_log (LIBGF_XL_NAME, GF_LOG_DEBUG, "offset %"PRIu64, offset);</div><div class='del'>-                memset (dirp, 0, sizeof (struct dirent));</div><div class='del'>-                op_ret = libgf_client_readdir (ctx, (fd_t *)dirfd, dirp,</div><div class='del'>-                                               &amp;offset);</div><div class='del'>-                if (op_ret &lt;= 0) {</div><div class='del'>-                        gf_log (LIBGF_XL_NAME, GF_LOG_DEBUG, "readdir failed:"</div><div class='del'>-                                " %s", strerror (errno));</div><div class='del'>-                        if (result &amp;&amp; (op_ret == 0)) {</div><div class='del'>-                                *result = NULL;</div><div class='del'>-                        } else if (op_ret &lt; 0){</div><div class='del'>-                                op_ret = errno;</div><div class='del'>-                        }</div><div class='del'>-                        goto unlock;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                fd_ctx-&gt;offset = offset;</div><div class='del'>-</div><div class='del'>-                if (result) {</div><div class='del'>-                        *result = memcpy (entry, dirp, sizeof (*entry));</div><div class='del'>-                } else {</div><div class='del'>-                        memcpy (entry, dirp, sizeof (*entry));</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                gf_log (LIBGF_XL_NAME, GF_LOG_DEBUG, "new offset %"PRIu64", "</div><div class='del'>-                        " entry %s", offset, entry-&gt;d_name);</div><div class='del'>-                op_ret = 0;</div><div class='del'>-        }</div><div class='del'>-unlock:</div><div class='del'>-        pthread_mutex_unlock (&amp;fd_ctx-&gt;lock);</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        return op_ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-void *</div><div class='del'>-glusterfs_readdir (glusterfs_dir_t dirfd)</div><div class='del'>-{</div><div class='del'>-        int op_ret = -1;</div><div class='del'>-        libglusterfs_client_ctx_t *ctx = NULL;</div><div class='del'>-        off_t offset = 0;</div><div class='del'>-        libglusterfs_client_fd_ctx_t *fd_ctx = NULL;</div><div class='del'>-        struct dirent *dirp = NULL;</div><div class='del'>-</div><div class='del'>-        fd_ctx = libgf_get_fd_ctx (dirfd);</div><div class='del'>-        if (!fd_ctx) {</div><div class='del'>-                gf_log (LIBGF_XL_NAME, GF_LOG_ERROR, "fd context not present");</div><div class='del'>-                errno = EBADF;</div><div class='del'>-		goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        pthread_mutex_lock (&amp;fd_ctx-&gt;lock);</div><div class='del'>-        {</div><div class='del'>-                ctx = fd_ctx-&gt;ctx;</div><div class='del'>-                offset = fd_ctx-&gt;offset;</div><div class='del'>-                dirp = &amp;fd_ctx-&gt;dirp;</div><div class='del'>-        }</div><div class='del'>-        pthread_mutex_unlock (&amp;fd_ctx-&gt;lock);</div><div class='del'>-</div><div class='del'>-        gf_log (LIBGF_XL_NAME, GF_LOG_DEBUG, "offset %"PRIu64, offset);</div><div class='del'>-        memset (dirp, 0, sizeof (struct dirent));</div><div class='del'>-        op_ret = libgf_client_readdir (ctx, (fd_t *)dirfd, dirp, &amp;offset);</div><div class='del'>-</div><div class='del'>-        if (op_ret &lt;= 0) {</div><div class='del'>-                gf_log (LIBGF_XL_NAME, GF_LOG_DEBUG, "readdir failed: %s",</div><div class='del'>-                        strerror (errno));</div><div class='del'>-                dirp = NULL;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        pthread_mutex_lock (&amp;fd_ctx-&gt;lock);</div><div class='del'>-        {</div><div class='del'>-                fd_ctx-&gt;offset = offset;</div><div class='del'>-        }</div><div class='del'>-        pthread_mutex_unlock (&amp;fd_ctx-&gt;lock);</div><div class='del'>-</div><div class='del'>-        gf_log (LIBGF_XL_NAME, GF_LOG_DEBUG, "new offset %"PRIu64", entry %s",</div><div class='del'>-                offset, dirp-&gt;d_name);</div><div class='del'>-out:</div><div class='del'>-        return dirp;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-glusterfs_getdents (glusterfs_file_t fd, struct dirent *dirp,</div><div class='del'>-                    unsigned int count)</div><div class='del'>-{</div><div class='del'>-        int op_ret = -1;</div><div class='del'>-        libglusterfs_client_ctx_t *ctx = NULL;</div><div class='del'>-        off_t offset = 0;</div><div class='del'>-        libglusterfs_client_fd_ctx_t *fd_ctx = NULL;</div><div class='del'>-</div><div class='del'>-        fd_ctx = libgf_get_fd_ctx (fd);</div><div class='del'>-        if (!fd_ctx) {</div><div class='del'>-                errno = EBADF;</div><div class='del'>-		goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        pthread_mutex_lock (&amp;fd_ctx-&gt;lock);</div><div class='del'>-        {</div><div class='del'>-                ctx = fd_ctx-&gt;ctx;</div><div class='del'>-                offset = fd_ctx-&gt;offset;</div><div class='del'>-        }</div><div class='del'>-        pthread_mutex_unlock (&amp;fd_ctx-&gt;lock);</div><div class='del'>-</div><div class='del'>-        op_ret = libgf_client_readdir (ctx, (fd_t *)fd, dirp, &amp;offset);</div><div class='del'>-</div><div class='del'>-        if (op_ret &gt; 0) {</div><div class='del'>-                pthread_mutex_lock (&amp;fd_ctx-&gt;lock);</div><div class='del'>-                {</div><div class='del'>-                        fd_ctx-&gt;offset = offset;</div><div class='del'>-                }</div><div class='del'>-                pthread_mutex_unlock (&amp;fd_ctx-&gt;lock);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        return op_ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-static int32_t</div><div class='del'>-libglusterfs_readv_async_cbk (call_frame_t *frame,</div><div class='del'>-                              void *cookie,</div><div class='del'>-                              xlator_t *this,</div><div class='del'>-                              int32_t op_ret,</div><div class='del'>-                              int32_t op_errno,</div><div class='del'>-                              struct iovec *vector,</div><div class='del'>-                              int32_t count,</div><div class='del'>-                              struct iatt *stbuf,</div><div class='del'>-                              struct iobref *iobref)</div><div class='del'>-{</div><div class='del'>-        glusterfs_iobuf_t *buf;</div><div class='del'>-        libglusterfs_client_async_local_t *local = frame-&gt;local;</div><div class='del'>-        fd_t *__fd = local-&gt;fop.readv_cbk.fd;</div><div class='del'>-        glusterfs_readv_cbk_t readv_cbk = local-&gt;fop.readv_cbk.cbk;</div><div class='del'>-</div><div class='del'>-        buf = CALLOC (1, sizeof (*buf));</div><div class='del'>-        ERR_ABORT (buf);</div><div class='del'>-</div><div class='del'>-	if (vector) {</div><div class='del'>-		buf-&gt;vector = iov_dup (vector, count);</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-        buf-&gt;count = count;</div><div class='del'>-</div><div class='del'>-	if (iobref) {</div><div class='del'>-		buf-&gt;iobref = iobref_ref (iobref);</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-        if (op_ret &gt; 0) {</div><div class='del'>-                libglusterfs_client_fd_ctx_t *fd_ctx = NULL;</div><div class='del'>-                fd_ctx = libgf_get_fd_ctx (__fd);</div><div class='del'>-                </div><div class='del'>-                /* update offset only if we have used offset stored in fd_ctx */</div><div class='del'>-                if (local-&gt;fop.readv_cbk.update_offset) {</div><div class='del'>-                        pthread_mutex_lock (&amp;fd_ctx-&gt;lock);</div><div class='del'>-                        {</div><div class='del'>-                                fd_ctx-&gt;offset += op_ret;</div><div class='del'>-                        }</div><div class='del'>-                        pthread_mutex_unlock (&amp;fd_ctx-&gt;lock);</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        readv_cbk (op_ret, op_errno, buf, local-&gt;cbk_data); </div><div class='del'>-</div><div class='del'>-	FREE (local);</div><div class='del'>-	frame-&gt;local = NULL;</div><div class='del'>-        STACK_DESTROY (frame-&gt;root);</div><div class='del'>-</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-void </div><div class='del'>-glusterfs_free (glusterfs_iobuf_t *buf)</div><div class='del'>-{</div><div class='del'>-        //iov_free (buf-&gt;vector, buf-&gt;count);</div><div class='del'>-        FREE (buf-&gt;vector);</div><div class='del'>-        if (buf-&gt;iobref)</div><div class='del'>-                iobref_unref ((struct iobref *) buf-&gt;iobref);</div><div class='del'>-        if (buf-&gt;dictref)</div><div class='del'>-                dict_unref ((dict_t *) buf-&gt;dictref);</div><div class='del'>-        FREE (buf);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-glusterfs_read_async (glusterfs_file_t fd, </div><div class='del'>-                      size_t nbytes, </div><div class='del'>-                      off_t offset,</div><div class='del'>-                      glusterfs_readv_cbk_t readv_cbk,</div><div class='del'>-                      void *cbk_data)</div><div class='del'>-{</div><div class='del'>-        libglusterfs_client_ctx_t *ctx;</div><div class='del'>-        fd_t *__fd = (fd_t *)fd;</div><div class='del'>-        libglusterfs_client_async_local_t *local = NULL;</div><div class='del'>-        libglusterfs_client_fd_ctx_t *fd_ctx = NULL;</div><div class='del'>-	int32_t op_ret = 0;</div><div class='del'>-</div><div class='del'>-        if (nbytes &lt; 0) {</div><div class='del'>-                errno = EINVAL;</div><div class='del'>-                op_ret = -1;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (nbytes == 0) {</div><div class='del'>-                op_ret = 0;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        local = CALLOC (1, sizeof (*local));</div><div class='del'>-        ERR_ABORT (local);</div><div class='del'>-        local-&gt;fop.readv_cbk.fd = __fd;</div><div class='del'>-        local-&gt;fop.readv_cbk.cbk = readv_cbk;</div><div class='del'>-        local-&gt;cbk_data = cbk_data;</div><div class='del'>-</div><div class='del'>-        fd_ctx = libgf_get_fd_ctx (fd);</div><div class='del'>-        if (!fd_ctx) {</div><div class='del'>-                errno = EBADF;</div><div class='del'>-		op_ret = -1;</div><div class='del'>-		goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        ctx = fd_ctx-&gt;ctx;</div><div class='del'>-</div><div class='del'>-        if (offset &lt; 0) {</div><div class='del'>-                pthread_mutex_lock (&amp;fd_ctx-&gt;lock);</div><div class='del'>-                {</div><div class='del'>-                        offset = fd_ctx-&gt;offset;</div><div class='del'>-                        local-&gt;fop.readv_cbk.update_offset = 1;</div><div class='del'>-                }</div><div class='del'>-                pthread_mutex_unlock (&amp;fd_ctx-&gt;lock);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        LIBGF_CLIENT_FOP_ASYNC (ctx,</div><div class='del'>-                                local,</div><div class='del'>-                                libglusterfs_readv_async_cbk,</div><div class='del'>-                                readv,</div><div class='del'>-                                __fd,</div><div class='del'>-                                nbytes,</div><div class='del'>-                                offset);</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        return op_ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-static int32_t</div><div class='del'>-libglusterfs_writev_async_cbk (call_frame_t *frame,</div><div class='del'>-                               void *cookie,</div><div class='del'>-                               xlator_t *this,</div><div class='del'>-                               int32_t op_ret,</div><div class='del'>-                               int32_t op_errno,</div><div class='del'>-                               struct iatt *prebuf,</div><div class='del'>-                               struct iatt *postbuf)</div><div class='del'>-{</div><div class='del'>-        libglusterfs_client_async_local_t *local = frame-&gt;local;</div><div class='del'>-        fd_t *fd = NULL;</div><div class='del'>-        glusterfs_write_cbk_t write_cbk;</div><div class='del'>-</div><div class='del'>-        write_cbk = local-&gt;fop.write_cbk.cbk;</div><div class='del'>-        fd = local-&gt;fop.write_cbk.fd;</div><div class='del'>-</div><div class='del'>-        if (op_ret &gt; 0) {</div><div class='del'>-                libglusterfs_client_fd_ctx_t *fd_ctx = NULL;</div><div class='del'>-                fd_ctx = libgf_get_fd_ctx (fd);</div><div class='del'>-                pthread_mutex_lock (&amp;fd_ctx-&gt;lock);</div><div class='del'>-                {</div><div class='del'>-                        fd_ctx-&gt;offset += op_ret;  </div><div class='del'>-                }</div><div class='del'>-                pthread_mutex_unlock (&amp;fd_ctx-&gt;lock);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        write_cbk (op_ret, op_errno, local-&gt;cbk_data);</div><div class='del'>-</div><div class='del'>-        STACK_DESTROY (frame-&gt;root);</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-glusterfs_write_async (glusterfs_file_t fd, </div><div class='del'>-                       const void *buf, </div><div class='del'>-                       size_t nbytes, </div><div class='del'>-                       off_t offset,</div><div class='del'>-                       glusterfs_write_cbk_t write_cbk,</div><div class='del'>-                       void *cbk_data)</div><div class='del'>-{</div><div class='del'>-        fd_t *__fd = (fd_t *)fd;</div><div class='del'>-        struct iovec vector;</div><div class='del'>-        off_t __offset = offset;</div><div class='del'>-        libglusterfs_client_ctx_t *ctx = NULL;</div><div class='del'>-        libglusterfs_client_async_local_t *local = NULL;</div><div class='del'>-        libglusterfs_client_fd_ctx_t *fd_ctx = NULL;</div><div class='del'>-	int32_t op_ret = 0;</div><div class='del'>-        struct iobref *iobref = NULL;</div><div class='del'>-</div><div class='del'>-        if (nbytes == 0) {</div><div class='del'>-                op_ret = 0;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (nbytes &lt; 0) {</div><div class='del'>-                op_ret = -1;</div><div class='del'>-                errno = EINVAL;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        local = CALLOC (1, sizeof (*local));</div><div class='del'>-        ERR_ABORT (local);</div><div class='del'>-        local-&gt;fop.write_cbk.fd = __fd;</div><div class='del'>-        local-&gt;fop.write_cbk.cbk = write_cbk;</div><div class='del'>-        local-&gt;cbk_data = cbk_data;</div><div class='del'>-</div><div class='del'>-        vector.iov_base = (void *)buf;</div><div class='del'>-        vector.iov_len = nbytes;</div><div class='del'>-  </div><div class='del'>-        fd_ctx = libgf_get_fd_ctx (fd);</div><div class='del'>-        if (!fd_ctx) {</div><div class='del'>-                errno = EBADF;</div><div class='del'>-		op_ret = -1;</div><div class='del'>-		goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        ctx = fd_ctx-&gt;ctx;</div><div class='del'>- </div><div class='del'>-        if (offset &lt; 0) {</div><div class='del'>-                pthread_mutex_lock (&amp;fd_ctx-&gt;lock);</div><div class='del'>-                {</div><div class='del'>-                        __offset = fd_ctx-&gt;offset;</div><div class='del'>-                }</div><div class='del'>-                pthread_mutex_unlock (&amp;fd_ctx-&gt;lock);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        iobref = iobref_new ();</div><div class='del'>-        LIBGF_CLIENT_FOP_ASYNC (ctx,</div><div class='del'>-                                local,</div><div class='del'>-                                libglusterfs_writev_async_cbk,</div><div class='del'>-                                writev,</div><div class='del'>-                                __fd,</div><div class='del'>-                                &amp;vector,</div><div class='del'>-                                1,</div><div class='del'>-                                __offset,</div><div class='del'>-                                iobref);</div><div class='del'>-        iobref_unref (iobref);</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        return op_ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-off_t</div><div class='del'>-glusterfs_lseek (glusterfs_file_t fd, off_t offset, int whence)</div><div class='del'>-{</div><div class='del'>-        off_t __offset = 0;</div><div class='del'>-	int32_t op_ret = -1;</div><div class='del'>-        fd_t *__fd = (fd_t *)fd;</div><div class='del'>-        libglusterfs_client_fd_ctx_t *fd_ctx = NULL;</div><div class='del'>-	libglusterfs_client_ctx_t *ctx = NULL; </div><div class='del'>-</div><div class='del'>-        fd_ctx = libgf_get_fd_ctx (fd);</div><div class='del'>-        if (!fd_ctx) {</div><div class='del'>-                errno = EBADF;</div><div class='del'>-		__offset = -1;</div><div class='del'>-		goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-	ctx = fd_ctx-&gt;ctx;</div><div class='del'>-</div><div class='del'>-        switch (whence)</div><div class='del'>-        {</div><div class='del'>-        case SEEK_SET:</div><div class='del'>-                __offset = offset;</div><div class='del'>-                break;</div><div class='del'>-</div><div class='del'>-        case SEEK_CUR:</div><div class='del'>-                pthread_mutex_lock (&amp;fd_ctx-&gt;lock);</div><div class='del'>-                {</div><div class='del'>-                        __offset = fd_ctx-&gt;offset;</div><div class='del'>-                }</div><div class='del'>-                pthread_mutex_unlock (&amp;fd_ctx-&gt;lock);</div><div class='del'>-</div><div class='del'>-                __offset += offset;</div><div class='del'>-                break;</div><div class='del'>-</div><div class='del'>-        case SEEK_END:</div><div class='del'>-	{</div><div class='del'>-		char cache_valid = 0;</div><div class='del'>-		off_t end = 0;</div><div class='del'>-		loc_t loc = {0, };</div><div class='del'>-		struct iatt stbuf = {0, };</div><div class='del'>-</div><div class='del'>-                cache_valid = libgf_is_iattr_cache_valid (ctx, __fd-&gt;inode,</div><div class='del'>-                                                          &amp;stbuf,</div><div class='del'>-                                                          LIBGF_VALIDATE_STAT);</div><div class='del'>-                if (cache_valid) {</div><div class='del'>-			end = stbuf.ia_size;</div><div class='del'>-		} else {</div><div class='del'>-			op_ret = libgf_client_loc_fill (&amp;loc, ctx,</div><div class='del'>-                                                        __fd-&gt;inode-&gt;ino, 0,</div><div class='del'>-                                                        NULL);</div><div class='del'>-			if (op_ret == -1) {</div><div class='del'>-				gf_log ("libglusterfsclient",</div><div class='del'>-					GF_LOG_ERROR,</div><div class='del'>-					"libgf_client_loc_fill returned -1, returning EINVAL");</div><div class='del'>-				errno = EINVAL;</div><div class='del'>-				libgf_client_loc_wipe (&amp;loc);</div><div class='del'>-				__offset = -1;</div><div class='del'>-				goto out;</div><div class='del'>-			}</div><div class='del'>-			</div><div class='del'>-			op_ret = libgf_client_lookup (ctx, &amp;loc, &amp;stbuf, NULL,</div><div class='del'>-                                                      NULL);</div><div class='del'>-			if (op_ret &lt; 0) {</div><div class='del'>-				__offset = -1;</div><div class='del'>-				libgf_client_loc_wipe (&amp;loc);</div><div class='del'>-				goto out;</div><div class='del'>-			}</div><div class='del'>-</div><div class='del'>-			end = stbuf.ia_size;</div><div class='del'>-		}</div><div class='del'>-</div><div class='del'>-                __offset = end + offset; </div><div class='del'>-		libgf_client_loc_wipe (&amp;loc);</div><div class='del'>-	}</div><div class='del'>-	break;</div><div class='del'>-</div><div class='del'>-	default:</div><div class='del'>-		gf_log ("libglusterfsclient",</div><div class='del'>-			GF_LOG_ERROR,</div><div class='del'>-			"invalid value for whence");</div><div class='del'>-		__offset = -1;</div><div class='del'>-		errno = EINVAL;</div><div class='del'>-		goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        pthread_mutex_lock (&amp;fd_ctx-&gt;lock);</div><div class='del'>-        {</div><div class='del'>-                fd_ctx-&gt;offset = __offset;</div><div class='del'>-        }</div><div class='del'>-        pthread_mutex_unlock (&amp;fd_ctx-&gt;lock);</div><div class='del'>- </div><div class='del'>-out: </div><div class='del'>-        return __offset;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-libgf_client_stat_cbk (call_frame_t *frame,</div><div class='del'>-                       void *cookie,</div><div class='del'>-                       xlator_t *this,</div><div class='del'>-                       int32_t op_ret,</div><div class='del'>-                       int32_t op_errno,</div><div class='del'>-                       struct iatt *buf)</div><div class='del'>-{</div><div class='del'>-        libgf_client_local_t *local = frame-&gt;local;</div><div class='del'>-</div><div class='del'>-        local-&gt;reply_stub = fop_stat_cbk_stub (frame, </div><div class='del'>-                                               NULL, </div><div class='del'>-                                               op_ret, </div><div class='del'>-                                               op_errno, </div><div class='del'>-                                               buf);</div><div class='del'>-</div><div class='del'>-        LIBGF_REPLY_NOTIFY (local);</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t </div><div class='del'>-libgf_client_stat (libglusterfs_client_ctx_t *ctx, </div><div class='del'>-                   loc_t *loc,</div><div class='del'>-                   struct iatt *stbuf)</div><div class='del'>-{</div><div class='del'>-        call_stub_t *stub = NULL;</div><div class='del'>-        int32_t op_ret = 0;</div><div class='del'>-        libgf_client_local_t *local = NULL;</div><div class='del'>-        struct iatt cachedbuf = {0, };</div><div class='del'>-</div><div class='del'>-        if (libgf_is_iattr_cache_valid (ctx, loc-&gt;inode, &amp;cachedbuf,</div><div class='del'>-                                        LIBGF_VALIDATE_STAT)) {</div><div class='del'>-                gf_log (LIBGF_XL_NAME, GF_LOG_DEBUG, "Cache will be used");</div><div class='del'>-                if (stbuf)</div><div class='del'>-                        memcpy (stbuf, &amp;cachedbuf, sizeof (struct stat));</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        LIBGF_CLIENT_FOP (ctx, stub, stat, local, loc);</div><div class='del'>- </div><div class='del'>-        op_ret = stub-&gt;args.stat_cbk.op_ret;</div><div class='del'>-        errno = stub-&gt;args.stat_cbk.op_errno;</div><div class='del'>-        libgf_transform_iattr (ctx, loc-&gt;inode, &amp;stub-&gt;args.stat_cbk.buf);</div><div class='del'>-</div><div class='del'>-        gf_log (LIBGF_XL_NAME, GF_LOG_DEBUG, "path %s, status %d, errno %d",</div><div class='del'>-                loc-&gt;path, op_ret, errno);</div><div class='del'>-</div><div class='del'>-        if (op_ret == 0) {</div><div class='del'>-                if (stbuf)</div><div class='del'>-                        *stbuf = stub-&gt;args.stat_cbk.buf;</div><div class='del'>-</div><div class='del'>-                libgf_update_iattr_cache (loc-&gt;inode, LIBGF_UPDATE_STAT,</div><div class='del'>-                                          &amp;stub-&gt;args.stat_cbk.buf);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-	call_stub_destroy (stub);</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        return op_ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-libgf_realpath_loc_fill (libglusterfs_client_ctx_t *ctx, char *link,</div><div class='del'>-                                loc_t *targetloc)</div><div class='del'>-{</div><div class='del'>-        int             op_ret = -1;</div><div class='del'>-        char            *target = NULL;</div><div class='del'>-</div><div class='del'>-        GF_VALIDATE_OR_GOTO (LIBGF_XL_NAME, ctx, out);</div><div class='del'>-        GF_VALIDATE_OR_GOTO (LIBGF_XL_NAME, link, out);</div><div class='del'>-        GF_VALIDATE_OR_GOTO (LIBGF_XL_NAME, targetloc, out);</div><div class='del'>-</div><div class='del'>-        targetloc-&gt;path = glusterfs_glh_realpath (ctx, link, NULL);</div><div class='del'>-</div><div class='del'>-        if (targetloc-&gt;path == NULL)</div><div class='del'>-                goto out;</div><div class='del'>-</div><div class='del'>-        op_ret = libgf_client_path_lookup (targetloc, ctx, 1);</div><div class='del'>-        if (op_ret == -1)</div><div class='del'>-                goto out;</div><div class='del'>-</div><div class='del'>-        target = strdup (targetloc-&gt;path);</div><div class='del'>-        op_ret = libgf_client_loc_fill (targetloc, ctx, 0,</div><div class='del'>-                                               targetloc-&gt;parent-&gt;ino,</div><div class='del'>-                                               basename (target));</div><div class='del'>-        if (op_ret == -1) {</div><div class='del'>-                errno = EINVAL;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        if (target)</div><div class='del'>-                FREE (target);</div><div class='del'>-</div><div class='del'>-        return op_ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-#define LIBGF_DO_LSTAT  0x01</div><div class='del'>-#define LIBGF_DO_STAT   0x02</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-__glusterfs_stat (glusterfs_handle_t handle, const char *path,</div><div class='del'>-                  struct stat *buf, int whichstat)</div><div class='del'>-{</div><div class='del'>-        int32_t op_ret = -1;</div><div class='del'>-        loc_t loc = {0, };</div><div class='del'>-        libglusterfs_client_ctx_t *ctx = handle;</div><div class='del'>-	char *name = NULL, *pathname = NULL;</div><div class='del'>-        loc_t targetloc = {0, };</div><div class='del'>-        loc_t *real_loc = NULL;</div><div class='del'>-</div><div class='del'>-        GF_VALIDATE_OR_GOTO (LIBGF_XL_NAME, ctx, out);</div><div class='del'>-        GF_VALIDATE_ABSOLUTE_PATH_OR_GOTO (LIBGF_XL_NAME, path, out);</div><div class='del'>-</div><div class='del'>-        gf_log (LIBGF_XL_NAME, GF_LOG_DEBUG, "path %s, op: %d", path,</div><div class='del'>-                whichstat);</div><div class='del'>-</div><div class='del'>-        loc.path = strdup (path);</div><div class='del'>-        if (!loc.path) {</div><div class='del'>-                gf_log (LIBGF_XL_NAME, GF_LOG_ERROR, "strdup failed");</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-	op_ret = libgf_client_path_lookup (&amp;loc, ctx, 1);</div><div class='del'>-	if (op_ret == -1) {</div><div class='del'>-		gf_log ("libglusterfsclient", GF_LOG_ERROR,</div><div class='del'>-			"path lookup failed for (%s)", loc.path);</div><div class='del'>-		goto out;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	pathname = strdup (loc.path);</div><div class='del'>-	name = basename (pathname);</div><div class='del'>-</div><div class='del'>-        op_ret = libgf_client_loc_fill (&amp;loc, ctx, 0, loc.parent-&gt;ino, name);</div><div class='del'>-	if (op_ret == -1) {</div><div class='del'>-		gf_log ("libglusterfsclient",</div><div class='del'>-			GF_LOG_ERROR,</div><div class='del'>-			"libgf_client_loc_fill returned -1, returning EINVAL");</div><div class='del'>-		errno = EINVAL;</div><div class='del'>-		goto out;</div><div class='del'>-	}</div><div class='del'>-        real_loc = &amp;loc;</div><div class='del'>-        /* The stat fop in glusterfs calls lstat. So we have to</div><div class='del'>-         * provide the POSIX compatible stat fop. To do so, we need to ensure</div><div class='del'>-         * that if the @path is a symlink, we must perform a stat on the</div><div class='del'>-         * target of that symlink than the symlink itself(..because if</div><div class='del'>-         * do a stat on the symlink, we're actually doing what lstat</div><div class='del'>-         * should do. See posix_stat</div><div class='del'>-         */</div><div class='del'>-        if (whichstat &amp; LIBGF_DO_LSTAT)</div><div class='del'>-                goto lstat_fop;</div><div class='del'>-</div><div class='del'>-        if (!IA_ISLNK (loc.inode-&gt;ia_type))</div><div class='del'>-                goto lstat_fop;</div><div class='del'>-</div><div class='del'>-        op_ret = libgf_realpath_loc_fill (ctx, (char *)loc.path, &amp;targetloc);</div><div class='del'>-        if (op_ret == -1)</div><div class='del'>-                goto out;</div><div class='del'>-        real_loc = &amp;targetloc;</div><div class='del'>-</div><div class='del'>-lstat_fop:</div><div class='del'>-</div><div class='del'>-        if (!op_ret) {</div><div class='del'>-                struct iatt iatt;</div><div class='del'>-                op_ret = libgf_client_stat (ctx, real_loc, &amp;iatt);</div><div class='del'>-                iatt_to_stat (&amp;iatt, buf);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-	if (pathname) {</div><div class='del'>-		FREE (pathname);</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-        libgf_client_loc_wipe (&amp;loc);</div><div class='del'>-        libgf_client_loc_wipe (&amp;targetloc);</div><div class='del'>-</div><div class='del'>-        return op_ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-glusterfs_glh_stat (glusterfs_handle_t handle, const char *path,</div><div class='del'>-                    struct stat *buf)</div><div class='del'>-{</div><div class='del'>-        return __glusterfs_stat (handle, path, buf, LIBGF_DO_STAT);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-glusterfs_stat (const char *path, struct stat *buf)</div><div class='del'>-{</div><div class='del'>-        glusterfs_handle_t      h      = NULL;</div><div class='del'>-        int                     op_ret = -1;</div><div class='del'>-        char                    vpath[PATH_MAX];</div><div class='del'>-</div><div class='del'>-        GF_VALIDATE_OR_GOTO (LIBGF_XL_NAME, path, out);</div><div class='del'>-        GF_VALIDATE_OR_GOTO (LIBGF_XL_NAME, buf, out);</div><div class='del'>-</div><div class='del'>-        gf_log (LIBGF_XL_NAME, GF_LOG_DEBUG, "path %s", path);</div><div class='del'>-</div><div class='del'>-        h = libgf_resolved_path_handle (path, vpath);</div><div class='del'>-        if (!h) {</div><div class='del'>-                errno = ENODEV;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        op_ret = glusterfs_glh_stat (h, vpath, buf);</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        return op_ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-glusterfs_glh_lstat (glusterfs_handle_t handle, const char *path, struct stat *buf)</div><div class='del'>-{</div><div class='del'>-        return __glusterfs_stat (handle, path, buf, LIBGF_DO_LSTAT);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-glusterfs_lstat (const char *path, struct stat *buf)</div><div class='del'>-{</div><div class='del'>-        glusterfs_handle_t      h      = NULL;</div><div class='del'>-        int                     op_ret = -1;</div><div class='del'>-        char                    vpath[PATH_MAX];</div><div class='del'>-</div><div class='del'>-        GF_VALIDATE_OR_GOTO (LIBGF_XL_NAME, path, out);</div><div class='del'>-        GF_VALIDATE_OR_GOTO (LIBGF_XL_NAME, buf, out);</div><div class='del'>-</div><div class='del'>-        gf_log (LIBGF_XL_NAME, GF_LOG_DEBUG, "path %s", path);</div><div class='del'>-</div><div class='del'>-        h = libgf_resolved_path_handle (path, vpath);</div><div class='del'>-        if (!h) {</div><div class='del'>-                errno = ENODEV;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        op_ret = glusterfs_glh_lstat (h, vpath, buf);</div><div class='del'>-out:</div><div class='del'>-        return op_ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-static int32_t</div><div class='del'>-libgf_client_fstat_cbk (call_frame_t *frame,</div><div class='del'>-                        void *cookie,</div><div class='del'>-                        xlator_t *this,</div><div class='del'>-                        int32_t op_ret,</div><div class='del'>-                        int32_t op_errno,</div><div class='del'>-                        struct iatt *buf)</div><div class='del'>-{  </div><div class='del'>-        libgf_client_local_t *local = frame-&gt;local;</div><div class='del'>-</div><div class='del'>-        local-&gt;reply_stub = fop_fstat_cbk_stub (frame, </div><div class='del'>-                                                NULL, </div><div class='del'>-                                                op_ret, </div><div class='del'>-                                                op_errno, </div><div class='del'>-                                                buf);</div><div class='del'>-</div><div class='del'>-        LIBGF_REPLY_NOTIFY (local);</div><div class='del'>-        return 0;</div><div class='del'>-</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-libgf_client_fstat (libglusterfs_client_ctx_t *ctx, </div><div class='del'>-                    fd_t *fd, </div><div class='del'>-                    struct stat *buf)</div><div class='del'>-{</div><div class='del'>-        call_stub_t *stub = NULL;</div><div class='del'>-        int32_t op_ret = 0;</div><div class='del'>-        libgf_client_local_t *local = NULL;</div><div class='del'>-        struct iatt cachedbuf = {0, };</div><div class='del'>-</div><div class='del'>-        if (libgf_is_iattr_cache_valid (ctx, fd-&gt;inode, &amp;cachedbuf,</div><div class='del'>-                                        LIBGF_VALIDATE_STAT)) {</div><div class='del'>-                if (buf)</div><div class='del'>-                        memcpy (buf, &amp;cachedbuf, sizeof (struct stat));</div><div class='del'>-                gf_log (LIBGF_XL_NAME, GF_LOG_DEBUG, "Cache will be used");</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        LIBGF_CLIENT_FOP (ctx, stub, fstat, local, fd);</div><div class='del'>- </div><div class='del'>-        op_ret = stub-&gt;args.fstat_cbk.op_ret;</div><div class='del'>-        errno = stub-&gt;args.fstat_cbk.op_errno;</div><div class='del'>-        gf_log (LIBGF_XL_NAME, GF_LOG_DEBUG, "status %d, errno %d", op_ret,</div><div class='del'>-                errno);</div><div class='del'>-</div><div class='del'>-        if (op_ret == 0) {</div><div class='del'>-                libgf_transform_iattr (ctx, fd-&gt;inode,</div><div class='del'>-                                       &amp;stub-&gt;args.fstat_cbk.buf);</div><div class='del'>-                if (buf)</div><div class='del'>-                        iatt_to_stat (&amp;stub-&gt;args.fstat_cbk.buf, buf);</div><div class='del'>-                libgf_update_iattr_cache (fd-&gt;inode, LIBGF_UPDATE_STAT,</div><div class='del'>-                                          &amp;stub-&gt;args.fstat_cbk.buf);</div><div class='del'>-        }</div><div class='del'>-	call_stub_destroy (stub);</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        return op_ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t </div><div class='del'>-glusterfs_fstat (glusterfs_file_t fd, struct stat *buf) </div><div class='del'>-{</div><div class='del'>-        libglusterfs_client_ctx_t *ctx;</div><div class='del'>-        fd_t *__fd = (fd_t *)fd;</div><div class='del'>-        libglusterfs_client_fd_ctx_t *fd_ctx = NULL;</div><div class='del'>-	int32_t op_ret = -1;</div><div class='del'>-</div><div class='del'>-        fd_ctx = libgf_get_fd_ctx (fd);</div><div class='del'>-        if (!fd_ctx) {</div><div class='del'>-                gf_log (LIBGF_XL_NAME, GF_LOG_ERROR, "No fd context present");</div><div class='del'>-                errno = EBADF;</div><div class='del'>-		op_ret = -1;</div><div class='del'>-		goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        ctx = fd_ctx-&gt;ctx;</div><div class='del'>-</div><div class='del'>-	op_ret = libgf_client_fstat (ctx, __fd, buf);</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-	return op_ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-static int32_t</div><div class='del'>-libgf_client_mkdir_cbk (call_frame_t *frame,</div><div class='del'>-			void *cookie,</div><div class='del'>-			xlator_t *this,</div><div class='del'>-			int32_t op_ret,</div><div class='del'>-			int32_t op_errno,</div><div class='del'>-			inode_t *inode,</div><div class='del'>-                        struct iatt *buf,</div><div class='del'>-                        struct iatt *preparent,</div><div class='del'>-                        struct iatt *postparent)</div><div class='del'>-{</div><div class='del'>-        libgf_client_local_t *local = frame-&gt;local;</div><div class='del'>-</div><div class='del'>-        local-&gt;reply_stub = fop_mkdir_cbk_stub (frame, NULL, op_ret, op_errno,</div><div class='del'>-                                                inode, buf, preparent,</div><div class='del'>-                                                postparent);</div><div class='del'>-</div><div class='del'>-        LIBGF_REPLY_NOTIFY (local);</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-static int32_t</div><div class='del'>-libgf_client_mkdir (libglusterfs_client_ctx_t *ctx,</div><div class='del'>-		    loc_t *loc,</div><div class='del'>-		    mode_t mode)</div><div class='del'>-{</div><div class='del'>-	int32_t op_ret = -1;</div><div class='del'>-        call_stub_t *stub = NULL;</div><div class='del'>-        libgf_client_local_t *local = NULL;</div><div class='del'>-        inode_t *libgf_inode = NULL;</div><div class='del'>-</div><div class='del'>-        LIBGF_CLIENT_FOP (ctx, stub, mkdir, local, loc, mode);</div><div class='del'>-        op_ret = stub-&gt;args.mkdir_cbk.op_ret;</div><div class='del'>-        errno = stub-&gt;args.mkdir_cbk.op_errno;</div><div class='del'>-</div><div class='del'>-        gf_log (LIBGF_XL_NAME, GF_LOG_DEBUG, "path %s, status %d, errno %d",</div><div class='del'>-                loc-&gt;path, op_ret, errno);</div><div class='del'>-        if (op_ret == -1)</div><div class='del'>-                goto out;</div><div class='del'>-</div><div class='del'>-	libgf_inode = stub-&gt;args.mkdir_cbk.inode;</div><div class='del'>-        inode_link (libgf_inode, loc-&gt;parent, loc-&gt;name,</div><div class='del'>-                        &amp;stub-&gt;args.mkdir_cbk.buf);</div><div class='del'>-        libgf_transform_iattr (ctx, libgf_inode, &amp;stub-&gt;args.mkdir_cbk.buf);</div><div class='del'>-</div><div class='del'>-        inode_lookup (libgf_inode);</div><div class='del'>-</div><div class='del'>-        libgf_alloc_inode_ctx (ctx, libgf_inode);</div><div class='del'>-        libgf_update_iattr_cache (libgf_inode, LIBGF_UPDATE_ALL,</div><div class='del'>-                                        &amp;stub-&gt;args.mkdir_cbk.buf);</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-	call_stub_destroy (stub);</div><div class='del'>-</div><div class='del'>-	return op_ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-glusterfs_glh_mkdir (glusterfs_handle_t handle, const char *path, mode_t mode)</div><div class='del'>-{</div><div class='del'>-	libglusterfs_client_ctx_t *ctx = handle;</div><div class='del'>-	loc_t loc = {0, };</div><div class='del'>-	char *pathname = NULL, *name = NULL;</div><div class='del'>-	int32_t op_ret = -1;</div><div class='del'>-</div><div class='del'>-        GF_VALIDATE_OR_GOTO (LIBGF_XL_NAME, ctx, out);</div><div class='del'>-        GF_VALIDATE_ABSOLUTE_PATH_OR_GOTO (LIBGF_XL_NAME, path, out);</div><div class='del'>-</div><div class='del'>-        loc.path = strdup (path);</div><div class='del'>-        if (!loc.path) {</div><div class='del'>-                gf_log (LIBGF_XL_NAME, GF_LOG_ERROR, "strdup failed");</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-	op_ret = libgf_client_path_lookup (&amp;loc, ctx, 1);</div><div class='del'>-	if (op_ret == 0) {</div><div class='del'>-                op_ret = -1;</div><div class='del'>-                errno = EEXIST;</div><div class='del'>-		goto out;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-        op_ret = libgf_client_path_lookup (&amp;loc, ctx, 0);</div><div class='del'>-        if (op_ret == -1) {</div><div class='del'>-                errno = ENOENT;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-	pathname = strdup (loc.path);</div><div class='del'>-	name = basename (pathname);</div><div class='del'>-</div><div class='del'>-        op_ret = libgf_client_loc_fill (&amp;loc, ctx, 0, loc.parent-&gt;ino, name);</div><div class='del'>-	if (op_ret == -1) {</div><div class='del'>-		gf_log ("libglusterfsclient",</div><div class='del'>-			GF_LOG_ERROR,</div><div class='del'>-			"libgf_client_loc_fill returned -1, returning EINVAL");</div><div class='del'>-		errno = EINVAL;</div><div class='del'>-		goto out;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-        loc.inode = inode_new (ctx-&gt;itable);</div><div class='del'>-	op_ret = libgf_client_mkdir (ctx, &amp;loc, mode); </div><div class='del'>-	if (op_ret == -1) {</div><div class='del'>-		goto out;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-	libgf_client_loc_wipe (&amp;loc);</div><div class='del'>-	if (pathname) {</div><div class='del'>-		free (pathname);</div><div class='del'>-		pathname = NULL;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	return op_ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-glusterfs_mkdir (const char *path, mode_t mode)</div><div class='del'>-{</div><div class='del'>-        int                     op_ret = -1;</div><div class='del'>-        char                    vpath[PATH_MAX];</div><div class='del'>-        glusterfs_handle_t      h = NULL;</div><div class='del'>-</div><div class='del'>-        GF_VALIDATE_OR_GOTO (LIBGF_XL_NAME, path, out);</div><div class='del'>-</div><div class='del'>-        gf_log (LIBGF_XL_NAME, GF_LOG_DEBUG, "path %s", path);</div><div class='del'>-</div><div class='del'>-        h = libgf_resolved_path_handle (path, vpath);</div><div class='del'>-        if (!h) {</div><div class='del'>-                errno = ENODEV;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        op_ret = glusterfs_glh_mkdir (h, vpath, mode);</div><div class='del'>-out:</div><div class='del'>-        return op_ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-static int32_t</div><div class='del'>-libgf_client_rmdir_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-                        int32_t op_ret, int32_t op_errno,struct iatt *preparent,</div><div class='del'>-                        struct iatt *postparent)</div><div class='del'>-{</div><div class='del'>-        libgf_client_local_t *local = frame-&gt;local;</div><div class='del'>-</div><div class='del'>-        local-&gt;reply_stub = fop_rmdir_cbk_stub (frame, NULL, op_ret, op_errno,</div><div class='del'>-                                                preparent, postparent);</div><div class='del'>-</div><div class='del'>-        LIBGF_REPLY_NOTIFY (local);</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-static int32_t</div><div class='del'>-libgf_client_rmdir (libglusterfs_client_ctx_t *ctx, loc_t *loc)</div><div class='del'>-{</div><div class='del'>-        int32_t op_ret = -1;</div><div class='del'>-        call_stub_t *stub = NULL;</div><div class='del'>-        libgf_client_local_t *local = NULL;</div><div class='del'>-</div><div class='del'>-        LIBGF_CLIENT_FOP (ctx, stub, rmdir, local, loc);</div><div class='del'>-</div><div class='del'>-        op_ret = stub-&gt;args.rmdir_cbk.op_ret;</div><div class='del'>-        errno = stub-&gt;args.rmdir_cbk.op_errno;</div><div class='del'>-</div><div class='del'>-        gf_log (LIBGF_XL_NAME, GF_LOG_DEBUG, "path %s, status %d, errno %d",</div><div class='del'>-                loc-&gt;path, op_ret, errno);</div><div class='del'>-        if (stub-&gt;args.rmdir_cbk.op_ret != 0)</div><div class='del'>-                goto out;</div><div class='del'>-</div><div class='del'>-        inode_unlink (loc-&gt;inode, loc-&gt;parent, loc-&gt;name);</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-	call_stub_destroy (stub);</div><div class='del'>-</div><div class='del'>-	return op_ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-glusterfs_glh_rmdir (glusterfs_handle_t handle, const char *path)</div><div class='del'>-{</div><div class='del'>-	libglusterfs_client_ctx_t *ctx = handle;</div><div class='del'>-	loc_t loc = {0, };</div><div class='del'>-	char *pathname = NULL, *name = NULL;</div><div class='del'>-	int32_t op_ret = -1;</div><div class='del'>-</div><div class='del'>-        GF_VALIDATE_OR_GOTO (LIBGF_XL_NAME, ctx, out);</div><div class='del'>-        GF_VALIDATE_ABSOLUTE_PATH_OR_GOTO (LIBGF_XL_NAME, path, out);</div><div class='del'>-</div><div class='del'>-        loc.path = libgf_resolve_path_light ((char *)path);</div><div class='del'>-        if (!loc.path) {</div><div class='del'>-                gf_log (LIBGF_XL_NAME, GF_LOG_ERROR, "Path compaction failed");</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-	op_ret = libgf_client_path_lookup (&amp;loc, ctx, 1);</div><div class='del'>-	if (op_ret == -1) {</div><div class='del'>-		gf_log ("libglusterfsclient", GF_LOG_ERROR,</div><div class='del'>-			"path lookup failed for (%s)", loc.path);</div><div class='del'>-		goto out;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	pathname = strdup (loc.path);</div><div class='del'>-	name = basename (pathname);</div><div class='del'>-</div><div class='del'>-        op_ret = libgf_client_loc_fill (&amp;loc, ctx, 0, loc.parent-&gt;ino, name);</div><div class='del'>-	if (op_ret == -1) {</div><div class='del'>-		gf_log ("libglusterfsclient",</div><div class='del'>-			GF_LOG_ERROR,</div><div class='del'>-			"libgf_client_loc_fill returned -1, returning EINVAL");</div><div class='del'>-		errno = EINVAL;</div><div class='del'>-		goto out;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	op_ret = libgf_client_rmdir (ctx, &amp;loc);</div><div class='del'>-	if (op_ret == -1) {</div><div class='del'>-		goto out;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-	libgf_client_loc_wipe (&amp;loc);</div><div class='del'>-</div><div class='del'>-	if (pathname) {</div><div class='del'>-		free (pathname);</div><div class='del'>-		pathname = NULL;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	return op_ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-glusterfs_rmdir (const char *path)</div><div class='del'>-{</div><div class='del'>-        int                     op_ret = -1;</div><div class='del'>-        char                    vpath[PATH_MAX];</div><div class='del'>-        glusterfs_handle_t      h = NULL;</div><div class='del'>-</div><div class='del'>-        GF_VALIDATE_OR_GOTO (LIBGF_XL_NAME, path, out);</div><div class='del'>-</div><div class='del'>-        gf_log (LIBGF_XL_NAME, GF_LOG_DEBUG, "path %s", path);</div><div class='del'>-</div><div class='del'>-        h = libgf_resolved_path_handle (path, vpath);</div><div class='del'>-        if (!h) {</div><div class='del'>-                errno = ENODEV;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        op_ret = glusterfs_glh_rmdir (h, vpath);</div><div class='del'>-out:</div><div class='del'>-        return op_ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-libgf_client_setattr_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-                          int32_t op_ret, int32_t op_errno,</div><div class='del'>-                          struct iatt *preop, struct iatt *postop)</div><div class='del'>-{</div><div class='del'>-        libgf_client_local_t *local = frame-&gt;local;</div><div class='del'>-</div><div class='del'>-        local-&gt;reply_stub = fop_setattr_cbk_stub (frame, NULL,</div><div class='del'>-                                                  op_ret, op_errno,</div><div class='del'>-                                                  preop, postop);</div><div class='del'>-</div><div class='del'>-        LIBGF_REPLY_NOTIFY (local);</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-libgf_client_setattr (libglusterfs_client_ctx_t *ctx, loc_t * loc,</div><div class='del'>-                      struct iatt *stbuf, int32_t valid)</div><div class='del'>-{</div><div class='del'>-        int                             op_ret = -1;</div><div class='del'>-        libgf_client_local_t            *local = NULL;</div><div class='del'>-        call_stub_t                     *stub = NULL;</div><div class='del'>-</div><div class='del'>-        LIBGF_CLIENT_FOP (ctx, stub, setattr, local, loc,</div><div class='del'>-                          stbuf, valid);</div><div class='del'>-</div><div class='del'>-        op_ret = stub-&gt;args.setattr_cbk.op_ret;</div><div class='del'>-        errno = stub-&gt;args.setattr_cbk.op_errno;</div><div class='del'>-</div><div class='del'>-        if (op_ret == -1)</div><div class='del'>-                goto out;</div><div class='del'>-</div><div class='del'>-        libgf_transform_iattr (ctx, loc-&gt;inode,</div><div class='del'>-                               &amp;stub-&gt;args.setattr_cbk.statpost);</div><div class='del'>-        libgf_update_iattr_cache (loc-&gt;inode, LIBGF_UPDATE_STAT,</div><div class='del'>-                                  &amp;stub-&gt;args.setattr_cbk.statpost);</div><div class='del'>-out:</div><div class='del'>-        call_stub_destroy (stub);</div><div class='del'>-        return op_ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-glusterfs_glh_chmod (glusterfs_handle_t handle, const char *path, mode_t mode)</div><div class='del'>-{</div><div class='del'>-        int                             op_ret = -1;</div><div class='del'>-        libglusterfs_client_ctx_t       *ctx = handle;</div><div class='del'>-        loc_t                           loc = {0, };</div><div class='del'>-        char                            *name = NULL;</div><div class='del'>-        struct iatt                     stbuf = {0,};</div><div class='del'>-        int32_t                         valid = 0;</div><div class='del'>-</div><div class='del'>-        GF_VALIDATE_OR_GOTO (LIBGF_XL_NAME, ctx, out);</div><div class='del'>-        GF_VALIDATE_ABSOLUTE_PATH_OR_GOTO (LIBGF_XL_NAME, path, out);</div><div class='del'>-</div><div class='del'>-        stbuf.ia_prot = ia_prot_from_st_mode (mode);</div><div class='del'>-        valid |= GF_SET_ATTR_MODE;</div><div class='del'>-</div><div class='del'>-        loc.path = strdup (path);</div><div class='del'>-        if (!loc.path) {</div><div class='del'>-                gf_log (LIBGF_XL_NAME, GF_LOG_ERROR, "strdup failed");</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        op_ret = libgf_client_path_lookup (&amp;loc, ctx, 1);</div><div class='del'>-        if (op_ret == -1)</div><div class='del'>-                goto out;</div><div class='del'>-</div><div class='del'>-        name = strdup (loc.path);</div><div class='del'>-        op_ret = libgf_client_loc_fill (&amp;loc, ctx, 0, loc.parent-&gt;ino,</div><div class='del'>-                                                basename (name));</div><div class='del'>-        if (op_ret == -1) {</div><div class='del'>-                errno = EINVAL;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        op_ret = libgf_client_setattr (ctx, &amp;loc, &amp;stbuf, valid);</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        if (name)</div><div class='del'>-                FREE (name);</div><div class='del'>-</div><div class='del'>-        libgf_client_loc_wipe (&amp;loc);</div><div class='del'>-        return op_ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-glusterfs_chmod (const char *path, mode_t mode)</div><div class='del'>-{</div><div class='del'>-        int                     op_ret = -1;</div><div class='del'>-        char                    vpath[PATH_MAX];</div><div class='del'>-        glusterfs_handle_t      h = NULL;</div><div class='del'>-</div><div class='del'>-        GF_VALIDATE_OR_GOTO (LIBGF_XL_NAME, path, out);</div><div class='del'>-</div><div class='del'>-        gf_log (LIBGF_XL_NAME, GF_LOG_DEBUG, "path %s", path);</div><div class='del'>-</div><div class='del'>-        h = libgf_resolved_path_handle (path, vpath);</div><div class='del'>-        if (!h) {</div><div class='del'>-                errno = ENODEV;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        op_ret = glusterfs_glh_chmod (h, vpath, mode);</div><div class='del'>-out:</div><div class='del'>-        return op_ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-#define LIBGF_DO_CHOWN  1</div><div class='del'>-#define LIBGF_DO_LCHOWN 2</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-__glusterfs_chown (glusterfs_handle_t handle, const char *path, uid_t owner,</div><div class='del'>-                   gid_t group, int whichop)</div><div class='del'>-{</div><div class='del'>-        int                             op_ret = -1;</div><div class='del'>-        libglusterfs_client_ctx_t       *ctx = handle;</div><div class='del'>-        loc_t                           loc = {0, };</div><div class='del'>-        char                            *name = NULL;</div><div class='del'>-        loc_t                           *oploc = NULL;</div><div class='del'>-        loc_t                           targetloc = {0, };</div><div class='del'>-        struct iatt                     stbuf = {0,};</div><div class='del'>-        int32_t                         valid = 0;</div><div class='del'>-</div><div class='del'>-        GF_VALIDATE_OR_GOTO (LIBGF_XL_NAME, ctx, out);</div><div class='del'>-        GF_VALIDATE_ABSOLUTE_PATH_OR_GOTO (LIBGF_XL_NAME, path, out);</div><div class='del'>-</div><div class='del'>-        gf_log (LIBGF_XL_NAME, GF_LOG_DEBUG, "path %s, op %d", path, whichop);</div><div class='del'>-        stbuf.ia_uid = owner;</div><div class='del'>-        stbuf.ia_gid = group;</div><div class='del'>-        valid |= (GF_SET_ATTR_UID | GF_SET_ATTR_GID);</div><div class='del'>-</div><div class='del'>-        loc.path = strdup (path);</div><div class='del'>-        if (!loc.path) {</div><div class='del'>-                gf_log (LIBGF_XL_NAME, GF_LOG_ERROR, "strdup failed");</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        op_ret = libgf_client_path_lookup (&amp;loc, ctx, 1);</div><div class='del'>-        if (op_ret == -1)</div><div class='del'>-                goto out;</div><div class='del'>-</div><div class='del'>-        name = strdup (loc.path);</div><div class='del'>-        op_ret = libgf_client_loc_fill (&amp;loc, ctx, 0, loc.parent-&gt;ino,</div><div class='del'>-                        basename ((char *)name));</div><div class='del'>-        if (op_ret == -1) {</div><div class='del'>-                errno = EINVAL;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        oploc = &amp;loc;</div><div class='del'>-        if (whichop == LIBGF_DO_LCHOWN)</div><div class='del'>-                goto do_lchown;</div><div class='del'>-</div><div class='del'>-        if (!IA_ISLNK (loc.inode-&gt;ia_type))</div><div class='del'>-                goto do_lchown;</div><div class='del'>-</div><div class='del'>-        op_ret = libgf_realpath_loc_fill (ctx, (char *)loc.path, &amp;targetloc);</div><div class='del'>-        if (op_ret == -1)</div><div class='del'>-                goto out;</div><div class='del'>-</div><div class='del'>-        oploc = &amp;targetloc;</div><div class='del'>-do_lchown:</div><div class='del'>-        op_ret = libgf_client_setattr (ctx, oploc, &amp;stbuf, valid);</div><div class='del'>-out:</div><div class='del'>-        if (name)</div><div class='del'>-                FREE (name);</div><div class='del'>-        libgf_client_loc_wipe (&amp;loc);</div><div class='del'>-        libgf_client_loc_wipe (&amp;targetloc);</div><div class='del'>-        return op_ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-glusterfs_glh_chown (glusterfs_handle_t handle, const char *path, uid_t owner,</div><div class='del'>-                     gid_t group)</div><div class='del'>-{</div><div class='del'>-        return __glusterfs_chown (handle, path, owner, group, LIBGF_DO_CHOWN);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-glusterfs_chown (const char *path, uid_t owner, gid_t group)</div><div class='del'>-{</div><div class='del'>-        int                     op_ret = -1;</div><div class='del'>-        char                    vpath[PATH_MAX];</div><div class='del'>-        glusterfs_handle_t      h = NULL;</div><div class='del'>-</div><div class='del'>-        GF_VALIDATE_OR_GOTO (LIBGF_XL_NAME, path, out);</div><div class='del'>-</div><div class='del'>-        gf_log (LIBGF_XL_NAME, GF_LOG_DEBUG, "path %s", path);</div><div class='del'>-</div><div class='del'>-        h = libgf_resolved_path_handle (path, vpath);</div><div class='del'>-        if (!h) {</div><div class='del'>-                errno = ENODEV;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        op_ret = glusterfs_glh_chown (h, vpath, owner, group);</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        return op_ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-glusterfs_glh_lchown (glusterfs_handle_t handle, const char *path, uid_t owner,</div><div class='del'>-                     gid_t group)</div><div class='del'>-{</div><div class='del'>-        return __glusterfs_chown (handle, path, owner, group, LIBGF_DO_LCHOWN);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-glusterfs_lchown (const char *path, uid_t owner, gid_t group)</div><div class='del'>-{</div><div class='del'>-        int                     op_ret = -1;</div><div class='del'>-        char                    vpath[PATH_MAX];</div><div class='del'>-        glusterfs_handle_t      h = NULL;</div><div class='del'>-</div><div class='del'>-        GF_VALIDATE_OR_GOTO (LIBGF_XL_NAME, path, out);</div><div class='del'>-</div><div class='del'>-        gf_log (LIBGF_XL_NAME, GF_LOG_DEBUG, "path %s", path);</div><div class='del'>-</div><div class='del'>-        h = libgf_resolved_path_handle (path, vpath);</div><div class='del'>-        if (!h) {</div><div class='del'>-                errno = ENODEV;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        op_ret = glusterfs_glh_lchown (h, vpath, owner, group);</div><div class='del'>-out:</div><div class='del'>-        return op_ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-glusterfs_dir_t</div><div class='del'>-glusterfs_glh_opendir (glusterfs_handle_t handle, const char *path)</div><div class='del'>-{</div><div class='del'>-        int                             op_ret = -1;</div><div class='del'>-        libglusterfs_client_ctx_t       *ctx = handle;</div><div class='del'>-        loc_t                           loc = {0, };</div><div class='del'>-        fd_t                            *dirfd = NULL;</div><div class='del'>-        char                            *name = NULL;</div><div class='del'>-</div><div class='del'>-        GF_VALIDATE_OR_GOTO (LIBGF_XL_NAME, ctx, out);</div><div class='del'>-        GF_VALIDATE_ABSOLUTE_PATH_OR_GOTO (LIBGF_XL_NAME, path, out);</div><div class='del'>-</div><div class='del'>-        gf_log (LIBGF_XL_NAME, GF_LOG_DEBUG, "path %s", path);</div><div class='del'>-</div><div class='del'>-        loc.path = strdup (path);</div><div class='del'>-        if (!loc.path) {</div><div class='del'>-                gf_log (LIBGF_XL_NAME, GF_LOG_ERROR, "strdup failed");</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-        op_ret = libgf_client_path_lookup (&amp;loc, ctx, 1);</div><div class='del'>-</div><div class='del'>-        if (op_ret == -1)</div><div class='del'>-                goto out;</div><div class='del'>-</div><div class='del'>-        name = strdup (loc.path);</div><div class='del'>-        op_ret = libgf_client_loc_fill (&amp;loc, ctx, 0, loc.parent-&gt;ino,</div><div class='del'>-                        basename (name));</div><div class='del'>-        if (op_ret == -1) {</div><div class='del'>-                errno = EINVAL;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (!IA_ISDIR (loc.inode-&gt;ia_type) &amp;&amp; !IA_ISLNK (loc.inode-&gt;ia_type)) {</div><div class='del'>-                errno = ENOTDIR;</div><div class='del'>-                op_ret = -1;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        dirfd = fd_create (loc.inode, ctx-&gt;pid);</div><div class='del'>-        op_ret = libgf_client_opendir (ctx, &amp;loc, dirfd);</div><div class='del'>-</div><div class='del'>-        if (op_ret == -1) {</div><div class='del'>-                fd_unref (dirfd);</div><div class='del'>-                dirfd = NULL;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (!libgf_get_fd_ctx (dirfd)) {</div><div class='del'>-                if (!(libgf_alloc_fd_ctx (ctx, dirfd, (char *)path))) {</div><div class='del'>-                        gf_log (LIBGF_XL_NAME, GF_LOG_ERROR, "Context "</div><div class='del'>-                                "allocation failed");</div><div class='del'>-                        op_ret = -1;</div><div class='del'>-                        errno = EINVAL;</div><div class='del'>-                        goto out;</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        if (name)</div><div class='del'>-                FREE (name);</div><div class='del'>-</div><div class='del'>-        if (op_ret == -1) {</div><div class='del'>-                fd_unref (dirfd);</div><div class='del'>-                dirfd = NULL;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        libgf_client_loc_wipe (&amp;loc);</div><div class='del'>-        return dirfd;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-glusterfs_dir_t</div><div class='del'>-glusterfs_opendir (const char *path)</div><div class='del'>-{</div><div class='del'>-        char                    vpath[PATH_MAX];</div><div class='del'>-        glusterfs_dir_t         dir = NULL;</div><div class='del'>-        glusterfs_handle_t      h = NULL;</div><div class='del'>-</div><div class='del'>-        GF_VALIDATE_OR_GOTO (LIBGF_XL_NAME, path, out);</div><div class='del'>-        gf_log (LIBGF_XL_NAME, GF_LOG_DEBUG, "path %s", path);</div><div class='del'>-</div><div class='del'>-        h = libgf_resolved_path_handle (path, vpath);</div><div class='del'>-        if (!h) {</div><div class='del'>-                errno = ENODEV;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        dir = glusterfs_glh_opendir (h, vpath);</div><div class='del'>-out:</div><div class='del'>-        return dir;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-glusterfs_closedir (glusterfs_dir_t dirfd)</div><div class='del'>-{</div><div class='del'>-        int                             op_ret = -1;</div><div class='del'>-        libglusterfs_client_fd_ctx_t    *fdctx = NULL;</div><div class='del'>-</div><div class='del'>-        GF_VALIDATE_OR_GOTO (LIBGF_XL_NAME, dirfd, out);</div><div class='del'>-        fdctx = libgf_get_fd_ctx (dirfd);</div><div class='del'>-</div><div class='del'>-        if (fdctx == NULL) {</div><div class='del'>-                errno = EBADF;</div><div class='del'>-                op_ret = -1;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        op_ret = libgf_client_flush (fdctx-&gt;ctx, (fd_t *)dirfd);</div><div class='del'>-        fd_unref ((fd_t *)dirfd);</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        return op_ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-libgf_client_fsetattr_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-                           int32_t op_ret, int32_t op_errno,</div><div class='del'>-                           struct iatt *preop, struct iatt *postop)</div><div class='del'>-{</div><div class='del'>-        libgf_client_local_t    *local = frame-&gt;local;</div><div class='del'>-</div><div class='del'>-        local-&gt;reply_stub = fop_fsetattr_cbk_stub (frame, NULL,</div><div class='del'>-                                                   op_ret, op_errno,</div><div class='del'>-                                                   preop, postop);</div><div class='del'>-        LIBGF_REPLY_NOTIFY (local);</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-libgf_client_fsetattr (libglusterfs_client_ctx_t *ctx, fd_t *fd,</div><div class='del'>-                       struct iatt *stbuf, int32_t valid)</div><div class='del'>-{</div><div class='del'>-        int                     op_ret = -1;</div><div class='del'>-        libgf_client_local_t    *local = NULL;</div><div class='del'>-        call_stub_t             *stub = NULL;</div><div class='del'>-</div><div class='del'>-        LIBGF_CLIENT_FOP (ctx, stub, fsetattr, local, fd, stbuf, valid);</div><div class='del'>-</div><div class='del'>-        op_ret = stub-&gt;args.fsetattr_cbk.op_ret;</div><div class='del'>-        errno = stub-&gt;args.fsetattr_cbk.op_errno;</div><div class='del'>-</div><div class='del'>-        if (op_ret == -1)</div><div class='del'>-                goto out;</div><div class='del'>-</div><div class='del'>-        libgf_transform_iattr (ctx, fd-&gt;inode,</div><div class='del'>-                               &amp;stub-&gt;args.fsetattr_cbk.statpost);</div><div class='del'>-        libgf_update_iattr_cache (fd-&gt;inode, LIBGF_UPDATE_STAT,</div><div class='del'>-                                  &amp;stub-&gt;args.fsetattr_cbk.statpost);</div><div class='del'>-out:</div><div class='del'>-        call_stub_destroy (stub);</div><div class='del'>-        return op_ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-glusterfs_fchmod (glusterfs_file_t fd, mode_t mode)</div><div class='del'>-{</div><div class='del'>-        libglusterfs_client_fd_ctx_t    *fdctx = NULL;</div><div class='del'>-        int                             op_ret = -1;</div><div class='del'>-        struct iatt                     stbuf = {0,};</div><div class='del'>-        int32_t                         valid = 0;</div><div class='del'>-</div><div class='del'>-        GF_VALIDATE_OR_GOTO (LIBGF_XL_NAME, fd, out);</div><div class='del'>-        fdctx = libgf_get_fd_ctx (fd);</div><div class='del'>-</div><div class='del'>-        if (!fdctx) {</div><div class='del'>-                gf_log (LIBGF_XL_NAME, GF_LOG_DEBUG, "No fd context present");</div><div class='del'>-                errno = EBADF;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        stbuf.ia_prot = ia_prot_from_st_mode (mode);</div><div class='del'>-        valid |= GF_SET_ATTR_MODE;</div><div class='del'>-</div><div class='del'>-        op_ret = libgf_client_fsetattr (fdctx-&gt;ctx, fd, &amp;stbuf, valid);</div><div class='del'>-out:</div><div class='del'>-        return op_ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-glusterfs_fchown (glusterfs_file_t fd, uid_t uid, gid_t gid)</div><div class='del'>-{</div><div class='del'>-        int                             op_ret = -1;</div><div class='del'>-        libglusterfs_client_fd_ctx_t    *fdctx = NULL;</div><div class='del'>-        struct iatt                     stbuf = {0,};</div><div class='del'>-        int32_t                         valid = 0;</div><div class='del'>-</div><div class='del'>-        GF_VALIDATE_OR_GOTO (LIBGF_XL_NAME, fd, out);</div><div class='del'>-</div><div class='del'>-        fdctx = libgf_get_fd_ctx (fd);</div><div class='del'>-        if (!fd) {</div><div class='del'>-                gf_log (LIBGF_XL_NAME, GF_LOG_ERROR, "No fd context present");</div><div class='del'>-                errno = EBADF;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-        stbuf.ia_uid = uid;</div><div class='del'>-        stbuf.ia_gid = gid;</div><div class='del'>-</div><div class='del'>-        valid |= (GF_SET_ATTR_UID | GF_SET_ATTR_GID);</div><div class='del'>-</div><div class='del'>-        op_ret = libgf_client_fsetattr (fdctx-&gt;ctx, fd, &amp;stbuf, valid);</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        return op_ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-libgf_client_fsync_cbk (call_frame_t *frame, void *cookie, xlator_t *xlator,</div><div class='del'>-                        int32_t op_ret, int32_t op_errno, struct iatt *prebuf,</div><div class='del'>-                        struct iatt *postbuf)</div><div class='del'>-{</div><div class='del'>-        libgf_client_local_t    *local = frame-&gt;local;</div><div class='del'>-</div><div class='del'>-        local-&gt;reply_stub = fop_fsync_cbk_stub (frame, NULL, op_ret, op_errno,</div><div class='del'>-                                                prebuf, postbuf);</div><div class='del'>-</div><div class='del'>-        LIBGF_REPLY_NOTIFY (local);</div><div class='del'>-</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-libgf_client_fsync (libglusterfs_client_ctx_t *ctx, fd_t *fd)</div><div class='del'>-{</div><div class='del'>-        libgf_client_local_t    *local = NULL;</div><div class='del'>-        call_stub_t             *stub = NULL;</div><div class='del'>-        int                     op_ret = -1;</div><div class='del'>-</div><div class='del'>-        LIBGF_CLIENT_FOP (ctx, stub, fsync, local, fd, 0);</div><div class='del'>-</div><div class='del'>-        op_ret = stub-&gt;args.fsync_cbk.op_ret;</div><div class='del'>-        errno = stub-&gt;args.fsync_cbk.op_errno;</div><div class='del'>-</div><div class='del'>-        gf_log (LIBGF_XL_NAME, GF_LOG_DEBUG, "status %d, errno %d", op_ret,</div><div class='del'>-                errno);</div><div class='del'>-        call_stub_destroy (stub);</div><div class='del'>-</div><div class='del'>-        return op_ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-glusterfs_fsync (glusterfs_file_t *fd)</div><div class='del'>-{</div><div class='del'>-        libglusterfs_client_fd_ctx_t    *fdctx = NULL;</div><div class='del'>-        int                             op_ret = -1;</div><div class='del'>-</div><div class='del'>-        GF_VALIDATE_OR_GOTO (LIBGF_XL_NAME, fd, out);</div><div class='del'>-</div><div class='del'>-        fdctx = libgf_get_fd_ctx ((fd_t *)fd);</div><div class='del'>-        if (!fdctx) {</div><div class='del'>-                gf_log (LIBGF_XL_NAME, GF_LOG_ERROR, "No fd context present");</div><div class='del'>-                errno = EBADF;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        op_ret = libgf_client_fsync (fdctx-&gt;ctx, (fd_t *)fd);</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        return op_ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-libgf_client_ftruncate_cbk (call_frame_t *frame, void *cookie, xlator_t *xlator</div><div class='del'>-                                ,int32_t op_ret, int32_t op_errno,</div><div class='del'>-                                struct iatt *prebuf, struct iatt *postbuf)</div><div class='del'>-{</div><div class='del'>-        libgf_client_local_t    *local = frame-&gt;local;</div><div class='del'>-</div><div class='del'>-        local-&gt;reply_stub = fop_ftruncate_cbk_stub (frame, NULL, op_ret,</div><div class='del'>-                                                    op_errno, prebuf, postbuf);</div><div class='del'>-</div><div class='del'>-        LIBGF_REPLY_NOTIFY (local);</div><div class='del'>-</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-libgf_client_ftruncate (libglusterfs_client_ctx_t *ctx, fd_t *fd,</div><div class='del'>-                                off_t length)</div><div class='del'>-{</div><div class='del'>-        libgf_client_local_t            *local = NULL;</div><div class='del'>-        call_stub_t                     *stub = NULL;</div><div class='del'>-        int                             op_ret = -1;</div><div class='del'>-        libglusterfs_client_fd_ctx_t    *fdctx = NULL;</div><div class='del'>-</div><div class='del'>-        if (!(((fd-&gt;flags &amp; O_ACCMODE) == O_RDWR)</div><div class='del'>-              || ((fd-&gt;flags &amp; O_ACCMODE) == O_WRONLY))) {</div><div class='del'>-                errno = EBADF;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        LIBGF_CLIENT_FOP (ctx, stub, ftruncate, local, fd, length);</div><div class='del'>-</div><div class='del'>-        op_ret = stub-&gt;args.ftruncate_cbk.op_ret;</div><div class='del'>-        errno = stub-&gt;args.ftruncate_cbk.op_errno;</div><div class='del'>-</div><div class='del'>-        if (op_ret == -1)</div><div class='del'>-                goto out;</div><div class='del'>-</div><div class='del'>-        libgf_transform_iattr (ctx, fd-&gt;inode,</div><div class='del'>-                               &amp;stub-&gt;args.ftruncate_cbk.postbuf);</div><div class='del'>-        libgf_update_iattr_cache (fd-&gt;inode, LIBGF_UPDATE_STAT,</div><div class='del'>-                                        &amp;stub-&gt;args.ftruncate_cbk.postbuf);</div><div class='del'>-</div><div class='del'>-        fdctx = libgf_get_fd_ctx (fd);</div><div class='del'>-        if (!fd) {</div><div class='del'>-                errno = EINVAL;</div><div class='del'>-                op_ret = -1;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        pthread_mutex_lock (&amp;fdctx-&gt;lock);</div><div class='del'>-        {</div><div class='del'>-                fdctx-&gt;offset = stub-&gt;args.ftruncate_cbk.postbuf.ia_size;</div><div class='del'>-        }</div><div class='del'>-        pthread_mutex_unlock (&amp;fdctx-&gt;lock);</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        call_stub_destroy (stub);</div><div class='del'>-        return op_ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-glusterfs_ftruncate (glusterfs_file_t fd, off_t length)</div><div class='del'>-{</div><div class='del'>-        libglusterfs_client_fd_ctx_t    *fdctx = NULL;</div><div class='del'>-        int                             op_ret = -1;</div><div class='del'>-</div><div class='del'>-        GF_VALIDATE_OR_GOTO (LIBGF_XL_NAME, fd, out);</div><div class='del'>-</div><div class='del'>-        fdctx = libgf_get_fd_ctx (fd);</div><div class='del'>-        if (!fdctx) {</div><div class='del'>-                gf_log (LIBGF_XL_NAME, GF_LOG_ERROR, "No fd context present");</div><div class='del'>-                errno = EBADF;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        op_ret = libgf_client_ftruncate (fdctx-&gt;ctx, fd, length);</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        return op_ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-libgf_client_link_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-                                int32_t op_ret, int32_t op_errno,</div><div class='del'>-                                inode_t *inode, struct iatt *buf,</div><div class='del'>-                                struct iatt *preparent, struct iatt *postparent)</div><div class='del'>-{</div><div class='del'>-        libgf_client_local_t            *local = frame-&gt;local;</div><div class='del'>-</div><div class='del'>-        local-&gt;reply_stub = fop_link_cbk_stub (frame, NULL, op_ret, op_errno,</div><div class='del'>-                                               inode, buf, preparent,</div><div class='del'>-                                               postparent);</div><div class='del'>-</div><div class='del'>-        LIBGF_REPLY_NOTIFY (local);</div><div class='del'>-</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-libgf_client_link (libglusterfs_client_ctx_t *ctx, loc_t *old, loc_t *new)</div><div class='del'>-{</div><div class='del'>-        call_stub_t                     *stub = NULL;</div><div class='del'>-        libgf_client_local_t            *local = NULL;</div><div class='del'>-        int                             op_ret = -1;</div><div class='del'>-        inode_t                         *inode = NULL;</div><div class='del'>-        struct iatt                     *sbuf = NULL;</div><div class='del'>-</div><div class='del'>-        LIBGF_CLIENT_FOP (ctx, stub, link, local, old, new);</div><div class='del'>-</div><div class='del'>-        op_ret = stub-&gt;args.link_cbk.op_ret;</div><div class='del'>-        errno = stub-&gt;args.link_cbk.op_errno;</div><div class='del'>-</div><div class='del'>-        gf_log (LIBGF_XL_NAME, GF_LOG_DEBUG, "old %s, new %s, status %d,"</div><div class='del'>-                " errno %d", old-&gt;path, new-&gt;path, op_ret, errno);</div><div class='del'>-        if (op_ret == -1)</div><div class='del'>-                goto out;</div><div class='del'>-</div><div class='del'>-        inode = stub-&gt;args.link_cbk.inode;</div><div class='del'>-        sbuf = &amp;stub-&gt;args.link_cbk.buf;</div><div class='del'>-        inode_link (inode, new-&gt;parent, basename ((char *)new-&gt;path), sbuf);</div><div class='del'>-        libgf_transform_iattr (ctx, inode, sbuf);</div><div class='del'>-        inode_lookup (inode);</div><div class='del'>-        libgf_update_iattr_cache (inode, LIBGF_UPDATE_STAT, sbuf);</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        call_stub_destroy (stub);</div><div class='del'>-        return op_ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-glusterfs_glh_link (glusterfs_handle_t handle, const char *oldpath,</div><div class='del'>-                        const char *newpath)</div><div class='del'>-{</div><div class='del'>-        libglusterfs_client_ctx_t       *ctx = handle;</div><div class='del'>-        int                             op_ret = -1;</div><div class='del'>-        loc_t                           old = {0,};</div><div class='del'>-        loc_t                           new = {0,};</div><div class='del'>-        char                            *oldname = NULL;</div><div class='del'>-        char                            *newname = NULL;</div><div class='del'>-</div><div class='del'>-        GF_VALIDATE_OR_GOTO (LIBGF_XL_NAME, ctx, out);</div><div class='del'>-        GF_VALIDATE_ABSOLUTE_PATH_OR_GOTO (LIBGF_XL_NAME, oldpath, out);</div><div class='del'>-        GF_VALIDATE_ABSOLUTE_PATH_OR_GOTO (LIBGF_XL_NAME, newpath, out);</div><div class='del'>-</div><div class='del'>-        gf_log (LIBGF_XL_NAME, GF_LOG_DEBUG, "old %s, new %s", oldpath,</div><div class='del'>-                newpath);</div><div class='del'>-</div><div class='del'>-        old.path = strdup (oldpath);</div><div class='del'>-        if (!old.path) {</div><div class='del'>-                gf_log (LIBGF_XL_NAME, GF_LOG_ERROR, "strdup failed");</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        op_ret = libgf_client_path_lookup (&amp;old, ctx, 1);</div><div class='del'>-        if (op_ret == -1) {</div><div class='del'>-                errno = ENOENT;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        oldname = strdup (old.path);</div><div class='del'>-        op_ret = libgf_client_loc_fill (&amp;old, ctx, 0, old.parent-&gt;ino,</div><div class='del'>-                                                basename (oldname));</div><div class='del'>-        if (op_ret == -1) {</div><div class='del'>-                errno = EINVAL;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (IA_ISDIR (old.inode-&gt;ia_type)) {</div><div class='del'>-                errno = EPERM;</div><div class='del'>-                op_ret = -1;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        new.path = strdup (newpath);</div><div class='del'>-        if (!new.path) {</div><div class='del'>-                gf_log (LIBGF_XL_NAME, GF_LOG_ERROR, "strdup failed");</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        op_ret = libgf_client_path_lookup (&amp;new, ctx, 1);</div><div class='del'>-        if (op_ret == 0) {</div><div class='del'>-                errno = EEXIST;</div><div class='del'>-                op_ret = -1;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        newname = strdup (new.path);</div><div class='del'>-        new.inode = inode_ref (old.inode);</div><div class='del'>-        libgf_client_loc_fill (&amp;new, ctx, 0, new.parent-&gt;ino,</div><div class='del'>-                        basename (newname));</div><div class='del'>-        op_ret = libgf_client_link (ctx, &amp;old, &amp;new);</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        if (oldname)</div><div class='del'>-                FREE (oldname);</div><div class='del'>-        if (newname)</div><div class='del'>-                FREE (newname);</div><div class='del'>-        libgf_client_loc_wipe (&amp;old);</div><div class='del'>-        libgf_client_loc_wipe (&amp;new);</div><div class='del'>-</div><div class='del'>-        return op_ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-glusterfs_link (const char *oldpath, const char *newpath)</div><div class='del'>-{</div><div class='del'>-        int                     op_ret = -1;</div><div class='del'>-        char                    oldvpath[PATH_MAX];</div><div class='del'>-        char                    newvpath[PATH_MAX];</div><div class='del'>-        glusterfs_handle_t      oldh = NULL;</div><div class='del'>-        glusterfs_handle_t      newh = NULL;</div><div class='del'>-</div><div class='del'>-        GF_VALIDATE_OR_GOTO (LIBGF_XL_NAME, oldpath, out);</div><div class='del'>-        GF_VALIDATE_OR_GOTO (LIBGF_XL_NAME, newpath, out);</div><div class='del'>-</div><div class='del'>-        gf_log (LIBGF_XL_NAME, GF_LOG_DEBUG, "old %s, new %s", oldpath,</div><div class='del'>-                newpath);</div><div class='del'>-</div><div class='del'>-        oldh = libgf_resolved_path_handle (oldpath, oldvpath);</div><div class='del'>-        if (!oldh) {</div><div class='del'>-                errno = ENODEV;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        newh = libgf_resolved_path_handle (newpath, newvpath);</div><div class='del'>-        if (!newh) {</div><div class='del'>-                errno = ENODEV;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        /* Cannot hard link across glusterfs mounts. */</div><div class='del'>-        if (newh != oldh) {</div><div class='del'>-                errno = EXDEV;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        op_ret = glusterfs_glh_link (newh, oldvpath, newvpath);</div><div class='del'>-out:</div><div class='del'>-        return op_ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-libgf_client_statfs_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-                         int32_t op_ret, int32_t op_errno, struct statvfs *buf)</div><div class='del'>-{</div><div class='del'>-        libgf_client_local_t    *local = frame-&gt;local;</div><div class='del'>-</div><div class='del'>-        local-&gt;reply_stub = fop_statfs_cbk_stub (frame, NULL, op_ret, op_errno,</div><div class='del'>-                                                 buf);</div><div class='del'>-</div><div class='del'>-        LIBGF_REPLY_NOTIFY (local);</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-libgf_client_statvfs (libglusterfs_client_ctx_t *ctx, loc_t *loc,</div><div class='del'>-                      struct statvfs *buf)</div><div class='del'>-{</div><div class='del'>-        call_stub_t             *stub = NULL;</div><div class='del'>-        libgf_client_local_t    *local = NULL;</div><div class='del'>-        int32_t                 op_ret = -1;</div><div class='del'>-</div><div class='del'>-        /* statfs fop receives struct statvfs as an argument */</div><div class='del'>-</div><div class='del'>-        /* libgf_client_statfs_cbk will be the callback, not</div><div class='del'>-           libgf_client_statvfs_cbk. see definition of LIBGF_CLIENT_FOP</div><div class='del'>-        */</div><div class='del'>-        LIBGF_CLIENT_FOP (ctx, stub, statfs, local, loc);</div><div class='del'>-</div><div class='del'>-        op_ret = stub-&gt;args.statfs_cbk.op_ret;</div><div class='del'>-        errno = stub-&gt;args.statfs_cbk.op_errno;</div><div class='del'>-        gf_log (LIBGF_XL_NAME, GF_LOG_DEBUG, "path %s, status %d, errno %d",</div><div class='del'>-                loc-&gt;path, op_ret, errno);</div><div class='del'>-        if (op_ret == -1)</div><div class='del'>-                goto out;</div><div class='del'>-</div><div class='del'>-        if (buf)</div><div class='del'>-                memcpy (buf, &amp;stub-&gt;args.statfs_cbk.buf, sizeof (*buf));</div><div class='del'>-out:</div><div class='del'>-        call_stub_destroy (stub);</div><div class='del'>-        return op_ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-glusterfs_glh_statfs (glusterfs_handle_t handle, const char *path,</div><div class='del'>-                        struct statfs *buf)</div><div class='del'>-{</div><div class='del'>-        struct statvfs                  stvfs = {0, };</div><div class='del'>-        int32_t                         op_ret = -1;</div><div class='del'>-        loc_t                           loc = {0, };</div><div class='del'>-        libglusterfs_client_ctx_t       *ctx = handle;</div><div class='del'>-        char                            *name = NULL;</div><div class='del'>-</div><div class='del'>-        GF_VALIDATE_OR_GOTO (LIBGF_XL_NAME, ctx, out);</div><div class='del'>-        GF_VALIDATE_ABSOLUTE_PATH_OR_GOTO (LIBGF_XL_NAME, path, out);</div><div class='del'>-</div><div class='del'>-        gf_log (LIBGF_XL_NAME, GF_LOG_DEBUG, "path %s", path);</div><div class='del'>-</div><div class='del'>-        loc.path = strdup (path);</div><div class='del'>-        if (!loc.path) {</div><div class='del'>-                gf_log (LIBGF_XL_NAME, GF_LOG_ERROR, "strdup failed");</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        op_ret = libgf_client_path_lookup (&amp;loc, ctx, 1);</div><div class='del'>-        if (op_ret == -1) {</div><div class='del'>-                gf_log ("libglusterfsclient", GF_LOG_ERROR,</div><div class='del'>-                        "path lookup failed for (%s)", loc.path);</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        name = strdup (loc.path);</div><div class='del'>-        op_ret = libgf_client_loc_fill (&amp;loc, ctx, 0, loc.parent-&gt;ino,</div><div class='del'>-                                        basename (name));</div><div class='del'>-        if (op_ret == -1) {</div><div class='del'>-                gf_log ("libglusterfsclient", GF_LOG_ERROR,</div><div class='del'>-                                "libgf_client_loc_fill returned -1, "</div><div class='del'>-                                "returning EINVAL");</div><div class='del'>-                        errno = EINVAL;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        op_ret = libgf_client_statvfs (ctx, &amp;loc, &amp;stvfs);</div><div class='del'>-        if (op_ret == 0) {</div><div class='del'>-#ifdef GF_SOLARIS_HOST_OS</div><div class='del'>-		buf-&gt;f_fstyp = 0;</div><div class='del'>-                buf-&gt;f_bsize = stvfs.f_bsize;</div><div class='del'>-                buf-&gt;f_blocks = stvfs.f_blocks;</div><div class='del'>-                buf-&gt;f_bfree = stvfs.f_bfree;</div><div class='del'>-		buf-&gt;f_files = stvfs.f_bavail;</div><div class='del'>-                buf-&gt;f_ffree = stvfs.f_ffree;</div><div class='del'>-#else</div><div class='del'>-                buf-&gt;f_type = 0;</div><div class='del'>-                buf-&gt;f_bsize = stvfs.f_bsize;</div><div class='del'>-                buf-&gt;f_blocks = stvfs.f_blocks;</div><div class='del'>-                buf-&gt;f_bfree = stvfs.f_bfree;</div><div class='del'>-                buf-&gt;f_bavail = stvfs.f_bavail;</div><div class='del'>-                buf-&gt;f_files = stvfs.f_bavail;</div><div class='del'>-                buf-&gt;f_ffree = stvfs.f_ffree;</div><div class='del'>-                /* FIXME: buf-&gt;f_fsid has either "val" or "__val" as member</div><div class='del'>-                   based on conditional macro expansion. see definition of</div><div class='del'>-                   fsid_t - Raghu</div><div class='del'>-                   It seems have different structure member names on</div><div class='del'>-                   different archs, so I am stepping down to doing a struct</div><div class='del'>-                   to struct copy. :Shehjar</div><div class='del'>-                */</div><div class='del'>-                memcpy (&amp;buf-&gt;f_fsid, &amp;stvfs.f_fsid, sizeof (stvfs.f_fsid));</div><div class='del'>-                buf-&gt;f_namelen = stvfs.f_namemax;</div><div class='del'>-#endif</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        if (name)</div><div class='del'>-                FREE (name);</div><div class='del'>-        libgf_client_loc_wipe (&amp;loc);</div><div class='del'>-        return op_ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-glusterfs_statfs (const char *path, struct statfs *buf)</div><div class='del'>-{</div><div class='del'>-        int                     op_ret = -1;</div><div class='del'>-        char                    vpath[PATH_MAX];</div><div class='del'>-        glusterfs_handle_t      h      = NULL;</div><div class='del'>-</div><div class='del'>-        GF_VALIDATE_OR_GOTO (LIBGF_XL_NAME, path, out);</div><div class='del'>-        GF_VALIDATE_OR_GOTO (LIBGF_XL_NAME, buf, out);</div><div class='del'>-</div><div class='del'>-        gf_log (LIBGF_XL_NAME, GF_LOG_DEBUG, "path %s", path);</div><div class='del'>-</div><div class='del'>-        h = libgf_resolved_path_handle (path, vpath);</div><div class='del'>-        if (!h) {</div><div class='del'>-                errno = ENODEV;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        op_ret = glusterfs_glh_statfs (h, vpath, buf);</div><div class='del'>-out:</div><div class='del'>-        return op_ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-glusterfs_glh_statvfs (glusterfs_handle_t handle, const char *path,</div><div class='del'>-                                struct statvfs *buf)</div><div class='del'>-{</div><div class='del'>-        int32_t                         op_ret = -1;</div><div class='del'>-        loc_t                           loc = {0, };</div><div class='del'>-        libglusterfs_client_ctx_t       *ctx = handle;</div><div class='del'>-        char                            *name = NULL;</div><div class='del'>-</div><div class='del'>-        GF_VALIDATE_OR_GOTO (LIBGF_XL_NAME, ctx, out);</div><div class='del'>-        GF_VALIDATE_ABSOLUTE_PATH_OR_GOTO (LIBGF_XL_NAME, path, out);</div><div class='del'>-</div><div class='del'>-        gf_log (LIBGF_XL_NAME, GF_LOG_DEBUG, "path %s", path);</div><div class='del'>-</div><div class='del'>-        loc.path = strdup (path);</div><div class='del'>-        if (!loc.path) {</div><div class='del'>-                gf_log (LIBGF_XL_NAME, GF_LOG_ERROR, "strdup failed");</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-        op_ret = libgf_client_path_lookup (&amp;loc, ctx, 1);</div><div class='del'>-        if (op_ret == -1) {</div><div class='del'>-                gf_log ("libglusterfsclient", GF_LOG_ERROR,</div><div class='del'>-                        "path lookup failed for (%s)", loc.path);</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        name = strdup (loc.path);</div><div class='del'>-        op_ret = libgf_client_loc_fill (&amp;loc, ctx, 0, loc.parent-&gt;ino,</div><div class='del'>-                                                basename (name));</div><div class='del'>-	if (op_ret == -1) {</div><div class='del'>-                gf_log ("libglusterfsclient", GF_LOG_ERROR,</div><div class='del'>-                                "libgf_client_loc_fill returned -1, returning"</div><div class='del'>-                                " EINVAL");</div><div class='del'>-                errno = EINVAL;</div><div class='del'>-                goto out;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-        op_ret = libgf_client_statvfs (ctx, &amp;loc, buf);</div><div class='del'>-        if (op_ret != -1)</div><div class='del'>-                /* Should've been a call to libgf_transform_iattr but</div><div class='del'>-                 * that only handles struct stat</div><div class='del'>-                 */</div><div class='del'>-                buf-&gt;f_fsid = (unsigned long)ctx-&gt;fake_fsid;</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        if (name)</div><div class='del'>-                FREE (name);</div><div class='del'>-        libgf_client_loc_wipe (&amp;loc);</div><div class='del'>-        return op_ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-glusterfs_statvfs (const char *path, struct statvfs *buf)</div><div class='del'>-{</div><div class='del'>-        char                    vpath[PATH_MAX];</div><div class='del'>-        glusterfs_handle_t      h      = NULL;</div><div class='del'>-        int                     op_ret = -1;</div><div class='del'>-</div><div class='del'>-        GF_VALIDATE_OR_GOTO (LIBGF_XL_NAME, path, out);</div><div class='del'>-        GF_VALIDATE_OR_GOTO (LIBGF_XL_NAME, buf, out);</div><div class='del'>-</div><div class='del'>-        gf_log (LIBGF_XL_NAME, GF_LOG_DEBUG, "path %s", path);</div><div class='del'>-</div><div class='del'>-        h = libgf_resolved_path_handle (path, vpath);</div><div class='del'>-        if (!h) {</div><div class='del'>-                errno = ENODEV;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        op_ret = glusterfs_glh_statvfs (h, vpath, buf);</div><div class='del'>-out:</div><div class='del'>-        return op_ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-libgf_client_rename_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-                         int32_t op_ret, int32_t op_errno, struct iatt *buf,</div><div class='del'>-                         struct iatt *preoldparent, struct iatt *postoldparent,</div><div class='del'>-                         struct iatt *prenewparent, struct iatt *postnewparent)</div><div class='del'>-{</div><div class='del'>-        libgf_client_local_t *local = frame-&gt;local;</div><div class='del'>-</div><div class='del'>-        local-&gt;reply_stub = fop_rename_cbk_stub (frame, NULL, op_ret, op_errno,</div><div class='del'>-                                                 buf, preoldparent,</div><div class='del'>-                                                 postoldparent, prenewparent,</div><div class='del'>-                                                 postnewparent);</div><div class='del'>-</div><div class='del'>-        LIBGF_REPLY_NOTIFY (local);</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-libgf_client_rename (libglusterfs_client_ctx_t *ctx, loc_t *oldloc,</div><div class='del'>-                     loc_t *newloc)</div><div class='del'>-{</div><div class='del'>-        int                             op_ret = -1;</div><div class='del'>-        libgf_client_local_t            *local = NULL;</div><div class='del'>-        call_stub_t                     *stub = NULL;</div><div class='del'>-</div><div class='del'>-        LIBGF_CLIENT_FOP (ctx, stub, rename, local, oldloc, newloc);</div><div class='del'>-</div><div class='del'>-        op_ret = stub-&gt;args.rename_cbk.op_ret;</div><div class='del'>-        errno = stub-&gt;args.rename_cbk.op_errno;</div><div class='del'>-</div><div class='del'>-        gf_log (LIBGF_XL_NAME, GF_LOG_DEBUG, "old %s, new %s, status %d, errno"</div><div class='del'>-                " %d", oldloc-&gt;path, newloc-&gt;path, op_ret, errno);</div><div class='del'>-        if (op_ret == -1)</div><div class='del'>-                goto out;</div><div class='del'>-</div><div class='del'>-        if (!libgf_get_inode_ctx (newloc-&gt;inode))</div><div class='del'>-                libgf_alloc_inode_ctx (ctx, newloc-&gt;inode);</div><div class='del'>-</div><div class='del'>-        libgf_transform_iattr (ctx, newloc-&gt;inode, &amp;stub-&gt;args.rename_cbk.buf);</div><div class='del'>-        libgf_update_iattr_cache (newloc-&gt;inode, LIBGF_UPDATE_STAT,</div><div class='del'>-                                        &amp;stub-&gt;args.rename_cbk.buf);</div><div class='del'>-</div><div class='del'>-        inode_unlink (oldloc-&gt;inode, oldloc-&gt;parent, oldloc-&gt;name);</div><div class='del'>-out:</div><div class='del'>-        call_stub_destroy (stub);</div><div class='del'>-        return op_ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-glusterfs_glh_rename (glusterfs_handle_t handle, const char *oldpath,</div><div class='del'>-                      const char *newpath)</div><div class='del'>-{</div><div class='del'>-        int32_t                         op_ret = -1;</div><div class='del'>-        loc_t                           oldloc = {0, }, newloc = {0, };</div><div class='del'>-        libglusterfs_client_ctx_t       *ctx = handle;</div><div class='del'>-        char                            *newname = NULL;</div><div class='del'>-        char                            *oldname = NULL;</div><div class='del'>-</div><div class='del'>-        GF_VALIDATE_OR_GOTO (LIBGF_XL_NAME, ctx, out);</div><div class='del'>-        GF_VALIDATE_ABSOLUTE_PATH_OR_GOTO (LIBGF_XL_NAME, oldpath, out);</div><div class='del'>-        GF_VALIDATE_ABSOLUTE_PATH_OR_GOTO (LIBGF_XL_NAME, newpath, out);</div><div class='del'>-</div><div class='del'>-        gf_log (LIBGF_XL_NAME, GF_LOG_DEBUG, "old %s, new %s", oldpath,</div><div class='del'>-                newpath);</div><div class='del'>-</div><div class='del'>-        oldloc.path = strdup (oldpath);</div><div class='del'>-        if (!oldloc.path) {</div><div class='del'>-                gf_log (LIBGF_XL_NAME, GF_LOG_ERROR, "strdup failed");</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        op_ret = libgf_client_path_lookup (&amp;oldloc, ctx, 1);</div><div class='del'>-        if (op_ret == -1) {</div><div class='del'>-                gf_log ("libglusterfsclient", GF_LOG_ERROR,</div><div class='del'>-                        "path lookup failed for (%s)", oldloc.path);</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        newloc.path = strdup (newpath);</div><div class='del'>-        if (!newloc.path) {</div><div class='del'>-                gf_log (LIBGF_XL_NAME, GF_LOG_DEBUG, "strdup failed");</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        op_ret = libgf_client_path_lookup (&amp;newloc, ctx, 1);</div><div class='del'>-</div><div class='del'>-        oldname = strdup (oldloc.path);</div><div class='del'>-        op_ret = libgf_client_loc_fill (&amp;oldloc, ctx, 0, oldloc.parent-&gt;ino,</div><div class='del'>-                                        basename (oldname));</div><div class='del'>-	if (op_ret == -1) {</div><div class='del'>-                gf_log ("libglusterfsclient", GF_LOG_ERROR,</div><div class='del'>-                                "libgf_client_loc_fill returned -1,"</div><div class='del'>-                                " returning EINVAL");</div><div class='del'>-                errno = EINVAL;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        newname = strdup (newloc.path);</div><div class='del'>-        op_ret = libgf_client_loc_fill (&amp;newloc, ctx, 0, newloc.parent-&gt;ino,</div><div class='del'>-                                        basename (newname));</div><div class='del'>-	if (op_ret == -1) {</div><div class='del'>-                gf_log ("libglusterfsclient", GF_LOG_ERROR,</div><div class='del'>-                                "libgf_client_loc_fill returned -1,"</div><div class='del'>-                                " returning EINVAL");</div><div class='del'>-                errno = EINVAL;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-        op_ret = libgf_client_rename (ctx, &amp;oldloc, &amp;newloc);</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        if (oldname)</div><div class='del'>-                FREE (oldname);</div><div class='del'>-        if (newname)</div><div class='del'>-                FREE (newname);</div><div class='del'>-        libgf_client_loc_wipe (&amp;newloc);</div><div class='del'>-        libgf_client_loc_wipe (&amp;oldloc);</div><div class='del'>-</div><div class='del'>-        return op_ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-glusterfs_rename (const char *oldpath, const char *newpath)</div><div class='del'>-{</div><div class='del'>-        int                     op_ret = -1;</div><div class='del'>-        char                    oldvpath[PATH_MAX];</div><div class='del'>-        char                    newvpath[PATH_MAX];</div><div class='del'>-        glusterfs_handle_t      oldh = NULL;</div><div class='del'>-        glusterfs_handle_t      newh = NULL;</div><div class='del'>-</div><div class='del'>-        GF_VALIDATE_OR_GOTO (LIBGF_XL_NAME, oldpath, out);</div><div class='del'>-        GF_VALIDATE_OR_GOTO (LIBGF_XL_NAME, newpath, out);</div><div class='del'>-</div><div class='del'>-        gf_log (LIBGF_XL_NAME, GF_LOG_DEBUG, "Old %s, new %s", oldpath,</div><div class='del'>-                newpath);</div><div class='del'>-</div><div class='del'>-        oldh = libgf_resolved_path_handle (oldpath, oldvpath);</div><div class='del'>-        if (!oldh) {</div><div class='del'>-                errno = ENODEV;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        newh = libgf_resolved_path_handle (newpath, newvpath);</div><div class='del'>-        if (!newh) {</div><div class='del'>-                errno = ENODEV;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (oldh != newh) {</div><div class='del'>-                errno = EXDEV;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        op_ret = glusterfs_glh_rename (oldh, oldvpath, newvpath);</div><div class='del'>-out:</div><div class='del'>-        return op_ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-glusterfs_glh_utimes (glusterfs_handle_t handle, const char *path,</div><div class='del'>-                        const struct timeval times[2])</div><div class='del'>-{</div><div class='del'>-        int32_t                         op_ret = -1;</div><div class='del'>-        loc_t                           loc = {0, };</div><div class='del'>-        libglusterfs_client_ctx_t       *ctx = handle;</div><div class='del'>-        char                            *name = NULL;</div><div class='del'>-        struct iatt                     stbuf = {0,};</div><div class='del'>-        int32_t                         valid = 0;</div><div class='del'>-</div><div class='del'>-        GF_VALIDATE_OR_GOTO (LIBGF_XL_NAME, ctx, out);</div><div class='del'>-        GF_VALIDATE_ABSOLUTE_PATH_OR_GOTO (LIBGF_XL_NAME, path, out);</div><div class='del'>-</div><div class='del'>-        gf_log (LIBGF_XL_NAME, GF_LOG_DEBUG, "path %s", path);</div><div class='del'>-        stbuf.ia_atime = times[0].tv_sec;</div><div class='del'>-        stbuf.ia_atime_nsec = times[0].tv_usec * 1000;</div><div class='del'>-        stbuf.ia_mtime = times[1].tv_sec;</div><div class='del'>-        stbuf.ia_mtime_nsec = times[1].tv_usec * 1000;</div><div class='del'>-</div><div class='del'>-        valid |= (GF_SET_ATTR_ATIME | GF_SET_ATTR_MTIME);</div><div class='del'>-</div><div class='del'>-        loc.path = strdup (path);</div><div class='del'>-        if (!loc.path) {</div><div class='del'>-                gf_log (LIBGF_XL_NAME, GF_LOG_ERROR, "strdup failed");</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        op_ret = libgf_client_path_lookup (&amp;loc, ctx, 1);</div><div class='del'>-        if (op_ret == -1) {</div><div class='del'>-                gf_log ("libglusterfsclient", GF_LOG_ERROR,</div><div class='del'>-                        "path lookup failed for (%s)", loc.path);</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        name = strdup (loc.path);</div><div class='del'>-        op_ret = libgf_client_loc_fill (&amp;loc, ctx, 0, loc.parent-&gt;ino,</div><div class='del'>-                                                basename (name));</div><div class='del'>-        if (op_ret == -1) {</div><div class='del'>-                gf_log ("libglusterfsclient", GF_LOG_ERROR,</div><div class='del'>-                                "libgf_client_loc_fill returned -1"</div><div class='del'>-                                " returning EINVAL");</div><div class='del'>-                errno = EINVAL;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        op_ret = libgf_client_setattr (ctx, &amp;loc, &amp;stbuf, valid);</div><div class='del'>-out:</div><div class='del'>-        if (name)</div><div class='del'>-                FREE (name);</div><div class='del'>-        libgf_client_loc_wipe (&amp;loc);</div><div class='del'>-        return op_ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-glusterfs_utimes (const char *path, const struct timeval times[2])</div><div class='del'>-{</div><div class='del'>-        char                    vpath[PATH_MAX];</div><div class='del'>-        int                     op_ret = -1;</div><div class='del'>-        glusterfs_handle_t      h = NULL;</div><div class='del'>-</div><div class='del'>-        GF_VALIDATE_OR_GOTO (LIBGF_XL_NAME, path, out);</div><div class='del'>-</div><div class='del'>-        gf_log (LIBGF_XL_NAME, GF_LOG_DEBUG, "path %s", path);</div><div class='del'>-</div><div class='del'>-        h = libgf_resolved_path_handle (path, vpath);</div><div class='del'>-        if (!h) {</div><div class='del'>-                errno = ENODEV;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        op_ret = glusterfs_glh_utimes (h, vpath, times);</div><div class='del'>-out:</div><div class='del'>-        return op_ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-glusterfs_glh_utime (glusterfs_handle_t handle, const char *path,</div><div class='del'>-                        const struct utimbuf *buf)</div><div class='del'>-{</div><div class='del'>-        int32_t                         op_ret = -1;</div><div class='del'>-        loc_t                           loc = {0, };</div><div class='del'>-        libglusterfs_client_ctx_t       *ctx = handle;</div><div class='del'>-        char                            *name = NULL;</div><div class='del'>-        struct iatt                     stbuf = {0,};</div><div class='del'>-        int32_t                         valid = 0;</div><div class='del'>-</div><div class='del'>-        GF_VALIDATE_OR_GOTO (LIBGF_XL_NAME, ctx, out);</div><div class='del'>-        GF_VALIDATE_ABSOLUTE_PATH_OR_GOTO (LIBGF_XL_NAME, path, out);</div><div class='del'>-</div><div class='del'>-        gf_log (LIBGF_XL_NAME, GF_LOG_DEBUG, "path %s", path);</div><div class='del'>-        if (buf) {</div><div class='del'>-                stbuf.ia_atime = buf-&gt;actime;</div><div class='del'>-                stbuf.ia_atime_nsec = 0;</div><div class='del'>-</div><div class='del'>-                stbuf.ia_mtime = buf-&gt;modtime;</div><div class='del'>-                stbuf.ia_mtime_nsec = 0;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        valid |= (GF_SET_ATTR_ATIME | GF_SET_ATTR_MTIME);</div><div class='del'>-</div><div class='del'>-        loc.path = strdup (path);</div><div class='del'>-        if (!loc.path) {</div><div class='del'>-                gf_log (LIBGF_XL_NAME, GF_LOG_ERROR, "strdup failed");</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        op_ret = libgf_client_path_lookup (&amp;loc, ctx, 1);</div><div class='del'>-        if (op_ret == -1) {</div><div class='del'>-                gf_log ("libglusterfsclient", GF_LOG_ERROR,</div><div class='del'>-                        "path lookup failed for (%s)", loc.path);</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        name = strdup (loc.path);</div><div class='del'>-        op_ret = libgf_client_loc_fill (&amp;loc, ctx, 0, loc.parent-&gt;ino,</div><div class='del'>-                                                basename (name));</div><div class='del'>-        if (op_ret == -1) {</div><div class='del'>-                gf_log ("libglusterfsclient", GF_LOG_ERROR,</div><div class='del'>-                                "libgf_client_loc_fill returned -1,"</div><div class='del'>-                                " returning EINVAL");</div><div class='del'>-                errno = EINVAL;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        op_ret = libgf_client_setattr (ctx, &amp;loc, &amp;stbuf, valid);</div><div class='del'>-out:</div><div class='del'>-        if (name)</div><div class='del'>-                FREE (name);</div><div class='del'>-        libgf_client_loc_wipe (&amp;loc);</div><div class='del'>-        return op_ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-glusterfs_utime (const char *path, const struct utimbuf *buf)</div><div class='del'>-{</div><div class='del'>-        char                    vpath[PATH_MAX];</div><div class='del'>-        int                     op_ret = -1;</div><div class='del'>-        glusterfs_handle_t      h      = NULL;</div><div class='del'>-</div><div class='del'>-        GF_VALIDATE_OR_GOTO (LIBGF_XL_NAME, path, out);</div><div class='del'>-        GF_VALIDATE_OR_GOTO (LIBGF_XL_NAME, buf, out);</div><div class='del'>-</div><div class='del'>-        gf_log (LIBGF_XL_NAME, GF_LOG_DEBUG, "path %s", path);</div><div class='del'>-</div><div class='del'>-        h = libgf_resolved_path_handle (path, vpath);</div><div class='del'>-        if (!h) {</div><div class='del'>-                errno = ENODEV;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        op_ret = glusterfs_glh_utime (h, vpath, buf);</div><div class='del'>-out:</div><div class='del'>-        return op_ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-static int32_t</div><div class='del'>-libgf_client_mknod_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-                                int32_t op_ret, int32_t op_errno,</div><div class='del'>-                                inode_t *inode, struct iatt *buf,</div><div class='del'>-                                struct iatt *preparent, struct iatt *postparent)</div><div class='del'>-{</div><div class='del'>-        libgf_client_local_t *local = frame-&gt;local;</div><div class='del'>-</div><div class='del'>-        local-&gt;reply_stub = fop_mknod_cbk_stub (frame, NULL, op_ret, op_errno,</div><div class='del'>-                                                inode, buf, preparent,</div><div class='del'>-                                                postparent);</div><div class='del'>-</div><div class='del'>-        LIBGF_REPLY_NOTIFY (local);</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-static int32_t</div><div class='del'>-libgf_client_mknod (libglusterfs_client_ctx_t *ctx, loc_t *loc, mode_t mode,</div><div class='del'>-                    dev_t rdev)</div><div class='del'>-{</div><div class='del'>-        int32_t                 op_ret = -1;</div><div class='del'>-        call_stub_t             *stub = NULL;</div><div class='del'>-        libgf_client_local_t    *local = NULL;</div><div class='del'>-        inode_t                 *inode = NULL;</div><div class='del'>-</div><div class='del'>-        LIBGF_CLIENT_FOP (ctx, stub, mknod, local, loc, mode, rdev);</div><div class='del'>-</div><div class='del'>-        op_ret = stub-&gt;args.mknod_cbk.op_ret;</div><div class='del'>-        errno = stub-&gt;args.mknod_cbk.op_errno;</div><div class='del'>-        if (op_ret == -1)</div><div class='del'>-                goto out;</div><div class='del'>-</div><div class='del'>-        gf_log (LIBGF_XL_NAME, GF_LOG_DEBUG, "path %s, status %d, errno %d",</div><div class='del'>-                loc-&gt;path, op_ret, errno);</div><div class='del'>-        inode = stub-&gt;args.mknod_cbk.inode;</div><div class='del'>-        inode_link (inode, loc-&gt;parent, loc-&gt;name, &amp;stub-&gt;args.mknod_cbk.buf);</div><div class='del'>-        libgf_transform_iattr (ctx, inode, &amp;stub-&gt;args.mknod_cbk.buf);</div><div class='del'>-        inode_lookup (inode);</div><div class='del'>-</div><div class='del'>-        if (!libgf_alloc_inode_ctx (ctx, inode))</div><div class='del'>-                libgf_alloc_inode_ctx (ctx, inode);</div><div class='del'>-</div><div class='del'>-        libgf_update_iattr_cache (inode, LIBGF_UPDATE_STAT,</div><div class='del'>-                                        &amp;stub-&gt;args.mknod_cbk.buf);</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-	call_stub_destroy (stub);</div><div class='del'>-        return op_ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-glusterfs_glh_mknod(glusterfs_handle_t handle, const char *path, mode_t mode,</div><div class='del'>-                        dev_t dev)</div><div class='del'>-{</div><div class='del'>-        libglusterfs_client_ctx_t       *ctx = handle;</div><div class='del'>-        loc_t                           loc = {0, };</div><div class='del'>-        char                            *name = NULL;</div><div class='del'>-        int32_t                         op_ret = -1;</div><div class='del'>-</div><div class='del'>-        GF_VALIDATE_OR_GOTO (LIBGF_XL_NAME, ctx, out);</div><div class='del'>-        GF_VALIDATE_ABSOLUTE_PATH_OR_GOTO (LIBGF_XL_NAME, path, out);</div><div class='del'>-</div><div class='del'>-        gf_log (LIBGF_XL_NAME, GF_LOG_DEBUG, "path %s", path);</div><div class='del'>-</div><div class='del'>-        loc.path = strdup (path);</div><div class='del'>-        if (!loc.path) {</div><div class='del'>-                gf_log (LIBGF_XL_NAME, GF_LOG_ERROR, "strdup failed");</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        op_ret = libgf_client_path_lookup (&amp;loc, ctx, 1);</div><div class='del'>-        if (op_ret == 0) {</div><div class='del'>-                op_ret = -1;</div><div class='del'>-                errno = EEXIST;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        op_ret = libgf_client_path_lookup (&amp;loc, ctx, 0);</div><div class='del'>-        if (op_ret == -1) {</div><div class='del'>-                errno = ENOENT;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        name = strdup (loc.path);</div><div class='del'>-        op_ret = libgf_client_loc_fill (&amp;loc, ctx, 0, loc.parent-&gt;ino,</div><div class='del'>-                                                basename (name));</div><div class='del'>-	if (op_ret == -1) {</div><div class='del'>-                gf_log ("libglusterfsclient", GF_LOG_ERROR,</div><div class='del'>-                                "libgf_client_loc_fill returned -1, "</div><div class='del'>-                                " returning EINVAL");</div><div class='del'>-                errno = EINVAL;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        loc.inode = inode_new (ctx-&gt;itable);</div><div class='del'>-        op_ret = libgf_client_mknod (ctx, &amp;loc, mode, dev);</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-	libgf_client_loc_wipe (&amp;loc);</div><div class='del'>-	if (name)</div><div class='del'>-                FREE (name);</div><div class='del'>-</div><div class='del'>-	return op_ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-glusterfs_mknod(const char *pathname, mode_t mode, dev_t dev)</div><div class='del'>-{</div><div class='del'>-        char                    vpath[PATH_MAX]; </div><div class='del'>-        int                     op_ret = -1;</div><div class='del'>-        glusterfs_handle_t      h      = NULL;</div><div class='del'>-</div><div class='del'>-        GF_VALIDATE_OR_GOTO (LIBGF_XL_NAME, pathname, out);</div><div class='del'>-</div><div class='del'>-        gf_log (LIBGF_XL_NAME, GF_LOG_DEBUG, "path %s", pathname);</div><div class='del'>-</div><div class='del'>-        h = libgf_resolved_path_handle (pathname, vpath);</div><div class='del'>-        if (!h) {</div><div class='del'>-                errno = ENODEV;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        return op_ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-glusterfs_glh_mkfifo (glusterfs_handle_t handle, const char *path, mode_t mode)</div><div class='del'>-{</div><div class='del'>-</div><div class='del'>-        libglusterfs_client_ctx_t       *ctx = handle;</div><div class='del'>-        loc_t                           loc = {0, };</div><div class='del'>-        char                            *name = NULL;</div><div class='del'>-        int32_t                         op_ret = -1;</div><div class='del'>-        dev_t                           dev = 0;</div><div class='del'>-</div><div class='del'>-        GF_VALIDATE_OR_GOTO (LIBGF_XL_NAME, ctx, out);</div><div class='del'>-        GF_VALIDATE_ABSOLUTE_PATH_OR_GOTO (LIBGF_XL_NAME, path, out);</div><div class='del'>-</div><div class='del'>-        gf_log (LIBGF_XL_NAME, GF_LOG_DEBUG, "path %s", path);</div><div class='del'>-        loc.path = libgf_resolve_path_light ((char *)path);</div><div class='del'>-        if (!loc.path) {</div><div class='del'>-                gf_log (LIBGF_XL_NAME, GF_LOG_ERROR, "Failed to resolve name");</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        op_ret = libgf_client_path_lookup (&amp;loc, ctx, 1);</div><div class='del'>-        if (op_ret == 0) {</div><div class='del'>-                op_ret = -1;</div><div class='del'>-                errno = EEXIST;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        op_ret = libgf_client_path_lookup (&amp;loc, ctx, 0);</div><div class='del'>-        if (op_ret == -1) {</div><div class='del'>-                errno = ENOENT;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        name = strdup (loc.path);</div><div class='del'>-        op_ret = libgf_client_loc_fill (&amp;loc, ctx, 0, loc.parent-&gt;ino,</div><div class='del'>-                                                basename (name));</div><div class='del'>-        if (op_ret == -1) {</div><div class='del'>-                gf_log ("libglusterfsclient", GF_LOG_ERROR,</div><div class='del'>-                                "libgf_client_loc_fill returned -1, "</div><div class='del'>-                                "returning EINVAL");</div><div class='del'>-                errno = EINVAL;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        loc.inode = inode_new (ctx-&gt;itable);</div><div class='del'>-        op_ret = libgf_client_mknod (ctx, &amp;loc, mode | S_IFIFO, dev);</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-	libgf_client_loc_wipe (&amp;loc);</div><div class='del'>-        if (name)</div><div class='del'>-                free (name);</div><div class='del'>-</div><div class='del'>-        return op_ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-glusterfs_mkfifo (const char *path, mode_t mode)</div><div class='del'>-{</div><div class='del'>-        int                     op_ret = -1;</div><div class='del'>-        char                    vpath[PATH_MAX];</div><div class='del'>-        glusterfs_handle_t      h = NULL;</div><div class='del'>-</div><div class='del'>-        GF_VALIDATE_OR_GOTO (LIBGF_XL_NAME, path, out);</div><div class='del'>-</div><div class='del'>-        gf_log (LIBGF_XL_NAME, GF_LOG_DEBUG, "path %s", path);</div><div class='del'>-</div><div class='del'>-        h = libgf_resolved_path_handle (path, vpath);</div><div class='del'>-        if (!h) {</div><div class='del'>-                errno = ENODEV;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        op_ret = glusterfs_glh_mkfifo (h, vpath, mode);</div><div class='del'>-out:</div><div class='del'>-        return op_ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-libgf_client_unlink_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-                         int32_t op_ret, int32_t op_errno,</div><div class='del'>-                         struct iatt *preparent, struct iatt *postparent)</div><div class='del'>-{</div><div class='del'>-        libgf_client_local_t    *local = frame-&gt;local;</div><div class='del'>-</div><div class='del'>-        local-&gt;reply_stub = fop_unlink_cbk_stub (frame, NULL, op_ret, op_errno,</div><div class='del'>-                                                 preparent, postparent);</div><div class='del'>-</div><div class='del'>-        LIBGF_REPLY_NOTIFY (local);</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-libgf_client_unlink (libglusterfs_client_ctx_t *ctx, loc_t *loc)</div><div class='del'>-{</div><div class='del'>-        int                             op_ret = -1;</div><div class='del'>-        libgf_client_local_t            *local = NULL;</div><div class='del'>-        call_stub_t                     *stub = NULL;</div><div class='del'>-</div><div class='del'>-        LIBGF_CLIENT_FOP (ctx, stub, unlink, local, loc);</div><div class='del'>-</div><div class='del'>-        op_ret = stub-&gt;args.unlink_cbk.op_ret;</div><div class='del'>-        errno = stub-&gt;args.unlink_cbk.op_errno;</div><div class='del'>-</div><div class='del'>-        gf_log (LIBGF_XL_NAME, GF_LOG_DEBUG, "path %s", loc-&gt;path);</div><div class='del'>-        if (op_ret == -1)</div><div class='del'>-                goto out;</div><div class='del'>-</div><div class='del'>-        inode_unlink (loc-&gt;inode, loc-&gt;parent, loc-&gt;name);</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        call_stub_destroy (stub);</div><div class='del'>-        return op_ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-glusterfs_glh_unlink (glusterfs_handle_t handle, const char *path)</div><div class='del'>-{</div><div class='del'>-        int32_t                         op_ret = -1;</div><div class='del'>-        loc_t                           loc = {0, };</div><div class='del'>-        libglusterfs_client_ctx_t       *ctx = handle;</div><div class='del'>-        char                            *name = NULL;</div><div class='del'>-</div><div class='del'>-        GF_VALIDATE_OR_GOTO (LIBGF_XL_NAME, ctx, out);</div><div class='del'>-        GF_VALIDATE_ABSOLUTE_PATH_OR_GOTO (LIBGF_XL_NAME, path, out);</div><div class='del'>-</div><div class='del'>-        gf_log (LIBGF_XL_NAME, GF_LOG_DEBUG, "path %s", path);</div><div class='del'>-</div><div class='del'>-        loc.path = strdup (path);</div><div class='del'>-        if (!loc.path) {</div><div class='del'>-                gf_log (LIBGF_XL_NAME, GF_LOG_ERROR, "strdup failed");</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        op_ret = libgf_client_path_lookup (&amp;loc, ctx, 1);</div><div class='del'>-        if (op_ret == -1) {</div><div class='del'>-                gf_log ("libglusterfsclient", GF_LOG_ERROR,</div><div class='del'>-                        "path lookup failed for (%s)", loc.path);</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        name = strdup (loc.path);</div><div class='del'>-        op_ret = libgf_client_loc_fill (&amp;loc, ctx, 0, loc.parent-&gt;ino,</div><div class='del'>-                                                basename (name));</div><div class='del'>-	if (op_ret == -1) {</div><div class='del'>-                gf_log ("libglusterfsclient", GF_LOG_ERROR,</div><div class='del'>-                                "libgf_client_loc_fill returned -1, "</div><div class='del'>-                                " returning EINVAL");</div><div class='del'>-                errno = EINVAL;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        op_ret = libgf_client_unlink (ctx, &amp;loc);</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        if (name)</div><div class='del'>-                FREE (name);</div><div class='del'>-        libgf_client_loc_wipe (&amp;loc);</div><div class='del'>-        return op_ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-glusterfs_unlink (const char *path)</div><div class='del'>-{</div><div class='del'>-        char                    vpath[PATH_MAX];</div><div class='del'>-        int                     op_ret = -1;</div><div class='del'>-        glusterfs_handle_t      h      = NULL;</div><div class='del'>-</div><div class='del'>-        GF_VALIDATE_OR_GOTO (LIBGF_XL_NAME, path, out);</div><div class='del'>-</div><div class='del'>-        gf_log (LIBGF_XL_NAME, GF_LOG_DEBUG, "path %s", path);</div><div class='del'>-</div><div class='del'>-        h = libgf_resolved_path_handle (path, vpath);</div><div class='del'>-        if (!h) {</div><div class='del'>-                errno = ENODEV;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        op_ret = glusterfs_glh_unlink (h, vpath);</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        return op_ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-static int32_t</div><div class='del'>-libgf_client_symlink_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-                                int32_t op_ret, int32_t op_errno,</div><div class='del'>-                                inode_t *inode, struct iatt *buf,</div><div class='del'>-                                struct iatt *preparent, struct iatt *postparent)</div><div class='del'>-{</div><div class='del'>-        libgf_client_local_t *local = frame-&gt;local;</div><div class='del'>-</div><div class='del'>-        local-&gt;reply_stub = fop_symlink_cbk_stub (frame, NULL, op_ret,</div><div class='del'>-                                                  op_errno, inode, buf,</div><div class='del'>-                                                  preparent, postparent);</div><div class='del'>-</div><div class='del'>-        LIBGF_REPLY_NOTIFY (local);</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-libgf_client_symlink (libglusterfs_client_ctx_t *ctx, const char *linkpath,</div><div class='del'>-                      loc_t *loc)</div><div class='del'>-{</div><div class='del'>-        int                     op_ret = -1;</div><div class='del'>-        libgf_client_local_t    *local = NULL;</div><div class='del'>-        call_stub_t             *stub = NULL;</div><div class='del'>-        inode_t                 *inode = NULL;</div><div class='del'>-</div><div class='del'>-        LIBGF_CLIENT_FOP (ctx, stub, symlink, local, linkpath, loc);</div><div class='del'>-</div><div class='del'>-        op_ret = stub-&gt;args.symlink_cbk.op_ret;</div><div class='del'>-        errno = stub-&gt;args.symlink_cbk.op_errno;</div><div class='del'>-        if (op_ret == -1)</div><div class='del'>-                goto out;</div><div class='del'>-</div><div class='del'>-        gf_log (LIBGF_XL_NAME, GF_LOG_DEBUG, "target: %s, link: %s, status %d"</div><div class='del'>-                " errno %d", linkpath, loc-&gt;path, op_ret, errno);</div><div class='del'>-        inode = stub-&gt;args.symlink_cbk.inode;</div><div class='del'>-        inode_link (inode, loc-&gt;parent, loc-&gt;name,</div><div class='del'>-                        &amp;stub-&gt;args.symlink_cbk.buf);</div><div class='del'>-        libgf_transform_iattr (ctx, inode, &amp;stub-&gt;args.symlink_cbk.buf);</div><div class='del'>-        inode_lookup (inode);</div><div class='del'>-        if (!libgf_get_inode_ctx (inode))</div><div class='del'>-                libgf_alloc_inode_ctx (ctx, inode);</div><div class='del'>-</div><div class='del'>-        libgf_update_iattr_cache (inode, LIBGF_UPDATE_STAT,</div><div class='del'>-                                        &amp;stub-&gt;args.symlink_cbk.buf);</div><div class='del'>-out:</div><div class='del'>-        call_stub_destroy (stub);</div><div class='del'>-        return op_ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-glusterfs_glh_symlink (glusterfs_handle_t handle, const char *oldpath,</div><div class='del'>-                       const char *newpath)</div><div class='del'>-{</div><div class='del'>-        int32_t                         op_ret = -1;</div><div class='del'>-        libglusterfs_client_ctx_t       *ctx = handle;</div><div class='del'>-        loc_t                           oldloc = {0, };</div><div class='del'>-        loc_t                           newloc = {0, };</div><div class='del'>-        char                            *oldname = NULL;</div><div class='del'>-        char                            *newname = NULL;</div><div class='del'>-</div><div class='del'>-        GF_VALIDATE_OR_GOTO (LIBGF_XL_NAME, ctx, out);</div><div class='del'>-        GF_VALIDATE_ABSOLUTE_PATH_OR_GOTO (LIBGF_XL_NAME, newpath, out);</div><div class='del'>-</div><div class='del'>-        gf_log (LIBGF_XL_NAME, GF_LOG_DEBUG, "target: %s, link: %s", oldpath,</div><div class='del'>-                newpath);</div><div class='del'>-        /* Old path does not need to be interpreted or looked up */</div><div class='del'>-        oldloc.path = strdup (oldpath);</div><div class='del'>-</div><div class='del'>-	newloc.path = strdup (newpath);</div><div class='del'>-        if (!newloc.path) {</div><div class='del'>-                gf_log (LIBGF_XL_NAME, GF_LOG_ERROR, "strdup failed");</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-	op_ret = libgf_client_path_lookup (&amp;newloc, ctx, 1);</div><div class='del'>-	if (op_ret == 0) {</div><div class='del'>-                gf_log ("libglusterfsclient", GF_LOG_ERROR,</div><div class='del'>-                        "new path (%s) already exists, "</div><div class='del'>-                        " returning EEXIST", newloc.path);</div><div class='del'>-                op_ret = -1;</div><div class='del'>-                errno = EEXIST;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        op_ret = libgf_client_path_lookup (&amp;newloc, ctx, 0);</div><div class='del'>-        if (op_ret == -1) {</div><div class='del'>-                errno = ENOENT;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        newloc.inode = inode_new (ctx-&gt;itable);</div><div class='del'>-        newname = strdup (newloc.path);</div><div class='del'>-        op_ret = libgf_client_loc_fill (&amp;newloc, ctx, 0, newloc.parent-&gt;ino,</div><div class='del'>-                                                basename (newname));</div><div class='del'>-</div><div class='del'>-        if (op_ret == -1) {</div><div class='del'>-                gf_log ("libglusterfsclient", GF_LOG_ERROR,</div><div class='del'>-                                "libgf_client_loc_fill returned -1, "</div><div class='del'>-                                "returning EINVAL");</div><div class='del'>-                errno = EINVAL;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        op_ret = libgf_client_symlink (ctx, oldpath, &amp;newloc);</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        if (newname)</div><div class='del'>-                FREE (newname);</div><div class='del'>-</div><div class='del'>-        if (oldname)</div><div class='del'>-                FREE (oldname);</div><div class='del'>-        libgf_client_loc_wipe (&amp;oldloc);</div><div class='del'>-        libgf_client_loc_wipe (&amp;newloc);</div><div class='del'>-        return op_ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-glusterfs_symlink (const char *oldpath, const char *newpath)</div><div class='del'>-{</div><div class='del'>-        char                    vpath[PATH_MAX];</div><div class='del'>-        int                     op_ret = -1;</div><div class='del'>-        glusterfs_handle_t      h      = NULL;</div><div class='del'>-</div><div class='del'>-        GF_VALIDATE_OR_GOTO (LIBGF_XL_NAME, oldpath, out);</div><div class='del'>-        GF_VALIDATE_OR_GOTO (LIBGF_XL_NAME, newpath, out);</div><div class='del'>-</div><div class='del'>-        gf_log (LIBGF_XL_NAME, GF_LOG_DEBUG, "target: %s, link: %s", oldpath,</div><div class='del'>-                newpath);</div><div class='del'>-</div><div class='del'>-        h = libgf_resolved_path_handle (newpath, vpath);</div><div class='del'>-        if (!h) {</div><div class='del'>-                errno = ENODEV;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        op_ret = glusterfs_glh_symlink (h, oldpath, vpath);</div><div class='del'>-out:</div><div class='del'>-        return op_ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-libgf_client_readlink_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-                                int32_t op_ret, int32_t op_errno,</div><div class='del'>-                                const char *path, struct iatt *sbuf)</div><div class='del'>-{</div><div class='del'>-        libgf_client_local_t    *local = frame-&gt;local;</div><div class='del'>-</div><div class='del'>-        local-&gt;reply_stub = fop_readlink_cbk_stub (frame, NULL, op_ret,</div><div class='del'>-                                                   op_errno, path, sbuf);</div><div class='del'>-</div><div class='del'>-        LIBGF_REPLY_NOTIFY (local);</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-libgf_client_readlink (libglusterfs_client_ctx_t *ctx, loc_t *loc, char *buf,</div><div class='del'>-                       size_t bufsize)</div><div class='del'>-{</div><div class='del'>-        int                             op_ret = -1;</div><div class='del'>-        libgf_client_local_t            *local = NULL;</div><div class='del'>-        call_stub_t                     *stub = NULL;</div><div class='del'>-        size_t                           cpy_size = 0;</div><div class='del'>-</div><div class='del'>-        LIBGF_CLIENT_FOP (ctx, stub, readlink, local, loc, bufsize);</div><div class='del'>-</div><div class='del'>-        op_ret = stub-&gt;args.readlink_cbk.op_ret;</div><div class='del'>-        errno = stub-&gt;args.readlink_cbk.op_errno;</div><div class='del'>-</div><div class='del'>-        if (op_ret != -1) {</div><div class='del'>-                cpy_size = ((op_ret &lt;= bufsize) ? op_ret : bufsize);</div><div class='del'>-                memcpy (buf, stub-&gt;args.readlink_cbk.buf, cpy_size);</div><div class='del'>-                op_ret = cpy_size;</div><div class='del'>-                gf_log (LIBGF_XL_NAME, GF_LOG_DEBUG, "link: %s, target: %s,"</div><div class='del'>-                        " status %d, errno %d", loc-&gt;path, buf, op_ret, errno);</div><div class='del'>-        } else</div><div class='del'>-                gf_log (LIBGF_XL_NAME, GF_LOG_DEBUG, "link: %s, status %d, "</div><div class='del'>-                        "errno %d", loc-&gt;path, op_ret, errno);</div><div class='del'>-</div><div class='del'>-        call_stub_destroy (stub);</div><div class='del'>-        return op_ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-glusterfs_glh_readlink (glusterfs_handle_t handle, const char *path, char *buf,</div><div class='del'>-                                size_t bufsize)</div><div class='del'>-{</div><div class='del'>-        int32_t                         op_ret = -1;</div><div class='del'>-        loc_t                           loc = {0, };</div><div class='del'>-        libglusterfs_client_ctx_t       *ctx = handle;</div><div class='del'>-        char                            *name = NULL;</div><div class='del'>-</div><div class='del'>-        GF_VALIDATE_OR_GOTO (LIBGF_XL_NAME, ctx, out);</div><div class='del'>-        GF_VALIDATE_ABSOLUTE_PATH_OR_GOTO (LIBGF_XL_NAME, path, out);</div><div class='del'>-</div><div class='del'>-        gf_log (LIBGF_XL_NAME, GF_LOG_DEBUG, "path %s", path);</div><div class='del'>-        if (bufsize &lt; 0) {</div><div class='del'>-                errno = EINVAL;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (bufsize == 0) {</div><div class='del'>-                op_ret = 0;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        loc.path = strdup (path);</div><div class='del'>-        if (!loc.path) {</div><div class='del'>-                gf_log (LIBGF_XL_NAME, GF_LOG_ERROR, "strdup failed");</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        op_ret = libgf_client_path_lookup (&amp;loc, ctx, 1);</div><div class='del'>-        if (op_ret == -1) {</div><div class='del'>-                gf_log ("libglusterfsclient", GF_LOG_ERROR,</div><div class='del'>-                        "path lookup failed for (%s)", loc.path);</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        name = strdup (loc.path);</div><div class='del'>-        op_ret = libgf_client_loc_fill (&amp;loc, ctx, 0, loc.parent-&gt;ino,</div><div class='del'>-                                                basename (name));</div><div class='del'>-        if (op_ret == -1) {</div><div class='del'>-                gf_log ("libglusterfsclient", GF_LOG_ERROR,</div><div class='del'>-                                "libgf_client_loc_fill returned -1, "</div><div class='del'>-                                "returning EINVAL");</div><div class='del'>-                errno = EINVAL;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        op_ret = libgf_client_readlink (ctx, &amp;loc, buf, bufsize);</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        if (name)</div><div class='del'>-                FREE (name);</div><div class='del'>-</div><div class='del'>-        libgf_client_loc_wipe (&amp;loc);</div><div class='del'>-        return op_ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-glusterfs_readlink (const char *path, char *buf, size_t bufsize)</div><div class='del'>-{</div><div class='del'>-        char                    vpath[PATH_MAX];</div><div class='del'>-        int                     op_ret = -1;</div><div class='del'>-        glusterfs_handle_t      h      = NULL;</div><div class='del'>-</div><div class='del'>-        GF_VALIDATE_OR_GOTO (LIBGF_XL_NAME, path, out);</div><div class='del'>-        GF_VALIDATE_OR_GOTO (LIBGF_XL_NAME, buf, out);</div><div class='del'>-</div><div class='del'>-        gf_log (LIBGF_XL_NAME, GF_LOG_DEBUG, "path %s", path);</div><div class='del'>-</div><div class='del'>-        h = libgf_resolved_path_handle (path, vpath);</div><div class='del'>-        if (!h) {</div><div class='del'>-                errno = ENODEV;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        op_ret = glusterfs_glh_readlink (h, vpath, buf, bufsize);</div><div class='del'>-out:</div><div class='del'>-        return op_ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-char *</div><div class='del'>-glusterfs_glh_realpath (glusterfs_handle_t handle, const char *path,</div><div class='del'>-                                char *resolved_path)</div><div class='del'>-{</div><div class='del'>-        char                            *buf = NULL;</div><div class='del'>-        char                            *rpath = NULL;</div><div class='del'>-        char                            *start = NULL, *end = NULL;</div><div class='del'>-        char                            *dest = NULL;</div><div class='del'>-        libglusterfs_client_ctx_t       *ctx = handle;</div><div class='del'>-        long int                        path_max = 0;</div><div class='del'>-        char                            *ptr = NULL;</div><div class='del'>-        struct stat                     stbuf = {0, };</div><div class='del'>-        long int                        new_size = 0;</div><div class='del'>-        char                            *new_rpath = NULL;</div><div class='del'>-        int                             dest_offset = 0;</div><div class='del'>-        char                            *rpath_limit = 0;</div><div class='del'>-        int                             ret = 0, num_links = 0;</div><div class='del'>-        char                            *vpath = NULL, *tmppath = NULL;</div><div class='del'>-        char                             absolute_path[PATH_MAX];</div><div class='del'>-</div><div class='del'>-        GF_VALIDATE_OR_GOTO (LIBGF_XL_NAME, ctx, out);</div><div class='del'>-        GF_VALIDATE_ABSOLUTE_PATH_OR_GOTO (LIBGF_XL_NAME, path, out);</div><div class='del'>-</div><div class='del'>-#ifdef PATH_MAX</div><div class='del'>-        path_max = PATH_MAX;</div><div class='del'>-#else</div><div class='del'>-        path_max = pathconf (path, _PC_PATH_MAX);</div><div class='del'>-        if (path_max &lt;= 0) {</div><div class='del'>-                path_max = 1024;</div><div class='del'>-        }</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-        if (resolved_path == NULL) {</div><div class='del'>-                rpath = CALLOC (1, path_max);</div><div class='del'>-                if (rpath == NULL) {</div><div class='del'>-                        errno = ENOMEM;</div><div class='del'>-                        goto out;</div><div class='del'>-                }</div><div class='del'>-        } else {</div><div class='del'>-                rpath = resolved_path;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        rpath_limit = rpath + path_max;</div><div class='del'>-</div><div class='del'>-        if (path[0] == '/') {</div><div class='del'>-                rpath[0] = '/';</div><div class='del'>-                dest = rpath + 1;</div><div class='del'>-        } else {</div><div class='del'>-                /*</div><div class='del'>-                   FIXME: can $CWD be a valid path on glusterfs server? hence is</div><div class='del'>-                   it better to handle this case or just return EINVAL for</div><div class='del'>-                   relative paths?</div><div class='del'>-                */</div><div class='del'>-                ptr = getcwd (rpath, path_max);</div><div class='del'>-                if (ptr == NULL) {</div><div class='del'>-                        goto err;</div><div class='del'>-                }</div><div class='del'>-                dest = rpath + strlen (rpath);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        for (start = end = (char *)path; *end; start = end) {</div><div class='del'>-                if (dest[-1] != '/') {</div><div class='del'>-                        *dest++ = '/';</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                while (*start == '/') {</div><div class='del'>-                        start++;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                for (end = start; *end &amp;&amp; *end != '/'; end++);</div><div class='del'>-</div><div class='del'>-                if ((end - start) == 0) {</div><div class='del'>-                        break;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                if ((end - start == 1) &amp;&amp; (start[0] == '.')) {</div><div class='del'>-                        /* do nothing */</div><div class='del'>-                } else if (((end - start) == 2) &amp;&amp; (start[0] == '.')</div><div class='del'>-                           &amp;&amp; (start[1] == '.')) {</div><div class='del'>-                        if (dest &gt; rpath + 1) {</div><div class='del'>-                                while (--dest[-1] != '/');</div><div class='del'>-                        }</div><div class='del'>-                } else {</div><div class='del'>-                        if ((dest + (end - start + 1)) &gt;= rpath_limit) {</div><div class='del'>-                                if (resolved_path == NULL) {</div><div class='del'>-                                        errno = ENAMETOOLONG;</div><div class='del'>-                                        if (dest &gt; rpath + 1)</div><div class='del'>-                                                dest--;</div><div class='del'>-                                        *dest = '\0';</div><div class='del'>-                                        goto err;</div><div class='del'>-                                }</div><div class='del'>-</div><div class='del'>-                                dest_offset = dest - rpath;</div><div class='del'>-                                new_size = rpath_limit - rpath;</div><div class='del'>-                                if ((end - start + 1) &gt; path_max) {</div><div class='del'>-                                        new_size = (end - start + 1);</div><div class='del'>-                                } else {</div><div class='del'>-                                        new_size = path_max;</div><div class='del'>-                                }</div><div class='del'>-</div><div class='del'>-                                new_rpath = realloc (rpath, new_size);</div><div class='del'>-                                if (new_rpath == NULL) {</div><div class='del'>-                                        goto err;</div><div class='del'>-                                }</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-                                dest = new_rpath + dest_offset;</div><div class='del'>-                                rpath = new_rpath;</div><div class='del'>-                                rpath_limit = rpath + new_size;</div><div class='del'>-                        }</div><div class='del'>-</div><div class='del'>-                        memcpy (dest, start, end - start);</div><div class='del'>-                        dest +=  end - start;</div><div class='del'>-                        *dest = '\0';</div><div class='del'>-</div><div class='del'>-                        ret = glusterfs_glh_lstat (handle, rpath, &amp;stbuf);</div><div class='del'>-                        if (ret == -1) {</div><div class='del'>-                                gf_log ("libglusterfsclient", GF_LOG_ERROR,</div><div class='del'>-                                        "glusterfs_glh_stat returned -1 for"</div><div class='del'>-                                        " path (%s):(%s)", rpath,</div><div class='del'>-                                        strerror (errno));</div><div class='del'>-                                goto err;</div><div class='del'>-                        }</div><div class='del'>-</div><div class='del'>-                        if (S_ISLNK (stbuf.st_mode)) {</div><div class='del'>-                                buf = calloc (1, path_max);</div><div class='del'>-                                if (buf == NULL) {</div><div class='del'>-                                        errno = ENOMEM;</div><div class='del'>-                                        goto err;</div><div class='del'>-                                }</div><div class='del'>-</div><div class='del'>-                                if (++num_links &gt; MAXSYMLINKS)</div><div class='del'>-                                {</div><div class='del'>-                                        errno = ELOOP;</div><div class='del'>-                                        FREE (buf);</div><div class='del'>-                                        goto err;</div><div class='del'>-                                }</div><div class='del'>-</div><div class='del'>-                                ret = glusterfs_glh_readlink (handle, rpath,</div><div class='del'>-                                                              buf,</div><div class='del'>-                                                              path_max - 1);</div><div class='del'>-                                if (ret &lt; 0) {</div><div class='del'>-                                        gf_log ("libglusterfsclient",</div><div class='del'>-                                                GF_LOG_ERROR,</div><div class='del'>-                                                "glusterfs_readlink returned %d"</div><div class='del'>-                                                " for path (%s):(%s)",</div><div class='del'>-                                                ret, rpath, strerror (errno));</div><div class='del'>-                                        FREE (buf);</div><div class='del'>-                                        goto err;</div><div class='del'>-                                }</div><div class='del'>-                                buf[ret] = '\0';</div><div class='del'>-</div><div class='del'>-                                if (buf[0] != '/') {</div><div class='del'>-                                        tmppath = strdup (rpath);</div><div class='del'>-                                        tmppath = dirname (tmppath);</div><div class='del'>-                                        sprintf (absolute_path, "%s/%s",</div><div class='del'>-                                                 tmppath, buf);</div><div class='del'>-                                        FREE (buf);</div><div class='del'>-                                        buf = libgf_resolve_path_light ((char *)absolute_path);</div><div class='del'>-                                        FREE (tmppath);</div><div class='del'>-                                }</div><div class='del'>-</div><div class='del'>-                                rpath = glusterfs_glh_realpath (handle, buf,</div><div class='del'>-                                                                rpath);</div><div class='del'>-                                FREE (buf);</div><div class='del'>-                                if (rpath == NULL) {</div><div class='del'>-                                        goto out;</div><div class='del'>-                                }</div><div class='del'>-                                dest = rpath + strlen (rpath);</div><div class='del'>-</div><div class='del'>-                        } else if (!S_ISDIR (stbuf.st_mode) &amp;&amp; *end != '\0') {</div><div class='del'>-                                errno = ENOTDIR;</div><div class='del'>-                                goto err;</div><div class='del'>-                        }</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='del'>-        if (dest &gt; rpath + 1 &amp;&amp; dest[-1] == '/')</div><div class='del'>-                --dest;</div><div class='del'>-        *dest = '\0';</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        if (vpath)</div><div class='del'>-                FREE (vpath);</div><div class='del'>-        return rpath;</div><div class='del'>-</div><div class='del'>-err:</div><div class='del'>-        if (vpath)</div><div class='del'>-                FREE (vpath);</div><div class='del'>-        if (resolved_path == NULL) {</div><div class='del'>-                FREE (rpath);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        return NULL;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-char *</div><div class='del'>-glusterfs_realpath (const char *path, char *resolved_path)</div><div class='del'>-{</div><div class='del'>-        char                    *res   = NULL;</div><div class='del'>-        char                     vpath[PATH_MAX];</div><div class='del'>-        glusterfs_handle_t       h     = NULL;</div><div class='del'>-        char                    *realp = NULL;</div><div class='del'>-</div><div class='del'>-        GF_VALIDATE_OR_GOTO (LIBGF_XL_NAME, path, out);</div><div class='del'>-</div><div class='del'>-        gf_log (LIBGF_XL_NAME, GF_LOG_DEBUG, "path %s", path);</div><div class='del'>-</div><div class='del'>-        h = libgf_resolved_path_handle (path, vpath);</div><div class='del'>-        if (!h) {</div><div class='del'>-                errno = ENODEV;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        realp = CALLOC (PATH_MAX, sizeof (char));</div><div class='del'>-        if (!realp)</div><div class='del'>-                goto out;</div><div class='del'>-</div><div class='del'>-        libgf_vmp_search_vmp (h, realp, PATH_MAX);</div><div class='del'>-        res = glusterfs_glh_realpath (h, vpath, resolved_path);</div><div class='del'>-        if (!res)</div><div class='del'>-                goto out;</div><div class='del'>-</div><div class='del'>-        /* This copy is needed to ensure that when we return the real resolved</div><div class='del'>-         * path, we return a path that accounts for the app's view of the</div><div class='del'>-         * path, i.e. it starts with the VMP, in case this is an absolute path.</div><div class='del'>-         */</div><div class='del'>-        if (libgf_path_absolute (path)) {</div><div class='del'>-                strcat (realp, resolved_path);</div><div class='del'>-                strcpy (resolved_path, realp);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        gf_log (LIBGF_XL_NAME, GF_LOG_DEBUG, "path %s, resolved %s", path,</div><div class='del'>-                resolved_path);</div><div class='del'>-out:</div><div class='del'>-        if (realp)</div><div class='del'>-                FREE (realp);</div><div class='del'>-</div><div class='del'>-        return res;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-glusterfs_glh_remove (glusterfs_handle_t handle, const char *path)</div><div class='del'>-{</div><div class='del'>-        loc_t                           loc = {0, };</div><div class='del'>-        int                             op_ret = -1;</div><div class='del'>-        libglusterfs_client_ctx_t       *ctx = handle;</div><div class='del'>-        char                            *name = NULL;</div><div class='del'>-</div><div class='del'>-        GF_VALIDATE_OR_GOTO (LIBGF_XL_NAME, handle, out);</div><div class='del'>-        GF_VALIDATE_ABSOLUTE_PATH_OR_GOTO (LIBGF_XL_NAME, path, out);</div><div class='del'>-</div><div class='del'>-        gf_log (LIBGF_XL_NAME, GF_LOG_DEBUG, "path %s", path);</div><div class='del'>-</div><div class='del'>-        loc.path = strdup (path);</div><div class='del'>-        if (!loc.path) {</div><div class='del'>-                gf_log (LIBGF_XL_NAME, GF_LOG_ERROR, "strdup failed");</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        op_ret = libgf_client_path_lookup (&amp;loc, ctx, 1);</div><div class='del'>-        if (op_ret == -1)</div><div class='del'>-                goto out;</div><div class='del'>-</div><div class='del'>-        name = strdup (loc.path);</div><div class='del'>-        op_ret = libgf_client_loc_fill (&amp;loc, ctx, 0, loc.parent-&gt;ino,</div><div class='del'>-                                        basename (name));</div><div class='del'>-        if (op_ret == -1)</div><div class='del'>-                goto out;</div><div class='del'>-</div><div class='del'>-        if (IA_ISDIR (loc.inode-&gt;ia_type))</div><div class='del'>-                op_ret = libgf_client_rmdir (ctx, &amp;loc);</div><div class='del'>-        else</div><div class='del'>-                op_ret = libgf_client_unlink (ctx, &amp;loc);</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        if (name)</div><div class='del'>-                FREE (name);</div><div class='del'>-        return op_ret;</div><div class='del'>-</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-glusterfs_remove(const char *pathname)</div><div class='del'>-{</div><div class='del'>-        int                     op_ret = -1;</div><div class='del'>-        char                    vpath[PATH_MAX];</div><div class='del'>-        glusterfs_handle_t      h = NULL;</div><div class='del'>-</div><div class='del'>-        GF_VALIDATE_OR_GOTO (LIBGF_XL_NAME, pathname, out);</div><div class='del'>-</div><div class='del'>-        gf_log (LIBGF_XL_NAME, GF_LOG_DEBUG, "path %s", pathname);</div><div class='del'>-</div><div class='del'>-        h = libgf_resolved_path_handle (pathname, vpath);</div><div class='del'>-        if (!h) {</div><div class='del'>-                errno = ENODEV;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        op_ret = glusterfs_glh_remove (h, vpath);</div><div class='del'>-out:</div><div class='del'>-        return op_ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-void</div><div class='del'>-glusterfs_rewinddir (glusterfs_dir_t dirfd)</div><div class='del'>-{</div><div class='del'>-        libglusterfs_client_fd_ctx_t    *fd_ctx = NULL;</div><div class='del'>-</div><div class='del'>-        fd_ctx = libgf_get_fd_ctx ((fd_t *)dirfd);</div><div class='del'>-        if (!fd_ctx) {</div><div class='del'>-                gf_log (LIBGF_XL_NAME, GF_LOG_ERROR, "No fd context present");</div><div class='del'>-                errno = EBADF;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        pthread_mutex_lock (&amp;fd_ctx-&gt;lock);</div><div class='del'>-        {</div><div class='del'>-                fd_ctx-&gt;offset = 0;</div><div class='del'>-                gf_log (LIBGF_XL_NAME, GF_LOG_DEBUG, "Offset: %"PRIu64,</div><div class='del'>-                        fd_ctx-&gt;offset);</div><div class='del'>-        }</div><div class='del'>-        pthread_mutex_unlock (&amp;fd_ctx-&gt;lock);</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        return;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-void</div><div class='del'>-glusterfs_seekdir (glusterfs_dir_t dirfd, off_t offset)</div><div class='del'>-{</div><div class='del'>-        libglusterfs_client_fd_ctx_t    *fd_ctx = NULL;</div><div class='del'>-</div><div class='del'>-        fd_ctx = libgf_get_fd_ctx ((fd_t *)dirfd);</div><div class='del'>-        if (!fd_ctx) {</div><div class='del'>-                gf_log (LIBGF_XL_NAME, GF_LOG_ERROR, "No fd context present");</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        pthread_mutex_lock (&amp;fd_ctx-&gt;lock);</div><div class='del'>-        {</div><div class='del'>-                fd_ctx-&gt;offset = offset;</div><div class='del'>-                gf_log (LIBGF_XL_NAME, GF_LOG_DEBUG, "Offset: %"PRIu64,</div><div class='del'>-                        fd_ctx-&gt;offset);</div><div class='del'>-        }</div><div class='del'>-        pthread_mutex_unlock (&amp;fd_ctx-&gt;lock);</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        return;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-off_t</div><div class='del'>-glusterfs_telldir (glusterfs_dir_t dirfd)</div><div class='del'>-{</div><div class='del'>-        libglusterfs_client_fd_ctx_t    *fd_ctx = NULL;</div><div class='del'>-	off_t                           off = -1;</div><div class='del'>-</div><div class='del'>-        fd_ctx = libgf_get_fd_ctx ((fd_t *)dirfd);</div><div class='del'>-        if (!fd_ctx) {</div><div class='del'>-                gf_log (LIBGF_XL_NAME, GF_LOG_ERROR, "No fd context present");</div><div class='del'>-                errno = EBADF;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        pthread_mutex_lock (&amp;fd_ctx-&gt;lock);</div><div class='del'>-        {</div><div class='del'>-                off = fd_ctx-&gt;offset;</div><div class='del'>-                gf_log (LIBGF_XL_NAME, GF_LOG_DEBUG, "Offset: %"PRIu64,</div><div class='del'>-                        fd_ctx-&gt;offset);</div><div class='del'>-        }</div><div class='del'>-        pthread_mutex_unlock (&amp;fd_ctx-&gt;lock);</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        return off;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-struct libgf_client_sendfile_data {</div><div class='del'>-        int                reads_sent;</div><div class='del'>-        int                reads_completed;</div><div class='del'>-        int                out_fd;</div><div class='del'>-        int32_t            op_ret;</div><div class='del'>-        int32_t            op_errno;</div><div class='del'>-        pthread_mutex_t    lock;</div><div class='del'>-        pthread_cond_t     cond;</div><div class='del'>-};</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-libgf_client_sendfile_read_cbk (int op_ret, int op_errno,</div><div class='del'>-                                glusterfs_iobuf_t *buf, void *cbk_data)</div><div class='del'>-{</div><div class='del'>-        struct libgf_client_sendfile_data *sendfile_data = cbk_data;</div><div class='del'>-        int                                bytes = 0;</div><div class='del'>-</div><div class='del'>-        if (op_ret &gt; 0) {</div><div class='del'>-                bytes = writev (sendfile_data-&gt;out_fd, buf-&gt;vector, buf-&gt;count);</div><div class='del'>-                if (bytes != op_ret) {</div><div class='del'>-                        op_ret = -1;</div><div class='del'>-                        op_errno = errno;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                glusterfs_free (buf);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        pthread_mutex_lock (&amp;sendfile_data-&gt;lock);</div><div class='del'>-        {</div><div class='del'>-                if (sendfile_data-&gt;op_ret != -1) {</div><div class='del'>-                        if (op_ret == -1) {</div><div class='del'>-                                sendfile_data-&gt;op_ret = -1;</div><div class='del'>-                                sendfile_data-&gt;op_errno = op_errno;</div><div class='del'>-                        } else {</div><div class='del'>-                                sendfile_data-&gt;op_ret += op_ret;</div><div class='del'>-                        }</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                sendfile_data-&gt;reads_completed++;</div><div class='del'>-</div><div class='del'>-                if (sendfile_data-&gt;reads_completed</div><div class='del'>-                    == sendfile_data-&gt;reads_sent) {</div><div class='del'>-                        pthread_cond_broadcast (&amp;sendfile_data-&gt;cond);</div><div class='del'>-                } </div><div class='del'>-        }</div><div class='del'>-        pthread_mutex_unlock (&amp;sendfile_data-&gt;lock);</div><div class='del'>-</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-glusterfs_sendfile (int out_fd, glusterfs_file_t in_fd, off_t *offset,</div><div class='del'>-                    size_t count)</div><div class='del'>-{</div><div class='del'>-        ssize_t                           ret = -1;</div><div class='del'>-        struct libgf_client_sendfile_data cbk_data = {0, };</div><div class='del'>-        off_t                             off = -1;</div><div class='del'>-        size_t                            size = 0;</div><div class='del'>-        int                               flags = 0;</div><div class='del'>-        int                               non_block = 0;</div><div class='del'>-</div><div class='del'>-        </div><div class='del'>-        pthread_mutex_init (&amp;cbk_data.lock, NULL);</div><div class='del'>-        pthread_cond_init (&amp;cbk_data.cond, NULL);</div><div class='del'>-        cbk_data.out_fd = out_fd;</div><div class='del'>-        </div><div class='del'>-        if (offset) {</div><div class='del'>-                off = *offset;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        flags = fcntl (out_fd, F_GETFL);</div><div class='del'>-</div><div class='del'>-        if (flags != -1) {</div><div class='del'>-                non_block = flags &amp; O_NONBLOCK;</div><div class='del'>-</div><div class='del'>-                if (non_block) {</div><div class='del'>-                        ret = fcntl (out_fd, F_SETFL, flags &amp; ~O_NONBLOCK);</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        while (count != 0) {</div><div class='del'>-                /* </div><div class='del'>-                 * FIXME: what's the optimal size for reads and writes?</div><div class='del'>-                 */</div><div class='del'>-                size = (count &gt; LIBGF_SENDFILE_BLOCK_SIZE) ? </div><div class='del'>-                        LIBGF_SENDFILE_BLOCK_SIZE : count;</div><div class='del'>-</div><div class='del'>-                /* </div><div class='del'>-                 * we don't wait for reply to previous read, we just send all</div><div class='del'>-                 * reads in a single go.</div><div class='del'>-                 */</div><div class='del'>-                ret = glusterfs_read_async (in_fd, size, off,</div><div class='del'>-                                            libgf_client_sendfile_read_cbk,</div><div class='del'>-                                            &amp;cbk_data);</div><div class='del'>-                if (ret == -1) {</div><div class='del'>-                        break;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                pthread_mutex_lock (&amp;cbk_data.lock);</div><div class='del'>-                {</div><div class='del'>-                        cbk_data.reads_sent++;</div><div class='del'>-                }</div><div class='del'>-                pthread_mutex_unlock (&amp;cbk_data.lock);</div><div class='del'>-</div><div class='del'>-                if (offset) {</div><div class='del'>-                        off += size;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                count -= size;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        pthread_mutex_lock (&amp;cbk_data.lock);</div><div class='del'>-        {</div><div class='del'>-                /* </div><div class='del'>-                 * if we've not received replies to all the reads we've sent,</div><div class='del'>-                 * wait for them</div><div class='del'>-                 */</div><div class='del'>-                if (cbk_data.reads_sent &gt; cbk_data.reads_completed) {</div><div class='del'>-                        pthread_cond_wait (&amp;cbk_data.cond,</div><div class='del'>-                                           &amp;cbk_data.lock);</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='del'>-        pthread_mutex_unlock (&amp;cbk_data.lock);</div><div class='del'>-</div><div class='del'>-        if (offset != NULL) {</div><div class='del'>-                *offset = off;</div><div class='del'>-        }</div><div class='del'>- </div><div class='del'>-        /* if we were able to stack_wind all the reads */</div><div class='del'>-</div><div class='del'>-        if (ret == 0) {</div><div class='del'>-                ret = cbk_data.op_ret;</div><div class='del'>-                errno = cbk_data.op_errno;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (non_block) {</div><div class='del'>-                fcntl (out_fd, F_SETFL, flags);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-static int32_t</div><div class='del'>-libgf_client_lk_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-                     int32_t op_ret, int32_t op_errno, struct flock *lock)</div><div class='del'>-{</div><div class='del'>-        libgf_client_local_t *local = frame-&gt;local;</div><div class='del'>-</div><div class='del'>-        local-&gt;reply_stub = fop_lk_cbk_stub (frame, NULL, op_ret, op_errno,</div><div class='del'>-                                             lock);</div><div class='del'>-</div><div class='del'>-        LIBGF_REPLY_NOTIFY (local);</div><div class='del'>-</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-libgf_client_lk (libglusterfs_client_ctx_t *ctx, fd_t *fd, int cmd,</div><div class='del'>-                 struct flock *lock)</div><div class='del'>-{</div><div class='del'>-        call_stub_t          *stub = NULL;</div><div class='del'>-        int32_t               op_ret;</div><div class='del'>-        libgf_client_local_t *local = NULL;</div><div class='del'>-        </div><div class='del'>-        LIBGF_CLIENT_FOP(ctx, stub, lk, local, fd, cmd, lock);</div><div class='del'>-</div><div class='del'>-        op_ret = stub-&gt;args.lk_cbk.op_ret;</div><div class='del'>-        errno = stub-&gt;args.lk_cbk.op_errno;</div><div class='del'>-        if (op_ret == 0) {</div><div class='del'>-                *lock = stub-&gt;args.lk_cbk.lock;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-	call_stub_destroy (stub);</div><div class='del'>-        return op_ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-glusterfs_fcntl (glusterfs_file_t fd, int cmd, ...)</div><div class='del'>-{</div><div class='del'>-        int                           ret = -1;</div><div class='del'>-        struct flock                 *lock = NULL;</div><div class='del'>-        va_list                       ap;</div><div class='del'>-        libglusterfs_client_ctx_t    *ctx = NULL;</div><div class='del'>-        libglusterfs_client_fd_ctx_t *fd_ctx = NULL;</div><div class='del'>-</div><div class='del'>-        GF_VALIDATE_OR_GOTO (LIBGF_XL_NAME, fd, out);</div><div class='del'>-</div><div class='del'>-        fd_ctx = libgf_get_fd_ctx (fd);</div><div class='del'>-        if (!fd_ctx) {</div><div class='del'>-                errno = EBADF;</div><div class='del'>-		goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        ctx = fd_ctx-&gt;ctx;</div><div class='del'>-</div><div class='del'>-        switch (cmd) {</div><div class='del'>-        case F_SETLK:</div><div class='del'>-        case F_SETLKW:</div><div class='del'>-        case F_GETLK:</div><div class='del'>-#if F_SETLK != F_SETLK64</div><div class='del'>-        case F_SETLK64:</div><div class='del'>-#endif</div><div class='del'>-#if F_SETLKW != F_SETLKW64</div><div class='del'>-        case F_SETLKW64:</div><div class='del'>-#endif</div><div class='del'>-#if F_GETLK != F_GETLK64</div><div class='del'>-        case F_GETLK64:</div><div class='del'>-#endif</div><div class='del'>-                va_start (ap, cmd);</div><div class='del'>-                lock = va_arg (ap, struct flock *);</div><div class='del'>-                va_end (ap);</div><div class='del'>-</div><div class='del'>-                if (!lock) {</div><div class='del'>-                        errno = EINVAL;</div><div class='del'>-                        goto out;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                ret = libgf_client_lk (ctx, fd, cmd, lock); </div><div class='del'>-                break;</div><div class='del'>-</div><div class='del'>-        default:</div><div class='del'>-                errno = EINVAL;</div><div class='del'>-                break;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-libgf_client_chdir (const char *path)</div><div class='del'>-{</div><div class='del'>-        int                op_ret            = 0;</div><div class='del'>-        uint32_t           resulting_cwd_len = 0;</div><div class='del'>-</div><div class='del'>-        pthread_mutex_lock (&amp;cwdlock);</div><div class='del'>-        {</div><div class='del'>-                if (!libgf_path_absolute (path)) {</div><div class='del'>-                        resulting_cwd_len = strlen (path) + strlen (cwd)</div><div class='del'>-                                + ((path[strlen (path) - 1] == '/')</div><div class='del'>-                                   ? 0 : 1) + 1;</div><div class='del'>-</div><div class='del'>-                        if (resulting_cwd_len &gt; PATH_MAX) {</div><div class='del'>-                                op_ret = -1;</div><div class='del'>-                                errno = ENAMETOOLONG;</div><div class='del'>-                                goto unlock;</div><div class='del'>-                        }</div><div class='del'>-                        strcat (cwd, path);</div><div class='del'>-                } else {</div><div class='del'>-                        resulting_cwd_len = strlen (path)</div><div class='del'>-                                + ((path[strlen (path) - 1] == '/')</div><div class='del'>-                                   ? 0 : 1) + 1;</div><div class='del'>-                                </div><div class='del'>-                        if (resulting_cwd_len &gt; PATH_MAX) {</div><div class='del'>-                                op_ret = -1;</div><div class='del'>-                                errno = ENAMETOOLONG;</div><div class='del'>-                                goto unlock;</div><div class='del'>-                        }</div><div class='del'>-</div><div class='del'>-                        strcpy (cwd, path);</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                if (cwd[strlen (cwd) - 1] != '/') {</div><div class='del'>-                        strcat (cwd, "/");</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='del'>-unlock:</div><div class='del'>-        pthread_mutex_unlock (&amp;cwdlock);</div><div class='del'>-</div><div class='del'>-        return op_ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-glusterfs_fchdir (glusterfs_file_t fd)</div><div class='del'>-{</div><div class='del'>-        int                           op_ret = -1;</div><div class='del'>-        char                          vpath[PATH_MAX];</div><div class='del'>-        char                          vmp[PATH_MAX]; </div><div class='del'>-        char                         *res    = NULL;</div><div class='del'>-        libglusterfs_client_fd_ctx_t *fd_ctx = NULL;</div><div class='del'>-        glusterfs_handle_t            handle = NULL;</div><div class='del'>-        </div><div class='del'>-        GF_VALIDATE_OR_GOTO (LIBGF_XL_NAME, fd, out);</div><div class='del'>-</div><div class='del'>-        /* FIXME: there is a race-condition between glusterfs_fchdir and</div><div class='del'>-           glusterfs_close. If two threads of application call glusterfs_fchdir</div><div class='del'>-           and glusterfs_close on the same fd, there is a possibility of</div><div class='del'>-           glusterfs_fchdir accessing freed memory of fd_ctx.</div><div class='del'>-        */</div><div class='del'>-</div><div class='del'>-        fd_ctx = libgf_get_fd_ctx (fd);</div><div class='del'>-        if (!fd_ctx) {</div><div class='del'>-                errno = EBADF;</div><div class='del'>-		goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        pthread_mutex_lock (&amp;fd_ctx-&gt;lock);</div><div class='del'>-        {</div><div class='del'>-                handle = fd_ctx-&gt;ctx;</div><div class='del'>-                strcpy (vpath, fd_ctx-&gt;vpath);</div><div class='del'>-        }</div><div class='del'>-        pthread_mutex_unlock (&amp;fd_ctx-&gt;lock);</div><div class='del'>-</div><div class='del'>-        if (vpath[0] == '\0') {</div><div class='del'>-                errno = ENOTDIR;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        res = libgf_vmp_search_vmp (handle, vmp, PATH_MAX);</div><div class='del'>-        if (res == NULL) {</div><div class='del'>-                errno = EBADF;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        /* both vmp and vpath are terminated with '/'. Also path starts with a</div><div class='del'>-           '/'. Hence the extra '/' amounts to NULL character at the end of the</div><div class='del'>-           string.</div><div class='del'>-        */</div><div class='del'>-        if ((strlen (vmp) + strlen (vpath)) &gt; PATH_MAX) {</div><div class='del'>-                errno = ENAMETOOLONG;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        pthread_mutex_lock (&amp;cwdlock);</div><div class='del'>-        {</div><div class='del'>-                strcpy (cwd, vmp);</div><div class='del'>-                res = vpath;</div><div class='del'>-                if (res[0] == '/') {</div><div class='del'>-                        res++;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                strcat (cwd, res);</div><div class='del'>-        }</div><div class='del'>-        pthread_mutex_unlock (&amp;cwdlock);</div><div class='del'>-</div><div class='del'>-        op_ret = 0; </div><div class='del'>-out:</div><div class='del'>-        return op_ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-glusterfs_chdir (const char *path)</div><div class='del'>-{</div><div class='del'>-        int32_t            op_ret            = -1;</div><div class='del'>-        glusterfs_handle_t handle            = NULL;</div><div class='del'>-        loc_t              loc               = {0, };</div><div class='del'>-        char               vpath[PATH_MAX]; </div><div class='del'>-</div><div class='del'>-        handle = libgf_resolved_path_handle (path, vpath);</div><div class='del'>-</div><div class='del'>-        if (handle != NULL)  {</div><div class='del'>-                loc.path = strdup (vpath);</div><div class='del'>-                if (!loc.path) {</div><div class='del'>-                        gf_log (LIBGF_XL_NAME, GF_LOG_ERROR, "Path compaction "</div><div class='del'>-                                "failed");</div><div class='del'>-                        goto out;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                op_ret = libgf_client_path_lookup (&amp;loc, handle, 0);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if ((handle == NULL) || (op_ret == 0)) {</div><div class='del'>-                op_ret = libgf_client_chdir (path);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        return op_ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-char *</div><div class='del'>-glusterfs_getcwd (char *buf, size_t size)</div><div class='del'>-{</div><div class='del'>-        char              *res      = NULL;</div><div class='del'>-        size_t             len      = 0; </div><div class='del'>-        loc_t              loc      = {0, };</div><div class='del'>-        glusterfs_handle_t handle   = NULL;</div><div class='del'>-        char               vpath[PATH_MAX];</div><div class='del'>-        int32_t            op_ret   = 0; </div><div class='del'>-</div><div class='del'>-        pthread_mutex_lock (&amp;cwdlock);</div><div class='del'>-        {</div><div class='del'>-                if (!cwd_inited) {</div><div class='del'>-                        errno = ENODEV;</div><div class='del'>-                        goto unlock;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                if (buf == NULL) {</div><div class='del'>-                        buf = CALLOC (1, len);</div><div class='del'>-                        if (buf == NULL) {</div><div class='del'>-                                gf_log (LIBGF_XL_NAME, GF_LOG_ERROR,</div><div class='del'>-                                        "out of memory");</div><div class='del'>-                                goto unlock;</div><div class='del'>-                        }</div><div class='del'>-                } else {</div><div class='del'>-                        if (size == 0) {</div><div class='del'>-                                errno = EINVAL;</div><div class='del'>-                                goto unlock;</div><div class='del'>-                        }</div><div class='del'>-</div><div class='del'>-                        if (len &gt; size) {</div><div class='del'>-                                errno = ERANGE;</div><div class='del'>-                                goto unlock;</div><div class='del'>-                        }</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                strcpy (buf, cwd);</div><div class='del'>-                res = buf; </div><div class='del'>-        }</div><div class='del'>-unlock:</div><div class='del'>-        pthread_mutex_unlock (&amp;cwdlock);</div><div class='del'>-</div><div class='del'>-        if (res != NULL) {</div><div class='del'>-                handle = libgf_resolved_path_handle (res, vpath);</div><div class='del'>-</div><div class='del'>-                if (handle != NULL)  {</div><div class='del'>-                        loc.path = strdup (vpath);</div><div class='del'>-                        if (loc.path == NULL) {</div><div class='del'>-                                gf_log (LIBGF_XL_NAME, GF_LOG_ERROR,</div><div class='del'>-                                        "strdup failed");</div><div class='del'>-                        } else {</div><div class='del'>-                                op_ret = libgf_client_path_lookup (&amp;loc, handle,</div><div class='del'>-                                                                   0);</div><div class='del'>-                                if (op_ret == -1) {</div><div class='del'>-                                        res = NULL;</div><div class='del'>-                                }</div><div class='del'>-                        }</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        return res;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-libgf_client_truncate_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-                           int32_t op_ret, int32_t op_errno,</div><div class='del'>-                           struct iatt *prebuf, struct iatt *postbuf)</div><div class='del'>-{</div><div class='del'>-        libgf_client_local_t *local = frame-&gt;local;</div><div class='del'>-</div><div class='del'>-        local-&gt;reply_stub = fop_truncate_cbk_stub (frame, NULL, op_ret,</div><div class='del'>-                                                   op_errno, prebuf, postbuf);</div><div class='del'>-</div><div class='del'>-        LIBGF_REPLY_NOTIFY (local);</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t </div><div class='del'>-libgf_client_truncate (libglusterfs_client_ctx_t *ctx, </div><div class='del'>-                       loc_t *loc, off_t length)</div><div class='del'>-{</div><div class='del'>-        call_stub_t *stub = NULL;</div><div class='del'>-        int32_t op_ret = 0;</div><div class='del'>-        libgf_client_local_t *local = NULL;</div><div class='del'>-</div><div class='del'>-        LIBGF_CLIENT_FOP (ctx, stub, truncate, local, loc, length);</div><div class='del'>- </div><div class='del'>-        op_ret = stub-&gt;args.truncate_cbk.op_ret;</div><div class='del'>-        errno = stub-&gt;args.truncate_cbk.op_errno;</div><div class='del'>-</div><div class='del'>-        gf_log (LIBGF_XL_NAME, GF_LOG_DEBUG, "path %s, status %d, errno %d",</div><div class='del'>-                loc-&gt;path, op_ret, errno);</div><div class='del'>-</div><div class='del'>-        if (op_ret == -1) {</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        libgf_transform_iattr (ctx, loc-&gt;inode,</div><div class='del'>-                               &amp;stub-&gt;args.truncate_cbk.postbuf);</div><div class='del'>-</div><div class='del'>-        libgf_update_iattr_cache (loc-&gt;inode, LIBGF_UPDATE_STAT,</div><div class='del'>-                                  &amp;stub-&gt;args.truncate_cbk.postbuf);</div><div class='del'>-	call_stub_destroy (stub);</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        return op_ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-glusterfs_glh_truncate (glusterfs_handle_t handle, const char *path,</div><div class='del'>-                        off_t length)</div><div class='del'>-{</div><div class='del'>-        int32_t op_ret = -1;</div><div class='del'>-        loc_t loc = {0, };</div><div class='del'>-        libglusterfs_client_ctx_t *ctx = handle;</div><div class='del'>-	char *name = NULL, *pathname = NULL;</div><div class='del'>-</div><div class='del'>-        GF_VALIDATE_OR_GOTO (LIBGF_XL_NAME, ctx, out);</div><div class='del'>-        GF_VALIDATE_ABSOLUTE_PATH_OR_GOTO (LIBGF_XL_NAME, path, out);</div><div class='del'>-</div><div class='del'>-        loc.path = strdup (path);</div><div class='del'>-        if (!loc.path) {</div><div class='del'>-                gf_log (LIBGF_XL_NAME, GF_LOG_ERROR, "strdup failed");</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-	op_ret = libgf_client_path_lookup (&amp;loc, ctx, 1);</div><div class='del'>-	if (op_ret == -1) {</div><div class='del'>-		gf_log ("libglusterfsclient", GF_LOG_ERROR,</div><div class='del'>-			"path lookup failed for (%s)", loc.path);</div><div class='del'>-		goto out;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	pathname = strdup (loc.path);</div><div class='del'>-	name = basename (pathname);</div><div class='del'>-</div><div class='del'>-        op_ret = libgf_client_loc_fill (&amp;loc, ctx, 0, loc.parent-&gt;ino, name);</div><div class='del'>-	if (op_ret == -1) {</div><div class='del'>-		gf_log ("libglusterfsclient",</div><div class='del'>-			GF_LOG_ERROR,</div><div class='del'>-			"libgf_client_loc_fill returned -1, returning EINVAL");</div><div class='del'>-		errno = EINVAL;</div><div class='del'>-		goto out;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-        op_ret = libgf_client_truncate (ctx, &amp;loc, length);</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        libgf_client_loc_wipe (&amp;loc);</div><div class='del'>-</div><div class='del'>-        return op_ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-glusterfs_truncate (const char *path, off_t length)</div><div class='del'>-{</div><div class='del'>-        int                     op_ret = -1;</div><div class='del'>-        char                    vpath[PATH_MAX];</div><div class='del'>-        glusterfs_handle_t      h = NULL;</div><div class='del'>-</div><div class='del'>-        GF_VALIDATE_OR_GOTO (LIBGF_XL_NAME, path, out);</div><div class='del'>-</div><div class='del'>-        gf_log (LIBGF_XL_NAME, GF_LOG_DEBUG, "path:%s length:%"PRIu64, path,</div><div class='del'>-                length);</div><div class='del'>-        h = libgf_resolved_path_handle (path, vpath);</div><div class='del'>-        if (!h) {</div><div class='del'>-                errno = ENODEV;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        op_ret = glusterfs_glh_truncate (h, vpath, length);</div><div class='del'>-out:</div><div class='del'>-        return op_ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-static struct xlator_fops libgf_client_fops = {</div><div class='del'>-};</div><div class='del'>-</div><div class='del'>-static struct xlator_cbks libgf_client_cbks = {</div><div class='del'>-        .forget      = libgf_client_forget,</div><div class='del'>-	.release     = libgf_client_release,</div><div class='del'>-	.releasedir  = libgf_client_releasedir,</div><div class='del'>-};</div><div class='del'>-</div><div class='del'>-static inline xlator_t *</div><div class='del'>-libglusterfs_graph (xlator_t *graph)</div><div class='del'>-{</div><div class='del'>-        int       ret = 0;</div><div class='del'>-        xlator_t *top = NULL;</div><div class='del'>-        xlator_list_t *xlchild, *xlparent;</div><div class='del'>-</div><div class='del'>-        top = CALLOC (1, sizeof (*top));</div><div class='del'>-        ERR_ABORT (top);</div><div class='del'>-</div><div class='del'>-        xlchild = CALLOC (1, sizeof(*xlchild));</div><div class='del'>-        ERR_ABORT (xlchild);</div><div class='del'>-        xlchild-&gt;xlator = graph;</div><div class='del'>-        top-&gt;children = xlchild;</div><div class='del'>-        top-&gt;ctx = graph-&gt;ctx;</div><div class='del'>-        top-&gt;next = graph;</div><div class='del'>-        top-&gt;name = strdup (LIBGF_XL_NAME);</div><div class='del'>-</div><div class='del'>-        xlparent = CALLOC (1, sizeof(*xlparent));</div><div class='del'>-        xlparent-&gt;xlator = top;</div><div class='del'>-        graph-&gt;parents = xlparent;</div><div class='del'>-        ret = asprintf (&amp;top-&gt;type, LIBGF_XL_NAME);</div><div class='del'>-        if (-1 == ret) {</div><div class='del'>-                fprintf (stderr, "failed to set the top xl's type");</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        top-&gt;init = libgf_client_init;</div><div class='del'>-        top-&gt;fops = &amp;libgf_client_fops;</div><div class='del'>-        top-&gt;mops = &amp;libgf_client_mops;</div><div class='del'>-        top-&gt;cbks = &amp;libgf_client_cbks; </div><div class='del'>-        top-&gt;notify = libgf_client_notify;</div><div class='del'>-        top-&gt;fini = libgf_client_fini;</div><div class='del'>-        //  fill_defaults (top);</div><div class='del'>-</div><div class='del'>-        return top;</div><div class='del'>-}</div><div class='head'>diff --git a/libglusterfsclient/src/libglusterfsclient.h b/libglusterfsclient/src/libglusterfsclient.h<br/>deleted file mode 100755<br/>index f047f5f9f81..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/libglusterfsclient/src/libglusterfsclient.h?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfsclient/src/libglusterfsclient.h</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,1372 +0,0 @@</div><div class='del'>-/*</div><div class='del'>-  Copyright (c) 2008, 2009 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='del'>-  This file is part of GlusterFS.</div><div class='del'>-</div><div class='del'>-  GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-  it under the terms of the GNU General Public License as published</div><div class='del'>-  by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-  or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-  GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-  WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-  General Public License for more details.</div><div class='del'>-</div><div class='del'>-  You should have received a copy of the GNU General Public License</div><div class='del'>-  along with this program.  If not, see</div><div class='del'>-  &lt;http://www.gnu.org/licenses/&gt;.</div><div class='del'>-*/</div><div class='del'>-</div><div class='del'>-#ifndef _LIBGLUSTERFSCLIENT_H</div><div class='del'>-#define _LIBGLUSTERFSCLIENT_H</div><div class='del'>-</div><div class='del'>-#ifndef __BEGIN_DECLS</div><div class='del'>-#ifdef __cplusplus</div><div class='del'>-#define __BEGIN_DECLS extern "C" {</div><div class='del'>-#else</div><div class='del'>-#define __BEGIN_DECLS</div><div class='del'>-#endif</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-#ifndef __END_DECLS</div><div class='del'>-#ifdef __cplusplus</div><div class='del'>-#define __END_DECLS }</div><div class='del'>-#else</div><div class='del'>-#define __END_DECLS</div><div class='del'>-#endif</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-__BEGIN_DECLS</div><div class='del'>-</div><div class='del'>-#include &lt;stdio.h&gt;</div><div class='del'>-#include &lt;sys/types.h&gt;</div><div class='del'>-#include &lt;sys/stat.h&gt;</div><div class='del'>-#include &lt;dirent.h&gt;</div><div class='del'>-#include &lt;sys/statfs.h&gt;</div><div class='del'>-#include &lt;sys/statvfs.h&gt;</div><div class='del'>-#include &lt;utime.h&gt;</div><div class='del'>-#include &lt;sys/time.h&gt;</div><div class='del'>-#include &lt;stdint.h&gt;</div><div class='del'>-</div><div class='del'>-typedef struct {</div><div class='del'>-        struct iovec *vector;</div><div class='del'>-        int           count;</div><div class='del'>-        void         *iobref;</div><div class='del'>-        void         *dictref;</div><div class='del'>-} glusterfs_iobuf_t;</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-typedef</div><div class='del'>-int (*glusterfs_readv_cbk_t) (int op_ret, int op_errno, glusterfs_iobuf_t *buf,</div><div class='del'>-			      void *cbk_data);</div><div class='del'>-</div><div class='del'>-typedef</div><div class='del'>-int (*glusterfs_write_cbk_t) (int op_ret, int op_errno, void *cbk_data);</div><div class='del'>-</div><div class='del'>-typedef</div><div class='del'>-int (*glusterfs_get_cbk_t) (int op_ret, int op_errno, glusterfs_iobuf_t *buf,</div><div class='del'>-			    struct stat *stbuf, void *cbk_data);</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-/* Data Interface</div><div class='del'>- * The first section describes the data structures required for</div><div class='del'>- * using libglusterfsclient.</div><div class='del'>- */</div><div class='del'>-</div><div class='del'>-/* This structure needs to be filled up and</div><div class='del'>- * passed to te glusterfs_init function which uses</div><div class='del'>- * the params passed herein to initialize a glusterfs</div><div class='del'>- * client context and then connect to a glusterfs server.</div><div class='del'>- */</div><div class='del'>-typedef struct {</div><div class='del'>-        char          *logfile;         /* Path to the file which will store</div><div class='del'>-                                           the log.</div><div class='del'>-                                           */</div><div class='del'>-        char          *loglevel;        /* The log level required for</div><div class='del'>-                                           reporting various events within</div><div class='del'>-                                           libglusterfsclient.</div><div class='del'>-                                           */</div><div class='del'>-        struct {</div><div class='del'>-                char  *specfile;        /* Users can either open a volume or</div><div class='del'>-                                           specfile and assign the pointer to</div><div class='del'>-                                           specfp, or just refer to the volume</div><div class='del'>-                                           /spec file path in specfile.</div><div class='del'>-                                           */</div><div class='del'>-                FILE  *specfp;</div><div class='del'>-        };</div><div class='del'>-        char          *volume_name;     /* The volume file could describe many</div><div class='del'>-                                           volumes but the specific volume</div><div class='del'>-                                           within that file is chosen by</div><div class='del'>-                                           specifying the volume name here.</div><div class='del'>-                                           */</div><div class='del'>-        unsigned long  lookup_timeout;  /* libglusterclient provides the inode</div><div class='del'>-                                           numbers to be cached by the library.</div><div class='del'>-                                           The duration for which these are</div><div class='del'>-                                           cached are defined by lookup_timeout</div><div class='del'>-                                           . In Seconds.</div><div class='del'>-                                           */</div><div class='del'>-        unsigned long  stat_timeout;    /* The file attributes received from</div><div class='del'>-                                           a stat syscall can also be cached</div><div class='del'>-                                           for the duration specified in this</div><div class='del'>-                                           member. In Seconds.</div><div class='del'>-                                           */</div><div class='del'>-} glusterfs_init_params_t;</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-/* This is the handle returned by glusterfs_init</div><div class='del'>- * once the initialization is complete.</div><div class='del'>- * Users should treat this as an opaque handle.</div><div class='del'>- */</div><div class='del'>-typedef void * glusterfs_handle_t;</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-/* These identifiers are used as handles for files and dirs.</div><div class='del'>- * Users of libglusterfsclient should not in anyway try to interpret</div><div class='del'>- * the actual structures these will point to.</div><div class='del'>- */</div><div class='del'>-typedef void * glusterfs_file_t;</div><div class='del'>-typedef void * glusterfs_dir_t;</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-/* Function Call Interface */</div><div class='del'>-/* libglusterfsclient initialization function.</div><div class='del'>- * @ctx : the structure described above filled with required values.</div><div class='del'>- * @fakefsid: User generated fsid to be used to identify this</div><div class='del'>- * volume.</div><div class='del'>- *</div><div class='del'>- * Returns NULL on failure and the non-NULL pointer on success.</div><div class='del'>- * On failure, the error description might be present in the logfile</div><div class='del'>- * depending on the log level.</div><div class='del'>- */</div><div class='del'>-glusterfs_handle_t</div><div class='del'>-glusterfs_init (glusterfs_init_params_t *ctx, uint32_t fakefsid);</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-/* Used to destroy a glusterfs client context and the</div><div class='del'>- * connection to the glusterfs server.</div><div class='del'>- *</div><div class='del'>- * @handle      : The glusterfs handle returned by glusterfs_init.</div><div class='del'>- */</div><div class='del'>-int</div><div class='del'>-glusterfs_fini (glusterfs_handle_t handle);</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-/* libglusterfs client provides two interfaces.</div><div class='del'>- * 1. handle-based interface</div><div class='del'>- * Functions that comprise the handle-based interface accept the</div><div class='del'>- * glusterfs_handle_t as the first argument. It specifies the</div><div class='del'>- * glusterfs client context over which to perform the operation.</div><div class='del'>- *</div><div class='del'>- * 2. Virtual Mount Point based interface:</div><div class='del'>- * Functions that do not require a handle to be given in order to</div><div class='del'>- * identify which client context to operate on. This interface</div><div class='del'>- * internally determines the corresponding client context for the</div><div class='del'>- * given path. The down-side is that a virtual mount point (VMP) needs to be</div><div class='del'>- * registered with the library. A VMP is just a string that maps to a</div><div class='del'>- * glusterfs_handle_t. The advantage of a VMP based interface is that</div><div class='del'>- * a user program using multiple client contexts does not need to</div><div class='del'>- * maintain its own mapping between paths and the corresponding</div><div class='del'>- * handles.</div><div class='del'>- */</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-/* glusterfs_mount is the function that allows users to register a VMP</div><div class='del'>- * along with the parameters, which will be used to initialize a</div><div class='del'>- * context. Applications calling glusterfs_mount do not need to</div><div class='del'>- * initialized a context using the glusterfs_init interface.</div><div class='del'>- *</div><div class='del'>- * @vmp         : The virtual mount point.</div><div class='del'>- * @ipars       : Initialization parameters populated as described</div><div class='del'>- *              earlier.</div><div class='del'>- *</div><div class='del'>- * Returns 0 on success, and -1 on failure.</div><div class='del'>- */</div><div class='del'>-int</div><div class='del'>-glusterfs_mount (char *vmp, glusterfs_init_params_t *ipars);</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-/* glusterfs_umount is the VMP equivalent of glusterfs_fini.</div><div class='del'>- *</div><div class='del'>- * @vmp         : The VMP which was initialized using glusterfs_mount.</div><div class='del'>- *</div><div class='del'>- * Returns 0 on sucess, and -1 on failure.</div><div class='del'>- */</div><div class='del'>-int</div><div class='del'>-glusterfs_umount (char *vmp);</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-/* glusterfs_umount_all unmounts all the mounts */</div><div class='del'>-int</div><div class='del'>-glusterfs_umount_all (void);</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-/* For smaller files, application can use just</div><div class='del'>- * glusterfs_get/glusterfs_get_async</div><div class='del'>- * to read the whole content. Limit of the file-sizes to be read in</div><div class='del'>- * glusterfs_get/glusterfs_get_async is passed in the size argument</div><div class='del'>- */</div><div class='del'>-</div><div class='del'>-/* glusterfs_glh_get:</div><div class='del'>- * @handle : glusterfs handle</div><div class='del'>- * @path   : path to be looked upon</div><div class='del'>- * @size   : upper limit of file-sizes to be read in lookup</div><div class='del'>- * @stbuf  : attribute buffer</div><div class='del'>- */</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-glusterfs_glh_get (glusterfs_handle_t handle, const char *path, void *buf,</div><div class='del'>-	       size_t size, struct stat *stbuf);</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-glusterfs_get (const char *path, void *buf, size_t size, struct stat *stbuf);</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-glusterfs_get_async (glusterfs_handle_t handle, const char *path, size_t size,</div><div class='del'>-		     glusterfs_get_cbk_t cbk, void *cbk_data);</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-/* Opens a file. Corresponds to the open syscall.</div><div class='del'>- *</div><div class='del'>- * @handle      : Handle returned from glusterfs_init</div><div class='del'>- * @path        : Path to the file or directory on the glusterfs</div><div class='del'>- *              export. Must be absolute to the export on the server.</div><div class='del'>- * @flags       : flags to control open behaviour.</div><div class='del'>- * @...         : The mode_t argument that defines the mode for a new</div><div class='del'>- *              file, in case a new file is being created using the</div><div class='del'>- *              O_CREAT flag in @flags.</div><div class='del'>- *</div><div class='del'>- * Returns a non-NULL handle on success. NULL on failure and sets</div><div class='del'>- * errno accordingly.</div><div class='del'>- */</div><div class='del'>-glusterfs_file_t</div><div class='del'>-glusterfs_glh_open (glusterfs_handle_t handle, const char *path, int flags,</div><div class='del'>-                        ...);</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-/* Opens a file without having to specify a handle.</div><div class='del'>- *</div><div class='del'>- * @path        : Path to the file to open in the glusterfs export.</div><div class='del'>- *              The path to the file in glusterfs export must be</div><div class='del'>- *              pre-fixed with the VMP string registered with</div><div class='del'>- *              glusterfs_mount.</div><div class='del'>- * @flags       : flags to control open behaviour.</div><div class='del'>- * @...         : The mode_t argument that defines the mode for a new</div><div class='del'>- *              file, in case a new file is being created using the</div><div class='del'>- *              O_CREAT flag in @flags.</div><div class='del'>- *</div><div class='del'>- * Returns 0 on success, -1 on failure with errno set accordingly.</div><div class='del'>- */</div><div class='del'>-glusterfs_file_t</div><div class='del'>-glusterfs_open (const char *path, int flags, ...);</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-/* Creates a file. Corresponds to the creat syscall.</div><div class='del'>- *</div><div class='del'>- * @handle      : Handle returned from glusterfs_init</div><div class='del'>- * @path        : Path to the file that needs to be created in the</div><div class='del'>- *              glusterfs export.</div><div class='del'>- * @mode        : File creation mode.</div><div class='del'>- *</div><div class='del'>- * Returns the file handle on success. NULL on error with errno set as</div><div class='del'>- * required.</div><div class='del'>- */</div><div class='del'>-glusterfs_file_t</div><div class='del'>-glusterfs_glh_creat (glusterfs_handle_t handle, const char *path, mode_t mode);</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-/* VMP-based creat.</div><div class='del'>- * @path        : Path to the file to be created. Must be</div><div class='del'>- *              pre-prepended with the VMP string registered with</div><div class='del'>- *              glusterfs_mount.</div><div class='del'>- * @mode        : File creation mode.</div><div class='del'>- *</div><div class='del'>- * Returns file handle on success. NULL handle on error with errno set</div><div class='del'>- * accordingly.</div><div class='del'>- */</div><div class='del'>-glusterfs_file_t</div><div class='del'>-glusterfs_creat (const char *path, mode_t mode);</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-/* Close the file identified by the handle.</div><div class='del'>- *</div><div class='del'>- * @fd          : Closes the file.</div><div class='del'>- *</div><div class='del'>- * Returns 0 on success, -1 on error with errno set accordingly.</div><div class='del'>- */</div><div class='del'>-int</div><div class='del'>-glusterfs_close (glusterfs_file_t fd);</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-/* Get struct stat for the file in path.</div><div class='del'>- *</div><div class='del'>- * @handle      : The handle that identifies a glusterfs client</div><div class='del'>- *              context.</div><div class='del'>- * @path        : The file for which we need to get struct stat.</div><div class='del'>- * @stbuf       : The buffer into which the file's stat is copied.</div><div class='del'>- *</div><div class='del'>- * Returns 0 on success and -1 on error with errno set accordingly.</div><div class='del'>- */</div><div class='del'>-int</div><div class='del'>-glusterfs_glh_stat (glusterfs_handle_t handle, const char *path,</div><div class='del'>-                        struct stat *stbuf);</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-/* Get struct stat for file in path.</div><div class='del'>- *</div><div class='del'>- * @path        : The file for which struct stat is required.</div><div class='del'>- * @sbuf        : The buffer into which the stat structure is copied.</div><div class='del'>- *</div><div class='del'>- * Returns 0 on success and -1 on error with errno set accordingly.</div><div class='del'>- */</div><div class='del'>-int</div><div class='del'>-glusterfs_stat (const char *path, struct stat *buf);</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-/* Gets stat struct for the file.</div><div class='del'>- *</div><div class='del'>- * @handle      : The handle identifying a glusterfs client context.</div><div class='del'>- * @path        : Path to the file for which stat structure is</div><div class='del'>- *              required. If path is a symlink, the symlink is</div><div class='del'>- *              interpreted and the stat structure returned for the</div><div class='del'>- *              target of the link.</div><div class='del'>- * @buf         : The buffer into which the stat structure is copied.</div><div class='del'>- *</div><div class='del'>- * Returns 0 on success and -1 on error with errno set accordingly.</div><div class='del'>- */</div><div class='del'>-int</div><div class='del'>-glusterfs_glh_lstat (glusterfs_handle_t handle, const char *path,</div><div class='del'>-                        struct stat *buf);</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-/* Gets stat struct for a file.</div><div class='del'>- *</div><div class='del'>- * @path        : The file to get the struct stat for.</div><div class='del'>- * @buf         : The receiving struct stat buffer.</div><div class='del'>- *</div><div class='del'>- * Returns 0 on success and -1 on error with errno set accordingly.</div><div class='del'>- */</div><div class='del'>-int</div><div class='del'>-glusterfs_lstat (const char *path, struct stat *buf);</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-/* Get stat structure for a file.</div><div class='del'>- *</div><div class='del'>- * @fd          : The file handle identifying a file on the glusterfs</div><div class='del'>- *              server.</div><div class='del'>- * @stbuf       : The buffer into which the stat data is copied.</div><div class='del'>- *</div><div class='del'>- * Returns 0 on success and -1 on error with errno set accordingly.</div><div class='del'>- */</div><div class='del'>-int</div><div class='del'>-glusterfs_fstat (glusterfs_file_t fd, struct stat *stbuf);</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-glusterfs_glh_setxattr (glusterfs_handle_t handle, const char *path,</div><div class='del'>-                                const char *name, const void *value,</div><div class='del'>-                                size_t size, int flags);</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-glusterfs_glh_lsetxattr (glusterfs_handle_t handle, const char *path,</div><div class='del'>-                         const char *name, const void *value, size_t size,</div><div class='del'>-                         int flags);</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-glusterfs_setxattr (const char *path, const char *name, const void *value,</div><div class='del'>-                        size_t size, int flags);</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-glusterfs_lsetxattr (const char *path, const char *name, const void *value,</div><div class='del'>-                     size_t size, int flags);</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-glusterfs_fsetxattr (glusterfs_file_t fd, const char *name, const void *value,</div><div class='del'>-                     size_t size, int flags);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-glusterfs_glh_getxattr (glusterfs_handle_t handle, const char *path,</div><div class='del'>-		        const char *name, void *value, size_t size);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-glusterfs_glh_lgetxattr (glusterfs_handle_t handle, const char *path,</div><div class='del'>-		         const char *name, void *value, size_t size);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-glusterfs_getxattr (const char *path, const char *name, void *value,</div><div class='del'>-                        size_t size);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-glusterfs_lgetxattr (const char *path, const char *name, void *value,</div><div class='del'>-                     size_t size);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-glusterfs_fgetxattr (glusterfs_file_t fd, const char *name, void *value,</div><div class='del'>-		     size_t size);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-glusterfs_listxattr (glusterfs_handle_t handle, const char *path, char *list,</div><div class='del'>-                     size_t size);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-glusterfs_llistxattr (glusterfs_handle_t handle, const char *path, char *list,</div><div class='del'>-                      size_t size);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-glusterfs_flistxattr (glusterfs_file_t fd, char *list, size_t size);</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-glusterfs_removexattr (glusterfs_handle_t handle, const char *path,</div><div class='del'>-		       const char *name);</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-glusterfs_lremovexattr (glusterfs_handle_t handle, const char *path,</div><div class='del'>-			const char *name);</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-glusterfs_fremovexattr (glusterfs_file_t fd, const char *name);</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-/* Read data from a file.</div><div class='del'>- * @fd          : Handle returned by glusterfs_open or</div><div class='del'>- *              glusterfs_glh_open.</div><div class='del'>- * @buf         : Buffer to read the data into.</div><div class='del'>- * @nbytes      : Number of bytes to read.</div><div class='del'>- *</div><div class='del'>- * Returns number of bytes actually read on success or -1 on error</div><div class='del'>- * with errno set to the appropriate error number.</div><div class='del'>- */</div><div class='del'>-ssize_t</div><div class='del'>-glusterfs_read (glusterfs_file_t fd, void *buf, size_t nbytes);</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-/* Read data into an array of buffers.</div><div class='del'>- *</div><div class='del'>- * @fd          : File handle returned by glusterfs_open or</div><div class='del'>- *              glusterfs_glh_open.</div><div class='del'>- * @vec         : Array of buffers into which the data is read.</div><div class='del'>- * @count       : Number of iovecs referred to by vec.</div><div class='del'>- *</div><div class='del'>- * Returns number of bytes read on success or -1 on error with errno</div><div class='del'>- * set appropriately.</div><div class='del'>- */</div><div class='del'>-ssize_t</div><div class='del'>-glusterfs_readv (glusterfs_file_t fd, const struct iovec *vec, int count);</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-glusterfs_read_async (glusterfs_file_t fd, size_t nbytes, off_t offset,</div><div class='del'>-                      glusterfs_readv_cbk_t readv_cbk, void *cbk_data);</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-/* Write data into a file.</div><div class='del'>- *</div><div class='del'>- * @fd          : File handle returned from glusterfs_open or</div><div class='del'>- *              glusterfs_glh_open.</div><div class='del'>- * @buf         : Buffer which is written to the file.</div><div class='del'>- * @nbytes      : Number bytes of the @buf written to the file.</div><div class='del'>- *</div><div class='del'>- * On success, returns number of bytes written. On error, returns -1</div><div class='del'>- * with errno set appropriately.</div><div class='del'>- */</div><div class='del'>-ssize_t</div><div class='del'>-glusterfs_write (glusterfs_file_t fd, const void *buf, size_t nbytes);</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-/* Writes an array of buffers into a file.</div><div class='del'>- *</div><div class='del'>- * @fd          : The file handle returned from glusterfs_open or</div><div class='del'>- *              glusterfs_glh_open.</div><div class='del'>- * @vector      : Array of buffers to be written to the file.</div><div class='del'>- * @count       : Number of separate buffers in the @vector array.</div><div class='del'>- *</div><div class='del'>- * Returns number of bytes written on success or -1 on error with</div><div class='del'>- * errno set approriately.</div><div class='del'>- */</div><div class='del'>-ssize_t</div><div class='del'>-glusterfs_writev (glusterfs_file_t fd, const struct iovec *vector, int count);</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-glusterfs_write_async (glusterfs_file_t fd, const void *buf, size_t nbytes,</div><div class='del'>-                       off_t offset, glusterfs_write_cbk_t write_cbk,</div><div class='del'>-		       void *cbk_data);</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-glusterfs_writev_async (glusterfs_file_t fd, const struct iovec *vector,</div><div class='del'>-			int count, off_t offset,</div><div class='del'>-			glusterfs_write_cbk_t write_cbk, void *cbk_data);</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-/* Read from a file starting at a given offset.</div><div class='del'>- *</div><div class='del'>- * @fd          : File handle returned from glusterfs_open or</div><div class='del'>- *              glusterfs_glh_open.</div><div class='del'>- * @buf         : Buffer to read the data into.</div><div class='del'>- * @nbytes      : Number of bytes to read.</div><div class='del'>- * @offset      : The offset to start reading @nbytes from.</div><div class='del'>- *</div><div class='del'>- * Returns number of bytes read on success or -1 on error with errno</div><div class='del'>- * set appropriately.</div><div class='del'>- */</div><div class='del'>-ssize_t</div><div class='del'>-glusterfs_pread (glusterfs_file_t fd, void *buf, size_t nbytes, off_t offset);</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-/* Write to a file starting at a given offset.</div><div class='del'>- *</div><div class='del'>- * @fd          : Flie handle returned from glusterfs_open or</div><div class='del'>- *              glusterfs_glh_open.</div><div class='del'>- * @buf         : Buffer that will be written to the file.</div><div class='del'>- * @nbytes      : Number of bytes to write from @buf.</div><div class='del'>- * @offset      : The starting offset from where @nbytes will be</div><div class='del'>- *              written.</div><div class='del'>- *</div><div class='del'>- * Returns number of bytes written on success and -1 on error with</div><div class='del'>- * errno set appropriately.</div><div class='del'>- */</div><div class='del'>-ssize_t</div><div class='del'>-glusterfs_pwrite (glusterfs_file_t fd, const void *buf, size_t nbytes,</div><div class='del'>-		  off_t offset);</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-/* Seek to an offset in the file.</div><div class='del'>- *</div><div class='del'>- * @fd          : File handle in which to seek to. File handle</div><div class='del'>- *              returned by glusterfs_open or glusterfs_glh_open.</div><div class='del'>- * @offset      : Offset to seek to in the given file.</div><div class='del'>- * @whence      : Determines how the offset is interpreted by this</div><div class='del'>- *              syscall. The behaviour is similar to the options</div><div class='del'>- *              provided by the POSIX lseek system call. See man lseek</div><div class='del'>- *              for more details.</div><div class='del'>- *</div><div class='del'>- * On success, returns the resulting absolute offset in the file after the seek</div><div class='del'>- * operation is performed. ON error, returns -1 with errno set</div><div class='del'>- * appropriately.</div><div class='del'>- */</div><div class='del'>-off_t</div><div class='del'>-glusterfs_lseek (glusterfs_file_t fd, off_t offset, int whence);</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-/* Create a directory.</div><div class='del'>- *</div><div class='del'>- * @handle      : The handle of the glusterfs context in which the</div><div class='del'>- *              directory needs to be created.</div><div class='del'>- * @path        : The absolute path within the glusterfs context where</div><div class='del'>- *              the directory needs to be created.</div><div class='del'>- * @mode        : The mode bits for the newly created directory.</div><div class='del'>- *</div><div class='del'>- * Returns 0 on success and -1 on error with errno set appropriately.</div><div class='del'>- */</div><div class='del'>-int</div><div class='del'>-glusterfs_glh_mkdir (glusterfs_handle_t handle, const char *path, mode_t mode);</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-/* Create a directory.</div><div class='del'>- *</div><div class='del'>- * @path        : Path to the directory that needs to be created. This</div><div class='del'>- *              path must be prefixed with the VMP of the particular glusterfs</div><div class='del'>- *              context.</div><div class='del'>- * @mode        : Mode flags for the newly created directory.</div><div class='del'>- *</div><div class='del'>- * Returns 0 on success and -1 on error with errno set appropriately.</div><div class='del'>- */</div><div class='del'>-int</div><div class='del'>-glusterfs_mkdir (const char *path, mode_t mode);</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-/* Remove a directory.</div><div class='del'>- *</div><div class='del'>- * @handle      : Handle of the glusterfs context from which to remove</div><div class='del'>- *              the directory.</div><div class='del'>- * @path        : The path of the directory to be removed in the glusterfs</div><div class='del'>- *              context.</div><div class='del'>- *</div><div class='del'>- * Returns 0 on success and -1 on error with errno set appropriately.</div><div class='del'>- */</div><div class='del'>-int</div><div class='del'>-glusterfs_glh_rmdir (glusterfs_handle_t handle, const char *path);</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-/* Remove a directory.</div><div class='del'>- *</div><div class='del'>- * @path        : The absolute path to the directory to be removed.</div><div class='del'>- *              This path must be pre-fixed with the VMP of the</div><div class='del'>- *              particular glusterfs context in which this directory</div><div class='del'>- *              resides.</div><div class='del'>- *</div><div class='del'>- * Returns 0 on success and -1 on error with errno set appropriately.</div><div class='del'>- */</div><div class='del'>-int</div><div class='del'>-glusterfs_rmdir (const char *path);</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-/* Read directory entries.</div><div class='del'>- *</div><div class='del'>- * @fd          : The handle of the directory to be read. This handle</div><div class='del'>- *              is the one returned by opendir.</div><div class='del'>- *</div><div class='del'>- * Returns the directory entry on success and NULL pointer on error</div><div class='del'>- * with errno set appropriately.</div><div class='del'>- */</div><div class='del'>-void *</div><div class='del'>-glusterfs_readdir (glusterfs_dir_t dirfd);</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-/* re-entrant version of glusterfs_readdir.</div><div class='del'>- *</div><div class='del'>- * @dirfd       : The handle of directory to be read. This handle is the one</div><div class='del'>- *                returned by opendir.</div><div class='del'>- * @entry       : Pointer to storage to store a directory entry. The storage</div><div class='del'>- *                pointed to by entry shall be large enough for a dirent with </div><div class='del'>- *                an array of char d_name members containing at least</div><div class='del'>- *                {NAME_MAX}+1 elements.</div><div class='del'>- * @result      : Upon successful return, the pointer returned at *result shall</div><div class='del'>- *                have the same value as the argument entry. Upon reaching the</div><div class='del'>- *                end of the directory stream, this pointer shall have the</div><div class='del'>- *                value NULL.</div><div class='del'>- */</div><div class='del'>-int</div><div class='del'>-glusterfs_readdir_r (glusterfs_dir_t dirfd, struct dirent *entry,</div><div class='del'>-                     struct dirent **result);</div><div class='del'>-</div><div class='del'>-/* Close a directory handle.</div><div class='del'>- *</div><div class='del'>- * @fd          : The directory handle to be closed.</div><div class='del'>- *</div><div class='del'>- * Returns 0 on success and -1 on error with errno set to 0.</div><div class='del'>- */</div><div class='del'>-int</div><div class='del'>-glusterfs_closedir (glusterfs_dir_t dirfd);</div><div class='del'>-/* FIXME: remove getdents */</div><div class='del'>-int</div><div class='del'>-glusterfs_getdents (glusterfs_dir_t fd, struct dirent *dirp,</div><div class='del'>-		    unsigned int count);</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-/* Create device node.</div><div class='del'>- *</div><div class='del'>- * @handle      : glusterfs context in which to create the device</div><div class='del'>- *              node.</div><div class='del'>- * @pathname    : The absolute path of the device to be created in the</div><div class='del'>- *              given glusterfs context.</div><div class='del'>- *</div><div class='del'>- * @mode        : Mode flags to apply to the newly created node.</div><div class='del'>- * @dev         : Device numbers that will apply to the node.</div><div class='del'>- *</div><div class='del'>- * Returns 0 on success and -1 on error with errno set appropriately.</div><div class='del'>- */</div><div class='del'>-int</div><div class='del'>-glusterfs_glh_mknod(glusterfs_handle_t handle, const char *pathname,</div><div class='del'>-                        mode_t mode, dev_t dev);</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-/* Create a device node.</div><div class='del'>- *</div><div class='del'>- * @pathname    : The full path of the node to be created. This path</div><div class='del'>- *              should be pre-pended with the VMP of the glusterfs</div><div class='del'>- *              context in which this node is to be created.</div><div class='del'>- * @mode        : Mode flags that will be applied to the newly created</div><div class='del'>- *              device file.</div><div class='del'>- * @dev         : The device numbers that will be associated with the</div><div class='del'>- *              device node.</div><div class='del'>- *</div><div class='del'>- * Returns 0 on success and -1 on error with errno set appropriately.</div><div class='del'>- */</div><div class='del'>-int</div><div class='del'>-glusterfs_mknod(const char *pathname, mode_t mode, dev_t dev);</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-/* Returns the real absolute path of the given path.</div><div class='del'>- *</div><div class='del'>- * @handle              : The glusterfs context in which the path resides in.</div><div class='del'>- * @path                : The path to be resolved.</div><div class='del'>- * @resolved_path       : The resolved path is stored in this buffer</div><div class='del'>- *                      provided by the caller.</div><div class='del'>- *</div><div class='del'>- * Returns a pointer to resolved_path on success and NULL on error</div><div class='del'>- * with errno set appropriately.</div><div class='del'>- *</div><div class='del'>- * See man realpath for details.</div><div class='del'>- */</div><div class='del'>-char *</div><div class='del'>-glusterfs_glh_realpath (glusterfs_handle_t handle, const char *path,</div><div class='del'>-                        char *resolved_path);</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-/* Returns the real absolute path of the given path.</div><div class='del'>- *</div><div class='del'>- * @path                : The path to be resolved. This path must be</div><div class='del'>- *                      pre-fixed with the VMP of the glusterfs</div><div class='del'>- *                      context in which the file resides.</div><div class='del'>- *</div><div class='del'>- * @resolved_path       : The resolved path is stored in this user</div><div class='del'>- *                      provided buffer.</div><div class='del'>- *</div><div class='del'>- * Returns a pointer to resolved_path on success, and NULL on error</div><div class='del'>- * with errno set appropriately.</div><div class='del'>- */</div><div class='del'>-char *</div><div class='del'>-glusterfs_realpath (const char *path, char *resolved_path);</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-/* Change mode flags on a path.</div><div class='del'>- *</div><div class='del'>- * @handle      : Handle of the glusterfs instance in which the path</div><div class='del'>- *              resides.</div><div class='del'>- * @path        : The path whose mode bits need to be changed.</div><div class='del'>- * @mode        : The new mode bits.</div><div class='del'>- *</div><div class='del'>- * Returns 0 on success and -1 on error with errno set appropriately.</div><div class='del'>- */</div><div class='del'>-int</div><div class='del'>-glusterfs_glh_chmod (glusterfs_handle_t handle, const char *path, mode_t mode);</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-/* Change mode flags on a path.</div><div class='del'>- *</div><div class='del'>- * @path        : The path whose mode bits need to be changed. The</div><div class='del'>- *              path should be pre-fixed with the VMP that identifies the</div><div class='del'>- *              glusterfs context within which the path resides.</div><div class='del'>- * @mode        : The new mode bits.</div><div class='del'>- *</div><div class='del'>- * Returns 0 on success and -1 on error with errno set appropriately.</div><div class='del'>- */</div><div class='del'>-int</div><div class='del'>-glusterfs_chmod (const char *path, mode_t mode);</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-/* Change the owner of a path.</div><div class='del'>- * If @path is a symlink, it is dereferenced and the ownership change</div><div class='del'>- * happens on the target.</div><div class='del'>- *</div><div class='del'>- * @handle      : Handle of the glusterfs context in which the path</div><div class='del'>- *              resides.</div><div class='del'>- * @path        : The path whose owner needs to be changed.</div><div class='del'>- * @owner       : ID of the new owner.</div><div class='del'>- * @group       : ID of the new group.</div><div class='del'>- *</div><div class='del'>- * Returns 0 on success and -1 on error with errno set appropriately.</div><div class='del'>- */</div><div class='del'>-int</div><div class='del'>-glusterfs_glh_chown (glusterfs_handle_t handle, const char *path, uid_t owner,</div><div class='del'>-                        gid_t group);</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-/* Change the owner of a path.</div><div class='del'>- *</div><div class='del'>- * If @path is a symlink, it is dereferenced and the ownership change</div><div class='del'>- * happens on the target.</div><div class='del'>- * @path        : The path whose owner needs to be changed. Path must</div><div class='del'>- *              be pre-fixed with the VMP that identifies the</div><div class='del'>- *              glusterfs context in which the path resides.</div><div class='del'>- * @owner       : ID of the new owner.</div><div class='del'>- * @group       : ID of the new group.</div><div class='del'>- *</div><div class='del'>- * Returns 0 on success and -1 on error with errno set appropriately.</div><div class='del'>- */</div><div class='del'>-int</div><div class='del'>-glusterfs_chown (const char *path, uid_t owner, gid_t group);</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-/* Change the owner of the file.</div><div class='del'>- *</div><div class='del'>- * @fd          : Handle of the file whose owner needs to be changed.</div><div class='del'>- * @owner       : ID of the new owner.</div><div class='del'>- * @group       : ID of the new group.</div><div class='del'>- *</div><div class='del'>- * Returns 0 on success and -1 on error with errno set appropriately.</div><div class='del'>- */</div><div class='del'>-int</div><div class='del'>-glusterfs_fchown (glusterfs_file_t fd, uid_t owner, gid_t group);</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-/* Open a directory.</div><div class='del'>- *</div><div class='del'>- * @handle      : Handle that identifies a glusterfs context.</div><div class='del'>- * @path        : Path to the directory in the glusterfs context.</div><div class='del'>- *</div><div class='del'>- * Returns a non-NULL handle on success and NULL on failure with errno</div><div class='del'>- * set appropriately.</div><div class='del'>- */</div><div class='del'>-glusterfs_dir_t</div><div class='del'>-glusterfs_glh_opendir (glusterfs_handle_t handle, const char *path);</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-/* Open a directory.</div><div class='del'>- *</div><div class='del'>- * @path        : Path to the directory. The path must be prepended</div><div class='del'>- *              with the VMP in order to identify the glusterfs</div><div class='del'>- *              context in which path resides.</div><div class='del'>- *</div><div class='del'>- * Returns a non-NULL handle on success and NULL on failure with errno</div><div class='del'>- * set appropriately.</div><div class='del'>- */</div><div class='del'>-glusterfs_dir_t</div><div class='del'>-glusterfs_opendir (const char *path);</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-/* Change the mode bits on an open file.</div><div class='del'>- *</div><div class='del'>- * @fd          : The file whose mode bits need to be changed.</div><div class='del'>- * @mode        : The new mode bits.</div><div class='del'>- *</div><div class='del'>- * Returns 0 on success and -1 on error with errno set appropriately.</div><div class='del'>- */</div><div class='del'>-int</div><div class='del'>-glusterfs_fchmod (glusterfs_file_t fd, mode_t mode);</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-/* Sync the file contents to storage.</div><div class='del'>- *</div><div class='del'>- * @fd          : The file whose contents need to be sync'ed to</div><div class='del'>- *              storage.</div><div class='del'>- *</div><div class='del'>- * Return 0 on success and -1 on error with errno set appropriately.</div><div class='del'>- */</div><div class='del'>-int</div><div class='del'>-glusterfs_fsync (glusterfs_file_t *fd);</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-/* Truncate an open file.</div><div class='del'>- *</div><div class='del'>- * @fd          : The file to truncate.</div><div class='del'>- * @length      : The length to truncate to.</div><div class='del'>- *</div><div class='del'>- * Returns 0 on success and -1 on error with errno set appropriately.</div><div class='del'>- */</div><div class='del'>-int</div><div class='del'>-glusterfs_ftruncate (glusterfs_file_t fd, off_t length);</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-/* Create a hard link between two paths.</div><div class='del'>- *</div><div class='del'>- * @handle      : glusterfs context in which both paths should reside.</div><div class='del'>- * @oldpath     : The existing path to link to.</div><div class='del'>- * @newpath     : The new path which will be linked to @oldpath.</div><div class='del'>- *</div><div class='del'>- * Returns 0 on success and -1 on error with errno set appropriately.</div><div class='del'>- */</div><div class='del'>-int</div><div class='del'>-glusterfs_glh_link (glusterfs_handle_t handle, const char *oldpath,</div><div class='del'>-                        const char *newpath);</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-/* Create a hard link between two paths.</div><div class='del'>- *</div><div class='del'>- * @oldpath     : The existing path to link to.</div><div class='del'>- * @newpath     : The new path which will be linked to @oldpath.</div><div class='del'>- *</div><div class='del'>- * Both paths should exist on the same glusterfs context and should be</div><div class='del'>- * prefixed with the same VMP.</div><div class='del'>- *</div><div class='del'>- * Returns 0 on success and -1 on error with errno set appropriately.</div><div class='del'>- */</div><div class='del'>-int</div><div class='del'>-glusterfs_link (const char *oldpath, const char *newpath);</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-/* Get stats about the underlying file system.</div><div class='del'>- *</div><div class='del'>- * @handle      : Identifies the glusterfs context in which resides</div><div class='del'>- *              the given path.</div><div class='del'>- * @path        : stats are returned for the file system on which file</div><div class='del'>- *              is located.</div><div class='del'>- * @buf         : The buffer into which the stats are copied.</div><div class='del'>- *</div><div class='del'>- * Returns 0 on success and -1 on error with errno set appropriately.</div><div class='del'>- */</div><div class='del'>-int</div><div class='del'>-glusterfs_glh_statfs (glusterfs_handle_t handle, const char *path,</div><div class='del'>-                        struct statfs *buf);</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-/* Get stats about the underlying file system.</div><div class='del'>- *</div><div class='del'>- * @path        : stats are returned for the file system on which file</div><div class='del'>- *              is located. @path must start with the VMP of the</div><div class='del'>- *              glusterfs context on which the file reside.</div><div class='del'>- * @buf         : The buffer into which the stats are copied.</div><div class='del'>- *</div><div class='del'>- * Returns 0 on success and -1 on error with errno set appropriately.</div><div class='del'>- */</div><div class='del'>-int</div><div class='del'>-glusterfs_statfs (const char *path, struct statfs *buf);</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-/* Get stats about the underlying file system.</div><div class='del'>- *</div><div class='del'>- * @handle      : Identifies the glusterfs context in which resides</div><div class='del'>- *              the given path.</div><div class='del'>- * @path        : stats are returned for the file system on which file</div><div class='del'>- *              is located.</div><div class='del'>- * @buf         : The buffer into which the stats are copied.</div><div class='del'>- *</div><div class='del'>- * Returns 0 on success and -1 on error with errno set appropriately.</div><div class='del'>- */</div><div class='del'>-int</div><div class='del'>-glusterfs_glh_statvfs (glusterfs_handle_t handle, const char *path,</div><div class='del'>-                   struct statvfs *buf);</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-/* Get stats about the underlying file system.</div><div class='del'>- *</div><div class='del'>- * @path        : stats are returned for the file system on which file</div><div class='del'>- *              is located. @path must start with the VMP of the</div><div class='del'>- *              glusterfs context on which the file reside.</div><div class='del'>- * @buf         : The buffer into which the stats are copied.</div><div class='del'>- *</div><div class='del'>- * Returns 0 on success and -1 on error with errno set appropriately.</div><div class='del'>- */</div><div class='del'>-int</div><div class='del'>-glusterfs_statvfs (const char *path, struct statvfs *buf);</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-/* Set the atime and mtime values for a given path.</div><div class='del'>- *</div><div class='del'>- * @handle      : The handle identifying the glusterfs context.</div><div class='del'>- * @path        : The path for which the times need to be changed.</div><div class='del'>- * @times       : The array containing new time stamps for the file.</div><div class='del'>- *</div><div class='del'>- * Returns 0 on success and -1 on error with errno set appropriately.</div><div class='del'>- */</div><div class='del'>-int</div><div class='del'>-glusterfs_glh_utimes (glusterfs_handle_t handle, const char *path,</div><div class='del'>-                        const struct timeval times[2]);</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-/* Set the atime and mtime values for a given path.</div><div class='del'>- *</div><div class='del'>- * @path        : The path for which the times need to be changed.</div><div class='del'>- * @times       : The array containing new time stamps for the file.</div><div class='del'>- *</div><div class='del'>- * Returns 0 on success and -1 on error with errno set appropriately.</div><div class='del'>- */</div><div class='del'>-int</div><div class='del'>-glusterfs_utimes (const char *path, const struct timeval times[2]);</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-/* Set the atime and mtime values for a given path.</div><div class='del'>- *</div><div class='del'>- * @handle      : The handle identifying the glusterfs context.</div><div class='del'>- * @path        : The path for which the times need to be changed.</div><div class='del'>- * @buf         : The structure containing new time stamps for the file.</div><div class='del'>- *</div><div class='del'>- * Returns 0 on success and -1 on error with errno set appropriately.</div><div class='del'>- */</div><div class='del'>-int</div><div class='del'>-glusterfs_glh_utime (glusterfs_handle_t handle, const char *path,</div><div class='del'>-                        const struct utimbuf *buf);</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-/* Set the atime and mtime values for a given path.</div><div class='del'>- *</div><div class='del'>- * @path        : The path for which the times need to be changed.</div><div class='del'>- * @buf         : The structure containing new time stamps for the file.</div><div class='del'>- *</div><div class='del'>- * Returns 0 on success and -1 on error with errno set appropriately.</div><div class='del'>- */</div><div class='del'>-int</div><div class='del'>-glusterfs_utime (const char *path, const struct utimbuf *buf);</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-/*  Create  FIFO at the given path.</div><div class='del'>- *</div><div class='del'>- *  @handle     : The glusterfs context in which to create that FIFO.</div><div class='del'>- *  @path       : The path within the context where the FIFO is to be</div><div class='del'>- *              created.</div><div class='del'>- * @mode        : The mode bits for the newly create FIFO.</div><div class='del'>- *</div><div class='del'>- * Returns 0 on success and -1 on error with errno set appropriately.</div><div class='del'>- */</div><div class='del'>-int</div><div class='del'>-glusterfs_glh_mkfifo (glusterfs_handle_t handle, const char *path,</div><div class='del'>-                        mode_t mode);</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-/*  Create  FIFO at the given path.</div><div class='del'>- *</div><div class='del'>- *  @path       : The path within the context where the FIFO is to be</div><div class='del'>- *              created. @path should begin with the VMP of the</div><div class='del'>- *              glusterfs context in which the FIFO needs to be</div><div class='del'>- *              created.</div><div class='del'>- * @mode        : The mode bits for the newly create FIFO.</div><div class='del'>- *</div><div class='del'>- * Returns 0 on success and -1 on error with errno set appropriately.</div><div class='del'>- */</div><div class='del'>-int</div><div class='del'>-glusterfs_mkfifo (const char *path, mode_t mode);</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-/* Unlink a file.</div><div class='del'>- *</div><div class='del'>- * @handle      : Handle that identifies a glusterfs instance.</div><div class='del'>- * @path        : Path in the glusterfs instance that needs to be</div><div class='del'>- *              unlinked.</div><div class='del'>- *</div><div class='del'>- * Returns 0 on success and -1 on error with errno set appropriately.</div><div class='del'>- */</div><div class='del'>-int</div><div class='del'>-glusterfs_glh_unlink (glusterfs_handle_t handle, const char *path);</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-/* Unlink a file.</div><div class='del'>- *</div><div class='del'>- * @path        : Path in the glusterfs instance that needs to be</div><div class='del'>- *              unlinked.</div><div class='del'>- *</div><div class='del'>- * Returns 0 on success and -1 on error with errno set appropriately.</div><div class='del'>- */</div><div class='del'>-int</div><div class='del'>-glusterfs_unlink (const char *path);</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-/* Create a symbolic link.</div><div class='del'>- *</div><div class='del'>- * @handle      : The handle identifying the glusterfs context.</div><div class='del'>- * @oldpath     : The existing path to which a symlink needs to be</div><div class='del'>- *              created.</div><div class='del'>- * @newpath     : The new path which will be symlinked to the</div><div class='del'>- *              @oldpath.</div><div class='del'>- *</div><div class='del'>- * Returns 0 on success and -1 on error with errno set appropriately.</div><div class='del'>- */</div><div class='del'>-int</div><div class='del'>-glusterfs_glh_symlink (glusterfs_handle_t handle, const char *oldpath,</div><div class='del'>-                                const char *newpath);</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-/* Create a symbolic link.</div><div class='del'>- *</div><div class='del'>- * @oldpath     : The existing path to which a symlink needs to be</div><div class='del'>- *              created.</div><div class='del'>- * @newpath     : The new path which will be symlinked to the</div><div class='del'>- *              @oldpath.</div><div class='del'>- *</div><div class='del'>- * Returns 0 on success and -1 on error with errno set appropriately.</div><div class='del'>- */</div><div class='del'>-int</div><div class='del'>-glusterfs_symlink (const char *oldpath, const char *newpath);</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-/* Read a symbolic link.</div><div class='del'>- *</div><div class='del'>- * @handle      : Handle identifying the glusterfs context.</div><div class='del'>- * @path        : The symlink that needs to be read.</div><div class='del'>- * @buf         : The buffer into which the target of @path will be</div><div class='del'>- *              stored.</div><div class='del'>- * @bufsize     : Size of the buffer allocated to @buf.</div><div class='del'>- *</div><div class='del'>- * Returns number of bytes copied into @buf and -1 on error with errno</div><div class='del'>- * set appropriately.</div><div class='del'>- */</div><div class='del'>-ssize_t</div><div class='del'>-glusterfs_glh_readlink (glusterfs_handle_t handle, const char *path, char *buf,</div><div class='del'>-                                size_t bufsize);</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-/* Read a symbolic link.</div><div class='del'>- *</div><div class='del'>- * @path        : The symlink that needs to be read.</div><div class='del'>- * @buf         : The buffer into which the target of @path will be</div><div class='del'>- *              stored.</div><div class='del'>- * @bufsize     : Size of the buffer allocated to @buf.</div><div class='del'>- *</div><div class='del'>- * Returns number of bytes copied into @buf and -1 on error with errno</div><div class='del'>- * set appropriately.</div><div class='del'>- */</div><div class='del'>-ssize_t</div><div class='del'>-glusterfs_readlink (const char *path, char *buf, size_t bufsize);</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-/* Rename a file or directory.</div><div class='del'>- *</div><div class='del'>- * @handle      : The identifier of a glusterfs context.</div><div class='del'>- * @oldpath     : The path to be renamed.</div><div class='del'>- * @newpath     : The new name for the @oldpath.</div><div class='del'>- *</div><div class='del'>- * Returns 0 on success and -1 on error with errno set appropriately.</div><div class='del'>- */</div><div class='del'>-int</div><div class='del'>-glusterfs_glh_rename (glusterfs_handle_t handle, const char *oldpath,</div><div class='del'>-                      const char *newpath);</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-/* Rename a file or directory.</div><div class='del'>- * @oldpath     : The path to be renamed.</div><div class='del'>- * @newpath     : The new name for the @oldpath.</div><div class='del'>- *</div><div class='del'>- * Returns 0 on success and -1 on error with errno set appropriately.</div><div class='del'>- */</div><div class='del'>-int</div><div class='del'>-glusterfs_rename (const char *oldpath, const char *newpath);</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-/* Remove a file or directory in the given glusterfs context.</div><div class='del'>- *</div><div class='del'>- * @handle      : Handle identifying the glusterfs context.</div><div class='del'>- * @path        : Path of the file or directory to be removed.</div><div class='del'>- *</div><div class='del'>- *</div><div class='del'>- * Returns 0 on success and -1 on error with errno set appropriately.</div><div class='del'>- */</div><div class='del'>-int</div><div class='del'>-glusterfs_glh_remove (glusterfs_handle_t handle, const char *path);</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-/* Remove a file or directory.</div><div class='del'>- *</div><div class='del'>- * @path        : Path of the file or directory to be removed. The</div><div class='del'>- *              path must be pre-fixed with the VMP.</div><div class='del'>- *</div><div class='del'>- * Returns 0 on success and -1 on error with errno set appropriately.</div><div class='del'>- */</div><div class='del'>-int</div><div class='del'>-glusterfs_remove (const char *path);</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-/* Change the owner of the given path.</div><div class='del'>- *</div><div class='del'>- * If @path is a symlink, the ownership change happens on the symlink.</div><div class='del'>- *</div><div class='del'>- * @handle      : Handle identifying the glusterfs client context.</div><div class='del'>- * @path        : Path whose owner needs to be changed.</div><div class='del'>- * @owner       : New owner ID</div><div class='del'>- * @group       : New Group ID</div><div class='del'>- *</div><div class='del'>- * Returns 0 on success and -1 on error with errno set appropriately.</div><div class='del'>- */</div><div class='del'>-int</div><div class='del'>-glusterfs_glh_lchown (glusterfs_handle_t handle, const char *path, uid_t owner,</div><div class='del'>-                      gid_t group);</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-/* Change the owner of the given path.</div><div class='del'>- *</div><div class='del'>- * If @path is a symlink, the ownership change happens on the symlink.</div><div class='del'>- *</div><div class='del'>- * @path        : Path whose owner needs to be changed.</div><div class='del'>- * @owner       : New owner ID</div><div class='del'>- * @group       : New Group ID</div><div class='del'>- *</div><div class='del'>- * Returns 0 on success and -1 on error with errno set appropriately.</div><div class='del'>- */</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-glusterfs_lchown (const char *path, uid_t owner, gid_t group);</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-/* Rewind directory stream pointer to beginning of the directory.</div><div class='del'>- *</div><div class='del'>- * @dirfd       : Directory handle returned by glusterfs_open on</div><div class='del'>- *              glusterfs_opendir.</div><div class='del'>- *</div><div class='del'>- * Returns no value.</div><div class='del'>- */</div><div class='del'>-void</div><div class='del'>-glusterfs_rewinddir (glusterfs_dir_t dirfd);</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-/* Seek to the given offset in the directory handle.</div><div class='del'>- *</div><div class='del'>- * @dirfd       : Directory handle returned by glusterfs_open on</div><div class='del'>- *              glusterfs_opendir.</div><div class='del'>- * @offset      : The offset to seek to.</div><div class='del'>- *</div><div class='del'>- * Returns no value.</div><div class='del'>- */</div><div class='del'>-void</div><div class='del'>-glusterfs_seekdir (glusterfs_dir_t dirfd, off_t offset);</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-/* Return the current offset in a directory stream.</div><div class='del'>- *</div><div class='del'>- * @dirfd       : Directory handle returned by glusterfs_open on</div><div class='del'>- *              glusterfs_opendir.</div><div class='del'>- *</div><div class='del'>- * Returns the offset in the directory or -1 on error with errno set</div><div class='del'>- * appropriately.</div><div class='del'>- */</div><div class='del'>-off_t</div><div class='del'>-glusterfs_telldir (glusterfs_dir_t dirfd);</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-/* Write count bytes from in_fd to out_fd, starting at *offset.</div><div class='del'>- * glusterfs_sendfile aims at eliminating memory copy at the end of</div><div class='del'>- * each read from in_fd, copying the file directly to out_fd from the buffer </div><div class='del'>- * provided by glusterfs.</div><div class='del'>- *</div><div class='del'>- * @out_fd: file descriptor opened for writing</div><div class='del'>- *</div><div class='del'>- * @in_fd: glusterfs file handle to the file to be read from.</div><div class='del'>- *</div><div class='del'>- * @offset: If offset is not NULL, then it points to a variable holding the file</div><div class='del'>- *          offset  from  which  glusterfs_sendfile()  will  start reading data</div><div class='del'>- *          from in_fd.  When glusterfs_sendfile() returns, this variable will </div><div class='del'>- *          be set to the offset of the byte following the last byte that was </div><div class='del'>- *          read.  If offset is  not  NULL, then glusterfs_sendfile()  does  not</div><div class='del'>- *          modify the current file offset of in_fd; otherwise the current file</div><div class='del'>- *          offset is adjusted to reflect the number of bytes read from in_fd.</div><div class='del'>- *</div><div class='del'>- * @count:  number of bytes to copy between the file descriptors.</div><div class='del'>- */</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-glusterfs_sendfile (int out_fd, glusterfs_file_t in_fd, off_t *offset,</div><div class='del'>-                    size_t count);</div><div class='del'>-</div><div class='del'>-/* manipulate file descriptor</div><div class='del'>- * This api can have 3 forms similar to fcntl(2).</div><div class='del'>- *</div><div class='del'>- * int</div><div class='del'>- * glusterfs_fcntl (glusterfs_file_t fd, int cmd)</div><div class='del'>- *</div><div class='del'>- * int</div><div class='del'>- * glusterfs_fcntl (glusterfs_file_t fd, int cmd, long arg)</div><div class='del'>- *</div><div class='del'>- * int</div><div class='del'>- * glusterfs_fcntl (glusterfs_file_t fd, int cmd, struct flock *lock)</div><div class='del'>- *</div><div class='del'>- * @fd   : file handle returned by glusterfs_open or glusterfs_create.</div><div class='del'>- * @cmd  : Though the aim is to implement all possible commands supported by</div><div class='del'>- *         fcntl(2), currently following commands are supported.</div><div class='del'>- *         F_SETLK, F_SETLKW, F_GETLK -  used to acquire, release, and test for</div><div class='del'>- *                                       the existence of record locks (also </div><div class='del'>- *                                       known as file-segment or file-region</div><div class='del'>- *                                       locks). More detailed explanation is</div><div class='del'>- *                                       found in 'man 2 fcntl'</div><div class='del'>- */</div><div class='del'>-   </div><div class='del'>-int</div><div class='del'>-glusterfs_fcntl (glusterfs_file_t fd, int cmd, ...);</div><div class='del'>-</div><div class='del'>-/*</div><div class='del'>- * Change the current working directory to @path</div><div class='del'>- * </div><div class='del'>- * @path  : path to change the current working directory to.</div><div class='del'>- *</div><div class='del'>- * Returns 0 on success and -1 on failure with errno set appropriately.</div><div class='del'>- */</div><div class='del'>-int</div><div class='del'>-glusterfs_chdir (const char *path);</div><div class='del'>-</div><div class='del'>-/*</div><div class='del'>- * Change the current working directory to the path @fd is opened on.</div><div class='del'>- *</div><div class='del'>- * @fd   : current working directory will be changed to path @fd is opened on.</div><div class='del'>- *</div><div class='del'>- * Returns 0 on success and -1 on  with errno set appropriately.</div><div class='del'>- */</div><div class='del'>-int</div><div class='del'>-glusterfs_fchdir (glusterfs_file_t fd);</div><div class='del'>-</div><div class='del'>-/* copies the current working directory into @buf if it is big enough</div><div class='del'>- *</div><div class='del'>- * @buf: buffer to copy into it. If @buf is NULL, a buffer will be allocated.</div><div class='del'>- *       The size of the buffer will be @size if it is not zero, otherwise the</div><div class='del'>- *       size will be big enough to hold the current working directory.</div><div class='del'>- * @size: size of the buffer.</div><div class='del'>- *</div><div class='del'>- * Returns the pointer to buffer holding current working directory on success</div><div class='del'>- * and NULL on failure.</div><div class='del'>- */</div><div class='del'>-</div><div class='del'>-char *</div><div class='del'>-glusterfs_getcwd (char *buf, size_t size);</div><div class='del'>-</div><div class='del'>-/*</div><div class='del'>- * Truncate the file to a specified length.</div><div class='del'>- *</div><div class='del'>- * @path   : path to the file.</div><div class='del'>- * @length : length to which the file has to be truncated.</div><div class='del'>- *</div><div class='del'>- * Returns 0 on success and -1 on failure with errno set appropriately </div><div class='del'>- */</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-glusterfs_truncate (const char *path, off_t length);</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-/* FIXME: review the need for these apis */</div><div class='del'>-/* added for log related initialization in booster fork implementation */</div><div class='del'>-void</div><div class='del'>-glusterfs_reset (void);</div><div class='del'>-</div><div class='del'>-void</div><div class='del'>-glusterfs_log_lock (void);</div><div class='del'>-</div><div class='del'>-void</div><div class='del'>-glusterfs_log_unlock (void);</div><div class='del'>-/* Used to free the glusterfs_read_buf passed to the application from</div><div class='del'>-   glusterfs_read_async_cbk</div><div class='del'>-*/</div><div class='del'>-void</div><div class='del'>-glusterfs_free (glusterfs_iobuf_t *buf);</div><div class='del'>-</div><div class='del'>-__END_DECLS</div><div class='del'>-</div><div class='del'>-#endif /* !_LIBGLUSTERFSCLIENT_H */</div><div class='head'>diff --git a/mod_glusterfs/Makefile.am b/mod_glusterfs/Makefile.am<br/>deleted file mode 100644<br/>index 0abe8dcfcbb..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/mod_glusterfs/Makefile.am?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>mod_glusterfs/Makefile.am</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,3 +0,0 @@</div><div class='del'>-SUBDIRS = apache lighttpd</div><div class='del'>-</div><div class='del'>-CLEANFILES = </div><div class='head'>diff --git a/mod_glusterfs/apache/1.3/src/Makefile.am b/mod_glusterfs/apache/1.3/src/Makefile.am<br/>deleted file mode 100644<br/>index 6bb3075f564..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/mod_glusterfs/apache/1.3/src/Makefile.am?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>mod_glusterfs/apache/1.3/src/Makefile.am</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,30 +0,0 @@</div><div class='del'>-mod_glusterfs_PROGRAMS = mod_glusterfs.so</div><div class='del'>-mod_glusterfsdir = $(libdir)/glusterfs/$(PACKAGE_VERSION)/apache/1.3</div><div class='del'>-</div><div class='del'>-mod_glusterfs_so_SOURCES = mod_glusterfs.c</div><div class='del'>-</div><div class='del'>-all: mod_glusterfs.so</div><div class='del'>-</div><div class='del'>-mod_glusterfs.so: $(top_srcdir)/mod_glusterfs/apache/1.3/src/mod_glusterfs.c $(top_builddir)/libglusterfsclient/src/libglusterfsclient.la</div><div class='del'>-	ln -sf $(top_srcdir)/mod_glusterfs/apache/1.3/src/mod_glusterfs.c $(top_builddir)/mod_glusterfs/apache/1.3/src/mod_glusterfs-build.c</div><div class='del'>-	$(APXS) -c -Wc,-g3 -Wc,-O0 -D_FILE_OFFSET_BITS=64 -D__USE_FILE_OFFSET64 -D_GNU_SOURCE -I$(top_srcdir)/libglusterfsclient/src -Wl,-rpath,$(libdir) -Wl,-rpath,$(top_builddir)/libglusterfsclient/src/.libs/ $(top_builddir)/libglusterfsclient/src/.libs/libglusterfsclient.so mod_glusterfs-build.c -o $(top_builddir)/mod_glusterfs/apache/1.3/src/mod_glusterfs.so</div><div class='del'>-</div><div class='del'>-$(top_builddir)/libglusterfsclient/src/libglusterfsclient.la:</div><div class='del'>-	$(MAKE) -C $(top_builddir)/libglusterfsclient/src/ all</div><div class='del'>-</div><div class='del'>-install-data-local:</div><div class='del'>-	@echo ""</div><div class='del'>-	@echo ""</div><div class='del'>-	@echo "**********************************************************************************"</div><div class='del'>-	@echo "* TO INSTALL MODGLUSTERFS, PLEASE USE,                                            "</div><div class='del'>-	@echo "* $(APXS) -n glusterfs -ia $(mod_glusterfsdir)/mod_glusterfs.so                   "</div><div class='del'>-	@echo "**********************************************************************************"</div><div class='del'>-	@echo ""</div><div class='del'>-	@echo ""</div><div class='del'>-</div><div class='del'>-#install:</div><div class='del'>-#	cp -fv mod_glusterfs.so $(HTTPD_LIBEXECDIR)</div><div class='del'>-#	cp -fv httpd.conf $(HTTPD_CONF_DIR)</div><div class='del'>-</div><div class='del'>-clean:</div><div class='del'>-	-rm -fv *.so *.o mod_glusterfs-build.c</div><div class='head'>diff --git a/mod_glusterfs/apache/1.3/src/README.txt b/mod_glusterfs/apache/1.3/src/README.txt<br/>deleted file mode 100644<br/>index 378a51d79ae..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/mod_glusterfs/apache/1.3/src/README.txt?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>mod_glusterfs/apache/1.3/src/README.txt</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,107 +0,0 @@</div><div class='del'>-What is mod_glusterfs?</div><div class='del'>-======================</div><div class='del'>-* mod_glusterfs is a module for apache written for efficient serving of files from glusterfs. </div><div class='del'>-  mod_glusterfs interfaces with glusterfs using apis provided by libglusterfsclient.</div><div class='del'>-</div><div class='del'>-* this README speaks about installation of apache-1.3.x, where x is any minor version.</div><div class='del'>-</div><div class='del'>-Prerequisites for mod_glusterfs</div><div class='del'>-===============================</div><div class='del'>-Though mod_glusterfs has been written as a module, with an intent of making no changes to the way apache has </div><div class='del'>-been built, currently following points have to be taken care of:</div><div class='del'>-</div><div class='del'>-* module "so" has to be enabled, for apache to support modules.</div><div class='del'>-* since glusterfs is compiled with _FILE_OFFSET_BITS=64 and __USE_FILE_OFFSET64 flags, mod_glusterfs and apache </div><div class='del'>-  in turn have to be compiled with the above two flags.</div><div class='del'>- </div><div class='del'>- $ tar xzvf apache-1.3.9.tar.gz</div><div class='del'>- $ cd apache-1.3.9/</div><div class='del'>- $ # add -D_FILE_OFFSET_BITS=64 -D__USE_FILE_OFFSET64 to EXTRA_CFLAGS in src/Configuration.</div><div class='del'>- $ ./configure --prefix=/usr --enable-module=so </div><div class='del'>- $ cd src</div><div class='del'>- $ ./Configure </div><div class='del'>- $ cd ../</div><div class='del'>- $ make install  </div><div class='del'>- $ httpd -l | grep -i mod_so </div><div class='del'>-   mod_so.c</div><div class='del'>-</div><div class='del'>-* if multiple apache installations are present, make sure to pass --with-apxs=/path/to/apxs/of/proper/version to configure script while building glusterfs.</div><div class='del'>-</div><div class='del'>-Build/Install mod_glusterfs</div><div class='del'>-===========================</div><div class='del'>-* mod_glusterfs is provided with glusterfs--mainline--3.0 and all releases from the same branch.</div><div class='del'>-</div><div class='del'>-* building glusterfs also builds mod_glusterfs. But 'make install' of glusterfs installs mod_glusterfs.so to </div><div class='del'>-  glusterfs install directory instead of the apache modules directory.</div><div class='del'>-</div><div class='del'>-* 'make install' of glusterfs will print a message similar to the one given below, which is self explanatory. </div><div class='del'>-  Make sure to use apxs of proper apache version in case of multiple apache installations. This will copy </div><div class='del'>-  mod_glusterfs.so to modules directory of proper apache version and modify the appropriate httpd.conf to enable</div><div class='del'>-  mod_glusterfs. </div><div class='del'>-</div><div class='del'>-**********************************************************************************************</div><div class='del'>-* TO INSTALL MODGLUSTERFS, PLEASE USE,                                            </div><div class='del'>-* apxs -n mod_glusterfs -ia /usr/lib/glusterfs/1.4.0pre2/apache-1.3/mod_glusterfs.so               </div><div class='del'>-**********************************************************************************************</div><div class='del'>-</div><div class='del'>-Configuration</div><div class='del'>-=============</div><div class='del'>-* Following configuration has to be added to httpd.conf.</div><div class='del'>-</div><div class='del'>- &lt;Location "/glusterfs"&gt;</div><div class='del'>- 	   GlusterfsLogfile "/var/log/glusterfs/glusterfs.log"</div><div class='del'>-	   GlusterfsLoglevel "warning"</div><div class='del'>- 	   GlusterfsVolumeSpecfile "/etc/glusterfs/glusterfs-client.spec"</div><div class='del'>-	   GlusterfsCacheTimeout "600"</div><div class='del'>-	   GlusterfsXattrFileSize "65536"</div><div class='del'>- 	   SetHandler "glusterfs-handler"</div><div class='del'>- &lt;/Location&gt;</div><div class='del'>-</div><div class='del'>-* GlusterfsVolumeSpecfile (COMPULSORY)</div><div class='del'>-  Path to the the glusterfs volume specification file.</div><div class='del'>-</div><div class='del'>-* GlusterfsLogfile (COMPULSORY)</div><div class='del'>-  Path to the glusterfs logfile.</div><div class='del'>-</div><div class='del'>-* GlusterfsLoglevel (OPTIONAL, default = warning)</div><div class='del'>-  Severity of messages that are to be logged. Allowed values are critical, error, warning, debug, none </div><div class='del'>-  in the decreasing order of severity.</div><div class='del'>-</div><div class='del'>-* GlusterfsCacheTimeOut (OPTIONAL, default = 0)</div><div class='del'>-  Timeout values for glusterfs stat and lookup cache.</div><div class='del'>-</div><div class='del'>-* GlusterfsXattrFileSize (OPTIONAL, default = 0)</div><div class='del'>-  Files with sizes upto and including this value are fetched through the extended attribute interface of </div><div class='del'>-  glusterfs rather than the usual open-read-close set of operations. For files of small sizes, it is recommended </div><div class='del'>-  to use extended attribute interface.</div><div class='del'>-</div><div class='del'>-* With the above configuration all the requests to httpd of the form www.example.org/glusterfs/path/to/file are </div><div class='del'>-  served from glusterfs.</div><div class='del'>-</div><div class='del'>-Miscellaneous points</div><div class='del'>-====================</div><div class='del'>-* httpd by default runs with username "nobody" and group "nogroup". Permissions of logfile and specfile have to </div><div class='del'>-  be set suitably.</div><div class='del'>-</div><div class='del'>-* Since mod_glusterfs runs with permissions of nobody.nogroup, glusterfs has to use only login based </div><div class='del'>-  authentication. See docs/authentication.txt for more details. </div><div class='del'>-</div><div class='del'>-* To copy the data served by httpd into glusterfs mountpoint, glusterfs can be started with the </div><div class='del'>-  volume-specification file provided to mod_glusterfs. Any tool like cp can then be used.</div><div class='del'>-</div><div class='del'>-* To run in gdb, apache has to be compiled with -lpthread, since libglusterfsclient is multithreaded. </div><div class='del'>-  If not on Linux gdb runs into errors like: </div><div class='del'>-  "Error while reading shared library symbols:</div><div class='del'>-   Cannot find new threads: generic error"</div><div class='del'>-</div><div class='del'>-* when used with ib-verbs transport, ib_verbs initialization fails.</div><div class='del'>-  reason for this is that apache runs as non-privileged user and the amount of memory that can be </div><div class='del'>-  locked by default is not sufficient for ib-verbs. to fix this, as root run,</div><div class='del'>-  </div><div class='del'>-  # ulimit -l unlimited</div><div class='del'>-</div><div class='del'>-  and then start apache.</div><div class='del'>- </div><div class='del'>-TODO</div><div class='del'>-====</div><div class='del'>-* directory listing for the directories accessed through mod_glusterfs.</div><div class='head'>diff --git a/mod_glusterfs/apache/1.3/src/mod_glusterfs.c b/mod_glusterfs/apache/1.3/src/mod_glusterfs.c<br/>deleted file mode 100644<br/>index 78ca7f42344..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/mod_glusterfs/apache/1.3/src/mod_glusterfs.c?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>mod_glusterfs/apache/1.3/src/mod_glusterfs.c</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,507 +0,0 @@</div><div class='del'>-/*</div><div class='del'>-  Copyright (c) 2008-2009 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='del'>-  This file is part of GlusterFS.</div><div class='del'>-</div><div class='del'>-  GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-  it under the terms of the GNU General Public License as published</div><div class='del'>-  by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-  or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-  GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-  WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-  General Public License for more details.</div><div class='del'>-</div><div class='del'>-  You should have received a copy of the GNU General Public License</div><div class='del'>-  along with this program.  If not, see</div><div class='del'>-  &lt;http://www.gnu.org/licenses/&gt;.</div><div class='del'>-*/</div><div class='del'>-</div><div class='del'>-#ifndef CORE_PRIVATE</div><div class='del'>-#define CORE_PRIVATE</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-#include &lt;httpd.h&gt;</div><div class='del'>-#include &lt;http_config.h&gt;</div><div class='del'>-#include &lt;http_core.h&gt;</div><div class='del'>-#include &lt;http_request.h&gt;</div><div class='del'>-#include &lt;http_protocol.h&gt;</div><div class='del'>-#include &lt;http_log.h&gt;</div><div class='del'>-#include &lt;http_main.h&gt;</div><div class='del'>-#include &lt;util_script.h&gt;</div><div class='del'>-#include &lt;libglusterfsclient.h&gt;</div><div class='del'>-#include &lt;sys/uio.h&gt;</div><div class='del'>-#include &lt;pthread.h&gt;</div><div class='del'>-</div><div class='del'>-#define GLUSTERFS_INVALID_LOGLEVEL "mod_glusterfs: Unrecognized log-level "\</div><div class='del'>-                                   "\"%s\", possible values are \"DEBUG|"\</div><div class='del'>-                                   "WARNING|ERROR|CRITICAL|NONE\"\n"</div><div class='del'>-</div><div class='del'>-#define GLUSTERFS_HANDLER "glusterfs-handler"</div><div class='del'>-#define GLUSTERFS_CHUNK_SIZE 131072 </div><div class='del'>-</div><div class='del'>-module MODULE_VAR_EXPORT glusterfs_module;</div><div class='del'>-</div><div class='del'>-/*TODO: verify error returns to server core */</div><div class='del'>-</div><div class='del'>-typedef struct glusterfs_dir_config {</div><div class='del'>-        char *logfile;</div><div class='del'>-        char *loglevel;</div><div class='del'>-        char *specfile;</div><div class='del'>-        char *mount_dir;</div><div class='del'>-        char *buf;</div><div class='del'>-        size_t xattr_file_size;</div><div class='del'>-        uint32_t cache_timeout;</div><div class='del'>-} glusterfs_dir_config_t;</div><div class='del'>-</div><div class='del'>-typedef struct glusterfs_async_local {</div><div class='del'>-        int op_ret;</div><div class='del'>-        int op_errno;</div><div class='del'>-        char async_read_complete;</div><div class='del'>-        off_t length;</div><div class='del'>-        off_t read_bytes;</div><div class='del'>-        glusterfs_iobuf_t *buf;</div><div class='del'>-        request_rec *request;</div><div class='del'>-        pthread_mutex_t lock;</div><div class='del'>-        pthread_cond_t cond;</div><div class='del'>-}glusterfs_async_local_t;</div><div class='del'>-</div><div class='del'>-#define GLUSTERFS_CMD_PERMS ACCESS_CONF</div><div class='del'>-</div><div class='del'>-static glusterfs_dir_config_t *</div><div class='del'>-mod_glusterfs_dconfig(request_rec *r)</div><div class='del'>-{</div><div class='del'>-        glusterfs_dir_config_t *dir_config = NULL;</div><div class='del'>-        if (r-&gt;per_dir_config != NULL) {</div><div class='del'>-                dir_config = ap_get_module_config (r-&gt;per_dir_config,</div><div class='del'>-                                                   &amp;glusterfs_module);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        return dir_config;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-static </div><div class='del'>-const char *add_xattr_file_size(cmd_parms *cmd, void *dummy, char *arg)</div><div class='del'>-{</div><div class='del'>-        glusterfs_dir_config_t *dir_config = dummy;</div><div class='del'>-        dir_config-&gt;xattr_file_size = atoi (arg);</div><div class='del'>-        return NULL;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-static</div><div class='del'>-const char *set_cache_timeout(cmd_parms *cmd, void *dummy, char *arg)</div><div class='del'>-{</div><div class='del'>-        glusterfs_dir_config_t *dir_config = dummy;</div><div class='del'>-        dir_config-&gt;cache_timeout = atoi (arg);</div><div class='del'>-        return NULL;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-static</div><div class='del'>-const char *set_loglevel(cmd_parms *cmd, void *dummy, char *arg)</div><div class='del'>-{</div><div class='del'>-        glusterfs_dir_config_t *dir_config = dummy;</div><div class='del'>-        char *error = NULL;</div><div class='del'>-        if (strncasecmp (arg, "DEBUG", strlen ("DEBUG")) </div><div class='del'>-            &amp;&amp; strncasecmp (arg, "WARNING", strlen ("WARNING")) </div><div class='del'>-            &amp;&amp; strncasecmp (arg, "CRITICAL", strlen ("CRITICAL")) </div><div class='del'>-            &amp;&amp; strncasecmp (arg, "NONE", strlen ("NONE")) </div><div class='del'>-            &amp;&amp; strncasecmp (arg, "ERROR", strlen ("ERROR")))</div><div class='del'>-                error = GLUSTERFS_INVALID_LOGLEVEL;</div><div class='del'>-        else</div><div class='del'>-                dir_config-&gt;loglevel = arg;</div><div class='del'>-</div><div class='del'>-        return error;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-static </div><div class='del'>-const char *add_logfile(cmd_parms *cmd, void *dummy, char *arg)</div><div class='del'>-{</div><div class='del'>-        glusterfs_dir_config_t *dir_config = dummy;</div><div class='del'>-        dir_config-&gt;logfile = arg;</div><div class='del'>-</div><div class='del'>-        return NULL;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-static </div><div class='del'>-const char *add_specfile(cmd_parms *cmd, void *dummy, char *arg)</div><div class='del'>-{</div><div class='del'>-        glusterfs_dir_config_t *dir_config = dummy;</div><div class='del'>-</div><div class='del'>-        dir_config-&gt;specfile = arg;</div><div class='del'>-</div><div class='del'>-        return NULL;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-static void *</div><div class='del'>-mod_glusterfs_create_dir_config(pool *p, char *dirspec)</div><div class='del'>-{</div><div class='del'>-        glusterfs_dir_config_t *dir_config = NULL;</div><div class='del'>-</div><div class='del'>-        dir_config = (glusterfs_dir_config_t *) ap_pcalloc(p,</div><div class='del'>-                                                           sizeof(*dir_config));</div><div class='del'>-</div><div class='del'>-        dir_config-&gt;mount_dir = dirspec;</div><div class='del'>-        dir_config-&gt;logfile = dir_config-&gt;specfile = (char *)0;</div><div class='del'>-        dir_config-&gt;loglevel = "warning";</div><div class='del'>-        dir_config-&gt;cache_timeout = 0;</div><div class='del'>-        dir_config-&gt;buf = NULL;</div><div class='del'>-</div><div class='del'>-        return (void *) dir_config;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-static void </div><div class='del'>-mod_glusterfs_child_init(server_rec *s, pool *p)</div><div class='del'>-{</div><div class='del'>-        void **urls = NULL;</div><div class='del'>-        int n, i;</div><div class='del'>-        core_server_config *mod_core_config = ap_get_module_config (s-&gt;module_config,</div><div class='del'>-                                                                    &amp;core_module);</div><div class='del'>-        glusterfs_dir_config_t *dir_config = NULL;</div><div class='del'>-        glusterfs_init_params_t params = {0, };</div><div class='del'>-  </div><div class='del'>-        n = mod_core_config-&gt;sec_url-&gt;nelts;</div><div class='del'>-        urls = (void **)mod_core_config-&gt;sec_url-&gt;elts;</div><div class='del'>-        for (i = 0; i &lt; n; i++) {</div><div class='del'>-                dir_config = ap_get_module_config (urls[i], &amp;glusterfs_module);</div><div class='del'>-</div><div class='del'>-                if (dir_config) {</div><div class='del'>-                        memset (&amp;params, 0, sizeof (params));</div><div class='del'>-</div><div class='del'>-                        params.logfile = dir_config-&gt;logfile;</div><div class='del'>-                        params.loglevel = dir_config-&gt;loglevel;</div><div class='del'>-                        params.lookup_timeout = dir_config-&gt;cache_timeout;</div><div class='del'>-                        params.stat_timeout = dir_config-&gt;cache_timeout;</div><div class='del'>-                        params.specfile = dir_config-&gt;specfile;</div><div class='del'>-</div><div class='del'>-                        glusterfs_mount (dir_config-&gt;mount_dir, &amp;params);</div><div class='del'>-                }</div><div class='del'>-                dir_config = NULL;</div><div class='del'>-        }</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-static void </div><div class='del'>-mod_glusterfs_child_exit(server_rec *s, pool *p)</div><div class='del'>-{</div><div class='del'>-        void **urls = NULL;</div><div class='del'>-        int n, i;</div><div class='del'>-        core_server_config *mod_core_config = NULL;</div><div class='del'>-        glusterfs_dir_config_t *dir_config = NULL;</div><div class='del'>-  </div><div class='del'>-        mod_core_config = ap_get_module_config (s-&gt;module_config, &amp;core_module);</div><div class='del'>-        n = mod_core_config-&gt;sec_url-&gt;nelts;</div><div class='del'>-        urls = (void **)mod_core_config-&gt;sec_url-&gt;elts;</div><div class='del'>-        for (i = 0; i &lt; n; i++) {</div><div class='del'>-                dir_config = ap_get_module_config (urls[i], &amp;glusterfs_module);</div><div class='del'>-                if (dir_config) {</div><div class='del'>-                        glusterfs_umount (dir_config-&gt;mount_dir);</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-static int mod_glusterfs_fixup(request_rec *r)</div><div class='del'>-{</div><div class='del'>-        glusterfs_dir_config_t *dir_config = NULL;</div><div class='del'>-        int access_status;</div><div class='del'>-        int ret;</div><div class='del'>-        char *path = NULL;</div><div class='del'>-</div><div class='del'>-        dir_config = mod_glusterfs_dconfig(r);</div><div class='del'>-</div><div class='del'>-        if (dir_config &amp;&amp; dir_config-&gt;mount_dir</div><div class='del'>-            &amp;&amp; !(strncmp (ap_pstrcat (r-&gt;pool, dir_config-&gt;mount_dir, "/",</div><div class='del'>-                                      NULL),</div><div class='del'>-                          r-&gt;uri, strlen (dir_config-&gt;mount_dir) + 1)</div><div class='del'>-                 &amp;&amp; !r-&gt;handler)) </div><div class='del'>-                r-&gt;handler = ap_pstrdup (r-&gt;pool, GLUSTERFS_HANDLER);</div><div class='del'>-</div><div class='del'>-        if (!r-&gt;handler || (r-&gt;handler &amp;&amp; strcmp (r-&gt;handler,</div><div class='del'>-                                                  GLUSTERFS_HANDLER)))</div><div class='del'>-                return DECLINED;</div><div class='del'>-</div><div class='del'>-        path = r-&gt;uri;</div><div class='del'>-</div><div class='del'>-        memset (&amp;r-&gt;finfo, 0, sizeof (r-&gt;finfo));</div><div class='del'>-</div><div class='del'>-        dir_config-&gt;buf = calloc (1, dir_config-&gt;xattr_file_size);</div><div class='del'>-        if (!dir_config-&gt;buf) {</div><div class='del'>-                return HTTP_INTERNAL_SERVER_ERROR;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        ret = glusterfs_get (path, dir_config-&gt;buf, </div><div class='del'>-                             dir_config-&gt;xattr_file_size, &amp;r-&gt;finfo);</div><div class='del'>-</div><div class='del'>-        if (ret == -1 || r-&gt;finfo.st_size &gt; dir_config-&gt;xattr_file_size</div><div class='del'>-            || S_ISDIR (r-&gt;finfo.st_mode)) {</div><div class='del'>-                free (dir_config-&gt;buf);</div><div class='del'>-                dir_config-&gt;buf = NULL;</div><div class='del'>-</div><div class='del'>-                if (ret == -1) {</div><div class='del'>-                        int error = HTTP_NOT_FOUND;</div><div class='del'>-                        char *emsg = NULL;</div><div class='del'>-                        if (r-&gt;path_info == NULL) {</div><div class='del'>-                                emsg = ap_pstrcat(r-&gt;pool, strerror (errno),</div><div class='del'>-                                                  r-&gt;filename, NULL);</div><div class='del'>-                        }</div><div class='del'>-                        else {</div><div class='del'>-                                emsg = ap_pstrcat(r-&gt;pool, strerror (errno),</div><div class='del'>-                                                  r-&gt;filename, r-&gt;path_info,</div><div class='del'>-                                                  NULL);</div><div class='del'>-                        }</div><div class='del'>-                        ap_log_rerror(APLOG_MARK, APLOG_ERR|APLOG_NOERRNO, r,</div><div class='del'>-                                      "%s", emsg);</div><div class='del'>-                        if (errno != ENOENT) {</div><div class='del'>-                                error = HTTP_INTERNAL_SERVER_ERROR;</div><div class='del'>-                        }</div><div class='del'>-                        return error;</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='del'>-    </div><div class='del'>-        if (r-&gt;uri &amp;&amp; strlen (r-&gt;uri) &amp;&amp; r-&gt;uri[strlen(r-&gt;uri) - 1] == '/') </div><div class='del'>-                r-&gt;handler = NULL;</div><div class='del'>-</div><div class='del'>-        r-&gt;filename = ap_pstrcat (r-&gt;pool, r-&gt;filename, r-&gt;path_info, NULL);</div><div class='del'>-</div><div class='del'>-        if ((access_status = ap_find_types(r)) != 0) {</div><div class='del'>-                return DECLINED;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        return OK;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int </div><div class='del'>-mod_glusterfs_readv_async_cbk (int32_t op_ret, int32_t op_errno,</div><div class='del'>-                               glusterfs_iobuf_t *buf, void *cbk_data)</div><div class='del'>-{</div><div class='del'>-        glusterfs_async_local_t *local = cbk_data;</div><div class='del'>-</div><div class='del'>-        pthread_mutex_lock (&amp;local-&gt;lock);</div><div class='del'>-        {</div><div class='del'>-                local-&gt;async_read_complete = 1;</div><div class='del'>-                local-&gt;buf = buf;</div><div class='del'>-                local-&gt;op_ret = op_ret;</div><div class='del'>-                local-&gt;op_errno = op_errno;</div><div class='del'>-                pthread_cond_signal (&amp;local-&gt;cond);</div><div class='del'>-        }</div><div class='del'>-        pthread_mutex_unlock (&amp;local-&gt;lock);</div><div class='del'>-</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-/* use read_async just to avoid memcpy of read buffer in libglusterfsclient */</div><div class='del'>-static int</div><div class='del'>-mod_glusterfs_read_async (request_rec *r, glusterfs_file_t fd, off_t offset,</div><div class='del'>-                          off_t length)</div><div class='del'>-{</div><div class='del'>-        glusterfs_async_local_t local;</div><div class='del'>-        off_t end;</div><div class='del'>-        int nbytes;</div><div class='del'>-        int complete;</div><div class='del'>-        pthread_cond_init (&amp;local.cond, NULL);</div><div class='del'>-        pthread_mutex_init (&amp;local.lock, NULL);</div><div class='del'>-  </div><div class='del'>-        memset (&amp;local, 0, sizeof (local));</div><div class='del'>-        local.request = r;</div><div class='del'>-</div><div class='del'>-        if (length &gt; 0)</div><div class='del'>-                end = offset + length;</div><div class='del'>-</div><div class='del'>-        do {</div><div class='del'>-                glusterfs_iobuf_t *buf;</div><div class='del'>-                int i;</div><div class='del'>-                if (length &gt; 0) {</div><div class='del'>-                        nbytes = end - offset;</div><div class='del'>-                        if (nbytes &gt; GLUSTERFS_CHUNK_SIZE)</div><div class='del'>-                                nbytes = GLUSTERFS_CHUNK_SIZE;</div><div class='del'>-                } else</div><div class='del'>-                        nbytes = GLUSTERFS_CHUNK_SIZE;</div><div class='del'>-</div><div class='del'>-                glusterfs_read_async(fd, </div><div class='del'>-                                     nbytes,</div><div class='del'>-                                     offset,</div><div class='del'>-                                     mod_glusterfs_readv_async_cbk,</div><div class='del'>-                                     (void *)&amp;local);</div><div class='del'>-</div><div class='del'>-                pthread_mutex_lock (&amp;local.lock);</div><div class='del'>-                {</div><div class='del'>-                        while (!local.async_read_complete) {</div><div class='del'>-                                pthread_cond_wait (&amp;local.cond, &amp;local.lock);</div><div class='del'>-                        }</div><div class='del'>-</div><div class='del'>-                        local.async_read_complete = 0;</div><div class='del'>-                        buf = local.buf;</div><div class='del'>-</div><div class='del'>-                        if (length &lt; 0)</div><div class='del'>-                                complete = (local.op_ret &lt;= 0);</div><div class='del'>-                        else {</div><div class='del'>-                                local.read_bytes += local.op_ret;</div><div class='del'>-                                complete = ((local.read_bytes == length) </div><div class='del'>-                                            || (local.op_ret &lt; 0));</div><div class='del'>-                        }</div><div class='del'>-                }</div><div class='del'>-                pthread_mutex_unlock (&amp;local.lock);</div><div class='del'>-</div><div class='del'>-                for (i = 0; i &lt; buf-&gt;count; i++) {</div><div class='del'>-                        if (ap_rwrite (buf-&gt;vector[i].iov_base,</div><div class='del'>-                                       buf-&gt;vector[i].iov_len, r) &lt; 0) {</div><div class='del'>-                                local.op_ret = -1;</div><div class='del'>-                                complete = 1;</div><div class='del'>-                                break;</div><div class='del'>-                        }</div><div class='del'>-                }      </div><div class='del'>-</div><div class='del'>-                glusterfs_free (buf);</div><div class='del'>-</div><div class='del'>-                offset += nbytes;</div><div class='del'>-        } while (!complete);</div><div class='del'>-</div><div class='del'>-        return (local.op_ret &lt; 0 ? SERVER_ERROR : OK);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-static int </div><div class='del'>-mod_glusterfs_handler(request_rec *r)</div><div class='del'>-{</div><div class='del'>-        glusterfs_dir_config_t *dir_config;</div><div class='del'>-        char *path = NULL;</div><div class='del'>-        int error = OK;</div><div class='del'>-        int rangestatus = 0;</div><div class='del'>-        int errstatus = OK;</div><div class='del'>-        glusterfs_file_t fd;</div><div class='del'>-  </div><div class='del'>-        if (!r-&gt;handler || (r-&gt;handler &amp;&amp; strcmp (r-&gt;handler,</div><div class='del'>-                                                  GLUSTERFS_HANDLER)))</div><div class='del'>-                return DECLINED;</div><div class='del'>-</div><div class='del'>-        if (r-&gt;uri[0] == '\0' || r-&gt;uri[strlen(r-&gt;uri) - 1] == '/') {</div><div class='del'>-                return DECLINED;</div><div class='del'>-        }</div><div class='del'>-  </div><div class='del'>-        dir_config = mod_glusterfs_dconfig (r);</div><div class='del'>-  </div><div class='del'>-        if (r-&gt;method_number != M_GET) {</div><div class='del'>-                return METHOD_NOT_ALLOWED;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        ap_update_mtime(r, r-&gt;finfo.st_mtime);</div><div class='del'>-        ap_set_last_modified(r);</div><div class='del'>-        ap_set_etag(r);</div><div class='del'>-        ap_table_setn(r-&gt;headers_out, "Accept-Ranges", "bytes");</div><div class='del'>-        if (((errstatus = ap_meets_conditions(r)) != OK)</div><div class='del'>-            || (errstatus = ap_set_content_length(r, r-&gt;finfo.st_size))) {</div><div class='del'>-                return errstatus;</div><div class='del'>-        }</div><div class='del'>-        rangestatus =  ap_set_byterange(r);</div><div class='del'>-        ap_send_http_header(r);</div><div class='del'>-</div><div class='del'>-        if (r-&gt;finfo.st_size &lt;= dir_config-&gt;xattr_file_size &amp;&amp; dir_config-&gt;buf) {</div><div class='del'>-                if (!r-&gt;header_only) {</div><div class='del'>-                        error = OK;</div><div class='del'>-                        ap_log_rerror (APLOG_MARK, APLOG_NOTICE, r, </div><div class='del'>-                                       "fetching data from glusterfs through "</div><div class='del'>-                                       "xattr interface\n");</div><div class='del'>-      </div><div class='del'>-                        if (!rangestatus) {</div><div class='del'>-                                if (ap_rwrite (dir_config-&gt;buf,</div><div class='del'>-                                               r-&gt;finfo.st_size, r) &lt; 0) {</div><div class='del'>-                                        error = HTTP_INTERNAL_SERVER_ERROR;</div><div class='del'>-                                }</div><div class='del'>-                        } else {</div><div class='del'>-                                long offset, length;</div><div class='del'>-                                while (ap_each_byterange (r, &amp;offset, &amp;length)) {</div><div class='del'>-                                        if (ap_rwrite (dir_config-&gt;buf + offset,</div><div class='del'>-                                                       length, r) &lt; 0) {</div><div class='del'>-                                                error = HTTP_INTERNAL_SERVER_ERROR;</div><div class='del'>-                                                break;</div><div class='del'>-                                        }</div><div class='del'>-                                }</div><div class='del'>-                        }</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                free (dir_config-&gt;buf);</div><div class='del'>-                dir_config-&gt;buf = NULL;</div><div class='del'>-</div><div class='del'>-                return error;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        path = r-&gt;uri;</div><div class='del'>-        fd = glusterfs_open (path , O_RDONLY, 0);</div><div class='del'>-  </div><div class='del'>-        if (fd == 0) {</div><div class='del'>-                ap_log_rerror(APLOG_MARK, APLOG_ERR, r,</div><div class='del'>-                              "file permissions deny server access: %s",</div><div class='del'>-                              r-&gt;filename);</div><div class='del'>-                return FORBIDDEN;</div><div class='del'>-        }</div><div class='del'>-  </div><div class='del'>-        if (!r-&gt;header_only) {</div><div class='del'>-                if (!rangestatus) {</div><div class='del'>-                        mod_glusterfs_read_async (r, fd, 0, -1);</div><div class='del'>-                } else {</div><div class='del'>-                        long offset, length;</div><div class='del'>-                        while (ap_each_byterange(r, &amp;offset, &amp;length)) {</div><div class='del'>-                                mod_glusterfs_read_async (r, fd, offset, length);</div><div class='del'>-                        }</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='del'>-  </div><div class='del'>-        glusterfs_close (fd);</div><div class='del'>-        return error;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-static const command_rec mod_glusterfs_cmds[] =</div><div class='del'>-{</div><div class='del'>-        {"GlusterfsLogfile", add_logfile, NULL,</div><div class='del'>-         GLUSTERFS_CMD_PERMS, TAKE1,</div><div class='del'>-         "Glusterfs Logfile"},</div><div class='del'>-        {"GlusterfsLoglevel", set_loglevel, NULL,</div><div class='del'>-         GLUSTERFS_CMD_PERMS, TAKE1,</div><div class='del'>-         "Glusterfs Loglevel:anyone of none, critical, error, warning, debug"},</div><div class='del'>-        {"GlusterfsCacheTimeout", set_cache_timeout, NULL,</div><div class='del'>-         GLUSTERFS_CMD_PERMS, TAKE1,</div><div class='del'>-         "Timeout value in seconds for caching lookups and stats"},</div><div class='del'>-        {"GlusterfsVolumeSpecfile", add_specfile, NULL,</div><div class='del'>-         GLUSTERFS_CMD_PERMS, TAKE1,</div><div class='del'>-         "Glusterfs Specfile required to access contents of this directory"},</div><div class='del'>-        {"GlusterfsXattrFileSize", add_xattr_file_size, NULL, </div><div class='del'>-         GLUSTERFS_CMD_PERMS, TAKE1,</div><div class='del'>-         "Maximum size of the file to be fetched using xattr interface of "</div><div class='del'>-         "glusterfs"},</div><div class='del'>-        {NULL}</div><div class='del'>-};</div><div class='del'>-</div><div class='del'>-static const handler_rec mod_glusterfs_handlers[] =</div><div class='del'>-{</div><div class='del'>-        {GLUSTERFS_HANDLER, mod_glusterfs_handler},</div><div class='del'>-        {NULL}</div><div class='del'>-};</div><div class='del'>-</div><div class='del'>-module glusterfs_module =</div><div class='del'>-{</div><div class='del'>-        STANDARD_MODULE_STUFF,</div><div class='del'>-        NULL, </div><div class='del'>-        mod_glusterfs_create_dir_config,  /* per-directory config creator */</div><div class='del'>-        NULL,</div><div class='del'>-        NULL,       /* server config creator */</div><div class='del'>-        NULL,        /* server config merger */</div><div class='del'>-        mod_glusterfs_cmds,               /* command table */</div><div class='del'>-        mod_glusterfs_handlers,           /* [7] list of handlers */</div><div class='del'>-        NULL,  /* [2] filename-to-URI translation */</div><div class='del'>-        NULL,      /* [5] check/validate user_id */</div><div class='del'>-        NULL,       /* [6] check user_id is valid *here* */</div><div class='del'>-        NULL,     /* [4] check access by host address */</div><div class='del'>-        NULL,       /* [7] MIME type checker/setter */</div><div class='del'>-        mod_glusterfs_fixup,        /* [8] fixups */</div><div class='del'>-        NULL,             /* [10] logger */</div><div class='del'>-#if MODULE_MAGIC_NUMBER &gt;= 19970103</div><div class='del'>-        NULL,      /* [3] header parser */</div><div class='del'>-#endif</div><div class='del'>-#if MODULE_MAGIC_NUMBER &gt;= 19970719</div><div class='del'>-        mod_glusterfs_child_init,         /* process initializer */</div><div class='del'>-#endif</div><div class='del'>-#if MODULE_MAGIC_NUMBER &gt;= 19970728</div><div class='del'>-        mod_glusterfs_child_exit,         /* process exit/cleanup */</div><div class='del'>-#endif</div><div class='del'>-#if MODULE_MAGIC_NUMBER &gt;= 19970902</div><div class='del'>-        NULL   /* [1] post read_request handling */</div><div class='del'>-#endif</div><div class='del'>-};</div><div class='head'>diff --git a/mod_glusterfs/apache/2.2/src/Makefile.am b/mod_glusterfs/apache/2.2/src/Makefile.am<br/>deleted file mode 100644<br/>index 1e8f3a31ea0..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/mod_glusterfs/apache/2.2/src/Makefile.am?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>mod_glusterfs/apache/2.2/src/Makefile.am</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,31 +0,0 @@</div><div class='del'>-mod_glusterfs_PROGRAMS = mod_glusterfs.so</div><div class='del'>-mod_glusterfsdir = $(libdir)/glusterfs/$(PACKAGE_VERSION)/apache/2.2</div><div class='del'>-</div><div class='del'>-mod_glusterfs_so_SOURCES = mod_glusterfs.c</div><div class='del'>-</div><div class='del'>-all: mod_glusterfs.so</div><div class='del'>-</div><div class='del'>-mod_glusterfs.so: $(top_srcdir)/mod_glusterfs/apache/2.2/src/mod_glusterfs.c $(top_builddir)/libglusterfsclient/src/libglusterfsclient.la</div><div class='del'>-	ln -sf $(top_srcdir)/mod_glusterfs/apache/2.2/src/mod_glusterfs.c $(top_builddir)/mod_glusterfs/apache/2.2/src/mod_glusterfs-build.c</div><div class='del'>-	$(APXS) -c -o mod_glusterfs.la -Wc,-g3 -Wc,-O0 -DLINUX=2 -D_REENTRANT -D_GNU_SOURCE -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -D__USE_FILE_OFFSET64 -I$(top_srcdir)/libglusterfsclient/src -L$(top_builddir)/libglusterfsclient/src/.libs/ -lglusterfsclient mod_glusterfs-build.c </div><div class='del'>-	-ln -sf .libs/mod_glusterfs.so mod_glusterfs.so</div><div class='del'>-</div><div class='del'>-$(top_builddir)/libglusterfsclient/src/libglusterfsclient.la:</div><div class='del'>-	$(MAKE) -C $(top_builddir)/libglusterfsclient/src/ all</div><div class='del'>-</div><div class='del'>-install-data-local:</div><div class='del'>-	@echo ""</div><div class='del'>-	@echo ""</div><div class='del'>-	@echo "**********************************************************************************"</div><div class='del'>-	@echo "* TO INSTALL MODGLUSTERFS, PLEASE USE,                                            "</div><div class='del'>-	@echo "* $(APXS) -n glusterfs -ia $(mod_glusterfsdir)/mod_glusterfs.so                "</div><div class='del'>-	@echo "**********************************************************************************"</div><div class='del'>-	@echo ""</div><div class='del'>-	@echo ""</div><div class='del'>-</div><div class='del'>-#install:</div><div class='del'>-#	cp -fv mod_glusterfs.so $(HTTPD_LIBEXECDIR)</div><div class='del'>-#	cp -fv httpd.conf $(HTTPD_CONF_DIR)</div><div class='del'>-</div><div class='del'>-clean:</div><div class='del'>-	rm -fv *.so *.o</div><div class='head'>diff --git a/mod_glusterfs/apache/2.2/src/README.txt b/mod_glusterfs/apache/2.2/src/README.txt<br/>deleted file mode 100644<br/>index 214a2535b5a..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/mod_glusterfs/apache/2.2/src/README.txt?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>mod_glusterfs/apache/2.2/src/README.txt</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,105 +0,0 @@</div><div class='del'>-What is mod_glusterfs?</div><div class='del'>-======================</div><div class='del'>-* mod_glusterfs is a module for apache written for efficient serving of files from glusterfs. </div><div class='del'>-  mod_glusterfs interfaces with glusterfs using apis provided by libglusterfsclient.</div><div class='del'>-</div><div class='del'>-* this README speaks about installing mod_glusterfs for httpd-2.2 and higher.</div><div class='del'>-</div><div class='del'>-Prerequisites for mod_glusterfs</div><div class='del'>-===============================</div><div class='del'>-Though mod_glusterfs has been written as a module, with an intent of making no changes to </div><div class='del'>-the way apache has been built, currently following points have to be taken care of:</div><div class='del'>-</div><div class='del'>-* since glusterfs is compiled with _FILE_OFFSET_BITS=64 and __USE_FILE_OFFSET64 flags, mod_glusterfs and apache </div><div class='del'>-  in turn have to be compiled with the above two flags.</div><div class='del'>- </div><div class='del'>- $ tar xzf httpd-2.2.10.tar.gz </div><div class='del'>- $ cd httpd-2.2.10/</div><div class='del'>- $ export CFLAGS='-D_FILE_OFFSET_BITS=64 -D__USE_FILE_OFFSET64'</div><div class='del'>- $ ./configure --prefix=/usr </div><div class='del'>- $ make </div><div class='del'>- $ make install</div><div class='del'>- $ httpd -l | grep -i mod_so </div><div class='del'>-   mod_so.c</div><div class='del'>-</div><div class='del'>-* if multiple apache installations are present, make sure to pass --with-apxs=/path/to/apxs/of/proper/version </div><div class='del'>-  to configure script while building glusterfs.</div><div class='del'>-</div><div class='del'>-Build/Install mod_glusterfs</div><div class='del'>-===========================</div><div class='del'>-* mod_glusterfs is provided with glusterfs--mainline--3.0 and all releases from the same branch.</div><div class='del'>-</div><div class='del'>-* building glusterfs also builds mod_glusterfs. But 'make install' of glusterfs installs mod_glusterfs.so to </div><div class='del'>-  glusterfs install directory instead of the apache modules directory.</div><div class='del'>-</div><div class='del'>-* 'make install' of glusterfs will print a message similar to the one given below, which is self explanatory. </div><div class='del'>-  Make sure to use apxs of proper apache version in case of multiple apache installations. This will copy </div><div class='del'>-  mod_glusterfs.so to modules directory of proper apache version and modify the appropriate httpd.conf to enable</div><div class='del'>-  mod_glusterfs. </div><div class='del'>-</div><div class='del'>-**********************************************************************************</div><div class='del'>-* TO INSTALL MODGLUSTERFS, PLEASE USE,                                            </div><div class='del'>-* apxs -n glusterfs -ia /usr/lib/glusterfs/2.0.0rc4/apache/2.2/mod_glusterfs.so                </div><div class='del'>-**********************************************************************************</div><div class='del'>-</div><div class='del'>-Configuration</div><div class='del'>-=============</div><div class='del'>-* Following configuration has to be added to httpd.conf.</div><div class='del'>-</div><div class='del'>- &lt;Location "/glusterfs"&gt;</div><div class='del'>- 	   GlusterfsLogfile "/var/log/glusterfs/glusterfs.log"</div><div class='del'>-	   GlusterfsLoglevel "warning"</div><div class='del'>- 	   GlusterfsVolumeSpecfile "/etc/glusterfs/glusterfs-client.spec"</div><div class='del'>-	   GlusterfsCacheTimeout "600"</div><div class='del'>-	   GlusterfsXattrFileSize "65536"</div><div class='del'>- 	   SetHandler "glusterfs-handler"</div><div class='del'>- &lt;/Location&gt;</div><div class='del'>-</div><div class='del'>-* GlusterfsVolumeSpecfile (COMPULSORY)</div><div class='del'>-  Path to the the glusterfs volume specification file.</div><div class='del'>-</div><div class='del'>-* GlusterfsLogfile (COMPULSORY)</div><div class='del'>-  Path to the glusterfs logfile.</div><div class='del'>-</div><div class='del'>-* GlusterfsLoglevel (OPTIONAL, default = warning)</div><div class='del'>-  Severity of messages that are to be logged. Allowed values are critical, error, warning, debug, none </div><div class='del'>-  in the decreasing order of severity.</div><div class='del'>-</div><div class='del'>-* GlusterfsCacheTimeOut (OPTIONAL, default = 0)</div><div class='del'>-  Timeout values for glusterfs stat and lookup cache.</div><div class='del'>-</div><div class='del'>-* GlusterfsXattrFileSize (OPTIONAL, default = 0)</div><div class='del'>-  Files with sizes upto and including this value are fetched through the extended attribute interface of </div><div class='del'>-  glusterfs rather than the usual open-read-close set of operations. For files of small sizes, it is recommended </div><div class='del'>-  to use extended attribute interface.</div><div class='del'>-</div><div class='del'>-* With the above configuration all the requests to httpd of the form www.example.org/glusterfs/path/to/file are </div><div class='del'>-  served from glusterfs.</div><div class='del'>-</div><div class='del'>-* mod_glusterfs also implements mod_dir and mod_autoindex behaviour for files under glusterfs mount.</div><div class='del'>-  Hence it also takes the directives related to both of these modules. For more details, refer the </div><div class='del'>-  documentation for both of these modules. </div><div class='del'>-</div><div class='del'>-Miscellaneous points</div><div class='del'>-====================</div><div class='del'>-* httpd by default runs with username "nobody" and group "nogroup". Permissions of logfile and specfile have to </div><div class='del'>-  be set suitably.</div><div class='del'>-</div><div class='del'>-* Since mod_glusterfs runs with permissions of nobody.nogroup, glusterfs has to use only login based </div><div class='del'>-  authentication. See docs/authentication.txt for more details. </div><div class='del'>-</div><div class='del'>-* To copy the data served by httpd into glusterfs mountpoint, glusterfs can be started with the </div><div class='del'>-  volume-specification file provided to mod_glusterfs. Any tool like cp can then be used.</div><div class='del'>-</div><div class='del'>-* To run in gdb, apache has to be compiled with -lpthread, since libglusterfsclient is </div><div class='del'>-  multithreaded. If not on Linux gdb runs into errors like: </div><div class='del'>-  "Error while reading shared library symbols:</div><div class='del'>-   Cannot find new threads: generic error"</div><div class='del'>-</div><div class='del'>-* when used with ib-verbs transport, ib_verbs initialization fails.</div><div class='del'>-  reason for this is that apache runs as non-privileged user and the amount of memory that can be </div><div class='del'>-  locked by default is not sufficient for ib-verbs. to fix this, as root run,</div><div class='del'>-  </div><div class='del'>-  # ulimit -l unlimited</div><div class='del'>-</div><div class='del'>-  and then start apache.</div><div class='head'>diff --git a/mod_glusterfs/apache/2.2/src/mod_glusterfs.c b/mod_glusterfs/apache/2.2/src/mod_glusterfs.c<br/>deleted file mode 100644<br/>index 6758e40e46f..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/mod_glusterfs/apache/2.2/src/mod_glusterfs.c?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>mod_glusterfs/apache/2.2/src/mod_glusterfs.c</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,3627 +0,0 @@</div><div class='del'>-/*</div><div class='del'>-  Copyright (c) 2008-2009 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='del'>-  This file is part of GlusterFS.</div><div class='del'>-</div><div class='del'>-  GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-  it under the terms of the GNU General Public License as published</div><div class='del'>-  by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-  or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-  GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-  WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-  General Public License for more details.</div><div class='del'>-</div><div class='del'>-  You should have received a copy of the GNU General Public License</div><div class='del'>-  along with this program.  If not, see</div><div class='del'>-  &lt;http://www.gnu.org/licenses/&gt;.</div><div class='del'>-*/</div><div class='del'>-</div><div class='del'>-#ifndef CORE_PRIVATE</div><div class='del'>-#define CORE_PRIVATE</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-#ifndef NO_CONTENT_TYPE</div><div class='del'>-#define NO_CONTENT_TYPE "none"</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-#define BYTERANGE_FMT "%" APR_OFF_T_FMT "-%" APR_OFF_T_FMT "/%" APR_OFF_T_FMT</div><div class='del'>-</div><div class='del'>-#include &lt;sys/types.h&gt;</div><div class='del'>-#include &lt;sys/stat.h&gt;</div><div class='del'>-#include &lt;unistd.h&gt;</div><div class='del'>-</div><div class='del'>-#include &lt;httpd.h&gt;</div><div class='del'>-#include &lt;http_config.h&gt;</div><div class='del'>-#include &lt;http_core.h&gt;</div><div class='del'>-#include &lt;http_request.h&gt;</div><div class='del'>-#include &lt;http_protocol.h&gt;</div><div class='del'>-#include &lt;http_log.h&gt;</div><div class='del'>-#include &lt;http_main.h&gt;</div><div class='del'>-#include &lt;util_script.h&gt;</div><div class='del'>-#include &lt;util_filter.h&gt;</div><div class='del'>-#include &lt;libglusterfsclient.h&gt;</div><div class='del'>-#include &lt;sys/uio.h&gt;</div><div class='del'>-#include &lt;pthread.h&gt;</div><div class='del'>-#include &lt;apr.h&gt;</div><div class='del'>-#include &lt;apr_strings.h&gt;</div><div class='del'>-#include &lt;apr_buckets.h&gt;</div><div class='del'>-#include &lt;apr_fnmatch.h&gt;</div><div class='del'>-#include &lt;apr_lib.h&gt;</div><div class='del'>-</div><div class='del'>-#define GLUSTERFS_INVALID_LOGLEVEL "mod_glfs: Unrecognized log-level \"%s\", "\</div><div class='del'>-                                   " possible values are \"DEBUG|WARNING|"\</div><div class='del'>-                                   "ERROR|CRITICAL|NONE\"\n"</div><div class='del'>-</div><div class='del'>-#define GLUSTERFS_HANDLER "glusterfs-handler"</div><div class='del'>-#define GLUSTERFS_CHUNK_SIZE 131072 </div><div class='del'>-</div><div class='del'>-static char c_by_encoding, c_by_type, c_by_path;</div><div class='del'>-</div><div class='del'>-#define BY_ENCODING &amp;c_by_encoding</div><div class='del'>-#define BY_TYPE &amp;c_by_type</div><div class='del'>-#define BY_PATH &amp;c_by_path</div><div class='del'>-</div><div class='del'>-module AP_MODULE_DECLARE_DATA glusterfs_module;</div><div class='del'>-extern module core_module;</div><div class='del'>-</div><div class='del'>-#define NO_OPTIONS          (1 &lt;&lt;  0)  /* Indexing options */</div><div class='del'>-#define ICONS_ARE_LINKS     (1 &lt;&lt;  1)</div><div class='del'>-#define SCAN_HTML_TITLES    (1 &lt;&lt;  2)</div><div class='del'>-#define SUPPRESS_ICON       (1 &lt;&lt;  3)</div><div class='del'>-#define SUPPRESS_LAST_MOD   (1 &lt;&lt;  4)</div><div class='del'>-#define SUPPRESS_SIZE       (1 &lt;&lt;  5)</div><div class='del'>-#define SUPPRESS_DESC       (1 &lt;&lt;  6)</div><div class='del'>-#define SUPPRESS_PREAMBLE   (1 &lt;&lt;  7)</div><div class='del'>-#define SUPPRESS_COLSORT    (1 &lt;&lt;  8)</div><div class='del'>-#define SUPPRESS_RULES      (1 &lt;&lt;  9)</div><div class='del'>-#define FOLDERS_FIRST       (1 &lt;&lt; 10)</div><div class='del'>-#define VERSION_SORT        (1 &lt;&lt; 11)</div><div class='del'>-#define TRACK_MODIFIED      (1 &lt;&lt; 12)</div><div class='del'>-#define FANCY_INDEXING      (1 &lt;&lt; 13)</div><div class='del'>-#define TABLE_INDEXING      (1 &lt;&lt; 14)</div><div class='del'>-#define IGNORE_CLIENT       (1 &lt;&lt; 15)</div><div class='del'>-#define IGNORE_CASE         (1 &lt;&lt; 16)</div><div class='del'>-#define EMIT_XHTML          (1 &lt;&lt; 17)</div><div class='del'>-#define SHOW_FORBIDDEN      (1 &lt;&lt; 18)</div><div class='del'>-</div><div class='del'>-#define K_NOADJUST 0</div><div class='del'>-#define K_ADJUST 1</div><div class='del'>-#define K_UNSET 2</div><div class='del'>-</div><div class='del'>-/*</div><div class='del'>- * Define keys for sorting.</div><div class='del'>- */</div><div class='del'>-#define K_NAME 'N'              /* Sort by file name (default) */</div><div class='del'>-#define K_LAST_MOD 'M'          /* Last modification date */</div><div class='del'>-#define K_SIZE 'S'              /* Size (absolute, not as displayed) */</div><div class='del'>-#define K_DESC 'D'              /* Description */</div><div class='del'>-#define K_VALID "NMSD"          /* String containing _all_ valid K_ opts */</div><div class='del'>-</div><div class='del'>-#define D_ASCENDING 'A'</div><div class='del'>-#define D_DESCENDING 'D'</div><div class='del'>-#define D_VALID "AD"            /* String containing _all_ valid D_ opts */</div><div class='del'>-</div><div class='del'>-/*</div><div class='del'>- * These are the dimensions of the default icons supplied with Apache.</div><div class='del'>- */</div><div class='del'>-#define DEFAULT_ICON_WIDTH 20</div><div class='del'>-#define DEFAULT_ICON_HEIGHT 22</div><div class='del'>-</div><div class='del'>-/*</div><div class='del'>- * Other default dimensions.</div><div class='del'>- */</div><div class='del'>-#define DEFAULT_NAME_WIDTH 23</div><div class='del'>-#define DEFAULT_DESC_WIDTH 23</div><div class='del'>-</div><div class='del'>-struct mod_glfs_ai_item {</div><div class='del'>-        char *type;</div><div class='del'>-        char *apply_to;</div><div class='del'>-        char *apply_path;</div><div class='del'>-        char *data;</div><div class='del'>-};</div><div class='del'>-</div><div class='del'>-typedef struct mod_glfs_ai_desc_t {</div><div class='del'>-        char *pattern;</div><div class='del'>-        char *description;</div><div class='del'>-        int full_path;</div><div class='del'>-        int wildcards;</div><div class='del'>-} mod_glfs_ai_desc_t;</div><div class='del'>-</div><div class='del'>-typedef enum {</div><div class='del'>-        SLASH_OFF = 0,</div><div class='del'>-        SLASH_ON,</div><div class='del'>-        SLASH_UNSET</div><div class='del'>-} mod_glfs_dir_slash_cfg;</div><div class='del'>-</div><div class='del'>-/* static ap_filter_rec_t *mod_glfs_output_filter_handle; */</div><div class='del'>-</div><div class='del'>-/*TODO: verify error returns to server core */</div><div class='del'>-</div><div class='del'>-typedef struct glusterfs_dir_config {</div><div class='del'>-        char                   *logfile;</div><div class='del'>-        char                   *loglevel;</div><div class='del'>-        char                   *specfile;</div><div class='del'>-        char                   *mount_dir;</div><div class='del'>-        char                   *buf;</div><div class='del'>-</div><div class='del'>-        size_t                  xattr_file_size;</div><div class='del'>-        uint32_t                cache_timeout;</div><div class='del'>-        </div><div class='del'>-        /* mod_dir options */</div><div class='del'>-        apr_array_header_t     *index_names;</div><div class='del'>-        mod_glfs_dir_slash_cfg  do_slash;</div><div class='del'>-</div><div class='del'>-        /* autoindex options */</div><div class='del'>-        char                   *default_icon;</div><div class='del'>-        char                   *style_sheet;</div><div class='del'>-        apr_int32_t             opts;</div><div class='del'>-        apr_int32_t             incremented_opts;</div><div class='del'>-        apr_int32_t             decremented_opts;</div><div class='del'>-        int                     name_width;</div><div class='del'>-        int                     name_adjust;</div><div class='del'>-        int                     desc_width;</div><div class='del'>-        int                     desc_adjust;</div><div class='del'>-        int                     icon_width;</div><div class='del'>-        int                     icon_height;</div><div class='del'>-        char                    default_keyid;</div><div class='del'>-        char                    default_direction;</div><div class='del'>-</div><div class='del'>-        apr_array_header_t     *icon_list;</div><div class='del'>-        apr_array_header_t     *alt_list;</div><div class='del'>-        apr_array_header_t     *desc_list;</div><div class='del'>-        apr_array_header_t     *ign_list;</div><div class='del'>-        apr_array_header_t     *hdr_list;</div><div class='del'>-        apr_array_header_t     *rdme_list;</div><div class='del'>-</div><div class='del'>-        char                   *ctype;</div><div class='del'>-        char                   *charset;</div><div class='del'>-} glusterfs_dir_config_t;</div><div class='del'>-</div><div class='del'>-typedef struct glusterfs_async_local {</div><div class='del'>-        int                op_ret;</div><div class='del'>-        int                op_errno;</div><div class='del'>-        char               async_read_complete;</div><div class='del'>-        off_t              length;</div><div class='del'>-        off_t              read_bytes;</div><div class='del'>-        glusterfs_iobuf_t *buf;</div><div class='del'>-        request_rec       *request;</div><div class='del'>-        pthread_mutex_t    lock;</div><div class='del'>-        pthread_cond_t     cond;</div><div class='del'>-}glusterfs_async_local_t;</div><div class='del'>-</div><div class='del'>-#define GLUSTERFS_CMD_PERMS ACCESS_CONF</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-static glusterfs_dir_config_t *</div><div class='del'>-mod_glfs_dconfig (request_rec *r)</div><div class='del'>-{</div><div class='del'>-        glusterfs_dir_config_t *dir_config = NULL;</div><div class='del'>-        if (r-&gt;per_dir_config != NULL) {</div><div class='del'>-                dir_config = ap_get_module_config (r-&gt;per_dir_config,</div><div class='del'>-                                                   &amp;glusterfs_module);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        return dir_config;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-static const char *</div><div class='del'>-cmd_add_xattr_file_size (cmd_parms *cmd, void *dummy, const char *arg)</div><div class='del'>-{</div><div class='del'>-        glusterfs_dir_config_t *dir_config = dummy;</div><div class='del'>-        dir_config-&gt;xattr_file_size = atoi (arg);</div><div class='del'>-        return NULL;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-static const char *</div><div class='del'>-cmd_set_cache_timeout (cmd_parms *cmd, void *dummy, const char *arg)</div><div class='del'>-{</div><div class='del'>-        glusterfs_dir_config_t *dir_config = dummy;</div><div class='del'>-        dir_config-&gt;cache_timeout = atoi (arg);</div><div class='del'>-        return NULL;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-static const char *</div><div class='del'>-cmd_set_loglevel (cmd_parms *cmd, void *dummy, const char *arg)</div><div class='del'>-{</div><div class='del'>-        glusterfs_dir_config_t *dir_config = dummy;</div><div class='del'>-        char                   *error = NULL;</div><div class='del'>-        if (strncasecmp (arg, "DEBUG", strlen ("DEBUG")) </div><div class='del'>-            &amp;&amp; strncasecmp (arg, "WARNING", strlen ("WARNING")) </div><div class='del'>-            &amp;&amp; strncasecmp (arg, "CRITICAL", strlen ("CRITICAL")) </div><div class='del'>-            &amp;&amp; strncasecmp (arg, "NONE", strlen ("NONE")) </div><div class='del'>-            &amp;&amp; strncasecmp (arg, "ERROR", strlen ("ERROR")))</div><div class='del'>-                error = GLUSTERFS_INVALID_LOGLEVEL;</div><div class='del'>-        else</div><div class='del'>-                dir_config-&gt;loglevel = apr_pstrdup (cmd-&gt;pool, arg);</div><div class='del'>-</div><div class='del'>-        return error;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-static const char *</div><div class='del'>-cmd_add_logfile (cmd_parms *cmd, void *dummy, const char *arg)</div><div class='del'>-{</div><div class='del'>-        glusterfs_dir_config_t *dir_config = dummy;</div><div class='del'>-        dir_config-&gt;logfile = apr_pstrdup (cmd-&gt;pool, arg);</div><div class='del'>-</div><div class='del'>-        return NULL;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-static const char *</div><div class='del'>-cmd_add_volume_specfile (cmd_parms *cmd, void *dummy, const char *arg)</div><div class='del'>-{</div><div class='del'>-        glusterfs_dir_config_t *dir_config = dummy;</div><div class='del'>-</div><div class='del'>-        dir_config-&gt;specfile = apr_pstrdup (cmd-&gt;pool, arg);</div><div class='del'>-</div><div class='del'>-        return NULL;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-#define WILDCARDS_REQUIRED 0</div><div class='del'>-</div><div class='del'>-static const char *</div><div class='del'>-cmd_add_desc (cmd_parms *cmd, void *d, const char *desc,</div><div class='del'>-              const char *to)</div><div class='del'>-{</div><div class='del'>-        glusterfs_dir_config_t *dcfg = NULL;</div><div class='del'>-        mod_glfs_ai_desc_t     *desc_entry = NULL;</div><div class='del'>-        char                   *prefix = "";</div><div class='del'>-</div><div class='del'>-        dcfg = (glusterfs_dir_config_t *) d;</div><div class='del'>-        desc_entry = (mod_glfs_ai_desc_t *) apr_array_push(dcfg-&gt;desc_list);</div><div class='del'>-        desc_entry-&gt;full_path = (ap_strchr_c(to, '/') == NULL) ? 0 : 1;</div><div class='del'>-        desc_entry-&gt;wildcards = (WILDCARDS_REQUIRED</div><div class='del'>-                                 || desc_entry-&gt;full_path</div><div class='del'>-                                 || apr_fnmatch_test(to));</div><div class='del'>-        if (desc_entry-&gt;wildcards) {</div><div class='del'>-                prefix = desc_entry-&gt;full_path ? "*/" : "*";</div><div class='del'>-                desc_entry-&gt;pattern = apr_pstrcat(dcfg-&gt;desc_list-&gt;pool,</div><div class='del'>-                                                  prefix, to, "*", NULL);</div><div class='del'>-        }</div><div class='del'>-        else {</div><div class='del'>-                desc_entry-&gt;pattern = apr_pstrdup(dcfg-&gt;desc_list-&gt;pool, to);</div><div class='del'>-        }</div><div class='del'>-        desc_entry-&gt;description = apr_pstrdup(dcfg-&gt;desc_list-&gt;pool, desc);</div><div class='del'>-        return NULL;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-static void push_item(apr_array_header_t *arr, char *type, const char *to,</div><div class='del'>-                      const char *path, const char *data)</div><div class='del'>-{</div><div class='del'>-        struct mod_glfs_ai_item *p = NULL;</div><div class='del'>-</div><div class='del'>-        p = (struct mod_glfs_ai_item *) apr_array_push(arr);</div><div class='del'>-</div><div class='del'>-        if (!to) {</div><div class='del'>-                to = "";</div><div class='del'>-        }</div><div class='del'>-        if (!path) {</div><div class='del'>-                path = "";</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        p-&gt;type = type;</div><div class='del'>-        p-&gt;data = data ? apr_pstrdup(arr-&gt;pool, data) : NULL;</div><div class='del'>-        p-&gt;apply_path = apr_pstrcat(arr-&gt;pool, path, "*", NULL);</div><div class='del'>-</div><div class='del'>-        if ((type == BY_PATH) &amp;&amp; (!ap_is_matchexp(to))) {</div><div class='del'>-                p-&gt;apply_to = apr_pstrcat(arr-&gt;pool, "*", to, NULL);</div><div class='del'>-        }</div><div class='del'>-        else if (to) {</div><div class='del'>-                p-&gt;apply_to = apr_pstrdup(arr-&gt;pool, to);</div><div class='del'>-        }</div><div class='del'>-        else {</div><div class='del'>-                p-&gt;apply_to = NULL;</div><div class='del'>-        }</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-static const char *</div><div class='del'>-cmd_add_ignore (cmd_parms *cmd, void *d, const char *ext)</div><div class='del'>-{</div><div class='del'>-        push_item(((glusterfs_dir_config_t *) d)-&gt;ign_list, 0, ext, cmd-&gt;path,</div><div class='del'>-                  NULL);</div><div class='del'>-        return NULL;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-static const char *</div><div class='del'>-cmd_add_header (cmd_parms *cmd, void *d, const char *name)</div><div class='del'>-{</div><div class='del'>-        push_item(((glusterfs_dir_config_t *) d)-&gt;hdr_list, 0, NULL, cmd-&gt;path,</div><div class='del'>-                  name);</div><div class='del'>-        return NULL;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-static const char *</div><div class='del'>-cmd_add_readme (cmd_parms *cmd, void *d, const char *name)</div><div class='del'>-{</div><div class='del'>-        push_item(((glusterfs_dir_config_t *) d)-&gt;rdme_list, 0, NULL, cmd-&gt;path,</div><div class='del'>-                  name);</div><div class='del'>-        return NULL;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-static const char *</div><div class='del'>-cmd_add_opts (cmd_parms *cmd, void *d, int argc, char *const argv[])</div><div class='del'>-{</div><div class='del'>-        int                     i = 0, option = 0;</div><div class='del'>-        char                   *w = NULL;</div><div class='del'>-        apr_int32_t             opts;</div><div class='del'>-        apr_int32_t             opts_add;</div><div class='del'>-        apr_int32_t             opts_remove;</div><div class='del'>-        char                    action = 0;</div><div class='del'>-        glusterfs_dir_config_t *d_cfg = (glusterfs_dir_config_t *) d;</div><div class='del'>-</div><div class='del'>-        opts = d_cfg-&gt;opts;</div><div class='del'>-        opts_add = d_cfg-&gt;incremented_opts;</div><div class='del'>-        opts_remove = d_cfg-&gt;decremented_opts;</div><div class='del'>-</div><div class='del'>-        for (i = 0; i &lt; argc; i++) {</div><div class='del'>-                w = argv[i];</div><div class='del'>-</div><div class='del'>-                if ((*w == '+') || (*w == '-')) {</div><div class='del'>-                        action = *(w++);</div><div class='del'>-                }</div><div class='del'>-                else {</div><div class='del'>-                        action = '\0';</div><div class='del'>-                }</div><div class='del'>-                if (!strcasecmp(w, "FancyIndexing")) {</div><div class='del'>-                        option = FANCY_INDEXING;</div><div class='del'>-                }</div><div class='del'>-                else if (!strcasecmp(w, "FoldersFirst")) {</div><div class='del'>-                        option = FOLDERS_FIRST;</div><div class='del'>-                }</div><div class='del'>-                else if (!strcasecmp(w, "HTMLTable")) {</div><div class='del'>-                        option = TABLE_INDEXING;</div><div class='del'>-                }</div><div class='del'>-                else if (!strcasecmp(w, "IconsAreLinks")) {</div><div class='del'>-                        option = ICONS_ARE_LINKS;</div><div class='del'>-                }</div><div class='del'>-                else if (!strcasecmp(w, "IgnoreCase")) {</div><div class='del'>-                        option = IGNORE_CASE;</div><div class='del'>-                }</div><div class='del'>-                else if (!strcasecmp(w, "IgnoreClient")) {</div><div class='del'>-                        option = IGNORE_CLIENT;</div><div class='del'>-                }</div><div class='del'>-                else if (!strcasecmp(w, "ScanHTMLTitles")) {</div><div class='del'>-                        option = SCAN_HTML_TITLES;</div><div class='del'>-                }</div><div class='del'>-                else if (!strcasecmp(w, "SuppressColumnSorting")) {</div><div class='del'>-                        option = SUPPRESS_COLSORT;</div><div class='del'>-                }</div><div class='del'>-                else if (!strcasecmp(w, "SuppressDescription")) {</div><div class='del'>-                        option = SUPPRESS_DESC;</div><div class='del'>-                }</div><div class='del'>-                else if (!strcasecmp(w, "SuppressHTMLPreamble")) {</div><div class='del'>-                        option = SUPPRESS_PREAMBLE;</div><div class='del'>-                }</div><div class='del'>-                else if (!strcasecmp(w, "SuppressIcon")) {</div><div class='del'>-                        option = SUPPRESS_ICON;</div><div class='del'>-                }</div><div class='del'>-                else if (!strcasecmp(w, "SuppressLastModified")) {</div><div class='del'>-                        option = SUPPRESS_LAST_MOD;</div><div class='del'>-                }</div><div class='del'>-                else if (!strcasecmp(w, "SuppressSize")) {</div><div class='del'>-                        option = SUPPRESS_SIZE;</div><div class='del'>-                }</div><div class='del'>-                else if (!strcasecmp(w, "SuppressRules")) {</div><div class='del'>-                        option = SUPPRESS_RULES;</div><div class='del'>-                }</div><div class='del'>-                else if (!strcasecmp(w, "TrackModified")) {</div><div class='del'>-                        option = TRACK_MODIFIED;</div><div class='del'>-                }</div><div class='del'>-                else if (!strcasecmp(w, "VersionSort")) {</div><div class='del'>-                        option = VERSION_SORT;</div><div class='del'>-                }</div><div class='del'>-                else if (!strcasecmp(w, "XHTML")) {</div><div class='del'>-                        option = EMIT_XHTML;</div><div class='del'>-                }</div><div class='del'>-                else if (!strcasecmp(w, "ShowForbidden")) {</div><div class='del'>-                        option = SHOW_FORBIDDEN;</div><div class='del'>-                }</div><div class='del'>-                else if (!strcasecmp(w, "None")) {</div><div class='del'>-                        if (action != '\0') {</div><div class='del'>-                                return "Cannot combine '+' or '-' with 'None' "</div><div class='del'>-                                        "keyword";</div><div class='del'>-                        }</div><div class='del'>-                        opts = NO_OPTIONS;</div><div class='del'>-                        opts_add = 0;</div><div class='del'>-                        opts_remove = 0;</div><div class='del'>-                }</div><div class='del'>-                else if (!strcasecmp(w, "IconWidth")) {</div><div class='del'>-                        if (action != '-') {</div><div class='del'>-                                d_cfg-&gt;icon_width = DEFAULT_ICON_WIDTH;</div><div class='del'>-                        }</div><div class='del'>-                        else {</div><div class='del'>-                                d_cfg-&gt;icon_width = 0;</div><div class='del'>-                        }</div><div class='del'>-                }</div><div class='del'>-                else if (!strncasecmp(w, "IconWidth=", 10)) {</div><div class='del'>-                        if (action == '-') {</div><div class='del'>-                                return "Cannot combine '-' with IconWidth=n";</div><div class='del'>-                        }</div><div class='del'>-                        d_cfg-&gt;icon_width = atoi(&amp;w[10]);</div><div class='del'>-                }</div><div class='del'>-                else if (!strcasecmp(w, "IconHeight")) {</div><div class='del'>-                        if (action != '-') {</div><div class='del'>-                                d_cfg-&gt;icon_height = DEFAULT_ICON_HEIGHT;</div><div class='del'>-                        }</div><div class='del'>-                        else {</div><div class='del'>-                                d_cfg-&gt;icon_height = 0;</div><div class='del'>-                        }</div><div class='del'>-                }</div><div class='del'>-                else if (!strncasecmp(w, "IconHeight=", 11)) {</div><div class='del'>-                        if (action == '-') {</div><div class='del'>-                                return "Cannot combine '-' with IconHeight=n";</div><div class='del'>-                        }</div><div class='del'>-                        d_cfg-&gt;icon_height = atoi(&amp;w[11]);</div><div class='del'>-                }</div><div class='del'>-                else if (!strcasecmp(w, "NameWidth")) {</div><div class='del'>-                        if (action != '-') {</div><div class='del'>-                                return "NameWidth with no value may only appear"</div><div class='del'>-                                        " as "</div><div class='del'>-                                        "'-NameWidth'";</div><div class='del'>-                        }</div><div class='del'>-                        d_cfg-&gt;name_width = DEFAULT_NAME_WIDTH;</div><div class='del'>-                        d_cfg-&gt;name_adjust = K_NOADJUST;</div><div class='del'>-                }</div><div class='del'>-                else if (!strncasecmp(w, "NameWidth=", 10)) {</div><div class='del'>-                        if (action == '-') {</div><div class='del'>-                                return "Cannot combine '-' with NameWidth=n";</div><div class='del'>-                        }</div><div class='del'>-                        if (w[10] == '*') {</div><div class='del'>-                                d_cfg-&gt;name_adjust = K_ADJUST;</div><div class='del'>-                        }</div><div class='del'>-                        else {</div><div class='del'>-                                int width = atoi(&amp;w[10]);</div><div class='del'>-</div><div class='del'>-                                if (width &amp;&amp; (width &lt; 5)) {</div><div class='del'>-                                        return "NameWidth value must be greater"</div><div class='del'>-                                                " than 5";</div><div class='del'>-                                }</div><div class='del'>-                                d_cfg-&gt;name_width = width;</div><div class='del'>-                                d_cfg-&gt;name_adjust = K_NOADJUST;</div><div class='del'>-                        }</div><div class='del'>-                }</div><div class='del'>-                else if (!strcasecmp(w, "DescriptionWidth")) {</div><div class='del'>-                        if (action != '-') {</div><div class='del'>-                                return "DescriptionWidth with no value may only"</div><div class='del'>-                                        " appear as "</div><div class='del'>-                                        "'-DescriptionWidth'";</div><div class='del'>-                        }</div><div class='del'>-                        d_cfg-&gt;desc_width = DEFAULT_DESC_WIDTH;</div><div class='del'>-                        d_cfg-&gt;desc_adjust = K_NOADJUST;</div><div class='del'>-                }</div><div class='del'>-                else if (!strncasecmp(w, "DescriptionWidth=", 17)) {</div><div class='del'>-                        if (action == '-') {</div><div class='del'>-                                return "Cannot combine '-' with "</div><div class='del'>-                                        "DescriptionWidth=n";</div><div class='del'>-                        }</div><div class='del'>-                        if (w[17] == '*') {</div><div class='del'>-                                d_cfg-&gt;desc_adjust = K_ADJUST;</div><div class='del'>-                        }</div><div class='del'>-                        else {</div><div class='del'>-                                int width = atoi(&amp;w[17]);</div><div class='del'>-</div><div class='del'>-                                if (width &amp;&amp; (width &lt; 12)) {</div><div class='del'>-                                        return "DescriptionWidth value must be "</div><div class='del'>-                                                "greater than 12";</div><div class='del'>-                                }</div><div class='del'>-                                d_cfg-&gt;desc_width = width;</div><div class='del'>-                                d_cfg-&gt;desc_adjust = K_NOADJUST;</div><div class='del'>-                        }</div><div class='del'>-                }</div><div class='del'>-                else if (!strncasecmp(w, "Type=", 5)) {</div><div class='del'>-                        d_cfg-&gt;ctype = apr_pstrdup(cmd-&gt;pool, &amp;w[5]);</div><div class='del'>-                }</div><div class='del'>-                else if (!strncasecmp(w, "Charset=", 8)) {</div><div class='del'>-                        d_cfg-&gt;charset = apr_pstrdup(cmd-&gt;pool, &amp;w[8]);</div><div class='del'>-                }</div><div class='del'>-                else {</div><div class='del'>-                        return "Invalid directory indexing option";</div><div class='del'>-                }</div><div class='del'>-                if (action == '\0') {</div><div class='del'>-                        opts |= option;</div><div class='del'>-                        opts_add = 0;</div><div class='del'>-                        opts_remove = 0;</div><div class='del'>-                }</div><div class='del'>-                else if (action == '+') {</div><div class='del'>-                        opts_add |= option;</div><div class='del'>-                        opts_remove &amp;= ~option;</div><div class='del'>-                }</div><div class='del'>-                else {</div><div class='del'>-                        opts_remove |= option;</div><div class='del'>-                        opts_add &amp;= ~option;</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='del'>-        if ((opts &amp; NO_OPTIONS) &amp;&amp; (opts &amp; ~NO_OPTIONS)) {</div><div class='del'>-                return "Cannot combine other IndexOptions keywords with 'None'";</div><div class='del'>-        }</div><div class='del'>-        d_cfg-&gt;incremented_opts = opts_add;</div><div class='del'>-        d_cfg-&gt;decremented_opts = opts_remove;</div><div class='del'>-        d_cfg-&gt;opts = opts;</div><div class='del'>-        return NULL;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-static const char *</div><div class='del'>-cmd_set_default_order(cmd_parms *cmd, void *m,</div><div class='del'>-                      const char *direction, const char *key)</div><div class='del'>-{</div><div class='del'>-        glusterfs_dir_config_t *d_cfg = (glusterfs_dir_config_t *) m;</div><div class='del'>-</div><div class='del'>-        if (!strcasecmp(direction, "Ascending")) {</div><div class='del'>-                d_cfg-&gt;default_direction = D_ASCENDING;</div><div class='del'>-        }</div><div class='del'>-        else if (!strcasecmp(direction, "Descending")) {</div><div class='del'>-                d_cfg-&gt;default_direction = D_DESCENDING;</div><div class='del'>-        }</div><div class='del'>-        else {</div><div class='del'>-                return "First keyword must be 'Ascending' or 'Descending'";</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (!strcasecmp(key, "Name")) {</div><div class='del'>-                d_cfg-&gt;default_keyid = K_NAME;</div><div class='del'>-        }</div><div class='del'>-        else if (!strcasecmp(key, "Date")) {</div><div class='del'>-                d_cfg-&gt;default_keyid = K_LAST_MOD;</div><div class='del'>-        }</div><div class='del'>-        else if (!strcasecmp(key, "Size")) {</div><div class='del'>-                d_cfg-&gt;default_keyid = K_SIZE;</div><div class='del'>-        }</div><div class='del'>-        else if (!strcasecmp(key, "Description")) {</div><div class='del'>-                d_cfg-&gt;default_keyid = K_DESC;</div><div class='del'>-        }</div><div class='del'>-        else {</div><div class='del'>-                return "Second keyword must be 'Name', 'Date', 'Size', or "</div><div class='del'>-                        "'Description'";</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        return NULL;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-static char c_by_encoding, c_by_type, c_by_path;</div><div class='del'>-</div><div class='del'>-#define BY_ENCODING &amp;c_by_encoding</div><div class='del'>-#define BY_TYPE &amp;c_by_type</div><div class='del'>-#define BY_PATH &amp;c_by_path</div><div class='del'>-</div><div class='del'>-/*</div><div class='del'>- * This routine puts the standard HTML header at the top of the index page.</div><div class='del'>- * We include the DOCTYPE because we may be using features therefrom (i.e.,</div><div class='del'>- * HEIGHT and WIDTH attributes on the icons if we're FancyIndexing).</div><div class='del'>- */</div><div class='del'>-static void emit_preamble(request_rec *r, int xhtml, const char *title)</div><div class='del'>-{</div><div class='del'>-        glusterfs_dir_config_t *d;</div><div class='del'>-</div><div class='del'>-        d = (glusterfs_dir_config_t *) ap_get_module_config(r-&gt;per_dir_config,</div><div class='del'>-                                                            &amp;glusterfs_module);</div><div class='del'>-</div><div class='del'>-        if (xhtml) {</div><div class='del'>-                ap_rvputs(r, DOCTYPE_XHTML_1_0T,</div><div class='del'>-                          "&lt;html xmlns=\"http://www.w3.org/1999/xhtml\"&gt;\n"</div><div class='del'>-                          " &lt;head&gt;\n  &lt;title&gt;Index of ", title,</div><div class='del'>-                          "&lt;/title&gt;\n", NULL);</div><div class='del'>-        } else {</div><div class='del'>-                ap_rvputs(r, DOCTYPE_HTML_3_2,</div><div class='del'>-                          "&lt;html&gt;\n &lt;head&gt;\n"</div><div class='del'>-                          "  &lt;title&gt;Index of ", title,</div><div class='del'>-                          "&lt;/title&gt;\n", NULL);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (d-&gt;style_sheet != NULL) {</div><div class='del'>-                ap_rvputs(r, "  &lt;link rel=\"stylesheet\" href=\"",</div><div class='del'>-                          d-&gt;style_sheet, "\" type=\"text/css\"",</div><div class='del'>-                          xhtml ? " /&gt;\n" : "&gt;\n", NULL);</div><div class='del'>-        }</div><div class='del'>-        ap_rvputs(r, " &lt;/head&gt;\n &lt;body&gt;\n", NULL);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-static const char *cmd_add_alt(cmd_parms *cmd, void *d, const char *alt,</div><div class='del'>-                               const char *to)</div><div class='del'>-{</div><div class='del'>-        if (cmd-&gt;info == BY_PATH) {</div><div class='del'>-                if (!strcmp(to, "**DIRECTORY**")) {</div><div class='del'>-                        to = "^^DIRECTORY^^";</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='del'>-        if (cmd-&gt;info == BY_ENCODING) {</div><div class='del'>-                char *tmp = apr_pstrdup(cmd-&gt;pool, to);</div><div class='del'>-                ap_str_tolower(tmp);</div><div class='del'>-                to = tmp;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        push_item(((glusterfs_dir_config_t *) d)-&gt;alt_list, cmd-&gt;info, to,</div><div class='del'>-                  cmd-&gt;path, alt);</div><div class='del'>-        return NULL;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-static const char *cmd_add_icon(cmd_parms *cmd, void *d, const char *icon,</div><div class='del'>-                                const char *to)</div><div class='del'>-{</div><div class='del'>-        char *iconbak = apr_pstrdup(cmd-&gt;pool, icon);</div><div class='del'>-        char *alt = NULL, *cl = NULL, *tmp = NULL;</div><div class='del'>-</div><div class='del'>-        if (icon[0] == '(') {</div><div class='del'>-                cl = strchr(iconbak, ')');</div><div class='del'>-</div><div class='del'>-                if (cl == NULL) {</div><div class='del'>-                        return "missing closing paren";</div><div class='del'>-                }</div><div class='del'>-                alt = ap_getword_nc(cmd-&gt;pool, &amp;iconbak, ',');</div><div class='del'>-                *cl = '\0';                             /* Lose closing paren */</div><div class='del'>-                cmd_add_alt(cmd, d, &amp;alt[1], to);</div><div class='del'>-        }</div><div class='del'>-        if (cmd-&gt;info == BY_PATH) {</div><div class='del'>-                if (!strcmp(to, "**DIRECTORY**")) {</div><div class='del'>-                        to = "^^DIRECTORY^^";</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='del'>-        if (cmd-&gt;info == BY_ENCODING) {</div><div class='del'>-                tmp = apr_pstrdup(cmd-&gt;pool, to);</div><div class='del'>-                ap_str_tolower(tmp);</div><div class='del'>-                to = tmp;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        push_item(((glusterfs_dir_config_t *) d)-&gt;icon_list, cmd-&gt;info, to,</div><div class='del'>-                  cmd-&gt;path, iconbak);</div><div class='del'>-        return NULL;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-static void *</div><div class='del'>-mod_glfs_create_dir_config(apr_pool_t *p, char *dirspec)</div><div class='del'>-{</div><div class='del'>-        glusterfs_dir_config_t *dir_config = NULL;</div><div class='del'>-</div><div class='del'>-        dir_config = (glusterfs_dir_config_t *) apr_pcalloc(p,</div><div class='del'>-                                                            sizeof(*dir_config));</div><div class='del'>-</div><div class='del'>-        dir_config-&gt;mount_dir = dirspec;</div><div class='del'>-        dir_config-&gt;logfile = dir_config-&gt;specfile = (char *)0;</div><div class='del'>-        dir_config-&gt;loglevel = "warning";</div><div class='del'>-        dir_config-&gt;cache_timeout = 0;</div><div class='del'>-        dir_config-&gt;buf = NULL;</div><div class='del'>-</div><div class='del'>-        /* mod_dir options init */</div><div class='del'>-        dir_config-&gt;index_names = NULL;</div><div class='del'>-        dir_config-&gt;do_slash = SLASH_UNSET;</div><div class='del'>-</div><div class='del'>-        /* autoindex options init */</div><div class='del'>-        dir_config-&gt;icon_width = 0;</div><div class='del'>-        dir_config-&gt;icon_height = 0;</div><div class='del'>-        dir_config-&gt;name_width = DEFAULT_NAME_WIDTH;</div><div class='del'>-        dir_config-&gt;name_adjust = K_UNSET;</div><div class='del'>-        dir_config-&gt;desc_width = DEFAULT_DESC_WIDTH;</div><div class='del'>-        dir_config-&gt;desc_adjust = K_UNSET;</div><div class='del'>-        dir_config-&gt;icon_list = apr_array_make(p, 4,</div><div class='del'>-                                               sizeof(struct mod_glfs_ai_item));</div><div class='del'>-        dir_config-&gt;alt_list = apr_array_make(p, 4,</div><div class='del'>-                                              sizeof(struct mod_glfs_ai_item));</div><div class='del'>-        dir_config-&gt;desc_list = apr_array_make(p, 4,</div><div class='del'>-                                               sizeof(mod_glfs_ai_desc_t));</div><div class='del'>-        dir_config-&gt;ign_list = apr_array_make(p, 4,</div><div class='del'>-                                              sizeof(struct mod_glfs_ai_item));</div><div class='del'>-        dir_config-&gt;hdr_list = apr_array_make(p, 4,</div><div class='del'>-                                              sizeof(struct mod_glfs_ai_item));</div><div class='del'>-        dir_config-&gt;rdme_list = apr_array_make(p, 4,</div><div class='del'>-                                               sizeof(struct mod_glfs_ai_item));</div><div class='del'>-        dir_config-&gt;opts = 0;</div><div class='del'>-        dir_config-&gt;incremented_opts = 0;</div><div class='del'>-        dir_config-&gt;decremented_opts = 0;</div><div class='del'>-        dir_config-&gt;default_keyid = '\0';</div><div class='del'>-        dir_config-&gt;default_direction = '\0';</div><div class='del'>-</div><div class='del'>-        return (void *) dir_config;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-static void *</div><div class='del'>-mod_glfs_merge_dir_config(apr_pool_t *p, void *parent_conf,</div><div class='del'>-                          void *newloc_conf)</div><div class='del'>-{</div><div class='del'>-        glusterfs_dir_config_t *new = NULL;</div><div class='del'>-        glusterfs_dir_config_t *add = NULL;</div><div class='del'>-        glusterfs_dir_config_t *base = NULL;</div><div class='del'>-</div><div class='del'>-        new = (glusterfs_dir_config_t *) </div><div class='del'>-                apr_pcalloc(p, sizeof(glusterfs_dir_config_t));</div><div class='del'>-        add = newloc_conf;</div><div class='del'>-        base = parent_conf;</div><div class='del'>-</div><div class='del'>-        if (add-&gt;logfile)</div><div class='del'>-                new-&gt;logfile = apr_pstrdup (p, add-&gt;logfile);</div><div class='del'>-</div><div class='del'>-        if (add-&gt;loglevel)</div><div class='del'>-                new-&gt;loglevel = apr_pstrdup (p, add-&gt;loglevel);</div><div class='del'>-</div><div class='del'>-        if (add-&gt;specfile)</div><div class='del'>-                new-&gt;specfile = apr_pstrdup (p, add-&gt;specfile);</div><div class='del'>-</div><div class='del'>-        if (add-&gt;mount_dir)</div><div class='del'>-                new-&gt;mount_dir = apr_pstrdup (p, add-&gt;mount_dir);</div><div class='del'>-</div><div class='del'>-        new-&gt;xattr_file_size = add-&gt;xattr_file_size;</div><div class='del'>-        new-&gt;cache_timeout = add-&gt;cache_timeout;</div><div class='del'>-        new-&gt;buf = add-&gt;buf;</div><div class='del'>-</div><div class='del'>-        /* mod_dir */</div><div class='del'>-        new-&gt;index_names = add-&gt;index_names ? </div><div class='del'>-                add-&gt;index_names : base-&gt;index_names;</div><div class='del'>-        new-&gt;do_slash =</div><div class='del'>-                (add-&gt;do_slash == SLASH_UNSET) ? base-&gt;do_slash : add-&gt;do_slash;</div><div class='del'>-</div><div class='del'>-        /* auto index */</div><div class='del'>-        new-&gt;default_icon = add-&gt;default_icon ? add-&gt;default_icon</div><div class='del'>-                : base-&gt;default_icon;</div><div class='del'>-        new-&gt;style_sheet = add-&gt;style_sheet ? add-&gt;style_sheet</div><div class='del'>-                : base-&gt;style_sheet;</div><div class='del'>-        new-&gt;icon_height = add-&gt;icon_height ? </div><div class='del'>-                add-&gt;icon_height : base-&gt;icon_height;</div><div class='del'>-        new-&gt;icon_width = add-&gt;icon_width ? add-&gt;icon_width : base-&gt;icon_width;</div><div class='del'>-</div><div class='del'>-        new-&gt;ctype = add-&gt;ctype ? add-&gt;ctype : base-&gt;ctype;</div><div class='del'>-        new-&gt;charset = add-&gt;charset ? add-&gt;charset : base-&gt;charset;</div><div class='del'>-</div><div class='del'>-        new-&gt;alt_list = apr_array_append(p, add-&gt;alt_list, base-&gt;alt_list);</div><div class='del'>-        new-&gt;ign_list = apr_array_append(p, add-&gt;ign_list, base-&gt;ign_list);</div><div class='del'>-        new-&gt;hdr_list = apr_array_append(p, add-&gt;hdr_list, base-&gt;hdr_list);</div><div class='del'>-        new-&gt;desc_list = apr_array_append(p, add-&gt;desc_list, base-&gt;desc_list);</div><div class='del'>-        new-&gt;icon_list = apr_array_append(p, add-&gt;icon_list, base-&gt;icon_list);</div><div class='del'>-        new-&gt;rdme_list = apr_array_append(p, add-&gt;rdme_list, base-&gt;rdme_list);</div><div class='del'>-        if (add-&gt;opts &amp; NO_OPTIONS) {</div><div class='del'>-                /*</div><div class='del'>-                 * If the current directory says 'no options' then we also</div><div class='del'>-                 * clear any incremental mods from being inheritable further down.</div><div class='del'>-                 */</div><div class='del'>-                new-&gt;opts = NO_OPTIONS;</div><div class='del'>-                new-&gt;incremented_opts = 0;</div><div class='del'>-                new-&gt;decremented_opts = 0;</div><div class='del'>-        }</div><div class='del'>-        else {</div><div class='del'>-                /*</div><div class='del'>-                 * If there were any nonincremental options selected for</div><div class='del'>-                 * this directory, they dominate and we don't inherit *anything.*</div><div class='del'>-                 * Contrariwise, we *do* inherit if the only settings here are</div><div class='del'>-                 * incremental ones.</div><div class='del'>-                 */</div><div class='del'>-                if (add-&gt;opts == 0) {</div><div class='del'>-                        new-&gt;incremented_opts = (base-&gt;incremented_opts</div><div class='del'>-                                                 | add-&gt;incremented_opts)</div><div class='del'>-                                &amp; ~add-&gt;decremented_opts;</div><div class='del'>-                        new-&gt;decremented_opts = (base-&gt;decremented_opts</div><div class='del'>-                                                 | add-&gt;decremented_opts);</div><div class='del'>-                        /*</div><div class='del'>-                         * We may have incremental settings, so make sure we </div><div class='del'>-                         * don't inadvertently inherit an IndexOptions None </div><div class='del'>-                         * from above.</div><div class='del'>-                         */</div><div class='del'>-                        new-&gt;opts = (base-&gt;opts &amp; ~NO_OPTIONS);</div><div class='del'>-                }</div><div class='del'>-                else {</div><div class='del'>-                        /*</div><div class='del'>-                         * There are local nonincremental settings, which clear</div><div class='del'>-                         * all inheritance from above.  They *are* the new </div><div class='del'>-                         * base settings.</div><div class='del'>-                         */</div><div class='del'>-                        new-&gt;opts = add-&gt;opts;;</div><div class='del'>-                }</div><div class='del'>-                /*</div><div class='del'>-                 * We're guaranteed that there'll be no overlap between</div><div class='del'>-                 * the add-options and the remove-options.</div><div class='del'>-                 */</div><div class='del'>-                new-&gt;opts |= new-&gt;incremented_opts;</div><div class='del'>-                new-&gt;opts &amp;= ~new-&gt;decremented_opts;</div><div class='del'>-        }</div><div class='del'>-        /*</div><div class='del'>-         * Inherit the NameWidth settings if there aren't any specific to</div><div class='del'>-         * the new location; otherwise we'll end up using the defaults set </div><div class='del'>-         * in the config-rec creation routine.</div><div class='del'>-         */</div><div class='del'>-        if (add-&gt;name_adjust == K_UNSET) {</div><div class='del'>-                new-&gt;name_width = base-&gt;name_width;</div><div class='del'>-                new-&gt;name_adjust = base-&gt;name_adjust;</div><div class='del'>-        }</div><div class='del'>-        else {</div><div class='del'>-                new-&gt;name_width = add-&gt;name_width;</div><div class='del'>-                new-&gt;name_adjust = add-&gt;name_adjust;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        /*</div><div class='del'>-         * Likewise for DescriptionWidth.</div><div class='del'>-         */</div><div class='del'>-        if (add-&gt;desc_adjust == K_UNSET) {</div><div class='del'>-                new-&gt;desc_width = base-&gt;desc_width;</div><div class='del'>-                new-&gt;desc_adjust = base-&gt;desc_adjust;</div><div class='del'>-        }</div><div class='del'>-        else {</div><div class='del'>-                new-&gt;desc_width = add-&gt;desc_width;</div><div class='del'>-                new-&gt;desc_adjust = add-&gt;desc_adjust;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        new-&gt;default_keyid = add-&gt;default_keyid ? add-&gt;default_keyid</div><div class='del'>-                : base-&gt;default_keyid;</div><div class='del'>-        new-&gt;default_direction = add-&gt;default_direction ? add-&gt;default_direction</div><div class='del'>-                : base-&gt;default_direction;</div><div class='del'>-</div><div class='del'>-        return (void *) new;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-static void </div><div class='del'>-mod_glfs_child_init(apr_pool_t *p, server_rec *s)</div><div class='del'>-{</div><div class='del'>-        int                      i = 0, num_sec = 0, ret = 0;</div><div class='del'>-        core_server_config      *sconf = NULL;</div><div class='del'>-        ap_conf_vector_t       **sec_ent = NULL;</div><div class='del'>-        glusterfs_dir_config_t  *dir_config = NULL;</div><div class='del'>-        glusterfs_init_params_t  ctx = {0, };</div><div class='del'>-  </div><div class='del'>-        sconf = (core_server_config *) ap_get_module_config (s-&gt;module_config,</div><div class='del'>-                                                             &amp;core_module);</div><div class='del'>-        sec_ent = (ap_conf_vector_t **) sconf-&gt;sec_url-&gt;elts;</div><div class='del'>-        num_sec = sconf-&gt;sec_url-&gt;nelts;</div><div class='del'>-</div><div class='del'>-        for (i = 0; i &lt; num_sec; i++) {</div><div class='del'>-                dir_config = ap_get_module_config (sec_ent[i],</div><div class='del'>-                                                   &amp;glusterfs_module);</div><div class='del'>-</div><div class='del'>-                if (dir_config) {</div><div class='del'>-                        memset (&amp;ctx, 0, sizeof (ctx));</div><div class='del'>-</div><div class='del'>-                        ctx.logfile = dir_config-&gt;logfile;</div><div class='del'>-                        ctx.loglevel = dir_config-&gt;loglevel;</div><div class='del'>-                        ctx.lookup_timeout = dir_config-&gt;cache_timeout;</div><div class='del'>-                        ctx.stat_timeout = dir_config-&gt;cache_timeout;</div><div class='del'>-                        ctx.specfile = dir_config-&gt;specfile;</div><div class='del'>-</div><div class='del'>-                        ret = glusterfs_mount (dir_config-&gt;mount_dir, &amp;ctx);</div><div class='del'>-                        if (ret != 0) {</div><div class='del'>-                                ap_log_error(APLOG_MARK, APLOG_ERR,</div><div class='del'>-                                             APR_EGENERAL, s, </div><div class='del'>-                                             "mod_glfs_child_init: "</div><div class='del'>-                                             "glusterfs_init failed, check "</div><div class='del'>-                                             "glusterfs logfile %s for more "</div><div class='del'>-                                             "details", </div><div class='del'>-                                             dir_config-&gt;logfile);</div><div class='del'>-                        }</div><div class='del'>-                }</div><div class='del'>-                dir_config = NULL;</div><div class='del'>-        }</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-static void </div><div class='del'>-mod_glfs_child_exit(server_rec *s, apr_pool_t *p)</div><div class='del'>-{</div><div class='del'>-        int                      i = 0, num_sec = 0;</div><div class='del'>-        core_server_config      *sconf = NULL;</div><div class='del'>-        ap_conf_vector_t       **sec_ent = NULL;</div><div class='del'>-        glusterfs_dir_config_t  *dir_config = NULL;</div><div class='del'>-        glusterfs_init_params_t  ctx = {0, };</div><div class='del'>-</div><div class='del'>-        sconf = ap_get_module_config(s-&gt;module_config,</div><div class='del'>-                                     &amp;core_module);</div><div class='del'>-        sec_ent = (ap_conf_vector_t **) sconf-&gt;sec_url-&gt;elts;</div><div class='del'>-        num_sec = sconf-&gt;sec_url-&gt;nelts;</div><div class='del'>-        for (i = 0; i &lt; num_sec; i++) {</div><div class='del'>-                dir_config = ap_get_module_config (sec_ent[i],</div><div class='del'>-                                                   &amp;glusterfs_module);</div><div class='del'>-                if (dir_config) {</div><div class='del'>-                        glusterfs_umount (dir_config-&gt;mount_dir);</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-static apr_filetype_e filetype_from_mode(mode_t mode)</div><div class='del'>-{</div><div class='del'>-        apr_filetype_e type = APR_NOFILE;</div><div class='del'>-</div><div class='del'>-        if (S_ISREG(mode))</div><div class='del'>-                type = APR_REG;</div><div class='del'>-        else if (S_ISDIR(mode))</div><div class='del'>-                type = APR_DIR;</div><div class='del'>-        else if (S_ISCHR(mode))</div><div class='del'>-                type = APR_CHR;</div><div class='del'>-        else if (S_ISBLK(mode))</div><div class='del'>-                type = APR_BLK;</div><div class='del'>-        else if (S_ISFIFO(mode))</div><div class='del'>-                type = APR_PIPE;</div><div class='del'>-        else if (S_ISLNK(mode))</div><div class='del'>-                type = APR_LNK;</div><div class='del'>-        else if (S_ISSOCK(mode))</div><div class='del'>-                type = APR_SOCK;</div><div class='del'>-        else</div><div class='del'>-                type = APR_UNKFILE;</div><div class='del'>-        return type;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-static void fill_out_finfo(apr_finfo_t *finfo, struct stat *info,</div><div class='del'>-                           apr_int32_t wanted)</div><div class='del'>-{ </div><div class='del'>-        finfo-&gt;valid = APR_FINFO_MIN | APR_FINFO_IDENT | APR_FINFO_NLINK</div><div class='del'>-                | APR_FINFO_OWNER | APR_FINFO_PROT;</div><div class='del'>-        finfo-&gt;protection = apr_unix_mode2perms(info-&gt;st_mode);</div><div class='del'>-        finfo-&gt;filetype = filetype_from_mode(info-&gt;st_mode);</div><div class='del'>-        finfo-&gt;user = info-&gt;st_uid;</div><div class='del'>-        finfo-&gt;group = info-&gt;st_gid;</div><div class='del'>-        finfo-&gt;size = info-&gt;st_size;</div><div class='del'>-        finfo-&gt;device = info-&gt;st_dev;</div><div class='del'>-        finfo-&gt;nlink = info-&gt;st_nlink;</div><div class='del'>-</div><div class='del'>-        /* Check for overflow if storing a 64-bit st_ino in a 32-bit</div><div class='del'>-         * apr_ino_t for LFS builds: */</div><div class='del'>-        if (sizeof(apr_ino_t) &gt;= sizeof(info-&gt;st_ino)</div><div class='del'>-            || (apr_ino_t)info-&gt;st_ino == info-&gt;st_ino) {</div><div class='del'>-                finfo-&gt;inode = info-&gt;st_ino;</div><div class='del'>-        } else {</div><div class='del'>-                finfo-&gt;valid &amp;= ~APR_FINFO_INODE;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        apr_time_ansi_put(&amp;finfo-&gt;atime, info-&gt;st_atime);</div><div class='del'>-#ifdef HAVE_STRUCT_STAT_ST_ATIM_TV_NSEC</div><div class='del'>-        finfo-&gt;atime += info-&gt;st_atim.tv_nsec / APR_TIME_C(1000);</div><div class='del'>-#elif defined(HAVE_STRUCT_STAT_ST_ATIMENSEC)</div><div class='del'>-        finfo-&gt;atime += info-&gt;st_atimensec / APR_TIME_C(1000);</div><div class='del'>-#elif defined(HAVE_STRUCT_STAT_ST_ATIME_N)</div><div class='del'>-        finfo-&gt;ctime += info-&gt;st_atime_n / APR_TIME_C(1000);</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-        apr_time_ansi_put(&amp;finfo-&gt;mtime, info-&gt;st_mtime);</div><div class='del'>-#ifdef HAVE_STRUCT_STAT_ST_MTIM_TV_NSEC</div><div class='del'>-        finfo-&gt;mtime += info-&gt;st_mtim.tv_nsec / APR_TIME_C(1000);</div><div class='del'>-#elif defined(HAVE_STRUCT_STAT_ST_MTIMENSEC)</div><div class='del'>-        finfo-&gt;mtime += info-&gt;st_mtimensec / APR_TIME_C(1000);</div><div class='del'>-#elif defined(HAVE_STRUCT_STAT_ST_MTIME_N)</div><div class='del'>-        finfo-&gt;ctime += info-&gt;st_mtime_n / APR_TIME_C(1000);</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-        apr_time_ansi_put(&amp;finfo-&gt;ctime, info-&gt;st_ctime);</div><div class='del'>-#ifdef HAVE_STRUCT_STAT_ST_CTIM_TV_NSEC</div><div class='del'>-        finfo-&gt;ctime += info-&gt;st_ctim.tv_nsec / APR_TIME_C(1000);</div><div class='del'>-#elif defined(HAVE_STRUCT_STAT_ST_CTIMENSEC)</div><div class='del'>-        finfo-&gt;ctime += info-&gt;st_ctimensec / APR_TIME_C(1000);</div><div class='del'>-#elif defined(HAVE_STRUCT_STAT_ST_CTIME_N)</div><div class='del'>-        finfo-&gt;ctime += info-&gt;st_ctime_n / APR_TIME_C(1000);</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-#ifdef HAVE_STRUCT_STAT_ST_BLOCKS</div><div class='del'>-#ifdef DEV_BSIZE</div><div class='del'>-        finfo-&gt;csize = (apr_off_t)info-&gt;st_blocks * (apr_off_t)DEV_BSIZE;</div><div class='del'>-#else</div><div class='del'>-        finfo-&gt;csize = (apr_off_t)info-&gt;st_blocks * (apr_off_t)512;</div><div class='del'>-#endif</div><div class='del'>-        finfo-&gt;valid |= APR_FINFO_CSIZE;</div><div class='del'>-#endif</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-static int </div><div class='del'>-mod_glfs_map_to_storage(request_rec *r)</div><div class='del'>-{</div><div class='del'>-        glusterfs_dir_config_t *dir_config = NULL, *tmp = NULL;</div><div class='del'>-        int                     access_status = 0, ret = 0;</div><div class='del'>-        char                   *path = NULL;</div><div class='del'>-        struct stat             st = {0, };</div><div class='del'>-        core_server_config     *sconf = NULL;</div><div class='del'>-        ap_conf_vector_t      **sec_ent = NULL;</div><div class='del'>-        int                     num_sec = 0, i = 0;</div><div class='del'>-</div><div class='del'>-        sconf = (core_server_config *) ap_get_module_config (r-&gt;server-&gt;module_config,</div><div class='del'>-                                                             &amp;core_module);</div><div class='del'>-        sec_ent = (ap_conf_vector_t **) sconf-&gt;sec_url-&gt;elts;</div><div class='del'>-        num_sec = sconf-&gt;sec_url-&gt;nelts;</div><div class='del'>-</div><div class='del'>-        for (i = 0; i &lt; num_sec; i++) {</div><div class='del'>-                tmp = ap_get_module_config (sec_ent[i], &amp;glusterfs_module);</div><div class='del'>-</div><div class='del'>-                if (tmp &amp;&amp; !strncmp (tmp-&gt;mount_dir, r-&gt;uri,</div><div class='del'>-                                     strlen (tmp-&gt;mount_dir))) {</div><div class='del'>-                        if (!dir_config || </div><div class='del'>-                            strlen (tmp-&gt;mount_dir) </div><div class='del'>-                            &gt; strlen (dir_config-&gt;mount_dir)) {</div><div class='del'>-                                dir_config = tmp;</div><div class='del'>-                        }</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (dir_config &amp;&amp; dir_config-&gt;mount_dir </div><div class='del'>-            &amp;&amp; !(strncmp (apr_pstrcat (r-&gt;pool, dir_config-&gt;mount_dir, "/",</div><div class='del'>-                                       NULL), r-&gt;uri,</div><div class='del'>-                          strlen (dir_config-&gt;mount_dir) + 1)</div><div class='del'>-                 &amp;&amp; !r-&gt;handler)) </div><div class='del'>-                r-&gt;handler = GLUSTERFS_HANDLER;</div><div class='del'>-</div><div class='del'>-        if (!r-&gt;handler || (r-&gt;handler &amp;&amp; strcmp (r-&gt;handler,</div><div class='del'>-                                                  GLUSTERFS_HANDLER)))</div><div class='del'>-                return DECLINED;</div><div class='del'>-</div><div class='del'>-        path = r-&gt;uri;</div><div class='del'>-</div><div class='del'>-        memset (&amp;r-&gt;finfo, 0, sizeof (r-&gt;finfo));</div><div class='del'>-</div><div class='del'>-        dir_config-&gt;buf = calloc (1, dir_config-&gt;xattr_file_size);</div><div class='del'>-        if (!dir_config-&gt;buf) {</div><div class='del'>-                return HTTP_INTERNAL_SERVER_ERROR;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        ret = glusterfs_get (path, dir_config-&gt;buf, </div><div class='del'>-                             dir_config-&gt;xattr_file_size, &amp;st);</div><div class='del'>-</div><div class='del'>-        if (ret == -1 || st.st_size &gt; dir_config-&gt;xattr_file_size </div><div class='del'>-            || S_ISDIR (st.st_mode)) {</div><div class='del'>-                free (dir_config-&gt;buf);</div><div class='del'>-                dir_config-&gt;buf = NULL;</div><div class='del'>-</div><div class='del'>-                if (ret == -1) {</div><div class='del'>-                        int error = HTTP_NOT_FOUND;</div><div class='del'>-                        char *emsg = NULL;</div><div class='del'>-                        if (r-&gt;path_info == NULL) {</div><div class='del'>-                                emsg = apr_pstrcat(r-&gt;pool, strerror (errno),</div><div class='del'>-                                                   r-&gt;filename, NULL);</div><div class='del'>-                        }</div><div class='del'>-                        else {</div><div class='del'>-                                emsg = apr_pstrcat(r-&gt;pool, strerror (errno),</div><div class='del'>-                                                   r-&gt;filename, r-&gt;path_info,</div><div class='del'>-                                                   NULL);</div><div class='del'>-                        }</div><div class='del'>-                        ap_log_rerror(APLOG_MARK, APLOG_ERR|APLOG_NOERRNO, 0,</div><div class='del'>-                                      r, "%s", emsg);</div><div class='del'>-                        if (errno != ENOENT) {</div><div class='del'>-                                error = HTTP_INTERNAL_SERVER_ERROR;</div><div class='del'>-                        }</div><div class='del'>-                        return error;</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        r-&gt;finfo.pool = r-&gt;pool;</div><div class='del'>-        r-&gt;finfo.fname = r-&gt;filename;</div><div class='del'>-        fill_out_finfo (&amp;r-&gt;finfo, &amp;st, </div><div class='del'>-                        APR_FINFO_MIN | APR_FINFO_IDENT | APR_FINFO_NLINK |</div><div class='del'>-                        APR_FINFO_OWNER | APR_FINFO_PROT);</div><div class='del'>-                        </div><div class='del'>-        /* allow core module to run directory_walk() and location_walk() */</div><div class='del'>-        return DECLINED;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-static int </div><div class='del'>-mod_glfs_readv_async_cbk (int32_t op_ret, int32_t op_errno,</div><div class='del'>-                          glusterfs_iobuf_t *buf, void *cbk_data)</div><div class='del'>-{</div><div class='del'>-        glusterfs_async_local_t *local = cbk_data;</div><div class='del'>-</div><div class='del'>-        pthread_mutex_lock (&amp;local-&gt;lock);</div><div class='del'>-        {</div><div class='del'>-                local-&gt;async_read_complete = 1;</div><div class='del'>-                local-&gt;buf = buf;</div><div class='del'>-                local-&gt;op_ret = op_ret;</div><div class='del'>-                local-&gt;op_errno = op_errno;</div><div class='del'>-                pthread_cond_signal (&amp;local-&gt;cond);</div><div class='del'>-        }</div><div class='del'>-        pthread_mutex_unlock (&amp;local-&gt;lock);</div><div class='del'>-</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-/* use read_async just to avoid memcpy of read buffer in libglusterfsclient */</div><div class='del'>-static int</div><div class='del'>-mod_glfs_read_async (request_rec *r, apr_bucket_brigade *bb,</div><div class='del'>-                     glusterfs_file_t fd,</div><div class='del'>-                     apr_off_t offset, apr_off_t length)</div><div class='del'>-{</div><div class='del'>-        glusterfs_async_local_t local = {0, };</div><div class='del'>-        off_t                   end = 0;</div><div class='del'>-        int                     nbytes = 0, complete = 0;</div><div class='del'>-        conn_rec               *c = r-&gt;connection;</div><div class='del'>-        apr_bucket             *e = NULL;</div><div class='del'>-        apr_status_t            status = APR_SUCCESS;</div><div class='del'>-        glusterfs_iobuf_t      *buf = NULL;</div><div class='del'>-                </div><div class='del'>-        if (length == 0) {</div><div class='del'>-                return 0;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        pthread_cond_init (&amp;local.cond, NULL);</div><div class='del'>-        pthread_mutex_init (&amp;local.lock, NULL);</div><div class='del'>-  </div><div class='del'>-        memset (&amp;local, 0, sizeof (local));</div><div class='del'>-        local.request = r;</div><div class='del'>-</div><div class='del'>-        if (length &gt; 0)</div><div class='del'>-                end = offset + length;</div><div class='del'>-</div><div class='del'>-        do {</div><div class='del'>-                if (length &gt; 0) {</div><div class='del'>-                        nbytes = end - offset;</div><div class='del'>-                        if (nbytes &gt; GLUSTERFS_CHUNK_SIZE)</div><div class='del'>-                                nbytes = GLUSTERFS_CHUNK_SIZE;</div><div class='del'>-                } else</div><div class='del'>-                        nbytes = GLUSTERFS_CHUNK_SIZE;</div><div class='del'>-</div><div class='del'>-                glusterfs_read_async(fd, </div><div class='del'>-                                     nbytes,</div><div class='del'>-                                     offset,</div><div class='del'>-                                     mod_glfs_readv_async_cbk,</div><div class='del'>-                                     (void *)&amp;local);</div><div class='del'>-</div><div class='del'>-                pthread_mutex_lock (&amp;local.lock);</div><div class='del'>-                {</div><div class='del'>-                        while (!local.async_read_complete) {</div><div class='del'>-                                pthread_cond_wait (&amp;local.cond, &amp;local.lock);</div><div class='del'>-                        }</div><div class='del'>-</div><div class='del'>-                        local.async_read_complete = 0;</div><div class='del'>-                        buf = local.buf;</div><div class='del'>-</div><div class='del'>-                        if (length &lt; 0)</div><div class='del'>-                                complete = (local.op_ret &lt;= 0);</div><div class='del'>-                        else {</div><div class='del'>-                                local.read_bytes += local.op_ret;</div><div class='del'>-                                complete = ((local.read_bytes == length) ||</div><div class='del'>-                                            (local.op_ret &lt; 0));</div><div class='del'>-                        }</div><div class='del'>-                }</div><div class='del'>-                pthread_mutex_unlock (&amp;local.lock);</div><div class='del'>-</div><div class='del'>-                if (!bb) {</div><div class='del'>-                        bb = apr_brigade_create (r-&gt;pool, c-&gt;bucket_alloc); </div><div class='del'>-                }</div><div class='del'>-                apr_brigade_writev (bb, NULL, NULL, buf-&gt;vector, buf-&gt;count);</div><div class='del'>-</div><div class='del'>-                /* </div><div class='del'>-                 * make sure all the data is written out, since we call </div><div class='del'>-                 * glusterfs_free on buf once ap_pass_brigade returns</div><div class='del'>-                 */</div><div class='del'>-                e = apr_bucket_flush_create (c-&gt;bucket_alloc);</div><div class='del'>-                APR_BRIGADE_INSERT_TAIL (bb, e);</div><div class='del'>-</div><div class='del'>-                status = ap_pass_brigade (r-&gt;output_filters, bb);</div><div class='del'>-                if (status != APR_SUCCESS) {</div><div class='del'>-                        /* no way to know what type of error occurred */</div><div class='del'>-                        ap_log_rerror(APLOG_MARK, APLOG_DEBUG, status, r,</div><div class='del'>-                                      "mod_glfs_handler: ap_pass_brigade "</div><div class='del'>-                                      "returned %i",</div><div class='del'>-                                      status);</div><div class='del'>-                        complete = 1;</div><div class='del'>-                        local.op_ret = -1;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                glusterfs_free (buf);</div><div class='del'>-</div><div class='del'>-                /* </div><div class='del'>-                 * bb has already been cleaned up by core_output_filter, </div><div class='del'>-                 * just being paranoid</div><div class='del'>-                 */</div><div class='del'>-                apr_brigade_cleanup (bb);</div><div class='del'>-</div><div class='del'>-                offset += nbytes;</div><div class='del'>-        } while (!complete);</div><div class='del'>-</div><div class='del'>-        return (local.op_ret &lt; 0 ? HTTP_INTERNAL_SERVER_ERROR : OK);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-static int </div><div class='del'>-parse_byterange(char *range, apr_off_t clength,</div><div class='del'>-                apr_off_t *start, apr_off_t *end)</div><div class='del'>-{</div><div class='del'>-        char       *dash = NULL, *errp = NULL;</div><div class='del'>-        apr_off_t   number;</div><div class='del'>-</div><div class='del'>-        dash = strchr(range, '-');</div><div class='del'>-        if (!dash) {</div><div class='del'>-                return 0;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if ((dash == range)) {</div><div class='del'>-                /* In the form "-5" */</div><div class='del'>-                if (apr_strtoff(&amp;number, dash+1, &amp;errp, 10) || *errp) {</div><div class='del'>-                        return 0;</div><div class='del'>-                }</div><div class='del'>-                *start = clength - number;</div><div class='del'>-                *end = clength - 1; </div><div class='del'>-        }</div><div class='del'>-        else {</div><div class='del'>-                *dash++ = '\0';</div><div class='del'>-                if (apr_strtoff(&amp;number, range, &amp;errp, 10) || *errp) {</div><div class='del'>-                        return 0;</div><div class='del'>-                }</div><div class='del'>-                *start = number;</div><div class='del'>-                if (*dash) {</div><div class='del'>-                        if (apr_strtoff(&amp;number, dash, &amp;errp, 10) || *errp) {</div><div class='del'>-                                return 0;</div><div class='del'>-                        }</div><div class='del'>-                        *end = number;</div><div class='del'>-                }</div><div class='del'>-                else {                  /* "5-" */</div><div class='del'>-                        *end = clength - 1;</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (*start &lt; 0) {</div><div class='del'>-                *start = 0;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (*end &gt;= clength) {</div><div class='del'>-                *end = clength - 1;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (*start &gt; *end) {</div><div class='del'>-                return -1;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        return (*start &gt; 0 || *end &lt; clength);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-static int use_range_x(request_rec *r)</div><div class='del'>-{</div><div class='del'>-        const char *ua = NULL;</div><div class='del'>-        return (apr_table_get(r-&gt;headers_in, "Request-Range")</div><div class='del'>-                || ((ua = apr_table_get(r-&gt;headers_in, "User-Agent"))</div><div class='del'>-                    &amp;&amp; ap_strstr_c(ua, "MSIE 3")));</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-static int ap_set_byterange(request_rec *r)</div><div class='del'>-{</div><div class='del'>-        const char *range = NULL, *if_range = NULL, *match = NULL, *ct = NULL;</div><div class='del'>-        int         num_ranges = 0;</div><div class='del'>-</div><div class='del'>-        if (r-&gt;assbackwards) {</div><div class='del'>-                return 0;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        /* Check for Range request-header (HTTP/1.1) or Request-Range for</div><div class='del'>-         * backwards-compatibility with second-draft Luotonen/Franks</div><div class='del'>-         * byte-ranges (e.g. Netscape Navigator 2-3).</div><div class='del'>-         *</div><div class='del'>-         * We support this form, with Request-Range, and (farther down) we</div><div class='del'>-         * send multipart/x-byteranges instead of multipart/byteranges for</div><div class='del'>-         * Request-Range based requests to work around a bug in Netscape</div><div class='del'>-         * Navigator 2-3 and MSIE 3.</div><div class='del'>-         */</div><div class='del'>-</div><div class='del'>-        if (!(range = apr_table_get(r-&gt;headers_in, "Range"))) {</div><div class='del'>-                range = apr_table_get(r-&gt;headers_in, "Request-Range");</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (!range || strncasecmp(range, "bytes=", 6) || r-&gt;status != HTTP_OK) {</div><div class='del'>-                return 0;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        /* is content already a single range? */</div><div class='del'>-        if (apr_table_get(r-&gt;headers_out, "Content-Range")) {</div><div class='del'>-                return 0;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        /* is content already a multiple range? */</div><div class='del'>-        if ((ct = apr_table_get(r-&gt;headers_out, "Content-Type"))</div><div class='del'>-            &amp;&amp; (!strncasecmp(ct, "multipart/byteranges", 20)</div><div class='del'>-                || !strncasecmp(ct, "multipart/x-byteranges", 22))) {</div><div class='del'>-                return 0;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        /* Check the If-Range header for Etag or Date.</div><div class='del'>-         * Note that this check will return false (as required) if either</div><div class='del'>-         * of the two etags are weak.</div><div class='del'>-         */</div><div class='del'>-        if ((if_range = apr_table_get(r-&gt;headers_in, "If-Range"))) {</div><div class='del'>-                if (if_range[0] == '"') {</div><div class='del'>-                        if (!(match = apr_table_get(r-&gt;headers_out, "Etag"))</div><div class='del'>-                            || (strcmp(if_range, match) != 0)) {</div><div class='del'>-                                return 0;</div><div class='del'>-                        }</div><div class='del'>-                }</div><div class='del'>-                else if (!(match = apr_table_get(r-&gt;headers_out,</div><div class='del'>-                                                 "Last-Modified"))</div><div class='del'>-                         || (strcmp(if_range, match) != 0)) {</div><div class='del'>-                        return 0;</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (!ap_strchr_c(range, ',')) {</div><div class='del'>-                /* a single range */</div><div class='del'>-                num_ranges = 1;</div><div class='del'>-        }</div><div class='del'>-        else {</div><div class='del'>-                /* a multiple range */</div><div class='del'>-                num_ranges = 2;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        r-&gt;status = HTTP_PARTIAL_CONTENT;</div><div class='del'>-        r-&gt;range = range + 6;</div><div class='del'>-</div><div class='del'>-        return num_ranges;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-static void</div><div class='del'>-mod_glfs_handle_byte_ranges (request_rec *r, glusterfs_file_t fd,</div><div class='del'>-                             int num_ranges)</div><div class='del'>-{</div><div class='del'>-        conn_rec           *c = r-&gt;connection;</div><div class='del'>-        char               *ts = NULL, *boundary = NULL, *bound_head = NULL;</div><div class='del'>-        const char         *orig_ct = NULL;</div><div class='del'>-        char               *current = NULL, *end = NULL;</div><div class='del'>-        apr_bucket_brigade *bsend = NULL;</div><div class='del'>-        apr_bucket         *e = NULL;</div><div class='del'>-        apr_off_t           range_start, range_end;</div><div class='del'>-        apr_status_t        rv = APR_SUCCESS;</div><div class='del'>-        char                found = 0;</div><div class='del'>-        apr_bucket         *e2 = NULL, *ec = NULL;</div><div class='del'>-</div><div class='del'>-        orig_ct = ap_make_content_type (r, r-&gt;content_type);</div><div class='del'>-</div><div class='del'>-        if (num_ranges &gt; 1) {</div><div class='del'>-                boundary = apr_psprintf(r-&gt;pool, "%" APR_UINT64_T_HEX_FMT "%lx",</div><div class='del'>-                                        (apr_uint64_t)r-&gt;request_time,</div><div class='del'>-                                        (long) getpid());</div><div class='del'>-</div><div class='del'>-                ap_set_content_type(r, apr_pstrcat(r-&gt;pool, "multipart",</div><div class='del'>-                                                   use_range_x(r) ? "/x-" : "/",</div><div class='del'>-                                                   "byteranges; boundary=",</div><div class='del'>-                                                   boundary, NULL));</div><div class='del'>-</div><div class='del'>-                if (strcasecmp(orig_ct, NO_CONTENT_TYPE)) {</div><div class='del'>-                        bound_head = apr_pstrcat(r-&gt;pool,</div><div class='del'>-                                                 CRLF "--", boundary,</div><div class='del'>-                                                 CRLF "Content-type: ",</div><div class='del'>-                                                 orig_ct,</div><div class='del'>-                                                 CRLF "Content-range: bytes ",</div><div class='del'>-                                                 NULL);</div><div class='del'>-                }</div><div class='del'>-                else {</div><div class='del'>-                        /* if we have no type for the content, do our best */</div><div class='del'>-                        bound_head = apr_pstrcat(r-&gt;pool,</div><div class='del'>-                                                 CRLF "--", boundary,</div><div class='del'>-                                                 CRLF "Content-range: bytes ",</div><div class='del'>-                                                 NULL);</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        while ((current = ap_getword(r-&gt;pool, &amp;r-&gt;range, ','))</div><div class='del'>-               &amp;&amp; (rv = parse_byterange(current, r-&gt;finfo.size, &amp;range_start,</div><div class='del'>-                                        &amp;range_end))) {</div><div class='del'>-                bsend = NULL;</div><div class='del'>-                if (rv == -1) {</div><div class='del'>-                        continue;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                found = 1;</div><div class='del'>-</div><div class='del'>-                /* For single range requests, we must produce Content-Range </div><div class='del'>-                 * header. Otherwise, we need to produce the multipart </div><div class='del'>-                 * boundaries.</div><div class='del'>-                 */</div><div class='del'>-                if (num_ranges == 1) {</div><div class='del'>-                        apr_table_setn(r-&gt;headers_out, "Content-Range",</div><div class='del'>-                                       apr_psprintf(r-&gt;pool,</div><div class='del'>-                                                    "bytes " BYTERANGE_FMT,</div><div class='del'>-                                                    range_start, range_end,</div><div class='del'>-                                                    r-&gt;finfo.size));</div><div class='del'>-                }</div><div class='del'>-                else {</div><div class='del'>-                        /* this brigade holds what we will be sending */</div><div class='del'>-                        bsend = apr_brigade_create(r-&gt;pool, c-&gt;bucket_alloc);</div><div class='del'>-</div><div class='del'>-                        e = apr_bucket_pool_create(bound_head,</div><div class='del'>-                                                   strlen(bound_head),</div><div class='del'>-                                                   r-&gt;pool, c-&gt;bucket_alloc);</div><div class='del'>-                        APR_BRIGADE_INSERT_TAIL(bsend, e);</div><div class='del'>-</div><div class='del'>-                        ts = apr_psprintf(r-&gt;pool, BYTERANGE_FMT CRLF CRLF,</div><div class='del'>-                                          range_start, range_end,</div><div class='del'>-                                          r-&gt;finfo.size);</div><div class='del'>-                        e = apr_bucket_pool_create(ts, strlen(ts), r-&gt;pool,</div><div class='del'>-                                                   c-&gt;bucket_alloc);</div><div class='del'>-                        APR_BRIGADE_INSERT_TAIL(bsend, e);</div><div class='del'>-                }</div><div class='del'>-                mod_glfs_read_async (r, bsend, fd, range_start,</div><div class='del'>-                                     (range_end + 1 - range_start));</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        bsend = apr_brigade_create (r-&gt;pool, c-&gt;bucket_alloc);</div><div class='del'>-</div><div class='del'>-        if (found == 0) {</div><div class='del'>-                r-&gt;status = HTTP_OK;</div><div class='del'>-                /* bsend is assumed to be empty if we get here. */</div><div class='del'>-                e = ap_bucket_error_create(HTTP_RANGE_NOT_SATISFIABLE, NULL,</div><div class='del'>-                                           r-&gt;pool, c-&gt;bucket_alloc);</div><div class='del'>-                APR_BRIGADE_INSERT_TAIL(bsend, e);</div><div class='del'>-                e = apr_bucket_eos_create(c-&gt;bucket_alloc);</div><div class='del'>-                APR_BRIGADE_INSERT_TAIL(bsend, e);</div><div class='del'>-                ap_pass_brigade (r-&gt;output_filters, bsend);</div><div class='del'>-                return;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (num_ranges &gt; 1) {</div><div class='del'>-                /* add the final boundary */</div><div class='del'>-                end = apr_pstrcat(r-&gt;pool, CRLF "--", boundary, "--" CRLF,</div><div class='del'>-                                  NULL);</div><div class='del'>-//                ap_xlate_proto_to_ascii(end, strlen(end));</div><div class='del'>-                e = apr_bucket_pool_create(end, strlen(end), r-&gt;pool,</div><div class='del'>-                                           c-&gt;bucket_alloc);</div><div class='del'>-                APR_BRIGADE_INSERT_TAIL(bsend, e);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        ap_pass_brigade (r-&gt;output_filters, bsend);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-/****************************************************************</div><div class='del'>- *</div><div class='del'>- * Looking things up in config entries...</div><div class='del'>- */</div><div class='del'>-</div><div class='del'>-/* Structure used to hold entries when we're actually building an index */</div><div class='del'>-</div><div class='del'>-struct ent {</div><div class='del'>-        char       *name;</div><div class='del'>-        char       *icon;</div><div class='del'>-        char       *alt;</div><div class='del'>-        char       *desc;</div><div class='del'>-        apr_off_t   size;</div><div class='del'>-        apr_time_t  lm;</div><div class='del'>-        struct ent *next;</div><div class='del'>-        int         ascending, ignore_case, version_sort;</div><div class='del'>-        char        key;</div><div class='del'>-        int         isdir;</div><div class='del'>-};</div><div class='del'>-</div><div class='del'>-static char *find_item(request_rec *r, apr_array_header_t *list, int path_only)</div><div class='del'>-{</div><div class='del'>-        const char              *content_type = NULL;</div><div class='del'>-        const char              *content_encoding = NULL;</div><div class='del'>-        char                    *path = NULL;</div><div class='del'>-        int                      i = 0;</div><div class='del'>-        struct mod_glfs_ai_item *items = NULL;</div><div class='del'>-        struct mod_glfs_ai_item *p = NULL;</div><div class='del'>-</div><div class='del'>-        content_type = ap_field_noparam(r-&gt;pool, r-&gt;content_type);</div><div class='del'>-        content_encoding = r-&gt;content_encoding;</div><div class='del'>-        path = r-&gt;filename;</div><div class='del'>-        items = (struct mod_glfs_ai_item *) list-&gt;elts;</div><div class='del'>-</div><div class='del'>-        for (i = 0; i &lt; list-&gt;nelts; ++i) {</div><div class='del'>-                p = &amp;items[i];</div><div class='del'>-                /* Special cased for ^^DIRECTORY^^ and ^^BLANKICON^^ */</div><div class='del'>-                if ((path[0] == '^') || (!ap_strcmp_match(path,</div><div class='del'>-                                                          p-&gt;apply_path))) {</div><div class='del'>-                        if (!*(p-&gt;apply_to)) {</div><div class='del'>-                                return p-&gt;data;</div><div class='del'>-                        }</div><div class='del'>-                        else if (p-&gt;type == BY_PATH || path[0] == '^') {</div><div class='del'>-                                if (!ap_strcmp_match(path, p-&gt;apply_to)) {</div><div class='del'>-                                        return p-&gt;data;</div><div class='del'>-                                }</div><div class='del'>-                        }</div><div class='del'>-                        else if (!path_only) {</div><div class='del'>-                                if (!content_encoding) {</div><div class='del'>-                                        if (p-&gt;type == BY_TYPE) {</div><div class='del'>-                                                if (content_type</div><div class='del'>-                                                    &amp;&amp; !ap_strcasecmp_match(content_type,</div><div class='del'>-                                                                            p-&gt;apply_to)) {</div><div class='del'>-                                                        return p-&gt;data;</div><div class='del'>-                                                }</div><div class='del'>-                                        }</div><div class='del'>-                                }</div><div class='del'>-                                else {</div><div class='del'>-                                        if (p-&gt;type == BY_ENCODING) {</div><div class='del'>-                                                if (!ap_strcasecmp_match(content_encoding,</div><div class='del'>-                                                                         p-&gt;apply_to)) {</div><div class='del'>-                                                        return p-&gt;data;</div><div class='del'>-                                                }</div><div class='del'>-                                        }</div><div class='del'>-                                }</div><div class='del'>-                        }</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='del'>-        return NULL;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-#define find_icon(d,p,t) find_item(p,d-&gt;icon_list,t)</div><div class='del'>-#define find_alt(d,p,t) find_item(p,d-&gt;alt_list,t)</div><div class='del'>-#define find_header(d,p) find_item(p,d-&gt;hdr_list,0)</div><div class='del'>-#define find_readme(d,p) find_item(p,d-&gt;rdme_list,0)</div><div class='del'>-</div><div class='del'>-static char *find_default_item(char *bogus_name, apr_array_header_t *list)</div><div class='del'>-{</div><div class='del'>-        request_rec r;</div><div class='del'>-        /* Bleah.  I tried to clean up find_item, and it lead to this bit</div><div class='del'>-         * of ugliness.   Note that the fields initialized are precisely</div><div class='del'>-         * those that find_item looks at...</div><div class='del'>-         */</div><div class='del'>-        r.filename = bogus_name;</div><div class='del'>-        r.content_type = r.content_encoding = NULL;</div><div class='del'>-        return find_item(&amp;r, list, 1);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-#define find_default_icon(d,n) find_default_item(n, d-&gt;icon_list)</div><div class='del'>-#define find_default_alt(d,n) find_default_item(n, d-&gt;alt_list)</div><div class='del'>-</div><div class='del'>-/*</div><div class='del'>- * Look through the list of pattern/description pairs and return the first one</div><div class='del'>- * if any) that matches the filename in the request.  If multiple patterns</div><div class='del'>- * match, only the first one is used; since the order in the array is the</div><div class='del'>- * same as the order in which directives were processed, earlier matching</div><div class='del'>- * directives will dominate.</div><div class='del'>- */</div><div class='del'>-</div><div class='del'>-#ifdef CASE_BLIND_FILESYSTEM</div><div class='del'>-#define MATCH_FLAGS APR_FNM_CASE_BLIND</div><div class='del'>-#else</div><div class='del'>-#define MATCH_FLAGS 0</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-static char *find_desc(glusterfs_dir_config_t *dcfg, const char *filename_full)</div><div class='del'>-{</div><div class='del'>-        int                 i = 0;</div><div class='del'>-        mod_glfs_ai_desc_t *list = NULL;</div><div class='del'>-        const char         *filename_only = NULL, *filename = NULL;</div><div class='del'>-        mod_glfs_ai_desc_t *tuple = &amp;list[i];</div><div class='del'>-        int                 found = 0;</div><div class='del'>-</div><div class='del'>-        list = (mod_glfs_ai_desc_t *) dcfg-&gt;desc_list-&gt;elts;</div><div class='del'>-        /*</div><div class='del'>-         * If the filename includes a path, extract just the name itself</div><div class='del'>-         * for the simple matches.</div><div class='del'>-         */</div><div class='del'>-        if ((filename_only = ap_strrchr_c(filename_full, '/')) == NULL) {</div><div class='del'>-                filename_only = filename_full;</div><div class='del'>-        }</div><div class='del'>-        else {</div><div class='del'>-                filename_only++;</div><div class='del'>-        }</div><div class='del'>-        for (i = 0; i &lt; dcfg-&gt;desc_list-&gt;nelts; ++i) {</div><div class='del'>-                /*</div><div class='del'>-                 * Only use the full-path filename if the pattern contains '/'s.</div><div class='del'>-                 */</div><div class='del'>-                filename = (tuple-&gt;full_path) ? filename_full : filename_only;</div><div class='del'>-                /*</div><div class='del'>-                 * Make the comparison using the cheapest method; only do</div><div class='del'>-                 * wildcard checking if we must.</div><div class='del'>-                 */</div><div class='del'>-                if (tuple-&gt;wildcards) {</div><div class='del'>-                        found = (apr_fnmatch(tuple-&gt;pattern, filename,</div><div class='del'>-                                             MATCH_FLAGS) == 0);</div><div class='del'>-                }</div><div class='del'>-                else {</div><div class='del'>-                        found = (ap_strstr_c(filename, tuple-&gt;pattern) != NULL);</div><div class='del'>-                }</div><div class='del'>-                if (found) {</div><div class='del'>-                        return tuple-&gt;description;</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='del'>-        return NULL;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-static int ignore_entry(glusterfs_dir_config_t *d, char *path)</div><div class='del'>-{</div><div class='del'>-        apr_array_header_t      *list = d-&gt;ign_list;</div><div class='del'>-        struct mod_glfs_ai_item *items = (struct mod_glfs_ai_item *) list-&gt;elts;</div><div class='del'>-        char                    *tt = NULL, *ap = NULL;</div><div class='del'>-        int                      i = 0;</div><div class='del'>-        struct mod_glfs_ai_item *p = &amp;items[i];</div><div class='del'>-</div><div class='del'>-        if ((tt = strrchr(path, '/')) == NULL) {</div><div class='del'>-                tt = path;</div><div class='del'>-        }</div><div class='del'>-        else {</div><div class='del'>-                tt++;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        for (i = 0; i &lt; list-&gt;nelts; ++i) {</div><div class='del'>-                p = &amp;items[i];</div><div class='del'>-                if ((ap = strrchr(p-&gt;apply_to, '/')) == NULL) {</div><div class='del'>-                        ap = p-&gt;apply_to;</div><div class='del'>-                }</div><div class='del'>-                else {</div><div class='del'>-                        ap++;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-#ifndef CASE_BLIND_FILESYSTEM</div><div class='del'>-                if (!ap_strcmp_match(path, p-&gt;apply_path)</div><div class='del'>-                    &amp;&amp; !ap_strcmp_match(tt, ap)) {</div><div class='del'>-                        return 1;</div><div class='del'>-                }</div><div class='del'>-#else  /* !CASE_BLIND_FILESYSTEM */</div><div class='del'>-                /*</div><div class='del'>-                 * On some platforms, the match must be case-blind.  This is really</div><div class='del'>-                 * a factor of the filesystem involved, but we can't detect that</div><div class='del'>-                 * reliably - so we have to granularise at the OS level.</div><div class='del'>-                 */</div><div class='del'>-                if (!ap_strcasecmp_match(path, p-&gt;apply_path)</div><div class='del'>-                    &amp;&amp; !ap_strcasecmp_match(tt, ap)) {</div><div class='del'>-                        return 1;</div><div class='del'>-                }</div><div class='del'>-#endif /* !CASE_BLIND_FILESYSTEM */</div><div class='del'>-        }</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-/*****************************************************************</div><div class='del'>- *</div><div class='del'>- * Actually generating output</div><div class='del'>- */</div><div class='del'>-</div><div class='del'>-/*</div><div class='del'>- * Elements of the emitted document:</div><div class='del'>- *      Preamble</div><div class='del'>- *              Emitted unless SUPPRESS_PREAMBLE is set AND ap_run_sub_req</div><div class='del'>- *              succeeds for the (content_type == text/html) header file.</div><div class='del'>- *      Header file</div><div class='del'>- *              Emitted if found (and able).</div><div class='del'>- *      H1 tag line</div><div class='del'>- *              Emitted if a header file is NOT emitted.</div><div class='del'>- *      Directory stuff</div><div class='del'>- *              Always emitted.</div><div class='del'>- *      HR</div><div class='del'>- *              Emitted if FANCY_INDEXING is set.</div><div class='del'>- *      Readme file</div><div class='del'>- *              Emitted if found (and able).</div><div class='del'>- *      ServerSig</div><div class='del'>- *              Emitted if ServerSignature is not Off AND a readme file</div><div class='del'>- *              is NOT emitted.</div><div class='del'>- *      Postamble</div><div class='del'>- *              Emitted unless SUPPRESS_PREAMBLE is set AND ap_run_sub_req</div><div class='del'>- *              succeeds for the (content_type == text/html) readme file.</div><div class='del'>- */</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-/*</div><div class='del'>- * emit a plain text file</div><div class='del'>- */</div><div class='del'>-static void do_emit_plain(request_rec *r, apr_file_t *f)</div><div class='del'>-{</div><div class='del'>-        char         buf[AP_IOBUFSIZE + 1];</div><div class='del'>-        int          ch = 0;</div><div class='del'>-        apr_size_t   i = 0, c = 0, n = 0;</div><div class='del'>-        apr_status_t rv = APR_SUCCESS;</div><div class='del'>-</div><div class='del'>-        ap_rputs("&lt;pre&gt;\n", r);</div><div class='del'>-        while (!apr_file_eof(f)) {</div><div class='del'>-                do {</div><div class='del'>-                        n = sizeof(char) * AP_IOBUFSIZE;</div><div class='del'>-                        rv = apr_file_read(f, buf, &amp;n);</div><div class='del'>-                } while (APR_STATUS_IS_EINTR(rv));</div><div class='del'>-                if (n == 0 || rv != APR_SUCCESS) {</div><div class='del'>-                        /* ###: better error here? */</div><div class='del'>-                        break;</div><div class='del'>-                }</div><div class='del'>-                buf[n] = '\0';</div><div class='del'>-                c = 0;</div><div class='del'>-                while (c &lt; n) {</div><div class='del'>-                        for (i = c; i &lt; n; i++) {</div><div class='del'>-                                if (buf[i] == '&lt;' || buf[i] == '&gt;'</div><div class='del'>-                                    || buf[i] == '&amp;') {</div><div class='del'>-                                        break;</div><div class='del'>-                                }</div><div class='del'>-                        }</div><div class='del'>-                        ch = buf[i];</div><div class='del'>-                        buf[i] = '\0';</div><div class='del'>-                        ap_rputs(&amp;buf[c], r);</div><div class='del'>-                        if (ch == '&lt;') {</div><div class='del'>-                                ap_rputs("&amp;lt;", r);</div><div class='del'>-                        }</div><div class='del'>-                        else if (ch == '&gt;') {</div><div class='del'>-                                ap_rputs("&amp;gt;", r);</div><div class='del'>-                        }</div><div class='del'>-                        else if (ch == '&amp;') {</div><div class='del'>-                                ap_rputs("&amp;amp;", r);</div><div class='del'>-                        }</div><div class='del'>-                        c = i + 1;</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='del'>-        ap_rputs("&lt;/pre&gt;\n", r);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-/*</div><div class='del'>- * Handle the preamble through the H1 tag line, inclusive.  Locate</div><div class='del'>- * the file with a subrequests.  Process text/html documents by actually</div><div class='del'>- * running the subrequest; text/xxx documents get copied verbatim,</div><div class='del'>- * and any other content type is ignored.  This means that a non-text</div><div class='del'>- * document (such as HEADER.gif) might get multiviewed as the result</div><div class='del'>- * instead of a text document, meaning nothing will be displayed, but</div><div class='del'>- * oh well.</div><div class='del'>- */</div><div class='del'>-static void emit_head(request_rec *r, char *header_fname, int suppress_amble,</div><div class='del'>-                      int emit_xhtml, char *title)</div><div class='del'>-{</div><div class='del'>-        apr_table_t *hdrs = r-&gt;headers_in;</div><div class='del'>-        apr_file_t  *f = NULL;</div><div class='del'>-        request_rec *rr = NULL;</div><div class='del'>-        int          emit_amble = 1;</div><div class='del'>-        int          emit_H1 = 1;</div><div class='del'>-        const char  *r_accept = NULL;</div><div class='del'>-        const char  *r_accept_enc = NULL;</div><div class='del'>-</div><div class='del'>-        /*</div><div class='del'>-         * If there's a header file, send a subrequest to look for it.  If it's</div><div class='del'>-         * found and html do the subrequest, otherwise handle it</div><div class='del'>-         */</div><div class='del'>-        r_accept = apr_table_get(hdrs, "Accept");</div><div class='del'>-        r_accept_enc = apr_table_get(hdrs, "Accept-Encoding");</div><div class='del'>-        apr_table_setn(hdrs, "Accept", "text/html, text/plain");</div><div class='del'>-        apr_table_unset(hdrs, "Accept-Encoding");</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-        if ((header_fname != NULL) &amp;&amp; r-&gt;args) {</div><div class='del'>-                header_fname = apr_pstrcat(r-&gt;pool, header_fname, "?", r-&gt;args,</div><div class='del'>-                                           NULL);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if ((header_fname != NULL)</div><div class='del'>-            &amp;&amp; (rr = ap_sub_req_lookup_uri(header_fname, r, r-&gt;output_filters))</div><div class='del'>-            &amp;&amp; (rr-&gt;status == HTTP_OK)</div><div class='del'>-            &amp;&amp; (rr-&gt;filename != NULL)</div><div class='del'>-            &amp;&amp; (rr-&gt;finfo.filetype == APR_REG)) {</div><div class='del'>-                /*</div><div class='del'>-                 * Check for the two specific cases we allow: text/html and</div><div class='del'>-                 * text/anything-else.  The former is allowed to be processed for</div><div class='del'>-                 * SSIs.</div><div class='del'>-                 */</div><div class='del'>-                if (rr-&gt;content_type != NULL) {</div><div class='del'>-                        if (!strcasecmp(ap_field_noparam(r-&gt;pool,</div><div class='del'>-                                                         rr-&gt;content_type),</div><div class='del'>-                                        "text/html")) {</div><div class='del'>-                                ap_filter_t *f = NULL;</div><div class='del'>-        </div><div class='del'>-                                /* Hope everything will work... */</div><div class='del'>-                                emit_amble = 0;</div><div class='del'>-                                emit_H1 = 0;</div><div class='del'>-</div><div class='del'>-                                if (! suppress_amble) {</div><div class='del'>-                                        emit_preamble(r, emit_xhtml, title);</div><div class='del'>-                                }</div><div class='del'>-                                /* This is a hack, but I can't find any better </div><div class='del'>-                                 * way to do this. The problem is that we have </div><div class='del'>-                                 * already created the sub-request,</div><div class='del'>-                                 * but we just inserted the OLD_WRITE filter, </div><div class='del'>-                                 * and the sub-request needs to pass its data </div><div class='del'>-                                 * through the OLD_WRITE filter, or things go </div><div class='del'>-                                 * horribly wrong (missing data, data in</div><div class='del'>-                                 * the wrong order, etc).  To fix it, if you </div><div class='del'>-                                 * create a sub-request and then insert the </div><div class='del'>-                                 * OLD_WRITE filter before you run the request, </div><div class='del'>-                                 * you need to make sure that the sub-request</div><div class='del'>-                                 * data goes through the OLD_WRITE filter.  Just</div><div class='del'>-                                 * steal this code.  The long-term solution is </div><div class='del'>-                                 * to remove the ap_r* functions.</div><div class='del'>-                                 */</div><div class='del'>-                                for (f=rr-&gt;output_filters;</div><div class='del'>-                                     f-&gt;frec != ap_subreq_core_filter_handle;</div><div class='del'>-                                     f = f-&gt;next);</div><div class='del'>-                                f-&gt;next = r-&gt;output_filters;</div><div class='del'>-</div><div class='del'>-                                /*</div><div class='del'>-                                 * If there's a problem running the subrequest, </div><div class='del'>-                                 * display the preamble if we didn't do it </div><div class='del'>-                                 * before -- the header file didn't get displayed.</div><div class='del'>-                                 */</div><div class='del'>-                                if (ap_run_sub_req(rr) != OK) {</div><div class='del'>-                                        /* It didn't work */</div><div class='del'>-                                        emit_amble = suppress_amble;</div><div class='del'>-                                        emit_H1 = 1;</div><div class='del'>-                                }</div><div class='del'>-                        }</div><div class='del'>-                        else if (!strncasecmp("text/", rr-&gt;content_type, 5)) {</div><div class='del'>-                                /*</div><div class='del'>-                                 * If we can open the file, prefix it with the </div><div class='del'>-                                 * preamble regardless; since we'll be sending </div><div class='del'>-                                 * a &lt;pre&gt; block around the file's contents, </div><div class='del'>-                                 * any HTML header it had won't end up</div><div class='del'>-                                 * where it belongs.</div><div class='del'>-                                 */</div><div class='del'>-                                if (apr_file_open(&amp;f, rr-&gt;filename, APR_READ,</div><div class='del'>-                                                  APR_OS_DEFAULT, r-&gt;pool) </div><div class='del'>-                                    == APR_SUCCESS) {</div><div class='del'>-                                        emit_preamble(r, emit_xhtml, title);</div><div class='del'>-                                        emit_amble = 0;</div><div class='del'>-                                        do_emit_plain(r, f);</div><div class='del'>-                                        apr_file_close(f);</div><div class='del'>-                                        emit_H1 = 0;</div><div class='del'>-                                }</div><div class='del'>-                        }</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (r_accept) {</div><div class='del'>-                apr_table_setn(hdrs, "Accept", r_accept);</div><div class='del'>-        }</div><div class='del'>-        else {</div><div class='del'>-                apr_table_unset(hdrs, "Accept");</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (r_accept_enc) {</div><div class='del'>-                apr_table_setn(hdrs, "Accept-Encoding", r_accept_enc);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (emit_amble) {</div><div class='del'>-                emit_preamble(r, emit_xhtml, title);</div><div class='del'>-        }</div><div class='del'>-        if (emit_H1) {</div><div class='del'>-                ap_rvputs(r, "&lt;h1&gt;Index of ", title, "&lt;/h1&gt;\n", NULL);</div><div class='del'>-        }</div><div class='del'>-        if (rr != NULL) {</div><div class='del'>-                ap_destroy_sub_req(rr);</div><div class='del'>-        }</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-/*</div><div class='del'>- * Handle the Readme file through the postamble, inclusive.  Locate</div><div class='del'>- * the file with a subrequests.  Process text/html documents by actually</div><div class='del'>- * running the subrequest; text/xxx documents get copied verbatim,</div><div class='del'>- * and any other content type is ignored.  This means that a non-text</div><div class='del'>- * document (such as FOOTER.gif) might get multiviewed as the result</div><div class='del'>- * instead of a text document, meaning nothing will be displayed, but</div><div class='del'>- * oh well.</div><div class='del'>- */</div><div class='del'>-static void emit_tail(request_rec *r, char *readme_fname, int suppress_amble)</div><div class='del'>-{</div><div class='del'>-        apr_file_t  *f = NULL;</div><div class='del'>-        request_rec *rr = NULL;</div><div class='del'>-        int          suppress_post = 0, suppress_sig = 0;</div><div class='del'>-</div><div class='del'>-        /*</div><div class='del'>-         * If there's a readme file, send a subrequest to look for it.  If it's</div><div class='del'>-         * found and a text file, handle it -- otherwise fall through and</div><div class='del'>-         * pretend there's nothing there.</div><div class='del'>-         */</div><div class='del'>-        if ((readme_fname != NULL)</div><div class='del'>-            &amp;&amp; (rr = ap_sub_req_lookup_uri(readme_fname, r, r-&gt;output_filters))</div><div class='del'>-            &amp;&amp; (rr-&gt;status == HTTP_OK)</div><div class='del'>-            &amp;&amp; (rr-&gt;filename != NULL)</div><div class='del'>-            &amp;&amp; rr-&gt;finfo.filetype == APR_REG) {</div><div class='del'>-                /*</div><div class='del'>-                 * Check for the two specific cases we allow: text/html and</div><div class='del'>-                 * text/anything-else.  The former is allowed to be processed for</div><div class='del'>-                 * SSIs.</div><div class='del'>-                 */</div><div class='del'>-                if (rr-&gt;content_type != NULL) {</div><div class='del'>-                        if (!strcasecmp(ap_field_noparam(r-&gt;pool,</div><div class='del'>-                                                         rr-&gt;content_type),</div><div class='del'>-                                        "text/html")) {</div><div class='del'>-                                ap_filter_t *f;</div><div class='del'>-                                for (f=rr-&gt;output_filters;</div><div class='del'>-                                     f-&gt;frec != ap_subreq_core_filter_handle;</div><div class='del'>-                                     f = f-&gt;next);</div><div class='del'>-                                f-&gt;next = r-&gt;output_filters;</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-                                if (ap_run_sub_req(rr) == OK) {</div><div class='del'>-                                        /* worked... */</div><div class='del'>-                                        suppress_sig = 1;</div><div class='del'>-                                        suppress_post = suppress_amble;</div><div class='del'>-                                }</div><div class='del'>-                        }</div><div class='del'>-                        else if (!strncasecmp("text/", rr-&gt;content_type, 5)) {</div><div class='del'>-                                /*</div><div class='del'>-                                 * If we can open the file, suppress the signature.</div><div class='del'>-                                 */</div><div class='del'>-                                if (apr_file_open(&amp;f, rr-&gt;filename, APR_READ,</div><div class='del'>-                                                  APR_OS_DEFAULT, r-&gt;pool)</div><div class='del'>-                                    == APR_SUCCESS) {</div><div class='del'>-                                        do_emit_plain(r, f);</div><div class='del'>-                                        apr_file_close(f);</div><div class='del'>-                                        suppress_sig = 1;</div><div class='del'>-                                }</div><div class='del'>-                        }</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (!suppress_sig) {</div><div class='del'>-                ap_rputs(ap_psignature("", r), r);</div><div class='del'>-        }</div><div class='del'>-        if (!suppress_post) {</div><div class='del'>-                ap_rputs("&lt;/body&gt;&lt;/html&gt;\n", r);</div><div class='del'>-        }</div><div class='del'>-        if (rr != NULL) {</div><div class='del'>-                ap_destroy_sub_req(rr);</div><div class='del'>-        }</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-static char *find_title(request_rec *r)</div><div class='del'>-{</div><div class='del'>-        char        titlebuf[MAX_STRING_LEN], *find = "&lt;title&gt;";</div><div class='del'>-        apr_file_t *thefile = NULL;</div><div class='del'>-        int         x = 0, y = 0, p = 0;</div><div class='del'>-        apr_size_t  n;</div><div class='del'>-</div><div class='del'>-        if (r-&gt;status != HTTP_OK) {</div><div class='del'>-                return NULL;</div><div class='del'>-        }</div><div class='del'>-        if ((r-&gt;content_type != NULL)</div><div class='del'>-            &amp;&amp; (!strcasecmp(ap_field_noparam(r-&gt;pool, r-&gt;content_type),</div><div class='del'>-                            "text/html")</div><div class='del'>-                || !strcmp(r-&gt;content_type, INCLUDES_MAGIC_TYPE))</div><div class='del'>-            &amp;&amp; !r-&gt;content_encoding) {</div><div class='del'>-                if (apr_file_open(&amp;thefile, r-&gt;filename, APR_READ,</div><div class='del'>-                                  APR_OS_DEFAULT, r-&gt;pool) != APR_SUCCESS) {</div><div class='del'>-                        return NULL;</div><div class='del'>-                }</div><div class='del'>-                n = sizeof(char) * (MAX_STRING_LEN - 1);</div><div class='del'>-                apr_file_read(thefile, titlebuf, &amp;n);</div><div class='del'>-                if (n &lt;= 0) {</div><div class='del'>-                        apr_file_close(thefile);</div><div class='del'>-                        return NULL;</div><div class='del'>-                }</div><div class='del'>-                titlebuf[n] = '\0';</div><div class='del'>-                for (x = 0, p = 0; titlebuf[x]; x++) {</div><div class='del'>-                        if (apr_tolower(titlebuf[x]) == find[p]) {</div><div class='del'>-                                if (!find[++p]) {</div><div class='del'>-                                        if ((p = ap_ind(&amp;titlebuf[++x], '&lt;'))</div><div class='del'>-                                            != -1) {</div><div class='del'>-                                                titlebuf[x + p] = '\0';</div><div class='del'>-                                        }</div><div class='del'>-                                        /* Scan for line breaks for Tanmoy's </div><div class='del'>-                                           secretary</div><div class='del'>-                                        */</div><div class='del'>-                                        for (y = x; titlebuf[y]; y++) {</div><div class='del'>-                                                if ((titlebuf[y] == CR) </div><div class='del'>-                                                    || (titlebuf[y] == LF)) {</div><div class='del'>-                                                        if (y == x) {</div><div class='del'>-                                                                x++;</div><div class='del'>-                                                        }</div><div class='del'>-                                                        else {</div><div class='del'>-                                                                titlebuf[y] = ' ';</div><div class='del'>-                                                        }</div><div class='del'>-                                                }</div><div class='del'>-                                        }</div><div class='del'>-                                        apr_file_close(thefile);</div><div class='del'>-                                        return apr_pstrdup(r-&gt;pool,</div><div class='del'>-                                                           &amp;titlebuf[x]);</div><div class='del'>-                                }</div><div class='del'>-                        }</div><div class='del'>-                        else {</div><div class='del'>-                                p = 0;</div><div class='del'>-                        }</div><div class='del'>-                }</div><div class='del'>-                apr_file_close(thefile);</div><div class='del'>-        }</div><div class='del'>-        return NULL;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-static struct ent *make_parent_entry(apr_int32_t autoindex_opts,</div><div class='del'>-                                     glusterfs_dir_config_t *d,</div><div class='del'>-                                     request_rec *r, char keyid,</div><div class='del'>-                                     char direction)</div><div class='del'>-{</div><div class='del'>-        struct ent *p = NULL;</div><div class='del'>-        char       *testpath = NULL;</div><div class='del'>-        /*</div><div class='del'>-         * p-&gt;name is now the true parent URI.</div><div class='del'>-         * testpath is a crafted lie, so that the syntax '/some/..'</div><div class='del'>-         * (or simply '..')be used to describe 'up' from '/some/'</div><div class='del'>-         * when processeing IndexIgnore, and Icon|Alt|Desc configs.</div><div class='del'>-         */</div><div class='del'>-</div><div class='del'>-        p = (struct ent *) apr_pcalloc(r-&gt;pool, sizeof(struct ent));</div><div class='del'>-        /* The output has always been to the parent.  Don't make ourself</div><div class='del'>-         * our own parent (worthless cyclical reference).</div><div class='del'>-         */</div><div class='del'>-        if (!(p-&gt;name = ap_make_full_path(r-&gt;pool, r-&gt;uri, "../"))) {</div><div class='del'>-                return (NULL);</div><div class='del'>-        }</div><div class='del'>-        ap_getparents(p-&gt;name);</div><div class='del'>-        if (!*p-&gt;name) {</div><div class='del'>-                return (NULL);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        /* IndexIgnore has always compared "/thispath/.." */</div><div class='del'>-        testpath = ap_make_full_path(r-&gt;pool, r-&gt;filename, "..");</div><div class='del'>-        if (ignore_entry(d, testpath)) {</div><div class='del'>-                return (NULL);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        p-&gt;size = -1;</div><div class='del'>-        p-&gt;lm = -1;</div><div class='del'>-        p-&gt;key = apr_toupper(keyid);</div><div class='del'>-        p-&gt;ascending = (apr_toupper(direction) == D_ASCENDING);</div><div class='del'>-        p-&gt;version_sort = autoindex_opts &amp; VERSION_SORT;</div><div class='del'>-        if (autoindex_opts &amp; FANCY_INDEXING) {</div><div class='del'>-                if (!(p-&gt;icon = find_default_icon(d, testpath))) {</div><div class='del'>-                        p-&gt;icon = find_default_icon(d, "^^DIRECTORY^^");</div><div class='del'>-                }</div><div class='del'>-                if (!(p-&gt;alt = find_default_alt(d, testpath))) {</div><div class='del'>-                        if (!(p-&gt;alt = find_default_alt(d, "^^DIRECTORY^^"))) {</div><div class='del'>-                                p-&gt;alt = "DIR";</div><div class='del'>-                        }</div><div class='del'>-                }</div><div class='del'>-                p-&gt;desc = find_desc(d, testpath);</div><div class='del'>-        }</div><div class='del'>-        return p;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-static struct ent *make_autoindex_entry(const apr_finfo_t *dirent,</div><div class='del'>-                                        int autoindex_opts,</div><div class='del'>-                                        glusterfs_dir_config_t *d,</div><div class='del'>-                                        request_rec *r, char keyid,</div><div class='del'>-                                        char direction,</div><div class='del'>-                                        const char *pattern)</div><div class='del'>-{</div><div class='del'>-        request_rec *rr = NULL;</div><div class='del'>-        struct ent  *p = NULL;</div><div class='del'>-        int          show_forbidden = 0;</div><div class='del'>-</div><div class='del'>-        /* Dot is ignored, Parent is handled by make_parent_entry() */</div><div class='del'>-        if ((dirent-&gt;name[0] == '.') &amp;&amp; (!dirent-&gt;name[1]</div><div class='del'>-                                         || ((dirent-&gt;name[1] == '.')</div><div class='del'>-                                             &amp;&amp; !dirent-&gt;name[2])))</div><div class='del'>-                return (NULL);</div><div class='del'>-</div><div class='del'>-        /*</div><div class='del'>-         * On some platforms, the match must be case-blind.  This is really</div><div class='del'>-         * a factor of the filesystem involved, but we can't detect that</div><div class='del'>-         * reliably - so we have to granularise at the OS level.</div><div class='del'>-         */</div><div class='del'>-        if (pattern &amp;&amp; (apr_fnmatch(pattern, dirent-&gt;name,</div><div class='del'>-                                    APR_FNM_NOESCAPE | APR_FNM_PERIOD</div><div class='del'>-#ifdef CASE_BLIND_FILESYSTEM</div><div class='del'>-                                    | APR_FNM_CASE_BLIND</div><div class='del'>-#endif</div><div class='del'>-                                )</div><div class='del'>-                        != APR_SUCCESS)) {</div><div class='del'>-                return (NULL);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (ignore_entry(d, ap_make_full_path(r-&gt;pool,</div><div class='del'>-                                              r-&gt;filename, dirent-&gt;name))) {</div><div class='del'>-                return (NULL);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (!(rr = ap_sub_req_lookup_dirent(dirent, r, AP_SUBREQ_NO_ARGS,</div><div class='del'>-                                            NULL))) {</div><div class='del'>-                return (NULL);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if((autoindex_opts &amp; SHOW_FORBIDDEN)</div><div class='del'>-           &amp;&amp; (rr-&gt;status == HTTP_UNAUTHORIZED</div><div class='del'>-               || rr-&gt;status == HTTP_FORBIDDEN)) {</div><div class='del'>-                show_forbidden = 1;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if ((rr-&gt;finfo.filetype != APR_DIR &amp;&amp; rr-&gt;finfo.filetype != APR_REG)</div><div class='del'>-            || !(rr-&gt;status == OK || ap_is_HTTP_SUCCESS(rr-&gt;status)</div><div class='del'>-                 || ap_is_HTTP_REDIRECT(rr-&gt;status)</div><div class='del'>-                 || show_forbidden == 1)) {</div><div class='del'>-                ap_destroy_sub_req(rr);</div><div class='del'>-                return (NULL);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        p = (struct ent *) apr_pcalloc(r-&gt;pool, sizeof(struct ent));</div><div class='del'>-        if (dirent-&gt;filetype == APR_DIR) {</div><div class='del'>-                p-&gt;name = apr_pstrcat(r-&gt;pool, dirent-&gt;name, "/", NULL);</div><div class='del'>-        }</div><div class='del'>-        else {</div><div class='del'>-                p-&gt;name = apr_pstrdup(r-&gt;pool, dirent-&gt;name);</div><div class='del'>-        }</div><div class='del'>-        p-&gt;size = -1;</div><div class='del'>-        p-&gt;icon = NULL;</div><div class='del'>-        p-&gt;alt = NULL;</div><div class='del'>-        p-&gt;desc = NULL;</div><div class='del'>-        p-&gt;lm = -1;</div><div class='del'>-        p-&gt;isdir = 0;</div><div class='del'>-        p-&gt;key = apr_toupper(keyid);</div><div class='del'>-        p-&gt;ascending = (apr_toupper(direction) == D_ASCENDING);</div><div class='del'>-        p-&gt;version_sort = !!(autoindex_opts &amp; VERSION_SORT);</div><div class='del'>-        p-&gt;ignore_case = !!(autoindex_opts &amp; IGNORE_CASE);</div><div class='del'>-</div><div class='del'>-        if (autoindex_opts &amp; (FANCY_INDEXING | TABLE_INDEXING)) {</div><div class='del'>-                p-&gt;lm = rr-&gt;finfo.mtime;</div><div class='del'>-                if (dirent-&gt;filetype == APR_DIR) {</div><div class='del'>-                        if (autoindex_opts &amp; FOLDERS_FIRST) {</div><div class='del'>-                                p-&gt;isdir = 1;</div><div class='del'>-                        }</div><div class='del'>-                        rr-&gt;filename = ap_make_dirstr_parent (rr-&gt;pool,</div><div class='del'>-                                                              rr-&gt;filename);</div><div class='del'>-</div><div class='del'>-                        /* omit the trailing slash (1.3 compat) */</div><div class='del'>-                        rr-&gt;filename[strlen(rr-&gt;filename) - 1] = '\0';</div><div class='del'>-</div><div class='del'>-                        if (!(p-&gt;icon = find_icon(d, rr, 1))) {</div><div class='del'>-                                p-&gt;icon = find_default_icon(d, "^^DIRECTORY^^");</div><div class='del'>-                        }</div><div class='del'>-                        if (!(p-&gt;alt = find_alt(d, rr, 1))) {</div><div class='del'>-                                if (!(p-&gt;alt = find_default_alt(d,</div><div class='del'>-                                                                "^^DIRECTORY^^"))) {</div><div class='del'>-                                        p-&gt;alt = "DIR";</div><div class='del'>-                                }</div><div class='del'>-                        }</div><div class='del'>-                }</div><div class='del'>-                else {</div><div class='del'>-                        p-&gt;icon = find_icon(d, rr, 0);</div><div class='del'>-                        p-&gt;alt = find_alt(d, rr, 0);</div><div class='del'>-                        p-&gt;size = rr-&gt;finfo.size;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                p-&gt;desc = find_desc(d, rr-&gt;filename);</div><div class='del'>-</div><div class='del'>-                if ((!p-&gt;desc) &amp;&amp; (autoindex_opts &amp; SCAN_HTML_TITLES)) {</div><div class='del'>-                        p-&gt;desc = apr_pstrdup(r-&gt;pool, find_title(rr));</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='del'>-        ap_destroy_sub_req(rr);</div><div class='del'>-        /*</div><div class='del'>-         * We don't need to take any special action for the file size key.</div><div class='del'>-         * If we did, it would go here.</div><div class='del'>-         */</div><div class='del'>-        if (keyid == K_LAST_MOD) {</div><div class='del'>-                if (p-&gt;lm &lt; 0) {</div><div class='del'>-                        p-&gt;lm = 0;</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='del'>-        return (p);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-static char *terminate_description(glusterfs_dir_config_t *d, char *desc,</div><div class='del'>-                                   apr_int32_t autoindex_opts, int desc_width)</div><div class='del'>-{</div><div class='del'>-        int          maxsize = desc_width;</div><div class='del'>-        register int x = 0;</div><div class='del'>-</div><div class='del'>-        /*</div><div class='del'>-         * If there's no DescriptionWidth in effect, default to the old</div><div class='del'>-         * behaviour of adjusting the description size depending upon</div><div class='del'>-         * what else is being displayed.  Otherwise, stick with the</div><div class='del'>-         * setting.</div><div class='del'>-         */</div><div class='del'>-        if (d-&gt;desc_adjust == K_UNSET) {</div><div class='del'>-                if (autoindex_opts &amp; SUPPRESS_ICON) {</div><div class='del'>-                        maxsize += 6;</div><div class='del'>-                }</div><div class='del'>-                if (autoindex_opts &amp; SUPPRESS_LAST_MOD) {</div><div class='del'>-                        maxsize += 19;</div><div class='del'>-                }</div><div class='del'>-                if (autoindex_opts &amp; SUPPRESS_SIZE) {</div><div class='del'>-                        maxsize += 7;</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='del'>-        for (x = 0; desc[x] &amp;&amp; ((maxsize &gt; 0) || (desc[x] == '&lt;')); x++) {</div><div class='del'>-                if (desc[x] == '&lt;') {</div><div class='del'>-                        while (desc[x] != '&gt;') {</div><div class='del'>-                                if (!desc[x]) {</div><div class='del'>-                                        maxsize = 0;</div><div class='del'>-                                        break;</div><div class='del'>-                                }</div><div class='del'>-                                ++x;</div><div class='del'>-                        }</div><div class='del'>-                }</div><div class='del'>-                else if (desc[x] == '&amp;') {</div><div class='del'>-                        /* entities like &amp;auml; count as one character */</div><div class='del'>-                        --maxsize;</div><div class='del'>-                        for ( ; desc[x] != ';'; ++x) {</div><div class='del'>-                                if (desc[x] == '\0') {</div><div class='del'>-                                        maxsize = 0;</div><div class='del'>-                                        break;</div><div class='del'>-                                }</div><div class='del'>-                        }</div><div class='del'>-                }</div><div class='del'>-                else {</div><div class='del'>-                        --maxsize;</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='del'>-        if (!maxsize &amp;&amp; desc[x] != '\0') {</div><div class='del'>-                desc[x - 1] = '&gt;';      /* Grump. */</div><div class='del'>-                desc[x] = '\0';         /* Double Grump! */</div><div class='del'>-        }</div><div class='del'>-        return desc;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-/*</div><div class='del'>- * Emit the anchor for the specified field.  If a field is the key for the</div><div class='del'>- * current request, the link changes its meaning to reverse the order when</div><div class='del'>- * selected again.  Non-active fields always start in ascending order.</div><div class='del'>- */</div><div class='del'>-static void emit_link(request_rec *r, const char *anchor, char column,</div><div class='del'>-                      char curkey, char curdirection,</div><div class='del'>-                      const char *colargs, int nosort)</div><div class='del'>-{</div><div class='del'>-        char qvalue[9];</div><div class='del'>-</div><div class='del'>-        if (!nosort) {</div><div class='del'>-</div><div class='del'>-                qvalue[0] = '?';</div><div class='del'>-                qvalue[1] = 'C';</div><div class='del'>-                qvalue[2] = '=';</div><div class='del'>-                qvalue[3] = column;</div><div class='del'>-                qvalue[4] = ';';</div><div class='del'>-                qvalue[5] = 'O';</div><div class='del'>-                qvalue[6] = '=';</div><div class='del'>-                /* reverse? */</div><div class='del'>-                qvalue[7] = ((curkey == column) &amp;&amp; (curdirection == D_ASCENDING))</div><div class='del'>-                        ? D_DESCENDING : D_ASCENDING;</div><div class='del'>-                qvalue[8] = '\0';</div><div class='del'>-                ap_rvputs(r, "&lt;a href=\"", qvalue, colargs ? colargs : "",</div><div class='del'>-                          "\"&gt;", anchor, "&lt;/a&gt;", NULL);</div><div class='del'>-        }</div><div class='del'>-        else {</div><div class='del'>-                ap_rputs(anchor, r);</div><div class='del'>-        }</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-static void output_directories(struct ent **ar, int n,</div><div class='del'>-                               glusterfs_dir_config_t *d, request_rec *r,</div><div class='del'>-                               apr_int32_t autoindex_opts, char keyid,</div><div class='del'>-                               char direction, const char *colargs)</div><div class='del'>-{</div><div class='del'>-        int            x = 0;</div><div class='del'>-        apr_size_t     rv = APR_SUCCESS;</div><div class='del'>-        char          *name = NULL, *tp = NULL;</div><div class='del'>-        int            static_columns = 0;</div><div class='del'>-        apr_pool_t    *scratch = NULL;</div><div class='del'>-        int            name_width = 0, desc_width = 0, cols = 0;</div><div class='del'>-        char          *name_scratch = NULL, *pad_scratch = NULL, *breakrow = "";</div><div class='del'>-        char          *anchor = NULL, *t = NULL, *t2 = NULL;</div><div class='del'>-        int            nwidth = 0;</div><div class='del'>-        char           time_str[MAX_STRING_LEN];</div><div class='del'>-        apr_time_exp_t ts = {0, };</div><div class='del'>-        char           buf[5];</div><div class='del'>-</div><div class='del'>-        name = r-&gt;uri;</div><div class='del'>-        static_columns = !!(autoindex_opts &amp; SUPPRESS_COLSORT);</div><div class='del'>-        apr_pool_create(&amp;scratch, r-&gt;pool);</div><div class='del'>-        if (name[0] == '\0') {</div><div class='del'>-                name = "/";</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        name_width = d-&gt;name_width;</div><div class='del'>-        desc_width = d-&gt;desc_width;</div><div class='del'>-</div><div class='del'>-        if ((autoindex_opts &amp; (FANCY_INDEXING | TABLE_INDEXING))</div><div class='del'>-            == FANCY_INDEXING) {</div><div class='del'>-                if (d-&gt;name_adjust == K_ADJUST) {</div><div class='del'>-                        for (x = 0; x &lt; n; x++) {</div><div class='del'>-                                int t = 0;</div><div class='del'>-                                t = strlen(ar[x]-&gt;name);</div><div class='del'>-                                if (t &gt; name_width) {</div><div class='del'>-                                        name_width = t;</div><div class='del'>-                                }</div><div class='del'>-                        }</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                if (d-&gt;desc_adjust == K_ADJUST) {</div><div class='del'>-                        for (x = 0; x &lt; n; x++) {</div><div class='del'>-                                if (ar[x]-&gt;desc != NULL) {</div><div class='del'>-                                        int t = 0;</div><div class='del'>-                                        t = strlen(ar[x]-&gt;desc);</div><div class='del'>-                                        if (t &gt; desc_width) {</div><div class='del'>-                                                desc_width = t;</div><div class='del'>-                                        }</div><div class='del'>-                                }</div><div class='del'>-                        }</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='del'>-        name_scratch = apr_palloc(r-&gt;pool, name_width + 1);</div><div class='del'>-        pad_scratch = apr_palloc(r-&gt;pool, name_width + 1);</div><div class='del'>-        memset(pad_scratch, ' ', name_width);</div><div class='del'>-        pad_scratch[name_width] = '\0';</div><div class='del'>-</div><div class='del'>-        if (autoindex_opts &amp; TABLE_INDEXING) {</div><div class='del'>-                cols = 1;</div><div class='del'>-                ap_rputs("&lt;table&gt;&lt;tr&gt;", r);</div><div class='del'>-                if (!(autoindex_opts &amp; SUPPRESS_ICON)) {</div><div class='del'>-                        ap_rputs("&lt;th&gt;", r);</div><div class='del'>-                        if ((tp = find_default_icon(d, "^^BLANKICON^^"))) {</div><div class='del'>-                                ap_rvputs(r, "&lt;img src=\"",</div><div class='del'>-                                          ap_escape_html(scratch, tp),</div><div class='del'>-                                          "\" alt=\"[ICO]\"", NULL);</div><div class='del'>-                                if (d-&gt;icon_width) {</div><div class='del'>-                                        ap_rprintf(r, " width=\"%d\"",</div><div class='del'>-                                                   d-&gt;icon_width);</div><div class='del'>-                                }</div><div class='del'>-                                if (d-&gt;icon_height) {</div><div class='del'>-                                        ap_rprintf(r, " height=\"%d\"",</div><div class='del'>-                                                   d-&gt;icon_height);</div><div class='del'>-                                }</div><div class='del'>-</div><div class='del'>-                                if (autoindex_opts &amp; EMIT_XHTML) {</div><div class='del'>-                                        ap_rputs(" /", r);</div><div class='del'>-                                }</div><div class='del'>-                                ap_rputs("&gt;&lt;/th&gt;", r);</div><div class='del'>-                        }</div><div class='del'>-                        else {</div><div class='del'>-                                ap_rputs("&amp;nbsp;&lt;/th&gt;", r);</div><div class='del'>-                        }</div><div class='del'>-</div><div class='del'>-                        ++cols;</div><div class='del'>-                }</div><div class='del'>-                ap_rputs("&lt;th&gt;", r);</div><div class='del'>-                emit_link(r, "Name", K_NAME, keyid, direction,</div><div class='del'>-                          colargs, static_columns);</div><div class='del'>-                if (!(autoindex_opts &amp; SUPPRESS_LAST_MOD)) {</div><div class='del'>-                        ap_rputs("&lt;/th&gt;&lt;th&gt;", r);</div><div class='del'>-                        emit_link(r, "Last modified", K_LAST_MOD, keyid,</div><div class='del'>-                                  direction, colargs, static_columns);</div><div class='del'>-                        ++cols;</div><div class='del'>-                }</div><div class='del'>-                if (!(autoindex_opts &amp; SUPPRESS_SIZE)) {</div><div class='del'>-                        ap_rputs("&lt;/th&gt;&lt;th&gt;", r);</div><div class='del'>-                        emit_link(r, "Size", K_SIZE, keyid, direction,</div><div class='del'>-                                  colargs, static_columns);</div><div class='del'>-                        ++cols;</div><div class='del'>-                }</div><div class='del'>-                if (!(autoindex_opts &amp; SUPPRESS_DESC)) {</div><div class='del'>-                        ap_rputs("&lt;/th&gt;&lt;th&gt;", r);</div><div class='del'>-                        emit_link(r, "Description", K_DESC, keyid, direction,</div><div class='del'>-                                  colargs, static_columns);</div><div class='del'>-                        ++cols;</div><div class='del'>-                }</div><div class='del'>-                if (!(autoindex_opts &amp; SUPPRESS_RULES)) {</div><div class='del'>-                        breakrow = apr_psprintf(r-&gt;pool,</div><div class='del'>-                                                "&lt;tr&gt;&lt;th colspan=\"%d\"&gt;"</div><div class='del'>-                                                "&lt;hr%s&gt;&lt;/th&gt;&lt;/tr&gt;\n", cols,</div><div class='del'>-                                                (autoindex_opts &amp; EMIT_XHTML) </div><div class='del'>-                                                ? " /" : "");</div><div class='del'>-                }</div><div class='del'>-                ap_rvputs(r, "&lt;/th&gt;&lt;/tr&gt;", breakrow, NULL);</div><div class='del'>-        }</div><div class='del'>-        else if (autoindex_opts &amp; FANCY_INDEXING) {</div><div class='del'>-                ap_rputs("&lt;pre&gt;", r);</div><div class='del'>-                if (!(autoindex_opts &amp; SUPPRESS_ICON)) {</div><div class='del'>-                        if ((tp = find_default_icon(d, "^^BLANKICON^^"))) {</div><div class='del'>-                                ap_rvputs(r, "&lt;img src=\"",</div><div class='del'>-                                          ap_escape_html(scratch, tp),</div><div class='del'>-                                          "\" alt=\"Icon \"", NULL);</div><div class='del'>-                                if (d-&gt;icon_width) {</div><div class='del'>-                                        ap_rprintf(r, " width=\"%d\"",</div><div class='del'>-                                                   d-&gt;icon_width);</div><div class='del'>-                                }</div><div class='del'>-                                if (d-&gt;icon_height) {</div><div class='del'>-                                        ap_rprintf(r, " height=\"%d\"",</div><div class='del'>-                                                   d-&gt;icon_height);</div><div class='del'>-                                }</div><div class='del'>-</div><div class='del'>-                                if (autoindex_opts &amp; EMIT_XHTML) {</div><div class='del'>-                                        ap_rputs(" /", r);</div><div class='del'>-                                }</div><div class='del'>-                                ap_rputs("&gt; ", r);</div><div class='del'>-                        }</div><div class='del'>-                        else {</div><div class='del'>-                                ap_rputs("      ", r);</div><div class='del'>-                        }</div><div class='del'>-                }</div><div class='del'>-                emit_link(r, "Name", K_NAME, keyid, direction,</div><div class='del'>-                          colargs, static_columns);</div><div class='del'>-                ap_rputs(pad_scratch + 4, r);</div><div class='del'>-                /*</div><div class='del'>-                 * Emit the guaranteed-at-least-one-space-between-columns byte.</div><div class='del'>-                 */</div><div class='del'>-                ap_rputs(" ", r);</div><div class='del'>-                if (!(autoindex_opts &amp; SUPPRESS_LAST_MOD)) {</div><div class='del'>-                        emit_link(r, "Last modified", K_LAST_MOD, keyid,</div><div class='del'>-                                  direction, colargs, static_columns);</div><div class='del'>-                        ap_rputs("      ", r);</div><div class='del'>-                }</div><div class='del'>-                if (!(autoindex_opts &amp; SUPPRESS_SIZE)) {</div><div class='del'>-                        emit_link(r, "Size", K_SIZE, keyid, direction,</div><div class='del'>-                                  colargs, static_columns);</div><div class='del'>-                        ap_rputs("  ", r);</div><div class='del'>-                }</div><div class='del'>-                if (!(autoindex_opts &amp; SUPPRESS_DESC)) {</div><div class='del'>-                        emit_link(r, "Description", K_DESC, keyid, direction,</div><div class='del'>-                                  colargs, static_columns);</div><div class='del'>-                }</div><div class='del'>-                if (!(autoindex_opts &amp; SUPPRESS_RULES)) {</div><div class='del'>-                        ap_rputs("&lt;hr", r);</div><div class='del'>-                        if (autoindex_opts &amp; EMIT_XHTML) {</div><div class='del'>-                                ap_rputs(" /", r);</div><div class='del'>-                        }</div><div class='del'>-                        ap_rputs("&gt;", r);</div><div class='del'>-                }</div><div class='del'>-                else {</div><div class='del'>-                        ap_rputc('\n', r);</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='del'>-        else {</div><div class='del'>-                ap_rputs("&lt;ul&gt;", r);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        for (x = 0; x &lt; n; x++) {</div><div class='del'>-                apr_pool_clear(scratch);</div><div class='del'>-</div><div class='del'>-                t = ar[x]-&gt;name;</div><div class='del'>-                anchor = ap_escape_html(scratch, ap_os_escape_path(scratch, t,</div><div class='del'>-                                                                   0));</div><div class='del'>-</div><div class='del'>-                if (!x &amp;&amp; t[0] == '/') {</div><div class='del'>-                        t2 = "Parent Directory";</div><div class='del'>-                }</div><div class='del'>-                else {</div><div class='del'>-                        t2 = t;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                if (autoindex_opts &amp; TABLE_INDEXING) {</div><div class='del'>-                        ap_rputs("&lt;tr&gt;", r);</div><div class='del'>-                        if (!(autoindex_opts &amp; SUPPRESS_ICON)) {</div><div class='del'>-                                ap_rputs("&lt;td valign=\"top\"&gt;", r);</div><div class='del'>-                                if (autoindex_opts &amp; ICONS_ARE_LINKS) {</div><div class='del'>-                                        ap_rvputs(r, "&lt;a href=\"", anchor,</div><div class='del'>-                                                  "\"&gt;", NULL);</div><div class='del'>-                                }</div><div class='del'>-                                if ((ar[x]-&gt;icon) || d-&gt;default_icon) {</div><div class='del'>-                                        ap_rvputs(r, "&lt;img src=\"",</div><div class='del'>-                                                  ap_escape_html(scratch,</div><div class='del'>-                                                                 ar[x]-&gt;icon ?</div><div class='del'>-                                                                 ar[x]-&gt;icon</div><div class='del'>-                                                                 : d-&gt;default_icon),</div><div class='del'>-                                                  "\" alt=\"[",</div><div class='del'>-                                                  (ar[x]-&gt;alt ? </div><div class='del'>-                                                   ar[x]-&gt;alt : "   "),</div><div class='del'>-                                                  "]\"", NULL);</div><div class='del'>-                                        if (d-&gt;icon_width) {</div><div class='del'>-                                                ap_rprintf(r, " width=\"%d\"",</div><div class='del'>-                                                           d-&gt;icon_width);</div><div class='del'>-                                        }</div><div class='del'>-                                        if (d-&gt;icon_height) {</div><div class='del'>-                                                ap_rprintf(r, " height=\"%d\"",</div><div class='del'>-                                                           d-&gt;icon_height);</div><div class='del'>-                                        }</div><div class='del'>-</div><div class='del'>-                                        if (autoindex_opts &amp; EMIT_XHTML) {</div><div class='del'>-                                                ap_rputs(" /", r);</div><div class='del'>-                                        }</div><div class='del'>-                                        ap_rputs("&gt;", r);</div><div class='del'>-                                }</div><div class='del'>-                                else {</div><div class='del'>-                                        ap_rputs("&amp;nbsp;", r);</div><div class='del'>-                                }</div><div class='del'>-                                if (autoindex_opts &amp; ICONS_ARE_LINKS) {</div><div class='del'>-                                        ap_rputs("&lt;/a&gt;&lt;/td&gt;", r);</div><div class='del'>-                                }</div><div class='del'>-                                else {</div><div class='del'>-                                        ap_rputs("&lt;/td&gt;", r);</div><div class='del'>-                                }</div><div class='del'>-                        }</div><div class='del'>-                        if (d-&gt;name_adjust == K_ADJUST) {</div><div class='del'>-                                ap_rvputs(r, "&lt;td&gt;&lt;a href=\"", anchor, "\"&gt;",</div><div class='del'>-                                          ap_escape_html(scratch, t2), "&lt;/a&gt;",</div><div class='del'>-                                          NULL);</div><div class='del'>-                        }</div><div class='del'>-                        else {</div><div class='del'>-                                nwidth = strlen(t2);</div><div class='del'>-                                if (nwidth &gt; name_width) {</div><div class='del'>-                                        memcpy(name_scratch, t2, name_width - 3);</div><div class='del'>-                                        name_scratch[name_width - 3] = '.';</div><div class='del'>-                                        name_scratch[name_width - 2] = '.';</div><div class='del'>-                                        name_scratch[name_width - 1] = '&gt;';</div><div class='del'>-                                        name_scratch[name_width] = 0;</div><div class='del'>-                                        t2 = name_scratch;</div><div class='del'>-                                        nwidth = name_width;</div><div class='del'>-                                }</div><div class='del'>-                                ap_rvputs(r, "&lt;td&gt;&lt;a href=\"", anchor, "\"&gt;",</div><div class='del'>-                                          ap_escape_html(scratch, t2),</div><div class='del'>-                                          "&lt;/a&gt;", pad_scratch + nwidth, NULL);</div><div class='del'>-                        }</div><div class='del'>-                        if (!(autoindex_opts &amp; SUPPRESS_LAST_MOD)) {</div><div class='del'>-                                if (ar[x]-&gt;lm != -1) {</div><div class='del'>-                                        char time_str[MAX_STRING_LEN];</div><div class='del'>-                                        apr_time_exp_t ts;</div><div class='del'>-                                        apr_time_exp_lt(&amp;ts, ar[x]-&gt;lm);</div><div class='del'>-                                        apr_strftime(time_str, &amp;rv,</div><div class='del'>-                                                     MAX_STRING_LEN,</div><div class='del'>-                                                     "&lt;/td&gt;&lt;td align=\"right\""</div><div class='del'>-                                                     "&gt;%d-%b-%Y %H:%M  ",</div><div class='del'>-                                                     &amp;ts);</div><div class='del'>-                                        ap_rputs(time_str, r);</div><div class='del'>-                                }</div><div class='del'>-                                else {</div><div class='del'>-                                        ap_rputs("&lt;/td&gt;&lt;td&gt;&amp;nbsp;", r);</div><div class='del'>-                                }</div><div class='del'>-                        }</div><div class='del'>-                        if (!(autoindex_opts &amp; SUPPRESS_SIZE)) {</div><div class='del'>-                                ap_rvputs(r, "&lt;/td&gt;&lt;td align=\"right\"&gt;",</div><div class='del'>-                                          apr_strfsize(ar[x]-&gt;size, buf), NULL);</div><div class='del'>-                        }</div><div class='del'>-                        if (!(autoindex_opts &amp; SUPPRESS_DESC)) {</div><div class='del'>-                                if (ar[x]-&gt;desc) {</div><div class='del'>-                                        if (d-&gt;desc_adjust == K_ADJUST) {</div><div class='del'>-                                                ap_rvputs(r, "&lt;/td&gt;&lt;td&gt;",</div><div class='del'>-                                                          ar[x]-&gt;desc, NULL);</div><div class='del'>-                                        }</div><div class='del'>-                                        else {</div><div class='del'>-                                                ap_rvputs(r, "&lt;/td&gt;&lt;td&gt;",</div><div class='del'>-                                                          terminate_description(d, ar[x]-&gt;desc,</div><div class='del'>-                                                                                autoindex_opts,</div><div class='del'>-                                                                                desc_width), NULL);</div><div class='del'>-                                        }</div><div class='del'>-                                }</div><div class='del'>-                        }</div><div class='del'>-                        else {</div><div class='del'>-                                ap_rputs("&lt;/td&gt;&lt;td&gt;&amp;nbsp;", r);</div><div class='del'>-                        }</div><div class='del'>-                        ap_rputs("&lt;/td&gt;&lt;/tr&gt;\n", r);</div><div class='del'>-                }</div><div class='del'>-                else if (autoindex_opts &amp; FANCY_INDEXING) {</div><div class='del'>-                        if (!(autoindex_opts &amp; SUPPRESS_ICON)) {</div><div class='del'>-                                if (autoindex_opts &amp; ICONS_ARE_LINKS) {</div><div class='del'>-                                        ap_rvputs(r, "&lt;a href=\"", anchor,</div><div class='del'>-                                                  "\"&gt;", NULL);</div><div class='del'>-                                }</div><div class='del'>-                                if ((ar[x]-&gt;icon) || d-&gt;default_icon) {</div><div class='del'>-                                        ap_rvputs(r, "&lt;img src=\"",</div><div class='del'>-                                                  ap_escape_html(scratch,</div><div class='del'>-                                                                 ar[x]-&gt;icon ?</div><div class='del'>-                                                                 ar[x]-&gt;icon</div><div class='del'>-                                                                 : d-&gt;default_icon),</div><div class='del'>-                                                  "\" alt=\"[",</div><div class='del'>-                                                  (ar[x]-&gt;alt ? ar[x]-&gt;alt </div><div class='del'>-                                                   : "   "),</div><div class='del'>-                                                  "]\"", NULL);</div><div class='del'>-                                        if (d-&gt;icon_width) {</div><div class='del'>-                                                ap_rprintf(r, " width=\"%d\"",</div><div class='del'>-                                                           d-&gt;icon_width);</div><div class='del'>-                                        }</div><div class='del'>-                                        if (d-&gt;icon_height) {</div><div class='del'>-                                                ap_rprintf(r, " height=\"%d\"",</div><div class='del'>-                                                           d-&gt;icon_height);</div><div class='del'>-                                        }</div><div class='del'>-</div><div class='del'>-                                        if (autoindex_opts &amp; EMIT_XHTML) {</div><div class='del'>-                                                ap_rputs(" /", r);</div><div class='del'>-                                        }</div><div class='del'>-                                        ap_rputs("&gt;", r);</div><div class='del'>-                                }</div><div class='del'>-                                else {</div><div class='del'>-                                        ap_rputs("     ", r);</div><div class='del'>-                                }</div><div class='del'>-                                if (autoindex_opts &amp; ICONS_ARE_LINKS) {</div><div class='del'>-                                        ap_rputs("&lt;/a&gt; ", r);</div><div class='del'>-                                }</div><div class='del'>-                                else {</div><div class='del'>-                                        ap_rputc(' ', r);</div><div class='del'>-                                }</div><div class='del'>-                        }</div><div class='del'>-                        nwidth = strlen(t2);</div><div class='del'>-                        if (nwidth &gt; name_width) {</div><div class='del'>-                                memcpy(name_scratch, t2, name_width - 3);</div><div class='del'>-                                name_scratch[name_width - 3] = '.';</div><div class='del'>-                                name_scratch[name_width - 2] = '.';</div><div class='del'>-                                name_scratch[name_width - 1] = '&gt;';</div><div class='del'>-                                name_scratch[name_width] = 0;</div><div class='del'>-                                t2 = name_scratch;</div><div class='del'>-                                nwidth = name_width;</div><div class='del'>-                        }</div><div class='del'>-                        ap_rvputs(r, "&lt;a href=\"", anchor, "\"&gt;",</div><div class='del'>-                                  ap_escape_html(scratch, t2),</div><div class='del'>-                                  "&lt;/a&gt;", pad_scratch + nwidth, NULL);</div><div class='del'>-                        /*</div><div class='del'>-                         * The blank before the storm.. er, before the next</div><div class='del'>-                         * field.</div><div class='del'>-                         */</div><div class='del'>-                        ap_rputs(" ", r);</div><div class='del'>-                        if (!(autoindex_opts &amp; SUPPRESS_LAST_MOD)) {</div><div class='del'>-                                if (ar[x]-&gt;lm != -1) {</div><div class='del'>-                                        apr_time_exp_lt(&amp;ts, ar[x]-&gt;lm);</div><div class='del'>-                                        apr_strftime(time_str, &amp;rv,</div><div class='del'>-                                                     MAX_STRING_LEN,</div><div class='del'>-                                                     "%d-%b-%Y %H:%M  ", &amp;ts);</div><div class='del'>-                                        ap_rputs(time_str, r);</div><div class='del'>-                                }</div><div class='del'>-                                else {</div><div class='del'>-                                        /* Length="22-Feb-1998 23:42  " </div><div class='del'>-                                         * (see 4 lines above)</div><div class='del'>-                                         */</div><div class='del'>-                                        ap_rputs("                   ", r);</div><div class='del'>-                                }</div><div class='del'>-                        }</div><div class='del'>-                        if (!(autoindex_opts &amp; SUPPRESS_SIZE)) {</div><div class='del'>-                                ap_rputs(apr_strfsize(ar[x]-&gt;size, buf), r);</div><div class='del'>-                                ap_rputs("  ", r);</div><div class='del'>-                        }</div><div class='del'>-                        if (!(autoindex_opts &amp; SUPPRESS_DESC)) {</div><div class='del'>-                                if (ar[x]-&gt;desc) {</div><div class='del'>-                                        ap_rputs(terminate_description(d,</div><div class='del'>-                                                                       ar[x]-&gt;desc,</div><div class='del'>-                                                                       autoindex_opts,</div><div class='del'>-                                                                       desc_width), r);</div><div class='del'>-                                }</div><div class='del'>-                        }</div><div class='del'>-                        ap_rputc('\n', r);</div><div class='del'>-                }</div><div class='del'>-                else {</div><div class='del'>-                        ap_rvputs(r, "&lt;li&gt;&lt;a href=\"", anchor, "\"&gt; ",</div><div class='del'>-                                  ap_escape_html(scratch, t2),</div><div class='del'>-                                  "&lt;/a&gt;&lt;/li&gt;\n", NULL);</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='del'>-        if (autoindex_opts &amp; TABLE_INDEXING) {</div><div class='del'>-                ap_rvputs(r, breakrow, "&lt;/table&gt;\n", NULL);</div><div class='del'>-        }</div><div class='del'>-        else if (autoindex_opts &amp; FANCY_INDEXING) {</div><div class='del'>-                if (!(autoindex_opts &amp; SUPPRESS_RULES)) {</div><div class='del'>-                        ap_rputs("&lt;hr", r);</div><div class='del'>-                        if (autoindex_opts &amp; EMIT_XHTML) {</div><div class='del'>-                                ap_rputs(" /", r);</div><div class='del'>-                        }</div><div class='del'>-                        ap_rputs("&gt;&lt;/pre&gt;\n", r);</div><div class='del'>-                }</div><div class='del'>-                else {</div><div class='del'>-                        ap_rputs("&lt;/pre&gt;\n", r);</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='del'>-        else {</div><div class='del'>-                ap_rputs("&lt;/ul&gt;\n", r);</div><div class='del'>-        }</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-/*</div><div class='del'>- * Compare two file entries according to the sort criteria.  The return</div><div class='del'>- * is essentially a signum function value.</div><div class='del'>- */</div><div class='del'>-</div><div class='del'>-static int dsortf(struct ent **e1, struct ent **e2)</div><div class='del'>-{</div><div class='del'>-        struct ent *c1 = NULL, *c2 = NULL;</div><div class='del'>-        int         result = 0;</div><div class='del'>-</div><div class='del'>-        /*</div><div class='del'>-         * First, see if either of the entries is for the parent directory.</div><div class='del'>-         * If so, that *always* sorts lower than anything else.</div><div class='del'>-         */</div><div class='del'>-        if ((*e1)-&gt;name[0] == '/') {</div><div class='del'>-                return -1;</div><div class='del'>-        }</div><div class='del'>-        if ((*e2)-&gt;name[0] == '/') {</div><div class='del'>-                return 1;</div><div class='del'>-        }</div><div class='del'>-        /*</div><div class='del'>-         * Now see if one's a directory and one isn't, if we're set</div><div class='del'>-         * isdir for FOLDERS_FIRST.</div><div class='del'>-         */</div><div class='del'>-        if ((*e1)-&gt;isdir != (*e2)-&gt;isdir) {</div><div class='del'>-                return (*e1)-&gt;isdir ? -1 : 1;</div><div class='del'>-        }</div><div class='del'>-        /*</div><div class='del'>-         * All of our comparisons will be of the c1 entry against the c2 one,</div><div class='del'>-         * so assign them appropriately to take care of the ordering.</div><div class='del'>-         */</div><div class='del'>-        if ((*e1)-&gt;ascending) {</div><div class='del'>-                c1 = *e1;</div><div class='del'>-                c2 = *e2;</div><div class='del'>-        }</div><div class='del'>-        else {</div><div class='del'>-                c1 = *e2;</div><div class='del'>-                c2 = *e1;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        switch (c1-&gt;key) {</div><div class='del'>-        case K_LAST_MOD:</div><div class='del'>-                if (c1-&gt;lm &gt; c2-&gt;lm) {</div><div class='del'>-                        return 1;</div><div class='del'>-                }</div><div class='del'>-                else if (c1-&gt;lm &lt; c2-&gt;lm) {</div><div class='del'>-                        return -1;</div><div class='del'>-                }</div><div class='del'>-                break;</div><div class='del'>-        case K_SIZE:</div><div class='del'>-                if (c1-&gt;size &gt; c2-&gt;size) {</div><div class='del'>-                        return 1;</div><div class='del'>-                }</div><div class='del'>-                else if (c1-&gt;size &lt; c2-&gt;size) {</div><div class='del'>-                        return -1;</div><div class='del'>-                }</div><div class='del'>-                break;</div><div class='del'>-        case K_DESC:</div><div class='del'>-                if (c1-&gt;version_sort) {</div><div class='del'>-                        result = apr_strnatcmp(c1-&gt;desc ? c1-&gt;desc : "",</div><div class='del'>-                                               c2-&gt;desc ? c2-&gt;desc : "");</div><div class='del'>-                }</div><div class='del'>-                else {</div><div class='del'>-                        result = strcmp(c1-&gt;desc ? c1-&gt;desc : "",</div><div class='del'>-                                        c2-&gt;desc ? c2-&gt;desc : "");</div><div class='del'>-                }</div><div class='del'>-                if (result) {</div><div class='del'>-                        return result;</div><div class='del'>-                }</div><div class='del'>-                break;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        /* names may identical when treated case-insensitively,</div><div class='del'>-         * so always fall back on strcmp() flavors to put entries</div><div class='del'>-         * in deterministic order.  This means that 'ABC' and 'abc'</div><div class='del'>-         * will always appear in the same order, rather than</div><div class='del'>-         * variably between 'ABC abc' and 'abc ABC' order.</div><div class='del'>-         */</div><div class='del'>-</div><div class='del'>-        if (c1-&gt;version_sort) {</div><div class='del'>-                if (c1-&gt;ignore_case) {</div><div class='del'>-                        result = apr_strnatcasecmp (c1-&gt;name, c2-&gt;name);</div><div class='del'>-                }</div><div class='del'>-                if (!result) {</div><div class='del'>-                        result = apr_strnatcmp(c1-&gt;name, c2-&gt;name);</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        /* The names may be identical in respects other other than</div><div class='del'>-         * filename case when strnatcmp is used above, so fall back</div><div class='del'>-         * to strcmp on conflicts so that fn1.01.zzz and fn1.1.zzz</div><div class='del'>-         * are also sorted in a deterministic order.</div><div class='del'>-         */</div><div class='del'>-</div><div class='del'>-        if (!result &amp;&amp; c1-&gt;ignore_case) {</div><div class='del'>-                result = strcasecmp (c1-&gt;name, c2-&gt;name);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (!result) {</div><div class='del'>-                result = strcmp (c1-&gt;name, c2-&gt;name);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        return result;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-static int </div><div class='del'>-mod_glfs_index_directory (request_rec *r,</div><div class='del'>-                          glusterfs_dir_config_t *autoindex_conf)</div><div class='del'>-{</div><div class='del'>-        char                   *title_name = NULL, *title_endp = NULL;</div><div class='del'>-        char                   *pstring = NULL, *colargs = NULL;</div><div class='del'>-        char                   *path = NULL, *fname = NULL, *charset = NULL;</div><div class='del'>-        char                   *fullpath = NULL, *name = NULL, *ctype = NULL;</div><div class='del'>-        apr_finfo_t             dirent;</div><div class='del'>-        glusterfs_file_t        fd = NULL;</div><div class='del'>-        apr_status_t            status = APR_SUCCESS;</div><div class='del'>-        int                     num_ent = 0, x;</div><div class='del'>-        struct ent             *head = NULL, *p = NULL;</div><div class='del'>-        struct ent            **ar = NULL;</div><div class='del'>-        const char             *qstring = NULL;</div><div class='del'>-        apr_int32_t             autoindex_opts = autoindex_conf-&gt;opts;</div><div class='del'>-        char                    keyid, direction;</div><div class='del'>-        apr_size_t              dirpathlen;</div><div class='del'>-        glusterfs_dir_config_t *dir_config = NULL;</div><div class='del'>-        int                     ret = -1;</div><div class='del'>-        struct dirent          *entry = NULL;</div><div class='del'>-        struct stat             st = {0, };</div><div class='del'>-</div><div class='del'>-        name = r-&gt;filename;</div><div class='del'>-        title_name = ap_escape_html(r-&gt;pool, r-&gt;uri);</div><div class='del'>-        ctype = "text/html";</div><div class='del'>-        dir_config = mod_glfs_dconfig (r);</div><div class='del'>-        if (dir_config == NULL)  {</div><div class='del'>-                return HTTP_INTERNAL_SERVER_ERROR;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        path = r-&gt;uri;</div><div class='del'>-        fd = glusterfs_open (path, O_RDONLY, 0);</div><div class='del'>-        if (fd == 0) {</div><div class='del'>-                ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r,</div><div class='del'>-                              "file permissions deny server access: %s",</div><div class='del'>-                              r-&gt;filename);</div><div class='del'>-                return HTTP_FORBIDDEN;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (autoindex_conf-&gt;ctype) {</div><div class='del'>-                ctype = autoindex_conf-&gt;ctype;</div><div class='del'>-        }</div><div class='del'>-        if (autoindex_conf-&gt;charset) {</div><div class='del'>-                charset = autoindex_conf-&gt;charset;</div><div class='del'>-        }</div><div class='del'>-        else {</div><div class='del'>-#if APR_HAS_UNICODE_FS</div><div class='del'>-                charset = "UTF-8";</div><div class='del'>-#else</div><div class='del'>-                charset = "ISO-8859-1";</div><div class='del'>-#endif</div><div class='del'>-        }</div><div class='del'>-        if (*charset) {</div><div class='del'>-                ap_set_content_type(r, apr_pstrcat(r-&gt;pool, ctype, ";charset=",</div><div class='del'>-                                                   charset, NULL));</div><div class='del'>-        }</div><div class='del'>-        else {</div><div class='del'>-                ap_set_content_type(r, ctype);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (autoindex_opts &amp; TRACK_MODIFIED) {</div><div class='del'>-                ap_update_mtime(r, r-&gt;finfo.mtime);</div><div class='del'>-                ap_set_last_modified(r);</div><div class='del'>-                ap_set_etag(r);</div><div class='del'>-        }</div><div class='del'>-        if (r-&gt;header_only) {</div><div class='del'>-                glusterfs_close (fd);</div><div class='del'>-                return 0;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        /*</div><div class='del'>-         * If there is no specific ordering defined for this directory,</div><div class='del'>-         * default to ascending by filename.</div><div class='del'>-         */</div><div class='del'>-        keyid = autoindex_conf-&gt;default_keyid</div><div class='del'>-                ? autoindex_conf-&gt;default_keyid : K_NAME;</div><div class='del'>-        direction = autoindex_conf-&gt;default_direction</div><div class='del'>-                ? autoindex_conf-&gt;default_direction : D_ASCENDING;</div><div class='del'>-</div><div class='del'>-        /*</div><div class='del'>-         * Figure out what sort of indexing (if any) we're supposed to use.</div><div class='del'>-         *</div><div class='del'>-         * If no QUERY_STRING was specified or client query strings have been</div><div class='del'>-         * explicitly disabled.</div><div class='del'>-         * If we are ignoring the client, suppress column sorting as well.</div><div class='del'>-         */</div><div class='del'>-        if (autoindex_opts &amp; IGNORE_CLIENT) {</div><div class='del'>-                qstring = NULL;</div><div class='del'>-                autoindex_opts |= SUPPRESS_COLSORT;</div><div class='del'>-                colargs = "";</div><div class='del'>-        }</div><div class='del'>-        else {</div><div class='del'>-                char fval[5], vval[5], *ppre = "", *epattern = "";</div><div class='del'>-                fval[0] = '\0'; vval[0] = '\0';</div><div class='del'>-                qstring = r-&gt;args;</div><div class='del'>-</div><div class='del'>-                while (qstring &amp;&amp; *qstring) {</div><div class='del'>-</div><div class='del'>-                        /* C= First Sort key Column (N, M, S, D) */</div><div class='del'>-                        if (   qstring[0] == 'C' &amp;&amp; qstring[1] == '='</div><div class='del'>-                               &amp;&amp; qstring[2] &amp;&amp; strchr(K_VALID, qstring[2])</div><div class='del'>-                               &amp;&amp; (   qstring[3] == '&amp;' || qstring[3] == ';'</div><div class='del'>-                                      || !qstring[3])) {</div><div class='del'>-                                keyid = qstring[2];</div><div class='del'>-                                qstring += qstring[3] ? 4 : 3;</div><div class='del'>-                        }</div><div class='del'>-</div><div class='del'>-                        /* O= Sort order (A, D) */</div><div class='del'>-                        else if (   qstring[0] == 'O' &amp;&amp; qstring[1] == '='</div><div class='del'>-                                    &amp;&amp; (   (qstring[2] == D_ASCENDING)</div><div class='del'>-                                           || (qstring[2] == D_DESCENDING))</div><div class='del'>-                                    &amp;&amp; (   qstring[3] == '&amp;' </div><div class='del'>-                                           || qstring[3] == ';'</div><div class='del'>-                                           || !qstring[3])) {</div><div class='del'>-                                direction = qstring[2];</div><div class='del'>-                                qstring += qstring[3] ? 4 : 3;</div><div class='del'>-                        }</div><div class='del'>-</div><div class='del'>-                        /* F= Output Format (0 plain, 1 fancy (pre), 2 table) */</div><div class='del'>-                        else if (   qstring[0] == 'F' &amp;&amp; qstring[1] == '='</div><div class='del'>-                                    &amp;&amp; qstring[2] &amp;&amp; strchr("012", qstring[2])</div><div class='del'>-                                    &amp;&amp; (   qstring[3] == '&amp;' || qstring[3] == ';'</div><div class='del'>-                                           || !qstring[3])) {</div><div class='del'>-                                if (qstring[2] == '0') {</div><div class='del'>-                                        autoindex_opts &amp;= ~(FANCY_INDEXING</div><div class='del'>-                                                            | TABLE_INDEXING);</div><div class='del'>-                                }</div><div class='del'>-                                else if (qstring[2] == '1') {</div><div class='del'>-                                        autoindex_opts = (autoindex_opts</div><div class='del'>-                                                          | FANCY_INDEXING)</div><div class='del'>-                                                &amp; ~TABLE_INDEXING;</div><div class='del'>-                                }</div><div class='del'>-                                else if (qstring[2] == '2') {</div><div class='del'>-                                        autoindex_opts |= FANCY_INDEXING</div><div class='del'>-                                                | TABLE_INDEXING;</div><div class='del'>-                                }</div><div class='del'>-                                strcpy(fval, ";F= ");</div><div class='del'>-                                fval[3] = qstring[2];</div><div class='del'>-                                qstring += qstring[3] ? 4 : 3;</div><div class='del'>-                        }</div><div class='del'>-</div><div class='del'>-                        /* V= Version sort (0, 1) */</div><div class='del'>-                        else if (   qstring[0] == 'V' &amp;&amp; qstring[1] == '='</div><div class='del'>-                                    &amp;&amp; (qstring[2] == '0' || qstring[2] == '1')</div><div class='del'>-                                    &amp;&amp; (   qstring[3] == '&amp;' || qstring[3] == ';'</div><div class='del'>-                                           || !qstring[3])) {</div><div class='del'>-                                if (qstring[2] == '0') {</div><div class='del'>-                                        autoindex_opts &amp;= ~VERSION_SORT;</div><div class='del'>-                                }</div><div class='del'>-                                else if (qstring[2] == '1') {</div><div class='del'>-                                        autoindex_opts |= VERSION_SORT;</div><div class='del'>-                                }</div><div class='del'>-                                strcpy(vval, ";V= ");</div><div class='del'>-                                vval[3] = qstring[2];</div><div class='del'>-                                qstring += qstring[3] ? 4 : 3;</div><div class='del'>-                        }</div><div class='del'>-</div><div class='del'>-                        /* P= wildcard pattern (*.foo) */</div><div class='del'>-                        else if (qstring[0] == 'P' &amp;&amp; qstring[1] == '=') {</div><div class='del'>-                                const char *eos = qstring += 2; /* for efficiency */</div><div class='del'>-</div><div class='del'>-                                while (*eos &amp;&amp; *eos != '&amp;' &amp;&amp; *eos != ';') {</div><div class='del'>-                                        ++eos;</div><div class='del'>-                                }</div><div class='del'>-</div><div class='del'>-                                if (eos == qstring) {</div><div class='del'>-                                        pstring = NULL;</div><div class='del'>-                                }</div><div class='del'>-                                else {</div><div class='del'>-                                        pstring = apr_pstrndup(r-&gt;pool, qstring,</div><div class='del'>-                                                               eos - qstring);</div><div class='del'>-                                        if (ap_unescape_url(pstring) != OK) {</div><div class='del'>-                                                /* ignore the pattern, if it's bad. */</div><div class='del'>-                                                pstring = NULL;</div><div class='del'>-                                        }</div><div class='del'>-                                        else {</div><div class='del'>-                                                ppre = ";P=";</div><div class='del'>-                                                /* be correct */</div><div class='del'>-                                                epattern = ap_escape_uri(r-&gt;pool,</div><div class='del'>-                                                                         pstring);</div><div class='del'>-                                        }</div><div class='del'>-                                }</div><div class='del'>-</div><div class='del'>-                                if (*eos &amp;&amp; *++eos) {</div><div class='del'>-                                        qstring = eos;</div><div class='del'>-                                }</div><div class='del'>-                                else {</div><div class='del'>-                                        qstring = NULL;</div><div class='del'>-                                }</div><div class='del'>-                        }</div><div class='del'>-</div><div class='del'>-                        /* Syntax error?  Ignore the remainder! */</div><div class='del'>-                        else {</div><div class='del'>-                                qstring = NULL;</div><div class='del'>-                        }</div><div class='del'>-                }</div><div class='del'>-                colargs = apr_pstrcat(r-&gt;pool, fval, vval, ppre, epattern,</div><div class='del'>-                                      NULL);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        /* Spew HTML preamble */</div><div class='del'>-        title_endp = title_name + strlen(title_name) - 1;</div><div class='del'>-</div><div class='del'>-        while (title_endp &gt; title_name &amp;&amp; *title_endp == '/') {</div><div class='del'>-                *title_endp-- = '\0';</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        emit_head(r, find_header(autoindex_conf, r),</div><div class='del'>-                  autoindex_opts &amp; SUPPRESS_PREAMBLE,</div><div class='del'>-                  autoindex_opts &amp; EMIT_XHTML, title_name);</div><div class='del'>-</div><div class='del'>-        /*</div><div class='del'>-         * Since we don't know how many dir. entries there are, put them into a</div><div class='del'>-         * linked list and then arrayificate them so qsort can use them.</div><div class='del'>-         */</div><div class='del'>-        head = NULL;</div><div class='del'>-        p = make_parent_entry(autoindex_opts, autoindex_conf, r, keyid,</div><div class='del'>-                              direction);</div><div class='del'>-        if (p != NULL) {</div><div class='del'>-                p-&gt;next = head;</div><div class='del'>-                head = p;</div><div class='del'>-                num_ent++;</div><div class='del'>-        }</div><div class='del'>-        fullpath = apr_palloc(r-&gt;pool, APR_PATH_MAX);</div><div class='del'>-        dirpathlen = strlen(name);</div><div class='del'>-        memcpy(fullpath, name, dirpathlen);</div><div class='del'>-</div><div class='del'>-        do {</div><div class='del'>-                entry = glusterfs_readdir (fd);</div><div class='del'>-                if (entry == NULL) {</div><div class='del'>-                        break;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                fname = apr_pstrcat (r-&gt;pool, path, entry-&gt;d_name, NULL);</div><div class='del'>-</div><div class='del'>-                ret = glusterfs_stat (fname, &amp;st);</div><div class='del'>-                if (ret != 0) {</div><div class='del'>-                        break;</div><div class='del'>-                }</div><div class='del'>-                </div><div class='del'>-                dirent.fname = fname;</div><div class='del'>-                dirent.name = apr_pstrdup (r-&gt;pool, entry-&gt;d_name);</div><div class='del'>-                fill_out_finfo (&amp;dirent, &amp;st, </div><div class='del'>-                                APR_FINFO_MIN | APR_FINFO_IDENT</div><div class='del'>-                                | APR_FINFO_NLINK | APR_FINFO_OWNER</div><div class='del'>-                                | APR_FINFO_PROT);</div><div class='del'>-</div><div class='del'>-                p = make_autoindex_entry(&amp;dirent, autoindex_opts,</div><div class='del'>-                                         autoindex_conf, r,</div><div class='del'>-                                         keyid, direction, pstring);</div><div class='del'>-                if (p != NULL) {</div><div class='del'>-                        p-&gt;next = head;</div><div class='del'>-                        head = p;</div><div class='del'>-                        num_ent++;</div><div class='del'>-                }</div><div class='del'>-        } while (1);</div><div class='del'>-</div><div class='del'>-        if (num_ent &gt; 0) {</div><div class='del'>-                ar = (struct ent **) apr_palloc(r-&gt;pool,</div><div class='del'>-                                                num_ent * sizeof(struct ent *));</div><div class='del'>-                p = head;</div><div class='del'>-                x = 0;</div><div class='del'>-                while (p) {</div><div class='del'>-                        ar[x++] = p;</div><div class='del'>-                        p = p-&gt;next;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                qsort((void *) ar, num_ent, sizeof(struct ent *),</div><div class='del'>-                      (int (*)(const void *, const void *)) dsortf);</div><div class='del'>-        }</div><div class='del'>-        output_directories(ar, num_ent, autoindex_conf, r, autoindex_opts,</div><div class='del'>-                           keyid, direction, colargs);</div><div class='del'>-        glusterfs_close (fd);</div><div class='del'>-</div><div class='del'>-        emit_tail(r, find_readme(autoindex_conf, r),</div><div class='del'>-                  autoindex_opts &amp; SUPPRESS_PREAMBLE);</div><div class='del'>-</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-static int </div><div class='del'>-handle_autoindex(request_rec *r)</div><div class='del'>-{</div><div class='del'>-        glusterfs_dir_config_t *dir_config = NULL;</div><div class='del'>-        int allow_opts;</div><div class='del'>-</div><div class='del'>-        allow_opts = ap_allow_options(r);</div><div class='del'>-</div><div class='del'>-        r-&gt;allowed |= (AP_METHOD_BIT &lt;&lt; M_GET);</div><div class='del'>-        if (r-&gt;method_number != M_GET) {</div><div class='del'>-                return DECLINED;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        dir_config = mod_glfs_dconfig (r);</div><div class='del'>-</div><div class='del'>-        /* OK, nothing easy.  Trot out the heavy artillery... */</div><div class='del'>-</div><div class='del'>-        if (allow_opts &amp; OPT_INDEXES) {</div><div class='del'>-                int errstatus;</div><div class='del'>-</div><div class='del'>-                if ((errstatus = ap_discard_request_body(r)) != OK) {</div><div class='del'>-                        return errstatus;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                /* KLUDGE --- make the sub_req lookups happen in the right </div><div class='del'>-                 * directory. Fixing this in the sub_req_lookup functions </div><div class='del'>-                 * themselves is difficult, and would probably break </div><div class='del'>-                 * virtual includes...</div><div class='del'>-                 */</div><div class='del'>-</div><div class='del'>-                if (r-&gt;filename[strlen(r-&gt;filename) - 1] != '/') {</div><div class='del'>-                        r-&gt;filename = apr_pstrcat(r-&gt;pool, r-&gt;filename, "/",</div><div class='del'>-                                                  NULL);</div><div class='del'>-                }</div><div class='del'>-                return mod_glfs_index_directory(r, dir_config);</div><div class='del'>-        } else {</div><div class='del'>-                ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r,</div><div class='del'>-                              "Directory index forbidden by "</div><div class='del'>-                              "Options directive: %s", r-&gt;filename);</div><div class='del'>-                return HTTP_FORBIDDEN;</div><div class='del'>-        }</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-static int </div><div class='del'>-mod_glfs_handler (request_rec *r)</div><div class='del'>-{</div><div class='del'>-        conn_rec               *c = r-&gt;connection;</div><div class='del'>-        apr_bucket_brigade     *bb;</div><div class='del'>-        apr_bucket             *e;</div><div class='del'>-        core_dir_config        *d;</div><div class='del'>-        int                     errstatus;</div><div class='del'>-        glusterfs_file_t        fd = NULL;</div><div class='del'>-        apr_status_t            status;</div><div class='del'>-        glusterfs_dir_config_t *dir_config = NULL;</div><div class='del'>-        char                   *path = NULL;</div><div class='del'>-        int                     num_ranges = 0;</div><div class='del'>-        apr_size_t              size = 0;</div><div class='del'>-        apr_off_t               range_start = 0, range_end = 0;</div><div class='del'>-        char                   *current = NULL;</div><div class='del'>-        apr_status_t            rv = 0;</div><div class='del'>-        core_request_config    *req_cfg = NULL;</div><div class='del'>-</div><div class='del'>-        /* XXX if/when somebody writes a content-md5 filter we either need to</div><div class='del'>-         *     remove this support or coordinate when to use the filter vs.</div><div class='del'>-         *     when to use this code</div><div class='del'>-         *     The current choice of when to compute the md5 here matches the 1.3</div><div class='del'>-         *     support fairly closely (unlike 1.3, we don't handle computing md5</div><div class='del'>-         *     when the charset is translated).</div><div class='del'>-         */</div><div class='del'>-</div><div class='del'>-        int bld_content_md5;</div><div class='del'>-        if (!r-&gt;handler || (r-&gt;handler</div><div class='del'>-                            &amp;&amp; strcmp (r-&gt;handler, GLUSTERFS_HANDLER)))</div><div class='del'>-                return DECLINED;</div><div class='del'>-</div><div class='del'>-        if (r-&gt;uri[0] == '\0') {</div><div class='del'>-                return DECLINED;</div><div class='del'>-        }</div><div class='del'>-  </div><div class='del'>-        if (r-&gt;finfo.filetype == APR_DIR) {</div><div class='del'>-                return handle_autoindex (r);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        dir_config = mod_glfs_dconfig (r);</div><div class='del'>-</div><div class='del'>-        ap_allow_standard_methods(r, MERGE_ALLOW, M_GET, -1);</div><div class='del'>-  </div><div class='del'>-        /* We understood the (non-GET) method, but it might not be legal for</div><div class='del'>-           this particular resource. Check to see if the 'deliver_script'</div><div class='del'>-           flag is set. If so, then we go ahead and deliver the file since</div><div class='del'>-           it isn't really content (only GET normally returns content).</div><div class='del'>-</div><div class='del'>-           Note: based on logic further above, the only possible non-GET</div><div class='del'>-           method at this point is POST. In the future, we should enable</div><div class='del'>-           script delivery for all methods.  */</div><div class='del'>-        if (r-&gt;method_number != M_GET) {</div><div class='del'>-                req_cfg = ap_get_module_config(r-&gt;request_config, &amp;core_module);</div><div class='del'>-                if (!req_cfg-&gt;deliver_script) {</div><div class='del'>-                        /* The flag hasn't been set for this request. Punt. */</div><div class='del'>-                        ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r,</div><div class='del'>-                                      "This resource does not accept the %s "</div><div class='del'>-                                      "method.",</div><div class='del'>-                                      r-&gt;method);</div><div class='del'>-                        return HTTP_METHOD_NOT_ALLOWED;</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        d = (core_dir_config *)ap_get_module_config(r-&gt;per_dir_config,</div><div class='del'>-                                                    &amp;core_module);</div><div class='del'>-        bld_content_md5 = (d-&gt;content_md5 &amp; 1)</div><div class='del'>-                &amp;&amp; r-&gt;output_filters-&gt;frec-&gt;ftype != AP_FTYPE_RESOURCE;</div><div class='del'>-</div><div class='del'>-        if ((errstatus = ap_discard_request_body(r)) != OK) {</div><div class='del'>-                return errstatus;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (r-&gt;finfo.filetype == 0) {</div><div class='del'>-                ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r,</div><div class='del'>-                              "File does not exist: %s", r-&gt;filename);</div><div class='del'>-                return HTTP_NOT_FOUND;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if ((r-&gt;used_path_info != AP_REQ_ACCEPT_PATH_INFO) &amp;&amp;</div><div class='del'>-            r-&gt;path_info &amp;&amp; *r-&gt;path_info)</div><div class='del'>-        {</div><div class='del'>-                /* default to reject */</div><div class='del'>-                ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r,</div><div class='del'>-                              "File does not exist: %s",</div><div class='del'>-                              apr_pstrcat(r-&gt;pool, r-&gt;filename, r-&gt;path_info,</div><div class='del'>-                                          NULL));</div><div class='del'>-                return HTTP_NOT_FOUND;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        ap_update_mtime (r, r-&gt;finfo.mtime);</div><div class='del'>-        ap_set_last_modified (r);</div><div class='del'>-        ap_set_etag (r);</div><div class='del'>-        apr_table_setn (r-&gt;headers_out, "Accept-Ranges", "bytes");</div><div class='del'>-</div><div class='del'>-        num_ranges = ap_set_byterange(r);</div><div class='del'>-        if (num_ranges == 0) {</div><div class='del'>-                size = r-&gt;finfo.size;</div><div class='del'>-        } else {</div><div class='del'>-                char *tmp = apr_pstrdup (r-&gt;pool, r-&gt;range);</div><div class='del'>-                while ((current = ap_getword(r-&gt;pool, (const char **)&amp;tmp, ','))</div><div class='del'>-                       &amp;&amp; (rv = parse_byterange(current, r-&gt;finfo.size,</div><div class='del'>-                                                &amp;range_start, &amp;range_end))) {</div><div class='del'>-                        size += (range_end - range_start);</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        ap_set_content_length (r, size);</div><div class='del'>-                        </div><div class='del'>-        if ((errstatus = ap_meets_conditions(r)) != OK) {</div><div class='del'>-                r-&gt;status = errstatus;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        /* </div><div class='del'>-         * file is small enough to have already got the content in </div><div class='del'>-         * glusterfs_lookup</div><div class='del'>-        */</div><div class='del'>-        if (r-&gt;finfo.size &lt;= dir_config-&gt;xattr_file_size &amp;&amp; dir_config-&gt;buf) {</div><div class='del'>-                if (bld_content_md5) {</div><div class='del'>-                        apr_table_setn (r-&gt;headers_out, "Content-MD5",</div><div class='del'>-                                        (const char *)ap_md5_binary(r-&gt;pool,</div><div class='del'>-                                                                    dir_config-&gt;buf</div><div class='del'>-                                                                    , r-&gt;finfo.size));</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                ap_log_rerror (APLOG_MARK, APLOG_NOTICE, 0, r, </div><div class='del'>-                               "fetching data from glusterfs through xattr "</div><div class='del'>-                               "interface\n");</div><div class='del'>-                </div><div class='del'>-                bb = apr_brigade_create(r-&gt;pool, c-&gt;bucket_alloc);</div><div class='del'>-</div><div class='del'>-                e = apr_bucket_heap_create (dir_config-&gt;buf, r-&gt;finfo.size,</div><div class='del'>-                                            free, c-&gt;bucket_alloc);</div><div class='del'>-                APR_BRIGADE_INSERT_TAIL (bb, e);</div><div class='del'>-                </div><div class='del'>-                e = apr_bucket_eos_create(c-&gt;bucket_alloc);</div><div class='del'>-                APR_BRIGADE_INSERT_TAIL(bb, e);</div><div class='del'>-</div><div class='del'>-                dir_config-&gt;buf = NULL;</div><div class='del'>-</div><div class='del'>-                /* let the byterange_filter handle multipart requests */</div><div class='del'>-                status = ap_pass_brigade(r-&gt;output_filters, bb);</div><div class='del'>-                if (status == APR_SUCCESS</div><div class='del'>-                    || r-&gt;status != HTTP_OK</div><div class='del'>-                    || c-&gt;aborted) {</div><div class='del'>-                        return OK;</div><div class='del'>-                }</div><div class='del'>-                else {</div><div class='del'>-                        /* no way to know what type of error occurred */</div><div class='del'>-                        ap_log_rerror(APLOG_MARK, APLOG_DEBUG, status, r,</div><div class='del'>-                                      "mod_glfs_handler: ap_pass_brigade "</div><div class='del'>-                                      "returned %i",</div><div class='del'>-                                      status);</div><div class='del'>-                        return HTTP_INTERNAL_SERVER_ERROR;</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='del'>-        </div><div class='del'>-        /* do standard open/read/close to fetch content */</div><div class='del'>-        path = r-&gt;uri;</div><div class='del'>-        </div><div class='del'>-        fd = glusterfs_open (path, O_RDONLY, 0);</div><div class='del'>-        if (fd == 0) {</div><div class='del'>-                ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r,</div><div class='del'>-                              "file permissions deny server access: %s",</div><div class='del'>-                              r-&gt;filename);</div><div class='del'>-                return HTTP_FORBIDDEN;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        /* </div><div class='del'>-         * byterange_filter cannot handle range requests, since we are not </div><div class='del'>-         * sending the whole data in a single brigade</div><div class='del'>-         */</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-        if (num_ranges == 0) {</div><div class='del'>-                mod_glfs_read_async (r, NULL, fd, 0, -1);</div><div class='del'>-        } else {</div><div class='del'>-                mod_glfs_handle_byte_ranges (r, fd, num_ranges);</div><div class='del'>-        }</div><div class='del'>-                </div><div class='del'>-        glusterfs_close (fd);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-#if 0</div><div class='del'>-static apr_status_t </div><div class='del'>-mod_glfs_output_filter (ap_filter_t *f,</div><div class='del'>-                        apr_bucket_brigade *b)</div><div class='del'>-{</div><div class='del'>-        size_t size = 0;</div><div class='del'>-        apr_bucket_t *e = NULL; </div><div class='del'>-        size = atol (apr_table_get (r-&gt;notes, MOD_GLFS_SIZE));</div><div class='del'>-        </div><div class='del'>-        for (e = APR_BRIGADE_FIRST(b);</div><div class='del'>-             e != APR_BRIGADE_SENTINEL(b);</div><div class='del'>-             e = APR_BUCKET_NEXT(e))</div><div class='del'>-        {</div><div class='del'>-                /* FIXME: can there be more than one heap buckets? */</div><div class='del'>-                if (e-&gt;type == &amp;apr_bucket_type_heap) {</div><div class='del'>-                        break;</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (e != APR_BRIGADE_SENTINEL(b)) {</div><div class='del'>-                e-&gt;length = size;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        return ap_pass_brigade (f-&gt;next, b);</div><div class='del'>-}</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-static int </div><div class='del'>-mod_glfs_fixup_dir(request_rec *r)</div><div class='del'>-{</div><div class='del'>-        glusterfs_dir_config_t  *d = NULL;</div><div class='del'>-        char                    *dummy_ptr[1];</div><div class='del'>-        char                   **names_ptr = NULL, *name_ptr = NULL;</div><div class='del'>-        int                      num_names;</div><div class='del'>-        int                      error_notfound = 0;</div><div class='del'>-        char                    *ifile = NULL;</div><div class='del'>-        request_rec             *rr = NULL;</div><div class='del'>-</div><div class='del'>-        /* only handle requests against directories */</div><div class='del'>-        if (r-&gt;finfo.filetype != APR_DIR) {</div><div class='del'>-                return DECLINED;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (!r-&gt;handler || strcmp (r-&gt;handler, GLUSTERFS_HANDLER)) {</div><div class='del'>-                return DECLINED;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        /* Never tolerate path_info on dir requests */</div><div class='del'>-        if (r-&gt;path_info &amp;&amp; *r-&gt;path_info) {</div><div class='del'>-                return DECLINED;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        d = (glusterfs_dir_config_t *)ap_get_module_config(r-&gt;per_dir_config,</div><div class='del'>-                                                           &amp;glusterfs_module);</div><div class='del'>-</div><div class='del'>-        /* Redirect requests that are not '/' terminated */</div><div class='del'>-        if (r-&gt;uri[0] == '\0' || r-&gt;uri[strlen(r-&gt;uri) - 1] != '/')</div><div class='del'>-        {</div><div class='del'>-                if (!d-&gt;do_slash) {</div><div class='del'>-                        return DECLINED;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                /* Only redirect non-get requests if we have no note to warn</div><div class='del'>-                 * that this browser cannot handle redirs on non-GET requests</div><div class='del'>-                 * (such as Microsoft's WebFolders).</div><div class='del'>-                 */</div><div class='del'>-                if ((r-&gt;method_number != M_GET)</div><div class='del'>-                    &amp;&amp; apr_table_get(r-&gt;subprocess_env, "redirect-carefully")) {</div><div class='del'>-                        return DECLINED;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                if (r-&gt;args != NULL) {</div><div class='del'>-                        ifile = apr_pstrcat(r-&gt;pool, ap_escape_uri(r-&gt;pool,</div><div class='del'>-                                                                   r-&gt;uri),</div><div class='del'>-                                            "/", "?", r-&gt;args, NULL);</div><div class='del'>-                }</div><div class='del'>-                else {</div><div class='del'>-                        ifile = apr_pstrcat(r-&gt;pool, ap_escape_uri(r-&gt;pool,</div><div class='del'>-                                                                   r-&gt;uri),</div><div class='del'>-                                            "/", NULL);</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                apr_table_setn(r-&gt;headers_out, "Location",</div><div class='del'>-                               ap_construct_url(r-&gt;pool, ifile, r));</div><div class='del'>-                return HTTP_MOVED_PERMANENTLY;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (d-&gt;index_names) {</div><div class='del'>-                names_ptr = (char **)d-&gt;index_names-&gt;elts;</div><div class='del'>-                num_names = d-&gt;index_names-&gt;nelts;</div><div class='del'>-        }</div><div class='del'>-        else {</div><div class='del'>-                dummy_ptr[0] = AP_DEFAULT_INDEX;</div><div class='del'>-                names_ptr = dummy_ptr;</div><div class='del'>-                num_names = 1;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        for (; num_names; ++names_ptr, --num_names) {</div><div class='del'>-                /* XXX: Is this name_ptr considered escaped yet, or not??? */</div><div class='del'>-                name_ptr = *names_ptr;</div><div class='del'>-</div><div class='del'>-                /* Once upon a time args were handled _after_ the successful</div><div class='del'>-                 * redirect. But that redirect might then _refuse_ the </div><div class='del'>-                 * given r-&gt;args, creating a nasty tangle.  It seems safer to </div><div class='del'>-                 * consider the r-&gt;args while we determine if name_ptr is our </div><div class='del'>-                 * viable index, and therefore set them up correctly on redirect.</div><div class='del'>-                 */</div><div class='del'>-                if (r-&gt;args != NULL) {</div><div class='del'>-                        name_ptr = apr_pstrcat(r-&gt;pool, name_ptr, "?", r-&gt;args,</div><div class='del'>-                                               NULL);</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                rr = ap_sub_req_lookup_uri(name_ptr, r, NULL);</div><div class='del'>-</div><div class='del'>-                /* The sub request lookup is very liberal, and the core </div><div class='del'>-                 * map_to_storage handler will almost always result in HTTP_OK </div><div class='del'>-                 * as /foo/index.html may be /foo with PATH_INFO="/index.html",</div><div class='del'>-                 * or even / with PATH_INFO="/foo/index.html". To get around </div><div class='del'>-                 * this we insist that the the index be a regular filetype.</div><div class='del'>-                 *</div><div class='del'>-                 * Another reason is that the core handler also makes the </div><div class='del'>-                 * assumption that if r-&gt;finfo is still NULL by the time it </div><div class='del'>-                 * gets called, the file does not exist.</div><div class='del'>-                 */</div><div class='del'>-                if (rr-&gt;status == HTTP_OK</div><div class='del'>-                    &amp;&amp; (   (rr-&gt;handler &amp;&amp; !strcmp(rr-&gt;handler, "proxy-server"))</div><div class='del'>-                           || rr-&gt;finfo.filetype == APR_REG)) {</div><div class='del'>-                        ap_internal_fast_redirect(rr, r);</div><div class='del'>-                        return OK;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                /* If the request returned a redirect, propagate it to the </div><div class='del'>-                 * client</div><div class='del'>-                 */</div><div class='del'>-</div><div class='del'>-                if (ap_is_HTTP_REDIRECT(rr-&gt;status)</div><div class='del'>-                    || (rr-&gt;status == HTTP_NOT_ACCEPTABLE &amp;&amp; num_names == 1)</div><div class='del'>-                    || (rr-&gt;status == HTTP_UNAUTHORIZED &amp;&amp; num_names == 1)) {</div><div class='del'>-</div><div class='del'>-                        apr_pool_join(r-&gt;pool, rr-&gt;pool);</div><div class='del'>-                        error_notfound = rr-&gt;status;</div><div class='del'>-                        r-&gt;notes = apr_table_overlay(r-&gt;pool, r-&gt;notes,</div><div class='del'>-                                                     rr-&gt;notes);</div><div class='del'>-                        r-&gt;headers_out = apr_table_overlay(r-&gt;pool,</div><div class='del'>-                                                           r-&gt;headers_out,</div><div class='del'>-                                                           rr-&gt;headers_out);</div><div class='del'>-                        r-&gt;err_headers_out = apr_table_overlay(r-&gt;pool,</div><div class='del'>-                                                               r-&gt;err_headers_out,</div><div class='del'>-                                                               rr-&gt;err_headers_out);</div><div class='del'>-                        return error_notfound;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                /* If the request returned something other than 404 (or 200),</div><div class='del'>-                 * it means the module encountered some sort of problem. To be</div><div class='del'>-                 * secure, we should return the error, rather than allow </div><div class='del'>-                 * autoindex to create a (possibly unsafe) directory index.</div><div class='del'>-                 *</div><div class='del'>-                 * So we store the error, and if none of the listed files</div><div class='del'>-                 * exist, we return the last error response we got, instead</div><div class='del'>-                 * of a directory listing.</div><div class='del'>-                 */</div><div class='del'>-                if (rr-&gt;status &amp;&amp; rr-&gt;status != HTTP_NOT_FOUND</div><div class='del'>-                    &amp;&amp; rr-&gt;status != HTTP_OK) {</div><div class='del'>-                        error_notfound = rr-&gt;status;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                ap_destroy_sub_req(rr);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (error_notfound) {</div><div class='del'>-                return error_notfound;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        /* nothing for us to do, pass on through */</div><div class='del'>-        return DECLINED;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-static void </div><div class='del'>-mod_glfs_register_hooks(apr_pool_t *p)</div><div class='del'>-{</div><div class='del'>-        ap_hook_child_init (mod_glfs_child_init, NULL, NULL, APR_HOOK_MIDDLE);</div><div class='del'>-        ap_hook_handler (mod_glfs_handler, NULL, NULL, APR_HOOK_REALLY_FIRST);</div><div class='del'>-        ap_hook_map_to_storage (mod_glfs_map_to_storage, NULL, NULL,</div><div class='del'>-                                APR_HOOK_REALLY_FIRST);</div><div class='del'>-        ap_hook_fixups(mod_glfs_fixup_dir,NULL,NULL,APR_HOOK_LAST);</div><div class='del'>-</div><div class='del'>-/*    mod_glfs_output_filter_handle = </div><div class='del'>-      ap_register_output_filter ("MODGLFS", mod_glfs_output_filter,</div><div class='del'>-      NULL, AP_FTYPE_PROTOCOL); */</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-static const char *</div><div class='del'>-cmd_add_index (cmd_parms *cmd, void *dummy, const char *arg)</div><div class='del'>-{</div><div class='del'>-        glusterfs_dir_config_t *d = dummy;</div><div class='del'>-</div><div class='del'>-        if (!d-&gt;index_names) {</div><div class='del'>-                d-&gt;index_names = apr_array_make(cmd-&gt;pool, 2, sizeof(char *));</div><div class='del'>-        }</div><div class='del'>-        *(const char **)apr_array_push(d-&gt;index_names) = arg;</div><div class='del'>-        return NULL;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-static const char *</div><div class='del'>-cmd_configure_slash (cmd_parms *cmd, void *d_, int arg)</div><div class='del'>-{</div><div class='del'>-        glusterfs_dir_config_t *d = d_;</div><div class='del'>-</div><div class='del'>-        d-&gt;do_slash = arg ? SLASH_ON : SLASH_OFF;</div><div class='del'>-        return NULL;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-#define DIR_CMD_PERMS OR_INDEXES</div><div class='del'>-</div><div class='del'>-static const </div><div class='del'>-command_rec mod_glfs_cmds[] =</div><div class='del'>-{</div><div class='del'>-        AP_INIT_TAKE1(</div><div class='del'>-                "GlusterfsLogfile",</div><div class='del'>-                cmd_add_logfile,</div><div class='del'>-                NULL,</div><div class='del'>-                ACCESS_CONF, /*FIXME: allow overriding in .htaccess files */</div><div class='del'>-                "Glusterfs logfile"</div><div class='del'>-                ),</div><div class='del'>-</div><div class='del'>-        AP_INIT_TAKE1(</div><div class='del'>-                "GlusterfsLoglevel",</div><div class='del'>-                cmd_set_loglevel,</div><div class='del'>-                NULL,</div><div class='del'>-                ACCESS_CONF,</div><div class='del'>-                "Glusterfs loglevel:anyone of none, critical, error, warning, "</div><div class='del'>-                "debug"</div><div class='del'>-                ),</div><div class='del'>-</div><div class='del'>-        AP_INIT_TAKE1(</div><div class='del'>-                "GlusterfsCacheTimeout",</div><div class='del'>-                cmd_set_cache_timeout,</div><div class='del'>-                NULL,</div><div class='del'>-                ACCESS_CONF,</div><div class='del'>-                "Timeout value in seconds for lookup and stat cache of "</div><div class='del'>-                "libglusterfsclient"</div><div class='del'>-                ),</div><div class='del'>-</div><div class='del'>-        AP_INIT_TAKE1(</div><div class='del'>-                "GlusterfsVolumeSpecfile",</div><div class='del'>-                cmd_add_volume_specfile,</div><div class='del'>-                NULL,</div><div class='del'>-                ACCESS_CONF,</div><div class='del'>-                "Glusterfs Volume specfication file specifying filesystem "</div><div class='del'>-                "under this directory"</div><div class='del'>-                ),</div><div class='del'>-</div><div class='del'>-        AP_INIT_TAKE1(</div><div class='del'>-                "GlusterfsXattrFileSize",</div><div class='del'>-                cmd_add_xattr_file_size,</div><div class='del'>-                NULL,</div><div class='del'>-                ACCESS_CONF,</div><div class='del'>-                "Maximum size of the file that can be fetched through "</div><div class='del'>-                "extended attribute interface of libglusterfsclient"</div><div class='del'>-                ),</div><div class='del'>-</div><div class='del'>-        /* mod_dir cmds */</div><div class='del'>-        AP_INIT_ITERATE("DirectoryIndex", cmd_add_index, </div><div class='del'>-                        NULL, DIR_CMD_PERMS,</div><div class='del'>-                        "a list of file names"),</div><div class='del'>-</div><div class='del'>-        AP_INIT_FLAG("DirectorySlash", cmd_configure_slash, </div><div class='del'>-                     NULL, DIR_CMD_PERMS,</div><div class='del'>-                     "On or Off"),</div><div class='del'>-</div><div class='del'>-        /* autoindex cmds */</div><div class='del'>-        AP_INIT_ITERATE2("AddIcon", cmd_add_icon, </div><div class='del'>-                         BY_PATH, DIR_CMD_PERMS,</div><div class='del'>-                         "an icon URL followed by one or more filenames"),</div><div class='del'>-</div><div class='del'>-        AP_INIT_ITERATE2("AddIconByType", cmd_add_icon, </div><div class='del'>-                         BY_TYPE, DIR_CMD_PERMS,</div><div class='del'>-                         "an icon URL followed by one or more MIME types"),</div><div class='del'>-</div><div class='del'>-        AP_INIT_ITERATE2("AddIconByEncoding", cmd_add_icon, </div><div class='del'>-                         BY_ENCODING, DIR_CMD_PERMS,</div><div class='del'>-                         "an icon URL followed by one or more content encodings"),</div><div class='del'>-</div><div class='del'>-        AP_INIT_ITERATE2("AddAlt", cmd_add_alt, BY_PATH, </div><div class='del'>-                         DIR_CMD_PERMS,</div><div class='del'>-                         "alternate descriptive text followed by one or more "</div><div class='del'>-                         "filenames"),</div><div class='del'>-</div><div class='del'>-        AP_INIT_ITERATE2("AddAltByType", cmd_add_alt, </div><div class='del'>-                         BY_TYPE, DIR_CMD_PERMS,</div><div class='del'>-                         "alternate descriptive text followed by one or more "</div><div class='del'>-                         "MIME types"),</div><div class='del'>-</div><div class='del'>-        AP_INIT_ITERATE2("AddAltByEncoding", cmd_add_alt, </div><div class='del'>-                         BY_ENCODING, DIR_CMD_PERMS,</div><div class='del'>-                         "alternate descriptive text followed by one or more "</div><div class='del'>-                         "content encodings"),</div><div class='del'>-</div><div class='del'>-        AP_INIT_TAKE_ARGV("IndexOptions", cmd_add_opts, </div><div class='del'>-                          NULL, DIR_CMD_PERMS,</div><div class='del'>-                          "one or more index options [+|-][]"),</div><div class='del'>-</div><div class='del'>-        AP_INIT_TAKE2("IndexOrderDefault", cmd_set_default_order, </div><div class='del'>-                      NULL, DIR_CMD_PERMS,</div><div class='del'>-                      "{Ascending,Descending} {Name,Size,Description,Date}"),</div><div class='del'>-</div><div class='del'>-        AP_INIT_ITERATE("IndexIgnore", cmd_add_ignore, </div><div class='del'>-                        NULL, DIR_CMD_PERMS,</div><div class='del'>-                        "one or more file extensions"),</div><div class='del'>-</div><div class='del'>-        AP_INIT_ITERATE2("AddDescription", cmd_add_desc, </div><div class='del'>-                         BY_PATH, DIR_CMD_PERMS,</div><div class='del'>-                         "Descriptive text followed by one or more filenames"),</div><div class='del'>-</div><div class='del'>-        AP_INIT_TAKE1("HeaderName", cmd_add_header, </div><div class='del'>-                      NULL, DIR_CMD_PERMS,</div><div class='del'>-                      "a filename"),</div><div class='del'>-</div><div class='del'>-        AP_INIT_TAKE1("ReadmeName", cmd_add_readme, </div><div class='del'>-                      NULL, DIR_CMD_PERMS,</div><div class='del'>-                      "a filename"),</div><div class='del'>-</div><div class='del'>-        AP_INIT_RAW_ARGS("FancyIndexing", ap_set_deprecated, </div><div class='del'>-                         NULL, OR_ALL,</div><div class='del'>-                         "The FancyIndexing directive is no longer supported. "</div><div class='del'>-                         "Use IndexOptions FancyIndexing."),</div><div class='del'>-</div><div class='del'>-        AP_INIT_TAKE1("DefaultIcon", ap_set_string_slot,</div><div class='del'>-                      (void *)APR_OFFSETOF(glusterfs_dir_config_t,</div><div class='del'>-                                           default_icon),</div><div class='del'>-                      DIR_CMD_PERMS, "an icon URL"),</div><div class='del'>-</div><div class='del'>-        AP_INIT_TAKE1("IndexStyleSheet", ap_set_string_slot,</div><div class='del'>-                      (void *)APR_OFFSETOF(glusterfs_dir_config_t, style_sheet),</div><div class='del'>-                      DIR_CMD_PERMS, "URL to style sheet"),</div><div class='del'>-</div><div class='del'>-        {NULL}</div><div class='del'>-};</div><div class='del'>-</div><div class='del'>-module AP_MODULE_DECLARE_DATA glusterfs_module =</div><div class='del'>-{</div><div class='del'>-        STANDARD20_MODULE_STUFF,</div><div class='del'>-        mod_glfs_create_dir_config,</div><div class='del'>-        mod_glfs_merge_dir_config,</div><div class='del'>-        NULL, //mod_glfs_create_server_config,</div><div class='del'>-        NULL, //mod_glfs_merge_server_config,</div><div class='del'>-        mod_glfs_cmds,</div><div class='del'>-        mod_glfs_register_hooks,</div><div class='del'>-};</div><div class='head'>diff --git a/mod_glusterfs/apache/Makefile.am b/mod_glusterfs/apache/Makefile.am<br/>deleted file mode 100644<br/>index bda03931052..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/mod_glusterfs/apache/Makefile.am?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>mod_glusterfs/apache/Makefile.am</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,10 +0,0 @@</div><div class='del'>-SUBDIRS = $(MOD_GLUSTERFS_HTTPD_VERSION)</div><div class='del'>-</div><div class='del'>-EXTRA_DIST = 1.3/Makefile.am 1.3/Makefile.in \</div><div class='del'>-	     1.3/src/Makefile.am 1.3/src/Makefile.in \</div><div class='del'>-	     1.3/src/mod_glusterfs.c \</div><div class='del'>-	     1.3/src/README.txt \</div><div class='del'>-	     2.2/Makefile.am 2.2/Makefile.in \</div><div class='del'>-	     2.2/src/Makefile.am 2.2/src/Makefile.in \</div><div class='del'>-	     2.2/src/mod_glusterfs.c</div><div class='del'>-CLEANFILES = </div><div class='head'>diff --git a/mod_glusterfs/lighttpd/1.4/Makefile.am b/mod_glusterfs/lighttpd/1.4/Makefile.am<br/>deleted file mode 100644<br/>index eda329111dc..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/mod_glusterfs/lighttpd/1.4/Makefile.am?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>mod_glusterfs/lighttpd/1.4/Makefile.am</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,3 +0,0 @@</div><div class='del'>-EXTRA_DIST = Makefile.am.diff mod_glusterfs.c mod_glusterfs.h README.txt</div><div class='del'>-</div><div class='del'>-CLEANFILES = </div><div class='head'>diff --git a/mod_glusterfs/lighttpd/1.4/Makefile.am.diff b/mod_glusterfs/lighttpd/1.4/Makefile.am.diff<br/>deleted file mode 100644<br/>index 375696b5d8f..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/mod_glusterfs/lighttpd/1.4/Makefile.am.diff?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>mod_glusterfs/lighttpd/1.4/Makefile.am.diff</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,29 +0,0 @@</div><div class='del'>---- lighttpd-1.4.19/src/Makefile.am	2008-04-16 18:42:18.000000000 +0400</div><div class='del'>-+++ lighttpd-1.4.19.mod/src/Makefile.am	2008-04-16 18:41:11.000000000 +0400</div><div class='del'>-@@ -1,4 +1,4 @@</div><div class='del'>--AM_CFLAGS = $(FAM_CFLAGS)</div><div class='del'>-+AM_CFLAGS = $(FAM_CFLAGS)  -D_FILE_OFFSET_BITS=64 -D__USE_FILE_OFFSET64</div><div class='del'>- </div><div class='del'>- noinst_PROGRAMS=proc_open lemon # simple-fcgi #graphic evalo bench ajp ssl error_test adserver gen-license</div><div class='del'>- sbin_PROGRAMS=lighttpd lighttpd-angel</div><div class='del'>-@@ -241,6 +241,11 @@</div><div class='del'>- mod_accesslog_la_LDFLAGS = -module -export-dynamic -avoid-version -no-undefined</div><div class='del'>- mod_accesslog_la_LIBADD = $(common_libadd)</div><div class='del'>- </div><div class='del'>-+lib_LTLIBRARIES += mod_glusterfs.la</div><div class='del'>-+mod_glusterfs_la_SOURCES = mod_glusterfs.c</div><div class='del'>-+mod_glusterfs_la_CFLAGS = $(AM_CFLAGS) </div><div class='del'>-+mod_glusterfs_la_LDFLAGS = -module -export-dynamic -avoid-version -no-undefined -lglusterfsclient -lpthread</div><div class='del'>-+mod_glusterfs_la_LIBADD = $(common_libadd) </div><div class='del'>- </div><div class='del'>- hdr = server.h buffer.h network.h log.h keyvalue.h \</div><div class='del'>-       response.h request.h fastcgi.h chunk.h \</div><div class='del'>-@@ -254,7 +259,7 @@</div><div class='del'>-       configparser.h mod_ssi_exprparser.h \</div><div class='del'>-       sys-mmap.h sys-socket.h mod_cml.h mod_cml_funcs.h \</div><div class='del'>-       splaytree.h proc_open.h status_counter.h \</div><div class='del'>--      mod_magnet_cache.h</div><div class='del'>-+      mod_magnet_cache.h mod_glusterfs.h</div><div class='del'>- </div><div class='del'>- DEFS= @DEFS@ -DLIBRARY_DIR="\"$(libdir)\"" -DSBIN_DIR="\"$(sbindir)\""</div><div class='del'>- </div><div class='head'>diff --git a/mod_glusterfs/lighttpd/1.4/README.txt b/mod_glusterfs/lighttpd/1.4/README.txt<br/>deleted file mode 100644<br/>index 786a146e44d..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/mod_glusterfs/lighttpd/1.4/README.txt?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>mod_glusterfs/lighttpd/1.4/README.txt</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,57 +0,0 @@</div><div class='del'>-Introduction</div><div class='del'>-============</div><div class='del'>-mod_glusterfs is a module written for lighttpd to speed up the access of files present on glusterfs. mod_glusterfs uses libglusterfsclient library provided for glusterfs and hence can be used without fuse (File System in User Space).</div><div class='del'>-</div><div class='del'>-Usage</div><div class='del'>-=====</div><div class='del'>-To use mod_glusterfs with lighttpd-1.4, copy mod_glusterfs.c and mod_glusterfs.h into src/ of lighttpd-1.4 source tree, and apply the Makefile.am.diff to src/Makefile.am. Re-run ./autogen.sh on the top level of the lighttpd-1.4 build tree and recompile.</div><div class='del'>-</div><div class='del'>-# cp mod_glusterfs.[ch] /home/glusterfs/lighttpd-1.4/src/</div><div class='del'>-# cp Makefile.am.diff /home/glusterfs/lighttpd-1.4/</div><div class='del'>-# cd /home/glusterfs/lighttpd-1.4</div><div class='del'>-# patch -p1 &lt; Makefile.am.diff </div><div class='del'>-# ./autogen.sh</div><div class='del'>-# ./configure</div><div class='del'>-# make</div><div class='del'>-# make install</div><div class='del'>-</div><div class='del'>-Configuration</div><div class='del'>-=============</div><div class='del'>-* mod_glusterfs should be listed at the begining of the list server.modules in lighttpd.conf. </div><div class='del'>-</div><div class='del'>-Below is a snippet from lighttpd.conf concerning to mod_glusterfs.</div><div class='del'>-</div><div class='del'>-$HTTP["url"] =~ "^/glusterfs" {</div><div class='del'>-	glusterfs.prefix = "/glusterfs" </div><div class='del'>-	glusterfs.document-root = "/home/glusterfs/document-root"</div><div class='del'>-	glusterfs.logfile = "/var/log/glusterfs-logfile"</div><div class='del'>-	glusterfs.volume-specfile = "/etc/glusterfs/glusterfs.vol"</div><div class='del'>-	glusterfs.loglevel = "error"</div><div class='del'>-	glusterfs.cache-timeout = 300</div><div class='del'>-	glusterfs.xattr-interface-size-limit = "65536"</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-* $HTTP["url"] =~ "^/glusterfs"</div><div class='del'>-  A perl style regular expression used to match against the url. If regular expression matches the url, the url is handled by mod_glusterfs. Note that the pattern given here should match glusterfs.prefix.</div><div class='del'>-</div><div class='del'>-* glusterfs.prefix (COMPULSORY)</div><div class='del'>-  A string to be present at the starting of the file path in the url so that the file would be handled by glusterfs.</div><div class='del'>-  Eg., A GET request on the url http://www.example.com/glusterfs-prefix/some-dir/example-file will result in fetching of the file "/some-dir/example-file" from glusterfs mount if glusterfs.prefix is set to "/glusterfs-prefix".</div><div class='del'>-</div><div class='del'>-* glusterfs.volume-specfile (COMPULSORY)</div><div class='del'>-  Path to the the glusterfs volume specification file.</div><div class='del'>-</div><div class='del'>-* glusterfs.logfile (COMPULSORY)</div><div class='del'>-  Path to the glusterfs logfile.</div><div class='del'>-</div><div class='del'>-* glusterfs.loglevel (OPTIONAL, default = warning)</div><div class='del'>-  Allowed values are critical, error, warning, debug, none in the decreasing order of severity of error conditions.</div><div class='del'>-</div><div class='del'>-* glusterfs.cache-timeout (OPTIONAL, default = 0)</div><div class='del'>-  Timeout values for glusterfs stat and lookup cache.</div><div class='del'>-</div><div class='del'>-* glusterfs.document-root (COMPULSORY)</div><div class='del'>-  An absolute path, relative to which all the files are fetched from glusterfs.</div><div class='del'>-</div><div class='del'>-* glusterfs.xattr-interface-size-limit (OPTIONAL, default = 0)</div><div class='del'>-  Files with sizes upto and including this value are fetched through the extended attribute interface of glusterfs rather than the usual open-read-close set of operations. For files of small sizes, it is recommended to use extended attribute interface.</div><div class='head'>diff --git a/mod_glusterfs/lighttpd/1.4/mod_glusterfs.c b/mod_glusterfs/lighttpd/1.4/mod_glusterfs.c<br/>deleted file mode 100644<br/>index 3cee6d541f4..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/mod_glusterfs/lighttpd/1.4/mod_glusterfs.c?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>mod_glusterfs/lighttpd/1.4/mod_glusterfs.c</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,1820 +0,0 @@</div><div class='del'>-/*</div><div class='del'>-  Copyright (c) 2008-2009 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='del'>-  This file is part of GlusterFS.</div><div class='del'>-</div><div class='del'>-  GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-  it under the terms of the GNU General Public License as published</div><div class='del'>-  by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-  or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-  GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-  WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-  General Public License for more details.</div><div class='del'>-</div><div class='del'>-  You should have received a copy of the GNU General Public License</div><div class='del'>-  along with this program.  If not, see</div><div class='del'>-  &lt;http://www.gnu.org/licenses/&gt;.</div><div class='del'>-*/</div><div class='del'>-</div><div class='del'>-#include &lt;ctype.h&gt;</div><div class='del'>-#include &lt;stdlib.h&gt;</div><div class='del'>-#include &lt;stdio.h&gt;</div><div class='del'>-#include &lt;string.h&gt;</div><div class='del'>-#include &lt;pthread.h&gt;</div><div class='del'>-#include &lt;sys/types.h&gt;</div><div class='del'>-#include &lt;fcntl.h&gt;</div><div class='del'>-</div><div class='del'>-#include &lt;sys/types.h&gt;</div><div class='del'>-#include &lt;sys/stat.h&gt;</div><div class='del'>-</div><div class='del'>-#include &lt;errno.h&gt;</div><div class='del'>-#include &lt;unistd.h&gt;</div><div class='del'>-#include &lt;assert.h&gt;</div><div class='del'>-</div><div class='del'>-#include "base.h"</div><div class='del'>-#include "log.h"</div><div class='del'>-#include "buffer.h"</div><div class='del'>-</div><div class='del'>-#include "plugin.h"</div><div class='del'>-</div><div class='del'>-#include "stat_cache.h"</div><div class='del'>-#include "mod_glusterfs.h"</div><div class='del'>-#include "etag.h"</div><div class='del'>-#include "http_chunk.h"</div><div class='del'>-#include "response.h"</div><div class='del'>-</div><div class='del'>-#include "fdevent.h"</div><div class='del'>-#include &lt;libglusterfsclient.h&gt;</div><div class='del'>-</div><div class='del'>-#ifdef HAVE_ATTR_ATTRIBUTES_H</div><div class='del'>-#include &lt;attr/attributes.h&gt;</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-#ifdef HAVE_FAM_H</div><div class='del'>-# include &lt;fam.h&gt;</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-#include "sys-mmap.h"</div><div class='del'>-</div><div class='del'>-/* NetBSD 1.3.x needs it */</div><div class='del'>-#ifndef MAP_FAILED</div><div class='del'>-# define MAP_FAILED -1</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-#ifndef O_LARGEFILE</div><div class='del'>-# define O_LARGEFILE 0</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-#ifndef HAVE_LSTAT</div><div class='del'>-#define lstat stat</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-#if 0</div><div class='del'>-/* </div><div class='del'>-   enables debug code for testing if all nodes in the stat-cache as accessable</div><div class='del'>-*/</div><div class='del'>-#define DEBUG_STAT_CACHE</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-#ifdef HAVE_LSTAT</div><div class='del'>-#undef HAVE_LSTAT</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-#define GLUSTERFS_FILE_CHUNK (FILE_CHUNK + 1)</div><div class='del'>-</div><div class='del'>-/* </div><div class='del'>-   Keep this value large. Each glusterfs_async_read of GLUSTERFS_CHUNK_SIZE</div><div class='del'>-   results in a network_backend_write of the read data</div><div class='del'>-*/</div><div class='del'>-</div><div class='del'>-#define GLUSTERFS_CHUNK_SIZE 8192</div><div class='del'>-</div><div class='del'>-/**</div><div class='del'>- * this is a staticfile for a lighttpd plugin</div><div class='del'>- *</div><div class='del'>- */</div><div class='del'>-</div><div class='del'>-typedef struct glusterfs_async_local {</div><div class='del'>-        int op_ret;</div><div class='del'>-        int op_errno;</div><div class='del'>-        char async_read_complete;</div><div class='del'>-        off_t length;</div><div class='del'>-        size_t read_bytes;</div><div class='del'>-        glusterfs_iobuf_t *buf;</div><div class='del'>-        pthread_mutex_t lock;</div><div class='del'>-        pthread_cond_t cond;</div><div class='del'>-} glusterfs_async_local_t;</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-typedef struct {</div><div class='del'>-        glusterfs_file_t fd;</div><div class='del'>-        void *buf;</div><div class='del'>-        buffer *glusterfs_path;</div><div class='del'>-        /*  off_t response_content_length; */</div><div class='del'>-        int prefix;</div><div class='del'>-}mod_glusterfs_ctx_t;</div><div class='del'>-</div><div class='del'>-/* plugin config for all request/connections */</div><div class='del'>-typedef struct {</div><div class='del'>-        buffer *logfile;</div><div class='del'>-        buffer *loglevel;</div><div class='del'>-        buffer *specfile;</div><div class='del'>-        buffer *prefix;</div><div class='del'>-        buffer *xattr_file_size;</div><div class='del'>-        buffer *document_root;</div><div class='del'>-        array *exclude_exts;</div><div class='del'>-        unsigned short cache_timeout;</div><div class='del'>-        char mounted;</div><div class='del'>-} plugin_config;</div><div class='del'>-</div><div class='del'>-static int (*network_backend_write)(struct server *srv, connection *con, int fd,</div><div class='del'>-                                    chunkqueue *cq);</div><div class='del'>-</div><div class='del'>-typedef struct {</div><div class='del'>-        PLUGIN_DATA;</div><div class='del'>-        buffer *range_buf;</div><div class='del'>-        plugin_config **config_storage;</div><div class='del'>-  </div><div class='del'>-        plugin_config conf;</div><div class='del'>-} plugin_data;</div><div class='del'>-</div><div class='del'>-typedef struct {</div><div class='del'>-        chunkqueue *cq;</div><div class='del'>-        glusterfs_iobuf_t *buf;</div><div class='del'>-        size_t length;</div><div class='del'>-}mod_glusterfs_chunkqueue;</div><div class='del'>-</div><div class='del'>-#ifdef HAVE_FAM_H</div><div class='del'>-typedef struct {</div><div class='del'>-        FAMRequest *req;</div><div class='del'>-        FAMConnection *fc;</div><div class='del'>-</div><div class='del'>-        buffer *name;</div><div class='del'>-</div><div class='del'>-        int version;</div><div class='del'>-} fam_dir_entry;</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-/* the directory name is too long to always compare on it</div><div class='del'>- * - we need a hash</div><div class='del'>- * - the hash-key is used as sorting criteria for a tree</div><div class='del'>- * - a splay-tree is used as we can use the caching effect of it</div><div class='del'>- */</div><div class='del'>-</div><div class='del'>-/* we want to cleanup the stat-cache every few seconds, let's say 10</div><div class='del'>- *</div><div class='del'>- * - remove entries which are outdated since 30s</div><div class='del'>- * - remove entries which are fresh but havn't been used since 60s</div><div class='del'>- * - if we don't have a stat-cache entry for a directory, release it from the </div><div class='del'>- *   monitor</div><div class='del'>- */</div><div class='del'>-</div><div class='del'>-#ifdef DEBUG_STAT_CACHE</div><div class='del'>-typedef struct {</div><div class='del'>-        int *ptr;</div><div class='del'>-</div><div class='del'>-        size_t used;</div><div class='del'>-        size_t size;</div><div class='del'>-} fake_keys;</div><div class='del'>-</div><div class='del'>-static fake_keys ctrl;</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-int </div><div class='del'>-mod_glusterfs_readv_async_cbk (int op_ret, int op_errno,</div><div class='del'>-                               glusterfs_iobuf_t *buf,</div><div class='del'>-                               void *cbk_data)</div><div class='del'>-{</div><div class='del'>-        glusterfs_async_local_t *local = cbk_data;</div><div class='del'>-        pthread_mutex_lock (&amp;local-&gt;lock);</div><div class='del'>-        {</div><div class='del'>-                local-&gt;async_read_complete = 1;</div><div class='del'>-                local-&gt;buf = buf;</div><div class='del'>-                local-&gt;op_ret = op_ret;</div><div class='del'>-                local-&gt;op_errno = op_errno;</div><div class='del'>-                pthread_cond_signal (&amp;local-&gt;cond);</div><div class='del'>-        }</div><div class='del'>-        pthread_mutex_unlock (&amp;local-&gt;lock);</div><div class='del'>-</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-static int</div><div class='del'>-mod_glusterfs_read_async (server *srv, connection *con, chunk *glusterfs_chunk)</div><div class='del'>-{</div><div class='del'>-        glusterfs_async_local_t local;</div><div class='del'>-        off_t end = 0;</div><div class='del'>-        int nbytes;</div><div class='del'>-        int complete;</div><div class='del'>-        chunkqueue *cq = NULL;</div><div class='del'>-        chunk *c = NULL;</div><div class='del'>-        off_t offset = glusterfs_chunk-&gt;file.start;</div><div class='del'>-        size_t length = glusterfs_chunk-&gt;file.length;</div><div class='del'>-        glusterfs_file_t fd = glusterfs_chunk-&gt;file.name;</div><div class='del'>-</div><div class='del'>-        pthread_cond_init (&amp;local.cond, NULL);</div><div class='del'>-        pthread_mutex_init (&amp;local.lock, NULL);</div><div class='del'>-  </div><div class='del'>-        //local.fd = fd;</div><div class='del'>-        memset (&amp;local, 0, sizeof (local));</div><div class='del'>-</div><div class='del'>-        if (length &gt; 0)</div><div class='del'>-                end = offset + length;</div><div class='del'>-</div><div class='del'>-        cq = chunkqueue_init ();</div><div class='del'>-        if (!cq) {</div><div class='del'>-                con-&gt;http_status = 500;</div><div class='del'>-                return HANDLER_FINISHED;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        do {</div><div class='del'>-                glusterfs_iobuf_t *buf;</div><div class='del'>-                int i;</div><div class='del'>-                if (length &gt; 0) {</div><div class='del'>-                        nbytes = end - offset;</div><div class='del'>-                        if (nbytes &gt; GLUSTERFS_CHUNK_SIZE)</div><div class='del'>-                                nbytes = GLUSTERFS_CHUNK_SIZE;</div><div class='del'>-                } else</div><div class='del'>-                        nbytes = GLUSTERFS_CHUNK_SIZE;</div><div class='del'>-</div><div class='del'>-                glusterfs_read_async(fd, </div><div class='del'>-                                     nbytes,</div><div class='del'>-                                     offset,</div><div class='del'>-                                     mod_glusterfs_readv_async_cbk,</div><div class='del'>-                                     (void *)&amp;local);</div><div class='del'>-</div><div class='del'>-                pthread_mutex_lock (&amp;local.lock);</div><div class='del'>-                {</div><div class='del'>-                        while (!local.async_read_complete) {</div><div class='del'>-                                pthread_cond_wait (&amp;local.cond, &amp;local.lock);</div><div class='del'>-                        }</div><div class='del'>-</div><div class='del'>-                        local.async_read_complete = 0;</div><div class='del'>-                        buf = local.buf;</div><div class='del'>-</div><div class='del'>-                        if ((int)length &lt; 0)</div><div class='del'>-                                complete = (local.op_ret &lt;= 0);</div><div class='del'>-                        else {</div><div class='del'>-                                local.read_bytes += local.op_ret;</div><div class='del'>-                                complete = ((local.read_bytes == length)</div><div class='del'>-                                            || (local.op_ret &lt;= 0));</div><div class='del'>-                        }</div><div class='del'>-                }</div><div class='del'>-                pthread_mutex_unlock (&amp;local.lock);</div><div class='del'>-</div><div class='del'>-                if (local.op_ret &gt; 0) {</div><div class='del'>-                        unsigned long check = 0;</div><div class='del'>-                        for (i = 0; i &lt; buf-&gt;count; i++) {</div><div class='del'>-                                buffer *nw_write_buf = buffer_init ();</div><div class='del'>-</div><div class='del'>-                                check += buf-&gt;vector[i].iov_len;        </div><div class='del'>-</div><div class='del'>-                                nw_write_buf-&gt;used = buf-&gt;vector[i].iov_len + 1;</div><div class='del'>-                                nw_write_buf-&gt;size = buf-&gt;vector[i].iov_len;</div><div class='del'>-                                nw_write_buf-&gt;ptr = buf-&gt;vector[i].iov_base;</div><div class='del'>-</div><div class='del'>-                                offset += local.op_ret;</div><div class='del'>-                                chunkqueue_append_buffer_weak(cq, nw_write_buf);</div><div class='del'>-                        }</div><div class='del'>-  </div><div class='del'>-                        network_backend_write (srv, con, con-&gt;fd, cq);</div><div class='del'>-  </div><div class='del'>-                        if (chunkqueue_written (cq) != local.op_ret) {</div><div class='del'>-                                mod_glusterfs_chunkqueue *gf_cq;</div><div class='del'>-                                glusterfs_chunk-&gt;file.start = offset;</div><div class='del'>-                                if ((int)glusterfs_chunk-&gt;file.length &gt; 0)</div><div class='del'>-                                        glusterfs_chunk-&gt;file.length -= local.read_bytes;</div><div class='del'>-</div><div class='del'>-                                gf_cq = calloc (1, sizeof (*gf_cq));</div><div class='del'>-                                /* ERR_ABORT (gf_cq); */</div><div class='del'>-                                gf_cq-&gt;cq = cq;</div><div class='del'>-                                gf_cq-&gt;buf = buf;</div><div class='del'>-                                gf_cq-&gt;length = local.op_ret;</div><div class='del'>-                                glusterfs_chunk-&gt;file.mmap.start =(char *)gf_cq;</div><div class='del'>-                                return local.read_bytes;</div><div class='del'>-                        }</div><div class='del'>-      </div><div class='del'>-                        for (c = cq-&gt;first ; c; c = c-&gt;next) </div><div class='del'>-                                c-&gt;mem-&gt;ptr = NULL;</div><div class='del'>-</div><div class='del'>-                        chunkqueue_reset (cq);</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                glusterfs_free (buf);</div><div class='del'>-        } while (!complete);</div><div class='del'>-</div><div class='del'>-        chunkqueue_free (cq);</div><div class='del'>-        glusterfs_close (fd);</div><div class='del'>-</div><div class='del'>-        if (local.op_ret &lt; 0)</div><div class='del'>-                con-&gt;http_status = 500;</div><div class='del'>-</div><div class='del'>-        return (local.op_ret &lt; 0 ? HANDLER_FINISHED : HANDLER_GO_ON);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int mod_glusterfs_network_backend_write(struct server *srv, connection *con,</div><div class='del'>-                                        int fd, chunkqueue *cq)</div><div class='del'>-{</div><div class='del'>-        chunk *c, *prev, *first;</div><div class='del'>-        int chunks_written = 0;</div><div class='del'>-        int error = 0;</div><div class='del'>-</div><div class='del'>-        for (first = prev = c = cq-&gt;first; c; c = c-&gt;next, chunks_written++) {</div><div class='del'>-</div><div class='del'>-                if (c-&gt;type == MEM_CHUNK &amp;&amp; c-&gt;mem-&gt;used &amp;&amp; !c-&gt;mem-&gt;ptr) {</div><div class='del'>-                        if (cq-&gt;first != c) {</div><div class='del'>-                                prev-&gt;next = NULL;</div><div class='del'>-</div><div class='del'>-                                /* call stored network_backend_write */</div><div class='del'>-                                network_backend_write (srv, con, fd, cq);</div><div class='del'>-</div><div class='del'>-                                prev-&gt;next = c;</div><div class='del'>-                        } </div><div class='del'>-                        cq-&gt;first = c-&gt;next;</div><div class='del'>-</div><div class='del'>-                        if (c-&gt;file.fd &lt; 0) {</div><div class='del'>-                                error = HANDLER_ERROR;</div><div class='del'>-                                break;</div><div class='del'>-                        }</div><div class='del'>-</div><div class='del'>-                        if (c-&gt;file.mmap.start) {</div><div class='del'>-                                chunk *tmp;</div><div class='del'>-                                mod_glusterfs_chunkqueue *gf_cq = NULL;</div><div class='del'>-</div><div class='del'>-                                gf_cq = (mod_glusterfs_chunkqueue *)c-&gt;file.mmap.start;</div><div class='del'>-</div><div class='del'>-                                network_backend_write (srv, con, fd, gf_cq-&gt;cq);</div><div class='del'>-</div><div class='del'>-                                if ((size_t)chunkqueue_written (gf_cq-&gt;cq) </div><div class='del'>-                                    != gf_cq-&gt;length) {</div><div class='del'>-                                        cq-&gt;first = first;</div><div class='del'>-                                        return chunks_written;</div><div class='del'>-                                }</div><div class='del'>-                                for (tmp = gf_cq-&gt;cq-&gt;first ; tmp;</div><div class='del'>-                                     tmp = tmp-&gt;next)</div><div class='del'>-                                        tmp-&gt;mem-&gt;ptr = NULL;</div><div class='del'>-</div><div class='del'>-                                chunkqueue_free (gf_cq-&gt;cq);</div><div class='del'>-                                glusterfs_free (gf_cq-&gt;buf);</div><div class='del'>-                                free (gf_cq);</div><div class='del'>-                                c-&gt;file.mmap.start = NULL;</div><div class='del'>-                        }</div><div class='del'>-      </div><div class='del'>-                        mod_glusterfs_read_async (srv, con, c);</div><div class='del'>-                        if (c-&gt;file.mmap.start) {</div><div class='del'>-                                /* pending chunkqueue from</div><div class='del'>-                                   mod_glusterfs_read_async to be written to</div><div class='del'>-                                   network */</div><div class='del'>-                                cq-&gt;first = first;</div><div class='del'>-                                return chunks_written;</div><div class='del'>-                        }</div><div class='del'>-</div><div class='del'>-                        buffer_free (c-&gt;mem);</div><div class='del'>-                        c-&gt;mem = NULL;</div><div class='del'>-</div><div class='del'>-                        c-&gt;type = FILE_CHUNK;</div><div class='del'>-                        c-&gt;offset = c-&gt;file.length = 0;</div><div class='del'>-                        c-&gt;file.name = NULL;</div><div class='del'>-</div><div class='del'>-                        if (first == c)</div><div class='del'>-                                first = c-&gt;next;</div><div class='del'>-</div><div class='del'>-                        if (cq-&gt;last == c)</div><div class='del'>-                                cq-&gt;last = NULL;</div><div class='del'>-</div><div class='del'>-                        prev-&gt;next = c-&gt;next;</div><div class='del'>-</div><div class='del'>-                        free(c);</div><div class='del'>-                }     </div><div class='del'>-                prev = c;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        network_backend_write (srv, con, fd, cq);</div><div class='del'>-</div><div class='del'>-        cq-&gt;first = first;</div><div class='del'>-</div><div class='del'>-        return chunks_written;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int chunkqueue_append_glusterfs_file (connection *con, glusterfs_file_t fd,</div><div class='del'>-                                      off_t offset, size_t len, size_t buf_size)</div><div class='del'>-{</div><div class='del'>-        chunk *c = NULL;</div><div class='del'>-        c = chunkqueue_get_append_tempfile (con-&gt;write_queue);</div><div class='del'>-  </div><div class='del'>-        if (c-&gt;file.is_temp) {</div><div class='del'>-                close (c-&gt;file.fd);</div><div class='del'>-                unlink (c-&gt;file.name-&gt;ptr);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        c-&gt;type = MEM_CHUNK;</div><div class='del'>-</div><div class='del'>-        buffer_free (c-&gt;mem);</div><div class='del'>-</div><div class='del'>-        c-&gt;mem = buffer_init ();</div><div class='del'>-        c-&gt;mem-&gt;used = len + 1;</div><div class='del'>-        c-&gt;mem-&gt;size = buf_size;</div><div class='del'>-        c-&gt;mem-&gt;ptr = NULL;</div><div class='del'>-        c-&gt;offset = 0;</div><div class='del'>-</div><div class='del'>-        buffer_free (c-&gt;file.name);</div><div class='del'>-</div><div class='del'>-        /* fd returned by libglusterfsclient is a pointer */</div><div class='del'>-        c-&gt;file.name = (buffer *)fd;</div><div class='del'>-        c-&gt;file.start = offset;</div><div class='del'>-        c-&gt;file.length = len;</div><div class='del'>-</div><div class='del'>-        //c-&gt;file.fd = fd;</div><div class='del'>-        c-&gt;file.mmap.start = NULL;</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-/* init the plugin data */</div><div class='del'>-INIT_FUNC(mod_glusterfs_init) {</div><div class='del'>-        plugin_data *p;</div><div class='del'>-</div><div class='del'>-        p = calloc(1, sizeof(*p));</div><div class='del'>-        network_backend_write = NULL;</div><div class='del'>-</div><div class='del'>-        return p;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-/* detroy the plugin data */</div><div class='del'>-FREE_FUNC(mod_glusterfs_free) {</div><div class='del'>-        plugin_data *p = p_d;</div><div class='del'>-</div><div class='del'>-        UNUSED (srv);</div><div class='del'>-</div><div class='del'>-        if (!p) return HANDLER_GO_ON;</div><div class='del'>-  </div><div class='del'>-        if (p-&gt;config_storage) {</div><div class='del'>-                size_t i;</div><div class='del'>-                for (i = 0; i &lt; srv-&gt;config_context-&gt;used; i++) {</div><div class='del'>-                        plugin_config *s = p-&gt;config_storage[i];</div><div class='del'>-      </div><div class='del'>-                        buffer_free (s-&gt;logfile);</div><div class='del'>-                        buffer_free (s-&gt;loglevel);</div><div class='del'>-                        buffer_free (s-&gt;specfile);</div><div class='del'>-                        buffer_free (s-&gt;prefix);</div><div class='del'>-                        buffer_free (s-&gt;xattr_file_size);</div><div class='del'>-                        buffer_free (s-&gt;document_root);</div><div class='del'>-                        array_free (s-&gt;exclude_exts);</div><div class='del'>-  </div><div class='del'>-                        free (s);</div><div class='del'>-                }</div><div class='del'>-                free (p-&gt;config_storage);</div><div class='del'>-        }</div><div class='del'>-        buffer_free (p-&gt;range_buf);</div><div class='del'>-</div><div class='del'>-        free (p);</div><div class='del'>-  </div><div class='del'>-        return HANDLER_GO_ON;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-SETDEFAULTS_FUNC(mod_glusterfs_set_defaults) {</div><div class='del'>-        plugin_data *p = p_d;</div><div class='del'>-        size_t i = 0;</div><div class='del'>-  </div><div class='del'>-        config_values_t cv[] = {</div><div class='del'>-                { "glusterfs.logfile",              NULL, T_CONFIG_STRING,</div><div class='del'>-                  T_CONFIG_SCOPE_CONNECTION },</div><div class='del'>-    </div><div class='del'>-                { "glusterfs.loglevel",             NULL, T_CONFIG_STRING,</div><div class='del'>-                  T_CONFIG_SCOPE_CONNECTION },    </div><div class='del'>-</div><div class='del'>-                { "glusterfs.volume-specfile",      NULL, T_CONFIG_STRING,</div><div class='del'>-                  T_CONFIG_SCOPE_CONNECTION }, </div><div class='del'>-</div><div class='del'>-                { "glusterfs.cache-timeout",        NULL, T_CONFIG_SHORT,</div><div class='del'>-                  T_CONFIG_SCOPE_CONNECTION },</div><div class='del'>-    </div><div class='del'>-                { "glusterfs.exclude-extensions",   NULL, T_CONFIG_ARRAY,</div><div class='del'>-                  T_CONFIG_SCOPE_CONNECTION },</div><div class='del'>-    </div><div class='del'>-                /*TODO: get the prefix from config_conext and </div><div class='del'>-                  remove glusterfs.prefix from conf file */</div><div class='del'>-                { "glusterfs.prefix",               NULL, T_CONFIG_STRING,</div><div class='del'>-                  T_CONFIG_SCOPE_CONNECTION },</div><div class='del'>-    </div><div class='del'>-                { "glusterfs.xattr-interface-size-limit", NULL, T_CONFIG_STRING,</div><div class='del'>-                  T_CONFIG_SCOPE_CONNECTION },</div><div class='del'>-</div><div class='del'>-                { "glusterfs.document-root",        NULL, T_CONFIG_STRING,</div><div class='del'>-                  T_CONFIG_SCOPE_CONNECTION },</div><div class='del'>-    </div><div class='del'>-                { NULL,                          NULL, T_CONFIG_UNSET,</div><div class='del'>-                  T_CONFIG_SCOPE_UNSET }</div><div class='del'>-        };</div><div class='del'>-  </div><div class='del'>-        p-&gt;config_storage = calloc(1,</div><div class='del'>-                                   srv-&gt;config_context-&gt;used</div><div class='del'>-                                   * sizeof(specific_config *));</div><div class='del'>-        /* ERR_ABORT (p-&gt;config_storage);*/</div><div class='del'>-        p-&gt;range_buf = buffer_init ();</div><div class='del'>-  </div><div class='del'>-        for (i = 0; i &lt; srv-&gt;config_context-&gt;used; i++) {</div><div class='del'>-                plugin_config *s;</div><div class='del'>-</div><div class='del'>-                s = calloc(1, sizeof(plugin_config));</div><div class='del'>-                /* ERR_ABORT (s); */</div><div class='del'>-                s-&gt;logfile = buffer_init ();</div><div class='del'>-                s-&gt;loglevel = buffer_init ();</div><div class='del'>-                s-&gt;specfile = buffer_init ();</div><div class='del'>-                s-&gt;document_root = buffer_init ();</div><div class='del'>-                s-&gt;exclude_exts = array_init ();</div><div class='del'>-                s-&gt;prefix = buffer_init ();</div><div class='del'>-                s-&gt;xattr_file_size = buffer_init ();</div><div class='del'>-    </div><div class='del'>-                cv[0].destination = s-&gt;logfile;</div><div class='del'>-                cv[1].destination = s-&gt;loglevel;</div><div class='del'>-                cv[2].destination = s-&gt;specfile;</div><div class='del'>-                cv[3].destination = &amp;s-&gt;cache_timeout;</div><div class='del'>-                cv[4].destination = s-&gt;exclude_exts;</div><div class='del'>-                cv[5].destination = s-&gt;prefix;</div><div class='del'>-                cv[6].destination = s-&gt;xattr_file_size;</div><div class='del'>-                cv[7].destination = s-&gt;document_root;</div><div class='del'>-                p-&gt;config_storage[i] = s;</div><div class='del'>-    </div><div class='del'>-                if (0 != config_insert_values_global(srv,</div><div class='del'>-                                                     ((data_config *)srv-&gt;config_context-&gt;data[i])-&gt;value,</div><div class='del'>-                                                     cv)) {</div><div class='del'>-                        return HANDLER_FINISHED;</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='del'>-  </div><div class='del'>-        return HANDLER_GO_ON;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-#define PATCH(x)                                \</div><div class='del'>-        p-&gt;conf.x = s-&gt;x;</div><div class='del'>-</div><div class='del'>-static int mod_glusterfs_patch_connection(server *srv, connection *con,</div><div class='del'>-                                          plugin_data *p) {</div><div class='del'>-        size_t i, j;</div><div class='del'>-        plugin_config *s;</div><div class='del'>-</div><div class='del'>-        /* skip the first, the global context */</div><div class='del'>-        /* </div><div class='del'>-           glusterfs related config can only occur inside </div><div class='del'>-           $HTTP["url"] == "&lt;glusterfs-prefix&gt;"</div><div class='del'>-        */</div><div class='del'>-        p-&gt;conf.logfile = NULL;</div><div class='del'>-        p-&gt;conf.loglevel = NULL;</div><div class='del'>-        p-&gt;conf.specfile = NULL;</div><div class='del'>-        p-&gt;conf.cache_timeout = 0;</div><div class='del'>-        p-&gt;conf.exclude_exts = NULL;</div><div class='del'>-        p-&gt;conf.prefix = NULL;</div><div class='del'>-        p-&gt;conf.xattr_file_size = NULL;</div><div class='del'>-        p-&gt;conf.document_root = NULL;</div><div class='del'>-</div><div class='del'>-        for (i = 1; i &lt; srv-&gt;config_context-&gt;used; i++) {</div><div class='del'>-                data_config *dc = (data_config *)srv-&gt;config_context-&gt;data[i];</div><div class='del'>-                s = p-&gt;config_storage[i];</div><div class='del'>-</div><div class='del'>-                /* condition didn't match */</div><div class='del'>-                if (!config_check_cond(srv, con, dc)) continue;</div><div class='del'>-    </div><div class='del'>-                /* merge config */</div><div class='del'>-                for (j = 0; j &lt; dc-&gt;value-&gt;used; j++) {</div><div class='del'>-                        data_unset *du = dc-&gt;value-&gt;data[j];</div><div class='del'>-      </div><div class='del'>-                        if (buffer_is_equal_string (du-&gt;key,</div><div class='del'>-                                                    CONST_STR_LEN("glusterfs.logfile"))) {</div><div class='del'>-                                PATCH (logfile);</div><div class='del'>-                        } else if (buffer_is_equal_string (du-&gt;key,</div><div class='del'>-                                                           CONST_STR_LEN("glusterfs.loglevel"))) {</div><div class='del'>-                                PATCH (loglevel);</div><div class='del'>-                        } else if (buffer_is_equal_string (du-&gt;key,</div><div class='del'>-                                                           CONST_STR_LEN ("glusterfs.volume-specfile"))) {</div><div class='del'>-                                PATCH (specfile);</div><div class='del'>-                        } else if (buffer_is_equal_string (du-&gt;key,</div><div class='del'>-                                                           CONST_STR_LEN("glusterfs.cache-timeout"))) {</div><div class='del'>-                                PATCH (cache_timeout);</div><div class='del'>-                        } else if (buffer_is_equal_string (du-&gt;key,</div><div class='del'>-                                                           CONST_STR_LEN ("glusterfs.exclude-extensions"))) {</div><div class='del'>-                                PATCH (exclude_exts);</div><div class='del'>-                        } else if (buffer_is_equal_string (du-&gt;key,</div><div class='del'>-                                                           CONST_STR_LEN ("glusterfs.prefix"))) {</div><div class='del'>-                                PATCH (prefix);</div><div class='del'>-                        } else if (buffer_is_equal_string (du-&gt;key,</div><div class='del'>-                                                           CONST_STR_LEN ("glusterfs.xattr-interface-size-limit"))) {</div><div class='del'>-                                PATCH (xattr_file_size);</div><div class='del'>-                        } else if (buffer_is_equal_string (du-&gt;key,</div><div class='del'>-                                                           CONST_STR_LEN ("glusterfs.document-root"))) {</div><div class='del'>-                                PATCH (document_root);</div><div class='del'>-                        }</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-#undef PATCH</div><div class='del'>-</div><div class='del'>-static int http_response_parse_range(server *srv, connection *con,</div><div class='del'>-                                     plugin_data *p) {</div><div class='del'>-        int multipart = 0;</div><div class='del'>-        int error;</div><div class='del'>-        off_t start, end;</div><div class='del'>-        const char *s, *minus;</div><div class='del'>-        char *boundary = "fkj49sn38dcn3";</div><div class='del'>-        data_string *ds;</div><div class='del'>-        stat_cache_entry *sce = NULL;</div><div class='del'>-        buffer *content_type = NULL;</div><div class='del'>-        size_t size = 0;</div><div class='del'>-        mod_glusterfs_ctx_t *ctx = con-&gt;plugin_ctx[p-&gt;id];</div><div class='del'>-</div><div class='del'>-        if (p-&gt;conf.xattr_file_size &amp;&amp; p-&gt;conf.xattr_file_size-&gt;ptr) {</div><div class='del'>-                size = atoi (p-&gt;conf.xattr_file_size-&gt;ptr);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (HANDLER_ERROR == stat_cache_get_entry(srv, con, con-&gt;physical.path,</div><div class='del'>-                                                  &amp;sce)) {</div><div class='del'>-                SEGFAULT();</div><div class='del'>-        }</div><div class='del'>-  </div><div class='del'>-        start = 0;</div><div class='del'>-        end = sce-&gt;st.st_size - 1;</div><div class='del'>-  </div><div class='del'>-        con-&gt;response.content_length = 0;</div><div class='del'>-  </div><div class='del'>-        if (NULL != (ds = (data_string *)array_get_element(con-&gt;response.headers,</div><div class='del'>-                                                           "Content-Type"))) {</div><div class='del'>-                content_type = ds-&gt;value;</div><div class='del'>-        }</div><div class='del'>-  </div><div class='del'>-        for (s = con-&gt;request.http_range, error = 0;</div><div class='del'>-             !error &amp;&amp; *s &amp;&amp; NULL != (minus = strchr(s, '-')); ) {</div><div class='del'>-                char *err;</div><div class='del'>-                off_t la, le;</div><div class='del'>-    </div><div class='del'>-                if (s == minus) {</div><div class='del'>-                        /* -&lt;stop&gt; */</div><div class='del'>-      </div><div class='del'>-                        le = strtoll(s, &amp;err, 10);</div><div class='del'>-      </div><div class='del'>-                        if (le == 0) {</div><div class='del'>-                                /* RFC 2616 - 14.35.1 */</div><div class='del'>-        </div><div class='del'>-                                con-&gt;http_status = 416;</div><div class='del'>-                                error = 1;</div><div class='del'>-                        } else if (*err == '\0') {</div><div class='del'>-                                /* end */</div><div class='del'>-                                s = err;</div><div class='del'>-        </div><div class='del'>-                                end = sce-&gt;st.st_size - 1;</div><div class='del'>-                                start = sce-&gt;st.st_size + le;</div><div class='del'>-                        } else if (*err == ',') {</div><div class='del'>-                                multipart = 1;</div><div class='del'>-                                s = err + 1;</div><div class='del'>-        </div><div class='del'>-                                end = sce-&gt;st.st_size - 1;</div><div class='del'>-                                start = sce-&gt;st.st_size + le;</div><div class='del'>-                        } else {</div><div class='del'>-                                error = 1;</div><div class='del'>-                        }</div><div class='del'>-      </div><div class='del'>-                } else if (*(minus+1) == '\0' || *(minus+1) == ',') {</div><div class='del'>-                        /* &lt;start&gt;- */</div><div class='del'>-      </div><div class='del'>-                        la = strtoll(s, &amp;err, 10);</div><div class='del'>-      </div><div class='del'>-                        if (err == minus) {</div><div class='del'>-                                /* ok */</div><div class='del'>-        </div><div class='del'>-                                if (*(err + 1) == '\0') {</div><div class='del'>-                                        s = err + 1;</div><div class='del'>-          </div><div class='del'>-                                        end = sce-&gt;st.st_size - 1;</div><div class='del'>-                                        start = la;</div><div class='del'>-          </div><div class='del'>-                                } else if (*(err + 1) == ',') {</div><div class='del'>-                                        multipart = 1;</div><div class='del'>-                                        s = err + 2;</div><div class='del'>-          </div><div class='del'>-                                        end = sce-&gt;st.st_size - 1;</div><div class='del'>-                                        start = la;</div><div class='del'>-                                } else {</div><div class='del'>-                                        error = 1;</div><div class='del'>-                                }</div><div class='del'>-                        } else {</div><div class='del'>-                                /* error */</div><div class='del'>-                                error = 1;</div><div class='del'>-                        }</div><div class='del'>-                } else {</div><div class='del'>-                        /* &lt;start&gt;-&lt;stop&gt; */</div><div class='del'>-      </div><div class='del'>-                        la = strtoll(s, &amp;err, 10);</div><div class='del'>-</div><div class='del'>-                        if (err == minus) {</div><div class='del'>-                                le = strtoll(minus+1, &amp;err, 10);</div><div class='del'>-        </div><div class='del'>-                                /* RFC 2616 - 14.35.1 */</div><div class='del'>-                                if (la &gt; le) {</div><div class='del'>-                                        error = 1;</div><div class='del'>-                                }</div><div class='del'>-        </div><div class='del'>-                                if (*err == '\0') {</div><div class='del'>-                                        /* ok, end*/</div><div class='del'>-                                        s = err;</div><div class='del'>-</div><div class='del'>-                                        end = le;</div><div class='del'>-                                        start = la;</div><div class='del'>-                                } else if (*err == ',') {</div><div class='del'>-                                        multipart = 1;</div><div class='del'>-                                        s = err + 1;</div><div class='del'>-          </div><div class='del'>-                                        end = le;</div><div class='del'>-                                        start = la;</div><div class='del'>-                                } else {</div><div class='del'>-                                        /* error */</div><div class='del'>-          </div><div class='del'>-                                        error = 1;</div><div class='del'>-                                }</div><div class='del'>-                        } else {</div><div class='del'>-                                /* error */</div><div class='del'>-        </div><div class='del'>-                                error = 1;</div><div class='del'>-                        }</div><div class='del'>-                }</div><div class='del'>-    </div><div class='del'>-                if (!error) {</div><div class='del'>-                        if (start &lt; 0) start = 0;</div><div class='del'>-      </div><div class='del'>-                        /* RFC 2616 - 14.35.1 */</div><div class='del'>-                        if (end &gt; sce-&gt;st.st_size - 1) end = sce-&gt;st.st_size - 1;</div><div class='del'>-      </div><div class='del'>-                        if (start &gt; sce-&gt;st.st_size - 1) {</div><div class='del'>-                                error = 1;</div><div class='del'>-        </div><div class='del'>-                                con-&gt;http_status = 416;</div><div class='del'>-                        }</div><div class='del'>-                }</div><div class='del'>-    </div><div class='del'>-                if (!error) {</div><div class='del'>-                        if (multipart) {</div><div class='del'>-                                /* write boundary-header */</div><div class='del'>-                                buffer *b;</div><div class='del'>-        </div><div class='del'>-                                b = chunkqueue_get_append_buffer(con-&gt;write_queue);</div><div class='del'>-        </div><div class='del'>-                                buffer_copy_string(b, "\r\n--");</div><div class='del'>-                                buffer_append_string(b, boundary);</div><div class='del'>-        </div><div class='del'>-                                /* write Content-Range */</div><div class='del'>-                                buffer_append_string(b, "\r\nContent-Range: "</div><div class='del'>-                                                     "bytes ");</div><div class='del'>-                                buffer_append_off_t(b, start);</div><div class='del'>-                                buffer_append_string(b, "-");</div><div class='del'>-                                buffer_append_off_t(b, end);</div><div class='del'>-                                buffer_append_string(b, "/");</div><div class='del'>-                                buffer_append_off_t(b, sce-&gt;st.st_size);</div><div class='del'>-        </div><div class='del'>-                                buffer_append_string(b, "\r\nContent-Type: ");</div><div class='del'>-                                buffer_append_string_buffer(b, content_type);</div><div class='del'>-        </div><div class='del'>-                                /* write END-OF-HEADER */</div><div class='del'>-                                buffer_append_string(b, "\r\n\r\n");</div><div class='del'>-        </div><div class='del'>-                                con-&gt;response.content_length += b-&gt;used - 1;</div><div class='del'>-</div><div class='del'>-                        }</div><div class='del'>-</div><div class='del'>-                        if ((size_t)sce-&gt;st.st_size &gt;= size) {</div><div class='del'>-                                chunkqueue_append_glusterfs_file(con, ctx-&gt;fd,</div><div class='del'>-                                                                 start,</div><div class='del'>-                                                                 end - start,</div><div class='del'>-                                                                 size);</div><div class='del'>-                        } else {</div><div class='del'>-                                if (!start) {</div><div class='del'>-                                        buffer *mem = buffer_init ();</div><div class='del'>-                                        mem-&gt;ptr = ctx-&gt;buf;</div><div class='del'>-                                        mem-&gt;used = mem-&gt;size = sce-&gt;st.st_size;</div><div class='del'>-                                        http_chunk_append_buffer (srv, con, mem);</div><div class='del'>-                                        ctx-&gt;buf = NULL;</div><div class='del'>-                                } else {</div><div class='del'>-                                        chunkqueue_append_mem (con-&gt;write_queue,</div><div class='del'>-                                                               ((char *)ctx-&gt;buf)</div><div class='del'>-                                                               + start,</div><div class='del'>-                                                               end - start + 1);</div><div class='del'>-                                }</div><div class='del'>-                        }</div><div class='del'>-</div><div class='del'>-                        con-&gt;response.content_length += end - start + 1;</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (ctx-&gt;buf) {</div><div class='del'>-                free (ctx-&gt;buf);</div><div class='del'>-                ctx-&gt;buf = NULL;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        /* something went wrong */</div><div class='del'>-        if (error) return -1;</div><div class='del'>-  </div><div class='del'>-        if (multipart) {</div><div class='del'>-                /* add boundary end */</div><div class='del'>-                buffer *b;</div><div class='del'>-    </div><div class='del'>-                b = chunkqueue_get_append_buffer(con-&gt;write_queue);</div><div class='del'>-    </div><div class='del'>-                buffer_copy_string_len(b, "\r\n--", 4);</div><div class='del'>-                buffer_append_string(b, boundary);</div><div class='del'>-                buffer_append_string_len(b, "--\r\n", 4);</div><div class='del'>-    </div><div class='del'>-                con-&gt;response.content_length += b-&gt;used - 1;</div><div class='del'>-    </div><div class='del'>-                /* set header-fields */</div><div class='del'>-</div><div class='del'>-                buffer_copy_string(p-&gt;range_buf, "multipart/byteranges; boundary=");</div><div class='del'>-                buffer_append_string(p-&gt;range_buf, boundary);</div><div class='del'>-</div><div class='del'>-                /* overwrite content-type */</div><div class='del'>-                response_header_overwrite(srv, con, CONST_STR_LEN("Content-Type"),</div><div class='del'>-                                          CONST_BUF_LEN(p-&gt;range_buf));</div><div class='del'>-        } else {</div><div class='del'>-                /* add Content-Range-header */</div><div class='del'>-    </div><div class='del'>-                buffer_copy_string(p-&gt;range_buf, "bytes ");</div><div class='del'>-                buffer_append_off_t(p-&gt;range_buf, start);</div><div class='del'>-                buffer_append_string(p-&gt;range_buf, "-");</div><div class='del'>-                buffer_append_off_t(p-&gt;range_buf, end);</div><div class='del'>-                buffer_append_string(p-&gt;range_buf, "/");</div><div class='del'>-                buffer_append_off_t(p-&gt;range_buf, sce-&gt;st.st_size);</div><div class='del'>-    </div><div class='del'>-                response_header_insert(srv, con, CONST_STR_LEN("Content-Range"),</div><div class='del'>-                                       CONST_BUF_LEN(p-&gt;range_buf));</div><div class='del'>-        }</div><div class='del'>-        </div><div class='del'>-        /* ok, the file is set-up */</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-PHYSICALPATH_FUNC(mod_glusterfs_handle_physical) {</div><div class='del'>-        plugin_data *p = p_d;</div><div class='del'>-        stat_cache_entry *sce;</div><div class='del'>-        mod_glusterfs_ctx_t *plugin_ctx = NULL;</div><div class='del'>-        size_t size = 0;</div><div class='del'>-        int ret = 0;</div><div class='del'>-</div><div class='del'>-        if (con-&gt;http_status != 0) return HANDLER_GO_ON;</div><div class='del'>-        if (con-&gt;uri.path-&gt;used == 0) return HANDLER_GO_ON;</div><div class='del'>-        if (con-&gt;physical.path-&gt;used == 0) return HANDLER_GO_ON;</div><div class='del'>-</div><div class='del'>-        if (con-&gt;mode != DIRECT) return HANDLER_GO_ON;</div><div class='del'>-</div><div class='del'>-        /*</div><div class='del'>-          network_backend_write = srv-&gt;network_backend_write;</div><div class='del'>-          srv-&gt;network_backend_write = mod_glusterfs_network_backend_write;</div><div class='del'>-        */</div><div class='del'>-</div><div class='del'>-        switch (con-&gt;request.http_method) {</div><div class='del'>-        case HTTP_METHOD_GET:</div><div class='del'>-        case HTTP_METHOD_POST:</div><div class='del'>-        case HTTP_METHOD_HEAD:</div><div class='del'>-                break;</div><div class='del'>-</div><div class='del'>-        default:</div><div class='del'>-                return HANDLER_GO_ON;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        mod_glusterfs_patch_connection(srv, con, p);</div><div class='del'>-        if (!p-&gt;conf.prefix || p-&gt;conf.prefix-&gt;used == 0) {</div><div class='del'>-                return HANDLER_GO_ON;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (!p-&gt;conf.document_root || p-&gt;conf.document_root-&gt;used == 0) {</div><div class='del'>-                log_error_write(srv, __FILE__, __LINE__, "s",</div><div class='del'>-                                "glusterfs.document-root is not specified");</div><div class='del'>-                con-&gt;http_status = 500;</div><div class='del'>-                return HANDLER_FINISHED;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (!p-&gt;conf.mounted) {</div><div class='del'>-                glusterfs_init_params_t ctx;</div><div class='del'>-</div><div class='del'>-                if (!p-&gt;conf.specfile || p-&gt;conf.specfile-&gt;used == 0) {</div><div class='del'>-                        return HANDLER_GO_ON;</div><div class='del'>-                }</div><div class='del'>-                memset (&amp;ctx, 0, sizeof (ctx));</div><div class='del'>-</div><div class='del'>-                ctx.specfile = p-&gt;conf.specfile-&gt;ptr;</div><div class='del'>-                ctx.logfile = p-&gt;conf.logfile-&gt;ptr;</div><div class='del'>-                ctx.loglevel = p-&gt;conf.loglevel-&gt;ptr;</div><div class='del'>-                ctx.lookup_timeout = ctx.stat_timeout = p-&gt;conf.cache_timeout;</div><div class='del'>-</div><div class='del'>-                ret = glusterfs_mount (p-&gt;conf.prefix-&gt;ptr, &amp;ctx);</div><div class='del'>-                if (ret != 0) {</div><div class='del'>-                        con-&gt;http_status = 500;</div><div class='del'>-                        log_error_write(srv, __FILE__, __LINE__,  "sbs",</div><div class='del'>-                                        "glusterfs initialization failed, "</div><div class='del'>-                                        "please check your configuration. "</div><div class='del'>-                                        "Glusterfs logfile ",</div><div class='del'>-                                        p-&gt;conf.logfile,</div><div class='del'>-                                        "might contain details");</div><div class='del'>-                        return HANDLER_FINISHED;</div><div class='del'>-                }</div><div class='del'>-                p-&gt;conf.mounted = 1;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        size = 0;</div><div class='del'>-        if (p-&gt;conf.xattr_file_size &amp;&amp; p-&gt;conf.xattr_file_size-&gt;ptr) </div><div class='del'>-                size = atoi (p-&gt;conf.xattr_file_size-&gt;ptr);</div><div class='del'>-</div><div class='del'>-        if (!con-&gt;plugin_ctx[p-&gt;id]) {</div><div class='del'>-/* FIXME: what if multiple files are requested from a single connection? */ </div><div class='del'>-/* TODO: check whether this works fine for HTTP protocol 1.1 */</div><div class='del'>-</div><div class='del'>-                buffer *tmp_buf = buffer_init_buffer (con-&gt;physical.basedir);</div><div class='del'>-</div><div class='del'>-                plugin_ctx = calloc (1, sizeof (*plugin_ctx));</div><div class='del'>-                /* ERR_ABORT (plugin_ctx); */</div><div class='del'>-                con-&gt;plugin_ctx[p-&gt;id] = plugin_ctx;</div><div class='del'>-    </div><div class='del'>-                buffer_append_string_buffer (tmp_buf, p-&gt;conf.prefix);</div><div class='del'>-                buffer_path_simplify (tmp_buf, tmp_buf);</div><div class='del'>-</div><div class='del'>-                plugin_ctx-&gt;prefix = tmp_buf-&gt;used - 1;</div><div class='del'>-                if (tmp_buf-&gt;ptr[plugin_ctx-&gt;prefix - 1] == '/')</div><div class='del'>-                        plugin_ctx-&gt;prefix--;</div><div class='del'>-</div><div class='del'>-                buffer_free (tmp_buf);</div><div class='del'>-        } else </div><div class='del'>-                /*FIXME: error!! error!! */</div><div class='del'>-                plugin_ctx = con-&gt;plugin_ctx[p-&gt;id];</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-        if (size) </div><div class='del'>-        {</div><div class='del'>-                plugin_ctx-&gt;buf = malloc (size);</div><div class='del'>-                /* ERR_ABORT (plugin_ctx-&gt;buf); */</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        plugin_ctx-&gt;glusterfs_path = buffer_init ();</div><div class='del'>-        buffer_copy_string_buffer (plugin_ctx-&gt;glusterfs_path,</div><div class='del'>-                                   p-&gt;conf.prefix);</div><div class='del'>-        buffer_append_string (plugin_ctx-&gt;glusterfs_path,</div><div class='del'>-                              p-&gt;conf.document_root-&gt;ptr);</div><div class='del'>-        buffer_append_string (plugin_ctx-&gt;glusterfs_path, "/");</div><div class='del'>-        buffer_append_string (plugin_ctx-&gt;glusterfs_path,</div><div class='del'>-                              con-&gt;physical.path-&gt;ptr + plugin_ctx-&gt;prefix);</div><div class='del'>-        buffer_path_simplify (plugin_ctx-&gt;glusterfs_path,</div><div class='del'>-                              plugin_ctx-&gt;glusterfs_path);</div><div class='del'>- </div><div class='del'>-        if (glusterfs_stat_cache_get_entry (srv, con,</div><div class='del'>-                                            plugin_ctx-&gt;glusterfs_path,</div><div class='del'>-                                            con-&gt;physical.path, plugin_ctx-&gt;buf,</div><div class='del'>-                                            size, &amp;sce) == HANDLER_ERROR) {</div><div class='del'>-                if (errno == ENOENT)</div><div class='del'>-                        con-&gt;http_status = 404;</div><div class='del'>-                else </div><div class='del'>-                        con-&gt;http_status = 403;</div><div class='del'>-</div><div class='del'>-                free (plugin_ctx-&gt;buf);</div><div class='del'>-                buffer_free (plugin_ctx-&gt;glusterfs_path);</div><div class='del'>-                plugin_ctx-&gt;glusterfs_path = NULL;</div><div class='del'>-                plugin_ctx-&gt;buf = NULL;</div><div class='del'>-</div><div class='del'>-                free (plugin_ctx);</div><div class='del'>-                con-&gt;plugin_ctx[p-&gt;id] = NULL;</div><div class='del'>-</div><div class='del'>-                return HANDLER_FINISHED;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (!(S_ISREG (sce-&gt;st.st_mode) &amp;&amp; (size_t)sce-&gt;st.st_size &lt; size)) {</div><div class='del'>-                free (plugin_ctx-&gt;buf);</div><div class='del'>-                plugin_ctx-&gt;buf = NULL;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        return HANDLER_GO_ON;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-static int http_chunk_append_len(server *srv, connection *con, size_t len) {</div><div class='del'>-        size_t i, olen = len, j;</div><div class='del'>-        buffer *b;</div><div class='del'>-</div><div class='del'>-        b = srv-&gt;tmp_chunk_len;</div><div class='del'>-</div><div class='del'>-        if (len == 0) {</div><div class='del'>-                buffer_copy_string(b, "0");</div><div class='del'>-        } else {</div><div class='del'>-                for (i = 0; i &lt; 8 &amp;&amp; len; i++) {</div><div class='del'>-                        len &gt;&gt;= 4;</div><div class='del'>-                }</div><div class='del'>-    </div><div class='del'>-                /* i is the number of hex digits we have */</div><div class='del'>-                buffer_prepare_copy(b, i + 1);</div><div class='del'>-    </div><div class='del'>-                for (j = i-1, len = olen; j+1 &gt; 0; j--) {</div><div class='del'>-                        b-&gt;ptr[j] = (len &amp; 0xf) + (((len &amp; 0xf) &lt;= 9) ? </div><div class='del'>-                                                   '0' : 'a' - 10);</div><div class='del'>-                        len &gt;&gt;= 4;</div><div class='del'>-                }</div><div class='del'>-                b-&gt;used = i;</div><div class='del'>-                b-&gt;ptr[b-&gt;used++] = '\0';</div><div class='del'>-        }</div><div class='del'>-  </div><div class='del'>-        buffer_append_string(b, "\r\n");</div><div class='del'>-        chunkqueue_append_buffer(con-&gt;write_queue, b);</div><div class='del'>-  </div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int http_chunk_append_glusterfs_file_chunk(server *srv, connection *con,</div><div class='del'>-                                           glusterfs_file_t fd, off_t offset,</div><div class='del'>-                                           off_t len, size_t buf_size) {</div><div class='del'>-        chunkqueue *cq;</div><div class='del'>-</div><div class='del'>-        if (!con) return -1;</div><div class='del'>-</div><div class='del'>-        cq = con-&gt;write_queue;</div><div class='del'>-</div><div class='del'>-        if (con-&gt;response.transfer_encoding &amp; HTTP_TRANSFER_ENCODING_CHUNKED) {</div><div class='del'>-                http_chunk_append_len(srv, con, len);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        chunkqueue_append_glusterfs_file (con, fd, offset, len, buf_size);</div><div class='del'>-</div><div class='del'>-        if ((con-&gt;response.transfer_encoding &amp; HTTP_TRANSFER_ENCODING_CHUNKED) </div><div class='del'>-            &amp;&amp; (len &gt; 0)) {</div><div class='del'>-                chunkqueue_append_mem(cq, "\r\n", 2 + 1);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int http_chunk_append_glusterfs_mem(server *srv, connection *con,</div><div class='del'>-                                    char * mem, size_t len,</div><div class='del'>-                                    size_t buf_size) </div><div class='del'>-{</div><div class='del'>-        chunkqueue *cq = NULL;</div><div class='del'>-        buffer *buf = NULL;</div><div class='del'>- </div><div class='del'>-        if (!con) return -1;</div><div class='del'>-  </div><div class='del'>-        cq = con-&gt;write_queue;</div><div class='del'>-  </div><div class='del'>-        if (len == 0) {</div><div class='del'>-                free (mem);</div><div class='del'>-                if (con-&gt;response.transfer_encoding </div><div class='del'>-                    &amp; HTTP_TRANSFER_ENCODING_CHUNKED) {</div><div class='del'>-                        chunkqueue_append_mem(cq, "0\r\n\r\n", 5 + 1);</div><div class='del'>-                } else {</div><div class='del'>-                        chunkqueue_append_mem(cq, "", 1);</div><div class='del'>-                }</div><div class='del'>-                return 0;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (con-&gt;response.transfer_encoding &amp; HTTP_TRANSFER_ENCODING_CHUNKED) {</div><div class='del'>-                http_chunk_append_len(srv, con, len - 1);</div><div class='del'>-        }</div><div class='del'>-  </div><div class='del'>-        buf = buffer_init ();</div><div class='del'>-</div><div class='del'>-        buf-&gt;used = len + 1;</div><div class='del'>-        buf-&gt;size = buf_size;</div><div class='del'>-        buf-&gt;ptr = (char *)mem;</div><div class='del'>-        chunkqueue_append_buffer_weak (cq, buf);</div><div class='del'>-</div><div class='del'>-        if (con-&gt;response.transfer_encoding &amp; HTTP_TRANSFER_ENCODING_CHUNKED) {</div><div class='del'>-                chunkqueue_append_mem(cq, "\r\n", 2 + 1);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-URIHANDLER_FUNC(mod_glusterfs_subrequest) {</div><div class='del'>-        plugin_data *p = p_d;</div><div class='del'>-        stat_cache_entry *sce = NULL;</div><div class='del'>-        int s_len;</div><div class='del'>-        char allow_caching = 1;</div><div class='del'>-        size_t size = 0;</div><div class='del'>-        mod_glusterfs_ctx_t *ctx = con-&gt;plugin_ctx[p-&gt;id];</div><div class='del'>-</div><div class='del'>-        /* someone else has done a decision for us */</div><div class='del'>-        if (con-&gt;http_status != 0) return HANDLER_GO_ON;</div><div class='del'>-        if (con-&gt;uri.path-&gt;used == 0) return HANDLER_GO_ON;</div><div class='del'>-        if (con-&gt;physical.path-&gt;used == 0) return HANDLER_GO_ON;</div><div class='del'>-  </div><div class='del'>-        /* someone else has handled this request */</div><div class='del'>-        if (con-&gt;mode != DIRECT) return HANDLER_GO_ON;</div><div class='del'>-  </div><div class='del'>-        /* we only handle GET, POST and HEAD */</div><div class='del'>-        switch(con-&gt;request.http_method) {</div><div class='del'>-        case HTTP_METHOD_GET:</div><div class='del'>-        case HTTP_METHOD_POST:</div><div class='del'>-        case HTTP_METHOD_HEAD:</div><div class='del'>-                break;</div><div class='del'>-        default:</div><div class='del'>-                return HANDLER_GO_ON;</div><div class='del'>-        }</div><div class='del'>-  </div><div class='del'>-        mod_glusterfs_patch_connection(srv, con, p);</div><div class='del'>-  </div><div class='del'>-        if (!p-&gt;conf.prefix || !p-&gt;conf.prefix-&gt;used)</div><div class='del'>-                return HANDLER_GO_ON;</div><div class='del'>-</div><div class='del'>-        s_len = con-&gt;uri.path-&gt;used - 1;</div><div class='del'>-        /* ignore certain extensions */</div><div class='del'>-        /*</div><div class='del'>-          for (k = 0; k &lt; p-&gt;conf.exclude_exts-&gt;used; k++) {</div><div class='del'>-          data_string *ds;</div><div class='del'>-          ds = (data_string *)p-&gt;conf.exclude_exts-&gt;data[k];</div><div class='del'>-          </div><div class='del'>-          if (ds-&gt;value-&gt;used == 0) continue;</div><div class='del'>-    </div><div class='del'>-          if (!strncmp (ds-&gt;value-&gt;ptr, con-&gt;uri.path-&gt;ptr,</div><div class='del'>-                        strlen (ds-&gt;value-&gt;ptr)))</div><div class='del'>-          break;</div><div class='del'>-          }</div><div class='del'>-  </div><div class='del'>-          if (k == p-&gt;conf.exclude_exts-&gt;used) {</div><div class='del'>-          return HANDLER_GO_ON;</div><div class='del'>-          }</div><div class='del'>-        */</div><div class='del'>-</div><div class='del'>-        if (con-&gt;conf.log_request_handling) {</div><div class='del'>-                log_error_write(srv, __FILE__, __LINE__,  "s",</div><div class='del'>-                                "-- serving file from glusterfs");</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (HANDLER_ERROR == stat_cache_get_entry(srv, con, con-&gt;physical.path,</div><div class='del'>-                                                  &amp;sce)) {</div><div class='del'>-                con-&gt;http_status = 403;</div><div class='del'>-                </div><div class='del'>-                log_error_write(srv, __FILE__, __LINE__, "sbsb",</div><div class='del'>-                                "not a regular file:", con-&gt;uri.path,</div><div class='del'>-                                "-&gt;", con-&gt;physical.path);</div><div class='del'>-    </div><div class='del'>-                free (ctx);</div><div class='del'>-                con-&gt;plugin_ctx[p-&gt;id] = NULL;</div><div class='del'>-</div><div class='del'>-                return HANDLER_FINISHED;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (con-&gt;uri.path-&gt;ptr[s_len] == '/' || !S_ISREG(sce-&gt;st.st_mode)) {</div><div class='del'>-                free (ctx);</div><div class='del'>-                con-&gt;plugin_ctx[p-&gt;id] = NULL;</div><div class='del'>-                return HANDLER_FINISHED;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (p-&gt;conf.xattr_file_size &amp;&amp; p-&gt;conf.xattr_file_size-&gt;ptr)</div><div class='del'>-                size = atoi (p-&gt;conf.xattr_file_size-&gt;ptr);</div><div class='del'>-</div><div class='del'>-        if ((size_t)sce-&gt;st.st_size &gt; size) {</div><div class='del'>-                ctx-&gt;fd = glusterfs_open (ctx-&gt;glusterfs_path-&gt;ptr, O_RDONLY,</div><div class='del'>-                                          0);</div><div class='del'>-    </div><div class='del'>-                if (((long)ctx-&gt;fd) == 0) {</div><div class='del'>-                        con-&gt;http_status = 403;</div><div class='del'>-                        free (ctx);</div><div class='del'>-                        con-&gt;plugin_ctx[p-&gt;id] = NULL;</div><div class='del'>-                        return HANDLER_FINISHED;</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        buffer_free (ctx-&gt;glusterfs_path);</div><div class='del'>-        ctx-&gt;glusterfs_path = NULL;</div><div class='del'>-</div><div class='del'>-        /* we only handline regular files */</div><div class='del'>-#ifdef HAVE_LSTAT</div><div class='del'>-        if ((sce-&gt;is_symlink == 1) &amp;&amp; !con-&gt;conf.follow_symlink) {</div><div class='del'>-                con-&gt;http_status = 403;</div><div class='del'>-          </div><div class='del'>-                if (con-&gt;conf.log_request_handling) {</div><div class='del'>-                        log_error_write(srv, __FILE__, __LINE__,  "s",</div><div class='del'>-                                        "-- access denied due symlink "</div><div class='del'>-                                        "restriction");</div><div class='del'>-                        log_error_write(srv, __FILE__, __LINE__,  "sb",</div><div class='del'>-                                        "Path         :", con-&gt;physical.path);</div><div class='del'>-                }</div><div class='del'>-    </div><div class='del'>-                buffer_reset(con-&gt;physical.path);</div><div class='del'>-                free (ctx);</div><div class='del'>-                con-&gt;plugin_ctx[p-&gt;id] = NULL;</div><div class='del'>-                return HANDLER_FINISHED;</div><div class='del'>-        }</div><div class='del'>-#endif</div><div class='del'>-        if (!S_ISREG(sce-&gt;st.st_mode)) {</div><div class='del'>-                con-&gt;http_status = 404;</div><div class='del'>-    </div><div class='del'>-                if (con-&gt;conf.log_file_not_found) {</div><div class='del'>-                        log_error_write(srv, __FILE__, __LINE__, "sbsb",</div><div class='del'>-                                        "not a regular file:", con-&gt;uri.path,</div><div class='del'>-                                        "-&gt;", sce-&gt;name);</div><div class='del'>-                }</div><div class='del'>-    </div><div class='del'>-                free (ctx);</div><div class='del'>-                con-&gt;plugin_ctx[p-&gt;id] = NULL;</div><div class='del'>-</div><div class='del'>-                return HANDLER_FINISHED;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        /* mod_compress might set several data directly, don't overwrite them */</div><div class='del'>-</div><div class='del'>-        /* set response content-type, if not set already */</div><div class='del'>-  </div><div class='del'>-        if (NULL == array_get_element(con-&gt;response.headers, "Content-Type")) {</div><div class='del'>-                if (buffer_is_empty(sce-&gt;content_type)) {</div><div class='del'>-                        /* we are setting application/octet-stream, but also "</div><div class='del'>-                         * announce that this header field might change in "</div><div class='del'>-                         * the seconds few requests. This should fix the </div><div class='del'>-                         * aggressive caching of FF and the script download</div><div class='del'>-                         * seen by the first installations</div><div class='del'>-                         */</div><div class='del'>-                        response_header_overwrite(srv, con,</div><div class='del'>-                                                  CONST_STR_LEN("Content-Type"),</div><div class='del'>-                                                  CONST_STR_LEN("application/"</div><div class='del'>-                                                                "octet-stream"));</div><div class='del'>-      </div><div class='del'>-                        allow_caching = 0;</div><div class='del'>-                } else {</div><div class='del'>-                        response_header_overwrite(srv, con,</div><div class='del'>-                                                  CONST_STR_LEN("Content-Type"),</div><div class='del'>-                                                  CONST_BUF_LEN(sce-&gt;content_type));</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='del'>-  </div><div class='del'>-        if (con-&gt;conf.range_requests) {</div><div class='del'>-                response_header_overwrite(srv, con,</div><div class='del'>-                                          CONST_STR_LEN("Accept-Ranges"),</div><div class='del'>-                                          CONST_STR_LEN("bytes"));</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        /* TODO: Allow Cachable requests */     </div><div class='del'>-#if 0</div><div class='del'>-        if (allow_caching) {</div><div class='del'>-                if (p-&gt;conf.etags_used &amp;&amp; con-&gt;etag_flags != 0 </div><div class='del'>-                    &amp;&amp; !buffer_is_empty(sce-&gt;etag)) {</div><div class='del'>-                        if (NULL == array_get_element(con-&gt;response.headers,</div><div class='del'>-                                                      "ETag")) {</div><div class='del'>-                                /* generate e-tag */</div><div class='del'>-                                etag_mutate(con-&gt;physical.etag, sce-&gt;etag);</div><div class='del'>-        </div><div class='del'>-                                response_header_overwrite(srv, con,</div><div class='del'>-                                                          CONST_STR_LEN("ETag"),</div><div class='del'>-                                                          CONST_BUF_LEN(con-&gt;physical.etag));</div><div class='del'>-                        }</div><div class='del'>-                }</div><div class='del'>-    </div><div class='del'>-                /* prepare header */</div><div class='del'>-                if (NULL == (ds = (data_string *)array_get_element(con-&gt;response.headers,</div><div class='del'>-                                                                   "Last-Modified"))) {</div><div class='del'>-                        mtime = strftime_cache_get(srv, sce-&gt;st.st_mtime);</div><div class='del'>-                        response_header_overwrite(srv, con, CONST_STR_LEN("Last-Modified"),</div><div class='del'>-                                                  CONST_BUF_LEN(mtime));</div><div class='del'>-                } else {</div><div class='del'>-                        mtime = ds-&gt;value;</div><div class='del'>-                }</div><div class='del'>-    </div><div class='del'>-                if (HANDLER_FINISHED == http_response_handle_cachable(srv, con,</div><div class='del'>-                                                                      mtime)) {</div><div class='del'>-                        free (ctx);</div><div class='del'>-                        con-&gt;plugin_ctx[p-&gt;id] = NULL;</div><div class='del'>-                        return HANDLER_FINISHED;</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='del'>-#endif </div><div class='del'>-  </div><div class='del'>-        /*TODO: Read about etags */</div><div class='del'>-        if (con-&gt;request.http_range &amp;&amp; con-&gt;conf.range_requests) {</div><div class='del'>-                int do_range_request = 1;</div><div class='del'>-                data_string *ds = NULL;</div><div class='del'>-                buffer *mtime = NULL;</div><div class='del'>-                /* check if we have a conditional GET */</div><div class='del'>-    </div><div class='del'>-                /* prepare header */</div><div class='del'>-                if (NULL == (ds = (data_string *)array_get_element(con-&gt;response.headers,</div><div class='del'>-                                                                   "Last-Modified"))) {</div><div class='del'>-                        mtime = strftime_cache_get(srv, sce-&gt;st.st_mtime);</div><div class='del'>-                        response_header_overwrite(srv, con, CONST_STR_LEN("Last-Modified"),</div><div class='del'>-                                                  CONST_BUF_LEN(mtime));</div><div class='del'>-                } else {</div><div class='del'>-                        mtime = ds-&gt;value;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                if (NULL != (ds = (data_string *)array_get_element(con-&gt;request.headers,</div><div class='del'>-                                                                   "If-Range"))) {</div><div class='del'>-                        /* if the value is the same as our ETag, we do a Range-request,</div><div class='del'>-                         * otherwise a full 200 */</div><div class='del'>-            </div><div class='del'>-                        if (ds-&gt;value-&gt;ptr[0] == '"') {</div><div class='del'>-                                /**</div><div class='del'>-                                 * client wants a ETag</div><div class='del'>-                                 */</div><div class='del'>-                                if (!con-&gt;physical.etag) {</div><div class='del'>-                                        do_range_request = 0;</div><div class='del'>-                                } else if (!buffer_is_equal(ds-&gt;value,</div><div class='del'>-                                                            con-&gt;physical.etag)) {</div><div class='del'>-                                        do_range_request = 0;</div><div class='del'>-                                }</div><div class='del'>-                        } else if (!mtime) {</div><div class='del'>-                                /**</div><div class='del'>-                                 * we don't have a Last-Modified and can match </div><div class='del'>-                                 * the If-Range: </div><div class='del'>-                                 *</div><div class='del'>-                                 * sending all</div><div class='del'>-                                 */</div><div class='del'>-                                do_range_request = 0;</div><div class='del'>-                        } else if (!buffer_is_equal(ds-&gt;value, mtime)) {</div><div class='del'>-                                do_range_request = 0;</div><div class='del'>-                        }</div><div class='del'>-                }</div><div class='del'>-    </div><div class='del'>-                if (do_range_request) {</div><div class='del'>-                        /* content prepared, I'm done */</div><div class='del'>-                        con-&gt;file_finished = 1;</div><div class='del'>-            </div><div class='del'>-                        if (0 == http_response_parse_range(srv, con, p)) {</div><div class='del'>-                                con-&gt;http_status = 206;</div><div class='del'>-                        }</div><div class='del'>-</div><div class='del'>-                        free (ctx);</div><div class='del'>-                        con-&gt;plugin_ctx[p-&gt;id] = NULL;</div><div class='del'>-                        return HANDLER_FINISHED;</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='del'>-  </div><div class='del'>-        /* if we are still here, prepare body */</div><div class='del'>-</div><div class='del'>-        /* we add it here for all requests</div><div class='del'>-         * the HEAD request will drop it afterwards again</div><div class='del'>-         */</div><div class='del'>-        /*TODO check whether 1 should be subtracted */</div><div class='del'>-</div><div class='del'>-        if (p-&gt;conf.xattr_file_size &amp;&amp; p-&gt;conf.xattr_file_size-&gt;ptr)</div><div class='del'>-                size = atoi (p-&gt;conf.xattr_file_size-&gt;ptr);</div><div class='del'>-</div><div class='del'>-        if (size &lt;= (size_t)sce-&gt;st.st_size) {</div><div class='del'>-                http_chunk_append_glusterfs_file_chunk (srv, con, ctx-&gt;fd, 0,</div><div class='del'>-                                                        sce-&gt;st.st_size, size);</div><div class='del'>-        } else {</div><div class='del'>-                http_chunk_append_glusterfs_mem (srv, con, ctx-&gt;buf,</div><div class='del'>-                                                 sce-&gt;st.st_size, size);</div><div class='del'>-        }</div><div class='del'>-        </div><div class='del'>-        con-&gt;http_status = 200;</div><div class='del'>-        con-&gt;file_finished = 1;</div><div class='del'>-  </div><div class='del'>-        free (ctx);</div><div class='del'>-        con-&gt;plugin_ctx[p-&gt;id] = NULL;</div><div class='del'>-</div><div class='del'>-        return HANDLER_FINISHED;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-#if 0</div><div class='del'>-URIHANDLER_FUNC(mod_glusterfs_request_done)</div><div class='del'>-{</div><div class='del'>-        mod_glusterfs_iobuf_t *cur = first, *prev;</div><div class='del'>-        while (cur) {</div><div class='del'>-                prev =  cur;</div><div class='del'>-                glusterfs_free (cur-&gt;buf);</div><div class='del'>-                cur = cur-&gt;next;</div><div class='del'>-                free (prev);</div><div class='del'>-        }</div><div class='del'>-        first = NULL</div><div class='del'>-                }</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-/* this function is called at dlopen() time and inits the callbacks */</div><div class='del'>-CONNECTION_FUNC(mod_glusterfs_connection_reset) </div><div class='del'>-{</div><div class='del'>-        (void) p_d;</div><div class='del'>-        (void) con;</div><div class='del'>-        if (!network_backend_write)</div><div class='del'>-                network_backend_write = srv-&gt;network_backend_write;</div><div class='del'>-</div><div class='del'>-        srv-&gt;network_backend_write = mod_glusterfs_network_backend_write;</div><div class='del'>-</div><div class='del'>-        return HANDLER_GO_ON;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int mod_glusterfs_plugin_init(plugin *p) {</div><div class='del'>-        p-&gt;version     = LIGHTTPD_VERSION_ID;</div><div class='del'>-        p-&gt;name        = buffer_init_string("glusterfs");</div><div class='del'>-        p-&gt;init        = mod_glusterfs_init;</div><div class='del'>-        p-&gt;handle_physical = mod_glusterfs_handle_physical;</div><div class='del'>-        p-&gt;handle_subrequest_start = mod_glusterfs_subrequest;</div><div class='del'>-        //      p-&gt;handle_request_done = mod_glusterfs_request_done;</div><div class='del'>-        p-&gt;set_defaults  = mod_glusterfs_set_defaults;</div><div class='del'>-        p-&gt;connection_reset = mod_glusterfs_connection_reset;</div><div class='del'>-        p-&gt;cleanup     = mod_glusterfs_free;</div><div class='del'>-  </div><div class='del'>-        p-&gt;data        = NULL;</div><div class='del'>-  </div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-/* mod_glusterfs_stat_cache */</div><div class='del'>-static stat_cache_entry * stat_cache_entry_init(void) {</div><div class='del'>-        stat_cache_entry *sce = NULL;</div><div class='del'>-  </div><div class='del'>-        sce = calloc(1, sizeof(*sce));</div><div class='del'>-        /* ERR_ABORT (sce); */</div><div class='del'>-  </div><div class='del'>-        sce-&gt;name = buffer_init();</div><div class='del'>-        sce-&gt;etag = buffer_init();</div><div class='del'>-        sce-&gt;content_type = buffer_init();</div><div class='del'>-</div><div class='del'>-        return sce;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-#ifdef HAVE_FAM_H</div><div class='del'>-static fam_dir_entry * fam_dir_entry_init(void) {</div><div class='del'>-        fam_dir_entry *fam_dir = NULL;</div><div class='del'>-  </div><div class='del'>-        fam_dir = calloc(1, sizeof(*fam_dir));</div><div class='del'>-        /* ERR_ABORT (fam_dir); */</div><div class='del'>-  </div><div class='del'>-        fam_dir-&gt;name = buffer_init();</div><div class='del'>-  </div><div class='del'>-        return fam_dir;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-static void fam_dir_entry_free(void *data) {</div><div class='del'>-        fam_dir_entry *fam_dir = data;</div><div class='del'>-</div><div class='del'>-        if (!fam_dir) return;</div><div class='del'>-</div><div class='del'>-        FAMCancelMonitor(fam_dir-&gt;fc, fam_dir-&gt;req);</div><div class='del'>-</div><div class='del'>-        buffer_free(fam_dir-&gt;name);</div><div class='del'>-        free(fam_dir-&gt;req);</div><div class='del'>-</div><div class='del'>-        free(fam_dir);</div><div class='del'>-}</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-#ifdef HAVE_XATTR</div><div class='del'>-static int stat_cache_attr_get(buffer *buf, char *name) {</div><div class='del'>-        int attrlen;</div><div class='del'>-        int ret;</div><div class='del'>-  </div><div class='del'>-        attrlen = 1024;</div><div class='del'>-        buffer_prepare_copy(buf, attrlen);</div><div class='del'>-        attrlen--;</div><div class='del'>-        if(0 == (ret = attr_get(name, "Content-Type", buf-&gt;ptr, &amp;attrlen, 0))) {</div><div class='del'>-                buf-&gt;used = attrlen + 1;</div><div class='del'>-                buf-&gt;ptr[attrlen] = '\0';</div><div class='del'>-        }</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-/* the famous DJB hash function for strings */</div><div class='del'>-static uint32_t hashme(buffer *str) {</div><div class='del'>-        uint32_t hash = 5381;</div><div class='del'>-        const char *s;</div><div class='del'>-        for (s = str-&gt;ptr; *s; s++) {</div><div class='del'>-                hash = ((hash &lt;&lt; 5) + hash) + *s;</div><div class='del'>-        }</div><div class='del'>-  </div><div class='del'>-        hash &amp;= ~(1 &lt;&lt; 31); /* strip the highest bit */</div><div class='del'>-  </div><div class='del'>-        return hash;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-#ifdef HAVE_LSTAT</div><div class='del'>-static int stat_cache_lstat(server *srv, buffer *dname, struct stat *lst) {</div><div class='del'>-        if (lstat(dname-&gt;ptr, lst) == 0) {</div><div class='del'>-                return S_ISLNK(lst-&gt;st_mode) ? 0 : 1;</div><div class='del'>-        }</div><div class='del'>-        else {</div><div class='del'>-                log_error_write(srv, __FILE__, __LINE__, "sbs",</div><div class='del'>-                                "lstat failed for:",</div><div class='del'>-                                dname, strerror(errno));</div><div class='del'>-        };</div><div class='del'>-        return -1;</div><div class='del'>-}</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-/***</div><div class='del'>- *</div><div class='del'>- *</div><div class='del'>- *</div><div class='del'>- * returns:</div><div class='del'>- *  - HANDLER_FINISHED on cache-miss (don't forget to reopen the file)</div><div class='del'>- *  - HANDLER_ERROR on stat() failed -&gt; see errno for problem</div><div class='del'>- */</div><div class='del'>-</div><div class='del'>-handler_t glusterfs_stat_cache_get_entry(server *srv, </div><div class='del'>-                                         connection *con, </div><div class='del'>-                                         buffer *glusterfs_path,</div><div class='del'>-                                         buffer *name, </div><div class='del'>-                                         void *buf, </div><div class='del'>-                                         size_t size, </div><div class='del'>-                                         stat_cache_entry **ret_sce) </div><div class='del'>-{</div><div class='del'>-#ifdef HAVE_FAM_H</div><div class='del'>-        fam_dir_entry *fam_dir = NULL;</div><div class='del'>-        int dir_ndx = -1;</div><div class='del'>-        splay_tree *dir_node = NULL;</div><div class='del'>-#endif</div><div class='del'>-        stat_cache_entry *sce = NULL;</div><div class='del'>-        stat_cache *sc;</div><div class='del'>-        struct stat st; </div><div class='del'>-        size_t k;</div><div class='del'>-#ifdef DEBUG_STAT_CACHE</div><div class='del'>-        size_t i;</div><div class='del'>-#endif</div><div class='del'>-        int file_ndx;</div><div class='del'>-        splay_tree *file_node = NULL;</div><div class='del'>-</div><div class='del'>-        *ret_sce = NULL;</div><div class='del'>-        memset (&amp;st, 0, sizeof (st));</div><div class='del'>-</div><div class='del'>-        /*</div><div class='del'>-         * check if the directory for this file has changed</div><div class='del'>-         */</div><div class='del'>-</div><div class='del'>-        sc = srv-&gt;stat_cache;</div><div class='del'>-</div><div class='del'>-        buffer_copy_string_buffer(sc-&gt;hash_key, name);</div><div class='del'>-        buffer_append_long(sc-&gt;hash_key, con-&gt;conf.follow_symlink);</div><div class='del'>-</div><div class='del'>-        file_ndx = hashme(sc-&gt;hash_key);</div><div class='del'>-        sc-&gt;files = splaytree_splay(sc-&gt;files, file_ndx);</div><div class='del'>-</div><div class='del'>-#ifdef DEBUG_STAT_CACHE</div><div class='del'>-        for (i = 0; i &lt; ctrl.used; i++) {</div><div class='del'>-                if (ctrl.ptr[i] == file_ndx) break;</div><div class='del'>-        }</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-        if (sc-&gt;files &amp;&amp; (sc-&gt;files-&gt;key == file_ndx)) {</div><div class='del'>-#ifdef DEBUG_STAT_CACHE</div><div class='del'>-                /* it was in the cache */</div><div class='del'>-                assert(i &lt; ctrl.used);</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-                /* we have seen this file already and</div><div class='del'>-                 * don't stat() it again in the same second */</div><div class='del'>-</div><div class='del'>-                file_node = sc-&gt;files;</div><div class='del'>-</div><div class='del'>-                sce = file_node-&gt;data;</div><div class='del'>-</div><div class='del'>-                /* check if the name is the same, we might have a collision */</div><div class='del'>-</div><div class='del'>-                if (buffer_is_equal(name, sce-&gt;name)) {</div><div class='del'>-                        if (srv-&gt;srvconf.stat_cache_engine </div><div class='del'>-                            == STAT_CACHE_ENGINE_SIMPLE) {</div><div class='del'>-                                if (sce-&gt;stat_ts == srv-&gt;cur_ts &amp;&amp; !buf) {</div><div class='del'>-                                        *ret_sce = sce;</div><div class='del'>-                                        return HANDLER_GO_ON;</div><div class='del'>-                                }</div><div class='del'>-                        }</div><div class='del'>-                } else {</div><div class='del'>-                        /* oops, a collision,</div><div class='del'>-                         *</div><div class='del'>-                         * file_node is used by the FAM check below to see if </div><div class='del'>-                         * we know this file and if we can save a stat().</div><div class='del'>-                         *</div><div class='del'>-                         * BUT, the sce is not reset here as the entry into </div><div class='del'>-                         * the cache is ok, we it is just not pointing to </div><div class='del'>-                         * our requested file.</div><div class='del'>-                         */</div><div class='del'>-</div><div class='del'>-                        file_node = NULL;</div><div class='del'>-                }</div><div class='del'>-        } else {</div><div class='del'>-#ifdef DEBUG_STAT_CACHE</div><div class='del'>-                if (i != ctrl.used) {</div><div class='del'>-                        fprintf(stderr, "%s.%d: %08x was already inserted "</div><div class='del'>-                                "but not found in cache, %s\n",</div><div class='del'>-                                __FILE__, __LINE__, file_ndx, name-&gt;ptr);</div><div class='del'>-                }</div><div class='del'>-                assert(i == ctrl.used);</div><div class='del'>-#endif</div><div class='del'>-        }</div><div class='del'>-        /*</div><div class='del'>-         * *lol*</div><div class='del'>-         * - open() + fstat() on a named-pipe results in a (intended) hang.</div><div class='del'>-         * - stat() if regular file + open() to see if we can read from it is </div><div class='del'>-         *   better</div><div class='del'>-         *</div><div class='del'>-         * */</div><div class='del'>-        if (-1 == glusterfs_get (glusterfs_path-&gt;ptr, buf, size, &amp;st)) {</div><div class='del'>-                return HANDLER_ERROR;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (NULL == sce) {</div><div class='del'>-                int osize = 0;</div><div class='del'>-</div><div class='del'>-                if (sc-&gt;files) {</div><div class='del'>-                        osize = sc-&gt;files-&gt;size;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                sce = stat_cache_entry_init();</div><div class='del'>-                buffer_copy_string_buffer(sce-&gt;name, name);</div><div class='del'>-</div><div class='del'>-                sc-&gt;files = splaytree_insert(sc-&gt;files, file_ndx, sce);</div><div class='del'>-#ifdef DEBUG_STAT_CACHE</div><div class='del'>-                if (ctrl.size == 0) {</div><div class='del'>-                        ctrl.size = 16;</div><div class='del'>-                        ctrl.used = 0;</div><div class='del'>-                        ctrl.ptr = malloc(ctrl.size * sizeof(*ctrl.ptr));</div><div class='del'>-                        /* ERR_ABORT (ctrl.ptr); */</div><div class='del'>-                } else if (ctrl.size == ctrl.used) {</div><div class='del'>-                        ctrl.size += 16;</div><div class='del'>-                        ctrl.ptr = realloc(ctrl.ptr,</div><div class='del'>-                                           ctrl.size * sizeof(*ctrl.ptr));</div><div class='del'>-                        /* ERR_ABORT (ctrl.ptr); */</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                ctrl.ptr[ctrl.used++] = file_ndx;</div><div class='del'>-</div><div class='del'>-                assert(sc-&gt;files);</div><div class='del'>-                assert(sc-&gt;files-&gt;data == sce);</div><div class='del'>-                assert(osize + 1 == splaytree_size(sc-&gt;files));</div><div class='del'>-#endif</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        sce-&gt;st = st;</div><div class='del'>-        sce-&gt;stat_ts = srv-&gt;cur_ts;</div><div class='del'>-</div><div class='del'>-        /* catch the obvious symlinks</div><div class='del'>-         *</div><div class='del'>-         * this is not a secure check as we still have a race-condition between</div><div class='del'>-         * the stat() and the open. We can only solve this by</div><div class='del'>-         * 1. open() the file</div><div class='del'>-         * 2. fstat() the fd</div><div class='del'>-         *</div><div class='del'>-         * and keeping the file open for the rest of the time. But this can</div><div class='del'>-         * only be done at network level.</div><div class='del'>-         *</div><div class='del'>-         * per default it is not a symlink</div><div class='del'>-         * */</div><div class='del'>-#ifdef HAVE_LSTAT</div><div class='del'>-        sce-&gt;is_symlink = 0;</div><div class='del'>-</div><div class='del'>-        /* we want to only check for symlinks if we should block symlinks.</div><div class='del'>-         */</div><div class='del'>-        if (!con-&gt;conf.follow_symlink) {</div><div class='del'>-                if (stat_cache_lstat(srv, name, &amp;lst)  == 0) {</div><div class='del'>-#ifdef DEBUG_STAT_CACHE</div><div class='del'>-                        log_error_write(srv, __FILE__, __LINE__, "sb",</div><div class='del'>-                                        "found symlink", name);</div><div class='del'>-#endif</div><div class='del'>-                        sce-&gt;is_symlink = 1;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                /*</div><div class='del'>-                 * we assume "/" can not be symlink, so</div><div class='del'>-                 * skip the symlink stuff if our path is /</div><div class='del'>-                 **/</div><div class='del'>-                else if ((name-&gt;used &gt; 2)) {</div><div class='del'>-                        buffer *dname;</div><div class='del'>-                        char *s_cur;</div><div class='del'>-</div><div class='del'>-                        dname = buffer_init();</div><div class='del'>-                        buffer_copy_string_buffer(dname, name);</div><div class='del'>-</div><div class='del'>-                        while ((s_cur = strrchr(dname-&gt;ptr,'/'))) {</div><div class='del'>-                                *s_cur = '\0';</div><div class='del'>-                                dname-&gt;used = s_cur - dname-&gt;ptr + 1;</div><div class='del'>-                                if (dname-&gt;ptr == s_cur) {</div><div class='del'>-#ifdef DEBUG_STAT_CACHE</div><div class='del'>-                                        log_error_write(srv, __FILE__, __LINE__,</div><div class='del'>-                                                        "s", "reached /");</div><div class='del'>-#endif</div><div class='del'>-                                        break;</div><div class='del'>-                                }</div><div class='del'>-#ifdef DEBUG_STAT_CACHE</div><div class='del'>-                                log_error_write(srv, __FILE__, __LINE__, "sbs",</div><div class='del'>-                                                "checking if", dname, "is a "</div><div class='del'>-                                                "symlink");</div><div class='del'>-#endif</div><div class='del'>-                                if (stat_cache_lstat(srv, dname, &amp;lst)  == 0) {</div><div class='del'>-                                        sce-&gt;is_symlink = 1;</div><div class='del'>-#ifdef DEBUG_STAT_CACHE</div><div class='del'>-                                        log_error_write(srv, __FILE__, __LINE__,</div><div class='del'>-                                                        "sb",</div><div class='del'>-                                                        "found symlink", dname);</div><div class='del'>-#endif</div><div class='del'>-                                        break;</div><div class='del'>-                                };</div><div class='del'>-                        };</div><div class='del'>-                        buffer_free(dname);</div><div class='del'>-                };</div><div class='del'>-        };</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-        if (S_ISREG(st.st_mode)) {</div><div class='del'>-                /* determine mimetype */</div><div class='del'>-                buffer_reset(sce-&gt;content_type);</div><div class='del'>-</div><div class='del'>-                for (k = 0; k &lt; con-&gt;conf.mimetypes-&gt;used; k++) {</div><div class='del'>-                        data_string *ds = NULL;</div><div class='del'>-                        buffer *type = NULL;</div><div class='del'>-</div><div class='del'>-                        ds = (data_string *)con-&gt;conf.mimetypes-&gt;data[k];</div><div class='del'>-                        type = ds-&gt;key;</div><div class='del'>-                        if (type-&gt;used == 0) continue;</div><div class='del'>-</div><div class='del'>-                        /* check if the right side is the same */</div><div class='del'>-                        if (type-&gt;used &gt; name-&gt;used) continue;</div><div class='del'>-</div><div class='del'>-                        if (0 == strncasecmp(name-&gt;ptr + name-&gt;used - type-&gt;used,</div><div class='del'>-                                             type-&gt;ptr, type-&gt;used - 1)) {</div><div class='del'>-                                buffer_copy_string_buffer(sce-&gt;content_type,</div><div class='del'>-                                                          ds-&gt;value);</div><div class='del'>-                                break;</div><div class='del'>-                        }</div><div class='del'>-                }</div><div class='del'>-                etag_create(sce-&gt;etag, &amp;(sce-&gt;st), con-&gt;etag_flags);</div><div class='del'>-#ifdef HAVE_XATTR</div><div class='del'>-                if (con-&gt;conf.use_xattr &amp;&amp; buffer_is_empty(sce-&gt;content_type)) {</div><div class='del'>-                        stat_cache_attr_get(sce-&gt;content_type, name-&gt;ptr);</div><div class='del'>-                }</div><div class='del'>-#endif</div><div class='del'>-        } else if (S_ISDIR(st.st_mode)) {</div><div class='del'>-                etag_create(sce-&gt;etag, &amp;(sce-&gt;st), con-&gt;etag_flags);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-#ifdef HAVE_FAM_H</div><div class='del'>-        if (sc-&gt;fam &amp;&amp;</div><div class='del'>-            (srv-&gt;srvconf.stat_cache_engine == STAT_CACHE_ENGINE_FAM)) {</div><div class='del'>-                /* is this directory already registered ? */</div><div class='del'>-                if (!dir_node) {</div><div class='del'>-                        fam_dir = fam_dir_entry_init();</div><div class='del'>-                        fam_dir-&gt;fc = sc-&gt;fam;</div><div class='del'>-</div><div class='del'>-                        buffer_copy_string_buffer(fam_dir-&gt;name, sc-&gt;dir_name);</div><div class='del'>-</div><div class='del'>-                        fam_dir-&gt;version = 1;</div><div class='del'>-</div><div class='del'>-                        fam_dir-&gt;req = calloc(1, sizeof(FAMRequest));</div><div class='del'>-                        /* ERR_ABORT (fam_dir-&gt;req); */</div><div class='del'>-</div><div class='del'>-                        if (0 != FAMMonitorDirectory(sc-&gt;fam, fam_dir-&gt;name-&gt;ptr,</div><div class='del'>-                                                     fam_dir-&gt;req, fam_dir)) {</div><div class='del'>-</div><div class='del'>-                                log_error_write(srv, __FILE__, __LINE__, "sbsbs",</div><div class='del'>-                                                "monitoring dir failed:",</div><div class='del'>-                                                fam_dir-&gt;name, </div><div class='del'>-                                                "file:", name,</div><div class='del'>-                                                FamErrlist[FAMErrno]);</div><div class='del'>-</div><div class='del'>-                                fam_dir_entry_free(fam_dir);</div><div class='del'>-                        } else {</div><div class='del'>-                                int osize = 0;</div><div class='del'>-</div><div class='del'>-                                if (sc-&gt;dirs) {</div><div class='del'>-                                        osize = sc-&gt;dirs-&gt;size;</div><div class='del'>-                                }</div><div class='del'>-</div><div class='del'>-                                sc-&gt;dirs = splaytree_insert(sc-&gt;dirs, dir_ndx,</div><div class='del'>-                                                            fam_dir);</div><div class='del'>-                                assert(sc-&gt;dirs);</div><div class='del'>-                                assert(sc-&gt;dirs-&gt;data == fam_dir);</div><div class='del'>-                                assert(osize == (sc-&gt;dirs-&gt;size - 1));</div><div class='del'>-                        }</div><div class='del'>-                } else {</div><div class='del'>-                        fam_dir = dir_node-&gt;data;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                /* bind the fam_fc to the stat() cache entry */</div><div class='del'>-</div><div class='del'>-                if (fam_dir) {</div><div class='del'>-                        sce-&gt;dir_version = fam_dir-&gt;version;</div><div class='del'>-                        sce-&gt;dir_ndx     = dir_ndx;</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-        *ret_sce = sce;</div><div class='del'>-</div><div class='del'>-        return HANDLER_GO_ON;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-/**</div><div class='del'>- * remove stat() from cache which havn't been stat()ed for</div><div class='del'>- * more than 10 seconds</div><div class='del'>- *</div><div class='del'>- *</div><div class='del'>- * walk though the stat-cache, collect the ids which are too old</div><div class='del'>- * and remove them in a second loop</div><div class='del'>- */</div><div class='del'>-</div><div class='del'>-static int stat_cache_tag_old_entries(server *srv, splay_tree *t, int *keys,</div><div class='del'>-                                      size_t *ndx) {</div><div class='del'>-        stat_cache_entry *sce;</div><div class='del'>-</div><div class='del'>-        if (!t) return 0;</div><div class='del'>-</div><div class='del'>-        stat_cache_tag_old_entries(srv, t-&gt;left, keys, ndx);</div><div class='del'>-        stat_cache_tag_old_entries(srv, t-&gt;right, keys, ndx);</div><div class='del'>-</div><div class='del'>-        sce = t-&gt;data;</div><div class='del'>-</div><div class='del'>-        if (srv-&gt;cur_ts - sce-&gt;stat_ts &gt; 2) {</div><div class='del'>-                keys[(*ndx)++] = t-&gt;key;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='head'>diff --git a/mod_glusterfs/lighttpd/1.4/mod_glusterfs.h b/mod_glusterfs/lighttpd/1.4/mod_glusterfs.h<br/>deleted file mode 100644<br/>index c322f087ddb..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/mod_glusterfs/lighttpd/1.4/mod_glusterfs.h?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>mod_glusterfs/lighttpd/1.4/mod_glusterfs.h</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,32 +0,0 @@</div><div class='del'>-/*</div><div class='del'>-  Copyright (c) 2008-2009 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='del'>-  This file is part of GlusterFS.</div><div class='del'>-</div><div class='del'>-  GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-  it under the terms of the GNU General Public License as published</div><div class='del'>-  by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-  or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-  GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-  WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-  General Public License for more details.</div><div class='del'>-</div><div class='del'>-  You should have received a copy of the GNU General Public License</div><div class='del'>-  along with this program.  If not, see</div><div class='del'>-  &lt;http://www.gnu.org/licenses/&gt;.</div><div class='del'>-*/</div><div class='del'>-</div><div class='del'>-#ifndef _MOD_GLUSTERFS_FILE_CACHE_H_</div><div class='del'>-#define _MOD_GLUSTERFS_FILE_CACHE_H_</div><div class='del'>-</div><div class='del'>-#include "stat_cache.h"</div><div class='del'>-#include &lt;libglusterfsclient.h&gt;</div><div class='del'>-#include "base.h"</div><div class='del'>-</div><div class='del'>-handler_t glusterfs_stat_cache_get_entry(server *srv, connection *con,</div><div class='del'>-                                         buffer *glusterfs_path, buffer *name,</div><div class='del'>-                                         void *buf, size_t size,</div><div class='del'>-                                         stat_cache_entry **fce);</div><div class='del'>-</div><div class='del'>-#endif</div><div class='head'>diff --git a/mod_glusterfs/lighttpd/1.5/Makefile.am b/mod_glusterfs/lighttpd/1.5/Makefile.am<br/>deleted file mode 100644<br/>index eda329111dc..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/mod_glusterfs/lighttpd/1.5/Makefile.am?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>mod_glusterfs/lighttpd/1.5/Makefile.am</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,3 +0,0 @@</div><div class='del'>-EXTRA_DIST = Makefile.am.diff mod_glusterfs.c mod_glusterfs.h README.txt</div><div class='del'>-</div><div class='del'>-CLEANFILES = </div><div class='head'>diff --git a/mod_glusterfs/lighttpd/1.5/Makefile.am.diff b/mod_glusterfs/lighttpd/1.5/Makefile.am.diff<br/>deleted file mode 100644<br/>index 375696b5d8f..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/mod_glusterfs/lighttpd/1.5/Makefile.am.diff?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>mod_glusterfs/lighttpd/1.5/Makefile.am.diff</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,29 +0,0 @@</div><div class='del'>---- lighttpd-1.4.19/src/Makefile.am	2008-04-16 18:42:18.000000000 +0400</div><div class='del'>-+++ lighttpd-1.4.19.mod/src/Makefile.am	2008-04-16 18:41:11.000000000 +0400</div><div class='del'>-@@ -1,4 +1,4 @@</div><div class='del'>--AM_CFLAGS = $(FAM_CFLAGS)</div><div class='del'>-+AM_CFLAGS = $(FAM_CFLAGS)  -D_FILE_OFFSET_BITS=64 -D__USE_FILE_OFFSET64</div><div class='del'>- </div><div class='del'>- noinst_PROGRAMS=proc_open lemon # simple-fcgi #graphic evalo bench ajp ssl error_test adserver gen-license</div><div class='del'>- sbin_PROGRAMS=lighttpd lighttpd-angel</div><div class='del'>-@@ -241,6 +241,11 @@</div><div class='del'>- mod_accesslog_la_LDFLAGS = -module -export-dynamic -avoid-version -no-undefined</div><div class='del'>- mod_accesslog_la_LIBADD = $(common_libadd)</div><div class='del'>- </div><div class='del'>-+lib_LTLIBRARIES += mod_glusterfs.la</div><div class='del'>-+mod_glusterfs_la_SOURCES = mod_glusterfs.c</div><div class='del'>-+mod_glusterfs_la_CFLAGS = $(AM_CFLAGS) </div><div class='del'>-+mod_glusterfs_la_LDFLAGS = -module -export-dynamic -avoid-version -no-undefined -lglusterfsclient -lpthread</div><div class='del'>-+mod_glusterfs_la_LIBADD = $(common_libadd) </div><div class='del'>- </div><div class='del'>- hdr = server.h buffer.h network.h log.h keyvalue.h \</div><div class='del'>-       response.h request.h fastcgi.h chunk.h \</div><div class='del'>-@@ -254,7 +259,7 @@</div><div class='del'>-       configparser.h mod_ssi_exprparser.h \</div><div class='del'>-       sys-mmap.h sys-socket.h mod_cml.h mod_cml_funcs.h \</div><div class='del'>-       splaytree.h proc_open.h status_counter.h \</div><div class='del'>--      mod_magnet_cache.h</div><div class='del'>-+      mod_magnet_cache.h mod_glusterfs.h</div><div class='del'>- </div><div class='del'>- DEFS= @DEFS@ -DLIBRARY_DIR="\"$(libdir)\"" -DSBIN_DIR="\"$(sbindir)\""</div><div class='del'>- </div><div class='head'>diff --git a/mod_glusterfs/lighttpd/1.5/README.txt b/mod_glusterfs/lighttpd/1.5/README.txt<br/>deleted file mode 100644<br/>index bdbdfffbc50..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/mod_glusterfs/lighttpd/1.5/README.txt?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>mod_glusterfs/lighttpd/1.5/README.txt</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,57 +0,0 @@</div><div class='del'>-Introduction</div><div class='del'>-============</div><div class='del'>-mod_glusterfs is a module written for lighttpd to speed up the access of files present on glusterfs. mod_glusterfs uses libglusterfsclient library provided for glusterfs and hence can be used without fuse (File System in User Space).</div><div class='del'>-</div><div class='del'>-Usage</div><div class='del'>-=====</div><div class='del'>-To use mod_glusterfs with lighttpd-1.5, copy mod_glusterfs.c and mod_glusterfs.h into src/ of lighttpd-1.5 source tree, and apply the Makefile.am.diff to src/Makefile.am. Re-run ./autogen.sh on the top level of the lighttpd-1.5 build tree and recompile.</div><div class='del'>-</div><div class='del'>-# cp mod_glusterfs.[ch] /home/glusterfs/lighttpd-1.5/src/</div><div class='del'>-# cp Makefile.am.diff /home/glusterfs/lighttpd-1.5/</div><div class='del'>-# cd /home/glusterfs/lighttpd-1.5</div><div class='del'>-# patch -p1 &lt; Makefile.am.diff </div><div class='del'>-# ./autogen.sh</div><div class='del'>-# ./configure</div><div class='del'>-# make</div><div class='del'>-# make install</div><div class='del'>-</div><div class='del'>-Configuration</div><div class='del'>-=============</div><div class='del'>-* mod_glusterfs should be listed at the begining of the list server.modules in lighttpd.conf. </div><div class='del'>-</div><div class='del'>-Below is a snippet from lighttpd.conf concerning to mod_glusterfs.</div><div class='del'>-</div><div class='del'>-$HTTP["url"] =~ "^/glusterfs" {</div><div class='del'>-	glusterfs.prefix = "/glusterfs" </div><div class='del'>-	glusterfs.logfile = "/var/log/glusterfs-logfile"</div><div class='del'>-	glusterfs.document-root = "/home/glusterfs/document-root"</div><div class='del'>-	glusterfs.volume-specfile = "/etc/glusterfs/glusterfs.vol"</div><div class='del'>-	glusterfs.loglevel = "error"</div><div class='del'>-	glusterfs.cache-timeout = 300</div><div class='del'>-	glusterfs.xattr-interface-size-limit = "65536"</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-* $HTTP["url"] =~ "^/glusterfs"</div><div class='del'>-  A perl style regular expression used to match against the url. If regular expression matches the url, the url is handled by mod_glusterfs. Note that the pattern given here should match glusterfs.prefix.</div><div class='del'>-</div><div class='del'>-* glusterfs.prefix (COMPULSORY)</div><div class='del'>-  A string to be present at the starting of the file path in the url so that the file would be handled by glusterfs.</div><div class='del'>-  Eg., A GET request on the url http://www.example.com/glusterfs-prefix/some-dir/example-file will result in fetching of the file "/some-dir/example-file" from glusterfs mount if glusterfs.prefix is set to "/glusterfs-prefix".</div><div class='del'>-</div><div class='del'>-* glusterfs.volume-specfile (COMPULSORY)</div><div class='del'>-  Path to the the glusterfs volume specification file.</div><div class='del'>-</div><div class='del'>-* glusterfs.logfile (COMPULSORY)</div><div class='del'>-  Path to the glusterfs logfile.</div><div class='del'>-</div><div class='del'>-* glusterfs.loglevel (OPTIONAL, default = warning)</div><div class='del'>-  Allowed values are critical, error, warning, debug, none in the decreasing order of severity of error conditions.</div><div class='del'>-</div><div class='del'>-* glusterfs.cache-timeout (OPTIONAL, default = 0)</div><div class='del'>-  Timeout values for glusterfs stat and lookup cache.</div><div class='del'>-</div><div class='del'>-* glusterfs.document-root (COMPULSORY)</div><div class='del'>-  An absolute path, relative to which all the files are fetched from glusterfs.</div><div class='del'>-</div><div class='del'>-* glusterfs.xattr-interface-size-limit (OPTIONAL, default = 0)</div><div class='del'>-  Files with sizes upto and including this value are fetched through the extended attribute interface of glusterfs rather than the usual open-read-close set of operations. For files of small sizes, it is recommended to use extended attribute interface.</div><div class='head'>diff --git a/mod_glusterfs/lighttpd/1.5/mod_glusterfs.c b/mod_glusterfs/lighttpd/1.5/mod_glusterfs.c<br/>deleted file mode 100644<br/>index d8c9cc91038..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/mod_glusterfs/lighttpd/1.5/mod_glusterfs.c?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>mod_glusterfs/lighttpd/1.5/mod_glusterfs.c</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,1476 +0,0 @@</div><div class='del'>-/*</div><div class='del'>-  Copyright (c) 2008-2009 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='del'>-  This file is part of GlusterFS.</div><div class='del'>-</div><div class='del'>-  GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-  it under the terms of the GNU General Public License as published</div><div class='del'>-  by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-  or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-  GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-  WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-  General Public License for more details.</div><div class='del'>-</div><div class='del'>-  You should have received a copy of the GNU General Public License</div><div class='del'>-  along with this program.  If not, see</div><div class='del'>-  &lt;http://www.gnu.org/licenses/&gt;.</div><div class='del'>-*/</div><div class='del'>-</div><div class='del'>-#include &lt;ctype.h&gt;</div><div class='del'>-#include &lt;stdlib.h&gt;</div><div class='del'>-#include &lt;stdio.h&gt;</div><div class='del'>-#include &lt;string.h&gt;</div><div class='del'>-#include &lt;pthread.h&gt;</div><div class='del'>-#include &lt;sys/types.h&gt;</div><div class='del'>-#include &lt;fcntl.h&gt;</div><div class='del'>-</div><div class='del'>-#include &lt;sys/types.h&gt;</div><div class='del'>-#include &lt;sys/stat.h&gt;</div><div class='del'>-</div><div class='del'>-#include &lt;errno.h&gt;</div><div class='del'>-#include &lt;unistd.h&gt;</div><div class='del'>-#include &lt;assert.h&gt;</div><div class='del'>-</div><div class='del'>-#include "base.h"</div><div class='del'>-#include "log.h"</div><div class='del'>-#include "buffer.h"</div><div class='del'>-</div><div class='del'>-#include "plugin.h"</div><div class='del'>-</div><div class='del'>-#include "stat_cache.h"</div><div class='del'>-#include "mod_glusterfs.h"</div><div class='del'>-#include "etag.h"</div><div class='del'>-#include "response.h"</div><div class='del'>-</div><div class='del'>-#include "fdevent.h"</div><div class='del'>-#include "joblist.h"</div><div class='del'>-#include "http_req_range.h"</div><div class='del'>-#include "connections.h"</div><div class='del'>-#include "configfile.h"</div><div class='del'>-</div><div class='del'>-#include &lt;libglusterfsclient.h&gt;</div><div class='del'>-</div><div class='del'>-#ifdef HAVE_ATTR_ATTRIBUTES_H</div><div class='del'>-#include &lt;attr/attributes.h&gt;</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-#ifdef HAVE_FAM_H</div><div class='del'>-# include &lt;fam.h&gt;</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-#include "sys-mmap.h"</div><div class='del'>-</div><div class='del'>-/* NetBSD 1.3.x needs it */</div><div class='del'>-#ifndef MAP_FAILED</div><div class='del'>-# define MAP_FAILED -1</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-#ifndef O_LARGEFILE</div><div class='del'>-# define O_LARGEFILE 0</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-#ifndef HAVE_LSTAT</div><div class='del'>-#define lstat stat</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-#if 0</div><div class='del'>-/* enables debug code for testing if all nodes in the stat-cache as accessable */</div><div class='del'>-#define DEBUG_STAT_CACHE</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-#ifdef HAVE_LSTAT</div><div class='del'>-#undef HAVE_LSTAT</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-#define GLUSTERFS_FILE_CHUNK (FILE_CHUNK + 1)</div><div class='del'>-</div><div class='del'>-/* Keep this value large. Each glusterfs_async_read of GLUSTERFS_CHUNK_SIZE results in a network_backend_write of the read data*/</div><div class='del'>-</div><div class='del'>-#define GLUSTERFS_CHUNK_SIZE 8192</div><div class='del'>-</div><div class='del'>-/**</div><div class='del'>- * this is a staticfile for a lighttpd plugin</div><div class='del'>- *</div><div class='del'>- */</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-/* plugin config for all request/connections */</div><div class='del'>-</div><div class='del'>-typedef struct {</div><div class='del'>-        buffer *logfile;</div><div class='del'>-        buffer *loglevel;</div><div class='del'>-        buffer *specfile;</div><div class='del'>-        buffer *prefix;</div><div class='del'>-        buffer *xattr_file_size;</div><div class='del'>-        buffer *document_root;</div><div class='del'>-        array *exclude_exts;</div><div class='del'>-        unsigned short cache_timeout;</div><div class='del'>-</div><div class='del'>-        /* FIXME: its a pointer, hence cant be short */</div><div class='del'>-        unsigned long handle;</div><div class='del'>-} plugin_config;</div><div class='del'>-</div><div class='del'>-static network_status_t (*network_backend_write)(struct server *srv, connection *con, iosocket *sock, chunkqueue *cq);</div><div class='del'>-</div><div class='del'>-typedef struct {</div><div class='del'>-        PLUGIN_DATA;</div><div class='del'>-        buffer *range_buf;</div><div class='del'>-        plugin_config **config_storage;</div><div class='del'>-        http_req_range *ranges;</div><div class='del'>-        plugin_config conf;</div><div class='del'>-} plugin_data;</div><div class='del'>-</div><div class='del'>-typedef struct glusterfs_async_local {</div><div class='del'>-        int op_ret;</div><div class='del'>-        int op_errno;</div><div class='del'>-        pthread_mutex_t lock;</div><div class='del'>-        pthread_cond_t cond;</div><div class='del'>-        connection *con;</div><div class='del'>-        server *srv;</div><div class='del'>-        plugin_data *p;</div><div class='del'>-</div><div class='del'>-        union {</div><div class='del'>-                struct {</div><div class='del'>-                        char async_read_complete;</div><div class='del'>-                        off_t length;</div><div class='del'>-                        size_t read_bytes;</div><div class='del'>-                        glusterfs_read_buf_t *buf;</div><div class='del'>-                }readv;</div><div class='del'>-</div><div class='del'>-                struct {</div><div class='del'>-                        buffer *name;</div><div class='del'>-                        buffer *hash_key;</div><div class='del'>-                        size_t size;</div><div class='del'>-                }lookup;</div><div class='del'>-        }fop;</div><div class='del'>-} glusterfs_async_local_t;</div><div class='del'>-</div><div class='del'>-typedef struct {</div><div class='del'>-        unsigned long fd;</div><div class='del'>-        buffer *glusterfs_path;</div><div class='del'>-        void *buf;</div><div class='del'>-        off_t response_content_length;</div><div class='del'>-        int prefix;</div><div class='del'>-}mod_glusterfs_ctx_t;</div><div class='del'>-</div><div class='del'>-typedef struct {</div><div class='del'>-        chunkqueue *cq;</div><div class='del'>-        glusterfs_read_buf_t *buf;</div><div class='del'>-        size_t length;</div><div class='del'>-}mod_glusterfs_chunkqueue;</div><div class='del'>-</div><div class='del'>-#ifdef HAVE_FAM_H</div><div class='del'>-typedef struct {</div><div class='del'>-        FAMRequest *req;</div><div class='del'>-        FAMConnection *fc;</div><div class='del'>-</div><div class='del'>-        buffer *name;</div><div class='del'>-</div><div class='del'>-        int version;</div><div class='del'>-} fam_dir_entry;</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-/* the directory name is too long to always compare on it</div><div class='del'>- * - we need a hash</div><div class='del'>- * - the hash-key is used as sorting criteria for a tree</div><div class='del'>- * - a splay-tree is used as we can use the caching effect of it</div><div class='del'>- */</div><div class='del'>-</div><div class='del'>-/* we want to cleanup the stat-cache every few seconds, let's say 10</div><div class='del'>- *</div><div class='del'>- * - remove entries which are outdated since 30s</div><div class='del'>- * - remove entries which are fresh but havn't been used since 60s</div><div class='del'>- * - if we don't have a stat-cache entry for a directory, release it from the monitor</div><div class='del'>- */</div><div class='del'>-</div><div class='del'>-#ifdef DEBUG_STAT_CACHE</div><div class='del'>-typedef struct {</div><div class='del'>-        int *ptr;</div><div class='del'>-</div><div class='del'>-        size_t used;</div><div class='del'>-        size_t size;</div><div class='del'>-} fake_keys;</div><div class='del'>-</div><div class='del'>-static fake_keys ctrl;</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-static stat_cache_entry * </div><div class='del'>-stat_cache_entry_init(void) </div><div class='del'>-{</div><div class='del'>-        stat_cache_entry *sce = NULL;</div><div class='del'>-</div><div class='del'>-        sce = calloc(1, sizeof(*sce));</div><div class='del'>-        /* ERR_ABORT (sce); */</div><div class='del'>-</div><div class='del'>-        sce-&gt;name = buffer_init();</div><div class='del'>-        sce-&gt;etag = buffer_init();</div><div class='del'>-        sce-&gt;content_type = buffer_init();</div><div class='del'>-</div><div class='del'>-        return sce;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int chunkqueue_append_glusterfs_mem (chunkqueue *cq, const char * mem, size_t len) {</div><div class='del'>-        buffer *buf = NULL;</div><div class='del'>- </div><div class='del'>-        buf = chunkqueue_get_append_buffer (cq);</div><div class='del'>-</div><div class='del'>-        if (buf-&gt;ptr)</div><div class='del'>-                free (buf-&gt;ptr);</div><div class='del'>-</div><div class='del'>-        buf-&gt;used = len + 1;</div><div class='del'>-        buf-&gt;ptr = (char *)mem;</div><div class='del'>-        buf-&gt;size = len;</div><div class='del'>-</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-static int</div><div class='del'>-glusterfs_lookup_async_cbk (int op_ret, </div><div class='del'>-                            int op_errno,</div><div class='del'>-                            void *buf,</div><div class='del'>-                            struct stat *st,</div><div class='del'>-                            void *cbk_data)</div><div class='del'>-{</div><div class='del'>-        glusterfs_async_local_t *local = cbk_data;</div><div class='del'>-</div><div class='del'>-        mod_glusterfs_ctx_t *ctx = NULL;</div><div class='del'>-        ctx = local-&gt;con-&gt;plugin_ctx[local-&gt;p-&gt;id];</div><div class='del'>-</div><div class='del'>-        assert (ctx-&gt;buf== buf);</div><div class='del'>-</div><div class='del'>-        if (op_ret || !(S_ISREG (st-&gt;st_mode) &amp;&amp; (size_t)st-&gt;st_size &lt;= local-&gt;fop.lookup.size)) {</div><div class='del'>-</div><div class='del'>-                free (ctx-&gt;buf);</div><div class='del'>-                ctx-&gt;buf = NULL;</div><div class='del'>-</div><div class='del'>-                if (op_ret) {</div><div class='del'>-                        buffer_free (ctx-&gt;glusterfs_path);</div><div class='del'>-                        ctx-&gt;glusterfs_path = NULL;</div><div class='del'>-                        free (ctx);</div><div class='del'>-                        local-&gt;con-&gt;plugin_ctx[local-&gt;p-&gt;id] = NULL;</div><div class='del'>-</div><div class='del'>-                        if (op_errno == ENOENT)</div><div class='del'>-                                local-&gt;con-&gt;http_status = 404;</div><div class='del'>-                        else </div><div class='del'>-                                local-&gt;con-&gt;http_status = 403;</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (!op_ret) {</div><div class='del'>-                stat_cache_entry *sce = NULL;</div><div class='del'>-                stat_cache *sc = local-&gt;srv-&gt;stat_cache;</div><div class='del'>-</div><div class='del'>-                sce = (stat_cache_entry *)g_hash_table_lookup(sc-&gt;files, local-&gt;fop.lookup.hash_key);</div><div class='del'>-</div><div class='del'>-                if (!sce) {</div><div class='del'>-                        sce = stat_cache_entry_init();</div><div class='del'>-</div><div class='del'>-                        buffer_copy_string_buffer(sce-&gt;name, local-&gt;fop.lookup.name);</div><div class='del'>-                        g_hash_table_insert(sc-&gt;files, buffer_init_string(BUF_STR(local-&gt;fop.lookup.hash_key)), sce);</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                sce-&gt;state = STAT_CACHE_ENTRY_STAT_FINISHED;</div><div class='del'>-                sce-&gt;stat_ts = time (NULL);</div><div class='del'>-                memcpy (&amp;sce-&gt;st, st, sizeof (*st));</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        g_async_queue_push (local-&gt;srv-&gt;joblist_queue, local-&gt;con);</div><div class='del'>-        /*</div><div class='del'>-          joblist_append (local-&gt;srv, local-&gt;con);</div><div class='del'>-          kill (getpid(), SIGUSR1);</div><div class='del'>-        */</div><div class='del'>-        free (local);</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-static handler_t</div><div class='del'>-glusterfs_stat_cache_get_entry_async (server *srv, </div><div class='del'>-                                      connection *con, </div><div class='del'>-                                      plugin_data *p,</div><div class='del'>-                                      buffer *glusterfs_path,</div><div class='del'>-                                      buffer *name,</div><div class='del'>-                                      void *buf,</div><div class='del'>-                                      size_t size,</div><div class='del'>-                                      stat_cache_entry **ret_sce)</div><div class='del'>-{</div><div class='del'>-        stat_cache_entry *sce = NULL;</div><div class='del'>-        stat_cache *sc;</div><div class='del'>-        glusterfs_async_local_t *local = NULL;</div><div class='del'>-</div><div class='del'>-        *ret_sce = NULL;</div><div class='del'>-</div><div class='del'>-        /*</div><div class='del'>-         * check if the directory for this file has changed</div><div class='del'>-         */</div><div class='del'>-</div><div class='del'>-        sc = srv-&gt;stat_cache;</div><div class='del'>-</div><div class='del'>-        buffer_copy_string_buffer(sc-&gt;hash_key, name);</div><div class='del'>-        buffer_append_long(sc-&gt;hash_key, con-&gt;conf.follow_symlink);</div><div class='del'>-</div><div class='del'>-        if ((sce = (stat_cache_entry *)g_hash_table_lookup(sc-&gt;files, sc-&gt;hash_key))) {</div><div class='del'>-                /* know this entry already */</div><div class='del'>-</div><div class='del'>-                if (sce-&gt;state == STAT_CACHE_ENTRY_STAT_FINISHED &amp;&amp; </div><div class='del'>-                    !buf) {</div><div class='del'>-                        /* verify that this entry is still fresh */</div><div class='del'>-</div><div class='del'>-                        *ret_sce = sce;</div><div class='del'>-</div><div class='del'>-                        return HANDLER_GO_ON;</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-        /*</div><div class='del'>-         * *lol*</div><div class='del'>-         * - open() + fstat() on a named-pipe results in a (intended) hang.</div><div class='del'>-         * - stat() if regular file + open() to see if we can read from it is better</div><div class='del'>-         *</div><div class='del'>-         * */</div><div class='del'>-</div><div class='del'>-        /* pass a job to the stat-queue */</div><div class='del'>-</div><div class='del'>-        local = calloc (1, sizeof (*local));</div><div class='del'>-        /* ERR_ABORT (local); */</div><div class='del'>-        local-&gt;con = con;</div><div class='del'>-        local-&gt;srv = srv;</div><div class='del'>-        local-&gt;p = p;</div><div class='del'>-        local-&gt;fop.lookup.name = buffer_init_buffer (name);</div><div class='del'>-        local-&gt;fop.lookup.hash_key = buffer_init_buffer (sc-&gt;hash_key);</div><div class='del'>-        local-&gt;fop.lookup.size = size;</div><div class='del'>-</div><div class='del'>-        if (glusterfs_lookup_async ((libglusterfs_handle_t )p-&gt;conf.handle, glusterfs_path-&gt;ptr, buf, size, glusterfs_lookup_async_cbk, (void *) local)) {</div><div class='del'>-                free (local);</div><div class='del'>-                return HANDLER_ERROR;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        return HANDLER_WAIT_FOR_EVENT;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int </div><div class='del'>-mod_glusterfs_readv_async_cbk (glusterfs_read_buf_t *buf,</div><div class='del'>-                               void *cbk_data)</div><div class='del'>-{</div><div class='del'>-        glusterfs_async_local_t *local = cbk_data;</div><div class='del'>-        pthread_mutex_lock (&amp;local-&gt;lock);</div><div class='del'>-        {</div><div class='del'>-                local-&gt;fop.readv.async_read_complete = 1;</div><div class='del'>-                local-&gt;fop.readv.buf = buf;</div><div class='del'>-</div><div class='del'>-                pthread_cond_signal (&amp;local-&gt;cond);</div><div class='del'>-        }</div><div class='del'>-        pthread_mutex_unlock (&amp;local-&gt;lock);</div><div class='del'>-</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-network_status_t </div><div class='del'>-mod_glusterfs_read_async (server *srv, connection *con, chunk *glusterfs_chunk)</div><div class='del'>-{</div><div class='del'>-        glusterfs_async_local_t local;</div><div class='del'>-        off_t end = 0;</div><div class='del'>-        int nbytes;</div><div class='del'>-        int complete;</div><div class='del'>-        chunkqueue *cq = NULL;</div><div class='del'>-        chunk *c = NULL;</div><div class='del'>-        off_t offset = glusterfs_chunk-&gt;file.start;</div><div class='del'>-        size_t length = glusterfs_chunk-&gt;file.length;</div><div class='del'>-        unsigned long fd = (unsigned long)glusterfs_chunk-&gt;file.name;</div><div class='del'>-        network_status_t ret;</div><div class='del'>-</div><div class='del'>-        pthread_cond_init (&amp;local.cond, NULL);</div><div class='del'>-        pthread_mutex_init (&amp;local.lock, NULL);</div><div class='del'>-  </div><div class='del'>-        //local.fd = fd;</div><div class='del'>-        memset (&amp;local, 0, sizeof (local));</div><div class='del'>-</div><div class='del'>-        if (length &gt; 0)</div><div class='del'>-                end = offset + length;</div><div class='del'>-</div><div class='del'>-        cq = chunkqueue_init ();</div><div class='del'>-        if (!cq) {</div><div class='del'>-                con-&gt;http_status = 500;</div><div class='del'>-                return NETWORK_STATUS_FATAL_ERROR;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        do {</div><div class='del'>-                glusterfs_read_buf_t *buf;</div><div class='del'>-                int i;</div><div class='del'>-                if (length &gt; 0) {</div><div class='del'>-                        nbytes = end - offset;</div><div class='del'>-                        if (nbytes &gt; GLUSTERFS_CHUNK_SIZE)</div><div class='del'>-                                nbytes = GLUSTERFS_CHUNK_SIZE;</div><div class='del'>-                } else</div><div class='del'>-                        nbytes = GLUSTERFS_CHUNK_SIZE;</div><div class='del'>-</div><div class='del'>-                glusterfs_read_async(fd, </div><div class='del'>-                                     nbytes,</div><div class='del'>-                                     offset,</div><div class='del'>-                                     mod_glusterfs_readv_async_cbk,</div><div class='del'>-                                     (void *)&amp;local);</div><div class='del'>-</div><div class='del'>-                pthread_mutex_lock (&amp;local.lock);</div><div class='del'>-                {</div><div class='del'>-                        while (!local.fop.readv.async_read_complete) {</div><div class='del'>-                                pthread_cond_wait (&amp;local.cond, &amp;local.lock);</div><div class='del'>-                        }</div><div class='del'>-</div><div class='del'>-                        local.op_ret = local.fop.readv.buf-&gt;op_ret;</div><div class='del'>-                        local.op_errno = local.fop.readv.buf-&gt;op_errno;</div><div class='del'>-</div><div class='del'>-                        local.fop.readv.async_read_complete = 0;</div><div class='del'>-                        buf = local.fop.readv.buf;</div><div class='del'>-</div><div class='del'>-                        if ((int)length &lt; 0)</div><div class='del'>-                                complete = (local.fop.readv.buf-&gt;op_ret &lt;= 0);</div><div class='del'>-                        else {</div><div class='del'>-                                local.fop.readv.read_bytes += local.fop.readv.buf-&gt;op_ret;</div><div class='del'>-                                complete = ((local.fop.readv.read_bytes == length) || (local.fop.readv.buf-&gt;op_ret &lt;= 0));</div><div class='del'>-                        }</div><div class='del'>-                }</div><div class='del'>-                pthread_mutex_unlock (&amp;local.lock);</div><div class='del'>-</div><div class='del'>-                if (local.op_ret &gt; 0) {</div><div class='del'>-                        for (i = 0; i &lt; buf-&gt;count; i++) {</div><div class='del'>-                                buffer *nw_write_buf = chunkqueue_get_append_buffer (cq);</div><div class='del'>-</div><div class='del'>-                                nw_write_buf-&gt;used = nw_write_buf-&gt;size = buf-&gt;vector[i].iov_len + 1;</div><div class='del'>-                                nw_write_buf-&gt;ptr = buf-&gt;vector[i].iov_base;</div><div class='del'>-</div><div class='del'>-                                //      buffer_copy_memory (nw_write_buf, buf-&gt;vector[i].iov_base, buf-&gt;vector[i].iov_len + 1);</div><div class='del'>-                                offset += local.op_ret;</div><div class='del'>-                        }</div><div class='del'>-  </div><div class='del'>-                        ret = network_backend_write (srv, con, con-&gt;sock, cq);</div><div class='del'>-  </div><div class='del'>-                        if (chunkqueue_written (cq) != local.op_ret) {</div><div class='del'>-                                mod_glusterfs_chunkqueue *gf_cq;</div><div class='del'>-                                glusterfs_chunk-&gt;file.start = offset;</div><div class='del'>-                                if ((int)glusterfs_chunk-&gt;file.length &gt; 0)</div><div class='del'>-                                        glusterfs_chunk-&gt;file.length -= local.fop.readv.read_bytes;</div><div class='del'>-</div><div class='del'>-                                gf_cq = calloc (1, sizeof (*gf_cq));</div><div class='del'>-                                /* ERR_ABORT (qf_cq); */</div><div class='del'>-                                gf_cq-&gt;cq = cq;</div><div class='del'>-                                gf_cq-&gt;buf = buf;</div><div class='del'>-                                gf_cq-&gt;length = local.op_ret;</div><div class='del'>-                                glusterfs_chunk-&gt;file.mmap.start = (char *)gf_cq;</div><div class='del'>-                                return ret;</div><div class='del'>-                        }</div><div class='del'>-      </div><div class='del'>-                        for (c = cq-&gt;first ; c; c = c-&gt;next) </div><div class='del'>-                                c-&gt;mem-&gt;ptr = NULL;</div><div class='del'>-</div><div class='del'>-                        chunkqueue_reset (cq);</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                glusterfs_free (buf);</div><div class='del'>-        } while (!complete);</div><div class='del'>-</div><div class='del'>-        chunkqueue_free (cq);</div><div class='del'>-        glusterfs_close (fd);</div><div class='del'>-</div><div class='del'>-        if (local.op_ret &lt; 0)</div><div class='del'>-                con-&gt;http_status = 500;</div><div class='del'>-</div><div class='del'>-        return (local.op_ret &lt; 0 ? NETWORK_STATUS_FATAL_ERROR : NETWORK_STATUS_SUCCESS);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-network_status_t mod_glusterfs_network_backend_write(struct server *srv, connection *con, iosocket *sock, chunkqueue *cq)</div><div class='del'>-{</div><div class='del'>-        chunk *c, *prev, *first;</div><div class='del'>-        int chunks_written = 0;</div><div class='del'>-        int error = 0;</div><div class='del'>-        network_status_t ret;</div><div class='del'>-</div><div class='del'>-        for (first = prev = c = cq-&gt;first; c; c = c-&gt;next, chunks_written++) {</div><div class='del'>-</div><div class='del'>-                if (c-&gt;type == MEM_CHUNK &amp;&amp; c-&gt;mem-&gt;used &amp;&amp; !c-&gt;mem-&gt;ptr) {</div><div class='del'>-                        if (cq-&gt;first != c) {</div><div class='del'>-                                prev-&gt;next = NULL;</div><div class='del'>-</div><div class='del'>-                                /* call stored network_backend_write */</div><div class='del'>-                                ret = network_backend_write (srv, con, sock, cq);</div><div class='del'>-</div><div class='del'>-                                prev-&gt;next = c;</div><div class='del'>-                                if (ret != NETWORK_STATUS_SUCCESS) {</div><div class='del'>-                                        cq-&gt;first = first;</div><div class='del'>-                                        return ret;</div><div class='del'>-                                }</div><div class='del'>-                        } </div><div class='del'>-                        cq-&gt;first = c-&gt;next;</div><div class='del'>-</div><div class='del'>-                        if (c-&gt;file.fd &lt; 0) {</div><div class='del'>-                                error = HANDLER_ERROR;</div><div class='del'>-                                break;</div><div class='del'>-                        }</div><div class='del'>-</div><div class='del'>-                        if (c-&gt;file.mmap.start) {</div><div class='del'>-                                chunk *tmp;</div><div class='del'>-                                size_t len;</div><div class='del'>-                                mod_glusterfs_chunkqueue *gf_cq = (mod_glusterfs_chunkqueue *)c-&gt;file.mmap.start;</div><div class='del'>-</div><div class='del'>-                                ret = network_backend_write (srv, con, sock, gf_cq-&gt;cq);</div><div class='del'>-</div><div class='del'>-                                if ((len = (size_t)chunkqueue_written (gf_cq-&gt;cq)) != gf_cq-&gt;length) {</div><div class='del'>-                                        gf_cq-&gt;length -= len;</div><div class='del'>-                                        cq-&gt;first = first;</div><div class='del'>-                                        chunkqueue_remove_finished_chunks (gf_cq-&gt;cq);</div><div class='del'>-                                        return ret;</div><div class='del'>-                                }</div><div class='del'>-</div><div class='del'>-                                for (tmp = gf_cq-&gt;cq-&gt;first ; tmp; tmp = tmp-&gt;next)</div><div class='del'>-                                        tmp-&gt;mem-&gt;ptr = NULL;</div><div class='del'>-</div><div class='del'>-                                chunkqueue_free (gf_cq-&gt;cq);</div><div class='del'>-                                glusterfs_free (gf_cq-&gt;buf);</div><div class='del'>-                                free (gf_cq);</div><div class='del'>-                                c-&gt;file.mmap.start = NULL;</div><div class='del'>-                        }</div><div class='del'>-      </div><div class='del'>-                        ret = mod_glusterfs_read_async (srv, con, c); //c-&gt;file.fd, c-&gt;file.start, -1);//c-&gt;file.length);</div><div class='del'>-                        if (c-&gt;file.mmap.start) {</div><div class='del'>-                                /* pending chunkqueue from mod_glusterfs_read_async to be written to network */</div><div class='del'>-                                cq-&gt;first = first;</div><div class='del'>-                                return ret;</div><div class='del'>-                        }</div><div class='del'>-</div><div class='del'>-                        buffer_free (c-&gt;mem);</div><div class='del'>-                        c-&gt;mem = NULL;</div><div class='del'>-</div><div class='del'>-                        c-&gt;type = FILE_CHUNK;</div><div class='del'>-                        c-&gt;offset = c-&gt;file.length = 0;</div><div class='del'>-                        c-&gt;file.name = NULL;</div><div class='del'>-</div><div class='del'>-                        if (first == c)</div><div class='del'>-                                first = c-&gt;next;</div><div class='del'>-</div><div class='del'>-                        if (cq-&gt;last == c)</div><div class='del'>-                                cq-&gt;last = NULL;</div><div class='del'>-</div><div class='del'>-                        prev-&gt;next = c-&gt;next;</div><div class='del'>-</div><div class='del'>-                        free(c);</div><div class='del'>-                }     </div><div class='del'>-                prev = c;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        ret = network_backend_write (srv, con, sock, cq);</div><div class='del'>-</div><div class='del'>-        cq-&gt;first = first;</div><div class='del'>-</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-#if 0</div><div class='del'>-int chunkqueue_append_glusterfs_file (chunkqueue *cq, unsigned long fd, off_t offset, off_t len)</div><div class='del'>-{</div><div class='del'>-        chunk *c = NULL;</div><div class='del'>-        c = chunkqueue_get_append_tempfile (cq);</div><div class='del'>-  </div><div class='del'>-        if (c-&gt;file.is_temp) {</div><div class='del'>-                close (c-&gt;file.fd);</div><div class='del'>-                unlink (c-&gt;file.name-&gt;ptr);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        c-&gt;type = MEM_CHUNK;</div><div class='del'>-</div><div class='del'>-        c-&gt;mem = buffer_init ();</div><div class='del'>-        c-&gt;mem-&gt;used = len + 1;</div><div class='del'>-        c-&gt;mem-&gt;ptr = NULL;</div><div class='del'>-        c-&gt;offset = 0;</div><div class='del'>-</div><div class='del'>-        /*  buffer_copy_string_buffer (c-&gt;file.name, fn); */</div><div class='del'>-        c-&gt;file.start = offset;</div><div class='del'>-        c-&gt;file.length = len;</div><div class='del'>-        /*  buffer_free (c-&gt;file.name); */</div><div class='del'>-</div><div class='del'>-        /* identify chunk as glusterfs related */</div><div class='del'>-        c-&gt;file.mmap.start = MAP_FAILED;</div><div class='del'>-        /*  c-&gt;file.mmap.length = c-&gt;file.mmap.offset = len;*/</div><div class='del'>-</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-int chunkqueue_append_dummy_mem_chunk (chunkqueue *cq, off_t len)</div><div class='del'>-{</div><div class='del'>-        chunk *c = NULL;</div><div class='del'>-        c = chunkqueue_get_append_tempfile (cq);</div><div class='del'>-  </div><div class='del'>-        if (c-&gt;file.is_temp) {</div><div class='del'>-                close (c-&gt;file.fd);</div><div class='del'>-                unlink (c-&gt;file.name-&gt;ptr);</div><div class='del'>-                c-&gt;file.is_temp = 0;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        c-&gt;type = MEM_CHUNK;</div><div class='del'>-</div><div class='del'>-        c-&gt;mem-&gt;used = len + 1;</div><div class='del'>-        c-&gt;offset = len;</div><div class='del'>-        c-&gt;mem-&gt;ptr = NULL;</div><div class='del'>-</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int chunkqueue_append_glusterfs_file (chunkqueue *cq, unsigned long fd, off_t offset, off_t len)</div><div class='del'>-{</div><div class='del'>-        chunk *c = NULL;</div><div class='del'>-        c = chunkqueue_get_append_tempfile (cq);</div><div class='del'>-  </div><div class='del'>-        if (c-&gt;file.is_temp) {</div><div class='del'>-                close (c-&gt;file.fd);</div><div class='del'>-                unlink (c-&gt;file.name-&gt;ptr);</div><div class='del'>-                c-&gt;file.is_temp = 0;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        c-&gt;type = MEM_CHUNK;</div><div class='del'>-</div><div class='del'>-        c-&gt;mem = buffer_init ();</div><div class='del'>-        c-&gt;mem-&gt;used = len + 1;</div><div class='del'>-        c-&gt;mem-&gt;ptr = NULL;</div><div class='del'>-        c-&gt;offset = 0;</div><div class='del'>-</div><div class='del'>-        /*  buffer_copy_string_buffer (c-&gt;file.name, fn); */</div><div class='del'>-        buffer_free (c-&gt;file.name);</div><div class='del'>-</div><div class='del'>-        /* fd returned by libglusterfsclient is a pointer */</div><div class='del'>-        c-&gt;file.name = (buffer *)fd;</div><div class='del'>-        c-&gt;file.start = offset;</div><div class='del'>-        c-&gt;file.length = len;</div><div class='del'>-</div><div class='del'>-        //c-&gt;file.fd = fd;</div><div class='del'>-        c-&gt;file.mmap.start = NULL;</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-/* init the plugin data */</div><div class='del'>-INIT_FUNC(mod_glusterfs_init) {</div><div class='del'>-        plugin_data *p;</div><div class='del'>-</div><div class='del'>-        UNUSED (srv);</div><div class='del'>-        p = calloc(1, sizeof(*p));</div><div class='del'>-        /* ERR_ABORT (p); */</div><div class='del'>-        network_backend_write = NULL;</div><div class='del'>-        p-&gt;ranges = http_request_range_init();</div><div class='del'>-        return p;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-/* detroy the plugin data */</div><div class='del'>-FREE_FUNC(mod_glusterfs_free) {</div><div class='del'>-        plugin_data *p = p_d;</div><div class='del'>-</div><div class='del'>-        UNUSED (srv);</div><div class='del'>-</div><div class='del'>-        if (!p) return HANDLER_GO_ON;</div><div class='del'>-  </div><div class='del'>-        if (p-&gt;config_storage) {</div><div class='del'>-                size_t i;</div><div class='del'>-                for (i = 0; i &lt; srv-&gt;config_context-&gt;used; i++) {</div><div class='del'>-                        plugin_config *s = p-&gt;config_storage[i];</div><div class='del'>-      </div><div class='del'>-                        buffer_free (s-&gt;logfile);</div><div class='del'>-                        buffer_free (s-&gt;loglevel);</div><div class='del'>-                        buffer_free (s-&gt;specfile);</div><div class='del'>-                        buffer_free (s-&gt;prefix);</div><div class='del'>-                        buffer_free (s-&gt;xattr_file_size);</div><div class='del'>-                        buffer_free (s-&gt;document_root);</div><div class='del'>-                        array_free (s-&gt;exclude_exts);</div><div class='del'>-  </div><div class='del'>-                        free (s);</div><div class='del'>-                }</div><div class='del'>-                free (p-&gt;config_storage);</div><div class='del'>-        }</div><div class='del'>-        buffer_free (p-&gt;range_buf);</div><div class='del'>-        http_request_range_free (p-&gt;ranges);</div><div class='del'>-</div><div class='del'>-        free (p);</div><div class='del'>-  </div><div class='del'>-        return HANDLER_GO_ON;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-SETDEFAULTS_FUNC(mod_glusterfs_set_defaults) {</div><div class='del'>-        plugin_data *p = p_d;</div><div class='del'>-        size_t i = 0;</div><div class='del'>-  </div><div class='del'>-        config_values_t cv[] = {</div><div class='del'>-                { "glusterfs.logfile",              NULL, T_CONFIG_STRING, T_CONFIG_SCOPE_CONNECTION },</div><div class='del'>-    </div><div class='del'>-                { "glusterfs.loglevel",             NULL, T_CONFIG_STRING, T_CONFIG_SCOPE_CONNECTION },         </div><div class='del'>-                { "glusterfs.volume-specfile",             NULL, T_CONFIG_STRING, T_CONFIG_SCOPE_CONNECTION },          </div><div class='del'>-                { "glusterfs.cache-timeout",              NULL, T_CONFIG_SHORT, T_CONFIG_SCOPE_CONNECTION },</div><div class='del'>-    </div><div class='del'>-                { "glusterfs.exclude-extensions",   NULL, T_CONFIG_ARRAY, T_CONFIG_SCOPE_CONNECTION },</div><div class='del'>-    </div><div class='del'>-                /*TODO: get the prefix from config_conext and remove glusterfs.prefix from conf file */</div><div class='del'>-                { "glusterfs.prefix", NULL, T_CONFIG_STRING, T_CONFIG_SCOPE_CONNECTION },</div><div class='del'>-    </div><div class='del'>-                { "glusterfs.xattr-interface-size-limit", NULL, T_CONFIG_STRING, T_CONFIG_SCOPE_CONNECTION },</div><div class='del'>-</div><div class='del'>-                { "glusterfs.document-root", NULL, T_CONFIG_STRING, T_CONFIG_SCOPE_CONNECTION },</div><div class='del'>-    </div><div class='del'>-                { NULL,                          NULL, T_CONFIG_UNSET, T_CONFIG_SCOPE_UNSET }</div><div class='del'>-        };</div><div class='del'>-  </div><div class='del'>-        p-&gt;config_storage = calloc(1, srv-&gt;config_context-&gt;used * sizeof(specific_config *));</div><div class='del'>-        /* ERR_ABORT (p-&gt;config_storage); */</div><div class='del'>-        p-&gt;range_buf = buffer_init ();</div><div class='del'>-  </div><div class='del'>-        for (i = 0; i &lt; srv-&gt;config_context-&gt;used; i++) {</div><div class='del'>-                plugin_config *s;</div><div class='del'>-</div><div class='del'>-                s = calloc(1, sizeof(plugin_config));</div><div class='del'>-                /* ERR_ABORT (s); */</div><div class='del'>-                s-&gt;logfile = buffer_init ();</div><div class='del'>-                s-&gt;loglevel = buffer_init ();</div><div class='del'>-                s-&gt;specfile = buffer_init ();</div><div class='del'>-                s-&gt;exclude_exts = array_init ();</div><div class='del'>-                s-&gt;prefix = buffer_init ();</div><div class='del'>-                s-&gt;xattr_file_size = buffer_init ();</div><div class='del'>-                s-&gt;document_root = buffer_init ();</div><div class='del'>-    </div><div class='del'>-                cv[0].destination = s-&gt;logfile;</div><div class='del'>-                cv[1].destination = s-&gt;loglevel;</div><div class='del'>-                cv[2].destination = s-&gt;specfile;</div><div class='del'>-                cv[3].destination = &amp;s-&gt;cache_timeout;</div><div class='del'>-                cv[4].destination = s-&gt;exclude_exts;</div><div class='del'>-                cv[5].destination = s-&gt;prefix;</div><div class='del'>-                cv[6].destination = s-&gt;xattr_file_size;</div><div class='del'>-                cv[7].destination = s-&gt;document_root;</div><div class='del'>-</div><div class='del'>-                p-&gt;config_storage[i] = s;</div><div class='del'>-    </div><div class='del'>-                if (0 != config_insert_values_global(srv, ((data_config *)srv-&gt;config_context-&gt;data[i])-&gt;value, cv)) {</div><div class='del'>-                        return HANDLER_FINISHED;</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='del'>-  </div><div class='del'>-        return HANDLER_GO_ON;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-#define PATCH(x)                                \</div><div class='del'>-        p-&gt;conf.x = s-&gt;x;</div><div class='del'>-</div><div class='del'>-static int mod_glusterfs_patch_connection(server *srv, connection *con, plugin_data *p) {</div><div class='del'>-        size_t i, j;</div><div class='del'>-        plugin_config *s;</div><div class='del'>-</div><div class='del'>-        p-&gt;conf.logfile = NULL;</div><div class='del'>-        p-&gt;conf.loglevel = NULL;</div><div class='del'>-        p-&gt;conf.specfile = NULL;</div><div class='del'>-        p-&gt;conf.cache_timeout = 0;</div><div class='del'>-        p-&gt;conf.exclude_exts = NULL;</div><div class='del'>-        p-&gt;conf.prefix = NULL;</div><div class='del'>-        p-&gt;conf.xattr_file_size = NULL;</div><div class='del'>-        p-&gt;conf.exclude_exts = NULL;</div><div class='del'>-</div><div class='del'>-        /* skip the first, the global context */</div><div class='del'>-        /* glusterfs related config can only occur inside $HTTP["url"] == "&lt;glusterfs-prefix&gt;" */</div><div class='del'>-        for (i = 1; i &lt; srv-&gt;config_context-&gt;used; i++) {</div><div class='del'>-                data_config *dc = (data_config *)srv-&gt;config_context-&gt;data[i];</div><div class='del'>-                s = p-&gt;config_storage[i];</div><div class='del'>-</div><div class='del'>-                /* condition didn't match */</div><div class='del'>-                if (!config_check_cond(srv, con, dc)) continue;</div><div class='del'>-    </div><div class='del'>-                /* merge config */</div><div class='del'>-                for (j = 0; j &lt; dc-&gt;value-&gt;used; j++) {</div><div class='del'>-                        data_unset *du = dc-&gt;value-&gt;data[j];</div><div class='del'>-      </div><div class='del'>-                        if (buffer_is_equal_string (du-&gt;key, CONST_STR_LEN("glusterfs.logfile"))) {</div><div class='del'>-                                PATCH (logfile);</div><div class='del'>-                        } else if (buffer_is_equal_string (du-&gt;key, CONST_STR_LEN("glusterfs.loglevel"))) {</div><div class='del'>-                                PATCH (loglevel);</div><div class='del'>-                        } else if (buffer_is_equal_string (du-&gt;key, CONST_STR_LEN ("glusterfs.volume-specfile"))) {</div><div class='del'>-                                PATCH (specfile);</div><div class='del'>-                        } else if (buffer_is_equal_string (du-&gt;key, CONST_STR_LEN("glusterfs.cache-timeout"))) {</div><div class='del'>-                                PATCH (cache_timeout);</div><div class='del'>-                        } else if (buffer_is_equal_string (du-&gt;key, CONST_STR_LEN ("glusterfs.exclude-extensions"))) {</div><div class='del'>-                                PATCH (exclude_exts);</div><div class='del'>-                        } else if (buffer_is_equal_string (du-&gt;key, CONST_STR_LEN ("glusterfs.prefix"))) {</div><div class='del'>-                                PATCH (prefix);</div><div class='del'>-                        } else if (buffer_is_equal_string (du-&gt;key, CONST_STR_LEN ("glusterfs.xattr-interface-size-limit"))) {</div><div class='del'>-                                PATCH (xattr_file_size);</div><div class='del'>-                        } else if (buffer_is_equal_string (du-&gt;key, CONST_STR_LEN ("glusterfs.document-root"))) {</div><div class='del'>-                                PATCH (document_root);</div><div class='del'>-                        }</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-#undef PATCH</div><div class='del'>-</div><div class='del'>-static int http_response_parse_range(server *srv, connection *con, plugin_data *p) {</div><div class='del'>-        int multipart = 0;</div><div class='del'>-        char *boundary = "fkj49sn38dcn3";</div><div class='del'>-        data_string *ds;</div><div class='del'>-        stat_cache_entry *sce = NULL;</div><div class='del'>-        buffer *content_type = NULL;</div><div class='del'>-        buffer *range = NULL;</div><div class='del'>-        http_req_range *ranges, *r;</div><div class='del'>-        mod_glusterfs_ctx_t *ctx = con-&gt;plugin_ctx[p-&gt;id];</div><div class='del'>-        size_t size = 0;</div><div class='del'>-</div><div class='del'>-        if (!ctx) {</div><div class='del'>-                return -1;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (NULL != (ds = (data_string *)array_get_element(con-&gt;request.headers, CONST_STR_LEN("Range")))) {</div><div class='del'>-                range = ds-&gt;value;</div><div class='del'>-        } else {</div><div class='del'>-                /* we don't have a Range header */</div><div class='del'>-</div><div class='del'>-                return -1;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (HANDLER_ERROR == stat_cache_get_entry(srv, con, con-&gt;physical.path, &amp;sce)) {</div><div class='del'>-                SEGFAULT();</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        ctx-&gt;response_content_length = con-&gt;response.content_length = 0;</div><div class='del'>-</div><div class='del'>-        if (NULL != (ds = (data_string *)array_get_element(con-&gt;response.headers, CONST_STR_LEN("Content-Type")))) {</div><div class='del'>-                content_type = ds-&gt;value;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        /* start the range-header parser</div><div class='del'>-         * bytes=&lt;num&gt;  */</div><div class='del'>-</div><div class='del'>-        ranges = p-&gt;ranges;</div><div class='del'>-        http_request_range_reset(ranges);</div><div class='del'>-        switch (http_request_range_parse(range, ranges)) {</div><div class='del'>-        case PARSE_ERROR:</div><div class='del'>-                return -1; /* no range valid Range Header */</div><div class='del'>-        case PARSE_SUCCESS:</div><div class='del'>-                break;</div><div class='del'>-        default:</div><div class='del'>-                TRACE("%s", "foobar");</div><div class='del'>-                return -1;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (ranges-&gt;next) {</div><div class='del'>-                multipart = 1;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (p-&gt;conf.xattr_file_size &amp;&amp; p-&gt;conf.xattr_file_size-&gt;ptr) {</div><div class='del'>-                size = atoi (p-&gt;conf.xattr_file_size-&gt;ptr);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        /* patch the '-1' */</div><div class='del'>-        for (r = ranges; r; r = r-&gt;next) {</div><div class='del'>-                if (r-&gt;start == -1) {</div><div class='del'>-                        /* -&lt;end&gt;</div><div class='del'>-                         *</div><div class='del'>-                         * the last &lt;end&gt; bytes  */</div><div class='del'>-                        r-&gt;start = sce-&gt;st.st_size - r-&gt;end;</div><div class='del'>-                        r-&gt;end = sce-&gt;st.st_size - 1;</div><div class='del'>-                }</div><div class='del'>-                if (r-&gt;end == -1) {</div><div class='del'>-                        /* &lt;start&gt;-</div><div class='del'>-                         * all but the first &lt;start&gt; bytes */</div><div class='del'>-</div><div class='del'>-                        r-&gt;end = sce-&gt;st.st_size - 1;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                if (r-&gt;end &gt; sce-&gt;st.st_size - 1) {</div><div class='del'>-                        /* RFC 2616 - 14.35.1</div><div class='del'>-                         *</div><div class='del'>-                         * if last-byte-pos not present or &gt; size-of-file</div><div class='del'>-                         * take the size-of-file</div><div class='del'>-                         *</div><div class='del'>-                         *  */</div><div class='del'>-                        r-&gt;end = sce-&gt;st.st_size - 1;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                if (r-&gt;start &gt; sce-&gt;st.st_size - 1) {</div><div class='del'>-                        /* RFC 2616 - 14.35.1</div><div class='del'>-                         *</div><div class='del'>-                         * if first-byte-pos &gt; file-size, 416</div><div class='del'>-                         */</div><div class='del'>-</div><div class='del'>-                        con-&gt;http_status = 416;</div><div class='del'>-                        return -1;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                if (r-&gt;start &gt; r-&gt;end) {</div><div class='del'>-                        /* RFC 2616 - 14.35.1</div><div class='del'>-                         *</div><div class='del'>-                         * if last-byte-pos is present, it has to be &gt;= first-byte-pos</div><div class='del'>-                         *</div><div class='del'>-                         * invalid ranges have to be handle as no Range specified</div><div class='del'>-                         *  */</div><div class='del'>-</div><div class='del'>-                        return -1;</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (r) {</div><div class='del'>-                /* we ran into an range violation */</div><div class='del'>-                return -1;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (multipart) {</div><div class='del'>-                buffer *b;</div><div class='del'>-                for (r = ranges; r; r = r-&gt;next) {</div><div class='del'>-                        /* write boundary-header */</div><div class='del'>-</div><div class='del'>-                        b = chunkqueue_get_append_buffer(con-&gt;send);</div><div class='del'>-</div><div class='del'>-                        buffer_copy_string(b, "\r\n--");</div><div class='del'>-                        buffer_append_string(b, boundary);</div><div class='del'>-</div><div class='del'>-                        /* write Content-Range */</div><div class='del'>-                        buffer_append_string(b, "\r\nContent-Range: bytes ");</div><div class='del'>-                        buffer_append_off_t(b, r-&gt;start);</div><div class='del'>-                        buffer_append_string(b, "-");</div><div class='del'>-                        buffer_append_off_t(b, r-&gt;end);</div><div class='del'>-                        buffer_append_string(b, "/");</div><div class='del'>-                        buffer_append_off_t(b, sce-&gt;st.st_size);</div><div class='del'>-</div><div class='del'>-                        buffer_append_string(b, "\r\nContent-Type: ");</div><div class='del'>-                        buffer_append_string_buffer(b, content_type);</div><div class='del'>-</div><div class='del'>-                        /* write END-OF-HEADER */</div><div class='del'>-                        buffer_append_string(b, "\r\n\r\n");</div><div class='del'>-</div><div class='del'>-                        con-&gt;response.content_length += b-&gt;used - 1;</div><div class='del'>-                        ctx-&gt;response_content_length += b-&gt;used - 1;</div><div class='del'>-                        con-&gt;send-&gt;bytes_in += b-&gt;used - 1;</div><div class='del'>-</div><div class='del'>-                        if ((size_t)sce-&gt;st.st_size &gt; size) {</div><div class='del'>-                                chunkqueue_append_glusterfs_file(con-&gt;send_raw, ctx-&gt;fd, r-&gt;start, r-&gt;end - r-&gt;start + 1);</div><div class='del'>-                                con-&gt;send_raw-&gt;bytes_in += (r-&gt;end - r-&gt;start + 1);</div><div class='del'>-                                chunkqueue_append_dummy_mem_chunk (con-&gt;send, r-&gt;end - r-&gt;start + 1);</div><div class='del'>-                        } else {</div><div class='del'>-                                chunkqueue_append_mem (con-&gt;send, ((char *)ctx-&gt;buf) + r-&gt;start, r-&gt;end - r-&gt;start + 1); </div><div class='del'>-                                free (ctx-&gt;buf);</div><div class='del'>-                                ctx-&gt;buf = NULL;</div><div class='del'>-                        }</div><div class='del'>-                </div><div class='del'>-                        con-&gt;response.content_length += r-&gt;end - r-&gt;start + 1;</div><div class='del'>-                        ctx-&gt;response_content_length += r-&gt;end - r-&gt;start + 1;</div><div class='del'>-                        con-&gt;send-&gt;bytes_in += r-&gt;end - r-&gt;start + 1;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                /* add boundary end */</div><div class='del'>-                b = chunkqueue_get_append_buffer(con-&gt;send);</div><div class='del'>-</div><div class='del'>-                buffer_copy_string_len(b, "\r\n--", 4);</div><div class='del'>-                buffer_append_string(b, boundary);</div><div class='del'>-                buffer_append_string_len(b, "--\r\n", 4);</div><div class='del'>-</div><div class='del'>-                con-&gt;response.content_length += b-&gt;used - 1;</div><div class='del'>-                ctx-&gt;response_content_length += b-&gt;used - 1;</div><div class='del'>-                con-&gt;send-&gt;bytes_in += b-&gt;used - 1;</div><div class='del'>-</div><div class='del'>-                /* set header-fields */</div><div class='del'>-</div><div class='del'>-                buffer_copy_string(p-&gt;range_buf, "multipart/byteranges; boundary=");</div><div class='del'>-                buffer_append_string(p-&gt;range_buf, boundary);</div><div class='del'>-</div><div class='del'>-                /* overwrite content-type */</div><div class='del'>-                response_header_overwrite(srv, con, CONST_STR_LEN("Content-Type"), CONST_BUF_LEN(p-&gt;range_buf));</div><div class='del'>-</div><div class='del'>-        } else {</div><div class='del'>-                r = ranges;</div><div class='del'>-</div><div class='del'>-                chunkqueue_append_glusterfs_file(con-&gt;send_raw, ctx-&gt;fd, r-&gt;start, r-&gt;end - r-&gt;start + 1);</div><div class='del'>-                con-&gt;send_raw-&gt;bytes_in += (r-&gt;end - r-&gt;start + 1);</div><div class='del'>-                chunkqueue_append_dummy_mem_chunk (con-&gt;send, r-&gt;end - r-&gt;start + 1);</div><div class='del'>-                con-&gt;response.content_length += r-&gt;end - r-&gt;start + 1;</div><div class='del'>-                ctx-&gt;response_content_length += r-&gt;end - r-&gt;start + 1;</div><div class='del'>-                con-&gt;send-&gt;bytes_in += r-&gt;end - r-&gt;start + 1;</div><div class='del'>-</div><div class='del'>-                buffer_copy_string(p-&gt;range_buf, "bytes ");</div><div class='del'>-                buffer_append_off_t(p-&gt;range_buf, r-&gt;start);</div><div class='del'>-                buffer_append_string(p-&gt;range_buf, "-");</div><div class='del'>-                buffer_append_off_t(p-&gt;range_buf, r-&gt;end);</div><div class='del'>-                buffer_append_string(p-&gt;range_buf, "/");</div><div class='del'>-                buffer_append_off_t(p-&gt;range_buf, sce-&gt;st.st_size);</div><div class='del'>-</div><div class='del'>-                response_header_insert(srv, con, CONST_STR_LEN("Content-Range"), CONST_BUF_LEN(p-&gt;range_buf));</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        /* ok, the file is set-up */</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-PHYSICALPATH_FUNC(mod_glusterfs_handle_physical) {</div><div class='del'>-        plugin_data *p = p_d;</div><div class='del'>-        stat_cache_entry *sce;</div><div class='del'>-        size_t size = 0;</div><div class='del'>-        handler_t ret = 0;</div><div class='del'>-        mod_glusterfs_ctx_t *plugin_ctx = NULL;</div><div class='del'>-</div><div class='del'>-        if (con-&gt;http_status != 0) return HANDLER_GO_ON;</div><div class='del'>-        if (con-&gt;uri.path-&gt;used == 0) return HANDLER_GO_ON;</div><div class='del'>-        if (con-&gt;physical.path-&gt;used == 0) return HANDLER_GO_ON;</div><div class='del'>-</div><div class='del'>-        if (con-&gt;mode != DIRECT) return HANDLER_GO_ON;</div><div class='del'>-</div><div class='del'>-        /*</div><div class='del'>-          network_backend_write = srv-&gt;network_backend_write;</div><div class='del'>-          srv-&gt;network_backend_write = mod_glusterfs_network_backend_write;</div><div class='del'>-        */</div><div class='del'>-</div><div class='del'>-        switch (con-&gt;request.http_method) {</div><div class='del'>-        case HTTP_METHOD_GET:</div><div class='del'>-        case HTTP_METHOD_POST:</div><div class='del'>-        case HTTP_METHOD_HEAD:</div><div class='del'>-                break;</div><div class='del'>-</div><div class='del'>-        default:</div><div class='del'>-                return HANDLER_GO_ON;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        mod_glusterfs_patch_connection(srv, con, p);</div><div class='del'>-</div><div class='del'>-        if (!p-&gt;conf.prefix || !p-&gt;conf.prefix-&gt;ptr) {</div><div class='del'>-                return HANDLER_GO_ON;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (!p-&gt;conf.document_root || p-&gt;conf.document_root-&gt;used == 0) {</div><div class='del'>-                log_error_write(srv, __FILE__, __LINE__, "s", "glusterfs.document-root is not specified");</div><div class='del'>-                con-&gt;http_status = 500;</div><div class='del'>-                return HANDLER_FINISHED;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (p-&gt;conf.handle &lt;= 0) {</div><div class='del'>-                glusterfs_init_ctx_t ctx;</div><div class='del'>-</div><div class='del'>-                if (!p-&gt;conf.specfile || p-&gt;conf.specfile-&gt;used == 0) {</div><div class='del'>-                        return HANDLER_GO_ON;</div><div class='del'>-                }</div><div class='del'>-                memset (&amp;ctx, 0, sizeof (ctx));</div><div class='del'>-</div><div class='del'>-                ctx.specfile = p-&gt;conf.specfile-&gt;ptr;</div><div class='del'>-                ctx.logfile = p-&gt;conf.logfile-&gt;ptr;</div><div class='del'>-                ctx.loglevel = p-&gt;conf.loglevel-&gt;ptr;</div><div class='del'>-                ctx.lookup_timeout = ctx.stat_timeout = p-&gt;conf.cache_timeout;</div><div class='del'>-</div><div class='del'>-                p-&gt;conf.handle = (unsigned long)glusterfs_init (&amp;ctx);</div><div class='del'>-</div><div class='del'>-                if (p-&gt;conf.handle &lt;= 0) {</div><div class='del'>-                        con-&gt;http_status = 500;</div><div class='del'>-                        log_error_write(srv, __FILE__, __LINE__,  "sbs",  "glusterfs initialization failed, please check your configuration. Glusterfs logfile ", p-&gt;conf.logfile, "might contain details");</div><div class='del'>-                        return HANDLER_FINISHED;</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        size = 0;</div><div class='del'>-        if (p-&gt;conf.xattr_file_size &amp;&amp; p-&gt;conf.xattr_file_size-&gt;ptr) </div><div class='del'>-                size = atoi (p-&gt;conf.xattr_file_size-&gt;ptr);</div><div class='del'>-</div><div class='del'>-        if (!con-&gt;plugin_ctx[p-&gt;id]) {</div><div class='del'>-                buffer *tmp_buf = buffer_init_buffer (con-&gt;physical.basedir);</div><div class='del'>-</div><div class='del'>-                plugin_ctx = calloc (1, sizeof (*plugin_ctx));</div><div class='del'>-                /* ERR_ABORT (plugin_ctx); */</div><div class='del'>-                con-&gt;plugin_ctx[p-&gt;id] = plugin_ctx;</div><div class='del'>-    </div><div class='del'>-                buffer_append_string_buffer (tmp_buf, p-&gt;conf.prefix);</div><div class='del'>-                buffer_path_simplify (tmp_buf, tmp_buf);</div><div class='del'>-</div><div class='del'>-                plugin_ctx-&gt;prefix = tmp_buf-&gt;used - 1;</div><div class='del'>-                if (tmp_buf-&gt;ptr[plugin_ctx-&gt;prefix - 1] == '/')</div><div class='del'>-                        plugin_ctx-&gt;prefix--;</div><div class='del'>-</div><div class='del'>-                buffer_free (tmp_buf);</div><div class='del'>-        } else </div><div class='del'>-                /*FIXME: error!! error!! */</div><div class='del'>-                plugin_ctx = con-&gt;plugin_ctx[p-&gt;id];</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-        if (size) </div><div class='del'>-        {</div><div class='del'>-                plugin_ctx-&gt;buf = malloc (size);</div><div class='del'>-                /* ERR_ABORT (plugin_ctx-&gt;buf); */</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        plugin_ctx-&gt;glusterfs_path = buffer_init ();</div><div class='del'>-        buffer_copy_string_buffer (plugin_ctx-&gt;glusterfs_path, p-&gt;conf.document_root);</div><div class='del'>-        buffer_append_string (plugin_ctx-&gt;glusterfs_path, "/");</div><div class='del'>-        buffer_append_string (plugin_ctx-&gt;glusterfs_path, con-&gt;physical.path-&gt;ptr + plugin_ctx-&gt;prefix);</div><div class='del'>-        buffer_path_simplify (plugin_ctx-&gt;glusterfs_path, plugin_ctx-&gt;glusterfs_path);</div><div class='del'>-</div><div class='del'>-        ret = glusterfs_stat_cache_get_entry_async (srv, con, p, plugin_ctx-&gt;glusterfs_path, con-&gt;physical.path, plugin_ctx-&gt;buf, size, &amp;sce);</div><div class='del'>-</div><div class='del'>-        if (ret == HANDLER_ERROR) {</div><div class='del'>-                free (plugin_ctx-&gt;buf);</div><div class='del'>-                plugin_ctx-&gt;buf = NULL;</div><div class='del'>-</div><div class='del'>-                buffer_free (plugin_ctx-&gt;glusterfs_path);</div><div class='del'>-                plugin_ctx-&gt;glusterfs_path = NULL;</div><div class='del'>-</div><div class='del'>-                free (plugin_ctx);</div><div class='del'>-                con-&gt;plugin_ctx[p-&gt;id] = NULL;</div><div class='del'>-</div><div class='del'>-                con-&gt;http_status = 500;</div><div class='del'>-                ret = HANDLER_FINISHED;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-URIHANDLER_FUNC(mod_glusterfs_subrequest) {</div><div class='del'>-        plugin_data *p = p_d;</div><div class='del'>-        stat_cache_entry *sce = NULL;</div><div class='del'>-        int s_len;</div><div class='del'>-        unsigned long fd;</div><div class='del'>-        char allow_caching = 1;</div><div class='del'>-        size_t size = 0;</div><div class='del'>-        mod_glusterfs_ctx_t *ctx = con-&gt;plugin_ctx[p-&gt;id];</div><div class='del'>-</div><div class='del'>-        /* someone else has done a decision for us */</div><div class='del'>-        if (con-&gt;http_status != 0) return HANDLER_GO_ON;</div><div class='del'>-        if (con-&gt;uri.path-&gt;used == 0) return HANDLER_GO_ON;</div><div class='del'>-        if (con-&gt;physical.path-&gt;used == 0) return HANDLER_GO_ON;</div><div class='del'>-  </div><div class='del'>-        /* someone else has handled this request */</div><div class='del'>-        if (con-&gt;mode != DIRECT) return HANDLER_GO_ON;</div><div class='del'>-  </div><div class='del'>-        /* we only handle GET, POST and HEAD */</div><div class='del'>-        switch(con-&gt;request.http_method) {</div><div class='del'>-        case HTTP_METHOD_GET:</div><div class='del'>-        case HTTP_METHOD_POST:</div><div class='del'>-        case HTTP_METHOD_HEAD:</div><div class='del'>-                break;</div><div class='del'>-        default:</div><div class='del'>-                return HANDLER_GO_ON;</div><div class='del'>-        }</div><div class='del'>-  </div><div class='del'>-        mod_glusterfs_patch_connection(srv, con, p);</div><div class='del'>-  </div><div class='del'>-        if (!p-&gt;conf.prefix || !p-&gt;conf.prefix-&gt;ptr)</div><div class='del'>-                return HANDLER_GO_ON;</div><div class='del'>-</div><div class='del'>-        if (!ctx) {</div><div class='del'>-                con-&gt;http_status = 500;</div><div class='del'>-                return HANDLER_FINISHED;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        s_len = con-&gt;uri.path-&gt;used - 1;</div><div class='del'>-        /* ignore certain extensions */</div><div class='del'>-        /*</div><div class='del'>-          for (k = 0; k &lt; p-&gt;conf.exclude_exts-&gt;used; k++) {</div><div class='del'>-          data_string *ds;</div><div class='del'>-          ds = (data_string *)p-&gt;conf.exclude_exts-&gt;data[k];</div><div class='del'>-          </div><div class='del'>-          if (ds-&gt;value-&gt;used == 0) continue;</div><div class='del'>-    </div><div class='del'>-          if (!strncmp (ds-&gt;value-&gt;ptr, con-&gt;uri.path-&gt;ptr, strlen (ds-&gt;value-&gt;ptr)))</div><div class='del'>-          break;</div><div class='del'>-          }</div><div class='del'>-  </div><div class='del'>-          if (k == p-&gt;conf.exclude_exts-&gt;used) {</div><div class='del'>-          return HANDLER_GO_ON;</div><div class='del'>-          }</div><div class='del'>-        */</div><div class='del'>-</div><div class='del'>-        if (con-&gt;conf.log_request_handling) {</div><div class='del'>-                log_error_write(srv, __FILE__, __LINE__,  "s",  "-- serving file from glusterfs");</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (HANDLER_ERROR == stat_cache_get_entry(srv, con, con-&gt;physical.path, &amp;sce)) {</div><div class='del'>-                con-&gt;http_status = 403;</div><div class='del'>-</div><div class='del'>-                /* this might happen if the sce is removed from stat-cache after a successful glusterfs_lookup */</div><div class='del'>-                if (ctx) {</div><div class='del'>-                        if (ctx-&gt;buf) {</div><div class='del'>-                                free (ctx-&gt;buf);</div><div class='del'>-                                ctx-&gt;buf = NULL;</div><div class='del'>-                        }</div><div class='del'>-</div><div class='del'>-                        if (ctx-&gt;glusterfs_path) {</div><div class='del'>-                                buffer_free (ctx-&gt;glusterfs_path);</div><div class='del'>-                                ctx-&gt;glusterfs_path = NULL;</div><div class='del'>-                        }               </div><div class='del'>-                        free (ctx);</div><div class='del'>-                        con-&gt;plugin_ctx[p-&gt;id] = NULL;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                log_error_write(srv, __FILE__, __LINE__, "sbsb",</div><div class='del'>-                                "not a regular file:", con-&gt;uri.path,</div><div class='del'>-                                "-&gt;", con-&gt;physical.path);</div><div class='del'>-    </div><div class='del'>-                return HANDLER_FINISHED;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (con-&gt;uri.path-&gt;ptr[s_len] == '/' || !S_ISREG(sce-&gt;st.st_mode)) {</div><div class='del'>-                if (ctx) {</div><div class='del'>-                        if (ctx-&gt;glusterfs_path) {</div><div class='del'>-                                buffer_free (ctx-&gt;glusterfs_path);</div><div class='del'>-                                ctx-&gt;glusterfs_path = NULL;</div><div class='del'>-                        }</div><div class='del'>-</div><div class='del'>-                        free (ctx);</div><div class='del'>-                        con-&gt;plugin_ctx[p-&gt;id] = NULL;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                return HANDLER_FINISHED;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (p-&gt;conf.xattr_file_size &amp;&amp; p-&gt;conf.xattr_file_size-&gt;ptr)</div><div class='del'>-                size = atoi (p-&gt;conf.xattr_file_size-&gt;ptr);</div><div class='del'>-</div><div class='del'>-        if ((size_t)sce-&gt;st.st_size &gt; size) {</div><div class='del'>-    </div><div class='del'>-                fd = glusterfs_open ((libglusterfs_handle_t ) ((unsigned long)p-&gt;conf.handle), ctx-&gt;glusterfs_path-&gt;ptr, O_RDONLY, 0);</div><div class='del'>-    </div><div class='del'>-                if (!fd) {</div><div class='del'>-                        if (ctx) {</div><div class='del'>-                                if (ctx-&gt;glusterfs_path) {</div><div class='del'>-                                        buffer_free (ctx-&gt;glusterfs_path);</div><div class='del'>-                                        ctx-&gt;glusterfs_path = NULL;</div><div class='del'>-                                }</div><div class='del'>-</div><div class='del'>-                                free (ctx);</div><div class='del'>-                                con-&gt;plugin_ctx[p-&gt;id] = NULL;</div><div class='del'>-                        }</div><div class='del'>-</div><div class='del'>-                        con-&gt;http_status = 403;</div><div class='del'>-                        return HANDLER_FINISHED;</div><div class='del'>-                }</div><div class='del'>-                ctx-&gt;fd = fd;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        /* we only handline regular files */</div><div class='del'>-#ifdef HAVE_LSTAT</div><div class='del'>-        if ((sce-&gt;is_symlink == 1) &amp;&amp; !con-&gt;conf.follow_symlink) {</div><div class='del'>-                con-&gt;http_status = 403;</div><div class='del'>-          </div><div class='del'>-                if (con-&gt;conf.log_request_handling) {</div><div class='del'>-                        log_error_write(srv, __FILE__, __LINE__,  "s",  "-- access denied due symlink restriction");</div><div class='del'>-                        log_error_write(srv, __FILE__, __LINE__,  "sb", "Path         :", con-&gt;physical.path);</div><div class='del'>-                }</div><div class='del'>-    </div><div class='del'>-                buffer_reset(con-&gt;physical.path);</div><div class='del'>-                if (ctx) {</div><div class='del'>-                        if (ctx-&gt;glusterfs_path) {</div><div class='del'>-                                buffer_free (ctx-&gt;glusterfs_path);</div><div class='del'>-                                ctx-&gt;glusterfs_path = NULL;</div><div class='del'>-                        }</div><div class='del'>-</div><div class='del'>-                        free (ctx);</div><div class='del'>-                        con-&gt;plugin_ctx[p-&gt;id] = NULL;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                return HANDLER_FINISHED;</div><div class='del'>-        }</div><div class='del'>-#endif</div><div class='del'>-        if (!S_ISREG(sce-&gt;st.st_mode)) {</div><div class='del'>-                con-&gt;http_status = 404;</div><div class='del'>-    </div><div class='del'>-                if (con-&gt;conf.log_file_not_found) {</div><div class='del'>-                        log_error_write(srv, __FILE__, __LINE__, "sbsb",</div><div class='del'>-                                        "not a regular file:", con-&gt;uri.path,</div><div class='del'>-                                        "-&gt;", sce-&gt;name);</div><div class='del'>-                }</div><div class='del'>-    </div><div class='del'>-                if (ctx) {</div><div class='del'>-                        if (ctx-&gt;glusterfs_path) {</div><div class='del'>-                                buffer_free (ctx-&gt;glusterfs_path);</div><div class='del'>-                                ctx-&gt;glusterfs_path = NULL;</div><div class='del'>-                        }</div><div class='del'>-</div><div class='del'>-                        free (ctx);</div><div class='del'>-                        con-&gt;plugin_ctx[p-&gt;id] = NULL;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                return HANDLER_FINISHED;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        /* mod_compress might set several data directly, don't overwrite them */</div><div class='del'>-</div><div class='del'>-        /* set response content-type, if not set already */</div><div class='del'>-  </div><div class='del'>-        if (NULL == array_get_element(con-&gt;response.headers, CONST_STR_LEN("Content-Type"))) {</div><div class='del'>-                if (buffer_is_empty(sce-&gt;content_type)) {</div><div class='del'>-                        /* we are setting application/octet-stream, but also announce that</div><div class='del'>-                         * this header field might change in the seconds few requests </div><div class='del'>-                         *</div><div class='del'>-                         * This should fix the aggressive caching of FF and the script download</div><div class='del'>-                         * seen by the first installations</div><div class='del'>-                         */</div><div class='del'>-                        response_header_overwrite(srv, con, CONST_STR_LEN("Content-Type"), CONST_STR_LEN("application/octet-stream"));</div><div class='del'>-      </div><div class='del'>-                        allow_caching = 0;</div><div class='del'>-                } else {</div><div class='del'>-                        response_header_overwrite(srv, con, CONST_STR_LEN("Content-Type"), CONST_BUF_LEN(sce-&gt;content_type));</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='del'>-  </div><div class='del'>-        if (con-&gt;conf.range_requests) {</div><div class='del'>-                response_header_overwrite(srv, con, CONST_STR_LEN("Accept-Ranges"), CONST_STR_LEN("bytes"));</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        /* TODO: Allow Cachable requests */     </div><div class='del'>-#if 0</div><div class='del'>-        if (allow_caching) {</div><div class='del'>-                if (p-&gt;conf.etags_used &amp;&amp; con-&gt;etag_flags != 0 &amp;&amp; !buffer_is_empty(sce-&gt;etag)) {</div><div class='del'>-                        if (NULL == array_get_element(con-&gt;response.headers, "ETag")) {</div><div class='del'>-                                /* generate e-tag */</div><div class='del'>-                                etag_mutate(con-&gt;physical.etag, sce-&gt;etag);</div><div class='del'>-        </div><div class='del'>-                                response_header_overwrite(srv, con, CONST_STR_LEN("ETag"), CONST_BUF_LEN(con-&gt;physical.etag));</div><div class='del'>-                        }</div><div class='del'>-                }</div><div class='del'>-    </div><div class='del'>-                /* prepare header */</div><div class='del'>-                if (NULL == (ds = (data_string *)array_get_element(con-&gt;response.headers, "Last-Modified"))) {</div><div class='del'>-                        mtime = strftime_cache_get(srv, sce-&gt;st.st_mtime);</div><div class='del'>-                        response_header_overwrite(srv, con, CONST_STR_LEN("Last-Modified"), CONST_BUF_LEN(mtime));</div><div class='del'>-                } else {</div><div class='del'>-                        mtime = ds-&gt;value;</div><div class='del'>-                }</div><div class='del'>-    </div><div class='del'>-                if (HANDLER_FINISHED == http_response_handle_cachable(srv, con, mtime)) {</div><div class='del'>-                        if (ctx) {</div><div class='del'>-                                if (ctx-&gt;glusterfs_path) {</div><div class='del'>-                                        buffer_free (ctx-&gt;glusterfs_path);</div><div class='del'>-                                        ctx-&gt;glusterfs_path = NULL;</div><div class='del'>-                                }</div><div class='del'>-</div><div class='del'>-                                free (ctx);</div><div class='del'>-                                con-&gt;plugin_ctx[p-&gt;id] = NULL;</div><div class='del'>-                        }</div><div class='del'>-</div><div class='del'>-                        return HANDLER_FINISHED;</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='del'>-#endif </div><div class='del'>-  </div><div class='del'>-        /*TODO: Read about etags */</div><div class='del'>-        if (NULL != array_get_element(con-&gt;request.headers, CONST_STR_LEN("Range")) &amp;&amp; con-&gt;conf.range_requests) {</div><div class='del'>-                int do_range_request = 1;</div><div class='del'>-                data_string *ds = NULL;</div><div class='del'>-                buffer *mtime = NULL;</div><div class='del'>-                /* check if we have a conditional GET */</div><div class='del'>-    </div><div class='del'>-                /* prepare header */</div><div class='del'>-                if (NULL == (ds = (data_string *)array_get_element(con-&gt;response.headers, CONST_STR_LEN("Last-Modified")))) {</div><div class='del'>-                        mtime = strftime_cache_get(srv, sce-&gt;st.st_mtime);</div><div class='del'>-                        response_header_overwrite(srv, con, CONST_STR_LEN("Last-Modified"), CONST_BUF_LEN(mtime));</div><div class='del'>-                } else {</div><div class='del'>-                        mtime = ds-&gt;value;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                if (NULL != (ds = (data_string *)array_get_element(con-&gt;request.headers, CONST_STR_LEN("If-Range")))) {</div><div class='del'>-                        /* if the value is the same as our ETag, we do a Range-request,</div><div class='del'>-                         * otherwise a full 200 */</div><div class='del'>-            </div><div class='del'>-                        if (ds-&gt;value-&gt;ptr[0] == '"') {</div><div class='del'>-                                /**</div><div class='del'>-                                 * client wants a ETag</div><div class='del'>-                                 */</div><div class='del'>-                                if (!con-&gt;physical.etag) {</div><div class='del'>-                                        do_range_request = 0;</div><div class='del'>-                                } else if (!buffer_is_equal(ds-&gt;value, con-&gt;physical.etag)) {</div><div class='del'>-                                        do_range_request = 0;</div><div class='del'>-                                }</div><div class='del'>-                        } else if (!mtime) {</div><div class='del'>-                                /**</div><div class='del'>-                                 * we don't have a Last-Modified and can match the If-Range: </div><div class='del'>-                                 *</div><div class='del'>-                                 * sending all</div><div class='del'>-                                 */</div><div class='del'>-                                do_range_request = 0;</div><div class='del'>-                        } else if (!buffer_is_equal(ds-&gt;value, mtime)) {</div><div class='del'>-                                do_range_request = 0;</div><div class='del'>-                        }</div><div class='del'>-                }</div><div class='del'>-    </div><div class='del'>-                if (do_range_request) {</div><div class='del'>-                        /* content prepared, I'm done */</div><div class='del'>-                        con-&gt;send-&gt;is_closed = 1; </div><div class='del'>-            </div><div class='del'>-                        if (0 == http_response_parse_range(srv, con, p)) {</div><div class='del'>-                                con-&gt;http_status = 206;</div><div class='del'>-                        }</div><div class='del'>-                        if (ctx) {</div><div class='del'>-                                if (ctx-&gt;glusterfs_path) {</div><div class='del'>-                                        buffer_free (ctx-&gt;glusterfs_path);</div><div class='del'>-                                        ctx-&gt;glusterfs_path = NULL;</div><div class='del'>-                                }</div><div class='del'>-                                free (ctx);</div><div class='del'>-                                con-&gt;plugin_ctx[p-&gt;id] = NULL;</div><div class='del'>-                        }</div><div class='del'>-</div><div class='del'>-                        return HANDLER_FINISHED;</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='del'>-  </div><div class='del'>-        /* if we are still here, prepare body */</div><div class='del'>-</div><div class='del'>-        /* we add it here for all requests</div><div class='del'>-         * the HEAD request will drop it afterwards again</div><div class='del'>-         */</div><div class='del'>-</div><div class='del'>-        if (p-&gt;conf.xattr_file_size &amp;&amp; p-&gt;conf.xattr_file_size-&gt;ptr)</div><div class='del'>-                size = atoi (p-&gt;conf.xattr_file_size-&gt;ptr);</div><div class='del'>-</div><div class='del'>-        if (size &lt; (size_t)sce-&gt;st.st_size) {</div><div class='del'>-                chunkqueue_append_glusterfs_file (con-&gt;send_raw, fd, 0, sce-&gt;st.st_size);</div><div class='del'>-                con-&gt;send_raw-&gt;bytes_in += sce-&gt;st.st_size;</div><div class='del'>-                chunkqueue_append_dummy_mem_chunk (con-&gt;send, sce-&gt;st.st_size);</div><div class='del'>-        } else {</div><div class='del'>-                if (!ctx-&gt;buf) {</div><div class='del'>-                        con-&gt;http_status = 404;</div><div class='del'>-                        return HANDLER_ERROR;</div><div class='del'>-                }</div><div class='del'>-                chunkqueue_append_glusterfs_mem (con-&gt;send, ctx-&gt;buf, sce-&gt;st.st_size);</div><div class='del'>-                ctx-&gt;buf = NULL;</div><div class='del'>-        }</div><div class='del'>-        ctx-&gt;response_content_length = con-&gt;response.content_length = sce-&gt;st.st_size;</div><div class='del'>-  </div><div class='del'>-        con-&gt;send-&gt;is_closed = 1;</div><div class='del'>-        con-&gt;send-&gt;bytes_in = sce-&gt;st.st_size;</div><div class='del'>-</div><div class='del'>-        return HANDLER_FINISHED;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-/* this function is called at dlopen() time and inits the callbacks */</div><div class='del'>-CONNECTION_FUNC(mod_glusterfs_connection_reset) </div><div class='del'>-{</div><div class='del'>-        (void) p_d;</div><div class='del'>-        (void) con;</div><div class='del'>-        if (!network_backend_write)</div><div class='del'>-                network_backend_write = srv-&gt;network_backend_write;</div><div class='del'>-</div><div class='del'>-        srv-&gt;network_backend_write = mod_glusterfs_network_backend_write;</div><div class='del'>-</div><div class='del'>-        return HANDLER_GO_ON;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-URIHANDLER_FUNC(mod_glusterfs_response_done) {</div><div class='del'>-        plugin_data *p = p_d;</div><div class='del'>-        UNUSED (srv);</div><div class='del'>-        mod_glusterfs_ctx_t *ctx = con-&gt;plugin_ctx[p-&gt;id];</div><div class='del'>-        </div><div class='del'>-        con-&gt;plugin_ctx[p-&gt;id] = NULL;</div><div class='del'>-        if (ctx-&gt;glusterfs_path) {</div><div class='del'>-                free (ctx-&gt;glusterfs_path);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        free (ctx);</div><div class='del'>-        return HANDLER_GO_ON;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int mod_glusterfs_plugin_init(plugin *p) {</div><div class='del'>-        p-&gt;version     = LIGHTTPD_VERSION_ID;</div><div class='del'>-        p-&gt;name        = buffer_init_string("glusterfs");</div><div class='del'>-        p-&gt;init        = mod_glusterfs_init;</div><div class='del'>-        p-&gt;handle_physical = mod_glusterfs_handle_physical;</div><div class='del'>-        p-&gt;handle_start_backend = mod_glusterfs_subrequest;</div><div class='del'>-        p-&gt;handle_response_done = mod_glusterfs_response_done;</div><div class='del'>-        p-&gt;set_defaults  = mod_glusterfs_set_defaults;</div><div class='del'>-        p-&gt;connection_reset = mod_glusterfs_connection_reset;</div><div class='del'>-        p-&gt;cleanup     = mod_glusterfs_free;</div><div class='del'>-  </div><div class='del'>-        p-&gt;data        = NULL;</div><div class='del'>-  </div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='head'>diff --git a/mod_glusterfs/lighttpd/1.5/mod_glusterfs.h b/mod_glusterfs/lighttpd/1.5/mod_glusterfs.h<br/>deleted file mode 100644<br/>index 92703af06a5..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/mod_glusterfs/lighttpd/1.5/mod_glusterfs.h?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>mod_glusterfs/lighttpd/1.5/mod_glusterfs.h</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,29 +0,0 @@</div><div class='del'>-/*</div><div class='del'>-   Copyright (c) 2008-2009 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='del'>-   This file is part of GlusterFS.</div><div class='del'>-</div><div class='del'>-   GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-   it under the terms of the GNU General Public License as published</div><div class='del'>-   by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-   or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-   GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-   WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-   General Public License for more details.</div><div class='del'>-</div><div class='del'>-   You should have received a copy of the GNU General Public License</div><div class='del'>-   along with this program.  If not, see</div><div class='del'>-   &lt;http://www.gnu.org/licenses/&gt;.</div><div class='del'>-*/</div><div class='del'>-</div><div class='del'>-#ifndef _MOD_GLUSTERFS_FILE_CACHE_H_</div><div class='del'>-#define _MOD_GLUSTERFS_FILE_CACHE_H_</div><div class='del'>-</div><div class='del'>-#include "stat_cache.h"</div><div class='del'>-#include &lt;libglusterfsclient.h&gt;</div><div class='del'>-#include "base.h"</div><div class='del'>-</div><div class='del'>-handler_t glusterfs_stat_cache_get_entry(server *srv, connection *con, libglusterfs_handle_t handle, buffer *glusterfs_path, buffer *name, void *buf, size_t size, stat_cache_entry **fce);</div><div class='del'>-</div><div class='del'>-#endif</div><div class='head'>diff --git a/mod_glusterfs/lighttpd/Makefile.am b/mod_glusterfs/lighttpd/Makefile.am<br/>deleted file mode 100644<br/>index c934412b3dc..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/mod_glusterfs/lighttpd/Makefile.am?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>mod_glusterfs/lighttpd/Makefile.am</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,3 +0,0 @@</div><div class='del'>-SUBDIRS = 1.4 1.5</div><div class='del'>-</div><div class='del'>-CLEANFILES = </div><div class='head'>diff --git a/rfc.sh b/rfc.sh<br/>new file mode 100755<br/>index 00000000000..e7faec9ea0f<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/rfc.sh?id=d1d7a6f35c816822fab51c820e25023863c239c1'>rfc.sh</a></div><div class='hunk'>@@ -0,0 +1,330 @@</div><div class='add'>+#!/bin/sh -e</div><div class='add'>+# Since we run with '#!/bin/sh -e'</div><div class='add'>+#   '$? != 0' will force an exit,</div><div class='add'>+# i.e. where we are interested in the result of a command,</div><div class='add'>+# we have to run the command in an if-statement.</div><div class='add'>+</div><div class='add'>+UPSTREAM=${GLUSTER_UPSTREAM}</div><div class='add'>+if [ "x$UPSTREAM" -eq "x" ]; then</div><div class='add'>+    for rmt in $(git remote); do</div><div class='add'>+	rmt_repo=$(git remote show $rmt -n | grep Fetch | awk '{ print $3 }');</div><div class='add'>+	if [ $rmt_repo -eq "git@github:gluster/glusterfs" ]; then</div><div class='add'>+	    UPSTREAM=$rmt</div><div class='add'>+	    echo "Picked $rmt as upstream remote"</div><div class='add'>+	    break</div><div class='add'>+	fi</div><div class='add'>+    done</div><div class='add'>+fi</div><div class='add'>+</div><div class='add'>+USER_REPO=${GLUSTER_USER_REPO:-origin}</div><div class='add'>+if [ "x${USER_REPO}" -eq "x${UPSTREAM}" ] ; then</div><div class='add'>+    echo "When you submit patches, it should get submitted to your fork, not to upstream directly"</div><div class='add'>+    echo "If you are not sure, check `for rmt in $(git remote); do git remote show $rmt -n; done`"</div><div class='add'>+    echo "And pick the correct remote you would like to push to and do `export GLUSTER_USER_REPO=$rmt`"</div><div class='add'>+    echo ""</div><div class='add'>+    echo "Exiting..."</div><div class='add'>+    exit 1</div><div class='add'>+fi</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+while getopts "v" opt; do</div><div class='add'>+    case $opt in</div><div class='add'>+        v)</div><div class='add'>+            # Verbose mode</div><div class='add'>+            git () { &gt;&amp;2 echo "git $@" &amp;&amp; `which git` $@; }</div><div class='add'>+            ;;</div><div class='add'>+    esac</div><div class='add'>+done</div><div class='add'>+# Move the positional arguments to the beginning</div><div class='add'>+shift $((OPTIND-1))</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+branch="devel";</div><div class='add'>+</div><div class='add'>+set_hooks_commit_msg()</div><div class='add'>+{</div><div class='add'>+    f=".git/hooks/commit-msg";</div><div class='add'>+    u="http://review.gluster.org/tools/hooks/commit-msg";</div><div class='add'>+</div><div class='add'>+    if [ -x "$f" ]; then</div><div class='add'>+        return;</div><div class='add'>+    fi</div><div class='add'>+</div><div class='add'>+    curl -L -o $f $u || wget -O $f $u;</div><div class='add'>+</div><div class='add'>+    chmod +x $f</div><div class='add'>+</div><div class='add'>+    # Let the 'Change-Id: ' header get assigned on first run of rfc.sh</div><div class='add'>+    GIT_EDITOR=true git commit --amend;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+is_num()</div><div class='add'>+{</div><div class='add'>+    local num;</div><div class='add'>+</div><div class='add'>+    num="$1";</div><div class='add'>+</div><div class='add'>+    [ -z "$(echo $num | sed -e 's/[0-9]//g')" ]</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+backport_id_message()</div><div class='add'>+{</div><div class='add'>+    echo ""</div><div class='add'>+    echo "This commit is to a non-devel branch, and hence is treated as a backport."</div><div class='add'>+    echo ""</div><div class='add'>+    echo "For backports we would like to retain the same gerrit Change-Id across"</div><div class='add'>+    echo "branches. On auto inspection it is found that a gerrit Change-Id is"</div><div class='add'>+    echo "missing, or the Change-Id is not found on your local devel branch"</div><div class='add'>+    echo ""</div><div class='add'>+    echo "This could mean a few things:"</div><div class='add'>+    echo "    1. This is not a backport, hence choose Y on the prompt to proceed"</div><div class='add'>+    echo "    2. Your $USER_REPO/devel is not up to date, hence the script is unable"</div><div class='add'>+    echo "       to find the corresponding Change-Id on devel. Either choose N,"</div><div class='add'>+    echo "       'git fetch', and try again, OR if you are sure you used the"</div><div class='add'>+    echo "       same Change-Id, choose Y at the prompt to proceed"</div><div class='add'>+    echo "    3. You commented or removed the Change-Id in your commit message after"</div><div class='add'>+    echo "       cherry picking the commit. Choose N, fix the commit message to"</div><div class='add'>+    echo "       use the same Change-Id as 'devel' (git commit --amend), resubmit"</div><div class='add'>+    echo ""</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+check_backport()</div><div class='add'>+{</div><div class='add'>+    moveon='N'</div><div class='add'>+</div><div class='add'>+    # Backports are never made to 'devel'</div><div class='add'>+    if [ $branch = "devel" ]; then</div><div class='add'>+        return;</div><div class='add'>+    fi</div><div class='add'>+</div><div class='add'>+    # Extract the change ID from the commit message</div><div class='add'>+    changeid=$(git log -n1 --format='%b' | grep -i '^Change-Id: ' | awk '{print $2}')</div><div class='add'>+</div><div class='add'>+    # If there is no change ID ask if we should continue</div><div class='add'>+    if [ -z "$changeid" ]; then</div><div class='add'>+        backport_id_message;</div><div class='add'>+        echo -n "Did not find a Change-Id for a possible backport. Continue (y/N): "</div><div class='add'>+        read moveon</div><div class='add'>+    else</div><div class='add'>+        # Search 'devel' for the same change ID (rebase_changes has run, so we</div><div class='add'>+        # should never not find a Change-Id)</div><div class='add'>+        mchangeid=$(git log $UPSTREAM/devel --format='%b' --grep="^Change-Id: ${changeid}" | grep ${changeid} | awk '{print $2}')</div><div class='add'>+</div><div class='add'>+        # Check if we found the change ID on 'devel', else throw a message to</div><div class='add'>+        # decide if we should continue.</div><div class='add'>+        # NOTE: If 'devel' was not rebased, we will not find the Change-ID and</div><div class='add'>+        # could hit a false positive case here (or if someone checks out some</div><div class='add'>+        # other branch as 'devel').</div><div class='add'>+        if [ "${mchangeid}" = "${changeid}" ]; then</div><div class='add'>+            moveon="Y"</div><div class='add'>+        else</div><div class='add'>+            backport_id_message;</div><div class='add'>+            echo "Change-Id of commit: $changeid"</div><div class='add'>+            echo "Change-Id on devel: $mchangeid"</div><div class='add'>+            echo -n "Did not find mentioned Change-Id on 'devel' for a possible backport. Continue (y/N): "</div><div class='add'>+            read moveon</div><div class='add'>+        fi</div><div class='add'>+    fi</div><div class='add'>+</div><div class='add'>+    if [ "${moveon}" = 'Y' ] || [ "${moveon}" = 'y' ]; then</div><div class='add'>+        return;</div><div class='add'>+    else</div><div class='add'>+        exit 1</div><div class='add'>+    fi</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+rebase_changes()</div><div class='add'>+{</div><div class='add'>+    GIT_EDITOR=$0 git rebase -i $UPSTREAM/$branch;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+# Regex elaborated:</div><div class='add'>+#   grep options:</div><div class='add'>+#     -w -&gt; --word-regexp (from the man page)</div><div class='add'>+#        Select only those lines containing matches that form whole words.</div><div class='add'>+#        The test is that the matching substring must either be at the</div><div class='add'>+#        beginning of the line, or preceded by a  non-word  constituent</div><div class='add'>+#        character.  Similarly, it must be either at the end of the line or</div><div class='add'>+#        followed by a non-word constituent character.  Word-constituent</div><div class='add'>+#        characters are letters, digits, and the underscore.</div><div class='add'>+#</div><div class='add'>+#        IOW, the above helps us find the pattern with leading or training</div><div class='add'>+#        spaces or non word consituents like , or ;</div><div class='add'>+#</div><div class='add'>+#     -i -&gt; --ignore-case (case insensitive search)</div><div class='add'>+#</div><div class='add'>+#     -o -&gt; --only-matching (only print matching portion of the line)</div><div class='add'>+#</div><div class='add'>+#     -E -&gt; --extended-regexp (use extended regular expression)</div><div class='add'>+#</div><div class='add'>+#   ^</div><div class='add'>+#      The search begins at the start of each line</div><div class='add'>+#</div><div class='add'>+#   [[:space:]]*</div><div class='add'>+#      Any number of spaces is accepted</div><div class='add'>+#</div><div class='add'>+#   (Fixes|Updates)</div><div class='add'>+#      Finds 'Fixes' OR 'Updates' in any case combination</div><div class='add'>+#</div><div class='add'>+#   (:)?</div><div class='add'>+#      Followed by an optional : (colon)</div><div class='add'>+#</div><div class='add'>+#   [[:space:]]+</div><div class='add'>+#      Followed by 1 or more spaces</div><div class='add'>+#</div><div class='add'>+#   #</div><div class='add'>+#      Followed by #</div><div class='add'>+#</div><div class='add'>+#   [[:digit:]]+</div><div class='add'>+#      Followed by 1 or more digits</div><div class='add'>+REFRE="^[[:space:]]*(Fixes|Updates)(:)?[[:space:]]+#[[:digit:]]+"</div><div class='add'>+</div><div class='add'>+editor_mode()</div><div class='add'>+{</div><div class='add'>+    if [ $(basename "$1") = "git-rebase-todo" ]; then</div><div class='add'>+        sed 's/^pick /reword /g' "$1" &gt; $1.new &amp;&amp; mv $1.new $1;</div><div class='add'>+        return;</div><div class='add'>+    fi</div><div class='add'>+</div><div class='add'>+    if [ $(basename "$1") = "COMMIT_EDITMSG" ]; then</div><div class='add'>+        # see note above function warn_reference_missing for regex elaboration</div><div class='add'>+        # Lets first check for github issues</div><div class='add'>+        ref=$(git log -n1 --format='%b' | grep -iow -E "${REFRE}" | awk -F '#' '{print $2}');</div><div class='add'>+        if [ "x${ref}" != "x" ]; then</div><div class='add'>+            return;</div><div class='add'>+        fi</div><div class='add'>+</div><div class='add'>+        while true; do</div><div class='add'>+            echo Commit: "\"$(head -n 1 $1)\""</div><div class='add'>+            echo -n "Github Issue ID: "</div><div class='add'>+            read issue</div><div class='add'>+            if [ -z "$issue" ]; then</div><div class='add'>+                return;</div><div class='add'>+            fi</div><div class='add'>+            if ! is_num "$issue"; then</div><div class='add'>+                echo "Invalid Github Issue ID!!!";</div><div class='add'>+                continue;</div><div class='add'>+            fi</div><div class='add'>+</div><div class='add'>+            echo "Select yes '(y)' if this patch fixes the issue/feature completely,"</div><div class='add'>+            echo -n "or is the last of the patchset which brings feature (Y/n): "</div><div class='add'>+            read fixes</div><div class='add'>+            fixes_string="Fixes"</div><div class='add'>+            if [ "${fixes}" = 'N' ] || [ "${fixes}" = 'n' ]; then</div><div class='add'>+                fixes_string="Updates"</div><div class='add'>+            fi</div><div class='add'>+</div><div class='add'>+            sed "/^Change-Id:/{p; s/^.*$/${fixes_string}: #${issue}/;}" $1 &gt; $1.new &amp;&amp; \</div><div class='add'>+                mv $1.new $1;</div><div class='add'>+            return;</div><div class='add'>+        done</div><div class='add'>+    fi</div><div class='add'>+</div><div class='add'>+    cat &lt;&lt;EOF</div><div class='add'>+$0 - editor_mode called on unrecognized file $1 with content:</div><div class='add'>+$(cat $1)</div><div class='add'>+EOF</div><div class='add'>+    return 1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+assert_diverge()</div><div class='add'>+{</div><div class='add'>+    git diff $UPSTREAM/$branch..HEAD | grep -q .;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+warn_reference_missing()</div><div class='add'>+{</div><div class='add'>+    echo ""</div><div class='add'>+    echo "=== Missing a reference in commit! ==="</div><div class='add'>+    echo ""</div><div class='add'>+    echo "Gluster commits are made with a reference to a github issue"</div><div class='add'>+    echo ""</div><div class='add'>+    echo "A check on the commit message, reveals that there is no "</div><div class='add'>+    echo "github issue referenced in the commit message."</div><div class='add'>+    echo ""</div><div class='add'>+    echo "https://github.com/gluster/glusterfs/issues/new"</div><div class='add'>+    echo ""</div><div class='add'>+    echo "Please open an issue and reference the same in the commit message "</div><div class='add'>+    echo "using the following tags:"</div><div class='add'>+    echo ""</div><div class='add'>+    echo "\"Fixes: #NNNN\" OR \"Updates: #NNNN\","</div><div class='add'>+    echo "where NNNN is the issue id"</div><div class='add'>+    echo ""</div><div class='add'>+    echo "You may abort the submission choosing 'N' below and use"</div><div class='add'>+    echo "'git commit --amend' to add the issue reference before posting"</div><div class='add'>+    echo "to gerrit."</div><div class='add'>+    echo ""</div><div class='add'>+    echo -n "Missing reference to a github issue. Continue (y/N): "</div><div class='add'>+    read moveon</div><div class='add'>+    if [ "${moveon}" = 'Y' ] || [ "${moveon}" = 'y' ]; then</div><div class='add'>+        return;</div><div class='add'>+    else</div><div class='add'>+        exit 1</div><div class='add'>+    fi</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+main()</div><div class='add'>+{</div><div class='add'>+    set_hooks_commit_msg;</div><div class='add'>+</div><div class='add'>+    # rfc.sh calls itself from rebase_changes, which uses rfc.sh as the EDITOR</div><div class='add'>+    # thus, getting the commit message to work with in the editor_mode.</div><div class='add'>+    if [ -e "$1" ]; then</div><div class='add'>+        editor_mode "$@";</div><div class='add'>+        return;</div><div class='add'>+    fi</div><div class='add'>+</div><div class='add'>+    git fetch $UPSTREAM;</div><div class='add'>+</div><div class='add'>+    rebase_changes;</div><div class='add'>+</div><div class='add'>+    check_backport;</div><div class='add'>+</div><div class='add'>+    assert_diverge;</div><div class='add'>+</div><div class='add'>+    # see note above variable REFRE for regex elaboration</div><div class='add'>+    reference=$(git log -n1 --format='%b' | grep -iow -E "${REFRE}" | awk -F '#' '{print $2}');</div><div class='add'>+</div><div class='add'>+    # If this is a commit against 'devel' and does not have a github</div><div class='add'>+    # issue reference. Warn the contributor that one of the 2 is required</div><div class='add'>+    if [ -z "${reference}" ] &amp;&amp; [ $branch = "devel" ]; then</div><div class='add'>+        warn_reference_missing;</div><div class='add'>+    fi</div><div class='add'>+</div><div class='add'>+    # TODO: add clang-format command here. It will after the changes are done everywhere else</div><div class='add'>+    clang_format=$(clang-format --version)</div><div class='add'>+    if [ ! -z "${clang_format}" ]; then</div><div class='add'>+        # Considering git show may not give any files as output matching the</div><div class='add'>+        # criteria, good to tell script not to fail on error</div><div class='add'>+        set +e</div><div class='add'>+        list_of_files=$(git show --pretty="format:" --name-only |</div><div class='add'>+                            grep -v "contrib/" | egrep --color=never "*\.[ch]$");</div><div class='add'>+        if [ ! -z "${list_of_files}" ]; then</div><div class='add'>+            echo "${list_of_files}" | xargs clang-format -i</div><div class='add'>+        fi</div><div class='add'>+        set -e</div><div class='add'>+    else</div><div class='add'>+        echo "High probability of your patch not passing smoke due to coding standard check"</div><div class='add'>+        echo "Please install 'clang-format' to format the patch before submitting"</div><div class='add'>+    fi</div><div class='add'>+</div><div class='add'>+    if [ "$DRY_RUN" = 1 ]; then</div><div class='add'>+        drier='echo -e Please use the following command to send your commits to review:\n\n'</div><div class='add'>+    else</div><div class='add'>+        drier=</div><div class='add'>+    fi</div><div class='add'>+</div><div class='add'>+    if [ -z "${reference}" ]; then</div><div class='add'>+        $drier git push $USER_REPO HEAD:temp_${branch}/$(date +%Y-%m-%d_%s);</div><div class='add'>+    else</div><div class='add'>+        $drier git push $USER_REPO HEAD:issue${reference}_${branch};</div><div class='add'>+    fi</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+main "$@"</div><div class='head'>diff --git a/rpc/Makefile.am b/rpc/Makefile.am<br/>index ffb76e901fc..183b7a0352f 100644<br/>--- a/<a href='/cgit/glusterfs.git/tree/rpc/Makefile.am?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>rpc/Makefile.am</a><br/>+++ b/<a href='/cgit/glusterfs.git/tree/rpc/Makefile.am?id=d1d7a6f35c816822fab51c820e25023863c239c1'>rpc/Makefile.am</a></div><div class='hunk'>@@ -1 +1 @@</div><div class='del'>-SUBDIRS = rpc-lib rpc-transport xdr</div><div class='add'>+SUBDIRS = xdr rpc-lib rpc-transport</div><div class='head'>diff --git a/rpc/rpc-lib/src/Makefile.am b/rpc/rpc-lib/src/Makefile.am<br/>index 9e37797bd1a..35c9db07e7f 100644<br/>--- a/<a href='/cgit/glusterfs.git/tree/rpc/rpc-lib/src/Makefile.am?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>rpc/rpc-lib/src/Makefile.am</a><br/>+++ b/<a href='/cgit/glusterfs.git/tree/rpc/rpc-lib/src/Makefile.am?id=d1d7a6f35c816822fab51c820e25023863c239c1'>rpc/rpc-lib/src/Makefile.am</a></div><div class='hunk'>@@ -1,17 +1,29 @@</div><div class='ctx'> lib_LTLIBRARIES = libgfrpc.la</div><div class='del'>-libgfrpc_la_LDFLAGS = -module -avoidversion</div><div class='ctx'> </div><div class='ctx'> libgfrpc_la_SOURCES = auth-unix.c rpcsvc-auth.c rpcsvc.c auth-null.c \</div><div class='ctx'> 	rpc-transport.c xdr-rpc.c xdr-rpcclnt.c rpc-clnt.c auth-glusterfs.c \</div><div class='del'>-	rpc-common.c</div><div class='del'>-libgfrpc_la_LIBADD = $(top_builddir)/libglusterfs/src/libglusterfs.la</div><div class='add'>+	rpc-drc.c rpc-clnt-ping.c \</div><div class='add'>+        autoscale-threads.c mgmt-pmap.c</div><div class='ctx'> </div><div class='del'>-noinst_HEADERS = rpcsvc.h rpc-transport.h xdr-common.h xdr-rpc.h xdr-rpcclnt.h \</div><div class='del'>-	rpc-clnt.h rpcsvc-common.h protocol-common.h</div><div class='add'>+EXTRA_DIST = libgfrpc.sym</div><div class='ctx'> </div><div class='del'>-AM_CFLAGS = -fPIC -D_FILE_OFFSET_BITS=64 -D_GNU_SOURCE -Wall -D$(GF_HOST_OS)\</div><div class='del'>-	-I$(top_srcdir)/libglusterfs/src -shared -nostartfiles $(GF_CFLAGS) \</div><div class='add'>+libgfrpc_la_LIBADD = $(top_builddir)/libglusterfs/src/libglusterfs.la \</div><div class='add'>+                     $(top_builddir)/rpc/xdr/src/libgfxdr.la</div><div class='add'>+libgfrpc_la_LDFLAGS = -version-info $(LIBGFRPC_LT_VERSION) $(GF_LDFLAGS) \</div><div class='add'>+		      -export-symbols $(top_srcdir)/rpc/rpc-lib/src/libgfrpc.sym</div><div class='add'>+</div><div class='add'>+libgfrpc_la_HEADERS = rpcsvc.h rpc-transport.h xdr-common.h xdr-rpc.h xdr-rpcclnt.h \</div><div class='add'>+	rpc-clnt.h rpcsvc-common.h protocol-common.h rpc-drc.h rpc-clnt-ping.h \</div><div class='add'>+	rpc-lib-messages.h</div><div class='add'>+</div><div class='add'>+libgfrpc_ladir = $(includedir)/glusterfs/rpc</div><div class='add'>+</div><div class='add'>+AM_CPPFLAGS = $(GF_CPPFLAGS) -I$(top_srcdir)/libglusterfs/src \</div><div class='ctx'> 	-I$(top_srcdir)/rpc/xdr/src \</div><div class='del'>-	-DRPC_TRANSPORTDIR=\"$(libdir)/glusterfs/$(PACKAGE_VERSION)/rpc-transport\"</div><div class='add'>+	-I$(top_builddir)/rpc/xdr/src \</div><div class='add'>+	-DRPC_TRANSPORTDIR=\"$(libdir)/glusterfs/$(PACKAGE_VERSION)/rpc-transport\" \</div><div class='add'>+	-I$(top_srcdir)/contrib/rbtree</div><div class='add'>+</div><div class='add'>+AM_CFLAGS = -Wall $(GF_CFLAGS)</div><div class='ctx'> </div><div class='ctx'> CLEANFILES = *~</div><div class='head'>diff --git a/rpc/rpc-lib/src/auth-glusterfs.c b/rpc/rpc-lib/src/auth-glusterfs.c<br/>index 459cad87791..69a96f7512f 100644<br/>--- a/<a href='/cgit/glusterfs.git/tree/rpc/rpc-lib/src/auth-glusterfs.c?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>rpc/rpc-lib/src/auth-glusterfs.c</a><br/>+++ b/<a href='/cgit/glusterfs.git/tree/rpc/rpc-lib/src/auth-glusterfs.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>rpc/rpc-lib/src/auth-glusterfs.c</a></div><div class='hunk'>@@ -1,200 +1,386 @@</div><div class='ctx'> /*</div><div class='del'>-  Copyright (c) 2010 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='add'>+  Copyright (c) 2008-2012 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='ctx'>   This file is part of GlusterFS.</div><div class='ctx'> </div><div class='del'>-  GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-  it under the terms of the GNU Affero General Public License as published</div><div class='del'>-  by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-  or (at your option) any later version.</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='ctx'> </div><div class='del'>-  GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-  WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-  Affero General Public License for more details.</div><div class='add'>+#include "rpcsvc.h"</div><div class='add'>+#include &lt;glusterfs/dict.h&gt;</div><div class='add'>+#include "xdr-rpc.h"</div><div class='add'>+#include "xdr-common.h"</div><div class='add'>+#include "rpc-common-xdr.h"</div><div class='add'>+#include "glusterfs4-xdr.h"</div><div class='ctx'> </div><div class='del'>-  You should have received a copy of the GNU Affero General Public License</div><div class='del'>-  along with this program.  If not, see</div><div class='del'>-  &lt;http://www.gnu.org/licenses/&gt;.</div><div class='del'>-*/</div><div class='add'>+/* V1 */</div><div class='ctx'> </div><div class='add'>+ssize_t</div><div class='add'>+xdr_to_glusterfs_auth(char *buf, struct auth_glusterfs_parms *req)</div><div class='add'>+{</div><div class='add'>+    XDR xdr;</div><div class='add'>+    ssize_t ret = -1;</div><div class='ctx'> </div><div class='add'>+    if ((!buf) || (!req))</div><div class='add'>+        return -1;</div><div class='ctx'> </div><div class='del'>-#ifndef _CONFIG_H</div><div class='del'>-#define _CONFIG_H</div><div class='del'>-#include "config.h"</div><div class='del'>-#endif</div><div class='add'>+    xdrmem_create(&amp;xdr, buf, sizeof(struct auth_glusterfs_parms), XDR_DECODE);</div><div class='add'>+    if (!xdr_auth_glusterfs_parms(&amp;xdr, req)) {</div><div class='add'>+        gf_log("", GF_LOG_WARNING, "failed to decode glusterfs parameters");</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto ret;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-#include "rpcsvc.h"</div><div class='del'>-#include "list.h"</div><div class='del'>-#include "dict.h"</div><div class='del'>-#include "xdr-rpc.h"</div><div class='del'>-#include "xdr-common.h"</div><div class='add'>+    ret = (((size_t)(&amp;xdr)-&gt;x_private) - ((size_t)(&amp;xdr)-&gt;x_base));</div><div class='add'>+ret:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+int</div><div class='add'>+auth_glusterfs_request_init(rpcsvc_request_t *req, void *priv)</div><div class='add'>+{</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+auth_glusterfs_authenticate(rpcsvc_request_t *req, void *priv)</div><div class='add'>+{</div><div class='add'>+    struct auth_glusterfs_parms au = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    int ret = RPCSVC_AUTH_REJECT;</div><div class='add'>+    int j = 0;</div><div class='add'>+    int i = 0;</div><div class='add'>+    int gidcount = 0;</div><div class='add'>+</div><div class='add'>+    if (!req)</div><div class='add'>+        return ret;</div><div class='add'>+</div><div class='add'>+    ret = xdr_to_glusterfs_auth(req-&gt;cred.authdata, &amp;au);</div><div class='add'>+    if (ret == -1) {</div><div class='add'>+        gf_log("", GF_LOG_WARNING, "failed to decode glusterfs credentials");</div><div class='add'>+        ret = RPCSVC_AUTH_REJECT;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-bool_t</div><div class='del'>-xdr_auth_glusterfs_parms (XDR *xdrs, auth_glusterfs_parms *objp)</div><div class='add'>+    req-&gt;pid = au.pid;</div><div class='add'>+    req-&gt;uid = au.uid;</div><div class='add'>+    req-&gt;gid = au.gid;</div><div class='add'>+    req-&gt;lk_owner.len = 8;</div><div class='add'>+    {</div><div class='add'>+        for (i = 0; i &lt; req-&gt;lk_owner.len; i++, j += 8)</div><div class='add'>+            req-&gt;lk_owner.data[i] = (char)((au.lk_owner &gt;&gt; j) &amp; 0xff);</div><div class='add'>+    }</div><div class='add'>+    req-&gt;auxgidcount = au.ngrps;</div><div class='add'>+</div><div class='add'>+    if (req-&gt;auxgidcount &gt; 16) {</div><div class='add'>+        gf_log("", GF_LOG_WARNING,</div><div class='add'>+               "more than 16 aux gids found, failing authentication");</div><div class='add'>+        ret = RPCSVC_AUTH_REJECT;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (req-&gt;auxgidcount &gt; SMALL_GROUP_COUNT) {</div><div class='add'>+        req-&gt;auxgidlarge = GF_CALLOC(req-&gt;auxgidcount, sizeof(req-&gt;auxgids[0]),</div><div class='add'>+                                     gf_common_mt_auxgids);</div><div class='add'>+        req-&gt;auxgids = req-&gt;auxgidlarge;</div><div class='add'>+    } else {</div><div class='add'>+        req-&gt;auxgids = req-&gt;auxgidsmall;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (!req-&gt;auxgids) {</div><div class='add'>+        gf_log("auth-glusterfs", GF_LOG_WARNING, "cannot allocate gid list");</div><div class='add'>+        ret = RPCSVC_AUTH_REJECT;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    for (gidcount = 0; gidcount &lt; au.ngrps; ++gidcount)</div><div class='add'>+        req-&gt;auxgids[gidcount] = au.groups[gidcount];</div><div class='add'>+</div><div class='add'>+    gf_log(GF_RPCSVC, GF_LOG_TRACE,</div><div class='add'>+           "Auth Info: pid: %u, uid: %d"</div><div class='add'>+           ", gid: %d, owner: %s",</div><div class='add'>+           req-&gt;pid, req-&gt;uid, req-&gt;gid, lkowner_utoa(&amp;req-&gt;lk_owner));</div><div class='add'>+    ret = RPCSVC_AUTH_ACCEPT;</div><div class='add'>+err:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+rpcsvc_auth_ops_t auth_glusterfs_ops = {</div><div class='add'>+    .transport_init = NULL,</div><div class='add'>+    .request_init = auth_glusterfs_request_init,</div><div class='add'>+    .authenticate = auth_glusterfs_authenticate};</div><div class='add'>+</div><div class='add'>+rpcsvc_auth_t rpcsvc_auth_glusterfs = {.authname = "AUTH_GLUSTERFS",</div><div class='add'>+                                       .authnum = AUTH_GLUSTERFS,</div><div class='add'>+                                       .authops = &amp;auth_glusterfs_ops,</div><div class='add'>+                                       .authprivate = NULL};</div><div class='add'>+</div><div class='add'>+rpcsvc_auth_t *</div><div class='add'>+rpcsvc_auth_glusterfs_init(rpcsvc_t *svc, dict_t *options)</div><div class='ctx'> {</div><div class='del'>-	register int32_t *buf;</div><div class='del'>-</div><div class='del'>-	int i;</div><div class='del'>-</div><div class='del'>-	if (xdrs-&gt;x_op == XDR_ENCODE) {</div><div class='del'>-		 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;lk_owner))</div><div class='del'>-			 return FALSE;</div><div class='del'>-		buf = XDR_INLINE (xdrs, (4 +  16 )* BYTES_PER_XDR_UNIT);</div><div class='del'>-		if (buf == NULL) {</div><div class='del'>-			 if (!xdr_u_int (xdrs, &amp;objp-&gt;pid))</div><div class='del'>-				 return FALSE;</div><div class='del'>-			 if (!xdr_u_int (xdrs, &amp;objp-&gt;uid))</div><div class='del'>-				 return FALSE;</div><div class='del'>-			 if (!xdr_u_int (xdrs, &amp;objp-&gt;gid))</div><div class='del'>-				 return FALSE;</div><div class='del'>-			 if (!xdr_u_int (xdrs, &amp;objp-&gt;ngrps))</div><div class='del'>-				 return FALSE;</div><div class='del'>-			 if (!xdr_vector (xdrs, (char *)objp-&gt;groups, 16,</div><div class='del'>-				sizeof (u_int), (xdrproc_t) xdr_u_int))</div><div class='del'>-				 return FALSE;</div><div class='del'>-		} else {</div><div class='del'>-			IXDR_PUT_U_LONG(buf, objp-&gt;pid);</div><div class='del'>-			IXDR_PUT_U_LONG(buf, objp-&gt;uid);</div><div class='del'>-			IXDR_PUT_U_LONG(buf, objp-&gt;gid);</div><div class='del'>-			IXDR_PUT_U_LONG(buf, objp-&gt;ngrps);</div><div class='del'>-			{</div><div class='del'>-				register u_int *genp;</div><div class='del'>-</div><div class='del'>-				for (i = 0, genp = objp-&gt;groups;</div><div class='del'>-					i &lt; 16; ++i) {</div><div class='del'>-					IXDR_PUT_U_LONG(buf, *genp++);</div><div class='del'>-				}</div><div class='del'>-			}</div><div class='del'>-		}</div><div class='del'>-		return TRUE;</div><div class='del'>-	} else if (xdrs-&gt;x_op == XDR_DECODE) {</div><div class='del'>-		 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;lk_owner))</div><div class='del'>-			 return FALSE;</div><div class='del'>-		buf = XDR_INLINE (xdrs, (4 +  16 )* BYTES_PER_XDR_UNIT);</div><div class='del'>-		if (buf == NULL) {</div><div class='del'>-			 if (!xdr_u_int (xdrs, &amp;objp-&gt;pid))</div><div class='del'>-				 return FALSE;</div><div class='del'>-			 if (!xdr_u_int (xdrs, &amp;objp-&gt;uid))</div><div class='del'>-				 return FALSE;</div><div class='del'>-			 if (!xdr_u_int (xdrs, &amp;objp-&gt;gid))</div><div class='del'>-				 return FALSE;</div><div class='del'>-			 if (!xdr_u_int (xdrs, &amp;objp-&gt;ngrps))</div><div class='del'>-				 return FALSE;</div><div class='del'>-			 if (!xdr_vector (xdrs, (char *)objp-&gt;groups, 16,</div><div class='del'>-				sizeof (u_int), (xdrproc_t) xdr_u_int))</div><div class='del'>-				 return FALSE;</div><div class='del'>-		} else {</div><div class='del'>-			objp-&gt;pid = IXDR_GET_U_LONG(buf);</div><div class='del'>-			objp-&gt;uid = IXDR_GET_U_LONG(buf);</div><div class='del'>-			objp-&gt;gid = IXDR_GET_U_LONG(buf);</div><div class='del'>-			objp-&gt;ngrps = IXDR_GET_U_LONG(buf);</div><div class='del'>-			{</div><div class='del'>-				register u_int *genp;</div><div class='del'>-</div><div class='del'>-				for (i = 0, genp = objp-&gt;groups;</div><div class='del'>-					i &lt; 16; ++i) {</div><div class='del'>-					*genp++ = IXDR_GET_U_LONG(buf);</div><div class='del'>-				}</div><div class='del'>-			}</div><div class='del'>-		}</div><div class='del'>-	 return TRUE;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;lk_owner))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_u_int (xdrs, &amp;objp-&gt;pid))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_u_int (xdrs, &amp;objp-&gt;uid))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_u_int (xdrs, &amp;objp-&gt;gid))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_u_int (xdrs, &amp;objp-&gt;ngrps))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_vector (xdrs, (char *)objp-&gt;groups, 16,</div><div class='del'>-		sizeof (u_int), (xdrproc_t) xdr_u_int))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	return TRUE;</div><div class='add'>+    return &amp;rpcsvc_auth_glusterfs;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+/* V2 */</div><div class='ctx'> </div><div class='ctx'> ssize_t</div><div class='del'>-xdr_to_glusterfs_auth (char *buf, struct auth_glusterfs_parms *req)</div><div class='add'>+xdr_to_glusterfs_auth_v2(char *buf, struct auth_glusterfs_parms_v2 *req)</div><div class='ctx'> {</div><div class='del'>-        XDR     xdr;</div><div class='del'>-        ssize_t ret = -1;</div><div class='add'>+    XDR xdr;</div><div class='add'>+    ssize_t ret = -1;</div><div class='ctx'> </div><div class='del'>-        if ((!buf) || (!req))</div><div class='del'>-                return -1;</div><div class='add'>+    if ((!buf) || (!req))</div><div class='add'>+        return -1;</div><div class='ctx'> </div><div class='del'>-        xdrmem_create (&amp;xdr, buf, sizeof (struct auth_glusterfs_parms),</div><div class='del'>-                       XDR_DECODE);</div><div class='del'>-        if (!xdr_auth_glusterfs_parms (&amp;xdr, req)) {</div><div class='del'>-                ret  = -1;</div><div class='del'>-                goto ret;</div><div class='del'>-        }</div><div class='add'>+    xdrmem_create(&amp;xdr, buf, GF_MAX_AUTH_BYTES, XDR_DECODE);</div><div class='add'>+    if (!xdr_auth_glusterfs_parms_v2(&amp;xdr, req)) {</div><div class='add'>+        gf_log("", GF_LOG_WARNING, "failed to decode glusterfs v2 parameters");</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto ret;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        ret = (((size_t)(&amp;xdr)-&gt;x_private) - ((size_t)(&amp;xdr)-&gt;x_base));</div><div class='add'>+    ret = (((size_t)(&amp;xdr)-&gt;x_private) - ((size_t)(&amp;xdr)-&gt;x_base));</div><div class='ctx'> ret:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+int</div><div class='add'>+auth_glusterfs_v2_request_init(rpcsvc_request_t *req, void *priv)</div><div class='add'>+{</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+auth_glusterfs_v2_authenticate(rpcsvc_request_t *req, void *priv)</div><div class='add'>+{</div><div class='add'>+    struct auth_glusterfs_parms_v2 au = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int ret = RPCSVC_AUTH_REJECT;</div><div class='add'>+    int i = 0;</div><div class='add'>+    int max_groups = 0;</div><div class='add'>+    int max_lk_owner_len = 0;</div><div class='add'>+</div><div class='add'>+    if (!req)</div><div class='ctx'>         return ret;</div><div class='ctx'> </div><div class='add'>+    ret = xdr_to_glusterfs_auth_v2(req-&gt;cred.authdata, &amp;au);</div><div class='add'>+    if (ret == -1) {</div><div class='add'>+        gf_log("", GF_LOG_WARNING, "failed to decode glusterfs credentials");</div><div class='add'>+        ret = RPCSVC_AUTH_REJECT;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    req-&gt;pid = au.pid;</div><div class='add'>+    req-&gt;uid = au.uid;</div><div class='add'>+    req-&gt;gid = au.gid;</div><div class='add'>+    req-&gt;lk_owner.len = au.lk_owner.lk_owner_len;</div><div class='add'>+    req-&gt;auxgidcount = au.groups.groups_len;</div><div class='add'>+</div><div class='add'>+    /* the number of groups and size of lk_owner depend on each other */</div><div class='add'>+    max_groups = GF_AUTH_GLUSTERFS_MAX_GROUPS(req-&gt;lk_owner.len,</div><div class='add'>+                                              AUTH_GLUSTERFS_v2);</div><div class='add'>+    max_lk_owner_len = GF_AUTH_GLUSTERFS_MAX_LKOWNER(req-&gt;auxgidcount,</div><div class='add'>+                                                     AUTH_GLUSTERFS_v2);</div><div class='add'>+</div><div class='add'>+    if (req-&gt;auxgidcount &gt; max_groups) {</div><div class='add'>+        gf_log("", GF_LOG_WARNING,</div><div class='add'>+               "more than max aux gids found (%d) , truncating it "</div><div class='add'>+               "to %d and continuing",</div><div class='add'>+               au.groups.groups_len, max_groups);</div><div class='add'>+        req-&gt;auxgidcount = max_groups;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (req-&gt;lk_owner.len &gt; max_lk_owner_len) {</div><div class='add'>+        gf_log("", GF_LOG_WARNING,</div><div class='add'>+               "lkowner field to big (%d), depends on the number of "</div><div class='add'>+               "groups (%d), failing authentication",</div><div class='add'>+               req-&gt;lk_owner.len, req-&gt;auxgidcount);</div><div class='add'>+        ret = RPCSVC_AUTH_REJECT;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (req-&gt;auxgidcount &gt; SMALL_GROUP_COUNT) {</div><div class='add'>+        req-&gt;auxgidlarge = GF_CALLOC(req-&gt;auxgidcount, sizeof(req-&gt;auxgids[0]),</div><div class='add'>+                                     gf_common_mt_auxgids);</div><div class='add'>+        req-&gt;auxgids = req-&gt;auxgidlarge;</div><div class='add'>+    } else {</div><div class='add'>+        req-&gt;auxgids = req-&gt;auxgidsmall;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (!req-&gt;auxgids) {</div><div class='add'>+        gf_log("auth-glusterfs-v2", GF_LOG_WARNING, "cannot allocate gid list");</div><div class='add'>+        ret = RPCSVC_AUTH_REJECT;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; req-&gt;auxgidcount; ++i)</div><div class='add'>+        req-&gt;auxgids[i] = au.groups.groups_val[i];</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; au.lk_owner.lk_owner_len; ++i)</div><div class='add'>+        req-&gt;lk_owner.data[i] = au.lk_owner.lk_owner_val[i];</div><div class='add'>+</div><div class='add'>+    gf_log(GF_RPCSVC, GF_LOG_TRACE,</div><div class='add'>+           "Auth Info: pid: %u, uid: %d"</div><div class='add'>+           ", gid: %d, owner: %s",</div><div class='add'>+           req-&gt;pid, req-&gt;uid, req-&gt;gid, lkowner_utoa(&amp;req-&gt;lk_owner));</div><div class='add'>+    ret = RPCSVC_AUTH_ACCEPT;</div><div class='add'>+err:</div><div class='add'>+    /* TODO: instead use alloca() for these variables */</div><div class='add'>+    free(au.groups.groups_val);</div><div class='add'>+    free(au.lk_owner.lk_owner_val);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='del'>-int</div><div class='del'>-auth_glusterfs_request_init (rpcsvc_request_t *req, void *priv)</div><div class='add'>+</div><div class='add'>+rpcsvc_auth_ops_t auth_glusterfs_ops_v2 = {</div><div class='add'>+    .transport_init = NULL,</div><div class='add'>+    .request_init = auth_glusterfs_v2_request_init,</div><div class='add'>+    .authenticate = auth_glusterfs_v2_authenticate};</div><div class='add'>+</div><div class='add'>+rpcsvc_auth_t rpcsvc_auth_glusterfs_v2 = {.authname = "AUTH_GLUSTERFS-v2",</div><div class='add'>+                                          .authnum = AUTH_GLUSTERFS_v2,</div><div class='add'>+                                          .authops = &amp;auth_glusterfs_ops_v2,</div><div class='add'>+                                          .authprivate = NULL};</div><div class='add'>+</div><div class='add'>+rpcsvc_auth_t *</div><div class='add'>+rpcsvc_auth_glusterfs_v2_init(rpcsvc_t *svc, dict_t *options)</div><div class='ctx'> {</div><div class='del'>-        if (!req)</div><div class='del'>-                return -1;</div><div class='del'>-        memset (req-&gt;verf.authdata, 0, RPCSVC_MAX_AUTH_BYTES);</div><div class='del'>-        req-&gt;verf.datalen = 0;</div><div class='del'>-        req-&gt;verf.flavour = AUTH_NULL;</div><div class='add'>+    return &amp;rpcsvc_auth_glusterfs_v2;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* V3 */</div><div class='add'>+</div><div class='add'>+ssize_t</div><div class='add'>+xdr_to_glusterfs_auth_v3(char *buf, struct auth_glusterfs_params_v3 *req)</div><div class='add'>+{</div><div class='add'>+    XDR xdr;</div><div class='add'>+    ssize_t ret = -1;</div><div class='add'>+</div><div class='add'>+    if ((!buf) || (!req))</div><div class='add'>+        return -1;</div><div class='add'>+</div><div class='add'>+    xdrmem_create(&amp;xdr, buf, GF_MAX_AUTH_BYTES, XDR_DECODE);</div><div class='add'>+    if (!xdr_auth_glusterfs_params_v3(&amp;xdr, req)) {</div><div class='add'>+        gf_log("", GF_LOG_WARNING, "failed to decode glusterfs v3 parameters");</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto ret;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = (((size_t)(&amp;xdr)-&gt;x_private) - ((size_t)(&amp;xdr)-&gt;x_base));</div><div class='add'>+ret:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        return 0;</div><div class='add'>+int</div><div class='add'>+auth_glusterfs_v3_request_init(rpcsvc_request_t *req, void *priv)</div><div class='add'>+{</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-int auth_glusterfs_authenticate (rpcsvc_request_t *req, void *priv)</div><div class='add'>+int</div><div class='add'>+auth_glusterfs_v3_authenticate(rpcsvc_request_t *req, void *priv)</div><div class='ctx'> {</div><div class='del'>-        int                          ret = RPCSVC_AUTH_REJECT;</div><div class='del'>-        struct auth_glusterfs_parms  au = {0,};</div><div class='del'>-</div><div class='del'>-        if (!req)</div><div class='del'>-                return ret;</div><div class='del'>-</div><div class='del'>-        ret = xdr_to_glusterfs_auth (req-&gt;cred.authdata, &amp;au);</div><div class='del'>-        if (ret == -1) {</div><div class='del'>-                ret = RPCSVC_AUTH_REJECT;</div><div class='del'>-                goto err;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        req-&gt;pid = au.pid;</div><div class='del'>-        req-&gt;uid = au.uid;</div><div class='del'>-        req-&gt;gid = au.gid;</div><div class='del'>-        req-&gt;lk_owner = au.lk_owner;</div><div class='del'>-        req-&gt;auxgidcount = au.ngrps;</div><div class='del'>-</div><div class='del'>-        gf_log (GF_RPCSVC, GF_LOG_TRACE, "Auth Info: pid: %u, uid: %d"</div><div class='del'>-                ", gid: %d, owner: %"PRId64,</div><div class='del'>-                req-&gt;pid, req-&gt;uid, req-&gt;gid, req-&gt;lk_owner);</div><div class='del'>-        ret = RPCSVC_AUTH_ACCEPT;</div><div class='del'>-err:</div><div class='add'>+    struct auth_glusterfs_params_v3 au = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int ret = RPCSVC_AUTH_REJECT;</div><div class='add'>+    int i = 0;</div><div class='add'>+    int max_groups = 0;</div><div class='add'>+    int max_lk_owner_len = 0;</div><div class='add'>+</div><div class='add'>+    if (!req)</div><div class='ctx'>         return ret;</div><div class='del'>-}</div><div class='ctx'> </div><div class='del'>-rpcsvc_auth_ops_t auth_glusterfs_ops = {</div><div class='del'>-        .transport_init         = NULL,</div><div class='del'>-        .request_init           = auth_glusterfs_request_init,</div><div class='del'>-        .authenticate           = auth_glusterfs_authenticate</div><div class='del'>-};</div><div class='add'>+    ret = xdr_to_glusterfs_auth_v3(req-&gt;cred.authdata, &amp;au);</div><div class='add'>+    if (ret == -1) {</div><div class='add'>+        gf_log("", GF_LOG_WARNING, "failed to decode glusterfs credentials");</div><div class='add'>+        ret = RPCSVC_AUTH_REJECT;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    req-&gt;pid = au.pid;</div><div class='add'>+    req-&gt;uid = au.uid;</div><div class='add'>+    req-&gt;gid = au.gid;</div><div class='add'>+    req-&gt;lk_owner.len = au.lk_owner.lk_owner_len;</div><div class='add'>+    req-&gt;auxgidcount = au.groups.groups_len;</div><div class='add'>+</div><div class='add'>+    /* the number of groups and size of lk_owner depend on each other */</div><div class='add'>+    max_groups = GF_AUTH_GLUSTERFS_MAX_GROUPS(req-&gt;lk_owner.len,</div><div class='add'>+                                              AUTH_GLUSTERFS_v3);</div><div class='add'>+    max_lk_owner_len = GF_AUTH_GLUSTERFS_MAX_LKOWNER(req-&gt;auxgidcount,</div><div class='add'>+                                                     AUTH_GLUSTERFS_v3);</div><div class='add'>+</div><div class='add'>+    if (req-&gt;auxgidcount &gt; max_groups) {</div><div class='add'>+        gf_log("", GF_LOG_WARNING,</div><div class='add'>+               "more than max aux gids found (%d) , truncating it "</div><div class='add'>+               "to %d and continuing",</div><div class='add'>+               au.groups.groups_len, max_groups);</div><div class='add'>+        req-&gt;auxgidcount = max_groups;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (req-&gt;lk_owner.len &gt; max_lk_owner_len) {</div><div class='add'>+        gf_log("", GF_LOG_WARNING,</div><div class='add'>+               "lkowner field to big (%d), depends on the number of "</div><div class='add'>+               "groups (%d), failing authentication",</div><div class='add'>+               req-&gt;lk_owner.len, req-&gt;auxgidcount);</div><div class='add'>+        ret = RPCSVC_AUTH_REJECT;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (req-&gt;auxgidcount &gt; SMALL_GROUP_COUNT) {</div><div class='add'>+        req-&gt;auxgidlarge = GF_CALLOC(req-&gt;auxgidcount, sizeof(req-&gt;auxgids[0]),</div><div class='add'>+                                     gf_common_mt_auxgids);</div><div class='add'>+        req-&gt;auxgids = req-&gt;auxgidlarge;</div><div class='add'>+    } else {</div><div class='add'>+        req-&gt;auxgids = req-&gt;auxgidsmall;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (!req-&gt;auxgids) {</div><div class='add'>+        gf_log("auth-glusterfs-v2", GF_LOG_WARNING, "cannot allocate gid list");</div><div class='add'>+        ret = RPCSVC_AUTH_REJECT;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; req-&gt;auxgidcount; ++i)</div><div class='add'>+        req-&gt;auxgids[i] = au.groups.groups_val[i];</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; au.lk_owner.lk_owner_len; ++i)</div><div class='add'>+        req-&gt;lk_owner.data[i] = au.lk_owner.lk_owner_val[i];</div><div class='add'>+</div><div class='add'>+    /* All new things, starting glusterfs-4.0.0 */</div><div class='add'>+    req-&gt;flags = au.flags;</div><div class='add'>+    req-&gt;ctime.tv_sec = au.ctime_sec;</div><div class='add'>+    req-&gt;ctime.tv_nsec = au.ctime_nsec;</div><div class='add'>+</div><div class='add'>+    gf_log(GF_RPCSVC, GF_LOG_TRACE,</div><div class='add'>+           "Auth Info: pid: %u, uid: %d"</div><div class='add'>+           ", gid: %d, owner: %s, flags: %d",</div><div class='add'>+           req-&gt;pid, req-&gt;uid, req-&gt;gid, lkowner_utoa(&amp;req-&gt;lk_owner),</div><div class='add'>+           req-&gt;flags);</div><div class='add'>+    ret = RPCSVC_AUTH_ACCEPT;</div><div class='add'>+err:</div><div class='add'>+    /* TODO: instead use alloca() for these variables */</div><div class='add'>+    free(au.groups.groups_val);</div><div class='add'>+    free(au.lk_owner.lk_owner_val);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-rpcsvc_auth_t rpcsvc_auth_glusterfs = {</div><div class='del'>-        .authname       = "AUTH_GLUSTERFS",</div><div class='del'>-        .authnum        = AUTH_GLUSTERFS,</div><div class='del'>-        .authops        = &amp;auth_glusterfs_ops,</div><div class='del'>-        .authprivate    = NULL</div><div class='del'>-};</div><div class='add'>+rpcsvc_auth_ops_t auth_glusterfs_ops_v3 = {</div><div class='add'>+    .transport_init = NULL,</div><div class='add'>+    .request_init = auth_glusterfs_v3_request_init,</div><div class='add'>+    .authenticate = auth_glusterfs_v3_authenticate};</div><div class='ctx'> </div><div class='add'>+rpcsvc_auth_t rpcsvc_auth_glusterfs_v3 = {.authname = "AUTH_GLUSTERFS-v3",</div><div class='add'>+                                          .authnum = AUTH_GLUSTERFS_v3,</div><div class='add'>+                                          .authops = &amp;auth_glusterfs_ops_v3,</div><div class='add'>+                                          .authprivate = NULL};</div><div class='ctx'> </div><div class='ctx'> rpcsvc_auth_t *</div><div class='del'>-rpcsvc_auth_glusterfs_init (rpcsvc_t *svc, dict_t *options)</div><div class='add'>+rpcsvc_auth_glusterfs_v3_init(rpcsvc_t *svc, dict_t *options)</div><div class='ctx'> {</div><div class='del'>-        return &amp;rpcsvc_auth_glusterfs;</div><div class='add'>+    return &amp;rpcsvc_auth_glusterfs_v3;</div><div class='ctx'> }</div><div class='head'>diff --git a/rpc/rpc-lib/src/auth-null.c b/rpc/rpc-lib/src/auth-null.c<br/>index 20dd7e77c8b..6d059b9da50 100644<br/>--- a/<a href='/cgit/glusterfs.git/tree/rpc/rpc-lib/src/auth-null.c?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>rpc/rpc-lib/src/auth-null.c</a><br/>+++ b/<a href='/cgit/glusterfs.git/tree/rpc/rpc-lib/src/auth-null.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>rpc/rpc-lib/src/auth-null.c</a></div><div class='hunk'>@@ -1,70 +1,40 @@</div><div class='ctx'> /*</div><div class='del'>-  Copyright (c) 2010 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='add'>+  Copyright (c) 2008-2012 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='ctx'>   This file is part of GlusterFS.</div><div class='ctx'> </div><div class='del'>-  GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-  it under the terms of the GNU Affero General Public License as published</div><div class='del'>-  by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-  or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-  GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-  WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-  Affero General Public License for more details.</div><div class='del'>-</div><div class='del'>-  You should have received a copy of the GNU Affero General Public License</div><div class='del'>-  along with this program.  If not, see</div><div class='del'>-  &lt;http://www.gnu.org/licenses/&gt;.</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='ctx'> */</div><div class='ctx'> </div><div class='del'>-</div><div class='del'>-#ifndef _CONFIG_H</div><div class='del'>-#define _CONFIG_H</div><div class='del'>-#include "config.h"</div><div class='del'>-#endif</div><div class='del'>-</div><div class='ctx'> #include "rpcsvc.h"</div><div class='del'>-#include "list.h"</div><div class='del'>-#include "dict.h"</div><div class='del'>-</div><div class='add'>+#include &lt;glusterfs/dict.h&gt;</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-auth_null_request_init (rpcsvc_request_t *req, void *priv)</div><div class='add'>+auth_null_request_init(rpcsvc_request_t *req, void *priv)</div><div class='ctx'> {</div><div class='del'>-        if (!req)</div><div class='del'>-                return -1;</div><div class='del'>-</div><div class='del'>-        memset (req-&gt;cred.authdata, 0, RPCSVC_MAX_AUTH_BYTES);</div><div class='del'>-        req-&gt;cred.datalen = 0;</div><div class='del'>-</div><div class='del'>-        memset (req-&gt;verf.authdata, 0, RPCSVC_MAX_AUTH_BYTES);</div><div class='del'>-        req-&gt;verf.datalen = 0;</div><div class='del'>-</div><div class='del'>-        return 0;</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-int auth_null_authenticate (rpcsvc_request_t *req, void *priv)</div><div class='add'>+int</div><div class='add'>+auth_null_authenticate(rpcsvc_request_t *req, void *priv)</div><div class='ctx'> {</div><div class='del'>-        /* Always succeed. */</div><div class='del'>-        return RPCSVC_AUTH_ACCEPT;</div><div class='add'>+    /* Always succeed. */</div><div class='add'>+    return RPCSVC_AUTH_ACCEPT;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-rpcsvc_auth_ops_t auth_null_ops = {</div><div class='del'>-        .transport_init              = NULL,</div><div class='del'>-        .request_init           = auth_null_request_init,</div><div class='del'>-        .authenticate           = auth_null_authenticate</div><div class='del'>-};</div><div class='del'>-</div><div class='del'>-rpcsvc_auth_t rpcsvc_auth_null = {</div><div class='del'>-        .authname       = "AUTH_NULL",</div><div class='del'>-        .authnum        = AUTH_NULL,</div><div class='del'>-        .authops        = &amp;auth_null_ops,</div><div class='del'>-        .authprivate    = NULL</div><div class='del'>-};</div><div class='add'>+rpcsvc_auth_ops_t auth_null_ops = {.transport_init = NULL,</div><div class='add'>+                                   .request_init = auth_null_request_init,</div><div class='add'>+                                   .authenticate = auth_null_authenticate};</div><div class='ctx'> </div><div class='add'>+rpcsvc_auth_t rpcsvc_auth_null = {.authname = "AUTH_NULL",</div><div class='add'>+                                  .authnum = AUTH_NULL,</div><div class='add'>+                                  .authops = &amp;auth_null_ops,</div><div class='add'>+                                  .authprivate = NULL};</div><div class='ctx'> </div><div class='ctx'> rpcsvc_auth_t *</div><div class='del'>-rpcsvc_auth_null_init (rpcsvc_t *svc, dict_t *options)</div><div class='add'>+rpcsvc_auth_null_init(rpcsvc_t *svc, dict_t *options)</div><div class='ctx'> {</div><div class='del'>-        return &amp;rpcsvc_auth_null;</div><div class='add'>+    return &amp;rpcsvc_auth_null;</div><div class='ctx'> }</div><div class='head'>diff --git a/rpc/rpc-lib/src/auth-unix.c b/rpc/rpc-lib/src/auth-unix.c<br/>index 30b395bd4fa..61d475a5e84 100644<br/>--- a/<a href='/cgit/glusterfs.git/tree/rpc/rpc-lib/src/auth-unix.c?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>rpc/rpc-lib/src/auth-unix.c</a><br/>+++ b/<a href='/cgit/glusterfs.git/tree/rpc/rpc-lib/src/auth-unix.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>rpc/rpc-lib/src/auth-unix.c</a></div><div class='hunk'>@@ -1,90 +1,66 @@</div><div class='ctx'> /*</div><div class='del'>-  Copyright (c) 2010 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='add'>+  Copyright (c) 2008-2012 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='ctx'>   This file is part of GlusterFS.</div><div class='ctx'> </div><div class='del'>-  GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-  it under the terms of the GNU Affero General Public License as published</div><div class='del'>-  by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-  or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-  GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-  WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-  Affero General Public License for more details.</div><div class='del'>-</div><div class='del'>-  You should have received a copy of the GNU Affero General Public License</div><div class='del'>-  along with this program.  If not, see</div><div class='del'>-  &lt;http://www.gnu.org/licenses/&gt;.</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='ctx'> */</div><div class='ctx'> </div><div class='del'>-</div><div class='del'>-</div><div class='del'>-#ifndef _CONFIG_H</div><div class='del'>-#define _CONFIG_H</div><div class='del'>-#include "config.h"</div><div class='del'>-#endif</div><div class='del'>-</div><div class='ctx'> #include "rpcsvc.h"</div><div class='del'>-#include "list.h"</div><div class='del'>-#include "dict.h"</div><div class='add'>+#include &lt;glusterfs/dict.h&gt;</div><div class='ctx'> #include "xdr-rpc.h"</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-auth_unix_request_init (rpcsvc_request_t *req, void *priv)</div><div class='add'>+auth_unix_request_init(rpcsvc_request_t *req, void *priv)</div><div class='ctx'> {</div><div class='del'>-        if (!req)</div><div class='del'>-                return -1;</div><div class='del'>-        memset (req-&gt;verf.authdata, 0, RPCSVC_MAX_AUTH_BYTES);</div><div class='del'>-        req-&gt;verf.datalen = 0;</div><div class='del'>-        req-&gt;verf.flavour = AUTH_NULL;</div><div class='del'>-</div><div class='del'>-        return 0;</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-int auth_unix_authenticate (rpcsvc_request_t *req, void *priv)</div><div class='add'>+int</div><div class='add'>+auth_unix_authenticate(rpcsvc_request_t *req, void *priv)</div><div class='ctx'> {</div><div class='del'>-        int                     ret = RPCSVC_AUTH_REJECT;</div><div class='del'>-        struct authunix_parms   aup;</div><div class='del'>-        char                    machname[MAX_MACHINE_NAME];</div><div class='del'>-</div><div class='del'>-        if (!req)</div><div class='del'>-                return ret;</div><div class='del'>-</div><div class='del'>-        ret = xdr_to_auth_unix_cred (req-&gt;cred.authdata, req-&gt;cred.datalen,</div><div class='del'>-                                     &amp;aup, machname, req-&gt;auxgids);</div><div class='del'>-        if (ret == -1) {</div><div class='del'>-                ret = RPCSVC_AUTH_REJECT;</div><div class='del'>-                goto err;</div><div class='del'>-        }</div><div class='add'>+    int ret = RPCSVC_AUTH_REJECT;</div><div class='add'>+    struct authunix_parms aup;</div><div class='add'>+    char machname[MAX_MACHINE_NAME];</div><div class='ctx'> </div><div class='del'>-        req-&gt;uid = aup.aup_uid;</div><div class='del'>-        req-&gt;gid = aup.aup_gid;</div><div class='del'>-        req-&gt;auxgidcount = aup.aup_len;</div><div class='add'>+    if (!req)</div><div class='add'>+        return ret;</div><div class='ctx'> </div><div class='del'>-        gf_log (GF_RPCSVC, GF_LOG_TRACE, "Auth Info: machine name: %s, uid: %d"</div><div class='del'>-                ", gid: %d", machname, req-&gt;uid, req-&gt;gid);</div><div class='del'>-        ret = RPCSVC_AUTH_ACCEPT;</div><div class='add'>+    req-&gt;auxgids = req-&gt;auxgidsmall;</div><div class='add'>+    ret = xdr_to_auth_unix_cred(req-&gt;cred.authdata, req-&gt;cred.datalen, &amp;aup,</div><div class='add'>+                                machname, req-&gt;auxgids);</div><div class='add'>+    if (ret == -1) {</div><div class='add'>+        gf_log("", GF_LOG_WARNING, "failed to decode unix credentials");</div><div class='add'>+        ret = RPCSVC_AUTH_REJECT;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    req-&gt;uid = aup.aup_uid;</div><div class='add'>+    req-&gt;gid = aup.aup_gid;</div><div class='add'>+    req-&gt;auxgidcount = aup.aup_len;</div><div class='add'>+</div><div class='add'>+    gf_log(GF_RPCSVC, GF_LOG_TRACE,</div><div class='add'>+           "Auth Info: machine name: %s, uid: %d"</div><div class='add'>+           ", gid: %d",</div><div class='add'>+           machname, req-&gt;uid, req-&gt;gid);</div><div class='add'>+    ret = RPCSVC_AUTH_ACCEPT;</div><div class='ctx'> err:</div><div class='del'>-        return ret;</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-rpcsvc_auth_ops_t auth_unix_ops = {</div><div class='del'>-        .transport_init              = NULL,</div><div class='del'>-        .request_init           = auth_unix_request_init,</div><div class='del'>-        .authenticate           = auth_unix_authenticate</div><div class='del'>-};</div><div class='del'>-</div><div class='del'>-rpcsvc_auth_t rpcsvc_auth_unix = {</div><div class='del'>-        .authname       = "AUTH_UNIX",</div><div class='del'>-        .authnum        = AUTH_UNIX,</div><div class='del'>-        .authops        = &amp;auth_unix_ops,</div><div class='del'>-        .authprivate    = NULL</div><div class='del'>-};</div><div class='add'>+rpcsvc_auth_ops_t auth_unix_ops = {.transport_init = NULL,</div><div class='add'>+                                   .request_init = auth_unix_request_init,</div><div class='add'>+                                   .authenticate = auth_unix_authenticate};</div><div class='ctx'> </div><div class='add'>+rpcsvc_auth_t rpcsvc_auth_unix = {.authname = "AUTH_UNIX",</div><div class='add'>+                                  .authnum = AUTH_UNIX,</div><div class='add'>+                                  .authops = &amp;auth_unix_ops,</div><div class='add'>+                                  .authprivate = NULL};</div><div class='ctx'> </div><div class='ctx'> rpcsvc_auth_t *</div><div class='del'>-rpcsvc_auth_unix_init (rpcsvc_t *svc, dict_t *options)</div><div class='add'>+rpcsvc_auth_unix_init(rpcsvc_t *svc, dict_t *options)</div><div class='ctx'> {</div><div class='del'>-        return &amp;rpcsvc_auth_unix;</div><div class='add'>+    return &amp;rpcsvc_auth_unix;</div><div class='ctx'> }</div><div class='head'>diff --git a/rpc/rpc-lib/src/autoscale-threads.c b/rpc/rpc-lib/src/autoscale-threads.c<br/>new file mode 100644<br/>index 00000000000..a954ae7a27a<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/rpc/rpc-lib/src/autoscale-threads.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>rpc/rpc-lib/src/autoscale-threads.c</a></div><div class='hunk'>@@ -0,0 +1,22 @@</div><div class='add'>+/*</div><div class='add'>+   Copyright (c) 2018 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+   This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+   This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+   General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+   later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+   cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#include &lt;glusterfs/gf-event.h&gt;</div><div class='add'>+#include "rpcsvc.h"</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+rpcsvc_autoscale_threads(glusterfs_ctx_t *ctx, rpcsvc_t *rpc, int incr)</div><div class='add'>+{</div><div class='add'>+    struct event_pool *pool = ctx-&gt;event_pool;</div><div class='add'>+    int thread_count = pool-&gt;eventthreadcount;</div><div class='add'>+</div><div class='add'>+    pool-&gt;auto_thread_count += incr;</div><div class='add'>+    (void)gf_event_reconfigure_threads(pool, thread_count + incr);</div><div class='add'>+}</div><div class='head'>diff --git a/rpc/rpc-lib/src/libgfrpc.sym b/rpc/rpc-lib/src/libgfrpc.sym<br/>new file mode 100644<br/>index 00000000000..e026d80259b<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/rpc/rpc-lib/src/libgfrpc.sym?id=d1d7a6f35c816822fab51c820e25023863c239c1'>rpc/rpc-lib/src/libgfrpc.sym</a></div><div class='hunk'>@@ -0,0 +1,68 @@</div><div class='add'>+is_rpc_clnt_disconnected</div><div class='add'>+rpcclnt_cbk_program_register</div><div class='add'>+rpc_clnt_cleanup_and_start</div><div class='add'>+rpc_clnt_connection_cleanup</div><div class='add'>+rpc_clnt_disable</div><div class='add'>+rpc_clnt_new</div><div class='add'>+rpc_clnt_reconfig</div><div class='add'>+rpc_clnt_reconnect</div><div class='add'>+rpc_clnt_reconnect_cleanup</div><div class='add'>+rpc_clnt_ref</div><div class='add'>+rpc_clnt_register_notify</div><div class='add'>+rpc_clnt_start</div><div class='add'>+rpc_clnt_submit</div><div class='add'>+rpc_clnt_unref</div><div class='add'>+rpc_reply_to_xdr</div><div class='add'>+rpcsvc_auth_array</div><div class='add'>+rpcsvc_auth_check</div><div class='add'>+rpcsvc_auth_reconf</div><div class='add'>+rpcsvc_auth_unix_auxgids</div><div class='add'>+rpcsvc_callback_submit</div><div class='add'>+rpcsvc_create_listener</div><div class='add'>+rpcsvc_create_listeners</div><div class='add'>+rpcsvc_drc_init</div><div class='add'>+rpcsvc_drc_priv</div><div class='add'>+rpcsvc_drc_reconfigure</div><div class='add'>+rpcsvc_get_program_vector_sizer</div><div class='add'>+rpcsvc_init</div><div class='add'>+rpcsvc_destroy</div><div class='add'>+rpcsvc_init_options</div><div class='add'>+rpcsvc_listener_destroy</div><div class='add'>+rpcsvc_program_register</div><div class='add'>+rpcsvc_program_register_portmap</div><div class='add'>+rpcsvc_program_register_rpcbind6</div><div class='add'>+rpcsvc_program_unregister</div><div class='add'>+rpcsvc_program_unregister_portmap</div><div class='add'>+rpcsvc_program_unregister_rpcbind6</div><div class='add'>+rpcsvc_reconfigure_options</div><div class='add'>+rpcsvc_register_notify</div><div class='add'>+rpcsvc_register_portmap_enabled</div><div class='add'>+rpcsvc_request_submit</div><div class='add'>+rpcsvc_set_outstanding_rpc_limit</div><div class='add'>+rpcsvc_set_throttle_on</div><div class='add'>+rpcsvc_submit_generic</div><div class='add'>+rpcsvc_submit_message</div><div class='add'>+rpcsvc_transport_peeraddr</div><div class='add'>+rpcsvc_transport_peername</div><div class='add'>+rpcsvc_transport_privport_check</div><div class='add'>+rpcsvc_transport_unix_options_build</div><div class='add'>+rpcsvc_transport_volume_allowed</div><div class='add'>+rpcsvc_transport_connect</div><div class='add'>+rpcsvc_transport_getpeeraddr</div><div class='add'>+rpcsvc_unregister_notify</div><div class='add'>+rpcsvc_volume_allowed</div><div class='add'>+rpc_transport_count</div><div class='add'>+rpc_transport_connect</div><div class='add'>+rpc_transport_disconnect</div><div class='add'>+rpc_transport_get_peeraddr</div><div class='add'>+rpc_transport_inet_options_build</div><div class='add'>+rpc_transport_keepalive_options_set</div><div class='add'>+rpc_transport_notify</div><div class='add'>+rpc_transport_pollin_alloc</div><div class='add'>+rpc_transport_pollin_destroy</div><div class='add'>+rpc_transport_ref</div><div class='add'>+rpc_transport_unix_options_build</div><div class='add'>+rpc_transport_unref</div><div class='add'>+rpc_clnt_mgmt_pmap_signout</div><div class='add'>+rpcsvc_autoscale_threads</div><div class='add'>+rpcsvc_statedump</div><div class='head'>diff --git a/rpc/rpc-lib/src/mgmt-pmap.c b/rpc/rpc-lib/src/mgmt-pmap.c<br/>new file mode 100644<br/>index 00000000000..25a7148e5a3<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/rpc/rpc-lib/src/mgmt-pmap.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>rpc/rpc-lib/src/mgmt-pmap.c</a></div><div class='hunk'>@@ -0,0 +1,147 @@</div><div class='add'>+/*</div><div class='add'>+   Copyright (c) 2018 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+   This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+   This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+   General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+   later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+   cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#include "portmap-xdr.h"</div><div class='add'>+#include "protocol-common.h"</div><div class='add'>+#include "rpc-clnt.h"</div><div class='add'>+#include "xdr-generic.h"</div><div class='add'>+</div><div class='add'>+/* Defining a minimal RPC client program for portmap signout</div><div class='add'>+ */</div><div class='add'>+char *clnt_pmap_signout_procs[GF_PMAP_MAXVALUE] = {</div><div class='add'>+    [GF_PMAP_SIGNOUT] = "SIGNOUT",</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+rpc_clnt_prog_t clnt_pmap_signout_prog = {</div><div class='add'>+    .progname = "Gluster Portmap",</div><div class='add'>+    .prognum = GLUSTER_PMAP_PROGRAM,</div><div class='add'>+    .progver = GLUSTER_PMAP_VERSION,</div><div class='add'>+    .procnames = clnt_pmap_signout_procs,</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+mgmt_pmap_signout_cbk(struct rpc_req *req, struct iovec *iov, int count,</div><div class='add'>+                      void *myframe)</div><div class='add'>+{</div><div class='add'>+    pmap_signout_rsp rsp = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int ret = 0;</div><div class='add'>+    call_frame_t *frame = NULL;</div><div class='add'>+</div><div class='add'>+    frame = myframe;</div><div class='add'>+    if (-1 == req-&gt;rpc_status) {</div><div class='add'>+        rsp.op_ret = -1;</div><div class='add'>+        rsp.op_errno = EINVAL;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = xdr_to_generic(*iov, &amp;rsp, (xdrproc_t)xdr_pmap_signout_rsp);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        gf_log(THIS-&gt;name, GF_LOG_ERROR, "XDR decoding failed");</div><div class='add'>+        rsp.op_ret = -1;</div><div class='add'>+        rsp.op_errno = EINVAL;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (-1 == rsp.op_ret) {</div><div class='add'>+        gf_log(THIS-&gt;name, GF_LOG_ERROR,</div><div class='add'>+               "failed to register the port with glusterd");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+out:</div><div class='add'>+    if (frame) {</div><div class='add'>+        STACK_DESTROY(frame-&gt;root);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+rpc_clnt_mgmt_pmap_signout(glusterfs_ctx_t *ctx, char *brickname)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+    pmap_signout_req req = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    call_frame_t *frame = NULL;</div><div class='add'>+    cmd_args_t *cmd_args = NULL;</div><div class='add'>+    char brick_name[PATH_MAX] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    struct iovec iov = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    struct iobuf *iobuf = NULL;</div><div class='add'>+    struct iobref *iobref = NULL;</div><div class='add'>+    ssize_t xdr_size = 0;</div><div class='add'>+</div><div class='add'>+    frame = create_frame(THIS, ctx-&gt;pool);</div><div class='add'>+    cmd_args = &amp;ctx-&gt;cmd_args;</div><div class='add'>+</div><div class='add'>+    if (!cmd_args-&gt;brick_port &amp;&amp; (!cmd_args-&gt;brick_name || !brickname)) {</div><div class='add'>+        gf_log("fsd-mgmt", GF_LOG_DEBUG,</div><div class='add'>+               "portmapper signout arguments not given");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (cmd_args-&gt;volfile_server_transport &amp;&amp;</div><div class='add'>+        !strcmp(cmd_args-&gt;volfile_server_transport, "rdma")) {</div><div class='add'>+        snprintf(brick_name, sizeof(brick_name), "%s.rdma",</div><div class='add'>+                 cmd_args-&gt;brick_name);</div><div class='add'>+        req.brick = brick_name;</div><div class='add'>+    } else {</div><div class='add'>+        if (brickname)</div><div class='add'>+            req.brick = brickname;</div><div class='add'>+        else</div><div class='add'>+            req.brick = cmd_args-&gt;brick_name;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    req.port = cmd_args-&gt;brick_port;</div><div class='add'>+    req.rdma_port = cmd_args-&gt;brick_port2;</div><div class='add'>+</div><div class='add'>+    /* mgmt_submit_request is not available in libglusterfs.</div><div class='add'>+     * Need to serialize and submit manually.</div><div class='add'>+     */</div><div class='add'>+    iobref = iobref_new();</div><div class='add'>+    if (!iobref) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    xdr_size = xdr_sizeof((xdrproc_t)xdr_pmap_signout_req, &amp;req);</div><div class='add'>+    iobuf = iobuf_get2(ctx-&gt;iobuf_pool, xdr_size);</div><div class='add'>+    if (!iobuf) {</div><div class='add'>+        goto out;</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    iobref_add(iobref, iobuf);</div><div class='add'>+</div><div class='add'>+    iov.iov_base = iobuf-&gt;ptr;</div><div class='add'>+    iov.iov_len = iobuf_pagesize(iobuf);</div><div class='add'>+</div><div class='add'>+    /* Create the xdr payload */</div><div class='add'>+    ret = xdr_serialize_generic(iov, &amp;req, (xdrproc_t)xdr_pmap_signout_req);</div><div class='add'>+    if (ret == -1) {</div><div class='add'>+        gf_log(THIS-&gt;name, GF_LOG_WARNING, "failed to create XDR payload");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    iov.iov_len = ret;</div><div class='add'>+</div><div class='add'>+    ret = rpc_clnt_submit(ctx-&gt;mgmt, &amp;clnt_pmap_signout_prog, GF_PMAP_SIGNOUT,</div><div class='add'>+                          mgmt_pmap_signout_cbk, &amp;iov, 1, NULL, 0, iobref,</div><div class='add'>+                          frame, NULL, 0, NULL, 0, NULL);</div><div class='add'>+out:</div><div class='add'>+    if (iobref)</div><div class='add'>+        iobref_unref(iobref);</div><div class='add'>+</div><div class='add'>+    if (iobuf)</div><div class='add'>+        iobuf_unref(iobuf);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='head'>diff --git a/rpc/rpc-lib/src/protocol-common.h b/rpc/rpc-lib/src/protocol-common.h<br/>index 8f79a03a465..0cb5862e9a9 100644<br/>--- a/<a href='/cgit/glusterfs.git/tree/rpc/rpc-lib/src/protocol-common.h?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>rpc/rpc-lib/src/protocol-common.h</a><br/>+++ b/<a href='/cgit/glusterfs.git/tree/rpc/rpc-lib/src/protocol-common.h?id=d1d7a6f35c816822fab51c820e25023863c239c1'>rpc/rpc-lib/src/protocol-common.h</a></div><div class='hunk'>@@ -1,178 +1,382 @@</div><div class='ctx'> /*</div><div class='del'>-  Copyright (c) 2007-2010 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='add'>+  Copyright (c) 2008-2012 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='ctx'>   This file is part of GlusterFS.</div><div class='ctx'> </div><div class='del'>-  GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-  it under the terms of the GNU Affero General Public License as published</div><div class='del'>-  by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-  or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-  GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-  WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-  Affero General Public License for more details.</div><div class='del'>-</div><div class='del'>-  You should have received a copy of the GNU Affero General Public License</div><div class='del'>-  along with this program.  If not, see</div><div class='del'>-  &lt;http://www.gnu.org/licenses/&gt;.</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='ctx'> */</div><div class='ctx'> </div><div class='ctx'> #ifndef _PROTOCOL_COMMON_H</div><div class='ctx'> #define _PROTOCOL_COMMON_H</div><div class='ctx'> </div><div class='ctx'> enum gf_fop_procnum {</div><div class='del'>-        GFS3_OP_NULL,    /* 0 */</div><div class='del'>-        GFS3_OP_STAT,</div><div class='del'>-        GFS3_OP_READLINK,</div><div class='del'>-        GFS3_OP_MKNOD,</div><div class='del'>-        GFS3_OP_MKDIR,</div><div class='del'>-        GFS3_OP_UNLINK,</div><div class='del'>-        GFS3_OP_RMDIR,</div><div class='del'>-        GFS3_OP_SYMLINK,</div><div class='del'>-        GFS3_OP_RENAME,</div><div class='del'>-        GFS3_OP_LINK,</div><div class='del'>-        GFS3_OP_TRUNCATE,</div><div class='del'>-        GFS3_OP_OPEN,</div><div class='del'>-        GFS3_OP_READ,</div><div class='del'>-        GFS3_OP_WRITE,</div><div class='del'>-        GFS3_OP_STATFS,</div><div class='del'>-        GFS3_OP_FLUSH,</div><div class='del'>-        GFS3_OP_FSYNC,</div><div class='del'>-        GFS3_OP_SETXATTR,</div><div class='del'>-        GFS3_OP_GETXATTR,</div><div class='del'>-        GFS3_OP_REMOVEXATTR,</div><div class='del'>-        GFS3_OP_OPENDIR,</div><div class='del'>-        GFS3_OP_FSYNCDIR,</div><div class='del'>-        GFS3_OP_ACCESS,</div><div class='del'>-        GFS3_OP_CREATE,</div><div class='del'>-        GFS3_OP_FTRUNCATE,</div><div class='del'>-        GFS3_OP_FSTAT,</div><div class='del'>-        GFS3_OP_LK,</div><div class='del'>-        GFS3_OP_LOOKUP,</div><div class='del'>-        GFS3_OP_READDIR,</div><div class='del'>-        GFS3_OP_INODELK,</div><div class='del'>-        GFS3_OP_FINODELK,</div><div class='del'>-	GFS3_OP_ENTRYLK,</div><div class='del'>-	GFS3_OP_FENTRYLK,</div><div class='del'>-        GFS3_OP_XATTROP,</div><div class='del'>-        GFS3_OP_FXATTROP,</div><div class='del'>-        GFS3_OP_FGETXATTR,</div><div class='del'>-        GFS3_OP_FSETXATTR,</div><div class='del'>-        GFS3_OP_RCHECKSUM,</div><div class='del'>-        GFS3_OP_SETATTR,</div><div class='del'>-        GFS3_OP_FSETATTR,</div><div class='del'>-        GFS3_OP_READDIRP,</div><div class='del'>-        GFS3_OP_RELEASE,</div><div class='del'>-        GFS3_OP_RELEASEDIR,</div><div class='del'>-        GFS3_OP_MAXVALUE,</div><div class='del'>-} ;</div><div class='add'>+    GFS3_OP_NULL, /* 0 */</div><div class='add'>+    GFS3_OP_STAT,</div><div class='add'>+    GFS3_OP_READLINK,</div><div class='add'>+    GFS3_OP_MKNOD,</div><div class='add'>+    GFS3_OP_MKDIR,</div><div class='add'>+    GFS3_OP_UNLINK,</div><div class='add'>+    GFS3_OP_RMDIR,</div><div class='add'>+    GFS3_OP_SYMLINK,</div><div class='add'>+    GFS3_OP_RENAME,</div><div class='add'>+    GFS3_OP_LINK,</div><div class='add'>+    GFS3_OP_TRUNCATE,</div><div class='add'>+    GFS3_OP_OPEN,</div><div class='add'>+    GFS3_OP_READ,</div><div class='add'>+    GFS3_OP_WRITE,</div><div class='add'>+    GFS3_OP_STATFS,</div><div class='add'>+    GFS3_OP_FLUSH,</div><div class='add'>+    GFS3_OP_FSYNC,</div><div class='add'>+    GFS3_OP_SETXATTR,</div><div class='add'>+    GFS3_OP_GETXATTR,</div><div class='add'>+    GFS3_OP_REMOVEXATTR,</div><div class='add'>+    GFS3_OP_OPENDIR,</div><div class='add'>+    GFS3_OP_FSYNCDIR,</div><div class='add'>+    GFS3_OP_ACCESS,</div><div class='add'>+    GFS3_OP_CREATE,</div><div class='add'>+    GFS3_OP_FTRUNCATE,</div><div class='add'>+    GFS3_OP_FSTAT,</div><div class='add'>+    GFS3_OP_LK,</div><div class='add'>+    GFS3_OP_LOOKUP,</div><div class='add'>+    GFS3_OP_READDIR,</div><div class='add'>+    GFS3_OP_INODELK,</div><div class='add'>+    GFS3_OP_FINODELK,</div><div class='add'>+    GFS3_OP_ENTRYLK,</div><div class='add'>+    GFS3_OP_FENTRYLK,</div><div class='add'>+    GFS3_OP_XATTROP,</div><div class='add'>+    GFS3_OP_FXATTROP,</div><div class='add'>+    GFS3_OP_FGETXATTR,</div><div class='add'>+    GFS3_OP_FSETXATTR,</div><div class='add'>+    GFS3_OP_RCHECKSUM,</div><div class='add'>+    GFS3_OP_SETATTR,</div><div class='add'>+    GFS3_OP_FSETATTR,</div><div class='add'>+    GFS3_OP_READDIRP,</div><div class='add'>+    GFS3_OP_RELEASE,</div><div class='add'>+    GFS3_OP_RELEASEDIR,</div><div class='add'>+    GFS3_OP_FREMOVEXATTR,</div><div class='add'>+    GFS3_OP_FALLOCATE,</div><div class='add'>+    GFS3_OP_DISCARD,</div><div class='add'>+    GFS3_OP_ZEROFILL,</div><div class='add'>+    GFS3_OP_IPC,</div><div class='add'>+    GFS3_OP_SEEK,</div><div class='add'>+    GFS3_OP_COMPOUND,</div><div class='add'>+    GFS3_OP_LEASE,</div><div class='add'>+    GFS3_OP_GETACTIVELK,</div><div class='add'>+    GFS3_OP_SETACTIVELK,</div><div class='add'>+    GFS3_OP_ICREATE,</div><div class='add'>+    GFS3_OP_NAMELINK,</div><div class='add'>+    GFS3_OP_PUT,</div><div class='add'>+    GFS3_OP_COPY_FILE_RANGE,</div><div class='add'>+    GFS3_OP_MAXVALUE,</div><div class='add'>+};</div><div class='ctx'> </div><div class='ctx'> enum gf_handshake_procnum {</div><div class='del'>-        GF_HNDSK_NULL,</div><div class='del'>-        GF_HNDSK_SETVOLUME,</div><div class='del'>-        GF_HNDSK_GETSPEC,</div><div class='del'>-        GF_HNDSK_PING,</div><div class='del'>-        GF_HNDSK_MAXVALUE,</div><div class='del'>-};</div><div class='del'>-</div><div class='del'>-enum gf_mgmt_procnum_ {</div><div class='del'>-        GD_MGMT_NULL,    /* 0 */</div><div class='del'>-        GD_MGMT_PROBE_QUERY,</div><div class='del'>-        GD_MGMT_FRIEND_ADD,</div><div class='del'>-        GD_MGMT_CLUSTER_LOCK,</div><div class='del'>-        GD_MGMT_CLUSTER_UNLOCK,</div><div class='del'>-        GD_MGMT_STAGE_OP,</div><div class='del'>-        GD_MGMT_COMMIT_OP,</div><div class='del'>-        GD_MGMT_FRIEND_REMOVE,</div><div class='del'>-        GD_MGMT_FRIEND_UPDATE,</div><div class='del'>-        GD_MGMT_CLI_PROBE,</div><div class='del'>-        GD_MGMT_CLI_DEPROBE,</div><div class='del'>-        GD_MGMT_CLI_LIST_FRIENDS,</div><div class='del'>-        GD_MGMT_CLI_CREATE_VOLUME,</div><div class='del'>-        GD_MGMT_CLI_GET_VOLUME,</div><div class='del'>-        GD_MGMT_CLI_DELETE_VOLUME,</div><div class='del'>-        GD_MGMT_CLI_START_VOLUME,</div><div class='del'>-        GD_MGMT_CLI_STOP_VOLUME,</div><div class='del'>-        GD_MGMT_CLI_RENAME_VOLUME,</div><div class='del'>-        GD_MGMT_CLI_DEFRAG_VOLUME,</div><div class='del'>-        GD_MGMT_CLI_SET_VOLUME,</div><div class='del'>-        GD_MGMT_CLI_ADD_BRICK,</div><div class='del'>-        GD_MGMT_CLI_REMOVE_BRICK,</div><div class='del'>-        GD_MGMT_CLI_REPLACE_BRICK,</div><div class='del'>-        GD_MGMT_CLI_LOG_FILENAME,</div><div class='del'>-        GD_MGMT_CLI_LOG_LOCATE,</div><div class='del'>-        GD_MGMT_CLI_LOG_ROTATE,</div><div class='del'>-        GD_MGMT_MAXVALUE,</div><div class='del'>-};</div><div class='del'>-</div><div class='del'>-typedef enum gf_mgmt_procnum_ gf_mgmt_procnum;</div><div class='del'>-</div><div class='del'>-enum gf_cli_procnum {</div><div class='del'>-        GF1_CLI_NULL = GD_MGMT_MAXVALUE+1,    /* 0 */</div><div class='del'>-        GF1_CLI_PROBE,</div><div class='del'>-        GF1_CLI_DEPROBE,</div><div class='del'>-        GF1_CLI_LIST_FRIENDS,</div><div class='del'>-        GF1_CLI_CREATE_VOLUME,</div><div class='del'>-        GF1_CLI_GET_VOLUME,</div><div class='del'>-        GF1_CLI_GET_NEXT_VOLUME,</div><div class='del'>-        GF1_CLI_DELETE_VOLUME,</div><div class='del'>-        GF1_CLI_START_VOLUME,</div><div class='del'>-        GF1_CLI_STOP_VOLUME,</div><div class='del'>-        GF1_CLI_RENAME_VOLUME,</div><div class='del'>-        GF1_CLI_DEFRAG_VOLUME,</div><div class='del'>-        GF1_CLI_SET_VOLUME,</div><div class='del'>-        GF1_CLI_ADD_BRICK,</div><div class='del'>-        GF1_CLI_REMOVE_BRICK,</div><div class='del'>-        GF1_CLI_REPLACE_BRICK,</div><div class='del'>-        GF1_CLI_LOG_FILENAME,</div><div class='del'>-        GF1_CLI_LOG_LOCATE,</div><div class='del'>-        GF1_CLI_LOG_ROTATE,</div><div class='del'>-        GF1_CLI_MAXVALUE,</div><div class='add'>+    GF_HNDSK_NULL,</div><div class='add'>+    GF_HNDSK_SETVOLUME,</div><div class='add'>+    GF_HNDSK_GETSPEC,</div><div class='add'>+    GF_HNDSK_PING,</div><div class='add'>+    GF_HNDSK_SET_LK_VER,</div><div class='add'>+    GF_HNDSK_EVENT_NOTIFY,</div><div class='add'>+    GF_HNDSK_GET_VOLUME_INFO,</div><div class='add'>+    GF_HNDSK_GET_SNAPSHOT_INFO,</div><div class='add'>+    GF_HNDSK_MAXVALUE,</div><div class='ctx'> };</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> enum gf_pmap_procnum {</div><div class='del'>-        GF_PMAP_NULL = 0,</div><div class='del'>-        GF_PMAP_PORTBYBRICK,</div><div class='del'>-        GF_PMAP_BRICKBYPORT,</div><div class='del'>-        GF_PMAP_SIGNUP,</div><div class='del'>-        GF_PMAP_SIGNIN,</div><div class='del'>-        GF_PMAP_SIGNOUT,</div><div class='del'>-        GF_PMAP_MAXVALUE,</div><div class='add'>+    GF_PMAP_NULL = 0,</div><div class='add'>+    GF_PMAP_PORTBYBRICK,</div><div class='add'>+    GF_PMAP_BRICKBYPORT,</div><div class='add'>+    /*</div><div class='add'>+     * SIGNUP is not used, and shouldn't be used.  It was kept here only</div><div class='add'>+     * to avoid changing the numbers for things that come after it in this</div><div class='add'>+     * list.</div><div class='add'>+     */</div><div class='add'>+    GF_PMAP_SIGNUP,</div><div class='add'>+    GF_PMAP_SIGNIN,</div><div class='add'>+    GF_PMAP_SIGNOUT,</div><div class='add'>+    GF_PMAP_MAXVALUE,</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+enum gf_aggregator_procnum {</div><div class='add'>+    GF_AGGREGATOR_NULL = 0,</div><div class='add'>+    GF_AGGREGATOR_LOOKUP,</div><div class='add'>+    GF_AGGREGATOR_GETLIMIT,</div><div class='add'>+    GF_AGGREGATOR_MAXVALUE,</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+enum gf_pmap_port_type {</div><div class='add'>+    GF_PMAP_PORT_FREE = 0,</div><div class='add'>+    GF_PMAP_PORT_FOREIGN, /* it actually means, not sure who is using it, but it</div><div class='add'>+                             is in-use */</div><div class='add'>+    GF_PMAP_PORT_LEASED,</div><div class='add'>+    GF_PMAP_PORT_ANY,</div><div class='add'>+    GF_PMAP_PORT_BRICKSERVER, /* port used by brick process */</div><div class='ctx'> };</div><div class='add'>+typedef enum gf_pmap_port_type gf_pmap_port_type_t;</div><div class='ctx'> </div><div class='ctx'> enum gf_probe_resp {</div><div class='del'>-	GF_PROBE_SUCCESS,</div><div class='del'>-	GF_PROBE_LOCALHOST,</div><div class='del'>-	GF_PROBE_FRIEND,</div><div class='add'>+    GF_PROBE_SUCCESS,</div><div class='add'>+    GF_PROBE_LOCALHOST,</div><div class='add'>+    GF_PROBE_FRIEND,</div><div class='add'>+    GF_PROBE_ANOTHER_CLUSTER,</div><div class='add'>+    GF_PROBE_VOLUME_CONFLICT,</div><div class='add'>+    GF_PROBE_SAME_UUID,</div><div class='add'>+    GF_PROBE_UNKNOWN_PEER,</div><div class='add'>+    GF_PROBE_ADD_FAILED,</div><div class='add'>+    GF_PROBE_QUORUM_NOT_MET,</div><div class='add'>+    GF_PROBE_MISSED_SNAP_CONFLICT,</div><div class='add'>+    GF_PROBE_SNAP_CONFLICT,</div><div class='add'>+    GF_PROBE_FRIEND_DETACHING,</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+enum gf_deprobe_resp {</div><div class='add'>+    GF_DEPROBE_SUCCESS,</div><div class='add'>+    GF_DEPROBE_LOCALHOST,</div><div class='add'>+    GF_DEPROBE_NOT_FRIEND,</div><div class='add'>+    GF_DEPROBE_BRICK_EXIST,</div><div class='add'>+    GF_DEPROBE_FRIEND_DOWN,</div><div class='add'>+    GF_DEPROBE_QUORUM_NOT_MET,</div><div class='add'>+    GF_DEPROBE_FRIEND_DETACHING,</div><div class='add'>+    GF_DEPROBE_SNAP_BRICK_EXIST,</div><div class='ctx'> };</div><div class='ctx'> </div><div class='ctx'> enum gf_cbk_procnum {</div><div class='del'>-        GF_CBK_NULL = 0,</div><div class='del'>-        GF_CBK_FETCHSPEC,</div><div class='del'>-        GF_CBK_INO_FLUSH,</div><div class='del'>-        GF_CBK_MAXVALUE,</div><div class='add'>+    GF_CBK_NULL = 0,</div><div class='add'>+    GF_CBK_FETCHSPEC,</div><div class='add'>+    GF_CBK_INO_FLUSH,</div><div class='add'>+    GF_CBK_EVENT_NOTIFY,</div><div class='add'>+    GF_CBK_GET_SNAPS,</div><div class='add'>+    GF_CBK_CACHE_INVALIDATION,</div><div class='add'>+    GF_CBK_CHILD_UP,</div><div class='add'>+    GF_CBK_CHILD_DOWN,</div><div class='add'>+    GF_CBK_RECALL_LEASE,</div><div class='add'>+    GF_CBK_STATEDUMP,</div><div class='add'>+    GF_CBK_INODELK_CONTENTION,</div><div class='add'>+    GF_CBK_ENTRYLK_CONTENTION,</div><div class='add'>+    GF_CBK_MAXVALUE,</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+enum gluster_cli_procnum {</div><div class='add'>+    GLUSTER_CLI_NULL, /* 0 */</div><div class='add'>+    GLUSTER_CLI_PROBE,</div><div class='add'>+    GLUSTER_CLI_DEPROBE,</div><div class='add'>+    GLUSTER_CLI_LIST_FRIENDS,</div><div class='add'>+    GLUSTER_CLI_CREATE_VOLUME,</div><div class='add'>+    GLUSTER_CLI_GET_VOLUME,</div><div class='add'>+    GLUSTER_CLI_GET_NEXT_VOLUME,</div><div class='add'>+    GLUSTER_CLI_DELETE_VOLUME,</div><div class='add'>+    GLUSTER_CLI_START_VOLUME,</div><div class='add'>+    GLUSTER_CLI_STOP_VOLUME,</div><div class='add'>+    GLUSTER_CLI_RENAME_VOLUME,</div><div class='add'>+    GLUSTER_CLI_DEFRAG_VOLUME,</div><div class='add'>+    GLUSTER_CLI_SET_VOLUME,</div><div class='add'>+    GLUSTER_CLI_ADD_BRICK,</div><div class='add'>+    GLUSTER_CLI_REMOVE_BRICK,</div><div class='add'>+    GLUSTER_CLI_REPLACE_BRICK,</div><div class='add'>+    GLUSTER_CLI_LOG_ROTATE,</div><div class='add'>+    GLUSTER_CLI_GETSPEC,</div><div class='add'>+    GLUSTER_CLI_PMAP_PORTBYBRICK,</div><div class='add'>+    GLUSTER_CLI_SYNC_VOLUME,</div><div class='add'>+    GLUSTER_CLI_RESET_VOLUME,</div><div class='add'>+    GLUSTER_CLI_FSM_LOG,</div><div class='add'>+    GLUSTER_CLI_GSYNC_SET,</div><div class='add'>+    GLUSTER_CLI_PROFILE_VOLUME,</div><div class='add'>+    GLUSTER_CLI_QUOTA,</div><div class='add'>+    GLUSTER_CLI_TOP_VOLUME,</div><div class='add'>+    GLUSTER_CLI_GETWD,</div><div class='add'>+    GLUSTER_CLI_STATUS_VOLUME,</div><div class='add'>+    GLUSTER_CLI_STATUS_ALL,</div><div class='add'>+    GLUSTER_CLI_MOUNT,</div><div class='add'>+    GLUSTER_CLI_UMOUNT,</div><div class='add'>+    GLUSTER_CLI_HEAL_VOLUME,</div><div class='add'>+    GLUSTER_CLI_STATEDUMP_VOLUME,</div><div class='add'>+    GLUSTER_CLI_LIST_VOLUME,</div><div class='add'>+    GLUSTER_CLI_CLRLOCKS_VOLUME,</div><div class='add'>+    GLUSTER_CLI_UUID_RESET,</div><div class='add'>+    GLUSTER_CLI_UUID_GET,</div><div class='add'>+    GLUSTER_CLI_COPY_FILE,</div><div class='add'>+    GLUSTER_CLI_SYS_EXEC,</div><div class='add'>+    GLUSTER_CLI_SNAP,</div><div class='add'>+    GLUSTER_CLI_BARRIER_VOLUME,</div><div class='add'>+    GLUSTER_CLI_GET_VOL_OPT,</div><div class='add'>+    GLUSTER_CLI_GANESHA,</div><div class='add'>+    GLUSTER_CLI_BITROT,</div><div class='add'>+    GLUSTER_CLI_ATTACH_TIER,</div><div class='add'>+    GLUSTER_CLI_TIER,</div><div class='add'>+    GLUSTER_CLI_GET_STATE,</div><div class='add'>+    GLUSTER_CLI_RESET_BRICK,</div><div class='add'>+    GLUSTER_CLI_REMOVE_TIER_BRICK,</div><div class='add'>+    GLUSTER_CLI_ADD_TIER_BRICK,</div><div class='add'>+    GLUSTER_CLI_MAXVALUE,</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+enum glusterd_mgmt_procnum {</div><div class='add'>+    GLUSTERD_MGMT_NULL, /* 0 */</div><div class='add'>+    GLUSTERD_MGMT_CLUSTER_LOCK,</div><div class='add'>+    GLUSTERD_MGMT_CLUSTER_UNLOCK,</div><div class='add'>+    GLUSTERD_MGMT_STAGE_OP,</div><div class='add'>+    GLUSTERD_MGMT_COMMIT_OP,</div><div class='add'>+    GLUSTERD_MGMT_MAXVALUE,</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+enum glusterd_friend_procnum {</div><div class='add'>+    GLUSTERD_FRIEND_NULL, /* 0 */</div><div class='add'>+    GLUSTERD_PROBE_QUERY,</div><div class='add'>+    GLUSTERD_FRIEND_ADD,</div><div class='add'>+    GLUSTERD_FRIEND_REMOVE,</div><div class='add'>+    GLUSTERD_FRIEND_UPDATE,</div><div class='add'>+    GLUSTERD_FRIEND_MAXVALUE,</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+enum glusterd_brick_procnum {</div><div class='add'>+    GLUSTERD_BRICK_NULL, /* 0 */</div><div class='add'>+    GLUSTERD_BRICK_TERMINATE,</div><div class='add'>+    GLUSTERD_BRICK_XLATOR_INFO,</div><div class='add'>+    GLUSTERD_BRICK_XLATOR_OP,</div><div class='add'>+    GLUSTERD_BRICK_STATUS,</div><div class='add'>+    GLUSTERD_BRICK_OP,</div><div class='add'>+    GLUSTERD_BRICK_XLATOR_DEFRAG,</div><div class='add'>+    GLUSTERD_NODE_PROFILE,</div><div class='add'>+    GLUSTERD_NODE_STATUS,</div><div class='add'>+    GLUSTERD_VOLUME_BARRIER_OP,</div><div class='add'>+    GLUSTERD_BRICK_BARRIER,</div><div class='add'>+    GLUSTERD_NODE_BITROT,</div><div class='add'>+    GLUSTERD_BRICK_ATTACH,</div><div class='add'>+    GLUSTERD_DUMP_METRICS,</div><div class='add'>+    GLUSTERD_SVC_ATTACH,</div><div class='add'>+    GLUSTERD_SVC_DETACH,</div><div class='add'>+    GLUSTERD_BRICK_MAXVALUE,</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+enum glusterd_mgmt_hndsk_procnum {</div><div class='add'>+    GD_MGMT_HNDSK_NULL,</div><div class='add'>+    GD_MGMT_HNDSK_VERSIONS,</div><div class='add'>+    GD_MGMT_HNDSK_VERSIONS_ACK,</div><div class='add'>+    GD_MGMT_HNDSK_MAXVALUE,</div><div class='ctx'> };</div><div class='ctx'> </div><div class='del'>-#define GLUSTER3_1_FOP_PROGRAM   1298437 /* Completely random */</div><div class='del'>-#define GLUSTER3_1_FOP_VERSION   310 /* 3.1.0 */</div><div class='del'>-#define GLUSTER3_1_FOP_PROCCNT   GFS3_OP_MAXVALUE</div><div class='add'>+typedef enum {</div><div class='add'>+    GF_SHD_OP_INVALID,</div><div class='add'>+    GF_SHD_OP_HEAL_INDEX,</div><div class='add'>+    GF_SHD_OP_HEAL_FULL,</div><div class='add'>+    GF_SHD_OP_INDEX_SUMMARY,</div><div class='add'>+    GF_SHD_OP_HEALED_FILES,</div><div class='add'>+    GF_SHD_OP_HEAL_FAILED_FILES,</div><div class='add'>+    GF_SHD_OP_SPLIT_BRAIN_FILES,</div><div class='add'>+    GF_SHD_OP_STATISTICS,</div><div class='add'>+    GF_SHD_OP_STATISTICS_HEAL_COUNT,</div><div class='add'>+    GF_SHD_OP_STATISTICS_HEAL_COUNT_PER_REPLICA,</div><div class='add'>+    GF_SHD_OP_SBRAIN_HEAL_FROM_BIGGER_FILE,</div><div class='add'>+    GF_SHD_OP_SBRAIN_HEAL_FROM_BRICK,</div><div class='add'>+    GF_SHD_OP_HEAL_ENABLE,</div><div class='add'>+    GF_SHD_OP_HEAL_DISABLE,</div><div class='add'>+    GF_SHD_OP_SBRAIN_HEAL_FROM_LATEST_MTIME,</div><div class='add'>+    GF_SHD_OP_GRANULAR_ENTRY_HEAL_ENABLE,</div><div class='add'>+    GF_SHD_OP_GRANULAR_ENTRY_HEAL_DISABLE,</div><div class='add'>+    GF_SHD_OP_HEAL_SUMMARY,</div><div class='add'>+} gf_xl_afr_op_t;</div><div class='add'>+</div><div class='add'>+struct gf_gsync_detailed_status_ {</div><div class='add'>+    char node[NAME_MAX];</div><div class='add'>+    char master[NAME_MAX];</div><div class='add'>+    char brick[PATH_MAX];</div><div class='add'>+    char slave_user[NAME_MAX];</div><div class='add'>+    char slave[NAME_MAX];</div><div class='add'>+    char slave_node[NAME_MAX];</div><div class='add'>+    char worker_status[NAME_MAX];</div><div class='add'>+    char crawl_status[NAME_MAX];</div><div class='add'>+    char last_synced[NAME_MAX];</div><div class='add'>+    char last_synced_utc[NAME_MAX];</div><div class='add'>+    char entry[NAME_MAX];</div><div class='add'>+    char data[NAME_MAX];</div><div class='add'>+    char meta[NAME_MAX];</div><div class='add'>+    char failures[NAME_MAX];</div><div class='add'>+    char checkpoint_time[NAME_MAX];</div><div class='add'>+    char checkpoint_time_utc[NAME_MAX];</div><div class='add'>+    char checkpoint_completed[NAME_MAX];</div><div class='add'>+    char checkpoint_completion_time[NAME_MAX];</div><div class='add'>+    char checkpoint_completion_time_utc[NAME_MAX];</div><div class='add'>+    char brick_host_uuid[NAME_MAX];</div><div class='add'>+    char slavekey[NAME_MAX];</div><div class='add'>+    char session_slave[NAME_MAX];</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+enum glusterd_mgmt_v3_procnum {</div><div class='add'>+    GLUSTERD_MGMT_V3_NULL, /* 0 */</div><div class='add'>+    GLUSTERD_MGMT_V3_LOCK,</div><div class='add'>+    GLUSTERD_MGMT_V3_PRE_VALIDATE,</div><div class='add'>+    GLUSTERD_MGMT_V3_BRICK_OP,</div><div class='add'>+    GLUSTERD_MGMT_V3_COMMIT,</div><div class='add'>+    GLUSTERD_MGMT_V3_POST_COMMIT,</div><div class='add'>+    GLUSTERD_MGMT_V3_POST_VALIDATE,</div><div class='add'>+    GLUSTERD_MGMT_V3_UNLOCK,</div><div class='add'>+    GLUSTERD_MGMT_V3_MAXVALUE,</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+typedef struct gf_gsync_detailed_status_ gf_gsync_status_t;</div><div class='add'>+</div><div class='add'>+enum gf_get_volume_info_type {</div><div class='add'>+    GF_GET_VOLUME_NONE, /* 0 */</div><div class='add'>+    GF_GET_VOLUME_UUID</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+typedef enum gf_get_volume_info_type gf_get_volume_info_type;</div><div class='add'>+</div><div class='add'>+enum gf_get_snapshot_info_type {</div><div class='add'>+    GF_GET_SNAPSHOT_LIST,</div><div class='add'>+};</div><div class='add'>+typedef enum gf_get_snapshot_info_type gf_get_snapshot_info_type;</div><div class='add'>+</div><div class='add'>+enum gf_getspec_flags_type { GF_GETSPEC_FLAG_SERVERS_LIST = 1 };</div><div class='add'>+typedef enum gf_getspec_flags_type gf_getspec_flags_type;</div><div class='add'>+</div><div class='add'>+#define GLUSTER_HNDSK_PROGRAM 14398633 /* Completely random */</div><div class='add'>+#define GLUSTER_HNDSK_VERSION 2        /* 0.0.2 */</div><div class='add'>+</div><div class='add'>+#define GLUSTER_PMAP_PROGRAM 34123456</div><div class='add'>+#define GLUSTER_PMAP_VERSION 1</div><div class='add'>+</div><div class='add'>+#define GLUSTER_CBK_PROGRAM 52743234 /* Completely random */</div><div class='add'>+#define GLUSTER_CBK_VERSION 1        /* 0.0.1 */</div><div class='add'>+</div><div class='add'>+#define GLUSTER_FOP_PROGRAM 1298437 /* Completely random */</div><div class='add'>+#define GLUSTER_FOP_VERSION 330     /* 3.3.0 */</div><div class='add'>+#define GLUSTER_FOP_PROCCNT GFS3_OP_MAXVALUE</div><div class='add'>+</div><div class='add'>+#define GLUSTER_FOP_VERSION_v2 400 /* 4.0.0 */</div><div class='add'>+</div><div class='add'>+/* Aggregator */</div><div class='add'>+#define GLUSTER_AGGREGATOR_PROGRAM 29852134 /* Completely random */</div><div class='add'>+#define GLUSTER_AGGREGATOR_VERSION 1</div><div class='add'>+</div><div class='add'>+/* Second version */</div><div class='add'>+#define GD_MGMT_PROGRAM 1238433 /* Completely random */</div><div class='add'>+#define GD_MGMT_VERSION 2       /* 0.0.2 */</div><div class='add'>+</div><div class='add'>+#define GD_FRIEND_PROGRAM 1238437 /* Completely random */</div><div class='add'>+#define GD_FRIEND_VERSION 2       /* 0.0.2 */</div><div class='ctx'> </div><div class='del'>-#define GLUSTERD1_MGMT_PROGRAM   1298433 /* Completely random */</div><div class='del'>-#define GLUSTERD1_MGMT_VERSION   1   /* 0.0.1 */</div><div class='del'>-#define GLUSTERD1_MGMT_PROCCNT   GD_MGMT_MAXVALUE</div><div class='add'>+#define GLUSTER_CLI_PROGRAM 1238463 /* Completely random */</div><div class='add'>+#define GLUSTER_CLI_VERSION 2       /* 0.0.2 */</div><div class='ctx'> </div><div class='del'>-#define GLUSTER3_1_CLI_PROGRAM   1298433 /* Completely random */</div><div class='del'>-#define GLUSTER3_1_CLI_VERSION   1   /* 0.0.1 */</div><div class='del'>-#define GLUSTER3_1_CLI_PROCCNT   GF1_CLI_MAXVALUE</div><div class='add'>+#define GD_BRICK_PROGRAM 4867634 /*Completely random*/</div><div class='add'>+#define GD_BRICK_VERSION 2</div><div class='ctx'> </div><div class='del'>-#define GLUSTER_HNDSK_PROGRAM    14398633 /* Completely random */</div><div class='del'>-#define GLUSTER_HNDSK_VERSION    1   /* 0.0.1 */</div><div class='add'>+/* Third version */</div><div class='add'>+#define GD_MGMT_V3_VERSION 3</div><div class='ctx'> </div><div class='del'>-#define GLUSTER_PMAP_PROGRAM     34123456</div><div class='del'>-#define GLUSTER_PMAP_VERSION     1</div><div class='add'>+/* OP-VERSION handshake */</div><div class='add'>+#define GD_MGMT_HNDSK_PROGRAM 1239873 /* Completely random */</div><div class='add'>+#define GD_MGMT_HNDSK_VERSION 1</div><div class='ctx'> </div><div class='del'>-#define GLUSTER_CBK_PROGRAM      52743234 /* Completely random */</div><div class='del'>-#define GLUSTER_CBK_VERSION      1   /* 0.0.1 */</div><div class='add'>+#define GD_VOLUME_NAME_MAX                                                     \</div><div class='add'>+    ((NAME_MAX + 1) - 5) /* Maximum size of volume name */</div><div class='add'>+#define GD_VOLUME_NAME_MAX_TIER                                                \</div><div class='add'>+    (GD_VOLUME_NAME_MAX + 5) /* +5 needed for '-hot'                           \</div><div class='add'>+                                and '-cold' suffixes*/</div><div class='ctx'> </div><div class='add'>+#define GLUSTER_PROCESS_UUID_FMT                                               \</div><div class='add'>+    "CTX_ID:%s-GRAPH_ID:%d-PID:%d-HOST:%s-PC_NAME:%s-RECON_NO:%s"</div><div class='ctx'> #endif /* !_PROTOCOL_COMMON_H */</div><div class='head'>diff --git a/rpc/rpc-lib/src/rpc-clnt-ping.c b/rpc/rpc-lib/src/rpc-clnt-ping.c<br/>new file mode 100644<br/>index 00000000000..31f17841bea<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/rpc/rpc-lib/src/rpc-clnt-ping.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>rpc/rpc-lib/src/rpc-clnt-ping.c</a></div><div class='hunk'>@@ -0,0 +1,357 @@</div><div class='add'>+/*</div><div class='add'>+  Copyright (c) 2014 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#include "rpc-clnt.h"</div><div class='add'>+#include "rpc-clnt-ping.h"</div><div class='add'>+#include &lt;glusterfs/byte-order.h&gt;</div><div class='add'>+#include "xdr-rpcclnt.h"</div><div class='add'>+#include "rpc-transport.h"</div><div class='add'>+#include "protocol-common.h"</div><div class='add'>+#include &lt;glusterfs/mem-pool.h&gt;</div><div class='add'>+#include "xdr-rpc.h"</div><div class='add'>+#include "rpc-common-xdr.h"</div><div class='add'>+#include &lt;glusterfs/timespec.h&gt;</div><div class='add'>+</div><div class='add'>+char *clnt_ping_procs[GF_DUMP_MAXVALUE] = {</div><div class='add'>+    [GF_DUMP_PING] = "NULL",</div><div class='add'>+};</div><div class='add'>+struct rpc_clnt_program clnt_ping_prog = {</div><div class='add'>+    .progname = "GF-DUMP",</div><div class='add'>+    .prognum = GLUSTER_DUMP_PROGRAM,</div><div class='add'>+    .progver = GLUSTER_DUMP_VERSION,</div><div class='add'>+    .procnames = clnt_ping_procs,</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct ping_local {</div><div class='add'>+    struct rpc_clnt *rpc;</div><div class='add'>+    struct timespec submit_time;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+/* Must be called under conn-&gt;lock */</div><div class='add'>+static int</div><div class='add'>+__rpc_clnt_rearm_ping_timer(struct rpc_clnt *rpc, gf_timer_cbk_t cbk)</div><div class='add'>+{</div><div class='add'>+    rpc_clnt_connection_t *conn = &amp;rpc-&gt;conn;</div><div class='add'>+    rpc_transport_t *trans = conn-&gt;trans;</div><div class='add'>+    struct timespec timeout = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    gf_timer_t *timer = NULL;</div><div class='add'>+</div><div class='add'>+    if (conn-&gt;ping_timer) {</div><div class='add'>+        gf_log_callingfn("", GF_LOG_CRITICAL,</div><div class='add'>+                         "%s: ping timer event already scheduled",</div><div class='add'>+                         conn-&gt;trans-&gt;peerinfo.identifier);</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    timeout.tv_sec = conn-&gt;ping_timeout;</div><div class='add'>+    timeout.tv_nsec = 0;</div><div class='add'>+</div><div class='add'>+    rpc_clnt_ref(rpc);</div><div class='add'>+    timer = gf_timer_call_after(rpc-&gt;ctx, timeout, cbk, (void *)rpc);</div><div class='add'>+    if (timer == NULL) {</div><div class='add'>+        gf_log(trans-&gt;name, GF_LOG_WARNING, "unable to setup ping timer");</div><div class='add'>+</div><div class='add'>+        /* This unref can't be the last. We just took a ref few lines</div><div class='add'>+         * above. So this can be performed under conn-&gt;lock. */</div><div class='add'>+        rpc_clnt_unref(rpc);</div><div class='add'>+        conn-&gt;ping_started = 0;</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    conn-&gt;ping_timer = timer;</div><div class='add'>+    conn-&gt;ping_started = 1;</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* Must be called under conn-&gt;lock */</div><div class='add'>+int</div><div class='add'>+rpc_clnt_remove_ping_timer_locked(struct rpc_clnt *rpc)</div><div class='add'>+{</div><div class='add'>+    rpc_clnt_connection_t *conn = &amp;rpc-&gt;conn;</div><div class='add'>+    gf_timer_t *timer = NULL;</div><div class='add'>+</div><div class='add'>+    if (conn-&gt;ping_timer) {</div><div class='add'>+        timer = conn-&gt;ping_timer;</div><div class='add'>+        conn-&gt;ping_timer = NULL;</div><div class='add'>+        gf_timer_call_cancel(rpc-&gt;ctx, timer);</div><div class='add'>+        conn-&gt;ping_started = 0;</div><div class='add'>+        return 1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* This is to account for rpc_clnt_disable that might have set</div><div class='add'>+     *  conn-&gt;trans to NULL. */</div><div class='add'>+    if (conn-&gt;trans)</div><div class='add'>+        gf_log_callingfn("", GF_LOG_DEBUG,</div><div class='add'>+                         "%s: ping timer event "</div><div class='add'>+                         "already removed",</div><div class='add'>+                         conn-&gt;trans-&gt;peerinfo.identifier);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+rpc_clnt_start_ping(void *rpc_ptr);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+rpc_clnt_ping_timer_expired(void *rpc_ptr)</div><div class='add'>+{</div><div class='add'>+    struct rpc_clnt *rpc = NULL;</div><div class='add'>+    rpc_transport_t *trans = NULL;</div><div class='add'>+    rpc_clnt_connection_t *conn = NULL;</div><div class='add'>+    int disconnect = 0;</div><div class='add'>+    struct timespec current = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int unref = 0;</div><div class='add'>+</div><div class='add'>+    rpc = (struct rpc_clnt *)rpc_ptr;</div><div class='add'>+    conn = &amp;rpc-&gt;conn;</div><div class='add'>+    trans = conn-&gt;trans;</div><div class='add'>+</div><div class='add'>+    if (!trans) {</div><div class='add'>+        gf_log("ping-timer", GF_LOG_WARNING, "transport not initialized");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    timespec_now_realtime(&amp;current);</div><div class='add'>+    pthread_mutex_lock(&amp;conn-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        unref = rpc_clnt_remove_ping_timer_locked(rpc);</div><div class='add'>+</div><div class='add'>+        if (((current.tv_sec - conn-&gt;last_received.tv_sec) &lt;</div><div class='add'>+             conn-&gt;ping_timeout) ||</div><div class='add'>+            ((current.tv_sec - conn-&gt;last_sent.tv_sec) &lt; conn-&gt;ping_timeout)) {</div><div class='add'>+            gf_log(trans-&gt;name, GF_LOG_TRACE,</div><div class='add'>+                   "ping timer expired but transport activity "</div><div class='add'>+                   "detected - not bailing transport");</div><div class='add'>+            if (__rpc_clnt_rearm_ping_timer(rpc, rpc_clnt_ping_timer_expired) ==</div><div class='add'>+                -1) {</div><div class='add'>+                gf_log(trans-&gt;name, GF_LOG_WARNING,</div><div class='add'>+                       "unable to setup ping timer");</div><div class='add'>+            }</div><div class='add'>+        } else {</div><div class='add'>+            conn-&gt;ping_started = 0;</div><div class='add'>+            disconnect = 1;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    pthread_mutex_unlock(&amp;conn-&gt;lock);</div><div class='add'>+</div><div class='add'>+    if (unref)</div><div class='add'>+        rpc_clnt_unref(rpc);</div><div class='add'>+</div><div class='add'>+    if (disconnect) {</div><div class='add'>+        gf_log(trans-&gt;name, GF_LOG_CRITICAL,</div><div class='add'>+               "server %s has not responded in the last %d "</div><div class='add'>+               "seconds, disconnecting.",</div><div class='add'>+               trans-&gt;peerinfo.identifier, conn-&gt;ping_timeout);</div><div class='add'>+</div><div class='add'>+        rpc_transport_disconnect(conn-&gt;trans, _gf_false);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+rpc_clnt_ping_cbk(struct rpc_req *req, struct iovec *iov, int count,</div><div class='add'>+                  void *myframe)</div><div class='add'>+{</div><div class='add'>+    struct ping_local *local = NULL;</div><div class='add'>+    xlator_t *this = NULL;</div><div class='add'>+    rpc_clnt_connection_t *conn = NULL;</div><div class='add'>+    call_frame_t *frame = NULL;</div><div class='add'>+    int unref = 0;</div><div class='add'>+    gf_boolean_t call_notify = _gf_false;</div><div class='add'>+</div><div class='add'>+    struct timespec now;</div><div class='add'>+    struct timespec delta;</div><div class='add'>+    int64_t latency_msec = 0;</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    if (!myframe) {</div><div class='add'>+        gf_log(THIS-&gt;name, GF_LOG_WARNING, "frame with the request is NULL");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    frame = myframe;</div><div class='add'>+    this = frame-&gt;this;</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    conn = &amp;local-&gt;rpc-&gt;conn;</div><div class='add'>+</div><div class='add'>+    timespec_now(&amp;now);</div><div class='add'>+    timespec_sub(&amp;local-&gt;submit_time, &amp;now, &amp;delta);</div><div class='add'>+    latency_msec = delta.tv_sec * 1000 + delta.tv_nsec / 1000000;</div><div class='add'>+</div><div class='add'>+    gf_log(THIS-&gt;name, GF_LOG_DEBUG, "Ping latency is %" PRIu64 "ms",</div><div class='add'>+           latency_msec);</div><div class='add'>+    call_notify = _gf_true;</div><div class='add'>+</div><div class='add'>+    pthread_mutex_lock(&amp;conn-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        unref = rpc_clnt_remove_ping_timer_locked(local-&gt;rpc);</div><div class='add'>+        if (req-&gt;rpc_status == -1) {</div><div class='add'>+            conn-&gt;ping_started = 0;</div><div class='add'>+            pthread_mutex_unlock(&amp;conn-&gt;lock);</div><div class='add'>+            if (unref) {</div><div class='add'>+                gf_log(this-&gt;name, GF_LOG_WARNING,</div><div class='add'>+                       "socket or ib related error");</div><div class='add'>+</div><div class='add'>+            } else {</div><div class='add'>+                /* timer expired and transport bailed out */</div><div class='add'>+                gf_log(this-&gt;name, GF_LOG_WARNING, "socket disconnected");</div><div class='add'>+            }</div><div class='add'>+            goto after_unlock;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        if (__rpc_clnt_rearm_ping_timer(local-&gt;rpc, rpc_clnt_start_ping) ==</div><div class='add'>+            -1) {</div><div class='add'>+            /* unlock before logging error */</div><div class='add'>+            pthread_mutex_unlock(&amp;conn-&gt;lock);</div><div class='add'>+            gf_log(this-&gt;name, GF_LOG_WARNING, "failed to set the ping timer");</div><div class='add'>+        } else {</div><div class='add'>+            /* just unlock the mutex */</div><div class='add'>+            pthread_mutex_unlock(&amp;conn-&gt;lock);</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+after_unlock:</div><div class='add'>+    if (call_notify) {</div><div class='add'>+        ret = local-&gt;rpc-&gt;notifyfn(local-&gt;rpc, this, RPC_CLNT_PING,</div><div class='add'>+                                   (void *)(uintptr_t)latency_msec);</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_log(this-&gt;name, GF_LOG_WARNING, "RPC_CLNT_PING notify failed");</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+out:</div><div class='add'>+    if (unref)</div><div class='add'>+        rpc_clnt_unref(local-&gt;rpc);</div><div class='add'>+</div><div class='add'>+    if (frame) {</div><div class='add'>+        GF_FREE(frame-&gt;local);</div><div class='add'>+        frame-&gt;local = NULL;</div><div class='add'>+        STACK_DESTROY(frame-&gt;root);</div><div class='add'>+    }</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+rpc_clnt_ping(struct rpc_clnt *rpc)</div><div class='add'>+{</div><div class='add'>+    call_frame_t *frame = NULL;</div><div class='add'>+    int32_t ret = -1;</div><div class='add'>+    rpc_clnt_connection_t *conn = NULL;</div><div class='add'>+    struct ping_local *local = NULL;</div><div class='add'>+</div><div class='add'>+    conn = &amp;rpc-&gt;conn;</div><div class='add'>+    local = GF_MALLOC(sizeof(struct ping_local), gf_common_ping_local_t);</div><div class='add'>+    if (!local)</div><div class='add'>+        return ret;</div><div class='add'>+    frame = create_frame(THIS, THIS-&gt;ctx-&gt;pool);</div><div class='add'>+    if (!frame) {</div><div class='add'>+        GF_FREE(local);</div><div class='add'>+        return ret;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    local-&gt;rpc = rpc;</div><div class='add'>+    timespec_now(&amp;local-&gt;submit_time);</div><div class='add'>+    frame-&gt;local = local;</div><div class='add'>+</div><div class='add'>+    ret = rpc_clnt_submit(rpc, &amp;clnt_ping_prog, GF_DUMP_PING, rpc_clnt_ping_cbk,</div><div class='add'>+                          NULL, 0, NULL, 0, NULL, frame, NULL, 0, NULL, 0,</div><div class='add'>+                          NULL);</div><div class='add'>+    if (ret) {</div><div class='add'>+        /* FIXME: should we free the frame here? Methinks so! */</div><div class='add'>+        gf_log(THIS-&gt;name, GF_LOG_ERROR, "failed to start ping timer");</div><div class='add'>+    } else {</div><div class='add'>+        /* ping successfully queued in list of saved frames</div><div class='add'>+         * for the connection*/</div><div class='add'>+        pthread_mutex_lock(&amp;conn-&gt;lock);</div><div class='add'>+        conn-&gt;pingcnt++;</div><div class='add'>+        pthread_mutex_unlock(&amp;conn-&gt;lock);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+rpc_clnt_start_ping(void *rpc_ptr)</div><div class='add'>+{</div><div class='add'>+    struct rpc_clnt *rpc = NULL;</div><div class='add'>+    rpc_clnt_connection_t *conn = NULL;</div><div class='add'>+    int frame_count = 0;</div><div class='add'>+    int unref = 0;</div><div class='add'>+</div><div class='add'>+    rpc = (struct rpc_clnt *)rpc_ptr;</div><div class='add'>+    conn = &amp;rpc-&gt;conn;</div><div class='add'>+</div><div class='add'>+    if (conn-&gt;ping_timeout == 0) {</div><div class='add'>+        gf_log(THIS-&gt;name, GF_LOG_DEBUG,</div><div class='add'>+               "ping timeout is 0,"</div><div class='add'>+               " returning");</div><div class='add'>+        return;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    pthread_mutex_lock(&amp;conn-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        unref = rpc_clnt_remove_ping_timer_locked(rpc);</div><div class='add'>+</div><div class='add'>+        if (conn-&gt;saved_frames) {</div><div class='add'>+            GF_ASSERT(conn-&gt;saved_frames-&gt;count &gt;= 0);</div><div class='add'>+            /* treat the case where conn-&gt;saved_frames is NULL</div><div class='add'>+               as no pending frames */</div><div class='add'>+            frame_count = conn-&gt;saved_frames-&gt;count;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        if ((frame_count == 0) || !conn-&gt;connected) {</div><div class='add'>+            gf_log(THIS-&gt;name, GF_LOG_DEBUG,</div><div class='add'>+                   "returning as transport is already disconnected"</div><div class='add'>+                   " OR there are no frames (%d || %d)",</div><div class='add'>+                   !conn-&gt;connected, frame_count);</div><div class='add'>+</div><div class='add'>+            pthread_mutex_unlock(&amp;conn-&gt;lock);</div><div class='add'>+            if (unref)</div><div class='add'>+                rpc_clnt_unref(rpc);</div><div class='add'>+            return;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        if (__rpc_clnt_rearm_ping_timer(rpc, rpc_clnt_ping_timer_expired) ==</div><div class='add'>+            -1) {</div><div class='add'>+            gf_log(THIS-&gt;name, GF_LOG_WARNING, "unable to setup ping timer");</div><div class='add'>+            pthread_mutex_unlock(&amp;conn-&gt;lock);</div><div class='add'>+            if (unref)</div><div class='add'>+                rpc_clnt_unref(rpc);</div><div class='add'>+            return;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    pthread_mutex_unlock(&amp;conn-&gt;lock);</div><div class='add'>+    if (unref)</div><div class='add'>+        rpc_clnt_unref(rpc);</div><div class='add'>+</div><div class='add'>+    rpc_clnt_ping(rpc);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+rpc_clnt_check_and_start_ping(struct rpc_clnt *rpc)</div><div class='add'>+{</div><div class='add'>+    char start_ping = 0;</div><div class='add'>+</div><div class='add'>+    pthread_mutex_lock(&amp;rpc-&gt;conn.lock);</div><div class='add'>+    {</div><div class='add'>+        if (!rpc-&gt;conn.ping_started)</div><div class='add'>+            start_ping = 1;</div><div class='add'>+    }</div><div class='add'>+    pthread_mutex_unlock(&amp;rpc-&gt;conn.lock);</div><div class='add'>+</div><div class='add'>+    if (start_ping)</div><div class='add'>+        rpc_clnt_start_ping((void *)rpc);</div><div class='add'>+</div><div class='add'>+    return;</div><div class='add'>+}</div><div class='head'>diff --git a/rpc/rpc-lib/src/rpc-clnt-ping.h b/rpc/rpc-lib/src/rpc-clnt-ping.h<br/>new file mode 100644<br/>index 00000000000..e5466a828c2<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/rpc/rpc-lib/src/rpc-clnt-ping.h?id=d1d7a6f35c816822fab51c820e25023863c239c1'>rpc/rpc-lib/src/rpc-clnt-ping.h</a></div><div class='hunk'>@@ -0,0 +1,16 @@</div><div class='add'>+/*</div><div class='add'>+  Copyright (c) 2014 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+struct rpc_clnt;</div><div class='add'>+#define RPC_DEFAULT_PING_TIMEOUT 30</div><div class='add'>+void</div><div class='add'>+rpc_clnt_check_and_start_ping(struct rpc_clnt *rpc_ptr);</div><div class='add'>+int</div><div class='add'>+rpc_clnt_remove_ping_timer_locked(struct rpc_clnt *rpc);</div><div class='head'>diff --git a/rpc/rpc-lib/src/rpc-clnt.c b/rpc/rpc-lib/src/rpc-clnt.c<br/>index 52316a03a58..517037c4a5d 100644<br/>--- a/<a href='/cgit/glusterfs.git/tree/rpc/rpc-lib/src/rpc-clnt.c?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>rpc/rpc-lib/src/rpc-clnt.c</a><br/>+++ b/<a href='/cgit/glusterfs.git/tree/rpc/rpc-lib/src/rpc-clnt.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>rpc/rpc-lib/src/rpc-clnt.c</a></div><div class='hunk'>@@ -1,465 +1,480 @@</div><div class='ctx'> /*</div><div class='del'>-  Copyright (c) 2010 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='add'>+  Copyright (c) 2008-2012 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='ctx'>   This file is part of GlusterFS.</div><div class='ctx'> </div><div class='del'>-  GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-  it under the terms of the GNU Affero General Public License as published</div><div class='del'>-  by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-  or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-  GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-  WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-  Affero General Public License for more details.</div><div class='del'>-</div><div class='del'>-  You should have received a copy of the GNU Affero General Public License</div><div class='del'>-  along with this program.  If not, see</div><div class='del'>-  &lt;http://www.gnu.org/licenses/&gt;.</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='ctx'> */</div><div class='ctx'> </div><div class='del'>-</div><div class='del'>-#ifndef _CONFIG_H</div><div class='del'>-#define _CONFIG_H</div><div class='del'>-#include "config.h"</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-#define RPC_CLNT_DEFAULT_REQUEST_COUNT 4096</div><div class='add'>+#define RPC_CLNT_DEFAULT_REQUEST_COUNT 512</div><div class='ctx'> </div><div class='ctx'> #include "rpc-clnt.h"</div><div class='del'>-#include "byte-order.h"</div><div class='add'>+#include "rpc-clnt-ping.h"</div><div class='add'>+#include &lt;glusterfs/byte-order.h&gt;</div><div class='ctx'> #include "xdr-rpcclnt.h"</div><div class='ctx'> #include "rpc-transport.h"</div><div class='ctx'> #include "protocol-common.h"</div><div class='del'>-#include "mem-pool.h"</div><div class='add'>+#include &lt;glusterfs/mem-pool.h&gt;</div><div class='ctx'> #include "xdr-rpc.h"</div><div class='add'>+#include "rpc-common-xdr.h"</div><div class='ctx'> </div><div class='ctx'> void</div><div class='del'>-rpc_clnt_reply_deinit (struct rpc_req *req, struct mem_pool *pool);</div><div class='add'>+rpc_clnt_reply_deinit(struct rpc_req *req, struct mem_pool *pool);</div><div class='ctx'> </div><div class='del'>-uint64_t</div><div class='del'>-rpc_clnt_new_callid (struct rpc_clnt *clnt)</div><div class='add'>+struct saved_frame *</div><div class='add'>+__saved_frames_get_timedout(struct saved_frames *frames, uint32_t timeout,</div><div class='add'>+                            struct timeval *current)</div><div class='ctx'> {</div><div class='del'>-        uint64_t callid = 0;</div><div class='add'>+    struct saved_frame *bailout_frame = NULL, *tmp = NULL;</div><div class='ctx'> </div><div class='del'>-        pthread_mutex_lock (&amp;clnt-&gt;lock);</div><div class='del'>-        {</div><div class='del'>-                callid = ++clnt-&gt;xid;</div><div class='add'>+    if (!list_empty(&amp;frames-&gt;sf.list)) {</div><div class='add'>+        tmp = list_entry(frames-&gt;sf.list.next, typeof(*tmp), list);</div><div class='add'>+        if ((tmp-&gt;saved_at.tv_sec + timeout) &lt;= current-&gt;tv_sec) {</div><div class='add'>+            bailout_frame = tmp;</div><div class='add'>+            list_del_init(&amp;bailout_frame-&gt;list);</div><div class='add'>+            frames-&gt;count--;</div><div class='ctx'>         }</div><div class='del'>-        pthread_mutex_unlock (&amp;clnt-&gt;lock);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        return callid;</div><div class='add'>+    return bailout_frame;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='del'>-struct saved_frame *</div><div class='del'>-__saved_frames_get_timedout (struct saved_frames *frames, uint32_t timeout,</div><div class='del'>-                             struct timeval *current)</div><div class='add'>+static int</div><div class='add'>+_is_lock_fop(struct saved_frame *sframe)</div><div class='ctx'> {</div><div class='del'>-	struct saved_frame *bailout_frame = NULL, *tmp = NULL;</div><div class='del'>-</div><div class='del'>-	if (!list_empty(&amp;frames-&gt;sf.list)) {</div><div class='del'>-		tmp = list_entry (frames-&gt;sf.list.next, typeof (*tmp), list);</div><div class='del'>-		if ((tmp-&gt;saved_at.tv_sec + timeout) &lt; current-&gt;tv_sec) {</div><div class='del'>-			bailout_frame = tmp;</div><div class='del'>-			list_del_init (&amp;bailout_frame-&gt;list);</div><div class='del'>-			frames-&gt;count--;</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	return bailout_frame;</div><div class='del'>-}</div><div class='add'>+    int fop = 0;</div><div class='ctx'> </div><div class='add'>+    if (SFRAME_GET_PROGNUM(sframe) == GLUSTER_FOP_PROGRAM &amp;&amp;</div><div class='add'>+        SFRAME_GET_PROGVER(sframe) == GLUSTER_FOP_VERSION)</div><div class='add'>+        fop = SFRAME_GET_PROCNUM(sframe);</div><div class='ctx'> </div><div class='del'>-struct saved_frame *</div><div class='del'>-__saved_frames_put (struct saved_frames *frames, void *frame,</div><div class='del'>-                    struct rpc_req *rpcreq)</div><div class='del'>-{</div><div class='del'>-	struct saved_frame *saved_frame = NULL;</div><div class='del'>-</div><div class='del'>-        saved_frame = mem_get (rpcreq-&gt;conn-&gt;rpc_clnt-&gt;saved_frames_pool);</div><div class='del'>-	if (!saved_frame) {</div><div class='del'>-                gf_log ("rpc-clnt", GF_LOG_ERROR, "out of memory");</div><div class='del'>-                goto out;</div><div class='del'>-	}</div><div class='del'>-        /* THIS should be saved and set back */</div><div class='add'>+    return ((fop == GFS3_OP_LK) || (fop == GFS3_OP_INODELK) ||</div><div class='add'>+            (fop == GFS3_OP_FINODELK) || (fop == GFS3_OP_ENTRYLK) ||</div><div class='add'>+            (fop == GFS3_OP_FENTRYLK));</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        memset (saved_frame, 0, sizeof (*saved_frame));</div><div class='del'>-	INIT_LIST_HEAD (&amp;saved_frame-&gt;list);</div><div class='add'>+static struct saved_frame *</div><div class='add'>+__saved_frames_put(struct saved_frames *frames, void *frame,</div><div class='add'>+                   struct rpc_req *rpcreq)</div><div class='add'>+{</div><div class='add'>+    struct saved_frame *saved_frame = mem_get(</div><div class='add'>+        rpcreq-&gt;conn-&gt;rpc_clnt-&gt;saved_frames_pool);</div><div class='ctx'> </div><div class='del'>-	saved_frame-&gt;capital_this = THIS;</div><div class='del'>-	saved_frame-&gt;frame        = frame;</div><div class='del'>-        saved_frame-&gt;rpcreq       = rpcreq;</div><div class='del'>-	gettimeofday (&amp;saved_frame-&gt;saved_at, NULL);</div><div class='add'>+    if (!saved_frame) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    /* THIS should be saved and set back */</div><div class='ctx'> </div><div class='del'>-	list_add_tail (&amp;saved_frame-&gt;list, &amp;frames-&gt;sf.list);</div><div class='del'>-	frames-&gt;count++;</div><div class='add'>+    INIT_LIST_HEAD(&amp;saved_frame-&gt;list);</div><div class='ctx'> </div><div class='del'>-out:</div><div class='del'>-	return saved_frame;</div><div class='del'>-}</div><div class='add'>+    saved_frame-&gt;capital_this = THIS;</div><div class='add'>+    saved_frame-&gt;frame = frame;</div><div class='add'>+    saved_frame-&gt;rpcreq = rpcreq;</div><div class='add'>+    gettimeofday(&amp;saved_frame-&gt;saved_at, NULL);</div><div class='add'>+    memset(&amp;saved_frame-&gt;rsp, 0, sizeof(rpc_transport_rsp_t));</div><div class='ctx'> </div><div class='add'>+    if (_is_lock_fop(saved_frame))</div><div class='add'>+        list_add_tail(&amp;saved_frame-&gt;list, &amp;frames-&gt;lk_sf.list);</div><div class='add'>+    else</div><div class='add'>+        list_add_tail(&amp;saved_frame-&gt;list, &amp;frames-&gt;sf.list);</div><div class='ctx'> </div><div class='del'>-void</div><div class='del'>-saved_frames_delete (struct saved_frame *saved_frame,</div><div class='del'>-                     rpc_clnt_connection_t *conn)</div><div class='del'>-{</div><div class='del'>-        if (!saved_frame || !conn) {</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='add'>+    frames-&gt;count++;</div><div class='ctx'> </div><div class='del'>-        pthread_mutex_lock (&amp;conn-&gt;lock);</div><div class='del'>-        {</div><div class='del'>-                list_del_init (&amp;saved_frame-&gt;list);</div><div class='del'>-                conn-&gt;saved_frames-&gt;count--;</div><div class='del'>-        }</div><div class='del'>-        pthread_mutex_unlock (&amp;conn-&gt;lock);</div><div class='del'>-</div><div class='del'>-        if (saved_frame-&gt;rpcreq != NULL) {</div><div class='del'>-                rpc_clnt_reply_deinit (saved_frame-&gt;rpcreq,</div><div class='del'>-                                       conn-&gt;rpc_clnt-&gt;reqpool);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        mem_put (conn-&gt;rpc_clnt-&gt;saved_frames_pool, saved_frame);</div><div class='ctx'> out:</div><div class='del'>-        return;</div><div class='add'>+    return saved_frame;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> static void</div><div class='del'>-call_bail (void *data)</div><div class='add'>+call_bail(void *data)</div><div class='ctx'> {</div><div class='del'>-        struct rpc_clnt       *clnt = NULL;</div><div class='del'>-        rpc_clnt_connection_t *conn = NULL;</div><div class='del'>-        struct timeval         current;</div><div class='del'>-        struct list_head       list;</div><div class='del'>-        struct saved_frame    *saved_frame = NULL;</div><div class='del'>-        struct saved_frame    *trav = NULL;</div><div class='del'>-        struct saved_frame    *tmp = NULL;</div><div class='del'>-        struct tm              frame_sent_tm;</div><div class='del'>-        char                   frame_sent[32] = {0,};</div><div class='del'>-        struct timeval         timeout = {0,};</div><div class='del'>-        struct iovec           iov = {0,};</div><div class='del'>-</div><div class='del'>-        GF_VALIDATE_OR_GOTO ("client", data, out);</div><div class='del'>-</div><div class='del'>-        clnt = data;</div><div class='del'>-</div><div class='del'>-        conn = &amp;clnt-&gt;conn;</div><div class='del'>-</div><div class='del'>-        gettimeofday (&amp;current, NULL);</div><div class='del'>-        INIT_LIST_HEAD (&amp;list);</div><div class='del'>-</div><div class='del'>-        pthread_mutex_lock (&amp;conn-&gt;lock);</div><div class='del'>-        {</div><div class='del'>-                /* Chaining to get call-always functionality from</div><div class='del'>-                   call-once timer */</div><div class='del'>-                if (conn-&gt;timer) {</div><div class='del'>-                        timeout.tv_sec = 10;</div><div class='del'>-                        timeout.tv_usec = 0;</div><div class='del'>-</div><div class='del'>-                        gf_timer_call_cancel (clnt-&gt;ctx, conn-&gt;timer);</div><div class='del'>-                        conn-&gt;timer = gf_timer_call_after (clnt-&gt;ctx,</div><div class='del'>-                                                           timeout,</div><div class='del'>-                                                           call_bail,</div><div class='del'>-                                                           (void *) clnt);</div><div class='del'>-</div><div class='del'>-                        if (conn-&gt;timer == NULL) {</div><div class='del'>-                                gf_log (conn-&gt;trans-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-                                        "Cannot create bailout timer");</div><div class='del'>-                        }</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                do {</div><div class='del'>-                        saved_frame =</div><div class='del'>-                                __saved_frames_get_timedout (conn-&gt;saved_frames,</div><div class='del'>-                                                             conn-&gt;frame_timeout,</div><div class='del'>-                                                             &amp;current);</div><div class='del'>-                        if (saved_frame)</div><div class='del'>-                                list_add (&amp;saved_frame-&gt;list, &amp;list);</div><div class='del'>-</div><div class='del'>-                } while (saved_frame);</div><div class='del'>-        }</div><div class='del'>-        pthread_mutex_unlock (&amp;conn-&gt;lock);</div><div class='del'>-</div><div class='del'>-        list_for_each_entry_safe (trav, tmp, &amp;list, list) {</div><div class='del'>-                localtime_r (&amp;trav-&gt;saved_at.tv_sec, &amp;frame_sent_tm);</div><div class='del'>-                strftime (frame_sent, 32, "%Y-%m-%d %H:%M:%S", &amp;frame_sent_tm);</div><div class='del'>-</div><div class='del'>-		gf_log (conn-&gt;trans-&gt;name, GF_LOG_ERROR,</div><div class='del'>-			"bailing out frame type(%s) op(%s(%d)) sent = %s. "</div><div class='del'>-                        "timeout = %d",</div><div class='del'>-			trav-&gt;rpcreq-&gt;prog-&gt;progname,</div><div class='del'>-                        (trav-&gt;rpcreq-&gt;prog-&gt;procnames) ?</div><div class='del'>-                        trav-&gt;rpcreq-&gt;prog-&gt;procnames[trav-&gt;rpcreq-&gt;procnum] :</div><div class='del'>-                        "--",</div><div class='del'>-                        trav-&gt;rpcreq-&gt;procnum, frame_sent,</div><div class='del'>-                        conn-&gt;frame_timeout);</div><div class='del'>-</div><div class='del'>-                trav-&gt;rpcreq-&gt;rpc_status = -1;</div><div class='del'>-		trav-&gt;rpcreq-&gt;cbkfn (trav-&gt;rpcreq, &amp;iov, 1, trav-&gt;frame);</div><div class='del'>-</div><div class='del'>-                rpc_clnt_reply_deinit (trav-&gt;rpcreq, clnt-&gt;reqpool);</div><div class='del'>-                list_del_init (&amp;trav-&gt;list);</div><div class='del'>-                mem_put (conn-&gt;rpc_clnt-&gt;saved_frames_pool, trav);</div><div class='del'>-        }</div><div class='add'>+    rpc_transport_t *trans = NULL;</div><div class='add'>+    struct rpc_clnt *clnt = NULL;</div><div class='add'>+    rpc_clnt_connection_t *conn = NULL;</div><div class='add'>+    struct timeval current;</div><div class='add'>+    struct list_head list;</div><div class='add'>+    struct saved_frame *saved_frame = NULL;</div><div class='add'>+    struct saved_frame *trav = NULL;</div><div class='add'>+    struct saved_frame *tmp = NULL;</div><div class='add'>+    char frame_sent[GF_TIMESTR_SIZE] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    struct timespec timeout = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    char peerid[UNIX_PATH_MAX] = {0};</div><div class='add'>+    gf_boolean_t need_unref = _gf_false;</div><div class='add'>+</div><div class='add'>+    GF_VALIDATE_OR_GOTO("client", data, out);</div><div class='add'>+</div><div class='add'>+    clnt = data;</div><div class='add'>+</div><div class='add'>+    conn = &amp;clnt-&gt;conn;</div><div class='add'>+    pthread_mutex_lock(&amp;conn-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        trans = conn-&gt;trans;</div><div class='add'>+        if (trans) {</div><div class='add'>+            (void)snprintf(peerid, sizeof(peerid), "%s",</div><div class='add'>+                           conn-&gt;trans-&gt;peerinfo.identifier);</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    pthread_mutex_unlock(&amp;conn-&gt;lock);</div><div class='add'>+    /*rpc_clnt_connection_cleanup will be unwinding all saved frames,</div><div class='add'>+     * bailed or otherwise*/</div><div class='add'>+    if (!trans)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    gettimeofday(&amp;current, NULL);</div><div class='add'>+    INIT_LIST_HEAD(&amp;list);</div><div class='add'>+</div><div class='add'>+    pthread_mutex_lock(&amp;conn-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        /* Chaining to get call-always functionality from</div><div class='add'>+           call-once timer */</div><div class='add'>+        if (conn-&gt;timer) {</div><div class='add'>+            timeout.tv_sec = 10;</div><div class='add'>+            timeout.tv_nsec = 0;</div><div class='add'>+</div><div class='add'>+            /* Ref rpc as it's added to timer event queue */</div><div class='add'>+            rpc_clnt_ref(clnt);</div><div class='add'>+            gf_timer_call_cancel(clnt-&gt;ctx, conn-&gt;timer);</div><div class='add'>+            conn-&gt;timer = gf_timer_call_after(clnt-&gt;ctx, timeout, call_bail,</div><div class='add'>+                                              (void *)clnt);</div><div class='add'>+</div><div class='add'>+            if (conn-&gt;timer == NULL) {</div><div class='add'>+                gf_log(conn-&gt;name, GF_LOG_WARNING,</div><div class='add'>+                       "Cannot create bailout timer for %s", peerid);</div><div class='add'>+                need_unref = _gf_true;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        do {</div><div class='add'>+            saved_frame = __saved_frames_get_timedout(</div><div class='add'>+                conn-&gt;saved_frames, conn-&gt;frame_timeout, &amp;current);</div><div class='add'>+            if (saved_frame)</div><div class='add'>+                list_add(&amp;saved_frame-&gt;list, &amp;list);</div><div class='add'>+</div><div class='add'>+        } while (saved_frame);</div><div class='add'>+    }</div><div class='add'>+    pthread_mutex_unlock(&amp;conn-&gt;lock);</div><div class='add'>+</div><div class='add'>+    if (list_empty(&amp;list))</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    list_for_each_entry_safe(trav, tmp, &amp;list, list)</div><div class='add'>+    {</div><div class='add'>+        gf_time_fmt_tv(frame_sent, sizeof frame_sent, &amp;trav-&gt;saved_at,</div><div class='add'>+                       gf_timefmt_FT);</div><div class='add'>+</div><div class='add'>+        gf_log(conn-&gt;name, GF_LOG_ERROR,</div><div class='add'>+               "bailing out frame type(%s), op(%s(%d)), xid = 0x%x, "</div><div class='add'>+               "unique = %" PRIu64 ", sent = %s, timeout = %d for %s",</div><div class='add'>+               trav-&gt;rpcreq-&gt;prog-&gt;progname,</div><div class='add'>+               (trav-&gt;rpcreq-&gt;prog-&gt;procnames)</div><div class='add'>+                   ? trav-&gt;rpcreq-&gt;prog-&gt;procnames[trav-&gt;rpcreq-&gt;procnum]</div><div class='add'>+                   : "--",</div><div class='add'>+               trav-&gt;rpcreq-&gt;procnum, trav-&gt;rpcreq-&gt;xid,</div><div class='add'>+               ((call_frame_t *)(trav-&gt;frame))-&gt;root-&gt;unique, frame_sent,</div><div class='add'>+               conn-&gt;frame_timeout, peerid);</div><div class='add'>+</div><div class='add'>+        clnt = rpc_clnt_ref(clnt);</div><div class='add'>+        trav-&gt;rpcreq-&gt;rpc_status = -1;</div><div class='add'>+        trav-&gt;rpcreq-&gt;cbkfn(trav-&gt;rpcreq, NULL, 0, trav-&gt;frame);</div><div class='add'>+</div><div class='add'>+        rpc_clnt_reply_deinit(trav-&gt;rpcreq, clnt-&gt;reqpool);</div><div class='add'>+        clnt = rpc_clnt_unref(clnt);</div><div class='add'>+        list_del_init(&amp;trav-&gt;list);</div><div class='add'>+        mem_put(trav);</div><div class='add'>+    }</div><div class='ctx'> out:</div><div class='del'>-        return;</div><div class='add'>+    rpc_clnt_unref(clnt);</div><div class='add'>+    if (need_unref)</div><div class='add'>+        rpc_clnt_unref(clnt);</div><div class='add'>+    return;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> /* to be called with conn-&gt;lock held */</div><div class='del'>-struct saved_frame *</div><div class='del'>-__save_frame (struct rpc_clnt *rpc_clnt, call_frame_t *frame,</div><div class='del'>-              struct rpc_req *rpcreq)</div><div class='add'>+static struct saved_frame *</div><div class='add'>+__save_frame(struct rpc_clnt *rpc_clnt, call_frame_t *frame,</div><div class='add'>+             struct rpc_req *rpcreq)</div><div class='ctx'> {</div><div class='del'>-        rpc_clnt_connection_t *conn        = NULL;</div><div class='del'>-        struct timeval         timeout     = {0, };</div><div class='del'>-        struct saved_frame    *saved_frame = NULL;</div><div class='del'>-</div><div class='del'>-        conn = &amp;rpc_clnt-&gt;conn;</div><div class='del'>-</div><div class='del'>-        saved_frame = __saved_frames_put (conn-&gt;saved_frames, frame, rpcreq);</div><div class='del'>-</div><div class='del'>-        if (saved_frame == NULL) {</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        /* TODO: make timeout configurable */</div><div class='del'>-        if (conn-&gt;timer == NULL) {</div><div class='del'>-                timeout.tv_sec  = 10;</div><div class='del'>-                timeout.tv_usec = 0;</div><div class='del'>-                conn-&gt;timer = gf_timer_call_after (rpc_clnt-&gt;ctx,</div><div class='del'>-                                                   timeout,</div><div class='del'>-                                                   call_bail,</div><div class='del'>-                                                   (void *) rpc_clnt);</div><div class='del'>-        }</div><div class='add'>+    rpc_clnt_connection_t *conn = &amp;rpc_clnt-&gt;conn;</div><div class='add'>+    struct timespec timeout = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    struct saved_frame *saved_frame = __saved_frames_put(conn-&gt;saved_frames,</div><div class='add'>+                                                         frame, rpcreq);</div><div class='add'>+</div><div class='add'>+    if (saved_frame == NULL) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* TODO: make timeout configurable */</div><div class='add'>+    if (conn-&gt;timer == NULL) {</div><div class='add'>+        timeout.tv_sec = 10;</div><div class='add'>+        timeout.tv_nsec = 0;</div><div class='add'>+        rpc_clnt_ref(rpc_clnt);</div><div class='add'>+        conn-&gt;timer = gf_timer_call_after(rpc_clnt-&gt;ctx, timeout, call_bail,</div><div class='add'>+                                          (void *)rpc_clnt);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='ctx'> out:</div><div class='del'>-        return saved_frame;</div><div class='add'>+    return saved_frame;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> struct saved_frames *</div><div class='del'>-saved_frames_new (void)</div><div class='add'>+saved_frames_new(void)</div><div class='ctx'> {</div><div class='del'>-	struct saved_frames *saved_frames = NULL;</div><div class='add'>+    struct saved_frames *saved_frames = NULL;</div><div class='ctx'> </div><div class='del'>-	saved_frames = GF_CALLOC (1, sizeof (*saved_frames),</div><div class='del'>-                                  gf_common_mt_rpcclnt_savedframe_t);</div><div class='del'>-	if (!saved_frames) {</div><div class='del'>-                gf_log ("rpc-clnt", GF_LOG_ERROR, "out of memory");</div><div class='del'>-		return NULL;</div><div class='del'>-	}</div><div class='add'>+    saved_frames = GF_CALLOC(1, sizeof(*saved_frames),</div><div class='add'>+                             gf_common_mt_rpcclnt_savedframe_t);</div><div class='add'>+    if (!saved_frames) {</div><div class='add'>+        return NULL;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	INIT_LIST_HEAD (&amp;saved_frames-&gt;sf.list);</div><div class='add'>+    INIT_LIST_HEAD(&amp;saved_frames-&gt;sf.list);</div><div class='add'>+    INIT_LIST_HEAD(&amp;saved_frames-&gt;lk_sf.list);</div><div class='ctx'> </div><div class='del'>-	return saved_frames;</div><div class='add'>+    return saved_frames;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-__saved_frame_copy (struct saved_frames *frames, int64_t callid,</div><div class='del'>-                    struct saved_frame *saved_frame)</div><div class='add'>+__saved_frame_copy(struct saved_frames *frames, int64_t callid,</div><div class='add'>+                   struct saved_frame *saved_frame)</div><div class='ctx'> {</div><div class='del'>-	struct saved_frame *tmp   = NULL;</div><div class='del'>-        int                 ret   = -1;</div><div class='add'>+    struct saved_frame *tmp = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    if (!saved_frame) {</div><div class='add'>+        ret = 0;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        if (!saved_frame) {</div><div class='del'>-                ret = 0;</div><div class='del'>-                goto out;</div><div class='add'>+    list_for_each_entry(tmp, &amp;frames-&gt;sf.list, list)</div><div class='add'>+    {</div><div class='add'>+        if (tmp-&gt;rpcreq-&gt;xid == callid) {</div><div class='add'>+            *saved_frame = *tmp;</div><div class='add'>+            ret = 0;</div><div class='add'>+            goto out;</div><div class='ctx'>         }</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	list_for_each_entry (tmp, &amp;frames-&gt;sf.list, list) {</div><div class='del'>-		if (tmp-&gt;rpcreq-&gt;xid == callid) {</div><div class='del'>-			*saved_frame = *tmp;</div><div class='del'>-                        ret = 0;</div><div class='del'>-			break;</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='add'>+    list_for_each_entry(tmp, &amp;frames-&gt;lk_sf.list, list)</div><div class='add'>+    {</div><div class='add'>+        if (tmp-&gt;rpcreq-&gt;xid == callid) {</div><div class='add'>+            *saved_frame = *tmp;</div><div class='add'>+            ret = 0;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='ctx'> </div><div class='ctx'> out:</div><div class='del'>-	return ret;</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> struct saved_frame *</div><div class='del'>-__saved_frame_get (struct saved_frames *frames, int64_t callid)</div><div class='add'>+__saved_frame_get(struct saved_frames *frames, int64_t callid)</div><div class='ctx'> {</div><div class='del'>-	struct saved_frame *saved_frame = NULL;</div><div class='del'>-	struct saved_frame *tmp = NULL;</div><div class='del'>-</div><div class='del'>-	list_for_each_entry (tmp, &amp;frames-&gt;sf.list, list) {</div><div class='del'>-		if (tmp-&gt;rpcreq-&gt;xid == callid) {</div><div class='del'>-			list_del_init (&amp;tmp-&gt;list);</div><div class='del'>-			frames-&gt;count--;</div><div class='del'>-			saved_frame = tmp;</div><div class='del'>-			break;</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	if (saved_frame) {</div><div class='del'>-                THIS  = saved_frame-&gt;capital_this;</div><div class='add'>+    struct saved_frame *saved_frame = NULL;</div><div class='add'>+    struct saved_frame *tmp = NULL;</div><div class='add'>+</div><div class='add'>+    list_for_each_entry(tmp, &amp;frames-&gt;sf.list, list)</div><div class='add'>+    {</div><div class='add'>+        if (tmp-&gt;rpcreq-&gt;xid == callid) {</div><div class='add'>+            list_del_init(&amp;tmp-&gt;list);</div><div class='add'>+            frames-&gt;count--;</div><div class='add'>+            saved_frame = tmp;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    list_for_each_entry(tmp, &amp;frames-&gt;lk_sf.list, list)</div><div class='add'>+    {</div><div class='add'>+        if (tmp-&gt;rpcreq-&gt;xid == callid) {</div><div class='add'>+            list_del_init(&amp;tmp-&gt;list);</div><div class='add'>+            frames-&gt;count--;</div><div class='add'>+            saved_frame = tmp;</div><div class='add'>+            goto out;</div><div class='ctx'>         }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (saved_frame) {</div><div class='add'>+        THIS = saved_frame-&gt;capital_this;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	return saved_frame;</div><div class='add'>+    return saved_frame;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> void</div><div class='del'>-saved_frames_unwind (struct saved_frames *saved_frames)</div><div class='add'>+saved_frames_unwind(struct saved_frames *saved_frames)</div><div class='ctx'> {</div><div class='del'>-	struct saved_frame   *trav = NULL;</div><div class='del'>-	struct saved_frame   *tmp = NULL;</div><div class='del'>-        struct tm            *frame_sent_tm = NULL;</div><div class='del'>-        char                 timestr[256] = {0,};</div><div class='del'>-</div><div class='del'>-        struct iovec          iov = {0,};</div><div class='del'>-</div><div class='del'>-	list_for_each_entry_safe (trav, tmp, &amp;saved_frames-&gt;sf.list, list) {</div><div class='del'>-                frame_sent_tm = localtime (&amp;trav-&gt;saved_at.tv_sec);</div><div class='del'>-                strftime (timestr, sizeof(timestr), "%Y-%m-%d %H:%M:%S",</div><div class='del'>-                          frame_sent_tm);</div><div class='del'>-                snprintf (timestr + strlen (timestr),</div><div class='del'>-                          sizeof(timestr) - strlen (timestr),</div><div class='del'>-                          ".%"GF_PRI_SUSECONDS, trav-&gt;saved_at.tv_usec);</div><div class='del'>-</div><div class='del'>-		gf_log ("rpc-clnt", GF_LOG_ERROR,</div><div class='del'>-			"forced unwinding frame type(%s) op(%s(%d)) "</div><div class='del'>-                        "called at %s",</div><div class='del'>-			trav-&gt;rpcreq-&gt;prog-&gt;progname,</div><div class='del'>-                        (trav-&gt;rpcreq-&gt;prog-&gt;procnames) ?</div><div class='del'>-                        trav-&gt;rpcreq-&gt;prog-&gt;procnames[trav-&gt;rpcreq-&gt;procnum]</div><div class='del'>-                        : "--",</div><div class='del'>-                        trav-&gt;rpcreq-&gt;procnum, timestr);</div><div class='del'>-</div><div class='del'>-		saved_frames-&gt;count--;</div><div class='del'>-</div><div class='del'>-                trav-&gt;rpcreq-&gt;rpc_status = -1;</div><div class='del'>-                trav-&gt;rpcreq-&gt;cbkfn (trav-&gt;rpcreq, &amp;iov, 1, trav-&gt;frame);</div><div class='del'>-                rpc_clnt_reply_deinit (trav-&gt;rpcreq,</div><div class='del'>-                                       trav-&gt;rpcreq-&gt;conn-&gt;rpc_clnt-&gt;reqpool);</div><div class='del'>-</div><div class='del'>-		list_del_init (&amp;trav-&gt;list);</div><div class='del'>-                mem_put (trav-&gt;rpcreq-&gt;conn-&gt;rpc_clnt-&gt;saved_frames_pool, trav);</div><div class='del'>-	}</div><div class='add'>+    struct saved_frame *trav = NULL;</div><div class='add'>+    struct saved_frame *tmp = NULL;</div><div class='add'>+    char timestr[GF_TIMESTR_SIZE] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    list_splice_init(&amp;saved_frames-&gt;lk_sf.list, &amp;saved_frames-&gt;sf.list);</div><div class='add'>+</div><div class='add'>+    list_for_each_entry_safe(trav, tmp, &amp;saved_frames-&gt;sf.list, list)</div><div class='add'>+    {</div><div class='add'>+        gf_time_fmt_tv(timestr, sizeof timestr, &amp;trav-&gt;saved_at, gf_timefmt_FT);</div><div class='add'>+</div><div class='add'>+        if (!trav-&gt;rpcreq || !trav-&gt;rpcreq-&gt;prog)</div><div class='add'>+            continue;</div><div class='add'>+</div><div class='add'>+        gf_log_callingfn(</div><div class='add'>+            trav-&gt;rpcreq-&gt;conn-&gt;name, GF_LOG_ERROR,</div><div class='add'>+            "forced unwinding frame type(%s) op(%s(%d)) "</div><div class='add'>+            "called at %s (xid=0x%x)",</div><div class='add'>+            trav-&gt;rpcreq-&gt;prog-&gt;progname,</div><div class='add'>+            ((trav-&gt;rpcreq-&gt;prog-&gt;procnames)</div><div class='add'>+                 ? trav-&gt;rpcreq-&gt;prog-&gt;procnames[trav-&gt;rpcreq-&gt;procnum]</div><div class='add'>+                 : "--"),</div><div class='add'>+            trav-&gt;rpcreq-&gt;procnum, timestr, trav-&gt;rpcreq-&gt;xid);</div><div class='add'>+        saved_frames-&gt;count--;</div><div class='add'>+</div><div class='add'>+        trav-&gt;rpcreq-&gt;rpc_status = -1;</div><div class='add'>+        trav-&gt;rpcreq-&gt;cbkfn(trav-&gt;rpcreq, NULL, 0, trav-&gt;frame);</div><div class='add'>+</div><div class='add'>+        rpc_clnt_reply_deinit(trav-&gt;rpcreq,</div><div class='add'>+                              trav-&gt;rpcreq-&gt;conn-&gt;rpc_clnt-&gt;reqpool);</div><div class='add'>+</div><div class='add'>+        list_del_init(&amp;trav-&gt;list);</div><div class='add'>+        mem_put(trav);</div><div class='add'>+    }</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> void</div><div class='del'>-saved_frames_destroy (struct saved_frames *frames)</div><div class='add'>+saved_frames_destroy(struct saved_frames *frames)</div><div class='ctx'> {</div><div class='del'>-        if (!frames)</div><div class='del'>-                return;</div><div class='add'>+    if (!frames)</div><div class='add'>+        return;</div><div class='ctx'> </div><div class='del'>-	saved_frames_unwind (frames);</div><div class='add'>+    saved_frames_unwind(frames);</div><div class='ctx'> </div><div class='del'>-	GF_FREE (frames);</div><div class='add'>+    GF_FREE(frames);</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> void</div><div class='del'>-rpc_clnt_reconnect (void *trans_ptr)</div><div class='add'>+rpc_clnt_reconnect(void *conn_ptr)</div><div class='ctx'> {</div><div class='del'>-        rpc_transport_t         *trans = NULL;</div><div class='del'>-        rpc_clnt_connection_t   *conn  = NULL;</div><div class='del'>-        struct timeval           tv    = {0, 0};</div><div class='del'>-        int32_t                  ret   = 0;</div><div class='del'>-        struct rpc_clnt         *clnt  = NULL;</div><div class='del'>-</div><div class='del'>-        trans = trans_ptr;</div><div class='del'>-        if (!trans || !trans-&gt;mydata)</div><div class='del'>-                return;</div><div class='del'>-</div><div class='del'>-        conn  = trans-&gt;mydata;</div><div class='del'>-        clnt = conn-&gt;rpc_clnt;</div><div class='del'>-</div><div class='del'>-        pthread_mutex_lock (&amp;conn-&gt;lock);</div><div class='del'>-        {</div><div class='del'>-                if (conn-&gt;reconnect)</div><div class='del'>-                        gf_timer_call_cancel (clnt-&gt;ctx,</div><div class='del'>-                                              conn-&gt;reconnect);</div><div class='del'>-                conn-&gt;reconnect = 0;</div><div class='del'>-</div><div class='del'>-                if (conn-&gt;connected == 0) {</div><div class='del'>-                        tv.tv_sec = 3;</div><div class='del'>-</div><div class='del'>-                        gf_log (trans-&gt;name, GF_LOG_TRACE,</div><div class='del'>-                                "attempting reconnect");</div><div class='del'>-                        ret = rpc_transport_connect (trans, conn-&gt;config.remote_port);</div><div class='del'>-</div><div class='del'>-                        conn-&gt;reconnect =</div><div class='del'>-                                gf_timer_call_after (clnt-&gt;ctx, tv,</div><div class='del'>-                                                     rpc_clnt_reconnect,</div><div class='del'>-                                                     trans);</div><div class='del'>-                } else {</div><div class='del'>-                        gf_log (trans-&gt;name, GF_LOG_TRACE,</div><div class='del'>-                                "breaking reconnect chain");</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='del'>-        pthread_mutex_unlock (&amp;conn-&gt;lock);</div><div class='del'>-</div><div class='del'>-        if ((ret == -1) &amp;&amp; (errno != EINPROGRESS) &amp;&amp; (clnt-&gt;notifyfn)) {</div><div class='del'>-                clnt-&gt;notifyfn (clnt, clnt-&gt;mydata, RPC_CLNT_DISCONNECT, NULL);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        return;</div><div class='add'>+    rpc_transport_t *trans = NULL;</div><div class='add'>+    rpc_clnt_connection_t *conn = NULL;</div><div class='add'>+    struct timespec ts = {0, 0};</div><div class='add'>+    struct rpc_clnt *clnt = NULL;</div><div class='add'>+    gf_boolean_t need_unref = _gf_false;</div><div class='add'>+    gf_boolean_t canceled_unref = _gf_false;</div><div class='add'>+</div><div class='add'>+    conn = conn_ptr;</div><div class='add'>+    clnt = conn-&gt;rpc_clnt;</div><div class='add'>+    pthread_mutex_lock(&amp;conn-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        trans = conn-&gt;trans;</div><div class='add'>+        if (!trans)</div><div class='add'>+            goto out_unlock;</div><div class='add'>+</div><div class='add'>+        if (conn-&gt;reconnect) {</div><div class='add'>+            if (!gf_timer_call_cancel(clnt-&gt;ctx, conn-&gt;reconnect))</div><div class='add'>+                canceled_unref = _gf_true;</div><div class='add'>+        }</div><div class='add'>+        conn-&gt;reconnect = 0;</div><div class='add'>+</div><div class='add'>+        if ((conn-&gt;connected == 0) &amp;&amp; !clnt-&gt;disabled) {</div><div class='add'>+            ts.tv_sec = 3;</div><div class='add'>+            ts.tv_nsec = 0;</div><div class='add'>+</div><div class='add'>+            gf_log(conn-&gt;name, GF_LOG_TRACE, "attempting reconnect");</div><div class='add'>+            (void)rpc_transport_connect(trans, conn-&gt;config.remote_port);</div><div class='add'>+            rpc_clnt_ref(clnt);</div><div class='add'>+            conn-&gt;reconnect = gf_timer_call_after(clnt-&gt;ctx, ts,</div><div class='add'>+                                                  rpc_clnt_reconnect, conn);</div><div class='add'>+            if (!conn-&gt;reconnect) {</div><div class='add'>+                need_unref = _gf_true;</div><div class='add'>+                gf_log(conn-&gt;name, GF_LOG_ERROR,</div><div class='add'>+                       "Error adding to timer event queue");</div><div class='add'>+            }</div><div class='add'>+        } else {</div><div class='add'>+            gf_log(conn-&gt;name, GF_LOG_TRACE, "breaking reconnect chain");</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+out_unlock:</div><div class='add'>+    pthread_mutex_unlock(&amp;conn-&gt;lock);</div><div class='add'>+</div><div class='add'>+    rpc_clnt_unref(clnt);</div><div class='add'>+    if (need_unref)</div><div class='add'>+        rpc_clnt_unref(clnt);</div><div class='add'>+    if (canceled_unref)</div><div class='add'>+        rpc_clnt_unref(clnt);</div><div class='add'>+    return;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-rpc_clnt_fill_request_info (struct rpc_clnt *clnt, rpc_request_info_t *info)</div><div class='add'>+rpc_clnt_fill_request_info(struct rpc_clnt *clnt, rpc_request_info_t *info)</div><div class='ctx'> {</div><div class='del'>-        struct saved_frame  saved_frame = {{}, 0};</div><div class='del'>-        int                 ret         = -1;</div><div class='del'>-</div><div class='del'>-        pthread_mutex_lock (&amp;clnt-&gt;conn.lock);</div><div class='del'>-        {</div><div class='del'>-                ret = __saved_frame_copy (clnt-&gt;conn.saved_frames, info-&gt;xid,</div><div class='del'>-                                          &amp;saved_frame);</div><div class='del'>-        }</div><div class='del'>-        pthread_mutex_unlock (&amp;clnt-&gt;conn.lock);</div><div class='del'>-</div><div class='del'>-        if (ret == -1) {</div><div class='del'>-                gf_log ("rpc-clnt", GF_LOG_CRITICAL, "cannot lookup the saved "</div><div class='del'>-                        "frame corresponding to xid (%d) for msg arrived on "</div><div class='del'>-                        "transport %s",</div><div class='del'>-                        info-&gt;xid, clnt-&gt;conn.trans-&gt;name);</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        info-&gt;prognum = saved_frame.rpcreq-&gt;prog-&gt;prognum;</div><div class='del'>-        info-&gt;procnum = saved_frame.rpcreq-&gt;procnum;</div><div class='del'>-        info-&gt;progver = saved_frame.rpcreq-&gt;prog-&gt;progver;</div><div class='del'>-        info-&gt;rpc_req = saved_frame.rpcreq;</div><div class='del'>-        info-&gt;rsp     = saved_frame.rsp;</div><div class='del'>-</div><div class='del'>-        ret = 0;</div><div class='add'>+    struct saved_frame saved_frame;</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    pthread_mutex_lock(&amp;clnt-&gt;conn.lock);</div><div class='add'>+    {</div><div class='add'>+        ret = __saved_frame_copy(clnt-&gt;conn.saved_frames, info-&gt;xid,</div><div class='add'>+                                 &amp;saved_frame);</div><div class='add'>+    }</div><div class='add'>+    pthread_mutex_unlock(&amp;clnt-&gt;conn.lock);</div><div class='add'>+</div><div class='add'>+    if (ret == -1) {</div><div class='add'>+        gf_log(clnt-&gt;conn.name, GF_LOG_CRITICAL,</div><div class='add'>+               "cannot lookup the saved "</div><div class='add'>+               "frame corresponding to xid (%d)",</div><div class='add'>+               info-&gt;xid);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    info-&gt;prognum = saved_frame.rpcreq-&gt;prog-&gt;prognum;</div><div class='add'>+    info-&gt;procnum = saved_frame.rpcreq-&gt;procnum;</div><div class='add'>+    info-&gt;progver = saved_frame.rpcreq-&gt;prog-&gt;progver;</div><div class='add'>+    info-&gt;rpc_req = saved_frame.rpcreq;</div><div class='add'>+    info-&gt;rsp = saved_frame.rsp;</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='ctx'> out:</div><div class='del'>-        return ret;</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-rpc_clnt_reconnect_cleanup (rpc_clnt_connection_t *conn)</div><div class='add'>+rpc_clnt_reconnect_cleanup(rpc_clnt_connection_t *conn)</div><div class='ctx'> {</div><div class='del'>-        struct rpc_clnt         *clnt  = NULL;</div><div class='add'>+    struct rpc_clnt *clnt = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    gf_boolean_t reconnect_unref = _gf_false;</div><div class='ctx'> </div><div class='del'>-        if (!conn) {</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='add'>+    if (!conn) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        clnt = conn-&gt;rpc_clnt;</div><div class='del'>-</div><div class='del'>-        pthread_mutex_lock (&amp;conn-&gt;lock);</div><div class='del'>-        {</div><div class='del'>-</div><div class='del'>-                if (conn-&gt;reconnect) {</div><div class='del'>-                        gf_timer_call_cancel (clnt-&gt;ctx, conn-&gt;reconnect);</div><div class='del'>-                        conn-&gt;reconnect = NULL;</div><div class='del'>-                }</div><div class='add'>+    clnt = conn-&gt;rpc_clnt;</div><div class='ctx'> </div><div class='add'>+    pthread_mutex_lock(&amp;conn-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        if (conn-&gt;reconnect) {</div><div class='add'>+            ret = gf_timer_call_cancel(clnt-&gt;ctx, conn-&gt;reconnect);</div><div class='add'>+            if (!ret) {</div><div class='add'>+                reconnect_unref = _gf_true;</div><div class='add'>+                conn-&gt;cleanup_gen++;</div><div class='add'>+            }</div><div class='add'>+            conn-&gt;reconnect = NULL;</div><div class='ctx'>         }</div><div class='add'>+    }</div><div class='add'>+    pthread_mutex_unlock(&amp;conn-&gt;lock);</div><div class='add'>+</div><div class='add'>+    if (reconnect_unref)</div><div class='add'>+        rpc_clnt_unref(clnt);</div><div class='ctx'> </div><div class='ctx'> out:</div><div class='del'>-        return 0;</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> /*</div><div class='hunk'>@@ -468,39 +483,62 @@ out:</div><div class='ctx'>  *</div><div class='ctx'>  */</div><div class='ctx'> int</div><div class='del'>-rpc_clnt_connection_cleanup (rpc_clnt_connection_t *conn)</div><div class='add'>+rpc_clnt_connection_cleanup(rpc_clnt_connection_t *conn)</div><div class='ctx'> {</div><div class='del'>-        struct saved_frames    *saved_frames = NULL;</div><div class='del'>-        struct rpc_clnt         *clnt  = NULL;</div><div class='del'>-</div><div class='del'>-        if (!conn) {</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        clnt = conn-&gt;rpc_clnt;</div><div class='del'>-</div><div class='del'>-        gf_log ("rpc-clnt", GF_LOG_DEBUG,</div><div class='del'>-                "cleaning up state in transport object %p", conn-&gt;trans);</div><div class='del'>-</div><div class='del'>-        pthread_mutex_lock (&amp;conn-&gt;lock);</div><div class='del'>-        {</div><div class='del'>-                saved_frames = conn-&gt;saved_frames;</div><div class='del'>-                conn-&gt;saved_frames = saved_frames_new ();</div><div class='del'>-</div><div class='del'>-                /* bailout logic cleanup */</div><div class='del'>-                if (conn-&gt;timer) {</div><div class='del'>-                        gf_timer_call_cancel (clnt-&gt;ctx, conn-&gt;timer);</div><div class='del'>-                        conn-&gt;timer = NULL;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                conn-&gt;connected = 0;</div><div class='del'>-        }</div><div class='del'>-        pthread_mutex_unlock (&amp;conn-&gt;lock);</div><div class='del'>-</div><div class='del'>-        saved_frames_destroy (saved_frames);</div><div class='del'>-</div><div class='add'>+    struct saved_frames *saved_frames = NULL;</div><div class='add'>+    struct rpc_clnt *clnt = NULL;</div><div class='add'>+    int unref = 0;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    gf_boolean_t timer_unref = _gf_false;</div><div class='add'>+    gf_boolean_t reconnect_unref = _gf_false;</div><div class='add'>+</div><div class='add'>+    if (!conn) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    clnt = conn-&gt;rpc_clnt;</div><div class='add'>+</div><div class='add'>+    pthread_mutex_lock(&amp;conn-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        saved_frames = conn-&gt;saved_frames;</div><div class='add'>+        conn-&gt;saved_frames = saved_frames_new();</div><div class='add'>+</div><div class='add'>+        /* bailout logic cleanup */</div><div class='add'>+        if (conn-&gt;timer) {</div><div class='add'>+            ret = gf_timer_call_cancel(clnt-&gt;ctx, conn-&gt;timer);</div><div class='add'>+            if (!ret)</div><div class='add'>+                timer_unref = _gf_true;</div><div class='add'>+            conn-&gt;timer = NULL;</div><div class='add'>+        }</div><div class='add'>+        if (conn-&gt;reconnect) {</div><div class='add'>+            ret = gf_timer_call_cancel(clnt-&gt;ctx, conn-&gt;reconnect);</div><div class='add'>+            if (!ret)</div><div class='add'>+                reconnect_unref = _gf_true;</div><div class='add'>+            conn-&gt;reconnect = NULL;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        conn-&gt;connected = 0;</div><div class='add'>+        conn-&gt;disconnected = 1;</div><div class='add'>+</div><div class='add'>+        unref = rpc_clnt_remove_ping_timer_locked(clnt);</div><div class='add'>+        /*reset rpc msgs stats*/</div><div class='add'>+        conn-&gt;pingcnt = 0;</div><div class='add'>+        conn-&gt;msgcnt = 0;</div><div class='add'>+        conn-&gt;cleanup_gen++;</div><div class='add'>+    }</div><div class='add'>+    pthread_mutex_unlock(&amp;conn-&gt;lock);</div><div class='add'>+</div><div class='add'>+    saved_frames_destroy(saved_frames);</div><div class='add'>+    if (unref)</div><div class='add'>+        rpc_clnt_unref(clnt);</div><div class='add'>+</div><div class='add'>+    if (timer_unref)</div><div class='add'>+        rpc_clnt_unref(clnt);</div><div class='add'>+</div><div class='add'>+    if (reconnect_unref)</div><div class='add'>+        rpc_clnt_unref(clnt);</div><div class='ctx'> out:</div><div class='del'>-        return 0;</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> /*</div><div class='hunk'>@@ -512,901 +550,1430 @@ out:</div><div class='ctx'>  */</div><div class='ctx'> </div><div class='ctx'> static struct saved_frame *</div><div class='del'>-lookup_frame (rpc_clnt_connection_t *conn, int64_t callid)</div><div class='add'>+lookup_frame(rpc_clnt_connection_t *conn, int64_t callid)</div><div class='ctx'> {</div><div class='del'>-        struct saved_frame *frame = NULL;</div><div class='add'>+    struct saved_frame *frame = NULL;</div><div class='ctx'> </div><div class='del'>-        pthread_mutex_lock (&amp;conn-&gt;lock);</div><div class='del'>-        {</div><div class='del'>-                frame = __saved_frame_get (conn-&gt;saved_frames, callid);</div><div class='del'>-        }</div><div class='del'>-        pthread_mutex_unlock (&amp;conn-&gt;lock);</div><div class='add'>+    pthread_mutex_lock(&amp;conn-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        frame = __saved_frame_get(conn-&gt;saved_frames, callid);</div><div class='add'>+    }</div><div class='add'>+    pthread_mutex_unlock(&amp;conn-&gt;lock);</div><div class='ctx'> </div><div class='del'>-        return frame;</div><div class='add'>+    return frame;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-rpc_clnt_reply_fill (rpc_transport_pollin_t *msg,</div><div class='del'>-                     rpc_clnt_connection_t *conn,</div><div class='del'>-                     struct rpc_msg *replymsg, struct iovec progmsg,</div><div class='del'>-                     struct rpc_req *req,</div><div class='del'>-                     struct saved_frame *saved_frame)</div><div class='add'>+rpc_clnt_reply_fill(rpc_transport_pollin_t *msg, rpc_clnt_connection_t *conn,</div><div class='add'>+                    struct rpc_msg *replymsg, struct iovec progmsg,</div><div class='add'>+                    struct rpc_req *req, struct saved_frame *saved_frame)</div><div class='ctx'> {</div><div class='del'>-        int             ret   = -1;</div><div class='del'>-</div><div class='del'>-        if ((!conn) || (!replymsg)|| (!req) || (!saved_frame) || (!msg)) {</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        req-&gt;rpc_status = 0;</div><div class='del'>-        if ((rpc_reply_status (replymsg) == MSG_DENIED)</div><div class='del'>-            || (rpc_accepted_reply_status (replymsg) != SUCCESS)) {</div><div class='del'>-                req-&gt;rpc_status = -1;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        req-&gt;rsp[0] = progmsg;</div><div class='del'>-        req-&gt;rsp_iobref = iobref_ref (msg-&gt;iobref);</div><div class='del'>-</div><div class='del'>-        if (msg-&gt;vectored) {</div><div class='del'>-                req-&gt;rsp[1] = msg-&gt;vector[1];</div><div class='del'>-                req-&gt;rspcnt = 2;</div><div class='del'>-        } else {</div><div class='del'>-                req-&gt;rspcnt = 1;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        /* By this time, the data bytes for the auth scheme would have already</div><div class='del'>-         * been copied into the required sections of the req structure,</div><div class='del'>-         * we just need to fill in the meta-data about it now.</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    if ((!conn) || (!replymsg) || (!req) || (!saved_frame) || (!msg)) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    req-&gt;rpc_status = 0;</div><div class='add'>+    if ((rpc_reply_status(replymsg) == MSG_DENIED) ||</div><div class='add'>+        (rpc_accepted_reply_status(replymsg) != SUCCESS)) {</div><div class='add'>+        req-&gt;rpc_status = -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    req-&gt;rsp[0] = progmsg;</div><div class='add'>+    req-&gt;rsp_iobref = iobref_ref(msg-&gt;iobref);</div><div class='add'>+</div><div class='add'>+    if (msg-&gt;vectored) {</div><div class='add'>+        req-&gt;rsp[1] = msg-&gt;vector[1];</div><div class='add'>+        req-&gt;rspcnt = 2;</div><div class='add'>+    } else {</div><div class='add'>+        req-&gt;rspcnt = 1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* By this time, the data bytes for the auth scheme would have already</div><div class='add'>+     * been copied into the required sections of the req structure,</div><div class='add'>+     * we just need to fill in the meta-data about it now.</div><div class='add'>+     */</div><div class='add'>+    if (req-&gt;rpc_status == 0) {</div><div class='add'>+        /*</div><div class='add'>+         * req-&gt;verf.flavour = rpc_reply_verf_flavour (replymsg);</div><div class='add'>+         * req-&gt;verf.datalen = rpc_reply_verf_len (replymsg);</div><div class='ctx'>          */</div><div class='del'>-        if (req-&gt;rpc_status == 0) {</div><div class='del'>-                /*</div><div class='del'>-                 * req-&gt;verf.flavour = rpc_reply_verf_flavour (replymsg);</div><div class='del'>-                 * req-&gt;verf.datalen = rpc_reply_verf_len (replymsg);</div><div class='del'>-                 */</div><div class='del'>-        }</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        ret = 0;</div><div class='add'>+    ret = 0;</div><div class='ctx'> </div><div class='ctx'> out:</div><div class='del'>-        return ret;</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> void</div><div class='del'>-rpc_clnt_reply_deinit (struct rpc_req *req, struct mem_pool *pool)</div><div class='add'>+rpc_clnt_reply_deinit(struct rpc_req *req, struct mem_pool *pool)</div><div class='ctx'> {</div><div class='del'>-        if (!req) {</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='add'>+    if (!req) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        if (req-&gt;rsp_iobref) {</div><div class='del'>-                iobref_unref (req-&gt;rsp_iobref);</div><div class='del'>-        }</div><div class='add'>+    if (req-&gt;rsp_iobref) {</div><div class='add'>+        iobref_unref(req-&gt;rsp_iobref);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        mem_put (pool, req);</div><div class='add'>+    mem_put(req);</div><div class='ctx'> out:</div><div class='del'>-        return;</div><div class='add'>+    return;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> /* TODO: use mem-pool for allocating requests */</div><div class='ctx'> int</div><div class='del'>-rpc_clnt_reply_init (rpc_clnt_connection_t *conn, rpc_transport_pollin_t *msg,</div><div class='del'>-                     struct rpc_req *req, struct saved_frame *saved_frame)</div><div class='add'>+rpc_clnt_reply_init(rpc_clnt_connection_t *conn, rpc_transport_pollin_t *msg,</div><div class='add'>+                    struct rpc_req *req, struct saved_frame *saved_frame)</div><div class='ctx'> {</div><div class='del'>-        char                    *msgbuf = NULL;</div><div class='del'>-        struct rpc_msg          rpcmsg;</div><div class='del'>-        struct iovec            progmsg;        /* RPC Program payload */</div><div class='del'>-        size_t                  msglen  = 0;</div><div class='del'>-        int                     ret     = -1;</div><div class='del'>-</div><div class='del'>-        msgbuf = msg-&gt;vector[0].iov_base;</div><div class='del'>-        msglen = msg-&gt;vector[0].iov_len;</div><div class='del'>-</div><div class='del'>-        ret = xdr_to_rpc_reply (msgbuf, msglen, &amp;rpcmsg, &amp;progmsg,</div><div class='del'>-                                req-&gt;verf.authdata);</div><div class='del'>-        if (ret != 0) {</div><div class='del'>-                gf_log ("rpc-clnt", GF_LOG_ERROR, "RPC reply decoding failed");</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        ret = rpc_clnt_reply_fill (msg, conn, &amp;rpcmsg, progmsg, req,</div><div class='del'>-                                   saved_frame);</div><div class='del'>-        if (ret != 0) {</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        gf_log ("rpc-clnt", GF_LOG_TRACE, "RPC XID: %d Program: %s,"</div><div class='del'>-                " ProgVers: %d, Proc: %d", saved_frame-&gt;rpcreq-&gt;xid,</div><div class='del'>-                saved_frame-&gt;rpcreq-&gt;prog-&gt;progname,</div><div class='del'>-                saved_frame-&gt;rpcreq-&gt;prog-&gt;progver,</div><div class='del'>-                saved_frame-&gt;rpcreq-&gt;procnum);</div><div class='del'>-/* TODO: */</div><div class='del'>-        /* TODO: AUTH */</div><div class='del'>-        /* The verifier that is sent in a reply is a string that can be used as</div><div class='del'>-         * a shorthand in credentials for future transactions. We can opt not to</div><div class='del'>-         * use this shorthand, preffering to use the original AUTH_UNIX method</div><div class='del'>-         * for authentication (containing all the details for authentication in</div><div class='del'>-         * credential itself). Hence it is not mandatory for us to be checking</div><div class='del'>-         * the verifier. See Appendix A of rfc-5531 for more details.</div><div class='del'>-         */</div><div class='del'>-</div><div class='del'>-        /*</div><div class='del'>-         * ret = rpc_authenticate (req);</div><div class='del'>-         * if (ret == RPC_AUTH_REJECT) {</div><div class='del'>-         * gf_log ("rpc-clnt", GF_LOG_ERROR, "Failed authentication");</div><div class='del'>-         * ret = -1;</div><div class='del'>-         * goto out;</div><div class='del'>-         * }</div><div class='del'>-         */</div><div class='del'>-</div><div class='del'>-        /* If the error is not RPC_MISMATCH, we consider the call as accepted</div><div class='del'>-         * since we are not handling authentication failures for now.</div><div class='del'>-         */</div><div class='del'>-        req-&gt;rpc_status = 0;</div><div class='add'>+    char *msgbuf = NULL;</div><div class='add'>+    struct rpc_msg rpcmsg;</div><div class='add'>+    struct iovec progmsg; /* RPC Program payload */</div><div class='add'>+    size_t msglen = 0;</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    msgbuf = msg-&gt;vector[0].iov_base;</div><div class='add'>+    msglen = msg-&gt;vector[0].iov_len;</div><div class='add'>+</div><div class='add'>+    ret = xdr_to_rpc_reply(msgbuf, msglen, &amp;rpcmsg, &amp;progmsg,</div><div class='add'>+                           req-&gt;verf.authdata);</div><div class='add'>+    if (ret != 0) {</div><div class='add'>+        gf_log(conn-&gt;name, GF_LOG_WARNING, "RPC reply decoding failed");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = rpc_clnt_reply_fill(msg, conn, &amp;rpcmsg, progmsg, req, saved_frame);</div><div class='add'>+    if (ret != 0) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    gf_log(conn-&gt;name, GF_LOG_TRACE,</div><div class='add'>+           "received rpc message (RPC XID: 0x%x"</div><div class='add'>+           " Program: %s, ProgVers: %d, Proc: %d) from rpc-transport (%s)",</div><div class='add'>+           saved_frame-&gt;rpcreq-&gt;xid, saved_frame-&gt;rpcreq-&gt;prog-&gt;progname,</div><div class='add'>+           saved_frame-&gt;rpcreq-&gt;prog-&gt;progver, saved_frame-&gt;rpcreq-&gt;procnum,</div><div class='add'>+           conn-&gt;name);</div><div class='ctx'> </div><div class='ctx'> out:</div><div class='del'>-        if (ret != 0) {</div><div class='del'>-                req-&gt;rpc_status = -1;</div><div class='del'>-        }</div><div class='add'>+    if (ret != 0) {</div><div class='add'>+        req-&gt;rpc_status = -1;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        return ret;</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-rpc_clnt_handle_cbk (struct rpc_clnt *clnt, rpc_transport_pollin_t *msg)</div><div class='add'>+rpc_clnt_handle_cbk(struct rpc_clnt *clnt, rpc_transport_pollin_t *msg)</div><div class='ctx'> {</div><div class='del'>-        char                 *msgbuf = NULL;</div><div class='del'>-        rpcclnt_cb_program_t *program = NULL;</div><div class='del'>-        struct rpc_msg        rpcmsg;</div><div class='del'>-        struct iovec          progmsg; /* RPC Program payload */</div><div class='del'>-        size_t                msglen = 0;</div><div class='del'>-        int                   found  = 0;</div><div class='del'>-        int                   ret    = -1;</div><div class='del'>-        int                   procnum = 0;</div><div class='del'>-</div><div class='del'>-        msgbuf = msg-&gt;vector[0].iov_base;</div><div class='del'>-        msglen = msg-&gt;vector[0].iov_len;</div><div class='del'>-</div><div class='del'>-        ret = xdr_to_rpc_call (msgbuf, msglen, &amp;rpcmsg, &amp;progmsg, NULL,NULL);</div><div class='del'>-        if (ret == -1) {</div><div class='del'>-                gf_log ("rpc-clnt", GF_LOG_ERROR, "RPC call decoding failed");</div><div class='del'>-                goto out;</div><div class='add'>+    char *msgbuf = NULL;</div><div class='add'>+    rpcclnt_cb_program_t *program = NULL;</div><div class='add'>+    struct rpc_msg rpcmsg;</div><div class='add'>+    struct iovec progmsg; /* RPC Program payload */</div><div class='add'>+    size_t msglen = 0;</div><div class='add'>+    int found = 0;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int procnum = 0;</div><div class='add'>+</div><div class='add'>+    msgbuf = msg-&gt;vector[0].iov_base;</div><div class='add'>+    msglen = msg-&gt;vector[0].iov_len;</div><div class='add'>+</div><div class='add'>+    clnt = rpc_clnt_ref(clnt);</div><div class='add'>+    ret = xdr_to_rpc_call(msgbuf, msglen, &amp;rpcmsg, &amp;progmsg, NULL, NULL);</div><div class='add'>+    if (ret == -1) {</div><div class='add'>+        gf_log(clnt-&gt;conn.name, GF_LOG_WARNING, "RPC call decoding failed");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    gf_log(clnt-&gt;conn.name, GF_LOG_TRACE,</div><div class='add'>+           "receivd rpc message (XID: 0x%" GF_PRI_RPC_XID</div><div class='add'>+           ", "</div><div class='add'>+           "Ver: %" GF_PRI_RPC_VERSION ", Program: %" GF_PRI_RPC_PROG_ID</div><div class='add'>+           ", "</div><div class='add'>+           "ProgVers: %" GF_PRI_RPC_PROG_VERS ", Proc: %" GF_PRI_RPC_PROC</div><div class='add'>+           ") "</div><div class='add'>+           "from rpc-transport (%s)",</div><div class='add'>+           rpc_call_xid(&amp;rpcmsg), rpc_call_rpcvers(&amp;rpcmsg),</div><div class='add'>+           rpc_call_program(&amp;rpcmsg), rpc_call_progver(&amp;rpcmsg),</div><div class='add'>+           rpc_call_progproc(&amp;rpcmsg), clnt-&gt;conn.name);</div><div class='add'>+</div><div class='add'>+    procnum = rpc_call_progproc(&amp;rpcmsg);</div><div class='add'>+</div><div class='add'>+    pthread_mutex_lock(&amp;clnt-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        list_for_each_entry(program, &amp;clnt-&gt;programs, program)</div><div class='add'>+        {</div><div class='add'>+            if ((program-&gt;prognum == rpc_call_program(&amp;rpcmsg)) &amp;&amp;</div><div class='add'>+                (program-&gt;progver == rpc_call_progver(&amp;rpcmsg))) {</div><div class='add'>+                found = 1;</div><div class='add'>+                break;</div><div class='add'>+            }</div><div class='ctx'>         }</div><div class='add'>+    }</div><div class='add'>+    pthread_mutex_unlock(&amp;clnt-&gt;lock);</div><div class='ctx'> </div><div class='del'>-        gf_log ("rpc-clnt", GF_LOG_INFO, "RPC XID: %lx, Ver: %ld, Program: %ld,"</div><div class='del'>-                " ProgVers: %ld, Proc: %ld", rpc_call_xid (&amp;rpcmsg),</div><div class='del'>-                rpc_call_rpcvers (&amp;rpcmsg), rpc_call_program (&amp;rpcmsg),</div><div class='del'>-                rpc_call_progver (&amp;rpcmsg), rpc_call_progproc (&amp;rpcmsg));</div><div class='del'>-</div><div class='del'>-        procnum = rpc_call_progproc (&amp;rpcmsg);</div><div class='del'>-</div><div class='del'>-        list_for_each_entry (program, &amp;clnt-&gt;programs, program) {</div><div class='del'>-                if ((program-&gt;prognum == rpc_call_program (&amp;rpcmsg))</div><div class='del'>-                    &amp;&amp; (program-&gt;progver == rpc_call_progver (&amp;rpcmsg))) {</div><div class='del'>-                        found = 1;</div><div class='del'>-                        break;</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='del'>-        if (found &amp;&amp; (procnum &lt; program-&gt;numactors) &amp;&amp;</div><div class='del'>-            (program-&gt;actors[procnum].actor)) {</div><div class='del'>-                program-&gt;actors[procnum].actor (&amp;progmsg);</div><div class='del'>-        }</div><div class='add'>+    if (found &amp;&amp; (procnum &lt; program-&gt;numactors) &amp;&amp;</div><div class='add'>+        (program-&gt;actors[procnum].actor)) {</div><div class='add'>+        program-&gt;actors[procnum].actor(clnt, program-&gt;mydata, &amp;progmsg);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='ctx'> out:</div><div class='del'>-        return ret;</div><div class='add'>+    rpc_clnt_unref(clnt);</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-rpc_clnt_handle_reply (struct rpc_clnt *clnt, rpc_transport_pollin_t *pollin)</div><div class='add'>+rpc_clnt_handle_reply(struct rpc_clnt *clnt, rpc_transport_pollin_t *pollin)</div><div class='ctx'> {</div><div class='del'>-        rpc_clnt_connection_t *conn         = NULL;</div><div class='del'>-        struct saved_frame    *saved_frame  = NULL;</div><div class='del'>-        int                    ret          = -1;</div><div class='del'>-        struct rpc_req        *req          = NULL;</div><div class='del'>-        uint32_t               xid          = 0;</div><div class='del'>-</div><div class='del'>-        conn = &amp;clnt-&gt;conn;</div><div class='del'>-</div><div class='del'>-        xid = ntoh32 (*((uint32_t *)pollin-&gt;vector[0].iov_base));</div><div class='del'>-        saved_frame = lookup_frame (conn, xid);</div><div class='del'>-        if (saved_frame == NULL) {</div><div class='del'>-                gf_log ("rpc-clnt", GF_LOG_CRITICAL, "cannot lookup the "</div><div class='del'>-                        "saved frame for reply with xid (%d)", xid);</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        req = saved_frame-&gt;rpcreq;</div><div class='del'>-        if (req == NULL) {</div><div class='del'>-                gf_log ("rpc-clnt", GF_LOG_CRITICAL,</div><div class='del'>-                        "saved_frame for reply with xid (%d)", xid);</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>- </div><div class='del'>-        ret = rpc_clnt_reply_init (conn, pollin, req, saved_frame);</div><div class='del'>-        if (ret != 0) {</div><div class='del'>-                req-&gt;rpc_status = -1;</div><div class='del'>-                gf_log ("rpc-clnt", GF_LOG_DEBUG, "initialising rpc reply "</div><div class='del'>-                        "failed");</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        req-&gt;cbkfn (req, req-&gt;rsp, req-&gt;rspcnt, saved_frame-&gt;frame);</div><div class='del'>-         </div><div class='del'>-        if (req) {</div><div class='del'>-                rpc_clnt_reply_deinit (req, conn-&gt;rpc_clnt-&gt;reqpool);</div><div class='del'>-        }</div><div class='add'>+    rpc_clnt_connection_t *conn = NULL;</div><div class='add'>+    struct saved_frame *saved_frame = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    struct rpc_req *req = NULL;</div><div class='add'>+    uint32_t xid = 0;</div><div class='add'>+</div><div class='add'>+    clnt = rpc_clnt_ref(clnt);</div><div class='add'>+    conn = &amp;clnt-&gt;conn;</div><div class='add'>+</div><div class='add'>+    xid = ntoh32(*((uint32_t *)pollin-&gt;vector[0].iov_base));</div><div class='add'>+    saved_frame = lookup_frame(conn, xid);</div><div class='add'>+    if (saved_frame == NULL) {</div><div class='add'>+        gf_log(conn-&gt;name, GF_LOG_ERROR,</div><div class='add'>+               "cannot lookup the saved frame for reply with xid (%u)", xid);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    req = saved_frame-&gt;rpcreq;</div><div class='add'>+    if (req == NULL) {</div><div class='add'>+        gf_log(conn-&gt;name, GF_LOG_ERROR, "no request with frame for xid (%u)",</div><div class='add'>+               xid);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = rpc_clnt_reply_init(conn, pollin, req, saved_frame);</div><div class='add'>+    if (ret != 0) {</div><div class='add'>+        req-&gt;rpc_status = -1;</div><div class='add'>+        gf_log(conn-&gt;name, GF_LOG_WARNING, "initialising rpc reply failed");</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    req-&gt;cbkfn(req, req-&gt;rsp, req-&gt;rspcnt, saved_frame-&gt;frame);</div><div class='add'>+</div><div class='add'>+    if (req) {</div><div class='add'>+        rpc_clnt_reply_deinit(req, conn-&gt;rpc_clnt-&gt;reqpool);</div><div class='add'>+    }</div><div class='ctx'> out:</div><div class='ctx'> </div><div class='del'>-        if (saved_frame) {</div><div class='del'>-                mem_put (conn-&gt;rpc_clnt-&gt;saved_frames_pool, saved_frame);</div><div class='del'>-        }</div><div class='add'>+    if (saved_frame) {</div><div class='add'>+        mem_put(saved_frame);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        return ret;</div><div class='add'>+    rpc_clnt_unref(clnt);</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='del'>-inline void</div><div class='del'>-rpc_clnt_set_connected (rpc_clnt_connection_t *conn)</div><div class='add'>+gf_boolean_t</div><div class='add'>+is_rpc_clnt_disconnected(rpc_clnt_connection_t *conn)</div><div class='ctx'> {</div><div class='del'>-        if (!conn) {</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='add'>+    gf_boolean_t disconnected = _gf_true;</div><div class='ctx'> </div><div class='del'>-        pthread_mutex_lock (&amp;conn-&gt;lock);</div><div class='del'>-        {</div><div class='del'>-                conn-&gt;connected = 1;</div><div class='del'>-        }</div><div class='del'>-        pthread_mutex_unlock (&amp;conn-&gt;lock);</div><div class='add'>+    if (!conn)</div><div class='add'>+        return disconnected;</div><div class='ctx'> </div><div class='del'>-out:</div><div class='del'>-        return;</div><div class='add'>+    pthread_mutex_lock(&amp;conn-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        disconnected = conn-&gt;disconnected;</div><div class='add'>+    }</div><div class='add'>+    pthread_mutex_unlock(&amp;conn-&gt;lock);</div><div class='add'>+</div><div class='add'>+    return disconnected;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+static void</div><div class='add'>+rpc_clnt_destroy(struct rpc_clnt *rpc);</div><div class='ctx'> </div><div class='del'>-void</div><div class='del'>-rpc_clnt_unset_connected (rpc_clnt_connection_t *conn)</div><div class='del'>-{</div><div class='del'>-        if (!conn) {</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='add'>+#define RPC_THIS_SAVE(xl)                                                      \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        old_THIS = THIS;                                                       \</div><div class='add'>+        if (!old_THIS)                                                         \</div><div class='add'>+            gf_log_callingfn("rpc", GF_LOG_CRITICAL,                           \</div><div class='add'>+                             "THIS is not initialised.");                      \</div><div class='add'>+        THIS = xl;                                                             \</div><div class='add'>+    } while (0)</div><div class='ctx'> </div><div class='del'>-        pthread_mutex_lock (&amp;conn-&gt;lock);</div><div class='del'>-        {</div><div class='del'>-                conn-&gt;connected = 0;</div><div class='del'>-        }</div><div class='del'>-        pthread_mutex_unlock (&amp;conn-&gt;lock);</div><div class='add'>+#define RPC_THIS_RESTORE (THIS = old_THIS)</div><div class='ctx'> </div><div class='del'>-out:</div><div class='del'>-        return;</div><div class='add'>+static int</div><div class='add'>+rpc_clnt_handle_disconnect(struct rpc_clnt *clnt, rpc_clnt_connection_t *conn)</div><div class='add'>+{</div><div class='add'>+    struct timespec ts = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    gf_boolean_t unref_clnt = _gf_false;</div><div class='add'>+    uint64_t pre_notify_gen = 0, post_notify_gen = 0;</div><div class='add'>+</div><div class='add'>+    pthread_mutex_lock(&amp;conn-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        pre_notify_gen = conn-&gt;cleanup_gen;</div><div class='add'>+    }</div><div class='add'>+    pthread_mutex_unlock(&amp;conn-&gt;lock);</div><div class='add'>+</div><div class='add'>+    if (clnt-&gt;notifyfn)</div><div class='add'>+        clnt-&gt;notifyfn(clnt, clnt-&gt;mydata, RPC_CLNT_DISCONNECT, NULL);</div><div class='add'>+</div><div class='add'>+    pthread_mutex_lock(&amp;conn-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        post_notify_gen = conn-&gt;cleanup_gen;</div><div class='add'>+    }</div><div class='add'>+    pthread_mutex_unlock(&amp;conn-&gt;lock);</div><div class='add'>+</div><div class='add'>+    if (pre_notify_gen == post_notify_gen) {</div><div class='add'>+        /* program didn't invoke cleanup, so rpc has to do it */</div><div class='add'>+        rpc_clnt_connection_cleanup(conn);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    pthread_mutex_lock(&amp;conn-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        if (!conn-&gt;rpc_clnt-&gt;disabled &amp;&amp; (conn-&gt;reconnect == NULL)) {</div><div class='add'>+            ts.tv_sec = 3;</div><div class='add'>+            ts.tv_nsec = 0;</div><div class='add'>+</div><div class='add'>+            rpc_clnt_ref(clnt);</div><div class='add'>+            conn-&gt;reconnect = gf_timer_call_after(clnt-&gt;ctx, ts,</div><div class='add'>+                                                  rpc_clnt_reconnect, conn);</div><div class='add'>+            if (conn-&gt;reconnect == NULL) {</div><div class='add'>+                gf_log(conn-&gt;name, GF_LOG_WARNING,</div><div class='add'>+                       "Cannot create rpc_clnt_reconnect timer");</div><div class='add'>+                unref_clnt = _gf_true;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    pthread_mutex_unlock(&amp;conn-&gt;lock);</div><div class='add'>+</div><div class='add'>+    if (unref_clnt)</div><div class='add'>+        rpc_clnt_unref(clnt);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-rpc_clnt_notify (rpc_transport_t *trans, void *mydata,</div><div class='del'>-                 rpc_transport_event_t event, void *data, ...)</div><div class='add'>+rpc_clnt_notify(rpc_transport_t *trans, void *mydata,</div><div class='add'>+                rpc_transport_event_t event, void *data, ...)</div><div class='ctx'> {</div><div class='del'>-        rpc_clnt_connection_t  *conn     = NULL;</div><div class='del'>-        struct rpc_clnt        *clnt     = NULL;</div><div class='del'>-        int                     ret      = -1;</div><div class='del'>-        rpc_request_info_t     *req_info = NULL;</div><div class='del'>-        rpc_transport_pollin_t *pollin   = NULL;</div><div class='del'>-        struct timeval          tv       = {0, };</div><div class='del'>-</div><div class='del'>-        conn = mydata;</div><div class='del'>-        if (conn == NULL) {</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-        clnt = conn-&gt;rpc_clnt;</div><div class='del'>-</div><div class='del'>-        switch (event) {</div><div class='del'>-        case RPC_TRANSPORT_DISCONNECT:</div><div class='del'>-        {</div><div class='del'>-                rpc_clnt_connection_cleanup (&amp;clnt-&gt;conn);</div><div class='del'>-</div><div class='del'>-                pthread_mutex_lock (&amp;conn-&gt;lock);</div><div class='del'>-                {</div><div class='del'>-                        if (conn-&gt;reconnect == NULL) {</div><div class='del'>-                                tv.tv_sec = 10;</div><div class='del'>-</div><div class='del'>-                                conn-&gt;reconnect =</div><div class='del'>-                                        gf_timer_call_after (clnt-&gt;ctx, tv,</div><div class='del'>-                                                             rpc_clnt_reconnect,</div><div class='del'>-                                                             conn-&gt;trans);</div><div class='del'>-                        }</div><div class='del'>-                }</div><div class='del'>-                pthread_mutex_unlock (&amp;conn-&gt;lock);</div><div class='del'>-</div><div class='del'>-                if (clnt-&gt;notifyfn)</div><div class='del'>-                        ret = clnt-&gt;notifyfn (clnt, clnt-&gt;mydata, RPC_CLNT_DISCONNECT,</div><div class='del'>-                                              NULL);</div><div class='del'>-                break;</div><div class='add'>+    rpc_clnt_connection_t *conn = NULL;</div><div class='add'>+    struct rpc_clnt *clnt = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    rpc_request_info_t *req_info = NULL;</div><div class='add'>+    rpc_transport_pollin_t *pollin = NULL;</div><div class='add'>+    void *clnt_mydata = NULL;</div><div class='add'>+    DECLARE_OLD_THIS;</div><div class='add'>+</div><div class='add'>+    conn = mydata;</div><div class='add'>+    if (conn == NULL) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    clnt = conn-&gt;rpc_clnt;</div><div class='add'>+    if (!clnt)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    RPC_THIS_SAVE(clnt-&gt;owner);</div><div class='add'>+</div><div class='add'>+    switch (event) {</div><div class='add'>+        case RPC_TRANSPORT_DISCONNECT: {</div><div class='add'>+            rpc_clnt_handle_disconnect(clnt, conn);</div><div class='add'>+            /* The auth_value was being reset to AUTH_GLUSTERFS_v2.</div><div class='add'>+             *    if (clnt-&gt;auth_value)</div><div class='add'>+             *           clnt-&gt;auth_value = AUTH_GLUSTERFS_v2;</div><div class='add'>+             * It should not be reset here. The disconnect during</div><div class='add'>+             * portmap request can race with handshake. If handshake</div><div class='add'>+             * happens first and disconnect later, auth_value would set</div><div class='add'>+             * to default value and it never sets back to actual auth_value</div><div class='add'>+             * supported by server. But it's important to set to lower</div><div class='add'>+             * version supported in the case where the server downgrades.</div><div class='add'>+             * So moving this code to RPC_TRANSPORT_CONNECT. Note that</div><div class='add'>+             * CONNECT cannot race with handshake as by nature it is</div><div class='add'>+             * serialized with handhake. An handshake can happen only</div><div class='add'>+             * on a connected transport and hence its strictly serialized.</div><div class='add'>+             */</div><div class='add'>+            break;</div><div class='ctx'>         }</div><div class='ctx'> </div><div class='ctx'>         case RPC_TRANSPORT_CLEANUP:</div><div class='del'>-                /* this event should not be received on a client for, a</div><div class='del'>-                 * transport is only disconnected, but never destroyed.</div><div class='del'>-                 */</div><div class='del'>-                ret = 0;</div><div class='del'>-                break;</div><div class='del'>-</div><div class='del'>-        case RPC_TRANSPORT_MAP_XID_REQUEST:</div><div class='del'>-        {</div><div class='del'>-                req_info = data;</div><div class='del'>-                ret = rpc_clnt_fill_request_info (clnt, req_info);</div><div class='del'>-                break;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        case RPC_TRANSPORT_MSG_RECEIVED:</div><div class='del'>-        {</div><div class='del'>-                pollin = data;</div><div class='del'>-                if (pollin-&gt;is_reply)</div><div class='del'>-                        ret = rpc_clnt_handle_reply (clnt, pollin);</div><div class='del'>-                else</div><div class='del'>-                        ret = rpc_clnt_handle_cbk (clnt, pollin);</div><div class='del'>-                /* ret = clnt-&gt;notifyfn (clnt, clnt-&gt;mydata, RPC_CLNT_MSG,</div><div class='del'>-                 * data);</div><div class='del'>-                 */</div><div class='del'>-                break;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        case RPC_TRANSPORT_MSG_SENT:</div><div class='del'>-        {</div><div class='del'>-                pthread_mutex_lock (&amp;conn-&gt;lock);</div><div class='del'>-                {</div><div class='del'>-                        gettimeofday (&amp;conn-&gt;last_sent, NULL);</div><div class='add'>+            if (clnt-&gt;notifyfn) {</div><div class='add'>+                clnt_mydata = clnt-&gt;mydata;</div><div class='add'>+                clnt-&gt;mydata = NULL;</div><div class='add'>+                ret = clnt-&gt;notifyfn(clnt, clnt_mydata, RPC_CLNT_DESTROY, NULL);</div><div class='add'>+                if (ret &lt; 0) {</div><div class='add'>+                    gf_log(trans-&gt;name, GF_LOG_WARNING,</div><div class='add'>+                           "client notify handler returned error "</div><div class='add'>+                           "while handling RPC_CLNT_DESTROY");</div><div class='ctx'>                 }</div><div class='del'>-                pthread_mutex_unlock (&amp;conn-&gt;lock);</div><div class='add'>+            }</div><div class='add'>+            rpc_clnt_destroy(clnt);</div><div class='add'>+            ret = 0;</div><div class='add'>+            break;</div><div class='add'>+</div><div class='add'>+        case RPC_TRANSPORT_MAP_XID_REQUEST: {</div><div class='add'>+            req_info = data;</div><div class='add'>+            ret = rpc_clnt_fill_request_info(clnt, req_info);</div><div class='add'>+            break;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        case RPC_TRANSPORT_MSG_RECEIVED: {</div><div class='add'>+            timespec_now_realtime(&amp;conn-&gt;last_received);</div><div class='add'>+</div><div class='add'>+            pollin = data;</div><div class='add'>+            if (pollin-&gt;is_reply)</div><div class='add'>+                ret = rpc_clnt_handle_reply(clnt, pollin);</div><div class='add'>+            else</div><div class='add'>+                ret = rpc_clnt_handle_cbk(clnt, pollin);</div><div class='add'>+            /* ret = clnt-&gt;notifyfn (clnt, clnt-&gt;mydata, RPC_CLNT_MSG,</div><div class='add'>+             * data);</div><div class='add'>+             */</div><div class='add'>+            break;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        case RPC_TRANSPORT_MSG_SENT: {</div><div class='add'>+            timespec_now_realtime(&amp;conn-&gt;last_sent);</div><div class='add'>+            ret = 0;</div><div class='add'>+            break;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        case RPC_TRANSPORT_CONNECT: {</div><div class='add'>+            pthread_mutex_lock(&amp;conn-&gt;lock);</div><div class='add'>+            {</div><div class='add'>+                /* Every time there is a disconnection, processes</div><div class='add'>+                 * should try to connect to 'glusterd' (ie, default</div><div class='add'>+                 * port) or whichever port given as 'option remote-port'</div><div class='add'>+                 * in volume file. */</div><div class='add'>+                /* Below code makes sure the (re-)configured port lasts</div><div class='add'>+                 * for just one successful attempt */</div><div class='add'>+                conn-&gt;config.remote_port = 0;</div><div class='add'>+                conn-&gt;connected = 1;</div><div class='add'>+                conn-&gt;disconnected = 0;</div><div class='add'>+                pthread_cond_broadcast(&amp;conn-&gt;cond);</div><div class='add'>+            }</div><div class='add'>+            pthread_mutex_unlock(&amp;conn-&gt;lock);</div><div class='ctx'> </div><div class='del'>-                ret = 0;</div><div class='del'>-                break;</div><div class='del'>-        }</div><div class='add'>+            /* auth value should be set to lower version available</div><div class='add'>+             * and will be set to appropriate version supported by</div><div class='add'>+             * server after the handshake.</div><div class='add'>+             */</div><div class='add'>+            if (clnt-&gt;auth_value)</div><div class='add'>+                clnt-&gt;auth_value = AUTH_GLUSTERFS_v2;</div><div class='add'>+            if (clnt-&gt;notifyfn)</div><div class='add'>+                ret = clnt-&gt;notifyfn(clnt, clnt-&gt;mydata, RPC_CLNT_CONNECT,</div><div class='add'>+                                     NULL);</div><div class='ctx'> </div><div class='del'>-        case RPC_TRANSPORT_CONNECT:</div><div class='del'>-        {</div><div class='del'>-                if (clnt-&gt;notifyfn)</div><div class='del'>-                        ret = clnt-&gt;notifyfn (clnt, clnt-&gt;mydata, RPC_CLNT_CONNECT, NULL);</div><div class='del'>-                break;</div><div class='add'>+            break;</div><div class='ctx'>         }</div><div class='ctx'> </div><div class='ctx'>         case RPC_TRANSPORT_ACCEPT:</div><div class='del'>-                /* only meaningful on a server, no need of handling this event</div><div class='del'>-                 * in a client.</div><div class='del'>-                 */</div><div class='del'>-                ret = 0;</div><div class='del'>-                break;</div><div class='del'>-        }</div><div class='add'>+            /* only meaningful on a server, no need of handling this event</div><div class='add'>+             * in a client.</div><div class='add'>+             */</div><div class='add'>+            ret = 0;</div><div class='add'>+            break;</div><div class='add'>+</div><div class='add'>+        case RPC_TRANSPORT_EVENT_THREAD_DIED:</div><div class='add'>+            /* only meaningful on a server, no need of handling this event on a</div><div class='add'>+             * client */</div><div class='add'>+            ret = 0;</div><div class='add'>+            break;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='ctx'> out:</div><div class='del'>-        return ret;</div><div class='add'>+    RPC_THIS_RESTORE;</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='del'>-void</div><div class='del'>-rpc_clnt_connection_deinit (rpc_clnt_connection_t *conn)</div><div class='add'>+static int</div><div class='add'>+rpc_clnt_connection_init(struct rpc_clnt *clnt, glusterfs_ctx_t *ctx,</div><div class='add'>+                         dict_t *options, char *name)</div><div class='ctx'> {</div><div class='del'>-        return;</div><div class='del'>-}</div><div class='add'>+    int ret = -1;</div><div class='add'>+    rpc_clnt_connection_t *conn = NULL;</div><div class='add'>+    rpc_transport_t *trans = NULL;</div><div class='add'>+</div><div class='add'>+    conn = &amp;clnt-&gt;conn;</div><div class='add'>+    pthread_mutex_init(&amp;clnt-&gt;conn.lock, NULL);</div><div class='add'>+    pthread_cond_init(&amp;clnt-&gt;conn.cond, NULL);</div><div class='add'>+</div><div class='add'>+    conn-&gt;name = gf_strdup(name);</div><div class='add'>+    if (!conn-&gt;name) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_get_int32(options, "frame-timeout", &amp;conn-&gt;frame_timeout);</div><div class='add'>+    if (ret &gt;= 0) {</div><div class='add'>+        gf_log(name, GF_LOG_INFO, "setting frame-timeout to %d",</div><div class='add'>+               conn-&gt;frame_timeout);</div><div class='add'>+    } else {</div><div class='add'>+        gf_log(name, GF_LOG_DEBUG, "defaulting frame-timeout to 30mins");</div><div class='add'>+        conn-&gt;frame_timeout = 1800;</div><div class='add'>+    }</div><div class='add'>+    conn-&gt;rpc_clnt = clnt;</div><div class='add'>+</div><div class='add'>+    ret = dict_get_int32(options, "ping-timeout", &amp;conn-&gt;ping_timeout);</div><div class='add'>+    if (ret &gt;= 0) {</div><div class='add'>+        gf_log(name, GF_LOG_DEBUG, "setting ping-timeout to %d",</div><div class='add'>+               conn-&gt;ping_timeout);</div><div class='add'>+    } else {</div><div class='add'>+        /*TODO: Once the epoll thread model is fixed,</div><div class='add'>+          change the default ping-timeout to 30sec */</div><div class='add'>+        gf_log(name, GF_LOG_DEBUG, "disable ping-timeout");</div><div class='add'>+        conn-&gt;ping_timeout = 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    trans = rpc_transport_load(ctx, options, name);</div><div class='add'>+    if (!trans) {</div><div class='add'>+        gf_log(name, GF_LOG_WARNING,</div><div class='add'>+               "loading of new rpc-transport"</div><div class='add'>+               " failed");</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    rpc_transport_ref(trans);</div><div class='add'>+</div><div class='add'>+    pthread_mutex_lock(&amp;conn-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        conn-&gt;trans = trans;</div><div class='add'>+        trans = NULL;</div><div class='add'>+    }</div><div class='add'>+    pthread_mutex_unlock(&amp;conn-&gt;lock);</div><div class='add'>+</div><div class='add'>+    ret = rpc_transport_register_notify(conn-&gt;trans, rpc_clnt_notify, conn);</div><div class='add'>+    if (ret == -1) {</div><div class='add'>+        gf_log(name, GF_LOG_WARNING, "registering notify failed");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    conn-&gt;saved_frames = saved_frames_new();</div><div class='add'>+    if (!conn-&gt;saved_frames) {</div><div class='add'>+        gf_log(name, GF_LOG_WARNING,</div><div class='add'>+               "creation of saved_frames "</div><div class='add'>+               "failed");</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='ctx'> </div><div class='add'>+out:</div><div class='add'>+    if (ret) {</div><div class='add'>+        pthread_mutex_lock(&amp;conn-&gt;lock);</div><div class='add'>+        {</div><div class='add'>+            trans = conn-&gt;trans;</div><div class='add'>+            conn-&gt;trans = NULL;</div><div class='add'>+        }</div><div class='add'>+        pthread_mutex_unlock(&amp;conn-&gt;lock);</div><div class='add'>+        if (trans)</div><div class='add'>+            rpc_transport_unref(trans);</div><div class='add'>+        // conn cleanup needs to be done since we might have failed to</div><div class='add'>+        // register notification.</div><div class='add'>+        rpc_clnt_connection_cleanup(conn);</div><div class='add'>+    }</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-inline int</div><div class='del'>-rpc_clnt_connection_init (struct rpc_clnt *clnt, glusterfs_ctx_t *ctx,</div><div class='del'>-                          dict_t *options, char *name)</div><div class='add'>+struct rpc_clnt *</div><div class='add'>+rpc_clnt_new(dict_t *options, xlator_t *owner, char *name,</div><div class='add'>+             uint32_t reqpool_size)</div><div class='ctx'> {</div><div class='del'>-        int                    ret  = -1;</div><div class='del'>-        rpc_clnt_connection_t *conn = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    struct rpc_clnt *rpc = NULL;</div><div class='add'>+    glusterfs_ctx_t *ctx = owner-&gt;ctx;</div><div class='add'>+</div><div class='add'>+    rpc = GF_CALLOC(1, sizeof(*rpc), gf_common_mt_rpcclnt_t);</div><div class='add'>+    if (!rpc) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    pthread_mutex_init(&amp;rpc-&gt;lock, NULL);</div><div class='add'>+    rpc-&gt;ctx = ctx;</div><div class='add'>+    rpc-&gt;owner = owner;</div><div class='add'>+    GF_ATOMIC_INIT(rpc-&gt;xid, 1);</div><div class='add'>+</div><div class='add'>+    if (!reqpool_size)</div><div class='add'>+        reqpool_size = RPC_CLNT_DEFAULT_REQUEST_COUNT;</div><div class='add'>+</div><div class='add'>+    rpc-&gt;reqpool = mem_pool_new(struct rpc_req, reqpool_size);</div><div class='add'>+    if (rpc-&gt;reqpool == NULL) {</div><div class='add'>+        pthread_mutex_destroy(&amp;rpc-&gt;lock);</div><div class='add'>+        GF_FREE(rpc);</div><div class='add'>+        rpc = NULL;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    rpc-&gt;saved_frames_pool = mem_pool_new(struct saved_frame, reqpool_size);</div><div class='add'>+    if (rpc-&gt;saved_frames_pool == NULL) {</div><div class='add'>+        pthread_mutex_destroy(&amp;rpc-&gt;lock);</div><div class='add'>+        mem_pool_destroy(rpc-&gt;reqpool);</div><div class='add'>+        GF_FREE(rpc);</div><div class='add'>+        rpc = NULL;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = rpc_clnt_connection_init(rpc, ctx, options, name);</div><div class='add'>+    if (ret == -1) {</div><div class='add'>+        pthread_mutex_destroy(&amp;rpc-&gt;lock);</div><div class='add'>+        mem_pool_destroy(rpc-&gt;reqpool);</div><div class='add'>+        mem_pool_destroy(rpc-&gt;saved_frames_pool);</div><div class='add'>+        GF_FREE(rpc);</div><div class='add'>+        rpc = NULL;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* This is handled to make sure we have modularity in getting the</div><div class='add'>+       auth data changed */</div><div class='add'>+    gf_boolean_t auth_null = dict_get_str_boolean(options, "auth-null", 0);</div><div class='add'>+</div><div class='add'>+    rpc-&gt;auth_value = (auth_null) ? 0 : AUTH_GLUSTERFS_v2;</div><div class='add'>+</div><div class='add'>+    rpc = rpc_clnt_ref(rpc);</div><div class='add'>+    INIT_LIST_HEAD(&amp;rpc-&gt;programs);</div><div class='ctx'> </div><div class='del'>-        conn = &amp;clnt-&gt;conn;</div><div class='del'>-        pthread_mutex_init (&amp;clnt-&gt;conn.lock, NULL);</div><div class='del'>-</div><div class='del'>-        ret = dict_get_int32 (options, "frame-timeout",</div><div class='del'>-                              &amp;conn-&gt;frame_timeout);</div><div class='del'>-        if (ret &gt;= 0) {</div><div class='del'>-                gf_log (name, GF_LOG_DEBUG,</div><div class='del'>-                        "setting frame-timeout to %d", conn-&gt;frame_timeout);</div><div class='del'>-        } else {</div><div class='del'>-                gf_log (name, GF_LOG_DEBUG,</div><div class='del'>-                        "defaulting frame-timeout to 30mins");</div><div class='del'>-                conn-&gt;frame_timeout = 1800;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        conn-&gt;trans = rpc_transport_load (ctx, options, name);</div><div class='del'>-        if (!conn-&gt;trans) {</div><div class='del'>-                gf_log ("rpc-clnt", GF_LOG_DEBUG, "loading of new rpc-transport"</div><div class='del'>-                        " failed");</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        rpc_transport_ref (conn-&gt;trans);</div><div class='del'>-</div><div class='del'>-        conn-&gt;rpc_clnt = clnt;</div><div class='add'>+out:</div><div class='add'>+    return rpc;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        ret = rpc_transport_register_notify (conn-&gt;trans, rpc_clnt_notify,</div><div class='del'>-                                             conn);</div><div class='del'>-        if (ret == -1) {</div><div class='del'>-                gf_log ("rpc-clnt", GF_LOG_DEBUG, "registering notify failed");</div><div class='del'>-                rpc_clnt_connection_cleanup (conn);</div><div class='del'>-                conn = NULL;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='add'>+int</div><div class='add'>+rpc_clnt_start(struct rpc_clnt *rpc)</div><div class='add'>+{</div><div class='add'>+    struct rpc_clnt_connection *conn = NULL;</div><div class='ctx'> </div><div class='del'>-        conn-&gt;saved_frames = saved_frames_new ();</div><div class='del'>-        if (!conn-&gt;saved_frames) {</div><div class='del'>-                gf_log ("rpc-clnt", GF_LOG_DEBUG, "creation of saved_frames "</div><div class='del'>-                        "failed");</div><div class='del'>-                rpc_clnt_connection_cleanup (conn);</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='add'>+    if (!rpc)</div><div class='add'>+        return -1;</div><div class='ctx'> </div><div class='del'>-        rpc_clnt_reconnect (conn-&gt;trans);</div><div class='add'>+    conn = &amp;rpc-&gt;conn;</div><div class='ctx'> </div><div class='del'>-        ret = 0;</div><div class='add'>+    pthread_mutex_lock(&amp;conn-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        rpc-&gt;disabled = 0;</div><div class='add'>+    }</div><div class='add'>+    pthread_mutex_unlock(&amp;conn-&gt;lock);</div><div class='add'>+    /* Corresponding unref will be either on successful timer cancel or last</div><div class='add'>+     * rpc_clnt_reconnect fire event.</div><div class='add'>+     */</div><div class='add'>+    rpc_clnt_ref(rpc);</div><div class='add'>+    rpc_clnt_reconnect(conn);</div><div class='ctx'> </div><div class='del'>-out:</div><div class='del'>-        return ret;</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='del'>-struct rpc_clnt *</div><div class='del'>-rpc_clnt_init (struct rpc_clnt_config *config, dict_t *options,</div><div class='del'>-               glusterfs_ctx_t *ctx, char *name)</div><div class='add'>+int</div><div class='add'>+rpc_clnt_cleanup_and_start(struct rpc_clnt *rpc)</div><div class='ctx'> {</div><div class='del'>-        int                    ret  = -1;</div><div class='del'>-        struct rpc_clnt       *rpc  = NULL;</div><div class='add'>+    struct rpc_clnt_connection *conn = NULL;</div><div class='ctx'> </div><div class='del'>-        rpc = GF_CALLOC (1, sizeof (*rpc), gf_common_mt_rpcclnt_t);</div><div class='del'>-        if (!rpc) {</div><div class='del'>-                gf_log ("rpc-clnt", GF_LOG_ERROR, "out of memory");</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='add'>+    if (!rpc)</div><div class='add'>+        return -1;</div><div class='ctx'> </div><div class='del'>-        pthread_mutex_init (&amp;rpc-&gt;lock, NULL);</div><div class='del'>-        rpc-&gt;ctx = ctx;</div><div class='add'>+    conn = &amp;rpc-&gt;conn;</div><div class='ctx'> </div><div class='del'>-        rpc-&gt;reqpool = mem_pool_new (struct rpc_req,</div><div class='del'>-                                     RPC_CLNT_DEFAULT_REQUEST_COUNT);</div><div class='del'>-        if (rpc-&gt;reqpool == NULL) {</div><div class='del'>-                pthread_mutex_destroy (&amp;rpc-&gt;lock);</div><div class='del'>-                GF_FREE (rpc);</div><div class='del'>-                rpc = NULL;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        rpc-&gt;saved_frames_pool = mem_pool_new (struct saved_frame,</div><div class='del'>-                                              RPC_CLNT_DEFAULT_REQUEST_COUNT);</div><div class='del'>-        if (rpc-&gt;saved_frames_pool == NULL) {</div><div class='del'>-                pthread_mutex_destroy (&amp;rpc-&gt;lock);</div><div class='del'>-                mem_pool_destroy (rpc-&gt;reqpool);</div><div class='del'>-                GF_FREE (rpc);</div><div class='del'>-                rpc = NULL;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        ret = rpc_clnt_connection_init (rpc, ctx, options, name);</div><div class='del'>-        if (ret == -1) {</div><div class='del'>-                pthread_mutex_destroy (&amp;rpc-&gt;lock);</div><div class='del'>-                GF_FREE (rpc);</div><div class='del'>-                rpc = NULL;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='add'>+    rpc_clnt_connection_cleanup(conn);</div><div class='ctx'> </div><div class='del'>-        INIT_LIST_HEAD (&amp;rpc-&gt;programs);</div><div class='add'>+    pthread_mutex_lock(&amp;conn-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        rpc-&gt;disabled = 0;</div><div class='add'>+    }</div><div class='add'>+    pthread_mutex_unlock(&amp;conn-&gt;lock);</div><div class='add'>+    /* Corresponding unref will be either on successful timer cancel or last</div><div class='add'>+     * rpc_clnt_reconnect fire event.</div><div class='add'>+     */</div><div class='add'>+    rpc_clnt_ref(rpc);</div><div class='add'>+    rpc_clnt_reconnect(conn);</div><div class='ctx'> </div><div class='del'>-out:</div><div class='del'>-        return rpc;</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-rpc_clnt_register_notify (struct rpc_clnt *rpc, rpc_clnt_notify_t fn,</div><div class='del'>-                          void *mydata)</div><div class='add'>+rpc_clnt_register_notify(struct rpc_clnt *rpc, rpc_clnt_notify_t fn,</div><div class='add'>+                         void *mydata)</div><div class='ctx'> {</div><div class='del'>-        rpc-&gt;mydata = mydata;</div><div class='del'>-        rpc-&gt;notifyfn = fn;</div><div class='add'>+    rpc-&gt;mydata = mydata;</div><div class='add'>+    rpc-&gt;notifyfn = fn;</div><div class='ctx'> </div><div class='del'>-        return 0;</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-ssize_t</div><div class='del'>-xdr_serialize_glusterfs_auth (char *dest, struct auth_glusterfs_parms *au)</div><div class='del'>-{</div><div class='del'>-        ssize_t ret = -1;</div><div class='del'>-        XDR     xdr;</div><div class='add'>+/* used for GF_LOG_OCCASIONALLY() */</div><div class='add'>+static int gf_auth_max_groups_log = 0;</div><div class='ctx'> </div><div class='del'>-        if ((!dest) || (!au))</div><div class='del'>-                return -1;</div><div class='del'>-</div><div class='del'>-        xdrmem_create (&amp;xdr, dest, 1024,</div><div class='del'>-                       XDR_ENCODE);</div><div class='add'>+static inline int</div><div class='add'>+setup_glusterfs_auth_param_v3(call_frame_t *frame, auth_glusterfs_params_v3 *au,</div><div class='add'>+                              int lk_owner_len, char *owner_data)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    unsigned int max_groups = 0;</div><div class='add'>+    int max_lkowner_len = 0;</div><div class='add'>+</div><div class='add'>+    au-&gt;pid = frame-&gt;root-&gt;pid;</div><div class='add'>+    au-&gt;uid = frame-&gt;root-&gt;uid;</div><div class='add'>+    au-&gt;gid = frame-&gt;root-&gt;gid;</div><div class='add'>+</div><div class='add'>+    au-&gt;flags = frame-&gt;root-&gt;flags;</div><div class='add'>+    au-&gt;ctime_sec = frame-&gt;root-&gt;ctime.tv_sec;</div><div class='add'>+    au-&gt;ctime_nsec = frame-&gt;root-&gt;ctime.tv_nsec;</div><div class='add'>+</div><div class='add'>+    au-&gt;lk_owner.lk_owner_val = owner_data;</div><div class='add'>+    au-&gt;lk_owner.lk_owner_len = lk_owner_len;</div><div class='add'>+    au-&gt;groups.groups_val = frame-&gt;root-&gt;groups;</div><div class='add'>+    au-&gt;groups.groups_len = frame-&gt;root-&gt;ngrps;</div><div class='add'>+</div><div class='add'>+    /* The number of groups and the size of lk_owner depend on oneother.</div><div class='add'>+     * We can truncate the groups, but should not touch the lk_owner. */</div><div class='add'>+    max_groups = GF_AUTH_GLUSTERFS_MAX_GROUPS(lk_owner_len, AUTH_GLUSTERFS_v3);</div><div class='add'>+    if (au-&gt;groups.groups_len &gt; max_groups) {</div><div class='add'>+        GF_LOG_OCCASIONALLY(gf_auth_max_groups_log, "rpc-auth", GF_LOG_WARNING,</div><div class='add'>+                            "truncating grouplist "</div><div class='add'>+                            "from %d to %d",</div><div class='add'>+                            au-&gt;groups.groups_len, max_groups);</div><div class='add'>+</div><div class='add'>+        au-&gt;groups.groups_len = max_groups;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    max_lkowner_len = GF_AUTH_GLUSTERFS_MAX_LKOWNER(au-&gt;groups.groups_len,</div><div class='add'>+                                                    AUTH_GLUSTERFS_v3);</div><div class='add'>+    if (lk_owner_len &gt; max_lkowner_len) {</div><div class='add'>+        gf_log("rpc-clnt", GF_LOG_ERROR,</div><div class='add'>+               "lkowner field is too "</div><div class='add'>+               "big (%d), it does not fit in the rpc-header",</div><div class='add'>+               au-&gt;lk_owner.lk_owner_len);</div><div class='add'>+        errno = E2BIG;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        if (!xdr_auth_glusterfs_parms (&amp;xdr, au)) {</div><div class='del'>-                ret = -1;</div><div class='del'>-                goto ret;</div><div class='del'>-        }</div><div class='add'>+static inline int</div><div class='add'>+setup_glusterfs_auth_param_v2(call_frame_t *frame, auth_glusterfs_parms_v2 *au,</div><div class='add'>+                              int lk_owner_len, char *owner_data)</div><div class='add'>+{</div><div class='add'>+    unsigned int max_groups = 0;</div><div class='add'>+    int max_lkowner_len = 0;</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    au-&gt;pid = frame-&gt;root-&gt;pid;</div><div class='add'>+    au-&gt;uid = frame-&gt;root-&gt;uid;</div><div class='add'>+    au-&gt;gid = frame-&gt;root-&gt;gid;</div><div class='add'>+</div><div class='add'>+    au-&gt;lk_owner.lk_owner_val = owner_data;</div><div class='add'>+    au-&gt;lk_owner.lk_owner_len = lk_owner_len;</div><div class='add'>+    au-&gt;groups.groups_val = frame-&gt;root-&gt;groups;</div><div class='add'>+    au-&gt;groups.groups_len = frame-&gt;root-&gt;ngrps;</div><div class='add'>+</div><div class='add'>+    /* The number of groups and the size of lk_owner depend on oneother.</div><div class='add'>+     * We can truncate the groups, but should not touch the lk_owner. */</div><div class='add'>+    max_groups = GF_AUTH_GLUSTERFS_MAX_GROUPS(lk_owner_len, AUTH_GLUSTERFS_v2);</div><div class='add'>+    if (au-&gt;groups.groups_len &gt; max_groups) {</div><div class='add'>+        GF_LOG_OCCASIONALLY(gf_auth_max_groups_log, "rpc-auth", GF_LOG_WARNING,</div><div class='add'>+                            "truncating grouplist "</div><div class='add'>+                            "from %d to %d",</div><div class='add'>+                            au-&gt;groups.groups_len, max_groups);</div><div class='add'>+</div><div class='add'>+        au-&gt;groups.groups_len = max_groups;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    max_lkowner_len = GF_AUTH_GLUSTERFS_MAX_LKOWNER(au-&gt;groups.groups_len,</div><div class='add'>+                                                    AUTH_GLUSTERFS_v2);</div><div class='add'>+    if (lk_owner_len &gt; max_lkowner_len) {</div><div class='add'>+        gf_log("rpc-auth", GF_LOG_ERROR,</div><div class='add'>+               "lkowner field is too "</div><div class='add'>+               "big (%d), it does not fit in the rpc-header",</div><div class='add'>+               au-&gt;lk_owner.lk_owner_len);</div><div class='add'>+        errno = E2BIG;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        ret = (((size_t)(&amp;xdr)-&gt;x_private) - ((size_t)(&amp;xdr)-&gt;x_base));</div><div class='add'>+static ssize_t</div><div class='add'>+xdr_serialize_glusterfs_auth(struct rpc_clnt *clnt, call_frame_t *frame,</div><div class='add'>+                             char *dest)</div><div class='add'>+{</div><div class='add'>+    ssize_t ret = -1;</div><div class='add'>+    XDR xdr;</div><div class='add'>+    char owner[4] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int32_t pid = 0;</div><div class='add'>+    char *lk_owner_data = NULL;</div><div class='add'>+    int lk_owner_len = 0;</div><div class='add'>+</div><div class='add'>+    if ((!dest))</div><div class='add'>+        return -1;</div><div class='add'>+</div><div class='add'>+    xdrmem_create(&amp;xdr, dest, GF_MAX_AUTH_BYTES, XDR_ENCODE);</div><div class='add'>+</div><div class='add'>+    if (frame-&gt;root-&gt;lk_owner.len) {</div><div class='add'>+        lk_owner_data = frame-&gt;root-&gt;lk_owner.data;</div><div class='add'>+        lk_owner_len = frame-&gt;root-&gt;lk_owner.len;</div><div class='add'>+    } else {</div><div class='add'>+        pid = frame-&gt;root-&gt;pid;</div><div class='add'>+        owner[0] = (char)(pid &amp; 0xff);</div><div class='add'>+        owner[1] = (char)((pid &gt;&gt; 8) &amp; 0xff);</div><div class='add'>+        owner[2] = (char)((pid &gt;&gt; 16) &amp; 0xff);</div><div class='add'>+        owner[3] = (char)((pid &gt;&gt; 24) &amp; 0xff);</div><div class='add'>+</div><div class='add'>+        lk_owner_data = owner;</div><div class='add'>+        lk_owner_len = 4;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (clnt-&gt;auth_value == AUTH_GLUSTERFS_v2) {</div><div class='add'>+        auth_glusterfs_parms_v2 au_v2 = {</div><div class='add'>+            0,</div><div class='add'>+        };</div><div class='add'>+</div><div class='add'>+        ret = setup_glusterfs_auth_param_v2(frame, &amp;au_v2, lk_owner_len,</div><div class='add'>+                                            lk_owner_data);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+        if (!xdr_auth_glusterfs_parms_v2(&amp;xdr, &amp;au_v2)) {</div><div class='add'>+            gf_log(THIS-&gt;name, GF_LOG_WARNING,</div><div class='add'>+                   "failed to encode auth glusterfs elements");</div><div class='add'>+            ret = -1;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    } else if (clnt-&gt;auth_value == AUTH_GLUSTERFS_v3) {</div><div class='add'>+        auth_glusterfs_params_v3 au_v3 = {</div><div class='add'>+            0,</div><div class='add'>+        };</div><div class='add'>+</div><div class='add'>+        ret = setup_glusterfs_auth_param_v3(frame, &amp;au_v3, lk_owner_len,</div><div class='add'>+                                            lk_owner_data);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+</div><div class='add'>+        if (!xdr_auth_glusterfs_params_v3(&amp;xdr, &amp;au_v3)) {</div><div class='add'>+            gf_log(THIS-&gt;name, GF_LOG_WARNING,</div><div class='add'>+                   "failed to encode auth glusterfs elements");</div><div class='add'>+            ret = -1;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    } else {</div><div class='add'>+        gf_log(THIS-&gt;name, GF_LOG_WARNING,</div><div class='add'>+               "failed to encode auth glusterfs elements");</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = (((size_t)(&amp;xdr)-&gt;x_private) - ((size_t)(&amp;xdr)-&gt;x_base));</div><div class='ctx'> </div><div class='del'>-ret:</div><div class='del'>-        return ret;</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-rpc_clnt_fill_request (int prognum, int progver, int procnum, int payload,</div><div class='del'>-                       uint64_t xid, struct auth_glusterfs_parms *au,</div><div class='del'>-                       struct rpc_msg *request, char *auth_data)</div><div class='add'>+rpc_clnt_fill_request(struct rpc_clnt *clnt, int prognum, int progver,</div><div class='add'>+                      int procnum, uint64_t xid, call_frame_t *fr,</div><div class='add'>+                      struct rpc_msg *request, char *auth_data)</div><div class='ctx'> {</div><div class='del'>-        int   ret          = -1;</div><div class='add'>+    int ret = -1;</div><div class='ctx'> </div><div class='del'>-        if (!request) {</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='add'>+    if (!request) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        memset (request, 0, sizeof (*request));</div><div class='add'>+    memset(request, 0, sizeof(*request));</div><div class='ctx'> </div><div class='del'>-        request-&gt;rm_xid = xid;</div><div class='del'>-        request-&gt;rm_direction = CALL;</div><div class='add'>+    request-&gt;rm_xid = xid;</div><div class='add'>+    request-&gt;rm_direction = CALL;</div><div class='ctx'> </div><div class='del'>-        request-&gt;rm_call.cb_rpcvers = 2;</div><div class='del'>-        request-&gt;rm_call.cb_prog = prognum;</div><div class='del'>-        request-&gt;rm_call.cb_vers = progver;</div><div class='del'>-        request-&gt;rm_call.cb_proc = procnum;</div><div class='add'>+    request-&gt;rm_call.cb_rpcvers = 2;</div><div class='add'>+    request-&gt;rm_call.cb_prog = prognum;</div><div class='add'>+    request-&gt;rm_call.cb_vers = progver;</div><div class='add'>+    request-&gt;rm_call.cb_proc = procnum;</div><div class='ctx'> </div><div class='del'>-        /* TODO: Using AUTH_GLUSTERFS for time-being. Make it modular in</div><div class='del'>-         * future so it is easy to plug-in new authentication schemes.</div><div class='del'>-         */</div><div class='del'>-        ret = xdr_serialize_glusterfs_auth (auth_data, au);</div><div class='add'>+    if (!clnt-&gt;auth_value) {</div><div class='add'>+        request-&gt;rm_call.cb_cred.oa_flavor = AUTH_NULL;</div><div class='add'>+        request-&gt;rm_call.cb_cred.oa_base = NULL;</div><div class='add'>+        request-&gt;rm_call.cb_cred.oa_length = 0;</div><div class='add'>+    } else {</div><div class='add'>+        ret = xdr_serialize_glusterfs_auth(clnt, fr, auth_data);</div><div class='ctx'>         if (ret == -1) {</div><div class='del'>-                gf_log ("rpc-clnt", GF_LOG_DEBUG, "cannot encode credentials");</div><div class='del'>-                goto out;</div><div class='add'>+            gf_log("rpc-clnt", GF_LOG_WARNING,</div><div class='add'>+                   "cannot encode auth credentials");</div><div class='add'>+            goto out;</div><div class='ctx'>         }</div><div class='ctx'> </div><div class='del'>-        request-&gt;rm_call.cb_cred.oa_flavor = AUTH_GLUSTERFS;</div><div class='del'>-        request-&gt;rm_call.cb_cred.oa_base   = auth_data;</div><div class='add'>+        request-&gt;rm_call.cb_cred.oa_flavor = clnt-&gt;auth_value;</div><div class='add'>+        request-&gt;rm_call.cb_cred.oa_base = auth_data;</div><div class='ctx'>         request-&gt;rm_call.cb_cred.oa_length = ret;</div><div class='add'>+    }</div><div class='add'>+    request-&gt;rm_call.cb_verf.oa_flavor = AUTH_NONE;</div><div class='add'>+    request-&gt;rm_call.cb_verf.oa_base = NULL;</div><div class='add'>+    request-&gt;rm_call.cb_verf.oa_length = 0;</div><div class='ctx'> </div><div class='del'>-        request-&gt;rm_call.cb_verf.oa_flavor = AUTH_NONE;</div><div class='del'>-        request-&gt;rm_call.cb_verf.oa_base = NULL;</div><div class='del'>-        request-&gt;rm_call.cb_verf.oa_length = 0;</div><div class='del'>-</div><div class='del'>-        ret = 0;</div><div class='add'>+    ret = 0;</div><div class='ctx'> out:</div><div class='del'>-        return ret;</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> struct iovec</div><div class='del'>-rpc_clnt_record_build_header (char *recordstart, size_t rlen,</div><div class='del'>-                              struct rpc_msg *request, size_t payload)</div><div class='add'>+rpc_clnt_record_build_header(char *recordstart, size_t rlen,</div><div class='add'>+                             struct rpc_msg *request, size_t payload)</div><div class='ctx'> {</div><div class='del'>-        struct iovec    requesthdr = {0, };</div><div class='del'>-        struct iovec    txrecord   = {0, 0};</div><div class='del'>-        int             ret        = -1;</div><div class='del'>-        size_t          fraglen    = 0;</div><div class='del'>-</div><div class='del'>-        ret = rpc_request_to_xdr (request, recordstart, rlen, &amp;requesthdr);</div><div class='del'>-        if (ret == -1) {</div><div class='del'>-                gf_log ("rpc-clnt", GF_LOG_DEBUG,</div><div class='del'>-                        "Failed to create RPC request");</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        fraglen = payload + requesthdr.iov_len;</div><div class='del'>-        gf_log ("rpc-clnt", GF_LOG_TRACE, "Request fraglen %zu, payload: %zu, "</div><div class='del'>-                "rpc hdr: %zu", fraglen, payload, requesthdr.iov_len);</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-        txrecord.iov_base = recordstart;</div><div class='del'>-</div><div class='del'>-        /* Remember, this is only the vec for the RPC header and does not</div><div class='del'>-         * include the payload above. We needed the payload only to calculate</div><div class='del'>-         * the size of the full fragment. This size is sent in the fragment</div><div class='del'>-         * header.</div><div class='del'>-         */</div><div class='del'>-        txrecord.iov_len = requesthdr.iov_len;</div><div class='add'>+    struct iovec requesthdr = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    struct iovec txrecord = {0, 0};</div><div class='add'>+    int ret = -1;</div><div class='add'>+    size_t fraglen = 0;</div><div class='add'>+</div><div class='add'>+    ret = rpc_request_to_xdr(request, recordstart, rlen, &amp;requesthdr);</div><div class='add'>+    if (ret == -1) {</div><div class='add'>+        gf_log("rpc-clnt", GF_LOG_DEBUG, "Failed to create RPC request");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    fraglen = payload + requesthdr.iov_len;</div><div class='add'>+    gf_log("rpc-clnt", GF_LOG_TRACE,</div><div class='add'>+           "Request fraglen %zu, payload: %zu, "</div><div class='add'>+           "rpc hdr: %zu",</div><div class='add'>+           fraglen, payload, requesthdr.iov_len);</div><div class='add'>+</div><div class='add'>+    txrecord.iov_base = recordstart;</div><div class='add'>+</div><div class='add'>+    /* Remember, this is only the vec for the RPC header and does not</div><div class='add'>+     * include the payload above. We needed the payload only to calculate</div><div class='add'>+     * the size of the full fragment. This size is sent in the fragment</div><div class='add'>+     * header.</div><div class='add'>+     */</div><div class='add'>+    txrecord.iov_len = requesthdr.iov_len;</div><div class='ctx'> </div><div class='ctx'> out:</div><div class='del'>-        return txrecord;</div><div class='add'>+    return txrecord;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> struct iobuf *</div><div class='del'>-rpc_clnt_record_build_record (struct rpc_clnt *clnt, int prognum, int progver,</div><div class='del'>-                              int procnum, size_t payload, uint64_t xid,</div><div class='del'>-                              struct auth_glusterfs_parms *au, struct iovec *recbuf)</div><div class='add'>+rpc_clnt_record_build_record(struct rpc_clnt *clnt, call_frame_t *fr,</div><div class='add'>+                             int prognum, int progver, int procnum,</div><div class='add'>+                             size_t hdrsize, uint64_t xid, struct iovec *recbuf)</div><div class='ctx'> {</div><div class='del'>-        struct rpc_msg           request                            = {0, };</div><div class='del'>-        struct iobuf            *request_iob                        = NULL;</div><div class='del'>-        char                    *record                             = NULL;</div><div class='del'>-        struct iovec             recordhdr                          = {0, };</div><div class='del'>-        size_t                   pagesize                           = 0;</div><div class='del'>-        int                      ret                                = -1;</div><div class='del'>-        char                     auth_data[RPC_CLNT_MAX_AUTH_BYTES] = {0, };</div><div class='del'>-</div><div class='del'>-        if ((!clnt) || (!recbuf) || (!au)) {</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='add'>+    struct rpc_msg request = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    struct iobuf *request_iob = NULL;</div><div class='add'>+    char *record = NULL;</div><div class='add'>+    struct iovec recordhdr = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    size_t pagesize = 0;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    size_t xdr_size = 0;</div><div class='add'>+    char auth_data[GF_MAX_AUTH_BYTES] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    if ((!clnt) || (!recbuf)) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Fill the rpc structure and XDR it into the buffer got above. */</div><div class='add'>+    ret = rpc_clnt_fill_request(clnt, prognum, progver, procnum, xid, fr,</div><div class='add'>+                                &amp;request, auth_data);</div><div class='add'>+</div><div class='add'>+    if (ret == -1) {</div><div class='add'>+        gf_log(clnt-&gt;conn.name, GF_LOG_WARNING,</div><div class='add'>+               "cannot build a rpc-request xid (%" PRIu64 ")", xid);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    xdr_size = xdr_sizeof((xdrproc_t)xdr_callmsg, &amp;request);</div><div class='add'>+</div><div class='add'>+    /* First, try to get a pointer into the buffer which the RPC</div><div class='add'>+     * layer can use.</div><div class='add'>+     */</div><div class='add'>+    request_iob = iobuf_get2(clnt-&gt;ctx-&gt;iobuf_pool, (xdr_size + hdrsize));</div><div class='add'>+    if (!request_iob) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    pagesize = iobuf_pagesize(request_iob);</div><div class='add'>+</div><div class='add'>+    record = iobuf_ptr(request_iob); /* Now we have it. */</div><div class='add'>+</div><div class='add'>+    recordhdr = rpc_clnt_record_build_header(record, pagesize, &amp;request,</div><div class='add'>+                                             hdrsize);</div><div class='add'>+</div><div class='add'>+    if (!recordhdr.iov_base) {</div><div class='add'>+        gf_log(clnt-&gt;conn.name, GF_LOG_ERROR, "Failed to build record header");</div><div class='add'>+        iobuf_unref(request_iob);</div><div class='add'>+        request_iob = NULL;</div><div class='add'>+        recbuf-&gt;iov_base = NULL;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    recbuf-&gt;iov_base = recordhdr.iov_base;</div><div class='add'>+    recbuf-&gt;iov_len = recordhdr.iov_len;</div><div class='ctx'> </div><div class='del'>-        /* First, try to get a pointer into the buffer which the RPC</div><div class='del'>-         * layer can use.</div><div class='del'>-         */</div><div class='del'>-        request_iob = iobuf_get (clnt-&gt;ctx-&gt;iobuf_pool);</div><div class='del'>-        if (!request_iob) {</div><div class='del'>-                gf_log ("rpc-clnt", GF_LOG_ERROR, "Failed to get iobuf");</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='add'>+out:</div><div class='add'>+    return request_iob;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        pagesize = ((struct iobuf_pool *)clnt-&gt;ctx-&gt;iobuf_pool)-&gt;page_size;</div><div class='add'>+static inline struct iobuf *</div><div class='add'>+rpc_clnt_record(struct rpc_clnt *clnt, call_frame_t *call_frame,</div><div class='add'>+                rpc_clnt_prog_t *prog, int procnum, size_t hdrlen,</div><div class='add'>+                struct iovec *rpchdr, uint64_t callid)</div><div class='add'>+{</div><div class='add'>+    if (!prog || !rpchdr || !call_frame) {</div><div class='add'>+        return NULL;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        record = iobuf_ptr (request_iob);  /* Now we have it. */</div><div class='add'>+    return rpc_clnt_record_build_record(clnt, call_frame, prog-&gt;prognum,</div><div class='add'>+                                        prog-&gt;progver, procnum, hdrlen, callid,</div><div class='add'>+                                        rpchdr);</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        /* Fill the rpc structure and XDR it into the buffer got above. */</div><div class='del'>-        ret = rpc_clnt_fill_request (prognum, progver, procnum, payload, xid,</div><div class='del'>-                                     au, &amp;request, auth_data);</div><div class='del'>-        if (ret == -1) {</div><div class='del'>-                gf_log ("rpc-clnt", GF_LOG_DEBUG, "cannot build a rpc-request "</div><div class='del'>-                        "xid (%"PRIu64")", xid);</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='add'>+int</div><div class='add'>+rpcclnt_cbk_program_register(struct rpc_clnt *clnt,</div><div class='add'>+                             rpcclnt_cb_program_t *program, void *mydata)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    char already_registered = 0;</div><div class='add'>+    rpcclnt_cb_program_t *tmp = NULL;</div><div class='ctx'> </div><div class='del'>-        recordhdr = rpc_clnt_record_build_header (record, pagesize, &amp;request,</div><div class='del'>-                                                  payload);</div><div class='add'>+    if (!clnt)</div><div class='add'>+        goto out;</div><div class='ctx'> </div><div class='del'>-        //GF_FREE (request.rm_call.cb_cred.oa_base);</div><div class='add'>+    if (program-&gt;actors == NULL)</div><div class='add'>+        goto out;</div><div class='ctx'> </div><div class='del'>-        if (!recordhdr.iov_base) {</div><div class='del'>-                gf_log ("rpc-clnt", GF_LOG_ERROR, "Failed to build record "</div><div class='del'>-                        " header");</div><div class='del'>-                iobuf_unref (request_iob);</div><div class='del'>-                request_iob = NULL;</div><div class='del'>-                recbuf-&gt;iov_base = NULL;</div><div class='del'>-                goto out;</div><div class='add'>+    pthread_mutex_lock(&amp;clnt-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        list_for_each_entry(tmp, &amp;clnt-&gt;programs, program)</div><div class='add'>+        {</div><div class='add'>+            if ((program-&gt;prognum == tmp-&gt;prognum) &amp;&amp;</div><div class='add'>+                (program-&gt;progver == tmp-&gt;progver)) {</div><div class='add'>+                already_registered = 1;</div><div class='add'>+                break;</div><div class='add'>+            }</div><div class='ctx'>         }</div><div class='add'>+    }</div><div class='add'>+    pthread_mutex_unlock(&amp;clnt-&gt;lock);</div><div class='ctx'> </div><div class='del'>-        recbuf-&gt;iov_base = recordhdr.iov_base;</div><div class='del'>-        recbuf-&gt;iov_len = recordhdr.iov_len;</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        return request_iob;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-struct iobuf *</div><div class='del'>-rpc_clnt_record (struct rpc_clnt *clnt, call_frame_t *call_frame,</div><div class='del'>-                 rpc_clnt_prog_t *prog,int procnum, size_t payload_len,</div><div class='del'>-                 struct iovec *rpchdr, uint64_t callid)</div><div class='del'>-{</div><div class='del'>-        struct auth_glusterfs_parms  au                    = {0, };</div><div class='del'>-        struct iobuf                *request_iob           = NULL;</div><div class='del'>-</div><div class='del'>-        if (!prog || !rpchdr || !call_frame) {</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='add'>+    if (already_registered) {</div><div class='add'>+        gf_log_callingfn(clnt-&gt;conn.name, GF_LOG_DEBUG, "already registered");</div><div class='add'>+        ret = 0;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        au.pid      = call_frame-&gt;root-&gt;pid;</div><div class='del'>-        au.uid      = call_frame-&gt;root-&gt;uid;</div><div class='del'>-        au.gid      = call_frame-&gt;root-&gt;gid;</div><div class='del'>-        au.ngrps    = call_frame-&gt;root-&gt;ngrps;</div><div class='del'>-        au.lk_owner = call_frame-&gt;root-&gt;lk_owner;</div><div class='del'>-        if (!au.lk_owner)</div><div class='del'>-                au.lk_owner = au.pid;</div><div class='add'>+    tmp = GF_MALLOC(sizeof(*tmp), gf_common_mt_rpcclnt_cb_program_t);</div><div class='add'>+    if (tmp == NULL) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        gf_log ("", GF_LOG_TRACE, "Auth Info: pid: %u, uid: %d"</div><div class='del'>-                ", gid: %d, owner: %"PRId64,</div><div class='del'>-                au.pid, au.uid, au.gid, au.lk_owner);</div><div class='add'>+    memcpy(tmp, program, sizeof(*tmp));</div><div class='add'>+    INIT_LIST_HEAD(&amp;tmp-&gt;program);</div><div class='ctx'> </div><div class='del'>-        memcpy (au.groups, call_frame-&gt;root-&gt;groups, 16);</div><div class='add'>+    tmp-&gt;mydata = mydata;</div><div class='ctx'> </div><div class='del'>-        //rpc_transport_get_myname (clnt-&gt;conn.trans, myname, UNIX_PATH_MAX);</div><div class='del'>-        //au.aup_machname = myname;</div><div class='add'>+    pthread_mutex_lock(&amp;clnt-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        list_add_tail(&amp;tmp-&gt;program, &amp;clnt-&gt;programs);</div><div class='add'>+    }</div><div class='add'>+    pthread_mutex_unlock(&amp;clnt-&gt;lock);</div><div class='ctx'> </div><div class='del'>-        /* Assuming the client program would like to speak to the same versioned</div><div class='del'>-         * program on server.</div><div class='del'>-         */</div><div class='del'>-        request_iob = rpc_clnt_record_build_record (clnt, prog-&gt;prognum,</div><div class='del'>-                                                    prog-&gt;progver,</div><div class='del'>-                                                    procnum, payload_len,</div><div class='del'>-                                                    callid, &amp;au,</div><div class='del'>-                                                    rpchdr);</div><div class='del'>-        if (!request_iob) {</div><div class='del'>-                gf_log ("rpc-clnt", GF_LOG_DEBUG, "cannot build rpc-record");</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='add'>+    ret = 0;</div><div class='add'>+    gf_log(clnt-&gt;conn.name, GF_LOG_DEBUG,</div><div class='add'>+           "New program registered: %s, Num: %d, Ver: %d", program-&gt;progname,</div><div class='add'>+           program-&gt;prognum, program-&gt;progver);</div><div class='ctx'> </div><div class='ctx'> out:</div><div class='del'>-        return request_iob;</div><div class='add'>+    if (ret == -1 &amp;&amp; clnt) {</div><div class='add'>+        gf_log(clnt-&gt;conn.name, GF_LOG_ERROR,</div><div class='add'>+               "Program registration failed:"</div><div class='add'>+               " %s, Num: %d, Ver: %d",</div><div class='add'>+               program-&gt;progname, program-&gt;prognum, program-&gt;progver);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-rpcclnt_cbk_program_register (struct rpc_clnt *clnt,</div><div class='del'>-                              rpcclnt_cb_program_t *program)</div><div class='add'>+rpc_clnt_submit(struct rpc_clnt *rpc, rpc_clnt_prog_t *prog, int procnum,</div><div class='add'>+                fop_cbk_fn_t cbkfn, struct iovec *proghdr, int proghdrcount,</div><div class='add'>+                struct iovec *progpayload, int progpayloadcount,</div><div class='add'>+                struct iobref *iobref, void *frame, struct iovec *rsphdr,</div><div class='add'>+                int rsphdr_count, struct iovec *rsp_payload,</div><div class='add'>+                int rsp_payload_count, struct iobref *rsp_iobref)</div><div class='ctx'> {</div><div class='del'>-        int ret = -1;</div><div class='del'>-</div><div class='del'>-        if (!clnt)</div><div class='del'>-                goto out;</div><div class='add'>+    rpc_clnt_connection_t *conn = NULL;</div><div class='add'>+    struct iobuf *request_iob = NULL;</div><div class='add'>+    struct iovec rpchdr = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    struct rpc_req *rpcreq = NULL;</div><div class='add'>+    rpc_transport_req_t req;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int proglen = 0;</div><div class='add'>+    char new_iobref = 0;</div><div class='add'>+    uint64_t callid = 0;</div><div class='add'>+    gf_boolean_t need_unref = _gf_false;</div><div class='add'>+    call_frame_t *cframe = frame;</div><div class='add'>+</div><div class='add'>+    if (!rpc || !prog || !frame) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    conn = &amp;rpc-&gt;conn;</div><div class='add'>+</div><div class='add'>+    rpcreq = mem_get(rpc-&gt;reqpool);</div><div class='add'>+    if (rpcreq == NULL) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    memset(rpcreq, 0, sizeof(*rpcreq));</div><div class='add'>+    memset(&amp;req, 0, sizeof(req));</div><div class='add'>+</div><div class='add'>+    if (!iobref) {</div><div class='add'>+        iobref = iobref_new();</div><div class='add'>+        if (!iobref) {</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        new_iobref = 1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    callid = GF_ATOMIC_INC(rpc-&gt;xid);</div><div class='add'>+</div><div class='add'>+    rpcreq-&gt;prog = prog;</div><div class='add'>+    rpcreq-&gt;procnum = procnum;</div><div class='add'>+    rpcreq-&gt;conn = conn;</div><div class='add'>+    rpcreq-&gt;xid = callid;</div><div class='add'>+    rpcreq-&gt;cbkfn = cbkfn;</div><div class='add'>+</div><div class='add'>+    ret = -1;</div><div class='add'>+</div><div class='add'>+    if (proghdr) {</div><div class='add'>+        proglen += iov_length(proghdr, proghdrcount);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    request_iob = rpc_clnt_record(rpc, frame, prog, procnum, proglen, &amp;rpchdr,</div><div class='add'>+                                  callid);</div><div class='add'>+    if (!request_iob) {</div><div class='add'>+        gf_log(conn-&gt;name, GF_LOG_WARNING, "cannot build rpc-record");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    iobref_add(iobref, request_iob);</div><div class='add'>+</div><div class='add'>+    req.msg.rpchdr = &amp;rpchdr;</div><div class='add'>+    req.msg.rpchdrcount = 1;</div><div class='add'>+    req.msg.proghdr = proghdr;</div><div class='add'>+    req.msg.proghdrcount = proghdrcount;</div><div class='add'>+    req.msg.progpayload = progpayload;</div><div class='add'>+    req.msg.progpayloadcount = progpayloadcount;</div><div class='add'>+    req.msg.iobref = iobref;</div><div class='add'>+</div><div class='add'>+    req.rsp.rsphdr = rsphdr;</div><div class='add'>+    req.rsp.rsphdr_count = rsphdr_count;</div><div class='add'>+    req.rsp.rsp_payload = rsp_payload;</div><div class='add'>+    req.rsp.rsp_payload_count = rsp_payload_count;</div><div class='add'>+    req.rsp.rsp_iobref = rsp_iobref;</div><div class='add'>+    req.rpc_req = rpcreq;</div><div class='add'>+</div><div class='add'>+    pthread_mutex_lock(&amp;conn-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        if (conn-&gt;connected == 0) {</div><div class='add'>+            if (rpc-&gt;disabled)</div><div class='add'>+                goto unlock;</div><div class='add'>+            ret = rpc_transport_connect(conn-&gt;trans, conn-&gt;config.remote_port);</div><div class='add'>+            if (ret &lt; 0) {</div><div class='add'>+                gf_log(conn-&gt;name,</div><div class='add'>+                       (errno == EINPROGRESS) ? GF_LOG_DEBUG : GF_LOG_WARNING,</div><div class='add'>+                       "error returned while attempting to "</div><div class='add'>+                       "connect to host:%s, port:%d",</div><div class='add'>+                       conn-&gt;config.remote_host, conn-&gt;config.remote_port);</div><div class='add'>+                goto unlock;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        ret = rpc_transport_submit_request(conn-&gt;trans, &amp;req);</div><div class='add'>+        if (ret == -1) {</div><div class='add'>+            gf_log(conn-&gt;name, GF_LOG_WARNING,</div><div class='add'>+                   "failed to submit rpc-request "</div><div class='add'>+                   "(unique: %" PRIu64</div><div class='add'>+                   ", XID: 0x%x Program: %s, "</div><div class='add'>+                   "ProgVers: %d, Proc: %d) to rpc-transport (%s)",</div><div class='add'>+                   cframe-&gt;root-&gt;unique, rpcreq-&gt;xid, rpcreq-&gt;prog-&gt;progname,</div><div class='add'>+                   rpcreq-&gt;prog-&gt;progver, rpcreq-&gt;procnum, conn-&gt;name);</div><div class='add'>+        } else if ((ret &gt;= 0) &amp;&amp; frame) {</div><div class='add'>+            /* Save the frame in queue */</div><div class='add'>+            __save_frame(rpc, frame, rpcreq);</div><div class='add'>+</div><div class='add'>+            /* A ref on rpc-clnt object is taken while registering</div><div class='add'>+             * call_bail to timer in __save_frame. If it fails to</div><div class='add'>+             * register, it needs an unref and should happen outside</div><div class='add'>+             * conn-&gt;lock which otherwise leads to deadlocks */</div><div class='add'>+            if (conn-&gt;timer == NULL)</div><div class='add'>+                need_unref = _gf_true;</div><div class='add'>+</div><div class='add'>+            conn-&gt;msgcnt++;</div><div class='add'>+</div><div class='add'>+            gf_log("rpc-clnt", GF_LOG_TRACE,</div><div class='add'>+                   "submitted request "</div><div class='add'>+                   "(unique: %" PRIu64</div><div class='add'>+                   ", XID: 0x%x, Program: %s, "</div><div class='add'>+                   "ProgVers: %d, Proc: %d) to rpc-transport (%s)",</div><div class='add'>+                   cframe-&gt;root-&gt;unique, rpcreq-&gt;xid, rpcreq-&gt;prog-&gt;progname,</div><div class='add'>+                   rpcreq-&gt;prog-&gt;progver, rpcreq-&gt;procnum, conn-&gt;name);</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+unlock:</div><div class='add'>+    pthread_mutex_unlock(&amp;conn-&gt;lock);</div><div class='ctx'> </div><div class='del'>-        if (program-&gt;actors == NULL)</div><div class='del'>-                goto out;</div><div class='add'>+    if (need_unref)</div><div class='add'>+        rpc_clnt_unref(rpc);</div><div class='ctx'> </div><div class='del'>-        INIT_LIST_HEAD (&amp;program-&gt;program);</div><div class='add'>+    if (ret == -1) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        list_add_tail (&amp;program-&gt;program, &amp;clnt-&gt;programs);</div><div class='del'>-</div><div class='del'>-        ret = 0;</div><div class='del'>-        gf_log ("rpc-clnt", GF_LOG_DEBUG, "New program registered: %s, Num: %d,"</div><div class='del'>-                " Ver: %d", program-&gt;progname, program-&gt;prognum,</div><div class='del'>-                program-&gt;progver);</div><div class='add'>+    rpc_clnt_check_and_start_ping(rpc);</div><div class='add'>+    ret = 0;</div><div class='ctx'> </div><div class='ctx'> out:</div><div class='del'>-        if (ret == -1) {</div><div class='del'>-                gf_log ("rpc-clnt", GF_LOG_ERROR, "Program registration failed:"</div><div class='del'>-                        " %s, Num: %d, Ver: %d", program-&gt;progname,</div><div class='del'>-                        program-&gt;prognum, program-&gt;progver);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        return ret;</div><div class='add'>+    if (request_iob) {</div><div class='add'>+        iobuf_unref(request_iob);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (new_iobref &amp;&amp; iobref) {</div><div class='add'>+        iobref_unref(iobref);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (frame &amp;&amp; (ret == -1)) {</div><div class='add'>+        if (rpcreq) {</div><div class='add'>+            rpcreq-&gt;rpc_status = -1;</div><div class='add'>+            cbkfn(rpcreq, NULL, 0, frame);</div><div class='add'>+            mem_put(rpcreq);</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-rpc_clnt_submit (struct rpc_clnt *rpc, rpc_clnt_prog_t *prog,</div><div class='del'>-                 int procnum, fop_cbk_fn_t cbkfn,</div><div class='del'>-                 struct iovec *proghdr, int proghdrcount,</div><div class='del'>-                 struct iovec *progpayload, int progpayloadcount,</div><div class='del'>-                 struct iobref *iobref, void *frame, struct iovec *rsphdr,</div><div class='del'>-                 int rsphdr_count, struct iovec *rsp_payload,</div><div class='del'>-                 int rsp_payload_count, struct iobref *rsp_iobref)</div><div class='add'>+struct rpc_clnt *</div><div class='add'>+rpc_clnt_ref(struct rpc_clnt *rpc)</div><div class='ctx'> {</div><div class='del'>-        rpc_clnt_connection_t *conn        = NULL;</div><div class='del'>-        struct iobuf          *request_iob = NULL;</div><div class='del'>-        struct iovec           rpchdr      = {0,};</div><div class='del'>-        struct rpc_req        *rpcreq      = NULL;</div><div class='del'>-        rpc_transport_req_t    req;</div><div class='del'>-        int                    ret         = -1;</div><div class='del'>-        int                    proglen     = 0;</div><div class='del'>-        char                   new_iobref  = 0;</div><div class='del'>-        uint64_t               callid      = 0;</div><div class='del'>-</div><div class='del'>-        if (!rpc || !prog || !frame) {</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        rpcreq = mem_get (rpc-&gt;reqpool);</div><div class='del'>-        if (rpcreq == NULL) {</div><div class='del'>-                gf_log ("rpc-clnt", GF_LOG_ERROR, "out of memory");</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='add'>+    if (!rpc)</div><div class='add'>+        return NULL;</div><div class='ctx'> </div><div class='del'>-        memset (rpcreq, 0, sizeof (*rpcreq));</div><div class='del'>-        memset (&amp;req, 0, sizeof (req));</div><div class='del'>-</div><div class='del'>-        if (!iobref) {</div><div class='del'>-                iobref = iobref_new ();</div><div class='del'>-                if (!iobref) {</div><div class='del'>-                        gf_log ("rpc-clnt", GF_LOG_ERROR, "out of memory");</div><div class='del'>-                        goto out;</div><div class='del'>-                }</div><div class='add'>+    GF_ATOMIC_INC(rpc-&gt;refcount);</div><div class='add'>+    return rpc;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-                new_iobref = 1;</div><div class='del'>-        }</div><div class='add'>+static void</div><div class='add'>+rpc_clnt_trigger_destroy(struct rpc_clnt *rpc)</div><div class='add'>+{</div><div class='add'>+    rpc_clnt_connection_t *conn = NULL;</div><div class='add'>+    rpc_transport_t *trans = NULL;</div><div class='ctx'> </div><div class='del'>-        callid = rpc_clnt_new_callid (rpc);</div><div class='add'>+    if (!rpc)</div><div class='add'>+        return;</div><div class='ctx'> </div><div class='del'>-        conn = &amp;rpc-&gt;conn;</div><div class='add'>+    /* reading conn-&gt;trans outside conn-&gt;lock is OK, since this is the last</div><div class='add'>+     * ref*/</div><div class='add'>+    conn = &amp;rpc-&gt;conn;</div><div class='add'>+    trans = conn-&gt;trans;</div><div class='add'>+    rpc_clnt_disable(rpc);</div><div class='add'>+</div><div class='add'>+    /* This is to account for rpc_clnt_disable that might have been called</div><div class='add'>+     * before rpc_clnt_unref */</div><div class='add'>+    if (trans) {</div><div class='add'>+        /* set conn-&gt;trans to NULL before rpc_transport_unref</div><div class='add'>+         * as rpc_transport_unref can potentially free conn</div><div class='add'>+         */</div><div class='add'>+        conn-&gt;trans = NULL;</div><div class='add'>+        rpc_transport_unref(trans);</div><div class='add'>+    }</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        rpcreq-&gt;prog = prog;</div><div class='del'>-        rpcreq-&gt;procnum = procnum;</div><div class='del'>-        rpcreq-&gt;conn = conn;</div><div class='del'>-        rpcreq-&gt;xid = callid;</div><div class='del'>-        rpcreq-&gt;cbkfn = cbkfn;</div><div class='add'>+static void</div><div class='add'>+rpc_clnt_destroy(struct rpc_clnt *rpc)</div><div class='add'>+{</div><div class='add'>+    rpcclnt_cb_program_t *program = NULL;</div><div class='add'>+    rpcclnt_cb_program_t *tmp = NULL;</div><div class='add'>+    struct saved_frames *saved_frames = NULL;</div><div class='add'>+    rpc_clnt_connection_t *conn = NULL;</div><div class='ctx'> </div><div class='del'>-        pthread_mutex_lock (&amp;conn-&gt;lock);</div><div class='del'>-        {</div><div class='del'>-                if (conn-&gt;connected == 0) {</div><div class='del'>-                        rpc_transport_connect (conn-&gt;trans,</div><div class='del'>-                                               conn-&gt;config.remote_port);</div><div class='del'>-                }</div><div class='add'>+    if (!rpc)</div><div class='add'>+        return;</div><div class='ctx'> </div><div class='del'>-                ret = -1;</div><div class='add'>+    conn = &amp;rpc-&gt;conn;</div><div class='add'>+    GF_FREE(rpc-&gt;conn.name);</div><div class='add'>+    /* Access saved_frames in critical-section to avoid</div><div class='add'>+       crash in rpc_clnt_connection_cleanup at the time</div><div class='add'>+       of destroying saved frames</div><div class='add'>+    */</div><div class='add'>+    pthread_mutex_lock(&amp;conn-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        saved_frames = conn-&gt;saved_frames;</div><div class='add'>+        conn-&gt;saved_frames = NULL;</div><div class='add'>+    }</div><div class='add'>+    pthread_mutex_unlock(&amp;conn-&gt;lock);</div><div class='add'>+</div><div class='add'>+    saved_frames_destroy(saved_frames);</div><div class='add'>+    pthread_mutex_destroy(&amp;rpc-&gt;lock);</div><div class='add'>+    pthread_mutex_destroy(&amp;rpc-&gt;conn.lock);</div><div class='add'>+    pthread_cond_destroy(&amp;rpc-&gt;conn.cond);</div><div class='add'>+</div><div class='add'>+    /* mem-pool should be destroyed, otherwise,</div><div class='add'>+       it will cause huge memory leaks */</div><div class='add'>+    mem_pool_destroy(rpc-&gt;reqpool);</div><div class='add'>+    mem_pool_destroy(rpc-&gt;saved_frames_pool);</div><div class='add'>+</div><div class='add'>+    list_for_each_entry_safe(program, tmp, &amp;rpc-&gt;programs, program)</div><div class='add'>+    {</div><div class='add'>+        GF_FREE(program);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    GF_FREE(rpc);</div><div class='add'>+    return;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-                if (proghdr) {</div><div class='del'>-                        proglen += iov_length (proghdr, proghdrcount);</div><div class='del'>-                }</div><div class='add'>+struct rpc_clnt *</div><div class='add'>+rpc_clnt_unref(struct rpc_clnt *rpc)</div><div class='add'>+{</div><div class='add'>+    int count = 0;</div><div class='ctx'> </div><div class='del'>-                if (progpayload) {</div><div class='del'>-                        proglen += iov_length (progpayload,</div><div class='del'>-                                               progpayloadcount);</div><div class='del'>-                }</div><div class='add'>+    if (!rpc)</div><div class='add'>+        return NULL;</div><div class='ctx'> </div><div class='del'>-                request_iob = rpc_clnt_record (rpc, frame, prog,</div><div class='del'>-                                               procnum, proglen,</div><div class='del'>-                                               &amp;rpchdr, callid);</div><div class='del'>-                if (!request_iob) {</div><div class='del'>-                        gf_log ("rpc-clnt", GF_LOG_DEBUG,</div><div class='del'>-                                "cannot build rpc-record");</div><div class='del'>-                        goto unlock;</div><div class='del'>-                }</div><div class='add'>+    count = GF_ATOMIC_DEC(rpc-&gt;refcount);</div><div class='ctx'> </div><div class='del'>-                iobref_add (iobref, request_iob);</div><div class='del'>-</div><div class='del'>-                req.msg.rpchdr = &amp;rpchdr;</div><div class='del'>-                req.msg.rpchdrcount = 1;</div><div class='del'>-                req.msg.proghdr = proghdr;</div><div class='del'>-                req.msg.proghdrcount = proghdrcount;</div><div class='del'>-                req.msg.progpayload = progpayload;</div><div class='del'>-                req.msg.progpayloadcount = progpayloadcount;</div><div class='del'>-                req.msg.iobref = iobref;</div><div class='del'>-</div><div class='del'>-                req.rsp.rsphdr = rsphdr;</div><div class='del'>-                req.rsp.rsphdr_count = rsphdr_count;</div><div class='del'>-                req.rsp.rsp_payload = rsp_payload;</div><div class='del'>-                req.rsp.rsp_payload_count = rsp_payload_count;</div><div class='del'>-                req.rsp.rsp_iobref = rsp_iobref;</div><div class='del'>-                req.rpc_req = rpcreq;</div><div class='del'>-</div><div class='del'>-                ret = rpc_transport_submit_request (rpc-&gt;conn.trans,</div><div class='del'>-                                                    &amp;req);</div><div class='del'>-                if (ret == -1) {</div><div class='del'>-                        gf_log ("rpc-clnt", GF_LOG_DEBUG,</div><div class='del'>-                                "transmission of rpc-request failed");</div><div class='del'>-                }</div><div class='add'>+    if (!count) {</div><div class='add'>+        rpc_clnt_trigger_destroy(rpc);</div><div class='add'>+        return NULL;</div><div class='add'>+    }</div><div class='add'>+    return rpc;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-                if ((ret &gt;= 0) &amp;&amp; frame) {</div><div class='del'>-                        gettimeofday (&amp;conn-&gt;last_sent, NULL);</div><div class='del'>-                        /* Save the frame in queue */</div><div class='del'>-                        __save_frame (rpc, frame, rpcreq);</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='del'>-unlock:</div><div class='del'>-        pthread_mutex_unlock (&amp;conn-&gt;lock);</div><div class='add'>+int</div><div class='add'>+rpc_clnt_disable(struct rpc_clnt *rpc)</div><div class='add'>+{</div><div class='add'>+    rpc_clnt_connection_t *conn = NULL;</div><div class='add'>+    rpc_transport_t *trans = NULL;</div><div class='add'>+    int unref = 0;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    gf_boolean_t timer_unref = _gf_false;</div><div class='add'>+    gf_boolean_t reconnect_unref = _gf_false;</div><div class='add'>+</div><div class='add'>+    if (!rpc) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    conn = &amp;rpc-&gt;conn;</div><div class='add'>+</div><div class='add'>+    pthread_mutex_lock(&amp;conn-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        rpc-&gt;disabled = 1;</div><div class='add'>+</div><div class='add'>+        if (conn-&gt;timer) {</div><div class='add'>+            ret = gf_timer_call_cancel(rpc-&gt;ctx, conn-&gt;timer);</div><div class='add'>+            /* If the event is not fired and it actually cancelled</div><div class='add'>+             * the timer, do the unref else registered call back</div><div class='add'>+             * function will take care of it.</div><div class='add'>+             */</div><div class='add'>+            if (!ret)</div><div class='add'>+                timer_unref = _gf_true;</div><div class='add'>+            conn-&gt;timer = NULL;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        if (conn-&gt;reconnect) {</div><div class='add'>+            ret = gf_timer_call_cancel(rpc-&gt;ctx, conn-&gt;reconnect);</div><div class='add'>+            if (!ret)</div><div class='add'>+                reconnect_unref = _gf_true;</div><div class='add'>+            conn-&gt;reconnect = NULL;</div><div class='add'>+        }</div><div class='add'>+        conn-&gt;connected = 0;</div><div class='add'>+</div><div class='add'>+        unref = rpc_clnt_remove_ping_timer_locked(rpc);</div><div class='add'>+        trans = conn-&gt;trans;</div><div class='add'>+    }</div><div class='add'>+    pthread_mutex_unlock(&amp;conn-&gt;lock);</div><div class='add'>+</div><div class='add'>+    ret = -1;</div><div class='add'>+    if (trans) {</div><div class='add'>+        ret = rpc_transport_disconnect(trans, _gf_true);</div><div class='add'>+        /* The auth_value was being reset to AUTH_GLUSTERFS_v2.</div><div class='add'>+         *    if (clnt-&gt;auth_value)</div><div class='add'>+         *           clnt-&gt;auth_value = AUTH_GLUSTERFS_v2;</div><div class='add'>+         * It should not be reset here. The disconnect during</div><div class='add'>+         * portmap request can race with handshake. If handshake</div><div class='add'>+         * happens first and disconnect later, auth_value would set</div><div class='add'>+         * to default value and it never sets back to actual auth_value</div><div class='add'>+         * supported by server. But it's important to set to lower</div><div class='add'>+         * version supported in the case where the server downgrades.</div><div class='add'>+         * So moving this code to RPC_TRANSPORT_CONNECT. Note that</div><div class='add'>+         * CONNECT cannot race with handshake as by nature it is</div><div class='add'>+         * serialized with handhake. An handshake can happen only</div><div class='add'>+         * on a connected transport and hence its strictly serialized.</div><div class='add'>+         */</div><div class='add'>+    }</div><div class='add'>+    if (unref)</div><div class='add'>+        rpc_clnt_unref(rpc);</div><div class='ctx'> </div><div class='del'>-        if (ret == -1) {</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='add'>+    if (timer_unref)</div><div class='add'>+        rpc_clnt_unref(rpc);</div><div class='ctx'> </div><div class='del'>-        ret = 0;</div><div class='add'>+    if (reconnect_unref)</div><div class='add'>+        rpc_clnt_unref(rpc);</div><div class='ctx'> </div><div class='ctx'> out:</div><div class='del'>-        iobuf_unref (request_iob);</div><div class='del'>-</div><div class='del'>-        if (new_iobref &amp;&amp; iobref) {</div><div class='del'>-                iobref_unref (iobref);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (frame &amp;&amp; (ret == -1)) {</div><div class='del'>-                rpcreq-&gt;rpc_status = -1;</div><div class='del'>-                cbkfn (rpcreq, NULL, 0, frame);</div><div class='del'>-                mem_put (rpc-&gt;reqpool, rpcreq);</div><div class='del'>-        }</div><div class='del'>-        return ret;</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> void</div><div class='del'>-rpc_clnt_destroy (struct rpc_clnt *rpc)</div><div class='add'>+rpc_clnt_reconfig(struct rpc_clnt *rpc, struct rpc_clnt_config *config)</div><div class='ctx'> {</div><div class='del'>-        rpc_clnt_connection_cleanup (&amp;rpc-&gt;conn);</div><div class='del'>-        rpc_clnt_reconnect_cleanup (&amp;rpc-&gt;conn);</div><div class='del'>-        pthread_mutex_destroy (&amp;rpc-&gt;lock);</div><div class='del'>-        pthread_mutex_destroy (&amp;rpc-&gt;conn.lock);</div><div class='del'>-        GF_FREE (rpc);</div><div class='del'>-        return;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-void</div><div class='del'>-rpc_clnt_reconfig (struct rpc_clnt *rpc, struct rpc_clnt_config *config)</div><div class='del'>-{</div><div class='del'>-        if (config-&gt;rpc_timeout)</div><div class='del'>-                rpc-&gt;conn.config.rpc_timeout = config-&gt;rpc_timeout;</div><div class='del'>-</div><div class='del'>-        if (config-&gt;remote_port)</div><div class='del'>-                rpc-&gt;conn.config.remote_port = config-&gt;remote_port;</div><div class='add'>+    if (config-&gt;ping_timeout) {</div><div class='add'>+        if (config-&gt;ping_timeout != rpc-&gt;conn.ping_timeout)</div><div class='add'>+            gf_log(rpc-&gt;conn.name, GF_LOG_INFO,</div><div class='add'>+                   "changing ping timeout to %d (from %d)",</div><div class='add'>+                   config-&gt;ping_timeout, rpc-&gt;conn.ping_timeout);</div><div class='ctx'> </div><div class='del'>-        if (config-&gt;remote_host) {</div><div class='del'>-                if (rpc-&gt;conn.config.remote_host)</div><div class='del'>-                        FREE (rpc-&gt;conn.config.remote_host);</div><div class='del'>-                rpc-&gt;conn.config.remote_host = gf_strdup (config-&gt;remote_host);</div><div class='add'>+        pthread_mutex_lock(&amp;rpc-&gt;conn.lock);</div><div class='add'>+        {</div><div class='add'>+            rpc-&gt;conn.ping_timeout = config-&gt;ping_timeout;</div><div class='add'>+        }</div><div class='add'>+        pthread_mutex_unlock(&amp;rpc-&gt;conn.lock);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (config-&gt;rpc_timeout) {</div><div class='add'>+        if (config-&gt;rpc_timeout != rpc-&gt;conn.config.rpc_timeout)</div><div class='add'>+            gf_log(rpc-&gt;conn.name, GF_LOG_INFO,</div><div class='add'>+                   "changing timeout to %d (from %d)", config-&gt;rpc_timeout,</div><div class='add'>+                   rpc-&gt;conn.config.rpc_timeout);</div><div class='add'>+        rpc-&gt;conn.config.rpc_timeout = config-&gt;rpc_timeout;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (config-&gt;remote_port) {</div><div class='add'>+        if (config-&gt;remote_port != rpc-&gt;conn.config.remote_port)</div><div class='add'>+            gf_log(rpc-&gt;conn.name, GF_LOG_INFO, "changing port to %d (from %d)",</div><div class='add'>+                   config-&gt;remote_port, rpc-&gt;conn.config.remote_port);</div><div class='add'>+</div><div class='add'>+        rpc-&gt;conn.config.remote_port = config-&gt;remote_port;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (config-&gt;remote_host) {</div><div class='add'>+        if (rpc-&gt;conn.config.remote_host) {</div><div class='add'>+            if (strcmp(rpc-&gt;conn.config.remote_host, config-&gt;remote_host))</div><div class='add'>+                gf_log(rpc-&gt;conn.name, GF_LOG_INFO,</div><div class='add'>+                       "changing hostname to %s (from %s)", config-&gt;remote_host,</div><div class='add'>+                       rpc-&gt;conn.config.remote_host);</div><div class='add'>+            GF_FREE(rpc-&gt;conn.config.remote_host);</div><div class='add'>+        } else {</div><div class='add'>+            gf_log(rpc-&gt;conn.name, GF_LOG_INFO, "setting hostname to %s",</div><div class='add'>+                   config-&gt;remote_host);</div><div class='ctx'>         }</div><div class='add'>+</div><div class='add'>+        rpc-&gt;conn.config.remote_host = gf_strdup(config-&gt;remote_host);</div><div class='add'>+    }</div><div class='ctx'> }</div><div class='head'>diff --git a/rpc/rpc-lib/src/rpc-clnt.h b/rpc/rpc-lib/src/rpc-clnt.h<br/>index ab95608adb7..2945265200b 100644<br/>--- a/<a href='/cgit/glusterfs.git/tree/rpc/rpc-lib/src/rpc-clnt.h?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>rpc/rpc-lib/src/rpc-clnt.h</a><br/>+++ b/<a href='/cgit/glusterfs.git/tree/rpc/rpc-lib/src/rpc-clnt.h?id=d1d7a6f35c816822fab51c820e25023863c239c1'>rpc/rpc-lib/src/rpc-clnt.h</a></div><div class='hunk'>@@ -1,98 +1,92 @@</div><div class='ctx'> /*</div><div class='del'>-  Copyright (c) 2010 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='add'>+  Copyright (c) 2008-2012 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='ctx'>   This file is part of GlusterFS.</div><div class='ctx'> </div><div class='del'>-  GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-  it under the terms of the GNU Affero General Public License as published</div><div class='del'>-  by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-  or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-  GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-  WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-  Affero General Public License for more details.</div><div class='del'>-</div><div class='del'>-  You should have received a copy of the GNU Affero General Public License</div><div class='del'>-  along with this program.  If not, see</div><div class='del'>-  &lt;http://www.gnu.org/licenses/&gt;.</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='ctx'> */</div><div class='ctx'> </div><div class='del'>-#ifndef _RPC_CLNT_H</div><div class='del'>-#define _RPC_CLNT_H</div><div class='add'>+#ifndef __RPC_CLNT_H</div><div class='add'>+#define __RPC_CLNT_H</div><div class='ctx'> </div><div class='del'>-#include "stack.h"</div><div class='add'>+#include &lt;glusterfs/stack.h&gt;</div><div class='ctx'> #include "rpc-transport.h"</div><div class='del'>-#include "timer.h"</div><div class='add'>+#include &lt;glusterfs/timer.h&gt;</div><div class='ctx'> #include "xdr-common.h"</div><div class='add'>+#include "glusterfs3.h"</div><div class='ctx'> </div><div class='ctx'> typedef enum {</div><div class='del'>-        RPC_CLNT_CONNECT,</div><div class='del'>-        RPC_CLNT_DISCONNECT,</div><div class='del'>-        RPC_CLNT_MSG</div><div class='add'>+    RPC_CLNT_CONNECT,</div><div class='add'>+    RPC_CLNT_DISCONNECT,</div><div class='add'>+    RPC_CLNT_PING,</div><div class='add'>+    RPC_CLNT_MSG,</div><div class='add'>+    RPC_CLNT_DESTROY</div><div class='ctx'> } rpc_clnt_event_t;</div><div class='ctx'> </div><div class='del'>-#define AUTH_GLUSTERFS  5</div><div class='del'>-#define RPC_CLNT_MAX_AUTH_BYTES 1024</div><div class='add'>+#define SFRAME_GET_PROGNUM(sframe) (sframe-&gt;rpcreq-&gt;prog-&gt;prognum)</div><div class='add'>+#define SFRAME_GET_PROGVER(sframe) (sframe-&gt;rpcreq-&gt;prog-&gt;progver)</div><div class='add'>+#define SFRAME_GET_PROCNUM(sframe) (sframe-&gt;rpcreq-&gt;procnum)</div><div class='ctx'> </div><div class='del'>-struct xptr_clnt;</div><div class='ctx'> struct rpc_req;</div><div class='ctx'> struct rpc_clnt;</div><div class='ctx'> struct rpc_clnt_config;</div><div class='ctx'> struct rpc_clnt_program;</div><div class='ctx'> </div><div class='del'>-typedef int (*rpc_clnt_notify_t) (struct rpc_clnt *rpc, void *mydata,</div><div class='del'>-                                  rpc_clnt_event_t fn, void *data);</div><div class='add'>+typedef int (*rpc_clnt_notify_t)(struct rpc_clnt *rpc, void *mydata,</div><div class='add'>+                                 rpc_clnt_event_t fn, void *data);</div><div class='ctx'> </div><div class='del'>-typedef int (*fop_cbk_fn_t) (struct rpc_req *req, struct iovec *iov, int count,</div><div class='del'>-                             void *myframe);</div><div class='add'>+typedef int (*fop_cbk_fn_t)(struct rpc_req *req, struct iovec *iov, int count,</div><div class='add'>+                            void *myframe);</div><div class='ctx'> </div><div class='del'>-typedef int (*clnt_fn_t) (call_frame_t *fr, xlator_t *xl, void *args);</div><div class='add'>+typedef int (*clnt_fn_t)(call_frame_t *fr, xlator_t *xl, void *args);</div><div class='ctx'> </div><div class='ctx'> struct saved_frame {</div><div class='del'>-	union {</div><div class='del'>-		struct list_head list;</div><div class='del'>-		struct {</div><div class='del'>-			struct saved_frame *frame_next;</div><div class='del'>-			struct saved_frame *frame_prev;</div><div class='del'>-		};</div><div class='del'>-	};</div><div class='del'>-        void                    *capital_this;</div><div class='del'>-	void                    *frame;</div><div class='del'>-	struct timeval           saved_at;</div><div class='del'>-        struct rpc_req          *rpcreq;</div><div class='del'>-        rpc_transport_rsp_t      rsp;</div><div class='add'>+    union {</div><div class='add'>+        struct list_head list;</div><div class='add'>+        struct {</div><div class='add'>+            struct saved_frame *frame_next;</div><div class='add'>+            struct saved_frame *frame_prev;</div><div class='add'>+        };</div><div class='add'>+    };</div><div class='add'>+    void *capital_this;</div><div class='add'>+    void *frame;</div><div class='add'>+    struct rpc_req *rpcreq;</div><div class='add'>+    struct timeval saved_at;</div><div class='add'>+    rpc_transport_rsp_t rsp;</div><div class='ctx'> };</div><div class='ctx'> </div><div class='ctx'> struct saved_frames {</div><div class='del'>-	int64_t            count;</div><div class='del'>-	struct saved_frame sf;</div><div class='add'>+    int64_t count;</div><div class='add'>+    struct saved_frame sf;</div><div class='add'>+    struct saved_frame lk_sf;</div><div class='ctx'> };</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> /* Initialized by procnum */</div><div class='ctx'> typedef struct rpc_clnt_procedure {</div><div class='del'>-        char         *procname;</div><div class='del'>-        clnt_fn_t     fn;</div><div class='add'>+    char *procname;</div><div class='add'>+    clnt_fn_t fn;</div><div class='ctx'> } rpc_clnt_procedure_t;</div><div class='ctx'> </div><div class='ctx'> typedef struct rpc_clnt_program {</div><div class='del'>-        char                 *progname;</div><div class='del'>-        int                   prognum;</div><div class='del'>-        int                   progver;</div><div class='del'>-        rpc_clnt_procedure_t *proctable;</div><div class='del'>-        char                **procnames;</div><div class='del'>-        int                   numproc;</div><div class='add'>+    char *progname;</div><div class='add'>+    int prognum;</div><div class='add'>+    int progver;</div><div class='add'>+    rpc_clnt_procedure_t *proctable;</div><div class='add'>+    char **procnames;</div><div class='add'>+    int numproc;</div><div class='ctx'> } rpc_clnt_prog_t;</div><div class='ctx'> </div><div class='del'>-typedef int (*rpcclnt_cb_fn) (void *data);</div><div class='add'>+typedef int (*rpcclnt_cb_fn)(struct rpc_clnt *rpc, void *mydata, void *data);</div><div class='ctx'> </div><div class='ctx'> /* The descriptor for each procedure/actor that runs</div><div class='ctx'>  * over the RPC service.</div><div class='ctx'>  */</div><div class='ctx'> typedef struct rpcclnt_actor_desc {</div><div class='del'>-        char                 procname[32];</div><div class='del'>-        int                  procnum;</div><div class='del'>-        rpcclnt_cb_fn        actor;</div><div class='add'>+    char procname[32];</div><div class='add'>+    rpcclnt_cb_fn actor;</div><div class='add'>+    int procnum;</div><div class='ctx'> } rpcclnt_cb_actor_t;</div><div class='ctx'> </div><div class='ctx'> /* Describes a program and its version along with the function pointers</div><div class='hunk'>@@ -100,98 +94,113 @@ typedef struct rpcclnt_actor_desc {</div><div class='ctx'>  * Never changed ever by any thread so no need for a lock.</div><div class='ctx'>  */</div><div class='ctx'> typedef struct rpcclnt_cb_program {</div><div class='del'>-        char                      progname[32];</div><div class='del'>-        int                       prognum;</div><div class='del'>-        int                       progver;</div><div class='del'>-        rpcclnt_cb_actor_t       *actors;        /* All procedure handlers */</div><div class='del'>-        int                       numactors;     /* Num actors in actor array */</div><div class='add'>+    char progname[32];</div><div class='add'>+    int prognum;</div><div class='add'>+    int progver;</div><div class='add'>+    rpcclnt_cb_actor_t *actors; /* All procedure handlers */</div><div class='add'>+    /* Program specific state handed to actors */</div><div class='add'>+    void *private;</div><div class='ctx'> </div><div class='del'>-        /* Program specific state handed to actors */</div><div class='del'>-        void                    *private;</div><div class='add'>+    /* list member to link to list of registered services with rpc_clnt */</div><div class='add'>+    struct list_head program;</div><div class='ctx'> </div><div class='add'>+    /* Needed for passing back in cb_actor */</div><div class='add'>+    void *mydata;</div><div class='add'>+    int numactors; /* Num actors in actor array */</div><div class='ctx'> </div><div class='del'>-        /* list member to link to list of registered services with rpc_clnt */</div><div class='del'>-        struct list_head        program;</div><div class='ctx'> } rpcclnt_cb_program_t;</div><div class='ctx'> </div><div class='del'>-</div><div class='del'>-</div><div class='del'>-#define RPC_MAX_AUTH_BYTES   400</div><div class='ctx'> typedef struct rpc_auth_data {</div><div class='del'>-        int             flavour;</div><div class='del'>-        int             datalen;</div><div class='del'>-        char            authdata[RPC_MAX_AUTH_BYTES];</div><div class='add'>+    int flavour;</div><div class='add'>+    int datalen;</div><div class='add'>+    char authdata[GF_MAX_AUTH_BYTES];</div><div class='ctx'> } rpc_auth_data_t;</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> struct rpc_clnt_config {</div><div class='del'>-        int    rpc_timeout;</div><div class='del'>-        int    remote_port;</div><div class='del'>-        char * remote_host;</div><div class='add'>+    int rpc_timeout;</div><div class='add'>+    int remote_port;</div><div class='add'>+    char *remote_host;</div><div class='add'>+    int ping_timeout;</div><div class='ctx'> };</div><div class='ctx'> </div><div class='del'>-</div><div class='del'>-#define rpc_auth_flavour(au)    ((au).flavour)</div><div class='add'>+#define rpc_auth_flavour(au) ((au).flavour)</div><div class='ctx'> </div><div class='ctx'> struct rpc_clnt_connection {</div><div class='del'>-        pthread_mutex_t          lock;</div><div class='del'>-        rpc_transport_t         *trans;</div><div class='del'>-        struct rpc_clnt_config   config;</div><div class='del'>-        gf_timer_t              *reconnect;</div><div class='del'>-        gf_timer_t              *timer;</div><div class='del'>-        gf_timer_t              *ping_timer;</div><div class='del'>-        struct rpc_clnt         *rpc_clnt;</div><div class='del'>-        char                     connected;</div><div class='del'>-        struct saved_frames     *saved_frames;</div><div class='del'>-        int32_t                  frame_timeout;</div><div class='del'>-	struct timeval           last_sent;</div><div class='del'>-	struct timeval           last_received;</div><div class='del'>-	int32_t                  ping_started;</div><div class='add'>+    pthread_mutex_t lock;</div><div class='add'>+    pthread_cond_t cond;</div><div class='add'>+    rpc_transport_t *trans;</div><div class='add'>+    struct rpc_clnt_config config;</div><div class='add'>+    gf_timer_t *reconnect;</div><div class='add'>+    gf_timer_t *timer;</div><div class='add'>+    gf_timer_t *ping_timer;</div><div class='add'>+    struct rpc_clnt *rpc_clnt;</div><div class='add'>+    struct saved_frames *saved_frames;</div><div class='add'>+    struct timespec last_sent;</div><div class='add'>+    struct timespec last_received;</div><div class='add'>+    uint64_t pingcnt;</div><div class='add'>+    uint64_t msgcnt;</div><div class='add'>+    uint64_t cleanup_gen;</div><div class='add'>+    char *name;</div><div class='add'>+    int32_t ping_started;</div><div class='add'>+    int32_t frame_timeout;</div><div class='add'>+    int32_t ping_timeout;</div><div class='add'>+    gf_boolean_t disconnected;</div><div class='add'>+    char connected;</div><div class='ctx'> };</div><div class='ctx'> typedef struct rpc_clnt_connection rpc_clnt_connection_t;</div><div class='ctx'> </div><div class='ctx'> struct rpc_req {</div><div class='del'>-        rpc_clnt_connection_t *conn;</div><div class='del'>-        uint32_t               xid;</div><div class='del'>-        struct iovec           req[2];</div><div class='del'>-        int                    reqcnt;</div><div class='del'>-        struct iobref         *req_iobref;</div><div class='del'>-        struct iovec           rsp[2];</div><div class='del'>-        int                    rspcnt;</div><div class='del'>-        struct iobref         *rsp_iobref;</div><div class='del'>-        int                    rpc_status;</div><div class='del'>-        rpc_auth_data_t        verf;</div><div class='del'>-        rpc_clnt_prog_t       *prog;</div><div class='del'>-        int                    procnum;</div><div class='del'>-        fop_cbk_fn_t           cbkfn;</div><div class='del'>-        void                  *conn_private;</div><div class='add'>+    rpc_clnt_connection_t *conn;</div><div class='add'>+    struct iovec req[2];</div><div class='add'>+    struct iobref *req_iobref;</div><div class='add'>+    struct iovec rsp[2];</div><div class='add'>+    int rspcnt;</div><div class='add'>+    int reqcnt;</div><div class='add'>+    struct iobref *rsp_iobref;</div><div class='add'>+    rpc_clnt_prog_t *prog;</div><div class='add'>+    rpc_auth_data_t verf;</div><div class='add'>+    fop_cbk_fn_t cbkfn;</div><div class='add'>+    void *conn_private;</div><div class='add'>+    int procnum;</div><div class='add'>+    int rpc_status;</div><div class='add'>+    uint32_t xid;</div><div class='ctx'> };</div><div class='ctx'> </div><div class='del'>-struct rpc_clnt {</div><div class='del'>-        pthread_mutex_t        lock;</div><div class='del'>-        rpc_clnt_notify_t      notifyfn;</div><div class='del'>-        rpc_clnt_connection_t  conn;</div><div class='del'>-        void                  *mydata;</div><div class='del'>-        uint64_t               xid;</div><div class='add'>+typedef struct rpc_clnt {</div><div class='add'>+    pthread_mutex_t lock;</div><div class='add'>+    rpc_clnt_notify_t notifyfn;</div><div class='add'>+    rpc_clnt_connection_t conn;</div><div class='add'>+    void *mydata;</div><div class='add'>+    gf_atomic_t xid;</div><div class='ctx'> </div><div class='del'>-        /* list of cb programs registered with rpc-clnt */</div><div class='del'>-        struct list_head       programs;</div><div class='add'>+    /* list of cb programs registered with rpc-clnt */</div><div class='add'>+    struct list_head programs;</div><div class='ctx'> </div><div class='del'>-        /* Memory pool for rpc_req_t */</div><div class='del'>-        struct mem_pool       *reqpool;</div><div class='add'>+    /* Memory pool for rpc_req_t */</div><div class='add'>+    struct mem_pool *reqpool;</div><div class='ctx'> </div><div class='del'>-        struct mem_pool       *saved_frames_pool;</div><div class='add'>+    struct mem_pool *saved_frames_pool;</div><div class='ctx'> </div><div class='del'>-        glusterfs_ctx_t       *ctx;</div><div class='del'>-};</div><div class='add'>+    glusterfs_ctx_t *ctx;</div><div class='add'>+    gf_atomic_t refcount;</div><div class='add'>+    xlator_t *owner;</div><div class='add'>+    int auth_value;</div><div class='add'>+    char disabled;</div><div class='add'>+} rpc_clnt_t;</div><div class='add'>+</div><div class='add'>+struct rpc_clnt *</div><div class='add'>+rpc_clnt_new(dict_t *options, xlator_t *owner, char *name,</div><div class='add'>+             uint32_t reqpool_size);</div><div class='ctx'> </div><div class='add'>+int</div><div class='add'>+rpc_clnt_start(struct rpc_clnt *rpc);</div><div class='ctx'> </div><div class='del'>-struct rpc_clnt * rpc_clnt_init (struct rpc_clnt_config *config,</div><div class='del'>-                                 dict_t *options, glusterfs_ctx_t *ctx,</div><div class='del'>-                                 char *name);</div><div class='add'>+int</div><div class='add'>+rpc_clnt_cleanup_and_start(struct rpc_clnt *rpc);</div><div class='ctx'> </div><div class='del'>-int rpc_clnt_register_notify (struct rpc_clnt *rpc, rpc_clnt_notify_t fn,</div><div class='del'>-                              void *mydata);</div><div class='add'>+int</div><div class='add'>+rpc_clnt_register_notify(struct rpc_clnt *rpc, rpc_clnt_notify_t fn,</div><div class='add'>+                         void *mydata);</div><div class='ctx'> </div><div class='ctx'> /* Some preconditions related to vectors holding responses.</div><div class='ctx'>  * @rsphdr: should contain pointer to buffer which can hold response header</div><div class='hunk'>@@ -208,28 +217,44 @@ int rpc_clnt_register_notify (struct rpc_clnt *rpc, rpc_clnt_notify_t fn,</div><div class='ctx'>  *    of the header.</div><div class='ctx'>  */</div><div class='ctx'> </div><div class='del'>-int rpc_clnt_submit (struct rpc_clnt *rpc, rpc_clnt_prog_t *prog,</div><div class='del'>-                     int procnum, fop_cbk_fn_t cbkfn,</div><div class='del'>-                     struct iovec *proghdr, int proghdrcount,</div><div class='del'>-                     struct iovec *progpayload, int progpayloadcount,</div><div class='del'>-                     struct iobref *iobref, void *frame, struct iovec *rsphdr,</div><div class='del'>-                     int rsphdr_count, struct iovec *rsp_payload,</div><div class='del'>-                     int rsp_payload_count, struct iobref *rsp_iobref);</div><div class='add'>+int</div><div class='add'>+rpc_clnt_submit(struct rpc_clnt *rpc, rpc_clnt_prog_t *prog, int procnum,</div><div class='add'>+                fop_cbk_fn_t cbkfn, struct iovec *proghdr, int proghdrcount,</div><div class='add'>+                struct iovec *progpayload, int progpayloadcount,</div><div class='add'>+                struct iobref *iobref, void *frame, struct iovec *rsphdr,</div><div class='add'>+                int rsphdr_count, struct iovec *rsp_payload,</div><div class='add'>+                int rsp_payload_count, struct iobref *rsp_iobref);</div><div class='ctx'> </div><div class='del'>-void rpc_clnt_destroy (struct rpc_clnt *rpc);</div><div class='add'>+struct rpc_clnt *</div><div class='add'>+rpc_clnt_ref(struct rpc_clnt *rpc);</div><div class='ctx'> </div><div class='del'>-void rpc_clnt_set_connected (rpc_clnt_connection_t *conn);</div><div class='add'>+struct rpc_clnt *</div><div class='add'>+rpc_clnt_unref(struct rpc_clnt *rpc);</div><div class='ctx'> </div><div class='del'>-void rpc_clnt_unset_connected (rpc_clnt_connection_t *conn);</div><div class='add'>+int</div><div class='add'>+rpc_clnt_connection_cleanup(rpc_clnt_connection_t *conn);</div><div class='add'>+int</div><div class='add'>+rpc_clnt_reconnect_cleanup(rpc_clnt_connection_t *conn);</div><div class='add'>+gf_boolean_t</div><div class='add'>+is_rpc_clnt_disconnected(rpc_clnt_connection_t *conn);</div><div class='ctx'> </div><div class='del'>-void rpc_clnt_reconnect (void *trans_ptr);</div><div class='add'>+void</div><div class='add'>+rpc_clnt_reconnect(void *trans_ptr);</div><div class='ctx'> </div><div class='del'>-void rpc_clnt_reconfig (struct rpc_clnt *rpc, struct rpc_clnt_config *config);</div><div class='add'>+void</div><div class='add'>+rpc_clnt_reconfig(struct rpc_clnt *rpc, struct rpc_clnt_config *config);</div><div class='ctx'> </div><div class='ctx'> /* All users of RPC services should use this API to register their</div><div class='ctx'>  * procedure handlers.</div><div class='ctx'>  */</div><div class='del'>-int rpcclnt_cbk_program_register (struct rpc_clnt *svc,</div><div class='del'>-                                  rpcclnt_cb_program_t *program);</div><div class='add'>+int</div><div class='add'>+rpcclnt_cbk_program_register(struct rpc_clnt *svc,</div><div class='add'>+                             rpcclnt_cb_program_t *program, void *mydata);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+rpc_clnt_disable(struct rpc_clnt *rpc);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+rpc_clnt_mgmt_pmap_signout(glusterfs_ctx_t *ctx, char *brick_name);</div><div class='ctx'> </div><div class='ctx'> #endif /* !_RPC_CLNT_H */</div><div class='head'>diff --git a/rpc/rpc-lib/src/rpc-common.c b/rpc/rpc-lib/src/rpc-common.c<br/>deleted file mode 100644<br/>index 941f01a2510..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/rpc/rpc-lib/src/rpc-common.c?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>rpc/rpc-lib/src/rpc-common.c</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,135 +0,0 @@</div><div class='del'>-/*</div><div class='del'>-  Copyright (c) 2010 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='del'>-  This file is part of GlusterFS.</div><div class='del'>-</div><div class='del'>-  GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-  it under the terms of the GNU Affero General Public License as published</div><div class='del'>-  by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-  or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-  GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-  WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-  Affero General Public License for more details.</div><div class='del'>-</div><div class='del'>-  You should have received a copy of the GNU Affero General Public License</div><div class='del'>-  along with this program.  If not, see</div><div class='del'>-  &lt;http://www.gnu.org/licenses/&gt;.</div><div class='del'>-*/</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-#include "xdr-common.h"</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_serialize_generic (struct iovec outmsg, void *res, xdrproc_t proc)</div><div class='del'>-{</div><div class='del'>-        ssize_t ret = -1;</div><div class='del'>-        XDR     xdr;</div><div class='del'>-</div><div class='del'>-        if ((!outmsg.iov_base) || (!res) || (!proc))</div><div class='del'>-                return -1;</div><div class='del'>-</div><div class='del'>-        xdrmem_create (&amp;xdr, outmsg.iov_base, (unsigned int)outmsg.iov_len,</div><div class='del'>-                       XDR_ENCODE);</div><div class='del'>-</div><div class='del'>-        if (!proc (&amp;xdr, res)) {</div><div class='del'>-                ret = -1;</div><div class='del'>-                goto ret;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        ret = xdr_encoded_length (xdr);</div><div class='del'>-</div><div class='del'>-ret:</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_to_generic (struct iovec inmsg, void *args, xdrproc_t proc)</div><div class='del'>-{</div><div class='del'>-        XDR     xdr;</div><div class='del'>-        ssize_t ret = -1;</div><div class='del'>-</div><div class='del'>-        if ((!inmsg.iov_base) || (!args) || (!proc))</div><div class='del'>-                return -1;</div><div class='del'>-</div><div class='del'>-        xdrmem_create (&amp;xdr, inmsg.iov_base, (unsigned int)inmsg.iov_len,</div><div class='del'>-                       XDR_DECODE);</div><div class='del'>-</div><div class='del'>-        if (!proc (&amp;xdr, args)) {</div><div class='del'>-                ret  = -1;</div><div class='del'>-                goto ret;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        ret = xdr_decoded_length (xdr);</div><div class='del'>-ret:</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-bool_t</div><div class='del'>-xdr_gf_dump_req (XDR *xdrs, gf_dump_req *objp)</div><div class='del'>-{</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;gfs_id))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	return TRUE;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-bool_t</div><div class='del'>-xdr_gf_prog_detail (XDR *xdrs, gf_prog_detail *objp)</div><div class='del'>-{</div><div class='del'>-	 if (!xdr_string (xdrs, &amp;objp-&gt;progname, ~0))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;prognum))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;progver))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_pointer (xdrs, (char **)&amp;objp-&gt;next, sizeof (gf_prog_detail), (xdrproc_t) xdr_gf_prog_detail))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	return TRUE;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-bool_t</div><div class='del'>-xdr_gf_dump_rsp (XDR *xdrs, gf_dump_rsp *objp)</div><div class='del'>-{</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;gfs_id))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_int (xdrs, &amp;objp-&gt;op_ret))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_int (xdrs, &amp;objp-&gt;op_errno))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_pointer (xdrs, (char **)&amp;objp-&gt;prog, sizeof (gf_prog_detail), (xdrproc_t) xdr_gf_prog_detail))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	return TRUE;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_serialize_dump_rsp (struct iovec outmsg, void *rsp)</div><div class='del'>-{</div><div class='del'>-        return xdr_serialize_generic (outmsg, (void *)rsp,</div><div class='del'>-                                      (xdrproc_t)xdr_gf_dump_rsp);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_to_dump_req (struct iovec inmsg, void *args)</div><div class='del'>-{</div><div class='del'>-        return xdr_to_generic (inmsg, (void *)args,</div><div class='del'>-                               (xdrproc_t)xdr_gf_dump_req);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_from_dump_req (struct iovec outmsg, void *rsp)</div><div class='del'>-{</div><div class='del'>-        return xdr_serialize_generic (outmsg, (void *)rsp,</div><div class='del'>-                                      (xdrproc_t)xdr_gf_dump_req);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_to_dump_rsp (struct iovec inmsg, void *args)</div><div class='del'>-{</div><div class='del'>-        return xdr_to_generic (inmsg, (void *)args,</div><div class='del'>-                               (xdrproc_t)xdr_gf_dump_rsp);</div><div class='del'>-}</div><div class='head'>diff --git a/rpc/rpc-lib/src/rpc-drc.c b/rpc/rpc-lib/src/rpc-drc.c<br/>new file mode 100644<br/>index 00000000000..de8dc630626<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/rpc/rpc-lib/src/rpc-drc.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>rpc/rpc-lib/src/rpc-drc.c</a></div><div class='hunk'>@@ -0,0 +1,855 @@</div><div class='add'>+/*</div><div class='add'>+  Copyright (c) 2013 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#include "rpcsvc.h"</div><div class='add'>+#ifndef RPC_DRC_H</div><div class='add'>+#include "rpc-drc.h"</div><div class='add'>+#endif</div><div class='add'>+#include &lt;glusterfs/locking.h&gt;</div><div class='add'>+#include &lt;glusterfs/statedump.h&gt;</div><div class='add'>+#include &lt;glusterfs/mem-pool.h&gt;</div><div class='add'>+</div><div class='add'>+#include &lt;netinet/in.h&gt;</div><div class='add'>+#include &lt;unistd.h&gt;</div><div class='add'>+</div><div class='add'>+/**</div><div class='add'>+ * rpcsvc_drc_op_destroy - Destroys the cached reply</div><div class='add'>+ *</div><div class='add'>+ * @param drc - the main drc structure</div><div class='add'>+ * @param reply - the cached reply to destroy</div><div class='add'>+ * @return NULL if reply is destroyed, reply otherwise</div><div class='add'>+ */</div><div class='add'>+static drc_cached_op_t *</div><div class='add'>+rpcsvc_drc_op_destroy(rpcsvc_drc_globals_t *drc, drc_cached_op_t *reply)</div><div class='add'>+{</div><div class='add'>+    GF_ASSERT(drc);</div><div class='add'>+    GF_ASSERT(reply);</div><div class='add'>+</div><div class='add'>+    if (reply-&gt;state == DRC_OP_IN_TRANSIT)</div><div class='add'>+        return reply;</div><div class='add'>+</div><div class='add'>+    iobref_unref(reply-&gt;msg.iobref);</div><div class='add'>+    if (reply-&gt;msg.rpchdr)</div><div class='add'>+        GF_FREE(reply-&gt;msg.rpchdr);</div><div class='add'>+    if (reply-&gt;msg.proghdr)</div><div class='add'>+        GF_FREE(reply-&gt;msg.proghdr);</div><div class='add'>+    if (reply-&gt;msg.progpayload)</div><div class='add'>+        GF_FREE(reply-&gt;msg.progpayload);</div><div class='add'>+</div><div class='add'>+    list_del(&amp;reply-&gt;global_list);</div><div class='add'>+    reply-&gt;client-&gt;op_count--;</div><div class='add'>+    drc-&gt;op_count--;</div><div class='add'>+    mem_put(reply);</div><div class='add'>+    reply = NULL;</div><div class='add'>+</div><div class='add'>+    return reply;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/**</div><div class='add'>+ * rpcsvc_drc_op_rb_unref - This function is used in rb tree cleanup only</div><div class='add'>+ *</div><div class='add'>+ * @param reply - the cached reply to unref</div><div class='add'>+ * @param drc - the main drc structure</div><div class='add'>+ * @return void</div><div class='add'>+ */</div><div class='add'>+static void</div><div class='add'>+rpcsvc_drc_rb_op_destroy(void *reply, void *drc)</div><div class='add'>+{</div><div class='add'>+    rpcsvc_drc_op_destroy(drc, (drc_cached_op_t *)reply);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/**</div><div class='add'>+ * rpcsvc_remove_drc_client - Cleanup the drc client</div><div class='add'>+ *</div><div class='add'>+ * @param client - the drc client to be removed</div><div class='add'>+ * @return void</div><div class='add'>+ */</div><div class='add'>+static void</div><div class='add'>+rpcsvc_remove_drc_client(drc_client_t *client)</div><div class='add'>+{</div><div class='add'>+    rb_destroy(client-&gt;rbtree, rpcsvc_drc_rb_op_destroy);</div><div class='add'>+    list_del(&amp;client-&gt;client_list);</div><div class='add'>+    GF_FREE(client);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/**</div><div class='add'>+ * rpcsvc_client_lookup - Given a sockaddr_storage, find the client if it exists</div><div class='add'>+ *</div><div class='add'>+ * @param drc - the main drc structure</div><div class='add'>+ * @param sockaddr - the network address of the client to be looked up</div><div class='add'>+ * @return drc client if it exists, NULL otherwise</div><div class='add'>+ */</div><div class='add'>+static drc_client_t *</div><div class='add'>+rpcsvc_client_lookup(rpcsvc_drc_globals_t *drc,</div><div class='add'>+                     struct sockaddr_storage *sockaddr)</div><div class='add'>+{</div><div class='add'>+    drc_client_t *client = NULL;</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(drc);</div><div class='add'>+    GF_ASSERT(sockaddr);</div><div class='add'>+</div><div class='add'>+    if (list_empty(&amp;drc-&gt;clients_head))</div><div class='add'>+        return NULL;</div><div class='add'>+</div><div class='add'>+    list_for_each_entry(client, &amp;drc-&gt;clients_head, client_list)</div><div class='add'>+    {</div><div class='add'>+        if (gf_sock_union_equal_addr(&amp;client-&gt;sock_union,</div><div class='add'>+                                     (union gf_sock_union *)sockaddr))</div><div class='add'>+            return client;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return NULL;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/**</div><div class='add'>+ * drc_compare_reqs - Used by rbtree to determine if incoming req matches with</div><div class='add'>+ *                    an existing node(cached reply) in rbtree</div><div class='add'>+ *</div><div class='add'>+ * @param item - pointer to the incoming req</div><div class='add'>+ * @param rb_node_data - pointer to an rbtree node (cached reply)</div><div class='add'>+ * @param param - drc pointer - unused here, but used in *op_destroy</div><div class='add'>+ * @return 0 if req matches reply, else (req-&gt;xid - reply-&gt;xid)</div><div class='add'>+ */</div><div class='add'>+int</div><div class='add'>+drc_compare_reqs(const void *item, const void *rb_node_data, void *param)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    drc_cached_op_t *req = NULL;</div><div class='add'>+    drc_cached_op_t *reply = NULL;</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(item);</div><div class='add'>+    GF_ASSERT(rb_node_data);</div><div class='add'>+    GF_ASSERT(param);</div><div class='add'>+</div><div class='add'>+    req = (drc_cached_op_t *)item;</div><div class='add'>+    reply = (drc_cached_op_t *)rb_node_data;</div><div class='add'>+</div><div class='add'>+    ret = req-&gt;xid - reply-&gt;xid;</div><div class='add'>+    if (ret != 0)</div><div class='add'>+        return ret;</div><div class='add'>+</div><div class='add'>+    if (req-&gt;prognum == reply-&gt;prognum &amp;&amp; req-&gt;procnum == reply-&gt;procnum &amp;&amp;</div><div class='add'>+        req-&gt;progversion == reply-&gt;progversion)</div><div class='add'>+        return 0;</div><div class='add'>+</div><div class='add'>+    return 1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/**</div><div class='add'>+ * drc_init_client_cache - initialize a drc client and its rb tree</div><div class='add'>+ *</div><div class='add'>+ * @param drc - the main drc structure</div><div class='add'>+ * @param client - the drc client to be initialized</div><div class='add'>+ * @return 0 on success, -1 on failure</div><div class='add'>+ */</div><div class='add'>+static int</div><div class='add'>+drc_init_client_cache(rpcsvc_drc_globals_t *drc, drc_client_t *client)</div><div class='add'>+{</div><div class='add'>+    GF_ASSERT(drc);</div><div class='add'>+    GF_ASSERT(client);</div><div class='add'>+</div><div class='add'>+    client-&gt;rbtree = rb_create(drc_compare_reqs, drc, NULL);</div><div class='add'>+    if (!client-&gt;rbtree) {</div><div class='add'>+        gf_log(GF_RPCSVC, GF_LOG_DEBUG, "rb tree creation failed");</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/**</div><div class='add'>+ * rpcsvc_get_drc_client - find the drc client with given sockaddr, else</div><div class='add'>+ *                         allocate and initialize a new drc client</div><div class='add'>+ *</div><div class='add'>+ * @param drc - the main drc structure</div><div class='add'>+ * @param sockaddr - network address of client</div><div class='add'>+ * @return drc client on success, NULL on failure</div><div class='add'>+ */</div><div class='add'>+static drc_client_t *</div><div class='add'>+rpcsvc_get_drc_client(rpcsvc_drc_globals_t *drc,</div><div class='add'>+                      struct sockaddr_storage *sockaddr)</div><div class='add'>+{</div><div class='add'>+    drc_client_t *client = NULL;</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(drc);</div><div class='add'>+    GF_ASSERT(sockaddr);</div><div class='add'>+</div><div class='add'>+    client = rpcsvc_client_lookup(drc, sockaddr);</div><div class='add'>+    if (client)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    /* if lookup fails, allocate cache for the new client */</div><div class='add'>+    client = GF_CALLOC(1, sizeof(drc_client_t), gf_common_mt_drc_client_t);</div><div class='add'>+    if (!client)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    GF_ATOMIC_INIT(client-&gt;ref, 0);</div><div class='add'>+    client-&gt;sock_union = (union gf_sock_union) * sockaddr;</div><div class='add'>+    client-&gt;op_count = 0;</div><div class='add'>+    INIT_LIST_HEAD(&amp;client-&gt;client_list);</div><div class='add'>+</div><div class='add'>+    if (drc_init_client_cache(drc, client)) {</div><div class='add'>+        gf_log(GF_RPCSVC, GF_LOG_DEBUG, "initialization of drc client failed");</div><div class='add'>+        GF_FREE(client);</div><div class='add'>+        client = NULL;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    drc-&gt;client_count++;</div><div class='add'>+</div><div class='add'>+    list_add(&amp;client-&gt;client_list, &amp;drc-&gt;clients_head);</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return client;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/**</div><div class='add'>+ * rpcsvc_need_drc - Determine if a request needs DRC service</div><div class='add'>+ *</div><div class='add'>+ * @param req - incoming request</div><div class='add'>+ * @return 1 if DRC is needed for req, 0 otherwise</div><div class='add'>+ */</div><div class='add'>+int</div><div class='add'>+rpcsvc_need_drc(rpcsvc_request_t *req)</div><div class='add'>+{</div><div class='add'>+    rpcsvc_actor_t *actor = NULL;</div><div class='add'>+    rpcsvc_drc_globals_t *drc = NULL;</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(req);</div><div class='add'>+    GF_ASSERT(req-&gt;svc);</div><div class='add'>+</div><div class='add'>+    drc = req-&gt;svc-&gt;drc;</div><div class='add'>+</div><div class='add'>+    if (!drc || drc-&gt;status == DRC_UNINITIATED)</div><div class='add'>+        return 0;</div><div class='add'>+</div><div class='add'>+    actor = rpcsvc_program_actor(req);</div><div class='add'>+    if (!actor)</div><div class='add'>+        return 0;</div><div class='add'>+</div><div class='add'>+    return (actor-&gt;op_type == DRC_NON_IDEMPOTENT &amp;&amp; drc-&gt;type != DRC_TYPE_NONE);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/**</div><div class='add'>+ * rpcsvc_drc_client_ref - ref the drc client</div><div class='add'>+ *</div><div class='add'>+ * @param client - the drc client to ref</div><div class='add'>+ * @return client</div><div class='add'>+ */</div><div class='add'>+static drc_client_t *</div><div class='add'>+rpcsvc_drc_client_ref(drc_client_t *client)</div><div class='add'>+{</div><div class='add'>+    GF_ASSERT(client);</div><div class='add'>+    GF_ATOMIC_INC(client-&gt;ref);</div><div class='add'>+    return client;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/**</div><div class='add'>+ * rpcsvc_drc_client_unref - unref the drc client, and destroy</div><div class='add'>+ *                           the client on last unref</div><div class='add'>+ *</div><div class='add'>+ * @param drc - the main drc structure</div><div class='add'>+ * @param client - the drc client to unref</div><div class='add'>+ * @return NULL if it is the last unref, client otherwise</div><div class='add'>+ */</div><div class='add'>+static drc_client_t *</div><div class='add'>+rpcsvc_drc_client_unref(rpcsvc_drc_globals_t *drc, drc_client_t *client)</div><div class='add'>+{</div><div class='add'>+    uint32_t refcount;</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(drc);</div><div class='add'>+</div><div class='add'>+    refcount = GF_ATOMIC_DEC(client-&gt;ref);</div><div class='add'>+    if (!refcount) {</div><div class='add'>+        drc-&gt;client_count--;</div><div class='add'>+        rpcsvc_remove_drc_client(client);</div><div class='add'>+        client = NULL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return client;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/**</div><div class='add'>+ * rpcsvc_drc_lookup - lookup a request to see if it is already cached</div><div class='add'>+ *</div><div class='add'>+ * @param req - incoming request</div><div class='add'>+ * @return cached reply of req if found, NULL otherwise</div><div class='add'>+ */</div><div class='add'>+drc_cached_op_t *</div><div class='add'>+rpcsvc_drc_lookup(rpcsvc_request_t *req)</div><div class='add'>+{</div><div class='add'>+    drc_client_t *client = NULL;</div><div class='add'>+    drc_cached_op_t *reply = NULL;</div><div class='add'>+    drc_cached_op_t new = {</div><div class='add'>+        .xid = req-&gt;xid,</div><div class='add'>+        .prognum = req-&gt;prognum,</div><div class='add'>+        .progversion = req-&gt;progver,</div><div class='add'>+        .procnum = req-&gt;procnum,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(req);</div><div class='add'>+</div><div class='add'>+    if (!req-&gt;trans-&gt;drc_client) {</div><div class='add'>+        client = rpcsvc_get_drc_client(req-&gt;svc-&gt;drc,</div><div class='add'>+                                       &amp;req-&gt;trans-&gt;peerinfo.sockaddr);</div><div class='add'>+        if (!client)</div><div class='add'>+            goto out;</div><div class='add'>+</div><div class='add'>+        req-&gt;trans-&gt;drc_client = rpcsvc_drc_client_ref(client);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    client = req-&gt;trans-&gt;drc_client;</div><div class='add'>+</div><div class='add'>+    if (client-&gt;op_count == 0)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    reply = rb_find(client-&gt;rbtree, &amp;new);</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return reply;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/**</div><div class='add'>+ * rpcsvc_send_cached_reply - send the cached reply for the incoming request</div><div class='add'>+ *</div><div class='add'>+ * @param req - incoming request (which is a duplicate in this case)</div><div class='add'>+ * @param reply - the cached reply for req</div><div class='add'>+ * @return 0 on successful reply submission, -1 or other non-zero value</div><div class='add'>+ * otherwise</div><div class='add'>+ */</div><div class='add'>+int</div><div class='add'>+rpcsvc_send_cached_reply(rpcsvc_request_t *req, drc_cached_op_t *reply)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(req);</div><div class='add'>+    GF_ASSERT(reply);</div><div class='add'>+</div><div class='add'>+    gf_log(GF_RPCSVC, GF_LOG_DEBUG,</div><div class='add'>+           "sending cached reply: xid: %d, "</div><div class='add'>+           "client: %s",</div><div class='add'>+           req-&gt;xid, req-&gt;trans-&gt;peerinfo.identifier);</div><div class='add'>+</div><div class='add'>+    rpcsvc_drc_client_ref(reply-&gt;client);</div><div class='add'>+    ret = rpcsvc_transport_submit(</div><div class='add'>+        req-&gt;trans, reply-&gt;msg.rpchdr, reply-&gt;msg.rpchdrcount,</div><div class='add'>+        reply-&gt;msg.proghdr, reply-&gt;msg.proghdrcount, reply-&gt;msg.progpayload,</div><div class='add'>+        reply-&gt;msg.progpayloadcount, reply-&gt;msg.iobref, req-&gt;trans_private);</div><div class='add'>+    rpcsvc_drc_client_unref(req-&gt;svc-&gt;drc, reply-&gt;client);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/**</div><div class='add'>+ * rpcsvc_cache_reply - cache the reply for the processed request 'req'</div><div class='add'>+ *</div><div class='add'>+ * @param req - processed request</div><div class='add'>+ * @param iobref - iobref structure of the reply</div><div class='add'>+ * @param rpchdr - rpc header of the reply</div><div class='add'>+ * @param rpchdrcount - size of rpchdr</div><div class='add'>+ * @param proghdr - program header of the reply</div><div class='add'>+ * @param proghdrcount - size of proghdr</div><div class='add'>+ * @param payload - payload of the reply if any</div><div class='add'>+ * @param payloadcount - size of payload</div><div class='add'>+ * @return 0 on success, -1 on failure</div><div class='add'>+ */</div><div class='add'>+int</div><div class='add'>+rpcsvc_cache_reply(rpcsvc_request_t *req, struct iobref *iobref,</div><div class='add'>+                   struct iovec *rpchdr, int rpchdrcount, struct iovec *proghdr,</div><div class='add'>+                   int proghdrcount, struct iovec *payload, int payloadcount)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    drc_cached_op_t *reply = NULL;</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(req);</div><div class='add'>+    GF_ASSERT(req-&gt;reply);</div><div class='add'>+</div><div class='add'>+    reply = req-&gt;reply;</div><div class='add'>+</div><div class='add'>+    reply-&gt;state = DRC_OP_CACHED;</div><div class='add'>+</div><div class='add'>+    reply-&gt;msg.iobref = iobref_ref(iobref);</div><div class='add'>+</div><div class='add'>+    reply-&gt;msg.rpchdrcount = rpchdrcount;</div><div class='add'>+    reply-&gt;msg.rpchdr = iov_dup(rpchdr, rpchdrcount);</div><div class='add'>+</div><div class='add'>+    reply-&gt;msg.proghdrcount = proghdrcount;</div><div class='add'>+    reply-&gt;msg.proghdr = iov_dup(proghdr, proghdrcount);</div><div class='add'>+</div><div class='add'>+    reply-&gt;msg.progpayloadcount = payloadcount;</div><div class='add'>+    if (payloadcount)</div><div class='add'>+        reply-&gt;msg.progpayload = iov_dup(payload, payloadcount);</div><div class='add'>+</div><div class='add'>+    //        rpcsvc_drc_client_unref (req-&gt;svc-&gt;drc, req-&gt;trans-&gt;drc_client);</div><div class='add'>+    //        rpcsvc_drc_op_unref (req-&gt;svc-&gt;drc, reply);</div><div class='add'>+    ret = 0;</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/**</div><div class='add'>+ * rpcsvc_vacate_drc_entries - free up some percentage of drc cache</div><div class='add'>+ *                             based on the lru factor</div><div class='add'>+ *</div><div class='add'>+ * @param drc - the main drc structure</div><div class='add'>+ * @return void</div><div class='add'>+ */</div><div class='add'>+static void</div><div class='add'>+rpcsvc_vacate_drc_entries(rpcsvc_drc_globals_t *drc)</div><div class='add'>+{</div><div class='add'>+    uint32_t i = 0;</div><div class='add'>+    uint32_t n = 0;</div><div class='add'>+    drc_cached_op_t *reply = NULL;</div><div class='add'>+    drc_cached_op_t *tmp = NULL;</div><div class='add'>+    drc_client_t *client = NULL;</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(drc);</div><div class='add'>+</div><div class='add'>+    n = drc-&gt;global_cache_size / drc-&gt;lru_factor;</div><div class='add'>+</div><div class='add'>+    list_for_each_entry_safe_reverse(reply, tmp, &amp;drc-&gt;cache_head, global_list)</div><div class='add'>+    {</div><div class='add'>+        /* Don't delete ops that are in transit */</div><div class='add'>+        if (reply-&gt;state == DRC_OP_IN_TRANSIT)</div><div class='add'>+            continue;</div><div class='add'>+</div><div class='add'>+        client = reply-&gt;client;</div><div class='add'>+</div><div class='add'>+        rb_delete(client-&gt;rbtree, reply);</div><div class='add'>+</div><div class='add'>+        rpcsvc_drc_op_destroy(drc, reply);</div><div class='add'>+        rpcsvc_drc_client_unref(drc, client);</div><div class='add'>+        i++;</div><div class='add'>+        if (i &gt;= n)</div><div class='add'>+            break;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/**</div><div class='add'>+ * rpcsvc_add_op_to_cache - insert the cached op into the client rbtree and drc</div><div class='add'>+ * list</div><div class='add'>+ *</div><div class='add'>+ * @param drc - the main drc structure</div><div class='add'>+ * @param reply - the op to be inserted</div><div class='add'>+ * @return 0 on success, -1 on failure</div><div class='add'>+ */</div><div class='add'>+static int</div><div class='add'>+rpcsvc_add_op_to_cache(rpcsvc_drc_globals_t *drc, drc_cached_op_t *reply)</div><div class='add'>+{</div><div class='add'>+    drc_client_t *client = NULL;</div><div class='add'>+    drc_cached_op_t **tmp_reply = NULL;</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(drc);</div><div class='add'>+    GF_ASSERT(reply);</div><div class='add'>+</div><div class='add'>+    client = reply-&gt;client;</div><div class='add'>+</div><div class='add'>+    /* cache is full, free up some space */</div><div class='add'>+    if (drc-&gt;op_count &gt;= drc-&gt;global_cache_size)</div><div class='add'>+        rpcsvc_vacate_drc_entries(drc);</div><div class='add'>+</div><div class='add'>+    tmp_reply = (drc_cached_op_t **)rb_probe(client-&gt;rbtree, reply);</div><div class='add'>+    if (!tmp_reply) {</div><div class='add'>+        /* mem alloc failed */</div><div class='add'>+        return -1;</div><div class='add'>+    } else if (*tmp_reply != reply) {</div><div class='add'>+        /* should never happen */</div><div class='add'>+        gf_log(GF_RPCSVC, GF_LOG_ERROR, "DRC failed to detect duplicates");</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    client-&gt;op_count++;</div><div class='add'>+    list_add(&amp;reply-&gt;global_list, &amp;drc-&gt;cache_head);</div><div class='add'>+    drc-&gt;op_count++;</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/**</div><div class='add'>+ * rpcsvc_cache_request - cache the in-transition incoming request</div><div class='add'>+ *</div><div class='add'>+ * @param req - incoming request</div><div class='add'>+ * @return 0 on success, -1 on failure</div><div class='add'>+ */</div><div class='add'>+int</div><div class='add'>+rpcsvc_cache_request(rpcsvc_request_t *req)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    drc_client_t *client = NULL;</div><div class='add'>+    drc_cached_op_t *reply = NULL;</div><div class='add'>+    rpcsvc_drc_globals_t *drc = NULL;</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(req);</div><div class='add'>+</div><div class='add'>+    drc = req-&gt;svc-&gt;drc;</div><div class='add'>+</div><div class='add'>+    client = req-&gt;trans-&gt;drc_client;</div><div class='add'>+    if (!client) {</div><div class='add'>+        gf_log(GF_RPCSVC, GF_LOG_DEBUG, "drc client is NULL");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    reply = mem_get0(drc-&gt;mempool);</div><div class='add'>+    if (!reply)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    reply-&gt;client = rpcsvc_drc_client_ref(client);</div><div class='add'>+    reply-&gt;xid = req-&gt;xid;</div><div class='add'>+    reply-&gt;prognum = req-&gt;prognum;</div><div class='add'>+    reply-&gt;progversion = req-&gt;progver;</div><div class='add'>+    reply-&gt;procnum = req-&gt;procnum;</div><div class='add'>+    reply-&gt;state = DRC_OP_IN_TRANSIT;</div><div class='add'>+    req-&gt;reply = reply;</div><div class='add'>+    INIT_LIST_HEAD(&amp;reply-&gt;global_list);</div><div class='add'>+</div><div class='add'>+    ret = rpcsvc_add_op_to_cache(drc, reply);</div><div class='add'>+    if (ret) {</div><div class='add'>+        req-&gt;reply = NULL;</div><div class='add'>+        rpcsvc_drc_op_destroy(drc, reply);</div><div class='add'>+        rpcsvc_drc_client_unref(drc, client);</div><div class='add'>+        gf_log(GF_RPCSVC, GF_LOG_DEBUG, "Failed to add op to drc cache");</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/**</div><div class='add'>+ *</div><div class='add'>+ * rpcsvc_drc_priv - function which dumps the drc state</div><div class='add'>+ *</div><div class='add'>+ * @param drc - the main drc structure</div><div class='add'>+ * @return 0 on success, -1 on failure</div><div class='add'>+ */</div><div class='add'>+int32_t</div><div class='add'>+rpcsvc_drc_priv(rpcsvc_drc_globals_t *drc)</div><div class='add'>+{</div><div class='add'>+    int i = 0;</div><div class='add'>+    char key[GF_DUMP_MAX_BUF_LEN] = {0};</div><div class='add'>+    drc_client_t *client = NULL;</div><div class='add'>+    char ip[INET6_ADDRSTRLEN] = {0};</div><div class='add'>+</div><div class='add'>+    if (!drc || drc-&gt;status == DRC_UNINITIATED) {</div><div class='add'>+        gf_log(GF_RPCSVC, GF_LOG_DEBUG,</div><div class='add'>+               "DRC is "</div><div class='add'>+               "uninitialized, not dumping its state");</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    gf_proc_dump_add_section("rpc.drc");</div><div class='add'>+</div><div class='add'>+    if (TRY_LOCK(&amp;drc-&gt;lock))</div><div class='add'>+        return -1;</div><div class='add'>+</div><div class='add'>+    gf_proc_dump_build_key(key, "drc", "type");</div><div class='add'>+    gf_proc_dump_write(key, "%d", drc-&gt;type);</div><div class='add'>+</div><div class='add'>+    gf_proc_dump_build_key(key, "drc", "client_count");</div><div class='add'>+    gf_proc_dump_write(key, "%d", drc-&gt;client_count);</div><div class='add'>+</div><div class='add'>+    gf_proc_dump_build_key(key, "drc", "current_cache_size");</div><div class='add'>+    gf_proc_dump_write(key, "%d", drc-&gt;op_count);</div><div class='add'>+</div><div class='add'>+    gf_proc_dump_build_key(key, "drc", "max_cache_size");</div><div class='add'>+    gf_proc_dump_write(key, "%d", drc-&gt;global_cache_size);</div><div class='add'>+</div><div class='add'>+    gf_proc_dump_build_key(key, "drc", "lru_factor");</div><div class='add'>+    gf_proc_dump_write(key, "%d", drc-&gt;lru_factor);</div><div class='add'>+</div><div class='add'>+    gf_proc_dump_build_key(key, "drc", "duplicate_request_count");</div><div class='add'>+    gf_proc_dump_write(key, "%" PRIu64, drc-&gt;cache_hits);</div><div class='add'>+</div><div class='add'>+    gf_proc_dump_build_key(key, "drc", "in_transit_duplicate_requests");</div><div class='add'>+    gf_proc_dump_write(key, "%" PRIu64, drc-&gt;intransit_hits);</div><div class='add'>+</div><div class='add'>+    list_for_each_entry(client, &amp;drc-&gt;clients_head, client_list)</div><div class='add'>+    {</div><div class='add'>+        gf_proc_dump_build_key(key, "client", "%d.ip-address", i);</div><div class='add'>+        memset(ip, 0, INET6_ADDRSTRLEN);</div><div class='add'>+        switch (client-&gt;sock_union.storage.ss_family) {</div><div class='add'>+            case AF_INET:</div><div class='add'>+                gf_proc_dump_write(</div><div class='add'>+                    key, "%s",</div><div class='add'>+                    inet_ntop(AF_INET, &amp;client-&gt;sock_union.sin.sin_addr.s_addr,</div><div class='add'>+                              ip, INET_ADDRSTRLEN));</div><div class='add'>+                break;</div><div class='add'>+            case AF_INET6:</div><div class='add'>+                gf_proc_dump_write(</div><div class='add'>+                    key, "%s",</div><div class='add'>+                    inet_ntop(AF_INET6, &amp;client-&gt;sock_union.sin6.sin6_addr, ip,</div><div class='add'>+                              INET6_ADDRSTRLEN));</div><div class='add'>+                break;</div><div class='add'>+            default:</div><div class='add'>+                gf_proc_dump_write(key, "%s", "N/A");</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        gf_proc_dump_build_key(key, "client", "%d.ref_count", i);</div><div class='add'>+        gf_proc_dump_write(key, "%" PRIu32, GF_ATOMIC_GET(client-&gt;ref));</div><div class='add'>+        gf_proc_dump_build_key(key, "client", "%d.op_count", i);</div><div class='add'>+        gf_proc_dump_write(key, "%d", client-&gt;op_count);</div><div class='add'>+        i++;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    UNLOCK(&amp;drc-&gt;lock);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/**</div><div class='add'>+ * rpcsvc_drc_notify - function which is notified of RPC transport events</div><div class='add'>+ *</div><div class='add'>+ * @param svc - pointer to rpcsvc_t structure of the rpc</div><div class='add'>+ * @param xl - pointer to the xlator</div><div class='add'>+ * @param event - the event which triggered this notify</div><div class='add'>+ * @param data - the transport structure</div><div class='add'>+ * @return 0 on success, -1 on failure</div><div class='add'>+ */</div><div class='add'>+int</div><div class='add'>+rpcsvc_drc_notify(rpcsvc_t *svc, void *xl, rpcsvc_event_t event, void *data)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    rpc_transport_t *trans = NULL;</div><div class='add'>+    drc_client_t *client = NULL;</div><div class='add'>+    rpcsvc_drc_globals_t *drc = NULL;</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(svc);</div><div class='add'>+    GF_ASSERT(svc-&gt;drc);</div><div class='add'>+    GF_ASSERT(data);</div><div class='add'>+</div><div class='add'>+    drc = svc-&gt;drc;</div><div class='add'>+</div><div class='add'>+    if (drc-&gt;status == DRC_UNINITIATED || drc-&gt;type == DRC_TYPE_NONE)</div><div class='add'>+        return 0;</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;drc-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        trans = (rpc_transport_t *)data;</div><div class='add'>+        client = rpcsvc_get_drc_client(drc, &amp;trans-&gt;peerinfo.sockaddr);</div><div class='add'>+        if (!client)</div><div class='add'>+            goto unlock;</div><div class='add'>+</div><div class='add'>+        switch (event) {</div><div class='add'>+            case RPCSVC_EVENT_ACCEPT:</div><div class='add'>+                trans-&gt;drc_client = rpcsvc_drc_client_ref(client);</div><div class='add'>+                ret = 0;</div><div class='add'>+                break;</div><div class='add'>+</div><div class='add'>+            case RPCSVC_EVENT_DISCONNECT:</div><div class='add'>+                ret = 0;</div><div class='add'>+                if (list_empty(&amp;drc-&gt;clients_head))</div><div class='add'>+                    break;</div><div class='add'>+                /* should be the last unref */</div><div class='add'>+                trans-&gt;drc_client = NULL;</div><div class='add'>+                rpcsvc_drc_client_unref(drc, client);</div><div class='add'>+                break;</div><div class='add'>+</div><div class='add'>+            default:</div><div class='add'>+                break;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+unlock:</div><div class='add'>+    UNLOCK(&amp;drc-&gt;lock);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/**</div><div class='add'>+ * rpcsvc_drc_init - Initialize the duplicate request cache service</div><div class='add'>+ *</div><div class='add'>+ * @param svc - pointer to rpcsvc_t structure of the rpc</div><div class='add'>+ * @param options - the options dictionary which configures drc</div><div class='add'>+ * @return 0 on success, non-zero integer on failure</div><div class='add'>+ */</div><div class='add'>+int</div><div class='add'>+rpcsvc_drc_init(rpcsvc_t *svc, dict_t *options)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+    uint32_t drc_type = 0;</div><div class='add'>+    uint32_t drc_size = 0;</div><div class='add'>+    uint32_t drc_factor = 0;</div><div class='add'>+    rpcsvc_drc_globals_t *drc = NULL;</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(svc);</div><div class='add'>+    GF_ASSERT(options);</div><div class='add'>+</div><div class='add'>+    /* Toggle DRC on/off, when more drc types(persistent/cluster)</div><div class='add'>+     * are added, we shouldn't treat this as boolean. */</div><div class='add'>+    ret = dict_get_str_boolean(options, "nfs.drc", _gf_false);</div><div class='add'>+    if (ret == -1) {</div><div class='add'>+        gf_log(GF_RPCSVC, GF_LOG_INFO, "drc user options need second look");</div><div class='add'>+        ret = _gf_false;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    gf_log(GF_RPCSVC, GF_LOG_INFO, "DRC is turned %s", (ret ? "ON" : "OFF"));</div><div class='add'>+</div><div class='add'>+    /*DRC off, nothing to do */</div><div class='add'>+    if (ret == _gf_false)</div><div class='add'>+        return (0);</div><div class='add'>+</div><div class='add'>+    drc = GF_CALLOC(1, sizeof(rpcsvc_drc_globals_t),</div><div class='add'>+                    gf_common_mt_drc_globals_t);</div><div class='add'>+    if (!drc)</div><div class='add'>+        return (-1);</div><div class='add'>+</div><div class='add'>+    LOCK_INIT(&amp;drc-&gt;lock);</div><div class='add'>+    svc-&gt;drc = drc;</div><div class='add'>+</div><div class='add'>+    /* Specify type of DRC to be used */</div><div class='add'>+    ret = dict_get_uint32(options, "nfs.drc-type", &amp;drc_type);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log(GF_RPCSVC, GF_LOG_DEBUG,</div><div class='add'>+               "drc type not set. Continuing with default");</div><div class='add'>+        drc_type = DRC_DEFAULT_TYPE;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Set the global cache size (no. of ops to cache) */</div><div class='add'>+    ret = dict_get_uint32(options, "nfs.drc-size", &amp;drc_size);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log(GF_RPCSVC, GF_LOG_DEBUG,</div><div class='add'>+               "drc size not set. Continuing with default size");</div><div class='add'>+        drc_size = DRC_DEFAULT_CACHE_SIZE;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;drc-&gt;lock);</div><div class='add'>+</div><div class='add'>+    drc-&gt;type = drc_type;</div><div class='add'>+    drc-&gt;global_cache_size = drc_size;</div><div class='add'>+</div><div class='add'>+    /* Mempool for cached ops */</div><div class='add'>+    drc-&gt;mempool = mem_pool_new(drc_cached_op_t, drc-&gt;global_cache_size);</div><div class='add'>+    if (!drc-&gt;mempool) {</div><div class='add'>+        UNLOCK(&amp;drc-&gt;lock);</div><div class='add'>+        gf_log(GF_RPCSVC, GF_LOG_ERROR,</div><div class='add'>+               "Failed to get mempool for DRC, drc-size: %d", drc_size);</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto post_unlock;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* What percent of cache to be evicted whenever it fills up */</div><div class='add'>+    ret = dict_get_uint32(options, "nfs.drc-lru-factor", &amp;drc_factor);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log(GF_RPCSVC, GF_LOG_DEBUG,</div><div class='add'>+               "drc lru factor not set. Continuing with policy default");</div><div class='add'>+        drc_factor = DRC_DEFAULT_LRU_FACTOR;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    drc-&gt;lru_factor = (drc_lru_factor_t)drc_factor;</div><div class='add'>+</div><div class='add'>+    INIT_LIST_HEAD(&amp;drc-&gt;clients_head);</div><div class='add'>+    INIT_LIST_HEAD(&amp;drc-&gt;cache_head);</div><div class='add'>+</div><div class='add'>+    ret = rpcsvc_register_notify(svc, rpcsvc_drc_notify, THIS);</div><div class='add'>+    if (ret) {</div><div class='add'>+        UNLOCK(&amp;drc-&gt;lock);</div><div class='add'>+        gf_log(GF_RPCSVC, GF_LOG_ERROR,</div><div class='add'>+               "registration of drc_notify function failed");</div><div class='add'>+        goto post_unlock;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    drc-&gt;status = DRC_INITIATED;</div><div class='add'>+    UNLOCK(&amp;drc-&gt;lock);</div><div class='add'>+    gf_log(GF_RPCSVC, GF_LOG_DEBUG, "drc init successful");</div><div class='add'>+post_unlock:</div><div class='add'>+    if (ret == -1) {</div><div class='add'>+        if (drc-&gt;mempool) {</div><div class='add'>+            mem_pool_destroy(drc-&gt;mempool);</div><div class='add'>+            drc-&gt;mempool = NULL;</div><div class='add'>+        }</div><div class='add'>+        GF_FREE(drc);</div><div class='add'>+        svc-&gt;drc = NULL;</div><div class='add'>+    }</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+rpcsvc_drc_deinit(rpcsvc_t *svc)</div><div class='add'>+{</div><div class='add'>+    rpcsvc_drc_globals_t *drc = NULL;</div><div class='add'>+</div><div class='add'>+    if (!svc)</div><div class='add'>+        return (-1);</div><div class='add'>+</div><div class='add'>+    drc = svc-&gt;drc;</div><div class='add'>+    if (!drc)</div><div class='add'>+        return (0);</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;drc-&gt;lock);</div><div class='add'>+    (void)rpcsvc_unregister_notify(svc, rpcsvc_drc_notify, THIS);</div><div class='add'>+    if (drc-&gt;mempool) {</div><div class='add'>+        mem_pool_destroy(drc-&gt;mempool);</div><div class='add'>+        drc-&gt;mempool = NULL;</div><div class='add'>+    }</div><div class='add'>+    UNLOCK(&amp;drc-&gt;lock);</div><div class='add'>+</div><div class='add'>+    GF_FREE(drc);</div><div class='add'>+    svc-&gt;drc = NULL;</div><div class='add'>+</div><div class='add'>+    return (0);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+rpcsvc_drc_reconfigure(rpcsvc_t *svc, dict_t *options)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    gf_boolean_t enable_drc = _gf_false;</div><div class='add'>+    rpcsvc_drc_globals_t *drc = NULL;</div><div class='add'>+    uint32_t drc_size = 0;</div><div class='add'>+</div><div class='add'>+    /* Input sanitization */</div><div class='add'>+    if ((!svc) || (!options))</div><div class='add'>+        return (-1);</div><div class='add'>+</div><div class='add'>+    /* If DRC was not enabled before, Let rpcsvc_drc_init() to</div><div class='add'>+     * take care of DRC initialization part.</div><div class='add'>+     */</div><div class='add'>+    drc = svc-&gt;drc;</div><div class='add'>+    if (!drc) {</div><div class='add'>+        return rpcsvc_drc_init(svc, options);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* DRC was already enabled before. Going to be reconfigured. Check</div><div class='add'>+     * if reconfigured options contain "nfs.drc" and "nfs.drc-size".</div><div class='add'>+     *</div><div class='add'>+     * NB: If DRC is "OFF", "drc-size" has no role to play.</div><div class='add'>+     *     So, "drc-size" gets evaluated IFF DRC is "ON".</div><div class='add'>+     *</div><div class='add'>+     * If DRC is reconfigured,</div><div class='add'>+     *     case 1: DRC is "ON"</div><div class='add'>+     *         sub-case 1: drc-size remains same</div><div class='add'>+     *              ACTION: Nothing to do.</div><div class='add'>+     *         sub-case 2: drc-size just changed</div><div class='add'>+     *              ACTION: rpcsvc_drc_deinit() followed by</div><div class='add'>+     *                      rpcsvc_drc_init().</div><div class='add'>+     *</div><div class='add'>+     *     case 2: DRC is "OFF"</div><div class='add'>+     *         ACTION: rpcsvc_drc_deinit()</div><div class='add'>+     */</div><div class='add'>+    ret = dict_get_str_boolean(options, "nfs.drc", _gf_false);</div><div class='add'>+    if (ret &lt; 0)</div><div class='add'>+        ret = _gf_false;</div><div class='add'>+</div><div class='add'>+    enable_drc = ret;</div><div class='add'>+    gf_log(GF_RPCSVC, GF_LOG_INFO, "DRC is turned %s", (ret ? "ON" : "OFF"));</div><div class='add'>+</div><div class='add'>+    /* case 1: DRC is "ON"*/</div><div class='add'>+    if (enable_drc) {</div><div class='add'>+        /* Fetch drc-size if reconfigured */</div><div class='add'>+        if (dict_get_uint32(options, "nfs.drc-size", &amp;drc_size))</div><div class='add'>+            drc_size = DRC_DEFAULT_CACHE_SIZE;</div><div class='add'>+</div><div class='add'>+        /* case 1: sub-case 1*/</div><div class='add'>+        if (drc-&gt;global_cache_size == drc_size)</div><div class='add'>+            return (0);</div><div class='add'>+</div><div class='add'>+        /* case 1: sub-case 2*/</div><div class='add'>+        (void)rpcsvc_drc_deinit(svc);</div><div class='add'>+        return rpcsvc_drc_init(svc, options);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* case 2: DRC is "OFF" */</div><div class='add'>+    return rpcsvc_drc_deinit(svc);</div><div class='add'>+}</div><div class='head'>diff --git a/rpc/rpc-lib/src/rpc-drc.h b/rpc/rpc-lib/src/rpc-drc.h<br/>new file mode 100644<br/>index 00000000000..ce66430809b<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/rpc/rpc-lib/src/rpc-drc.h?id=d1d7a6f35c816822fab51c820e25023863c239c1'>rpc/rpc-lib/src/rpc-drc.h</a></div><div class='hunk'>@@ -0,0 +1,97 @@</div><div class='add'>+/*</div><div class='add'>+  Copyright (c) 2013 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#ifndef RPC_DRC_H</div><div class='add'>+#define RPC_DRC_H</div><div class='add'>+</div><div class='add'>+#include "rpcsvc-common.h"</div><div class='add'>+#include "rpcsvc.h"</div><div class='add'>+#include &lt;glusterfs/locking.h&gt;</div><div class='add'>+#include &lt;glusterfs/dict.h&gt;</div><div class='add'>+#include "rb.h"</div><div class='add'>+</div><div class='add'>+/* per-client cache structure */</div><div class='add'>+struct drc_client {</div><div class='add'>+    union gf_sock_union sock_union;</div><div class='add'>+    /* pointers to the cache */</div><div class='add'>+    struct rb_table *rbtree;</div><div class='add'>+    /* no. of ops currently cached */</div><div class='add'>+    uint32_t op_count;</div><div class='add'>+    gf_atomic_uint32_t ref;</div><div class='add'>+    struct list_head client_list;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct drc_cached_op {</div><div class='add'>+    drc_op_state_t state;</div><div class='add'>+    int prognum;</div><div class='add'>+    int progversion;</div><div class='add'>+    int procnum;</div><div class='add'>+    rpc_transport_msg_t msg;</div><div class='add'>+    drc_client_t *client;</div><div class='add'>+    struct list_head client_list;</div><div class='add'>+    struct list_head global_list;</div><div class='add'>+    int32_t ref;</div><div class='add'>+    uint32_t xid;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+/* global drc definitions */</div><div class='add'>+enum drc_status { DRC_UNINITIATED, DRC_INITIATED };</div><div class='add'>+typedef enum drc_status drc_status_t;</div><div class='add'>+</div><div class='add'>+struct drc_globals {</div><div class='add'>+    /* allocator must be the first member since</div><div class='add'>+     * it is used so in gf_libavl_allocator</div><div class='add'>+     */</div><div class='add'>+    struct libavl_allocator allocator;</div><div class='add'>+    /* configurable size parameter */</div><div class='add'>+    gf_lock_t lock;</div><div class='add'>+    uint64_t cache_hits;</div><div class='add'>+    uint64_t intransit_hits;</div><div class='add'>+    struct mem_pool *mempool;</div><div class='add'>+    struct list_head cache_head;</div><div class='add'>+    struct list_head clients_head;</div><div class='add'>+    uint32_t op_count;</div><div class='add'>+    uint32_t client_count;</div><div class='add'>+    uint32_t global_cache_size;</div><div class='add'>+    drc_type_t type;</div><div class='add'>+    drc_lru_factor_t lru_factor;</div><div class='add'>+    drc_status_t status;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+rpcsvc_need_drc(rpcsvc_request_t *req);</div><div class='add'>+</div><div class='add'>+drc_cached_op_t *</div><div class='add'>+rpcsvc_drc_lookup(rpcsvc_request_t *req);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+rpcsvc_send_cached_reply(rpcsvc_request_t *req, drc_cached_op_t *reply);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+rpcsvc_cache_reply(rpcsvc_request_t *req, struct iobref *iobref,</div><div class='add'>+                   struct iovec *rpchdr, int rpchdrcount, struct iovec *proghdr,</div><div class='add'>+                   int proghdrcount, struct iovec *payload, int payloadcount);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+rpcsvc_cache_request(rpcsvc_request_t *req);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+rpcsvc_drc_priv(rpcsvc_drc_globals_t *drc);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+rpcsvc_drc_init(rpcsvc_t *svc, dict_t *options);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+rpcsvc_drc_deinit(rpcsvc_t *svc);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+rpcsvc_drc_reconfigure(rpcsvc_t *svc, dict_t *options);</div><div class='add'>+</div><div class='add'>+#endif /* RPC_DRC_H */</div><div class='head'>diff --git a/rpc/rpc-lib/src/rpc-lib-messages.h b/rpc/rpc-lib/src/rpc-lib-messages.h<br/>new file mode 100644<br/>index 00000000000..2c0b820dbf9<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/rpc/rpc-lib/src/rpc-lib-messages.h?id=d1d7a6f35c816822fab51c820e25023863c239c1'>rpc/rpc-lib/src/rpc-lib-messages.h</a></div><div class='hunk'>@@ -0,0 +1,34 @@</div><div class='add'>+/*</div><div class='add'>+  Copyright (c) 2015 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#ifndef _RPC_LIB_MESSAGES_H_</div><div class='add'>+#define _RPC_LIB_MESSAGES_H_</div><div class='add'>+</div><div class='add'>+#include &lt;glusterfs/glfs-message-id.h&gt;</div><div class='add'>+</div><div class='add'>+/* To add new message IDs, append new identifiers at the end of the list.</div><div class='add'>+ *</div><div class='add'>+ * Never remove a message ID. If it's not used anymore, you can rename it or</div><div class='add'>+ * leave it as it is, but not delete it. This is to prevent reutilization of</div><div class='add'>+ * IDs by other messages.</div><div class='add'>+ *</div><div class='add'>+ * The component name must match one of the entries defined in</div><div class='add'>+ * glfs-message-id.h.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+GLFS_MSGID(RPC_LIB, TRANS_MSG_ADDR_FAMILY_NOT_SPECIFIED,</div><div class='add'>+           TRANS_MSG_UNKNOWN_ADDR_FAMILY, TRANS_MSG_REMOTE_HOST_ERROR,</div><div class='add'>+           TRANS_MSG_DNS_RESOL_FAILED, TRANS_MSG_LISTEN_PATH_ERROR,</div><div class='add'>+           TRANS_MSG_CONNECT_PATH_ERROR, TRANS_MSG_GET_ADDR_INFO_FAILED,</div><div class='add'>+           TRANS_MSG_PORT_BIND_FAILED, TRANS_MSG_INET_ERROR,</div><div class='add'>+           TRANS_MSG_GET_NAME_INFO_FAILED, TRANS_MSG_TRANSPORT_ERROR,</div><div class='add'>+           TRANS_MSG_TIMEOUT_EXCEEDED, TRANS_MSG_SOCKET_BIND_ERROR);</div><div class='add'>+</div><div class='add'>+#endif /* !_RPC_LIB_MESSAGES_H_ */</div><div class='head'>diff --git a/rpc/rpc-lib/src/rpc-transport.c b/rpc/rpc-lib/src/rpc-transport.c<br/>index 184d614a466..a6e201a9b36 100644<br/>--- a/<a href='/cgit/glusterfs.git/tree/rpc/rpc-lib/src/rpc-transport.c?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>rpc/rpc-lib/src/rpc-transport.c</a><br/>+++ b/<a href='/cgit/glusterfs.git/tree/rpc/rpc-lib/src/rpc-transport.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>rpc/rpc-lib/src/rpc-transport.c</a></div><div class='hunk'>@@ -1,1150 +1,672 @@</div><div class='ctx'> /*</div><div class='del'>-  Copyright (c) 2010 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='add'>+  Copyright (c) 2008-2012 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='ctx'>   This file is part of GlusterFS.</div><div class='ctx'> </div><div class='del'>-  GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-  it under the terms of the GNU Affero General Public License as published</div><div class='del'>-  by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-  or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-  GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-  WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-  Affero General Public License for more details.</div><div class='del'>-</div><div class='del'>-  You should have received a copy of the GNU Affero General Public License</div><div class='del'>-  along with this program.  If not, see</div><div class='del'>-  &lt;http://www.gnu.org/licenses/&gt;.</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='ctx'> */</div><div class='ctx'> </div><div class='ctx'> #include &lt;dlfcn.h&gt;</div><div class='ctx'> #include &lt;stdlib.h&gt;</div><div class='ctx'> #include &lt;stdio.h&gt;</div><div class='ctx'> #include &lt;sys/poll.h&gt;</div><div class='del'>-#include &lt;fnmatch.h&gt;</div><div class='ctx'> #include &lt;stdint.h&gt;</div><div class='ctx'> </div><div class='del'>-#ifndef _CONFIG_H</div><div class='del'>-#define _CONFIG_H</div><div class='del'>-#include "config.h"</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-#include "logging.h"</div><div class='ctx'> #include "rpc-transport.h"</div><div class='del'>-#include "glusterfs.h"</div><div class='del'>-/* FIXME: xlator.h is needed for volume_option_t, need to define the datatype</div><div class='del'>- * in some other header</div><div class='del'>- */</div><div class='del'>-#include "xlator.h"</div><div class='del'>-#include "list.h"</div><div class='ctx'> </div><div class='ctx'> #ifndef GF_OPTION_LIST_EMPTY</div><div class='ctx'> #define GF_OPTION_LIST_EMPTY(_opt) (_opt-&gt;value[0] == NULL)</div><div class='ctx'> #endif</div><div class='ctx'> </div><div class='del'>-/* RFC 1123 &amp; 952 */</div><div class='del'>-static char</div><div class='del'>-valid_host_name (char *address, int length)</div><div class='add'>+int32_t</div><div class='add'>+rpc_transport_count(const char *transport_type)</div><div class='ctx'> {</div><div class='del'>-        int i = 0;</div><div class='del'>-        char ret = 1;</div><div class='del'>-</div><div class='del'>-        if ((length &gt; 75) || (length == 1)) {</div><div class='del'>-                ret = 0;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (!isalnum (address[length - 1])) {</div><div class='del'>-                ret = 0;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        for (i = 0; i &lt; length; i++) {</div><div class='del'>-                if (!isalnum (address[i]) &amp;&amp; (address[i] != '.')</div><div class='del'>-                    &amp;&amp; (address[i] != '-')) {</div><div class='del'>-                        ret = 0;</div><div class='del'>-                        goto out;</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        return ret;</div><div class='add'>+    char *transport_dup = NULL;</div><div class='add'>+    char *saveptr = NULL;</div><div class='add'>+    char *ptr = NULL;</div><div class='add'>+    int count = 0;</div><div class='add'>+</div><div class='add'>+    if (transport_type == NULL)</div><div class='add'>+        return -1;</div><div class='add'>+</div><div class='add'>+    transport_dup = gf_strdup(transport_type);</div><div class='add'>+    if (transport_dup == NULL) {</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ptr = strtok_r(transport_dup, ",", &amp;saveptr);</div><div class='add'>+    while (ptr != NULL) {</div><div class='add'>+        count++;</div><div class='add'>+        ptr = strtok_r(NULL, ",", &amp;saveptr);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    GF_FREE(transport_dup);</div><div class='add'>+    return count;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-static char</div><div class='del'>-valid_ipv4_address (char *address, int length)</div><div class='add'>+int</div><div class='add'>+rpc_transport_get_myaddr(rpc_transport_t *this, char *peeraddr, int addrlen,</div><div class='add'>+                         struct sockaddr_storage *sa, size_t salen)</div><div class='ctx'> {</div><div class='del'>-        int octets = 0;</div><div class='del'>-        int value = 0;</div><div class='del'>-        char *tmp = NULL, *ptr = NULL, *prev = NULL, *endptr = NULL;</div><div class='del'>-        char ret = 1;</div><div class='del'>-</div><div class='del'>-        tmp = gf_strdup (address);</div><div class='del'>-        prev = strtok_r (tmp, ".", &amp;ptr);</div><div class='add'>+    int32_t ret = -1;</div><div class='add'>+    GF_VALIDATE_OR_GOTO("rpc", this, out);</div><div class='ctx'> </div><div class='del'>-        while (prev != NULL)</div><div class='del'>-        {</div><div class='del'>-                octets++;</div><div class='del'>-                value = strtol (prev, &amp;endptr, 10);</div><div class='del'>-                if ((value &gt; 255) || (value &lt; 0) || (endptr != NULL)) {</div><div class='del'>-                        ret = 0;</div><div class='del'>-                        goto out;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                prev = strtok_r (NULL, ".", &amp;ptr);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (octets != 4) {</div><div class='del'>-                ret = 0;</div><div class='del'>-        }</div><div class='add'>+    ret = this-&gt;ops-&gt;get_myaddr(this, peeraddr, addrlen, sa, salen);</div><div class='ctx'> </div><div class='ctx'> out:</div><div class='del'>-        GF_FREE (tmp);</div><div class='del'>-        return ret;</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='del'>-static char</div><div class='del'>-valid_ipv6_address (char *address, int length)</div><div class='add'>+int32_t</div><div class='add'>+rpc_transport_get_peername(rpc_transport_t *this, char *hostname, int hostlen)</div><div class='ctx'> {</div><div class='del'>-        int hex_numbers = 0;</div><div class='del'>-        int value = 0;</div><div class='del'>-        char *tmp = NULL, *ptr = NULL, *prev = NULL, *endptr = NULL;</div><div class='del'>-        char ret = 1;</div><div class='del'>-</div><div class='del'>-        tmp = gf_strdup (address);</div><div class='del'>-        prev = strtok_r (tmp, ":", &amp;ptr);</div><div class='del'>-</div><div class='del'>-        while (prev != NULL)</div><div class='del'>-        {</div><div class='del'>-                hex_numbers++;</div><div class='del'>-                value = strtol (prev, &amp;endptr, 16);</div><div class='del'>-                if ((value &gt; 0xffff) || (value &lt; 0)</div><div class='del'>-                    || (endptr != NULL &amp;&amp; *endptr != '\0')) {</div><div class='del'>-                        ret = 0;</div><div class='del'>-                        goto out;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                prev = strtok_r (NULL, ":", &amp;ptr);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (hex_numbers &gt; 8) {</div><div class='del'>-                ret = 0;</div><div class='del'>-        }</div><div class='add'>+    int32_t ret = -1;</div><div class='add'>+    GF_VALIDATE_OR_GOTO("rpc", this, out);</div><div class='ctx'> </div><div class='add'>+    ret = this-&gt;ops-&gt;get_peername(this, hostname, hostlen);</div><div class='ctx'> out:</div><div class='del'>-        GF_FREE (tmp);</div><div class='del'>-        return ret;</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='del'>-static char</div><div class='del'>-valid_internet_address (char *address)</div><div class='add'>+int</div><div class='add'>+rpc_transport_throttle(rpc_transport_t *this, gf_boolean_t onoff)</div><div class='ctx'> {</div><div class='del'>-        char ret = 0;</div><div class='del'>-        int length = 0;</div><div class='del'>-</div><div class='del'>-        if (address == NULL) {</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        length = strlen (address);</div><div class='del'>-        if (length == 0) {</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='add'>+    if (!this-&gt;ops-&gt;throttle)</div><div class='add'>+        return -ENOSYS;</div><div class='ctx'> </div><div class='del'>-        if (valid_ipv4_address (address, length)</div><div class='del'>-            || valid_ipv6_address (address, length)</div><div class='del'>-            || valid_host_name (address, length)) {</div><div class='del'>-                ret = 1;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        return ret;</div><div class='add'>+    return this-&gt;ops-&gt;throttle(this, onoff);</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-__volume_option_value_validate (char *name,</div><div class='del'>-                                data_pair_t *pair,</div><div class='del'>-                                volume_option_t *opt)</div><div class='add'>+int32_t</div><div class='add'>+rpc_transport_get_peeraddr(rpc_transport_t *this, char *peeraddr, int addrlen,</div><div class='add'>+                           struct sockaddr_storage *sa, size_t salen)</div><div class='ctx'> {</div><div class='del'>-	int       i = 0;</div><div class='del'>-	int       ret = -1;</div><div class='del'>-	uint64_t  input_size = 0;</div><div class='del'>-	long long inputll = 0;</div><div class='del'>-</div><div class='del'>-	/* Key is valid, validate the option */</div><div class='del'>-	switch (opt-&gt;type) {</div><div class='del'>-        case GF_OPTION_TYPE_XLATOR:</div><div class='del'>-                break;</div><div class='del'>-</div><div class='del'>-	case GF_OPTION_TYPE_PATH:</div><div class='del'>-	{</div><div class='del'>-                if (strstr (pair-&gt;value-&gt;data, "../")) {</div><div class='del'>-                        gf_log (name, GF_LOG_ERROR,</div><div class='del'>-                                "invalid path given '%s'",</div><div class='del'>-                                pair-&gt;value-&gt;data);</div><div class='del'>-                        ret = -1;</div><div class='del'>-                        goto out;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                /* Make sure the given path is valid */</div><div class='del'>-		if (pair-&gt;value-&gt;data[0] != '/') {</div><div class='del'>-			gf_log (name, GF_LOG_WARNING,</div><div class='del'>-				"option %s %s: '%s' is not an "</div><div class='del'>-				"absolute path name",</div><div class='del'>-				pair-&gt;key, pair-&gt;value-&gt;data,</div><div class='del'>-				pair-&gt;value-&gt;data);</div><div class='del'>-		}</div><div class='del'>-		ret = 0;</div><div class='del'>-	}</div><div class='del'>-	break;</div><div class='del'>-	case GF_OPTION_TYPE_INT:</div><div class='del'>-	{</div><div class='del'>-		/* Check the range */</div><div class='del'>-		if (gf_string2longlong (pair-&gt;value-&gt;data,</div><div class='del'>-					&amp;inputll) != 0) {</div><div class='del'>-			gf_log (name, GF_LOG_ERROR,</div><div class='del'>-				"invalid number format \"%s\" in "</div><div class='del'>-				"\"option %s\"",</div><div class='del'>-				pair-&gt;value-&gt;data, pair-&gt;key);</div><div class='del'>-			goto out;</div><div class='del'>-		}</div><div class='del'>-</div><div class='del'>-		if ((opt-&gt;min == 0) &amp;&amp; (opt-&gt;max == 0)) {</div><div class='del'>-			gf_log (name, GF_LOG_DEBUG,</div><div class='del'>-				"no range check required for "</div><div class='del'>-				"'option %s %s'",</div><div class='del'>-				pair-&gt;key, pair-&gt;value-&gt;data);</div><div class='del'>-			ret = 0;</div><div class='del'>-			break;</div><div class='del'>-		}</div><div class='del'>-		if ((inputll &lt; opt-&gt;min) ||</div><div class='del'>-		    (inputll &gt; opt-&gt;max)) {</div><div class='del'>-			gf_log (name, GF_LOG_WARNING,</div><div class='del'>-				"'%lld' in 'option %s %s' is out of "</div><div class='del'>-				"range [%"PRId64" - %"PRId64"]",</div><div class='del'>-				inputll, pair-&gt;key,</div><div class='del'>-				pair-&gt;value-&gt;data,</div><div class='del'>-				opt-&gt;min, opt-&gt;max);</div><div class='del'>-		}</div><div class='del'>-		ret = 0;</div><div class='del'>-	}</div><div class='del'>-	break;</div><div class='del'>-	case GF_OPTION_TYPE_SIZET:</div><div class='del'>-	{</div><div class='del'>-		/* Check the range */</div><div class='del'>-		if (gf_string2bytesize (pair-&gt;value-&gt;data,</div><div class='del'>-					&amp;input_size) != 0) {</div><div class='del'>-			gf_log (name, GF_LOG_ERROR,</div><div class='del'>-				"invalid size format \"%s\" in "</div><div class='del'>-				"\"option %s\"",</div><div class='del'>-				pair-&gt;value-&gt;data, pair-&gt;key);</div><div class='del'>-			goto out;</div><div class='del'>-		}</div><div class='del'>-</div><div class='del'>-		if ((opt-&gt;min == 0) &amp;&amp; (opt-&gt;max == 0)) {</div><div class='del'>-			gf_log (name, GF_LOG_DEBUG,</div><div class='del'>-				"no range check required for "</div><div class='del'>-				"'option %s %s'",</div><div class='del'>-				pair-&gt;key, pair-&gt;value-&gt;data);</div><div class='del'>-			ret = 0;</div><div class='del'>-			break;</div><div class='del'>-		}</div><div class='del'>-		if ((input_size &lt; opt-&gt;min) ||</div><div class='del'>-		    (input_size &gt; opt-&gt;max)) {</div><div class='del'>-			gf_log (name, GF_LOG_ERROR,</div><div class='del'>-				"'%"PRId64"' in 'option %s %s' is "</div><div class='del'>-				"out of range [%"PRId64" - %"PRId64"]",</div><div class='del'>-				input_size, pair-&gt;key,</div><div class='del'>-				pair-&gt;value-&gt;data,</div><div class='del'>-				opt-&gt;min, opt-&gt;max);</div><div class='del'>-		}</div><div class='del'>-		ret = 0;</div><div class='del'>-	}</div><div class='del'>-	break;</div><div class='del'>-	case GF_OPTION_TYPE_BOOL:</div><div class='del'>-	{</div><div class='del'>-		/* Check if the value is one of</div><div class='del'>-		   '0|1|on|off|no|yes|true|false|enable|disable' */</div><div class='del'>-		gf_boolean_t bool_value;</div><div class='del'>-		if (gf_string2boolean (pair-&gt;value-&gt;data,</div><div class='del'>-				       &amp;bool_value) != 0) {</div><div class='del'>-			gf_log (name, GF_LOG_ERROR,</div><div class='del'>-				"option %s %s: '%s' is not a valid "</div><div class='del'>-				"boolean value",</div><div class='del'>-				pair-&gt;key, pair-&gt;value-&gt;data,</div><div class='del'>-				pair-&gt;value-&gt;data);</div><div class='del'>-			goto out;</div><div class='del'>-		}</div><div class='del'>-		ret = 0;</div><div class='del'>-	}</div><div class='del'>-	break;</div><div class='del'>-	case GF_OPTION_TYPE_STR:</div><div class='del'>-	{</div><div class='del'>-		/* Check if the '*str' is valid */</div><div class='del'>-                if (GF_OPTION_LIST_EMPTY(opt)) {</div><div class='del'>-                        ret = 0;</div><div class='del'>-                        goto out;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-		for (i = 0; (i &lt; ZR_OPTION_MAX_ARRAY_SIZE) &amp;&amp;</div><div class='del'>-			     opt-&gt;value[i]; i++) {</div><div class='del'>-			if (strcasecmp (opt-&gt;value[i],</div><div class='del'>-					pair-&gt;value-&gt;data) == 0) {</div><div class='del'>-				ret = 0;</div><div class='del'>-				break;</div><div class='del'>-			}</div><div class='del'>-		}</div><div class='del'>-</div><div class='del'>-		if ((i == ZR_OPTION_MAX_ARRAY_SIZE)</div><div class='del'>-		    || ((i &lt; ZR_OPTION_MAX_ARRAY_SIZE)</div><div class='del'>-			&amp;&amp; (!opt-&gt;value[i]))) {</div><div class='del'>-			/* enter here only if</div><div class='del'>-			 * 1. reached end of opt-&gt;value array and haven't</div><div class='del'>-                         *    validated input</div><div class='del'>-			 *                      OR</div><div class='del'>-			 * 2. valid input list is less than</div><div class='del'>-                         *    ZR_OPTION_MAX_ARRAY_SIZE and input has not</div><div class='del'>-                         *    matched all possible input values.</div><div class='del'>-			 */</div><div class='del'>-			char given_array[4096] = {0,};</div><div class='del'>-			for (i = 0; (i &lt; ZR_OPTION_MAX_ARRAY_SIZE) &amp;&amp;</div><div class='del'>-				     opt-&gt;value[i]; i++) {</div><div class='del'>-				strcat (given_array, opt-&gt;value[i]);</div><div class='del'>-				strcat (given_array, ", ");</div><div class='del'>-			}</div><div class='del'>-</div><div class='del'>-			gf_log (name, GF_LOG_ERROR,</div><div class='del'>-				"option %s %s: '%s' is not valid "</div><div class='del'>-				"(possible options are %s)",</div><div class='del'>-				pair-&gt;key, pair-&gt;value-&gt;data,</div><div class='del'>-				pair-&gt;value-&gt;data, given_array);</div><div class='del'>-</div><div class='del'>-			goto out;</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='del'>-	break;</div><div class='del'>-	case GF_OPTION_TYPE_PERCENT:</div><div class='del'>-	{</div><div class='del'>-		uint32_t percent = 0;</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-		/* Check if the value is valid percentage */</div><div class='del'>-		if (gf_string2percent (pair-&gt;value-&gt;data,</div><div class='del'>-				       &amp;percent) != 0) {</div><div class='del'>-			gf_log (name, GF_LOG_ERROR,</div><div class='del'>-				"invalid percent format \"%s\" "</div><div class='del'>-				"in \"option %s\"",</div><div class='del'>-				pair-&gt;value-&gt;data, pair-&gt;key);</div><div class='del'>-			goto out;</div><div class='del'>-		}</div><div class='del'>-</div><div class='del'>-		if ((percent &lt; 0) || (percent &gt; 100)) {</div><div class='del'>-			gf_log (name, GF_LOG_ERROR,</div><div class='del'>-				"'%d' in 'option %s %s' is out of "</div><div class='del'>-				"range [0 - 100]",</div><div class='del'>-				percent, pair-&gt;key,</div><div class='del'>-				pair-&gt;value-&gt;data);</div><div class='del'>-		}</div><div class='del'>-		ret = 0;</div><div class='del'>-	}</div><div class='del'>-	break;</div><div class='del'>-	case GF_OPTION_TYPE_PERCENT_OR_SIZET:</div><div class='del'>-	{</div><div class='del'>-		uint32_t percent = 0;</div><div class='del'>-		uint64_t input_size = 0;</div><div class='del'>-</div><div class='del'>-		/* Check if the value is valid percentage */</div><div class='del'>-		if (gf_string2percent (pair-&gt;value-&gt;data,</div><div class='del'>-				       &amp;percent) == 0) {</div><div class='del'>-			if (percent &gt; 100) {</div><div class='del'>-				gf_log (name, GF_LOG_DEBUG,</div><div class='del'>-					"value given was greater than 100, "</div><div class='del'>-					"assuming this is actually a size");</div><div class='del'>-		        if (gf_string2bytesize (pair-&gt;value-&gt;data,</div><div class='del'>-				                &amp;input_size) == 0) {</div><div class='del'>-				        /* Check the range */</div><div class='del'>-				if ((opt-&gt;min == 0) &amp;&amp;</div><div class='del'>-                                            (opt-&gt;max == 0)) {</div><div class='del'>-				        gf_log (name, GF_LOG_DEBUG,</div><div class='del'>-				        "no range check "</div><div class='del'>-                                                        "required for "</div><div class='del'>-					"'option %s %s'",</div><div class='del'>-				pair-&gt;key,</div><div class='del'>-                                                        pair-&gt;value-&gt;data);</div><div class='del'>-						// It is a size</div><div class='del'>-			                        ret = 0;</div><div class='del'>-				                goto out;</div><div class='del'>-				}</div><div class='del'>-			if ((input_size &lt; opt-&gt;min) ||</div><div class='del'>-				            (input_size &gt; opt-&gt;max)) {</div><div class='del'>-				        gf_log (name, GF_LOG_ERROR,</div><div class='del'>-				        "'%"PRId64"' in "</div><div class='del'>-                                                        "'option %s %s' is out"</div><div class='del'>-					" of range [%"PRId64""</div><div class='del'>-                                                        "- %"PRId64"]",</div><div class='del'>-				input_size, pair-&gt;key,</div><div class='del'>-				pair-&gt;value-&gt;data,</div><div class='del'>-				                opt-&gt;min, opt-&gt;max);</div><div class='del'>-				}</div><div class='del'>-					// It is a size</div><div class='del'>-					ret = 0;</div><div class='del'>-					goto out;</div><div class='del'>-				} else {</div><div class='del'>-					// It's not a percent or size</div><div class='del'>-					gf_log (name, GF_LOG_ERROR,</div><div class='del'>-					"invalid number format \"%s\" "</div><div class='del'>-					"in \"option %s\"",</div><div class='del'>-					pair-&gt;value-&gt;data, pair-&gt;key);</div><div class='del'>-				}</div><div class='del'>-</div><div class='del'>-			}</div><div class='del'>-			// It is a percent</div><div class='del'>-			ret = 0;</div><div class='del'>-			goto out;</div><div class='del'>-		} else {</div><div class='del'>-		        if (gf_string2bytesize (pair-&gt;value-&gt;data,</div><div class='del'>-				        &amp;input_size) == 0) {</div><div class='del'>-			        /* Check the range */</div><div class='del'>-			if ((opt-&gt;min == 0) &amp;&amp; (opt-&gt;max == 0)) {</div><div class='del'>-			        gf_log (name, GF_LOG_DEBUG,</div><div class='del'>-				        "no range check required for "</div><div class='del'>-					"'option %s %s'",</div><div class='del'>-			pair-&gt;key, pair-&gt;value-&gt;data);</div><div class='del'>-					// It is a size</div><div class='del'>-		                        ret = 0;</div><div class='del'>-				        goto out;</div><div class='del'>-			}</div><div class='del'>-		        if ((input_size &lt; opt-&gt;min) ||</div><div class='del'>-			            (input_size &gt; opt-&gt;max)) {</div><div class='del'>-					gf_log (name, GF_LOG_ERROR,</div><div class='del'>-				        "'%"PRId64"' in 'option %s %s'"</div><div class='del'>-                                                " is out of range [%"PRId64" -"</div><div class='del'>-                                                " %"PRId64"]",</div><div class='del'>-			input_size, pair-&gt;key,</div><div class='del'>-			pair-&gt;value-&gt;data,</div><div class='del'>-			                opt-&gt;min, opt-&gt;max);</div><div class='del'>-				}</div><div class='del'>-			} else {</div><div class='del'>-				// It's not a percent or size</div><div class='del'>-				gf_log (name, GF_LOG_ERROR,</div><div class='del'>-					"invalid number format \"%s\" "</div><div class='del'>-					"in \"option %s\"",</div><div class='del'>-					pair-&gt;value-&gt;data, pair-&gt;key);</div><div class='del'>-			}</div><div class='del'>-			//It is a size</div><div class='del'>-                        ret = 0;</div><div class='del'>-		        goto out;</div><div class='del'>-		}</div><div class='del'>-</div><div class='del'>-	}</div><div class='del'>-	break;</div><div class='del'>-	case GF_OPTION_TYPE_TIME:</div><div class='del'>-	{</div><div class='del'>-		uint32_t input_time = 0;</div><div class='del'>-</div><div class='del'>-		/* Check if the value is valid percentage */</div><div class='del'>-		if (gf_string2time (pair-&gt;value-&gt;data,</div><div class='del'>-				    &amp;input_time) != 0) {</div><div class='del'>-			gf_log (name,</div><div class='del'>-				GF_LOG_ERROR,</div><div class='del'>-				"invalid time format \"%s\" in "</div><div class='del'>-				"\"option %s\"",</div><div class='del'>-				pair-&gt;value-&gt;data, pair-&gt;key);</div><div class='del'>-			goto out;</div><div class='del'>-		}</div><div class='del'>-</div><div class='del'>-		if ((opt-&gt;min == 0) &amp;&amp; (opt-&gt;max == 0)) {</div><div class='del'>-			gf_log (name, GF_LOG_DEBUG,</div><div class='del'>-				"no range check required for "</div><div class='del'>-				"'option %s %s'",</div><div class='del'>-				pair-&gt;key, pair-&gt;value-&gt;data);</div><div class='del'>-			ret = 0;</div><div class='del'>-			goto out;</div><div class='del'>-		}</div><div class='del'>-		if ((input_time &lt; opt-&gt;min) ||</div><div class='del'>-		    (input_time &gt; opt-&gt;max)) {</div><div class='del'>-			gf_log (name, GF_LOG_ERROR,</div><div class='del'>-				"'%"PRIu32"' in 'option %s %s' is "</div><div class='del'>-				"out of range [%"PRId64" - %"PRId64"]",</div><div class='del'>-				input_time, pair-&gt;key,</div><div class='del'>-				pair-&gt;value-&gt;data,</div><div class='del'>-				opt-&gt;min, opt-&gt;max);</div><div class='del'>-		}</div><div class='del'>-		ret = 0;</div><div class='del'>-	}</div><div class='del'>-	break;</div><div class='del'>-	case GF_OPTION_TYPE_DOUBLE:</div><div class='del'>-	{</div><div class='del'>-		double input_time = 0.0;</div><div class='del'>-</div><div class='del'>-		/* Check if the value is valid double */</div><div class='del'>-		if (gf_string2double (pair-&gt;value-&gt;data,</div><div class='del'>-				      &amp;input_time) != 0) {</div><div class='del'>-			gf_log (name,</div><div class='del'>-				GF_LOG_ERROR,</div><div class='del'>-				"invalid time format \"%s\" in \"option %s\"",</div><div class='del'>-				pair-&gt;value-&gt;data, pair-&gt;key);</div><div class='del'>-			goto out;</div><div class='del'>-		}</div><div class='del'>-</div><div class='del'>-		if (input_time &lt; 0.0) {</div><div class='del'>-			gf_log (name,</div><div class='del'>-				GF_LOG_ERROR,</div><div class='del'>-				"invalid time format \"%s\" in \"option %s\"",</div><div class='del'>-				pair-&gt;value-&gt;data, pair-&gt;key);</div><div class='del'>-			goto out;</div><div class='del'>-		}</div><div class='del'>-</div><div class='del'>-		if ((opt-&gt;min == 0) &amp;&amp; (opt-&gt;max == 0)) {</div><div class='del'>-			gf_log (name, GF_LOG_DEBUG,</div><div class='del'>-				"no range check required for 'option %s %s'",</div><div class='del'>-				pair-&gt;key, pair-&gt;value-&gt;data);</div><div class='del'>-			ret = 0;</div><div class='del'>-			goto out;</div><div class='del'>-		}</div><div class='del'>-		ret = 0;</div><div class='del'>-	}</div><div class='del'>-	break;</div><div class='del'>-        case GF_OPTION_TYPE_INTERNET_ADDRESS:</div><div class='del'>-        {</div><div class='del'>-                if (valid_internet_address (pair-&gt;value-&gt;data)) {</div><div class='del'>-                        ret = 0;</div><div class='del'>-                }</div><div class='del'>-	}</div><div class='del'>-        break;</div><div class='del'>-	case GF_OPTION_TYPE_ANY:</div><div class='del'>-		/* NO CHECK */</div><div class='del'>-		ret = 0;</div><div class='del'>-		break;</div><div class='del'>-	}</div><div class='add'>+    int32_t ret = -1;</div><div class='add'>+    GF_VALIDATE_OR_GOTO("rpc", this, out);</div><div class='ctx'> </div><div class='add'>+    ret = this-&gt;ops-&gt;get_peeraddr(this, peeraddr, addrlen, sa, salen);</div><div class='ctx'> out:</div><div class='del'>-	return ret;</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-/* FIXME: this procedure should be removed from transport */</div><div class='del'>-int</div><div class='del'>-validate_volume_options (char *name, dict_t *options, volume_option_t *opt)</div><div class='add'>+void</div><div class='add'>+rpc_transport_pollin_destroy(rpc_transport_pollin_t *pollin)</div><div class='ctx'> {</div><div class='del'>-	int i = 0;</div><div class='del'>-	int ret = -1;</div><div class='del'>-	int index = 0;</div><div class='del'>-	volume_option_t *trav  = NULL;</div><div class='del'>-	data_pair_t     *pairs = NULL;</div><div class='del'>-</div><div class='del'>-	if (!opt) {</div><div class='del'>-		ret = 0;</div><div class='del'>-		goto out;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	/* First search for not supported options, if any report error */</div><div class='del'>-	pairs = options-&gt;members_list;</div><div class='del'>-	while (pairs) {</div><div class='del'>-		ret = -1;</div><div class='del'>-		for (index = 0;</div><div class='del'>-		     opt[index].key &amp;&amp; opt[index].key[0] ; index++) {</div><div class='del'>-			trav = &amp;(opt[index]);</div><div class='del'>-			for (i = 0 ;</div><div class='del'>-			     (i &lt; ZR_VOLUME_MAX_NUM_KEY) &amp;&amp;</div><div class='del'>-				     trav-&gt;key[i]; i++) {</div><div class='del'>-				/* Check if the key is valid */</div><div class='del'>-				if (fnmatch (trav-&gt;key[i],</div><div class='del'>-					     pairs-&gt;key, FNM_NOESCAPE) == 0) {</div><div class='del'>-					ret = 0;</div><div class='del'>-					break;</div><div class='del'>-				}</div><div class='del'>-			}</div><div class='del'>-			if (!ret) {</div><div class='del'>-				if (i) {</div><div class='del'>-					gf_log (name, GF_LOG_WARNING,</div><div class='del'>-						"option '%s' is deprecated, "</div><div class='del'>-						"preferred is '%s', continuing"</div><div class='del'>-						" with correction",</div><div class='del'>-						trav-&gt;key[i], trav-&gt;key[0]);</div><div class='del'>-					/* TODO: some bytes lost */</div><div class='del'>-					pairs-&gt;key = gf_strdup (trav-&gt;key[0]);</div><div class='del'>-				}</div><div class='del'>-				break;</div><div class='del'>-			}</div><div class='del'>-		}</div><div class='del'>-		if (!ret) {</div><div class='del'>-			ret = __volume_option_value_validate (name, pairs, trav);</div><div class='del'>-			if (-1 == ret) {</div><div class='del'>-				goto out;</div><div class='del'>-			}</div><div class='del'>-		}</div><div class='del'>-</div><div class='del'>-		pairs = pairs-&gt;next;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	ret = 0;</div><div class='del'>- out:</div><div class='del'>-	return ret;</div><div class='del'>-}</div><div class='add'>+    GF_VALIDATE_OR_GOTO("rpc", pollin, out);</div><div class='ctx'> </div><div class='del'>-int32_t</div><div class='del'>-rpc_transport_get_myaddr (rpc_transport_t *this, char *peeraddr, int addrlen,</div><div class='del'>-                          struct sockaddr_storage *sa, size_t salen)</div><div class='del'>-{</div><div class='del'>-        if (!this)</div><div class='del'>-                return -1;</div><div class='add'>+    if (pollin-&gt;iobref) {</div><div class='add'>+        iobref_unref(pollin-&gt;iobref);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (pollin-&gt;private) {</div><div class='add'>+        /* */</div><div class='add'>+        GF_FREE(pollin-&gt;private);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        return this-&gt;ops-&gt;get_myaddr (this, peeraddr, addrlen, sa, salen);</div><div class='add'>+    GF_FREE(pollin);</div><div class='add'>+out:</div><div class='add'>+    return;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-int32_t</div><div class='del'>-rpc_transport_get_myname (rpc_transport_t *this, char *hostname, int hostlen)</div><div class='add'>+rpc_transport_pollin_t *</div><div class='add'>+rpc_transport_pollin_alloc(rpc_transport_t *this, struct iovec *vector,</div><div class='add'>+                           int count, struct iobuf *hdr_iobuf,</div><div class='add'>+                           struct iobref *iobref, void *private)</div><div class='ctx'> {</div><div class='del'>-        if (!this)</div><div class='del'>-                return -1;</div><div class='add'>+    rpc_transport_pollin_t *msg = NULL;</div><div class='add'>+    msg = GF_CALLOC(1, sizeof(*msg), gf_common_mt_rpc_trans_pollin_t);</div><div class='add'>+    if (!msg) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        return this-&gt;ops-&gt;get_myname (this, hostname, hostlen);</div><div class='del'>-}</div><div class='add'>+    msg-&gt;trans = this;</div><div class='ctx'> </div><div class='del'>-int32_t</div><div class='del'>-rpc_transport_get_peername (rpc_transport_t *this, char *hostname, int hostlen)</div><div class='del'>-{</div><div class='del'>-        if (!this)</div><div class='del'>-                return -1;</div><div class='del'>-        return this-&gt;ops-&gt;get_peername (this, hostname, hostlen);</div><div class='del'>-}</div><div class='add'>+    if (count &gt; 1) {</div><div class='add'>+        msg-&gt;vectored = 1;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-int32_t</div><div class='del'>-rpc_transport_get_peeraddr (rpc_transport_t *this, char *peeraddr, int addrlen,</div><div class='del'>-                            struct sockaddr_storage *sa, size_t salen)</div><div class='del'>-{</div><div class='del'>-        if (!this)</div><div class='del'>-                return -1;</div><div class='del'>-        return this-&gt;ops-&gt;get_peeraddr (this, peeraddr, addrlen, sa, salen);</div><div class='add'>+    memcpy(msg-&gt;vector, vector, count * sizeof(*vector));</div><div class='add'>+    msg-&gt;count = count;</div><div class='add'>+    msg-&gt;iobref = iobref_ref(iobref);</div><div class='add'>+    msg-&gt;private = private;</div><div class='add'>+    if (hdr_iobuf)</div><div class='add'>+        iobref_add(iobref, hdr_iobuf);</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return msg;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> void</div><div class='del'>-rpc_transport_pollin_destroy (rpc_transport_pollin_t *pollin)</div><div class='add'>+rpc_transport_cleanup(rpc_transport_t *trans)</div><div class='ctx'> {</div><div class='del'>-        if (!pollin) {</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (pollin-&gt;iobref) {</div><div class='del'>-                iobref_unref (pollin-&gt;iobref);</div><div class='del'>-        }</div><div class='del'>- </div><div class='del'>-        if (pollin-&gt;private) {</div><div class='del'>-                /* */</div><div class='del'>-                GF_FREE (pollin-&gt;private);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        GF_FREE (pollin);</div><div class='del'>-out:</div><div class='add'>+    if (!trans)</div><div class='ctx'>         return;</div><div class='del'>-}</div><div class='ctx'> </div><div class='add'>+    if (trans-&gt;fini)</div><div class='add'>+        trans-&gt;fini(trans);</div><div class='ctx'> </div><div class='del'>-rpc_transport_pollin_t *</div><div class='del'>-rpc_transport_pollin_alloc (rpc_transport_t *this, struct iovec *vector,</div><div class='del'>-                            int count, struct iobref *iobref, void *private)</div><div class='del'>-{</div><div class='del'>-        rpc_transport_pollin_t *msg = NULL;</div><div class='del'>-        msg = GF_CALLOC (1, sizeof (*msg), gf_common_mt_rpc_trans_pollin_t);</div><div class='del'>-        if (!msg) {</div><div class='del'>-                gf_log ("rpc-transport", GF_LOG_ERROR, "out of memory");</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='add'>+    if (trans-&gt;options) {</div><div class='add'>+        dict_unref(trans-&gt;options);</div><div class='add'>+        trans-&gt;options = NULL;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        if (count == 2) {</div><div class='del'>-                msg-&gt;vectored = 1;</div><div class='del'>-        }</div><div class='add'>+    GF_FREE(trans-&gt;name);</div><div class='ctx'> </div><div class='del'>-        memcpy (msg-&gt;vector, vector, count * sizeof (*vector));</div><div class='del'>-        msg-&gt;count = count;</div><div class='del'>-        msg-&gt;iobref = iobref_ref (iobref);</div><div class='del'>-        msg-&gt;private = private;</div><div class='add'>+    if (trans-&gt;xl)</div><div class='add'>+        pthread_mutex_destroy(&amp;trans-&gt;lock);</div><div class='ctx'> </div><div class='del'>-out:</div><div class='del'>-        return msg;</div><div class='del'>-}</div><div class='add'>+    if (trans-&gt;dl_handle)</div><div class='add'>+        dlclose(trans-&gt;dl_handle);</div><div class='ctx'> </div><div class='add'>+    GF_FREE(trans);</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-rpc_transport_pollin_t *</div><div class='del'>-rpc_transport_same_process_pollin_alloc (rpc_transport_t *this,</div><div class='del'>-                                         struct iovec *rpchdr, int rpchdrcount,</div><div class='del'>-                                         struct iovec *proghdr,</div><div class='del'>-                                         int proghdrcount,</div><div class='del'>-                                         struct iovec *progpayload,</div><div class='del'>-                                         int progpayloadcount,</div><div class='del'>-                                         rpc_transport_rsp_t *rsp,</div><div class='del'>-                                         char is_request)</div><div class='add'>+rpc_transport_t *</div><div class='add'>+rpc_transport_load(glusterfs_ctx_t *ctx, dict_t *options, char *trans_name)</div><div class='ctx'> {</div><div class='del'>-        rpc_transport_pollin_t *msg            = NULL;</div><div class='del'>-        int                     rpchdrlen      = 0, proghdrlen = 0;</div><div class='del'>-        int                     progpayloadlen = 0;</div><div class='del'>-        char                    vectored       = 0;</div><div class='del'>-        char                   *hdr            = NULL, *progpayloadbuf = NULL;</div><div class='del'>-        struct iobuf           *iobuf          = NULL;</div><div class='del'>-</div><div class='del'>-        if (!rpchdr || !proghdr) {</div><div class='del'>-                goto err;</div><div class='add'>+    struct rpc_transport *trans = NULL, *return_trans = NULL;</div><div class='add'>+    char *name = NULL;</div><div class='add'>+    void *handle = NULL;</div><div class='add'>+    char *type = NULL;</div><div class='add'>+    static char str[] = "ERROR";</div><div class='add'>+    int32_t ret = -1;</div><div class='add'>+    int is_tcp = 0, is_unix = 0, is_ibsdp = 0;</div><div class='add'>+    volume_opt_list_t *vol_opt = NULL;</div><div class='add'>+    gf_boolean_t bind_insecure = _gf_false;</div><div class='add'>+    xlator_t *this = NULL;</div><div class='add'>+    gf_boolean_t success = _gf_false;</div><div class='add'>+</div><div class='add'>+    GF_VALIDATE_OR_GOTO("rpc-transport", options, fail);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("rpc-transport", ctx, fail);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("rpc-transport", trans_name, fail);</div><div class='add'>+</div><div class='add'>+    trans = GF_CALLOC(1, sizeof(struct rpc_transport),</div><div class='add'>+                      gf_common_mt_rpc_trans_t);</div><div class='add'>+    if (!trans)</div><div class='add'>+        goto fail;</div><div class='add'>+</div><div class='add'>+    trans-&gt;name = gf_strdup(trans_name);</div><div class='add'>+    if (!trans-&gt;name)</div><div class='add'>+        goto fail;</div><div class='add'>+</div><div class='add'>+    trans-&gt;ctx = ctx;</div><div class='add'>+    type = str;</div><div class='add'>+</div><div class='add'>+    /* Backward compatibility */</div><div class='add'>+    ret = dict_get_str_sizen(options, "transport-type", &amp;type);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        ret = dict_set_str_sizen(options, "transport-type", "socket");</div><div class='add'>+        if (ret &lt; 0)</div><div class='add'>+            gf_log("dict", GF_LOG_DEBUG, "setting transport-type failed");</div><div class='add'>+        else</div><div class='add'>+            gf_log("rpc-transport", GF_LOG_DEBUG,</div><div class='add'>+                   "missing 'option transport-type'. defaulting to "</div><div class='add'>+                   "\"socket\"");</div><div class='add'>+    } else {</div><div class='add'>+        {</div><div class='add'>+            /* Backward compatibility to handle * /client,</div><div class='add'>+             * * /server.</div><div class='add'>+             */</div><div class='add'>+            char *tmp = strchr(type, '/');</div><div class='add'>+            if (tmp)</div><div class='add'>+                *tmp = '\0';</div><div class='ctx'>         }</div><div class='ctx'> </div><div class='del'>-        msg = GF_CALLOC (1, sizeof (*msg), gf_common_mt_rpc_trans_pollin_t);</div><div class='del'>-        if (!msg) {</div><div class='del'>-                gf_log ("rpc-transport", GF_LOG_ERROR, "out of memory");</div><div class='del'>-                goto err;</div><div class='add'>+        is_tcp = strcmp(type, "tcp");</div><div class='add'>+        is_unix = strcmp(type, "unix");</div><div class='add'>+        is_ibsdp = strcmp(type, "ib-sdp");</div><div class='add'>+        if ((is_tcp == 0) || (is_unix == 0) || (is_ibsdp == 0)) {</div><div class='add'>+            if (is_unix == 0)</div><div class='add'>+                ret = dict_set_str_sizen(options, "transport.address-family",</div><div class='add'>+                                         "unix");</div><div class='add'>+            if (is_ibsdp == 0)</div><div class='add'>+                ret = dict_set_str_sizen(options, "transport.address-family",</div><div class='add'>+                                         "inet-sdp");</div><div class='add'>+</div><div class='add'>+            if (ret &lt; 0)</div><div class='add'>+                gf_log("dict", GF_LOG_DEBUG, "setting address-family failed");</div><div class='add'>+</div><div class='add'>+            ret = dict_set_str_sizen(options, "transport-type", "socket");</div><div class='add'>+            if (ret &lt; 0)</div><div class='add'>+                gf_log("dict", GF_LOG_DEBUG, "setting transport-type failed");</div><div class='ctx'>         }</div><div class='del'>-</div><div class='del'>-        rpchdrlen = iov_length (rpchdr, rpchdrcount);</div><div class='del'>-        proghdrlen = iov_length (proghdr, proghdrcount);</div><div class='del'>-</div><div class='del'>-        if (progpayload) {</div><div class='del'>-                vectored = 1;</div><div class='del'>-                progpayloadlen = iov_length (progpayload, progpayloadcount);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* client-bind-insecure is for clients protocol, and</div><div class='add'>+     * bind-insecure for glusterd. Both mutually exclusive</div><div class='add'>+     */</div><div class='add'>+    ret = dict_get_str_sizen(options, "client-bind-insecure", &amp;type);</div><div class='add'>+    if (ret)</div><div class='add'>+        ret = dict_get_str_sizen(options, "bind-insecure", &amp;type);</div><div class='add'>+    if (ret == 0) {</div><div class='add'>+        ret = gf_string2boolean(type, &amp;bind_insecure);</div><div class='add'>+        if (ret &lt; 0) {</div><div class='add'>+            gf_log("rcp-transport", GF_LOG_WARNING,</div><div class='add'>+                   "bind-insecure option %s is not a"</div><div class='add'>+                   " valid bool option",</div><div class='add'>+                   type);</div><div class='add'>+            goto fail;</div><div class='ctx'>         }</div><div class='del'>-</div><div class='del'>-        /* FIXME: we are assuming rpchdr and proghdr will fit into</div><div class='del'>-         * an iobuf (128KB)</div><div class='del'>-         */</div><div class='del'>-        if ((rpchdrlen + proghdrlen) &gt; this-&gt;ctx-&gt;page_size) {</div><div class='del'>-                gf_log ("rpc_transport", GF_LOG_DEBUG, "program hdr and rpc"</div><div class='del'>-                        " hdr together combined (%d) is bigger than "</div><div class='del'>-                        "iobuf size (%zu)", (rpchdrlen + proghdrlen),</div><div class='del'>-                        this-&gt;ctx-&gt;page_size);</div><div class='del'>-                goto err;</div><div class='add'>+        if (_gf_true == bind_insecure)</div><div class='add'>+            trans-&gt;bind_insecure = 1;</div><div class='add'>+        else</div><div class='add'>+            trans-&gt;bind_insecure = 0;</div><div class='add'>+    } else {</div><div class='add'>+        /* By default allow bind insecure */</div><div class='add'>+        trans-&gt;bind_insecure = 1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_get_str_sizen(options, "transport-type", &amp;type);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        gf_log("rpc-transport", GF_LOG_ERROR,</div><div class='add'>+               "'option transport-type &lt;xx&gt;' missing in volume '%s'",</div><div class='add'>+               trans_name);</div><div class='add'>+        goto fail;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = gf_asprintf(&amp;name, "%s/%s.so", RPC_TRANSPORTDIR, type);</div><div class='add'>+    if (-1 == ret) {</div><div class='add'>+        goto fail;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (dict_get_sizen(options, "notify-poller-death")) {</div><div class='add'>+        trans-&gt;notify_poller_death = 1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    gf_log("rpc-transport", GF_LOG_DEBUG, "attempt to load file %s", name);</div><div class='add'>+</div><div class='add'>+    handle = dlopen(name, RTLD_NOW);</div><div class='add'>+    if (handle == NULL) {</div><div class='add'>+        gf_log("rpc-transport", GF_LOG_ERROR, "%s", dlerror());</div><div class='add'>+        gf_log("rpc-transport", GF_LOG_WARNING,</div><div class='add'>+               "volume '%s': transport-type '%s' is not valid or "</div><div class='add'>+               "not found on this machine",</div><div class='add'>+               trans_name, type);</div><div class='add'>+        goto fail;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    trans-&gt;dl_handle = handle;</div><div class='add'>+</div><div class='add'>+    trans-&gt;ops = dlsym(handle, "tops");</div><div class='add'>+    if (trans-&gt;ops == NULL) {</div><div class='add'>+        gf_log("rpc-transport", GF_LOG_ERROR, "dlsym (rpc_transport_ops) on %s",</div><div class='add'>+               dlerror());</div><div class='add'>+        goto fail;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    *VOID(&amp;(trans-&gt;init)) = dlsym(handle, "init");</div><div class='add'>+    if (trans-&gt;init == NULL) {</div><div class='add'>+        gf_log("rpc-transport", GF_LOG_ERROR,</div><div class='add'>+               "dlsym (gf_rpc_transport_init) on %s", dlerror());</div><div class='add'>+        goto fail;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    *VOID(&amp;(trans-&gt;fini)) = dlsym(handle, "fini");</div><div class='add'>+    if (trans-&gt;fini == NULL) {</div><div class='add'>+        gf_log("rpc-transport", GF_LOG_ERROR,</div><div class='add'>+               "dlsym (gf_rpc_transport_fini) on %s", dlerror());</div><div class='add'>+        goto fail;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    *VOID(&amp;(trans-&gt;reconfigure)) = dlsym(handle, "reconfigure");</div><div class='add'>+    if (trans-&gt;reconfigure == NULL) {</div><div class='add'>+        gf_log("rpc-transport", GF_LOG_DEBUG,</div><div class='add'>+               "dlsym (gf_rpc_transport_reconfigure) on %s", dlerror());</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    vol_opt = GF_CALLOC(1, sizeof(volume_opt_list_t),</div><div class='add'>+                        gf_common_mt_volume_opt_list_t);</div><div class='add'>+    if (!vol_opt) {</div><div class='add'>+        goto fail;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    this = THIS;</div><div class='add'>+    vol_opt-&gt;given_opt = dlsym(handle, "options");</div><div class='add'>+    if (vol_opt-&gt;given_opt == NULL) {</div><div class='add'>+        gf_log("rpc-transport", GF_LOG_DEBUG,</div><div class='add'>+               "volume option validation not specified");</div><div class='add'>+    } else {</div><div class='add'>+        INIT_LIST_HEAD(&amp;vol_opt-&gt;list);</div><div class='add'>+        list_add_tail(&amp;vol_opt-&gt;list, &amp;(this-&gt;volume_options));</div><div class='add'>+        if (xlator_options_validate_list(this, options, vol_opt, NULL)) {</div><div class='add'>+            gf_log("rpc-transport", GF_LOG_ERROR,</div><div class='add'>+                   "volume option validation failed");</div><div class='add'>+            goto fail;</div><div class='ctx'>         }</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        if (vectored) {</div><div class='del'>-                msg-&gt;iobref = iobref_new ();</div><div class='del'>-                if (!msg-&gt;iobref) {</div><div class='del'>-                        gf_log ("rpc-transport", GF_LOG_ERROR,</div><div class='del'>-                                "out of memory");</div><div class='del'>-                        goto err;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                iobuf = iobuf_get (this-&gt;ctx-&gt;iobuf_pool);</div><div class='del'>-                if (!iobuf) {</div><div class='del'>-                        gf_log ("rpc_transport", GF_LOG_ERROR,</div><div class='del'>-                                "out of memory");</div><div class='del'>-                        goto err;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                iobref_add (msg-&gt;iobref, iobuf);</div><div class='del'>-                iobuf_unref (iobuf);</div><div class='del'>-</div><div class='del'>-                msg-&gt;vector[0].iov_len = rpchdrlen + proghdrlen;</div><div class='del'>-                msg-&gt;vector[0].iov_base = hdr = iobuf_ptr (iobuf);</div><div class='del'>-</div><div class='del'>-                if (!is_request &amp;&amp; rsp) {</div><div class='del'>-                        msg-&gt;vector[1] = rsp-&gt;rsp_payload[0];</div><div class='del'>-                        progpayloadbuf = rsp-&gt;rsp_payload[0].iov_base;</div><div class='del'>-                } else {</div><div class='del'>-                        iobuf = iobuf_get (this-&gt;ctx-&gt;iobuf_pool);</div><div class='del'>-                        if (!iobuf) {</div><div class='del'>-                                gf_log ("rpc_transport", GF_LOG_ERROR,</div><div class='del'>-                                        "out of memory");</div><div class='del'>-                                goto err;</div><div class='del'>-                        }</div><div class='del'>-</div><div class='del'>-                        iobref_add (msg-&gt;iobref, iobuf);</div><div class='del'>-                        iobuf_unref (iobuf);</div><div class='del'>- </div><div class='del'>-                        msg-&gt;vector[1].iov_base</div><div class='del'>-                                = progpayloadbuf = iobuf_ptr (iobuf);</div><div class='del'>-                }</div><div class='del'>-                msg-&gt;vector[1].iov_len = progpayloadlen;</div><div class='del'>-        } else {</div><div class='del'>-                if (!is_request &amp;&amp; rsp) {</div><div class='del'>-                        /* FIXME: Assuming rspvec contains only one vector */</div><div class='del'>-                        hdr = rsp-&gt;rsphdr[0].iov_base;</div><div class='del'>-                        msg-&gt;vector[0] = rsp-&gt;rsphdr[0];</div><div class='del'>-                } else {</div><div class='del'>-                        msg-&gt;iobref = iobref_new ();</div><div class='del'>-                        if (!msg-&gt;iobref) {</div><div class='del'>-                                gf_log ("rpc-transport", GF_LOG_ERROR,</div><div class='del'>-                                        "out of memory");</div><div class='del'>-                                goto err;</div><div class='del'>-                        }</div><div class='del'>-</div><div class='del'>-                        iobuf = iobuf_get (this-&gt;ctx-&gt;iobuf_pool);</div><div class='del'>-                        if (!iobuf) {</div><div class='del'>-                                gf_log ("rpc_transport", GF_LOG_ERROR,</div><div class='del'>-                                        "out of memory");</div><div class='del'>-                                goto err;</div><div class='del'>-                        }</div><div class='del'>-</div><div class='del'>-                        iobref_add (msg-&gt;iobref, iobuf);</div><div class='del'>-                        iobuf_unref (iobuf);</div><div class='del'>-</div><div class='del'>-                        hdr = iobuf_ptr (iobuf);</div><div class='del'>-                        msg-&gt;vector[0].iov_base = hdr;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                msg-&gt;vector[0].iov_len = rpchdrlen + proghdrlen;</div><div class='del'>-        }</div><div class='add'>+    trans-&gt;options = dict_ref(options);</div><div class='ctx'> </div><div class='del'>-        iov_unload (hdr, rpchdr, rpchdrcount);</div><div class='del'>-        hdr += rpchdrlen;</div><div class='del'>-        iov_unload (hdr, proghdr, proghdrcount);</div><div class='add'>+    pthread_mutex_init(&amp;trans-&gt;lock, NULL);</div><div class='add'>+    trans-&gt;xl = this;</div><div class='ctx'> </div><div class='del'>-        if (progpayload) {</div><div class='del'>-                iov_unload (progpayloadbuf, progpayload,</div><div class='del'>-                            progpayloadcount);</div><div class='del'>-        }</div><div class='add'>+    ret = trans-&gt;init(trans);</div><div class='add'>+    if (ret != 0) {</div><div class='add'>+        gf_log("rpc-transport", GF_LOG_WARNING, "'%s' initialization failed",</div><div class='add'>+               type);</div><div class='add'>+        goto fail;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        if (is_request) {</div><div class='del'>-                msg-&gt;private = rsp;</div><div class='del'>-        }</div><div class='del'>-        return msg;</div><div class='del'>-err:</div><div class='del'>-        if (msg) {</div><div class='del'>-                rpc_transport_pollin_destroy (msg);</div><div class='del'>-        }</div><div class='add'>+    INIT_LIST_HEAD(&amp;trans-&gt;list);</div><div class='add'>+    GF_ATOMIC_INIT(trans-&gt;disconnect_progress, 0);</div><div class='ctx'> </div><div class='del'>-        return NULL;</div><div class='del'>-}</div><div class='add'>+    return_trans = trans;</div><div class='ctx'> </div><div class='del'>-rpc_transport_t *</div><div class='del'>-rpc_transport_load (glusterfs_ctx_t *ctx, dict_t *options, char *trans_name)</div><div class='del'>-{</div><div class='del'>-	struct rpc_transport *trans = NULL, *return_trans = NULL;</div><div class='del'>-	char *name = NULL;</div><div class='del'>-	void *handle = NULL;</div><div class='del'>-	char *type = NULL;</div><div class='del'>-	char str[] = "ERROR";</div><div class='del'>-	int32_t ret = -1;</div><div class='del'>-	int8_t is_tcp = 0, is_unix = 0, is_ibsdp = 0;</div><div class='del'>-	volume_opt_list_t *vol_opt = NULL;</div><div class='del'>-</div><div class='del'>-	GF_VALIDATE_OR_GOTO("rpc-transport", options, fail);</div><div class='del'>-	GF_VALIDATE_OR_GOTO("rpc-transport", ctx, fail);</div><div class='del'>-	GF_VALIDATE_OR_GOTO("rpc-transport", trans_name, fail);</div><div class='del'>-</div><div class='del'>-	trans = GF_CALLOC (1, sizeof (struct rpc_transport), gf_common_mt_rpc_trans_t);</div><div class='del'>-	GF_VALIDATE_OR_GOTO("rpc-transport", trans, fail);</div><div class='del'>-</div><div class='del'>-        trans-&gt;name = gf_strdup (trans_name);</div><div class='del'>-        GF_VALIDATE_OR_GOTO ("rpc-transport", trans-&gt;name, fail);</div><div class='del'>-</div><div class='del'>-	trans-&gt;ctx = ctx;</div><div class='del'>-	type = str;</div><div class='del'>-</div><div class='del'>-	/* Backward compatibility */</div><div class='del'>-	ret = dict_get_str (options, "transport-type", &amp;type);</div><div class='del'>-	if (ret &lt; 0) {</div><div class='del'>-		ret = dict_set_str (options, "transport-type", "socket");</div><div class='del'>-		if (ret &lt; 0)</div><div class='del'>-			gf_log ("dict", GF_LOG_DEBUG,</div><div class='del'>-				"setting transport-type failed");</div><div class='del'>-		gf_log ("rpc-transport", GF_LOG_WARNING,</div><div class='del'>-			"missing 'option transport-type'. defaulting to "</div><div class='del'>-			"\"socket\"");</div><div class='del'>-	} else {</div><div class='del'>-		{</div><div class='del'>-			/* Backword compatibility to handle * /client,</div><div class='del'>-			 * * /server.</div><div class='del'>-			 */</div><div class='del'>-			char *tmp = strchr (type, '/');</div><div class='del'>-			if (tmp)</div><div class='del'>-				*tmp = '\0';</div><div class='del'>-		}</div><div class='del'>-</div><div class='del'>-		is_tcp = strcmp (type, "tcp");</div><div class='del'>-		is_unix = strcmp (type, "unix");</div><div class='del'>-		is_ibsdp = strcmp (type, "ib-sdp");</div><div class='del'>-		if ((is_tcp == 0) ||</div><div class='del'>-		    (is_unix == 0) ||</div><div class='del'>-		    (is_ibsdp == 0)) {</div><div class='del'>-			if (is_unix == 0)</div><div class='del'>-				ret = dict_set_str (options,</div><div class='del'>-						    "transport.address-family",</div><div class='del'>-						    "unix");</div><div class='del'>-			if (is_ibsdp == 0)</div><div class='del'>-				ret = dict_set_str (options,</div><div class='del'>-						    "transport.address-family",</div><div class='del'>-						    "inet-sdp");</div><div class='del'>-</div><div class='del'>-			if (ret &lt; 0)</div><div class='del'>-				gf_log ("dict", GF_LOG_DEBUG,</div><div class='del'>-					"setting address-family failed");</div><div class='del'>-</div><div class='del'>-			ret = dict_set_str (options,</div><div class='del'>-					    "transport-type", "socket");</div><div class='del'>-			if (ret &lt; 0)</div><div class='del'>-				gf_log ("dict", GF_LOG_DEBUG,</div><div class='del'>-					"setting transport-type failed");</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	ret = dict_get_str (options, "transport-type", &amp;type);</div><div class='del'>-	if (ret &lt; 0) {</div><div class='del'>-		gf_log ("rpc-transport", GF_LOG_ERROR,</div><div class='del'>-			"'option transport-type &lt;xx&gt;' missing in volume '%s'",</div><div class='del'>-			trans_name);</div><div class='del'>-		goto fail;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	ret = gf_asprintf (&amp;name, "%s/%s.so", RPC_TRANSPORTDIR, type);</div><div class='del'>-        if (-1 == ret) {</div><div class='del'>-                gf_log ("rpc-transport", GF_LOG_ERROR, "asprintf failed");</div><div class='del'>-                goto fail;</div><div class='del'>-        }</div><div class='del'>-	gf_log ("rpc-transport", GF_LOG_DEBUG,</div><div class='del'>-		"attempt to load file %s", name);</div><div class='del'>-</div><div class='del'>-	handle = dlopen (name, RTLD_NOW|RTLD_GLOBAL);</div><div class='del'>-	if (handle == NULL) {</div><div class='del'>-		gf_log ("rpc-transport", GF_LOG_ERROR, "%s", dlerror ());</div><div class='del'>-		gf_log ("rpc-transport", GF_LOG_ERROR,</div><div class='del'>-			"volume '%s': transport-type '%s' is not valid or "</div><div class='del'>-			"not found on this machine",</div><div class='del'>-			trans_name, type);</div><div class='del'>-		goto fail;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	trans-&gt;ops = dlsym (handle, "tops");</div><div class='del'>-	if (trans-&gt;ops == NULL) {</div><div class='del'>-		gf_log ("rpc-transport", GF_LOG_ERROR,</div><div class='del'>-			"dlsym (rpc_transport_ops) on %s", dlerror ());</div><div class='del'>-		goto fail;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	trans-&gt;init = dlsym (handle, "init");</div><div class='del'>-	if (trans-&gt;init == NULL) {</div><div class='del'>-		gf_log ("rpc-transport", GF_LOG_ERROR,</div><div class='del'>-			"dlsym (gf_rpc_transport_init) on %s", dlerror ());</div><div class='del'>-		goto fail;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	trans-&gt;fini = dlsym (handle, "fini");</div><div class='del'>-	if (trans-&gt;fini == NULL) {</div><div class='del'>-		gf_log ("rpc-transport", GF_LOG_ERROR,</div><div class='del'>-			"dlsym (gf_rpc_transport_fini) on %s", dlerror ());</div><div class='del'>-		goto fail;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	vol_opt = GF_CALLOC (1, sizeof (volume_opt_list_t),</div><div class='del'>-                             gf_common_mt_volume_opt_list_t);</div><div class='del'>-        if (!vol_opt) {</div><div class='del'>-                gf_log (trans_name, GF_LOG_ERROR, "out of memory");</div><div class='del'>-                goto fail;</div><div class='del'>-        }</div><div class='add'>+    GF_FREE(name);</div><div class='ctx'> </div><div class='del'>-	vol_opt-&gt;given_opt = dlsym (handle, "options");</div><div class='del'>-	if (vol_opt-&gt;given_opt == NULL) {</div><div class='del'>-		gf_log ("rpc-transport", GF_LOG_DEBUG,</div><div class='del'>-			"volume option validation not specified");</div><div class='del'>-	} else {</div><div class='del'>-                /* FIXME: is adding really needed? */</div><div class='del'>-		/* list_add_tail (&amp;vol_opt-&gt;list, &amp;xl-&gt;volume_options); */</div><div class='del'>-		if (-1 ==</div><div class='del'>-		    validate_volume_options (trans_name, options,</div><div class='del'>-                                             vol_opt-&gt;given_opt)) {</div><div class='del'>-			gf_log ("rpc-transport", GF_LOG_ERROR,</div><div class='del'>-				"volume option validation failed");</div><div class='del'>-			goto fail;</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	ret = trans-&gt;init (trans);</div><div class='del'>-	if (ret != 0) {</div><div class='del'>-		gf_log ("rpc-transport", GF_LOG_ERROR,</div><div class='del'>-			"'%s' initialization failed", type);</div><div class='del'>-		goto fail;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-        trans-&gt;options = options;</div><div class='del'>-</div><div class='del'>-	pthread_mutex_init (&amp;trans-&gt;lock, NULL);</div><div class='del'>-        trans-&gt;xl = THIS;</div><div class='del'>-	return_trans = trans;</div><div class='del'>-        GF_FREE (vol_opt);</div><div class='del'>-	return return_trans;</div><div class='add'>+    success = _gf_true;</div><div class='ctx'> </div><div class='ctx'> fail:</div><div class='del'>-        if (trans) {</div><div class='del'>-                if (trans-&gt;name) {</div><div class='del'>-                        GF_FREE (trans-&gt;name);</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                GF_FREE (trans);</div><div class='del'>-        }</div><div class='add'>+    if (!success) {</div><div class='add'>+        rpc_transport_cleanup(trans);</div><div class='add'>+        GF_FREE(name);</div><div class='ctx'> </div><div class='del'>-        if (name) {</div><div class='del'>-                GF_FREE (name);</div><div class='del'>-        }</div><div class='add'>+        return_trans = NULL;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        if (vol_opt) {</div><div class='del'>-                GF_FREE (vol_opt);</div><div class='add'>+    if (vol_opt) {</div><div class='add'>+        if (!list_empty(&amp;vol_opt-&gt;list)) {</div><div class='add'>+            list_del_init(&amp;vol_opt-&gt;list);</div><div class='ctx'>         }</div><div class='add'>+        GF_FREE(vol_opt);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        return NULL;</div><div class='add'>+    return return_trans;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int32_t</div><div class='del'>-rpc_transport_submit_request (rpc_transport_t *this, rpc_transport_req_t *req)</div><div class='add'>+rpc_transport_submit_request(rpc_transport_t *this, rpc_transport_req_t *req)</div><div class='ctx'> {</div><div class='del'>-	int32_t                       ret          = -1;</div><div class='add'>+    int32_t ret = -1;</div><div class='ctx'> </div><div class='del'>-	GF_VALIDATE_OR_GOTO("rpc_transport", this, fail);</div><div class='del'>-	GF_VALIDATE_OR_GOTO("rpc_transport", this-&gt;ops, fail);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("rpc_transport", this, fail);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("rpc_transport", this-&gt;ops, fail);</div><div class='ctx'> </div><div class='del'>-	ret = this-&gt;ops-&gt;submit_request (this, req);</div><div class='add'>+    ret = this-&gt;ops-&gt;submit_request(this, req);</div><div class='ctx'> fail:</div><div class='del'>-	return ret;</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int32_t</div><div class='del'>-rpc_transport_submit_reply (rpc_transport_t *this, rpc_transport_reply_t *reply)</div><div class='add'>+rpc_transport_submit_reply(rpc_transport_t *this, rpc_transport_reply_t *reply)</div><div class='ctx'> {</div><div class='del'>-	int32_t                   ret          = -1;</div><div class='add'>+    int32_t ret = -1;</div><div class='ctx'> </div><div class='del'>-	GF_VALIDATE_OR_GOTO("rpc_transport", this, fail);</div><div class='del'>-	GF_VALIDATE_OR_GOTO("rpc_transport", this-&gt;ops, fail);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("rpc_transport", this, fail);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("rpc_transport", this-&gt;ops, fail);</div><div class='ctx'> </div><div class='del'>-	ret = this-&gt;ops-&gt;submit_reply (this, reply);</div><div class='add'>+    ret = this-&gt;ops-&gt;submit_reply(this, reply);</div><div class='ctx'> fail:</div><div class='del'>-	return ret;</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int32_t</div><div class='del'>-rpc_transport_connect (rpc_transport_t *this, int port)</div><div class='add'>+rpc_transport_connect(rpc_transport_t *this, int port)</div><div class='ctx'> {</div><div class='del'>-	int ret = -1;</div><div class='add'>+    int ret = -1;</div><div class='ctx'> </div><div class='del'>-	GF_VALIDATE_OR_GOTO("rpc_transport", this, fail);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("rpc_transport", this, fail);</div><div class='ctx'> </div><div class='del'>-	ret = this-&gt;ops-&gt;connect (this, port);</div><div class='add'>+    ret = this-&gt;ops-&gt;connect(this, port);</div><div class='ctx'> fail:</div><div class='del'>-	return ret;</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int32_t</div><div class='del'>-rpc_transport_listen (rpc_transport_t *this)</div><div class='add'>+rpc_transport_listen(rpc_transport_t *this)</div><div class='ctx'> {</div><div class='del'>-	int ret = -1;</div><div class='add'>+    int ret = -1;</div><div class='ctx'> </div><div class='del'>-	GF_VALIDATE_OR_GOTO("rpc_transport", this, fail);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("rpc_transport", this, fail);</div><div class='ctx'> </div><div class='del'>-	ret = this-&gt;ops-&gt;listen (this);</div><div class='add'>+    ret = this-&gt;ops-&gt;listen(this);</div><div class='ctx'> fail:</div><div class='del'>-	return ret;</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int32_t</div><div class='del'>-rpc_transport_disconnect (rpc_transport_t *this)</div><div class='add'>+rpc_transport_disconnect(rpc_transport_t *this, gf_boolean_t wait)</div><div class='ctx'> {</div><div class='del'>-	int32_t ret = -1;</div><div class='add'>+    int32_t ret = -1;</div><div class='add'>+</div><div class='add'>+    GF_VALIDATE_OR_GOTO("rpc_transport", this, fail);</div><div class='ctx'> </div><div class='del'>-	GF_VALIDATE_OR_GOTO("rpc_transport", this, fail);</div><div class='add'>+    ret = this-&gt;ops-&gt;disconnect(this, wait);</div><div class='ctx'> </div><div class='del'>-	ret = this-&gt;ops-&gt;disconnect (this);</div><div class='ctx'> fail:</div><div class='del'>-	return ret;</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-rpc_transport_destroy (rpc_transport_t *this)</div><div class='add'>+static void</div><div class='add'>+rpc_transport_destroy(rpc_transport_t *this)</div><div class='ctx'> {</div><div class='del'>-	int32_t ret = -1;</div><div class='add'>+    struct dnscache6 *cache = NULL;</div><div class='ctx'> </div><div class='del'>-	GF_VALIDATE_OR_GOTO("rpc_transport", this, fail);</div><div class='add'>+    if (this-&gt;clnt_options)</div><div class='add'>+        dict_unref(this-&gt;clnt_options);</div><div class='add'>+    if (this-&gt;options)</div><div class='add'>+        dict_unref(this-&gt;options);</div><div class='add'>+    if (this-&gt;fini)</div><div class='add'>+        this-&gt;fini(this);</div><div class='ctx'> </div><div class='del'>-	if (this-&gt;fini)</div><div class='del'>-		this-&gt;fini (this);</div><div class='del'>-	pthread_mutex_destroy (&amp;this-&gt;lock);</div><div class='del'>-	GF_FREE (this);</div><div class='del'>-fail:</div><div class='del'>-	return ret;</div><div class='del'>-}</div><div class='add'>+    pthread_mutex_destroy(&amp;this-&gt;lock);</div><div class='ctx'> </div><div class='add'>+    GF_FREE(this-&gt;name);</div><div class='add'>+</div><div class='add'>+    if (this-&gt;dl_handle)</div><div class='add'>+        dlclose(this-&gt;dl_handle);</div><div class='add'>+</div><div class='add'>+    if (this-&gt;ssl_name) {</div><div class='add'>+        GF_FREE(this-&gt;ssl_name);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (this-&gt;dnscache) {</div><div class='add'>+        cache = this-&gt;dnscache;</div><div class='add'>+        if (cache-&gt;first)</div><div class='add'>+            freeaddrinfo(cache-&gt;first);</div><div class='add'>+        GF_FREE(this-&gt;dnscache);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    GF_FREE(this);</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> rpc_transport_t *</div><div class='del'>-rpc_transport_ref (rpc_transport_t *this)</div><div class='add'>+rpc_transport_ref(rpc_transport_t *this)</div><div class='ctx'> {</div><div class='del'>-	rpc_transport_t *return_this = NULL;</div><div class='add'>+    rpc_transport_t *return_this = NULL;</div><div class='ctx'> </div><div class='del'>-	GF_VALIDATE_OR_GOTO("rpc_transport", this, fail);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("rpc_transport", this, fail);</div><div class='ctx'> </div><div class='del'>-	pthread_mutex_lock (&amp;this-&gt;lock);</div><div class='del'>-	{</div><div class='del'>-		this-&gt;refcount ++;</div><div class='del'>-	}</div><div class='del'>-	pthread_mutex_unlock (&amp;this-&gt;lock);</div><div class='add'>+    GF_ATOMIC_INC(this-&gt;refcount);</div><div class='ctx'> </div><div class='del'>-	return_this = this;</div><div class='add'>+    return_this = this;</div><div class='ctx'> fail:</div><div class='del'>-	return return_this;</div><div class='add'>+    return return_this;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int32_t</div><div class='del'>-rpc_transport_unref (rpc_transport_t *this)</div><div class='add'>+rpc_transport_unref(rpc_transport_t *this)</div><div class='ctx'> {</div><div class='del'>-	int32_t refcount = 0;</div><div class='del'>-	int32_t ret = -1;</div><div class='add'>+    int32_t refcount = 0;</div><div class='add'>+    int32_t ret = -1;</div><div class='ctx'> </div><div class='del'>-	GF_VALIDATE_OR_GOTO("rpc_transport", this, fail);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("rpc_transport", this, fail);</div><div class='ctx'> </div><div class='del'>-	pthread_mutex_lock (&amp;this-&gt;lock);</div><div class='del'>-	{</div><div class='del'>-		refcount = --this-&gt;refcount;</div><div class='del'>-	}</div><div class='del'>-	pthread_mutex_unlock (&amp;this-&gt;lock);</div><div class='add'>+    refcount = GF_ATOMIC_DEC(this-&gt;refcount);</div><div class='ctx'> </div><div class='del'>-	if (refcount == 0) {</div><div class='del'>-		/* xlator_notify (this-&gt;xl, GF_EVENT_RPC_TRANSPORT_CLEANUP,</div><div class='del'>-                   this); */</div><div class='del'>-		rpc_transport_destroy (this);</div><div class='del'>-	}</div><div class='add'>+    if (refcount == 0) {</div><div class='add'>+        if (this-&gt;mydata)</div><div class='add'>+            this-&gt;notify(this, this-&gt;mydata, RPC_TRANSPORT_CLEANUP, NULL);</div><div class='add'>+        this-&gt;mydata = NULL;</div><div class='add'>+        this-&gt;notify = NULL;</div><div class='add'>+        rpc_transport_destroy(this);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	ret = 0;</div><div class='add'>+    ret = 0;</div><div class='ctx'> fail:</div><div class='del'>-	return ret;</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int32_t</div><div class='del'>-rpc_transport_notify (rpc_transport_t *this, rpc_transport_event_t event,</div><div class='del'>-                      void *data, ...)</div><div class='add'>+rpc_transport_notify(rpc_transport_t *this, rpc_transport_event_t event,</div><div class='add'>+                     void *data, ...)</div><div class='ctx'> {</div><div class='del'>-        int32_t ret = -1;</div><div class='del'>-</div><div class='del'>-        if (this == NULL) {</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='add'>+    int32_t ret = -1;</div><div class='add'>+    GF_VALIDATE_OR_GOTO("rpc", this, out);</div><div class='ctx'> </div><div class='del'>-        if (this-&gt;notify != NULL) {</div><div class='del'>-                ret = this-&gt;notify (this, this-&gt;mydata, event, data);</div><div class='del'>-        } else {</div><div class='del'>-                ret = 0;</div><div class='del'>-        }</div><div class='add'>+    if (this-&gt;notify != NULL) {</div><div class='add'>+        ret = this-&gt;notify(this, this-&gt;mydata, event, data);</div><div class='add'>+    } else {</div><div class='add'>+        ret = 0;</div><div class='add'>+    }</div><div class='ctx'> out:</div><div class='del'>-        return ret;</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+int</div><div class='add'>+rpc_transport_register_notify(rpc_transport_t *trans,</div><div class='add'>+                              rpc_transport_notify_t notify, void *mydata)</div><div class='add'>+{</div><div class='add'>+    int32_t ret = -1;</div><div class='add'>+    GF_VALIDATE_OR_GOTO("rpc", trans, out);</div><div class='add'>+</div><div class='add'>+    trans-&gt;notify = notify;</div><div class='add'>+    trans-&gt;mydata = mydata;</div><div class='ctx'> </div><div class='add'>+    ret = 0;</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-inline int</div><div class='del'>-rpc_transport_register_notify (rpc_transport_t *trans,</div><div class='del'>-                               rpc_transport_notify_t notify, void *mydata)</div><div class='add'>+// give negative values to skip setting that value</div><div class='add'>+// this function asserts if both the values are negative.</div><div class='add'>+// why call it if you don't set it.</div><div class='add'>+int</div><div class='add'>+rpc_transport_keepalive_options_set(dict_t *options, int32_t interval,</div><div class='add'>+                                    int32_t time, int32_t timeout)</div><div class='ctx'> {</div><div class='del'>-        int ret = -1;</div><div class='add'>+    int ret = -1;</div><div class='ctx'> </div><div class='del'>-        if (trans == NULL) {</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='add'>+    GF_ASSERT(options);</div><div class='add'>+    GF_ASSERT((interval &gt; 0) || (time &gt; 0));</div><div class='ctx'> </div><div class='del'>-        trans-&gt;notify = notify;</div><div class='del'>-        trans-&gt;mydata = mydata;</div><div class='add'>+    ret = dict_set_int32_sizen(options, "transport.socket.keepalive-interval",</div><div class='add'>+                               interval);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='ctx'> </div><div class='del'>-        ret = 0;</div><div class='add'>+    ret = dict_set_int32_sizen(options, "transport.socket.keepalive-time",</div><div class='add'>+                               time);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    ret = dict_set_int32_sizen(options, "transport.tcp-user-timeout", timeout);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+rpc_transport_unix_options_build(dict_t *dict, char *filepath,</div><div class='add'>+                                 int frame_timeout)</div><div class='add'>+{</div><div class='add'>+    char *fpath = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(filepath);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("rpc-transport", dict, out);</div><div class='add'>+</div><div class='add'>+    fpath = gf_strdup(filepath);</div><div class='add'>+    if (!fpath) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_set_dynstr_sizen(dict, "transport.socket.connect-path", fpath);</div><div class='add'>+    if (ret) {</div><div class='add'>+        GF_FREE(fpath);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_set_str_sizen(dict, "transport.address-family", "unix");</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    ret = dict_set_str_sizen(dict, "transport.socket.nodelay", "off");</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    ret = dict_set_str_sizen(dict, "transport-type", "socket");</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    ret = dict_set_str_sizen(dict, "transport.socket.keepalive", "off");</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    if (frame_timeout &gt; 0) {</div><div class='add'>+        ret = dict_set_int32_sizen(dict, "frame-timeout", frame_timeout);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+    }</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+rpc_transport_inet_options_build(dict_t *dict, const char *hostname, int port,</div><div class='add'>+                                 char *af)</div><div class='add'>+{</div><div class='add'>+    char *host = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+#ifdef IPV6_DEFAULT</div><div class='add'>+    static char *addr_family = "inet6";</div><div class='add'>+#else</div><div class='add'>+    static char *addr_family = "inet";</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(hostname);</div><div class='add'>+    GF_ASSERT(port &gt;= 1024);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("rpc-transport", dict, out);</div><div class='add'>+</div><div class='add'>+    host = gf_strdup((char *)hostname);</div><div class='add'>+    if (!host) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_set_dynstr_sizen(dict, "remote-host", host);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log(THIS-&gt;name, GF_LOG_WARNING, "failed to set remote-host with %s",</div><div class='add'>+               host);</div><div class='add'>+        GF_FREE(host);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_set_int32_sizen(dict, "remote-port", port);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log(THIS-&gt;name, GF_LOG_WARNING, "failed to set remote-port with %d",</div><div class='add'>+               port);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_set_str_sizen(dict, "address-family",</div><div class='add'>+                             (af != NULL ? af : addr_family));</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log(THIS-&gt;name, GF_LOG_WARNING, "failed to set address-family to %s",</div><div class='add'>+               addr_family);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_set_str_sizen(dict, "transport-type", "socket");</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log(THIS-&gt;name, GF_LOG_WARNING,</div><div class='add'>+               "failed to set trans-type with socket");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='ctx'> out:</div><div class='del'>-        return ret;</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='head'>diff --git a/rpc/rpc-lib/src/rpc-transport.h b/rpc/rpc-lib/src/rpc-transport.h<br/>index cccae5f261d..c499f0bb955 100644<br/>--- a/<a href='/cgit/glusterfs.git/tree/rpc/rpc-lib/src/rpc-transport.h?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>rpc/rpc-lib/src/rpc-transport.h</a><br/>+++ b/<a href='/cgit/glusterfs.git/tree/rpc/rpc-lib/src/rpc-transport.h?id=d1d7a6f35c816822fab51c820e25023863c239c1'>rpc/rpc-lib/src/rpc-transport.h</a></div><div class='hunk'>@@ -1,30 +1,16 @@</div><div class='ctx'> /*</div><div class='del'>-  Copyright (c) 2010 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='add'>+  Copyright (c) 2008-2012 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='ctx'>   This file is part of GlusterFS.</div><div class='ctx'> </div><div class='del'>-  GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-  it under the terms of the GNU Affero General Public License as published</div><div class='del'>-  by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-  or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-  GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-  WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-  Affero General Public License for more details.</div><div class='del'>-</div><div class='del'>-  You should have received a copy of the GNU Affero General Public License</div><div class='del'>-  along with this program.  If not, see</div><div class='del'>-  &lt;http://www.gnu.org/licenses/&gt;.</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='ctx'> */</div><div class='ctx'> </div><div class='ctx'> #ifndef __RPC_TRANSPORT_H__</div><div class='ctx'> #define __RPC_TRANSPORT_H__</div><div class='ctx'> </div><div class='del'>-#ifndef _CONFIG_H</div><div class='del'>-#define _CONFIG_H</div><div class='del'>-#include "config.h"</div><div class='del'>-#endif</div><div class='del'>-</div><div class='ctx'> #include &lt;inttypes.h&gt;</div><div class='ctx'> #ifdef GF_SOLARIS_HOST_OS</div><div class='ctx'> #include &lt;rpc/auth.h&gt;</div><div class='hunk'>@@ -38,11 +24,15 @@</div><div class='ctx'> #define MAX_IOVEC 16</div><div class='ctx'> #endif</div><div class='ctx'> </div><div class='add'>+#ifndef AI_ADDRCONFIG</div><div class='add'>+#define AI_ADDRCONFIG 0</div><div class='add'>+#endif /* AI_ADDRCONFIG */</div><div class='add'>+</div><div class='ctx'> /* Given the 4-byte fragment header, returns non-zero if this fragment</div><div class='del'>- * is the last fragment for the RPC record being assemebled.</div><div class='add'>+ * is the last fragment for the RPC record being assembled.</div><div class='ctx'>  * RPC Record marking standard defines a 32 bit value as the fragment</div><div class='ctx'>  * header with the MSB signifying whether the fragment is the last</div><div class='del'>- * fragment for the record being asembled.</div><div class='add'>+ * fragment for the record being assembled.</div><div class='ctx'>  */</div><div class='ctx'> #define RPC_LASTFRAG(fraghdr) ((uint32_t)(fraghdr &amp; 0x80000000U))</div><div class='ctx'> </div><div class='hunk'>@@ -51,39 +41,45 @@</div><div class='ctx'>  */</div><div class='ctx'> #define RPC_FRAGSIZE(fraghdr) ((uint32_t)(fraghdr &amp; 0x7fffffffU))</div><div class='ctx'> </div><div class='del'>-#define RPC_FRAGHDR_SIZE               4</div><div class='del'>-#define RPC_MSGTYPE_SIZE               8</div><div class='add'>+#define RPC_FRAGHDR_SIZE 4</div><div class='add'>+#define RPC_MSGTYPE_SIZE 8</div><div class='ctx'> </div><div class='ctx'> /* size of the msg from the start of call-body till and including credlen */</div><div class='del'>-#define RPC_CALL_BODY_SIZE             24</div><div class='add'>+#define RPC_CALL_BODY_SIZE 24</div><div class='ctx'> </div><div class='del'>-#define RPC_REPLY_STATUS_SIZE          4</div><div class='add'>+#define RPC_REPLY_STATUS_SIZE 4</div><div class='ctx'> </div><div class='ctx'> #define RPC_AUTH_FLAVOUR_N_LENGTH_SIZE 8</div><div class='ctx'> </div><div class='del'>-#define RPC_ACCEPT_STATUS_LEN          4</div><div class='add'>+#define RPC_ACCEPT_STATUS_LEN 4</div><div class='ctx'> </div><div class='ctx'> struct rpc_transport_ops;</div><div class='ctx'> typedef struct rpc_transport rpc_transport_t;</div><div class='ctx'> </div><div class='del'>-#include "dict.h"</div><div class='del'>-#include "compat.h"</div><div class='add'>+#include &lt;glusterfs/dict.h&gt;</div><div class='add'>+#include &lt;glusterfs/compat.h&gt;</div><div class='add'>+#include &lt;glusterfs/async.h&gt;</div><div class='ctx'> #include "rpcsvc-common.h"</div><div class='ctx'> </div><div class='ctx'> struct peer_info {</div><div class='del'>-	struct sockaddr_storage sockaddr;</div><div class='del'>-	socklen_t sockaddr_len;</div><div class='del'>-	char identifier[UNIX_PATH_MAX];</div><div class='add'>+    // OP-VERSION of clients</div><div class='add'>+    uint32_t max_op_version;</div><div class='add'>+    uint32_t min_op_version;</div><div class='add'>+    struct sockaddr_storage sockaddr;</div><div class='add'>+    socklen_t sockaddr_len;</div><div class='add'>+    char identifier[UNIX_PATH_MAX];</div><div class='add'>+    // Volume mounted by client</div><div class='add'>+    char volname[NAME_MAX];</div><div class='ctx'> };</div><div class='ctx'> typedef struct peer_info peer_info_t;</div><div class='ctx'> </div><div class='ctx'> typedef enum msg_type msg_type_t;</div><div class='ctx'> </div><div class='ctx'> typedef enum {</div><div class='del'>-        RPC_TRANSPORT_ACCEPT,      /* New client has been accepted */</div><div class='del'>-        RPC_TRANSPORT_DISCONNECT,  /* Connection is disconnected */</div><div class='del'>-        RPC_TRANSPORT_CLEANUP,     /* connection is about to be freed */</div><div class='del'>-        /*RPC_TRANSPORT_READ,*/    /* An event used to enable rpcsvc to instruct</div><div class='add'>+    RPC_TRANSPORT_ACCEPT,          /* New client has been accepted */</div><div class='add'>+    RPC_TRANSPORT_DISCONNECT,      /* Connection is disconnected */</div><div class='add'>+    RPC_TRANSPORT_CLEANUP,         /* connection is about to be freed */</div><div class='add'>+    /*RPC_TRANSPORT_READ,*/        /* An event used to enable rpcsvc to instruct</div><div class='ctx'>                                     * transport the number of bytes to read.</div><div class='ctx'>                                     * This helps in reading large msgs, wherein</div><div class='ctx'>                                     * the rpc actors might decide to place the</div><div class='hunk'>@@ -95,54 +91,55 @@ typedef enum {</div><div class='ctx'>                                     * reading a single msg, this event may be</div><div class='ctx'>                                     * delivered more than once.</div><div class='ctx'>                                     */</div><div class='del'>-        RPC_TRANSPORT_MAP_XID_REQUEST, /* reciever of this event should send</div><div class='del'>-                                        * the prognum and procnum corresponding</div><div class='del'>-                                        * to xid.</div><div class='del'>-                                        */</div><div class='del'>-        RPC_TRANSPORT_MSG_RECEIVED,         /* Complete rpc msg has been read */</div><div class='del'>-        RPC_TRANSPORT_CONNECT,              /* client is connected to server */</div><div class='del'>-        RPC_TRANSPORT_MSG_SENT,</div><div class='add'>+    RPC_TRANSPORT_MAP_XID_REQUEST, /* receiver of this event should send</div><div class='add'>+                                    * the prognum and procnum corresponding</div><div class='add'>+                                    * to xid.</div><div class='add'>+                                    */</div><div class='add'>+    RPC_TRANSPORT_MSG_RECEIVED,    /* Complete rpc msg has been read */</div><div class='add'>+    RPC_TRANSPORT_CONNECT,         /* client is connected to server */</div><div class='add'>+    RPC_TRANSPORT_MSG_SENT,</div><div class='add'>+    RPC_TRANSPORT_EVENT_THREAD_DIED /* event-thread has died */</div><div class='ctx'> } rpc_transport_event_t;</div><div class='ctx'> </div><div class='ctx'> struct rpc_transport_msg {</div><div class='del'>-        struct iovec     *rpchdr;</div><div class='del'>-        int               rpchdrcount;</div><div class='del'>-        struct iovec     *proghdr;</div><div class='del'>-        int               proghdrcount;</div><div class='del'>-        struct iovec     *progpayload;</div><div class='del'>-        int               progpayloadcount;</div><div class='del'>-        struct iobref    *iobref;</div><div class='add'>+    struct iovec *rpchdr;</div><div class='add'>+    struct iovec *proghdr;</div><div class='add'>+    int rpchdrcount;</div><div class='add'>+    int proghdrcount;</div><div class='add'>+    struct iovec *progpayload;</div><div class='add'>+    struct iobref *iobref;</div><div class='add'>+    int progpayloadcount;</div><div class='ctx'> };</div><div class='ctx'> typedef struct rpc_transport_msg rpc_transport_msg_t;</div><div class='ctx'> </div><div class='ctx'> struct rpc_transport_rsp {</div><div class='del'>-        struct iovec   *rsphdr;</div><div class='del'>-        int             rsphdr_count;</div><div class='del'>-        struct iovec   *rsp_payload;</div><div class='del'>-        int             rsp_payload_count;</div><div class='del'>-        struct iobref  *rsp_iobref;</div><div class='add'>+    struct iovec *rsphdr;</div><div class='add'>+    struct iovec *rsp_payload;</div><div class='add'>+    int rsphdr_count;</div><div class='add'>+    int rsp_payload_count;</div><div class='add'>+    struct iobref *rsp_iobref;</div><div class='ctx'> };</div><div class='ctx'> typedef struct rpc_transport_rsp rpc_transport_rsp_t;</div><div class='ctx'> </div><div class='ctx'> struct rpc_transport_req {</div><div class='del'>-        rpc_transport_msg_t  msg;</div><div class='del'>-        rpc_transport_rsp_t  rsp;</div><div class='del'>-        struct rpc_req      *rpc_req;</div><div class='add'>+    struct rpc_req *rpc_req;</div><div class='add'>+    rpc_transport_msg_t msg;</div><div class='add'>+    rpc_transport_rsp_t rsp;</div><div class='ctx'> };</div><div class='ctx'> typedef struct rpc_transport_req rpc_transport_req_t;</div><div class='ctx'> </div><div class='ctx'> struct rpc_transport_reply {</div><div class='del'>-        rpc_transport_msg_t  msg;</div><div class='del'>-        void                *private;</div><div class='add'>+    void *private;</div><div class='add'>+    rpc_transport_msg_t msg;</div><div class='ctx'> };</div><div class='ctx'> typedef struct rpc_transport_reply rpc_transport_reply_t;</div><div class='ctx'> </div><div class='ctx'> struct rpc_transport_data {</div><div class='del'>-        char is_request;</div><div class='del'>-        union {</div><div class='del'>-                rpc_transport_req_t   req;</div><div class='del'>-                rpc_transport_reply_t reply;</div><div class='del'>-        } data;</div><div class='add'>+    union {</div><div class='add'>+        rpc_transport_req_t req;</div><div class='add'>+        rpc_transport_reply_t reply;</div><div class='add'>+    } data;</div><div class='add'>+    char is_request;</div><div class='ctx'> };</div><div class='ctx'> typedef struct rpc_transport_data rpc_transport_data_t;</div><div class='ctx'> </div><div class='hunk'>@@ -150,135 +147,166 @@ typedef struct rpc_transport_data rpc_transport_data_t;</div><div class='ctx'>  * rpc_request, hence these should be removed from request_info</div><div class='ctx'>  */</div><div class='ctx'> struct rpc_request_info {</div><div class='del'>-        uint32_t            xid;</div><div class='del'>-        int                 prognum;</div><div class='del'>-        int                 progver;</div><div class='del'>-        int                 procnum;</div><div class='del'>-        void               *rpc_req; /* struct rpc_req */</div><div class='del'>-        rpc_transport_rsp_t rsp;</div><div class='add'>+    int prognum;</div><div class='add'>+    int progver;</div><div class='add'>+    void *rpc_req; /* struct rpc_req */</div><div class='add'>+    rpc_transport_rsp_t rsp;</div><div class='add'>+    int procnum;</div><div class='add'>+    uint32_t xid;</div><div class='ctx'> };</div><div class='ctx'> typedef struct rpc_request_info rpc_request_info_t;</div><div class='ctx'> </div><div class='add'>+typedef int (*rpc_transport_notify_t)(rpc_transport_t *, void *mydata,</div><div class='add'>+                                      rpc_transport_event_t, void *data, ...);</div><div class='ctx'> </div><div class='del'>-struct rpc_transport_pollin {</div><div class='del'>-        struct iovec vector[2];</div><div class='del'>-        int count;</div><div class='del'>-        char vectored;</div><div class='del'>-        void *private;</div><div class='del'>-        struct iobref *iobref;</div><div class='del'>-        char is_reply;</div><div class='add'>+struct rpc_transport {</div><div class='add'>+    struct rpc_transport_ops *ops;</div><div class='add'>+    rpc_transport_t *listener; /* listener transport to which</div><div class='add'>+                                * request for creation of this</div><div class='add'>+                                * transport came from. valid only</div><div class='add'>+                                * on server process.</div><div class='add'>+                                */</div><div class='add'>+</div><div class='add'>+    void *private;</div><div class='add'>+    struct _client *xl_private;</div><div class='add'>+    void *xl; /* Used for THIS */</div><div class='add'>+    void *mydata;</div><div class='add'>+    pthread_mutex_t lock;</div><div class='add'>+    gf_atomic_t refcount;</div><div class='add'>+    glusterfs_ctx_t *ctx;</div><div class='add'>+    dict_t *options;</div><div class='add'>+    char *name;</div><div class='add'>+    void *dnscache;</div><div class='add'>+    void *drc_client;</div><div class='add'>+    data_t *buf;</div><div class='add'>+    int32_t (*init)(rpc_transport_t *this);</div><div class='add'>+    void (*fini)(rpc_transport_t *this);</div><div class='add'>+    int (*reconfigure)(rpc_transport_t *this, dict_t *options);</div><div class='add'>+    rpc_transport_notify_t notify;</div><div class='add'>+    void *notify_data;</div><div class='add'>+    peer_info_t peerinfo;</div><div class='add'>+    peer_info_t myinfo;</div><div class='add'>+</div><div class='add'>+    uint64_t total_bytes_read;</div><div class='add'>+    uint64_t total_bytes_write;</div><div class='add'>+    uint32_t xid; /* RPC/XID used for callbacks */</div><div class='add'>+    int32_t outstanding_rpc_count;</div><div class='add'>+</div><div class='add'>+    struct list_head list;</div><div class='add'>+    void *dl_handle; /* handle of dlopen() */</div><div class='add'>+    char *ssl_name;</div><div class='add'>+    dict_t *clnt_options; /* store options received from</div><div class='add'>+                           * client */</div><div class='add'>+    gf_atomic_t disconnect_progress;</div><div class='add'>+    int bind_insecure;</div><div class='add'>+    /* connect_failed: saves the connect() syscall status as socket_t</div><div class='add'>+     * member holding connect() status can't be accessed by higher gfapi</div><div class='add'>+     * layer or in client management notification handler functions</div><div class='add'>+     */</div><div class='add'>+    gf_boolean_t connect_failed;</div><div class='add'>+    char notify_poller_death;</div><div class='add'>+    char poller_death_accept;</div><div class='ctx'> };</div><div class='del'>-typedef struct rpc_transport_pollin rpc_transport_pollin_t;</div><div class='ctx'> </div><div class='del'>-typedef int (*rpc_transport_notify_t) (rpc_transport_t *, void *mydata,</div><div class='del'>-                                       rpc_transport_event_t, void *data, ...);</div><div class='del'>-struct rpc_transport {</div><div class='del'>-	struct rpc_transport_ops  *ops;</div><div class='del'>-        rpc_transport_t           *listener; /* listener transport to which</div><div class='del'>-                                              * request for creation of this</div><div class='del'>-                                              * transport came from. valid only</div><div class='del'>-                                              * on server process.</div><div class='del'>-                                              */</div><div class='del'>-	void                      *private;</div><div class='del'>-        void                      *xl_private;</div><div class='del'>-        void                      *xl;       /* Used for THIS */</div><div class='del'>-	void                      *mydata;</div><div class='del'>-	pthread_mutex_t            lock;</div><div class='del'>-	int32_t                    refcount;</div><div class='del'>-</div><div class='del'>-        glusterfs_ctx_t           *ctx;</div><div class='del'>-        dict_t                    *options;</div><div class='del'>-        char                      *name;</div><div class='del'>-	void                      *dnscache;</div><div class='del'>-	data_t                    *buf;</div><div class='del'>-	int32_t                  (*init)   (rpc_transport_t *this);</div><div class='del'>-	void                     (*fini)   (rpc_transport_t *this);</div><div class='del'>-        rpc_transport_notify_t     notify;</div><div class='del'>-        void                      *notify_data;</div><div class='del'>-	peer_info_t                peerinfo;</div><div class='del'>-	peer_info_t                myinfo;</div><div class='del'>-</div><div class='del'>-        struct list_head           list;</div><div class='add'>+struct rpc_transport_pollin {</div><div class='add'>+    struct rpc_transport *trans;</div><div class='add'>+    void *private;</div><div class='add'>+    struct iobref *iobref;</div><div class='add'>+    struct iovec vector[MAX_IOVEC];</div><div class='add'>+    gf_async_t async;</div><div class='add'>+    int count;</div><div class='add'>+    char is_reply;</div><div class='add'>+    char vectored;</div><div class='ctx'> };</div><div class='add'>+typedef struct rpc_transport_pollin rpc_transport_pollin_t;</div><div class='ctx'> </div><div class='ctx'> struct rpc_transport_ops {</div><div class='del'>-        /* no need of receive op, msg will be delivered through an event</div><div class='del'>-         * notification</div><div class='del'>-         */</div><div class='del'>-        int32_t (*submit_request) (rpc_transport_t *this,</div><div class='del'>-                                   rpc_transport_req_t *req);</div><div class='del'>-        int32_t (*submit_reply)   (rpc_transport_t *this,</div><div class='del'>-                                   rpc_transport_reply_t *reply);</div><div class='del'>-	int32_t (*connect)        (rpc_transport_t *this, int port);</div><div class='del'>-	int32_t (*listen)         (rpc_transport_t *this);</div><div class='del'>-	int32_t (*disconnect)     (rpc_transport_t *this);</div><div class='del'>-        int32_t (*get_peername)   (rpc_transport_t *this, char *hostname,</div><div class='del'>-                                   int hostlen);</div><div class='del'>-        int32_t (*get_peeraddr)   (rpc_transport_t *this, char *peeraddr,</div><div class='del'>-                                   int addrlen, struct sockaddr_storage *sa,</div><div class='del'>-                                   socklen_t sasize);</div><div class='del'>-        int32_t (*get_myname)     (rpc_transport_t *this, char *hostname,</div><div class='del'>-                                   int hostlen);</div><div class='del'>-        int32_t (*get_myaddr)     (rpc_transport_t *this, char *peeraddr,</div><div class='del'>-                                   int addrlen, struct sockaddr_storage *sa,</div><div class='del'>-                                   socklen_t sasize);</div><div class='add'>+    /* no need of receive op, msg will be delivered through an event</div><div class='add'>+     * notification</div><div class='add'>+     */</div><div class='add'>+    int32_t (*submit_request)(rpc_transport_t *this, rpc_transport_req_t *req);</div><div class='add'>+    int32_t (*submit_reply)(rpc_transport_t *this,</div><div class='add'>+                            rpc_transport_reply_t *reply);</div><div class='add'>+    int32_t (*connect)(rpc_transport_t *this, int port);</div><div class='add'>+    int32_t (*listen)(rpc_transport_t *this);</div><div class='add'>+    int32_t (*disconnect)(rpc_transport_t *this, gf_boolean_t wait);</div><div class='add'>+    int32_t (*get_peername)(rpc_transport_t *this, char *hostname, int hostlen);</div><div class='add'>+    int32_t (*get_peeraddr)(rpc_transport_t *this, char *peeraddr, int addrlen,</div><div class='add'>+                            struct sockaddr_storage *sa, socklen_t sasize);</div><div class='add'>+    int32_t (*get_myname)(rpc_transport_t *this, char *hostname, int hostlen);</div><div class='add'>+    int32_t (*get_myaddr)(rpc_transport_t *this, char *peeraddr, int addrlen,</div><div class='add'>+                          struct sockaddr_storage *sa, socklen_t sasize);</div><div class='add'>+    int32_t (*throttle)(rpc_transport_t *this, gf_boolean_t onoff);</div><div class='ctx'> };</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int32_t</div><div class='del'>-rpc_transport_listen (rpc_transport_t *this);</div><div class='add'>+rpc_transport_count(const char *transport_type);</div><div class='ctx'> </div><div class='ctx'> int32_t</div><div class='del'>-rpc_transport_connect (rpc_transport_t *this, int port);</div><div class='add'>+rpc_transport_listen(rpc_transport_t *this);</div><div class='ctx'> </div><div class='ctx'> int32_t</div><div class='del'>-rpc_transport_disconnect (rpc_transport_t *this);</div><div class='add'>+rpc_transport_connect(rpc_transport_t *this, int port);</div><div class='ctx'> </div><div class='ctx'> int32_t</div><div class='del'>-rpc_transport_notify (rpc_transport_t *this, rpc_transport_event_t event,</div><div class='del'>-                      void *data, ...);</div><div class='add'>+rpc_transport_disconnect(rpc_transport_t *this, gf_boolean_t wait);</div><div class='ctx'> </div><div class='ctx'> int32_t</div><div class='del'>-rpc_transport_submit_request (rpc_transport_t *this, rpc_transport_req_t *req);</div><div class='add'>+rpc_transport_notify(rpc_transport_t *this, rpc_transport_event_t event,</div><div class='add'>+                     void *data, ...);</div><div class='ctx'> </div><div class='ctx'> int32_t</div><div class='del'>-rpc_transport_submit_reply (rpc_transport_t *this,</div><div class='del'>-                            rpc_transport_reply_t *reply);</div><div class='add'>+rpc_transport_submit_request(rpc_transport_t *this, rpc_transport_req_t *req);</div><div class='ctx'> </div><div class='ctx'> int32_t</div><div class='del'>-rpc_transport_destroy (rpc_transport_t *this);</div><div class='add'>+rpc_transport_submit_reply(rpc_transport_t *this, rpc_transport_reply_t *reply);</div><div class='ctx'> </div><div class='ctx'> rpc_transport_t *</div><div class='del'>-rpc_transport_load (glusterfs_ctx_t *ctx, dict_t *options, char *name);</div><div class='add'>+rpc_transport_load(glusterfs_ctx_t *ctx, dict_t *options, char *name);</div><div class='ctx'> </div><div class='ctx'> rpc_transport_t *</div><div class='del'>-rpc_transport_ref   (rpc_transport_t *trans);</div><div class='add'>+rpc_transport_ref(rpc_transport_t *trans);</div><div class='ctx'> </div><div class='ctx'> int32_t</div><div class='del'>-rpc_transport_unref (rpc_transport_t *trans);</div><div class='add'>+rpc_transport_unref(rpc_transport_t *trans);</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-rpc_transport_register_notify (rpc_transport_t *trans, rpc_transport_notify_t,</div><div class='del'>-                               void *mydata);</div><div class='add'>+rpc_transport_register_notify(rpc_transport_t *trans, rpc_transport_notify_t,</div><div class='add'>+                              void *mydata);</div><div class='ctx'> </div><div class='ctx'> int32_t</div><div class='del'>-rpc_transport_get_peername (rpc_transport_t *this, char *hostname, int hostlen);</div><div class='add'>+rpc_transport_get_peername(rpc_transport_t *this, char *hostname, int hostlen);</div><div class='ctx'> </div><div class='ctx'> int32_t</div><div class='del'>-rpc_transport_get_peeraddr (rpc_transport_t *this, char *peeraddr, int addrlen,</div><div class='del'>-                            struct sockaddr_storage *sa, size_t salen);</div><div class='add'>+rpc_transport_get_peeraddr(rpc_transport_t *this, char *peeraddr, int addrlen,</div><div class='add'>+                           struct sockaddr_storage *sa, size_t salen);</div><div class='ctx'> </div><div class='ctx'> int32_t</div><div class='del'>-rpc_transport_get_myname (rpc_transport_t *this, char *hostname, int hostlen);</div><div class='add'>+rpc_transport_get_myaddr(rpc_transport_t *this, char *peeraddr, int addrlen,</div><div class='add'>+                         struct sockaddr_storage *sa, size_t salen);</div><div class='ctx'> </div><div class='del'>-int32_t</div><div class='del'>-rpc_transport_get_myaddr (rpc_transport_t *this, char *peeraddr, int addrlen,</div><div class='del'>-                          struct sockaddr_storage *sa, size_t salen);</div><div class='add'>+int</div><div class='add'>+rpc_transport_throttle(rpc_transport_t *this, gf_boolean_t onoff);</div><div class='ctx'> </div><div class='ctx'> rpc_transport_pollin_t *</div><div class='del'>-rpc_transport_pollin_alloc (rpc_transport_t *this, struct iovec *vector,</div><div class='del'>-                            int count, struct iobref *iobref, void *private);</div><div class='add'>+rpc_transport_pollin_alloc(rpc_transport_t *this, struct iovec *vector,</div><div class='add'>+                           int count, struct iobuf *hdr_iobuf,</div><div class='add'>+                           struct iobref *iobref, void *private);</div><div class='ctx'> void</div><div class='del'>-rpc_transport_pollin_destroy (rpc_transport_pollin_t *pollin);</div><div class='add'>+rpc_transport_pollin_destroy(rpc_transport_pollin_t *pollin);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+rpc_transport_keepalive_options_set(dict_t *options, int32_t interval,</div><div class='add'>+                                    int32_t time, int32_t timeout);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+rpc_transport_unix_options_build(dict_t *options, char *filepath,</div><div class='add'>+                                 int frame_timeout);</div><div class='ctx'> </div><div class='add'>+int</div><div class='add'>+rpc_transport_inet_options_build(dict_t *options, const char *hostname,</div><div class='add'>+                                 int port, char *af);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+rpc_transport_cleanup(rpc_transport_t *);</div><div class='ctx'> #endif /* __RPC_TRANSPORT_H__ */</div><div class='head'>diff --git a/rpc/rpc-lib/src/rpcsvc-auth.c b/rpc/rpc-lib/src/rpcsvc-auth.c<br/>index 5cfa255ba95..8e76b4188bb 100644<br/>--- a/<a href='/cgit/glusterfs.git/tree/rpc/rpc-lib/src/rpcsvc-auth.c?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>rpc/rpc-lib/src/rpcsvc-auth.c</a><br/>+++ b/<a href='/cgit/glusterfs.git/tree/rpc/rpc-lib/src/rpcsvc-auth.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>rpc/rpc-lib/src/rpcsvc-auth.c</a></div><div class='hunk'>@@ -1,421 +1,561 @@</div><div class='ctx'> /*</div><div class='del'>-  Copyright (c) 2010 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='add'>+  Copyright (c) 2008-2012 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='ctx'>   This file is part of GlusterFS.</div><div class='ctx'> </div><div class='del'>-  GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-  it under the terms of the GNU Affero General Public License as published</div><div class='del'>-  by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-  or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-  GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-  WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-  Affero General Public License for more details.</div><div class='del'>-</div><div class='del'>-  You should have received a copy of the GNU Affero General Public License</div><div class='del'>-  along with this program.  If not, see</div><div class='del'>-  &lt;http://www.gnu.org/licenses/&gt;.</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='ctx'> */</div><div class='ctx'> </div><div class='ctx'> #include "rpcsvc.h"</div><div class='del'>-#include "logging.h"</div><div class='del'>-#include "dict.h"</div><div class='add'>+#include &lt;glusterfs/dict.h&gt;</div><div class='ctx'> </div><div class='ctx'> extern rpcsvc_auth_t *</div><div class='del'>-rpcsvc_auth_null_init (rpcsvc_t *svc, dict_t *options);</div><div class='add'>+rpcsvc_auth_null_init(rpcsvc_t *svc, dict_t *options);</div><div class='ctx'> </div><div class='ctx'> extern rpcsvc_auth_t *</div><div class='del'>-rpcsvc_auth_unix_init (rpcsvc_t *svc, dict_t *options);</div><div class='add'>+rpcsvc_auth_unix_init(rpcsvc_t *svc, dict_t *options);</div><div class='ctx'> </div><div class='ctx'> extern rpcsvc_auth_t *</div><div class='del'>-rpcsvc_auth_glusterfs_init (rpcsvc_t *svc, dict_t *options);</div><div class='add'>+rpcsvc_auth_glusterfs_init(rpcsvc_t *svc, dict_t *options);</div><div class='add'>+extern rpcsvc_auth_t *</div><div class='add'>+rpcsvc_auth_glusterfs_v2_init(rpcsvc_t *svc, dict_t *options);</div><div class='add'>+extern rpcsvc_auth_t *</div><div class='add'>+rpcsvc_auth_glusterfs_v3_init(rpcsvc_t *svc, dict_t *options);</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-rpcsvc_auth_add_initer (struct list_head *list, char *idfier,</div><div class='del'>-                        rpcsvc_auth_initer_t init)</div><div class='add'>+rpcsvc_auth_add_initer(struct list_head *list, char *idfier,</div><div class='add'>+                       rpcsvc_auth_initer_t init)</div><div class='ctx'> {</div><div class='del'>-        struct rpcsvc_auth_list         *new = NULL;</div><div class='add'>+    struct rpcsvc_auth_list *new = NULL;</div><div class='ctx'> </div><div class='del'>-        if ((!list) || (!init) || (!idfier))</div><div class='del'>-                return -1;</div><div class='add'>+    if ((!list) || (!init) || (!idfier))</div><div class='add'>+        return -1;</div><div class='ctx'> </div><div class='del'>-        new = GF_CALLOC (1, sizeof (*new), gf_common_mt_rpcsvc_auth_list);</div><div class='del'>-        if (!new) {</div><div class='del'>-                gf_log (GF_RPCSVC, GF_LOG_ERROR, "Memory allocation failed");</div><div class='del'>-                return -1;</div><div class='del'>-        }</div><div class='add'>+    new = GF_CALLOC(1, sizeof(*new), gf_common_mt_rpcsvc_auth_list);</div><div class='add'>+    if (!new) {</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        new-&gt;init = init;</div><div class='del'>-        strcpy (new-&gt;name, idfier);</div><div class='del'>-        INIT_LIST_HEAD (&amp;new-&gt;authlist);</div><div class='del'>-        list_add_tail (&amp;new-&gt;authlist, list);</div><div class='del'>-        return 0;</div><div class='add'>+    new-&gt;init = init;</div><div class='add'>+    strncpy(new-&gt;name, idfier, sizeof(new-&gt;name) - 1);</div><div class='add'>+    INIT_LIST_HEAD(&amp;new-&gt;authlist);</div><div class='add'>+    list_add_tail(&amp;new-&gt;authlist, list);</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-rpcsvc_auth_add_initers (rpcsvc_t *svc)</div><div class='add'>+rpcsvc_auth_add_initers(rpcsvc_t *svc)</div><div class='ctx'> {</div><div class='del'>-        int     ret = -1;</div><div class='del'>-</div><div class='del'>-        ret = rpcsvc_auth_add_initer (&amp;svc-&gt;authschemes, "auth-glusterfs",</div><div class='del'>-                                      (rpcsvc_auth_initer_t)</div><div class='del'>-                                      rpcsvc_auth_glusterfs_init);</div><div class='del'>-        if (ret == -1) {</div><div class='del'>-                gf_log (GF_RPCSVC, GF_LOG_ERROR, "Failed to add AUTH_GLUSTERFS");</div><div class='del'>-                goto err;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        ret = rpcsvc_auth_add_initer (&amp;svc-&gt;authschemes, "auth-unix",</div><div class='del'>-                                      (rpcsvc_auth_initer_t)</div><div class='del'>-                                      rpcsvc_auth_unix_init);</div><div class='del'>-        if (ret == -1) {</div><div class='del'>-                gf_log (GF_RPCSVC, GF_LOG_ERROR, "Failed to add AUTH_UNIX");</div><div class='del'>-                goto err;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        ret = rpcsvc_auth_add_initer (&amp;svc-&gt;authschemes, "auth-null",</div><div class='del'>-                                      (rpcsvc_auth_initer_t)</div><div class='del'>-                                      rpcsvc_auth_null_init);</div><div class='del'>-        if (ret == -1) {</div><div class='del'>-                gf_log (GF_RPCSVC, GF_LOG_ERROR, "Failed to add AUTH_NULL");</div><div class='del'>-                goto err;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        ret = 0;</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    ret = rpcsvc_auth_add_initer(</div><div class='add'>+        &amp;svc-&gt;authschemes, "auth-glusterfs",</div><div class='add'>+        (rpcsvc_auth_initer_t)rpcsvc_auth_glusterfs_init);</div><div class='add'>+    if (ret == -1) {</div><div class='add'>+        gf_log(GF_RPCSVC, GF_LOG_ERROR, "Failed to add AUTH_GLUSTERFS");</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = rpcsvc_auth_add_initer(</div><div class='add'>+        &amp;svc-&gt;authschemes, "auth-glusterfs-v2",</div><div class='add'>+        (rpcsvc_auth_initer_t)rpcsvc_auth_glusterfs_v2_init);</div><div class='add'>+    if (ret == -1) {</div><div class='add'>+        gf_log(GF_RPCSVC, GF_LOG_ERROR, "Failed to add AUTH_GLUSTERFS-v2");</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = rpcsvc_auth_add_initer(</div><div class='add'>+        &amp;svc-&gt;authschemes, "auth-glusterfs-v3",</div><div class='add'>+        (rpcsvc_auth_initer_t)rpcsvc_auth_glusterfs_v3_init);</div><div class='add'>+    if (ret == -1) {</div><div class='add'>+        gf_log(GF_RPCSVC, GF_LOG_ERROR, "Failed to add AUTH_GLUSTERFS-v3");</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = rpcsvc_auth_add_initer(&amp;svc-&gt;authschemes, "auth-unix",</div><div class='add'>+                                 (rpcsvc_auth_initer_t)rpcsvc_auth_unix_init);</div><div class='add'>+    if (ret == -1) {</div><div class='add'>+        gf_log(GF_RPCSVC, GF_LOG_ERROR, "Failed to add AUTH_UNIX");</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = rpcsvc_auth_add_initer(&amp;svc-&gt;authschemes, "auth-null",</div><div class='add'>+                                 (rpcsvc_auth_initer_t)rpcsvc_auth_null_init);</div><div class='add'>+    if (ret == -1) {</div><div class='add'>+        gf_log(GF_RPCSVC, GF_LOG_ERROR, "Failed to add AUTH_NULL");</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='ctx'> err:</div><div class='del'>-        return ret;</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-rpcsvc_auth_init_auth (rpcsvc_t *svc, dict_t *options,</div><div class='del'>-                       struct rpcsvc_auth_list *authitem)</div><div class='add'>+rpcsvc_auth_init_auth(rpcsvc_t *svc, dict_t *options,</div><div class='add'>+                      struct rpcsvc_auth_list *authitem)</div><div class='ctx'> {</div><div class='del'>-        int             ret = -1;</div><div class='del'>-</div><div class='del'>-        if ((!svc) || (!options) || (!authitem))</div><div class='del'>-                return -1;</div><div class='del'>-</div><div class='del'>-        if (!authitem-&gt;init) {</div><div class='del'>-                gf_log (GF_RPCSVC, GF_LOG_ERROR, "No init function defined");</div><div class='del'>-                ret = -1;</div><div class='del'>-                goto err;</div><div class='del'>-        }</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    if ((!svc) || (!options) || (!authitem))</div><div class='add'>+        return -1;</div><div class='add'>+</div><div class='add'>+    if (!authitem-&gt;init) {</div><div class='add'>+        gf_log(GF_RPCSVC, GF_LOG_ERROR, "No init function defined");</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    authitem-&gt;auth = authitem-&gt;init(svc, options);</div><div class='add'>+    if (!authitem-&gt;auth) {</div><div class='add'>+        gf_log(GF_RPCSVC, GF_LOG_ERROR,</div><div class='add'>+               "Registration of auth failed:"</div><div class='add'>+               " %s",</div><div class='add'>+               authitem-&gt;name);</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    authitem-&gt;enable = 1;</div><div class='add'>+    gf_log(GF_RPCSVC, GF_LOG_TRACE, "Authentication enabled: %s",</div><div class='add'>+           authitem-&gt;auth-&gt;authname);</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+err:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        authitem-&gt;auth = authitem-&gt;init (svc, options);</div><div class='del'>-        if (!authitem-&gt;auth) {</div><div class='del'>-                gf_log (GF_RPCSVC, GF_LOG_ERROR, "Registration of auth failed:"</div><div class='del'>-                        " %s", authitem-&gt;name);</div><div class='del'>-                ret = -1;</div><div class='del'>-                goto err;</div><div class='del'>-        }</div><div class='add'>+int</div><div class='add'>+rpcsvc_auth_init_auths(rpcsvc_t *svc, dict_t *options)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    struct rpcsvc_auth_list *auth = NULL;</div><div class='add'>+    struct rpcsvc_auth_list *tmp = NULL;</div><div class='ctx'> </div><div class='del'>-        authitem-&gt;enable = 1;</div><div class='del'>-        gf_log (GF_RPCSVC, GF_LOG_TRACE, "Authentication enabled: %s",</div><div class='del'>-                authitem-&gt;auth-&gt;authname);</div><div class='add'>+    if (!svc)</div><div class='add'>+        return -1;</div><div class='ctx'> </div><div class='add'>+    if (list_empty(&amp;svc-&gt;authschemes)) {</div><div class='add'>+        gf_log(GF_RPCSVC, GF_LOG_WARNING, "No authentication!");</div><div class='ctx'>         ret = 0;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* If auth null and sys are not disabled by the user, we must enable</div><div class='add'>+     * it by default. This is a globally default rule, the user is still</div><div class='add'>+     * allowed to disable the two for particular subvolumes.</div><div class='add'>+     */</div><div class='add'>+    if (!dict_get(options, "rpc-auth.auth-null")) {</div><div class='add'>+        ret = dict_set_str(options, "rpc-auth.auth-null", "on");</div><div class='add'>+        if (ret)</div><div class='add'>+            gf_log("rpc-auth", GF_LOG_DEBUG, "dict_set failed for 'auth-nill'");</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (!dict_get(options, "rpc-auth.auth-unix")) {</div><div class='add'>+        ret = dict_set_str(options, "rpc-auth.auth-unix", "on");</div><div class='add'>+        if (ret)</div><div class='add'>+            gf_log("rpc-auth", GF_LOG_DEBUG, "dict_set failed for 'auth-unix'");</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (!dict_get(options, "rpc-auth.auth-glusterfs")) {</div><div class='add'>+        ret = dict_set_str(options, "rpc-auth.auth-glusterfs", "on");</div><div class='add'>+        if (ret)</div><div class='add'>+            gf_log("rpc-auth", GF_LOG_DEBUG, "dict_set failed for 'auth-unix'");</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    list_for_each_entry_safe(auth, tmp, &amp;svc-&gt;authschemes, authlist)</div><div class='add'>+    {</div><div class='add'>+        ret = rpcsvc_auth_init_auth(svc, options, auth);</div><div class='add'>+        if (ret == -1)</div><div class='add'>+            goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='ctx'> err:</div><div class='del'>-        return ret;</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-rpcsvc_auth_init_auths (rpcsvc_t *svc, dict_t *options)</div><div class='add'>+rpcsvc_set_addr_namelookup(rpcsvc_t *svc, dict_t *options)</div><div class='ctx'> {</div><div class='del'>-        int                     ret = -1;</div><div class='del'>-        struct rpcsvc_auth_list *auth = NULL;</div><div class='del'>-        struct rpcsvc_auth_list *tmp = NULL;</div><div class='del'>-</div><div class='del'>-        if (!svc)</div><div class='del'>-                return -1;</div><div class='add'>+    int ret;</div><div class='add'>+    static char *addrlookup_key = "rpc-auth.addr.namelookup";</div><div class='ctx'> </div><div class='del'>-        if (list_empty (&amp;svc-&gt;authschemes)) {</div><div class='del'>-                gf_log (GF_RPCSVC, GF_LOG_WARNING, "No authentication!");</div><div class='del'>-                ret = 0;</div><div class='del'>-                goto err;</div><div class='del'>-        }</div><div class='add'>+    if (!svc || !options)</div><div class='add'>+        return (-1);</div><div class='ctx'> </div><div class='del'>-        /* If auth null and sys are not disabled by the user, we must enable</div><div class='del'>-         * it by default. This is a globally default rule, the user is still</div><div class='del'>-         * allowed to disable the two for particular subvolumes.</div><div class='del'>-         */</div><div class='del'>-        if (!dict_get (options, "rpc-auth.auth-null")) {</div><div class='del'>-                ret = dict_set_str (options, "rpc-auth.auth-null", "on");</div><div class='del'>-                if (ret)</div><div class='del'>-                        gf_log ("rpc-auth", GF_LOG_DEBUG,</div><div class='del'>-                                "dict_set failed for 'auth-nill'");</div><div class='del'>-        }</div><div class='add'>+    /* By default it's disabled */</div><div class='add'>+    ret = dict_get_str_boolean(options, addrlookup_key, _gf_false);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        svc-&gt;addr_namelookup = _gf_false;</div><div class='add'>+    } else {</div><div class='add'>+        svc-&gt;addr_namelookup = ret;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        if (!dict_get (options, "rpc-auth.auth-unix")) {</div><div class='del'>-                ret = dict_set_str (options, "rpc-auth.auth-unix", "on");</div><div class='del'>-                if (ret)</div><div class='del'>-                        gf_log ("rpc-auth", GF_LOG_DEBUG,</div><div class='del'>-                                "dict_set failed for 'auth-unix'");</div><div class='del'>-        }</div><div class='add'>+    if (svc-&gt;addr_namelookup)</div><div class='add'>+        gf_log(GF_RPCSVC, GF_LOG_DEBUG, "Addr-Name lookup enabled");</div><div class='ctx'> </div><div class='del'>-        if (!dict_get (options, "rpc-auth.auth-glusterfs")) {</div><div class='del'>-                ret = dict_set_str (options, "rpc-auth.auth-glusterfs", "on");</div><div class='del'>-                if (ret)</div><div class='del'>-                        gf_log ("rpc-auth", GF_LOG_DEBUG,</div><div class='del'>-                                "dict_set failed for 'auth-unix'");</div><div class='del'>-        }</div><div class='add'>+    return (0);</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        list_for_each_entry_safe (auth, tmp, &amp;svc-&gt;authschemes, authlist) {</div><div class='del'>-                ret = rpcsvc_auth_init_auth (svc, options, auth);</div><div class='del'>-                if (ret == -1)</div><div class='del'>-                        goto err;</div><div class='add'>+int</div><div class='add'>+rpcsvc_set_allow_insecure(rpcsvc_t *svc, dict_t *options)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    char *allow_insecure_str = NULL;</div><div class='add'>+    gf_boolean_t is_allow_insecure = _gf_false;</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(svc);</div><div class='add'>+    GF_ASSERT(options);</div><div class='add'>+</div><div class='add'>+    ret = dict_get_str(options, "rpc-auth-allow-insecure", &amp;allow_insecure_str);</div><div class='add'>+    if (0 == ret) {</div><div class='add'>+        ret = gf_string2boolean(allow_insecure_str, &amp;is_allow_insecure);</div><div class='add'>+        if (0 == ret) {</div><div class='add'>+            if (_gf_true == is_allow_insecure)</div><div class='add'>+                svc-&gt;allow_insecure = 1;</div><div class='add'>+            else</div><div class='add'>+                svc-&gt;allow_insecure = 0;</div><div class='ctx'>         }</div><div class='add'>+    } else {</div><div class='add'>+        /* By default set allow-insecure to true */</div><div class='add'>+        svc-&gt;allow_insecure = 1;</div><div class='ctx'> </div><div class='del'>-        ret = 0;</div><div class='del'>-err:</div><div class='del'>-        return ret;</div><div class='add'>+        /* setting in options for the sake of functions that look</div><div class='add'>+         * configuration params for allow insecure,  eg: gf_auth</div><div class='add'>+         */</div><div class='add'>+        ret = dict_set_str(options, "rpc-auth-allow-insecure", "on");</div><div class='add'>+        if (ret &lt; 0)</div><div class='add'>+            gf_log("rpc-auth", GF_LOG_DEBUG,</div><div class='add'>+                   "dict_set failed for 'allow-insecure'");</div><div class='add'>+    }</div><div class='ctx'> </div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-rpcsvc_auth_init (rpcsvc_t *svc, dict_t *options)</div><div class='add'>+rpcsvc_set_root_squash(rpcsvc_t *svc, dict_t *options)</div><div class='ctx'> {</div><div class='del'>-        int             ret = -1;</div><div class='del'>-</div><div class='del'>-        if ((!svc) || (!options))</div><div class='del'>-                return -1;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    uid_t anonuid = -1;</div><div class='add'>+    gid_t anongid = -1;</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(svc);</div><div class='add'>+    GF_ASSERT(options);</div><div class='add'>+</div><div class='add'>+    ret = dict_get_str_boolean(options, "root-squash", 0);</div><div class='add'>+    if (ret != -1)</div><div class='add'>+        svc-&gt;root_squash = ret;</div><div class='add'>+    else</div><div class='add'>+        svc-&gt;root_squash = _gf_false;</div><div class='add'>+</div><div class='add'>+    ret = dict_get_uint32(options, "anonuid", &amp;anonuid);</div><div class='add'>+    if (!ret)</div><div class='add'>+        svc-&gt;anonuid = anonuid;</div><div class='add'>+    else</div><div class='add'>+        svc-&gt;anonuid = RPC_NOBODY_UID;</div><div class='add'>+</div><div class='add'>+    ret = dict_get_uint32(options, "anongid", &amp;anongid);</div><div class='add'>+    if (!ret)</div><div class='add'>+        svc-&gt;anongid = anongid;</div><div class='add'>+    else</div><div class='add'>+        svc-&gt;anongid = RPC_NOBODY_GID;</div><div class='add'>+</div><div class='add'>+    if (svc-&gt;root_squash)</div><div class='add'>+        gf_log(GF_RPCSVC, GF_LOG_DEBUG,</div><div class='add'>+               "root squashing enabled "</div><div class='add'>+               "(uid=%d, gid=%d)",</div><div class='add'>+               svc-&gt;anonuid, svc-&gt;anongid);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        ret = rpcsvc_auth_add_initers (svc);</div><div class='del'>-        if (ret == -1) {</div><div class='del'>-                gf_log (GF_RPCSVC, GF_LOG_ERROR, "Failed to add initers");</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='add'>+int</div><div class='add'>+rpcsvc_set_all_squash(rpcsvc_t *svc, dict_t *options)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    uid_t anonuid = -1;</div><div class='add'>+    gid_t anongid = -1;</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(svc);</div><div class='add'>+    GF_ASSERT(options);</div><div class='add'>+</div><div class='add'>+    ret = dict_get_str_boolean(options, "all-squash", 0);</div><div class='add'>+    if (ret != -1)</div><div class='add'>+        svc-&gt;all_squash = ret;</div><div class='add'>+    else</div><div class='add'>+        svc-&gt;all_squash = _gf_false;</div><div class='add'>+</div><div class='add'>+    ret = dict_get_uint32(options, "anonuid", &amp;anonuid);</div><div class='add'>+    if (!ret)</div><div class='add'>+        svc-&gt;anonuid = anonuid;</div><div class='add'>+    else</div><div class='add'>+        svc-&gt;anonuid = RPC_NOBODY_UID;</div><div class='add'>+</div><div class='add'>+    ret = dict_get_uint32(options, "anongid", &amp;anongid);</div><div class='add'>+    if (!ret)</div><div class='add'>+        svc-&gt;anongid = anongid;</div><div class='add'>+    else</div><div class='add'>+        svc-&gt;anongid = RPC_NOBODY_GID;</div><div class='add'>+</div><div class='add'>+    if (svc-&gt;all_squash)</div><div class='add'>+        gf_log(GF_RPCSVC, GF_LOG_DEBUG,</div><div class='add'>+               "all squashing enabled "</div><div class='add'>+               "(uid=%d, gid=%d)",</div><div class='add'>+               svc-&gt;anonuid, svc-&gt;anongid);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        ret = rpcsvc_auth_init_auths (svc, options);</div><div class='del'>-        if (ret == -1) {</div><div class='del'>-                gf_log (GF_RPCSVC, GF_LOG_ERROR, "Failed to init auth schemes");</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='add'>+int</div><div class='add'>+rpcsvc_auth_init(rpcsvc_t *svc, dict_t *options)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    if ((!svc) || (!options))</div><div class='add'>+        return -1;</div><div class='add'>+</div><div class='add'>+    (void)rpcsvc_set_allow_insecure(svc, options);</div><div class='add'>+    (void)rpcsvc_set_root_squash(svc, options);</div><div class='add'>+    (void)rpcsvc_set_all_squash(svc, options);</div><div class='add'>+    (void)rpcsvc_set_addr_namelookup(svc, options);</div><div class='add'>+    ret = rpcsvc_auth_add_initers(svc);</div><div class='add'>+    if (ret == -1) {</div><div class='add'>+        gf_log(GF_RPCSVC, GF_LOG_ERROR, "Failed to add initers");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = rpcsvc_auth_init_auths(svc, options);</div><div class='add'>+    if (ret == -1) {</div><div class='add'>+        gf_log(GF_RPCSVC, GF_LOG_ERROR, "Failed to init auth schemes");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='ctx'> out:</div><div class='del'>-        return ret;</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='del'>-rpcsvc_auth_t *</div><div class='del'>-__rpcsvc_auth_get_handler (rpcsvc_request_t *req)</div><div class='add'>+int</div><div class='add'>+rpcsvc_auth_reconf(rpcsvc_t *svc, dict_t *options)</div><div class='ctx'> {</div><div class='del'>-        struct rpcsvc_auth_list *auth = NULL;</div><div class='del'>-        struct rpcsvc_auth_list *tmp = NULL;</div><div class='del'>-        rpcsvc_t                *svc = NULL;</div><div class='add'>+    int ret = 0;</div><div class='ctx'> </div><div class='del'>-        if (!req)</div><div class='del'>-                return NULL;</div><div class='add'>+    if ((!svc) || (!options))</div><div class='add'>+        return (-1);</div><div class='ctx'> </div><div class='del'>-        svc = req-&gt;svc;</div><div class='del'>-        if (!svc) {</div><div class='del'>-                gf_log (GF_RPCSVC, GF_LOG_ERROR, "!svc");</div><div class='del'>-                goto err;</div><div class='del'>-        }</div><div class='add'>+    ret = rpcsvc_set_allow_insecure(svc, options);</div><div class='add'>+    if (ret)</div><div class='add'>+        return (-1);</div><div class='ctx'> </div><div class='del'>-        if (list_empty (&amp;svc-&gt;authschemes)) {</div><div class='del'>-                gf_log (GF_RPCSVC, GF_LOG_WARNING, "No authentication!");</div><div class='del'>-                goto err;</div><div class='del'>-        }</div><div class='add'>+    ret = rpcsvc_set_root_squash(svc, options);</div><div class='add'>+    if (ret)</div><div class='add'>+        return (-1);</div><div class='ctx'> </div><div class='del'>-        list_for_each_entry_safe (auth, tmp, &amp;svc-&gt;authschemes, authlist) {</div><div class='del'>-                if (!auth-&gt;enable)</div><div class='del'>-                        continue;</div><div class='del'>-                if (auth-&gt;auth-&gt;authnum == req-&gt;cred.flavour)</div><div class='del'>-                        goto err;</div><div class='add'>+    ret = rpcsvc_set_all_squash(svc, options);</div><div class='add'>+    if (ret)</div><div class='add'>+        return (-1);</div><div class='ctx'> </div><div class='del'>-        }</div><div class='add'>+    return rpcsvc_set_addr_namelookup(svc, options);</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        auth = NULL;</div><div class='add'>+rpcsvc_auth_t *</div><div class='add'>+__rpcsvc_auth_get_handler(rpcsvc_request_t *req)</div><div class='add'>+{</div><div class='add'>+    struct rpcsvc_auth_list *auth = NULL;</div><div class='add'>+    struct rpcsvc_auth_list *tmp = NULL;</div><div class='add'>+    rpcsvc_t *svc = NULL;</div><div class='add'>+</div><div class='add'>+    if (!req)</div><div class='add'>+        return NULL;</div><div class='add'>+</div><div class='add'>+    svc = req-&gt;svc;</div><div class='add'>+    if (!svc) {</div><div class='add'>+        gf_log(GF_RPCSVC, GF_LOG_ERROR, "!svc");</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (list_empty(&amp;svc-&gt;authschemes)) {</div><div class='add'>+        gf_log(GF_RPCSVC, GF_LOG_WARNING, "No authentication!");</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    list_for_each_entry_safe(auth, tmp, &amp;svc-&gt;authschemes, authlist)</div><div class='add'>+    {</div><div class='add'>+        if (!auth-&gt;enable)</div><div class='add'>+            continue;</div><div class='add'>+        if (auth-&gt;auth-&gt;authnum == req-&gt;cred.flavour)</div><div class='add'>+            goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    auth = NULL;</div><div class='ctx'> err:</div><div class='del'>-        if (auth)</div><div class='del'>-                return auth-&gt;auth;</div><div class='del'>-        else</div><div class='del'>-                return NULL;</div><div class='add'>+    if (auth)</div><div class='add'>+        return auth-&gt;auth;</div><div class='add'>+    else</div><div class='add'>+        return NULL;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> rpcsvc_auth_t *</div><div class='del'>-rpcsvc_auth_get_handler (rpcsvc_request_t *req)</div><div class='add'>+rpcsvc_auth_get_handler(rpcsvc_request_t *req)</div><div class='ctx'> {</div><div class='del'>-        rpcsvc_auth_t           *auth = NULL;</div><div class='add'>+    rpcsvc_auth_t *auth = NULL;</div><div class='ctx'> </div><div class='del'>-        auth = __rpcsvc_auth_get_handler (req);</div><div class='del'>-        if (auth)</div><div class='del'>-                goto ret;</div><div class='add'>+    auth = __rpcsvc_auth_get_handler(req);</div><div class='add'>+    if (auth)</div><div class='add'>+        goto ret;</div><div class='ctx'> </div><div class='del'>-        gf_log (GF_RPCSVC, GF_LOG_TRACE, "No auth handler: %d",</div><div class='del'>-                req-&gt;cred.flavour);</div><div class='add'>+    gf_log(GF_RPCSVC, GF_LOG_TRACE, "No auth handler: %d", req-&gt;cred.flavour);</div><div class='ctx'> </div><div class='del'>-        /* The requested scheme was not available so fall back the to one</div><div class='del'>-         * scheme that will always be present.</div><div class='del'>-         */</div><div class='del'>-        req-&gt;cred.flavour = AUTH_NULL;</div><div class='del'>-        req-&gt;verf.flavour = AUTH_NULL;</div><div class='del'>-        auth = __rpcsvc_auth_get_handler (req);</div><div class='add'>+    /* The requested scheme was not available so fall back the to one</div><div class='add'>+     * scheme that will always be present.</div><div class='add'>+     */</div><div class='add'>+    req-&gt;cred.flavour = AUTH_NULL;</div><div class='add'>+    req-&gt;verf.flavour = AUTH_NULL;</div><div class='add'>+    auth = __rpcsvc_auth_get_handler(req);</div><div class='ctx'> ret:</div><div class='del'>-        return auth;</div><div class='add'>+    return auth;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-rpcsvc_auth_request_init (rpcsvc_request_t *req)</div><div class='add'>+rpcsvc_auth_request_init(rpcsvc_request_t *req, struct rpc_msg *callmsg)</div><div class='ctx'> {</div><div class='del'>-        int                     ret = -1;</div><div class='del'>-        rpcsvc_auth_t           *auth = NULL;</div><div class='del'>-</div><div class='del'>-        if (!req)</div><div class='del'>-                return -1;</div><div class='del'>-</div><div class='del'>-        auth = rpcsvc_auth_get_handler (req);</div><div class='del'>-        if (!auth)</div><div class='del'>-                goto err;</div><div class='del'>-        ret = 0;</div><div class='del'>-        gf_log (GF_RPCSVC, GF_LOG_TRACE, "Auth handler: %s", auth-&gt;authname);</div><div class='del'>-        if (!auth-&gt;authops-&gt;request_init)</div><div class='del'>-                ret = auth-&gt;authops-&gt;request_init (req, auth-&gt;authprivate);</div><div class='del'>-</div><div class='add'>+    int32_t ret = 0;</div><div class='add'>+    rpcsvc_auth_t *auth = NULL;</div><div class='add'>+</div><div class='add'>+    if (!req || !callmsg) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    req-&gt;cred.flavour = rpc_call_cred_flavour(callmsg);</div><div class='add'>+    req-&gt;cred.datalen = rpc_call_cred_len(callmsg);</div><div class='add'>+    req-&gt;verf.flavour = rpc_call_verf_flavour(callmsg);</div><div class='add'>+    req-&gt;verf.datalen = rpc_call_verf_len(callmsg);</div><div class='add'>+</div><div class='add'>+    auth = rpcsvc_auth_get_handler(req);</div><div class='add'>+    if (!auth) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    gf_log(GF_RPCSVC, GF_LOG_TRACE, "Auth handler: %s", auth-&gt;authname);</div><div class='add'>+</div><div class='add'>+    if (auth-&gt;authops-&gt;request_init)</div><div class='add'>+        ret = auth-&gt;authops-&gt;request_init(req, auth-&gt;authprivate);</div><div class='add'>+</div><div class='add'>+    /* reset to auxgidlarge during</div><div class='add'>+       unsersialize if necessary */</div><div class='add'>+    req-&gt;auxgids = req-&gt;auxgidsmall;</div><div class='add'>+    req-&gt;auxgidlarge = NULL;</div><div class='ctx'> err:</div><div class='del'>-        return ret;</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-rpcsvc_authenticate (rpcsvc_request_t *req)</div><div class='add'>+rpcsvc_authenticate(rpcsvc_request_t *req)</div><div class='ctx'> {</div><div class='del'>-        int                     ret = RPCSVC_AUTH_REJECT;</div><div class='del'>-        rpcsvc_auth_t           *auth = NULL;</div><div class='del'>-        int                     minauth = 0;</div><div class='del'>-</div><div class='del'>-        if (!req)</div><div class='del'>-                return ret;</div><div class='del'>-</div><div class='del'>-        //minauth = rpcsvc_request_prog_minauth (req);</div><div class='del'>-        minauth = 1;</div><div class='del'>-        if (minauth &gt; rpcsvc_request_cred_flavour (req)) {</div><div class='del'>-                gf_log (GF_RPCSVC, GF_LOG_DEBUG, "Auth too weak");</div><div class='del'>-                rpcsvc_request_set_autherr (req, AUTH_TOOWEAK);</div><div class='del'>-                goto err;</div><div class='del'>-        }</div><div class='add'>+    int ret = RPCSVC_AUTH_REJECT;</div><div class='add'>+    rpcsvc_auth_t *auth = NULL;</div><div class='add'>+    int minauth = 0;</div><div class='ctx'> </div><div class='del'>-        auth = rpcsvc_auth_get_handler (req);</div><div class='del'>-        if (!auth) {</div><div class='del'>-                gf_log (GF_RPCSVC, GF_LOG_DEBUG, "No auth handler found");</div><div class='del'>-                goto err;</div><div class='del'>-        }</div><div class='add'>+    if (!req)</div><div class='add'>+        return ret;</div><div class='add'>+</div><div class='add'>+    /* FIXME use rpcsvc_request_prog_minauth() */</div><div class='add'>+    minauth = 0;</div><div class='add'>+    if (minauth &gt; rpcsvc_request_cred_flavour(req)) {</div><div class='add'>+        gf_log(GF_RPCSVC, GF_LOG_WARNING, "Auth too weak");</div><div class='add'>+        rpcsvc_request_set_autherr(req, AUTH_TOOWEAK);</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        if (auth-&gt;authops-&gt;authenticate)</div><div class='del'>-                ret = auth-&gt;authops-&gt;authenticate (req, auth-&gt;authprivate);</div><div class='add'>+    auth = rpcsvc_auth_get_handler(req);</div><div class='add'>+    if (!auth) {</div><div class='add'>+        gf_log(GF_RPCSVC, GF_LOG_WARNING, "No auth handler found");</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (auth-&gt;authops-&gt;authenticate)</div><div class='add'>+        ret = auth-&gt;authops-&gt;authenticate(req, auth-&gt;authprivate);</div><div class='ctx'> </div><div class='ctx'> err:</div><div class='del'>-        return ret;</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-rpcsvc_auth_array (rpcsvc_t *svc, char *volname, int *autharr, int arrlen)</div><div class='add'>+rpcsvc_auth_array(rpcsvc_t *svc, char *volname, int *autharr, int arrlen)</div><div class='ctx'> {</div><div class='del'>-        int             count = 0;</div><div class='del'>-        int             gen = RPCSVC_AUTH_REJECT;</div><div class='del'>-        int             spec = RPCSVC_AUTH_REJECT;</div><div class='del'>-        int             final = RPCSVC_AUTH_REJECT;</div><div class='del'>-        char            *srchstr = NULL;</div><div class='del'>-        char            *valstr = NULL;</div><div class='del'>-        gf_boolean_t    boolval = _gf_false;</div><div class='del'>-        int             ret = 0;</div><div class='del'>-</div><div class='del'>-        struct rpcsvc_auth_list *auth = NULL;</div><div class='del'>-        struct rpcsvc_auth_list *tmp = NULL;</div><div class='del'>-</div><div class='del'>-        if ((!svc) || (!autharr) || (!volname))</div><div class='del'>-                return -1;</div><div class='del'>-</div><div class='del'>-        memset (autharr, 0, arrlen * sizeof(int));</div><div class='del'>-        if (list_empty (&amp;svc-&gt;authschemes)) {</div><div class='del'>-                gf_log (GF_RPCSVC, GF_LOG_ERROR, "No authentication!");</div><div class='del'>-                goto err;</div><div class='add'>+    int count = 0;</div><div class='add'>+    int result = RPCSVC_AUTH_REJECT;</div><div class='add'>+    char *srchstr = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    struct rpcsvc_auth_list *auth = NULL;</div><div class='add'>+    struct rpcsvc_auth_list *tmp = NULL;</div><div class='add'>+</div><div class='add'>+    if ((!svc) || (!autharr) || (!volname))</div><div class='add'>+        return -1;</div><div class='add'>+</div><div class='add'>+    memset(autharr, 0, arrlen * sizeof(int));</div><div class='add'>+    if (list_empty(&amp;svc-&gt;authschemes)) {</div><div class='add'>+        gf_log(GF_RPCSVC, GF_LOG_ERROR, "No authentication!");</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    list_for_each_entry_safe(auth, tmp, &amp;svc-&gt;authschemes, authlist)</div><div class='add'>+    {</div><div class='add'>+        if (count &gt;= arrlen)</div><div class='add'>+            break;</div><div class='add'>+</div><div class='add'>+        result = gf_asprintf(&amp;srchstr, "rpc-auth.%s.%s", auth-&gt;name, volname);</div><div class='add'>+        if (result == -1) {</div><div class='add'>+            count = -1;</div><div class='add'>+            goto err;</div><div class='ctx'>         }</div><div class='ctx'> </div><div class='del'>-        list_for_each_entry_safe (auth, tmp, &amp;svc-&gt;authschemes, authlist) {</div><div class='del'>-                if (count &gt;= arrlen)</div><div class='del'>-                        break;</div><div class='del'>-</div><div class='del'>-                gen = gf_asprintf (&amp;srchstr, "rpc-auth.%s", auth-&gt;name);</div><div class='del'>-                if (gen == -1) {</div><div class='del'>-                        count = -1;</div><div class='del'>-                        goto err;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                gen = RPCSVC_AUTH_REJECT;</div><div class='del'>-                if (dict_get (svc-&gt;options, srchstr)) {</div><div class='del'>-                        ret = dict_get_str (svc-&gt;options, srchstr, &amp;valstr);</div><div class='del'>-                        if (ret == 0) {</div><div class='del'>-                                ret = gf_string2boolean (valstr, &amp;boolval);</div><div class='del'>-                                if (ret == 0) {</div><div class='del'>-                                        if (boolval == _gf_true)</div><div class='del'>-                                                gen = RPCSVC_AUTH_ACCEPT;</div><div class='del'>-                                } else</div><div class='del'>-                                        gf_log (GF_RPCSVC, GF_LOG_ERROR, "Faile"</div><div class='del'>-                                                "d to read auth val");</div><div class='del'>-                        } else</div><div class='del'>-                                gf_log (GF_RPCSVC, GF_LOG_ERROR, "Faile"</div><div class='del'>-                                        "d to read auth val");</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                GF_FREE (srchstr);</div><div class='del'>-                spec = gf_asprintf (&amp;srchstr, "rpc-auth.%s.%s", auth-&gt;name,</div><div class='del'>-                                    volname);</div><div class='del'>-                if (spec == -1) {</div><div class='del'>-                        count = -1;</div><div class='del'>-                        goto err;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                spec = RPCSVC_AUTH_DONTCARE;</div><div class='del'>-                if (dict_get (svc-&gt;options, srchstr)) {</div><div class='del'>-                        ret = dict_get_str (svc-&gt;options, srchstr, &amp;valstr);</div><div class='del'>-                        if (ret == 0) {</div><div class='del'>-                                ret = gf_string2boolean (valstr, &amp;boolval);</div><div class='del'>-                                if (ret == 0) {</div><div class='del'>-                                        if (boolval == _gf_true)</div><div class='del'>-                                                spec = RPCSVC_AUTH_ACCEPT;</div><div class='del'>-                                        else</div><div class='del'>-                                                spec = RPCSVC_AUTH_REJECT;</div><div class='del'>-                                } else</div><div class='del'>-                                        gf_log (GF_RPCSVC, GF_LOG_ERROR, "Faile"</div><div class='del'>-                                                "d to read auth val");</div><div class='del'>-                        } else</div><div class='del'>-                                gf_log (GF_RPCSVC, GF_LOG_ERROR, "Faile"</div><div class='del'>-                                        "d to read auth val");</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                GF_FREE (srchstr);</div><div class='del'>-                final = rpcsvc_combine_gen_spec_volume_checks (gen, spec);</div><div class='del'>-                if (final == RPCSVC_AUTH_ACCEPT) {</div><div class='del'>-                        autharr[count] = auth-&gt;auth-&gt;authnum;</div><div class='del'>-                        ++count;</div><div class='del'>-                }</div><div class='add'>+        ret = dict_get_str_boolean(svc-&gt;options, srchstr, 0xC00FFEE);</div><div class='add'>+        GF_FREE(srchstr);</div><div class='add'>+</div><div class='add'>+        switch (ret) {</div><div class='add'>+            case _gf_true:</div><div class='add'>+                autharr[count] = auth-&gt;auth-&gt;authnum;</div><div class='add'>+                ++count;</div><div class='add'>+                break;</div><div class='add'>+</div><div class='add'>+            default:</div><div class='add'>+                /* nothing to do */</div><div class='add'>+                break;</div><div class='ctx'>         }</div><div class='add'>+    }</div><div class='ctx'> </div><div class='ctx'> err:</div><div class='del'>-        return count;</div><div class='add'>+    return count;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> gid_t *</div><div class='del'>-rpcsvc_auth_unix_auxgids (rpcsvc_request_t *req, int *arrlen)</div><div class='add'>+rpcsvc_auth_unix_auxgids(rpcsvc_request_t *req, int *arrlen)</div><div class='ctx'> {</div><div class='del'>-        if ((!req) || (!arrlen))</div><div class='del'>-                return NULL;</div><div class='del'>-</div><div class='del'>-        if ((req-&gt;cred.flavour != AUTH_UNIX) ||</div><div class='del'>-            (req-&gt;cred.flavour != AUTH_GLUSTERFS))</div><div class='del'>-                return NULL;</div><div class='del'>-</div><div class='del'>-        *arrlen = req-&gt;auxgidcount;</div><div class='del'>-        if (*arrlen == 0)</div><div class='del'>-                return NULL;</div><div class='del'>-</div><div class='del'>-        return &amp;req-&gt;auxgids[0];</div><div class='add'>+    if ((!req) || (!arrlen))</div><div class='add'>+        return NULL;</div><div class='add'>+</div><div class='add'>+    /* In case of AUTH_NULL auxgids are not used */</div><div class='add'>+    switch (req-&gt;cred.flavour) {</div><div class='add'>+        case AUTH_UNIX:</div><div class='add'>+        case AUTH_GLUSTERFS:</div><div class='add'>+        case AUTH_GLUSTERFS_v2:</div><div class='add'>+        case AUTH_GLUSTERFS_v3:</div><div class='add'>+            break;</div><div class='add'>+        default:</div><div class='add'>+            gf_log("rpc", GF_LOG_DEBUG, "auth type not unix or glusterfs");</div><div class='add'>+            return NULL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    *arrlen = req-&gt;auxgidcount;</div><div class='add'>+    if (*arrlen == 0)</div><div class='add'>+        return NULL;</div><div class='add'>+</div><div class='add'>+    return &amp;req-&gt;auxgids[0];</div><div class='ctx'> }</div><div class='head'>diff --git a/rpc/rpc-lib/src/rpcsvc-common.h b/rpc/rpc-lib/src/rpcsvc-common.h<br/>index 7e72bc3ae44..6c4ec49a6ef 100644<br/>--- a/<a href='/cgit/glusterfs.git/tree/rpc/rpc-lib/src/rpcsvc-common.h?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>rpc/rpc-lib/src/rpcsvc-common.h</a><br/>+++ b/<a href='/cgit/glusterfs.git/tree/rpc/rpc-lib/src/rpcsvc-common.h?id=d1d7a6f35c816822fab51c820e25023863c239c1'>rpc/rpc-lib/src/rpcsvc-common.h</a></div><div class='hunk'>@@ -1,81 +1,113 @@</div><div class='ctx'> /*</div><div class='del'>-  Copyright (c) 2010 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='add'>+  Copyright (c) 2008-2012 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='ctx'>   This file is part of GlusterFS.</div><div class='ctx'> </div><div class='del'>-  GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-  it under the terms of the GNU Affero General Public License as published</div><div class='del'>-  by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-  or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-  GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-  WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-  Affero General Public License for more details.</div><div class='del'>-</div><div class='del'>-  You should have received a copy of the GNU Affero General Public License</div><div class='del'>-  along with this program.  If not, see</div><div class='del'>-  &lt;http://www.gnu.org/licenses/&gt;.</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='ctx'> */</div><div class='ctx'> </div><div class='ctx'> #ifndef _RPCSVC_COMMON_H</div><div class='ctx'> #define _RPCSVC_COMMON_H</div><div class='ctx'> </div><div class='ctx'> #include &lt;pthread.h&gt;</div><div class='del'>-#include "list.h"</div><div class='del'>-#include "compat.h"</div><div class='del'>-#include "glusterfs.h"</div><div class='del'>-#include "dict.h"</div><div class='add'>+#include &lt;glusterfs/compat.h&gt;</div><div class='add'>+#include &lt;glusterfs/dict.h&gt;</div><div class='ctx'> </div><div class='ctx'> typedef enum {</div><div class='del'>-        RPCSVC_EVENT_ACCEPT,</div><div class='del'>-        RPCSVC_EVENT_DISCONNECT,</div><div class='del'>-        RPCSVC_EVENT_LISTENER_DEAD,</div><div class='add'>+    RPCSVC_EVENT_ACCEPT,</div><div class='add'>+    RPCSVC_EVENT_DISCONNECT,</div><div class='add'>+    RPCSVC_EVENT_TRANSPORT_DESTROY,</div><div class='add'>+    RPCSVC_EVENT_LISTENER_DEAD,</div><div class='ctx'> } rpcsvc_event_t;</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> struct rpcsvc_state;</div><div class='ctx'> </div><div class='del'>-typedef int (*rpcsvc_notify_t) (struct rpcsvc_state *, void *mydata,</div><div class='del'>-                                rpcsvc_event_t, void *data);</div><div class='add'>+typedef int (*rpcsvc_notify_t)(struct rpcsvc_state *, void *mydata,</div><div class='add'>+                               rpcsvc_event_t, void *data);</div><div class='ctx'> </div><div class='add'>+struct drc_globals;</div><div class='add'>+typedef struct drc_globals rpcsvc_drc_globals_t;</div><div class='ctx'> </div><div class='ctx'> /* Contains global state required for all the RPC services.</div><div class='ctx'>  */</div><div class='ctx'> typedef struct rpcsvc_state {</div><div class='add'>+    /* Contains list of (program, version) handlers.</div><div class='add'>+     * other options.</div><div class='add'>+     */</div><div class='add'>+</div><div class='add'>+    pthread_rwlock_t rpclock;</div><div class='add'>+</div><div class='add'>+    /* List of the authentication schemes available. */</div><div class='add'>+    struct list_head authschemes;</div><div class='add'>+</div><div class='add'>+    /* Reference to the options */</div><div class='add'>+    dict_t *options;</div><div class='add'>+</div><div class='add'>+    uid_t anonuid;</div><div class='add'>+    gid_t anongid;</div><div class='add'>+    glusterfs_ctx_t *ctx;</div><div class='add'>+</div><div class='add'>+    /* list of connections which will listen for incoming connections */</div><div class='add'>+    struct list_head listeners;</div><div class='add'>+</div><div class='add'>+    /* list of programs registered with rpcsvc */</div><div class='add'>+    struct list_head programs;</div><div class='add'>+</div><div class='add'>+    /* list of notification callbacks */</div><div class='add'>+    struct list_head notify;</div><div class='add'>+    int notify_count;</div><div class='add'>+</div><div class='add'>+    unsigned int memfactor;</div><div class='add'>+</div><div class='add'>+    xlator_t *xl; /* xlator */</div><div class='add'>+    void *mydata;</div><div class='add'>+    rpcsvc_notify_t notifyfn;</div><div class='add'>+    struct mem_pool *rxpool;</div><div class='add'>+    rpcsvc_drc_globals_t *drc;</div><div class='add'>+</div><div class='add'>+    /* per-client limit of outstanding rpc requests */</div><div class='add'>+    int outstanding_rpc_limit;</div><div class='add'>+    gf_boolean_t addr_namelookup;</div><div class='add'>+    /* determine whether throttling is needed, by default OFF */</div><div class='add'>+    gf_boolean_t throttle;</div><div class='add'>+    /* Allow insecure ports. */</div><div class='add'>+    gf_boolean_t allow_insecure;</div><div class='add'>+    gf_boolean_t register_portmap;</div><div class='add'>+    gf_boolean_t root_squash;</div><div class='add'>+    gf_boolean_t all_squash;</div><div class='add'>+} rpcsvc_t;</div><div class='ctx'> </div><div class='del'>-        /* Contains list of (program, version) handlers.</div><div class='del'>-         * other options.</div><div class='del'>-         */</div><div class='del'>-</div><div class='del'>-        pthread_mutex_t         rpclock;</div><div class='del'>-</div><div class='del'>-        unsigned int            memfactor;</div><div class='del'>-</div><div class='del'>-        /* List of the authentication schemes available. */</div><div class='del'>-        struct list_head        authschemes;</div><div class='del'>-</div><div class='del'>-        /* Reference to the options */</div><div class='del'>-        dict_t                  *options;</div><div class='add'>+/* DRC START */</div><div class='add'>+enum drc_op_type { DRC_NA = 0, DRC_IDEMPOTENT = 1, DRC_NON_IDEMPOTENT = 2 };</div><div class='add'>+typedef enum drc_op_type drc_op_type_t;</div><div class='ctx'> </div><div class='del'>-        /* Allow insecure ports. */</div><div class='del'>-        int                     allow_insecure;</div><div class='add'>+enum drc_type { DRC_TYPE_NONE = 0, DRC_TYPE_IN_MEMORY = 1 };</div><div class='add'>+typedef enum drc_type drc_type_t;</div><div class='ctx'> </div><div class='del'>-        glusterfs_ctx_t         *ctx;</div><div class='add'>+enum drc_lru_factor {</div><div class='add'>+    DRC_LRU_5_PC = 20,</div><div class='add'>+    DRC_LRU_10_PC = 10,</div><div class='add'>+    DRC_LRU_25_PC = 4,</div><div class='add'>+    DRC_LRU_50_PC = 2</div><div class='add'>+};</div><div class='add'>+typedef enum drc_lru_factor drc_lru_factor_t;</div><div class='ctx'> </div><div class='del'>-        /* list of connections which will listen for incoming connections */</div><div class='del'>-        struct list_head         listeners;</div><div class='add'>+enum drc_xid_state { DRC_XID_MONOTONOUS = 0, DRC_XID_WRAPPED = 1 };</div><div class='add'>+typedef enum drc_xid_state drc_xid_state_t;</div><div class='ctx'> </div><div class='del'>-        /* list of programs registered with rpcsvc */</div><div class='del'>-        struct list_head         programs;</div><div class='add'>+enum drc_op_state { DRC_OP_IN_TRANSIT = 0, DRC_OP_CACHED = 1 };</div><div class='add'>+typedef enum drc_op_state drc_op_state_t;</div><div class='ctx'> </div><div class='del'>-        /* list of notification callbacks */</div><div class='del'>-        struct list_head         notify;</div><div class='del'>-        int                      notify_count;</div><div class='add'>+enum drc_policy { DRC_LRU = 0 };</div><div class='add'>+typedef enum drc_policy drc_policy_t;</div><div class='ctx'> </div><div class='del'>-        void                    *mydata; /* This is xlator */</div><div class='del'>-        rpcsvc_notify_t          notifyfn;</div><div class='del'>-        struct mem_pool         *rxpool;</div><div class='del'>-} rpcsvc_t;</div><div class='add'>+/* Default policies for DRC */</div><div class='add'>+#define DRC_DEFAULT_TYPE DRC_TYPE_IN_MEMORY</div><div class='add'>+#define DRC_DEFAULT_CACHE_SIZE 0x20000</div><div class='add'>+#define DRC_DEFAULT_LRU_FACTOR DRC_LRU_25_PC</div><div class='ctx'> </div><div class='add'>+/* DRC END */</div><div class='ctx'> </div><div class='ctx'> #endif /* #ifndef _RPCSVC_COMMON_H */</div><div class='head'>diff --git a/rpc/rpc-lib/src/rpcsvc.c b/rpc/rpc-lib/src/rpcsvc.c<br/>index 5da6705a681..39910d481bf 100644<br/>--- a/<a href='/cgit/glusterfs.git/tree/rpc/rpc-lib/src/rpcsvc.c?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>rpc/rpc-lib/src/rpcsvc.c</a><br/>+++ b/<a href='/cgit/glusterfs.git/tree/rpc/rpc-lib/src/rpcsvc.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>rpc/rpc-lib/src/rpcsvc.c</a></div><div class='hunk'>@@ -1,39 +1,27 @@</div><div class='ctx'> /*</div><div class='del'>-  Copyright (c) 2010 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='add'>+  Copyright (c) 2008-2012 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='ctx'>   This file is part of GlusterFS.</div><div class='ctx'> </div><div class='del'>-  GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-  it under the terms of the GNU Affero General Public License as published</div><div class='del'>-  by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-  or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-  GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-  WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-  Affero General Public License for more details.</div><div class='del'>-</div><div class='del'>-  You should have received a copy of the GNU Affero General Public License</div><div class='del'>-  along with this program.  If not, see</div><div class='del'>-  &lt;http://www.gnu.org/licenses/&gt;.</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='ctx'> */</div><div class='ctx'> </div><div class='del'>-#ifndef _CONFIG_H</div><div class='del'>-#define _CONFIG_H</div><div class='del'>-#include "config.h"</div><div class='del'>-#endif</div><div class='del'>-</div><div class='ctx'> #include "rpcsvc.h"</div><div class='ctx'> #include "rpc-transport.h"</div><div class='del'>-#include "dict.h"</div><div class='del'>-#include "logging.h"</div><div class='del'>-#include "byte-order.h"</div><div class='del'>-#include "common-utils.h"</div><div class='del'>-#include "compat-errno.h"</div><div class='del'>-#include "list.h"</div><div class='add'>+#include &lt;glusterfs/dict.h&gt;</div><div class='add'>+#include &lt;glusterfs/byte-order.h&gt;</div><div class='add'>+#include &lt;glusterfs/compat-errno.h&gt;</div><div class='add'>+#include &lt;glusterfs/statedump.h&gt;</div><div class='ctx'> #include "xdr-rpc.h"</div><div class='del'>-#include "iobuf.h"</div><div class='del'>-#include "globals.h"</div><div class='add'>+#include &lt;glusterfs/iobuf.h&gt;</div><div class='ctx'> #include "xdr-common.h"</div><div class='add'>+#include "xdr-generic.h"</div><div class='add'>+#include "rpc-common-xdr.h"</div><div class='add'>+#include &lt;glusterfs/syncop.h&gt;</div><div class='add'>+#include "rpc-drc.h"</div><div class='add'>+#include "protocol-common.h"</div><div class='ctx'> </div><div class='ctx'> #include &lt;errno.h&gt;</div><div class='ctx'> #include &lt;pthread.h&gt;</div><div class='hunk'>@@ -45,1354 +33,1364 @@</div><div class='ctx'> #include &lt;fnmatch.h&gt;</div><div class='ctx'> #include &lt;stdarg.h&gt;</div><div class='ctx'> #include &lt;stdio.h&gt;</div><div class='add'>+#include &lt;dlfcn.h&gt;</div><div class='ctx'> </div><div class='del'>-#include "xdr-rpcclnt.h"</div><div class='del'>-</div><div class='del'>-struct rpcsvc_program gluster_dump_prog;</div><div class='del'>-</div><div class='del'>-#define rpcsvc_alloc_request(svc, request)                              \</div><div class='del'>-        do {                                                            \</div><div class='del'>-                request = (rpcsvc_request_t *) mem_get ((svc)-&gt;rxpool); \</div><div class='del'>-                memset (request, 0, sizeof (rpcsvc_request_t));         \</div><div class='del'>-        } while (0)</div><div class='del'>-</div><div class='del'>-rpcsvc_listener_t *</div><div class='del'>-rpcsvc_get_listener (rpcsvc_t *svc, uint16_t port, rpc_transport_t *trans);</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-rpcsvc_transport_peer_check_search (dict_t *options, char *pattern, char *clstr)</div><div class='del'>-{</div><div class='del'>-        int                     ret = -1;</div><div class='del'>-        char                    *addrtok = NULL;</div><div class='del'>-        char                    *addrstr = NULL;</div><div class='del'>-        char                    *svptr = NULL;</div><div class='del'>-</div><div class='del'>-        if ((!options) || (!clstr))</div><div class='del'>-                return -1;</div><div class='del'>-</div><div class='del'>-        if (!dict_get (options, pattern))</div><div class='del'>-                return -1;</div><div class='del'>-</div><div class='del'>-        ret = dict_get_str (options, pattern, &amp;addrstr);</div><div class='del'>-        if (ret &lt; 0) {</div><div class='del'>-                ret = -1;</div><div class='del'>-                goto err;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (!addrstr) {</div><div class='del'>-                ret = -1;</div><div class='del'>-                goto err;</div><div class='del'>-        }</div><div class='add'>+#ifdef IPV6_DEFAULT</div><div class='add'>+#include &lt;netconfig.h&gt;</div><div class='add'>+#endif</div><div class='ctx'> </div><div class='del'>-        addrtok = strtok_r (addrstr, ",", &amp;svptr);</div><div class='del'>-        while (addrtok) {</div><div class='add'>+#include "xdr-rpcclnt.h"</div><div class='add'>+#include &lt;glusterfs/glusterfs-acl.h&gt;</div><div class='ctx'> </div><div class='del'>-#ifdef FNM_CASEFOLD</div><div class='del'>-                ret = fnmatch (addrtok, clstr, FNM_CASEFOLD);</div><div class='del'>-#else</div><div class='del'>-                ret = fnmatch (addrtok, clstr, 0);</div><div class='add'>+#ifndef PTHREAD_MUTEX_ADAPTIVE_NP</div><div class='add'>+#define PTHREAD_MUTEX_ADAPTIVE_NP PTHREAD_MUTEX_DEFAULT</div><div class='ctx'> #endif</div><div class='del'>-                if (ret == 0)</div><div class='del'>-                        goto err;</div><div class='ctx'> </div><div class='del'>-                addrtok = strtok_r (NULL, ",", &amp;svptr);</div><div class='del'>-        }</div><div class='add'>+static struct rpcsvc_program gluster_dump_prog;</div><div class='ctx'> </div><div class='del'>-        ret = -1;</div><div class='del'>-err:</div><div class='del'>-</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='add'>+#define rpcsvc_alloc_request(svc, request)                                     \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        request = (rpcsvc_request_t *)mem_get((svc)-&gt;rxpool);                  \</div><div class='add'>+        if (request) {                                                         \</div><div class='add'>+            memset(request, 0, sizeof(rpcsvc_request_t));                      \</div><div class='add'>+        } else {                                                               \</div><div class='add'>+            gf_log("rpcsvc", GF_LOG_ERROR,                                     \</div><div class='add'>+                   "error getting memory for rpc request");                    \</div><div class='add'>+        }                                                                      \</div><div class='add'>+    } while (0)</div><div class='ctx'> </div><div class='add'>+rpcsvc_listener_t *</div><div class='add'>+rpcsvc_get_listener(rpcsvc_t *svc, uint16_t port, rpc_transport_t *trans);</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-rpcsvc_transport_peer_check_allow (dict_t *options, char *volname, char *clstr)</div><div class='del'>-{</div><div class='del'>-        int     ret = RPCSVC_AUTH_DONTCARE;</div><div class='del'>-        char    *srchstr = NULL;</div><div class='del'>-        char    globalrule[] = "rpc-auth.addr.allow";</div><div class='del'>-</div><div class='del'>-        if ((!options) || (!clstr))</div><div class='del'>-                return ret;</div><div class='add'>+rpcsvc_notify(rpc_transport_t *trans, void *mydata, rpc_transport_event_t event,</div><div class='add'>+              void *data, ...);</div><div class='add'>+void *</div><div class='add'>+rpcsvc_request_handler(void *arg);</div><div class='ctx'> </div><div class='del'>-        /* If volname is NULL, then we're searching for the general rule to</div><div class='del'>-         * determine the current address in clstr is allowed or not for all</div><div class='del'>-         * subvolumes.</div><div class='del'>-         */</div><div class='del'>-        if (volname) {</div><div class='del'>-                ret = gf_asprintf (&amp;srchstr, "rpc-auth.addr.%s.allow", volname);</div><div class='del'>-                if (ret == -1) {</div><div class='del'>-                        gf_log (GF_RPCSVC, GF_LOG_ERROR, "asprintf failed");</div><div class='del'>-                        ret = RPCSVC_AUTH_DONTCARE;</div><div class='del'>-                        goto out;</div><div class='del'>-                }</div><div class='del'>-        } else</div><div class='del'>-                srchstr = globalrule;</div><div class='add'>+static int</div><div class='add'>+rpcsvc_match_subnet_v4(const char *addrtok, const char *ipaddr);</div><div class='ctx'> </div><div class='del'>-        ret = rpcsvc_transport_peer_check_search (options, srchstr, clstr);</div><div class='del'>-        if (volname)</div><div class='del'>-                GF_FREE (srchstr);</div><div class='add'>+static void</div><div class='add'>+rpcsvc_toggle_queue_status(rpcsvc_program_t *prog,</div><div class='add'>+                           rpcsvc_request_queue_t *queue,</div><div class='add'>+                           unsigned long status[])</div><div class='add'>+{</div><div class='add'>+    unsigned queue_index = queue - prog-&gt;request_queue;</div><div class='ctx'> </div><div class='del'>-        if (ret == 0)</div><div class='del'>-                ret = RPCSVC_AUTH_ACCEPT;</div><div class='del'>-        else</div><div class='del'>-                ret = RPCSVC_AUTH_DONTCARE;</div><div class='del'>-out:</div><div class='del'>-        return ret;</div><div class='add'>+    status[queue_index / __BITS_PER_LONG] ^= (1UL &lt;&lt; (queue_index %</div><div class='add'>+                                                      __BITS_PER_LONG));</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-rpcsvc_transport_peer_check_reject (dict_t *options, char *volname, char *clstr)</div><div class='add'>+rpcsvc_get_free_queue_index(rpcsvc_program_t *prog)</div><div class='ctx'> {</div><div class='del'>-        int     ret = RPCSVC_AUTH_DONTCARE;</div><div class='del'>-        char    *srchstr = NULL;</div><div class='del'>-        char    generalrule[] = "rpc-auth.addr.reject";</div><div class='del'>-</div><div class='del'>-        if ((!options) || (!clstr))</div><div class='del'>-                return ret;</div><div class='add'>+    unsigned i, j = 0;</div><div class='ctx'> </div><div class='del'>-        if (volname) {</div><div class='del'>-                ret = gf_asprintf (&amp;srchstr, "rpc-auth.addr.%s.reject", volname);</div><div class='del'>-                if (ret == -1) {</div><div class='del'>-                        gf_log (GF_RPCSVC, GF_LOG_ERROR, "asprintf failed");</div><div class='del'>-                        ret = RPCSVC_AUTH_REJECT;</div><div class='del'>-                        goto out;</div><div class='del'>-                }</div><div class='del'>-        } else</div><div class='del'>-                srchstr = generalrule;</div><div class='add'>+    for (i = 0; i &lt; EVENT_MAX_THREADS / __BITS_PER_LONG; i++)</div><div class='add'>+        if (prog-&gt;request_queue_status[i] != ULONG_MAX) {</div><div class='add'>+            j = __builtin_ctzl(~prog-&gt;request_queue_status[i]);</div><div class='add'>+            break;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-        ret = rpcsvc_transport_peer_check_search (options, srchstr, clstr);</div><div class='del'>-        if (volname)</div><div class='del'>-                GF_FREE (srchstr);</div><div class='add'>+    if (i == EVENT_MAX_THREADS / __BITS_PER_LONG)</div><div class='add'>+        return -1;</div><div class='ctx'> </div><div class='del'>-        if (ret == 0)</div><div class='del'>-                ret = RPCSVC_AUTH_REJECT;</div><div class='del'>-        else</div><div class='del'>-                ret = RPCSVC_AUTH_DONTCARE;</div><div class='del'>-out:</div><div class='del'>-        return ret;</div><div class='add'>+    prog-&gt;request_queue_status[i] |= (1UL &lt;&lt; j);</div><div class='add'>+    return i * __BITS_PER_LONG + j;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='del'>-/* This function tests the results of the allow rule and the reject rule to</div><div class='del'>- * combine them into a single result that can be used to determine if the</div><div class='del'>- * connection should be allowed to proceed.</div><div class='del'>- * Heres the test matrix we need to follow in this function.</div><div class='del'>- *</div><div class='del'>- * A -  Allow, the result of the allow test. Never returns R.</div><div class='del'>- * R - Reject, result of the reject test. Never returns A.</div><div class='del'>- * Both can return D or dont care if no rule was given.</div><div class='del'>- *</div><div class='del'>- * | @allow | @reject | Result |</div><div class='del'>- * |    A   |   R     | R      |</div><div class='del'>- * |    D   |   D     | D      |</div><div class='del'>- * |    A   |   D     | A      |</div><div class='del'>- * |    D   |   R     | R      |</div><div class='del'>- */</div><div class='del'>-int</div><div class='del'>-rpcsvc_combine_allow_reject_volume_check (int allow, int reject)</div><div class='add'>+rpcsvc_notify_wrapper_t *</div><div class='add'>+rpcsvc_notify_wrapper_alloc(void)</div><div class='ctx'> {</div><div class='del'>-        int     final = RPCSVC_AUTH_REJECT;</div><div class='add'>+    rpcsvc_notify_wrapper_t *wrapper = NULL;</div><div class='ctx'> </div><div class='del'>-        /* If allowed rule allows but reject rule rejects, we stay cautious</div><div class='del'>-         * and reject. */</div><div class='del'>-        if ((allow == RPCSVC_AUTH_ACCEPT) &amp;&amp; (reject == RPCSVC_AUTH_REJECT))</div><div class='del'>-                final = RPCSVC_AUTH_REJECT;</div><div class='del'>-        /* if both are dont care, that is user did not specify for either allow</div><div class='del'>-         * or reject, we leave it up to the general rule to apply, in the hope</div><div class='del'>-         * that there is one.</div><div class='del'>-         */</div><div class='del'>-        else if ((allow == RPCSVC_AUTH_DONTCARE) &amp;&amp;</div><div class='del'>-                 (reject == RPCSVC_AUTH_DONTCARE))</div><div class='del'>-                final = RPCSVC_AUTH_DONTCARE;</div><div class='del'>-        /* If one is dont care, the other one applies. */</div><div class='del'>-        else if ((allow == RPCSVC_AUTH_ACCEPT) &amp;&amp;</div><div class='del'>-                 (reject == RPCSVC_AUTH_DONTCARE))</div><div class='del'>-                final = RPCSVC_AUTH_ACCEPT;</div><div class='del'>-        else if ((allow == RPCSVC_AUTH_DONTCARE) &amp;&amp;</div><div class='del'>-                 (reject == RPCSVC_AUTH_REJECT))</div><div class='del'>-                final = RPCSVC_AUTH_REJECT;</div><div class='add'>+    wrapper = GF_CALLOC(1, sizeof(*wrapper), gf_common_mt_rpcsvc_wrapper_t);</div><div class='add'>+    if (!wrapper) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        return final;</div><div class='add'>+    INIT_LIST_HEAD(&amp;wrapper-&gt;list);</div><div class='add'>+out:</div><div class='add'>+    return wrapper;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='del'>-/* Combines the result of the general rule test against, the specific rule</div><div class='del'>- * to determine final permission for the client's address.</div><div class='del'>- *</div><div class='del'>- * | @gen   | @spec   | Result |</div><div class='del'>- * |    A   |   A     | A      |</div><div class='del'>- * |    A   |   R     | R      |</div><div class='del'>- * |    A   |   D     | A      |</div><div class='del'>- * |    D   |   A     | A      |</div><div class='del'>- * |    D   |   R     | R      |</div><div class='del'>- * |    D   |   D     | D      |</div><div class='del'>- * |    R   |   A     | A      |</div><div class='del'>- * |    R   |   D     | R      |</div><div class='del'>- * |    R   |   R     | R      |</div><div class='del'>- */</div><div class='del'>-int</div><div class='del'>-rpcsvc_combine_gen_spec_addr_checks (int gen, int spec)</div><div class='add'>+void</div><div class='add'>+rpcsvc_listener_destroy(rpcsvc_listener_t *listener)</div><div class='ctx'> {</div><div class='del'>-        int     final = RPCSVC_AUTH_REJECT;</div><div class='add'>+    rpcsvc_t *svc = NULL;</div><div class='ctx'> </div><div class='del'>-        if ((gen == RPCSVC_AUTH_ACCEPT) &amp;&amp; (spec == RPCSVC_AUTH_ACCEPT))</div><div class='del'>-                final = RPCSVC_AUTH_ACCEPT;</div><div class='del'>-        else if ((gen == RPCSVC_AUTH_ACCEPT) &amp;&amp; (spec == RPCSVC_AUTH_REJECT))</div><div class='del'>-                final = RPCSVC_AUTH_REJECT;</div><div class='del'>-        else if ((gen == RPCSVC_AUTH_ACCEPT) &amp;&amp; (spec == RPCSVC_AUTH_DONTCARE))</div><div class='del'>-                final = RPCSVC_AUTH_ACCEPT;</div><div class='del'>-        else if ((gen == RPCSVC_AUTH_DONTCARE) &amp;&amp; (spec == RPCSVC_AUTH_ACCEPT))</div><div class='del'>-                final = RPCSVC_AUTH_ACCEPT;</div><div class='del'>-        else if ((gen == RPCSVC_AUTH_DONTCARE) &amp;&amp; (spec == RPCSVC_AUTH_REJECT))</div><div class='del'>-                final = RPCSVC_AUTH_REJECT;</div><div class='del'>-        else if ((gen == RPCSVC_AUTH_DONTCARE) &amp;&amp; (spec== RPCSVC_AUTH_DONTCARE))</div><div class='del'>-                final = RPCSVC_AUTH_DONTCARE;</div><div class='del'>-        else if ((gen == RPCSVC_AUTH_REJECT) &amp;&amp; (spec == RPCSVC_AUTH_ACCEPT))</div><div class='del'>-                final = RPCSVC_AUTH_ACCEPT;</div><div class='del'>-        else if ((gen == RPCSVC_AUTH_REJECT) &amp;&amp; (spec == RPCSVC_AUTH_DONTCARE))</div><div class='del'>-                final = RPCSVC_AUTH_REJECT;</div><div class='del'>-        else if ((gen == RPCSVC_AUTH_REJECT) &amp;&amp; (spec == RPCSVC_AUTH_REJECT))</div><div class='del'>-                final = RPCSVC_AUTH_REJECT;</div><div class='del'>-</div><div class='del'>-        return final;</div><div class='del'>-}</div><div class='add'>+    if (!listener) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='add'>+    svc = listener-&gt;svc;</div><div class='add'>+    if (!svc) {</div><div class='add'>+        goto listener_free;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='add'>+    pthread_rwlock_wrlock(&amp;svc-&gt;rpclock);</div><div class='add'>+    {</div><div class='add'>+        list_del_init(&amp;listener-&gt;list);</div><div class='add'>+    }</div><div class='add'>+    pthread_rwlock_unlock(&amp;svc-&gt;rpclock);</div><div class='ctx'> </div><div class='del'>-/* Combines the result of the general rule test against, the specific rule</div><div class='del'>- * to determine final test for the connection coming in for a given volume.</div><div class='del'>- *</div><div class='del'>- * | @gen   | @spec   | Result |</div><div class='del'>- * |    A   |   A     | A      |</div><div class='del'>- * |    A   |   R     | R      |</div><div class='del'>- * |    A   |   D     | A      |</div><div class='del'>- * |    D   |   A     | A      |</div><div class='del'>- * |    D   |   R     | R      |</div><div class='del'>- * |    D   |   D     | R      |, special case, we intentionally disallow this.</div><div class='del'>- * |    R   |   A     | A      |</div><div class='del'>- * |    R   |   D     | R      |</div><div class='del'>- * |    R   |   R     | R      |</div><div class='del'>- */</div><div class='del'>-int</div><div class='del'>-rpcsvc_combine_gen_spec_volume_checks (int gen, int spec)</div><div class='del'>-{</div><div class='del'>-        int     final = RPCSVC_AUTH_REJECT;</div><div class='del'>-</div><div class='del'>-        if ((gen == RPCSVC_AUTH_ACCEPT) &amp;&amp; (spec == RPCSVC_AUTH_ACCEPT))</div><div class='del'>-                final = RPCSVC_AUTH_ACCEPT;</div><div class='del'>-        else if ((gen == RPCSVC_AUTH_ACCEPT) &amp;&amp; (spec == RPCSVC_AUTH_REJECT))</div><div class='del'>-                final = RPCSVC_AUTH_REJECT;</div><div class='del'>-        else if ((gen == RPCSVC_AUTH_ACCEPT) &amp;&amp; (spec == RPCSVC_AUTH_DONTCARE))</div><div class='del'>-                final = RPCSVC_AUTH_ACCEPT;</div><div class='del'>-        else if ((gen == RPCSVC_AUTH_DONTCARE) &amp;&amp; (spec == RPCSVC_AUTH_ACCEPT))</div><div class='del'>-                final = RPCSVC_AUTH_ACCEPT;</div><div class='del'>-        else if ((gen == RPCSVC_AUTH_DONTCARE) &amp;&amp; (spec == RPCSVC_AUTH_REJECT))</div><div class='del'>-                final = RPCSVC_AUTH_REJECT;</div><div class='del'>-        /* On no rule, we reject. */</div><div class='del'>-        else if ((gen == RPCSVC_AUTH_DONTCARE) &amp;&amp; (spec== RPCSVC_AUTH_DONTCARE))</div><div class='del'>-                final = RPCSVC_AUTH_REJECT;</div><div class='del'>-        else if ((gen == RPCSVC_AUTH_REJECT) &amp;&amp; (spec == RPCSVC_AUTH_ACCEPT))</div><div class='del'>-                final = RPCSVC_AUTH_ACCEPT;</div><div class='del'>-        else if ((gen == RPCSVC_AUTH_REJECT) &amp;&amp; (spec == RPCSVC_AUTH_DONTCARE))</div><div class='del'>-                final = RPCSVC_AUTH_REJECT;</div><div class='del'>-        else if ((gen == RPCSVC_AUTH_REJECT) &amp;&amp; (spec == RPCSVC_AUTH_REJECT))</div><div class='del'>-                final = RPCSVC_AUTH_REJECT;</div><div class='del'>-</div><div class='del'>-        return final;</div><div class='add'>+listener_free:</div><div class='add'>+    GF_FREE(listener);</div><div class='add'>+out:</div><div class='add'>+    return;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-rpcsvc_transport_peer_check_name (dict_t *options, char *volname,</div><div class='del'>-                                  rpc_transport_t *trans)</div><div class='add'>+rpcsvc_vector_sizer</div><div class='add'>+rpcsvc_get_program_vector_sizer(rpcsvc_t *svc, uint32_t prognum,</div><div class='add'>+                                uint32_t progver, int procnum)</div><div class='ctx'> {</div><div class='del'>-        int     ret = RPCSVC_AUTH_REJECT;</div><div class='del'>-        int     aret = RPCSVC_AUTH_REJECT;</div><div class='del'>-        int     rjret = RPCSVC_AUTH_REJECT;</div><div class='del'>-        char    clstr[RPCSVC_PEER_STRLEN];</div><div class='add'>+    rpcsvc_program_t *program = NULL;</div><div class='add'>+    char found = 0;</div><div class='ctx'> </div><div class='del'>-        if (!trans)</div><div class='del'>-                return ret;</div><div class='add'>+    if (!svc)</div><div class='add'>+        return NULL;</div><div class='ctx'> </div><div class='del'>-        ret = rpc_transport_get_peername (trans, clstr, RPCSVC_PEER_STRLEN);</div><div class='del'>-        if (ret != 0) {</div><div class='del'>-                gf_log (GF_RPCSVC, GF_LOG_ERROR, "Failed to get remote addr: "</div><div class='del'>-                        "%s", gai_strerror (ret));</div><div class='del'>-                ret = RPCSVC_AUTH_REJECT;</div><div class='del'>-                goto err;</div><div class='add'>+    pthread_rwlock_rdlock(&amp;svc-&gt;rpclock);</div><div class='add'>+    {</div><div class='add'>+        /* Find the matching RPC program from registered list */</div><div class='add'>+        list_for_each_entry(program, &amp;svc-&gt;programs, program)</div><div class='add'>+        {</div><div class='add'>+            if ((program-&gt;prognum == prognum) &amp;&amp;</div><div class='add'>+                (program-&gt;progver == progver)) {</div><div class='add'>+                found = 1;</div><div class='add'>+                break;</div><div class='add'>+            }</div><div class='ctx'>         }</div><div class='add'>+    }</div><div class='add'>+    pthread_rwlock_unlock(&amp;svc-&gt;rpclock);</div><div class='ctx'> </div><div class='del'>-        aret = rpcsvc_transport_peer_check_allow (options, volname, clstr);</div><div class='del'>-        rjret = rpcsvc_transport_peer_check_reject (options, volname, clstr);</div><div class='add'>+    if (found) {</div><div class='add'>+        /* Make sure the requested procnum is supported by RPC prog */</div><div class='add'>+        if ((procnum &lt; 0) || (procnum &gt;= program-&gt;numactors)) {</div><div class='add'>+            gf_log(GF_RPCSVC, GF_LOG_ERROR,</div><div class='add'>+                   "RPC procedure %d not available for Program %s", procnum,</div><div class='add'>+                   program-&gt;progname);</div><div class='add'>+            return NULL;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-        ret = rpcsvc_combine_allow_reject_volume_check (aret, rjret);</div><div class='add'>+        /* SUCCESS: Supported procedure */</div><div class='add'>+        return program-&gt;actors[procnum].vector_sizer;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-err:</div><div class='del'>-        return ret;</div><div class='add'>+    return NULL; /* FAIL */</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-rpcsvc_transport_peer_check_addr (dict_t *options, char *volname,</div><div class='del'>-                                  rpc_transport_t *trans)</div><div class='add'>+gf_boolean_t</div><div class='add'>+rpcsvc_can_outstanding_req_be_ignored(rpcsvc_request_t *req)</div><div class='ctx'> {</div><div class='del'>-        int     ret = RPCSVC_AUTH_REJECT;</div><div class='del'>-        int     aret = RPCSVC_AUTH_DONTCARE;</div><div class='del'>-        int     rjret = RPCSVC_AUTH_REJECT;</div><div class='del'>-        char    clstr[RPCSVC_PEER_STRLEN];</div><div class='del'>-</div><div class='del'>-        if (!trans)</div><div class='del'>-                return ret;</div><div class='del'>-</div><div class='del'>-        ret = rpcsvc_transport_peeraddr (trans, clstr, RPCSVC_PEER_STRLEN, NULL,</div><div class='del'>-                                         0);</div><div class='del'>-        if (ret != 0) {</div><div class='del'>-                gf_log (GF_RPCSVC, GF_LOG_ERROR, "Failed to get remote addr: "</div><div class='del'>-                        "%s", gai_strerror (ret));</div><div class='del'>-                ret = RPCSVC_AUTH_REJECT;</div><div class='del'>-                goto err;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        aret = rpcsvc_transport_peer_check_allow (options, volname, clstr);</div><div class='del'>-        rjret = rpcsvc_transport_peer_check_reject (options, volname, clstr);</div><div class='del'>-</div><div class='del'>-        ret = rpcsvc_combine_allow_reject_volume_check (aret, rjret);</div><div class='del'>-err:</div><div class='del'>-        return ret;</div><div class='add'>+    /*</div><div class='add'>+     * If outstanding_rpc_limit is reached because of blocked locks and</div><div class='add'>+     * throttling is attempted then no unlock requests will be received. So</div><div class='add'>+     * the outstanding request count will never change i.e. it will always</div><div class='add'>+     * be equal to the limit. This also leads to ping timer expiry on</div><div class='add'>+     * client.</div><div class='add'>+     */</div><div class='add'>+</div><div class='add'>+    /*</div><div class='add'>+     * This is a hack and a necessity until grantedlock == fop completion.</div><div class='add'>+     * Ideally if we get a blocking lock request which cannot be granted</div><div class='add'>+     * right now, we should unwind the fop saying â€œrequest registered, will</div><div class='add'>+     * notify you when grantedâ€, which is very hard to implement at the</div><div class='add'>+     * moment. Until we bring in such mechanism, we will need to live with</div><div class='add'>+     * not rate-limiting INODELK/ENTRYLK/LK fops</div><div class='add'>+     */</div><div class='add'>+</div><div class='add'>+    if ((req-&gt;prognum == GLUSTER_FOP_PROGRAM) &amp;&amp;</div><div class='add'>+        (req-&gt;progver == GLUSTER_FOP_VERSION)) {</div><div class='add'>+        if ((req-&gt;procnum == GFS3_OP_INODELK) ||</div><div class='add'>+            (req-&gt;procnum == GFS3_OP_FINODELK) ||</div><div class='add'>+            (req-&gt;procnum == GFS3_OP_ENTRYLK) ||</div><div class='add'>+            (req-&gt;procnum == GFS3_OP_FENTRYLK) || (req-&gt;procnum == GFS3_OP_LK))</div><div class='add'>+            return _gf_true;</div><div class='add'>+    }</div><div class='add'>+    return _gf_false;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-rpcsvc_transport_check_volume_specific (dict_t *options, char *volname,</div><div class='del'>-                                        rpc_transport_t *trans)</div><div class='del'>-{</div><div class='del'>-        int             namechk = RPCSVC_AUTH_REJECT;</div><div class='del'>-        int             addrchk = RPCSVC_AUTH_REJECT;</div><div class='del'>-        gf_boolean_t    namelookup = _gf_true;</div><div class='del'>-        char            *namestr = NULL;</div><div class='del'>-        int             ret = 0;</div><div class='del'>-</div><div class='del'>-        if ((!options) || (!volname) || (!trans))</div><div class='del'>-                return RPCSVC_AUTH_REJECT;</div><div class='del'>-</div><div class='del'>-        /* Enabled by default */</div><div class='del'>-        if ((dict_get (options, "rpc-auth.addr.namelookup"))) {</div><div class='del'>-                ret = dict_get_str (options, "rpc-auth.addr.namelookup"</div><div class='del'>-                                    , &amp;namestr);</div><div class='del'>-                if (ret == 0) {</div><div class='del'>-                        ret = gf_string2boolean (namestr, &amp;namelookup);</div><div class='del'>-                        if (ret)</div><div class='del'>-                                gf_log ("rpcsvc", GF_LOG_DEBUG,</div><div class='del'>-                                        "wrong option %s given for "</div><div class='del'>-                                        "'namelookup'", namestr);</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        /* We need two separate checks because the rules with addresses in them</div><div class='del'>-         * can be network addresses which can be general and names can be</div><div class='del'>-         * specific which will over-ride the network address rules.</div><div class='del'>-         */</div><div class='del'>-        if (namelookup)</div><div class='del'>-                namechk = rpcsvc_transport_peer_check_name (options, volname,</div><div class='del'>-                                                            trans);</div><div class='del'>-        addrchk = rpcsvc_transport_peer_check_addr (options, volname, trans);</div><div class='del'>-</div><div class='del'>-        if (namelookup)</div><div class='del'>-                ret = rpcsvc_combine_gen_spec_addr_checks (addrchk, namechk);</div><div class='del'>-        else</div><div class='del'>-                ret = addrchk;</div><div class='del'>-</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='add'>+rpcsvc_request_outstanding(rpcsvc_request_t *req, int delta)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int old_count = 0;</div><div class='add'>+    int new_count = 0;</div><div class='add'>+    int limit = 0;</div><div class='add'>+    gf_boolean_t throttle = _gf_false;</div><div class='ctx'> </div><div class='add'>+    if (!req)</div><div class='add'>+        goto out;</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-rpcsvc_transport_check_volume_general (dict_t *options, rpc_transport_t *trans)</div><div class='del'>-{</div><div class='del'>-        int             addrchk = RPCSVC_AUTH_REJECT;</div><div class='del'>-        int             namechk = RPCSVC_AUTH_REJECT;</div><div class='del'>-        gf_boolean_t    namelookup = _gf_true;</div><div class='del'>-        char            *namestr = NULL;</div><div class='del'>-        int             ret = 0;</div><div class='add'>+    throttle = rpcsvc_get_throttle(req-&gt;svc);</div><div class='add'>+    if (!throttle) {</div><div class='add'>+        ret = 0;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        if ((!options) || (!trans))</div><div class='del'>-                return RPCSVC_AUTH_REJECT;</div><div class='add'>+    if (rpcsvc_can_outstanding_req_be_ignored(req)) {</div><div class='add'>+        ret = 0;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        /* Enabled by default */</div><div class='del'>-        if ((dict_get (options, "rpc-auth.addr.namelookup"))) {</div><div class='del'>-                ret = dict_get_str (options, "rpc-auth.addr.namelookup"</div><div class='del'>-                                    , &amp;namestr);</div><div class='del'>-                if (!ret) {</div><div class='del'>-                        ret = gf_string2boolean (namestr, &amp;namelookup);</div><div class='del'>-                        if (ret)</div><div class='del'>-                                gf_log ("rpcsvc", GF_LOG_DEBUG,</div><div class='del'>-                                        "wrong option %s given for "</div><div class='del'>-                                        "'namelookup'", namestr);</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='add'>+    pthread_mutex_lock(&amp;req-&gt;trans-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        limit = req-&gt;svc-&gt;outstanding_rpc_limit;</div><div class='add'>+        if (!limit)</div><div class='add'>+            goto unlock;</div><div class='ctx'> </div><div class='del'>-        /* We need two separate checks because the rules with addresses in them</div><div class='del'>-         * can be network addresses which can be general and names can be</div><div class='del'>-         * specific which will over-ride the network address rules.</div><div class='del'>-         */</div><div class='del'>-        if (namelookup)</div><div class='del'>-                namechk = rpcsvc_transport_peer_check_name (options, NULL, </div><div class='del'>-                                                            trans);</div><div class='add'>+        old_count = req-&gt;trans-&gt;outstanding_rpc_count;</div><div class='add'>+        req-&gt;trans-&gt;outstanding_rpc_count += delta;</div><div class='add'>+        new_count = req-&gt;trans-&gt;outstanding_rpc_count;</div><div class='ctx'> </div><div class='del'>-        addrchk = rpcsvc_transport_peer_check_addr (options, NULL, trans);</div><div class='add'>+        if (old_count &lt;= limit &amp;&amp; new_count &gt; limit)</div><div class='add'>+            ret = rpc_transport_throttle(req-&gt;trans, _gf_true);</div><div class='ctx'> </div><div class='del'>-        if (namelookup)</div><div class='del'>-                ret = rpcsvc_combine_gen_spec_addr_checks (addrchk, namechk);</div><div class='del'>-        else</div><div class='del'>-                ret = addrchk;</div><div class='add'>+        if (old_count &gt; limit &amp;&amp; new_count &lt;= limit)</div><div class='add'>+            ret = rpc_transport_throttle(req-&gt;trans, _gf_false);</div><div class='add'>+    }</div><div class='add'>+unlock:</div><div class='add'>+    pthread_mutex_unlock(&amp;req-&gt;trans-&gt;lock);</div><div class='ctx'> </div><div class='del'>-        return ret;</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-rpcsvc_transport_peer_check (dict_t *options, char *volname,</div><div class='del'>-                             rpc_transport_t *trans)</div><div class='add'>+/* This needs to change to returning errors, since</div><div class='add'>+ * we need to return RPC specific error messages when some</div><div class='add'>+ * of the pointers below are NULL.</div><div class='add'>+ */</div><div class='add'>+rpcsvc_actor_t *</div><div class='add'>+rpcsvc_program_actor(rpcsvc_request_t *req)</div><div class='ctx'> {</div><div class='del'>-        int     general_chk = RPCSVC_AUTH_REJECT;</div><div class='del'>-        int     specific_chk = RPCSVC_AUTH_REJECT;</div><div class='del'>-</div><div class='del'>-        if ((!options) || (!volname) || (!trans))</div><div class='del'>-                return RPCSVC_AUTH_REJECT;</div><div class='add'>+    rpcsvc_program_t *program = NULL;</div><div class='add'>+    int err = SYSTEM_ERR;</div><div class='add'>+    rpcsvc_actor_t *actor = NULL;</div><div class='add'>+    rpcsvc_t *svc = NULL;</div><div class='add'>+    char found = 0;</div><div class='add'>+    char *peername = NULL;</div><div class='add'>+</div><div class='add'>+    if (!req)</div><div class='add'>+        goto err;</div><div class='add'>+</div><div class='add'>+    svc = req-&gt;svc;</div><div class='add'>+    peername = req-&gt;trans-&gt;peerinfo.identifier;</div><div class='add'>+    pthread_rwlock_rdlock(&amp;svc-&gt;rpclock);</div><div class='add'>+    {</div><div class='add'>+        list_for_each_entry(program, &amp;svc-&gt;programs, program)</div><div class='add'>+        {</div><div class='add'>+            if (program-&gt;prognum == req-&gt;prognum) {</div><div class='add'>+                err = PROG_MISMATCH;</div><div class='add'>+            }</div><div class='ctx'> </div><div class='del'>-        general_chk = rpcsvc_transport_check_volume_general (options, trans);</div><div class='del'>-        specific_chk = rpcsvc_transport_check_volume_specific (options, volname,</div><div class='del'>-                                                               trans);</div><div class='add'>+            if ((program-&gt;prognum == req-&gt;prognum) &amp;&amp;</div><div class='add'>+                (program-&gt;progver == req-&gt;progver)) {</div><div class='add'>+                found = 1;</div><div class='add'>+                break;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    pthread_rwlock_unlock(&amp;svc-&gt;rpclock);</div><div class='add'>+</div><div class='add'>+    if (!found) {</div><div class='add'>+        if (err != PROG_MISMATCH) {</div><div class='add'>+            /* log in DEBUG when nfs clients try to see if</div><div class='add'>+             * ACL requests are accepted by nfs server</div><div class='add'>+             */</div><div class='add'>+            gf_log(</div><div class='add'>+                GF_RPCSVC,</div><div class='add'>+                (req-&gt;prognum == ACL_PROGRAM) ? GF_LOG_DEBUG : GF_LOG_WARNING,</div><div class='add'>+                "RPC program not available (req %u %u) for %s", req-&gt;prognum,</div><div class='add'>+                req-&gt;progver, peername);</div><div class='add'>+            err = PROG_UNAVAIL;</div><div class='add'>+            goto err;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        gf_log(GF_RPCSVC, GF_LOG_WARNING,</div><div class='add'>+               "RPC program version not available (req %u %u) for %s",</div><div class='add'>+               req-&gt;prognum, req-&gt;progver, peername);</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+    req-&gt;prog = program;</div><div class='add'>+    if (!program-&gt;actors) {</div><div class='add'>+        gf_log(GF_RPCSVC, GF_LOG_WARNING,</div><div class='add'>+               "RPC Actor not found for program %s %d for %s",</div><div class='add'>+               program-&gt;progname, program-&gt;prognum, peername);</div><div class='add'>+        err = SYSTEM_ERR;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if ((req-&gt;procnum &lt; 0) || (req-&gt;procnum &gt;= program-&gt;numactors)) {</div><div class='add'>+        gf_log(GF_RPCSVC, GF_LOG_ERROR,</div><div class='add'>+               "RPC Program procedure not"</div><div class='add'>+               " available for procedure %d in %s for  %s",</div><div class='add'>+               req-&gt;procnum, program-&gt;progname, peername);</div><div class='add'>+        err = PROC_UNAVAIL;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    actor = &amp;program-&gt;actors[req-&gt;procnum];</div><div class='add'>+    if (!actor-&gt;actor) {</div><div class='add'>+        gf_log(GF_RPCSVC, GF_LOG_ERROR,</div><div class='add'>+               "RPC Program procedure not"</div><div class='add'>+               " available for procedure %d in %s for %s",</div><div class='add'>+               req-&gt;procnum, program-&gt;progname, peername);</div><div class='add'>+        err = PROC_UNAVAIL;</div><div class='add'>+        actor = NULL;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (svc-&gt;xl-&gt;ctx-&gt;measure_latency) {</div><div class='add'>+        timespec_now(&amp;req-&gt;begin);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    req-&gt;ownthread = program-&gt;ownthread;</div><div class='add'>+    req-&gt;synctask = program-&gt;synctask;</div><div class='add'>+</div><div class='add'>+    err = SUCCESS;</div><div class='add'>+    gf_log(GF_RPCSVC, GF_LOG_TRACE, "Actor found: %s - %s for %s",</div><div class='add'>+           program-&gt;progname, actor-&gt;procname, peername);</div><div class='add'>+err:</div><div class='add'>+    if (req)</div><div class='add'>+        req-&gt;rpc_err = err;</div><div class='ctx'> </div><div class='del'>-        return rpcsvc_combine_gen_spec_volume_checks (general_chk,specific_chk);</div><div class='add'>+    return actor;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='del'>-char *</div><div class='del'>-rpcsvc_volume_allowed (dict_t *options, char *volname)</div><div class='add'>+/* this procedure can only pass 4 arguments to registered notifyfn. To send more</div><div class='add'>+ * arguments call wrapper-&gt;notify directly.</div><div class='add'>+ */</div><div class='add'>+static void</div><div class='add'>+rpcsvc_program_notify(rpcsvc_listener_t *listener, rpcsvc_event_t event,</div><div class='add'>+                      void *data)</div><div class='ctx'> {</div><div class='del'>-        char    globalrule[] = "rpc-auth.addr.allow";</div><div class='del'>-        char    *srchstr = NULL;</div><div class='del'>-        char    *addrstr = NULL;</div><div class='del'>-        int     ret = -1;</div><div class='add'>+    rpcsvc_notify_wrapper_t *wrapper = NULL;</div><div class='ctx'> </div><div class='del'>-        if ((!options) || (!volname))</div><div class='del'>-                return NULL;</div><div class='add'>+    if (!listener) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        ret = gf_asprintf (&amp;srchstr, "rpc-auth.addr.%s.allow", volname);</div><div class='del'>-        if (ret == -1) {</div><div class='del'>-                gf_log (GF_RPCSVC, GF_LOG_ERROR, "asprintf failed");</div><div class='del'>-                goto out;</div><div class='add'>+    list_for_each_entry(wrapper, &amp;listener-&gt;svc-&gt;notify, list)</div><div class='add'>+    {</div><div class='add'>+        if (wrapper-&gt;notify) {</div><div class='add'>+            wrapper-&gt;notify(listener-&gt;svc, wrapper-&gt;data, event, data);</div><div class='ctx'>         }</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        if (!dict_get (options, srchstr)) {</div><div class='del'>-                GF_FREE (srchstr);</div><div class='del'>-                srchstr = globalrule;</div><div class='del'>-                ret = dict_get_str (options, srchstr, &amp;addrstr);</div><div class='del'>-                if (ret)</div><div class='del'>-                        gf_log ("rpcsvc", GF_LOG_DEBUG,</div><div class='del'>-                                "failed to get the string %s", srchstr);</div><div class='del'>-        } else {</div><div class='del'>-                ret = dict_get_str (options, srchstr, &amp;addrstr);</div><div class='del'>-                if (ret)</div><div class='del'>-                        gf_log ("rpcsvc", GF_LOG_DEBUG,</div><div class='del'>-                                "failed to get the string %s", srchstr);</div><div class='del'>-                GF_FREE (srchstr);</div><div class='del'>-        }</div><div class='ctx'> out:</div><div class='del'>-        return addrstr;</div><div class='add'>+    return;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-rpcsvc_notify (rpc_transport_t *trans, void *mydata,</div><div class='del'>-               rpc_transport_event_t event, void *data, ...);</div><div class='del'>-</div><div class='del'>-rpcsvc_notify_wrapper_t *</div><div class='del'>-rpcsvc_notify_wrapper_alloc (void)</div><div class='add'>+static int</div><div class='add'>+rpcsvc_accept(rpcsvc_t *svc, rpc_transport_t *listen_trans,</div><div class='add'>+              rpc_transport_t *new_trans)</div><div class='ctx'> {</div><div class='del'>-        rpcsvc_notify_wrapper_t *wrapper = NULL;</div><div class='add'>+    rpcsvc_listener_t *listener = NULL;</div><div class='add'>+    int32_t ret = -1;</div><div class='ctx'> </div><div class='del'>-        wrapper = GF_CALLOC (1, sizeof (*wrapper), gf_common_mt_rpcsvc_wrapper_t);</div><div class='del'>-        if (!wrapper) {</div><div class='del'>-                gf_log (GF_RPCSVC, GF_LOG_ERROR, "memory allocation failed");</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='add'>+    listener = rpcsvc_get_listener(svc, -1, listen_trans);</div><div class='add'>+    if (listener == NULL) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        INIT_LIST_HEAD (&amp;wrapper-&gt;list);</div><div class='add'>+    rpcsvc_program_notify(listener, RPCSVC_EVENT_ACCEPT, new_trans);</div><div class='add'>+    ret = 0;</div><div class='ctx'> out:</div><div class='del'>-        return wrapper;</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> void</div><div class='del'>-rpcsvc_listener_destroy (rpcsvc_listener_t *listener)</div><div class='add'>+rpcsvc_request_destroy(rpcsvc_request_t *req)</div><div class='ctx'> {</div><div class='del'>-        rpcsvc_t *svc = NULL;</div><div class='add'>+    if (!req) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        if (!listener) {</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='add'>+    if (req-&gt;iobref) {</div><div class='add'>+        iobref_unref(req-&gt;iobref);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        svc = listener-&gt;svc;</div><div class='del'>-        if (!svc) {</div><div class='del'>-                goto listener_free;</div><div class='del'>-        }</div><div class='add'>+    /* This marks the "end" of an RPC request. Reply is</div><div class='add'>+       completely written to the socket and is on the way</div><div class='add'>+       to the client. It is time to decrement the</div><div class='add'>+       outstanding request counter by 1.</div><div class='add'>+    */</div><div class='add'>+    if (req-&gt;prognum)  // Only for initialized requests</div><div class='add'>+        rpcsvc_request_outstanding(req, -1);</div><div class='ctx'> </div><div class='del'>-        pthread_mutex_lock (&amp;svc-&gt;rpclock);</div><div class='del'>-        {</div><div class='del'>-                list_del_init (&amp;listener-&gt;list);</div><div class='del'>-        }</div><div class='del'>-        pthread_mutex_unlock (&amp;svc-&gt;rpclock);</div><div class='add'>+    rpc_transport_unref(req-&gt;trans);</div><div class='ctx'> </div><div class='del'>-listener_free:</div><div class='del'>-        GF_FREE (listener);</div><div class='del'>-out:</div><div class='del'>-        return;</div><div class='del'>-}</div><div class='add'>+    GF_FREE(req-&gt;auxgidlarge);</div><div class='ctx'> </div><div class='add'>+    mem_put(req);</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-rpcsvc_conn_privport_check (rpcsvc_t *svc, char *volname,</div><div class='del'>-                            rpc_transport_t *trans)</div><div class='del'>-{</div><div class='del'>-        struct sockaddr_storage sa  = {0, };</div><div class='del'>-        int                     ret = RPCSVC_AUTH_REJECT;</div><div class='del'>-        socklen_t               sasize = sizeof (sa);</div><div class='del'>-        char                    *srchstr = NULL;</div><div class='del'>-        char                    *valstr = NULL;</div><div class='del'>-        int                     globalinsecure = RPCSVC_AUTH_REJECT;</div><div class='del'>-        int                     exportinsecure = RPCSVC_AUTH_DONTCARE;</div><div class='del'>-        uint16_t                port = 0;</div><div class='del'>-        gf_boolean_t            insecure = _gf_false;</div><div class='del'>-</div><div class='del'>-        if ((!svc) || (!volname) || (!trans))</div><div class='del'>-                return ret;</div><div class='del'>-</div><div class='del'>-        ret = rpcsvc_transport_peeraddr (trans, NULL, 0, &amp;sa,</div><div class='del'>-                                         sasize);</div><div class='del'>-        if (ret != 0) {</div><div class='del'>-                gf_log (GF_RPCSVC, GF_LOG_ERROR, "Failed to get peer addr: %s",</div><div class='del'>-                        gai_strerror (ret));</div><div class='del'>-                ret = RPCSVC_AUTH_REJECT;</div><div class='del'>-                goto err;</div><div class='del'>-        }</div><div class='add'>+out:</div><div class='add'>+    return;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        if (sa.ss_family == AF_INET) {</div><div class='del'>-                port = ((struct sockaddr_in *)&amp;sa)-&gt;sin_port;</div><div class='del'>-        } else {</div><div class='del'>-                port = ((struct sockaddr_in6 *)&amp;sa)-&gt;sin6_port;</div><div class='del'>-        }</div><div class='add'>+rpcsvc_request_t *</div><div class='add'>+rpcsvc_request_init(rpcsvc_t *svc, rpc_transport_t *trans,</div><div class='add'>+                    struct rpc_msg *callmsg, struct iovec progmsg,</div><div class='add'>+                    rpc_transport_pollin_t *msg, rpcsvc_request_t *req)</div><div class='add'>+{</div><div class='add'>+    int i = 0;</div><div class='add'>+</div><div class='add'>+    if ((!trans) || (!callmsg) || (!req) || (!msg))</div><div class='add'>+        return NULL;</div><div class='add'>+</div><div class='add'>+    /* We start a RPC request as always denied. */</div><div class='add'>+    req-&gt;rpc_status = MSG_DENIED;</div><div class='add'>+    req-&gt;xid = rpc_call_xid(callmsg);</div><div class='add'>+    req-&gt;prognum = rpc_call_program(callmsg);</div><div class='add'>+    req-&gt;progver = rpc_call_progver(callmsg);</div><div class='add'>+    req-&gt;procnum = rpc_call_progproc(callmsg);</div><div class='add'>+    req-&gt;trans = rpc_transport_ref(trans);</div><div class='add'>+    req-&gt;count = msg-&gt;count;</div><div class='add'>+    req-&gt;msg[0] = progmsg;</div><div class='add'>+    req-&gt;iobref = iobref_ref(msg-&gt;iobref);</div><div class='add'>+    if (msg-&gt;vectored) {</div><div class='add'>+        /* msg-&gt;vector[MAX_IOVEC] is defined in structure. prevent a</div><div class='add'>+           out of bound access */</div><div class='add'>+        for (i = 1; i &lt; min(msg-&gt;count, MAX_IOVEC); i++) {</div><div class='add'>+            req-&gt;msg[i] = msg-&gt;vector[i];</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    req-&gt;svc = svc;</div><div class='add'>+    req-&gt;trans_private = msg-&gt;private;</div><div class='add'>+</div><div class='add'>+    INIT_LIST_HEAD(&amp;req-&gt;txlist);</div><div class='add'>+    INIT_LIST_HEAD(&amp;req-&gt;request_list);</div><div class='add'>+    req-&gt;payloadsize = 0;</div><div class='add'>+</div><div class='add'>+    /* By this time, the data bytes for the auth scheme would have already</div><div class='add'>+     * been copied into the required sections of the req structure,</div><div class='add'>+     * we just need to fill in the meta-data about it now.</div><div class='add'>+     */</div><div class='add'>+    rpcsvc_auth_request_init(req, callmsg);</div><div class='add'>+    return req;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        gf_log (GF_RPCSVC, GF_LOG_TRACE, "Client port: %d", (int)port);</div><div class='del'>-        /* If the port is already a privileged one, dont bother with checking</div><div class='del'>-         * options.</div><div class='add'>+rpcsvc_request_t *</div><div class='add'>+rpcsvc_request_create(rpcsvc_t *svc, rpc_transport_t *trans,</div><div class='add'>+                      rpc_transport_pollin_t *msg)</div><div class='add'>+{</div><div class='add'>+    char *msgbuf = NULL;</div><div class='add'>+    struct rpc_msg rpcmsg;</div><div class='add'>+    struct iovec progmsg; /* RPC Program payload */</div><div class='add'>+    rpcsvc_request_t *req = NULL;</div><div class='add'>+    size_t msglen = 0;</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    if (!svc || !trans || !svc-&gt;rxpool)</div><div class='add'>+        return NULL;</div><div class='add'>+</div><div class='add'>+    /* We need to allocate the request before actually calling</div><div class='add'>+     * rpcsvc_request_init on the request so that we, can fill the auth</div><div class='add'>+     * data directly into the request structure from the message iobuf.</div><div class='add'>+     * This avoids a need to keep a temp buffer into which the auth data</div><div class='add'>+     * would've been copied otherwise.</div><div class='add'>+     */</div><div class='add'>+    rpcsvc_alloc_request(svc, req);</div><div class='add'>+    if (!req) {</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    msgbuf = msg-&gt;vector[0].iov_base;</div><div class='add'>+    msglen = msg-&gt;vector[0].iov_len;</div><div class='add'>+</div><div class='add'>+    ret = xdr_to_rpc_call(msgbuf, msglen, &amp;rpcmsg, &amp;progmsg, req-&gt;cred.authdata,</div><div class='add'>+                          req-&gt;verf.authdata);</div><div class='add'>+</div><div class='add'>+    if (ret == -1) {</div><div class='add'>+        gf_log(GF_RPCSVC, GF_LOG_WARNING, "RPC call decoding failed");</div><div class='add'>+        rpcsvc_request_seterr(req, GARBAGE_ARGS);</div><div class='add'>+        req-&gt;trans = rpc_transport_ref(trans);</div><div class='add'>+        req-&gt;svc = svc;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = -1;</div><div class='add'>+    rpcsvc_request_init(svc, trans, &amp;rpcmsg, progmsg, msg, req);</div><div class='add'>+</div><div class='add'>+    gf_log(GF_RPCSVC, GF_LOG_TRACE,</div><div class='add'>+           "received rpc-message "</div><div class='add'>+           "(XID: 0x%" GF_PRI_RPC_XID ", Ver: %" GF_PRI_RPC_VERSION</div><div class='add'>+           ", Program: %" GF_PRI_RPC_PROG_ID</div><div class='add'>+           ", "</div><div class='add'>+           "ProgVers: %" GF_PRI_RPC_PROG_VERS ", Proc: %" GF_PRI_RPC_PROC</div><div class='add'>+           ") "</div><div class='add'>+           "from rpc-transport (%s)",</div><div class='add'>+           rpc_call_xid(&amp;rpcmsg), rpc_call_rpcvers(&amp;rpcmsg),</div><div class='add'>+           rpc_call_program(&amp;rpcmsg), rpc_call_progver(&amp;rpcmsg),</div><div class='add'>+           rpc_call_progproc(&amp;rpcmsg), trans-&gt;name);</div><div class='add'>+</div><div class='add'>+    /* We just received a new request from the wire. Account for</div><div class='add'>+       it in the outsanding request counter to make sure we don't</div><div class='add'>+       ingest too many concurrent requests from the same client.</div><div class='add'>+    */</div><div class='add'>+    if (req-&gt;prognum)  // Only for initialized requests</div><div class='add'>+        ret = rpcsvc_request_outstanding(req, +1);</div><div class='add'>+</div><div class='add'>+    if (rpc_call_rpcvers(&amp;rpcmsg) != 2) {</div><div class='add'>+        /* LOG- TODO: print rpc version, also print the peerinfo</div><div class='add'>+           from transport */</div><div class='add'>+        gf_log(GF_RPCSVC, GF_LOG_ERROR,</div><div class='add'>+               "RPC version not supported "</div><div class='add'>+               "(XID: 0x%" GF_PRI_RPC_XID ", Ver: %" GF_PRI_RPC_VERSION</div><div class='add'>+               ", Program: %" GF_PRI_RPC_PROG_ID</div><div class='add'>+               ", "</div><div class='add'>+               "ProgVers: %" GF_PRI_RPC_PROG_VERS ", Proc: %" GF_PRI_RPC_PROC</div><div class='add'>+               ") "</div><div class='add'>+               "from trans (%s)",</div><div class='add'>+               rpc_call_xid(&amp;rpcmsg), rpc_call_rpcvers(&amp;rpcmsg),</div><div class='add'>+               rpc_call_program(&amp;rpcmsg), rpc_call_progver(&amp;rpcmsg),</div><div class='add'>+               rpc_call_progproc(&amp;rpcmsg), trans-&gt;name);</div><div class='add'>+        rpcsvc_request_seterr(req, RPC_MISMATCH);</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = rpcsvc_authenticate(req);</div><div class='add'>+    if (ret == RPCSVC_AUTH_REJECT) {</div><div class='add'>+        /* No need to set auth_err, that is the responsibility of</div><div class='add'>+         * the authentication handler since only that know what exact</div><div class='add'>+         * error happened.</div><div class='ctx'>          */</div><div class='del'>-        if (port &lt;= 1024) {</div><div class='del'>-                ret = RPCSVC_AUTH_ACCEPT;</div><div class='del'>-                goto err;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        /* Disabled by default */</div><div class='del'>-        if ((dict_get (svc-&gt;options, "rpc-auth.ports.insecure"))) {</div><div class='del'>-                ret = dict_get_str (svc-&gt;options, "rpc-auth.ports.insecure"</div><div class='del'>-                                    , &amp;srchstr);</div><div class='del'>-                if (ret == 0) {</div><div class='del'>-                        ret = gf_string2boolean (srchstr, &amp;insecure);</div><div class='del'>-                        if (ret == 0) {</div><div class='del'>-                                if (insecure == _gf_true)</div><div class='del'>-                                        globalinsecure = RPCSVC_AUTH_ACCEPT;</div><div class='del'>-                        } else</div><div class='del'>-                                gf_log (GF_RPCSVC, GF_LOG_ERROR, "Failed to"</div><div class='del'>-                                        " read rpc-auth.ports.insecure value");</div><div class='del'>-                } else</div><div class='del'>-                        gf_log (GF_RPCSVC, GF_LOG_ERROR, "Failed to"</div><div class='del'>-                                " read rpc-auth.ports.insecure value");</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        /* Disabled by default */</div><div class='del'>-        ret = gf_asprintf (&amp;srchstr, "rpc-auth.ports.%s.insecure", volname);</div><div class='del'>-        if (ret == -1) {</div><div class='del'>-                gf_log (GF_RPCSVC, GF_LOG_ERROR, "asprintf failed");</div><div class='del'>-                ret = RPCSVC_AUTH_REJECT;</div><div class='del'>-                goto err;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (dict_get (svc-&gt;options, srchstr)) {</div><div class='del'>-                ret = dict_get_str (svc-&gt;options, srchstr, &amp;valstr);</div><div class='del'>-                if (ret == 0) {</div><div class='del'>-                        ret = gf_string2boolean (srchstr, &amp;insecure);</div><div class='del'>-                        if (ret == 0) {</div><div class='del'>-                                if (insecure == _gf_true)</div><div class='del'>-                                        exportinsecure = RPCSVC_AUTH_ACCEPT;</div><div class='del'>-                                else</div><div class='del'>-                                        exportinsecure = RPCSVC_AUTH_REJECT;</div><div class='del'>-                        } else</div><div class='del'>-                                gf_log (GF_RPCSVC, GF_LOG_ERROR, "Failed to"</div><div class='del'>-                                        " read rpc-auth.ports.insecure value");</div><div class='del'>-                } else</div><div class='del'>-                        gf_log (GF_RPCSVC, GF_LOG_ERROR, "Failed to"</div><div class='del'>-                                " read rpc-auth.ports.insecure value");</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        ret = rpcsvc_combine_gen_spec_volume_checks (globalinsecure,</div><div class='del'>-                                                     exportinsecure);</div><div class='del'>-        if (ret == RPCSVC_AUTH_ACCEPT)</div><div class='del'>-                gf_log (GF_RPCSVC, GF_LOG_DEBUG, "Unprivileged port allowed");</div><div class='del'>-        else</div><div class='del'>-                gf_log (GF_RPCSVC, GF_LOG_DEBUG, "Unprivileged port not"</div><div class='del'>-                        " allowed");</div><div class='del'>-</div><div class='add'>+        rpcsvc_request_seterr(req, AUTH_ERROR);</div><div class='add'>+        gf_log(GF_RPCSVC, GF_LOG_ERROR,</div><div class='add'>+               "auth failed on request. "</div><div class='add'>+               "(XID: 0x%" GF_PRI_RPC_XID ", Ver: %" GF_PRI_RPC_VERSION</div><div class='add'>+               ", Program: %" GF_PRI_RPC_PROG_ID</div><div class='add'>+               ", "</div><div class='add'>+               "ProgVers: %" GF_PRI_RPC_PROG_VERS ", Proc: %" GF_PRI_RPC_PROC</div><div class='add'>+               ") "</div><div class='add'>+               "from trans (%s)",</div><div class='add'>+               rpc_call_xid(&amp;rpcmsg), rpc_call_rpcvers(&amp;rpcmsg),</div><div class='add'>+               rpc_call_program(&amp;rpcmsg), rpc_call_progver(&amp;rpcmsg),</div><div class='add'>+               rpc_call_progproc(&amp;rpcmsg), trans-&gt;name);</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* If the error is not RPC_MISMATCH, we consider the call as accepted</div><div class='add'>+     * since we are not handling authentication failures for now.</div><div class='add'>+     */</div><div class='add'>+    req-&gt;rpc_status = MSG_ACCEPTED;</div><div class='add'>+    req-&gt;reply = NULL;</div><div class='add'>+    ret = 0;</div><div class='ctx'> err:</div><div class='del'>-        if (srchstr)</div><div class='del'>-                GF_FREE (srchstr);</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='add'>+    if (ret == -1) {</div><div class='add'>+        ret = rpcsvc_error_reply(req);</div><div class='add'>+        if (ret)</div><div class='add'>+            gf_log("rpcsvc", GF_LOG_WARNING, "failed to queue error reply");</div><div class='add'>+        req = NULL;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='add'>+    return req;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-/* This needs to change to returning errors, since</div><div class='del'>- * we need to return RPC specific error messages when some</div><div class='del'>- * of the pointers below are NULL.</div><div class='del'>- */</div><div class='del'>-rpcsvc_actor_t *</div><div class='del'>-rpcsvc_program_actor (rpcsvc_request_t *req)</div><div class='add'>+int</div><div class='add'>+rpcsvc_check_and_reply_error(int ret, call_frame_t *frame, void *opaque)</div><div class='ctx'> {</div><div class='del'>-        rpcsvc_program_t        *program = NULL;</div><div class='del'>-        int                     err      = SYSTEM_ERR;</div><div class='del'>-        rpcsvc_actor_t          *actor   = NULL;</div><div class='del'>-        rpcsvc_t                *svc     = NULL;</div><div class='del'>-        char                    found    = 0;</div><div class='add'>+    rpcsvc_request_t *req = NULL;</div><div class='ctx'> </div><div class='del'>-        if (!req)</div><div class='del'>-                goto err;</div><div class='add'>+    req = opaque;</div><div class='ctx'> </div><div class='del'>-        svc = req-&gt;svc;</div><div class='del'>-        pthread_mutex_lock (&amp;svc-&gt;rpclock);</div><div class='del'>-        {</div><div class='del'>-                list_for_each_entry (program, &amp;svc-&gt;programs, program) {</div><div class='del'>-                        if (program-&gt;prognum == req-&gt;prognum) {</div><div class='del'>-                                err = PROG_MISMATCH;</div><div class='del'>-                        }</div><div class='add'>+    if (ret)</div><div class='add'>+        gf_log("rpcsvc", GF_LOG_ERROR,</div><div class='add'>+               "rpc actor (%d:%d:%d) failed to complete successfully",</div><div class='add'>+               req-&gt;prognum, req-&gt;progver, req-&gt;procnum);</div><div class='ctx'> </div><div class='del'>-                        if ((program-&gt;prognum == req-&gt;prognum)</div><div class='del'>-                            &amp;&amp; (program-&gt;progver == req-&gt;progver)) {</div><div class='del'>-                                found = 1;</div><div class='del'>-                                break;</div><div class='del'>-                        }</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='del'>-        pthread_mutex_unlock (&amp;svc-&gt;rpclock);</div><div class='del'>-</div><div class='del'>-        if (!found) {</div><div class='del'>-                if (err != PROG_MISMATCH) {</div><div class='del'>-                        gf_log (GF_RPCSVC, GF_LOG_ERROR,</div><div class='del'>-                                "RPC program not available");</div><div class='del'>-                        err = PROG_UNAVAIL;</div><div class='del'>-                        goto err;</div><div class='del'>-                }</div><div class='add'>+    if (ret == RPCSVC_ACTOR_ERROR) {</div><div class='add'>+        ret = rpcsvc_error_reply(req);</div><div class='add'>+        if (ret)</div><div class='add'>+            gf_log("rpcsvc", GF_LOG_WARNING, "failed to queue error reply");</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-                gf_log (GF_RPCSVC, GF_LOG_ERROR, "RPC program version not"</div><div class='del'>-                        " available");</div><div class='del'>-                goto err;</div><div class='del'>-        }</div><div class='del'>-        req-&gt;prog = program;</div><div class='del'>-        if (!program-&gt;actors) {</div><div class='del'>-                gf_log (GF_RPCSVC, GF_LOG_ERROR, "RPC System error");</div><div class='del'>-                err = SYSTEM_ERR;</div><div class='del'>-                goto err;</div><div class='del'>-        }</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        if ((req-&gt;procnum &lt; 0) || (req-&gt;procnum &gt;= program-&gt;numactors)) {</div><div class='del'>-                gf_log (GF_RPCSVC, GF_LOG_ERROR, "RPC Program procedure not"</div><div class='del'>-                        " available");</div><div class='del'>-                err = PROC_UNAVAIL;</div><div class='del'>-                goto err;</div><div class='del'>-        }</div><div class='add'>+void</div><div class='add'>+rpcsvc_queue_event_thread_death(rpcsvc_t *svc, rpcsvc_program_t *prog, int gen)</div><div class='add'>+{</div><div class='add'>+    rpcsvc_request_queue_t *queue = NULL;</div><div class='add'>+    int num = 0;</div><div class='add'>+    void *value = NULL;</div><div class='add'>+    rpcsvc_request_t *req = NULL;</div><div class='add'>+    char empty = 0;</div><div class='add'>+</div><div class='add'>+    value = pthread_getspecific(prog-&gt;req_queue_key);</div><div class='add'>+    if (value == NULL) {</div><div class='add'>+        return;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        actor = &amp;program-&gt;actors[req-&gt;procnum];</div><div class='del'>-        if (!actor-&gt;actor) {</div><div class='del'>-                gf_log (GF_RPCSVC, GF_LOG_ERROR, "RPC Program procedure not"</div><div class='del'>-                        " available");</div><div class='del'>-                err = PROC_UNAVAIL;</div><div class='del'>-                actor = NULL;</div><div class='del'>-                goto err;</div><div class='del'>-        }</div><div class='add'>+    num = ((unsigned long)value) - 1;</div><div class='ctx'> </div><div class='del'>-        err = SUCCESS;</div><div class='del'>-        gf_log (GF_RPCSVC, GF_LOG_TRACE, "Actor found: %s - %s",</div><div class='del'>-                program-&gt;progname, actor-&gt;procname);</div><div class='del'>-err:</div><div class='del'>-        if (req)</div><div class='del'>-                req-&gt;rpc_err = err;</div><div class='add'>+    queue = &amp;prog-&gt;request_queue[num];</div><div class='ctx'> </div><div class='del'>-        return actor;</div><div class='del'>-}</div><div class='add'>+    if (queue-&gt;gen == gen) {</div><div class='add'>+        /* duplicate event */</div><div class='add'>+        gf_log(GF_RPCSVC, GF_LOG_INFO,</div><div class='add'>+               "not queuing duplicate event thread death. "</div><div class='add'>+               "queue %d program %s",</div><div class='add'>+               num, prog-&gt;progname);</div><div class='add'>+        return;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='add'>+    rpcsvc_alloc_request(svc, req);</div><div class='add'>+    req-&gt;prognum = RPCSVC_INFRA_PROGRAM;</div><div class='add'>+    req-&gt;procnum = RPCSVC_PROC_EVENT_THREAD_DEATH;</div><div class='add'>+    gf_log(GF_RPCSVC, GF_LOG_INFO,</div><div class='add'>+           "queuing event thread death request to queue %d of program %s", num,</div><div class='add'>+           prog-&gt;progname);</div><div class='ctx'> </div><div class='del'>-/* this procedure can only pass 4 arguments to registered notifyfn. To send more</div><div class='del'>- * arguements call wrapper-&gt;notify directly.</div><div class='del'>- */</div><div class='del'>-inline void</div><div class='del'>-rpcsvc_program_notify (rpcsvc_listener_t *listener, rpcsvc_event_t event,</div><div class='del'>-                       void *data)</div><div class='del'>-{</div><div class='del'>-        rpcsvc_notify_wrapper_t *wrapper = NULL;</div><div class='add'>+    pthread_mutex_lock(&amp;queue-&gt;queue_lock);</div><div class='add'>+    {</div><div class='add'>+        empty = list_empty(&amp;queue-&gt;request_queue);</div><div class='ctx'> </div><div class='del'>-        if (!listener) {</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='add'>+        list_add_tail(&amp;req-&gt;request_list, &amp;queue-&gt;request_queue);</div><div class='add'>+        queue-&gt;gen = gen;</div><div class='ctx'> </div><div class='del'>-        list_for_each_entry (wrapper, &amp;listener-&gt;svc-&gt;notify, list) {</div><div class='del'>-                if (wrapper-&gt;notify) {</div><div class='del'>-                        wrapper-&gt;notify (listener-&gt;svc,</div><div class='del'>-                                         wrapper-&gt;data,</div><div class='del'>-                                         event, data);</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='add'>+        if (empty &amp;&amp; queue-&gt;waiting)</div><div class='add'>+            pthread_cond_signal(&amp;queue-&gt;queue_cond);</div><div class='add'>+    }</div><div class='add'>+    pthread_mutex_unlock(&amp;queue-&gt;queue_lock);</div><div class='ctx'> </div><div class='del'>-out:</div><div class='del'>-        return;</div><div class='add'>+    return;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='del'>-inline int</div><div class='del'>-rpcsvc_accept (rpcsvc_t *svc, rpc_transport_t *listen_trans,</div><div class='del'>-               rpc_transport_t *new_trans)</div><div class='add'>+int</div><div class='add'>+rpcsvc_handle_event_thread_death(rpcsvc_t *svc, rpc_transport_t *trans, int gen)</div><div class='ctx'> {</div><div class='del'>-        rpcsvc_listener_t *listener = NULL;</div><div class='del'>-        int32_t            ret      = -1;</div><div class='add'>+    rpcsvc_program_t *prog = NULL;</div><div class='ctx'> </div><div class='del'>-        listener = rpcsvc_get_listener (svc, -1, listen_trans);</div><div class='del'>-        if (listener == NULL) {</div><div class='del'>-                goto out;</div><div class='add'>+    pthread_rwlock_rdlock(&amp;svc-&gt;rpclock);</div><div class='add'>+    {</div><div class='add'>+        list_for_each_entry(prog, &amp;svc-&gt;programs, program)</div><div class='add'>+        {</div><div class='add'>+            if (prog-&gt;ownthread)</div><div class='add'>+                rpcsvc_queue_event_thread_death(svc, prog, gen);</div><div class='ctx'>         }</div><div class='add'>+    }</div><div class='add'>+    pthread_rwlock_unlock(&amp;svc-&gt;rpclock);</div><div class='ctx'> </div><div class='del'>-        rpcsvc_program_notify (listener, RPCSVC_EVENT_ACCEPT, new_trans);</div><div class='del'>-        ret = 0;</div><div class='del'>-out:</div><div class='del'>-        return ret;</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='del'>-void</div><div class='del'>-rpcsvc_request_destroy (rpcsvc_request_t *req)</div><div class='add'>+int</div><div class='add'>+rpcsvc_handle_rpc_call(rpcsvc_t *svc, rpc_transport_t *trans,</div><div class='add'>+                       rpc_transport_pollin_t *msg)</div><div class='ctx'> {</div><div class='del'>-        if (!req) {</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='add'>+    rpcsvc_actor_t *actor = NULL;</div><div class='add'>+    rpcsvc_actor actor_fn = NULL;</div><div class='add'>+    rpcsvc_request_t *req = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    uint16_t port = 0;</div><div class='add'>+    gf_boolean_t is_unix = _gf_false, empty = _gf_false;</div><div class='add'>+    gf_boolean_t unprivileged = _gf_false, spawn_request_handler = 0;</div><div class='add'>+    drc_cached_op_t *reply = NULL;</div><div class='add'>+    rpcsvc_drc_globals_t *drc = NULL;</div><div class='add'>+    rpcsvc_request_queue_t *queue = NULL;</div><div class='add'>+    long num = 0;</div><div class='add'>+    void *value = NULL;</div><div class='add'>+</div><div class='add'>+    if (!trans || !svc)</div><div class='add'>+        return -1;</div><div class='add'>+</div><div class='add'>+    switch (trans-&gt;peerinfo.sockaddr.ss_family) {</div><div class='add'>+        case AF_INET:</div><div class='add'>+            port = ((struct sockaddr_in *)&amp;trans-&gt;peerinfo.sockaddr)-&gt;sin_port;</div><div class='add'>+            break;</div><div class='ctx'> </div><div class='del'>-        if (req-&gt;iobref) {</div><div class='del'>-                iobref_unref (req-&gt;iobref);</div><div class='del'>-        }</div><div class='add'>+        case AF_INET6:</div><div class='add'>+            port = ((struct sockaddr_in6 *)&amp;trans-&gt;peerinfo.sockaddr)</div><div class='add'>+                       -&gt;sin6_port;</div><div class='add'>+            break;</div><div class='add'>+        case AF_UNIX:</div><div class='add'>+            is_unix = _gf_true;</div><div class='add'>+            break;</div><div class='add'>+        default:</div><div class='add'>+            gf_log(GF_RPCSVC, GF_LOG_ERROR, "invalid address family (%d)",</div><div class='add'>+                   trans-&gt;peerinfo.sockaddr.ss_family);</div><div class='add'>+            return -1;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        rpc_transport_unref (req-&gt;trans);</div><div class='add'>+    if (is_unix == _gf_false) {</div><div class='add'>+        port = ntohs(port);</div><div class='ctx'> </div><div class='del'>-        mem_put (req-&gt;svc-&gt;rxpool, req);</div><div class='add'>+        gf_log("rpcsvc", GF_LOG_TRACE, "Client port: %d", (int)port);</div><div class='ctx'> </div><div class='del'>-out:</div><div class='del'>-        return;</div><div class='del'>-}</div><div class='add'>+        if (port &gt;= 1024)</div><div class='add'>+            unprivileged = _gf_true;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='add'>+    req = rpcsvc_request_create(svc, trans, msg);</div><div class='add'>+    if (!req)</div><div class='add'>+        goto out;</div><div class='ctx'> </div><div class='del'>-rpcsvc_request_t *</div><div class='del'>-rpcsvc_request_init (rpcsvc_t *svc, rpc_transport_t *trans,</div><div class='del'>-                     struct rpc_msg *callmsg,</div><div class='del'>-                     struct iovec progmsg, rpc_transport_pollin_t *msg,</div><div class='del'>-                     rpcsvc_request_t *req)</div><div class='del'>-{</div><div class='del'>-        if ((!trans) || (!callmsg)|| (!req) || (!msg))</div><div class='del'>-                return NULL;</div><div class='add'>+    if (!rpcsvc_request_accepted(req))</div><div class='add'>+        goto err_reply;</div><div class='ctx'> </div><div class='del'>-        /* We start a RPC request as always denied. */</div><div class='del'>-        req-&gt;rpc_status = MSG_DENIED;</div><div class='del'>-        req-&gt;xid = rpc_call_xid (callmsg);</div><div class='del'>-        req-&gt;prognum = rpc_call_program (callmsg);</div><div class='del'>-        req-&gt;progver = rpc_call_progver (callmsg);</div><div class='del'>-        req-&gt;procnum = rpc_call_progproc (callmsg);</div><div class='del'>-        req-&gt;trans = rpc_transport_ref (trans);</div><div class='del'>-        req-&gt;count = msg-&gt;count;</div><div class='del'>-        req-&gt;msg[0] = progmsg;</div><div class='del'>-        req-&gt;iobref = iobref_ref (msg-&gt;iobref);</div><div class='del'>-        if (msg-&gt;vectored) {</div><div class='del'>-                req-&gt;msg[1] = msg-&gt;vector[1];</div><div class='del'>-        }</div><div class='add'>+    actor = rpcsvc_program_actor(req);</div><div class='add'>+    if (!actor)</div><div class='add'>+        goto err_reply;</div><div class='ctx'> </div><div class='del'>-        req-&gt;svc = svc;</div><div class='del'>-        req-&gt;trans_private = msg-&gt;private;</div><div class='add'>+    if (0 == svc-&gt;allow_insecure &amp;&amp; unprivileged &amp;&amp; !actor-&gt;unprivileged) {</div><div class='add'>+        /* Non-privileged user, fail request */</div><div class='add'>+        gf_log(GF_RPCSVC, GF_LOG_ERROR,</div><div class='add'>+               "Request received from non-"</div><div class='add'>+               "privileged port. Failing request for %s.",</div><div class='add'>+               req-&gt;trans-&gt;peerinfo.identifier);</div><div class='add'>+        req-&gt;rpc_status = MSG_DENIED;</div><div class='add'>+        req-&gt;rpc_err = AUTH_ERROR;</div><div class='add'>+        req-&gt;auth_err = RPCSVC_AUTH_REJECT;</div><div class='add'>+        goto err_reply;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        INIT_LIST_HEAD (&amp;req-&gt;txlist);</div><div class='del'>-        req-&gt;payloadsize = 0;</div><div class='add'>+    /* DRC */</div><div class='add'>+    if (rpcsvc_need_drc(req)) {</div><div class='add'>+        drc = req-&gt;svc-&gt;drc;</div><div class='ctx'> </div><div class='del'>-        /* By this time, the data bytes for the auth scheme would have already</div><div class='del'>-         * been copied into the required sections of the req structure,</div><div class='del'>-         * we just need to fill in the meta-data about it now.</div><div class='del'>-         */</div><div class='del'>-        req-&gt;cred.flavour = rpc_call_cred_flavour (callmsg);</div><div class='del'>-        req-&gt;cred.datalen = rpc_call_cred_len (callmsg);</div><div class='del'>-        req-&gt;verf.flavour = rpc_call_verf_flavour (callmsg);</div><div class='del'>-        req-&gt;verf.datalen = rpc_call_verf_len (callmsg);</div><div class='add'>+        LOCK(&amp;drc-&gt;lock);</div><div class='add'>+        {</div><div class='add'>+            reply = rpcsvc_drc_lookup(req);</div><div class='add'>+</div><div class='add'>+            /* retransmission of completed request, send cached reply */</div><div class='add'>+            if (reply &amp;&amp; reply-&gt;state == DRC_OP_CACHED) {</div><div class='add'>+                gf_log(GF_RPCSVC, GF_LOG_INFO,</div><div class='add'>+                       "duplicate request:"</div><div class='add'>+                       " XID: 0x%x",</div><div class='add'>+                       req-&gt;xid);</div><div class='add'>+                ret = rpcsvc_send_cached_reply(req, reply);</div><div class='add'>+                drc-&gt;cache_hits++;</div><div class='add'>+                UNLOCK(&amp;drc-&gt;lock);</div><div class='add'>+                goto out;</div><div class='ctx'> </div><div class='del'>-        /* AUTH */</div><div class='del'>-        rpcsvc_auth_request_init (req);</div><div class='del'>-        return req;</div><div class='del'>-}</div><div class='add'>+            } /* retransmitted request, original op in transit, drop it */</div><div class='add'>+            else if (reply &amp;&amp; reply-&gt;state == DRC_OP_IN_TRANSIT) {</div><div class='add'>+                gf_log(GF_RPCSVC, GF_LOG_INFO,</div><div class='add'>+                       "op in transit,"</div><div class='add'>+                       " discarding. XID: 0x%x",</div><div class='add'>+                       req-&gt;xid);</div><div class='add'>+                ret = 0;</div><div class='add'>+                drc-&gt;intransit_hits++;</div><div class='add'>+                rpcsvc_request_destroy(req);</div><div class='add'>+                UNLOCK(&amp;drc-&gt;lock);</div><div class='add'>+                goto out;</div><div class='ctx'> </div><div class='add'>+            } /* fresh request, cache it as in-transit and proceed */</div><div class='add'>+            else {</div><div class='add'>+                ret = rpcsvc_cache_request(req);</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+        UNLOCK(&amp;drc-&gt;lock);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (req-&gt;rpc_err == SUCCESS) {</div><div class='add'>+        /* Before going to xlator code, set the THIS properly */</div><div class='add'>+        THIS = svc-&gt;xl;</div><div class='add'>+</div><div class='add'>+        actor_fn = actor-&gt;actor;</div><div class='add'>+</div><div class='add'>+        if (!actor_fn) {</div><div class='add'>+            rpcsvc_request_seterr(req, PROC_UNAVAIL);</div><div class='add'>+            /* LOG TODO: print more info about procnum,</div><div class='add'>+               prognum etc, also print transport info */</div><div class='add'>+            gf_log(GF_RPCSVC, GF_LOG_ERROR, "No vectored handler present");</div><div class='add'>+            ret = RPCSVC_ACTOR_ERROR;</div><div class='add'>+            goto err_reply;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        if (req-&gt;synctask) {</div><div class='add'>+            ret = synctask_new(THIS-&gt;ctx-&gt;env, (synctask_fn_t)actor_fn,</div><div class='add'>+                               rpcsvc_check_and_reply_error, NULL, req);</div><div class='add'>+        } else if (req-&gt;ownthread) {</div><div class='add'>+            value = pthread_getspecific(req-&gt;prog-&gt;req_queue_key);</div><div class='add'>+            if (value == NULL) {</div><div class='add'>+                pthread_mutex_lock(&amp;req-&gt;prog-&gt;thr_lock);</div><div class='add'>+                {</div><div class='add'>+                    num = rpcsvc_get_free_queue_index(req-&gt;prog);</div><div class='add'>+                    if (num != -1) {</div><div class='add'>+                        num++;</div><div class='add'>+                        value = (void *)num;</div><div class='add'>+                        ret = pthread_setspecific(req-&gt;prog-&gt;req_queue_key,</div><div class='add'>+                                                  value);</div><div class='add'>+                        if (ret &lt; 0) {</div><div class='add'>+                            gf_log(GF_RPCSVC, GF_LOG_WARNING,</div><div class='add'>+                                   "setting request queue in TLS failed");</div><div class='add'>+                            rpcsvc_toggle_queue_status(</div><div class='add'>+                                req-&gt;prog, &amp;req-&gt;prog-&gt;request_queue[num - 1],</div><div class='add'>+                                req-&gt;prog-&gt;request_queue_status);</div><div class='add'>+                            num = -1;</div><div class='add'>+                        } else {</div><div class='add'>+                            spawn_request_handler = 1;</div><div class='add'>+                        }</div><div class='add'>+                    }</div><div class='add'>+                }</div><div class='add'>+                pthread_mutex_unlock(&amp;req-&gt;prog-&gt;thr_lock);</div><div class='add'>+            }</div><div class='ctx'> </div><div class='del'>-rpcsvc_request_t *</div><div class='del'>-rpcsvc_request_create (rpcsvc_t *svc, rpc_transport_t *trans,</div><div class='del'>-                       rpc_transport_pollin_t *msg)</div><div class='del'>-{</div><div class='del'>-        char                    *msgbuf = NULL;</div><div class='del'>-        struct rpc_msg          rpcmsg;</div><div class='del'>-        struct iovec            progmsg;        /* RPC Program payload */</div><div class='del'>-        rpcsvc_request_t        *req    = NULL;</div><div class='del'>-        size_t                  msglen  = 0;</div><div class='del'>-        int                     ret     = -1;</div><div class='del'>-</div><div class='del'>-        if (!svc || !trans)</div><div class='del'>-                return NULL;</div><div class='del'>-</div><div class='del'>-        /* We need to allocate the request before actually calling</div><div class='del'>-         * rpcsvc_request_init on the request so that we, can fill the auth</div><div class='del'>-         * data directly into the request structure from the message iobuf.</div><div class='del'>-         * This avoids a need to keep a temp buffer into which the auth data</div><div class='del'>-         * would've been copied otherwise.</div><div class='del'>-         */</div><div class='del'>-        rpcsvc_alloc_request (svc, req);</div><div class='del'>-        if (!req) {</div><div class='del'>-                gf_log (GF_RPCSVC, GF_LOG_ERROR, "Failed to alloc request");</div><div class='del'>-                goto err;</div><div class='del'>-        }</div><div class='add'>+            if (num == -1)</div><div class='add'>+                goto noqueue;</div><div class='ctx'> </div><div class='del'>-        msgbuf = msg-&gt;vector[0].iov_base;</div><div class='del'>-        msglen = msg-&gt;vector[0].iov_len;</div><div class='add'>+            num = ((unsigned long)value) - 1;</div><div class='ctx'> </div><div class='del'>-        ret = xdr_to_rpc_call (msgbuf, msglen, &amp;rpcmsg, &amp;progmsg,</div><div class='del'>-                               req-&gt;cred.authdata,req-&gt;verf.authdata);</div><div class='add'>+            queue = &amp;req-&gt;prog-&gt;request_queue[num];</div><div class='ctx'> </div><div class='del'>-        if (ret == -1) {</div><div class='del'>-                gf_log (GF_RPCSVC, GF_LOG_ERROR, "RPC call decoding failed");</div><div class='del'>-                rpcsvc_request_seterr (req, GARBAGE_ARGS);</div><div class='del'>-                goto err;</div><div class='del'>-        }</div><div class='add'>+            if (spawn_request_handler) {</div><div class='add'>+                ret = gf_thread_create(&amp;queue-&gt;thread, NULL,</div><div class='add'>+                                       rpcsvc_request_handler, queue,</div><div class='add'>+                                       "rpcrqhnd");</div><div class='add'>+                if (!ret) {</div><div class='add'>+                    gf_log(GF_RPCSVC, GF_LOG_INFO,</div><div class='add'>+                           "spawned a request handler thread for queue %d",</div><div class='add'>+                           (int)num);</div><div class='add'>+</div><div class='add'>+                    req-&gt;prog-&gt;threadcount++;</div><div class='add'>+                } else {</div><div class='add'>+                    gf_log(</div><div class='add'>+                        GF_RPCSVC, GF_LOG_INFO,</div><div class='add'>+                        "spawning a request handler thread for queue %d failed",</div><div class='add'>+                        (int)num);</div><div class='add'>+                    ret = pthread_setspecific(req-&gt;prog-&gt;req_queue_key, 0);</div><div class='add'>+                    if (ret &lt; 0) {</div><div class='add'>+                        gf_log(GF_RPCSVC, GF_LOG_WARNING,</div><div class='add'>+                               "resetting request queue in TLS failed");</div><div class='add'>+                    }</div><div class='add'>+</div><div class='add'>+                    rpcsvc_toggle_queue_status(</div><div class='add'>+                        req-&gt;prog, &amp;req-&gt;prog-&gt;request_queue[num - 1],</div><div class='add'>+                        req-&gt;prog-&gt;request_queue_status);</div><div class='add'>+</div><div class='add'>+                    goto noqueue;</div><div class='add'>+                }</div><div class='add'>+            }</div><div class='ctx'> </div><div class='del'>-        ret = -1;</div><div class='del'>-        rpcsvc_request_init (svc, trans, &amp;rpcmsg, progmsg, msg, req);</div><div class='add'>+            pthread_mutex_lock(&amp;queue-&gt;queue_lock);</div><div class='add'>+            {</div><div class='add'>+                empty = list_empty(&amp;queue-&gt;request_queue);</div><div class='ctx'> </div><div class='del'>-        gf_log (GF_RPCSVC, GF_LOG_TRACE, "RPC XID: %lx, Ver: %ld, Program: %ld,"</div><div class='del'>-                " ProgVers: %ld, Proc: %ld", rpc_call_xid (&amp;rpcmsg),</div><div class='del'>-                rpc_call_rpcvers (&amp;rpcmsg), rpc_call_program (&amp;rpcmsg),</div><div class='del'>-                rpc_call_progver (&amp;rpcmsg), rpc_call_progproc (&amp;rpcmsg));</div><div class='add'>+                list_add_tail(&amp;req-&gt;request_list, &amp;queue-&gt;request_queue);</div><div class='ctx'> </div><div class='del'>-        if (rpc_call_rpcvers (&amp;rpcmsg) != 2) {</div><div class='del'>-                gf_log (GF_RPCSVC, GF_LOG_ERROR, "RPC version not supported");</div><div class='del'>-                rpcsvc_request_seterr (req, RPC_MISMATCH);</div><div class='del'>-                goto err;</div><div class='del'>-        }</div><div class='add'>+                if (empty &amp;&amp; queue-&gt;waiting)</div><div class='add'>+                    pthread_cond_signal(&amp;queue-&gt;queue_cond);</div><div class='add'>+            }</div><div class='add'>+            pthread_mutex_unlock(&amp;queue-&gt;queue_lock);</div><div class='ctx'> </div><div class='del'>-        ret = rpcsvc_authenticate (req);</div><div class='del'>-        if (ret == RPCSVC_AUTH_REJECT) {</div><div class='del'>-                /* No need to set auth_err, that is the responsibility of</div><div class='del'>-                 * the authentication handler since only that know what exact</div><div class='del'>-                 * error happened.</div><div class='del'>-                 */</div><div class='del'>-                rpcsvc_request_seterr (req, AUTH_ERROR);</div><div class='del'>-                gf_log (GF_RPCSVC, GF_LOG_ERROR, "Failed authentication");</div><div class='del'>-                ret = -1;</div><div class='del'>-                goto err;</div><div class='add'>+            ret = 0;</div><div class='add'>+        } else {</div><div class='add'>+        noqueue:</div><div class='add'>+            ret = actor_fn(req);</div><div class='ctx'>         }</div><div class='add'>+    }</div><div class='ctx'> </div><div class='add'>+err_reply:</div><div class='ctx'> </div><div class='del'>-        /* If the error is not RPC_MISMATCH, we consider the call as accepted</div><div class='del'>-         * since we are not handling authentication failures for now.</div><div class='del'>-         */</div><div class='del'>-        req-&gt;rpc_status = MSG_ACCEPTED;</div><div class='del'>-        ret = 0;</div><div class='del'>-err:</div><div class='del'>-        if (ret == -1) {</div><div class='del'>-                ret = rpcsvc_error_reply (req);</div><div class='del'>-                if (ret)</div><div class='del'>-                        gf_log ("rpcsvc", GF_LOG_DEBUG,</div><div class='del'>-                                "failed to queue error reply");</div><div class='del'>-                req = NULL;</div><div class='del'>-        }</div><div class='add'>+    ret = rpcsvc_check_and_reply_error(ret, NULL, req);</div><div class='add'>+    /* No need to propagate error beyond this function since the reply</div><div class='add'>+     * has now been queued. */</div><div class='add'>+    ret = 0;</div><div class='ctx'> </div><div class='del'>-        return req;</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-rpcsvc_handle_rpc_call (rpcsvc_t *svc, rpc_transport_t *trans,</div><div class='del'>-                        rpc_transport_pollin_t *msg)</div><div class='add'>+rpcsvc_handle_disconnect(rpcsvc_t *svc, rpc_transport_t *trans)</div><div class='ctx'> {</div><div class='del'>-        rpcsvc_actor_t          *actor = NULL;</div><div class='del'>-        rpcsvc_request_t        *req = NULL;</div><div class='del'>-        int                     ret = -1;</div><div class='del'>-        uint16_t                port = 0;</div><div class='del'>-</div><div class='del'>-        if (!trans || !svc)</div><div class='del'>-                return -1;</div><div class='add'>+    rpcsvc_event_t event;</div><div class='add'>+    rpcsvc_notify_wrapper_t *wrappers = NULL, *wrapper;</div><div class='add'>+    int32_t ret = -1, i = 0, wrapper_count = 0;</div><div class='add'>+    rpcsvc_listener_t *listener = NULL;</div><div class='ctx'> </div><div class='del'>-        switch (trans-&gt;peerinfo.sockaddr.ss_family) {</div><div class='del'>-        case AF_INET:</div><div class='del'>-                port = ((struct sockaddr_in *)&amp;trans-&gt;peerinfo.sockaddr)-&gt;sin_port;</div><div class='del'>-                break;</div><div class='add'>+    event = (trans-&gt;listener == NULL) ? RPCSVC_EVENT_LISTENER_DEAD</div><div class='add'>+                                      : RPCSVC_EVENT_DISCONNECT;</div><div class='ctx'> </div><div class='del'>-        case AF_INET6:</div><div class='del'>-                port = ((struct sockaddr_in6 *)&amp;trans-&gt;peerinfo.sockaddr)-&gt;sin6_port;</div><div class='del'>-                break;</div><div class='add'>+    pthread_rwlock_rdlock(&amp;svc-&gt;rpclock);</div><div class='add'>+    {</div><div class='add'>+        if (!svc-&gt;notify_count)</div><div class='add'>+            goto unlock;</div><div class='ctx'> </div><div class='del'>-        default:</div><div class='del'>-                gf_log (GF_RPCSVC, GF_LOG_DEBUG,</div><div class='del'>-                        "invalid address family (%d)",</div><div class='del'>-                        trans-&gt;peerinfo.sockaddr.ss_family);</div><div class='del'>-                return -1;</div><div class='add'>+        wrappers = GF_CALLOC(svc-&gt;notify_count, sizeof(*wrapper),</div><div class='add'>+                             gf_common_mt_rpcsvc_wrapper_t);</div><div class='add'>+        if (!wrappers) {</div><div class='add'>+            goto unlock;</div><div class='ctx'>         }</div><div class='ctx'> </div><div class='del'>-</div><div class='del'>-</div><div class='del'>-        port = ntohs (port);</div><div class='del'>-</div><div class='del'>-        gf_log ("rpcsvc", GF_LOG_TRACE, "Client port: %d", (int)port);</div><div class='del'>-</div><div class='del'>-        if (port &gt; 1024) {  //Non-privilaged user, fail request</div><div class='del'>-                gf_log ("glusterd", GF_LOG_ERROR, "Request received from non-"</div><div class='del'>-                        "privileged port. Failing request");</div><div class='del'>-                return -1;</div><div class='add'>+        list_for_each_entry(wrapper, &amp;svc-&gt;notify, list)</div><div class='add'>+        {</div><div class='add'>+            if (wrapper-&gt;notify) {</div><div class='add'>+                wrappers[i++] = *wrapper;</div><div class='add'>+            }</div><div class='ctx'>         }</div><div class='ctx'> </div><div class='del'>-        req = rpcsvc_request_create (svc, trans, msg);</div><div class='del'>-        if (!req)</div><div class='del'>-                goto err;</div><div class='del'>-</div><div class='del'>-        if (!rpcsvc_request_accepted (req))</div><div class='del'>-                goto err_reply;</div><div class='del'>-</div><div class='del'>-        actor = rpcsvc_program_actor (req);</div><div class='del'>-        if (!actor)</div><div class='del'>-                goto err_reply;</div><div class='del'>-</div><div class='del'>-        if (actor &amp;&amp; (req-&gt;rpc_err == SUCCESS)) {</div><div class='del'>-                /* Before going to xlator code, set the THIS properly */</div><div class='del'>-                THIS = svc-&gt;mydata;</div><div class='del'>-</div><div class='del'>-                if (req-&gt;count == 2) {</div><div class='del'>-                        if (actor-&gt;vector_actor) {</div><div class='del'>-                                ret = actor-&gt;vector_actor (req, &amp;req-&gt;msg[1], 1,</div><div class='del'>-                                                           req-&gt;iobref);</div><div class='del'>-                        } else {</div><div class='del'>-                                rpcsvc_request_seterr (req, PROC_UNAVAIL);</div><div class='del'>-                                gf_log (GF_RPCSVC, GF_LOG_ERROR,</div><div class='del'>-                                        "No vectored handler present");</div><div class='del'>-                                ret = RPCSVC_ACTOR_ERROR;</div><div class='del'>-                        }</div><div class='del'>-                } else if (actor-&gt;actor) {</div><div class='del'>-                        ret = actor-&gt;actor (req);</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='add'>+        wrapper_count = i;</div><div class='add'>+    }</div><div class='add'>+unlock:</div><div class='add'>+    pthread_rwlock_unlock(&amp;svc-&gt;rpclock);</div><div class='ctx'> </div><div class='del'>-err_reply:</div><div class='del'>-        if ((ret == RPCSVC_ACTOR_ERROR) || (req-&gt;rpc_err != SUCCESS)) {</div><div class='del'>-                ret = rpcsvc_error_reply (req);</div><div class='add'>+    if (wrappers) {</div><div class='add'>+        for (i = 0; i &lt; wrapper_count; i++) {</div><div class='add'>+            wrappers[i].notify(svc, wrappers[i].data, event, trans);</div><div class='ctx'>         }</div><div class='ctx'> </div><div class='del'>-        if (ret)</div><div class='del'>-                gf_log ("rpcsvc", GF_LOG_DEBUG, "failed to queue error reply");</div><div class='add'>+        GF_FREE(wrappers);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        /* No need to propagate error beyond this function since the reply</div><div class='del'>-         * has now been queued. */</div><div class='del'>-        ret = 0;</div><div class='add'>+    if (event == RPCSVC_EVENT_LISTENER_DEAD) {</div><div class='add'>+        listener = rpcsvc_get_listener(svc, -1, trans-&gt;listener);</div><div class='add'>+        rpcsvc_listener_destroy(listener);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-err:</div><div class='del'>-        return ret;</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-rpcsvc_handle_disconnect (rpcsvc_t *svc, rpc_transport_t *trans)</div><div class='del'>-{</div><div class='del'>-        rpcsvc_event_t           event;</div><div class='del'>-        rpcsvc_notify_wrapper_t *wrappers = NULL, *wrapper;</div><div class='del'>-        int32_t                  ret      = -1, i = 0, wrapper_count = 0;</div><div class='del'>-        rpcsvc_listener_t       *listener = NULL;</div><div class='del'>- </div><div class='del'>-        event = (trans-&gt;listener == NULL) ? RPCSVC_EVENT_LISTENER_DEAD</div><div class='del'>-                : RPCSVC_EVENT_DISCONNECT;</div><div class='del'>- </div><div class='del'>-        pthread_mutex_lock (&amp;svc-&gt;rpclock);</div><div class='del'>-        {</div><div class='del'>-                wrappers = GF_CALLOC (svc-&gt;notify_count, sizeof (*wrapper),</div><div class='del'>-                                      gf_common_mt_rpcsvc_wrapper_t);</div><div class='del'>-                if (!wrappers) {</div><div class='del'>-                        goto unlock;</div><div class='del'>-                }</div><div class='del'>- </div><div class='del'>-                list_for_each_entry (wrapper, &amp;svc-&gt;notify, list) {</div><div class='del'>-                        if (wrapper-&gt;notify) {</div><div class='del'>-                                wrappers[i++] = *wrapper;</div><div class='del'>-                        }</div><div class='del'>-                }</div><div class='del'>- </div><div class='del'>-                wrapper_count = i;</div><div class='del'>-        }</div><div class='del'>-unlock:</div><div class='del'>-        pthread_mutex_unlock (&amp;svc-&gt;rpclock);</div><div class='del'>- </div><div class='del'>-        if (wrappers) {</div><div class='del'>-                for (i = 0; i &lt; wrapper_count; i++) {</div><div class='del'>-                        wrappers[i].notify (svc, wrappers[i].data,</div><div class='del'>-                                            event, trans);</div><div class='del'>-                }</div><div class='del'>- </div><div class='del'>-                GF_FREE (wrappers);</div><div class='del'>-        }</div><div class='del'>- </div><div class='del'>-        if (event == RPCSVC_EVENT_LISTENER_DEAD) {</div><div class='del'>-                listener = rpcsvc_get_listener (svc, -1, trans-&gt;listener);</div><div class='del'>-                rpcsvc_listener_destroy (listener);</div><div class='del'>-        }</div><div class='del'>- </div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>- </div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-rpcsvc_notify (rpc_transport_t *trans, void *mydata,</div><div class='del'>-               rpc_transport_event_t event, void *data, ...)</div><div class='add'>+rpcsvc_notify(rpc_transport_t *trans, void *mydata, rpc_transport_event_t event,</div><div class='add'>+              void *data, ...)</div><div class='ctx'> {</div><div class='del'>-        int                     ret       = -1;</div><div class='del'>-        rpc_transport_pollin_t *msg       = NULL;</div><div class='del'>-        rpc_transport_t        *new_trans = NULL;</div><div class='del'>-        rpcsvc_t               *svc       = NULL;</div><div class='del'>-</div><div class='del'>-        svc = mydata;</div><div class='del'>-        if (svc == NULL) {</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        switch (event) {</div><div class='add'>+    int ret = -1;</div><div class='add'>+    rpc_transport_pollin_t *msg = NULL;</div><div class='add'>+    rpc_transport_t *new_trans = NULL;</div><div class='add'>+    rpcsvc_t *svc = NULL;</div><div class='add'>+    rpcsvc_listener_t *listener = NULL;</div><div class='add'>+</div><div class='add'>+    svc = mydata;</div><div class='add'>+    if (svc == NULL) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    switch (event) {</div><div class='ctx'>         case RPC_TRANSPORT_ACCEPT:</div><div class='del'>-                new_trans = data;</div><div class='del'>-                ret = rpcsvc_accept (svc, trans, new_trans);</div><div class='del'>-                break;</div><div class='add'>+            new_trans = data;</div><div class='add'>+            ret = rpcsvc_accept(svc, trans, new_trans);</div><div class='add'>+            break;</div><div class='ctx'> </div><div class='ctx'>         case RPC_TRANSPORT_DISCONNECT:</div><div class='del'>-                ret = rpcsvc_handle_disconnect (svc, trans);</div><div class='del'>-                break;</div><div class='add'>+            ret = rpcsvc_handle_disconnect(svc, trans);</div><div class='add'>+            break;</div><div class='ctx'> </div><div class='ctx'>         case RPC_TRANSPORT_MSG_RECEIVED:</div><div class='del'>-                msg = data;</div><div class='del'>-                ret = rpcsvc_handle_rpc_call (svc, trans, msg);</div><div class='del'>-                break;</div><div class='add'>+            msg = data;</div><div class='add'>+            ret = rpcsvc_handle_rpc_call(svc, trans, msg);</div><div class='add'>+            break;</div><div class='ctx'> </div><div class='ctx'>         case RPC_TRANSPORT_MSG_SENT:</div><div class='del'>-                ret = 0;</div><div class='del'>-                break;</div><div class='add'>+            ret = 0;</div><div class='add'>+            break;</div><div class='ctx'> </div><div class='ctx'>         case RPC_TRANSPORT_CONNECT:</div><div class='del'>-                /* do nothing, no need for rpcsvc to handle this, client should</div><div class='del'>-                 * handle this event</div><div class='del'>-                 */</div><div class='del'>-                gf_log ("rpcsvc", GF_LOG_CRITICAL,</div><div class='del'>-                        "got CONNECT event, which should have not come");</div><div class='del'>-                ret = 0;</div><div class='del'>-                break;</div><div class='add'>+            /* do nothing, no need for rpcsvc to handle this, client should</div><div class='add'>+             * handle this event</div><div class='add'>+             */</div><div class='add'>+            /* print info about transport too : LOG TODO */</div><div class='add'>+            gf_log("rpcsvc", GF_LOG_CRITICAL,</div><div class='add'>+                   "got CONNECT event, which should have not come");</div><div class='add'>+            ret = 0;</div><div class='add'>+            break;</div><div class='ctx'> </div><div class='ctx'>         case RPC_TRANSPORT_CLEANUP:</div><div class='del'>-                /* FIXME: think about this later */</div><div class='del'>-                ret = 0;</div><div class='del'>-                break;</div><div class='add'>+            listener = rpcsvc_get_listener(svc, -1, trans-&gt;listener);</div><div class='add'>+            if (listener == NULL) {</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            rpcsvc_program_notify(listener, RPCSVC_EVENT_TRANSPORT_DESTROY,</div><div class='add'>+                                  trans);</div><div class='add'>+            ret = 0;</div><div class='add'>+            break;</div><div class='ctx'> </div><div class='ctx'>         case RPC_TRANSPORT_MAP_XID_REQUEST:</div><div class='del'>-                /* FIXME: think about this later */</div><div class='del'>-                gf_log ("rpcsvc", GF_LOG_CRITICAL,</div><div class='del'>-                        "got MAP_XID event, which should have not come");</div><div class='del'>-                ret = 0;</div><div class='del'>-                break;</div><div class='del'>-        }</div><div class='add'>+            /* FIXME: think about this later */</div><div class='add'>+            gf_log("rpcsvc", GF_LOG_CRITICAL,</div><div class='add'>+                   "got MAP_XID event, which should have not come");</div><div class='add'>+            ret = 0;</div><div class='add'>+            break;</div><div class='add'>+</div><div class='add'>+        case RPC_TRANSPORT_EVENT_THREAD_DIED:</div><div class='add'>+            rpcsvc_handle_event_thread_death(svc, trans,</div><div class='add'>+                                             (int)(unsigned long)data);</div><div class='add'>+            ret = 0;</div><div class='add'>+            break;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='ctx'> out:</div><div class='del'>-        return ret;</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> /* Given the RPC reply structure and the payload handed by the RPC program,</div><div class='ctx'>  * encode the RPC record header into the buffer pointed by recordstart.</div><div class='ctx'>  */</div><div class='ctx'> struct iovec</div><div class='del'>-rpcsvc_record_build_header (char *recordstart, size_t rlen,</div><div class='del'>-                            struct rpc_msg reply, size_t payload)</div><div class='add'>+rpcsvc_record_build_header(char *recordstart, size_t rlen, struct rpc_msg reply,</div><div class='add'>+                           size_t payload)</div><div class='ctx'> {</div><div class='del'>-        struct iovec    replyhdr;</div><div class='del'>-        struct iovec    txrecord = {0, 0};</div><div class='del'>-        size_t          fraglen = 0;</div><div class='del'>-        int             ret = -1;</div><div class='del'>-</div><div class='del'>-        /* After leaving aside the 4 bytes for the fragment header, lets</div><div class='del'>-         * encode the RPC reply structure into the buffer given to us.</div><div class='del'>-         */</div><div class='del'>-        ret = rpc_reply_to_xdr (&amp;reply, recordstart, rlen, &amp;replyhdr);</div><div class='del'>-        if (ret == -1) {</div><div class='del'>-                gf_log (GF_RPCSVC, GF_LOG_ERROR, "Failed to create RPC reply");</div><div class='del'>-                goto err;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        fraglen = payload + replyhdr.iov_len;</div><div class='del'>-        gf_log (GF_RPCSVC, GF_LOG_TRACE, "Reply fraglen %zu, payload: %zu, "</div><div class='del'>-                "rpc hdr: %zu", fraglen, payload, replyhdr.iov_len);</div><div class='del'>-</div><div class='del'>-        txrecord.iov_base = recordstart;</div><div class='del'>-</div><div class='del'>-        /* Remember, this is only the vec for the RPC header and does not</div><div class='del'>-         * include the payload above. We needed the payload only to calculate</div><div class='del'>-         * the size of the full fragment. This size is sent in the fragment</div><div class='del'>-         * header.</div><div class='del'>-         */</div><div class='del'>-        txrecord.iov_len = replyhdr.iov_len;</div><div class='add'>+    struct iovec replyhdr;</div><div class='add'>+    struct iovec txrecord = {0, 0};</div><div class='add'>+    size_t fraglen = 0;</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    /* After leaving aside the 4 bytes for the fragment header, lets</div><div class='add'>+     * encode the RPC reply structure into the buffer given to us.</div><div class='add'>+     */</div><div class='add'>+    ret = rpc_reply_to_xdr(&amp;reply, recordstart, rlen, &amp;replyhdr);</div><div class='add'>+    if (ret == -1) {</div><div class='add'>+        gf_log(GF_RPCSVC, GF_LOG_WARNING, "Failed to create RPC reply");</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    fraglen = payload + replyhdr.iov_len;</div><div class='add'>+    gf_log(GF_RPCSVC, GF_LOG_TRACE,</div><div class='add'>+           "Reply fraglen %zu, payload: %zu, "</div><div class='add'>+           "rpc hdr: %zu",</div><div class='add'>+           fraglen, payload, replyhdr.iov_len);</div><div class='add'>+</div><div class='add'>+    txrecord.iov_base = recordstart;</div><div class='add'>+</div><div class='add'>+    /* Remember, this is only the vec for the RPC header and does not</div><div class='add'>+     * include the payload above. We needed the payload only to calculate</div><div class='add'>+     * the size of the full fragment. This size is sent in the fragment</div><div class='add'>+     * header.</div><div class='add'>+     */</div><div class='add'>+    txrecord.iov_len = replyhdr.iov_len;</div><div class='ctx'> err:</div><div class='del'>-        return txrecord;</div><div class='add'>+    return txrecord;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-inline int</div><div class='del'>-rpcsvc_get_callid (rpcsvc_t *rpc)</div><div class='add'>+static uint32_t</div><div class='add'>+rpc_callback_new_callid(struct rpc_transport *trans)</div><div class='ctx'> {</div><div class='del'>-        return GF_UNIVERSAL_ANSWER;</div><div class='add'>+    uint32_t callid = 0;</div><div class='add'>+</div><div class='add'>+    pthread_mutex_lock(&amp;trans-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        callid = ++trans-&gt;xid;</div><div class='add'>+    }</div><div class='add'>+    pthread_mutex_unlock(&amp;trans-&gt;lock);</div><div class='add'>+</div><div class='add'>+    return callid;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-rpcsvc_fill_callback (int prognum, int progver, int procnum, int payload,</div><div class='del'>-                      uint64_t xid, struct rpc_msg *request)</div><div class='add'>+rpcsvc_fill_callback(int prognum, int progver, int procnum, int payload,</div><div class='add'>+                     uint32_t xid, struct rpc_msg *request)</div><div class='ctx'> {</div><div class='del'>-        int   ret          = -1;</div><div class='add'>+    int ret = -1;</div><div class='ctx'> </div><div class='del'>-        if (!request) {</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='add'>+    if (!request) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        memset (request, 0, sizeof (*request));</div><div class='add'>+    memset(request, 0, sizeof(*request));</div><div class='ctx'> </div><div class='del'>-        request-&gt;rm_xid = xid;</div><div class='del'>-        request-&gt;rm_direction = CALL;</div><div class='add'>+    request-&gt;rm_xid = xid;</div><div class='add'>+    request-&gt;rm_direction = CALL;</div><div class='ctx'> </div><div class='del'>-        request-&gt;rm_call.cb_rpcvers = 2;</div><div class='del'>-        request-&gt;rm_call.cb_prog = prognum;</div><div class='del'>-        request-&gt;rm_call.cb_vers = progver;</div><div class='del'>-        request-&gt;rm_call.cb_proc = procnum;</div><div class='add'>+    request-&gt;rm_call.cb_rpcvers = 2;</div><div class='add'>+    request-&gt;rm_call.cb_prog = prognum;</div><div class='add'>+    request-&gt;rm_call.cb_vers = progver;</div><div class='add'>+    request-&gt;rm_call.cb_proc = procnum;</div><div class='ctx'> </div><div class='del'>-        request-&gt;rm_call.cb_cred.oa_flavor = AUTH_NONE;</div><div class='del'>-        request-&gt;rm_call.cb_cred.oa_base   = NULL;</div><div class='del'>-        request-&gt;rm_call.cb_cred.oa_length = 0;</div><div class='add'>+    request-&gt;rm_call.cb_cred.oa_flavor = AUTH_NONE;</div><div class='add'>+    request-&gt;rm_call.cb_cred.oa_base = NULL;</div><div class='add'>+    request-&gt;rm_call.cb_cred.oa_length = 0;</div><div class='ctx'> </div><div class='del'>-        request-&gt;rm_call.cb_verf.oa_flavor = AUTH_NONE;</div><div class='del'>-        request-&gt;rm_call.cb_verf.oa_base = NULL;</div><div class='del'>-        request-&gt;rm_call.cb_verf.oa_length = 0;</div><div class='add'>+    request-&gt;rm_call.cb_verf.oa_flavor = AUTH_NONE;</div><div class='add'>+    request-&gt;rm_call.cb_verf.oa_base = NULL;</div><div class='add'>+    request-&gt;rm_call.cb_verf.oa_length = 0;</div><div class='ctx'> </div><div class='del'>-        ret = 0;</div><div class='add'>+    ret = 0;</div><div class='ctx'> out:</div><div class='del'>-        return ret;</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> struct iovec</div><div class='del'>-rpcsvc_callback_build_header (char *recordstart, size_t rlen,</div><div class='add'>+rpcsvc_callback_build_header(char *recordstart, size_t rlen,</div><div class='ctx'>                              struct rpc_msg *request, size_t payload)</div><div class='ctx'> {</div><div class='del'>-        struct iovec    requesthdr = {0, };</div><div class='del'>-        struct iovec    txrecord   = {0, 0};</div><div class='del'>-        int             ret        = -1;</div><div class='del'>-        size_t          fraglen    = 0;</div><div class='del'>-</div><div class='del'>-        ret = rpc_request_to_xdr (request, recordstart, rlen, &amp;requesthdr);</div><div class='del'>-        if (ret == -1) {</div><div class='del'>-                gf_log ("rpcsvc", GF_LOG_DEBUG,</div><div class='del'>-                        "Failed to create RPC request");</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        fraglen = payload + requesthdr.iov_len;</div><div class='del'>-        gf_log ("rpcsvc", GF_LOG_TRACE, "Request fraglen %zu, payload: %zu, "</div><div class='del'>-                "rpc hdr: %zu", fraglen, payload, requesthdr.iov_len);</div><div class='del'>-</div><div class='del'>-        txrecord.iov_base = recordstart;</div><div class='del'>-</div><div class='del'>-        /* Remember, this is only the vec for the RPC header and does not</div><div class='del'>-         * include the payload above. We needed the payload only to calculate</div><div class='del'>-         * the size of the full fragment. This size is sent in the fragment</div><div class='del'>-         * header.</div><div class='del'>-         */</div><div class='del'>-        txrecord.iov_len = requesthdr.iov_len;</div><div class='add'>+    struct iovec requesthdr = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    struct iovec txrecord = {0, 0};</div><div class='add'>+    int ret = -1;</div><div class='add'>+    size_t fraglen = 0;</div><div class='add'>+</div><div class='add'>+    ret = rpc_request_to_xdr(request, recordstart, rlen, &amp;requesthdr);</div><div class='add'>+    if (ret == -1) {</div><div class='add'>+        gf_log("rpcsvc", GF_LOG_WARNING, "Failed to create RPC request");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    fraglen = payload + requesthdr.iov_len;</div><div class='add'>+    gf_log("rpcsvc", GF_LOG_TRACE,</div><div class='add'>+           "Request fraglen %zu, payload: %zu, "</div><div class='add'>+           "rpc hdr: %zu",</div><div class='add'>+           fraglen, payload, requesthdr.iov_len);</div><div class='add'>+</div><div class='add'>+    txrecord.iov_base = recordstart;</div><div class='add'>+</div><div class='add'>+    /* Remember, this is only the vec for the RPC header and does not</div><div class='add'>+     * include the payload above. We needed the payload only to calculate</div><div class='add'>+     * the size of the full fragment. This size is sent in the fragment</div><div class='add'>+     * header.</div><div class='add'>+     */</div><div class='add'>+    txrecord.iov_len = requesthdr.iov_len;</div><div class='ctx'> </div><div class='ctx'> out:</div><div class='del'>-        return txrecord;</div><div class='add'>+    return txrecord;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-struct iobuf *</div><div class='del'>-rpcsvc_callback_build_record (rpcsvc_t *rpc, int prognum, int progver,</div><div class='del'>-                              int procnum, size_t payload, uint64_t xid,</div><div class='del'>-                              struct iovec *recbuf)</div><div class='del'>-{</div><div class='del'>-        struct rpc_msg           request     = {0, };</div><div class='del'>-        struct iobuf            *request_iob = NULL;</div><div class='del'>-        char                    *record      = NULL;</div><div class='del'>-        struct iovec             recordhdr   = {0, };</div><div class='del'>-        size_t                   pagesize    = 0;</div><div class='del'>-        int                      ret         = -1;</div><div class='del'>-</div><div class='del'>-        if ((!rpc) || (!recbuf)) {</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        /* First, try to get a pointer into the buffer which the RPC</div><div class='del'>-         * layer can use.</div><div class='del'>-         */</div><div class='del'>-        request_iob = iobuf_get (rpc-&gt;ctx-&gt;iobuf_pool);</div><div class='del'>-        if (!request_iob) {</div><div class='del'>-                gf_log ("rpcsvc", GF_LOG_ERROR, "Failed to get iobuf");</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='add'>+static struct iobuf *</div><div class='add'>+rpcsvc_callback_build_record(rpcsvc_t *rpc, int prognum, int progver,</div><div class='add'>+                             int procnum, size_t payload, u_long xid,</div><div class='add'>+                             struct iovec *recbuf)</div><div class='add'>+{</div><div class='add'>+    struct rpc_msg request = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    struct iobuf *request_iob = NULL;</div><div class='add'>+    char *record = NULL;</div><div class='add'>+    struct iovec recordhdr = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    size_t pagesize = 0;</div><div class='add'>+    size_t xdr_size = 0;</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    if ((!rpc) || (!recbuf)) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Fill the rpc structure and XDR it into the buffer got above. */</div><div class='add'>+    ret = rpcsvc_fill_callback(prognum, progver, procnum, payload, xid,</div><div class='add'>+                               &amp;request);</div><div class='add'>+    if (ret == -1) {</div><div class='add'>+        gf_log("rpcsvc", GF_LOG_WARNING,</div><div class='add'>+               "cannot build a rpc-request "</div><div class='add'>+               "xid (%lu)",</div><div class='add'>+               xid);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* First, try to get a pointer into the buffer which the RPC</div><div class='add'>+     * layer can use.</div><div class='add'>+     */</div><div class='add'>+    xdr_size = xdr_sizeof((xdrproc_t)xdr_callmsg, &amp;request);</div><div class='add'>+</div><div class='add'>+    request_iob = iobuf_get2(rpc-&gt;ctx-&gt;iobuf_pool, (xdr_size + payload));</div><div class='add'>+    if (!request_iob) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    pagesize = iobuf_pagesize(request_iob);</div><div class='add'>+</div><div class='add'>+    record = iobuf_ptr(request_iob); /* Now we have it. */</div><div class='add'>+</div><div class='add'>+    recordhdr = rpcsvc_callback_build_header(record, pagesize, &amp;request,</div><div class='add'>+                                             payload);</div><div class='add'>+</div><div class='add'>+    if (!recordhdr.iov_base) {</div><div class='add'>+        gf_log("rpc-clnt", GF_LOG_ERROR,</div><div class='add'>+               "Failed to build record "</div><div class='add'>+               " header");</div><div class='add'>+        iobuf_unref(request_iob);</div><div class='add'>+        request_iob = NULL;</div><div class='add'>+        recbuf-&gt;iov_base = NULL;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    recbuf-&gt;iov_base = recordhdr.iov_base;</div><div class='add'>+    recbuf-&gt;iov_len = recordhdr.iov_len;</div><div class='ctx'> </div><div class='del'>-        pagesize = ((struct iobuf_pool *)rpc-&gt;ctx-&gt;iobuf_pool)-&gt;page_size;</div><div class='add'>+out:</div><div class='add'>+    return request_iob;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        record = iobuf_ptr (request_iob);  /* Now we have it. */</div><div class='add'>+int</div><div class='add'>+rpcsvc_request_submit(rpcsvc_t *rpc, rpc_transport_t *trans,</div><div class='add'>+                      rpcsvc_cbk_program_t *prog, int procnum, void *req,</div><div class='add'>+                      glusterfs_ctx_t *ctx, xdrproc_t xdrproc)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int count = 0;</div><div class='add'>+    struct iovec iov = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    struct iobuf *iobuf = NULL;</div><div class='add'>+    ssize_t xdr_size = 0;</div><div class='add'>+    struct iobref *iobref = NULL;</div><div class='add'>+</div><div class='add'>+    if (!req)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    xdr_size = xdr_sizeof(xdrproc, req);</div><div class='add'>+</div><div class='add'>+    iobuf = iobuf_get2(ctx-&gt;iobuf_pool, xdr_size);</div><div class='add'>+    if (!iobuf)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    iov.iov_base = iobuf-&gt;ptr;</div><div class='add'>+    iov.iov_len = iobuf_pagesize(iobuf);</div><div class='add'>+</div><div class='add'>+    ret = xdr_serialize_generic(iov, req, xdrproc);</div><div class='add'>+    if (ret == -1) {</div><div class='add'>+        gf_log(THIS-&gt;name, GF_LOG_WARNING, "failed to create XDR payload");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    iov.iov_len = ret;</div><div class='add'>+    count = 1;</div><div class='add'>+</div><div class='add'>+    iobref = iobref_new();</div><div class='add'>+    if (!iobref) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        gf_log("rpcsvc", GF_LOG_WARNING, "Failed to create iobref");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        /* Fill the rpc structure and XDR it into the buffer got above. */</div><div class='del'>-        ret = rpcsvc_fill_callback (prognum, progver, procnum, payload, xid,</div><div class='del'>-                                    &amp;request);</div><div class='del'>-        if (ret == -1) {</div><div class='del'>-                gf_log ("rpcsvc", GF_LOG_DEBUG, "cannot build a rpc-request "</div><div class='del'>-                        "xid (%"PRIu64")", xid);</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='add'>+    iobref_add(iobref, iobuf);</div><div class='ctx'> </div><div class='del'>-        recordhdr = rpcsvc_callback_build_header (record, pagesize, &amp;request,</div><div class='del'>-                                                  payload);</div><div class='add'>+    ret = rpcsvc_callback_submit(rpc, trans, prog, procnum, &amp;iov, count,</div><div class='add'>+                                 iobref);</div><div class='ctx'> </div><div class='del'>-        if (!recordhdr.iov_base) {</div><div class='del'>-                gf_log ("rpc-clnt", GF_LOG_ERROR, "Failed to build record "</div><div class='del'>-                        " header");</div><div class='del'>-                iobuf_unref (request_iob);</div><div class='del'>-                request_iob = NULL;</div><div class='del'>-                recbuf-&gt;iov_base = NULL;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='add'>+out:</div><div class='add'>+    if (iobuf)</div><div class='add'>+        iobuf_unref(iobuf);</div><div class='ctx'> </div><div class='del'>-        recbuf-&gt;iov_base = recordhdr.iov_base;</div><div class='del'>-        recbuf-&gt;iov_len = recordhdr.iov_len;</div><div class='add'>+    if (iobref)</div><div class='add'>+        iobref_unref(iobref);</div><div class='ctx'> </div><div class='del'>-out:</div><div class='del'>-        return request_iob;</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-rpcsvc_callback_submit (rpcsvc_t *rpc, rpc_transport_t *trans,</div><div class='del'>-                        rpcsvc_cbk_program_t *prog, int procnum,</div><div class='del'>-                        struct iovec *proghdr, int proghdrcount)</div><div class='del'>-{</div><div class='del'>-        struct iobuf          *request_iob = NULL;</div><div class='del'>-        struct iovec           rpchdr      = {0,};</div><div class='del'>-        rpc_transport_req_t    req;</div><div class='del'>-        int                    ret         = -1;</div><div class='del'>-        int                    proglen     = 0;</div><div class='del'>-        uint64_t               callid      = 0;</div><div class='del'>-</div><div class='del'>-        if (!rpc) {</div><div class='del'>-                goto out;</div><div class='add'>+rpcsvc_callback_submit(rpcsvc_t *rpc, rpc_transport_t *trans,</div><div class='add'>+                       rpcsvc_cbk_program_t *prog, int procnum,</div><div class='add'>+                       struct iovec *proghdr, int proghdrcount,</div><div class='add'>+                       struct iobref *iobref)</div><div class='add'>+{</div><div class='add'>+    struct iobuf *request_iob = NULL;</div><div class='add'>+    struct iovec rpchdr = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    rpc_transport_req_t req;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int proglen = 0;</div><div class='add'>+    uint32_t xid = 0;</div><div class='add'>+    gf_boolean_t new_iobref = _gf_false;</div><div class='add'>+</div><div class='add'>+    if (!rpc) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    memset(&amp;req, 0, sizeof(req));</div><div class='add'>+</div><div class='add'>+    if (proghdr) {</div><div class='add'>+        proglen += iov_length(proghdr, proghdrcount);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    xid = rpc_callback_new_callid(trans);</div><div class='add'>+</div><div class='add'>+    request_iob = rpcsvc_callback_build_record(</div><div class='add'>+        rpc, prog-&gt;prognum, prog-&gt;progver, procnum, proglen, xid, &amp;rpchdr);</div><div class='add'>+    if (!request_iob) {</div><div class='add'>+        gf_log("rpcsvc", GF_LOG_WARNING, "cannot build rpc-record");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    if (!iobref) {</div><div class='add'>+        iobref = iobref_new();</div><div class='add'>+        if (!iobref) {</div><div class='add'>+            gf_log("rpcsvc", GF_LOG_WARNING, "Failed to create iobref");</div><div class='add'>+            goto out;</div><div class='ctx'>         }</div><div class='add'>+        new_iobref = 1;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        memset (&amp;req, 0, sizeof (req));</div><div class='del'>-</div><div class='del'>-        callid = rpcsvc_get_callid (rpc);</div><div class='del'>-</div><div class='del'>-        if (proghdr) {</div><div class='del'>-                proglen += iov_length (proghdr, proghdrcount);</div><div class='del'>-        }</div><div class='add'>+    iobref_add(iobref, request_iob);</div><div class='ctx'> </div><div class='del'>-        request_iob = rpcsvc_callback_build_record (rpc, prog-&gt;prognum,</div><div class='del'>-                                                    prog-&gt;progver, procnum,</div><div class='del'>-                                                    proglen, callid,</div><div class='del'>-                                                    &amp;rpchdr);</div><div class='del'>-        if (!request_iob) {</div><div class='del'>-                gf_log ("rpcsvc", GF_LOG_DEBUG,</div><div class='del'>-                        "cannot build rpc-record");</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='add'>+    req.msg.rpchdr = &amp;rpchdr;</div><div class='add'>+    req.msg.rpchdrcount = 1;</div><div class='add'>+    req.msg.proghdr = proghdr;</div><div class='add'>+    req.msg.proghdrcount = proghdrcount;</div><div class='add'>+    req.msg.iobref = iobref;</div><div class='ctx'> </div><div class='del'>-        req.msg.rpchdr = &amp;rpchdr;</div><div class='del'>-        req.msg.rpchdrcount = 1;</div><div class='del'>-        req.msg.proghdr = proghdr;</div><div class='del'>-        req.msg.proghdrcount = proghdrcount;</div><div class='add'>+    ret = rpc_transport_submit_request(trans, &amp;req);</div><div class='add'>+    if (ret == -1) {</div><div class='add'>+        gf_log("rpcsvc", GF_LOG_WARNING, "transmission of rpc-request failed");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        ret = rpc_transport_submit_request (trans, &amp;req);</div><div class='del'>-        if (ret == -1) {</div><div class='del'>-                gf_log ("rpc-clnt", GF_LOG_DEBUG,</div><div class='del'>-                        "transmission of rpc-request failed");</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        ret = 0;</div><div class='add'>+    ret = 0;</div><div class='ctx'> </div><div class='ctx'> out:</div><div class='del'>-        iobuf_unref (request_iob);</div><div class='add'>+    iobuf_unref(request_iob);</div><div class='ctx'> </div><div class='del'>-        return ret;</div><div class='add'>+    if (new_iobref)</div><div class='add'>+        iobref_unref(iobref);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-inline int</div><div class='del'>-rpcsvc_transport_submit (rpc_transport_t *trans, struct iovec *hdrvec,</div><div class='del'>-                         int hdrcount, struct iovec *proghdr, int proghdrcount,</div><div class='del'>-                         struct iovec *progpayload, int progpayloadcount,</div><div class='del'>-                         struct iobref *iobref, void *priv)</div><div class='add'>+int</div><div class='add'>+rpcsvc_transport_submit(rpc_transport_t *trans, struct iovec *rpchdr,</div><div class='add'>+                        int rpchdrcount, struct iovec *proghdr,</div><div class='add'>+                        int proghdrcount, struct iovec *progpayload,</div><div class='add'>+                        int progpayloadcount, struct iobref *iobref, void *priv)</div><div class='ctx'> {</div><div class='del'>-        int                   ret   = -1;</div><div class='del'>-        rpc_transport_reply_t reply = {{0, }};</div><div class='del'>-</div><div class='del'>-        if ((!trans) || (!hdrvec) || (!hdrvec-&gt;iov_base)) {</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        reply.msg.rpchdr = hdrvec;</div><div class='del'>-        reply.msg.rpchdrcount = hdrcount;</div><div class='del'>-        reply.msg.proghdr = proghdr;</div><div class='del'>-        reply.msg.proghdrcount = proghdrcount;</div><div class='del'>-        reply.msg.progpayload = progpayload;</div><div class='del'>-        reply.msg.progpayloadcount = progpayloadcount;</div><div class='del'>-        reply.msg.iobref = iobref;</div><div class='del'>-        reply.private = priv;</div><div class='del'>-</div><div class='del'>-        ret = rpc_transport_submit_reply (trans, &amp;reply);</div><div class='add'>+    int ret = -1;</div><div class='add'>+    rpc_transport_reply_t reply = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    if ((!trans) || (!rpchdr) || (!rpchdr-&gt;iov_base)) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    reply.msg.rpchdr = rpchdr;</div><div class='add'>+    reply.msg.rpchdrcount = rpchdrcount;</div><div class='add'>+    reply.msg.proghdr = proghdr;</div><div class='add'>+    reply.msg.proghdrcount = proghdrcount;</div><div class='add'>+    reply.msg.progpayload = progpayload;</div><div class='add'>+    reply.msg.progpayloadcount = progpayloadcount;</div><div class='add'>+    reply.msg.iobref = iobref;</div><div class='add'>+    reply.private = priv;</div><div class='add'>+</div><div class='add'>+    ret = rpc_transport_submit_reply(trans, &amp;reply);</div><div class='ctx'> </div><div class='ctx'> out:</div><div class='del'>-        return ret;</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-rpcsvc_fill_reply (rpcsvc_request_t *req, struct rpc_msg *reply)</div><div class='add'>+rpcsvc_fill_reply(rpcsvc_request_t *req, struct rpc_msg *reply)</div><div class='ctx'> {</div><div class='del'>-        rpcsvc_program_t        *prog = NULL;</div><div class='del'>-        if ((!req) || (!reply))</div><div class='del'>-                return -1;</div><div class='del'>-</div><div class='del'>-        prog = rpcsvc_request_program (req);</div><div class='del'>-        if (!prog)</div><div class='del'>-                return -1;</div><div class='del'>-</div><div class='del'>-        rpc_fill_empty_reply (reply, req-&gt;xid);</div><div class='add'>+    int ret = -1;</div><div class='add'>+    rpcsvc_program_t *prog = NULL;</div><div class='add'>+    if ((!req) || (!reply))</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+    rpc_fill_empty_reply(reply, req-&gt;xid);</div><div class='add'>+    if (req-&gt;rpc_status == MSG_DENIED) {</div><div class='add'>+        rpc_fill_denied_reply(reply, req-&gt;rpc_err, req-&gt;auth_err);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    prog = rpcsvc_request_program(req);</div><div class='add'>+</div><div class='add'>+    if (req-&gt;rpc_status == MSG_ACCEPTED)</div><div class='add'>+        rpc_fill_accepted_reply(</div><div class='add'>+            reply, req-&gt;rpc_err, (prog) ? prog-&gt;proglowvers : 0,</div><div class='add'>+            (prog) ? prog-&gt;proghighvers : 0, req-&gt;verf.flavour,</div><div class='add'>+            req-&gt;verf.datalen, req-&gt;verf.authdata);</div><div class='add'>+    else</div><div class='add'>+        gf_log(GF_RPCSVC, GF_LOG_ERROR, "Invalid rpc_status value");</div><div class='ctx'> </div><div class='del'>-        if (req-&gt;rpc_status == MSG_DENIED)</div><div class='del'>-                rpc_fill_denied_reply (reply, req-&gt;rpc_err, req-&gt;auth_err);</div><div class='del'>-        else if (req-&gt;rpc_status == MSG_ACCEPTED)</div><div class='del'>-                rpc_fill_accepted_reply (reply, req-&gt;rpc_err, prog-&gt;proglowvers,</div><div class='del'>-                                         prog-&gt;proghighvers, req-&gt;verf.flavour,</div><div class='del'>-                                         req-&gt;verf.datalen,</div><div class='del'>-                                         req-&gt;verf.authdata);</div><div class='del'>-        else</div><div class='del'>-                gf_log (GF_RPCSVC, GF_LOG_ERROR, "Invalid rpc_status value");</div><div class='del'>-</div><div class='del'>-        return 0;</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> /* Given a request and the reply payload, build a reply and encodes the reply</div><div class='ctx'>  * into a record header. This record header is encoded into the vector pointed</div><div class='ctx'>  * to be recbuf.</div><div class='hunk'>@@ -1402,53 +1400,60 @@ rpcsvc_fill_reply (rpcsvc_request_t *req, struct rpc_msg *reply)</div><div class='ctx'>  * we should account for the length of that buffer in the RPC fragment header.</div><div class='ctx'>  */</div><div class='ctx'> struct iobuf *</div><div class='del'>-rpcsvc_record_build_record (rpcsvc_request_t *req, size_t payload,</div><div class='del'>-                            struct iovec *recbuf)</div><div class='del'>-{</div><div class='del'>-        struct rpc_msg          reply;</div><div class='del'>-        struct iobuf            *replyiob = NULL;</div><div class='del'>-        char                    *record = NULL;</div><div class='del'>-        struct iovec            recordhdr = {0, };</div><div class='del'>-        size_t                  pagesize = 0;</div><div class='del'>-        rpcsvc_t                *svc = NULL;</div><div class='del'>-        int                     ret = -1;</div><div class='del'>-</div><div class='del'>-        if ((!req) || (!req-&gt;trans) || (!req-&gt;svc) || (!recbuf))</div><div class='del'>-                return NULL;</div><div class='del'>-</div><div class='del'>-        svc = req-&gt;svc;</div><div class='del'>-        replyiob = iobuf_get (svc-&gt;ctx-&gt;iobuf_pool);</div><div class='del'>-        pagesize = iobpool_pagesize ((struct iobuf_pool *)svc-&gt;ctx-&gt;iobuf_pool);</div><div class='del'>-        if (!replyiob) {</div><div class='del'>-                gf_log (GF_RPCSVC, GF_LOG_ERROR, "Failed to get iobuf");</div><div class='del'>-                goto err_exit;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        record = iobuf_ptr (replyiob);  /* Now we have it. */</div><div class='del'>-</div><div class='del'>-        /* Fill the rpc structure and XDR it into the buffer got above. */</div><div class='del'>-        ret = rpcsvc_fill_reply (req, &amp;reply);</div><div class='del'>-        if (ret)</div><div class='del'>-                goto err_exit;</div><div class='del'>-</div><div class='del'>-        recordhdr = rpcsvc_record_build_header (record, pagesize, reply,</div><div class='del'>-                                                payload);</div><div class='del'>-        if (!recordhdr.iov_base) {</div><div class='del'>-                gf_log (GF_RPCSVC, GF_LOG_ERROR, "Failed to build record "</div><div class='del'>-                        " header");</div><div class='del'>-                iobuf_unref (replyiob);</div><div class='del'>-                replyiob = NULL;</div><div class='del'>-                recbuf-&gt;iov_base = NULL;</div><div class='del'>-                goto err_exit;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        recbuf-&gt;iov_base = recordhdr.iov_base;</div><div class='del'>-        recbuf-&gt;iov_len = recordhdr.iov_len;</div><div class='add'>+rpcsvc_record_build_record(rpcsvc_request_t *req, size_t payload, size_t hdrlen,</div><div class='add'>+                           struct iovec *recbuf)</div><div class='add'>+{</div><div class='add'>+    struct rpc_msg reply;</div><div class='add'>+    struct iobuf *replyiob = NULL;</div><div class='add'>+    char *record = NULL;</div><div class='add'>+    struct iovec recordhdr = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    size_t pagesize = 0;</div><div class='add'>+    size_t xdr_size = 0;</div><div class='add'>+    rpcsvc_t *svc = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    if ((!req) || (!req-&gt;trans) || (!req-&gt;svc) || (!recbuf))</div><div class='add'>+        return NULL;</div><div class='add'>+</div><div class='add'>+    svc = req-&gt;svc;</div><div class='add'>+</div><div class='add'>+    /* Fill the rpc structure and XDR it into the buffer got above. */</div><div class='add'>+    ret = rpcsvc_fill_reply(req, &amp;reply);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto err_exit;</div><div class='add'>+</div><div class='add'>+    xdr_size = xdr_sizeof((xdrproc_t)xdr_replymsg, &amp;reply);</div><div class='add'>+</div><div class='add'>+    /* Payload would include 'readv' size etc too, where as</div><div class='add'>+       that comes as another payload iobuf */</div><div class='add'>+    replyiob = iobuf_get2(svc-&gt;ctx-&gt;iobuf_pool, (xdr_size + hdrlen));</div><div class='add'>+    if (!replyiob) {</div><div class='add'>+        goto err_exit;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    pagesize = iobuf_pagesize(replyiob);</div><div class='add'>+</div><div class='add'>+    record = iobuf_ptr(replyiob); /* Now we have it. */</div><div class='add'>+</div><div class='add'>+    recordhdr = rpcsvc_record_build_header(record, pagesize, reply, payload);</div><div class='add'>+    if (!recordhdr.iov_base) {</div><div class='add'>+        gf_log(GF_RPCSVC, GF_LOG_ERROR,</div><div class='add'>+               "Failed to build record "</div><div class='add'>+               " header");</div><div class='add'>+        iobuf_unref(replyiob);</div><div class='add'>+        replyiob = NULL;</div><div class='add'>+        recbuf-&gt;iov_base = NULL;</div><div class='add'>+        goto err_exit;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    recbuf-&gt;iov_base = recordhdr.iov_base;</div><div class='add'>+    recbuf-&gt;iov_len = recordhdr.iov_len;</div><div class='ctx'> err_exit:</div><div class='del'>-        return replyiob;</div><div class='add'>+    return replyiob;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> /*</div><div class='ctx'>  * The function to submit a program message to the RPC service.</div><div class='ctx'>  * This message is added to the transmission queue of the</div><div class='hunk'>@@ -1476,209 +1481,344 @@ err_exit:</div><div class='ctx'>  */</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-rpcsvc_submit_generic (rpcsvc_request_t *req, struct iovec *proghdr,</div><div class='del'>-                       int hdrcount, struct iovec *payload, int payloadcount,</div><div class='del'>-                       struct iobref *iobref)</div><div class='add'>+rpcsvc_submit_generic(rpcsvc_request_t *req, struct iovec *proghdr,</div><div class='add'>+                      int hdrcount, struct iovec *payload, int payloadcount,</div><div class='add'>+                      struct iobref *iobref)</div><div class='ctx'> {</div><div class='del'>-        int                     ret        = -1, i = 0;</div><div class='del'>-        struct iobuf           *replyiob   = NULL;</div><div class='del'>-        struct iovec            recordhdr  = {0, };</div><div class='del'>-        rpc_transport_t        *trans      = NULL;</div><div class='del'>-        size_t                  msglen     = 0;</div><div class='del'>-        char                    new_iobref = 0;</div><div class='del'>-</div><div class='del'>-        if ((!req) || (!req-&gt;trans))</div><div class='del'>-                return -1;</div><div class='del'>-</div><div class='del'>-        trans = req-&gt;trans;</div><div class='del'>-</div><div class='del'>-        for (i = 0; i &lt; hdrcount; i++) {</div><div class='del'>-                msglen += proghdr[i].iov_len;</div><div class='add'>+    int ret = -1, i = 0;</div><div class='add'>+    struct iobuf *replyiob = NULL;</div><div class='add'>+    struct iovec recordhdr = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    rpc_transport_t *trans = NULL;</div><div class='add'>+    size_t msglen = 0;</div><div class='add'>+    size_t hdrlen = 0;</div><div class='add'>+    char new_iobref = 0;</div><div class='add'>+    rpcsvc_drc_globals_t *drc = NULL;</div><div class='add'>+    gf_latency_t *lat = NULL;</div><div class='add'>+</div><div class='add'>+    if ((!req) || (!req-&gt;trans))</div><div class='add'>+        return -1;</div><div class='add'>+</div><div class='add'>+    if (req-&gt;prog &amp;&amp; req-&gt;begin.tv_sec) {</div><div class='add'>+        if ((req-&gt;procnum &gt;= 0) &amp;&amp; (req-&gt;procnum &lt; req-&gt;prog-&gt;numactors)) {</div><div class='add'>+            timespec_now(&amp;req-&gt;end);</div><div class='add'>+            lat = &amp;req-&gt;prog-&gt;latencies[req-&gt;procnum];</div><div class='add'>+            gf_latency_update(lat, &amp;req-&gt;begin, &amp;req-&gt;end);</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    trans = req-&gt;trans;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; hdrcount; i++) {</div><div class='add'>+        msglen += proghdr[i].iov_len;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; payloadcount; i++) {</div><div class='add'>+        msglen += payload[i].iov_len;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    gf_log(GF_RPCSVC, GF_LOG_TRACE, "Tx message: %zu", msglen);</div><div class='add'>+</div><div class='add'>+    /* Build the buffer containing the encoded RPC reply. */</div><div class='add'>+    replyiob = rpcsvc_record_build_record(req, msglen, hdrlen, &amp;recordhdr);</div><div class='add'>+    if (!replyiob) {</div><div class='add'>+        gf_log(GF_RPCSVC, GF_LOG_ERROR, "Reply record creation failed");</div><div class='add'>+        goto disconnect_exit;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (!iobref) {</div><div class='add'>+        iobref = iobref_new();</div><div class='add'>+        if (!iobref) {</div><div class='add'>+            goto disconnect_exit;</div><div class='ctx'>         }</div><div class='ctx'> </div><div class='del'>-        for (i = 0; i &lt; payloadcount; i++) {</div><div class='del'>-                msglen += payload[i].iov_len;</div><div class='del'>-        }</div><div class='add'>+        new_iobref = 1;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        gf_log (GF_RPCSVC, GF_LOG_TRACE, "Tx message: %zu", msglen);</div><div class='add'>+    iobref_add(iobref, replyiob);</div><div class='ctx'> </div><div class='del'>-        /* Build the buffer containing the encoded RPC reply. */</div><div class='del'>-        replyiob = rpcsvc_record_build_record (req, msglen, &amp;recordhdr);</div><div class='del'>-        if (!replyiob) {</div><div class='del'>-                gf_log (GF_RPCSVC, GF_LOG_ERROR,"Reply record creation failed");</div><div class='del'>-                goto disconnect_exit;</div><div class='del'>-        }</div><div class='add'>+    /* cache the request in the duplicate request cache for appropriate ops */</div><div class='add'>+    if ((req-&gt;reply) &amp;&amp; (rpcsvc_need_drc(req))) {</div><div class='add'>+        drc = req-&gt;svc-&gt;drc;</div><div class='ctx'> </div><div class='del'>-        if (!iobref) {</div><div class='del'>-                iobref = iobref_new ();</div><div class='del'>-                if (!iobref) {</div><div class='del'>-                        gf_log (GF_RPCSVC, GF_LOG_ERROR, "memory allocation "</div><div class='del'>-                                "failed");</div><div class='del'>-                        goto disconnect_exit;</div><div class='del'>-                }</div><div class='add'>+        LOCK(&amp;drc-&gt;lock);</div><div class='add'>+        ret = rpcsvc_cache_reply(req, iobref, &amp;recordhdr, 1, proghdr, hdrcount,</div><div class='add'>+                                 payload, payloadcount);</div><div class='add'>+        UNLOCK(&amp;drc-&gt;lock);</div><div class='add'>+        if (ret &lt; 0) {</div><div class='add'>+            gf_log(GF_RPCSVC, GF_LOG_ERROR, "failed to cache reply");</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = rpcsvc_transport_submit(trans, &amp;recordhdr, 1, proghdr, hdrcount,</div><div class='add'>+                                  payload, payloadcount, iobref,</div><div class='add'>+                                  req-&gt;trans_private);</div><div class='add'>+</div><div class='add'>+    if (ret == -1) {</div><div class='add'>+        gf_log(GF_RPCSVC, GF_LOG_ERROR,</div><div class='add'>+               "failed to submit message "</div><div class='add'>+               "(XID: 0x%x, Program: %s, ProgVers: %d, Proc: %d) to "</div><div class='add'>+               "rpc-transport (%s)",</div><div class='add'>+               req-&gt;xid, req-&gt;prog ? req-&gt;prog-&gt;progname : "(not matched)",</div><div class='add'>+               req-&gt;prog ? req-&gt;prog-&gt;progver : 0, req-&gt;procnum,</div><div class='add'>+               trans ? trans-&gt;name : "");</div><div class='add'>+    } else {</div><div class='add'>+        gf_log(GF_RPCSVC, GF_LOG_TRACE,</div><div class='add'>+               "submitted reply for rpc-message (XID: 0x%x, "</div><div class='add'>+               "Program: %s, ProgVers: %d, Proc: %d) to rpc-transport "</div><div class='add'>+               "(%s)",</div><div class='add'>+               req-&gt;xid, req-&gt;prog ? req-&gt;prog-&gt;progname : "-",</div><div class='add'>+               req-&gt;prog ? req-&gt;prog-&gt;progver : 0, req-&gt;procnum,</div><div class='add'>+               trans ? trans-&gt;name : "");</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-                new_iobref = 1;</div><div class='del'>-        }</div><div class='add'>+disconnect_exit:</div><div class='add'>+    if (replyiob) {</div><div class='add'>+        iobuf_unref(replyiob);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        iobref_add (iobref, replyiob);</div><div class='add'>+    if (new_iobref) {</div><div class='add'>+        iobref_unref(iobref);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        ret = rpcsvc_transport_submit (trans, &amp;recordhdr, 1, proghdr, hdrcount,</div><div class='del'>-                                       payload, payloadcount, iobref,</div><div class='del'>-                                       req-&gt;trans_private);</div><div class='add'>+    rpcsvc_request_destroy(req);</div><div class='ctx'> </div><div class='del'>-        if (ret == -1) {</div><div class='del'>-                gf_log (GF_RPCSVC, GF_LOG_ERROR, "Failed to submit message");</div><div class='del'>-        }</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-disconnect_exit:</div><div class='del'>-        if (replyiob) {</div><div class='del'>-                iobuf_unref (replyiob);</div><div class='del'>-        }</div><div class='add'>+int</div><div class='add'>+rpcsvc_error_reply(rpcsvc_request_t *req)</div><div class='add'>+{</div><div class='add'>+    struct iovec dummyvec = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='ctx'> </div><div class='del'>-        if (new_iobref) {</div><div class='del'>-                iobref_unref (iobref);</div><div class='del'>-        }</div><div class='add'>+    if (!req)</div><div class='add'>+        return -1;</div><div class='ctx'> </div><div class='del'>-        rpcsvc_request_destroy (req);</div><div class='add'>+    gf_log_callingfn("", GF_LOG_DEBUG, "sending a RPC error reply");</div><div class='ctx'> </div><div class='del'>-        return ret;</div><div class='add'>+    /* At this point the req should already have been filled with the</div><div class='add'>+     * appropriate RPC error numbers.</div><div class='add'>+     */</div><div class='add'>+    return rpcsvc_submit_generic(req, &amp;dummyvec, 0, NULL, 0, NULL);</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='add'>+#ifdef IPV6_DEFAULT</div><div class='ctx'> int</div><div class='del'>-rpcsvc_error_reply (rpcsvc_request_t *req)</div><div class='add'>+rpcsvc_program_register_rpcbind6(rpcsvc_program_t *newprog, uint32_t port)</div><div class='ctx'> {</div><div class='del'>-        struct iovec    dummyvec = {0, };</div><div class='add'>+    const int IP_BUF_LEN = 64;</div><div class='add'>+    char addr_buf[IP_BUF_LEN];</div><div class='add'>+</div><div class='add'>+    int err = 0;</div><div class='add'>+    bool_t success = 0;</div><div class='add'>+    struct netconfig *nc;</div><div class='add'>+    struct netbuf *nb;</div><div class='add'>+</div><div class='add'>+    if (!newprog) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    nc = getnetconfigent("tcp6");</div><div class='add'>+    if (!nc) {</div><div class='add'>+        err = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    err = sprintf(addr_buf, "::.%d.%d", port &gt;&gt; 8 &amp; 0xff, port &amp; 0xff);</div><div class='add'>+    if (err &lt; 0) {</div><div class='add'>+        err = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    nb = uaddr2taddr(nc, addr_buf);</div><div class='add'>+    if (!nb) {</div><div class='add'>+        err = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Force the unregistration of the program first.</div><div class='add'>+     * This call may fail if nothing has been registered,</div><div class='add'>+     * which is fine.</div><div class='add'>+     */</div><div class='add'>+    rpcsvc_program_unregister_rpcbind6(newprog);</div><div class='add'>+</div><div class='add'>+    success = rpcb_set(newprog-&gt;prognum, newprog-&gt;progver, nc, nb);</div><div class='add'>+    if (!success) {</div><div class='add'>+        gf_log(GF_RPCSVC, GF_LOG_ERROR,</div><div class='add'>+               "Could not register the IPv6"</div><div class='add'>+               " service with rpcbind");</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    err = 0;</div><div class='ctx'> </div><div class='del'>-        if (!req)</div><div class='del'>-                return -1;</div><div class='del'>-</div><div class='del'>-        /* At this point the req should already have been filled with the</div><div class='del'>-         * appropriate RPC error numbers.</div><div class='del'>-         */</div><div class='del'>-        return rpcsvc_submit_generic (req, &amp;dummyvec, 0, NULL, 0, NULL);</div><div class='add'>+out:</div><div class='add'>+    return err;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+int</div><div class='add'>+rpcsvc_program_unregister_rpcbind6(rpcsvc_program_t *newprog)</div><div class='add'>+{</div><div class='add'>+    int err = 0;</div><div class='add'>+    bool_t success = 0;</div><div class='add'>+    struct netconfig *nc;</div><div class='add'>+</div><div class='add'>+    if (!newprog) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    nc = getnetconfigent("tcp6");</div><div class='add'>+    if (!nc) {</div><div class='add'>+        err = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    success = rpcb_unset(newprog-&gt;prognum, newprog-&gt;progver, nc);</div><div class='add'>+    if (!success) {</div><div class='add'>+        gf_log(GF_RPCSVC, GF_LOG_ERROR,</div><div class='add'>+               "Could not unregister the IPv6"</div><div class='add'>+               " service with rpcbind");</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    err = 0;</div><div class='add'>+out:</div><div class='add'>+    return err;</div><div class='add'>+}</div><div class='add'>+#endif</div><div class='ctx'> </div><div class='ctx'> /* Register the program with the local portmapper service. */</div><div class='del'>-inline int</div><div class='del'>-rpcsvc_program_register_portmap (rpcsvc_program_t *newprog, uint32_t port)</div><div class='add'>+int</div><div class='add'>+rpcsvc_program_register_portmap(rpcsvc_program_t *newprog, uint32_t port)</div><div class='ctx'> {</div><div class='del'>-        int                ret   = 0;</div><div class='del'>-</div><div class='del'>-        if (!newprog) {</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (!(pmap_set (newprog-&gt;prognum, newprog-&gt;progver, IPPROTO_TCP,</div><div class='del'>-                        port))) {</div><div class='del'>-                gf_log (GF_RPCSVC, GF_LOG_ERROR, "Could not register with"</div><div class='del'>-                        " portmap");</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        ret = 0;</div><div class='add'>+    int ret = -1; /* FAIL */</div><div class='add'>+</div><div class='add'>+    if (!newprog) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* pmap_set() returns 0 for FAIL and 1 for SUCCESS */</div><div class='add'>+    if (!(pmap_set(newprog-&gt;prognum, newprog-&gt;progver, IPPROTO_TCP, port))) {</div><div class='add'>+        gf_log(GF_RPCSVC, GF_LOG_ERROR,</div><div class='add'>+               "Could not register with"</div><div class='add'>+               " portmap %d %d %u",</div><div class='add'>+               newprog-&gt;prognum, newprog-&gt;progver, port);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = 0; /* SUCCESS */</div><div class='ctx'> out:</div><div class='del'>-        return ret;</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='del'>-inline int</div><div class='del'>-rpcsvc_program_unregister_portmap (rpcsvc_program_t *prog)</div><div class='add'>+int</div><div class='add'>+rpcsvc_program_unregister_portmap(rpcsvc_program_t *prog)</div><div class='ctx'> {</div><div class='del'>-        if (!prog)</div><div class='del'>-                return -1;</div><div class='add'>+    int ret = -1;</div><div class='ctx'> </div><div class='del'>-        if (!(pmap_unset(prog-&gt;prognum, prog-&gt;progver))) {</div><div class='del'>-                gf_log (GF_RPCSVC, GF_LOG_ERROR, "Could not unregister with"</div><div class='del'>-                        " portmap");</div><div class='del'>-                return -1;</div><div class='del'>-        }</div><div class='add'>+    if (!prog)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    if (!(pmap_unset(prog-&gt;prognum, prog-&gt;progver))) {</div><div class='add'>+        gf_log(GF_RPCSVC, GF_LOG_ERROR,</div><div class='add'>+               "Could not unregister with"</div><div class='add'>+               " portmap");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        return 0;</div><div class='add'>+    ret = 0;</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+int</div><div class='add'>+rpcsvc_register_portmap_enabled(rpcsvc_t *svc)</div><div class='add'>+{</div><div class='add'>+    return svc-&gt;register_portmap;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int32_t</div><div class='del'>-rpcsvc_get_listener_port (rpcsvc_listener_t *listener)</div><div class='add'>+rpcsvc_get_listener_port(rpcsvc_listener_t *listener)</div><div class='ctx'> {</div><div class='del'>-        int32_t listener_port = -1;</div><div class='add'>+    int32_t listener_port = -1;</div><div class='ctx'> </div><div class='del'>-        if ((listener == NULL) || (listener-&gt;trans == NULL)) {</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='add'>+    if ((listener == NULL) || (listener-&gt;trans == NULL)) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        switch (listener-&gt;trans-&gt;myinfo.sockaddr.ss_family) {</div><div class='add'>+    switch (listener-&gt;trans-&gt;myinfo.sockaddr.ss_family) {</div><div class='ctx'>         case AF_INET:</div><div class='del'>-                listener_port = ((struct sockaddr_in6 *)&amp;listener-&gt;trans-&gt;myinfo.sockaddr)-&gt;sin6_port;</div><div class='del'>-                break;</div><div class='add'>+            listener_port = ((struct sockaddr_in *)&amp;listener-&gt;trans-&gt;myinfo</div><div class='add'>+                                 .sockaddr)</div><div class='add'>+                                -&gt;sin_port;</div><div class='add'>+            break;</div><div class='ctx'> </div><div class='ctx'>         case AF_INET6:</div><div class='del'>-                listener_port = ((struct sockaddr_in *)&amp;listener-&gt;trans-&gt;myinfo.sockaddr)-&gt;sin_port; </div><div class='del'>-                break;</div><div class='add'>+            listener_port = ((struct sockaddr_in6 *)&amp;listener-&gt;trans-&gt;myinfo</div><div class='add'>+                                 .sockaddr)</div><div class='add'>+                                -&gt;sin6_port;</div><div class='add'>+            break;</div><div class='ctx'> </div><div class='ctx'>         default:</div><div class='del'>-                gf_log (GF_RPCSVC, GF_LOG_DEBUG,</div><div class='del'>-                        "invalid address family (%d)",</div><div class='del'>-                        listener-&gt;trans-&gt;myinfo.sockaddr.ss_family);</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='add'>+            gf_log(GF_RPCSVC, GF_LOG_DEBUG, "invalid address family (%d)",</div><div class='add'>+                   listener-&gt;trans-&gt;myinfo.sockaddr.ss_family);</div><div class='add'>+            goto out;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        listener_port = ntohs (listener_port);</div><div class='add'>+    listener_port = ntohs(listener_port);</div><div class='ctx'> </div><div class='ctx'> out:</div><div class='del'>-        return listener_port;</div><div class='add'>+    return listener_port;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> rpcsvc_listener_t *</div><div class='del'>-rpcsvc_get_listener (rpcsvc_t *svc, uint16_t port, rpc_transport_t *trans)</div><div class='add'>+rpcsvc_get_listener(rpcsvc_t *svc, uint16_t port, rpc_transport_t *trans)</div><div class='ctx'> {</div><div class='del'>-        rpcsvc_listener_t  *listener      = NULL;</div><div class='del'>-        char                found         = 0;</div><div class='del'>-        uint32_t            listener_port = 0; </div><div class='del'>-</div><div class='del'>-        if (!svc) {</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        pthread_mutex_lock (&amp;svc-&gt;rpclock);</div><div class='add'>+    rpcsvc_listener_t *listener = NULL;</div><div class='add'>+    char found = 0;</div><div class='add'>+    rpcsvc_listener_t *next = NULL;</div><div class='add'>+    uint32_t listener_port = 0;</div><div class='add'>+</div><div class='add'>+    if (!svc) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    pthread_rwlock_rdlock(&amp;svc-&gt;rpclock);</div><div class='add'>+    {</div><div class='add'>+        list_for_each_entry_safe(listener, next, &amp;svc-&gt;listeners, list)</div><div class='ctx'>         {</div><div class='del'>-                list_for_each_entry (listener, &amp;svc-&gt;listeners, list) {</div><div class='del'>-                        if (trans != NULL) {</div><div class='del'>-                                if (listener-&gt;trans == trans) {</div><div class='del'>-                                        found = 1;</div><div class='del'>-                                        break;</div><div class='del'>-                                }</div><div class='del'>-</div><div class='del'>-                                continue;</div><div class='del'>-                        }</div><div class='add'>+            if (trans != NULL) {</div><div class='add'>+                if (listener-&gt;trans == trans) {</div><div class='add'>+                    found = 1;</div><div class='add'>+                    break;</div><div class='add'>+                }</div><div class='ctx'> </div><div class='del'>-                        listener_port = rpcsvc_get_listener_port (listener);</div><div class='del'>-                        if (listener_port == -1) {</div><div class='del'>-                                gf_log (GF_RPCSVC, GF_LOG_DEBUG,</div><div class='del'>-                                        "invalid port for listener %s",</div><div class='del'>-                                        listener-&gt;trans-&gt;name);</div><div class='del'>-                                continue;</div><div class='del'>-                        }</div><div class='add'>+                continue;</div><div class='add'>+            }</div><div class='ctx'> </div><div class='del'>-                        if (listener_port == port) {</div><div class='del'>-                                found = 1;</div><div class='del'>-                                break;</div><div class='del'>-                        }</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='del'>-        pthread_mutex_unlock (&amp;svc-&gt;rpclock);</div><div class='add'>+            listener_port = rpcsvc_get_listener_port(listener);</div><div class='add'>+            if (listener_port == -1) {</div><div class='add'>+                gf_log(GF_RPCSVC, GF_LOG_ERROR, "invalid port for listener %s",</div><div class='add'>+                       listener-&gt;trans-&gt;name);</div><div class='add'>+                continue;</div><div class='add'>+            }</div><div class='ctx'> </div><div class='del'>-        if (!found) {</div><div class='del'>-                listener = NULL;</div><div class='add'>+            if (listener_port == port) {</div><div class='add'>+                found = 1;</div><div class='add'>+                break;</div><div class='add'>+            }</div><div class='ctx'>         }</div><div class='add'>+    }</div><div class='add'>+    pthread_rwlock_unlock(&amp;svc-&gt;rpclock);</div><div class='add'>+</div><div class='add'>+    if (!found) {</div><div class='add'>+        listener = NULL;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='ctx'> out:</div><div class='del'>-        return listener;</div><div class='add'>+    return listener;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> /* The only difference between the generic submit and this one is that the</div><div class='ctx'>  * generic submit is also used for submitting RPC error replies in where there</div><div class='ctx'>  * are no payloads so the msgvec and msgbuf can be NULL.</div><div class='hunk'>@@ -1686,531 +1826,1470 @@ out:</div><div class='ctx'>  * we must perform NULL checks before calling the generic submit.</div><div class='ctx'>  */</div><div class='ctx'> int</div><div class='del'>-rpcsvc_submit_message (rpcsvc_request_t *req, struct iovec *proghdr,</div><div class='del'>-                       int hdrcount, struct iovec *payload, int payloadcount,</div><div class='del'>-                       struct iobref *iobref)</div><div class='add'>+rpcsvc_submit_message(rpcsvc_request_t *req, struct iovec *proghdr,</div><div class='add'>+                      int hdrcount, struct iovec *payload, int payloadcount,</div><div class='add'>+                      struct iobref *iobref)</div><div class='ctx'> {</div><div class='del'>-        if ((!req) || (!req-&gt;trans) || (!proghdr) || (!proghdr-&gt;iov_base))</div><div class='del'>-                return -1;</div><div class='add'>+    if ((!req) || (!req-&gt;trans) || (!proghdr) || (!proghdr-&gt;iov_base))</div><div class='add'>+        return -1;</div><div class='ctx'> </div><div class='del'>-        return rpcsvc_submit_generic (req, proghdr, hdrcount, payload,</div><div class='del'>-                                      payloadcount, iobref);</div><div class='add'>+    return rpcsvc_submit_generic(req, proghdr, hdrcount, payload, payloadcount,</div><div class='add'>+                                 iobref);</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+void</div><div class='add'>+rpcsvc_program_destroy(rpcsvc_program_t *program)</div><div class='add'>+{</div><div class='add'>+    if (program) {</div><div class='add'>+        GF_FREE(program-&gt;latencies);</div><div class='add'>+        GF_FREE(program);</div><div class='add'>+    }</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-rpcsvc_program_unregister (rpcsvc_t *svc, rpcsvc_program_t *prog)</div><div class='add'>+rpcsvc_program_unregister(rpcsvc_t *svc, rpcsvc_program_t *program)</div><div class='ctx'> {</div><div class='del'>-        int                     ret = -1;</div><div class='del'>-</div><div class='del'>-        if (!svc || !prog) {</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='add'>+    int ret = -1;</div><div class='add'>+    rpcsvc_program_t *prog = NULL;</div><div class='add'>+    if (!svc || !program) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    pthread_rwlock_rdlock(&amp;svc-&gt;rpclock);</div><div class='add'>+    {</div><div class='add'>+        list_for_each_entry(prog, &amp;svc-&gt;programs, program)</div><div class='add'>+        {</div><div class='add'>+            if ((prog-&gt;prognum == program-&gt;prognum) &amp;&amp;</div><div class='add'>+                (prog-&gt;progver == program-&gt;progver)) {</div><div class='add'>+                break;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    pthread_rwlock_unlock(&amp;svc-&gt;rpclock);</div><div class='add'>+</div><div class='add'>+    ret = rpcsvc_program_unregister_portmap(program);</div><div class='add'>+    if (ret == -1) {</div><div class='add'>+        gf_log(GF_RPCSVC, GF_LOG_ERROR,</div><div class='add'>+               "portmap unregistration of"</div><div class='add'>+               " program failed");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+#ifdef IPV6_DEFAULT</div><div class='add'>+    ret = rpcsvc_program_unregister_rpcbind6(program);</div><div class='add'>+    if (ret == -1) {</div><div class='add'>+        gf_log(GF_RPCSVC, GF_LOG_ERROR,</div><div class='add'>+               "rpcbind (ipv6)"</div><div class='add'>+               " unregistration of program failed");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+#endif</div><div class='ctx'> </div><div class='del'>-        ret = rpcsvc_program_unregister_portmap (prog);</div><div class='del'>-        if (ret == -1) {</div><div class='del'>-                gf_log (GF_RPCSVC, GF_LOG_ERROR, "portmap unregistration of"</div><div class='del'>-                        " program failed");</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='add'>+    gf_log(GF_RPCSVC, GF_LOG_DEBUG,</div><div class='add'>+           "Program unregistered: %s, Num: %d,"</div><div class='add'>+           " Ver: %d, Port: %d",</div><div class='add'>+           prog-&gt;progname, prog-&gt;prognum, prog-&gt;progver, prog-&gt;progport);</div><div class='ctx'> </div><div class='del'>-        gf_log (GF_RPCSVC, GF_LOG_DEBUG, "Program unregistered: %s, Num: %d,"</div><div class='del'>-                " Ver: %d, Port: %d", prog-&gt;progname, prog-&gt;prognum,</div><div class='del'>-                prog-&gt;progver, prog-&gt;progport);</div><div class='add'>+    if (prog-&gt;ownthread) {</div><div class='add'>+        prog-&gt;alive = _gf_false;</div><div class='add'>+        ret = 0;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        pthread_mutex_lock (&amp;svc-&gt;rpclock);</div><div class='del'>-        {</div><div class='del'>-                list_del (&amp;prog-&gt;program);</div><div class='del'>-        }</div><div class='del'>-        pthread_mutex_unlock (&amp;svc-&gt;rpclock);</div><div class='add'>+    pthread_rwlock_wrlock(&amp;svc-&gt;rpclock);</div><div class='add'>+    {</div><div class='add'>+        list_del_init(&amp;prog-&gt;program);</div><div class='add'>+    }</div><div class='add'>+    pthread_rwlock_unlock(&amp;svc-&gt;rpclock);</div><div class='ctx'> </div><div class='del'>-        ret = 0;</div><div class='add'>+    ret = 0;</div><div class='ctx'> out:</div><div class='del'>-        if (ret == -1) {</div><div class='del'>-                gf_log (GF_RPCSVC, GF_LOG_ERROR, "Program unregistration failed"</div><div class='del'>-                        ": %s, Num: %d, Ver: %d, Port: %d", prog-&gt;progname,</div><div class='del'>-                        prog-&gt;prognum, prog-&gt;progver, prog-&gt;progport);</div><div class='add'>+    rpcsvc_program_destroy(prog);</div><div class='add'>+</div><div class='add'>+    if (ret == -1) {</div><div class='add'>+        if (program) {</div><div class='add'>+            gf_log(GF_RPCSVC, GF_LOG_ERROR,</div><div class='add'>+                   "Program "</div><div class='add'>+                   "unregistration failed"</div><div class='add'>+                   ": %s, Num: %d, Ver: %d, Port: %d",</div><div class='add'>+                   program-&gt;progname, program-&gt;prognum, program-&gt;progver,</div><div class='add'>+                   program-&gt;progport);</div><div class='add'>+        } else {</div><div class='add'>+            gf_log(GF_RPCSVC, GF_LOG_ERROR, "Program not found");</div><div class='ctx'>         }</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        return ret;</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='del'>-inline int</div><div class='del'>-rpcsvc_transport_peername (rpc_transport_t *trans, char *hostname, int hostlen)</div><div class='add'>+int</div><div class='add'>+rpcsvc_transport_peername(rpc_transport_t *trans, char *hostname, int hostlen)</div><div class='ctx'> {</div><div class='del'>-        if (!trans) {</div><div class='del'>-                return -1;</div><div class='del'>-        }</div><div class='add'>+    if (!trans) {</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        return rpc_transport_get_peername (trans, hostname, hostlen);</div><div class='add'>+    return rpc_transport_get_peername(trans, hostname, hostlen);</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='del'>-inline int</div><div class='del'>-rpcsvc_transport_peeraddr (rpc_transport_t *trans, char *addrstr, int addrlen,</div><div class='del'>-                           struct sockaddr_storage *sa, socklen_t sasize)</div><div class='add'>+int</div><div class='add'>+rpcsvc_transport_peeraddr(rpc_transport_t *trans, char *addrstr, int addrlen,</div><div class='add'>+                          struct sockaddr_storage *sa, socklen_t sasize)</div><div class='ctx'> {</div><div class='del'>-        if (!trans) {</div><div class='del'>-                return -1;</div><div class='del'>-        }</div><div class='add'>+    if (!trans) {</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        return rpc_transport_get_peeraddr(trans, addrstr, addrlen, sa,</div><div class='del'>-                                          sasize);</div><div class='add'>+    return rpc_transport_get_peeraddr(trans, addrstr, addrlen, sa, sasize);</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+rpcsvc_listener_t *</div><div class='add'>+rpcsvc_listener_alloc(rpcsvc_t *svc, rpc_transport_t *trans)</div><div class='add'>+{</div><div class='add'>+    rpcsvc_listener_t *listener = NULL;</div><div class='add'>+</div><div class='add'>+    listener = GF_CALLOC(1, sizeof(*listener), gf_common_mt_rpcsvc_listener_t);</div><div class='add'>+    if (!listener) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    listener-&gt;trans = trans;</div><div class='add'>+    listener-&gt;svc = svc;</div><div class='add'>+</div><div class='add'>+    INIT_LIST_HEAD(&amp;listener-&gt;list);</div><div class='ctx'> </div><div class='del'>-rpc_transport_t *</div><div class='del'>-rpcsvc_transport_create (rpcsvc_t *svc, dict_t *options, char *name)</div><div class='add'>+    pthread_rwlock_wrlock(&amp;svc-&gt;rpclock);</div><div class='add'>+    {</div><div class='add'>+        list_add_tail(&amp;listener-&gt;list, &amp;svc-&gt;listeners);</div><div class='add'>+    }</div><div class='add'>+    pthread_rwlock_unlock(&amp;svc-&gt;rpclock);</div><div class='add'>+out:</div><div class='add'>+    return listener;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+rpcsvc_create_listener(rpcsvc_t *svc, dict_t *options, char *name)</div><div class='ctx'> {</div><div class='del'>-        int                ret   = -1;</div><div class='del'>-        rpc_transport_t   *trans = NULL;</div><div class='add'>+    rpc_transport_t *trans = NULL;</div><div class='add'>+    rpcsvc_listener_t *listener = NULL;</div><div class='add'>+    int32_t ret = -1;</div><div class='add'>+</div><div class='add'>+    if (!svc || !options) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    trans = rpc_transport_load(svc-&gt;ctx, options, name);</div><div class='add'>+    if (!trans) {</div><div class='add'>+        gf_log(GF_RPCSVC, GF_LOG_WARNING,</div><div class='add'>+               "cannot create listener, "</div><div class='add'>+               "initing the transport failed");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = rpc_transport_listen(trans);</div><div class='add'>+    if (ret == -EADDRINUSE || ret == -1) {</div><div class='add'>+        gf_log(GF_RPCSVC, GF_LOG_WARNING, "listening on transport failed");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = rpc_transport_register_notify(trans, rpcsvc_notify, svc);</div><div class='add'>+    if (ret == -1) {</div><div class='add'>+        gf_log(GF_RPCSVC, GF_LOG_WARNING, "registering notify failed");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    listener = rpcsvc_listener_alloc(svc, trans);</div><div class='add'>+    if (listener == NULL) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        trans = rpc_transport_load (svc-&gt;ctx, options, name);</div><div class='del'>-        if (!trans) {</div><div class='del'>-                gf_log (GF_RPCSVC, GF_LOG_DEBUG, "cannot create listener, "</div><div class='del'>-                        "initing the transport failed");</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='add'>+    ret = 0;</div><div class='add'>+out:</div><div class='add'>+    if (!listener &amp;&amp; trans) {</div><div class='add'>+        rpc_transport_disconnect(trans, _gf_true);</div><div class='add'>+        rpc_transport_cleanup(trans);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        ret = rpc_transport_listen (trans);</div><div class='add'>+int32_t</div><div class='add'>+rpcsvc_create_listeners(rpcsvc_t *svc, dict_t *options, char *name)</div><div class='add'>+{</div><div class='add'>+    int32_t ret = -1, count = 0;</div><div class='add'>+    data_t *data = NULL;</div><div class='add'>+    char *str = NULL, *ptr = NULL, *transport_name = NULL;</div><div class='add'>+    char *transport_type = NULL, *saveptr = NULL, *tmp = NULL;</div><div class='add'>+</div><div class='add'>+    if ((svc == NULL) || (options == NULL) || (name == NULL)) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    data = dict_get(options, "transport-type");</div><div class='add'>+    if (data == NULL) {</div><div class='add'>+        gf_log(GF_RPCSVC, GF_LOG_ERROR, "option transport-type not set");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    transport_type = data_to_str(data);</div><div class='add'>+    if (transport_type == NULL) {</div><div class='add'>+        gf_log(GF_RPCSVC, GF_LOG_ERROR, "option transport-type not set");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* duplicate transport_type, since following dict_set will free it */</div><div class='add'>+    transport_type = gf_strdup(transport_type);</div><div class='add'>+    if (transport_type == NULL) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    str = gf_strdup(transport_type);</div><div class='add'>+    if (str == NULL) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ptr = strtok_r(str, ",", &amp;saveptr);</div><div class='add'>+</div><div class='add'>+    while (ptr != NULL) {</div><div class='add'>+        tmp = gf_strdup(ptr);</div><div class='add'>+        if (tmp == NULL) {</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        ret = gf_asprintf(&amp;transport_name, "%s.%s", tmp, name);</div><div class='ctx'>         if (ret == -1) {</div><div class='del'>-                gf_log (GF_RPCSVC, GF_LOG_DEBUG,</div><div class='del'>-                        "listening on transport failed");</div><div class='del'>-                goto out;</div><div class='add'>+            goto out;</div><div class='ctx'>         }</div><div class='ctx'> </div><div class='del'>-        ret = rpc_transport_register_notify (trans, rpcsvc_notify, svc);</div><div class='add'>+        ret = dict_set_dynstr(options, "transport-type", tmp);</div><div class='ctx'>         if (ret == -1) {</div><div class='del'>-                gf_log (GF_RPCSVC, GF_LOG_DEBUG, "registering notify failed");</div><div class='del'>-                goto out;</div><div class='add'>+            goto out;</div><div class='ctx'>         }</div><div class='ctx'> </div><div class='del'>-        ret = 0;</div><div class='del'>-out:</div><div class='del'>-        if ((ret == -1) &amp;&amp; (trans)) {</div><div class='del'>-                rpc_transport_disconnect (trans);</div><div class='del'>-                trans = NULL;</div><div class='add'>+        tmp = NULL;</div><div class='add'>+        ptr = strtok_r(NULL, ",", &amp;saveptr);</div><div class='add'>+</div><div class='add'>+        ret = rpcsvc_create_listener(svc, options, transport_name);</div><div class='add'>+        if (ret != 0) {</div><div class='add'>+            goto out;</div><div class='ctx'>         }</div><div class='ctx'> </div><div class='del'>-        return trans;</div><div class='del'>-}</div><div class='add'>+        dict_del(options, "notify-poller-death");</div><div class='add'>+        GF_FREE(transport_name);</div><div class='add'>+        transport_name = NULL;</div><div class='add'>+        count++;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-rpcsvc_listener_t *</div><div class='del'>-rpcsvc_listener_alloc (rpcsvc_t *svc, rpc_transport_t *trans)</div><div class='del'>-{</div><div class='del'>-        rpcsvc_listener_t *listener = NULL;</div><div class='add'>+    ret = dict_set_dynstr(options, "transport-type", transport_type);</div><div class='add'>+    if (ret == -1) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        listener = GF_CALLOC (1, sizeof (*listener),</div><div class='del'>-                              gf_common_mt_rpcsvc_listener_t);</div><div class='del'>-        if (!listener) {</div><div class='del'>-                gf_log (GF_RPCSVC, GF_LOG_ERROR, "memory allocation failed");</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='add'>+    transport_type = NULL;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    GF_FREE(str);</div><div class='add'>+</div><div class='add'>+    GF_FREE(transport_type);</div><div class='ctx'> </div><div class='del'>-        listener-&gt;trans = trans;</div><div class='del'>-        listener-&gt;svc = svc;</div><div class='add'>+    GF_FREE(tmp);</div><div class='ctx'> </div><div class='del'>-        INIT_LIST_HEAD (&amp;listener-&gt;list);</div><div class='add'>+    GF_FREE(transport_name);</div><div class='ctx'> </div><div class='del'>-        pthread_mutex_lock (&amp;svc-&gt;rpclock);</div><div class='add'>+    if (count &gt; 0) {</div><div class='add'>+        return count;</div><div class='add'>+    } else {</div><div class='add'>+        return ret;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+rpcsvc_unregister_notify(rpcsvc_t *svc, rpcsvc_notify_t notify, void *mydata)</div><div class='add'>+{</div><div class='add'>+    rpcsvc_notify_wrapper_t *wrapper = NULL, *tmp = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    if (!svc || !notify) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    pthread_rwlock_wrlock(&amp;svc-&gt;rpclock);</div><div class='add'>+    {</div><div class='add'>+        list_for_each_entry_safe(wrapper, tmp, &amp;svc-&gt;notify, list)</div><div class='ctx'>         {</div><div class='del'>-                list_add_tail (&amp;listener-&gt;list, &amp;svc-&gt;listeners);</div><div class='add'>+            if ((wrapper-&gt;notify == notify) &amp;&amp; (mydata == wrapper-&gt;data)) {</div><div class='add'>+                list_del_init(&amp;wrapper-&gt;list);</div><div class='add'>+                GF_FREE(wrapper);</div><div class='add'>+                ret++;</div><div class='add'>+            }</div><div class='ctx'>         }</div><div class='del'>-        pthread_mutex_unlock (&amp;svc-&gt;rpclock);</div><div class='add'>+    }</div><div class='add'>+    pthread_rwlock_unlock(&amp;svc-&gt;rpclock);</div><div class='add'>+</div><div class='ctx'> out:</div><div class='del'>-        return listener;</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+int</div><div class='add'>+rpcsvc_register_notify(rpcsvc_t *svc, rpcsvc_notify_t notify, void *mydata)</div><div class='add'>+{</div><div class='add'>+    rpcsvc_notify_wrapper_t *wrapper = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    wrapper = rpcsvc_notify_wrapper_alloc();</div><div class='add'>+    if (!wrapper) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    svc-&gt;mydata = mydata;</div><div class='add'>+    wrapper-&gt;data = mydata;</div><div class='add'>+    wrapper-&gt;notify = notify;</div><div class='add'>+</div><div class='add'>+    pthread_rwlock_wrlock(&amp;svc-&gt;rpclock);</div><div class='add'>+    {</div><div class='add'>+        list_add_tail(&amp;wrapper-&gt;list, &amp;svc-&gt;notify);</div><div class='add'>+        svc-&gt;notify_count++;</div><div class='add'>+    }</div><div class='add'>+    pthread_rwlock_unlock(&amp;svc-&gt;rpclock);</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-int32_t</div><div class='del'>-rpcsvc_create_listener (rpcsvc_t *svc, dict_t *options, char *name)</div><div class='add'>+void *</div><div class='add'>+rpcsvc_request_handler(void *arg)</div><div class='ctx'> {</div><div class='del'>-        rpc_transport_t   *trans    = NULL;</div><div class='del'>-        rpcsvc_listener_t *listener = NULL;</div><div class='del'>-        int32_t            ret      = -1; </div><div class='add'>+    rpcsvc_request_queue_t *queue = NULL;</div><div class='add'>+    rpcsvc_program_t *program = NULL;</div><div class='add'>+    rpcsvc_request_t *req = NULL, *tmp_req = NULL;</div><div class='add'>+    rpcsvc_actor_t *actor = NULL;</div><div class='add'>+    gf_boolean_t done = _gf_false;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    struct list_head tmp_list;</div><div class='ctx'> </div><div class='del'>-        if (!svc || !options) {</div><div class='del'>-                goto out;</div><div class='add'>+    queue = arg;</div><div class='add'>+    program = queue-&gt;program;</div><div class='add'>+</div><div class='add'>+    INIT_LIST_HEAD(&amp;tmp_list);</div><div class='add'>+</div><div class='add'>+    if (!program)</div><div class='add'>+        return NULL;</div><div class='add'>+</div><div class='add'>+    while (1) {</div><div class='add'>+        pthread_mutex_lock(&amp;queue-&gt;queue_lock);</div><div class='add'>+        {</div><div class='add'>+            if (!program-&gt;alive &amp;&amp; list_empty(&amp;queue-&gt;request_queue)) {</div><div class='add'>+                done = 1;</div><div class='add'>+                goto unlock;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            while (list_empty(&amp;queue-&gt;request_queue)) {</div><div class='add'>+                queue-&gt;waiting = _gf_true;</div><div class='add'>+                pthread_cond_wait(&amp;queue-&gt;queue_cond, &amp;queue-&gt;queue_lock);</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            queue-&gt;waiting = _gf_false;</div><div class='add'>+</div><div class='add'>+            if (!list_empty(&amp;queue-&gt;request_queue)) {</div><div class='add'>+                INIT_LIST_HEAD(&amp;tmp_list);</div><div class='add'>+                list_splice_init(&amp;queue-&gt;request_queue, &amp;tmp_list);</div><div class='add'>+            }</div><div class='ctx'>         }</div><div class='add'>+    unlock:</div><div class='add'>+        pthread_mutex_unlock(&amp;queue-&gt;queue_lock);</div><div class='ctx'> </div><div class='del'>-        trans = rpcsvc_transport_create (svc, options, name);</div><div class='del'>-        if (!trans) {</div><div class='del'>-                goto out;</div><div class='add'>+        list_for_each_entry_safe(req, tmp_req, &amp;tmp_list, request_list)</div><div class='add'>+        {</div><div class='add'>+            if (req) {</div><div class='add'>+                list_del_init(&amp;req-&gt;request_list);</div><div class='add'>+</div><div class='add'>+                if (req-&gt;prognum == RPCSVC_INFRA_PROGRAM) {</div><div class='add'>+                    switch (req-&gt;procnum) {</div><div class='add'>+                        case RPCSVC_PROC_EVENT_THREAD_DEATH:</div><div class='add'>+                            gf_log(GF_RPCSVC, GF_LOG_INFO,</div><div class='add'>+                                   "event thread died, exiting request handler "</div><div class='add'>+                                   "thread for queue %d of program %s",</div><div class='add'>+                                   (int)(queue - &amp;program-&gt;request_queue[0]),</div><div class='add'>+                                   program-&gt;progname);</div><div class='add'>+                            done = 1;</div><div class='add'>+                            pthread_mutex_lock(&amp;program-&gt;thr_lock);</div><div class='add'>+                            {</div><div class='add'>+                                rpcsvc_toggle_queue_status(</div><div class='add'>+                                    program, queue,</div><div class='add'>+                                    program-&gt;request_queue_status);</div><div class='add'>+                                program-&gt;threadcount--;</div><div class='add'>+                            }</div><div class='add'>+                            pthread_mutex_unlock(&amp;program-&gt;thr_lock);</div><div class='add'>+                            rpcsvc_request_destroy(req);</div><div class='add'>+                            break;</div><div class='add'>+</div><div class='add'>+                        default:</div><div class='add'>+                            break;</div><div class='add'>+                    }</div><div class='add'>+                } else {</div><div class='add'>+                    THIS = req-&gt;svc-&gt;xl;</div><div class='add'>+                    actor = rpcsvc_program_actor(req);</div><div class='add'>+                    ret = actor-&gt;actor(req);</div><div class='add'>+</div><div class='add'>+                    if (ret != 0) {</div><div class='add'>+                        rpcsvc_check_and_reply_error(ret, NULL, req);</div><div class='add'>+                    }</div><div class='add'>+                    req = NULL;</div><div class='add'>+                }</div><div class='add'>+            }</div><div class='ctx'>         }</div><div class='ctx'> </div><div class='del'>-        listener = rpcsvc_listener_alloc (svc, trans);</div><div class='del'>-        if (listener == NULL) {</div><div class='del'>-                goto out;</div><div class='add'>+        if (done)</div><div class='add'>+            break;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return NULL;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+rpcsvc_program_register(rpcsvc_t *svc, rpcsvc_program_t *program,</div><div class='add'>+                        gf_boolean_t add_to_head)</div><div class='add'>+{</div><div class='add'>+    int ret = -1, i = 0;</div><div class='add'>+    rpcsvc_program_t *newprog = NULL;</div><div class='add'>+    char already_registered = 0;</div><div class='add'>+    pthread_mutexattr_t attr[EVENT_MAX_THREADS];</div><div class='add'>+    pthread_mutexattr_t thr_attr;</div><div class='add'>+</div><div class='add'>+    if (!svc) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (program-&gt;actors == NULL) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    pthread_rwlock_rdlock(&amp;svc-&gt;rpclock);</div><div class='add'>+    {</div><div class='add'>+        list_for_each_entry(newprog, &amp;svc-&gt;programs, program)</div><div class='add'>+        {</div><div class='add'>+            if ((newprog-&gt;prognum == program-&gt;prognum) &amp;&amp;</div><div class='add'>+                (newprog-&gt;progver == program-&gt;progver)) {</div><div class='add'>+                already_registered = 1;</div><div class='add'>+                break;</div><div class='add'>+            }</div><div class='ctx'>         }</div><div class='add'>+    }</div><div class='add'>+    pthread_rwlock_unlock(&amp;svc-&gt;rpclock);</div><div class='ctx'> </div><div class='add'>+    if (already_registered) {</div><div class='ctx'>         ret = 0;</div><div class='del'>-out:</div><div class='del'>-        if (!listener &amp;&amp; trans) {</div><div class='del'>-                rpc_transport_disconnect (trans);</div><div class='del'>-        }</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    newprog = GF_CALLOC(1, sizeof(*newprog), gf_common_mt_rpcsvc_program_t);</div><div class='add'>+    if (newprog == NULL) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    memcpy(newprog, program, sizeof(*program));</div><div class='add'>+    newprog-&gt;latencies = gf_latency_new(program-&gt;numactors);</div><div class='add'>+    if (!newprog-&gt;latencies) {</div><div class='add'>+        rpcsvc_program_destroy(newprog);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    INIT_LIST_HEAD(&amp;newprog-&gt;program);</div><div class='add'>+    pthread_mutexattr_init(&amp;thr_attr);</div><div class='add'>+    pthread_mutexattr_settype(&amp;thr_attr, PTHREAD_MUTEX_ADAPTIVE_NP);</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; EVENT_MAX_THREADS; i++) {</div><div class='add'>+        pthread_mutexattr_init(&amp;attr[i]);</div><div class='add'>+        pthread_mutexattr_settype(&amp;attr[i], PTHREAD_MUTEX_ADAPTIVE_NP);</div><div class='add'>+        INIT_LIST_HEAD(&amp;newprog-&gt;request_queue[i].request_queue);</div><div class='add'>+        pthread_mutex_init(&amp;newprog-&gt;request_queue[i].queue_lock, &amp;attr[i]);</div><div class='add'>+        pthread_cond_init(&amp;newprog-&gt;request_queue[i].queue_cond, NULL);</div><div class='add'>+        newprog-&gt;request_queue[i].program = newprog;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    pthread_mutex_init(&amp;newprog-&gt;thr_lock, &amp;thr_attr);</div><div class='add'>+    pthread_cond_init(&amp;newprog-&gt;thr_cond, NULL);</div><div class='add'>+</div><div class='add'>+    newprog-&gt;alive = _gf_true;</div><div class='add'>+</div><div class='add'>+    if (gf_async_ctrl.enabled) {</div><div class='add'>+        newprog-&gt;ownthread = _gf_false;</div><div class='add'>+        newprog-&gt;synctask = _gf_false;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* make sure synctask gets priority over ownthread */</div><div class='add'>+    if (newprog-&gt;synctask)</div><div class='add'>+        newprog-&gt;ownthread = _gf_false;</div><div class='add'>+</div><div class='add'>+    if (newprog-&gt;ownthread) {</div><div class='add'>+        struct event_pool *ep = svc-&gt;ctx-&gt;event_pool;</div><div class='add'>+        newprog-&gt;eventthreadcount = ep-&gt;eventthreadcount;</div><div class='add'>+</div><div class='add'>+        pthread_key_create(&amp;newprog-&gt;req_queue_key, NULL);</div><div class='add'>+        newprog-&gt;thr_queue = 1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    pthread_rwlock_wrlock(&amp;svc-&gt;rpclock);</div><div class='add'>+    {</div><div class='add'>+        if (add_to_head)</div><div class='add'>+            list_add(&amp;newprog-&gt;program, &amp;svc-&gt;programs);</div><div class='add'>+        else</div><div class='add'>+            list_add_tail(&amp;newprog-&gt;program, &amp;svc-&gt;programs);</div><div class='add'>+    }</div><div class='add'>+    pthread_rwlock_unlock(&amp;svc-&gt;rpclock);</div><div class='ctx'> </div><div class='del'>-        return ret;</div><div class='add'>+    ret = 0;</div><div class='add'>+    gf_log(GF_RPCSVC, GF_LOG_DEBUG,</div><div class='add'>+           "New program registered: %s, Num: %d,"</div><div class='add'>+           " Ver: %d, Port: %d",</div><div class='add'>+           newprog-&gt;progname, newprog-&gt;prognum, newprog-&gt;progver,</div><div class='add'>+           newprog-&gt;progport);</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (ret == -1) {</div><div class='add'>+        gf_log(GF_RPCSVC, GF_LOG_ERROR,</div><div class='add'>+               "Program registration failed:"</div><div class='add'>+               " %s, Num: %d, Ver: %d, Port: %d",</div><div class='add'>+               program-&gt;progname, program-&gt;prognum, program-&gt;progver,</div><div class='add'>+               program-&gt;progport);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+static void</div><div class='add'>+free_prog_details(gf_dump_rsp *rsp)</div><div class='add'>+{</div><div class='add'>+    gf_prog_detail *prev = NULL;</div><div class='add'>+    gf_prog_detail *trav = NULL;</div><div class='add'>+</div><div class='add'>+    trav = rsp-&gt;prog;</div><div class='add'>+    while (trav) {</div><div class='add'>+        prev = trav;</div><div class='add'>+        trav = trav-&gt;next;</div><div class='add'>+        GF_FREE(prev);</div><div class='add'>+    }</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-int32_t</div><div class='del'>-rpcsvc_create_listeners (rpcsvc_t *svc, dict_t *options, char *name)</div><div class='add'>+static int</div><div class='add'>+build_prog_details(rpcsvc_request_t *req, gf_dump_rsp *rsp)</div><div class='ctx'> {</div><div class='del'>-        int32_t  ret            = -1, count = 0;</div><div class='del'>-        data_t  *data           = NULL;</div><div class='del'>-        char    *str            = NULL, *ptr = NULL, *transport_name = NULL;</div><div class='del'>-        char    *transport_type = NULL, *saveptr = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    rpcsvc_program_t *program = NULL;</div><div class='add'>+    gf_prog_detail *prog = NULL;</div><div class='add'>+    gf_prog_detail *prev = NULL;</div><div class='ctx'> </div><div class='del'>-        if ((svc == NULL) || (options == NULL) || (name == NULL)) {</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-         </div><div class='del'>-        data = dict_get (options, "transport-type");</div><div class='del'>-        if (data == NULL) {</div><div class='del'>-                gf_log (GF_RPCSVC, GF_LOG_DEBUG,</div><div class='del'>-                        "option transport-type not set");</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='add'>+    if (!req || !req-&gt;trans || !req-&gt;svc)</div><div class='add'>+        goto out;</div><div class='ctx'> </div><div class='del'>-        transport_type = data_to_str (data);</div><div class='del'>-        if (transport_type == NULL) {</div><div class='del'>-                gf_log (GF_RPCSVC, GF_LOG_DEBUG,</div><div class='del'>-                        "option transport-type not set");</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='add'>+    pthread_rwlock_rdlock(&amp;req-&gt;svc-&gt;rpclock);</div><div class='add'>+    {</div><div class='add'>+        list_for_each_entry(program, &amp;req-&gt;svc-&gt;programs, program)</div><div class='add'>+        {</div><div class='add'>+            prog = GF_CALLOC(1, sizeof(*prog), 0);</div><div class='add'>+            if (!prog)</div><div class='add'>+                goto unlock;</div><div class='ctx'> </div><div class='del'>-        /* duplicate transport_type, since following dict_set will free it */</div><div class='del'>-        transport_type = gf_strdup (transport_type);</div><div class='del'>-        if (transport_type == NULL) {</div><div class='del'>-                gf_log (GF_RPCSVC, GF_LOG_ERROR, "out of memory");</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='add'>+            prog-&gt;progname = program-&gt;progname;</div><div class='add'>+            prog-&gt;prognum = program-&gt;prognum;</div><div class='add'>+            prog-&gt;progver = program-&gt;progver;</div><div class='ctx'> </div><div class='del'>-        str = gf_strdup (transport_type);</div><div class='del'>-        if (str == NULL) {</div><div class='del'>-                gf_log (GF_RPCSVC, GF_LOG_ERROR, "out of memory");</div><div class='del'>-                goto out;</div><div class='add'>+            if (!rsp-&gt;prog)</div><div class='add'>+                rsp-&gt;prog = prog;</div><div class='add'>+            if (prev)</div><div class='add'>+                prev-&gt;next = prog;</div><div class='add'>+            prev = prog;</div><div class='ctx'>         }</div><div class='add'>+        if (prev)</div><div class='add'>+            ret = 0;</div><div class='add'>+    }</div><div class='add'>+unlock:</div><div class='add'>+    pthread_rwlock_unlock(&amp;req-&gt;svc-&gt;rpclock);</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        ptr = strtok_r (str, ",", &amp;saveptr);</div><div class='add'>+static int</div><div class='add'>+rpcsvc_ping(rpcsvc_request_t *req)</div><div class='add'>+{</div><div class='add'>+    char rsp_buf[8 * 1024] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    gf_common_rsp rsp = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    struct iovec iov = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int ret = -1;</div><div class='add'>+    uint32_t ping_rsp_len = 0;</div><div class='add'>+</div><div class='add'>+    ping_rsp_len = xdr_sizeof((xdrproc_t)xdr_gf_common_rsp, &amp;rsp);</div><div class='add'>+</div><div class='add'>+    iov.iov_base = rsp_buf;</div><div class='add'>+    iov.iov_len = ping_rsp_len;</div><div class='add'>+</div><div class='add'>+    ret = xdr_serialize_generic(iov, &amp;rsp, (xdrproc_t)xdr_gf_common_rsp);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        ret = RPCSVC_ACTOR_ERROR;</div><div class='add'>+    } else {</div><div class='add'>+        rsp.op_ret = 0;</div><div class='add'>+        rpcsvc_submit_generic(req, &amp;iov, 1, NULL, 0, NULL);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        while (ptr != NULL) {</div><div class='del'>-                ptr = gf_strdup (ptr);</div><div class='del'>-                if (ptr == NULL) {</div><div class='del'>-                        gf_log (GF_RPCSVC, GF_LOG_ERROR, "out of memory");</div><div class='del'>-                        goto out;</div><div class='del'>-                }</div><div class='add'>+static int</div><div class='add'>+rpcsvc_dump(rpcsvc_request_t *req)</div><div class='add'>+{</div><div class='add'>+    char rsp_buf[8 * 1024] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    gf_dump_rsp rsp = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    struct iovec iov = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int op_errno = EINVAL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    uint32_t dump_rsp_len = 0;</div><div class='add'>+</div><div class='add'>+    if (!req)</div><div class='add'>+        goto sendrsp;</div><div class='add'>+</div><div class='add'>+    ret = build_prog_details(req, &amp;rsp);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        op_errno = -ret;</div><div class='add'>+        goto sendrsp;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    op_errno = 0;</div><div class='add'>+</div><div class='add'>+sendrsp:</div><div class='add'>+    rsp.op_errno = gf_errno_to_error(op_errno);</div><div class='add'>+    rsp.op_ret = ret;</div><div class='add'>+</div><div class='add'>+    dump_rsp_len = xdr_sizeof((xdrproc_t)xdr_gf_dump_rsp, &amp;rsp);</div><div class='add'>+</div><div class='add'>+    iov.iov_base = rsp_buf;</div><div class='add'>+    iov.iov_len = dump_rsp_len;</div><div class='add'>+</div><div class='add'>+    ret = xdr_serialize_generic(iov, &amp;rsp, (xdrproc_t)xdr_gf_dump_rsp);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        ret = RPCSVC_ACTOR_ERROR;</div><div class='add'>+    } else {</div><div class='add'>+        rpcsvc_submit_generic(req, &amp;iov, 1, NULL, 0, NULL);</div><div class='add'>+        ret = 0;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-                ret = asprintf (&amp;transport_name, "%s.%s", ptr, name);</div><div class='del'>-                if (ret == -1) {</div><div class='del'>-                        goto out;</div><div class='del'>-                }</div><div class='add'>+    free_prog_details(&amp;rsp);</div><div class='ctx'> </div><div class='del'>-                ret = dict_set_dynstr (options, "transport-type", ptr);</div><div class='del'>-                if (ret == -1) {</div><div class='del'>-                        goto out;</div><div class='del'>-                }</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+rpcsvc_init_options(rpcsvc_t *svc, dict_t *options)</div><div class='add'>+{</div><div class='add'>+    char *optstr = NULL;</div><div class='add'>+    int ret = -1;</div><div class='ctx'> </div><div class='del'>-                ptr = strtok_r (NULL, ",", &amp;saveptr);</div><div class='add'>+    if ((!svc) || (!options))</div><div class='add'>+        return -1;</div><div class='ctx'> </div><div class='del'>-                ret = rpcsvc_create_listener (svc, options, transport_name);</div><div class='del'>-                if (ret != 0) {</div><div class='del'>-                        goto out;</div><div class='del'>-                }</div><div class='add'>+    svc-&gt;memfactor = RPCSVC_DEFAULT_MEMFACTOR;</div><div class='ctx'> </div><div class='del'>-                count++;</div><div class='add'>+    svc-&gt;register_portmap = _gf_true;</div><div class='add'>+    if (dict_get(options, "rpc.register-with-portmap")) {</div><div class='add'>+        ret = dict_get_str(options, "rpc.register-with-portmap", &amp;optstr);</div><div class='add'>+        if (ret &lt; 0) {</div><div class='add'>+            gf_log(GF_RPCSVC, GF_LOG_ERROR,</div><div class='add'>+                   "Failed to parse "</div><div class='add'>+                   "dict");</div><div class='add'>+            goto out;</div><div class='ctx'>         }</div><div class='ctx'> </div><div class='del'>-        ptr = NULL;</div><div class='add'>+        ret = gf_string2boolean(optstr, &amp;svc-&gt;register_portmap);</div><div class='add'>+        if (ret &lt; 0) {</div><div class='add'>+            gf_log(GF_RPCSVC, GF_LOG_ERROR,</div><div class='add'>+                   "Failed to parse bool "</div><div class='add'>+                   "string");</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (!svc-&gt;register_portmap)</div><div class='add'>+        gf_log(GF_RPCSVC, GF_LOG_DEBUG,</div><div class='add'>+               "Portmap registration "</div><div class='add'>+               "disabled");</div><div class='add'>+    ret = 0;</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        ret = dict_set_dynstr (options, "transport-type", transport_type);</div><div class='add'>+int</div><div class='add'>+rpcsvc_reconfigure_options(rpcsvc_t *svc, dict_t *options)</div><div class='add'>+{</div><div class='add'>+    xlator_t *xlator = NULL;</div><div class='add'>+    xlator_list_t *volentry = NULL;</div><div class='add'>+    char *srchkey = NULL;</div><div class='add'>+    char *keyval = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    if ((!svc) || (!svc-&gt;options) || (!options))</div><div class='add'>+        return (-1);</div><div class='add'>+</div><div class='add'>+    /* Fetch the xlator from svc */</div><div class='add'>+    xlator = svc-&gt;xl;</div><div class='add'>+    if (!xlator)</div><div class='add'>+        return (-1);</div><div class='add'>+</div><div class='add'>+    /* Reconfigure the volume specific rpc-auth.addr allow part */</div><div class='add'>+    volentry = xlator-&gt;children;</div><div class='add'>+    while (volentry) {</div><div class='add'>+        ret = gf_asprintf(&amp;srchkey, "rpc-auth.addr.%s.allow",</div><div class='add'>+                          volentry-&gt;xlator-&gt;name);</div><div class='ctx'>         if (ret == -1) {</div><div class='del'>-                goto out;</div><div class='add'>+            gf_log(GF_RPCSVC, GF_LOG_ERROR, "asprintf failed");</div><div class='add'>+            return (-1);</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        /* key-string: rpc-auth.addr.&lt;volname&gt;.allow</div><div class='add'>+         *</div><div class='add'>+         * IMP: Delete the OLD key/value pair from dict.</div><div class='add'>+         * And set the NEW key/value pair IFF the option is SET</div><div class='add'>+         * in reconfigured volfile.</div><div class='add'>+         *</div><div class='add'>+         * NB: If rpc-auth.addr.&lt;volname&gt;.allow is not SET explicitly,</div><div class='add'>+         *     build_nfs_graph() sets it as "*" i.e. anonymous.</div><div class='add'>+         */</div><div class='add'>+        dict_del(svc-&gt;options, srchkey);</div><div class='add'>+        if (!dict_get_str(options, srchkey, &amp;keyval)) {</div><div class='add'>+            ret = dict_set_dynstr_with_alloc(svc-&gt;options, srchkey, keyval);</div><div class='add'>+            if (ret &lt; 0) {</div><div class='add'>+                gf_log(GF_RPCSVC, GF_LOG_ERROR, "dict_set_str error");</div><div class='add'>+                GF_FREE(srchkey);</div><div class='add'>+                return (-1);</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        GF_FREE(srchkey);</div><div class='add'>+        volentry = volentry-&gt;next;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Reconfigure the volume specific rpc-auth.addr reject part */</div><div class='add'>+    volentry = xlator-&gt;children;</div><div class='add'>+    while (volentry) {</div><div class='add'>+        ret = gf_asprintf(&amp;srchkey, "rpc-auth.addr.%s.reject",</div><div class='add'>+                          volentry-&gt;xlator-&gt;name);</div><div class='add'>+        if (ret == -1) {</div><div class='add'>+            gf_log(GF_RPCSVC, GF_LOG_ERROR, "asprintf failed");</div><div class='add'>+            return (-1);</div><div class='ctx'>         }</div><div class='ctx'> </div><div class='del'>-        transport_type = NULL;</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        if (str != NULL) {</div><div class='del'>-                GF_FREE (str);</div><div class='add'>+        /* key-string: rpc-auth.addr.&lt;volname&gt;.reject</div><div class='add'>+         *</div><div class='add'>+         * IMP: Delete the OLD key/value pair from dict.</div><div class='add'>+         * And set the NEW key/value pair IFF the option is SET</div><div class='add'>+         * in reconfigured volfile.</div><div class='add'>+         *</div><div class='add'>+         * NB: No default value for reject key.</div><div class='add'>+         */</div><div class='add'>+        dict_del(svc-&gt;options, srchkey);</div><div class='add'>+        if (!dict_get_str(options, srchkey, &amp;keyval)) {</div><div class='add'>+            ret = dict_set_dynstr_with_alloc(svc-&gt;options, srchkey, keyval);</div><div class='add'>+            if (ret &lt; 0) {</div><div class='add'>+                gf_log(GF_RPCSVC, GF_LOG_ERROR, "dict_set_str error");</div><div class='add'>+                GF_FREE(srchkey);</div><div class='add'>+                return (-1);</div><div class='add'>+            }</div><div class='ctx'>         }</div><div class='ctx'> </div><div class='del'>-        if (transport_type != NULL) {</div><div class='del'>-                GF_FREE (transport_type);</div><div class='del'>-        }</div><div class='add'>+        GF_FREE(srchkey);</div><div class='add'>+        volentry = volentry-&gt;next;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        if (ptr != NULL) {</div><div class='del'>-                GF_FREE (ptr);</div><div class='del'>-        }</div><div class='add'>+    ret = rpcsvc_init_options(svc, options);</div><div class='add'>+    if (ret)</div><div class='add'>+        return (-1);</div><div class='ctx'> </div><div class='del'>-        return count;</div><div class='add'>+    return rpcsvc_auth_reconf(svc, options);</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-rpcsvc_unregister_notify (rpcsvc_t *svc, rpcsvc_notify_t notify, void *mydata)</div><div class='add'>+rpcsvc_transport_unix_options_build(dict_t *dict, char *filepath)</div><div class='ctx'> {</div><div class='del'>-        rpcsvc_notify_wrapper_t *wrapper = NULL, *tmp = NULL;</div><div class='del'>-        int                      ret     = 0;</div><div class='add'>+    char *fpath = NULL;</div><div class='add'>+    int ret = -1;</div><div class='ctx'> </div><div class='del'>-        if (!svc || !notify) {</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='add'>+    GF_ASSERT(filepath);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("rpcsvc", dict, out);</div><div class='ctx'> </div><div class='del'>-        pthread_mutex_lock (&amp;svc-&gt;rpclock);</div><div class='del'>-        {</div><div class='del'>-                list_for_each_entry_safe (wrapper, tmp, &amp;svc-&gt;notify, list) {</div><div class='del'>-                        if ((wrapper-&gt;notify == notify)</div><div class='del'>-                            &amp;&amp; (mydata == wrapper-&gt;data)) {</div><div class='del'>-                                list_del_init (&amp;wrapper-&gt;list);</div><div class='del'>-                                GF_FREE (wrapper);</div><div class='del'>-                                ret++;</div><div class='del'>-                        }</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='del'>-        pthread_mutex_unlock (&amp;svc-&gt;rpclock);</div><div class='add'>+    fpath = gf_strdup(filepath);</div><div class='add'>+    if (!fpath) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_set_dynstr(dict, "transport.socket.listen-path", fpath);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    ret = dict_set_str(dict, "transport.address-family", "unix");</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='ctx'> </div><div class='add'>+    ret = dict_set_str(dict, "transport.socket.nodelay", "off");</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    ret = dict_set_str(dict, "transport-type", "socket");</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='ctx'> out:</div><div class='del'>-        return ret;</div><div class='add'>+    if (ret) {</div><div class='add'>+        GF_FREE(fpath);</div><div class='add'>+    }</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+/*</div><div class='add'>+ * Configure() the rpc.outstanding-rpc-limit param.</div><div class='add'>+ * If dict_get_int32() for dict-key "rpc.outstanding-rpc-limit" FAILS,</div><div class='add'>+ * it would set the value as "defvalue". Otherwise it would fetch the</div><div class='add'>+ * value and round up to multiple-of-8. defvalue must be +ve.</div><div class='add'>+ *</div><div class='add'>+ * NB: defval or set-value "0" is special which means unlimited/65536.</div><div class='add'>+ */</div><div class='ctx'> int</div><div class='del'>-rpcsvc_register_notify (rpcsvc_t *svc, rpcsvc_notify_t notify, void *mydata)</div><div class='add'>+rpcsvc_set_outstanding_rpc_limit(rpcsvc_t *svc, dict_t *options, int defvalue)</div><div class='ctx'> {</div><div class='del'>-        rpcsvc_notify_wrapper_t *wrapper = NULL;</div><div class='del'>-        int                      ret     = -1;</div><div class='add'>+    int ret = -1; /* FAILURE */</div><div class='add'>+    int rpclim = 0;</div><div class='add'>+    static char *rpclimkey = "rpc.outstanding-rpc-limit";</div><div class='add'>+</div><div class='add'>+    if ((!svc) || (!options))</div><div class='add'>+        return (-1);</div><div class='add'>+</div><div class='add'>+    if ((defvalue &lt; RPCSVC_MIN_OUTSTANDING_RPC_LIMIT) ||</div><div class='add'>+        (defvalue &gt; RPCSVC_MAX_OUTSTANDING_RPC_LIMIT)) {</div><div class='add'>+        return (-1);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Fetch the rpc.outstanding-rpc-limit from dict. */</div><div class='add'>+    ret = dict_get_int32(options, rpclimkey, &amp;rpclim);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        /* Fall back to default for FAILURE */</div><div class='add'>+        rpclim = defvalue;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Round up to multiple-of-8. It must not exceed</div><div class='add'>+     * RPCSVC_MAX_OUTSTANDING_RPC_LIMIT.</div><div class='add'>+     */</div><div class='add'>+    rpclim = ((rpclim + 8 - 1) &gt;&gt; 3) * 8;</div><div class='add'>+    if (rpclim &gt; RPCSVC_MAX_OUTSTANDING_RPC_LIMIT) {</div><div class='add'>+        rpclim = RPCSVC_MAX_OUTSTANDING_RPC_LIMIT;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (svc-&gt;outstanding_rpc_limit != rpclim) {</div><div class='add'>+        svc-&gt;outstanding_rpc_limit = rpclim;</div><div class='add'>+        gf_log(GF_RPCSVC, GF_LOG_INFO, "Configured %s with value %d", rpclimkey,</div><div class='add'>+               rpclim);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return (0);</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        wrapper = rpcsvc_notify_wrapper_alloc ();</div><div class='del'>-        if (!wrapper) {</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-        svc-&gt;mydata   = mydata;  /* this_xlator */</div><div class='del'>-        wrapper-&gt;data = mydata;</div><div class='del'>-        wrapper-&gt;notify = notify;</div><div class='add'>+/*</div><div class='add'>+ * Enable throttling for rpcsvc_t svc.</div><div class='add'>+ * Returns 0 on success, -1 otherwise.</div><div class='add'>+ */</div><div class='add'>+int</div><div class='add'>+rpcsvc_set_throttle_on(rpcsvc_t *svc)</div><div class='add'>+{</div><div class='add'>+    if (!svc)</div><div class='add'>+        return -1;</div><div class='ctx'> </div><div class='del'>-        pthread_mutex_lock (&amp;svc-&gt;rpclock);</div><div class='del'>-        {</div><div class='del'>-                list_add_tail (&amp;wrapper-&gt;list, &amp;svc-&gt;notify);</div><div class='del'>-                svc-&gt;notify_count++;</div><div class='del'>-        }</div><div class='del'>-        pthread_mutex_unlock (&amp;svc-&gt;rpclock);</div><div class='add'>+    svc-&gt;throttle = _gf_true;</div><div class='ctx'> </div><div class='del'>-        ret = 0;</div><div class='del'>-out:</div><div class='del'>-        return ret;</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+/*</div><div class='add'>+ * Disable throttling for rpcsvc_t svc.</div><div class='add'>+ * Returns 0 on success, -1 otherwise.</div><div class='add'>+ */</div><div class='add'>+int</div><div class='add'>+rpcsvc_set_throttle_off(rpcsvc_t *svc)</div><div class='add'>+{</div><div class='add'>+    if (!svc)</div><div class='add'>+        return -1;</div><div class='add'>+</div><div class='add'>+    svc-&gt;throttle = _gf_false;</div><div class='ctx'> </div><div class='del'>-inline int</div><div class='del'>-rpcsvc_program_register (rpcsvc_t *svc, rpcsvc_program_t *program)</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+ * Get throttle state for rpcsvc_t svc.</div><div class='add'>+ * Returns value of attribute throttle on success, _gf_false otherwise.</div><div class='add'>+ */</div><div class='add'>+gf_boolean_t</div><div class='add'>+rpcsvc_get_throttle(rpcsvc_t *svc)</div><div class='ctx'> {</div><div class='del'>-        int                      ret              = -1;</div><div class='add'>+    if (!svc)</div><div class='add'>+        return _gf_false;</div><div class='ctx'> </div><div class='del'>-        if (!svc) {</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='add'>+    return svc-&gt;throttle;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        if (program-&gt;actors == NULL) {</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='add'>+/* Function call to cleanup resources for svc</div><div class='add'>+ */</div><div class='add'>+int</div><div class='add'>+rpcsvc_destroy(rpcsvc_t *svc)</div><div class='add'>+{</div><div class='add'>+    struct rpcsvc_auth_list *auth = NULL;</div><div class='add'>+    struct rpcsvc_auth_list *tmp = NULL;</div><div class='add'>+    rpcsvc_listener_t *listener = NULL;</div><div class='add'>+    rpcsvc_listener_t *next = NULL;</div><div class='add'>+    int ret = 0;</div><div class='ctx'> </div><div class='del'>-        INIT_LIST_HEAD (&amp;program-&gt;program);</div><div class='add'>+    if (!svc)</div><div class='add'>+        return ret;</div><div class='ctx'> </div><div class='del'>-        pthread_mutex_lock (&amp;svc-&gt;rpclock);</div><div class='del'>-        {</div><div class='del'>-                list_add_tail (&amp;program-&gt;program, &amp;svc-&gt;programs);</div><div class='del'>-        }</div><div class='del'>-        pthread_mutex_unlock (&amp;svc-&gt;rpclock);</div><div class='add'>+    list_for_each_entry_safe(listener, next, &amp;svc-&gt;listeners, list)</div><div class='add'>+    {</div><div class='add'>+        rpcsvc_listener_destroy(listener);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        ret = 0;</div><div class='del'>-        gf_log (GF_RPCSVC, GF_LOG_DEBUG, "New program registered: %s, Num: %d,"</div><div class='del'>-                " Ver: %d, Port: %d", program-&gt;progname, program-&gt;prognum,</div><div class='del'>-                program-&gt;progver, program-&gt;progport);</div><div class='add'>+    list_for_each_entry_safe(auth, tmp, &amp;svc-&gt;authschemes, authlist)</div><div class='add'>+    {</div><div class='add'>+        list_del_init(&amp;auth-&gt;authlist);</div><div class='add'>+        GF_FREE(auth);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-out:</div><div class='del'>-        if (ret == -1) {</div><div class='del'>-                gf_log (GF_RPCSVC, GF_LOG_ERROR, "Program registration failed:"</div><div class='del'>-                        " %s, Num: %d, Ver: %d, Port: %d", program-&gt;progname,</div><div class='del'>-                        program-&gt;prognum, program-&gt;progver, program-&gt;progport);</div><div class='del'>-        }</div><div class='add'>+    rpcsvc_program_unregister(svc, &amp;gluster_dump_prog);</div><div class='add'>+    if (svc-&gt;rxpool) {</div><div class='add'>+        mem_pool_destroy(svc-&gt;rxpool);</div><div class='add'>+        svc-&gt;rxpool = NULL;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        return ret;</div><div class='add'>+    pthread_rwlock_destroy(&amp;svc-&gt;rpclock);</div><div class='add'>+    GF_FREE(svc);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+/* The global RPC service initializer.</div><div class='add'>+ */</div><div class='add'>+rpcsvc_t *</div><div class='add'>+rpcsvc_init(xlator_t *xl, glusterfs_ctx_t *ctx, dict_t *options,</div><div class='add'>+            uint32_t poolcount)</div><div class='add'>+{</div><div class='add'>+    rpcsvc_t *svc = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    if ((!xl) || (!ctx) || (!options))</div><div class='add'>+        return NULL;</div><div class='add'>+</div><div class='add'>+    svc = GF_CALLOC(1, sizeof(*svc), gf_common_mt_rpcsvc_t);</div><div class='add'>+    if (!svc)</div><div class='add'>+        return NULL;</div><div class='add'>+</div><div class='add'>+    pthread_rwlock_init(&amp;svc-&gt;rpclock, NULL);</div><div class='add'>+    INIT_LIST_HEAD(&amp;svc-&gt;authschemes);</div><div class='add'>+    INIT_LIST_HEAD(&amp;svc-&gt;notify);</div><div class='add'>+    INIT_LIST_HEAD(&amp;svc-&gt;listeners);</div><div class='add'>+    INIT_LIST_HEAD(&amp;svc-&gt;programs);</div><div class='add'>+</div><div class='add'>+    ret = rpcsvc_init_options(svc, options);</div><div class='add'>+    if (ret == -1) {</div><div class='add'>+        gf_log(GF_RPCSVC, GF_LOG_ERROR, "Failed to init options");</div><div class='add'>+        goto free_svc;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (!poolcount)</div><div class='add'>+        poolcount = RPCSVC_POOLCOUNT_MULT * svc-&gt;memfactor;</div><div class='add'>+</div><div class='add'>+    gf_log(GF_RPCSVC, GF_LOG_TRACE, "rx pool: %d", poolcount);</div><div class='add'>+    svc-&gt;rxpool = mem_pool_new(rpcsvc_request_t, poolcount);</div><div class='add'>+    /* TODO: leak */</div><div class='add'>+    if (!svc-&gt;rxpool) {</div><div class='add'>+        gf_log(GF_RPCSVC, GF_LOG_ERROR, "mem pool allocation failed");</div><div class='add'>+        goto free_svc;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = rpcsvc_auth_init(svc, options);</div><div class='add'>+    if (ret == -1) {</div><div class='add'>+        gf_log(GF_RPCSVC, GF_LOG_ERROR,</div><div class='add'>+               "Failed to init "</div><div class='add'>+               "authentication");</div><div class='add'>+        goto free_svc;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = -1;</div><div class='add'>+    svc-&gt;options = options;</div><div class='add'>+    svc-&gt;ctx = ctx;</div><div class='add'>+    svc-&gt;xl = xl;</div><div class='add'>+    gf_log(GF_RPCSVC, GF_LOG_DEBUG, "RPC service inited.");</div><div class='add'>+</div><div class='add'>+    gluster_dump_prog.options = options;</div><div class='add'>+</div><div class='add'>+    ret = rpcsvc_program_register(svc, &amp;gluster_dump_prog, _gf_false);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log(GF_RPCSVC, GF_LOG_ERROR, "failed to register DUMP program");</div><div class='add'>+        goto free_svc;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+free_svc:</div><div class='add'>+    if (ret == -1) {</div><div class='add'>+        GF_FREE(svc);</div><div class='add'>+        svc = NULL;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-static void</div><div class='del'>-free_prog_details (gf_dump_rsp *rsp)</div><div class='add'>+    return svc;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+rpcsvc_transport_peer_check_search(dict_t *options, char *pattern, char *ip,</div><div class='add'>+                                   char *hostname)</div><div class='ctx'> {</div><div class='del'>-        gf_prog_detail *prev = NULL;</div><div class='del'>-        gf_prog_detail *trav = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    char *addrtok = NULL;</div><div class='add'>+    char *addrstr = NULL;</div><div class='add'>+    char *dup_addrstr = NULL;</div><div class='add'>+    char *svptr = NULL;</div><div class='add'>+</div><div class='add'>+    if ((!options) || (!ip))</div><div class='add'>+        return -1;</div><div class='ctx'> </div><div class='del'>-        trav = rsp-&gt;prog;</div><div class='del'>-        while (trav) {</div><div class='del'>-                prev = trav;</div><div class='del'>-                trav = trav-&gt;next;</div><div class='del'>-                GF_FREE (prev);</div><div class='add'>+    ret = dict_get_str(options, pattern, &amp;addrstr);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (!addrstr) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    dup_addrstr = gf_strdup(addrstr);</div><div class='add'>+    if (dup_addrstr == NULL) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+    addrtok = strtok_r(dup_addrstr, ",", &amp;svptr);</div><div class='add'>+    while (addrtok) {</div><div class='add'>+        /* CASEFOLD not present on Solaris */</div><div class='add'>+#ifdef FNM_CASEFOLD</div><div class='add'>+        ret = fnmatch(addrtok, ip, FNM_CASEFOLD);</div><div class='add'>+#else</div><div class='add'>+        ret = fnmatch(addrtok, ip, 0);</div><div class='add'>+#endif</div><div class='add'>+        if (ret == 0)</div><div class='add'>+            goto err;</div><div class='add'>+</div><div class='add'>+        /* compare hostnames if applicable */</div><div class='add'>+        if (hostname) {</div><div class='add'>+#ifdef FNM_CASEFOLD</div><div class='add'>+            ret = fnmatch(addrtok, hostname, FNM_CASEFOLD);</div><div class='add'>+#else</div><div class='add'>+            ret = fnmatch(addrtok, hostname, 0);</div><div class='add'>+#endif</div><div class='add'>+            if (ret == 0)</div><div class='add'>+                goto err;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        /* Compare IPv4 subnetwork, TODO: IPv6 subnet support */</div><div class='add'>+        if (strchr(addrtok, '/')) {</div><div class='add'>+            ret = rpcsvc_match_subnet_v4(addrtok, ip);</div><div class='add'>+            if (ret == 0)</div><div class='add'>+                goto err;</div><div class='ctx'>         }</div><div class='add'>+</div><div class='add'>+        addrtok = strtok_r(NULL, ",", &amp;svptr);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = -1;</div><div class='add'>+err:</div><div class='add'>+    GF_FREE(dup_addrstr);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> static int</div><div class='del'>-build_prog_details (rpcsvc_request_t *req, gf_dump_rsp *rsp)</div><div class='add'>+rpcsvc_transport_peer_check_allow(dict_t *options, char *volname, char *ip,</div><div class='add'>+                                  char *hostname)</div><div class='ctx'> {</div><div class='del'>-        int               ret     = -1;</div><div class='del'>-        rpcsvc_program_t *program = NULL;</div><div class='del'>-        gf_prog_detail   *prog    = NULL;</div><div class='del'>-        gf_prog_detail   *prev    = NULL;</div><div class='add'>+    int ret = RPCSVC_AUTH_DONTCARE;</div><div class='add'>+    char *srchstr = NULL;</div><div class='ctx'> </div><div class='del'>-        if (!req || !req-&gt;trans || !req-&gt;svc)</div><div class='del'>-                goto out;</div><div class='add'>+    if ((!options) || (!ip) || (!volname))</div><div class='add'>+        return ret;</div><div class='ctx'> </div><div class='del'>-        list_for_each_entry (program, &amp;req-&gt;svc-&gt;programs, program) {</div><div class='del'>-                prog = GF_CALLOC (1, sizeof (*prog), 0);</div><div class='del'>-                if (!prog)</div><div class='del'>-                        goto out;</div><div class='del'>-                prog-&gt;progname = program-&gt;progname;</div><div class='del'>-                prog-&gt;prognum  = program-&gt;prognum;</div><div class='del'>-                prog-&gt;progver  = program-&gt;progver;</div><div class='del'>-                if (!rsp-&gt;prog)</div><div class='del'>-                        rsp-&gt;prog = prog;</div><div class='del'>-                if (prev)</div><div class='del'>-                        prev-&gt;next = prog;</div><div class='del'>-                prev = prog;</div><div class='del'>-        }</div><div class='del'>-        if (prev)</div><div class='del'>-                ret = 0;</div><div class='add'>+    ret = gf_asprintf(&amp;srchstr, "rpc-auth.addr.%s.allow", volname);</div><div class='add'>+    if (ret == -1) {</div><div class='add'>+        gf_log(GF_RPCSVC, GF_LOG_ERROR, "asprintf failed");</div><div class='add'>+        ret = RPCSVC_AUTH_DONTCARE;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = rpcsvc_transport_peer_check_search(options, srchstr, ip, hostname);</div><div class='add'>+    GF_FREE(srchstr);</div><div class='add'>+</div><div class='add'>+    if (ret == 0)</div><div class='add'>+        ret = RPCSVC_AUTH_ACCEPT;</div><div class='add'>+    else</div><div class='add'>+        ret = RPCSVC_AUTH_REJECT;</div><div class='ctx'> out:</div><div class='del'>-        return ret;</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> static int</div><div class='del'>-rpcsvc_dump (rpcsvc_request_t *req)</div><div class='add'>+rpcsvc_transport_peer_check_reject(dict_t *options, char *volname, char *ip,</div><div class='add'>+                                   char *hostname)</div><div class='ctx'> {</div><div class='del'>-        char         rsp_buf[8 * 1024] = {0,};</div><div class='del'>-        gf_dump_rsp  rsp      = {0,};</div><div class='del'>-        struct iovec iov      = {0,};</div><div class='del'>-        int          op_errno = EINVAL;</div><div class='del'>-        int          ret      = -1;</div><div class='add'>+    int ret = RPCSVC_AUTH_DONTCARE;</div><div class='add'>+    char *srchstr = NULL;</div><div class='add'>+</div><div class='add'>+    if ((!options) || (!ip) || (!volname))</div><div class='add'>+        return ret;</div><div class='ctx'> </div><div class='del'>-        if (!req)</div><div class='del'>-                goto fail;</div><div class='add'>+    ret = gf_asprintf(&amp;srchstr, "rpc-auth.addr.%s.reject", volname);</div><div class='add'>+    if (ret == -1) {</div><div class='add'>+        gf_log(GF_RPCSVC, GF_LOG_ERROR, "asprintf failed");</div><div class='add'>+        ret = RPCSVC_AUTH_REJECT;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        ret = build_prog_details (req, &amp;rsp);</div><div class='del'>-        if (ret &lt; 0) {</div><div class='del'>-                op_errno = -ret;</div><div class='del'>-                goto fail;</div><div class='del'>-        }</div><div class='add'>+    ret = rpcsvc_transport_peer_check_search(options, srchstr, ip, hostname);</div><div class='add'>+    GF_FREE(srchstr);</div><div class='ctx'> </div><div class='del'>-fail:</div><div class='del'>-        rsp.op_errno = gf_errno_to_error (op_errno);</div><div class='del'>-        rsp.op_ret   = ret;</div><div class='add'>+    if (ret == 0)</div><div class='add'>+        ret = RPCSVC_AUTH_REJECT;</div><div class='add'>+    else</div><div class='add'>+        ret = RPCSVC_AUTH_DONTCARE;</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        iov.iov_base = rsp_buf;</div><div class='del'>-        iov.iov_len  = (8 * 1024);</div><div class='add'>+/* Combines rpc auth's allow and reject options.</div><div class='add'>+ * Order of checks is important.</div><div class='add'>+ * First,              REJECT if either rejects.</div><div class='add'>+ * If neither rejects, ACCEPT if either accepts.</div><div class='add'>+ * If neither accepts, DONTCARE</div><div class='add'>+ */</div><div class='add'>+int</div><div class='add'>+rpcsvc_combine_allow_reject_volume_check(int allow, int reject)</div><div class='add'>+{</div><div class='add'>+    if (allow == RPCSVC_AUTH_REJECT || reject == RPCSVC_AUTH_REJECT)</div><div class='add'>+        return RPCSVC_AUTH_REJECT;</div><div class='ctx'> </div><div class='del'>-        ret = xdr_serialize_dump_rsp (iov, &amp;rsp);</div><div class='del'>-        if (ret &lt; 0) {</div><div class='del'>-                if (req)</div><div class='del'>-                        req-&gt;rpc_err = GARBAGE_ARGS;</div><div class='del'>-                op_errno = EINVAL;</div><div class='del'>-                goto fail;</div><div class='del'>-        }</div><div class='add'>+    if (allow == RPCSVC_AUTH_ACCEPT || reject == RPCSVC_AUTH_ACCEPT)</div><div class='add'>+        return RPCSVC_AUTH_ACCEPT;</div><div class='ctx'> </div><div class='del'>-        ret = rpcsvc_submit_generic (req, &amp;iov, 1, NULL, 0,</div><div class='del'>-                                     NULL);</div><div class='add'>+    return RPCSVC_AUTH_DONTCARE;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        free_prog_details (&amp;rsp);</div><div class='add'>+int</div><div class='add'>+rpcsvc_auth_check(rpcsvc_t *svc, char *volname, char *ipaddr)</div><div class='add'>+{</div><div class='add'>+    int ret = RPCSVC_AUTH_REJECT;</div><div class='add'>+    int accept = RPCSVC_AUTH_REJECT;</div><div class='add'>+    int reject = RPCSVC_AUTH_REJECT;</div><div class='add'>+    char *hostname = NULL;</div><div class='add'>+    char *allow_str = NULL;</div><div class='add'>+    char *reject_str = NULL;</div><div class='add'>+    char *srchstr = NULL;</div><div class='add'>+    dict_t *options = NULL;</div><div class='add'>+</div><div class='add'>+    if (!svc || !volname || !ipaddr)</div><div class='add'>+        return ret;</div><div class='ctx'> </div><div class='add'>+    /* Fetch the options from svc struct and validate */</div><div class='add'>+    options = svc-&gt;options;</div><div class='add'>+    if (!options)</div><div class='ctx'>         return ret;</div><div class='add'>+</div><div class='add'>+    /* Accept if its the default case: Allow all, Reject none</div><div class='add'>+     * The default volfile always contains a 'allow *' rule</div><div class='add'>+     * for each volume. If allow rule is missing (which implies</div><div class='add'>+     * there is some bad volfile generating code doing this), we</div><div class='add'>+     * assume no one is allowed mounts, and thus, we reject mounts.</div><div class='add'>+     */</div><div class='add'>+    ret = gf_asprintf(&amp;srchstr, "rpc-auth.addr.%s.allow", volname);</div><div class='add'>+    if (ret == -1) {</div><div class='add'>+        gf_log(GF_RPCSVC, GF_LOG_ERROR, "asprintf failed");</div><div class='add'>+        return RPCSVC_AUTH_REJECT;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_get_str(options, srchstr, &amp;allow_str);</div><div class='add'>+    GF_FREE(srchstr);</div><div class='add'>+    if (ret &lt; 0)</div><div class='add'>+        return RPCSVC_AUTH_REJECT;</div><div class='add'>+</div><div class='add'>+    ret = gf_asprintf(&amp;srchstr, "rpc-auth.addr.%s.reject", volname);</div><div class='add'>+    if (ret == -1) {</div><div class='add'>+        gf_log(GF_RPCSVC, GF_LOG_ERROR, "asprintf failed");</div><div class='add'>+        return RPCSVC_AUTH_REJECT;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_get_str(options, srchstr, &amp;reject_str);</div><div class='add'>+    GF_FREE(srchstr);</div><div class='add'>+</div><div class='add'>+    /*</div><div class='add'>+     * If "reject_str" is being set as '*' (anonymous), then NFS-server</div><div class='add'>+     * would reject everything. If the "reject_str" is not set and</div><div class='add'>+     * "allow_str" is set as '*' (anonymous), then NFS-server would</div><div class='add'>+     * accept mount requests from all clients.</div><div class='add'>+     */</div><div class='add'>+    if (reject_str != NULL) {</div><div class='add'>+        if (!strcmp("*", reject_str))</div><div class='add'>+            return RPCSVC_AUTH_REJECT;</div><div class='add'>+    } else {</div><div class='add'>+        if (!strcmp("*", allow_str))</div><div class='add'>+            return RPCSVC_AUTH_ACCEPT;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* addr-namelookup check */</div><div class='add'>+    if (svc-&gt;addr_namelookup == _gf_true) {</div><div class='add'>+        ret = gf_get_hostname_from_ip(ipaddr, &amp;hostname);</div><div class='add'>+        if (ret) {</div><div class='add'>+            if (hostname)</div><div class='add'>+                GF_FREE(hostname);</div><div class='add'>+            /* failed to get hostname, but hostname auth</div><div class='add'>+             * is enabled, so authentication will not be</div><div class='add'>+             * 100% correct. reject mounts</div><div class='add'>+             */</div><div class='add'>+            return RPCSVC_AUTH_REJECT;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    accept = rpcsvc_transport_peer_check_allow(options, volname, ipaddr,</div><div class='add'>+                                               hostname);</div><div class='add'>+</div><div class='add'>+    reject = rpcsvc_transport_peer_check_reject(options, volname, ipaddr,</div><div class='add'>+                                                hostname);</div><div class='add'>+</div><div class='add'>+    if (hostname)</div><div class='add'>+        GF_FREE(hostname);</div><div class='add'>+    return rpcsvc_combine_allow_reject_volume_check(accept, reject);</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-rpcsvc_init_options (rpcsvc_t *svc, dict_t *options)</div><div class='add'>+rpcsvc_transport_privport_check(rpcsvc_t *svc, char *volname, uint16_t port)</div><div class='ctx'> {</div><div class='del'>-        svc-&gt;memfactor = RPCSVC_DEFAULT_MEMFACTOR;</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='add'>+    int ret = RPCSVC_AUTH_REJECT;</div><div class='add'>+    char *srchstr = NULL;</div><div class='add'>+    char *valstr = NULL;</div><div class='add'>+    gf_boolean_t insecure = _gf_false;</div><div class='ctx'> </div><div class='add'>+    if ((!svc) || (!volname))</div><div class='add'>+        return ret;</div><div class='ctx'> </div><div class='del'>-/* The global RPC service initializer.</div><div class='del'>- */</div><div class='del'>-rpcsvc_t *</div><div class='del'>-rpcsvc_init (glusterfs_ctx_t *ctx, dict_t *options)</div><div class='add'>+    gf_log(GF_RPCSVC, GF_LOG_TRACE, "Client port: %d", (int)port);</div><div class='add'>+    /* If the port is already a privileged one, don't bother with checking</div><div class='add'>+     * options.</div><div class='add'>+     */</div><div class='add'>+    if (port &lt;= 1024) {</div><div class='add'>+        ret = RPCSVC_AUTH_ACCEPT;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Disabled by default */</div><div class='add'>+    ret = gf_asprintf(&amp;srchstr, "rpc-auth.ports.%s.insecure", volname);</div><div class='add'>+    if (ret == -1) {</div><div class='add'>+        gf_log(GF_RPCSVC, GF_LOG_ERROR, "asprintf failed");</div><div class='add'>+        ret = RPCSVC_AUTH_REJECT;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_get_str(svc-&gt;options, srchstr, &amp;valstr);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log(GF_RPCSVC, GF_LOG_ERROR,</div><div class='add'>+               "Failed to"</div><div class='add'>+               " read rpc-auth.ports.insecure value");</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = gf_string2boolean(valstr, &amp;insecure);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log(GF_RPCSVC, GF_LOG_ERROR,</div><div class='add'>+               "Failed to"</div><div class='add'>+               " convert rpc-auth.ports.insecure value");</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = insecure ? RPCSVC_AUTH_ACCEPT : RPCSVC_AUTH_REJECT;</div><div class='add'>+</div><div class='add'>+    if (ret == RPCSVC_AUTH_ACCEPT)</div><div class='add'>+        gf_log(GF_RPCSVC, GF_LOG_DEBUG, "Unprivileged port allowed");</div><div class='add'>+    else</div><div class='add'>+        gf_log(GF_RPCSVC, GF_LOG_DEBUG,</div><div class='add'>+               "Unprivileged port not"</div><div class='add'>+               " allowed");</div><div class='add'>+</div><div class='add'>+err:</div><div class='add'>+    if (srchstr)</div><div class='add'>+        GF_FREE(srchstr);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+char *</div><div class='add'>+rpcsvc_volume_allowed(dict_t *options, char *volname)</div><div class='ctx'> {</div><div class='del'>-        rpcsvc_t          *svc              = NULL;</div><div class='del'>-        int                ret              = -1, poolcount = 0;</div><div class='add'>+    char globalrule[] = "rpc-auth.addr.allow";</div><div class='add'>+    char *srchstr = NULL;</div><div class='add'>+    char *addrstr = NULL;</div><div class='add'>+    int ret = -1;</div><div class='ctx'> </div><div class='del'>-        if ((!ctx) || (!options))</div><div class='del'>-                return NULL;</div><div class='add'>+    if ((!options) || (!volname))</div><div class='add'>+        return NULL;</div><div class='ctx'> </div><div class='del'>-        svc = GF_CALLOC (1, sizeof (*svc), gf_common_mt_rpcsvc_t);</div><div class='del'>-        if (!svc)</div><div class='del'>-                return NULL;</div><div class='add'>+    ret = gf_asprintf(&amp;srchstr, "rpc-auth.addr.%s.allow", volname);</div><div class='add'>+    if (ret == -1) {</div><div class='add'>+        gf_log(GF_RPCSVC, GF_LOG_ERROR, "asprintf failed");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        pthread_mutex_init (&amp;svc-&gt;rpclock, NULL);</div><div class='del'>-        INIT_LIST_HEAD (&amp;svc-&gt;authschemes);</div><div class='del'>-        INIT_LIST_HEAD (&amp;svc-&gt;notify);</div><div class='del'>-        INIT_LIST_HEAD (&amp;svc-&gt;listeners);</div><div class='del'>-        INIT_LIST_HEAD (&amp;svc-&gt;programs);</div><div class='add'>+    if (!dict_get(options, srchstr))</div><div class='add'>+        ret = dict_get_str(options, globalrule, &amp;addrstr);</div><div class='add'>+    else</div><div class='add'>+        ret = dict_get_str(options, srchstr, &amp;addrstr);</div><div class='ctx'> </div><div class='del'>-        ret = rpcsvc_init_options (svc, options);</div><div class='del'>-        if (ret == -1) {</div><div class='del'>-                gf_log (GF_RPCSVC, GF_LOG_ERROR, "Failed to init options");</div><div class='del'>-                goto free_svc;</div><div class='del'>-        }</div><div class='add'>+out:</div><div class='add'>+    GF_FREE(srchstr);</div><div class='ctx'> </div><div class='del'>-        poolcount   = RPCSVC_POOLCOUNT_MULT * svc-&gt;memfactor;</div><div class='add'>+    return addrstr;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        gf_log (GF_RPCSVC, GF_LOG_TRACE, "rx pool: %d", poolcount);</div><div class='del'>-        svc-&gt;rxpool = mem_pool_new (rpcsvc_request_t, poolcount);</div><div class='del'>-        /* TODO: leak */</div><div class='del'>-        if (!svc-&gt;rxpool) {</div><div class='del'>-                gf_log (GF_RPCSVC, GF_LOG_ERROR, "mem pool allocation failed");</div><div class='del'>-                goto free_svc;</div><div class='del'>-        }</div><div class='add'>+/*</div><div class='add'>+ * rpcsvc_match_subnet_v4() takes subnetwork address pattern and checks</div><div class='add'>+ * if the target IPv4 address has the same network address with the help</div><div class='add'>+ * of network mask.</div><div class='add'>+ *</div><div class='add'>+ * Returns 0 for SUCCESS and -1 otherwise.</div><div class='add'>+ *</div><div class='add'>+ * NB: Validation of subnetwork address pattern is not required</div><div class='add'>+ *     as it's already being done at the time of CLI SET.</div><div class='add'>+ */</div><div class='add'>+static int</div><div class='add'>+rpcsvc_match_subnet_v4(const char *addrtok, const char *ipaddr)</div><div class='add'>+{</div><div class='add'>+    char *slash = NULL;</div><div class='add'>+    char *netaddr = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    uint32_t prefixlen = 0;</div><div class='add'>+    uint32_t shift = 0;</div><div class='add'>+    struct sockaddr_in sin1 = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    struct sockaddr_in sin2 = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    struct sockaddr_in mask = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    /* Copy the input */</div><div class='add'>+    netaddr = gf_strdup(addrtok);</div><div class='add'>+    if (netaddr == NULL) /* ENOMEM */</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    /* Find the network socket addr of target */</div><div class='add'>+    if (inet_pton(AF_INET, ipaddr, &amp;sin1.sin_addr) == 0)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    slash = strchr(netaddr, '/');</div><div class='add'>+    if (slash) {</div><div class='add'>+        *slash = '\0';</div><div class='add'>+        /*</div><div class='add'>+         * Find the IPv4 network mask in network byte order.</div><div class='add'>+         * IMP: String slash+1 is already validated, it can't have value</div><div class='add'>+         * more than IPv4_ADDR_SIZE (32).</div><div class='add'>+         */</div><div class='add'>+        prefixlen = (uint32_t)atoi(slash + 1);</div><div class='add'>+        if (prefixlen &gt; 31)</div><div class='add'>+            goto out;</div><div class='add'>+    } else {</div><div class='add'>+        /* if there is no '/', then this function wouldn't be called */</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Need to do this after removing '/', as inet_pton() take IP address as</div><div class='add'>+     * second argument. Once we get sin2, then comparison is oranges to orange</div><div class='add'>+     */</div><div class='add'>+    if (inet_pton(AF_INET, netaddr, &amp;sin2.sin_addr) == 0)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    shift = IPv4_ADDR_SIZE - prefixlen;</div><div class='add'>+    mask.sin_addr.s_addr = htonl((uint32_t)~0 &lt;&lt; shift);</div><div class='add'>+</div><div class='add'>+    if (mask_match(sin1.sin_addr.s_addr, sin2.sin_addr.s_addr,</div><div class='add'>+                   mask.sin_addr.s_addr)) {</div><div class='add'>+        ret = 0; /* SUCCESS */</div><div class='add'>+    }</div><div class='add'>+out:</div><div class='add'>+    GF_FREE(netaddr);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        ret = rpcsvc_auth_init (svc, options);</div><div class='del'>-        if (ret == -1) {</div><div class='del'>-                gf_log (GF_RPCSVC, GF_LOG_ERROR, "Failed to init "</div><div class='del'>-                        "authentication");</div><div class='del'>-                goto free_svc;</div><div class='del'>-        }</div><div class='add'>+void</div><div class='add'>+rpcsvc_program_dump(rpcsvc_program_t *prog)</div><div class='add'>+{</div><div class='add'>+    char key_prefix[GF_DUMP_MAX_BUF_LEN];</div><div class='add'>+    char key[GF_DUMP_MAX_BUF_LEN];</div><div class='add'>+    int i;</div><div class='ctx'> </div><div class='del'>-        ret = -1;</div><div class='del'>-        svc-&gt;options = options;</div><div class='del'>-        svc-&gt;ctx = ctx;</div><div class='del'>-        gf_log (GF_RPCSVC, GF_LOG_DEBUG, "RPC service inited.");</div><div class='add'>+    snprintf(key_prefix, GF_DUMP_MAX_BUF_LEN, "%s", prog-&gt;progname);</div><div class='add'>+    gf_proc_dump_add_section("%s", key_prefix);</div><div class='ctx'> </div><div class='del'>-        gluster_dump_prog.options = options;</div><div class='add'>+    gf_proc_dump_build_key(key, key_prefix, "program-number");</div><div class='add'>+    gf_proc_dump_write(key, "%d", prog-&gt;prognum);</div><div class='ctx'> </div><div class='del'>-        ret = rpcsvc_program_register (svc, &amp;gluster_dump_prog);</div><div class='del'>-        if (ret) {</div><div class='del'>-                gf_log (GF_RPCSVC, GF_LOG_ERROR,</div><div class='del'>-                        "failed to register DUMP program");</div><div class='del'>-                goto free_svc;</div><div class='del'>-        }</div><div class='del'>-        ret = 0;</div><div class='del'>-free_svc:</div><div class='del'>-        if (ret == -1) {</div><div class='del'>-                GF_FREE (svc);</div><div class='del'>-                svc = NULL;</div><div class='del'>-        }</div><div class='add'>+    gf_proc_dump_build_key(key, key_prefix, "program-version");</div><div class='add'>+    gf_proc_dump_write(key, "%d", prog-&gt;progver);</div><div class='add'>+</div><div class='add'>+    strncat(key_prefix, ".latency",</div><div class='add'>+            sizeof(key_prefix) - strlen(key_prefix) - 1);</div><div class='ctx'> </div><div class='del'>-        return svc;</div><div class='add'>+    for (i = 0; i &lt; prog-&gt;numactors; i++) {</div><div class='add'>+        gf_proc_dump_build_key(key, key_prefix, "%s", prog-&gt;actors[i].procname);</div><div class='add'>+        gf_latency_statedump_and_reset(key, &amp;prog-&gt;latencies[i]);</div><div class='add'>+    }</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+void</div><div class='add'>+rpcsvc_statedump(rpcsvc_t *svc)</div><div class='add'>+{</div><div class='add'>+    rpcsvc_program_t *prog = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    ret = pthread_rwlock_tryrdlock(&amp;svc-&gt;rpclock);</div><div class='add'>+    if (ret)</div><div class='add'>+        return;</div><div class='add'>+    {</div><div class='add'>+        list_for_each_entry(prog, &amp;svc-&gt;programs, program)</div><div class='add'>+        {</div><div class='add'>+            rpcsvc_program_dump(prog);</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    pthread_rwlock_unlock(&amp;svc-&gt;rpclock);</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-rpcsvc_actor_t gluster_dump_actors[] = {</div><div class='del'>-        [GF_DUMP_NULL] = {"NULL", GF_DUMP_NULL, NULL, NULL, NULL },</div><div class='del'>-        [GF_DUMP_DUMP] = {"DUMP", GF_DUMP_DUMP, rpcsvc_dump, NULL, NULL },</div><div class='del'>-        [GF_DUMP_MAXVALUE] = {"MAXVALUE", GF_DUMP_MAXVALUE, NULL, NULL, NULL },</div><div class='add'>+static rpcsvc_actor_t gluster_dump_actors[GF_DUMP_MAXVALUE] = {</div><div class='add'>+    [GF_DUMP_NULL] = {"NULL", NULL, NULL, GF_DUMP_NULL, DRC_NA, 0},</div><div class='add'>+    [GF_DUMP_DUMP] = {"DUMP", rpcsvc_dump, NULL, GF_DUMP_DUMP, DRC_NA, 0},</div><div class='add'>+    [GF_DUMP_PING] = {"PING", rpcsvc_ping, NULL, GF_DUMP_PING, DRC_NA, 0},</div><div class='ctx'> };</div><div class='ctx'> </div><div class='del'>-</div><div class='del'>-struct rpcsvc_program gluster_dump_prog = {</div><div class='del'>-        .progname  = "GF-DUMP",</div><div class='del'>-        .prognum   = GLUSTER_DUMP_PROGRAM,</div><div class='del'>-        .progver   = GLUSTER_DUMP_VERSION,</div><div class='del'>-        .actors    = gluster_dump_actors,</div><div class='del'>-        .numactors = 2,</div><div class='add'>+static struct rpcsvc_program gluster_dump_prog = {</div><div class='add'>+    .progname = "GF-DUMP",</div><div class='add'>+    .prognum = GLUSTER_DUMP_PROGRAM,</div><div class='add'>+    .progver = GLUSTER_DUMP_VERSION,</div><div class='add'>+    .actors = gluster_dump_actors,</div><div class='add'>+    .numactors = GF_DUMP_MAXVALUE,</div><div class='ctx'> };</div><div class='head'>diff --git a/rpc/rpc-lib/src/rpcsvc.h b/rpc/rpc-lib/src/rpcsvc.h<br/>index fca7d047a7b..7b3030926c8 100644<br/>--- a/<a href='/cgit/glusterfs.git/tree/rpc/rpc-lib/src/rpcsvc.h?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>rpc/rpc-lib/src/rpcsvc.h</a><br/>+++ b/<a href='/cgit/glusterfs.git/tree/rpc/rpc-lib/src/rpcsvc.h?id=d1d7a6f35c816822fab51c820e25023863c239c1'>rpc/rpc-lib/src/rpcsvc.h</a></div><div class='hunk'>@@ -1,65 +1,67 @@</div><div class='ctx'> /*</div><div class='del'>-  Copyright (c) 2010 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='add'>+  Copyright (c) 2008-2012 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='ctx'>   This file is part of GlusterFS.</div><div class='ctx'> </div><div class='del'>-  GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-  it under the terms of the GNU Affero General Public License as published</div><div class='del'>-  by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-  or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-  GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-  WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-  Affero General Public License for more details.</div><div class='del'>-</div><div class='del'>-  You should have received a copy of the GNU Affero General Public License</div><div class='del'>-  along with this program.  If not, see</div><div class='del'>-  &lt;http://www.gnu.org/licenses/&gt;.</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='ctx'> */</div><div class='ctx'> </div><div class='ctx'> #ifndef _RPCSVC_H</div><div class='ctx'> #define _RPCSVC_H</div><div class='ctx'> </div><div class='del'>-#ifndef _CONFIG_H</div><div class='del'>-#define _CONFIG_H</div><div class='del'>-#include "config.h"</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-#include "event.h"</div><div class='add'>+#include &lt;glusterfs/gf-event.h&gt;</div><div class='ctx'> #include "rpc-transport.h"</div><div class='del'>-#include "logging.h"</div><div class='del'>-#include "dict.h"</div><div class='del'>-#include "mem-pool.h"</div><div class='del'>-#include "list.h"</div><div class='del'>-#include "iobuf.h"</div><div class='add'>+#include &lt;glusterfs/dict.h&gt;</div><div class='ctx'> #include "xdr-rpc.h"</div><div class='del'>-#include "glusterfs.h"</div><div class='ctx'> #include "rpcsvc-common.h"</div><div class='ctx'> </div><div class='ctx'> #include &lt;pthread.h&gt;</div><div class='ctx'> #include &lt;sys/uio.h&gt;</div><div class='ctx'> #include &lt;inttypes.h&gt;</div><div class='ctx'> #include &lt;rpc/rpc_msg.h&gt;</div><div class='del'>-#include "compat.h"</div><div class='add'>+#include &lt;glusterfs/compat.h&gt;</div><div class='add'>+#include &lt;glusterfs/client_t.h&gt;</div><div class='ctx'> </div><div class='del'>-#ifndef NGRPS</div><div class='del'>-#define NGRPS 16</div><div class='del'>-#endif /* !NGRPS */</div><div class='add'>+#ifndef MAX_IOVEC</div><div class='add'>+#define MAX_IOVEC 16</div><div class='add'>+#endif</div><div class='ctx'> </div><div class='del'>-#define GF_RPCSVC       "rpc-service"</div><div class='add'>+/* TODO: we should store prognums at a centralized location to avoid conflict</div><div class='add'>+         or use a robust random number generator to avoid conflicts</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#define RPCSVC_INFRA_PROGRAM 7712846 /* random number */</div><div class='add'>+</div><div class='add'>+typedef enum {</div><div class='add'>+    RPCSVC_PROC_EVENT_THREAD_DEATH = 0,</div><div class='add'>+} rpcsvc_infra_procnum_t;</div><div class='add'>+</div><div class='add'>+#define RPCSVC_DEFAULT_OUTSTANDING_RPC_LIMIT                                   \</div><div class='add'>+    64 /* Default for protocol/server */</div><div class='add'>+#define RPCSVC_DEF_NFS_OUTSTANDING_RPC_LIMIT 16 /* Default for nfs/server */</div><div class='add'>+#define RPCSVC_MAX_OUTSTANDING_RPC_LIMIT 65536</div><div class='add'>+#define RPCSVC_MIN_OUTSTANDING_RPC_LIMIT 0 /* No limit i.e. Unlimited */</div><div class='add'>+</div><div class='add'>+#define GF_RPCSVC "rpc-service"</div><div class='ctx'> #define RPCSVC_THREAD_STACK_SIZE ((size_t)(1024 * GF_UNIT_KB))</div><div class='ctx'> </div><div class='del'>-#define RPCSVC_FRAGHDR_SIZE  4       /* 4-byte RPC fragment header size */</div><div class='del'>-#define RPCSVC_DEFAULT_LISTEN_PORT      6996</div><div class='del'>-#define RPCSVC_DEFAULT_MEMFACTOR        15</div><div class='del'>-#define RPCSVC_EVENTPOOL_SIZE_MULT      1024</div><div class='del'>-#define RPCSVC_POOLCOUNT_MULT           35</div><div class='del'>-#define RPCSVC_CONN_READ        (128 * GF_UNIT_KB)</div><div class='del'>-#define RPCSVC_PAGE_SIZE        (128 * GF_UNIT_KB)</div><div class='add'>+#define RPCSVC_FRAGHDR_SIZE 4 /* 4-byte RPC fragment header size */</div><div class='add'>+#define RPCSVC_DEFAULT_LISTEN_PORT GF_DEFAULT_BASE_PORT</div><div class='add'>+#define RPCSVC_DEFAULT_MEMFACTOR 8</div><div class='add'>+#define RPCSVC_EVENTPOOL_SIZE_MULT 1024</div><div class='add'>+#define RPCSVC_POOLCOUNT_MULT 64</div><div class='add'>+#define RPCSVC_CONN_READ (128 * GF_UNIT_KB)</div><div class='add'>+#define RPCSVC_PAGE_SIZE (128 * GF_UNIT_KB)</div><div class='add'>+#define RPC_ROOT_UID 0</div><div class='add'>+#define RPC_ROOT_GID 0</div><div class='add'>+#define RPC_NOBODY_UID 65534</div><div class='add'>+#define RPC_NOBODY_GID 65534</div><div class='ctx'> </div><div class='ctx'> /* RPC Record States */</div><div class='del'>-#define RPCSVC_READ_FRAGHDR     1</div><div class='del'>-#define RPCSVC_READ_FRAG        2</div><div class='add'>+#define RPCSVC_READ_FRAGHDR 1</div><div class='add'>+#define RPCSVC_READ_FRAG 2</div><div class='ctx'> /* The size in bytes, if crossed by a fragment will be handed over to the</div><div class='ctx'>  * vectored actor so that it can allocate its buffers the way it wants.</div><div class='ctx'>  * In our RPC layer, we assume that vectored RPC requests/records are never</div><div class='hunk'>@@ -67,21 +69,28 @@</div><div class='ctx'>  * whether the record should be handled in RPC layer completely or handed to</div><div class='ctx'>  * the vectored handler.</div><div class='ctx'>  */</div><div class='del'>-#define RPCSVC_VECTORED_FRAGSZ  4096</div><div class='del'>-#define RPCSVC_VECTOR_READCRED          1003</div><div class='del'>-#define RPCSVC_VECTOR_READVERFSZ        1004</div><div class='del'>-#define RPCSVC_VECTOR_READVERF          1005</div><div class='del'>-#define RPCSVC_VECTOR_IGNORE            1006</div><div class='del'>-#define RPCSVC_VECTOR_READVEC           1007</div><div class='del'>-#define RPCSVC_VECTOR_READPROCHDR       1008</div><div class='del'>-</div><div class='del'>-#define rpcsvc_record_vectored_baremsg(rs) (((rs)-&gt;state == RPCSVC_READ_FRAG) &amp;&amp; (rs)-&gt;vecstate == 0)</div><div class='del'>-#define rpcsvc_record_vectored_cred(rs) ((rs)-&gt;vecstate == RPCSVC_VECTOR_READCRED)</div><div class='del'>-#define rpcsvc_record_vectored_verfsz(rs) ((rs)-&gt;vecstate == RPCSVC_VECTOR_READVERFSZ)</div><div class='del'>-#define rpcsvc_record_vectored_verfread(rs) ((rs)-&gt;vecstate == RPCSVC_VECTOR_READVERF)</div><div class='del'>-#define rpcsvc_record_vectored_ignore(rs) ((rs)-&gt;vecstate == RPCSVC_VECTOR_IGNORE)</div><div class='del'>-#define rpcsvc_record_vectored_readvec(rs) ((rs)-&gt;vecstate == RPCSVC_VECTOR_READVEC)</div><div class='del'>-#define rpcsvc_record_vectored_readprochdr(rs) ((rs)-&gt;vecstate == RPCSVC_VECTOR_READPROCHDR)</div><div class='add'>+#define RPCSVC_VECTORED_FRAGSZ 4096</div><div class='add'>+#define RPCSVC_VECTOR_READCRED 1003</div><div class='add'>+#define RPCSVC_VECTOR_READVERFSZ 1004</div><div class='add'>+#define RPCSVC_VECTOR_READVERF 1005</div><div class='add'>+#define RPCSVC_VECTOR_IGNORE 1006</div><div class='add'>+#define RPCSVC_VECTOR_READVEC 1007</div><div class='add'>+#define RPCSVC_VECTOR_READPROCHDR 1008</div><div class='add'>+</div><div class='add'>+#define rpcsvc_record_vectored_baremsg(rs)                                     \</div><div class='add'>+    (((rs)-&gt;state == RPCSVC_READ_FRAG) &amp;&amp; (rs)-&gt;vecstate == 0)</div><div class='add'>+#define rpcsvc_record_vectored_cred(rs)                                        \</div><div class='add'>+    ((rs)-&gt;vecstate == RPCSVC_VECTOR_READCRED)</div><div class='add'>+#define rpcsvc_record_vectored_verfsz(rs)                                      \</div><div class='add'>+    ((rs)-&gt;vecstate == RPCSVC_VECTOR_READVERFSZ)</div><div class='add'>+#define rpcsvc_record_vectored_verfread(rs)                                    \</div><div class='add'>+    ((rs)-&gt;vecstate == RPCSVC_VECTOR_READVERF)</div><div class='add'>+#define rpcsvc_record_vectored_ignore(rs)                                      \</div><div class='add'>+    ((rs)-&gt;vecstate == RPCSVC_VECTOR_IGNORE)</div><div class='add'>+#define rpcsvc_record_vectored_readvec(rs)                                     \</div><div class='add'>+    ((rs)-&gt;vecstate == RPCSVC_VECTOR_READVEC)</div><div class='add'>+#define rpcsvc_record_vectored_readprochdr(rs)                                 \</div><div class='add'>+    ((rs)-&gt;vecstate == RPCSVC_VECTOR_READPROCHDR)</div><div class='ctx'> #define rpcsvc_record_vectored(rs) ((rs)-&gt;fragsize &gt; RPCSVC_VECTORED_FRAGSZ)</div><div class='ctx'> /* Includes bytes up to and including the credential length field. The credlen</div><div class='ctx'>  * will be followed by @credlen bytes of credential data which will have to be</div><div class='hunk'>@@ -89,182 +98,232 @@</div><div class='ctx'>  * verifier which will also have to be read separately including the 8 bytes of</div><div class='ctx'>  * verf flavour and verflen.</div><div class='ctx'>  */</div><div class='del'>-#define RPCSVC_BARERPC_MSGSZ    32</div><div class='del'>-#define rpcsvc_record_readfraghdr(rs)   ((rs)-&gt;state == RPCSVC_READ_FRAGHDR)</div><div class='del'>-#define rpcsvc_record_readfrag(rs)      ((rs)-&gt;state == RPCSVC_READ_FRAG)</div><div class='add'>+#define RPCSVC_BARERPC_MSGSZ 32</div><div class='add'>+#define rpcsvc_record_readfraghdr(rs) ((rs)-&gt;state == RPCSVC_READ_FRAGHDR)</div><div class='add'>+#define rpcsvc_record_readfrag(rs) ((rs)-&gt;state == RPCSVC_READ_FRAG)</div><div class='ctx'> </div><div class='del'>-#define RPCSVC_LOWVERS  2</div><div class='add'>+#define RPCSVC_LOWVERS 2</div><div class='ctx'> #define RPCSVC_HIGHVERS 2</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> #if 0</div><div class='ctx'> #error "defined in /usr/include/rpc/auth.h"</div><div class='ctx'> </div><div class='del'>-#define AUTH_NONE	0		/* no authentication */</div><div class='del'>-#define	AUTH_NULL	0		/* backward compatibility */</div><div class='del'>-#define	AUTH_SYS	1		/* unix style (uid, gids) */</div><div class='del'>-#define	AUTH_UNIX	AUTH_SYS</div><div class='del'>-#define	AUTH_SHORT	2		/* short hand unix style */</div><div class='del'>-#define AUTH_DES	3		/* des style (encrypted timestamps) */</div><div class='del'>-#define AUTH_DH		AUTH_DES	/* Diffie-Hellman (this is DES) */</div><div class='del'>-#define AUTH_KERB       4               /* kerberos style */</div><div class='del'>-#endif /* */</div><div class='del'>-</div><div class='del'>-#define AUTH_GLUSTERFS  5</div><div class='add'>+#define AUTH_NONE 0 /* no authentication */</div><div class='add'>+#define AUTH_NULL 0 /* backward compatibility */</div><div class='add'>+#define AUTH_SYS 1  /* unix style (uid, gids) */</div><div class='add'>+#define AUTH_UNIX AUTH_SYS</div><div class='add'>+#define AUTH_SHORT 2     /* short hand unix style */</div><div class='add'>+#define AUTH_DES 3       /* des style (encrypted timestamps) */</div><div class='add'>+#define AUTH_DH AUTH_DES /* Diffie-Hellman (this is DES) */</div><div class='add'>+#define AUTH_KERB 4      /* kerberos style */</div><div class='add'>+#endif                   /* */</div><div class='ctx'> </div><div class='ctx'> typedef struct rpcsvc_program rpcsvc_program_t;</div><div class='ctx'> </div><div class='ctx'> struct rpcsvc_notify_wrapper {</div><div class='del'>-        struct list_head  list;</div><div class='del'>-        void             *data;</div><div class='del'>-        rpcsvc_notify_t   notify;</div><div class='add'>+    struct list_head list;</div><div class='add'>+    void *data;</div><div class='add'>+    rpcsvc_notify_t notify;</div><div class='ctx'> };</div><div class='ctx'> typedef struct rpcsvc_notify_wrapper rpcsvc_notify_wrapper_t;</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> typedef struct rpcsvc_request rpcsvc_request_t;</div><div class='ctx'> </div><div class='ctx'> typedef struct {</div><div class='del'>-        rpc_transport_t         *trans;</div><div class='del'>-        rpcsvc_t                *svc;</div><div class='del'>-        /* FIXME: remove address from this structure. Instead use get_myaddr</div><div class='del'>-         * interface implemented by individual transports.</div><div class='del'>-         */</div><div class='del'>-        struct sockaddr_storage  sa;</div><div class='del'>-        struct list_head         list;</div><div class='add'>+    rpc_transport_t *trans;</div><div class='add'>+    rpcsvc_t *svc;</div><div class='add'>+    /* FIXME: remove address from this structure. Instead use get_myaddr</div><div class='add'>+     * interface implemented by individual transports.</div><div class='add'>+     */</div><div class='add'>+    struct sockaddr_storage sa;</div><div class='add'>+    struct list_head list;</div><div class='ctx'> } rpcsvc_listener_t;</div><div class='ctx'> </div><div class='ctx'> struct rpcsvc_config {</div><div class='del'>-        int    max_block_size;</div><div class='add'>+    int max_block_size;</div><div class='ctx'> };</div><div class='ctx'> </div><div class='del'>-#define RPCSVC_MAX_AUTH_BYTES   400</div><div class='del'>-typedef struct rpcsvc_auth_data {</div><div class='del'>-        int             flavour;</div><div class='del'>-        int             datalen;</div><div class='del'>-        char            authdata[RPCSVC_MAX_AUTH_BYTES];</div><div class='del'>-} rpcsvc_auth_data_t;</div><div class='add'>+#define rpcsvc_auth_flavour(au) ((au).flavour)</div><div class='ctx'> </div><div class='del'>-#define rpcsvc_auth_flavour(au)    ((au).flavour)</div><div class='add'>+typedef struct drc_client drc_client_t;</div><div class='add'>+typedef struct drc_cached_op drc_cached_op_t;</div><div class='ctx'> </div><div class='ctx'> /* The container for the RPC call handed up to an actor.</div><div class='ctx'>  * Dynamically allocated. Lives till the call reply is completely</div><div class='ctx'>  * transmitted.</div><div class='ctx'>  * */</div><div class='ctx'> struct rpcsvc_request {</div><div class='del'>-        /* connection over which this request came. */</div><div class='del'>-        rpc_transport_t       *trans;</div><div class='del'>-</div><div class='del'>-        rpcsvc_t              *svc;</div><div class='del'>-</div><div class='del'>-        rpcsvc_program_t      *prog;</div><div class='del'>-</div><div class='del'>-        /* The identifier for the call from client.</div><div class='del'>-         * Needed to pair the reply with the call.</div><div class='del'>-         */</div><div class='del'>-        uint32_t                xid;</div><div class='del'>-</div><div class='del'>-        int                     prognum;</div><div class='del'>-</div><div class='del'>-        int                     progver;</div><div class='del'>-</div><div class='del'>-        int                     procnum;</div><div class='del'>-</div><div class='del'>-        int                     type;</div><div class='del'>-</div><div class='del'>-        /* Uid and gid filled by the rpc-auth module during the authentication</div><div class='del'>-         * phase.</div><div class='del'>-         */</div><div class='del'>-        uid_t                   uid;</div><div class='del'>-        gid_t                   gid;</div><div class='del'>-        pid_t                   pid;</div><div class='add'>+    /* connection over which this request came. */</div><div class='add'>+    rpc_transport_t *trans;</div><div class='ctx'> </div><div class='del'>-        uint64_t                lk_owner;</div><div class='del'>-        uint64_t                gfs_id;</div><div class='add'>+    rpcsvc_t *svc;</div><div class='add'>+</div><div class='add'>+    rpcsvc_program_t *prog;</div><div class='ctx'> </div><div class='del'>-        /* Might want to move this to AUTH_UNIX specifix state since this array</div><div class='del'>-         * is not available for every authenticatino scheme.</div><div class='del'>-         */</div><div class='del'>-        gid_t                   auxgids[NGRPS];</div><div class='del'>-        int                     auxgidcount;</div><div class='add'>+    int prognum;</div><div class='add'>+</div><div class='add'>+    int progver;</div><div class='ctx'> </div><div class='del'>-</div><div class='del'>-        /* The RPC message payload, contains the data required</div><div class='del'>-         * by the program actors. This is the buffer that will need to</div><div class='del'>-         * be de-xdred by the actor.</div><div class='del'>-         */</div><div class='del'>-        struct iovec            msg[2];</div><div class='del'>-        int                     count;</div><div class='del'>-</div><div class='del'>-        struct iobref          *iobref;</div><div class='del'>-</div><div class='del'>-        /* Status of the RPC call, whether it was accepted or denied. */</div><div class='del'>-        int                     rpc_status;</div><div class='del'>-</div><div class='del'>-        /* In case, the call was denied, the RPC error is stored here</div><div class='del'>-         * till the reply is sent.</div><div class='del'>-         */</div><div class='del'>-        int                     rpc_err;</div><div class='del'>-</div><div class='del'>-        /* In case the failure happened because of an authentication problem</div><div class='del'>-         * , this value needs to be assigned the correct auth error number.</div><div class='del'>-         */</div><div class='del'>-        int                     auth_err;</div><div class='del'>-</div><div class='del'>-        /* There can be cases of RPC requests where the reply needs to</div><div class='del'>-         * be built from multiple sources. For eg. where even the NFS reply can</div><div class='del'>-         * contain a payload, as in the NFSv3 read reply. Here the RPC header</div><div class='del'>-         * ,NFS header and the read data are brought together separately from</div><div class='del'>-         * different buffers, so we need to stage the buffers temporarily here</div><div class='del'>-         * before all of them get added to the connection's transmission list.</div><div class='del'>-         */</div><div class='del'>-        struct list_head        txlist;</div><div class='del'>-</div><div class='del'>-        /* While the reply record is being built, this variable keeps track</div><div class='del'>-         * of how many bytes have been added to the record.</div><div class='del'>-         */</div><div class='del'>-        size_t                  payloadsize;</div><div class='del'>-</div><div class='del'>-        /* The credentials extracted from the rpc request */</div><div class='del'>-        rpcsvc_auth_data_t      cred;</div><div class='del'>-</div><div class='del'>-        /* The verified extracted from the rpc request. In request side</div><div class='del'>-         * processing this contains the verifier sent by the client, on reply</div><div class='del'>-         * side processing, it is filled with the verified that will be</div><div class='del'>-         * sent to the client.</div><div class='del'>-         */</div><div class='del'>-        rpcsvc_auth_data_t      verf;</div><div class='del'>-</div><div class='del'>-        /* Container for a RPC program wanting to store a temp</div><div class='del'>-         * request-specific item.</div><div class='del'>-         */</div><div class='del'>-        void                    *private;</div><div class='del'>-</div><div class='del'>-        /* Container for transport to store request-specific item */</div><div class='del'>-        void                    *trans_private;</div><div class='add'>+    int procnum;</div><div class='add'>+</div><div class='add'>+    int type;</div><div class='add'>+</div><div class='add'>+    /* Uid and gid filled by the rpc-auth module during the authentication</div><div class='add'>+     * phase.</div><div class='add'>+     */</div><div class='add'>+    uid_t uid;</div><div class='add'>+    gid_t gid;</div><div class='add'>+    pid_t pid;</div><div class='add'>+</div><div class='add'>+    gf_lkowner_t lk_owner;</div><div class='add'>+    uint64_t gfs_id;</div><div class='add'>+</div><div class='add'>+    /* Might want to move this to AUTH_UNIX specific state since this array</div><div class='add'>+     * is not available for every authentication scheme.</div><div class='add'>+     */</div><div class='add'>+    gid_t *auxgids;</div><div class='add'>+    gid_t auxgidsmall[SMALL_GROUP_COUNT];</div><div class='add'>+    gid_t *auxgidlarge;</div><div class='add'>+    int auxgidcount;</div><div class='add'>+</div><div class='add'>+    /* The RPC message payload, contains the data required</div><div class='add'>+     * by the program actors. This is the buffer that will need to</div><div class='add'>+     * be de-xdred by the actor.</div><div class='add'>+     */</div><div class='add'>+    int count;</div><div class='add'>+    struct iovec msg[MAX_IOVEC];</div><div class='add'>+</div><div class='add'>+    struct iobref *iobref;</div><div class='add'>+</div><div class='add'>+    /* There can be cases of RPC requests where the reply needs to</div><div class='add'>+     * be built from multiple sources. E.g. where even the NFS reply</div><div class='add'>+     * can contain a payload, as in the NFSv3 read reply. Here the RPC header</div><div class='add'>+     * ,NFS header and the read data are brought together separately from</div><div class='add'>+     * different buffers, so we need to stage the buffers temporarily here</div><div class='add'>+     * before all of them get added to the connection's transmission list.</div><div class='add'>+     */</div><div class='add'>+    struct list_head txlist;</div><div class='add'>+</div><div class='add'>+    /* While the reply record is being built, this variable keeps track</div><div class='add'>+     * of how many bytes have been added to the record.</div><div class='add'>+     */</div><div class='add'>+    size_t payloadsize;</div><div class='add'>+</div><div class='add'>+    /* The credentials extracted from the rpc request */</div><div class='add'>+    client_auth_data_t cred;</div><div class='add'>+</div><div class='add'>+    /* The verified extracted from the rpc request. In request side</div><div class='add'>+     * processing this contains the verifier sent by the client, on reply</div><div class='add'>+     * side processing, it is filled with the verified that will be</div><div class='add'>+     * sent to the client.</div><div class='add'>+     */</div><div class='add'>+    client_auth_data_t verf;</div><div class='add'>+    /* Container for a RPC program wanting to store a temp</div><div class='add'>+     * request-specific item.</div><div class='add'>+     */</div><div class='add'>+    void *private;</div><div class='add'>+</div><div class='add'>+    /* Container for transport to store request-specific item */</div><div class='add'>+    void *trans_private;</div><div class='add'>+</div><div class='add'>+    /* pointer to cached reply for use in DRC */</div><div class='add'>+    drc_cached_op_t *reply;</div><div class='add'>+</div><div class='add'>+    /* request queue in rpcsvc */</div><div class='add'>+    struct list_head request_list;</div><div class='add'>+</div><div class='add'>+    /* Status of the RPC call, whether it was accepted or denied. */</div><div class='add'>+    int rpc_status;</div><div class='add'>+</div><div class='add'>+    /* In case, the call was denied, the RPC error is stored here</div><div class='add'>+     * till the reply is sent.</div><div class='add'>+     */</div><div class='add'>+    int rpc_err;</div><div class='add'>+</div><div class='add'>+    /* In case the failure happened because of an authentication problem</div><div class='add'>+     * , this value needs to be assigned the correct auth error number.</div><div class='add'>+     */</div><div class='add'>+    int auth_err;</div><div class='add'>+</div><div class='add'>+    /* Things passed to rpc layer from client */</div><div class='add'>+</div><div class='add'>+    /* @flags: Can be used for binary data passed in xdata to be</div><div class='add'>+       passed here instead */</div><div class='add'>+    unsigned int flags;</div><div class='add'>+</div><div class='add'>+    /* ctime: origin of time on the client side, ideally this is</div><div class='add'>+       the one we should consider for time */</div><div class='add'>+    struct timespec ctime;</div><div class='add'>+</div><div class='add'>+    /* The identifier for the call from client.</div><div class='add'>+     * Needed to pair the reply with the call.</div><div class='add'>+     */</div><div class='add'>+    uint32_t xid;</div><div class='add'>+</div><div class='add'>+    /* Execute this request's actor function in ownthread of program?*/</div><div class='add'>+    gf_boolean_t ownthread;</div><div class='add'>+</div><div class='add'>+    gf_boolean_t synctask;</div><div class='add'>+    struct timespec begin; /*req handling start time*/</div><div class='add'>+    struct timespec end;   /*req handling end time*/</div><div class='ctx'> };</div><div class='ctx'> </div><div class='ctx'> #define rpcsvc_request_program(req) ((rpcsvc_program_t *)((req)-&gt;prog))</div><div class='del'>-#define rpcsvc_request_program_private(req) (((rpcsvc_program_t *)((req)-&gt;program))-&gt;private)</div><div class='del'>-#define rpcsvc_request_accepted(req)    ((req)-&gt;rpc_status == MSG_ACCEPTED)</div><div class='add'>+#define rpcsvc_request_procnum(req) (((req)-&gt;procnum))</div><div class='add'>+#define rpcsvc_request_program_private(req)                                    \</div><div class='add'>+    (((rpcsvc_program_t *)((req)-&gt;prog))-&gt;private)</div><div class='add'>+#define rpcsvc_request_accepted(req) ((req)-&gt;rpc_status == MSG_ACCEPTED)</div><div class='ctx'> #define rpcsvc_request_accepted_success(req) ((req)-&gt;rpc_err == SUCCESS)</div><div class='del'>-#define rpcsvc_request_uid(req)         ((req)-&gt;uid)</div><div class='del'>-#define rpcsvc_request_gid(req)         ((req)-&gt;gid)</div><div class='ctx'> #define rpcsvc_request_prog_minauth(req) (rpcsvc_request_program(req)-&gt;min_auth)</div><div class='ctx'> #define rpcsvc_request_cred_flavour(req) (rpcsvc_auth_flavour(req-&gt;cred))</div><div class='ctx'> #define rpcsvc_request_verf_flavour(req) (rpcsvc_auth_flavour(req-&gt;verf))</div><div class='del'>-</div><div class='del'>-#define rpcsvc_request_uid(req)         ((req)-&gt;uid)</div><div class='del'>-#define rpcsvc_request_gid(req)         ((req)-&gt;gid)</div><div class='del'>-#define rpcsvc_request_private(req)     ((req)-&gt;private)</div><div class='del'>-#define rpcsvc_request_xid(req)         ((req)-&gt;xid)</div><div class='del'>-#define rpcsvc_request_set_private(req,prv)  (req)-&gt;private = (void *)(prv)</div><div class='del'>-#define rpcsvc_request_record_ref(req)  (iobuf_ref ((req)-&gt;recordiob))</div><div class='del'>-#define rpcsvc_request_record_unref(req) (iobuf_unref ((req)-&gt;recordiob))</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-#define RPCSVC_ACTOR_SUCCESS    0</div><div class='del'>-#define RPCSVC_ACTOR_ERROR      (-1)</div><div class='add'>+#define rpcsvc_request_service(req) ((req)-&gt;svc)</div><div class='add'>+#define rpcsvc_request_uid(req) ((req)-&gt;uid)</div><div class='add'>+#define rpcsvc_request_gid(req) ((req)-&gt;gid)</div><div class='add'>+#define rpcsvc_request_private(req) ((req)-&gt;private)</div><div class='add'>+#define rpcsvc_request_xid(req) ((req)-&gt;xid)</div><div class='add'>+#define rpcsvc_request_set_private(req, prv) (req)-&gt;private = (void *)(prv)</div><div class='add'>+#define rpcsvc_request_iobref_ref(req) (iobref_ref((req)-&gt;iobref))</div><div class='add'>+#define rpcsvc_request_record_ref(req) (iobuf_ref((req)-&gt;recordiob))</div><div class='add'>+#define rpcsvc_request_record_unref(req) (iobuf_unref((req)-&gt;recordiob))</div><div class='add'>+#define rpcsvc_request_record_iob(req) ((req)-&gt;recordiob)</div><div class='add'>+#define rpcsvc_request_set_vecstate(req, state) ((req)-&gt;vecstate = state)</div><div class='add'>+#define rpcsvc_request_vecstate(req) ((req)-&gt;vecstate)</div><div class='add'>+#define rpcsvc_request_transport(req) ((req)-&gt;trans)</div><div class='add'>+#define rpcsvc_request_transport_ref(req) (rpc_transport_ref((req)-&gt;trans))</div><div class='add'>+#define RPC_AUTH_ROOT_SQUASH(req)                                              \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        int gidcount = 0;                                                      \</div><div class='add'>+        if (req-&gt;svc-&gt;root_squash) {                                           \</div><div class='add'>+            if (req-&gt;uid == RPC_ROOT_UID)                                      \</div><div class='add'>+                req-&gt;uid = req-&gt;svc-&gt;anonuid;                                  \</div><div class='add'>+            if (req-&gt;gid == RPC_ROOT_GID)                                      \</div><div class='add'>+                req-&gt;gid = req-&gt;svc-&gt;anongid;                                  \</div><div class='add'>+                                                                               \</div><div class='add'>+            for (gidcount = 0; gidcount &lt; req-&gt;auxgidcount; ++gidcount) {      \</div><div class='add'>+                if (!req-&gt;auxgids[gidcount])                                   \</div><div class='add'>+                    req-&gt;auxgids[gidcount] = req-&gt;svc-&gt;anongid;                \</div><div class='add'>+            }                                                                  \</div><div class='add'>+        }                                                                      \</div><div class='add'>+    } while (0);</div><div class='add'>+</div><div class='add'>+#define RPC_AUTH_ALL_SQUASH(req)                                               \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        int gidcount = 0;                                                      \</div><div class='add'>+        if (req-&gt;svc-&gt;all_squash) {                                            \</div><div class='add'>+            req-&gt;uid = req-&gt;svc-&gt;anonuid;                                      \</div><div class='add'>+            req-&gt;gid = req-&gt;svc-&gt;anongid;                                      \</div><div class='add'>+                                                                               \</div><div class='add'>+            for (gidcount = 0; gidcount &lt; req-&gt;auxgidcount; ++gidcount) {      \</div><div class='add'>+                if (!req-&gt;auxgids[gidcount])                                   \</div><div class='add'>+                    req-&gt;auxgids[gidcount] = req-&gt;svc-&gt;anongid;                \</div><div class='add'>+            }                                                                  \</div><div class='add'>+        }                                                                      \</div><div class='add'>+    } while (0);</div><div class='add'>+</div><div class='add'>+#define RPCSVC_ACTOR_SUCCESS 0</div><div class='add'>+#define RPCSVC_ACTOR_ERROR (-1)</div><div class='add'>+#define RPCSVC_ACTOR_IGNORE (-2)</div><div class='ctx'> </div><div class='ctx'> /* Functor for every type of protocol actor</div><div class='ctx'>  * must be defined like this.</div><div class='hunk'>@@ -278,116 +337,146 @@ struct rpcsvc_request {</div><div class='ctx'>  * should return RPCSVC_ACTOR_ERROR.</div><div class='ctx'>  *</div><div class='ctx'>  */</div><div class='del'>-typedef int (*rpcsvc_actor) (rpcsvc_request_t *req);</div><div class='del'>-typedef int (*rpcsvc_vector_actor) (rpcsvc_request_t *req, struct iovec *vec,</div><div class='del'>-                                    int count, struct iobref *iobref);</div><div class='del'>-typedef int (*rpcsvc_vector_sizer) (rpcsvc_request_t *req, ssize_t *readsize,</div><div class='del'>-                                    int *newiob);</div><div class='add'>+typedef int (*rpcsvc_actor)(rpcsvc_request_t *req);</div><div class='add'>+typedef int (*rpcsvc_vector_sizer)(int state, ssize_t *readsize,</div><div class='add'>+                                   char *base_addr, char *curr_addr);</div><div class='ctx'> </div><div class='ctx'> /* Every protocol actor will also need to specify the function the RPC layer</div><div class='ctx'>  * will use to serialize or encode the message into XDR format just before</div><div class='ctx'>  * transmitting on the connection.</div><div class='ctx'>  */</div><div class='del'>-typedef void *(*rpcsvc_encode_reply) (void *msg);</div><div class='add'>+typedef void *(*rpcsvc_encode_reply)(void *msg);</div><div class='ctx'> </div><div class='ctx'> /* Once the reply has been transmitted, the message will have to be de-allocated</div><div class='ctx'>  * , so every actor will need to provide a function that deallocates the message</div><div class='ctx'>  * it had allocated as a response.</div><div class='ctx'>  */</div><div class='del'>-typedef void (*rpcsvc_deallocate_reply) (void *msg);</div><div class='del'>-</div><div class='add'>+typedef void (*rpcsvc_deallocate_reply)(void *msg);</div><div class='ctx'> </div><div class='del'>-#define RPCSVC_NAME_MAX            32</div><div class='add'>+#define RPCSVC_NAME_MAX 32</div><div class='ctx'> /* The descriptor for each procedure/actor that runs</div><div class='ctx'>  * over the RPC service.</div><div class='ctx'>  */</div><div class='ctx'> typedef struct rpcsvc_actor_desc {</div><div class='del'>-        char                    procname[RPCSVC_NAME_MAX];</div><div class='del'>-        int                     procnum;</div><div class='del'>-        rpcsvc_actor            actor;</div><div class='del'>-</div><div class='del'>-        /* Handler for cases where the RPC requests fragments are large enough</div><div class='del'>-         * to benefit from being decoded into aligned memory addresses. While</div><div class='del'>-         * decoding the request in a non-vectored manner, due to the nature of</div><div class='del'>-         * the XDR scheme, RPC cannot guarantee memory aligned addresses for</div><div class='del'>-         * the resulting message-specific structures. Allowing a specialized</div><div class='del'>-         * handler for letting the RPC program read the data from the network</div><div class='del'>-         * directly into its alligned buffers.</div><div class='del'>-         */</div><div class='del'>-        rpcsvc_vector_actor     vector_actor;</div><div class='del'>-        rpcsvc_vector_sizer     vector_sizer;</div><div class='del'>-</div><div class='add'>+    char procname[RPCSVC_NAME_MAX];</div><div class='add'>+    rpcsvc_actor actor;</div><div class='add'>+</div><div class='add'>+    /* Handler for cases where the RPC requests fragments are large enough</div><div class='add'>+     * to benefit from being decoded into aligned memory addresses. While</div><div class='add'>+     * decoding the request in a non-vectored manner, due to the nature of</div><div class='add'>+     * the XDR scheme, RPC cannot guarantee memory aligned addresses for</div><div class='add'>+     * the resulting message-specific structures. Allowing a specialized</div><div class='add'>+     * handler for letting the RPC program read the data from the network</div><div class='add'>+     * directly into its aligned buffers.</div><div class='add'>+     */</div><div class='add'>+    rpcsvc_vector_sizer vector_sizer;</div><div class='add'>+</div><div class='add'>+    int procnum;</div><div class='add'>+</div><div class='add'>+    /* Can actor be ran on behalf an unprivileged requestor? */</div><div class='add'>+    drc_op_type_t op_type;</div><div class='add'>+    gf_boolean_t unprivileged;</div><div class='ctx'> } rpcsvc_actor_t;</div><div class='ctx'> </div><div class='add'>+typedef struct rpcsvc_request_queue {</div><div class='add'>+    struct list_head request_queue;</div><div class='add'>+    pthread_mutex_t queue_lock;</div><div class='add'>+    pthread_cond_t queue_cond;</div><div class='add'>+    pthread_t thread;</div><div class='add'>+    struct rpcsvc_program *program;</div><div class='add'>+    int gen;</div><div class='add'>+    gf_boolean_t waiting;</div><div class='add'>+} rpcsvc_request_queue_t;</div><div class='add'>+</div><div class='ctx'> /* Describes a program and its version along with the function pointers</div><div class='ctx'>  * required to handle the procedures/actors of each program/version.</div><div class='ctx'>  * Never changed ever by any thread so no need for a lock.</div><div class='ctx'>  */</div><div class='ctx'> struct rpcsvc_program {</div><div class='del'>-        char                    progname[RPCSVC_NAME_MAX];</div><div class='del'>-        int                     prognum;</div><div class='del'>-        int                     progver;</div><div class='del'>-        /* FIXME */</div><div class='del'>-        dict_t                 *options;        /* An opaque dictionary</div><div class='del'>-                                                 * populated by the program</div><div class='del'>-                                                 * (probably from xl-&gt;options)</div><div class='del'>-                                                 * which contain enough</div><div class='del'>-                                                 * information for transport to</div><div class='del'>-                                                 * initialize. As a part of</div><div class='del'>-                                                 * cleanup, the members of</div><div class='del'>-                                                 * options which are of interest</div><div class='del'>-                                                 * to transport should be put</div><div class='del'>-                                                 * into a structure for better</div><div class='del'>-                                                 * readability and structure</div><div class='del'>-                                                 * should replace options member</div><div class='del'>-                                                 * here.</div><div class='del'>-                                                 */</div><div class='del'>-        uint16_t                progport;       /* Registered with portmap */</div><div class='add'>+    char progname[RPCSVC_NAME_MAX];</div><div class='add'>+    int prognum;</div><div class='add'>+    int progver;</div><div class='add'>+    /* FIXME */</div><div class='add'>+    dict_t *options; /* An opaque dictionary</div><div class='add'>+                      * populated by the program</div><div class='add'>+                      * (probably from xl-&gt;options)</div><div class='add'>+                      * which contain enough</div><div class='add'>+                      * information for transport to</div><div class='add'>+                      * initialize. As a part of</div><div class='add'>+                      * cleanup, the members of</div><div class='add'>+                      * options which are of interest</div><div class='add'>+                      * to transport should be put</div><div class='add'>+                      * into a structure for better</div><div class='add'>+                      * readability and structure</div><div class='add'>+                      * should replace options member</div><div class='add'>+                      * here.</div><div class='add'>+                      */</div><div class='ctx'> #if 0</div><div class='ctx'>         int                     progaddrfamily; /* AF_INET or AF_INET6 */</div><div class='ctx'>         char                    *proghost;      /* Bind host, can be NULL */</div><div class='ctx'> #endif</div><div class='del'>-        rpcsvc_actor_t          *actors;        /* All procedure handlers */</div><div class='del'>-        int                     numactors;      /* Num actors in actor array */</div><div class='del'>-        int                     proghighvers;   /* Highest ver for program</div><div class='del'>-                                                   supported by the system. */</div><div class='del'>-        int                     proglowvers;    /* Lowest ver */</div><div class='del'>-</div><div class='del'>-        /* Program specific state handed to actors */</div><div class='del'>-        void                    *private;</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-        /* This upcall is provided by the program during registration.</div><div class='del'>-         * It is used to notify the program about events like connection being</div><div class='del'>-         * destroyed etc. The rpc program may take appropriate actions, for eg.,</div><div class='del'>-         * in the case of connection being destroyed, it should cleanup its</div><div class='del'>-         * state stored in the connection.</div><div class='del'>-         */</div><div class='del'>-        rpcsvc_notify_t         notify;</div><div class='del'>-</div><div class='del'>-        /* An integer that identifies the min auth strength that is required</div><div class='del'>-         * by this protocol, for eg. MOUNT3 needs AUTH_UNIX at least.</div><div class='del'>-         * See RFC 1813, Section 5.2.1.</div><div class='del'>-         */</div><div class='del'>-        int                     min_auth;</div><div class='del'>-</div><div class='del'>-        /* list member to link to list of registered services with rpcsvc */</div><div class='del'>-        struct list_head        program;</div><div class='add'>+    rpcsvc_actor_t *actors; /* All procedure handlers */</div><div class='add'>+    int numactors;          /* Num actors in actor array */</div><div class='add'>+    int proghighvers;       /* Highest ver for program</div><div class='add'>+                               supported by the system. */</div><div class='add'>+    /* Program specific state handed to actors */</div><div class='add'>+    void *private;</div><div class='add'>+    gf_latency_t *latencies; /*Tracks latency statistics for the rpc call*/</div><div class='add'>+</div><div class='add'>+    /* This upcall is provided by the program during registration.</div><div class='add'>+     * It is used to notify the program about events like connection being</div><div class='add'>+     * destroyed etc. The rpc program may take appropriate actions, for eg.,</div><div class='add'>+     * in the case of connection being destroyed, it should cleanup its</div><div class='add'>+     * state stored in the connection.</div><div class='add'>+     */</div><div class='add'>+    rpcsvc_notify_t notify;</div><div class='add'>+</div><div class='add'>+    int proglowvers; /* Lowest ver */</div><div class='add'>+</div><div class='add'>+    /* An integer that identifies the min auth strength that is required</div><div class='add'>+     * by this protocol, for eg. MOUNT3 needs AUTH_UNIX at least.</div><div class='add'>+     * See RFC 1813, Section 5.2.1.</div><div class='add'>+     */</div><div class='add'>+    int min_auth;</div><div class='add'>+</div><div class='add'>+    /* list member to link to list of registered services with rpcsvc */</div><div class='add'>+    struct list_head program;</div><div class='add'>+    rpcsvc_request_queue_t request_queue[EVENT_MAX_THREADS];</div><div class='add'>+    pthread_mutex_t thr_lock;</div><div class='add'>+    pthread_cond_t thr_cond;</div><div class='add'>+    int threadcount;</div><div class='add'>+    int thr_queue;</div><div class='add'>+    pthread_key_t req_queue_key;</div><div class='add'>+</div><div class='add'>+    /* eventthreadcount is just a readonly copy of the actual value</div><div class='add'>+     * owned by the event sub-system</div><div class='add'>+     * It is used to control the scaling of rpcsvc_request_handler threads</div><div class='add'>+     */</div><div class='add'>+    int eventthreadcount;</div><div class='add'>+    uint16_t progport; /* Registered with portmap */</div><div class='add'>+    /* Execute actor function in program's own thread? This will reduce */</div><div class='add'>+    /* the workload on poller threads */</div><div class='add'>+    gf_boolean_t ownthread;</div><div class='add'>+    gf_boolean_t alive;</div><div class='add'>+</div><div class='add'>+    gf_boolean_t synctask;</div><div class='add'>+    unsigned long request_queue_status[EVENT_MAX_THREADS / __BITS_PER_LONG];</div><div class='ctx'> };</div><div class='ctx'> </div><div class='ctx'> typedef struct rpcsvc_cbk_program {</div><div class='del'>-        char                 *progname;</div><div class='del'>-        int                   prognum;</div><div class='del'>-        int                   progver;</div><div class='add'>+    char *progname;</div><div class='add'>+    int prognum;</div><div class='add'>+    int progver;</div><div class='ctx'> } rpcsvc_cbk_program_t;</div><div class='ctx'> /* All users of RPC services should use this API to register their</div><div class='ctx'>  * procedure handlers.</div><div class='ctx'>  */</div><div class='ctx'> extern int</div><div class='del'>-rpcsvc_program_register (rpcsvc_t *svc, rpcsvc_program_t *program);</div><div class='add'>+rpcsvc_program_register(rpcsvc_t *svc, rpcsvc_program_t *program,</div><div class='add'>+                        gf_boolean_t add_to_head);</div><div class='ctx'> </div><div class='ctx'> extern int</div><div class='del'>-rpcsvc_program_unregister (rpcsvc_t *svc, rpcsvc_program_t *program);</div><div class='add'>+rpcsvc_program_unregister(rpcsvc_t *svc, rpcsvc_program_t *program);</div><div class='ctx'> </div><div class='ctx'> /* This will create and add a listener to listener pool. Programs can</div><div class='ctx'>  * use any of the listener in this pool. A single listener can be used by</div><div class='hunk'>@@ -398,123 +487,150 @@ rpcsvc_program_unregister (rpcsvc_t *svc, rpcsvc_program_t *program);</div><div class='ctx'>  */</div><div class='ctx'> /* FIXME: can multiple programs registered on same port? */</div><div class='ctx'> extern int32_t</div><div class='del'>-rpcsvc_create_listeners (rpcsvc_t *svc, dict_t *options, char *name);</div><div class='add'>+rpcsvc_create_listeners(rpcsvc_t *svc, dict_t *options, char *name);</div><div class='ctx'> </div><div class='ctx'> void</div><div class='del'>-rpcsvc_listener_destroy (rpcsvc_listener_t *listener);</div><div class='add'>+rpcsvc_listener_destroy(rpcsvc_listener_t *listener);</div><div class='ctx'> </div><div class='ctx'> extern int</div><div class='del'>-rpcsvc_program_register_portmap (rpcsvc_program_t *newprog, uint32_t port);</div><div class='add'>+rpcsvc_program_register_portmap(rpcsvc_program_t *newprog, uint32_t port);</div><div class='add'>+</div><div class='add'>+#ifdef IPV6_DEFAULT</div><div class='add'>+extern int</div><div class='add'>+rpcsvc_program_register_rpcbind6(rpcsvc_program_t *newprog, uint32_t port);</div><div class='add'>+extern int</div><div class='add'>+rpcsvc_program_unregister_rpcbind6(rpcsvc_program_t *newprog);</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+extern int</div><div class='add'>+rpcsvc_program_unregister_portmap(rpcsvc_program_t *newprog);</div><div class='add'>+</div><div class='add'>+extern int</div><div class='add'>+rpcsvc_register_portmap_enabled(rpcsvc_t *svc);</div><div class='ctx'> </div><div class='ctx'> /* Inits the global RPC service data structures.</div><div class='ctx'>  * Called in main.</div><div class='ctx'>  */</div><div class='ctx'> extern rpcsvc_t *</div><div class='del'>-rpcsvc_init (glusterfs_ctx_t *ctx, dict_t *options);</div><div class='add'>+rpcsvc_init(xlator_t *xl, glusterfs_ctx_t *ctx, dict_t *options,</div><div class='add'>+            uint32_t poolcount);</div><div class='add'>+</div><div class='add'>+extern int</div><div class='add'>+rpcsvc_reconfigure_options(rpcsvc_t *svc, dict_t *options);</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-rpcsvc_register_notify (rpcsvc_t *svc, rpcsvc_notify_t notify, void *mydata);</div><div class='add'>+rpcsvc_register_notify(rpcsvc_t *svc, rpcsvc_notify_t notify, void *mydata);</div><div class='ctx'> </div><div class='ctx'> /* unregister a notification callback @notify with data @mydata from svc.</div><div class='ctx'>  * returns the number of notification callbacks unregistered.</div><div class='ctx'>  */</div><div class='ctx'> int</div><div class='del'>-rpcsvc_unregister_notify (rpcsvc_t *svc, rpcsvc_notify_t notify, void *mydata);</div><div class='add'>+rpcsvc_unregister_notify(rpcsvc_t *svc, rpcsvc_notify_t notify, void *mydata);</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-rpcsvc_submit_message (rpcsvc_request_t *req, struct iovec *proghdr,</div><div class='del'>-                       int hdrcount, struct iovec *payload, int payloadcount,</div><div class='del'>-                       struct iobref *iobref);</div><div class='add'>+rpcsvc_transport_submit(rpc_transport_t *trans, struct iovec *rpchdr,</div><div class='add'>+                        int rpchdrcount, struct iovec *proghdr,</div><div class='add'>+                        int proghdrcount, struct iovec *progpayload,</div><div class='add'>+                        int progpayloadcount, struct iobref *iobref,</div><div class='add'>+                        void *priv);</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-rpcsvc_submit_generic (rpcsvc_request_t *req, struct iovec *proghdr,</div><div class='del'>-                       int hdrcount, struct iovec *payload, int payloadcount,</div><div class='del'>-                       struct iobref *iobref);</div><div class='add'>+rpcsvc_submit_message(rpcsvc_request_t *req, struct iovec *proghdr,</div><div class='add'>+                      int hdrcount, struct iovec *payload, int payloadcount,</div><div class='add'>+                      struct iobref *iobref);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+rpcsvc_submit_generic(rpcsvc_request_t *req, struct iovec *proghdr,</div><div class='add'>+                      int hdrcount, struct iovec *payload, int payloadcount,</div><div class='add'>+                      struct iobref *iobref);</div><div class='ctx'> </div><div class='ctx'> extern int</div><div class='del'>-rpcsvc_error_reply (rpcsvc_request_t *req);</div><div class='add'>+rpcsvc_error_reply(rpcsvc_request_t *req);</div><div class='ctx'> </div><div class='del'>-#define RPCSVC_PEER_STRLEN      1024</div><div class='del'>-#define RPCSVC_AUTH_ACCEPT      1</div><div class='del'>-#define RPCSVC_AUTH_REJECT      2</div><div class='del'>-#define RPCSVC_AUTH_DONTCARE    3</div><div class='add'>+#define RPCSVC_PEER_STRLEN 1024</div><div class='add'>+#define RPCSVC_AUTH_ACCEPT 1</div><div class='add'>+#define RPCSVC_AUTH_REJECT 2</div><div class='add'>+#define RPCSVC_AUTH_DONTCARE 3</div><div class='ctx'> </div><div class='ctx'> extern int</div><div class='del'>-rpcsvc_transport_peername (rpc_transport_t *trans, char *hostname, int hostlen);</div><div class='add'>+rpcsvc_transport_peername(rpc_transport_t *trans, char *hostname, int hostlen);</div><div class='ctx'> </div><div class='del'>-extern inline int</div><div class='del'>-rpcsvc_transport_peeraddr (rpc_transport_t *trans, char *addrstr, int addrlen,</div><div class='del'>-                           struct sockaddr_storage *returnsa, socklen_t sasize);</div><div class='add'>+extern int</div><div class='add'>+rpcsvc_transport_peeraddr(rpc_transport_t *trans, char *addrstr, int addrlen,</div><div class='add'>+                          struct sockaddr_storage *returnsa, socklen_t sasize);</div><div class='ctx'> </div><div class='ctx'> extern int</div><div class='del'>-rpcsvc_transport_peer_check (dict_t *options, char *volname,</div><div class='del'>-                             rpc_transport_t *trans);</div><div class='add'>+rpcsvc_auth_check(rpcsvc_t *svc, char *volname, char *ipaddr);</div><div class='ctx'> </div><div class='ctx'> extern int</div><div class='del'>-rpcsvc_transport_privport_check (rpcsvc_t *svc, char *volname,</div><div class='del'>-                                 rpc_transport_t *trans);</div><div class='del'>-#define rpcsvc_request_seterr(req, err)                 (req)-&gt;rpc_err = err</div><div class='del'>-#define rpcsvc_request_set_autherr(req, err)            (req)-&gt;auth_err = err</div><div class='add'>+rpcsvc_transport_privport_check(rpcsvc_t *svc, char *volname, uint16_t port);</div><div class='ctx'> </div><div class='del'>-extern int rpcsvc_submit_vectors (rpcsvc_request_t *req);</div><div class='add'>+#define rpcsvc_request_seterr(req, err) ((req)-&gt;rpc_err = (int)(err))</div><div class='add'>+#define rpcsvc_request_set_autherr(req, err) ((req)-&gt;auth_err = (int)(err))</div><div class='ctx'> </div><div class='del'>-extern int rpcsvc_request_attach_vector (rpcsvc_request_t *req,</div><div class='del'>-                                         struct iovec msgvec, struct iobuf *iob,</div><div class='del'>-                                         struct iobref *ioref, int finalvector);</div><div class='add'>+extern int</div><div class='add'>+rpcsvc_submit_vectors(rpcsvc_request_t *req);</div><div class='ctx'> </div><div class='add'>+extern int</div><div class='add'>+rpcsvc_request_attach_vector(rpcsvc_request_t *req, struct iovec msgvec,</div><div class='add'>+                             struct iobuf *iob, struct iobref *ioref,</div><div class='add'>+                             int finalvector);</div><div class='ctx'> </div><div class='del'>-typedef int (*auth_init_trans) (rpc_transport_t *trans, void *priv);</div><div class='del'>-typedef int (*auth_init_request) (rpcsvc_request_t *req, void *priv);</div><div class='del'>-typedef int (*auth_request_authenticate) (rpcsvc_request_t *req, void *priv);</div><div class='add'>+typedef int (*auth_init_trans)(rpc_transport_t *trans, void *priv);</div><div class='add'>+typedef int (*auth_init_request)(rpcsvc_request_t *req, void *priv);</div><div class='add'>+typedef int (*auth_request_authenticate)(rpcsvc_request_t *req, void *priv);</div><div class='ctx'> </div><div class='ctx'> /* This structure needs to be registered by every authentication scheme.</div><div class='ctx'>  * Our authentication schemes are stored per connection because</div><div class='ctx'>  * each connection will end up using a different authentication scheme.</div><div class='ctx'>  */</div><div class='ctx'> typedef struct rpcsvc_auth_ops {</div><div class='del'>-        auth_init_trans               transport_init;</div><div class='del'>-        auth_init_request             request_init;</div><div class='del'>-        auth_request_authenticate     authenticate;</div><div class='add'>+    auth_init_trans transport_init;</div><div class='add'>+    auth_init_request request_init;</div><div class='add'>+    auth_request_authenticate authenticate;</div><div class='ctx'> } rpcsvc_auth_ops_t;</div><div class='ctx'> </div><div class='ctx'> typedef struct rpcsvc_auth_flavour_desc {</div><div class='del'>-        char                    authname[RPCSVC_NAME_MAX];</div><div class='del'>-        int                     authnum;</div><div class='del'>-        rpcsvc_auth_ops_t       *authops;</div><div class='del'>-        void                    *authprivate;</div><div class='add'>+    char authname[RPCSVC_NAME_MAX];</div><div class='add'>+    rpcsvc_auth_ops_t *authops;</div><div class='add'>+    void *authprivate;</div><div class='add'>+    int authnum;</div><div class='ctx'> } rpcsvc_auth_t;</div><div class='ctx'> </div><div class='del'>-typedef void * (*rpcsvc_auth_initer_t) (rpcsvc_t *svc, dict_t *options);</div><div class='add'>+typedef void *(*rpcsvc_auth_initer_t)(rpcsvc_t *svc, dict_t *options);</div><div class='ctx'> </div><div class='ctx'> struct rpcsvc_auth_list {</div><div class='del'>-        struct list_head        authlist;</div><div class='del'>-        rpcsvc_auth_initer_t    init;</div><div class='del'>-        /* Should be the name with which we identify the auth scheme given</div><div class='del'>-         * in the volfile options.</div><div class='del'>-         * This should be different from the authname in rpc_auth_t</div><div class='del'>-         * in way that makes it easier to specify this scheme in the volfile.</div><div class='del'>-         * This is because the technical names of the schemes can be a bit</div><div class='del'>-         * arcane.</div><div class='del'>-         */</div><div class='del'>-        char                    name[RPCSVC_NAME_MAX];</div><div class='del'>-        rpcsvc_auth_t           *auth;</div><div class='del'>-        int                     enable;</div><div class='add'>+    struct list_head authlist;</div><div class='add'>+    rpcsvc_auth_initer_t init;</div><div class='add'>+    /* Should be the name with which we identify the auth scheme given</div><div class='add'>+     * in the volfile options.</div><div class='add'>+     * This should be different from the authname in rpc_auth_t</div><div class='add'>+     * in way that makes it easier to specify this scheme in the volfile.</div><div class='add'>+     * This is because the technical names of the schemes can be a bit</div><div class='add'>+     * arcane.</div><div class='add'>+     */</div><div class='add'>+    char name[RPCSVC_NAME_MAX];</div><div class='add'>+    rpcsvc_auth_t *auth;</div><div class='add'>+    int enable;</div><div class='ctx'> };</div><div class='ctx'> </div><div class='ctx'> extern int</div><div class='del'>-rpcsvc_auth_request_init (rpcsvc_request_t *req);</div><div class='add'>+rpcsvc_auth_request_init(rpcsvc_request_t *req, struct rpc_msg *callmsg);</div><div class='add'>+</div><div class='add'>+extern int</div><div class='add'>+rpcsvc_auth_init(rpcsvc_t *svc, dict_t *options);</div><div class='ctx'> </div><div class='ctx'> extern int</div><div class='del'>-rpcsvc_auth_init (rpcsvc_t *svc, dict_t *options);</div><div class='add'>+rpcsvc_auth_reconf(rpcsvc_t *svc, dict_t *options);</div><div class='ctx'> </div><div class='ctx'> extern int</div><div class='del'>-rpcsvc_auth_transport_init (rpc_transport_t *xprt);</div><div class='add'>+rpcsvc_auth_transport_init(rpc_transport_t *xprt);</div><div class='ctx'> </div><div class='ctx'> extern int</div><div class='del'>-rpcsvc_authenticate (rpcsvc_request_t *req);</div><div class='add'>+rpcsvc_authenticate(rpcsvc_request_t *req);</div><div class='ctx'> </div><div class='ctx'> extern int</div><div class='del'>-rpcsvc_auth_array (rpcsvc_t *svc, char *volname, int *autharr, int arrlen);</div><div class='add'>+rpcsvc_auth_array(rpcsvc_t *svc, char *volname, int *autharr, int arrlen);</div><div class='ctx'> </div><div class='ctx'> /* If the request has been sent using AUTH_UNIX, this function returns the</div><div class='ctx'>  * auxiliary gids as an array, otherwise, it returns NULL.</div><div class='hunk'>@@ -522,16 +638,57 @@ rpcsvc_auth_array (rpcsvc_t *svc, char *volname, int *autharr, int arrlen);</div><div class='ctx'>  * authentication code even further to support mode auth schemes.</div><div class='ctx'>  */</div><div class='ctx'> extern gid_t *</div><div class='del'>-rpcsvc_auth_unix_auxgids (rpcsvc_request_t *req, int *arrlen);</div><div class='del'>-</div><div class='del'>-extern int</div><div class='del'>-rpcsvc_combine_gen_spec_volume_checks (int gen, int spec);</div><div class='add'>+rpcsvc_auth_unix_auxgids(rpcsvc_request_t *req, int *arrlen);</div><div class='ctx'> </div><div class='ctx'> extern char *</div><div class='del'>-rpcsvc_volume_allowed (dict_t *options, char *volname);</div><div class='add'>+rpcsvc_volume_allowed(dict_t *options, char *volname);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+rpcsvc_request_submit(rpcsvc_t *rpc, rpc_transport_t *trans,</div><div class='add'>+                      rpcsvc_cbk_program_t *prog, int procnum, void *req,</div><div class='add'>+                      glusterfs_ctx_t *ctx, xdrproc_t xdrproc);</div><div class='ctx'> </div><div class='del'>-int rpcsvc_callback_submit (rpcsvc_t *rpc, rpc_transport_t *trans,</div><div class='del'>-                            rpcsvc_cbk_program_t *prog, int procnum,</div><div class='del'>-                            struct iovec *proghdr, int proghdrcount);</div><div class='add'>+int</div><div class='add'>+rpcsvc_callback_submit(rpcsvc_t *rpc, rpc_transport_t *trans,</div><div class='add'>+                       rpcsvc_cbk_program_t *prog, int procnum,</div><div class='add'>+                       struct iovec *proghdr, int proghdrcount,</div><div class='add'>+                       struct iobref *iobref);</div><div class='add'>+</div><div class='add'>+rpcsvc_actor_t *</div><div class='add'>+rpcsvc_program_actor(rpcsvc_request_t *req);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+rpcsvc_transport_unix_options_build(dict_t *options, char *filepath);</div><div class='add'>+int</div><div class='add'>+rpcsvc_set_allow_insecure(rpcsvc_t *svc, dict_t *options);</div><div class='add'>+int</div><div class='add'>+rpcsvc_set_addr_namelookup(rpcsvc_t *svc, dict_t *options);</div><div class='add'>+int</div><div class='add'>+rpcsvc_set_root_squash(rpcsvc_t *svc, dict_t *options);</div><div class='add'>+int</div><div class='add'>+rpcsvc_set_all_squash(rpcsvc_t *svc, dict_t *options);</div><div class='add'>+int</div><div class='add'>+rpcsvc_set_outstanding_rpc_limit(rpcsvc_t *svc, dict_t *options, int defvalue);</div><div class='ctx'> </div><div class='add'>+int</div><div class='add'>+rpcsvc_set_throttle_on(rpcsvc_t *svc);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+rpcsvc_set_throttle_off(rpcsvc_t *svc);</div><div class='add'>+</div><div class='add'>+gf_boolean_t</div><div class='add'>+rpcsvc_get_throttle(rpcsvc_t *svc);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+rpcsvc_auth_array(rpcsvc_t *svc, char *volname, int *autharr, int arrlen);</div><div class='add'>+rpcsvc_vector_sizer</div><div class='add'>+rpcsvc_get_program_vector_sizer(rpcsvc_t *svc, uint32_t prognum,</div><div class='add'>+                                uint32_t progver, int procnum);</div><div class='add'>+void</div><div class='add'>+rpcsvc_autoscale_threads(glusterfs_ctx_t *ctx, rpcsvc_t *rpc, int incr);</div><div class='add'>+</div><div class='add'>+extern int</div><div class='add'>+rpcsvc_destroy(rpcsvc_t *svc);</div><div class='add'>+void</div><div class='add'>+rpcsvc_statedump(rpcsvc_t *svc);</div><div class='ctx'> #endif</div><div class='head'>diff --git a/rpc/rpc-lib/src/xdr-common.h b/rpc/rpc-lib/src/xdr-common.h<br/>index 13ac41cee70..752736b3d4d 100644<br/>--- a/<a href='/cgit/glusterfs.git/tree/rpc/rpc-lib/src/xdr-common.h?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>rpc/rpc-lib/src/xdr-common.h</a><br/>+++ b/<a href='/cgit/glusterfs.git/tree/rpc/rpc-lib/src/xdr-common.h?id=d1d7a6f35c816822fab51c820e25023863c239c1'>rpc/rpc-lib/src/xdr-common.h</a></div><div class='hunk'>@@ -1,123 +1,116 @@</div><div class='ctx'> /*</div><div class='del'>-  Copyright (c) 2010 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='add'>+  Copyright (c) 2008-2012 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='ctx'>   This file is part of GlusterFS.</div><div class='ctx'> </div><div class='del'>-  GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-  it under the terms of the GNU Affero General Public License as published</div><div class='del'>-  by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-  or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-  GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-  WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-  Affero General Public License for more details.</div><div class='del'>-</div><div class='del'>-  You should have received a copy of the GNU Affero General Public License</div><div class='del'>-  along with this program.  If not, see</div><div class='del'>-  &lt;http://www.gnu.org/licenses/&gt;.</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='ctx'> */</div><div class='ctx'> </div><div class='ctx'> #ifndef _XDR_COMMON_H_</div><div class='ctx'> #define _XDR_COMMON_H_</div><div class='ctx'> </div><div class='del'>-#ifndef _CONFIG_H</div><div class='del'>-#define _CONFIG_H</div><div class='del'>-#include "config.h"</div><div class='del'>-#endif</div><div class='del'>-</div><div class='ctx'> #include &lt;rpc/types.h&gt;</div><div class='ctx'> #include &lt;sys/types.h&gt;</div><div class='ctx'> #include &lt;rpc/xdr.h&gt;</div><div class='add'>+#include &lt;rpc/auth.h&gt;</div><div class='ctx'> #include &lt;sys/uio.h&gt;</div><div class='ctx'> </div><div class='del'>-enum {</div><div class='del'>-        GF_DUMP_NULL,</div><div class='del'>-        GF_DUMP_DUMP,</div><div class='del'>-        GF_DUMP_MAXVALUE,</div><div class='del'>-} gf_dump_procnum_t;</div><div class='add'>+#ifdef __NetBSD__</div><div class='add'>+#include &lt;dirent.h&gt;</div><div class='add'>+#endif /* __NetBSD__ */</div><div class='add'>+</div><div class='add'>+enum gf_dump_procnum {</div><div class='add'>+    GF_DUMP_NULL,</div><div class='add'>+    GF_DUMP_DUMP,</div><div class='add'>+    GF_DUMP_PING,</div><div class='add'>+    GF_DUMP_MAXVALUE,</div><div class='add'>+};</div><div class='ctx'> </div><div class='ctx'> #define GLUSTER_DUMP_PROGRAM 123451501 /* Completely random */</div><div class='ctx'> #define GLUSTER_DUMP_VERSION 1</div><div class='ctx'> </div><div class='add'>+/* MAX_AUTH_BYTES is restricted to 400 bytes, see</div><div class='add'>+ * http://tools.ietf.org/html/rfc5531#section-8.2 */</div><div class='add'>+#define GF_MAX_AUTH_BYTES MAX_AUTH_BYTES</div><div class='add'>+</div><div class='add'>+/* The size of an AUTH_GLUSTERFS_V2 structure:</div><div class='add'>+ *</div><div class='add'>+ *   1 | pid</div><div class='add'>+ *   1 | uid</div><div class='add'>+ *   1 | gid</div><div class='add'>+ *   1 | groups_len</div><div class='add'>+ *  XX | groups_val (GF_MAX_AUX_GROUPS=65535)</div><div class='add'>+ *   1 | lk_owner_len</div><div class='add'>+ *  YY | lk_owner_val (GF_MAX_LOCK_OWNER_LEN=1024)</div><div class='add'>+ * ----+-------------------------------------------</div><div class='add'>+ *   5 | total xdr-units</div><div class='add'>+ *</div><div class='add'>+ * one XDR-unit is defined as BYTES_PER_XDR_UNIT = 4 bytes</div><div class='add'>+ * MAX_AUTH_BYTES = 400 is the maximum, this is 100 xdr-units.</div><div class='add'>+ * XX + YY can be 95 to fill the 100 xdr-units.</div><div class='add'>+ *</div><div class='add'>+ * Note that the on-wire protocol has tighter requirements than the internal</div><div class='add'>+ * structures. It is possible for xlators to use more groups and a bigger</div><div class='add'>+ * lk_owner than that can be sent by a GlusterFS-client.</div><div class='add'>+ *</div><div class='add'>+ * -------</div><div class='add'>+ * On v3, there are 4 more units, and hence it will be 9 xdr-units</div><div class='add'>+ */</div><div class='add'>+#define GF_AUTH_GLUSTERFS_MAX_GROUPS(lk_len, type)                             \</div><div class='add'>+    ((type == AUTH_GLUSTERFS_v2) ? (95 - lk_len) : (91 - lk_len))</div><div class='add'>+#define GF_AUTH_GLUSTERFS_MAX_LKOWNER(groups_len, type)                        \</div><div class='add'>+    ((type == AUTH_GLUSTERFS_v2) ? (95 - groups_len) : (91 - groups_len))</div><div class='add'>+</div><div class='add'>+#ifdef GF_LINUX_HOST_OS</div><div class='add'>+#define xdr_u_int32_t xdr_uint32_t</div><div class='add'>+#define xdr_u_int64_t xdr_uint64_t</div><div class='add'>+unsigned long</div><div class='add'>+xdr_sizeof(xdrproc_t func, void *data);</div><div class='add'>+#endif</div><div class='ctx'> </div><div class='del'>-#if GF_DARWIN_HOST_OS</div><div class='add'>+#ifdef GF_DARWIN_HOST_OS</div><div class='ctx'> #define xdr_u_quad_t xdr_u_int64_t</div><div class='del'>-#define xdr_quad_t   xdr_int64_t</div><div class='add'>+#define xdr_quad_t xdr_int64_t</div><div class='ctx'> #define xdr_uint32_t xdr_u_int32_t</div><div class='add'>+#define xdr_uint64_t xdr_u_int64_t</div><div class='ctx'> #define uint64_t u_int64_t</div><div class='add'>+unsigned long</div><div class='add'>+xdr_sizeof(xdrproc_t func, void *data);</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#if defined(__NetBSD__)</div><div class='add'>+#define xdr_u_quad_t xdr_u_int64_t</div><div class='add'>+#define xdr_quad_t xdr_int64_t</div><div class='add'>+#define xdr_uint32_t xdr_u_int32_t</div><div class='add'>+#define xdr_uint64_t xdr_u_int64_t</div><div class='ctx'> #endif</div><div class='ctx'> </div><div class='del'>-#if GF_SOLARIS_HOST_OS</div><div class='add'>+#ifdef GF_SOLARIS_HOST_OS</div><div class='ctx'> #define u_quad_t uint64_t</div><div class='ctx'> #define quad_t int64_t</div><div class='ctx'> #define xdr_u_quad_t xdr_uint64_t</div><div class='del'>-#define xdr_quad_t   xdr_int64_t</div><div class='del'>-#define xdr_uint32_t xdr_uint32_t</div><div class='add'>+#define xdr_quad_t xdr_int64_t</div><div class='ctx'> #endif</div><div class='ctx'> </div><div class='del'>-struct auth_glusterfs_parms {</div><div class='del'>-	uint64_t lk_owner;</div><div class='del'>-	u_int pid;</div><div class='del'>-	u_int uid;</div><div class='del'>-	u_int gid;</div><div class='del'>-	u_int ngrps;</div><div class='del'>-	u_int groups[16];</div><div class='del'>-} __attribute__((packed));</div><div class='del'>-typedef struct auth_glusterfs_parms auth_glusterfs_parms;</div><div class='del'>-</div><div class='del'>-struct gf_dump_req {</div><div class='del'>-	uint64_t gfs_id;</div><div class='del'>-} __attribute__((packed));</div><div class='del'>-typedef struct gf_dump_req gf_dump_req;</div><div class='del'>-</div><div class='del'>-struct gf_prog_detail {</div><div class='del'>-	char    *progname;</div><div class='del'>-	uint64_t prognum;</div><div class='del'>-	uint64_t progver;</div><div class='del'>-	struct gf_prog_detail *next;</div><div class='del'>-} __attribute__((packed));</div><div class='del'>-typedef struct gf_prog_detail gf_prog_detail;</div><div class='del'>-</div><div class='del'>-struct gf_dump_rsp {</div><div class='del'>-	uint64_t gfs_id;</div><div class='del'>-	int op_ret;</div><div class='del'>-	int op_errno;</div><div class='del'>-	struct gf_prog_detail *prog;</div><div class='del'>-}__attribute__((packed));</div><div class='del'>-typedef struct gf_dump_rsp gf_dump_rsp;</div><div class='del'>-</div><div class='del'>-extern bool_t</div><div class='del'>-xdr_auth_glusterfs_parms (XDR *xdrs, auth_glusterfs_parms *objp);</div><div class='del'>-extern bool_t xdr_gf_dump_req (XDR *, gf_dump_req*);</div><div class='del'>-extern bool_t xdr_gf_prog_detail (XDR *, gf_prog_detail*);</div><div class='del'>-extern bool_t xdr_gf_dump_rsp (XDR *, gf_dump_rsp*);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_serialize_dump_rsp (struct iovec outmsg, void *rsp);</div><div class='del'>-ssize_t</div><div class='del'>-xdr_to_dump_req (struct iovec inmsg, void *args);</div><div class='del'>-ssize_t</div><div class='del'>-xdr_from_dump_req (struct iovec outmsg, void *rsp);</div><div class='del'>-ssize_t</div><div class='del'>-xdr_to_dump_rsp (struct iovec inmsg, void *args);</div><div class='del'>-</div><div class='del'>-#define XDR_BYTES_PER_UNIT      4</div><div class='del'>-</div><div class='ctx'> /* Returns the address of the byte that follows the</div><div class='ctx'>  * last byte used for decoding the previous xdr component.</div><div class='del'>- * For eg, once the RPC call for NFS has been decoded, thie macro will return</div><div class='add'>+ * E.g. once the RPC call for NFS has been decoded, the macro will return</div><div class='ctx'>  * the address from which the NFS header starts.</div><div class='ctx'>  */</div><div class='del'>-#define xdr_decoded_remaining_addr(xdr)        ((&amp;xdr)-&gt;x_private)</div><div class='add'>+#define xdr_decoded_remaining_addr(xdr) ((&amp;xdr)-&gt;x_private)</div><div class='ctx'> </div><div class='ctx'> /* Returns the length of the remaining record after the previous decode</div><div class='ctx'>  * operation completed.</div><div class='ctx'>  */</div><div class='del'>-#define xdr_decoded_remaining_len(xdr)         ((&amp;xdr)-&gt;x_handy)</div><div class='add'>+#define xdr_decoded_remaining_len(xdr) ((&amp;xdr)-&gt;x_handy)</div><div class='ctx'> </div><div class='ctx'> /* Returns the number of bytes used by the last encode operation. */</div><div class='del'>-#define xdr_encoded_length(xdr) (((size_t)(&amp;xdr)-&gt;x_private) - ((size_t)(&amp;xdr)-&gt;x_base))</div><div class='add'>+#define xdr_encoded_length(xdr)                                                \</div><div class='add'>+    (((size_t)(&amp;xdr)-&gt;x_private) - ((size_t)(&amp;xdr)-&gt;x_base))</div><div class='ctx'> </div><div class='del'>-#define xdr_decoded_length(xdr) (((size_t)(&amp;xdr)-&gt;x_private) - ((size_t)(&amp;xdr)-&gt;x_base))</div><div class='add'>+#define xdr_decoded_length(xdr)                                                \</div><div class='add'>+    (((size_t)(&amp;xdr)-&gt;x_private) - ((size_t)(&amp;xdr)-&gt;x_base))</div><div class='ctx'> </div><div class='ctx'> #endif</div><div class='head'>diff --git a/rpc/rpc-lib/src/xdr-rpc.c b/rpc/rpc-lib/src/xdr-rpc.c<br/>index 26e7fa57d85..4992dc5a7ce 100644<br/>--- a/<a href='/cgit/glusterfs.git/tree/rpc/rpc-lib/src/xdr-rpc.c?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>rpc/rpc-lib/src/xdr-rpc.c</a><br/>+++ b/<a href='/cgit/glusterfs.git/tree/rpc/rpc-lib/src/xdr-rpc.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>rpc/rpc-lib/src/xdr-rpc.c</a></div><div class='hunk'>@@ -1,193 +1,198 @@</div><div class='ctx'> /*</div><div class='del'>-  Copyright (c) 2010 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='add'>+  Copyright (c) 2008-2012 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='ctx'>   This file is part of GlusterFS.</div><div class='ctx'> </div><div class='del'>-  GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-  it under the terms of the GNU Affero General Public License as published</div><div class='del'>-  by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-  or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-  GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-  WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-  Affero General Public License for more details.</div><div class='del'>-</div><div class='del'>-  You should have received a copy of the GNU Affero General Public License</div><div class='del'>-  along with this program.  If not, see</div><div class='del'>-  &lt;http://www.gnu.org/licenses/&gt;.</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='ctx'> */</div><div class='ctx'> </div><div class='del'>-#ifndef _CONFIG_H</div><div class='del'>-#define _CONFIG_H</div><div class='del'>-#include "config.h"</div><div class='del'>-#endif</div><div class='del'>-</div><div class='ctx'> #include &lt;rpc/rpc.h&gt;</div><div class='del'>-#include &lt;rpc/pmap_clnt.h&gt;</div><div class='del'>-#include &lt;arpa/inet.h&gt;</div><div class='ctx'> #include &lt;rpc/xdr.h&gt;</div><div class='ctx'> #include &lt;sys/uio.h&gt;</div><div class='ctx'> #include &lt;rpc/auth_unix.h&gt;</div><div class='ctx'> </div><div class='del'>-#include "mem-pool.h"</div><div class='ctx'> #include "xdr-rpc.h"</div><div class='ctx'> #include "xdr-common.h"</div><div class='del'>-#include "logging.h"</div><div class='add'>+#include &lt;glusterfs/common-utils.h&gt;</div><div class='ctx'> </div><div class='ctx'> /* Decodes the XDR format in msgbuf into rpc_msg.</div><div class='ctx'>  * The remaining payload is returned into payload.</div><div class='ctx'>  */</div><div class='ctx'> int</div><div class='del'>-xdr_to_rpc_call (char *msgbuf, size_t len, struct rpc_msg *call,</div><div class='del'>-                 struct iovec *payload, char *credbytes, char *verfbytes)</div><div class='add'>+xdr_to_rpc_call(char *msgbuf, size_t len, struct rpc_msg *call,</div><div class='add'>+                struct iovec *payload, char *credbytes, char *verfbytes)</div><div class='ctx'> {</div><div class='del'>-        XDR                     xdr;</div><div class='del'>-        char                    opaquebytes[MAX_AUTH_BYTES];</div><div class='del'>-        struct opaque_auth      *oa = NULL;</div><div class='del'>-</div><div class='del'>-        if ((!msgbuf) || (!call))</div><div class='del'>-                return -1;</div><div class='del'>-</div><div class='del'>-        memset (call, 0, sizeof (*call));</div><div class='del'>-</div><div class='del'>-        oa = &amp;call-&gt;rm_call.cb_cred;</div><div class='del'>-        if (!credbytes)</div><div class='del'>-                oa-&gt;oa_base = opaquebytes;</div><div class='del'>-        else</div><div class='del'>-                oa-&gt;oa_base = credbytes;</div><div class='del'>-</div><div class='del'>-        oa = &amp;call-&gt;rm_call.cb_verf;</div><div class='del'>-        if (!verfbytes)</div><div class='del'>-                oa-&gt;oa_base = opaquebytes;</div><div class='del'>-        else</div><div class='del'>-                oa-&gt;oa_base = verfbytes;</div><div class='del'>-</div><div class='del'>-        xdrmem_create (&amp;xdr, msgbuf, len, XDR_DECODE);</div><div class='del'>-        if (!xdr_callmsg (&amp;xdr, call))</div><div class='del'>-                return -1;</div><div class='del'>-</div><div class='del'>-        if (payload) {</div><div class='del'>-                payload-&gt;iov_base = xdr_decoded_remaining_addr (xdr);</div><div class='del'>-                payload-&gt;iov_len = xdr_decoded_remaining_len (xdr);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        return 0;</div><div class='add'>+    XDR xdr;</div><div class='add'>+    char opaquebytes[GF_MAX_AUTH_BYTES];</div><div class='add'>+    struct opaque_auth *oa = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    GF_VALIDATE_OR_GOTO("rpc", msgbuf, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("rpc", call, out);</div><div class='add'>+</div><div class='add'>+    memset(call, 0, sizeof(*call));</div><div class='add'>+</div><div class='add'>+    oa = &amp;call-&gt;rm_call.cb_cred;</div><div class='add'>+    if (!credbytes)</div><div class='add'>+        oa-&gt;oa_base = opaquebytes;</div><div class='add'>+    else</div><div class='add'>+        oa-&gt;oa_base = credbytes;</div><div class='add'>+</div><div class='add'>+    oa = &amp;call-&gt;rm_call.cb_verf;</div><div class='add'>+    if (!verfbytes)</div><div class='add'>+        oa-&gt;oa_base = opaquebytes;</div><div class='add'>+    else</div><div class='add'>+        oa-&gt;oa_base = verfbytes;</div><div class='add'>+</div><div class='add'>+    xdrmem_create(&amp;xdr, msgbuf, len, XDR_DECODE);</div><div class='add'>+    if (!xdr_callmsg(&amp;xdr, call)) {</div><div class='add'>+        gf_log("rpc", GF_LOG_WARNING, "failed to decode call msg");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (payload) {</div><div class='add'>+        payload-&gt;iov_base = xdr_decoded_remaining_addr(xdr);</div><div class='add'>+        payload-&gt;iov_len = xdr_decoded_remaining_len(xdr);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> bool_t</div><div class='del'>-true_func (XDR *s, caddr_t *a)</div><div class='add'>+true_func(XDR *s, caddr_t *a)</div><div class='ctx'> {</div><div class='del'>-        return TRUE;</div><div class='add'>+    return TRUE;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-rpc_fill_empty_reply (struct rpc_msg *reply, uint32_t xid)</div><div class='add'>+rpc_fill_empty_reply(struct rpc_msg *reply, uint32_t xid)</div><div class='ctx'> {</div><div class='del'>-        if (!reply)</div><div class='del'>-                return -1;</div><div class='add'>+    int ret = -1;</div><div class='ctx'> </div><div class='del'>-        /* Setting to 0 also results in reply verifier flavor to be</div><div class='del'>-         * set to AUTH_NULL which is what we want right now.</div><div class='del'>-         */</div><div class='del'>-        memset (reply, 0, sizeof (*reply));</div><div class='del'>-        reply-&gt;rm_xid = xid;</div><div class='del'>-        reply-&gt;rm_direction = REPLY;</div><div class='add'>+    GF_VALIDATE_OR_GOTO("rpc", reply, out);</div><div class='ctx'> </div><div class='del'>-        return 0;</div><div class='add'>+    /* Setting to 0 also results in reply verifier flavor to be</div><div class='add'>+     * set to AUTH_NULL which is what we want right now.</div><div class='add'>+     */</div><div class='add'>+    memset(reply, 0, sizeof(*reply));</div><div class='add'>+    reply-&gt;rm_xid = xid;</div><div class='add'>+    reply-&gt;rm_direction = REPLY;</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-rpc_fill_denied_reply (struct rpc_msg *reply, int rjstat, int auth_err)</div><div class='add'>+rpc_fill_denied_reply(struct rpc_msg *reply, int rjstat, int auth_err)</div><div class='ctx'> {</div><div class='del'>-        if (!reply)</div><div class='del'>-                return -1;</div><div class='del'>-</div><div class='del'>-        reply-&gt;rm_reply.rp_stat = MSG_DENIED;</div><div class='del'>-        reply-&gt;rjcted_rply.rj_stat = rjstat;</div><div class='del'>-        if (rjstat == RPC_MISMATCH) {</div><div class='del'>-                /* No problem with hardocoding</div><div class='del'>-                 * RPC version numbers. We only support</div><div class='del'>-                 * v2 anyway.</div><div class='del'>-                 */</div><div class='del'>-                reply-&gt;rjcted_rply.rj_vers.low = 2;</div><div class='del'>-                reply-&gt;rjcted_rply.rj_vers.high = 2;</div><div class='del'>-        } else if (rjstat == AUTH_ERROR)</div><div class='del'>-                reply-&gt;rjcted_rply.rj_why = auth_err;</div><div class='del'>-</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='add'>+    int ret = -1;</div><div class='ctx'> </div><div class='add'>+    GF_VALIDATE_OR_GOTO("rpc", reply, out);</div><div class='add'>+</div><div class='add'>+    reply-&gt;rm_reply.rp_stat = MSG_DENIED;</div><div class='add'>+    reply-&gt;rjcted_rply.rj_stat = rjstat;</div><div class='add'>+    if (rjstat == RPC_MISMATCH) {</div><div class='add'>+        /* No problem with hardcoding</div><div class='add'>+         * RPC version numbers. We only support</div><div class='add'>+         * v2 anyway.</div><div class='add'>+         */</div><div class='add'>+        reply-&gt;rjcted_rply.rj_vers.low = 2;</div><div class='add'>+        reply-&gt;rjcted_rply.rj_vers.high = 2;</div><div class='add'>+    } else if (rjstat == AUTH_ERROR)</div><div class='add'>+        reply-&gt;rjcted_rply.rj_why = auth_err;</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-rpc_fill_accepted_reply (struct rpc_msg *reply, int arstat, int proglow,</div><div class='del'>-                         int proghigh, int verf, int len, char *vdata)</div><div class='add'>+rpc_fill_accepted_reply(struct rpc_msg *reply, int arstat, int proglow,</div><div class='add'>+                        int proghigh, int verf, int len, char *vdata)</div><div class='ctx'> {</div><div class='del'>-        if (!reply)</div><div class='del'>-                return -1;</div><div class='del'>-</div><div class='del'>-        reply-&gt;rm_reply.rp_stat = MSG_ACCEPTED;</div><div class='del'>-        reply-&gt;acpted_rply.ar_stat = arstat;</div><div class='del'>-</div><div class='del'>-        reply-&gt;acpted_rply.ar_verf.oa_flavor = verf;</div><div class='del'>-        reply-&gt;acpted_rply.ar_verf.oa_length = len;</div><div class='del'>-        reply-&gt;acpted_rply.ar_verf.oa_base = vdata;</div><div class='del'>-        if (arstat == PROG_MISMATCH) {</div><div class='del'>-                reply-&gt;acpted_rply.ar_vers.low = proglow;</div><div class='del'>-                reply-&gt;acpted_rply.ar_vers.high = proghigh;</div><div class='del'>-        } else if (arstat == SUCCESS) {</div><div class='del'>-</div><div class='del'>-                /* This is a hack. I'd really like to build a custom</div><div class='del'>-                 * XDR library because Sun RPC interface is not very flexible.</div><div class='del'>-                 */</div><div class='del'>-                reply-&gt;acpted_rply.ar_results.proc = (xdrproc_t)true_func;</div><div class='del'>-                reply-&gt;acpted_rply.ar_results.where = NULL;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        return 0;</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    GF_VALIDATE_OR_GOTO("rpc", reply, out);</div><div class='add'>+</div><div class='add'>+    reply-&gt;rm_reply.rp_stat = MSG_ACCEPTED;</div><div class='add'>+    reply-&gt;acpted_rply.ar_stat = arstat;</div><div class='add'>+</div><div class='add'>+    reply-&gt;acpted_rply.ar_verf.oa_flavor = verf;</div><div class='add'>+    reply-&gt;acpted_rply.ar_verf.oa_length = len;</div><div class='add'>+    reply-&gt;acpted_rply.ar_verf.oa_base = vdata;</div><div class='add'>+    if (arstat == PROG_MISMATCH) {</div><div class='add'>+        reply-&gt;acpted_rply.ar_vers.low = proglow;</div><div class='add'>+        reply-&gt;acpted_rply.ar_vers.high = proghigh;</div><div class='add'>+    } else if (arstat == SUCCESS) {</div><div class='add'>+        /* This is a hack. I'd really like to build a custom</div><div class='add'>+         * XDR library because Sun RPC interface is not very flexible.</div><div class='add'>+         */</div><div class='add'>+        reply-&gt;acpted_rply.ar_results.proc = (xdrproc_t)true_func;</div><div class='add'>+        reply-&gt;acpted_rply.ar_results.where = NULL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-rpc_reply_to_xdr (struct rpc_msg *reply, char *dest, size_t len,</div><div class='del'>-                  struct iovec *dst)</div><div class='add'>+rpc_reply_to_xdr(struct rpc_msg *reply, char *dest, size_t len,</div><div class='add'>+                 struct iovec *dst)</div><div class='ctx'> {</div><div class='del'>-        XDR             xdr;</div><div class='add'>+    XDR xdr;</div><div class='add'>+    int ret = -1;</div><div class='ctx'> </div><div class='del'>-        if ((!dest) || (!reply) || (!dst))</div><div class='del'>-                return -1;</div><div class='add'>+    GF_VALIDATE_OR_GOTO("rpc", reply, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("rpc", dest, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("rpc", dst, out);</div><div class='ctx'> </div><div class='del'>-        xdrmem_create (&amp;xdr, dest, len, XDR_ENCODE);</div><div class='del'>-        if (!xdr_replymsg(&amp;xdr, reply))</div><div class='del'>-                return -1;</div><div class='add'>+    xdrmem_create(&amp;xdr, dest, len, XDR_ENCODE);</div><div class='add'>+    if (!xdr_replymsg(&amp;xdr, reply)) {</div><div class='add'>+        gf_log("rpc", GF_LOG_WARNING, "failed to encode reply msg");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        dst-&gt;iov_base = dest;</div><div class='del'>-        dst-&gt;iov_len = xdr_encoded_length (xdr);</div><div class='add'>+    dst-&gt;iov_base = dest;</div><div class='add'>+    dst-&gt;iov_len = xdr_encoded_length(xdr);</div><div class='ctx'> </div><div class='del'>-        return 0;</div><div class='add'>+    ret = 0;</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-xdr_to_auth_unix_cred (char *msgbuf, int msglen, struct authunix_parms *au,</div><div class='del'>-                       char *machname, gid_t *gids)</div><div class='add'>+xdr_to_auth_unix_cred(char *msgbuf, int msglen, struct authunix_parms *au,</div><div class='add'>+                      char *machname, gid_t *gids)</div><div class='ctx'> {</div><div class='del'>-        XDR             xdr;</div><div class='add'>+    XDR xdr;</div><div class='add'>+    int ret = -1;</div><div class='ctx'> </div><div class='del'>-        if ((!msgbuf) || (!machname) || (!gids) || (!au))</div><div class='del'>-                return -1;</div><div class='add'>+    GF_VALIDATE_OR_GOTO("rpc", msgbuf, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("rpc", machname, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("rpc", gids, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("rpc", au, out);</div><div class='ctx'> </div><div class='del'>-        au-&gt;aup_machname = machname;</div><div class='del'>-#ifdef GF_DARWIN_HOST_OS</div><div class='del'>-        au-&gt;aup_gids = (int *)gids;</div><div class='add'>+    au-&gt;aup_machname = machname;</div><div class='add'>+#if defined(GF_DARWIN_HOST_OS) || defined(__FreeBSD__)</div><div class='add'>+    au-&gt;aup_gids = (int *)gids;</div><div class='ctx'> #else</div><div class='del'>-        au-&gt;aup_gids = gids;</div><div class='add'>+    au-&gt;aup_gids = gids;</div><div class='ctx'> #endif</div><div class='ctx'> </div><div class='del'>-        xdrmem_create (&amp;xdr, msgbuf, msglen, XDR_DECODE);</div><div class='add'>+    xdrmem_create(&amp;xdr, msgbuf, msglen, XDR_DECODE);</div><div class='ctx'> </div><div class='del'>-        if (!xdr_authunix_parms (&amp;xdr, au))</div><div class='del'>-                return -1;</div><div class='add'>+    if (!xdr_authunix_parms(&amp;xdr, au)) {</div><div class='add'>+        gf_log("rpc", GF_LOG_WARNING, "failed to decode auth unix parms");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        return 0;</div><div class='add'>+    ret = 0;</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='head'>diff --git a/rpc/rpc-lib/src/xdr-rpc.h b/rpc/rpc-lib/src/xdr-rpc.h<br/>index d504391d5f0..7baed273846 100644<br/>--- a/<a href='/cgit/glusterfs.git/tree/rpc/rpc-lib/src/xdr-rpc.h?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>rpc/rpc-lib/src/xdr-rpc.h</a><br/>+++ b/<a href='/cgit/glusterfs.git/tree/rpc/rpc-lib/src/xdr-rpc.h?id=d1d7a6f35c816822fab51c820e25023863c239c1'>rpc/rpc-lib/src/xdr-rpc.h</a></div><div class='hunk'>@@ -1,30 +1,16 @@</div><div class='ctx'> /*</div><div class='del'>-  Copyright (c) 2010 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='add'>+  Copyright (c) 2008-2012 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='ctx'>   This file is part of GlusterFS.</div><div class='ctx'> </div><div class='del'>-  GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-  it under the terms of the GNU Affero General Public License as published</div><div class='del'>-  by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-  or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-  GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-  WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-  Affero General Public License for more details.</div><div class='del'>-</div><div class='del'>-  You should have received a copy of the GNU Affero General Public License</div><div class='del'>-  along with this program.  If not, see</div><div class='del'>-  &lt;http://www.gnu.org/licenses/&gt;.</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='ctx'> */</div><div class='ctx'> </div><div class='del'>-#ifndef _XDR_RPC_H</div><div class='add'>+#ifndef _XDR_RPC_H_</div><div class='ctx'> #define _XDR_RPC_H_</div><div class='ctx'> </div><div class='del'>-#ifndef _CONFIG_H</div><div class='del'>-#define _CONFIG_H</div><div class='del'>-#include "config.h"</div><div class='del'>-#endif</div><div class='del'>-</div><div class='ctx'> #ifndef GF_SOLARIS_HOST_OS</div><div class='ctx'> #include &lt;rpc/rpc.h&gt;</div><div class='ctx'> #endif</div><div class='hunk'>@@ -34,49 +20,76 @@</div><div class='ctx'> #include &lt;rpc/auth_sys.h&gt;</div><div class='ctx'> #endif</div><div class='ctx'> </div><div class='del'>-//#include &lt;rpc/pmap_clnt.h&gt;</div><div class='ctx'> #include &lt;arpa/inet.h&gt;</div><div class='ctx'> #include &lt;rpc/xdr.h&gt;</div><div class='ctx'> #include &lt;sys/uio.h&gt;</div><div class='ctx'> </div><div class='add'>+#include "xdr-common.h"</div><div class='add'>+</div><div class='add'>+typedef enum {</div><div class='add'>+    AUTH_GLUSTERFS = 5,</div><div class='add'>+    AUTH_GLUSTERFS_v2 = 390039, /* using a number from  'unused' range,</div><div class='add'>+                                   from the list available in RFC5531 */</div><div class='add'>+    AUTH_GLUSTERFS_v3 = 390040, /* this too is unused */</div><div class='add'>+} gf_rpc_authtype_t;</div><div class='add'>+</div><div class='ctx'> /* Converts a given network buffer from its XDR format to a structure</div><div class='ctx'>  * that contains everything an RPC call needs to work.</div><div class='ctx'>  */</div><div class='ctx'> extern int</div><div class='del'>-xdr_to_rpc_call (char *msgbuf, size_t len, struct rpc_msg *call,</div><div class='del'>-                 struct iovec *payload, char *credbytes, char *verfbytes);</div><div class='add'>+xdr_to_rpc_call(char *msgbuf, size_t len, struct rpc_msg *call,</div><div class='add'>+                struct iovec *payload, char *credbytes, char *verfbytes);</div><div class='ctx'> </div><div class='ctx'> extern int</div><div class='del'>-rpc_fill_empty_reply (struct rpc_msg *reply, uint32_t xid);</div><div class='add'>+rpc_fill_empty_reply(struct rpc_msg *reply, uint32_t xid);</div><div class='ctx'> </div><div class='ctx'> extern int</div><div class='del'>-rpc_fill_denied_reply (struct rpc_msg *reply, int rjstat, int auth_err);</div><div class='add'>+rpc_fill_denied_reply(struct rpc_msg *reply, int rjstat, int auth_err);</div><div class='ctx'> </div><div class='ctx'> extern int</div><div class='del'>-rpc_fill_accepted_reply (struct rpc_msg *reply, int arstat, int proglow,</div><div class='del'>-                         int proghigh, int verf, int len, char *vdata);</div><div class='add'>+rpc_fill_accepted_reply(struct rpc_msg *reply, int arstat, int proglow,</div><div class='add'>+                        int proghigh, int verf, int len, char *vdata);</div><div class='ctx'> extern int</div><div class='del'>-rpc_reply_to_xdr (struct rpc_msg *reply, char *dest, size_t len,</div><div class='del'>-                  struct iovec *dst);</div><div class='add'>+rpc_reply_to_xdr(struct rpc_msg *reply, char *dest, size_t len,</div><div class='add'>+                 struct iovec *dst);</div><div class='ctx'> </div><div class='ctx'> extern int</div><div class='del'>-xdr_to_auth_unix_cred (char *msgbuf, int msglen, struct authunix_parms *au,</div><div class='del'>-                       char *machname, gid_t *gids);</div><div class='del'>-/* Macros that simplify accesing the members of an RPC call structure. */</div><div class='del'>-#define rpc_call_xid(call)              ((call)-&gt;rm_xid)</div><div class='del'>-#define rpc_call_direction(call)        ((call)-&gt;rm_direction)</div><div class='del'>-#define rpc_call_rpcvers(call)          ((call)-&gt;ru.RM_cmb.cb_rpcvers)</div><div class='del'>-#define rpc_call_program(call)          ((call)-&gt;ru.RM_cmb.cb_prog)</div><div class='del'>-#define rpc_call_progver(call)          ((call)-&gt;ru.RM_cmb.cb_vers)</div><div class='del'>-#define rpc_call_progproc(call)         ((call)-&gt;ru.RM_cmb.cb_proc)</div><div class='del'>-#define rpc_opaque_auth_flavour(oa)     ((oa)-&gt;oa_flavor)</div><div class='del'>-#define rpc_opaque_auth_len(oa)         ((oa)-&gt;oa_length)</div><div class='del'>-</div><div class='del'>-#define rpc_call_cred_flavour(call)     (rpc_opaque_auth_flavour ((&amp;(call)-&gt;ru.RM_cmb.cb_cred)))</div><div class='del'>-#define rpc_call_cred_len(call)         (rpc_opaque_auth_len ((&amp;(call)-&gt;ru.RM_cmb.cb_cred)))</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-#define rpc_call_verf_flavour(call)     (rpc_opaque_auth_flavour ((&amp;(call)-&gt;ru.RM_cmb.cb_verf)))</div><div class='del'>-#define rpc_call_verf_len(call)         (rpc_opaque_auth_len ((&amp;(call)-&gt;ru.RM_cmb.cb_verf)))</div><div class='add'>+xdr_to_auth_unix_cred(char *msgbuf, int msglen, struct authunix_parms *au,</div><div class='add'>+                      char *machname, gid_t *gids);</div><div class='add'>+/* Macros that simplify accessing the members of an RPC call structure. */</div><div class='add'>+#define rpc_call_xid(call) ((call)-&gt;rm_xid)</div><div class='add'>+#define rpc_call_direction(call) ((call)-&gt;rm_direction)</div><div class='add'>+#define rpc_call_rpcvers(call) ((call)-&gt;ru.RM_cmb.cb_rpcvers)</div><div class='add'>+#define rpc_call_program(call) ((call)-&gt;ru.RM_cmb.cb_prog)</div><div class='add'>+#define rpc_call_progver(call) ((call)-&gt;ru.RM_cmb.cb_vers)</div><div class='add'>+#define rpc_call_progproc(call) ((call)-&gt;ru.RM_cmb.cb_proc)</div><div class='add'>+#define rpc_opaque_auth_flavour(oa) ((oa)-&gt;oa_flavor)</div><div class='add'>+#define rpc_opaque_auth_len(oa) ((oa)-&gt;oa_length)</div><div class='add'>+</div><div class='add'>+#define rpc_call_cred_flavour(call)                                            \</div><div class='add'>+    (rpc_opaque_auth_flavour((&amp;(call)-&gt;ru.RM_cmb.cb_cred)))</div><div class='add'>+#define rpc_call_cred_len(call)                                                \</div><div class='add'>+    (rpc_opaque_auth_len((&amp;(call)-&gt;ru.RM_cmb.cb_cred)))</div><div class='add'>+</div><div class='add'>+#define rpc_call_verf_flavour(call)                                            \</div><div class='add'>+    (rpc_opaque_auth_flavour((&amp;(call)-&gt;ru.RM_cmb.cb_verf)))</div><div class='add'>+#define rpc_call_verf_len(call)                                                \</div><div class='add'>+    (rpc_opaque_auth_len((&amp;(call)-&gt;ru.RM_cmb.cb_verf)))</div><div class='add'>+</div><div class='add'>+#if defined(GF_DARWIN_HOST_OS) || !defined(HAVE_RPC_RPC_H)</div><div class='add'>+#define GF_PRI_RPC_XID PRIu32</div><div class='add'>+#define GF_PRI_RPC_VERSION PRIu32</div><div class='add'>+#define GF_PRI_RPC_PROG_ID PRIu32</div><div class='add'>+#define GF_PRI_RPC_PROG_VERS PRIu32</div><div class='add'>+#define GF_PRI_RPC_PROC PRIu32</div><div class='add'>+#define GF_PRI_RPC_PROC_VERSION PRIu32</div><div class='add'>+#else</div><div class='add'>+#define GF_PRI_RPC_XID PRIu64</div><div class='add'>+#define GF_PRI_RPC_VERSION PRIu64</div><div class='add'>+#define GF_PRI_RPC_PROG_ID PRIu64</div><div class='add'>+#define GF_PRI_RPC_PROG_VERS PRIu64</div><div class='add'>+#define GF_PRI_RPC_PROC PRIu64</div><div class='add'>+#define GF_PRI_RPC_PROC_VERSION PRIu64</div><div class='add'>+#endif</div><div class='ctx'> </div><div class='ctx'> #endif</div><div class='head'>diff --git a/rpc/rpc-lib/src/xdr-rpcclnt.c b/rpc/rpc-lib/src/xdr-rpcclnt.c<br/>index 933887b0b19..8dcdcfeda83 100644<br/>--- a/<a href='/cgit/glusterfs.git/tree/rpc/rpc-lib/src/xdr-rpcclnt.c?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>rpc/rpc-lib/src/xdr-rpcclnt.c</a><br/>+++ b/<a href='/cgit/glusterfs.git/tree/rpc/rpc-lib/src/xdr-rpcclnt.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>rpc/rpc-lib/src/xdr-rpcclnt.c</a></div><div class='hunk'>@@ -1,131 +1,105 @@</div><div class='ctx'> /*</div><div class='del'>-  Copyright (c) 2010 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='add'>+  Copyright (c) 2008-2012 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='ctx'>   This file is part of GlusterFS.</div><div class='ctx'> </div><div class='del'>-  GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-  it under the terms of the GNU Affero General Public License as published</div><div class='del'>-  by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-  or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-  GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-  WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-  Affero General Public License for more details.</div><div class='del'>-</div><div class='del'>-  You should have received a copy of the GNU Affero General Public License</div><div class='del'>-  along with this program.  If not, see</div><div class='del'>-  &lt;http://www.gnu.org/licenses/&gt;.</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='ctx'> */</div><div class='ctx'> </div><div class='del'>-#ifndef _CONFIG_H</div><div class='del'>-#define _CONFIG_H</div><div class='del'>-#include "config.h"</div><div class='del'>-#endif</div><div class='del'>-</div><div class='ctx'> #include &lt;rpc/rpc.h&gt;</div><div class='del'>-#include &lt;rpc/pmap_clnt.h&gt;</div><div class='del'>-#include &lt;arpa/inet.h&gt;</div><div class='ctx'> #include &lt;rpc/xdr.h&gt;</div><div class='ctx'> #include &lt;sys/uio.h&gt;</div><div class='ctx'> #include &lt;rpc/auth_unix.h&gt;</div><div class='ctx'> #include &lt;errno.h&gt;</div><div class='ctx'> </div><div class='del'>-#include "mem-pool.h"</div><div class='ctx'> #include "xdr-rpc.h"</div><div class='ctx'> #include "xdr-common.h"</div><div class='del'>-#include "logging.h"</div><div class='add'>+#include &lt;glusterfs/common-utils.h&gt;</div><div class='ctx'> </div><div class='ctx'> /* Decodes the XDR format in msgbuf into rpc_msg.</div><div class='ctx'>  * The remaining payload is returned into payload.</div><div class='ctx'>  */</div><div class='ctx'> int</div><div class='del'>-xdr_to_rpc_reply (char *msgbuf, size_t len, struct rpc_msg *reply,</div><div class='del'>-                  struct iovec *payload, char *verfbytes)</div><div class='add'>+xdr_to_rpc_reply(char *msgbuf, size_t len, struct rpc_msg *reply,</div><div class='add'>+                 struct iovec *payload, char *verfbytes)</div><div class='ctx'> {</div><div class='del'>-        XDR                     xdr;</div><div class='del'>-        int                     ret = -1;</div><div class='del'>-</div><div class='del'>-        if ((!msgbuf) || (!reply)) {</div><div class='del'>-                ret = -EINVAL;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        memset (reply, 0, sizeof (struct rpc_msg));</div><div class='del'>-</div><div class='del'>-        reply-&gt;acpted_rply.ar_verf = _null_auth;</div><div class='del'>-        reply-&gt;acpted_rply.ar_results.where = NULL;</div><div class='del'>-        reply-&gt;acpted_rply.ar_results.proc = (xdrproc_t)(xdr_void);</div><div class='del'>-</div><div class='del'>-        xdrmem_create (&amp;xdr, msgbuf, len, XDR_DECODE);</div><div class='del'>-        if (!xdr_replymsg (&amp;xdr, reply)) {</div><div class='del'>-                ret = -errno;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-        if (payload) {</div><div class='del'>-                payload-&gt;iov_base = xdr_decoded_remaining_addr (xdr);</div><div class='del'>-                payload-&gt;iov_len = xdr_decoded_remaining_len (xdr);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        ret = 0;</div><div class='del'>-out:</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='add'>+    XDR xdr;</div><div class='add'>+    int ret = -EINVAL;</div><div class='ctx'> </div><div class='del'>-#if 0</div><div class='del'>-bool_t</div><div class='del'>-true_func (XDR *s, caddr_t *a)</div><div class='del'>-{</div><div class='del'>-        return TRUE;</div><div class='add'>+    GF_VALIDATE_OR_GOTO("rpc", msgbuf, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("rpc", reply, out);</div><div class='add'>+</div><div class='add'>+    memset(reply, 0, sizeof(struct rpc_msg));</div><div class='add'>+</div><div class='add'>+    reply-&gt;acpted_rply.ar_verf = _null_auth;</div><div class='add'>+    reply-&gt;acpted_rply.ar_results.where = NULL;</div><div class='add'>+    reply-&gt;acpted_rply.ar_results.proc = (xdrproc_t)(xdr_void);</div><div class='add'>+</div><div class='add'>+    xdrmem_create(&amp;xdr, msgbuf, len, XDR_DECODE);</div><div class='add'>+    if (!xdr_replymsg(&amp;xdr, reply)) {</div><div class='add'>+        gf_log("rpc", GF_LOG_WARNING, "failed to decode reply msg");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    if (payload) {</div><div class='add'>+        payload-&gt;iov_base = xdr_decoded_remaining_addr(xdr);</div><div class='add'>+        payload-&gt;iov_len = xdr_decoded_remaining_len(xdr);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='del'>-#endif</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-rpc_request_to_xdr (struct rpc_msg *request, char *dest, size_t len,</div><div class='del'>-                    struct iovec *dst)</div><div class='add'>+rpc_request_to_xdr(struct rpc_msg *request, char *dest, size_t len,</div><div class='add'>+                   struct iovec *dst)</div><div class='ctx'> {</div><div class='del'>-        XDR xdr;</div><div class='del'>-        int ret = -1;</div><div class='add'>+    XDR xdr;</div><div class='add'>+    int ret = -1;</div><div class='ctx'> </div><div class='del'>-        if ((!dest) || (!request) || (!dst)) {</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='add'>+    GF_VALIDATE_OR_GOTO("rpc", dest, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("rpc", request, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("rpc", dst, out);</div><div class='ctx'> </div><div class='del'>-        xdrmem_create (&amp;xdr, dest, len, XDR_ENCODE);</div><div class='del'>-        if (!xdr_callmsg (&amp;xdr, request)) {</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='add'>+    xdrmem_create(&amp;xdr, dest, len, XDR_ENCODE);</div><div class='add'>+    if (!xdr_callmsg(&amp;xdr, request)) {</div><div class='add'>+        gf_log("rpc", GF_LOG_WARNING, "failed to encode call msg");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        dst-&gt;iov_base = dest;</div><div class='del'>-        dst-&gt;iov_len = xdr_encoded_length (xdr);</div><div class='add'>+    dst-&gt;iov_base = dest;</div><div class='add'>+    dst-&gt;iov_len = xdr_encoded_length(xdr);</div><div class='ctx'> </div><div class='del'>-        ret = 0;</div><div class='add'>+    ret = 0;</div><div class='ctx'> </div><div class='ctx'> out:</div><div class='del'>-        return ret;</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-auth_unix_cred_to_xdr (struct authunix_parms *au, char *dest, size_t len,</div><div class='del'>-                       struct iovec *iov)</div><div class='add'>+auth_unix_cred_to_xdr(struct authunix_parms *au, char *dest, size_t len,</div><div class='add'>+                      struct iovec *iov)</div><div class='ctx'> {</div><div class='del'>-        XDR xdr;</div><div class='del'>-        int ret = -1;</div><div class='add'>+    XDR xdr;</div><div class='add'>+    int ret = -1;</div><div class='ctx'> </div><div class='del'>-        if (!au || !dest || !iov) {</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='add'>+    GF_VALIDATE_OR_GOTO("rpc", au, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("rpc", dest, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("rpc", iov, out);</div><div class='ctx'> </div><div class='del'>-        xdrmem_create (&amp;xdr, dest, len, XDR_DECODE);</div><div class='add'>+    xdrmem_create(&amp;xdr, dest, len, XDR_DECODE);</div><div class='ctx'> </div><div class='del'>-        if (!xdr_authunix_parms (&amp;xdr, au)) {</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='add'>+    if (!xdr_authunix_parms(&amp;xdr, au)) {</div><div class='add'>+        gf_log("rpc", GF_LOG_WARNING, "failed to decode authunix parms");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        iov-&gt;iov_base = dest;</div><div class='del'>-        iov-&gt;iov_len = xdr_encoded_length (xdr);</div><div class='add'>+    iov-&gt;iov_base = dest;</div><div class='add'>+    iov-&gt;iov_len = xdr_encoded_length(xdr);</div><div class='ctx'> </div><div class='del'>-        ret = 0;</div><div class='add'>+    ret = 0;</div><div class='ctx'> out:</div><div class='del'>-        return ret;</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='head'>diff --git a/rpc/rpc-lib/src/xdr-rpcclnt.h b/rpc/rpc-lib/src/xdr-rpcclnt.h<br/>index c0d925ee739..58eda4892a9 100644<br/>--- a/<a href='/cgit/glusterfs.git/tree/rpc/rpc-lib/src/xdr-rpcclnt.h?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>rpc/rpc-lib/src/xdr-rpcclnt.h</a><br/>+++ b/<a href='/cgit/glusterfs.git/tree/rpc/rpc-lib/src/xdr-rpcclnt.h?id=d1d7a6f35c816822fab51c820e25023863c239c1'>rpc/rpc-lib/src/xdr-rpcclnt.h</a></div><div class='hunk'>@@ -1,51 +1,36 @@</div><div class='ctx'> /*</div><div class='del'>-  Copyright (c) 2010 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='add'>+  Copyright (c) 2008-2012 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='ctx'>   This file is part of GlusterFS.</div><div class='ctx'> </div><div class='del'>-  GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-  it under the terms of the GNU Affero General Public License as published</div><div class='del'>-  by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-  or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-  GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-  WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-  Affero General Public License for more details.</div><div class='del'>-</div><div class='del'>-  You should have received a copy of the GNU Affero General Public License</div><div class='del'>-  along with this program.  If not, see</div><div class='del'>-  &lt;http://www.gnu.org/licenses/&gt;.</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='ctx'> */</div><div class='ctx'> </div><div class='ctx'> #ifndef _XDR_RPCCLNT_H</div><div class='ctx'> #define _XDR_RPCCLNT_H</div><div class='ctx'> </div><div class='del'>-#ifndef _CONFIG_H</div><div class='del'>-#define _CONFIG_H</div><div class='del'>-#include "config.h"</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-//#include &lt;rpc/rpc.h&gt;</div><div class='del'>-//#include &lt;rpc/pmap_clnt.h&gt;</div><div class='ctx'> #include &lt;arpa/inet.h&gt;</div><div class='ctx'> #include &lt;rpc/xdr.h&gt;</div><div class='ctx'> #include &lt;sys/uio.h&gt;</div><div class='ctx'> #include &lt;rpc/rpc_msg.h&gt;</div><div class='ctx'> #include &lt;rpc/auth_unix.h&gt;</div><div class='ctx'> </div><div class='del'>-/* Macros that simplify accesing the members of an RPC call structure. */</div><div class='del'>-#define rpc_reply_xid(reply)              ((reply)-&gt;rm_xid)</div><div class='del'>-#define rpc_reply_status(reply)           ((reply)-&gt;ru.RM_rmb.rp_stat)</div><div class='del'>-#define rpc_accepted_reply_status(reply)  ((reply)-&gt;acpted_rply.ar_stat)</div><div class='del'>-#define rpc_reply_verf_flavour(reply)     ((reply)-&gt;acpted_rply.ar_verf.oa_flavor)</div><div class='add'>+/* Macros that simplify accessing the members of an RPC call structure. */</div><div class='add'>+#define rpc_reply_xid(reply) ((reply)-&gt;rm_xid)</div><div class='add'>+#define rpc_reply_status(reply) ((reply)-&gt;ru.RM_rmb.rp_stat)</div><div class='add'>+#define rpc_accepted_reply_status(reply) ((reply)-&gt;acpted_rply.ar_stat)</div><div class='add'>+#define rpc_reply_verf_flavour(reply) ((reply)-&gt;acpted_rply.ar_verf.oa_flavor)</div><div class='ctx'> </div><div class='del'>-int xdr_to_rpc_reply (char *msgbuf, size_t len, struct rpc_msg *reply,</div><div class='del'>-                      struct iovec *payload, char *verfbytes);</div><div class='ctx'> int</div><div class='del'>-rpc_request_to_xdr (struct rpc_msg *request, char *dest, size_t len,</div><div class='del'>-                    struct iovec *dst);</div><div class='add'>+xdr_to_rpc_reply(char *msgbuf, size_t len, struct rpc_msg *reply,</div><div class='add'>+                 struct iovec *payload, char *verfbytes);</div><div class='add'>+int</div><div class='add'>+rpc_request_to_xdr(struct rpc_msg *request, char *dest, size_t len,</div><div class='add'>+                   struct iovec *dst);</div><div class='ctx'> int</div><div class='del'>-auth_unix_cred_to_xdr (struct authunix_parms *au, char *dest, size_t len,</div><div class='del'>-                       struct iovec *iov);</div><div class='add'>+auth_unix_cred_to_xdr(struct authunix_parms *au, char *dest, size_t len,</div><div class='add'>+                      struct iovec *iov);</div><div class='ctx'> </div><div class='ctx'> #endif</div><div class='head'>diff --git a/rpc/rpc-transport/Makefile.am b/rpc/rpc-transport/Makefile.am<br/>index 221fd640514..7dd9f026cfc 100644<br/>--- a/<a href='/cgit/glusterfs.git/tree/rpc/rpc-transport/Makefile.am?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>rpc/rpc-transport/Makefile.am</a><br/>+++ b/<a href='/cgit/glusterfs.git/tree/rpc/rpc-transport/Makefile.am?id=d1d7a6f35c816822fab51c820e25023863c239c1'>rpc/rpc-transport/Makefile.am</a></div><div class='hunk'>@@ -1 +1 @@</div><div class='del'>-SUBDIRS = socket $(RDMA_SUBDIR)</div><div class='add'>+SUBDIRS = socket</div><div class='head'>diff --git a/rpc/rpc-transport/rdma/src/Makefile.am b/rpc/rpc-transport/rdma/src/Makefile.am<br/>deleted file mode 100644<br/>index bc888b1750c..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/rpc/rpc-transport/rdma/src/Makefile.am?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>rpc/rpc-transport/rdma/src/Makefile.am</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,20 +0,0 @@</div><div class='del'>-# TODO : need to change transportdir</div><div class='del'>-</div><div class='del'>-transport_LTLIBRARIES = rdma.la</div><div class='del'>-transportdir = $(libdir)/glusterfs/$(PACKAGE_VERSION)/rpc-transport</div><div class='del'>-</div><div class='del'>-rdma_la_LDFLAGS = -module -avoidversion</div><div class='del'>-</div><div class='del'>-rdma_la_SOURCES = rdma.c name.c</div><div class='del'>-rdma_la_LIBADD = $(top_builddir)/libglusterfs/src/libglusterfs.la     \</div><div class='del'>-	-libverbs</div><div class='del'>-</div><div class='del'>-noinst_HEADERS = rdma.h name.h</div><div class='del'>-	-I$(top_srcdir)/libglusterfs/src -I$(top_srcdir)/rpc/rpc-lib/src/ \</div><div class='del'>-	-I$(top_srcdir)/xlators/protocol/lib/src/ -shared -nostartfiles $(GF_CFLAGS)</div><div class='del'>-</div><div class='del'>-AM_CFLAGS = -fPIC -D_FILE_OFFSET_BITS=64 -D_GNU_SOURCE -Wall -D$(GF_HOST_OS)  \</div><div class='del'>-	-I$(top_srcdir)/libglusterfs/src -I$(top_srcdir)/rpc/rpc-lib/src/ \</div><div class='del'>-	-I$(top_srcdir)/xlators/protocol/lib/src -shared -nostartfiles $(GF_CFLAGS)</div><div class='del'>-</div><div class='del'>-CLEANFILES = *~</div><div class='head'>diff --git a/rpc/rpc-transport/rdma/src/name.c b/rpc/rpc-transport/rdma/src/name.c<br/>deleted file mode 100644<br/>index 68cf578fa66..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/rpc/rpc-transport/rdma/src/name.c?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>rpc/rpc-transport/rdma/src/name.c</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,717 +0,0 @@</div><div class='del'>-/*</div><div class='del'>-  Copyright (c) 2008-2009 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='del'>-  This file is part of GlusterFS.</div><div class='del'>-</div><div class='del'>-  GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-  it under the terms of the GNU General Public License as published</div><div class='del'>-  by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-  or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-  GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-  WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-  General Public License for more details.</div><div class='del'>-</div><div class='del'>-  You should have received a copy of the GNU General Public License</div><div class='del'>-  along with this program.  If not, see</div><div class='del'>-  &lt;http://www.gnu.org/licenses/&gt;.</div><div class='del'>-*/</div><div class='del'>-</div><div class='del'>-#include &lt;sys/types.h&gt;</div><div class='del'>-#include &lt;sys/socket.h&gt;</div><div class='del'>-#include &lt;errno.h&gt;</div><div class='del'>-#include &lt;netdb.h&gt;</div><div class='del'>-#include &lt;string.h&gt;</div><div class='del'>-</div><div class='del'>-#ifdef CLIENT_PORT_CEILING</div><div class='del'>-#undef CLIENT_PORT_CEILING</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-#define CLIENT_PORT_CEILING 1024</div><div class='del'>-</div><div class='del'>-#ifndef AF_INET_SDP</div><div class='del'>-#define AF_INET_SDP 27</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-#include "rpc-transport.h"</div><div class='del'>-#include "rdma.h"</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-gf_resolve_ip6 (const char *hostname, </div><div class='del'>-                uint16_t port, </div><div class='del'>-                int family, </div><div class='del'>-                void **dnscache, </div><div class='del'>-                struct addrinfo **addr_info);</div><div class='del'>-</div><div class='del'>-static int32_t</div><div class='del'>-af_inet_bind_to_port_lt_ceiling (int fd, struct sockaddr *sockaddr, </div><div class='del'>-                                 socklen_t sockaddr_len, int ceiling)</div><div class='del'>-{</div><div class='del'>-        int32_t ret = -1;</div><div class='del'>-        /*  struct sockaddr_in sin = {0, }; */</div><div class='del'>-        uint16_t port = ceiling - 1;</div><div class='del'>-</div><div class='del'>-        while (port)</div><div class='del'>-        {</div><div class='del'>-                switch (sockaddr-&gt;sa_family)</div><div class='del'>-                {</div><div class='del'>-                case AF_INET6:</div><div class='del'>-                        ((struct sockaddr_in6 *)sockaddr)-&gt;sin6_port = htons (port);</div><div class='del'>-                        break;</div><div class='del'>-</div><div class='del'>-                case AF_INET_SDP:</div><div class='del'>-                case AF_INET:</div><div class='del'>-                        ((struct sockaddr_in *)sockaddr)-&gt;sin_port = htons (port);</div><div class='del'>-                        break;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                ret = bind (fd, sockaddr, sockaddr_len);</div><div class='del'>-</div><div class='del'>-                if (ret == 0)</div><div class='del'>-                        break;</div><div class='del'>-</div><div class='del'>-                if (ret == -1 &amp;&amp; errno == EACCES)</div><div class='del'>-                        break;</div><div class='del'>-</div><div class='del'>-                port--;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-static int32_t</div><div class='del'>-af_unix_client_bind (rpc_transport_t *this, </div><div class='del'>-                     struct sockaddr *sockaddr, </div><div class='del'>-                     socklen_t sockaddr_len, </div><div class='del'>-                     int sock)</div><div class='del'>-{</div><div class='del'>-        data_t *path_data = NULL;</div><div class='del'>-        struct sockaddr_un *addr = NULL;</div><div class='del'>-        int32_t ret = -1;</div><div class='del'>-</div><div class='del'>-        path_data = dict_get (this-&gt;options, </div><div class='del'>-                              "transport.rdma.bind-path");</div><div class='del'>-        if (path_data) {</div><div class='del'>-                char *path = data_to_str (path_data);</div><div class='del'>-                if (!path || strlen (path) &gt; UNIX_PATH_MAX) {</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-                                "transport.rdma.bind-path not specfied "</div><div class='del'>-                                "for unix socket, letting connect to assign "</div><div class='del'>-                                "default value");</div><div class='del'>-                        goto err;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                addr = (struct sockaddr_un *) sockaddr;</div><div class='del'>-                strcpy (addr-&gt;sun_path, path);</div><div class='del'>-                ret = bind (sock, (struct sockaddr *)addr, sockaddr_len);</div><div class='del'>-                if (ret == -1) {</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-                                "cannot bind to unix-domain socket %d (%s)", </div><div class='del'>-                                sock, strerror (errno));</div><div class='del'>-                        goto err;</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-err:</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-static int32_t</div><div class='del'>-client_fill_address_family (rpc_transport_t *this, struct sockaddr *sockaddr)</div><div class='del'>-{</div><div class='del'>-        data_t *address_family_data = NULL;</div><div class='del'>-</div><div class='del'>-        address_family_data = dict_get (this-&gt;options, </div><div class='del'>-                                        "transport.address-family");</div><div class='del'>-        if (!address_family_data) {</div><div class='del'>-                data_t *remote_host_data = NULL, *connect_path_data = NULL;</div><div class='del'>-                remote_host_data = dict_get (this-&gt;options, "remote-host");</div><div class='del'>-                connect_path_data = dict_get (this-&gt;options, </div><div class='del'>-                                              "transport.rdma.connect-path");</div><div class='del'>-</div><div class='del'>-                if (!(remote_host_data || connect_path_data) || </div><div class='del'>-                    (remote_host_data &amp;&amp; connect_path_data)) {</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-                                "address-family not specified and not able to "</div><div class='del'>-                                "determine the same from other options "</div><div class='del'>-                                "(remote-host:%s and connect-path:%s)", </div><div class='del'>-                                data_to_str (remote_host_data), </div><div class='del'>-                                data_to_str (connect_path_data));</div><div class='del'>-                        return -1;</div><div class='del'>-                } </div><div class='del'>-</div><div class='del'>-                if (remote_host_data) {</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-                                "address-family not specified, guessing it "</div><div class='del'>-                                "to be inet/inet6");</div><div class='del'>-                        sockaddr-&gt;sa_family = AF_UNSPEC;</div><div class='del'>-                } else {</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-                                "address-family not specified, guessing it "</div><div class='del'>-                                "to be unix");</div><div class='del'>-                        sockaddr-&gt;sa_family = AF_UNIX;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-        } else {</div><div class='del'>-                char *address_family = data_to_str (address_family_data);</div><div class='del'>-                if (!strcasecmp (address_family, "unix")) {</div><div class='del'>-                        sockaddr-&gt;sa_family = AF_UNIX;</div><div class='del'>-                } else if (!strcasecmp (address_family, "inet")) {</div><div class='del'>-                        sockaddr-&gt;sa_family = AF_INET;</div><div class='del'>-                } else if (!strcasecmp (address_family, "inet6")) {</div><div class='del'>-                        sockaddr-&gt;sa_family = AF_INET6;</div><div class='del'>-                } else if (!strcasecmp (address_family, "inet-sdp")) {</div><div class='del'>-                        sockaddr-&gt;sa_family = AF_INET_SDP;</div><div class='del'>-                } else if (!strcasecmp (address_family, "inet/inet6")</div><div class='del'>-                           || !strcasecmp (address_family, "inet6/inet")) {</div><div class='del'>-                        sockaddr-&gt;sa_family = AF_UNSPEC;</div><div class='del'>-                } else {</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-                                "unknown address-family (%s) specified", </div><div class='del'>-                                address_family);</div><div class='del'>-                        return -1;</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-static int32_t</div><div class='del'>-af_inet_client_get_remote_sockaddr (rpc_transport_t *this, </div><div class='del'>-                                    struct sockaddr *sockaddr, </div><div class='del'>-                                    socklen_t *sockaddr_len,</div><div class='del'>-                                    int16_t remote_port)</div><div class='del'>-{</div><div class='del'>-        dict_t *options = this-&gt;options;</div><div class='del'>-        data_t *remote_host_data = NULL;</div><div class='del'>-        data_t *remote_port_data = NULL;</div><div class='del'>-        char *remote_host = NULL;</div><div class='del'>-        struct addrinfo *addr_info = NULL;</div><div class='del'>-        int32_t ret = 0;</div><div class='del'>-</div><div class='del'>-        remote_host_data = dict_get (options, "remote-host");</div><div class='del'>-        if (remote_host_data == NULL)</div><div class='del'>-        {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-                        "option remote-host missing in volume %s", </div><div class='del'>-                        this-&gt;name);</div><div class='del'>-                ret = -1;</div><div class='del'>-                goto err;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        remote_host = data_to_str (remote_host_data);</div><div class='del'>-        if (remote_host == NULL)</div><div class='del'>-        {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-                        "option remote-host has data NULL in volume %s", </div><div class='del'>-                        this-&gt;name);</div><div class='del'>-                ret = -1;</div><div class='del'>-                goto err;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (remote_port == 0) {</div><div class='del'>-                remote_port_data = dict_get (options, "remote-port");</div><div class='del'>-                if (remote_port_data == NULL)</div><div class='del'>-                {</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-                                "option remote-port missing in volume %s. "</div><div class='del'>-                                "Defaulting to %d",</div><div class='del'>-                                this-&gt;name, GF_DEFAULT_RDMA_LISTEN_PORT);</div><div class='del'>-</div><div class='del'>-                        remote_port = GF_DEFAULT_RDMA_LISTEN_PORT;</div><div class='del'>-                }</div><div class='del'>-                else</div><div class='del'>-                {</div><div class='del'>-                        remote_port = data_to_uint16 (remote_port_data);</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (remote_port == -1)</div><div class='del'>-        {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-                        "option remote-port has invalid port in volume %s",</div><div class='del'>-                        this-&gt;name);</div><div class='del'>-                ret = -1;</div><div class='del'>-                goto err;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        /* TODO: gf_resolve is a blocking call. kick in some</div><div class='del'>-           non blocking dns techniques */</div><div class='del'>-        ret = gf_resolve_ip6 (remote_host, remote_port,</div><div class='del'>-                              sockaddr-&gt;sa_family, </div><div class='del'>-                              &amp;this-&gt;dnscache, &amp;addr_info);</div><div class='del'>-        if (ret == -1) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-                        "DNS resolution failed on host %s", remote_host);</div><div class='del'>-                goto err;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        memcpy (sockaddr, addr_info-&gt;ai_addr, addr_info-&gt;ai_addrlen);</div><div class='del'>-        *sockaddr_len = addr_info-&gt;ai_addrlen;</div><div class='del'>-</div><div class='del'>-err:</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-static int32_t</div><div class='del'>-af_unix_client_get_remote_sockaddr (rpc_transport_t *this, </div><div class='del'>-                                    struct sockaddr *sockaddr, </div><div class='del'>-                                    socklen_t *sockaddr_len)</div><div class='del'>-{</div><div class='del'>-        struct sockaddr_un *sockaddr_un = NULL;</div><div class='del'>-        char *connect_path = NULL;</div><div class='del'>-        data_t *connect_path_data = NULL;</div><div class='del'>-        int32_t ret = 0;</div><div class='del'>-</div><div class='del'>-        connect_path_data = dict_get (this-&gt;options, </div><div class='del'>-                                      "transport.rdma.connect-path");</div><div class='del'>-        if (!connect_path_data) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-                        "option transport.rdma.connect-path not "</div><div class='del'>-                        "specified for address-family unix");</div><div class='del'>-                ret = -1;</div><div class='del'>-                goto err;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        connect_path = data_to_str (connect_path_data);</div><div class='del'>-        if (!connect_path) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-                        "connect-path is null-string");</div><div class='del'>-                ret = -1;</div><div class='del'>-                goto err;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (strlen (connect_path) &gt; UNIX_PATH_MAX) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-                        "connect-path value length %"GF_PRI_SIZET" &gt; "</div><div class='del'>-                        "%d octets", strlen (connect_path), UNIX_PATH_MAX);</div><div class='del'>-                ret = -1;</div><div class='del'>-                goto err;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        gf_log (this-&gt;name,</div><div class='del'>-                GF_LOG_DEBUG,</div><div class='del'>-                "using connect-path %s", connect_path);</div><div class='del'>-        sockaddr_un = (struct sockaddr_un *)sockaddr;</div><div class='del'>-        strcpy (sockaddr_un-&gt;sun_path, connect_path);</div><div class='del'>-        *sockaddr_len = sizeof (struct sockaddr_un);</div><div class='del'>-</div><div class='del'>-err:</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-static int32_t</div><div class='del'>-af_unix_server_get_local_sockaddr (rpc_transport_t *this,</div><div class='del'>-                                   struct sockaddr *addr,</div><div class='del'>-                                   socklen_t *addr_len)</div><div class='del'>-{</div><div class='del'>-        data_t *listen_path_data = NULL;</div><div class='del'>-        char *listen_path = NULL;</div><div class='del'>-        int32_t ret = 0;</div><div class='del'>-        struct sockaddr_un *sunaddr = (struct sockaddr_un *)addr;</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-        listen_path_data = dict_get (this-&gt;options, </div><div class='del'>-                                     "transport.rdma.listen-path");</div><div class='del'>-        if (!listen_path_data) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-                        "missing option listen-path");</div><div class='del'>-                ret = -1;</div><div class='del'>-                goto err;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        listen_path = data_to_str (listen_path_data);</div><div class='del'>-</div><div class='del'>-#ifndef UNIX_PATH_MAX</div><div class='del'>-#define UNIX_PATH_MAX 108</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-        if (strlen (listen_path) &gt; UNIX_PATH_MAX) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-                        "option listen-path has value length %"GF_PRI_SIZET" &gt; %d",</div><div class='del'>-                        strlen (listen_path), UNIX_PATH_MAX);</div><div class='del'>-                ret = -1;</div><div class='del'>-                goto err;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        sunaddr-&gt;sun_family = AF_UNIX;</div><div class='del'>-        strcpy (sunaddr-&gt;sun_path, listen_path);</div><div class='del'>-        *addr_len = sizeof (struct sockaddr_un);</div><div class='del'>-</div><div class='del'>-err:</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-static int32_t </div><div class='del'>-af_inet_server_get_local_sockaddr (rpc_transport_t *this, </div><div class='del'>-                                   struct sockaddr *addr, </div><div class='del'>-                                   socklen_t *addr_len)</div><div class='del'>-{</div><div class='del'>-        struct addrinfo hints, *res = 0;</div><div class='del'>-        data_t *listen_port_data = NULL, *listen_host_data = NULL;</div><div class='del'>-        uint16_t listen_port = -1;</div><div class='del'>-        char service[NI_MAXSERV], *listen_host = NULL;</div><div class='del'>-        dict_t *options = NULL;</div><div class='del'>-        int32_t ret = 0;</div><div class='del'>-</div><div class='del'>-        options = this-&gt;options;</div><div class='del'>-</div><div class='del'>-        listen_port_data = dict_get (options, "transport.rdma.listen-port");</div><div class='del'>-        listen_host_data = dict_get (options,</div><div class='del'>-                                     "transport.rdma.bind-address");</div><div class='del'>-</div><div class='del'>-        if (listen_port_data)</div><div class='del'>-        {</div><div class='del'>-                listen_port = data_to_uint16 (listen_port_data);</div><div class='del'>-        } else {</div><div class='del'>-		if (addr-&gt;sa_family == AF_INET6) {</div><div class='del'>-			struct sockaddr_in6 *in = (struct sockaddr_in6 *) addr;</div><div class='del'>-			in-&gt;sin6_addr = in6addr_any;</div><div class='del'>-			in-&gt;sin6_port = htons(listen_port);</div><div class='del'>-			*addr_len = sizeof(struct sockaddr_in6);</div><div class='del'>-                        goto out;</div><div class='del'>-		} else if (addr-&gt;sa_family == AF_INET) {</div><div class='del'>-			struct sockaddr_in *in = (struct sockaddr_in *) addr;</div><div class='del'>-			in-&gt;sin_addr.s_addr = htonl(INADDR_ANY);</div><div class='del'>-			in-&gt;sin_port = htons(listen_port);</div><div class='del'>-			*addr_len = sizeof(struct sockaddr_in);</div><div class='del'>-                        goto out;</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-        if (listen_port == (uint16_t) -1)</div><div class='del'>-                listen_port = GF_DEFAULT_RDMA_LISTEN_PORT;</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-        if (listen_host_data)</div><div class='del'>-        {</div><div class='del'>-                listen_host = data_to_str (listen_host_data);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        memset (service, 0, sizeof (service));</div><div class='del'>-        sprintf (service, "%d", listen_port);</div><div class='del'>-</div><div class='del'>-        memset (&amp;hints, 0, sizeof (hints));</div><div class='del'>-        hints.ai_family = addr-&gt;sa_family;</div><div class='del'>-        hints.ai_socktype = SOCK_STREAM;</div><div class='del'>-        hints.ai_flags    = AI_ADDRCONFIG | AI_PASSIVE;</div><div class='del'>-</div><div class='del'>-        ret = getaddrinfo(listen_host, service, &amp;hints, &amp;res);</div><div class='del'>-        if (ret != 0) {</div><div class='del'>-                gf_log (this-&gt;name,</div><div class='del'>-                        GF_LOG_ERROR,</div><div class='del'>-                        "getaddrinfo failed for host %s, service %s (%s)", </div><div class='del'>-                        listen_host, service, gai_strerror (ret));</div><div class='del'>-                ret = -1;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        memcpy (addr, res-&gt;ai_addr, res-&gt;ai_addrlen);</div><div class='del'>-        *addr_len = res-&gt;ai_addrlen;</div><div class='del'>-</div><div class='del'>-        freeaddrinfo (res);</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-gf_rdma_client_bind (rpc_transport_t *this,</div><div class='del'>-                        struct sockaddr *sockaddr,</div><div class='del'>-                        socklen_t *sockaddr_len,</div><div class='del'>-                        int sock)</div><div class='del'>-{</div><div class='del'>-        int ret = 0;</div><div class='del'>-</div><div class='del'>-        *sockaddr_len = sizeof (struct sockaddr_in6);</div><div class='del'>-        switch (sockaddr-&gt;sa_family)</div><div class='del'>-        {</div><div class='del'>-        case AF_INET_SDP:</div><div class='del'>-        case AF_INET:</div><div class='del'>-                *sockaddr_len = sizeof (struct sockaddr_in);</div><div class='del'>-</div><div class='del'>-        case AF_INET6:</div><div class='del'>-                ret = af_inet_bind_to_port_lt_ceiling (sock, sockaddr, </div><div class='del'>-                                                       *sockaddr_len, </div><div class='del'>-                                                       CLIENT_PORT_CEILING);</div><div class='del'>-                if (ret == -1) {</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_WARNING,</div><div class='del'>-                                "cannot bind inet socket (%d) to port "</div><div class='del'>-                                "less than %d (%s)", </div><div class='del'>-                                sock, CLIENT_PORT_CEILING, strerror (errno));</div><div class='del'>-                        ret = 0;</div><div class='del'>-                }</div><div class='del'>-                break;</div><div class='del'>-</div><div class='del'>-        case AF_UNIX:</div><div class='del'>-                *sockaddr_len = sizeof (struct sockaddr_un);</div><div class='del'>-                ret = af_unix_client_bind (this, (struct sockaddr *)sockaddr, </div><div class='del'>-                                           *sockaddr_len, sock);</div><div class='del'>-                break;</div><div class='del'>-</div><div class='del'>-        default:</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-                        "unknown address family %d", sockaddr-&gt;sa_family);</div><div class='del'>-                ret = -1;</div><div class='del'>-                break;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-gf_rdma_client_get_remote_sockaddr (rpc_transport_t *this,</div><div class='del'>-                                    struct sockaddr *sockaddr,</div><div class='del'>-                                    socklen_t *sockaddr_len,</div><div class='del'>-                                    int16_t remote_port)</div><div class='del'>-{</div><div class='del'>-        int32_t ret = 0;</div><div class='del'>-        char is_inet_sdp = 0;</div><div class='del'>-</div><div class='del'>-        ret = client_fill_address_family (this, sockaddr);</div><div class='del'>-        if (ret) {</div><div class='del'>-                ret = -1;</div><div class='del'>-                goto err;</div><div class='del'>-        }</div><div class='del'>- </div><div class='del'>-        switch (sockaddr-&gt;sa_family)</div><div class='del'>-        {</div><div class='del'>-        case AF_INET_SDP:</div><div class='del'>-                sockaddr-&gt;sa_family = AF_INET;</div><div class='del'>-                is_inet_sdp = 1;</div><div class='del'>-</div><div class='del'>-        case AF_INET:</div><div class='del'>-        case AF_INET6:</div><div class='del'>-        case AF_UNSPEC:</div><div class='del'>-                ret = af_inet_client_get_remote_sockaddr (this, </div><div class='del'>-                                                          sockaddr,</div><div class='del'>-                                                          sockaddr_len,</div><div class='del'>-                                                          remote_port);</div><div class='del'>-</div><div class='del'>-                if (is_inet_sdp) {</div><div class='del'>-                        sockaddr-&gt;sa_family = AF_INET_SDP;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                break;</div><div class='del'>-</div><div class='del'>-        case AF_UNIX:</div><div class='del'>-                ret = af_unix_client_get_remote_sockaddr (this, </div><div class='del'>-                                                          sockaddr, </div><div class='del'>-                                                          sockaddr_len);</div><div class='del'>-                break;</div><div class='del'>-</div><div class='del'>-        default:</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-                        "unknown address-family %d", sockaddr-&gt;sa_family);</div><div class='del'>-                ret = -1;</div><div class='del'>-        }</div><div class='del'>-  </div><div class='del'>-err:</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-gf_rdma_server_get_local_sockaddr (rpc_transport_t *this,</div><div class='del'>-                                      struct sockaddr *addr,</div><div class='del'>-                                      socklen_t *addr_len)</div><div class='del'>-{</div><div class='del'>-        data_t *address_family_data = NULL;</div><div class='del'>-        int32_t ret = 0;</div><div class='del'>-        char is_inet_sdp = 0;</div><div class='del'>-</div><div class='del'>-        address_family_data = dict_get (this-&gt;options, </div><div class='del'>-                                        "transport.address-family");</div><div class='del'>-        if (address_family_data) {</div><div class='del'>-                char *address_family = NULL;</div><div class='del'>-                address_family = data_to_str (address_family_data);</div><div class='del'>-</div><div class='del'>-                if (!strcasecmp (address_family, "inet")) {</div><div class='del'>-                        addr-&gt;sa_family = AF_INET;</div><div class='del'>-                } else if (!strcasecmp (address_family, "inet6")) {</div><div class='del'>-                        addr-&gt;sa_family = AF_INET6;</div><div class='del'>-                } else if (!strcasecmp (address_family, "inet-sdp")) {</div><div class='del'>-                        addr-&gt;sa_family = AF_INET_SDP;</div><div class='del'>-                } else if (!strcasecmp (address_family, "unix")) {</div><div class='del'>-                        addr-&gt;sa_family = AF_UNIX;</div><div class='del'>-                } else if (!strcasecmp (address_family, "inet/inet6")</div><div class='del'>-                           || !strcasecmp (address_family, "inet6/inet")) {</div><div class='del'>-                        addr-&gt;sa_family = AF_UNSPEC;</div><div class='del'>-                } else {</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-                                "unknown address family (%s) specified", </div><div class='del'>-                                address_family);</div><div class='del'>-                        ret = -1;</div><div class='del'>-                        goto err;</div><div class='del'>-                }</div><div class='del'>-        } else {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-                        "option address-family not specified, defaulting "</div><div class='del'>-                        "to inet/inet6");</div><div class='del'>-                addr-&gt;sa_family = AF_UNSPEC;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        switch (addr-&gt;sa_family)</div><div class='del'>-        {</div><div class='del'>-        case AF_INET_SDP:</div><div class='del'>-                is_inet_sdp = 1;</div><div class='del'>-                addr-&gt;sa_family = AF_INET;</div><div class='del'>-</div><div class='del'>-        case AF_INET:</div><div class='del'>-        case AF_INET6:</div><div class='del'>-        case AF_UNSPEC:</div><div class='del'>-                ret = af_inet_server_get_local_sockaddr (this, addr, addr_len);</div><div class='del'>-                if (is_inet_sdp &amp;&amp; !ret) {</div><div class='del'>-                        addr-&gt;sa_family = AF_INET_SDP;</div><div class='del'>-                }</div><div class='del'>-                break;</div><div class='del'>-</div><div class='del'>-        case AF_UNIX:</div><div class='del'>-                ret = af_unix_server_get_local_sockaddr (this, addr, addr_len);</div><div class='del'>-                break;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-err:</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t </div><div class='del'>-fill_inet6_inet_identifiers (rpc_transport_t *this, struct sockaddr_storage *addr, </div><div class='del'>-                             int32_t addr_len, char *identifier)</div><div class='del'>-{</div><div class='del'>-        int32_t ret = 0, tmpaddr_len = 0;</div><div class='del'>-        char service[NI_MAXSERV], host[NI_MAXHOST];</div><div class='del'>-        struct sockaddr_storage tmpaddr;</div><div class='del'>-</div><div class='del'>-        memset (&amp;tmpaddr, 0, sizeof (tmpaddr));</div><div class='del'>-        tmpaddr = *addr;</div><div class='del'>-        tmpaddr_len = addr_len;</div><div class='del'>-</div><div class='del'>-        if (((struct sockaddr *) &amp;tmpaddr)-&gt;sa_family == AF_INET6) {</div><div class='del'>-                int32_t one_to_four, four_to_eight, twelve_to_sixteen;</div><div class='del'>-                int16_t eight_to_ten, ten_to_twelve;</div><div class='del'>-    </div><div class='del'>-                one_to_four = four_to_eight = twelve_to_sixteen = 0;</div><div class='del'>-                eight_to_ten = ten_to_twelve = 0;</div><div class='del'>-    </div><div class='del'>-                one_to_four = ((struct sockaddr_in6 *) </div><div class='del'>-                               &amp;tmpaddr)-&gt;sin6_addr.s6_addr32[0];</div><div class='del'>-                four_to_eight = ((struct sockaddr_in6 *) </div><div class='del'>-                                 &amp;tmpaddr)-&gt;sin6_addr.s6_addr32[1];</div><div class='del'>-#ifdef GF_SOLARIS_HOST_OS</div><div class='del'>-                eight_to_ten = S6_ADDR16(((struct sockaddr_in6 *) </div><div class='del'>-                                          &amp;tmpaddr)-&gt;sin6_addr)[4];</div><div class='del'>-#else</div><div class='del'>-                eight_to_ten = ((struct sockaddr_in6 *) </div><div class='del'>-                                &amp;tmpaddr)-&gt;sin6_addr.s6_addr16[4];</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-#ifdef GF_SOLARIS_HOST_OS</div><div class='del'>-                ten_to_twelve = S6_ADDR16(((struct sockaddr_in6 *) </div><div class='del'>-                                           &amp;tmpaddr)-&gt;sin6_addr)[5];</div><div class='del'>-#else</div><div class='del'>-                ten_to_twelve = ((struct sockaddr_in6 *) </div><div class='del'>-                                 &amp;tmpaddr)-&gt;sin6_addr.s6_addr16[5];</div><div class='del'>-#endif</div><div class='del'>-                twelve_to_sixteen = ((struct sockaddr_in6 *) </div><div class='del'>-                                     &amp;tmpaddr)-&gt;sin6_addr.s6_addr32[3];</div><div class='del'>-</div><div class='del'>-                /* ipv4 mapped ipv6 address has</div><div class='del'>-                   bits 0-80: 0</div><div class='del'>-                   bits 80-96: 0xffff</div><div class='del'>-                   bits 96-128: ipv4 address </div><div class='del'>-                */</div><div class='del'>- </div><div class='del'>-                if (one_to_four == 0 &amp;&amp;</div><div class='del'>-                    four_to_eight == 0 &amp;&amp;</div><div class='del'>-                    eight_to_ten == 0 &amp;&amp;</div><div class='del'>-                    ten_to_twelve == -1) {</div><div class='del'>-                        struct sockaddr_in *in_ptr = (struct sockaddr_in *)&amp;tmpaddr;</div><div class='del'>-                        memset (&amp;tmpaddr, 0, sizeof (tmpaddr));</div><div class='del'>-      </div><div class='del'>-                        in_ptr-&gt;sin_family = AF_INET;</div><div class='del'>-                        in_ptr-&gt;sin_port = ((struct sockaddr_in6 *)addr)-&gt;sin6_port;</div><div class='del'>-                        in_ptr-&gt;sin_addr.s_addr = twelve_to_sixteen;</div><div class='del'>-                        tmpaddr_len = sizeof (*in_ptr);</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        ret = getnameinfo ((struct sockaddr *) &amp;tmpaddr,</div><div class='del'>-                           tmpaddr_len,</div><div class='del'>-                           host, sizeof (host),</div><div class='del'>-                           service, sizeof (service),</div><div class='del'>-                           NI_NUMERICHOST | NI_NUMERICSERV);</div><div class='del'>-        if (ret != 0) {</div><div class='del'>-                gf_log (this-&gt;name,</div><div class='del'>-                        GF_LOG_ERROR,</div><div class='del'>-                        "getnameinfo failed (%s)", gai_strerror (ret));</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        sprintf (identifier, "%s:%s", host, service);</div><div class='del'>-</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-gf_rdma_get_transport_identifiers (rpc_transport_t *this)</div><div class='del'>-{</div><div class='del'>-        int32_t ret = 0;</div><div class='del'>-        char is_inet_sdp = 0;</div><div class='del'>-</div><div class='del'>-        switch (((struct sockaddr *) &amp;this-&gt;myinfo.sockaddr)-&gt;sa_family)</div><div class='del'>-        {</div><div class='del'>-        case AF_INET_SDP:</div><div class='del'>-                is_inet_sdp = 1;</div><div class='del'>-                ((struct sockaddr *) &amp;this-&gt;peerinfo.sockaddr)-&gt;sa_family = ((struct sockaddr *) &amp;this-&gt;myinfo.sockaddr)-&gt;sa_family = AF_INET;</div><div class='del'>-</div><div class='del'>-        case AF_INET:</div><div class='del'>-        case AF_INET6:</div><div class='del'>-        {</div><div class='del'>-                ret = fill_inet6_inet_identifiers (this, </div><div class='del'>-                                                   &amp;this-&gt;myinfo.sockaddr, </div><div class='del'>-                                                   this-&gt;myinfo.sockaddr_len,</div><div class='del'>-                                                   this-&gt;myinfo.identifier);</div><div class='del'>-                if (ret == -1) {</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-                                "can't fill inet/inet6 identifier for server");</div><div class='del'>-                        goto err;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                ret = fill_inet6_inet_identifiers (this,</div><div class='del'>-                                                   &amp;this-&gt;peerinfo.sockaddr,</div><div class='del'>-                                                   this-&gt;peerinfo.sockaddr_len,</div><div class='del'>-                                                   this-&gt;peerinfo.identifier);</div><div class='del'>-                if (ret == -1) {</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-                                "can't fill inet/inet6 identifier for client");</div><div class='del'>-                        goto err;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                if (is_inet_sdp) {</div><div class='del'>-                        ((struct sockaddr *) &amp;this-&gt;peerinfo.sockaddr)-&gt;sa_family = ((struct sockaddr *) &amp;this-&gt;myinfo.sockaddr)-&gt;sa_family = AF_INET_SDP;</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='del'>-        break;</div><div class='del'>-</div><div class='del'>-        case AF_UNIX:</div><div class='del'>-        {</div><div class='del'>-                struct sockaddr_un *sunaddr = NULL;</div><div class='del'>-</div><div class='del'>-                sunaddr = (struct sockaddr_un *) &amp;this-&gt;myinfo.sockaddr;</div><div class='del'>-                strcpy (this-&gt;myinfo.identifier, sunaddr-&gt;sun_path);</div><div class='del'>-</div><div class='del'>-                sunaddr = (struct sockaddr_un *) &amp;this-&gt;peerinfo.sockaddr;</div><div class='del'>-                strcpy (this-&gt;peerinfo.identifier, sunaddr-&gt;sun_path);</div><div class='del'>-        }</div><div class='del'>-        break;</div><div class='del'>-</div><div class='del'>-        default:</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_ERROR, </div><div class='del'>-                        "unknown address family (%d)",</div><div class='del'>-                        ((struct sockaddr *) &amp;this-&gt;myinfo.sockaddr)-&gt;sa_family);</div><div class='del'>-                ret = -1;</div><div class='del'>-                break;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-err:</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='head'>diff --git a/rpc/rpc-transport/rdma/src/name.h b/rpc/rpc-transport/rdma/src/name.h<br/>deleted file mode 100644<br/>index 681665d25ab..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/rpc/rpc-transport/rdma/src/name.h?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>rpc/rpc-transport/rdma/src/name.h</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,48 +0,0 @@</div><div class='del'>-/*</div><div class='del'>-  Copyright (c) 2008-2009 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='del'>-  This file is part of GlusterFS.</div><div class='del'>-</div><div class='del'>-  GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-  it under the terms of the GNU General Public License as published</div><div class='del'>-  by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-  or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-  GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-  WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-  General Public License for more details.</div><div class='del'>-</div><div class='del'>-  You should have received a copy of the GNU General Public License</div><div class='del'>-  along with this program.  If not, see</div><div class='del'>-  &lt;http://www.gnu.org/licenses/&gt;.</div><div class='del'>-*/</div><div class='del'>-</div><div class='del'>-#ifndef _IB_VERBS_NAME_H</div><div class='del'>-#define _IB_VERBS_NAME_H</div><div class='del'>-</div><div class='del'>-#include &lt;sys/socket.h&gt;</div><div class='del'>-#include &lt;sys/un.h&gt;</div><div class='del'>-</div><div class='del'>-#include "compat.h"</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-gf_rdma_client_bind (rpc_transport_t *this,</div><div class='del'>-                     struct sockaddr *sockaddr,</div><div class='del'>-                     socklen_t *sockaddr_len,</div><div class='del'>-                     int sock);</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-gf_rdma_client_get_remote_sockaddr (rpc_transport_t *this,</div><div class='del'>-                                    struct sockaddr *sockaddr,</div><div class='del'>-                                    socklen_t *sockaddr_len,</div><div class='del'>-                                    int16_t remote_port);</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-gf_rdma_server_get_local_sockaddr (rpc_transport_t *this,</div><div class='del'>-                                   struct sockaddr *addr,</div><div class='del'>-                                   socklen_t *addr_len);</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-gf_rdma_get_transport_identifiers (rpc_transport_t *this);</div><div class='del'>-</div><div class='del'>-#endif /* _IB_VERBS_NAME_H */</div><div class='head'>diff --git a/rpc/rpc-transport/rdma/src/rdma.c b/rpc/rpc-transport/rdma/src/rdma.c<br/>deleted file mode 100644<br/>index 57049967b20..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/rpc/rpc-transport/rdma/src/rdma.c?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>rpc/rpc-transport/rdma/src/rdma.c</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,4806 +0,0 @@</div><div class='del'>-/*</div><div class='del'>-  Copyright (c) 2006-2009 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='del'>-  This file is part of GlusterFS.</div><div class='del'>-</div><div class='del'>-  GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-  it under the terms of the GNU General Public License as published</div><div class='del'>-  by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-  or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-  GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-  WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-  General Public License for more details.</div><div class='del'>-</div><div class='del'>-  You should have received a copy of the GNU General Public License</div><div class='del'>-  along with this program.  If not, see</div><div class='del'>-  &lt;http://www.gnu.org/licenses/&gt;.</div><div class='del'>-*/</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-#ifndef _CONFIG_H</div><div class='del'>-#define _CONFIG_H</div><div class='del'>-#include "config.h"</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-#include "dict.h"</div><div class='del'>-#include "glusterfs.h"</div><div class='del'>-#include "logging.h"</div><div class='del'>-#include "rdma.h"</div><div class='del'>-#include "name.h"</div><div class='del'>-#include "byte-order.h"</div><div class='del'>-#include "xlator.h"</div><div class='del'>-#include &lt;signal.h&gt;</div><div class='del'>-</div><div class='del'>-#define RDMA_LOG_NAME "rpc-transport/rdma"</div><div class='del'>-</div><div class='del'>-static int32_t</div><div class='del'>-__rdma_ioq_churn (rdma_peer_t *peer);</div><div class='del'>-</div><div class='del'>-rdma_post_t *</div><div class='del'>-rdma_post_ref (rdma_post_t *post);</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-rdma_post_unref (rdma_post_t *post);</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-gf_resolve_ip6 (const char *hostname, </div><div class='del'>-                uint16_t port, </div><div class='del'>-                int family, </div><div class='del'>-                void **dnscache, </div><div class='del'>-                struct addrinfo **addr_info);</div><div class='del'>-</div><div class='del'>-static uint16_t </div><div class='del'>-rdma_get_local_lid (struct ibv_context *context,</div><div class='del'>-                    int32_t port)</div><div class='del'>-{</div><div class='del'>-        struct ibv_port_attr attr;</div><div class='del'>-</div><div class='del'>-        if (ibv_query_port (context, port, &amp;attr))</div><div class='del'>-                return 0;</div><div class='del'>-</div><div class='del'>-        return attr.lid;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-static const char *</div><div class='del'>-get_port_state_str(enum ibv_port_state pstate)</div><div class='del'>-{</div><div class='del'>-	switch (pstate) {</div><div class='del'>-	case IBV_PORT_DOWN:          return "PORT_DOWN";</div><div class='del'>-	case IBV_PORT_INIT:          return "PORT_INIT";</div><div class='del'>-	case IBV_PORT_ARMED:         return "PORT_ARMED";</div><div class='del'>-	case IBV_PORT_ACTIVE:        return "PORT_ACTIVE";</div><div class='del'>-	case IBV_PORT_ACTIVE_DEFER:  return "PORT_ACTIVE_DEFER";</div><div class='del'>-	default:                     return "invalid state";</div><div class='del'>-	}</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-static int32_t</div><div class='del'>-ib_check_active_port (struct ibv_context *ctx, uint8_t port)</div><div class='del'>-{</div><div class='del'>-        struct ibv_port_attr port_attr;</div><div class='del'>-</div><div class='del'>-        int32_t ret           = 0;</div><div class='del'>-        const char *state_str = NULL;</div><div class='del'>-</div><div class='del'>-        if (!ctx) {</div><div class='del'>-		gf_log (RDMA_LOG_NAME, GF_LOG_ERROR,</div><div class='del'>-                        "Error in supplied context");</div><div class='del'>-                return -1;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-        ret = ibv_query_port (ctx, port, &amp;port_attr);</div><div class='del'>-</div><div class='del'>-        if (ret) {</div><div class='del'>-                gf_log (RDMA_LOG_NAME, GF_LOG_ERROR,</div><div class='del'>-                        "Failed to query port %u properties", port);</div><div class='del'>-                return -1;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        state_str = get_port_state_str (port_attr.state);</div><div class='del'>-        gf_log (RDMA_LOG_NAME, GF_LOG_TRACE,</div><div class='del'>-                "Infiniband PORT: (%u) STATE: (%s)",</div><div class='del'>-                port, state_str);</div><div class='del'>-</div><div class='del'>-        if (port_attr.state == IBV_PORT_ACTIVE)</div><div class='del'>-                return 0;</div><div class='del'>-</div><div class='del'>-	return -1;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-static int32_t</div><div class='del'>-ib_get_active_port (struct ibv_context *ib_ctx)</div><div class='del'>-{</div><div class='del'>-	struct ibv_device_attr ib_device_attr;</div><div class='del'>-</div><div class='del'>-	int32_t ret     = -1;</div><div class='del'>-	uint8_t ib_port = 0;</div><div class='del'>-</div><div class='del'>-	if (!ib_ctx) {</div><div class='del'>-		gf_log (RDMA_LOG_NAME, GF_LOG_ERROR,</div><div class='del'>-                        "Error in supplied context");</div><div class='del'>-		return -1;</div><div class='del'>-	}</div><div class='del'>-	if (ibv_query_device (ib_ctx, &amp;ib_device_attr)) {</div><div class='del'>-		gf_log (RDMA_LOG_NAME, GF_LOG_ERROR,</div><div class='del'>-                        "Failed to query device properties");</div><div class='del'>-		return -1;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	for (ib_port = 1; ib_port &lt;= ib_device_attr.phys_port_cnt; ++ib_port) {</div><div class='del'>-                ret = ib_check_active_port (ib_ctx, ib_port);</div><div class='del'>-                if (ret == 0)</div><div class='del'>-                        return ib_port;</div><div class='del'>-</div><div class='del'>-                gf_log (RDMA_LOG_NAME, GF_LOG_TRACE,</div><div class='del'>-                        "Port:(%u) not active", ib_port);</div><div class='del'>-                continue;</div><div class='del'>-	}</div><div class='del'>-	return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-static void</div><div class='del'>-rdma_put_post (rdma_queue_t *queue,</div><div class='del'>-               rdma_post_t *post)</div><div class='del'>-{</div><div class='del'>-        post-&gt;ctx.is_request = 0;</div><div class='del'>-</div><div class='del'>-        pthread_mutex_lock (&amp;queue-&gt;lock);</div><div class='del'>-        {</div><div class='del'>-                if (post-&gt;prev) {</div><div class='del'>-                        queue-&gt;active_count--;</div><div class='del'>-                        post-&gt;prev-&gt;next = post-&gt;next;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                if (post-&gt;next) {</div><div class='del'>-                        post-&gt;next-&gt;prev = post-&gt;prev;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                post-&gt;prev = &amp;queue-&gt;passive_posts;</div><div class='del'>-                post-&gt;next = post-&gt;prev-&gt;next;</div><div class='del'>-                post-&gt;prev-&gt;next = post;</div><div class='del'>-                post-&gt;next-&gt;prev = post;</div><div class='del'>-                queue-&gt;passive_count++;</div><div class='del'>-        }</div><div class='del'>-        pthread_mutex_unlock (&amp;queue-&gt;lock);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-static rdma_post_t *</div><div class='del'>-rdma_new_post (rdma_device_t *device, int32_t len, rdma_post_type_t type)</div><div class='del'>-{</div><div class='del'>-        rdma_post_t *post = NULL;</div><div class='del'>-        int          ret  = -1;</div><div class='del'>-</div><div class='del'>-        post = (rdma_post_t *) GF_CALLOC (1, sizeof (*post),</div><div class='del'>-                                          gf_common_mt_rdma_post_t);</div><div class='del'>-        if (post == NULL) {</div><div class='del'>-                gf_log (RDMA_LOG_NAME, GF_LOG_ERROR, "out of memory");</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        pthread_mutex_init (&amp;post-&gt;lock, NULL);</div><div class='del'>-</div><div class='del'>-        post-&gt;buf_size = len;</div><div class='del'>-</div><div class='del'>-        post-&gt;buf = valloc (len);</div><div class='del'>-        if (!post-&gt;buf) {</div><div class='del'>-                gf_log (RDMA_LOG_NAME, GF_LOG_ERROR, "out of memory");</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        post-&gt;mr = ibv_reg_mr (device-&gt;pd,</div><div class='del'>-                               post-&gt;buf,</div><div class='del'>-                               post-&gt;buf_size,</div><div class='del'>-                               IBV_ACCESS_LOCAL_WRITE);</div><div class='del'>-        if (!post-&gt;mr) {</div><div class='del'>-                gf_log (RDMA_LOG_NAME, GF_LOG_DEBUG,</div><div class='del'>-                        "memory registration failed");</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        post-&gt;device = device;</div><div class='del'>-        post-&gt;type = type;</div><div class='del'>-</div><div class='del'>-        ret = 0;</div><div class='del'>-out:</div><div class='del'>-        if (ret != 0) {</div><div class='del'>-                if (post-&gt;buf != NULL) {</div><div class='del'>-                        free (post-&gt;buf);</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                GF_FREE (post);</div><div class='del'>-                post = NULL;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        return post;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-static rdma_post_t *</div><div class='del'>-rdma_get_post (rdma_queue_t *queue)</div><div class='del'>-{</div><div class='del'>-        rdma_post_t *post;</div><div class='del'>-</div><div class='del'>-        pthread_mutex_lock (&amp;queue-&gt;lock);</div><div class='del'>-        {</div><div class='del'>-                post = queue-&gt;passive_posts.next;</div><div class='del'>-                if (post == &amp;queue-&gt;passive_posts)</div><div class='del'>-                        post = NULL;</div><div class='del'>-    </div><div class='del'>-                if (post) {</div><div class='del'>-                        if (post-&gt;prev)</div><div class='del'>-                                post-&gt;prev-&gt;next = post-&gt;next;</div><div class='del'>-                        if (post-&gt;next)</div><div class='del'>-                                post-&gt;next-&gt;prev = post-&gt;prev;</div><div class='del'>-                        post-&gt;prev = &amp;queue-&gt;active_posts;</div><div class='del'>-                        post-&gt;next = post-&gt;prev-&gt;next;</div><div class='del'>-                        post-&gt;prev-&gt;next = post;</div><div class='del'>-                        post-&gt;next-&gt;prev = post;</div><div class='del'>-                        post-&gt;reused++;</div><div class='del'>-                        queue-&gt;active_count++;</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='del'>-        pthread_mutex_unlock (&amp;queue-&gt;lock);</div><div class='del'>-</div><div class='del'>-        return post;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-void</div><div class='del'>-rdma_destroy_post (rdma_post_t *post)</div><div class='del'>-{</div><div class='del'>-        ibv_dereg_mr (post-&gt;mr);</div><div class='del'>-        free (post-&gt;buf);</div><div class='del'>-        GF_FREE (post);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-static int32_t</div><div class='del'>-__rdma_quota_get (rdma_peer_t *peer)</div><div class='del'>-{</div><div class='del'>-        int32_t ret = -1;</div><div class='del'>-        rdma_private_t *priv = peer-&gt;trans-&gt;private;</div><div class='del'>-</div><div class='del'>-        if (priv-&gt;connected &amp;&amp; peer-&gt;quota &gt; 0) {</div><div class='del'>-                ret = peer-&gt;quota--;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-/*</div><div class='del'>-  static int32_t</div><div class='del'>-  rdma_quota_get (rdma_peer_t *peer)</div><div class='del'>-  {</div><div class='del'>-  int32_t ret = -1;</div><div class='del'>-  rdma_private_t *priv = peer-&gt;trans-&gt;private;</div><div class='del'>-</div><div class='del'>-  pthread_mutex_lock (&amp;priv-&gt;write_mutex);</div><div class='del'>-  {</div><div class='del'>-  ret = __rdma_quota_get (peer);</div><div class='del'>-  }</div><div class='del'>-  pthread_mutex_unlock (&amp;priv-&gt;write_mutex);</div><div class='del'>-</div><div class='del'>-  return ret;</div><div class='del'>-  }</div><div class='del'>-*/</div><div class='del'>-</div><div class='del'>-static void </div><div class='del'>-__rdma_ioq_entry_free (rdma_ioq_t *entry)</div><div class='del'>-{</div><div class='del'>-        list_del_init (&amp;entry-&gt;list);</div><div class='del'>-</div><div class='del'>-        if (entry-&gt;iobref) {</div><div class='del'>-                iobref_unref (entry-&gt;iobref);</div><div class='del'>-                entry-&gt;iobref = NULL;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (entry-&gt;msg.request.rsp_iobref) {</div><div class='del'>-                iobref_unref (entry-&gt;msg.request.rsp_iobref);</div><div class='del'>-                entry-&gt;msg.request.rsp_iobref = NULL;</div><div class='del'>-        }</div><div class='del'>-        /* TODO: use mem-pool */</div><div class='del'>-        mem_put (entry-&gt;pool, entry);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-static void</div><div class='del'>-__rdma_ioq_flush (rdma_peer_t *peer)</div><div class='del'>-{</div><div class='del'>-        rdma_ioq_t *entry = NULL, *dummy = NULL;</div><div class='del'>-</div><div class='del'>-        list_for_each_entry_safe (entry, dummy, &amp;peer-&gt;ioq, list) {</div><div class='del'>-                __rdma_ioq_entry_free (entry);</div><div class='del'>-        }</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-static int32_t</div><div class='del'>-__rdma_disconnect (rpc_transport_t *this)</div><div class='del'>-{</div><div class='del'>-        rdma_private_t *priv = this-&gt;private;</div><div class='del'>-        int32_t ret = 0;</div><div class='del'>-</div><div class='del'>-        if (priv-&gt;connected || priv-&gt;tcp_connected) {</div><div class='del'>-                fcntl (priv-&gt;sock, F_SETFL, O_NONBLOCK);</div><div class='del'>-                if (shutdown (priv-&gt;sock, SHUT_RDWR) != 0) {</div><div class='del'>-                        gf_log (RDMA_LOG_NAME,</div><div class='del'>-                                GF_LOG_DEBUG,</div><div class='del'>-                                "shutdown () - error: %s",</div><div class='del'>-                                strerror (errno));</div><div class='del'>-                        ret = -errno;</div><div class='del'>-                        priv-&gt;tcp_connected = 0;</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='del'>-  </div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-static int32_t</div><div class='del'>-rdma_post_send (struct ibv_qp *qp,</div><div class='del'>-                rdma_post_t *post,</div><div class='del'>-                int32_t len)</div><div class='del'>-{</div><div class='del'>-        struct ibv_sge list = {</div><div class='del'>-                .addr = (unsigned long) post-&gt;buf,</div><div class='del'>-                .length = len,</div><div class='del'>-                .lkey = post-&gt;mr-&gt;lkey</div><div class='del'>-        };</div><div class='del'>-</div><div class='del'>-        struct ibv_send_wr wr = {</div><div class='del'>-                .wr_id      = (unsigned long) post,</div><div class='del'>-                .sg_list    = &amp;list,</div><div class='del'>-                .num_sge    = 1,</div><div class='del'>-                .opcode     = IBV_WR_SEND,</div><div class='del'>-                .send_flags = IBV_SEND_SIGNALED,</div><div class='del'>-        }, *bad_wr;</div><div class='del'>-</div><div class='del'>-        if (!qp)</div><div class='del'>-                return -1;</div><div class='del'>-</div><div class='del'>-        return ibv_post_send (qp, &amp;wr, &amp;bad_wr);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-__rdma_encode_error(rdma_peer_t *peer, rdma_reply_info_t *reply_info,</div><div class='del'>-                    struct iovec *rpchdr, uint32_t *ptr,</div><div class='del'>-                    rdma_errcode_t err)</div><div class='del'>-{</div><div class='del'>-	uint32_t       *startp = NULL;</div><div class='del'>-        struct rpc_msg *rpc_msg = NULL;</div><div class='del'>-</div><div class='del'>-        startp = ptr;</div><div class='del'>-        if (reply_info != NULL) {</div><div class='del'>-                *ptr++ = hton32(reply_info-&gt;rm_xid);</div><div class='del'>-        } else {</div><div class='del'>-                rpc_msg = rpchdr[0].iov_base; /* assume rpchdr contains</div><div class='del'>-                                               * only one vector.</div><div class='del'>-                                               * (which is true)</div><div class='del'>-                                               */</div><div class='del'>-                *ptr++ = rpc_msg-&gt;rm_xid;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-	*ptr++ = hton32(RDMA_VERSION);</div><div class='del'>-	*ptr++ = hton32(peer-&gt;send_count);</div><div class='del'>-	*ptr++ = hton32(RDMA_ERROR);</div><div class='del'>-	*ptr++ = hton32(err);</div><div class='del'>-	if (err == ERR_VERS) {</div><div class='del'>-		*ptr++ = hton32(RDMA_VERSION);</div><div class='del'>-		*ptr++ = hton32(RDMA_VERSION);</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	return (int)((unsigned long)ptr - (unsigned long)startp);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-__rdma_send_error (rdma_peer_t *peer, rdma_ioq_t *entry, rdma_post_t *post,</div><div class='del'>-                   rdma_reply_info_t *reply_info, rdma_errcode_t err)</div><div class='del'>-{</div><div class='del'>-        int32_t  ret = -1, len;</div><div class='del'>-</div><div class='del'>-        len = __rdma_encode_error (peer, reply_info, entry-&gt;rpchdr,</div><div class='del'>-                                   (uint32_t *)post-&gt;buf, err);</div><div class='del'>-        if (len == -1) {</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        rdma_post_ref (post);</div><div class='del'>-</div><div class='del'>-        ret = rdma_post_send (peer-&gt;qp, post, len);</div><div class='del'>-        if (!ret) {</div><div class='del'>-                ret = len;</div><div class='del'>-        } else {</div><div class='del'>-                gf_log (RDMA_LOG_NAME, GF_LOG_DEBUG,</div><div class='del'>-                        "ibv_post_send failed with ret = %d", ret);</div><div class='del'>-                rdma_post_unref (post);</div><div class='del'>-                __rdma_disconnect (peer-&gt;trans);</div><div class='del'>-                ret = -1;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-__rdma_create_read_chunks_from_vector (rdma_peer_t *peer,</div><div class='del'>-                                       rdma_read_chunk_t **readch_ptr,</div><div class='del'>-                                       int32_t *pos, struct iovec *vector,</div><div class='del'>-                                       int count,</div><div class='del'>-                                       rdma_request_context_t *request_ctx)</div><div class='del'>-{</div><div class='del'>-        int                i      = 0;</div><div class='del'>-        rdma_private_t    *priv   = NULL;</div><div class='del'>-        rdma_device_t     *device = NULL;</div><div class='del'>-        struct ibv_mr     *mr     = NULL;</div><div class='del'>-        rdma_read_chunk_t *readch = NULL; </div><div class='del'>-        int32_t            ret    = -1;</div><div class='del'>-</div><div class='del'>-        if ((peer == NULL) || (readch_ptr == NULL) || (*readch_ptr == NULL)</div><div class='del'>-            || (request_ctx == NULL) || (vector == NULL)) {</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        priv = peer-&gt;trans-&gt;private;</div><div class='del'>-        device = priv-&gt;device;</div><div class='del'>-        readch = *readch_ptr;</div><div class='del'>-</div><div class='del'>-        for (i = 0; i &lt; count; i++) {</div><div class='del'>-                readch-&gt;rc_discrim = hton32 (1);</div><div class='del'>-                readch-&gt;rc_position = hton32 (*pos);</div><div class='del'>-</div><div class='del'>-                mr = ibv_reg_mr (device-&gt;pd, vector[i].iov_base,</div><div class='del'>-                                 vector[i].iov_len,</div><div class='del'>-                                 IBV_ACCESS_REMOTE_READ);</div><div class='del'>-                if (!mr) {</div><div class='del'>-                        gf_log (RDMA_LOG_NAME, GF_LOG_DEBUG,</div><div class='del'>-                                "memory registration failed");</div><div class='del'>-                        goto out;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                request_ctx-&gt;mr[request_ctx-&gt;mr_count++] = mr;</div><div class='del'>-</div><div class='del'>-                readch-&gt;rc_target.rs_handle = hton32 (mr-&gt;rkey);</div><div class='del'>-                readch-&gt;rc_target.rs_length</div><div class='del'>-                        = hton32 (vector[i].iov_len);</div><div class='del'>-                readch-&gt;rc_target.rs_offset</div><div class='del'>-                        = hton64 ((uint64_t)(unsigned long)vector[i].iov_base);</div><div class='del'>-</div><div class='del'>-                *pos = *pos + vector[i].iov_len;</div><div class='del'>-                readch++;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        *readch_ptr = readch;</div><div class='del'>-</div><div class='del'>-        ret = 0;</div><div class='del'>-out:</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-__rdma_create_read_chunks (rdma_peer_t *peer, rdma_ioq_t *entry,</div><div class='del'>-                           rdma_chunktype_t type, uint32_t **ptr,</div><div class='del'>-                           rdma_request_context_t *request_ctx)</div><div class='del'>-{</div><div class='del'>-        int32_t            ret      = -1;</div><div class='del'>-        rdma_device_t     *device   = NULL;</div><div class='del'>-        rdma_private_t    *priv     = NULL;</div><div class='del'>-        int                pos      = 0;</div><div class='del'>-</div><div class='del'>-        if ((peer == NULL) || (entry == NULL) || (ptr == NULL)</div><div class='del'>-            || (*ptr == NULL) || (request_ctx == NULL)) {</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        priv = peer-&gt;trans-&gt;private;</div><div class='del'>-        device = priv-&gt;device;</div><div class='del'>-</div><div class='del'>-        request_ctx-&gt;iobref = iobref_ref (entry-&gt;iobref);</div><div class='del'>-</div><div class='del'>-        if (type == rdma_areadch) {</div><div class='del'>-                pos = 0;</div><div class='del'>-                ret = __rdma_create_read_chunks_from_vector (peer,</div><div class='del'>-                                                             (rdma_read_chunk_t **)ptr,</div><div class='del'>-                                                             &amp;pos,</div><div class='del'>-                                                             entry-&gt;rpchdr,</div><div class='del'>-                                                             entry-&gt;rpchdr_count,</div><div class='del'>-                                                             request_ctx);</div><div class='del'>-                if (ret == -1) {</div><div class='del'>-                        gf_log (RDMA_LOG_NAME, GF_LOG_DEBUG,</div><div class='del'>-                                "cannot create read chunks from vector, "</div><div class='del'>-                                "entry-&gt;rpchdr");</div><div class='del'>-                        goto out;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                ret = __rdma_create_read_chunks_from_vector (peer,</div><div class='del'>-                                                             (rdma_read_chunk_t **)ptr,</div><div class='del'>-                                                             &amp;pos,</div><div class='del'>-                                                             entry-&gt;proghdr,</div><div class='del'>-                                                             entry-&gt;proghdr_count,</div><div class='del'>-                                                             request_ctx);</div><div class='del'>-                if (ret == -1) {</div><div class='del'>-                        gf_log (RDMA_LOG_NAME, GF_LOG_DEBUG,</div><div class='del'>-                                "cannot create read chunks from vector, "</div><div class='del'>-                                "entry-&gt;proghdr");</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                if (entry-&gt;prog_payload_count != 0) {</div><div class='del'>-                        ret = __rdma_create_read_chunks_from_vector (peer,</div><div class='del'>-                                                                     (rdma_read_chunk_t **)ptr,</div><div class='del'>-                                                                     &amp;pos,</div><div class='del'>-                                                                     entry-&gt;prog_payload,</div><div class='del'>-                                                                     entry-&gt;prog_payload_count,</div><div class='del'>-                                                                     request_ctx);</div><div class='del'>-                        if (ret == -1) {</div><div class='del'>-                                gf_log (RDMA_LOG_NAME, GF_LOG_DEBUG,</div><div class='del'>-                                        "cannot create read chunks from vector,"</div><div class='del'>-                                        " entry-&gt;prog_payload");</div><div class='del'>-                        }</div><div class='del'>-                }</div><div class='del'>-        } else {</div><div class='del'>-                pos = iov_length (entry-&gt;rpchdr, entry-&gt;rpchdr_count);</div><div class='del'>-                ret = __rdma_create_read_chunks_from_vector (peer,</div><div class='del'>-                                                             (rdma_read_chunk_t **)ptr,</div><div class='del'>-                                                             &amp;pos,</div><div class='del'>-                                                             entry-&gt;prog_payload,</div><div class='del'>-                                                             entry-&gt;prog_payload_count,</div><div class='del'>-                                                             request_ctx);</div><div class='del'>-                if (ret == -1) {</div><div class='del'>-                        gf_log (RDMA_LOG_NAME, GF_LOG_DEBUG,</div><div class='del'>-                                "cannot create read chunks from vector, "</div><div class='del'>-                                "entry-&gt;prog_payload");</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        /* terminate read-chunk list*/</div><div class='del'>-        **ptr = 0;</div><div class='del'>-        *ptr = *ptr + 1;</div><div class='del'>-out:</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-__rdma_create_write_chunks_from_vector (rdma_peer_t *peer,</div><div class='del'>-                                        rdma_write_chunk_t **writech_ptr,</div><div class='del'>-                                        struct iovec *vector, int count,</div><div class='del'>-                                        rdma_request_context_t *request_ctx)</div><div class='del'>-{</div><div class='del'>-        int                 i       = 0;</div><div class='del'>-        rdma_private_t     *priv    = NULL;</div><div class='del'>-        rdma_device_t      *device  = NULL;</div><div class='del'>-        struct ibv_mr      *mr      = NULL;</div><div class='del'>-        rdma_write_chunk_t *writech = NULL; </div><div class='del'>-        int32_t             ret     = -1;</div><div class='del'>-</div><div class='del'>-        if ((peer == NULL) || (writech_ptr == NULL) || (*writech_ptr == NULL)</div><div class='del'>-            || (request_ctx == NULL) || (vector == NULL)) {</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        writech = *writech_ptr;</div><div class='del'>-</div><div class='del'>-        priv = peer-&gt;trans-&gt;private;</div><div class='del'>-        device = priv-&gt;device;</div><div class='del'>-        </div><div class='del'>-        for (i = 0; i &lt; count; i++) {</div><div class='del'>-                mr = ibv_reg_mr (device-&gt;pd, vector[i].iov_base,</div><div class='del'>-                                 vector[i].iov_len,</div><div class='del'>-                                 IBV_ACCESS_REMOTE_WRITE</div><div class='del'>-                                 | IBV_ACCESS_LOCAL_WRITE);</div><div class='del'>-                if (!mr) {</div><div class='del'>-                        gf_log (RDMA_LOG_NAME, GF_LOG_DEBUG,</div><div class='del'>-                                "memory registration failed");</div><div class='del'>-                        goto out;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                request_ctx-&gt;mr[request_ctx-&gt;mr_count++] = mr;</div><div class='del'>-</div><div class='del'>-                writech-&gt;wc_target.rs_handle = hton32 (mr-&gt;rkey);</div><div class='del'>-                writech-&gt;wc_target.rs_length = hton32 (vector[i].iov_len);</div><div class='del'>-                writech-&gt;wc_target.rs_offset</div><div class='del'>-                        = hton64 (((uint64_t)(unsigned long)vector[i].iov_base));</div><div class='del'>-</div><div class='del'>-                writech++;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        *writech_ptr = writech;</div><div class='del'>-</div><div class='del'>-        ret = 0;</div><div class='del'>-out:</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-__rdma_create_write_chunks (rdma_peer_t *peer, rdma_ioq_t *entry,</div><div class='del'>-                            rdma_chunktype_t chunk_type, uint32_t **ptr,</div><div class='del'>-                            rdma_request_context_t *request_ctx)</div><div class='del'>-{</div><div class='del'>-        int32_t             ret      = -1;</div><div class='del'>-        rdma_write_array_t *warray   = NULL;</div><div class='del'>-</div><div class='del'>-        if ((peer == NULL) || (entry == NULL) || (ptr == NULL)</div><div class='del'>-            || (*ptr == NULL) || (request_ctx == NULL)) {</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if ((chunk_type == rdma_replych)</div><div class='del'>-            &amp;&amp; ((entry-&gt;msg.request.rsphdr_count != 1) ||</div><div class='del'>-                (entry-&gt;msg.request.rsphdr_vec[0].iov_base == NULL))) {</div><div class='del'>-                gf_log (RDMA_LOG_NAME, GF_LOG_DEBUG,</div><div class='del'>-                        (entry-&gt;msg.request.rsphdr_count == 1)</div><div class='del'>-                        ? "chunktype specified as reply chunk but the vector "</div><div class='del'>-                        "specifying the buffer to be used for holding reply"</div><div class='del'>-                        " header is not correct" :</div><div class='del'>-                        "chunktype specified as reply chunk, but more than one "</div><div class='del'>-                        "buffer provided for holding reply");</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-/*</div><div class='del'>-        if ((chunk_type == rdma_writech)</div><div class='del'>-            &amp;&amp; ((entry-&gt;msg.request.rsphdr_count == 0)</div><div class='del'>-                || (entry-&gt;msg.request.rsphdr_vec[0].iov_base == NULL))) {</div><div class='del'>-                gf_log (RDMA_LOG_NAME, GF_LOG_DEBUG,</div><div class='del'>-                        "vector specifying buffer to hold the program's reply "</div><div class='del'>-                        "header should also be provided when buffers are "</div><div class='del'>-                        "provided for holding the program's payload in reply");</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-*/</div><div class='del'>-</div><div class='del'>-        if (chunk_type == rdma_writech) {</div><div class='del'>-                warray = (rdma_write_array_t *)*ptr;</div><div class='del'>-                warray-&gt;wc_discrim = hton32 (1);</div><div class='del'>-                warray-&gt;wc_nchunks</div><div class='del'>-                        = hton32 (entry-&gt;msg.request.rsp_payload_count);</div><div class='del'>-</div><div class='del'>-                *ptr = (uint32_t *)&amp;warray-&gt;wc_array[0];</div><div class='del'>-</div><div class='del'>-                ret = __rdma_create_write_chunks_from_vector (peer,</div><div class='del'>-                                                              (rdma_write_chunk_t **)ptr,</div><div class='del'>-                                                              entry-&gt;msg.request.rsp_payload,</div><div class='del'>-                                                              entry-&gt;msg.request.rsp_payload_count,</div><div class='del'>-                                                              request_ctx);</div><div class='del'>-                if (ret == -1) {</div><div class='del'>-                        gf_log (RDMA_LOG_NAME, GF_LOG_DEBUG,</div><div class='del'>-                                "cannot create write chunks from vector "</div><div class='del'>-                                "entry-&gt;rpc_payload");</div><div class='del'>-                        goto out;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                /* terminate write chunklist */</div><div class='del'>-                **ptr = 0;</div><div class='del'>-                *ptr = *ptr + 1;</div><div class='del'>-</div><div class='del'>-                /* no reply chunklist */</div><div class='del'>-                **ptr = 0;</div><div class='del'>-                *ptr = *ptr + 1;</div><div class='del'>-        } else {</div><div class='del'>-                /* no write chunklist */ </div><div class='del'>-                **ptr = 0;</div><div class='del'>-                *ptr = *ptr + 1;</div><div class='del'>-</div><div class='del'>-                warray = (rdma_write_array_t *)*ptr;</div><div class='del'>-                warray-&gt;wc_discrim = hton32 (1);</div><div class='del'>-                warray-&gt;wc_nchunks = hton32 (entry-&gt;msg.request.rsphdr_count);</div><div class='del'>-</div><div class='del'>-                *ptr = (uint32_t *)&amp;warray-&gt;wc_array[0];</div><div class='del'>-                </div><div class='del'>-                ret = __rdma_create_write_chunks_from_vector (peer,</div><div class='del'>-                                                              (rdma_write_chunk_t **)ptr,</div><div class='del'>-                                                              entry-&gt;msg.request.rsphdr_vec,</div><div class='del'>-                                                              entry-&gt;msg.request.rsphdr_count,</div><div class='del'>-                                                              request_ctx);</div><div class='del'>-                if (ret == -1) {</div><div class='del'>-                        gf_log (RDMA_LOG_NAME, GF_LOG_DEBUG,</div><div class='del'>-                                "cannot create write chunks from vector "</div><div class='del'>-                                "entry-&gt;rpchdr");</div><div class='del'>-                        goto out;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                /* terminate reply chunklist */</div><div class='del'>-                **ptr = 0;</div><div class='del'>-                *ptr = *ptr + 1;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-inline void</div><div class='del'>-__rdma_deregister_mr (struct ibv_mr **mr, int count)</div><div class='del'>-{</div><div class='del'>-        int i = 0;</div><div class='del'>-</div><div class='del'>-        if (mr == NULL) {</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        for (i = 0; i &lt; count; i++) {</div><div class='del'>-                ibv_dereg_mr (mr[i]);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        return;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-static int32_t</div><div class='del'>-__rdma_quota_put (rdma_peer_t *peer)</div><div class='del'>-{</div><div class='del'>-        int32_t ret;</div><div class='del'>-</div><div class='del'>-        peer-&gt;quota++;</div><div class='del'>-        ret = peer-&gt;quota;</div><div class='del'>-</div><div class='del'>-        if (!list_empty (&amp;peer-&gt;ioq)) {</div><div class='del'>-                ret = __rdma_ioq_churn (peer);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-static int32_t</div><div class='del'>-rdma_quota_put (rdma_peer_t *peer)</div><div class='del'>-{</div><div class='del'>-        int32_t ret;</div><div class='del'>-        rdma_private_t *priv = peer-&gt;trans-&gt;private;</div><div class='del'>-</div><div class='del'>-        pthread_mutex_lock (&amp;priv-&gt;write_mutex);</div><div class='del'>-        {</div><div class='del'>-                ret = __rdma_quota_put (peer);</div><div class='del'>-        }</div><div class='del'>-        pthread_mutex_unlock (&amp;priv-&gt;write_mutex);</div><div class='del'>-</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-/* to be called with priv-&gt;mutex held */</div><div class='del'>-void</div><div class='del'>-__rdma_request_context_destroy (rdma_request_context_t *context)</div><div class='del'>-{</div><div class='del'>-        rdma_peer_t    *peer = NULL;</div><div class='del'>-        rdma_private_t *priv = NULL;</div><div class='del'>-        int32_t         ret  = 0;</div><div class='del'>-</div><div class='del'>-        if (context == NULL) {</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        peer = context-&gt;peer;</div><div class='del'>-</div><div class='del'>-        __rdma_deregister_mr (context-&gt;mr, context-&gt;mr_count);</div><div class='del'>-</div><div class='del'>-        priv = peer-&gt;trans-&gt;private;</div><div class='del'>-</div><div class='del'>-        if (priv-&gt;connected) {</div><div class='del'>-                ret = __rdma_quota_put (peer);</div><div class='del'>-                if (ret &lt; 0) {</div><div class='del'>-                        gf_log ("rdma", GF_LOG_DEBUG,</div><div class='del'>-                                "failed to send "</div><div class='del'>-                                "message");</div><div class='del'>-                        mem_put (context-&gt;pool, context);</div><div class='del'>-                        __rdma_disconnect (peer-&gt;trans);</div><div class='del'>-                        goto out;</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (context-&gt;iobref != NULL) {</div><div class='del'>-                iobref_unref (context-&gt;iobref);</div><div class='del'>-                context-&gt;iobref = NULL;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (context-&gt;rsp_iobref != NULL) {</div><div class='del'>-                iobref_unref (context-&gt;rsp_iobref);</div><div class='del'>-                context-&gt;rsp_iobref = NULL;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        mem_put (context-&gt;pool, context);</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        return;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-void</div><div class='del'>-rdma_post_context_destroy (rdma_post_context_t *ctx)</div><div class='del'>-{</div><div class='del'>-        if (ctx == NULL) {</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        __rdma_deregister_mr (ctx-&gt;mr, ctx-&gt;mr_count);</div><div class='del'>-</div><div class='del'>-        if (ctx-&gt;iobref != NULL) {</div><div class='del'>-                iobref_unref (ctx-&gt;iobref);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        memset (ctx, 0, sizeof (*ctx));</div><div class='del'>-out:</div><div class='del'>-        return;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-static int32_t</div><div class='del'>-rdma_post_recv (struct ibv_srq *srq,</div><div class='del'>-                rdma_post_t *post)</div><div class='del'>-{</div><div class='del'>-        struct ibv_sge list = {</div><div class='del'>-                .addr   = (unsigned long) post-&gt;buf,</div><div class='del'>-                .length = post-&gt;buf_size,</div><div class='del'>-                .lkey   = post-&gt;mr-&gt;lkey</div><div class='del'>-        };</div><div class='del'>-</div><div class='del'>-        struct ibv_recv_wr wr = {</div><div class='del'>-                .wr_id  = (unsigned long) post,</div><div class='del'>-                .sg_list = &amp;list,</div><div class='del'>-                .num_sge = 1,</div><div class='del'>-        }, *bad_wr;</div><div class='del'>-</div><div class='del'>-        rdma_post_ref (post);</div><div class='del'>-</div><div class='del'>-        return ibv_post_srq_recv (srq, &amp;wr, &amp;bad_wr);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-rdma_post_unref (rdma_post_t *post)</div><div class='del'>-{</div><div class='del'>-        int refcount = -1;</div><div class='del'>-</div><div class='del'>-        if (post == NULL) {</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        pthread_mutex_lock (&amp;post-&gt;lock);</div><div class='del'>-        {</div><div class='del'>-                refcount = --post-&gt;refcount;</div><div class='del'>-        }</div><div class='del'>-        pthread_mutex_unlock (&amp;post-&gt;lock);</div><div class='del'>-</div><div class='del'>-        if (refcount == 0) {</div><div class='del'>-                rdma_post_context_destroy (&amp;post-&gt;ctx);</div><div class='del'>-                if (post-&gt;type == RDMA_SEND_POST) {</div><div class='del'>-                        rdma_put_post (&amp;post-&gt;device-&gt;sendq, post);</div><div class='del'>-                } else {</div><div class='del'>-                        rdma_post_recv (post-&gt;device-&gt;srq, post);</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='del'>-out:</div><div class='del'>-        return refcount;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-rdma_post_get_refcount (rdma_post_t *post)</div><div class='del'>-{</div><div class='del'>-        int refcount = -1;</div><div class='del'>-</div><div class='del'>-        if (post == NULL) {</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        pthread_mutex_lock (&amp;post-&gt;lock);</div><div class='del'>-        {</div><div class='del'>-                refcount = post-&gt;refcount;</div><div class='del'>-        }</div><div class='del'>-        pthread_mutex_unlock (&amp;post-&gt;lock);</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        return refcount;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-rdma_post_t *</div><div class='del'>-rdma_post_ref (rdma_post_t *post)</div><div class='del'>-{</div><div class='del'>-        if (post == NULL) {</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        pthread_mutex_lock (&amp;post-&gt;lock);</div><div class='del'>-        {</div><div class='del'>-                post-&gt;refcount++;</div><div class='del'>-        }</div><div class='del'>-        pthread_mutex_unlock (&amp;post-&gt;lock);</div><div class='del'>-        </div><div class='del'>-out:</div><div class='del'>-        return post;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-__rdma_ioq_churn_request (rdma_peer_t *peer, rdma_ioq_t *entry,</div><div class='del'>-                          rdma_post_t *post)</div><div class='del'>-{</div><div class='del'>-        rdma_chunktype_t        rtype               = rdma_noch, wtype = rdma_noch; </div><div class='del'>-        uint64_t                send_size           = 0;</div><div class='del'>-        rdma_header_t          *hdr                 = NULL;</div><div class='del'>-        struct rpc_msg         *rpc_msg             = NULL;</div><div class='del'>-        uint32_t               *chunkptr            = NULL;</div><div class='del'>-        char                   *buf                 = NULL;</div><div class='del'>-        int32_t                 ret                 = 0;</div><div class='del'>-        rdma_private_t         *priv                = NULL;</div><div class='del'>-        rdma_device_t          *device              = NULL;</div><div class='del'>-        int                     chunk_count         = 0;</div><div class='del'>-        rdma_request_context_t *request_ctx         = NULL;</div><div class='del'>-        uint32_t                prog_payload_length = 0, len = 0;</div><div class='del'>-        struct rpc_req         *rpc_req             = NULL;</div><div class='del'>-</div><div class='del'>-        if ((peer == NULL) || (entry == NULL) || (post == NULL)) {</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if ((entry-&gt;msg.request.rsphdr_count != 0)</div><div class='del'>-            &amp;&amp; (entry-&gt;msg.request.rsp_payload_count != 0)) {</div><div class='del'>-                ret = -1;</div><div class='del'>-                gf_log (RDMA_LOG_NAME, GF_LOG_DEBUG,</div><div class='del'>-                        "both write-chunklist and reply-chunk cannot be "</div><div class='del'>-                        "present");</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        post-&gt;ctx.is_request = 1;</div><div class='del'>-        priv = peer-&gt;trans-&gt;private;</div><div class='del'>-        device = priv-&gt;device;</div><div class='del'>-</div><div class='del'>-        hdr = (rdma_header_t *)post-&gt;buf;</div><div class='del'>-</div><div class='del'>-        send_size = iov_length (entry-&gt;rpchdr, entry-&gt;rpchdr_count)</div><div class='del'>-                + iov_length (entry-&gt;proghdr, entry-&gt;proghdr_count)</div><div class='del'>-                + RDMA_MAX_HEADER_SIZE;</div><div class='del'>-</div><div class='del'>-        if (entry-&gt;prog_payload_count != 0) {</div><div class='del'>-                prog_payload_length</div><div class='del'>-                        = iov_length (entry-&gt;prog_payload,</div><div class='del'>-                                      entry-&gt;prog_payload_count);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (send_size &gt; RDMA_INLINE_THRESHOLD) {</div><div class='del'>-                rtype = rdma_areadch;</div><div class='del'>-        } else if ((send_size + prog_payload_length) &lt; RDMA_INLINE_THRESHOLD) {</div><div class='del'>-                rtype = rdma_noch;</div><div class='del'>-        } else if (entry-&gt;prog_payload_count != 0) {</div><div class='del'>-                rtype = rdma_readch;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (entry-&gt;msg.request.rsphdr_count != 0) {</div><div class='del'>-                wtype = rdma_replych;</div><div class='del'>-        } else if (entry-&gt;msg.request.rsp_payload_count != 0) {</div><div class='del'>-                wtype = rdma_writech;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (rtype == rdma_readch) {</div><div class='del'>-                chunk_count += entry-&gt;prog_payload_count;</div><div class='del'>-        } else if (rtype == rdma_areadch) {</div><div class='del'>-                chunk_count += entry-&gt;rpchdr_count;</div><div class='del'>-                chunk_count += entry-&gt;proghdr_count;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (wtype == rdma_writech) {</div><div class='del'>-                chunk_count += entry-&gt;msg.request.rsp_payload_count;</div><div class='del'>-        } else if (wtype == rdma_replych) {</div><div class='del'>-                chunk_count += entry-&gt;msg.request.rsphdr_count;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (chunk_count &gt; RDMA_MAX_SEGMENTS) {</div><div class='del'>-                ret = -1;</div><div class='del'>-                gf_log (RDMA_LOG_NAME, GF_LOG_DEBUG,</div><div class='del'>-                        "chunk count(%d) exceeding maximum allowed RDMA "</div><div class='del'>-                        "segment count(%d)", chunk_count, RDMA_MAX_SEGMENTS);</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        request_ctx = mem_get (priv-&gt;request_ctx_pool);</div><div class='del'>-        if (request_ctx == NULL) {</div><div class='del'>-                ret = -1;</div><div class='del'>-                gf_log (RDMA_LOG_NAME, GF_LOG_ERROR, "out of memory");</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        memset (request_ctx, 0, sizeof (*request_ctx));</div><div class='del'>-</div><div class='del'>-        request_ctx-&gt;pool = priv-&gt;request_ctx_pool;</div><div class='del'>-        request_ctx-&gt;peer = peer;</div><div class='del'>-</div><div class='del'>-        entry-&gt;msg.request.rpc_req-&gt;conn_private = request_ctx;</div><div class='del'>-        if (entry-&gt;msg.request.rsp_iobref != NULL) {</div><div class='del'>-                request_ctx-&gt;rsp_iobref</div><div class='del'>-                        = iobref_ref (entry-&gt;msg.request.rsp_iobref);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        rpc_msg = (struct rpc_msg *) entry-&gt;rpchdr[0].iov_base;</div><div class='del'>-</div><div class='del'>-        hdr-&gt;rm_xid    = rpc_msg-&gt;rm_xid; /* no need of hton32(rpc_msg-&gt;rm_xid),</div><div class='del'>-                                           * since rpc_msg-&gt;rm_xid is already</div><div class='del'>-                                           * hton32ed value of actual xid</div><div class='del'>-                                           */</div><div class='del'>-        hdr-&gt;rm_vers   = hton32 (RDMA_VERSION);</div><div class='del'>-        hdr-&gt;rm_credit = hton32 (peer-&gt;send_count);</div><div class='del'>-        if (rtype == rdma_areadch) {</div><div class='del'>-                hdr-&gt;rm_type = hton32 (RDMA_NOMSG);</div><div class='del'>-        } else {</div><div class='del'>-                hdr-&gt;rm_type   = hton32 (RDMA_MSG);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        chunkptr = &amp;hdr-&gt;rm_body.rm_chunks[0];</div><div class='del'>-        if (rtype != rdma_noch) {</div><div class='del'>-                ret = __rdma_create_read_chunks (peer, entry, rtype, &amp;chunkptr,</div><div class='del'>-                                                 request_ctx);</div><div class='del'>-                if (ret != 0) {</div><div class='del'>-                        gf_log (RDMA_LOG_NAME, GF_LOG_DEBUG,</div><div class='del'>-                                "creation of read chunks failed");</div><div class='del'>-                        goto out;</div><div class='del'>-                }</div><div class='del'>-        } else {</div><div class='del'>-                *chunkptr++ = 0; /* no read chunks */</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (wtype != rdma_noch) {</div><div class='del'>-                ret = __rdma_create_write_chunks (peer, entry, wtype, &amp;chunkptr,</div><div class='del'>-                                                  request_ctx);</div><div class='del'>-                if (ret != 0) {</div><div class='del'>-                        gf_log (RDMA_LOG_NAME, GF_LOG_DEBUG,</div><div class='del'>-                                "creation of write/reply chunk failed");</div><div class='del'>-                        goto out;</div><div class='del'>-                }</div><div class='del'>-        } else {</div><div class='del'>-                *chunkptr++ = 0; /* no write chunks */</div><div class='del'>-                *chunkptr++ = 0; /* no reply chunk */</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        buf = (char *)chunkptr;</div><div class='del'>-</div><div class='del'>-        if (rtype != rdma_areadch) {</div><div class='del'>-                iov_unload (buf, entry-&gt;rpchdr, entry-&gt;rpchdr_count);</div><div class='del'>-                buf += iov_length (entry-&gt;rpchdr, entry-&gt;rpchdr_count);</div><div class='del'>-</div><div class='del'>-                iov_unload (buf, entry-&gt;proghdr, entry-&gt;proghdr_count);</div><div class='del'>-                buf += iov_length (entry-&gt;proghdr, entry-&gt;proghdr_count);</div><div class='del'>-</div><div class='del'>-                if (rtype != rdma_readch) {</div><div class='del'>-                        iov_unload (buf, entry-&gt;prog_payload,</div><div class='del'>-                                    entry-&gt;prog_payload_count);</div><div class='del'>-                        buf += iov_length (entry-&gt;prog_payload,</div><div class='del'>-                                           entry-&gt;prog_payload_count);</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        len = buf - post-&gt;buf;</div><div class='del'>- </div><div class='del'>-        rdma_post_ref (post);</div><div class='del'>-</div><div class='del'>-        ret = rdma_post_send (peer-&gt;qp, post, len);</div><div class='del'>-        if (!ret) {</div><div class='del'>-                ret = len;</div><div class='del'>-        } else {</div><div class='del'>-                gf_log (RDMA_LOG_NAME, GF_LOG_DEBUG,</div><div class='del'>-                        "ibv_post_send failed with ret = %d", ret);</div><div class='del'>-                rdma_post_unref (post);</div><div class='del'>-                __rdma_disconnect (peer-&gt;trans);</div><div class='del'>-                ret = -1;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        if (ret == -1) {</div><div class='del'>-                rpc_req = entry-&gt;msg.request.rpc_req;</div><div class='del'>-</div><div class='del'>-                __rdma_request_context_destroy (rpc_req-&gt;conn_private);</div><div class='del'>-                rpc_req-&gt;conn_private = NULL;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-inline void</div><div class='del'>-__rdma_fill_reply_header (rdma_header_t *header, struct iovec *rpchdr,</div><div class='del'>-                          rdma_reply_info_t *reply_info, int credits)</div><div class='del'>-{</div><div class='del'>-        struct rpc_msg *rpc_msg = NULL;</div><div class='del'>-</div><div class='del'>-        if (reply_info != NULL) {</div><div class='del'>-                header-&gt;rm_xid = hton32 (reply_info-&gt;rm_xid);</div><div class='del'>-        } else {</div><div class='del'>-                rpc_msg = rpchdr[0].iov_base; /* assume rpchdr contains</div><div class='del'>-                                                      * only one vector.</div><div class='del'>-                                                      * (which is true)</div><div class='del'>-                                                      */</div><div class='del'>-                header-&gt;rm_xid = rpc_msg-&gt;rm_xid;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        header-&gt;rm_type = hton32 (RDMA_MSG);</div><div class='del'>-        header-&gt;rm_vers = hton32 (RDMA_VERSION);</div><div class='del'>-        header-&gt;rm_credit = hton32 (credits);</div><div class='del'>-</div><div class='del'>-        header-&gt;rm_body.rm_chunks[0] = 0; /* no read chunks */</div><div class='del'>-        header-&gt;rm_body.rm_chunks[1] = 0; /* no write chunks */</div><div class='del'>-        header-&gt;rm_body.rm_chunks[2] = 0; /* no reply chunks */</div><div class='del'>-</div><div class='del'>-        return;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-__rdma_send_reply_inline (rdma_peer_t *peer, rdma_ioq_t *entry,</div><div class='del'>-                          rdma_post_t *post, rdma_reply_info_t *reply_info)</div><div class='del'>-{</div><div class='del'>-        rdma_header_t  *header    = NULL;</div><div class='del'>-        int32_t         send_size = 0, ret = 0;</div><div class='del'>-        char           *buf       = NULL;</div><div class='del'>-        rdma_private_t *priv      = NULL;</div><div class='del'>-        rdma_device_t  *device    = NULL;</div><div class='del'>-</div><div class='del'>-        priv = peer-&gt;trans-&gt;private;</div><div class='del'>-        device = priv-&gt;device;</div><div class='del'>-</div><div class='del'>-        send_size = iov_length (entry-&gt;rpchdr, entry-&gt;rpchdr_count)</div><div class='del'>-                + iov_length (entry-&gt;proghdr, entry-&gt;proghdr_count)</div><div class='del'>-                + iov_length (entry-&gt;prog_payload, entry-&gt;prog_payload_count)</div><div class='del'>-                + sizeof (rdma_header_t); /*</div><div class='del'>-                                           * remember, no chunklists in the</div><div class='del'>-                                           * reply</div><div class='del'>-                                           */</div><div class='del'>-</div><div class='del'>-        if (send_size &gt; RDMA_INLINE_THRESHOLD) {</div><div class='del'>-                ret = __rdma_send_error (peer, entry, post, reply_info,</div><div class='del'>-                                         ERR_CHUNK);</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        header = (rdma_header_t *)post-&gt;buf;</div><div class='del'>-</div><div class='del'>-        __rdma_fill_reply_header (header, entry-&gt;rpchdr, reply_info,</div><div class='del'>-                                  peer-&gt;send_count);</div><div class='del'>-</div><div class='del'>-        buf = (char *)&amp;header-&gt;rm_body.rm_chunks[3];</div><div class='del'>-</div><div class='del'>-        if (entry-&gt;rpchdr_count != 0) {</div><div class='del'>-                iov_unload (buf, entry-&gt;rpchdr, entry-&gt;rpchdr_count);</div><div class='del'>-                buf += iov_length (entry-&gt;rpchdr, entry-&gt;rpchdr_count);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (entry-&gt;proghdr_count != 0) {</div><div class='del'>-                iov_unload (buf, entry-&gt;proghdr, entry-&gt;proghdr_count);</div><div class='del'>-                buf += iov_length (entry-&gt;proghdr, entry-&gt;proghdr_count);</div><div class='del'>-        }</div><div class='del'>-         </div><div class='del'>-        if (entry-&gt;prog_payload_count != 0) {</div><div class='del'>-                iov_unload (buf, entry-&gt;prog_payload,</div><div class='del'>-                            entry-&gt;prog_payload_count);</div><div class='del'>-                buf += iov_length (entry-&gt;prog_payload,</div><div class='del'>-                                   entry-&gt;prog_payload_count);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        rdma_post_ref (post);</div><div class='del'>-</div><div class='del'>-        ret = rdma_post_send (peer-&gt;qp, post, (buf - post-&gt;buf));</div><div class='del'>-        if (!ret) {</div><div class='del'>-                ret = send_size;</div><div class='del'>-        } else {</div><div class='del'>-                gf_log (RDMA_LOG_NAME, GF_LOG_DEBUG,</div><div class='del'>-                        "ibv_post_send failed with ret = %d", ret);</div><div class='del'>-                rdma_post_unref (post);</div><div class='del'>-                __rdma_disconnect (peer-&gt;trans);</div><div class='del'>-                ret = -1;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-__rdma_reply_encode_write_chunks (rdma_peer_t *peer, uint32_t payload_size,</div><div class='del'>-                                  rdma_post_t *post,</div><div class='del'>-                                  rdma_reply_info_t *reply_info,</div><div class='del'>-                                  uint32_t **ptr)</div><div class='del'>-{</div><div class='del'>-        uint32_t            chunk_size   = 0;</div><div class='del'>-        int32_t             ret          = -1;</div><div class='del'>-        rdma_write_array_t *target_array = NULL;</div><div class='del'>-        int                 i            = 0;</div><div class='del'>-</div><div class='del'>-        target_array = (rdma_write_array_t *)*ptr;</div><div class='del'>-</div><div class='del'>-        for (i = 0; i &lt; reply_info-&gt;wc_array-&gt;wc_nchunks; i++) {</div><div class='del'>-                chunk_size +=</div><div class='del'>-                        reply_info-&gt;wc_array-&gt;wc_array[i].wc_target.rs_length;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (chunk_size &lt; payload_size) {</div><div class='del'>-                gf_log (RDMA_LOG_NAME, GF_LOG_DEBUG,</div><div class='del'>-                        "length of payload (%d) is exceeding the total "</div><div class='del'>-                        "write chunk length (%d)", payload_size, chunk_size);</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        target_array-&gt;wc_discrim = hton32 (1);</div><div class='del'>-        for (i = 0; (i &lt; reply_info-&gt;wc_array-&gt;wc_nchunks)</div><div class='del'>-                     &amp;&amp; (payload_size != 0);</div><div class='del'>-             i++) {</div><div class='del'>-                target_array-&gt;wc_array[i].wc_target.rs_offset</div><div class='del'>-                        = hton64 (reply_info-&gt;wc_array-&gt;wc_array[i].wc_target.rs_offset);</div><div class='del'>-</div><div class='del'>-                target_array-&gt;wc_array[i].wc_target.rs_length</div><div class='del'>-                        = hton32 (min (payload_size,</div><div class='del'>-                                      reply_info-&gt;wc_array-&gt;wc_array[i].wc_target.rs_length));</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        target_array-&gt;wc_nchunks = hton32 (i);</div><div class='del'>-        target_array-&gt;wc_array[i].wc_target.rs_handle = 0; /* terminate</div><div class='del'>-                                                              chunklist */</div><div class='del'>-</div><div class='del'>-        ret = 0;</div><div class='del'>-</div><div class='del'>-        *ptr = &amp;target_array-&gt;wc_array[i].wc_target.rs_length;</div><div class='del'>-out:</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-inline int32_t</div><div class='del'>-__rdma_register_local_mr_for_rdma (rdma_peer_t *peer,</div><div class='del'>-                                   struct iovec *vector, int count,</div><div class='del'>-                                   rdma_post_context_t *ctx)</div><div class='del'>-{</div><div class='del'>-        int             i      = 0;</div><div class='del'>-        int32_t         ret    = -1;</div><div class='del'>-        rdma_private_t *priv   = NULL;</div><div class='del'>-        rdma_device_t  *device = NULL;</div><div class='del'>-</div><div class='del'>-        if ((ctx == NULL) || (vector == NULL)) {</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        priv = peer-&gt;trans-&gt;private;</div><div class='del'>-        device = priv-&gt;device;</div><div class='del'>-</div><div class='del'>-        for (i = 0; i &lt; count; i++) {</div><div class='del'>-                /* what if the memory is registered more than once?</div><div class='del'>-                 * Assume that a single write buffer is passed to afr, which</div><div class='del'>-                 * then passes it to its children. If more than one children</div><div class='del'>-                 * happen to use rdma, then the buffer is registered more than</div><div class='del'>-                 * once.</div><div class='del'>-                 * Ib-verbs specification says that multiple registrations of</div><div class='del'>-                 * same memory location is allowed. Refer to 10.6.3.8 of</div><div class='del'>-                 * Infiniband Architecture Specification Volume 1</div><div class='del'>-                 * (Release 1.2.1)</div><div class='del'>-                 */</div><div class='del'>-                ctx-&gt;mr[ctx-&gt;mr_count] = ibv_reg_mr (device-&gt;pd,</div><div class='del'>-                                                     vector[i].iov_base,</div><div class='del'>-                                                     vector[i].iov_len,</div><div class='del'>-                                                     IBV_ACCESS_LOCAL_WRITE);</div><div class='del'>-                if (ctx-&gt;mr[ctx-&gt;mr_count] == NULL) {</div><div class='del'>-                        goto out;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                ctx-&gt;mr_count++;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        ret = 0;</div><div class='del'>-out:</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-/* 1. assumes xfer_len of data is pointed by vector(s) starting from vec[*idx]</div><div class='del'>- * 2. modifies vec</div><div class='del'>- */</div><div class='del'>-int32_t</div><div class='del'>-__rdma_write (rdma_peer_t *peer, rdma_post_t *post, struct iovec *vec, </div><div class='del'>-              uint32_t xfer_len, int *idx, rdma_write_chunk_t *writech)</div><div class='del'>-{</div><div class='del'>-        int                size = 0, num_sge = 0, i = 0;</div><div class='del'>-        int32_t            ret  = -1;</div><div class='del'>-        struct ibv_sge    *sg_list = NULL;</div><div class='del'>-        struct ibv_send_wr wr = {</div><div class='del'>-                .opcode     = IBV_WR_RDMA_WRITE,</div><div class='del'>-                .send_flags = IBV_SEND_SIGNALED,</div><div class='del'>-        }, *bad_wr;</div><div class='del'>-</div><div class='del'>-        if ((peer == NULL) || (writech == NULL) || (idx == NULL)</div><div class='del'>-            || (post == NULL) || (vec == NULL) || (xfer_len == 0)) {</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        for (i = *idx; size &lt; xfer_len; i++) {</div><div class='del'>-                size += vec[i].iov_len;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        num_sge = i - *idx;</div><div class='del'>-</div><div class='del'>-        sg_list = GF_CALLOC (num_sge, sizeof (struct ibv_sge), gf_common_mt_sge);</div><div class='del'>-        if (sg_list == NULL) {</div><div class='del'>-                gf_log (RDMA_LOG_NAME, GF_LOG_ERROR, "out of memory");</div><div class='del'>-                ret = -1;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        for ((i = *idx), (num_sge = 0); (xfer_len != 0); i++, num_sge++) {</div><div class='del'>-                size = min (xfer_len, vec[i].iov_len);</div><div class='del'>-</div><div class='del'>-                sg_list [num_sge].addr = (unsigned long)vec[i].iov_base;</div><div class='del'>-                sg_list [num_sge].length = size;</div><div class='del'>-                sg_list [num_sge].lkey = post-&gt;ctx.mr[i]-&gt;lkey;</div><div class='del'>-</div><div class='del'>-                xfer_len -= size;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        *idx = i;</div><div class='del'>-</div><div class='del'>-        if (size &lt; vec[i - 1].iov_len) {</div><div class='del'>-                vec[i - 1].iov_base += size;</div><div class='del'>-                vec[i - 1].iov_len -= size;</div><div class='del'>-                *idx = i - 1;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        wr.sg_list = sg_list;</div><div class='del'>-        wr.num_sge = num_sge;</div><div class='del'>-        wr.wr_id = (unsigned long) rdma_post_ref (post);</div><div class='del'>-        wr.wr.rdma.rkey = writech-&gt;wc_target.rs_handle;</div><div class='del'>-        wr.wr.rdma.remote_addr = writech-&gt;wc_target.rs_offset;</div><div class='del'>-</div><div class='del'>-        ret = ibv_post_send(peer-&gt;qp, &amp;wr, &amp;bad_wr);</div><div class='del'>-</div><div class='del'>-        GF_FREE (sg_list);</div><div class='del'>-out:</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-__rdma_do_rdma_write (rdma_peer_t *peer, rdma_post_t *post,</div><div class='del'>-                      struct iovec *vector, int count, struct iobref *iobref,</div><div class='del'>-                      rdma_reply_info_t *reply_info)</div><div class='del'>-{</div><div class='del'>-        int             i                     = 0, payload_idx = 0;</div><div class='del'>-        uint32_t        payload_size          = 0, xfer_len = 0;</div><div class='del'>-        int32_t         ret                   = -1;</div><div class='del'>-                </div><div class='del'>-        if (count != 0) {</div><div class='del'>-                payload_size = iov_length (vector, count);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (payload_size == 0) {</div><div class='del'>-                ret = 0;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        ret = __rdma_register_local_mr_for_rdma (peer, vector, count,</div><div class='del'>-                                                 &amp;post-&gt;ctx);</div><div class='del'>-        if (ret == -1) {</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        post-&gt;ctx.iobref = iobref_ref (iobref);</div><div class='del'>-</div><div class='del'>-        for (i = 0; (i &lt; reply_info-&gt;wc_array-&gt;wc_nchunks)</div><div class='del'>-                     &amp;&amp; (payload_size != 0);</div><div class='del'>-             i++) {</div><div class='del'>-                xfer_len = min (payload_size,</div><div class='del'>-                                reply_info-&gt;wc_array-&gt;wc_array[i].wc_target.rs_length);</div><div class='del'>-</div><div class='del'>-                ret = __rdma_write (peer, post, vector, xfer_len, &amp;payload_idx,</div><div class='del'>-                                    &amp;reply_info-&gt;wc_array-&gt;wc_array[i]);</div><div class='del'>-                if (ret == -1) {</div><div class='del'>-                        goto out;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                payload_size -= xfer_len;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        ret = 0;</div><div class='del'>-out:</div><div class='del'>-</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-__rdma_send_reply_type_nomsg (rdma_peer_t *peer, rdma_ioq_t *entry,</div><div class='del'>-                              rdma_post_t *post, rdma_reply_info_t *reply_info)</div><div class='del'>-{</div><div class='del'>-        rdma_header_t      *header       = NULL;</div><div class='del'>-        char               *buf          = NULL;</div><div class='del'>-        uint32_t            payload_size = 0;</div><div class='del'>-        int                 count        = 0, i = 0;</div><div class='del'>-        rdma_private_t     *priv         = NULL;</div><div class='del'>-        rdma_device_t      *device       = NULL;</div><div class='del'>-        int32_t             ret          = 0;</div><div class='del'>-        struct iovec        vector[MAX_IOVEC];</div><div class='del'>-</div><div class='del'>-        priv = peer-&gt;trans-&gt;private;</div><div class='del'>-        device = priv-&gt;device;</div><div class='del'>-</div><div class='del'>-        header = (rdma_header_t *)post-&gt;buf;</div><div class='del'>-</div><div class='del'>-        __rdma_fill_reply_header (header, entry-&gt;rpchdr, reply_info,</div><div class='del'>-                                  peer-&gt;send_count);</div><div class='del'>-</div><div class='del'>-        header-&gt;rm_type = hton32 (RDMA_NOMSG);</div><div class='del'>-</div><div class='del'>-        payload_size = iov_length (entry-&gt;rpchdr, entry-&gt;rpchdr_count) +</div><div class='del'>-                iov_length (entry-&gt;proghdr, entry-&gt;proghdr_count);</div><div class='del'>-</div><div class='del'>-        /* encode reply chunklist */</div><div class='del'>-        buf = (char *)&amp;header-&gt;rm_body.rm_chunks[2];</div><div class='del'>-        ret = __rdma_reply_encode_write_chunks (peer, payload_size, post,</div><div class='del'>-                                                reply_info, (uint32_t **)&amp;buf);</div><div class='del'>-        if (ret == -1) {</div><div class='del'>-                gf_log (RDMA_LOG_NAME, GF_LOG_DEBUG,</div><div class='del'>-                        "encoding write chunks failed");</div><div class='del'>-                ret = __rdma_send_error (peer, entry, post, reply_info,</div><div class='del'>-                                         ERR_CHUNK);</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        rdma_post_ref (post);</div><div class='del'>-</div><div class='del'>-        for (i = 0; i &lt; entry-&gt;rpchdr_count; i++) {</div><div class='del'>-                vector[count++] = entry-&gt;rpchdr[i];</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        for (i = 0; i &lt; entry-&gt;proghdr_count; i++) {</div><div class='del'>-                vector[count++] = entry-&gt;proghdr[i];</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        ret = __rdma_do_rdma_write (peer, post, vector, count, entry-&gt;iobref,</div><div class='del'>-                                    reply_info);</div><div class='del'>-        if (ret == -1) {</div><div class='del'>-                gf_log (RDMA_LOG_NAME, GF_LOG_DEBUG,</div><div class='del'>-                        "rdma write to client failed");</div><div class='del'>-                rdma_post_unref (post);</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        ret = rdma_post_send (peer-&gt;qp, post, (buf - post-&gt;buf));</div><div class='del'>-        if (ret == -1) {</div><div class='del'>-                gf_log (RDMA_LOG_NAME, GF_LOG_DEBUG,</div><div class='del'>-                        "rdma send to client failed");</div><div class='del'>-                rdma_post_unref (post);</div><div class='del'>-        } else {</div><div class='del'>-                ret = payload_size;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-__rdma_send_reply_type_msg (rdma_peer_t *peer, rdma_ioq_t *entry,</div><div class='del'>-                            rdma_post_t *post, rdma_reply_info_t *reply_info)</div><div class='del'>-{</div><div class='del'>-        rdma_header_t      *header       = NULL;</div><div class='del'>-        int32_t             send_size    = 0, ret = 0;</div><div class='del'>-        char               *ptr          = NULL;</div><div class='del'>-        uint32_t            payload_size = 0;</div><div class='del'>-        rdma_private_t     *priv         = NULL;</div><div class='del'>-        rdma_device_t      *device       = NULL;</div><div class='del'>-</div><div class='del'>-        priv = peer-&gt;trans-&gt;private;</div><div class='del'>-        device = priv-&gt;device;</div><div class='del'>-</div><div class='del'>-        send_size = iov_length (entry-&gt;rpchdr, entry-&gt;rpchdr_count)</div><div class='del'>-                + iov_length (entry-&gt;proghdr, entry-&gt;proghdr_count)</div><div class='del'>-                + RDMA_MAX_HEADER_SIZE;</div><div class='del'>-</div><div class='del'>-        if (send_size &gt; RDMA_INLINE_THRESHOLD) {</div><div class='del'>-                gf_log (RDMA_LOG_NAME, GF_LOG_DEBUG,</div><div class='del'>-                        "client has provided only write chunks, but the "</div><div class='del'>-                        "combined size of rpc and program header (%d) is "</div><div class='del'>-                        "exceeding the size of msg that can be sent using "</div><div class='del'>-                        "RDMA send (%d)", send_size, RDMA_INLINE_THRESHOLD);</div><div class='del'>-</div><div class='del'>-                ret = __rdma_send_error (peer, entry, post, reply_info,</div><div class='del'>-                                         ERR_CHUNK);</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        header = (rdma_header_t *)post-&gt;buf;</div><div class='del'>-</div><div class='del'>-        __rdma_fill_reply_header (header, entry-&gt;rpchdr, reply_info,</div><div class='del'>-                                  peer-&gt;send_count);</div><div class='del'>-</div><div class='del'>-        payload_size = iov_length (entry-&gt;prog_payload,</div><div class='del'>-                                   entry-&gt;prog_payload_count);</div><div class='del'>-        ptr = (char *)&amp;header-&gt;rm_body.rm_chunks[1];</div><div class='del'>-</div><div class='del'>-        ret = __rdma_reply_encode_write_chunks (peer, payload_size, post,</div><div class='del'>-                                                reply_info, (uint32_t **)&amp;ptr);</div><div class='del'>-        if (ret == -1) {</div><div class='del'>-                gf_log (RDMA_LOG_NAME, GF_LOG_DEBUG,</div><div class='del'>-                        "encoding write chunks failed");</div><div class='del'>-                ret = __rdma_send_error (peer, entry, post, reply_info,</div><div class='del'>-                                         ERR_CHUNK);</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        *(uint32_t *)ptr = 0;          /* terminate reply chunklist */</div><div class='del'>-        ptr += sizeof (uint32_t);</div><div class='del'>-</div><div class='del'>-        rdma_post_ref (post);</div><div class='del'>-</div><div class='del'>-        ret = __rdma_do_rdma_write (peer, post, entry-&gt;prog_payload,</div><div class='del'>-                                    entry-&gt;prog_payload_count, entry-&gt;iobref,</div><div class='del'>-                                    reply_info);</div><div class='del'>-        if (ret == -1) {</div><div class='del'>-                gf_log (RDMA_LOG_NAME, GF_LOG_DEBUG,</div><div class='del'>-                        "rdma write to client failed");</div><div class='del'>-                rdma_post_unref (post);</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        iov_unload (ptr, entry-&gt;rpchdr, entry-&gt;rpchdr_count);</div><div class='del'>-        ptr += iov_length (entry-&gt;rpchdr, entry-&gt;rpchdr_count);</div><div class='del'>-</div><div class='del'>-        iov_unload (ptr, entry-&gt;proghdr, entry-&gt;proghdr_count);</div><div class='del'>-        ptr += iov_length (entry-&gt;proghdr, entry-&gt;proghdr_count);</div><div class='del'>-</div><div class='del'>-        ret = rdma_post_send (peer-&gt;qp, post, (ptr - post-&gt;buf));</div><div class='del'>-        if (ret == -1) {</div><div class='del'>-                gf_log (RDMA_LOG_NAME, GF_LOG_DEBUG,</div><div class='del'>-                        "rdma send to client failed");</div><div class='del'>-                rdma_post_unref (post);</div><div class='del'>-        } else {</div><div class='del'>-                ret = send_size + payload_size;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-void</div><div class='del'>-rdma_reply_info_destroy (rdma_reply_info_t *reply_info)</div><div class='del'>-{</div><div class='del'>-        if (reply_info == NULL) {</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (reply_info-&gt;wc_array != NULL) {</div><div class='del'>-                GF_FREE (reply_info-&gt;wc_array);</div><div class='del'>-                reply_info-&gt;wc_array = NULL;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        mem_put (reply_info-&gt;pool, reply_info);</div><div class='del'>-out:</div><div class='del'>-        return;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-rdma_reply_info_t *</div><div class='del'>-rdma_reply_info_alloc (rdma_peer_t *peer)</div><div class='del'>-{</div><div class='del'>-        rdma_reply_info_t *reply_info = NULL;</div><div class='del'>-        rdma_private_t    *priv       = NULL;</div><div class='del'>-</div><div class='del'>-        priv = peer-&gt;trans-&gt;private;</div><div class='del'>-</div><div class='del'>-        reply_info = mem_get (priv-&gt;reply_info_pool);</div><div class='del'>-        if (reply_info == NULL) {</div><div class='del'>-                gf_log (RDMA_LOG_NAME, GF_LOG_ERROR, "out of memory");</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        memset (reply_info, 0, sizeof (*reply_info));</div><div class='del'>-        reply_info-&gt;pool = priv-&gt;reply_info_pool;</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        return reply_info;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-__rdma_ioq_churn_reply (rdma_peer_t *peer, rdma_ioq_t *entry, rdma_post_t *post)</div><div class='del'>-{</div><div class='del'>-        rdma_reply_info_t  *reply_info = NULL;</div><div class='del'>-        int32_t             ret        = -1;</div><div class='del'>-        rdma_chunktype_t    type       = rdma_noch;</div><div class='del'>-</div><div class='del'>-        if ((peer == NULL) || (entry == NULL) || (post == NULL)) {</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        reply_info = entry-&gt;msg.reply_info;</div><div class='del'>-        if (reply_info != NULL) {</div><div class='del'>-                type = reply_info-&gt;type;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        switch (type) {</div><div class='del'>-        case rdma_noch:</div><div class='del'>-                ret = __rdma_send_reply_inline (peer, entry, post, reply_info);</div><div class='del'>-                break;</div><div class='del'>-</div><div class='del'>-        case rdma_replych:</div><div class='del'>-                ret = __rdma_send_reply_type_nomsg (peer, entry, post,</div><div class='del'>-                                                    reply_info);</div><div class='del'>-                break;</div><div class='del'>-</div><div class='del'>-        case rdma_writech:</div><div class='del'>-                ret = __rdma_send_reply_type_msg (peer, entry, post,</div><div class='del'>-                                                  reply_info);</div><div class='del'>-                break;</div><div class='del'>-</div><div class='del'>-        default:</div><div class='del'>-                gf_log (RDMA_LOG_NAME, GF_LOG_DEBUG,</div><div class='del'>-                        "invalid chunktype (%d) specified for sending reply",</div><div class='del'>-                        type);</div><div class='del'>-                break;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (reply_info != NULL) {</div><div class='del'>-                rdma_reply_info_destroy (reply_info);</div><div class='del'>-        }</div><div class='del'>-out:</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-__rdma_ioq_churn_entry (rdma_peer_t *peer, rdma_ioq_t *entry)</div><div class='del'>-{</div><div class='del'>-        int32_t         ret     = 0, quota = 0;</div><div class='del'>-        rdma_private_t *priv    = NULL;</div><div class='del'>-        rdma_device_t  *device  = NULL;</div><div class='del'>-        rdma_options_t *options = NULL;</div><div class='del'>-        rdma_post_t    *post    = NULL;</div><div class='del'>-</div><div class='del'>-        priv = peer-&gt;trans-&gt;private;</div><div class='del'>-        options = &amp;priv-&gt;options;</div><div class='del'>-        device = priv-&gt;device;</div><div class='del'>-</div><div class='del'>-        quota = __rdma_quota_get (peer);</div><div class='del'>-        if (quota &gt; 0) {</div><div class='del'>-                post = rdma_get_post (&amp;device-&gt;sendq);</div><div class='del'>-                if (post == NULL) { </div><div class='del'>-                        post = rdma_new_post (device,</div><div class='del'>-                                              (options-&gt;send_size + 2048),</div><div class='del'>-                                              RDMA_SEND_POST);</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                if (post == NULL) {</div><div class='del'>-                        ret = -1;</div><div class='del'>-                        goto out;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                if (entry-&gt;is_request) {</div><div class='del'>-                        ret = __rdma_ioq_churn_request (peer, entry, post);</div><div class='del'>-                } else {</div><div class='del'>-                        ret = __rdma_ioq_churn_reply (peer, entry, post);</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                if (ret != 0) {</div><div class='del'>-                        __rdma_ioq_entry_free (entry);</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-static int32_t</div><div class='del'>-__rdma_ioq_churn (rdma_peer_t *peer)</div><div class='del'>-{</div><div class='del'>-        rdma_ioq_t *entry = NULL;</div><div class='del'>-        int32_t ret = 0;</div><div class='del'>-</div><div class='del'>-        while (!list_empty (&amp;peer-&gt;ioq))</div><div class='del'>-        {</div><div class='del'>-                /* pick next entry */</div><div class='del'>-                entry = peer-&gt;ioq_next;</div><div class='del'>-</div><div class='del'>-                ret = __rdma_ioq_churn_entry (peer, entry);</div><div class='del'>-</div><div class='del'>-                if (ret &lt;= 0)</div><div class='del'>-                        break;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        /*</div><div class='del'>-          list_for_each_entry_safe (entry, dummy, &amp;peer-&gt;ioq, list) {</div><div class='del'>-          ret = __rdma_ioq_churn_entry (peer, entry);</div><div class='del'>-          if (ret &lt;= 0) {</div><div class='del'>-          break;</div><div class='del'>-          }</div><div class='del'>-          }</div><div class='del'>-        */</div><div class='del'>-</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-static int32_t</div><div class='del'>-rdma_writev (rpc_transport_t *this,</div><div class='del'>-             rdma_ioq_t *entry)</div><div class='del'>-{</div><div class='del'>-        int32_t ret = 0, need_append = 1;</div><div class='del'>-        rdma_private_t *priv = this-&gt;private;</div><div class='del'>-        rdma_peer_t  *peer = NULL;</div><div class='del'>-</div><div class='del'>-        pthread_mutex_lock (&amp;priv-&gt;write_mutex);</div><div class='del'>-        {</div><div class='del'>-                if (!priv-&gt;connected) {</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-                                "rdma is not connected to post a "</div><div class='del'>-                                "send request");</div><div class='del'>-                        ret = -1;</div><div class='del'>-                        goto unlock;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                peer = &amp;priv-&gt;peer;</div><div class='del'>-                if (list_empty (&amp;peer-&gt;ioq)) {</div><div class='del'>-                        ret = __rdma_ioq_churn_entry (peer, entry);</div><div class='del'>-                        if (ret &gt; 0) {</div><div class='del'>-                                need_append = 0;</div><div class='del'>-                        }</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                if (need_append) {</div><div class='del'>-                        list_add_tail (&amp;entry-&gt;list, &amp;peer-&gt;ioq);</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='del'>-unlock:</div><div class='del'>-        pthread_mutex_unlock (&amp;priv-&gt;write_mutex);</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-rdma_ioq_t *</div><div class='del'>-rdma_ioq_new (rpc_transport_t *this, rpc_transport_data_t *data)</div><div class='del'>-{</div><div class='del'>-        rdma_ioq_t          *entry     = NULL;</div><div class='del'>-        int                  count     = 0, i = 0;</div><div class='del'>-        rpc_transport_msg_t *msg       = NULL;</div><div class='del'>-        rdma_private_t      *priv      = NULL;</div><div class='del'>-</div><div class='del'>-        if ((data == NULL) || (this == NULL)) {</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        priv = this-&gt;private;</div><div class='del'>-        /* TODO: use mem-pool */</div><div class='del'>-        entry = mem_get (priv-&gt;ioq_pool);</div><div class='del'>-        if (entry == NULL) {</div><div class='del'>-                gf_log (RDMA_LOG_NAME, GF_LOG_ERROR, "out of memory");</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-        memset (entry, 0, sizeof (*entry));</div><div class='del'>-        entry-&gt;pool = priv-&gt;ioq_pool;</div><div class='del'>-</div><div class='del'>-        if (data-&gt;is_request) {</div><div class='del'>-                msg = &amp;data-&gt;data.req.msg;</div><div class='del'>-                if (data-&gt;data.req.rsp.rsphdr_count != 0) {</div><div class='del'>-                        for (i = 0; i &lt; data-&gt;data.req.rsp.rsphdr_count; i++) {</div><div class='del'>-                                entry-&gt;msg.request.rsphdr_vec[i]</div><div class='del'>-                                        = data-&gt;data.req.rsp.rsphdr[i];</div><div class='del'>-                        }</div><div class='del'>-</div><div class='del'>-                        entry-&gt;msg.request.rsphdr_count =</div><div class='del'>-                                data-&gt;data.req.rsp.rsphdr_count;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                if (data-&gt;data.req.rsp.rsp_payload_count != 0) {</div><div class='del'>-                        for (i = 0; i &lt; data-&gt;data.req.rsp.rsp_payload_count;</div><div class='del'>-                             i++) {</div><div class='del'>-                                entry-&gt;msg.request.rsp_payload[i] </div><div class='del'>-                                        = data-&gt;data.req.rsp.rsp_payload[i];</div><div class='del'>-                        }</div><div class='del'>-</div><div class='del'>-                        entry-&gt;msg.request.rsp_payload_count =</div><div class='del'>-                                data-&gt;data.req.rsp.rsp_payload_count;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                entry-&gt;msg.request.rpc_req = data-&gt;data.req.rpc_req;</div><div class='del'>-</div><div class='del'>-                if (data-&gt;data.req.rsp.rsp_iobref != NULL) {</div><div class='del'>-                        entry-&gt;msg.request.rsp_iobref</div><div class='del'>-                                = iobref_ref (data-&gt;data.req.rsp.rsp_iobref);</div><div class='del'>-                }</div><div class='del'>-        } else {</div><div class='del'>-                msg = &amp;data-&gt;data.reply.msg;</div><div class='del'>-                entry-&gt;msg.reply_info = data-&gt;data.reply.private;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        entry-&gt;is_request = data-&gt;is_request;</div><div class='del'>-</div><div class='del'>-        count = msg-&gt;rpchdrcount + msg-&gt;proghdrcount + msg-&gt;progpayloadcount;</div><div class='del'>-</div><div class='del'>-        assert (count &lt;= MAX_IOVEC);</div><div class='del'>-</div><div class='del'>-        if (msg-&gt;rpchdr != NULL) {</div><div class='del'>-                memcpy (&amp;entry-&gt;rpchdr[0], msg-&gt;rpchdr,</div><div class='del'>-                        sizeof (struct iovec) * msg-&gt;rpchdrcount);</div><div class='del'>-                entry-&gt;rpchdr_count = msg-&gt;rpchdrcount;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (msg-&gt;proghdr != NULL) {</div><div class='del'>-                memcpy (&amp;entry-&gt;proghdr[0], msg-&gt;proghdr,</div><div class='del'>-                        sizeof (struct iovec) * msg-&gt;proghdrcount);</div><div class='del'>-                entry-&gt;proghdr_count = msg-&gt;proghdrcount;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (msg-&gt;progpayload != NULL) {</div><div class='del'>-                memcpy (&amp;entry-&gt;prog_payload[0], msg-&gt;progpayload,</div><div class='del'>-                        sizeof (struct iovec) * msg-&gt;progpayloadcount);</div><div class='del'>-                entry-&gt;prog_payload_count = msg-&gt;progpayloadcount;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (msg-&gt;iobref != NULL) {</div><div class='del'>-                entry-&gt;iobref = iobref_ref (msg-&gt;iobref);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        INIT_LIST_HEAD (&amp;entry-&gt;list);</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        return entry;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-rdma_submit_request (rpc_transport_t *this,</div><div class='del'>-                     rpc_transport_req_t *req)</div><div class='del'>-{</div><div class='del'>-        int32_t               ret = 0;</div><div class='del'>-        rdma_ioq_t       *entry = NULL;</div><div class='del'>-        rpc_transport_data_t  data = {0, }; </div><div class='del'>-</div><div class='del'>-        if (req == NULL) {</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        data.is_request = 1;</div><div class='del'>-        data.data.req = *req;</div><div class='del'>-</div><div class='del'>-        entry = rdma_ioq_new (this, &amp;data);</div><div class='del'>-        if (entry == NULL) {</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        ret = rdma_writev (this, entry);</div><div class='del'>-</div><div class='del'>-        if (ret &gt; 0) {</div><div class='del'>-                ret = 0;</div><div class='del'>-        } else if (ret &lt; 0) {</div><div class='del'>-                rpc_transport_disconnect (this);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-rdma_submit_reply (rpc_transport_t *this, rpc_transport_reply_t *reply)</div><div class='del'>-{</div><div class='del'>-        int32_t               ret = 0;</div><div class='del'>-        rdma_ioq_t           *entry = NULL;</div><div class='del'>-        rpc_transport_data_t  data = {0, };</div><div class='del'>-</div><div class='del'>-        if (reply == NULL) {</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        data.data.reply = *reply;</div><div class='del'>-</div><div class='del'>-        entry = rdma_ioq_new (this, &amp;data);</div><div class='del'>-        if (entry == NULL) {</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        ret = rdma_writev (this, entry);</div><div class='del'>-        if (ret &gt; 0) {</div><div class='del'>-                ret = 0;</div><div class='del'>-        } else if (ret &lt; 0) {</div><div class='del'>-                rpc_transport_disconnect (this);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-#if 0</div><div class='del'>-static int</div><div class='del'>-rdma_receive (rpc_transport_t *this, char **hdr_p, size_t *hdrlen_p,</div><div class='del'>-              struct iobuf **iobuf_p)</div><div class='del'>-{</div><div class='del'>-        rdma_private_t *priv = this-&gt;private;</div><div class='del'>-        /* TODO: return error if !priv-&gt;connected, check with locks */</div><div class='del'>-        /* TODO: boundry checks for data_ptr/offset */</div><div class='del'>-        char *copy_from = NULL;</div><div class='del'>-        rdma_header_t *header = NULL;</div><div class='del'>-        uint32_t size1, size2, data_len = 0;</div><div class='del'>-        char *hdr = NULL;</div><div class='del'>-        struct iobuf *iobuf = NULL;</div><div class='del'>-        int32_t ret = 0;</div><div class='del'>-</div><div class='del'>-        pthread_mutex_lock (&amp;priv-&gt;recv_mutex);</div><div class='del'>-        {</div><div class='del'>-/*</div><div class='del'>-  while (!priv-&gt;data_ptr)</div><div class='del'>-  pthread_cond_wait (&amp;priv-&gt;recv_cond, &amp;priv-&gt;recv_mutex);</div><div class='del'>-*/</div><div class='del'>-</div><div class='del'>-                copy_from = priv-&gt;data_ptr + priv-&gt;data_offset;</div><div class='del'>-</div><div class='del'>-                priv-&gt;data_ptr = NULL;</div><div class='del'>-                data_len = priv-&gt;data_len;</div><div class='del'>-                pthread_cond_broadcast (&amp;priv-&gt;recv_cond);</div><div class='del'>-        }</div><div class='del'>-        pthread_mutex_unlock (&amp;priv-&gt;recv_mutex);</div><div class='del'>-</div><div class='del'>-        header = (rdma_header_t *)copy_from;</div><div class='del'>-        if (strcmp (header-&gt;colonO, ":O")) {</div><div class='del'>-                gf_log (RDMA_LOG_NAME, GF_LOG_DEBUG,</div><div class='del'>-                        "%s: corrupt header received", this-&gt;name);</div><div class='del'>-                ret = -1;</div><div class='del'>-                goto err;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        size1 = ntoh32 (header-&gt;size1);</div><div class='del'>-        size2 = ntoh32 (header-&gt;size2);</div><div class='del'>-</div><div class='del'>-        if (data_len != (size1 + size2 + sizeof (*header))) {</div><div class='del'>-                gf_log (RDMA_LOG_NAME, GF_LOG_DEBUG,</div><div class='del'>-                        "%s: sizeof data read from transport is not equal "</div><div class='del'>-                        "to the size specified in the header",</div><div class='del'>-                        this-&gt;name);</div><div class='del'>-                ret = -1;</div><div class='del'>-                goto err;</div><div class='del'>-        }</div><div class='del'>-                  </div><div class='del'>-        copy_from += sizeof (*header);</div><div class='del'>-</div><div class='del'>-        if (size1) {</div><div class='del'>-                hdr = GF_CALLOC (1, size1, gf_common_mt_char);</div><div class='del'>-                if (!hdr) {</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-                                "unable to allocate header for peer %s",</div><div class='del'>-                                this-&gt;peerinfo.identifier);</div><div class='del'>-                        ret = -ENOMEM;</div><div class='del'>-                        goto err;</div><div class='del'>-                }</div><div class='del'>-                memcpy (hdr, copy_from, size1);</div><div class='del'>-                copy_from += size1;</div><div class='del'>-                *hdr_p = hdr;</div><div class='del'>-        }</div><div class='del'>-        *hdrlen_p = size1;</div><div class='del'>-</div><div class='del'>-        if (size2) {</div><div class='del'>-                iobuf = iobuf_get (this-&gt;ctx-&gt;iobuf_pool);</div><div class='del'>-                if (!iobuf) {</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-                                "unable to allocate IO buffer for peer %s",</div><div class='del'>-                                this-&gt;peerinfo.identifier);</div><div class='del'>-                        ret = -ENOMEM;</div><div class='del'>-                        goto err;</div><div class='del'>-                }</div><div class='del'>-                memcpy (iobuf-&gt;ptr, copy_from, size2);</div><div class='del'>-                *iobuf_p = iobuf;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-err:</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-static void</div><div class='del'>-rdma_destroy_cq (rpc_transport_t *this)</div><div class='del'>-{</div><div class='del'>-        rdma_private_t *priv = this-&gt;private;</div><div class='del'>-        rdma_device_t *device = priv-&gt;device;</div><div class='del'>-  </div><div class='del'>-        if (device-&gt;recv_cq)</div><div class='del'>-                ibv_destroy_cq (device-&gt;recv_cq);</div><div class='del'>-        device-&gt;recv_cq = NULL;</div><div class='del'>-  </div><div class='del'>-        if (device-&gt;send_cq)</div><div class='del'>-                ibv_destroy_cq (device-&gt;send_cq);</div><div class='del'>-        device-&gt;send_cq = NULL;</div><div class='del'>-</div><div class='del'>-        return;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-static int32_t</div><div class='del'>-rdma_create_cq (rpc_transport_t *this)</div><div class='del'>-{</div><div class='del'>-        rdma_private_t *priv = this-&gt;private;</div><div class='del'>-        rdma_options_t *options = &amp;priv-&gt;options;</div><div class='del'>-        rdma_device_t *device = priv-&gt;device;</div><div class='del'>-        int32_t ret = 0;</div><div class='del'>-</div><div class='del'>-        device-&gt;recv_cq = ibv_create_cq (priv-&gt;device-&gt;context,</div><div class='del'>-                                         options-&gt;recv_count * 2,</div><div class='del'>-                                         device,</div><div class='del'>-                                         device-&gt;recv_chan,</div><div class='del'>-                                         0);</div><div class='del'>-        if (!device-&gt;recv_cq) {</div><div class='del'>-                gf_log (RDMA_LOG_NAME,</div><div class='del'>-                        GF_LOG_ERROR,</div><div class='del'>-                        "%s: creation of CQ failed",</div><div class='del'>-                        this-&gt;name);</div><div class='del'>-                ret = -1;</div><div class='del'>-        } else if (ibv_req_notify_cq (device-&gt;recv_cq, 0)) {</div><div class='del'>-                gf_log (RDMA_LOG_NAME,</div><div class='del'>-                        GF_LOG_ERROR,</div><div class='del'>-                        "%s: ibv_req_notify_cq on CQ failed",</div><div class='del'>-                        this-&gt;name);</div><div class='del'>-                ret = -1;</div><div class='del'>-        }</div><div class='del'>-    </div><div class='del'>-        do {</div><div class='del'>-                /* TODO: make send_cq size dynamically adaptive */</div><div class='del'>-                device-&gt;send_cq = ibv_create_cq (priv-&gt;device-&gt;context,</div><div class='del'>-                                                 options-&gt;send_count * 1024,</div><div class='del'>-                                                 device,</div><div class='del'>-                                                 device-&gt;send_chan,</div><div class='del'>-                                                 0);</div><div class='del'>-                if (!device-&gt;send_cq) {</div><div class='del'>-                        gf_log (RDMA_LOG_NAME,</div><div class='del'>-                                GF_LOG_ERROR,</div><div class='del'>-                                "%s: creation of send_cq failed",</div><div class='del'>-                                this-&gt;name);</div><div class='del'>-                        ret = -1;</div><div class='del'>-                        break;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                if (ibv_req_notify_cq (device-&gt;send_cq, 0)) {</div><div class='del'>-                        gf_log (RDMA_LOG_NAME,</div><div class='del'>-                                GF_LOG_ERROR,</div><div class='del'>-                                "%s: ibv_req_notify_cq on send_cq failed",</div><div class='del'>-                                this-&gt;name);</div><div class='del'>-                        ret = -1;</div><div class='del'>-                        break;</div><div class='del'>-                }</div><div class='del'>-        } while (0);</div><div class='del'>-</div><div class='del'>-        if (ret != 0)</div><div class='del'>-                rdma_destroy_cq (this);</div><div class='del'>-</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-static int</div><div class='del'>-rdma_register_peer (rdma_device_t *device,</div><div class='del'>-                    int32_t qp_num,</div><div class='del'>-                    rdma_peer_t *peer)</div><div class='del'>-{</div><div class='del'>-        struct _qpent *ent   = NULL;</div><div class='del'>-        rdma_qpreg_t  *qpreg = NULL;</div><div class='del'>-        int32_t        hash  = 0;</div><div class='del'>-        int            ret   = -1;</div><div class='del'>-</div><div class='del'>-        qpreg = &amp;device-&gt;qpreg;</div><div class='del'>-        hash = qp_num % 42;</div><div class='del'>-</div><div class='del'>-        pthread_mutex_lock (&amp;qpreg-&gt;lock);</div><div class='del'>-        {</div><div class='del'>-                ent = qpreg-&gt;ents[hash].next;</div><div class='del'>-                while ((ent != &amp;qpreg-&gt;ents[hash]) &amp;&amp; (ent-&gt;qp_num != qp_num)) {</div><div class='del'>-                        ent = ent-&gt;next;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                if (ent-&gt;qp_num == qp_num) {</div><div class='del'>-                        ret = 0;</div><div class='del'>-                        goto unlock;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                ent = (struct _qpent *) GF_CALLOC (1, sizeof (*ent),</div><div class='del'>-                                                   gf_common_mt_qpent);</div><div class='del'>-                if (ent == NULL) {</div><div class='del'>-                        gf_log (RDMA_LOG_NAME, GF_LOG_ERROR, "out of memory");</div><div class='del'>-                        goto unlock;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                /* TODO: ref reg-&gt;peer */</div><div class='del'>-                ent-&gt;peer = peer;</div><div class='del'>-                ent-&gt;next = &amp;qpreg-&gt;ents[hash];</div><div class='del'>-                ent-&gt;prev = ent-&gt;next-&gt;prev;</div><div class='del'>-                ent-&gt;next-&gt;prev = ent;</div><div class='del'>-                ent-&gt;prev-&gt;next = ent;</div><div class='del'>-                ent-&gt;qp_num = qp_num;</div><div class='del'>-                qpreg-&gt;count++;</div><div class='del'>-                ret = 0;</div><div class='del'>-        }</div><div class='del'>-unlock:</div><div class='del'>-        pthread_mutex_unlock (&amp;qpreg-&gt;lock);</div><div class='del'>-</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-static void</div><div class='del'>-rdma_unregister_peer (rdma_device_t *device,</div><div class='del'>-                      int32_t qp_num)</div><div class='del'>-{</div><div class='del'>-        struct _qpent *ent;</div><div class='del'>-        rdma_qpreg_t *qpreg = &amp;device-&gt;qpreg;</div><div class='del'>-        int32_t hash = qp_num % 42;</div><div class='del'>-</div><div class='del'>-        pthread_mutex_lock (&amp;qpreg-&gt;lock);</div><div class='del'>-        ent = qpreg-&gt;ents[hash].next;</div><div class='del'>-        while ((ent != &amp;qpreg-&gt;ents[hash]) &amp;&amp; (ent-&gt;qp_num != qp_num))</div><div class='del'>-                ent = ent-&gt;next;</div><div class='del'>-        if (ent-&gt;qp_num != qp_num) {</div><div class='del'>-                pthread_mutex_unlock (&amp;qpreg-&gt;lock);</div><div class='del'>-                return;</div><div class='del'>-        }</div><div class='del'>-        ent-&gt;prev-&gt;next = ent-&gt;next;</div><div class='del'>-        ent-&gt;next-&gt;prev = ent-&gt;prev;</div><div class='del'>-        /* TODO: unref reg-&gt;peer */</div><div class='del'>-        GF_FREE (ent);</div><div class='del'>-        qpreg-&gt;count--;</div><div class='del'>-        pthread_mutex_unlock (&amp;qpreg-&gt;lock);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-static rdma_peer_t *</div><div class='del'>-__rdma_lookup_peer (rdma_device_t *device, int32_t qp_num)</div><div class='del'>-{</div><div class='del'>-        struct _qpent    *ent   = NULL;</div><div class='del'>-        rdma_peer_t  *peer  = NULL;</div><div class='del'>-        rdma_qpreg_t *qpreg = NULL;</div><div class='del'>-        int32_t hash            = 0;</div><div class='del'>-</div><div class='del'>-        qpreg = &amp;device-&gt;qpreg;</div><div class='del'>-        hash = qp_num % 42;</div><div class='del'>-        ent = qpreg-&gt;ents[hash].next;</div><div class='del'>-        while ((ent != &amp;qpreg-&gt;ents[hash]) &amp;&amp; (ent-&gt;qp_num != qp_num))</div><div class='del'>-                ent = ent-&gt;next;</div><div class='del'>-</div><div class='del'>-        if (ent != &amp;qpreg-&gt;ents[hash]) {</div><div class='del'>-                peer = ent-&gt;peer;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        return peer;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-/*</div><div class='del'>-  static rdma_peer_t *</div><div class='del'>-  rdma_lookup_peer (rdma_device_t *device,</div><div class='del'>-  int32_t qp_num)</div><div class='del'>-  {</div><div class='del'>-  rdma_qpreg_t *qpreg = NULL;</div><div class='del'>-  rdma_peer_t  *peer  = NULL;</div><div class='del'>- </div><div class='del'>-  qpreg = &amp;device-&gt;qpreg;</div><div class='del'>-  pthread_mutex_lock (&amp;qpreg-&gt;lock);</div><div class='del'>-  {</div><div class='del'>-  peer = __rdma_lookup_peer (device, qp_num);</div><div class='del'>-  }</div><div class='del'>-  pthread_mutex_unlock (&amp;qpreg-&gt;lock);</div><div class='del'>-</div><div class='del'>-  return peer;</div><div class='del'>-  }</div><div class='del'>-*/</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-static void</div><div class='del'>-__rdma_destroy_qp (rpc_transport_t *this)</div><div class='del'>-{</div><div class='del'>-        rdma_private_t *priv = this-&gt;private;</div><div class='del'>-</div><div class='del'>-        if (priv-&gt;peer.qp) {</div><div class='del'>-                rdma_unregister_peer (priv-&gt;device, priv-&gt;peer.qp-&gt;qp_num);</div><div class='del'>-                ibv_destroy_qp (priv-&gt;peer.qp);</div><div class='del'>-        }</div><div class='del'>-        priv-&gt;peer.qp = NULL;</div><div class='del'>-</div><div class='del'>-        return;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-static int32_t</div><div class='del'>-rdma_create_qp (rpc_transport_t *this)</div><div class='del'>-{</div><div class='del'>-        rdma_private_t *priv = this-&gt;private;</div><div class='del'>-        rdma_options_t *options = &amp;priv-&gt;options;</div><div class='del'>-        rdma_device_t *device = priv-&gt;device;</div><div class='del'>-        int32_t ret = 0;</div><div class='del'>-        rdma_peer_t *peer;</div><div class='del'>-</div><div class='del'>-        peer = &amp;priv-&gt;peer;</div><div class='del'>-        struct ibv_qp_init_attr init_attr = {</div><div class='del'>-                .send_cq        = device-&gt;send_cq,</div><div class='del'>-                .recv_cq        = device-&gt;recv_cq,</div><div class='del'>-                .srq            = device-&gt;srq,</div><div class='del'>-                .cap            = {</div><div class='del'>-                        .max_send_wr  = peer-&gt;send_count,</div><div class='del'>-                        .max_recv_wr  = peer-&gt;recv_count,</div><div class='del'>-                        .max_send_sge = 1,</div><div class='del'>-                        .max_recv_sge = 1</div><div class='del'>-                },</div><div class='del'>-                .qp_type = IBV_QPT_RC</div><div class='del'>-        };</div><div class='del'>-  </div><div class='del'>-        struct ibv_qp_attr attr = {</div><div class='del'>-                .qp_state        = IBV_QPS_INIT,</div><div class='del'>-                .pkey_index      = 0,</div><div class='del'>-                .port_num        = options-&gt;port,</div><div class='del'>-                .qp_access_flags</div><div class='del'>-                = IBV_ACCESS_REMOTE_READ | IBV_ACCESS_REMOTE_WRITE</div><div class='del'>-        };</div><div class='del'>-  </div><div class='del'>-        peer-&gt;qp = ibv_create_qp (device-&gt;pd, &amp;init_attr);</div><div class='del'>-        if (!peer-&gt;qp) {</div><div class='del'>-                gf_log (RDMA_LOG_NAME,</div><div class='del'>-                        GF_LOG_CRITICAL,</div><div class='del'>-                        "%s: could not create QP",</div><div class='del'>-                        this-&gt;name);</div><div class='del'>-                ret = -1;</div><div class='del'>-                goto out;</div><div class='del'>-        } else if (ibv_modify_qp (peer-&gt;qp, &amp;attr,</div><div class='del'>-                                  IBV_QP_STATE              |</div><div class='del'>-                                  IBV_QP_PKEY_INDEX         |</div><div class='del'>-                                  IBV_QP_PORT               |</div><div class='del'>-                                  IBV_QP_ACCESS_FLAGS)) {</div><div class='del'>-                gf_log (RDMA_LOG_NAME,</div><div class='del'>-                        GF_LOG_ERROR,</div><div class='del'>-                        "%s: failed to modify QP to INIT state",</div><div class='del'>-                        this-&gt;name);</div><div class='del'>-                ret = -1;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        peer-&gt;local_lid = rdma_get_local_lid (device-&gt;context,</div><div class='del'>-                                              options-&gt;port);</div><div class='del'>-        peer-&gt;local_qpn = peer-&gt;qp-&gt;qp_num;</div><div class='del'>-        peer-&gt;local_psn = lrand48 () &amp; 0xffffff;</div><div class='del'>-</div><div class='del'>-        ret = rdma_register_peer (device, peer-&gt;qp-&gt;qp_num, peer);</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        if (ret == -1)</div><div class='del'>-                __rdma_destroy_qp (this);</div><div class='del'>-</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-static void</div><div class='del'>-rdma_destroy_posts (rpc_transport_t *this)</div><div class='del'>-{</div><div class='del'>-</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-static int32_t</div><div class='del'>-__rdma_create_posts (rpc_transport_t *this, int32_t count, int32_t size,</div><div class='del'>-                     rdma_queue_t *q, rdma_post_type_t type)</div><div class='del'>-{</div><div class='del'>-        int32_t i;</div><div class='del'>-        int32_t ret = 0;</div><div class='del'>-        rdma_private_t *priv = this-&gt;private;</div><div class='del'>-        rdma_device_t *device = priv-&gt;device;</div><div class='del'>-</div><div class='del'>-        for (i=0 ; i&lt;count ; i++) {</div><div class='del'>-                rdma_post_t *post;</div><div class='del'>-</div><div class='del'>-                post = rdma_new_post (device, size + 2048, type);</div><div class='del'>-                if (!post) {</div><div class='del'>-                        gf_log (RDMA_LOG_NAME,</div><div class='del'>-                                GF_LOG_ERROR,</div><div class='del'>-                                "%s: post creation failed",</div><div class='del'>-                                this-&gt;name);</div><div class='del'>-                        ret = -1;</div><div class='del'>-                        break;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                rdma_put_post (q, post);</div><div class='del'>-        }</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-static int32_t</div><div class='del'>-rdma_create_posts (rpc_transport_t *this)</div><div class='del'>-{</div><div class='del'>-        int32_t i, ret;</div><div class='del'>-        rdma_post_t *post = NULL;</div><div class='del'>-        rdma_private_t *priv = this-&gt;private;</div><div class='del'>-        rdma_options_t *options = &amp;priv-&gt;options;</div><div class='del'>-        rdma_device_t *device = priv-&gt;device;</div><div class='del'>-</div><div class='del'>-        ret =  __rdma_create_posts (this, options-&gt;send_count,</div><div class='del'>-                                    options-&gt;send_size,</div><div class='del'>-                                    &amp;device-&gt;sendq, RDMA_SEND_POST);</div><div class='del'>-        if (!ret)</div><div class='del'>-                ret =  __rdma_create_posts (this, options-&gt;recv_count,</div><div class='del'>-                                            options-&gt;recv_size,</div><div class='del'>-                                            &amp;device-&gt;recvq, RDMA_RECV_POST);</div><div class='del'>-</div><div class='del'>-        if (!ret) {</div><div class='del'>-                for (i=0 ; i&lt;options-&gt;recv_count ; i++) {</div><div class='del'>-                        post = rdma_get_post (&amp;device-&gt;recvq);</div><div class='del'>-                        if (rdma_post_recv (device-&gt;srq, post) != 0) {</div><div class='del'>-                                ret = -1;</div><div class='del'>-                                break;</div><div class='del'>-                        }</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (ret)</div><div class='del'>-                rdma_destroy_posts (this);</div><div class='del'>-</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-static int32_t</div><div class='del'>-rdma_connect_qp (rpc_transport_t *this)</div><div class='del'>-{</div><div class='del'>-        rdma_private_t *priv = this-&gt;private;</div><div class='del'>-        rdma_options_t *options = &amp;priv-&gt;options;</div><div class='del'>-        struct ibv_qp_attr attr = {</div><div class='del'>-                .qp_state               = IBV_QPS_RTR,</div><div class='del'>-                .path_mtu               = options-&gt;mtu,</div><div class='del'>-                .dest_qp_num            = priv-&gt;peer.remote_qpn,</div><div class='del'>-                .rq_psn                 = priv-&gt;peer.remote_psn,</div><div class='del'>-                .max_dest_rd_atomic     = 1,</div><div class='del'>-                .min_rnr_timer          = 12,</div><div class='del'>-                .qp_access_flags</div><div class='del'>-                = IBV_ACCESS_REMOTE_READ | IBV_ACCESS_REMOTE_WRITE,</div><div class='del'>-                .ah_attr                = {</div><div class='del'>-                        .is_global      = 0,</div><div class='del'>-                        .dlid           = priv-&gt;peer.remote_lid,</div><div class='del'>-                        .sl             = 0,</div><div class='del'>-                        .src_path_bits  = 0,</div><div class='del'>-                        .port_num       = options-&gt;port</div><div class='del'>-                }</div><div class='del'>-        };</div><div class='del'>-        if (ibv_modify_qp (priv-&gt;peer.qp, &amp;attr,</div><div class='del'>-                           IBV_QP_STATE              |</div><div class='del'>-                           IBV_QP_AV                 |</div><div class='del'>-                           IBV_QP_PATH_MTU           |</div><div class='del'>-                           IBV_QP_DEST_QPN           |</div><div class='del'>-                           IBV_QP_RQ_PSN             |</div><div class='del'>-                           IBV_QP_MAX_DEST_RD_ATOMIC |</div><div class='del'>-                           IBV_QP_MIN_RNR_TIMER)) {</div><div class='del'>-                gf_log (RDMA_LOG_NAME,</div><div class='del'>-                        GF_LOG_CRITICAL,</div><div class='del'>-                        "Failed to modify QP to RTR\n");</div><div class='del'>-                return -1;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        /* TODO: make timeout and retry_cnt configurable from options */</div><div class='del'>-        attr.qp_state       = IBV_QPS_RTS;</div><div class='del'>-        attr.timeout        = 14;</div><div class='del'>-        attr.retry_cnt      = 7;</div><div class='del'>-        attr.rnr_retry      = 7;</div><div class='del'>-        attr.sq_psn         = priv-&gt;peer.local_psn;</div><div class='del'>-        attr.max_rd_atomic  = 1;</div><div class='del'>-        if (ibv_modify_qp (priv-&gt;peer.qp, &amp;attr,</div><div class='del'>-                           IBV_QP_STATE              |</div><div class='del'>-                           IBV_QP_TIMEOUT            |</div><div class='del'>-                           IBV_QP_RETRY_CNT          |</div><div class='del'>-                           IBV_QP_RNR_RETRY          |</div><div class='del'>-                           IBV_QP_SQ_PSN             |</div><div class='del'>-                           IBV_QP_MAX_QP_RD_ATOMIC)) {</div><div class='del'>-                gf_log (RDMA_LOG_NAME,</div><div class='del'>-                        GF_LOG_CRITICAL,</div><div class='del'>-                        "Failed to modify QP to RTS\n");</div><div class='del'>-                return -1;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-static int32_t</div><div class='del'>-__rdma_teardown (rpc_transport_t *this)</div><div class='del'>-{</div><div class='del'>-        rdma_private_t *priv = this-&gt;private;</div><div class='del'>-</div><div class='del'>-        __rdma_destroy_qp (this);</div><div class='del'>-</div><div class='del'>-        if (!list_empty (&amp;priv-&gt;peer.ioq)) {</div><div class='del'>-                __rdma_ioq_flush (&amp;priv-&gt;peer);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        /* TODO: decrement cq size */</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-/*</div><div class='del'>- * return value:</div><div class='del'>- *   0 = success (completed)</div><div class='del'>- *  -1 = error</div><div class='del'>- * &gt; 0 = incomplete</div><div class='del'>- */</div><div class='del'>-</div><div class='del'>-static int</div><div class='del'>-__tcp_rwv (rpc_transport_t *this, struct iovec *vector, int count,</div><div class='del'>-           struct iovec **pending_vector, int *pending_count,</div><div class='del'>-           int write)</div><div class='del'>-{</div><div class='del'>-        rdma_private_t *priv = NULL;</div><div class='del'>-        int sock = -1;</div><div class='del'>-        int ret = -1;</div><div class='del'>-        struct iovec *opvector = vector;</div><div class='del'>-        int opcount = count;</div><div class='del'>-        int moved = 0;</div><div class='del'>-</div><div class='del'>-        priv = this-&gt;private;</div><div class='del'>-        sock = priv-&gt;sock;</div><div class='del'>-</div><div class='del'>-        while (opcount)</div><div class='del'>-        {</div><div class='del'>-                if (write)</div><div class='del'>-                {</div><div class='del'>-                        ret = writev (sock, opvector, opcount);</div><div class='del'>-</div><div class='del'>-                        if (ret == 0 || (ret == -1 &amp;&amp; errno == EAGAIN))</div><div class='del'>-                        {</div><div class='del'>-                                /* done for now */</div><div class='del'>-                                break;</div><div class='del'>-                        }</div><div class='del'>-                }</div><div class='del'>-                else</div><div class='del'>-                {</div><div class='del'>-                        ret = readv (sock, opvector, opcount);</div><div class='del'>-</div><div class='del'>-                        if (ret == -1 &amp;&amp; errno == EAGAIN)</div><div class='del'>-                        {</div><div class='del'>-                                /* done for now */</div><div class='del'>-                                break;</div><div class='del'>-                        }</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                if (ret == 0)</div><div class='del'>-                {</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_DEBUG, </div><div class='del'>-                                "EOF from peer %s", this-&gt;peerinfo.identifier);</div><div class='del'>-                        opcount = -1;</div><div class='del'>-                        errno = ENOTCONN;</div><div class='del'>-                        break;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                if (ret == -1)</div><div class='del'>-                {</div><div class='del'>-                        if (errno == EINTR)</div><div class='del'>-                                continue;</div><div class='del'>-</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-                                "%s failed (%s)", write ? "writev" : "readv",</div><div class='del'>-                                strerror (errno));</div><div class='del'>-                        if (write &amp;&amp; !priv-&gt;connected &amp;&amp; </div><div class='del'>-                            (errno == ECONNREFUSED))</div><div class='del'>-                                gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-                                        "possible mismatch of 'rpc-transport-type'"</div><div class='del'>-                                        " in protocol server and client. "</div><div class='del'>-                                        "check volume file");</div><div class='del'>-                        opcount = -1;</div><div class='del'>-                        break;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                moved = 0;</div><div class='del'>-</div><div class='del'>-                while (moved &lt; ret)</div><div class='del'>-                {</div><div class='del'>-                        if ((ret - moved) &gt;= opvector[0].iov_len)</div><div class='del'>-                        {</div><div class='del'>-                                moved += opvector[0].iov_len;</div><div class='del'>-                                opvector++;</div><div class='del'>-                                opcount--;</div><div class='del'>-                        }</div><div class='del'>-                        else</div><div class='del'>-                        {</div><div class='del'>-                                opvector[0].iov_len -= (ret - moved);</div><div class='del'>-                                opvector[0].iov_base += (ret - moved);</div><div class='del'>-                                moved += (ret - moved);</div><div class='del'>-                        }</div><div class='del'>-                        while (opcount &amp;&amp; !opvector[0].iov_len)</div><div class='del'>-                        {</div><div class='del'>-                                opvector++;</div><div class='del'>-                                opcount--;</div><div class='del'>-                        }</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (pending_vector)</div><div class='del'>-                *pending_vector = opvector;</div><div class='del'>-</div><div class='del'>-        if (pending_count)</div><div class='del'>-                *pending_count = opcount;</div><div class='del'>-</div><div class='del'>-        return opcount;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-static int</div><div class='del'>-__tcp_readv (rpc_transport_t *this, struct iovec *vector, int count,</div><div class='del'>-             struct iovec **pending_vector, int *pending_count)</div><div class='del'>-{</div><div class='del'>-        int ret = -1;</div><div class='del'>-</div><div class='del'>-        ret = __tcp_rwv (this, vector, count, </div><div class='del'>-                         pending_vector, pending_count, 0);</div><div class='del'>-</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-static int</div><div class='del'>-__tcp_writev (rpc_transport_t *this, struct iovec *vector, int count,</div><div class='del'>-              struct iovec **pending_vector, int *pending_count)</div><div class='del'>-{</div><div class='del'>-        int ret = -1;</div><div class='del'>-        rdma_private_t *priv = this-&gt;private;</div><div class='del'>-</div><div class='del'>-        ret = __tcp_rwv (this, vector, count, pending_vector, </div><div class='del'>-                         pending_count, 1);</div><div class='del'>-</div><div class='del'>-        if (ret &gt; 0) {</div><div class='del'>-                /* TODO: Avoid multiple calls when socket is already </div><div class='del'>-                   registered for POLLOUT */</div><div class='del'>-                priv-&gt;idx = event_select_on (this-&gt;ctx-&gt;event_pool, </div><div class='del'>-                                             priv-&gt;sock, priv-&gt;idx, -1, 1);</div><div class='del'>-        } else if (ret == 0) {</div><div class='del'>-                priv-&gt;idx = event_select_on (this-&gt;ctx-&gt;event_pool, </div><div class='del'>-                                             priv-&gt;sock,</div><div class='del'>-                                             priv-&gt;idx, -1, 0);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-/*</div><div class='del'>- * allocates new memory to hold write-chunklist. New memory is needed since</div><div class='del'>- * write-chunklist will be used while sending reply and the post holding initial</div><div class='del'>- * write-chunklist sent from client will be put back to srq before a pollin</div><div class='del'>- * event is sent to upper layers.</div><div class='del'>- */</div><div class='del'>-int32_t</div><div class='del'>-rdma_get_write_chunklist (char **ptr, rdma_write_array_t **write_ary)</div><div class='del'>-{</div><div class='del'>-        rdma_write_array_t *from = NULL, *to = NULL;</div><div class='del'>-        int32_t             ret  = -1, size = 0, i = 0;</div><div class='del'>-</div><div class='del'>-        from = (rdma_write_array_t *) *ptr;</div><div class='del'>-        if (from-&gt;wc_discrim == 0) {</div><div class='del'>-                ret = 0;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        from-&gt;wc_nchunks = ntoh32 (from-&gt;wc_nchunks);</div><div class='del'>-</div><div class='del'>-        size = sizeof (*from)</div><div class='del'>-                + (sizeof (rdma_write_chunk_t) * from-&gt;wc_nchunks);</div><div class='del'>-</div><div class='del'>-        to = GF_CALLOC (1, size, gf_common_mt_char);</div><div class='del'>-        if (to == NULL) {</div><div class='del'>-                gf_log (RDMA_LOG_NAME, GF_LOG_ERROR, "out of memory");</div><div class='del'>-                ret = -1;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        to-&gt;wc_discrim = ntoh32 (from-&gt;wc_discrim);</div><div class='del'>-        to-&gt;wc_nchunks = from-&gt;wc_nchunks;</div><div class='del'>-</div><div class='del'>-        for (i = 0; i &lt; to-&gt;wc_nchunks; i++) {</div><div class='del'>-                to-&gt;wc_array[i].wc_target.rs_handle</div><div class='del'>-                        = ntoh32 (from-&gt;wc_array[i].wc_target.rs_handle);</div><div class='del'>-                to-&gt;wc_array[i].wc_target.rs_length</div><div class='del'>-                        = ntoh32 (from-&gt;wc_array[i].wc_target.rs_length);</div><div class='del'>-                to-&gt;wc_array[i].wc_target.rs_offset</div><div class='del'>-                        = ntoh64 (from-&gt;wc_array[i].wc_target.rs_offset);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        *write_ary = to;</div><div class='del'>-        ret = 0;</div><div class='del'>-        *ptr = (char *)&amp;from-&gt;wc_array[i].wc_target.rs_handle;</div><div class='del'>-out:</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-/*</div><div class='del'>- * does not allocate new memory to hold read-chunklist. New memory is not</div><div class='del'>- * needed, since post is not put back to srq till we've completed all the</div><div class='del'>- * rdma-reads and hence readchunk-list can point to memory held by post.</div><div class='del'>- */</div><div class='del'>-int32_t</div><div class='del'>-rdma_get_read_chunklist (char **ptr, rdma_read_chunk_t **readch)</div><div class='del'>-{</div><div class='del'>-        int32_t            ret      = -1;</div><div class='del'>-        rdma_read_chunk_t *chunk    = NULL;</div><div class='del'>-        int                i        = 0;</div><div class='del'>-</div><div class='del'>-        chunk = (rdma_read_chunk_t *)*ptr;</div><div class='del'>-        if (chunk[0].rc_discrim == 0) {</div><div class='del'>-                ret = 0;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        for (i = 0; chunk[i].rc_discrim != 0; i++) {</div><div class='del'>-                chunk[i].rc_discrim = ntoh32 (chunk[i].rc_discrim);</div><div class='del'>-                chunk[i].rc_position = ntoh32 (chunk[i].rc_position);</div><div class='del'>-                chunk[i].rc_target.rs_handle</div><div class='del'>-                        = ntoh32 (chunk[i].rc_target.rs_handle);</div><div class='del'>-                chunk[i].rc_target.rs_length</div><div class='del'>-                        = ntoh32 (chunk[i].rc_target.rs_length);</div><div class='del'>-                chunk[i].rc_target.rs_offset</div><div class='del'>-                        = ntoh64 (chunk[i].rc_target.rs_offset);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        *readch = &amp;chunk[0];</div><div class='del'>-        ret = 0;</div><div class='del'>-        *ptr = (char *)&amp;chunk[i].rc_discrim;</div><div class='del'>-out:</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-inline int32_t</div><div class='del'>-rdma_decode_error_msg (rdma_peer_t *peer, rdma_post_t *post,</div><div class='del'>-                       size_t bytes_in_post)</div><div class='del'>-{</div><div class='del'>-        rdma_header_t *header = NULL;</div><div class='del'>-        struct iobuf  *iobuf  = NULL;</div><div class='del'>-        struct iobref *iobref = NULL;</div><div class='del'>-        int32_t        ret    = -1;</div><div class='del'>-        </div><div class='del'>-        header = (rdma_header_t *)post-&gt;buf;</div><div class='del'>-        header-&gt;rm_body.rm_error.rm_type</div><div class='del'>-                = ntoh32 (header-&gt;rm_body.rm_error.rm_type);</div><div class='del'>-        if (header-&gt;rm_body.rm_error.rm_type == ERR_VERS) {</div><div class='del'>-                header-&gt;rm_body.rm_error.rm_version.rdma_vers_low = </div><div class='del'>-                        ntoh32 (header-&gt;rm_body.rm_error.rm_version.rdma_vers_low);</div><div class='del'>-                header-&gt;rm_body.rm_error.rm_version.rdma_vers_high = </div><div class='del'>-                        ntoh32 (header-&gt;rm_body.rm_error.rm_version.rdma_vers_high);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        iobuf = iobuf_get (peer-&gt;trans-&gt;ctx-&gt;iobuf_pool);</div><div class='del'>-        if (iobuf == NULL) {</div><div class='del'>-                gf_log (RDMA_LOG_NAME, GF_LOG_ERROR, "out of memory");</div><div class='del'>-                ret = -1;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        post-&gt;ctx.iobref = iobref = iobref_new ();</div><div class='del'>-        if (iobref == NULL) {</div><div class='del'>-                gf_log (RDMA_LOG_NAME, GF_LOG_ERROR, "out of memory");</div><div class='del'>-                ret = -1;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        iobref_add (iobref, iobuf);</div><div class='del'>-        iobuf_unref (iobuf);</div><div class='del'>-        /*</div><div class='del'>-         * FIXME: construct an appropriate rpc-msg here, what is being sent</div><div class='del'>-         * to rpc is not correct.</div><div class='del'>-         */</div><div class='del'>-        post-&gt;ctx.vector[0].iov_base = iobuf_ptr (iobuf);</div><div class='del'>-        post-&gt;ctx.vector[0].iov_len = bytes_in_post;</div><div class='del'>-</div><div class='del'>-        memcpy (post-&gt;ctx.vector[0].iov_base, (char *)post-&gt;buf,</div><div class='del'>-                post-&gt;ctx.vector[0].iov_len);</div><div class='del'>-        post-&gt;ctx.count = 1;</div><div class='del'>-</div><div class='del'>-        iobuf = NULL;</div><div class='del'>-        iobref = NULL;</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        if (ret == -1) {</div><div class='del'>-                if (iobuf != NULL) {</div><div class='del'>-                        iobuf_unref (iobuf);</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                if (iobref != NULL) {</div><div class='del'>-                        iobref_unref (iobref);</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-rdma_decode_msg (rdma_peer_t *peer, rdma_post_t *post,</div><div class='del'>-                 rdma_read_chunk_t **readch, size_t bytes_in_post)</div><div class='del'>-{</div><div class='del'>-        int32_t             ret        = -1;</div><div class='del'>-        rdma_header_t      *header     = NULL;</div><div class='del'>-        rdma_reply_info_t  *reply_info = NULL;</div><div class='del'>-        char               *ptr        = NULL;</div><div class='del'>-        rdma_write_array_t *write_ary  = NULL;</div><div class='del'>-        size_t              header_len = 0; </div><div class='del'>-        struct iobuf       *iobuf      = NULL;</div><div class='del'>-        struct iobref      *iobref     = NULL;</div><div class='del'>-</div><div class='del'>-        header = (rdma_header_t *)post-&gt;buf;</div><div class='del'>-</div><div class='del'>-        ptr = (char *)&amp;header-&gt;rm_body.rm_chunks[0];</div><div class='del'>-</div><div class='del'>-        ret = rdma_get_read_chunklist (&amp;ptr, readch);</div><div class='del'>-        if (ret == -1) {</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        /* skip terminator of read-chunklist */</div><div class='del'>-        ptr = ptr + sizeof (uint32_t);</div><div class='del'>-</div><div class='del'>-        ret = rdma_get_write_chunklist (&amp;ptr, &amp;write_ary);</div><div class='del'>-        if (ret == -1) {</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        /* skip terminator of write-chunklist */</div><div class='del'>-        ptr = ptr + sizeof (uint32_t);</div><div class='del'>-</div><div class='del'>-        if (write_ary != NULL) {</div><div class='del'>-                reply_info = rdma_reply_info_alloc (peer);</div><div class='del'>-                if (reply_info == NULL) {</div><div class='del'>-                        ret = -1;</div><div class='del'>-                        goto out;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                reply_info-&gt;type = rdma_writech;</div><div class='del'>-                reply_info-&gt;wc_array = write_ary;</div><div class='del'>-                reply_info-&gt;rm_xid = header-&gt;rm_xid;</div><div class='del'>-        } else {</div><div class='del'>-                ret = rdma_get_write_chunklist (&amp;ptr, &amp;write_ary);</div><div class='del'>-                if (ret == -1) {</div><div class='del'>-                        goto out;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                if (write_ary != NULL) {</div><div class='del'>-                        reply_info = rdma_reply_info_alloc (peer);</div><div class='del'>-                        if (reply_info == NULL) {</div><div class='del'>-                                ret = -1;</div><div class='del'>-                                goto out;</div><div class='del'>-                        }</div><div class='del'>-</div><div class='del'>-                        reply_info-&gt;type = rdma_replych;</div><div class='del'>-                        reply_info-&gt;wc_array = write_ary;</div><div class='del'>-                        reply_info-&gt;rm_xid = header-&gt;rm_xid;</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        /* skip terminator of reply chunk */</div><div class='del'>-        ptr = ptr + sizeof (uint32_t);</div><div class='del'>-        if (header-&gt;rm_type != RDMA_NOMSG) {</div><div class='del'>-                iobuf = iobuf_get (peer-&gt;trans-&gt;ctx-&gt;iobuf_pool);</div><div class='del'>-                if (iobuf == NULL) {</div><div class='del'>-                        gf_log (RDMA_LOG_NAME, GF_LOG_ERROR, "out of memory");</div><div class='del'>-                        ret = -1;</div><div class='del'>-                        goto out;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                post-&gt;ctx.iobref = iobref = iobref_new ();</div><div class='del'>-                if (iobref == NULL) {</div><div class='del'>-                        gf_log (RDMA_LOG_NAME, GF_LOG_ERROR, "out of memory");</div><div class='del'>-                        ret = -1;</div><div class='del'>-                        goto out;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                iobref_add (iobref, iobuf);</div><div class='del'>-                iobuf_unref (iobuf);</div><div class='del'>-</div><div class='del'>-                header_len = (long)ptr - (long)post-&gt;buf;</div><div class='del'>-                post-&gt;ctx.vector[0].iov_base = iobuf_ptr (iobuf);</div><div class='del'>-                post-&gt;ctx.vector[0].iov_len = bytes_in_post - header_len;</div><div class='del'>-                memcpy (post-&gt;ctx.vector[0].iov_base, ptr,</div><div class='del'>-                        post-&gt;ctx.vector[0].iov_len);</div><div class='del'>-                post-&gt;ctx.count = 1;</div><div class='del'>-</div><div class='del'>-                iobuf = NULL;</div><div class='del'>-                iobref = NULL;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        post-&gt;ctx.reply_info = reply_info;</div><div class='del'>-out:</div><div class='del'>-        if (ret == -1) {</div><div class='del'>-                if (*readch != NULL) {</div><div class='del'>-                        GF_FREE (*readch);</div><div class='del'>-                        *readch = NULL;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                if (write_ary != NULL) {</div><div class='del'>-                        GF_FREE (write_ary);</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                if (iobuf != NULL) {</div><div class='del'>-                        iobuf_unref (iobuf);</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                if (iobref != NULL) {</div><div class='del'>-                        iobref_unref (iobref);</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-/* Assumes only one of either write-chunklist or a reply chunk is present */</div><div class='del'>-int32_t</div><div class='del'>-rdma_decode_header (rdma_peer_t *peer, rdma_post_t *post,</div><div class='del'>-                    rdma_read_chunk_t **readch, size_t bytes_in_post)</div><div class='del'>-{</div><div class='del'>-        int32_t             ret        = -1;</div><div class='del'>-        rdma_header_t      *header     = NULL;</div><div class='del'>-</div><div class='del'>-        header = (rdma_header_t *)post-&gt;buf;</div><div class='del'>-</div><div class='del'>-        header-&gt;rm_xid = ntoh32 (header-&gt;rm_xid);</div><div class='del'>-        header-&gt;rm_vers = ntoh32 (header-&gt;rm_vers);</div><div class='del'>-        header-&gt;rm_credit = ntoh32 (header-&gt;rm_credit);</div><div class='del'>-        header-&gt;rm_type = ntoh32 (header-&gt;rm_type);</div><div class='del'>-</div><div class='del'>-        switch (header-&gt;rm_type) {</div><div class='del'>-        case RDMA_MSG:</div><div class='del'>-        case RDMA_NOMSG:</div><div class='del'>-                ret = rdma_decode_msg (peer, post, readch, bytes_in_post);</div><div class='del'>-                break;</div><div class='del'>-</div><div class='del'>-        case RDMA_MSGP:</div><div class='del'>-                gf_log (RDMA_LOG_NAME, GF_LOG_ERROR,</div><div class='del'>-                        "rdma msg of msg-type RDMA_MSGP should not have been "</div><div class='del'>-                        "recieved");</div><div class='del'>-                ret = -1;</div><div class='del'>-                break;</div><div class='del'>-</div><div class='del'>-        case RDMA_DONE:</div><div class='del'>-                gf_log (RDMA_LOG_NAME, GF_LOG_ERROR,</div><div class='del'>-                        "rdma msg of msg-type RDMA_DONE should not have been "</div><div class='del'>-                        "recieved");</div><div class='del'>-                ret = -1;</div><div class='del'>-                break;</div><div class='del'>-</div><div class='del'>-        case RDMA_ERROR:</div><div class='del'>-                /* ret = rdma_decode_error_msg (peer, post, bytes_in_post); */</div><div class='del'>-                break;</div><div class='del'>-</div><div class='del'>-        default:</div><div class='del'>-                gf_log (RDMA_LOG_NAME, GF_LOG_DEBUG,</div><div class='del'>-                        "unknown rdma msg-type (%d)", header-&gt;rm_type);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-__rdma_read (rdma_peer_t *peer, rdma_post_t *post, struct iovec *to,</div><div class='del'>-             rdma_read_chunk_t *readch)</div><div class='del'>-{</div><div class='del'>-        int32_t            ret = -1;</div><div class='del'>-        struct ibv_sge     list = {0, };</div><div class='del'>-        struct ibv_send_wr wr = {0, }, *bad_wr = NULL;</div><div class='del'>-</div><div class='del'>-        ret = __rdma_register_local_mr_for_rdma (peer, to, 1, &amp;post-&gt;ctx);</div><div class='del'>-        if (ret == -1) {</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        list.addr = (unsigned long) to-&gt;iov_base;</div><div class='del'>-        list.length = to-&gt;iov_len;</div><div class='del'>-        list.lkey = post-&gt;ctx.mr[post-&gt;ctx.mr_count - 1]-&gt;lkey;</div><div class='del'>-</div><div class='del'>-        wr.wr_id      = (unsigned long) rdma_post_ref (post);</div><div class='del'>-        wr.sg_list    = &amp;list;</div><div class='del'>-        wr.num_sge    = 1;</div><div class='del'>-        wr.opcode     = IBV_WR_RDMA_READ;</div><div class='del'>-        wr.send_flags = IBV_SEND_SIGNALED;</div><div class='del'>-        wr.wr.rdma.remote_addr = readch-&gt;rc_target.rs_offset;</div><div class='del'>-        wr.wr.rdma.rkey = readch-&gt;rc_target.rs_handle;</div><div class='del'>-</div><div class='del'>-        ret = ibv_post_send (peer-&gt;qp, &amp;wr, &amp;bad_wr);</div><div class='del'>-        if (ret == -1) {</div><div class='del'>-                rdma_post_unref (post);</div><div class='del'>-        }</div><div class='del'>-out:</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-rdma_do_reads (rdma_peer_t *peer, rdma_post_t *post, rdma_read_chunk_t *readch)</div><div class='del'>-{</div><div class='del'>-        int32_t         ret    = -1, i = 0;</div><div class='del'>-        size_t          size   = 0;</div><div class='del'>-        char           *ptr    = NULL;  </div><div class='del'>-        struct iobuf   *iobuf  = NULL;</div><div class='del'>-        rdma_private_t *priv   = NULL;</div><div class='del'>-</div><div class='del'>-        priv = peer-&gt;trans-&gt;private;</div><div class='del'>-</div><div class='del'>-        for (i = 0; readch[i].rc_discrim != 0; i++) {</div><div class='del'>-                size += readch[i].rc_target.rs_length;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (size &gt; peer-&gt;trans-&gt;ctx-&gt;page_size) {</div><div class='del'>-                gf_log (RDMA_LOG_NAME, GF_LOG_ERROR,</div><div class='del'>-                        "total size of rdma-read (%lu) is greater than "</div><div class='del'>-                        "page-size (%lu). This is not supported till variable "</div><div class='del'>-                        "sized iobufs are implemented", (unsigned long)size,</div><div class='del'>-                        (unsigned long)peer-&gt;trans-&gt;ctx-&gt;page_size);</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        iobuf = iobuf_get (peer-&gt;trans-&gt;ctx-&gt;iobuf_pool);</div><div class='del'>-        if (iobuf == NULL) {</div><div class='del'>-                gf_log (RDMA_LOG_NAME, GF_LOG_ERROR, "out of memory");</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (post-&gt;ctx.iobref == NULL) {</div><div class='del'>-                post-&gt;ctx.iobref = iobref_new ();</div><div class='del'>-                if (post-&gt;ctx.iobref == NULL) {</div><div class='del'>-                        iobuf_unref (iobuf);</div><div class='del'>-                        gf_log (RDMA_LOG_NAME, GF_LOG_ERROR, "out of memory");</div><div class='del'>-                        goto out;</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        iobref_add (post-&gt;ctx.iobref, iobuf);</div><div class='del'>-        iobuf_unref (iobuf);</div><div class='del'>-</div><div class='del'>-        ptr = iobuf_ptr (iobuf);</div><div class='del'>-        iobuf = NULL;</div><div class='del'>-</div><div class='del'>-        pthread_mutex_lock (&amp;priv-&gt;write_mutex);</div><div class='del'>-        {</div><div class='del'>-                if (!priv-&gt;connected) {</div><div class='del'>-                        goto unlock;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                for (i = 0; readch[i].rc_discrim != 0; i++) {</div><div class='del'>-                        post-&gt;ctx.vector[post-&gt;ctx.count].iov_base = ptr;</div><div class='del'>-                        post-&gt;ctx.vector[post-&gt;ctx.count].iov_len</div><div class='del'>-                                = readch[i].rc_target.rs_length;</div><div class='del'>-</div><div class='del'>-                        ret = __rdma_read (peer, post,</div><div class='del'>-                                           &amp;post-&gt;ctx.vector[post-&gt;ctx.count],</div><div class='del'>-                                           &amp;readch[i]);</div><div class='del'>-                        if (ret == -1) {</div><div class='del'>-                                goto unlock;</div><div class='del'>-                        }</div><div class='del'>-</div><div class='del'>-                        post-&gt;ctx.count++;</div><div class='del'>-                        ptr += readch[i].rc_target.rs_length;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                ret = 0;</div><div class='del'>-        }</div><div class='del'>-unlock:</div><div class='del'>-        pthread_mutex_unlock (&amp;priv-&gt;write_mutex);</div><div class='del'>-out:</div><div class='del'>-</div><div class='del'>-        if (ret == -1) {</div><div class='del'>-                if (iobuf != NULL) {</div><div class='del'>-                        iobuf_unref (iobuf);</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-rdma_pollin_notify (rdma_peer_t *peer, rdma_post_t *post)</div><div class='del'>-{</div><div class='del'>-        int32_t                 ret             = -1;</div><div class='del'>-        enum msg_type           msg_type        = 0;</div><div class='del'>-        struct rpc_req         *rpc_req         = NULL;</div><div class='del'>-        rdma_request_context_t *request_context = NULL;</div><div class='del'>-        rpc_request_info_t      request_info    = {0, };</div><div class='del'>-        rdma_private_t         *priv            = NULL;</div><div class='del'>-        uint32_t               *ptr             = NULL;</div><div class='del'>-        rpc_transport_pollin_t *pollin          = NULL;</div><div class='del'>-</div><div class='del'>-        if ((peer == NULL) || (post == NULL)) {</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        pollin = rpc_transport_pollin_alloc (peer-&gt;trans,</div><div class='del'>-                                             post-&gt;ctx.vector,</div><div class='del'>-                                             post-&gt;ctx.count,</div><div class='del'>-                                             post-&gt;ctx.iobref,</div><div class='del'>-                                             post-&gt;ctx.reply_info);</div><div class='del'>-        if (pollin == NULL) {</div><div class='del'>-                gf_log (RDMA_LOG_NAME, GF_LOG_ERROR, "out of memory");</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        ptr = (uint32_t *)pollin-&gt;vector[0].iov_base;</div><div class='del'>-</div><div class='del'>-        request_info.xid = ntoh32 (*ptr);</div><div class='del'>-        msg_type = ntoh32 (*(ptr + 1));</div><div class='del'>-</div><div class='del'>-        if (msg_type == REPLY) {</div><div class='del'>-                ret = rpc_transport_notify (peer-&gt;trans,</div><div class='del'>-                                            RPC_TRANSPORT_MAP_XID_REQUEST,</div><div class='del'>-                                            &amp;request_info);</div><div class='del'>-                if (ret == -1) {</div><div class='del'>-                        gf_log (RDMA_LOG_NAME, GF_LOG_DEBUG,</div><div class='del'>-                                "cannot get request information from rpc "</div><div class='del'>-                                "layer"); </div><div class='del'>-                        goto out;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                rpc_req = request_info.rpc_req;</div><div class='del'>-                if (rpc_req == NULL) {</div><div class='del'>-                        gf_log (RDMA_LOG_NAME, GF_LOG_DEBUG,</div><div class='del'>-                                "rpc request structure not found");</div><div class='del'>-                        ret = -1;</div><div class='del'>-                        goto out;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                request_context = rpc_req-&gt;conn_private;</div><div class='del'>-                rpc_req-&gt;conn_private = NULL;</div><div class='del'>-</div><div class='del'>-                priv = peer-&gt;trans-&gt;private;</div><div class='del'>-                pthread_mutex_lock (&amp;priv-&gt;write_mutex);</div><div class='del'>-                {</div><div class='del'>-                        __rdma_request_context_destroy (request_context);</div><div class='del'>-                }</div><div class='del'>-                pthread_mutex_unlock (&amp;priv-&gt;write_mutex);</div><div class='del'>-</div><div class='del'>-                pollin-&gt;is_reply = 1;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        ret = rpc_transport_notify (peer-&gt;trans, RPC_TRANSPORT_MSG_RECEIVED,</div><div class='del'>-                                    pollin);</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        if (pollin != NULL) {</div><div class='del'>-                pollin-&gt;private = NULL;</div><div class='del'>-                rpc_transport_pollin_destroy (pollin);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-rdma_recv_reply (rdma_peer_t *peer, rdma_post_t *post)</div><div class='del'>-{</div><div class='del'>-        int32_t                      ret          = -1;</div><div class='del'>-        rdma_header_t               *header       = NULL;</div><div class='del'>-        rdma_reply_info_t           *reply_info   = NULL;</div><div class='del'>-        rdma_write_array_t          *wc_array     = NULL;</div><div class='del'>-        int                          i            = 0;</div><div class='del'>-        uint32_t                    *ptr          = NULL;</div><div class='del'>-        rdma_request_context_t      *ctx          = NULL;</div><div class='del'>-        rpc_request_info_t           request_info = {0, }; </div><div class='del'>-        struct rpc_req              *rpc_req      = NULL;</div><div class='del'>-</div><div class='del'>-        header = (rdma_header_t *)post-&gt;buf;</div><div class='del'>-        reply_info = post-&gt;ctx.reply_info;</div><div class='del'>-</div><div class='del'>-        /* no write chunklist, just notify upper layers */</div><div class='del'>-        if (reply_info == NULL) {</div><div class='del'>-                ret = 0;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        wc_array = reply_info-&gt;wc_array;</div><div class='del'>-</div><div class='del'>-        if (header-&gt;rm_type == RDMA_NOMSG) {</div><div class='del'>-                post-&gt;ctx.vector[0].iov_base</div><div class='del'>-                        = (void *)(long)wc_array-&gt;wc_array[0].wc_target.rs_offset;</div><div class='del'>-                post-&gt;ctx.vector[0].iov_len</div><div class='del'>-                        = wc_array-&gt;wc_array[0].wc_target.rs_length;</div><div class='del'>-</div><div class='del'>-                post-&gt;ctx.count = 1;</div><div class='del'>-        } else {</div><div class='del'>-                for (i = 0; i &lt; wc_array-&gt;wc_nchunks; i++) {</div><div class='del'>-                        post-&gt;ctx.vector[i + 1].iov_base</div><div class='del'>-                                = (void *)(long)wc_array-&gt;wc_array[i].wc_target.rs_offset;</div><div class='del'>-                        post-&gt;ctx.vector[i + 1].iov_len</div><div class='del'>-                                = wc_array-&gt;wc_array[i].wc_target.rs_length;</div><div class='del'>-                }</div><div class='del'>-                </div><div class='del'>-                post-&gt;ctx.count += wc_array-&gt;wc_nchunks;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        ptr = (uint32_t *)post-&gt;ctx.vector[0].iov_base;</div><div class='del'>-        request_info.xid = ntoh32 (*ptr);</div><div class='del'>-</div><div class='del'>-        ret = rpc_transport_notify (peer-&gt;trans,</div><div class='del'>-                                    RPC_TRANSPORT_MAP_XID_REQUEST,</div><div class='del'>-                                    &amp;request_info);</div><div class='del'>-        if (ret == -1) {</div><div class='del'>-                gf_log (RDMA_LOG_NAME, GF_LOG_DEBUG,</div><div class='del'>-                        "cannot get request information from rpc "</div><div class='del'>-                        "layer"); </div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        rpc_req = request_info.rpc_req;</div><div class='del'>-        if (rpc_req == NULL) {</div><div class='del'>-                gf_log (RDMA_LOG_NAME, GF_LOG_DEBUG,</div><div class='del'>-                        "rpc request structure not found");</div><div class='del'>-                ret = -1;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        ctx = rpc_req-&gt;conn_private;</div><div class='del'>-        if ((post-&gt;ctx.iobref != NULL) &amp;&amp; (ctx-&gt;rsp_iobref != NULL)) {</div><div class='del'>-                iobref_merge (post-&gt;ctx.iobref, ctx-&gt;rsp_iobref);</div><div class='del'>-        } else if (post-&gt;ctx.iobref == NULL) {</div><div class='del'>-                post-&gt;ctx.iobref = iobref_ref (ctx-&gt;rsp_iobref);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        ret = 0;</div><div class='del'>-</div><div class='del'>-        rdma_reply_info_destroy (reply_info);</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        if (ret == 0) {</div><div class='del'>-                ret = rdma_pollin_notify (peer, post);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-inline int32_t</div><div class='del'>-rdma_recv_request (rdma_peer_t *peer, rdma_post_t *post,</div><div class='del'>-                   rdma_read_chunk_t *readch)</div><div class='del'>-{</div><div class='del'>-        int32_t ret = -1;</div><div class='del'>- </div><div class='del'>-        if (readch != NULL) {</div><div class='del'>-                ret = rdma_do_reads (peer, post, readch);</div><div class='del'>-        } else {</div><div class='del'>-                ret = rdma_pollin_notify (peer, post);</div><div class='del'>-                if (ret == -1) {</div><div class='del'>-                        gf_log (RDMA_LOG_NAME, GF_LOG_DEBUG,</div><div class='del'>-                                "pollin notification failed");</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-void</div><div class='del'>-rdma_process_recv (rdma_peer_t *peer, struct ibv_wc *wc)</div><div class='del'>-{</div><div class='del'>-        rdma_post_t            *post       = NULL;</div><div class='del'>-        rdma_read_chunk_t      *readch     = NULL;</div><div class='del'>-        int                     ret        = -1;</div><div class='del'>-        uint32_t               *ptr        = NULL;</div><div class='del'>-        enum msg_type           msg_type   = 0;</div><div class='del'>-        rdma_header_t          *header     = NULL;</div><div class='del'>-</div><div class='del'>-        post = (rdma_post_t *) (long) wc-&gt;wr_id;</div><div class='del'>-        if (post == NULL) {</div><div class='del'>-                gf_log (RDMA_LOG_NAME, GF_LOG_DEBUG,</div><div class='del'>-                        "no post found in successful work completion element");</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        ret = rdma_decode_header (peer, post, &amp;readch, wc-&gt;byte_len);</div><div class='del'>-        if (ret == -1) {</div><div class='del'>-                gf_log (RDMA_LOG_NAME, GF_LOG_DEBUG,</div><div class='del'>-                        "decoding of header failed");</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        header = (rdma_header_t *)post-&gt;buf;</div><div class='del'>-</div><div class='del'>-        switch (header-&gt;rm_type) {</div><div class='del'>-        case RDMA_MSG:</div><div class='del'>-                ptr = (uint32_t *)post-&gt;ctx.vector[0].iov_base;</div><div class='del'>-                msg_type = ntoh32 (*(ptr + 1));</div><div class='del'>-                break;</div><div class='del'>-</div><div class='del'>-        case RDMA_NOMSG:</div><div class='del'>-                if (readch != NULL) {</div><div class='del'>-                        msg_type = CALL;</div><div class='del'>-                } else {</div><div class='del'>-                        msg_type = REPLY;</div><div class='del'>-                }</div><div class='del'>-                break;</div><div class='del'>-</div><div class='del'>-        case RDMA_ERROR:</div><div class='del'>-                gf_log (RDMA_LOG_NAME, GF_LOG_ERROR,</div><div class='del'>-                        "an error has happened while transmission of msg, "</div><div class='del'>-                        "disconnecting the transport");</div><div class='del'>-                rpc_transport_disconnect (peer-&gt;trans);</div><div class='del'>-                goto out;</div><div class='del'>-</div><div class='del'>-/*                ret = rdma_pollin_notify (peer, post);</div><div class='del'>-                  if (ret == -1) {</div><div class='del'>-                  gf_log (RDMA_LOG_NAME, GF_LOG_DEBUG,</div><div class='del'>-                  "pollin notification failed");</div><div class='del'>-                  }</div><div class='del'>-                  goto out;</div><div class='del'>-*/</div><div class='del'>-</div><div class='del'>-        default:</div><div class='del'>-                gf_log (RDMA_LOG_NAME, GF_LOG_DEBUG,</div><div class='del'>-                        "invalid rdma msg-type (%d)", header-&gt;rm_type);</div><div class='del'>-                break;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (msg_type == CALL) {</div><div class='del'>-                ret = rdma_recv_request (peer, post, readch);</div><div class='del'>-        } else {</div><div class='del'>-                ret = rdma_recv_reply (peer, post);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        if (ret == -1) {</div><div class='del'>-                rpc_transport_disconnect (peer-&gt;trans);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        return;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-static void *</div><div class='del'>-rdma_recv_completion_proc (void *data)</div><div class='del'>-{</div><div class='del'>-        struct ibv_comp_channel *chan      = NULL;</div><div class='del'>-        rdma_device_t           *device    = NULL;;</div><div class='del'>-        rdma_post_t             *post      = NULL;</div><div class='del'>-        rdma_peer_t             *peer      = NULL;</div><div class='del'>-        struct ibv_cq           *event_cq  = NULL;</div><div class='del'>-        struct ibv_wc            wc        = {0, };</div><div class='del'>-        void                    *event_ctx = NULL;</div><div class='del'>-        int32_t                  ret       = 0;</div><div class='del'>-</div><div class='del'>-        chan = data;</div><div class='del'>-</div><div class='del'>-        while (1) {</div><div class='del'>-                ret = ibv_get_cq_event (chan, &amp;event_cq, &amp;event_ctx);</div><div class='del'>-                if (ret) {</div><div class='del'>-                        gf_log (RDMA_LOG_NAME, GF_LOG_ERROR,</div><div class='del'>-                                "ibv_get_cq_event failed, terminating recv "</div><div class='del'>-                                "thread %d (%d)", ret, errno);</div><div class='del'>-                        continue;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                device = event_ctx;</div><div class='del'>-    </div><div class='del'>-                ret = ibv_req_notify_cq (event_cq, 0);</div><div class='del'>-                if (ret) {</div><div class='del'>-                        gf_log (RDMA_LOG_NAME, GF_LOG_ERROR,</div><div class='del'>-                                "ibv_req_notify_cq on %s failed, terminating "</div><div class='del'>-                                "recv thread: %d (%d)",</div><div class='del'>-                                device-&gt;device_name, ret, errno);</div><div class='del'>-                        continue;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                device = (rdma_device_t *) event_ctx;</div><div class='del'>-</div><div class='del'>-                while ((ret = ibv_poll_cq (event_cq, 1, &amp;wc)) &gt; 0) {</div><div class='del'>-                        post = (rdma_post_t *) (long) wc.wr_id;</div><div class='del'>-</div><div class='del'>-                        pthread_mutex_lock (&amp;device-&gt;qpreg.lock);</div><div class='del'>-                        {</div><div class='del'>-                                peer = __rdma_lookup_peer (device,</div><div class='del'>-                                                           wc.qp_num);</div><div class='del'>-</div><div class='del'>-                                /*</div><div class='del'>-                                 * keep a refcount on transport so that it</div><div class='del'>-                                 * doesnot get freed because of some error</div><div class='del'>-                                 * indicated by wc.status till we are done</div><div class='del'>-                                 * with usage of peer and thereby that of trans.</div><div class='del'>-                                 */</div><div class='del'>-                                if (peer != NULL) {</div><div class='del'>-                                        rpc_transport_ref (peer-&gt;trans);</div><div class='del'>-                                }</div><div class='del'>-                        }</div><div class='del'>-                        pthread_mutex_unlock (&amp;device-&gt;qpreg.lock);</div><div class='del'>-</div><div class='del'>-                        if (wc.status != IBV_WC_SUCCESS) {</div><div class='del'>-                                gf_log (RDMA_LOG_NAME, GF_LOG_ERROR,</div><div class='del'>-                                        "recv work request on `%s' returned "</div><div class='del'>-                                        "error (%d)", device-&gt;device_name,</div><div class='del'>-                                        wc.status);</div><div class='del'>-                                if (peer) {</div><div class='del'>-                                        rpc_transport_unref (peer-&gt;trans);</div><div class='del'>-                                        rpc_transport_disconnect (peer-&gt;trans);</div><div class='del'>-                                }</div><div class='del'>-</div><div class='del'>-                                if (post) {</div><div class='del'>-                                        rdma_post_unref (post);</div><div class='del'>-                                }</div><div class='del'>-                                continue;</div><div class='del'>-                        }</div><div class='del'>-</div><div class='del'>-                        if (peer) {</div><div class='del'>-                                rdma_process_recv (peer, &amp;wc);</div><div class='del'>-                                rpc_transport_unref (peer-&gt;trans);</div><div class='del'>-                        } else {</div><div class='del'>-                                gf_log (RDMA_LOG_NAME,</div><div class='del'>-                                        GF_LOG_DEBUG,</div><div class='del'>-                                        "could not lookup peer for qp_num: %d",</div><div class='del'>-                                        wc.qp_num);</div><div class='del'>-                        }</div><div class='del'>-</div><div class='del'>-                        rdma_post_unref (post);</div><div class='del'>-                }</div><div class='del'>-    </div><div class='del'>-                if (ret &lt; 0) {</div><div class='del'>-                        gf_log (RDMA_LOG_NAME,</div><div class='del'>-                                GF_LOG_ERROR,</div><div class='del'>-                                "ibv_poll_cq on `%s' returned error "</div><div class='del'>-                                "(ret = %d, errno = %d)",</div><div class='del'>-                                device-&gt;device_name, ret, errno);</div><div class='del'>-                        continue;</div><div class='del'>-                }</div><div class='del'>-                ibv_ack_cq_events (event_cq, 1);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        return NULL;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-void</div><div class='del'>-rdma_handle_failed_send_completion (rdma_peer_t *peer, struct ibv_wc *wc)</div><div class='del'>-{</div><div class='del'>-        rdma_post_t    *post   = NULL;</div><div class='del'>-        rdma_device_t  *device = NULL;</div><div class='del'>-        rdma_private_t *priv   = NULL;</div><div class='del'>-</div><div class='del'>-        if (peer != NULL) {</div><div class='del'>-                priv = peer-&gt;trans-&gt;private;</div><div class='del'>-                if (priv != NULL) {</div><div class='del'>-                        device = priv-&gt;device;</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-        post = (rdma_post_t *) (long) wc-&gt;wr_id;</div><div class='del'>-</div><div class='del'>-        gf_log (RDMA_LOG_NAME, GF_LOG_ERROR,</div><div class='del'>-                "send work request on `%s' returned error "</div><div class='del'>-                "wc.status = %d, wc.vendor_err = %d, post-&gt;buf = %p, "</div><div class='del'>-                "wc.byte_len = %d, post-&gt;reused = %d",</div><div class='del'>-                (device != NULL) ? device-&gt;device_name : NULL, wc-&gt;status, </div><div class='del'>-                wc-&gt;vendor_err, post-&gt;buf, wc-&gt;byte_len, post-&gt;reused);</div><div class='del'>-</div><div class='del'>-        if (wc-&gt;status == IBV_WC_RETRY_EXC_ERR) {</div><div class='del'>-                gf_log ("rdma", GF_LOG_ERROR, "connection between client and"</div><div class='del'>-                        " server not working. check by running "</div><div class='del'>-                        "'ibv_srq_pingpong'. also make sure subnet manager"</div><div class='del'>-                        " is running (eg: 'opensm'), or check if rdma port is "</div><div class='del'>-                        "valid (or active) by running 'ibv_devinfo'. contact "</div><div class='del'>-                        "Gluster Support Team if the problem persists.");</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (peer) {</div><div class='del'>-                rpc_transport_disconnect (peer-&gt;trans);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        return;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-void</div><div class='del'>-rdma_handle_successful_send_completion (rdma_peer_t *peer, struct ibv_wc *wc)</div><div class='del'>-{</div><div class='del'>-        rdma_post_t            *post     = NULL;</div><div class='del'>-        int                     refcount = 0, ret = 0;</div><div class='del'>-</div><div class='del'>-        if (wc-&gt;opcode != IBV_WC_RDMA_READ) {</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        post = (rdma_post_t *)(long) wc-&gt;wr_id;</div><div class='del'>-</div><div class='del'>-        refcount = rdma_post_get_refcount (post);</div><div class='del'>-        if (refcount != 1) {</div><div class='del'>-                /* if it is not the last rdma read, we've got nothing to do */</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        ret = rdma_pollin_notify (peer, post);</div><div class='del'>-        if (ret == -1) {</div><div class='del'>-                rpc_transport_disconnect (peer-&gt;trans);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        return;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-static void *</div><div class='del'>-rdma_send_completion_proc (void *data)</div><div class='del'>-{</div><div class='del'>-        struct ibv_comp_channel *chan       = NULL;</div><div class='del'>-        rdma_post_t             *post       = NULL;</div><div class='del'>-        rdma_peer_t             *peer       = NULL;</div><div class='del'>-        struct ibv_cq           *event_cq   = NULL;</div><div class='del'>-        void                    *event_ctx  = NULL;</div><div class='del'>-        rdma_device_t           *device     = NULL;</div><div class='del'>-        struct ibv_wc            wc         = {0, };</div><div class='del'>-        char                     is_request = 0;</div><div class='del'>-        int32_t                  ret        = 0, quota_ret = 0;</div><div class='del'>-        </div><div class='del'>-        chan = data;</div><div class='del'>-        while (1) {</div><div class='del'>-                ret = ibv_get_cq_event (chan, &amp;event_cq, &amp;event_ctx);</div><div class='del'>-                if (ret) {</div><div class='del'>-                        gf_log (RDMA_LOG_NAME, GF_LOG_ERROR,</div><div class='del'>-                                "ibv_get_cq_event on failed, terminating "</div><div class='del'>-                                "send thread: %d (%d)", ret, errno);</div><div class='del'>-                        continue;</div><div class='del'>-                }</div><div class='del'>-       </div><div class='del'>-                device = event_ctx;</div><div class='del'>-</div><div class='del'>-                ret = ibv_req_notify_cq (event_cq, 0);</div><div class='del'>-                if (ret) {</div><div class='del'>-                        gf_log (RDMA_LOG_NAME,  GF_LOG_ERROR,</div><div class='del'>-                                "ibv_req_notify_cq on %s failed, terminating "</div><div class='del'>-                                "send thread: %d (%d)",</div><div class='del'>-                                device-&gt;device_name, ret, errno);</div><div class='del'>-                        continue;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                while ((ret = ibv_poll_cq (event_cq, 1, &amp;wc)) &gt; 0) {</div><div class='del'>-                        post = (rdma_post_t *) (long) wc.wr_id;</div><div class='del'>-</div><div class='del'>-                        pthread_mutex_lock (&amp;device-&gt;qpreg.lock);</div><div class='del'>-                        {</div><div class='del'>-                                peer = __rdma_lookup_peer (device, wc.qp_num);</div><div class='del'>-</div><div class='del'>-                                /*</div><div class='del'>-                                 * keep a refcount on transport so that it</div><div class='del'>-                                 * does not get freed because of some error</div><div class='del'>-                                 * indicated by wc.status, till we are done</div><div class='del'>-                                 * with usage of peer and thereby that of trans.</div><div class='del'>-                                 */</div><div class='del'>-                                if (peer != NULL) {</div><div class='del'>-                                        rpc_transport_ref (peer-&gt;trans);</div><div class='del'>-                                }</div><div class='del'>-                        }</div><div class='del'>-                        pthread_mutex_unlock (&amp;device-&gt;qpreg.lock);</div><div class='del'>-</div><div class='del'>-                        if (wc.status != IBV_WC_SUCCESS) {</div><div class='del'>-                                rdma_handle_failed_send_completion (peer, &amp;wc);</div><div class='del'>-                        } else {</div><div class='del'>-                                rdma_handle_successful_send_completion (peer,</div><div class='del'>-                                                                        &amp;wc);</div><div class='del'>-                        }</div><div class='del'>-</div><div class='del'>-                        if (post) {</div><div class='del'>-                                is_request = post-&gt;ctx.is_request;</div><div class='del'>-</div><div class='del'>-                                ret = rdma_post_unref (post);</div><div class='del'>-                                if ((ret == 0)</div><div class='del'>-                                    &amp;&amp; (wc.status == IBV_WC_SUCCESS)</div><div class='del'>-                                    &amp;&amp; !is_request</div><div class='del'>-                                    &amp;&amp; (post-&gt;type == RDMA_SEND_POST)) {</div><div class='del'>-                                        /* An RDMA_RECV_POST can end up in</div><div class='del'>-                                         * rdma_send_completion_proc for </div><div class='del'>-                                         * rdma-reads, and we do not take</div><div class='del'>-                                         * quota for getting an RDMA_RECV_POST.</div><div class='del'>-                                         */</div><div class='del'>-</div><div class='del'>-                                        /* </div><div class='del'>-                                         * if it is request, quota is returned</div><div class='del'>-                                         * after reply has come.</div><div class='del'>-                                         */</div><div class='del'>-                                        quota_ret = rdma_quota_put (peer);</div><div class='del'>-                                        if (quota_ret &lt; 0) {</div><div class='del'>-                                                gf_log ("rdma", GF_LOG_DEBUG,</div><div class='del'>-                                                        "failed to send "</div><div class='del'>-                                                        "message");</div><div class='del'>-                                        }</div><div class='del'>-                                }</div><div class='del'>-                        }</div><div class='del'>-</div><div class='del'>-                        if (peer) {</div><div class='del'>-                                rpc_transport_unref (peer-&gt;trans);</div><div class='del'>-                        } else {</div><div class='del'>-                                gf_log (RDMA_LOG_NAME, GF_LOG_DEBUG,</div><div class='del'>-                                        "could not lookup peer for qp_num: %d",</div><div class='del'>-                                        wc.qp_num);</div><div class='del'>-                        }</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                if (ret &lt; 0) {</div><div class='del'>-                        gf_log (RDMA_LOG_NAME, GF_LOG_ERROR,</div><div class='del'>-                                "ibv_poll_cq on `%s' returned error (ret = %d,"</div><div class='del'>-                                " errno = %d)",</div><div class='del'>-                                device-&gt;device_name, ret, errno);</div><div class='del'>-                        continue;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                ibv_ack_cq_events (event_cq, 1); </div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        return NULL;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-static void</div><div class='del'>-rdma_options_init (rpc_transport_t *this)</div><div class='del'>-{</div><div class='del'>-        rdma_private_t *priv = this-&gt;private;</div><div class='del'>-        rdma_options_t *options = &amp;priv-&gt;options;</div><div class='del'>-        int32_t mtu;</div><div class='del'>-        data_t *temp;</div><div class='del'>-</div><div class='del'>-        /* TODO: validate arguments from options below */</div><div class='del'>-</div><div class='del'>-        options-&gt;send_size = this-&gt;ctx-&gt;page_size * 4; /* 512 KB */</div><div class='del'>-        options-&gt;recv_size = this-&gt;ctx-&gt;page_size * 4; /* 512 KB */</div><div class='del'>-        options-&gt;send_count = 32;</div><div class='del'>-        options-&gt;recv_count = 32;</div><div class='del'>-</div><div class='del'>-        temp = dict_get (this-&gt;options,</div><div class='del'>-                         "transport.rdma.work-request-send-count");</div><div class='del'>-        if (temp)</div><div class='del'>-                options-&gt;send_count = data_to_int32 (temp);</div><div class='del'>-</div><div class='del'>-        temp = dict_get (this-&gt;options,</div><div class='del'>-                         "transport.rdma.work-request-recv-count");</div><div class='del'>-        if (temp)</div><div class='del'>-                options-&gt;recv_count = data_to_int32 (temp);</div><div class='del'>-</div><div class='del'>-        options-&gt;port = 0;</div><div class='del'>-        temp = dict_get (this-&gt;options,</div><div class='del'>-                         "transport.rdma.port");</div><div class='del'>-        if (temp)</div><div class='del'>-                options-&gt;port = data_to_uint64 (temp);</div><div class='del'>-</div><div class='del'>-        options-&gt;mtu = mtu = IBV_MTU_2048;</div><div class='del'>-        temp = dict_get (this-&gt;options,</div><div class='del'>-                         "transport.rdma.mtu");</div><div class='del'>-        if (temp)</div><div class='del'>-                mtu = data_to_int32 (temp);</div><div class='del'>-        switch (mtu) {</div><div class='del'>-        case 256: options-&gt;mtu = IBV_MTU_256;</div><div class='del'>-                break;</div><div class='del'>-        case 512: options-&gt;mtu = IBV_MTU_512;</div><div class='del'>-                break;</div><div class='del'>-        case 1024: options-&gt;mtu = IBV_MTU_1024;</div><div class='del'>-                break;</div><div class='del'>-        case 2048: options-&gt;mtu = IBV_MTU_2048;</div><div class='del'>-                break;</div><div class='del'>-        case 4096: options-&gt;mtu = IBV_MTU_4096;</div><div class='del'>-                break;</div><div class='del'>-        default:</div><div class='del'>-                if (temp)</div><div class='del'>-                        gf_log (RDMA_LOG_NAME, GF_LOG_WARNING,</div><div class='del'>-                                "%s: unrecognized MTU value '%s', defaulting "</div><div class='del'>-                                "to '2048'", this-&gt;name,</div><div class='del'>-                                data_to_str (temp));</div><div class='del'>-                else</div><div class='del'>-                        gf_log (RDMA_LOG_NAME, GF_LOG_TRACE,</div><div class='del'>-                                "%s: defaulting MTU to '2048'",</div><div class='del'>-                                this-&gt;name);</div><div class='del'>-                options-&gt;mtu = IBV_MTU_2048;</div><div class='del'>-                break;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        temp = dict_get (this-&gt;options,</div><div class='del'>-                         "transport.rdma.device-name");</div><div class='del'>-        if (temp)</div><div class='del'>-                options-&gt;device_name = gf_strdup (temp-&gt;data);</div><div class='del'>-</div><div class='del'>-        return;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-static void</div><div class='del'>-rdma_queue_init (rdma_queue_t *queue)</div><div class='del'>-{</div><div class='del'>-        pthread_mutex_init (&amp;queue-&gt;lock, NULL);</div><div class='del'>-</div><div class='del'>-        queue-&gt;active_posts.next = &amp;queue-&gt;active_posts;</div><div class='del'>-        queue-&gt;active_posts.prev = &amp;queue-&gt;active_posts;</div><div class='del'>-        queue-&gt;passive_posts.next = &amp;queue-&gt;passive_posts;</div><div class='del'>-        queue-&gt;passive_posts.prev = &amp;queue-&gt;passive_posts;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-static rdma_device_t *</div><div class='del'>-rdma_get_device (rpc_transport_t *this,</div><div class='del'>-                 struct ibv_context *ibctx)</div><div class='del'>-{</div><div class='del'>-        glusterfs_ctx_t *ctx    = NULL;</div><div class='del'>-        rdma_private_t *priv    = NULL;</div><div class='del'>-        rdma_options_t *options = NULL;</div><div class='del'>-        char *device_name       = NULL;</div><div class='del'>-        uint32_t port           = 0;</div><div class='del'>-        uint8_t active_port     = 0;</div><div class='del'>-        int32_t ret             = 0;</div><div class='del'>-        int32_t i               = 0;</div><div class='del'>-</div><div class='del'>-        rdma_device_t *trav = NULL;</div><div class='del'>-</div><div class='del'>-        priv        = this-&gt;private;</div><div class='del'>-        options     = &amp;priv-&gt;options;</div><div class='del'>-        device_name = priv-&gt;options.device_name;</div><div class='del'>-        ctx         = this-&gt;ctx;</div><div class='del'>-        trav        = ctx-&gt;ib;</div><div class='del'>-        port        = priv-&gt;options.port;</div><div class='del'>-</div><div class='del'>-        while (trav) {</div><div class='del'>-                if ((!strcmp (trav-&gt;device_name, device_name)) &amp;&amp; </div><div class='del'>-                    (trav-&gt;port == port))</div><div class='del'>-                        break;</div><div class='del'>-                trav = trav-&gt;next;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (!trav) {</div><div class='del'>-</div><div class='del'>-                trav = GF_CALLOC (1, sizeof (*trav), </div><div class='del'>-                                  gf_common_mt_rdma_device_t);</div><div class='del'>-                if (trav == NULL) {</div><div class='del'>-                        gf_log (RDMA_LOG_NAME, GF_LOG_ERROR, "out of memory");</div><div class='del'>-                        return NULL;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                priv-&gt;device = trav;</div><div class='del'>-</div><div class='del'>-                trav-&gt;context = ibctx;</div><div class='del'>-</div><div class='del'>-		ret = ib_get_active_port (trav-&gt;context);</div><div class='del'>-</div><div class='del'>-		if (ret &lt; 0) {</div><div class='del'>-			if (!port) {</div><div class='del'>-				gf_log (RDMA_LOG_NAME, GF_LOG_ERROR,</div><div class='del'>-					"Failed to find any active ports and "</div><div class='del'>-					"none specified in volume file,"</div><div class='del'>-                                        " exiting");</div><div class='del'>-				return NULL;</div><div class='del'>-			}</div><div class='del'>-		}</div><div class='del'>-</div><div class='del'>-		active_port = ret;</div><div class='del'>-</div><div class='del'>-                if (port) {</div><div class='del'>-                        ret = ib_check_active_port (trav-&gt;context, port);</div><div class='del'>-                        if (ret &lt; 0) {</div><div class='del'>-                                gf_log (RDMA_LOG_NAME, GF_LOG_WARNING,</div><div class='del'>-                                        "On device %s: provided port:%u is "</div><div class='del'>-                                        "found to be offline, continuing to "</div><div class='del'>-                                        "use the same port", device_name, port);</div><div class='del'>-                        }</div><div class='del'>-		} else {</div><div class='del'>-			priv-&gt;options.port = active_port;</div><div class='del'>-			port = active_port;</div><div class='del'>-			gf_log (RDMA_LOG_NAME, GF_LOG_TRACE,</div><div class='del'>-				"Port unspecified in volume file using active "</div><div class='del'>-                                "port: %u", port);</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                trav-&gt;device_name = gf_strdup (device_name);</div><div class='del'>-                trav-&gt;port = port;</div><div class='del'>-</div><div class='del'>-                trav-&gt;next = ctx-&gt;ib;</div><div class='del'>-                ctx-&gt;ib = trav;</div><div class='del'>-</div><div class='del'>-                trav-&gt;send_chan = ibv_create_comp_channel (trav-&gt;context);</div><div class='del'>-                if (!trav-&gt;send_chan) {</div><div class='del'>-                        gf_log (RDMA_LOG_NAME, GF_LOG_ERROR,</div><div class='del'>-                                "%s: could not create send completion channel",</div><div class='del'>-                                device_name);</div><div class='del'>-                        /* TODO: cleanup current mess */</div><div class='del'>-                        return NULL;</div><div class='del'>-                }</div><div class='del'>-    </div><div class='del'>-                trav-&gt;recv_chan = ibv_create_comp_channel (trav-&gt;context);</div><div class='del'>-                if (!trav-&gt;recv_chan) {</div><div class='del'>-                        gf_log (RDMA_LOG_NAME, GF_LOG_ERROR,</div><div class='del'>-                                "could not create recv completion channel");</div><div class='del'>-                        /* TODO: cleanup current mess */</div><div class='del'>-                        return NULL;</div><div class='del'>-                }</div><div class='del'>-      </div><div class='del'>-                if (rdma_create_cq (this) &lt; 0) {</div><div class='del'>-                        gf_log (RDMA_LOG_NAME, GF_LOG_ERROR,</div><div class='del'>-                                "%s: could not create CQ",</div><div class='del'>-                                this-&gt;name);</div><div class='del'>-                        return NULL;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                /* protection domain */</div><div class='del'>-                trav-&gt;pd = ibv_alloc_pd (trav-&gt;context);</div><div class='del'>-</div><div class='del'>-                if (!trav-&gt;pd) {</div><div class='del'>-                        gf_log (RDMA_LOG_NAME, GF_LOG_ERROR,</div><div class='del'>-                                "%s: could not allocate protection domain",</div><div class='del'>-                                this-&gt;name);</div><div class='del'>-                        return NULL;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                struct ibv_srq_init_attr attr = {</div><div class='del'>-                        .attr = {</div><div class='del'>-                                .max_wr = options-&gt;recv_count,</div><div class='del'>-                                .max_sge = 1</div><div class='del'>-                        }</div><div class='del'>-                };</div><div class='del'>-                trav-&gt;srq = ibv_create_srq (trav-&gt;pd, &amp;attr);</div><div class='del'>-</div><div class='del'>-                if (!trav-&gt;srq) {</div><div class='del'>-                        gf_log (RDMA_LOG_NAME, GF_LOG_ERROR,</div><div class='del'>-                                "%s: could not create SRQ",</div><div class='del'>-                                this-&gt;name);</div><div class='del'>-                        return NULL;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                /* queue init */</div><div class='del'>-                rdma_queue_init (&amp;trav-&gt;sendq);</div><div class='del'>-                rdma_queue_init (&amp;trav-&gt;recvq);</div><div class='del'>-</div><div class='del'>-                if (rdma_create_posts (this) &lt; 0) {</div><div class='del'>-                        gf_log (RDMA_LOG_NAME, GF_LOG_ERROR,</div><div class='del'>-                                "%s: could not allocate posts",</div><div class='del'>-                                this-&gt;name);</div><div class='del'>-                        return NULL;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                /* completion threads */</div><div class='del'>-                ret = pthread_create (&amp;trav-&gt;send_thread,</div><div class='del'>-                                      NULL,</div><div class='del'>-                                      rdma_send_completion_proc,</div><div class='del'>-                                      trav-&gt;send_chan);</div><div class='del'>-                if (ret) {</div><div class='del'>-                        gf_log (RDMA_LOG_NAME, GF_LOG_ERROR,</div><div class='del'>-                                "could not create send completion thread");</div><div class='del'>-                        return NULL;</div><div class='del'>-                }</div><div class='del'>-                ret = pthread_create (&amp;trav-&gt;recv_thread,</div><div class='del'>-                                      NULL,</div><div class='del'>-                                      rdma_recv_completion_proc,</div><div class='del'>-                                      trav-&gt;recv_chan);</div><div class='del'>-                if (ret) {</div><div class='del'>-                        gf_log (RDMA_LOG_NAME, GF_LOG_ERROR,</div><div class='del'>-                                "could not create recv completion thread");</div><div class='del'>-                        return NULL;</div><div class='del'>-                }</div><div class='del'>-  </div><div class='del'>-                /* qpreg */</div><div class='del'>-                pthread_mutex_init (&amp;trav-&gt;qpreg.lock, NULL);</div><div class='del'>-                for (i=0; i&lt;42; i++) {</div><div class='del'>-                        trav-&gt;qpreg.ents[i].next = &amp;trav-&gt;qpreg.ents[i];</div><div class='del'>-                        trav-&gt;qpreg.ents[i].prev = &amp;trav-&gt;qpreg.ents[i];</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='del'>-        return trav;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-static int32_t </div><div class='del'>-rdma_init (rpc_transport_t *this)</div><div class='del'>-{</div><div class='del'>-        rdma_private_t *priv = this-&gt;private;</div><div class='del'>-        rdma_options_t *options = &amp;priv-&gt;options;</div><div class='del'>-        struct ibv_device **dev_list;</div><div class='del'>-	struct ibv_context *ib_ctx = NULL;</div><div class='del'>-	int32_t ret = 0;</div><div class='del'>-</div><div class='del'>-        rdma_options_init (this);</div><div class='del'>-</div><div class='del'>-        {</div><div class='del'>-                dev_list = ibv_get_device_list (NULL);</div><div class='del'>-</div><div class='del'>-		if (!dev_list) {</div><div class='del'>-                        gf_log (RDMA_LOG_NAME,</div><div class='del'>-                                GF_LOG_CRITICAL,</div><div class='del'>-                                "Failed to get IB devices");</div><div class='del'>-			ret = -1;</div><div class='del'>-			goto cleanup;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                if (!*dev_list) {</div><div class='del'>-                        gf_log (RDMA_LOG_NAME,</div><div class='del'>-                                GF_LOG_CRITICAL,</div><div class='del'>-                                "No IB devices found");</div><div class='del'>-			ret = -1;</div><div class='del'>-                        goto cleanup;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                if (!options-&gt;device_name) {</div><div class='del'>-                        if (*dev_list) {</div><div class='del'>-                                options-&gt;device_name = </div><div class='del'>-                                        gf_strdup (ibv_get_device_name (*dev_list));</div><div class='del'>-                        } else {</div><div class='del'>-                                gf_log (RDMA_LOG_NAME, GF_LOG_CRITICAL,</div><div class='del'>-                                        "IB device list is empty. Check for "</div><div class='del'>-                                        "'ib_uverbs' module");</div><div class='del'>-                                return -1;</div><div class='del'>-                                goto cleanup;</div><div class='del'>-                        }</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-		while (*dev_list) {</div><div class='del'>-                        if (!strcmp (ibv_get_device_name (*dev_list),</div><div class='del'>-                                     options-&gt;device_name)) {</div><div class='del'>-                                ib_ctx = ibv_open_device (*dev_list);</div><div class='del'>-</div><div class='del'>-                                if (!ib_ctx) {</div><div class='del'>-                                        gf_log (RDMA_LOG_NAME,</div><div class='del'>-                                                GF_LOG_ERROR,</div><div class='del'>-                                                "Failed to get infiniband"</div><div class='del'>-                                                "device context");</div><div class='del'>-                                        ret = -1;</div><div class='del'>-                                        goto cleanup;</div><div class='del'>-                                }</div><div class='del'>-                                break;</div><div class='del'>-                        }</div><div class='del'>-			++dev_list;</div><div class='del'>-		}</div><div class='del'>-</div><div class='del'>-		priv-&gt;device = rdma_get_device (this, ib_ctx);</div><div class='del'>-</div><div class='del'>-                if (!priv-&gt;device) {</div><div class='del'>-                        gf_log (RDMA_LOG_NAME, GF_LOG_ERROR,</div><div class='del'>-                                "could not create rdma device for %s",</div><div class='del'>-                                options-&gt;device_name);</div><div class='del'>-                        ret = -1;</div><div class='del'>-			goto cleanup;</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        priv-&gt;peer.trans = this;</div><div class='del'>-        INIT_LIST_HEAD (&amp;priv-&gt;peer.ioq);</div><div class='del'>-  </div><div class='del'>-        pthread_mutex_init (&amp;priv-&gt;read_mutex, NULL);</div><div class='del'>-        pthread_mutex_init (&amp;priv-&gt;write_mutex, NULL);</div><div class='del'>-        pthread_mutex_init (&amp;priv-&gt;recv_mutex, NULL);</div><div class='del'>-        pthread_cond_init (&amp;priv-&gt;recv_cond, NULL);</div><div class='del'>-</div><div class='del'>-        priv-&gt;request_ctx_pool = mem_pool_new (rdma_request_context_t,</div><div class='del'>-                                               RDMA_POOL_SIZE);</div><div class='del'>-        if (priv-&gt;request_ctx_pool == NULL) {</div><div class='del'>-                gf_log (RDMA_LOG_NAME, GF_LOG_ERROR, "out of memory");</div><div class='del'>-                GF_FREE (priv);</div><div class='del'>-                return -1;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        priv-&gt;ioq_pool = mem_pool_new (rdma_ioq_t, RDMA_POOL_SIZE);</div><div class='del'>-        if (priv-&gt;ioq_pool == NULL) {</div><div class='del'>-                gf_log (RDMA_LOG_NAME, GF_LOG_ERROR, "out of memory");</div><div class='del'>-                mem_pool_destroy (priv-&gt;request_ctx_pool);</div><div class='del'>-                GF_FREE (priv);</div><div class='del'>-                return -1;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        priv-&gt;reply_info_pool = mem_pool_new (rdma_reply_info_t,</div><div class='del'>-                                              RDMA_POOL_SIZE);</div><div class='del'>-        if (priv-&gt;reply_info_pool == NULL) {</div><div class='del'>-                gf_log (RDMA_LOG_NAME, GF_LOG_ERROR, "out of memory");</div><div class='del'>-                mem_pool_destroy (priv-&gt;request_ctx_pool);</div><div class='del'>-                mem_pool_destroy (priv-&gt;ioq_pool);</div><div class='del'>-                GF_FREE (priv);</div><div class='del'>-                return -1;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-cleanup:</div><div class='del'>-	if (-1 == ret) {</div><div class='del'>-		if (ib_ctx)</div><div class='del'>-			ibv_close_device (ib_ctx);</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	if (dev_list)</div><div class='del'>-		ibv_free_device_list (dev_list);</div><div class='del'>-</div><div class='del'>-	return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-static int32_t</div><div class='del'>-rdma_disconnect (rpc_transport_t *this)</div><div class='del'>-{</div><div class='del'>-        rdma_private_t *priv = this-&gt;private;</div><div class='del'>-        int32_t ret = 0;</div><div class='del'>- </div><div class='del'>-        pthread_mutex_lock (&amp;priv-&gt;write_mutex);</div><div class='del'>-        {</div><div class='del'>-                ret = __rdma_disconnect (this);</div><div class='del'>-        }</div><div class='del'>-        pthread_mutex_unlock (&amp;priv-&gt;write_mutex);</div><div class='del'>-</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-static int32_t</div><div class='del'>-__tcp_connect_finish (int fd)</div><div class='del'>-{</div><div class='del'>-        int ret = -1;</div><div class='del'>-        int optval = 0;</div><div class='del'>-        socklen_t optlen = sizeof (int);</div><div class='del'>-</div><div class='del'>-        ret = getsockopt (fd, SOL_SOCKET, SO_ERROR,</div><div class='del'>-                          (void *)&amp;optval, &amp;optlen);</div><div class='del'>-</div><div class='del'>-        if (ret == 0 &amp;&amp; optval)</div><div class='del'>-        {</div><div class='del'>-                errno = optval;</div><div class='del'>-                ret = -1;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-static inline void</div><div class='del'>-rdma_fill_handshake_data (char *buf, struct rdma_nbio *nbio, </div><div class='del'>-                          rdma_private_t *priv)</div><div class='del'>-{</div><div class='del'>-        sprintf (buf,</div><div class='del'>-                 "QP1:RECV_BLKSIZE=%08x:SEND_BLKSIZE=%08x\n"</div><div class='del'>-                 "QP1:LID=%04x:QPN=%06x:PSN=%06x\n",</div><div class='del'>-                 priv-&gt;peer.recv_size,</div><div class='del'>-                 priv-&gt;peer.send_size,</div><div class='del'>-                 priv-&gt;peer.local_lid,</div><div class='del'>-                 priv-&gt;peer.local_qpn,</div><div class='del'>-                 priv-&gt;peer.local_psn);</div><div class='del'>-</div><div class='del'>-        nbio-&gt;vector.iov_base = buf;</div><div class='del'>-        nbio-&gt;vector.iov_len = strlen (buf) + 1;</div><div class='del'>-        nbio-&gt;count = 1;</div><div class='del'>-        return;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-static inline void</div><div class='del'>-rdma_fill_handshake_ack (char *buf, struct rdma_nbio *nbio)</div><div class='del'>-{</div><div class='del'>-        sprintf (buf, "DONE\n");</div><div class='del'>-        nbio-&gt;vector.iov_base = buf;</div><div class='del'>-        nbio-&gt;vector.iov_len = strlen (buf) + 1;</div><div class='del'>-        nbio-&gt;count = 1;</div><div class='del'>-        return;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-static int</div><div class='del'>-rdma_handshake_pollin (rpc_transport_t *this)</div><div class='del'>-{</div><div class='del'>-        int ret = 0;</div><div class='del'>-        rdma_private_t *priv = this-&gt;private;</div><div class='del'>-        char *buf = priv-&gt;handshake.incoming.buf;</div><div class='del'>-        int32_t recv_buf_size, send_buf_size;</div><div class='del'>-        socklen_t sock_len;</div><div class='del'>-</div><div class='del'>-        if (priv-&gt;handshake.incoming.state == RDMA_HANDSHAKE_COMPLETE) {</div><div class='del'>-                return -1;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        pthread_mutex_lock (&amp;priv-&gt;write_mutex);</div><div class='del'>-        {</div><div class='del'>-                while (priv-&gt;handshake.incoming.state != RDMA_HANDSHAKE_COMPLETE)</div><div class='del'>-                {</div><div class='del'>-                        switch (priv-&gt;handshake.incoming.state) </div><div class='del'>-                        {</div><div class='del'>-                        case RDMA_HANDSHAKE_START:</div><div class='del'>-                                buf = priv-&gt;handshake.incoming.buf = GF_CALLOC (1, 256, gf_common_mt_char);</div><div class='del'>-                                rdma_fill_handshake_data (buf, &amp;priv-&gt;handshake.incoming, priv);</div><div class='del'>-                                buf[0] = 0;</div><div class='del'>-                                priv-&gt;handshake.incoming.state = RDMA_HANDSHAKE_RECEIVING_DATA;</div><div class='del'>-                                break;</div><div class='del'>-</div><div class='del'>-                        case RDMA_HANDSHAKE_RECEIVING_DATA:</div><div class='del'>-                                ret = __tcp_readv (this, </div><div class='del'>-                                                   &amp;priv-&gt;handshake.incoming.vector, </div><div class='del'>-                                                   priv-&gt;handshake.incoming.count,</div><div class='del'>-                                                   &amp;priv-&gt;handshake.incoming.pending_vector, </div><div class='del'>-                                                   &amp;priv-&gt;handshake.incoming.pending_count);</div><div class='del'>-                                if (ret == -1) {</div><div class='del'>-                                        goto unlock;</div><div class='del'>-                                }</div><div class='del'>-</div><div class='del'>-                                if (ret &gt; 0) {</div><div class='del'>-                                        gf_log (this-&gt;name, GF_LOG_TRACE,</div><div class='del'>-                                                "partial header read on NB socket. continue later");</div><div class='del'>-                                        goto unlock;</div><div class='del'>-                                }</div><div class='del'>-            </div><div class='del'>-                                if (!ret) {</div><div class='del'>-                                        priv-&gt;handshake.incoming.state = RDMA_HANDSHAKE_RECEIVED_DATA;</div><div class='del'>-                                }</div><div class='del'>-                                break;</div><div class='del'>-</div><div class='del'>-                        case RDMA_HANDSHAKE_RECEIVED_DATA:</div><div class='del'>-                                ret = sscanf (buf,</div><div class='del'>-                                              "QP1:RECV_BLKSIZE=%08x:SEND_BLKSIZE=%08x\n"</div><div class='del'>-                                              "QP1:LID=%04x:QPN=%06x:PSN=%06x\n",</div><div class='del'>-                                              &amp;recv_buf_size,</div><div class='del'>-                                              &amp;send_buf_size,</div><div class='del'>-                                              &amp;priv-&gt;peer.remote_lid,</div><div class='del'>-                                              &amp;priv-&gt;peer.remote_qpn,</div><div class='del'>-                                              &amp;priv-&gt;peer.remote_psn);</div><div class='del'>-</div><div class='del'>-                                if ((ret != 5) &amp;&amp; (strncmp (buf, "QP1:", 4))) {</div><div class='del'>-                                        gf_log (RDMA_LOG_NAME, </div><div class='del'>-                                                GF_LOG_CRITICAL,</div><div class='del'>-                                                "%s: remote-host(%s)'s "</div><div class='del'>-                                                "transport type is different",</div><div class='del'>-                                                this-&gt;name, </div><div class='del'>-                                                this-&gt;peerinfo.identifier);</div><div class='del'>-                                        ret = -1;</div><div class='del'>-                                        goto unlock;</div><div class='del'>-                                }</div><div class='del'>-</div><div class='del'>-                                if (recv_buf_size &lt; priv-&gt;peer.recv_size)</div><div class='del'>-                                        priv-&gt;peer.recv_size = recv_buf_size;</div><div class='del'>-                                if (send_buf_size &lt; priv-&gt;peer.send_size)</div><div class='del'>-                                        priv-&gt;peer.send_size = send_buf_size;</div><div class='del'>-          </div><div class='del'>-                                gf_log (RDMA_LOG_NAME, GF_LOG_TRACE,</div><div class='del'>-                                        "%s: transacted recv_size=%d "</div><div class='del'>-                                        "send_size=%d",</div><div class='del'>-                                        this-&gt;name, priv-&gt;peer.recv_size,</div><div class='del'>-                                        priv-&gt;peer.send_size);</div><div class='del'>-</div><div class='del'>-                                priv-&gt;peer.quota = priv-&gt;peer.send_count;</div><div class='del'>-</div><div class='del'>-                                if (rdma_connect_qp (this)) {</div><div class='del'>-                                        gf_log (RDMA_LOG_NAME, </div><div class='del'>-                                                GF_LOG_ERROR,</div><div class='del'>-                                                "%s: failed to connect with "</div><div class='del'>-                                                "remote QP", this-&gt;name);</div><div class='del'>-                                        ret = -1;</div><div class='del'>-                                        goto unlock;</div><div class='del'>-                                }</div><div class='del'>-                                rdma_fill_handshake_ack (buf, &amp;priv-&gt;handshake.incoming);</div><div class='del'>-                                buf[0] = 0;</div><div class='del'>-                                priv-&gt;handshake.incoming.state = RDMA_HANDSHAKE_RECEIVING_ACK;</div><div class='del'>-                                break;</div><div class='del'>-</div><div class='del'>-                        case RDMA_HANDSHAKE_RECEIVING_ACK:</div><div class='del'>-                                ret = __tcp_readv (this, </div><div class='del'>-                                                   &amp;priv-&gt;handshake.incoming.vector, </div><div class='del'>-                                                   priv-&gt;handshake.incoming.count,</div><div class='del'>-                                                   &amp;priv-&gt;handshake.incoming.pending_vector, </div><div class='del'>-                                                   &amp;priv-&gt;handshake.incoming.pending_count);</div><div class='del'>-                                if (ret == -1) {</div><div class='del'>-                                        goto unlock;</div><div class='del'>-                                }</div><div class='del'>-</div><div class='del'>-                                if (ret &gt; 0) {</div><div class='del'>-                                        gf_log (this-&gt;name, GF_LOG_TRACE,</div><div class='del'>-                                                "partial header read on NB "</div><div class='del'>-                                                "socket. continue later");</div><div class='del'>-                                        goto unlock;</div><div class='del'>-                                }</div><div class='del'>-            </div><div class='del'>-                                if (!ret) {</div><div class='del'>-                                        priv-&gt;handshake.incoming.state = RDMA_HANDSHAKE_RECEIVED_ACK;</div><div class='del'>-                                }</div><div class='del'>-                                break;</div><div class='del'>-</div><div class='del'>-                        case RDMA_HANDSHAKE_RECEIVED_ACK:</div><div class='del'>-                                if (strncmp (buf, "DONE", 4)) {</div><div class='del'>-                                        gf_log (RDMA_LOG_NAME, </div><div class='del'>-                                                GF_LOG_DEBUG,</div><div class='del'>-                                                "%s: handshake-3 did not "</div><div class='del'>-                                                "return 'DONE' (%s)",</div><div class='del'>-                                                this-&gt;name, buf);</div><div class='del'>-                                        ret = -1;</div><div class='del'>-                                        goto unlock;</div><div class='del'>-                                }</div><div class='del'>-                                ret = 0;</div><div class='del'>-                                priv-&gt;connected = 1;</div><div class='del'>-                                sock_len = sizeof (struct sockaddr_storage);</div><div class='del'>-                                getpeername (priv-&gt;sock,</div><div class='del'>-                                             (struct sockaddr *) &amp;this-&gt;peerinfo.sockaddr,</div><div class='del'>-                                             &amp;sock_len);</div><div class='del'>-</div><div class='del'>-                                GF_FREE (priv-&gt;handshake.incoming.buf);</div><div class='del'>-                                priv-&gt;handshake.incoming.buf = NULL;</div><div class='del'>-                                priv-&gt;handshake.incoming.state = RDMA_HANDSHAKE_COMPLETE;</div><div class='del'>-                        }</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='del'>-unlock:</div><div class='del'>-        pthread_mutex_unlock (&amp;priv-&gt;write_mutex);</div><div class='del'>-</div><div class='del'>-        if (ret == -1) {</div><div class='del'>-                rpc_transport_disconnect (this);</div><div class='del'>-        } else {</div><div class='del'>-                ret = 0;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-        if (!ret &amp;&amp; priv-&gt;connected) {</div><div class='del'>-                if (priv-&gt;is_server) {</div><div class='del'>-                        ret = rpc_transport_notify (priv-&gt;listener,</div><div class='del'>-                                                    RPC_TRANSPORT_ACCEPT,</div><div class='del'>-                                                    this);</div><div class='del'>-                } else {</div><div class='del'>-                        ret = rpc_transport_notify (this, RPC_TRANSPORT_CONNECT,</div><div class='del'>-                                                    this);</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-static int </div><div class='del'>-rdma_handshake_pollout (rpc_transport_t *this)</div><div class='del'>-{</div><div class='del'>-        rdma_private_t *priv = this-&gt;private;</div><div class='del'>-        char *buf = priv-&gt;handshake.outgoing.buf;</div><div class='del'>-        int32_t ret = 0;</div><div class='del'>-</div><div class='del'>-        if (priv-&gt;handshake.outgoing.state == RDMA_HANDSHAKE_COMPLETE) {</div><div class='del'>-                return 0;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        pthread_mutex_unlock (&amp;priv-&gt;write_mutex);</div><div class='del'>-        {</div><div class='del'>-                while (priv-&gt;handshake.outgoing.state != RDMA_HANDSHAKE_COMPLETE)</div><div class='del'>-                {</div><div class='del'>-                        switch (priv-&gt;handshake.outgoing.state) </div><div class='del'>-                        {</div><div class='del'>-                        case RDMA_HANDSHAKE_START:</div><div class='del'>-                                buf = priv-&gt;handshake.outgoing.buf = GF_CALLOC (1, 256, gf_common_mt_char);</div><div class='del'>-                                rdma_fill_handshake_data (buf, &amp;priv-&gt;handshake.outgoing, priv);</div><div class='del'>-                                priv-&gt;handshake.outgoing.state = RDMA_HANDSHAKE_SENDING_DATA;</div><div class='del'>-                                break;</div><div class='del'>-</div><div class='del'>-                        case RDMA_HANDSHAKE_SENDING_DATA:</div><div class='del'>-                                ret = __tcp_writev (this, </div><div class='del'>-                                                    &amp;priv-&gt;handshake.outgoing.vector, </div><div class='del'>-                                                    priv-&gt;handshake.outgoing.count,</div><div class='del'>-                                                    &amp;priv-&gt;handshake.outgoing.pending_vector, </div><div class='del'>-                                                    &amp;priv-&gt;handshake.outgoing.pending_count);</div><div class='del'>-                                if (ret == -1) {</div><div class='del'>-                                        goto unlock;</div><div class='del'>-                                }</div><div class='del'>-</div><div class='del'>-                                if (ret &gt; 0) {</div><div class='del'>-                                        gf_log (this-&gt;name, GF_LOG_TRACE,</div><div class='del'>-                                                "partial header read on NB socket. continue later");</div><div class='del'>-                                        goto unlock;</div><div class='del'>-                                }</div><div class='del'>-            </div><div class='del'>-                                if (!ret) {</div><div class='del'>-                                        priv-&gt;handshake.outgoing.state = RDMA_HANDSHAKE_SENT_DATA;</div><div class='del'>-                                }</div><div class='del'>-                                break;</div><div class='del'>-</div><div class='del'>-                        case RDMA_HANDSHAKE_SENT_DATA:</div><div class='del'>-                                rdma_fill_handshake_ack (buf, &amp;priv-&gt;handshake.outgoing);</div><div class='del'>-                                priv-&gt;handshake.outgoing.state = RDMA_HANDSHAKE_SENDING_ACK;</div><div class='del'>-                                break;</div><div class='del'>-</div><div class='del'>-                        case RDMA_HANDSHAKE_SENDING_ACK:</div><div class='del'>-                                ret = __tcp_writev (this,</div><div class='del'>-                                                    &amp;priv-&gt;handshake.outgoing.vector,</div><div class='del'>-                                                    priv-&gt;handshake.outgoing.count,</div><div class='del'>-                                                    &amp;priv-&gt;handshake.outgoing.pending_vector,</div><div class='del'>-                                                    &amp;priv-&gt;handshake.outgoing.pending_count);</div><div class='del'>-</div><div class='del'>-                                if (ret == -1) {</div><div class='del'>-                                        goto unlock;</div><div class='del'>-                                }</div><div class='del'>-</div><div class='del'>-                                if (ret &gt; 0) {</div><div class='del'>-                                        gf_log (this-&gt;name, GF_LOG_TRACE,</div><div class='del'>-                                                "partial header read on NB "</div><div class='del'>-                                                "socket. continue later");</div><div class='del'>-                                        goto unlock;</div><div class='del'>-                                }</div><div class='del'>-            </div><div class='del'>-                                if (!ret) {</div><div class='del'>-                                        GF_FREE (priv-&gt;handshake.outgoing.buf);</div><div class='del'>-                                        priv-&gt;handshake.outgoing.buf = NULL;</div><div class='del'>-                                        priv-&gt;handshake.outgoing.state = RDMA_HANDSHAKE_COMPLETE;</div><div class='del'>-                                }</div><div class='del'>-                                break;</div><div class='del'>-                        }</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='del'>-unlock:</div><div class='del'>-        pthread_mutex_unlock (&amp;priv-&gt;write_mutex);</div><div class='del'>-</div><div class='del'>-        if (ret == -1) {</div><div class='del'>-                rpc_transport_disconnect (this);</div><div class='del'>-        } else {</div><div class='del'>-                ret = 0;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-static int</div><div class='del'>-rdma_handshake_pollerr (rpc_transport_t *this)</div><div class='del'>-{</div><div class='del'>-        rdma_private_t *priv = this-&gt;private;</div><div class='del'>-        int32_t ret = 0;</div><div class='del'>-        char need_unref = 0;</div><div class='del'>-</div><div class='del'>-        gf_log (RDMA_LOG_NAME, GF_LOG_DEBUG,</div><div class='del'>-                "%s: peer disconnected, cleaning up",</div><div class='del'>-                this-&gt;name);</div><div class='del'>-</div><div class='del'>-        pthread_mutex_lock (&amp;priv-&gt;write_mutex);</div><div class='del'>-        {</div><div class='del'>-                __rdma_teardown (this);</div><div class='del'>-</div><div class='del'>-                if (priv-&gt;sock != -1) {</div><div class='del'>-                        event_unregister (this-&gt;ctx-&gt;event_pool, </div><div class='del'>-                                          priv-&gt;sock, priv-&gt;idx);</div><div class='del'>-                        need_unref = 1;</div><div class='del'>-</div><div class='del'>-                        if (close (priv-&gt;sock) != 0) {</div><div class='del'>-                                gf_log (RDMA_LOG_NAME, GF_LOG_ERROR,</div><div class='del'>-                                        "close () - error: %s",</div><div class='del'>-                                        strerror (errno));</div><div class='del'>-                                ret = -errno;</div><div class='del'>-                        }</div><div class='del'>-                        priv-&gt;tcp_connected = priv-&gt;connected = 0;</div><div class='del'>-                        priv-&gt;sock = -1;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                if (priv-&gt;handshake.incoming.buf) {</div><div class='del'>-                        GF_FREE (priv-&gt;handshake.incoming.buf);</div><div class='del'>-                        priv-&gt;handshake.incoming.buf = NULL;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                priv-&gt;handshake.incoming.state = RDMA_HANDSHAKE_START;</div><div class='del'>-</div><div class='del'>-                if (priv-&gt;handshake.outgoing.buf) {</div><div class='del'>-                        GF_FREE (priv-&gt;handshake.outgoing.buf);</div><div class='del'>-                        priv-&gt;handshake.outgoing.buf = NULL;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                priv-&gt;handshake.outgoing.state = RDMA_HANDSHAKE_START;</div><div class='del'>-        }</div><div class='del'>-        pthread_mutex_unlock (&amp;priv-&gt;write_mutex);</div><div class='del'>-</div><div class='del'>-        rpc_transport_notify (this, RPC_TRANSPORT_DISCONNECT, this);</div><div class='del'>-</div><div class='del'>-        if (need_unref)</div><div class='del'>-                rpc_transport_unref (this);</div><div class='del'>-</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-static int</div><div class='del'>-tcp_connect_finish (rpc_transport_t *this)</div><div class='del'>-{</div><div class='del'>-        rdma_private_t *priv = this-&gt;private;</div><div class='del'>-        int error = 0, ret = 0;</div><div class='del'>-</div><div class='del'>-        pthread_mutex_lock (&amp;priv-&gt;write_mutex);</div><div class='del'>-        {</div><div class='del'>-                ret = __tcp_connect_finish (priv-&gt;sock);</div><div class='del'>-</div><div class='del'>-                if (!ret) {</div><div class='del'>-                        this-&gt;myinfo.sockaddr_len = </div><div class='del'>-                                sizeof (this-&gt;myinfo.sockaddr);</div><div class='del'>-                        ret = getsockname (priv-&gt;sock,</div><div class='del'>-                                           (struct sockaddr *)&amp;this-&gt;myinfo.sockaddr, </div><div class='del'>-                                           &amp;this-&gt;myinfo.sockaddr_len);</div><div class='del'>-                        if (ret == -1) </div><div class='del'>-                        {</div><div class='del'>-                                gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-                                        "getsockname on new client-socket %d "</div><div class='del'>-                                        "failed (%s)", </div><div class='del'>-                                        priv-&gt;sock, strerror (errno));</div><div class='del'>-                                close (priv-&gt;sock);</div><div class='del'>-                                error = 1;</div><div class='del'>-                                goto unlock;</div><div class='del'>-                        }</div><div class='del'>-</div><div class='del'>-                        gf_rdma_get_transport_identifiers (this);</div><div class='del'>-                        priv-&gt;tcp_connected = 1;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                if (ret == -1 &amp;&amp; errno != EINPROGRESS) {</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-                                "tcp connect to %s failed (%s)", </div><div class='del'>-                                this-&gt;peerinfo.identifier, strerror (errno));</div><div class='del'>-                        error = 1;</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='del'>-unlock:</div><div class='del'>-        pthread_mutex_unlock (&amp;priv-&gt;write_mutex);</div><div class='del'>-</div><div class='del'>-        if (error) {</div><div class='del'>-                rpc_transport_disconnect (this);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-static int</div><div class='del'>-rdma_event_handler (int fd, int idx, void *data,</div><div class='del'>-                    int poll_in, int poll_out, int poll_err)</div><div class='del'>-{</div><div class='del'>-        rpc_transport_t *this = data;</div><div class='del'>-        rdma_private_t *priv = this-&gt;private;</div><div class='del'>-        rdma_options_t *options = NULL;</div><div class='del'>-        int ret = 0;</div><div class='del'>-</div><div class='del'>-        if (!priv-&gt;tcp_connected) {</div><div class='del'>-                ret = tcp_connect_finish (this);</div><div class='del'>-                if (priv-&gt;tcp_connected) {</div><div class='del'>-                        options = &amp;priv-&gt;options;</div><div class='del'>-</div><div class='del'>-                        priv-&gt;peer.send_count = options-&gt;send_count;</div><div class='del'>-                        priv-&gt;peer.recv_count = options-&gt;recv_count;</div><div class='del'>-                        priv-&gt;peer.send_size = options-&gt;send_size;</div><div class='del'>-                        priv-&gt;peer.recv_size = options-&gt;recv_size;</div><div class='del'>-</div><div class='del'>-                        if ((ret = rdma_create_qp (this)) &lt; 0) {</div><div class='del'>-                                gf_log (RDMA_LOG_NAME, GF_LOG_ERROR,</div><div class='del'>-                                        "%s: could not create QP",</div><div class='del'>-                                        this-&gt;name);</div><div class='del'>-                                rpc_transport_disconnect (this);</div><div class='del'>-                        }</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (!ret &amp;&amp; poll_out &amp;&amp; priv-&gt;tcp_connected) {</div><div class='del'>-                ret = rdma_handshake_pollout (this);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (!ret &amp;&amp; poll_in &amp;&amp; priv-&gt;tcp_connected) {</div><div class='del'>-                if (priv-&gt;handshake.incoming.state == RDMA_HANDSHAKE_COMPLETE) {</div><div class='del'>-                        gf_log (RDMA_LOG_NAME, GF_LOG_ERROR,</div><div class='del'>-                                "%s: pollin received on tcp socket (peer: %s) "</div><div class='del'>-                                "after handshake is complete",</div><div class='del'>-                                this-&gt;name, this-&gt;peerinfo.identifier);</div><div class='del'>-                        rdma_handshake_pollerr (this);</div><div class='del'>-                        return 0;</div><div class='del'>-                }</div><div class='del'>-                ret = rdma_handshake_pollin (this);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (ret &lt; 0 || poll_err) {</div><div class='del'>-                ret = rdma_handshake_pollerr (this);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-static int</div><div class='del'>-__tcp_nonblock (int fd)</div><div class='del'>-{</div><div class='del'>-        int flags = 0;</div><div class='del'>-        int ret = -1;</div><div class='del'>-</div><div class='del'>-        flags = fcntl (fd, F_GETFL);</div><div class='del'>-</div><div class='del'>-        if (flags != -1)</div><div class='del'>-                ret = fcntl (fd, F_SETFL, flags | O_NONBLOCK);</div><div class='del'>-</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-static int32_t</div><div class='del'>-rdma_connect (struct rpc_transport *this, int port)</div><div class='del'>-{</div><div class='del'>-        dict_t *options = this-&gt;options;</div><div class='del'>-  </div><div class='del'>-        rdma_private_t *priv = this-&gt;private;</div><div class='del'>-  </div><div class='del'>-        int32_t ret = 0;</div><div class='del'>-        gf_boolean_t non_blocking = 1;</div><div class='del'>-        struct sockaddr_storage sockaddr;</div><div class='del'>-        socklen_t sockaddr_len = 0;</div><div class='del'>-</div><div class='del'>-        if (priv-&gt;connected) {</div><div class='del'>-                return 0;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (dict_get (options, "non-blocking-io")) {</div><div class='del'>-                char *nb_connect = data_to_str (dict_get (this-&gt;options,</div><div class='del'>-                                                          "non-blocking-io"));</div><div class='del'>-          </div><div class='del'>-                if (gf_string2boolean (nb_connect, &amp;non_blocking) == -1) {</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-                                "'non-blocking-io' takes only boolean "</div><div class='del'>-                                "options, not taking any action");</div><div class='del'>-                        non_blocking = 1;</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        ret = gf_rdma_client_get_remote_sockaddr (this,</div><div class='del'>-                                                  (struct sockaddr *)&amp;sockaddr,</div><div class='del'>-                                                  &amp;sockaddr_len, port);</div><div class='del'>-        if (ret != 0) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-                        "cannot get remote address to connect");</div><div class='del'>-                return ret;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        pthread_mutex_lock (&amp;priv-&gt;write_mutex);</div><div class='del'>-        {</div><div class='del'>-                if (priv-&gt;sock != -1) {</div><div class='del'>-                        ret = 0;</div><div class='del'>-                        goto unlock;</div><div class='del'>-                }</div><div class='del'>-  </div><div class='del'>-                priv-&gt;sock = socket (((struct sockaddr *)&amp;sockaddr)-&gt;sa_family,</div><div class='del'>-                                     SOCK_STREAM, 0);</div><div class='del'>-        </div><div class='del'>-                if (priv-&gt;sock == -1) {</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-                                "socket () - error: %s", strerror (errno));</div><div class='del'>-                        ret = -errno;</div><div class='del'>-                        goto unlock;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_TRACE,</div><div class='del'>-                        "socket fd = %d", priv-&gt;sock);</div><div class='del'>-</div><div class='del'>-                memcpy (&amp;this-&gt;peerinfo.sockaddr, &amp;sockaddr, sockaddr_len);</div><div class='del'>-                this-&gt;peerinfo.sockaddr_len = sockaddr_len;</div><div class='del'>-</div><div class='del'>-                if (port &gt; 0)</div><div class='del'>-                        ((struct sockaddr_in *) (&amp;sockaddr))-&gt;sin_port</div><div class='del'>-                                = htons (port);</div><div class='del'>-</div><div class='del'>-                ((struct sockaddr *) &amp;this-&gt;myinfo.sockaddr)-&gt;sa_family = </div><div class='del'>-                        ((struct sockaddr *)&amp;this-&gt;peerinfo.sockaddr)-&gt;sa_family;</div><div class='del'>-</div><div class='del'>-                if (non_blocking) </div><div class='del'>-                {</div><div class='del'>-                        ret = __tcp_nonblock (priv-&gt;sock);</div><div class='del'>-        </div><div class='del'>-                        if (ret == -1)</div><div class='del'>-                        {</div><div class='del'>-                                gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-                                        "could not set socket %d to non "</div><div class='del'>-                                        "blocking mode (%s)",</div><div class='del'>-                                        priv-&gt;sock, strerror (errno));</div><div class='del'>-                                close (priv-&gt;sock);</div><div class='del'>-                                priv-&gt;sock = -1;</div><div class='del'>-                                goto unlock;</div><div class='del'>-                        }</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                ret = gf_rdma_client_bind (this,</div><div class='del'>-                                           (struct sockaddr *)&amp;this-&gt;myinfo.sockaddr,</div><div class='del'>-                                           &amp;this-&gt;myinfo.sockaddr_len, priv-&gt;sock);</div><div class='del'>-                if (ret == -1)</div><div class='del'>-                {</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_WARNING,</div><div class='del'>-                                "client bind failed: %s", strerror (errno));</div><div class='del'>-                        close (priv-&gt;sock);</div><div class='del'>-                        priv-&gt;sock = -1;</div><div class='del'>-                        goto unlock;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                ret = connect (priv-&gt;sock, </div><div class='del'>-                               (struct sockaddr *)&amp;this-&gt;peerinfo.sockaddr, </div><div class='del'>-                               this-&gt;peerinfo.sockaddr_len);</div><div class='del'>-                if (ret == -1 &amp;&amp; errno != EINPROGRESS)</div><div class='del'>-                {</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-                                "connection attempt failed (%s)", </div><div class='del'>-                                strerror (errno));</div><div class='del'>-                        close (priv-&gt;sock);</div><div class='del'>-                        priv-&gt;sock = -1;</div><div class='del'>-                        goto unlock;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                priv-&gt;tcp_connected = priv-&gt;connected = 0;</div><div class='del'>-</div><div class='del'>-                rpc_transport_ref (this);</div><div class='del'>-</div><div class='del'>-                priv-&gt;handshake.incoming.state = RDMA_HANDSHAKE_START;</div><div class='del'>-                priv-&gt;handshake.outgoing.state = RDMA_HANDSHAKE_START;</div><div class='del'>-                        </div><div class='del'>-                priv-&gt;idx = event_register (this-&gt;ctx-&gt;event_pool, </div><div class='del'>-                                            priv-&gt;sock, rdma_event_handler,</div><div class='del'>-                                            this, 1, 1); </div><div class='del'>-        }</div><div class='del'>-unlock:</div><div class='del'>-        pthread_mutex_unlock (&amp;priv-&gt;write_mutex);</div><div class='del'>-</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-static int</div><div class='del'>-rdma_server_event_handler (int fd, int idx, void *data,</div><div class='del'>-                           int poll_in, int poll_out, int poll_err)</div><div class='del'>-{</div><div class='del'>-        int32_t main_sock = -1;</div><div class='del'>-        rpc_transport_t *this, *trans = data;</div><div class='del'>-        rdma_private_t *priv = NULL;</div><div class='del'>-        rdma_private_t *trans_priv = (rdma_private_t *) trans-&gt;private;</div><div class='del'>-        rdma_options_t *options = NULL;</div><div class='del'>-</div><div class='del'>-        if (!poll_in) {</div><div class='del'>-                return 0;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        this = GF_CALLOC (1, sizeof (rpc_transport_t),</div><div class='del'>-                          gf_common_mt_rpc_transport_t);</div><div class='del'>-        if (this == NULL) {</div><div class='del'>-                gf_log (RDMA_LOG_NAME, GF_LOG_ERROR, "out of memory");</div><div class='del'>-                return -1;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        this-&gt;listener = trans;</div><div class='del'>-</div><div class='del'>-        priv = GF_CALLOC (1, sizeof (rdma_private_t),</div><div class='del'>-                          gf_common_mt_rdma_private_t);</div><div class='del'>-        if (priv == NULL) {</div><div class='del'>-                gf_log (RDMA_LOG_NAME, GF_LOG_ERROR, "out of memory");</div><div class='del'>-                GF_FREE (priv);</div><div class='del'>-                return -1;</div><div class='del'>-        }</div><div class='del'>-        this-&gt;private = priv;</div><div class='del'>-        /* Copy all the rdma related values in priv, from trans_priv </div><div class='del'>-           as other than QP, all the values remain same */</div><div class='del'>-        priv-&gt;device = trans_priv-&gt;device;</div><div class='del'>-        priv-&gt;options = trans_priv-&gt;options;</div><div class='del'>-        priv-&gt;request_ctx_pool = mem_pool_new (rdma_request_context_t,</div><div class='del'>-                                               RDMA_POOL_SIZE);</div><div class='del'>-        priv-&gt;is_server = 1;</div><div class='del'>-        priv-&gt;listener = trans;</div><div class='del'>-        if (priv-&gt;request_ctx_pool == NULL) {</div><div class='del'>-                gf_log (RDMA_LOG_NAME, GF_LOG_ERROR, "out of memory");</div><div class='del'>-                GF_FREE (priv);</div><div class='del'>-                return -1;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        priv-&gt;ioq_pool = mem_pool_new (rdma_ioq_t, RDMA_POOL_SIZE);</div><div class='del'>-        if (priv-&gt;ioq_pool == NULL) {</div><div class='del'>-                gf_log (RDMA_LOG_NAME, GF_LOG_ERROR, "out of memory");</div><div class='del'>-                mem_pool_destroy (priv-&gt;request_ctx_pool);</div><div class='del'>-                GF_FREE (priv);</div><div class='del'>-                return -1;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        priv-&gt;reply_info_pool = mem_pool_new (rdma_reply_info_t,</div><div class='del'>-                                              RDMA_POOL_SIZE);</div><div class='del'>-        if (priv-&gt;reply_info_pool == NULL) {</div><div class='del'>-                gf_log (RDMA_LOG_NAME, GF_LOG_ERROR, "out of memory");</div><div class='del'>-                mem_pool_destroy (priv-&gt;request_ctx_pool);</div><div class='del'>-                mem_pool_destroy (priv-&gt;ioq_pool);</div><div class='del'>-                GF_FREE (priv);</div><div class='del'>-                return -1;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        options = &amp;priv-&gt;options;</div><div class='del'>-</div><div class='del'>-        this-&gt;ops = trans-&gt;ops;</div><div class='del'>-        this-&gt;init = trans-&gt;init;</div><div class='del'>-        this-&gt;fini = trans-&gt;fini;</div><div class='del'>-        this-&gt;ctx = trans-&gt;ctx;</div><div class='del'>-        this-&gt;name = gf_strdup (trans-&gt;name);</div><div class='del'>-        this-&gt;notify = trans-&gt;notify;</div><div class='del'>-        this-&gt;mydata = trans-&gt;mydata;</div><div class='del'>-</div><div class='del'>-        memcpy (&amp;this-&gt;myinfo.sockaddr, &amp;trans-&gt;myinfo.sockaddr, </div><div class='del'>-                trans-&gt;myinfo.sockaddr_len);</div><div class='del'>-        this-&gt;myinfo.sockaddr_len = trans-&gt;myinfo.sockaddr_len;</div><div class='del'>-</div><div class='del'>-        main_sock = (trans_priv)-&gt;sock;</div><div class='del'>-        this-&gt;peerinfo.sockaddr_len = sizeof (this-&gt;peerinfo.sockaddr);</div><div class='del'>-        priv-&gt;sock = accept (main_sock, </div><div class='del'>-                             (struct sockaddr *)&amp;this-&gt;peerinfo.sockaddr, </div><div class='del'>-                             &amp;this-&gt;peerinfo.sockaddr_len);</div><div class='del'>-        if (priv-&gt;sock == -1) {</div><div class='del'>-                gf_log ("rdma/server", GF_LOG_ERROR,</div><div class='del'>-                        "accept() failed: %s",</div><div class='del'>-                        strerror (errno));</div><div class='del'>-                mem_pool_destroy (priv-&gt;request_ctx_pool);</div><div class='del'>-                mem_pool_destroy (priv-&gt;ioq_pool);</div><div class='del'>-                GF_FREE (this-&gt;private);</div><div class='del'>-                GF_FREE (this);</div><div class='del'>-                return -1;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        priv-&gt;peer.trans = this;</div><div class='del'>-        rpc_transport_ref (this);</div><div class='del'>-</div><div class='del'>-        gf_rdma_get_transport_identifiers (this);</div><div class='del'>-</div><div class='del'>-        priv-&gt;tcp_connected = 1;</div><div class='del'>-        priv-&gt;handshake.incoming.state = RDMA_HANDSHAKE_START;</div><div class='del'>-        priv-&gt;handshake.outgoing.state = RDMA_HANDSHAKE_START;</div><div class='del'>-</div><div class='del'>-        priv-&gt;peer.send_count = options-&gt;send_count;</div><div class='del'>-        priv-&gt;peer.recv_count = options-&gt;recv_count;</div><div class='del'>-        priv-&gt;peer.send_size = options-&gt;send_size;</div><div class='del'>-        priv-&gt;peer.recv_size = options-&gt;recv_size;</div><div class='del'>-        INIT_LIST_HEAD (&amp;priv-&gt;peer.ioq);</div><div class='del'>-</div><div class='del'>-        if (rdma_create_qp (this) &lt; 0) {</div><div class='del'>-                gf_log (RDMA_LOG_NAME, GF_LOG_ERROR,</div><div class='del'>-                        "%s: could not create QP",</div><div class='del'>-                        this-&gt;name);</div><div class='del'>-                rpc_transport_disconnect (this);</div><div class='del'>-                return -1;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        priv-&gt;idx = event_register (this-&gt;ctx-&gt;event_pool, priv-&gt;sock,</div><div class='del'>-                                    rdma_event_handler, this, 1, 1);</div><div class='del'>-</div><div class='del'>-        pthread_mutex_init (&amp;priv-&gt;read_mutex, NULL);</div><div class='del'>-        pthread_mutex_init (&amp;priv-&gt;write_mutex, NULL);</div><div class='del'>-        pthread_mutex_init (&amp;priv-&gt;recv_mutex, NULL);</div><div class='del'>-        /*  pthread_cond_init (&amp;priv-&gt;recv_cond, NULL); */</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-static int32_t</div><div class='del'>-rdma_listen (rpc_transport_t *this)</div><div class='del'>-{</div><div class='del'>-        struct sockaddr_storage sockaddr;</div><div class='del'>-        socklen_t sockaddr_len;</div><div class='del'>-        rdma_private_t *priv = this-&gt;private;</div><div class='del'>-        int opt = 1, ret = 0;</div><div class='del'>-        char service[NI_MAXSERV], host[NI_MAXHOST];</div><div class='del'>-</div><div class='del'>-        memset (&amp;sockaddr, 0, sizeof (sockaddr));</div><div class='del'>-        ret = gf_rdma_server_get_local_sockaddr (this,</div><div class='del'>-                                                 (struct sockaddr *)&amp;sockaddr,</div><div class='del'>-                                                 &amp;sockaddr_len);</div><div class='del'>-        if (ret != 0) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-                        "cannot find network address of server to bind to");</div><div class='del'>-                goto err;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        priv-&gt;sock = socket (((struct sockaddr *)&amp;sockaddr)-&gt;sa_family, </div><div class='del'>-                             SOCK_STREAM, 0);</div><div class='del'>-        if (priv-&gt;sock == -1) {</div><div class='del'>-                gf_log ("rdma/server", GF_LOG_CRITICAL,</div><div class='del'>-                        "init: failed to create socket, error: %s",</div><div class='del'>-                        strerror (errno));</div><div class='del'>-                GF_FREE (this-&gt;private);</div><div class='del'>-                ret = -1;</div><div class='del'>-                goto err;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        memcpy (&amp;this-&gt;myinfo.sockaddr, &amp;sockaddr, sockaddr_len);</div><div class='del'>-        this-&gt;myinfo.sockaddr_len = sockaddr_len;</div><div class='del'>-</div><div class='del'>-        ret = getnameinfo ((struct sockaddr *)&amp;this-&gt;myinfo.sockaddr, </div><div class='del'>-                           this-&gt;myinfo.sockaddr_len,</div><div class='del'>-                           host, sizeof (host),</div><div class='del'>-                           service, sizeof (service),</div><div class='del'>-                           NI_NUMERICHOST);</div><div class='del'>-        if (ret != 0) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-                        "getnameinfo failed (%s)", gai_strerror (ret));</div><div class='del'>-                goto err;</div><div class='del'>-        }</div><div class='del'>-        sprintf (this-&gt;myinfo.identifier, "%s:%s", host, service);</div><div class='del'>- </div><div class='del'>-        setsockopt (priv-&gt;sock, SOL_SOCKET, SO_REUSEADDR, &amp;opt, sizeof (opt));</div><div class='del'>-        if (bind (priv-&gt;sock,</div><div class='del'>-                  (struct sockaddr *)&amp;sockaddr,</div><div class='del'>-                  sockaddr_len) != 0) {</div><div class='del'>-                ret = -1;</div><div class='del'>-                gf_log ("rdma/server", GF_LOG_ERROR,</div><div class='del'>-                        "init: failed to bind to socket for %s (%s)",</div><div class='del'>-                        this-&gt;myinfo.identifier, strerror (errno));</div><div class='del'>-                goto err;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (listen (priv-&gt;sock, 10) != 0) {</div><div class='del'>-                gf_log ("rdma/server", GF_LOG_ERROR,</div><div class='del'>-                        "init: listen () failed on socket for %s (%s)",</div><div class='del'>-                        this-&gt;myinfo.identifier, strerror (errno));</div><div class='del'>-                ret = -1;</div><div class='del'>-                goto err;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        /* Register the main socket */</div><div class='del'>-        priv-&gt;idx = event_register (this-&gt;ctx-&gt;event_pool, priv-&gt;sock,</div><div class='del'>-                                    rdma_server_event_handler, </div><div class='del'>-                                    rpc_transport_ref (this), 1, 0);</div><div class='del'>-</div><div class='del'>-err:</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-struct rpc_transport_ops tops = {</div><div class='del'>-        .submit_request = rdma_submit_request,</div><div class='del'>-        .submit_reply   = rdma_submit_reply,</div><div class='del'>-        .connect        = rdma_connect,</div><div class='del'>-        .disconnect     = rdma_disconnect,</div><div class='del'>-        .listen         = rdma_listen,</div><div class='del'>-};</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-init (rpc_transport_t *this)</div><div class='del'>-{</div><div class='del'>-        rdma_private_t *priv = NULL;</div><div class='del'>-</div><div class='del'>-        priv = GF_CALLOC (1, sizeof (*priv), gf_common_mt_rdma_private_t);</div><div class='del'>-</div><div class='del'>-        this-&gt;private = priv;</div><div class='del'>-        priv-&gt;sock = -1;</div><div class='del'>-</div><div class='del'>-        if (rdma_init (this)) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-                        "Failed to initialize IB Device");</div><div class='del'>-                return -1;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-void  </div><div class='del'>-fini (struct rpc_transport *this)</div><div class='del'>-{</div><div class='del'>-        /* TODO: verify this function does graceful finish */</div><div class='del'>-        rdma_private_t *priv = this-&gt;private;</div><div class='del'>-        this-&gt;private = NULL;</div><div class='del'>-</div><div class='del'>-        pthread_mutex_destroy (&amp;priv-&gt;recv_mutex);</div><div class='del'>-        pthread_mutex_destroy (&amp;priv-&gt;write_mutex);</div><div class='del'>-        pthread_mutex_destroy (&amp;priv-&gt;read_mutex);</div><div class='del'>-</div><div class='del'>-        mem_pool_destroy (priv-&gt;request_ctx_pool);</div><div class='del'>-        mem_pool_destroy (priv-&gt;ioq_pool);</div><div class='del'>-        mem_pool_destroy (priv-&gt;reply_info_pool);</div><div class='del'>-</div><div class='del'>-        /*  pthread_cond_destroy (&amp;priv-&gt;recv_cond); */</div><div class='del'>-</div><div class='del'>-        gf_log (this-&gt;name, GF_LOG_TRACE,</div><div class='del'>-                "called fini on transport: %p",</div><div class='del'>-                this);</div><div class='del'>-        GF_FREE (priv);</div><div class='del'>-        return;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-/* TODO: expand each option */</div><div class='del'>-struct volume_options options[] = {</div><div class='del'>-        { .key   = {"transport.rdma.port",</div><div class='del'>-                    "rdma-port"}, </div><div class='del'>-          .type  = GF_OPTION_TYPE_INT,</div><div class='del'>-          .min   = 1,</div><div class='del'>-          .max   = 4,</div><div class='del'>-          .description = "check the option by 'ibv_devinfo'"</div><div class='del'>-        },</div><div class='del'>-        { .key   = {"transport.rdma.mtu",</div><div class='del'>-                    "rdma-mtu"}, </div><div class='del'>-          .type  = GF_OPTION_TYPE_INT,</div><div class='del'>-        },</div><div class='del'>-        { .key   = {"transport.rdma.device-name",</div><div class='del'>-                    "rdma-device-name"}, </div><div class='del'>-          .type  = GF_OPTION_TYPE_ANY,</div><div class='del'>-          .description = "check by 'ibv_devinfo'"</div><div class='del'>-        },</div><div class='del'>-        { .key   = {"transport.rdma.work-request-send-count",</div><div class='del'>-                    "rdma-work-request-send-count"}, </div><div class='del'>-          .type  = GF_OPTION_TYPE_INT,</div><div class='del'>-        },</div><div class='del'>-        { .key   = {"transport.rdma.work-request-recv-count",</div><div class='del'>-                    "rdma-work-request-recv-count"}, </div><div class='del'>-          .type  = GF_OPTION_TYPE_INT,</div><div class='del'>-        },</div><div class='del'>-        { .key   = {"remote-port", </div><div class='del'>-                    "transport.remote-port",</div><div class='del'>-                    "transport.rdma.remote-port"}, </div><div class='del'>-          .type  = GF_OPTION_TYPE_INT </div><div class='del'>-        },</div><div class='del'>-        { .key   = {"transport.rdma.listen-port", "listen-port"}, </div><div class='del'>-          .type  = GF_OPTION_TYPE_INT </div><div class='del'>-        },</div><div class='del'>-        { .key   = {"transport.rdma.connect-path", "connect-path"}, </div><div class='del'>-          .type  = GF_OPTION_TYPE_ANY </div><div class='del'>-        },</div><div class='del'>-        { .key   = {"transport.rdma.bind-path", "bind-path"}, </div><div class='del'>-          .type  = GF_OPTION_TYPE_ANY </div><div class='del'>-        },</div><div class='del'>-        { .key   = {"transport.rdma.listen-path", "listen-path"}, </div><div class='del'>-          .type  = GF_OPTION_TYPE_ANY </div><div class='del'>-        },</div><div class='del'>-        { .key   = {"transport.address-family",</div><div class='del'>-                    "address-family"}, </div><div class='del'>-          .value = {"inet", "inet6", "inet/inet6", "inet6/inet",</div><div class='del'>-                    "unix", "inet-sdp" },</div><div class='del'>-          .type  = GF_OPTION_TYPE_STR </div><div class='del'>-        },</div><div class='del'>-        { .key   = {"transport.socket.lowlat"},</div><div class='del'>-          .type  = GF_OPTION_TYPE_BOOL</div><div class='del'>-        },</div><div class='del'>-        { .key = {NULL} }</div><div class='del'>-};</div><div class='head'>diff --git a/rpc/rpc-transport/rdma/src/rdma.h b/rpc/rpc-transport/rdma/src/rdma.h<br/>deleted file mode 100644<br/>index 51242d6b4ad..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/rpc/rpc-transport/rdma/src/rdma.h?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>rpc/rpc-transport/rdma/src/rdma.h</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,395 +0,0 @@</div><div class='del'>-/*</div><div class='del'>-  Copyright (c) 2006-2009 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='del'>-  This file is part of GlusterFS.</div><div class='del'>-</div><div class='del'>-  GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-  it under the terms of the GNU General Public License as published</div><div class='del'>-  by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-  or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-  GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-  WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-  General Public License for more details.</div><div class='del'>-</div><div class='del'>-  You should have received a copy of the GNU General Public License</div><div class='del'>-  along with this program.  If not, see</div><div class='del'>-  &lt;http://www.gnu.org/licenses/&gt;.</div><div class='del'>-*/</div><div class='del'>-</div><div class='del'>-#ifndef _XPORT_RDMA_H</div><div class='del'>-#define _XPORT_RDMA_H</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-#ifndef _CONFIG_H</div><div class='del'>-#define _CONFIG_H</div><div class='del'>-#include "config.h"</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-#ifndef MAX_IOVEC</div><div class='del'>-#define MAX_IOVEC 16</div><div class='del'>-#endif /* MAX_IOVEC */</div><div class='del'>-</div><div class='del'>-#include "rpc-clnt.h"</div><div class='del'>-#include "rpc-transport.h"</div><div class='del'>-#include "xlator.h"</div><div class='del'>-#include "event.h"</div><div class='del'>-#include &lt;stdio.h&gt;</div><div class='del'>-#include &lt;list.h&gt;</div><div class='del'>-#include &lt;arpa/inet.h&gt;</div><div class='del'>-#include &lt;infiniband/verbs.h&gt;</div><div class='del'>-</div><div class='del'>-/* FIXME: give appropriate values to these macros */</div><div class='del'>-#define GF_DEFAULT_RDMA_LISTEN_PORT 6968</div><div class='del'>-#define RDMA_MAX_SEGMENTS           8   </div><div class='del'>-#define RDMA_MAX_HEADER_SIZE        (sizeof (rdma_header_t)                 \</div><div class='del'>-                                     + RDMA_MAX_SEGMENTS                    \</div><div class='del'>-                                     * sizeof (rdma_read_chunk_t))</div><div class='del'>-#define RDMA_INLINE_THRESHOLD       (1024 * 128)</div><div class='del'>-#define RDMA_VERSION                1</div><div class='del'>-#define RDMA_POOL_SIZE              512</div><div class='del'>-</div><div class='del'>-typedef enum rdma_errcode {</div><div class='del'>-        ERR_VERS = 1,</div><div class='del'>-        ERR_CHUNK = 2</div><div class='del'>-}rdma_errcode_t;</div><div class='del'>-</div><div class='del'>-struct rdma_err_vers {</div><div class='del'>-        uint32_t rdma_vers_low; /* Version range supported by peer */</div><div class='del'>-        uint32_t rdma_vers_high;</div><div class='del'>-}__attribute__ ((packed));</div><div class='del'>-typedef struct rdma_err_vers rdma_err_vers_t;</div><div class='del'>-</div><div class='del'>-typedef enum rdma_proc {</div><div class='del'>-        RDMA_MSG   = 0,           /* An RPC call or reply msg */</div><div class='del'>-        RDMA_NOMSG = 1,           /* An RPC call or reply msg - separate body */</div><div class='del'>-        RDMA_MSGP  = 2,           /* An RPC call or reply msg with padding */</div><div class='del'>-        RDMA_DONE  = 3,           /* Client signals reply completion */</div><div class='del'>-        RDMA_ERROR = 4            /* An RPC RDMA encoding error */</div><div class='del'>-}rdma_proc_t;</div><div class='del'>-</div><div class='del'>-typedef enum rdma_chunktype {</div><div class='del'>-        rdma_noch = 0,         /* no chunk */</div><div class='del'>-        rdma_readch,           /* some argument through rdma read */</div><div class='del'>-        rdma_areadch,          /* entire request through rdma read */</div><div class='del'>-        rdma_writech,          /* some result through rdma write */</div><div class='del'>-        rdma_replych           /* entire reply through rdma write */</div><div class='del'>-}rdma_chunktype_t;</div><div class='del'>-</div><div class='del'>-struct __rdma_header {</div><div class='del'>-        uint32_t rm_xid;    /* Mirrors the RPC header xid */</div><div class='del'>-        uint32_t rm_vers;   /* Version of this protocol */</div><div class='del'>-        uint32_t rm_credit; /* Buffers requested/granted */</div><div class='del'>-        uint32_t rm_type;   /* Type of message (enum rdma_proc) */</div><div class='del'>-        union {</div><div class='del'>-                struct {                          /* no chunks */</div><div class='del'>-                        uint32_t rm_empty[3];     /* 3 empty chunk lists */</div><div class='del'>-                }__attribute__((packed)) rm_nochunks;</div><div class='del'>-</div><div class='del'>-                struct {                          /* no chunks and padded */</div><div class='del'>-                        uint32_t rm_align;        /* Padding alignment */</div><div class='del'>-                        uint32_t rm_thresh;       /* Padding threshold */</div><div class='del'>-                        uint32_t rm_pempty[3];    /* 3 empty chunk lists */</div><div class='del'>-                }__attribute__((packed)) rm_padded;</div><div class='del'>-</div><div class='del'>-                struct {</div><div class='del'>-                        uint32_t rm_type;</div><div class='del'>-                        rdma_err_vers_t rm_version;</div><div class='del'>-                }__attribute__ ((packed)) rm_error;</div><div class='del'>-</div><div class='del'>-                uint32_t rm_chunks[0];    /* read, write and reply chunks */</div><div class='del'>-        }__attribute__ ((packed)) rm_body;</div><div class='del'>-} __attribute__((packed));</div><div class='del'>-typedef struct __rdma_header rdma_header_t;</div><div class='del'>-</div><div class='del'>-struct __rdma_segment {</div><div class='del'>-        uint32_t rs_handle;       /* Registered memory handle */</div><div class='del'>-        uint32_t rs_length;       /* Length of the chunk in bytes */</div><div class='del'>-        uint64_t rs_offset;       /* Chunk virtual address or offset */</div><div class='del'>-} __attribute__((packed));</div><div class='del'>-typedef struct __rdma_segment rdma_segment_t;</div><div class='del'>-</div><div class='del'>-/* read chunk(s), encoded as a linked list. */</div><div class='del'>-struct __rdma_read_chunk {</div><div class='del'>-        uint32_t       rc_discrim;      /* 1 indicates presence */</div><div class='del'>-        uint32_t       rc_position;     /* Position in XDR stream */</div><div class='del'>-        rdma_segment_t rc_target;</div><div class='del'>-} __attribute__((packed));</div><div class='del'>-typedef struct __rdma_read_chunk rdma_read_chunk_t;</div><div class='del'>-</div><div class='del'>-/* write chunk, and reply chunk. */</div><div class='del'>-struct __rdma_write_chunk {</div><div class='del'>-        rdma_segment_t wc_target;</div><div class='del'>-} __attribute__((packed));</div><div class='del'>-typedef struct __rdma_write_chunk rdma_write_chunk_t;</div><div class='del'>-</div><div class='del'>-/* write chunk(s), encoded as a counted array. */</div><div class='del'>-struct __rdma_write_array {</div><div class='del'>-        uint32_t wc_discrim;      /* 1 indicates presence */</div><div class='del'>-        uint32_t wc_nchunks;      /* Array count */</div><div class='del'>-        struct __rdma_write_chunk wc_array[0];</div><div class='del'>-} __attribute__((packed));</div><div class='del'>-typedef struct __rdma_write_array rdma_write_array_t;</div><div class='del'>-</div><div class='del'>-/* options per transport end point */</div><div class='del'>-struct __rdma_options {</div><div class='del'>-        int32_t port;</div><div class='del'>-        char *device_name;</div><div class='del'>-        enum ibv_mtu mtu;</div><div class='del'>-        int32_t  send_count;</div><div class='del'>-        int32_t  recv_count;</div><div class='del'>-        uint64_t recv_size;</div><div class='del'>-        uint64_t send_size;</div><div class='del'>-};</div><div class='del'>-typedef struct __rdma_options rdma_options_t;</div><div class='del'>-</div><div class='del'>-struct __rdma_reply_info {</div><div class='del'>-        uint32_t            rm_xid;      /* xid in network endian */</div><div class='del'>-        rdma_chunktype_t    type;        /*</div><div class='del'>-                                          * can be either rdma_replych</div><div class='del'>-                                          * or rdma_writech.</div><div class='del'>-                                          */</div><div class='del'>-        rdma_write_array_t *wc_array;</div><div class='del'>-        struct mem_pool    *pool;</div><div class='del'>-};</div><div class='del'>-typedef struct __rdma_reply_info rdma_reply_info_t;</div><div class='del'>-</div><div class='del'>-struct __rdma_ioq {</div><div class='del'>-        union {</div><div class='del'>-                struct list_head list;</div><div class='del'>-                struct {</div><div class='del'>-                        struct __rdma_ioq    *next;</div><div class='del'>-                        struct __rdma_ioq    *prev;</div><div class='del'>-                };</div><div class='del'>-        };</div><div class='del'>-</div><div class='del'>-        char               is_request;</div><div class='del'>-        struct iovec       rpchdr[MAX_IOVEC];</div><div class='del'>-        int                rpchdr_count;</div><div class='del'>-        struct iovec       proghdr[MAX_IOVEC];</div><div class='del'>-        int                proghdr_count;</div><div class='del'>-        struct iovec       prog_payload[MAX_IOVEC];</div><div class='del'>-        int                prog_payload_count;</div><div class='del'>-</div><div class='del'>-        struct iobref     *iobref;</div><div class='del'>-</div><div class='del'>-        union {</div><div class='del'>-                struct __rdma_ioq_request {</div><div class='del'>-                        /* used to build reply_chunk for RDMA_NOMSG type msgs */</div><div class='del'>-                        struct iovec rsphdr_vec[MAX_IOVEC];</div><div class='del'>-                        int          rsphdr_count;</div><div class='del'>-</div><div class='del'>-                        /*</div><div class='del'>-                         * used to build write_array during operations like</div><div class='del'>-                         * read.</div><div class='del'>-                         */</div><div class='del'>-                        struct iovec rsp_payload[MAX_IOVEC];</div><div class='del'>-                        int          rsp_payload_count;</div><div class='del'>-</div><div class='del'>-                        struct rpc_req *rpc_req; /* FIXME: hack! hack! should be</div><div class='del'>-                                                  * cleaned up later</div><div class='del'>-                                                  */</div><div class='del'>-                        struct iobref  *rsp_iobref;</div><div class='del'>-                }request;</div><div class='del'>-</div><div class='del'>-                rdma_reply_info_t  *reply_info; </div><div class='del'>-        }msg;</div><div class='del'>-</div><div class='del'>-        struct mem_pool *pool;</div><div class='del'>-};</div><div class='del'>-typedef struct __rdma_ioq rdma_ioq_t;</div><div class='del'>-</div><div class='del'>-typedef enum __rdma_send_post_type {</div><div class='del'>-        RDMA_SEND_POST_NO_CHUNKLIST,    /* post which is sent using rdma-send</div><div class='del'>-                                         * and the msg carries no</div><div class='del'>-                                         * chunklists.</div><div class='del'>-                                         */</div><div class='del'>-        RDMA_SEND_POST_READ_CHUNKLIST,  /* post which is sent using rdma-send</div><div class='del'>-                                         * and the msg carries only read</div><div class='del'>-                                         * chunklist.</div><div class='del'>-                                         */</div><div class='del'>-        RDMA_SEND_POST_WRITE_CHUNKLIST, /* post which is sent using</div><div class='del'>-                                         * rdma-send and the msg carries</div><div class='del'>-                                         * only write chunklist.</div><div class='del'>-                                         */</div><div class='del'>-        RDMA_SEND_POST_READ_WRITE_CHUNKLIST, /* post which is sent using</div><div class='del'>-                                              * rdma-send and the msg</div><div class='del'>-                                              * carries both read and</div><div class='del'>-                                              * write chunklists.</div><div class='del'>-                                              */</div><div class='del'>-        RDMA_SEND_POST_RDMA_READ,              /* RDMA read */</div><div class='del'>-        RDMA_SEND_POST_RDMA_WRITE,             /* RDMA write */</div><div class='del'>-}rdma_send_post_type_t;</div><div class='del'>-        </div><div class='del'>-/* represents one communication peer, two per transport_t */</div><div class='del'>-struct __rdma_peer {</div><div class='del'>-        rpc_transport_t *trans;</div><div class='del'>-        struct ibv_qp *qp;</div><div class='del'>-</div><div class='del'>-        int32_t recv_count;</div><div class='del'>-        int32_t send_count;</div><div class='del'>-        int32_t recv_size;</div><div class='del'>-        int32_t send_size;</div><div class='del'>-</div><div class='del'>-        int32_t quota;</div><div class='del'>-        union {</div><div class='del'>-                struct list_head     ioq;</div><div class='del'>-                struct {</div><div class='del'>-                        rdma_ioq_t        *ioq_next;</div><div class='del'>-                        rdma_ioq_t        *ioq_prev;</div><div class='del'>-                };</div><div class='del'>-        };</div><div class='del'>-</div><div class='del'>-        /* QP attributes, needed to connect with remote QP */</div><div class='del'>-        int32_t local_lid;</div><div class='del'>-        int32_t local_psn;</div><div class='del'>-        int32_t local_qpn;</div><div class='del'>-        int32_t remote_lid;</div><div class='del'>-        int32_t remote_psn;</div><div class='del'>-        int32_t remote_qpn;</div><div class='del'>-};</div><div class='del'>-typedef struct __rdma_peer rdma_peer_t;</div><div class='del'>-</div><div class='del'>-struct __rdma_post_context {</div><div class='del'>-        struct ibv_mr     *mr[RDMA_MAX_SEGMENTS];</div><div class='del'>-        int                mr_count;</div><div class='del'>-        struct iovec       vector[MAX_IOVEC];</div><div class='del'>-        int                count;</div><div class='del'>-        struct iobref     *iobref;</div><div class='del'>-        char               is_request;</div><div class='del'>-        rdma_reply_info_t *reply_info;</div><div class='del'>-};</div><div class='del'>-typedef struct __rdma_post_context rdma_post_context_t;</div><div class='del'>-</div><div class='del'>-typedef enum {</div><div class='del'>-        RDMA_SEND_POST,</div><div class='del'>-        RDMA_RECV_POST</div><div class='del'>-} rdma_post_type_t;</div><div class='del'>-</div><div class='del'>-struct __rdma_post {</div><div class='del'>-        struct __rdma_post *next, *prev;</div><div class='del'>-        struct ibv_mr *mr;</div><div class='del'>-        char *buf;</div><div class='del'>-        int32_t buf_size;</div><div class='del'>-        char aux;</div><div class='del'>-        int32_t reused;</div><div class='del'>-        struct __rdma_device  *device;</div><div class='del'>-        rdma_post_type_t      type;</div><div class='del'>-        rdma_post_context_t   ctx;</div><div class='del'>-        int                   refcount;</div><div class='del'>-        pthread_mutex_t       lock;</div><div class='del'>-};</div><div class='del'>-typedef struct __rdma_post rdma_post_t;</div><div class='del'>-</div><div class='del'>-struct __rdma_queue {</div><div class='del'>-        rdma_post_t active_posts, passive_posts;</div><div class='del'>-        int32_t active_count, passive_count;</div><div class='del'>-        pthread_mutex_t lock;</div><div class='del'>-};</div><div class='del'>-typedef struct __rdma_queue rdma_queue_t;</div><div class='del'>-</div><div class='del'>-struct __rdma_qpreg {</div><div class='del'>-        pthread_mutex_t lock;</div><div class='del'>-        int32_t count;</div><div class='del'>-        struct _qpent {</div><div class='del'>-                struct _qpent *next, *prev;</div><div class='del'>-                int32_t qp_num;</div><div class='del'>-                rdma_peer_t *peer;</div><div class='del'>-        } ents[42];</div><div class='del'>-};</div><div class='del'>-typedef struct __rdma_qpreg rdma_qpreg_t;</div><div class='del'>-</div><div class='del'>-/* context per device, stored in global glusterfs_ctx_t-&gt;ib */</div><div class='del'>-struct __rdma_device {</div><div class='del'>-        struct __rdma_device *next;</div><div class='del'>-        const char *device_name;</div><div class='del'>-        struct ibv_context *context;</div><div class='del'>-        int32_t port;</div><div class='del'>-        struct ibv_pd *pd;</div><div class='del'>-        struct ibv_srq *srq;</div><div class='del'>-        rdma_qpreg_t qpreg;</div><div class='del'>-        struct ibv_comp_channel *send_chan, *recv_chan;</div><div class='del'>-        struct ibv_cq *send_cq, *recv_cq;</div><div class='del'>-        rdma_queue_t sendq, recvq;</div><div class='del'>-        pthread_t send_thread, recv_thread;</div><div class='del'>-};</div><div class='del'>-typedef struct __rdma_device rdma_device_t;</div><div class='del'>-</div><div class='del'>-typedef enum {</div><div class='del'>-        RDMA_HANDSHAKE_START = 0,</div><div class='del'>-        RDMA_HANDSHAKE_SENDING_DATA,</div><div class='del'>-        RDMA_HANDSHAKE_RECEIVING_DATA,</div><div class='del'>-        RDMA_HANDSHAKE_SENT_DATA,</div><div class='del'>-        RDMA_HANDSHAKE_RECEIVED_DATA,</div><div class='del'>-        RDMA_HANDSHAKE_SENDING_ACK,</div><div class='del'>-        RDMA_HANDSHAKE_RECEIVING_ACK,</div><div class='del'>-        RDMA_HANDSHAKE_RECEIVED_ACK,</div><div class='del'>-        RDMA_HANDSHAKE_COMPLETE,</div><div class='del'>-} rdma_handshake_state_t;</div><div class='del'>-</div><div class='del'>-struct rdma_nbio {</div><div class='del'>-        int state;</div><div class='del'>-        char *buf;</div><div class='del'>-        int count;</div><div class='del'>-        struct iovec vector;</div><div class='del'>-        struct iovec *pending_vector;</div><div class='del'>-        int pending_count;</div><div class='del'>-};</div><div class='del'>-</div><div class='del'>-struct __rdma_request_context {</div><div class='del'>-        struct ibv_mr   *mr[RDMA_MAX_SEGMENTS];</div><div class='del'>-        int              mr_count;</div><div class='del'>-        struct mem_pool *pool;</div><div class='del'>-        rdma_peer_t     *peer;</div><div class='del'>-        struct iobref   *iobref;</div><div class='del'>-        struct iobref   *rsp_iobref;</div><div class='del'>-};</div><div class='del'>-typedef struct __rdma_request_context rdma_request_context_t;</div><div class='del'>-</div><div class='del'>-struct __rdma_private {</div><div class='del'>-        int32_t sock;</div><div class='del'>-        int32_t idx;</div><div class='del'>-        unsigned char connected;</div><div class='del'>-        unsigned char tcp_connected;</div><div class='del'>-        unsigned char ib_connected;</div><div class='del'>-        in_addr_t addr;</div><div class='del'>-        unsigned short port;</div><div class='del'>-</div><div class='del'>-        /* IB Verbs Driver specific variables, pointers */</div><div class='del'>-        rdma_peer_t peer;</div><div class='del'>-        struct __rdma_device *device;</div><div class='del'>-        rdma_options_t options;</div><div class='del'>-</div><div class='del'>-        /* Used by trans-&gt;op-&gt;receive */</div><div class='del'>-        char *data_ptr;</div><div class='del'>-        int32_t data_offset;</div><div class='del'>-        int32_t data_len;</div><div class='del'>-</div><div class='del'>-        /* Mutex */</div><div class='del'>-        pthread_mutex_t read_mutex;</div><div class='del'>-        pthread_mutex_t write_mutex;</div><div class='del'>-        pthread_barrier_t handshake_barrier;</div><div class='del'>-        char handshake_ret;</div><div class='del'>-        char is_server;</div><div class='del'>-        rpc_transport_t *listener;</div><div class='del'>-</div><div class='del'>-        pthread_mutex_t recv_mutex;</div><div class='del'>-        pthread_cond_t  recv_cond;</div><div class='del'>-</div><div class='del'>-        struct mem_pool *request_ctx_pool;</div><div class='del'>-        struct mem_pool *ioq_pool;</div><div class='del'>-        struct mem_pool *reply_info_pool;</div><div class='del'>-</div><div class='del'>-        /* used during rdma_handshake */</div><div class='del'>-        struct {</div><div class='del'>-                struct rdma_nbio incoming;</div><div class='del'>-                struct rdma_nbio outgoing;</div><div class='del'>-                int               state;</div><div class='del'>-                rdma_header_t header;</div><div class='del'>-                char *buf;</div><div class='del'>-                size_t size;</div><div class='del'>-        } handshake;</div><div class='del'>-};</div><div class='del'>-typedef struct __rdma_private rdma_private_t;</div><div class='del'>-</div><div class='del'>-#endif /* _XPORT_RDMA_H */</div><div class='head'>diff --git a/rpc/rpc-transport/socket/src/Makefile.am b/rpc/rpc-transport/socket/src/Makefile.am<br/>index 2c918c7e313..7b488583771 100644<br/>--- a/<a href='/cgit/glusterfs.git/tree/rpc/rpc-transport/socket/src/Makefile.am?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>rpc/rpc-transport/socket/src/Makefile.am</a><br/>+++ b/<a href='/cgit/glusterfs.git/tree/rpc/rpc-transport/socket/src/Makefile.am?id=d1d7a6f35c816822fab51c820e25023863c239c1'>rpc/rpc-transport/socket/src/Makefile.am</a></div><div class='hunk'>@@ -1,15 +1,22 @@</div><div class='del'>-noinst_HEADERS = socket.h name.h</div><div class='add'>+noinst_HEADERS = socket.h name.h socket-mem-types.h</div><div class='ctx'> </div><div class='ctx'> rpctransport_LTLIBRARIES = socket.la</div><div class='ctx'> rpctransportdir = $(libdir)/glusterfs/$(PACKAGE_VERSION)/rpc-transport</div><div class='ctx'> </div><div class='del'>-socket_la_LDFLAGS = -module -avoidversion</div><div class='add'>+socket_la_LDFLAGS = -module -avoid-version</div><div class='ctx'> </div><div class='ctx'> socket_la_SOURCES = socket.c name.c</div><div class='del'>-socket_la_LIBADD = $(top_builddir)/libglusterfs/src/libglusterfs.la</div><div class='add'>+socket_la_LIBADD = $(top_builddir)/libglusterfs/src/libglusterfs.la \</div><div class='add'>+                   $(top_builddir)/rpc/xdr/src/libgfxdr.la \</div><div class='add'>+                   $(top_builddir)/rpc/rpc-lib/src/libgfrpc.la \</div><div class='add'>+                   -lssl</div><div class='ctx'> </div><div class='del'>-AM_CFLAGS = -fPIC -D_FILE_OFFSET_BITS=64 -D_GNU_SOURCE -Wall -D$(GF_HOST_OS)\</div><div class='del'>-	-I$(top_srcdir)/libglusterfs/src -I$(top_srcdir)/rpc/rpc-lib/src/ \</div><div class='del'>-	-I$(top_srcdir)/rpc/xdr/src/ -shared -nostartfiles $(GF_CFLAGS)</div><div class='add'>+AM_CPPFLAGS = $(GF_CPPFLAGS) \</div><div class='add'>+	-I$(top_srcdir)/libglusterfs/src \</div><div class='add'>+	-I$(top_srcdir)/rpc/rpc-lib/src/ \</div><div class='add'>+	-I$(top_srcdir)/rpc/xdr/src/ \</div><div class='add'>+	-I$(top_builddir)/rpc/xdr/src/</div><div class='add'>+</div><div class='add'>+AM_CFLAGS = -Wall $(GF_CFLAGS)</div><div class='ctx'> </div><div class='ctx'> CLEANFILES = *~</div><div class='head'>diff --git a/rpc/rpc-transport/socket/src/name.c b/rpc/rpc-transport/socket/src/name.c<br/>index 8be29163e23..9286bbb236d 100644<br/>--- a/<a href='/cgit/glusterfs.git/tree/rpc/rpc-transport/socket/src/name.c?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>rpc/rpc-transport/socket/src/name.c</a><br/>+++ b/<a href='/cgit/glusterfs.git/tree/rpc/rpc-transport/socket/src/name.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>rpc/rpc-transport/socket/src/name.c</a></div><div class='hunk'>@@ -1,20 +1,11 @@</div><div class='ctx'> /*</div><div class='del'>-  Copyright (c) 2010 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='add'>+  Copyright (c) 2008-2012 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='ctx'>   This file is part of GlusterFS.</div><div class='ctx'> </div><div class='del'>-  GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-  it under the terms of the GNU Affero General Public License as published</div><div class='del'>-  by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-  or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-  GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-  WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-  Affero General Public License for more details.</div><div class='del'>-</div><div class='del'>-  You should have received a copy of the GNU Affero General Public License</div><div class='del'>-  along with this program.  If not, see</div><div class='del'>-  &lt;http://www.gnu.org/licenses/&gt;.</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='ctx'> */</div><div class='ctx'> </div><div class='ctx'> #include &lt;sys/types.h&gt;</div><div class='hunk'>@@ -24,716 +15,754 @@</div><div class='ctx'> #include &lt;netdb.h&gt;</div><div class='ctx'> #include &lt;string.h&gt;</div><div class='ctx'> </div><div class='del'>-#ifdef CLIENT_PORT_CEILING</div><div class='del'>-#undef CLIENT_PORT_CEILING</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-#define CLIENT_PORT_CEILING 1024</div><div class='del'>-</div><div class='ctx'> #ifndef AF_INET_SDP</div><div class='ctx'> #define AF_INET_SDP 27</div><div class='ctx'> #endif</div><div class='ctx'> </div><div class='ctx'> #include "rpc-transport.h"</div><div class='ctx'> #include "socket.h"</div><div class='add'>+#include &lt;glusterfs/common-utils.h&gt;</div><div class='ctx'> </div><div class='del'>-int32_t</div><div class='del'>-gf_resolve_ip6 (const char *hostname,</div><div class='del'>-                uint16_t port,</div><div class='del'>-                int family,</div><div class='del'>-                void **dnscache,</div><div class='del'>-                struct addrinfo **addr_info);</div><div class='del'>-</div><div class='del'>-static int32_t</div><div class='del'>-af_inet_bind_to_port_lt_ceiling (int fd, struct sockaddr *sockaddr,</div><div class='del'>-                                 socklen_t sockaddr_len, int ceiling)</div><div class='add'>+static void</div><div class='add'>+_assign_port(struct sockaddr *sockaddr, uint16_t port)</div><div class='ctx'> {</div><div class='del'>-        int32_t ret = -1;</div><div class='del'>-        /*  struct sockaddr_in sin = {0, }; */</div><div class='del'>-        uint16_t port = ceiling - 1;</div><div class='del'>-</div><div class='del'>-        while (port)</div><div class='del'>-        {</div><div class='del'>-                switch (sockaddr-&gt;sa_family)</div><div class='del'>-                {</div><div class='del'>-                case AF_INET6:</div><div class='del'>-                        ((struct sockaddr_in6 *)sockaddr)-&gt;sin6_port = htons (port);</div><div class='del'>-                        break;</div><div class='del'>-</div><div class='del'>-                case AF_INET_SDP:</div><div class='del'>-                case AF_INET:</div><div class='del'>-                        ((struct sockaddr_in *)sockaddr)-&gt;sin_port = htons (port);</div><div class='del'>-                        break;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                ret = bind (fd, sockaddr, sockaddr_len);</div><div class='del'>-</div><div class='del'>-                if (ret == 0)</div><div class='del'>-                        break;</div><div class='del'>-</div><div class='del'>-                if (ret == -1 &amp;&amp; errno == EACCES)</div><div class='del'>-                        break;</div><div class='del'>-</div><div class='del'>-                port--;</div><div class='del'>-        }</div><div class='add'>+    switch (sockaddr-&gt;sa_family) {</div><div class='add'>+        case AF_INET6:</div><div class='add'>+            ((struct sockaddr_in6 *)sockaddr)-&gt;sin6_port = htons(port);</div><div class='add'>+            break;</div><div class='ctx'> </div><div class='del'>-        return ret;</div><div class='add'>+        case AF_INET_SDP:</div><div class='add'>+        case AF_INET:</div><div class='add'>+            ((struct sockaddr_in *)sockaddr)-&gt;sin_port = htons(port);</div><div class='add'>+            break;</div><div class='add'>+    }</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> static int32_t</div><div class='del'>-af_unix_client_bind (rpc_transport_t *this,</div><div class='del'>-                     struct sockaddr *sockaddr,</div><div class='del'>-                     socklen_t sockaddr_len,</div><div class='del'>-                     int sock)</div><div class='add'>+af_inet_bind_to_port_lt_ceiling(int fd, struct sockaddr *sockaddr,</div><div class='add'>+                                socklen_t sockaddr_len, uint32_t ceiling)</div><div class='ctx'> {</div><div class='del'>-        data_t *path_data = NULL;</div><div class='del'>-        struct sockaddr_un *addr = NULL;</div><div class='del'>-        int32_t ret = 0;</div><div class='del'>-</div><div class='del'>-        path_data = dict_get (this-&gt;options, "transport.socket.bind-path");</div><div class='del'>-        if (path_data) {</div><div class='del'>-                char *path = data_to_str (path_data);</div><div class='del'>-                if (!path || strlen (path) &gt; UNIX_PATH_MAX) {</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_TRACE,</div><div class='del'>-                                "bind-path not specfied for unix socket, "</div><div class='del'>-                                "letting connect to assign default value");</div><div class='del'>-                        goto err;</div><div class='del'>-                }</div><div class='add'>+#if GF_DISABLE_PRIVPORT_TRACKING</div><div class='add'>+    _assign_port(sockaddr, 0);</div><div class='add'>+    return bind(fd, sockaddr, sockaddr_len);</div><div class='add'>+#else</div><div class='add'>+    int32_t ret = -1;</div><div class='add'>+    uint16_t port = ceiling - 1;</div><div class='add'>+    unsigned char ports[GF_PORT_ARRAY_SIZE] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int i = 0;</div><div class='ctx'> </div><div class='del'>-                addr = (struct sockaddr_un *) sockaddr;</div><div class='del'>-                strcpy (addr-&gt;sun_path, path);</div><div class='del'>-                ret = bind (sock, (struct sockaddr *)addr, sockaddr_len);</div><div class='del'>-                if (ret == -1) {</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-                                "cannot bind to unix-domain socket %d (%s)",</div><div class='del'>-                                sock, strerror (errno));</div><div class='del'>-                        goto err;</div><div class='del'>-                }</div><div class='del'>-        } else {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_TRACE,</div><div class='del'>-                        "bind-path not specfied for unix socket, "</div><div class='del'>-                        "letting connect to assign default value");</div><div class='add'>+loop:</div><div class='add'>+    ret = gf_process_reserved_ports(ports, ceiling);</div><div class='add'>+</div><div class='add'>+    while (port) {</div><div class='add'>+        if (port == GF_CLIENT_PORT_CEILING) {</div><div class='add'>+            ret = -1;</div><div class='add'>+            break;</div><div class='ctx'>         }</div><div class='ctx'> </div><div class='del'>-err:</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='add'>+        /* ignore the reserved ports */</div><div class='add'>+        if (BIT_VALUE(ports, port)) {</div><div class='add'>+            port--;</div><div class='add'>+            continue;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-int32_t</div><div class='del'>-client_fill_address_family (rpc_transport_t *this, sa_family_t *sa_family)</div><div class='del'>-{</div><div class='del'>-        data_t  *address_family_data = NULL;</div><div class='del'>-        int32_t  ret                 = -1;</div><div class='add'>+        _assign_port(sockaddr, port);</div><div class='ctx'> </div><div class='del'>-        if (sa_family == NULL) {</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='add'>+        ret = bind(fd, sockaddr, sockaddr_len);</div><div class='ctx'> </div><div class='del'>-        address_family_data = dict_get (this-&gt;options,</div><div class='del'>-                                        "transport.address-family");</div><div class='del'>-        if (!address_family_data) {</div><div class='del'>-                data_t *remote_host_data = NULL, *connect_path_data = NULL;</div><div class='del'>-                remote_host_data = dict_get (this-&gt;options, "remote-host");</div><div class='del'>-                connect_path_data = dict_get (this-&gt;options,</div><div class='del'>-                                              "transport.socket.connect-path");</div><div class='del'>-</div><div class='del'>-                if (!(remote_host_data || connect_path_data) ||</div><div class='del'>-                    (remote_host_data &amp;&amp; connect_path_data)) {</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-                                "transport.address-family not specified and "</div><div class='del'>-                                "not able to determine the "</div><div class='del'>-                                "same from other options (remote-host:%s and "</div><div class='del'>-                                "transport.unix.connect-path:%s)",</div><div class='del'>-                                data_to_str (remote_host_data),</div><div class='del'>-                                data_to_str (connect_path_data));</div><div class='del'>-                        goto out;</div><div class='del'>-                }</div><div class='add'>+        if (ret == 0)</div><div class='add'>+            break;</div><div class='ctx'> </div><div class='del'>-                if (remote_host_data) {</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-                                "address-family not specified, guessing it "</div><div class='del'>-                                "to be inet/inet6");</div><div class='del'>-                        *sa_family = AF_UNSPEC;</div><div class='del'>-                } else {</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-                                "address-family not specified, guessing it "</div><div class='del'>-                                "to be unix");</div><div class='del'>-                        *sa_family = AF_UNIX;</div><div class='del'>-                }</div><div class='add'>+        if (ret == -1 &amp;&amp; errno == EACCES)</div><div class='add'>+            break;</div><div class='ctx'> </div><div class='del'>-        } else {</div><div class='del'>-                char *address_family = data_to_str (address_family_data);</div><div class='del'>-                if (!strcasecmp (address_family, "unix")) {</div><div class='del'>-                        *sa_family = AF_UNIX;</div><div class='del'>-                } else if (!strcasecmp (address_family, "inet")) {</div><div class='del'>-                        *sa_family = AF_INET;</div><div class='del'>-                } else if (!strcasecmp (address_family, "inet6")) {</div><div class='del'>-                        *sa_family = AF_INET6;</div><div class='del'>-                } else if (!strcasecmp (address_family, "inet-sdp")) {</div><div class='del'>-                        *sa_family = AF_INET_SDP;</div><div class='del'>-                } else if (!strcasecmp (address_family, "inet/inet6")</div><div class='del'>-                           || !strcasecmp (address_family, "inet6/inet")) {</div><div class='del'>-                        *sa_family = AF_UNSPEC;</div><div class='del'>-                } else {</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-                                "unknown address-family (%s) specified",</div><div class='del'>-                                address_family);</div><div class='del'>-                        goto out;</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='add'>+        port--;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        ret = 0;</div><div class='add'>+    /* In case if all the secure ports are exhausted, we are no more</div><div class='add'>+     * binding to secure ports, hence instead of getting a random</div><div class='add'>+     * port, lets define the range to restrict it from getting from</div><div class='add'>+     * ports reserved for bricks i.e from range of 49152 - 65535</div><div class='add'>+     * which further may lead to port clash */</div><div class='add'>+    if (!port) {</div><div class='add'>+        ceiling = port = GF_CLNT_INSECURE_PORT_CEILING;</div><div class='add'>+        for (i = 0; i &lt;= ceiling; i++)</div><div class='add'>+            BIT_CLEAR(ports, i);</div><div class='add'>+        goto loop;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-out:</div><div class='del'>-        return ret;</div><div class='add'>+    return ret;</div><div class='add'>+#endif /* GF_DISABLE_PRIVPORT_TRACKING */</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> static int32_t</div><div class='del'>-af_inet_client_get_remote_sockaddr (rpc_transport_t *this,</div><div class='del'>-                                    struct sockaddr *sockaddr,</div><div class='del'>-                                    socklen_t *sockaddr_len)</div><div class='add'>+af_unix_client_bind(rpc_transport_t *this, struct sockaddr *sockaddr,</div><div class='add'>+                    socklen_t sockaddr_len, int sock)</div><div class='ctx'> {</div><div class='del'>-        dict_t *options = this-&gt;options;</div><div class='del'>-        data_t *remote_host_data = NULL;</div><div class='del'>-        data_t *remote_port_data = NULL;</div><div class='del'>-        char *remote_host = NULL;</div><div class='del'>-        uint16_t remote_port = 0;</div><div class='del'>-        struct addrinfo *addr_info = NULL;</div><div class='del'>-        int32_t ret = 0;</div><div class='del'>-</div><div class='del'>-        remote_host_data = dict_get (options, "remote-host");</div><div class='del'>-        if (remote_host_data == NULL)</div><div class='del'>-        {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-                        "option remote-host missing in volume %s", this-&gt;name);</div><div class='del'>-                ret = -1;</div><div class='del'>-                goto err;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        remote_host = data_to_str (remote_host_data);</div><div class='del'>-        if (remote_host == NULL)</div><div class='del'>-        {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-                        "option remote-host has data NULL in volume %s", this-&gt;name);</div><div class='del'>-                ret = -1;</div><div class='del'>-                goto err;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        remote_port_data = dict_get (options, "remote-port");</div><div class='del'>-        if (remote_port_data == NULL)</div><div class='del'>-        {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_TRACE,</div><div class='del'>-                        "option remote-port missing in volume %s. Defaulting to %d",</div><div class='del'>-                        this-&gt;name, GF_DEFAULT_SOCKET_LISTEN_PORT);</div><div class='del'>-</div><div class='del'>-                remote_port = GF_DEFAULT_SOCKET_LISTEN_PORT;</div><div class='del'>-        }</div><div class='del'>-        else</div><div class='del'>-        {</div><div class='del'>-                remote_port = data_to_uint16 (remote_port_data);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (remote_port == (uint16_t)-1)</div><div class='del'>-        {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-                        "option remote-port has invalid port in volume %s",</div><div class='del'>-                        this-&gt;name);</div><div class='del'>-                ret = -1;</div><div class='del'>-                goto err;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        /* TODO: gf_resolve is a blocking call. kick in some</div><div class='del'>-           non blocking dns techniques */</div><div class='del'>-        ret = gf_resolve_ip6 (remote_host, remote_port,</div><div class='del'>-                              sockaddr-&gt;sa_family, &amp;this-&gt;dnscache, &amp;addr_info);</div><div class='add'>+    data_t *path_data = NULL;</div><div class='add'>+    struct sockaddr_un *addr = NULL;</div><div class='add'>+    int32_t ret = 0;</div><div class='add'>+</div><div class='add'>+    path_data = dict_get_sizen(this-&gt;options, "transport.socket.bind-path");</div><div class='add'>+    if (path_data) {</div><div class='add'>+        char *path = data_to_str(path_data);</div><div class='add'>+        if (!path || path_data-&gt;len &gt; 108) { /* 108 = addr-&gt;sun_path length */</div><div class='add'>+            gf_log(this-&gt;name, GF_LOG_TRACE,</div><div class='add'>+                   "bind-path not specified for unix socket, "</div><div class='add'>+                   "letting connect to assign default value");</div><div class='add'>+            goto err;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        addr = (struct sockaddr_un *)sockaddr;</div><div class='add'>+        strcpy(addr-&gt;sun_path, path);</div><div class='add'>+        ret = bind(sock, (struct sockaddr *)addr, sockaddr_len);</div><div class='ctx'>         if (ret == -1) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-                        "DNS resolution failed on host %s", remote_host);</div><div class='del'>-                goto err;</div><div class='add'>+            gf_log(this-&gt;name, GF_LOG_ERROR,</div><div class='add'>+                   "cannot bind to unix-domain socket %d (%s)", sock,</div><div class='add'>+                   strerror(errno));</div><div class='add'>+            goto err;</div><div class='ctx'>         }</div><div class='del'>-</div><div class='del'>-        memcpy (sockaddr, addr_info-&gt;ai_addr, addr_info-&gt;ai_addrlen);</div><div class='del'>-        *sockaddr_len = addr_info-&gt;ai_addrlen;</div><div class='add'>+    } else {</div><div class='add'>+        gf_log(this-&gt;name, GF_LOG_TRACE,</div><div class='add'>+               "bind-path not specified for unix socket, "</div><div class='add'>+               "letting connect to assign default value");</div><div class='add'>+    }</div><div class='ctx'> </div><div class='ctx'> err:</div><div class='del'>-        return ret;</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> static int32_t</div><div class='del'>-af_unix_client_get_remote_sockaddr (rpc_transport_t *this,</div><div class='del'>-                                    struct sockaddr *sockaddr,</div><div class='del'>-                                    socklen_t *sockaddr_len)</div><div class='add'>+client_fill_address_family(rpc_transport_t *this, sa_family_t *sa_family)</div><div class='ctx'> {</div><div class='del'>-        struct sockaddr_un *sockaddr_un = NULL;</div><div class='del'>-        char *connect_path = NULL;</div><div class='del'>-        data_t *connect_path_data = NULL;</div><div class='del'>-        int32_t ret = 0;</div><div class='del'>-</div><div class='del'>-        connect_path_data = dict_get (this-&gt;options,</div><div class='del'>-                                      "transport.socket.connect-path");</div><div class='del'>-        if (!connect_path_data) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-                        "option transport.unix.connect-path not specified for "</div><div class='del'>-                        "address-family unix");</div><div class='del'>-                ret = -1;</div><div class='del'>-                goto err;</div><div class='add'>+    data_t *address_family_data = NULL;</div><div class='add'>+    int32_t ret = -1;</div><div class='add'>+</div><div class='add'>+    if (sa_family == NULL) {</div><div class='add'>+        gf_log_callingfn("", GF_LOG_WARNING, "sa_family argument is NULL");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    address_family_data = dict_get_sizen(this-&gt;options,</div><div class='add'>+                                         "transport.address-family");</div><div class='add'>+    if (!address_family_data) {</div><div class='add'>+        data_t *remote_host_data = NULL, *connect_path_data = NULL;</div><div class='add'>+        remote_host_data = dict_get_sizen(this-&gt;options, "remote-host");</div><div class='add'>+        connect_path_data = dict_get_sizen(this-&gt;options,</div><div class='add'>+                                           "transport.socket.connect-path");</div><div class='add'>+</div><div class='add'>+        if (!(remote_host_data || connect_path_data) ||</div><div class='add'>+            (remote_host_data &amp;&amp; connect_path_data)) {</div><div class='add'>+            gf_log(this-&gt;name, GF_LOG_ERROR,</div><div class='add'>+                   "transport.address-family not specified. "</div><div class='add'>+                   "Could not guess default value from (remote-host:%s or "</div><div class='add'>+                   "transport.unix.connect-path:%s) options",</div><div class='add'>+                   data_to_str(remote_host_data),</div><div class='add'>+                   data_to_str(connect_path_data));</div><div class='add'>+            *sa_family = AF_UNSPEC;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        if (remote_host_data) {</div><div class='add'>+            gf_log(this-&gt;name, GF_LOG_DEBUG,</div><div class='add'>+                   "address-family not specified, marking it as unspec "</div><div class='add'>+                   "for getaddrinfo to resolve from (remote-host: %s)",</div><div class='add'>+                   data_to_str(remote_host_data));</div><div class='add'>+            *sa_family = AF_UNSPEC;</div><div class='add'>+        } else {</div><div class='add'>+            gf_log(this-&gt;name, GF_LOG_DEBUG,</div><div class='add'>+                   "address-family not specified, guessing it "</div><div class='add'>+                   "to be unix from (transport.unix.connect-path: %s)",</div><div class='add'>+                   data_to_str(connect_path_data));</div><div class='add'>+            *sa_family = AF_UNIX;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+    } else {</div><div class='add'>+        const char *address_family = data_to_str(address_family_data);</div><div class='add'>+        if (!strcasecmp(address_family, "unix")) {</div><div class='add'>+            *sa_family = AF_UNIX;</div><div class='add'>+        } else if (!strcasecmp(address_family, "inet")) {</div><div class='add'>+            *sa_family = AF_INET;</div><div class='add'>+        } else if (!strcasecmp(address_family, "inet6")) {</div><div class='add'>+            *sa_family = AF_INET6;</div><div class='add'>+        } else if (!strcasecmp(address_family, "inet-sdp")) {</div><div class='add'>+            *sa_family = AF_INET_SDP;</div><div class='add'>+        } else {</div><div class='add'>+            gf_log(this-&gt;name, GF_LOG_ERROR,</div><div class='add'>+                   "unknown address-family (%s) specified", address_family);</div><div class='add'>+            *sa_family = AF_UNSPEC;</div><div class='add'>+            goto out;</div><div class='ctx'>         }</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        connect_path = data_to_str (connect_path_data);</div><div class='del'>-        if (!connect_path) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-                        "transport.unix.connect-path is null-string");</div><div class='del'>-                ret = -1;</div><div class='del'>-                goto err;</div><div class='del'>-        }</div><div class='add'>+    ret = 0;</div><div class='ctx'> </div><div class='del'>-        if (strlen (connect_path) &gt; UNIX_PATH_MAX) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-                        "connect-path value length %"GF_PRI_SIZET" &gt; %d octets",</div><div class='del'>-                        strlen (connect_path), UNIX_PATH_MAX);</div><div class='del'>-                ret = -1;</div><div class='del'>-                goto err;</div><div class='del'>-        }</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        gf_log (this-&gt;name, GF_LOG_TRACE,</div><div class='del'>-                "using connect-path %s", connect_path);</div><div class='del'>-        sockaddr_un = (struct sockaddr_un *)sockaddr;</div><div class='del'>-        strcpy (sockaddr_un-&gt;sun_path, connect_path);</div><div class='del'>-        *sockaddr_len = sizeof (struct sockaddr_un);</div><div class='add'>+static int32_t</div><div class='add'>+af_inet_client_get_remote_sockaddr(rpc_transport_t *this,</div><div class='add'>+                                   struct sockaddr *sockaddr,</div><div class='add'>+                                   socklen_t *sockaddr_len)</div><div class='add'>+{</div><div class='add'>+    dict_t *options = this-&gt;options;</div><div class='add'>+    data_t *remote_host_data = NULL;</div><div class='add'>+    data_t *remote_port_data = NULL;</div><div class='add'>+    char *remote_host = NULL;</div><div class='add'>+    uint16_t remote_port = GF_DEFAULT_SOCKET_LISTEN_PORT;</div><div class='add'>+    struct addrinfo *addr_info = NULL;</div><div class='add'>+    int32_t ret = 0;</div><div class='add'>+    struct in6_addr serveraddr;</div><div class='add'>+</div><div class='add'>+    remote_host_data = dict_get_sizen(options, "remote-host");</div><div class='add'>+    if (remote_host_data == NULL) {</div><div class='add'>+        gf_log(this-&gt;name, GF_LOG_ERROR,</div><div class='add'>+               "option remote-host missing in volume %s", this-&gt;name);</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    remote_host = data_to_str(remote_host_data);</div><div class='add'>+    if (remote_host == NULL) {</div><div class='add'>+        gf_log(this-&gt;name, GF_LOG_ERROR,</div><div class='add'>+               "option remote-host has data NULL in volume %s", this-&gt;name);</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    remote_port_data = dict_get_sizen(options, "remote-port");</div><div class='add'>+    if (remote_port_data == NULL) {</div><div class='add'>+        gf_log(this-&gt;name, GF_LOG_TRACE,</div><div class='add'>+               "option remote-port missing in volume %s. Defaulting to %d",</div><div class='add'>+               this-&gt;name, GF_DEFAULT_SOCKET_LISTEN_PORT);</div><div class='add'>+    } else {</div><div class='add'>+        remote_port = data_to_uint16(remote_port_data);</div><div class='add'>+        if (remote_port == (uint16_t)-1) {</div><div class='add'>+            gf_log(this-&gt;name, GF_LOG_ERROR,</div><div class='add'>+                   "option remote-port has invalid port in volume %s",</div><div class='add'>+                   this-&gt;name);</div><div class='add'>+            ret = -1;</div><div class='add'>+            goto err;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Need to update transport-address family if address-family is not provided</div><div class='add'>+       to command-line arguments</div><div class='add'>+    */</div><div class='add'>+    if (inet_pton(AF_INET6, remote_host, &amp;serveraddr)) {</div><div class='add'>+        sockaddr-&gt;sa_family = AF_INET6;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* TODO: gf_resolve is a blocking call. kick in some</div><div class='add'>+       non blocking dns techniques */</div><div class='add'>+    ret = gf_resolve_ip6(remote_host, remote_port, sockaddr-&gt;sa_family,</div><div class='add'>+                         &amp;this-&gt;dnscache, &amp;addr_info);</div><div class='add'>+    if (ret == -1) {</div><div class='add'>+        gf_log(this-&gt;name, GF_LOG_ERROR, "DNS resolution failed on host %s",</div><div class='add'>+               remote_host);</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    memcpy(sockaddr, addr_info-&gt;ai_addr, addr_info-&gt;ai_addrlen);</div><div class='add'>+    *sockaddr_len = addr_info-&gt;ai_addrlen;</div><div class='ctx'> </div><div class='ctx'> err:</div><div class='del'>-        return ret;</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> static int32_t</div><div class='del'>-af_unix_server_get_local_sockaddr (rpc_transport_t *this,</div><div class='del'>-                                   struct sockaddr *addr,</div><div class='del'>-                                   socklen_t *addr_len)</div><div class='add'>+af_unix_client_get_remote_sockaddr(rpc_transport_t *this,</div><div class='add'>+                                   struct sockaddr *sockaddr,</div><div class='add'>+                                   socklen_t *sockaddr_len)</div><div class='ctx'> {</div><div class='del'>-        data_t *listen_path_data = NULL;</div><div class='del'>-        char *listen_path = NULL;</div><div class='del'>-        int32_t ret = 0;</div><div class='del'>-        struct sockaddr_un *sunaddr = (struct sockaddr_un *)addr;</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-        listen_path_data = dict_get (this-&gt;options,</div><div class='del'>-                                     "transport.socket.listen-path");</div><div class='del'>-        if (!listen_path_data) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-                        "missing option transport.socket.listen-path");</div><div class='del'>-                ret = -1;</div><div class='del'>-                goto err;</div><div class='del'>-        }</div><div class='add'>+    struct sockaddr_un *sockaddr_un = NULL;</div><div class='add'>+    char *connect_path = NULL;</div><div class='add'>+    data_t *connect_path_data = NULL;</div><div class='add'>+    int32_t ret = -1;</div><div class='add'>+</div><div class='add'>+    connect_path_data = dict_get_sizen(this-&gt;options,</div><div class='add'>+                                       "transport.socket.connect-path");</div><div class='add'>+    if (!connect_path_data) {</div><div class='add'>+        gf_log(this-&gt;name, GF_LOG_ERROR,</div><div class='add'>+               "option transport.unix.connect-path not specified for "</div><div class='add'>+               "address-family unix");</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* 108 = sockaddr_un-&gt;sun_path length */</div><div class='add'>+    if ((connect_path_data-&gt;len + 1) &gt; 108) {</div><div class='add'>+        gf_log(this-&gt;name, GF_LOG_ERROR,</div><div class='add'>+               "connect-path value length %d &gt; %d octets",</div><div class='add'>+               connect_path_data-&gt;len + 1, UNIX_PATH_MAX);</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    connect_path = data_to_str(connect_path_data);</div><div class='add'>+    if (!connect_path) {</div><div class='add'>+        gf_log(this-&gt;name, GF_LOG_ERROR,</div><div class='add'>+               "transport.unix.connect-path is null-string");</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    gf_log(this-&gt;name, GF_LOG_TRACE, "using connect-path %s", connect_path);</div><div class='add'>+    sockaddr_un = (struct sockaddr_un *)sockaddr;</div><div class='add'>+    strcpy(sockaddr_un-&gt;sun_path, connect_path);</div><div class='add'>+    *sockaddr_len = sizeof(struct sockaddr_un);</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+err:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        listen_path = data_to_str (listen_path_data);</div><div class='add'>+static int32_t</div><div class='add'>+af_unix_server_get_local_sockaddr(rpc_transport_t *this, struct sockaddr *addr,</div><div class='add'>+                                  socklen_t *addr_len)</div><div class='add'>+{</div><div class='add'>+    data_t *listen_path_data = NULL;</div><div class='add'>+    char *listen_path = NULL;</div><div class='add'>+    int32_t ret = 0;</div><div class='add'>+    struct sockaddr_un *sunaddr = (struct sockaddr_un *)addr;</div><div class='add'>+</div><div class='add'>+    listen_path_data = dict_get_sizen(this-&gt;options,</div><div class='add'>+                                      "transport.socket.listen-path");</div><div class='add'>+    if (!listen_path_data) {</div><div class='add'>+        gf_log(this-&gt;name, GF_LOG_ERROR,</div><div class='add'>+               "missing option transport.socket.listen-path");</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    listen_path = data_to_str(listen_path_data);</div><div class='ctx'> </div><div class='ctx'> #ifndef UNIX_PATH_MAX</div><div class='ctx'> #define UNIX_PATH_MAX 108</div><div class='ctx'> #endif</div><div class='ctx'> </div><div class='del'>-        if (strlen (listen_path) &gt; UNIX_PATH_MAX) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-                        "option transport.unix.listen-path has value length "</div><div class='del'>-                        "%"GF_PRI_SIZET" &gt; %d",</div><div class='del'>-                        strlen (listen_path), UNIX_PATH_MAX);</div><div class='del'>-                ret = -1;</div><div class='del'>-                goto err;</div><div class='del'>-        }</div><div class='add'>+    if ((listen_path_data-&gt;len + 1) &gt; UNIX_PATH_MAX) {</div><div class='add'>+        gf_log(this-&gt;name, GF_LOG_ERROR,</div><div class='add'>+               "option transport.unix.listen-path has value length "</div><div class='add'>+               "%" GF_PRI_SIZET " &gt; %d",</div><div class='add'>+               strlen(listen_path), UNIX_PATH_MAX);</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        sunaddr-&gt;sun_family = AF_UNIX;</div><div class='del'>-        strcpy (sunaddr-&gt;sun_path, listen_path);</div><div class='del'>-        *addr_len = sizeof (struct sockaddr_un);</div><div class='add'>+    sunaddr-&gt;sun_family = AF_UNIX;</div><div class='add'>+    strcpy(sunaddr-&gt;sun_path, listen_path);</div><div class='add'>+    *addr_len = sizeof(struct sockaddr_un);</div><div class='ctx'> </div><div class='ctx'> err:</div><div class='del'>-        return ret;</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> static int32_t</div><div class='del'>-af_inet_server_get_local_sockaddr (rpc_transport_t *this,</div><div class='del'>-                                   struct sockaddr *addr,</div><div class='del'>-                                   socklen_t *addr_len)</div><div class='add'>+af_inet_server_get_local_sockaddr(rpc_transport_t *this, struct sockaddr *addr,</div><div class='add'>+                                  socklen_t *addr_len)</div><div class='ctx'> {</div><div class='del'>-        struct addrinfo hints, *res = 0;</div><div class='del'>-        data_t *listen_port_data = NULL, *listen_host_data = NULL;</div><div class='del'>-        uint16_t listen_port = -1;</div><div class='del'>-        char service[NI_MAXSERV], *listen_host = NULL;</div><div class='del'>-        dict_t *options = NULL;</div><div class='del'>-        int32_t ret = 0;</div><div class='del'>-</div><div class='del'>-        options = this-&gt;options;</div><div class='del'>-</div><div class='del'>-        listen_port_data = dict_get (options, "transport.socket.listen-port");</div><div class='del'>-        listen_host_data = dict_get (options, "transport.socket.bind-address");</div><div class='del'>-</div><div class='del'>-        if (listen_port_data)</div><div class='del'>-        {</div><div class='del'>-                listen_port = data_to_uint16 (listen_port_data);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (listen_port == (uint16_t) -1)</div><div class='del'>-                listen_port = GF_DEFAULT_SOCKET_LISTEN_PORT;</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-        if (listen_host_data)</div><div class='del'>-        {</div><div class='del'>-                listen_host = data_to_str (listen_host_data);</div><div class='add'>+    struct addrinfo hints, *res = 0, *rp = NULL;</div><div class='add'>+    data_t *listen_port_data = NULL, *listen_host_data = NULL;</div><div class='add'>+    uint16_t listen_port = 0;</div><div class='add'>+    char service[NI_MAXSERV], *listen_host = NULL;</div><div class='add'>+    dict_t *options = NULL;</div><div class='add'>+    int32_t ret = 0;</div><div class='add'>+</div><div class='add'>+    /* initializes addr_len */</div><div class='add'>+    *addr_len = 0;</div><div class='add'>+</div><div class='add'>+    options = this-&gt;options;</div><div class='add'>+</div><div class='add'>+    listen_port_data = dict_get_sizen(options, "transport.socket.listen-port");</div><div class='add'>+    if (listen_port_data) {</div><div class='add'>+        listen_port = data_to_uint16(listen_port_data);</div><div class='add'>+    } else {</div><div class='add'>+        listen_port = GF_DEFAULT_SOCKET_LISTEN_PORT;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    listen_host_data = dict_get_sizen(options, "transport.socket.bind-address");</div><div class='add'>+    if (listen_host_data) {</div><div class='add'>+        listen_host = data_to_str(listen_host_data);</div><div class='add'>+    } else {</div><div class='add'>+        if (addr-&gt;sa_family == AF_INET6) {</div><div class='add'>+            struct sockaddr_in6 *in = (struct sockaddr_in6 *)addr;</div><div class='add'>+            in-&gt;sin6_addr = in6addr_any;</div><div class='add'>+            in-&gt;sin6_port = htons(listen_port);</div><div class='add'>+            *addr_len = sizeof(struct sockaddr_in6);</div><div class='add'>+            goto out;</div><div class='add'>+        } else if (addr-&gt;sa_family == AF_INET) {</div><div class='add'>+            struct sockaddr_in *in = (struct sockaddr_in *)addr;</div><div class='add'>+            in-&gt;sin_addr.s_addr = htonl(INADDR_ANY);</div><div class='add'>+            in-&gt;sin_port = htons(listen_port);</div><div class='add'>+            *addr_len = sizeof(struct sockaddr_in);</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    sprintf(service, "%d", listen_port);</div><div class='add'>+</div><div class='add'>+    memset(&amp;hints, 0, sizeof(hints));</div><div class='add'>+    hints.ai_family = addr-&gt;sa_family;</div><div class='add'>+    hints.ai_socktype = SOCK_STREAM;</div><div class='add'>+    hints.ai_flags = AI_PASSIVE;</div><div class='add'>+</div><div class='add'>+    ret = getaddrinfo(listen_host, service, &amp;hints, &amp;res);</div><div class='add'>+    if (ret != 0) {</div><div class='add'>+        gf_log(this-&gt;name, GF_LOG_ERROR,</div><div class='add'>+               "getaddrinfo failed for host %s, service %s (%s)", listen_host,</div><div class='add'>+               service, gai_strerror(ret));</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    /* IPV6 server can handle both ipv4 and ipv6 clients */</div><div class='add'>+    for (rp = res; rp != NULL; rp = rp-&gt;ai_next) {</div><div class='add'>+        if (rp-&gt;ai_addr == NULL)</div><div class='add'>+            continue;</div><div class='add'>+        if (rp-&gt;ai_family == AF_INET6) {</div><div class='add'>+            memcpy(addr, rp-&gt;ai_addr, rp-&gt;ai_addrlen);</div><div class='add'>+            *addr_len = rp-&gt;ai_addrlen;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (!(*addr_len)) {</div><div class='add'>+        if (res &amp;&amp; res-&gt;ai_addr) {</div><div class='add'>+            memcpy(addr, res-&gt;ai_addr, res-&gt;ai_addrlen);</div><div class='add'>+            *addr_len = res-&gt;ai_addrlen;</div><div class='ctx'>         } else {</div><div class='del'>-		if (addr-&gt;sa_family == AF_INET6) {</div><div class='del'>-			struct sockaddr_in6 *in = (struct sockaddr_in6 *) addr;</div><div class='del'>-			in-&gt;sin6_addr = in6addr_any;</div><div class='del'>-			in-&gt;sin6_port = htons(listen_port);</div><div class='del'>-			*addr_len = sizeof(struct sockaddr_in6);</div><div class='del'>-                        goto out;</div><div class='del'>-		} else if (addr-&gt;sa_family == AF_INET) {</div><div class='del'>-			struct sockaddr_in *in = (struct sockaddr_in *) addr;</div><div class='del'>-			in-&gt;sin_addr.s_addr = htonl(INADDR_ANY);</div><div class='del'>-			in-&gt;sin_port = htons(listen_port);</div><div class='del'>-			*addr_len = sizeof(struct sockaddr_in);</div><div class='del'>-			goto out;</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-        memset (service, 0, sizeof (service));</div><div class='del'>-        sprintf (service, "%d", listen_port);</div><div class='del'>-</div><div class='del'>-        memset (&amp;hints, 0, sizeof (hints));</div><div class='del'>-        hints.ai_family = addr-&gt;sa_family;</div><div class='del'>-        hints.ai_socktype = SOCK_STREAM;</div><div class='del'>-        hints.ai_flags    = AI_ADDRCONFIG | AI_PASSIVE;</div><div class='del'>-</div><div class='del'>-        ret = getaddrinfo(listen_host, service, &amp;hints, &amp;res);</div><div class='del'>-        if (ret != 0) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-                        "getaddrinfo failed for host %s, service %s (%s)",</div><div class='del'>-                        listen_host, service, gai_strerror (ret));</div><div class='del'>-                ret = -1;</div><div class='del'>-                goto out;</div><div class='add'>+            ret = -1;</div><div class='ctx'>         }</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        memcpy (addr, res-&gt;ai_addr, res-&gt;ai_addrlen);</div><div class='del'>-        *addr_len = res-&gt;ai_addrlen;</div><div class='del'>-</div><div class='del'>-        freeaddrinfo (res);</div><div class='add'>+    freeaddrinfo(res);</div><div class='ctx'> </div><div class='ctx'> out:</div><div class='del'>-        return ret;</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> int32_t</div><div class='del'>-client_bind (rpc_transport_t *this,</div><div class='del'>-             struct sockaddr *sockaddr,</div><div class='del'>-             socklen_t *sockaddr_len,</div><div class='del'>-             int sock)</div><div class='add'>+client_bind(rpc_transport_t *this, struct sockaddr *sockaddr,</div><div class='add'>+            socklen_t *sockaddr_len, int sock)</div><div class='ctx'> {</div><div class='del'>-        int ret = 0;</div><div class='add'>+    int ret = 0;</div><div class='ctx'> </div><div class='del'>-        *sockaddr_len = sizeof (struct sockaddr_in6);</div><div class='del'>-        switch (sockaddr-&gt;sa_family)</div><div class='del'>-        {</div><div class='add'>+    *sockaddr_len = sizeof(struct sockaddr_in6);</div><div class='add'>+    switch (sockaddr-&gt;sa_family) {</div><div class='ctx'>         case AF_INET_SDP:</div><div class='ctx'>         case AF_INET:</div><div class='del'>-                *sockaddr_len = sizeof (struct sockaddr_in);</div><div class='del'>-</div><div class='add'>+            *sockaddr_len = sizeof(struct sockaddr_in);</div><div class='add'>+        /* Fall through */</div><div class='ctx'>         case AF_INET6:</div><div class='del'>-                ret = af_inet_bind_to_port_lt_ceiling (sock, sockaddr,</div><div class='del'>-                                                       *sockaddr_len, CLIENT_PORT_CEILING);</div><div class='add'>+            if (!this-&gt;bind_insecure) {</div><div class='add'>+                ret = af_inet_bind_to_port_lt_ceiling(</div><div class='add'>+                    sock, sockaddr, *sockaddr_len, GF_CLIENT_PORT_CEILING);</div><div class='add'>+                if (ret == -1) {</div><div class='add'>+                    gf_log(this-&gt;name, GF_LOG_DEBUG,</div><div class='add'>+                           "cannot bind inet socket (%d) "</div><div class='add'>+                           "to port less than %d (%s)",</div><div class='add'>+                           sock, GF_CLIENT_PORT_CEILING, strerror(errno));</div><div class='add'>+                    ret = 0;</div><div class='add'>+                }</div><div class='add'>+            } else {</div><div class='add'>+                ret = af_inet_bind_to_port_lt_ceiling(</div><div class='add'>+                    sock, sockaddr, *sockaddr_len, GF_IANA_PRIV_PORTS_START);</div><div class='ctx'>                 if (ret == -1) {</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_WARNING,</div><div class='del'>-                                "cannot bind inet socket (%d) to port less than %d (%s)",</div><div class='del'>-                                sock, CLIENT_PORT_CEILING, strerror (errno));</div><div class='del'>-                        ret = 0;</div><div class='add'>+                    gf_log(this-&gt;name, GF_LOG_DEBUG,</div><div class='add'>+                           "failed while binding to less than "</div><div class='add'>+                           "%d (%s)",</div><div class='add'>+                           GF_IANA_PRIV_PORTS_START, strerror(errno));</div><div class='add'>+                    ret = 0;</div><div class='ctx'>                 }</div><div class='del'>-                break;</div><div class='add'>+            }</div><div class='add'>+            break;</div><div class='ctx'> </div><div class='ctx'>         case AF_UNIX:</div><div class='del'>-                *sockaddr_len = sizeof (struct sockaddr_un);</div><div class='del'>-                ret = af_unix_client_bind (this, (struct sockaddr *)sockaddr,</div><div class='del'>-                                           *sockaddr_len, sock);</div><div class='del'>-                break;</div><div class='add'>+            *sockaddr_len = sizeof(struct sockaddr_un);</div><div class='add'>+            ret = af_unix_client_bind(this, (struct sockaddr *)sockaddr,</div><div class='add'>+                                      *sockaddr_len, sock);</div><div class='add'>+            break;</div><div class='ctx'> </div><div class='ctx'>         default:</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-                        "unknown address family %d", sockaddr-&gt;sa_family);</div><div class='del'>-                ret = -1;</div><div class='del'>-                break;</div><div class='del'>-        }</div><div class='add'>+            gf_log(this-&gt;name, GF_LOG_ERROR, "unknown address family %d",</div><div class='add'>+                   sockaddr-&gt;sa_family);</div><div class='add'>+            ret = -1;</div><div class='add'>+            break;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        return ret;</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> int32_t</div><div class='del'>-socket_client_get_remote_sockaddr (rpc_transport_t *this,</div><div class='del'>-                                   struct sockaddr *sockaddr,</div><div class='del'>-                                   socklen_t *sockaddr_len,</div><div class='del'>-                                   sa_family_t *sa_family)</div><div class='add'>+socket_client_get_remote_sockaddr(rpc_transport_t *this,</div><div class='add'>+                                  struct sockaddr *sockaddr,</div><div class='add'>+                                  socklen_t *sockaddr_len,</div><div class='add'>+                                  sa_family_t *sa_family)</div><div class='ctx'> {</div><div class='del'>-        int32_t ret = 0;</div><div class='del'>-</div><div class='del'>-        if ((sockaddr == NULL) || (sockaddr_len == NULL)</div><div class='del'>-            || (sa_family == NULL)) {</div><div class='del'>-                ret = -1;</div><div class='del'>-                goto err;</div><div class='del'>-        }</div><div class='add'>+    int32_t ret = 0;</div><div class='ctx'> </div><div class='add'>+    GF_VALIDATE_OR_GOTO("socket", sockaddr, err);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("socket", sockaddr_len, err);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("socket", sa_family, err);</div><div class='ctx'> </div><div class='del'>-        ret = client_fill_address_family (this, &amp;sockaddr-&gt;sa_family);</div><div class='del'>-        if (ret) {</div><div class='del'>-                ret = -1;</div><div class='del'>-                goto err;</div><div class='del'>-        }</div><div class='add'>+    ret = client_fill_address_family(this, &amp;sockaddr-&gt;sa_family);</div><div class='add'>+    if (ret) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        *sa_family = sockaddr-&gt;sa_family;</div><div class='add'>+    *sa_family = sockaddr-&gt;sa_family;</div><div class='ctx'> </div><div class='del'>-        switch (sockaddr-&gt;sa_family)</div><div class='del'>-        {</div><div class='add'>+    switch (sockaddr-&gt;sa_family) {</div><div class='ctx'>         case AF_INET_SDP:</div><div class='del'>-                sockaddr-&gt;sa_family = AF_INET;</div><div class='del'>-</div><div class='add'>+            sockaddr-&gt;sa_family = AF_INET;</div><div class='add'>+        /* Fall through */</div><div class='ctx'>         case AF_INET:</div><div class='ctx'>         case AF_INET6:</div><div class='ctx'>         case AF_UNSPEC:</div><div class='del'>-                ret = af_inet_client_get_remote_sockaddr (this, sockaddr,</div><div class='del'>-                                                          sockaddr_len);</div><div class='del'>-                break;</div><div class='add'>+            ret = af_inet_client_get_remote_sockaddr(this, sockaddr,</div><div class='add'>+                                                     sockaddr_len);</div><div class='add'>+            break;</div><div class='ctx'> </div><div class='ctx'>         case AF_UNIX:</div><div class='del'>-                ret = af_unix_client_get_remote_sockaddr (this, sockaddr,</div><div class='del'>-                                                          sockaddr_len);</div><div class='del'>-                break;</div><div class='add'>+            ret = af_unix_client_get_remote_sockaddr(this, sockaddr,</div><div class='add'>+                                                     sockaddr_len);</div><div class='add'>+            break;</div><div class='ctx'> </div><div class='ctx'>         default:</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-                        "unknown address-family %d", sockaddr-&gt;sa_family);</div><div class='del'>-                ret = -1;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (*sa_family == AF_UNSPEC) {</div><div class='del'>-                *sa_family = sockaddr-&gt;sa_family;</div><div class='del'>-        }</div><div class='add'>+            gf_log(this-&gt;name, GF_LOG_ERROR, "unknown address-family %d",</div><div class='add'>+                   sockaddr-&gt;sa_family);</div><div class='add'>+            ret = -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Address-family is updated based on remote_host in</div><div class='add'>+       af_inet_client_get_remote_sockaddr</div><div class='add'>+    */</div><div class='add'>+    if (*sa_family != sockaddr-&gt;sa_family) {</div><div class='add'>+        *sa_family = sockaddr-&gt;sa_family;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='ctx'> err:</div><div class='del'>-        return ret;</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-server_fill_address_family (rpc_transport_t *this, sa_family_t *sa_family)</div><div class='add'>+static int32_t</div><div class='add'>+server_fill_address_family(rpc_transport_t *this, sa_family_t *sa_family)</div><div class='ctx'> {</div><div class='del'>-        data_t  *address_family_data = NULL;</div><div class='del'>-        int32_t  ret                 = -1;</div><div class='add'>+    data_t *address_family_data = NULL;</div><div class='add'>+    int32_t ret = -1;</div><div class='ctx'> </div><div class='del'>-        if (sa_family == NULL) {</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='add'>+#ifdef IPV6_DEFAULT</div><div class='add'>+    const char *addr_family = "inet6";</div><div class='add'>+    sa_family_t default_family = AF_INET6;</div><div class='add'>+#else</div><div class='add'>+    const char *addr_family = "inet";</div><div class='add'>+    sa_family_t default_family = AF_INET;</div><div class='add'>+#endif</div><div class='ctx'> </div><div class='del'>-        address_family_data = dict_get (this-&gt;options,</div><div class='del'>-                                        "transport.address-family");</div><div class='del'>-        if (address_family_data) {</div><div class='del'>-                char *address_family = NULL;</div><div class='del'>-                address_family = data_to_str (address_family_data);</div><div class='del'>-</div><div class='del'>-                if (!strcasecmp (address_family, "inet")) {</div><div class='del'>-                        *sa_family = AF_INET;</div><div class='del'>-                } else if (!strcasecmp (address_family, "inet6")) {</div><div class='del'>-                        *sa_family = AF_INET6;</div><div class='del'>-                } else if (!strcasecmp (address_family, "inet-sdp")) {</div><div class='del'>-                        *sa_family = AF_INET_SDP;</div><div class='del'>-                } else if (!strcasecmp (address_family, "unix")) {</div><div class='del'>-                        *sa_family = AF_UNIX;</div><div class='del'>-                } else if (!strcasecmp (address_family, "inet/inet6")</div><div class='del'>-                           || !strcasecmp (address_family, "inet6/inet")) {</div><div class='del'>-                        *sa_family = AF_UNSPEC;</div><div class='del'>-                } else {</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-                                "unknown address family (%s) specified", address_family);</div><div class='del'>-                        goto out;</div><div class='del'>-                }</div><div class='add'>+    GF_VALIDATE_OR_GOTO("socket", sa_family, out);</div><div class='add'>+</div><div class='add'>+    address_family_data = dict_get_sizen(this-&gt;options,</div><div class='add'>+                                         "transport.address-family");</div><div class='add'>+    if (address_family_data) {</div><div class='add'>+        char *address_family = NULL;</div><div class='add'>+        address_family = data_to_str(address_family_data);</div><div class='add'>+</div><div class='add'>+        if (!strcasecmp(address_family, "inet")) {</div><div class='add'>+            *sa_family = AF_INET;</div><div class='add'>+        } else if (!strcasecmp(address_family, "inet6")) {</div><div class='add'>+            *sa_family = AF_INET6;</div><div class='add'>+        } else if (!strcasecmp(address_family, "inet-sdp")) {</div><div class='add'>+            *sa_family = AF_INET_SDP;</div><div class='add'>+        } else if (!strcasecmp(address_family, "unix")) {</div><div class='add'>+            *sa_family = AF_UNIX;</div><div class='ctx'>         } else {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-                        "option address-family not specified, defaulting to inet/inet6");</div><div class='del'>-                *sa_family = AF_UNSPEC;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        ret = 0;</div><div class='add'>+            gf_log(this-&gt;name, GF_LOG_ERROR,</div><div class='add'>+                   "unknown address family (%s) specified", address_family);</div><div class='add'>+            *sa_family = AF_UNSPEC;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    } else {</div><div class='add'>+        gf_log(this-&gt;name, GF_LOG_DEBUG,</div><div class='add'>+               "option address-family not specified, "</div><div class='add'>+               "defaulting to %s",</div><div class='add'>+               addr_family);</div><div class='add'>+        *sa_family = default_family;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='ctx'> out:</div><div class='del'>-        return ret;</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int32_t</div><div class='del'>-socket_server_get_local_sockaddr (rpc_transport_t *this, struct sockaddr *addr,</div><div class='del'>-                                  socklen_t *addr_len, sa_family_t *sa_family)</div><div class='add'>+socket_server_get_local_sockaddr(rpc_transport_t *this, struct sockaddr *addr,</div><div class='add'>+                                 socklen_t *addr_len, sa_family_t *sa_family)</div><div class='ctx'> {</div><div class='del'>-        int32_t ret = -1;</div><div class='add'>+    int32_t ret = -1;</div><div class='ctx'> </div><div class='del'>-        if ((addr == NULL) || (addr_len == NULL) || (sa_family == NULL)) {</div><div class='del'>-                goto err;</div><div class='del'>-        }</div><div class='add'>+    GF_VALIDATE_OR_GOTO("socket", sa_family, err);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("socket", addr, err);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("socket", addr_len, err);</div><div class='ctx'> </div><div class='del'>-        ret = server_fill_address_family (this, &amp;addr-&gt;sa_family);</div><div class='del'>-        if (ret == -1) {</div><div class='del'>-                goto err;</div><div class='del'>-        }</div><div class='add'>+    ret = server_fill_address_family(this, &amp;addr-&gt;sa_family);</div><div class='add'>+    if (ret == -1) {</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        *sa_family = addr-&gt;sa_family;</div><div class='add'>+    *sa_family = addr-&gt;sa_family;</div><div class='ctx'> </div><div class='del'>-        switch (addr-&gt;sa_family)</div><div class='del'>-        {</div><div class='add'>+    switch (addr-&gt;sa_family) {</div><div class='ctx'>         case AF_INET_SDP:</div><div class='del'>-                addr-&gt;sa_family = AF_INET;</div><div class='del'>-</div><div class='add'>+            addr-&gt;sa_family = AF_INET;</div><div class='add'>+        /* Fall through */</div><div class='ctx'>         case AF_INET:</div><div class='ctx'>         case AF_INET6:</div><div class='ctx'>         case AF_UNSPEC:</div><div class='del'>-                ret = af_inet_server_get_local_sockaddr (this, addr, addr_len);</div><div class='del'>-                break;</div><div class='add'>+            ret = af_inet_server_get_local_sockaddr(this, addr, addr_len);</div><div class='add'>+            break;</div><div class='ctx'> </div><div class='ctx'>         case AF_UNIX:</div><div class='del'>-                ret = af_unix_server_get_local_sockaddr (this, addr, addr_len);</div><div class='del'>-                break;</div><div class='del'>-        }</div><div class='add'>+            ret = af_unix_server_get_local_sockaddr(this, addr, addr_len);</div><div class='add'>+            break;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        if (*sa_family == AF_UNSPEC) {</div><div class='del'>-                *sa_family = addr-&gt;sa_family;</div><div class='del'>-        }</div><div class='add'>+    if (*sa_family == AF_UNSPEC) {</div><div class='add'>+        *sa_family = addr-&gt;sa_family;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='ctx'> err:</div><div class='del'>-        return ret;</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-int32_t</div><div class='del'>-fill_inet6_inet_identifiers (rpc_transport_t *this, struct sockaddr_storage *addr,</div><div class='del'>-                             int32_t addr_len, char *identifier)</div><div class='add'>+static int32_t</div><div class='add'>+fill_inet6_inet_identifiers(rpc_transport_t *this,</div><div class='add'>+                            struct sockaddr_storage *addr, int32_t addr_len,</div><div class='add'>+                            char *identifier)</div><div class='ctx'> {</div><div class='del'>-        struct sockaddr_storage tmpaddr;</div><div class='del'>-</div><div class='del'>-        char    service[NI_MAXSERV] = {0,};</div><div class='del'>-        char    host[NI_MAXHOST]    = {0,};</div><div class='del'>-        int32_t ret                 = 0;</div><div class='del'>-        int32_t tmpaddr_len         = 0;</div><div class='del'>-        int32_t one_to_four         = 0;</div><div class='del'>-        int32_t four_to_eight       = 0;</div><div class='del'>-        int32_t twelve_to_sixteen   = 0;</div><div class='del'>-        int16_t eight_to_ten        = 0;</div><div class='del'>-        int16_t ten_to_twelve       = 0;</div><div class='del'>-</div><div class='del'>-        memset (&amp;tmpaddr, 0, sizeof (tmpaddr));</div><div class='del'>-        tmpaddr = *addr;</div><div class='del'>-        tmpaddr_len = addr_len;</div><div class='del'>-</div><div class='del'>-        if (((struct sockaddr *) &amp;tmpaddr)-&gt;sa_family == AF_INET6) {</div><div class='del'>-                one_to_four = ((struct sockaddr_in6 *) &amp;tmpaddr)-&gt;sin6_addr.s6_addr32[0];</div><div class='del'>-                four_to_eight = ((struct sockaddr_in6 *) &amp;tmpaddr)-&gt;sin6_addr.s6_addr32[1];</div><div class='add'>+    union gf_sock_union sock_union;</div><div class='add'>+</div><div class='add'>+    char service[NI_MAXSERV] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    char host[NI_MAXHOST] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int32_t ret = 0;</div><div class='add'>+    int32_t tmpaddr_len = 0;</div><div class='add'>+    int32_t one_to_four = 0;</div><div class='add'>+    int32_t four_to_eight = 0;</div><div class='add'>+    int32_t twelve_to_sixteen = 0;</div><div class='add'>+    int16_t eight_to_ten = 0;</div><div class='add'>+    int16_t ten_to_twelve = 0;</div><div class='add'>+</div><div class='add'>+    memset(&amp;sock_union, 0, sizeof(sock_union));</div><div class='add'>+    sock_union.storage = *addr;</div><div class='add'>+    tmpaddr_len = addr_len;</div><div class='add'>+</div><div class='add'>+    if (sock_union.sa.sa_family == AF_INET6) {</div><div class='add'>+        one_to_four = sock_union.sin6.sin6_addr.s6_addr32[0];</div><div class='add'>+        four_to_eight = sock_union.sin6.sin6_addr.s6_addr32[1];</div><div class='ctx'> #ifdef GF_SOLARIS_HOST_OS</div><div class='del'>-                eight_to_ten = S6_ADDR16(((struct sockaddr_in6 *) &amp;tmpaddr)-&gt;sin6_addr)[4];</div><div class='add'>+        eight_to_ten = S6_ADDR16(sock_union.sin6.sin6_addr)[4];</div><div class='ctx'> #else</div><div class='del'>-                eight_to_ten = ((struct sockaddr_in6 *) &amp;tmpaddr)-&gt;sin6_addr.s6_addr16[4];</div><div class='add'>+        eight_to_ten = sock_union.sin6.sin6_addr.s6_addr16[4];</div><div class='ctx'> #endif</div><div class='ctx'> </div><div class='ctx'> #ifdef GF_SOLARIS_HOST_OS</div><div class='del'>-                ten_to_twelve = S6_ADDR16(((struct sockaddr_in6 *) &amp;tmpaddr)-&gt;sin6_addr)[5];</div><div class='add'>+        ten_to_twelve = S6_ADDR16(sock_union.sin6.sin6_addr)[5];</div><div class='ctx'> #else</div><div class='del'>-                ten_to_twelve = ((struct sockaddr_in6 *) &amp;tmpaddr)-&gt;sin6_addr.s6_addr16[5];</div><div class='add'>+        ten_to_twelve = sock_union.sin6.sin6_addr.s6_addr16[5];</div><div class='ctx'> #endif</div><div class='ctx'> </div><div class='del'>-                twelve_to_sixteen = ((struct sockaddr_in6 *) &amp;tmpaddr)-&gt;sin6_addr.s6_addr32[3];</div><div class='del'>-</div><div class='del'>-                /* ipv4 mapped ipv6 address has</div><div class='del'>-                   bits 0-80: 0</div><div class='del'>-                   bits 80-96: 0xffff</div><div class='del'>-                   bits 96-128: ipv4 address</div><div class='del'>-                */</div><div class='del'>-</div><div class='del'>-                if (one_to_four == 0 &amp;&amp;</div><div class='del'>-                    four_to_eight == 0 &amp;&amp;</div><div class='del'>-                    eight_to_ten == 0 &amp;&amp;</div><div class='del'>-                    ten_to_twelve == -1) {</div><div class='del'>-                        struct sockaddr_in *in_ptr = (struct sockaddr_in *)&amp;tmpaddr;</div><div class='del'>-                        memset (&amp;tmpaddr, 0, sizeof (tmpaddr));</div><div class='del'>-</div><div class='del'>-                        in_ptr-&gt;sin_family = AF_INET;</div><div class='del'>-                        in_ptr-&gt;sin_port = ((struct sockaddr_in6 *)addr)-&gt;sin6_port;</div><div class='del'>-                        in_ptr-&gt;sin_addr.s_addr = twelve_to_sixteen;</div><div class='del'>-                        tmpaddr_len = sizeof (*in_ptr);</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='add'>+        twelve_to_sixteen = sock_union.sin6.sin6_addr.s6_addr32[3];</div><div class='ctx'> </div><div class='del'>-        ret = getnameinfo ((struct sockaddr *) &amp;tmpaddr,</div><div class='del'>-                           tmpaddr_len,</div><div class='del'>-                           host, sizeof (host),</div><div class='del'>-                           service, sizeof (service),</div><div class='del'>-                           NI_NUMERICHOST | NI_NUMERICSERV);</div><div class='del'>-        if (ret != 0) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-                        "getnameinfo failed (%s)", gai_strerror (ret));</div><div class='add'>+        /* ipv4 mapped ipv6 address has</div><div class='add'>+           bits 0-80: 0</div><div class='add'>+           bits 80-96: 0xffff</div><div class='add'>+           bits 96-128: ipv4 address</div><div class='add'>+        */</div><div class='add'>+</div><div class='add'>+        if (one_to_four == 0 &amp;&amp; four_to_eight == 0 &amp;&amp; eight_to_ten == 0 &amp;&amp;</div><div class='add'>+            ten_to_twelve == -1) {</div><div class='add'>+            struct sockaddr_in *in_ptr = &amp;sock_union.sin;</div><div class='add'>+            memset(&amp;sock_union, 0, sizeof(sock_union));</div><div class='add'>+</div><div class='add'>+            in_ptr-&gt;sin_family = AF_INET;</div><div class='add'>+            in_ptr-&gt;sin_port = ((struct sockaddr_in6 *)addr)-&gt;sin6_port;</div><div class='add'>+            in_ptr-&gt;sin_addr.s_addr = twelve_to_sixteen;</div><div class='add'>+            tmpaddr_len = sizeof(*in_ptr);</div><div class='ctx'>         }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = getnameinfo(&amp;sock_union.sa, tmpaddr_len, host, sizeof(host), service,</div><div class='add'>+                      sizeof(service), NI_NUMERICHOST | NI_NUMERICSERV);</div><div class='add'>+    if (ret != 0) {</div><div class='add'>+        gf_log(this-&gt;name, GF_LOG_ERROR, "getnameinfo failed (%s)",</div><div class='add'>+               gai_strerror(ret));</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        sprintf (identifier, "%s:%s", host, service);</div><div class='add'>+    sprintf(identifier, "%s:%s", host, service);</div><div class='ctx'> </div><div class='del'>-        return ret;</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> int32_t</div><div class='del'>-get_transport_identifiers (rpc_transport_t *this)</div><div class='add'>+get_transport_identifiers(rpc_transport_t *this)</div><div class='ctx'> {</div><div class='del'>-        int32_t ret = 0;</div><div class='del'>-        char is_inet_sdp = 0;</div><div class='add'>+    int32_t ret = 0;</div><div class='add'>+    char is_inet_sdp = 0;</div><div class='ctx'> </div><div class='del'>-        switch (((struct sockaddr *) &amp;this-&gt;myinfo.sockaddr)-&gt;sa_family)</div><div class='del'>-        {</div><div class='add'>+    switch (((struct sockaddr *)&amp;this-&gt;myinfo.sockaddr)-&gt;sa_family) {</div><div class='ctx'>         case AF_INET_SDP:</div><div class='del'>-                is_inet_sdp = 1;</div><div class='del'>-                ((struct sockaddr *) &amp;this-&gt;peerinfo.sockaddr)-&gt;sa_family = ((struct sockaddr *) &amp;this-&gt;myinfo.sockaddr)-&gt;sa_family = AF_INET;</div><div class='del'>-</div><div class='add'>+            is_inet_sdp = 1;</div><div class='add'>+            ((struct sockaddr *)&amp;this-&gt;peerinfo.sockaddr)</div><div class='add'>+                -&gt;sa_family = ((struct sockaddr *)&amp;this-&gt;myinfo.sockaddr)</div><div class='add'>+                                  -&gt;sa_family = AF_INET;</div><div class='add'>+        /* Fall through */</div><div class='ctx'>         case AF_INET:</div><div class='del'>-        case AF_INET6:</div><div class='del'>-        {</div><div class='del'>-                ret = fill_inet6_inet_identifiers (this,</div><div class='del'>-                                                   &amp;this-&gt;myinfo.sockaddr,</div><div class='del'>-                                                   this-&gt;myinfo.sockaddr_len,</div><div class='del'>-                                                   this-&gt;myinfo.identifier);</div><div class='del'>-                if (ret == -1) {</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-                                "cannot fill inet/inet6 identifier for server");</div><div class='del'>-                        goto err;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                ret = fill_inet6_inet_identifiers (this,</div><div class='del'>-                                                   &amp;this-&gt;peerinfo.sockaddr,</div><div class='del'>-                                                   this-&gt;peerinfo.sockaddr_len,</div><div class='del'>-                                                   this-&gt;peerinfo.identifier);</div><div class='del'>-                if (ret == -1) {</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-                                "cannot fill inet/inet6 identifier for client");</div><div class='del'>-                        goto err;</div><div class='del'>-                }</div><div class='add'>+        case AF_INET6: {</div><div class='add'>+            ret = fill_inet6_inet_identifiers(this, &amp;this-&gt;myinfo.sockaddr,</div><div class='add'>+                                              this-&gt;myinfo.sockaddr_len,</div><div class='add'>+                                              this-&gt;myinfo.identifier);</div><div class='add'>+            if (ret == -1) {</div><div class='add'>+                gf_log(this-&gt;name, GF_LOG_ERROR,</div><div class='add'>+                       "cannot fill inet/inet6 identifier for server");</div><div class='add'>+                goto err;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            ret = fill_inet6_inet_identifiers(this, &amp;this-&gt;peerinfo.sockaddr,</div><div class='add'>+                                              this-&gt;peerinfo.sockaddr_len,</div><div class='add'>+                                              this-&gt;peerinfo.identifier);</div><div class='add'>+            if (ret == -1) {</div><div class='add'>+                gf_log(this-&gt;name, GF_LOG_ERROR,</div><div class='add'>+                       "cannot fill inet/inet6 identifier for client");</div><div class='add'>+                goto err;</div><div class='add'>+            }</div><div class='ctx'> </div><div class='del'>-                if (is_inet_sdp) {</div><div class='del'>-                        ((struct sockaddr *) &amp;this-&gt;peerinfo.sockaddr)-&gt;sa_family = ((struct sockaddr *) &amp;this-&gt;myinfo.sockaddr)-&gt;sa_family = AF_INET_SDP;</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='del'>-        break;</div><div class='add'>+            if (is_inet_sdp) {</div><div class='add'>+                ((struct sockaddr *)&amp;this-&gt;peerinfo.sockaddr)</div><div class='add'>+                    -&gt;sa_family = ((struct sockaddr *)&amp;this-&gt;myinfo.sockaddr)</div><div class='add'>+                                      -&gt;sa_family = AF_INET_SDP;</div><div class='add'>+            }</div><div class='add'>+        } break;</div><div class='ctx'> </div><div class='del'>-        case AF_UNIX:</div><div class='del'>-        {</div><div class='del'>-                struct sockaddr_un *sunaddr = NULL;</div><div class='add'>+        case AF_UNIX: {</div><div class='add'>+            struct sockaddr_un *sunaddr = NULL;</div><div class='ctx'> </div><div class='del'>-                sunaddr = (struct sockaddr_un *) &amp;this-&gt;myinfo.sockaddr;</div><div class='del'>-                strcpy (this-&gt;myinfo.identifier, sunaddr-&gt;sun_path);</div><div class='add'>+            sunaddr = (struct sockaddr_un *)&amp;this-&gt;myinfo.sockaddr;</div><div class='add'>+            strcpy(this-&gt;myinfo.identifier, sunaddr-&gt;sun_path);</div><div class='ctx'> </div><div class='del'>-                sunaddr = (struct sockaddr_un *) &amp;this-&gt;peerinfo.sockaddr;</div><div class='del'>-                strcpy (this-&gt;peerinfo.identifier, sunaddr-&gt;sun_path);</div><div class='del'>-        }</div><div class='del'>-        break;</div><div class='add'>+            sunaddr = (struct sockaddr_un *)&amp;this-&gt;peerinfo.sockaddr;</div><div class='add'>+            strcpy(this-&gt;peerinfo.identifier, sunaddr-&gt;sun_path);</div><div class='add'>+        } break;</div><div class='ctx'> </div><div class='ctx'>         default:</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-                        "unknown address family (%d)",</div><div class='del'>-                        ((struct sockaddr *) &amp;this-&gt;myinfo.sockaddr)-&gt;sa_family);</div><div class='del'>-                ret = -1;</div><div class='del'>-                break;</div><div class='del'>-        }</div><div class='add'>+            gf_log(this-&gt;name, GF_LOG_ERROR, "unknown address family (%d)",</div><div class='add'>+                   ((struct sockaddr *)&amp;this-&gt;myinfo.sockaddr)-&gt;sa_family);</div><div class='add'>+            ret = -1;</div><div class='add'>+            break;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='ctx'> err:</div><div class='del'>-        return ret;</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='head'>diff --git a/rpc/rpc-transport/socket/src/name.h b/rpc/rpc-transport/socket/src/name.h<br/>index 66eccf8d560..080c7588f5a 100644<br/>--- a/<a href='/cgit/glusterfs.git/tree/rpc/rpc-transport/socket/src/name.h?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>rpc/rpc-transport/socket/src/name.h</a><br/>+++ b/<a href='/cgit/glusterfs.git/tree/rpc/rpc-transport/socket/src/name.h?id=d1d7a6f35c816822fab51c820e25023863c239c1'>rpc/rpc-transport/socket/src/name.h</a></div><div class='hunk'>@@ -1,44 +1,33 @@</div><div class='ctx'> /*</div><div class='del'>-  Copyright (c) 2010 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='add'>+  Copyright (c) 2008-2012 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='ctx'>   This file is part of GlusterFS.</div><div class='ctx'> </div><div class='del'>-  GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-  it under the terms of the GNU Affero General Public License as published</div><div class='del'>-  by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-  or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-  GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-  WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-  Affero General Public License for more details.</div><div class='del'>-</div><div class='del'>-  You should have received a copy of the GNU Affero General Public License</div><div class='del'>-  along with this program.  If not, see</div><div class='del'>-  &lt;http://www.gnu.org/licenses/&gt;.</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='ctx'> */</div><div class='ctx'> </div><div class='ctx'> #ifndef _SOCKET_NAME_H</div><div class='ctx'> #define _SOCKET_NAME_H</div><div class='ctx'> </div><div class='del'>-#include "compat.h"</div><div class='add'>+#include &lt;glusterfs/compat.h&gt;</div><div class='ctx'> </div><div class='ctx'> int32_t</div><div class='del'>-client_bind (rpc_transport_t *this,</div><div class='del'>-             struct sockaddr *sockaddr,</div><div class='del'>-             socklen_t *sockaddr_len,</div><div class='del'>-             int sock);</div><div class='add'>+client_bind(rpc_transport_t *this, struct sockaddr *sockaddr,</div><div class='add'>+            socklen_t *sockaddr_len, int sock);</div><div class='ctx'> </div><div class='ctx'> int32_t</div><div class='del'>-socket_client_get_remote_sockaddr (rpc_transport_t *this,</div><div class='del'>-                                   struct sockaddr *sockaddr,</div><div class='del'>-                                   socklen_t *sockaddr_len,</div><div class='del'>-                                   sa_family_t *sa_family);</div><div class='add'>+socket_client_get_remote_sockaddr(rpc_transport_t *this,</div><div class='add'>+                                  struct sockaddr *sockaddr,</div><div class='add'>+                                  socklen_t *sockaddr_len,</div><div class='add'>+                                  sa_family_t *sa_family);</div><div class='ctx'> </div><div class='ctx'> int32_t</div><div class='del'>-socket_server_get_local_sockaddr (rpc_transport_t *this, struct sockaddr *addr,</div><div class='del'>-                                  socklen_t *addr_len, sa_family_t *sa_family);</div><div class='add'>+socket_server_get_local_sockaddr(rpc_transport_t *this, struct sockaddr *addr,</div><div class='add'>+                                 socklen_t *addr_len, sa_family_t *sa_family);</div><div class='ctx'> </div><div class='ctx'> int32_t</div><div class='del'>-get_transport_identifiers (rpc_transport_t *this);</div><div class='add'>+get_transport_identifiers(rpc_transport_t *this);</div><div class='ctx'> </div><div class='ctx'> #endif /* _SOCKET_NAME_H */</div><div class='head'>diff --git a/rpc/rpc-transport/socket/src/socket-mem-types.h b/rpc/rpc-transport/socket/src/socket-mem-types.h<br/>new file mode 100644<br/>index 00000000000..241ce67f670<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/rpc/rpc-transport/socket/src/socket-mem-types.h?id=d1d7a6f35c816822fab51c820e25023863c239c1'>rpc/rpc-transport/socket/src/socket-mem-types.h</a></div><div class='hunk'>@@ -0,0 +1,22 @@</div><div class='add'>+/*</div><div class='add'>+  Copyright (c) 2008-2014 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#ifndef __SOCKET_MEM_TYPES_H__</div><div class='add'>+#define __SOCKET_MEM_TYPES_H__</div><div class='add'>+</div><div class='add'>+#include &lt;glusterfs/mem-types.h&gt;</div><div class='add'>+</div><div class='add'>+typedef enum gf_sock_mem_types_ {</div><div class='add'>+    gf_sock_connect_error_state_t = gf_common_mt_end + 1,</div><div class='add'>+    gf_sock_mt_lock_array,</div><div class='add'>+    gf_sock_mt_end</div><div class='add'>+} gf_sock_mem_types_t;</div><div class='add'>+</div><div class='add'>+#endif</div><div class='head'>diff --git a/rpc/rpc-transport/socket/src/socket.c b/rpc/rpc-transport/socket/src/socket.c<br/>index 9e85c3ca902..ed8b473be23 100644<br/>--- a/<a href='/cgit/glusterfs.git/tree/rpc/rpc-transport/socket/src/socket.c?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>rpc/rpc-transport/socket/src/socket.c</a><br/>+++ b/<a href='/cgit/glusterfs.git/tree/rpc/rpc-transport/socket/src/socket.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>rpc/rpc-transport/socket/src/socket.c</a></div><div class='hunk'>@@ -1,2549 +1,4801 @@</div><div class='ctx'> /*</div><div class='del'>-  Copyright (c) 2010 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='add'>+  Copyright (c) 2008-2012 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='ctx'>   This file is part of GlusterFS.</div><div class='ctx'> </div><div class='del'>-  GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-  it under the terms of the GNU Affero General Public License as published</div><div class='del'>-  by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-  or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-  GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-  WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-  Affero General Public License for more details.</div><div class='del'>-</div><div class='del'>-  You should have received a copy of the GNU Affero General Public License</div><div class='del'>-  along with this program.  If not, see</div><div class='del'>-  &lt;http://www.gnu.org/licenses/&gt;.</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='ctx'> */</div><div class='ctx'> </div><div class='del'>-</div><div class='del'>-#ifndef _CONFIG_H</div><div class='del'>-#define _CONFIG_H</div><div class='del'>-#include "config.h"</div><div class='del'>-#endif</div><div class='del'>-</div><div class='ctx'> #include "socket.h"</div><div class='ctx'> #include "name.h"</div><div class='del'>-#include "dict.h"</div><div class='del'>-#include "rpc-transport.h"</div><div class='del'>-#include "logging.h"</div><div class='del'>-#include "xlator.h"</div><div class='del'>-#include "byte-order.h"</div><div class='del'>-#include "common-utils.h"</div><div class='del'>-#include "compat-errno.h"</div><div class='del'>-</div><div class='add'>+#include &lt;glusterfs/dict.h&gt;</div><div class='add'>+#include &lt;glusterfs/syscall.h&gt;</div><div class='add'>+#include &lt;glusterfs/byte-order.h&gt;</div><div class='add'>+#include &lt;glusterfs/compat-errno.h&gt;</div><div class='add'>+#include "socket-mem-types.h"</div><div class='ctx'> </div><div class='ctx'> /* ugly #includes below */</div><div class='ctx'> #include "protocol-common.h"</div><div class='ctx'> #include "glusterfs3-xdr.h"</div><div class='del'>-#include "glusterfs3.h"</div><div class='add'>+#include "glusterfs4-xdr.h"</div><div class='add'>+#include "rpcsvc.h"</div><div class='ctx'> </div><div class='del'>-#include &lt;fcntl.h&gt;</div><div class='del'>-#include &lt;errno.h&gt;</div><div class='add'>+/* for TCP_USER_TIMEOUT */</div><div class='add'>+#if !defined(TCP_USER_TIMEOUT) &amp;&amp; defined(GF_LINUX_HOST_OS)</div><div class='add'>+#include &lt;linux/tcp.h&gt;</div><div class='add'>+#else</div><div class='ctx'> #include &lt;netinet/tcp.h&gt;</div><div class='del'>-#include &lt;rpc/xdr.h&gt;</div><div class='add'>+#endif</div><div class='ctx'> </div><div class='add'>+#include &lt;errno.h&gt;</div><div class='add'>+#include &lt;rpc/xdr.h&gt;</div><div class='add'>+#include &lt;sys/ioctl.h&gt;</div><div class='ctx'> #define GF_LOG_ERRNO(errno) ((errno == ENOTCONN) ? GF_LOG_DEBUG : GF_LOG_ERROR)</div><div class='ctx'> #define SA(ptr) ((struct sockaddr *)ptr)</div><div class='ctx'> </div><div class='add'>+#define SSL_ENABLED_OPT "transport.socket.ssl-enabled"</div><div class='add'>+#define SSL_OWN_CERT_OPT "transport.socket.ssl-own-cert"</div><div class='add'>+#define SSL_PRIVATE_KEY_OPT "transport.socket.ssl-private-key"</div><div class='add'>+#define SSL_CA_LIST_OPT "transport.socket.ssl-ca-list"</div><div class='add'>+#define SSL_CERT_DEPTH_OPT "transport.socket.ssl-cert-depth"</div><div class='add'>+#define SSL_CIPHER_LIST_OPT "transport.socket.ssl-cipher-list"</div><div class='add'>+#define SSL_DH_PARAM_OPT "transport.socket.ssl-dh-param"</div><div class='add'>+#define SSL_EC_CURVE_OPT "transport.socket.ssl-ec-curve"</div><div class='add'>+#define SSL_CRL_PATH_OPT "transport.socket.ssl-crl-path"</div><div class='add'>+#define OWN_THREAD_OPT "transport.socket.own-thread"</div><div class='add'>+</div><div class='add'>+/* TBD: do automake substitutions etc. (ick) to set these. */</div><div class='add'>+#if !defined(DEFAULT_ETC_SSL)</div><div class='add'>+#ifdef GF_LINUX_HOST_OS</div><div class='add'>+#define DEFAULT_ETC_SSL "/etc/ssl"</div><div class='add'>+#endif</div><div class='add'>+#ifdef GF_BSD_HOST_OS</div><div class='add'>+#define DEFAULT_ETC_SSL "/etc/openssl"</div><div class='add'>+#endif</div><div class='add'>+#ifdef GF_DARWIN_HOST_OS</div><div class='add'>+#define DEFAULT_ETC_SSL "/usr/local/etc/openssl"</div><div class='add'>+#endif</div><div class='add'>+#if !defined(DEFAULT_ETC_SSL)</div><div class='add'>+#define DEFAULT_ETC_SSL "/etc/ssl"</div><div class='add'>+#endif</div><div class='add'>+#endif</div><div class='ctx'> </div><div class='del'>-#define __socket_proto_reset_pending(priv) do {                                \</div><div class='del'>-                                memset (&amp;priv-&gt;incoming.frag.vector, 0,        \</div><div class='del'>-                                        sizeof (priv-&gt;incoming.frag.vector));  \</div><div class='del'>-                                priv-&gt;incoming.frag.pending_vector =           \</div><div class='del'>-                                        &amp;priv-&gt;incoming.frag.vector;           \</div><div class='del'>-                                priv-&gt;incoming.frag.pending_vector-&gt;iov_base = \</div><div class='del'>-                                        priv-&gt;incoming.frag.fragcurrent;       \</div><div class='del'>-                                priv-&gt;incoming.pending_vector =                \</div><div class='del'>-                                        priv-&gt;incoming.frag.pending_vector;    \</div><div class='del'>-        } while (0);</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-#define __socket_proto_update_pending(priv)                                   \</div><div class='del'>-        do {                                                                  \</div><div class='del'>-                uint32_t remaining_fragsize = 0;                              \</div><div class='del'>-                if (priv-&gt;incoming.frag.pending_vector-&gt;iov_len == 0) {       \</div><div class='del'>-                        remaining_fragsize = RPC_FRAGSIZE (priv-&gt;incoming.fraghdr) \</div><div class='del'>-                                - priv-&gt;incoming.frag.bytes_read;             \</div><div class='del'>-                                                                              \</div><div class='del'>-                        priv-&gt;incoming.frag.pending_vector-&gt;iov_len =         \</div><div class='del'>-                                remaining_fragsize &gt; priv-&gt;incoming.frag.remaining_size \</div><div class='del'>-                                ? priv-&gt;incoming.frag.remaining_size : remaining_fragsize; \</div><div class='del'>-                                                                              \</div><div class='del'>-                        priv-&gt;incoming.frag.remaining_size -=                 \</div><div class='del'>-                                priv-&gt;incoming.frag.pending_vector-&gt;iov_len;  \</div><div class='del'>-                }                                                             \</div><div class='del'>-        } while (0);</div><div class='del'>-</div><div class='del'>-#define __socket_proto_update_priv_after_read(priv, ret, bytes_read)          \</div><div class='del'>-        {                                                                     \</div><div class='del'>-                priv-&gt;incoming.frag.fragcurrent += bytes_read;                \</div><div class='del'>-                priv-&gt;incoming.frag.bytes_read += bytes_read;                 \</div><div class='del'>-                                                                              \</div><div class='del'>-                if ((ret &gt; 0) || (priv-&gt;incoming.frag.remaining_size != 0)) { \</div><div class='del'>-                        if (priv-&gt;incoming.frag.remaining_size != 0) {        \</div><div class='del'>-                                __socket_proto_reset_pending (priv);          \</div><div class='del'>-                        }                                                     \</div><div class='del'>-                                                                              \</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_TRACE, "partial read on non-blocking socket"); \</div><div class='del'>-                                                                              \</div><div class='del'>-                        break;                                                \</div><div class='del'>-                }                                                             \</div><div class='del'>-        }</div><div class='add'>+#if !defined(DEFAULT_CERT_PATH)</div><div class='add'>+#define DEFAULT_CERT_PATH DEFAULT_ETC_SSL "/glusterfs.pem"</div><div class='add'>+#endif</div><div class='add'>+#if !defined(DEFAULT_KEY_PATH)</div><div class='add'>+#define DEFAULT_KEY_PATH DEFAULT_ETC_SSL "/glusterfs.key"</div><div class='add'>+#endif</div><div class='add'>+#if !defined(DEFAULT_CA_PATH)</div><div class='add'>+#define DEFAULT_CA_PATH DEFAULT_ETC_SSL "/glusterfs.ca"</div><div class='add'>+#endif</div><div class='add'>+#if !defined(DEFAULT_VERIFY_DEPTH)</div><div class='add'>+#define DEFAULT_VERIFY_DEPTH 1</div><div class='add'>+#endif</div><div class='add'>+#define DEFAULT_CIPHER_LIST "EECDH:EDH:HIGH:!3DES:!RC4:!DES:!MD5:!aNULL:!eNULL"</div><div class='add'>+#define DEFAULT_DH_PARAM DEFAULT_ETC_SSL "/dhparam.pem"</div><div class='add'>+#define DEFAULT_EC_CURVE "prime256v1"</div><div class='add'>+</div><div class='add'>+#define POLL_MASK_INPUT (POLLIN | POLLPRI)</div><div class='add'>+#define POLL_MASK_OUTPUT (POLLOUT)</div><div class='add'>+#define POLL_MASK_ERROR (POLLERR | POLLHUP | POLLNVAL)</div><div class='add'>+</div><div class='add'>+typedef int</div><div class='add'>+SSL_unary_func(SSL *);</div><div class='add'>+typedef int</div><div class='add'>+SSL_trinary_func(SSL *, void *, int);</div><div class='add'>+static int</div><div class='add'>+ssl_setup_connection_params(rpc_transport_t *this);</div><div class='add'>+</div><div class='add'>+#define __socket_proto_reset_pending(priv)                                     \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        struct gf_sock_incoming_frag *frag;                                    \</div><div class='add'>+        frag = &amp;priv-&gt;incoming.frag;                                           \</div><div class='add'>+                                                                               \</div><div class='add'>+        memset(&amp;frag-&gt;vector, 0, sizeof(frag-&gt;vector));                        \</div><div class='add'>+        frag-&gt;pending_vector = &amp;frag-&gt;vector;                                  \</div><div class='add'>+        frag-&gt;pending_vector-&gt;iov_base = frag-&gt;fragcurrent;                    \</div><div class='add'>+        priv-&gt;incoming.pending_vector = frag-&gt;pending_vector;                  \</div><div class='add'>+    } while (0)</div><div class='add'>+</div><div class='add'>+#define __socket_proto_update_pending(priv)                                    \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        uint32_t remaining;                                                    \</div><div class='add'>+        struct gf_sock_incoming_frag *frag;                                    \</div><div class='add'>+        frag = &amp;priv-&gt;incoming.frag;                                           \</div><div class='add'>+        if (frag-&gt;pending_vector-&gt;iov_len == 0) {                              \</div><div class='add'>+            remaining = (RPC_FRAGSIZE(priv-&gt;incoming.fraghdr) -                \</div><div class='add'>+                         frag-&gt;bytes_read);                                    \</div><div class='add'>+                                                                               \</div><div class='add'>+            frag-&gt;pending_vector-&gt;iov_len = (remaining &gt; frag-&gt;remaining_size) \</div><div class='add'>+                                                ? frag-&gt;remaining_size         \</div><div class='add'>+                                                : remaining;                   \</div><div class='add'>+                                                                               \</div><div class='add'>+            frag-&gt;remaining_size -= frag-&gt;pending_vector-&gt;iov_len;             \</div><div class='add'>+        }                                                                      \</div><div class='add'>+    } while (0)</div><div class='add'>+</div><div class='add'>+#define __socket_proto_update_priv_after_read(priv, ret, bytes_read)           \</div><div class='add'>+    {                                                                          \</div><div class='add'>+        struct gf_sock_incoming_frag *frag;                                    \</div><div class='add'>+        frag = &amp;priv-&gt;incoming.frag;                                           \</div><div class='add'>+                                                                               \</div><div class='add'>+        frag-&gt;fragcurrent += bytes_read;                                       \</div><div class='add'>+        frag-&gt;bytes_read += bytes_read;                                        \</div><div class='add'>+                                                                               \</div><div class='add'>+        if ((ret &gt; 0) || (frag-&gt;remaining_size != 0)) {                        \</div><div class='add'>+            if (frag-&gt;remaining_size != 0 &amp;&amp; ret == 0) {                       \</div><div class='add'>+                __socket_proto_reset_pending(priv);                            \</div><div class='add'>+            }                                                                  \</div><div class='add'>+                                                                               \</div><div class='add'>+            gf_log(this-&gt;name, GF_LOG_TRACE,                                   \</div><div class='add'>+                   "partial read on non-blocking socket");                     \</div><div class='add'>+            ret = 0;                                                           \</div><div class='add'>+            break;                                                             \</div><div class='add'>+        }                                                                      \</div><div class='add'>+    }</div><div class='ctx'> </div><div class='ctx'> #define __socket_proto_init_pending(priv, size)                                \</div><div class='del'>-        do {                                                                   \</div><div class='del'>-                uint32_t remaining_fragsize = 0;                               \</div><div class='del'>-                remaining_fragsize = RPC_FRAGSIZE (priv-&gt;incoming.fraghdr)     \</div><div class='del'>-                        - priv-&gt;incoming.frag.bytes_read;                      \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        uint32_t remaining = 0;                                                \</div><div class='add'>+        struct gf_sock_incoming_frag *frag;                                    \</div><div class='add'>+        frag = &amp;priv-&gt;incoming.frag;                                           \</div><div class='ctx'>                                                                                \</div><div class='del'>-                __socket_proto_reset_pending (priv);                           \</div><div class='add'>+        remaining = (RPC_FRAGSIZE(priv-&gt;incoming.fraghdr) - frag-&gt;bytes_read); \</div><div class='ctx'>                                                                                \</div><div class='del'>-                priv-&gt;incoming.frag.pending_vector-&gt;iov_len =                  \</div><div class='del'>-                        remaining_fragsize &gt; size ? size : remaining_fragsize; \</div><div class='add'>+        __socket_proto_reset_pending(priv);                                    \</div><div class='ctx'>                                                                                \</div><div class='del'>-                priv-&gt;incoming.frag.remaining_size =                           \</div><div class='del'>-                        size - priv-&gt;incoming.frag.pending_vector-&gt;iov_len;    \</div><div class='add'>+        frag-&gt;pending_vector-&gt;iov_len = (remaining &gt; size) ? size : remaining; \</div><div class='ctx'>                                                                                \</div><div class='del'>-} while (0);</div><div class='del'>-</div><div class='add'>+        frag-&gt;remaining_size = (size - frag-&gt;pending_vector-&gt;iov_len);         \</div><div class='add'>+                                                                               \</div><div class='add'>+    } while (0)</div><div class='ctx'> </div><div class='ctx'> /* This will be used in a switch case and breaks from the switch case if all</div><div class='ctx'>  * the pending data is not read.</div><div class='ctx'>  */</div><div class='ctx'> #define __socket_proto_read(priv, ret)                                         \</div><div class='del'>-        {                                                                      \</div><div class='del'>-                size_t bytes_read = 0;                                         \</div><div class='add'>+    {                                                                          \</div><div class='add'>+        size_t bytes_read = 0;                                                 \</div><div class='add'>+        struct gf_sock_incoming *in;                                           \</div><div class='add'>+        in = &amp;priv-&gt;incoming;                                                  \</div><div class='ctx'>                                                                                \</div><div class='del'>-                __socket_proto_update_pending (priv);                          \</div><div class='add'>+        __socket_proto_update_pending(priv);                                   \</div><div class='ctx'>                                                                                \</div><div class='del'>-                ret = __socket_readv (this,                                    \</div><div class='del'>-                                      priv-&gt;incoming.pending_vector, 1,        \</div><div class='del'>-                                      &amp;priv-&gt;incoming.pending_vector,          \</div><div class='del'>-                                      &amp;priv-&gt;incoming.pending_count,           \</div><div class='del'>-                                      &amp;bytes_read);                            \</div><div class='del'>-                if (ret == -1) {                                               \</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_TRACE,                      \</div><div class='del'>-                                "reading from socket failed. Error (%s), "     \</div><div class='del'>-                                "peer (%s)", strerror (errno),                 \</div><div class='del'>-                                 this-&gt;peerinfo.identifier);                   \</div><div class='del'>-                        break;                                                 \</div><div class='del'>-                }                                                              \</div><div class='del'>-                __socket_proto_update_priv_after_read (priv, ret, bytes_read); \</div><div class='del'>-         }</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int socket_init (rpc_transport_t *this);</div><div class='add'>+        ret = __socket_readv(this, in-&gt;pending_vector, 1, &amp;in-&gt;pending_vector, \</div><div class='add'>+                             &amp;in-&gt;pending_count, &amp;bytes_read);                 \</div><div class='add'>+        if (ret &lt; 0)                                                           \</div><div class='add'>+            break;                                                             \</div><div class='add'>+        __socket_proto_update_priv_after_read(priv, ret, bytes_read);          \</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+struct socket_connect_error_state_ {</div><div class='add'>+    xlator_t *this;</div><div class='add'>+    rpc_transport_t *trans;</div><div class='add'>+    gf_boolean_t refd;</div><div class='add'>+};</div><div class='add'>+typedef struct socket_connect_error_state_ socket_connect_error_state_t;</div><div class='ctx'> </div><div class='del'>-/*</div><div class='del'>- * return value:</div><div class='del'>- *   0 = success (completed)</div><div class='del'>- *  -1 = error</div><div class='del'>- * &gt; 0 = incomplete</div><div class='del'>- */</div><div class='add'>+static int</div><div class='add'>+socket_init(rpc_transport_t *this);</div><div class='add'>+static int</div><div class='add'>+__socket_nonblock(int fd);</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-__socket_rwv (rpc_transport_t *this, struct iovec *vector, int count,</div><div class='del'>-              struct iovec **pending_vector, int *pending_count, size_t *bytes,</div><div class='del'>-              int write)</div><div class='del'>-{</div><div class='del'>-        socket_private_t *priv = NULL;</div><div class='del'>-        int               sock = -1;</div><div class='del'>-        int               ret = -1;</div><div class='del'>-        struct iovec     *opvector = NULL;</div><div class='del'>-        int               opcount = 0;</div><div class='del'>-        int               moved = 0;</div><div class='del'>-</div><div class='del'>-        if (!this || !this-&gt;private)</div><div class='del'>-                goto out;</div><div class='add'>+static void</div><div class='add'>+socket_dump_info(struct sockaddr *sa, int is_server, int is_ssl, int sock,</div><div class='add'>+                 char *log_domain, char *log_label)</div><div class='add'>+{</div><div class='add'>+    char addr_buf[INET6_ADDRSTRLEN + 1] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    char *addr = NULL;</div><div class='add'>+    const char *peer_type = NULL;</div><div class='add'>+    int af = sa-&gt;sa_family;</div><div class='add'>+    int so_error = -1;</div><div class='add'>+    socklen_t slen = sizeof(so_error);</div><div class='add'>+</div><div class='add'>+    if (af == AF_UNIX) {</div><div class='add'>+        addr = ((struct sockaddr_un *)(sa))-&gt;sun_path;</div><div class='add'>+    } else {</div><div class='add'>+        if (af == AF_INET6) {</div><div class='add'>+            struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *)(sa);</div><div class='add'>+</div><div class='add'>+            inet_ntop(af, &amp;sin6-&gt;sin6_addr, addr_buf, sizeof(addr_buf));</div><div class='add'>+            addr = addr_buf;</div><div class='add'>+        } else {</div><div class='add'>+            struct sockaddr_in *sin = (struct sockaddr_in *)(sa);</div><div class='ctx'> </div><div class='del'>-        priv = this-&gt;private;</div><div class='del'>-        sock = priv-&gt;sock;</div><div class='add'>+            inet_ntop(af, &amp;sin-&gt;sin_addr, addr_buf, sizeof(addr_buf));</div><div class='add'>+            addr = addr_buf;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    if (is_server)</div><div class='add'>+        peer_type = "server";</div><div class='add'>+    else</div><div class='add'>+        peer_type = "client";</div><div class='add'>+</div><div class='add'>+    (void)getsockopt(sock, SOL_SOCKET, SO_ERROR, &amp;so_error, &amp;slen);</div><div class='add'>+</div><div class='add'>+    gf_log(log_domain, GF_LOG_TRACE,</div><div class='add'>+           "$$$ %s: %s (af:%d,sock:%d) %s %s (errno:%d:%s)", peer_type,</div><div class='add'>+           log_label, af, sock, addr, (is_ssl ? "SSL" : "non-SSL"), so_error,</div><div class='add'>+           strerror(so_error));</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	opvector = vector;</div><div class='del'>-	opcount  = count;</div><div class='add'>+static void</div><div class='add'>+ssl_dump_error_stack(const char *caller)</div><div class='add'>+{</div><div class='add'>+    unsigned long errnum = 0;</div><div class='add'>+    char errbuf[120] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='ctx'> </div><div class='del'>-        if (bytes != NULL) {</div><div class='del'>-                *bytes = 0;</div><div class='add'>+    /* OpenSSL docs explicitly give 120 as the error-string length. */</div><div class='add'>+</div><div class='add'>+    while ((errnum = ERR_get_error())) {</div><div class='add'>+        ERR_error_string(errnum, errbuf);</div><div class='add'>+        gf_log(caller, GF_LOG_ERROR, "  %s", errbuf);</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+ssl_do(rpc_transport_t *this, void *buf, size_t len, SSL_trinary_func *func)</div><div class='add'>+{</div><div class='add'>+    int r = (-1);</div><div class='add'>+    socket_private_t *priv = NULL;</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    if (buf) {</div><div class='add'>+        if (priv-&gt;connected == -1) {</div><div class='add'>+            /*</div><div class='add'>+             * Fields in the SSL structure (especially</div><div class='add'>+             * the BIO pointers) are not valid at this</div><div class='add'>+             * point, so we'll segfault if we pass them</div><div class='add'>+             * to SSL_read/SSL_write.</div><div class='add'>+             */</div><div class='add'>+            gf_log(this-&gt;name, GF_LOG_INFO, "lost connection in %s", __func__);</div><div class='add'>+            return -1;</div><div class='ctx'>         }</div><div class='add'>+        r = func(priv-&gt;ssl_ssl, buf, len);</div><div class='add'>+    } else {</div><div class='add'>+        /* This should be treated as error */</div><div class='add'>+        gf_log(this-&gt;name, GF_LOG_ERROR, "buffer is empty %s", __func__);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    switch (SSL_get_error(priv-&gt;ssl_ssl, r)) {</div><div class='add'>+        case SSL_ERROR_NONE:</div><div class='add'>+        /* fall through */</div><div class='add'>+        case SSL_ERROR_WANT_READ:</div><div class='add'>+        /* fall through */</div><div class='add'>+        case SSL_ERROR_WANT_WRITE:</div><div class='add'>+            errno = EAGAIN;</div><div class='add'>+            return r;</div><div class='add'>+</div><div class='add'>+        case SSL_ERROR_SYSCALL:</div><div class='add'>+            /* Sometimes SSL_ERROR_SYSCALL returns errno as</div><div class='add'>+             * EAGAIN. In such a case we should reattempt operation</div><div class='add'>+             * So, for now, just return the return value and the</div><div class='add'>+             * errno as is.</div><div class='add'>+             */</div><div class='add'>+            gf_log(this-&gt;name, GF_LOG_DEBUG,</div><div class='add'>+                   "syscall error (probably remote disconnect) "</div><div class='add'>+                   "errno:%d:%s",</div><div class='add'>+                   errno, strerror(errno));</div><div class='add'>+            return r;</div><div class='add'>+        default:</div><div class='add'>+            errno = EIO;</div><div class='add'>+            goto out; /* "break" would just loop again */</div><div class='add'>+    }</div><div class='add'>+out:</div><div class='add'>+    return -1;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        while (opcount) {</div><div class='del'>-                if (write) {</div><div class='del'>-                        ret = writev (sock, opvector, opcount);</div><div class='add'>+#define ssl_read_one(t, b, l)                                                  \</div><div class='add'>+    ssl_do((t), (b), (l), (SSL_trinary_func *)SSL_read)</div><div class='add'>+#define ssl_write_one(t, b, l)                                                 \</div><div class='add'>+    ssl_do((t), (b), (l), (SSL_trinary_func *)SSL_write)</div><div class='add'>+</div><div class='add'>+/* set crl verify flags only for server */</div><div class='add'>+/* see man X509_VERIFY_PARAM_SET_FLAGS(3)</div><div class='add'>+ * X509_V_FLAG_CRL_CHECK enables CRL checking for the certificate chain</div><div class='add'>+ * leaf certificate. An error occurs if a suitable CRL cannot be found.</div><div class='add'>+ * Since we're never going to revoke a gluster node cert, we better disable</div><div class='add'>+ * CRL check for server certs to avoid getting error and failed connection</div><div class='add'>+ * attempts.</div><div class='add'>+ */</div><div class='add'>+static void</div><div class='add'>+ssl_clear_crl_verify_flags(SSL_CTX *ssl_ctx)</div><div class='add'>+{</div><div class='add'>+#ifdef X509_V_FLAG_CRL_CHECK_ALL</div><div class='add'>+#ifdef HAVE_SSL_CTX_GET0_PARAM</div><div class='add'>+    X509_VERIFY_PARAM *vpm;</div><div class='add'>+</div><div class='add'>+    vpm = SSL_CTX_get0_param(ssl_ctx);</div><div class='add'>+    if (vpm) {</div><div class='add'>+        X509_VERIFY_PARAM_clear_flags(</div><div class='add'>+            vpm, (X509_V_FLAG_CRL_CHECK | X509_V_FLAG_CRL_CHECK_ALL));</div><div class='add'>+    }</div><div class='add'>+#else</div><div class='add'>+    /* CRL verify flag need not be cleared for rhel6 kind of clients */</div><div class='add'>+#endif</div><div class='add'>+#else</div><div class='add'>+    gf_log(this-&gt;name, GF_LOG_ERROR, "OpenSSL version does not support CRL");</div><div class='add'>+#endif</div><div class='add'>+    return;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-                        if (ret == 0 || (ret == -1 &amp;&amp; errno == EAGAIN)) {</div><div class='del'>-                                /* done for now */</div><div class='del'>-                                break;</div><div class='del'>-                        }</div><div class='del'>-                } else {</div><div class='del'>-                        ret = readv (sock, opvector, opcount);</div><div class='del'>-                        if (ret == -1 &amp;&amp; errno == EAGAIN) {</div><div class='del'>-                                /* done for now */</div><div class='del'>-                                break;</div><div class='del'>-                        }</div><div class='del'>-                }</div><div class='add'>+/* set crl verify flags only for server */</div><div class='add'>+static void</div><div class='add'>+ssl_set_crl_verify_flags(SSL_CTX *ssl_ctx)</div><div class='add'>+{</div><div class='add'>+#ifdef X509_V_FLAG_CRL_CHECK_ALL</div><div class='add'>+#ifdef HAVE_SSL_CTX_GET0_PARAM</div><div class='add'>+    X509_VERIFY_PARAM *vpm;</div><div class='add'>+</div><div class='add'>+    vpm = SSL_CTX_get0_param(ssl_ctx);</div><div class='add'>+    if (vpm) {</div><div class='add'>+        unsigned long flags;</div><div class='add'>+</div><div class='add'>+        flags = X509_VERIFY_PARAM_get_flags(vpm);</div><div class='add'>+        flags |= (X509_V_FLAG_CRL_CHECK | X509_V_FLAG_CRL_CHECK_ALL);</div><div class='add'>+        X509_VERIFY_PARAM_set_flags(vpm, flags);</div><div class='add'>+    }</div><div class='add'>+#else</div><div class='add'>+    X509_STORE *x509store;</div><div class='add'>+</div><div class='add'>+    x509store = SSL_CTX_get_cert_store(ssl_ctx);</div><div class='add'>+    X509_STORE_set_flags(x509store,</div><div class='add'>+                         X509_V_FLAG_CRL_CHECK | X509_V_FLAG_CRL_CHECK_ALL);</div><div class='add'>+#endif</div><div class='add'>+#else</div><div class='add'>+    gf_log(this-&gt;name, GF_LOG_ERROR, "OpenSSL version does not support CRL");</div><div class='add'>+#endif</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-                if (ret == 0) {</div><div class='del'>-                        /* Mostly due to 'umount' in client */</div><div class='add'>+static int</div><div class='add'>+ssl_setup_connection_prefix(rpc_transport_t *this, gf_boolean_t server)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    socket_private_t *priv = NULL;</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    if (ssl_setup_connection_params(this) &lt; 0) {</div><div class='add'>+        gf_log(this-&gt;name, GF_LOG_TRACE,</div><div class='add'>+               "+ ssl_setup_connection_params() failed!");</div><div class='add'>+        goto done;</div><div class='add'>+    } else {</div><div class='add'>+        gf_log(this-&gt;name, GF_LOG_TRACE,</div><div class='add'>+               "+ ssl_setup_connection_params() done!");</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    priv-&gt;ssl_error_required = SSL_ERROR_NONE;</div><div class='add'>+    priv-&gt;ssl_connected = _gf_false;</div><div class='add'>+    priv-&gt;ssl_accepted = _gf_false;</div><div class='add'>+    priv-&gt;ssl_context_created = _gf_false;</div><div class='add'>+</div><div class='add'>+    if (!server &amp;&amp; priv-&gt;crl_path)</div><div class='add'>+        ssl_clear_crl_verify_flags(priv-&gt;ssl_ctx);</div><div class='add'>+</div><div class='add'>+    priv-&gt;ssl_ssl = SSL_new(priv-&gt;ssl_ctx);</div><div class='add'>+    if (!priv-&gt;ssl_ssl) {</div><div class='add'>+        gf_log(this-&gt;name, GF_LOG_ERROR, "SSL_new failed");</div><div class='add'>+        ssl_dump_error_stack(this-&gt;name);</div><div class='add'>+        goto done;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    priv-&gt;ssl_sbio = BIO_new_socket(priv-&gt;sock, BIO_NOCLOSE);</div><div class='add'>+    if (!priv-&gt;ssl_sbio) {</div><div class='add'>+        gf_log(this-&gt;name, GF_LOG_ERROR, "BIO_new_socket failed");</div><div class='add'>+        ssl_dump_error_stack(this-&gt;name);</div><div class='add'>+        goto free_ssl;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    SSL_set_bio(priv-&gt;ssl_ssl, priv-&gt;ssl_sbio, priv-&gt;ssl_sbio);</div><div class='add'>+    ret = 0;</div><div class='add'>+    goto done;</div><div class='add'>+</div><div class='add'>+free_ssl:</div><div class='add'>+    SSL_free(priv-&gt;ssl_ssl);</div><div class='add'>+    priv-&gt;ssl_ssl = NULL;</div><div class='add'>+done:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_TRACE,</div><div class='del'>-                                "EOF from peer %s", this-&gt;peerinfo.identifier);</div><div class='del'>-                        opcount = -1;</div><div class='del'>-                        errno = ENOTCONN;</div><div class='del'>-                        break;</div><div class='del'>-                }</div><div class='del'>-                if (ret == -1) {</div><div class='del'>-                        if (errno == EINTR)</div><div class='del'>-                                continue;</div><div class='del'>-</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_TRACE,</div><div class='del'>-                                "%s failed (%s)", write ? "writev" : "readv",</div><div class='del'>-                                strerror (errno));</div><div class='del'>-                        opcount = -1;</div><div class='del'>-                        break;</div><div class='del'>-                }</div><div class='add'>+static char *</div><div class='add'>+ssl_setup_connection_postfix(rpc_transport_t *this)</div><div class='add'>+{</div><div class='add'>+    X509 *peer = NULL;</div><div class='add'>+    char peer_CN[256] = "";</div><div class='add'>+    socket_private_t *priv = NULL;</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    /* Make sure _SSL verification_ succeeded, yielding an identity. */</div><div class='add'>+    if (SSL_get_verify_result(priv-&gt;ssl_ssl) != X509_V_OK) {</div><div class='add'>+        goto ssl_error;</div><div class='add'>+    }</div><div class='add'>+    peer = SSL_get_peer_certificate(priv-&gt;ssl_ssl);</div><div class='add'>+    if (!peer) {</div><div class='add'>+        goto ssl_error;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    SSL_set_mode(priv-&gt;ssl_ssl, SSL_MODE_ENABLE_PARTIAL_WRITE);</div><div class='add'>+</div><div class='add'>+    /* Finally, everything seems OK. */</div><div class='add'>+    X509_NAME_get_text_by_NID(X509_get_subject_name(peer), NID_commonName,</div><div class='add'>+                              peer_CN, sizeof(peer_CN) - 1);</div><div class='add'>+    peer_CN[sizeof(peer_CN) - 1] = '\0';</div><div class='add'>+    gf_log(this-&gt;name, GF_LOG_DEBUG, "peer CN = %s", peer_CN);</div><div class='add'>+    gf_log(this-&gt;name, GF_LOG_DEBUG,</div><div class='add'>+           "SSL verification succeeded (client: %s) (server: %s)",</div><div class='add'>+           this-&gt;peerinfo.identifier, this-&gt;myinfo.identifier);</div><div class='add'>+    X509_free(peer);</div><div class='add'>+    return gf_strdup(peer_CN);</div><div class='add'>+</div><div class='add'>+    /* Error paths. */</div><div class='add'>+ssl_error:</div><div class='add'>+    gf_log(this-&gt;name, GF_LOG_ERROR,</div><div class='add'>+           "SSL connect error (client: %s) (server: %s)",</div><div class='add'>+           this-&gt;peerinfo.identifier, this-&gt;myinfo.identifier);</div><div class='add'>+    ssl_dump_error_stack(this-&gt;name);</div><div class='add'>+</div><div class='add'>+    SSL_free(priv-&gt;ssl_ssl);</div><div class='add'>+    priv-&gt;ssl_ssl = NULL;</div><div class='add'>+    return NULL;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-                if (bytes != NULL) {</div><div class='del'>-                        *bytes += ret;</div><div class='add'>+static int</div><div class='add'>+ssl_complete_connection(rpc_transport_t *this)</div><div class='add'>+{</div><div class='add'>+    int ret = -1; /*  1 : implies go back to epoll_wait()</div><div class='add'>+                   *  0 : implies successful ssl connection</div><div class='add'>+                   * -1: implies continue processing current event</div><div class='add'>+                   *     as if EPOLLERR has been encountered</div><div class='add'>+                   */</div><div class='add'>+    char *cname = NULL;</div><div class='add'>+    int r = -1;</div><div class='add'>+    int ssl_error = -1;</div><div class='add'>+    socket_private_t *priv = NULL;</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    if (priv-&gt;is_server) {</div><div class='add'>+        r = SSL_accept(priv-&gt;ssl_ssl);</div><div class='add'>+    } else {</div><div class='add'>+        r = SSL_connect(priv-&gt;ssl_ssl);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ssl_error = SSL_get_error(priv-&gt;ssl_ssl, r);</div><div class='add'>+    priv-&gt;ssl_error_required = ssl_error;</div><div class='add'>+</div><div class='add'>+    switch (ssl_error) {</div><div class='add'>+        case SSL_ERROR_NONE:</div><div class='add'>+            cname = ssl_setup_connection_postfix(this);</div><div class='add'>+            if (!cname) {</div><div class='add'>+                /* we've failed to get the cname so</div><div class='add'>+                 * we must close the connection</div><div class='add'>+                 *</div><div class='add'>+                 * treat this as EPOLLERR</div><div class='add'>+                 */</div><div class='add'>+                gf_log(this-&gt;name, GF_LOG_TRACE, "error getting cname");</div><div class='add'>+                errno = ECONNRESET;</div><div class='add'>+                ret = -1;</div><div class='add'>+            } else {</div><div class='add'>+                this-&gt;ssl_name = cname;</div><div class='add'>+                if (priv-&gt;is_server) {</div><div class='add'>+                    priv-&gt;ssl_accepted = _gf_true;</div><div class='add'>+                    gf_log(this-&gt;name, GF_LOG_TRACE, "ssl_accepted!");</div><div class='add'>+                } else {</div><div class='add'>+                    priv-&gt;ssl_connected = _gf_true;</div><div class='add'>+                    gf_log(this-&gt;name, GF_LOG_TRACE, "ssl_connected!");</div><div class='ctx'>                 }</div><div class='add'>+                ret = 0;</div><div class='add'>+            }</div><div class='add'>+            break;</div><div class='add'>+</div><div class='add'>+        case SSL_ERROR_WANT_READ:</div><div class='add'>+        /* fall through */</div><div class='add'>+        case SSL_ERROR_WANT_WRITE:</div><div class='add'>+            errno = EAGAIN;</div><div class='add'>+            break;</div><div class='add'>+</div><div class='add'>+        case SSL_ERROR_SYSCALL:</div><div class='add'>+            /* Sometimes SSL_ERROR_SYSCALL returns with errno as EAGAIN</div><div class='add'>+             * So, we should retry the operation.</div><div class='add'>+             * So, for now, we just return the return value and errno as is.</div><div class='add'>+             */</div><div class='add'>+            break;</div><div class='add'>+</div><div class='add'>+        case SSL_ERROR_SSL:</div><div class='add'>+            /* treat this as EPOLLERR */</div><div class='add'>+            ret = -1;</div><div class='add'>+            break;</div><div class='add'>+</div><div class='add'>+        default:</div><div class='add'>+            /* treat this as EPOLLERR */</div><div class='add'>+            errno = EIO;</div><div class='add'>+            ret = -1;</div><div class='add'>+            break;</div><div class='add'>+    }</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-                moved = 0;</div><div class='del'>-</div><div class='del'>-                while (moved &lt; ret) {</div><div class='del'>-                        if ((ret - moved) &gt;= opvector[0].iov_len) {</div><div class='del'>-                                moved += opvector[0].iov_len;</div><div class='del'>-                                opvector++;</div><div class='del'>-                                opcount--;</div><div class='del'>-                        } else {</div><div class='del'>-                                opvector[0].iov_len -= (ret - moved);</div><div class='del'>-                                opvector[0].iov_base += (ret - moved);</div><div class='del'>-                                moved += (ret - moved);</div><div class='del'>-                        }</div><div class='del'>-                        while (opcount &amp;&amp; !opvector[0].iov_len) {</div><div class='del'>-                                opvector++;</div><div class='del'>-                                opcount--;</div><div class='del'>-                        }</div><div class='del'>-                }</div><div class='add'>+static void</div><div class='add'>+ssl_teardown_connection(socket_private_t *priv)</div><div class='add'>+{</div><div class='add'>+    if (priv-&gt;ssl_ssl) {</div><div class='add'>+        SSL_shutdown(priv-&gt;ssl_ssl);</div><div class='add'>+        SSL_clear(priv-&gt;ssl_ssl);</div><div class='add'>+        SSL_free(priv-&gt;ssl_ssl);</div><div class='add'>+        SSL_CTX_free(priv-&gt;ssl_ctx);</div><div class='add'>+        priv-&gt;ssl_ssl = NULL;</div><div class='add'>+        priv-&gt;ssl_ctx = NULL;</div><div class='add'>+        if (priv-&gt;ssl_private_key) {</div><div class='add'>+            GF_FREE(priv-&gt;ssl_private_key);</div><div class='add'>+            priv-&gt;ssl_private_key = NULL;</div><div class='ctx'>         }</div><div class='del'>-</div><div class='del'>-        if (pending_vector)</div><div class='del'>-                *pending_vector = opvector;</div><div class='del'>-</div><div class='del'>-        if (pending_count)</div><div class='del'>-                *pending_count = opcount;</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        return opcount;</div><div class='add'>+        if (priv-&gt;ssl_own_cert) {</div><div class='add'>+            GF_FREE(priv-&gt;ssl_own_cert);</div><div class='add'>+            priv-&gt;ssl_own_cert = NULL;</div><div class='add'>+        }</div><div class='add'>+        if (priv-&gt;ssl_ca_list) {</div><div class='add'>+            GF_FREE(priv-&gt;ssl_ca_list);</div><div class='add'>+            priv-&gt;ssl_ca_list = NULL;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    priv-&gt;use_ssl = _gf_false;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+static ssize_t</div><div class='add'>+__socket_ssl_readv(rpc_transport_t *this, struct iovec *opvector, int opcount)</div><div class='add'>+{</div><div class='add'>+    socket_private_t *priv = NULL;</div><div class='add'>+    int sock = -1;</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+    sock = priv-&gt;sock;</div><div class='add'>+</div><div class='add'>+    if (priv-&gt;use_ssl) {</div><div class='add'>+        gf_log(this-&gt;name, GF_LOG_TRACE, "***** reading over SSL");</div><div class='add'>+        ret = ssl_read_one(this, opvector-&gt;iov_base, opvector-&gt;iov_len);</div><div class='add'>+    } else {</div><div class='add'>+        gf_log(this-&gt;name, GF_LOG_TRACE, "***** reading over non-SSL");</div><div class='add'>+        ret = sys_readv(sock, opvector, IOV_MIN(opcount));</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-__socket_readv (rpc_transport_t *this, struct iovec *vector, int count,</div><div class='del'>-                struct iovec **pending_vector, int *pending_count,</div><div class='del'>-                size_t *bytes)</div><div class='add'>+static ssize_t</div><div class='add'>+__socket_ssl_read(rpc_transport_t *this, void *buf, size_t count)</div><div class='ctx'> {</div><div class='del'>-        int ret = -1;</div><div class='add'>+    struct iovec iov = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int ret = -1;</div><div class='ctx'> </div><div class='del'>-        ret = __socket_rwv (this, vector, count,</div><div class='del'>-			    pending_vector, pending_count, bytes, 0);</div><div class='add'>+    iov.iov_base = buf;</div><div class='add'>+    iov.iov_len = count;</div><div class='ctx'> </div><div class='del'>-        return ret;</div><div class='add'>+    ret = __socket_ssl_readv(this, &amp;iov, 1);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+static int</div><div class='add'>+__socket_cached_read(rpc_transport_t *this, struct iovec *opvector, int opcount)</div><div class='add'>+{</div><div class='add'>+    socket_private_t *priv = NULL;</div><div class='add'>+    struct gf_sock_incoming *in = NULL;</div><div class='add'>+    int req_len = -1;</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+    in = &amp;priv-&gt;incoming;</div><div class='add'>+    req_len = iov_length(opvector, opcount);</div><div class='add'>+</div><div class='add'>+    if (in-&gt;record_state == SP_STATE_READING_FRAGHDR) {</div><div class='add'>+        in-&gt;ra_read = 0;</div><div class='add'>+        in-&gt;ra_served = 0;</div><div class='add'>+        in-&gt;ra_max = 0;</div><div class='add'>+        in-&gt;ra_buf = NULL;</div><div class='add'>+        goto uncached;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (!in-&gt;ra_max) {</div><div class='add'>+        /* first call after passing SP_STATE_READING_FRAGHDR */</div><div class='add'>+        in-&gt;ra_max = min(RPC_FRAGSIZE(in-&gt;fraghdr), GF_SOCKET_RA_MAX);</div><div class='add'>+        /* Note that the in-&gt;iobuf is the primary iobuf into which</div><div class='add'>+           headers are read into, and in-&gt;frag.fragcurrent points to</div><div class='add'>+           some position in the buffer. By using this itself as our</div><div class='add'>+           read-ahead cache, we can avoid memory copies in iov_load</div><div class='add'>+        */</div><div class='add'>+        in-&gt;ra_buf = in-&gt;frag.fragcurrent;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* fill read-ahead */</div><div class='add'>+    if (in-&gt;ra_read &lt; in-&gt;ra_max) {</div><div class='add'>+        ret = __socket_ssl_read(this, &amp;in-&gt;ra_buf[in-&gt;ra_read],</div><div class='add'>+                                (in-&gt;ra_max - in-&gt;ra_read));</div><div class='add'>+        if (ret &gt; 0)</div><div class='add'>+            in-&gt;ra_read += ret;</div><div class='add'>+</div><div class='add'>+        /* we proceed to test if there is still cached data to</div><div class='add'>+           be served even if readahead could not progress */</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* serve cached */</div><div class='add'>+    if (in-&gt;ra_served &lt; in-&gt;ra_read) {</div><div class='add'>+        ret = iov_load(opvector, opcount, &amp;in-&gt;ra_buf[in-&gt;ra_served],</div><div class='add'>+                       min(req_len, (in-&gt;ra_read - in-&gt;ra_served)));</div><div class='add'>+</div><div class='add'>+        in-&gt;ra_served += ret;</div><div class='add'>+        /* Do not read uncached and cached in the same call */</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (in-&gt;ra_read &lt; in-&gt;ra_max)</div><div class='add'>+        /* If there was no cached data to be served, (and we are</div><div class='add'>+           guaranteed to have already performed an attempt to progress</div><div class='add'>+           readahead above), and we have not yet read out the full</div><div class='add'>+           readahead capacity, then bail out for now without doing</div><div class='add'>+           the uncached read below (as that will overtake future cached</div><div class='add'>+           read)</div><div class='add'>+        */</div><div class='add'>+        goto out;</div><div class='add'>+uncached:</div><div class='add'>+    ret = __socket_ssl_readv(this, opvector, opcount);</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-__socket_writev (rpc_transport_t *this, struct iovec *vector, int count,</div><div class='del'>-                 struct iovec **pending_vector, int *pending_count)</div><div class='add'>+static gf_boolean_t</div><div class='add'>+__does_socket_rwv_error_need_logging(socket_private_t *priv, int write)</div><div class='ctx'> {</div><div class='del'>-        int ret = -1;</div><div class='add'>+    int read = !write;</div><div class='ctx'> </div><div class='del'>-        ret = __socket_rwv (this, vector, count,</div><div class='del'>-			    pending_vector, pending_count, NULL, 1);</div><div class='add'>+    if (priv-&gt;connected == -1) /* Didn't even connect, of course it fails */</div><div class='add'>+        return _gf_false;</div><div class='ctx'> </div><div class='del'>-        return ret;</div><div class='add'>+    if (read &amp;&amp; (priv-&gt;read_fail_log == _gf_false))</div><div class='add'>+        return _gf_false;</div><div class='add'>+</div><div class='add'>+    return _gf_true;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+/*</div><div class='add'>+ * return value:</div><div class='add'>+ *   0 = success (completed)</div><div class='add'>+ *  -1 = error</div><div class='add'>+ * &gt; 0 = incomplete</div><div class='add'>+ */</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-__socket_disconnect (rpc_transport_t *this)</div><div class='add'>+static int</div><div class='add'>+__socket_rwv(rpc_transport_t *this, struct iovec *vector, int count,</div><div class='add'>+             struct iovec **pending_vector, int *pending_count, size_t *bytes,</div><div class='add'>+             int write)</div><div class='ctx'> {</div><div class='del'>-        socket_private_t *priv = NULL;</div><div class='del'>-        int               ret = -1;</div><div class='add'>+    socket_private_t *priv = NULL;</div><div class='add'>+    int sock = -1;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    struct iovec *opvector = NULL;</div><div class='add'>+    int opcount = 0;</div><div class='add'>+    int moved = 0;</div><div class='add'>+</div><div class='add'>+    GF_VALIDATE_OR_GOTO("socket", this-&gt;private, out);</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+    sock = priv-&gt;sock;</div><div class='add'>+</div><div class='add'>+    opvector = vector;</div><div class='add'>+    opcount = count;</div><div class='add'>+</div><div class='add'>+    if (bytes != NULL) {</div><div class='add'>+        *bytes = 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    while (opcount &gt; 0) {</div><div class='add'>+        if (opvector-&gt;iov_len == 0) {</div><div class='add'>+            gf_log(this-&gt;name, GF_LOG_DEBUG,</div><div class='add'>+                   "would have passed zero length to read/write");</div><div class='add'>+            ++opvector;</div><div class='add'>+            --opcount;</div><div class='add'>+            continue;</div><div class='add'>+        }</div><div class='add'>+        if (priv-&gt;use_ssl &amp;&amp; !priv-&gt;ssl_ssl) {</div><div class='add'>+            /*</div><div class='add'>+             * We could end up here with priv-&gt;ssl_ssl still NULL</div><div class='add'>+             * if (a) the connection failed and (b) some fool</div><div class='add'>+             * called other socket functions anyway.  Demoting to</div><div class='add'>+             * non-SSL might be insecure, so just fail it outright.</div><div class='add'>+             */</div><div class='add'>+            ret = -1;</div><div class='add'>+            gf_log(this-&gt;name, GF_LOG_TRACE,</div><div class='add'>+                   "### no priv-&gt;ssl_ssl yet; ret = -1;");</div><div class='add'>+        } else if (write) {</div><div class='add'>+            if (priv-&gt;use_ssl) {</div><div class='add'>+                ret = ssl_write_one(this, opvector-&gt;iov_base,</div><div class='add'>+                                    opvector-&gt;iov_len);</div><div class='add'>+            } else {</div><div class='add'>+                ret = sys_writev(sock, opvector, IOV_MIN(opcount));</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            if ((ret == 0) || ((ret &lt; 0) &amp;&amp; (errno == EAGAIN))) {</div><div class='add'>+                /* done for now */</div><div class='add'>+                break;</div><div class='add'>+            } else if (ret &gt; 0)</div><div class='add'>+                this-&gt;total_bytes_write += ret;</div><div class='add'>+        } else {</div><div class='add'>+            ret = __socket_cached_read(this, opvector, opcount);</div><div class='add'>+            if (ret == 0) {</div><div class='add'>+                gf_log(this-&gt;name, GF_LOG_DEBUG,</div><div class='add'>+                       "EOF on socket %d (errno:%d:%s); returning ENODATA",</div><div class='add'>+                       sock, errno, strerror(errno));</div><div class='ctx'> </div><div class='del'>-        if (!this || !this-&gt;private)</div><div class='del'>-                goto out;</div><div class='add'>+                errno = ENODATA;</div><div class='add'>+                ret = -1;</div><div class='add'>+            }</div><div class='add'>+            if ((ret &lt; 0) &amp;&amp; (errno == EAGAIN)) {</div><div class='add'>+                /* done for now */</div><div class='add'>+                break;</div><div class='add'>+            } else if (ret &gt; 0)</div><div class='add'>+                this-&gt;total_bytes_read += ret;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='add'>+        if (ret == 0) {</div><div class='add'>+            /* Mostly due to 'umount' in client */</div><div class='ctx'> </div><div class='del'>-        priv = this-&gt;private;</div><div class='add'>+            gf_log(this-&gt;name, GF_LOG_DEBUG, "EOF from peer %s",</div><div class='add'>+                   this-&gt;peerinfo.identifier);</div><div class='add'>+            opcount = -1;</div><div class='add'>+            errno = ENOTCONN;</div><div class='add'>+            break;</div><div class='add'>+        }</div><div class='add'>+        if (ret &lt; 0) {</div><div class='add'>+            if (errno == EINTR)</div><div class='add'>+                continue;</div><div class='add'>+</div><div class='add'>+            if (__does_socket_rwv_error_need_logging(priv, write)) {</div><div class='add'>+                GF_LOG_OCCASIONALLY(priv-&gt;log_ctr, this-&gt;name, GF_LOG_WARNING,</div><div class='add'>+                                    "%s on %s failed (%s)",</div><div class='add'>+                                    write ? "writev" : "readv",</div><div class='add'>+                                    this-&gt;peerinfo.identifier, strerror(errno));</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            if (priv-&gt;use_ssl &amp;&amp; priv-&gt;ssl_ssl) {</div><div class='add'>+                ssl_dump_error_stack(this-&gt;name);</div><div class='add'>+            }</div><div class='add'>+            opcount = -1;</div><div class='add'>+            break;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-        if (priv-&gt;sock != -1) {</div><div class='del'>-                ret = shutdown (priv-&gt;sock, SHUT_RDWR);</div><div class='del'>-                priv-&gt;connected = -1;</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_TRACE,</div><div class='del'>-                        "shutdown() returned %d. set connection state to -1",</div><div class='del'>-                        ret);</div><div class='add'>+        if (bytes != NULL) {</div><div class='add'>+            *bytes += ret;</div><div class='ctx'>         }</div><div class='ctx'> </div><div class='add'>+        moved = 0;</div><div class='add'>+</div><div class='add'>+        while (moved &lt; ret) {</div><div class='add'>+            if (!opcount) {</div><div class='add'>+                gf_log(this-&gt;name, GF_LOG_DEBUG, "ran out of iov, moved %d/%d",</div><div class='add'>+                       moved, ret);</div><div class='add'>+                goto ran_out;</div><div class='add'>+            }</div><div class='add'>+            if (!opvector[0].iov_len) {</div><div class='add'>+                opvector++;</div><div class='add'>+                opcount--;</div><div class='add'>+                continue;</div><div class='add'>+            }</div><div class='add'>+            if ((ret - moved) &gt;= opvector[0].iov_len) {</div><div class='add'>+                moved += opvector[0].iov_len;</div><div class='add'>+                opvector++;</div><div class='add'>+                opcount--;</div><div class='add'>+            } else {</div><div class='add'>+                opvector[0].iov_len -= (ret - moved);</div><div class='add'>+                opvector[0].iov_base += (ret - moved);</div><div class='add'>+                moved += (ret - moved);</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+ran_out:</div><div class='add'>+</div><div class='add'>+    if (pending_vector)</div><div class='add'>+        *pending_vector = opvector;</div><div class='add'>+</div><div class='add'>+    if (pending_count)</div><div class='add'>+        *pending_count = opcount;</div><div class='add'>+</div><div class='ctx'> out:</div><div class='del'>-        return ret;</div><div class='add'>+    return opcount;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+static int</div><div class='add'>+__socket_readv(rpc_transport_t *this, struct iovec *vector, int count,</div><div class='add'>+               struct iovec **pending_vector, int *pending_count, size_t *bytes)</div><div class='add'>+{</div><div class='add'>+    return __socket_rwv(this, vector, count, pending_vector, pending_count,</div><div class='add'>+                        bytes, 0);</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-__socket_server_bind (rpc_transport_t *this)</div><div class='add'>+static int</div><div class='add'>+__socket_writev(rpc_transport_t *this, struct iovec *vector, int count,</div><div class='add'>+                struct iovec **pending_vector, int *pending_count)</div><div class='ctx'> {</div><div class='del'>-        socket_private_t *priv = NULL;</div><div class='del'>-        int               ret = -1;</div><div class='del'>-	int               opt = 1;</div><div class='add'>+    return __socket_rwv(this, vector, count, pending_vector, pending_count,</div><div class='add'>+                        NULL, 1);</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        if (!this || !this-&gt;private)</div><div class='del'>-                goto out;</div><div class='add'>+static int</div><div class='add'>+__socket_shutdown(rpc_transport_t *this)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    socket_private_t *priv = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    priv-&gt;connected = -1;</div><div class='add'>+    ret = shutdown(priv-&gt;sock, SHUT_RDWR);</div><div class='add'>+    if (ret) {</div><div class='add'>+        /* its already disconnected.. no need to understand</div><div class='add'>+           why it failed to shutdown in normal cases */</div><div class='add'>+        gf_log(this-&gt;name, GF_LOG_DEBUG, "shutdown() returned %d. %s", ret,</div><div class='add'>+               strerror(errno));</div><div class='add'>+    } else {</div><div class='add'>+        GF_LOG_OCCASIONALLY(priv-&gt;shutdown_log_ctr, this-&gt;name, GF_LOG_INFO,</div><div class='add'>+                            "intentional socket shutdown(%d)", priv-&gt;sock);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+__socket_teardown_connection(rpc_transport_t *this)</div><div class='add'>+{</div><div class='add'>+    socket_private_t *priv = NULL;</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='ctx'> </div><div class='del'>-	priv = this-&gt;private;</div><div class='add'>+    if (priv-&gt;use_ssl)</div><div class='add'>+        ssl_teardown_connection(priv);</div><div class='ctx'> </div><div class='del'>-        ret = setsockopt (priv-&gt;sock, SOL_SOCKET, SO_REUSEADDR,</div><div class='del'>-			  &amp;opt, sizeof (opt));</div><div class='add'>+    return __socket_shutdown(this);</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        if (ret == -1) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-                        "setsockopt() for SO_REUSEADDR failed (%s)",</div><div class='del'>-                        strerror (errno));</div><div class='add'>+static int</div><div class='add'>+__socket_disconnect(rpc_transport_t *this)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    socket_private_t *priv = NULL;</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    gf_log(this-&gt;name, GF_LOG_TRACE, "disconnecting %p, sock=%d", this,</div><div class='add'>+           priv-&gt;sock);</div><div class='add'>+</div><div class='add'>+    if (priv-&gt;sock &gt;= 0) {</div><div class='add'>+        gf_log_callingfn(this-&gt;name, GF_LOG_TRACE,</div><div class='add'>+                         "tearing down socket connection");</div><div class='add'>+        ret = __socket_teardown_connection(this);</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_log(this-&gt;name, GF_LOG_DEBUG,</div><div class='add'>+                   "__socket_teardown_connection () failed: %s",</div><div class='add'>+                   strerror(errno));</div><div class='ctx'>         }</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        ret = bind (priv-&gt;sock, (struct sockaddr *)&amp;this-&gt;myinfo.sockaddr,</div><div class='del'>-		    this-&gt;myinfo.sockaddr_len);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        if (ret == -1) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-                        "binding to %s failed: %s",</div><div class='del'>-                        this-&gt;myinfo.identifier, strerror (errno));</div><div class='add'>+static int</div><div class='add'>+__socket_server_bind(rpc_transport_t *this)</div><div class='add'>+{</div><div class='add'>+    socket_private_t *priv = NULL;</div><div class='add'>+    glusterfs_ctx_t *ctx = NULL;</div><div class='add'>+    cmd_args_t *cmd_args = NULL;</div><div class='add'>+    struct sockaddr_storage unix_addr = {0};</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int opt = 1;</div><div class='add'>+    int reuse_check_sock = -1;</div><div class='add'>+    uint16_t sin_port = 0;</div><div class='add'>+    int retries = 0;</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+    ctx = this-&gt;ctx;</div><div class='add'>+    cmd_args = &amp;ctx-&gt;cmd_args;</div><div class='add'>+</div><div class='add'>+    ret = setsockopt(priv-&gt;sock, SOL_SOCKET, SO_REUSEADDR, &amp;opt, sizeof(opt));</div><div class='add'>+</div><div class='add'>+    if (ret != 0) {</div><div class='add'>+        gf_log(this-&gt;name, GF_LOG_ERROR,</div><div class='add'>+               "setsockopt() for SO_REUSEADDR failed (%s)", strerror(errno));</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* reuse-address doesn't work for unix type sockets */</div><div class='add'>+    if (AF_UNIX == SA(&amp;this-&gt;myinfo.sockaddr)-&gt;sa_family) {</div><div class='add'>+        memcpy(&amp;unix_addr, SA(&amp;this-&gt;myinfo.sockaddr),</div><div class='add'>+               this-&gt;myinfo.sockaddr_len);</div><div class='add'>+        reuse_check_sock = sys_socket(AF_UNIX, SOCK_STREAM, 0);</div><div class='add'>+        if (reuse_check_sock &gt;= 0) {</div><div class='add'>+            ret = connect(reuse_check_sock, SA(&amp;unix_addr),</div><div class='add'>+                          this-&gt;myinfo.sockaddr_len);</div><div class='add'>+            if ((ret != 0) &amp;&amp; (ECONNREFUSED == errno)) {</div><div class='add'>+                sys_unlink(((struct sockaddr_un *)&amp;unix_addr)-&gt;sun_path);</div><div class='add'>+            }</div><div class='add'>+            gf_log(this-&gt;name, GF_LOG_INFO,</div><div class='add'>+                   "closing (AF_UNIX) reuse check socket %d", reuse_check_sock);</div><div class='add'>+            sys_close(reuse_check_sock);</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (AF_UNIX != SA(&amp;this-&gt;myinfo.sockaddr)-&gt;sa_family) {</div><div class='add'>+        sin_port = (int)ntohs(</div><div class='add'>+            ((struct sockaddr_in *)&amp;this-&gt;myinfo.sockaddr)-&gt;sin_port);</div><div class='add'>+        if (!sin_port) {</div><div class='add'>+            sin_port = GF_DEFAULT_SOCKET_LISTEN_PORT;</div><div class='add'>+            ((struct sockaddr_in *)&amp;this-&gt;myinfo.sockaddr)-&gt;sin_port = htons(</div><div class='add'>+                sin_port);</div><div class='add'>+        }</div><div class='add'>+        retries = 10;</div><div class='add'>+        while (retries) {</div><div class='add'>+            ret = bind(priv-&gt;sock, (struct sockaddr *)&amp;this-&gt;myinfo.sockaddr,</div><div class='add'>+                       this-&gt;myinfo.sockaddr_len);</div><div class='add'>+            if (ret != 0) {</div><div class='add'>+                gf_log(this-&gt;name, GF_LOG_ERROR, "binding to %s failed: %s",</div><div class='add'>+                       this-&gt;myinfo.identifier, strerror(errno));</div><div class='ctx'>                 if (errno == EADDRINUSE) {</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-                                "Port is already in use");</div><div class='add'>+                    gf_log(this-&gt;name, GF_LOG_ERROR, "Port is already in use");</div><div class='add'>+                    sleep(1);</div><div class='add'>+                    retries--;</div><div class='add'>+                } else {</div><div class='add'>+                    break;</div><div class='ctx'>                 }</div><div class='add'>+            } else {</div><div class='add'>+                break;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+    } else {</div><div class='add'>+        ret = bind(priv-&gt;sock, (struct sockaddr *)&amp;this-&gt;myinfo.sockaddr,</div><div class='add'>+                   this-&gt;myinfo.sockaddr_len);</div><div class='add'>+</div><div class='add'>+        if (ret != 0) {</div><div class='add'>+            gf_log(this-&gt;name, GF_LOG_ERROR, "binding to %s failed: %s",</div><div class='add'>+                   this-&gt;myinfo.identifier, strerror(errno));</div><div class='add'>+            if (errno == EADDRINUSE) {</div><div class='add'>+                gf_log(this-&gt;name, GF_LOG_ERROR, "Port is already in use");</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    if (AF_UNIX != SA(&amp;this-&gt;myinfo.sockaddr)-&gt;sa_family) {</div><div class='add'>+        if (getsockname(priv-&gt;sock, SA(&amp;this-&gt;myinfo.sockaddr),</div><div class='add'>+                        &amp;this-&gt;myinfo.sockaddr_len) != 0) {</div><div class='add'>+            gf_log(this-&gt;name, GF_LOG_WARNING,</div><div class='add'>+                   "getsockname on (%d) failed (%s)", priv-&gt;sock,</div><div class='add'>+                   strerror(errno));</div><div class='add'>+            ret = -1;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+        if (!cmd_args-&gt;brick_port) {</div><div class='add'>+            cmd_args-&gt;brick_port = (int)ntohs(</div><div class='add'>+                ((struct sockaddr_in *)&amp;this-&gt;myinfo.sockaddr)-&gt;sin_port);</div><div class='add'>+            gf_log(this-&gt;name, GF_LOG_INFO,</div><div class='add'>+                   "process started listening on port (%d)",</div><div class='add'>+                   cmd_args-&gt;brick_port);</div><div class='ctx'>         }</div><div class='add'>+    }</div><div class='ctx'> </div><div class='ctx'> out:</div><div class='del'>-        return ret;</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-__socket_nonblock (int fd)</div><div class='add'>+static int</div><div class='add'>+__socket_nonblock(int fd)</div><div class='ctx'> {</div><div class='del'>-        int flags = 0;</div><div class='del'>-        int ret = -1;</div><div class='add'>+    int flags = 0;</div><div class='add'>+    int ret = -1;</div><div class='ctx'> </div><div class='del'>-        flags = fcntl (fd, F_GETFL);</div><div class='add'>+    flags = fcntl(fd, F_GETFL);</div><div class='ctx'> </div><div class='del'>-        if (flags != -1)</div><div class='del'>-                ret = fcntl (fd, F_SETFL, flags | O_NONBLOCK);</div><div class='add'>+    if (flags &gt;= 0)</div><div class='add'>+        ret = fcntl(fd, F_SETFL, flags | O_NONBLOCK);</div><div class='ctx'> </div><div class='del'>-        return ret;</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-__socket_nodelay (int fd)</div><div class='add'>+static int</div><div class='add'>+__socket_nodelay(int fd)</div><div class='ctx'> {</div><div class='del'>-        int     on = 1;</div><div class='del'>-        int     ret = -1;</div><div class='add'>+    int on = 1;</div><div class='add'>+    int ret = -1;</div><div class='ctx'> </div><div class='del'>-        ret = setsockopt (fd, IPPROTO_TCP, TCP_NODELAY,</div><div class='del'>-			  &amp;on, sizeof (on));</div><div class='del'>-        if (!ret)</div><div class='del'>-                gf_log ("", GF_LOG_TRACE,</div><div class='del'>-                        "NODELAY enabled for socket %d", fd);</div><div class='add'>+    ret = setsockopt(fd, IPPROTO_TCP, TCP_NODELAY, &amp;on, sizeof(on));</div><div class='add'>+    if (!ret)</div><div class='add'>+        gf_log(THIS-&gt;name, GF_LOG_TRACE, "NODELAY enabled for socket %d", fd);</div><div class='ctx'> </div><div class='del'>-        return ret;</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-__socket_connect_finish (int fd)</div><div class='add'>+static int</div><div class='add'>+__socket_keepalive(int fd, int family, int keepaliveintvl, int keepaliveidle,</div><div class='add'>+                   int keepalivecnt, int timeout)</div><div class='ctx'> {</div><div class='del'>-        int       ret = -1;</div><div class='del'>-        int       optval = 0;</div><div class='del'>-        socklen_t optlen = sizeof (int);</div><div class='add'>+    int on = 1;</div><div class='add'>+    int ret = -1;</div><div class='add'>+#if defined(TCP_USER_TIMEOUT)</div><div class='add'>+    int timeout_ms = timeout * 1000;</div><div class='add'>+#endif</div><div class='ctx'> </div><div class='del'>-        ret = getsockopt (fd, SOL_SOCKET, SO_ERROR, (void *)&amp;optval, &amp;optlen);</div><div class='add'>+    ret = setsockopt(fd, SOL_SOCKET, SO_KEEPALIVE, &amp;on, sizeof(on));</div><div class='add'>+    if (ret != 0) {</div><div class='add'>+        gf_log("socket", GF_LOG_WARNING,</div><div class='add'>+               "failed to set keep alive option on socket %d", fd);</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (keepaliveintvl == GF_USE_DEFAULT_KEEPALIVE)</div><div class='add'>+        goto done;</div><div class='add'>+</div><div class='add'>+#if !defined(GF_LINUX_HOST_OS) &amp;&amp; !defined(__NetBSD__)</div><div class='add'>+#if defined(GF_SOLARIS_HOST_OS) || defined(__FreeBSD__)</div><div class='add'>+    ret = setsockopt(fd, SOL_SOCKET, SO_KEEPALIVE, &amp;keepaliveintvl,</div><div class='add'>+                     sizeof(keepaliveintvl));</div><div class='add'>+#else</div><div class='add'>+    ret = setsockopt(fd, IPPROTO_TCP, TCP_KEEPALIVE, &amp;keepaliveintvl,</div><div class='add'>+                     sizeof(keepaliveintvl));</div><div class='add'>+#endif</div><div class='add'>+    if (ret != 0) {</div><div class='add'>+        gf_log("socket", GF_LOG_WARNING,</div><div class='add'>+               "failed to set keep alive interval on socket %d", fd);</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+#else</div><div class='add'>+    if (family != AF_INET &amp;&amp; family != AF_INET6)</div><div class='add'>+        goto done;</div><div class='add'>+</div><div class='add'>+    ret = setsockopt(fd, IPPROTO_TCP, TCP_KEEPIDLE, &amp;keepaliveidle,</div><div class='add'>+                     sizeof(keepaliveidle));</div><div class='add'>+    if (ret != 0) {</div><div class='add'>+        gf_log("socket", GF_LOG_WARNING,</div><div class='add'>+               "failed to set keep idle %d on socket %d, %s", keepaliveidle, fd,</div><div class='add'>+               strerror(errno));</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+    ret = setsockopt(fd, IPPROTO_TCP, TCP_KEEPINTVL, &amp;keepaliveintvl,</div><div class='add'>+                     sizeof(keepaliveintvl));</div><div class='add'>+    if (ret != 0) {</div><div class='add'>+        gf_log("socket", GF_LOG_WARNING,</div><div class='add'>+               "failed to set keep interval %d on socket %d, %s",</div><div class='add'>+               keepaliveintvl, fd, strerror(errno));</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+#if defined(TCP_USER_TIMEOUT)</div><div class='add'>+    if (timeout_ms &lt; 0)</div><div class='add'>+        goto done;</div><div class='add'>+    ret = setsockopt(fd, IPPROTO_TCP, TCP_USER_TIMEOUT, &amp;timeout_ms,</div><div class='add'>+                     sizeof(timeout_ms));</div><div class='add'>+    if (ret != 0) {</div><div class='add'>+        gf_log("socket", GF_LOG_WARNING,</div><div class='add'>+               "failed to set "</div><div class='add'>+               "TCP_USER_TIMEOUT %d on socket %d, %s",</div><div class='add'>+               timeout_ms, fd, strerror(errno));</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+#endif</div><div class='add'>+#if defined(TCP_KEEPCNT)</div><div class='add'>+    ret = setsockopt(fd, IPPROTO_TCP, TCP_KEEPCNT, &amp;keepalivecnt,</div><div class='add'>+                     sizeof(keepalivecnt));</div><div class='add'>+    if (ret != 0) {</div><div class='add'>+        gf_log("socket", GF_LOG_WARNING,</div><div class='add'>+               "failed to set "</div><div class='add'>+               "TCP_KEEPCNT %d on socket %d, %s",</div><div class='add'>+               keepalivecnt, fd, strerror(errno));</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+#endif</div><div class='add'>+#endif</div><div class='ctx'> </div><div class='del'>-        if (ret == 0 &amp;&amp; optval) {</div><div class='del'>-                errno = optval;</div><div class='del'>-                ret = -1;</div><div class='del'>-        }</div><div class='add'>+done:</div><div class='add'>+    gf_log(THIS-&gt;name, GF_LOG_TRACE,</div><div class='add'>+           "Keep-alive enabled for socket: %d, "</div><div class='add'>+           "(idle: %d, interval: %d, max-probes: %d, timeout: %d)",</div><div class='add'>+           fd, keepaliveidle, keepaliveintvl, keepalivecnt, timeout);</div><div class='ctx'> </div><div class='del'>-        return ret;</div><div class='add'>+err:</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='del'>-void</div><div class='del'>-__socket_reset (rpc_transport_t *this)</div><div class='add'>+static int</div><div class='add'>+__socket_connect_finish(int fd)</div><div class='ctx'> {</div><div class='del'>-        socket_private_t *priv = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int optval = 0;</div><div class='add'>+    socklen_t optlen = sizeof(int);</div><div class='ctx'> </div><div class='del'>-        if (!this || !this-&gt;private)</div><div class='del'>-                goto out;</div><div class='add'>+    ret = getsockopt(fd, SOL_SOCKET, SO_ERROR, (void *)&amp;optval, &amp;optlen);</div><div class='ctx'> </div><div class='del'>-        priv = this-&gt;private;</div><div class='del'>-</div><div class='del'>-        /* TODO: use mem-pool on incoming data */</div><div class='del'>-</div><div class='del'>-        if (priv-&gt;incoming.iobref) {</div><div class='del'>-                iobref_unref (priv-&gt;incoming.iobref);</div><div class='del'>-                priv-&gt;incoming.iobref = NULL;</div><div class='del'>-        }</div><div class='add'>+    if (ret == 0 &amp;&amp; optval) {</div><div class='add'>+        errno = optval;</div><div class='add'>+        ret = -1;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        if (priv-&gt;incoming.iobuf) {</div><div class='del'>-                iobuf_unref (priv-&gt;incoming.iobuf);</div><div class='del'>-        }</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        if (priv-&gt;incoming.request_info != NULL) {</div><div class='del'>-                GF_FREE (priv-&gt;incoming.request_info);</div><div class='del'>-        }</div><div class='add'>+static void</div><div class='add'>+__socket_reset(rpc_transport_t *this)</div><div class='add'>+{</div><div class='add'>+    socket_private_t *priv = NULL;</div><div class='ctx'> </div><div class='del'>-        memset (&amp;priv-&gt;incoming, 0, sizeof (priv-&gt;incoming));</div><div class='add'>+    priv = this-&gt;private;</div><div class='ctx'> </div><div class='del'>-        event_unregister (this-&gt;ctx-&gt;event_pool, priv-&gt;sock, priv-&gt;idx);</div><div class='add'>+    /* TODO: use mem-pool on incoming data */</div><div class='ctx'> </div><div class='del'>-        close (priv-&gt;sock);</div><div class='del'>-        priv-&gt;sock = -1;</div><div class='del'>-        priv-&gt;idx = -1;</div><div class='del'>-        priv-&gt;connected = -1;</div><div class='add'>+    if (priv-&gt;incoming.iobref) {</div><div class='add'>+        iobref_unref(priv-&gt;incoming.iobref);</div><div class='add'>+        priv-&gt;incoming.iobref = NULL;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-out:</div><div class='del'>-        return;</div><div class='add'>+    if (priv-&gt;incoming.iobuf) {</div><div class='add'>+        iobuf_unref(priv-&gt;incoming.iobuf);</div><div class='add'>+        priv-&gt;incoming.iobuf = NULL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    GF_FREE(priv-&gt;incoming.request_info);</div><div class='add'>+</div><div class='add'>+    memset(&amp;priv-&gt;incoming, 0, sizeof(priv-&gt;incoming));</div><div class='add'>+</div><div class='add'>+    gf_event_unregister_close(this-&gt;ctx-&gt;event_pool, priv-&gt;sock, priv-&gt;idx);</div><div class='add'>+    if (priv-&gt;use_ssl &amp;&amp; priv-&gt;ssl_ssl) {</div><div class='add'>+        SSL_clear(priv-&gt;ssl_ssl);</div><div class='add'>+        SSL_free(priv-&gt;ssl_ssl);</div><div class='add'>+        priv-&gt;ssl_ssl = NULL;</div><div class='add'>+    }</div><div class='add'>+    if (priv-&gt;ssl_ctx) {</div><div class='add'>+        SSL_CTX_free(priv-&gt;ssl_ctx);</div><div class='add'>+        priv-&gt;ssl_ctx = NULL;</div><div class='add'>+    }</div><div class='add'>+    priv-&gt;sock = -1;</div><div class='add'>+    priv-&gt;idx = -1;</div><div class='add'>+    priv-&gt;connected = -1;</div><div class='add'>+    priv-&gt;ssl_connected = _gf_false;</div><div class='add'>+    priv-&gt;ssl_accepted = _gf_false;</div><div class='add'>+    priv-&gt;ssl_context_created = _gf_false;</div><div class='add'>+</div><div class='add'>+    if (priv-&gt;ssl_private_key) {</div><div class='add'>+        GF_FREE(priv-&gt;ssl_private_key);</div><div class='add'>+        priv-&gt;ssl_private_key = NULL;</div><div class='add'>+    }</div><div class='add'>+    if (priv-&gt;ssl_own_cert) {</div><div class='add'>+        GF_FREE(priv-&gt;ssl_own_cert);</div><div class='add'>+        priv-&gt;ssl_own_cert = NULL;</div><div class='add'>+    }</div><div class='add'>+    if (priv-&gt;ssl_ca_list) {</div><div class='add'>+        GF_FREE(priv-&gt;ssl_ca_list);</div><div class='add'>+        priv-&gt;ssl_ca_list = NULL;</div><div class='add'>+    }</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='del'>-void</div><div class='del'>-socket_set_lastfrag (uint32_t *fragsize) {</div><div class='del'>-        (*fragsize) |= 0x80000000U;</div><div class='add'>+static void</div><div class='add'>+socket_set_lastfrag(uint32_t *fragsize)</div><div class='add'>+{</div><div class='add'>+    (*fragsize) |= 0x80000000U;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='del'>-void</div><div class='del'>-socket_set_frag_header_size (uint32_t size, char *haddr)</div><div class='add'>+static void</div><div class='add'>+socket_set_frag_header_size(uint32_t size, char *haddr)</div><div class='ctx'> {</div><div class='del'>-        size = htonl (size);</div><div class='del'>-        memcpy (haddr, &amp;size, sizeof (size));</div><div class='add'>+    size = htonl(size);</div><div class='add'>+    memcpy(haddr, &amp;size, sizeof(size));</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='del'>-void</div><div class='del'>-socket_set_last_frag_header_size (uint32_t size, char *haddr)</div><div class='add'>+static void</div><div class='add'>+socket_set_last_frag_header_size(uint32_t size, char *haddr)</div><div class='ctx'> {</div><div class='del'>-        socket_set_lastfrag (&amp;size);</div><div class='del'>-        socket_set_frag_header_size (size, haddr);</div><div class='add'>+    socket_set_lastfrag(&amp;size);</div><div class='add'>+    socket_set_frag_header_size(size, haddr);</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-struct ioq *</div><div class='del'>-__socket_ioq_new (rpc_transport_t *this, rpc_transport_msg_t *msg)</div><div class='add'>+static struct ioq *</div><div class='add'>+__socket_ioq_new(rpc_transport_t *this, rpc_transport_msg_t *msg)</div><div class='ctx'> {</div><div class='del'>-        struct ioq       *entry = NULL;</div><div class='del'>-        int               count = 0;</div><div class='del'>-        uint32_t          size  = 0;</div><div class='add'>+    struct ioq *entry = NULL;</div><div class='add'>+    int count = 0;</div><div class='add'>+    uint32_t size = 0;</div><div class='ctx'> </div><div class='del'>-        if (!this)</div><div class='del'>-                goto out;</div><div class='add'>+    /* TODO: use mem-pool */</div><div class='add'>+    entry = GF_CALLOC(1, sizeof(*entry), gf_common_mt_ioq);</div><div class='add'>+    if (!entry)</div><div class='add'>+        return NULL;</div><div class='ctx'> </div><div class='del'>-        /* TODO: use mem-pool */</div><div class='del'>-        entry = GF_CALLOC (1, sizeof (*entry), gf_common_mt_ioq);</div><div class='del'>-        if (!entry)</div><div class='del'>-                return NULL;</div><div class='add'>+    count = msg-&gt;rpchdrcount + msg-&gt;proghdrcount + msg-&gt;progpayloadcount;</div><div class='ctx'> </div><div class='del'>-        count = msg-&gt;rpchdrcount + msg-&gt;proghdrcount + msg-&gt;progpayloadcount;</div><div class='add'>+    GF_ASSERT(count &lt;= (MAX_IOVEC - 1));</div><div class='ctx'> </div><div class='del'>-        assert (count &lt;= (MAX_IOVEC - 1));</div><div class='add'>+    size = iov_length(msg-&gt;rpchdr, msg-&gt;rpchdrcount) +</div><div class='add'>+           iov_length(msg-&gt;proghdr, msg-&gt;proghdrcount) +</div><div class='add'>+           iov_length(msg-&gt;progpayload, msg-&gt;progpayloadcount);</div><div class='ctx'> </div><div class='del'>-        size = iov_length (msg-&gt;rpchdr, msg-&gt;rpchdrcount)</div><div class='del'>-                + iov_length (msg-&gt;proghdr, msg-&gt;proghdrcount)</div><div class='del'>-                + iov_length (msg-&gt;progpayload, msg-&gt;progpayloadcount);</div><div class='add'>+    if (size &gt; RPC_MAX_FRAGMENT_SIZE) {</div><div class='add'>+        gf_log(this-&gt;name, GF_LOG_ERROR,</div><div class='add'>+               "msg size (%u) bigger than the maximum allowed size on "</div><div class='add'>+               "sockets (%u)",</div><div class='add'>+               size, RPC_MAX_FRAGMENT_SIZE);</div><div class='add'>+        GF_FREE(entry);</div><div class='add'>+        return NULL;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        if (size &gt; RPC_MAX_FRAGMENT_SIZE) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-                        "msg size (%u) bigger than the maximum allowed size on "</div><div class='del'>-                        "sockets (%u)", size, RPC_MAX_FRAGMENT_SIZE);</div><div class='del'>-                GF_FREE (entry);</div><div class='del'>-                return NULL;</div><div class='del'>-        }</div><div class='add'>+    socket_set_last_frag_header_size(size, (char *)&amp;entry-&gt;fraghdr);</div><div class='ctx'> </div><div class='del'>-        socket_set_last_frag_header_size (size, (char *)&amp;entry-&gt;fraghdr);</div><div class='add'>+    entry-&gt;vector[0].iov_base = (char *)&amp;entry-&gt;fraghdr;</div><div class='add'>+    entry-&gt;vector[0].iov_len = sizeof(entry-&gt;fraghdr);</div><div class='add'>+    entry-&gt;count = 1;</div><div class='ctx'> </div><div class='del'>-        entry-&gt;vector[0].iov_base = (char *)&amp;entry-&gt;fraghdr;</div><div class='del'>-        entry-&gt;vector[0].iov_len = sizeof (entry-&gt;fraghdr);</div><div class='del'>-        entry-&gt;count = 1;</div><div class='add'>+    if (msg-&gt;rpchdr != NULL) {</div><div class='add'>+        memcpy(&amp;entry-&gt;vector[1], msg-&gt;rpchdr,</div><div class='add'>+               sizeof(struct iovec) * msg-&gt;rpchdrcount);</div><div class='add'>+        entry-&gt;count += msg-&gt;rpchdrcount;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        if (msg-&gt;rpchdr != NULL) {</div><div class='del'>-                memcpy (&amp;entry-&gt;vector[1], msg-&gt;rpchdr,</div><div class='del'>-                        sizeof (struct iovec) * msg-&gt;rpchdrcount);</div><div class='del'>-                entry-&gt;count += msg-&gt;rpchdrcount;</div><div class='del'>-        }</div><div class='add'>+    if (msg-&gt;proghdr != NULL) {</div><div class='add'>+        memcpy(&amp;entry-&gt;vector[entry-&gt;count], msg-&gt;proghdr,</div><div class='add'>+               sizeof(struct iovec) * msg-&gt;proghdrcount);</div><div class='add'>+        entry-&gt;count += msg-&gt;proghdrcount;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        if (msg-&gt;proghdr != NULL) {</div><div class='del'>-                memcpy (&amp;entry-&gt;vector[entry-&gt;count], msg-&gt;proghdr,</div><div class='del'>-                        sizeof (struct iovec) * msg-&gt;proghdrcount);</div><div class='del'>-                entry-&gt;count += msg-&gt;proghdrcount;</div><div class='del'>-        }</div><div class='add'>+    if (msg-&gt;progpayload != NULL) {</div><div class='add'>+        memcpy(&amp;entry-&gt;vector[entry-&gt;count], msg-&gt;progpayload,</div><div class='add'>+               sizeof(struct iovec) * msg-&gt;progpayloadcount);</div><div class='add'>+        entry-&gt;count += msg-&gt;progpayloadcount;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        if (msg-&gt;progpayload != NULL) {</div><div class='del'>-                memcpy (&amp;entry-&gt;vector[entry-&gt;count], msg-&gt;progpayload,</div><div class='del'>-                        sizeof (struct iovec) * msg-&gt;progpayloadcount);</div><div class='del'>-                entry-&gt;count += msg-&gt;progpayloadcount;</div><div class='del'>-        }</div><div class='add'>+    entry-&gt;pending_vector = entry-&gt;vector;</div><div class='add'>+    entry-&gt;pending_count = entry-&gt;count;</div><div class='ctx'> </div><div class='del'>-        entry-&gt;pending_vector = entry-&gt;vector;</div><div class='del'>-        entry-&gt;pending_count  = entry-&gt;count;</div><div class='add'>+    if (msg-&gt;iobref != NULL)</div><div class='add'>+        entry-&gt;iobref = iobref_ref(msg-&gt;iobref);</div><div class='ctx'> </div><div class='del'>-        if (msg-&gt;iobref != NULL)</div><div class='del'>-                entry-&gt;iobref = iobref_ref (msg-&gt;iobref);</div><div class='add'>+    INIT_LIST_HEAD(&amp;entry-&gt;list);</div><div class='ctx'> </div><div class='del'>-        INIT_LIST_HEAD (&amp;entry-&gt;list);</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        return entry;</div><div class='add'>+    return entry;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='del'>-void</div><div class='del'>-__socket_ioq_entry_free (struct ioq *entry)</div><div class='add'>+static void</div><div class='add'>+__socket_ioq_entry_free(struct ioq *entry)</div><div class='ctx'> {</div><div class='del'>-        if (!entry)</div><div class='del'>-                return;</div><div class='add'>+    GF_VALIDATE_OR_GOTO("socket", entry, out);</div><div class='ctx'> </div><div class='del'>-        list_del_init (&amp;entry-&gt;list);</div><div class='del'>-        if (entry-&gt;iobref)</div><div class='del'>-                iobref_unref (entry-&gt;iobref);</div><div class='add'>+    list_del_init(&amp;entry-&gt;list);</div><div class='add'>+    if (entry-&gt;iobref)</div><div class='add'>+        iobref_unref(entry-&gt;iobref);</div><div class='ctx'> </div><div class='del'>-        /* TODO: use mem-pool */</div><div class='del'>-        GF_FREE (entry);</div><div class='del'>-}</div><div class='add'>+    /* TODO: use mem-pool */</div><div class='add'>+    GF_FREE(entry);</div><div class='ctx'> </div><div class='add'>+out:</div><div class='add'>+    return;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-void</div><div class='del'>-__socket_ioq_flush (rpc_transport_t *this)</div><div class='add'>+static void</div><div class='add'>+__socket_ioq_flush(socket_private_t *priv)</div><div class='ctx'> {</div><div class='del'>-        socket_private_t *priv = NULL;</div><div class='del'>-        struct ioq       *entry = NULL;</div><div class='del'>-</div><div class='del'>-        if (!this || !this-&gt;private)</div><div class='del'>-                goto out;</div><div class='del'>-</div><div class='del'>-        priv = this-&gt;private;</div><div class='del'>-</div><div class='del'>-        while (!list_empty (&amp;priv-&gt;ioq)) {</div><div class='del'>-                entry = priv-&gt;ioq_next;</div><div class='del'>-                __socket_ioq_entry_free (entry);</div><div class='del'>-        }</div><div class='add'>+    struct ioq *entry = NULL;</div><div class='ctx'> </div><div class='del'>-out:</div><div class='del'>-        return;</div><div class='add'>+    while (!list_empty(&amp;priv-&gt;ioq)) {</div><div class='add'>+        entry = priv-&gt;ioq_next;</div><div class='add'>+        __socket_ioq_entry_free(entry);</div><div class='add'>+    }</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-__socket_ioq_churn_entry (rpc_transport_t *this, struct ioq *entry)</div><div class='add'>+static int</div><div class='add'>+__socket_ioq_churn_entry(rpc_transport_t *this, struct ioq *entry)</div><div class='ctx'> {</div><div class='del'>-        int ret = -1;</div><div class='add'>+    int ret = -1;</div><div class='ctx'> </div><div class='del'>-        ret = __socket_writev (this, entry-&gt;pending_vector,</div><div class='del'>-			       entry-&gt;pending_count,</div><div class='del'>-                               &amp;entry-&gt;pending_vector,</div><div class='del'>-			       &amp;entry-&gt;pending_count);</div><div class='add'>+    ret = __socket_writev(this, entry-&gt;pending_vector, entry-&gt;pending_count,</div><div class='add'>+                          &amp;entry-&gt;pending_vector, &amp;entry-&gt;pending_count);</div><div class='ctx'> </div><div class='del'>-        if (ret == 0) {</div><div class='del'>-                /* current entry was completely written */</div><div class='del'>-                assert (entry-&gt;pending_count == 0);</div><div class='del'>-                __socket_ioq_entry_free (entry);</div><div class='del'>-        }</div><div class='add'>+    if (ret == 0) {</div><div class='add'>+        /* current entry was completely written */</div><div class='add'>+        GF_ASSERT(entry-&gt;pending_count == 0);</div><div class='add'>+        __socket_ioq_entry_free(entry);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        return ret;</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-__socket_ioq_churn (rpc_transport_t *this)</div><div class='add'>+static int</div><div class='add'>+__socket_ioq_churn(rpc_transport_t *this)</div><div class='ctx'> {</div><div class='del'>-        socket_private_t *priv = NULL;</div><div class='del'>-        int               ret = 0;</div><div class='del'>-        struct ioq       *entry = NULL;</div><div class='add'>+    socket_private_t *priv = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    struct ioq *entry = NULL;</div><div class='ctx'> </div><div class='del'>-        if (!this || !this-&gt;private)</div><div class='del'>-                goto out;</div><div class='add'>+    priv = this-&gt;private;</div><div class='ctx'> </div><div class='del'>-        priv = this-&gt;private;</div><div class='add'>+    while (!list_empty(&amp;priv-&gt;ioq)) {</div><div class='add'>+        /* pick next entry */</div><div class='add'>+        entry = priv-&gt;ioq_next;</div><div class='ctx'> </div><div class='del'>-        while (!list_empty (&amp;priv-&gt;ioq)) {</div><div class='del'>-                /* pick next entry */</div><div class='del'>-                entry = priv-&gt;ioq_next;</div><div class='add'>+        ret = __socket_ioq_churn_entry(this, entry);</div><div class='ctx'> </div><div class='del'>-                ret = __socket_ioq_churn_entry (this, entry);</div><div class='add'>+        if (ret != 0)</div><div class='add'>+            break;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-                if (ret != 0)</div><div class='del'>-                        break;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (list_empty (&amp;priv-&gt;ioq)) {</div><div class='del'>-                /* all pending writes done, not interested in POLLOUT */</div><div class='del'>-                priv-&gt;idx = event_select_on (this-&gt;ctx-&gt;event_pool,</div><div class='del'>-					     priv-&gt;sock, priv-&gt;idx, -1, 0);</div><div class='del'>-        }</div><div class='add'>+    if (list_empty(&amp;priv-&gt;ioq)) {</div><div class='add'>+        /* all pending writes done, not interested in POLLOUT */</div><div class='add'>+        priv-&gt;idx = gf_event_select_on(this-&gt;ctx-&gt;event_pool, priv-&gt;sock,</div><div class='add'>+                                       priv-&gt;idx, -1, 0);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-out:</div><div class='del'>-        return ret;</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-socket_event_poll_err (rpc_transport_t *this)</div><div class='add'>+static gf_boolean_t</div><div class='add'>+socket_event_poll_err(rpc_transport_t *this, int gen, int idx)</div><div class='ctx'> {</div><div class='del'>-        socket_private_t *priv = NULL;</div><div class='del'>-        int               ret = -1;</div><div class='add'>+    socket_private_t *priv = NULL;</div><div class='add'>+    gf_boolean_t socket_closed = _gf_false;</div><div class='ctx'> </div><div class='del'>-        if (!this || !this-&gt;private)</div><div class='del'>-                goto out;</div><div class='add'>+    priv = this-&gt;private;</div><div class='ctx'> </div><div class='del'>-        priv = this-&gt;private;</div><div class='add'>+    pthread_mutex_lock(&amp;priv-&gt;out_lock);</div><div class='add'>+    {</div><div class='add'>+        if ((priv-&gt;gen == gen) &amp;&amp; (priv-&gt;idx == idx) &amp;&amp; (priv-&gt;sock &gt;= 0)) {</div><div class='add'>+            __socket_ioq_flush(priv);</div><div class='add'>+            __socket_reset(this);</div><div class='add'>+            socket_closed = _gf_true;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    pthread_mutex_unlock(&amp;priv-&gt;out_lock);</div><div class='ctx'> </div><div class='del'>-        pthread_mutex_lock (&amp;priv-&gt;lock);</div><div class='add'>+    if (socket_closed) {</div><div class='add'>+        pthread_mutex_lock(&amp;priv-&gt;notify.lock);</div><div class='ctx'>         {</div><div class='del'>-                __socket_ioq_flush (this);</div><div class='del'>-                __socket_reset (this);</div><div class='add'>+            while (priv-&gt;notify.in_progress)</div><div class='add'>+                pthread_cond_wait(&amp;priv-&gt;notify.cond, &amp;priv-&gt;notify.lock);</div><div class='ctx'>         }</div><div class='del'>-        pthread_mutex_unlock (&amp;priv-&gt;lock);</div><div class='add'>+        pthread_mutex_unlock(&amp;priv-&gt;notify.lock);</div><div class='ctx'> </div><div class='del'>-        rpc_transport_notify (this, RPC_TRANSPORT_DISCONNECT, this);</div><div class='add'>+        rpc_transport_notify(this, RPC_TRANSPORT_DISCONNECT, this);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-out:</div><div class='del'>-        return ret;</div><div class='add'>+    return socket_closed;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-socket_event_poll_out (rpc_transport_t *this)</div><div class='add'>+static int</div><div class='add'>+socket_event_poll_out(rpc_transport_t *this)</div><div class='ctx'> {</div><div class='del'>-        socket_private_t *priv = NULL;</div><div class='del'>-        int               ret = -1;</div><div class='del'>-</div><div class='del'>-        if (!this || !this-&gt;private)</div><div class='del'>-                goto out;</div><div class='del'>-</div><div class='del'>-        priv = this-&gt;private;</div><div class='del'>-</div><div class='del'>-        pthread_mutex_lock (&amp;priv-&gt;lock);</div><div class='del'>-        {</div><div class='del'>-                if (priv-&gt;connected == 1) {</div><div class='del'>-                        ret = __socket_ioq_churn (this);</div><div class='del'>-</div><div class='del'>-                        if (ret == -1) {</div><div class='del'>-                                __socket_disconnect (this);</div><div class='del'>-                        }</div><div class='del'>-                }</div><div class='add'>+    socket_private_t *priv = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    pthread_mutex_lock(&amp;priv-&gt;out_lock);</div><div class='add'>+    {</div><div class='add'>+        if (priv-&gt;connected == 1) {</div><div class='add'>+            ret = __socket_ioq_churn(this);</div><div class='add'>+</div><div class='add'>+            if (ret &lt; 0) {</div><div class='add'>+                gf_log(this-&gt;name, GF_LOG_TRACE,</div><div class='add'>+                       "__socket_ioq_churn returned -1; "</div><div class='add'>+                       "disconnecting socket");</div><div class='add'>+                __socket_disconnect(this);</div><div class='add'>+            }</div><div class='ctx'>         }</div><div class='del'>-        pthread_mutex_unlock (&amp;priv-&gt;lock);</div><div class='add'>+    }</div><div class='add'>+    pthread_mutex_unlock(&amp;priv-&gt;out_lock);</div><div class='ctx'> </div><div class='del'>-        ret = rpc_transport_notify (this, RPC_TRANSPORT_MSG_SENT, NULL);</div><div class='add'>+    if (ret == 0)</div><div class='add'>+        rpc_transport_notify(this, RPC_TRANSPORT_MSG_SENT, NULL);</div><div class='ctx'> </div><div class='del'>-out:</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='add'>+    if (ret &gt; 0)</div><div class='add'>+        ret = 0;</div><div class='ctx'> </div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-inline int</div><div class='del'>-__socket_read_simple_msg (rpc_transport_t *this)</div><div class='add'>+static int</div><div class='add'>+__socket_read_simple_msg(rpc_transport_t *this)</div><div class='ctx'> {</div><div class='del'>-        socket_private_t *priv           = NULL;</div><div class='del'>-        int               ret            = 0;</div><div class='del'>-        uint32_t          remaining_size = 0;</div><div class='del'>-        size_t            bytes_read     = 0;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    uint32_t remaining_size = 0;</div><div class='add'>+    size_t bytes_read = 0;</div><div class='add'>+    socket_private_t *priv = NULL;</div><div class='add'>+    struct gf_sock_incoming *in = NULL;</div><div class='add'>+    struct gf_sock_incoming_frag *frag = NULL;</div><div class='ctx'> </div><div class='del'>-        if (!this || !this-&gt;private)</div><div class='del'>-                goto out;</div><div class='add'>+    GF_VALIDATE_OR_GOTO("socket", this, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("socket", this-&gt;private, out);</div><div class='ctx'> </div><div class='del'>-        priv = this-&gt;private;</div><div class='add'>+    priv = this-&gt;private;</div><div class='ctx'> </div><div class='del'>-        switch (priv-&gt;incoming.frag.simple_state) {</div><div class='add'>+    in = &amp;priv-&gt;incoming;</div><div class='add'>+    frag = &amp;in-&gt;frag;</div><div class='ctx'> </div><div class='add'>+    switch (frag-&gt;simple_state) {</div><div class='ctx'>         case SP_STATE_SIMPLE_MSG_INIT:</div><div class='del'>-                remaining_size = RPC_FRAGSIZE (priv-&gt;incoming.fraghdr)</div><div class='del'>-                        - priv-&gt;incoming.frag.bytes_read;</div><div class='add'>+            remaining_size = RPC_FRAGSIZE(in-&gt;fraghdr) - frag-&gt;bytes_read;</div><div class='ctx'> </div><div class='del'>-                __socket_proto_init_pending (priv, remaining_size);</div><div class='add'>+            __socket_proto_init_pending(priv, remaining_size);</div><div class='ctx'> </div><div class='del'>-                priv-&gt;incoming.frag.simple_state =</div><div class='del'>-                        SP_STATE_READING_SIMPLE_MSG;</div><div class='add'>+            frag-&gt;simple_state = SP_STATE_READING_SIMPLE_MSG;</div><div class='ctx'> </div><div class='del'>-                /* fall through */</div><div class='add'>+            /* fall through */</div><div class='ctx'> </div><div class='ctx'>         case SP_STATE_READING_SIMPLE_MSG:</div><div class='del'>-                ret = 0;</div><div class='add'>+            ret = 0;</div><div class='ctx'> </div><div class='del'>-                remaining_size = RPC_FRAGSIZE (priv-&gt;incoming.fraghdr)</div><div class='del'>-                        - priv-&gt;incoming.frag.bytes_read;</div><div class='add'>+            remaining_size = RPC_FRAGSIZE(in-&gt;fraghdr) - frag-&gt;bytes_read;</div><div class='ctx'> </div><div class='del'>-                if (remaining_size &gt; 0) {</div><div class='del'>-                        ret = __socket_readv (this,</div><div class='del'>-                                              priv-&gt;incoming.pending_vector, 1,</div><div class='del'>-                                              &amp;priv-&gt;incoming.pending_vector,</div><div class='del'>-                                              &amp;priv-&gt;incoming.pending_count,</div><div class='del'>-                                              &amp;bytes_read);</div><div class='del'>-                }</div><div class='add'>+            if (remaining_size &gt; 0) {</div><div class='add'>+                ret = __socket_readv(this, in-&gt;pending_vector, 1,</div><div class='add'>+                                     &amp;in-&gt;pending_vector, &amp;in-&gt;pending_count,</div><div class='add'>+                                     &amp;bytes_read);</div><div class='add'>+            }</div><div class='ctx'> </div><div class='del'>-                if (ret == -1) {</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_TRACE,</div><div class='del'>-                                "reading from socket failed. Error (%s), "</div><div class='del'>-                                "peer (%s)", strerror (errno),</div><div class='del'>-                                this-&gt;peerinfo.identifier);</div><div class='del'>-                        break;</div><div class='del'>-                }</div><div class='add'>+            if (ret &lt; 0) {</div><div class='add'>+                gf_log(this-&gt;name, GF_LOG_WARNING,</div><div class='add'>+                       "reading from socket failed. Error (%s), "</div><div class='add'>+                       "peer (%s)",</div><div class='add'>+                       strerror(errno), this-&gt;peerinfo.identifier);</div><div class='add'>+                break;</div><div class='add'>+            }</div><div class='ctx'> </div><div class='del'>-                priv-&gt;incoming.frag.bytes_read += bytes_read;</div><div class='del'>-                priv-&gt;incoming.frag.fragcurrent += bytes_read;</div><div class='add'>+            frag-&gt;bytes_read += bytes_read;</div><div class='add'>+            frag-&gt;fragcurrent += bytes_read;</div><div class='ctx'> </div><div class='del'>-                if (ret &gt; 0) {</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_TRACE,</div><div class='del'>-                                "partial read on non-blocking socket.");</div><div class='del'>-                        break;</div><div class='del'>-                }</div><div class='add'>+            if (ret &gt; 0) {</div><div class='add'>+                gf_log(this-&gt;name, GF_LOG_TRACE,</div><div class='add'>+                       "partial read on non-blocking socket.");</div><div class='add'>+                ret = 0;</div><div class='add'>+                break;</div><div class='add'>+            }</div><div class='ctx'> </div><div class='del'>-                if (ret == 0) {</div><div class='del'>-                        priv-&gt;incoming.frag.simple_state</div><div class='del'>-                                =  SP_STATE_SIMPLE_MSG_INIT;</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='add'>+            if (ret == 0) {</div><div class='add'>+                frag-&gt;simple_state = SP_STATE_SIMPLE_MSG_INIT;</div><div class='add'>+            }</div><div class='add'>+    }</div><div class='ctx'> </div><div class='ctx'> out:</div><div class='del'>-        return ret;</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+#define rpc_cred_addr(buf) (buf + RPC_MSGTYPE_SIZE + RPC_CALL_BODY_SIZE - 4)</div><div class='add'>+</div><div class='add'>+#define rpc_verf_addr(fragcurrent) (fragcurrent - 4)</div><div class='ctx'> </div><div class='del'>-inline int</div><div class='del'>-__socket_read_simple_request (rpc_transport_t *this)</div><div class='add'>+#define rpc_msgtype_addr(buf) (buf + 4)</div><div class='add'>+</div><div class='add'>+#define rpc_prognum_addr(buf) (buf + RPC_MSGTYPE_SIZE + 4)</div><div class='add'>+#define rpc_progver_addr(buf) (buf + RPC_MSGTYPE_SIZE + 8)</div><div class='add'>+#define rpc_procnum_addr(buf) (buf + RPC_MSGTYPE_SIZE + 12)</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+__socket_read_vectored_request(rpc_transport_t *this,</div><div class='add'>+                               rpcsvc_vector_sizer vector_sizer)</div><div class='ctx'> {</div><div class='del'>-        return __socket_read_simple_msg (this);</div><div class='del'>-}</div><div class='add'>+    socket_private_t *priv = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    uint32_t credlen = 0, verflen = 0;</div><div class='add'>+    char *addr = NULL;</div><div class='add'>+    struct iobuf *iobuf = NULL;</div><div class='add'>+    uint32_t remaining_size = 0;</div><div class='add'>+    ssize_t readsize = 0;</div><div class='add'>+    size_t size = 0;</div><div class='add'>+    struct gf_sock_incoming *in = NULL;</div><div class='add'>+    struct gf_sock_incoming_frag *frag = NULL;</div><div class='add'>+    sp_rpcfrag_request_state_t *request = NULL;</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    /* used to reduce the indirection */</div><div class='add'>+    in = &amp;priv-&gt;incoming;</div><div class='add'>+    frag = &amp;in-&gt;frag;</div><div class='add'>+    request = &amp;frag-&gt;call_body.request;</div><div class='add'>+</div><div class='add'>+    switch (request-&gt;vector_state) {</div><div class='add'>+        case SP_STATE_VECTORED_REQUEST_INIT:</div><div class='add'>+            request-&gt;vector_sizer_state = 0;</div><div class='ctx'> </div><div class='add'>+            addr = rpc_cred_addr(iobuf_ptr(in-&gt;iobuf));</div><div class='ctx'> </div><div class='del'>-#define rpc_cred_addr(buf) (buf + RPC_MSGTYPE_SIZE + RPC_CALL_BODY_SIZE - 4)</div><div class='add'>+            /* also read verf flavour and verflen */</div><div class='add'>+            credlen = ntoh32(*((uint32_t *)addr)) +</div><div class='add'>+                      RPC_AUTH_FLAVOUR_N_LENGTH_SIZE;</div><div class='ctx'> </div><div class='del'>-#define rpc_verf_addr(fragcurrent) (fragcurrent - 4)</div><div class='add'>+            __socket_proto_init_pending(priv, credlen);</div><div class='ctx'> </div><div class='add'>+            request-&gt;vector_state = SP_STATE_READING_CREDBYTES;</div><div class='ctx'> </div><div class='del'>-inline int</div><div class='del'>-__socket_read_vectored_request (rpc_transport_t *this)</div><div class='del'>-{</div><div class='del'>-        socket_private_t *priv                   = NULL;</div><div class='del'>-        int               ret                    = 0;</div><div class='del'>-        uint32_t          credlen                = 0, verflen = 0;</div><div class='del'>-        char             *addr                   = NULL;</div><div class='del'>-        struct iobuf     *iobuf                  = NULL;</div><div class='del'>-        uint32_t          remaining_size         = 0;</div><div class='del'>-        uint32_t          gluster_write_proc_len = 0;</div><div class='del'>-        gfs3_write_req    write_req              = {0, };</div><div class='add'>+            /* fall through */</div><div class='ctx'> </div><div class='del'>-        if (!this || !this-&gt;private)</div><div class='del'>-                goto out;</div><div class='add'>+        case SP_STATE_READING_CREDBYTES:</div><div class='add'>+            __socket_proto_read(priv, ret);</div><div class='ctx'> </div><div class='del'>-        priv = this-&gt;private;</div><div class='add'>+            request-&gt;vector_state = SP_STATE_READ_CREDBYTES;</div><div class='ctx'> </div><div class='del'>-        switch (priv-&gt;incoming.frag.call_body.request.vector_state) {</div><div class='del'>-        case SP_STATE_VECTORED_REQUEST_INIT:</div><div class='del'>-                addr = rpc_cred_addr (iobuf_ptr (priv-&gt;incoming.iobuf));</div><div class='add'>+            /* fall through */</div><div class='ctx'> </div><div class='del'>-                /* also read verf flavour and verflen */</div><div class='del'>-                credlen = ntoh32 (*((uint32_t *)addr))</div><div class='del'>-                        +  RPC_AUTH_FLAVOUR_N_LENGTH_SIZE;</div><div class='add'>+        case SP_STATE_READ_CREDBYTES:</div><div class='add'>+            addr = rpc_verf_addr(frag-&gt;fragcurrent);</div><div class='add'>+            verflen = ntoh32(*((uint32_t *)addr));</div><div class='ctx'> </div><div class='del'>-                __socket_proto_init_pending (priv, credlen);</div><div class='add'>+            if (verflen == 0) {</div><div class='add'>+                request-&gt;vector_state = SP_STATE_READ_VERFBYTES;</div><div class='add'>+                goto sp_state_read_verfbytes;</div><div class='add'>+            }</div><div class='add'>+            __socket_proto_init_pending(priv, verflen);</div><div class='ctx'> </div><div class='del'>-                priv-&gt;incoming.frag.call_body.request.vector_state =</div><div class='del'>-                        SP_STATE_READING_CREDBYTES;</div><div class='add'>+            request-&gt;vector_state = SP_STATE_READING_VERFBYTES;</div><div class='ctx'> </div><div class='del'>-                /* fall through */</div><div class='add'>+            /* fall through */</div><div class='ctx'> </div><div class='del'>-        case SP_STATE_READING_CREDBYTES:</div><div class='del'>-                __socket_proto_read (priv, ret);</div><div class='add'>+        case SP_STATE_READING_VERFBYTES:</div><div class='add'>+            __socket_proto_read(priv, ret);</div><div class='ctx'> </div><div class='del'>-                priv-&gt;incoming.frag.call_body.request.vector_state =</div><div class='del'>-                        SP_STATE_READ_CREDBYTES;</div><div class='add'>+            request-&gt;vector_state = SP_STATE_READ_VERFBYTES;</div><div class='ctx'> </div><div class='del'>-                /* fall through */</div><div class='add'>+            /* fall through */</div><div class='ctx'> </div><div class='del'>-        case SP_STATE_READ_CREDBYTES:</div><div class='del'>-                addr = rpc_verf_addr (priv-&gt;incoming.frag.fragcurrent);</div><div class='add'>+        case SP_STATE_READ_VERFBYTES:</div><div class='add'>+        sp_state_read_verfbytes:</div><div class='add'>+            /* set the base_addr 'persistently' across multiple calls</div><div class='add'>+               into the state machine */</div><div class='add'>+            in-&gt;proghdr_base_addr = frag-&gt;fragcurrent;</div><div class='ctx'> </div><div class='del'>-                /* FIXME: Also handle procedures other than glusterfs-write</div><div class='del'>-                 * here</div><div class='del'>-                 */</div><div class='del'>-                /* also read proc-header */</div><div class='del'>-                gluster_write_proc_len = xdr_sizeof ((xdrproc_t) xdr_gfs3_write_req,</div><div class='del'>-                                                     &amp;write_req);</div><div class='add'>+            request-&gt;vector_sizer_state = vector_sizer(</div><div class='add'>+                request-&gt;vector_sizer_state, &amp;readsize, in-&gt;proghdr_base_addr,</div><div class='add'>+                frag-&gt;fragcurrent);</div><div class='add'>+            __socket_proto_init_pending(priv, readsize);</div><div class='ctx'> </div><div class='del'>-                if (gluster_write_proc_len == 0) {</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-                                "xdr_sizeof on gfs3_write_req failed");</div><div class='del'>-                        ret = -1;</div><div class='del'>-                        goto out;</div><div class='del'>-                }</div><div class='add'>+            request-&gt;vector_state = SP_STATE_READING_PROGHDR;</div><div class='ctx'> </div><div class='del'>-                verflen = ntoh32 (*((uint32_t *)addr))</div><div class='del'>-                        + gluster_write_proc_len;</div><div class='add'>+            /* fall through */</div><div class='ctx'> </div><div class='del'>-                __socket_proto_init_pending (priv, verflen);</div><div class='add'>+        case SP_STATE_READING_PROGHDR:</div><div class='add'>+            __socket_proto_read(priv, ret);</div><div class='ctx'> </div><div class='del'>-                priv-&gt;incoming.frag.call_body.request.vector_state</div><div class='del'>-                        = SP_STATE_READING_VERFBYTES;</div><div class='add'>+            request-&gt;vector_state = SP_STATE_READ_PROGHDR;</div><div class='ctx'> </div><div class='del'>-                /* fall through */</div><div class='add'>+            /* fall through */</div><div class='ctx'> </div><div class='del'>-        case SP_STATE_READING_VERFBYTES:</div><div class='del'>-                __socket_proto_read (priv, ret);</div><div class='add'>+        case SP_STATE_READ_PROGHDR:</div><div class='add'>+        sp_state_read_proghdr:</div><div class='add'>+            request-&gt;vector_sizer_state = vector_sizer(</div><div class='add'>+                request-&gt;vector_sizer_state, &amp;readsize, in-&gt;proghdr_base_addr,</div><div class='add'>+                frag-&gt;fragcurrent);</div><div class='add'>+            if (readsize == 0) {</div><div class='add'>+                request-&gt;vector_state = SP_STATE_READ_PROGHDR_XDATA;</div><div class='add'>+                goto sp_state_read_proghdr_xdata;</div><div class='add'>+            }</div><div class='ctx'> </div><div class='del'>-                priv-&gt;incoming.frag.call_body.request.vector_state =</div><div class='del'>-                        SP_STATE_READ_VERFBYTES;</div><div class='add'>+            __socket_proto_init_pending(priv, readsize);</div><div class='ctx'> </div><div class='del'>-                /* fall through */</div><div class='add'>+            request-&gt;vector_state = SP_STATE_READING_PROGHDR_XDATA;</div><div class='ctx'> </div><div class='del'>-        case SP_STATE_READ_VERFBYTES:</div><div class='del'>-                if (priv-&gt;incoming.payload_vector.iov_base == NULL) {</div><div class='del'>-                        iobuf = iobuf_get (this-&gt;ctx-&gt;iobuf_pool);</div><div class='del'>-                        if (!iobuf) {</div><div class='del'>-                                gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-                                        "unable to allocate IO buffer "</div><div class='del'>-                                        "for peer %s",</div><div class='del'>-                                        this-&gt;peerinfo.identifier);</div><div class='del'>-                                ret = -1;</div><div class='del'>-                                break;</div><div class='del'>-                        }</div><div class='add'>+            /* fall through */</div><div class='ctx'> </div><div class='del'>-                        if (priv-&gt;incoming.iobref == NULL) {</div><div class='del'>-                                priv-&gt;incoming.iobref = iobref_new ();</div><div class='del'>-                                if (priv-&gt;incoming.iobref == NULL) {</div><div class='del'>-                                        gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-                                                "out of memory");</div><div class='del'>-                                        ret = -1;</div><div class='del'>-                                        iobuf_unref (iobuf);</div><div class='del'>-                                        break;</div><div class='del'>-                                }</div><div class='del'>-                        }</div><div class='add'>+        case SP_STATE_READING_PROGHDR_XDATA:</div><div class='add'>+            __socket_proto_read(priv, ret);</div><div class='ctx'> </div><div class='del'>-                        iobref_add (priv-&gt;incoming.iobref, iobuf);</div><div class='del'>-                        iobuf_unref (iobuf);</div><div class='add'>+            request-&gt;vector_state = SP_STATE_READ_PROGHDR;</div><div class='add'>+            /* check if the vector_sizer() has more to say */</div><div class='add'>+            goto sp_state_read_proghdr;</div><div class='ctx'> </div><div class='del'>-                        priv-&gt;incoming.payload_vector.iov_base</div><div class='del'>-                                = iobuf_ptr (iobuf);</div><div class='add'>+        case SP_STATE_READ_PROGHDR_XDATA:</div><div class='add'>+        sp_state_read_proghdr_xdata:</div><div class='add'>+            if (in-&gt;payload_vector.iov_base == NULL) {</div><div class='add'>+                size = RPC_FRAGSIZE(in-&gt;fraghdr) - frag-&gt;bytes_read;</div><div class='add'>+                iobuf = iobuf_get2(this-&gt;ctx-&gt;iobuf_pool, size);</div><div class='add'>+                if (!iobuf) {</div><div class='add'>+                    ret = -1;</div><div class='add'>+                    break;</div><div class='add'>+                }</div><div class='ctx'> </div><div class='del'>-                        priv-&gt;incoming.frag.fragcurrent = iobuf_ptr (iobuf);</div><div class='add'>+                if (in-&gt;iobref == NULL) {</div><div class='add'>+                    in-&gt;iobref = iobref_new();</div><div class='add'>+                    if (in-&gt;iobref == NULL) {</div><div class='add'>+                        ret = -1;</div><div class='add'>+                        iobuf_unref(iobuf);</div><div class='add'>+                        break;</div><div class='add'>+                    }</div><div class='ctx'>                 }</div><div class='ctx'> </div><div class='del'>-                priv-&gt;incoming.frag.call_body.request.vector_state =</div><div class='del'>-                        SP_STATE_READING_PROG;</div><div class='add'>+                iobref_add(in-&gt;iobref, iobuf);</div><div class='ctx'> </div><div class='del'>-                /* fall through */</div><div class='add'>+                in-&gt;payload_vector.iov_base = iobuf_ptr(iobuf);</div><div class='add'>+                frag-&gt;fragcurrent = iobuf_ptr(iobuf);</div><div class='add'>+</div><div class='add'>+                iobuf_unref(iobuf);</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            request-&gt;vector_state = SP_STATE_READING_PROG;</div><div class='add'>+</div><div class='add'>+            /* fall through */</div><div class='ctx'> </div><div class='ctx'>         case SP_STATE_READING_PROG:</div><div class='del'>-                /* now read the remaining rpc msg into buffer pointed by</div><div class='del'>-                 * fragcurrent</div><div class='del'>-                 */</div><div class='add'>+            /* now read the remaining rpc msg into buffer pointed by</div><div class='add'>+             * fragcurrent</div><div class='add'>+             */</div><div class='ctx'> </div><div class='del'>-                ret = __socket_read_simple_msg (this);</div><div class='del'>-</div><div class='del'>-                remaining_size = RPC_FRAGSIZE (priv-&gt;incoming.fraghdr)</div><div class='del'>-                        - priv-&gt;incoming.frag.bytes_read;</div><div class='del'>-</div><div class='del'>-                if ((ret == -1)</div><div class='del'>-                    || ((ret == 0)</div><div class='del'>-                        &amp;&amp; (remaining_size == 0)</div><div class='del'>-                        &amp;&amp; RPC_LASTFRAG (priv-&gt;incoming.fraghdr))) {</div><div class='del'>-                        priv-&gt;incoming.frag.call_body.request.vector_state</div><div class='del'>-                                = SP_STATE_VECTORED_REQUEST_INIT;</div><div class='del'>-                        priv-&gt;incoming.payload_vector.iov_len</div><div class='del'>-                                = (unsigned long)priv-&gt;incoming.frag.fragcurrent</div><div class='del'>-                                - (unsigned long)</div><div class='del'>-                                priv-&gt;incoming.payload_vector.iov_base;</div><div class='del'>-                }</div><div class='del'>-                break;</div><div class='del'>-        }</div><div class='add'>+            ret = __socket_read_simple_msg(this);</div><div class='ctx'> </div><div class='del'>-out:</div><div class='del'>-        return ret;</div><div class='add'>+            remaining_size = RPC_FRAGSIZE(in-&gt;fraghdr) - frag-&gt;bytes_read;</div><div class='add'>+</div><div class='add'>+            if ((ret &lt; 0) || ((ret == 0) &amp;&amp; (remaining_size == 0) &amp;&amp;</div><div class='add'>+                              RPC_LASTFRAG(in-&gt;fraghdr))) {</div><div class='add'>+                request-&gt;vector_state = SP_STATE_VECTORED_REQUEST_INIT;</div><div class='add'>+                in-&gt;payload_vector.iov_len = ((unsigned long)frag-&gt;fragcurrent -</div><div class='add'>+                                              (unsigned long)</div><div class='add'>+                                                  in-&gt;payload_vector.iov_base);</div><div class='add'>+            }</div><div class='add'>+            break;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+static int</div><div class='add'>+__socket_read_request(rpc_transport_t *this)</div><div class='add'>+{</div><div class='add'>+    socket_private_t *priv = NULL;</div><div class='add'>+    uint32_t prognum = 0, procnum = 0, progver = 0;</div><div class='add'>+    uint32_t remaining_size = 0;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    char *buf = NULL;</div><div class='add'>+    rpcsvc_vector_sizer vector_sizer = NULL;</div><div class='add'>+    struct gf_sock_incoming *in = NULL;</div><div class='add'>+    struct gf_sock_incoming_frag *frag = NULL;</div><div class='add'>+    sp_rpcfrag_request_state_t *request = NULL;</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    /* used to reduce the indirection */</div><div class='add'>+    in = &amp;priv-&gt;incoming;</div><div class='add'>+    frag = &amp;in-&gt;frag;</div><div class='add'>+    request = &amp;frag-&gt;call_body.request;</div><div class='add'>+</div><div class='add'>+    switch (request-&gt;header_state) {</div><div class='add'>+        case SP_STATE_REQUEST_HEADER_INIT:</div><div class='ctx'> </div><div class='del'>-#define rpc_msgtype_addr(buf) (buf + 4)</div><div class='add'>+            __socket_proto_init_pending(priv, RPC_CALL_BODY_SIZE);</div><div class='ctx'> </div><div class='del'>-#define rpc_prognum_addr(buf) (buf + RPC_MSGTYPE_SIZE + 4)</div><div class='add'>+            request-&gt;header_state = SP_STATE_READING_RPCHDR1;</div><div class='ctx'> </div><div class='del'>-#define rpc_procnum_addr(buf) (buf + RPC_MSGTYPE_SIZE + 12)</div><div class='add'>+            /* fall through */</div><div class='add'>+</div><div class='add'>+        case SP_STATE_READING_RPCHDR1:</div><div class='add'>+            __socket_proto_read(priv, ret);</div><div class='add'>+</div><div class='add'>+            request-&gt;header_state = SP_STATE_READ_RPCHDR1;</div><div class='add'>+</div><div class='add'>+            /* fall through */</div><div class='add'>+</div><div class='add'>+        case SP_STATE_READ_RPCHDR1:</div><div class='add'>+            buf = rpc_prognum_addr(iobuf_ptr(in-&gt;iobuf));</div><div class='add'>+            prognum = ntoh32(*((uint32_t *)buf));</div><div class='add'>+</div><div class='add'>+            buf = rpc_progver_addr(iobuf_ptr(in-&gt;iobuf));</div><div class='add'>+            progver = ntoh32(*((uint32_t *)buf));</div><div class='add'>+</div><div class='add'>+            buf = rpc_procnum_addr(iobuf_ptr(in-&gt;iobuf));</div><div class='add'>+            procnum = ntoh32(*((uint32_t *)buf));</div><div class='add'>+</div><div class='add'>+            if (priv-&gt;is_server) {</div><div class='add'>+                /* this check is needed as rpcsvc and rpc-clnt</div><div class='add'>+                 * actor structures are not same */</div><div class='add'>+                vector_sizer = rpcsvc_get_program_vector_sizer(</div><div class='add'>+                    (rpcsvc_t *)this-&gt;mydata, prognum, progver, procnum);</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            if (vector_sizer) {</div><div class='add'>+                ret = __socket_read_vectored_request(this, vector_sizer);</div><div class='add'>+            } else {</div><div class='add'>+                ret = __socket_read_simple_msg(this);</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            remaining_size = RPC_FRAGSIZE(in-&gt;fraghdr) - frag-&gt;bytes_read;</div><div class='ctx'> </div><div class='add'>+            if ((ret &lt; 0) || ((ret == 0) &amp;&amp; (remaining_size == 0) &amp;&amp;</div><div class='add'>+                              (RPC_LASTFRAG(in-&gt;fraghdr)))) {</div><div class='add'>+                request-&gt;header_state = SP_STATE_REQUEST_HEADER_INIT;</div><div class='add'>+            }</div><div class='ctx'> </div><div class='del'>-inline int</div><div class='del'>-__socket_read_request (rpc_transport_t *this)</div><div class='add'>+            break;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+__socket_read_accepted_successful_reply(rpc_transport_t *this)</div><div class='ctx'> {</div><div class='del'>-        socket_private_t *priv               = NULL;</div><div class='del'>-        uint32_t          prognum            = 0, procnum = 0;</div><div class='del'>-        uint32_t          remaining_size     = 0;</div><div class='del'>-        int               ret                = -1;</div><div class='del'>-        char             *buf                = NULL;</div><div class='add'>+    socket_private_t *priv = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    struct iobuf *iobuf = NULL;</div><div class='add'>+    gfs3_read_rsp read_rsp = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    ssize_t size = 0;</div><div class='add'>+    ssize_t default_read_size = 0;</div><div class='add'>+    XDR xdr;</div><div class='add'>+    struct gf_sock_incoming *in = NULL;</div><div class='add'>+    struct gf_sock_incoming_frag *frag = NULL;</div><div class='add'>+    uint32_t remaining_size = 0;</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    /* used to reduce the indirection */</div><div class='add'>+    in = &amp;priv-&gt;incoming;</div><div class='add'>+    frag = &amp;in-&gt;frag;</div><div class='add'>+</div><div class='add'>+    switch (frag-&gt;call_body.reply.accepted_success_state) {</div><div class='add'>+        case SP_STATE_ACCEPTED_SUCCESS_REPLY_INIT:</div><div class='add'>+            default_read_size = xdr_sizeof((xdrproc_t)xdr_gfs3_read_rsp,</div><div class='add'>+                                           &amp;read_rsp);</div><div class='ctx'> </div><div class='del'>-        if (!this || !this-&gt;private)</div><div class='del'>-                goto out;</div><div class='add'>+            /* We need to store the current base address because we will</div><div class='add'>+             * need it after a partial read. */</div><div class='add'>+            in-&gt;proghdr_base_addr = frag-&gt;fragcurrent;</div><div class='ctx'> </div><div class='del'>-        priv = this-&gt;private;</div><div class='add'>+            __socket_proto_init_pending(priv, default_read_size);</div><div class='ctx'> </div><div class='del'>-        switch (priv-&gt;incoming.frag.call_body.request.header_state) {</div><div class='add'>+            frag-&gt;call_body.reply</div><div class='add'>+                .accepted_success_state = SP_STATE_READING_PROC_HEADER;</div><div class='ctx'> </div><div class='del'>-        case SP_STATE_REQUEST_HEADER_INIT:</div><div class='add'>+            /* fall through */</div><div class='add'>+</div><div class='add'>+        case SP_STATE_READING_PROC_HEADER:</div><div class='add'>+            __socket_proto_read(priv, ret);</div><div class='ctx'> </div><div class='del'>-                __socket_proto_init_pending (priv, RPC_CALL_BODY_SIZE);</div><div class='add'>+            /* there can be 'xdata' in read response, figure it out */</div><div class='add'>+            default_read_size = frag-&gt;fragcurrent - in-&gt;proghdr_base_addr;</div><div class='add'>+            xdrmem_create(&amp;xdr, in-&gt;proghdr_base_addr, default_read_size,</div><div class='add'>+                          XDR_DECODE);</div><div class='ctx'> </div><div class='del'>-                priv-&gt;incoming.frag.call_body.request.header_state</div><div class='del'>-                        = SP_STATE_READING_RPCHDR1;</div><div class='add'>+            /* This will fail if there is xdata sent from server, if not,</div><div class='add'>+               well and good, we don't need to worry about  */</div><div class='add'>+            xdr_gfs3_read_rsp(&amp;xdr, &amp;read_rsp);</div><div class='ctx'> </div><div class='del'>-                /* fall through */</div><div class='add'>+            free(read_rsp.xdata.xdata_val);</div><div class='ctx'> </div><div class='del'>-        case SP_STATE_READING_RPCHDR1:</div><div class='del'>-                __socket_proto_read (priv, ret);</div><div class='add'>+            /* need to round off to proper gf_roof (%4), as XDR packing pads</div><div class='add'>+               the end of opaque object with '0' */</div><div class='add'>+            size = gf_roof(read_rsp.xdata.xdata_len, 4);</div><div class='ctx'> </div><div class='del'>-                priv-&gt;incoming.frag.call_body.request.header_state =</div><div class='del'>-                        SP_STATE_READ_RPCHDR1;</div><div class='add'>+            if (!size) {</div><div class='add'>+                frag-&gt;call_body.reply</div><div class='add'>+                    .accepted_success_state = SP_STATE_READ_PROC_OPAQUE;</div><div class='add'>+                goto read_proc_opaque;</div><div class='add'>+            }</div><div class='ctx'> </div><div class='del'>-                /* fall through */</div><div class='add'>+            __socket_proto_init_pending(priv, size);</div><div class='ctx'> </div><div class='del'>-        case SP_STATE_READ_RPCHDR1:</div><div class='del'>-                buf = rpc_prognum_addr (iobuf_ptr (priv-&gt;incoming.iobuf));</div><div class='del'>-                prognum = ntoh32 (*((uint32_t *)buf));</div><div class='add'>+            frag-&gt;call_body.reply</div><div class='add'>+                .accepted_success_state = SP_STATE_READING_PROC_OPAQUE;</div><div class='add'>+            /* fall through */</div><div class='ctx'> </div><div class='del'>-                buf = rpc_procnum_addr (iobuf_ptr (priv-&gt;incoming.iobuf));</div><div class='del'>-                procnum = ntoh32 (*((uint32_t *)buf));</div><div class='add'>+        case SP_STATE_READING_PROC_OPAQUE:</div><div class='add'>+            __socket_proto_read(priv, ret);</div><div class='ctx'> </div><div class='del'>-                if ((prognum == GLUSTER3_1_FOP_PROGRAM)</div><div class='del'>-                    &amp;&amp; (procnum == GF_FOP_WRITE)) {</div><div class='del'>-                        ret = __socket_read_vectored_request (this);</div><div class='del'>-                } else {</div><div class='del'>-                        ret = __socket_read_simple_request (this);</div><div class='add'>+            frag-&gt;call_body.reply</div><div class='add'>+                .accepted_success_state = SP_STATE_READ_PROC_OPAQUE;</div><div class='add'>+            /* fall through */</div><div class='add'>+</div><div class='add'>+        case SP_STATE_READ_PROC_OPAQUE:</div><div class='add'>+        read_proc_opaque:</div><div class='add'>+            if (in-&gt;payload_vector.iov_base == NULL) {</div><div class='add'>+                size = (RPC_FRAGSIZE(in-&gt;fraghdr) - frag-&gt;bytes_read);</div><div class='add'>+</div><div class='add'>+                iobuf = iobuf_get2(this-&gt;ctx-&gt;iobuf_pool, size);</div><div class='add'>+                if (iobuf == NULL) {</div><div class='add'>+                    ret = -1;</div><div class='add'>+                    goto out;</div><div class='ctx'>                 }</div><div class='ctx'> </div><div class='del'>-                remaining_size = RPC_FRAGSIZE (priv-&gt;incoming.fraghdr)</div><div class='del'>-                        - priv-&gt;incoming.frag.bytes_read;</div><div class='add'>+                if (in-&gt;iobref == NULL) {</div><div class='add'>+                    in-&gt;iobref = iobref_new();</div><div class='add'>+                    if (in-&gt;iobref == NULL) {</div><div class='add'>+                        ret = -1;</div><div class='add'>+                        iobuf_unref(iobuf);</div><div class='add'>+                        goto out;</div><div class='add'>+                    }</div><div class='add'>+                }</div><div class='ctx'> </div><div class='del'>-                if ((ret == -1)</div><div class='del'>-                    || ((ret == 0)</div><div class='del'>-                        &amp;&amp; (remaining_size == 0)</div><div class='del'>-                        &amp;&amp; (RPC_LASTFRAG (priv-&gt;incoming.fraghdr)))) {</div><div class='del'>-                        priv-&gt;incoming.frag.call_body.request.header_state =</div><div class='del'>-                                SP_STATE_REQUEST_HEADER_INIT;</div><div class='add'>+                ret = iobref_add(in-&gt;iobref, iobuf);</div><div class='add'>+                iobuf_unref(iobuf);</div><div class='add'>+                if (ret &lt; 0) {</div><div class='add'>+                    goto out;</div><div class='ctx'>                 }</div><div class='ctx'> </div><div class='del'>-                break;</div><div class='del'>-        }</div><div class='add'>+                in-&gt;payload_vector.iov_base = iobuf_ptr(iobuf);</div><div class='add'>+                in-&gt;payload_vector.iov_len = size;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            frag-&gt;fragcurrent = in-&gt;payload_vector.iov_base;</div><div class='add'>+</div><div class='add'>+            frag-&gt;call_body.reply</div><div class='add'>+                .accepted_success_state = SP_STATE_READ_PROC_HEADER;</div><div class='add'>+</div><div class='add'>+            /* fall through */</div><div class='add'>+</div><div class='add'>+        case SP_STATE_READ_PROC_HEADER:</div><div class='add'>+            /* now read the entire remaining msg into new iobuf */</div><div class='add'>+            ret = __socket_read_simple_msg(this);</div><div class='add'>+            remaining_size = RPC_FRAGSIZE(in-&gt;fraghdr) - frag-&gt;bytes_read;</div><div class='add'>+            if ((ret &lt; 0) || ((ret == 0) &amp;&amp; (remaining_size == 0) &amp;&amp;</div><div class='add'>+                              RPC_LASTFRAG(in-&gt;fraghdr))) {</div><div class='add'>+                frag-&gt;call_body.reply.accepted_success_state =</div><div class='add'>+                    SP_STATE_ACCEPTED_SUCCESS_REPLY_INIT;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            break;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='ctx'> out:</div><div class='del'>-        return ret;</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='del'>-inline int</div><div class='del'>-__socket_read_accepted_successful_reply (rpc_transport_t *this)</div><div class='add'>+static int</div><div class='add'>+__socket_read_accepted_successful_reply_v2(rpc_transport_t *this)</div><div class='ctx'> {</div><div class='del'>-        socket_private_t *priv                     = NULL;</div><div class='del'>-        int               ret                      = 0;</div><div class='del'>-        struct iobuf     *iobuf                    = NULL;</div><div class='del'>-        uint32_t          gluster_read_rsp_hdr_len = 0;</div><div class='del'>-        gfs3_read_rsp     read_rsp                 = {0, };</div><div class='add'>+    socket_private_t *priv = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    struct iobuf *iobuf = NULL;</div><div class='add'>+    gfx_read_rsp read_rsp = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    ssize_t size = 0;</div><div class='add'>+    ssize_t default_read_size = 0;</div><div class='add'>+    XDR xdr;</div><div class='add'>+    struct gf_sock_incoming *in = NULL;</div><div class='add'>+    struct gf_sock_incoming_frag *frag = NULL;</div><div class='add'>+    uint32_t remaining_size = 0;</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    /* used to reduce the indirection */</div><div class='add'>+    in = &amp;priv-&gt;incoming;</div><div class='add'>+    frag = &amp;in-&gt;frag;</div><div class='add'>+</div><div class='add'>+    switch (frag-&gt;call_body.reply.accepted_success_state) {</div><div class='add'>+        case SP_STATE_ACCEPTED_SUCCESS_REPLY_INIT:</div><div class='add'>+            default_read_size = xdr_sizeof((xdrproc_t)xdr_gfx_read_rsp,</div><div class='add'>+                                           &amp;read_rsp);</div><div class='ctx'> </div><div class='del'>-        if (!this || !this-&gt;private)</div><div class='del'>-                goto out;</div><div class='add'>+            /* We need to store the current base address because we will</div><div class='add'>+             * need it after a partial read. */</div><div class='add'>+            in-&gt;proghdr_base_addr = frag-&gt;fragcurrent;</div><div class='ctx'> </div><div class='del'>-        priv = this-&gt;private;</div><div class='add'>+            __socket_proto_init_pending(priv, default_read_size);</div><div class='ctx'> </div><div class='del'>-        switch (priv-&gt;incoming.frag.call_body.reply.accepted_success_state) {</div><div class='add'>+            frag-&gt;call_body.reply</div><div class='add'>+                .accepted_success_state = SP_STATE_READING_PROC_HEADER;</div><div class='ctx'> </div><div class='del'>-        case SP_STATE_ACCEPTED_SUCCESS_REPLY_INIT:</div><div class='del'>-                gluster_read_rsp_hdr_len = xdr_sizeof ((xdrproc_t) xdr_gfs3_read_rsp,</div><div class='del'>-                                                       &amp;read_rsp);</div><div class='add'>+            /* fall through */</div><div class='ctx'> </div><div class='del'>-                if (gluster_read_rsp_hdr_len == 0) {</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-                                "xdr_sizeof on gfs3_read_rsp failed");</div><div class='del'>-                        ret = -1;</div><div class='del'>-                        goto out;</div><div class='del'>-                } </div><div class='del'>-                __socket_proto_init_pending (priv, gluster_read_rsp_hdr_len);</div><div class='add'>+        case SP_STATE_READING_PROC_HEADER:</div><div class='add'>+            __socket_proto_read(priv, ret);</div><div class='ctx'> </div><div class='del'>-                priv-&gt;incoming.frag.call_body.reply.accepted_success_state</div><div class='del'>-                        = SP_STATE_READING_PROC_HEADER;</div><div class='add'>+            /* there can be 'xdata' in read response, figure it out */</div><div class='add'>+            default_read_size = frag-&gt;fragcurrent - in-&gt;proghdr_base_addr;</div><div class='ctx'> </div><div class='del'>-                /* fall through */</div><div class='add'>+            xdrmem_create(&amp;xdr, in-&gt;proghdr_base_addr, default_read_size,</div><div class='add'>+                          XDR_DECODE);</div><div class='ctx'> </div><div class='del'>-        case SP_STATE_READING_PROC_HEADER:</div><div class='del'>-                __socket_proto_read (priv, ret);</div><div class='add'>+            /* This will fail if there is xdata sent from server, if not,</div><div class='add'>+               well and good, we don't need to worry about  */</div><div class='add'>+            xdr_gfx_read_rsp(&amp;xdr, &amp;read_rsp);</div><div class='ctx'> </div><div class='del'>-                priv-&gt;incoming.frag.call_body.reply.accepted_success_state</div><div class='del'>-                        = SP_STATE_READ_PROC_HEADER;</div><div class='add'>+            free(read_rsp.xdata.pairs.pairs_val);</div><div class='ctx'> </div><div class='del'>-                /* fall through */</div><div class='add'>+            /* need to round off to proper gf_roof (%4), as XDR packing pads</div><div class='add'>+               the end of opaque object with '0' */</div><div class='add'>+            size = gf_roof(read_rsp.xdata.xdr_size, 4);</div><div class='ctx'> </div><div class='del'>-        case SP_STATE_READ_PROC_HEADER:</div><div class='del'>-                if (priv-&gt;incoming.payload_vector.iov_base == NULL) {</div><div class='del'>-                        iobuf = iobuf_get (this-&gt;ctx-&gt;iobuf_pool);</div><div class='del'>-                        if (iobuf == NULL) {</div><div class='del'>-                                ret = -1;</div><div class='del'>-                                goto out;</div><div class='del'>-                        }</div><div class='add'>+            if (!size) {</div><div class='add'>+                frag-&gt;call_body.reply</div><div class='add'>+                    .accepted_success_state = SP_STATE_READ_PROC_OPAQUE;</div><div class='add'>+                goto read_proc_opaque;</div><div class='add'>+            }</div><div class='ctx'> </div><div class='del'>-                        if (priv-&gt;incoming.iobref == NULL) {</div><div class='del'>-                                priv-&gt;incoming.iobref = iobref_new ();</div><div class='del'>-                                if (priv-&gt;incoming.iobref == NULL) {</div><div class='del'>-                                        ret = -1;</div><div class='del'>-                                        iobuf_unref (iobuf);</div><div class='del'>-                                        goto out;</div><div class='del'>-                                }</div><div class='del'>-                        }</div><div class='add'>+            __socket_proto_init_pending(priv, size);</div><div class='add'>+</div><div class='add'>+            frag-&gt;call_body.reply</div><div class='add'>+                .accepted_success_state = SP_STATE_READING_PROC_OPAQUE;</div><div class='add'>+            /* fall through */</div><div class='ctx'> </div><div class='del'>-                        iobref_add (priv-&gt;incoming.iobref, iobuf);</div><div class='del'>-                        iobuf_unref (iobuf);</div><div class='add'>+        case SP_STATE_READING_PROC_OPAQUE:</div><div class='add'>+            __socket_proto_read(priv, ret);</div><div class='ctx'> </div><div class='del'>-                        priv-&gt;incoming.payload_vector.iov_base</div><div class='del'>-                                = iobuf_ptr (iobuf);</div><div class='add'>+            frag-&gt;call_body.reply</div><div class='add'>+                .accepted_success_state = SP_STATE_READ_PROC_OPAQUE;</div><div class='add'>+            /* fall through */</div><div class='add'>+</div><div class='add'>+        case SP_STATE_READ_PROC_OPAQUE:</div><div class='add'>+        read_proc_opaque:</div><div class='add'>+            if (in-&gt;payload_vector.iov_base == NULL) {</div><div class='add'>+                size = (RPC_FRAGSIZE(in-&gt;fraghdr) - frag-&gt;bytes_read);</div><div class='add'>+</div><div class='add'>+                iobuf = iobuf_get2(this-&gt;ctx-&gt;iobuf_pool, size);</div><div class='add'>+                if (iobuf == NULL) {</div><div class='add'>+                    ret = -1;</div><div class='add'>+                    goto out;</div><div class='ctx'>                 }</div><div class='ctx'> </div><div class='del'>-                priv-&gt;incoming.frag.fragcurrent</div><div class='del'>-                        = priv-&gt;incoming.payload_vector.iov_base;</div><div class='add'>+                if (in-&gt;iobref == NULL) {</div><div class='add'>+                    in-&gt;iobref = iobref_new();</div><div class='add'>+                    if (in-&gt;iobref == NULL) {</div><div class='add'>+                        ret = -1;</div><div class='add'>+                        iobuf_unref(iobuf);</div><div class='add'>+                        goto out;</div><div class='add'>+                    }</div><div class='add'>+                }</div><div class='ctx'> </div><div class='del'>-                /* now read the entire remaining msg into new iobuf */</div><div class='del'>-                ret = __socket_read_simple_msg (this);</div><div class='del'>-                if ((ret == -1)</div><div class='del'>-                    || ((ret == 0)</div><div class='del'>-                        &amp;&amp; RPC_LASTFRAG (priv-&gt;incoming.fraghdr))) {</div><div class='del'>-                        priv-&gt;incoming.frag.call_body.reply.accepted_success_state</div><div class='del'>-                                = SP_STATE_ACCEPTED_SUCCESS_REPLY_INIT;</div><div class='add'>+                ret = iobref_add(in-&gt;iobref, iobuf);</div><div class='add'>+                iobuf_unref(iobuf);</div><div class='add'>+                if (ret &lt; 0) {</div><div class='add'>+                    goto out;</div><div class='ctx'>                 }</div><div class='ctx'> </div><div class='del'>-                break;</div><div class='del'>-        }</div><div class='add'>+                in-&gt;payload_vector.iov_base = iobuf_ptr(iobuf);</div><div class='add'>+                in-&gt;payload_vector.iov_len = size;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            frag-&gt;fragcurrent = in-&gt;payload_vector.iov_base;</div><div class='add'>+</div><div class='add'>+            frag-&gt;call_body.reply</div><div class='add'>+                .accepted_success_state = SP_STATE_READ_PROC_HEADER;</div><div class='add'>+</div><div class='add'>+            /* fall through */</div><div class='add'>+</div><div class='add'>+        case SP_STATE_READ_PROC_HEADER:</div><div class='add'>+            /* now read the entire remaining msg into new iobuf */</div><div class='add'>+            ret = __socket_read_simple_msg(this);</div><div class='add'>+            remaining_size = RPC_FRAGSIZE(in-&gt;fraghdr) - frag-&gt;bytes_read;</div><div class='add'>+            if ((ret &lt; 0) || ((ret == 0) &amp;&amp; (remaining_size == 0) &amp;&amp;</div><div class='add'>+                              RPC_LASTFRAG(in-&gt;fraghdr))) {</div><div class='add'>+                frag-&gt;call_body.reply.accepted_success_state =</div><div class='add'>+                    SP_STATE_ACCEPTED_SUCCESS_REPLY_INIT;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            break;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='ctx'> out:</div><div class='del'>-        return ret;</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> #define rpc_reply_verflen_addr(fragcurrent) ((char *)fragcurrent - 4)</div><div class='ctx'> #define rpc_reply_accept_status_addr(fragcurrent) ((char *)fragcurrent - 4)</div><div class='ctx'> </div><div class='del'>-inline int</div><div class='del'>-__socket_read_accepted_reply (rpc_transport_t *this)</div><div class='add'>+static int</div><div class='add'>+__socket_read_accepted_reply(rpc_transport_t *this)</div><div class='ctx'> {</div><div class='del'>-        socket_private_t *priv           = NULL;</div><div class='del'>-        int               ret            = -1;</div><div class='del'>-        char             *buf            = NULL;</div><div class='del'>-        uint32_t          verflen        = 0, len = 0;</div><div class='del'>-        uint32_t          remaining_size = 0;</div><div class='del'>-</div><div class='del'>-        if (!this || !this-&gt;private)</div><div class='del'>-                goto out;</div><div class='del'>-</div><div class='del'>-        priv = this-&gt;private;</div><div class='del'>-</div><div class='del'>-        switch (priv-&gt;incoming.frag.call_body.reply.accepted_state) {</div><div class='del'>-</div><div class='add'>+    socket_private_t *priv = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    char *buf = NULL;</div><div class='add'>+    uint32_t verflen = 0, len = 0;</div><div class='add'>+    uint32_t remaining_size = 0;</div><div class='add'>+    struct gf_sock_incoming *in = NULL;</div><div class='add'>+    struct gf_sock_incoming_frag *frag = NULL;</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+    /* used to reduce the indirection */</div><div class='add'>+    in = &amp;priv-&gt;incoming;</div><div class='add'>+    frag = &amp;in-&gt;frag;</div><div class='add'>+</div><div class='add'>+    switch (frag-&gt;call_body.reply.accepted_state) {</div><div class='ctx'>         case SP_STATE_ACCEPTED_REPLY_INIT:</div><div class='del'>-                __socket_proto_init_pending (priv,</div><div class='del'>-                                             RPC_AUTH_FLAVOUR_N_LENGTH_SIZE);</div><div class='add'>+            __socket_proto_init_pending(priv, RPC_AUTH_FLAVOUR_N_LENGTH_SIZE);</div><div class='ctx'> </div><div class='del'>-                priv-&gt;incoming.frag.call_body.reply.accepted_state</div><div class='del'>-                        = SP_STATE_READING_REPLY_VERFLEN;</div><div class='add'>+            frag-&gt;call_body.reply</div><div class='add'>+                .accepted_state = SP_STATE_READING_REPLY_VERFLEN;</div><div class='ctx'> </div><div class='del'>-                /* fall through */</div><div class='add'>+            /* fall through */</div><div class='ctx'> </div><div class='ctx'>         case SP_STATE_READING_REPLY_VERFLEN:</div><div class='del'>-                __socket_proto_read (priv, ret);</div><div class='add'>+            __socket_proto_read(priv, ret);</div><div class='ctx'> </div><div class='del'>-                priv-&gt;incoming.frag.call_body.reply.accepted_state</div><div class='del'>-                        = SP_STATE_READ_REPLY_VERFLEN;</div><div class='add'>+            frag-&gt;call_body.reply.accepted_state = SP_STATE_READ_REPLY_VERFLEN;</div><div class='ctx'> </div><div class='del'>-                /* fall through */</div><div class='add'>+            /* fall through */</div><div class='ctx'> </div><div class='ctx'>         case SP_STATE_READ_REPLY_VERFLEN:</div><div class='del'>-                buf = rpc_reply_verflen_addr (priv-&gt;incoming.frag.fragcurrent);</div><div class='add'>+            buf = rpc_reply_verflen_addr(frag-&gt;fragcurrent);</div><div class='ctx'> </div><div class='del'>-                verflen = ntoh32 (*((uint32_t *) buf));</div><div class='add'>+            verflen = ntoh32(*((uint32_t *)buf));</div><div class='ctx'> </div><div class='del'>-                /* also read accept status along with verf data */</div><div class='del'>-                len = verflen + RPC_ACCEPT_STATUS_LEN;</div><div class='add'>+            /* also read accept status along with verf data */</div><div class='add'>+            len = verflen + RPC_ACCEPT_STATUS_LEN;</div><div class='ctx'> </div><div class='del'>-                __socket_proto_init_pending (priv, len);</div><div class='add'>+            __socket_proto_init_pending(priv, len);</div><div class='ctx'> </div><div class='del'>-                priv-&gt;incoming.frag.call_body.reply.accepted_state</div><div class='del'>-                        = SP_STATE_READING_REPLY_VERFBYTES;</div><div class='add'>+            frag-&gt;call_body.reply</div><div class='add'>+                .accepted_state = SP_STATE_READING_REPLY_VERFBYTES;</div><div class='ctx'> </div><div class='del'>-                /* fall through */</div><div class='add'>+            /* fall through */</div><div class='ctx'> </div><div class='ctx'>         case SP_STATE_READING_REPLY_VERFBYTES:</div><div class='del'>-                __socket_proto_read (priv, ret);</div><div class='add'>+            __socket_proto_read(priv, ret);</div><div class='ctx'> </div><div class='del'>-                priv-&gt;incoming.frag.call_body.reply.accepted_state</div><div class='del'>-                        = SP_STATE_READ_REPLY_VERFBYTES;</div><div class='add'>+            frag-&gt;call_body.reply</div><div class='add'>+                .accepted_state = SP_STATE_READ_REPLY_VERFBYTES;</div><div class='ctx'> </div><div class='del'>-                buf = rpc_reply_accept_status_addr (priv-&gt;incoming.frag.fragcurrent);</div><div class='add'>+            buf = rpc_reply_accept_status_addr(frag-&gt;fragcurrent);</div><div class='ctx'> </div><div class='del'>-                priv-&gt;incoming.frag.call_body.reply.accept_status</div><div class='del'>-                        = ntoh32 (*(uint32_t *) buf);</div><div class='add'>+            frag-&gt;call_body.reply.accept_status = ntoh32(*(uint32_t *)buf);</div><div class='ctx'> </div><div class='del'>-                /* fall through */</div><div class='add'>+            /* fall through */</div><div class='ctx'> </div><div class='ctx'>         case SP_STATE_READ_REPLY_VERFBYTES:</div><div class='ctx'> </div><div class='del'>-                if (priv-&gt;incoming.frag.call_body.reply.accept_status</div><div class='del'>-                    == SUCCESS) {</div><div class='del'>-                        ret = __socket_read_accepted_successful_reply (this);</div><div class='add'>+            if (frag-&gt;call_body.reply.accept_status == SUCCESS) {</div><div class='add'>+                /* Need two different methods here for different protocols</div><div class='add'>+                   Mainly because the exact XDR is used to calculate the</div><div class='add'>+                   size of response */</div><div class='add'>+                if ((in-&gt;request_info-&gt;procnum == GFS3_OP_READ) &amp;&amp;</div><div class='add'>+                    (in-&gt;request_info-&gt;prognum == GLUSTER_FOP_PROGRAM) &amp;&amp;</div><div class='add'>+                    (in-&gt;request_info-&gt;progver == GLUSTER_FOP_VERSION_v2)) {</div><div class='add'>+                    ret = __socket_read_accepted_successful_reply_v2(this);</div><div class='ctx'>                 } else {</div><div class='del'>-                        /* read entire remaining msg into buffer pointed to by</div><div class='del'>-                         * fragcurrent</div><div class='del'>-                         */</div><div class='del'>-                        ret = __socket_read_simple_msg (this);</div><div class='add'>+                    ret = __socket_read_accepted_successful_reply(this);</div><div class='ctx'>                 }</div><div class='add'>+            } else {</div><div class='add'>+                /* read entire remaining msg into buffer pointed to by</div><div class='add'>+                 * fragcurrent</div><div class='add'>+                 */</div><div class='add'>+                ret = __socket_read_simple_msg(this);</div><div class='add'>+            }</div><div class='ctx'> </div><div class='del'>-                remaining_size = RPC_FRAGSIZE (priv-&gt;incoming.fraghdr)</div><div class='del'>-                        - priv-&gt;incoming.frag.bytes_read;</div><div class='add'>+            remaining_size = RPC_FRAGSIZE(in-&gt;fraghdr) - frag-&gt;bytes_read;</div><div class='ctx'> </div><div class='del'>-                if ((ret == -1)</div><div class='del'>-                    || ((ret == 0)</div><div class='del'>-                        &amp;&amp; (remaining_size == 0)</div><div class='del'>-                        &amp;&amp; (RPC_LASTFRAG (priv-&gt;incoming.fraghdr)))) {</div><div class='del'>-                        priv-&gt;incoming.frag.call_body.reply.accepted_state</div><div class='del'>-                                = SP_STATE_ACCEPTED_REPLY_INIT;</div><div class='del'>-                }</div><div class='add'>+            if ((ret &lt; 0) || ((ret == 0) &amp;&amp; (remaining_size == 0) &amp;&amp;</div><div class='add'>+                              (RPC_LASTFRAG(in-&gt;fraghdr)))) {</div><div class='add'>+                frag-&gt;call_body.reply</div><div class='add'>+                    .accepted_state = SP_STATE_ACCEPTED_REPLY_INIT;</div><div class='add'>+            }</div><div class='ctx'> </div><div class='del'>-                break;</div><div class='del'>-        }</div><div class='add'>+            break;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-out:</div><div class='del'>-        return ret;</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='del'>-inline int</div><div class='del'>-__socket_read_denied_reply (rpc_transport_t *this)</div><div class='add'>+static int</div><div class='add'>+__socket_read_denied_reply(rpc_transport_t *this)</div><div class='ctx'> {</div><div class='del'>-        return __socket_read_simple_msg (this);</div><div class='add'>+    return __socket_read_simple_msg(this);</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> #define rpc_reply_status_addr(fragcurrent) ((char *)fragcurrent - 4)</div><div class='ctx'> </div><div class='del'>-</div><div class='del'>-inline int</div><div class='del'>-__socket_read_vectored_reply (rpc_transport_t *this)</div><div class='add'>+static int</div><div class='add'>+__socket_read_vectored_reply(rpc_transport_t *this)</div><div class='ctx'> {</div><div class='del'>-        socket_private_t *priv           = NULL;</div><div class='del'>-        int               ret            = 0;</div><div class='del'>-        char             *buf            = NULL;</div><div class='del'>-        uint32_t          remaining_size = 0;</div><div class='del'>-</div><div class='del'>-        if (!this || !this-&gt;private)</div><div class='del'>-                goto out;</div><div class='del'>-</div><div class='del'>-        priv = this-&gt;private;</div><div class='del'>-</div><div class='del'>-        switch (priv-&gt;incoming.frag.call_body.reply.status_state) {</div><div class='del'>-</div><div class='add'>+    socket_private_t *priv = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    char *buf = NULL;</div><div class='add'>+    uint32_t remaining_size = 0;</div><div class='add'>+    struct gf_sock_incoming *in = NULL;</div><div class='add'>+    struct gf_sock_incoming_frag *frag = NULL;</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+    in = &amp;priv-&gt;incoming;</div><div class='add'>+    frag = &amp;in-&gt;frag;</div><div class='add'>+</div><div class='add'>+    switch (frag-&gt;call_body.reply.status_state) {</div><div class='ctx'>         case SP_STATE_ACCEPTED_REPLY_INIT:</div><div class='del'>-                __socket_proto_init_pending (priv, RPC_REPLY_STATUS_SIZE);</div><div class='add'>+            __socket_proto_init_pending(priv, RPC_REPLY_STATUS_SIZE);</div><div class='ctx'> </div><div class='del'>-                priv-&gt;incoming.frag.call_body.reply.status_state</div><div class='del'>-                        = SP_STATE_READING_REPLY_STATUS;</div><div class='add'>+            frag-&gt;call_body.reply.status_state = SP_STATE_READING_REPLY_STATUS;</div><div class='ctx'> </div><div class='del'>-                /* fall through */</div><div class='add'>+            /* fall through */</div><div class='ctx'> </div><div class='ctx'>         case SP_STATE_READING_REPLY_STATUS:</div><div class='del'>-                __socket_proto_read (priv, ret);</div><div class='add'>+            __socket_proto_read(priv, ret);</div><div class='ctx'> </div><div class='del'>-                buf = rpc_reply_status_addr (priv-&gt;incoming.frag.fragcurrent);</div><div class='add'>+            buf = rpc_reply_status_addr(frag-&gt;fragcurrent);</div><div class='ctx'> </div><div class='del'>-                priv-&gt;incoming.frag.call_body.reply.accept_status</div><div class='del'>-                        = ntoh32 (*((uint32_t *) buf));</div><div class='add'>+            frag-&gt;call_body.reply.accept_status = ntoh32(*((uint32_t *)buf));</div><div class='ctx'> </div><div class='del'>-                priv-&gt;incoming.frag.call_body.reply.status_state</div><div class='del'>-                        = SP_STATE_READ_REPLY_STATUS;</div><div class='add'>+            frag-&gt;call_body.reply.status_state = SP_STATE_READ_REPLY_STATUS;</div><div class='ctx'> </div><div class='del'>-                /* fall through */</div><div class='add'>+            /* fall through */</div><div class='ctx'> </div><div class='ctx'>         case SP_STATE_READ_REPLY_STATUS:</div><div class='del'>-                if (priv-&gt;incoming.frag.call_body.reply.accept_status</div><div class='del'>-                    == MSG_ACCEPTED) {</div><div class='del'>-                        ret = __socket_read_accepted_reply (this);</div><div class='del'>-                } else {</div><div class='del'>-                        ret = __socket_read_denied_reply (this);</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                remaining_size = RPC_FRAGSIZE (priv-&gt;incoming.fraghdr)</div><div class='del'>-                        - priv-&gt;incoming.frag.bytes_read;</div><div class='del'>-</div><div class='del'>-                if ((ret == -1)</div><div class='del'>-                    || ((ret == 0)</div><div class='del'>-                        &amp;&amp; (remaining_size == 0)</div><div class='del'>-                        &amp;&amp; (RPC_LASTFRAG (priv-&gt;incoming.fraghdr)))) {</div><div class='del'>-                        priv-&gt;incoming.frag.call_body.reply.status_state</div><div class='del'>-                                = SP_STATE_ACCEPTED_REPLY_INIT;</div><div class='del'>-                        priv-&gt;incoming.payload_vector.iov_len</div><div class='del'>-                                = (unsigned long)priv-&gt;incoming.frag.fragcurrent</div><div class='del'>-                                - (unsigned long)</div><div class='del'>-                                priv-&gt;incoming.payload_vector.iov_base;</div><div class='del'>-                }</div><div class='del'>-                break;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        return ret;</div><div class='add'>+            if (frag-&gt;call_body.reply.accept_status == MSG_ACCEPTED) {</div><div class='add'>+                ret = __socket_read_accepted_reply(this);</div><div class='add'>+            } else {</div><div class='add'>+                ret = __socket_read_denied_reply(this);</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            remaining_size = RPC_FRAGSIZE(in-&gt;fraghdr) - frag-&gt;bytes_read;</div><div class='add'>+</div><div class='add'>+            if ((ret &lt; 0) || ((ret == 0) &amp;&amp; (remaining_size == 0) &amp;&amp;</div><div class='add'>+                              (RPC_LASTFRAG(in-&gt;fraghdr)))) {</div><div class='add'>+                frag-&gt;call_body.reply</div><div class='add'>+                    .status_state = SP_STATE_VECTORED_REPLY_STATUS_INIT;</div><div class='add'>+                in-&gt;payload_vector.iov_len = (unsigned long)frag-&gt;fragcurrent -</div><div class='add'>+                                             (unsigned long)</div><div class='add'>+                                                 in-&gt;payload_vector.iov_base;</div><div class='add'>+            }</div><div class='add'>+            break;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='del'>-inline int</div><div class='del'>-__socket_read_simple_reply (rpc_transport_t *this)</div><div class='add'>+static int</div><div class='add'>+__socket_read_simple_reply(rpc_transport_t *this)</div><div class='ctx'> {</div><div class='del'>-        return __socket_read_simple_msg (this);</div><div class='add'>+    return __socket_read_simple_msg(this);</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> #define rpc_xid_addr(buf) (buf)</div><div class='ctx'> </div><div class='del'>-inline int</div><div class='del'>-__socket_read_reply (rpc_transport_t *this)</div><div class='add'>+static int</div><div class='add'>+__socket_read_reply(rpc_transport_t *this)</div><div class='ctx'> {</div><div class='del'>-        socket_private_t   *priv         = NULL;</div><div class='del'>-        char               *buf          = NULL;</div><div class='del'>-        int32_t             ret          = -1;</div><div class='del'>-        rpc_request_info_t *request_info = NULL;</div><div class='del'>-        char                map_xid      = 0;</div><div class='del'>-</div><div class='del'>-        if (!this || !this-&gt;private)</div><div class='del'>-                goto out;</div><div class='del'>-</div><div class='del'>-        priv = this-&gt;private;</div><div class='del'>-</div><div class='del'>-        buf = rpc_xid_addr (iobuf_ptr (priv-&gt;incoming.iobuf));</div><div class='add'>+    socket_private_t *priv = NULL;</div><div class='add'>+    char *buf = NULL;</div><div class='add'>+    int32_t ret = -1;</div><div class='add'>+    rpc_request_info_t *request_info = NULL;</div><div class='add'>+    char map_xid = 0;</div><div class='add'>+    struct gf_sock_incoming *in = NULL;</div><div class='add'>+    struct gf_sock_incoming_frag *frag = NULL;</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+    in = &amp;priv-&gt;incoming;</div><div class='add'>+    frag = &amp;in-&gt;frag;</div><div class='add'>+</div><div class='add'>+    buf = rpc_xid_addr(iobuf_ptr(in-&gt;iobuf));</div><div class='add'>+</div><div class='add'>+    if (in-&gt;request_info == NULL) {</div><div class='add'>+        in-&gt;request_info = GF_CALLOC(1, sizeof(*request_info),</div><div class='add'>+                                     gf_common_mt_rpc_trans_reqinfo_t);</div><div class='add'>+        if (in-&gt;request_info == NULL) {</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-        if (priv-&gt;incoming.request_info == NULL) {</div><div class='del'>-                priv-&gt;incoming.request_info = GF_CALLOC (1,</div><div class='del'>-                                                         sizeof (*request_info),</div><div class='del'>-                                                         gf_common_mt_rpc_trans_reqinfo_t);</div><div class='del'>-                if (priv-&gt;incoming.request_info == NULL) {</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_ERROR, "out of memory");</div><div class='del'>-                        goto out;</div><div class='del'>-                }</div><div class='add'>+        map_xid = 1;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-                map_xid = 1;</div><div class='del'>-        }</div><div class='add'>+    request_info = in-&gt;request_info;</div><div class='ctx'> </div><div class='del'>-        request_info = priv-&gt;incoming.request_info;</div><div class='add'>+    if (map_xid) {</div><div class='add'>+        request_info-&gt;xid = ntoh32(*((uint32_t *)buf));</div><div class='ctx'> </div><div class='del'>-        if (map_xid) {</div><div class='del'>-                request_info-&gt;xid = ntoh32 (*((uint32_t *) buf));</div><div class='add'>+        /* release priv-&gt;lock, so as to avoid deadlock b/w conn-&gt;lock</div><div class='add'>+         * and priv-&gt;lock, since we are doing an upcall here.</div><div class='add'>+         */</div><div class='add'>+        frag-&gt;state = SP_STATE_NOTIFYING_XID;</div><div class='add'>+        ret = rpc_transport_notify(this, RPC_TRANSPORT_MAP_XID_REQUEST,</div><div class='add'>+                                   in-&gt;request_info);</div><div class='ctx'> </div><div class='del'>-                /* release priv-&gt;lock, so as to avoid deadlock b/w conn-&gt;lock</div><div class='del'>-                 * and priv-&gt;lock, since we are doing an upcall here.</div><div class='del'>-                 */</div><div class='del'>-                pthread_mutex_unlock (&amp;priv-&gt;lock);</div><div class='del'>-                {</div><div class='del'>-                        ret = rpc_transport_notify (this,</div><div class='del'>-                                                    RPC_TRANSPORT_MAP_XID_REQUEST,</div><div class='del'>-                                                    priv-&gt;incoming.request_info);</div><div class='del'>-                }</div><div class='del'>-                pthread_mutex_lock (&amp;priv-&gt;lock);</div><div class='add'>+        /* Transition back to externally visible state. */</div><div class='add'>+        frag-&gt;state = SP_STATE_READ_MSGTYPE;</div><div class='ctx'> </div><div class='del'>-                if (ret == -1) {</div><div class='del'>-                        goto out;</div><div class='del'>-                }</div><div class='add'>+        if (ret &lt; 0) {</div><div class='add'>+            gf_log(this-&gt;name, GF_LOG_WARNING,</div><div class='add'>+                   "notify for event MAP_XID failed for %s",</div><div class='add'>+                   this-&gt;peerinfo.identifier);</div><div class='add'>+            goto out;</div><div class='ctx'>         }</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        if ((request_info-&gt;prognum == GLUSTER3_1_FOP_PROGRAM)</div><div class='del'>-            &amp;&amp; (request_info-&gt;procnum == GF_FOP_READ)) {</div><div class='del'>-                if (map_xid &amp;&amp; request_info-&gt;rsp.rsp_payload_count != 0) {</div><div class='del'>-                        priv-&gt;incoming.iobref</div><div class='del'>-                                = iobref_ref (request_info-&gt;rsp.rsp_iobref);</div><div class='del'>-                        priv-&gt;incoming.payload_vector</div><div class='del'>-                                = *request_info-&gt;rsp.rsp_payload;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                ret = __socket_read_vectored_reply (this);</div><div class='del'>-        } else {</div><div class='del'>-                ret = __socket_read_simple_reply (this);</div><div class='add'>+    if ((request_info-&gt;prognum == GLUSTER_FOP_PROGRAM) &amp;&amp;</div><div class='add'>+        (request_info-&gt;procnum == GF_FOP_READ)) {</div><div class='add'>+        if (map_xid &amp;&amp; request_info-&gt;rsp.rsp_payload_count != 0) {</div><div class='add'>+            in-&gt;iobref = iobref_ref(request_info-&gt;rsp.rsp_iobref);</div><div class='add'>+            in-&gt;payload_vector = *request_info-&gt;rsp.rsp_payload;</div><div class='ctx'>         }</div><div class='add'>+</div><div class='add'>+        ret = __socket_read_vectored_reply(this);</div><div class='add'>+    } else {</div><div class='add'>+        ret = __socket_read_simple_reply(this);</div><div class='add'>+    }</div><div class='ctx'> out:</div><div class='del'>-        return ret;</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> /* returns the number of bytes yet to be read in a fragment */</div><div class='del'>-inline int</div><div class='del'>-__socket_read_frag (rpc_transport_t *this)</div><div class='add'>+static int</div><div class='add'>+__socket_read_frag(rpc_transport_t *this)</div><div class='ctx'> {</div><div class='del'>-        socket_private_t *priv           = NULL;</div><div class='del'>-        int32_t           ret            = 0;</div><div class='del'>-        char             *buf            = NULL;</div><div class='del'>-        uint32_t          remaining_size = 0;</div><div class='del'>-</div><div class='del'>-        if (!this || !this-&gt;private)</div><div class='del'>-                goto out;</div><div class='del'>-</div><div class='del'>-        priv = this-&gt;private;</div><div class='del'>-</div><div class='del'>-        switch (priv-&gt;incoming.frag.state) {</div><div class='add'>+    socket_private_t *priv = NULL;</div><div class='add'>+    int32_t ret = 0;</div><div class='add'>+    char *buf = NULL;</div><div class='add'>+    uint32_t remaining_size = 0;</div><div class='add'>+    struct gf_sock_incoming *in = NULL;</div><div class='add'>+    struct gf_sock_incoming_frag *frag = NULL;</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+    /* used to reduce the indirection */</div><div class='add'>+    in = &amp;priv-&gt;incoming;</div><div class='add'>+    frag = &amp;in-&gt;frag;</div><div class='add'>+</div><div class='add'>+    switch (frag-&gt;state) {</div><div class='ctx'>         case SP_STATE_NADA:</div><div class='del'>-                __socket_proto_init_pending (priv, RPC_MSGTYPE_SIZE);</div><div class='add'>+            __socket_proto_init_pending(priv, RPC_MSGTYPE_SIZE);</div><div class='ctx'> </div><div class='del'>-                priv-&gt;incoming.frag.state = SP_STATE_READING_MSGTYPE;</div><div class='add'>+            frag-&gt;state = SP_STATE_READING_MSGTYPE;</div><div class='ctx'> </div><div class='del'>-                /* fall through */</div><div class='add'>+            /* fall through */</div><div class='ctx'> </div><div class='ctx'>         case SP_STATE_READING_MSGTYPE:</div><div class='del'>-                __socket_proto_read (priv, ret);</div><div class='add'>+            __socket_proto_read(priv, ret);</div><div class='ctx'> </div><div class='del'>-                priv-&gt;incoming.frag.state = SP_STATE_READ_MSGTYPE;</div><div class='del'>-                /* fall through */</div><div class='add'>+            frag-&gt;state = SP_STATE_READ_MSGTYPE;</div><div class='add'>+            /* fall through */</div><div class='ctx'> </div><div class='ctx'>         case SP_STATE_READ_MSGTYPE:</div><div class='del'>-                buf = rpc_msgtype_addr (iobuf_ptr (priv-&gt;incoming.iobuf));</div><div class='del'>-                priv-&gt;incoming.msg_type = ntoh32 (*((uint32_t *)buf));</div><div class='del'>-</div><div class='del'>-                if (priv-&gt;incoming.msg_type == CALL) {</div><div class='del'>-                        ret = __socket_read_request (this);</div><div class='del'>-                } else if (priv-&gt;incoming.msg_type == REPLY) {</div><div class='del'>-                        ret = __socket_read_reply (this);</div><div class='del'>-                } else if (priv-&gt;incoming.msg_type == GF_UNIVERSAL_ANSWER) {</div><div class='del'>-                        gf_log ("rpc", GF_LOG_ERROR,</div><div class='del'>-                                "older version of protocol/process trying to "</div><div class='del'>-                                "connect from %s. use newer verison on that node",</div><div class='del'>-                                this-&gt;peerinfo.identifier);</div><div class='del'>-                } else {</div><div class='del'>-                        gf_log ("rpc", GF_LOG_ERROR,</div><div class='del'>-                                "wrong MSG-TYPE (%d) received from %s",</div><div class='del'>-                                priv-&gt;incoming.msg_type,</div><div class='del'>-                                this-&gt;peerinfo.identifier);</div><div class='del'>-                        ret = -1;</div><div class='del'>-                }</div><div class='add'>+            buf = rpc_msgtype_addr(iobuf_ptr(in-&gt;iobuf));</div><div class='add'>+            in-&gt;msg_type = ntoh32(*((uint32_t *)buf));</div><div class='add'>+</div><div class='add'>+            if (in-&gt;msg_type == CALL) {</div><div class='add'>+                ret = __socket_read_request(this);</div><div class='add'>+            } else if (in-&gt;msg_type == REPLY) {</div><div class='add'>+                ret = __socket_read_reply(this);</div><div class='add'>+            } else if (in-&gt;msg_type == (msg_type_t)GF_UNIVERSAL_ANSWER) {</div><div class='add'>+                gf_log("rpc", GF_LOG_ERROR,</div><div class='add'>+                       "older version of protocol/process trying to "</div><div class='add'>+                       "connect from %s. use newer version on that node",</div><div class='add'>+                       this-&gt;peerinfo.identifier);</div><div class='add'>+            } else {</div><div class='add'>+                gf_log("rpc", GF_LOG_ERROR,</div><div class='add'>+                       "wrong MSG-TYPE (%d) received from %s", in-&gt;msg_type,</div><div class='add'>+                       this-&gt;peerinfo.identifier);</div><div class='add'>+                ret = -1;</div><div class='add'>+            }</div><div class='ctx'> </div><div class='del'>-                remaining_size = RPC_FRAGSIZE (priv-&gt;incoming.fraghdr)</div><div class='del'>-                        - priv-&gt;incoming.frag.bytes_read;</div><div class='add'>+            remaining_size = RPC_FRAGSIZE(in-&gt;fraghdr) - frag-&gt;bytes_read;</div><div class='ctx'> </div><div class='del'>-                if ((ret == -1)</div><div class='del'>-                    || ((ret == 0)</div><div class='del'>-                        &amp;&amp; (remaining_size == 0)</div><div class='del'>-                        &amp;&amp; (RPC_LASTFRAG (priv-&gt;incoming.fraghdr)))) {</div><div class='del'>-                        priv-&gt;incoming.frag.state = SP_STATE_NADA;</div><div class='del'>-                }</div><div class='add'>+            if ((ret &lt; 0) || ((ret == 0) &amp;&amp; (remaining_size == 0) &amp;&amp;</div><div class='add'>+                              (RPC_LASTFRAG(in-&gt;fraghdr)))) {</div><div class='add'>+                /* frag-&gt;state = SP_STATE_NADA; */</div><div class='add'>+                frag-&gt;state = SP_STATE_RPCFRAG_INIT;</div><div class='add'>+            }</div><div class='ctx'> </div><div class='del'>-                break;</div><div class='del'>-        }</div><div class='add'>+            break;</div><div class='ctx'> </div><div class='del'>-out:</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='add'>+        case SP_STATE_NOTIFYING_XID:</div><div class='add'>+            /* Another epoll thread is notifying higher layers</div><div class='add'>+             *of reply's xid. */</div><div class='add'>+            errno = EAGAIN;</div><div class='add'>+            return -1;</div><div class='add'>+            break;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-inline</div><div class='del'>-void __socket_reset_priv (socket_private_t *priv)</div><div class='add'>+static void</div><div class='add'>+__socket_reset_priv(socket_private_t *priv)</div><div class='ctx'> {</div><div class='del'>-        if (priv-&gt;incoming.iobref) {</div><div class='del'>-                iobref_unref (priv-&gt;incoming.iobref);</div><div class='del'>-                priv-&gt;incoming.iobref = NULL;</div><div class='del'>-        }</div><div class='add'>+    struct gf_sock_incoming *in = NULL;</div><div class='ctx'> </div><div class='del'>-        if (priv-&gt;incoming.iobuf) {</div><div class='del'>-                iobuf_unref (priv-&gt;incoming.iobuf);</div><div class='del'>-        }</div><div class='add'>+    /* used to reduce the indirection */</div><div class='add'>+    in = &amp;priv-&gt;incoming;</div><div class='ctx'> </div><div class='del'>-        if (priv-&gt;incoming.request_info != NULL) {</div><div class='del'>-                GF_FREE (priv-&gt;incoming.request_info);</div><div class='del'>-                priv-&gt;incoming.request_info = NULL;</div><div class='del'>-        }</div><div class='add'>+    if (in-&gt;iobref) {</div><div class='add'>+        iobref_unref(in-&gt;iobref);</div><div class='add'>+        in-&gt;iobref = NULL;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        memset (&amp;priv-&gt;incoming.payload_vector, 0,</div><div class='del'>-                sizeof (priv-&gt;incoming.payload_vector));</div><div class='add'>+    if (in-&gt;iobuf) {</div><div class='add'>+        iobuf_unref(in-&gt;iobuf);</div><div class='add'>+        in-&gt;iobuf = NULL;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        priv-&gt;incoming.iobuf = NULL;</div><div class='del'>-}</div><div class='add'>+    if (in-&gt;request_info != NULL) {</div><div class='add'>+        GF_FREE(in-&gt;request_info);</div><div class='add'>+        in-&gt;request_info = NULL;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='add'>+    memset(&amp;in-&gt;payload_vector, 0, sizeof(in-&gt;payload_vector));</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-__socket_proto_state_machine (rpc_transport_t *this,</div><div class='del'>-                              rpc_transport_pollin_t **pollin)</div><div class='add'>+static int</div><div class='add'>+__socket_proto_state_machine(rpc_transport_t *this,</div><div class='add'>+                             rpc_transport_pollin_t **pollin)</div><div class='ctx'> {</div><div class='del'>-        int               ret    = -1;</div><div class='del'>-        socket_private_t *priv   = NULL;</div><div class='del'>-        struct iobuf     *iobuf  = NULL;</div><div class='del'>-        struct iobref    *iobref = NULL;</div><div class='del'>-        struct iovec      vector[2];</div><div class='add'>+    int ret = -1;</div><div class='add'>+    socket_private_t *priv = NULL;</div><div class='add'>+    struct iobuf *iobuf = NULL;</div><div class='add'>+    struct iobref *iobref = NULL;</div><div class='add'>+    struct iovec vector[2];</div><div class='add'>+    struct gf_sock_incoming *in = NULL;</div><div class='add'>+    struct gf_sock_incoming_frag *frag = NULL;</div><div class='ctx'> </div><div class='del'>-        if (!this || !this-&gt;private)</div><div class='del'>-                goto out;</div><div class='add'>+    GF_VALIDATE_OR_GOTO("socket", this, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("socket", this-&gt;private, out);</div><div class='ctx'> </div><div class='del'>-        priv = this-&gt;private;</div><div class='del'>-        while (priv-&gt;incoming.record_state != SP_STATE_COMPLETE) {</div><div class='del'>-                switch (priv-&gt;incoming.record_state) {</div><div class='del'>-</div><div class='del'>-                case SP_STATE_NADA:</div><div class='del'>-                        iobuf = iobuf_get (this-&gt;ctx-&gt;iobuf_pool);</div><div class='del'>-                        if (!iobuf) {</div><div class='del'>-                                gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-                                        "unable to allocate IO buffer "</div><div class='del'>-                                        "for peer %s",</div><div class='del'>-                                        this-&gt;peerinfo.identifier);</div><div class='del'>-                                ret = -ENOMEM;</div><div class='del'>-                                goto out;</div><div class='del'>-                        }</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+    /* used to reduce the indirection */</div><div class='add'>+    in = &amp;priv-&gt;incoming;</div><div class='add'>+    frag = &amp;in-&gt;frag;</div><div class='ctx'> </div><div class='del'>-                        priv-&gt;incoming.iobuf = iobuf;</div><div class='del'>-                        priv-&gt;incoming.iobuf_size = 0;</div><div class='del'>-                        priv-&gt;incoming.total_bytes_read = 0;</div><div class='del'>-                        priv-&gt;incoming.payload_vector.iov_len = 0;</div><div class='del'>-</div><div class='del'>-                        priv-&gt;incoming.pending_vector = priv-&gt;incoming.vector;</div><div class='del'>-                        priv-&gt;incoming.pending_vector-&gt;iov_base =</div><div class='del'>-                                &amp;priv-&gt;incoming.fraghdr;</div><div class='del'>-</div><div class='del'>-                        priv-&gt;incoming.frag.fragcurrent = iobuf_ptr (iobuf);</div><div class='del'>-                        priv-&gt;incoming.pending_vector-&gt;iov_len  =</div><div class='del'>-                                sizeof (priv-&gt;incoming.fraghdr);</div><div class='del'>-</div><div class='del'>-                        priv-&gt;incoming.record_state = SP_STATE_READING_FRAGHDR;</div><div class='del'>-</div><div class='del'>-                        /* fall through */</div><div class='del'>-</div><div class='del'>-                case SP_STATE_READING_FRAGHDR:</div><div class='del'>-                        ret = __socket_readv (this,</div><div class='del'>-                                              priv-&gt;incoming.pending_vector, 1,</div><div class='del'>-                                              &amp;priv-&gt;incoming.pending_vector,</div><div class='del'>-                                              &amp;priv-&gt;incoming.pending_count,</div><div class='del'>-                                              NULL);</div><div class='del'>-                        if (ret == -1) {</div><div class='del'>-                                gf_log (this-&gt;name, GF_LOG_TRACE,</div><div class='del'>-                                        "reading from socket failed. Error (%s), "</div><div class='del'>-                                        "peer (%s)", strerror (errno),</div><div class='del'>-                                        this-&gt;peerinfo.identifier);</div><div class='del'>-                                goto out;</div><div class='del'>-                        }</div><div class='add'>+    while (in-&gt;record_state != SP_STATE_COMPLETE) {</div><div class='add'>+        switch (in-&gt;record_state) {</div><div class='add'>+            case SP_STATE_NADA:</div><div class='add'>+                in-&gt;total_bytes_read = 0;</div><div class='add'>+                in-&gt;payload_vector.iov_len = 0;</div><div class='ctx'> </div><div class='del'>-                        if (ret &gt; 0) {</div><div class='del'>-                                gf_log (this-&gt;name, GF_LOG_TRACE, "partial "</div><div class='del'>-                                        "fragment header read");</div><div class='del'>-                                goto out;</div><div class='del'>-                        }</div><div class='add'>+                in-&gt;pending_vector = in-&gt;vector;</div><div class='add'>+                in-&gt;pending_vector-&gt;iov_base = &amp;in-&gt;fraghdr;</div><div class='ctx'> </div><div class='del'>-                        if (ret == 0) {</div><div class='del'>-                                priv-&gt;incoming.record_state =</div><div class='del'>-                                        SP_STATE_READ_FRAGHDR;</div><div class='del'>-                        }</div><div class='del'>-                        /* fall through */</div><div class='add'>+                in-&gt;pending_vector-&gt;iov_len = sizeof(in-&gt;fraghdr);</div><div class='ctx'> </div><div class='del'>-                case SP_STATE_READ_FRAGHDR:</div><div class='add'>+                in-&gt;record_state = SP_STATE_READING_FRAGHDR;</div><div class='ctx'> </div><div class='del'>-                        priv-&gt;incoming.fraghdr = ntoh32 (priv-&gt;incoming.fraghdr);</div><div class='del'>-                        priv-&gt;incoming.record_state = SP_STATE_READING_FRAG;</div><div class='del'>-                        priv-&gt;incoming.total_bytes_read</div><div class='del'>-                                += RPC_FRAGSIZE(priv-&gt;incoming.fraghdr);</div><div class='del'>-                        /* fall through */</div><div class='add'>+                /* fall through */</div><div class='ctx'> </div><div class='del'>-                case SP_STATE_READING_FRAG:</div><div class='del'>-                        ret = __socket_read_frag (this);</div><div class='add'>+            case SP_STATE_READING_FRAGHDR:</div><div class='add'>+                ret = __socket_readv(this, in-&gt;pending_vector, 1,</div><div class='add'>+                                     &amp;in-&gt;pending_vector, &amp;in-&gt;pending_count,</div><div class='add'>+                                     NULL);</div><div class='add'>+                if (ret &lt; 0)</div><div class='add'>+                    goto out;</div><div class='ctx'> </div><div class='del'>-                        if ((ret == -1)</div><div class='del'>-                            || (priv-&gt;incoming.frag.bytes_read !=</div><div class='del'>-                                RPC_FRAGSIZE (priv-&gt;incoming.fraghdr))) {</div><div class='del'>-                                goto out;</div><div class='del'>-                        }</div><div class='add'>+                if (ret &gt; 0) {</div><div class='add'>+                    gf_log(this-&gt;name, GF_LOG_TRACE,</div><div class='add'>+                           "partial "</div><div class='add'>+                           "fragment header read");</div><div class='add'>+                    ret = 0;</div><div class='add'>+                    goto out;</div><div class='add'>+                }</div><div class='ctx'> </div><div class='del'>-                        priv-&gt;incoming.frag.bytes_read = 0;</div><div class='add'>+                if (ret == 0) {</div><div class='add'>+                    in-&gt;record_state = SP_STATE_READ_FRAGHDR;</div><div class='add'>+                }</div><div class='add'>+                /* fall through */</div><div class='ctx'> </div><div class='del'>-                        if (!RPC_LASTFRAG (priv-&gt;incoming.fraghdr)) {</div><div class='del'>-                                priv-&gt;incoming.record_state =</div><div class='del'>-                                        SP_STATE_READING_FRAGHDR;</div><div class='del'>-                                break;</div><div class='del'>-                        }</div><div class='add'>+            case SP_STATE_READ_FRAGHDR:</div><div class='add'>+</div><div class='add'>+                in-&gt;fraghdr = ntoh32(in-&gt;fraghdr);</div><div class='add'>+                in-&gt;total_bytes_read += RPC_FRAGSIZE(in-&gt;fraghdr);</div><div class='add'>+</div><div class='add'>+                if (in-&gt;total_bytes_read &gt;= GF_UNIT_GB) {</div><div class='add'>+                    ret = -1;</div><div class='add'>+                    goto out;</div><div class='add'>+                }</div><div class='add'>+</div><div class='add'>+                iobuf = iobuf_get2(</div><div class='add'>+                    this-&gt;ctx-&gt;iobuf_pool,</div><div class='add'>+                    (in-&gt;total_bytes_read + sizeof(in-&gt;fraghdr)));</div><div class='add'>+                if (!iobuf) {</div><div class='add'>+                    ret = -1;</div><div class='add'>+                    goto out;</div><div class='add'>+                }</div><div class='add'>+</div><div class='add'>+                if (in-&gt;iobuf == NULL) {</div><div class='add'>+                    /* first fragment */</div><div class='add'>+                    frag-&gt;fragcurrent = iobuf_ptr(iobuf);</div><div class='add'>+                } else {</div><div class='add'>+                    /* second or further fragment */</div><div class='add'>+                    memcpy(iobuf_ptr(iobuf), iobuf_ptr(in-&gt;iobuf),</div><div class='add'>+                           in-&gt;total_bytes_read - RPC_FRAGSIZE(in-&gt;fraghdr));</div><div class='add'>+                    iobuf_unref(in-&gt;iobuf);</div><div class='add'>+                    frag-&gt;fragcurrent = (char *)iobuf_ptr(iobuf) +</div><div class='add'>+                                        in-&gt;total_bytes_read -</div><div class='add'>+                                        RPC_FRAGSIZE(in-&gt;fraghdr);</div><div class='add'>+                    frag-&gt;pending_vector-&gt;iov_base = frag-&gt;fragcurrent;</div><div class='add'>+                    in-&gt;pending_vector = frag-&gt;pending_vector;</div><div class='add'>+                }</div><div class='add'>+</div><div class='add'>+                in-&gt;iobuf = iobuf;</div><div class='add'>+                in-&gt;iobuf_size = 0;</div><div class='add'>+                in-&gt;record_state = SP_STATE_READING_FRAG;</div><div class='add'>+                /* fall through */</div><div class='add'>+</div><div class='add'>+            case SP_STATE_READING_FRAG:</div><div class='add'>+                ret = __socket_read_frag(this);</div><div class='add'>+</div><div class='add'>+                if ((ret &lt; 0) ||</div><div class='add'>+                    (frag-&gt;bytes_read != RPC_FRAGSIZE(in-&gt;fraghdr))) {</div><div class='add'>+                    goto out;</div><div class='add'>+                }</div><div class='add'>+</div><div class='add'>+                frag-&gt;bytes_read = 0;</div><div class='add'>+</div><div class='add'>+                if (!RPC_LASTFRAG(in-&gt;fraghdr)) {</div><div class='add'>+                    in-&gt;pending_vector = in-&gt;vector;</div><div class='add'>+                    in-&gt;pending_vector-&gt;iov_base = &amp;in-&gt;fraghdr;</div><div class='add'>+                    in-&gt;pending_vector-&gt;iov_len = sizeof(in-&gt;fraghdr);</div><div class='add'>+                    in-&gt;record_state = SP_STATE_READING_FRAGHDR;</div><div class='add'>+                    break;</div><div class='add'>+                }</div><div class='ctx'> </div><div class='del'>-                        /* we've read the entire rpc record, notify the</div><div class='del'>-                         * upper layers.</div><div class='del'>-                         */</div><div class='del'>-                        if (pollin != NULL) {</div><div class='del'>-                                int count = 0;</div><div class='del'>-                                priv-&gt;incoming.iobuf_size</div><div class='del'>-                                        = priv-&gt;incoming.total_bytes_read</div><div class='del'>-                                        - priv-&gt;incoming.payload_vector.iov_len;</div><div class='del'>-</div><div class='del'>-                                memset (vector, 0, sizeof (vector));</div><div class='del'>-</div><div class='del'>-                                if (priv-&gt;incoming.iobref == NULL) {</div><div class='del'>-                                        priv-&gt;incoming.iobref = iobref_new ();</div><div class='del'>-                                        if (priv-&gt;incoming.iobref == NULL) {</div><div class='del'>-                                                gf_log (this-&gt;name,</div><div class='del'>-                                                        GF_LOG_ERROR,</div><div class='del'>-                                                        "out of memory");</div><div class='del'>-                                                ret = -1;</div><div class='del'>-                                                goto out;</div><div class='del'>-                                        }</div><div class='del'>-                                }</div><div class='del'>-</div><div class='del'>-                                vector[count].iov_base</div><div class='del'>-                                        = iobuf_ptr (priv-&gt;incoming.iobuf);</div><div class='del'>-                                vector[count].iov_len</div><div class='del'>-                                        = priv-&gt;incoming.iobuf_size;</div><div class='del'>-</div><div class='del'>-                                iobref = priv-&gt;incoming.iobref;</div><div class='del'>-</div><div class='del'>-                                iobref_add (iobref,</div><div class='del'>-                                            priv-&gt;incoming.iobuf);</div><div class='del'>-                                iobuf_unref (priv-&gt;incoming.iobuf);</div><div class='del'>-                                priv-&gt;incoming.iobuf = NULL; </div><div class='del'>-</div><div class='del'>-                                count++;</div><div class='del'>-</div><div class='del'>-                                if (priv-&gt;incoming.payload_vector.iov_base</div><div class='del'>-                                    != NULL) {</div><div class='del'>-                                        vector[count]</div><div class='del'>-                                                = priv-&gt;incoming.payload_vector;</div><div class='del'>-                                        count++;</div><div class='del'>-                                }</div><div class='del'>-</div><div class='del'>-                                *pollin = rpc_transport_pollin_alloc (this,</div><div class='del'>-                                                                      vector,</div><div class='del'>-                                                                      count,</div><div class='del'>-                                                                      iobref,</div><div class='del'>-                                                                      priv-&gt;incoming.request_info);</div><div class='del'>-                                if (*pollin == NULL) {</div><div class='del'>-                                        ret = -1;</div><div class='del'>-                                        goto out;</div><div class='del'>-                                }</div><div class='del'>-                                if (priv-&gt;incoming.msg_type == REPLY)</div><div class='del'>-                                        (*pollin)-&gt;is_reply = 1;</div><div class='del'>-</div><div class='del'>-                                priv-&gt;incoming.request_info = NULL;</div><div class='add'>+                /* we've read the entire rpc record, notify the</div><div class='add'>+                 * upper layers.</div><div class='add'>+                 */</div><div class='add'>+                if (pollin != NULL) {</div><div class='add'>+                    int count = 0;</div><div class='add'>+                    in-&gt;iobuf_size = (in-&gt;total_bytes_read -</div><div class='add'>+                                      in-&gt;payload_vector.iov_len);</div><div class='add'>+</div><div class='add'>+                    memset(vector, 0, sizeof(vector));</div><div class='add'>+</div><div class='add'>+                    if (in-&gt;iobref == NULL) {</div><div class='add'>+                        in-&gt;iobref = iobref_new();</div><div class='add'>+                        if (in-&gt;iobref == NULL) {</div><div class='add'>+                            ret = -1;</div><div class='add'>+                            goto out;</div><div class='ctx'>                         }</div><div class='del'>-                        priv-&gt;incoming.record_state = SP_STATE_COMPLETE;</div><div class='del'>-                        break;</div><div class='add'>+                    }</div><div class='ctx'> </div><div class='del'>-                case SP_STATE_COMPLETE:</div><div class='del'>-                        /* control should not reach here */</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_DEBUG, "control reached to "</div><div class='del'>-                                "SP_STATE_COMPLETE, which should not have "</div><div class='del'>-                                "happened");</div><div class='del'>-                        break;</div><div class='add'>+                    vector[count].iov_base = iobuf_ptr(in-&gt;iobuf);</div><div class='add'>+                    vector[count].iov_len = in-&gt;iobuf_size;</div><div class='add'>+</div><div class='add'>+                    iobref = in-&gt;iobref;</div><div class='add'>+</div><div class='add'>+                    count++;</div><div class='add'>+</div><div class='add'>+                    if (in-&gt;payload_vector.iov_base != NULL) {</div><div class='add'>+                        vector[count] = in-&gt;payload_vector;</div><div class='add'>+                        count++;</div><div class='add'>+                    }</div><div class='add'>+</div><div class='add'>+                    *pollin = rpc_transport_pollin_alloc(this, vector, count,</div><div class='add'>+                                                         in-&gt;iobuf, iobref,</div><div class='add'>+                                                         in-&gt;request_info);</div><div class='add'>+                    iobuf_unref(in-&gt;iobuf);</div><div class='add'>+                    in-&gt;iobuf = NULL;</div><div class='add'>+</div><div class='add'>+                    if (*pollin == NULL) {</div><div class='add'>+                        gf_log(this-&gt;name, GF_LOG_WARNING,</div><div class='add'>+                               "transport pollin allocation failed");</div><div class='add'>+                        ret = -1;</div><div class='add'>+                        goto out;</div><div class='add'>+                    }</div><div class='add'>+                    if (in-&gt;msg_type == REPLY)</div><div class='add'>+                        (*pollin)-&gt;is_reply = 1;</div><div class='add'>+</div><div class='add'>+                    in-&gt;request_info = NULL;</div><div class='ctx'>                 }</div><div class='del'>-        }</div><div class='add'>+                in-&gt;record_state = SP_STATE_COMPLETE;</div><div class='add'>+                break;</div><div class='ctx'> </div><div class='del'>-        if (priv-&gt;incoming.record_state == SP_STATE_COMPLETE) {</div><div class='del'>-                priv-&gt;incoming.record_state = SP_STATE_NADA;</div><div class='del'>-                __socket_reset_priv (priv);</div><div class='add'>+            case SP_STATE_COMPLETE:</div><div class='add'>+                /* control should not reach here */</div><div class='add'>+                gf_log(this-&gt;name, GF_LOG_WARNING,</div><div class='add'>+                       "control reached to "</div><div class='add'>+                       "SP_STATE_COMPLETE, which should not have "</div><div class='add'>+                       "happened");</div><div class='add'>+                break;</div><div class='ctx'>         }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (in-&gt;record_state == SP_STATE_COMPLETE) {</div><div class='add'>+        in-&gt;record_state = SP_STATE_NADA;</div><div class='add'>+        __socket_reset_priv(priv);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='ctx'> out:</div><div class='del'>-        if ((ret == -1) &amp;&amp; (errno == EAGAIN)) {</div><div class='del'>-                ret = 0;</div><div class='del'>-        }</div><div class='del'>-        return ret;</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+static int</div><div class='add'>+socket_proto_state_machine(rpc_transport_t *this,</div><div class='add'>+                           rpc_transport_pollin_t **pollin)</div><div class='add'>+{</div><div class='add'>+    return __socket_proto_state_machine(this, pollin);</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-socket_proto_state_machine (rpc_transport_t *this,</div><div class='del'>-                            rpc_transport_pollin_t **pollin)</div><div class='add'>+static void</div><div class='add'>+socket_event_poll_in_async(xlator_t *xl, gf_async_t *async)</div><div class='ctx'> {</div><div class='del'>-        socket_private_t *priv = NULL;</div><div class='del'>-	int               ret = 0;</div><div class='add'>+    rpc_transport_pollin_t *pollin;</div><div class='add'>+    rpc_transport_t *this;</div><div class='add'>+    socket_private_t *priv;</div><div class='ctx'> </div><div class='del'>-        if (!this || !this-&gt;private)</div><div class='del'>-                goto out;</div><div class='add'>+    pollin = caa_container_of(async, rpc_transport_pollin_t, async);</div><div class='add'>+    this = pollin-&gt;trans;</div><div class='add'>+    priv = this-&gt;private;</div><div class='ctx'> </div><div class='del'>-	priv = this-&gt;private;</div><div class='add'>+    rpc_transport_notify(this, RPC_TRANSPORT_MSG_RECEIVED, pollin);</div><div class='ctx'> </div><div class='del'>-	pthread_mutex_lock (&amp;priv-&gt;lock);</div><div class='del'>-	{</div><div class='del'>-		ret = __socket_proto_state_machine (this, pollin);</div><div class='del'>-	}</div><div class='del'>-        pthread_mutex_unlock (&amp;priv-&gt;lock);</div><div class='add'>+    rpc_transport_unref(this);</div><div class='ctx'> </div><div class='del'>-out:</div><div class='del'>-	return ret;</div><div class='del'>-}</div><div class='add'>+    rpc_transport_pollin_destroy(pollin);</div><div class='ctx'> </div><div class='add'>+    pthread_mutex_lock(&amp;priv-&gt;notify.lock);</div><div class='add'>+    {</div><div class='add'>+        --priv-&gt;notify.in_progress;</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-socket_event_poll_in (rpc_transport_t *this)</div><div class='add'>+        if (!priv-&gt;notify.in_progress)</div><div class='add'>+            pthread_cond_signal(&amp;priv-&gt;notify.cond);</div><div class='add'>+    }</div><div class='add'>+    pthread_mutex_unlock(&amp;priv-&gt;notify.lock);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+socket_event_poll_in(rpc_transport_t *this, gf_boolean_t notify_handled)</div><div class='ctx'> {</div><div class='del'>-        int                     ret    = -1;</div><div class='del'>-        rpc_transport_pollin_t *pollin = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    rpc_transport_pollin_t *pollin = NULL;</div><div class='add'>+    socket_private_t *priv = this-&gt;private;</div><div class='add'>+    glusterfs_ctx_t *ctx = NULL;</div><div class='ctx'> </div><div class='del'>-        ret = socket_proto_state_machine (this, &amp;pollin);</div><div class='add'>+    ctx = this-&gt;ctx;</div><div class='ctx'> </div><div class='del'>-        if (pollin != NULL) {</div><div class='del'>-                ret = rpc_transport_notify (this, RPC_TRANSPORT_MSG_RECEIVED,</div><div class='del'>-                                            pollin);</div><div class='add'>+    ret = socket_proto_state_machine(this, &amp;pollin);</div><div class='ctx'> </div><div class='del'>-                rpc_transport_pollin_destroy (pollin);</div><div class='add'>+    if (pollin) {</div><div class='add'>+        pthread_mutex_lock(&amp;priv-&gt;notify.lock);</div><div class='add'>+        {</div><div class='add'>+            priv-&gt;notify.in_progress++;</div><div class='ctx'>         }</div><div class='add'>+        pthread_mutex_unlock(&amp;priv-&gt;notify.lock);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='add'>+    if (notify_handled &amp;&amp; (ret &gt;= 0))</div><div class='add'>+        gf_event_handled(ctx-&gt;event_pool, priv-&gt;sock, priv-&gt;idx, priv-&gt;gen);</div><div class='ctx'> </div><div class='add'>+    if (pollin) {</div><div class='add'>+        rpc_transport_ref(this);</div><div class='add'>+        gf_async(&amp;pollin-&gt;async, THIS, socket_event_poll_in_async);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-socket_connect_finish (rpc_transport_t *this)</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+socket_connect_finish(rpc_transport_t *this)</div><div class='ctx'> {</div><div class='del'>-        int                   ret        = -1;</div><div class='del'>-        socket_private_t     *priv       = NULL;</div><div class='del'>-        rpc_transport_event_t event      = 0;</div><div class='del'>-        char                  notify_rpc = 0;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    socket_private_t *priv = NULL;</div><div class='add'>+    rpc_transport_event_t event = 0;</div><div class='add'>+    char notify_rpc = 0;</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    pthread_mutex_lock(&amp;priv-&gt;out_lock);</div><div class='add'>+    {</div><div class='add'>+        if (priv-&gt;connected != 0)</div><div class='add'>+            goto unlock;</div><div class='add'>+</div><div class='add'>+        get_transport_identifiers(this);</div><div class='add'>+</div><div class='add'>+        ret = __socket_connect_finish(priv-&gt;sock);</div><div class='add'>+</div><div class='add'>+        if ((ret &lt; 0) &amp;&amp; (errno == EINPROGRESS))</div><div class='add'>+            ret = 1;</div><div class='add'>+</div><div class='add'>+        if ((ret &lt; 0) &amp;&amp; (errno != EINPROGRESS)) {</div><div class='add'>+            if (!priv-&gt;connect_finish_log) {</div><div class='add'>+                gf_log(this-&gt;name, GF_LOG_ERROR,</div><div class='add'>+                       "connection to %s failed (%s); "</div><div class='add'>+                       "disconnecting socket",</div><div class='add'>+                       this-&gt;peerinfo.identifier, strerror(errno));</div><div class='add'>+                priv-&gt;connect_finish_log = 1;</div><div class='add'>+            }</div><div class='add'>+            __socket_disconnect(this);</div><div class='add'>+            goto unlock;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-        if (!this || !this-&gt;private)</div><div class='del'>-                goto out;</div><div class='add'>+        if (ret == 0) {</div><div class='add'>+            notify_rpc = 1;</div><div class='add'>+</div><div class='add'>+            this-&gt;myinfo.sockaddr_len = sizeof(this-&gt;myinfo.sockaddr);</div><div class='add'>+</div><div class='add'>+            ret = getsockname(priv-&gt;sock, SA(&amp;this-&gt;myinfo.sockaddr),</div><div class='add'>+                              &amp;this-&gt;myinfo.sockaddr_len);</div><div class='add'>+            if (ret != 0) {</div><div class='add'>+                gf_log(this-&gt;name, GF_LOG_WARNING,</div><div class='add'>+                       "getsockname on (%d) failed (%s) - "</div><div class='add'>+                       "disconnecting socket",</div><div class='add'>+                       priv-&gt;sock, strerror(errno));</div><div class='add'>+                __socket_disconnect(this);</div><div class='add'>+                event = RPC_TRANSPORT_DISCONNECT;</div><div class='add'>+                goto unlock;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            priv-&gt;connected = 1;</div><div class='add'>+            priv-&gt;connect_finish_log = 0;</div><div class='add'>+            event = RPC_TRANSPORT_CONNECT;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+unlock:</div><div class='add'>+    pthread_mutex_unlock(&amp;priv-&gt;out_lock);</div><div class='ctx'> </div><div class='del'>-        priv = this-&gt;private;</div><div class='add'>+    if (notify_rpc) {</div><div class='add'>+        rpc_transport_notify(this, event, this);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        pthread_mutex_lock (&amp;priv-&gt;lock);</div><div class='del'>-        {</div><div class='del'>-		if (priv-&gt;connected)</div><div class='del'>-			goto unlock;</div><div class='del'>-</div><div class='del'>-		ret = __socket_connect_finish (priv-&gt;sock);</div><div class='del'>-</div><div class='del'>-		if (ret == -1 &amp;&amp; errno == EINPROGRESS)</div><div class='del'>-			ret = 1;</div><div class='del'>-</div><div class='del'>-		if (ret == -1 &amp;&amp; errno != EINPROGRESS) {</div><div class='del'>-			if (!priv-&gt;connect_finish_log) {</div><div class='del'>-				gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-					"connection to %s failed (%s)",</div><div class='del'>-                                        this-&gt;peerinfo.identifier,</div><div class='del'>-					strerror (errno));</div><div class='del'>-				priv-&gt;connect_finish_log = 1;</div><div class='del'>-			}</div><div class='del'>-			__socket_disconnect (this);</div><div class='del'>-			notify_rpc = 1;</div><div class='del'>-			event = RPC_TRANSPORT_DISCONNECT;</div><div class='del'>-			goto unlock;</div><div class='del'>-		}</div><div class='del'>-</div><div class='del'>-		if (ret == 0) {</div><div class='del'>-			notify_rpc = 1;</div><div class='del'>-</div><div class='del'>-			this-&gt;myinfo.sockaddr_len =</div><div class='del'>-				sizeof (this-&gt;myinfo.sockaddr);</div><div class='del'>-</div><div class='del'>-			ret = getsockname (priv-&gt;sock,</div><div class='del'>-					   SA (&amp;this-&gt;myinfo.sockaddr),</div><div class='del'>-					   &amp;this-&gt;myinfo.sockaddr_len);</div><div class='del'>-			if (ret == -1) {</div><div class='del'>-				gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-					"getsockname on (%d) failed (%s)",</div><div class='del'>-					priv-&gt;sock, strerror (errno));</div><div class='del'>-				__socket_disconnect (this);</div><div class='del'>-				event = GF_EVENT_POLLERR;</div><div class='del'>-				goto unlock;</div><div class='del'>-			}</div><div class='del'>-</div><div class='del'>-			priv-&gt;connected = 1;</div><div class='del'>-			priv-&gt;connect_finish_log = 0;</div><div class='del'>-			event = RPC_TRANSPORT_CONNECT;</div><div class='del'>-			get_transport_identifiers (this);</div><div class='del'>-		}</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+socket_disconnect(rpc_transport_t *this, gf_boolean_t wait);</div><div class='add'>+</div><div class='add'>+/* socket_is_connected() is for use only in socket_event_handler() */</div><div class='add'>+static inline gf_boolean_t</div><div class='add'>+socket_is_connected(socket_private_t *priv)</div><div class='add'>+{</div><div class='add'>+    if (priv-&gt;use_ssl) {</div><div class='add'>+        return priv-&gt;is_server ? priv-&gt;ssl_accepted : priv-&gt;ssl_connected;</div><div class='add'>+    } else {</div><div class='add'>+        return priv-&gt;is_server ? priv-&gt;accepted : priv-&gt;connected;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+ssl_rearm_event_fd(rpc_transport_t *this)</div><div class='add'>+{</div><div class='add'>+    socket_private_t *priv = NULL;</div><div class='add'>+    glusterfs_ctx_t *ctx = NULL;</div><div class='add'>+    int idx = -1;</div><div class='add'>+    int gen = -1;</div><div class='add'>+    int fd = -1;</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+    ctx = this-&gt;ctx;</div><div class='add'>+</div><div class='add'>+    idx = priv-&gt;idx;</div><div class='add'>+    gen = priv-&gt;gen;</div><div class='add'>+    fd = priv-&gt;sock;</div><div class='add'>+</div><div class='add'>+    if (priv-&gt;ssl_error_required == SSL_ERROR_WANT_READ)</div><div class='add'>+        gf_event_select_on(ctx-&gt;event_pool, fd, idx, 1, -1);</div><div class='add'>+    if (priv-&gt;ssl_error_required == SSL_ERROR_WANT_WRITE)</div><div class='add'>+        gf_event_select_on(ctx-&gt;event_pool, fd, idx, -1, 1);</div><div class='add'>+    gf_event_handled(ctx-&gt;event_pool, fd, idx, gen);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+ssl_handle_server_connection_attempt(rpc_transport_t *this)</div><div class='add'>+{</div><div class='add'>+    socket_private_t *priv = NULL;</div><div class='add'>+    glusterfs_ctx_t *ctx = NULL;</div><div class='add'>+    int idx = -1;</div><div class='add'>+    int gen = -1;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int fd = -1;</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+    ctx = this-&gt;ctx;</div><div class='add'>+</div><div class='add'>+    idx = priv-&gt;idx;</div><div class='add'>+    gen = priv-&gt;gen;</div><div class='add'>+    fd = priv-&gt;sock;</div><div class='add'>+</div><div class='add'>+    if (!priv-&gt;ssl_context_created) {</div><div class='add'>+        ret = ssl_setup_connection_prefix(this, _gf_true);</div><div class='add'>+        if (ret &lt; 0) {</div><div class='add'>+            gf_log(this-&gt;name, GF_LOG_TRACE,</div><div class='add'>+                   "&gt; ssl_setup_connection_prefix() failed!");</div><div class='add'>+            ret = -1;</div><div class='add'>+            goto out;</div><div class='add'>+        } else {</div><div class='add'>+            priv-&gt;ssl_context_created = _gf_true;</div><div class='ctx'>         }</div><div class='del'>-unlock:</div><div class='del'>-        pthread_mutex_unlock (&amp;priv-&gt;lock);</div><div class='add'>+    }</div><div class='add'>+    ret = ssl_complete_connection(this);</div><div class='add'>+    if (ret == 0) {</div><div class='add'>+        /* nothing to do */</div><div class='add'>+        gf_event_select_on(ctx-&gt;event_pool, fd, idx, 1, 0);</div><div class='add'>+        gf_event_handled(ctx-&gt;event_pool, fd, idx, gen);</div><div class='add'>+        ret = 1;</div><div class='add'>+    } else {</div><div class='add'>+        if (errno == EAGAIN) {</div><div class='add'>+            ssl_rearm_event_fd(this);</div><div class='add'>+            ret = 1;</div><div class='add'>+        } else {</div><div class='add'>+            ret = -1;</div><div class='add'>+            gf_log(this-&gt;name, GF_LOG_TRACE,</div><div class='add'>+                   "ssl_complete_connection returned error");</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        if (notify_rpc) {</div><div class='del'>-                rpc_transport_notify (this, event, this);</div><div class='add'>+static int</div><div class='add'>+ssl_handle_client_connection_attempt(rpc_transport_t *this)</div><div class='add'>+{</div><div class='add'>+    socket_private_t *priv = NULL;</div><div class='add'>+    glusterfs_ctx_t *ctx = NULL;</div><div class='add'>+    int idx = -1;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int fd = -1;</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+    ctx = this-&gt;ctx;</div><div class='add'>+</div><div class='add'>+    idx = priv-&gt;idx;</div><div class='add'>+    fd = priv-&gt;sock;</div><div class='add'>+</div><div class='add'>+    /* SSL client */</div><div class='add'>+    if (priv-&gt;connect_failed) {</div><div class='add'>+        gf_log(this-&gt;name, GF_LOG_TRACE, "&gt;&gt;&gt; disconnecting SSL socket");</div><div class='add'>+        (void)socket_disconnect(this, _gf_false);</div><div class='add'>+        /* Force ret to be -1, as we are officially done with</div><div class='add'>+           this socket */</div><div class='add'>+        ret = -1;</div><div class='add'>+    } else {</div><div class='add'>+        if (!priv-&gt;ssl_context_created) {</div><div class='add'>+            ret = ssl_setup_connection_prefix(this, _gf_false);</div><div class='add'>+            if (ret &lt; 0) {</div><div class='add'>+                gf_log(this-&gt;name, GF_LOG_TRACE,</div><div class='add'>+                       "&gt; ssl_setup_connection_prefix() "</div><div class='add'>+                       "failed!");</div><div class='add'>+                ret = -1;</div><div class='add'>+                goto out;</div><div class='add'>+            } else {</div><div class='add'>+                priv-&gt;ssl_context_created = _gf_true;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+        ret = ssl_complete_connection(this);</div><div class='add'>+        if (ret == 0) {</div><div class='add'>+            ret = socket_connect_finish(this);</div><div class='add'>+            gf_event_select_on(ctx-&gt;event_pool, fd, idx, 1, 0);</div><div class='add'>+            gf_log(this-&gt;name, GF_LOG_TRACE, "&gt;&gt;&gt; completed client connect");</div><div class='add'>+        } else {</div><div class='add'>+            if (errno == EAGAIN) {</div><div class='add'>+                gf_log(this-&gt;name, GF_LOG_TRACE,</div><div class='add'>+                       "&gt;&gt;&gt; retrying client connect 2");</div><div class='add'>+                ssl_rearm_event_fd(this);</div><div class='add'>+                ret = 1;</div><div class='add'>+            } else {</div><div class='add'>+                /* this is a connection failure */</div><div class='add'>+                (void)socket_connect_finish(this);</div><div class='add'>+                gf_log(this-&gt;name, GF_LOG_TRACE,</div><div class='add'>+                       "ssl_complete_connection "</div><div class='add'>+                       "returned error");</div><div class='add'>+                ret = -1;</div><div class='add'>+            }</div><div class='ctx'>         }</div><div class='add'>+    }</div><div class='ctx'> out:</div><div class='del'>-        return 0;</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+static int</div><div class='add'>+socket_handle_client_connection_attempt(rpc_transport_t *this)</div><div class='add'>+{</div><div class='add'>+    socket_private_t *priv = NULL;</div><div class='add'>+    glusterfs_ctx_t *ctx = NULL;</div><div class='add'>+    int idx = -1;</div><div class='add'>+    int gen = -1;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int fd = -1;</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+    ctx = this-&gt;ctx;</div><div class='add'>+</div><div class='add'>+    idx = priv-&gt;idx;</div><div class='add'>+    gen = priv-&gt;gen;</div><div class='add'>+    fd = priv-&gt;sock;</div><div class='add'>+</div><div class='add'>+    /* non-SSL client */</div><div class='add'>+    if (priv-&gt;connect_failed) {</div><div class='add'>+        /* connect failed with some other error than</div><div class='add'>+           EINPROGRESS or ENOENT, so nothing more to</div><div class='add'>+           do, fail reading/writing anything even if</div><div class='add'>+           poll_in or poll_out</div><div class='add'>+           is set</div><div class='add'>+           */</div><div class='add'>+        gf_log("transport", GF_LOG_DEBUG,</div><div class='add'>+               "connect failed with some other error "</div><div class='add'>+               "than EINPROGRESS or ENOENT, so "</div><div class='add'>+               "nothing more to do; disconnecting "</div><div class='add'>+               "socket");</div><div class='add'>+        (void)socket_disconnect(this, _gf_false);</div><div class='add'>+</div><div class='add'>+        /* Force ret to be -1, as we are officially</div><div class='add'>+         * done with this socket</div><div class='add'>+         */</div><div class='add'>+        ret = -1;</div><div class='add'>+    } else {</div><div class='add'>+        ret = socket_connect_finish(this);</div><div class='add'>+        gf_log(this-&gt;name, GF_LOG_TRACE, "socket_connect_finish() returned %d",</div><div class='add'>+               ret);</div><div class='add'>+        if (ret == 0 || ret == 1) {</div><div class='add'>+            /* we don't want to do any reads or</div><div class='add'>+             * writes on the connection yet in</div><div class='add'>+             * socket_event_handler, so just</div><div class='add'>+             * return 1</div><div class='add'>+             */</div><div class='add'>+            ret = 1;</div><div class='add'>+            gf_event_handled(ctx-&gt;event_pool, fd, idx, gen);</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+socket_complete_connection(rpc_transport_t *this)</div><div class='add'>+{</div><div class='add'>+    socket_private_t *priv = NULL;</div><div class='add'>+    glusterfs_ctx_t *ctx = NULL;</div><div class='add'>+    int idx = -1;</div><div class='add'>+    int gen = -1;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int fd = -1;</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+    ctx = this-&gt;ctx;</div><div class='add'>+</div><div class='add'>+    idx = priv-&gt;idx;</div><div class='add'>+    gen = priv-&gt;gen;</div><div class='add'>+    fd = priv-&gt;sock;</div><div class='add'>+</div><div class='add'>+    if (priv-&gt;use_ssl) {</div><div class='add'>+        if (priv-&gt;is_server) {</div><div class='add'>+            ret = ssl_handle_server_connection_attempt(this);</div><div class='add'>+        } else {</div><div class='add'>+            ret = ssl_handle_client_connection_attempt(this);</div><div class='add'>+        }</div><div class='add'>+    } else {</div><div class='add'>+        if (priv-&gt;is_server) {</div><div class='add'>+            /* non-SSL server: nothing much to do</div><div class='add'>+             * connection has already been accepted in</div><div class='add'>+             * socket_server_event_handler()</div><div class='add'>+             */</div><div class='add'>+            priv-&gt;accepted = _gf_true;</div><div class='add'>+            gf_event_handled(ctx-&gt;event_pool, fd, idx, gen);</div><div class='add'>+            ret = 1;</div><div class='add'>+        } else {</div><div class='add'>+            ret = socket_handle_client_connection_attempt(this);</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> /* reads rpc_requests during pollin */</div><div class='del'>-int</div><div class='del'>-socket_event_handler (int fd, int idx, void *data,</div><div class='del'>-                      int poll_in, int poll_out, int poll_err)</div><div class='add'>+static void</div><div class='add'>+socket_event_handler(int fd, int idx, int gen, void *data, int poll_in,</div><div class='add'>+                     int poll_out, int poll_err, char event_thread_died)</div><div class='ctx'> {</div><div class='del'>-        rpc_transport_t      *this = NULL;</div><div class='del'>-        socket_private_t *priv = NULL;</div><div class='del'>-        int               ret = 0;</div><div class='add'>+    rpc_transport_t *this = NULL;</div><div class='add'>+    socket_private_t *priv = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    glusterfs_ctx_t *ctx = NULL;</div><div class='add'>+    gf_boolean_t socket_closed = _gf_false, notify_handled = _gf_false;</div><div class='ctx'> </div><div class='del'>-        this = data;</div><div class='del'>-        if (!this || !this-&gt;private || !this-&gt;xl)</div><div class='add'>+    this = data;</div><div class='add'>+</div><div class='add'>+    if (event_thread_died) {</div><div class='add'>+        /* to avoid duplicate notifications, notify only for listener sockets */</div><div class='add'>+        return;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* At this point we are sure no other thread is using the transport because</div><div class='add'>+     * we cannot receive more events until we call gf_event_handled(). However</div><div class='add'>+     * this function may call gf_event_handled() in some cases. When this is</div><div class='add'>+     * done, the transport may be destroyed at any moment if another thread</div><div class='add'>+     * handled an error event. To prevent that we take a reference here. */</div><div class='add'>+    rpc_transport_ref(this);</div><div class='add'>+</div><div class='add'>+    GF_VALIDATE_OR_GOTO("socket", this, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("socket", this-&gt;private, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("socket", this-&gt;xl, out);</div><div class='add'>+</div><div class='add'>+    THIS = this-&gt;xl;</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+    ctx = this-&gt;ctx;</div><div class='add'>+</div><div class='add'>+    pthread_mutex_lock(&amp;priv-&gt;out_lock);</div><div class='add'>+    {</div><div class='add'>+        priv-&gt;idx = idx;</div><div class='add'>+        priv-&gt;gen = gen;</div><div class='add'>+    }</div><div class='add'>+    pthread_mutex_unlock(&amp;priv-&gt;out_lock);</div><div class='add'>+</div><div class='add'>+    gf_log(this-&gt;name, GF_LOG_TRACE, "%s (sock:%d) in:%d, out:%d, err:%d",</div><div class='add'>+           (priv-&gt;is_server ? "server" : "client"), priv-&gt;sock, poll_in,</div><div class='add'>+           poll_out, poll_err);</div><div class='add'>+</div><div class='add'>+    if (!poll_err) {</div><div class='add'>+        if (!socket_is_connected(priv)) {</div><div class='add'>+            gf_log(this-&gt;name, GF_LOG_TRACE,</div><div class='add'>+                   "%s (sock:%d) socket is not connected, "</div><div class='add'>+                   "completing connection",</div><div class='add'>+                   (priv-&gt;is_server ? "server" : "client"), priv-&gt;sock);</div><div class='add'>+</div><div class='add'>+            ret = socket_complete_connection(this);</div><div class='add'>+</div><div class='add'>+            gf_log(this-&gt;name, GF_LOG_TRACE,</div><div class='add'>+                   "(sock:%d) "</div><div class='add'>+                   "socket_complete_connection() returned %d",</div><div class='add'>+                   priv-&gt;sock, ret);</div><div class='add'>+</div><div class='add'>+            if (ret &gt; 0) {</div><div class='add'>+                gf_log(this-&gt;name, GF_LOG_TRACE,</div><div class='add'>+                       "(sock:%d) returning to wait on socket", priv-&gt;sock);</div><div class='ctx'>                 goto out;</div><div class='add'>+            }</div><div class='add'>+        } else {</div><div class='add'>+            char *sock_type = (priv-&gt;is_server ? "Server" : "Client");</div><div class='ctx'> </div><div class='del'>-        THIS = this-&gt;xl;</div><div class='del'>-        priv = this-&gt;private;</div><div class='add'>+            gf_log(this-&gt;name, GF_LOG_TRACE,</div><div class='add'>+                   "%s socket (%d) is already connected", sock_type,</div><div class='add'>+                   priv-&gt;sock);</div><div class='add'>+            ret = 0;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (!ret &amp;&amp; poll_out) {</div><div class='add'>+        ret = socket_event_poll_out(this);</div><div class='add'>+        gf_log(this-&gt;name, GF_LOG_TRACE,</div><div class='add'>+               "(sock:%d) "</div><div class='add'>+               "socket_event_poll_out returned %d",</div><div class='add'>+               priv-&gt;sock, ret);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (!ret &amp;&amp; poll_in) {</div><div class='add'>+        ret = socket_event_poll_in(this, !poll_err);</div><div class='add'>+        gf_log(this-&gt;name, GF_LOG_TRACE,</div><div class='add'>+               "(sock:%d) "</div><div class='add'>+               "socket_event_poll_in returned %d",</div><div class='add'>+               priv-&gt;sock, ret);</div><div class='add'>+        notify_handled = _gf_true;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if ((ret &lt; 0) || poll_err) {</div><div class='add'>+        struct sockaddr *sa = SA(&amp;this-&gt;peerinfo.sockaddr);</div><div class='add'>+</div><div class='add'>+        if (priv-&gt;is_server &amp;&amp;</div><div class='add'>+            SA(&amp;this-&gt;myinfo.sockaddr)-&gt;sa_family == AF_UNIX) {</div><div class='add'>+            sa = SA(&amp;this-&gt;myinfo.sockaddr);</div><div class='add'>+        }</div><div class='ctx'> </div><div class='add'>+        socket_dump_info(sa, priv-&gt;is_server, priv-&gt;use_ssl, priv-&gt;sock,</div><div class='add'>+                         this-&gt;name, "disconnecting from");</div><div class='ctx'> </div><div class='del'>-        pthread_mutex_lock (&amp;priv-&gt;lock);</div><div class='del'>-        {</div><div class='del'>-                priv-&gt;idx = idx;</div><div class='add'>+        /* Dump the SSL error stack to clear any errors that may otherwise</div><div class='add'>+         * resurface in the future.</div><div class='add'>+         */</div><div class='add'>+        if (priv-&gt;use_ssl &amp;&amp; priv-&gt;ssl_ssl) {</div><div class='add'>+            ssl_dump_error_stack(this-&gt;name);</div><div class='ctx'>         }</div><div class='del'>-        pthread_mutex_unlock (&amp;priv-&gt;lock);</div><div class='ctx'> </div><div class='del'>-        if (!priv-&gt;connected) {</div><div class='del'>-                ret = socket_connect_finish (this);</div><div class='del'>-        }</div><div class='add'>+        /* Logging has happened already in earlier cases */</div><div class='add'>+        gf_log("transport", ((ret &gt;= 0) ? GF_LOG_INFO : GF_LOG_DEBUG),</div><div class='add'>+               "EPOLLERR - disconnecting (sock:%d) (%s)", priv-&gt;sock,</div><div class='add'>+               (priv-&gt;use_ssl ? "SSL" : "non-SSL"));</div><div class='ctx'> </div><div class='del'>-        if (!ret &amp;&amp; poll_out) {</div><div class='del'>-                ret = socket_event_poll_out (this);</div><div class='del'>-        }</div><div class='add'>+        socket_closed = socket_event_poll_err(this, gen, idx);</div><div class='ctx'> </div><div class='del'>-        if (!ret &amp;&amp; poll_in) {</div><div class='del'>-                ret = socket_event_poll_in (this);</div><div class='del'>-        }</div><div class='add'>+        if (socket_closed)</div><div class='add'>+            rpc_transport_unref(this);</div><div class='ctx'> </div><div class='del'>-        if ((ret &lt; 0) || poll_err) {</div><div class='del'>-                gf_log ("transport", GF_LOG_TRACE, "disconnecting now");</div><div class='del'>-                socket_event_poll_err (this);</div><div class='del'>-                rpc_transport_unref (this);</div><div class='del'>-        }</div><div class='add'>+    } else if (!notify_handled) {</div><div class='add'>+        gf_event_handled(ctx-&gt;event_pool, fd, idx, gen);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='ctx'> out:</div><div class='del'>-        return 0;</div><div class='add'>+    rpc_transport_unref(this);</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+static void</div><div class='add'>+socket_server_event_handler(int fd, int idx, int gen, void *data, int poll_in,</div><div class='add'>+                            int poll_out, int poll_err, char event_thread_died)</div><div class='add'>+{</div><div class='add'>+    rpc_transport_t *this = NULL;</div><div class='add'>+    socket_private_t *priv = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    int new_sock = -1;</div><div class='add'>+    rpc_transport_t *new_trans = NULL;</div><div class='add'>+    struct sockaddr_storage new_sockaddr = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    socklen_t addrlen = sizeof(new_sockaddr);</div><div class='add'>+    socket_private_t *new_priv = NULL;</div><div class='add'>+    glusterfs_ctx_t *ctx = NULL;</div><div class='add'>+</div><div class='add'>+    this = data;</div><div class='add'>+    GF_VALIDATE_OR_GOTO("socket", this, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("socket", this-&gt;private, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("socket", this-&gt;xl, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("socket", this-&gt;ctx, out);</div><div class='add'>+</div><div class='add'>+    THIS = this-&gt;xl;</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+    ctx = this-&gt;ctx;</div><div class='add'>+</div><div class='add'>+    if (event_thread_died) {</div><div class='add'>+        rpc_transport_notify(this, RPC_TRANSPORT_EVENT_THREAD_DIED,</div><div class='add'>+                             (void *)(unsigned long)gen);</div><div class='add'>+        return;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-socket_server_event_handler (int fd, int idx, void *data,</div><div class='del'>-                             int poll_in, int poll_out, int poll_err)</div><div class='del'>-{</div><div class='del'>-        rpc_transport_t             *this = NULL;</div><div class='del'>-        socket_private_t        *priv = NULL;</div><div class='del'>-        int                      ret = 0;</div><div class='del'>-        int                      new_sock = -1;</div><div class='del'>-        rpc_transport_t             *new_trans = NULL;</div><div class='del'>-        struct sockaddr_storage  new_sockaddr = {0, };</div><div class='del'>-        socklen_t                addrlen = sizeof (new_sockaddr);</div><div class='del'>-        socket_private_t        *new_priv = NULL;</div><div class='del'>-	glusterfs_ctx_t         *ctx = NULL;</div><div class='del'>-</div><div class='del'>-        this = data;</div><div class='del'>-        if (!this || !this-&gt;private || !this-&gt;xl)</div><div class='del'>-                goto out;</div><div class='del'>-</div><div class='del'>-        THIS = this-&gt;xl;</div><div class='del'>-        priv = this-&gt;private;</div><div class='del'>-	ctx  = this-&gt;ctx;</div><div class='add'>+    /* NOTE:</div><div class='add'>+     * We have done away with the critical section in this function. since</div><div class='add'>+     * there's little that it helps with. There's no other code that</div><div class='add'>+     * attempts to unref the listener socket/transport from any other</div><div class='add'>+     * thread context while we are using it here.</div><div class='add'>+     */</div><div class='add'>+    priv-&gt;idx = idx;</div><div class='add'>+    priv-&gt;gen = gen;</div><div class='ctx'> </div><div class='del'>-        pthread_mutex_lock (&amp;priv-&gt;lock);</div><div class='del'>-        {</div><div class='del'>-                priv-&gt;idx = idx;</div><div class='add'>+    if (poll_err) {</div><div class='add'>+        socket_event_poll_err(this, gen, idx);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-                if (poll_in) {</div><div class='del'>-                        new_sock = accept (priv-&gt;sock, SA (&amp;new_sockaddr),</div><div class='del'>-					   &amp;addrlen);</div><div class='add'>+    if (poll_in) {</div><div class='add'>+        int aflags = 0;</div><div class='ctx'> </div><div class='del'>-                        if (new_sock == -1)</div><div class='del'>-                                goto unlock;</div><div class='add'>+        if (!priv-&gt;bio)</div><div class='add'>+            aflags = O_NONBLOCK;</div><div class='ctx'> </div><div class='del'>-                        if (!priv-&gt;bio) {</div><div class='del'>-                                ret = __socket_nonblock (new_sock);</div><div class='add'>+        new_sock = sys_accept(priv-&gt;sock, SA(&amp;new_sockaddr), &amp;addrlen, aflags);</div><div class='ctx'> </div><div class='del'>-                                if (ret == -1) {</div><div class='del'>-                                        gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-                                                "NBIO on %d failed (%s)",</div><div class='del'>-                                                new_sock, strerror (errno));</div><div class='add'>+        gf_event_handled(ctx-&gt;event_pool, fd, idx, gen);</div><div class='ctx'> </div><div class='del'>-                                        close (new_sock);</div><div class='del'>-                                        goto unlock;</div><div class='del'>-                                }</div><div class='del'>-                        }</div><div class='add'>+        if (new_sock &lt; 0) {</div><div class='add'>+            gf_log(this-&gt;name, GF_LOG_WARNING, "accept on %d failed (%s)",</div><div class='add'>+                   priv-&gt;sock, strerror(errno));</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-                        if (priv-&gt;nodelay) {</div><div class='del'>-                                ret = __socket_nodelay (new_sock);</div><div class='del'>-                                if (ret == -1) {</div><div class='del'>-                                        gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-                                                "setsockopt() failed for "</div><div class='del'>-                                                "NODELAY (%s)",</div><div class='del'>-                                                strerror (errno));</div><div class='del'>-                                }</div><div class='del'>-                        }</div><div class='add'>+        if (new_sockaddr.ss_family != AF_UNIX) {</div><div class='add'>+            if (priv-&gt;nodelay) {</div><div class='add'>+                ret = __socket_nodelay(new_sock);</div><div class='add'>+                if (ret != 0) {</div><div class='add'>+                    gf_log(this-&gt;name, GF_LOG_WARNING,</div><div class='add'>+                           "setsockopt() failed for "</div><div class='add'>+                           "NODELAY (%s)",</div><div class='add'>+                           strerror(errno));</div><div class='add'>+                }</div><div class='add'>+            }</div><div class='ctx'> </div><div class='del'>-                        new_trans = GF_CALLOC (1, sizeof (*new_trans),</div><div class='del'>-                                               gf_common_mt_rpc_trans_t);</div><div class='del'>-                        if (!new_trans)</div><div class='del'>-                                goto unlock;</div><div class='del'>-</div><div class='del'>-                        new_trans-&gt;name = gf_strdup (this-&gt;name);</div><div class='del'>-</div><div class='del'>-                        memcpy (&amp;new_trans-&gt;peerinfo.sockaddr, &amp;new_sockaddr,</div><div class='del'>-				addrlen);</div><div class='del'>-                        new_trans-&gt;peerinfo.sockaddr_len = addrlen;</div><div class='del'>-</div><div class='del'>-                        new_trans-&gt;myinfo.sockaddr_len =</div><div class='del'>-				sizeof (new_trans-&gt;myinfo.sockaddr);</div><div class='del'>-</div><div class='del'>-                        ret = getsockname (new_sock,</div><div class='del'>-                                           SA (&amp;new_trans-&gt;myinfo.sockaddr),</div><div class='del'>-                                           &amp;new_trans-&gt;myinfo.sockaddr_len);</div><div class='del'>-                        if (ret == -1) {</div><div class='del'>-                                gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-                                        "getsockname on %d failed (%s)",</div><div class='del'>-                                        new_sock, strerror (errno));</div><div class='del'>-                                close (new_sock);</div><div class='del'>-                                goto unlock;</div><div class='del'>-                        }</div><div class='add'>+            if (priv-&gt;keepalive) {</div><div class='add'>+                ret = __socket_keepalive(</div><div class='add'>+                    new_sock, new_sockaddr.ss_family, priv-&gt;keepaliveintvl,</div><div class='add'>+                    priv-&gt;keepaliveidle, priv-&gt;keepalivecnt, priv-&gt;timeout);</div><div class='add'>+                if (ret != 0)</div><div class='add'>+                    gf_log(this-&gt;name, GF_LOG_WARNING,</div><div class='add'>+                           "Failed to set keep-alive: %s", strerror(errno));</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-                        get_transport_identifiers (new_trans);</div><div class='del'>-                        socket_init (new_trans);</div><div class='del'>-                        new_trans-&gt;ops = this-&gt;ops;</div><div class='del'>-                        new_trans-&gt;init = this-&gt;init;</div><div class='del'>-                        new_trans-&gt;fini = this-&gt;fini;</div><div class='del'>-                        new_trans-&gt;ctx  = ctx;</div><div class='del'>-                        new_trans-&gt;xl   = this-&gt;xl;</div><div class='del'>-                        new_trans-&gt;mydata = this-&gt;mydata;</div><div class='del'>-                        new_trans-&gt;notify = this-&gt;notify;</div><div class='del'>-                        new_trans-&gt;listener = this;</div><div class='del'>-                        new_priv = new_trans-&gt;private;</div><div class='del'>-</div><div class='del'>-                        pthread_mutex_lock (&amp;new_priv-&gt;lock);</div><div class='del'>-                        {</div><div class='del'>-                                new_priv-&gt;sock = new_sock;</div><div class='del'>-                                new_priv-&gt;connected = 1;</div><div class='del'>-                                rpc_transport_ref (new_trans);</div><div class='del'>-</div><div class='del'>-                                new_priv-&gt;idx =</div><div class='del'>-					event_register (ctx-&gt;event_pool,</div><div class='del'>-							new_sock,</div><div class='del'>-							socket_event_handler,</div><div class='del'>-							new_trans, 1, 0);</div><div class='del'>-</div><div class='del'>-                                if (new_priv-&gt;idx == -1)</div><div class='del'>-                                        ret = -1;</div><div class='del'>-                        }</div><div class='del'>-                        pthread_mutex_unlock (&amp;new_priv-&gt;lock);</div><div class='del'>-                        if (ret == -1)</div><div class='del'>-                                goto unlock;</div><div class='add'>+        new_trans = GF_CALLOC(1, sizeof(*new_trans), gf_common_mt_rpc_trans_t);</div><div class='add'>+        if (!new_trans) {</div><div class='add'>+            sys_close(new_sock);</div><div class='add'>+            gf_log(this-&gt;name, GF_LOG_WARNING,</div><div class='add'>+                   "transport object allocation failure; "</div><div class='add'>+                   "closed newly accepted socket %d",</div><div class='add'>+                   new_sock);</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-                        ret = rpc_transport_notify (this, RPC_TRANSPORT_ACCEPT,</div><div class='del'>-                                                    new_trans);</div><div class='del'>-                }</div><div class='add'>+        ret = pthread_mutex_init(&amp;new_trans-&gt;lock, NULL);</div><div class='add'>+        if (ret != 0) {</div><div class='add'>+            gf_log(this-&gt;name, GF_LOG_WARNING,</div><div class='add'>+                   "pthread_mutex_init() failed: %s; closing newly accepted "</div><div class='add'>+                   "socket %d",</div><div class='add'>+                   strerror(errno), new_sock);</div><div class='add'>+            sys_close(new_sock);</div><div class='add'>+            GF_FREE(new_trans);</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+        INIT_LIST_HEAD(&amp;new_trans-&gt;list);</div><div class='add'>+</div><div class='add'>+        new_trans-&gt;name = gf_strdup(this-&gt;name);</div><div class='add'>+</div><div class='add'>+        memcpy(&amp;new_trans-&gt;peerinfo.sockaddr, &amp;new_sockaddr, addrlen);</div><div class='add'>+        new_trans-&gt;peerinfo.sockaddr_len = addrlen;</div><div class='add'>+</div><div class='add'>+        new_trans-&gt;myinfo.sockaddr_len = sizeof(new_trans-&gt;myinfo.sockaddr);</div><div class='add'>+</div><div class='add'>+        ret = getsockname(new_sock, SA(&amp;new_trans-&gt;myinfo.sockaddr),</div><div class='add'>+                          &amp;new_trans-&gt;myinfo.sockaddr_len);</div><div class='add'>+        if (ret != 0) {</div><div class='add'>+            gf_log(this-&gt;name, GF_LOG_WARNING,</div><div class='add'>+                   "getsockname on socket %d "</div><div class='add'>+                   "failed (errno:%s); closing newly accepted socket",</div><div class='add'>+                   new_sock, strerror(errno));</div><div class='add'>+            sys_close(new_sock);</div><div class='add'>+            GF_FREE(new_trans-&gt;name);</div><div class='add'>+            GF_FREE(new_trans);</div><div class='add'>+            goto out;</div><div class='ctx'>         }</div><div class='del'>-unlock:</div><div class='del'>-        pthread_mutex_unlock (&amp;priv-&gt;lock);</div><div class='ctx'> </div><div class='del'>-out:</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='add'>+        get_transport_identifiers(new_trans);</div><div class='add'>+        gf_log(this-&gt;name, GF_LOG_TRACE, "XXX server:%s, client:%s",</div><div class='add'>+               new_trans-&gt;myinfo.identifier, new_trans-&gt;peerinfo.identifier);</div><div class='add'>+</div><div class='add'>+        /* Make options available to local socket_init() to create new</div><div class='add'>+         * SSL_CTX per transport. A separate SSL_CTX per transport is</div><div class='add'>+         * required to avoid setting crl checking options for client</div><div class='add'>+         * connections. The verification options eventually get copied</div><div class='add'>+         * to the SSL object. Unfortunately, there's no way to identify</div><div class='add'>+         * whether socket_init() is being called after a client-side</div><div class='add'>+         * connect() or a server-side accept(). Although, we could pass</div><div class='add'>+         * a flag from the transport init() to the socket_init() and</div><div class='add'>+         * from this place, this doesn't identify the case where the</div><div class='add'>+         * server-side transport loading is done for the first time.</div><div class='add'>+         * Also, SSL doesn't apply for UNIX sockets.</div><div class='add'>+         */</div><div class='add'>+        if (new_sockaddr.ss_family != AF_UNIX)</div><div class='add'>+            new_trans-&gt;options = dict_ref(this-&gt;options);</div><div class='add'>+        new_trans-&gt;ctx = this-&gt;ctx;</div><div class='add'>+</div><div class='add'>+        ret = socket_init(new_trans);</div><div class='add'>+</div><div class='add'>+        /* reset options to NULL to avoid double free */</div><div class='add'>+        if (new_sockaddr.ss_family != AF_UNIX) {</div><div class='add'>+            dict_unref(new_trans-&gt;options);</div><div class='add'>+            new_trans-&gt;options = NULL;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='add'>+        if (ret != 0) {</div><div class='add'>+            gf_log(this-&gt;name, GF_LOG_WARNING,</div><div class='add'>+                   "initialization of new_trans "</div><div class='add'>+                   "failed; closing newly accepted socket %d",</div><div class='add'>+                   new_sock);</div><div class='add'>+            sys_close(new_sock);</div><div class='add'>+            GF_FREE(new_trans-&gt;name);</div><div class='add'>+            GF_FREE(new_trans);</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+        new_trans-&gt;ops = this-&gt;ops;</div><div class='add'>+        new_trans-&gt;init = this-&gt;init;</div><div class='add'>+        new_trans-&gt;fini = this-&gt;fini;</div><div class='add'>+        new_trans-&gt;ctx = ctx;</div><div class='add'>+        new_trans-&gt;xl = this-&gt;xl;</div><div class='add'>+        new_trans-&gt;mydata = this-&gt;mydata;</div><div class='add'>+        new_trans-&gt;notify = this-&gt;notify;</div><div class='add'>+        new_trans-&gt;listener = this;</div><div class='add'>+        new_trans-&gt;notify_poller_death = this-&gt;poller_death_accept;</div><div class='add'>+        new_priv = new_trans-&gt;private;</div><div class='add'>+</div><div class='add'>+        if (new_sockaddr.ss_family == AF_UNIX) {</div><div class='add'>+            new_priv-&gt;use_ssl = _gf_false;</div><div class='add'>+        } else {</div><div class='add'>+            switch (priv-&gt;srvr_ssl) {</div><div class='add'>+                case MGMT_SSL_ALWAYS:</div><div class='add'>+                    /* Glusterd with secure_mgmt. */</div><div class='add'>+                    new_priv-&gt;use_ssl = _gf_true;</div><div class='add'>+                    break;</div><div class='add'>+                case MGMT_SSL_COPY_IO:</div><div class='add'>+                    /* Glusterfsd. */</div><div class='add'>+                    new_priv-&gt;use_ssl = priv-&gt;ssl_enabled;</div><div class='add'>+                    break;</div><div class='add'>+                default:</div><div class='add'>+                    new_priv-&gt;use_ssl = _gf_false;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-socket_disconnect (rpc_transport_t *this)</div><div class='del'>-{</div><div class='del'>-        socket_private_t *priv = NULL;</div><div class='del'>-        int               ret = -1;</div><div class='add'>+        new_priv-&gt;sock = new_sock;</div><div class='ctx'> </div><div class='del'>-        if (!this || !this-&gt;private)</div><div class='del'>-                goto out;</div><div class='add'>+        new_priv-&gt;ssl_enabled = priv-&gt;ssl_enabled;</div><div class='add'>+        new_priv-&gt;connected = 1;</div><div class='add'>+        new_priv-&gt;is_server = _gf_true;</div><div class='ctx'> </div><div class='del'>-        priv = this-&gt;private;</div><div class='add'>+        /*</div><div class='add'>+         * This is the first ref on the newly accepted</div><div class='add'>+         * transport.</div><div class='add'>+         */</div><div class='add'>+        rpc_transport_ref(new_trans);</div><div class='ctx'> </div><div class='del'>-        pthread_mutex_lock (&amp;priv-&gt;lock);</div><div class='ctx'>         {</div><div class='del'>-                ret = __socket_disconnect (this);</div><div class='add'>+            /* Take a ref on the new_trans to avoid</div><div class='add'>+             * getting deleted when event_register()</div><div class='add'>+             * causes socket_event_handler() to race</div><div class='add'>+             * ahead of this path to eventually find</div><div class='add'>+             * a disconnect and unref the transport</div><div class='add'>+             */</div><div class='add'>+            rpc_transport_ref(new_trans);</div><div class='add'>+</div><div class='add'>+            /* Send a notification to RPCSVC layer</div><div class='add'>+             * to save the new_trans in its service</div><div class='add'>+             * list before we register the new_sock</div><div class='add'>+             * with epoll to begin receiving notifications</div><div class='add'>+             * for data handling.</div><div class='add'>+             */</div><div class='add'>+            ret = rpc_transport_notify(this, RPC_TRANSPORT_ACCEPT, new_trans);</div><div class='add'>+</div><div class='add'>+            if (ret &gt;= 0) {</div><div class='add'>+                new_priv-&gt;idx = gf_event_register(</div><div class='add'>+                    ctx-&gt;event_pool, new_sock, socket_event_handler, new_trans,</div><div class='add'>+                    1, 0, new_trans-&gt;notify_poller_death);</div><div class='add'>+                if (new_priv-&gt;idx == -1) {</div><div class='add'>+                    ret = -1;</div><div class='add'>+                    gf_log(this-&gt;name, GF_LOG_ERROR,</div><div class='add'>+                           "failed to register the socket "</div><div class='add'>+                           "with event");</div><div class='add'>+</div><div class='add'>+                    /* event_register() could have failed for some</div><div class='add'>+                     * reason, implying that the new_sock cannot be</div><div class='add'>+                     * added to the epoll set. If we won't get any</div><div class='add'>+                     * more notifications for new_sock from epoll,</div><div class='add'>+                     * then we better remove the corresponding</div><div class='add'>+                     * new_trans object from the RPCSVC service list.</div><div class='add'>+                     * Since we've notified RPC service of new_trans</div><div class='add'>+                     * before we attempted event_register(), we better</div><div class='add'>+                     * unlink the new_trans from the RPCSVC service list</div><div class='add'>+                     * to cleanup the stateby sending out a DISCONNECT</div><div class='add'>+                     * notification.</div><div class='add'>+                     */</div><div class='add'>+                    rpc_transport_notify(this, RPC_TRANSPORT_DISCONNECT,</div><div class='add'>+                                         new_trans);</div><div class='add'>+                }</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            /* this rpc_transport_unref() is for managing race between</div><div class='add'>+             * 1. socket_server_event_handler and</div><div class='add'>+             * 2. socket_event_handler</div><div class='add'>+             * trying to add and remove new_trans from the rpcsvc</div><div class='add'>+             * service list</div><div class='add'>+             * now that we are done with the notifications, lets</div><div class='add'>+             * reduce the reference</div><div class='add'>+             */</div><div class='add'>+            rpc_transport_unref(new_trans);</div><div class='ctx'>         }</div><div class='del'>-        pthread_mutex_unlock (&amp;priv-&gt;lock);</div><div class='ctx'> </div><div class='add'>+        if (ret &lt; 0) {</div><div class='add'>+            gf_log(this-&gt;name, GF_LOG_WARNING, "closing newly accepted socket");</div><div class='add'>+            sys_close(new_sock);</div><div class='add'>+            /* this unref is to actually cause the destruction of</div><div class='add'>+             * the new_trans since we've failed at everything so far</div><div class='add'>+             */</div><div class='add'>+            rpc_transport_unref(new_trans);</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='ctx'> out:</div><div class='del'>-        return ret;</div><div class='add'>+    return;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+static int</div><div class='add'>+socket_disconnect(rpc_transport_t *this, gf_boolean_t wait)</div><div class='add'>+{</div><div class='add'>+    socket_private_t *priv = NULL;</div><div class='add'>+    int ret = -1;</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-socket_connect (rpc_transport_t *this, int port)</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    pthread_mutex_lock(&amp;priv-&gt;out_lock);</div><div class='add'>+    {</div><div class='add'>+        ret = __socket_disconnect(this);</div><div class='add'>+    }</div><div class='add'>+    pthread_mutex_unlock(&amp;priv-&gt;out_lock);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void *</div><div class='add'>+socket_connect_error_cbk(void *opaque)</div><div class='ctx'> {</div><div class='del'>-        int                      ret = -1;</div><div class='del'>-	int                      sock = -1;</div><div class='del'>-        socket_private_t        *priv = NULL;</div><div class='del'>-        struct sockaddr_storage  sockaddr = {0, };</div><div class='del'>-        socklen_t                sockaddr_len = 0;</div><div class='del'>-	glusterfs_ctx_t         *ctx = NULL;</div><div class='del'>-        sa_family_t              sa_family = {0, };</div><div class='add'>+    socket_connect_error_state_t *arg;</div><div class='ctx'> </div><div class='del'>-        if (!this || !this-&gt;private)</div><div class='del'>-                goto err;</div><div class='add'>+    GF_ASSERT(opaque);</div><div class='ctx'> </div><div class='del'>-        priv = this-&gt;private;</div><div class='del'>-	ctx = this-&gt;ctx;</div><div class='add'>+    arg = opaque;</div><div class='add'>+    THIS = arg-&gt;this;</div><div class='ctx'> </div><div class='del'>-        if (!priv) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-                        "connect() called on uninitialized transport");</div><div class='del'>-                goto err;</div><div class='del'>-        }</div><div class='add'>+    rpc_transport_notify(arg-&gt;trans, RPC_TRANSPORT_DISCONNECT, arg-&gt;trans);</div><div class='ctx'> </div><div class='del'>-        pthread_mutex_lock (&amp;priv-&gt;lock);</div><div class='del'>-        {</div><div class='del'>-                sock = priv-&gt;sock;</div><div class='del'>-        }</div><div class='del'>-        pthread_mutex_unlock (&amp;priv-&gt;lock);</div><div class='add'>+    if (arg-&gt;refd)</div><div class='add'>+        rpc_transport_unref(arg-&gt;trans);</div><div class='ctx'> </div><div class='del'>-        if (sock != -1) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_TRACE,</div><div class='del'>-                        "connect () called on transport already connected");</div><div class='del'>-                ret = 0;</div><div class='del'>-                goto err;</div><div class='add'>+    GF_FREE(opaque);</div><div class='add'>+    return NULL;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+socket_fix_ssl_opts(rpc_transport_t *this, socket_private_t *priv,</div><div class='add'>+                    uint16_t port)</div><div class='add'>+{</div><div class='add'>+    if (port == GF_DEFAULT_SOCKET_LISTEN_PORT) {</div><div class='add'>+        gf_log(this-&gt;name, GF_LOG_DEBUG, "%s SSL for portmapper connection",</div><div class='add'>+               priv-&gt;mgmt_ssl ? "enabling" : "disabling");</div><div class='add'>+        priv-&gt;use_ssl = priv-&gt;mgmt_ssl;</div><div class='add'>+    } else if (priv-&gt;ssl_enabled &amp;&amp; !priv-&gt;use_ssl) {</div><div class='add'>+        gf_log(this-&gt;name, GF_LOG_DEBUG, "re-enabling SSL for I/O connection");</div><div class='add'>+        priv-&gt;use_ssl = _gf_true;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+ * If we might just be trying to connect prematurely, e.g. to a brick that's</div><div class='add'>+ * slow coming up, all we need is a simple retry.  Don't worry about sleeping</div><div class='add'>+ * in some arbitrary thread.  The connect(2) could already have the exact same</div><div class='add'>+ * effect, and we deal with it in that case so we can deal with it for sleep(2)</div><div class='add'>+ * as well.</div><div class='add'>+ */</div><div class='add'>+static int</div><div class='add'>+connect_loop(int sockfd, const struct sockaddr *addr, socklen_t addrlen)</div><div class='add'>+{</div><div class='add'>+    int ret;</div><div class='add'>+    int connect_fails = 0;</div><div class='add'>+</div><div class='add'>+    for (;;) {</div><div class='add'>+        ret = connect(sockfd, addr, addrlen);</div><div class='add'>+        if (ret &gt;= 0) {</div><div class='add'>+            break;</div><div class='add'>+        }</div><div class='add'>+        if ((errno != ENOENT) || (++connect_fails &gt;= 5)) {</div><div class='add'>+            break;</div><div class='ctx'>         }</div><div class='add'>+        sleep(1);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        ret = socket_client_get_remote_sockaddr (this, SA (&amp;sockaddr),</div><div class='del'>-                                                 &amp;sockaddr_len, &amp;sa_family);</div><div class='del'>-        if (ret == -1) {</div><div class='del'>-                /* logged inside client_get_remote_sockaddr */</div><div class='del'>-                goto err;</div><div class='add'>+static int</div><div class='add'>+socket_connect(rpc_transport_t *this, int port)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int th_ret = -1;</div><div class='add'>+    int sock = -1;</div><div class='add'>+    socket_private_t *priv = NULL;</div><div class='add'>+    socklen_t sockaddr_len = 0;</div><div class='add'>+    glusterfs_ctx_t *ctx = NULL;</div><div class='add'>+    sa_family_t sa_family = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    char *local_addr = NULL;</div><div class='add'>+    union gf_sock_union sock_union;</div><div class='add'>+    struct sockaddr_in *addr = NULL;</div><div class='add'>+    gf_boolean_t refd = _gf_false;</div><div class='add'>+    socket_connect_error_state_t *arg = NULL;</div><div class='add'>+    pthread_t th_id = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    gf_boolean_t ign_enoent = _gf_false;</div><div class='add'>+    gf_boolean_t connect_attempted = _gf_false;</div><div class='add'>+</div><div class='add'>+    GF_VALIDATE_OR_GOTO("socket", this, err);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("socket", this-&gt;private, err);</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+    ctx = this-&gt;ctx;</div><div class='add'>+</div><div class='add'>+    if (!priv) {</div><div class='add'>+        gf_log_callingfn(this-&gt;name, GF_LOG_WARNING,</div><div class='add'>+                         "connect() called on uninitialized transport");</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    pthread_mutex_lock(&amp;priv-&gt;out_lock);</div><div class='add'>+    {</div><div class='add'>+        if (priv-&gt;sock &gt;= 0) {</div><div class='add'>+            gf_log_callingfn(this-&gt;name, GF_LOG_TRACE,</div><div class='add'>+                             "connect () called on transport "</div><div class='add'>+                             "already connected");</div><div class='add'>+            errno = EINPROGRESS;</div><div class='add'>+            ret = -1;</div><div class='add'>+            goto unlock;</div><div class='ctx'>         }</div><div class='ctx'> </div><div class='del'>-        if (port &gt; 0)</div><div class='del'>-                ((struct sockaddr_in *) (&amp;sockaddr))-&gt;sin_port = htons (port);</div><div class='add'>+        gf_log(this-&gt;name, GF_LOG_TRACE, "connecting %p, sock=%d", this,</div><div class='add'>+               priv-&gt;sock);</div><div class='ctx'> </div><div class='del'>-        pthread_mutex_lock (&amp;priv-&gt;lock);</div><div class='del'>-        {</div><div class='del'>-                if (priv-&gt;sock != -1) {</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_TRACE,</div><div class='del'>-                                "connect() -- already connected");</div><div class='del'>-                        goto unlock;</div><div class='del'>-                }</div><div class='add'>+        ret = socket_client_get_remote_sockaddr(this, &amp;sock_union.sa,</div><div class='add'>+                                                &amp;sockaddr_len, &amp;sa_family);</div><div class='add'>+        if (ret &lt; 0) {</div><div class='add'>+            /* logged inside client_get_remote_sockaddr */</div><div class='add'>+            goto unlock;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-                memcpy (&amp;this-&gt;peerinfo.sockaddr, &amp;sockaddr, sockaddr_len);</div><div class='del'>-                this-&gt;peerinfo.sockaddr_len = sockaddr_len;</div><div class='add'>+        if (sa_family == AF_UNIX) {</div><div class='add'>+            priv-&gt;ssl_enabled = _gf_false;</div><div class='add'>+            priv-&gt;mgmt_ssl = _gf_false;</div><div class='add'>+        } else {</div><div class='add'>+            if (port &gt; 0) {</div><div class='add'>+                sock_union.sin.sin_port = htons(port);</div><div class='add'>+            }</div><div class='add'>+            socket_fix_ssl_opts(this, priv, ntohs(sock_union.sin.sin_port));</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-                priv-&gt;sock = socket (sa_family, SOCK_STREAM, 0);</div><div class='del'>-                if (priv-&gt;sock == -1) {</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-                                "socket creation failed (%s)",</div><div class='del'>-				strerror (errno));</div><div class='del'>-                        goto unlock;</div><div class='del'>-                }</div><div class='add'>+        memcpy(&amp;this-&gt;peerinfo.sockaddr, &amp;sock_union.storage, sockaddr_len);</div><div class='add'>+        this-&gt;peerinfo.sockaddr_len = sockaddr_len;</div><div class='ctx'> </div><div class='del'>-                /* Cant help if setting socket options fails. We can continue</div><div class='del'>-                 * working nonetheless.</div><div class='del'>-                 */</div><div class='del'>-                if (setsockopt (priv-&gt;sock, SOL_SOCKET, SO_RCVBUF,</div><div class='del'>-                                &amp;priv-&gt;windowsize,</div><div class='del'>-                                sizeof (priv-&gt;windowsize)) &lt; 0) {</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-                                "setting receive window size failed: %d: %d: "</div><div class='del'>-                                "%s", priv-&gt;sock, priv-&gt;windowsize,</div><div class='del'>-                                strerror (errno));</div><div class='del'>-                }</div><div class='add'>+        priv-&gt;sock = sys_socket(sa_family, SOCK_STREAM, 0);</div><div class='add'>+        if (priv-&gt;sock &lt; 0) {</div><div class='add'>+            gf_log(this-&gt;name, GF_LOG_ERROR, "socket creation failed (%s)",</div><div class='add'>+                   strerror(errno));</div><div class='add'>+            ret = -1;</div><div class='add'>+            goto unlock;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-                if (setsockopt (priv-&gt;sock, SOL_SOCKET, SO_SNDBUF,</div><div class='del'>-                                &amp;priv-&gt;windowsize,</div><div class='del'>-                                sizeof (priv-&gt;windowsize)) &lt; 0) {</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-                                "setting send window size failed: %d: %d: "</div><div class='del'>-                                "%s", priv-&gt;sock, priv-&gt;windowsize,</div><div class='del'>-                                strerror (errno));</div><div class='del'>-                }</div><div class='add'>+        /* Can't help if setting socket options fails. We can continue</div><div class='add'>+         * working nonetheless.</div><div class='add'>+         */</div><div class='add'>+        if (priv-&gt;windowsize != 0) {</div><div class='add'>+            if (setsockopt(priv-&gt;sock, SOL_SOCKET, SO_RCVBUF, &amp;priv-&gt;windowsize,</div><div class='add'>+                           sizeof(priv-&gt;windowsize)) != 0) {</div><div class='add'>+                gf_log(this-&gt;name, GF_LOG_ERROR,</div><div class='add'>+                       "setting receive window "</div><div class='add'>+                       "size failed: %d: %d: %s",</div><div class='add'>+                       priv-&gt;sock, priv-&gt;windowsize, strerror(errno));</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            if (setsockopt(priv-&gt;sock, SOL_SOCKET, SO_SNDBUF, &amp;priv-&gt;windowsize,</div><div class='add'>+                           sizeof(priv-&gt;windowsize)) != 0) {</div><div class='add'>+                gf_log(this-&gt;name, GF_LOG_ERROR,</div><div class='add'>+                       "setting send window size "</div><div class='add'>+                       "failed: %d: %d: %s",</div><div class='add'>+                       priv-&gt;sock, priv-&gt;windowsize, strerror(errno));</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='ctx'> </div><div class='add'>+        /* Make sure we are not vulnerable to someone setting</div><div class='add'>+         * net.ipv6.bindv6only to 1 so that gluster services are</div><div class='add'>+         * available over IPv4 &amp; IPv6.</div><div class='add'>+         */</div><div class='add'>+#ifdef IPV6_DEFAULT</div><div class='add'>+        int disable_v6only = 0;</div><div class='add'>+        if (setsockopt(priv-&gt;sock, IPPROTO_IPV6, IPV6_V6ONLY,</div><div class='add'>+                       (void *)&amp;disable_v6only, sizeof(disable_v6only)) &lt; 0) {</div><div class='add'>+            gf_log(this-&gt;name, GF_LOG_WARNING,</div><div class='add'>+                   "Error disabling sockopt IPV6_V6ONLY: \"%s\"",</div><div class='add'>+                   strerror(errno));</div><div class='add'>+        }</div><div class='add'>+#endif</div><div class='ctx'> </div><div class='del'>-                if (priv-&gt;nodelay &amp;&amp; priv-&gt;lowlat) {</div><div class='del'>-                        ret = __socket_nodelay (priv-&gt;sock);</div><div class='del'>-                        if (ret == -1) {</div><div class='del'>-                                gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-                                        "setsockopt() failed for NODELAY (%s)",</div><div class='del'>-                                        strerror (errno));</div><div class='del'>-                        }</div><div class='add'>+        if (sa_family != AF_UNIX) {</div><div class='add'>+            if (priv-&gt;nodelay) {</div><div class='add'>+                ret = __socket_nodelay(priv-&gt;sock);</div><div class='add'>+                if (ret != 0) {</div><div class='add'>+                    gf_log(this-&gt;name, GF_LOG_ERROR,</div><div class='add'>+                           "NODELAY on %d failed (%s)", priv-&gt;sock,</div><div class='add'>+                           strerror(errno));</div><div class='ctx'>                 }</div><div class='add'>+            }</div><div class='ctx'> </div><div class='del'>-                if (!priv-&gt;bio) {</div><div class='del'>-                        ret = __socket_nonblock (priv-&gt;sock);</div><div class='add'>+            if (priv-&gt;keepalive) {</div><div class='add'>+                ret = __socket_keepalive(</div><div class='add'>+                    priv-&gt;sock, sa_family, priv-&gt;keepaliveintvl,</div><div class='add'>+                    priv-&gt;keepaliveidle, priv-&gt;keepalivecnt, priv-&gt;timeout);</div><div class='add'>+                if (ret != 0)</div><div class='add'>+                    gf_log(this-&gt;name, GF_LOG_ERROR,</div><div class='add'>+                           "Failed to set keep-alive: %s", strerror(errno));</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-                        if (ret == -1) {</div><div class='del'>-                                gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-                                        "NBIO on %d failed (%s)",</div><div class='del'>-                                        priv-&gt;sock, strerror (errno));</div><div class='del'>-                                close (priv-&gt;sock);</div><div class='del'>-                                priv-&gt;sock = -1;</div><div class='del'>-                                goto unlock;</div><div class='del'>-                        }</div><div class='del'>-                }</div><div class='add'>+        SA(&amp;this-&gt;myinfo.sockaddr)-&gt;sa_family = SA(&amp;this-&gt;peerinfo.sockaddr)</div><div class='add'>+                                                    -&gt;sa_family;</div><div class='ctx'> </div><div class='del'>-                SA (&amp;this-&gt;myinfo.sockaddr)-&gt;sa_family =</div><div class='del'>-			SA (&amp;this-&gt;peerinfo.sockaddr)-&gt;sa_family;</div><div class='del'>-</div><div class='del'>-                ret = client_bind (this, SA (&amp;this-&gt;myinfo.sockaddr),</div><div class='del'>-				   &amp;this-&gt;myinfo.sockaddr_len, priv-&gt;sock);</div><div class='del'>-                if (ret == -1) {</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_WARNING,</div><div class='del'>-                                "client bind failed: %s", strerror (errno));</div><div class='del'>-                        close (priv-&gt;sock);</div><div class='del'>-                        priv-&gt;sock = -1;</div><div class='del'>-                        goto unlock;</div><div class='del'>-                }</div><div class='add'>+        /* If a source addr is explicitly specified, use it */</div><div class='add'>+        ret = dict_get_str_sizen(this-&gt;options, "transport.socket.source-addr",</div><div class='add'>+                                 &amp;local_addr);</div><div class='add'>+        if (!ret &amp;&amp; SA(&amp;this-&gt;myinfo.sockaddr)-&gt;sa_family == AF_INET) {</div><div class='add'>+            addr = (struct sockaddr_in *)(&amp;this-&gt;myinfo.sockaddr);</div><div class='add'>+            ret = inet_pton(AF_INET, local_addr, &amp;(addr-&gt;sin_addr.s_addr));</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-                ret = connect (priv-&gt;sock, SA (&amp;this-&gt;peerinfo.sockaddr),</div><div class='del'>-			       this-&gt;peerinfo.sockaddr_len);</div><div class='add'>+        /* If client wants ENOENT to be ignored */</div><div class='add'>+        ign_enoent = dict_get_str_boolean(</div><div class='add'>+            this-&gt;options, "transport.socket.ignore-enoent", _gf_false);</div><div class='ctx'> </div><div class='del'>-                if (ret == -1 &amp;&amp; errno != EINPROGRESS) {</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-                                "connection attempt failed (%s)",</div><div class='del'>-				strerror (errno));</div><div class='del'>-                        close (priv-&gt;sock);</div><div class='del'>-                        priv-&gt;sock = -1;</div><div class='del'>-                        goto unlock;</div><div class='del'>-                }</div><div class='add'>+        ret = client_bind(this, SA(&amp;this-&gt;myinfo.sockaddr),</div><div class='add'>+                          &amp;this-&gt;myinfo.sockaddr_len, priv-&gt;sock);</div><div class='add'>+        if (ret &lt; 0) {</div><div class='add'>+            gf_log(this-&gt;name, GF_LOG_WARNING, "client bind failed: %s",</div><div class='add'>+                   strerror(errno));</div><div class='add'>+            goto handler;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-                priv-&gt;connected = 0;</div><div class='add'>+        /* make socket non-blocking for all types of sockets */</div><div class='add'>+        if (!priv-&gt;bio) {</div><div class='add'>+            ret = __socket_nonblock(priv-&gt;sock);</div><div class='add'>+            if (ret != 0) {</div><div class='add'>+                gf_log(this-&gt;name, GF_LOG_ERROR, "NBIO on %d failed (%s)",</div><div class='add'>+                       priv-&gt;sock, strerror(errno));</div><div class='add'>+                goto handler;</div><div class='add'>+            } else {</div><div class='add'>+                gf_log(this-&gt;name, GF_LOG_TRACE,</div><div class='add'>+                       "&gt;&gt;&gt; connect() with non-blocking IO for ALL");</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+        this-&gt;connect_failed = _gf_false;</div><div class='add'>+        priv-&gt;connect_failed = 0;</div><div class='add'>+        priv-&gt;connected = 0;</div><div class='ctx'> </div><div class='del'>-                rpc_transport_ref (this);</div><div class='add'>+        socket_dump_info(SA(&amp;this-&gt;peerinfo.sockaddr), priv-&gt;is_server,</div><div class='add'>+                         priv-&gt;use_ssl, priv-&gt;sock, this-&gt;name,</div><div class='add'>+                         "connecting to");</div><div class='ctx'> </div><div class='del'>-                priv-&gt;idx = event_register (ctx-&gt;event_pool, priv-&gt;sock,</div><div class='del'>-                                            socket_event_handler, this, 1, 1);</div><div class='del'>-                if (priv-&gt;idx == -1)</div><div class='del'>-                        ret = -1;</div><div class='add'>+        if (ign_enoent) {</div><div class='add'>+            ret = connect_loop(priv-&gt;sock, SA(&amp;this-&gt;peerinfo.sockaddr),</div><div class='add'>+                               this-&gt;peerinfo.sockaddr_len);</div><div class='add'>+        } else {</div><div class='add'>+            ret = connect(priv-&gt;sock, SA(&amp;this-&gt;peerinfo.sockaddr),</div><div class='add'>+                          this-&gt;peerinfo.sockaddr_len);</div><div class='ctx'>         }</div><div class='del'>-unlock:</div><div class='del'>-        pthread_mutex_unlock (&amp;priv-&gt;lock);</div><div class='ctx'> </div><div class='del'>-err:</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='add'>+        connect_attempted = _gf_true;</div><div class='ctx'> </div><div class='add'>+        if ((ret != 0) &amp;&amp; (errno == ENOENT) &amp;&amp; ign_enoent) {</div><div class='add'>+            gf_log(this-&gt;name, GF_LOG_WARNING,</div><div class='add'>+                   "Ignore failed connection attempt on %s, (%s) ",</div><div class='add'>+                   this-&gt;peerinfo.identifier, strerror(errno));</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-socket_listen (rpc_transport_t *this)</div><div class='del'>-{</div><div class='del'>-        socket_private_t *       priv = NULL;</div><div class='del'>-        int                      ret = -1;</div><div class='del'>-	int                      sock = -1;</div><div class='del'>-        struct sockaddr_storage  sockaddr;</div><div class='del'>-        socklen_t                sockaddr_len;</div><div class='del'>-        peer_info_t             *myinfo = NULL;</div><div class='del'>-	glusterfs_ctx_t         *ctx = NULL;</div><div class='del'>-        sa_family_t              sa_family = {0, };</div><div class='del'>-</div><div class='del'>-        if (!this || !this-&gt;private)</div><div class='del'>-                goto out;</div><div class='add'>+            /* connect failed with some other error than EINPROGRESS</div><div class='add'>+            so, getsockopt (... SO_ERROR ...), will not catch any</div><div class='add'>+            errors and return them to us, we need to remember this</div><div class='add'>+            state, and take actions in socket_event_handler</div><div class='add'>+            appropriately */</div><div class='add'>+            /* TBD: What about ENOENT, we will do getsockopt there</div><div class='add'>+            as well, so how is that exempt from such a problem? */</div><div class='add'>+            priv-&gt;connect_failed = 1;</div><div class='add'>+            this-&gt;connect_failed = _gf_true;</div><div class='ctx'> </div><div class='del'>-	priv   = this-&gt;private;</div><div class='del'>-	myinfo = &amp;this-&gt;myinfo;</div><div class='del'>-	ctx    = this-&gt;ctx;</div><div class='add'>+            goto handler;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-        pthread_mutex_lock (&amp;priv-&gt;lock);</div><div class='del'>-        {</div><div class='del'>-                sock = priv-&gt;sock;</div><div class='add'>+        if ((ret != 0) &amp;&amp; (errno != EINPROGRESS) &amp;&amp; (errno != ENOENT)) {</div><div class='add'>+            /* For unix path based sockets, the socket path is</div><div class='add'>+             * cryptic (md5sum of path) and may not be useful for</div><div class='add'>+             * the user in debugging so log it in DEBUG</div><div class='add'>+             */</div><div class='add'>+            gf_log(this-&gt;name,</div><div class='add'>+                   ((sa_family == AF_UNIX) ? GF_LOG_DEBUG : GF_LOG_ERROR),</div><div class='add'>+                   "connection attempt on %s failed, (%s)",</div><div class='add'>+                   this-&gt;peerinfo.identifier, strerror(errno));</div><div class='add'>+</div><div class='add'>+            /* connect failed with some other error than EINPROGRESS</div><div class='add'>+            so, getsockopt (... SO_ERROR ...), will not catch any</div><div class='add'>+            errors and return them to us, we need to remember this</div><div class='add'>+            state, and take actions in socket_event_handler</div><div class='add'>+            appropriately */</div><div class='add'>+            /* TBD: What about ENOENT, we will do getsockopt there</div><div class='add'>+            as well, so how is that exempt from such a problem? */</div><div class='add'>+            priv-&gt;connect_failed = 1;</div><div class='add'>+</div><div class='add'>+            goto handler;</div><div class='add'>+        } else {</div><div class='add'>+            /* reset connect_failed so that any previous attempts</div><div class='add'>+            state is not carried forward */</div><div class='add'>+            priv-&gt;connect_failed = 0;</div><div class='add'>+            ret = 0;</div><div class='ctx'>         }</div><div class='del'>-        pthread_mutex_unlock (&amp;priv-&gt;lock);</div><div class='ctx'> </div><div class='del'>-        if (sock != -1)  {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-                        "alreading listening");</div><div class='del'>-                return ret;</div><div class='add'>+    handler:</div><div class='add'>+        if (ret &lt; 0 &amp;&amp; !connect_attempted) {</div><div class='add'>+            /* Ignore error from connect. epoll events</div><div class='add'>+               should be handled in the socket handler.  shutdown(2)</div><div class='add'>+               will result in EPOLLERR, so cleanup is done in</div><div class='add'>+               socket_event_handler or socket_poller */</div><div class='add'>+            shutdown(priv-&gt;sock, SHUT_RDWR);</div><div class='add'>+            ret = 0;</div><div class='add'>+            gf_log(this-&gt;name, GF_LOG_INFO,</div><div class='add'>+                   "intentional client shutdown(%d, SHUT_RDWR)", priv-&gt;sock);</div><div class='ctx'>         }</div><div class='ctx'> </div><div class='del'>-        ret = socket_server_get_local_sockaddr (this, SA (&amp;sockaddr),</div><div class='del'>-                                                &amp;sockaddr_len, &amp;sa_family);</div><div class='del'>-        if (ret == -1) {</div><div class='del'>-                return ret;</div><div class='add'>+        priv-&gt;connected = 0;</div><div class='add'>+        priv-&gt;is_server = _gf_false;</div><div class='add'>+        rpc_transport_ref(this);</div><div class='add'>+        refd = _gf_true;</div><div class='add'>+</div><div class='add'>+        this-&gt;listener = this;</div><div class='add'>+        priv-&gt;idx = gf_event_register(ctx-&gt;event_pool, priv-&gt;sock,</div><div class='add'>+                                      socket_event_handler, this, 1, 1,</div><div class='add'>+                                      this-&gt;notify_poller_death);</div><div class='add'>+        if (priv-&gt;idx == -1) {</div><div class='add'>+            gf_log("", GF_LOG_WARNING,</div><div class='add'>+                   "failed to register the event; "</div><div class='add'>+                   "closing socket %d",</div><div class='add'>+                   priv-&gt;sock);</div><div class='add'>+            sys_close(priv-&gt;sock);</div><div class='add'>+            priv-&gt;sock = -1;</div><div class='add'>+            ret = -1;</div><div class='ctx'>         }</div><div class='ctx'> </div><div class='del'>-        pthread_mutex_lock (&amp;priv-&gt;lock);</div><div class='del'>-        {</div><div class='del'>-                if (priv-&gt;sock != -1) {</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-                                "already listening");</div><div class='del'>-                        goto unlock;</div><div class='del'>-                }</div><div class='add'>+    unlock:</div><div class='add'>+        sock = priv-&gt;sock;</div><div class='add'>+    }</div><div class='add'>+    pthread_mutex_unlock(&amp;priv-&gt;out_lock);</div><div class='ctx'> </div><div class='del'>-                memcpy (&amp;myinfo-&gt;sockaddr, &amp;sockaddr, sockaddr_len);</div><div class='del'>-                myinfo-&gt;sockaddr_len = sockaddr_len;</div><div class='add'>+err:</div><div class='add'>+    /* if sock &gt;= 0, then cleanup is done from the event handler */</div><div class='add'>+    if ((ret &lt; 0) &amp;&amp; (sock &lt; 0)) {</div><div class='add'>+        /* Cleaup requires to send notification to upper layer which</div><div class='add'>+           intern holds the big_lock. There can be dead-lock situation</div><div class='add'>+           if big_lock is already held by the current thread.</div><div class='add'>+           So transfer the ownership to separate thread for cleanup.</div><div class='add'>+        */</div><div class='add'>+        arg = GF_CALLOC(1, sizeof(*arg), gf_sock_connect_error_state_t);</div><div class='add'>+        arg-&gt;this = THIS;</div><div class='add'>+        arg-&gt;trans = this;</div><div class='add'>+        arg-&gt;refd = refd;</div><div class='add'>+        th_ret = gf_thread_create_detached(&amp;th_id, socket_connect_error_cbk,</div><div class='add'>+                                           arg, "scleanup");</div><div class='add'>+        if (th_ret) {</div><div class='add'>+            /* Error will be logged by gf_thread_create_attached */</div><div class='add'>+            gf_log(this-&gt;name, GF_LOG_ERROR,</div><div class='add'>+                   "Thread creation "</div><div class='add'>+                   "failed");</div><div class='add'>+            GF_FREE(arg);</div><div class='add'>+            GF_ASSERT(0);</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-                priv-&gt;sock = socket (sa_family, SOCK_STREAM, 0);</div><div class='add'>+        ret = 0;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-                if (priv-&gt;sock == -1) {</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-                                "socket creation failed (%s)",</div><div class='del'>-				strerror (errno));</div><div class='del'>-                        goto unlock;</div><div class='del'>-                }</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-                /* Cant help if setting socket options fails. We can continue</div><div class='del'>-                 * working nonetheless.</div><div class='del'>-                 */</div><div class='del'>-                if (setsockopt (priv-&gt;sock, SOL_SOCKET, SO_RCVBUF,</div><div class='del'>-                                &amp;priv-&gt;windowsize,</div><div class='del'>-                                sizeof (priv-&gt;windowsize)) &lt; 0) {</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-                                "setting receive window size failed: %d: %d: "</div><div class='del'>-                                "%s", priv-&gt;sock, priv-&gt;windowsize,</div><div class='del'>-                                strerror (errno));</div><div class='del'>-                }</div><div class='add'>+static int</div><div class='add'>+socket_listen(rpc_transport_t *this)</div><div class='add'>+{</div><div class='add'>+    socket_private_t *priv = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int sock = -1;</div><div class='add'>+    struct sockaddr_storage sockaddr;</div><div class='add'>+    socklen_t sockaddr_len = 0;</div><div class='add'>+    peer_info_t *myinfo = NULL;</div><div class='add'>+    glusterfs_ctx_t *ctx = NULL;</div><div class='add'>+    sa_family_t sa_family = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    GF_VALIDATE_OR_GOTO("socket", this, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("socket", this-&gt;private, out);</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+    myinfo = &amp;this-&gt;myinfo;</div><div class='add'>+    ctx = this-&gt;ctx;</div><div class='add'>+</div><div class='add'>+    pthread_mutex_lock(&amp;priv-&gt;out_lock);</div><div class='add'>+    {</div><div class='add'>+        sock = priv-&gt;sock;</div><div class='add'>+    }</div><div class='add'>+    pthread_mutex_unlock(&amp;priv-&gt;out_lock);</div><div class='ctx'> </div><div class='del'>-                if (setsockopt (priv-&gt;sock, SOL_SOCKET, SO_SNDBUF,</div><div class='del'>-                                &amp;priv-&gt;windowsize,</div><div class='del'>-                                sizeof (priv-&gt;windowsize)) &lt; 0) {</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-                                "setting send window size failed: %d: %d: "</div><div class='del'>-                                "%s", priv-&gt;sock, priv-&gt;windowsize,</div><div class='del'>-                                strerror (errno));</div><div class='del'>-                }</div><div class='add'>+    if (sock &gt;= 0) {</div><div class='add'>+        gf_log_callingfn(this-&gt;name, GF_LOG_DEBUG, "already listening");</div><div class='add'>+        return ret;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-                if (priv-&gt;nodelay) {</div><div class='del'>-                        ret = __socket_nodelay (priv-&gt;sock);</div><div class='del'>-                        if (ret == -1) {</div><div class='del'>-                                gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-                                        "setsockopt() failed for NODELAY (%s)",</div><div class='del'>-                                        strerror (errno));</div><div class='del'>-                        }</div><div class='del'>-                }</div><div class='add'>+    ret = socket_server_get_local_sockaddr(this, SA(&amp;sockaddr), &amp;sockaddr_len,</div><div class='add'>+                                           &amp;sa_family);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        return ret;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-                if (!priv-&gt;bio) {</div><div class='del'>-                        ret = __socket_nonblock (priv-&gt;sock);</div><div class='add'>+    pthread_mutex_lock(&amp;priv-&gt;out_lock);</div><div class='add'>+    {</div><div class='add'>+        if (priv-&gt;sock &gt;= 0) {</div><div class='add'>+            gf_log(this-&gt;name, GF_LOG_DEBUG, "already listening");</div><div class='add'>+            goto unlock;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-                        if (ret == -1) {</div><div class='del'>-                                gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-                                        "NBIO on %d failed (%s)",</div><div class='del'>-                                        priv-&gt;sock, strerror (errno));</div><div class='del'>-                                close (priv-&gt;sock);</div><div class='del'>-                                priv-&gt;sock = -1;</div><div class='del'>-                                goto unlock;</div><div class='del'>-                        }</div><div class='del'>-                }</div><div class='add'>+        memcpy(&amp;myinfo-&gt;sockaddr, &amp;sockaddr, sockaddr_len);</div><div class='add'>+        myinfo-&gt;sockaddr_len = sockaddr_len;</div><div class='ctx'> </div><div class='del'>-                ret = __socket_server_bind (this);</div><div class='add'>+        priv-&gt;sock = sys_socket(sa_family, SOCK_STREAM, 0);</div><div class='ctx'> </div><div class='del'>-                if (ret == -1) {</div><div class='del'>-                        /* logged inside __socket_server_bind() */</div><div class='del'>-                        close (priv-&gt;sock);</div><div class='del'>-                        priv-&gt;sock = -1;</div><div class='del'>-                        goto unlock;</div><div class='del'>-                }</div><div class='add'>+        if (priv-&gt;sock &lt; 0) {</div><div class='add'>+            gf_log(this-&gt;name, GF_LOG_ERROR, "socket creation failed (%s)",</div><div class='add'>+                   strerror(errno));</div><div class='add'>+            goto unlock;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-                ret = listen (priv-&gt;sock, 10);</div><div class='add'>+        /* Can't help if setting socket options fails. We can continue</div><div class='add'>+         * working nonetheless.</div><div class='add'>+         */</div><div class='add'>+        if (priv-&gt;windowsize != 0) {</div><div class='add'>+            if (setsockopt(priv-&gt;sock, SOL_SOCKET, SO_RCVBUF, &amp;priv-&gt;windowsize,</div><div class='add'>+                           sizeof(priv-&gt;windowsize)) != 0) {</div><div class='add'>+                gf_log(this-&gt;name, GF_LOG_ERROR,</div><div class='add'>+                       "setting receive window size "</div><div class='add'>+                       "failed: %d: %d: %s",</div><div class='add'>+                       priv-&gt;sock, priv-&gt;windowsize, strerror(errno));</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            if (setsockopt(priv-&gt;sock, SOL_SOCKET, SO_SNDBUF, &amp;priv-&gt;windowsize,</div><div class='add'>+                           sizeof(priv-&gt;windowsize)) != 0) {</div><div class='add'>+                gf_log(this-&gt;name, GF_LOG_ERROR,</div><div class='add'>+                       "setting send window size failed:"</div><div class='add'>+                       " %d: %d: %s",</div><div class='add'>+                       priv-&gt;sock, priv-&gt;windowsize, strerror(errno));</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-                if (ret == -1) {</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-                                "could not set socket %d to listen mode (%s)",</div><div class='del'>-				priv-&gt;sock, strerror (errno));</div><div class='del'>-                        close (priv-&gt;sock);</div><div class='del'>-                        priv-&gt;sock = -1;</div><div class='del'>-                        goto unlock;</div><div class='del'>-                }</div><div class='add'>+        if (priv-&gt;nodelay &amp;&amp; (sa_family != AF_UNIX)) {</div><div class='add'>+            ret = __socket_nodelay(priv-&gt;sock);</div><div class='add'>+            if (ret != 0) {</div><div class='add'>+                gf_log(this-&gt;name, GF_LOG_ERROR,</div><div class='add'>+                       "setsockopt() failed for NODELAY (%s)", strerror(errno));</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-                rpc_transport_ref (this);</div><div class='add'>+        if (!priv-&gt;bio) {</div><div class='add'>+            ret = __socket_nonblock(priv-&gt;sock);</div><div class='add'>+</div><div class='add'>+            if (ret != 0) {</div><div class='add'>+                gf_log(this-&gt;name, GF_LOG_ERROR,</div><div class='add'>+                       "NBIO on socket %d failed "</div><div class='add'>+                       "(errno:%s); closing socket",</div><div class='add'>+                       priv-&gt;sock, strerror(errno));</div><div class='add'>+                sys_close(priv-&gt;sock);</div><div class='add'>+                priv-&gt;sock = -1;</div><div class='add'>+                goto unlock;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-                priv-&gt;idx = event_register (ctx-&gt;event_pool, priv-&gt;sock,</div><div class='del'>-                                            socket_server_event_handler,</div><div class='del'>-					    this, 1, 0);</div><div class='add'>+        /* coverity[SLEEP] */</div><div class='add'>+        ret = __socket_server_bind(this);</div><div class='add'>+</div><div class='add'>+        if (ret &lt; 0) {</div><div class='add'>+            /* logged inside __socket_server_bind() */</div><div class='add'>+            gf_log(this-&gt;name, GF_LOG_ERROR,</div><div class='add'>+                   "__socket_server_bind failed;"</div><div class='add'>+                   "closing socket %d",</div><div class='add'>+                   priv-&gt;sock);</div><div class='add'>+            sys_close(priv-&gt;sock);</div><div class='add'>+            priv-&gt;sock = -1;</div><div class='add'>+            goto unlock;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-                if (priv-&gt;idx == -1) {</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-                                "could not register socket %d with events",</div><div class='del'>-				priv-&gt;sock);</div><div class='del'>-                        ret = -1;</div><div class='del'>-                        close (priv-&gt;sock);</div><div class='del'>-                        priv-&gt;sock = -1;</div><div class='del'>-                        goto unlock;</div><div class='del'>-                }</div><div class='add'>+        socket_dump_info(SA(&amp;this-&gt;myinfo.sockaddr), priv-&gt;is_server,</div><div class='add'>+                         priv-&gt;use_ssl, priv-&gt;sock, this-&gt;name, "listening on");</div><div class='add'>+</div><div class='add'>+        ret = listen(priv-&gt;sock, priv-&gt;backlog);</div><div class='add'>+</div><div class='add'>+        if (ret != 0) {</div><div class='add'>+            gf_log(this-&gt;name, GF_LOG_ERROR,</div><div class='add'>+                   "could not set socket %d to listen mode (errno:%s); "</div><div class='add'>+                   "closing socket",</div><div class='add'>+                   priv-&gt;sock, strerror(errno));</div><div class='add'>+            sys_close(priv-&gt;sock);</div><div class='add'>+            priv-&gt;sock = -1;</div><div class='add'>+            goto unlock;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        rpc_transport_ref(this);</div><div class='add'>+</div><div class='add'>+        priv-&gt;idx = gf_event_register(ctx-&gt;event_pool, priv-&gt;sock,</div><div class='add'>+                                      socket_server_event_handler, this, 1, 0,</div><div class='add'>+                                      this-&gt;notify_poller_death);</div><div class='add'>+</div><div class='add'>+        if (priv-&gt;idx == -1) {</div><div class='add'>+            gf_log(this-&gt;name, GF_LOG_WARNING,</div><div class='add'>+                   "could not register socket %d with events; "</div><div class='add'>+                   "closing socket",</div><div class='add'>+                   priv-&gt;sock);</div><div class='add'>+            ret = -1;</div><div class='add'>+            sys_close(priv-&gt;sock);</div><div class='add'>+            priv-&gt;sock = -1;</div><div class='add'>+            goto unlock;</div><div class='ctx'>         }</div><div class='add'>+    }</div><div class='ctx'> unlock:</div><div class='del'>-        pthread_mutex_unlock (&amp;priv-&gt;lock);</div><div class='add'>+    pthread_mutex_unlock(&amp;priv-&gt;out_lock);</div><div class='ctx'> </div><div class='ctx'> out:</div><div class='del'>-        return ret;</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-socket_submit_request (rpc_transport_t *this, rpc_transport_req_t *req)</div><div class='add'>+static int32_t</div><div class='add'>+socket_submit_outgoing_msg(rpc_transport_t *this, rpc_transport_msg_t *msg)</div><div class='ctx'> {</div><div class='del'>-        socket_private_t *priv = NULL;</div><div class='del'>-        int               ret = -1;</div><div class='del'>-        char              need_poll_out = 0;</div><div class='del'>-        char              need_append = 1;</div><div class='del'>-        struct ioq       *entry = NULL;</div><div class='del'>-	glusterfs_ctx_t  *ctx = NULL;</div><div class='del'>-</div><div class='del'>-        if (!this || !this-&gt;private)</div><div class='del'>-                goto out;</div><div class='del'>-</div><div class='del'>-        priv = this-&gt;private;</div><div class='del'>-	ctx  = this-&gt;ctx;</div><div class='del'>-</div><div class='del'>-        pthread_mutex_lock (&amp;priv-&gt;lock);</div><div class='del'>-        {</div><div class='del'>-                if (priv-&gt;connected != 1) {</div><div class='del'>-                        if (!priv-&gt;submit_log &amp;&amp; !priv-&gt;connect_finish_log) {</div><div class='del'>-                                gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-                                        "not connected (priv-&gt;connected = %d)",</div><div class='del'>-                                        priv-&gt;connected);</div><div class='del'>-                                priv-&gt;submit_log = 1;</div><div class='del'>-                        }</div><div class='del'>-                        goto unlock;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                priv-&gt;submit_log = 0;</div><div class='del'>-                entry = __socket_ioq_new (this, &amp;req-&gt;msg);</div><div class='del'>-                if (!entry)</div><div class='del'>-                        goto unlock;</div><div class='del'>-</div><div class='del'>-                if (list_empty (&amp;priv-&gt;ioq)) {</div><div class='del'>-                        ret = __socket_ioq_churn_entry (this, entry);</div><div class='add'>+    int ret = -1;</div><div class='add'>+    char need_poll_out = 0;</div><div class='add'>+    char need_append = 1;</div><div class='add'>+    struct ioq *entry = NULL;</div><div class='add'>+    glusterfs_ctx_t *ctx = NULL;</div><div class='add'>+    socket_private_t *priv = NULL;</div><div class='add'>+</div><div class='add'>+    GF_VALIDATE_OR_GOTO("socket", this, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("socket", this-&gt;private, out);</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+    ctx = this-&gt;ctx;</div><div class='add'>+</div><div class='add'>+    pthread_mutex_lock(&amp;priv-&gt;out_lock);</div><div class='add'>+    {</div><div class='add'>+        if (priv-&gt;connected != 1) {</div><div class='add'>+            if (!priv-&gt;submit_log &amp;&amp; !priv-&gt;connect_finish_log) {</div><div class='add'>+                gf_log(this-&gt;name, GF_LOG_INFO,</div><div class='add'>+                       "not connected (priv-&gt;connected = %d)", priv-&gt;connected);</div><div class='add'>+                priv-&gt;submit_log = 1;</div><div class='add'>+            }</div><div class='add'>+            goto unlock;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-                        if (ret == 0)</div><div class='del'>-                                need_append = 0;</div><div class='add'>+        priv-&gt;submit_log = 0;</div><div class='add'>+        entry = __socket_ioq_new(this, msg);</div><div class='add'>+        if (!entry)</div><div class='add'>+            goto unlock;</div><div class='ctx'> </div><div class='del'>-                        if (ret &gt; 0)</div><div class='del'>-                                need_poll_out = 1;</div><div class='del'>-                }</div><div class='add'>+        if (list_empty(&amp;priv-&gt;ioq)) {</div><div class='add'>+            ret = __socket_ioq_churn_entry(this, entry);</div><div class='ctx'> </div><div class='del'>-                if (need_append) {</div><div class='del'>-                        list_add_tail (&amp;entry-&gt;list, &amp;priv-&gt;ioq);</div><div class='del'>-                        ret = 0;</div><div class='del'>-                }</div><div class='add'>+            if (ret == 0) {</div><div class='add'>+                need_append = 0;</div><div class='add'>+            }</div><div class='add'>+            if (ret &gt; 0) {</div><div class='add'>+                need_poll_out = 1;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-                if (need_poll_out) {</div><div class='del'>-                        /* first entry to wait. continue writing on POLLOUT */</div><div class='del'>-                        priv-&gt;idx = event_select_on (ctx-&gt;event_pool,</div><div class='del'>-						     priv-&gt;sock,</div><div class='del'>-                                                     priv-&gt;idx, -1, 1);</div><div class='del'>-                }</div><div class='add'>+        if (need_append) {</div><div class='add'>+            list_add_tail(&amp;entry-&gt;list, &amp;priv-&gt;ioq);</div><div class='add'>+            ret = 0;</div><div class='add'>+        }</div><div class='add'>+        if (need_poll_out) {</div><div class='add'>+            /* first entry to wait. continue writing on POLLOUT */</div><div class='add'>+            priv-&gt;idx = gf_event_select_on(ctx-&gt;event_pool, priv-&gt;sock,</div><div class='add'>+                                           priv-&gt;idx, -1, 1);</div><div class='ctx'>         }</div><div class='add'>+    }</div><div class='ctx'> unlock:</div><div class='del'>-        pthread_mutex_unlock (&amp;priv-&gt;lock);</div><div class='add'>+    pthread_mutex_unlock(&amp;priv-&gt;out_lock);</div><div class='ctx'> </div><div class='ctx'> out:</div><div class='del'>-        return ret;</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+static int32_t</div><div class='add'>+socket_submit_request(rpc_transport_t *this, rpc_transport_req_t *req)</div><div class='add'>+{</div><div class='add'>+    return socket_submit_outgoing_msg(this, &amp;req-&gt;msg);</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-int32_t</div><div class='del'>-socket_submit_reply (rpc_transport_t *this, rpc_transport_reply_t *reply)</div><div class='add'>+static int32_t</div><div class='add'>+socket_submit_reply(rpc_transport_t *this, rpc_transport_reply_t *reply)</div><div class='ctx'> {</div><div class='del'>-        socket_private_t *priv = NULL;</div><div class='del'>-        int               ret = -1;</div><div class='del'>-        char              need_poll_out = 0;</div><div class='del'>-        char              need_append = 1;</div><div class='del'>-        struct ioq       *entry = NULL;</div><div class='del'>-	glusterfs_ctx_t  *ctx = NULL;</div><div class='add'>+    return socket_submit_outgoing_msg(this, &amp;reply-&gt;msg);</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        if (!this || !this-&gt;private)</div><div class='del'>-                goto out;</div><div class='add'>+static int32_t</div><div class='add'>+socket_getpeername(rpc_transport_t *this, char *hostname, int hostlen)</div><div class='add'>+{</div><div class='add'>+    int32_t ret = -1;</div><div class='ctx'> </div><div class='del'>-        priv = this-&gt;private;</div><div class='del'>-	ctx  = this-&gt;ctx;</div><div class='add'>+    GF_VALIDATE_OR_GOTO("socket", this, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("socket", hostname, out);</div><div class='ctx'> </div><div class='del'>-        pthread_mutex_lock (&amp;priv-&gt;lock);</div><div class='del'>-        {</div><div class='del'>-                if (priv-&gt;connected != 1) {</div><div class='del'>-                        if (!priv-&gt;submit_log &amp;&amp; !priv-&gt;connect_finish_log) {</div><div class='del'>-                                gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-                                        "not connected (priv-&gt;connected = %d)",</div><div class='del'>-                                        priv-&gt;connected);</div><div class='del'>-                                priv-&gt;submit_log = 1;</div><div class='del'>-                        }</div><div class='del'>-                        goto unlock;</div><div class='del'>-                }</div><div class='del'>-                priv-&gt;submit_log = 0;</div><div class='del'>-                entry = __socket_ioq_new (this, &amp;reply-&gt;msg);</div><div class='del'>-                if (!entry)</div><div class='del'>-                        goto unlock;</div><div class='del'>-                if (list_empty (&amp;priv-&gt;ioq)) {</div><div class='del'>-                        ret = __socket_ioq_churn_entry (this, entry);</div><div class='del'>-</div><div class='del'>-                        if (ret == 0)</div><div class='del'>-                                need_append = 0;</div><div class='del'>-</div><div class='del'>-                        if (ret &gt; 0)</div><div class='del'>-                                need_poll_out = 1;</div><div class='del'>-                }</div><div class='add'>+    if (hostlen &lt; (strlen(this-&gt;peerinfo.identifier) + 1)) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-                if (need_append) {</div><div class='del'>-                        list_add_tail (&amp;entry-&gt;list, &amp;priv-&gt;ioq);</div><div class='del'>-                        ret = 0;</div><div class='del'>-                }</div><div class='add'>+    strcpy(hostname, this-&gt;peerinfo.identifier);</div><div class='add'>+    ret = 0;</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-                if (need_poll_out) {</div><div class='del'>-                        /* first entry to wait. continue writing on POLLOUT */</div><div class='del'>-                        priv-&gt;idx = event_select_on (ctx-&gt;event_pool,</div><div class='del'>-						     priv-&gt;sock,</div><div class='del'>-                                                     priv-&gt;idx, -1, 1);</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='add'>+static int32_t</div><div class='add'>+socket_getpeeraddr(rpc_transport_t *this, char *peeraddr, int addrlen,</div><div class='add'>+                   struct sockaddr_storage *sa, socklen_t salen)</div><div class='add'>+{</div><div class='add'>+    int32_t ret = -1;</div><div class='ctx'> </div><div class='del'>-unlock:</div><div class='del'>-        pthread_mutex_unlock (&amp;priv-&gt;lock);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("socket", this, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("socket", sa, out);</div><div class='add'>+    ret = 0;</div><div class='ctx'> </div><div class='add'>+    *sa = this-&gt;peerinfo.sockaddr;</div><div class='add'>+</div><div class='add'>+    if (peeraddr != NULL) {</div><div class='add'>+        ret = socket_getpeername(this, peeraddr, addrlen);</div><div class='add'>+    }</div><div class='ctx'> out:</div><div class='del'>-        return ret;</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-socket_getpeername (rpc_transport_t *this, char *hostname, int hostlen)</div><div class='add'>+static int32_t</div><div class='add'>+socket_getmyname(rpc_transport_t *this, char *hostname, int hostlen)</div><div class='ctx'> {</div><div class='del'>-        int32_t ret = -1;</div><div class='add'>+    int32_t ret = -1;</div><div class='ctx'> </div><div class='del'>-        if ((this == NULL) || (hostname == NULL)) {</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='add'>+    GF_VALIDATE_OR_GOTO("socket", this, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("socket", hostname, out);</div><div class='ctx'> </div><div class='del'>-        if (hostlen &lt; (strlen (this-&gt;peerinfo.identifier) + 1)) {</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='add'>+    if (hostlen &lt; (strlen(this-&gt;myinfo.identifier) + 1)) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        strcpy (hostname, this-&gt;peerinfo.identifier);</div><div class='del'>-        ret = 0;</div><div class='add'>+    strcpy(hostname, this-&gt;myinfo.identifier);</div><div class='add'>+    ret = 0;</div><div class='ctx'> out:</div><div class='del'>-        return ret;</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-socket_getpeeraddr (rpc_transport_t *this, char *peeraddr, int addrlen,</div><div class='del'>-                    struct sockaddr_storage *sa, socklen_t salen)</div><div class='add'>+static int32_t</div><div class='add'>+socket_getmyaddr(rpc_transport_t *this, char *myaddr, int addrlen,</div><div class='add'>+                 struct sockaddr_storage *sa, socklen_t salen)</div><div class='ctx'> {</div><div class='del'>-        int32_t ret = -1;</div><div class='add'>+    int32_t ret = 0;</div><div class='ctx'> </div><div class='del'>-        if ((this == NULL) || (sa == NULL)) {</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='add'>+    GF_VALIDATE_OR_GOTO("socket", this, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("socket", sa, out);</div><div class='ctx'> </div><div class='del'>-        *sa = this-&gt;peerinfo.sockaddr;</div><div class='add'>+    *sa = this-&gt;myinfo.sockaddr;</div><div class='ctx'> </div><div class='del'>-        if (peeraddr != NULL) {</div><div class='del'>-                ret = socket_getpeername (this, peeraddr, addrlen);</div><div class='del'>-        }</div><div class='add'>+    if (myaddr != NULL) {</div><div class='add'>+        ret = socket_getmyname(this, myaddr, addrlen);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='ctx'> out:</div><div class='del'>-        return ret;</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+static int</div><div class='add'>+socket_throttle(rpc_transport_t *this, gf_boolean_t onoff)</div><div class='add'>+{</div><div class='add'>+    socket_private_t *priv = NULL;</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    /* The way we implement throttling is by taking off</div><div class='add'>+       POLLIN event from the polled flags. This way we</div><div class='add'>+       never get called with the POLLIN event and therefore</div><div class='add'>+       will never read() any more data until throttling</div><div class='add'>+       is turned off.</div><div class='add'>+    */</div><div class='add'>+    pthread_mutex_lock(&amp;priv-&gt;out_lock);</div><div class='add'>+    {</div><div class='add'>+        /* Throttling is useless on a disconnected transport. In fact,</div><div class='add'>+         * it's dangerous since priv-&gt;idx and priv-&gt;sock are set to -1</div><div class='add'>+         * on a disconnected transport, which breaks epoll's event to</div><div class='add'>+         * registered fd mapping. */</div><div class='add'>+</div><div class='add'>+        if (priv-&gt;connected == 1)</div><div class='add'>+            priv-&gt;idx = gf_event_select_on(this-&gt;ctx-&gt;event_pool, priv-&gt;sock,</div><div class='add'>+                                           priv-&gt;idx, (int)!onoff, -1);</div><div class='add'>+    }</div><div class='add'>+    pthread_mutex_unlock(&amp;priv-&gt;out_lock);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-int32_t</div><div class='del'>-socket_getmyname (rpc_transport_t *this, char *hostname, int hostlen)</div><div class='add'>+struct rpc_transport_ops tops = {</div><div class='add'>+    .listen = socket_listen,</div><div class='add'>+    .connect = socket_connect,</div><div class='add'>+    .disconnect = socket_disconnect,</div><div class='add'>+    .submit_request = socket_submit_request,</div><div class='add'>+    .submit_reply = socket_submit_reply,</div><div class='add'>+    .get_peername = socket_getpeername,</div><div class='add'>+    .get_peeraddr = socket_getpeeraddr,</div><div class='add'>+    .get_myname = socket_getmyname,</div><div class='add'>+    .get_myaddr = socket_getmyaddr,</div><div class='add'>+    .throttle = socket_throttle,</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+reconfigure(rpc_transport_t *this, dict_t *options)</div><div class='ctx'> {</div><div class='del'>-        int32_t ret = -1;</div><div class='add'>+    socket_private_t *priv = NULL;</div><div class='add'>+    gf_boolean_t tmp_bool = _gf_false;</div><div class='add'>+    char *optstr = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    uint32_t backlog = 0;</div><div class='add'>+    uint64_t windowsize = 0;</div><div class='add'>+    data_t *data;</div><div class='add'>+</div><div class='add'>+    GF_VALIDATE_OR_GOTO("socket", this, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("socket", this-&gt;private, out);</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    if (dict_get_str_sizen(options, "transport.socket.keepalive", &amp;optstr) ==</div><div class='add'>+        0) {</div><div class='add'>+        if (gf_string2boolean(optstr, &amp;tmp_bool) != 0) {</div><div class='add'>+            gf_log(this-&gt;name, GF_LOG_ERROR,</div><div class='add'>+                   "'transport.socket.keepalive' takes only "</div><div class='add'>+                   "boolean options, not taking any action");</div><div class='add'>+            priv-&gt;keepalive = 1;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+        gf_log(this-&gt;name, GF_LOG_DEBUG,</div><div class='add'>+               "Reconfigured transport.socket.keepalive");</div><div class='add'>+</div><div class='add'>+        priv-&gt;keepalive = tmp_bool;</div><div class='add'>+    } else</div><div class='add'>+        priv-&gt;keepalive = 1;</div><div class='add'>+</div><div class='add'>+    if (dict_get_int32_sizen(options, "transport.tcp-user-timeout",</div><div class='add'>+                             &amp;(priv-&gt;timeout)) != 0)</div><div class='add'>+        priv-&gt;timeout = GF_NETWORK_TIMEOUT;</div><div class='add'>+    gf_log(this-&gt;name, GF_LOG_DEBUG,</div><div class='add'>+           "Reconfigured transport.tcp-user-timeout=%d", priv-&gt;timeout);</div><div class='add'>+</div><div class='add'>+    if (dict_get_uint32(options, "transport.listen-backlog", &amp;backlog) == 0) {</div><div class='add'>+        priv-&gt;backlog = backlog;</div><div class='add'>+        gf_log(this-&gt;name, GF_LOG_DEBUG,</div><div class='add'>+               "Reconfigured transport.listen-backlog=%d", priv-&gt;backlog);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (priv-&gt;keepalive) {</div><div class='add'>+        if (dict_get_int32_sizen(options, "transport.socket.keepalive-time",</div><div class='add'>+                                 &amp;(priv-&gt;keepaliveidle)) != 0)</div><div class='add'>+            priv-&gt;keepaliveidle = GF_KEEPALIVE_TIME;</div><div class='add'>+        gf_log(this-&gt;name, GF_LOG_DEBUG,</div><div class='add'>+               "Reconfigured transport.socket.keepalive-time=%d",</div><div class='add'>+               priv-&gt;keepaliveidle);</div><div class='add'>+</div><div class='add'>+        if (dict_get_int32_sizen(options, "transport.socket.keepalive-interval",</div><div class='add'>+                                 &amp;(priv-&gt;keepaliveintvl)) != 0)</div><div class='add'>+            priv-&gt;keepaliveintvl = GF_KEEPALIVE_INTERVAL;</div><div class='add'>+        gf_log(this-&gt;name, GF_LOG_DEBUG,</div><div class='add'>+               "Reconfigured transport.socket.keepalive-interval=%d",</div><div class='add'>+               priv-&gt;keepaliveintvl);</div><div class='add'>+</div><div class='add'>+        if (dict_get_int32_sizen(options, "transport.socket.keepalive-count",</div><div class='add'>+                                 &amp;(priv-&gt;keepalivecnt)) != 0)</div><div class='add'>+            priv-&gt;keepalivecnt = GF_KEEPALIVE_COUNT;</div><div class='add'>+        gf_log(this-&gt;name, GF_LOG_DEBUG,</div><div class='add'>+               "Reconfigured transport.socket.keepalive-count=%d",</div><div class='add'>+               priv-&gt;keepalivecnt);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    optstr = NULL;</div><div class='add'>+    if (dict_get_str_sizen(options, "tcp-window-size", &amp;optstr) == 0) {</div><div class='add'>+        if (gf_string2uint64(optstr, &amp;windowsize) != 0) {</div><div class='add'>+            gf_log(this-&gt;name, GF_LOG_ERROR, "invalid number format: %s",</div><div class='add'>+                   optstr);</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        if ((this == NULL) || (hostname == NULL)) {</div><div class='del'>-                goto out;</div><div class='add'>+    priv-&gt;windowsize = (int)windowsize;</div><div class='add'>+</div><div class='add'>+    data = dict_get_sizen(options, "non-blocking-io");</div><div class='add'>+    if (data) {</div><div class='add'>+        optstr = data_to_str(data);</div><div class='add'>+</div><div class='add'>+        if (gf_string2boolean(optstr, &amp;tmp_bool) != 0) {</div><div class='add'>+            gf_log(this-&gt;name, GF_LOG_ERROR,</div><div class='add'>+                   "'non-blocking-io' takes only boolean options,"</div><div class='add'>+                   " not taking any action");</div><div class='add'>+            tmp_bool = 1;</div><div class='ctx'>         }</div><div class='ctx'> </div><div class='del'>-        if (hostlen &lt; (strlen (this-&gt;myinfo.identifier) + 1)) {</div><div class='del'>-                goto out;</div><div class='add'>+        if (!tmp_bool) {</div><div class='add'>+            priv-&gt;bio = 1;</div><div class='add'>+            gf_log(this-&gt;name, GF_LOG_WARNING, "disabling non-blocking IO");</div><div class='ctx'>         }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (!priv-&gt;bio) {</div><div class='add'>+        ret = __socket_nonblock(priv-&gt;sock);</div><div class='add'>+        if (ret != 0) {</div><div class='add'>+            gf_log(this-&gt;name, GF_LOG_WARNING, "NBIO on %d failed (%s)",</div><div class='add'>+                   priv-&gt;sock, strerror(errno));</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        strcpy (hostname, this-&gt;myinfo.identifier);</div><div class='del'>-        ret = 0;</div><div class='add'>+    ret = 0;</div><div class='ctx'> out:</div><div class='del'>-        return ret;</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+#if OPENSSL_VERSION_NUMBER &lt; 0x1010000f</div><div class='add'>+static pthread_mutex_t *lock_array = NULL;</div><div class='ctx'> </div><div class='del'>-int32_t</div><div class='del'>-socket_getmyaddr (rpc_transport_t *this, char *myaddr, int addrlen,</div><div class='del'>-                  struct sockaddr_storage *sa, socklen_t salen)</div><div class='add'>+static void</div><div class='add'>+locking_func(int mode, int type, const char *file, int line)</div><div class='ctx'> {</div><div class='del'>-        int32_t ret = 0;</div><div class='add'>+    if (mode &amp; CRYPTO_UNLOCK) {</div><div class='add'>+        pthread_mutex_unlock(&amp;lock_array[type]);</div><div class='add'>+    } else {</div><div class='add'>+        pthread_mutex_lock(&amp;lock_array[type]);</div><div class='add'>+    }</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        if ((this == NULL) || (sa == NULL)) {</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='add'>+#if OPENSSL_VERSION_NUMBER &gt;= 0x1000000f</div><div class='add'>+static void</div><div class='add'>+threadid_func(CRYPTO_THREADID *id)</div><div class='add'>+{</div><div class='add'>+    /*</div><div class='add'>+     * We're not supposed to know whether a pthread_t is a number or a</div><div class='add'>+     * pointer, but we definitely need an unsigned long.  Even though it</div><div class='add'>+     * happens to be an unsigned long already on Linux, do the cast just in</div><div class='add'>+     * case that's not so on another platform.  Note that this can still</div><div class='add'>+     * break if any platforms are left where a pointer is larger than an</div><div class='add'>+     * unsigned long.  In that case there's not much we can do; hopefully</div><div class='add'>+     * anyone porting to such a platform will be aware enough to notice the</div><div class='add'>+     * compile warnings about truncating the pointer value.</div><div class='add'>+     */</div><div class='add'>+    CRYPTO_THREADID_set_numeric(id, (unsigned long)pthread_self());</div><div class='add'>+}</div><div class='add'>+#else  /* older openssl */</div><div class='add'>+static unsigned long</div><div class='add'>+legacy_threadid_func(void)</div><div class='add'>+{</div><div class='add'>+    /* See comments above, it applies here too. */</div><div class='add'>+    return (unsigned long)pthread_self();</div><div class='add'>+}</div><div class='add'>+#endif /* OPENSSL_VERSION_NUMBER &gt;= 0x1000000f */</div><div class='add'>+#endif /* OPENSSL_VERSION_NUMBER &lt; 0x1010000f */</div><div class='ctx'> </div><div class='del'>-        *sa =  this-&gt;myinfo.sockaddr;</div><div class='add'>+static void</div><div class='add'>+init_openssl_mt(void)</div><div class='add'>+{</div><div class='add'>+    static gf_boolean_t initialized = _gf_false;</div><div class='add'>+</div><div class='add'>+    if (initialized) {</div><div class='add'>+        /* this only needs to be initialized once GLOBALLY no</div><div class='add'>+           matter how many translators/sockets we end up with. */</div><div class='add'>+        return;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        if (myaddr != NULL) {</div><div class='del'>-                ret = socket_getmyname (this, myaddr, addrlen);</div><div class='add'>+    SSL_library_init();</div><div class='add'>+    SSL_load_error_strings();</div><div class='add'>+</div><div class='add'>+    initialized = _gf_true;</div><div class='add'>+</div><div class='add'>+#if OPENSSL_VERSION_NUMBER &lt; 0x1010000f</div><div class='add'>+    int num_locks = CRYPTO_num_locks();</div><div class='add'>+    int i;</div><div class='add'>+</div><div class='add'>+    lock_array = GF_CALLOC(num_locks, sizeof(pthread_mutex_t),</div><div class='add'>+                           gf_sock_mt_lock_array);</div><div class='add'>+    if (lock_array) {</div><div class='add'>+        for (i = 0; i &lt; num_locks; ++i) {</div><div class='add'>+            pthread_mutex_init(&amp;lock_array[i], NULL);</div><div class='ctx'>         }</div><div class='add'>+#if OPENSSL_VERSION_NUMBER &gt;= 0x1000000f</div><div class='add'>+        CRYPTO_THREADID_set_callback(threadid_func);</div><div class='add'>+#else /* older openssl */</div><div class='add'>+        CRYPTO_set_id_callback(legacy_threadid_func);</div><div class='add'>+#endif</div><div class='add'>+        CRYPTO_set_locking_callback(locking_func);</div><div class='add'>+    }</div><div class='add'>+#endif</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-out:</div><div class='del'>-        return ret;</div><div class='add'>+static void __attribute__((destructor)) fini_openssl_mt(void)</div><div class='add'>+{</div><div class='add'>+#if OPENSSL_VERSION_NUMBER &lt; 0x1010000f</div><div class='add'>+    int i;</div><div class='add'>+</div><div class='add'>+    if (!lock_array) {</div><div class='add'>+        return;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    CRYPTO_set_locking_callback(NULL);</div><div class='add'>+#if OPENSSL_VERSION_NUMBER &gt;= 0x1000000f</div><div class='add'>+    CRYPTO_THREADID_set_callback(NULL);</div><div class='add'>+#else /* older openssl */</div><div class='add'>+    CRYPTO_set_id_callback(NULL);</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; CRYPTO_num_locks(); ++i) {</div><div class='add'>+        pthread_mutex_destroy(&amp;lock_array[i]);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    GF_FREE(lock_array);</div><div class='add'>+    lock_array = NULL;</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+    ERR_free_strings();</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+/* The function returns 0 if AES bit is enabled on the CPU */</div><div class='add'>+static int</div><div class='add'>+ssl_check_aes_bit(void)</div><div class='add'>+{</div><div class='add'>+    FILE *fp = fopen("/proc/cpuinfo", "r");</div><div class='add'>+    int ret = 1;</div><div class='add'>+    size_t len = 0;</div><div class='add'>+    char *line = NULL;</div><div class='add'>+    char *match = NULL;</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(fp != NULL);</div><div class='add'>+</div><div class='add'>+    while (getline(&amp;line, &amp;len, fp) &gt; 0) {</div><div class='add'>+        if (!strncmp(line, "flags", 5)) {</div><div class='add'>+            match = strstr(line, " aes");</div><div class='add'>+            if ((match != NULL) &amp;&amp; ((match[4] == ' ') || (match[4] == 0))) {</div><div class='add'>+                ret = 0;</div><div class='add'>+                break;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-struct rpc_transport_ops tops = {</div><div class='del'>-        .listen             = socket_listen,</div><div class='del'>-        .connect            = socket_connect,</div><div class='del'>-        .disconnect         = socket_disconnect,</div><div class='del'>-        .submit_request     = socket_submit_request,</div><div class='del'>-        .submit_reply       = socket_submit_reply,</div><div class='del'>-        .get_peername       = socket_getpeername,</div><div class='del'>-        .get_peeraddr       = socket_getpeeraddr,</div><div class='del'>-        .get_myname         = socket_getmyname,</div><div class='del'>-        .get_myaddr         = socket_getmyaddr,</div><div class='del'>-};</div><div class='add'>+    free(line);</div><div class='add'>+    fclose(fp);</div><div class='ctx'> </div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-socket_init (rpc_transport_t *this)</div><div class='add'>+static int</div><div class='add'>+ssl_setup_connection_params(rpc_transport_t *this)</div><div class='ctx'> {</div><div class='del'>-        socket_private_t *priv = NULL;</div><div class='del'>-        gf_boolean_t      tmp_bool = 0;</div><div class='del'>-        uint64_t          windowsize = GF_DEFAULT_SOCKET_WINDOW_SIZE;</div><div class='del'>-        char             *optstr = NULL;</div><div class='add'>+    socket_private_t *priv = NULL;</div><div class='add'>+    char *optstr = NULL;</div><div class='add'>+    static int session_id = 1;</div><div class='add'>+    int32_t cert_depth = DEFAULT_VERIFY_DEPTH;</div><div class='add'>+    char *cipher_list = DEFAULT_CIPHER_LIST;</div><div class='add'>+    char *dh_param = DEFAULT_DH_PARAM;</div><div class='add'>+    char *ec_curve = DEFAULT_EC_CURVE;</div><div class='add'>+    gf_boolean_t dh_flag = _gf_false;</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    if (priv-&gt;ssl_ctx != NULL) {</div><div class='add'>+        gf_log(this-&gt;name, GF_LOG_TRACE, "found old SSL context!");</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (!priv-&gt;ssl_enabled &amp;&amp; !priv-&gt;mgmt_ssl) {</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (!ssl_check_aes_bit()) {</div><div class='add'>+        cipher_list = "AES128:" DEFAULT_CIPHER_LIST;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    priv-&gt;ssl_own_cert = DEFAULT_CERT_PATH;</div><div class='add'>+    if (dict_get_str_sizen(this-&gt;options, SSL_OWN_CERT_OPT, &amp;optstr) == 0) {</div><div class='add'>+        if (!priv-&gt;ssl_enabled) {</div><div class='add'>+            gf_log(this-&gt;name, GF_LOG_WARNING,</div><div class='add'>+                   "%s specified without %s (ignored)", SSL_OWN_CERT_OPT,</div><div class='add'>+                   SSL_ENABLED_OPT);</div><div class='add'>+        }</div><div class='add'>+        priv-&gt;ssl_own_cert = optstr;</div><div class='add'>+    }</div><div class='add'>+    priv-&gt;ssl_own_cert = gf_strdup(priv-&gt;ssl_own_cert);</div><div class='add'>+</div><div class='add'>+    priv-&gt;ssl_private_key = DEFAULT_KEY_PATH;</div><div class='add'>+    if (dict_get_str_sizen(this-&gt;options, SSL_PRIVATE_KEY_OPT, &amp;optstr) == 0) {</div><div class='add'>+        if (!priv-&gt;ssl_enabled) {</div><div class='add'>+            gf_log(this-&gt;name, GF_LOG_WARNING,</div><div class='add'>+                   "%s specified without %s (ignored)", SSL_PRIVATE_KEY_OPT,</div><div class='add'>+                   SSL_ENABLED_OPT);</div><div class='add'>+        }</div><div class='add'>+        priv-&gt;ssl_private_key = optstr;</div><div class='add'>+    }</div><div class='add'>+    priv-&gt;ssl_private_key = gf_strdup(priv-&gt;ssl_private_key);</div><div class='add'>+</div><div class='add'>+    priv-&gt;ssl_ca_list = DEFAULT_CA_PATH;</div><div class='add'>+    if (dict_get_str_sizen(this-&gt;options, SSL_CA_LIST_OPT, &amp;optstr) == 0) {</div><div class='add'>+        if (!priv-&gt;ssl_enabled) {</div><div class='add'>+            gf_log(this-&gt;name, GF_LOG_WARNING,</div><div class='add'>+                   "%s specified without %s (ignored)", SSL_CA_LIST_OPT,</div><div class='add'>+                   SSL_ENABLED_OPT);</div><div class='add'>+        }</div><div class='add'>+        priv-&gt;ssl_ca_list = optstr;</div><div class='add'>+    }</div><div class='add'>+    priv-&gt;ssl_ca_list = gf_strdup(priv-&gt;ssl_ca_list);</div><div class='add'>+</div><div class='add'>+    optstr = NULL;</div><div class='add'>+    if (dict_get_str_sizen(this-&gt;options, SSL_CRL_PATH_OPT, &amp;optstr) == 0) {</div><div class='add'>+        if (!priv-&gt;ssl_enabled) {</div><div class='add'>+            gf_log(this-&gt;name, GF_LOG_WARNING,</div><div class='add'>+                   "%s specified without %s (ignored)", SSL_CRL_PATH_OPT,</div><div class='add'>+                   SSL_ENABLED_OPT);</div><div class='add'>+        }</div><div class='add'>+        if (strcasecmp(optstr, "NULL") == 0)</div><div class='add'>+            priv-&gt;crl_path = NULL;</div><div class='add'>+        else</div><div class='add'>+            priv-&gt;crl_path = gf_strdup(optstr);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (!priv-&gt;mgmt_ssl) {</div><div class='add'>+        if (!dict_get_int32_sizen(this-&gt;options, SSL_CERT_DEPTH_OPT,</div><div class='add'>+                                  &amp;cert_depth)) {</div><div class='add'>+        }</div><div class='add'>+    } else {</div><div class='add'>+        cert_depth = this-&gt;ctx-&gt;ssl_cert_depth;</div><div class='add'>+    }</div><div class='add'>+    gf_log(this-&gt;name, priv-&gt;ssl_enabled ? GF_LOG_INFO : GF_LOG_DEBUG,</div><div class='add'>+           "SSL support for MGMT is %s IO path is %s certificate depth is %d "</div><div class='add'>+           "for peer %s",</div><div class='add'>+           (priv-&gt;mgmt_ssl ? "ENABLED" : "NOT enabled"),</div><div class='add'>+           (priv-&gt;ssl_enabled ? "ENABLED" : "NOT enabled"), cert_depth,</div><div class='add'>+           this-&gt;peerinfo.identifier);</div><div class='add'>+</div><div class='add'>+    if (!dict_get_str_sizen(this-&gt;options, SSL_CIPHER_LIST_OPT, &amp;cipher_list)) {</div><div class='add'>+        gf_log(this-&gt;name, GF_LOG_INFO, "using cipher list %s", cipher_list);</div><div class='add'>+    }</div><div class='add'>+    if (!dict_get_str_sizen(this-&gt;options, SSL_DH_PARAM_OPT, &amp;dh_param)) {</div><div class='add'>+        dh_flag = _gf_true;</div><div class='add'>+        gf_log(this-&gt;name, GF_LOG_INFO, "using DH parameters %s", dh_param);</div><div class='add'>+    }</div><div class='add'>+    if (!dict_get_str_sizen(this-&gt;options, SSL_EC_CURVE_OPT, &amp;ec_curve)) {</div><div class='add'>+        gf_log(this-&gt;name, GF_LOG_INFO, "using EC curve %s", ec_curve);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (priv-&gt;ssl_enabled || priv-&gt;mgmt_ssl) {</div><div class='add'>+        BIO *bio = NULL;</div><div class='add'>+</div><div class='add'>+#if HAVE_TLS_METHOD</div><div class='add'>+        priv-&gt;ssl_meth = (SSL_METHOD *)TLS_method();</div><div class='add'>+#elif HAVE_TLSV1_2_METHOD</div><div class='add'>+        priv-&gt;ssl_meth = (SSL_METHOD *)TLSv1_2_method();</div><div class='add'>+#else</div><div class='add'>+/*</div><div class='add'>+ * Nobody should use an OpenSSL so old it does not support TLS 1.2.</div><div class='add'>+ * If that is really required, build with -DUSE_INSECURE_OPENSSL</div><div class='add'>+ */</div><div class='add'>+#ifndef USE_INSECURE_OPENSSL</div><div class='add'>+#error Old and insecure OpenSSL, use -DUSE_INSECURE_OPENSSL to use it anyway</div><div class='add'>+#endif</div><div class='add'>+        /* SSLv23_method uses highest available protocol */</div><div class='add'>+        priv-&gt;ssl_meth = SSLv23_method();</div><div class='add'>+#endif</div><div class='add'>+        priv-&gt;ssl_ctx = SSL_CTX_new(priv-&gt;ssl_meth);</div><div class='ctx'> </div><div class='del'>-        if (this-&gt;private) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-                        "double init attempted");</div><div class='del'>-                return -1;</div><div class='add'>+        SSL_CTX_set_options(priv-&gt;ssl_ctx, SSL_OP_NO_SSLv2);</div><div class='add'>+        SSL_CTX_set_options(priv-&gt;ssl_ctx, SSL_OP_NO_SSLv3);</div><div class='add'>+#ifdef SSL_OP_NO_TICKET</div><div class='add'>+        SSL_CTX_set_options(priv-&gt;ssl_ctx, SSL_OP_NO_TICKET);</div><div class='add'>+#endif</div><div class='add'>+#ifdef SSL_OP_NO_COMPRESSION</div><div class='add'>+        SSL_CTX_set_options(priv-&gt;ssl_ctx, SSL_OP_NO_COMPRESSION);</div><div class='add'>+#endif</div><div class='add'>+        /* Upload file to bio wrapper only if dh param is configured</div><div class='add'>+         */</div><div class='add'>+        if (dh_flag) {</div><div class='add'>+            if ((bio = BIO_new_file(dh_param, "r")) == NULL) {</div><div class='add'>+                gf_log(this-&gt;name, GF_LOG_ERROR,</div><div class='add'>+                       "failed to open %s, "</div><div class='add'>+                       "DH ciphers are disabled",</div><div class='add'>+                       dh_param);</div><div class='add'>+            }</div><div class='ctx'>         }</div><div class='ctx'> </div><div class='del'>-        priv = GF_CALLOC (1, sizeof (*priv), gf_common_mt_socket_private_t);</div><div class='del'>-        if (!priv) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-                        "calloc (1, %"GF_PRI_SIZET") returned NULL",</div><div class='del'>-			sizeof (*priv));</div><div class='del'>-                return -1;</div><div class='add'>+        if (bio != NULL) {</div><div class='add'>+#ifdef HAVE_OPENSSL_DH_H</div><div class='add'>+            DH *dh;</div><div class='add'>+            unsigned long err;</div><div class='add'>+</div><div class='add'>+            dh = PEM_read_bio_DHparams(bio, NULL, NULL, NULL);</div><div class='add'>+            BIO_free(bio);</div><div class='add'>+            if (dh != NULL) {</div><div class='add'>+                SSL_CTX_set_options(priv-&gt;ssl_ctx, SSL_OP_SINGLE_DH_USE);</div><div class='add'>+                SSL_CTX_set_tmp_dh(priv-&gt;ssl_ctx, dh);</div><div class='add'>+                DH_free(dh);</div><div class='add'>+            } else {</div><div class='add'>+                err = ERR_get_error();</div><div class='add'>+                gf_log(this-&gt;name, GF_LOG_ERROR,</div><div class='add'>+                       "failed to read DH param from %s: %s "</div><div class='add'>+                       "DH ciphers are disabled.",</div><div class='add'>+                       dh_param, ERR_error_string(err, NULL));</div><div class='add'>+            }</div><div class='add'>+#else  /* HAVE_OPENSSL_DH_H */</div><div class='add'>+            BIO_free(bio);</div><div class='add'>+            gf_log(this-&gt;name, GF_LOG_ERROR, "OpenSSL has no DH support");</div><div class='add'>+#endif /* HAVE_OPENSSL_DH_H */</div><div class='ctx'>         }</div><div class='ctx'> </div><div class='del'>-        pthread_mutex_init (&amp;priv-&gt;lock, NULL);</div><div class='add'>+        if (ec_curve != NULL) {</div><div class='add'>+#ifdef HAVE_OPENSSL_ECDH_H</div><div class='add'>+            EC_KEY *ecdh = NULL;</div><div class='add'>+            int nid;</div><div class='add'>+            unsigned long err;</div><div class='add'>+</div><div class='add'>+            nid = OBJ_sn2nid(ec_curve);</div><div class='add'>+            if (nid != 0)</div><div class='add'>+                ecdh = EC_KEY_new_by_curve_name(nid);</div><div class='add'>+</div><div class='add'>+            if (ecdh != NULL) {</div><div class='add'>+                SSL_CTX_set_options(priv-&gt;ssl_ctx, SSL_OP_SINGLE_ECDH_USE);</div><div class='add'>+                SSL_CTX_set_tmp_ecdh(priv-&gt;ssl_ctx, ecdh);</div><div class='add'>+                EC_KEY_free(ecdh);</div><div class='add'>+            } else {</div><div class='add'>+                err = ERR_get_error();</div><div class='add'>+                gf_log(this-&gt;name, GF_LOG_ERROR,</div><div class='add'>+                       "failed to load EC curve %s: %s. "</div><div class='add'>+                       "ECDH ciphers are disabled.",</div><div class='add'>+                       ec_curve, ERR_error_string(err, NULL));</div><div class='add'>+            }</div><div class='add'>+#else  /* HAVE_OPENSSL_ECDH_H */</div><div class='add'>+            gf_log(this-&gt;name, GF_LOG_ERROR, "OpenSSL has no ECDH support");</div><div class='add'>+#endif /* HAVE_OPENSSL_ECDH_H */</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-        priv-&gt;sock = -1;</div><div class='del'>-        priv-&gt;idx = -1;</div><div class='del'>-        priv-&gt;connected = -1;</div><div class='add'>+        /* This must be done after DH and ECDH setups */</div><div class='add'>+        if (SSL_CTX_set_cipher_list(priv-&gt;ssl_ctx, cipher_list) == 0) {</div><div class='add'>+            gf_log(this-&gt;name, GF_LOG_ERROR,</div><div class='add'>+                   "failed to find any valid ciphers");</div><div class='add'>+            goto err;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-        INIT_LIST_HEAD (&amp;priv-&gt;ioq);</div><div class='add'>+        SSL_CTX_set_options(priv-&gt;ssl_ctx, SSL_OP_CIPHER_SERVER_PREFERENCE);</div><div class='ctx'> </div><div class='del'>-        if (dict_get (this-&gt;options, "non-blocking-io")) {</div><div class='del'>-                optstr = data_to_str (dict_get (this-&gt;options,</div><div class='del'>-                                                "non-blocking-io"));</div><div class='add'>+        if (!SSL_CTX_use_certificate_chain_file(priv-&gt;ssl_ctx,</div><div class='add'>+                                                priv-&gt;ssl_own_cert)) {</div><div class='add'>+            gf_log(this-&gt;name, GF_LOG_ERROR, "could not load our cert at %s",</div><div class='add'>+                   priv-&gt;ssl_own_cert);</div><div class='add'>+            ssl_dump_error_stack(this-&gt;name);</div><div class='add'>+            goto err;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-                if (gf_string2boolean (optstr, &amp;tmp_bool) == -1) {</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-                                "'non-blocking-io' takes only boolean options,"</div><div class='del'>-				" not taking any action");</div><div class='del'>-                        tmp_bool = 1;</div><div class='del'>-                }</div><div class='del'>-                priv-&gt;bio = 0;</div><div class='del'>-                if (!tmp_bool) {</div><div class='del'>-                        priv-&gt;bio = 1;</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_WARNING,</div><div class='del'>-                                "disabling non-blocking IO");</div><div class='del'>-                }</div><div class='add'>+        if (!SSL_CTX_use_PrivateKey_file(priv-&gt;ssl_ctx, priv-&gt;ssl_private_key,</div><div class='add'>+                                         SSL_FILETYPE_PEM)) {</div><div class='add'>+            gf_log(this-&gt;name, GF_LOG_ERROR, "could not load private key at %s",</div><div class='add'>+                   priv-&gt;ssl_private_key);</div><div class='add'>+            ssl_dump_error_stack(this-&gt;name);</div><div class='add'>+            goto err;</div><div class='ctx'>         }</div><div class='ctx'> </div><div class='del'>-        optstr = NULL;</div><div class='add'>+        if (!SSL_CTX_load_verify_locations(priv-&gt;ssl_ctx, priv-&gt;ssl_ca_list,</div><div class='add'>+                                           priv-&gt;crl_path)) {</div><div class='add'>+            gf_log(this-&gt;name, GF_LOG_ERROR, "could not load CA list");</div><div class='add'>+            goto err;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-        // By default, we enable NODELAY</div><div class='del'>-        priv-&gt;nodelay = 1;</div><div class='del'>-        if (dict_get (this-&gt;options, "transport.socket.nodelay")) {</div><div class='del'>-                optstr = data_to_str (dict_get (this-&gt;options,</div><div class='del'>-                                                "transport.socket.nodelay"));</div><div class='add'>+        SSL_CTX_set_verify_depth(priv-&gt;ssl_ctx, cert_depth);</div><div class='ctx'> </div><div class='del'>-                if (gf_string2boolean (optstr, &amp;tmp_bool) == -1) {</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-                                "'transport.socket.nodelay' takes only "</div><div class='del'>-                                "boolean options, not taking any action");</div><div class='del'>-                        tmp_bool = 1;</div><div class='del'>-                }</div><div class='del'>-                if (!tmp_bool) {</div><div class='del'>-                        priv-&gt;nodelay = 0;</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-                                "disabling nodelay");</div><div class='del'>-                }</div><div class='add'>+        if (priv-&gt;crl_path)</div><div class='add'>+            ssl_set_crl_verify_flags(priv-&gt;ssl_ctx);</div><div class='add'>+</div><div class='add'>+        priv-&gt;ssl_session_id = session_id++;</div><div class='add'>+        SSL_CTX_set_session_id_context(priv-&gt;ssl_ctx,</div><div class='add'>+                                       (void *)&amp;priv-&gt;ssl_session_id,</div><div class='add'>+                                       sizeof(priv-&gt;ssl_session_id));</div><div class='add'>+</div><div class='add'>+        SSL_CTX_set_verify(priv-&gt;ssl_ctx, SSL_VERIFY_PEER, 0);</div><div class='add'>+</div><div class='add'>+        /*</div><div class='add'>+         * Since glusterfs shares the same settings for client-side</div><div class='add'>+         * and server-side of SSL, we need to ignore any certificate</div><div class='add'>+         * usage specification (SSL client vs SSL server), otherwise</div><div class='add'>+         * SSL connexions will fail with 'unsupported cerritifcate"</div><div class='add'>+         */</div><div class='add'>+        SSL_CTX_set_purpose(priv-&gt;ssl_ctx, X509_PURPOSE_ANY);</div><div class='add'>+    }</div><div class='add'>+    return 0;</div><div class='add'>+</div><div class='add'>+err:</div><div class='add'>+    return -1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+socket_init(rpc_transport_t *this)</div><div class='add'>+{</div><div class='add'>+    socket_private_t *priv = NULL;</div><div class='add'>+    gf_boolean_t tmp_bool = 0;</div><div class='add'>+    uint64_t windowsize = GF_DEFAULT_SOCKET_WINDOW_SIZE;</div><div class='add'>+    char *optstr = NULL;</div><div class='add'>+    data_t *data;</div><div class='add'>+</div><div class='add'>+    if (this-&gt;private) {</div><div class='add'>+        gf_log_callingfn(this-&gt;name, GF_LOG_ERROR, "double init attempted");</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    priv = GF_CALLOC(1, sizeof(*priv), gf_common_mt_socket_private_t);</div><div class='add'>+    if (!priv) {</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    this-&gt;private = priv;</div><div class='add'>+    pthread_mutex_init(&amp;priv-&gt;out_lock, NULL);</div><div class='add'>+    pthread_mutex_init(&amp;priv-&gt;cond_lock, NULL);</div><div class='add'>+    pthread_cond_init(&amp;priv-&gt;cond, NULL);</div><div class='add'>+</div><div class='add'>+    /*GF_REF_INIT (priv, socket_poller_mayday);*/</div><div class='add'>+</div><div class='add'>+    priv-&gt;sock = -1;</div><div class='add'>+    priv-&gt;idx = -1;</div><div class='add'>+    priv-&gt;connected = -1;</div><div class='add'>+    priv-&gt;nodelay = 1;</div><div class='add'>+    priv-&gt;bio = 0;</div><div class='add'>+    priv-&gt;ssl_accepted = _gf_false;</div><div class='add'>+    priv-&gt;ssl_connected = _gf_false;</div><div class='add'>+    priv-&gt;windowsize = GF_DEFAULT_SOCKET_WINDOW_SIZE;</div><div class='add'>+    INIT_LIST_HEAD(&amp;priv-&gt;ioq);</div><div class='add'>+    pthread_mutex_init(&amp;priv-&gt;notify.lock, NULL);</div><div class='add'>+    pthread_cond_init(&amp;priv-&gt;notify.cond, NULL);</div><div class='add'>+</div><div class='add'>+    /* All the below section needs 'this-&gt;options' to be present */</div><div class='add'>+    if (!this-&gt;options)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    data = dict_get_sizen(this-&gt;options, "non-blocking-io");</div><div class='add'>+    if (data) {</div><div class='add'>+        optstr = data_to_str(data);</div><div class='add'>+</div><div class='add'>+        if (gf_string2boolean(optstr, &amp;tmp_bool) != 0) {</div><div class='add'>+            gf_log(this-&gt;name, GF_LOG_ERROR,</div><div class='add'>+                   "'non-blocking-io' takes only boolean options,"</div><div class='add'>+                   " not taking any action");</div><div class='add'>+            tmp_bool = 1;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        if (!tmp_bool) {</div><div class='add'>+            priv-&gt;bio = 1;</div><div class='add'>+            gf_log(this-&gt;name, GF_LOG_WARNING, "disabling non-blocking IO");</div><div class='ctx'>         }</div><div class='add'>+    }</div><div class='ctx'> </div><div class='add'>+    optstr = NULL;</div><div class='ctx'> </div><div class='del'>-        optstr = NULL;</div><div class='del'>-        if (dict_get_str (this-&gt;options, "transport.window-size",</div><div class='del'>-                          &amp;optstr) == 0) {</div><div class='del'>-                if (gf_string2bytesize (optstr, &amp;windowsize) != 0) {</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-                                "invalid number format: %s", optstr);</div><div class='del'>-                        return -1;</div><div class='del'>-                }</div><div class='add'>+    /* By default, we enable NODELAY */</div><div class='add'>+    data = dict_get_sizen(this-&gt;options, "transport.socket.nodelay");</div><div class='add'>+    if (data) {</div><div class='add'>+        optstr = data_to_str(data);</div><div class='add'>+</div><div class='add'>+        if (gf_string2boolean(optstr, &amp;tmp_bool) != 0) {</div><div class='add'>+            gf_log(this-&gt;name, GF_LOG_ERROR,</div><div class='add'>+                   "'transport.socket.nodelay' takes only "</div><div class='add'>+                   "boolean options, not taking any action");</div><div class='add'>+            tmp_bool = 1;</div><div class='add'>+        }</div><div class='add'>+        if (!tmp_bool) {</div><div class='add'>+            priv-&gt;nodelay = 0;</div><div class='add'>+            gf_log(this-&gt;name, GF_LOG_DEBUG, "disabling nodelay");</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    optstr = NULL;</div><div class='add'>+    if (dict_get_str_sizen(this-&gt;options, "tcp-window-size", &amp;optstr) == 0) {</div><div class='add'>+        if (gf_string2uint64(optstr, &amp;windowsize) != 0) {</div><div class='add'>+            gf_log(this-&gt;name, GF_LOG_ERROR, "invalid number format: %s",</div><div class='add'>+                   optstr);</div><div class='add'>+            return -1;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    priv-&gt;windowsize = (int)windowsize;</div><div class='add'>+</div><div class='add'>+    optstr = NULL;</div><div class='add'>+    /* Enable Keep-alive by default. */</div><div class='add'>+    priv-&gt;keepalive = 1;</div><div class='add'>+    priv-&gt;keepaliveintvl = GF_KEEPALIVE_INTERVAL;</div><div class='add'>+    priv-&gt;keepaliveidle = GF_KEEPALIVE_TIME;</div><div class='add'>+    priv-&gt;keepalivecnt = GF_KEEPALIVE_COUNT;</div><div class='add'>+    if (dict_get_str_sizen(this-&gt;options, "transport.socket.keepalive",</div><div class='add'>+                           &amp;optstr) == 0) {</div><div class='add'>+        if (gf_string2boolean(optstr, &amp;tmp_bool) != 0) {</div><div class='add'>+            gf_log(this-&gt;name, GF_LOG_ERROR,</div><div class='add'>+                   "'transport.socket.keepalive' takes only "</div><div class='add'>+                   "boolean options, not taking any action");</div><div class='add'>+            tmp_bool = 1;</div><div class='ctx'>         }</div><div class='ctx'> </div><div class='del'>-        optstr = NULL;</div><div class='add'>+        if (!tmp_bool)</div><div class='add'>+            priv-&gt;keepalive = 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (dict_get_int32_sizen(this-&gt;options, "transport.tcp-user-timeout",</div><div class='add'>+                             &amp;(priv-&gt;timeout)) != 0)</div><div class='add'>+        priv-&gt;timeout = GF_NETWORK_TIMEOUT;</div><div class='add'>+    gf_log(this-&gt;name, GF_LOG_DEBUG, "Configured transport.tcp-user-timeout=%d",</div><div class='add'>+           priv-&gt;timeout);</div><div class='add'>+</div><div class='add'>+    if (priv-&gt;keepalive) {</div><div class='add'>+        if (dict_get_int32_sizen(this-&gt;options,</div><div class='add'>+                                 "transport.socket.keepalive-time",</div><div class='add'>+                                 &amp;(priv-&gt;keepaliveidle)) != 0) {</div><div class='add'>+            priv-&gt;keepaliveidle = GF_KEEPALIVE_TIME;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-        if (dict_get_str (this-&gt;options, "transport.socket.lowlat",</div><div class='del'>-                          &amp;optstr) == 0) {</div><div class='del'>-                priv-&gt;lowlat = 1;</div><div class='add'>+        if (dict_get_int32_sizen(this-&gt;options,</div><div class='add'>+                                 "transport.socket.keepalive-interval",</div><div class='add'>+                                 &amp;(priv-&gt;keepaliveintvl)) != 0) {</div><div class='add'>+            priv-&gt;keepaliveintvl = GF_KEEPALIVE_INTERVAL;</div><div class='ctx'>         }</div><div class='ctx'> </div><div class='del'>-        priv-&gt;windowsize = (int)windowsize;</div><div class='del'>-        this-&gt;private = priv;</div><div class='add'>+        if (dict_get_int32_sizen(this-&gt;options,</div><div class='add'>+                                 "transport.socket.keepalive-count",</div><div class='add'>+                                 &amp;(priv-&gt;keepalivecnt)) != 0)</div><div class='add'>+            priv-&gt;keepalivecnt = GF_KEEPALIVE_COUNT;</div><div class='add'>+        gf_log(this-&gt;name, GF_LOG_DEBUG,</div><div class='add'>+               "Reconfigured transport.keepalivecnt=%d", priv-&gt;keepalivecnt);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (dict_get_uint32(this-&gt;options, "transport.listen-backlog",</div><div class='add'>+                        &amp;(priv-&gt;backlog)) != 0) {</div><div class='add'>+        priv-&gt;backlog = GLUSTERFS_SOCKET_LISTEN_BACKLOG;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    optstr = NULL;</div><div class='add'>+</div><div class='add'>+    /* Check if socket read failures are to be logged */</div><div class='add'>+    priv-&gt;read_fail_log = 1;</div><div class='add'>+    data = dict_get_sizen(this-&gt;options, "transport.socket.read-fail-log");</div><div class='add'>+    if (data) {</div><div class='add'>+        optstr = data_to_str(data);</div><div class='add'>+        if (gf_string2boolean(optstr, &amp;tmp_bool) != 0) {</div><div class='add'>+            gf_log(this-&gt;name, GF_LOG_WARNING,</div><div class='add'>+                   "'transport.socket.read-fail-log' takes only "</div><div class='add'>+                   "boolean options; logging socket read fails");</div><div class='add'>+        } else if (tmp_bool == _gf_false) {</div><div class='add'>+            priv-&gt;read_fail_log = 0;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='add'>+    priv-&gt;windowsize = (int)windowsize;</div><div class='ctx'> </div><div class='add'>+    priv-&gt;ssl_enabled = _gf_false;</div><div class='add'>+    if (dict_get_str_sizen(this-&gt;options, SSL_ENABLED_OPT, &amp;optstr) == 0) {</div><div class='add'>+        if (gf_string2boolean(optstr, &amp;priv-&gt;ssl_enabled) != 0) {</div><div class='add'>+            gf_log(this-&gt;name, GF_LOG_ERROR,</div><div class='add'>+                   "invalid value given for ssl-enabled boolean");</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    priv-&gt;mgmt_ssl = this-&gt;ctx-&gt;secure_mgmt;</div><div class='add'>+    priv-&gt;srvr_ssl = this-&gt;ctx-&gt;secure_srvr;</div><div class='add'>+</div><div class='add'>+    ssl_setup_connection_params(this);</div><div class='add'>+out:</div><div class='add'>+    this-&gt;private = priv;</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> void</div><div class='del'>-fini (rpc_transport_t *this)</div><div class='add'>+fini(rpc_transport_t *this)</div><div class='ctx'> {</div><div class='del'>-        socket_private_t *priv = NULL;</div><div class='add'>+    socket_private_t *priv = NULL;</div><div class='ctx'> </div><div class='del'>-        if (!this)</div><div class='del'>-                return;</div><div class='add'>+    if (!this)</div><div class='add'>+        return;</div><div class='ctx'> </div><div class='del'>-        priv = this-&gt;private;</div><div class='del'>-        if (priv) {</div><div class='del'>-                if (priv-&gt;sock != -1) {</div><div class='del'>-                        pthread_mutex_lock (&amp;priv-&gt;lock);</div><div class='del'>-                        {</div><div class='del'>-                                __socket_ioq_flush (this);</div><div class='del'>-                                __socket_reset (this);</div><div class='del'>-                        }</div><div class='del'>-                        pthread_mutex_unlock (&amp;priv-&gt;lock);</div><div class='del'>-                }</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_TRACE,</div><div class='del'>-                        "transport %p destroyed", this);</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+    if (priv) {</div><div class='add'>+        if (priv-&gt;sock &gt;= 0) {</div><div class='add'>+            pthread_mutex_lock(&amp;priv-&gt;out_lock);</div><div class='add'>+            {</div><div class='add'>+                __socket_ioq_flush(priv);</div><div class='add'>+                __socket_reset(this);</div><div class='add'>+            }</div><div class='add'>+            pthread_mutex_unlock(&amp;priv-&gt;out_lock);</div><div class='add'>+        }</div><div class='add'>+        gf_log(this-&gt;name, GF_LOG_TRACE, "transport %p destroyed", this);</div><div class='add'>+</div><div class='add'>+        pthread_mutex_destroy(&amp;priv-&gt;out_lock);</div><div class='add'>+        pthread_mutex_destroy(&amp;priv-&gt;cond_lock);</div><div class='add'>+        pthread_cond_destroy(&amp;priv-&gt;cond);</div><div class='add'>+</div><div class='add'>+        GF_ASSERT(priv-&gt;notify.in_progress == 0);</div><div class='add'>+        pthread_mutex_destroy(&amp;priv-&gt;notify.lock);</div><div class='add'>+        pthread_cond_destroy(&amp;priv-&gt;notify.cond);</div><div class='ctx'> </div><div class='del'>-                pthread_mutex_destroy (&amp;priv-&gt;lock);</div><div class='del'>-                GF_FREE (priv);</div><div class='add'>+        if (priv-&gt;use_ssl &amp;&amp; priv-&gt;ssl_ssl) {</div><div class='add'>+            SSL_clear(priv-&gt;ssl_ssl);</div><div class='add'>+            SSL_free(priv-&gt;ssl_ssl);</div><div class='add'>+            priv-&gt;ssl_ssl = NULL;</div><div class='add'>+        }</div><div class='add'>+        if (priv-&gt;ssl_ctx) {</div><div class='add'>+            SSL_CTX_free(priv-&gt;ssl_ctx);</div><div class='add'>+            priv-&gt;ssl_ctx = NULL;</div><div class='ctx'>         }</div><div class='ctx'> </div><div class='del'>-        if (this-&gt;name)</div><div class='del'>-                GF_FREE (this-&gt;name);</div><div class='add'>+        if (priv-&gt;ssl_private_key) {</div><div class='add'>+            GF_FREE(priv-&gt;ssl_private_key);</div><div class='add'>+        }</div><div class='add'>+        if (priv-&gt;ssl_own_cert) {</div><div class='add'>+            GF_FREE(priv-&gt;ssl_own_cert);</div><div class='add'>+        }</div><div class='add'>+        if (priv-&gt;ssl_ca_list) {</div><div class='add'>+            GF_FREE(priv-&gt;ssl_ca_list);</div><div class='add'>+        }</div><div class='add'>+        GF_FREE(priv);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        this-&gt;private = NULL;</div><div class='add'>+    this-&gt;private = NULL;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int32_t</div><div class='del'>-init (rpc_transport_t *this)</div><div class='add'>+init(rpc_transport_t *this)</div><div class='ctx'> {</div><div class='del'>-        int ret = -1;</div><div class='add'>+    int ret = -1;</div><div class='ctx'> </div><div class='del'>-        ret = socket_init (this);</div><div class='add'>+    init_openssl_mt();</div><div class='ctx'> </div><div class='del'>-        if (ret == -1) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_DEBUG, "socket_init() failed");</div><div class='del'>-        }</div><div class='add'>+    ret = socket_init(this);</div><div class='ctx'> </div><div class='del'>-        return ret;</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        gf_log(this-&gt;name, GF_LOG_DEBUG, "socket_init() failed");</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> struct volume_options options[] = {</div><div class='del'>-        { .key   = {"remote-port",</div><div class='del'>-                    "transport.remote-port",</div><div class='del'>-                    "transport.socket.remote-port"},</div><div class='del'>-          .type  = GF_OPTION_TYPE_INT</div><div class='del'>-        },</div><div class='del'>-        { .key   = {"transport.socket.listen-port", "listen-port"},</div><div class='del'>-          .type  = GF_OPTION_TYPE_INT</div><div class='del'>-        },</div><div class='del'>-        { .key   = {"transport.socket.bind-address", "bind-address" },</div><div class='del'>-          .type  = GF_OPTION_TYPE_INTERNET_ADDRESS</div><div class='del'>-        },</div><div class='del'>-        { .key   = {"transport.socket.connect-path", "connect-path"},</div><div class='del'>-          .type  = GF_OPTION_TYPE_ANY</div><div class='del'>-        },</div><div class='del'>-        { .key   = {"transport.socket.bind-path", "bind-path"},</div><div class='del'>-          .type  = GF_OPTION_TYPE_ANY</div><div class='del'>-        },</div><div class='del'>-        { .key   = {"transport.socket.listen-path", "listen-path"},</div><div class='del'>-          .type  = GF_OPTION_TYPE_ANY</div><div class='del'>-        },</div><div class='del'>-        { .key   = { "transport.address-family",</div><div class='del'>-                     "address-family" },</div><div class='del'>-          .value = {"inet", "inet6", "inet/inet6", "inet6/inet",</div><div class='del'>-                    "unix", "inet-sdp" },</div><div class='del'>-          .type  = GF_OPTION_TYPE_STR</div><div class='del'>-        },</div><div class='del'>-</div><div class='del'>-        { .key   = {"non-blocking-io"},</div><div class='del'>-          .type  = GF_OPTION_TYPE_BOOL</div><div class='del'>-        },</div><div class='del'>-        { .key   = {"transport.window-size"},</div><div class='del'>-          .type  = GF_OPTION_TYPE_SIZET,</div><div class='del'>-          .min   = GF_MIN_SOCKET_WINDOW_SIZE,</div><div class='del'>-          .max   = GF_MAX_SOCKET_WINDOW_SIZE,</div><div class='del'>-        },</div><div class='del'>-        { .key   = {"transport.socket.nodelay"},</div><div class='del'>-          .type  = GF_OPTION_TYPE_BOOL</div><div class='del'>-        },</div><div class='del'>-        { .key   = {"transport.socket.lowlat"},</div><div class='del'>-          .type  = GF_OPTION_TYPE_BOOL</div><div class='del'>-        },</div><div class='del'>-        { .key = {NULL} }</div><div class='del'>-};</div><div class='add'>+    {.key = {"remote-port", "transport.remote-port",</div><div class='add'>+             "transport.socket.remote-port"},</div><div class='add'>+     .type = GF_OPTION_TYPE_INT},</div><div class='add'>+    {.key = {"transport.socket.listen-port", "listen-port"},</div><div class='add'>+     .type = GF_OPTION_TYPE_INT},</div><div class='add'>+    {.key = {"transport.socket.bind-address", "bind-address"},</div><div class='add'>+     .type = GF_OPTION_TYPE_INTERNET_ADDRESS},</div><div class='add'>+    {.key = {"transport.socket.connect-path", "connect-path"},</div><div class='add'>+     .type = GF_OPTION_TYPE_ANY},</div><div class='add'>+    {.key = {"transport.socket.bind-path", "bind-path"},</div><div class='add'>+     .type = GF_OPTION_TYPE_ANY},</div><div class='add'>+    {.key = {"transport.socket.listen-path", "listen-path"},</div><div class='add'>+     .type = GF_OPTION_TYPE_ANY},</div><div class='add'>+    {.key = {"transport.address-family", "address-family"},</div><div class='add'>+     .value = {"inet", "inet6", "unix", "inet-sdp"},</div><div class='add'>+     .op_version = {GD_OP_VERSION_3_7_4},</div><div class='add'>+     .type = GF_OPTION_TYPE_STR},</div><div class='add'>+    {.key = {"non-blocking-io"}, .type = GF_OPTION_TYPE_BOOL},</div><div class='add'>+    {.key = {"tcp-window-size"},</div><div class='add'>+     .type = GF_OPTION_TYPE_SIZET,</div><div class='add'>+     .op_version = {1},</div><div class='add'>+     .flags = OPT_FLAG_SETTABLE,</div><div class='add'>+     .description = "Option to set TCP SEND/RECV BUFFER SIZE",</div><div class='add'>+     .min = GF_MIN_SOCKET_WINDOW_SIZE,</div><div class='add'>+     .max = GF_MAX_SOCKET_WINDOW_SIZE},</div><div class='add'>+    {</div><div class='add'>+        .key = {"transport.listen-backlog"},</div><div class='add'>+        .type = GF_OPTION_TYPE_SIZET,</div><div class='add'>+        .op_version = {GD_OP_VERSION_3_11_1},</div><div class='add'>+        .flags = OPT_FLAG_SETTABLE,</div><div class='add'>+        .description = "This option uses the value of backlog argument that "</div><div class='add'>+                       "defines the maximum length to which the queue of "</div><div class='add'>+                       "pending connections for socket fd may grow.",</div><div class='add'>+        .default_value = "1024",</div><div class='add'>+    },</div><div class='add'>+    {.key = {"transport.tcp-user-timeout"},</div><div class='add'>+     .type = GF_OPTION_TYPE_INT,</div><div class='add'>+     .op_version = {GD_OP_VERSION_3_10_2},</div><div class='add'>+     .default_value = TOSTRING(GF_NETWORK_TIMEOUT)},</div><div class='add'>+    {.key = {"transport.socket.nodelay"},</div><div class='add'>+     .type = GF_OPTION_TYPE_BOOL,</div><div class='add'>+     .default_value = "1"},</div><div class='add'>+    {.key = {"transport.socket.keepalive"},</div><div class='add'>+     .type = GF_OPTION_TYPE_BOOL,</div><div class='add'>+     .op_version = {1},</div><div class='add'>+     .default_value = "1"},</div><div class='add'>+    {.key = {"transport.socket.keepalive-interval"},</div><div class='add'>+     .type = GF_OPTION_TYPE_INT,</div><div class='add'>+     .op_version = {GD_OP_VERSION_3_10_2},</div><div class='add'>+     .default_value = "2"},</div><div class='add'>+    {.key = {"transport.socket.keepalive-time"},</div><div class='add'>+     .type = GF_OPTION_TYPE_INT,</div><div class='add'>+     .op_version = {GD_OP_VERSION_3_10_2},</div><div class='add'>+     .default_value = "20"},</div><div class='add'>+    {.key = {"transport.socket.keepalive-count"},</div><div class='add'>+     .type = GF_OPTION_TYPE_INT,</div><div class='add'>+     .op_version = {GD_OP_VERSION_3_10_2},</div><div class='add'>+     .default_value = "9"},</div><div class='add'>+    {.key = {"transport.socket.read-fail-log"}, .type = GF_OPTION_TYPE_BOOL},</div><div class='add'>+    {.key = {SSL_ENABLED_OPT}, .type = GF_OPTION_TYPE_BOOL},</div><div class='add'>+    {.key = {SSL_OWN_CERT_OPT}, .type = GF_OPTION_TYPE_STR},</div><div class='add'>+    {.key = {SSL_PRIVATE_KEY_OPT}, .type = GF_OPTION_TYPE_STR},</div><div class='add'>+    {.key = {SSL_CA_LIST_OPT}, .type = GF_OPTION_TYPE_STR},</div><div class='add'>+    {.key = {SSL_CERT_DEPTH_OPT}, .type = GF_OPTION_TYPE_STR},</div><div class='add'>+    {.key = {SSL_CIPHER_LIST_OPT}, .type = GF_OPTION_TYPE_STR},</div><div class='add'>+    {.key = {SSL_DH_PARAM_OPT}, .type = GF_OPTION_TYPE_STR},</div><div class='add'>+    {.key = {SSL_EC_CURVE_OPT}, .type = GF_OPTION_TYPE_STR},</div><div class='add'>+    {.key = {SSL_CRL_PATH_OPT}, .type = GF_OPTION_TYPE_STR},</div><div class='add'>+    {.key = {OWN_THREAD_OPT}, .type = GF_OPTION_TYPE_BOOL},</div><div class='add'>+    {.key = {"ssl-own-cert"},</div><div class='add'>+     .op_version = {GD_OP_VERSION_3_7_4},</div><div class='add'>+     .flags = OPT_FLAG_SETTABLE,</div><div class='add'>+     .type = GF_OPTION_TYPE_STR,</div><div class='add'>+     .description = "SSL certificate. Ignored if SSL is not enabled."},</div><div class='add'>+    {.key = {"ssl-private-key"},</div><div class='add'>+     .op_version = {GD_OP_VERSION_3_7_4},</div><div class='add'>+     .flags = OPT_FLAG_SETTABLE,</div><div class='add'>+     .type = GF_OPTION_TYPE_STR,</div><div class='add'>+     .description = "SSL private key. Ignored if SSL is not enabled."},</div><div class='add'>+    {.key = {"ssl-ca-list"},</div><div class='add'>+     .op_version = {GD_OP_VERSION_3_7_4},</div><div class='add'>+     .flags = OPT_FLAG_SETTABLE,</div><div class='add'>+     .type = GF_OPTION_TYPE_STR,</div><div class='add'>+     .description = "SSL CA list. Ignored if SSL is not enabled."},</div><div class='add'>+    {.key = {"ssl-cert-depth"},</div><div class='add'>+     .type = GF_OPTION_TYPE_INT,</div><div class='add'>+     .op_version = {GD_OP_VERSION_3_6_0},</div><div class='add'>+     .flags = OPT_FLAG_SETTABLE,</div><div class='add'>+     .description = "Maximum certificate-chain depth.  If zero, the "</div><div class='add'>+                    "peer's certificate itself must be in the local "</div><div class='add'>+                    "certificate list.  Otherwise, there may be up to N "</div><div class='add'>+                    "signing certificates between the peer's and the "</div><div class='add'>+                    "local list.  Ignored if SSL is not enabled."},</div><div class='add'>+    {.key = {"ssl-cipher-list"},</div><div class='add'>+     .type = GF_OPTION_TYPE_STR,</div><div class='add'>+     .op_version = {GD_OP_VERSION_3_6_0},</div><div class='add'>+     .flags = OPT_FLAG_SETTABLE,</div><div class='add'>+     .description = "Allowed SSL ciphers. Ignored if SSL is not enabled."},</div><div class='add'>+    {.key = {"ssl-dh-param"},</div><div class='add'>+     .type = GF_OPTION_TYPE_STR,</div><div class='add'>+     .op_version = {GD_OP_VERSION_3_7_4},</div><div class='add'>+     .flags = OPT_FLAG_SETTABLE,</div><div class='add'>+     .description = "DH parameters file. Ignored if SSL is not enabled."},</div><div class='add'>+    {.key = {"ssl-ec-curve"},</div><div class='add'>+     .type = GF_OPTION_TYPE_STR,</div><div class='add'>+     .op_version = {GD_OP_VERSION_3_7_4},</div><div class='add'>+     .flags = OPT_FLAG_SETTABLE,</div><div class='add'>+     .description = "ECDH curve name. Ignored if SSL is not enabled."},</div><div class='add'>+    {.key = {"ssl-crl-path"},</div><div class='add'>+     .type = GF_OPTION_TYPE_STR,</div><div class='add'>+     .op_version = {GD_OP_VERSION_3_7_4},</div><div class='add'>+     .flags = OPT_FLAG_SETTABLE,</div><div class='add'>+     .description = "Path to directory containing CRL. "</div><div class='add'>+                    "Ignored if SSL is not enabled."},</div><div class='add'>+    {.key = {NULL}}};</div><div class='head'>diff --git a/rpc/rpc-transport/socket/src/socket.h b/rpc/rpc-transport/socket/src/socket.h<br/>index 44acc66a0a5..8a2eda70605 100644<br/>--- a/<a href='/cgit/glusterfs.git/tree/rpc/rpc-transport/socket/src/socket.h?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>rpc/rpc-transport/socket/src/socket.h</a><br/>+++ b/<a href='/cgit/glusterfs.git/tree/rpc/rpc-transport/socket/src/socket.h?id=d1d7a6f35c816822fab51c820e25023863c239c1'>rpc/rpc-transport/socket/src/socket.h</a></div><div class='hunk'>@@ -1,193 +1,276 @@</div><div class='ctx'> /*</div><div class='del'>-  Copyright (c) 2010 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='add'>+  Copyright (c) 2008-2012 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='ctx'>   This file is part of GlusterFS.</div><div class='ctx'> </div><div class='del'>-  GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-  it under the terms of the GNU Affero General Public License as published</div><div class='del'>-  by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-  or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-  GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-  WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-  Affero General Public License for more details.</div><div class='del'>-</div><div class='del'>-  You should have received a copy of the GNU Affero General Public License</div><div class='del'>-  along with this program.  If not, see</div><div class='del'>-  &lt;http://www.gnu.org/licenses/&gt;.</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='ctx'> */</div><div class='ctx'> </div><div class='ctx'> #ifndef _SOCKET_H</div><div class='ctx'> #define _SOCKET_H</div><div class='ctx'> </div><div class='del'>-</div><div class='del'>-#ifndef _CONFIG_H</div><div class='del'>-#define _CONFIG_H</div><div class='del'>-#include "config.h"</div><div class='add'>+#include &lt;openssl/ssl.h&gt;</div><div class='add'>+#include &lt;openssl/err.h&gt;</div><div class='add'>+#include &lt;openssl/x509v3.h&gt;</div><div class='add'>+#include &lt;openssl/x509_vfy.h&gt;</div><div class='add'>+#ifdef HAVE_OPENSSL_DH_H</div><div class='add'>+#include &lt;openssl/dh.h&gt;</div><div class='add'>+#endif</div><div class='add'>+#ifdef HAVE_OPENSSL_ECDH_H</div><div class='add'>+#include &lt;openssl/ecdh.h&gt;</div><div class='ctx'> #endif</div><div class='ctx'> </div><div class='del'>-#include "event.h"</div><div class='ctx'> #include "rpc-transport.h"</div><div class='del'>-#include "logging.h"</div><div class='del'>-#include "dict.h"</div><div class='del'>-#include "mem-pool.h"</div><div class='ctx'> </div><div class='ctx'> #ifndef MAX_IOVEC</div><div class='ctx'> #define MAX_IOVEC 16</div><div class='ctx'> #endif /* MAX_IOVEC */</div><div class='ctx'> </div><div class='del'>-#define GF_DEFAULT_SOCKET_LISTEN_PORT 6969</div><div class='add'>+#define GF_DEFAULT_SOCKET_LISTEN_PORT GF_DEFAULT_BASE_PORT</div><div class='ctx'> </div><div class='ctx'> #define RPC_MAX_FRAGMENT_SIZE 0x7fffffff</div><div class='ctx'> </div><div class='del'>-/* This is the size set through setsockopt for</div><div class='del'>- * both the TCP receive window size and the</div><div class='del'>- * send buffer size.</div><div class='del'>- * Till the time iobuf size becomes configurable, this size is set to include</div><div class='del'>- * two iobufs + the GlusterFS protocol headers.</div><div class='add'>+/* The default window size will be 0, indicating not to set</div><div class='add'>+ * it to any size. Default size of Linux is found to be</div><div class='add'>+ * performance friendly.</div><div class='ctx'>  * Linux allows us to over-ride the max values for the system.</div><div class='ctx'>  * Should we over-ride them? Because if we set a value larger than the default</div><div class='ctx'>  * setsockopt will fail. Having larger values might be beneficial for</div><div class='ctx'>  * IB links.</div><div class='ctx'>  */</div><div class='del'>-#define GF_DEFAULT_SOCKET_WINDOW_SIZE   (512 * GF_UNIT_KB)</div><div class='del'>-#define GF_MAX_SOCKET_WINDOW_SIZE       (1 * GF_UNIT_MB)</div><div class='del'>-#define GF_MIN_SOCKET_WINDOW_SIZE       (128 * GF_UNIT_KB)</div><div class='add'>+#define GF_DEFAULT_SOCKET_WINDOW_SIZE (0)</div><div class='add'>+#define GF_MAX_SOCKET_WINDOW_SIZE (1 * GF_UNIT_MB)</div><div class='add'>+#define GF_MIN_SOCKET_WINDOW_SIZE (0)</div><div class='add'>+#define GF_USE_DEFAULT_KEEPALIVE (-1)</div><div class='add'>+</div><div class='add'>+#define GF_KEEPALIVE_TIME (20)</div><div class='add'>+#define GF_KEEPALIVE_INTERVAL (2)</div><div class='add'>+#define GF_KEEPALIVE_COUNT (9)</div><div class='ctx'> </div><div class='ctx'> typedef enum {</div><div class='del'>-        SP_STATE_NADA = 0,</div><div class='del'>-        SP_STATE_COMPLETE,</div><div class='del'>-        SP_STATE_READING_FRAGHDR,</div><div class='del'>-        SP_STATE_READ_FRAGHDR,</div><div class='del'>-        SP_STATE_READING_FRAG,</div><div class='add'>+    SP_STATE_NADA = 0,</div><div class='add'>+    SP_STATE_COMPLETE,</div><div class='add'>+    SP_STATE_READING_FRAGHDR,</div><div class='add'>+    SP_STATE_READ_FRAGHDR,</div><div class='add'>+    SP_STATE_READING_FRAG,</div><div class='ctx'> } sp_rpcrecord_state_t;</div><div class='ctx'> </div><div class='ctx'> typedef enum {</div><div class='del'>-        SP_STATE_RPCFRAG_INIT,</div><div class='del'>-        SP_STATE_READING_MSGTYPE,</div><div class='del'>-        SP_STATE_READ_MSGTYPE,</div><div class='add'>+    SP_STATE_RPCFRAG_INIT,</div><div class='add'>+    SP_STATE_READING_MSGTYPE,</div><div class='add'>+    SP_STATE_READ_MSGTYPE,</div><div class='add'>+    SP_STATE_NOTIFYING_XID</div><div class='ctx'> } sp_rpcfrag_state_t;</div><div class='ctx'> </div><div class='ctx'> typedef enum {</div><div class='del'>-        SP_STATE_SIMPLE_MSG_INIT,</div><div class='del'>-        SP_STATE_READING_SIMPLE_MSG,</div><div class='add'>+    SP_STATE_SIMPLE_MSG_INIT,</div><div class='add'>+    SP_STATE_READING_SIMPLE_MSG,</div><div class='ctx'> } sp_rpcfrag_simple_msg_state_t;</div><div class='ctx'> </div><div class='ctx'> typedef enum {</div><div class='del'>-        SP_STATE_VECTORED_REQUEST_INIT,</div><div class='del'>-        SP_STATE_READING_CREDBYTES,</div><div class='del'>-        SP_STATE_READ_CREDBYTES,        /* read credential data. */</div><div class='del'>-        SP_STATE_READING_VERFBYTES,</div><div class='del'>-        SP_STATE_READ_VERFBYTES,        /* read verifier data */</div><div class='del'>-        SP_STATE_READING_PROG,</div><div class='add'>+    SP_STATE_VECTORED_REQUEST_INIT,</div><div class='add'>+    SP_STATE_READING_CREDBYTES,</div><div class='add'>+    SP_STATE_READ_CREDBYTES, /* read credential data. */</div><div class='add'>+    SP_STATE_READING_VERFBYTES,</div><div class='add'>+    SP_STATE_READ_VERFBYTES, /* read verifier data */</div><div class='add'>+    SP_STATE_READING_PROGHDR,</div><div class='add'>+    SP_STATE_READ_PROGHDR,</div><div class='add'>+    SP_STATE_READING_PROGHDR_XDATA,</div><div class='add'>+    SP_STATE_READ_PROGHDR_XDATA, /* It's a bad "name" in the generic</div><div class='add'>+                                    RPC state machine, but greatly</div><div class='add'>+                                    aids code review (and xdata is</div><div class='add'>+                                    the only "consumer" of this state)</div><div class='add'>+                                 */</div><div class='add'>+    SP_STATE_READING_PROG,</div><div class='ctx'> } sp_rpcfrag_vectored_request_state_t;</div><div class='ctx'> </div><div class='ctx'> typedef enum {</div><div class='del'>-        SP_STATE_REQUEST_HEADER_INIT,</div><div class='del'>-        SP_STATE_READING_RPCHDR1,</div><div class='del'>-        SP_STATE_READ_RPCHDR1,     /* read msg from beginning till and</div><div class='del'>-                                       * including credlen</div><div class='del'>-                                       */</div><div class='add'>+    SP_STATE_REQUEST_HEADER_INIT,</div><div class='add'>+    SP_STATE_READING_RPCHDR1,</div><div class='add'>+    SP_STATE_READ_RPCHDR1, /* read msg from beginning till and</div><div class='add'>+                            * including credlen</div><div class='add'>+                            */</div><div class='ctx'> } sp_rpcfrag_request_header_state_t;</div><div class='ctx'> </div><div class='ctx'> struct ioq {</div><div class='del'>-        union {</div><div class='del'>-                struct list_head list;</div><div class='del'>-                struct {</div><div class='del'>-                        struct ioq    *next;</div><div class='del'>-                        struct ioq    *prev;</div><div class='del'>-                };</div><div class='add'>+    union {</div><div class='add'>+        struct list_head list;</div><div class='add'>+        struct {</div><div class='add'>+            struct ioq *next;</div><div class='add'>+            struct ioq *prev;</div><div class='ctx'>         };</div><div class='add'>+    };</div><div class='ctx'> </div><div class='del'>-        uint32_t           fraghdr;</div><div class='del'>-        struct iovec       vector[MAX_IOVEC];</div><div class='del'>-        int                count;</div><div class='del'>-        struct iovec      *pending_vector;</div><div class='del'>-        int                pending_count;</div><div class='del'>-        struct iobref     *iobref;</div><div class='add'>+    struct iovec vector[MAX_IOVEC];</div><div class='add'>+    struct iovec *pending_vector;</div><div class='add'>+    int count;</div><div class='add'>+    int pending_count;</div><div class='add'>+    struct iobref *iobref;</div><div class='add'>+    uint32_t fraghdr;</div><div class='add'>+    char _pad[4];</div><div class='ctx'> };</div><div class='ctx'> </div><div class='ctx'> typedef struct {</div><div class='del'>-        sp_rpcfrag_request_header_state_t header_state;</div><div class='del'>-        sp_rpcfrag_vectored_request_state_t vector_state;</div><div class='add'>+    sp_rpcfrag_request_header_state_t header_state;</div><div class='add'>+    sp_rpcfrag_vectored_request_state_t vector_state;</div><div class='add'>+    int vector_sizer_state;</div><div class='ctx'> } sp_rpcfrag_request_state_t;</div><div class='ctx'> </div><div class='ctx'> typedef enum {</div><div class='del'>-        SP_STATE_VECTORED_REPLY_STATUS_INIT,</div><div class='del'>-        SP_STATE_READING_REPLY_STATUS,</div><div class='del'>-        SP_STATE_READ_REPLY_STATUS,</div><div class='add'>+    SP_STATE_VECTORED_REPLY_STATUS_INIT,</div><div class='add'>+    SP_STATE_READING_REPLY_STATUS,</div><div class='add'>+    SP_STATE_READ_REPLY_STATUS,</div><div class='ctx'> } sp_rpcfrag_vectored_reply_status_state_t;</div><div class='ctx'> </div><div class='ctx'> typedef enum {</div><div class='del'>-        SP_STATE_ACCEPTED_SUCCESS_REPLY_INIT,</div><div class='del'>-        SP_STATE_READING_PROC_HEADER,</div><div class='del'>-        SP_STATE_READ_PROC_HEADER,</div><div class='add'>+    SP_STATE_ACCEPTED_SUCCESS_REPLY_INIT,</div><div class='add'>+    SP_STATE_READING_PROC_HEADER,</div><div class='add'>+    SP_STATE_READING_PROC_OPAQUE,</div><div class='add'>+    SP_STATE_READ_PROC_OPAQUE,</div><div class='add'>+    SP_STATE_READ_PROC_HEADER,</div><div class='ctx'> } sp_rpcfrag_vectored_reply_accepted_success_state_t;</div><div class='ctx'> </div><div class='ctx'> typedef enum {</div><div class='del'>-        SP_STATE_ACCEPTED_REPLY_INIT,</div><div class='del'>-        SP_STATE_READING_REPLY_VERFLEN,</div><div class='del'>-        SP_STATE_READ_REPLY_VERFLEN,</div><div class='del'>-        SP_STATE_READING_REPLY_VERFBYTES,</div><div class='del'>-        SP_STATE_READ_REPLY_VERFBYTES,</div><div class='add'>+    SP_STATE_ACCEPTED_REPLY_INIT,</div><div class='add'>+    SP_STATE_READING_REPLY_VERFLEN,</div><div class='add'>+    SP_STATE_READ_REPLY_VERFLEN,</div><div class='add'>+    SP_STATE_READING_REPLY_VERFBYTES,</div><div class='add'>+    SP_STATE_READ_REPLY_VERFBYTES,</div><div class='ctx'> } sp_rpcfrag_vectored_reply_accepted_state_t;</div><div class='ctx'> </div><div class='ctx'> typedef struct {</div><div class='del'>-        uint32_t accept_status;</div><div class='del'>-        sp_rpcfrag_vectored_reply_status_state_t status_state;</div><div class='del'>-        sp_rpcfrag_vectored_reply_accepted_state_t accepted_state;</div><div class='del'>-        sp_rpcfrag_vectored_reply_accepted_success_state_t accepted_success_state;</div><div class='add'>+    uint32_t accept_status;</div><div class='add'>+    sp_rpcfrag_vectored_reply_status_state_t status_state;</div><div class='add'>+    sp_rpcfrag_vectored_reply_accepted_state_t accepted_state;</div><div class='add'>+    sp_rpcfrag_vectored_reply_accepted_success_state_t accepted_success_state;</div><div class='ctx'> } sp_rpcfrag_vectored_reply_state_t;</div><div class='ctx'> </div><div class='add'>+struct gf_sock_incoming_frag {</div><div class='add'>+    char *fragcurrent;</div><div class='add'>+    uint32_t bytes_read;</div><div class='add'>+    uint32_t remaining_size;</div><div class='add'>+    struct iovec vector;</div><div class='add'>+    struct iovec *pending_vector;</div><div class='add'>+    union {</div><div class='add'>+        sp_rpcfrag_request_state_t request;</div><div class='add'>+        sp_rpcfrag_vectored_reply_state_t reply;</div><div class='add'>+    } call_body;</div><div class='add'>+</div><div class='add'>+    sp_rpcfrag_simple_msg_state_t simple_state;</div><div class='add'>+    sp_rpcfrag_state_t state;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+#define GF_SOCKET_RA_MAX 1024</div><div class='add'>+</div><div class='add'>+struct gf_sock_incoming {</div><div class='add'>+    char *proghdr_base_addr;</div><div class='add'>+    struct iobuf *iobuf;</div><div class='add'>+    size_t iobuf_size;</div><div class='add'>+    struct gf_sock_incoming_frag frag;</div><div class='add'>+    struct iovec vector[2];</div><div class='add'>+    struct iovec payload_vector;</div><div class='add'>+    struct iobref *iobref;</div><div class='add'>+    rpc_request_info_t *request_info;</div><div class='add'>+    struct iovec *pending_vector;</div><div class='add'>+    int count;</div><div class='add'>+    int pending_count;</div><div class='add'>+    size_t total_bytes_read;</div><div class='add'>+</div><div class='add'>+    size_t ra_read;</div><div class='add'>+    size_t ra_max;</div><div class='add'>+    size_t ra_served;</div><div class='add'>+    char *ra_buf;</div><div class='add'>+    uint32_t fraghdr;</div><div class='add'>+    msg_type_t msg_type;</div><div class='add'>+    sp_rpcrecord_state_t record_state;</div><div class='add'>+    char _pad[4];</div><div class='add'>+};</div><div class='add'>+</div><div class='ctx'> typedef struct {</div><div class='del'>-        int32_t                sock;</div><div class='del'>-        int32_t                idx;</div><div class='del'>-        unsigned char          connected; // -1 = not connected. 0 = in progress. 1 = connected</div><div class='del'>-        char                   bio;</div><div class='del'>-        char                   connect_finish_log;</div><div class='del'>-        char                   submit_log;</div><div class='del'>-        union {</div><div class='del'>-                struct list_head     ioq;</div><div class='del'>-                struct {</div><div class='del'>-                        struct ioq        *ioq_next;</div><div class='del'>-                        struct ioq        *ioq_prev;</div><div class='del'>-                };</div><div class='del'>-        };</div><div class='add'>+    union {</div><div class='add'>+        struct list_head ioq;</div><div class='ctx'>         struct {</div><div class='del'>-                sp_rpcrecord_state_t  record_state;</div><div class='del'>-                struct {</div><div class='del'>-                        char         *fragcurrent;</div><div class='del'>-                        uint32_t      bytes_read;</div><div class='del'>-                        uint32_t      remaining_size;</div><div class='del'>-                        struct iovec  vector;</div><div class='del'>-                        struct iovec *pending_vector;</div><div class='del'>-                        union {</div><div class='del'>-                                sp_rpcfrag_request_state_t        request;</div><div class='del'>-                                sp_rpcfrag_vectored_reply_state_t reply;</div><div class='del'>-                        } call_body;</div><div class='del'>-</div><div class='del'>-                        sp_rpcfrag_simple_msg_state_t     simple_state;</div><div class='del'>-                        sp_rpcfrag_state_t state;</div><div class='del'>-                } frag;</div><div class='del'>-                struct iobuf        *iobuf;</div><div class='del'>-                size_t               iobuf_size;</div><div class='del'>-                struct iovec         vector[2];</div><div class='del'>-                int                  count;</div><div class='del'>-                struct iovec         payload_vector;</div><div class='del'>-                struct iobref       *iobref;</div><div class='del'>-                rpc_request_info_t  *request_info;</div><div class='del'>-                struct iovec        *pending_vector;</div><div class='del'>-                int                  pending_count;</div><div class='del'>-                uint32_t             fraghdr;</div><div class='del'>-                char                 complete_record;</div><div class='del'>-                msg_type_t           msg_type;</div><div class='del'>-                size_t               total_bytes_read;</div><div class='del'>-        } incoming;</div><div class='del'>-        pthread_mutex_t        lock;</div><div class='del'>-        int                    windowsize;</div><div class='del'>-        char                   lowlat;</div><div class='del'>-        char                   nodelay;</div><div class='del'>-} socket_private_t;</div><div class='add'>+            struct ioq *ioq_next;</div><div class='add'>+            struct ioq *ioq_prev;</div><div class='add'>+        };</div><div class='add'>+    };</div><div class='add'>+    pthread_mutex_t out_lock;</div><div class='add'>+    pthread_mutex_t cond_lock;</div><div class='add'>+    pthread_cond_t cond;</div><div class='add'>+    int windowsize;</div><div class='add'>+    int keepalive;</div><div class='add'>+    int keepaliveidle;</div><div class='add'>+    int keepaliveintvl;</div><div class='add'>+    int keepalivecnt;</div><div class='add'>+    int timeout;</div><div class='add'>+    int log_ctr;</div><div class='add'>+    int shutdown_log_ctr;</div><div class='add'>+    /* ssl_error_required is used only during the SSL connection setup</div><div class='add'>+     * phase.</div><div class='add'>+     * It holds the error code returned by SSL_get_error() and is used to</div><div class='add'>+     * arm the epoll event set for the required event for the specific fd.</div><div class='add'>+     */</div><div class='add'>+    int ssl_error_required;</div><div class='add'>+    int ssl_session_id;</div><div class='ctx'> </div><div class='add'>+    GF_REF_DECL; /* refcount to keep track of socket_poller</div><div class='add'>+                    threads */</div><div class='add'>+    struct {</div><div class='add'>+        pthread_mutex_t lock;</div><div class='add'>+        pthread_cond_t cond;</div><div class='add'>+        uint64_t in_progress;</div><div class='add'>+    } notify;</div><div class='add'>+    int32_t sock;</div><div class='add'>+    int32_t idx;</div><div class='add'>+    int32_t gen;</div><div class='add'>+    uint32_t backlog;</div><div class='add'>+    SSL_METHOD *ssl_meth;</div><div class='add'>+    SSL_CTX *ssl_ctx;</div><div class='add'>+    BIO *ssl_sbio;</div><div class='add'>+    SSL *ssl_ssl;</div><div class='add'>+    char *ssl_own_cert;</div><div class='add'>+    char *ssl_private_key;</div><div class='add'>+    char *ssl_ca_list;</div><div class='add'>+    char *crl_path;</div><div class='add'>+    struct gf_sock_incoming incoming;</div><div class='add'>+    mgmt_ssl_t srvr_ssl;</div><div class='add'>+    /* -1 = not connected. 0 = in progress. 1 = connected */</div><div class='add'>+    char connected;</div><div class='add'>+    /* 1 = connect failed for reasons other than EINPROGRESS/ENOENT</div><div class='add'>+    see socket_connect for details */</div><div class='add'>+    char connect_failed;</div><div class='add'>+    char bio;</div><div class='add'>+    char connect_finish_log;</div><div class='add'>+    char submit_log;</div><div class='add'>+    char nodelay;</div><div class='add'>+    gf_boolean_t read_fail_log;</div><div class='add'>+    gf_boolean_t ssl_enabled; /* outbound I/O */</div><div class='add'>+    gf_boolean_t mgmt_ssl;    /* outbound mgmt */</div><div class='add'>+    gf_boolean_t is_server;</div><div class='add'>+    gf_boolean_t use_ssl;</div><div class='add'>+    gf_boolean_t ssl_accepted;  /* To indicate SSL_accept() */</div><div class='add'>+    gf_boolean_t ssl_connected; /* or SSL_connect() has been</div><div class='add'>+                                 * been completed on this socket.</div><div class='add'>+                                 * These are valid only when</div><div class='add'>+                                 * use_ssl is true.</div><div class='add'>+                                 */</div><div class='add'>+    /* SSL_CTX is created for each transport. Since we are now using non-</div><div class='add'>+     * blocking mechanism for SSL_accept() and SSL_connect(), the SSL</div><div class='add'>+     * context is created on the first EPOLLIN event which may lead to</div><div class='add'>+     * SSL_ERROR_WANT_READ/SSL_ERROR_WANT_WRITE and may not complete the</div><div class='add'>+     * SSL connection at the first attempt.</div><div class='add'>+     * ssl_context_created is a flag to note that we've created the SSL</div><div class='add'>+     * context for the connection so that we don't blindly create any more</div><div class='add'>+     * while !ssl_accepted or !ssl_connected.</div><div class='add'>+     */</div><div class='add'>+    gf_boolean_t ssl_context_created;</div><div class='add'>+    gf_boolean_t accepted; /* explicit flag to be set in</div><div class='add'>+                            * socket_event_handler() for</div><div class='add'>+                            * newly accepted socket</div><div class='add'>+                            */</div><div class='add'>+    char _pad[4];</div><div class='add'>+} socket_private_t;</div><div class='ctx'> </div><div class='ctx'> #endif</div><div class='head'>diff --git a/rpc/xdr/src/.gitignore b/rpc/xdr/src/.gitignore<br/>new file mode 100644<br/>index 00000000000..a0c8b7ca2b6<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/rpc/xdr/src/.gitignore?id=d1d7a6f35c816822fab51c820e25023863c239c1'>rpc/xdr/src/.gitignore</a></div><div class='hunk'>@@ -0,0 +1,25 @@</div><div class='add'>+acl3-xdr.c</div><div class='add'>+acl3-xdr.h</div><div class='add'>+changelog-xdr.c</div><div class='add'>+changelog-xdr.h</div><div class='add'>+cli1-xdr.c</div><div class='add'>+cli1-xdr.h</div><div class='add'>+glusterd1-xdr.c</div><div class='add'>+glusterd1-xdr.h</div><div class='add'>+glusterfs3-xdr.c</div><div class='add'>+glusterfs3-xdr.h</div><div class='add'>+glusterfs4-xdr.c</div><div class='add'>+glusterfs4-xdr.h</div><div class='add'>+mount3udp.c</div><div class='add'>+mount3udp.h</div><div class='add'>+nlm4-xdr.c</div><div class='add'>+nlm4-xdr.h</div><div class='add'>+nlmcbk-xdr.c</div><div class='add'>+nlmcbk-xdr.h</div><div class='add'>+nsm-xdr.c</div><div class='add'>+nsm-xdr.h</div><div class='add'>+portmap-xdr.c</div><div class='add'>+portmap-xdr.h</div><div class='add'>+rpc-common-xdr.c</div><div class='add'>+rpc-common-xdr.h</div><div class='add'>+*-e</div><div class='head'>diff --git a/rpc/xdr/src/Makefile.am b/rpc/xdr/src/Makefile.am<br/>index 981f319b3a7..0e9c377ec93 100644<br/>--- a/<a href='/cgit/glusterfs.git/tree/rpc/xdr/src/Makefile.am?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>rpc/xdr/src/Makefile.am</a><br/>+++ b/<a href='/cgit/glusterfs.git/tree/rpc/xdr/src/Makefile.am?id=d1d7a6f35c816822fab51c820e25023863c239c1'>rpc/xdr/src/Makefile.am</a></div><div class='hunk'>@@ -1,22 +1,85 @@</div><div class='add'>+if BUILD_GNFS</div><div class='add'>+    NFS_XDRS = nlm4-xdr.x nsm-xdr.x acl3-xdr.x mount3udp.x</div><div class='add'>+    NFS_SRCS = xdr-nfs3.c msg-nfs3.c</div><div class='add'>+    NFS_HDRS = xdr-nfs3.h msg-nfs3.h</div><div class='add'>+else</div><div class='add'>+    NFS_EXTRA_XDRS = nlm4-xdr.x nsm-xdr.x acl3-xdr.x mount3udp.x</div><div class='add'>+endif</div><div class='add'>+</div><div class='add'>+XDRGENFILES = glusterfs3-xdr.x glusterfs4-xdr.x cli1-xdr.x \</div><div class='add'>+	rpc-common-xdr.x glusterd1-xdr.x changelog-xdr.x \</div><div class='add'>+	portmap-xdr.x ${NFS_XDRS}</div><div class='add'>+</div><div class='add'>+XDRHEADERS = $(XDRGENFILES:.x=.h)</div><div class='add'>+XDRSOURCES = $(XDRGENFILES:.x=.c)</div><div class='add'>+</div><div class='add'>+EXTRA_DIST = $(XDRGENFILES) libgfxdr.sym ${NFS_EXTRA_XDRS}</div><div class='add'>+</div><div class='ctx'> lib_LTLIBRARIES = libgfxdr.la</div><div class='ctx'> </div><div class='del'>-libgfxdr_la_CFLAGS = -fPIC  -Wall -g -shared -nostartfiles $(GF_CFLAGS) $(GF_DARWIN_LIBGLUSTERFS_CFLAGS)</div><div class='add'>+libgfxdr_la_CFLAGS = -Wall $(GF_CFLAGS) $(GF_DARWIN_LIBGLUSTERFS_CFLAGS)</div><div class='add'>+</div><div class='add'>+libgfxdr_la_CPPFLAGS = $(GF_CPPFLAGS) -D__USE_FILE_OFFSET64 \</div><div class='add'>+	-I$(top_srcdir)/libglusterfs/src -I$(top_srcdir)/rpc/rpc-lib/src \</div><div class='add'>+	-I$(top_builddir)/rpc/xdr/src</div><div class='add'>+</div><div class='add'>+libgfxdr_la_LIBADD = $(top_builddir)/libglusterfs/src/libglusterfs.la</div><div class='add'>+</div><div class='add'>+libgfxdr_la_LDFLAGS = -version-info $(LIBGFXDR_LT_VERSION) $(GF_LDFLAGS) \</div><div class='add'>+		      -export-symbols $(top_srcdir)/rpc/xdr/src/libgfxdr.sym</div><div class='add'>+</div><div class='add'>+libgfxdr_la_SOURCES = xdr-generic.c ${NFS_SRCS}</div><div class='add'>+nodist_libgfxdr_la_SOURCES = $(XDRSOURCES)</div><div class='add'>+</div><div class='add'>+libgfxdr_la_HEADERS = xdr-generic.h glusterfs3.h rpc-pragmas.h ${NFS_HDRS}</div><div class='add'>+nodist_libgfxdr_la_HEADERS = $(XDRHEADERS)</div><div class='add'>+</div><div class='add'>+libgfxdr_ladir = $(includedir)/glusterfs/rpc</div><div class='add'>+</div><div class='add'>+CLEANFILES = $(XDRSOURCES) $(XDRHEADERS)</div><div class='add'>+</div><div class='add'>+# trick automake into doing BUILT_SOURCES magic</div><div class='add'>+BUILT_SOURCES = $(XDRHEADERS) $(XDRSOURCES)</div><div class='add'>+</div><div class='add'>+xdrsrc=$(top_srcdir)/rpc/xdr/src</div><div class='add'>+xdrdst=$(top_builddir)/rpc/xdr/src</div><div class='add'>+</div><div class='add'>+# make's dependency resolution may mean that it decides to run</div><div class='add'>+# rpcgen again (unnecessarily), but as the .c file already exists,</div><div class='add'>+# rpcgen will exit with an error, resulting in a build error. We</div><div class='add'>+# could use a '-' (i.e. -@rpcgen ...) and suffer with noisy warnings</div><div class='add'>+# in the build. Or we do this crufty thing instead.</div><div class='add'>+$(XDRSOURCES): $(XDRGENFILES)</div><div class='add'>+	@if [ ! -e $(xdrdst)/$@ -o $(@:.c=.x) -nt $(xdrdst)/$@ ]; then \</div><div class='add'>+		rpcgen -c -o $(xdrdst)/$@ $(@:.c=.x) ;\</div><div class='add'>+	fi</div><div class='ctx'> </div><div class='del'>-libgfxdr_la_CPPFLAGS = -D_FILE_OFFSET_BITS=64 -D__USE_FILE_OFFSET64 \</div><div class='del'>-			-D_GNU_SOURCE -D$(GF_HOST_OS) \</div><div class='del'>-			-I$(top_srcdir)/libglusterfs/src -I$(top_srcdir)/rpc/rpc-lib/src</div><div class='add'>+# d*mn sed in netbsd6 doesn't do -i (inline)</div><div class='add'>+# (why are we still running smoke on netbsd6 and not netbsd7?)</div><div class='add'>+$(XDRHEADERS): $(XDRGENFILES)</div><div class='add'>+	@if [ ! -e $(xdrdst)/$@ -o $(@:.h=.x) -nt $(xdrdst)/$@ ]; then \</div><div class='add'>+		rpcgen -h -o $(@:.h=.tmp) $(@:.h=.x) &amp;&amp; \</div><div class='add'>+		sed -e '/#ifndef/ s/-/_/g' -e '/#define/ s/-/_/g' \</div><div class='add'>+			-e '/#endif/ s/-/_/' -e 's/TMP_/H_/g' \</div><div class='add'>+			$(@:.h=.tmp) &gt; $(xdrdst)/$@ &amp;&amp; \</div><div class='add'>+		rm -f $(@:.h=.tmp) ; \</div><div class='add'>+	fi</div><div class='ctx'> </div><div class='del'>-libgfxdr_la_LIBADD = $(top_builddir)/libglusterfs/src/libglusterfs.la \</div><div class='del'>-		$(top_builddir)/rpc/rpc-lib/src/libgfrpc.la</div><div class='ctx'> </div><div class='del'>-libgfxdr_la_SOURCES =  xdr-generic.c \</div><div class='del'>-			glusterfs3-xdr.c glusterfs3.c \</div><div class='del'>-			cli1-xdr.c cli1.c \</div><div class='del'>-			glusterd1-xdr.c glusterd1.c \</div><div class='del'>-			portmap-xdr.c portmap.c</div><div class='add'>+# link .x files when doing out-of-tree builds</div><div class='add'>+# have to use .PHONY here to force it; all versions of make</div><div class='add'>+# will think the file already exists "here" by virtue of the</div><div class='add'>+# VPATH. And we have to have the .x file in $cwd in order to</div><div class='add'>+# have rpcgen generate "nice" #include directives</div><div class='add'>+# i.e. (nice):</div><div class='add'>+# #include "acl3-xdr.h"</div><div class='add'>+# versus (not nice):</div><div class='add'>+# #include "../../../../foo/src/rpc/xdr/src/acl3-xdr.h"</div><div class='add'>+.PHONY : $(XDRGENFILES)</div><div class='add'>+$(XDRGENFILES):</div><div class='add'>+	@if [ ! -e $@ ]; then ln -s $(xdrsrc)/$@ . ; fi;</div><div class='ctx'> </div><div class='del'>-noinst_HEADERS = xdr-generic.h \</div><div class='del'>-		glusterfs3-xdr.h glusterfs3.h \</div><div class='del'>-		cli1-xdr.h cli1.h \</div><div class='del'>-		glusterd1-xdr.h glusterd1.h \</div><div class='del'>-		portmap-xdr.h portmap.h</div><div class='add'>+clean-local:</div><div class='add'>+	@if [ $(top_builddir) != $(top_srcdir) ]; then \</div><div class='add'>+		rm -f $(xdrdst)/*.x; \</div><div class='add'>+	fi</div><div class='head'>diff --git a/rpc/xdr/src/acl3-xdr.x b/rpc/xdr/src/acl3-xdr.x<br/>new file mode 100644<br/>index 00000000000..7f7364971e6<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/rpc/xdr/src/acl3-xdr.x?id=d1d7a6f35c816822fab51c820e25023863c239c1'>rpc/xdr/src/acl3-xdr.x</a></div><div class='hunk'>@@ -0,0 +1,52 @@</div><div class='add'>+/*</div><div class='add'>+ * Copyright (c) 2012 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+ * This file is part of GlusterFS.</div><div class='add'>+ *</div><div class='add'>+ * This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+ * General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+ * later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+ * cases as published by the Free Software Foundation.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+#ifdef RPC_XDR</div><div class='add'>+%#include "rpc-pragmas.h"</div><div class='add'>+#endif</div><div class='add'>+%#include &lt;glusterfs/compat.h&gt;</div><div class='add'>+%#include "xdr-nfs3.h"</div><div class='add'>+</div><div class='add'>+struct aclentry {</div><div class='add'>+	int type;</div><div class='add'>+	int uid;</div><div class='add'>+	int perm;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct getaclargs {</div><div class='add'>+	netobj fh;</div><div class='add'>+	int	mask;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct getaclreply {</div><div class='add'>+	int status;</div><div class='add'>+	int attr_follows;</div><div class='add'>+	fattr3 attr;</div><div class='add'>+	int	mask;</div><div class='add'>+	int aclcount;</div><div class='add'>+	aclentry aclentry&lt;&gt;;</div><div class='add'>+	int daclcount;</div><div class='add'>+	aclentry daclentry&lt;&gt;;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct setaclargs {</div><div class='add'>+	netobj fh;</div><div class='add'>+	int mask;</div><div class='add'>+	int aclcount;</div><div class='add'>+	aclentry aclentry&lt;&gt;;</div><div class='add'>+	int daclcount;</div><div class='add'>+	aclentry daclentry&lt;&gt;;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct setaclreply {</div><div class='add'>+	int status;</div><div class='add'>+	int attr_follows;</div><div class='add'>+	fattr3 attr;</div><div class='add'>+};</div><div class='head'>diff --git a/rpc/xdr/src/changelog-xdr.x b/rpc/xdr/src/changelog-xdr.x<br/>new file mode 100644<br/>index 00000000000..5956245d5ce<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/rpc/xdr/src/changelog-xdr.x?id=d1d7a6f35c816822fab51c820e25023863c239c1'>rpc/xdr/src/changelog-xdr.x</a></div><div class='hunk'>@@ -0,0 +1,42 @@</div><div class='add'>+/*</div><div class='add'>+ * Copyright (c) 2012 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+ * This file is part of GlusterFS.</div><div class='add'>+ *</div><div class='add'>+ * This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+ * General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+ * later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+ * cases as published by the Free Software Foundation.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+#ifdef RPC_XDR</div><div class='add'>+%#include "rpc-pragmas.h"</div><div class='add'>+#endif</div><div class='add'>+%#include &lt;glusterfs/compat.h&gt;</div><div class='add'>+</div><div class='add'>+/* XDR: libgfchangelog -&gt; changelog */</div><div class='add'>+</div><div class='add'>+struct changelog_probe_req {</div><div class='add'>+       unsigned int filter;</div><div class='add'>+       char sock[UNIX_PATH_MAX];</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct changelog_probe_rsp {</div><div class='add'>+       int op_ret;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+/* XDR: changelog -&gt; libgfchangelog */</div><div class='add'>+struct changelog_event_req {</div><div class='add'>+       /* sequence number for the buffer */</div><div class='add'>+       unsigned hyper seq;</div><div class='add'>+</div><div class='add'>+       /* time of dispatch */</div><div class='add'>+       unsigned hyper tv_sec;</div><div class='add'>+       unsigned hyper tv_usec;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct changelog_event_rsp {</div><div class='add'>+       int op_ret;</div><div class='add'>+</div><div class='add'>+       /* ack'd buffers sequence number */</div><div class='add'>+       unsigned hyper seq;</div><div class='add'>+};</div><div class='head'>diff --git a/rpc/xdr/src/cli1-xdr.c b/rpc/xdr/src/cli1-xdr.c<br/>deleted file mode 100644<br/>index dd225f35524..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/rpc/xdr/src/cli1-xdr.c?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>rpc/xdr/src/cli1-xdr.c</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,547 +0,0 @@</div><div class='del'>-/*</div><div class='del'>-  Copyright (c) 2010 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='del'>-  This file is part of GlusterFS.</div><div class='del'>-</div><div class='del'>-  GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-  it under the terms of the GNU Affero General Public License as published</div><div class='del'>-  by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-  or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-  GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-  WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-  Affero General Public License for more details.</div><div class='del'>-</div><div class='del'>-  You should have received a copy of the GNU Affero General Public License</div><div class='del'>-  along with this program.  If not, see</div><div class='del'>-  &lt;http://www.gnu.org/licenses/&gt;.</div><div class='del'>-*/</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-/*</div><div class='del'>- * Please do not edit this file.</div><div class='del'>- * It was generated using rpcgen.</div><div class='del'>- */</div><div class='del'>-</div><div class='del'>-#include "cli1.h"</div><div class='del'>-</div><div class='del'>-bool_t</div><div class='del'>-xdr_gf1_cluster_type (XDR *xdrs, gf1_cluster_type *objp)</div><div class='del'>-{</div><div class='del'>-</div><div class='del'>-	 if (!xdr_enum (xdrs, (enum_t *) objp))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	return TRUE;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-bool_t</div><div class='del'>-xdr_gf1_cli_replace_op (XDR *xdrs, gf1_cli_replace_op *objp)</div><div class='del'>-{</div><div class='del'>-</div><div class='del'>-	 if (!xdr_enum (xdrs, (enum_t *) objp))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	return TRUE;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-bool_t</div><div class='del'>-xdr_gf1_cli_friends_list (XDR *xdrs, gf1_cli_friends_list *objp)</div><div class='del'>-{</div><div class='del'>-</div><div class='del'>-	 if (!xdr_enum (xdrs, (enum_t *) objp))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	return TRUE;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-bool_t</div><div class='del'>-xdr_gf1_cli_get_volume (XDR *xdrs, gf1_cli_get_volume *objp)</div><div class='del'>-{</div><div class='del'>-</div><div class='del'>-	 if (!xdr_enum (xdrs, (enum_t *) objp))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	return TRUE;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-bool_t</div><div class='del'>-xdr_gf1_cli_op_flags (XDR *xdrs, gf1_cli_op_flags *objp)</div><div class='del'>-{</div><div class='del'>-</div><div class='del'>-	 if (!xdr_enum (xdrs, (enum_t *) objp))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	return TRUE;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-bool_t</div><div class='del'>-xdr_gf1_cli_probe_req (XDR *xdrs, gf1_cli_probe_req *objp)</div><div class='del'>-{</div><div class='del'>-</div><div class='del'>-	 if (!xdr_string (xdrs, &amp;objp-&gt;hostname, ~0))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_int (xdrs, &amp;objp-&gt;port))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	return TRUE;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-bool_t</div><div class='del'>-xdr_gf1_cli_probe_rsp (XDR *xdrs, gf1_cli_probe_rsp *objp)</div><div class='del'>-{</div><div class='del'>-</div><div class='del'>-        register int32_t *buf;</div><div class='del'>-</div><div class='del'>-	if (xdrs-&gt;x_op == XDR_ENCODE) {</div><div class='del'>-		buf = XDR_INLINE (xdrs, 3 * BYTES_PER_XDR_UNIT);</div><div class='del'>-		if (buf == NULL) {</div><div class='del'>-			 if (!xdr_int (xdrs, &amp;objp-&gt;op_ret))</div><div class='del'>-				 return FALSE;</div><div class='del'>-			 if (!xdr_int (xdrs, &amp;objp-&gt;op_errno))</div><div class='del'>-				 return FALSE;</div><div class='del'>-			 if (!xdr_int (xdrs, &amp;objp-&gt;port))</div><div class='del'>-				 return FALSE;</div><div class='del'>-</div><div class='del'>-		} else {</div><div class='del'>-		IXDR_PUT_LONG(buf, objp-&gt;op_ret);</div><div class='del'>-		IXDR_PUT_LONG(buf, objp-&gt;op_errno);</div><div class='del'>-		IXDR_PUT_LONG(buf, objp-&gt;port);</div><div class='del'>-		}</div><div class='del'>-		 if (!xdr_string (xdrs, &amp;objp-&gt;hostname, ~0))</div><div class='del'>-			 return FALSE;</div><div class='del'>-		return TRUE;</div><div class='del'>-	} else if (xdrs-&gt;x_op == XDR_DECODE) {</div><div class='del'>-		buf = XDR_INLINE (xdrs, 3 * BYTES_PER_XDR_UNIT);</div><div class='del'>-		if (buf == NULL) {</div><div class='del'>-			 if (!xdr_int (xdrs, &amp;objp-&gt;op_ret))</div><div class='del'>-				 return FALSE;</div><div class='del'>-			 if (!xdr_int (xdrs, &amp;objp-&gt;op_errno))</div><div class='del'>-				 return FALSE;</div><div class='del'>-			 if (!xdr_int (xdrs, &amp;objp-&gt;port))</div><div class='del'>-				 return FALSE;</div><div class='del'>-</div><div class='del'>-		} else {</div><div class='del'>-		objp-&gt;op_ret = IXDR_GET_LONG(buf);</div><div class='del'>-		objp-&gt;op_errno = IXDR_GET_LONG(buf);</div><div class='del'>-		objp-&gt;port = IXDR_GET_LONG(buf);</div><div class='del'>-		}</div><div class='del'>-		 if (!xdr_string (xdrs, &amp;objp-&gt;hostname, ~0))</div><div class='del'>-			 return FALSE;</div><div class='del'>-	 return TRUE;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	 if (!xdr_int (xdrs, &amp;objp-&gt;op_ret))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_int (xdrs, &amp;objp-&gt;op_errno))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_int (xdrs, &amp;objp-&gt;port))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_string (xdrs, &amp;objp-&gt;hostname, ~0))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	return TRUE;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-bool_t</div><div class='del'>-xdr_gf1_cli_deprobe_req (XDR *xdrs, gf1_cli_deprobe_req *objp)</div><div class='del'>-{</div><div class='del'>-</div><div class='del'>-	 if (!xdr_string (xdrs, &amp;objp-&gt;hostname, ~0))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_int (xdrs, &amp;objp-&gt;port))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	return TRUE;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-bool_t</div><div class='del'>-xdr_gf1_cli_deprobe_rsp (XDR *xdrs, gf1_cli_deprobe_rsp *objp)</div><div class='del'>-{</div><div class='del'>-</div><div class='del'>-	 if (!xdr_int (xdrs, &amp;objp-&gt;op_ret))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_int (xdrs, &amp;objp-&gt;op_errno))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_string (xdrs, &amp;objp-&gt;hostname, ~0))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	return TRUE;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-bool_t</div><div class='del'>-xdr_gf1_cli_peer_list_req (XDR *xdrs, gf1_cli_peer_list_req *objp)</div><div class='del'>-{</div><div class='del'>-</div><div class='del'>-	 if (!xdr_int (xdrs, &amp;objp-&gt;flags))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_bytes (xdrs, (char **)&amp;objp-&gt;dict.dict_val, (u_int *) &amp;objp-&gt;dict.dict_len, ~0))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	return TRUE;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-bool_t</div><div class='del'>-xdr_gf1_cli_peer_list_rsp (XDR *xdrs, gf1_cli_peer_list_rsp *objp)</div><div class='del'>-{</div><div class='del'>-</div><div class='del'>-	 if (!xdr_int (xdrs, &amp;objp-&gt;op_ret))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_int (xdrs, &amp;objp-&gt;op_errno))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_bytes (xdrs, (char **)&amp;objp-&gt;friends.friends_val, (u_int *) &amp;objp-&gt;friends.friends_len, ~0))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	return TRUE;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-bool_t</div><div class='del'>-xdr_gf1_cli_get_vol_req (XDR *xdrs, gf1_cli_get_vol_req *objp)</div><div class='del'>-{</div><div class='del'>-</div><div class='del'>-	 if (!xdr_int (xdrs, &amp;objp-&gt;flags))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_bytes (xdrs, (char **)&amp;objp-&gt;dict.dict_val, (u_int *) &amp;objp-&gt;dict.dict_len, ~0))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	return TRUE;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-bool_t</div><div class='del'>-xdr_gf1_cli_get_vol_rsp (XDR *xdrs, gf1_cli_get_vol_rsp *objp)</div><div class='del'>-{</div><div class='del'>-</div><div class='del'>-	 if (!xdr_int (xdrs, &amp;objp-&gt;op_ret))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_int (xdrs, &amp;objp-&gt;op_errno))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_bytes (xdrs, (char **)&amp;objp-&gt;volumes.volumes_val, (u_int *) &amp;objp-&gt;volumes.volumes_len, ~0))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	return TRUE;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-bool_t</div><div class='del'>-xdr_gf1_cli_create_vol_req (XDR *xdrs, gf1_cli_create_vol_req *objp)</div><div class='del'>-{</div><div class='del'>-</div><div class='del'>-	 if (!xdr_string (xdrs, &amp;objp-&gt;volname, ~0))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_gf1_cluster_type (xdrs, &amp;objp-&gt;type))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_int (xdrs, &amp;objp-&gt;count))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_bytes (xdrs, (char **)&amp;objp-&gt;bricks.bricks_val, (u_int *) &amp;objp-&gt;bricks.bricks_len, ~0))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	return TRUE;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-bool_t</div><div class='del'>-xdr_gf1_cli_create_vol_rsp (XDR *xdrs, gf1_cli_create_vol_rsp *objp)</div><div class='del'>-{</div><div class='del'>-</div><div class='del'>-	 if (!xdr_int (xdrs, &amp;objp-&gt;op_ret))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_int (xdrs, &amp;objp-&gt;op_errno))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_string (xdrs, &amp;objp-&gt;volname, ~0))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_string (xdrs, &amp;objp-&gt;op_errstr, ~0))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	return TRUE;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-bool_t</div><div class='del'>-xdr_gf1_cli_delete_vol_req (XDR *xdrs, gf1_cli_delete_vol_req *objp)</div><div class='del'>-{</div><div class='del'>-</div><div class='del'>-	 if (!xdr_string (xdrs, &amp;objp-&gt;volname, ~0))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	return TRUE;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-bool_t</div><div class='del'>-xdr_gf1_cli_delete_vol_rsp (XDR *xdrs, gf1_cli_delete_vol_rsp *objp)</div><div class='del'>-{</div><div class='del'>-</div><div class='del'>-	 if (!xdr_int (xdrs, &amp;objp-&gt;op_ret))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_int (xdrs, &amp;objp-&gt;op_errno))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_string (xdrs, &amp;objp-&gt;volname, ~0))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	return TRUE;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-bool_t</div><div class='del'>-xdr_gf1_cli_start_vol_req (XDR *xdrs, gf1_cli_start_vol_req *objp)</div><div class='del'>-{</div><div class='del'>-</div><div class='del'>-	 if (!xdr_string (xdrs, &amp;objp-&gt;volname, ~0))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	return TRUE;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-bool_t</div><div class='del'>-xdr_gf1_cli_start_vol_rsp (XDR *xdrs, gf1_cli_start_vol_rsp *objp)</div><div class='del'>-{</div><div class='del'>-</div><div class='del'>-	 if (!xdr_int (xdrs, &amp;objp-&gt;op_ret))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_int (xdrs, &amp;objp-&gt;op_errno))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_string (xdrs, &amp;objp-&gt;volname, ~0))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	return TRUE;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-bool_t</div><div class='del'>-xdr_gf1_cli_stop_vol_req (XDR *xdrs, gf1_cli_stop_vol_req *objp)</div><div class='del'>-{</div><div class='del'>-</div><div class='del'>-	 if (!xdr_string (xdrs, &amp;objp-&gt;volname, ~0))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_int (xdrs, &amp;objp-&gt;flags))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	return TRUE;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-bool_t</div><div class='del'>-xdr_gf1_cli_stop_vol_rsp (XDR *xdrs, gf1_cli_stop_vol_rsp *objp)</div><div class='del'>-{</div><div class='del'>-</div><div class='del'>-	 if (!xdr_int (xdrs, &amp;objp-&gt;op_ret))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_int (xdrs, &amp;objp-&gt;op_errno))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_string (xdrs, &amp;objp-&gt;volname, ~0))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	return TRUE;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-bool_t</div><div class='del'>-xdr_gf1_cli_rename_vol_req (XDR *xdrs, gf1_cli_rename_vol_req *objp)</div><div class='del'>-{</div><div class='del'>-</div><div class='del'>-	 if (!xdr_string (xdrs, &amp;objp-&gt;old_volname, ~0))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_string (xdrs, &amp;objp-&gt;new_volname, ~0))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	return TRUE;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-bool_t</div><div class='del'>-xdr_gf1_cli_rename_vol_rsp (XDR *xdrs, gf1_cli_rename_vol_rsp *objp)</div><div class='del'>-{</div><div class='del'>-</div><div class='del'>-	 if (!xdr_int (xdrs, &amp;objp-&gt;op_ret))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_int (xdrs, &amp;objp-&gt;op_errno))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_string (xdrs, &amp;objp-&gt;volname, ~0))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	return TRUE;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-bool_t</div><div class='del'>-xdr_gf1_cli_defrag_vol_req (XDR *xdrs, gf1_cli_defrag_vol_req *objp)</div><div class='del'>-{</div><div class='del'>-</div><div class='del'>-	 if (!xdr_int (xdrs, &amp;objp-&gt;cmd))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_string (xdrs, &amp;objp-&gt;volname, ~0))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	return TRUE;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-bool_t</div><div class='del'>-xdr_gf1_cli_defrag_vol_rsp (XDR *xdrs, gf1_cli_defrag_vol_rsp *objp)</div><div class='del'>-{</div><div class='del'>-</div><div class='del'>-	 if (!xdr_int (xdrs, &amp;objp-&gt;op_ret))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_int (xdrs, &amp;objp-&gt;op_errno))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_string (xdrs, &amp;objp-&gt;volname, ~0))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;files))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;size))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;lookedup_files))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	return TRUE;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-bool_t</div><div class='del'>-xdr_gf1_cli_add_brick_req (XDR *xdrs, gf1_cli_add_brick_req *objp)</div><div class='del'>-{</div><div class='del'>-</div><div class='del'>-	 if (!xdr_string (xdrs, &amp;objp-&gt;volname, ~0))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_gf1_cluster_type (xdrs, &amp;objp-&gt;type))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_int (xdrs, &amp;objp-&gt;count))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_bytes (xdrs, (char **)&amp;objp-&gt;bricks.bricks_val, (u_int *) &amp;objp-&gt;bricks.bricks_len, ~0))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	return TRUE;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-bool_t</div><div class='del'>-xdr_gf1_cli_add_brick_rsp (XDR *xdrs, gf1_cli_add_brick_rsp *objp)</div><div class='del'>-{</div><div class='del'>-</div><div class='del'>-	 if (!xdr_int (xdrs, &amp;objp-&gt;op_ret))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_int (xdrs, &amp;objp-&gt;op_errno))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_string (xdrs, &amp;objp-&gt;volname, ~0))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_string (xdrs, &amp;objp-&gt;op_errstr, ~0))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	return TRUE;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-bool_t</div><div class='del'>-xdr_gf1_cli_remove_brick_req (XDR *xdrs, gf1_cli_remove_brick_req *objp)</div><div class='del'>-{</div><div class='del'>-</div><div class='del'>-	 if (!xdr_string (xdrs, &amp;objp-&gt;volname, ~0))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_gf1_cluster_type (xdrs, &amp;objp-&gt;type))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_int (xdrs, &amp;objp-&gt;count))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_bytes (xdrs, (char **)&amp;objp-&gt;bricks.bricks_val, (u_int *) &amp;objp-&gt;bricks.bricks_len, ~0))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	return TRUE;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-bool_t</div><div class='del'>-xdr_gf1_cli_remove_brick_rsp (XDR *xdrs, gf1_cli_remove_brick_rsp *objp)</div><div class='del'>-{</div><div class='del'>-</div><div class='del'>-	 if (!xdr_int (xdrs, &amp;objp-&gt;op_ret))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_int (xdrs, &amp;objp-&gt;op_errno))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_string (xdrs, &amp;objp-&gt;volname, ~0))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_string (xdrs, &amp;objp-&gt;op_errstr, ~0))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	return TRUE;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-bool_t</div><div class='del'>-xdr_gf1_cli_replace_brick_req (XDR *xdrs, gf1_cli_replace_brick_req *objp)</div><div class='del'>-{</div><div class='del'>-</div><div class='del'>-	 if (!xdr_string (xdrs, &amp;objp-&gt;volname, ~0))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_gf1_cli_replace_op (xdrs, &amp;objp-&gt;op))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_bytes (xdrs, (char **)&amp;objp-&gt;bricks.bricks_val, (u_int *) &amp;objp-&gt;bricks.bricks_len, ~0))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	return TRUE;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-bool_t</div><div class='del'>-xdr_gf1_cli_replace_brick_rsp (XDR *xdrs, gf1_cli_replace_brick_rsp *objp)</div><div class='del'>-{</div><div class='del'>-</div><div class='del'>-	 if (!xdr_int (xdrs, &amp;objp-&gt;op_ret))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_int (xdrs, &amp;objp-&gt;op_errno))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_string (xdrs, &amp;objp-&gt;volname, ~0))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_string (xdrs, &amp;objp-&gt;status, ~0))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	return TRUE;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-bool_t</div><div class='del'>-xdr_gf1_cli_set_vol_req (XDR *xdrs, gf1_cli_set_vol_req *objp)</div><div class='del'>-{</div><div class='del'>-</div><div class='del'>-	 if (!xdr_string (xdrs, &amp;objp-&gt;volname, ~0))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_bytes (xdrs, (char **)&amp;objp-&gt;dict.dict_val, (u_int *) &amp;objp-&gt;dict.dict_len, ~0))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	return TRUE;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-bool_t</div><div class='del'>-xdr_gf1_cli_set_vol_rsp (XDR *xdrs, gf1_cli_set_vol_rsp *objp)</div><div class='del'>-{</div><div class='del'>-</div><div class='del'>-	 if (!xdr_int (xdrs, &amp;objp-&gt;op_ret))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_int (xdrs, &amp;objp-&gt;op_errno))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_string (xdrs, &amp;objp-&gt;volname, ~0))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	return TRUE;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-bool_t</div><div class='del'>-xdr_gf1_cli_log_filename_req (XDR *xdrs, gf1_cli_log_filename_req *objp)</div><div class='del'>-{</div><div class='del'>-</div><div class='del'>-	 if (!xdr_string (xdrs, &amp;objp-&gt;volname, ~0))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_string (xdrs, &amp;objp-&gt;brick, ~0))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_string (xdrs, &amp;objp-&gt;path, ~0))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	return TRUE;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-bool_t</div><div class='del'>-xdr_gf1_cli_log_filename_rsp (XDR *xdrs, gf1_cli_log_filename_rsp *objp)</div><div class='del'>-{</div><div class='del'>-</div><div class='del'>-	 if (!xdr_int (xdrs, &amp;objp-&gt;op_ret))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_int (xdrs, &amp;objp-&gt;op_errno))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_string (xdrs, &amp;objp-&gt;errstr, ~0))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	return TRUE;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-bool_t</div><div class='del'>-xdr_gf1_cli_log_locate_req (XDR *xdrs, gf1_cli_log_locate_req *objp)</div><div class='del'>-{</div><div class='del'>-</div><div class='del'>-	 if (!xdr_string (xdrs, &amp;objp-&gt;volname, ~0))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_string (xdrs, &amp;objp-&gt;brick, ~0))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	return TRUE;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-bool_t</div><div class='del'>-xdr_gf1_cli_log_locate_rsp (XDR *xdrs, gf1_cli_log_locate_rsp *objp)</div><div class='del'>-{</div><div class='del'>-</div><div class='del'>-	 if (!xdr_int (xdrs, &amp;objp-&gt;op_ret))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_int (xdrs, &amp;objp-&gt;op_errno))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_string (xdrs, &amp;objp-&gt;path, ~0))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	return TRUE;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-bool_t</div><div class='del'>-xdr_gf1_cli_log_rotate_req (XDR *xdrs, gf1_cli_log_rotate_req *objp)</div><div class='del'>-{</div><div class='del'>-</div><div class='del'>-	 if (!xdr_string (xdrs, &amp;objp-&gt;volname, ~0))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_string (xdrs, &amp;objp-&gt;brick, ~0))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	return TRUE;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-bool_t</div><div class='del'>-xdr_gf1_cli_log_rotate_rsp (XDR *xdrs, gf1_cli_log_rotate_rsp *objp)</div><div class='del'>-{</div><div class='del'>-</div><div class='del'>-	 if (!xdr_int (xdrs, &amp;objp-&gt;op_ret))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_int (xdrs, &amp;objp-&gt;op_errno))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_string (xdrs, &amp;objp-&gt;errstr, ~0))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	return TRUE;</div><div class='del'>-}</div><div class='head'>diff --git a/rpc/xdr/src/cli1-xdr.h b/rpc/xdr/src/cli1-xdr.h<br/>deleted file mode 100644<br/>index 2219b054740..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/rpc/xdr/src/cli1-xdr.h?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>rpc/xdr/src/cli1-xdr.h</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,423 +0,0 @@</div><div class='del'>-/*</div><div class='del'>-  Copyright (c) 2010 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='del'>-  This file is part of GlusterFS.</div><div class='del'>-</div><div class='del'>-  GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-  it under the terms of the GNU Affero General Public License as published</div><div class='del'>-  by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-  or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-  GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-  WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-  Affero General Public License for more details.</div><div class='del'>-</div><div class='del'>-  You should have received a copy of the GNU Affero General Public License</div><div class='del'>-  along with this program.  If not, see</div><div class='del'>-  &lt;http://www.gnu.org/licenses/&gt;.</div><div class='del'>-*/</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-/*</div><div class='del'>- * Please do not edit this file.</div><div class='del'>- * It was generated using rpcgen.</div><div class='del'>- */</div><div class='del'>-</div><div class='del'>-#ifndef _CLI1_H_RPCGEN</div><div class='del'>-#define _CLI1_H_RPCGEN</div><div class='del'>-</div><div class='del'>-#include &lt;rpc/rpc.h&gt;</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-#ifdef __cplusplus</div><div class='del'>-extern "C" {</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-enum gf1_cluster_type {</div><div class='del'>-	GF_CLUSTER_TYPE_NONE = 0,</div><div class='del'>-	GF_CLUSTER_TYPE_STRIPE = 0 + 1,</div><div class='del'>-	GF_CLUSTER_TYPE_REPLICATE = 0 + 2,</div><div class='del'>-};</div><div class='del'>-typedef enum gf1_cluster_type gf1_cluster_type;</div><div class='del'>-</div><div class='del'>-enum gf1_cli_replace_op {</div><div class='del'>-	GF_REPLACE_OP_NONE = 0,</div><div class='del'>-	GF_REPLACE_OP_START = 0 + 1,</div><div class='del'>-	GF_REPLACE_OP_COMMIT = 0 + 2,</div><div class='del'>-	GF_REPLACE_OP_PAUSE = 0 + 3,</div><div class='del'>-	GF_REPLACE_OP_ABORT = 0 + 4,</div><div class='del'>-	GF_REPLACE_OP_STATUS = 0 + 5,</div><div class='del'>-};</div><div class='del'>-typedef enum gf1_cli_replace_op gf1_cli_replace_op;</div><div class='del'>-</div><div class='del'>-enum gf1_cli_friends_list {</div><div class='del'>-	GF_CLI_LIST_ALL = 1,</div><div class='del'>-};</div><div class='del'>-typedef enum gf1_cli_friends_list gf1_cli_friends_list;</div><div class='del'>-</div><div class='del'>-enum gf1_cli_get_volume {</div><div class='del'>-	GF_CLI_GET_VOLUME_ALL = 1,</div><div class='del'>-	GF_CLI_GET_VOLUME = 1 + 1,</div><div class='del'>-	GF_CLI_GET_NEXT_VOLUME = 1 + 2,</div><div class='del'>-};</div><div class='del'>-typedef enum gf1_cli_get_volume gf1_cli_get_volume;</div><div class='del'>-</div><div class='del'>-enum gf1_cli_op_flags {</div><div class='del'>-	GF_CLI_FLAG_OP_FORCE = 1,</div><div class='del'>-};</div><div class='del'>-typedef enum gf1_cli_op_flags gf1_cli_op_flags;</div><div class='del'>-</div><div class='del'>-struct gf1_cli_probe_req {</div><div class='del'>-	char *hostname;</div><div class='del'>-	int port;</div><div class='del'>-};</div><div class='del'>-typedef struct gf1_cli_probe_req gf1_cli_probe_req;</div><div class='del'>-</div><div class='del'>-struct gf1_cli_probe_rsp {</div><div class='del'>-	int op_ret;</div><div class='del'>-	int op_errno;</div><div class='del'>-	int port;</div><div class='del'>-	char *hostname;</div><div class='del'>-};</div><div class='del'>-typedef struct gf1_cli_probe_rsp gf1_cli_probe_rsp;</div><div class='del'>-</div><div class='del'>-struct gf1_cli_deprobe_req {</div><div class='del'>-	char *hostname;</div><div class='del'>-	int port;</div><div class='del'>-};</div><div class='del'>-typedef struct gf1_cli_deprobe_req gf1_cli_deprobe_req;</div><div class='del'>-</div><div class='del'>-struct gf1_cli_deprobe_rsp {</div><div class='del'>-	int op_ret;</div><div class='del'>-	int op_errno;</div><div class='del'>-	char *hostname;</div><div class='del'>-};</div><div class='del'>-typedef struct gf1_cli_deprobe_rsp gf1_cli_deprobe_rsp;</div><div class='del'>-</div><div class='del'>-struct gf1_cli_peer_list_req {</div><div class='del'>-	int flags;</div><div class='del'>-	struct {</div><div class='del'>-		u_int dict_len;</div><div class='del'>-		char *dict_val;</div><div class='del'>-	} dict;</div><div class='del'>-};</div><div class='del'>-typedef struct gf1_cli_peer_list_req gf1_cli_peer_list_req;</div><div class='del'>-</div><div class='del'>-struct gf1_cli_peer_list_rsp {</div><div class='del'>-	int op_ret;</div><div class='del'>-	int op_errno;</div><div class='del'>-	struct {</div><div class='del'>-		u_int friends_len;</div><div class='del'>-		char *friends_val;</div><div class='del'>-	} friends;</div><div class='del'>-};</div><div class='del'>-typedef struct gf1_cli_peer_list_rsp gf1_cli_peer_list_rsp;</div><div class='del'>-</div><div class='del'>-struct gf1_cli_get_vol_req {</div><div class='del'>-	int flags;</div><div class='del'>-	struct {</div><div class='del'>-		u_int dict_len;</div><div class='del'>-		char *dict_val;</div><div class='del'>-	} dict;</div><div class='del'>-};</div><div class='del'>-typedef struct gf1_cli_get_vol_req gf1_cli_get_vol_req;</div><div class='del'>-</div><div class='del'>-struct gf1_cli_get_vol_rsp {</div><div class='del'>-	int op_ret;</div><div class='del'>-	int op_errno;</div><div class='del'>-	struct {</div><div class='del'>-		u_int volumes_len;</div><div class='del'>-		char *volumes_val;</div><div class='del'>-	} volumes;</div><div class='del'>-};</div><div class='del'>-typedef struct gf1_cli_get_vol_rsp gf1_cli_get_vol_rsp;</div><div class='del'>-</div><div class='del'>-struct gf1_cli_create_vol_req {</div><div class='del'>-	char *volname;</div><div class='del'>-	gf1_cluster_type type;</div><div class='del'>-	int count;</div><div class='del'>-	struct {</div><div class='del'>-		u_int bricks_len;</div><div class='del'>-		char *bricks_val;</div><div class='del'>-	} bricks;</div><div class='del'>-};</div><div class='del'>-typedef struct gf1_cli_create_vol_req gf1_cli_create_vol_req;</div><div class='del'>-</div><div class='del'>-struct gf1_cli_create_vol_rsp {</div><div class='del'>-	int op_ret;</div><div class='del'>-	int op_errno;</div><div class='del'>-	char *volname;</div><div class='del'>-	char *op_errstr;</div><div class='del'>-};</div><div class='del'>-typedef struct gf1_cli_create_vol_rsp gf1_cli_create_vol_rsp;</div><div class='del'>-</div><div class='del'>-struct gf1_cli_delete_vol_req {</div><div class='del'>-	char *volname;</div><div class='del'>-};</div><div class='del'>-typedef struct gf1_cli_delete_vol_req gf1_cli_delete_vol_req;</div><div class='del'>-</div><div class='del'>-struct gf1_cli_delete_vol_rsp {</div><div class='del'>-	int op_ret;</div><div class='del'>-	int op_errno;</div><div class='del'>-	char *volname;</div><div class='del'>-};</div><div class='del'>-typedef struct gf1_cli_delete_vol_rsp gf1_cli_delete_vol_rsp;</div><div class='del'>-</div><div class='del'>-struct gf1_cli_start_vol_req {</div><div class='del'>-	char *volname;</div><div class='del'>-};</div><div class='del'>-typedef struct gf1_cli_start_vol_req gf1_cli_start_vol_req;</div><div class='del'>-</div><div class='del'>-struct gf1_cli_start_vol_rsp {</div><div class='del'>-	int op_ret;</div><div class='del'>-	int op_errno;</div><div class='del'>-	char *volname;</div><div class='del'>-};</div><div class='del'>-typedef struct gf1_cli_start_vol_rsp gf1_cli_start_vol_rsp;</div><div class='del'>-</div><div class='del'>-struct gf1_cli_stop_vol_req {</div><div class='del'>-	char *volname;</div><div class='del'>-	int flags;</div><div class='del'>-};</div><div class='del'>-typedef struct gf1_cli_stop_vol_req gf1_cli_stop_vol_req;</div><div class='del'>-</div><div class='del'>-struct gf1_cli_stop_vol_rsp {</div><div class='del'>-	int op_ret;</div><div class='del'>-	int op_errno;</div><div class='del'>-	char *volname;</div><div class='del'>-};</div><div class='del'>-typedef struct gf1_cli_stop_vol_rsp gf1_cli_stop_vol_rsp;</div><div class='del'>-</div><div class='del'>-struct gf1_cli_rename_vol_req {</div><div class='del'>-	char *old_volname;</div><div class='del'>-	char *new_volname;</div><div class='del'>-};</div><div class='del'>-typedef struct gf1_cli_rename_vol_req gf1_cli_rename_vol_req;</div><div class='del'>-</div><div class='del'>-struct gf1_cli_rename_vol_rsp {</div><div class='del'>-	int op_ret;</div><div class='del'>-	int op_errno;</div><div class='del'>-	char *volname;</div><div class='del'>-};</div><div class='del'>-typedef struct gf1_cli_rename_vol_rsp gf1_cli_rename_vol_rsp;</div><div class='del'>-</div><div class='del'>-struct gf1_cli_defrag_vol_req {</div><div class='del'>-	int cmd;</div><div class='del'>-	char *volname;</div><div class='del'>-};</div><div class='del'>-typedef struct gf1_cli_defrag_vol_req gf1_cli_defrag_vol_req;</div><div class='del'>-</div><div class='del'>-struct gf1_cli_defrag_vol_rsp {</div><div class='del'>-	int op_ret;</div><div class='del'>-	int op_errno;</div><div class='del'>-	char *volname;</div><div class='del'>-	u_quad_t files;</div><div class='del'>-	u_quad_t size;</div><div class='del'>-	u_quad_t lookedup_files;</div><div class='del'>-};</div><div class='del'>-typedef struct gf1_cli_defrag_vol_rsp gf1_cli_defrag_vol_rsp;</div><div class='del'>-</div><div class='del'>-struct gf1_cli_add_brick_req {</div><div class='del'>-	char *volname;</div><div class='del'>-	gf1_cluster_type type;</div><div class='del'>-	int count;</div><div class='del'>-	struct {</div><div class='del'>-		u_int bricks_len;</div><div class='del'>-		char *bricks_val;</div><div class='del'>-	} bricks;</div><div class='del'>-};</div><div class='del'>-typedef struct gf1_cli_add_brick_req gf1_cli_add_brick_req;</div><div class='del'>-</div><div class='del'>-struct gf1_cli_add_brick_rsp {</div><div class='del'>-	int op_ret;</div><div class='del'>-	int op_errno;</div><div class='del'>-	char *volname;</div><div class='del'>-	char *op_errstr;</div><div class='del'>-};</div><div class='del'>-typedef struct gf1_cli_add_brick_rsp gf1_cli_add_brick_rsp;</div><div class='del'>-</div><div class='del'>-struct gf1_cli_remove_brick_req {</div><div class='del'>-	char *volname;</div><div class='del'>-	gf1_cluster_type type;</div><div class='del'>-	int count;</div><div class='del'>-	struct {</div><div class='del'>-		u_int bricks_len;</div><div class='del'>-		char *bricks_val;</div><div class='del'>-	} bricks;</div><div class='del'>-};</div><div class='del'>-typedef struct gf1_cli_remove_brick_req gf1_cli_remove_brick_req;</div><div class='del'>-</div><div class='del'>-struct gf1_cli_remove_brick_rsp {</div><div class='del'>-	int op_ret;</div><div class='del'>-	int op_errno;</div><div class='del'>-	char *volname;</div><div class='del'>-	char *op_errstr;</div><div class='del'>-};</div><div class='del'>-typedef struct gf1_cli_remove_brick_rsp gf1_cli_remove_brick_rsp;</div><div class='del'>-</div><div class='del'>-struct gf1_cli_replace_brick_req {</div><div class='del'>-	char *volname;</div><div class='del'>-	gf1_cli_replace_op op;</div><div class='del'>-	struct {</div><div class='del'>-		u_int bricks_len;</div><div class='del'>-		char *bricks_val;</div><div class='del'>-	} bricks;</div><div class='del'>-};</div><div class='del'>-typedef struct gf1_cli_replace_brick_req gf1_cli_replace_brick_req;</div><div class='del'>-</div><div class='del'>-struct gf1_cli_replace_brick_rsp {</div><div class='del'>-	int op_ret;</div><div class='del'>-	int op_errno;</div><div class='del'>-	char *volname;</div><div class='del'>-	char *status;</div><div class='del'>-};</div><div class='del'>-typedef struct gf1_cli_replace_brick_rsp gf1_cli_replace_brick_rsp;</div><div class='del'>-</div><div class='del'>-struct gf1_cli_set_vol_req {</div><div class='del'>-	char *volname;</div><div class='del'>-	struct {</div><div class='del'>-		u_int dict_len;</div><div class='del'>-		char *dict_val;</div><div class='del'>-	} dict;</div><div class='del'>-};</div><div class='del'>-typedef struct gf1_cli_set_vol_req gf1_cli_set_vol_req;</div><div class='del'>-</div><div class='del'>-struct gf1_cli_set_vol_rsp {</div><div class='del'>-	int op_ret;</div><div class='del'>-	int op_errno;</div><div class='del'>-	char *volname;</div><div class='del'>-};</div><div class='del'>-typedef struct gf1_cli_set_vol_rsp gf1_cli_set_vol_rsp;</div><div class='del'>-</div><div class='del'>-struct gf1_cli_log_filename_req {</div><div class='del'>-	char *volname;</div><div class='del'>-	char *brick;</div><div class='del'>-	char *path;</div><div class='del'>-};</div><div class='del'>-typedef struct gf1_cli_log_filename_req gf1_cli_log_filename_req;</div><div class='del'>-</div><div class='del'>-struct gf1_cli_log_filename_rsp {</div><div class='del'>-	int op_ret;</div><div class='del'>-	int op_errno;</div><div class='del'>-	char *errstr;</div><div class='del'>-};</div><div class='del'>-typedef struct gf1_cli_log_filename_rsp gf1_cli_log_filename_rsp;</div><div class='del'>-</div><div class='del'>-struct gf1_cli_log_locate_req {</div><div class='del'>-	char *volname;</div><div class='del'>-	char *brick;</div><div class='del'>-};</div><div class='del'>-typedef struct gf1_cli_log_locate_req gf1_cli_log_locate_req;</div><div class='del'>-</div><div class='del'>-struct gf1_cli_log_locate_rsp {</div><div class='del'>-	int op_ret;</div><div class='del'>-	int op_errno;</div><div class='del'>-	char *path;</div><div class='del'>-};</div><div class='del'>-typedef struct gf1_cli_log_locate_rsp gf1_cli_log_locate_rsp;</div><div class='del'>-</div><div class='del'>-struct gf1_cli_log_rotate_req {</div><div class='del'>-	char *volname;</div><div class='del'>-	char *brick;</div><div class='del'>-};</div><div class='del'>-typedef struct gf1_cli_log_rotate_req gf1_cli_log_rotate_req;</div><div class='del'>-</div><div class='del'>-struct gf1_cli_log_rotate_rsp {</div><div class='del'>-	int op_ret;</div><div class='del'>-	int op_errno;</div><div class='del'>-	char *errstr;</div><div class='del'>-};</div><div class='del'>-typedef struct gf1_cli_log_rotate_rsp gf1_cli_log_rotate_rsp;</div><div class='del'>-</div><div class='del'>-/* the xdr functions */</div><div class='del'>-</div><div class='del'>-#if defined(__STDC__) || defined(__cplusplus)</div><div class='del'>-extern  bool_t xdr_gf1_cluster_type (XDR *, gf1_cluster_type*);</div><div class='del'>-extern  bool_t xdr_gf1_cli_replace_op (XDR *, gf1_cli_replace_op*);</div><div class='del'>-extern  bool_t xdr_gf1_cli_friends_list (XDR *, gf1_cli_friends_list*);</div><div class='del'>-extern  bool_t xdr_gf1_cli_get_volume (XDR *, gf1_cli_get_volume*);</div><div class='del'>-extern  bool_t xdr_gf1_cli_op_flags (XDR *, gf1_cli_op_flags*);</div><div class='del'>-extern  bool_t xdr_gf1_cli_probe_req (XDR *, gf1_cli_probe_req*);</div><div class='del'>-extern  bool_t xdr_gf1_cli_probe_rsp (XDR *, gf1_cli_probe_rsp*);</div><div class='del'>-extern  bool_t xdr_gf1_cli_deprobe_req (XDR *, gf1_cli_deprobe_req*);</div><div class='del'>-extern  bool_t xdr_gf1_cli_deprobe_rsp (XDR *, gf1_cli_deprobe_rsp*);</div><div class='del'>-extern  bool_t xdr_gf1_cli_peer_list_req (XDR *, gf1_cli_peer_list_req*);</div><div class='del'>-extern  bool_t xdr_gf1_cli_peer_list_rsp (XDR *, gf1_cli_peer_list_rsp*);</div><div class='del'>-extern  bool_t xdr_gf1_cli_get_vol_req (XDR *, gf1_cli_get_vol_req*);</div><div class='del'>-extern  bool_t xdr_gf1_cli_get_vol_rsp (XDR *, gf1_cli_get_vol_rsp*);</div><div class='del'>-extern  bool_t xdr_gf1_cli_create_vol_req (XDR *, gf1_cli_create_vol_req*);</div><div class='del'>-extern  bool_t xdr_gf1_cli_create_vol_rsp (XDR *, gf1_cli_create_vol_rsp*);</div><div class='del'>-extern  bool_t xdr_gf1_cli_delete_vol_req (XDR *, gf1_cli_delete_vol_req*);</div><div class='del'>-extern  bool_t xdr_gf1_cli_delete_vol_rsp (XDR *, gf1_cli_delete_vol_rsp*);</div><div class='del'>-extern  bool_t xdr_gf1_cli_start_vol_req (XDR *, gf1_cli_start_vol_req*);</div><div class='del'>-extern  bool_t xdr_gf1_cli_start_vol_rsp (XDR *, gf1_cli_start_vol_rsp*);</div><div class='del'>-extern  bool_t xdr_gf1_cli_stop_vol_req (XDR *, gf1_cli_stop_vol_req*);</div><div class='del'>-extern  bool_t xdr_gf1_cli_stop_vol_rsp (XDR *, gf1_cli_stop_vol_rsp*);</div><div class='del'>-extern  bool_t xdr_gf1_cli_rename_vol_req (XDR *, gf1_cli_rename_vol_req*);</div><div class='del'>-extern  bool_t xdr_gf1_cli_rename_vol_rsp (XDR *, gf1_cli_rename_vol_rsp*);</div><div class='del'>-extern  bool_t xdr_gf1_cli_defrag_vol_req (XDR *, gf1_cli_defrag_vol_req*);</div><div class='del'>-extern  bool_t xdr_gf1_cli_defrag_vol_rsp (XDR *, gf1_cli_defrag_vol_rsp*);</div><div class='del'>-extern  bool_t xdr_gf1_cli_add_brick_req (XDR *, gf1_cli_add_brick_req*);</div><div class='del'>-extern  bool_t xdr_gf1_cli_add_brick_rsp (XDR *, gf1_cli_add_brick_rsp*);</div><div class='del'>-extern  bool_t xdr_gf1_cli_remove_brick_req (XDR *, gf1_cli_remove_brick_req*);</div><div class='del'>-extern  bool_t xdr_gf1_cli_remove_brick_rsp (XDR *, gf1_cli_remove_brick_rsp*);</div><div class='del'>-extern  bool_t xdr_gf1_cli_replace_brick_req (XDR *, gf1_cli_replace_brick_req*);</div><div class='del'>-extern  bool_t xdr_gf1_cli_replace_brick_rsp (XDR *, gf1_cli_replace_brick_rsp*);</div><div class='del'>-extern  bool_t xdr_gf1_cli_set_vol_req (XDR *, gf1_cli_set_vol_req*);</div><div class='del'>-extern  bool_t xdr_gf1_cli_set_vol_rsp (XDR *, gf1_cli_set_vol_rsp*);</div><div class='del'>-extern  bool_t xdr_gf1_cli_log_filename_req (XDR *, gf1_cli_log_filename_req*);</div><div class='del'>-extern  bool_t xdr_gf1_cli_log_filename_rsp (XDR *, gf1_cli_log_filename_rsp*);</div><div class='del'>-extern  bool_t xdr_gf1_cli_log_locate_req (XDR *, gf1_cli_log_locate_req*);</div><div class='del'>-extern  bool_t xdr_gf1_cli_log_locate_rsp (XDR *, gf1_cli_log_locate_rsp*);</div><div class='del'>-extern  bool_t xdr_gf1_cli_log_rotate_req (XDR *, gf1_cli_log_rotate_req*);</div><div class='del'>-extern  bool_t xdr_gf1_cli_log_rotate_rsp (XDR *, gf1_cli_log_rotate_rsp*);</div><div class='del'>-</div><div class='del'>-#else /* K&amp;R C */</div><div class='del'>-extern bool_t xdr_gf1_cluster_type ();</div><div class='del'>-extern bool_t xdr_gf1_cli_replace_op ();</div><div class='del'>-extern bool_t xdr_gf1_cli_friends_list ();</div><div class='del'>-extern bool_t xdr_gf1_cli_get_volume ();</div><div class='del'>-extern bool_t xdr_gf1_cli_op_flags ();</div><div class='del'>-extern bool_t xdr_gf1_cli_probe_req ();</div><div class='del'>-extern bool_t xdr_gf1_cli_probe_rsp ();</div><div class='del'>-extern bool_t xdr_gf1_cli_deprobe_req ();</div><div class='del'>-extern bool_t xdr_gf1_cli_deprobe_rsp ();</div><div class='del'>-extern bool_t xdr_gf1_cli_peer_list_req ();</div><div class='del'>-extern bool_t xdr_gf1_cli_peer_list_rsp ();</div><div class='del'>-extern bool_t xdr_gf1_cli_get_vol_req ();</div><div class='del'>-extern bool_t xdr_gf1_cli_get_vol_rsp ();</div><div class='del'>-extern bool_t xdr_gf1_cli_create_vol_req ();</div><div class='del'>-extern bool_t xdr_gf1_cli_create_vol_rsp ();</div><div class='del'>-extern bool_t xdr_gf1_cli_delete_vol_req ();</div><div class='del'>-extern bool_t xdr_gf1_cli_delete_vol_rsp ();</div><div class='del'>-extern bool_t xdr_gf1_cli_start_vol_req ();</div><div class='del'>-extern bool_t xdr_gf1_cli_start_vol_rsp ();</div><div class='del'>-extern bool_t xdr_gf1_cli_stop_vol_req ();</div><div class='del'>-extern bool_t xdr_gf1_cli_stop_vol_rsp ();</div><div class='del'>-extern bool_t xdr_gf1_cli_rename_vol_req ();</div><div class='del'>-extern bool_t xdr_gf1_cli_rename_vol_rsp ();</div><div class='del'>-extern bool_t xdr_gf1_cli_defrag_vol_req ();</div><div class='del'>-extern bool_t xdr_gf1_cli_defrag_vol_rsp ();</div><div class='del'>-extern bool_t xdr_gf1_cli_add_brick_req ();</div><div class='del'>-extern bool_t xdr_gf1_cli_add_brick_rsp ();</div><div class='del'>-extern bool_t xdr_gf1_cli_remove_brick_req ();</div><div class='del'>-extern bool_t xdr_gf1_cli_remove_brick_rsp ();</div><div class='del'>-extern bool_t xdr_gf1_cli_replace_brick_req ();</div><div class='del'>-extern bool_t xdr_gf1_cli_replace_brick_rsp ();</div><div class='del'>-extern bool_t xdr_gf1_cli_set_vol_req ();</div><div class='del'>-extern bool_t xdr_gf1_cli_set_vol_rsp ();</div><div class='del'>-extern bool_t xdr_gf1_cli_log_filename_req ();</div><div class='del'>-extern bool_t xdr_gf1_cli_log_filename_rsp ();</div><div class='del'>-extern bool_t xdr_gf1_cli_log_locate_req ();</div><div class='del'>-extern bool_t xdr_gf1_cli_log_locate_rsp ();</div><div class='del'>-extern bool_t xdr_gf1_cli_log_rotate_req ();</div><div class='del'>-extern bool_t xdr_gf1_cli_log_rotate_rsp ();</div><div class='del'>-</div><div class='del'>-#endif /* K&amp;R C */</div><div class='del'>-</div><div class='del'>-#ifdef __cplusplus</div><div class='del'>-}</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-#endif /* !_CLI1_H_RPCGEN */</div><div class='head'>diff --git a/rpc/xdr/src/cli1-xdr.x b/rpc/xdr/src/cli1-xdr.x<br/>new file mode 100644<br/>index 00000000000..777cb0046a2<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/rpc/xdr/src/cli1-xdr.x?id=d1d7a6f35c816822fab51c820e25023863c239c1'>rpc/xdr/src/cli1-xdr.x</a></div><div class='hunk'>@@ -0,0 +1,306 @@</div><div class='add'>+/*</div><div class='add'>+ * Copyright (c) 2012 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+ * This file is part of GlusterFS.</div><div class='add'>+ *</div><div class='add'>+ * This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+ * General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+ * later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+ * cases as published by the Free Software Foundation.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+#ifdef RPC_XDR</div><div class='add'>+%#include "rpc-pragmas.h"</div><div class='add'>+#endif</div><div class='add'>+%#include &lt;glusterfs/compat.h&gt;</div><div class='add'>+</div><div class='add'>+ enum gf_cli_defrag_type {</div><div class='add'>+	GF_DEFRAG_CMD_NONE = 0,</div><div class='add'>+        GF_DEFRAG_CMD_START,</div><div class='add'>+        GF_DEFRAG_CMD_STOP,</div><div class='add'>+        GF_DEFRAG_CMD_STATUS,</div><div class='add'>+        GF_DEFRAG_CMD_START_LAYOUT_FIX,</div><div class='add'>+        GF_DEFRAG_CMD_START_FORCE, /* used by remove-brick data migration */</div><div class='add'>+        GF_DEFRAG_CMD_START_TIER,</div><div class='add'>+        GF_DEFRAG_CMD_STATUS_TIER,</div><div class='add'>+        GF_DEFRAG_CMD_START_DETACH_TIER,</div><div class='add'>+        GF_DEFRAG_CMD_STOP_DETACH_TIER,</div><div class='add'>+        GF_DEFRAG_CMD_PAUSE_TIER,</div><div class='add'>+        GF_DEFRAG_CMD_RESUME_TIER,</div><div class='add'>+        GF_DEFRAG_CMD_DETACH_STATUS,</div><div class='add'>+        GF_DEFRAG_CMD_STOP_TIER,</div><div class='add'>+        GF_DEFRAG_CMD_DETACH_START,</div><div class='add'>+        GF_DEFRAG_CMD_DETACH_COMMIT,</div><div class='add'>+        GF_DEFRAG_CMD_DETACH_COMMIT_FORCE,</div><div class='add'>+        GF_DEFRAG_CMD_DETACH_STOP,</div><div class='add'>+        GF_DEFRAG_CMD_TYPE_MAX</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+ enum gf_defrag_status_t {</div><div class='add'>+        GF_DEFRAG_STATUS_NOT_STARTED,</div><div class='add'>+        GF_DEFRAG_STATUS_STARTED,</div><div class='add'>+        GF_DEFRAG_STATUS_STOPPED,</div><div class='add'>+        GF_DEFRAG_STATUS_COMPLETE,</div><div class='add'>+        GF_DEFRAG_STATUS_FAILED,</div><div class='add'>+        GF_DEFRAG_STATUS_LAYOUT_FIX_STARTED,</div><div class='add'>+        GF_DEFRAG_STATUS_LAYOUT_FIX_STOPPED,</div><div class='add'>+        GF_DEFRAG_STATUS_LAYOUT_FIX_COMPLETE,</div><div class='add'>+        GF_DEFRAG_STATUS_LAYOUT_FIX_FAILED,</div><div class='add'>+        GF_DEFRAG_STATUS_MAX</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+enum gf1_cluster_type {</div><div class='add'>+        GF_CLUSTER_TYPE_NONE = 0,</div><div class='add'>+        GF_CLUSTER_TYPE_STRIPE,</div><div class='add'>+        GF_CLUSTER_TYPE_REPLICATE,</div><div class='add'>+        GF_CLUSTER_TYPE_STRIPE_REPLICATE,</div><div class='add'>+        GF_CLUSTER_TYPE_DISPERSE,</div><div class='add'>+        GF_CLUSTER_TYPE_TIER,</div><div class='add'>+        GF_CLUSTER_TYPE_MAX</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+enum gf_bitrot_type {</div><div class='add'>+        GF_BITROT_OPTION_TYPE_NONE = 0,</div><div class='add'>+        GF_BITROT_OPTION_TYPE_ENABLE,</div><div class='add'>+        GF_BITROT_OPTION_TYPE_DISABLE,</div><div class='add'>+        GF_BITROT_OPTION_TYPE_SCRUB_THROTTLE,</div><div class='add'>+        GF_BITROT_OPTION_TYPE_SCRUB_FREQ,</div><div class='add'>+        GF_BITROT_OPTION_TYPE_SCRUB,</div><div class='add'>+        GF_BITROT_OPTION_TYPE_EXPIRY_TIME,</div><div class='add'>+        GF_BITROT_CMD_SCRUB_STATUS,</div><div class='add'>+        GF_BITROT_CMD_SCRUB_ONDEMAND,</div><div class='add'>+        GF_BITROT_OPTION_TYPE_SIGNER_THREADS,</div><div class='add'>+        GF_BITROT_OPTION_TYPE_MAX</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+ enum gf1_op_commands {</div><div class='add'>+        GF_OP_CMD_NONE = 0,</div><div class='add'>+        GF_OP_CMD_START,</div><div class='add'>+        GF_OP_CMD_COMMIT,</div><div class='add'>+        GF_OP_CMD_STOP,</div><div class='add'>+        GF_OP_CMD_STATUS,</div><div class='add'>+        GF_OP_CMD_COMMIT_FORCE,</div><div class='add'>+        GF_OP_CMD_DETACH_START,</div><div class='add'>+        GF_OP_CMD_DETACH_COMMIT,</div><div class='add'>+        GF_OP_CMD_DETACH_COMMIT_FORCE,</div><div class='add'>+        GF_OP_CMD_STOP_DETACH_TIER</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+enum gf_quota_type {</div><div class='add'>+        GF_QUOTA_OPTION_TYPE_NONE = 0,</div><div class='add'>+        GF_QUOTA_OPTION_TYPE_ENABLE,</div><div class='add'>+        GF_QUOTA_OPTION_TYPE_DISABLE,</div><div class='add'>+        GF_QUOTA_OPTION_TYPE_LIMIT_USAGE,</div><div class='add'>+        GF_QUOTA_OPTION_TYPE_REMOVE,</div><div class='add'>+        GF_QUOTA_OPTION_TYPE_LIST,</div><div class='add'>+        GF_QUOTA_OPTION_TYPE_VERSION,</div><div class='add'>+        GF_QUOTA_OPTION_TYPE_ALERT_TIME,</div><div class='add'>+        GF_QUOTA_OPTION_TYPE_SOFT_TIMEOUT,</div><div class='add'>+        GF_QUOTA_OPTION_TYPE_HARD_TIMEOUT,</div><div class='add'>+        GF_QUOTA_OPTION_TYPE_DEFAULT_SOFT_LIMIT,</div><div class='add'>+        GF_QUOTA_OPTION_TYPE_VERSION_OBJECTS,</div><div class='add'>+        GF_QUOTA_OPTION_TYPE_LIMIT_OBJECTS,</div><div class='add'>+        GF_QUOTA_OPTION_TYPE_LIST_OBJECTS,</div><div class='add'>+        GF_QUOTA_OPTION_TYPE_REMOVE_OBJECTS,</div><div class='add'>+        GF_QUOTA_OPTION_TYPE_ENABLE_OBJECTS,</div><div class='add'>+        GF_QUOTA_OPTION_TYPE_UPGRADE,</div><div class='add'>+        GF_QUOTA_OPTION_TYPE_MAX</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+enum gf1_cli_friends_list {</div><div class='add'>+        GF_CLI_LIST_PEERS = 1,</div><div class='add'>+        GF_CLI_LIST_POOL_NODES = 2</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+enum gf1_cli_get_volume {</div><div class='add'>+        GF_CLI_GET_VOLUME_ALL = 1,</div><div class='add'>+        GF_CLI_GET_VOLUME,</div><div class='add'>+        GF_CLI_GET_NEXT_VOLUME</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+enum gf1_cli_sync_volume {</div><div class='add'>+        GF_CLI_SYNC_ALL = 1</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+enum gf1_cli_op_flags {</div><div class='add'>+        GF_CLI_FLAG_OP_FORCE = 1</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+enum gf1_cli_gsync_set {</div><div class='add'>+        GF_GSYNC_OPTION_TYPE_NONE,</div><div class='add'>+        GF_GSYNC_OPTION_TYPE_START,</div><div class='add'>+        GF_GSYNC_OPTION_TYPE_STOP,</div><div class='add'>+        GF_GSYNC_OPTION_TYPE_CONFIG,</div><div class='add'>+        GF_GSYNC_OPTION_TYPE_STATUS,</div><div class='add'>+        GF_GSYNC_OPTION_TYPE_ROTATE,</div><div class='add'>+        GF_GSYNC_OPTION_TYPE_CREATE,</div><div class='add'>+        GF_GSYNC_OPTION_TYPE_DELETE,</div><div class='add'>+        GF_GSYNC_OPTION_TYPE_PAUSE,</div><div class='add'>+        GF_GSYNC_OPTION_TYPE_RESUME</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+enum gf1_cli_stats_op {</div><div class='add'>+        GF_CLI_STATS_NONE  = 0,</div><div class='add'>+        GF_CLI_STATS_START = 1,</div><div class='add'>+        GF_CLI_STATS_STOP  = 2,</div><div class='add'>+        GF_CLI_STATS_INFO  = 3,</div><div class='add'>+        GF_CLI_STATS_TOP = 4</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+enum gf1_cli_info_op {</div><div class='add'>+        GF_CLI_INFO_NONE = 0,</div><div class='add'>+        GF_CLI_INFO_ALL = 1,</div><div class='add'>+        GF_CLI_INFO_INCREMENTAL = 2,</div><div class='add'>+        GF_CLI_INFO_CUMULATIVE = 3,</div><div class='add'>+        GF_CLI_INFO_CLEAR = 4</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+enum gf_cli_get_state_op {</div><div class='add'>+        GF_CLI_GET_STATE_DETAIL = 1,</div><div class='add'>+        GF_CLI_GET_STATE_VOLOPTS = 2</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+enum gf1_cli_top_op {</div><div class='add'>+        GF_CLI_TOP_NONE = 0,</div><div class='add'>+        GF_CLI_TOP_OPEN,</div><div class='add'>+        GF_CLI_TOP_READ,</div><div class='add'>+        GF_CLI_TOP_WRITE,</div><div class='add'>+        GF_CLI_TOP_OPENDIR,</div><div class='add'>+        GF_CLI_TOP_READDIR,</div><div class='add'>+        GF_CLI_TOP_READ_PERF,</div><div class='add'>+        GF_CLI_TOP_WRITE_PERF</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+/* The unconventional hex numbers help us perform</div><div class='add'>+   bit-wise operations which reduces complexity */</div><div class='add'>+enum gf_cli_status_type {</div><div class='add'>+        GF_CLI_STATUS_NONE         = 0x000000,</div><div class='add'>+        GF_CLI_STATUS_MEM          = 0x000001,    /*000000000000001*/</div><div class='add'>+        GF_CLI_STATUS_CLIENTS      = 0x000002,    /*000000000000010*/</div><div class='add'>+        GF_CLI_STATUS_INODE        = 0x000004,    /*000000000000100*/</div><div class='add'>+        GF_CLI_STATUS_FD           = 0x000008,    /*000000000001000*/</div><div class='add'>+        GF_CLI_STATUS_CALLPOOL     = 0x000010,    /*000000000010000*/</div><div class='add'>+        GF_CLI_STATUS_DETAIL       = 0x000020,    /*000000000100000*/</div><div class='add'>+        GF_CLI_STATUS_TASKS        = 0x000040,    /*00000001000000*/</div><div class='add'>+        GF_CLI_STATUS_CLIENT_LIST  = 0x000080,    /*00000010000000*/</div><div class='add'>+        GF_CLI_STATUS_MASK         = 0x0000FF,    /*000000011111111 Used to get the op*/</div><div class='add'>+        GF_CLI_STATUS_VOL          = 0x000100,    /*00000000100000000*/</div><div class='add'>+        GF_CLI_STATUS_ALL          = 0x000200,    /*00000001000000000*/</div><div class='add'>+        GF_CLI_STATUS_BRICK        = 0x000400,    /*00000010000000000*/</div><div class='add'>+        GF_CLI_STATUS_NFS          = 0x000800,    /*00000100000000000*/</div><div class='add'>+        GF_CLI_STATUS_SHD          = 0x001000,    /*00001000000000000*/</div><div class='add'>+        GF_CLI_STATUS_QUOTAD       = 0x002000,    /*00010000000000000*/</div><div class='add'>+        GF_CLI_STATUS_SNAPD        = 0x004000,    /*00100000000000000*/</div><div class='add'>+        GF_CLI_STATUS_BITD         = 0x008000,    /*01000000000000000*/</div><div class='add'>+        GF_CLI_STATUS_SCRUB        = 0x010000,    /*10000000000000000*/</div><div class='add'>+        GF_CLI_STATUS_TIERD        = 0x020000     /*100000000000000000*/</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+/* Identifiers for snapshot clis */</div><div class='add'>+enum gf1_cli_snapshot {</div><div class='add'>+        GF_SNAP_OPTION_TYPE_NONE = 0,</div><div class='add'>+        GF_SNAP_OPTION_TYPE_CREATE,</div><div class='add'>+        GF_SNAP_OPTION_TYPE_DELETE,</div><div class='add'>+        GF_SNAP_OPTION_TYPE_RESTORE,</div><div class='add'>+        GF_SNAP_OPTION_TYPE_ACTIVATE,</div><div class='add'>+        GF_SNAP_OPTION_TYPE_DEACTIVATE,</div><div class='add'>+        GF_SNAP_OPTION_TYPE_LIST,</div><div class='add'>+        GF_SNAP_OPTION_TYPE_STATUS,</div><div class='add'>+        GF_SNAP_OPTION_TYPE_CONFIG,</div><div class='add'>+        GF_SNAP_OPTION_TYPE_CLONE,</div><div class='add'>+        GF_SNAP_OPTION_TYPE_INFO</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+enum gf1_cli_snapshot_info {</div><div class='add'>+        GF_SNAP_INFO_TYPE_ALL = 0,</div><div class='add'>+        GF_SNAP_INFO_TYPE_SNAP,</div><div class='add'>+        GF_SNAP_INFO_TYPE_VOL</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+enum gf1_cli_snapshot_config {</div><div class='add'>+        GF_SNAP_CONFIG_TYPE_NONE = 0,</div><div class='add'>+        GF_SNAP_CONFIG_TYPE_SET,</div><div class='add'>+        GF_SNAP_CONFIG_DISPLAY</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+enum  gf1_cli_snapshot_status {</div><div class='add'>+        GF_SNAP_STATUS_TYPE_ALL = 0,</div><div class='add'>+        GF_SNAP_STATUS_TYPE_SNAP,</div><div class='add'>+        GF_SNAP_STATUS_TYPE_VOL,</div><div class='add'>+        GF_SNAP_STATUS_TYPE_ITER</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+/* Changing order of GF_SNAP_DELETE_TYPE_VOL           *</div><div class='add'>+ * and GF_SNAP_DELETE_TYPE_SNAP so that they don't     *</div><div class='add'>+ * overlap with the enums of GF_SNAP_STATUS_TYPE_SNAP, *</div><div class='add'>+ * and GF_SNAP_STATUS_TYPE_VOL                         *</div><div class='add'>+ */</div><div class='add'>+enum gf1_cli_snapshot_delete {</div><div class='add'>+        GF_SNAP_DELETE_TYPE_ALL  = 0,</div><div class='add'>+        GF_SNAP_DELETE_TYPE_VOL  = 1,</div><div class='add'>+        GF_SNAP_DELETE_TYPE_SNAP = 2,</div><div class='add'>+        GF_SNAP_DELETE_TYPE_ITER = 3</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct gf_cli_req {</div><div class='add'>+        opaque  dict&lt;&gt;;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+ struct gf_cli_rsp {</div><div class='add'>+        int     op_ret;</div><div class='add'>+        int     op_errno;</div><div class='add'>+        string  op_errstr&lt;&gt;;</div><div class='add'>+        opaque  dict&lt;&gt;;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct gf1_cli_peer_list_req {</div><div class='add'>+        int     flags;</div><div class='add'>+        opaque  dict&lt;&gt;;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct gf1_cli_peer_list_rsp {</div><div class='add'>+        int     op_ret;</div><div class='add'>+        int     op_errno;</div><div class='add'>+        opaque  friends&lt;&gt;;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct gf1_cli_fsm_log_req {</div><div class='add'>+        string name&lt;&gt;;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct gf1_cli_fsm_log_rsp {</div><div class='add'>+        int op_ret;</div><div class='add'>+        int op_errno;</div><div class='add'>+        string op_errstr&lt;&gt;;</div><div class='add'>+        opaque fsm_log&lt;&gt;;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct gf1_cli_getwd_req {</div><div class='add'>+        int     unused;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct gf1_cli_getwd_rsp {</div><div class='add'>+        int     op_ret;</div><div class='add'>+        int     op_errno;</div><div class='add'>+        string  wd&lt;&gt;;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct gf1_cli_mount_req {</div><div class='add'>+        string label&lt;&gt;;</div><div class='add'>+        opaque dict&lt;&gt;;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct gf1_cli_mount_rsp {</div><div class='add'>+       int op_ret;</div><div class='add'>+       int op_errno;</div><div class='add'>+       string path&lt;&gt;;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct gf1_cli_umount_req {</div><div class='add'>+        int lazy;</div><div class='add'>+        string path&lt;&gt;;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct gf1_cli_umount_rsp {</div><div class='add'>+       int op_ret;</div><div class='add'>+       int op_errno;</div><div class='add'>+};</div><div class='head'>diff --git a/rpc/xdr/src/cli1.c b/rpc/xdr/src/cli1.c<br/>deleted file mode 100644<br/>index d7ba91aea89..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/rpc/xdr/src/cli1.c?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>rpc/xdr/src/cli1.c</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,525 +0,0 @@</div><div class='del'>-/*</div><div class='del'>-  Copyright (c) 2007-2010 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='del'>-  This file is part of GlusterFS.</div><div class='del'>-</div><div class='del'>-  GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-  it under the terms of the GNU Affero General Public License as published</div><div class='del'>-  by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-  or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-  GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-  WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-  Affero General Public License for more details.</div><div class='del'>-</div><div class='del'>-  You should have received a copy of the GNU Affero General Public License</div><div class='del'>-  along with this program.  If not, see</div><div class='del'>-  &lt;http://www.gnu.org/licenses/&gt;.</div><div class='del'>-*/</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-#include "cli1.h"</div><div class='del'>-#include "xdr-generic.h"</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-gf_xdr_serialize_cli_probe_rsp (struct iovec outmsg, void *rsp)</div><div class='del'>-{</div><div class='del'>-        return xdr_serialize_generic (outmsg, (void *)rsp,</div><div class='del'>-                                      (xdrproc_t)xdr_gf1_cli_probe_rsp);</div><div class='del'>-</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-gf_xdr_to_cli_probe_req (struct iovec inmsg, void *args)</div><div class='del'>-{</div><div class='del'>-        return xdr_to_generic (inmsg, (void *)args,</div><div class='del'>-                               (xdrproc_t)xdr_gf1_cli_probe_req);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-gf_xdr_to_cli_probe_rsp (struct iovec inmsg, void *args)</div><div class='del'>-{</div><div class='del'>-        return xdr_to_generic (inmsg, (void *)args,</div><div class='del'>-                               (xdrproc_t)xdr_gf1_cli_probe_rsp);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-gf_xdr_from_cli_probe_req (struct iovec outmsg, void *req)</div><div class='del'>-{</div><div class='del'>-        return xdr_serialize_generic (outmsg, (void *)req,</div><div class='del'>-                                      (xdrproc_t)xdr_gf1_cli_probe_req);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-gf_xdr_serialize_cli_deprobe_rsp (struct iovec outmsg, void *rsp)</div><div class='del'>-{</div><div class='del'>-        return xdr_serialize_generic (outmsg, (void *)rsp,</div><div class='del'>-                                      (xdrproc_t)xdr_gf1_cli_deprobe_rsp);</div><div class='del'>-</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-gf_xdr_to_cli_deprobe_req (struct iovec inmsg, void *args)</div><div class='del'>-{</div><div class='del'>-        return xdr_to_generic (inmsg, (void *)args,</div><div class='del'>-                               (xdrproc_t)xdr_gf1_cli_deprobe_req);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-gf_xdr_to_cli_deprobe_rsp (struct iovec inmsg, void *args)</div><div class='del'>-{</div><div class='del'>-        return xdr_to_generic (inmsg, (void *)args,</div><div class='del'>-                               (xdrproc_t)xdr_gf1_cli_deprobe_rsp);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-gf_xdr_from_cli_deprobe_req (struct iovec outmsg, void *req)</div><div class='del'>-{</div><div class='del'>-        return xdr_serialize_generic (outmsg, (void *)req,</div><div class='del'>-                                      (xdrproc_t)xdr_gf1_cli_deprobe_req);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-gf_xdr_serialize_cli_peer_list_rsp (struct iovec outmsg, void *rsp)</div><div class='del'>-{</div><div class='del'>-        return xdr_serialize_generic (outmsg, (void *)rsp,</div><div class='del'>-                                      (xdrproc_t)xdr_gf1_cli_peer_list_rsp);</div><div class='del'>-</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-gf_xdr_to_cli_peer_list_req (struct iovec inmsg, void *args)</div><div class='del'>-{</div><div class='del'>-        return xdr_to_generic (inmsg, (void *)args,</div><div class='del'>-                               (xdrproc_t)xdr_gf1_cli_peer_list_req);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-gf_xdr_to_cli_peer_list_rsp (struct iovec inmsg, void *args)</div><div class='del'>-{</div><div class='del'>-        return xdr_to_generic (inmsg, (void *)args,</div><div class='del'>-                               (xdrproc_t)xdr_gf1_cli_peer_list_rsp);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-gf_xdr_from_cli_peer_list_req (struct iovec outmsg, void *req)</div><div class='del'>-{</div><div class='del'>-        return xdr_serialize_generic (outmsg, (void *)req,</div><div class='del'>-                                      (xdrproc_t)xdr_gf1_cli_peer_list_req);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-gf_xdr_serialize_cli_get_vol_rsp (struct iovec outmsg, void *rsp)</div><div class='del'>-{</div><div class='del'>-        return xdr_serialize_generic (outmsg, (void *)rsp,</div><div class='del'>-                                      (xdrproc_t)xdr_gf1_cli_get_vol_rsp);</div><div class='del'>-</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-gf_xdr_to_cli_get_vol_req (struct iovec inmsg, void *args)</div><div class='del'>-{</div><div class='del'>-        return xdr_to_generic (inmsg, (void *)args,</div><div class='del'>-                               (xdrproc_t)xdr_gf1_cli_get_vol_req);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-gf_xdr_to_cli_get_vol_rsp (struct iovec inmsg, void *args)</div><div class='del'>-{</div><div class='del'>-        return xdr_to_generic (inmsg, (void *)args,</div><div class='del'>-                               (xdrproc_t)xdr_gf1_cli_get_vol_rsp);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-gf_xdr_from_cli_get_vol_req (struct iovec outmsg, void *req)</div><div class='del'>-{</div><div class='del'>-        return xdr_serialize_generic (outmsg, (void *)req,</div><div class='del'>-                                      (xdrproc_t)xdr_gf1_cli_get_vol_req);</div><div class='del'>-}</div><div class='del'>-ssize_t</div><div class='del'>-gf_xdr_serialize_cli_create_vol_rsp (struct iovec outmsg, void *rsp)</div><div class='del'>-{</div><div class='del'>-        return xdr_serialize_generic (outmsg, (void *)rsp,</div><div class='del'>-                                      (xdrproc_t)xdr_gf1_cli_create_vol_rsp);</div><div class='del'>-</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-gf_xdr_to_cli_create_vol_req (struct iovec inmsg, void *args)</div><div class='del'>-{</div><div class='del'>-        return xdr_to_generic (inmsg, (void *)args,</div><div class='del'>-                               (xdrproc_t)xdr_gf1_cli_create_vol_req);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-gf_xdr_to_cli_create_vol_rsp (struct iovec inmsg, void *args)</div><div class='del'>-{</div><div class='del'>-        return xdr_to_generic (inmsg, (void *)args,</div><div class='del'>-                               (xdrproc_t)xdr_gf1_cli_create_vol_rsp);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-gf_xdr_from_cli_create_vol_req (struct iovec outmsg, void *req)</div><div class='del'>-{</div><div class='del'>-        return xdr_serialize_generic (outmsg, (void *)req,</div><div class='del'>-                                      (xdrproc_t)xdr_gf1_cli_create_vol_req);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-gf_xdr_serialize_cli_delete_vol_rsp (struct iovec outmsg, void *rsp)</div><div class='del'>-{</div><div class='del'>-        return xdr_serialize_generic (outmsg, (void *)rsp,</div><div class='del'>-                                      (xdrproc_t)xdr_gf1_cli_delete_vol_rsp);</div><div class='del'>-</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-gf_xdr_to_cli_delete_vol_req (struct iovec inmsg, void *args)</div><div class='del'>-{</div><div class='del'>-        return xdr_to_generic (inmsg, (void *)args,</div><div class='del'>-                               (xdrproc_t)xdr_gf1_cli_delete_vol_req);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-gf_xdr_to_cli_delete_vol_rsp (struct iovec inmsg, void *args)</div><div class='del'>-{</div><div class='del'>-        return xdr_to_generic (inmsg, (void *)args,</div><div class='del'>-                               (xdrproc_t)xdr_gf1_cli_delete_vol_rsp);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-gf_xdr_from_cli_delete_vol_req (struct iovec outmsg, void *req)</div><div class='del'>-{</div><div class='del'>-        return xdr_serialize_generic (outmsg, (void *)req,</div><div class='del'>-                                      (xdrproc_t)xdr_gf1_cli_delete_vol_req);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-gf_xdr_serialize_cli_start_vol_rsp (struct iovec outmsg, void *rsp)</div><div class='del'>-{</div><div class='del'>-        return xdr_serialize_generic (outmsg, (void *)rsp,</div><div class='del'>-                                      (xdrproc_t)xdr_gf1_cli_start_vol_rsp);</div><div class='del'>-</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-gf_xdr_to_cli_start_vol_req (struct iovec inmsg, void *args)</div><div class='del'>-{</div><div class='del'>-        return xdr_to_generic (inmsg, (void *)args,</div><div class='del'>-                               (xdrproc_t)xdr_gf1_cli_start_vol_req);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-gf_xdr_to_cli_start_vol_rsp (struct iovec inmsg, void *args)</div><div class='del'>-{</div><div class='del'>-        return xdr_to_generic (inmsg, (void *)args,</div><div class='del'>-                               (xdrproc_t)xdr_gf1_cli_start_vol_rsp);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-gf_xdr_from_cli_start_vol_req (struct iovec outmsg, void *req)</div><div class='del'>-{</div><div class='del'>-        return xdr_serialize_generic (outmsg, (void *)req,</div><div class='del'>-                                      (xdrproc_t)xdr_gf1_cli_start_vol_req);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-gf_xdr_serialize_cli_stop_vol_rsp (struct iovec outmsg, void *rsp)</div><div class='del'>-{</div><div class='del'>-        return xdr_serialize_generic (outmsg, (void *)rsp,</div><div class='del'>-                                      (xdrproc_t)xdr_gf1_cli_stop_vol_rsp);</div><div class='del'>-</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-gf_xdr_to_cli_stop_vol_req (struct iovec inmsg, void *args)</div><div class='del'>-{</div><div class='del'>-        return xdr_to_generic (inmsg, (void *)args,</div><div class='del'>-                               (xdrproc_t)xdr_gf1_cli_stop_vol_req);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-gf_xdr_to_cli_stop_vol_rsp (struct iovec inmsg, void *args)</div><div class='del'>-{</div><div class='del'>-        return xdr_to_generic (inmsg, (void *)args,</div><div class='del'>-                               (xdrproc_t)xdr_gf1_cli_stop_vol_rsp);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-gf_xdr_from_cli_stop_vol_req (struct iovec outmsg, void *req)</div><div class='del'>-{</div><div class='del'>-        return xdr_serialize_generic (outmsg, (void *)req,</div><div class='del'>-                                      (xdrproc_t)xdr_gf1_cli_stop_vol_req);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-gf_xdr_serialize_cli_rename_vol_rsp (struct iovec outmsg, void *rsp)</div><div class='del'>-{</div><div class='del'>-        return xdr_serialize_generic (outmsg, (void *)rsp,</div><div class='del'>-                                      (xdrproc_t)xdr_gf1_cli_rename_vol_rsp);</div><div class='del'>-</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-gf_xdr_to_cli_rename_vol_req (struct iovec inmsg, void *args)</div><div class='del'>-{</div><div class='del'>-        return xdr_to_generic (inmsg, (void *)args,</div><div class='del'>-                               (xdrproc_t)xdr_gf1_cli_rename_vol_req);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-gf_xdr_to_cli_rename_vol_rsp (struct iovec inmsg, void *args)</div><div class='del'>-{</div><div class='del'>-        return xdr_to_generic (inmsg, (void *)args,</div><div class='del'>-                               (xdrproc_t)xdr_gf1_cli_rename_vol_rsp);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-gf_xdr_from_cli_rename_vol_req (struct iovec outmsg, void *req)</div><div class='del'>-{</div><div class='del'>-        return xdr_serialize_generic (outmsg, (void *)req,</div><div class='del'>-                                      (xdrproc_t)xdr_gf1_cli_rename_vol_req);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-gf_xdr_serialize_cli_defrag_vol_rsp (struct iovec outmsg, void *rsp)</div><div class='del'>-{</div><div class='del'>-        return xdr_serialize_generic (outmsg, (void *)rsp,</div><div class='del'>-                                      (xdrproc_t)xdr_gf1_cli_defrag_vol_rsp);</div><div class='del'>-</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-gf_xdr_to_cli_defrag_vol_rsp (struct iovec inmsg, void *args)</div><div class='del'>-{</div><div class='del'>-        return xdr_to_generic (inmsg, (void *)args,</div><div class='del'>-                               (xdrproc_t)xdr_gf1_cli_defrag_vol_rsp);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-gf_xdr_to_cli_defrag_vol_req (struct iovec inmsg, void *args)</div><div class='del'>-{</div><div class='del'>-        return xdr_to_generic (inmsg, (void *)args,</div><div class='del'>-                               (xdrproc_t)xdr_gf1_cli_defrag_vol_req);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-gf_xdr_from_cli_defrag_vol_req (struct iovec outmsg, void *req)</div><div class='del'>-{</div><div class='del'>-        return xdr_serialize_generic (outmsg, (void *)req,</div><div class='del'>-                                      (xdrproc_t)xdr_gf1_cli_defrag_vol_req);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-gf_xdr_serialize_cli_add_brick_rsp (struct iovec outmsg, void *rsp)</div><div class='del'>-{</div><div class='del'>-        return xdr_serialize_generic (outmsg, (void *)rsp,</div><div class='del'>-                                      (xdrproc_t)xdr_gf1_cli_add_brick_rsp);</div><div class='del'>-</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-gf_xdr_to_cli_add_brick_req (struct iovec inmsg, void *args)</div><div class='del'>-{</div><div class='del'>-        return xdr_to_generic (inmsg, (void *)args,</div><div class='del'>-                               (xdrproc_t)xdr_gf1_cli_add_brick_req);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-gf_xdr_to_cli_add_brick_rsp (struct iovec inmsg, void *args)</div><div class='del'>-{</div><div class='del'>-        return xdr_to_generic (inmsg, (void *)args,</div><div class='del'>-                               (xdrproc_t)xdr_gf1_cli_add_brick_rsp);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-gf_xdr_from_cli_add_brick_req (struct iovec outmsg, void *req)</div><div class='del'>-{</div><div class='del'>-        return xdr_serialize_generic (outmsg, (void *)req,</div><div class='del'>-                                      (xdrproc_t)xdr_gf1_cli_add_brick_req);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-gf_xdr_serialize_cli_remove_brick_rsp (struct iovec outmsg, void *rsp)</div><div class='del'>-{</div><div class='del'>-        return xdr_serialize_generic (outmsg, (void *)rsp,</div><div class='del'>-                                      (xdrproc_t)xdr_gf1_cli_remove_brick_rsp);</div><div class='del'>-</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-gf_xdr_to_cli_remove_brick_req (struct iovec inmsg, void *args)</div><div class='del'>-{</div><div class='del'>-        return xdr_to_generic (inmsg, (void *)args,</div><div class='del'>-                               (xdrproc_t)xdr_gf1_cli_remove_brick_req);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-gf_xdr_to_cli_remove_brick_rsp (struct iovec inmsg, void *args)</div><div class='del'>-{</div><div class='del'>-        return xdr_to_generic (inmsg, (void *)args,</div><div class='del'>-                               (xdrproc_t)xdr_gf1_cli_remove_brick_rsp);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-gf_xdr_from_cli_remove_brick_req (struct iovec outmsg, void *req)</div><div class='del'>-{</div><div class='del'>-        return xdr_serialize_generic (outmsg, (void *)req,</div><div class='del'>-                                      (xdrproc_t)xdr_gf1_cli_remove_brick_req);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-gf_xdr_serialize_cli_replace_brick_rsp (struct iovec outmsg, void *rsp)</div><div class='del'>-{</div><div class='del'>-        return xdr_serialize_generic (outmsg, (void *)rsp,</div><div class='del'>-                                      (xdrproc_t)xdr_gf1_cli_replace_brick_rsp);</div><div class='del'>-</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-gf_xdr_to_cli_replace_brick_req (struct iovec inmsg, void *args)</div><div class='del'>-{</div><div class='del'>-        return xdr_to_generic (inmsg, (void *)args,</div><div class='del'>-                               (xdrproc_t)xdr_gf1_cli_replace_brick_req);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-gf_xdr_to_cli_replace_brick_rsp (struct iovec inmsg, void *args)</div><div class='del'>-{</div><div class='del'>-        return xdr_to_generic (inmsg, (void *)args,</div><div class='del'>-                               (xdrproc_t)xdr_gf1_cli_replace_brick_rsp);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-gf_xdr_from_cli_replace_brick_req (struct iovec outmsg, void *req)</div><div class='del'>-{</div><div class='del'>-        return xdr_serialize_generic (outmsg, (void *)req,</div><div class='del'>-                                      (xdrproc_t)xdr_gf1_cli_replace_brick_req);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-gf_xdr_serialize_cli_set_vol_rsp (struct iovec outmsg, void *rsp)</div><div class='del'>-{</div><div class='del'>-        return xdr_serialize_generic (outmsg, (void *)rsp,</div><div class='del'>-                                      (xdrproc_t)xdr_gf1_cli_set_vol_rsp);</div><div class='del'>-</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-gf_xdr_to_cli_set_vol_req (struct iovec inmsg, void *args)</div><div class='del'>-{</div><div class='del'>-        return xdr_to_generic (inmsg, (void *)args,</div><div class='del'>-                               (xdrproc_t)xdr_gf1_cli_set_vol_req);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-gf_xdr_to_cli_set_vol_rsp (struct iovec inmsg, void *args)</div><div class='del'>-{</div><div class='del'>-        return xdr_to_generic (inmsg, (void *)args,</div><div class='del'>-                               (xdrproc_t)xdr_gf1_cli_set_vol_rsp);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-gf_xdr_from_cli_set_vol_req (struct iovec outmsg, void *req)</div><div class='del'>-{</div><div class='del'>-        return xdr_serialize_generic (outmsg, (void *)req,</div><div class='del'>-                                      (xdrproc_t)xdr_gf1_cli_set_vol_req);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-/* log */</div><div class='del'>-ssize_t</div><div class='del'>-gf_xdr_serialize_cli_log_filename_rsp (struct iovec outmsg, void *rsp)</div><div class='del'>-{</div><div class='del'>-        return xdr_serialize_generic (outmsg, (void *)rsp,</div><div class='del'>-                                      (xdrproc_t)xdr_gf1_cli_log_filename_rsp);</div><div class='del'>-</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-gf_xdr_to_cli_log_filename_req (struct iovec inmsg, void *args)</div><div class='del'>-{</div><div class='del'>-        return xdr_to_generic (inmsg, (void *)args,</div><div class='del'>-                               (xdrproc_t)xdr_gf1_cli_log_filename_req);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-gf_xdr_to_cli_log_filename_rsp (struct iovec inmsg, void *args)</div><div class='del'>-{</div><div class='del'>-        return xdr_to_generic (inmsg, (void *)args,</div><div class='del'>-                               (xdrproc_t)xdr_gf1_cli_log_filename_rsp);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-gf_xdr_from_cli_log_filename_req (struct iovec outmsg, void *req)</div><div class='del'>-{</div><div class='del'>-        return xdr_serialize_generic (outmsg, (void *)req,</div><div class='del'>-                                      (xdrproc_t)xdr_gf1_cli_log_filename_req);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-gf_xdr_serialize_cli_log_locate_rsp (struct iovec outmsg, void *rsp)</div><div class='del'>-{</div><div class='del'>-        return xdr_serialize_generic (outmsg, (void *)rsp,</div><div class='del'>-                                      (xdrproc_t)xdr_gf1_cli_log_locate_rsp);</div><div class='del'>-</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-gf_xdr_to_cli_log_locate_req (struct iovec inmsg, void *args)</div><div class='del'>-{</div><div class='del'>-        return xdr_to_generic (inmsg, (void *)args,</div><div class='del'>-                               (xdrproc_t)xdr_gf1_cli_log_locate_req);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-gf_xdr_to_cli_log_locate_rsp (struct iovec inmsg, void *args)</div><div class='del'>-{</div><div class='del'>-        return xdr_to_generic (inmsg, (void *)args,</div><div class='del'>-                               (xdrproc_t)xdr_gf1_cli_log_locate_rsp);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-gf_xdr_from_cli_log_locate_req (struct iovec outmsg, void *req)</div><div class='del'>-{</div><div class='del'>-        return xdr_serialize_generic (outmsg, (void *)req,</div><div class='del'>-                                      (xdrproc_t)xdr_gf1_cli_log_locate_req);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-gf_xdr_serialize_cli_log_rotate_rsp (struct iovec outmsg, void *rsp)</div><div class='del'>-{</div><div class='del'>-        return xdr_serialize_generic (outmsg, (void *)rsp,</div><div class='del'>-                                      (xdrproc_t)xdr_gf1_cli_log_rotate_rsp);</div><div class='del'>-</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-gf_xdr_to_cli_log_rotate_req (struct iovec inmsg, void *args)</div><div class='del'>-{</div><div class='del'>-        return xdr_to_generic (inmsg, (void *)args,</div><div class='del'>-                               (xdrproc_t)xdr_gf1_cli_log_rotate_req);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-gf_xdr_to_cli_log_rotate_rsp (struct iovec inmsg, void *args)</div><div class='del'>-{</div><div class='del'>-        return xdr_to_generic (inmsg, (void *)args,</div><div class='del'>-                               (xdrproc_t)xdr_gf1_cli_log_rotate_rsp);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-gf_xdr_from_cli_log_rotate_req (struct iovec outmsg, void *req)</div><div class='del'>-{</div><div class='del'>-        return xdr_serialize_generic (outmsg, (void *)req,</div><div class='del'>-                                      (xdrproc_t)xdr_gf1_cli_log_rotate_req);</div><div class='del'>-}</div><div class='head'>diff --git a/rpc/xdr/src/cli1.h b/rpc/xdr/src/cli1.h<br/>deleted file mode 100644<br/>index 31b2c9b75c6..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/rpc/xdr/src/cli1.h?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>rpc/xdr/src/cli1.h</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,239 +0,0 @@</div><div class='del'>-/*</div><div class='del'>-  Copyright (c) 2007-2010 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='del'>-  This file is part of GlusterFS.</div><div class='del'>-</div><div class='del'>-  GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-  it under the terms of the GNU Affero General Public License as published</div><div class='del'>-  by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-  or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-  GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-  WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-  Affero General Public License for more details.</div><div class='del'>-</div><div class='del'>-  You should have received a copy of the GNU Affero General Public License</div><div class='del'>-  along with this program.  If not, see</div><div class='del'>-  &lt;http://www.gnu.org/licenses/&gt;.</div><div class='del'>-*/</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-#ifndef _CLI1_H</div><div class='del'>-#define _CLI1_H</div><div class='del'>-</div><div class='del'>-#include &lt;sys/uio.h&gt;</div><div class='del'>-</div><div class='del'>-#include "cli1-xdr.h"</div><div class='del'>-</div><div class='del'>-#define GF_DEFRAG_CMD_START   1</div><div class='del'>-#define GF_DEFRAG_CMD_STOP    2</div><div class='del'>-#define GF_DEFRAG_CMD_STATUS  3</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-gf_xdr_serialize_cli_probe_rsp (struct iovec outmsg, void *rsp);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-gf_xdr_to_cli_probe_req (struct iovec inmsg, void *args);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-gf_xdr_to_cli_probe_rsp (struct iovec inmsg, void *args);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-gf_xdr_from_cli_probe_req (struct iovec outmsg, void *req);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-gf_xdr_serialize_cli_deprobe_rsp (struct iovec outmsg, void *rsp);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-gf_xdr_to_cli_deprobe_req (struct iovec inmsg, void *args);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-gf_xdr_to_cli_deprobe_rsp (struct iovec inmsg, void *args);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-gf_xdr_from_cli_deprobe_req (struct iovec outmsg, void *req);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-gf_xdr_serialize_cli_peer_list_rsp (struct iovec outmsg, void *rsp);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-gf_xdr_to_cli_peer_list_req (struct iovec inmsg, void *args);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-gf_xdr_to_cli_peer_list_rsp (struct iovec inmsg, void *args);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-gf_xdr_from_cli_peer_list_req (struct iovec outmsg, void *req);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-gf_xdr_serialize_cli_create_vol_rsp (struct iovec outmsg, void *rsp);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-gf_xdr_to_cli_create_vol_req (struct iovec inmsg, void *args);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-gf_xdr_to_cli_create_vol_rsp (struct iovec inmsg, void *args);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-gf_xdr_from_cli_create_vol_req (struct iovec outmsg, void *req);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-gf_xdr_serialize_cli_delete_vol_rsp (struct iovec outmsg, void *rsp);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-gf_xdr_to_cli_delete_vol_req (struct iovec inmsg, void *args);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-gf_xdr_to_cli_delete_vol_rsp (struct iovec inmsg, void *args);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-gf_xdr_from_cli_delete_vol_req (struct iovec outmsg, void *req);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-gf_xdr_serialize_cli_start_vol_rsp (struct iovec outmsg, void *rsp);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-gf_xdr_to_cli_start_vol_req (struct iovec inmsg, void *args);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-gf_xdr_to_cli_start_vol_rsp (struct iovec inmsg, void *args);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-gf_xdr_from_cli_start_vol_req (struct iovec outmsg, void *req);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-gf_xdr_serialize_cli_stop_vol_rsp (struct iovec outmsg, void *rsp);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-gf_xdr_to_cli_stop_vol_req (struct iovec inmsg, void *args);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-gf_xdr_to_cli_stop_vol_rsp (struct iovec inmsg, void *args);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-gf_xdr_from_cli_stop_vol_req (struct iovec outmsg, void *req);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-gf_xdr_serialize_cli_rename_vol_rsp (struct iovec outmsg, void *rsp);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-gf_xdr_to_cli_rename_vol_req (struct iovec inmsg, void *args);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-gf_xdr_to_cli_rename_vol_rsp (struct iovec inmsg, void *args);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-gf_xdr_from_cli_rename_vol_req (struct iovec outmsg, void *req);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-gf_xdr_serialize_cli_defrag_vol_rsp (struct iovec outmsg, void *rsp);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-gf_xdr_to_cli_defrag_vol_req (struct iovec inmsg, void *args);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-gf_xdr_from_cli_defrag_vol_req (struct iovec outmsg, void *req);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-gf_xdr_to_cli_defrag_vol_rsp (struct iovec inmsg, void *args);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-gf_xdr_serialize_cli_add_brick_rsp (struct iovec outmsg, void *rsp);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-gf_xdr_to_cli_add_brick_req (struct iovec inmsg, void *args);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-gf_xdr_to_cli_add_brick_rsp (struct iovec inmsg, void *args);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-gf_xdr_from_cli_add_brick_req (struct iovec outmsg, void *req);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-gf_xdr_serialize_cli_remove_brick_rsp (struct iovec outmsg, void *rsp);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-gf_xdr_to_cli_remove_brick_req (struct iovec inmsg, void *args);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-gf_xdr_to_cli_remove_brick_rsp (struct iovec inmsg, void *args);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-gf_xdr_from_cli_remove_brick_req (struct iovec outmsg, void *req);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-gf_xdr_serialize_cli_replace_brick_rsp (struct iovec outmsg, void *rsp);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-gf_xdr_to_cli_replace_brick_req (struct iovec inmsg, void *args);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-gf_xdr_to_cli_replace_brick_rsp (struct iovec inmsg, void *args);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-gf_xdr_from_cli_replace_brick_req (struct iovec outmsg, void *req);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-gf_xdr_serialize_cli_set_vol_rsp (struct iovec outmsg, void *rsp);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-gf_xdr_to_cli_set_vol_req (struct iovec inmsg, void *args);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-gf_xdr_to_cli_set_vol_rsp (struct iovec inmsg, void *args);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-gf_xdr_from_cli_set_vol_req (struct iovec outmsg, void *req);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-gf_xdr_serialize_cli_get_vol_rsp (struct iovec outmsg, void *rsp);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-gf_xdr_to_cli_get_vol_req (struct iovec inmsg, void *args);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-gf_xdr_to_cli_get_vol_rsp (struct iovec inmsg, void *args);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-gf_xdr_from_cli_get_vol_req (struct iovec outmsg, void *req);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-gf_xdr_serialize_cli_log_filename_rsp (struct iovec outmsg, void *rsp);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-gf_xdr_to_cli_log_filename_req (struct iovec inmsg, void *args);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-gf_xdr_to_cli_log_filename_rsp (struct iovec inmsg, void *args);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-gf_xdr_from_cli_log_filename_req (struct iovec outmsg, void *req);</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-gf_xdr_serialize_cli_log_locate_rsp (struct iovec outmsg, void *rsp);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-gf_xdr_to_cli_log_locate_req (struct iovec inmsg, void *args);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-gf_xdr_to_cli_log_locate_rsp (struct iovec inmsg, void *args);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-gf_xdr_from_cli_log_locate_req (struct iovec outmsg, void *req);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-gf_xdr_serialize_cli_log_rotate_rsp (struct iovec outmsg, void *rsp);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-gf_xdr_to_cli_log_rotate_req (struct iovec inmsg, void *args);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-gf_xdr_to_cli_log_rotate_rsp (struct iovec inmsg, void *args);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-gf_xdr_from_cli_log_rotate_req (struct iovec outmsg, void *req);</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-#endif /* !_CLI1_H */</div><div class='head'>diff --git a/rpc/xdr/src/cli1.x b/rpc/xdr/src/cli1.x<br/>deleted file mode 100644<br/>index 0ffe32726ca..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/rpc/xdr/src/cli1.x?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>rpc/xdr/src/cli1.x</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,235 +0,0 @@</div><div class='del'>- enum gf1_cluster_type {</div><div class='del'>-        GF_CLUSTER_TYPE_NONE = 0,</div><div class='del'>-        GF_CLUSTER_TYPE_STRIPE,</div><div class='del'>-        GF_CLUSTER_TYPE_REPLICATE</div><div class='del'>-} ;</div><div class='del'>-</div><div class='del'>- enum gf1_cli_replace_op {</div><div class='del'>-        GF_REPLACE_OP_NONE = 0,</div><div class='del'>-        GF_REPLACE_OP_START,</div><div class='del'>-        GF_REPLACE_OP_COMMIT,</div><div class='del'>-        GF_REPLACE_OP_PAUSE,</div><div class='del'>-        GF_REPLACE_OP_ABORT,</div><div class='del'>-        GF_REPLACE_OP_STATUS</div><div class='del'>-} ;</div><div class='del'>-</div><div class='del'>-enum gf1_cli_friends_list {</div><div class='del'>-        GF_CLI_LIST_ALL = 1</div><div class='del'>-} ;</div><div class='del'>-</div><div class='del'>-enum gf1_cli_get_volume {</div><div class='del'>-        GF_CLI_GET_VOLUME_ALL = 1,</div><div class='del'>-        GF_CLI_GET_VOLUME,</div><div class='del'>-        GF_CLI_GET_NEXT_VOLUME</div><div class='del'>-} ;</div><div class='del'>-</div><div class='del'>-enum gf1_cli_op_flags {</div><div class='del'>-        GF_CLI_FLAG_OP_FORCE = 1</div><div class='del'>-};</div><div class='del'>-</div><div class='del'>- struct gf1_cli_probe_req {</div><div class='del'>-        string  hostname&lt;&gt;;</div><div class='del'>-	int	port;</div><div class='del'>-}  ;</div><div class='del'>-</div><div class='del'>- struct gf1_cli_probe_rsp {</div><div class='del'>-        int     op_ret;</div><div class='del'>-        int     op_errno;</div><div class='del'>-	int	port;</div><div class='del'>-        string  hostname&lt;&gt;;</div><div class='del'>-}  ;</div><div class='del'>-</div><div class='del'>- struct gf1_cli_deprobe_req {</div><div class='del'>-        string  hostname&lt;&gt;;</div><div class='del'>-	int	port;</div><div class='del'>-}  ;</div><div class='del'>-</div><div class='del'>- struct gf1_cli_deprobe_rsp {</div><div class='del'>-        int     op_ret;</div><div class='del'>-        int     op_errno;</div><div class='del'>-        string  hostname&lt;&gt;;</div><div class='del'>-}  ;</div><div class='del'>-</div><div class='del'>-struct gf1_cli_peer_list_req {</div><div class='del'>-        int     flags;</div><div class='del'>-        opaque  dict&lt;&gt;;</div><div class='del'>-}  ;</div><div class='del'>-</div><div class='del'>-struct gf1_cli_peer_list_rsp {</div><div class='del'>-        int     op_ret;</div><div class='del'>-        int     op_errno;</div><div class='del'>-        opaque  friends&lt;&gt;;</div><div class='del'>-} ;</div><div class='del'>-</div><div class='del'>-struct gf1_cli_get_vol_req {</div><div class='del'>-        int     flags;</div><div class='del'>-        opaque  dict&lt;&gt;;</div><div class='del'>-}  ;</div><div class='del'>-</div><div class='del'>-struct gf1_cli_get_vol_rsp {</div><div class='del'>-        int     op_ret;</div><div class='del'>-        int     op_errno;</div><div class='del'>-        opaque  volumes&lt;&gt;;</div><div class='del'>-} ;</div><div class='del'>-</div><div class='del'>- struct gf1_cli_create_vol_req {</div><div class='del'>-        string  volname&lt;&gt;;</div><div class='del'>-        gf1_cluster_type type;</div><div class='del'>-        int     count;</div><div class='del'>-        opaque  bricks&lt;&gt;;</div><div class='del'>-}  ;</div><div class='del'>-</div><div class='del'>- struct gf1_cli_create_vol_rsp {</div><div class='del'>-        int     op_ret;</div><div class='del'>-        int     op_errno;</div><div class='del'>-        string  volname&lt;&gt;;</div><div class='del'>-	 string  op_errstr&lt;&gt;;</div><div class='del'>-}  ;</div><div class='del'>-</div><div class='del'>- struct gf1_cli_delete_vol_req {</div><div class='del'>-        string volname&lt;&gt;;</div><div class='del'>-}  ;</div><div class='del'>-</div><div class='del'>- struct gf1_cli_delete_vol_rsp {</div><div class='del'>-        int     op_ret;</div><div class='del'>-        int     op_errno;</div><div class='del'>-        string  volname&lt;&gt;;</div><div class='del'>-}  ;</div><div class='del'>-</div><div class='del'>- struct gf1_cli_start_vol_req {</div><div class='del'>-        string volname&lt;&gt;;</div><div class='del'>-}  ;</div><div class='del'>-</div><div class='del'>-</div><div class='del'>- struct gf1_cli_start_vol_rsp {</div><div class='del'>-        int     op_ret;</div><div class='del'>-        int     op_errno;</div><div class='del'>-        string  volname&lt;&gt;;</div><div class='del'>-}  ;</div><div class='del'>-</div><div class='del'>- struct gf1_cli_stop_vol_req {</div><div class='del'>-        string volname&lt;&gt;;</div><div class='del'>-        int flags;</div><div class='del'>-}  ;</div><div class='del'>-</div><div class='del'>-</div><div class='del'>- struct gf1_cli_stop_vol_rsp {</div><div class='del'>-        int     op_ret;</div><div class='del'>-        int     op_errno;</div><div class='del'>-        string  volname&lt;&gt;;</div><div class='del'>-}  ;</div><div class='del'>-</div><div class='del'>-</div><div class='del'>- struct gf1_cli_rename_vol_req {</div><div class='del'>-        string old_volname&lt;&gt;;</div><div class='del'>-        string new_volname&lt;&gt;;</div><div class='del'>-}  ;</div><div class='del'>-</div><div class='del'>- struct gf1_cli_rename_vol_rsp {</div><div class='del'>-        int     op_ret;</div><div class='del'>-        int     op_errno;</div><div class='del'>-        string  volname&lt;&gt;;</div><div class='del'>-}  ;</div><div class='del'>-</div><div class='del'>- struct gf1_cli_defrag_vol_req {</div><div class='del'>-        int    cmd;</div><div class='del'>-        string volname&lt;&gt;;</div><div class='del'>-}  ;</div><div class='del'>-</div><div class='del'>- struct gf1_cli_defrag_vol_rsp {</div><div class='del'>-        int     op_ret;</div><div class='del'>-        int     op_errno;</div><div class='del'>-        string  volname&lt;&gt;;</div><div class='del'>-        unsigned hyper   files;</div><div class='del'>-        unsigned hyper   size;</div><div class='del'>-        unsigned hyper   lookedup_files;</div><div class='del'>-}  ;</div><div class='del'>-</div><div class='del'>- struct gf1_cli_add_brick_req {</div><div class='del'>-        string volname&lt;&gt;;</div><div class='del'>-        gf1_cluster_type type;</div><div class='del'>-        int    count;</div><div class='del'>-        opaque bricks&lt;&gt;;</div><div class='del'>-}  ;</div><div class='del'>-</div><div class='del'>- struct gf1_cli_add_brick_rsp {</div><div class='del'>-        int     op_ret;</div><div class='del'>-        int     op_errno;</div><div class='del'>-        string  volname&lt;&gt;;</div><div class='del'>-	 string  op_errstr&lt;&gt;;</div><div class='del'>-}  ;</div><div class='del'>-</div><div class='del'>- struct gf1_cli_remove_brick_req {</div><div class='del'>-        string volname&lt;&gt;;</div><div class='del'>-        gf1_cluster_type type;</div><div class='del'>-        int    count;</div><div class='del'>-        opaque bricks&lt;&gt;;</div><div class='del'>-}  ;</div><div class='del'>-</div><div class='del'>-</div><div class='del'>- struct gf1_cli_remove_brick_rsp {</div><div class='del'>-        int     op_ret;</div><div class='del'>-        int     op_errno;</div><div class='del'>-        string  volname&lt;&gt;;</div><div class='del'>-        string  op_errstr&lt;&gt;;</div><div class='del'>-}  ;</div><div class='del'>-</div><div class='del'>- struct gf1_cli_replace_brick_req {</div><div class='del'>-        string volname&lt;&gt;;</div><div class='del'>-        gf1_cli_replace_op op;</div><div class='del'>-        opaque bricks&lt;&gt;;</div><div class='del'>-}  ;</div><div class='del'>-</div><div class='del'>- struct gf1_cli_replace_brick_rsp {</div><div class='del'>-        int     op_ret;</div><div class='del'>-        int     op_errno;</div><div class='del'>-        string  volname&lt;&gt;;</div><div class='del'>-        string  status&lt;&gt;;</div><div class='del'>-}  ;</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-struct gf1_cli_set_vol_req {</div><div class='del'>-        string volname&lt;&gt;;</div><div class='del'>-        opaque dict&lt;&gt;;</div><div class='del'>-} ;</div><div class='del'>-</div><div class='del'>-</div><div class='del'>- struct gf1_cli_set_vol_rsp {</div><div class='del'>-        int     op_ret;</div><div class='del'>-        int     op_errno;</div><div class='del'>-        string  volname&lt;&gt;;</div><div class='del'>-}  ;</div><div class='del'>-</div><div class='del'>-struct gf1_cli_log_filename_req {</div><div class='del'>-        string volname&lt;&gt;;</div><div class='del'>-        string brick&lt;&gt;;</div><div class='del'>-        string path&lt;&gt;;</div><div class='del'>-};</div><div class='del'>-</div><div class='del'>-struct gf1_cli_log_filename_rsp {</div><div class='del'>-	int op_ret;</div><div class='del'>-	int op_errno;</div><div class='del'>-        string errstr&lt;&gt;;</div><div class='del'>-};</div><div class='del'>-</div><div class='del'>-struct gf1_cli_log_locate_req {</div><div class='del'>-	string volname&lt;&gt;;</div><div class='del'>-        string brick&lt;&gt;;</div><div class='del'>-};</div><div class='del'>-</div><div class='del'>-struct gf1_cli_log_locate_rsp {</div><div class='del'>-	int op_ret;</div><div class='del'>-	int op_errno;</div><div class='del'>-        string path&lt;&gt;;</div><div class='del'>-};</div><div class='del'>-</div><div class='del'>-struct gf1_cli_log_rotate_req {</div><div class='del'>-	string volname&lt;&gt;;</div><div class='del'>-        string brick&lt;&gt;;</div><div class='del'>-};</div><div class='del'>-</div><div class='del'>-struct gf1_cli_log_rotate_rsp {</div><div class='del'>-	int op_ret;</div><div class='del'>-	int op_errno;</div><div class='del'>-        string errstr&lt;&gt;;</div><div class='del'>-};</div><div class='head'>diff --git a/rpc/xdr/src/glusterd1-xdr.c b/rpc/xdr/src/glusterd1-xdr.c<br/>deleted file mode 100644<br/>index 82d9830c97f..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/rpc/xdr/src/glusterd1-xdr.c?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>rpc/xdr/src/glusterd1-xdr.c</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,267 +0,0 @@</div><div class='del'>-/*</div><div class='del'>-  Copyright (c) 2010 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='del'>-  This file is part of GlusterFS.</div><div class='del'>-</div><div class='del'>-  GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-  it under the terms of the GNU Affero General Public License as published</div><div class='del'>-  by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-  or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-  GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-  WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-  Affero General Public License for more details.</div><div class='del'>-</div><div class='del'>-  You should have received a copy of the GNU Affero General Public License</div><div class='del'>-  along with this program.  If not, see</div><div class='del'>-  &lt;http://www.gnu.org/licenses/&gt;.</div><div class='del'>-*/</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-/*</div><div class='del'>- * Please do not edit this file.</div><div class='del'>- * It was generated using rpcgen.</div><div class='del'>- */</div><div class='del'>-</div><div class='del'>-#include "glusterd1.h"</div><div class='del'>-</div><div class='del'>-bool_t</div><div class='del'>-xdr_glusterd_volume_status (XDR *xdrs, glusterd_volume_status *objp)</div><div class='del'>-{</div><div class='del'>-</div><div class='del'>-	 if (!xdr_enum (xdrs, (enum_t *) objp))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	return TRUE;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-bool_t</div><div class='del'>-xdr_gd1_mgmt_probe_req (XDR *xdrs, gd1_mgmt_probe_req *objp)</div><div class='del'>-{</div><div class='del'>-</div><div class='del'>-	 if (!xdr_vector (xdrs, (char *)objp-&gt;uuid, 16,</div><div class='del'>-		sizeof (u_char), (xdrproc_t) xdr_u_char))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_string (xdrs, &amp;objp-&gt;hostname, ~0))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_int (xdrs, &amp;objp-&gt;port))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	return TRUE;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-bool_t</div><div class='del'>-xdr_gd1_mgmt_probe_rsp (XDR *xdrs, gd1_mgmt_probe_rsp *objp)</div><div class='del'>-{</div><div class='del'>-</div><div class='del'>-	 if (!xdr_vector (xdrs, (char *)objp-&gt;uuid, 16,</div><div class='del'>-		sizeof (u_char), (xdrproc_t) xdr_u_char))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_string (xdrs, &amp;objp-&gt;hostname, ~0))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_int (xdrs, &amp;objp-&gt;port))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	return TRUE;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-bool_t</div><div class='del'>-xdr_gd1_mgmt_friend_req (XDR *xdrs, gd1_mgmt_friend_req *objp)</div><div class='del'>-{</div><div class='del'>-</div><div class='del'>-	 if (!xdr_vector (xdrs, (char *)objp-&gt;uuid, 16,</div><div class='del'>-		sizeof (u_char), (xdrproc_t) xdr_u_char))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_string (xdrs, &amp;objp-&gt;hostname, ~0))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_int (xdrs, &amp;objp-&gt;port))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_bytes (xdrs, (char **)&amp;objp-&gt;vols.vols_val, (u_int *) &amp;objp-&gt;vols.vols_len, ~0))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	return TRUE;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-bool_t</div><div class='del'>-xdr_gd1_mgmt_friend_rsp (XDR *xdrs, gd1_mgmt_friend_rsp *objp)</div><div class='del'>-{</div><div class='del'>-</div><div class='del'>-	 if (!xdr_vector (xdrs, (char *)objp-&gt;uuid, 16,</div><div class='del'>-		sizeof (u_char), (xdrproc_t) xdr_u_char))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_string (xdrs, &amp;objp-&gt;hostname, ~0))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_int (xdrs, &amp;objp-&gt;op_ret))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_int (xdrs, &amp;objp-&gt;op_errno))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_int (xdrs, &amp;objp-&gt;port))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	return TRUE;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-bool_t</div><div class='del'>-xdr_gd1_mgmt_unfriend_req (XDR *xdrs, gd1_mgmt_unfriend_req *objp)</div><div class='del'>-{</div><div class='del'>-</div><div class='del'>-	 if (!xdr_vector (xdrs, (char *)objp-&gt;uuid, 16,</div><div class='del'>-		sizeof (u_char), (xdrproc_t) xdr_u_char))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_string (xdrs, &amp;objp-&gt;hostname, ~0))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_int (xdrs, &amp;objp-&gt;port))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	return TRUE;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-bool_t</div><div class='del'>-xdr_gd1_mgmt_unfriend_rsp (XDR *xdrs, gd1_mgmt_unfriend_rsp *objp)</div><div class='del'>-{</div><div class='del'>-</div><div class='del'>-	 if (!xdr_vector (xdrs, (char *)objp-&gt;uuid, 16,</div><div class='del'>-		sizeof (u_char), (xdrproc_t) xdr_u_char))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_string (xdrs, &amp;objp-&gt;hostname, ~0))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_int (xdrs, &amp;objp-&gt;op_ret))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_int (xdrs, &amp;objp-&gt;op_errno))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_int (xdrs, &amp;objp-&gt;port))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	return TRUE;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-bool_t</div><div class='del'>-xdr_gd1_mgmt_cluster_lock_req (XDR *xdrs, gd1_mgmt_cluster_lock_req *objp)</div><div class='del'>-{</div><div class='del'>-</div><div class='del'>-	 if (!xdr_vector (xdrs, (char *)objp-&gt;uuid, 16,</div><div class='del'>-		sizeof (u_char), (xdrproc_t) xdr_u_char))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	return TRUE;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-bool_t</div><div class='del'>-xdr_gd1_mgmt_cluster_lock_rsp (XDR *xdrs, gd1_mgmt_cluster_lock_rsp *objp)</div><div class='del'>-{</div><div class='del'>-</div><div class='del'>-	 if (!xdr_vector (xdrs, (char *)objp-&gt;uuid, 16,</div><div class='del'>-		sizeof (u_char), (xdrproc_t) xdr_u_char))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_int (xdrs, &amp;objp-&gt;op_ret))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_int (xdrs, &amp;objp-&gt;op_errno))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	return TRUE;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-bool_t</div><div class='del'>-xdr_gd1_mgmt_cluster_unlock_req (XDR *xdrs, gd1_mgmt_cluster_unlock_req *objp)</div><div class='del'>-{</div><div class='del'>-</div><div class='del'>-	 if (!xdr_vector (xdrs, (char *)objp-&gt;uuid, 16,</div><div class='del'>-		sizeof (u_char), (xdrproc_t) xdr_u_char))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	return TRUE;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-bool_t</div><div class='del'>-xdr_gd1_mgmt_cluster_unlock_rsp (XDR *xdrs, gd1_mgmt_cluster_unlock_rsp *objp)</div><div class='del'>-{</div><div class='del'>-</div><div class='del'>-	 if (!xdr_vector (xdrs, (char *)objp-&gt;uuid, 16,</div><div class='del'>-		sizeof (u_char), (xdrproc_t) xdr_u_char))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_int (xdrs, &amp;objp-&gt;op_ret))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_int (xdrs, &amp;objp-&gt;op_errno))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	return TRUE;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-bool_t</div><div class='del'>-xdr_gd1_mgmt_stage_op_req (XDR *xdrs, gd1_mgmt_stage_op_req *objp)</div><div class='del'>-{</div><div class='del'>-</div><div class='del'>-	 if (!xdr_vector (xdrs, (char *)objp-&gt;uuid, 16,</div><div class='del'>-		sizeof (u_char), (xdrproc_t) xdr_u_char))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_int (xdrs, &amp;objp-&gt;op))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_bytes (xdrs, (char **)&amp;objp-&gt;buf.buf_val, (u_int *) &amp;objp-&gt;buf.buf_len, ~0))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	return TRUE;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-bool_t</div><div class='del'>-xdr_gd1_mgmt_stage_op_rsp (XDR *xdrs, gd1_mgmt_stage_op_rsp *objp)</div><div class='del'>-{</div><div class='del'>-</div><div class='del'>-	 if (!xdr_vector (xdrs, (char *)objp-&gt;uuid, 16,</div><div class='del'>-		sizeof (u_char), (xdrproc_t) xdr_u_char))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_int (xdrs, &amp;objp-&gt;op))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_int (xdrs, &amp;objp-&gt;op_ret))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_int (xdrs, &amp;objp-&gt;op_errno))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	return TRUE;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-bool_t</div><div class='del'>-xdr_gd1_mgmt_commit_op_req (XDR *xdrs, gd1_mgmt_commit_op_req *objp)</div><div class='del'>-{</div><div class='del'>-</div><div class='del'>-	 if (!xdr_vector (xdrs, (char *)objp-&gt;uuid, 16,</div><div class='del'>-		sizeof (u_char), (xdrproc_t) xdr_u_char))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_int (xdrs, &amp;objp-&gt;op))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_bytes (xdrs, (char **)&amp;objp-&gt;buf.buf_val, (u_int *) &amp;objp-&gt;buf.buf_len, ~0))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	return TRUE;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-bool_t</div><div class='del'>-xdr_gd1_mgmt_commit_op_rsp (XDR *xdrs, gd1_mgmt_commit_op_rsp *objp)</div><div class='del'>-{</div><div class='del'>-</div><div class='del'>-	 if (!xdr_vector (xdrs, (char *)objp-&gt;uuid, 16,</div><div class='del'>-		sizeof (u_char), (xdrproc_t) xdr_u_char))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_int (xdrs, &amp;objp-&gt;op))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_int (xdrs, &amp;objp-&gt;op_ret))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_int (xdrs, &amp;objp-&gt;op_errno))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	return TRUE;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-bool_t</div><div class='del'>-xdr_gd1_mgmt_friend_update (XDR *xdrs, gd1_mgmt_friend_update *objp)</div><div class='del'>-{</div><div class='del'>-</div><div class='del'>-	 if (!xdr_vector (xdrs, (char *)objp-&gt;uuid, 16,</div><div class='del'>-		sizeof (u_char), (xdrproc_t) xdr_u_char))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_bytes (xdrs, (char **)&amp;objp-&gt;friends.friends_val, (u_int *) &amp;objp-&gt;friends.friends_len, ~0))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_int (xdrs, &amp;objp-&gt;port))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	return TRUE;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-bool_t</div><div class='del'>-xdr_gd1_mgmt_friend_update_rsp (XDR *xdrs, gd1_mgmt_friend_update_rsp *objp)</div><div class='del'>-{</div><div class='del'>-</div><div class='del'>-	 if (!xdr_vector (xdrs, (char *)objp-&gt;uuid, 16,</div><div class='del'>-		sizeof (u_char), (xdrproc_t) xdr_u_char))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_int (xdrs, &amp;objp-&gt;op))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_int (xdrs, &amp;objp-&gt;op_ret))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_int (xdrs, &amp;objp-&gt;op_errno))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	return TRUE;</div><div class='del'>-}</div><div class='head'>diff --git a/rpc/xdr/src/glusterd1-xdr.h b/rpc/xdr/src/glusterd1-xdr.h<br/>deleted file mode 100644<br/>index 7b208ee5f11..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/rpc/xdr/src/glusterd1-xdr.h?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>rpc/xdr/src/glusterd1-xdr.h</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,218 +0,0 @@</div><div class='del'>-/*</div><div class='del'>-  Copyright (c) 2010 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='del'>-  This file is part of GlusterFS.</div><div class='del'>-</div><div class='del'>-  GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-  it under the terms of the GNU Affero General Public License as published</div><div class='del'>-  by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-  or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-  GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-  WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-  Affero General Public License for more details.</div><div class='del'>-</div><div class='del'>-  You should have received a copy of the GNU Affero General Public License</div><div class='del'>-  along with this program.  If not, see</div><div class='del'>-  &lt;http://www.gnu.org/licenses/&gt;.</div><div class='del'>-*/</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-/*</div><div class='del'>- * Please do not edit this file.</div><div class='del'>- * It was generated using rpcgen.</div><div class='del'>- */</div><div class='del'>-</div><div class='del'>-#ifndef _GLUSTERD1_H_RPCGEN</div><div class='del'>-#define _GLUSTERD1_H_RPCGEN</div><div class='del'>-</div><div class='del'>-#include &lt;rpc/rpc.h&gt;</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-#ifdef __cplusplus</div><div class='del'>-extern "C" {</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-enum glusterd_volume_status {</div><div class='del'>-	GLUSTERD_STATUS_NONE = 0,</div><div class='del'>-	GLUSTERD_STATUS_STARTED = 0 + 1,</div><div class='del'>-	GLUSTERD_STATUS_STOPPED = 0 + 2,</div><div class='del'>-};</div><div class='del'>-typedef enum glusterd_volume_status glusterd_volume_status;</div><div class='del'>-</div><div class='del'>-struct gd1_mgmt_probe_req {</div><div class='del'>-	u_char uuid[16];</div><div class='del'>-	char *hostname;</div><div class='del'>-	int port;</div><div class='del'>-};</div><div class='del'>-typedef struct gd1_mgmt_probe_req gd1_mgmt_probe_req;</div><div class='del'>-</div><div class='del'>-struct gd1_mgmt_probe_rsp {</div><div class='del'>-	u_char uuid[16];</div><div class='del'>-	char *hostname;</div><div class='del'>-	int port;</div><div class='del'>-};</div><div class='del'>-typedef struct gd1_mgmt_probe_rsp gd1_mgmt_probe_rsp;</div><div class='del'>-</div><div class='del'>-struct gd1_mgmt_friend_req {</div><div class='del'>-	u_char uuid[16];</div><div class='del'>-	char *hostname;</div><div class='del'>-	int port;</div><div class='del'>-	struct {</div><div class='del'>-		u_int vols_len;</div><div class='del'>-		char *vols_val;</div><div class='del'>-	} vols;</div><div class='del'>-};</div><div class='del'>-typedef struct gd1_mgmt_friend_req gd1_mgmt_friend_req;</div><div class='del'>-</div><div class='del'>-struct gd1_mgmt_friend_rsp {</div><div class='del'>-	u_char uuid[16];</div><div class='del'>-	char *hostname;</div><div class='del'>-	int op_ret;</div><div class='del'>-	int op_errno;</div><div class='del'>-	int port;</div><div class='del'>-};</div><div class='del'>-typedef struct gd1_mgmt_friend_rsp gd1_mgmt_friend_rsp;</div><div class='del'>-</div><div class='del'>-struct gd1_mgmt_unfriend_req {</div><div class='del'>-	u_char uuid[16];</div><div class='del'>-	char *hostname;</div><div class='del'>-	int port;</div><div class='del'>-};</div><div class='del'>-typedef struct gd1_mgmt_unfriend_req gd1_mgmt_unfriend_req;</div><div class='del'>-</div><div class='del'>-struct gd1_mgmt_unfriend_rsp {</div><div class='del'>-	u_char uuid[16];</div><div class='del'>-	char *hostname;</div><div class='del'>-	int op_ret;</div><div class='del'>-	int op_errno;</div><div class='del'>-	int port;</div><div class='del'>-};</div><div class='del'>-typedef struct gd1_mgmt_unfriend_rsp gd1_mgmt_unfriend_rsp;</div><div class='del'>-</div><div class='del'>-struct gd1_mgmt_cluster_lock_req {</div><div class='del'>-	u_char uuid[16];</div><div class='del'>-};</div><div class='del'>-typedef struct gd1_mgmt_cluster_lock_req gd1_mgmt_cluster_lock_req;</div><div class='del'>-</div><div class='del'>-struct gd1_mgmt_cluster_lock_rsp {</div><div class='del'>-	u_char uuid[16];</div><div class='del'>-	int op_ret;</div><div class='del'>-	int op_errno;</div><div class='del'>-};</div><div class='del'>-typedef struct gd1_mgmt_cluster_lock_rsp gd1_mgmt_cluster_lock_rsp;</div><div class='del'>-</div><div class='del'>-struct gd1_mgmt_cluster_unlock_req {</div><div class='del'>-	u_char uuid[16];</div><div class='del'>-};</div><div class='del'>-typedef struct gd1_mgmt_cluster_unlock_req gd1_mgmt_cluster_unlock_req;</div><div class='del'>-</div><div class='del'>-struct gd1_mgmt_cluster_unlock_rsp {</div><div class='del'>-	u_char uuid[16];</div><div class='del'>-	int op_ret;</div><div class='del'>-	int op_errno;</div><div class='del'>-};</div><div class='del'>-typedef struct gd1_mgmt_cluster_unlock_rsp gd1_mgmt_cluster_unlock_rsp;</div><div class='del'>-</div><div class='del'>-struct gd1_mgmt_stage_op_req {</div><div class='del'>-	u_char uuid[16];</div><div class='del'>-	int op;</div><div class='del'>-	struct {</div><div class='del'>-		u_int buf_len;</div><div class='del'>-		char *buf_val;</div><div class='del'>-	} buf;</div><div class='del'>-};</div><div class='del'>-typedef struct gd1_mgmt_stage_op_req gd1_mgmt_stage_op_req;</div><div class='del'>-</div><div class='del'>-struct gd1_mgmt_stage_op_rsp {</div><div class='del'>-	u_char uuid[16];</div><div class='del'>-	int op;</div><div class='del'>-	int op_ret;</div><div class='del'>-	int op_errno;</div><div class='del'>-};</div><div class='del'>-typedef struct gd1_mgmt_stage_op_rsp gd1_mgmt_stage_op_rsp;</div><div class='del'>-</div><div class='del'>-struct gd1_mgmt_commit_op_req {</div><div class='del'>-	u_char uuid[16];</div><div class='del'>-	int op;</div><div class='del'>-	struct {</div><div class='del'>-		u_int buf_len;</div><div class='del'>-		char *buf_val;</div><div class='del'>-	} buf;</div><div class='del'>-};</div><div class='del'>-typedef struct gd1_mgmt_commit_op_req gd1_mgmt_commit_op_req;</div><div class='del'>-</div><div class='del'>-struct gd1_mgmt_commit_op_rsp {</div><div class='del'>-	u_char uuid[16];</div><div class='del'>-	int op;</div><div class='del'>-	int op_ret;</div><div class='del'>-	int op_errno;</div><div class='del'>-};</div><div class='del'>-typedef struct gd1_mgmt_commit_op_rsp gd1_mgmt_commit_op_rsp;</div><div class='del'>-</div><div class='del'>-struct gd1_mgmt_friend_update {</div><div class='del'>-	u_char uuid[16];</div><div class='del'>-	struct {</div><div class='del'>-		u_int friends_len;</div><div class='del'>-		char *friends_val;</div><div class='del'>-	} friends;</div><div class='del'>-	int port;</div><div class='del'>-};</div><div class='del'>-typedef struct gd1_mgmt_friend_update gd1_mgmt_friend_update;</div><div class='del'>-</div><div class='del'>-struct gd1_mgmt_friend_update_rsp {</div><div class='del'>-	u_char uuid[16];</div><div class='del'>-	int op;</div><div class='del'>-	int op_ret;</div><div class='del'>-	int op_errno;</div><div class='del'>-};</div><div class='del'>-typedef struct gd1_mgmt_friend_update_rsp gd1_mgmt_friend_update_rsp;</div><div class='del'>-</div><div class='del'>-/* the xdr functions */</div><div class='del'>-</div><div class='del'>-#if defined(__STDC__) || defined(__cplusplus)</div><div class='del'>-extern  bool_t xdr_glusterd_volume_status (XDR *, glusterd_volume_status*);</div><div class='del'>-extern  bool_t xdr_gd1_mgmt_probe_req (XDR *, gd1_mgmt_probe_req*);</div><div class='del'>-extern  bool_t xdr_gd1_mgmt_probe_rsp (XDR *, gd1_mgmt_probe_rsp*);</div><div class='del'>-extern  bool_t xdr_gd1_mgmt_friend_req (XDR *, gd1_mgmt_friend_req*);</div><div class='del'>-extern  bool_t xdr_gd1_mgmt_friend_rsp (XDR *, gd1_mgmt_friend_rsp*);</div><div class='del'>-extern  bool_t xdr_gd1_mgmt_unfriend_req (XDR *, gd1_mgmt_unfriend_req*);</div><div class='del'>-extern  bool_t xdr_gd1_mgmt_unfriend_rsp (XDR *, gd1_mgmt_unfriend_rsp*);</div><div class='del'>-extern  bool_t xdr_gd1_mgmt_cluster_lock_req (XDR *, gd1_mgmt_cluster_lock_req*);</div><div class='del'>-extern  bool_t xdr_gd1_mgmt_cluster_lock_rsp (XDR *, gd1_mgmt_cluster_lock_rsp*);</div><div class='del'>-extern  bool_t xdr_gd1_mgmt_cluster_unlock_req (XDR *, gd1_mgmt_cluster_unlock_req*);</div><div class='del'>-extern  bool_t xdr_gd1_mgmt_cluster_unlock_rsp (XDR *, gd1_mgmt_cluster_unlock_rsp*);</div><div class='del'>-extern  bool_t xdr_gd1_mgmt_stage_op_req (XDR *, gd1_mgmt_stage_op_req*);</div><div class='del'>-extern  bool_t xdr_gd1_mgmt_stage_op_rsp (XDR *, gd1_mgmt_stage_op_rsp*);</div><div class='del'>-extern  bool_t xdr_gd1_mgmt_commit_op_req (XDR *, gd1_mgmt_commit_op_req*);</div><div class='del'>-extern  bool_t xdr_gd1_mgmt_commit_op_rsp (XDR *, gd1_mgmt_commit_op_rsp*);</div><div class='del'>-extern  bool_t xdr_gd1_mgmt_friend_update (XDR *, gd1_mgmt_friend_update*);</div><div class='del'>-extern  bool_t xdr_gd1_mgmt_friend_update_rsp (XDR *, gd1_mgmt_friend_update_rsp*);</div><div class='del'>-</div><div class='del'>-#else /* K&amp;R C */</div><div class='del'>-extern bool_t xdr_glusterd_volume_status ();</div><div class='del'>-extern bool_t xdr_gd1_mgmt_probe_req ();</div><div class='del'>-extern bool_t xdr_gd1_mgmt_probe_rsp ();</div><div class='del'>-extern bool_t xdr_gd1_mgmt_friend_req ();</div><div class='del'>-extern bool_t xdr_gd1_mgmt_friend_rsp ();</div><div class='del'>-extern bool_t xdr_gd1_mgmt_unfriend_req ();</div><div class='del'>-extern bool_t xdr_gd1_mgmt_unfriend_rsp ();</div><div class='del'>-extern bool_t xdr_gd1_mgmt_cluster_lock_req ();</div><div class='del'>-extern bool_t xdr_gd1_mgmt_cluster_lock_rsp ();</div><div class='del'>-extern bool_t xdr_gd1_mgmt_cluster_unlock_req ();</div><div class='del'>-extern bool_t xdr_gd1_mgmt_cluster_unlock_rsp ();</div><div class='del'>-extern bool_t xdr_gd1_mgmt_stage_op_req ();</div><div class='del'>-extern bool_t xdr_gd1_mgmt_stage_op_rsp ();</div><div class='del'>-extern bool_t xdr_gd1_mgmt_commit_op_req ();</div><div class='del'>-extern bool_t xdr_gd1_mgmt_commit_op_rsp ();</div><div class='del'>-extern bool_t xdr_gd1_mgmt_friend_update ();</div><div class='del'>-extern bool_t xdr_gd1_mgmt_friend_update_rsp ();</div><div class='del'>-</div><div class='del'>-#endif /* K&amp;R C */</div><div class='del'>-</div><div class='del'>-#ifdef __cplusplus</div><div class='del'>-}</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-#endif /* !_GLUSTERD1_H_RPCGEN */</div><div class='head'>diff --git a/rpc/xdr/src/glusterd1-xdr.x b/rpc/xdr/src/glusterd1-xdr.x<br/>new file mode 100644<br/>index 00000000000..b631dea3502<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/rpc/xdr/src/glusterd1-xdr.x?id=d1d7a6f35c816822fab51c820e25023863c239c1'>rpc/xdr/src/glusterd1-xdr.x</a></div><div class='hunk'>@@ -0,0 +1,249 @@</div><div class='add'>+/*</div><div class='add'>+ * Copyright (c) 2012 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+ * This file is part of GlusterFS.</div><div class='add'>+ *</div><div class='add'>+ * This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+ * General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+ * later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+ * cases as published by the Free Software Foundation.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+#ifdef RPC_XDR</div><div class='add'>+%#include "rpc-pragmas.h"</div><div class='add'>+#endif</div><div class='add'>+%#include &lt;glusterfs/compat.h&gt;</div><div class='add'>+</div><div class='add'>+ enum glusterd_volume_status {</div><div class='add'>+        GLUSTERD_STATUS_NONE = 0,</div><div class='add'>+        GLUSTERD_STATUS_STARTED,</div><div class='add'>+        GLUSTERD_STATUS_STOPPED</div><div class='add'>+} ;</div><div class='add'>+</div><div class='add'>+ struct gd1_mgmt_probe_req {</div><div class='add'>+        unsigned char  uuid[16];</div><div class='add'>+        string  hostname&lt;&gt;;</div><div class='add'>+        int     port;</div><div class='add'>+}  ;</div><div class='add'>+</div><div class='add'>+ struct gd1_mgmt_probe_rsp {</div><div class='add'>+        unsigned char  uuid[16];</div><div class='add'>+        string  hostname&lt;&gt;;</div><div class='add'>+        int     port;</div><div class='add'>+        int     op_ret;</div><div class='add'>+        int     op_errno;</div><div class='add'>+        string op_errstr&lt;&gt;;</div><div class='add'>+}  ;</div><div class='add'>+</div><div class='add'>+struct gd1_mgmt_friend_req {</div><div class='add'>+        unsigned char  uuid[16];</div><div class='add'>+        string  hostname&lt;&gt;;</div><div class='add'>+        int     port;</div><div class='add'>+        opaque  vols&lt;&gt;;</div><div class='add'>+}  ;</div><div class='add'>+</div><div class='add'>+struct gd1_mgmt_friend_rsp {</div><div class='add'>+        unsigned char  uuid[16];</div><div class='add'>+        string  hostname&lt;&gt;;</div><div class='add'>+        int     op_ret;</div><div class='add'>+        int     op_errno;</div><div class='add'>+        int     port;</div><div class='add'>+}  ;</div><div class='add'>+</div><div class='add'>+struct gd1_mgmt_unfriend_req {</div><div class='add'>+        unsigned char  uuid[16];</div><div class='add'>+        string  hostname&lt;&gt;;</div><div class='add'>+        int     port;</div><div class='add'>+}  ;</div><div class='add'>+</div><div class='add'>+struct gd1_mgmt_unfriend_rsp {</div><div class='add'>+        unsigned char  uuid[16];</div><div class='add'>+        string  hostname&lt;&gt;;</div><div class='add'>+        int     op_ret;</div><div class='add'>+        int     op_errno;</div><div class='add'>+        int     port;</div><div class='add'>+}  ;</div><div class='add'>+</div><div class='add'>+struct gd1_mgmt_cluster_lock_req {</div><div class='add'>+        unsigned char  uuid[16];</div><div class='add'>+}  ;</div><div class='add'>+</div><div class='add'>+struct gd1_mgmt_cluster_lock_rsp {</div><div class='add'>+        unsigned char  uuid[16];</div><div class='add'>+        int     op_ret;</div><div class='add'>+        int     op_errno;</div><div class='add'>+}  ;</div><div class='add'>+</div><div class='add'>+struct gd1_mgmt_cluster_unlock_req {</div><div class='add'>+        unsigned char  uuid[16];</div><div class='add'>+}  ;</div><div class='add'>+</div><div class='add'>+struct gd1_mgmt_cluster_unlock_rsp {</div><div class='add'>+        unsigned char  uuid[16];</div><div class='add'>+        int     op_ret;</div><div class='add'>+        int     op_errno;</div><div class='add'>+}  ;</div><div class='add'>+</div><div class='add'>+struct gd1_mgmt_stage_op_req {</div><div class='add'>+        unsigned char  uuid[16];</div><div class='add'>+        int     op;</div><div class='add'>+        opaque  buf&lt;&gt;;</div><div class='add'>+}  ;</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+struct gd1_mgmt_stage_op_rsp {</div><div class='add'>+        unsigned char  uuid[16];</div><div class='add'>+        int     op;</div><div class='add'>+        int     op_ret;</div><div class='add'>+        int     op_errno;</div><div class='add'>+        string  op_errstr&lt;&gt;;</div><div class='add'>+        opaque  dict&lt;&gt;;</div><div class='add'>+}  ;</div><div class='add'>+</div><div class='add'>+struct gd1_mgmt_commit_op_req {</div><div class='add'>+        unsigned char  uuid[16];</div><div class='add'>+        int     op;</div><div class='add'>+        opaque  buf&lt;&gt;;</div><div class='add'>+}  ;</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+struct gd1_mgmt_commit_op_rsp {</div><div class='add'>+        unsigned char  uuid[16];</div><div class='add'>+        int     op;</div><div class='add'>+        int     op_ret;</div><div class='add'>+        int     op_errno;</div><div class='add'>+        opaque  dict&lt;&gt;;</div><div class='add'>+        string  op_errstr&lt;&gt;;</div><div class='add'>+}  ;</div><div class='add'>+</div><div class='add'>+struct gd1_mgmt_friend_update {</div><div class='add'>+        unsigned char uuid[16];</div><div class='add'>+        opaque  friends&lt;&gt;;</div><div class='add'>+        int     port;</div><div class='add'>+} ;</div><div class='add'>+</div><div class='add'>+struct gd1_mgmt_friend_update_rsp {</div><div class='add'>+        unsigned char  uuid[16];</div><div class='add'>+        int     op;</div><div class='add'>+        int     op_ret;</div><div class='add'>+        int     op_errno;</div><div class='add'>+}  ;</div><div class='add'>+</div><div class='add'>+struct gd1_mgmt_brick_op_req {</div><div class='add'>+        string  name&lt;&gt;;</div><div class='add'>+        int     op;</div><div class='add'>+        opaque  input&lt;&gt;;</div><div class='add'>+        opaque  dict&lt;&gt;;</div><div class='add'>+} ;</div><div class='add'>+</div><div class='add'>+struct gd1_mgmt_brick_op_rsp {</div><div class='add'>+        int     op_ret;</div><div class='add'>+        int     op_errno;</div><div class='add'>+        opaque  output&lt;&gt;;</div><div class='add'>+        string  op_errstr&lt;&gt;;</div><div class='add'>+} ;</div><div class='add'>+</div><div class='add'>+struct gd1_mgmt_v3_lock_req {</div><div class='add'>+        unsigned char  uuid[16];</div><div class='add'>+        unsigned char  txn_id[16];</div><div class='add'>+        int            op;</div><div class='add'>+        opaque         dict&lt;&gt;;</div><div class='add'>+}  ;</div><div class='add'>+</div><div class='add'>+struct gd1_mgmt_v3_lock_rsp {</div><div class='add'>+        unsigned char  uuid[16];</div><div class='add'>+        unsigned char  txn_id[16];</div><div class='add'>+        opaque         dict&lt;&gt;;</div><div class='add'>+        int            op_ret;</div><div class='add'>+        int            op_errno;</div><div class='add'>+}  ;</div><div class='add'>+</div><div class='add'>+struct gd1_mgmt_v3_pre_val_req {</div><div class='add'>+        unsigned char  uuid[16];</div><div class='add'>+        int     op;</div><div class='add'>+        opaque  dict&lt;&gt;;</div><div class='add'>+}  ;</div><div class='add'>+</div><div class='add'>+struct gd1_mgmt_v3_pre_val_rsp {</div><div class='add'>+        unsigned char  uuid[16];</div><div class='add'>+        int     op;</div><div class='add'>+        int     op_ret;</div><div class='add'>+        int     op_errno;</div><div class='add'>+        string  op_errstr&lt;&gt;;</div><div class='add'>+        opaque  dict&lt;&gt;;</div><div class='add'>+}  ;</div><div class='add'>+</div><div class='add'>+struct gd1_mgmt_v3_brick_op_req {</div><div class='add'>+        unsigned char  uuid[16];</div><div class='add'>+        int     op;</div><div class='add'>+        opaque  dict&lt;&gt;;</div><div class='add'>+}  ;</div><div class='add'>+</div><div class='add'>+struct gd1_mgmt_v3_brick_op_rsp {</div><div class='add'>+        unsigned char  uuid[16];</div><div class='add'>+        int     op;</div><div class='add'>+        int     op_ret;</div><div class='add'>+        int     op_errno;</div><div class='add'>+        string  op_errstr&lt;&gt;;</div><div class='add'>+        opaque  dict&lt;&gt;;</div><div class='add'>+}  ;</div><div class='add'>+</div><div class='add'>+struct gd1_mgmt_v3_commit_req {</div><div class='add'>+        unsigned char  uuid[16];</div><div class='add'>+        int     op;</div><div class='add'>+        opaque  dict&lt;&gt;;</div><div class='add'>+}  ;</div><div class='add'>+</div><div class='add'>+struct gd1_mgmt_v3_commit_rsp {</div><div class='add'>+        unsigned char  uuid[16];</div><div class='add'>+        int     op;</div><div class='add'>+        int     op_ret;</div><div class='add'>+        int     op_errno;</div><div class='add'>+        opaque  dict&lt;&gt;;</div><div class='add'>+        string  op_errstr&lt;&gt;;</div><div class='add'>+}  ;</div><div class='add'>+</div><div class='add'>+struct gd1_mgmt_v3_post_commit_req {</div><div class='add'>+        unsigned char  uuid[16];</div><div class='add'>+        int     op;</div><div class='add'>+        opaque  dict&lt;&gt;;</div><div class='add'>+}  ;</div><div class='add'>+</div><div class='add'>+struct gd1_mgmt_v3_post_commit_rsp {</div><div class='add'>+        unsigned char  uuid[16];</div><div class='add'>+        int     op;</div><div class='add'>+        int     op_ret;</div><div class='add'>+        int     op_errno;</div><div class='add'>+        opaque  dict&lt;&gt;;</div><div class='add'>+        string  op_errstr&lt;&gt;;</div><div class='add'>+}  ;</div><div class='add'>+</div><div class='add'>+struct gd1_mgmt_v3_post_val_req {</div><div class='add'>+        unsigned char  uuid[16];</div><div class='add'>+        int     op;</div><div class='add'>+        int     op_ret;</div><div class='add'>+        opaque  dict&lt;&gt;;</div><div class='add'>+}  ;</div><div class='add'>+</div><div class='add'>+struct gd1_mgmt_v3_post_val_rsp {</div><div class='add'>+        unsigned char  uuid[16];</div><div class='add'>+        int     op;</div><div class='add'>+        int     op_ret;</div><div class='add'>+        int     op_errno;</div><div class='add'>+        string  op_errstr&lt;&gt;;</div><div class='add'>+        opaque  dict&lt;&gt;;</div><div class='add'>+}  ;</div><div class='add'>+</div><div class='add'>+struct gd1_mgmt_v3_unlock_req {</div><div class='add'>+        unsigned char  uuid[16];</div><div class='add'>+        unsigned char  txn_id[16];</div><div class='add'>+        int            op;</div><div class='add'>+        opaque         dict&lt;&gt;;</div><div class='add'>+}  ;</div><div class='add'>+</div><div class='add'>+struct gd1_mgmt_v3_unlock_rsp {</div><div class='add'>+        unsigned char  uuid[16];</div><div class='add'>+        unsigned char  txn_id[16];</div><div class='add'>+        opaque         dict&lt;&gt;;</div><div class='add'>+        int            op_ret;</div><div class='add'>+        int            op_errno;</div><div class='add'>+}  ;</div><div class='head'>diff --git a/rpc/xdr/src/glusterd1.c b/rpc/xdr/src/glusterd1.c<br/>deleted file mode 100644<br/>index b71ddd16ddf..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/rpc/xdr/src/glusterd1.c?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>rpc/xdr/src/glusterd1.c</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,234 +0,0 @@</div><div class='del'>-/*</div><div class='del'>-  Copyright (c) 2007-2010 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='del'>-  This file is part of GlusterFS.</div><div class='del'>-</div><div class='del'>-  GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-  it under the terms of the GNU Affero General Public License as published</div><div class='del'>-  by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-  or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-  GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-  WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-  Affero General Public License for more details.</div><div class='del'>-</div><div class='del'>-  You should have received a copy of the GNU Affero General Public License</div><div class='del'>-  along with this program.  If not, see</div><div class='del'>-  &lt;http://www.gnu.org/licenses/&gt;.</div><div class='del'>-*/</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-#include "glusterd1.h"</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-gd_xdr_serialize_mgmt_probe_rsp (struct iovec outmsg, void *rsp)</div><div class='del'>-{</div><div class='del'>-        return xdr_serialize_generic (outmsg, (void *)rsp,</div><div class='del'>-                                      (xdrproc_t)xdr_gd1_mgmt_probe_rsp);</div><div class='del'>-</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-gd_xdr_serialize_mgmt_friend_rsp (struct iovec outmsg, void *rsp)</div><div class='del'>-{</div><div class='del'>-        return xdr_serialize_generic (outmsg, (void *)rsp,</div><div class='del'>-                                      (xdrproc_t)xdr_gd1_mgmt_friend_rsp);</div><div class='del'>-</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-gd_xdr_serialize_mgmt_cluster_lock_rsp (struct iovec outmsg, void *rsp)</div><div class='del'>-{</div><div class='del'>-        return xdr_serialize_generic (outmsg, (void *)rsp,</div><div class='del'>-                                (xdrproc_t)xdr_gd1_mgmt_cluster_lock_rsp);</div><div class='del'>-</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-gd_xdr_serialize_mgmt_cluster_unlock_rsp (struct iovec outmsg, void *rsp)</div><div class='del'>-{</div><div class='del'>-        return xdr_serialize_generic (outmsg, (void *)rsp,</div><div class='del'>-                                (xdrproc_t)xdr_gd1_mgmt_cluster_unlock_rsp);</div><div class='del'>-</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-gd_xdr_serialize_mgmt_stage_op_rsp (struct iovec outmsg, void *rsp)</div><div class='del'>-{</div><div class='del'>-        return xdr_serialize_generic (outmsg, (void *)rsp,</div><div class='del'>-                                (xdrproc_t)xdr_gd1_mgmt_stage_op_rsp);</div><div class='del'>-</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-gd_xdr_serialize_mgmt_commit_op_rsp (struct iovec outmsg, void *rsp)</div><div class='del'>-{</div><div class='del'>-        return xdr_serialize_generic (outmsg, (void *)rsp,</div><div class='del'>-                                (xdrproc_t)xdr_gd1_mgmt_commit_op_rsp);</div><div class='del'>-</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-gd_xdr_serialize_mgmt_friend_update_rsp (struct iovec outmsg, void *rsp)</div><div class='del'>-{</div><div class='del'>-        return xdr_serialize_generic (outmsg, (void *)rsp,</div><div class='del'>-                                (xdrproc_t)xdr_gd1_mgmt_friend_update_rsp);</div><div class='del'>-</div><div class='del'>-}</div><div class='del'>-/* Decode */</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-gd_xdr_to_mgmt_probe_req (struct iovec inmsg, void *args)</div><div class='del'>-{</div><div class='del'>-        return xdr_to_generic (inmsg, (void *)args,</div><div class='del'>-                               (xdrproc_t)xdr_gd1_mgmt_probe_req);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-gd_xdr_to_mgmt_friend_req (struct iovec inmsg, void *args)</div><div class='del'>-{</div><div class='del'>-        return xdr_to_generic (inmsg, (void *)args,</div><div class='del'>-                               (xdrproc_t)xdr_gd1_mgmt_friend_req);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-gd_xdr_to_mgmt_friend_update (struct iovec inmsg, void *args)</div><div class='del'>-{</div><div class='del'>-        return xdr_to_generic (inmsg, (void *)args,</div><div class='del'>-                               (xdrproc_t)xdr_gd1_mgmt_friend_update);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-gd_xdr_to_mgmt_cluster_lock_req (struct iovec inmsg, void *args)</div><div class='del'>-{</div><div class='del'>-        return xdr_to_generic (inmsg, (void *)args,</div><div class='del'>-                               (xdrproc_t)xdr_gd1_mgmt_cluster_lock_req);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-gd_xdr_to_mgmt_cluster_unlock_req (struct iovec inmsg, void *args)</div><div class='del'>-{</div><div class='del'>-        return xdr_to_generic (inmsg, (void *)args,</div><div class='del'>-                               (xdrproc_t)xdr_gd1_mgmt_cluster_unlock_req);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-gd_xdr_to_mgmt_stage_op_req (struct iovec inmsg, void *args)</div><div class='del'>-{</div><div class='del'>-        return xdr_to_generic (inmsg, (void *)args,</div><div class='del'>-                               (xdrproc_t)xdr_gd1_mgmt_stage_op_req);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-gd_xdr_to_mgmt_commit_op_req (struct iovec inmsg, void *args)</div><div class='del'>-{</div><div class='del'>-        return xdr_to_generic (inmsg, (void *)args,</div><div class='del'>-                               (xdrproc_t)xdr_gd1_mgmt_commit_op_req);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-gd_xdr_to_mgmt_probe_rsp (struct iovec inmsg, void *args)</div><div class='del'>-{</div><div class='del'>-        return xdr_to_generic (inmsg, (void *)args,</div><div class='del'>-                               (xdrproc_t)xdr_gd1_mgmt_probe_rsp);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-gd_xdr_to_mgmt_friend_rsp (struct iovec inmsg, void *args)</div><div class='del'>-{</div><div class='del'>-        return xdr_to_generic (inmsg, (void *)args,</div><div class='del'>-                               (xdrproc_t)xdr_gd1_mgmt_friend_rsp);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-gd_xdr_to_mgmt_cluster_lock_rsp (struct iovec inmsg, void *args)</div><div class='del'>-{</div><div class='del'>-        return xdr_to_generic (inmsg, (void *)args,</div><div class='del'>-                               (xdrproc_t)xdr_gd1_mgmt_cluster_lock_rsp);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-gd_xdr_to_mgmt_cluster_unlock_rsp (struct iovec inmsg, void *args)</div><div class='del'>-{</div><div class='del'>-        return xdr_to_generic (inmsg, (void *)args,</div><div class='del'>-                               (xdrproc_t)xdr_gd1_mgmt_cluster_unlock_rsp);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-gd_xdr_to_mgmt_stage_op_rsp (struct iovec inmsg, void *args)</div><div class='del'>-{</div><div class='del'>-        return xdr_to_generic (inmsg, (void *)args,</div><div class='del'>-                               (xdrproc_t)xdr_gd1_mgmt_stage_op_rsp);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-gd_xdr_to_mgmt_commit_op_rsp (struct iovec inmsg, void *args)</div><div class='del'>-{</div><div class='del'>-        return xdr_to_generic (inmsg, (void *)args,</div><div class='del'>-                               (xdrproc_t)xdr_gd1_mgmt_commit_op_rsp);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-gd_xdr_to_mgmt_friend_update_rsp (struct iovec inmsg, void *args)</div><div class='del'>-{</div><div class='del'>-        return xdr_to_generic (inmsg, (void *)args,</div><div class='del'>-                               (xdrproc_t)xdr_gd1_mgmt_friend_update_rsp);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-gd_xdr_from_mgmt_probe_req (struct iovec outmsg, void *req)</div><div class='del'>-{</div><div class='del'>-        return xdr_serialize_generic (outmsg, (void *)req,</div><div class='del'>-                                      (xdrproc_t)xdr_gd1_mgmt_probe_req);</div><div class='del'>-</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-gd_xdr_from_mgmt_friend_update (struct iovec outmsg, void *req)</div><div class='del'>-{</div><div class='del'>-        return xdr_serialize_generic (outmsg, (void *)req,</div><div class='del'>-                                      (xdrproc_t)xdr_gd1_mgmt_friend_update);</div><div class='del'>-</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-gd_xdr_from_mgmt_friend_req (struct iovec outmsg, void *req)</div><div class='del'>-{</div><div class='del'>-        return xdr_serialize_generic (outmsg, (void *)req,</div><div class='del'>-                                      (xdrproc_t)xdr_gd1_mgmt_friend_req);</div><div class='del'>-</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-gd_xdr_from_mgmt_cluster_lock_req (struct iovec outmsg, void *req)</div><div class='del'>-{</div><div class='del'>-        return xdr_serialize_generic (outmsg, (void *)req,</div><div class='del'>-                                      (xdrproc_t)xdr_gd1_mgmt_cluster_lock_req);</div><div class='del'>-</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-gd_xdr_from_mgmt_cluster_unlock_req (struct iovec outmsg, void *req)</div><div class='del'>-{</div><div class='del'>-        return xdr_serialize_generic (outmsg, (void *)req,</div><div class='del'>-                                      (xdrproc_t)xdr_gd1_mgmt_cluster_unlock_req);</div><div class='del'>-</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-gd_xdr_from_mgmt_stage_op_req (struct iovec outmsg, void *req)</div><div class='del'>-{</div><div class='del'>-        return xdr_serialize_generic (outmsg, (void *)req,</div><div class='del'>-                                      (xdrproc_t)xdr_gd1_mgmt_stage_op_req);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-gd_xdr_from_mgmt_commit_op_req (struct iovec outmsg, void *req)</div><div class='del'>-{</div><div class='del'>-        return xdr_serialize_generic (outmsg, (void *)req,</div><div class='del'>-                                      (xdrproc_t)xdr_gd1_mgmt_commit_op_req);</div><div class='del'>-}</div><div class='head'>diff --git a/rpc/xdr/src/glusterd1.h b/rpc/xdr/src/glusterd1.h<br/>deleted file mode 100644<br/>index 39493c47622..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/rpc/xdr/src/glusterd1.h?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>rpc/xdr/src/glusterd1.h</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,112 +0,0 @@</div><div class='del'>-/*</div><div class='del'>-  Copyright (c) 2007-2010 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='del'>-  This file is part of GlusterFS.</div><div class='del'>-</div><div class='del'>-  GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-  it under the terms of the GNU Affero General Public License as published</div><div class='del'>-  by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-  or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-  GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-  WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-  Affero General Public License for more details.</div><div class='del'>-</div><div class='del'>-  You should have received a copy of the GNU Affero General Public License</div><div class='del'>-  along with this program.  If not, see</div><div class='del'>-  &lt;http://www.gnu.org/licenses/&gt;.</div><div class='del'>-*/</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-#ifndef _GLUSTERD1_H</div><div class='del'>-#define _GLUSTERD1_H</div><div class='del'>-</div><div class='del'>-#include &lt;sys/uio.h&gt;</div><div class='del'>-</div><div class='del'>-#include "xdr-generic.h"</div><div class='del'>-#include "glusterd1-xdr.h"</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-gd_xdr_to_mgmt_probe_req (struct iovec inmsg, void *args);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-gd_xdr_to_mgmt_probe_rsp (struct iovec inmsg, void *args);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-gd_xdr_serialize_mgmt_probe_rsp (struct iovec outmsg, void *rsp);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-gd_xdr_from_mgmt_probe_req (struct iovec outmsg, void *req);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-gd_xdr_to_mgmt_friend_req (struct iovec inmsg, void *args);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-gd_xdr_to_mgmt_friend_rsp (struct iovec inmsg, void *args);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-gd_xdr_serialize_mgmt_friend_rsp (struct iovec outmsg, void *rsp);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-gd_xdr_from_mgmt_friend_req (struct iovec outmsg, void *req);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-gd_xdr_to_mgmt_cluster_lock_req (struct iovec inmsg, void *args);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-gd_xdr_to_mgmt_cluster_lock_rsp (struct iovec inmsg, void *args);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-gd_xdr_serialize_mgmt_cluster_lock_rsp (struct iovec outmsg, void *rsp);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-gd_xdr_from_mgmt_cluster_lock_req (struct iovec outmsg, void *req);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-gd_xdr_to_mgmt_cluster_unlock_req (struct iovec inmsg, void *args);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-gd_xdr_to_mgmt_cluster_unlock_rsp (struct iovec inmsg, void *args);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-gd_xdr_serialize_mgmt_cluster_unlock_rsp (struct iovec outmsg, void *rsp);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-gd_xdr_from_mgmt_cluster_unlock_req (struct iovec outmsg, void *req);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-gd_xdr_to_mgmt_stage_op_req (struct iovec inmsg, void *args);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-gd_xdr_to_mgmt_stage_op_rsp (struct iovec inmsg, void *args);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-gd_xdr_serialize_mgmt_stage_op_rsp (struct iovec outmsg, void *rsp);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-gd_xdr_from_mgmt_stage_op_req (struct iovec outmsg, void *req);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-gd_xdr_to_mgmt_commit_op_req (struct iovec inmsg, void *args);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-gd_xdr_to_mgmt_commit_op_rsp (struct iovec inmsg, void *args);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-gd_xdr_serialize_mgmt_commit_op_rsp (struct iovec outmsg, void *rsp);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-gd_xdr_from_mgmt_commit_op_req (struct iovec outmsg, void *req);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-gd_xdr_to_mgmt_friend_update (struct iovec outmsg, void *req);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-gd_xdr_from_mgmt_friend_update (struct iovec outmsg, void *req);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-gd_xdr_serialize_mgmt_friend_update_rsp (struct iovec outmsg, void *rsp);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-gd_xdr_to_mgmt_friend_update_rsp (struct iovec inmsg, void *args);</div><div class='del'>-#endif /* !_MSG_GD_XDR_H */</div><div class='head'>diff --git a/rpc/xdr/src/glusterd1.x b/rpc/xdr/src/glusterd1.x<br/>deleted file mode 100644<br/>index 19fa7af688b..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/rpc/xdr/src/glusterd1.x?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>rpc/xdr/src/glusterd1.x</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,107 +0,0 @@</div><div class='del'>- enum glusterd_volume_status {</div><div class='del'>-        GLUSTERD_STATUS_NONE = 0,</div><div class='del'>-        GLUSTERD_STATUS_STARTED,</div><div class='del'>-        GLUSTERD_STATUS_STOPPED</div><div class='del'>-} ;</div><div class='del'>-</div><div class='del'>- struct gd1_mgmt_probe_req {</div><div class='del'>-        unsigned char  uuid[16];</div><div class='del'>-        string  hostname&lt;&gt;;</div><div class='del'>-        int     port;</div><div class='del'>-}  ;</div><div class='del'>-</div><div class='del'>- struct gd1_mgmt_probe_rsp {</div><div class='del'>-        unsigned char  uuid[16];</div><div class='del'>-        string  hostname&lt;&gt;;</div><div class='del'>-        int     port;</div><div class='del'>-}  ;</div><div class='del'>-</div><div class='del'>-struct gd1_mgmt_friend_req {</div><div class='del'>-        unsigned char  uuid[16];</div><div class='del'>-        string  hostname&lt;&gt;;</div><div class='del'>-        int     port;</div><div class='del'>-        opaque  vols&lt;&gt;;</div><div class='del'>-}  ;</div><div class='del'>-</div><div class='del'>-struct gd1_mgmt_friend_rsp {</div><div class='del'>-        unsigned char  uuid[16];</div><div class='del'>-        string  hostname&lt;&gt;;</div><div class='del'>-        int     op_ret;</div><div class='del'>-        int     op_errno;</div><div class='del'>-        int     port;</div><div class='del'>-}  ;</div><div class='del'>-</div><div class='del'>-struct gd1_mgmt_unfriend_req {</div><div class='del'>-        unsigned char  uuid[16];</div><div class='del'>-        string  hostname&lt;&gt;;</div><div class='del'>-        int     port;</div><div class='del'>-}  ;</div><div class='del'>-</div><div class='del'>-struct gd1_mgmt_unfriend_rsp {</div><div class='del'>-        unsigned char  uuid[16];</div><div class='del'>-        string  hostname&lt;&gt;;</div><div class='del'>-        int     op_ret;</div><div class='del'>-        int     op_errno;</div><div class='del'>-        int     port;</div><div class='del'>-}  ;</div><div class='del'>-</div><div class='del'>-struct gd1_mgmt_cluster_lock_req {</div><div class='del'>-        unsigned char  uuid[16];</div><div class='del'>-}  ;</div><div class='del'>-</div><div class='del'>-struct gd1_mgmt_cluster_lock_rsp {</div><div class='del'>-        unsigned char  uuid[16];</div><div class='del'>-        int     op_ret;</div><div class='del'>-        int     op_errno;</div><div class='del'>-}  ;</div><div class='del'>-</div><div class='del'>-struct gd1_mgmt_cluster_unlock_req {</div><div class='del'>-        unsigned char  uuid[16];</div><div class='del'>-}  ;</div><div class='del'>-</div><div class='del'>-struct gd1_mgmt_cluster_unlock_rsp {</div><div class='del'>-        unsigned char  uuid[16];</div><div class='del'>-        int     op_ret;</div><div class='del'>-        int     op_errno;</div><div class='del'>-}  ;</div><div class='del'>-</div><div class='del'>-struct gd1_mgmt_stage_op_req {</div><div class='del'>-        unsigned char  uuid[16];</div><div class='del'>-        int     op;</div><div class='del'>-        opaque  buf&lt;&gt;;</div><div class='del'>-}  ;</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-struct gd1_mgmt_stage_op_rsp {</div><div class='del'>-        unsigned char  uuid[16];</div><div class='del'>-        int     op;</div><div class='del'>-        int     op_ret;</div><div class='del'>-        int     op_errno;</div><div class='del'>-}  ;</div><div class='del'>-</div><div class='del'>-struct gd1_mgmt_commit_op_req {</div><div class='del'>-        unsigned char  uuid[16];</div><div class='del'>-        int     op;</div><div class='del'>-        opaque  buf&lt;&gt;;</div><div class='del'>-}  ;</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-struct gd1_mgmt_commit_op_rsp {</div><div class='del'>-        unsigned char  uuid[16];</div><div class='del'>-        int     op;</div><div class='del'>-        int     op_ret;</div><div class='del'>-        int     op_errno;</div><div class='del'>-}  ;</div><div class='del'>-</div><div class='del'>-struct gd1_mgmt_friend_update {</div><div class='del'>-        unsigned char uuid[16];</div><div class='del'>-        opaque  friends&lt;&gt;;</div><div class='del'>-        int     port;</div><div class='del'>-} ;</div><div class='del'>-</div><div class='del'>-struct gd1_mgmt_friend_update_rsp {</div><div class='del'>-        unsigned char  uuid[16];</div><div class='del'>-        int     op;</div><div class='del'>-        int     op_ret;</div><div class='del'>-        int     op_errno;</div><div class='del'>-}  ;</div><div class='head'>diff --git a/rpc/xdr/src/glusterfs3-xdr.c b/rpc/xdr/src/glusterfs3-xdr.c<br/>deleted file mode 100644<br/>index d9453c44ad2..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/rpc/xdr/src/glusterfs3-xdr.c?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>rpc/xdr/src/glusterfs3-xdr.c</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,1903 +0,0 @@</div><div class='del'>-/*</div><div class='del'>-  Copyright (c) 2010 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='del'>-  This file is part of GlusterFS.</div><div class='del'>-</div><div class='del'>-  GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-  it under the terms of the GNU Affero General Public License as published</div><div class='del'>-  by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-  or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-  GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-  WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-  Affero General Public License for more details.</div><div class='del'>-</div><div class='del'>-  You should have received a copy of the GNU Affero General Public License</div><div class='del'>-  along with this program.  If not, see</div><div class='del'>-  &lt;http://www.gnu.org/licenses/&gt;.</div><div class='del'>-*/</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-/*</div><div class='del'>- * Please do not edit this file.</div><div class='del'>- * It was generated using rpcgen.</div><div class='del'>- */</div><div class='del'>-</div><div class='del'>-#include "glusterfs3-xdr.h"</div><div class='del'>-</div><div class='del'>-bool_t</div><div class='del'>-xdr_gf_statfs (XDR *xdrs, gf_statfs *objp)</div><div class='del'>-{</div><div class='del'>-</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;bsize))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;frsize))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;blocks))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;bfree))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;bavail))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;files))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;ffree))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;favail))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;fsid))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;flag))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;namemax))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	return TRUE;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-bool_t</div><div class='del'>-xdr_gf_flock (XDR *xdrs, gf_flock *objp)</div><div class='del'>-{</div><div class='del'>-</div><div class='del'>-	 if (!xdr_u_int (xdrs, &amp;objp-&gt;type))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_u_int (xdrs, &amp;objp-&gt;whence))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;start))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;len))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_u_int (xdrs, &amp;objp-&gt;pid))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	return TRUE;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-bool_t</div><div class='del'>-xdr_gf_iatt (XDR *xdrs, gf_iatt *objp)</div><div class='del'>-{</div><div class='del'>-	register int32_t *buf;</div><div class='del'>-</div><div class='del'>-	if (xdrs-&gt;x_op == XDR_ENCODE) {</div><div class='del'>-                if (!xdr_vector (xdrs, (char *)objp-&gt;ia_gfid, 16,</div><div class='del'>-                                 sizeof (u_char), (xdrproc_t) xdr_u_char))</div><div class='del'>-                        return FALSE;</div><div class='del'>-		 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;ia_ino))</div><div class='del'>-			 return FALSE;</div><div class='del'>-		 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;ia_gen))</div><div class='del'>-			 return FALSE;</div><div class='del'>-		 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;ia_dev))</div><div class='del'>-			 return FALSE;</div><div class='del'>-		buf = XDR_INLINE (xdrs, 4 * BYTES_PER_XDR_UNIT);</div><div class='del'>-		if (buf == NULL) {</div><div class='del'>-			 if (!xdr_u_int (xdrs, &amp;objp-&gt;mode))</div><div class='del'>-				 return FALSE;</div><div class='del'>-			 if (!xdr_u_int (xdrs, &amp;objp-&gt;ia_nlink))</div><div class='del'>-				 return FALSE;</div><div class='del'>-			 if (!xdr_u_int (xdrs, &amp;objp-&gt;ia_uid))</div><div class='del'>-				 return FALSE;</div><div class='del'>-			 if (!xdr_u_int (xdrs, &amp;objp-&gt;ia_gid))</div><div class='del'>-				 return FALSE;</div><div class='del'>-</div><div class='del'>-		} else {</div><div class='del'>-		IXDR_PUT_U_LONG(buf, objp-&gt;mode);</div><div class='del'>-		IXDR_PUT_U_LONG(buf, objp-&gt;ia_nlink);</div><div class='del'>-		IXDR_PUT_U_LONG(buf, objp-&gt;ia_uid);</div><div class='del'>-		IXDR_PUT_U_LONG(buf, objp-&gt;ia_gid);</div><div class='del'>-		}</div><div class='del'>-		 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;ia_rdev))</div><div class='del'>-			 return FALSE;</div><div class='del'>-		 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;ia_size))</div><div class='del'>-			 return FALSE;</div><div class='del'>-		 if (!xdr_u_int (xdrs, &amp;objp-&gt;ia_blksize))</div><div class='del'>-			 return FALSE;</div><div class='del'>-		 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;ia_blocks))</div><div class='del'>-			 return FALSE;</div><div class='del'>-		buf = XDR_INLINE (xdrs, 6 * BYTES_PER_XDR_UNIT);</div><div class='del'>-		if (buf == NULL) {</div><div class='del'>-			 if (!xdr_u_int (xdrs, &amp;objp-&gt;ia_atime))</div><div class='del'>-				 return FALSE;</div><div class='del'>-			 if (!xdr_u_int (xdrs, &amp;objp-&gt;ia_atime_nsec))</div><div class='del'>-				 return FALSE;</div><div class='del'>-			 if (!xdr_u_int (xdrs, &amp;objp-&gt;ia_mtime))</div><div class='del'>-				 return FALSE;</div><div class='del'>-			 if (!xdr_u_int (xdrs, &amp;objp-&gt;ia_mtime_nsec))</div><div class='del'>-				 return FALSE;</div><div class='del'>-			 if (!xdr_u_int (xdrs, &amp;objp-&gt;ia_ctime))</div><div class='del'>-				 return FALSE;</div><div class='del'>-			 if (!xdr_u_int (xdrs, &amp;objp-&gt;ia_ctime_nsec))</div><div class='del'>-				 return FALSE;</div><div class='del'>-		} else {</div><div class='del'>-			IXDR_PUT_U_LONG(buf, objp-&gt;ia_atime);</div><div class='del'>-			IXDR_PUT_U_LONG(buf, objp-&gt;ia_atime_nsec);</div><div class='del'>-			IXDR_PUT_U_LONG(buf, objp-&gt;ia_mtime);</div><div class='del'>-			IXDR_PUT_U_LONG(buf, objp-&gt;ia_mtime_nsec);</div><div class='del'>-			IXDR_PUT_U_LONG(buf, objp-&gt;ia_ctime);</div><div class='del'>-			IXDR_PUT_U_LONG(buf, objp-&gt;ia_ctime_nsec);</div><div class='del'>-		}</div><div class='del'>-		return TRUE;</div><div class='del'>-	} else if (xdrs-&gt;x_op == XDR_DECODE) {</div><div class='del'>-                if (!xdr_vector (xdrs, (char *)objp-&gt;ia_gfid, 16,</div><div class='del'>-                                 sizeof (u_char), (xdrproc_t) xdr_u_char))</div><div class='del'>-                        return FALSE;</div><div class='del'>-		 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;ia_ino))</div><div class='del'>-			 return FALSE;</div><div class='del'>-		 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;ia_gen))</div><div class='del'>-			 return FALSE;</div><div class='del'>-		 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;ia_dev))</div><div class='del'>-			 return FALSE;</div><div class='del'>-		buf = XDR_INLINE (xdrs, 4 * BYTES_PER_XDR_UNIT);</div><div class='del'>-		if (buf == NULL) {</div><div class='del'>-			 if (!xdr_u_int (xdrs, &amp;objp-&gt;mode))</div><div class='del'>-				 return FALSE;</div><div class='del'>-			 if (!xdr_u_int (xdrs, &amp;objp-&gt;ia_nlink))</div><div class='del'>-				 return FALSE;</div><div class='del'>-			 if (!xdr_u_int (xdrs, &amp;objp-&gt;ia_uid))</div><div class='del'>-				 return FALSE;</div><div class='del'>-			 if (!xdr_u_int (xdrs, &amp;objp-&gt;ia_gid))</div><div class='del'>-				 return FALSE;</div><div class='del'>-</div><div class='del'>-		} else {</div><div class='del'>-		objp-&gt;mode = IXDR_GET_U_LONG(buf);</div><div class='del'>-		objp-&gt;ia_nlink = IXDR_GET_U_LONG(buf);</div><div class='del'>-		objp-&gt;ia_uid = IXDR_GET_U_LONG(buf);</div><div class='del'>-		objp-&gt;ia_gid = IXDR_GET_U_LONG(buf);</div><div class='del'>-		}</div><div class='del'>-		 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;ia_rdev))</div><div class='del'>-			 return FALSE;</div><div class='del'>-		 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;ia_size))</div><div class='del'>-			 return FALSE;</div><div class='del'>-		 if (!xdr_u_int (xdrs, &amp;objp-&gt;ia_blksize))</div><div class='del'>-			 return FALSE;</div><div class='del'>-		 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;ia_blocks))</div><div class='del'>-			 return FALSE;</div><div class='del'>-		buf = XDR_INLINE (xdrs, 6 * BYTES_PER_XDR_UNIT);</div><div class='del'>-		if (buf == NULL) {</div><div class='del'>-			 if (!xdr_u_int (xdrs, &amp;objp-&gt;ia_atime))</div><div class='del'>-				 return FALSE;</div><div class='del'>-			 if (!xdr_u_int (xdrs, &amp;objp-&gt;ia_atime_nsec))</div><div class='del'>-				 return FALSE;</div><div class='del'>-			 if (!xdr_u_int (xdrs, &amp;objp-&gt;ia_mtime))</div><div class='del'>-				 return FALSE;</div><div class='del'>-			 if (!xdr_u_int (xdrs, &amp;objp-&gt;ia_mtime_nsec))</div><div class='del'>-				 return FALSE;</div><div class='del'>-			 if (!xdr_u_int (xdrs, &amp;objp-&gt;ia_ctime))</div><div class='del'>-				 return FALSE;</div><div class='del'>-			 if (!xdr_u_int (xdrs, &amp;objp-&gt;ia_ctime_nsec))</div><div class='del'>-				 return FALSE;</div><div class='del'>-		} else {</div><div class='del'>-			objp-&gt;ia_atime = IXDR_GET_U_LONG(buf);</div><div class='del'>-			objp-&gt;ia_atime_nsec = IXDR_GET_U_LONG(buf);</div><div class='del'>-			objp-&gt;ia_mtime = IXDR_GET_U_LONG(buf);</div><div class='del'>-			objp-&gt;ia_mtime_nsec = IXDR_GET_U_LONG(buf);</div><div class='del'>-			objp-&gt;ia_ctime = IXDR_GET_U_LONG(buf);</div><div class='del'>-			objp-&gt;ia_ctime_nsec = IXDR_GET_U_LONG(buf);</div><div class='del'>-		}</div><div class='del'>-	 return TRUE;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	 if (!xdr_vector (xdrs, (char *)objp-&gt;ia_gfid, 16,</div><div class='del'>-		sizeof (u_char), (xdrproc_t) xdr_u_char))</div><div class='del'>-		 return FALSE;</div><div class='del'>-</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;ia_ino))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;ia_gen))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;ia_dev))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_u_int (xdrs, &amp;objp-&gt;mode))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_u_int (xdrs, &amp;objp-&gt;ia_nlink))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_u_int (xdrs, &amp;objp-&gt;ia_uid))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_u_int (xdrs, &amp;objp-&gt;ia_gid))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;ia_rdev))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;ia_size))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_u_int (xdrs, &amp;objp-&gt;ia_blksize))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;ia_blocks))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_u_int (xdrs, &amp;objp-&gt;ia_atime))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_u_int (xdrs, &amp;objp-&gt;ia_atime_nsec))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_u_int (xdrs, &amp;objp-&gt;ia_mtime))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_u_int (xdrs, &amp;objp-&gt;ia_mtime_nsec))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_u_int (xdrs, &amp;objp-&gt;ia_ctime))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_u_int (xdrs, &amp;objp-&gt;ia_ctime_nsec))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	return TRUE;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-bool_t</div><div class='del'>-xdr_gfs3_stat_req (XDR *xdrs, gfs3_stat_req *objp)</div><div class='del'>-{</div><div class='del'>-</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;gfs_id))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_vector (xdrs, (char *)objp-&gt;gfid, 16,</div><div class='del'>-		sizeof (u_char), (xdrproc_t) xdr_u_char))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;ino))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;gen))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_string (xdrs, &amp;objp-&gt;path, ~0))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	return TRUE;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-bool_t</div><div class='del'>-xdr_gfs3_stat_rsp (XDR *xdrs, gfs3_stat_rsp *objp)</div><div class='del'>-{</div><div class='del'>-</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;gfs_id))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_int (xdrs, &amp;objp-&gt;op_ret))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_int (xdrs, &amp;objp-&gt;op_errno))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_gf_iatt (xdrs, &amp;objp-&gt;stat))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	return TRUE;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-bool_t</div><div class='del'>-xdr_gfs3_readlink_req (XDR *xdrs, gfs3_readlink_req *objp)</div><div class='del'>-{</div><div class='del'>-</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;gfs_id))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_vector (xdrs, (char *)objp-&gt;gfid, 16,</div><div class='del'>-		sizeof (u_char), (xdrproc_t) xdr_u_char))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;ino))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;gen))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_u_int (xdrs, &amp;objp-&gt;size))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_string (xdrs, &amp;objp-&gt;path, ~0))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	return TRUE;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-bool_t</div><div class='del'>-xdr_gfs3_readlink_rsp (XDR *xdrs, gfs3_readlink_rsp *objp)</div><div class='del'>-{</div><div class='del'>-</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;gfs_id))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_int (xdrs, &amp;objp-&gt;op_ret))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_int (xdrs, &amp;objp-&gt;op_errno))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_gf_iatt (xdrs, &amp;objp-&gt;buf))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_string (xdrs, &amp;objp-&gt;path, ~0))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	return TRUE;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-bool_t</div><div class='del'>-xdr_gfs3_mknod_req (XDR *xdrs, gfs3_mknod_req *objp)</div><div class='del'>-{</div><div class='del'>-</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;gfs_id))</div><div class='del'>-		 return FALSE;</div><div class='del'>-         if (!xdr_vector (xdrs, (char *)objp-&gt;pargfid, 16,</div><div class='del'>-                          sizeof (u_char), (xdrproc_t) xdr_u_char))</div><div class='del'>-                 return FALSE;</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;par))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;gen))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;dev))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_u_int (xdrs, &amp;objp-&gt;mode))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_string (xdrs, &amp;objp-&gt;path, ~0))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_string (xdrs, &amp;objp-&gt;bname, ~0))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_bytes (xdrs, (char **)&amp;objp-&gt;dict.dict_val,</div><div class='del'>-                         (u_int *) &amp;objp-&gt;dict.dict_len, ~0))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	return TRUE;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-bool_t</div><div class='del'>-xdr_gfs3_mknod_rsp (XDR *xdrs, gfs3_mknod_rsp *objp)</div><div class='del'>-{</div><div class='del'>-</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;gfs_id))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_int (xdrs, &amp;objp-&gt;op_ret))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_int (xdrs, &amp;objp-&gt;op_errno))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_gf_iatt (xdrs, &amp;objp-&gt;stat))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_gf_iatt (xdrs, &amp;objp-&gt;preparent))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_gf_iatt (xdrs, &amp;objp-&gt;postparent))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	return TRUE;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-bool_t</div><div class='del'>-xdr_gfs3_mkdir_req (XDR *xdrs, gfs3_mkdir_req *objp)</div><div class='del'>-{</div><div class='del'>-</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;gfs_id))</div><div class='del'>-		 return FALSE;</div><div class='del'>-         if (!xdr_vector (xdrs, (char *)objp-&gt;pargfid, 16,</div><div class='del'>-                          sizeof (u_char), (xdrproc_t) xdr_u_char))</div><div class='del'>-                 return FALSE;</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;par))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;gen))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_u_int (xdrs, &amp;objp-&gt;mode))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_string (xdrs, &amp;objp-&gt;path, ~0))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_string (xdrs, &amp;objp-&gt;bname, ~0))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_bytes (xdrs, (char **)&amp;objp-&gt;dict.dict_val,</div><div class='del'>-                         (u_int *) &amp;objp-&gt;dict.dict_len, ~0))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	return TRUE;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-bool_t</div><div class='del'>-xdr_gfs3_mkdir_rsp (XDR *xdrs, gfs3_mkdir_rsp *objp)</div><div class='del'>-{</div><div class='del'>-</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;gfs_id))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_int (xdrs, &amp;objp-&gt;op_ret))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_int (xdrs, &amp;objp-&gt;op_errno))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_gf_iatt (xdrs, &amp;objp-&gt;stat))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_gf_iatt (xdrs, &amp;objp-&gt;preparent))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_gf_iatt (xdrs, &amp;objp-&gt;postparent))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	return TRUE;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-bool_t</div><div class='del'>-xdr_gfs3_unlink_req (XDR *xdrs, gfs3_unlink_req *objp)</div><div class='del'>-{</div><div class='del'>-</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;gfs_id))</div><div class='del'>-		 return FALSE;</div><div class='del'>-         if (!xdr_vector (xdrs, (char *)objp-&gt;pargfid, 16,</div><div class='del'>-                          sizeof (u_char), (xdrproc_t) xdr_u_char))</div><div class='del'>-                 return FALSE;</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;par))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;gen))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_string (xdrs, &amp;objp-&gt;path, ~0))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_string (xdrs, &amp;objp-&gt;bname, ~0))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	return TRUE;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-bool_t</div><div class='del'>-xdr_gfs3_unlink_rsp (XDR *xdrs, gfs3_unlink_rsp *objp)</div><div class='del'>-{</div><div class='del'>-</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;gfs_id))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_int (xdrs, &amp;objp-&gt;op_ret))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_int (xdrs, &amp;objp-&gt;op_errno))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_gf_iatt (xdrs, &amp;objp-&gt;preparent))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_gf_iatt (xdrs, &amp;objp-&gt;postparent))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	return TRUE;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-bool_t</div><div class='del'>-xdr_gfs3_rmdir_req (XDR *xdrs, gfs3_rmdir_req *objp)</div><div class='del'>-{</div><div class='del'>-</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;gfs_id))</div><div class='del'>-		 return FALSE;</div><div class='del'>-         if (!xdr_vector (xdrs, (char *)objp-&gt;pargfid, 16,</div><div class='del'>-                          sizeof (u_char), (xdrproc_t) xdr_u_char))</div><div class='del'>-                 return FALSE;</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;par))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;gen))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_string (xdrs, &amp;objp-&gt;path, ~0))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_string (xdrs, &amp;objp-&gt;bname, ~0))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	return TRUE;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-bool_t</div><div class='del'>-xdr_gfs3_rmdir_rsp (XDR *xdrs, gfs3_rmdir_rsp *objp)</div><div class='del'>-{</div><div class='del'>-</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;gfs_id))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_int (xdrs, &amp;objp-&gt;op_ret))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_int (xdrs, &amp;objp-&gt;op_errno))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_gf_iatt (xdrs, &amp;objp-&gt;preparent))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_gf_iatt (xdrs, &amp;objp-&gt;postparent))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	return TRUE;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-bool_t</div><div class='del'>-xdr_gfs3_symlink_req (XDR *xdrs, gfs3_symlink_req *objp)</div><div class='del'>-{</div><div class='del'>-</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;gfs_id))</div><div class='del'>-		 return FALSE;</div><div class='del'>-         if (!xdr_vector (xdrs, (char *)objp-&gt;pargfid, 16,</div><div class='del'>-                          sizeof (u_char), (xdrproc_t) xdr_u_char))</div><div class='del'>-                 return FALSE;</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;par))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;gen))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_string (xdrs, &amp;objp-&gt;path, ~0))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_string (xdrs, &amp;objp-&gt;bname, ~0))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_string (xdrs, &amp;objp-&gt;linkname, ~0))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_bytes (xdrs, (char **)&amp;objp-&gt;dict.dict_val,</div><div class='del'>-                         (u_int *) &amp;objp-&gt;dict.dict_len, ~0))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	return TRUE;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-bool_t</div><div class='del'>-xdr_gfs3_symlink_rsp (XDR *xdrs, gfs3_symlink_rsp *objp)</div><div class='del'>-{</div><div class='del'>-</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;gfs_id))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_int (xdrs, &amp;objp-&gt;op_ret))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_int (xdrs, &amp;objp-&gt;op_errno))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_gf_iatt (xdrs, &amp;objp-&gt;stat))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_gf_iatt (xdrs, &amp;objp-&gt;preparent))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_gf_iatt (xdrs, &amp;objp-&gt;postparent))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	return TRUE;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-bool_t</div><div class='del'>-xdr_gfs3_rename_req (XDR *xdrs, gfs3_rename_req *objp)</div><div class='del'>-{</div><div class='del'>-</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;gfs_id))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_vector (xdrs, (char *)objp-&gt;oldgfid, 16,</div><div class='del'>-		sizeof (u_char), (xdrproc_t) xdr_u_char))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_vector (xdrs, (char *)objp-&gt;newgfid, 16,</div><div class='del'>-		sizeof (u_char), (xdrproc_t) xdr_u_char))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;oldpar))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;oldgen))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;newpar))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;newgen))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_string (xdrs, &amp;objp-&gt;oldpath, ~0))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_string (xdrs, &amp;objp-&gt;oldbname, ~0))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_string (xdrs, &amp;objp-&gt;newpath, ~0))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_string (xdrs, &amp;objp-&gt;newbname, ~0))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	return TRUE;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-bool_t</div><div class='del'>-xdr_gfs3_rename_rsp (XDR *xdrs, gfs3_rename_rsp *objp)</div><div class='del'>-{</div><div class='del'>-</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;gfs_id))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_int (xdrs, &amp;objp-&gt;op_ret))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_int (xdrs, &amp;objp-&gt;op_errno))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_gf_iatt (xdrs, &amp;objp-&gt;stat))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_gf_iatt (xdrs, &amp;objp-&gt;preoldparent))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_gf_iatt (xdrs, &amp;objp-&gt;postoldparent))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_gf_iatt (xdrs, &amp;objp-&gt;prenewparent))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_gf_iatt (xdrs, &amp;objp-&gt;postnewparent))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	return TRUE;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-bool_t</div><div class='del'>-xdr_gfs3_link_req (XDR *xdrs, gfs3_link_req *objp)</div><div class='del'>-{</div><div class='del'>-</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;gfs_id))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_vector (xdrs, (char *)objp-&gt;oldgfid, 16,</div><div class='del'>-		sizeof (u_char), (xdrproc_t) xdr_u_char))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_vector (xdrs, (char *)objp-&gt;newgfid, 16,</div><div class='del'>-		sizeof (u_char), (xdrproc_t) xdr_u_char))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;oldino))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;oldgen))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;newpar))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;newgen))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_string (xdrs, &amp;objp-&gt;oldpath, ~0))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_string (xdrs, &amp;objp-&gt;newpath, ~0))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_string (xdrs, &amp;objp-&gt;newbname, ~0))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	return TRUE;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-bool_t</div><div class='del'>-xdr_gfs3_link_rsp (XDR *xdrs, gfs3_link_rsp *objp)</div><div class='del'>-{</div><div class='del'>-</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;gfs_id))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_int (xdrs, &amp;objp-&gt;op_ret))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_int (xdrs, &amp;objp-&gt;op_errno))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_gf_iatt (xdrs, &amp;objp-&gt;stat))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_gf_iatt (xdrs, &amp;objp-&gt;preparent))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_gf_iatt (xdrs, &amp;objp-&gt;postparent))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	return TRUE;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-bool_t</div><div class='del'>-xdr_gfs3_truncate_req (XDR *xdrs, gfs3_truncate_req *objp)</div><div class='del'>-{</div><div class='del'>-</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;gfs_id))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_vector (xdrs, (char *)objp-&gt;gfid, 16,</div><div class='del'>-		sizeof (u_char), (xdrproc_t) xdr_u_char))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;ino))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;gen))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;offset))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_string (xdrs, &amp;objp-&gt;path, ~0))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	return TRUE;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-bool_t</div><div class='del'>-xdr_gfs3_truncate_rsp (XDR *xdrs, gfs3_truncate_rsp *objp)</div><div class='del'>-{</div><div class='del'>-</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;gfs_id))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_int (xdrs, &amp;objp-&gt;op_ret))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_int (xdrs, &amp;objp-&gt;op_errno))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_gf_iatt (xdrs, &amp;objp-&gt;prestat))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_gf_iatt (xdrs, &amp;objp-&gt;poststat))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	return TRUE;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-bool_t</div><div class='del'>-xdr_gfs3_open_req (XDR *xdrs, gfs3_open_req *objp)</div><div class='del'>-{</div><div class='del'>-</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;gfs_id))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_vector (xdrs, (char *)objp-&gt;gfid, 16,</div><div class='del'>-		sizeof (u_char), (xdrproc_t) xdr_u_char))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;ino))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;gen))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_u_int (xdrs, &amp;objp-&gt;flags))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_u_int (xdrs, &amp;objp-&gt;wbflags))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_string (xdrs, &amp;objp-&gt;path, ~0))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	return TRUE;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-bool_t</div><div class='del'>-xdr_gfs3_open_rsp (XDR *xdrs, gfs3_open_rsp *objp)</div><div class='del'>-{</div><div class='del'>-</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;gfs_id))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_int (xdrs, &amp;objp-&gt;op_ret))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_int (xdrs, &amp;objp-&gt;op_errno))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_quad_t (xdrs, &amp;objp-&gt;fd))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	return TRUE;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-bool_t</div><div class='del'>-xdr_gfs3_read_req (XDR *xdrs, gfs3_read_req *objp)</div><div class='del'>-{</div><div class='del'>-</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;gfs_id))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_vector (xdrs, (char *)objp-&gt;gfid, 16,</div><div class='del'>-		sizeof (u_char), (xdrproc_t) xdr_u_char))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;ino))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;gen))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_quad_t (xdrs, &amp;objp-&gt;fd))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;offset))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_u_int (xdrs, &amp;objp-&gt;size))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	return TRUE;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-bool_t</div><div class='del'>-xdr_gfs3_read_rsp (XDR *xdrs, gfs3_read_rsp *objp)</div><div class='del'>-{</div><div class='del'>-</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;gfs_id))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_int (xdrs, &amp;objp-&gt;op_ret))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_int (xdrs, &amp;objp-&gt;op_errno))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_gf_iatt (xdrs, &amp;objp-&gt;stat))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_u_int (xdrs, &amp;objp-&gt;size))</div><div class='del'>-		 return FALSE;</div><div class='del'>-</div><div class='del'>-         return TRUE;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-bool_t</div><div class='del'>-xdr_gfs3_lookup_req (XDR *xdrs, gfs3_lookup_req *objp)</div><div class='del'>-{</div><div class='del'>-</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;gfs_id))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_vector (xdrs, (char *)objp-&gt;gfid, 16,</div><div class='del'>-		sizeof (u_char), (xdrproc_t) xdr_u_char))</div><div class='del'>-		 return FALSE;</div><div class='del'>-         if (!xdr_vector (xdrs, (char *)objp-&gt;pargfid, 16,</div><div class='del'>-                          sizeof (u_char), (xdrproc_t) xdr_u_char))</div><div class='del'>-                 return FALSE;</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;ino))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;par))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;gen))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_u_int (xdrs, &amp;objp-&gt;flags))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_string (xdrs, &amp;objp-&gt;path, ~0))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_string (xdrs, &amp;objp-&gt;bname, ~0))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_bytes (xdrs, (char **)&amp;objp-&gt;dict.dict_val,</div><div class='del'>-                         (u_int *) &amp;objp-&gt;dict.dict_len, ~0))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	return TRUE;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-bool_t</div><div class='del'>-xdr_gfs3_lookup_rsp (XDR *xdrs, gfs3_lookup_rsp *objp)</div><div class='del'>-{</div><div class='del'>-</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;gfs_id))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_int (xdrs, &amp;objp-&gt;op_ret))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_int (xdrs, &amp;objp-&gt;op_errno))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_gf_iatt (xdrs, &amp;objp-&gt;stat))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_gf_iatt (xdrs, &amp;objp-&gt;postparent))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_bytes (xdrs, (char **)&amp;objp-&gt;dict.dict_val,</div><div class='del'>-                         (u_int *) &amp;objp-&gt;dict.dict_len, ~0))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	return TRUE;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-bool_t</div><div class='del'>-xdr_gfs3_write_req (XDR *xdrs, gfs3_write_req *objp)</div><div class='del'>-{</div><div class='del'>-</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;gfs_id))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_vector (xdrs, (char *)objp-&gt;gfid, 16,</div><div class='del'>-		sizeof (u_char), (xdrproc_t) xdr_u_char))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;ino))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;gen))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_quad_t (xdrs, &amp;objp-&gt;fd))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;offset))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_u_int (xdrs, &amp;objp-&gt;size))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	return TRUE;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-bool_t</div><div class='del'>-xdr_gfs3_write_rsp (XDR *xdrs, gfs3_write_rsp *objp)</div><div class='del'>-{</div><div class='del'>-</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;gfs_id))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_int (xdrs, &amp;objp-&gt;op_ret))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_int (xdrs, &amp;objp-&gt;op_errno))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_gf_iatt (xdrs, &amp;objp-&gt;prestat))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_gf_iatt (xdrs, &amp;objp-&gt;poststat))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	return TRUE;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-bool_t</div><div class='del'>-xdr_gfs3_statfs_req (XDR *xdrs, gfs3_statfs_req *objp)</div><div class='del'>-{</div><div class='del'>-</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;gfs_id))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_vector (xdrs, (char *)objp-&gt;gfid, 16,</div><div class='del'>-		sizeof (u_char), (xdrproc_t) xdr_u_char))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;ino))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;gen))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_string (xdrs, &amp;objp-&gt;path, ~0))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	return TRUE;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-bool_t</div><div class='del'>-xdr_gfs3_statfs_rsp (XDR *xdrs, gfs3_statfs_rsp *objp)</div><div class='del'>-{</div><div class='del'>-</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;gfs_id))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_int (xdrs, &amp;objp-&gt;op_ret))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_int (xdrs, &amp;objp-&gt;op_errno))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_gf_statfs (xdrs, &amp;objp-&gt;statfs))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	return TRUE;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-bool_t</div><div class='del'>-xdr_gfs3_lk_req (XDR *xdrs, gfs3_lk_req *objp)</div><div class='del'>-{</div><div class='del'>-</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;gfs_id))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_vector (xdrs, (char *)objp-&gt;gfid, 16,</div><div class='del'>-		sizeof (u_char), (xdrproc_t) xdr_u_char))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;ino))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;gen))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_quad_t (xdrs, &amp;objp-&gt;fd))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_u_int (xdrs, &amp;objp-&gt;cmd))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_u_int (xdrs, &amp;objp-&gt;type))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_gf_flock (xdrs, &amp;objp-&gt;flock))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	return TRUE;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-bool_t</div><div class='del'>-xdr_gfs3_lk_rsp (XDR *xdrs, gfs3_lk_rsp *objp)</div><div class='del'>-{</div><div class='del'>-</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;gfs_id))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_int (xdrs, &amp;objp-&gt;op_ret))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_int (xdrs, &amp;objp-&gt;op_errno))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_gf_flock (xdrs, &amp;objp-&gt;flock))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	return TRUE;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-bool_t</div><div class='del'>-xdr_gfs3_inodelk_req (XDR *xdrs, gfs3_inodelk_req *objp)</div><div class='del'>-{</div><div class='del'>-</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;gfs_id))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_vector (xdrs, (char *)objp-&gt;gfid, 16,</div><div class='del'>-		sizeof (u_char), (xdrproc_t) xdr_u_char))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;ino))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;gen))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_u_int (xdrs, &amp;objp-&gt;cmd))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_u_int (xdrs, &amp;objp-&gt;type))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_gf_flock (xdrs, &amp;objp-&gt;flock))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_string (xdrs, &amp;objp-&gt;path, ~0))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_string (xdrs, &amp;objp-&gt;volume, ~0))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	return TRUE;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-bool_t</div><div class='del'>-xdr_gfs3_finodelk_req (XDR *xdrs, gfs3_finodelk_req *objp)</div><div class='del'>-{</div><div class='del'>-</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;gfs_id))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_vector (xdrs, (char *)objp-&gt;gfid, 16,</div><div class='del'>-		sizeof (u_char), (xdrproc_t) xdr_u_char))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;ino))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;gen))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_quad_t (xdrs, &amp;objp-&gt;fd))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_u_int (xdrs, &amp;objp-&gt;cmd))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_u_int (xdrs, &amp;objp-&gt;type))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_gf_flock (xdrs, &amp;objp-&gt;flock))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_string (xdrs, &amp;objp-&gt;volume, ~0))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	return TRUE;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-bool_t</div><div class='del'>-xdr_gfs3_flush_req (XDR *xdrs, gfs3_flush_req *objp)</div><div class='del'>-{</div><div class='del'>-</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;gfs_id))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_vector (xdrs, (char *)objp-&gt;gfid, 16,</div><div class='del'>-		sizeof (u_char), (xdrproc_t) xdr_u_char))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;ino))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;gen))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_quad_t (xdrs, &amp;objp-&gt;fd))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	return TRUE;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-bool_t</div><div class='del'>-xdr_gfs3_fsync_req (XDR *xdrs, gfs3_fsync_req *objp)</div><div class='del'>-{</div><div class='del'>-</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;gfs_id))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_vector (xdrs, (char *)objp-&gt;gfid, 16,</div><div class='del'>-		sizeof (u_char), (xdrproc_t) xdr_u_char))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;ino))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;gen))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_quad_t (xdrs, &amp;objp-&gt;fd))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_u_int (xdrs, &amp;objp-&gt;data))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	return TRUE;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-bool_t</div><div class='del'>-xdr_gfs3_fsync_rsp (XDR *xdrs, gfs3_fsync_rsp *objp)</div><div class='del'>-{</div><div class='del'>-</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;gfs_id))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_int (xdrs, &amp;objp-&gt;op_ret))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_int (xdrs, &amp;objp-&gt;op_errno))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_gf_iatt (xdrs, &amp;objp-&gt;prestat))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_gf_iatt (xdrs, &amp;objp-&gt;poststat))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	return TRUE;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-bool_t</div><div class='del'>-xdr_gfs3_setxattr_req (XDR *xdrs, gfs3_setxattr_req *objp)</div><div class='del'>-{</div><div class='del'>-</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;gfs_id))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_vector (xdrs, (char *)objp-&gt;gfid, 16,</div><div class='del'>-		sizeof (u_char), (xdrproc_t) xdr_u_char))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;ino))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;gen))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_u_int (xdrs, &amp;objp-&gt;flags))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_bytes (xdrs, (char **)&amp;objp-&gt;dict.dict_val, (u_int *) &amp;objp-&gt;dict.dict_len, ~0))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_string (xdrs, &amp;objp-&gt;path, ~0))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	return TRUE;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-bool_t</div><div class='del'>-xdr_gfs3_fsetxattr_req (XDR *xdrs, gfs3_fsetxattr_req *objp)</div><div class='del'>-{</div><div class='del'>-</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;gfs_id))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_vector (xdrs, (char *)objp-&gt;gfid, 16,</div><div class='del'>-		sizeof (u_char), (xdrproc_t) xdr_u_char))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;ino))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;gen))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_quad_t (xdrs, &amp;objp-&gt;fd))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_u_int (xdrs, &amp;objp-&gt;flags))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_bytes (xdrs, (char **)&amp;objp-&gt;dict.dict_val, (u_int *) &amp;objp-&gt;dict.dict_len, ~0))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	return TRUE;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-bool_t</div><div class='del'>-xdr_gfs3_xattrop_req (XDR *xdrs, gfs3_xattrop_req *objp)</div><div class='del'>-{</div><div class='del'>-</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;gfs_id))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_vector (xdrs, (char *)objp-&gt;gfid, 16,</div><div class='del'>-		sizeof (u_char), (xdrproc_t) xdr_u_char))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;ino))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;gen))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_u_int (xdrs, &amp;objp-&gt;flags))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_bytes (xdrs, (char **)&amp;objp-&gt;dict.dict_val, (u_int *) &amp;objp-&gt;dict.dict_len, ~0))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_string (xdrs, &amp;objp-&gt;path, ~0))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	return TRUE;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-bool_t</div><div class='del'>-xdr_gfs3_xattrop_rsp (XDR *xdrs, gfs3_xattrop_rsp *objp)</div><div class='del'>-{</div><div class='del'>-</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;gfs_id))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_int (xdrs, &amp;objp-&gt;op_ret))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_int (xdrs, &amp;objp-&gt;op_errno))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_bytes (xdrs, (char **)&amp;objp-&gt;dict.dict_val, (u_int *) &amp;objp-&gt;dict.dict_len, ~0))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	return TRUE;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-bool_t</div><div class='del'>-xdr_gfs3_fxattrop_req (XDR *xdrs, gfs3_fxattrop_req *objp)</div><div class='del'>-{</div><div class='del'>-</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;gfs_id))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_vector (xdrs, (char *)objp-&gt;gfid, 16,</div><div class='del'>-		sizeof (u_char), (xdrproc_t) xdr_u_char))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;ino))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;gen))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_quad_t (xdrs, &amp;objp-&gt;fd))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_u_int (xdrs, &amp;objp-&gt;flags))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_bytes (xdrs, (char **)&amp;objp-&gt;dict.dict_val, (u_int *) &amp;objp-&gt;dict.dict_len, ~0))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	return TRUE;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-bool_t</div><div class='del'>-xdr_gfs3_fxattrop_rsp (XDR *xdrs, gfs3_fxattrop_rsp *objp)</div><div class='del'>-{</div><div class='del'>-</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;gfs_id))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_int (xdrs, &amp;objp-&gt;op_ret))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_int (xdrs, &amp;objp-&gt;op_errno))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_bytes (xdrs, (char **)&amp;objp-&gt;dict.dict_val, (u_int *) &amp;objp-&gt;dict.dict_len, ~0))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	return TRUE;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-bool_t</div><div class='del'>-xdr_gfs3_getxattr_req (XDR *xdrs, gfs3_getxattr_req *objp)</div><div class='del'>-{</div><div class='del'>-</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;gfs_id))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_vector (xdrs, (char *)objp-&gt;gfid, 16,</div><div class='del'>-		sizeof (u_char), (xdrproc_t) xdr_u_char))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;ino))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;gen))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_u_int (xdrs, &amp;objp-&gt;namelen))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_string (xdrs, &amp;objp-&gt;path, ~0))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_string (xdrs, &amp;objp-&gt;name, ~0))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	return TRUE;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-bool_t</div><div class='del'>-xdr_gfs3_getxattr_rsp (XDR *xdrs, gfs3_getxattr_rsp *objp)</div><div class='del'>-{</div><div class='del'>-</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;gfs_id))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_int (xdrs, &amp;objp-&gt;op_ret))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_int (xdrs, &amp;objp-&gt;op_errno))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_bytes (xdrs, (char **)&amp;objp-&gt;dict.dict_val, (u_int *) &amp;objp-&gt;dict.dict_len, ~0))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	return TRUE;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-bool_t</div><div class='del'>-xdr_gfs3_fgetxattr_req (XDR *xdrs, gfs3_fgetxattr_req *objp)</div><div class='del'>-{</div><div class='del'>-</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;gfs_id))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_vector (xdrs, (char *)objp-&gt;gfid, 16,</div><div class='del'>-		sizeof (u_char), (xdrproc_t) xdr_u_char))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;ino))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;gen))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_quad_t (xdrs, &amp;objp-&gt;fd))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_u_int (xdrs, &amp;objp-&gt;namelen))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_string (xdrs, &amp;objp-&gt;name, ~0))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	return TRUE;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-bool_t</div><div class='del'>-xdr_gfs3_fgetxattr_rsp (XDR *xdrs, gfs3_fgetxattr_rsp *objp)</div><div class='del'>-{</div><div class='del'>-</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;gfs_id))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_int (xdrs, &amp;objp-&gt;op_ret))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_int (xdrs, &amp;objp-&gt;op_errno))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_bytes (xdrs, (char **)&amp;objp-&gt;dict.dict_val, (u_int *) &amp;objp-&gt;dict.dict_len, ~0))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	return TRUE;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-bool_t</div><div class='del'>-xdr_gfs3_removexattr_req (XDR *xdrs, gfs3_removexattr_req *objp)</div><div class='del'>-{</div><div class='del'>-</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;gfs_id))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_vector (xdrs, (char *)objp-&gt;gfid, 16,</div><div class='del'>-		sizeof (u_char), (xdrproc_t) xdr_u_char))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;ino))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;gen))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_string (xdrs, &amp;objp-&gt;path, ~0))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_string (xdrs, &amp;objp-&gt;name, ~0))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	return TRUE;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-bool_t</div><div class='del'>-xdr_gfs3_opendir_req (XDR *xdrs, gfs3_opendir_req *objp)</div><div class='del'>-{</div><div class='del'>-</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;gfs_id))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_vector (xdrs, (char *)objp-&gt;gfid, 16,</div><div class='del'>-		sizeof (u_char), (xdrproc_t) xdr_u_char))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;ino))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;gen))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_string (xdrs, &amp;objp-&gt;path, ~0))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	return TRUE;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-bool_t</div><div class='del'>-xdr_gfs3_opendir_rsp (XDR *xdrs, gfs3_opendir_rsp *objp)</div><div class='del'>-{</div><div class='del'>-</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;gfs_id))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_int (xdrs, &amp;objp-&gt;op_ret))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_int (xdrs, &amp;objp-&gt;op_errno))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_quad_t (xdrs, &amp;objp-&gt;fd))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	return TRUE;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-bool_t</div><div class='del'>-xdr_gfs3_fsyncdir_req (XDR *xdrs, gfs3_fsyncdir_req *objp)</div><div class='del'>-{</div><div class='del'>-</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;gfs_id))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_vector (xdrs, (char *)objp-&gt;gfid, 16,</div><div class='del'>-		sizeof (u_char), (xdrproc_t) xdr_u_char))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;ino))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;gen))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_quad_t (xdrs, &amp;objp-&gt;fd))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_int (xdrs, &amp;objp-&gt;data))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	return TRUE;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-bool_t</div><div class='del'>-xdr_gfs3_readdir_req (XDR *xdrs, gfs3_readdir_req *objp)</div><div class='del'>-{</div><div class='del'>-</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;gfs_id))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_vector (xdrs, (char *)objp-&gt;gfid, 16,</div><div class='del'>-		sizeof (u_char), (xdrproc_t) xdr_u_char))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;ino))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;gen))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_quad_t (xdrs, &amp;objp-&gt;fd))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;offset))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_u_int (xdrs, &amp;objp-&gt;size))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	return TRUE;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-bool_t</div><div class='del'>-xdr_gfs3_readdirp_req (XDR *xdrs, gfs3_readdirp_req *objp)</div><div class='del'>-{</div><div class='del'>-</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;gfs_id))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_vector (xdrs, (char *)objp-&gt;gfid, 16,</div><div class='del'>-		sizeof (u_char), (xdrproc_t) xdr_u_char))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;ino))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;gen))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_quad_t (xdrs, &amp;objp-&gt;fd))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;offset))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_u_int (xdrs, &amp;objp-&gt;size))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	return TRUE;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-bool_t</div><div class='del'>-xdr_gf_setvolume_req (XDR *xdrs, gf_setvolume_req *objp)</div><div class='del'>-{</div><div class='del'>-</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;gfs_id))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_bytes (xdrs, (char **)&amp;objp-&gt;dict.dict_val, (u_int *) &amp;objp-&gt;dict.dict_len, ~0))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	return TRUE;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-bool_t</div><div class='del'>-xdr_gf_setvolume_rsp (XDR *xdrs, gf_setvolume_rsp *objp)</div><div class='del'>-{</div><div class='del'>-</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;gfs_id))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_int (xdrs, &amp;objp-&gt;op_ret))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_int (xdrs, &amp;objp-&gt;op_errno))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_bytes (xdrs, (char **)&amp;objp-&gt;dict.dict_val, (u_int *) &amp;objp-&gt;dict.dict_len, ~0))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	return TRUE;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-bool_t</div><div class='del'>-xdr_gfs3_access_req (XDR *xdrs, gfs3_access_req *objp)</div><div class='del'>-{</div><div class='del'>-</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;gfs_id))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_vector (xdrs, (char *)objp-&gt;gfid, 16,</div><div class='del'>-		sizeof (u_char), (xdrproc_t) xdr_u_char))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;ino))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;gen))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_u_int (xdrs, &amp;objp-&gt;mask))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_string (xdrs, &amp;objp-&gt;path, ~0))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	return TRUE;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-bool_t</div><div class='del'>-xdr_gfs3_create_req (XDR *xdrs, gfs3_create_req *objp)</div><div class='del'>-{</div><div class='del'>-</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;gfs_id))</div><div class='del'>-		 return FALSE;</div><div class='del'>-         if (!xdr_vector (xdrs, (char *)objp-&gt;pargfid, 16,</div><div class='del'>-                          sizeof (u_char), (xdrproc_t) xdr_u_char))</div><div class='del'>-                 return FALSE;</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;par))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;gen))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_u_int (xdrs, &amp;objp-&gt;flags))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_u_int (xdrs, &amp;objp-&gt;mode))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_string (xdrs, &amp;objp-&gt;path, ~0))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_string (xdrs, &amp;objp-&gt;bname, ~0))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_bytes (xdrs, (char **)&amp;objp-&gt;dict.dict_val,</div><div class='del'>-                         (u_int *) &amp;objp-&gt;dict.dict_len, ~0))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	return TRUE;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-bool_t</div><div class='del'>-xdr_gfs3_create_rsp (XDR *xdrs, gfs3_create_rsp *objp)</div><div class='del'>-{</div><div class='del'>-</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;gfs_id))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_int (xdrs, &amp;objp-&gt;op_ret))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_int (xdrs, &amp;objp-&gt;op_errno))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_gf_iatt (xdrs, &amp;objp-&gt;stat))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;fd))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_gf_iatt (xdrs, &amp;objp-&gt;preparent))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_gf_iatt (xdrs, &amp;objp-&gt;postparent))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	return TRUE;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-bool_t</div><div class='del'>-xdr_gfs3_ftruncate_req (XDR *xdrs, gfs3_ftruncate_req *objp)</div><div class='del'>-{</div><div class='del'>-</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;gfs_id))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_vector (xdrs, (char *)objp-&gt;gfid, 16,</div><div class='del'>-		sizeof (u_char), (xdrproc_t) xdr_u_char))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;ino))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;gen))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_quad_t (xdrs, &amp;objp-&gt;fd))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;offset))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	return TRUE;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-bool_t</div><div class='del'>-xdr_gfs3_ftruncate_rsp (XDR *xdrs, gfs3_ftruncate_rsp *objp)</div><div class='del'>-{</div><div class='del'>-</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;gfs_id))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_int (xdrs, &amp;objp-&gt;op_ret))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_int (xdrs, &amp;objp-&gt;op_errno))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_gf_iatt (xdrs, &amp;objp-&gt;prestat))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_gf_iatt (xdrs, &amp;objp-&gt;poststat))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	return TRUE;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-bool_t</div><div class='del'>-xdr_gfs3_fstat_req (XDR *xdrs, gfs3_fstat_req *objp)</div><div class='del'>-{</div><div class='del'>-</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;gfs_id))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_vector (xdrs, (char *)objp-&gt;gfid, 16,</div><div class='del'>-		sizeof (u_char), (xdrproc_t) xdr_u_char))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;ino))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;gen))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_quad_t (xdrs, &amp;objp-&gt;fd))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	return TRUE;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-bool_t</div><div class='del'>-xdr_gfs3_fstat_rsp (XDR *xdrs, gfs3_fstat_rsp *objp)</div><div class='del'>-{</div><div class='del'>-</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;gfs_id))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_int (xdrs, &amp;objp-&gt;op_ret))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_int (xdrs, &amp;objp-&gt;op_errno))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_gf_iatt (xdrs, &amp;objp-&gt;stat))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	return TRUE;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-bool_t</div><div class='del'>-xdr_gfs3_entrylk_req (XDR *xdrs, gfs3_entrylk_req *objp)</div><div class='del'>-{</div><div class='del'>-</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;gfs_id))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_vector (xdrs, (char *)objp-&gt;gfid, 16,</div><div class='del'>-		sizeof (u_char), (xdrproc_t) xdr_u_char))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;ino))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;gen))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_u_int (xdrs, &amp;objp-&gt;cmd))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_u_int (xdrs, &amp;objp-&gt;type))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;namelen))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_string (xdrs, &amp;objp-&gt;path, ~0))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_string (xdrs, &amp;objp-&gt;name, ~0))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_string (xdrs, &amp;objp-&gt;volume, ~0))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	return TRUE;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-bool_t</div><div class='del'>-xdr_gfs3_fentrylk_req (XDR *xdrs, gfs3_fentrylk_req *objp)</div><div class='del'>-{</div><div class='del'>-</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;gfs_id))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_vector (xdrs, (char *)objp-&gt;gfid, 16,</div><div class='del'>-		sizeof (u_char), (xdrproc_t) xdr_u_char))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;ino))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;gen))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_quad_t (xdrs, &amp;objp-&gt;fd))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_u_int (xdrs, &amp;objp-&gt;cmd))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_u_int (xdrs, &amp;objp-&gt;type))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;namelen))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_string (xdrs, &amp;objp-&gt;name, ~0))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_string (xdrs, &amp;objp-&gt;volume, ~0))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	return TRUE;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-bool_t</div><div class='del'>-xdr_gfs3_setattr_req (XDR *xdrs, gfs3_setattr_req *objp)</div><div class='del'>-{</div><div class='del'>-</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;gfs_id))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_vector (xdrs, (char *)objp-&gt;gfid, 16,</div><div class='del'>-		sizeof (u_char), (xdrproc_t) xdr_u_char))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;ino))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;gen))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_gf_iatt (xdrs, &amp;objp-&gt;stbuf))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_int (xdrs, &amp;objp-&gt;valid))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_string (xdrs, &amp;objp-&gt;path, ~0))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	return TRUE;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-bool_t</div><div class='del'>-xdr_gfs3_setattr_rsp (XDR *xdrs, gfs3_setattr_rsp *objp)</div><div class='del'>-{</div><div class='del'>-</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;gfs_id))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_int (xdrs, &amp;objp-&gt;op_ret))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_int (xdrs, &amp;objp-&gt;op_errno))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_gf_iatt (xdrs, &amp;objp-&gt;statpre))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_gf_iatt (xdrs, &amp;objp-&gt;statpost))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	return TRUE;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-bool_t</div><div class='del'>-xdr_gfs3_fsetattr_req (XDR *xdrs, gfs3_fsetattr_req *objp)</div><div class='del'>-{</div><div class='del'>-</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;gfs_id))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_quad_t (xdrs, &amp;objp-&gt;fd))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_gf_iatt (xdrs, &amp;objp-&gt;stbuf))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_int (xdrs, &amp;objp-&gt;valid))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	return TRUE;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-bool_t</div><div class='del'>-xdr_gfs3_fsetattr_rsp (XDR *xdrs, gfs3_fsetattr_rsp *objp)</div><div class='del'>-{</div><div class='del'>-</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;gfs_id))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_int (xdrs, &amp;objp-&gt;op_ret))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_int (xdrs, &amp;objp-&gt;op_errno))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_gf_iatt (xdrs, &amp;objp-&gt;statpre))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_gf_iatt (xdrs, &amp;objp-&gt;statpost))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	return TRUE;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-bool_t</div><div class='del'>-xdr_gfs3_rchecksum_req (XDR *xdrs, gfs3_rchecksum_req *objp)</div><div class='del'>-{</div><div class='del'>-</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;gfs_id))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_quad_t (xdrs, &amp;objp-&gt;fd))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;offset))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_u_int (xdrs, &amp;objp-&gt;len))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	return TRUE;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-bool_t</div><div class='del'>-xdr_gfs3_rchecksum_rsp (XDR *xdrs, gfs3_rchecksum_rsp *objp)</div><div class='del'>-{</div><div class='del'>-	register int32_t *buf;</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-	if (xdrs-&gt;x_op == XDR_ENCODE) {</div><div class='del'>-		 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;gfs_id))</div><div class='del'>-			 return FALSE;</div><div class='del'>-		buf = XDR_INLINE (xdrs, 3 * BYTES_PER_XDR_UNIT);</div><div class='del'>-		if (buf == NULL) {</div><div class='del'>-			 if (!xdr_int (xdrs, &amp;objp-&gt;op_ret))</div><div class='del'>-				 return FALSE;</div><div class='del'>-			 if (!xdr_int (xdrs, &amp;objp-&gt;op_errno))</div><div class='del'>-				 return FALSE;</div><div class='del'>-			 if (!xdr_u_int (xdrs, &amp;objp-&gt;weak_checksum))</div><div class='del'>-				 return FALSE;</div><div class='del'>-</div><div class='del'>-		} else {</div><div class='del'>-		IXDR_PUT_LONG(buf, objp-&gt;op_ret);</div><div class='del'>-		IXDR_PUT_LONG(buf, objp-&gt;op_errno);</div><div class='del'>-		IXDR_PUT_U_LONG(buf, objp-&gt;weak_checksum);</div><div class='del'>-		}</div><div class='del'>-		 if (!xdr_bytes (xdrs, (char **)&amp;objp-&gt;strong_checksum.strong_checksum_val, (u_int *) &amp;objp-&gt;strong_checksum.strong_checksum_len, ~0))</div><div class='del'>-			 return FALSE;</div><div class='del'>-		return TRUE;</div><div class='del'>-	} else if (xdrs-&gt;x_op == XDR_DECODE) {</div><div class='del'>-		 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;gfs_id))</div><div class='del'>-			 return FALSE;</div><div class='del'>-		buf = XDR_INLINE (xdrs, 3 * BYTES_PER_XDR_UNIT);</div><div class='del'>-		if (buf == NULL) {</div><div class='del'>-			 if (!xdr_int (xdrs, &amp;objp-&gt;op_ret))</div><div class='del'>-				 return FALSE;</div><div class='del'>-			 if (!xdr_int (xdrs, &amp;objp-&gt;op_errno))</div><div class='del'>-				 return FALSE;</div><div class='del'>-			 if (!xdr_u_int (xdrs, &amp;objp-&gt;weak_checksum))</div><div class='del'>-				 return FALSE;</div><div class='del'>-</div><div class='del'>-		} else {</div><div class='del'>-		objp-&gt;op_ret = IXDR_GET_LONG(buf);</div><div class='del'>-		objp-&gt;op_errno = IXDR_GET_LONG(buf);</div><div class='del'>-		objp-&gt;weak_checksum = IXDR_GET_U_LONG(buf);</div><div class='del'>-		}</div><div class='del'>-		 if (!xdr_bytes (xdrs, (char **)&amp;objp-&gt;strong_checksum.strong_checksum_val, (u_int *) &amp;objp-&gt;strong_checksum.strong_checksum_len, ~0))</div><div class='del'>-			 return FALSE;</div><div class='del'>-	 return TRUE;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;gfs_id))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_int (xdrs, &amp;objp-&gt;op_ret))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_int (xdrs, &amp;objp-&gt;op_errno))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_u_int (xdrs, &amp;objp-&gt;weak_checksum))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_bytes (xdrs, (char **)&amp;objp-&gt;strong_checksum.strong_checksum_val, (u_int *) &amp;objp-&gt;strong_checksum.strong_checksum_len, ~0))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	return TRUE;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-bool_t</div><div class='del'>-xdr_gf_getspec_req (XDR *xdrs, gf_getspec_req *objp)</div><div class='del'>-{</div><div class='del'>-</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;gfs_id))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_u_int (xdrs, &amp;objp-&gt;flags))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_string (xdrs, &amp;objp-&gt;key, ~0))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	return TRUE;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-bool_t</div><div class='del'>-xdr_gf_getspec_rsp (XDR *xdrs, gf_getspec_rsp *objp)</div><div class='del'>-{</div><div class='del'>-</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;gfs_id))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_int (xdrs, &amp;objp-&gt;op_ret))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_int (xdrs, &amp;objp-&gt;op_errno))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_string (xdrs, &amp;objp-&gt;spec, ~0))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	return TRUE;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-bool_t</div><div class='del'>-xdr_gf_log_req (XDR *xdrs, gf_log_req *objp)</div><div class='del'>-{</div><div class='del'>-</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;gfs_id))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_bytes (xdrs, (char **)&amp;objp-&gt;msg.msg_val, (u_int *) &amp;objp-&gt;msg.msg_len, ~0))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	return TRUE;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-bool_t</div><div class='del'>-xdr_gf_notify_req (XDR *xdrs, gf_notify_req *objp)</div><div class='del'>-{</div><div class='del'>-</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;gfs_id))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_u_int (xdrs, &amp;objp-&gt;flags))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_string (xdrs, &amp;objp-&gt;buf, ~0))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	return TRUE;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-bool_t</div><div class='del'>-xdr_gf_notify_rsp (XDR *xdrs, gf_notify_rsp *objp)</div><div class='del'>-{</div><div class='del'>-	register int32_t *buf;</div><div class='del'>-</div><div class='del'>-	if (xdrs-&gt;x_op == XDR_ENCODE) {</div><div class='del'>-		 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;gfs_id))</div><div class='del'>-			 return FALSE;</div><div class='del'>-		buf = XDR_INLINE (xdrs, 3 * BYTES_PER_XDR_UNIT);</div><div class='del'>-		if (buf == NULL) {</div><div class='del'>-			 if (!xdr_int (xdrs, &amp;objp-&gt;op_ret))</div><div class='del'>-				 return FALSE;</div><div class='del'>-			 if (!xdr_int (xdrs, &amp;objp-&gt;op_errno))</div><div class='del'>-				 return FALSE;</div><div class='del'>-			 if (!xdr_u_int (xdrs, &amp;objp-&gt;flags))</div><div class='del'>-				 return FALSE;</div><div class='del'>-</div><div class='del'>-		} else {</div><div class='del'>-		IXDR_PUT_LONG(buf, objp-&gt;op_ret);</div><div class='del'>-		IXDR_PUT_LONG(buf, objp-&gt;op_errno);</div><div class='del'>-		IXDR_PUT_U_LONG(buf, objp-&gt;flags);</div><div class='del'>-		}</div><div class='del'>-		 if (!xdr_string (xdrs, &amp;objp-&gt;buf, ~0))</div><div class='del'>-			 return FALSE;</div><div class='del'>-		return TRUE;</div><div class='del'>-	} else if (xdrs-&gt;x_op == XDR_DECODE) {</div><div class='del'>-		 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;gfs_id))</div><div class='del'>-			 return FALSE;</div><div class='del'>-		buf = XDR_INLINE (xdrs, 3 * BYTES_PER_XDR_UNIT);</div><div class='del'>-		if (buf == NULL) {</div><div class='del'>-			 if (!xdr_int (xdrs, &amp;objp-&gt;op_ret))</div><div class='del'>-				 return FALSE;</div><div class='del'>-			 if (!xdr_int (xdrs, &amp;objp-&gt;op_errno))</div><div class='del'>-				 return FALSE;</div><div class='del'>-			 if (!xdr_u_int (xdrs, &amp;objp-&gt;flags))</div><div class='del'>-				 return FALSE;</div><div class='del'>-</div><div class='del'>-		} else {</div><div class='del'>-		objp-&gt;op_ret = IXDR_GET_LONG(buf);</div><div class='del'>-		objp-&gt;op_errno = IXDR_GET_LONG(buf);</div><div class='del'>-		objp-&gt;flags = IXDR_GET_U_LONG(buf);</div><div class='del'>-		}</div><div class='del'>-		 if (!xdr_string (xdrs, &amp;objp-&gt;buf, ~0))</div><div class='del'>-			 return FALSE;</div><div class='del'>-	 return TRUE;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;gfs_id))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_int (xdrs, &amp;objp-&gt;op_ret))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_int (xdrs, &amp;objp-&gt;op_errno))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_u_int (xdrs, &amp;objp-&gt;flags))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_string (xdrs, &amp;objp-&gt;buf, ~0))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	return TRUE;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-bool_t</div><div class='del'>-xdr_gfs3_releasedir_req (XDR *xdrs, gfs3_releasedir_req *objp)</div><div class='del'>-{</div><div class='del'>-</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;gfs_id))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_vector (xdrs, (char *)objp-&gt;gfid, 16,</div><div class='del'>-		sizeof (u_char), (xdrproc_t) xdr_u_char))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;ino))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;gen))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_quad_t (xdrs, &amp;objp-&gt;fd))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	return TRUE;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-bool_t</div><div class='del'>-xdr_gfs3_release_req (XDR *xdrs, gfs3_release_req *objp)</div><div class='del'>-{</div><div class='del'>-</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;gfs_id))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_vector (xdrs, (char *)objp-&gt;gfid, 16,</div><div class='del'>-		sizeof (u_char), (xdrproc_t) xdr_u_char))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;ino))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;gen))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_quad_t (xdrs, &amp;objp-&gt;fd))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	return TRUE;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-bool_t</div><div class='del'>-xdr_gf_common_rsp (XDR *xdrs, gf_common_rsp *objp)</div><div class='del'>-{</div><div class='del'>-</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;gfs_id))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_int (xdrs, &amp;objp-&gt;op_ret))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_int (xdrs, &amp;objp-&gt;op_errno))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	return TRUE;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-bool_t</div><div class='del'>-xdr_gfs3_dirlist (XDR *xdrs, gfs3_dirlist *objp)</div><div class='del'>-{</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;d_ino))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;d_off))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_u_int (xdrs, &amp;objp-&gt;d_len))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_u_int (xdrs, &amp;objp-&gt;d_type))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_string (xdrs, &amp;objp-&gt;name, ~0))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_pointer (xdrs, (char **)&amp;objp-&gt;nextentry, sizeof (gfs3_dirlist), (xdrproc_t) xdr_gfs3_dirlist))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	return TRUE;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-bool_t</div><div class='del'>-xdr_gfs3_readdir_rsp (XDR *xdrs, gfs3_readdir_rsp *objp)</div><div class='del'>-{</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;gfs_id))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_int (xdrs, &amp;objp-&gt;op_ret))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_int (xdrs, &amp;objp-&gt;op_errno))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_pointer (xdrs, (char **)&amp;objp-&gt;reply, sizeof (gfs3_dirlist), (xdrproc_t) xdr_gfs3_dirlist))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	return TRUE;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-bool_t</div><div class='del'>-xdr_gfs3_dirplist (XDR *xdrs, gfs3_dirplist *objp)</div><div class='del'>-{</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;d_ino))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;d_off))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_u_int (xdrs, &amp;objp-&gt;d_len))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_u_int (xdrs, &amp;objp-&gt;d_type))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_string (xdrs, &amp;objp-&gt;name, ~0))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_gf_iatt (xdrs, &amp;objp-&gt;stat))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_pointer (xdrs, (char **)&amp;objp-&gt;nextentry, sizeof (gfs3_dirplist), (xdrproc_t) xdr_gfs3_dirplist))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	return TRUE;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-bool_t</div><div class='del'>-xdr_gfs3_readdirp_rsp (XDR *xdrs, gfs3_readdirp_rsp *objp)</div><div class='del'>-{</div><div class='del'>-	 if (!xdr_u_quad_t (xdrs, &amp;objp-&gt;gfs_id))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_int (xdrs, &amp;objp-&gt;op_ret))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_int (xdrs, &amp;objp-&gt;op_errno))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_pointer (xdrs, (char **)&amp;objp-&gt;reply, sizeof (struct gfs3_dirplist), (xdrproc_t) xdr_gfs3_dirplist))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	return TRUE;</div><div class='del'>-}</div><div class='head'>diff --git a/rpc/xdr/src/glusterfs3-xdr.h b/rpc/xdr/src/glusterfs3-xdr.h<br/>deleted file mode 100644<br/>index bcd293da6e6..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/rpc/xdr/src/glusterfs3-xdr.h?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>rpc/xdr/src/glusterfs3-xdr.h</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,1369 +0,0 @@</div><div class='del'>-/*</div><div class='del'>-  Copyright (c) 2010 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='del'>-  This file is part of GlusterFS.</div><div class='del'>-</div><div class='del'>-  GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-  it under the terms of the GNU Affero General Public License as published</div><div class='del'>-  by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-  or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-  GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-  WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-  Affero General Public License for more details.</div><div class='del'>-</div><div class='del'>-  You should have received a copy of the GNU Affero General Public License</div><div class='del'>-  along with this program.  If not, see</div><div class='del'>-  &lt;http://www.gnu.org/licenses/&gt;.</div><div class='del'>-*/</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-/*</div><div class='del'>- * Please do not edit this file.</div><div class='del'>- * It was generated using rpcgen.</div><div class='del'>- */</div><div class='del'>-</div><div class='del'>-#ifndef _GLUSTERFS3_H_RPCGEN</div><div class='del'>-#define _GLUSTERFS3_H_RPCGEN</div><div class='del'>-</div><div class='del'>-//#include &lt;rpc/rpc.h&gt;</div><div class='del'>-#include "xdr-common.h"</div><div class='del'>-#include "iatt.h"</div><div class='del'>-</div><div class='del'>-#ifdef __cplusplus</div><div class='del'>-extern "C" {</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-#define GF_O_ACCMODE           003</div><div class='del'>-#define GF_O_RDONLY             00</div><div class='del'>-#define GF_O_WRONLY             01</div><div class='del'>-#define GF_O_RDWR               02</div><div class='del'>-#define GF_O_CREAT            0100</div><div class='del'>-#define GF_O_EXCL             0200</div><div class='del'>-#define GF_O_NOCTTY           0400</div><div class='del'>-#define GF_O_TRUNC           01000</div><div class='del'>-#define GF_O_APPEND          02000</div><div class='del'>-#define GF_O_NONBLOCK        04000</div><div class='del'>-#define GF_O_SYNC           010000</div><div class='del'>-#define GF_O_ASYNC          020000</div><div class='del'>-</div><div class='del'>-#define GF_O_DIRECT         040000</div><div class='del'>-#define GF_O_DIRECTORY     0200000</div><div class='del'>-#define GF_O_NOFOLLOW      0400000</div><div class='del'>-#define GF_O_NOATIME      01000000</div><div class='del'>-#define GF_O_CLOEXEC      02000000</div><div class='del'>-</div><div class='del'>-#define GF_O_LARGEFILE     0100000</div><div class='del'>-</div><div class='del'>-#define XLATE_BIT(from, to, bit)    do {                \</div><div class='del'>-                if (from &amp; bit)                         \</div><div class='del'>-                        to = to | GF_##bit;             \</div><div class='del'>-        } while (0)</div><div class='del'>-</div><div class='del'>-#define UNXLATE_BIT(from, to, bit)  do {                \</div><div class='del'>-                if (from &amp; GF_##bit)                    \</div><div class='del'>-                        to = to | bit;                  \</div><div class='del'>-        } while (0)</div><div class='del'>-</div><div class='del'>-#define XLATE_ACCESSMODE(from, to) do {                 \</div><div class='del'>-                switch (from &amp; O_ACCMODE) {             \</div><div class='del'>-                case O_RDONLY: to |= GF_O_RDONLY;       \</div><div class='del'>-                        break;                          \</div><div class='del'>-                case O_WRONLY: to |= GF_O_WRONLY;       \</div><div class='del'>-                        break;                          \</div><div class='del'>-                case O_RDWR: to |= GF_O_RDWR;           \</div><div class='del'>-                        break;                          \</div><div class='del'>-                }                                       \</div><div class='del'>-        } while (0)</div><div class='del'>-</div><div class='del'>-#define UNXLATE_ACCESSMODE(from, to) do {               \</div><div class='del'>-                switch (from &amp; GF_O_ACCMODE) {          \</div><div class='del'>-                case GF_O_RDONLY: to |= O_RDONLY;       \</div><div class='del'>-                        break;                          \</div><div class='del'>-                case GF_O_WRONLY: to |= O_WRONLY;       \</div><div class='del'>-                        break;                          \</div><div class='del'>-                case GF_O_RDWR: to |= O_RDWR;           \</div><div class='del'>-                        break;                          \</div><div class='del'>-                }                                       \</div><div class='del'>-        } while (0)</div><div class='del'>-</div><div class='del'>-static inline uint32_t</div><div class='del'>-gf_flags_from_flags (uint32_t flags)</div><div class='del'>-{</div><div class='del'>-        uint32_t gf_flags = 0;</div><div class='del'>-</div><div class='del'>-        XLATE_ACCESSMODE (flags, gf_flags);</div><div class='del'>-</div><div class='del'>-        XLATE_BIT (flags, gf_flags, O_CREAT);</div><div class='del'>-        XLATE_BIT (flags, gf_flags, O_EXCL);</div><div class='del'>-        XLATE_BIT (flags, gf_flags, O_NOCTTY);</div><div class='del'>-        XLATE_BIT (flags, gf_flags, O_TRUNC);</div><div class='del'>-        XLATE_BIT (flags, gf_flags, O_APPEND);</div><div class='del'>-        XLATE_BIT (flags, gf_flags, O_NONBLOCK);</div><div class='del'>-        XLATE_BIT (flags, gf_flags, O_SYNC);</div><div class='del'>-        XLATE_BIT (flags, gf_flags, O_ASYNC);</div><div class='del'>-</div><div class='del'>-        XLATE_BIT (flags, gf_flags, O_DIRECT);</div><div class='del'>-        XLATE_BIT (flags, gf_flags, O_DIRECTORY);</div><div class='del'>-        XLATE_BIT (flags, gf_flags, O_NOFOLLOW);</div><div class='del'>-#ifdef O_NOATIME</div><div class='del'>-        XLATE_BIT (flags, gf_flags, O_NOATIME);</div><div class='del'>-#endif</div><div class='del'>-#ifdef O_CLOEXEC</div><div class='del'>-        XLATE_BIT (flags, gf_flags, O_CLOEXEC);</div><div class='del'>-#endif</div><div class='del'>-        XLATE_BIT (flags, gf_flags, O_LARGEFILE);</div><div class='del'>-</div><div class='del'>-        return gf_flags;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-static inline uint32_t</div><div class='del'>-gf_flags_to_flags (uint32_t gf_flags)</div><div class='del'>-{</div><div class='del'>-        uint32_t flags = 0;</div><div class='del'>-</div><div class='del'>-        UNXLATE_ACCESSMODE (gf_flags, flags);</div><div class='del'>-</div><div class='del'>-        UNXLATE_BIT (gf_flags, flags, O_CREAT);</div><div class='del'>-        UNXLATE_BIT (gf_flags, flags, O_EXCL);</div><div class='del'>-        UNXLATE_BIT (gf_flags, flags, O_NOCTTY);</div><div class='del'>-        UNXLATE_BIT (gf_flags, flags, O_TRUNC);</div><div class='del'>-        UNXLATE_BIT (gf_flags, flags, O_APPEND);</div><div class='del'>-        UNXLATE_BIT (gf_flags, flags, O_NONBLOCK);</div><div class='del'>-        UNXLATE_BIT (gf_flags, flags, O_SYNC);</div><div class='del'>-        UNXLATE_BIT (gf_flags, flags, O_ASYNC);</div><div class='del'>-</div><div class='del'>-        UNXLATE_BIT (gf_flags, flags, O_DIRECT);</div><div class='del'>-        UNXLATE_BIT (gf_flags, flags, O_DIRECTORY);</div><div class='del'>-        UNXLATE_BIT (gf_flags, flags, O_NOFOLLOW);</div><div class='del'>-#ifdef O_NOATIME</div><div class='del'>-        UNXLATE_BIT (gf_flags, flags, O_NOATIME);</div><div class='del'>-#endif</div><div class='del'>-#ifdef O_CLOEXEC</div><div class='del'>-        UNXLATE_BIT (gf_flags, flags, O_CLOEXEC);</div><div class='del'>-#endif</div><div class='del'>-        UNXLATE_BIT (gf_flags, flags, O_LARGEFILE);</div><div class='del'>-</div><div class='del'>-        return flags;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-struct gf_statfs {</div><div class='del'>-	u_quad_t bsize;</div><div class='del'>-	u_quad_t frsize;</div><div class='del'>-	u_quad_t blocks;</div><div class='del'>-	u_quad_t bfree;</div><div class='del'>-	u_quad_t bavail;</div><div class='del'>-	u_quad_t files;</div><div class='del'>-	u_quad_t ffree;</div><div class='del'>-	u_quad_t favail;</div><div class='del'>-	u_quad_t fsid;</div><div class='del'>-	u_quad_t flag;</div><div class='del'>-	u_quad_t namemax;</div><div class='del'>-};</div><div class='del'>-typedef struct gf_statfs gf_statfs;</div><div class='del'>-</div><div class='del'>-static inline void</div><div class='del'>-gf_statfs_to_statfs (struct gf_statfs *gf_stat, struct statvfs *stat)</div><div class='del'>-{</div><div class='del'>-        if (!stat || !gf_stat)</div><div class='del'>-                return;</div><div class='del'>-</div><div class='del'>-	stat-&gt;f_bsize   =  (gf_stat-&gt;bsize);</div><div class='del'>-	stat-&gt;f_frsize  =  (gf_stat-&gt;frsize);</div><div class='del'>-	stat-&gt;f_blocks  =  (gf_stat-&gt;blocks);</div><div class='del'>-	stat-&gt;f_bfree   =  (gf_stat-&gt;bfree);</div><div class='del'>-	stat-&gt;f_bavail  =  (gf_stat-&gt;bavail);</div><div class='del'>-	stat-&gt;f_files   =  (gf_stat-&gt;files);</div><div class='del'>-	stat-&gt;f_ffree   =  (gf_stat-&gt;ffree);</div><div class='del'>-	stat-&gt;f_favail  =  (gf_stat-&gt;favail);</div><div class='del'>-	stat-&gt;f_fsid    =  (gf_stat-&gt;fsid);</div><div class='del'>-	stat-&gt;f_flag    =  (gf_stat-&gt;flag);</div><div class='del'>-	stat-&gt;f_namemax =  (gf_stat-&gt;namemax);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-static inline void</div><div class='del'>-gf_statfs_from_statfs (struct gf_statfs *gf_stat, struct statvfs *stat)</div><div class='del'>-{</div><div class='del'>-        if (!stat || !gf_stat)</div><div class='del'>-                return;</div><div class='del'>-</div><div class='del'>-	gf_stat-&gt;bsize   = stat-&gt;f_bsize;</div><div class='del'>-	gf_stat-&gt;frsize  = stat-&gt;f_frsize;</div><div class='del'>-	gf_stat-&gt;blocks  = stat-&gt;f_blocks;</div><div class='del'>-	gf_stat-&gt;bfree   = stat-&gt;f_bfree;</div><div class='del'>-	gf_stat-&gt;bavail  = stat-&gt;f_bavail;</div><div class='del'>-	gf_stat-&gt;files   = stat-&gt;f_files;</div><div class='del'>-	gf_stat-&gt;ffree   = stat-&gt;f_ffree;</div><div class='del'>-	gf_stat-&gt;favail  = stat-&gt;f_favail;</div><div class='del'>-	gf_stat-&gt;fsid    = stat-&gt;f_fsid;</div><div class='del'>-	gf_stat-&gt;flag    = stat-&gt;f_flag;</div><div class='del'>-	gf_stat-&gt;namemax = stat-&gt;f_namemax;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-struct gf_flock {</div><div class='del'>-	u_int type;</div><div class='del'>-	u_int whence;</div><div class='del'>-	u_quad_t start;</div><div class='del'>-	u_quad_t len;</div><div class='del'>-	u_int pid;</div><div class='del'>-};</div><div class='del'>-typedef struct gf_flock gf_flock;</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-static inline void</div><div class='del'>-gf_flock_to_flock (struct gf_flock *gf_flock, struct flock *flock)</div><div class='del'>-{</div><div class='del'>-        if (!flock || !gf_flock)</div><div class='del'>-                return;</div><div class='del'>-</div><div class='del'>-	flock-&gt;l_type   = gf_flock-&gt;type;</div><div class='del'>-	flock-&gt;l_whence = gf_flock-&gt;whence;</div><div class='del'>-	flock-&gt;l_start  = gf_flock-&gt;start;</div><div class='del'>-	flock-&gt;l_len    = gf_flock-&gt;len;</div><div class='del'>-	flock-&gt;l_pid    = gf_flock-&gt;pid;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-static inline void</div><div class='del'>-gf_flock_from_flock (struct gf_flock *gf_flock, struct flock *flock)</div><div class='del'>-{</div><div class='del'>-        if (!flock || !gf_flock)</div><div class='del'>-                return;</div><div class='del'>-</div><div class='del'>-	gf_flock-&gt;type   =  (flock-&gt;l_type);</div><div class='del'>-	gf_flock-&gt;whence =  (flock-&gt;l_whence);</div><div class='del'>-	gf_flock-&gt;start  =  (flock-&gt;l_start);</div><div class='del'>-	gf_flock-&gt;len    =  (flock-&gt;l_len);</div><div class='del'>-	gf_flock-&gt;pid    =  (flock-&gt;l_pid);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-struct gf_iatt {</div><div class='del'>-	u_char ia_gfid[16];</div><div class='del'>-	u_quad_t ia_ino;</div><div class='del'>-	u_quad_t ia_gen;</div><div class='del'>-	u_quad_t ia_dev;</div><div class='del'>-	u_int mode;</div><div class='del'>-	u_int ia_nlink;</div><div class='del'>-	u_int ia_uid;</div><div class='del'>-	u_int ia_gid;</div><div class='del'>-	u_quad_t ia_rdev;</div><div class='del'>-	u_quad_t ia_size;</div><div class='del'>-	u_int ia_blksize;</div><div class='del'>-	u_quad_t ia_blocks;</div><div class='del'>-	u_int ia_atime;</div><div class='del'>-	u_int ia_atime_nsec;</div><div class='del'>-	u_int ia_mtime;</div><div class='del'>-	u_int ia_mtime_nsec;</div><div class='del'>-	u_int ia_ctime;</div><div class='del'>-	u_int ia_ctime_nsec;</div><div class='del'>-} __attribute__((packed));</div><div class='del'>-typedef struct gf_iatt gf_iatt;</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-static inline void</div><div class='del'>-gf_stat_to_iatt (struct gf_iatt *gf_stat, struct iatt *iatt)</div><div class='del'>-{</div><div class='del'>-        if (!iatt || !gf_stat)</div><div class='del'>-                return;</div><div class='del'>-</div><div class='del'>-        memcpy (iatt-&gt;ia_gfid, gf_stat-&gt;ia_gfid, 16);</div><div class='del'>-	iatt-&gt;ia_ino = gf_stat-&gt;ia_ino ;</div><div class='del'>-	iatt-&gt;ia_gen = gf_stat-&gt;ia_gen ;</div><div class='del'>-	iatt-&gt;ia_dev = gf_stat-&gt;ia_dev ;</div><div class='del'>-	iatt-&gt;ia_type = ia_type_from_st_mode (gf_stat-&gt;mode) ;</div><div class='del'>-	iatt-&gt;ia_prot = ia_prot_from_st_mode (gf_stat-&gt;mode) ;</div><div class='del'>-	iatt-&gt;ia_nlink = gf_stat-&gt;ia_nlink ;</div><div class='del'>-	iatt-&gt;ia_uid = gf_stat-&gt;ia_uid ;</div><div class='del'>-	iatt-&gt;ia_gid = gf_stat-&gt;ia_gid ;</div><div class='del'>-	iatt-&gt;ia_rdev = gf_stat-&gt;ia_rdev ;</div><div class='del'>-	iatt-&gt;ia_size = gf_stat-&gt;ia_size ;</div><div class='del'>-	iatt-&gt;ia_blksize = gf_stat-&gt;ia_blksize ;</div><div class='del'>-	iatt-&gt;ia_blocks = gf_stat-&gt;ia_blocks ;</div><div class='del'>-	iatt-&gt;ia_atime = gf_stat-&gt;ia_atime ;</div><div class='del'>-	iatt-&gt;ia_atime_nsec = gf_stat-&gt;ia_atime_nsec ;</div><div class='del'>-	iatt-&gt;ia_mtime = gf_stat-&gt;ia_mtime ;</div><div class='del'>-	iatt-&gt;ia_mtime_nsec = gf_stat-&gt;ia_mtime_nsec ;</div><div class='del'>-	iatt-&gt;ia_ctime = gf_stat-&gt;ia_ctime ;</div><div class='del'>-	iatt-&gt;ia_ctime_nsec = gf_stat-&gt;ia_ctime_nsec ;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-static inline void</div><div class='del'>-gf_stat_from_iatt (struct gf_iatt *gf_stat, struct iatt *iatt)</div><div class='del'>-{</div><div class='del'>-        if (!iatt || !gf_stat)</div><div class='del'>-                return;</div><div class='del'>-</div><div class='del'>-        memcpy (gf_stat-&gt;ia_gfid, iatt-&gt;ia_gfid, 16);</div><div class='del'>-	gf_stat-&gt;ia_ino = iatt-&gt;ia_ino ;</div><div class='del'>-	gf_stat-&gt;ia_gen = iatt-&gt;ia_gen ;</div><div class='del'>-	gf_stat-&gt;ia_dev = iatt-&gt;ia_dev ;</div><div class='del'>-	gf_stat-&gt;mode   = st_mode_from_ia (iatt-&gt;ia_prot, iatt-&gt;ia_type);</div><div class='del'>-	gf_stat-&gt;ia_nlink = iatt-&gt;ia_nlink ;</div><div class='del'>-	gf_stat-&gt;ia_uid = iatt-&gt;ia_uid ;</div><div class='del'>-	gf_stat-&gt;ia_gid = iatt-&gt;ia_gid ;</div><div class='del'>-	gf_stat-&gt;ia_rdev = iatt-&gt;ia_rdev ;</div><div class='del'>-	gf_stat-&gt;ia_size = iatt-&gt;ia_size ;</div><div class='del'>-	gf_stat-&gt;ia_blksize = iatt-&gt;ia_blksize ;</div><div class='del'>-	gf_stat-&gt;ia_blocks = iatt-&gt;ia_blocks ;</div><div class='del'>-	gf_stat-&gt;ia_atime = iatt-&gt;ia_atime ;</div><div class='del'>-	gf_stat-&gt;ia_atime_nsec = iatt-&gt;ia_atime_nsec ;</div><div class='del'>-	gf_stat-&gt;ia_mtime = iatt-&gt;ia_mtime ;</div><div class='del'>-	gf_stat-&gt;ia_mtime_nsec = iatt-&gt;ia_mtime_nsec ;</div><div class='del'>-	gf_stat-&gt;ia_ctime = iatt-&gt;ia_ctime ;</div><div class='del'>-	gf_stat-&gt;ia_ctime_nsec = iatt-&gt;ia_ctime_nsec ;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-/* Gluster FS Payload structures */</div><div class='del'>-</div><div class='del'>-struct gfs3_stat_req {</div><div class='del'>-	u_quad_t gfs_id;</div><div class='del'>-	u_char gfid[16];</div><div class='del'>-	u_quad_t ino;</div><div class='del'>-	u_quad_t gen;</div><div class='del'>-	char *path;</div><div class='del'>-};</div><div class='del'>-typedef struct gfs3_stat_req gfs3_stat_req;</div><div class='del'>-</div><div class='del'>-struct gfs3_stat_rsp {</div><div class='del'>-	u_quad_t gfs_id;</div><div class='del'>-	int op_ret;</div><div class='del'>-	int op_errno;</div><div class='del'>-	struct gf_iatt stat;</div><div class='del'>-};</div><div class='del'>-typedef struct gfs3_stat_rsp gfs3_stat_rsp;</div><div class='del'>-</div><div class='del'>-struct gfs3_readlink_req {</div><div class='del'>-	u_quad_t gfs_id;</div><div class='del'>-	u_char gfid[16];</div><div class='del'>-	u_quad_t ino;</div><div class='del'>-	u_quad_t gen;</div><div class='del'>-	u_int size;</div><div class='del'>-	char *path;</div><div class='del'>-};</div><div class='del'>-typedef struct gfs3_readlink_req gfs3_readlink_req;</div><div class='del'>-</div><div class='del'>-struct gfs3_readlink_rsp {</div><div class='del'>-	u_quad_t gfs_id;</div><div class='del'>-	int op_ret;</div><div class='del'>-	int op_errno;</div><div class='del'>-	struct gf_iatt buf;</div><div class='del'>-	char *path;</div><div class='del'>-};</div><div class='del'>-typedef struct gfs3_readlink_rsp gfs3_readlink_rsp;</div><div class='del'>-</div><div class='del'>-struct gfs3_mknod_req {</div><div class='del'>-	u_quad_t gfs_id;</div><div class='del'>-	u_char pargfid[16];</div><div class='del'>-	u_quad_t par;</div><div class='del'>-	u_quad_t gen;</div><div class='del'>-	u_quad_t dev;</div><div class='del'>-	u_int mode;</div><div class='del'>-	char *path;</div><div class='del'>-	char *bname;</div><div class='del'>-	struct {</div><div class='del'>-		u_int dict_len;</div><div class='del'>-		char *dict_val;</div><div class='del'>-	} dict;</div><div class='del'>-</div><div class='del'>-};</div><div class='del'>-typedef struct gfs3_mknod_req gfs3_mknod_req;</div><div class='del'>-</div><div class='del'>-struct gfs3_mknod_rsp {</div><div class='del'>-	u_quad_t gfs_id;</div><div class='del'>-	int op_ret;</div><div class='del'>-	int op_errno;</div><div class='del'>-	struct gf_iatt stat;</div><div class='del'>-	struct gf_iatt preparent;</div><div class='del'>-	struct gf_iatt postparent;</div><div class='del'>-};</div><div class='del'>-typedef struct gfs3_mknod_rsp gfs3_mknod_rsp;</div><div class='del'>-</div><div class='del'>-struct gfs3_mkdir_req {</div><div class='del'>-	u_quad_t gfs_id;</div><div class='del'>-	u_char pargfid[16];</div><div class='del'>-	u_quad_t par;</div><div class='del'>-	u_quad_t gen;</div><div class='del'>-	u_int mode;</div><div class='del'>-	char *path;</div><div class='del'>-	char *bname;</div><div class='del'>-	struct {</div><div class='del'>-		u_int dict_len;</div><div class='del'>-		char *dict_val;</div><div class='del'>-	} dict;</div><div class='del'>-};</div><div class='del'>-typedef struct gfs3_mkdir_req gfs3_mkdir_req;</div><div class='del'>-</div><div class='del'>-struct gfs3_mkdir_rsp {</div><div class='del'>-	u_quad_t gfs_id;</div><div class='del'>-	int op_ret;</div><div class='del'>-	int op_errno;</div><div class='del'>-	struct gf_iatt stat;</div><div class='del'>-	struct gf_iatt preparent;</div><div class='del'>-	struct gf_iatt postparent;</div><div class='del'>-};</div><div class='del'>-typedef struct gfs3_mkdir_rsp gfs3_mkdir_rsp;</div><div class='del'>-</div><div class='del'>-struct gfs3_unlink_req {</div><div class='del'>-	u_quad_t gfs_id;</div><div class='del'>-	u_char pargfid[16];</div><div class='del'>-	u_quad_t par;</div><div class='del'>-	u_quad_t gen;</div><div class='del'>-	char *path;</div><div class='del'>-	char *bname;</div><div class='del'>-};</div><div class='del'>-typedef struct gfs3_unlink_req gfs3_unlink_req;</div><div class='del'>-</div><div class='del'>-struct gfs3_unlink_rsp {</div><div class='del'>-	u_quad_t gfs_id;</div><div class='del'>-	int op_ret;</div><div class='del'>-	int op_errno;</div><div class='del'>-	struct gf_iatt preparent;</div><div class='del'>-	struct gf_iatt postparent;</div><div class='del'>-};</div><div class='del'>-typedef struct gfs3_unlink_rsp gfs3_unlink_rsp;</div><div class='del'>-</div><div class='del'>-struct gfs3_rmdir_req {</div><div class='del'>-	u_quad_t gfs_id;</div><div class='del'>-	u_char pargfid[16];</div><div class='del'>-	u_quad_t par;</div><div class='del'>-	u_quad_t gen;</div><div class='del'>-	char *path;</div><div class='del'>-	char *bname;</div><div class='del'>-};</div><div class='del'>-typedef struct gfs3_rmdir_req gfs3_rmdir_req;</div><div class='del'>-</div><div class='del'>-struct gfs3_rmdir_rsp {</div><div class='del'>-	u_quad_t gfs_id;</div><div class='del'>-	int op_ret;</div><div class='del'>-	int op_errno;</div><div class='del'>-	struct gf_iatt preparent;</div><div class='del'>-	struct gf_iatt postparent;</div><div class='del'>-};</div><div class='del'>-typedef struct gfs3_rmdir_rsp gfs3_rmdir_rsp;</div><div class='del'>-</div><div class='del'>-struct gfs3_symlink_req {</div><div class='del'>-	u_quad_t gfs_id;</div><div class='del'>-	u_char pargfid[16];</div><div class='del'>-	u_quad_t par;</div><div class='del'>-	u_quad_t gen;</div><div class='del'>-	char *path;</div><div class='del'>-	char *bname;</div><div class='del'>-	char *linkname;</div><div class='del'>-	struct {</div><div class='del'>-		u_int dict_len;</div><div class='del'>-		char *dict_val;</div><div class='del'>-	} dict;</div><div class='del'>-};</div><div class='del'>-typedef struct gfs3_symlink_req gfs3_symlink_req;</div><div class='del'>-</div><div class='del'>-struct gfs3_symlink_rsp {</div><div class='del'>-	u_quad_t gfs_id;</div><div class='del'>-	int op_ret;</div><div class='del'>-	int op_errno;</div><div class='del'>-	struct gf_iatt stat;</div><div class='del'>-	struct gf_iatt preparent;</div><div class='del'>-	struct gf_iatt postparent;</div><div class='del'>-};</div><div class='del'>-typedef struct gfs3_symlink_rsp gfs3_symlink_rsp;</div><div class='del'>-</div><div class='del'>-struct gfs3_rename_req {</div><div class='del'>-	u_quad_t gfs_id;</div><div class='del'>-	u_char oldgfid[16];</div><div class='del'>-	u_char newgfid[16];</div><div class='del'>-	u_quad_t oldpar;</div><div class='del'>-	u_quad_t oldgen;</div><div class='del'>-	u_quad_t newpar;</div><div class='del'>-	u_quad_t newgen;</div><div class='del'>-	char *oldpath;</div><div class='del'>-	char *oldbname;</div><div class='del'>-	char *newpath;</div><div class='del'>-	char *newbname;</div><div class='del'>-};</div><div class='del'>-typedef struct gfs3_rename_req gfs3_rename_req;</div><div class='del'>-</div><div class='del'>-struct gfs3_rename_rsp {</div><div class='del'>-	u_quad_t gfs_id;</div><div class='del'>-	int op_ret;</div><div class='del'>-	int op_errno;</div><div class='del'>-	struct gf_iatt stat;</div><div class='del'>-	struct gf_iatt preoldparent;</div><div class='del'>-	struct gf_iatt postoldparent;</div><div class='del'>-	struct gf_iatt prenewparent;</div><div class='del'>-	struct gf_iatt postnewparent;</div><div class='del'>-};</div><div class='del'>-typedef struct gfs3_rename_rsp gfs3_rename_rsp;</div><div class='del'>-</div><div class='del'>-struct gfs3_link_req {</div><div class='del'>-	u_quad_t gfs_id;</div><div class='del'>-	u_char oldgfid[16];</div><div class='del'>-	u_char newgfid[16];</div><div class='del'>-	u_quad_t oldino;</div><div class='del'>-	u_quad_t oldgen;</div><div class='del'>-	u_quad_t newpar;</div><div class='del'>-	u_quad_t newgen;</div><div class='del'>-	char *oldpath;</div><div class='del'>-	char *newpath;</div><div class='del'>-	char *newbname;</div><div class='del'>-};</div><div class='del'>-typedef struct gfs3_link_req gfs3_link_req;</div><div class='del'>-</div><div class='del'>-struct gfs3_link_rsp {</div><div class='del'>-	u_quad_t gfs_id;</div><div class='del'>-	int op_ret;</div><div class='del'>-	int op_errno;</div><div class='del'>-	struct gf_iatt stat;</div><div class='del'>-	struct gf_iatt preparent;</div><div class='del'>-	struct gf_iatt postparent;</div><div class='del'>-};</div><div class='del'>-typedef struct gfs3_link_rsp gfs3_link_rsp;</div><div class='del'>-</div><div class='del'>-struct gfs3_truncate_req {</div><div class='del'>-	u_quad_t gfs_id;</div><div class='del'>-	u_char gfid[16];</div><div class='del'>-	u_quad_t ino;</div><div class='del'>-	u_quad_t gen;</div><div class='del'>-	u_quad_t offset;</div><div class='del'>-	char *path;</div><div class='del'>-};</div><div class='del'>-typedef struct gfs3_truncate_req gfs3_truncate_req;</div><div class='del'>-</div><div class='del'>-struct gfs3_truncate_rsp {</div><div class='del'>-	u_quad_t gfs_id;</div><div class='del'>-	int op_ret;</div><div class='del'>-	int op_errno;</div><div class='del'>-	struct gf_iatt prestat;</div><div class='del'>-	struct gf_iatt poststat;</div><div class='del'>-};</div><div class='del'>-typedef struct gfs3_truncate_rsp gfs3_truncate_rsp;</div><div class='del'>-</div><div class='del'>-struct gfs3_open_req {</div><div class='del'>-	u_quad_t gfs_id;</div><div class='del'>-	u_char gfid[16];</div><div class='del'>-	u_quad_t ino;</div><div class='del'>-	u_quad_t gen;</div><div class='del'>-	u_int flags;</div><div class='del'>-	u_int wbflags;</div><div class='del'>-	char *path;</div><div class='del'>-};</div><div class='del'>-typedef struct gfs3_open_req gfs3_open_req;</div><div class='del'>-</div><div class='del'>-struct gfs3_open_rsp {</div><div class='del'>-	u_quad_t gfs_id;</div><div class='del'>-	int op_ret;</div><div class='del'>-	int op_errno;</div><div class='del'>-	quad_t fd;</div><div class='del'>-};</div><div class='del'>-typedef struct gfs3_open_rsp gfs3_open_rsp;</div><div class='del'>-</div><div class='del'>-struct gfs3_read_req {</div><div class='del'>-	u_quad_t gfs_id;</div><div class='del'>-	u_char gfid[16];</div><div class='del'>-	u_quad_t ino;</div><div class='del'>-	u_quad_t gen;</div><div class='del'>-	quad_t fd;</div><div class='del'>-	u_quad_t offset;</div><div class='del'>-	u_int size;</div><div class='del'>-};</div><div class='del'>-typedef struct gfs3_read_req gfs3_read_req;</div><div class='del'>-</div><div class='del'>-struct gfs3_read_rsp {</div><div class='del'>-	u_quad_t gfs_id;</div><div class='del'>-	int op_ret;</div><div class='del'>-	int op_errno;</div><div class='del'>-	struct gf_iatt stat;</div><div class='del'>-        u_int size;</div><div class='del'>-} __attribute__((packed));</div><div class='del'>-typedef struct gfs3_read_rsp gfs3_read_rsp;</div><div class='del'>-</div><div class='del'>-struct gfs3_lookup_req {</div><div class='del'>-	u_quad_t gfs_id;</div><div class='del'>-	u_char gfid[16];</div><div class='del'>-	u_char pargfid[16];</div><div class='del'>-	u_quad_t ino;</div><div class='del'>-	u_quad_t par;</div><div class='del'>-	u_quad_t gen;</div><div class='del'>-	u_int flags;</div><div class='del'>-	char *path;</div><div class='del'>-	char *bname;</div><div class='del'>-	struct {</div><div class='del'>-		u_int dict_len;</div><div class='del'>-		char *dict_val;</div><div class='del'>-	} dict;</div><div class='del'>-};</div><div class='del'>-typedef struct gfs3_lookup_req gfs3_lookup_req;</div><div class='del'>-</div><div class='del'>-struct gfs3_lookup_rsp {</div><div class='del'>-	u_quad_t gfs_id;</div><div class='del'>-	int op_ret;</div><div class='del'>-	int op_errno;</div><div class='del'>-	struct gf_iatt stat;</div><div class='del'>-	struct gf_iatt postparent;</div><div class='del'>-	struct {</div><div class='del'>-		u_int dict_len;</div><div class='del'>-		char *dict_val;</div><div class='del'>-	} dict;</div><div class='del'>-};</div><div class='del'>-typedef struct gfs3_lookup_rsp gfs3_lookup_rsp;</div><div class='del'>-</div><div class='del'>-struct gfs3_write_req {</div><div class='del'>-	u_quad_t gfs_id;</div><div class='del'>-	u_char gfid[16];</div><div class='del'>-	u_quad_t ino;</div><div class='del'>-	u_quad_t gen;</div><div class='del'>-	quad_t fd;</div><div class='del'>-	u_quad_t offset;</div><div class='del'>-	u_int size;</div><div class='del'>-} __attribute__((packed));</div><div class='del'>-typedef struct gfs3_write_req gfs3_write_req;</div><div class='del'>-</div><div class='del'>-struct gfs3_write_rsp {</div><div class='del'>-	u_quad_t gfs_id;</div><div class='del'>-	int op_ret;</div><div class='del'>-	int op_errno;</div><div class='del'>-	struct gf_iatt prestat;</div><div class='del'>-	struct gf_iatt poststat;</div><div class='del'>-};</div><div class='del'>-typedef struct gfs3_write_rsp gfs3_write_rsp;</div><div class='del'>-</div><div class='del'>-struct gfs3_statfs_req {</div><div class='del'>-	u_quad_t gfs_id;</div><div class='del'>-	u_char gfid[16];</div><div class='del'>-	u_quad_t ino;</div><div class='del'>-	u_quad_t gen;</div><div class='del'>-	char *path;</div><div class='del'>-};</div><div class='del'>-typedef struct gfs3_statfs_req gfs3_statfs_req;</div><div class='del'>-</div><div class='del'>-struct gfs3_statfs_rsp {</div><div class='del'>-	u_quad_t gfs_id;</div><div class='del'>-	int op_ret;</div><div class='del'>-	int op_errno;</div><div class='del'>-	struct gf_statfs statfs;</div><div class='del'>-};</div><div class='del'>-typedef struct gfs3_statfs_rsp gfs3_statfs_rsp;</div><div class='del'>-</div><div class='del'>-struct gfs3_lk_req {</div><div class='del'>-	u_quad_t gfs_id;</div><div class='del'>-	u_char gfid[16];</div><div class='del'>-	u_quad_t ino;</div><div class='del'>-	u_quad_t gen;</div><div class='del'>-	quad_t fd;</div><div class='del'>-	u_int cmd;</div><div class='del'>-	u_int type;</div><div class='del'>-	struct gf_flock flock;</div><div class='del'>-};</div><div class='del'>-typedef struct gfs3_lk_req gfs3_lk_req;</div><div class='del'>-</div><div class='del'>-struct gfs3_lk_rsp {</div><div class='del'>-	u_quad_t gfs_id;</div><div class='del'>-	int op_ret;</div><div class='del'>-	int op_errno;</div><div class='del'>-	struct gf_flock flock;</div><div class='del'>-};</div><div class='del'>-typedef struct gfs3_lk_rsp gfs3_lk_rsp;</div><div class='del'>-</div><div class='del'>-struct gfs3_inodelk_req {</div><div class='del'>-	u_quad_t gfs_id;</div><div class='del'>-	u_char gfid[16];</div><div class='del'>-	u_quad_t ino;</div><div class='del'>-	u_quad_t gen;</div><div class='del'>-	u_int cmd;</div><div class='del'>-	u_int type;</div><div class='del'>-	struct gf_flock flock;</div><div class='del'>-	char *path;</div><div class='del'>-	char *volume;</div><div class='del'>-};</div><div class='del'>-typedef struct gfs3_inodelk_req gfs3_inodelk_req;</div><div class='del'>-</div><div class='del'>-struct gfs3_finodelk_req {</div><div class='del'>-	u_quad_t gfs_id;</div><div class='del'>-	u_char gfid[16];</div><div class='del'>-	u_quad_t ino;</div><div class='del'>-	u_quad_t gen;</div><div class='del'>-	quad_t fd;</div><div class='del'>-	u_int cmd;</div><div class='del'>-	u_int type;</div><div class='del'>-	struct gf_flock flock;</div><div class='del'>-	char *volume;</div><div class='del'>-};</div><div class='del'>-typedef struct gfs3_finodelk_req gfs3_finodelk_req;</div><div class='del'>-</div><div class='del'>-struct gfs3_flush_req {</div><div class='del'>-	u_quad_t gfs_id;</div><div class='del'>-	u_char gfid[16];</div><div class='del'>-	u_quad_t ino;</div><div class='del'>-	u_quad_t gen;</div><div class='del'>-	quad_t fd;</div><div class='del'>-};</div><div class='del'>-typedef struct gfs3_flush_req gfs3_flush_req;</div><div class='del'>-</div><div class='del'>-struct gfs3_fsync_req {</div><div class='del'>-	u_quad_t gfs_id;</div><div class='del'>-	u_char gfid[16];</div><div class='del'>-	u_quad_t ino;</div><div class='del'>-	u_quad_t gen;</div><div class='del'>-	quad_t fd;</div><div class='del'>-	u_int data;</div><div class='del'>-};</div><div class='del'>-typedef struct gfs3_fsync_req gfs3_fsync_req;</div><div class='del'>-</div><div class='del'>-struct gfs3_fsync_rsp {</div><div class='del'>-	u_quad_t gfs_id;</div><div class='del'>-	int op_ret;</div><div class='del'>-	int op_errno;</div><div class='del'>-	struct gf_iatt prestat;</div><div class='del'>-	struct gf_iatt poststat;</div><div class='del'>-};</div><div class='del'>-typedef struct gfs3_fsync_rsp gfs3_fsync_rsp;</div><div class='del'>-</div><div class='del'>-struct gfs3_setxattr_req {</div><div class='del'>-	u_quad_t gfs_id;</div><div class='del'>-	u_char gfid[16];</div><div class='del'>-	u_quad_t ino;</div><div class='del'>-	u_quad_t gen;</div><div class='del'>-	u_int flags;</div><div class='del'>-	struct {</div><div class='del'>-		u_int dict_len;</div><div class='del'>-		char *dict_val;</div><div class='del'>-	} dict;</div><div class='del'>-	char *path;</div><div class='del'>-};</div><div class='del'>-typedef struct gfs3_setxattr_req gfs3_setxattr_req;</div><div class='del'>-</div><div class='del'>-struct gfs3_fsetxattr_req {</div><div class='del'>-	u_quad_t gfs_id;</div><div class='del'>-	u_char gfid[16];</div><div class='del'>-	u_quad_t ino;</div><div class='del'>-	u_quad_t gen;</div><div class='del'>-	quad_t fd;</div><div class='del'>-	u_int flags;</div><div class='del'>-	struct {</div><div class='del'>-		u_int dict_len;</div><div class='del'>-		char *dict_val;</div><div class='del'>-	} dict;</div><div class='del'>-};</div><div class='del'>-typedef struct gfs3_fsetxattr_req gfs3_fsetxattr_req;</div><div class='del'>-</div><div class='del'>-struct gfs3_xattrop_req {</div><div class='del'>-	u_quad_t gfs_id;</div><div class='del'>-	u_char gfid[16];</div><div class='del'>-	u_quad_t ino;</div><div class='del'>-	u_quad_t gen;</div><div class='del'>-	u_int flags;</div><div class='del'>-	struct {</div><div class='del'>-		u_int dict_len;</div><div class='del'>-		char *dict_val;</div><div class='del'>-	} dict;</div><div class='del'>-	char *path;</div><div class='del'>-};</div><div class='del'>-typedef struct gfs3_xattrop_req gfs3_xattrop_req;</div><div class='del'>-</div><div class='del'>-struct gfs3_xattrop_rsp {</div><div class='del'>-	u_quad_t gfs_id;</div><div class='del'>-	int op_ret;</div><div class='del'>-	int op_errno;</div><div class='del'>-	struct {</div><div class='del'>-		u_int dict_len;</div><div class='del'>-		char *dict_val;</div><div class='del'>-	} dict;</div><div class='del'>-};</div><div class='del'>-typedef struct gfs3_xattrop_rsp gfs3_xattrop_rsp;</div><div class='del'>-</div><div class='del'>-struct gfs3_fxattrop_req {</div><div class='del'>-	u_quad_t gfs_id;</div><div class='del'>-	u_char gfid[16];</div><div class='del'>-	u_quad_t ino;</div><div class='del'>-	u_quad_t gen;</div><div class='del'>-	quad_t fd;</div><div class='del'>-	u_int flags;</div><div class='del'>-	struct {</div><div class='del'>-		u_int dict_len;</div><div class='del'>-		char *dict_val;</div><div class='del'>-	} dict;</div><div class='del'>-};</div><div class='del'>-typedef struct gfs3_fxattrop_req gfs3_fxattrop_req;</div><div class='del'>-</div><div class='del'>-struct gfs3_fxattrop_rsp {</div><div class='del'>-	u_quad_t gfs_id;</div><div class='del'>-	int op_ret;</div><div class='del'>-	int op_errno;</div><div class='del'>-	struct {</div><div class='del'>-		u_int dict_len;</div><div class='del'>-		char *dict_val;</div><div class='del'>-	} dict;</div><div class='del'>-};</div><div class='del'>-typedef struct gfs3_fxattrop_rsp gfs3_fxattrop_rsp;</div><div class='del'>-</div><div class='del'>-struct gfs3_getxattr_req {</div><div class='del'>-	u_quad_t gfs_id;</div><div class='del'>-	u_char gfid[16];</div><div class='del'>-	u_quad_t ino;</div><div class='del'>-	u_quad_t gen;</div><div class='del'>-	u_int namelen;</div><div class='del'>-	char *path;</div><div class='del'>-	char *name;</div><div class='del'>-};</div><div class='del'>-typedef struct gfs3_getxattr_req gfs3_getxattr_req;</div><div class='del'>-</div><div class='del'>-struct gfs3_getxattr_rsp {</div><div class='del'>-	u_quad_t gfs_id;</div><div class='del'>-	int op_ret;</div><div class='del'>-	int op_errno;</div><div class='del'>-	struct {</div><div class='del'>-		u_int dict_len;</div><div class='del'>-		char *dict_val;</div><div class='del'>-	} dict;</div><div class='del'>-};</div><div class='del'>-typedef struct gfs3_getxattr_rsp gfs3_getxattr_rsp;</div><div class='del'>-</div><div class='del'>-struct gfs3_fgetxattr_req {</div><div class='del'>-	u_quad_t gfs_id;</div><div class='del'>-	u_char gfid[16];</div><div class='del'>-	u_quad_t ino;</div><div class='del'>-	u_quad_t gen;</div><div class='del'>-	quad_t fd;</div><div class='del'>-	u_int namelen;</div><div class='del'>-	char *name;</div><div class='del'>-};</div><div class='del'>-typedef struct gfs3_fgetxattr_req gfs3_fgetxattr_req;</div><div class='del'>-</div><div class='del'>-struct gfs3_fgetxattr_rsp {</div><div class='del'>-	u_quad_t gfs_id;</div><div class='del'>-	int op_ret;</div><div class='del'>-	int op_errno;</div><div class='del'>-	struct {</div><div class='del'>-		u_int dict_len;</div><div class='del'>-		char *dict_val;</div><div class='del'>-	} dict;</div><div class='del'>-};</div><div class='del'>-typedef struct gfs3_fgetxattr_rsp gfs3_fgetxattr_rsp;</div><div class='del'>-</div><div class='del'>-struct gfs3_removexattr_req {</div><div class='del'>-	u_quad_t gfs_id;</div><div class='del'>-	u_char gfid[16];</div><div class='del'>-	u_quad_t ino;</div><div class='del'>-	u_quad_t gen;</div><div class='del'>-	char *path;</div><div class='del'>-	char *name;</div><div class='del'>-};</div><div class='del'>-typedef struct gfs3_removexattr_req gfs3_removexattr_req;</div><div class='del'>-</div><div class='del'>-struct gfs3_opendir_req {</div><div class='del'>-	u_quad_t gfs_id;</div><div class='del'>-	u_char gfid[16];</div><div class='del'>-	u_quad_t ino;</div><div class='del'>-	u_quad_t gen;</div><div class='del'>-	char *path;</div><div class='del'>-};</div><div class='del'>-typedef struct gfs3_opendir_req gfs3_opendir_req;</div><div class='del'>-</div><div class='del'>-struct gfs3_opendir_rsp {</div><div class='del'>-	u_quad_t gfs_id;</div><div class='del'>-	int op_ret;</div><div class='del'>-	int op_errno;</div><div class='del'>-	quad_t fd;</div><div class='del'>-};</div><div class='del'>-typedef struct gfs3_opendir_rsp gfs3_opendir_rsp;</div><div class='del'>-</div><div class='del'>-struct gfs3_fsyncdir_req {</div><div class='del'>-	u_quad_t gfs_id;</div><div class='del'>-	u_char gfid[16];</div><div class='del'>-	u_quad_t ino;</div><div class='del'>-	u_quad_t gen;</div><div class='del'>-	quad_t fd;</div><div class='del'>-	int data;</div><div class='del'>-};</div><div class='del'>-typedef struct gfs3_fsyncdir_req gfs3_fsyncdir_req;</div><div class='del'>-</div><div class='del'>-struct gfs3_readdir_req {</div><div class='del'>-	u_quad_t gfs_id;</div><div class='del'>-	u_char gfid[16];</div><div class='del'>-	u_quad_t ino;</div><div class='del'>-	u_quad_t gen;</div><div class='del'>-	quad_t fd;</div><div class='del'>-	u_quad_t offset;</div><div class='del'>-	u_int size;</div><div class='del'>-};</div><div class='del'>-typedef struct gfs3_readdir_req gfs3_readdir_req;</div><div class='del'>-</div><div class='del'>-struct gfs3_readdirp_req {</div><div class='del'>-	u_quad_t gfs_id;</div><div class='del'>-	u_char gfid[16];</div><div class='del'>-	u_quad_t ino;</div><div class='del'>-	u_quad_t gen;</div><div class='del'>-	quad_t fd;</div><div class='del'>-	u_quad_t offset;</div><div class='del'>-	u_int size;</div><div class='del'>-};</div><div class='del'>-typedef struct gfs3_readdirp_req gfs3_readdirp_req;</div><div class='del'>-</div><div class='del'>-struct gf_setvolume_req {</div><div class='del'>-	u_quad_t gfs_id;</div><div class='del'>-	struct {</div><div class='del'>-		u_int dict_len;</div><div class='del'>-		char *dict_val;</div><div class='del'>-	} dict;</div><div class='del'>-};</div><div class='del'>-typedef struct gf_setvolume_req gf_setvolume_req;</div><div class='del'>-</div><div class='del'>-struct gf_setvolume_rsp {</div><div class='del'>-	u_quad_t gfs_id;</div><div class='del'>-	int op_ret;</div><div class='del'>-	int op_errno;</div><div class='del'>-	struct {</div><div class='del'>-		u_int dict_len;</div><div class='del'>-		char *dict_val;</div><div class='del'>-	} dict;</div><div class='del'>-};</div><div class='del'>-typedef struct gf_setvolume_rsp gf_setvolume_rsp;</div><div class='del'>-</div><div class='del'>-struct gfs3_access_req {</div><div class='del'>-	u_quad_t gfs_id;</div><div class='del'>-	u_char gfid[16];</div><div class='del'>-	u_quad_t ino;</div><div class='del'>-	u_quad_t gen;</div><div class='del'>-	u_int mask;</div><div class='del'>-	char *path;</div><div class='del'>-};</div><div class='del'>-typedef struct gfs3_access_req gfs3_access_req;</div><div class='del'>-</div><div class='del'>-struct gfs3_create_req {</div><div class='del'>-	u_quad_t gfs_id;</div><div class='del'>-	u_char pargfid[16];</div><div class='del'>-	u_quad_t par;</div><div class='del'>-	u_quad_t gen;</div><div class='del'>-	u_int flags;</div><div class='del'>-	u_int mode;</div><div class='del'>-	char *path;</div><div class='del'>-	char *bname;</div><div class='del'>-	struct {</div><div class='del'>-		u_int dict_len;</div><div class='del'>-		char *dict_val;</div><div class='del'>-	} dict;</div><div class='del'>-};</div><div class='del'>-typedef struct gfs3_create_req gfs3_create_req;</div><div class='del'>-</div><div class='del'>-struct gfs3_create_rsp {</div><div class='del'>-	u_quad_t gfs_id;</div><div class='del'>-	int op_ret;</div><div class='del'>-	int op_errno;</div><div class='del'>-	struct gf_iatt stat;</div><div class='del'>-	u_quad_t fd;</div><div class='del'>-	struct gf_iatt preparent;</div><div class='del'>-	struct gf_iatt postparent;</div><div class='del'>-};</div><div class='del'>-typedef struct gfs3_create_rsp gfs3_create_rsp;</div><div class='del'>-</div><div class='del'>-struct gfs3_ftruncate_req {</div><div class='del'>-	u_quad_t gfs_id;</div><div class='del'>-	u_char gfid[16];</div><div class='del'>-	u_quad_t ino;</div><div class='del'>-	u_quad_t gen;</div><div class='del'>-	quad_t fd;</div><div class='del'>-	u_quad_t offset;</div><div class='del'>-};</div><div class='del'>-typedef struct gfs3_ftruncate_req gfs3_ftruncate_req;</div><div class='del'>-</div><div class='del'>-struct gfs3_ftruncate_rsp {</div><div class='del'>-	u_quad_t gfs_id;</div><div class='del'>-	int op_ret;</div><div class='del'>-	int op_errno;</div><div class='del'>-	struct gf_iatt prestat;</div><div class='del'>-	struct gf_iatt poststat;</div><div class='del'>-};</div><div class='del'>-typedef struct gfs3_ftruncate_rsp gfs3_ftruncate_rsp;</div><div class='del'>-</div><div class='del'>-struct gfs3_fstat_req {</div><div class='del'>-	u_quad_t gfs_id;</div><div class='del'>-	u_char gfid[16];</div><div class='del'>-	u_quad_t ino;</div><div class='del'>-	u_quad_t gen;</div><div class='del'>-	quad_t fd;</div><div class='del'>-};</div><div class='del'>-typedef struct gfs3_fstat_req gfs3_fstat_req;</div><div class='del'>-</div><div class='del'>-struct gfs3_fstat_rsp {</div><div class='del'>-	u_quad_t gfs_id;</div><div class='del'>-	int op_ret;</div><div class='del'>-	int op_errno;</div><div class='del'>-	struct gf_iatt stat;</div><div class='del'>-};</div><div class='del'>-typedef struct gfs3_fstat_rsp gfs3_fstat_rsp;</div><div class='del'>-</div><div class='del'>-struct gfs3_entrylk_req {</div><div class='del'>-	u_quad_t gfs_id;</div><div class='del'>-	u_char gfid[16];</div><div class='del'>-	u_quad_t ino;</div><div class='del'>-	u_quad_t gen;</div><div class='del'>-	u_int cmd;</div><div class='del'>-	u_int type;</div><div class='del'>-	u_quad_t namelen;</div><div class='del'>-	char *path;</div><div class='del'>-	char *name;</div><div class='del'>-	char *volume;</div><div class='del'>-};</div><div class='del'>-typedef struct gfs3_entrylk_req gfs3_entrylk_req;</div><div class='del'>-</div><div class='del'>-struct gfs3_fentrylk_req {</div><div class='del'>-	u_quad_t gfs_id;</div><div class='del'>-	u_char gfid[16];</div><div class='del'>-	u_quad_t ino;</div><div class='del'>-	u_quad_t gen;</div><div class='del'>-	quad_t fd;</div><div class='del'>-	u_int cmd;</div><div class='del'>-	u_int type;</div><div class='del'>-	u_quad_t namelen;</div><div class='del'>-	char *name;</div><div class='del'>-	char *volume;</div><div class='del'>-};</div><div class='del'>-typedef struct gfs3_fentrylk_req gfs3_fentrylk_req;</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-struct gfs3_setattr_req {</div><div class='del'>-	u_quad_t gfs_id;</div><div class='del'>-	u_char gfid[16];</div><div class='del'>-	u_quad_t ino;</div><div class='del'>-	u_quad_t gen;</div><div class='del'>-	struct gf_iatt stbuf;</div><div class='del'>-	int valid;</div><div class='del'>-	char *path;</div><div class='del'>-};</div><div class='del'>-typedef struct gfs3_setattr_req gfs3_setattr_req;</div><div class='del'>-</div><div class='del'>-struct gfs3_setattr_rsp {</div><div class='del'>-	u_quad_t gfs_id;</div><div class='del'>-	int op_ret;</div><div class='del'>-	int op_errno;</div><div class='del'>-	struct gf_iatt statpre;</div><div class='del'>-	struct gf_iatt statpost;</div><div class='del'>-};</div><div class='del'>-typedef struct gfs3_setattr_rsp gfs3_setattr_rsp;</div><div class='del'>-</div><div class='del'>-struct gfs3_fsetattr_req {</div><div class='del'>-	u_quad_t gfs_id;</div><div class='del'>-	quad_t fd;</div><div class='del'>-	struct gf_iatt stbuf;</div><div class='del'>-	int valid;</div><div class='del'>-};</div><div class='del'>-typedef struct gfs3_fsetattr_req gfs3_fsetattr_req;</div><div class='del'>-</div><div class='del'>-struct gfs3_fsetattr_rsp {</div><div class='del'>-	u_quad_t gfs_id;</div><div class='del'>-	int op_ret;</div><div class='del'>-	int op_errno;</div><div class='del'>-	struct gf_iatt statpre;</div><div class='del'>-	struct gf_iatt statpost;</div><div class='del'>-};</div><div class='del'>-typedef struct gfs3_fsetattr_rsp gfs3_fsetattr_rsp;</div><div class='del'>-</div><div class='del'>-struct gfs3_rchecksum_req {</div><div class='del'>-	u_quad_t gfs_id;</div><div class='del'>-	quad_t fd;</div><div class='del'>-	u_quad_t offset;</div><div class='del'>-	u_int len;</div><div class='del'>-};</div><div class='del'>-typedef struct gfs3_rchecksum_req gfs3_rchecksum_req;</div><div class='del'>-</div><div class='del'>-struct gfs3_rchecksum_rsp {</div><div class='del'>-	u_quad_t gfs_id;</div><div class='del'>-	int op_ret;</div><div class='del'>-	int op_errno;</div><div class='del'>-	u_int weak_checksum;</div><div class='del'>-	struct {</div><div class='del'>-		u_int strong_checksum_len;</div><div class='del'>-		char *strong_checksum_val;</div><div class='del'>-	} strong_checksum;</div><div class='del'>-};</div><div class='del'>-typedef struct gfs3_rchecksum_rsp gfs3_rchecksum_rsp;</div><div class='del'>-</div><div class='del'>-struct gf_getspec_req {</div><div class='del'>-	u_quad_t gfs_id;</div><div class='del'>-	u_int flags;</div><div class='del'>-	char *key;</div><div class='del'>-};</div><div class='del'>-typedef struct gf_getspec_req gf_getspec_req;</div><div class='del'>-</div><div class='del'>-struct gf_getspec_rsp {</div><div class='del'>-	u_quad_t gfs_id;</div><div class='del'>-	int op_ret;</div><div class='del'>-	int op_errno;</div><div class='del'>-	char *spec;</div><div class='del'>-};</div><div class='del'>-typedef struct gf_getspec_rsp gf_getspec_rsp;</div><div class='del'>-</div><div class='del'>-struct gf_log_req {</div><div class='del'>-	u_quad_t gfs_id;</div><div class='del'>-	struct {</div><div class='del'>-		u_int msg_len;</div><div class='del'>-		char *msg_val;</div><div class='del'>-	} msg;</div><div class='del'>-};</div><div class='del'>-typedef struct gf_log_req gf_log_req;</div><div class='del'>-</div><div class='del'>-struct gf_notify_req {</div><div class='del'>-	u_quad_t gfs_id;</div><div class='del'>-	u_int flags;</div><div class='del'>-	char *buf;</div><div class='del'>-};</div><div class='del'>-typedef struct gf_notify_req gf_notify_req;</div><div class='del'>-</div><div class='del'>-struct gf_notify_rsp {</div><div class='del'>-	u_quad_t gfs_id;</div><div class='del'>-	int op_ret;</div><div class='del'>-	int op_errno;</div><div class='del'>-	u_int flags;</div><div class='del'>-	char *buf;</div><div class='del'>-};</div><div class='del'>-typedef struct gf_notify_rsp gf_notify_rsp;</div><div class='del'>-</div><div class='del'>-struct gfs3_releasedir_req {</div><div class='del'>-	u_quad_t gfs_id;</div><div class='del'>-	u_char gfid[16];</div><div class='del'>-	u_quad_t ino;</div><div class='del'>-	u_quad_t gen;</div><div class='del'>-	quad_t fd;</div><div class='del'>-};</div><div class='del'>-typedef struct gfs3_releasedir_req gfs3_releasedir_req;</div><div class='del'>-</div><div class='del'>-struct gfs3_release_req {</div><div class='del'>-	u_quad_t gfs_id;</div><div class='del'>-	u_char gfid[16];</div><div class='del'>-	u_quad_t ino;</div><div class='del'>-	u_quad_t gen;</div><div class='del'>-	quad_t fd;</div><div class='del'>-};</div><div class='del'>-typedef struct gfs3_release_req gfs3_release_req;</div><div class='del'>-</div><div class='del'>-struct gf_common_rsp {</div><div class='del'>-	u_quad_t gfs_id;</div><div class='del'>-	int op_ret;</div><div class='del'>-	int op_errno;</div><div class='del'>-};</div><div class='del'>-typedef struct gf_common_rsp gf_common_rsp;</div><div class='del'>-</div><div class='del'>-struct gfs3_dirlist {</div><div class='del'>-	u_quad_t d_ino;</div><div class='del'>-	u_quad_t d_off;</div><div class='del'>-	u_int d_len;</div><div class='del'>-	u_int d_type;</div><div class='del'>-	char *name;</div><div class='del'>-	struct gfs3_dirlist *nextentry;</div><div class='del'>-};</div><div class='del'>-typedef struct gfs3_dirlist gfs3_dirlist;</div><div class='del'>-</div><div class='del'>-struct gfs3_readdir_rsp {</div><div class='del'>-	u_quad_t gfs_id;</div><div class='del'>-	int op_ret;</div><div class='del'>-	int op_errno;</div><div class='del'>-	struct gfs3_dirlist *reply;</div><div class='del'>-};</div><div class='del'>-typedef struct gfs3_readdir_rsp gfs3_readdir_rsp;</div><div class='del'>-</div><div class='del'>-struct gfs3_dirplist {</div><div class='del'>-	u_quad_t d_ino;</div><div class='del'>-	u_quad_t d_off;</div><div class='del'>-	u_int d_len;</div><div class='del'>-	u_int d_type;</div><div class='del'>-	char *name;</div><div class='del'>-	struct gf_iatt stat;</div><div class='del'>-	struct gfs3_dirplist *nextentry;</div><div class='del'>-};</div><div class='del'>-typedef struct gfs3_dirplist gfs3_dirplist;</div><div class='del'>-</div><div class='del'>-struct gfs3_readdirp_rsp {</div><div class='del'>-	u_quad_t gfs_id;</div><div class='del'>-	int op_ret;</div><div class='del'>-	int op_errno;</div><div class='del'>-	struct gfs3_dirplist *reply;</div><div class='del'>-};</div><div class='del'>-typedef struct gfs3_readdirp_rsp gfs3_readdirp_rsp;</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-/* the xdr functions */</div><div class='del'>-</div><div class='del'>-#if defined(__STDC__) || defined(__cplusplus)</div><div class='del'>-extern  bool_t xdr_gf_statfs (XDR *, gf_statfs*);</div><div class='del'>-extern  bool_t xdr_gf_flock (XDR *, gf_flock*);</div><div class='del'>-extern  bool_t xdr_gf_iatt (XDR *, gf_iatt*);</div><div class='del'>-extern  bool_t xdr_gfs3_stat_req (XDR *, gfs3_stat_req*);</div><div class='del'>-extern  bool_t xdr_gfs3_stat_rsp (XDR *, gfs3_stat_rsp*);</div><div class='del'>-extern  bool_t xdr_gfs3_readlink_req (XDR *, gfs3_readlink_req*);</div><div class='del'>-extern  bool_t xdr_gfs3_readlink_rsp (XDR *, gfs3_readlink_rsp*);</div><div class='del'>-extern  bool_t xdr_gfs3_mknod_req (XDR *, gfs3_mknod_req*);</div><div class='del'>-extern  bool_t xdr_gfs3_mknod_rsp (XDR *, gfs3_mknod_rsp*);</div><div class='del'>-extern  bool_t xdr_gfs3_mkdir_req (XDR *, gfs3_mkdir_req*);</div><div class='del'>-extern  bool_t xdr_gfs3_mkdir_rsp (XDR *, gfs3_mkdir_rsp*);</div><div class='del'>-extern  bool_t xdr_gfs3_unlink_req (XDR *, gfs3_unlink_req*);</div><div class='del'>-extern  bool_t xdr_gfs3_unlink_rsp (XDR *, gfs3_unlink_rsp*);</div><div class='del'>-extern  bool_t xdr_gfs3_rmdir_req (XDR *, gfs3_rmdir_req*);</div><div class='del'>-extern  bool_t xdr_gfs3_rmdir_rsp (XDR *, gfs3_rmdir_rsp*);</div><div class='del'>-extern  bool_t xdr_gfs3_symlink_req (XDR *, gfs3_symlink_req*);</div><div class='del'>-extern  bool_t xdr_gfs3_symlink_rsp (XDR *, gfs3_symlink_rsp*);</div><div class='del'>-extern  bool_t xdr_gfs3_rename_req (XDR *, gfs3_rename_req*);</div><div class='del'>-extern  bool_t xdr_gfs3_rename_rsp (XDR *, gfs3_rename_rsp*);</div><div class='del'>-extern  bool_t xdr_gfs3_link_req (XDR *, gfs3_link_req*);</div><div class='del'>-extern  bool_t xdr_gfs3_link_rsp (XDR *, gfs3_link_rsp*);</div><div class='del'>-extern  bool_t xdr_gfs3_truncate_req (XDR *, gfs3_truncate_req*);</div><div class='del'>-extern  bool_t xdr_gfs3_truncate_rsp (XDR *, gfs3_truncate_rsp*);</div><div class='del'>-extern  bool_t xdr_gfs3_open_req (XDR *, gfs3_open_req*);</div><div class='del'>-extern  bool_t xdr_gfs3_open_rsp (XDR *, gfs3_open_rsp*);</div><div class='del'>-extern  bool_t xdr_gfs3_read_req (XDR *, gfs3_read_req*);</div><div class='del'>-extern  bool_t xdr_gfs3_read_rsp (XDR *, gfs3_read_rsp*);</div><div class='del'>-extern  bool_t xdr_gfs3_lookup_req (XDR *, gfs3_lookup_req*);</div><div class='del'>-extern  bool_t xdr_gfs3_lookup_rsp (XDR *, gfs3_lookup_rsp*);</div><div class='del'>-extern  bool_t xdr_gfs3_write_req (XDR *, gfs3_write_req*);</div><div class='del'>-extern  bool_t xdr_gfs3_write_rsp (XDR *, gfs3_write_rsp*);</div><div class='del'>-extern  bool_t xdr_gfs3_statfs_req (XDR *, gfs3_statfs_req*);</div><div class='del'>-extern  bool_t xdr_gfs3_statfs_rsp (XDR *, gfs3_statfs_rsp*);</div><div class='del'>-extern  bool_t xdr_gfs3_lk_req (XDR *, gfs3_lk_req*);</div><div class='del'>-extern  bool_t xdr_gfs3_lk_rsp (XDR *, gfs3_lk_rsp*);</div><div class='del'>-extern  bool_t xdr_gfs3_inodelk_req (XDR *, gfs3_inodelk_req*);</div><div class='del'>-extern  bool_t xdr_gfs3_finodelk_req (XDR *, gfs3_finodelk_req*);</div><div class='del'>-extern  bool_t xdr_gfs3_flush_req (XDR *, gfs3_flush_req*);</div><div class='del'>-extern  bool_t xdr_gfs3_fsync_req (XDR *, gfs3_fsync_req*);</div><div class='del'>-extern  bool_t xdr_gfs3_fsync_rsp (XDR *, gfs3_fsync_rsp*);</div><div class='del'>-extern  bool_t xdr_gfs3_setxattr_req (XDR *, gfs3_setxattr_req*);</div><div class='del'>-extern  bool_t xdr_gfs3_fsetxattr_req (XDR *, gfs3_fsetxattr_req*);</div><div class='del'>-extern  bool_t xdr_gfs3_xattrop_req (XDR *, gfs3_xattrop_req*);</div><div class='del'>-extern  bool_t xdr_gfs3_xattrop_rsp (XDR *, gfs3_xattrop_rsp*);</div><div class='del'>-extern  bool_t xdr_gfs3_fxattrop_req (XDR *, gfs3_fxattrop_req*);</div><div class='del'>-extern  bool_t xdr_gfs3_fxattrop_rsp (XDR *, gfs3_fxattrop_rsp*);</div><div class='del'>-extern  bool_t xdr_gfs3_getxattr_req (XDR *, gfs3_getxattr_req*);</div><div class='del'>-extern  bool_t xdr_gfs3_getxattr_rsp (XDR *, gfs3_getxattr_rsp*);</div><div class='del'>-extern  bool_t xdr_gfs3_fgetxattr_req (XDR *, gfs3_fgetxattr_req*);</div><div class='del'>-extern  bool_t xdr_gfs3_fgetxattr_rsp (XDR *, gfs3_fgetxattr_rsp*);</div><div class='del'>-extern  bool_t xdr_gfs3_removexattr_req (XDR *, gfs3_removexattr_req*);</div><div class='del'>-extern  bool_t xdr_gfs3_opendir_req (XDR *, gfs3_opendir_req*);</div><div class='del'>-extern  bool_t xdr_gfs3_opendir_rsp (XDR *, gfs3_opendir_rsp*);</div><div class='del'>-extern  bool_t xdr_gfs3_fsyncdir_req (XDR *, gfs3_fsyncdir_req*);</div><div class='del'>-extern  bool_t xdr_gfs3_readdir_req (XDR *, gfs3_readdir_req*);</div><div class='del'>-extern  bool_t xdr_gfs3_dirlist (XDR *, gfs3_dirlist*);</div><div class='del'>-extern  bool_t xdr_gfs3_readdir_rsp (XDR *, gfs3_readdir_rsp*);</div><div class='del'>-extern  bool_t xdr_gfs3_dirplist (XDR *, gfs3_dirplist*);</div><div class='del'>-extern  bool_t xdr_gfs3_readdirp_rsp (XDR *, gfs3_readdirp_rsp*);</div><div class='del'>-extern  bool_t xdr_gfs3_readdirp_req (XDR *, gfs3_readdirp_req*);</div><div class='del'>-extern  bool_t xdr_gf_setvolume_req (XDR *, gf_setvolume_req*);</div><div class='del'>-extern  bool_t xdr_gf_setvolume_rsp (XDR *, gf_setvolume_rsp*);</div><div class='del'>-extern  bool_t xdr_gfs3_access_req (XDR *, gfs3_access_req*);</div><div class='del'>-extern  bool_t xdr_gfs3_create_req (XDR *, gfs3_create_req*);</div><div class='del'>-extern  bool_t xdr_gfs3_create_rsp (XDR *, gfs3_create_rsp*);</div><div class='del'>-extern  bool_t xdr_gfs3_ftruncate_req (XDR *, gfs3_ftruncate_req*);</div><div class='del'>-extern  bool_t xdr_gfs3_ftruncate_rsp (XDR *, gfs3_ftruncate_rsp*);</div><div class='del'>-extern  bool_t xdr_gfs3_fstat_req (XDR *, gfs3_fstat_req*);</div><div class='del'>-extern  bool_t xdr_gfs3_fstat_rsp (XDR *, gfs3_fstat_rsp*);</div><div class='del'>-extern  bool_t xdr_gfs3_entrylk_req (XDR *, gfs3_entrylk_req*);</div><div class='del'>-extern  bool_t xdr_gfs3_fentrylk_req (XDR *, gfs3_fentrylk_req*);</div><div class='del'>-extern  bool_t xdr_gfs3_setattr_req (XDR *, gfs3_setattr_req*);</div><div class='del'>-extern  bool_t xdr_gfs3_setattr_rsp (XDR *, gfs3_setattr_rsp*);</div><div class='del'>-extern  bool_t xdr_gfs3_fsetattr_req (XDR *, gfs3_fsetattr_req*);</div><div class='del'>-extern  bool_t xdr_gfs3_fsetattr_rsp (XDR *, gfs3_fsetattr_rsp*);</div><div class='del'>-extern  bool_t xdr_gfs3_rchecksum_req (XDR *, gfs3_rchecksum_req*);</div><div class='del'>-extern  bool_t xdr_gfs3_rchecksum_rsp (XDR *, gfs3_rchecksum_rsp*);</div><div class='del'>-extern  bool_t xdr_gf_getspec_req (XDR *, gf_getspec_req*);</div><div class='del'>-extern  bool_t xdr_gf_getspec_rsp (XDR *, gf_getspec_rsp*);</div><div class='del'>-extern  bool_t xdr_gf_log_req (XDR *, gf_log_req*);</div><div class='del'>-extern  bool_t xdr_gf_notify_req (XDR *, gf_notify_req*);</div><div class='del'>-extern  bool_t xdr_gf_notify_rsp (XDR *, gf_notify_rsp*);</div><div class='del'>-extern  bool_t xdr_gfs3_releasedir_req (XDR *, gfs3_releasedir_req*);</div><div class='del'>-extern  bool_t xdr_gfs3_release_req (XDR *, gfs3_release_req*);</div><div class='del'>-extern  bool_t xdr_gf_common_rsp (XDR *, gf_common_rsp*);</div><div class='del'>-</div><div class='del'>-#else /* K&amp;R C */</div><div class='del'>-extern bool_t xdr_gf_statfs ();</div><div class='del'>-extern bool_t xdr_gf_flock ();</div><div class='del'>-extern bool_t xdr_gf_iatt ();</div><div class='del'>-extern bool_t xdr_gfs3_stat_req ();</div><div class='del'>-extern bool_t xdr_gfs3_stat_rsp ();</div><div class='del'>-extern bool_t xdr_gfs3_readlink_req ();</div><div class='del'>-extern bool_t xdr_gfs3_readlink_rsp ();</div><div class='del'>-extern bool_t xdr_gfs3_mknod_req ();</div><div class='del'>-extern bool_t xdr_gfs3_mknod_rsp ();</div><div class='del'>-extern bool_t xdr_gfs3_mkdir_req ();</div><div class='del'>-extern bool_t xdr_gfs3_mkdir_rsp ();</div><div class='del'>-extern bool_t xdr_gfs3_unlink_req ();</div><div class='del'>-extern bool_t xdr_gfs3_unlink_rsp ();</div><div class='del'>-extern bool_t xdr_gfs3_rmdir_req ();</div><div class='del'>-extern bool_t xdr_gfs3_rmdir_rsp ();</div><div class='del'>-extern bool_t xdr_gfs3_symlink_req ();</div><div class='del'>-extern bool_t xdr_gfs3_symlink_rsp ();</div><div class='del'>-extern bool_t xdr_gfs3_rename_req ();</div><div class='del'>-extern bool_t xdr_gfs3_rename_rsp ();</div><div class='del'>-extern bool_t xdr_gfs3_link_req ();</div><div class='del'>-extern bool_t xdr_gfs3_link_rsp ();</div><div class='del'>-extern bool_t xdr_gfs3_truncate_req ();</div><div class='del'>-extern bool_t xdr_gfs3_truncate_rsp ();</div><div class='del'>-extern bool_t xdr_gfs3_open_req ();</div><div class='del'>-extern bool_t xdr_gfs3_open_rsp ();</div><div class='del'>-extern bool_t xdr_gfs3_read_req ();</div><div class='del'>-extern bool_t xdr_gfs3_read_rsp ();</div><div class='del'>-extern bool_t xdr_gfs3_lookup_req ();</div><div class='del'>-extern bool_t xdr_gfs3_lookup_rsp ();</div><div class='del'>-extern bool_t xdr_gfs3_write_req ();</div><div class='del'>-extern bool_t xdr_gfs3_write_rsp ();</div><div class='del'>-extern bool_t xdr_gfs3_statfs_req ();</div><div class='del'>-extern bool_t xdr_gfs3_statfs_rsp ();</div><div class='del'>-extern bool_t xdr_gfs3_lk_req ();</div><div class='del'>-extern bool_t xdr_gfs3_lk_rsp ();</div><div class='del'>-extern bool_t xdr_gfs3_inodelk_req ();</div><div class='del'>-extern bool_t xdr_gfs3_finodelk_req ();</div><div class='del'>-extern bool_t xdr_gfs3_flush_req ();</div><div class='del'>-extern bool_t xdr_gfs3_fsync_req ();</div><div class='del'>-extern bool_t xdr_gfs3_fsync_rsp ();</div><div class='del'>-extern bool_t xdr_gfs3_setxattr_req ();</div><div class='del'>-extern bool_t xdr_gfs3_fsetxattr_req ();</div><div class='del'>-extern bool_t xdr_gfs3_xattrop_req ();</div><div class='del'>-extern bool_t xdr_gfs3_xattrop_rsp ();</div><div class='del'>-extern bool_t xdr_gfs3_fxattrop_req ();</div><div class='del'>-extern bool_t xdr_gfs3_fxattrop_rsp ();</div><div class='del'>-extern bool_t xdr_gfs3_getxattr_req ();</div><div class='del'>-extern bool_t xdr_gfs3_getxattr_rsp ();</div><div class='del'>-extern bool_t xdr_gfs3_fgetxattr_req ();</div><div class='del'>-extern bool_t xdr_gfs3_fgetxattr_rsp ();</div><div class='del'>-extern bool_t xdr_gfs3_removexattr_req ();</div><div class='del'>-extern bool_t xdr_gfs3_opendir_req ();</div><div class='del'>-extern bool_t xdr_gfs3_opendir_rsp ();</div><div class='del'>-extern bool_t xdr_gfs3_fsyncdir_req ();</div><div class='del'>-extern bool_t xdr_gfs3_readdir_req ();</div><div class='del'>-extern bool_t xdr_gfs3_dirlist ();</div><div class='del'>-extern bool_t xdr_gfs3_readdir_rsp ();</div><div class='del'>-extern bool_t xdr_gfs3_dirplist ();</div><div class='del'>-extern bool_t xdr_gfs3_readdirp_rsp ();</div><div class='del'>-extern bool_t xdr_gfs3_readdirp_req ();</div><div class='del'>-extern bool_t xdr_gf_setvolume_req ();</div><div class='del'>-extern bool_t xdr_gf_setvolume_rsp ();</div><div class='del'>-extern bool_t xdr_gfs3_access_req ();</div><div class='del'>-extern bool_t xdr_gfs3_create_req ();</div><div class='del'>-extern bool_t xdr_gfs3_create_rsp ();</div><div class='del'>-extern bool_t xdr_gfs3_ftruncate_req ();</div><div class='del'>-extern bool_t xdr_gfs3_ftruncate_rsp ();</div><div class='del'>-extern bool_t xdr_gfs3_fstat_req ();</div><div class='del'>-extern bool_t xdr_gfs3_fstat_rsp ();</div><div class='del'>-extern bool_t xdr_gfs3_entrylk_req ();</div><div class='del'>-extern bool_t xdr_gfs3_fentrylk_req ();</div><div class='del'>-extern bool_t xdr_gfs3_setattr_req ();</div><div class='del'>-extern bool_t xdr_gfs3_setattr_rsp ();</div><div class='del'>-extern bool_t xdr_gfs3_fsetattr_req ();</div><div class='del'>-extern bool_t xdr_gfs3_fsetattr_rsp ();</div><div class='del'>-extern bool_t xdr_gfs3_rchecksum_req ();</div><div class='del'>-extern bool_t xdr_gfs3_rchecksum_rsp ();</div><div class='del'>-extern bool_t xdr_gfs3_releasedir_req ();</div><div class='del'>-extern bool_t xdr_gfs3_release_req ();</div><div class='del'>-extern bool_t xdr_gf_getspec_req ();</div><div class='del'>-extern bool_t xdr_gf_getspec_rsp ();</div><div class='del'>-extern bool_t xdr_gf_log_req ();</div><div class='del'>-extern bool_t xdr_gf_notify_req ();</div><div class='del'>-extern bool_t xdr_gf_notify_rsp ();</div><div class='del'>-extern bool_t xdr_gf_common_rsp ();</div><div class='del'>-</div><div class='del'>-#endif /* K&amp;R C */</div><div class='del'>-</div><div class='del'>-#ifdef __cplusplus</div><div class='del'>-}</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-#endif /* !_GLUSTERFS3_H_RPCGEN */</div><div class='head'>diff --git a/rpc/xdr/src/glusterfs3-xdr.x b/rpc/xdr/src/glusterfs3-xdr.x<br/>new file mode 100644<br/>index 00000000000..1c99099a721<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/rpc/xdr/src/glusterfs3-xdr.x?id=d1d7a6f35c816822fab51c820e25023863c239c1'>rpc/xdr/src/glusterfs3-xdr.x</a></div><div class='hunk'>@@ -0,0 +1,890 @@</div><div class='add'>+/*</div><div class='add'>+ * Copyright (c) 2012 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+ * This file is part of GlusterFS.</div><div class='add'>+ *</div><div class='add'>+ * This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+ * General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+ * later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+ * cases as published by the Free Software Foundation.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+#ifdef RPC_XDR</div><div class='add'>+%#include "rpc-pragmas.h"</div><div class='add'>+#endif</div><div class='add'>+%#include &lt;glusterfs/glusterfs-fops.h&gt;</div><div class='add'>+%#include "rpc-common-xdr.h"</div><div class='add'>+</div><div class='add'>+#define GF_REQUEST_MAXGROUPS    16</div><div class='add'>+struct gf_statfs {</div><div class='add'>+	u_quad_t bsize;</div><div class='add'>+	u_quad_t frsize;</div><div class='add'>+	u_quad_t blocks;</div><div class='add'>+	u_quad_t bfree;</div><div class='add'>+	u_quad_t bavail;</div><div class='add'>+	u_quad_t files;</div><div class='add'>+	u_quad_t ffree;</div><div class='add'>+	u_quad_t favail;</div><div class='add'>+	u_quad_t fsid;</div><div class='add'>+	u_quad_t flag;</div><div class='add'>+	u_quad_t namemax;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+struct gf_proto_flock {</div><div class='add'>+	unsigned int   type;</div><div class='add'>+	unsigned int   whence;</div><div class='add'>+	u_quad_t start;</div><div class='add'>+	u_quad_t len;</div><div class='add'>+        unsigned int   pid;</div><div class='add'>+        opaque         lk_owner&lt;&gt;;</div><div class='add'>+} ;</div><div class='add'>+</div><div class='add'>+struct gf_proto_lease {</div><div class='add'>+        unsigned int   cmd;</div><div class='add'>+        unsigned int   lease_type;</div><div class='add'>+        opaque         lease_id[16];</div><div class='add'>+        unsigned int   lease_flags;</div><div class='add'>+} ;</div><div class='add'>+</div><div class='add'>+struct gf_iatt {</div><div class='add'>+        opaque             ia_gfid[16];</div><div class='add'>+        u_quad_t     ia_ino;        /* inode number */</div><div class='add'>+        u_quad_t     ia_dev;        /* backing device ID */</div><div class='add'>+        unsigned int       mode;          /* mode (type + protection )*/</div><div class='add'>+        unsigned int       ia_nlink;      /* Link count */</div><div class='add'>+        unsigned int       ia_uid;        /* user ID of owner */</div><div class='add'>+        unsigned int       ia_gid;        /* group ID of owner */</div><div class='add'>+        u_quad_t     ia_rdev;       /* device ID (if special file) */</div><div class='add'>+        u_quad_t     ia_size;       /* file size in bytes */</div><div class='add'>+        unsigned int       ia_blksize;    /* blocksize for filesystem I/O */</div><div class='add'>+        u_quad_t     ia_blocks;     /* number of 512B blocks allocated */</div><div class='add'>+        unsigned int       ia_atime;      /* last access time */</div><div class='add'>+        unsigned int       ia_atime_nsec;</div><div class='add'>+        unsigned int       ia_mtime;      /* last modification time */</div><div class='add'>+        unsigned int       ia_mtime_nsec;</div><div class='add'>+        unsigned int       ia_ctime;      /* last status change time */</div><div class='add'>+        unsigned int       ia_ctime_nsec;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+struct gfs3_cbk_cache_invalidation_req {</div><div class='add'>+        string         gfid&lt;&gt;;</div><div class='add'>+        unsigned int   event_type; /* Upcall event type */</div><div class='add'>+        unsigned int   flags;  /* or mask of events incase of inotify */</div><div class='add'>+        unsigned int   expire_time_attr; /* the amount of time which client</div><div class='add'>+                                          * can cache this entry */</div><div class='add'>+        gf_iatt stat;  /* Updated/current stat of the file/dir */</div><div class='add'>+        gf_iatt parent_stat;  /* Updated stat of the parent dir</div><div class='add'>+                                      * needed in case of create, mkdir,</div><div class='add'>+                                      * unlink, rmdir, rename fops */</div><div class='add'>+        gf_iatt oldparent_stat;  /* Updated stat of the oldparent dir</div><div class='add'>+                                           needed in case of rename fop */</div><div class='add'>+        opaque   xdata&lt;&gt;; /* Extra data */</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct gfs3_stat_req {</div><div class='add'>+        opaque gfid[16];</div><div class='add'>+        opaque   xdata&lt;&gt;; /* Extra data */</div><div class='add'>+};</div><div class='add'>+struct gfs3_stat_rsp {</div><div class='add'>+        int    op_ret;</div><div class='add'>+        int    op_errno;</div><div class='add'>+	gf_iatt stat;</div><div class='add'>+        opaque   xdata&lt;&gt;; /* Extra data */</div><div class='add'>+} ;</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+struct gfs3_readlink_req {</div><div class='add'>+        opaque gfid[16];</div><div class='add'>+	unsigned int   size;</div><div class='add'>+        opaque   xdata&lt;&gt;; /* Extra data */</div><div class='add'>+}  ;</div><div class='add'>+ struct gfs3_readlink_rsp {</div><div class='add'>+        int    op_ret;</div><div class='add'>+        int    op_errno;</div><div class='add'>+        gf_iatt buf;</div><div class='add'>+        string      path&lt;&gt;; /* NULL terminated */</div><div class='add'>+        opaque   xdata&lt;&gt;; /* Extra data */</div><div class='add'>+} ;</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+ struct gfs3_mknod_req {</div><div class='add'>+        opaque  pargfid[16];</div><div class='add'>+	u_quad_t dev;</div><div class='add'>+	unsigned int mode;</div><div class='add'>+        unsigned int umask;</div><div class='add'>+	string     bname&lt;&gt;; /* NULL terminated */</div><div class='add'>+        opaque   xdata&lt;&gt;; /* Extra data */</div><div class='add'>+} ;</div><div class='add'>+ struct gfs3_mknod_rsp {</div><div class='add'>+        int    op_ret;</div><div class='add'>+        int    op_errno;</div><div class='add'>+	gf_iatt stat;</div><div class='add'>+        gf_iatt preparent;</div><div class='add'>+        gf_iatt postparent;</div><div class='add'>+        opaque   xdata&lt;&gt;; /* Extra data */</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+ struct  gfs3_mkdir_req {</div><div class='add'>+        opaque  pargfid[16];</div><div class='add'>+	unsigned int mode;</div><div class='add'>+        unsigned int umask;</div><div class='add'>+	string     bname&lt;&gt;; /* NULL terminated */</div><div class='add'>+        opaque     xdata&lt;&gt;; /* Extra data */</div><div class='add'>+} ;</div><div class='add'>+ struct  gfs3_mkdir_rsp {</div><div class='add'>+        int    op_ret;</div><div class='add'>+        int    op_errno;</div><div class='add'>+	gf_iatt stat;</div><div class='add'>+        gf_iatt preparent;</div><div class='add'>+        gf_iatt postparent;</div><div class='add'>+        opaque   xdata&lt;&gt;; /* Extra data */</div><div class='add'>+} ;</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+ struct   gfs3_unlink_req {</div><div class='add'>+        opaque  pargfid[16];</div><div class='add'>+	string     bname&lt;&gt;; /* NULL terminated */</div><div class='add'>+        unsigned int xflags;</div><div class='add'>+        opaque   xdata&lt;&gt;; /* Extra data */</div><div class='add'>+};</div><div class='add'>+ struct   gfs3_unlink_rsp {</div><div class='add'>+        int    op_ret;</div><div class='add'>+        int    op_errno;</div><div class='add'>+        gf_iatt preparent;</div><div class='add'>+        gf_iatt postparent;</div><div class='add'>+        opaque   xdata&lt;&gt;; /* Extra data */</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+ struct   gfs3_rmdir_req {</div><div class='add'>+        opaque  pargfid[16];</div><div class='add'>+        int        xflags;</div><div class='add'>+	string     bname&lt;&gt;; /* NULL terminated */</div><div class='add'>+        opaque     xdata&lt;&gt;; /* Extra data */</div><div class='add'>+};</div><div class='add'>+ struct   gfs3_rmdir_rsp {</div><div class='add'>+        int    op_ret;</div><div class='add'>+        int    op_errno;</div><div class='add'>+        gf_iatt preparent;</div><div class='add'>+        gf_iatt postparent;</div><div class='add'>+        opaque   xdata&lt;&gt;; /* Extra data */</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+ struct   gfs3_symlink_req {</div><div class='add'>+        opaque  pargfid[16];</div><div class='add'>+	string     bname&lt;&gt;;</div><div class='add'>+        unsigned int umask;</div><div class='add'>+	string     linkname&lt;&gt;;</div><div class='add'>+        opaque   xdata&lt;&gt;; /* Extra data */</div><div class='add'>+};</div><div class='add'>+ struct  gfs3_symlink_rsp {</div><div class='add'>+        int    op_ret;</div><div class='add'>+        int    op_errno;</div><div class='add'>+	gf_iatt stat;</div><div class='add'>+        gf_iatt preparent;</div><div class='add'>+        gf_iatt postparent;</div><div class='add'>+        opaque   xdata&lt;&gt;; /* Extra data */</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+ struct   gfs3_rename_req {</div><div class='add'>+        opaque  oldgfid[16];</div><div class='add'>+        opaque  newgfid[16];</div><div class='add'>+	string       oldbname&lt;&gt;; /* NULL terminated */</div><div class='add'>+	string       newbname&lt;&gt;; /* NULL terminated */</div><div class='add'>+        opaque   xdata&lt;&gt;; /* Extra data */</div><div class='add'>+};</div><div class='add'>+ struct   gfs3_rename_rsp {</div><div class='add'>+        int    op_ret;</div><div class='add'>+        int    op_errno;</div><div class='add'>+	gf_iatt stat;</div><div class='add'>+        gf_iatt preoldparent;</div><div class='add'>+        gf_iatt postoldparent;</div><div class='add'>+        gf_iatt prenewparent;</div><div class='add'>+        gf_iatt postnewparent;</div><div class='add'>+        opaque   xdata&lt;&gt;; /* Extra data */</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+ struct  gfs3_link_req {</div><div class='add'>+        opaque  oldgfid[16];</div><div class='add'>+        opaque  newgfid[16];</div><div class='add'>+	string       newbname&lt;&gt;;</div><div class='add'>+        opaque   xdata&lt;&gt;; /* Extra data */</div><div class='add'>+};</div><div class='add'>+ struct   gfs3_link_rsp {</div><div class='add'>+        int    op_ret;</div><div class='add'>+        int    op_errno;</div><div class='add'>+	gf_iatt stat;</div><div class='add'>+        gf_iatt preparent;</div><div class='add'>+        gf_iatt postparent;</div><div class='add'>+        opaque   xdata&lt;&gt;; /* Extra data */</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+ struct   gfs3_truncate_req {</div><div class='add'>+        opaque gfid[16];</div><div class='add'>+	u_quad_t offset;</div><div class='add'>+        opaque   xdata&lt;&gt;; /* Extra data */</div><div class='add'>+};</div><div class='add'>+ struct   gfs3_truncate_rsp {</div><div class='add'>+        int    op_ret;</div><div class='add'>+        int    op_errno;</div><div class='add'>+	gf_iatt prestat;</div><div class='add'>+        gf_iatt poststat;</div><div class='add'>+        opaque   xdata&lt;&gt;; /* Extra data */</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+ struct   gfs3_open_req {</div><div class='add'>+        opaque gfid[16];</div><div class='add'>+	unsigned int flags;</div><div class='add'>+        opaque   xdata&lt;&gt;; /* Extra data */</div><div class='add'>+};</div><div class='add'>+ struct   gfs3_open_rsp {</div><div class='add'>+        int    op_ret;</div><div class='add'>+        int    op_errno;</div><div class='add'>+	quad_t fd;</div><div class='add'>+        opaque   xdata&lt;&gt;; /* Extra data */</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+ struct   gfs3_read_req {</div><div class='add'>+        opaque gfid[16];</div><div class='add'>+	quad_t  fd;</div><div class='add'>+	u_quad_t offset;</div><div class='add'>+	unsigned int size;</div><div class='add'>+        unsigned int flag;</div><div class='add'>+        opaque   xdata&lt;&gt;; /* Extra data */</div><div class='add'>+};</div><div class='add'>+ struct  gfs3_read_rsp {</div><div class='add'>+        int    op_ret;</div><div class='add'>+        int    op_errno;</div><div class='add'>+	gf_iatt stat;</div><div class='add'>+        unsigned int size;</div><div class='add'>+        opaque   xdata&lt;&gt;; /* Extra data */</div><div class='add'>+} ;</div><div class='add'>+</div><div class='add'>+struct   gfs3_lookup_req {</div><div class='add'>+        opaque gfid[16];</div><div class='add'>+        opaque  pargfid[16];</div><div class='add'>+	unsigned int flags;</div><div class='add'>+	string     bname&lt;&gt;;</div><div class='add'>+        opaque   xdata&lt;&gt;; /* Extra data */</div><div class='add'>+};</div><div class='add'>+ struct   gfs3_lookup_rsp {</div><div class='add'>+        int    op_ret;</div><div class='add'>+        int    op_errno;</div><div class='add'>+	gf_iatt stat;</div><div class='add'>+        gf_iatt postparent;</div><div class='add'>+        opaque   xdata&lt;&gt;; /* Extra data */</div><div class='add'>+} ;</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+ struct   gfs3_write_req {</div><div class='add'>+        opaque gfid[16];</div><div class='add'>+	quad_t  fd;</div><div class='add'>+	u_quad_t offset;</div><div class='add'>+	unsigned int size;</div><div class='add'>+        unsigned int flag;</div><div class='add'>+        opaque   xdata&lt;&gt;; /* Extra data */</div><div class='add'>+};</div><div class='add'>+ struct gfs3_write_rsp {</div><div class='add'>+        int    op_ret;</div><div class='add'>+        int    op_errno;</div><div class='add'>+	gf_iatt prestat;</div><div class='add'>+        gf_iatt poststat;</div><div class='add'>+        opaque   xdata&lt;&gt;; /* Extra data */</div><div class='add'>+} ;</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+ struct gfs3_statfs_req  {</div><div class='add'>+        opaque gfid[16];</div><div class='add'>+        opaque   xdata&lt;&gt;; /* Extra data */</div><div class='add'>+}  ;</div><div class='add'>+ struct gfs3_statfs_rsp {</div><div class='add'>+        int    op_ret;</div><div class='add'>+        int    op_errno;</div><div class='add'>+	gf_statfs statfs;</div><div class='add'>+        opaque   xdata&lt;&gt;; /* Extra data */</div><div class='add'>+}  ;</div><div class='add'>+</div><div class='add'>+ struct gfs3_lk_req {</div><div class='add'>+        opaque gfid[16];</div><div class='add'>+	int64_t         fd;</div><div class='add'>+	unsigned int        cmd;</div><div class='add'>+	unsigned int        type;</div><div class='add'>+	gf_proto_flock flock;</div><div class='add'>+        opaque   xdata&lt;&gt;; /* Extra data */</div><div class='add'>+}  ;</div><div class='add'>+ struct gfs3_lk_rsp {</div><div class='add'>+        int    op_ret;</div><div class='add'>+        int    op_errno;</div><div class='add'>+	gf_proto_flock flock;</div><div class='add'>+        opaque   xdata&lt;&gt;; /* Extra data */</div><div class='add'>+}  ;</div><div class='add'>+</div><div class='add'>+struct gfs3_lease_req {</div><div class='add'>+        opaque gfid[16];</div><div class='add'>+        gf_proto_lease lease;</div><div class='add'>+        opaque   xdata&lt;&gt;; /* Extra data */</div><div class='add'>+}  ;</div><div class='add'>+</div><div class='add'>+struct gfs3_lease_rsp {</div><div class='add'>+        int    op_ret;</div><div class='add'>+        int    op_errno;</div><div class='add'>+        gf_proto_lease lease;</div><div class='add'>+        opaque   xdata&lt;&gt;; /* Extra data */</div><div class='add'>+}  ;</div><div class='add'>+</div><div class='add'>+struct gfs3_recall_lease_req {</div><div class='add'>+        opaque       gfid[16];</div><div class='add'>+        unsigned int lease_type;</div><div class='add'>+        opaque       tid[16];</div><div class='add'>+        opaque       xdata&lt;&gt;; /* Extra data */</div><div class='add'>+}  ;</div><div class='add'>+</div><div class='add'>+ struct gfs3_inodelk_req {</div><div class='add'>+        opaque gfid[16];</div><div class='add'>+	unsigned int cmd;</div><div class='add'>+	unsigned int type;</div><div class='add'>+	gf_proto_flock flock;</div><div class='add'>+        string     volume&lt;&gt;;</div><div class='add'>+        opaque   xdata&lt;&gt;; /* Extra data */</div><div class='add'>+}  ;</div><div class='add'>+</div><div class='add'>+struct   gfs3_finodelk_req {</div><div class='add'>+        opaque gfid[16];</div><div class='add'>+	quad_t  fd;</div><div class='add'>+	unsigned int cmd;</div><div class='add'>+	unsigned int type;</div><div class='add'>+	gf_proto_flock flock;</div><div class='add'>+        string volume&lt;&gt;;</div><div class='add'>+        opaque   xdata&lt;&gt;; /* Extra data */</div><div class='add'>+} ;</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+ struct gfs3_flush_req {</div><div class='add'>+        opaque gfid[16];</div><div class='add'>+	quad_t  fd;</div><div class='add'>+        opaque   xdata&lt;&gt;; /* Extra data */</div><div class='add'>+}  ;</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+ struct gfs3_fsync_req {</div><div class='add'>+        opaque gfid[16];</div><div class='add'>+	quad_t  fd;</div><div class='add'>+	unsigned int data;</div><div class='add'>+        opaque   xdata&lt;&gt;; /* Extra data */</div><div class='add'>+}  ;</div><div class='add'>+ struct gfs3_fsync_rsp {</div><div class='add'>+        int    op_ret;</div><div class='add'>+        int    op_errno;</div><div class='add'>+        gf_iatt prestat;</div><div class='add'>+        gf_iatt poststat;</div><div class='add'>+        opaque   xdata&lt;&gt;; /* Extra data */</div><div class='add'>+}  ;</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+ struct gfs3_setxattr_req {</div><div class='add'>+        opaque gfid[16];</div><div class='add'>+	unsigned int flags;</div><div class='add'>+        opaque     dict&lt;&gt;;</div><div class='add'>+        opaque   xdata&lt;&gt;; /* Extra data */</div><div class='add'>+}  ;</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+ struct gfs3_fsetxattr_req {</div><div class='add'>+        opaque gfid[16];</div><div class='add'>+	int64_t  fd;</div><div class='add'>+	unsigned int flags;</div><div class='add'>+        opaque     dict&lt;&gt;;</div><div class='add'>+        opaque   xdata&lt;&gt;; /* Extra data */</div><div class='add'>+}  ;</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+ struct gfs3_xattrop_req {</div><div class='add'>+        opaque gfid[16];</div><div class='add'>+	unsigned int flags;</div><div class='add'>+        opaque     dict&lt;&gt;;</div><div class='add'>+        opaque   xdata&lt;&gt;; /* Extra data */</div><div class='add'>+}  ;</div><div class='add'>+</div><div class='add'>+ struct gfs3_xattrop_rsp  {</div><div class='add'>+        int    op_ret;</div><div class='add'>+        int    op_errno;</div><div class='add'>+	opaque  dict&lt;&gt;;</div><div class='add'>+        opaque   xdata&lt;&gt;; /* Extra data */</div><div class='add'>+}  ;</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+ struct gfs3_fxattrop_req {</div><div class='add'>+        opaque gfid[16];</div><div class='add'>+	quad_t  fd;</div><div class='add'>+	unsigned int flags;</div><div class='add'>+	opaque     dict&lt;&gt;;</div><div class='add'>+        opaque   xdata&lt;&gt;; /* Extra data */</div><div class='add'>+}  ;</div><div class='add'>+</div><div class='add'>+ struct gfs3_fxattrop_rsp  {</div><div class='add'>+        int    op_ret;</div><div class='add'>+        int    op_errno;</div><div class='add'>+	opaque  dict&lt;&gt;;</div><div class='add'>+        opaque   xdata&lt;&gt;; /* Extra data */</div><div class='add'>+}  ;</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+ struct gfs3_getxattr_req  {</div><div class='add'>+        opaque gfid[16];</div><div class='add'>+	unsigned int namelen;</div><div class='add'>+	string     name&lt;&gt;;</div><div class='add'>+        opaque   xdata&lt;&gt;; /* Extra data */</div><div class='add'>+}  ;</div><div class='add'>+ struct gfs3_getxattr_rsp {</div><div class='add'>+        int    op_ret;</div><div class='add'>+        int    op_errno;</div><div class='add'>+	opaque     dict&lt;&gt;;</div><div class='add'>+        opaque   xdata&lt;&gt;; /* Extra data */</div><div class='add'>+}  ;</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+ struct gfs3_fgetxattr_req  {</div><div class='add'>+        opaque gfid[16];</div><div class='add'>+	quad_t  fd;</div><div class='add'>+        unsigned int namelen;</div><div class='add'>+	string     name&lt;&gt;;</div><div class='add'>+        opaque   xdata&lt;&gt;; /* Extra data */</div><div class='add'>+}  ;</div><div class='add'>+ struct gfs3_fgetxattr_rsp {</div><div class='add'>+        int    op_ret;</div><div class='add'>+        int    op_errno;</div><div class='add'>+        opaque     dict&lt;&gt;;</div><div class='add'>+        opaque   xdata&lt;&gt;; /* Extra data */</div><div class='add'>+}  ;</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+ struct gfs3_removexattr_req {</div><div class='add'>+        opaque gfid[16];</div><div class='add'>+	string     name&lt;&gt;;</div><div class='add'>+        opaque   xdata&lt;&gt;; /* Extra data */</div><div class='add'>+}  ;</div><div class='add'>+</div><div class='add'>+ struct gfs3_fremovexattr_req {</div><div class='add'>+        opaque gfid[16];</div><div class='add'>+        quad_t  fd;</div><div class='add'>+	string     name&lt;&gt;;</div><div class='add'>+        opaque   xdata&lt;&gt;; /* Extra data */</div><div class='add'>+}  ;</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+ struct gfs3_opendir_req {</div><div class='add'>+        opaque gfid[16];</div><div class='add'>+        opaque   xdata&lt;&gt;; /* Extra data */</div><div class='add'>+}  ;</div><div class='add'>+ struct gfs3_opendir_rsp {</div><div class='add'>+        int    op_ret;</div><div class='add'>+        int    op_errno;</div><div class='add'>+	quad_t fd;</div><div class='add'>+        opaque   xdata&lt;&gt;; /* Extra data */</div><div class='add'>+}  ;</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+ struct gfs3_fsyncdir_req {</div><div class='add'>+        opaque gfid[16];</div><div class='add'>+	quad_t  fd;</div><div class='add'>+	int  data;</div><div class='add'>+        opaque   xdata&lt;&gt;; /* Extra data */</div><div class='add'>+}  ;</div><div class='add'>+</div><div class='add'>+ struct   gfs3_readdir_req  {</div><div class='add'>+        opaque gfid[16];</div><div class='add'>+	quad_t  fd;</div><div class='add'>+	u_quad_t offset;</div><div class='add'>+	unsigned int size;</div><div class='add'>+        opaque   xdata&lt;&gt;; /* Extra data */</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+ struct gfs3_readdirp_req {</div><div class='add'>+        opaque gfid[16];</div><div class='add'>+	quad_t  fd;</div><div class='add'>+	u_quad_t offset;</div><div class='add'>+	unsigned int size;</div><div class='add'>+        opaque dict&lt;&gt;;</div><div class='add'>+}  ;</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+struct gfs3_access_req  {</div><div class='add'>+        opaque gfid[16];</div><div class='add'>+	unsigned int mask;</div><div class='add'>+        opaque   xdata&lt;&gt;; /* Extra data */</div><div class='add'>+} ;</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+struct gfs3_create_req {</div><div class='add'>+        opaque  pargfid[16];</div><div class='add'>+	unsigned int flags;</div><div class='add'>+	unsigned int mode;</div><div class='add'>+	unsigned int umask;</div><div class='add'>+	string     bname&lt;&gt;;</div><div class='add'>+        opaque   xdata&lt;&gt;; /* Extra data */</div><div class='add'>+}  ;</div><div class='add'>+struct  gfs3_create_rsp {</div><div class='add'>+        int    op_ret;</div><div class='add'>+        int    op_errno;</div><div class='add'>+	gf_iatt stat;</div><div class='add'>+	u_quad_t       fd;</div><div class='add'>+        gf_iatt preparent;</div><div class='add'>+        gf_iatt postparent;</div><div class='add'>+        opaque   xdata&lt;&gt;; /* Extra data */</div><div class='add'>+} ;</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+struct   gfs3_ftruncate_req  {</div><div class='add'>+        opaque gfid[16];</div><div class='add'>+	quad_t  fd;</div><div class='add'>+	u_quad_t offset;</div><div class='add'>+        opaque   xdata&lt;&gt;; /* Extra data */</div><div class='add'>+} ;</div><div class='add'>+struct   gfs3_ftruncate_rsp {</div><div class='add'>+        int    op_ret;</div><div class='add'>+        int    op_errno;</div><div class='add'>+	gf_iatt prestat;</div><div class='add'>+        gf_iatt poststat;</div><div class='add'>+        opaque   xdata&lt;&gt;; /* Extra data */</div><div class='add'>+} ;</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+struct gfs3_fstat_req {</div><div class='add'>+        opaque gfid[16];</div><div class='add'>+	quad_t  fd;</div><div class='add'>+        opaque   xdata&lt;&gt;; /* Extra data */</div><div class='add'>+}  ;</div><div class='add'>+ struct gfs3_fstat_rsp {</div><div class='add'>+        int    op_ret;</div><div class='add'>+        int    op_errno;</div><div class='add'>+	gf_iatt stat;</div><div class='add'>+        opaque   xdata&lt;&gt;; /* Extra data */</div><div class='add'>+}  ;</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+ struct   gfs3_entrylk_req {</div><div class='add'>+        opaque gfid[16];</div><div class='add'>+	unsigned int  cmd;</div><div class='add'>+	unsigned int  type;</div><div class='add'>+	u_quad_t  namelen;</div><div class='add'>+	string      name&lt;&gt;;</div><div class='add'>+        string      volume&lt;&gt;;</div><div class='add'>+        opaque   xdata&lt;&gt;; /* Extra data */</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+ struct   gfs3_fentrylk_req {</div><div class='add'>+        opaque gfid[16];</div><div class='add'>+	quad_t   fd;</div><div class='add'>+	unsigned int  cmd;</div><div class='add'>+	unsigned int  type;</div><div class='add'>+	u_quad_t  namelen;</div><div class='add'>+	string      name&lt;&gt;;</div><div class='add'>+        string      volume&lt;&gt;;</div><div class='add'>+        opaque   xdata&lt;&gt;; /* Extra data */</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+ struct gfs3_setattr_req {</div><div class='add'>+        opaque gfid[16];</div><div class='add'>+        gf_iatt stbuf;</div><div class='add'>+        int        valid;</div><div class='add'>+        opaque   xdata&lt;&gt;; /* Extra data */</div><div class='add'>+}  ;</div><div class='add'>+ struct gfs3_setattr_rsp {</div><div class='add'>+        int    op_ret;</div><div class='add'>+        int    op_errno;</div><div class='add'>+        gf_iatt statpre;</div><div class='add'>+        gf_iatt statpost;</div><div class='add'>+        opaque   xdata&lt;&gt;; /* Extra data */</div><div class='add'>+}  ;</div><div class='add'>+</div><div class='add'>+ struct gfs3_fsetattr_req {</div><div class='add'>+        quad_t        fd;</div><div class='add'>+        gf_iatt stbuf;</div><div class='add'>+        int        valid;</div><div class='add'>+        opaque   xdata&lt;&gt;; /* Extra data */</div><div class='add'>+}  ;</div><div class='add'>+ struct gfs3_fsetattr_rsp {</div><div class='add'>+        int    op_ret;</div><div class='add'>+        int    op_errno;</div><div class='add'>+        gf_iatt statpre;</div><div class='add'>+        gf_iatt statpost;</div><div class='add'>+        opaque   xdata&lt;&gt;; /* Extra data */</div><div class='add'>+}  ;</div><div class='add'>+</div><div class='add'>+ struct gfs3_fallocate_req {</div><div class='add'>+	opaque		gfid[16];</div><div class='add'>+        quad_t		fd;</div><div class='add'>+	unsigned int	flags;</div><div class='add'>+	u_quad_t	offset;</div><div class='add'>+	u_quad_t	size;</div><div class='add'>+        opaque   xdata&lt;&gt;; /* Extra data */</div><div class='add'>+}  ;</div><div class='add'>+</div><div class='add'>+ struct gfs3_fallocate_rsp {</div><div class='add'>+        int    op_ret;</div><div class='add'>+        int    op_errno;</div><div class='add'>+        gf_iatt statpre;</div><div class='add'>+        gf_iatt statpost;</div><div class='add'>+        opaque   xdata&lt;&gt;; /* Extra data */</div><div class='add'>+}  ;</div><div class='add'>+</div><div class='add'>+ struct gfs3_discard_req {</div><div class='add'>+	opaque		gfid[16];</div><div class='add'>+        quad_t		fd;</div><div class='add'>+	u_quad_t	offset;</div><div class='add'>+	u_quad_t	size;</div><div class='add'>+        opaque   xdata&lt;&gt;; /* Extra data */</div><div class='add'>+}  ;</div><div class='add'>+</div><div class='add'>+ struct gfs3_discard_rsp {</div><div class='add'>+        int    op_ret;</div><div class='add'>+        int    op_errno;</div><div class='add'>+        gf_iatt statpre;</div><div class='add'>+        gf_iatt statpost;</div><div class='add'>+        opaque   xdata&lt;&gt;; /* Extra data */</div><div class='add'>+}  ;</div><div class='add'>+</div><div class='add'>+ struct gfs3_zerofill_req {</div><div class='add'>+        opaque          gfid[16];</div><div class='add'>+        quad_t           fd;</div><div class='add'>+        u_quad_t  offset;</div><div class='add'>+        u_quad_t  size;</div><div class='add'>+        opaque   xdata&lt;&gt;;</div><div class='add'>+}  ;</div><div class='add'>+</div><div class='add'>+ struct gfs3_zerofill_rsp {</div><div class='add'>+        int    op_ret;</div><div class='add'>+        int    op_errno;</div><div class='add'>+        gf_iatt statpre;</div><div class='add'>+        gf_iatt statpost;</div><div class='add'>+        opaque   xdata&lt;&gt;;</div><div class='add'>+}  ;</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+ struct gfs3_rchecksum_req {</div><div class='add'>+        quad_t   fd;</div><div class='add'>+        u_quad_t  offset;</div><div class='add'>+        unsigned int  len;</div><div class='add'>+        opaque   xdata&lt;&gt;; /* Extra data */</div><div class='add'>+}  ;</div><div class='add'>+ struct gfs3_rchecksum_rsp {</div><div class='add'>+        int    op_ret;</div><div class='add'>+        int    op_errno;</div><div class='add'>+        unsigned int weak_checksum;</div><div class='add'>+        opaque   strong_checksum&lt;&gt;;</div><div class='add'>+        opaque   xdata&lt;&gt;; /* Extra data */</div><div class='add'>+}  ;</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+struct gfs3_ipc_req {</div><div class='add'>+	int     op;</div><div class='add'>+	opaque  xdata&lt;&gt;;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct gfs3_ipc_rsp {</div><div class='add'>+	int     op_ret;</div><div class='add'>+	int     op_errno;</div><div class='add'>+	opaque  xdata&lt;&gt;;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+struct gfs3_seek_req {</div><div class='add'>+        opaque    gfid[16];</div><div class='add'>+        quad_t    fd;</div><div class='add'>+        u_quad_t  offset;</div><div class='add'>+        int       what;</div><div class='add'>+        opaque    xdata&lt;&gt;;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct gfs3_seek_rsp {</div><div class='add'>+        int       op_ret;</div><div class='add'>+        int       op_errno;</div><div class='add'>+        u_quad_t  offset;</div><div class='add'>+        opaque    xdata&lt;&gt;;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+ struct gf_setvolume_req {</div><div class='add'>+        opaque dict&lt;&gt;;</div><div class='add'>+}  ;</div><div class='add'>+ struct  gf_setvolume_rsp {</div><div class='add'>+        int    op_ret;</div><div class='add'>+        int    op_errno;</div><div class='add'>+        opaque dict&lt;&gt;;</div><div class='add'>+} ;</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+ struct gf_getspec_req {</div><div class='add'>+	unsigned int flags;</div><div class='add'>+	string     key&lt;&gt;;</div><div class='add'>+        opaque   xdata&lt;&gt;; /* Extra data */</div><div class='add'>+}  ;</div><div class='add'>+ struct  gf_getspec_rsp {</div><div class='add'>+        int    op_ret;</div><div class='add'>+        int    op_errno;</div><div class='add'>+	string spec&lt;&gt;;</div><div class='add'>+        opaque   xdata&lt;&gt;; /* Extra data */</div><div class='add'>+} ;</div><div class='add'>+</div><div class='add'>+ struct gf_get_volume_info_req {</div><div class='add'>+        opaque   dict&lt;&gt;; /* Extra data */</div><div class='add'>+}  ;</div><div class='add'>+ struct  gf_get_volume_info_rsp {</div><div class='add'>+        int    op_ret;</div><div class='add'>+        int    op_errno;</div><div class='add'>+        string op_errstr&lt;&gt;;</div><div class='add'>+        opaque   dict&lt;&gt;; /* Extra data */</div><div class='add'>+} ;</div><div class='add'>+</div><div class='add'>+ struct gf_mgmt_hndsk_req {</div><div class='add'>+        opaque   hndsk&lt;&gt;;</div><div class='add'>+}  ;</div><div class='add'>+</div><div class='add'>+ struct  gf_mgmt_hndsk_rsp {</div><div class='add'>+        int    op_ret;</div><div class='add'>+        int    op_errno;</div><div class='add'>+        opaque   hndsk&lt;&gt;;</div><div class='add'>+} ;</div><div class='add'>+</div><div class='add'>+ struct   gf_log_req {</div><div class='add'>+        opaque    msg&lt;&gt;;</div><div class='add'>+} ;</div><div class='add'>+</div><div class='add'>+ struct gf_notify_req {</div><div class='add'>+	unsigned int  flags;</div><div class='add'>+        string buf&lt;&gt;;</div><div class='add'>+        opaque   xdata&lt;&gt;; /* Extra data */</div><div class='add'>+}  ;</div><div class='add'>+ struct gf_notify_rsp {</div><div class='add'>+        int    op_ret;</div><div class='add'>+        int    op_errno;</div><div class='add'>+	unsigned int  flags;</div><div class='add'>+        string buf&lt;&gt;;</div><div class='add'>+        opaque   xdata&lt;&gt;; /* Extra data */</div><div class='add'>+}  ;</div><div class='add'>+</div><div class='add'>+struct gfs3_releasedir_req {</div><div class='add'>+        opaque gfid[16];</div><div class='add'>+	quad_t  fd;</div><div class='add'>+        opaque   xdata&lt;&gt;; /* Extra data */</div><div class='add'>+}  ;</div><div class='add'>+</div><div class='add'>+struct gfs3_release_req {</div><div class='add'>+        opaque gfid[16];</div><div class='add'>+	quad_t  fd;</div><div class='add'>+        opaque   xdata&lt;&gt;; /* Extra data */</div><div class='add'>+}  ;</div><div class='add'>+</div><div class='add'>+struct gfs3_dirlist {</div><div class='add'>+       u_quad_t d_ino;</div><div class='add'>+       u_quad_t d_off;</div><div class='add'>+       unsigned int d_len;</div><div class='add'>+       unsigned int d_type;</div><div class='add'>+       string name&lt;&gt;;</div><div class='add'>+       gfs3_dirlist *nextentry;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+struct gfs3_readdir_rsp {</div><div class='add'>+       int op_ret;</div><div class='add'>+       int op_errno;</div><div class='add'>+       gfs3_dirlist *reply;</div><div class='add'>+        opaque   xdata&lt;&gt;; /* Extra data */</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct gfs3_dirplist {</div><div class='add'>+       u_quad_t d_ino;</div><div class='add'>+       u_quad_t d_off;</div><div class='add'>+       unsigned int d_len;</div><div class='add'>+       unsigned int d_type;</div><div class='add'>+       string name&lt;&gt;;</div><div class='add'>+       gf_iatt stat;</div><div class='add'>+       opaque dict&lt;&gt;;</div><div class='add'>+       gfs3_dirplist *nextentry;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct gfs3_readdirp_rsp {</div><div class='add'>+       int op_ret;</div><div class='add'>+       int op_errno;</div><div class='add'>+       gfs3_dirplist *reply;</div><div class='add'>+        opaque   xdata&lt;&gt;; /* Extra data */</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct gf_set_lk_ver_rsp {</div><div class='add'>+       int op_ret;</div><div class='add'>+       int op_errno;</div><div class='add'>+       int lk_ver;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct gf_set_lk_ver_req {</div><div class='add'>+       string uid&lt;&gt;;</div><div class='add'>+       int lk_ver;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct gf_event_notify_req {</div><div class='add'>+	int op;</div><div class='add'>+	opaque dict&lt;&gt;;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct gf_event_notify_rsp {</div><div class='add'>+	int op_ret;</div><div class='add'>+	int op_errno;</div><div class='add'>+	opaque dict&lt;&gt;;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+struct gf_getsnap_name_uuid_req {</div><div class='add'>+        opaque dict&lt;&gt;;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct gf_getsnap_name_uuid_rsp {</div><div class='add'>+        int op_ret;</div><div class='add'>+        int op_errno;</div><div class='add'>+        string op_errstr&lt;&gt;;</div><div class='add'>+        opaque dict&lt;&gt;;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct gfs3_locklist {</div><div class='add'>+        gf_proto_flock flock;</div><div class='add'>+        string client_uid&lt;&gt;;</div><div class='add'>+        unsigned int lk_flags;</div><div class='add'>+        gfs3_locklist *nextentry;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct gfs3_getactivelk_rsp {</div><div class='add'>+        int op_ret;</div><div class='add'>+        int op_errno;</div><div class='add'>+        gfs3_locklist *reply;</div><div class='add'>+        opaque xdata&lt;&gt;;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct gfs3_getactivelk_req {</div><div class='add'>+        opaque gfid[16];</div><div class='add'>+        opaque xdata&lt;&gt;;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct gfs3_setactivelk_rsp {</div><div class='add'>+        int    op_ret;</div><div class='add'>+        int    op_errno;</div><div class='add'>+        opaque   xdata&lt;&gt;;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct gfs3_setactivelk_req {</div><div class='add'>+        opaque gfid[16];</div><div class='add'>+        gfs3_locklist *request;</div><div class='add'>+        opaque xdata&lt;&gt;;</div><div class='add'>+};</div><div class='head'>diff --git a/rpc/xdr/src/glusterfs3.c b/rpc/xdr/src/glusterfs3.c<br/>deleted file mode 100644<br/>index 5e02fda5084..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/rpc/xdr/src/glusterfs3.c?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>rpc/xdr/src/glusterfs3.c</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,1137 +0,0 @@</div><div class='del'>-/*</div><div class='del'>-  Copyright (c) 2007-2010 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='del'>-  This file is part of GlusterFS.</div><div class='del'>-</div><div class='del'>-  GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-  it under the terms of the GNU Affero General Public License as published</div><div class='del'>-  by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-  or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-  GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-  WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-  Affero General Public License for more details.</div><div class='del'>-</div><div class='del'>-  You should have received a copy of the GNU Affero General Public License</div><div class='del'>-  along with this program.  If not, see</div><div class='del'>-  &lt;http://www.gnu.org/licenses/&gt;.</div><div class='del'>-*/</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-#include "glusterfs3.h"</div><div class='del'>-#include "xdr-generic.h"</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-/* Encode */</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_serialize_getspec_rsp (struct iovec outmsg, void *rsp)</div><div class='del'>-{</div><div class='del'>-        return xdr_serialize_generic (outmsg, (void *)rsp,</div><div class='del'>-                                      (xdrproc_t)xdr_gf_getspec_rsp);</div><div class='del'>-</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_serialize_lookup_rsp (struct iovec outmsg, void *rsp)</div><div class='del'>-{</div><div class='del'>-        return xdr_serialize_generic (outmsg, (void *)rsp,</div><div class='del'>-                                      (xdrproc_t)xdr_gfs3_lookup_rsp);</div><div class='del'>-</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_serialize_common_rsp (struct iovec outmsg, void *rsp)</div><div class='del'>-{</div><div class='del'>-        return xdr_serialize_generic (outmsg, (void *)rsp,</div><div class='del'>-                                      (xdrproc_t)xdr_gf_common_rsp);</div><div class='del'>-</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_serialize_setvolume_rsp (struct iovec outmsg, void *rsp)</div><div class='del'>-{</div><div class='del'>-        return xdr_serialize_generic (outmsg, (void *)rsp,</div><div class='del'>-                                      (xdrproc_t)xdr_gf_setvolume_rsp);</div><div class='del'>-</div><div class='del'>-}</div><div class='del'>-ssize_t</div><div class='del'>-xdr_serialize_statfs_rsp (struct iovec outmsg, void *rsp)</div><div class='del'>-{</div><div class='del'>-        return xdr_serialize_generic (outmsg, (void *)rsp,</div><div class='del'>-                                      (xdrproc_t)xdr_gfs3_statfs_rsp);</div><div class='del'>-</div><div class='del'>-}</div><div class='del'>-ssize_t</div><div class='del'>-xdr_serialize_stat_rsp (struct iovec outmsg, void *rsp)</div><div class='del'>-{</div><div class='del'>-        return xdr_serialize_generic (outmsg, (void *)rsp,</div><div class='del'>-                                      (xdrproc_t)xdr_gfs3_stat_rsp);</div><div class='del'>-</div><div class='del'>-}</div><div class='del'>-ssize_t</div><div class='del'>-xdr_serialize_fstat_rsp (struct iovec outmsg, void *rsp)</div><div class='del'>-{</div><div class='del'>-        return xdr_serialize_generic (outmsg, (void *)rsp,</div><div class='del'>-                                      (xdrproc_t)xdr_gfs3_fstat_rsp);</div><div class='del'>-</div><div class='del'>-}</div><div class='del'>-ssize_t</div><div class='del'>-xdr_serialize_open_rsp (struct iovec outmsg, void *rsp)</div><div class='del'>-{</div><div class='del'>-        return xdr_serialize_generic (outmsg, (void *)rsp,</div><div class='del'>-                                      (xdrproc_t)xdr_gfs3_open_rsp);</div><div class='del'>-</div><div class='del'>-}</div><div class='del'>-ssize_t</div><div class='del'>-xdr_serialize_read_rsp (struct iovec outmsg, void *rsp)</div><div class='del'>-{</div><div class='del'>-        return xdr_serialize_generic (outmsg, (void *)rsp,</div><div class='del'>-                                      (xdrproc_t)xdr_gfs3_read_rsp);</div><div class='del'>-</div><div class='del'>-}</div><div class='del'>-ssize_t</div><div class='del'>-xdr_serialize_write_rsp (struct iovec outmsg, void *rsp)</div><div class='del'>-{</div><div class='del'>-        return xdr_serialize_generic (outmsg, (void *)rsp,</div><div class='del'>-                                      (xdrproc_t)xdr_gfs3_write_rsp);</div><div class='del'>-</div><div class='del'>-}</div><div class='del'>-ssize_t</div><div class='del'>-xdr_serialize_rename_rsp (struct iovec outmsg, void *rsp)</div><div class='del'>-{</div><div class='del'>-        return xdr_serialize_generic (outmsg, (void *)rsp,</div><div class='del'>-                                      (xdrproc_t)xdr_gfs3_rename_rsp);</div><div class='del'>-</div><div class='del'>-}</div><div class='del'>-ssize_t</div><div class='del'>-xdr_serialize_fsync_rsp (struct iovec outmsg, void *rsp)</div><div class='del'>-{</div><div class='del'>-        return xdr_serialize_generic (outmsg, (void *)rsp,</div><div class='del'>-                                      (xdrproc_t)xdr_gfs3_fsync_rsp);</div><div class='del'>-</div><div class='del'>-}</div><div class='del'>-ssize_t</div><div class='del'>-xdr_serialize_rmdir_rsp (struct iovec outmsg, void *rsp)</div><div class='del'>-{</div><div class='del'>-        return xdr_serialize_generic (outmsg, (void *)rsp,</div><div class='del'>-                                      (xdrproc_t)xdr_gfs3_rmdir_rsp);</div><div class='del'>-}</div><div class='del'>-ssize_t</div><div class='del'>-xdr_serialize_unlink_rsp (struct iovec outmsg, void *rsp)</div><div class='del'>-{</div><div class='del'>-        return xdr_serialize_generic (outmsg, (void *)rsp,</div><div class='del'>-                                      (xdrproc_t)xdr_gfs3_unlink_rsp);</div><div class='del'>-}</div><div class='del'>-ssize_t</div><div class='del'>-xdr_serialize_writev_rsp (struct iovec outmsg, void *rsp)</div><div class='del'>-{</div><div class='del'>-        return xdr_serialize_generic (outmsg, (void *)rsp,</div><div class='del'>-                                      (xdrproc_t)xdr_gfs3_write_rsp);</div><div class='del'>-}</div><div class='del'>-ssize_t</div><div class='del'>-xdr_serialize_readv_rsp (struct iovec outmsg, void *rsp)</div><div class='del'>-{</div><div class='del'>-        return xdr_serialize_generic (outmsg, (void *)rsp,</div><div class='del'>-                                      (xdrproc_t)xdr_gfs3_read_rsp);</div><div class='del'>-}</div><div class='del'>-ssize_t</div><div class='del'>-xdr_serialize_readdir_rsp (struct iovec outmsg, void *rsp)</div><div class='del'>-{</div><div class='del'>-        return xdr_serialize_generic (outmsg, (void *)rsp,</div><div class='del'>-                                      (xdrproc_t)xdr_gfs3_readdir_rsp);</div><div class='del'>-}</div><div class='del'>-ssize_t</div><div class='del'>-xdr_serialize_readdirp_rsp (struct iovec outmsg, void *rsp)</div><div class='del'>-{</div><div class='del'>-        return xdr_serialize_generic (outmsg, (void *)rsp,</div><div class='del'>-                                      (xdrproc_t)xdr_gfs3_readdirp_rsp);</div><div class='del'>-}</div><div class='del'>-ssize_t</div><div class='del'>-xdr_serialize_rchecksum_rsp (struct iovec outmsg, void *rsp)</div><div class='del'>-{</div><div class='del'>-        return xdr_serialize_generic (outmsg, (void *)rsp,</div><div class='del'>-                                      (xdrproc_t)xdr_gfs3_rchecksum_rsp);</div><div class='del'>-}</div><div class='del'>-ssize_t</div><div class='del'>-xdr_serialize_setattr_rsp (struct iovec outmsg, void *rsp)</div><div class='del'>-{</div><div class='del'>-        return xdr_serialize_generic (outmsg, (void *)rsp,</div><div class='del'>-                                      (xdrproc_t)xdr_gfs3_setattr_rsp);</div><div class='del'>-}</div><div class='del'>-ssize_t</div><div class='del'>-xdr_serialize_fsetattr_rsp (struct iovec outmsg, void *rsp)</div><div class='del'>-{</div><div class='del'>-        return xdr_serialize_generic (outmsg, (void *)rsp,</div><div class='del'>-                                      (xdrproc_t)xdr_gfs3_fsetattr_rsp);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_serialize_readlink_rsp (struct iovec outmsg, void *rsp)</div><div class='del'>-{</div><div class='del'>-        return xdr_serialize_generic (outmsg, (void *)rsp,</div><div class='del'>-                                      (xdrproc_t)xdr_gfs3_readlink_rsp);</div><div class='del'>-</div><div class='del'>-}</div><div class='del'>-ssize_t</div><div class='del'>-xdr_serialize_symlink_rsp (struct iovec outmsg, void *rsp)</div><div class='del'>-{</div><div class='del'>-        return xdr_serialize_generic (outmsg, (void *)rsp,</div><div class='del'>-                                      (xdrproc_t)xdr_gfs3_symlink_rsp);</div><div class='del'>-</div><div class='del'>-}</div><div class='del'>-ssize_t</div><div class='del'>-xdr_serialize_create_rsp (struct iovec outmsg, void *rsp)</div><div class='del'>-{</div><div class='del'>-        return xdr_serialize_generic (outmsg, (void *)rsp,</div><div class='del'>-                                      (xdrproc_t)xdr_gfs3_create_rsp);</div><div class='del'>-</div><div class='del'>-}</div><div class='del'>-ssize_t</div><div class='del'>-xdr_serialize_link_rsp (struct iovec outmsg, void *rsp)</div><div class='del'>-{</div><div class='del'>-        return xdr_serialize_generic (outmsg, (void *)rsp,</div><div class='del'>-                                      (xdrproc_t)xdr_gfs3_link_rsp);</div><div class='del'>-</div><div class='del'>-}</div><div class='del'>-ssize_t</div><div class='del'>-xdr_serialize_mkdir_rsp (struct iovec outmsg, void *rsp)</div><div class='del'>-{</div><div class='del'>-        return xdr_serialize_generic (outmsg, (void *)rsp,</div><div class='del'>-                                      (xdrproc_t)xdr_gfs3_mkdir_rsp);</div><div class='del'>-</div><div class='del'>-}</div><div class='del'>-ssize_t</div><div class='del'>-xdr_serialize_mknod_rsp (struct iovec outmsg, void *rsp)</div><div class='del'>-{</div><div class='del'>-        return xdr_serialize_generic (outmsg, (void *)rsp,</div><div class='del'>-                                      (xdrproc_t)xdr_gfs3_mknod_rsp);</div><div class='del'>-</div><div class='del'>-}</div><div class='del'>-ssize_t</div><div class='del'>-xdr_serialize_getxattr_rsp (struct iovec outmsg, void *rsp)</div><div class='del'>-{</div><div class='del'>-        return xdr_serialize_generic (outmsg, (void *)rsp,</div><div class='del'>-                                      (xdrproc_t)xdr_gfs3_getxattr_rsp);</div><div class='del'>-</div><div class='del'>-}</div><div class='del'>-ssize_t</div><div class='del'>-xdr_serialize_fgetxattr_rsp (struct iovec outmsg, void *rsp)</div><div class='del'>-{</div><div class='del'>-        return xdr_serialize_generic (outmsg, (void *)rsp,</div><div class='del'>-                                      (xdrproc_t)xdr_gfs3_fgetxattr_rsp);</div><div class='del'>-</div><div class='del'>-}</div><div class='del'>-ssize_t</div><div class='del'>-xdr_serialize_xattrop_rsp (struct iovec outmsg, void *rsp)</div><div class='del'>-{</div><div class='del'>-        return xdr_serialize_generic (outmsg, (void *)rsp,</div><div class='del'>-                                      (xdrproc_t)xdr_gfs3_xattrop_rsp);</div><div class='del'>-</div><div class='del'>-}</div><div class='del'>-ssize_t</div><div class='del'>-xdr_serialize_fxattrop_rsp (struct iovec outmsg, void *rsp)</div><div class='del'>-{</div><div class='del'>-        return xdr_serialize_generic (outmsg, (void *)rsp,</div><div class='del'>-                                      (xdrproc_t)xdr_gfs3_fxattrop_rsp);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_serialize_truncate_rsp (struct iovec outmsg, void *rsp)</div><div class='del'>-{</div><div class='del'>-        return xdr_serialize_generic (outmsg, (void *)rsp,</div><div class='del'>-                                      (xdrproc_t)xdr_gfs3_truncate_rsp);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_serialize_lk_rsp (struct iovec outmsg, void *rsp)</div><div class='del'>-{</div><div class='del'>-        return xdr_serialize_generic (outmsg, (void *)rsp,</div><div class='del'>-                                      (xdrproc_t)xdr_gfs3_lk_rsp);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_serialize_opendir_rsp (struct iovec outmsg, void *rsp)</div><div class='del'>-{</div><div class='del'>-        return xdr_serialize_generic (outmsg, (void *)rsp,</div><div class='del'>-                                      (xdrproc_t)xdr_gfs3_opendir_rsp);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_serialize_ftruncate_rsp (struct iovec outmsg, void *rsp)</div><div class='del'>-{</div><div class='del'>-        return xdr_serialize_generic (outmsg, (void *)rsp,</div><div class='del'>-                                      (xdrproc_t)xdr_gfs3_ftruncate_rsp);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_to_lookup_req (struct iovec inmsg, void *args)</div><div class='del'>-{</div><div class='del'>-        return xdr_to_generic (inmsg, (void *)args,</div><div class='del'>-                               (xdrproc_t)xdr_gfs3_lookup_req);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_to_getspec_req (struct iovec inmsg, void *args)</div><div class='del'>-{</div><div class='del'>-        return xdr_to_generic (inmsg, (void *)args,</div><div class='del'>-                                      (xdrproc_t)xdr_gf_getspec_req);</div><div class='del'>-</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_to_setvolume_req (struct iovec inmsg, void *args)</div><div class='del'>-{</div><div class='del'>-        return xdr_to_generic (inmsg, (void *)args,</div><div class='del'>-                                      (xdrproc_t)xdr_gf_setvolume_req);</div><div class='del'>-</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_to_statfs_req (struct iovec inmsg, void *args)</div><div class='del'>-{</div><div class='del'>-        return xdr_to_generic (inmsg, (void *)args,</div><div class='del'>-                               (xdrproc_t)xdr_gfs3_statfs_req);</div><div class='del'>-</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_to_fsync_req (struct iovec inmsg, void *args)</div><div class='del'>-{</div><div class='del'>-        return xdr_to_generic (inmsg, (void *)args,</div><div class='del'>-                               (xdrproc_t)xdr_gfs3_fsync_req);</div><div class='del'>-</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_to_flush_req (struct iovec inmsg, void *args)</div><div class='del'>-{</div><div class='del'>-        return xdr_to_generic (inmsg, (void *)args,</div><div class='del'>-                               (xdrproc_t)xdr_gfs3_flush_req);</div><div class='del'>-</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_to_xattrop_req (struct iovec inmsg, void *args)</div><div class='del'>-{</div><div class='del'>-        return xdr_to_generic (inmsg, (void *)args,</div><div class='del'>-                               (xdrproc_t)xdr_gfs3_xattrop_req);</div><div class='del'>-</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_to_fxattrop_req (struct iovec inmsg, void *args)</div><div class='del'>-{</div><div class='del'>-        return xdr_to_generic (inmsg, (void *)args,</div><div class='del'>-                               (xdrproc_t)xdr_gfs3_fxattrop_req);</div><div class='del'>-</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_to_getxattr_req (struct iovec inmsg, void *args)</div><div class='del'>-{</div><div class='del'>-        return xdr_to_generic (inmsg, (void *)args,</div><div class='del'>-                               (xdrproc_t)xdr_gfs3_getxattr_req);</div><div class='del'>-</div><div class='del'>-}</div><div class='del'>-ssize_t</div><div class='del'>-xdr_to_fgetxattr_req (struct iovec inmsg, void *args)</div><div class='del'>-{</div><div class='del'>-        return xdr_to_generic (inmsg, (void *)args,</div><div class='del'>-                               (xdrproc_t)xdr_gfs3_fgetxattr_req);</div><div class='del'>-</div><div class='del'>-}</div><div class='del'>-ssize_t</div><div class='del'>-xdr_to_open_req (struct iovec inmsg, void *args)</div><div class='del'>-{</div><div class='del'>-        return xdr_to_generic (inmsg, (void *)args,</div><div class='del'>-                               (xdrproc_t)xdr_gfs3_open_req);</div><div class='del'>-</div><div class='del'>-}</div><div class='del'>-ssize_t</div><div class='del'>-xdr_to_create_req (struct iovec inmsg, void *args)</div><div class='del'>-{</div><div class='del'>-        return xdr_to_generic (inmsg, (void *)args,</div><div class='del'>-                               (xdrproc_t)xdr_gfs3_create_req);</div><div class='del'>-</div><div class='del'>-}</div><div class='del'>-ssize_t</div><div class='del'>-xdr_to_symlink_req (struct iovec inmsg, void *args)</div><div class='del'>-{</div><div class='del'>-        return xdr_to_generic (inmsg, (void *)args,</div><div class='del'>-                               (xdrproc_t)xdr_gfs3_symlink_req);</div><div class='del'>-}</div><div class='del'>-ssize_t</div><div class='del'>-xdr_to_link_req (struct iovec inmsg, void *args)</div><div class='del'>-{</div><div class='del'>-        return xdr_to_generic (inmsg, (void *)args,</div><div class='del'>-                               (xdrproc_t)xdr_gfs3_link_req);</div><div class='del'>-}</div><div class='del'>-ssize_t</div><div class='del'>-xdr_to_readlink_req (struct iovec inmsg, void *args)</div><div class='del'>-{</div><div class='del'>-        return xdr_to_generic (inmsg, (void *)args,</div><div class='del'>-                               (xdrproc_t)xdr_gfs3_readlink_req);</div><div class='del'>-}</div><div class='del'>-ssize_t</div><div class='del'>-xdr_to_rename_req (struct iovec inmsg, void *args)</div><div class='del'>-{</div><div class='del'>-        return xdr_to_generic (inmsg, (void *)args,</div><div class='del'>-                               (xdrproc_t)xdr_gfs3_rename_req);</div><div class='del'>-}</div><div class='del'>-ssize_t</div><div class='del'>-xdr_to_mkdir_req (struct iovec inmsg, void *args)</div><div class='del'>-{</div><div class='del'>-        return xdr_to_generic (inmsg, (void *)args,</div><div class='del'>-                               (xdrproc_t)xdr_gfs3_mkdir_req);</div><div class='del'>-}</div><div class='del'>-ssize_t</div><div class='del'>-xdr_to_mknod_req (struct iovec inmsg, void *args)</div><div class='del'>-{</div><div class='del'>-        return xdr_to_generic (inmsg, (void *)args,</div><div class='del'>-                               (xdrproc_t)xdr_gfs3_mknod_req);</div><div class='del'>-}</div><div class='del'>-ssize_t</div><div class='del'>-xdr_to_readv_req (struct iovec inmsg, void *args)</div><div class='del'>-{</div><div class='del'>-        return xdr_to_generic (inmsg, (void *)args,</div><div class='del'>-                               (xdrproc_t)xdr_gfs3_read_req);</div><div class='del'>-}</div><div class='del'>-ssize_t</div><div class='del'>-xdr_to_writev_req (struct iovec inmsg, void *args)</div><div class='del'>-{</div><div class='del'>-        return xdr_to_generic (inmsg, (void *)args,</div><div class='del'>-                               (xdrproc_t)xdr_gfs3_write_req);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_to_readdir_req (struct iovec inmsg, void *args)</div><div class='del'>-{</div><div class='del'>-        return xdr_to_generic (inmsg, (void *)args,</div><div class='del'>-                               (xdrproc_t)xdr_gfs3_readdir_req);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_to_opendir_req (struct iovec inmsg, void *args)</div><div class='del'>-{</div><div class='del'>-        return xdr_to_generic (inmsg, (void *)args,</div><div class='del'>-                               (xdrproc_t)xdr_gfs3_opendir_req);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_to_rmdir_req (struct iovec inmsg, void *args)</div><div class='del'>-{</div><div class='del'>-        return xdr_to_generic (inmsg, (void *)args,</div><div class='del'>-                               (xdrproc_t)xdr_gfs3_rmdir_req);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_to_fsetxattr_req (struct iovec inmsg, void *args)</div><div class='del'>-{</div><div class='del'>-        return xdr_to_generic (inmsg, (void *)args,</div><div class='del'>-                               (xdrproc_t)xdr_gfs3_fsetxattr_req);</div><div class='del'>-}</div><div class='del'>-ssize_t</div><div class='del'>-xdr_to_setattr_req (struct iovec inmsg, void *args)</div><div class='del'>-{</div><div class='del'>-        return xdr_to_generic (inmsg, (void *)args,</div><div class='del'>-                               (xdrproc_t)xdr_gfs3_setattr_req);</div><div class='del'>-}</div><div class='del'>-ssize_t</div><div class='del'>-xdr_to_fsetattr_req (struct iovec inmsg, void *args)</div><div class='del'>-{</div><div class='del'>-        return xdr_to_generic (inmsg, (void *)args,</div><div class='del'>-                               (xdrproc_t)xdr_gfs3_fsetattr_req);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_to_finodelk_req (struct iovec inmsg, void *args)</div><div class='del'>-{</div><div class='del'>-        return xdr_to_generic (inmsg, (void *)args,</div><div class='del'>-                               (xdrproc_t)xdr_gfs3_finodelk_req);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_to_inodelk_req (struct iovec inmsg, void *args)</div><div class='del'>-{</div><div class='del'>-        return xdr_to_generic (inmsg, (void *)args,</div><div class='del'>-                               (xdrproc_t)xdr_gfs3_inodelk_req);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_to_ftruncate_req (struct iovec inmsg, void *args)</div><div class='del'>-{</div><div class='del'>-        return xdr_to_generic (inmsg, (void *)args,</div><div class='del'>-                               (xdrproc_t)xdr_gfs3_ftruncate_req);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_to_fsyncdir_req (struct iovec inmsg, void *args)</div><div class='del'>-{</div><div class='del'>-        return xdr_to_generic (inmsg, (void *)args,</div><div class='del'>-                               (xdrproc_t)xdr_gfs3_fsyncdir_req);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_to_fstat_req (struct iovec inmsg, void *args)</div><div class='del'>-{</div><div class='del'>-        return xdr_to_generic (inmsg, (void *)args,</div><div class='del'>-                               (xdrproc_t)xdr_gfs3_fstat_req);</div><div class='del'>-}</div><div class='del'>-ssize_t</div><div class='del'>-xdr_to_rchecksum_req (struct iovec inmsg, void *args)</div><div class='del'>-{</div><div class='del'>-        return xdr_to_generic (inmsg, (void *)args,</div><div class='del'>-                               (xdrproc_t)xdr_gfs3_rchecksum_req);</div><div class='del'>-}</div><div class='del'>-ssize_t</div><div class='del'>-xdr_to_removexattr_req (struct iovec inmsg, void *args)</div><div class='del'>-{</div><div class='del'>-        return xdr_to_generic (inmsg, (void *)args,</div><div class='del'>-                               (xdrproc_t)xdr_gfs3_removexattr_req);</div><div class='del'>-}</div><div class='del'>-ssize_t</div><div class='del'>-xdr_to_setxattr_req (struct iovec inmsg, void *args)</div><div class='del'>-{</div><div class='del'>-        return xdr_to_generic (inmsg, (void *)args,</div><div class='del'>-                               (xdrproc_t)xdr_gfs3_setxattr_req);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_to_fentrylk_req (struct iovec inmsg, void *args)</div><div class='del'>-{</div><div class='del'>-        return xdr_to_generic (inmsg, (void *)args,</div><div class='del'>-                               (xdrproc_t)xdr_gfs3_fentrylk_req);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_to_entrylk_req (struct iovec inmsg, void *args)</div><div class='del'>-{</div><div class='del'>-        return xdr_to_generic (inmsg, (void *)args,</div><div class='del'>-                               (xdrproc_t)xdr_gfs3_entrylk_req);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_to_lk_req (struct iovec inmsg, void *args)</div><div class='del'>-{</div><div class='del'>-        return xdr_to_generic (inmsg, (void *)args,</div><div class='del'>-                               (xdrproc_t)xdr_gfs3_lk_req);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_to_stat_req (struct iovec inmsg, void *args)</div><div class='del'>-{</div><div class='del'>-        return xdr_to_generic (inmsg, (void *)args,</div><div class='del'>-                               (xdrproc_t)xdr_gfs3_stat_req);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_to_release_req (struct iovec inmsg, void *args)</div><div class='del'>-{</div><div class='del'>-        return xdr_to_generic (inmsg, (void *)args,</div><div class='del'>-                               (xdrproc_t)xdr_gfs3_release_req);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_to_readdirp_req (struct iovec inmsg, void *args)</div><div class='del'>-{</div><div class='del'>-        return xdr_to_generic (inmsg, (void *)args,</div><div class='del'>-                               (xdrproc_t)xdr_gfs3_readdirp_req);</div><div class='del'>-}</div><div class='del'>-ssize_t</div><div class='del'>-xdr_to_truncate_req (struct iovec inmsg, void *args)</div><div class='del'>-{</div><div class='del'>-        return xdr_to_generic (inmsg, (void *)args,</div><div class='del'>-                               (xdrproc_t)xdr_gfs3_truncate_req);</div><div class='del'>-}</div><div class='del'>-ssize_t</div><div class='del'>-xdr_to_access_req (struct iovec inmsg, void *args)</div><div class='del'>-{</div><div class='del'>-        return xdr_to_generic (inmsg, (void *)args,</div><div class='del'>-                               (xdrproc_t)xdr_gfs3_access_req);</div><div class='del'>-}</div><div class='del'>-ssize_t</div><div class='del'>-xdr_to_unlink_req (struct iovec inmsg, void *args)</div><div class='del'>-{</div><div class='del'>-        return xdr_to_generic (inmsg, (void *)args,</div><div class='del'>-                               (xdrproc_t)xdr_gfs3_unlink_req);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_from_lookup_req (struct iovec outmsg, void *req)</div><div class='del'>-{</div><div class='del'>-        return xdr_serialize_generic (outmsg, (void *)req,</div><div class='del'>-                                      (xdrproc_t)xdr_gfs3_lookup_req);</div><div class='del'>-</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_from_stat_req (struct iovec outmsg, void *req)</div><div class='del'>-{</div><div class='del'>-        return xdr_serialize_generic (outmsg, (void *)req,</div><div class='del'>-                                      (xdrproc_t)xdr_gfs3_stat_req);</div><div class='del'>-</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_from_fstat_req (struct iovec outmsg, void *req)</div><div class='del'>-{</div><div class='del'>-        return xdr_serialize_generic (outmsg, (void *)req,</div><div class='del'>-                                      (xdrproc_t)xdr_gfs3_fstat_req);</div><div class='del'>-</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_from_mkdir_req (struct iovec outmsg, void *req)</div><div class='del'>-{</div><div class='del'>-        return xdr_serialize_generic (outmsg, (void *)req,</div><div class='del'>-                                      (xdrproc_t)xdr_gfs3_mkdir_req);</div><div class='del'>-</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_from_mknod_req (struct iovec outmsg, void *req)</div><div class='del'>-{</div><div class='del'>-        return xdr_serialize_generic (outmsg, (void *)req,</div><div class='del'>-                                      (xdrproc_t)xdr_gfs3_mknod_req);</div><div class='del'>-</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_from_symlink_req (struct iovec outmsg, void *req)</div><div class='del'>-{</div><div class='del'>-        return xdr_serialize_generic (outmsg, (void *)req,</div><div class='del'>-                                      (xdrproc_t)xdr_gfs3_symlink_req);</div><div class='del'>-</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_from_readlink_req (struct iovec outmsg, void *req)</div><div class='del'>-{</div><div class='del'>-        return xdr_serialize_generic (outmsg, (void *)req,</div><div class='del'>-                                      (xdrproc_t)xdr_gfs3_readlink_req);</div><div class='del'>-</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_from_rename_req (struct iovec outmsg, void *req)</div><div class='del'>-{</div><div class='del'>-        return xdr_serialize_generic (outmsg, (void *)req,</div><div class='del'>-                                      (xdrproc_t)xdr_gfs3_rename_req);</div><div class='del'>-</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_from_link_req (struct iovec outmsg, void *req)</div><div class='del'>-{</div><div class='del'>-        return xdr_serialize_generic (outmsg, (void *)req,</div><div class='del'>-                                      (xdrproc_t)xdr_gfs3_link_req);</div><div class='del'>-</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_from_create_req (struct iovec outmsg, void *req)</div><div class='del'>-{</div><div class='del'>-        return xdr_serialize_generic (outmsg, (void *)req,</div><div class='del'>-                                      (xdrproc_t)xdr_gfs3_create_req);</div><div class='del'>-</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_from_open_req (struct iovec outmsg, void *req)</div><div class='del'>-{</div><div class='del'>-        return xdr_serialize_generic (outmsg, (void *)req,</div><div class='del'>-                                      (xdrproc_t)xdr_gfs3_open_req);</div><div class='del'>-</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_from_opendir_req (struct iovec outmsg, void *req)</div><div class='del'>-{</div><div class='del'>-        return xdr_serialize_generic (outmsg, (void *)req,</div><div class='del'>-                                      (xdrproc_t)xdr_gfs3_opendir_req);</div><div class='del'>-</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_from_readdir_req (struct iovec outmsg, void *req)</div><div class='del'>-{</div><div class='del'>-        return xdr_serialize_generic (outmsg, (void *)req,</div><div class='del'>-                                      (xdrproc_t)xdr_gfs3_readdir_req);</div><div class='del'>-</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_from_readdirp_req (struct iovec outmsg, void *req)</div><div class='del'>-{</div><div class='del'>-        return xdr_serialize_generic (outmsg, (void *)req,</div><div class='del'>-                                      (xdrproc_t)xdr_gfs3_readdirp_req);</div><div class='del'>-</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_from_fsyncdir_req (struct iovec outmsg, void *req)</div><div class='del'>-{</div><div class='del'>-        return xdr_serialize_generic (outmsg, (void *)req,</div><div class='del'>-                                      (xdrproc_t)xdr_gfs3_fsyncdir_req);</div><div class='del'>-</div><div class='del'>-}</div><div class='del'>-ssize_t</div><div class='del'>-xdr_from_releasedir_req (struct iovec outmsg, void *req)</div><div class='del'>-{</div><div class='del'>-        return xdr_serialize_generic (outmsg, (void *)req,</div><div class='del'>-                                      (xdrproc_t)xdr_gfs3_releasedir_req);</div><div class='del'>-</div><div class='del'>-}</div><div class='del'>-ssize_t</div><div class='del'>-xdr_from_release_req (struct iovec outmsg, void *req)</div><div class='del'>-{</div><div class='del'>-        return xdr_serialize_generic (outmsg, (void *)req,</div><div class='del'>-                                      (xdrproc_t)xdr_gfs3_release_req);</div><div class='del'>-</div><div class='del'>-}</div><div class='del'>-ssize_t</div><div class='del'>-xdr_from_lk_req (struct iovec outmsg, void *req)</div><div class='del'>-{</div><div class='del'>-        return xdr_serialize_generic (outmsg, (void *)req,</div><div class='del'>-                                      (xdrproc_t)xdr_gfs3_lk_req);</div><div class='del'>-</div><div class='del'>-}</div><div class='del'>-ssize_t</div><div class='del'>-xdr_from_entrylk_req (struct iovec outmsg, void *req)</div><div class='del'>-{</div><div class='del'>-        return xdr_serialize_generic (outmsg, (void *)req,</div><div class='del'>-                                      (xdrproc_t)xdr_gfs3_entrylk_req);</div><div class='del'>-</div><div class='del'>-}</div><div class='del'>-ssize_t</div><div class='del'>-xdr_from_fentrylk_req (struct iovec outmsg, void *req)</div><div class='del'>-{</div><div class='del'>-        return xdr_serialize_generic (outmsg, (void *)req,</div><div class='del'>-                                      (xdrproc_t)xdr_gfs3_fentrylk_req);</div><div class='del'>-</div><div class='del'>-}</div><div class='del'>-ssize_t</div><div class='del'>-xdr_from_inodelk_req (struct iovec outmsg, void *req)</div><div class='del'>-{</div><div class='del'>-        return xdr_serialize_generic (outmsg, (void *)req,</div><div class='del'>-                                      (xdrproc_t)xdr_gfs3_inodelk_req);</div><div class='del'>-</div><div class='del'>-}</div><div class='del'>-ssize_t</div><div class='del'>-xdr_from_finodelk_req (struct iovec outmsg, void *req)</div><div class='del'>-{</div><div class='del'>-        return xdr_serialize_generic (outmsg, (void *)req,</div><div class='del'>-                                      (xdrproc_t)xdr_gfs3_finodelk_req);</div><div class='del'>-</div><div class='del'>-}</div><div class='del'>-ssize_t</div><div class='del'>-xdr_from_setxattr_req (struct iovec outmsg, void *req)</div><div class='del'>-{</div><div class='del'>-        return xdr_serialize_generic (outmsg, (void *)req,</div><div class='del'>-                                      (xdrproc_t)xdr_gfs3_setxattr_req);</div><div class='del'>-</div><div class='del'>-}</div><div class='del'>-ssize_t</div><div class='del'>-xdr_from_fsetxattr_req (struct iovec outmsg, void *req)</div><div class='del'>-{</div><div class='del'>-        return xdr_serialize_generic (outmsg, (void *)req,</div><div class='del'>-                                      (xdrproc_t)xdr_gfs3_fsetxattr_req);</div><div class='del'>-</div><div class='del'>-}</div><div class='del'>-ssize_t</div><div class='del'>-xdr_from_getxattr_req (struct iovec outmsg, void *req)</div><div class='del'>-{</div><div class='del'>-        return xdr_serialize_generic (outmsg, (void *)req,</div><div class='del'>-                                      (xdrproc_t)xdr_gfs3_getxattr_req);</div><div class='del'>-</div><div class='del'>-}</div><div class='del'>-ssize_t</div><div class='del'>-xdr_from_fgetxattr_req (struct iovec outmsg, void *req)</div><div class='del'>-{</div><div class='del'>-        return xdr_serialize_generic (outmsg, (void *)req,</div><div class='del'>-                                      (xdrproc_t)xdr_gfs3_fgetxattr_req);</div><div class='del'>-</div><div class='del'>-}</div><div class='del'>-ssize_t</div><div class='del'>-xdr_from_removexattr_req (struct iovec outmsg, void *req)</div><div class='del'>-{</div><div class='del'>-        return xdr_serialize_generic (outmsg, (void *)req,</div><div class='del'>-                                      (xdrproc_t)xdr_gfs3_removexattr_req);</div><div class='del'>-</div><div class='del'>-}</div><div class='del'>-ssize_t</div><div class='del'>-xdr_from_xattrop_req (struct iovec outmsg, void *req)</div><div class='del'>-{</div><div class='del'>-        return xdr_serialize_generic (outmsg, (void *)req,</div><div class='del'>-                                      (xdrproc_t)xdr_gfs3_xattrop_req);</div><div class='del'>-</div><div class='del'>-}</div><div class='del'>-ssize_t</div><div class='del'>-xdr_from_fxattrop_req (struct iovec outmsg, void *req)</div><div class='del'>-{</div><div class='del'>-        return xdr_serialize_generic (outmsg, (void *)req,</div><div class='del'>-                                      (xdrproc_t)xdr_gfs3_fxattrop_req);</div><div class='del'>-</div><div class='del'>-}</div><div class='del'>-ssize_t</div><div class='del'>-xdr_from_access_req (struct iovec outmsg, void *req)</div><div class='del'>-{</div><div class='del'>-        return xdr_serialize_generic (outmsg, (void *)req,</div><div class='del'>-                                      (xdrproc_t)xdr_gfs3_access_req);</div><div class='del'>-</div><div class='del'>-}</div><div class='del'>-ssize_t</div><div class='del'>-xdr_from_setattr_req (struct iovec outmsg, void *req)</div><div class='del'>-{</div><div class='del'>-        return xdr_serialize_generic (outmsg, (void *)req,</div><div class='del'>-                                      (xdrproc_t)xdr_gfs3_setattr_req);</div><div class='del'>-</div><div class='del'>-}</div><div class='del'>-ssize_t</div><div class='del'>-xdr_from_truncate_req (struct iovec outmsg, void *req)</div><div class='del'>-{</div><div class='del'>-        return xdr_serialize_generic (outmsg, (void *)req,</div><div class='del'>-                                      (xdrproc_t)xdr_gfs3_truncate_req);</div><div class='del'>-</div><div class='del'>-}</div><div class='del'>-ssize_t</div><div class='del'>-xdr_from_ftruncate_req (struct iovec outmsg, void *req)</div><div class='del'>-{</div><div class='del'>-        return xdr_serialize_generic (outmsg, (void *)req,</div><div class='del'>-                                      (xdrproc_t)xdr_gfs3_ftruncate_req);</div><div class='del'>-</div><div class='del'>-}</div><div class='del'>-ssize_t</div><div class='del'>-xdr_from_fsetattr_req (struct iovec outmsg, void *req)</div><div class='del'>-{</div><div class='del'>-        return xdr_serialize_generic (outmsg, (void *)req,</div><div class='del'>-                                      (xdrproc_t)xdr_gfs3_fsetattr_req);</div><div class='del'>-</div><div class='del'>-}</div><div class='del'>-ssize_t</div><div class='del'>-xdr_from_readv_req (struct iovec outmsg, void *req)</div><div class='del'>-{</div><div class='del'>-        return xdr_serialize_generic (outmsg, (void *)req,</div><div class='del'>-                                      (xdrproc_t)xdr_gfs3_read_req);</div><div class='del'>-</div><div class='del'>-}</div><div class='del'>-ssize_t</div><div class='del'>-xdr_from_writev_req (struct iovec outmsg, void *req)</div><div class='del'>-{</div><div class='del'>-        return xdr_serialize_generic (outmsg, (void *)req,</div><div class='del'>-                                      (xdrproc_t)xdr_gfs3_write_req);</div><div class='del'>-</div><div class='del'>-}</div><div class='del'>-ssize_t</div><div class='del'>-xdr_from_fsync_req (struct iovec outmsg, void *req)</div><div class='del'>-{</div><div class='del'>-        return xdr_serialize_generic (outmsg, (void *)req,</div><div class='del'>-                                      (xdrproc_t)xdr_gfs3_fsync_req);</div><div class='del'>-</div><div class='del'>-}</div><div class='del'>-ssize_t</div><div class='del'>-xdr_from_flush_req (struct iovec outmsg, void *req)</div><div class='del'>-{</div><div class='del'>-        return xdr_serialize_generic (outmsg, (void *)req,</div><div class='del'>-                                      (xdrproc_t)xdr_gfs3_flush_req);</div><div class='del'>-</div><div class='del'>-}</div><div class='del'>-ssize_t</div><div class='del'>-xdr_from_statfs_req (struct iovec outmsg, void *req)</div><div class='del'>-{</div><div class='del'>-        return xdr_serialize_generic (outmsg, (void *)req,</div><div class='del'>-                                      (xdrproc_t)xdr_gfs3_statfs_req);</div><div class='del'>-</div><div class='del'>-}</div><div class='del'>-ssize_t</div><div class='del'>-xdr_from_rchecksum_req (struct iovec outmsg, void *req)</div><div class='del'>-{</div><div class='del'>-        return xdr_serialize_generic (outmsg, (void *)req,</div><div class='del'>-                                      (xdrproc_t)xdr_gfs3_rchecksum_req);</div><div class='del'>-</div><div class='del'>-}</div><div class='del'>-ssize_t</div><div class='del'>-xdr_from_getspec_req (struct iovec outmsg, void *req)</div><div class='del'>-{</div><div class='del'>-        return xdr_serialize_generic (outmsg, (void *)req,</div><div class='del'>-                                      (xdrproc_t)xdr_gf_getspec_req);</div><div class='del'>-</div><div class='del'>-}</div><div class='del'>-ssize_t</div><div class='del'>-xdr_from_setvolume_req (struct iovec outmsg, void *req)</div><div class='del'>-{</div><div class='del'>-        return xdr_serialize_generic (outmsg, (void *)req,</div><div class='del'>-                                      (xdrproc_t)xdr_gf_setvolume_req);</div><div class='del'>-</div><div class='del'>-}</div><div class='del'>-ssize_t</div><div class='del'>-xdr_from_rmdir_req (struct iovec outmsg, void *req)</div><div class='del'>-{</div><div class='del'>-        return xdr_serialize_generic (outmsg, (void *)req,</div><div class='del'>-                                      (xdrproc_t)xdr_gfs3_rmdir_req);</div><div class='del'>-</div><div class='del'>-}</div><div class='del'>-ssize_t</div><div class='del'>-xdr_from_unlink_req (struct iovec outmsg, void *req)</div><div class='del'>-{</div><div class='del'>-        return xdr_serialize_generic (outmsg, (void *)req,</div><div class='del'>-                                      (xdrproc_t)xdr_gfs3_unlink_req);</div><div class='del'>-</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-/* Client decode */</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_to_lookup_rsp (struct iovec outmsg, void *rsp)</div><div class='del'>-{</div><div class='del'>-        return xdr_to_generic (outmsg, (void *)rsp,</div><div class='del'>-                                      (xdrproc_t)xdr_gfs3_lookup_rsp);</div><div class='del'>-</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_to_stat_rsp (struct iovec outmsg, void *rsp)</div><div class='del'>-{</div><div class='del'>-        return xdr_to_generic (outmsg, (void *)rsp,</div><div class='del'>-                                      (xdrproc_t)xdr_gfs3_stat_rsp);</div><div class='del'>-</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_to_fstat_rsp (struct iovec outmsg, void *rsp)</div><div class='del'>-{</div><div class='del'>-        return xdr_to_generic (outmsg, (void *)rsp,</div><div class='del'>-                                      (xdrproc_t)xdr_gfs3_fstat_rsp);</div><div class='del'>-</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_to_mkdir_rsp (struct iovec outmsg, void *rsp)</div><div class='del'>-{</div><div class='del'>-        return xdr_to_generic (outmsg, (void *)rsp,</div><div class='del'>-                                      (xdrproc_t)xdr_gfs3_mkdir_rsp);</div><div class='del'>-</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_to_mknod_rsp (struct iovec outmsg, void *rsp)</div><div class='del'>-{</div><div class='del'>-        return xdr_to_generic (outmsg, (void *)rsp,</div><div class='del'>-                                      (xdrproc_t)xdr_gfs3_mknod_rsp);</div><div class='del'>-</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_to_symlink_rsp (struct iovec outmsg, void *rsp)</div><div class='del'>-{</div><div class='del'>-        return xdr_to_generic (outmsg, (void *)rsp,</div><div class='del'>-                                      (xdrproc_t)xdr_gfs3_symlink_rsp);</div><div class='del'>-</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_to_readlink_rsp (struct iovec outmsg, void *rsp)</div><div class='del'>-{</div><div class='del'>-        return xdr_to_generic (outmsg, (void *)rsp,</div><div class='del'>-                                      (xdrproc_t)xdr_gfs3_readlink_rsp);</div><div class='del'>-</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_to_rename_rsp (struct iovec outmsg, void *rsp)</div><div class='del'>-{</div><div class='del'>-        return xdr_to_generic (outmsg, (void *)rsp,</div><div class='del'>-                                      (xdrproc_t)xdr_gfs3_rename_rsp);</div><div class='del'>-</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_to_link_rsp (struct iovec outmsg, void *rsp)</div><div class='del'>-{</div><div class='del'>-        return xdr_to_generic (outmsg, (void *)rsp,</div><div class='del'>-                                      (xdrproc_t)xdr_gfs3_link_rsp);</div><div class='del'>-</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_to_create_rsp (struct iovec outmsg, void *rsp)</div><div class='del'>-{</div><div class='del'>-        return xdr_to_generic (outmsg, (void *)rsp,</div><div class='del'>-                                      (xdrproc_t)xdr_gfs3_create_rsp);</div><div class='del'>-</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_to_open_rsp (struct iovec outmsg, void *rsp)</div><div class='del'>-{</div><div class='del'>-        return xdr_to_generic (outmsg, (void *)rsp,</div><div class='del'>-                                      (xdrproc_t)xdr_gfs3_open_rsp);</div><div class='del'>-</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_to_opendir_rsp (struct iovec outmsg, void *rsp)</div><div class='del'>-{</div><div class='del'>-        return xdr_to_generic (outmsg, (void *)rsp,</div><div class='del'>-                                      (xdrproc_t)xdr_gfs3_opendir_rsp);</div><div class='del'>-</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_to_readdir_rsp (struct iovec outmsg, void *rsp)</div><div class='del'>-{</div><div class='del'>-        return xdr_to_generic (outmsg, (void *)rsp,</div><div class='del'>-                                      (xdrproc_t)xdr_gfs3_readdir_rsp);</div><div class='del'>-</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_to_readdirp_rsp (struct iovec outmsg, void *rsp)</div><div class='del'>-{</div><div class='del'>-        return xdr_to_generic (outmsg, (void *)rsp,</div><div class='del'>-                                      (xdrproc_t)xdr_gfs3_readdirp_rsp);</div><div class='del'>-</div><div class='del'>-}</div><div class='del'>-ssize_t</div><div class='del'>-xdr_to_lk_rsp (struct iovec outmsg, void *rsp)</div><div class='del'>-{</div><div class='del'>-        return xdr_to_generic (outmsg, (void *)rsp,</div><div class='del'>-                                      (xdrproc_t)xdr_gfs3_lk_rsp);</div><div class='del'>-</div><div class='del'>-}</div><div class='del'>-ssize_t</div><div class='del'>-xdr_to_getxattr_rsp (struct iovec outmsg, void *rsp)</div><div class='del'>-{</div><div class='del'>-        return xdr_to_generic (outmsg, (void *)rsp,</div><div class='del'>-                                      (xdrproc_t)xdr_gfs3_getxattr_rsp);</div><div class='del'>-</div><div class='del'>-}</div><div class='del'>-ssize_t</div><div class='del'>-xdr_to_fgetxattr_rsp (struct iovec outmsg, void *rsp)</div><div class='del'>-{</div><div class='del'>-        return xdr_to_generic (outmsg, (void *)rsp,</div><div class='del'>-                                      (xdrproc_t)xdr_gfs3_fgetxattr_rsp);</div><div class='del'>-</div><div class='del'>-}</div><div class='del'>-ssize_t</div><div class='del'>-xdr_to_xattrop_rsp (struct iovec outmsg, void *rsp)</div><div class='del'>-{</div><div class='del'>-        return xdr_to_generic (outmsg, (void *)rsp,</div><div class='del'>-                                      (xdrproc_t)xdr_gfs3_xattrop_rsp);</div><div class='del'>-</div><div class='del'>-}</div><div class='del'>-ssize_t</div><div class='del'>-xdr_to_fxattrop_rsp (struct iovec outmsg, void *rsp)</div><div class='del'>-{</div><div class='del'>-        return xdr_to_generic (outmsg, (void *)rsp,</div><div class='del'>-                                      (xdrproc_t)xdr_gfs3_fxattrop_rsp);</div><div class='del'>-</div><div class='del'>-}</div><div class='del'>-ssize_t</div><div class='del'>-xdr_to_setattr_rsp (struct iovec outmsg, void *rsp)</div><div class='del'>-{</div><div class='del'>-        return xdr_to_generic (outmsg, (void *)rsp,</div><div class='del'>-                                      (xdrproc_t)xdr_gfs3_setattr_rsp);</div><div class='del'>-</div><div class='del'>-}</div><div class='del'>-ssize_t</div><div class='del'>-xdr_to_truncate_rsp (struct iovec outmsg, void *rsp)</div><div class='del'>-{</div><div class='del'>-        return xdr_to_generic (outmsg, (void *)rsp,</div><div class='del'>-                                      (xdrproc_t)xdr_gfs3_truncate_rsp);</div><div class='del'>-</div><div class='del'>-}</div><div class='del'>-ssize_t</div><div class='del'>-xdr_to_ftruncate_rsp (struct iovec outmsg, void *rsp)</div><div class='del'>-{</div><div class='del'>-        return xdr_to_generic (outmsg, (void *)rsp,</div><div class='del'>-                                      (xdrproc_t)xdr_gfs3_ftruncate_rsp);</div><div class='del'>-</div><div class='del'>-}</div><div class='del'>-ssize_t</div><div class='del'>-xdr_to_fsetattr_rsp (struct iovec outmsg, void *rsp)</div><div class='del'>-{</div><div class='del'>-        return xdr_to_generic (outmsg, (void *)rsp,</div><div class='del'>-                                      (xdrproc_t)xdr_gfs3_fsetattr_rsp);</div><div class='del'>-</div><div class='del'>-}</div><div class='del'>-ssize_t</div><div class='del'>-xdr_to_readv_rsp (struct iovec outmsg, void *rsp)</div><div class='del'>-{</div><div class='del'>-        return xdr_to_generic (outmsg, (void *)rsp,</div><div class='del'>-                                      (xdrproc_t)xdr_gfs3_read_rsp);</div><div class='del'>-</div><div class='del'>-}</div><div class='del'>-ssize_t</div><div class='del'>-xdr_to_writev_rsp (struct iovec outmsg, void *rsp)</div><div class='del'>-{</div><div class='del'>-        return xdr_to_generic (outmsg, (void *)rsp,</div><div class='del'>-                                      (xdrproc_t)xdr_gfs3_write_rsp);</div><div class='del'>-</div><div class='del'>-}</div><div class='del'>-ssize_t</div><div class='del'>-xdr_to_fsync_rsp (struct iovec outmsg, void *rsp)</div><div class='del'>-{</div><div class='del'>-        return xdr_to_generic (outmsg, (void *)rsp,</div><div class='del'>-                                      (xdrproc_t)xdr_gfs3_fsync_rsp);</div><div class='del'>-</div><div class='del'>-}</div><div class='del'>-ssize_t</div><div class='del'>-xdr_to_statfs_rsp (struct iovec outmsg, void *rsp)</div><div class='del'>-{</div><div class='del'>-        return xdr_to_generic (outmsg, (void *)rsp,</div><div class='del'>-                                      (xdrproc_t)xdr_gfs3_statfs_rsp);</div><div class='del'>-</div><div class='del'>-}</div><div class='del'>-ssize_t</div><div class='del'>-xdr_to_rchecksum_rsp (struct iovec outmsg, void *rsp)</div><div class='del'>-{</div><div class='del'>-        return xdr_to_generic (outmsg, (void *)rsp,</div><div class='del'>-                                      (xdrproc_t)xdr_gfs3_rchecksum_rsp);</div><div class='del'>-</div><div class='del'>-}</div><div class='del'>-ssize_t</div><div class='del'>-xdr_to_getspec_rsp (struct iovec outmsg, void *rsp)</div><div class='del'>-{</div><div class='del'>-        return xdr_to_generic (outmsg, (void *)rsp,</div><div class='del'>-                                      (xdrproc_t)xdr_gf_getspec_rsp);</div><div class='del'>-</div><div class='del'>-}</div><div class='del'>-ssize_t</div><div class='del'>-xdr_to_setvolume_rsp (struct iovec outmsg, void *rsp)</div><div class='del'>-{</div><div class='del'>-        return xdr_to_generic (outmsg, (void *)rsp,</div><div class='del'>-                                      (xdrproc_t)xdr_gf_setvolume_rsp);</div><div class='del'>-</div><div class='del'>-}</div><div class='del'>-ssize_t</div><div class='del'>-xdr_to_rmdir_rsp (struct iovec outmsg, void *rsp)</div><div class='del'>-{</div><div class='del'>-        return xdr_to_generic (outmsg, (void *)rsp,</div><div class='del'>-                               (xdrproc_t)xdr_gfs3_rmdir_rsp);</div><div class='del'>-</div><div class='del'>-}</div><div class='del'>-ssize_t</div><div class='del'>-xdr_to_unlink_rsp (struct iovec outmsg, void *rsp)</div><div class='del'>-{</div><div class='del'>-        return xdr_to_generic (outmsg, (void *)rsp,</div><div class='del'>-                               (xdrproc_t)xdr_gfs3_unlink_rsp);</div><div class='del'>-</div><div class='del'>-}</div><div class='del'>-ssize_t</div><div class='del'>-xdr_to_common_rsp (struct iovec outmsg, void *rsp)</div><div class='del'>-{</div><div class='del'>-        return xdr_to_generic (outmsg, (void *)rsp,</div><div class='del'>-                               (xdrproc_t)xdr_gf_common_rsp);</div><div class='del'>-</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_to_mgmt_probe_query_req (struct iovec outmsg, void *req)</div><div class='del'>-{</div><div class='del'>-</div><div class='del'>-        return xdr_serialize_generic (outmsg, (void *)req,</div><div class='del'>-                                      (xdrproc_t)xdr_gfs3_setattr_req);</div><div class='del'>-}</div><div class='head'>diff --git a/rpc/xdr/src/glusterfs3.h b/rpc/xdr/src/glusterfs3.h<br/>index 363eca246cb..86b3a4c0e5d 100644<br/>--- a/<a href='/cgit/glusterfs.git/tree/rpc/xdr/src/glusterfs3.h?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>rpc/xdr/src/glusterfs3.h</a><br/>+++ b/<a href='/cgit/glusterfs.git/tree/rpc/xdr/src/glusterfs3.h?id=d1d7a6f35c816822fab51c820e25023863c239c1'>rpc/xdr/src/glusterfs3.h</a></div><div class='hunk'>@@ -1,516 +1,957 @@</div><div class='ctx'> /*</div><div class='del'>-  Copyright (c) 2007-2010 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='add'>+  Copyright (c) 2007-2012 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='ctx'>   This file is part of GlusterFS.</div><div class='ctx'> </div><div class='del'>-  GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-  it under the terms of the GNU Affero General Public License as published</div><div class='del'>-  by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-  or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-  GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-  WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-  Affero General Public License for more details.</div><div class='del'>-</div><div class='del'>-  You should have received a copy of the GNU Affero General Public License</div><div class='del'>-  along with this program.  If not, see</div><div class='del'>-  &lt;http://www.gnu.org/licenses/&gt;.</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='ctx'> */</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> #ifndef _GLUSTERFS3_H</div><div class='ctx'> #define _GLUSTERFS3_H</div><div class='ctx'> </div><div class='ctx'> #include &lt;sys/uio.h&gt;</div><div class='ctx'> </div><div class='add'>+#include "xdr-generic.h"</div><div class='ctx'> #include "glusterfs3-xdr.h"</div><div class='del'>-</div><div class='del'>-#define xdr_decoded_remaining_addr(xdr)        ((&amp;xdr)-&gt;x_private)</div><div class='del'>-#define xdr_decoded_remaining_len(xdr)         ((&amp;xdr)-&gt;x_handy)</div><div class='del'>-#define xdr_encoded_length(xdr) (((size_t)(&amp;xdr)-&gt;x_private) - ((size_t)(&amp;xdr)-&gt;x_base))</div><div class='del'>-#define xdr_decoded_length(xdr) (((size_t)(&amp;xdr)-&gt;x_private) - ((size_t)(&amp;xdr)-&gt;x_base))</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-/* FOPS */</div><div class='del'>-ssize_t</div><div class='del'>-xdr_serialize_lookup_rsp (struct iovec outmsg, void *resp);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_serialize_getspec_rsp (struct iovec outmsg, void *rsp);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_serialize_common_rsp (struct iovec outmsg, void *rsp);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_serialize_setvolume_rsp (struct iovec outmsg, void *rsp);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_serialize_open_rsp (struct iovec outmsg, void *rsp);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_serialize_create_rsp (struct iovec outmsg, void *rsp);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_serialize_mknod_rsp (struct iovec outmsg, void *rsp);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_serialize_mkdir_rsp (struct iovec outmsg, void *rsp);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_serialize_symlink_rsp (struct iovec outmsg, void *rsp);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_serialize_link_rsp (struct iovec outmsg, void *rsp);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_serialize_rename_rsp (struct iovec outmsg, void *rsp);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_serialize_writev_rsp (struct iovec outmsg, void *rsp);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_serialize_readv_rsp (struct iovec outmsg, void *rsp);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_serialize_readdir_rsp (struct iovec outmsg, void *rsp);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_serialize_readdirp_rsp (struct iovec outmsg, void *rsp);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_serialize_opendir_rsp (struct iovec outmsg, void *rsp);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_serialize_setattr_rsp (struct iovec outmsg, void *rsp);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_serialize_fsetattr_rsp (struct iovec outmsg, void *rsp);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_serialize_truncate_rsp (struct iovec outmsg, void *rsp);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_serialize_ftruncate_rsp (struct iovec outmsg, void *rsp);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_serialize_statfs_rsp (struct iovec outmsg, void *rsp);</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_serialize_lk_rsp (struct iovec outmsg, void *rsp);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_serialize_xattrop_rsp (struct iovec outmsg, void *rsp);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_serialize_fxattrop_rsp (struct iovec outmsg, void *rsp);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_serialize_getxattr_rsp (struct iovec outmsg, void *rsp);</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_serialize_fgetxattr_rsp (struct iovec outmsg, void *rsp);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_serialize_unlink_rsp (struct iovec outmsg, void *rsp);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_serialize_rmdir_rsp (struct iovec outmsg, void *rsp);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_serialize_rchecksum_rsp (struct iovec outmsg, void *rsp);</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_serialize_fstat_rsp (struct iovec outmsg, void *rsp);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_serialize_fsync_rsp (struct iovec outmsg, void *rsp);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_serialize_readlink_rsp (struct iovec outmsg, void *rsp);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_serialize_stat_rsp (struct iovec outmsg, void *rsp);</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_to_lookup_req (struct iovec inmsg, void *args);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_to_getspec_req (struct iovec inmsg, void *args);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_to_setvolume_req (struct iovec inmsg, void *args);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_to_statfs_req (struct iovec inmsg, void *args);</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_to_stat_req (struct iovec inmsg, void *args);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_to_getattr_req (struct iovec inmsg, void *args);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_to_fstat_req (struct iovec inmsg, void *args);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_to_setattr_req (struct iovec inmsg, void *args);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_to_fsetattr_req (struct iovec inmsg, void *args);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_to_readv_req (struct iovec inmsg, void *args);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_to_writev_req (struct iovec inmsg, void *args);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_to_fsetattr_req (struct iovec inmsg, void *args);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_to_readlink_req (struct iovec inmsg, void *args);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_to_create_req (struct iovec inmsg, void *args);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_to_open_req (struct iovec inmsg, void *args);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_to_release_req (struct iovec inmsg, void *args);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_to_xattrop_req (struct iovec inmsg, void *args);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_to_fxattrop_req (struct iovec inmsg, void *args);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_to_setxattr_req (struct iovec inmsg, void *args);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_to_fsetxattr_req (struct iovec inmsg, void *args);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_to_flush_req (struct iovec inmsg, void *args);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_to_unlink_req (struct iovec inmsg, void *args);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_to_fsync_req (struct iovec inmsg, void *args);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_to_ftruncate_req (struct iovec inmsg, void *args);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_to_truncate_req (struct iovec inmsg, void *args);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_to_getxattr_req (struct iovec inmsg, void *args);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_to_fgetxattr_req (struct iovec inmsg, void *args);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_to_removexattr_req (struct iovec inmsg, void *args);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_to_entrylk_req (struct iovec inmsg, void *args);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_to_fentrylk_req (struct iovec inmsg, void *args);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_to_inodelk_req (struct iovec inmsg, void *args);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_to_finodelk_req (struct iovec inmsg, void *args);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_to_lk_req (struct iovec inmsg, void *args);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_to_access_req (struct iovec inmsg, void *args);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_to_opendir_req (struct iovec inmsg, void *args);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_to_readdirp_req (struct iovec inmsg, void *args);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_to_readdir_req (struct iovec inmsg, void *args);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_to_fsyncdir_req (struct iovec inmsg, void *args);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_to_mknod_req (struct iovec inmsg, void *args);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_to_mkdir_req (struct iovec inmsg, void *args);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_to_symlink_req (struct iovec inmsg, void *args);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_to_rmdir_req (struct iovec inmsg, void *args);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_to_rchecksum_req (struct iovec inmsg, void *args);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_to_rename_req (struct iovec inmsg, void *args);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_to_link_req (struct iovec inmsg, void *args);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_from_lookup_req (struct iovec outmsg, void *args);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_from_getspec_req (struct iovec outmsg, void *args);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_from_stat_req (struct iovec outmsg, void *args);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_from_access_req (struct iovec outmsg, void *args);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_from_truncate_req (struct iovec outmsg, void *args);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_from_ftruncate_req (struct iovec outmsg, void *args);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_from_readlink_req (struct iovec outmsg, void *args);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_from_writev_req (struct iovec outmsg, void *args);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_from_readv_req (struct iovec outmsg, void *args);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_from_flush_req (struct iovec outmsg, void *args);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_from_fstat_req (struct iovec outmsg, void *args);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_from_fsync_req (struct iovec outmsg, void *args);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_from_open_req (struct iovec outmsg, void *args);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_from_unlink_req (struct iovec outmsg, void *args);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_from_rmdir_req (struct iovec outmsg, void *args);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_from_fsyncdir_req (struct iovec outmsg, void *args);</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_from_fsetxattr_req (struct iovec outmsg, void *args);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_from_setxattr_req (struct iovec outmsg, void *args);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_from_getxattr_req (struct iovec outmsg, void *args);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_from_fgetxattr_req (struct iovec outmsg, void *args);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_from_statfs_req (struct iovec outmsg, void *args);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_from_opendir_req (struct iovec outmsg, void *args);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_from_lk_req (struct iovec outmsg, void *args);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_from_inodelk_req (struct iovec outmsg, void *args);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_from_finodelk_req (struct iovec outmsg, void *args);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_from_entrylk_req (struct iovec outmsg, void *args);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_from_fentrylk_req (struct iovec outmsg, void *args);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_from_removexattr_req (struct iovec outmsg, void *args);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_from_xattrop_req (struct iovec outmsg, void *args);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_from_fxattrop_req (struct iovec outmsg, void *args);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_from_rchecksum_req (struct iovec outmsg, void *args);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_from_readdir_req (struct iovec outmsg, void *args);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_from_readdirp_req (struct iovec outmsg, void *args);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_from_setattr_req (struct iovec outmsg, void *args);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_from_fsetattr_req (struct iovec outmsg, void *args);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_from_symlink_req (struct iovec outmsg, void *args);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_from_rename_req (struct iovec outmsg, void *args);</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_from_link_req (struct iovec outmsg, void *args);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_from_rename_req (struct iovec outmsg, void *args);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_from_create_req (struct iovec outmsg, void *args);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_from_mkdir_req (struct iovec outmsg, void *args);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_from_mknod_req (struct iovec outmsg, void *args);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_from_releasedir_req (struct iovec outmsg, void *args);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_from_release_req (struct iovec outmsg, void *args);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_from_setvolume_req (struct iovec outmsg, void *args);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_to_setvolume_rsp (struct iovec inmsg, void *args);</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_to_statfs_rsp (struct iovec inmsg, void *args);</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_to_stat_rsp (struct iovec inmsg, void *args);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_to_fstat_rsp (struct iovec inmsg, void *args);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_to_rename_rsp (struct iovec inmsg, void *args);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_to_readlink_rsp (struct iovec inmsg, void *args);</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_to_link_rsp (struct iovec inmsg, void *args);</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_to_access_rsp (struct iovec inmsg, void *args);</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_to_truncate_rsp (struct iovec inmsg, void *args);</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_to_ftruncate_rsp (struct iovec inmsg, void *args);</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_to_unlink_rsp (struct iovec inmsg, void *args);</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_to_rmdir_rsp (struct iovec inmsg, void *args);</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_to_open_rsp (struct iovec inmsg, void *args);</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_to_create_rsp (struct iovec inmsg, void *args);</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_to_mkdir_rsp (struct iovec inmsg, void *args);</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_to_mknod_rsp (struct iovec inmsg, void *args);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_to_setattr_rsp (struct iovec inmsg, void *args);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_to_fsetattr_rsp (struct iovec inmsg, void *args);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_to_common_rsp (struct iovec inmsg, void *args);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_to_getxattr_rsp (struct iovec inmsg, void *args);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_to_fxattrop_rsp (struct iovec inmsg, void *args);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_to_xattrop_rsp (struct iovec inmsg, void *args);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_to_symlink_rsp (struct iovec inmsg, void *args);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_to_fgetxattr_rsp (struct iovec inmsg, void *args);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_to_rchecksum_rsp (struct iovec inmsg, void *args);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_to_lk_rsp (struct iovec inmsg, void *args);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_to_readdirp_rsp (struct iovec inmsg, void *args);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_to_readdir_rsp (struct iovec inmsg, void *args);</div><div class='del'>-ssize_t</div><div class='del'>-xdr_to_opendir_rsp (struct iovec inmsg, void *args);</div><div class='del'>-ssize_t</div><div class='del'>-xdr_to_lookup_rsp (struct iovec inmsg, void *args);</div><div class='del'>-ssize_t</div><div class='del'>-xdr_to_readv_rsp (struct iovec inmsg, void *args);</div><div class='del'>-ssize_t</div><div class='del'>-xdr_to_getspec_rsp (struct iovec inmsg, void *args);</div><div class='add'>+#include "glusterfs4-xdr.h"</div><div class='add'>+#include &lt;glusterfs/iatt.h&gt;</div><div class='add'>+#include "protocol-common.h"</div><div class='add'>+#include &lt;glusterfs/upcall-utils.h&gt;</div><div class='add'>+</div><div class='add'>+#define xdr_decoded_remaining_addr(xdr) ((&amp;xdr)-&gt;x_private)</div><div class='add'>+#define xdr_decoded_remaining_len(xdr) ((&amp;xdr)-&gt;x_handy)</div><div class='add'>+#define xdr_encoded_length(xdr)                                                \</div><div class='add'>+    (((size_t)(&amp;xdr)-&gt;x_private) - ((size_t)(&amp;xdr)-&gt;x_base))</div><div class='add'>+#define xdr_decoded_length(xdr)                                                \</div><div class='add'>+    (((size_t)(&amp;xdr)-&gt;x_private) - ((size_t)(&amp;xdr)-&gt;x_base))</div><div class='add'>+</div><div class='add'>+#define GF_O_ACCMODE 003</div><div class='add'>+#define GF_O_RDONLY 00</div><div class='add'>+#define GF_O_WRONLY 01</div><div class='add'>+#define GF_O_RDWR 02</div><div class='add'>+#define GF_O_CREAT 0100</div><div class='add'>+#define GF_O_EXCL 0200</div><div class='add'>+#define GF_O_NOCTTY 0400</div><div class='add'>+#define GF_O_TRUNC 01000</div><div class='add'>+#define GF_O_APPEND 02000</div><div class='add'>+#define GF_O_NONBLOCK 04000</div><div class='add'>+#define GF_O_SYNC 010000</div><div class='add'>+#define GF_O_ASYNC 020000</div><div class='add'>+</div><div class='add'>+#define GF_O_DIRECT 040000</div><div class='add'>+#define GF_O_DIRECTORY 0200000</div><div class='add'>+#define GF_O_NOFOLLOW 0400000</div><div class='add'>+#define GF_O_NOATIME 01000000</div><div class='add'>+#define GF_O_CLOEXEC 02000000</div><div class='add'>+</div><div class='add'>+#define GF_O_LARGEFILE 0100000</div><div class='add'>+</div><div class='add'>+#define GF_O_FMODE_EXEC 040</div><div class='add'>+</div><div class='add'>+#define XLATE_BIT(from, to, bit)                                               \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        if (from &amp; bit)                                                        \</div><div class='add'>+            to = to | GF_##bit;                                                \</div><div class='add'>+    } while (0)</div><div class='add'>+</div><div class='add'>+#define UNXLATE_BIT(from, to, bit)                                             \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        if (from &amp; GF_##bit)                                                   \</div><div class='add'>+            to = to | bit;                                                     \</div><div class='add'>+    } while (0)</div><div class='add'>+</div><div class='add'>+#define XLATE_ACCESSMODE(from, to)                                             \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        switch (from &amp; O_ACCMODE) {                                            \</div><div class='add'>+            case O_RDONLY:                                                     \</div><div class='add'>+                to |= GF_O_RDONLY;                                             \</div><div class='add'>+                break;                                                         \</div><div class='add'>+            case O_WRONLY:                                                     \</div><div class='add'>+                to |= GF_O_WRONLY;                                             \</div><div class='add'>+                break;                                                         \</div><div class='add'>+            case O_RDWR:                                                       \</div><div class='add'>+                to |= GF_O_RDWR;                                               \</div><div class='add'>+                break;                                                         \</div><div class='add'>+        }                                                                      \</div><div class='add'>+    } while (0)</div><div class='add'>+</div><div class='add'>+#define UNXLATE_ACCESSMODE(from, to)                                           \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        switch (from &amp; GF_O_ACCMODE) {                                         \</div><div class='add'>+            case GF_O_RDONLY:                                                  \</div><div class='add'>+                to |= O_RDONLY;                                                \</div><div class='add'>+                break;                                                         \</div><div class='add'>+            case GF_O_WRONLY:                                                  \</div><div class='add'>+                to |= O_WRONLY;                                                \</div><div class='add'>+                break;                                                         \</div><div class='add'>+            case GF_O_RDWR:                                                    \</div><div class='add'>+                to |= O_RDWR;                                                  \</div><div class='add'>+                break;                                                         \</div><div class='add'>+        }                                                                      \</div><div class='add'>+    } while (0)</div><div class='add'>+</div><div class='add'>+static inline uint32_t</div><div class='add'>+gf_flags_from_flags(uint32_t flags)</div><div class='add'>+{</div><div class='add'>+    uint32_t gf_flags = 0;</div><div class='add'>+</div><div class='add'>+    XLATE_ACCESSMODE(flags, gf_flags);</div><div class='add'>+</div><div class='add'>+    XLATE_BIT(flags, gf_flags, O_CREAT);</div><div class='add'>+    XLATE_BIT(flags, gf_flags, O_EXCL);</div><div class='add'>+    XLATE_BIT(flags, gf_flags, O_NOCTTY);</div><div class='add'>+    XLATE_BIT(flags, gf_flags, O_TRUNC);</div><div class='add'>+    XLATE_BIT(flags, gf_flags, O_APPEND);</div><div class='add'>+    XLATE_BIT(flags, gf_flags, O_NONBLOCK);</div><div class='add'>+    XLATE_BIT(flags, gf_flags, O_SYNC);</div><div class='add'>+    XLATE_BIT(flags, gf_flags, O_ASYNC);</div><div class='add'>+</div><div class='add'>+    XLATE_BIT(flags, gf_flags, O_DIRECT);</div><div class='add'>+    XLATE_BIT(flags, gf_flags, O_DIRECTORY);</div><div class='add'>+    XLATE_BIT(flags, gf_flags, O_NOFOLLOW);</div><div class='add'>+#ifdef O_NOATIME</div><div class='add'>+    XLATE_BIT(flags, gf_flags, O_NOATIME);</div><div class='add'>+#endif</div><div class='add'>+#ifdef O_CLOEXEC</div><div class='add'>+    XLATE_BIT(flags, gf_flags, O_CLOEXEC);</div><div class='add'>+#endif</div><div class='add'>+    XLATE_BIT(flags, gf_flags, O_LARGEFILE);</div><div class='add'>+    XLATE_BIT(flags, gf_flags, O_FMODE_EXEC);</div><div class='add'>+</div><div class='add'>+    return gf_flags;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static inline uint32_t</div><div class='add'>+gf_flags_to_flags(uint32_t gf_flags)</div><div class='add'>+{</div><div class='add'>+    uint32_t flags = 0;</div><div class='add'>+</div><div class='add'>+    UNXLATE_ACCESSMODE(gf_flags, flags);</div><div class='add'>+</div><div class='add'>+    UNXLATE_BIT(gf_flags, flags, O_CREAT);</div><div class='add'>+    UNXLATE_BIT(gf_flags, flags, O_EXCL);</div><div class='add'>+    UNXLATE_BIT(gf_flags, flags, O_NOCTTY);</div><div class='add'>+    UNXLATE_BIT(gf_flags, flags, O_TRUNC);</div><div class='add'>+    UNXLATE_BIT(gf_flags, flags, O_APPEND);</div><div class='add'>+    UNXLATE_BIT(gf_flags, flags, O_NONBLOCK);</div><div class='add'>+    UNXLATE_BIT(gf_flags, flags, O_SYNC);</div><div class='add'>+    UNXLATE_BIT(gf_flags, flags, O_ASYNC);</div><div class='add'>+</div><div class='add'>+    UNXLATE_BIT(gf_flags, flags, O_DIRECT);</div><div class='add'>+    UNXLATE_BIT(gf_flags, flags, O_DIRECTORY);</div><div class='add'>+    UNXLATE_BIT(gf_flags, flags, O_NOFOLLOW);</div><div class='add'>+#ifdef O_NOATIME</div><div class='add'>+    UNXLATE_BIT(gf_flags, flags, O_NOATIME);</div><div class='add'>+#endif</div><div class='add'>+#ifdef O_CLOEXEC</div><div class='add'>+    UNXLATE_BIT(gf_flags, flags, O_CLOEXEC);</div><div class='add'>+#endif</div><div class='add'>+    UNXLATE_BIT(gf_flags, flags, O_LARGEFILE);</div><div class='add'>+    UNXLATE_BIT(gf_flags, flags, O_FMODE_EXEC);</div><div class='add'>+</div><div class='add'>+    return flags;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static inline void</div><div class='add'>+gf_statfs_to_statfs(struct gf_statfs *gf_stat, struct statvfs *stat)</div><div class='add'>+{</div><div class='add'>+    if (!stat || !gf_stat)</div><div class='add'>+        return;</div><div class='add'>+</div><div class='add'>+    stat-&gt;f_bsize = (gf_stat-&gt;bsize);</div><div class='add'>+    stat-&gt;f_frsize = (gf_stat-&gt;frsize);</div><div class='add'>+    stat-&gt;f_blocks = (gf_stat-&gt;blocks);</div><div class='add'>+    stat-&gt;f_bfree = (gf_stat-&gt;bfree);</div><div class='add'>+    stat-&gt;f_bavail = (gf_stat-&gt;bavail);</div><div class='add'>+    stat-&gt;f_files = (gf_stat-&gt;files);</div><div class='add'>+    stat-&gt;f_ffree = (gf_stat-&gt;ffree);</div><div class='add'>+    stat-&gt;f_favail = (gf_stat-&gt;favail);</div><div class='add'>+    stat-&gt;f_fsid = (gf_stat-&gt;fsid);</div><div class='add'>+    stat-&gt;f_flag = (gf_stat-&gt;flag);</div><div class='add'>+    stat-&gt;f_namemax = (gf_stat-&gt;namemax);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static inline void</div><div class='add'>+gf_statfs_from_statfs(struct gf_statfs *gf_stat, struct statvfs *stat)</div><div class='add'>+{</div><div class='add'>+    if (!stat || !gf_stat)</div><div class='add'>+        return;</div><div class='add'>+</div><div class='add'>+    gf_stat-&gt;bsize = stat-&gt;f_bsize;</div><div class='add'>+    gf_stat-&gt;frsize = stat-&gt;f_frsize;</div><div class='add'>+    gf_stat-&gt;blocks = stat-&gt;f_blocks;</div><div class='add'>+    gf_stat-&gt;bfree = stat-&gt;f_bfree;</div><div class='add'>+    gf_stat-&gt;bavail = stat-&gt;f_bavail;</div><div class='add'>+    gf_stat-&gt;files = stat-&gt;f_files;</div><div class='add'>+    gf_stat-&gt;ffree = stat-&gt;f_ffree;</div><div class='add'>+    gf_stat-&gt;favail = stat-&gt;f_favail;</div><div class='add'>+    gf_stat-&gt;fsid = stat-&gt;f_fsid;</div><div class='add'>+    gf_stat-&gt;flag = stat-&gt;f_flag;</div><div class='add'>+    gf_stat-&gt;namemax = stat-&gt;f_namemax;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static inline void</div><div class='add'>+gf_proto_lease_to_lease(struct gf_proto_lease *gf_proto_lease,</div><div class='add'>+                        struct gf_lease *gf_lease)</div><div class='add'>+{</div><div class='add'>+    if (!gf_lease || !gf_proto_lease)</div><div class='add'>+        return;</div><div class='add'>+</div><div class='add'>+    gf_lease-&gt;cmd = gf_proto_lease-&gt;cmd;</div><div class='add'>+    gf_lease-&gt;lease_type = gf_proto_lease-&gt;lease_type;</div><div class='add'>+    memcpy(gf_lease-&gt;lease_id, gf_proto_lease-&gt;lease_id, LEASE_ID_SIZE);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static inline void</div><div class='add'>+gf_proto_lease_from_lease(struct gf_proto_lease *gf_proto_lease,</div><div class='add'>+                          struct gf_lease *gf_lease)</div><div class='add'>+{</div><div class='add'>+    if (!gf_lease || !gf_proto_lease)</div><div class='add'>+        return;</div><div class='add'>+</div><div class='add'>+    gf_proto_lease-&gt;cmd = gf_lease-&gt;cmd;</div><div class='add'>+    gf_proto_lease-&gt;lease_type = gf_lease-&gt;lease_type;</div><div class='add'>+    memcpy(gf_proto_lease-&gt;lease_id, gf_lease-&gt;lease_id, LEASE_ID_SIZE);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static inline int</div><div class='add'>+gf_proto_recall_lease_to_upcall(struct gfs3_recall_lease_req *recall_lease,</div><div class='add'>+                                struct gf_upcall *gf_up_data)</div><div class='add'>+{</div><div class='add'>+    struct gf_upcall_recall_lease *tmp = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    GF_VALIDATE_OR_GOTO(THIS-&gt;name, recall_lease, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(THIS-&gt;name, gf_up_data, out);</div><div class='add'>+</div><div class='add'>+    tmp = (struct gf_upcall_recall_lease *)gf_up_data-&gt;data;</div><div class='add'>+    tmp-&gt;lease_type = recall_lease-&gt;lease_type;</div><div class='add'>+    memcpy(gf_up_data-&gt;gfid, recall_lease-&gt;gfid, 16);</div><div class='add'>+    memcpy(tmp-&gt;tid, recall_lease-&gt;tid, 16);</div><div class='add'>+</div><div class='add'>+    GF_PROTOCOL_DICT_UNSERIALIZE(</div><div class='add'>+        THIS, tmp-&gt;dict, (recall_lease-&gt;xdata).xdata_val,</div><div class='add'>+        (recall_lease-&gt;xdata).xdata_len, ret, errno, out);</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static inline int</div><div class='add'>+gf_proto_recall_lease_from_upcall(xlator_t *this,</div><div class='add'>+                                  struct gfs3_recall_lease_req *recall_lease,</div><div class='add'>+                                  struct gf_upcall *gf_up_data)</div><div class='add'>+{</div><div class='add'>+    struct gf_upcall_recall_lease *tmp = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, recall_lease, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, gf_up_data, out);</div><div class='add'>+</div><div class='add'>+    tmp = (struct gf_upcall_recall_lease *)gf_up_data-&gt;data;</div><div class='add'>+    recall_lease-&gt;lease_type = tmp-&gt;lease_type;</div><div class='add'>+    memcpy(recall_lease-&gt;gfid, gf_up_data-&gt;gfid, 16);</div><div class='add'>+    memcpy(recall_lease-&gt;tid, tmp-&gt;tid, 16);</div><div class='add'>+</div><div class='add'>+    GF_PROTOCOL_DICT_SERIALIZE(this, tmp-&gt;dict,</div><div class='add'>+                               &amp;(recall_lease-&gt;xdata).xdata_val,</div><div class='add'>+                               (recall_lease-&gt;xdata).xdata_len, ret, out);</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static inline void</div><div class='add'>+gf_proto_flock_to_flock(struct gf_proto_flock *gf_proto_flock,</div><div class='add'>+                        struct gf_flock *gf_flock)</div><div class='add'>+{</div><div class='add'>+    if (!gf_flock || !gf_proto_flock)</div><div class='add'>+        return;</div><div class='add'>+</div><div class='add'>+    gf_flock-&gt;l_type = gf_proto_flock-&gt;type;</div><div class='add'>+    gf_flock-&gt;l_whence = gf_proto_flock-&gt;whence;</div><div class='add'>+    gf_flock-&gt;l_start = gf_proto_flock-&gt;start;</div><div class='add'>+    gf_flock-&gt;l_len = gf_proto_flock-&gt;len;</div><div class='add'>+    gf_flock-&gt;l_pid = gf_proto_flock-&gt;pid;</div><div class='add'>+    gf_flock-&gt;l_owner.len = gf_proto_flock-&gt;lk_owner.lk_owner_len;</div><div class='add'>+    if (gf_flock-&gt;l_owner.len &amp;&amp;</div><div class='add'>+        (gf_flock-&gt;l_owner.len &lt; GF_MAX_LOCK_OWNER_LEN))</div><div class='add'>+        memcpy(gf_flock-&gt;l_owner.data, gf_proto_flock-&gt;lk_owner.lk_owner_val,</div><div class='add'>+               gf_flock-&gt;l_owner.len);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static inline void</div><div class='add'>+gf_proto_flock_from_flock(struct gf_proto_flock *gf_proto_flock,</div><div class='add'>+                          struct gf_flock *gf_flock)</div><div class='add'>+{</div><div class='add'>+    if (!gf_flock || !gf_proto_flock)</div><div class='add'>+        return;</div><div class='add'>+</div><div class='add'>+    gf_proto_flock-&gt;type = (gf_flock-&gt;l_type);</div><div class='add'>+    gf_proto_flock-&gt;whence = (gf_flock-&gt;l_whence);</div><div class='add'>+    gf_proto_flock-&gt;start = (gf_flock-&gt;l_start);</div><div class='add'>+    gf_proto_flock-&gt;len = (gf_flock-&gt;l_len);</div><div class='add'>+    gf_proto_flock-&gt;pid = (gf_flock-&gt;l_pid);</div><div class='add'>+    gf_proto_flock-&gt;lk_owner.lk_owner_len = gf_flock-&gt;l_owner.len;</div><div class='add'>+    if (gf_flock-&gt;l_owner.len)</div><div class='add'>+        gf_proto_flock-&gt;lk_owner.lk_owner_val = gf_flock-&gt;l_owner.data;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static inline void</div><div class='add'>+gf_stat_to_iatt(struct gf_iatt *gf_stat, struct iatt *iatt)</div><div class='add'>+{</div><div class='add'>+    if (!iatt || !gf_stat)</div><div class='add'>+        return;</div><div class='add'>+</div><div class='add'>+    memcpy(iatt-&gt;ia_gfid, gf_stat-&gt;ia_gfid, 16);</div><div class='add'>+    iatt-&gt;ia_ino = gf_stat-&gt;ia_ino;</div><div class='add'>+    iatt-&gt;ia_dev = gf_stat-&gt;ia_dev;</div><div class='add'>+    iatt-&gt;ia_type = ia_type_from_st_mode(gf_stat-&gt;mode);</div><div class='add'>+    iatt-&gt;ia_prot = ia_prot_from_st_mode(gf_stat-&gt;mode);</div><div class='add'>+    iatt-&gt;ia_nlink = gf_stat-&gt;ia_nlink;</div><div class='add'>+    iatt-&gt;ia_uid = gf_stat-&gt;ia_uid;</div><div class='add'>+    iatt-&gt;ia_gid = gf_stat-&gt;ia_gid;</div><div class='add'>+    iatt-&gt;ia_rdev = gf_stat-&gt;ia_rdev;</div><div class='add'>+    iatt-&gt;ia_size = gf_stat-&gt;ia_size;</div><div class='add'>+    iatt-&gt;ia_blksize = gf_stat-&gt;ia_blksize;</div><div class='add'>+    iatt-&gt;ia_blocks = gf_stat-&gt;ia_blocks;</div><div class='add'>+    iatt-&gt;ia_atime = gf_stat-&gt;ia_atime;</div><div class='add'>+    iatt-&gt;ia_atime_nsec = gf_stat-&gt;ia_atime_nsec;</div><div class='add'>+    iatt-&gt;ia_mtime = gf_stat-&gt;ia_mtime;</div><div class='add'>+    iatt-&gt;ia_mtime_nsec = gf_stat-&gt;ia_mtime_nsec;</div><div class='add'>+    iatt-&gt;ia_ctime = gf_stat-&gt;ia_ctime;</div><div class='add'>+    iatt-&gt;ia_ctime_nsec = gf_stat-&gt;ia_ctime_nsec;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static inline void</div><div class='add'>+gf_stat_from_iatt(struct gf_iatt *gf_stat, struct iatt *iatt)</div><div class='add'>+{</div><div class='add'>+    if (!iatt || !gf_stat)</div><div class='add'>+        return;</div><div class='add'>+</div><div class='add'>+    memcpy(gf_stat-&gt;ia_gfid, iatt-&gt;ia_gfid, 16);</div><div class='add'>+    gf_stat-&gt;ia_ino = iatt-&gt;ia_ino;</div><div class='add'>+    gf_stat-&gt;ia_dev = iatt-&gt;ia_dev;</div><div class='add'>+    gf_stat-&gt;mode = st_mode_from_ia(iatt-&gt;ia_prot, iatt-&gt;ia_type);</div><div class='add'>+    gf_stat-&gt;ia_nlink = iatt-&gt;ia_nlink;</div><div class='add'>+    gf_stat-&gt;ia_uid = iatt-&gt;ia_uid;</div><div class='add'>+    gf_stat-&gt;ia_gid = iatt-&gt;ia_gid;</div><div class='add'>+    gf_stat-&gt;ia_rdev = iatt-&gt;ia_rdev;</div><div class='add'>+    gf_stat-&gt;ia_size = iatt-&gt;ia_size;</div><div class='add'>+    gf_stat-&gt;ia_blksize = iatt-&gt;ia_blksize;</div><div class='add'>+    gf_stat-&gt;ia_blocks = iatt-&gt;ia_blocks;</div><div class='add'>+    gf_stat-&gt;ia_atime = iatt-&gt;ia_atime;</div><div class='add'>+    gf_stat-&gt;ia_atime_nsec = iatt-&gt;ia_atime_nsec;</div><div class='add'>+    gf_stat-&gt;ia_mtime = iatt-&gt;ia_mtime;</div><div class='add'>+    gf_stat-&gt;ia_mtime_nsec = iatt-&gt;ia_mtime_nsec;</div><div class='add'>+    gf_stat-&gt;ia_ctime = iatt-&gt;ia_ctime;</div><div class='add'>+    gf_stat-&gt;ia_ctime_nsec = iatt-&gt;ia_ctime_nsec;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static inline int</div><div class='add'>+gf_proto_cache_invalidation_from_upcall(</div><div class='add'>+    xlator_t *this, gfs3_cbk_cache_invalidation_req *gf_c_req,</div><div class='add'>+    struct gf_upcall *gf_up_data)</div><div class='add'>+{</div><div class='add'>+    struct gf_upcall_cache_invalidation *gf_c_data = NULL;</div><div class='add'>+    int is_cache_inval = 0;</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, gf_c_req, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, gf_up_data, out);</div><div class='add'>+</div><div class='add'>+    is_cache_inval = ((gf_up_data-&gt;event_type == GF_UPCALL_CACHE_INVALIDATION)</div><div class='add'>+                          ? 1</div><div class='add'>+                          : 0);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, is_cache_inval, out);</div><div class='add'>+</div><div class='add'>+    gf_c_data = (struct gf_upcall_cache_invalidation *)gf_up_data-&gt;data;</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, gf_c_data, out);</div><div class='add'>+</div><div class='add'>+    gf_c_req-&gt;gfid = uuid_utoa(gf_up_data-&gt;gfid);</div><div class='add'>+    gf_c_req-&gt;event_type = gf_up_data-&gt;event_type;</div><div class='add'>+    gf_c_req-&gt;flags = gf_c_data-&gt;flags;</div><div class='add'>+    gf_c_req-&gt;expire_time_attr = gf_c_data-&gt;expire_time_attr;</div><div class='add'>+    gf_stat_from_iatt(&amp;gf_c_req-&gt;stat, &amp;gf_c_data-&gt;stat);</div><div class='add'>+    gf_stat_from_iatt(&amp;gf_c_req-&gt;parent_stat, &amp;gf_c_data-&gt;p_stat);</div><div class='add'>+    gf_stat_from_iatt(&amp;gf_c_req-&gt;oldparent_stat, &amp;gf_c_data-&gt;oldp_stat);</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+    GF_PROTOCOL_DICT_SERIALIZE(this, gf_c_data-&gt;dict,</div><div class='add'>+                               &amp;(gf_c_req-&gt;xdata).xdata_val,</div><div class='add'>+                               (gf_c_req-&gt;xdata).xdata_len, ret, out);</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static inline int</div><div class='add'>+gf_proto_cache_invalidation_to_upcall(xlator_t *this,</div><div class='add'>+                                      gfs3_cbk_cache_invalidation_req *gf_c_req,</div><div class='add'>+                                      struct gf_upcall *gf_up_data)</div><div class='add'>+{</div><div class='add'>+    struct gf_upcall_cache_invalidation *gf_c_data = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, gf_c_req, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, gf_up_data, out);</div><div class='add'>+</div><div class='add'>+    gf_c_data = (struct gf_upcall_cache_invalidation *)gf_up_data-&gt;data;</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, gf_c_data, out);</div><div class='add'>+</div><div class='add'>+    ret = gf_uuid_parse(gf_c_req-&gt;gfid, gf_up_data-&gt;gfid);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log(this-&gt;name, GF_LOG_WARNING, "gf_uuid_parse(%s) failed",</div><div class='add'>+               gf_c_req-&gt;gfid);</div><div class='add'>+        gf_up_data-&gt;event_type = GF_UPCALL_EVENT_NULL;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    gf_up_data-&gt;event_type = gf_c_req-&gt;event_type;</div><div class='add'>+</div><div class='add'>+    gf_c_data-&gt;flags = gf_c_req-&gt;flags;</div><div class='add'>+    gf_c_data-&gt;expire_time_attr = gf_c_req-&gt;expire_time_attr;</div><div class='add'>+    gf_stat_to_iatt(&amp;gf_c_req-&gt;stat, &amp;gf_c_data-&gt;stat);</div><div class='add'>+    gf_stat_to_iatt(&amp;gf_c_req-&gt;parent_stat, &amp;gf_c_data-&gt;p_stat);</div><div class='add'>+    gf_stat_to_iatt(&amp;gf_c_req-&gt;oldparent_stat, &amp;gf_c_data-&gt;oldp_stat);</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+    GF_PROTOCOL_DICT_UNSERIALIZE(this, gf_c_data-&gt;dict,</div><div class='add'>+                                 (gf_c_req-&gt;xdata).xdata_val,</div><div class='add'>+                                 (gf_c_req-&gt;xdata).xdata_len, ret, ret, out);</div><div class='add'>+</div><div class='add'>+    /* If no dict was sent, create an empty dict, so that each xlator</div><div class='add'>+     * need not check if empty then create new dict. Will be unref'd by the</div><div class='add'>+     * caller */</div><div class='add'>+    if (!gf_c_data-&gt;dict)</div><div class='add'>+        gf_c_data-&gt;dict = dict_new();</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static inline int</div><div class='add'>+gf_proto_inodelk_contention_to_upcall(struct gfs4_inodelk_contention_req *lc,</div><div class='add'>+                                      struct gf_upcall *gf_up_data)</div><div class='add'>+{</div><div class='add'>+    struct gf_upcall_inodelk_contention *tmp = NULL;</div><div class='add'>+    xlator_t *this = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int op_errno = EINVAL;</div><div class='add'>+</div><div class='add'>+    this = THIS;</div><div class='add'>+</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, lc, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, gf_up_data, out);</div><div class='add'>+</div><div class='add'>+    tmp = (struct gf_upcall_inodelk_contention *)gf_up_data-&gt;data;</div><div class='add'>+</div><div class='add'>+    gf_uuid_copy(gf_up_data-&gt;gfid, (unsigned char *)lc-&gt;gfid);</div><div class='add'>+</div><div class='add'>+    gf_proto_flock_to_flock(&amp;lc-&gt;flock, &amp;tmp-&gt;flock);</div><div class='add'>+    tmp-&gt;pid = lc-&gt;pid;</div><div class='add'>+    tmp-&gt;domain = lc-&gt;domain;</div><div class='add'>+    if ((tmp-&gt;domain != NULL) &amp;&amp; (*tmp-&gt;domain == 0)) {</div><div class='add'>+        tmp-&gt;domain = NULL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    GF_PROTOCOL_DICT_UNSERIALIZE(this, tmp-&gt;xdata, lc-&gt;xdata.xdata_val,</div><div class='add'>+                                 lc-&gt;xdata.xdata_len, ret, op_errno, out);</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        ret = -op_errno;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static inline int</div><div class='add'>+gf_proto_inodelk_contention_from_upcall(xlator_t *this,</div><div class='add'>+                                        struct gfs4_inodelk_contention_req *lc,</div><div class='add'>+                                        struct gf_upcall *gf_up_data)</div><div class='add'>+{</div><div class='add'>+    struct gf_upcall_inodelk_contention *tmp = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int op_errno = EINVAL;</div><div class='add'>+</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, lc, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, gf_up_data, out);</div><div class='add'>+</div><div class='add'>+    tmp = (struct gf_upcall_inodelk_contention *)gf_up_data-&gt;data;</div><div class='add'>+</div><div class='add'>+    gf_uuid_copy((unsigned char *)lc-&gt;gfid, gf_up_data-&gt;gfid);</div><div class='add'>+</div><div class='add'>+    gf_proto_flock_from_flock(&amp;lc-&gt;flock, &amp;tmp-&gt;flock);</div><div class='add'>+    lc-&gt;pid = tmp-&gt;pid;</div><div class='add'>+    lc-&gt;domain = (char *)tmp-&gt;domain;</div><div class='add'>+    if (lc-&gt;domain == NULL) {</div><div class='add'>+        lc-&gt;domain = "";</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    GF_PROTOCOL_DICT_SERIALIZE(this, tmp-&gt;xdata, &amp;lc-&gt;xdata.xdata_val,</div><div class='add'>+                               lc-&gt;xdata.xdata_len, op_errno, out);</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        ret = -op_errno;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static inline int</div><div class='add'>+gf_proto_entrylk_contention_to_upcall(struct gfs4_entrylk_contention_req *lc,</div><div class='add'>+                                      struct gf_upcall *gf_up_data)</div><div class='add'>+{</div><div class='add'>+    struct gf_upcall_entrylk_contention *tmp = NULL;</div><div class='add'>+    xlator_t *this = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int op_errno = EINVAL;</div><div class='add'>+</div><div class='add'>+    this = THIS;</div><div class='add'>+</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, lc, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, gf_up_data, out);</div><div class='add'>+</div><div class='add'>+    tmp = (struct gf_upcall_entrylk_contention *)gf_up_data-&gt;data;</div><div class='add'>+</div><div class='add'>+    gf_uuid_copy(gf_up_data-&gt;gfid, (unsigned char *)lc-&gt;gfid);</div><div class='add'>+</div><div class='add'>+    tmp-&gt;type = lc-&gt;type;</div><div class='add'>+    tmp-&gt;name = lc-&gt;name;</div><div class='add'>+    if ((tmp-&gt;name != NULL) &amp;&amp; (*tmp-&gt;name == 0)) {</div><div class='add'>+        tmp-&gt;name = NULL;</div><div class='add'>+    }</div><div class='add'>+    tmp-&gt;pid = lc-&gt;pid;</div><div class='add'>+    tmp-&gt;domain = lc-&gt;domain;</div><div class='add'>+    if ((tmp-&gt;domain != NULL) &amp;&amp; (*tmp-&gt;domain == 0)) {</div><div class='add'>+        tmp-&gt;domain = NULL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    GF_PROTOCOL_DICT_UNSERIALIZE(this, tmp-&gt;xdata, lc-&gt;xdata.xdata_val,</div><div class='add'>+                                 lc-&gt;xdata.xdata_len, ret, op_errno, out);</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        ret = -op_errno;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static inline int</div><div class='add'>+gf_proto_entrylk_contention_from_upcall(xlator_t *this,</div><div class='add'>+                                        struct gfs4_entrylk_contention_req *lc,</div><div class='add'>+                                        struct gf_upcall *gf_up_data)</div><div class='add'>+{</div><div class='add'>+    struct gf_upcall_entrylk_contention *tmp = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int op_errno = EINVAL;</div><div class='add'>+</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, lc, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, gf_up_data, out);</div><div class='add'>+</div><div class='add'>+    tmp = (struct gf_upcall_entrylk_contention *)gf_up_data-&gt;data;</div><div class='add'>+</div><div class='add'>+    gf_uuid_copy((unsigned char *)lc-&gt;gfid, gf_up_data-&gt;gfid);</div><div class='add'>+</div><div class='add'>+    lc-&gt;type = tmp-&gt;type;</div><div class='add'>+    lc-&gt;name = (char *)tmp-&gt;name;</div><div class='add'>+    if (lc-&gt;name == NULL) {</div><div class='add'>+        lc-&gt;name = "";</div><div class='add'>+    }</div><div class='add'>+    lc-&gt;pid = tmp-&gt;pid;</div><div class='add'>+    lc-&gt;domain = (char *)tmp-&gt;domain;</div><div class='add'>+    if (lc-&gt;domain == NULL) {</div><div class='add'>+        lc-&gt;domain = "";</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    GF_PROTOCOL_DICT_SERIALIZE(this, tmp-&gt;xdata, &amp;lc-&gt;xdata.xdata_val,</div><div class='add'>+                               lc-&gt;xdata.xdata_len, op_errno, out);</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        ret = -op_errno;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static inline void</div><div class='add'>+gfx_mdata_iatt_to_mdata_iatt(struct gfx_mdata_iatt *gf_mdata_iatt,</div><div class='add'>+                             struct mdata_iatt *mdata_iatt)</div><div class='add'>+{</div><div class='add'>+    if (!mdata_iatt || !gf_mdata_iatt)</div><div class='add'>+        return;</div><div class='add'>+    mdata_iatt-&gt;ia_atime = gf_mdata_iatt-&gt;ia_atime;</div><div class='add'>+    mdata_iatt-&gt;ia_atime_nsec = gf_mdata_iatt-&gt;ia_atime_nsec;</div><div class='add'>+    mdata_iatt-&gt;ia_mtime = gf_mdata_iatt-&gt;ia_mtime;</div><div class='add'>+    mdata_iatt-&gt;ia_mtime_nsec = gf_mdata_iatt-&gt;ia_mtime_nsec;</div><div class='add'>+    mdata_iatt-&gt;ia_ctime = gf_mdata_iatt-&gt;ia_ctime;</div><div class='add'>+    mdata_iatt-&gt;ia_ctime_nsec = gf_mdata_iatt-&gt;ia_ctime_nsec;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static inline void</div><div class='add'>+gfx_mdata_iatt_from_mdata_iatt(struct gfx_mdata_iatt *gf_mdata_iatt,</div><div class='add'>+                               struct mdata_iatt *mdata_iatt)</div><div class='add'>+{</div><div class='add'>+    if (!mdata_iatt || !gf_mdata_iatt)</div><div class='add'>+        return;</div><div class='add'>+    gf_mdata_iatt-&gt;ia_atime = mdata_iatt-&gt;ia_atime;</div><div class='add'>+    gf_mdata_iatt-&gt;ia_atime_nsec = mdata_iatt-&gt;ia_atime_nsec;</div><div class='add'>+    gf_mdata_iatt-&gt;ia_mtime = mdata_iatt-&gt;ia_mtime;</div><div class='add'>+    gf_mdata_iatt-&gt;ia_mtime_nsec = mdata_iatt-&gt;ia_mtime_nsec;</div><div class='add'>+    gf_mdata_iatt-&gt;ia_ctime = mdata_iatt-&gt;ia_ctime;</div><div class='add'>+    gf_mdata_iatt-&gt;ia_ctime_nsec = mdata_iatt-&gt;ia_ctime_nsec;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static inline void</div><div class='add'>+gfx_stat_to_iattx(struct gfx_iattx *gf_stat, struct iatt *iatt)</div><div class='add'>+{</div><div class='add'>+    if (!iatt || !gf_stat)</div><div class='add'>+        return;</div><div class='add'>+</div><div class='add'>+    memcpy(iatt-&gt;ia_gfid, gf_stat-&gt;ia_gfid, 16);</div><div class='add'>+</div><div class='add'>+    iatt-&gt;ia_flags = gf_stat-&gt;ia_flags;</div><div class='add'>+    iatt-&gt;ia_ino = gf_stat-&gt;ia_ino;</div><div class='add'>+    iatt-&gt;ia_dev = gf_stat-&gt;ia_dev;</div><div class='add'>+    iatt-&gt;ia_rdev = gf_stat-&gt;ia_rdev;</div><div class='add'>+    iatt-&gt;ia_size = gf_stat-&gt;ia_size;</div><div class='add'>+    iatt-&gt;ia_nlink = gf_stat-&gt;ia_nlink;</div><div class='add'>+    iatt-&gt;ia_uid = gf_stat-&gt;ia_uid;</div><div class='add'>+    iatt-&gt;ia_gid = gf_stat-&gt;ia_gid;</div><div class='add'>+    iatt-&gt;ia_blksize = gf_stat-&gt;ia_blksize;</div><div class='add'>+    iatt-&gt;ia_blocks = gf_stat-&gt;ia_blocks;</div><div class='add'>+    iatt-&gt;ia_atime = gf_stat-&gt;ia_atime;</div><div class='add'>+    iatt-&gt;ia_atime_nsec = gf_stat-&gt;ia_atime_nsec;</div><div class='add'>+    iatt-&gt;ia_mtime = gf_stat-&gt;ia_mtime;</div><div class='add'>+    iatt-&gt;ia_mtime_nsec = gf_stat-&gt;ia_mtime_nsec;</div><div class='add'>+    iatt-&gt;ia_ctime = gf_stat-&gt;ia_ctime;</div><div class='add'>+    iatt-&gt;ia_ctime_nsec = gf_stat-&gt;ia_ctime_nsec;</div><div class='add'>+    iatt-&gt;ia_btime = gf_stat-&gt;ia_btime;</div><div class='add'>+    iatt-&gt;ia_btime_nsec = gf_stat-&gt;ia_btime_nsec;</div><div class='add'>+    iatt-&gt;ia_attributes = gf_stat-&gt;ia_attributes;</div><div class='add'>+    iatt-&gt;ia_attributes_mask = gf_stat-&gt;ia_attributes_mask;</div><div class='add'>+</div><div class='add'>+    iatt-&gt;ia_type = ia_type_from_st_mode(gf_stat-&gt;mode);</div><div class='add'>+    iatt-&gt;ia_prot = ia_prot_from_st_mode(gf_stat-&gt;mode);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static inline void</div><div class='add'>+gfx_stat_from_iattx(struct gfx_iattx *gf_stat, struct iatt *iatt)</div><div class='add'>+{</div><div class='add'>+    if (!iatt || !gf_stat)</div><div class='add'>+        return;</div><div class='add'>+</div><div class='add'>+    memcpy(gf_stat-&gt;ia_gfid, iatt-&gt;ia_gfid, 16);</div><div class='add'>+    gf_stat-&gt;ia_ino = iatt-&gt;ia_ino;</div><div class='add'>+    gf_stat-&gt;ia_dev = iatt-&gt;ia_dev;</div><div class='add'>+</div><div class='add'>+    gf_stat-&gt;ia_nlink = iatt-&gt;ia_nlink;</div><div class='add'>+    gf_stat-&gt;ia_uid = iatt-&gt;ia_uid;</div><div class='add'>+    gf_stat-&gt;ia_gid = iatt-&gt;ia_gid;</div><div class='add'>+    gf_stat-&gt;ia_rdev = iatt-&gt;ia_rdev;</div><div class='add'>+    gf_stat-&gt;ia_size = iatt-&gt;ia_size;</div><div class='add'>+    gf_stat-&gt;ia_blksize = iatt-&gt;ia_blksize;</div><div class='add'>+    gf_stat-&gt;ia_blocks = iatt-&gt;ia_blocks;</div><div class='add'>+    gf_stat-&gt;ia_atime = iatt-&gt;ia_atime;</div><div class='add'>+    gf_stat-&gt;ia_atime_nsec = iatt-&gt;ia_atime_nsec;</div><div class='add'>+    gf_stat-&gt;ia_mtime = iatt-&gt;ia_mtime;</div><div class='add'>+    gf_stat-&gt;ia_mtime_nsec = iatt-&gt;ia_mtime_nsec;</div><div class='add'>+    gf_stat-&gt;ia_ctime = iatt-&gt;ia_ctime;</div><div class='add'>+    gf_stat-&gt;ia_ctime_nsec = iatt-&gt;ia_ctime_nsec;</div><div class='add'>+</div><div class='add'>+    gf_stat-&gt;ia_flags = iatt-&gt;ia_flags;</div><div class='add'>+    gf_stat-&gt;ia_btime = iatt-&gt;ia_btime;</div><div class='add'>+    gf_stat-&gt;ia_btime_nsec = iatt-&gt;ia_btime_nsec;</div><div class='add'>+    gf_stat-&gt;ia_attributes = iatt-&gt;ia_attributes;</div><div class='add'>+    gf_stat-&gt;ia_attributes_mask = iatt-&gt;ia_attributes_mask;</div><div class='add'>+</div><div class='add'>+    gf_stat-&gt;mode = st_mode_from_ia(iatt-&gt;ia_prot, iatt-&gt;ia_type);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* dict_to_xdr () */</div><div class='add'>+static inline int</div><div class='add'>+dict_to_xdr(dict_t *this, gfx_dict *dict)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int i = 0;</div><div class='add'>+    int index = 0;</div><div class='add'>+    data_pair_t *dpair = NULL;</div><div class='add'>+    gfx_dict_pair *xpair = NULL;</div><div class='add'>+    ssize_t size = 0;</div><div class='add'>+</div><div class='add'>+    /* This is a failure as we expect destination to be valid */</div><div class='add'>+    if (!dict)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    /* This is OK as dictionary can be null, in which case, destination</div><div class='add'>+       should also know that it is NULL. */</div><div class='add'>+    if (!this) {</div><div class='add'>+        /* encode special meaning data here,</div><div class='add'>+           while decoding, you know it is NULL dict */</div><div class='add'>+        dict-&gt;count = -1;</div><div class='add'>+        /* everything else is normal */</div><div class='add'>+        dict-&gt;pairs.pairs_len = 0;</div><div class='add'>+        ret = 0;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Do the whole operation in locked region */</div><div class='add'>+    LOCK(&amp;this-&gt;lock);</div><div class='add'>+</div><div class='add'>+    dict-&gt;pairs.pairs_val = GF_CALLOC(1, (this-&gt;count * sizeof(gfx_dict_pair)),</div><div class='add'>+                                      gf_common_mt_char);</div><div class='add'>+    if (!dict-&gt;pairs.pairs_val)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    dpair = this-&gt;members_list;</div><div class='add'>+    for (i = 0; i &lt; this-&gt;count; i++) {</div><div class='add'>+        xpair = &amp;dict-&gt;pairs.pairs_val[index];</div><div class='add'>+</div><div class='add'>+        xpair-&gt;key.key_val = dpair-&gt;key;</div><div class='add'>+        xpair-&gt;key.key_len = strlen(dpair-&gt;key) + 1;</div><div class='add'>+        xpair-&gt;value.type = dpair-&gt;value-&gt;data_type;</div><div class='add'>+        switch (dpair-&gt;value-&gt;data_type) {</div><div class='add'>+                /* Add more type here */</div><div class='add'>+            case GF_DATA_TYPE_INT:</div><div class='add'>+                index++;</div><div class='add'>+                xpair-&gt;value.gfx_value_u.value_int = strtoll(dpair-&gt;value-&gt;data,</div><div class='add'>+                                                             NULL, 0);</div><div class='add'>+                break;</div><div class='add'>+            case GF_DATA_TYPE_UINT:</div><div class='add'>+                index++;</div><div class='add'>+                xpair-&gt;value.gfx_value_u.value_uint = strtoull(</div><div class='add'>+                    dpair-&gt;value-&gt;data, NULL, 0);</div><div class='add'>+                break;</div><div class='add'>+            case GF_DATA_TYPE_DOUBLE:</div><div class='add'>+                index++;</div><div class='add'>+                xpair-&gt;value.gfx_value_u.value_dbl = strtod(dpair-&gt;value-&gt;data,</div><div class='add'>+                                                            NULL);</div><div class='add'>+                break;</div><div class='add'>+            case GF_DATA_TYPE_STR:</div><div class='add'>+                index++;</div><div class='add'>+                xpair-&gt;value.gfx_value_u.val_string</div><div class='add'>+                    .val_string_val = dpair-&gt;value-&gt;data;</div><div class='add'>+                xpair-&gt;value.gfx_value_u.val_string</div><div class='add'>+                    .val_string_len = dpair-&gt;value-&gt;len;</div><div class='add'>+                break;</div><div class='add'>+            case GF_DATA_TYPE_IATT:</div><div class='add'>+                index++;</div><div class='add'>+                gfx_stat_from_iattx(&amp;xpair-&gt;value.gfx_value_u.iatt,</div><div class='add'>+                                    (struct iatt *)dpair-&gt;value-&gt;data);</div><div class='add'>+                break;</div><div class='add'>+            case GF_DATA_TYPE_MDATA:</div><div class='add'>+                index++;</div><div class='add'>+                gfx_mdata_iatt_from_mdata_iatt(</div><div class='add'>+                    &amp;xpair-&gt;value.gfx_value_u.mdata_iatt,</div><div class='add'>+                    (struct mdata_iatt *)dpair-&gt;value-&gt;data);</div><div class='add'>+                break;</div><div class='add'>+            case GF_DATA_TYPE_GFUUID:</div><div class='add'>+                index++;</div><div class='add'>+                memcpy(&amp;xpair-&gt;value.gfx_value_u.uuid, dpair-&gt;value-&gt;data,</div><div class='add'>+                       sizeof(uuid_t));</div><div class='add'>+                break;</div><div class='add'>+</div><div class='add'>+            case GF_DATA_TYPE_PTR:</div><div class='add'>+            case GF_DATA_TYPE_STR_OLD:</div><div class='add'>+                index++;</div><div class='add'>+                /* Ideally, each type of data stored in dictionary</div><div class='add'>+                   should have type. A pointer type shouldn't be</div><div class='add'>+                   sent on wire */</div><div class='add'>+</div><div class='add'>+                /* This is done for backward compatibility as dict is</div><div class='add'>+                   heavily used for transporting data over wire.</div><div class='add'>+                   Ideally, wherever there is an issue, fix and</div><div class='add'>+                   move on */</div><div class='add'>+                xpair-&gt;value.gfx_value_u.other.other_val = dpair-&gt;value-&gt;data;</div><div class='add'>+                xpair-&gt;value.gfx_value_u.other.other_len = dpair-&gt;value-&gt;len;</div><div class='add'>+</div><div class='add'>+                /* Change this to INFO, after taking the above down */</div><div class='add'>+                gf_msg("dict", GF_LOG_DEBUG, EINVAL, LG_MSG_DICT_SERIAL_FAILED,</div><div class='add'>+                       "key '%s' would not be sent on wire in the future",</div><div class='add'>+                       dpair-&gt;key);</div><div class='add'>+                break;</div><div class='add'>+            default:</div><div class='add'>+                /* Unknown type and ptr type is not sent on wire */</div><div class='add'>+                gf_msg("dict", GF_LOG_WARNING, EINVAL,</div><div class='add'>+                       LG_MSG_DICT_SERIAL_FAILED,</div><div class='add'>+                       "key '%s' is not sent on wire", dpair-&gt;key);</div><div class='add'>+                break;</div><div class='add'>+        }</div><div class='add'>+        dpair = dpair-&gt;next;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    dict-&gt;pairs.pairs_len = index;</div><div class='add'>+    dict-&gt;count = index;</div><div class='add'>+</div><div class='add'>+    /* This is required mainly in the RPC layer to understand the</div><div class='add'>+       boundary for proper payload. Hence only send the size of</div><div class='add'>+       variable XDR size. ie, the formula should be:</div><div class='add'>+       xdr_size = total size - (xdr_size + count + pairs.pairs_len))  */</div><div class='add'>+    size = xdr_sizeof((xdrproc_t)xdr_gfx_dict, dict);</div><div class='add'>+</div><div class='add'>+    dict-&gt;xdr_size = (size &gt; 12) ? (size - 12) : 0;</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+out:</div><div class='add'>+    /* this can be null here, so unlock only if its not null */</div><div class='add'>+    if (this)</div><div class='add'>+        UNLOCK(&amp;this-&gt;lock);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static inline int</div><div class='add'>+xdr_to_dict(gfx_dict *dict, dict_t **to)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int index = 0;</div><div class='add'>+    char *key = NULL;</div><div class='add'>+    char *value = NULL;</div><div class='add'>+    gfx_dict_pair *xpair = NULL;</div><div class='add'>+    dict_t *this = NULL;</div><div class='add'>+    unsigned char *uuid = NULL;</div><div class='add'>+    struct iatt *iatt = NULL;</div><div class='add'>+    struct mdata_iatt *mdata_iatt = NULL;</div><div class='add'>+</div><div class='add'>+    if (!to || !dict)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    if (dict-&gt;count &lt; 0) {</div><div class='add'>+        /* indicates NULL dict was passed for encoding */</div><div class='add'>+        ret = 0;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    this = dict_new();</div><div class='add'>+    if (!this)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    for (index = 0; index &lt; dict-&gt;pairs.pairs_len; index++) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        xpair = &amp;dict-&gt;pairs.pairs_val[index];</div><div class='add'>+</div><div class='add'>+        key = xpair-&gt;key.key_val;</div><div class='add'>+        switch (xpair-&gt;value.type) {</div><div class='add'>+                /* Add more type here */</div><div class='add'>+            case GF_DATA_TYPE_INT:</div><div class='add'>+                ret = dict_set_int64(this, key,</div><div class='add'>+                                     xpair-&gt;value.gfx_value_u.value_int);</div><div class='add'>+                break;</div><div class='add'>+            case GF_DATA_TYPE_UINT:</div><div class='add'>+                ret = dict_set_uint64(this, key,</div><div class='add'>+                                      xpair-&gt;value.gfx_value_u.value_uint);</div><div class='add'>+                break;</div><div class='add'>+            case GF_DATA_TYPE_DOUBLE:</div><div class='add'>+                ret = dict_set_double(this, key,</div><div class='add'>+                                      xpair-&gt;value.gfx_value_u.value_dbl);</div><div class='add'>+                break;</div><div class='add'>+            case GF_DATA_TYPE_STR:</div><div class='add'>+                value = GF_MALLOC(</div><div class='add'>+                    xpair-&gt;value.gfx_value_u.val_string.val_string_len + 1,</div><div class='add'>+                    gf_common_mt_char);</div><div class='add'>+                if (!value) {</div><div class='add'>+                    errno = ENOMEM;</div><div class='add'>+                    goto out;</div><div class='add'>+                }</div><div class='add'>+                memcpy(value,</div><div class='add'>+                       xpair-&gt;value.gfx_value_u.val_string.val_string_val,</div><div class='add'>+                       xpair-&gt;value.gfx_value_u.val_string.val_string_len);</div><div class='add'>+                value[xpair-&gt;value.gfx_value_u.val_string.val_string_len] =</div><div class='add'>+                    '\0';</div><div class='add'>+                free(xpair-&gt;value.gfx_value_u.val_string.val_string_val);</div><div class='add'>+                ret = dict_set_dynstr(this, key, value);</div><div class='add'>+                break;</div><div class='add'>+            case GF_DATA_TYPE_GFUUID:</div><div class='add'>+                uuid = GF_MALLOC(sizeof(uuid_t), gf_common_mt_uuid_t);</div><div class='add'>+                if (!uuid) {</div><div class='add'>+                    errno = ENOMEM;</div><div class='add'>+                    goto out;</div><div class='add'>+                }</div><div class='add'>+                memcpy(uuid, xpair-&gt;value.gfx_value_u.uuid, sizeof(uuid_t));</div><div class='add'>+                ret = dict_set_gfuuid(this, key, uuid, false);</div><div class='add'>+                break;</div><div class='add'>+            case GF_DATA_TYPE_IATT:</div><div class='add'>+                iatt = GF_CALLOC(1, sizeof(struct iatt), gf_common_mt_char);</div><div class='add'>+                if (!iatt) {</div><div class='add'>+                    errno = ENOMEM;</div><div class='add'>+                    goto out;</div><div class='add'>+                }</div><div class='add'>+                gfx_stat_to_iattx(&amp;xpair-&gt;value.gfx_value_u.iatt, iatt);</div><div class='add'>+                ret = dict_set_iatt(this, key, iatt, false);</div><div class='add'>+                break;</div><div class='add'>+            case GF_DATA_TYPE_MDATA:</div><div class='add'>+                mdata_iatt = GF_CALLOC(1, sizeof(struct mdata_iatt),</div><div class='add'>+                                       gf_common_mt_char);</div><div class='add'>+                if (!mdata_iatt) {</div><div class='add'>+                    errno = ENOMEM;</div><div class='add'>+                    gf_msg(THIS-&gt;name, GF_LOG_ERROR, ENOMEM, LG_MSG_NO_MEMORY,</div><div class='add'>+                           "failed to allocate memory. key: %s", key);</div><div class='add'>+                    ret = -1;</div><div class='add'>+                    goto out;</div><div class='add'>+                }</div><div class='add'>+                gfx_mdata_iatt_to_mdata_iatt(</div><div class='add'>+                    &amp;xpair-&gt;value.gfx_value_u.mdata_iatt, mdata_iatt);</div><div class='add'>+                ret = dict_set_mdata(this, key, mdata_iatt, false);</div><div class='add'>+                if (ret != 0) {</div><div class='add'>+                    GF_FREE(mdata_iatt);</div><div class='add'>+                    gf_msg(THIS-&gt;name, GF_LOG_ERROR, ENOMEM,</div><div class='add'>+                           LG_MSG_DICT_SET_FAILED,</div><div class='add'>+                           "failed to set the key (%s)"</div><div class='add'>+                           " into dict",</div><div class='add'>+                           key);</div><div class='add'>+                    ret = -1;</div><div class='add'>+                    goto out;</div><div class='add'>+                }</div><div class='add'>+                break;</div><div class='add'>+            case GF_DATA_TYPE_PTR:</div><div class='add'>+            case GF_DATA_TYPE_STR_OLD:</div><div class='add'>+                value = GF_MALLOC(xpair-&gt;value.gfx_value_u.other.other_len + 1,</div><div class='add'>+                                  gf_common_mt_char);</div><div class='add'>+                if (!value) {</div><div class='add'>+                    errno = ENOMEM;</div><div class='add'>+                    goto out;</div><div class='add'>+                }</div><div class='add'>+                memcpy(value, xpair-&gt;value.gfx_value_u.other.other_val,</div><div class='add'>+                       xpair-&gt;value.gfx_value_u.other.other_len);</div><div class='add'>+                value[xpair-&gt;value.gfx_value_u.other.other_len] = '\0';</div><div class='add'>+                free(xpair-&gt;value.gfx_value_u.other.other_val);</div><div class='add'>+                ret = dict_set_dynptr(this, key, value,</div><div class='add'>+                                      xpair-&gt;value.gfx_value_u.other.other_len);</div><div class='add'>+                break;</div><div class='add'>+            default:</div><div class='add'>+                ret = 0;</div><div class='add'>+                /* Unknown type and ptr type is not sent on wire */</div><div class='add'>+                break;</div><div class='add'>+        }</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_msg_debug(THIS-&gt;name, ENOMEM,</div><div class='add'>+                         "failed to set the key (%s) into dict", key);</div><div class='add'>+        }</div><div class='add'>+        free(xpair-&gt;key.key_val);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    free(dict-&gt;pairs.pairs_val);</div><div class='add'>+    ret = 0;</div><div class='add'>+</div><div class='add'>+    /* If everything is fine, assign the dictionary to target */</div><div class='add'>+    *to = this;</div><div class='add'>+    this = NULL;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (this)</div><div class='add'>+        dict_unref(this);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> #endif /* !_GLUSTERFS3_H */</div><div class='head'>diff --git a/rpc/xdr/src/glusterfs3.x b/rpc/xdr/src/glusterfs3.x<br/>deleted file mode 100644<br/>index cafe965efaf..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/rpc/xdr/src/glusterfs3.x?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>rpc/xdr/src/glusterfs3.x</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,765 +0,0 @@</div><div class='del'>-#define GF_REQUEST_MAXGROUPS    16</div><div class='del'>-struct gf_statfs {</div><div class='del'>-	unsigned hyper bsize;</div><div class='del'>-	unsigned hyper frsize;</div><div class='del'>-	unsigned hyper blocks;</div><div class='del'>-	unsigned hyper bfree;</div><div class='del'>-	unsigned hyper bavail;</div><div class='del'>-	unsigned hyper files;</div><div class='del'>-	unsigned hyper ffree;</div><div class='del'>-	unsigned hyper favail;</div><div class='del'>-	unsigned hyper fsid;</div><div class='del'>-	unsigned hyper flag;</div><div class='del'>-	unsigned hyper namemax;</div><div class='del'>-};</div><div class='del'>-</div><div class='del'>-struct gf_flock {</div><div class='del'>-	unsigned int   type;</div><div class='del'>-	unsigned int   whence;</div><div class='del'>-	unsigned hyper start;</div><div class='del'>-	unsigned hyper len;</div><div class='del'>-        unsigned int   pid;</div><div class='del'>-} ;</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-struct gf_iatt {</div><div class='del'>-        unsigned hyper     ia_ino;        /* inode number */</div><div class='del'>-        unsigned hyper     ia_gen;        /* generation number */</div><div class='del'>-        unsigned hyper     ia_dev;        /* backing device ID */</div><div class='del'>-        unsigned int       mode;          /* mode (type + protection )*/</div><div class='del'>-        unsigned int       ia_nlink;      /* Link count */</div><div class='del'>-        unsigned int       ia_uid;        /* user ID of owner */</div><div class='del'>-        unsigned int       ia_gid;        /* group ID of owner */</div><div class='del'>-        unsigned hyper     ia_rdev;       /* device ID (if special file) */</div><div class='del'>-        unsigned hyper     ia_size;       /* file size in bytes */</div><div class='del'>-        unsigned int       ia_blksize;    /* blocksize for filesystem I/O */</div><div class='del'>-        unsigned hyper     ia_blocks;     /* number of 512B blocks allocated */</div><div class='del'>-        unsigned int       ia_atime;      /* last access time */</div><div class='del'>-        unsigned int       ia_atime_nsec;</div><div class='del'>-        unsigned int       ia_mtime;      /* last modification time */</div><div class='del'>-        unsigned int       ia_mtime_nsec;</div><div class='del'>-        unsigned int       ia_ctime;      /* last status change time */</div><div class='del'>-        unsigned int       ia_ctime_nsec;</div><div class='del'>-};</div><div class='del'>-</div><div class='del'>-struct gfs3_stat_req {</div><div class='del'>-        unsigned hyper gfs_id;</div><div class='del'>-	unsigned hyper ino;</div><div class='del'>-        unsigned hyper gen;</div><div class='del'>-        string         path&lt;&gt;;     /* NULL terminated */</div><div class='del'>-};</div><div class='del'>-struct gfs3_stat_rsp {</div><div class='del'>-        unsigned hyper gfs_id;</div><div class='del'>-        int    op_ret;</div><div class='del'>-        int    op_errno;</div><div class='del'>-	struct gf_iatt stat;</div><div class='del'>-} ;</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-struct gfs3_readlink_req {</div><div class='del'>-        unsigned hyper gfs_id;</div><div class='del'>-	unsigned hyper ino;</div><div class='del'>-        unsigned hyper gen;</div><div class='del'>-	unsigned int   size;</div><div class='del'>-	string         path&lt;&gt;;     /* NULL terminated */</div><div class='del'>-}  ;</div><div class='del'>- struct gfs3_readlink_rsp {</div><div class='del'>-        unsigned hyper gfs_id;</div><div class='del'>-        int    op_ret;</div><div class='del'>-        int    op_errno;</div><div class='del'>-        struct gf_iatt buf;</div><div class='del'>-        string      path&lt;&gt;; /* NULL terminated */</div><div class='del'>-} ;</div><div class='del'>-</div><div class='del'>-</div><div class='del'>- struct gfs3_mknod_req {</div><div class='del'>-        unsigned hyper gfs_id;</div><div class='del'>-	unsigned hyper par;</div><div class='del'>-        unsigned hyper gen;</div><div class='del'>-	unsigned hyper dev;</div><div class='del'>-	unsigned int mode;</div><div class='del'>-	string     path&lt;&gt;;     /* NULL terminated */</div><div class='del'>-	string     bname&lt;&gt;; /* NULL terminated */</div><div class='del'>-} ;</div><div class='del'>- struct gfs3_mknod_rsp {</div><div class='del'>-        unsigned hyper gfs_id;</div><div class='del'>-        int    op_ret;</div><div class='del'>-        int    op_errno;</div><div class='del'>-	struct gf_iatt stat;</div><div class='del'>-        struct gf_iatt preparent;</div><div class='del'>-        struct gf_iatt postparent;</div><div class='del'>-};</div><div class='del'>-</div><div class='del'>-</div><div class='del'>- struct  gfs3_mkdir_req {</div><div class='del'>-        unsigned hyper gfs_id;</div><div class='del'>-	unsigned hyper par;</div><div class='del'>-        unsigned hyper gen;</div><div class='del'>-	unsigned int mode;</div><div class='del'>-	string     path&lt;&gt;;     /* NULL terminated */</div><div class='del'>-	string     bname&lt;&gt;; /* NULL terminated */</div><div class='del'>-} ;</div><div class='del'>- struct  gfs3_mkdir_rsp {</div><div class='del'>-        unsigned hyper gfs_id;</div><div class='del'>-        int    op_ret;</div><div class='del'>-        int    op_errno;</div><div class='del'>-	struct gf_iatt stat;</div><div class='del'>-        struct gf_iatt preparent;</div><div class='del'>-        struct gf_iatt postparent;</div><div class='del'>-} ;</div><div class='del'>-</div><div class='del'>-</div><div class='del'>- struct   gfs3_unlink_req {</div><div class='del'>-        unsigned hyper gfs_id;</div><div class='del'>-	unsigned hyper par;</div><div class='del'>-        unsigned hyper gen;</div><div class='del'>-	string     path&lt;&gt;;     /* NULL terminated */</div><div class='del'>-	string     bname&lt;&gt;; /* NULL terminated */</div><div class='del'>-};</div><div class='del'>- struct   gfs3_unlink_rsp {</div><div class='del'>-        unsigned hyper gfs_id;</div><div class='del'>-        int    op_ret;</div><div class='del'>-        int    op_errno;</div><div class='del'>-        struct gf_iatt preparent;</div><div class='del'>-        struct gf_iatt postparent;</div><div class='del'>-};</div><div class='del'>-</div><div class='del'>-</div><div class='del'>- struct   gfs3_rmdir_req {</div><div class='del'>-        unsigned hyper gfs_id;</div><div class='del'>-	unsigned hyper par;</div><div class='del'>-        unsigned hyper gen;</div><div class='del'>-	string     path&lt;&gt;;</div><div class='del'>-	string     bname&lt;&gt;; /* NULL terminated */</div><div class='del'>-};</div><div class='del'>- struct   gfs3_rmdir_rsp {</div><div class='del'>-        unsigned hyper gfs_id;</div><div class='del'>-        int    op_ret;</div><div class='del'>-        int    op_errno;</div><div class='del'>-        struct gf_iatt preparent;</div><div class='del'>-        struct gf_iatt postparent;</div><div class='del'>-};</div><div class='del'>-</div><div class='del'>-</div><div class='del'>- struct   gfs3_symlink_req {</div><div class='del'>-        unsigned hyper gfs_id;</div><div class='del'>-	unsigned hyper par;</div><div class='del'>-        unsigned hyper gen;</div><div class='del'>-	string     path&lt;&gt;;</div><div class='del'>-	string     bname&lt;&gt;;</div><div class='del'>-	string     linkname&lt;&gt;;</div><div class='del'>-};</div><div class='del'>- struct  gfs3_symlink_rsp {</div><div class='del'>-        unsigned hyper gfs_id;</div><div class='del'>-        int    op_ret;</div><div class='del'>-        int    op_errno;</div><div class='del'>-	struct gf_iatt stat;</div><div class='del'>-        struct gf_iatt preparent;</div><div class='del'>-        struct gf_iatt postparent;</div><div class='del'>-};</div><div class='del'>-</div><div class='del'>-</div><div class='del'>- struct   gfs3_rename_req {</div><div class='del'>-        unsigned hyper gfs_id;</div><div class='del'>-	unsigned hyper   oldpar;</div><div class='del'>-        unsigned hyper   oldgen;</div><div class='del'>-	unsigned hyper   newpar;</div><div class='del'>-        unsigned hyper   newgen;</div><div class='del'>-	string       oldpath&lt;&gt;;</div><div class='del'>-	string       oldbname&lt;&gt;; /* NULL terminated */</div><div class='del'>-	string       newpath&lt;&gt;;</div><div class='del'>-	string       newbname&lt;&gt;; /* NULL terminated */</div><div class='del'>-};</div><div class='del'>- struct   gfs3_rename_rsp {</div><div class='del'>-        unsigned hyper gfs_id;</div><div class='del'>-        int    op_ret;</div><div class='del'>-        int    op_errno;</div><div class='del'>-	struct gf_iatt stat;</div><div class='del'>-        struct gf_iatt preoldparent;</div><div class='del'>-        struct gf_iatt postoldparent;</div><div class='del'>-        struct gf_iatt prenewparent;</div><div class='del'>-        struct gf_iatt postnewparent;</div><div class='del'>-};</div><div class='del'>-</div><div class='del'>-</div><div class='del'>- struct  gfs3_link_req {</div><div class='del'>-        unsigned hyper gfs_id;</div><div class='del'>-	unsigned hyper   oldino;</div><div class='del'>-        unsigned hyper   oldgen;</div><div class='del'>-	unsigned hyper   newpar;</div><div class='del'>-        unsigned hyper   newgen;</div><div class='del'>-	string       oldpath&lt;&gt;;</div><div class='del'>-	string       newpath&lt;&gt;;</div><div class='del'>-	string       newbname&lt;&gt;;</div><div class='del'>-};</div><div class='del'>- struct   gfs3_link_rsp {</div><div class='del'>-        unsigned hyper gfs_id;</div><div class='del'>-        int    op_ret;</div><div class='del'>-        int    op_errno;</div><div class='del'>-	struct gf_iatt stat;</div><div class='del'>-        struct gf_iatt preparent;</div><div class='del'>-        struct gf_iatt postparent;</div><div class='del'>-};</div><div class='del'>-</div><div class='del'>- struct   gfs3_truncate_req {</div><div class='del'>-        unsigned hyper gfs_id;</div><div class='del'>-	unsigned hyper ino;</div><div class='del'>-        unsigned hyper gen;</div><div class='del'>-	unsigned hyper offset;</div><div class='del'>-	string     path&lt;&gt;;</div><div class='del'>-};</div><div class='del'>- struct   gfs3_truncate_rsp {</div><div class='del'>-        unsigned hyper gfs_id;</div><div class='del'>-        int    op_ret;</div><div class='del'>-        int    op_errno;</div><div class='del'>-	struct gf_iatt prestat;</div><div class='del'>-        struct gf_iatt poststat;</div><div class='del'>-};</div><div class='del'>-</div><div class='del'>-</div><div class='del'>- struct   gfs3_open_req {</div><div class='del'>-        unsigned hyper gfs_id;</div><div class='del'>-	unsigned hyper ino;</div><div class='del'>-        unsigned hyper gen;</div><div class='del'>-	unsigned int flags;</div><div class='del'>-        unsigned int wbflags;</div><div class='del'>-	string     path&lt;&gt;;</div><div class='del'>-};</div><div class='del'>- struct   gfs3_open_rsp {</div><div class='del'>-        unsigned hyper gfs_id;</div><div class='del'>-        int    op_ret;</div><div class='del'>-        int    op_errno;</div><div class='del'>-	hyper fd;</div><div class='del'>-};</div><div class='del'>-</div><div class='del'>-</div><div class='del'>- struct   gfs3_read_req {</div><div class='del'>-        unsigned hyper gfs_id;</div><div class='del'>-	unsigned hyper ino;</div><div class='del'>-        unsigned hyper gen;</div><div class='del'>-	hyper  fd;</div><div class='del'>-	unsigned hyper offset;</div><div class='del'>-	unsigned int size;</div><div class='del'>-};</div><div class='del'>- struct  gfs3_read_rsp {</div><div class='del'>-        unsigned hyper gfs_id;</div><div class='del'>-        int    op_ret;</div><div class='del'>-        int    op_errno;</div><div class='del'>-	struct gf_iatt stat;</div><div class='del'>-	string buf&lt;&gt;;</div><div class='del'>-} ;</div><div class='del'>-</div><div class='del'>-struct   gfs3_lookup_req {</div><div class='del'>-        unsigned hyper gfs_id;</div><div class='del'>-	unsigned hyper ino; /* NOTE: used only in case of 'root' lookup */</div><div class='del'>-	unsigned hyper par;</div><div class='del'>-        unsigned hyper gen;</div><div class='del'>-	unsigned int flags;</div><div class='del'>-	string     path&lt;&gt;;</div><div class='del'>-	string     bname&lt;&gt;;</div><div class='del'>-        opaque     dict&lt;&gt;;</div><div class='del'>-};</div><div class='del'>- struct   gfs3_lookup_rsp {</div><div class='del'>-        unsigned hyper gfs_id;</div><div class='del'>-        int    op_ret;</div><div class='del'>-        int    op_errno;</div><div class='del'>-	struct gf_iatt stat;</div><div class='del'>-        struct gf_iatt postparent;</div><div class='del'>-	opaque             dict&lt;&gt;;</div><div class='del'>-} ;</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-</div><div class='del'>- struct   gfs3_write_req {</div><div class='del'>-        unsigned hyper gfs_id;</div><div class='del'>-	unsigned hyper ino;</div><div class='del'>-        unsigned hyper gen;</div><div class='del'>-	hyper  fd;</div><div class='del'>-	unsigned hyper offset;</div><div class='del'>-	unsigned int size;</div><div class='del'>-};</div><div class='del'>- struct gfs3_write_rsp {</div><div class='del'>-        unsigned hyper gfs_id;</div><div class='del'>-        int    op_ret;</div><div class='del'>-        int    op_errno;</div><div class='del'>-	struct gf_iatt prestat;</div><div class='del'>-        struct gf_iatt poststat;</div><div class='del'>-} ;</div><div class='del'>-</div><div class='del'>-</div><div class='del'>- struct gfs3_statfs_req  {</div><div class='del'>-        unsigned hyper gfs_id;</div><div class='del'>-	unsigned hyper ino;</div><div class='del'>-        unsigned hyper gen;</div><div class='del'>-	string     path&lt;&gt;;</div><div class='del'>-}  ;</div><div class='del'>- struct gfs3_statfs_rsp {</div><div class='del'>-        unsigned hyper gfs_id;</div><div class='del'>-        int    op_ret;</div><div class='del'>-        int    op_errno;</div><div class='del'>-	struct gf_statfs statfs;</div><div class='del'>-}  ;</div><div class='del'>-</div><div class='del'>- struct gfs3_lk_req {</div><div class='del'>-        unsigned hyper gfs_id;</div><div class='del'>-	unsigned hyper        ino;</div><div class='del'>-        unsigned hyper        gen;</div><div class='del'>-	hyper         fd;</div><div class='del'>-	unsigned int        cmd;</div><div class='del'>-	unsigned int        type;</div><div class='del'>-	struct gf_flock flock;</div><div class='del'>-}  ;</div><div class='del'>- struct gfs3_lk_rsp {</div><div class='del'>-        unsigned hyper gfs_id;</div><div class='del'>-        int    op_ret;</div><div class='del'>-        int    op_errno;</div><div class='del'>-	struct gf_flock flock;</div><div class='del'>-}  ;</div><div class='del'>-</div><div class='del'>- struct gfs3_inodelk_req {</div><div class='del'>-        unsigned hyper gfs_id;</div><div class='del'>-	unsigned hyper ino;</div><div class='del'>-        unsigned hyper gen;</div><div class='del'>-	unsigned int cmd;</div><div class='del'>-	unsigned int type;</div><div class='del'>-	struct gf_flock flock;</div><div class='del'>-	string     path&lt;&gt;;</div><div class='del'>-        string     volume&lt;&gt;;</div><div class='del'>-}  ;</div><div class='del'>-</div><div class='del'>-struct   gfs3_finodelk_req {</div><div class='del'>-        unsigned hyper gfs_id;</div><div class='del'>-	unsigned hyper ino;</div><div class='del'>-        unsigned hyper gen;</div><div class='del'>-	hyper  fd;</div><div class='del'>-	unsigned int cmd;</div><div class='del'>-	unsigned int type;</div><div class='del'>-	struct gf_flock flock;</div><div class='del'>-        string volume&lt;&gt;;</div><div class='del'>-} ;</div><div class='del'>-</div><div class='del'>-</div><div class='del'>- struct gfs3_flush_req {</div><div class='del'>-        unsigned hyper gfs_id;</div><div class='del'>-	unsigned hyper ino;</div><div class='del'>-        unsigned hyper gen;</div><div class='del'>-	hyper  fd;</div><div class='del'>-}  ;</div><div class='del'>-</div><div class='del'>-</div><div class='del'>- struct gfs3_fsync_req {</div><div class='del'>-        unsigned hyper gfs_id;</div><div class='del'>-	unsigned hyper ino;</div><div class='del'>-        unsigned hyper gen;</div><div class='del'>-	hyper  fd;</div><div class='del'>-	unsigned int data;</div><div class='del'>-}  ;</div><div class='del'>- struct gfs3_fsync_rsp {</div><div class='del'>-        unsigned hyper gfs_id;</div><div class='del'>-        int    op_ret;</div><div class='del'>-        int    op_errno;</div><div class='del'>-        struct gf_iatt prestat;</div><div class='del'>-        struct gf_iatt poststat;</div><div class='del'>-}  ;</div><div class='del'>-</div><div class='del'>-</div><div class='del'>- struct gfs3_setxattr_req {</div><div class='del'>-        unsigned hyper gfs_id;</div><div class='del'>-	unsigned hyper ino;</div><div class='del'>-        unsigned hyper gen;</div><div class='del'>-	unsigned int flags;</div><div class='del'>-        opaque     dict&lt;&gt;;</div><div class='del'>-	string     path&lt;&gt;;</div><div class='del'>-}  ;</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-</div><div class='del'>- struct gfs3_fsetxattr_req {</div><div class='del'>-        unsigned hyper gfs_id;</div><div class='del'>-        unsigned hyper ino;</div><div class='del'>-        unsigned hyper gen;</div><div class='del'>-	hyper  fd;</div><div class='del'>-	unsigned int flags;</div><div class='del'>-        opaque     dict&lt;&gt;;</div><div class='del'>-}  ;</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-</div><div class='del'>- struct gfs3_xattrop_req {</div><div class='del'>-        unsigned hyper gfs_id;</div><div class='del'>-	unsigned hyper ino;</div><div class='del'>-        unsigned hyper gen;</div><div class='del'>-	unsigned int flags;</div><div class='del'>-        opaque     dict&lt;&gt;;</div><div class='del'>-	string     path&lt;&gt;;</div><div class='del'>-}  ;</div><div class='del'>-</div><div class='del'>- struct gfs3_xattrop_rsp  {</div><div class='del'>-        unsigned hyper gfs_id;</div><div class='del'>-        int    op_ret;</div><div class='del'>-        int    op_errno;</div><div class='del'>-	opaque  dict&lt;&gt;;</div><div class='del'>-}  ;</div><div class='del'>-</div><div class='del'>-</div><div class='del'>- struct gfs3_fxattrop_req {</div><div class='del'>-        unsigned hyper gfs_id;</div><div class='del'>-	unsigned hyper ino;</div><div class='del'>-        unsigned hyper gen;</div><div class='del'>-	hyper  fd;</div><div class='del'>-	unsigned int flags;</div><div class='del'>-	opaque     dict&lt;&gt;;</div><div class='del'>-}  ;</div><div class='del'>-</div><div class='del'>- struct gfs3_fxattrop_rsp  {</div><div class='del'>-        unsigned hyper gfs_id;</div><div class='del'>-        int    op_ret;</div><div class='del'>-        int    op_errno;</div><div class='del'>-	opaque  dict&lt;&gt;;</div><div class='del'>-}  ;</div><div class='del'>-</div><div class='del'>-</div><div class='del'>- struct gfs3_getxattr_req  {</div><div class='del'>-        unsigned hyper gfs_id;</div><div class='del'>-	unsigned hyper ino;</div><div class='del'>-        unsigned hyper gen;</div><div class='del'>-	unsigned int namelen;</div><div class='del'>-	string     path&lt;&gt;;</div><div class='del'>-	string     name&lt;&gt;;</div><div class='del'>-}  ;</div><div class='del'>- struct gfs3_getxattr_rsp {</div><div class='del'>-        unsigned hyper gfs_id;</div><div class='del'>-        int    op_ret;</div><div class='del'>-        int    op_errno;</div><div class='del'>-	opaque     dict&lt;&gt;;</div><div class='del'>-}  ;</div><div class='del'>-</div><div class='del'>-</div><div class='del'>- struct gfs3_fgetxattr_req  {</div><div class='del'>-        unsigned hyper gfs_id;</div><div class='del'>-        unsigned hyper ino;</div><div class='del'>-        unsigned hyper gen;</div><div class='del'>-	hyper  fd;</div><div class='del'>-        unsigned int namelen;</div><div class='del'>-	string     name&lt;&gt;;</div><div class='del'>-}  ;</div><div class='del'>- struct gfs3_fgetxattr_rsp {</div><div class='del'>-        unsigned hyper gfs_id;</div><div class='del'>-        int    op_ret;</div><div class='del'>-        int    op_errno;</div><div class='del'>-        opaque     dict&lt;&gt;;</div><div class='del'>-}  ;</div><div class='del'>-</div><div class='del'>-</div><div class='del'>- struct gfs3_removexattr_req {</div><div class='del'>-        unsigned hyper gfs_id;</div><div class='del'>-	unsigned hyper ino;</div><div class='del'>-        unsigned hyper gen;</div><div class='del'>-	string     path&lt;&gt;;</div><div class='del'>-	string     name&lt;&gt;;</div><div class='del'>-}  ;</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-</div><div class='del'>- struct gfs3_opendir_req {</div><div class='del'>-        unsigned hyper gfs_id;</div><div class='del'>-	unsigned hyper ino;</div><div class='del'>-        unsigned hyper gen;</div><div class='del'>-	string     path&lt;&gt;;</div><div class='del'>-}  ;</div><div class='del'>- struct gfs3_opendir_rsp {</div><div class='del'>-        unsigned hyper gfs_id;</div><div class='del'>-        int    op_ret;</div><div class='del'>-        int    op_errno;</div><div class='del'>-	hyper fd;</div><div class='del'>-}  ;</div><div class='del'>-</div><div class='del'>-</div><div class='del'>- struct gfs3_fsyncdir_req {</div><div class='del'>-        unsigned hyper gfs_id;</div><div class='del'>-	unsigned hyper ino;</div><div class='del'>-        unsigned hyper gen;</div><div class='del'>-	hyper  fd;</div><div class='del'>-	int  data;</div><div class='del'>-}  ;</div><div class='del'>-</div><div class='del'>- struct   gfs3_readdir_req  {</div><div class='del'>-        unsigned hyper gfs_id;</div><div class='del'>-	unsigned hyper ino;</div><div class='del'>-        unsigned hyper gen;</div><div class='del'>-	hyper  fd;</div><div class='del'>-	unsigned hyper offset;</div><div class='del'>-	unsigned int size;</div><div class='del'>-};</div><div class='del'>-struct gfs3_dirlist {</div><div class='del'>-	unsigned hyper  d_ino;</div><div class='del'>-	unsigned hyper  d_off;</div><div class='del'>-        unsigned int    d_len;</div><div class='del'>-	unsigned int    d_type;</div><div class='del'>-	char           *name;</div><div class='del'>-	struct gfs3_dirlist *nextentry;</div><div class='del'>-};</div><div class='del'>-</div><div class='del'>-struct gfs3_readdir_rsp {</div><div class='del'>-        unsigned hyper gfs_id;</div><div class='del'>-        int    op_ret;</div><div class='del'>-        int    op_errno;</div><div class='del'>-        struct gfs3_dirlist reply;</div><div class='del'>-};</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-struct gfs3_dirplist {</div><div class='del'>-	unsigned hyper  d_ino;</div><div class='del'>-	unsigned hyper  d_off;</div><div class='del'>-        unsigned int    d_len;</div><div class='del'>-	unsigned int    d_type;</div><div class='del'>-	char           *name;</div><div class='del'>-	struct gf_iatt  name_attributes;</div><div class='del'>-	struct gfs3_dirplist *nextentry;</div><div class='del'>-};</div><div class='del'>-</div><div class='del'>-struct gfs3_readdirp_rsp {</div><div class='del'>-        unsigned hyper gfs_id;</div><div class='del'>-        int    op_ret;</div><div class='del'>-        int    op_errno;</div><div class='del'>-	struct gfs3_dirlistp reply;</div><div class='del'>-};</div><div class='del'>-</div><div class='del'>-</div><div class='del'>- struct gfs3_readdirp_req {</div><div class='del'>-        unsigned hyper gfs_id;</div><div class='del'>-	unsigned hyper ino;</div><div class='del'>-        unsigned hyper gen;</div><div class='del'>-	hyper  fd;</div><div class='del'>-	unsigned hyper offset;</div><div class='del'>-	unsigned int size;</div><div class='del'>-}  ;</div><div class='del'>-</div><div class='del'>-</div><div class='del'>- struct gf_setvolume_req {</div><div class='del'>-        unsigned hyper gfs_id;</div><div class='del'>-        opaque dict&lt;&gt;;</div><div class='del'>-}  ;</div><div class='del'>- struct  gf_setvolume_rsp {</div><div class='del'>-        unsigned hyper gfs_id;</div><div class='del'>-        int    op_ret;</div><div class='del'>-        int    op_errno;</div><div class='del'>-        opaque dict&lt;&gt;;</div><div class='del'>-} ;</div><div class='del'>-</div><div class='del'>-struct gfs3_access_req  {</div><div class='del'>-        unsigned hyper gfs_id;</div><div class='del'>-	unsigned hyper ino;</div><div class='del'>-        unsigned hyper gen;</div><div class='del'>-	unsigned int mask;</div><div class='del'>-	string     path&lt;&gt;;</div><div class='del'>-} ;</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-struct gfs3_create_req {</div><div class='del'>-        unsigned hyper gfs_id;</div><div class='del'>-	unsigned hyper par;</div><div class='del'>-        unsigned hyper gen;</div><div class='del'>-	unsigned int flags;</div><div class='del'>-	unsigned int mode;</div><div class='del'>-	string     path&lt;&gt;;</div><div class='del'>-	string     bname&lt;&gt;;</div><div class='del'>-}  ;</div><div class='del'>-struct  gfs3_create_rsp {</div><div class='del'>-        unsigned hyper gfs_id;</div><div class='del'>-        int    op_ret;</div><div class='del'>-        int    op_errno;</div><div class='del'>-	struct gf_iatt stat;</div><div class='del'>-	unsigned hyper       fd;</div><div class='del'>-        struct gf_iatt preparent;</div><div class='del'>-        struct gf_iatt postparent;</div><div class='del'>-} ;</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-struct   gfs3_ftruncate_req  {</div><div class='del'>-        unsigned hyper gfs_id;</div><div class='del'>-	unsigned hyper ino;</div><div class='del'>-        unsigned hyper gen;</div><div class='del'>-	hyper  fd;</div><div class='del'>-	unsigned hyper offset;</div><div class='del'>-} ;</div><div class='del'>-struct   gfs3_ftruncate_rsp {</div><div class='del'>-        unsigned hyper gfs_id;</div><div class='del'>-        int    op_ret;</div><div class='del'>-        int    op_errno;</div><div class='del'>-	struct gf_iatt prestat;</div><div class='del'>-        struct gf_iatt poststat;</div><div class='del'>-} ;</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-struct gfs3_fstat_req {</div><div class='del'>-        unsigned hyper gfs_id;</div><div class='del'>-	unsigned hyper ino;</div><div class='del'>-        unsigned hyper gen;</div><div class='del'>-	hyper  fd;</div><div class='del'>-}  ;</div><div class='del'>- struct gfs3_fstat_rsp {</div><div class='del'>-        unsigned hyper gfs_id;</div><div class='del'>-        int    op_ret;</div><div class='del'>-        int    op_errno;</div><div class='del'>-	struct gf_iatt stat;</div><div class='del'>-}  ;</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-</div><div class='del'>- struct   gfs3_entrylk_req {</div><div class='del'>-        unsigned hyper gfs_id;</div><div class='del'>-	unsigned hyper  ino;</div><div class='del'>-        unsigned hyper  gen;</div><div class='del'>-	unsigned int  cmd;</div><div class='del'>-	unsigned int  type;</div><div class='del'>-	unsigned hyper  namelen;</div><div class='del'>-	string      path&lt;&gt;;</div><div class='del'>-	string      name&lt;&gt;;</div><div class='del'>-        string      volume&lt;&gt;;</div><div class='del'>-};</div><div class='del'>-</div><div class='del'>- struct   gfs3_fentrylk_req {</div><div class='del'>-        unsigned hyper gfs_id;</div><div class='del'>-	unsigned hyper  ino;</div><div class='del'>-        unsigned hyper  gen;</div><div class='del'>-	hyper   fd;</div><div class='del'>-	unsigned int  cmd;</div><div class='del'>-	unsigned int  type;</div><div class='del'>-	unsigned hyper  namelen;</div><div class='del'>-	string      name&lt;&gt;;</div><div class='del'>-        string      volume&lt;&gt;;</div><div class='del'>-};</div><div class='del'>-</div><div class='del'>-</div><div class='del'>- struct gfs3_setattr_req {</div><div class='del'>-        unsigned hyper gfs_id;</div><div class='del'>-        unsigned hyper       ino;</div><div class='del'>-        unsigned hyper       gen;</div><div class='del'>-        struct gf_iatt stbuf;</div><div class='del'>-        int        valid;</div><div class='del'>-        string           path&lt;&gt;;</div><div class='del'>-}  ;</div><div class='del'>- struct gfs3_setattr_rsp {</div><div class='del'>-        unsigned hyper gfs_id;</div><div class='del'>-        int    op_ret;</div><div class='del'>-        int    op_errno;</div><div class='del'>-        struct gf_iatt statpre;</div><div class='del'>-        struct gf_iatt statpost;</div><div class='del'>-}  ;</div><div class='del'>-</div><div class='del'>- struct gfs3_fsetattr_req {</div><div class='del'>-        unsigned hyper gfs_id;</div><div class='del'>-        hyper        fd;</div><div class='del'>-        struct gf_iatt stbuf;</div><div class='del'>-        int        valid;</div><div class='del'>-}  ;</div><div class='del'>- struct gfs3_fsetattr_rsp {</div><div class='del'>-        unsigned hyper gfs_id;</div><div class='del'>-        int    op_ret;</div><div class='del'>-        int    op_errno;</div><div class='del'>-        struct gf_iatt statpre;</div><div class='del'>-        struct gf_iatt statpost;</div><div class='del'>-}  ;</div><div class='del'>-</div><div class='del'>- struct gfs3_rchecksum_req {</div><div class='del'>-        unsigned hyper gfs_id;</div><div class='del'>-        hyper   fd;</div><div class='del'>-        unsigned hyper  offset;</div><div class='del'>-        unsigned int  len;</div><div class='del'>-}  ;</div><div class='del'>- struct gfs3_rchecksum_rsp {</div><div class='del'>-        unsigned hyper gfs_id;</div><div class='del'>-        int    op_ret;</div><div class='del'>-        int    op_errno;</div><div class='del'>-        unsigned int weak_checksum;</div><div class='del'>-        opaque   strong_checksum&lt;&gt;;</div><div class='del'>-}  ;</div><div class='del'>- struct gfs3_releasedir_req {</div><div class='del'>-        unsigned hyper gfs_id;</div><div class='del'>-	unsigned hyper ino;</div><div class='del'>-        unsigned hyper gen;</div><div class='del'>-	hyper  fd;</div><div class='del'>-}  ;</div><div class='del'>-</div><div class='del'>-struct gfs3_release_req {</div><div class='del'>-        unsigned hyper gfs_id;</div><div class='del'>-	unsigned hyper ino;</div><div class='del'>-        unsigned hyper gen;</div><div class='del'>-	hyper  fd;</div><div class='del'>-}  ;</div><div class='del'>-</div><div class='del'>-</div><div class='del'>- struct gf_getspec_req {</div><div class='del'>-        unsigned hyper gfs_id;</div><div class='del'>-	unsigned int flags;</div><div class='del'>-	string     key&lt;&gt;;</div><div class='del'>-}  ;</div><div class='del'>- struct  gf_getspec_rsp {</div><div class='del'>-        unsigned hyper gfs_id;</div><div class='del'>-        int    op_ret;</div><div class='del'>-        int    op_errno;</div><div class='del'>-	string spec&lt;&gt;;</div><div class='del'>-} ;</div><div class='del'>-</div><div class='del'>-</div><div class='del'>- struct   gf_log_req {</div><div class='del'>-        unsigned hyper gfs_id;</div><div class='del'>-	opaque     msg&lt;&gt;;</div><div class='del'>-};</div><div class='del'>-</div><div class='del'>- struct gf_notify_req {</div><div class='del'>-        unsigned hyper gfs_id;</div><div class='del'>-	unsigned int  flags;</div><div class='del'>-        string buf&lt;&gt;;</div><div class='del'>-}  ;</div><div class='del'>- struct gf_notify_rsp {</div><div class='del'>-        unsigned hyper gfs_id;</div><div class='del'>-        int    op_ret;</div><div class='del'>-        int    op_errno;</div><div class='del'>-	unsigned int  flags;</div><div class='del'>-        string buf&lt;&gt;;</div><div class='del'>-}  ;</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-struct gf_common_rsp {</div><div class='del'>-       unsigned hyper gfs_id;</div><div class='del'>-       int    op_ret;</div><div class='del'>-       int    op_errno;</div><div class='del'>-} ;</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-struct gf_dump_req {</div><div class='del'>-       unsigned hyper gfs_id;</div><div class='del'>-};</div><div class='del'>-</div><div class='del'>-struct gf_prog_detail {</div><div class='del'>-       string progname&lt;&gt;;</div><div class='del'>-       unsigned hyper prognum;</div><div class='del'>-       unsigned hyper progver;</div><div class='del'>-       struct gf_prog_detail *next;</div><div class='del'>-};</div><div class='del'>-</div><div class='del'>-struct gf_dump_rsp {</div><div class='del'>-       unsigned hyper gfs_id;</div><div class='del'>-       struct gf_prog_detail *prog;</div><div class='del'>-};</div><div class='del'>-</div><div class='del'>-struct auth_glusterfs_parms {</div><div class='del'>-       unsigned int pid;</div><div class='del'>-       unsigned int uid;</div><div class='del'>-       unsigned int gid;</div><div class='del'>-</div><div class='del'>-        /* Number of groups being sent through the array above. */</div><div class='del'>-        unsigned int ngrps;</div><div class='del'>-</div><div class='del'>-        /* Array of groups to which the uid belongs apart from the primary group</div><div class='del'>-         * in gid.</div><div class='del'>-         */</div><div class='del'>-        unsigned int groups[GF_REQUEST_MAXGROUPS];</div><div class='del'>-</div><div class='del'>-        unsigned hyper lk_owner;</div><div class='del'>-};</div><div class='head'>diff --git a/rpc/xdr/src/glusterfs4-xdr.x b/rpc/xdr/src/glusterfs4-xdr.x<br/>new file mode 100644<br/>index 00000000000..d3b1d0dfaf0<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/rpc/xdr/src/glusterfs4-xdr.x?id=d1d7a6f35c816822fab51c820e25023863c239c1'>rpc/xdr/src/glusterfs4-xdr.x</a></div><div class='hunk'>@@ -0,0 +1,797 @@</div><div class='add'>+/*</div><div class='add'>+ * Copyright (c) 2012 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+ * This file is part of GlusterFS.</div><div class='add'>+ *</div><div class='add'>+ * This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+ * General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+ * later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+ * cases as published by the Free Software Foundation.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+#ifdef RPC_XDR</div><div class='add'>+%#include "rpc-pragmas.h"</div><div class='add'>+#endif</div><div class='add'>+%#include &lt;glusterfs/glusterfs-fops.h&gt;</div><div class='add'>+%#include "glusterfs3-xdr.h"</div><div class='add'>+</div><div class='add'>+/* Need to consume iattx and new dict in all the fops */</div><div class='add'>+struct gfx_iattx {</div><div class='add'>+        opaque       ia_gfid[16];</div><div class='add'>+</div><div class='add'>+        unsigned hyper     ia_flags;</div><div class='add'>+        unsigned hyper     ia_ino;        /* inode number */</div><div class='add'>+        unsigned hyper     ia_dev;        /* backing device ID */</div><div class='add'>+        unsigned hyper     ia_rdev;       /* device ID (if special file) */</div><div class='add'>+        unsigned hyper     ia_size;       /* file size in bytes */</div><div class='add'>+        unsigned hyper     ia_blocks;     /* number of 512B blocks allocated */</div><div class='add'>+        unsigned hyper     ia_attributes; /* chattr related:compressed, immutable,</div><div class='add'>+                                     * append only, encrypted etc.*/</div><div class='add'>+        unsigned hyper     ia_attributes_mask; /* Mask for the attributes */</div><div class='add'>+</div><div class='add'>+        hyper      ia_atime;      /* last access time */</div><div class='add'>+        hyper      ia_mtime;      /* last modification time */</div><div class='add'>+        hyper      ia_ctime;      /* last status change time */</div><div class='add'>+        hyper      ia_btime;      /* creation time. Fill using statx */</div><div class='add'>+</div><div class='add'>+        unsigned int     ia_atime_nsec;</div><div class='add'>+        unsigned int     ia_mtime_nsec;</div><div class='add'>+        unsigned int     ia_ctime_nsec;</div><div class='add'>+        unsigned int     ia_btime_nsec;</div><div class='add'>+        unsigned int     ia_nlink;      /* Link count */</div><div class='add'>+        unsigned int     ia_uid;        /* user ID of owner */</div><div class='add'>+        unsigned int     ia_gid;        /* group ID of owner */</div><div class='add'>+        unsigned int     ia_blksize;    /* blocksize for filesystem I/O */</div><div class='add'>+        unsigned int     mode;          /* type of file and rwx mode */</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct gfx_mdata_iatt {</div><div class='add'>+        hyper      ia_atime;      /* last access time */</div><div class='add'>+        hyper      ia_mtime;      /* last modification time */</div><div class='add'>+        hyper      ia_ctime;      /* last status change time */</div><div class='add'>+</div><div class='add'>+        unsigned int     ia_atime_nsec;</div><div class='add'>+        unsigned int     ia_mtime_nsec;</div><div class='add'>+        unsigned int     ia_ctime_nsec;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+union gfx_value switch (int type) {</div><div class='add'>+        case GF_DATA_TYPE_INT:</div><div class='add'>+                hyper value_int;</div><div class='add'>+        case GF_DATA_TYPE_UINT:</div><div class='add'>+                unsigned hyper value_uint;</div><div class='add'>+        case GF_DATA_TYPE_DOUBLE:</div><div class='add'>+                double value_dbl;</div><div class='add'>+        case GF_DATA_TYPE_STR:</div><div class='add'>+                opaque val_string&lt;&gt;;</div><div class='add'>+        case GF_DATA_TYPE_IATT:</div><div class='add'>+                gfx_iattx iatt;</div><div class='add'>+        case GF_DATA_TYPE_GFUUID:</div><div class='add'>+                opaque uuid[16];</div><div class='add'>+        case GF_DATA_TYPE_PTR:</div><div class='add'>+        case GF_DATA_TYPE_STR_OLD:</div><div class='add'>+                opaque other&lt;&gt;;</div><div class='add'>+        case GF_DATA_TYPE_MDATA:</div><div class='add'>+                gfx_mdata_iatt mdata_iatt;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+/* AUTH */</div><div class='add'>+/* This is used in the rpc header part itself, And not program payload.</div><div class='add'>+   Avoid sending large data load here. Allowed maximum is 400 bytes.</div><div class='add'>+   Ref: http://tools.ietf.org/html/rfc5531#section-8.2</div><div class='add'>+   this is also handled in xdr-common.h</div><div class='add'>+*/</div><div class='add'>+struct auth_glusterfs_params_v3 {</div><div class='add'>+        int pid;</div><div class='add'>+        unsigned int uid;</div><div class='add'>+        unsigned int gid;</div><div class='add'>+</div><div class='add'>+        /* flags */</div><div class='add'>+        /* Makes sense to use it for each bits */</div><div class='add'>+        /* 0x1 == IS_INTERNAL? */</div><div class='add'>+        /* Another 31 bits are reserved */</div><div class='add'>+        unsigned int flags;</div><div class='add'>+</div><div class='add'>+        /* birth time of the frame / call */</div><div class='add'>+        unsigned int ctime_nsec; /* good to have 32bit for this */</div><div class='add'>+        unsigned hyper ctime_sec;</div><div class='add'>+</div><div class='add'>+        unsigned int groups&lt;&gt;;</div><div class='add'>+        opaque lk_owner&lt;&gt;;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct gfx_dict_pair {</div><div class='add'>+       opaque key&lt;&gt;;</div><div class='add'>+       gfx_value value;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct gfx_dict {</div><div class='add'>+       unsigned int xdr_size;</div><div class='add'>+       int count;</div><div class='add'>+       gfx_dict_pair pairs&lt;&gt;;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+/* FOPS */</div><div class='add'>+struct gfx_common_rsp {</div><div class='add'>+       int    op_ret;</div><div class='add'>+       int    op_errno;</div><div class='add'>+       gfx_dict xdata; /* Extra data */</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct gfx_common_iatt_rsp {</div><div class='add'>+       int op_ret;</div><div class='add'>+       int op_errno;</div><div class='add'>+       gfx_dict xdata;</div><div class='add'>+       gfx_iattx stat;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct gfx_common_2iatt_rsp {</div><div class='add'>+       int op_ret;</div><div class='add'>+       int op_errno;</div><div class='add'>+       gfx_dict xdata;</div><div class='add'>+       gfx_iattx prestat;</div><div class='add'>+       gfx_iattx poststat;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct gfx_common_3iatt_rsp {</div><div class='add'>+        int    op_ret;</div><div class='add'>+        int    op_errno;</div><div class='add'>+        gfx_dict xdata; /* Extra data */</div><div class='add'>+        gfx_iattx stat;</div><div class='add'>+        gfx_iattx preparent;</div><div class='add'>+        gfx_iattx postparent;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct gfx_fsetattr_req {</div><div class='add'>+        opaque gfid[16];</div><div class='add'>+        hyper        fd;</div><div class='add'>+        gfx_iattx stbuf;</div><div class='add'>+        int        valid;</div><div class='add'>+        gfx_dict xdata; /* Extra data */</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct gfx_rchecksum_req {</div><div class='add'>+        opaque gfid[16];</div><div class='add'>+        hyper   fd;</div><div class='add'>+        unsigned hyper  offset;</div><div class='add'>+        unsigned int  len;</div><div class='add'>+        unsigned int  flags;</div><div class='add'>+        gfx_dict xdata; /* Extra data */</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct gfx_icreate_req {</div><div class='add'>+       opaque gfid[16];</div><div class='add'>+       unsigned int mode;</div><div class='add'>+       gfx_dict xdata;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct gfx_put_req {</div><div class='add'>+        opaque       pargfid[16];</div><div class='add'>+        string       bname&lt;&gt;;</div><div class='add'>+        unsigned int mode;</div><div class='add'>+        unsigned int umask;</div><div class='add'>+        unsigned int flag;</div><div class='add'>+        u_quad_t     offset;</div><div class='add'>+        unsigned int size;</div><div class='add'>+        gfx_dict     xattr;</div><div class='add'>+        gfx_dict     xdata;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct gfx_namelink_req {</div><div class='add'>+       opaque pargfid[16];</div><div class='add'>+       string bname&lt;&gt;;</div><div class='add'>+       gfx_dict xdata;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+/* Define every fops */</div><div class='add'>+/* Changes from Version 3:</div><div class='add'>+  1. Dict has its own type instead of being opaque</div><div class='add'>+  2. Iattx instead of iatt on wire</div><div class='add'>+  3. gfid has 4 extra bytes so it can be used for future</div><div class='add'>+*/</div><div class='add'>+struct gfx_stat_req {</div><div class='add'>+        opaque gfid[16];</div><div class='add'>+        gfx_dict xdata;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct gfx_readlink_req {</div><div class='add'>+        opaque gfid[16];</div><div class='add'>+        unsigned int   size;</div><div class='add'>+        gfx_dict xdata; /* Extra data */</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct gfx_readlink_rsp {</div><div class='add'>+        int    op_ret;</div><div class='add'>+        int    op_errno;</div><div class='add'>+        gfx_dict xdata; /* Extra data */</div><div class='add'>+        gfx_iattx buf;</div><div class='add'>+        string path&lt;&gt;; /* NULL terminated */</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct gfx_mknod_req {</div><div class='add'>+        opaque  pargfid[16];</div><div class='add'>+        u_quad_t dev;</div><div class='add'>+        unsigned int mode;</div><div class='add'>+        unsigned int umask;</div><div class='add'>+        string     bname&lt;&gt;; /* NULL terminated */</div><div class='add'>+        gfx_dict xdata; /* Extra data */</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct  gfx_mkdir_req {</div><div class='add'>+        opaque  pargfid[16];</div><div class='add'>+        unsigned int mode;</div><div class='add'>+        unsigned int umask;</div><div class='add'>+        string     bname&lt;&gt;; /* NULL terminated */</div><div class='add'>+        gfx_dict xdata; /* Extra data */</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct gfx_unlink_req {</div><div class='add'>+        opaque  pargfid[16];</div><div class='add'>+        string     bname&lt;&gt;; /* NULL terminated */</div><div class='add'>+        unsigned int xflags;</div><div class='add'>+        gfx_dict xdata; /* Extra data */</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+struct gfx_rmdir_req {</div><div class='add'>+        opaque  pargfid[16];</div><div class='add'>+        int        xflags;</div><div class='add'>+        string     bname&lt;&gt;; /* NULL terminated */</div><div class='add'>+        gfx_dict xdata; /* Extra data */</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct gfx_symlink_req {</div><div class='add'>+        opaque  pargfid[16];</div><div class='add'>+        string     bname&lt;&gt;;</div><div class='add'>+        unsigned int umask;</div><div class='add'>+        string     linkname&lt;&gt;;</div><div class='add'>+        gfx_dict xdata; /* Extra data */</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct  gfx_rename_req {</div><div class='add'>+        opaque  oldgfid[16];</div><div class='add'>+        opaque  newgfid[16];</div><div class='add'>+        string       oldbname&lt;&gt;; /* NULL terminated */</div><div class='add'>+        string       newbname&lt;&gt;; /* NULL terminated */</div><div class='add'>+        gfx_dict xdata; /* Extra data */</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct   gfx_rename_rsp {</div><div class='add'>+        int    op_ret;</div><div class='add'>+        int    op_errno;</div><div class='add'>+        gfx_dict xdata; /* Extra data */</div><div class='add'>+        gfx_iattx stat;</div><div class='add'>+        gfx_iattx preoldparent;</div><div class='add'>+        gfx_iattx postoldparent;</div><div class='add'>+        gfx_iattx prenewparent;</div><div class='add'>+        gfx_iattx postnewparent;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+ struct  gfx_link_req {</div><div class='add'>+        opaque  oldgfid[16];</div><div class='add'>+        opaque  newgfid[16];</div><div class='add'>+        string       newbname&lt;&gt;;</div><div class='add'>+        gfx_dict xdata; /* Extra data */</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+ struct   gfx_truncate_req {</div><div class='add'>+        opaque gfid[16];</div><div class='add'>+        u_quad_t offset;</div><div class='add'>+        gfx_dict xdata; /* Extra data */</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+ struct   gfx_open_req {</div><div class='add'>+        opaque gfid[16];</div><div class='add'>+        unsigned int flags;</div><div class='add'>+        gfx_dict xdata; /* Extra data */</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct   gfx_open_rsp {</div><div class='add'>+        int    op_ret;</div><div class='add'>+        int    op_errno;</div><div class='add'>+        gfx_dict xdata; /* Extra data */</div><div class='add'>+        quad_t fd;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct gfx_opendir_req {</div><div class='add'>+        opaque gfid[16];</div><div class='add'>+        gfx_dict xdata; /* Extra data */</div><div class='add'>+}  ;</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+ struct   gfx_read_req {</div><div class='add'>+        opaque gfid[16];</div><div class='add'>+        quad_t  fd;</div><div class='add'>+        u_quad_t offset;</div><div class='add'>+        unsigned int size;</div><div class='add'>+        unsigned int flag;</div><div class='add'>+        gfx_dict xdata; /* Extra data */</div><div class='add'>+};</div><div class='add'>+ struct  gfx_read_rsp {</div><div class='add'>+        int    op_ret;</div><div class='add'>+        int    op_errno;</div><div class='add'>+        gfx_iattx stat;</div><div class='add'>+        unsigned int size;</div><div class='add'>+        gfx_dict xdata; /* Extra data */</div><div class='add'>+} ;</div><div class='add'>+</div><div class='add'>+struct   gfx_lookup_req {</div><div class='add'>+        opaque gfid[16];</div><div class='add'>+        opaque  pargfid[16];</div><div class='add'>+        unsigned int flags;</div><div class='add'>+        string     bname&lt;&gt;;</div><div class='add'>+        gfx_dict xdata; /* Extra data */</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+ struct   gfx_write_req {</div><div class='add'>+        opaque gfid[16];</div><div class='add'>+        quad_t  fd;</div><div class='add'>+        u_quad_t offset;</div><div class='add'>+        unsigned int size;</div><div class='add'>+        unsigned int flag;</div><div class='add'>+        gfx_dict xdata; /* Extra data */</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+ struct gfx_statfs_req  {</div><div class='add'>+        opaque gfid[16];</div><div class='add'>+        gfx_dict xdata; /* Extra data */</div><div class='add'>+}  ;</div><div class='add'>+ struct gfx_statfs_rsp {</div><div class='add'>+        int    op_ret;</div><div class='add'>+        int    op_errno;</div><div class='add'>+        gfx_dict xdata; /* Extra data */</div><div class='add'>+        gf_statfs statfs;</div><div class='add'>+}  ;</div><div class='add'>+</div><div class='add'>+ struct gfx_lk_req {</div><div class='add'>+        opaque gfid[16];</div><div class='add'>+        int64_t         fd;</div><div class='add'>+        unsigned int        cmd;</div><div class='add'>+        unsigned int        type;</div><div class='add'>+        gf_proto_flock flock;</div><div class='add'>+        gfx_dict xdata; /* Extra data */</div><div class='add'>+}  ;</div><div class='add'>+ struct gfx_lk_rsp {</div><div class='add'>+        int    op_ret;</div><div class='add'>+        int    op_errno;</div><div class='add'>+        gfx_dict xdata; /* Extra data */</div><div class='add'>+        gf_proto_flock flock;</div><div class='add'>+}  ;</div><div class='add'>+</div><div class='add'>+struct gfx_lease_req {</div><div class='add'>+        opaque gfid[16];</div><div class='add'>+        gf_proto_lease lease;</div><div class='add'>+        gfx_dict xdata; /* Extra data */</div><div class='add'>+}  ;</div><div class='add'>+</div><div class='add'>+struct gfx_lease_rsp {</div><div class='add'>+        int    op_ret;</div><div class='add'>+        int    op_errno;</div><div class='add'>+        gfx_dict xdata; /* Extra data */</div><div class='add'>+        gf_proto_lease lease;</div><div class='add'>+}  ;</div><div class='add'>+</div><div class='add'>+struct gfx_recall_lease_req {</div><div class='add'>+        opaque       gfid[16];</div><div class='add'>+        unsigned int lease_type;</div><div class='add'>+        opaque       tid[16];</div><div class='add'>+        gfx_dict xdata; /* Extra data */</div><div class='add'>+}  ;</div><div class='add'>+</div><div class='add'>+ struct gfx_inodelk_req {</div><div class='add'>+        opaque gfid[16];</div><div class='add'>+        unsigned int cmd;</div><div class='add'>+        unsigned int type;</div><div class='add'>+        gf_proto_flock flock;</div><div class='add'>+        string     volume&lt;&gt;;</div><div class='add'>+        gfx_dict xdata; /* Extra data */</div><div class='add'>+}  ;</div><div class='add'>+</div><div class='add'>+struct   gfx_finodelk_req {</div><div class='add'>+        opaque gfid[16];</div><div class='add'>+        quad_t  fd;</div><div class='add'>+        unsigned int cmd;</div><div class='add'>+        unsigned int type;</div><div class='add'>+        gf_proto_flock flock;</div><div class='add'>+        string volume&lt;&gt;;</div><div class='add'>+        gfx_dict xdata; /* Extra data */</div><div class='add'>+} ;</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+ struct gfx_flush_req {</div><div class='add'>+        opaque gfid[16];</div><div class='add'>+        quad_t  fd;</div><div class='add'>+        gfx_dict xdata; /* Extra data */</div><div class='add'>+}  ;</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+ struct gfx_fsync_req {</div><div class='add'>+        opaque gfid[16];</div><div class='add'>+        quad_t  fd;</div><div class='add'>+        unsigned int data;</div><div class='add'>+        gfx_dict xdata; /* Extra data */</div><div class='add'>+}  ;</div><div class='add'>+</div><div class='add'>+ struct gfx_setxattr_req {</div><div class='add'>+        opaque gfid[16];</div><div class='add'>+        unsigned int flags;</div><div class='add'>+        gfx_dict dict;</div><div class='add'>+        gfx_dict xdata; /* Extra data */</div><div class='add'>+}  ;</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+ struct gfx_fsetxattr_req {</div><div class='add'>+        opaque gfid[16];</div><div class='add'>+        int64_t  fd;</div><div class='add'>+        unsigned int flags;</div><div class='add'>+        gfx_dict dict;</div><div class='add'>+        gfx_dict xdata; /* Extra data */</div><div class='add'>+}  ;</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+ struct gfx_xattrop_req {</div><div class='add'>+        opaque gfid[16];</div><div class='add'>+        unsigned int flags;</div><div class='add'>+        gfx_dict dict;</div><div class='add'>+        gfx_dict xdata; /* Extra data */</div><div class='add'>+}  ;</div><div class='add'>+</div><div class='add'>+struct gfx_common_dict_rsp  {</div><div class='add'>+        int    op_ret;</div><div class='add'>+        int    op_errno;</div><div class='add'>+        gfx_dict xdata; /* Extra data */</div><div class='add'>+        gfx_dict dict;</div><div class='add'>+        gfx_iattx prestat;</div><div class='add'>+        gfx_iattx poststat;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+ struct gfx_fxattrop_req {</div><div class='add'>+        opaque gfid[16];</div><div class='add'>+        quad_t  fd;</div><div class='add'>+        unsigned int flags;</div><div class='add'>+        gfx_dict dict;</div><div class='add'>+        gfx_dict xdata; /* Extra data */</div><div class='add'>+}  ;</div><div class='add'>+</div><div class='add'>+ struct gfx_getxattr_req  {</div><div class='add'>+        opaque gfid[16];</div><div class='add'>+        unsigned int namelen;</div><div class='add'>+        string     name&lt;&gt;;</div><div class='add'>+        gfx_dict xdata; /* Extra data */</div><div class='add'>+}  ;</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+ struct gfx_fgetxattr_req  {</div><div class='add'>+        opaque gfid[16];</div><div class='add'>+        quad_t  fd;</div><div class='add'>+        unsigned int namelen;</div><div class='add'>+        string     name&lt;&gt;;</div><div class='add'>+        gfx_dict xdata; /* Extra data */</div><div class='add'>+}  ;</div><div class='add'>+</div><div class='add'>+ struct gfx_removexattr_req {</div><div class='add'>+        opaque gfid[16];</div><div class='add'>+        string     name&lt;&gt;;</div><div class='add'>+        gfx_dict xdata; /* Extra data */</div><div class='add'>+}  ;</div><div class='add'>+</div><div class='add'>+ struct gfx_fremovexattr_req {</div><div class='add'>+        opaque gfid[16];</div><div class='add'>+        quad_t  fd;</div><div class='add'>+        string     name&lt;&gt;;</div><div class='add'>+        gfx_dict xdata; /* Extra data */</div><div class='add'>+}  ;</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+ struct gfx_fsyncdir_req {</div><div class='add'>+        opaque gfid[16];</div><div class='add'>+        quad_t  fd;</div><div class='add'>+        int  data;</div><div class='add'>+        gfx_dict xdata; /* Extra data */</div><div class='add'>+}  ;</div><div class='add'>+</div><div class='add'>+ struct   gfx_readdir_req  {</div><div class='add'>+        opaque gfid[16];</div><div class='add'>+        quad_t  fd;</div><div class='add'>+        u_quad_t offset;</div><div class='add'>+        unsigned int size;</div><div class='add'>+        gfx_dict xdata; /* Extra data */</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+ struct gfx_readdirp_req {</div><div class='add'>+        opaque gfid[16];</div><div class='add'>+        quad_t  fd;</div><div class='add'>+        u_quad_t offset;</div><div class='add'>+        unsigned int size;</div><div class='add'>+        gfx_dict xdata;</div><div class='add'>+}  ;</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+struct gfx_access_req  {</div><div class='add'>+        opaque gfid[16];</div><div class='add'>+        unsigned int mask;</div><div class='add'>+        gfx_dict xdata; /* Extra data */</div><div class='add'>+} ;</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+struct gfx_create_req {</div><div class='add'>+        opaque  pargfid[16];</div><div class='add'>+        unsigned int flags;</div><div class='add'>+        unsigned int mode;</div><div class='add'>+        unsigned int umask;</div><div class='add'>+        string     bname&lt;&gt;;</div><div class='add'>+        gfx_dict xdata; /* Extra data */</div><div class='add'>+}  ;</div><div class='add'>+struct  gfx_create_rsp {</div><div class='add'>+        int    op_ret;</div><div class='add'>+        int    op_errno;</div><div class='add'>+        gfx_dict xdata; /* Extra data */</div><div class='add'>+        gfx_iattx stat;</div><div class='add'>+        u_quad_t       fd;</div><div class='add'>+        gfx_iattx preparent;</div><div class='add'>+        gfx_iattx postparent;</div><div class='add'>+} ;</div><div class='add'>+</div><div class='add'>+struct   gfx_ftruncate_req  {</div><div class='add'>+        opaque gfid[16];</div><div class='add'>+        quad_t  fd;</div><div class='add'>+        u_quad_t offset;</div><div class='add'>+        gfx_dict xdata; /* Extra data */</div><div class='add'>+} ;</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+struct gfx_fstat_req {</div><div class='add'>+        opaque gfid[16];</div><div class='add'>+        quad_t  fd;</div><div class='add'>+        gfx_dict xdata; /* Extra data */</div><div class='add'>+}  ;</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+struct gfx_entrylk_req {</div><div class='add'>+        opaque gfid[16];</div><div class='add'>+        unsigned int  cmd;</div><div class='add'>+        unsigned int  type;</div><div class='add'>+        u_quad_t  namelen;</div><div class='add'>+        string      name&lt;&gt;;</div><div class='add'>+        string      volume&lt;&gt;;</div><div class='add'>+        gfx_dict xdata; /* Extra data */</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct gfx_fentrylk_req {</div><div class='add'>+        opaque gfid[16];</div><div class='add'>+        quad_t   fd;</div><div class='add'>+        unsigned int  cmd;</div><div class='add'>+        unsigned int  type;</div><div class='add'>+        u_quad_t  namelen;</div><div class='add'>+        string      name&lt;&gt;;</div><div class='add'>+        string      volume&lt;&gt;;</div><div class='add'>+        gfx_dict xdata; /* Extra data */</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+ struct gfx_setattr_req {</div><div class='add'>+        opaque gfid[16];</div><div class='add'>+        gfx_iattx stbuf;</div><div class='add'>+        int        valid;</div><div class='add'>+        gfx_dict xdata; /* Extra data */</div><div class='add'>+}  ;</div><div class='add'>+</div><div class='add'>+ struct gfx_fallocate_req {</div><div class='add'>+        opaque          gfid[16];</div><div class='add'>+        quad_t          fd;</div><div class='add'>+        unsigned int    flags;</div><div class='add'>+        u_quad_t        offset;</div><div class='add'>+        u_quad_t        size;</div><div class='add'>+        gfx_dict xdata; /* Extra data */</div><div class='add'>+}  ;</div><div class='add'>+</div><div class='add'>+struct gfx_discard_req {</div><div class='add'>+        opaque          gfid[16];</div><div class='add'>+        quad_t          fd;</div><div class='add'>+        u_quad_t        offset;</div><div class='add'>+        u_quad_t        size;</div><div class='add'>+        gfx_dict xdata; /* Extra data */</div><div class='add'>+}  ;</div><div class='add'>+</div><div class='add'>+struct gfx_zerofill_req {</div><div class='add'>+        opaque          gfid[16];</div><div class='add'>+        quad_t           fd;</div><div class='add'>+        u_quad_t  offset;</div><div class='add'>+        u_quad_t  size;</div><div class='add'>+        gfx_dict xdata;</div><div class='add'>+}  ;</div><div class='add'>+</div><div class='add'>+struct gfx_rchecksum_rsp {</div><div class='add'>+        int    op_ret;</div><div class='add'>+        int    op_errno;</div><div class='add'>+        gfx_dict xdata; /* Extra data */</div><div class='add'>+        unsigned int flags;</div><div class='add'>+        unsigned int weak_checksum;</div><div class='add'>+        opaque   strong_checksum&lt;&gt;;</div><div class='add'>+}  ;</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+struct gfx_ipc_req {</div><div class='add'>+        int     op;</div><div class='add'>+        gfx_dict xdata;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+struct gfx_seek_req {</div><div class='add'>+        opaque    gfid[16];</div><div class='add'>+        quad_t    fd;</div><div class='add'>+        u_quad_t  offset;</div><div class='add'>+        int       what;</div><div class='add'>+        gfx_dict xdata;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct gfx_seek_rsp {</div><div class='add'>+        int       op_ret;</div><div class='add'>+        int       op_errno;</div><div class='add'>+        gfx_dict xdata;</div><div class='add'>+        u_quad_t  offset;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+ struct gfx_setvolume_req {</div><div class='add'>+        gfx_dict dict;</div><div class='add'>+}  ;</div><div class='add'>+</div><div class='add'>+ struct   gfx_copy_file_range_req {</div><div class='add'>+        opaque gfid1[16];</div><div class='add'>+        opaque gfid2[16];</div><div class='add'>+        quad_t  fd_in;</div><div class='add'>+        quad_t  fd_out;</div><div class='add'>+        u_quad_t   off_in;</div><div class='add'>+        u_quad_t   off_out;</div><div class='add'>+        unsigned int size;</div><div class='add'>+        unsigned int flag;</div><div class='add'>+        gfx_dict xdata; /* Extra data */</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+ struct  gfx_setvolume_rsp {</div><div class='add'>+        int    op_ret;</div><div class='add'>+        int    op_errno;</div><div class='add'>+        gfx_dict dict;</div><div class='add'>+} ;</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+ struct gfx_getspec_req {</div><div class='add'>+        unsigned int flags;</div><div class='add'>+        string     key&lt;&gt;;</div><div class='add'>+        gfx_dict xdata; /* Extra data */</div><div class='add'>+}  ;</div><div class='add'>+ struct  gfx_getspec_rsp {</div><div class='add'>+        int    op_ret;</div><div class='add'>+        int    op_errno;</div><div class='add'>+        string spec&lt;&gt;;</div><div class='add'>+        gfx_dict xdata; /* Extra data */</div><div class='add'>+} ;</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+ struct gfx_notify_req {</div><div class='add'>+        unsigned int  flags;</div><div class='add'>+        string buf&lt;&gt;;</div><div class='add'>+        gfx_dict xdata; /* Extra data */</div><div class='add'>+}  ;</div><div class='add'>+ struct gfx_notify_rsp {</div><div class='add'>+        int    op_ret;</div><div class='add'>+        int    op_errno;</div><div class='add'>+        unsigned int  flags;</div><div class='add'>+        string buf&lt;&gt;;</div><div class='add'>+        gfx_dict xdata; /* Extra data */</div><div class='add'>+}  ;</div><div class='add'>+</div><div class='add'>+struct gfx_releasedir_req {</div><div class='add'>+        opaque gfid[16];</div><div class='add'>+        quad_t  fd;</div><div class='add'>+        gfx_dict xdata; /* Extra data */</div><div class='add'>+}  ;</div><div class='add'>+</div><div class='add'>+struct gfx_release_req {</div><div class='add'>+        opaque gfid[16];</div><div class='add'>+        quad_t  fd;</div><div class='add'>+        gfx_dict xdata; /* Extra data */</div><div class='add'>+}  ;</div><div class='add'>+</div><div class='add'>+struct gfx_dirlist {</div><div class='add'>+       u_quad_t d_ino;</div><div class='add'>+       u_quad_t d_off;</div><div class='add'>+       unsigned int d_len;</div><div class='add'>+       unsigned int d_type;</div><div class='add'>+       string name&lt;&gt;;</div><div class='add'>+       gfx_dirlist *nextentry;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+struct gfx_readdir_rsp {</div><div class='add'>+       int op_ret;</div><div class='add'>+       int op_errno;</div><div class='add'>+       gfx_dict xdata; /* Extra data */</div><div class='add'>+       gfx_dirlist *reply;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct gfx_dirplist {</div><div class='add'>+       u_quad_t d_ino;</div><div class='add'>+       u_quad_t d_off;</div><div class='add'>+       unsigned int d_len;</div><div class='add'>+       unsigned int d_type;</div><div class='add'>+       string name&lt;&gt;;</div><div class='add'>+       gfx_iattx stat;</div><div class='add'>+       gfx_dict dict;</div><div class='add'>+       gfx_dirplist *nextentry;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct gfx_readdirp_rsp {</div><div class='add'>+       int op_ret;</div><div class='add'>+       int op_errno;</div><div class='add'>+       gfx_dict xdata; /* Extra data */</div><div class='add'>+       gfx_dirplist *reply;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct gfx_set_lk_ver_rsp {</div><div class='add'>+       int op_ret;</div><div class='add'>+       int op_errno;</div><div class='add'>+       gfx_dict xdata;</div><div class='add'>+       int lk_ver;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct gfx_set_lk_ver_req {</div><div class='add'>+       string uid&lt;&gt;;</div><div class='add'>+       int lk_ver;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct gfx_event_notify_req {</div><div class='add'>+        int op;</div><div class='add'>+        gfx_dict dict;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+struct gfx_getsnap_name_uuid_req {</div><div class='add'>+        gfx_dict dict;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct gfx_getsnap_name_uuid_rsp {</div><div class='add'>+        int op_ret;</div><div class='add'>+        int op_errno;</div><div class='add'>+        gfx_dict dict;</div><div class='add'>+        string op_errstr&lt;&gt;;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct gfx_getactivelk_rsp {</div><div class='add'>+        int op_ret;</div><div class='add'>+        int op_errno;</div><div class='add'>+        gfx_dict xdata;</div><div class='add'>+        gfs3_locklist *reply;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct gfx_getactivelk_req {</div><div class='add'>+        opaque gfid[16];</div><div class='add'>+        gfx_dict xdata;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct gfx_setactivelk_req {</div><div class='add'>+        opaque gfid[16];</div><div class='add'>+        gfs3_locklist *request;</div><div class='add'>+        gfx_dict xdata;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct gfs4_inodelk_contention_req {</div><div class='add'>+        opaque                gfid[16];</div><div class='add'>+        struct gf_proto_flock flock;</div><div class='add'>+        unsigned int          pid;</div><div class='add'>+        string                domain&lt;&gt;;</div><div class='add'>+        opaque                xdata&lt;&gt;;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct gfs4_entrylk_contention_req {</div><div class='add'>+        opaque                gfid[16];</div><div class='add'>+        unsigned int          type;</div><div class='add'>+        unsigned int          pid;</div><div class='add'>+        string                name&lt;&gt;;</div><div class='add'>+        string                domain&lt;&gt;;</div><div class='add'>+        opaque                xdata&lt;&gt;;</div><div class='add'>+};</div><div class='head'>diff --git a/rpc/xdr/src/libgfxdr.sym b/rpc/xdr/src/libgfxdr.sym<br/>new file mode 100644<br/>index 00000000000..8fa0e0ddd8a<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/rpc/xdr/src/libgfxdr.sym?id=d1d7a6f35c816822fab51c820e25023863c239c1'>rpc/xdr/src/libgfxdr.sym</a></div><div class='hunk'>@@ -0,0 +1,350 @@</div><div class='add'>+xdr_auth_glusterfs_parms</div><div class='add'>+xdr_auth_glusterfs_parms_v2</div><div class='add'>+xdr_auth_glusterfs_params_v3</div><div class='add'>+xdr_changelog_event_req</div><div class='add'>+xdr_changelog_event_rsp</div><div class='add'>+xdr_changelog_probe_req</div><div class='add'>+xdr_changelog_probe_rsp</div><div class='add'>+xdr_dirpath</div><div class='add'>+xdr_free_exports_list</div><div class='add'>+xdr_free_mountlist</div><div class='add'>+xdr_gd1_mgmt_brick_op_req</div><div class='add'>+xdr_gd1_mgmt_brick_op_rsp</div><div class='add'>+xdr_gd1_mgmt_cluster_lock_req</div><div class='add'>+xdr_gd1_mgmt_cluster_lock_rsp</div><div class='add'>+xdr_gd1_mgmt_cluster_unlock_req</div><div class='add'>+xdr_gd1_mgmt_cluster_unlock_rsp</div><div class='add'>+xdr_gd1_mgmt_commit_op_req</div><div class='add'>+xdr_gd1_mgmt_commit_op_rsp</div><div class='add'>+xdr_gd1_mgmt_friend_req</div><div class='add'>+xdr_gd1_mgmt_friend_rsp</div><div class='add'>+xdr_gd1_mgmt_friend_update</div><div class='add'>+xdr_gd1_mgmt_friend_update_rsp</div><div class='add'>+xdr_gd1_mgmt_probe_req</div><div class='add'>+xdr_gd1_mgmt_probe_rsp</div><div class='add'>+xdr_gd1_mgmt_stage_op_req</div><div class='add'>+xdr_gd1_mgmt_stage_op_rsp</div><div class='add'>+xdr_gd1_mgmt_v3_brick_op_req</div><div class='add'>+xdr_gd1_mgmt_v3_brick_op_rsp</div><div class='add'>+xdr_gd1_mgmt_v3_commit_req</div><div class='add'>+xdr_gd1_mgmt_v3_commit_rsp</div><div class='add'>+xdr_gd1_mgmt_v3_post_commit_req</div><div class='add'>+xdr_gd1_mgmt_v3_post_commit_rsp</div><div class='add'>+xdr_gd1_mgmt_v3_lock_req</div><div class='add'>+xdr_gd1_mgmt_v3_lock_rsp</div><div class='add'>+xdr_gd1_mgmt_v3_post_val_req</div><div class='add'>+xdr_gd1_mgmt_v3_post_val_rsp</div><div class='add'>+xdr_gd1_mgmt_v3_pre_val_req</div><div class='add'>+xdr_gd1_mgmt_v3_pre_val_rsp</div><div class='add'>+xdr_gd1_mgmt_v3_unlock_req</div><div class='add'>+xdr_gd1_mgmt_v3_unlock_rsp</div><div class='add'>+xdr_gf1_cli_fsm_log_req</div><div class='add'>+xdr_gf1_cli_fsm_log_rsp</div><div class='add'>+xdr_gf1_cli_getwd_req</div><div class='add'>+xdr_gf1_cli_getwd_rsp</div><div class='add'>+xdr_gf1_cli_mount_req</div><div class='add'>+xdr_gf1_cli_mount_rsp</div><div class='add'>+xdr_gf1_cli_peer_list_req</div><div class='add'>+xdr_gf1_cli_peer_list_rsp</div><div class='add'>+xdr_gf1_cli_umount_req</div><div class='add'>+xdr_gf1_cli_umount_rsp</div><div class='add'>+xdr_gf_cli_req</div><div class='add'>+xdr_gf_cli_rsp</div><div class='add'>+xdr_gf_common_rsp</div><div class='add'>+xdr_gf_dump_req</div><div class='add'>+xdr_gf_dump_rsp</div><div class='add'>+xdr_gf_event_notify_req</div><div class='add'>+xdr_gf_event_notify_rsp</div><div class='add'>+xdr_gf_getsnap_name_uuid_req</div><div class='add'>+xdr_gf_getsnap_name_uuid_rsp</div><div class='add'>+xdr_gf_getspec_req</div><div class='add'>+xdr_gf_getspec_rsp</div><div class='add'>+xdr_gf_get_volume_info_req</div><div class='add'>+xdr_gf_get_volume_info_rsp</div><div class='add'>+xdr_gf_mgmt_hndsk_req</div><div class='add'>+xdr_gf_mgmt_hndsk_rsp</div><div class='add'>+xdr_gfs3_access_req</div><div class='add'>+xdr_gfs3_cbk_cache_invalidation_req</div><div class='add'>+xdr_gfs3_compound_req</div><div class='add'>+xdr_gfs3_compound_rsp</div><div class='add'>+xdr_gfs3_create_req</div><div class='add'>+xdr_gfs3_create_rsp</div><div class='add'>+xdr_gfs3_discard_req</div><div class='add'>+xdr_gfs3_discard_rsp</div><div class='add'>+xdr_gfs3_entrylk_req</div><div class='add'>+xdr_gfs3_fallocate_req</div><div class='add'>+xdr_gfs3_fallocate_rsp</div><div class='add'>+xdr_gfs3_fentrylk_req</div><div class='add'>+xdr_gfs3_fgetxattr_req</div><div class='add'>+xdr_gfs3_fgetxattr_rsp</div><div class='add'>+xdr_gfs3_finodelk_req</div><div class='add'>+xdr_gfs3_flush_req</div><div class='add'>+xdr_gfs3_fremovexattr_req</div><div class='add'>+xdr_gfs3_fsetattr_req</div><div class='add'>+xdr_gfs3_fsetattr_req_v2</div><div class='add'>+xdr_gfs3_fsetattr_rsp</div><div class='add'>+xdr_gfs3_fsetxattr_req</div><div class='add'>+xdr_gfs3_fstat_req</div><div class='add'>+xdr_gfs3_fstat_rsp</div><div class='add'>+xdr_gfs3_fsyncdir_req</div><div class='add'>+xdr_gfs3_fsync_req</div><div class='add'>+xdr_gfs3_fsync_rsp</div><div class='add'>+xdr_gfs3_ftruncate_req</div><div class='add'>+xdr_gfs3_ftruncate_rsp</div><div class='add'>+xdr_gfs3_fxattrop_req</div><div class='add'>+xdr_gfs3_fxattrop_rsp</div><div class='add'>+xdr_gfs3_getactivelk_req</div><div class='add'>+xdr_gfs3_getactivelk_rsp</div><div class='add'>+xdr_gfs3_getxattr_req</div><div class='add'>+xdr_gfs3_getxattr_rsp</div><div class='add'>+xdr_gfs3_inodelk_req</div><div class='add'>+xdr_gfs3_ipc_req</div><div class='add'>+xdr_gfs3_ipc_rsp</div><div class='add'>+xdr_gfs3_lease_req</div><div class='add'>+xdr_gfs3_lease_rsp</div><div class='add'>+xdr_gfs3_link_req</div><div class='add'>+xdr_gfs3_link_rsp</div><div class='add'>+xdr_gfs3_lk_req</div><div class='add'>+xdr_gfs3_lk_rsp</div><div class='add'>+xdr_gfs3_lookup_req</div><div class='add'>+xdr_gfs3_lookup_rsp</div><div class='add'>+xdr_gfs3_mkdir_req</div><div class='add'>+xdr_gfs3_mkdir_rsp</div><div class='add'>+xdr_gfs3_mknod_req</div><div class='add'>+xdr_gfs3_mknod_rsp</div><div class='add'>+xdr_gfs3_opendir_req</div><div class='add'>+xdr_gfs3_opendir_rsp</div><div class='add'>+xdr_gfs3_open_req</div><div class='add'>+xdr_gfs3_open_rsp</div><div class='add'>+xdr_gfs3_rchecksum_req</div><div class='add'>+xdr_gfs3_rchecksum_req_v2</div><div class='add'>+xdr_gfs3_rchecksum_rsp</div><div class='add'>+xdr_gfs3_readdirp_req</div><div class='add'>+xdr_gfs3_readdirp_rsp</div><div class='add'>+xdr_gfs3_readdir_req</div><div class='add'>+xdr_gfs3_readdir_rsp</div><div class='add'>+xdr_gfs3_readlink_req</div><div class='add'>+xdr_gfs3_readlink_rsp</div><div class='add'>+xdr_gfs3_read_req</div><div class='add'>+xdr_gfs3_read_rsp</div><div class='add'>+xdr_gfs3_recall_lease_req</div><div class='add'>+xdr_gfs3_releasedir_req</div><div class='add'>+xdr_gfs3_release_req</div><div class='add'>+xdr_gfs3_removexattr_req</div><div class='add'>+xdr_gfs3_rename_req</div><div class='add'>+xdr_gfs3_rename_rsp</div><div class='add'>+xdr_gfs3_rmdir_req</div><div class='add'>+xdr_gfs3_rmdir_rsp</div><div class='add'>+xdr_gfs3_seek_req</div><div class='add'>+xdr_gfs3_seek_rsp</div><div class='add'>+xdr_gfs3_setactivelk_req</div><div class='add'>+xdr_gfs3_setactivelk_rsp</div><div class='add'>+xdr_gfs3_setattr_req</div><div class='add'>+xdr_gfs3_setattr_rsp</div><div class='add'>+xdr_gfs3_setxattr_req</div><div class='add'>+xdr_gfs3_statfs_req</div><div class='add'>+xdr_gfs3_statfs_rsp</div><div class='add'>+xdr_gfs3_stat_req</div><div class='add'>+xdr_gfs3_stat_rsp</div><div class='add'>+xdr_gfs3_symlink_req</div><div class='add'>+xdr_gfs3_symlink_rsp</div><div class='add'>+xdr_gfs3_truncate_req</div><div class='add'>+xdr_gfs3_truncate_rsp</div><div class='add'>+xdr_gfs3_unlink_req</div><div class='add'>+xdr_gfs3_unlink_rsp</div><div class='add'>+xdr_gfs3_write_req</div><div class='add'>+xdr_gfs3_write_rsp</div><div class='add'>+xdr_gfs3_xattrop_req</div><div class='add'>+xdr_gfs3_xattrop_rsp</div><div class='add'>+xdr_gfs3_zerofill_req</div><div class='add'>+xdr_gfs3_zerofill_rsp</div><div class='add'>+xdr_gfs4_entrylk_contention_req</div><div class='add'>+xdr_gfs4_entrylk_contention_rsp</div><div class='add'>+xdr_gfs4_icreate_req</div><div class='add'>+xdr_gfs4_icreate_rsp</div><div class='add'>+xdr_gfs4_inodelk_contention_req</div><div class='add'>+xdr_gfs4_inodelk_contention_rsp</div><div class='add'>+xdr_gfs4_namelink_req</div><div class='add'>+xdr_gfs4_namelink_rsp</div><div class='add'>+xdr_gf_set_lk_ver_req</div><div class='add'>+xdr_gf_set_lk_ver_rsp</div><div class='add'>+xdr_gf_setvolume_req</div><div class='add'>+xdr_gf_setvolume_rsp</div><div class='add'>+xdr_gf_statedump</div><div class='add'>+xdr_length_round_up</div><div class='add'>+xdr_mon</div><div class='add'>+xdr_mountres3</div><div class='add'>+xdr_mountstat3</div><div class='add'>+xdr_nlm_sm_status</div><div class='add'>+xdr_pmap_brick_by_port_req</div><div class='add'>+xdr_pmap_brick_by_port_rsp</div><div class='add'>+xdr_pmap_port_by_brick_req</div><div class='add'>+xdr_pmap_port_by_brick_rsp</div><div class='add'>+xdr_pmap_signin_req</div><div class='add'>+xdr_pmap_signin_rsp</div><div class='add'>+xdr_pmap_signout_req</div><div class='add'>+xdr_pmap_signout_rsp</div><div class='add'>+xdr_serialize_access3res</div><div class='add'>+xdr_serialize_commit3res</div><div class='add'>+xdr_serialize_create3res</div><div class='add'>+xdr_serialize_exports</div><div class='add'>+xdr_serialize_fsinfo3res</div><div class='add'>+xdr_serialize_fsstat3res</div><div class='add'>+xdr_serialize_generic</div><div class='add'>+xdr_serialize_getaclreply</div><div class='add'>+xdr_serialize_getattr3res</div><div class='add'>+xdr_serialize_link3res</div><div class='add'>+xdr_serialize_lookup3res</div><div class='add'>+xdr_serialize_mkdir3res</div><div class='add'>+xdr_serialize_mknod3res</div><div class='add'>+xdr_serialize_mountlist</div><div class='add'>+xdr_serialize_mountres3</div><div class='add'>+xdr_serialize_mountstat3</div><div class='add'>+xdr_serialize_nlm4_res</div><div class='add'>+xdr_serialize_nlm4_shareres</div><div class='add'>+xdr_serialize_nlm4_testargs</div><div class='add'>+xdr_serialize_nlm4_testres</div><div class='add'>+xdr_serialize_pathconf3res</div><div class='add'>+xdr_serialize_read3res</div><div class='add'>+xdr_serialize_read3res_nocopy</div><div class='add'>+xdr_serialize_readdir3res</div><div class='add'>+xdr_serialize_readdirp3res</div><div class='add'>+xdr_serialize_readlink3res</div><div class='add'>+xdr_serialize_remove3res</div><div class='add'>+xdr_serialize_rename3res</div><div class='add'>+xdr_serialize_rmdir3res</div><div class='add'>+xdr_serialize_setaclreply</div><div class='add'>+xdr_serialize_setattr3res</div><div class='add'>+xdr_serialize_symlink3res</div><div class='add'>+xdr_serialize_write3res</div><div class='add'>+xdr_sm_stat</div><div class='add'>+xdr_sm_stat_res</div><div class='add'>+xdr_to_access3args</div><div class='add'>+xdr_to_commit3args</div><div class='add'>+xdr_to_create3args</div><div class='add'>+xdr_to_fsinfo3args</div><div class='add'>+xdr_to_fsstat3args</div><div class='add'>+xdr_to_generic</div><div class='add'>+xdr_to_getaclargs</div><div class='add'>+xdr_to_getattr3args</div><div class='add'>+xdr_to_link3args</div><div class='add'>+xdr_to_lookup3args</div><div class='add'>+xdr_to_mkdir3args</div><div class='add'>+xdr_to_mknod3args</div><div class='add'>+xdr_to_mountpath</div><div class='add'>+xdr_to_nlm4_cancelargs</div><div class='add'>+xdr_to_nlm4_freeallargs</div><div class='add'>+xdr_to_nlm4_lockargs</div><div class='add'>+xdr_to_nlm4_shareargs</div><div class='add'>+xdr_to_nlm4_testargs</div><div class='add'>+xdr_to_nlm4_unlockargs</div><div class='add'>+xdr_to_pathconf3args</div><div class='add'>+xdr_to_read3args</div><div class='add'>+xdr_to_readdir3args</div><div class='add'>+xdr_to_readdirp3args</div><div class='add'>+xdr_to_readlink3args</div><div class='add'>+xdr_to_remove3args</div><div class='add'>+xdr_to_rename3args</div><div class='add'>+xdr_to_rmdir3args</div><div class='add'>+xdr_to_setaclargs</div><div class='add'>+xdr_to_setattr3args</div><div class='add'>+xdr_to_symlink3args</div><div class='add'>+xdr_to_write3args</div><div class='add'>+xdr_vector_round_up</div><div class='add'>+xdr_gfx_read_rsp</div><div class='add'>+xdr_gfx_iattx</div><div class='add'>+xdr_gfx_mdata_iatt</div><div class='add'>+xdr_gfx_value</div><div class='add'>+xdr_gfx_dict_pair</div><div class='add'>+xdr_gfx_dict</div><div class='add'>+xdr_gfx_common_rsp</div><div class='add'>+xdr_gfx_common_iatt_rsp</div><div class='add'>+xdr_gfx_common_2iatt_rsp</div><div class='add'>+xdr_gfx_common_3iatt_rsp</div><div class='add'>+xdr_gfx_fsetattr_req</div><div class='add'>+xdr_gfx_rchecksum_req</div><div class='add'>+xdr_gfx_icreate_req</div><div class='add'>+xdr_gfx_namelink_req</div><div class='add'>+xdr_gfx_stat_req</div><div class='add'>+xdr_gfx_readlink_req</div><div class='add'>+xdr_gfx_readlink_rsp</div><div class='add'>+xdr_gfx_mknod_req</div><div class='add'>+xdr_gfx_mkdir_req</div><div class='add'>+xdr_gfx_unlink_req</div><div class='add'>+xdr_gfx_rmdir_req</div><div class='add'>+xdr_gfx_symlink_req</div><div class='add'>+xdr_gfx_rename_req</div><div class='add'>+xdr_gfx_rename_rsp</div><div class='add'>+xdr_gfx_link_req</div><div class='add'>+xdr_gfx_truncate_req</div><div class='add'>+xdr_gfx_open_req</div><div class='add'>+xdr_gfx_open_rsp</div><div class='add'>+xdr_gfx_opendir_req</div><div class='add'>+xdr_gfx_read_req</div><div class='add'>+xdr_gfx_read_rsp</div><div class='add'>+xdr_gfx_lookup_req</div><div class='add'>+xdr_gfx_write_req</div><div class='add'>+xdr_gfx_statfs_req</div><div class='add'>+xdr_gfx_statfs_rsp</div><div class='add'>+xdr_gfx_lk_req</div><div class='add'>+xdr_gfx_lk_rsp</div><div class='add'>+xdr_gfx_lease_req</div><div class='add'>+xdr_gfx_lease_rsp</div><div class='add'>+xdr_gfx_recall_lease_req</div><div class='add'>+xdr_gfx_inodelk_req</div><div class='add'>+xdr_gfx_finodelk_req</div><div class='add'>+xdr_gfx_flush_req</div><div class='add'>+xdr_gfx_fsync_req</div><div class='add'>+xdr_gfx_setxattr_req</div><div class='add'>+xdr_gfx_fsetxattr_req</div><div class='add'>+xdr_gfx_xattrop_req</div><div class='add'>+xdr_gfx_common_dict_rsp</div><div class='add'>+xdr_gfx_fxattrop_req</div><div class='add'>+xdr_gfx_getxattr_req</div><div class='add'>+xdr_gfx_fgetxattr_req</div><div class='add'>+xdr_gfx_removexattr_req</div><div class='add'>+xdr_gfx_fremovexattr_req</div><div class='add'>+xdr_gfx_fsyncdir_req</div><div class='add'>+xdr_gfx_readdir_req</div><div class='add'>+xdr_gfx_readdirp_req</div><div class='add'>+xdr_gfx_access_req</div><div class='add'>+xdr_gfx_create_req</div><div class='add'>+xdr_gfx_create_rsp</div><div class='add'>+xdr_gfx_ftruncate_req</div><div class='add'>+xdr_gfx_fstat_req</div><div class='add'>+xdr_gfx_entrylk_req</div><div class='add'>+xdr_gfx_fentrylk_req</div><div class='add'>+xdr_gfx_setattr_req</div><div class='add'>+xdr_gfx_fallocate_req</div><div class='add'>+xdr_gfx_discard_req</div><div class='add'>+xdr_gfx_zerofill_req</div><div class='add'>+xdr_gfx_rchecksum_rsp</div><div class='add'>+xdr_gfx_ipc_req</div><div class='add'>+xdr_gfx_seek_req</div><div class='add'>+xdr_gfx_seek_rsp</div><div class='add'>+xdr_gfx_setvolume_req</div><div class='add'>+xdr_gfx_setvolume_rsp</div><div class='add'>+xdr_gfx_getspec_req</div><div class='add'>+xdr_gfx_getspec_rsp</div><div class='add'>+xdr_gfx_notify_req</div><div class='add'>+xdr_gfx_notify_rsp</div><div class='add'>+xdr_gfx_releasedir_req</div><div class='add'>+xdr_gfx_release_req</div><div class='add'>+xdr_gfx_dirlist</div><div class='add'>+xdr_gfx_readdir_rsp</div><div class='add'>+xdr_gfx_dirplist</div><div class='add'>+xdr_gfx_readdirp_rsp</div><div class='add'>+xdr_gfx_set_lk_ver_rsp</div><div class='add'>+xdr_gfx_set_lk_ver_req</div><div class='add'>+xdr_gfx_event_notify_req</div><div class='add'>+xdr_gfx_getsnap_name_uuid_req</div><div class='add'>+xdr_gfx_getsnap_name_uuid_rsp</div><div class='add'>+xdr_gfx_getactivelk_rsp</div><div class='add'>+xdr_gfx_getactivelk_req</div><div class='add'>+xdr_gfx_setactivelk_req</div><div class='add'>+xdr_gfx_put_req</div><div class='add'>+xdr_compound_req_v2</div><div class='add'>+xdr_gfx_compound_req</div><div class='add'>+xdr_compound_rsp_v2</div><div class='add'>+xdr_gfx_compound_rsp</div><div class='add'>+xdr_gfx_copy_file_range_req</div><div class='head'>diff --git a/rpc/xdr/src/mount3udp.x b/rpc/xdr/src/mount3udp.x<br/>new file mode 100644<br/>index 00000000000..e8366df400c<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/rpc/xdr/src/mount3udp.x?id=d1d7a6f35c816822fab51c820e25023863c239c1'>rpc/xdr/src/mount3udp.x</a></div><div class='hunk'>@@ -0,0 +1,32 @@</div><div class='add'>+/*</div><div class='add'>+  Copyright (c) 2007-2012 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#ifdef RPC_XDR</div><div class='add'>+%#include "rpc-pragmas.h"</div><div class='add'>+#endif</div><div class='add'>+%#include &lt;glusterfs/compat.h&gt;</div><div class='add'>+</div><div class='add'>+/* This is used by rpcgen to auto generate the rpc stubs.</div><div class='add'>+ * mount3udp_svc.c is heavily modified though</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+%#include "xdr-nfs3.h"</div><div class='add'>+</div><div class='add'>+const MNTUDPPATHLEN = 1024;</div><div class='add'>+</div><div class='add'>+typedef string mntudpdirpath&lt;MNTPATHLEN&gt;;</div><div class='add'>+</div><div class='add'>+program MOUNTUDP_PROGRAM {</div><div class='add'>+        version MOUNTUDP_V3 {</div><div class='add'>+                void MOUNTUDPPROC3_NULL(void) = 0;</div><div class='add'>+                mountres3 MOUNTUDPPROC3_MNT (mntudpdirpath) = 1;</div><div class='add'>+                mountstat3 MOUNTUDPPROC3_UMNT (mntudpdirpath) = 3;</div><div class='add'>+        } = 3;</div><div class='add'>+} = 100005;</div><div class='head'>diff --git a/rpc/xdr/src/msg-nfs3.c b/rpc/xdr/src/msg-nfs3.c<br/>new file mode 100644<br/>index 00000000000..d14a731b62a<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/rpc/xdr/src/msg-nfs3.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>rpc/xdr/src/msg-nfs3.c</a></div><div class='hunk'>@@ -0,0 +1,481 @@</div><div class='add'>+/*</div><div class='add'>+  Copyright (c) 2007-2012 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#include &lt;sys/uio.h&gt;</div><div class='add'>+#include &lt;rpc/rpc.h&gt;</div><div class='add'>+#include &lt;rpc/xdr.h&gt;</div><div class='add'>+#include &lt;sys/types.h&gt;</div><div class='add'>+</div><div class='add'>+#include "xdr-nfs3.h"</div><div class='add'>+#include "msg-nfs3.h"</div><div class='add'>+#include "xdr-generic.h"</div><div class='add'>+#include "xdr-common.h"</div><div class='add'>+</div><div class='add'>+/* Decode the mount path from the network message in inmsg</div><div class='add'>+ * into the memory referenced by outpath.iov_base.</div><div class='add'>+ * The size allocated for outpath.iov_base is outpath.iov_len.</div><div class='add'>+ * The size of the path extracted from the message is returned.</div><div class='add'>+ */</div><div class='add'>+ssize_t</div><div class='add'>+xdr_to_mountpath(struct iovec outpath, struct iovec inmsg)</div><div class='add'>+{</div><div class='add'>+    XDR xdr;</div><div class='add'>+    ssize_t ret = -1;</div><div class='add'>+    char *mntpath = NULL;</div><div class='add'>+</div><div class='add'>+    if ((!outpath.iov_base) || (!inmsg.iov_base))</div><div class='add'>+        return -1;</div><div class='add'>+</div><div class='add'>+    xdrmem_create(&amp;xdr, inmsg.iov_base, (unsigned int)inmsg.iov_len,</div><div class='add'>+                  XDR_DECODE);</div><div class='add'>+</div><div class='add'>+    mntpath = outpath.iov_base;</div><div class='add'>+    if (!xdr_dirpath(&amp;xdr, (dirpath *)&amp;mntpath)) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto ret;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = xdr_decoded_length(xdr);</div><div class='add'>+</div><div class='add'>+ret:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* Translate the mountres3 structure in res into XDR format into memory</div><div class='add'>+ * referenced by outmsg.iov_base.</div><div class='add'>+ * Returns the number of bytes used in encoding into XDR format.</div><div class='add'>+ */</div><div class='add'>+ssize_t</div><div class='add'>+xdr_serialize_mountres3(struct iovec outmsg, mountres3 *res)</div><div class='add'>+{</div><div class='add'>+    return xdr_serialize_generic(outmsg, (void *)res, (xdrproc_t)xdr_mountres3);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+ssize_t</div><div class='add'>+xdr_serialize_mountbody(struct iovec outmsg, mountbody *mb)</div><div class='add'>+{</div><div class='add'>+    return xdr_serialize_generic(outmsg, (void *)mb, (xdrproc_t)xdr_mountbody);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+ssize_t</div><div class='add'>+xdr_serialize_mountlist(struct iovec outmsg, mountlist *ml)</div><div class='add'>+{</div><div class='add'>+    return xdr_serialize_generic(outmsg, (void *)ml, (xdrproc_t)xdr_mountlist);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+ssize_t</div><div class='add'>+xdr_serialize_mountstat3(struct iovec outmsg, mountstat3 *m)</div><div class='add'>+{</div><div class='add'>+    return xdr_serialize_generic(outmsg, (void *)m, (xdrproc_t)xdr_mountstat3);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+ssize_t</div><div class='add'>+xdr_to_getattr3args(struct iovec inmsg, getattr3args *ga)</div><div class='add'>+{</div><div class='add'>+    return xdr_to_generic(inmsg, (void *)ga, (xdrproc_t)xdr_getattr3args);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+ssize_t</div><div class='add'>+xdr_serialize_getattr3res(struct iovec outmsg, getattr3res *res)</div><div class='add'>+{</div><div class='add'>+    return xdr_serialize_generic(outmsg, (void *)res,</div><div class='add'>+                                 (xdrproc_t)xdr_getattr3res);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+ssize_t</div><div class='add'>+xdr_serialize_setattr3res(struct iovec outmsg, setattr3res *res)</div><div class='add'>+{</div><div class='add'>+    return xdr_serialize_generic(outmsg, (void *)res,</div><div class='add'>+                                 (xdrproc_t)xdr_setattr3res);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+ssize_t</div><div class='add'>+xdr_to_setattr3args(struct iovec inmsg, setattr3args *sa)</div><div class='add'>+{</div><div class='add'>+    return xdr_to_generic(inmsg, (void *)sa, (xdrproc_t)xdr_setattr3args);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+ssize_t</div><div class='add'>+xdr_serialize_lookup3res(struct iovec outmsg, lookup3res *res)</div><div class='add'>+{</div><div class='add'>+    return xdr_serialize_generic(outmsg, (void *)res,</div><div class='add'>+                                 (xdrproc_t)xdr_lookup3res);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+ssize_t</div><div class='add'>+xdr_to_lookup3args(struct iovec inmsg, lookup3args *la)</div><div class='add'>+{</div><div class='add'>+    return xdr_to_generic(inmsg, (void *)la, (xdrproc_t)xdr_lookup3args);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+ssize_t</div><div class='add'>+xdr_to_access3args(struct iovec inmsg, access3args *ac)</div><div class='add'>+{</div><div class='add'>+    return xdr_to_generic(inmsg, (void *)ac, (xdrproc_t)xdr_access3args);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+ssize_t</div><div class='add'>+xdr_serialize_access3res(struct iovec outmsg, access3res *res)</div><div class='add'>+{</div><div class='add'>+    return xdr_serialize_generic(outmsg, (void *)res,</div><div class='add'>+                                 (xdrproc_t)xdr_access3res);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+ssize_t</div><div class='add'>+xdr_to_readlink3args(struct iovec inmsg, readlink3args *ra)</div><div class='add'>+{</div><div class='add'>+    return xdr_to_generic(inmsg, (void *)ra, (xdrproc_t)xdr_readlink3args);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+ssize_t</div><div class='add'>+xdr_serialize_readlink3res(struct iovec outmsg, readlink3res *res)</div><div class='add'>+{</div><div class='add'>+    return xdr_serialize_generic(outmsg, (void *)res,</div><div class='add'>+                                 (xdrproc_t)xdr_readlink3res);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+ssize_t</div><div class='add'>+xdr_to_read3args(struct iovec inmsg, read3args *ra)</div><div class='add'>+{</div><div class='add'>+    return xdr_to_generic(inmsg, (void *)ra, (xdrproc_t)xdr_read3args);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+ssize_t</div><div class='add'>+xdr_serialize_read3res(struct iovec outmsg, read3res *res)</div><div class='add'>+{</div><div class='add'>+    return xdr_serialize_generic(outmsg, (void *)res, (xdrproc_t)xdr_read3res);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+ssize_t</div><div class='add'>+xdr_serialize_read3res_nocopy(struct iovec outmsg, read3res *res)</div><div class='add'>+{</div><div class='add'>+    return xdr_serialize_generic(outmsg, (void *)res,</div><div class='add'>+                                 (xdrproc_t)xdr_read3res_nocopy);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+ssize_t</div><div class='add'>+xdr_to_write3args(struct iovec inmsg, write3args *wa)</div><div class='add'>+{</div><div class='add'>+    return xdr_to_generic(inmsg, (void *)wa, (xdrproc_t)xdr_write3args);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+ssize_t</div><div class='add'>+xdr_to_write3args_nocopy(struct iovec inmsg, write3args *wa,</div><div class='add'>+                         struct iovec *payload)</div><div class='add'>+{</div><div class='add'>+    return xdr_to_generic_payload(inmsg, (void *)wa, (xdrproc_t)xdr_write3args,</div><div class='add'>+                                  payload);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+ssize_t</div><div class='add'>+xdr_serialize_write3res(struct iovec outmsg, write3res *res)</div><div class='add'>+{</div><div class='add'>+    return xdr_serialize_generic(outmsg, (void *)res, (xdrproc_t)xdr_write3res);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+ssize_t</div><div class='add'>+xdr_to_create3args(struct iovec inmsg, create3args *ca)</div><div class='add'>+{</div><div class='add'>+    return xdr_to_generic(inmsg, (void *)ca, (xdrproc_t)xdr_create3args);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+ssize_t</div><div class='add'>+xdr_serialize_create3res(struct iovec outmsg, create3res *res)</div><div class='add'>+{</div><div class='add'>+    return xdr_serialize_generic(outmsg, (void *)res,</div><div class='add'>+                                 (xdrproc_t)xdr_create3res);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+ssize_t</div><div class='add'>+xdr_serialize_mkdir3res(struct iovec outmsg, mkdir3res *res)</div><div class='add'>+{</div><div class='add'>+    return xdr_serialize_generic(outmsg, (void *)res, (xdrproc_t)xdr_mkdir3res);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+ssize_t</div><div class='add'>+xdr_to_mkdir3args(struct iovec inmsg, mkdir3args *ma)</div><div class='add'>+{</div><div class='add'>+    return xdr_to_generic(inmsg, (void *)ma, (xdrproc_t)xdr_mkdir3args);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+ssize_t</div><div class='add'>+xdr_to_symlink3args(struct iovec inmsg, symlink3args *sa)</div><div class='add'>+{</div><div class='add'>+    return xdr_to_generic(inmsg, (void *)sa, (xdrproc_t)xdr_symlink3args);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+ssize_t</div><div class='add'>+xdr_serialize_symlink3res(struct iovec outmsg, symlink3res *res)</div><div class='add'>+{</div><div class='add'>+    return xdr_serialize_generic(outmsg, (void *)res,</div><div class='add'>+                                 (xdrproc_t)xdr_symlink3res);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+ssize_t</div><div class='add'>+xdr_to_mknod3args(struct iovec inmsg, mknod3args *ma)</div><div class='add'>+{</div><div class='add'>+    return xdr_to_generic(inmsg, (void *)ma, (xdrproc_t)xdr_mknod3args);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+ssize_t</div><div class='add'>+xdr_serialize_mknod3res(struct iovec outmsg, mknod3res *res)</div><div class='add'>+{</div><div class='add'>+    return xdr_serialize_generic(outmsg, (void *)res, (xdrproc_t)xdr_mknod3res);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+ssize_t</div><div class='add'>+xdr_to_remove3args(struct iovec inmsg, remove3args *ra)</div><div class='add'>+{</div><div class='add'>+    return xdr_to_generic(inmsg, (void *)ra, (xdrproc_t)xdr_remove3args);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+ssize_t</div><div class='add'>+xdr_serialize_remove3res(struct iovec outmsg, remove3res *res)</div><div class='add'>+{</div><div class='add'>+    return xdr_serialize_generic(outmsg, (void *)res,</div><div class='add'>+                                 (xdrproc_t)xdr_remove3res);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+ssize_t</div><div class='add'>+xdr_to_rmdir3args(struct iovec inmsg, rmdir3args *ra)</div><div class='add'>+{</div><div class='add'>+    return xdr_to_generic(inmsg, (void *)ra, (xdrproc_t)xdr_rmdir3args);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+ssize_t</div><div class='add'>+xdr_serialize_rmdir3res(struct iovec outmsg, rmdir3res *res)</div><div class='add'>+{</div><div class='add'>+    return xdr_serialize_generic(outmsg, (void *)res, (xdrproc_t)xdr_rmdir3res);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+ssize_t</div><div class='add'>+xdr_serialize_rename3res(struct iovec outmsg, rename3res *res)</div><div class='add'>+{</div><div class='add'>+    return xdr_serialize_generic(outmsg, (void *)res,</div><div class='add'>+                                 (xdrproc_t)xdr_rename3res);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+ssize_t</div><div class='add'>+xdr_to_rename3args(struct iovec inmsg, rename3args *ra)</div><div class='add'>+{</div><div class='add'>+    return xdr_to_generic(inmsg, (void *)ra, (xdrproc_t)xdr_rename3args);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+ssize_t</div><div class='add'>+xdr_serialize_link3res(struct iovec outmsg, link3res *li)</div><div class='add'>+{</div><div class='add'>+    return xdr_serialize_generic(outmsg, (void *)li, (xdrproc_t)xdr_link3res);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+ssize_t</div><div class='add'>+xdr_to_link3args(struct iovec inmsg, link3args *la)</div><div class='add'>+{</div><div class='add'>+    return xdr_to_generic(inmsg, (void *)la, (xdrproc_t)xdr_link3args);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+ssize_t</div><div class='add'>+xdr_to_readdir3args(struct iovec inmsg, readdir3args *rd)</div><div class='add'>+{</div><div class='add'>+    return xdr_to_generic(inmsg, (void *)rd, (xdrproc_t)xdr_readdir3args);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+ssize_t</div><div class='add'>+xdr_serialize_readdir3res(struct iovec outmsg, readdir3res *res)</div><div class='add'>+{</div><div class='add'>+    return xdr_serialize_generic(outmsg, (void *)res,</div><div class='add'>+                                 (xdrproc_t)xdr_readdir3res);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+ssize_t</div><div class='add'>+xdr_to_readdirp3args(struct iovec inmsg, readdirp3args *rp)</div><div class='add'>+{</div><div class='add'>+    return xdr_to_generic(inmsg, (void *)rp, (xdrproc_t)xdr_readdirp3args);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+ssize_t</div><div class='add'>+xdr_serialize_readdirp3res(struct iovec outmsg, readdirp3res *res)</div><div class='add'>+{</div><div class='add'>+    return xdr_serialize_generic(outmsg, (void *)res,</div><div class='add'>+                                 (xdrproc_t)xdr_readdirp3res);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+ssize_t</div><div class='add'>+xdr_to_fsstat3args(struct iovec inmsg, fsstat3args *fa)</div><div class='add'>+{</div><div class='add'>+    return xdr_to_generic(inmsg, (void *)fa, (xdrproc_t)xdr_fsstat3args);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+ssize_t</div><div class='add'>+xdr_serialize_fsstat3res(struct iovec outmsg, fsstat3res *res)</div><div class='add'>+{</div><div class='add'>+    return xdr_serialize_generic(outmsg, (void *)res,</div><div class='add'>+                                 (xdrproc_t)xdr_fsstat3res);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+ssize_t</div><div class='add'>+xdr_to_fsinfo3args(struct iovec inmsg, fsinfo3args *fi)</div><div class='add'>+{</div><div class='add'>+    return xdr_to_generic(inmsg, (void *)fi, (xdrproc_t)xdr_fsinfo3args);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+ssize_t</div><div class='add'>+xdr_serialize_fsinfo3res(struct iovec outmsg, fsinfo3res *res)</div><div class='add'>+{</div><div class='add'>+    return xdr_serialize_generic(outmsg, (void *)res,</div><div class='add'>+                                 (xdrproc_t)xdr_fsinfo3res);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+ssize_t</div><div class='add'>+xdr_to_pathconf3args(struct iovec inmsg, pathconf3args *pc)</div><div class='add'>+{</div><div class='add'>+    return xdr_to_generic(inmsg, (void *)pc, (xdrproc_t)xdr_pathconf3args);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+ssize_t</div><div class='add'>+xdr_serialize_pathconf3res(struct iovec outmsg, pathconf3res *res)</div><div class='add'>+{</div><div class='add'>+    return xdr_serialize_generic(outmsg, (void *)res,</div><div class='add'>+                                 (xdrproc_t)xdr_pathconf3res);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+ssize_t</div><div class='add'>+xdr_to_commit3args(struct iovec inmsg, commit3args *ca)</div><div class='add'>+{</div><div class='add'>+    return xdr_to_generic(inmsg, (void *)ca, (xdrproc_t)xdr_commit3args);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+ssize_t</div><div class='add'>+xdr_serialize_commit3res(struct iovec outmsg, commit3res *res)</div><div class='add'>+{</div><div class='add'>+    return xdr_serialize_generic(outmsg, (void *)res,</div><div class='add'>+                                 (xdrproc_t)xdr_commit3res);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+ssize_t</div><div class='add'>+xdr_serialize_exports(struct iovec outmsg, exports *elist)</div><div class='add'>+{</div><div class='add'>+    XDR xdr;</div><div class='add'>+    ssize_t ret = -1;</div><div class='add'>+</div><div class='add'>+    if ((!outmsg.iov_base) || (!elist))</div><div class='add'>+        return -1;</div><div class='add'>+</div><div class='add'>+    xdrmem_create(&amp;xdr, outmsg.iov_base, (unsigned int)outmsg.iov_len,</div><div class='add'>+                  XDR_ENCODE);</div><div class='add'>+</div><div class='add'>+    if (!xdr_exports(&amp;xdr, elist))</div><div class='add'>+        goto ret;</div><div class='add'>+</div><div class='add'>+    ret = xdr_decoded_length(xdr);</div><div class='add'>+</div><div class='add'>+ret:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+ssize_t</div><div class='add'>+xdr_serialize_nfsstat3(struct iovec outmsg, nfsstat3 *s)</div><div class='add'>+{</div><div class='add'>+    return xdr_serialize_generic(outmsg, (void *)s, (xdrproc_t)xdr_nfsstat3);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+ssize_t</div><div class='add'>+xdr_to_nlm4_testargs(struct iovec inmsg, nlm4_testargs *args)</div><div class='add'>+{</div><div class='add'>+    return xdr_to_generic(inmsg, (void *)args, (xdrproc_t)xdr_nlm4_testargs);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+ssize_t</div><div class='add'>+xdr_serialize_nlm4_testres(struct iovec outmsg, nlm4_testres *res)</div><div class='add'>+{</div><div class='add'>+    return xdr_serialize_generic(outmsg, (void *)res,</div><div class='add'>+                                 (xdrproc_t)xdr_nlm4_testres);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+ssize_t</div><div class='add'>+xdr_to_nlm4_lockargs(struct iovec inmsg, nlm4_lockargs *args)</div><div class='add'>+{</div><div class='add'>+    return xdr_to_generic(inmsg, (void *)args, (xdrproc_t)xdr_nlm4_lockargs);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+ssize_t</div><div class='add'>+xdr_serialize_nlm4_res(struct iovec outmsg, nlm4_res *res)</div><div class='add'>+{</div><div class='add'>+    return xdr_serialize_generic(outmsg, (void *)res, (xdrproc_t)xdr_nlm4_res);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+ssize_t</div><div class='add'>+xdr_to_nlm4_cancelargs(struct iovec inmsg, nlm4_cancargs *args)</div><div class='add'>+{</div><div class='add'>+    return xdr_to_generic(inmsg, (void *)args, (xdrproc_t)xdr_nlm4_cancargs);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+ssize_t</div><div class='add'>+xdr_to_nlm4_unlockargs(struct iovec inmsg, nlm4_unlockargs *args)</div><div class='add'>+{</div><div class='add'>+    return xdr_to_generic(inmsg, (void *)args, (xdrproc_t)xdr_nlm4_unlockargs);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+ssize_t</div><div class='add'>+xdr_to_nlm4_shareargs(struct iovec inmsg, nlm4_shareargs *args)</div><div class='add'>+{</div><div class='add'>+    return xdr_to_generic(inmsg, (void *)args, (xdrproc_t)xdr_nlm4_shareargs);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+ssize_t</div><div class='add'>+xdr_serialize_nlm4_shareres(struct iovec outmsg, nlm4_shareres *res)</div><div class='add'>+{</div><div class='add'>+    return xdr_serialize_generic(outmsg, (void *)res,</div><div class='add'>+                                 (xdrproc_t)xdr_nlm4_shareres);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+ssize_t</div><div class='add'>+xdr_serialize_nlm4_testargs(struct iovec outmsg, nlm4_testargs *args)</div><div class='add'>+{</div><div class='add'>+    return xdr_serialize_generic(outmsg, (void *)args,</div><div class='add'>+                                 (xdrproc_t)xdr_nlm4_testargs);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+ssize_t</div><div class='add'>+xdr_to_nlm4_res(struct iovec inmsg, nlm4_res *args)</div><div class='add'>+{</div><div class='add'>+    return xdr_to_generic(inmsg, (void *)args, (xdrproc_t)xdr_nlm4_res);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+ssize_t</div><div class='add'>+xdr_to_nlm4_freeallargs(struct iovec inmsg, nlm4_freeallargs *args)</div><div class='add'>+{</div><div class='add'>+    return xdr_to_generic(inmsg, (void *)args, (xdrproc_t)xdr_nlm4_freeallargs);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+ssize_t</div><div class='add'>+xdr_to_getaclargs(struct iovec inmsg, getaclargs *args)</div><div class='add'>+{</div><div class='add'>+    return xdr_to_generic(inmsg, (void *)args, (xdrproc_t)xdr_getaclargs);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+ssize_t</div><div class='add'>+xdr_to_setaclargs(struct iovec inmsg, setaclargs *args)</div><div class='add'>+{</div><div class='add'>+    return xdr_to_generic(inmsg, (void *)args, (xdrproc_t)xdr_setaclargs);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+ssize_t</div><div class='add'>+xdr_serialize_getaclreply(struct iovec inmsg, getaclreply *res)</div><div class='add'>+{</div><div class='add'>+    return xdr_serialize_generic(inmsg, (void *)res,</div><div class='add'>+                                 (xdrproc_t)xdr_getaclreply);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+ssize_t</div><div class='add'>+xdr_serialize_setaclreply(struct iovec inmsg, setaclreply *res)</div><div class='add'>+{</div><div class='add'>+    return xdr_serialize_generic(inmsg, (void *)res,</div><div class='add'>+                                 (xdrproc_t)xdr_setaclreply);</div><div class='add'>+}</div><div class='head'>diff --git a/rpc/xdr/src/msg-nfs3.h b/rpc/xdr/src/msg-nfs3.h<br/>new file mode 100644<br/>index 00000000000..869ddc3524a<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/rpc/xdr/src/msg-nfs3.h?id=d1d7a6f35c816822fab51c820e25023863c239c1'>rpc/xdr/src/msg-nfs3.h</a></div><div class='hunk'>@@ -0,0 +1,219 @@</div><div class='add'>+/*</div><div class='add'>+  Copyright (c) 2007-2012 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#ifndef _MSG_NFS3_H_</div><div class='add'>+#define _MSG_NFS3_H_</div><div class='add'>+</div><div class='add'>+#include "xdr-nfs3.h"</div><div class='add'>+#include "nlm4-xdr.h"</div><div class='add'>+#include "acl3-xdr.h"</div><div class='add'>+#include &lt;sys/types.h&gt;</div><div class='add'>+#include &lt;sys/uio.h&gt;</div><div class='add'>+</div><div class='add'>+extern ssize_t</div><div class='add'>+xdr_to_mountpath(struct iovec outpath, struct iovec inmsg);</div><div class='add'>+</div><div class='add'>+extern ssize_t</div><div class='add'>+xdr_serialize_mountres3(struct iovec outmsg, mountres3 *res);</div><div class='add'>+</div><div class='add'>+extern ssize_t</div><div class='add'>+xdr_serialize_mountbody(struct iovec outmsg, mountbody *mb);</div><div class='add'>+</div><div class='add'>+extern ssize_t</div><div class='add'>+xdr_to_getattr3args(struct iovec inmsg, getattr3args *ga);</div><div class='add'>+</div><div class='add'>+extern ssize_t</div><div class='add'>+xdr_serialize_getattr3res(struct iovec outmsg, getattr3res *res);</div><div class='add'>+</div><div class='add'>+extern ssize_t</div><div class='add'>+xdr_serialize_setattr3res(struct iovec outmsg, setattr3res *res);</div><div class='add'>+</div><div class='add'>+extern ssize_t</div><div class='add'>+xdr_to_setattr3args(struct iovec inmsg, setattr3args *sa);</div><div class='add'>+</div><div class='add'>+extern ssize_t</div><div class='add'>+xdr_serialize_lookup3res(struct iovec outmsg, lookup3res *res);</div><div class='add'>+</div><div class='add'>+extern ssize_t</div><div class='add'>+xdr_to_lookup3args(struct iovec inmsg, lookup3args *la);</div><div class='add'>+</div><div class='add'>+extern ssize_t</div><div class='add'>+xdr_to_access3args(struct iovec inmsg, access3args *ac);</div><div class='add'>+</div><div class='add'>+extern ssize_t</div><div class='add'>+xdr_serialize_access3res(struct iovec outmsg, access3res *res);</div><div class='add'>+</div><div class='add'>+extern ssize_t</div><div class='add'>+xdr_to_readlink3args(struct iovec inmsg, readlink3args *ra);</div><div class='add'>+</div><div class='add'>+extern ssize_t</div><div class='add'>+xdr_serialize_readlink3res(struct iovec outmsg, readlink3res *res);</div><div class='add'>+</div><div class='add'>+extern ssize_t</div><div class='add'>+xdr_to_read3args(struct iovec inmsg, read3args *ra);</div><div class='add'>+</div><div class='add'>+extern ssize_t</div><div class='add'>+xdr_serialize_read3res(struct iovec outmsg, read3res *res);</div><div class='add'>+</div><div class='add'>+extern ssize_t</div><div class='add'>+xdr_serialize_read3res_nocopy(struct iovec outmsg, read3res *res);</div><div class='add'>+</div><div class='add'>+extern ssize_t</div><div class='add'>+xdr_to_write3args(struct iovec inmsg, write3args *wa);</div><div class='add'>+</div><div class='add'>+extern ssize_t</div><div class='add'>+xdr_to_write3args_nocopy(struct iovec inmsg, write3args *wa,</div><div class='add'>+                         struct iovec *payload);</div><div class='add'>+</div><div class='add'>+extern ssize_t</div><div class='add'>+xdr_serialize_write3res(struct iovec outmsg, write3res *res);</div><div class='add'>+</div><div class='add'>+extern ssize_t</div><div class='add'>+xdr_to_create3args(struct iovec inmsg, create3args *ca);</div><div class='add'>+</div><div class='add'>+extern ssize_t</div><div class='add'>+xdr_serialize_create3res(struct iovec outmsg, create3res *res);</div><div class='add'>+</div><div class='add'>+extern ssize_t</div><div class='add'>+xdr_serialize_mkdir3res(struct iovec outmsg, mkdir3res *res);</div><div class='add'>+</div><div class='add'>+extern ssize_t</div><div class='add'>+xdr_to_mkdir3args(struct iovec inmsg, mkdir3args *ma);</div><div class='add'>+</div><div class='add'>+extern ssize_t</div><div class='add'>+xdr_to_symlink3args(struct iovec inmsg, symlink3args *sa);</div><div class='add'>+</div><div class='add'>+extern ssize_t</div><div class='add'>+xdr_serialize_symlink3res(struct iovec outmsg, symlink3res *res);</div><div class='add'>+</div><div class='add'>+extern ssize_t</div><div class='add'>+xdr_to_mknod3args(struct iovec inmsg, mknod3args *ma);</div><div class='add'>+</div><div class='add'>+extern ssize_t</div><div class='add'>+xdr_serialize_mknod3res(struct iovec outmsg, mknod3res *res);</div><div class='add'>+</div><div class='add'>+extern ssize_t</div><div class='add'>+xdr_to_remove3args(struct iovec inmsg, remove3args *ra);</div><div class='add'>+</div><div class='add'>+extern ssize_t</div><div class='add'>+xdr_serialize_remove3res(struct iovec outmsg, remove3res *res);</div><div class='add'>+</div><div class='add'>+extern ssize_t</div><div class='add'>+xdr_to_rmdir3args(struct iovec inmsg, rmdir3args *ra);</div><div class='add'>+</div><div class='add'>+extern ssize_t</div><div class='add'>+xdr_serialize_rmdir3res(struct iovec outmsg, rmdir3res *res);</div><div class='add'>+</div><div class='add'>+extern ssize_t</div><div class='add'>+xdr_serialize_rename3res(struct iovec outmsg, rename3res *res);</div><div class='add'>+</div><div class='add'>+extern ssize_t</div><div class='add'>+xdr_to_rename3args(struct iovec inmsg, rename3args *ra);</div><div class='add'>+</div><div class='add'>+extern ssize_t</div><div class='add'>+xdr_serialize_link3res(struct iovec outmsg, link3res *li);</div><div class='add'>+</div><div class='add'>+extern ssize_t</div><div class='add'>+xdr_to_link3args(struct iovec inmsg, link3args *la);</div><div class='add'>+</div><div class='add'>+extern ssize_t</div><div class='add'>+xdr_to_readdir3args(struct iovec inmsg, readdir3args *rd);</div><div class='add'>+</div><div class='add'>+extern ssize_t</div><div class='add'>+xdr_serialize_readdir3res(struct iovec outmsg, readdir3res *res);</div><div class='add'>+</div><div class='add'>+extern ssize_t</div><div class='add'>+xdr_to_readdirp3args(struct iovec inmsg, readdirp3args *rp);</div><div class='add'>+</div><div class='add'>+extern ssize_t</div><div class='add'>+xdr_serialize_readdirp3res(struct iovec outmsg, readdirp3res *res);</div><div class='add'>+</div><div class='add'>+extern ssize_t</div><div class='add'>+xdr_to_fsstat3args(struct iovec inmsg, fsstat3args *fa);</div><div class='add'>+</div><div class='add'>+extern ssize_t</div><div class='add'>+xdr_serialize_fsstat3res(struct iovec outmsg, fsstat3res *res);</div><div class='add'>+</div><div class='add'>+extern ssize_t</div><div class='add'>+xdr_to_fsinfo3args(struct iovec inmsg, fsinfo3args *fi);</div><div class='add'>+</div><div class='add'>+extern ssize_t</div><div class='add'>+xdr_serialize_fsinfo3res(struct iovec outmsg, fsinfo3res *res);</div><div class='add'>+</div><div class='add'>+extern ssize_t</div><div class='add'>+xdr_to_pathconf3args(struct iovec inmsg, pathconf3args *pc);</div><div class='add'>+</div><div class='add'>+extern ssize_t</div><div class='add'>+xdr_serialize_pathconf3res(struct iovec outmsg, pathconf3res *res);</div><div class='add'>+</div><div class='add'>+extern ssize_t</div><div class='add'>+xdr_to_commit3args(struct iovec inmsg, commit3args *ca);</div><div class='add'>+</div><div class='add'>+extern ssize_t</div><div class='add'>+xdr_serialize_commit3res(struct iovec outmsg, commit3res *res);</div><div class='add'>+</div><div class='add'>+extern ssize_t</div><div class='add'>+xdr_serialize_exports(struct iovec outmsg, exports *elist);</div><div class='add'>+</div><div class='add'>+extern ssize_t</div><div class='add'>+xdr_serialize_mountlist(struct iovec outmsg, mountlist *ml);</div><div class='add'>+</div><div class='add'>+extern ssize_t</div><div class='add'>+xdr_serialize_mountstat3(struct iovec outmsg, mountstat3 *m);</div><div class='add'>+</div><div class='add'>+extern ssize_t</div><div class='add'>+xdr_serialize_nfsstat3(struct iovec outmsg, nfsstat3 *s);</div><div class='add'>+</div><div class='add'>+extern ssize_t</div><div class='add'>+xdr_to_nlm4_testargs(struct iovec inmsg, nlm4_testargs *args);</div><div class='add'>+</div><div class='add'>+extern ssize_t</div><div class='add'>+xdr_serialize_nlm4_testres(struct iovec outmsg, nlm4_testres *res);</div><div class='add'>+</div><div class='add'>+extern ssize_t</div><div class='add'>+xdr_to_nlm4_lockargs(struct iovec inmsg, nlm4_lockargs *args);</div><div class='add'>+</div><div class='add'>+extern ssize_t</div><div class='add'>+xdr_serialize_nlm4_res(struct iovec outmsg, nlm4_res *res);</div><div class='add'>+</div><div class='add'>+extern ssize_t</div><div class='add'>+xdr_to_nlm4_cancelargs(struct iovec inmsg, nlm4_cancargs *args);</div><div class='add'>+</div><div class='add'>+extern ssize_t</div><div class='add'>+xdr_to_nlm4_unlockargs(struct iovec inmsg, nlm4_unlockargs *args);</div><div class='add'>+</div><div class='add'>+extern ssize_t</div><div class='add'>+xdr_to_nlm4_shareargs(struct iovec inmsg, nlm4_shareargs *args);</div><div class='add'>+</div><div class='add'>+extern ssize_t</div><div class='add'>+xdr_serialize_nlm4_shareres(struct iovec outmsg, nlm4_shareres *res);</div><div class='add'>+</div><div class='add'>+extern ssize_t</div><div class='add'>+xdr_serialize_nlm4_testargs(struct iovec outmsg, nlm4_testargs *args);</div><div class='add'>+</div><div class='add'>+extern ssize_t</div><div class='add'>+xdr_to_nlm4_res(struct iovec inmsg, nlm4_res *args);</div><div class='add'>+</div><div class='add'>+extern ssize_t</div><div class='add'>+xdr_to_nlm4_freeallargs(struct iovec inmsg, nlm4_freeallargs *args);</div><div class='add'>+</div><div class='add'>+extern ssize_t</div><div class='add'>+xdr_to_getaclargs(struct iovec inmsg, getaclargs *args);</div><div class='add'>+</div><div class='add'>+extern ssize_t</div><div class='add'>+xdr_to_setaclargs(struct iovec inmsg, setaclargs *args);</div><div class='add'>+</div><div class='add'>+extern ssize_t</div><div class='add'>+xdr_serialize_getaclreply(struct iovec inmsg, getaclreply *res);</div><div class='add'>+</div><div class='add'>+extern ssize_t</div><div class='add'>+xdr_serialize_setaclreply(struct iovec inmsg, setaclreply *res);</div><div class='add'>+</div><div class='add'>+#endif</div><div class='head'>diff --git a/rpc/xdr/src/nlm4-xdr.x b/rpc/xdr/src/nlm4-xdr.x<br/>new file mode 100644<br/>index 00000000000..847b0e64491<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/rpc/xdr/src/nlm4-xdr.x?id=d1d7a6f35c816822fab51c820e25023863c239c1'>rpc/xdr/src/nlm4-xdr.x</a></div><div class='hunk'>@@ -0,0 +1,167 @@</div><div class='add'>+/*</div><div class='add'>+  Copyright (c) 2007-2012 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#ifdef RPC_XDR</div><div class='add'>+%#include "rpc-pragmas.h"</div><div class='add'>+#endif</div><div class='add'>+%#include &lt;glusterfs/compat.h&gt;</div><div class='add'>+</div><div class='add'>+/* .x file defined as according to the RFC */</div><div class='add'>+</div><div class='add'>+%#include "xdr-common.h"</div><div class='add'>+</div><div class='add'>+const MAXNETOBJ_SZ = 1024;</div><div class='add'>+const LM_MAXSTRLEN = 1024;</div><div class='add'>+const MAXNAMELEN = 1025;</div><div class='add'>+</div><div class='add'>+typedef opaque nlm4_netobj&lt;MAXNETOBJ_SZ&gt;;</div><div class='add'>+</div><div class='add'>+#ifdef RPC_HDR</div><div class='add'>+%/*</div><div class='add'>+% * The following enums are actually bit encoded for efficient</div><div class='add'>+% * boolean algebra.... DON'T change them.....</div><div class='add'>+% */</div><div class='add'>+#endif</div><div class='add'>+enum	fsh_mode {</div><div class='add'>+	fsm_DN  = 0,	/* deny none */</div><div class='add'>+	fsm_DR  = 1,	/* deny read */</div><div class='add'>+	fsm_DW  = 2,	/* deny write */</div><div class='add'>+	fsm_DRW = 3	/* deny read/write */</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+enum	fsh_access {</div><div class='add'>+	fsa_NONE = 0,	/* for completeness */</div><div class='add'>+	fsa_R    = 1,	/* read only */</div><div class='add'>+	fsa_W    = 2,	/* write only */</div><div class='add'>+	fsa_RW   = 3	/* read/write */</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+#ifdef RPC_HDR</div><div class='add'>+%/* definitions for NLM version 4 */</div><div class='add'>+#endif</div><div class='add'>+enum nlm4_stats {</div><div class='add'>+	nlm4_granted			= 0,</div><div class='add'>+	nlm4_denied			= 1,</div><div class='add'>+	nlm4_denied_nolock		= 2,</div><div class='add'>+	nlm4_blocked			= 3,</div><div class='add'>+	nlm4_denied_grace_period	= 4,</div><div class='add'>+	nlm4_deadlck			= 5,</div><div class='add'>+	nlm4_rofs			= 6,</div><div class='add'>+	nlm4_stale_fh			= 7,</div><div class='add'>+	nlm4_fbig			= 8,</div><div class='add'>+	nlm4_failed			= 9</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct nlm4_stat {</div><div class='add'>+	nlm4_stats stat;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct nlm4_holder {</div><div class='add'>+	bool exclusive;</div><div class='add'>+	u_int32_t svid;</div><div class='add'>+	nlm4_netobj oh;</div><div class='add'>+	u_int64_t l_offset;</div><div class='add'>+	u_int64_t l_len;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct nlm4_lock {</div><div class='add'>+	string caller_name&lt;LM_MAXSTRLEN&gt;;</div><div class='add'>+	nlm4_netobj fh;</div><div class='add'>+	nlm4_netobj oh;</div><div class='add'>+	u_int32_t svid;</div><div class='add'>+	u_int64_t l_offset;</div><div class='add'>+	u_int64_t l_len;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct nlm4_share {</div><div class='add'>+	string caller_name&lt;LM_MAXSTRLEN&gt;;</div><div class='add'>+	nlm4_netobj fh;</div><div class='add'>+	nlm4_netobj oh;</div><div class='add'>+	fsh_mode mode;</div><div class='add'>+	fsh_access access;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+union nlm4_testrply switch (nlm4_stats stat) {</div><div class='add'>+	case nlm4_denied:</div><div class='add'>+		nlm4_holder holder;</div><div class='add'>+	default:</div><div class='add'>+		void;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct nlm4_testres {</div><div class='add'>+	nlm4_netobj cookie;</div><div class='add'>+	nlm4_testrply stat;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct nlm4_testargs {</div><div class='add'>+	nlm4_netobj cookie;</div><div class='add'>+	bool exclusive;</div><div class='add'>+	nlm4_lock alock;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct nlm4_res {</div><div class='add'>+	nlm4_netobj cookie;</div><div class='add'>+	nlm4_stat stat;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct nlm4_lockargs {</div><div class='add'>+	nlm4_netobj cookie;</div><div class='add'>+	bool block;</div><div class='add'>+	bool exclusive;</div><div class='add'>+	nlm4_lock alock;</div><div class='add'>+	bool reclaim;		/* used for recovering locks */</div><div class='add'>+	int32_t state;		/* specify local status monitor state */</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct nlm4_cancargs {</div><div class='add'>+	nlm4_netobj cookie;</div><div class='add'>+	bool block;</div><div class='add'>+	bool exclusive;</div><div class='add'>+	nlm4_lock alock;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct nlm4_unlockargs {</div><div class='add'>+	nlm4_netobj cookie;</div><div class='add'>+	nlm4_lock alock;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct	nlm4_shareargs {</div><div class='add'>+	nlm4_netobj	cookie;</div><div class='add'>+	nlm4_share	share;</div><div class='add'>+	bool	reclaim;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct	nlm4_shareres {</div><div class='add'>+	nlm4_netobj	cookie;</div><div class='add'>+	nlm4_stats	stat;</div><div class='add'>+	int32_t	sequence;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct  nlm4_freeallargs {</div><div class='add'>+        string       name&lt;LM_MAXSTRLEN&gt;;   /* client hostname */</div><div class='add'>+        uint32_t     state;                /* unused */</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+ * argument for the procedure called by rpc.statd when a monitored host</div><div class='add'>+ * status change.</div><div class='add'>+ * XXX assumes LM_MAXSTRLEN == SM_MAXSTRLEN</div><div class='add'>+ */</div><div class='add'>+struct nlm_sm_status {</div><div class='add'>+	string mon_name&lt;LM_MAXSTRLEN&gt;; /* name of host */</div><div class='add'>+	int state;			/* new state */</div><div class='add'>+	opaque priv[16];		/* private data */</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+program NLMCBK_PROGRAM {</div><div class='add'>+        version NLMCBK_V1 {</div><div class='add'>+                void NLMCBK_SM_NOTIFY(nlm_sm_status) = 16;</div><div class='add'>+        } = 1;</div><div class='add'>+} = 100021;</div><div class='head'>diff --git a/rpc/xdr/src/nsm-xdr.x b/rpc/xdr/src/nsm-xdr.x<br/>new file mode 100644<br/>index 00000000000..7c16a741f1d<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/rpc/xdr/src/nsm-xdr.x?id=d1d7a6f35c816822fab51c820e25023863c239c1'>rpc/xdr/src/nsm-xdr.x</a></div><div class='hunk'>@@ -0,0 +1,62 @@</div><div class='add'>+/*</div><div class='add'>+ * Copyright (c) 2012 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+ * This file is part of GlusterFS.</div><div class='add'>+ *</div><div class='add'>+ * This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+ * General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+ * later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+ * cases as published by the Free Software Foundation.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+#ifdef RPC_XDR</div><div class='add'>+%#include "rpc-pragmas.h"</div><div class='add'>+#endif</div><div class='add'>+%#include &lt;glusterfs/compat.h&gt;</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+ * This defines the maximum length of the string</div><div class='add'>+ * identifying the caller.</div><div class='add'>+ */</div><div class='add'>+const SM_MAXSTRLEN = 1024;</div><div class='add'>+</div><div class='add'>+struct sm_name {</div><div class='add'>+    string mon_name&lt;SM_MAXSTRLEN&gt;;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+enum res {</div><div class='add'>+    STAT_SUCC = 0,   /*  NSM agrees to monitor.  */</div><div class='add'>+    STAT_FAIL = 1    /*  NSM cannot monitor.  */</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct sm_stat_res {</div><div class='add'>+    res    res_stat;</div><div class='add'>+    int    state;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct sm_stat {</div><div class='add'>+    int    state;    /*  state number of NSM  */</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct my_id {</div><div class='add'>+    string my_name&lt;SM_MAXSTRLEN&gt;;  /*  hostname  */</div><div class='add'>+    int    my_prog;                /*  RPC program number  */</div><div class='add'>+    int    my_vers;                /*  program version number  */</div><div class='add'>+    int    my_proc;                /*  procedure number  */</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct mon_id {</div><div class='add'>+    string mon_name&lt;SM_MAXSTRLEN&gt;; /* name of the host to be monitored */</div><div class='add'>+    my_id my_id;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct mon {</div><div class='add'>+    mon_id mon_id;</div><div class='add'>+    opaque    priv[16];        /*  private information  */</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct nsm_callback_status {</div><div class='add'>+    string mon_name&lt;SM_MAXSTRLEN&gt;;</div><div class='add'>+    int    state;</div><div class='add'>+    opaque priv[16];        /*  for private information  */</div><div class='add'>+};</div><div class='add'>+</div><div class='head'>diff --git a/rpc/xdr/src/portmap-xdr.c b/rpc/xdr/src/portmap-xdr.c<br/>deleted file mode 100644<br/>index ddf6c47d7c9..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/rpc/xdr/src/portmap-xdr.c?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>rpc/xdr/src/portmap-xdr.c</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,212 +0,0 @@</div><div class='del'>-/*</div><div class='del'>-  Copyright (c) 2010 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='del'>-  This file is part of GlusterFS.</div><div class='del'>-</div><div class='del'>-  GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-  it under the terms of the GNU Affero General Public License as published</div><div class='del'>-  by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-  or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-  GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-  WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-  Affero General Public License for more details.</div><div class='del'>-</div><div class='del'>-  You should have received a copy of the GNU Affero General Public License</div><div class='del'>-  along with this program.  If not, see</div><div class='del'>-  &lt;http://www.gnu.org/licenses/&gt;.</div><div class='del'>-*/</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-/*</div><div class='del'>- * Please do not edit this file.</div><div class='del'>- * It was generated using rpcgen.</div><div class='del'>- */</div><div class='del'>-</div><div class='del'>-#include "portmap-xdr.h"</div><div class='del'>-</div><div class='del'>-bool_t</div><div class='del'>-xdr_pmap_port_by_brick_req (XDR *xdrs, pmap_port_by_brick_req *objp)</div><div class='del'>-{</div><div class='del'>-	 if (!xdr_string (xdrs, &amp;objp-&gt;brick, ~0))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	return TRUE;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-bool_t</div><div class='del'>-xdr_pmap_port_by_brick_rsp (XDR *xdrs, pmap_port_by_brick_rsp *objp)</div><div class='del'>-{</div><div class='del'>-	register int32_t *buf;</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-	if (xdrs-&gt;x_op == XDR_ENCODE) {</div><div class='del'>-		buf = XDR_INLINE (xdrs, 4 * BYTES_PER_XDR_UNIT);</div><div class='del'>-		if (buf == NULL) {</div><div class='del'>-			 if (!xdr_int (xdrs, &amp;objp-&gt;op_ret))</div><div class='del'>-				 return FALSE;</div><div class='del'>-			 if (!xdr_int (xdrs, &amp;objp-&gt;op_errno))</div><div class='del'>-				 return FALSE;</div><div class='del'>-			 if (!xdr_int (xdrs, &amp;objp-&gt;status))</div><div class='del'>-				 return FALSE;</div><div class='del'>-			 if (!xdr_int (xdrs, &amp;objp-&gt;port))</div><div class='del'>-				 return FALSE;</div><div class='del'>-		} else {</div><div class='del'>-			IXDR_PUT_LONG(buf, objp-&gt;op_ret);</div><div class='del'>-			IXDR_PUT_LONG(buf, objp-&gt;op_errno);</div><div class='del'>-			IXDR_PUT_LONG(buf, objp-&gt;status);</div><div class='del'>-			IXDR_PUT_LONG(buf, objp-&gt;port);</div><div class='del'>-		}</div><div class='del'>-		return TRUE;</div><div class='del'>-	} else if (xdrs-&gt;x_op == XDR_DECODE) {</div><div class='del'>-		buf = XDR_INLINE (xdrs, 4 * BYTES_PER_XDR_UNIT);</div><div class='del'>-		if (buf == NULL) {</div><div class='del'>-			 if (!xdr_int (xdrs, &amp;objp-&gt;op_ret))</div><div class='del'>-				 return FALSE;</div><div class='del'>-			 if (!xdr_int (xdrs, &amp;objp-&gt;op_errno))</div><div class='del'>-				 return FALSE;</div><div class='del'>-			 if (!xdr_int (xdrs, &amp;objp-&gt;status))</div><div class='del'>-				 return FALSE;</div><div class='del'>-			 if (!xdr_int (xdrs, &amp;objp-&gt;port))</div><div class='del'>-				 return FALSE;</div><div class='del'>-		} else {</div><div class='del'>-			objp-&gt;op_ret = IXDR_GET_LONG(buf);</div><div class='del'>-			objp-&gt;op_errno = IXDR_GET_LONG(buf);</div><div class='del'>-			objp-&gt;status = IXDR_GET_LONG(buf);</div><div class='del'>-			objp-&gt;port = IXDR_GET_LONG(buf);</div><div class='del'>-		}</div><div class='del'>-	 return TRUE;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	 if (!xdr_int (xdrs, &amp;objp-&gt;op_ret))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_int (xdrs, &amp;objp-&gt;op_errno))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_int (xdrs, &amp;objp-&gt;status))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_int (xdrs, &amp;objp-&gt;port))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	return TRUE;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-bool_t</div><div class='del'>-xdr_pmap_brick_by_port_req (XDR *xdrs, pmap_brick_by_port_req *objp)</div><div class='del'>-{</div><div class='del'>-	 if (!xdr_int (xdrs, &amp;objp-&gt;port))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	return TRUE;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-bool_t</div><div class='del'>-xdr_pmap_brick_by_port_rsp (XDR *xdrs, pmap_brick_by_port_rsp *objp)</div><div class='del'>-{</div><div class='del'>-	register int32_t *buf;</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-	if (xdrs-&gt;x_op == XDR_ENCODE) {</div><div class='del'>-		buf = XDR_INLINE (xdrs, 3 * BYTES_PER_XDR_UNIT);</div><div class='del'>-		if (buf == NULL) {</div><div class='del'>-			 if (!xdr_int (xdrs, &amp;objp-&gt;op_ret))</div><div class='del'>-				 return FALSE;</div><div class='del'>-			 if (!xdr_int (xdrs, &amp;objp-&gt;op_errno))</div><div class='del'>-				 return FALSE;</div><div class='del'>-			 if (!xdr_int (xdrs, &amp;objp-&gt;status))</div><div class='del'>-				 return FALSE;</div><div class='del'>-</div><div class='del'>-		} else {</div><div class='del'>-		IXDR_PUT_LONG(buf, objp-&gt;op_ret);</div><div class='del'>-		IXDR_PUT_LONG(buf, objp-&gt;op_errno);</div><div class='del'>-		IXDR_PUT_LONG(buf, objp-&gt;status);</div><div class='del'>-		}</div><div class='del'>-		 if (!xdr_string (xdrs, &amp;objp-&gt;brick, ~0))</div><div class='del'>-			 return FALSE;</div><div class='del'>-		return TRUE;</div><div class='del'>-	} else if (xdrs-&gt;x_op == XDR_DECODE) {</div><div class='del'>-		buf = XDR_INLINE (xdrs, 3 * BYTES_PER_XDR_UNIT);</div><div class='del'>-		if (buf == NULL) {</div><div class='del'>-			 if (!xdr_int (xdrs, &amp;objp-&gt;op_ret))</div><div class='del'>-				 return FALSE;</div><div class='del'>-			 if (!xdr_int (xdrs, &amp;objp-&gt;op_errno))</div><div class='del'>-				 return FALSE;</div><div class='del'>-			 if (!xdr_int (xdrs, &amp;objp-&gt;status))</div><div class='del'>-				 return FALSE;</div><div class='del'>-</div><div class='del'>-		} else {</div><div class='del'>-		objp-&gt;op_ret = IXDR_GET_LONG(buf);</div><div class='del'>-		objp-&gt;op_errno = IXDR_GET_LONG(buf);</div><div class='del'>-		objp-&gt;status = IXDR_GET_LONG(buf);</div><div class='del'>-		}</div><div class='del'>-		 if (!xdr_string (xdrs, &amp;objp-&gt;brick, ~0))</div><div class='del'>-			 return FALSE;</div><div class='del'>-	 return TRUE;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	 if (!xdr_int (xdrs, &amp;objp-&gt;op_ret))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_int (xdrs, &amp;objp-&gt;op_errno))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_int (xdrs, &amp;objp-&gt;status))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_string (xdrs, &amp;objp-&gt;brick, ~0))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	return TRUE;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-bool_t</div><div class='del'>-xdr_pmap_signup_req (XDR *xdrs, pmap_signup_req *objp)</div><div class='del'>-{</div><div class='del'>-	 if (!xdr_string (xdrs, &amp;objp-&gt;brick, ~0))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_int (xdrs, &amp;objp-&gt;port))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	return TRUE;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-bool_t</div><div class='del'>-xdr_pmap_signup_rsp (XDR *xdrs, pmap_signup_rsp *objp)</div><div class='del'>-{</div><div class='del'>-	 if (!xdr_int (xdrs, &amp;objp-&gt;op_ret))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_int (xdrs, &amp;objp-&gt;op_errno))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	return TRUE;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-bool_t</div><div class='del'>-xdr_pmap_signin_req (XDR *xdrs, pmap_signin_req *objp)</div><div class='del'>-{</div><div class='del'>-	 if (!xdr_string (xdrs, &amp;objp-&gt;brick, ~0))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_int (xdrs, &amp;objp-&gt;port))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	return TRUE;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-bool_t</div><div class='del'>-xdr_pmap_signin_rsp (XDR *xdrs, pmap_signin_rsp *objp)</div><div class='del'>-{</div><div class='del'>-	 if (!xdr_int (xdrs, &amp;objp-&gt;op_ret))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_int (xdrs, &amp;objp-&gt;op_errno))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	return TRUE;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-bool_t</div><div class='del'>-xdr_pmap_signout_req (XDR *xdrs, pmap_signout_req *objp)</div><div class='del'>-{</div><div class='del'>-	 if (!xdr_string (xdrs, &amp;objp-&gt;brick, ~0))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_int (xdrs, &amp;objp-&gt;port))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	return TRUE;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-bool_t</div><div class='del'>-xdr_pmap_signout_rsp (XDR *xdrs, pmap_signout_rsp *objp)</div><div class='del'>-{</div><div class='del'>-	 if (!xdr_int (xdrs, &amp;objp-&gt;op_ret))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	 if (!xdr_int (xdrs, &amp;objp-&gt;op_errno))</div><div class='del'>-		 return FALSE;</div><div class='del'>-	return TRUE;</div><div class='del'>-}</div><div class='head'>diff --git a/rpc/xdr/src/portmap-xdr.h b/rpc/xdr/src/portmap-xdr.h<br/>deleted file mode 100644<br/>index e53cc15ae4d..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/rpc/xdr/src/portmap-xdr.h?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>rpc/xdr/src/portmap-xdr.h</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,131 +0,0 @@</div><div class='del'>-/*</div><div class='del'>-  Copyright (c) 2010 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='del'>-  This file is part of GlusterFS.</div><div class='del'>-</div><div class='del'>-  GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-  it under the terms of the GNU Affero General Public License as published</div><div class='del'>-  by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-  or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-  GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-  WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-  Affero General Public License for more details.</div><div class='del'>-</div><div class='del'>-  You should have received a copy of the GNU Affero General Public License</div><div class='del'>-  along with this program.  If not, see</div><div class='del'>-  &lt;http://www.gnu.org/licenses/&gt;.</div><div class='del'>-*/</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-/*</div><div class='del'>- * Please do not edit this file.</div><div class='del'>- * It was generated using rpcgen.</div><div class='del'>- */</div><div class='del'>-</div><div class='del'>-#ifndef _PORTMAP_H_RPCGEN</div><div class='del'>-#define _PORTMAP_H_RPCGEN</div><div class='del'>-</div><div class='del'>-#include &lt;rpc/rpc.h&gt;</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-#ifdef __cplusplus</div><div class='del'>-extern "C" {</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-struct pmap_port_by_brick_req {</div><div class='del'>-	char *brick;</div><div class='del'>-};</div><div class='del'>-typedef struct pmap_port_by_brick_req pmap_port_by_brick_req;</div><div class='del'>-</div><div class='del'>-struct pmap_port_by_brick_rsp {</div><div class='del'>-	int op_ret;</div><div class='del'>-	int op_errno;</div><div class='del'>-	int status;</div><div class='del'>-	int port;</div><div class='del'>-};</div><div class='del'>-typedef struct pmap_port_by_brick_rsp pmap_port_by_brick_rsp;</div><div class='del'>-</div><div class='del'>-struct pmap_brick_by_port_req {</div><div class='del'>-	int port;</div><div class='del'>-};</div><div class='del'>-typedef struct pmap_brick_by_port_req pmap_brick_by_port_req;</div><div class='del'>-</div><div class='del'>-struct pmap_brick_by_port_rsp {</div><div class='del'>-	int op_ret;</div><div class='del'>-	int op_errno;</div><div class='del'>-	int status;</div><div class='del'>-	char *brick;</div><div class='del'>-};</div><div class='del'>-typedef struct pmap_brick_by_port_rsp pmap_brick_by_port_rsp;</div><div class='del'>-</div><div class='del'>-struct pmap_signup_req {</div><div class='del'>-	char *brick;</div><div class='del'>-	int port;</div><div class='del'>-};</div><div class='del'>-typedef struct pmap_signup_req pmap_signup_req;</div><div class='del'>-</div><div class='del'>-struct pmap_signup_rsp {</div><div class='del'>-	int op_ret;</div><div class='del'>-	int op_errno;</div><div class='del'>-};</div><div class='del'>-typedef struct pmap_signup_rsp pmap_signup_rsp;</div><div class='del'>-</div><div class='del'>-struct pmap_signin_req {</div><div class='del'>-	char *brick;</div><div class='del'>-	int port;</div><div class='del'>-};</div><div class='del'>-typedef struct pmap_signin_req pmap_signin_req;</div><div class='del'>-</div><div class='del'>-struct pmap_signin_rsp {</div><div class='del'>-	int op_ret;</div><div class='del'>-	int op_errno;</div><div class='del'>-};</div><div class='del'>-typedef struct pmap_signin_rsp pmap_signin_rsp;</div><div class='del'>-</div><div class='del'>-struct pmap_signout_req {</div><div class='del'>-	char *brick;</div><div class='del'>-	int port;</div><div class='del'>-};</div><div class='del'>-typedef struct pmap_signout_req pmap_signout_req;</div><div class='del'>-</div><div class='del'>-struct pmap_signout_rsp {</div><div class='del'>-	int op_ret;</div><div class='del'>-	int op_errno;</div><div class='del'>-};</div><div class='del'>-typedef struct pmap_signout_rsp pmap_signout_rsp;</div><div class='del'>-</div><div class='del'>-/* the xdr functions */</div><div class='del'>-</div><div class='del'>-#if defined(__STDC__) || defined(__cplusplus)</div><div class='del'>-extern  bool_t xdr_pmap_port_by_brick_req (XDR *, pmap_port_by_brick_req*);</div><div class='del'>-extern  bool_t xdr_pmap_port_by_brick_rsp (XDR *, pmap_port_by_brick_rsp*);</div><div class='del'>-extern  bool_t xdr_pmap_brick_by_port_req (XDR *, pmap_brick_by_port_req*);</div><div class='del'>-extern  bool_t xdr_pmap_brick_by_port_rsp (XDR *, pmap_brick_by_port_rsp*);</div><div class='del'>-extern  bool_t xdr_pmap_signup_req (XDR *, pmap_signup_req*);</div><div class='del'>-extern  bool_t xdr_pmap_signup_rsp (XDR *, pmap_signup_rsp*);</div><div class='del'>-extern  bool_t xdr_pmap_signin_req (XDR *, pmap_signin_req*);</div><div class='del'>-extern  bool_t xdr_pmap_signin_rsp (XDR *, pmap_signin_rsp*);</div><div class='del'>-extern  bool_t xdr_pmap_signout_req (XDR *, pmap_signout_req*);</div><div class='del'>-extern  bool_t xdr_pmap_signout_rsp (XDR *, pmap_signout_rsp*);</div><div class='del'>-</div><div class='del'>-#else /* K&amp;R C */</div><div class='del'>-extern bool_t xdr_pmap_port_by_brick_req ();</div><div class='del'>-extern bool_t xdr_pmap_port_by_brick_rsp ();</div><div class='del'>-extern bool_t xdr_pmap_brick_by_port_req ();</div><div class='del'>-extern bool_t xdr_pmap_brick_by_port_rsp ();</div><div class='del'>-extern bool_t xdr_pmap_signup_req ();</div><div class='del'>-extern bool_t xdr_pmap_signup_rsp ();</div><div class='del'>-extern bool_t xdr_pmap_signin_req ();</div><div class='del'>-extern bool_t xdr_pmap_signin_rsp ();</div><div class='del'>-extern bool_t xdr_pmap_signout_req ();</div><div class='del'>-extern bool_t xdr_pmap_signout_rsp ();</div><div class='del'>-</div><div class='del'>-#endif /* K&amp;R C */</div><div class='del'>-</div><div class='del'>-#ifdef __cplusplus</div><div class='del'>-}</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-#endif /* !_PORTMAP_H_RPCGEN */</div><div class='head'>diff --git a/rpc/xdr/src/portmap-xdr.x b/rpc/xdr/src/portmap-xdr.x<br/>new file mode 100644<br/>index 00000000000..23515572b9f<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/rpc/xdr/src/portmap-xdr.x?id=d1d7a6f35c816822fab51c820e25023863c239c1'>rpc/xdr/src/portmap-xdr.x</a></div><div class='hunk'>@@ -0,0 +1,60 @@</div><div class='add'>+/*</div><div class='add'>+ * Copyright (c) 2012 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+ * This file is part of GlusterFS.</div><div class='add'>+ *</div><div class='add'>+ * This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+ * General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+ * later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+ * cases as published by the Free Software Foundation.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+#ifdef RPC_XDR</div><div class='add'>+%#include "rpc-pragmas.h"</div><div class='add'>+#endif</div><div class='add'>+%#include &lt;glusterfs/compat.h&gt;</div><div class='add'>+</div><div class='add'>+struct pmap_port_by_brick_req {</div><div class='add'>+       string   brick&lt;&gt;;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct pmap_port_by_brick_rsp {</div><div class='add'>+       int      op_ret;</div><div class='add'>+       int      op_errno;</div><div class='add'>+       int      status;</div><div class='add'>+       int      port;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+struct pmap_brick_by_port_req {</div><div class='add'>+       int      port;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct pmap_brick_by_port_rsp {</div><div class='add'>+       int      op_ret;</div><div class='add'>+       int      op_errno;</div><div class='add'>+       int      status;</div><div class='add'>+       string   brick&lt;&gt;;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+struct pmap_signin_req {</div><div class='add'>+       string brick&lt;&gt;;</div><div class='add'>+       int port;</div><div class='add'>+       int pid;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct pmap_signin_rsp {</div><div class='add'>+       int      op_ret;</div><div class='add'>+       int      op_errno;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct pmap_signout_req {</div><div class='add'>+       string brick&lt;&gt;;</div><div class='add'>+       int port;</div><div class='add'>+       int rdma_port;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct pmap_signout_rsp {</div><div class='add'>+       int      op_ret;</div><div class='add'>+       int      op_errno;</div><div class='add'>+};</div><div class='head'>diff --git a/rpc/xdr/src/portmap.c b/rpc/xdr/src/portmap.c<br/>deleted file mode 100644<br/>index fd29bf9a108..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/rpc/xdr/src/portmap.c?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>rpc/xdr/src/portmap.c</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,189 +0,0 @@</div><div class='del'>-/*</div><div class='del'>-  Copyright (c) 2010 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='del'>-  This file is part of GlusterFS.</div><div class='del'>-</div><div class='del'>-  GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-  it under the terms of the GNU Affero General Public License as published</div><div class='del'>-  by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-  or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-  GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-  WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-  Affero General Public License for more details.</div><div class='del'>-</div><div class='del'>-  You should have received a copy of the GNU Affero General Public License</div><div class='del'>-  along with this program.  If not, see</div><div class='del'>-  &lt;http://www.gnu.org/licenses/&gt;.</div><div class='del'>-*/</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-#include "portmap.h"</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_to_pmap_port_by_brick_req (struct iovec inmsg, void *args)</div><div class='del'>-{</div><div class='del'>-        return xdr_to_generic (inmsg, (void *)args,</div><div class='del'>-                               (xdrproc_t)xdr_pmap_port_by_brick_req);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_to_pmap_port_by_brick_rsp (struct iovec inmsg, void *args)</div><div class='del'>-{</div><div class='del'>-        return xdr_to_generic (inmsg, (void *)args,</div><div class='del'>-                               (xdrproc_t)xdr_pmap_port_by_brick_rsp);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_from_pmap_port_by_brick_req (struct iovec inmsg, void *args)</div><div class='del'>-{</div><div class='del'>-        return xdr_serialize_generic (inmsg, (void *)args,</div><div class='del'>-                                      (xdrproc_t)xdr_pmap_port_by_brick_req);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_from_pmap_port_by_brick_rsp (struct iovec inmsg, void *args)</div><div class='del'>-{</div><div class='del'>-        return xdr_serialize_generic (inmsg, (void *)args,</div><div class='del'>-                                      (xdrproc_t)xdr_pmap_port_by_brick_rsp);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_to_pmap_brick_by_port_req (struct iovec inmsg, void *args)</div><div class='del'>-{</div><div class='del'>-        return xdr_to_generic (inmsg, (void *)args,</div><div class='del'>-                               (xdrproc_t)xdr_pmap_brick_by_port_req);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_to_pmap_brick_by_port_rsp (struct iovec inmsg, void *args)</div><div class='del'>-{</div><div class='del'>-        return xdr_to_generic (inmsg, (void *)args,</div><div class='del'>-                               (xdrproc_t)xdr_pmap_brick_by_port_rsp);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_from_pmap_brick_by_port_req (struct iovec inmsg, void *args)</div><div class='del'>-{</div><div class='del'>-        return xdr_serialize_generic (inmsg, (void *)args,</div><div class='del'>-                                      (xdrproc_t)xdr_pmap_brick_by_port_req);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_from_pmap_brick_by_port_rsp (struct iovec inmsg, void *args)</div><div class='del'>-{</div><div class='del'>-        return xdr_serialize_generic (inmsg, (void *)args,</div><div class='del'>-                                      (xdrproc_t)xdr_pmap_brick_by_port_rsp);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_to_pmap_signup_req (struct iovec inmsg, void *args)</div><div class='del'>-{</div><div class='del'>-        return xdr_to_generic (inmsg, (void *)args,</div><div class='del'>-                               (xdrproc_t)xdr_pmap_signup_req);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_to_pmap_signup_rsp (struct iovec inmsg, void *args)</div><div class='del'>-{</div><div class='del'>-        return xdr_to_generic (inmsg, (void *)args,</div><div class='del'>-                               (xdrproc_t)xdr_pmap_signup_rsp);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_from_pmap_signup_req (struct iovec inmsg, void *args)</div><div class='del'>-{</div><div class='del'>-        return xdr_serialize_generic (inmsg, (void *)args,</div><div class='del'>-                                      (xdrproc_t)xdr_pmap_signup_req);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_from_pmap_signup_rsp (struct iovec inmsg, void *args)</div><div class='del'>-{</div><div class='del'>-        return xdr_serialize_generic (inmsg, (void *)args,</div><div class='del'>-                                      (xdrproc_t)xdr_pmap_signup_rsp);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_to_pmap_signin_req (struct iovec inmsg, void *args)</div><div class='del'>-{</div><div class='del'>-        return xdr_to_generic (inmsg, (void *)args,</div><div class='del'>-                               (xdrproc_t)xdr_pmap_signin_req);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_to_pmap_signin_rsp (struct iovec inmsg, void *args)</div><div class='del'>-{</div><div class='del'>-        return xdr_to_generic (inmsg, (void *)args,</div><div class='del'>-                               (xdrproc_t)xdr_pmap_signin_rsp);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_from_pmap_signin_req (struct iovec inmsg, void *args)</div><div class='del'>-{</div><div class='del'>-        return xdr_serialize_generic (inmsg, (void *)args,</div><div class='del'>-                                      (xdrproc_t)xdr_pmap_signin_req);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_from_pmap_signin_rsp (struct iovec inmsg, void *args)</div><div class='del'>-{</div><div class='del'>-        return xdr_serialize_generic (inmsg, (void *)args,</div><div class='del'>-                                      (xdrproc_t)xdr_pmap_signin_rsp);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_to_pmap_signout_req (struct iovec inmsg, void *args)</div><div class='del'>-{</div><div class='del'>-        return xdr_to_generic (inmsg, (void *)args,</div><div class='del'>-                               (xdrproc_t)xdr_pmap_signout_req);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_to_pmap_signout_rsp (struct iovec inmsg, void *args)</div><div class='del'>-{</div><div class='del'>-        return xdr_to_generic (inmsg, (void *)args,</div><div class='del'>-                               (xdrproc_t)xdr_pmap_signout_rsp);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_from_pmap_signout_req (struct iovec inmsg, void *args)</div><div class='del'>-{</div><div class='del'>-        return xdr_serialize_generic (inmsg, (void *)args,</div><div class='del'>-                                      (xdrproc_t)xdr_pmap_signout_req);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_from_pmap_signout_rsp (struct iovec inmsg, void *args)</div><div class='del'>-{</div><div class='del'>-        return xdr_serialize_generic (inmsg, (void *)args,</div><div class='del'>-                                      (xdrproc_t)xdr_pmap_signout_rsp);</div><div class='del'>-}</div><div class='del'>-</div><div class='head'>diff --git a/rpc/xdr/src/portmap.h b/rpc/xdr/src/portmap.h<br/>deleted file mode 100644<br/>index 397a6393821..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/rpc/xdr/src/portmap.h?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>rpc/xdr/src/portmap.h</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,95 +0,0 @@</div><div class='del'>-/*</div><div class='del'>-  Copyright (c) 2010 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='del'>-  This file is part of GlusterFS.</div><div class='del'>-</div><div class='del'>-  GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-  it under the terms of the GNU Affero General Public License as published</div><div class='del'>-  by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-  or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-  GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-  WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-  Affero General Public License for more details.</div><div class='del'>-</div><div class='del'>-  You should have received a copy of the GNU Affero General Public License</div><div class='del'>-  along with this program.  If not, see</div><div class='del'>-  &lt;http://www.gnu.org/licenses/&gt;.</div><div class='del'>-*/</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-#ifndef _PORTMAP_H</div><div class='del'>-#define _PORTMAP_H</div><div class='del'>-</div><div class='del'>-#include &lt;sys/uio.h&gt;</div><div class='del'>-</div><div class='del'>-#include "xdr-generic.h"</div><div class='del'>-#include "portmap-xdr.h"</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_to_pmap_port_by_brick_req (struct iovec inmsg, void *args);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_to_pmap_port_by_brick_rsp (struct iovec inmsg, void *args);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_from_pmap_port_by_brick_req (struct iovec outmsg, void *args);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_from_pmap_port_by_brick_rsp (struct iovec outmsg, void *args);</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_to_pmap_brick_by_port_req (struct iovec inmsg, void *args);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_to_pmap_brick_by_port_rsp (struct iovec inmsg, void *args);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_from_pmap_brick_by_port_req (struct iovec outmsg, void *args);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_from_pmap_brick_by_port_rsp (struct iovec outmsg, void *args);</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_from_pmap_signup_req (struct iovec msg, void *args);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_from_pmap_signup_rsp (struct iovec msg, void *args);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_to_pmap_signup_req (struct iovec msg, void *args);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_to_pmap_signup_rsp (struct iovec msg, void *args);</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_from_pmap_signin_req (struct iovec msg, void *args);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_from_pmap_signin_rsp (struct iovec msg, void *args);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_to_pmap_signin_req (struct iovec msg, void *args);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_to_pmap_signin_rsp (struct iovec msg, void *args);</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_from_pmap_signout_req (struct iovec msg, void *args);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_from_pmap_signout_rsp (struct iovec msg, void *args);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_to_pmap_signout_req (struct iovec msg, void *args);</div><div class='del'>-</div><div class='del'>-ssize_t</div><div class='del'>-xdr_to_pmap_signout_rsp (struct iovec msg, void *args);</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-#endif /* !_PORTMAP_H */</div><div class='head'>diff --git a/rpc/xdr/src/portmap.x b/rpc/xdr/src/portmap.x<br/>deleted file mode 100644<br/>index 6e9f07c4534..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/rpc/xdr/src/portmap.x?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>rpc/xdr/src/portmap.x</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,45 +0,0 @@</div><div class='del'>-</div><div class='del'>-struct pmap_port_by_brick_req {</div><div class='del'>-       string   brick&lt;&gt;;</div><div class='del'>-};</div><div class='del'>-</div><div class='del'>-struct pmap_port_by_brick_rsp {</div><div class='del'>-       int      op_ret;</div><div class='del'>-       int      op_errno;</div><div class='del'>-       int      status;</div><div class='del'>-       int      port;</div><div class='del'>-};</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-struct pmap_brick_by_port_req {</div><div class='del'>-       int      port;</div><div class='del'>-};</div><div class='del'>-</div><div class='del'>-struct pmap_brick_by_port_rsp {</div><div class='del'>-       int      op_ret;</div><div class='del'>-       int      op_errno;</div><div class='del'>-       int      status;</div><div class='del'>-       string   brick&lt;&gt;;</div><div class='del'>-};</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-struct pmap_signup_req {</div><div class='del'>-};</div><div class='del'>-</div><div class='del'>-struct pmap_signup_rsp {</div><div class='del'>-};</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-struct pmap_signon_req {</div><div class='del'>-};</div><div class='del'>-</div><div class='del'>-struct pmap_signon_rsp {</div><div class='del'>-};</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-struct pmap_signoff_req {</div><div class='del'>-};</div><div class='del'>-</div><div class='del'>-struct pmap_signoff_rsp {</div><div class='del'>-};</div><div class='del'>-</div><div class='head'>diff --git a/rpc/xdr/src/rpc-common-xdr.x b/rpc/xdr/src/rpc-common-xdr.x<br/>new file mode 100644<br/>index 00000000000..baf8b4313c8<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/rpc/xdr/src/rpc-common-xdr.x?id=d1d7a6f35c816822fab51c820e25023863c239c1'>rpc/xdr/src/rpc-common-xdr.x</a></div><div class='hunk'>@@ -0,0 +1,66 @@</div><div class='add'>+/*</div><div class='add'>+ * Copyright (c) 2012 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+ * This file is part of GlusterFS.</div><div class='add'>+ *</div><div class='add'>+ * This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+ * General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+ * later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+ * cases as published by the Free Software Foundation.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+#ifdef RPC_XDR</div><div class='add'>+%#include "rpc-pragmas.h"</div><div class='add'>+#endif</div><div class='add'>+%#include &lt;glusterfs/glusterfs-fops.h&gt;</div><div class='add'>+</div><div class='add'>+/* This file has definition of few XDR structures which are</div><div class='add'>+ * not captured in any section specific file */</div><div class='add'>+</div><div class='add'>+%#include "xdr-common.h"</div><div class='add'>+</div><div class='add'>+struct auth_glusterfs_parms_v2 {</div><div class='add'>+        int pid;</div><div class='add'>+        unsigned int uid;</div><div class='add'>+        unsigned int gid;</div><div class='add'>+        unsigned int groups&lt;&gt;;</div><div class='add'>+        opaque lk_owner&lt;&gt;;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct auth_glusterfs_parms {</div><div class='add'>+        u_quad_t lk_owner;</div><div class='add'>+        unsigned int pid;</div><div class='add'>+        unsigned int uid;</div><div class='add'>+	unsigned int gid;</div><div class='add'>+	unsigned int ngrps;</div><div class='add'>+	unsigned groups[16];</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct gf_dump_req {</div><div class='add'>+	u_quad_t gfs_id;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct gf_statedump {</div><div class='add'>+	unsigned int pid;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct gf_prog_detail {</div><div class='add'>+	string progname&lt;&gt;;</div><div class='add'>+	u_quad_t prognum;</div><div class='add'>+	u_quad_t progver;</div><div class='add'>+	struct gf_prog_detail *next;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+struct gf_dump_rsp {</div><div class='add'>+        u_quad_t gfs_id;</div><div class='add'>+        int op_ret;</div><div class='add'>+	int op_errno;</div><div class='add'>+	struct gf_prog_detail *prog;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+struct gf_common_rsp {</div><div class='add'>+       int    op_ret;</div><div class='add'>+       int    op_errno;</div><div class='add'>+       opaque   xdata&lt;&gt;; /* Extra data */</div><div class='add'>+} ;</div><div class='head'>diff --git a/rpc/xdr/src/rpc-pragmas.h b/rpc/xdr/src/rpc-pragmas.h<br/>new file mode 100644<br/>index 00000000000..4c54cf6f1df<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/rpc/xdr/src/rpc-pragmas.h?id=d1d7a6f35c816822fab51c820e25023863c239c1'>rpc/xdr/src/rpc-pragmas.h</a></div><div class='hunk'>@@ -0,0 +1,28 @@</div><div class='add'>+/*</div><div class='add'>+  Copyright (c) 2016 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#ifndef GLUSTERFS_RPC_PRAGMAS_H</div><div class='add'>+#define GLUSTERFS_RPC_PRAGMAS_H</div><div class='add'>+</div><div class='add'>+#if defined(__GNUC__)</div><div class='add'>+#if __GNUC__ &gt;= 4</div><div class='add'>+#if !defined(__clang__)</div><div class='add'>+#if !defined(__NetBSD__)</div><div class='add'>+#pragma GCC diagnostic ignored "-Wunused-but-set-variable"</div><div class='add'>+#pragma GCC diagnostic ignored "-Wunused-variable"</div><div class='add'>+#endif</div><div class='add'>+#else</div><div class='add'>+#pragma clang diagnostic ignored "-Wunused-variable"</div><div class='add'>+#pragma clang diagnostic ignored "-Wunused-value"</div><div class='add'>+#endif</div><div class='add'>+#endif</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#endif /* GLUSTERFS_RPC_PRAGMAS_H */</div><div class='head'>diff --git a/rpc/xdr/src/xdr-generic.c b/rpc/xdr/src/xdr-generic.c<br/>index f7e09482b45..20b54eb0a8a 100644<br/>--- a/<a href='/cgit/glusterfs.git/tree/rpc/xdr/src/xdr-generic.c?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>rpc/xdr/src/xdr-generic.c</a><br/>+++ b/<a href='/cgit/glusterfs.git/tree/rpc/xdr/src/xdr-generic.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>rpc/xdr/src/xdr-generic.c</a></div><div class='hunk'>@@ -1,98 +1,120 @@</div><div class='ctx'> /*</div><div class='del'>-  Copyright (c) 2007-2010 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='add'>+  Copyright (c) 2007-2012 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='ctx'>   This file is part of GlusterFS.</div><div class='ctx'> </div><div class='del'>-  GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-  it under the terms of the GNU Affero General Public License as published</div><div class='del'>-  by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-  or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-  GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-  WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-  Affero General Public License for more details.</div><div class='del'>-</div><div class='del'>-  You should have received a copy of the GNU Affero General Public License</div><div class='del'>-  along with this program.  If not, see</div><div class='del'>-  &lt;http://www.gnu.org/licenses/&gt;.</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='ctx'> */</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> #include "xdr-generic.h"</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> ssize_t</div><div class='del'>-xdr_serialize_generic (struct iovec outmsg, void *res, xdrproc_t proc)</div><div class='add'>+xdr_serialize_generic(struct iovec outmsg, void *res, xdrproc_t proc)</div><div class='ctx'> {</div><div class='del'>-        ssize_t ret = -1;</div><div class='del'>-        XDR     xdr;</div><div class='add'>+    ssize_t ret = -1;</div><div class='add'>+    XDR xdr;</div><div class='ctx'> </div><div class='del'>-        if ((!outmsg.iov_base) || (!res) || (!proc))</div><div class='del'>-                return -1;</div><div class='add'>+    if ((!outmsg.iov_base) || (!res) || (!proc))</div><div class='add'>+        return -1;</div><div class='ctx'> </div><div class='del'>-        xdrmem_create (&amp;xdr, outmsg.iov_base, (unsigned int)outmsg.iov_len,</div><div class='del'>-                       XDR_ENCODE);</div><div class='add'>+    xdrmem_create(&amp;xdr, outmsg.iov_base, (unsigned int)outmsg.iov_len,</div><div class='add'>+                  XDR_ENCODE);</div><div class='ctx'> </div><div class='del'>-        if (!proc (&amp;xdr, res)) {</div><div class='del'>-                ret = -1;</div><div class='del'>-                goto ret;</div><div class='del'>-        }</div><div class='add'>+    if (!PROC(&amp;xdr, res)) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto ret;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        ret = xdr_encoded_length (xdr);</div><div class='add'>+    ret = xdr_encoded_length(xdr);</div><div class='ctx'> </div><div class='ctx'> ret:</div><div class='del'>-        return ret;</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> ssize_t</div><div class='del'>-xdr_to_generic (struct iovec inmsg, void *args, xdrproc_t proc)</div><div class='add'>+xdr_to_generic(struct iovec inmsg, void *args, xdrproc_t proc)</div><div class='ctx'> {</div><div class='del'>-        XDR     xdr;</div><div class='del'>-        ssize_t ret = -1;</div><div class='add'>+    XDR xdr;</div><div class='add'>+    ssize_t ret = -1;</div><div class='ctx'> </div><div class='del'>-        if ((!inmsg.iov_base) || (!args) || (!proc))</div><div class='del'>-                return -1;</div><div class='add'>+    if ((!inmsg.iov_base) || (!args) || (!proc))</div><div class='add'>+        return -1;</div><div class='ctx'> </div><div class='del'>-        xdrmem_create (&amp;xdr, inmsg.iov_base, (unsigned int)inmsg.iov_len,</div><div class='del'>-                       XDR_DECODE);</div><div class='add'>+    xdrmem_create(&amp;xdr, inmsg.iov_base, (unsigned int)inmsg.iov_len,</div><div class='add'>+                  XDR_DECODE);</div><div class='ctx'> </div><div class='del'>-        if (!proc (&amp;xdr, args)) {</div><div class='del'>-                ret  = -1;</div><div class='del'>-                goto ret;</div><div class='del'>-        }</div><div class='add'>+    if (!PROC(&amp;xdr, args)) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto ret;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        ret = xdr_decoded_length (xdr);</div><div class='add'>+    ret = xdr_decoded_length(xdr);</div><div class='ctx'> ret:</div><div class='del'>-        return ret;</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> ssize_t</div><div class='del'>-xdr_to_generic_payload (struct iovec inmsg, void *args, xdrproc_t proc,</div><div class='del'>-                        struct iovec *pendingpayload)</div><div class='add'>+xdr_to_generic_payload(struct iovec inmsg, void *args, xdrproc_t proc,</div><div class='add'>+                       struct iovec *pendingpayload)</div><div class='ctx'> {</div><div class='del'>-        XDR     xdr;</div><div class='del'>-        ssize_t ret = -1;</div><div class='add'>+    XDR xdr;</div><div class='add'>+    ssize_t ret = -1;</div><div class='ctx'> </div><div class='del'>-        if ((!inmsg.iov_base) || (!args) || (!proc))</div><div class='del'>-                return -1;</div><div class='add'>+    if ((!inmsg.iov_base) || (!args) || (!proc))</div><div class='add'>+        return -1;</div><div class='ctx'> </div><div class='del'>-        xdrmem_create (&amp;xdr, inmsg.iov_base, (unsigned int)inmsg.iov_len,</div><div class='del'>-                       XDR_DECODE);</div><div class='add'>+    xdrmem_create(&amp;xdr, inmsg.iov_base, (unsigned int)inmsg.iov_len,</div><div class='add'>+                  XDR_DECODE);</div><div class='ctx'> </div><div class='del'>-        if (!proc (&amp;xdr, args)) {</div><div class='del'>-                ret  = -1;</div><div class='del'>-                goto ret;</div><div class='del'>-        }</div><div class='add'>+    if (!PROC(&amp;xdr, args)) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto ret;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        ret = xdr_decoded_length (xdr);</div><div class='add'>+    ret = xdr_decoded_length(xdr);</div><div class='ctx'> </div><div class='del'>-        if (pendingpayload) {</div><div class='del'>-                pendingpayload-&gt;iov_base = xdr_decoded_remaining_addr (xdr);</div><div class='del'>-                pendingpayload-&gt;iov_len = xdr_decoded_remaining_len (xdr);</div><div class='del'>-        }</div><div class='add'>+    if (pendingpayload) {</div><div class='add'>+        pendingpayload-&gt;iov_base = xdr_decoded_remaining_addr(xdr);</div><div class='add'>+        pendingpayload-&gt;iov_len = xdr_decoded_remaining_len(xdr);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='ctx'> ret:</div><div class='del'>-        return ret;</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+ssize_t</div><div class='add'>+xdr_length_round_up(size_t len, size_t bufsize)</div><div class='add'>+{</div><div class='add'>+    int roundup = 0;</div><div class='add'>+</div><div class='add'>+    roundup = len % XDR_BYTES_PER_UNIT;</div><div class='add'>+    if (roundup &gt; 0)</div><div class='add'>+        roundup = XDR_BYTES_PER_UNIT - roundup;</div><div class='add'>+</div><div class='add'>+    if ((roundup &gt; 0) &amp;&amp; ((roundup + len) &lt;= bufsize))</div><div class='add'>+        len += roundup;</div><div class='add'>+</div><div class='add'>+    return len;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+xdr_bytes_round_up(struct iovec *vec, size_t bufsize)</div><div class='add'>+{</div><div class='add'>+    vec-&gt;iov_len = xdr_length_round_up(vec-&gt;iov_len, bufsize);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+xdr_vector_round_up(struct iovec *vec, int vcount, uint32_t count)</div><div class='add'>+{</div><div class='add'>+    uint32_t round_count = 0;</div><div class='add'>+</div><div class='add'>+    round_count = xdr_length_round_up(count, 1048576);</div><div class='add'>+    round_count -= count;</div><div class='add'>+    if (round_count == 0 || vcount &lt;= 0)</div><div class='add'>+        return;</div><div class='add'>+</div><div class='add'>+    vec[vcount - 1].iov_len += round_count;</div><div class='ctx'> }</div><div class='head'>diff --git a/rpc/xdr/src/xdr-generic.h b/rpc/xdr/src/xdr-generic.h<br/>index 6526894da15..794dda508cc 100644<br/>--- a/<a href='/cgit/glusterfs.git/tree/rpc/xdr/src/xdr-generic.h?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>rpc/xdr/src/xdr-generic.h</a><br/>+++ b/<a href='/cgit/glusterfs.git/tree/rpc/xdr/src/xdr-generic.h?id=d1d7a6f35c816822fab51c820e25023863c239c1'>rpc/xdr/src/xdr-generic.h</a></div><div class='hunk'>@@ -1,44 +1,76 @@</div><div class='ctx'> /*</div><div class='del'>-  Copyright (c) 2007-2010 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='add'>+  Copyright (c) 2007-2012 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='ctx'>   This file is part of GlusterFS.</div><div class='ctx'> </div><div class='del'>-  GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-  it under the terms of the GNU Affero General Public License as published</div><div class='del'>-  by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-  or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-  GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-  WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-  Affero General Public License for more details.</div><div class='del'>-</div><div class='del'>-  You should have received a copy of the GNU Affero General Public License</div><div class='del'>-  along with this program.  If not, see</div><div class='del'>-  &lt;http://www.gnu.org/licenses/&gt;.</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='ctx'> */</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> #ifndef _XDR_GENERIC_H</div><div class='ctx'> #define _XDR_GENERIC_H</div><div class='ctx'> </div><div class='ctx'> #include &lt;sys/uio.h&gt;</div><div class='del'>-//#include &lt;rpc/rpc.h&gt;</div><div class='add'>+#include &lt;rpc/types.h&gt;</div><div class='ctx'> #include &lt;rpc/xdr.h&gt;</div><div class='ctx'> </div><div class='del'>-#define xdr_decoded_remaining_addr(xdr)        ((&amp;xdr)-&gt;x_private)</div><div class='del'>-#define xdr_decoded_remaining_len(xdr)         ((&amp;xdr)-&gt;x_handy)</div><div class='del'>-#define xdr_encoded_length(xdr) (((size_t)(&amp;xdr)-&gt;x_private) - ((size_t)(&amp;xdr)-&gt;x_base))</div><div class='del'>-#define xdr_decoded_length(xdr) (((size_t)(&amp;xdr)-&gt;x_private) - ((size_t)(&amp;xdr)-&gt;x_base))</div><div class='add'>+#include &lt;glusterfs/compat.h&gt;</div><div class='add'>+</div><div class='add'>+#define xdr_decoded_remaining_addr(xdr) ((&amp;xdr)-&gt;x_private)</div><div class='add'>+#define xdr_decoded_remaining_len(xdr) ((&amp;xdr)-&gt;x_handy)</div><div class='add'>+#define xdr_encoded_length(xdr)                                                \</div><div class='add'>+    (((size_t)(&amp;xdr)-&gt;x_private) - ((size_t)(&amp;xdr)-&gt;x_base))</div><div class='add'>+#define xdr_decoded_length(xdr)                                                \</div><div class='add'>+    (((size_t)(&amp;xdr)-&gt;x_private) - ((size_t)(&amp;xdr)-&gt;x_base))</div><div class='add'>+</div><div class='add'>+#define XDR_BYTES_PER_UNIT 4</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+  On OSX &gt; 10.9</div><div class='add'>+  -------------</div><div class='add'>+  typedef bool_t (*xdrproc_t)(XDR *, void *, unsigned int);</div><div class='add'>+</div><div class='add'>+  On OSX &lt; 10.9</div><div class='add'>+  ------------</div><div class='add'>+  typedef bool_t (*xdrproc_t)(XDR *, ...);</div><div class='ctx'> </div><div class='add'>+  FreeBSD all versions</div><div class='add'>+  ------------</div><div class='add'>+  typedef bool_t (*xdrproc_t)(XDR *, ...);</div><div class='add'>+</div><div class='add'>+  NetBSD 6.1.4</div><div class='add'>+  -----------</div><div class='add'>+  typedef bool_t (*xdrproc_t)(XDR *, const void *);</div><div class='add'>+</div><div class='add'>+  Linux all versions</div><div class='add'>+  -----------</div><div class='add'>+  typedef bool_t (*xdrproc_t)(XDR *, void *,...);</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#if defined(__NetBSD__)</div><div class='add'>+#define PROC(xdr, res) proc(xdr, res)</div><div class='add'>+#else</div><div class='add'>+#define PROC(xdr, res) proc(xdr, res, 0)</div><div class='add'>+#endif</div><div class='ctx'> </div><div class='ctx'> ssize_t</div><div class='del'>-xdr_serialize_generic (struct iovec outmsg, void *res, xdrproc_t proc);</div><div class='add'>+xdr_serialize_generic(struct iovec outmsg, void *res, xdrproc_t proc);</div><div class='ctx'> </div><div class='ctx'> ssize_t</div><div class='del'>-xdr_to_generic (struct iovec inmsg, void *args, xdrproc_t proc);</div><div class='add'>+xdr_to_generic(struct iovec inmsg, void *args, xdrproc_t proc);</div><div class='ctx'> </div><div class='ctx'> ssize_t</div><div class='del'>-xdr_to_generic_payload (struct iovec inmsg, void *args, xdrproc_t proc,</div><div class='del'>-                        struct iovec *pendingpayload);</div><div class='add'>+xdr_to_generic_payload(struct iovec inmsg, void *args, xdrproc_t proc,</div><div class='add'>+                       struct iovec *pendingpayload);</div><div class='add'>+</div><div class='add'>+extern int</div><div class='add'>+xdr_bytes_round_up(struct iovec *vec, size_t bufsize);</div><div class='add'>+</div><div class='add'>+extern ssize_t</div><div class='add'>+xdr_length_round_up(size_t len, size_t bufsize);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+xdr_vector_round_up(struct iovec *vec, int vcount, uint32_t count);</div><div class='ctx'> </div><div class='ctx'> #endif /* !_XDR_GENERIC_H */</div><div class='head'>diff --git a/rpc/xdr/src/xdr-nfs3.c b/rpc/xdr/src/xdr-nfs3.c<br/>new file mode 100644<br/>index 00000000000..cfccaaa89b8<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/rpc/xdr/src/xdr-nfs3.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>rpc/xdr/src/xdr-nfs3.c</a></div><div class='hunk'>@@ -0,0 +1,1907 @@</div><div class='add'>+/*</div><div class='add'>+  Copyright (c) 2007-2012 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#if defined(__GNUC__)</div><div class='add'>+#if __GNUC__ &gt;= 4</div><div class='add'>+#if !defined(__clang__)</div><div class='add'>+#if !defined(__NetBSD__)</div><div class='add'>+#pragma GCC diagnostic ignored "-Wunused-but-set-variable"</div><div class='add'>+#pragma GCC diagnostic ignored "-Wunused-variable"</div><div class='add'>+#endif</div><div class='add'>+#else</div><div class='add'>+#pragma clang diagnostic ignored "-Wunused-variable"</div><div class='add'>+#pragma clang diagnostic ignored "-Wunused-value"</div><div class='add'>+#endif</div><div class='add'>+#endif</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#include "xdr-nfs3.h"</div><div class='add'>+#include &lt;glusterfs/mem-pool.h&gt;</div><div class='add'>+#include "xdr-common.h"</div><div class='add'>+</div><div class='add'>+bool_t</div><div class='add'>+xdr_uint64(XDR *xdrs, uint64 *objp)</div><div class='add'>+{</div><div class='add'>+    if (!xdr_uint64_t(xdrs, objp))</div><div class='add'>+        return FALSE;</div><div class='add'>+    return TRUE;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+bool_t</div><div class='add'>+xdr_int64(XDR *xdrs, int64 *objp)</div><div class='add'>+{</div><div class='add'>+    if (!xdr_int64_t(xdrs, objp))</div><div class='add'>+        return FALSE;</div><div class='add'>+    return TRUE;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+bool_t</div><div class='add'>+xdr_uint32(XDR *xdrs, uint32 *objp)</div><div class='add'>+{</div><div class='add'>+    if (!xdr_uint32_t(xdrs, objp))</div><div class='add'>+        return FALSE;</div><div class='add'>+    return TRUE;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+bool_t</div><div class='add'>+xdr_int32(XDR *xdrs, int32 *objp)</div><div class='add'>+{</div><div class='add'>+    if (!xdr_int32_t(xdrs, objp))</div><div class='add'>+        return FALSE;</div><div class='add'>+    return TRUE;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+bool_t</div><div class='add'>+xdr_filename3(XDR *xdrs, filename3 *objp)</div><div class='add'>+{</div><div class='add'>+    if (!xdr_string(xdrs, objp, ~0))</div><div class='add'>+        return FALSE;</div><div class='add'>+    return TRUE;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+bool_t</div><div class='add'>+xdr_nfspath3(XDR *xdrs, nfspath3 *objp)</div><div class='add'>+{</div><div class='add'>+    if (!xdr_string(xdrs, objp, ~0))</div><div class='add'>+        return FALSE;</div><div class='add'>+    return TRUE;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+bool_t</div><div class='add'>+xdr_fileid3(XDR *xdrs, fileid3 *objp)</div><div class='add'>+{</div><div class='add'>+    if (!xdr_uint64(xdrs, objp))</div><div class='add'>+        return FALSE;</div><div class='add'>+    return TRUE;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+bool_t</div><div class='add'>+xdr_cookie3(XDR *xdrs, cookie3 *objp)</div><div class='add'>+{</div><div class='add'>+    if (!xdr_uint64(xdrs, objp))</div><div class='add'>+        return FALSE;</div><div class='add'>+    return TRUE;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+bool_t</div><div class='add'>+xdr_cookieverf3(XDR *xdrs, cookieverf3 objp)</div><div class='add'>+{</div><div class='add'>+    if (!xdr_opaque(xdrs, objp, NFS3_COOKIEVERFSIZE))</div><div class='add'>+        return FALSE;</div><div class='add'>+    return TRUE;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+bool_t</div><div class='add'>+xdr_createverf3(XDR *xdrs, createverf3 objp)</div><div class='add'>+{</div><div class='add'>+    if (!xdr_opaque(xdrs, objp, NFS3_CREATEVERFSIZE))</div><div class='add'>+        return FALSE;</div><div class='add'>+    return TRUE;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+bool_t</div><div class='add'>+xdr_writeverf3(XDR *xdrs, writeverf3 objp)</div><div class='add'>+{</div><div class='add'>+    if (!xdr_opaque(xdrs, objp, NFS3_WRITEVERFSIZE))</div><div class='add'>+        return FALSE;</div><div class='add'>+    return TRUE;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+bool_t</div><div class='add'>+xdr_uid3(XDR *xdrs, uid3 *objp)</div><div class='add'>+{</div><div class='add'>+    if (!xdr_uint32(xdrs, objp))</div><div class='add'>+        return FALSE;</div><div class='add'>+    return TRUE;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+bool_t</div><div class='add'>+xdr_gid3(XDR *xdrs, gid3 *objp)</div><div class='add'>+{</div><div class='add'>+    if (!xdr_uint32(xdrs, objp))</div><div class='add'>+        return FALSE;</div><div class='add'>+    return TRUE;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+bool_t</div><div class='add'>+xdr_size3(XDR *xdrs, size3 *objp)</div><div class='add'>+{</div><div class='add'>+    if (!xdr_uint64(xdrs, objp))</div><div class='add'>+        return FALSE;</div><div class='add'>+    return TRUE;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+bool_t</div><div class='add'>+xdr_offset3(XDR *xdrs, offset3 *objp)</div><div class='add'>+{</div><div class='add'>+    if (!xdr_uint64(xdrs, objp))</div><div class='add'>+        return FALSE;</div><div class='add'>+    return TRUE;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+bool_t</div><div class='add'>+xdr_mode3(XDR *xdrs, mode3 *objp)</div><div class='add'>+{</div><div class='add'>+    if (!xdr_uint32(xdrs, objp))</div><div class='add'>+        return FALSE;</div><div class='add'>+    return TRUE;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+bool_t</div><div class='add'>+xdr_count3(XDR *xdrs, count3 *objp)</div><div class='add'>+{</div><div class='add'>+    if (!xdr_uint32(xdrs, objp))</div><div class='add'>+        return FALSE;</div><div class='add'>+    return TRUE;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+bool_t</div><div class='add'>+xdr_nfsstat3(XDR *xdrs, nfsstat3 *objp)</div><div class='add'>+{</div><div class='add'>+    if (!xdr_enum(xdrs, (enum_t *)objp))</div><div class='add'>+        return FALSE;</div><div class='add'>+    return TRUE;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+bool_t</div><div class='add'>+xdr_ftype3(XDR *xdrs, ftype3 *objp)</div><div class='add'>+{</div><div class='add'>+    if (!xdr_enum(xdrs, (enum_t *)objp))</div><div class='add'>+        return FALSE;</div><div class='add'>+    return TRUE;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+bool_t</div><div class='add'>+xdr_specdata3(XDR *xdrs, specdata3 *objp)</div><div class='add'>+{</div><div class='add'>+    if (!xdr_uint32(xdrs, &amp;objp-&gt;specdata1))</div><div class='add'>+        return FALSE;</div><div class='add'>+    if (!xdr_uint32(xdrs, &amp;objp-&gt;specdata2))</div><div class='add'>+        return FALSE;</div><div class='add'>+    return TRUE;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+bool_t</div><div class='add'>+xdr_nfs_fh3(XDR *xdrs, nfs_fh3 *objp)</div><div class='add'>+{</div><div class='add'>+    if (!xdr_bytes(xdrs, (char **)&amp;objp-&gt;data.data_val,</div><div class='add'>+                   (u_int *)&amp;objp-&gt;data.data_len, NFS3_FHSIZE))</div><div class='add'>+        return FALSE;</div><div class='add'>+    return TRUE;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+bool_t</div><div class='add'>+xdr_nfstime3(XDR *xdrs, nfstime3 *objp)</div><div class='add'>+{</div><div class='add'>+    if (!xdr_uint32(xdrs, &amp;objp-&gt;seconds))</div><div class='add'>+        return FALSE;</div><div class='add'>+    if (!xdr_uint32(xdrs, &amp;objp-&gt;nseconds))</div><div class='add'>+        return FALSE;</div><div class='add'>+    return TRUE;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+bool_t</div><div class='add'>+xdr_fattr3(XDR *xdrs, fattr3 *objp)</div><div class='add'>+{</div><div class='add'>+    if (!xdr_ftype3(xdrs, &amp;objp-&gt;type))</div><div class='add'>+        return FALSE;</div><div class='add'>+    if (!xdr_mode3(xdrs, &amp;objp-&gt;mode))</div><div class='add'>+        return FALSE;</div><div class='add'>+    if (!xdr_uint32(xdrs, &amp;objp-&gt;nlink))</div><div class='add'>+        return FALSE;</div><div class='add'>+    if (!xdr_uid3(xdrs, &amp;objp-&gt;uid))</div><div class='add'>+        return FALSE;</div><div class='add'>+    if (!xdr_gid3(xdrs, &amp;objp-&gt;gid))</div><div class='add'>+        return FALSE;</div><div class='add'>+    if (!xdr_size3(xdrs, &amp;objp-&gt;size))</div><div class='add'>+        return FALSE;</div><div class='add'>+    if (!xdr_size3(xdrs, &amp;objp-&gt;used))</div><div class='add'>+        return FALSE;</div><div class='add'>+    if (!xdr_specdata3(xdrs, &amp;objp-&gt;rdev))</div><div class='add'>+        return FALSE;</div><div class='add'>+    if (!xdr_uint64(xdrs, &amp;objp-&gt;fsid))</div><div class='add'>+        return FALSE;</div><div class='add'>+    if (!xdr_fileid3(xdrs, &amp;objp-&gt;fileid))</div><div class='add'>+        return FALSE;</div><div class='add'>+    if (!xdr_nfstime3(xdrs, &amp;objp-&gt;atime))</div><div class='add'>+        return FALSE;</div><div class='add'>+    if (!xdr_nfstime3(xdrs, &amp;objp-&gt;mtime))</div><div class='add'>+        return FALSE;</div><div class='add'>+    if (!xdr_nfstime3(xdrs, &amp;objp-&gt;ctime))</div><div class='add'>+        return FALSE;</div><div class='add'>+    return TRUE;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+bool_t</div><div class='add'>+xdr_post_op_attr(XDR *xdrs, post_op_attr *objp)</div><div class='add'>+{</div><div class='add'>+    if (!xdr_bool(xdrs, &amp;objp-&gt;attributes_follow))</div><div class='add'>+        return FALSE;</div><div class='add'>+    switch (objp-&gt;attributes_follow) {</div><div class='add'>+        case TRUE:</div><div class='add'>+            if (!xdr_fattr3(xdrs, &amp;objp-&gt;post_op_attr_u.attributes))</div><div class='add'>+                return FALSE;</div><div class='add'>+            break;</div><div class='add'>+        case FALSE:</div><div class='add'>+            break;</div><div class='add'>+        default:</div><div class='add'>+            return FALSE;</div><div class='add'>+    }</div><div class='add'>+    return TRUE;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+bool_t</div><div class='add'>+xdr_wcc_attr(XDR *xdrs, wcc_attr *objp)</div><div class='add'>+{</div><div class='add'>+    if (!xdr_size3(xdrs, &amp;objp-&gt;size))</div><div class='add'>+        return FALSE;</div><div class='add'>+    if (!xdr_nfstime3(xdrs, &amp;objp-&gt;mtime))</div><div class='add'>+        return FALSE;</div><div class='add'>+    if (!xdr_nfstime3(xdrs, &amp;objp-&gt;ctime))</div><div class='add'>+        return FALSE;</div><div class='add'>+    return TRUE;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+bool_t</div><div class='add'>+xdr_pre_op_attr(XDR *xdrs, pre_op_attr *objp)</div><div class='add'>+{</div><div class='add'>+    if (!xdr_bool(xdrs, &amp;objp-&gt;attributes_follow))</div><div class='add'>+        return FALSE;</div><div class='add'>+    switch (objp-&gt;attributes_follow) {</div><div class='add'>+        case TRUE:</div><div class='add'>+            if (!xdr_wcc_attr(xdrs, &amp;objp-&gt;pre_op_attr_u.attributes))</div><div class='add'>+                return FALSE;</div><div class='add'>+            break;</div><div class='add'>+        case FALSE:</div><div class='add'>+            break;</div><div class='add'>+        default:</div><div class='add'>+            return FALSE;</div><div class='add'>+    }</div><div class='add'>+    return TRUE;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+bool_t</div><div class='add'>+xdr_wcc_data(XDR *xdrs, wcc_data *objp)</div><div class='add'>+{</div><div class='add'>+    if (!xdr_pre_op_attr(xdrs, &amp;objp-&gt;before))</div><div class='add'>+        return FALSE;</div><div class='add'>+    if (!xdr_post_op_attr(xdrs, &amp;objp-&gt;after))</div><div class='add'>+        return FALSE;</div><div class='add'>+    return TRUE;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+bool_t</div><div class='add'>+xdr_post_op_fh3(XDR *xdrs, post_op_fh3 *objp)</div><div class='add'>+{</div><div class='add'>+    if (!xdr_bool(xdrs, &amp;objp-&gt;handle_follows))</div><div class='add'>+        return FALSE;</div><div class='add'>+    switch (objp-&gt;handle_follows) {</div><div class='add'>+        case TRUE:</div><div class='add'>+            if (!xdr_nfs_fh3(xdrs, &amp;objp-&gt;post_op_fh3_u.handle))</div><div class='add'>+                return FALSE;</div><div class='add'>+            break;</div><div class='add'>+        case FALSE:</div><div class='add'>+            break;</div><div class='add'>+        default:</div><div class='add'>+            return FALSE;</div><div class='add'>+    }</div><div class='add'>+    return TRUE;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+bool_t</div><div class='add'>+xdr_time_how(XDR *xdrs, time_how *objp)</div><div class='add'>+{</div><div class='add'>+    if (!xdr_enum(xdrs, (enum_t *)objp))</div><div class='add'>+        return FALSE;</div><div class='add'>+    return TRUE;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+bool_t</div><div class='add'>+xdr_set_mode3(XDR *xdrs, set_mode3 *objp)</div><div class='add'>+{</div><div class='add'>+    if (!xdr_bool(xdrs, &amp;objp-&gt;set_it))</div><div class='add'>+        return FALSE;</div><div class='add'>+    switch (objp-&gt;set_it) {</div><div class='add'>+        case TRUE:</div><div class='add'>+            if (!xdr_mode3(xdrs, &amp;objp-&gt;set_mode3_u.mode))</div><div class='add'>+                return FALSE;</div><div class='add'>+            break;</div><div class='add'>+        default:</div><div class='add'>+            break;</div><div class='add'>+    }</div><div class='add'>+    return TRUE;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+bool_t</div><div class='add'>+xdr_set_uid3(XDR *xdrs, set_uid3 *objp)</div><div class='add'>+{</div><div class='add'>+    if (!xdr_bool(xdrs, &amp;objp-&gt;set_it))</div><div class='add'>+        return FALSE;</div><div class='add'>+    switch (objp-&gt;set_it) {</div><div class='add'>+        case TRUE:</div><div class='add'>+            if (!xdr_uid3(xdrs, &amp;objp-&gt;set_uid3_u.uid))</div><div class='add'>+                return FALSE;</div><div class='add'>+            break;</div><div class='add'>+        default:</div><div class='add'>+            break;</div><div class='add'>+    }</div><div class='add'>+    return TRUE;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+bool_t</div><div class='add'>+xdr_set_gid3(XDR *xdrs, set_gid3 *objp)</div><div class='add'>+{</div><div class='add'>+    if (!xdr_bool(xdrs, &amp;objp-&gt;set_it))</div><div class='add'>+        return FALSE;</div><div class='add'>+    switch (objp-&gt;set_it) {</div><div class='add'>+        case TRUE:</div><div class='add'>+            if (!xdr_gid3(xdrs, &amp;objp-&gt;set_gid3_u.gid))</div><div class='add'>+                return FALSE;</div><div class='add'>+            break;</div><div class='add'>+        default:</div><div class='add'>+            break;</div><div class='add'>+    }</div><div class='add'>+    return TRUE;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+bool_t</div><div class='add'>+xdr_set_size3(XDR *xdrs, set_size3 *objp)</div><div class='add'>+{</div><div class='add'>+    if (!xdr_bool(xdrs, &amp;objp-&gt;set_it))</div><div class='add'>+        return FALSE;</div><div class='add'>+    switch (objp-&gt;set_it) {</div><div class='add'>+        case TRUE:</div><div class='add'>+            if (!xdr_size3(xdrs, &amp;objp-&gt;set_size3_u.size))</div><div class='add'>+                return FALSE;</div><div class='add'>+            break;</div><div class='add'>+        default:</div><div class='add'>+            break;</div><div class='add'>+    }</div><div class='add'>+    return TRUE;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+bool_t</div><div class='add'>+xdr_set_atime(XDR *xdrs, set_atime *objp)</div><div class='add'>+{</div><div class='add'>+    if (!xdr_time_how(xdrs, &amp;objp-&gt;set_it))</div><div class='add'>+        return FALSE;</div><div class='add'>+    switch (objp-&gt;set_it) {</div><div class='add'>+        case SET_TO_CLIENT_TIME:</div><div class='add'>+            if (!xdr_nfstime3(xdrs, &amp;objp-&gt;set_atime_u.atime))</div><div class='add'>+                return FALSE;</div><div class='add'>+            break;</div><div class='add'>+        default:</div><div class='add'>+            break;</div><div class='add'>+    }</div><div class='add'>+    return TRUE;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+bool_t</div><div class='add'>+xdr_set_mtime(XDR *xdrs, set_mtime *objp)</div><div class='add'>+{</div><div class='add'>+    if (!xdr_time_how(xdrs, &amp;objp-&gt;set_it))</div><div class='add'>+        return FALSE;</div><div class='add'>+    switch (objp-&gt;set_it) {</div><div class='add'>+        case SET_TO_CLIENT_TIME:</div><div class='add'>+            if (!xdr_nfstime3(xdrs, &amp;objp-&gt;set_mtime_u.mtime))</div><div class='add'>+                return FALSE;</div><div class='add'>+            break;</div><div class='add'>+        default:</div><div class='add'>+            break;</div><div class='add'>+    }</div><div class='add'>+    return TRUE;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+bool_t</div><div class='add'>+xdr_sattr3(XDR *xdrs, sattr3 *objp)</div><div class='add'>+{</div><div class='add'>+    if (!xdr_set_mode3(xdrs, &amp;objp-&gt;mode))</div><div class='add'>+        return FALSE;</div><div class='add'>+    if (!xdr_set_uid3(xdrs, &amp;objp-&gt;uid))</div><div class='add'>+        return FALSE;</div><div class='add'>+    if (!xdr_set_gid3(xdrs, &amp;objp-&gt;gid))</div><div class='add'>+        return FALSE;</div><div class='add'>+    if (!xdr_set_size3(xdrs, &amp;objp-&gt;size))</div><div class='add'>+        return FALSE;</div><div class='add'>+    if (!xdr_set_atime(xdrs, &amp;objp-&gt;atime))</div><div class='add'>+        return FALSE;</div><div class='add'>+    if (!xdr_set_mtime(xdrs, &amp;objp-&gt;mtime))</div><div class='add'>+        return FALSE;</div><div class='add'>+    return TRUE;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+bool_t</div><div class='add'>+xdr_diropargs3(XDR *xdrs, diropargs3 *objp)</div><div class='add'>+{</div><div class='add'>+    if (!xdr_nfs_fh3(xdrs, &amp;objp-&gt;dir))</div><div class='add'>+        return FALSE;</div><div class='add'>+    if (!xdr_filename3(xdrs, &amp;objp-&gt;name))</div><div class='add'>+        return FALSE;</div><div class='add'>+    return TRUE;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+bool_t</div><div class='add'>+xdr_getattr3args(XDR *xdrs, getattr3args *objp)</div><div class='add'>+{</div><div class='add'>+    if (!xdr_nfs_fh3(xdrs, &amp;objp-&gt;object))</div><div class='add'>+        return FALSE;</div><div class='add'>+    return TRUE;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+bool_t</div><div class='add'>+xdr_getattr3resok(XDR *xdrs, getattr3resok *objp)</div><div class='add'>+{</div><div class='add'>+    if (!xdr_fattr3(xdrs, &amp;objp-&gt;obj_attributes))</div><div class='add'>+        return FALSE;</div><div class='add'>+    return TRUE;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+bool_t</div><div class='add'>+xdr_getattr3res(XDR *xdrs, getattr3res *objp)</div><div class='add'>+{</div><div class='add'>+    if (!xdr_nfsstat3(xdrs, &amp;objp-&gt;status))</div><div class='add'>+        return FALSE;</div><div class='add'>+    switch (objp-&gt;status) {</div><div class='add'>+        case NFS3_OK:</div><div class='add'>+            if (!xdr_getattr3resok(xdrs, &amp;objp-&gt;getattr3res_u.resok))</div><div class='add'>+                return FALSE;</div><div class='add'>+            break;</div><div class='add'>+        default:</div><div class='add'>+            break;</div><div class='add'>+    }</div><div class='add'>+    return TRUE;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+bool_t</div><div class='add'>+xdr_sattrguard3(XDR *xdrs, sattrguard3 *objp)</div><div class='add'>+{</div><div class='add'>+    if (!xdr_bool(xdrs, &amp;objp-&gt;check))</div><div class='add'>+        return FALSE;</div><div class='add'>+    switch (objp-&gt;check) {</div><div class='add'>+        case TRUE:</div><div class='add'>+            if (!xdr_nfstime3(xdrs, &amp;objp-&gt;sattrguard3_u.obj_ctime))</div><div class='add'>+                return FALSE;</div><div class='add'>+            break;</div><div class='add'>+        case FALSE:</div><div class='add'>+            break;</div><div class='add'>+        default:</div><div class='add'>+            return FALSE;</div><div class='add'>+    }</div><div class='add'>+    return TRUE;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+bool_t</div><div class='add'>+xdr_setattr3args(XDR *xdrs, setattr3args *objp)</div><div class='add'>+{</div><div class='add'>+    if (!xdr_nfs_fh3(xdrs, &amp;objp-&gt;object))</div><div class='add'>+        return FALSE;</div><div class='add'>+    if (!xdr_sattr3(xdrs, &amp;objp-&gt;new_attributes))</div><div class='add'>+        return FALSE;</div><div class='add'>+    if (!xdr_sattrguard3(xdrs, &amp;objp-&gt;guard))</div><div class='add'>+        return FALSE;</div><div class='add'>+    return TRUE;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+bool_t</div><div class='add'>+xdr_setattr3resok(XDR *xdrs, setattr3resok *objp)</div><div class='add'>+{</div><div class='add'>+    if (!xdr_wcc_data(xdrs, &amp;objp-&gt;obj_wcc))</div><div class='add'>+        return FALSE;</div><div class='add'>+    return TRUE;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+bool_t</div><div class='add'>+xdr_setattr3resfail(XDR *xdrs, setattr3resfail *objp)</div><div class='add'>+{</div><div class='add'>+    if (!xdr_wcc_data(xdrs, &amp;objp-&gt;obj_wcc))</div><div class='add'>+        return FALSE;</div><div class='add'>+    return TRUE;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+bool_t</div><div class='add'>+xdr_setattr3res(XDR *xdrs, setattr3res *objp)</div><div class='add'>+{</div><div class='add'>+    if (!xdr_nfsstat3(xdrs, &amp;objp-&gt;status))</div><div class='add'>+        return FALSE;</div><div class='add'>+    switch (objp-&gt;status) {</div><div class='add'>+        case NFS3_OK:</div><div class='add'>+            if (!xdr_setattr3resok(xdrs, &amp;objp-&gt;setattr3res_u.resok))</div><div class='add'>+                return FALSE;</div><div class='add'>+            break;</div><div class='add'>+        default:</div><div class='add'>+            if (!xdr_setattr3resfail(xdrs, &amp;objp-&gt;setattr3res_u.resfail))</div><div class='add'>+                return FALSE;</div><div class='add'>+            break;</div><div class='add'>+    }</div><div class='add'>+    return TRUE;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+bool_t</div><div class='add'>+xdr_lookup3args(XDR *xdrs, lookup3args *objp)</div><div class='add'>+{</div><div class='add'>+    if (!xdr_diropargs3(xdrs, &amp;objp-&gt;what))</div><div class='add'>+        return FALSE;</div><div class='add'>+    return TRUE;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+bool_t</div><div class='add'>+xdr_lookup3resok(XDR *xdrs, lookup3resok *objp)</div><div class='add'>+{</div><div class='add'>+    if (!xdr_nfs_fh3(xdrs, &amp;objp-&gt;object))</div><div class='add'>+        return FALSE;</div><div class='add'>+    if (!xdr_post_op_attr(xdrs, &amp;objp-&gt;obj_attributes))</div><div class='add'>+        return FALSE;</div><div class='add'>+    if (!xdr_post_op_attr(xdrs, &amp;objp-&gt;dir_attributes))</div><div class='add'>+        return FALSE;</div><div class='add'>+    return TRUE;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+bool_t</div><div class='add'>+xdr_lookup3resfail(XDR *xdrs, lookup3resfail *objp)</div><div class='add'>+{</div><div class='add'>+    if (!xdr_post_op_attr(xdrs, &amp;objp-&gt;dir_attributes))</div><div class='add'>+        return FALSE;</div><div class='add'>+    return TRUE;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+bool_t</div><div class='add'>+xdr_lookup3res(XDR *xdrs, lookup3res *objp)</div><div class='add'>+{</div><div class='add'>+    if (!xdr_nfsstat3(xdrs, &amp;objp-&gt;status))</div><div class='add'>+        return FALSE;</div><div class='add'>+    switch (objp-&gt;status) {</div><div class='add'>+        case NFS3_OK:</div><div class='add'>+            if (!xdr_lookup3resok(xdrs, &amp;objp-&gt;lookup3res_u.resok))</div><div class='add'>+                return FALSE;</div><div class='add'>+            break;</div><div class='add'>+        default:</div><div class='add'>+            if (!xdr_lookup3resfail(xdrs, &amp;objp-&gt;lookup3res_u.resfail))</div><div class='add'>+                return FALSE;</div><div class='add'>+            break;</div><div class='add'>+    }</div><div class='add'>+    return TRUE;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+bool_t</div><div class='add'>+xdr_access3args(XDR *xdrs, access3args *objp)</div><div class='add'>+{</div><div class='add'>+    if (!xdr_nfs_fh3(xdrs, &amp;objp-&gt;object))</div><div class='add'>+        return FALSE;</div><div class='add'>+    if (!xdr_uint32(xdrs, &amp;objp-&gt;access))</div><div class='add'>+        return FALSE;</div><div class='add'>+    return TRUE;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+bool_t</div><div class='add'>+xdr_access3resok(XDR *xdrs, access3resok *objp)</div><div class='add'>+{</div><div class='add'>+    if (!xdr_post_op_attr(xdrs, &amp;objp-&gt;obj_attributes))</div><div class='add'>+        return FALSE;</div><div class='add'>+    if (!xdr_uint32(xdrs, &amp;objp-&gt;access))</div><div class='add'>+        return FALSE;</div><div class='add'>+    return TRUE;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+bool_t</div><div class='add'>+xdr_access3resfail(XDR *xdrs, access3resfail *objp)</div><div class='add'>+{</div><div class='add'>+    if (!xdr_post_op_attr(xdrs, &amp;objp-&gt;obj_attributes))</div><div class='add'>+        return FALSE;</div><div class='add'>+    return TRUE;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+bool_t</div><div class='add'>+xdr_access3res(XDR *xdrs, access3res *objp)</div><div class='add'>+{</div><div class='add'>+    if (!xdr_nfsstat3(xdrs, &amp;objp-&gt;status))</div><div class='add'>+        return FALSE;</div><div class='add'>+    switch (objp-&gt;status) {</div><div class='add'>+        case NFS3_OK:</div><div class='add'>+            if (!xdr_access3resok(xdrs, &amp;objp-&gt;access3res_u.resok))</div><div class='add'>+                return FALSE;</div><div class='add'>+            break;</div><div class='add'>+        default:</div><div class='add'>+            if (!xdr_access3resfail(xdrs, &amp;objp-&gt;access3res_u.resfail))</div><div class='add'>+                return FALSE;</div><div class='add'>+            break;</div><div class='add'>+    }</div><div class='add'>+    return TRUE;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+bool_t</div><div class='add'>+xdr_readlink3args(XDR *xdrs, readlink3args *objp)</div><div class='add'>+{</div><div class='add'>+    if (!xdr_nfs_fh3(xdrs, &amp;objp-&gt;symlink))</div><div class='add'>+        return FALSE;</div><div class='add'>+    return TRUE;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+bool_t</div><div class='add'>+xdr_readlink3resok(XDR *xdrs, readlink3resok *objp)</div><div class='add'>+{</div><div class='add'>+    if (!xdr_post_op_attr(xdrs, &amp;objp-&gt;symlink_attributes))</div><div class='add'>+        return FALSE;</div><div class='add'>+    if (!xdr_nfspath3(xdrs, &amp;objp-&gt;data))</div><div class='add'>+        return FALSE;</div><div class='add'>+    return TRUE;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+bool_t</div><div class='add'>+xdr_readlink3resfail(XDR *xdrs, readlink3resfail *objp)</div><div class='add'>+{</div><div class='add'>+    if (!xdr_post_op_attr(xdrs, &amp;objp-&gt;symlink_attributes))</div><div class='add'>+        return FALSE;</div><div class='add'>+    return TRUE;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+bool_t</div><div class='add'>+xdr_readlink3res(XDR *xdrs, readlink3res *objp)</div><div class='add'>+{</div><div class='add'>+    if (!xdr_nfsstat3(xdrs, &amp;objp-&gt;status))</div><div class='add'>+        return FALSE;</div><div class='add'>+    switch (objp-&gt;status) {</div><div class='add'>+        case NFS3_OK:</div><div class='add'>+            if (!xdr_readlink3resok(xdrs, &amp;objp-&gt;readlink3res_u.resok))</div><div class='add'>+                return FALSE;</div><div class='add'>+            break;</div><div class='add'>+        default:</div><div class='add'>+            if (!xdr_readlink3resfail(xdrs, &amp;objp-&gt;readlink3res_u.resfail))</div><div class='add'>+                return FALSE;</div><div class='add'>+            break;</div><div class='add'>+    }</div><div class='add'>+    return TRUE;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+bool_t</div><div class='add'>+xdr_read3args(XDR *xdrs, read3args *objp)</div><div class='add'>+{</div><div class='add'>+    if (!xdr_nfs_fh3(xdrs, &amp;objp-&gt;file))</div><div class='add'>+        return FALSE;</div><div class='add'>+    if (!xdr_offset3(xdrs, &amp;objp-&gt;offset))</div><div class='add'>+        return FALSE;</div><div class='add'>+    if (!xdr_count3(xdrs, &amp;objp-&gt;count))</div><div class='add'>+        return FALSE;</div><div class='add'>+    return TRUE;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+bool_t</div><div class='add'>+xdr_read3resok_nocopy(XDR *xdrs, read3resok *objp)</div><div class='add'>+{</div><div class='add'>+    if (!xdr_post_op_attr(xdrs, &amp;objp-&gt;file_attributes))</div><div class='add'>+        return FALSE;</div><div class='add'>+    if (!xdr_count3(xdrs, &amp;objp-&gt;count))</div><div class='add'>+        return FALSE;</div><div class='add'>+    if (!xdr_bool(xdrs, &amp;objp-&gt;eof))</div><div class='add'>+        return FALSE;</div><div class='add'>+    if (!xdr_u_int(xdrs, (u_int *)&amp;objp-&gt;data.data_len))</div><div class='add'>+        return FALSE;</div><div class='add'>+    return TRUE;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+bool_t</div><div class='add'>+xdr_read3resok(XDR *xdrs, read3resok *objp)</div><div class='add'>+{</div><div class='add'>+    if (!xdr_post_op_attr(xdrs, &amp;objp-&gt;file_attributes))</div><div class='add'>+        return FALSE;</div><div class='add'>+    if (!xdr_count3(xdrs, &amp;objp-&gt;count))</div><div class='add'>+        return FALSE;</div><div class='add'>+    if (!xdr_bool(xdrs, &amp;objp-&gt;eof))</div><div class='add'>+        return FALSE;</div><div class='add'>+    if (!xdr_bytes(xdrs, (char **)&amp;objp-&gt;data.data_val,</div><div class='add'>+                   (u_int *)&amp;objp-&gt;data.data_len, ~0))</div><div class='add'>+        return FALSE;</div><div class='add'>+    return TRUE;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+bool_t</div><div class='add'>+xdr_read3resfail(XDR *xdrs, read3resfail *objp)</div><div class='add'>+{</div><div class='add'>+    if (!xdr_post_op_attr(xdrs, &amp;objp-&gt;file_attributes))</div><div class='add'>+        return FALSE;</div><div class='add'>+    return TRUE;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+bool_t</div><div class='add'>+xdr_read3res_nocopy(XDR *xdrs, read3res *objp)</div><div class='add'>+{</div><div class='add'>+    if (!xdr_nfsstat3(xdrs, &amp;objp-&gt;status))</div><div class='add'>+        return FALSE;</div><div class='add'>+    switch (objp-&gt;status) {</div><div class='add'>+        case NFS3_OK:</div><div class='add'>+            if (!xdr_read3resok_nocopy(xdrs, &amp;objp-&gt;read3res_u.resok))</div><div class='add'>+                return FALSE;</div><div class='add'>+            break;</div><div class='add'>+        default:</div><div class='add'>+            if (!xdr_read3resfail(xdrs, &amp;objp-&gt;read3res_u.resfail))</div><div class='add'>+                return FALSE;</div><div class='add'>+            break;</div><div class='add'>+    }</div><div class='add'>+    return TRUE;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+bool_t</div><div class='add'>+xdr_read3res(XDR *xdrs, read3res *objp)</div><div class='add'>+{</div><div class='add'>+    if (!xdr_nfsstat3(xdrs, &amp;objp-&gt;status))</div><div class='add'>+        return FALSE;</div><div class='add'>+    switch (objp-&gt;status) {</div><div class='add'>+        case NFS3_OK:</div><div class='add'>+            if (!xdr_read3resok(xdrs, &amp;objp-&gt;read3res_u.resok))</div><div class='add'>+                return FALSE;</div><div class='add'>+            break;</div><div class='add'>+        default:</div><div class='add'>+            if (!xdr_read3resfail(xdrs, &amp;objp-&gt;read3res_u.resfail))</div><div class='add'>+                return FALSE;</div><div class='add'>+            break;</div><div class='add'>+    }</div><div class='add'>+    return TRUE;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+bool_t</div><div class='add'>+xdr_stable_how(XDR *xdrs, stable_how *objp)</div><div class='add'>+{</div><div class='add'>+    if (!xdr_enum(xdrs, (enum_t *)objp))</div><div class='add'>+        return FALSE;</div><div class='add'>+    return TRUE;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+bool_t</div><div class='add'>+xdr_write3args(XDR *xdrs, write3args *objp)</div><div class='add'>+{</div><div class='add'>+    if (!xdr_nfs_fh3(xdrs, &amp;objp-&gt;file))</div><div class='add'>+        return FALSE;</div><div class='add'>+    if (!xdr_offset3(xdrs, &amp;objp-&gt;offset))</div><div class='add'>+        return FALSE;</div><div class='add'>+    if (!xdr_count3(xdrs, &amp;objp-&gt;count))</div><div class='add'>+        return FALSE;</div><div class='add'>+    if (!xdr_stable_how(xdrs, &amp;objp-&gt;stable))</div><div class='add'>+        return FALSE;</div><div class='add'>+</div><div class='add'>+    /* Added specifically to avoid copies from the xdr buffer into</div><div class='add'>+     * the write3args structure, which will also require an already</div><div class='add'>+     * allocated buffer. That is not optimal.</div><div class='add'>+     */</div><div class='add'>+    if (!xdr_u_int(xdrs, (u_int *)&amp;objp-&gt;data.data_len))</div><div class='add'>+        return FALSE;</div><div class='add'>+</div><div class='add'>+    /* The remaining bytes in the xdr buffer are the bytes that need to be</div><div class='add'>+     * written. See how these bytes are extracted in the xdr_to_write3args</div><div class='add'>+     * code path. Be careful, while using the write3args structure, since</div><div class='add'>+     * only the data.data_len has been filled. The actual data is</div><div class='add'>+     * extracted in xdr_to_write3args path.</div><div class='add'>+     */</div><div class='add'>+</div><div class='add'>+    /*	 if (!xdr_bytes (xdrs, (char **)&amp;objp-&gt;data.data_val, (u_int *)</div><div class='add'>+       &amp;objp-&gt;data.data_len, ~0)) return FALSE;</div><div class='add'>+            */</div><div class='add'>+    return TRUE;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+bool_t</div><div class='add'>+xdr_write3resok(XDR *xdrs, write3resok *objp)</div><div class='add'>+{</div><div class='add'>+    if (!xdr_wcc_data(xdrs, &amp;objp-&gt;file_wcc))</div><div class='add'>+        return FALSE;</div><div class='add'>+    if (!xdr_count3(xdrs, &amp;objp-&gt;count))</div><div class='add'>+        return FALSE;</div><div class='add'>+    if (!xdr_stable_how(xdrs, &amp;objp-&gt;committed))</div><div class='add'>+        return FALSE;</div><div class='add'>+    if (!xdr_writeverf3(xdrs, objp-&gt;verf))</div><div class='add'>+        return FALSE;</div><div class='add'>+    return TRUE;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+bool_t</div><div class='add'>+xdr_write3resfail(XDR *xdrs, write3resfail *objp)</div><div class='add'>+{</div><div class='add'>+    if (!xdr_wcc_data(xdrs, &amp;objp-&gt;file_wcc))</div><div class='add'>+        return FALSE;</div><div class='add'>+    return TRUE;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+bool_t</div><div class='add'>+xdr_write3res(XDR *xdrs, write3res *objp)</div><div class='add'>+{</div><div class='add'>+    if (!xdr_nfsstat3(xdrs, &amp;objp-&gt;status))</div><div class='add'>+        return FALSE;</div><div class='add'>+    switch (objp-&gt;status) {</div><div class='add'>+        case NFS3_OK:</div><div class='add'>+            if (!xdr_write3resok(xdrs, &amp;objp-&gt;write3res_u.resok))</div><div class='add'>+                return FALSE;</div><div class='add'>+            break;</div><div class='add'>+        default:</div><div class='add'>+            if (!xdr_write3resfail(xdrs, &amp;objp-&gt;write3res_u.resfail))</div><div class='add'>+                return FALSE;</div><div class='add'>+            break;</div><div class='add'>+    }</div><div class='add'>+    return TRUE;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+bool_t</div><div class='add'>+xdr_createmode3(XDR *xdrs, createmode3 *objp)</div><div class='add'>+{</div><div class='add'>+    if (!xdr_enum(xdrs, (enum_t *)objp))</div><div class='add'>+        return FALSE;</div><div class='add'>+    return TRUE;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+bool_t</div><div class='add'>+xdr_createhow3(XDR *xdrs, createhow3 *objp)</div><div class='add'>+{</div><div class='add'>+    if (!xdr_createmode3(xdrs, &amp;objp-&gt;mode))</div><div class='add'>+        return FALSE;</div><div class='add'>+    switch (objp-&gt;mode) {</div><div class='add'>+        case UNCHECKED:</div><div class='add'>+        case GUARDED:</div><div class='add'>+            if (!xdr_sattr3(xdrs, &amp;objp-&gt;createhow3_u.obj_attributes))</div><div class='add'>+                return FALSE;</div><div class='add'>+            break;</div><div class='add'>+        case EXCLUSIVE:</div><div class='add'>+            if (!xdr_createverf3(xdrs, objp-&gt;createhow3_u.verf))</div><div class='add'>+                return FALSE;</div><div class='add'>+            break;</div><div class='add'>+        default:</div><div class='add'>+            return FALSE;</div><div class='add'>+    }</div><div class='add'>+    return TRUE;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+bool_t</div><div class='add'>+xdr_create3args(XDR *xdrs, create3args *objp)</div><div class='add'>+{</div><div class='add'>+    if (!xdr_diropargs3(xdrs, &amp;objp-&gt;where))</div><div class='add'>+        return FALSE;</div><div class='add'>+    if (!xdr_createhow3(xdrs, &amp;objp-&gt;how))</div><div class='add'>+        return FALSE;</div><div class='add'>+    return TRUE;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+bool_t</div><div class='add'>+xdr_create3resok(XDR *xdrs, create3resok *objp)</div><div class='add'>+{</div><div class='add'>+    if (!xdr_post_op_fh3(xdrs, &amp;objp-&gt;obj))</div><div class='add'>+        return FALSE;</div><div class='add'>+    if (!xdr_post_op_attr(xdrs, &amp;objp-&gt;obj_attributes))</div><div class='add'>+        return FALSE;</div><div class='add'>+    if (!xdr_wcc_data(xdrs, &amp;objp-&gt;dir_wcc))</div><div class='add'>+        return FALSE;</div><div class='add'>+    return TRUE;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+bool_t</div><div class='add'>+xdr_create3resfail(XDR *xdrs, create3resfail *objp)</div><div class='add'>+{</div><div class='add'>+    if (!xdr_wcc_data(xdrs, &amp;objp-&gt;dir_wcc))</div><div class='add'>+        return FALSE;</div><div class='add'>+    return TRUE;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+bool_t</div><div class='add'>+xdr_create3res(XDR *xdrs, create3res *objp)</div><div class='add'>+{</div><div class='add'>+    if (!xdr_nfsstat3(xdrs, &amp;objp-&gt;status))</div><div class='add'>+        return FALSE;</div><div class='add'>+    switch (objp-&gt;status) {</div><div class='add'>+        case NFS3_OK:</div><div class='add'>+            if (!xdr_create3resok(xdrs, &amp;objp-&gt;create3res_u.resok))</div><div class='add'>+                return FALSE;</div><div class='add'>+            break;</div><div class='add'>+        default:</div><div class='add'>+            if (!xdr_create3resfail(xdrs, &amp;objp-&gt;create3res_u.resfail))</div><div class='add'>+                return FALSE;</div><div class='add'>+            break;</div><div class='add'>+    }</div><div class='add'>+    return TRUE;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+bool_t</div><div class='add'>+xdr_mkdir3args(XDR *xdrs, mkdir3args *objp)</div><div class='add'>+{</div><div class='add'>+    if (!xdr_diropargs3(xdrs, &amp;objp-&gt;where))</div><div class='add'>+        return FALSE;</div><div class='add'>+    if (!xdr_sattr3(xdrs, &amp;objp-&gt;attributes))</div><div class='add'>+        return FALSE;</div><div class='add'>+    return TRUE;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+bool_t</div><div class='add'>+xdr_mkdir3resok(XDR *xdrs, mkdir3resok *objp)</div><div class='add'>+{</div><div class='add'>+    if (!xdr_post_op_fh3(xdrs, &amp;objp-&gt;obj))</div><div class='add'>+        return FALSE;</div><div class='add'>+    if (!xdr_post_op_attr(xdrs, &amp;objp-&gt;obj_attributes))</div><div class='add'>+        return FALSE;</div><div class='add'>+    if (!xdr_wcc_data(xdrs, &amp;objp-&gt;dir_wcc))</div><div class='add'>+        return FALSE;</div><div class='add'>+    return TRUE;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+bool_t</div><div class='add'>+xdr_mkdir3resfail(XDR *xdrs, mkdir3resfail *objp)</div><div class='add'>+{</div><div class='add'>+    if (!xdr_wcc_data(xdrs, &amp;objp-&gt;dir_wcc))</div><div class='add'>+        return FALSE;</div><div class='add'>+    return TRUE;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+bool_t</div><div class='add'>+xdr_mkdir3res(XDR *xdrs, mkdir3res *objp)</div><div class='add'>+{</div><div class='add'>+    if (!xdr_nfsstat3(xdrs, &amp;objp-&gt;status))</div><div class='add'>+        return FALSE;</div><div class='add'>+    switch (objp-&gt;status) {</div><div class='add'>+        case NFS3_OK:</div><div class='add'>+            if (!xdr_mkdir3resok(xdrs, &amp;objp-&gt;mkdir3res_u.resok))</div><div class='add'>+                return FALSE;</div><div class='add'>+            break;</div><div class='add'>+        default:</div><div class='add'>+            if (!xdr_mkdir3resfail(xdrs, &amp;objp-&gt;mkdir3res_u.resfail))</div><div class='add'>+                return FALSE;</div><div class='add'>+            break;</div><div class='add'>+    }</div><div class='add'>+    return TRUE;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+bool_t</div><div class='add'>+xdr_symlinkdata3(XDR *xdrs, symlinkdata3 *objp)</div><div class='add'>+{</div><div class='add'>+    if (!xdr_sattr3(xdrs, &amp;objp-&gt;symlink_attributes))</div><div class='add'>+        return FALSE;</div><div class='add'>+    if (!xdr_nfspath3(xdrs, &amp;objp-&gt;symlink_data))</div><div class='add'>+        return FALSE;</div><div class='add'>+    return TRUE;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+bool_t</div><div class='add'>+xdr_symlink3args(XDR *xdrs, symlink3args *objp)</div><div class='add'>+{</div><div class='add'>+    if (!xdr_diropargs3(xdrs, &amp;objp-&gt;where))</div><div class='add'>+        return FALSE;</div><div class='add'>+    if (!xdr_symlinkdata3(xdrs, &amp;objp-&gt;symlink))</div><div class='add'>+        return FALSE;</div><div class='add'>+    return TRUE;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+bool_t</div><div class='add'>+xdr_symlink3resok(XDR *xdrs, symlink3resok *objp)</div><div class='add'>+{</div><div class='add'>+    if (!xdr_post_op_fh3(xdrs, &amp;objp-&gt;obj))</div><div class='add'>+        return FALSE;</div><div class='add'>+    if (!xdr_post_op_attr(xdrs, &amp;objp-&gt;obj_attributes))</div><div class='add'>+        return FALSE;</div><div class='add'>+    if (!xdr_wcc_data(xdrs, &amp;objp-&gt;dir_wcc))</div><div class='add'>+        return FALSE;</div><div class='add'>+    return TRUE;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+bool_t</div><div class='add'>+xdr_symlink3resfail(XDR *xdrs, symlink3resfail *objp)</div><div class='add'>+{</div><div class='add'>+    if (!xdr_wcc_data(xdrs, &amp;objp-&gt;dir_wcc))</div><div class='add'>+        return FALSE;</div><div class='add'>+    return TRUE;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+bool_t</div><div class='add'>+xdr_symlink3res(XDR *xdrs, symlink3res *objp)</div><div class='add'>+{</div><div class='add'>+    if (!xdr_nfsstat3(xdrs, &amp;objp-&gt;status))</div><div class='add'>+        return FALSE;</div><div class='add'>+    switch (objp-&gt;status) {</div><div class='add'>+        case NFS3_OK:</div><div class='add'>+            if (!xdr_symlink3resok(xdrs, &amp;objp-&gt;symlink3res_u.resok))</div><div class='add'>+                return FALSE;</div><div class='add'>+            break;</div><div class='add'>+        default:</div><div class='add'>+            if (!xdr_symlink3resfail(xdrs, &amp;objp-&gt;symlink3res_u.resfail))</div><div class='add'>+                return FALSE;</div><div class='add'>+            break;</div><div class='add'>+    }</div><div class='add'>+    return TRUE;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+bool_t</div><div class='add'>+xdr_devicedata3(XDR *xdrs, devicedata3 *objp)</div><div class='add'>+{</div><div class='add'>+    if (!xdr_sattr3(xdrs, &amp;objp-&gt;dev_attributes))</div><div class='add'>+        return FALSE;</div><div class='add'>+    if (!xdr_specdata3(xdrs, &amp;objp-&gt;spec))</div><div class='add'>+        return FALSE;</div><div class='add'>+    return TRUE;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+bool_t</div><div class='add'>+xdr_mknoddata3(XDR *xdrs, mknoddata3 *objp)</div><div class='add'>+{</div><div class='add'>+    if (!xdr_ftype3(xdrs, &amp;objp-&gt;type))</div><div class='add'>+        return FALSE;</div><div class='add'>+    switch (objp-&gt;type) {</div><div class='add'>+        case NF3CHR:</div><div class='add'>+        case NF3BLK:</div><div class='add'>+            if (!xdr_devicedata3(xdrs, &amp;objp-&gt;mknoddata3_u.device))</div><div class='add'>+                return FALSE;</div><div class='add'>+            break;</div><div class='add'>+        case NF3SOCK:</div><div class='add'>+        case NF3FIFO:</div><div class='add'>+            if (!xdr_sattr3(xdrs, &amp;objp-&gt;mknoddata3_u.pipe_attributes))</div><div class='add'>+                return FALSE;</div><div class='add'>+            break;</div><div class='add'>+        default:</div><div class='add'>+            break;</div><div class='add'>+    }</div><div class='add'>+    return TRUE;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+bool_t</div><div class='add'>+xdr_mknod3args(XDR *xdrs, mknod3args *objp)</div><div class='add'>+{</div><div class='add'>+    if (!xdr_diropargs3(xdrs, &amp;objp-&gt;where))</div><div class='add'>+        return FALSE;</div><div class='add'>+    if (!xdr_mknoddata3(xdrs, &amp;objp-&gt;what))</div><div class='add'>+        return FALSE;</div><div class='add'>+    return TRUE;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+bool_t</div><div class='add'>+xdr_mknod3resok(XDR *xdrs, mknod3resok *objp)</div><div class='add'>+{</div><div class='add'>+    if (!xdr_post_op_fh3(xdrs, &amp;objp-&gt;obj))</div><div class='add'>+        return FALSE;</div><div class='add'>+    if (!xdr_post_op_attr(xdrs, &amp;objp-&gt;obj_attributes))</div><div class='add'>+        return FALSE;</div><div class='add'>+    if (!xdr_wcc_data(xdrs, &amp;objp-&gt;dir_wcc))</div><div class='add'>+        return FALSE;</div><div class='add'>+    return TRUE;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+bool_t</div><div class='add'>+xdr_mknod3resfail(XDR *xdrs, mknod3resfail *objp)</div><div class='add'>+{</div><div class='add'>+    if (!xdr_wcc_data(xdrs, &amp;objp-&gt;dir_wcc))</div><div class='add'>+        return FALSE;</div><div class='add'>+    return TRUE;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+bool_t</div><div class='add'>+xdr_mknod3res(XDR *xdrs, mknod3res *objp)</div><div class='add'>+{</div><div class='add'>+    if (!xdr_nfsstat3(xdrs, &amp;objp-&gt;status))</div><div class='add'>+        return FALSE;</div><div class='add'>+    switch (objp-&gt;status) {</div><div class='add'>+        case NFS3_OK:</div><div class='add'>+            if (!xdr_mknod3resok(xdrs, &amp;objp-&gt;mknod3res_u.resok))</div><div class='add'>+                return FALSE;</div><div class='add'>+            break;</div><div class='add'>+        default:</div><div class='add'>+            if (!xdr_mknod3resfail(xdrs, &amp;objp-&gt;mknod3res_u.resfail))</div><div class='add'>+                return FALSE;</div><div class='add'>+            break;</div><div class='add'>+    }</div><div class='add'>+    return TRUE;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+bool_t</div><div class='add'>+xdr_remove3args(XDR *xdrs, remove3args *objp)</div><div class='add'>+{</div><div class='add'>+    if (!xdr_diropargs3(xdrs, &amp;objp-&gt;object))</div><div class='add'>+        return FALSE;</div><div class='add'>+    return TRUE;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+bool_t</div><div class='add'>+xdr_remove3resok(XDR *xdrs, remove3resok *objp)</div><div class='add'>+{</div><div class='add'>+    if (!xdr_wcc_data(xdrs, &amp;objp-&gt;dir_wcc))</div><div class='add'>+        return FALSE;</div><div class='add'>+    return TRUE;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+bool_t</div><div class='add'>+xdr_remove3resfail(XDR *xdrs, remove3resfail *objp)</div><div class='add'>+{</div><div class='add'>+    if (!xdr_wcc_data(xdrs, &amp;objp-&gt;dir_wcc))</div><div class='add'>+        return FALSE;</div><div class='add'>+    return TRUE;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+bool_t</div><div class='add'>+xdr_remove3res(XDR *xdrs, remove3res *objp)</div><div class='add'>+{</div><div class='add'>+    if (!xdr_nfsstat3(xdrs, &amp;objp-&gt;status))</div><div class='add'>+        return FALSE;</div><div class='add'>+    switch (objp-&gt;status) {</div><div class='add'>+        case NFS3_OK:</div><div class='add'>+            if (!xdr_remove3resok(xdrs, &amp;objp-&gt;remove3res_u.resok))</div><div class='add'>+                return FALSE;</div><div class='add'>+            break;</div><div class='add'>+        default:</div><div class='add'>+            if (!xdr_remove3resfail(xdrs, &amp;objp-&gt;remove3res_u.resfail))</div><div class='add'>+                return FALSE;</div><div class='add'>+            break;</div><div class='add'>+    }</div><div class='add'>+    return TRUE;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+bool_t</div><div class='add'>+xdr_rmdir3args(XDR *xdrs, rmdir3args *objp)</div><div class='add'>+{</div><div class='add'>+    if (!xdr_diropargs3(xdrs, &amp;objp-&gt;object))</div><div class='add'>+        return FALSE;</div><div class='add'>+    return TRUE;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+bool_t</div><div class='add'>+xdr_rmdir3resok(XDR *xdrs, rmdir3resok *objp)</div><div class='add'>+{</div><div class='add'>+    if (!xdr_wcc_data(xdrs, &amp;objp-&gt;dir_wcc))</div><div class='add'>+        return FALSE;</div><div class='add'>+    return TRUE;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+bool_t</div><div class='add'>+xdr_rmdir3resfail(XDR *xdrs, rmdir3resfail *objp)</div><div class='add'>+{</div><div class='add'>+    if (!xdr_wcc_data(xdrs, &amp;objp-&gt;dir_wcc))</div><div class='add'>+        return FALSE;</div><div class='add'>+    return TRUE;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+bool_t</div><div class='add'>+xdr_rmdir3res(XDR *xdrs, rmdir3res *objp)</div><div class='add'>+{</div><div class='add'>+    if (!xdr_nfsstat3(xdrs, &amp;objp-&gt;status))</div><div class='add'>+        return FALSE;</div><div class='add'>+    switch (objp-&gt;status) {</div><div class='add'>+        case NFS3_OK:</div><div class='add'>+            if (!xdr_rmdir3resok(xdrs, &amp;objp-&gt;rmdir3res_u.resok))</div><div class='add'>+                return FALSE;</div><div class='add'>+            break;</div><div class='add'>+        default:</div><div class='add'>+            if (!xdr_rmdir3resfail(xdrs, &amp;objp-&gt;rmdir3res_u.resfail))</div><div class='add'>+                return FALSE;</div><div class='add'>+            break;</div><div class='add'>+    }</div><div class='add'>+    return TRUE;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+bool_t</div><div class='add'>+xdr_rename3args(XDR *xdrs, rename3args *objp)</div><div class='add'>+{</div><div class='add'>+    if (!xdr_diropargs3(xdrs, &amp;objp-&gt;from))</div><div class='add'>+        return FALSE;</div><div class='add'>+    if (!xdr_diropargs3(xdrs, &amp;objp-&gt;to))</div><div class='add'>+        return FALSE;</div><div class='add'>+    return TRUE;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+bool_t</div><div class='add'>+xdr_rename3resok(XDR *xdrs, rename3resok *objp)</div><div class='add'>+{</div><div class='add'>+    if (!xdr_wcc_data(xdrs, &amp;objp-&gt;fromdir_wcc))</div><div class='add'>+        return FALSE;</div><div class='add'>+    if (!xdr_wcc_data(xdrs, &amp;objp-&gt;todir_wcc))</div><div class='add'>+        return FALSE;</div><div class='add'>+    return TRUE;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+bool_t</div><div class='add'>+xdr_rename3resfail(XDR *xdrs, rename3resfail *objp)</div><div class='add'>+{</div><div class='add'>+    if (!xdr_wcc_data(xdrs, &amp;objp-&gt;fromdir_wcc))</div><div class='add'>+        return FALSE;</div><div class='add'>+    if (!xdr_wcc_data(xdrs, &amp;objp-&gt;todir_wcc))</div><div class='add'>+        return FALSE;</div><div class='add'>+    return TRUE;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+bool_t</div><div class='add'>+xdr_rename3res(XDR *xdrs, rename3res *objp)</div><div class='add'>+{</div><div class='add'>+    if (!xdr_nfsstat3(xdrs, &amp;objp-&gt;status))</div><div class='add'>+        return FALSE;</div><div class='add'>+    switch (objp-&gt;status) {</div><div class='add'>+        case NFS3_OK:</div><div class='add'>+            if (!xdr_rename3resok(xdrs, &amp;objp-&gt;rename3res_u.resok))</div><div class='add'>+                return FALSE;</div><div class='add'>+            break;</div><div class='add'>+        default:</div><div class='add'>+            if (!xdr_rename3resfail(xdrs, &amp;objp-&gt;rename3res_u.resfail))</div><div class='add'>+                return FALSE;</div><div class='add'>+            break;</div><div class='add'>+    }</div><div class='add'>+    return TRUE;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+bool_t</div><div class='add'>+xdr_link3args(XDR *xdrs, link3args *objp)</div><div class='add'>+{</div><div class='add'>+    if (!xdr_nfs_fh3(xdrs, &amp;objp-&gt;file))</div><div class='add'>+        return FALSE;</div><div class='add'>+    if (!xdr_diropargs3(xdrs, &amp;objp-&gt;link))</div><div class='add'>+        return FALSE;</div><div class='add'>+    return TRUE;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+bool_t</div><div class='add'>+xdr_link3resok(XDR *xdrs, link3resok *objp)</div><div class='add'>+{</div><div class='add'>+    if (!xdr_post_op_attr(xdrs, &amp;objp-&gt;file_attributes))</div><div class='add'>+        return FALSE;</div><div class='add'>+    if (!xdr_wcc_data(xdrs, &amp;objp-&gt;linkdir_wcc))</div><div class='add'>+        return FALSE;</div><div class='add'>+    return TRUE;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+bool_t</div><div class='add'>+xdr_link3resfail(XDR *xdrs, link3resfail *objp)</div><div class='add'>+{</div><div class='add'>+    if (!xdr_post_op_attr(xdrs, &amp;objp-&gt;file_attributes))</div><div class='add'>+        return FALSE;</div><div class='add'>+    if (!xdr_wcc_data(xdrs, &amp;objp-&gt;linkdir_wcc))</div><div class='add'>+        return FALSE;</div><div class='add'>+    return TRUE;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+bool_t</div><div class='add'>+xdr_link3res(XDR *xdrs, link3res *objp)</div><div class='add'>+{</div><div class='add'>+    if (!xdr_nfsstat3(xdrs, &amp;objp-&gt;status))</div><div class='add'>+        return FALSE;</div><div class='add'>+    switch (objp-&gt;status) {</div><div class='add'>+        case NFS3_OK:</div><div class='add'>+            if (!xdr_link3resok(xdrs, &amp;objp-&gt;link3res_u.resok))</div><div class='add'>+                return FALSE;</div><div class='add'>+            break;</div><div class='add'>+        default:</div><div class='add'>+            if (!xdr_link3resfail(xdrs, &amp;objp-&gt;link3res_u.resfail))</div><div class='add'>+                return FALSE;</div><div class='add'>+            break;</div><div class='add'>+    }</div><div class='add'>+    return TRUE;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+bool_t</div><div class='add'>+xdr_readdir3args(XDR *xdrs, readdir3args *objp)</div><div class='add'>+{</div><div class='add'>+    if (!xdr_nfs_fh3(xdrs, &amp;objp-&gt;dir))</div><div class='add'>+        return FALSE;</div><div class='add'>+    if (!xdr_cookie3(xdrs, &amp;objp-&gt;cookie))</div><div class='add'>+        return FALSE;</div><div class='add'>+    if (!xdr_cookieverf3(xdrs, objp-&gt;cookieverf))</div><div class='add'>+        return FALSE;</div><div class='add'>+    if (!xdr_count3(xdrs, &amp;objp-&gt;count))</div><div class='add'>+        return FALSE;</div><div class='add'>+    return TRUE;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+bool_t</div><div class='add'>+xdr_entry3(XDR *xdrs, entry3 *objp)</div><div class='add'>+{</div><div class='add'>+    if (!xdr_fileid3(xdrs, &amp;objp-&gt;fileid))</div><div class='add'>+        return FALSE;</div><div class='add'>+    if (!xdr_filename3(xdrs, &amp;objp-&gt;name))</div><div class='add'>+        return FALSE;</div><div class='add'>+    if (!xdr_cookie3(xdrs, &amp;objp-&gt;cookie))</div><div class='add'>+        return FALSE;</div><div class='add'>+    if (!xdr_pointer(xdrs, (char **)&amp;objp-&gt;nextentry, sizeof(entry3),</div><div class='add'>+                     (xdrproc_t)xdr_entry3))</div><div class='add'>+        return FALSE;</div><div class='add'>+    return TRUE;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+bool_t</div><div class='add'>+xdr_dirlist3(XDR *xdrs, dirlist3 *objp)</div><div class='add'>+{</div><div class='add'>+    if (!xdr_pointer(xdrs, (char **)&amp;objp-&gt;entries, sizeof(entry3),</div><div class='add'>+                     (xdrproc_t)xdr_entry3))</div><div class='add'>+        return FALSE;</div><div class='add'>+    if (!xdr_bool(xdrs, &amp;objp-&gt;eof))</div><div class='add'>+        return FALSE;</div><div class='add'>+    return TRUE;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+bool_t</div><div class='add'>+xdr_readdir3resok(XDR *xdrs, readdir3resok *objp)</div><div class='add'>+{</div><div class='add'>+    if (!xdr_post_op_attr(xdrs, &amp;objp-&gt;dir_attributes))</div><div class='add'>+        return FALSE;</div><div class='add'>+    if (!xdr_cookieverf3(xdrs, objp-&gt;cookieverf))</div><div class='add'>+        return FALSE;</div><div class='add'>+    if (!xdr_dirlist3(xdrs, &amp;objp-&gt;reply))</div><div class='add'>+        return FALSE;</div><div class='add'>+    return TRUE;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+bool_t</div><div class='add'>+xdr_readdir3resfail(XDR *xdrs, readdir3resfail *objp)</div><div class='add'>+{</div><div class='add'>+    if (!xdr_post_op_attr(xdrs, &amp;objp-&gt;dir_attributes))</div><div class='add'>+        return FALSE;</div><div class='add'>+    return TRUE;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+bool_t</div><div class='add'>+xdr_readdir3res(XDR *xdrs, readdir3res *objp)</div><div class='add'>+{</div><div class='add'>+    if (!xdr_nfsstat3(xdrs, &amp;objp-&gt;status))</div><div class='add'>+        return FALSE;</div><div class='add'>+    switch (objp-&gt;status) {</div><div class='add'>+        case NFS3_OK:</div><div class='add'>+            if (!xdr_readdir3resok(xdrs, &amp;objp-&gt;readdir3res_u.resok))</div><div class='add'>+                return FALSE;</div><div class='add'>+            break;</div><div class='add'>+        default:</div><div class='add'>+            if (!xdr_readdir3resfail(xdrs, &amp;objp-&gt;readdir3res_u.resfail))</div><div class='add'>+                return FALSE;</div><div class='add'>+            break;</div><div class='add'>+    }</div><div class='add'>+    return TRUE;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+bool_t</div><div class='add'>+xdr_readdirp3args(XDR *xdrs, readdirp3args *objp)</div><div class='add'>+{</div><div class='add'>+    if (!xdr_nfs_fh3(xdrs, &amp;objp-&gt;dir))</div><div class='add'>+        return FALSE;</div><div class='add'>+    if (!xdr_cookie3(xdrs, &amp;objp-&gt;cookie))</div><div class='add'>+        return FALSE;</div><div class='add'>+    if (!xdr_cookieverf3(xdrs, objp-&gt;cookieverf))</div><div class='add'>+        return FALSE;</div><div class='add'>+    if (!xdr_count3(xdrs, &amp;objp-&gt;dircount))</div><div class='add'>+        return FALSE;</div><div class='add'>+    if (!xdr_count3(xdrs, &amp;objp-&gt;maxcount))</div><div class='add'>+        return FALSE;</div><div class='add'>+    return TRUE;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+bool_t</div><div class='add'>+xdr_entryp3(XDR *xdrs, entryp3 *objp)</div><div class='add'>+{</div><div class='add'>+    if (!xdr_fileid3(xdrs, &amp;objp-&gt;fileid))</div><div class='add'>+        return FALSE;</div><div class='add'>+    if (!xdr_filename3(xdrs, &amp;objp-&gt;name))</div><div class='add'>+        return FALSE;</div><div class='add'>+    if (!xdr_cookie3(xdrs, &amp;objp-&gt;cookie))</div><div class='add'>+        return FALSE;</div><div class='add'>+    if (!xdr_post_op_attr(xdrs, &amp;objp-&gt;name_attributes))</div><div class='add'>+        return FALSE;</div><div class='add'>+    if (!xdr_post_op_fh3(xdrs, &amp;objp-&gt;name_handle))</div><div class='add'>+        return FALSE;</div><div class='add'>+    if (!xdr_pointer(xdrs, (char **)&amp;objp-&gt;nextentry, sizeof(entryp3),</div><div class='add'>+                     (xdrproc_t)xdr_entryp3))</div><div class='add'>+        return FALSE;</div><div class='add'>+    return TRUE;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+bool_t</div><div class='add'>+xdr_dirlistp3(XDR *xdrs, dirlistp3 *objp)</div><div class='add'>+{</div><div class='add'>+    if (!xdr_pointer(xdrs, (char **)&amp;objp-&gt;entries, sizeof(entryp3),</div><div class='add'>+                     (xdrproc_t)xdr_entryp3))</div><div class='add'>+        return FALSE;</div><div class='add'>+    if (!xdr_bool(xdrs, &amp;objp-&gt;eof))</div><div class='add'>+        return FALSE;</div><div class='add'>+    return TRUE;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+bool_t</div><div class='add'>+xdr_readdirp3resok(XDR *xdrs, readdirp3resok *objp)</div><div class='add'>+{</div><div class='add'>+    if (!xdr_post_op_attr(xdrs, &amp;objp-&gt;dir_attributes))</div><div class='add'>+        return FALSE;</div><div class='add'>+    if (!xdr_cookieverf3(xdrs, objp-&gt;cookieverf))</div><div class='add'>+        return FALSE;</div><div class='add'>+    if (!xdr_dirlistp3(xdrs, &amp;objp-&gt;reply))</div><div class='add'>+        return FALSE;</div><div class='add'>+    return TRUE;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+bool_t</div><div class='add'>+xdr_readdirp3resfail(XDR *xdrs, readdirp3resfail *objp)</div><div class='add'>+{</div><div class='add'>+    if (!xdr_post_op_attr(xdrs, &amp;objp-&gt;dir_attributes))</div><div class='add'>+        return FALSE;</div><div class='add'>+    return TRUE;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+bool_t</div><div class='add'>+xdr_readdirp3res(XDR *xdrs, readdirp3res *objp)</div><div class='add'>+{</div><div class='add'>+    if (!xdr_nfsstat3(xdrs, &amp;objp-&gt;status))</div><div class='add'>+        return FALSE;</div><div class='add'>+    switch (objp-&gt;status) {</div><div class='add'>+        case NFS3_OK:</div><div class='add'>+            if (!xdr_readdirp3resok(xdrs, &amp;objp-&gt;readdirp3res_u.resok))</div><div class='add'>+                return FALSE;</div><div class='add'>+            break;</div><div class='add'>+        default:</div><div class='add'>+            if (!xdr_readdirp3resfail(xdrs, &amp;objp-&gt;readdirp3res_u.resfail))</div><div class='add'>+                return FALSE;</div><div class='add'>+            break;</div><div class='add'>+    }</div><div class='add'>+    return TRUE;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+bool_t</div><div class='add'>+xdr_fsstat3args(XDR *xdrs, fsstat3args *objp)</div><div class='add'>+{</div><div class='add'>+    if (!xdr_nfs_fh3(xdrs, &amp;objp-&gt;fsroot))</div><div class='add'>+        return FALSE;</div><div class='add'>+    return TRUE;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+bool_t</div><div class='add'>+xdr_fsstat3resok(XDR *xdrs, fsstat3resok *objp)</div><div class='add'>+{</div><div class='add'>+    if (!xdr_post_op_attr(xdrs, &amp;objp-&gt;obj_attributes))</div><div class='add'>+        return FALSE;</div><div class='add'>+    if (!xdr_size3(xdrs, &amp;objp-&gt;tbytes))</div><div class='add'>+        return FALSE;</div><div class='add'>+    if (!xdr_size3(xdrs, &amp;objp-&gt;fbytes))</div><div class='add'>+        return FALSE;</div><div class='add'>+    if (!xdr_size3(xdrs, &amp;objp-&gt;abytes))</div><div class='add'>+        return FALSE;</div><div class='add'>+    if (!xdr_size3(xdrs, &amp;objp-&gt;tfiles))</div><div class='add'>+        return FALSE;</div><div class='add'>+    if (!xdr_size3(xdrs, &amp;objp-&gt;ffiles))</div><div class='add'>+        return FALSE;</div><div class='add'>+    if (!xdr_size3(xdrs, &amp;objp-&gt;afiles))</div><div class='add'>+        return FALSE;</div><div class='add'>+    if (!xdr_uint32(xdrs, &amp;objp-&gt;invarsec))</div><div class='add'>+        return FALSE;</div><div class='add'>+    return TRUE;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+bool_t</div><div class='add'>+xdr_fsstat3resfail(XDR *xdrs, fsstat3resfail *objp)</div><div class='add'>+{</div><div class='add'>+    if (!xdr_post_op_attr(xdrs, &amp;objp-&gt;obj_attributes))</div><div class='add'>+        return FALSE;</div><div class='add'>+    return TRUE;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+bool_t</div><div class='add'>+xdr_fsstat3res(XDR *xdrs, fsstat3res *objp)</div><div class='add'>+{</div><div class='add'>+    if (!xdr_nfsstat3(xdrs, &amp;objp-&gt;status))</div><div class='add'>+        return FALSE;</div><div class='add'>+    switch (objp-&gt;status) {</div><div class='add'>+        case NFS3_OK:</div><div class='add'>+            if (!xdr_fsstat3resok(xdrs, &amp;objp-&gt;fsstat3res_u.resok))</div><div class='add'>+                return FALSE;</div><div class='add'>+            break;</div><div class='add'>+        default:</div><div class='add'>+            if (!xdr_fsstat3resfail(xdrs, &amp;objp-&gt;fsstat3res_u.resfail))</div><div class='add'>+                return FALSE;</div><div class='add'>+            break;</div><div class='add'>+    }</div><div class='add'>+    return TRUE;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+bool_t</div><div class='add'>+xdr_fsinfo3args(XDR *xdrs, fsinfo3args *objp)</div><div class='add'>+{</div><div class='add'>+    if (!xdr_nfs_fh3(xdrs, &amp;objp-&gt;fsroot))</div><div class='add'>+        return FALSE;</div><div class='add'>+    return TRUE;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+bool_t</div><div class='add'>+xdr_fsinfo3resok(XDR *xdrs, fsinfo3resok *objp)</div><div class='add'>+{</div><div class='add'>+    if (!xdr_post_op_attr(xdrs, &amp;objp-&gt;obj_attributes))</div><div class='add'>+        return FALSE;</div><div class='add'>+    if (!xdr_uint32(xdrs, &amp;objp-&gt;rtmax))</div><div class='add'>+        return FALSE;</div><div class='add'>+    if (!xdr_uint32(xdrs, &amp;objp-&gt;rtpref))</div><div class='add'>+        return FALSE;</div><div class='add'>+    if (!xdr_uint32(xdrs, &amp;objp-&gt;rtmult))</div><div class='add'>+        return FALSE;</div><div class='add'>+    if (!xdr_uint32(xdrs, &amp;objp-&gt;wtmax))</div><div class='add'>+        return FALSE;</div><div class='add'>+    if (!xdr_uint32(xdrs, &amp;objp-&gt;wtpref))</div><div class='add'>+        return FALSE;</div><div class='add'>+    if (!xdr_uint32(xdrs, &amp;objp-&gt;wtmult))</div><div class='add'>+        return FALSE;</div><div class='add'>+    if (!xdr_uint32(xdrs, &amp;objp-&gt;dtpref))</div><div class='add'>+        return FALSE;</div><div class='add'>+    if (!xdr_size3(xdrs, &amp;objp-&gt;maxfilesize))</div><div class='add'>+        return FALSE;</div><div class='add'>+    if (!xdr_nfstime3(xdrs, &amp;objp-&gt;time_delta))</div><div class='add'>+        return FALSE;</div><div class='add'>+    if (!xdr_uint32(xdrs, &amp;objp-&gt;properties))</div><div class='add'>+        return FALSE;</div><div class='add'>+    return TRUE;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+bool_t</div><div class='add'>+xdr_fsinfo3resfail(XDR *xdrs, fsinfo3resfail *objp)</div><div class='add'>+{</div><div class='add'>+    if (!xdr_post_op_attr(xdrs, &amp;objp-&gt;obj_attributes))</div><div class='add'>+        return FALSE;</div><div class='add'>+    return TRUE;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+bool_t</div><div class='add'>+xdr_fsinfo3res(XDR *xdrs, fsinfo3res *objp)</div><div class='add'>+{</div><div class='add'>+    if (!xdr_nfsstat3(xdrs, &amp;objp-&gt;status))</div><div class='add'>+        return FALSE;</div><div class='add'>+    switch (objp-&gt;status) {</div><div class='add'>+        case NFS3_OK:</div><div class='add'>+            if (!xdr_fsinfo3resok(xdrs, &amp;objp-&gt;fsinfo3res_u.resok))</div><div class='add'>+                return FALSE;</div><div class='add'>+            break;</div><div class='add'>+        default:</div><div class='add'>+            if (!xdr_fsinfo3resfail(xdrs, &amp;objp-&gt;fsinfo3res_u.resfail))</div><div class='add'>+                return FALSE;</div><div class='add'>+            break;</div><div class='add'>+    }</div><div class='add'>+    return TRUE;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+bool_t</div><div class='add'>+xdr_pathconf3args(XDR *xdrs, pathconf3args *objp)</div><div class='add'>+{</div><div class='add'>+    if (!xdr_nfs_fh3(xdrs, &amp;objp-&gt;object))</div><div class='add'>+        return FALSE;</div><div class='add'>+    return TRUE;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+bool_t</div><div class='add'>+xdr_pathconf3resok(XDR *xdrs, pathconf3resok *objp)</div><div class='add'>+{</div><div class='add'>+    register int32_t *buf;</div><div class='add'>+</div><div class='add'>+    if (xdrs-&gt;x_op == XDR_ENCODE) {</div><div class='add'>+        if (!xdr_post_op_attr(xdrs, &amp;objp-&gt;obj_attributes))</div><div class='add'>+            return FALSE;</div><div class='add'>+        if (!xdr_uint32(xdrs, &amp;objp-&gt;linkmax))</div><div class='add'>+            return FALSE;</div><div class='add'>+        if (!xdr_uint32(xdrs, &amp;objp-&gt;name_max))</div><div class='add'>+            return FALSE;</div><div class='add'>+        buf = XDR_INLINE(xdrs, 4 * BYTES_PER_XDR_UNIT);</div><div class='add'>+        if (buf == NULL) {</div><div class='add'>+            if (!xdr_bool(xdrs, &amp;objp-&gt;no_trunc))</div><div class='add'>+                return FALSE;</div><div class='add'>+            if (!xdr_bool(xdrs, &amp;objp-&gt;chown_restricted))</div><div class='add'>+                return FALSE;</div><div class='add'>+            if (!xdr_bool(xdrs, &amp;objp-&gt;case_insensitive))</div><div class='add'>+                return FALSE;</div><div class='add'>+            if (!xdr_bool(xdrs, &amp;objp-&gt;case_preserving))</div><div class='add'>+                return FALSE;</div><div class='add'>+        } else {</div><div class='add'>+            IXDR_PUT_BOOL(buf, objp-&gt;no_trunc);</div><div class='add'>+            IXDR_PUT_BOOL(buf, objp-&gt;chown_restricted);</div><div class='add'>+            IXDR_PUT_BOOL(buf, objp-&gt;case_insensitive);</div><div class='add'>+            IXDR_PUT_BOOL(buf, objp-&gt;case_preserving);</div><div class='add'>+        }</div><div class='add'>+        return TRUE;</div><div class='add'>+    } else if (xdrs-&gt;x_op == XDR_DECODE) {</div><div class='add'>+        if (!xdr_post_op_attr(xdrs, &amp;objp-&gt;obj_attributes))</div><div class='add'>+            return FALSE;</div><div class='add'>+        if (!xdr_uint32(xdrs, &amp;objp-&gt;linkmax))</div><div class='add'>+            return FALSE;</div><div class='add'>+        if (!xdr_uint32(xdrs, &amp;objp-&gt;name_max))</div><div class='add'>+            return FALSE;</div><div class='add'>+        buf = XDR_INLINE(xdrs, 4 * BYTES_PER_XDR_UNIT);</div><div class='add'>+        if (buf == NULL) {</div><div class='add'>+            if (!xdr_bool(xdrs, &amp;objp-&gt;no_trunc))</div><div class='add'>+                return FALSE;</div><div class='add'>+            if (!xdr_bool(xdrs, &amp;objp-&gt;chown_restricted))</div><div class='add'>+                return FALSE;</div><div class='add'>+            if (!xdr_bool(xdrs, &amp;objp-&gt;case_insensitive))</div><div class='add'>+                return FALSE;</div><div class='add'>+            if (!xdr_bool(xdrs, &amp;objp-&gt;case_preserving))</div><div class='add'>+                return FALSE;</div><div class='add'>+        } else {</div><div class='add'>+            objp-&gt;no_trunc = IXDR_GET_BOOL(buf);</div><div class='add'>+            objp-&gt;chown_restricted = IXDR_GET_BOOL(buf);</div><div class='add'>+            objp-&gt;case_insensitive = IXDR_GET_BOOL(buf);</div><div class='add'>+            objp-&gt;case_preserving = IXDR_GET_BOOL(buf);</div><div class='add'>+        }</div><div class='add'>+        return TRUE;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (!xdr_post_op_attr(xdrs, &amp;objp-&gt;obj_attributes))</div><div class='add'>+        return FALSE;</div><div class='add'>+    if (!xdr_uint32(xdrs, &amp;objp-&gt;linkmax))</div><div class='add'>+        return FALSE;</div><div class='add'>+    if (!xdr_uint32(xdrs, &amp;objp-&gt;name_max))</div><div class='add'>+        return FALSE;</div><div class='add'>+    if (!xdr_bool(xdrs, &amp;objp-&gt;no_trunc))</div><div class='add'>+        return FALSE;</div><div class='add'>+    if (!xdr_bool(xdrs, &amp;objp-&gt;chown_restricted))</div><div class='add'>+        return FALSE;</div><div class='add'>+    if (!xdr_bool(xdrs, &amp;objp-&gt;case_insensitive))</div><div class='add'>+        return FALSE;</div><div class='add'>+    if (!xdr_bool(xdrs, &amp;objp-&gt;case_preserving))</div><div class='add'>+        return FALSE;</div><div class='add'>+    return TRUE;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+bool_t</div><div class='add'>+xdr_pathconf3resfail(XDR *xdrs, pathconf3resfail *objp)</div><div class='add'>+{</div><div class='add'>+    if (!xdr_post_op_attr(xdrs, &amp;objp-&gt;obj_attributes))</div><div class='add'>+        return FALSE;</div><div class='add'>+    return TRUE;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+bool_t</div><div class='add'>+xdr_pathconf3res(XDR *xdrs, pathconf3res *objp)</div><div class='add'>+{</div><div class='add'>+    if (!xdr_nfsstat3(xdrs, &amp;objp-&gt;status))</div><div class='add'>+        return FALSE;</div><div class='add'>+    switch (objp-&gt;status) {</div><div class='add'>+        case NFS3_OK:</div><div class='add'>+            if (!xdr_pathconf3resok(xdrs, &amp;objp-&gt;pathconf3res_u.resok))</div><div class='add'>+                return FALSE;</div><div class='add'>+            break;</div><div class='add'>+        default:</div><div class='add'>+            if (!xdr_pathconf3resfail(xdrs, &amp;objp-&gt;pathconf3res_u.resfail))</div><div class='add'>+                return FALSE;</div><div class='add'>+            break;</div><div class='add'>+    }</div><div class='add'>+    return TRUE;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+bool_t</div><div class='add'>+xdr_commit3args(XDR *xdrs, commit3args *objp)</div><div class='add'>+{</div><div class='add'>+    if (!xdr_nfs_fh3(xdrs, &amp;objp-&gt;file))</div><div class='add'>+        return FALSE;</div><div class='add'>+    if (!xdr_offset3(xdrs, &amp;objp-&gt;offset))</div><div class='add'>+        return FALSE;</div><div class='add'>+    if (!xdr_count3(xdrs, &amp;objp-&gt;count))</div><div class='add'>+        return FALSE;</div><div class='add'>+    return TRUE;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+bool_t</div><div class='add'>+xdr_commit3resok(XDR *xdrs, commit3resok *objp)</div><div class='add'>+{</div><div class='add'>+    if (!xdr_wcc_data(xdrs, &amp;objp-&gt;file_wcc))</div><div class='add'>+        return FALSE;</div><div class='add'>+    if (!xdr_writeverf3(xdrs, objp-&gt;verf))</div><div class='add'>+        return FALSE;</div><div class='add'>+    return TRUE;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+bool_t</div><div class='add'>+xdr_commit3resfail(XDR *xdrs, commit3resfail *objp)</div><div class='add'>+{</div><div class='add'>+    if (!xdr_wcc_data(xdrs, &amp;objp-&gt;file_wcc))</div><div class='add'>+        return FALSE;</div><div class='add'>+    return TRUE;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+bool_t</div><div class='add'>+xdr_commit3res(XDR *xdrs, commit3res *objp)</div><div class='add'>+{</div><div class='add'>+    if (!xdr_nfsstat3(xdrs, &amp;objp-&gt;status))</div><div class='add'>+        return FALSE;</div><div class='add'>+    switch (objp-&gt;status) {</div><div class='add'>+        case NFS3_OK:</div><div class='add'>+            if (!xdr_commit3resok(xdrs, &amp;objp-&gt;commit3res_u.resok))</div><div class='add'>+                return FALSE;</div><div class='add'>+            break;</div><div class='add'>+        default:</div><div class='add'>+            if (!xdr_commit3resfail(xdrs, &amp;objp-&gt;commit3res_u.resfail))</div><div class='add'>+                return FALSE;</div><div class='add'>+            break;</div><div class='add'>+    }</div><div class='add'>+    return TRUE;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+bool_t</div><div class='add'>+xdr_fhandle3(XDR *xdrs, fhandle3 *objp)</div><div class='add'>+{</div><div class='add'>+    if (!xdr_bytes(xdrs, (char **)&amp;objp-&gt;fhandle3_val,</div><div class='add'>+                   (u_int *)&amp;objp-&gt;fhandle3_len, FHSIZE3))</div><div class='add'>+        return FALSE;</div><div class='add'>+    return TRUE;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+bool_t</div><div class='add'>+xdr_dirpath(XDR *xdrs, dirpath *objp)</div><div class='add'>+{</div><div class='add'>+    if (!xdr_string(xdrs, objp, MNTPATHLEN))</div><div class='add'>+        return FALSE;</div><div class='add'>+    return TRUE;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+bool_t</div><div class='add'>+xdr_name(XDR *xdrs, name *objp)</div><div class='add'>+{</div><div class='add'>+    if (!xdr_string(xdrs, objp, MNTNAMLEN))</div><div class='add'>+        return FALSE;</div><div class='add'>+    return TRUE;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+bool_t</div><div class='add'>+xdr_mountstat3(XDR *xdrs, mountstat3 *objp)</div><div class='add'>+{</div><div class='add'>+    if (!xdr_enum(xdrs, (enum_t *)objp))</div><div class='add'>+        return FALSE;</div><div class='add'>+    return TRUE;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+bool_t</div><div class='add'>+xdr_mountres3_ok(XDR *xdrs, mountres3_ok *objp)</div><div class='add'>+{</div><div class='add'>+    if (!xdr_fhandle3(xdrs, &amp;objp-&gt;fhandle))</div><div class='add'>+        return FALSE;</div><div class='add'>+    if (!xdr_array(xdrs, (char **)&amp;objp-&gt;auth_flavors.auth_flavors_val,</div><div class='add'>+                   (u_int *)&amp;objp-&gt;auth_flavors.auth_flavors_len, ~0,</div><div class='add'>+                   sizeof(int), (xdrproc_t)xdr_int))</div><div class='add'>+        return FALSE;</div><div class='add'>+    return TRUE;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+bool_t</div><div class='add'>+xdr_mountres3(XDR *xdrs, mountres3 *objp)</div><div class='add'>+{</div><div class='add'>+    if (!xdr_mountstat3(xdrs, &amp;objp-&gt;fhs_status))</div><div class='add'>+        return FALSE;</div><div class='add'>+    switch (objp-&gt;fhs_status) {</div><div class='add'>+        case MNT3_OK:</div><div class='add'>+            if (!xdr_mountres3_ok(xdrs, &amp;objp-&gt;mountres3_u.mountinfo))</div><div class='add'>+                return FALSE;</div><div class='add'>+            break;</div><div class='add'>+        default:</div><div class='add'>+            break;</div><div class='add'>+    }</div><div class='add'>+    return TRUE;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+bool_t</div><div class='add'>+xdr_mountlist(XDR *xdrs, mountlist *objp)</div><div class='add'>+{</div><div class='add'>+    if (!xdr_pointer(xdrs, (char **)objp, sizeof(struct mountbody),</div><div class='add'>+                     (xdrproc_t)xdr_mountbody))</div><div class='add'>+        return FALSE;</div><div class='add'>+    return TRUE;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+bool_t</div><div class='add'>+xdr_mountbody(XDR *xdrs, mountbody *objp)</div><div class='add'>+{</div><div class='add'>+    if (!xdr_name(xdrs, &amp;objp-&gt;ml_hostname))</div><div class='add'>+        return FALSE;</div><div class='add'>+    if (!xdr_dirpath(xdrs, &amp;objp-&gt;ml_directory))</div><div class='add'>+        return FALSE;</div><div class='add'>+    if (!xdr_mountlist(xdrs, &amp;objp-&gt;ml_next))</div><div class='add'>+        return FALSE;</div><div class='add'>+    return TRUE;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+bool_t</div><div class='add'>+xdr_groups(XDR *xdrs, groups *objp)</div><div class='add'>+{</div><div class='add'>+    if (!xdr_pointer(xdrs, (char **)objp, sizeof(struct groupnode),</div><div class='add'>+                     (xdrproc_t)xdr_groupnode))</div><div class='add'>+        return FALSE;</div><div class='add'>+    return TRUE;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+bool_t</div><div class='add'>+xdr_groupnode(XDR *xdrs, groupnode *objp)</div><div class='add'>+{</div><div class='add'>+    if (!xdr_name(xdrs, &amp;objp-&gt;gr_name))</div><div class='add'>+        return FALSE;</div><div class='add'>+    if (!xdr_groups(xdrs, &amp;objp-&gt;gr_next))</div><div class='add'>+        return FALSE;</div><div class='add'>+    return TRUE;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+bool_t</div><div class='add'>+xdr_exports(XDR *xdrs, exports *objp)</div><div class='add'>+{</div><div class='add'>+    if (!xdr_pointer(xdrs, (char **)objp, sizeof(struct exportnode),</div><div class='add'>+                     (xdrproc_t)xdr_exportnode))</div><div class='add'>+        return FALSE;</div><div class='add'>+    return TRUE;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+bool_t</div><div class='add'>+xdr_exportnode(XDR *xdrs, exportnode *objp)</div><div class='add'>+{</div><div class='add'>+    if (!xdr_dirpath(xdrs, &amp;objp-&gt;ex_dir))</div><div class='add'>+        return FALSE;</div><div class='add'>+    if (!xdr_groups(xdrs, &amp;objp-&gt;ex_groups))</div><div class='add'>+        return FALSE;</div><div class='add'>+    if (!xdr_exports(xdrs, &amp;objp-&gt;ex_next))</div><div class='add'>+        return FALSE;</div><div class='add'>+    return TRUE;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+xdr_free_groupnode(struct groupnode *group)</div><div class='add'>+{</div><div class='add'>+    if (!group)</div><div class='add'>+        return;</div><div class='add'>+</div><div class='add'>+    if (group-&gt;gr_next)</div><div class='add'>+        xdr_free_groupnode(group-&gt;gr_next);</div><div class='add'>+</div><div class='add'>+    GF_FREE(group-&gt;gr_name);</div><div class='add'>+    GF_FREE(group);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+xdr_free_exports_list(struct exportnode *first)</div><div class='add'>+{</div><div class='add'>+    struct exportnode *elist = NULL;</div><div class='add'>+</div><div class='add'>+    if (!first)</div><div class='add'>+        return;</div><div class='add'>+</div><div class='add'>+    while (first) {</div><div class='add'>+        elist = first-&gt;ex_next;</div><div class='add'>+        GF_FREE(first-&gt;ex_dir);</div><div class='add'>+</div><div class='add'>+        xdr_free_groupnode(first-&gt;ex_groups);</div><div class='add'>+</div><div class='add'>+        GF_FREE(first);</div><div class='add'>+        first = elist;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+xdr_free_mountlist(mountlist ml)</div><div class='add'>+{</div><div class='add'>+    struct mountbody *next = NULL;</div><div class='add'>+</div><div class='add'>+    if (!ml)</div><div class='add'>+        return;</div><div class='add'>+</div><div class='add'>+    while (ml) {</div><div class='add'>+        GF_FREE(ml-&gt;ml_hostname);</div><div class='add'>+        GF_FREE(ml-&gt;ml_directory);</div><div class='add'>+        next = ml-&gt;ml_next;</div><div class='add'>+        GF_FREE(ml);</div><div class='add'>+        ml = next;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* Free statements are based on the way sunrpc xdr decoding</div><div class='add'>+ * code performs memory allocations.</div><div class='add'>+ */</div><div class='add'>+void</div><div class='add'>+xdr_free_write3args_nocopy(write3args *wa)</div><div class='add'>+{</div><div class='add'>+    if (!wa)</div><div class='add'>+        return;</div><div class='add'>+</div><div class='add'>+    FREE(wa-&gt;file.data.data_val);</div><div class='add'>+}</div><div class='head'>diff --git a/rpc/xdr/src/xdr-nfs3.h b/rpc/xdr/src/xdr-nfs3.h<br/>new file mode 100644<br/>index 00000000000..b7f5abefffd<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/rpc/xdr/src/xdr-nfs3.h?id=d1d7a6f35c816822fab51c820e25023863c239c1'>rpc/xdr/src/xdr-nfs3.h</a></div><div class='hunk'>@@ -0,0 +1,1351 @@</div><div class='add'>+/*</div><div class='add'>+  Copyright (c) 2007-2012 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#ifndef _XDR_NFS3_H</div><div class='add'>+#define _XDR_NFS3_H</div><div class='add'>+</div><div class='add'>+#include &lt;rpc/rpc.h&gt;</div><div class='add'>+#include &lt;sys/types.h&gt;</div><div class='add'>+</div><div class='add'>+#define NFS3_FHSIZE 64</div><div class='add'>+#define NFS3_COOKIEVERFSIZE 8</div><div class='add'>+#define NFS3_CREATEVERFSIZE 8</div><div class='add'>+#define NFS3_WRITEVERFSIZE 8</div><div class='add'>+</div><div class='add'>+#define NFS3_ENTRY3_FIXED_SIZE 24</div><div class='add'>+#define NFS3_POSTOPATTR_SIZE 88</div><div class='add'>+#define NFS3_READDIR_RESOK_SIZE                                                \</div><div class='add'>+    (NFS3_POSTOPATTR_SIZE + sizeof(bool_t) + NFS3_COOKIEVERFSIZE)</div><div class='add'>+</div><div class='add'>+/* In size of post_op_fh3, the length of the file handle will have to be</div><div class='add'>+ * included separately since we have variable length fh. Here we only account</div><div class='add'>+ * for the field for handle_follows and for the file handle length field.</div><div class='add'>+ */</div><div class='add'>+#define NFS3_POSTOPFH3_FIXED_SIZE (sizeof(bool_t) + sizeof(uint32_t))</div><div class='add'>+</div><div class='add'>+/* Similarly, the size of the entry will have to include the variable length</div><div class='add'>+ * file handle and the length of the entry name.</div><div class='add'>+ */</div><div class='add'>+#define NFS3_ENTRYP3_FIXED_SIZE                                                \</div><div class='add'>+    (NFS3_ENTRY3_FIXED_SIZE + NFS3_POSTOPATTR_SIZE + NFS3_POSTOPFH3_FIXED_SIZE)</div><div class='add'>+</div><div class='add'>+typedef uint64_t uint64;</div><div class='add'>+typedef int64_t int64;</div><div class='add'>+typedef uint32_t uint32;</div><div class='add'>+typedef int32_t int32;</div><div class='add'>+typedef char *filename3;</div><div class='add'>+typedef char *nfspath3;</div><div class='add'>+typedef uint64 fileid3;</div><div class='add'>+typedef uint64 cookie3;</div><div class='add'>+typedef char cookieverf3[NFS3_COOKIEVERFSIZE];</div><div class='add'>+typedef char createverf3[NFS3_CREATEVERFSIZE];</div><div class='add'>+typedef char writeverf3[NFS3_WRITEVERFSIZE];</div><div class='add'>+typedef uint32 uid3;</div><div class='add'>+typedef uint32 gid3;</div><div class='add'>+typedef uint64 size3;</div><div class='add'>+typedef uint64 offset3;</div><div class='add'>+typedef uint32 mode3;</div><div class='add'>+typedef uint32 count3;</div><div class='add'>+</div><div class='add'>+#define NFS3MODE_SETXUID 0x00800</div><div class='add'>+#define NFS3MODE_SETXGID 0x00400</div><div class='add'>+#define NFS3MODE_SAVESWAPTXT 0x00200</div><div class='add'>+#define NFS3MODE_ROWNER 0x00100</div><div class='add'>+#define NFS3MODE_WOWNER 0x00080</div><div class='add'>+#define NFS3MODE_XOWNER 0x00040</div><div class='add'>+#define NFS3MODE_RGROUP 0x00020</div><div class='add'>+#define NFS3MODE_WGROUP 0x00010</div><div class='add'>+#define NFS3MODE_XGROUP 0x00008</div><div class='add'>+#define NFS3MODE_ROTHER 0x00004</div><div class='add'>+#define NFS3MODE_WOTHER 0x00002</div><div class='add'>+#define NFS3MODE_XOTHER 0x00001</div><div class='add'>+</div><div class='add'>+enum nfsstat3 {</div><div class='add'>+    NFS3_OK = 0,</div><div class='add'>+    NFS3ERR_PERM = 1,</div><div class='add'>+    NFS3ERR_NOENT = 2,</div><div class='add'>+    NFS3ERR_IO = 5,</div><div class='add'>+    NFS3ERR_NXIO = 6,</div><div class='add'>+    NFS3ERR_ACCES = 13,</div><div class='add'>+    NFS3ERR_EXIST = 17,</div><div class='add'>+    NFS3ERR_XDEV = 18,</div><div class='add'>+    NFS3ERR_NODEV = 19,</div><div class='add'>+    NFS3ERR_NOTDIR = 20,</div><div class='add'>+    NFS3ERR_ISDIR = 21,</div><div class='add'>+    NFS3ERR_INVAL = 22,</div><div class='add'>+    NFS3ERR_FBIG = 27,</div><div class='add'>+    NFS3ERR_NOSPC = 28,</div><div class='add'>+    NFS3ERR_ROFS = 30,</div><div class='add'>+    NFS3ERR_MLINK = 31,</div><div class='add'>+    NFS3ERR_NAMETOOLONG = 63,</div><div class='add'>+    NFS3ERR_NOTEMPTY = 66,</div><div class='add'>+    NFS3ERR_DQUOT = 69,</div><div class='add'>+    NFS3ERR_STALE = 70,</div><div class='add'>+    NFS3ERR_REMOTE = 71,</div><div class='add'>+    NFS3ERR_BADHANDLE = 10001,</div><div class='add'>+    NFS3ERR_NOT_SYNC = 10002,</div><div class='add'>+    NFS3ERR_BAD_COOKIE = 10003,</div><div class='add'>+    NFS3ERR_NOTSUPP = 10004,</div><div class='add'>+    NFS3ERR_TOOSMALL = 10005,</div><div class='add'>+    NFS3ERR_SERVERFAULT = 10006,</div><div class='add'>+    NFS3ERR_BADTYPE = 10007,</div><div class='add'>+    NFS3ERR_JUKEBOX = 10008,</div><div class='add'>+    NFS3ERR_END_OF_LIST = -1,</div><div class='add'>+};</div><div class='add'>+typedef enum nfsstat3 nfsstat3;</div><div class='add'>+</div><div class='add'>+enum ftype3 {</div><div class='add'>+    NF3REG = 1,</div><div class='add'>+    NF3DIR = 2,</div><div class='add'>+    NF3BLK = 3,</div><div class='add'>+    NF3CHR = 4,</div><div class='add'>+    NF3LNK = 5,</div><div class='add'>+    NF3SOCK = 6,</div><div class='add'>+    NF3FIFO = 7,</div><div class='add'>+};</div><div class='add'>+typedef enum ftype3 ftype3;</div><div class='add'>+</div><div class='add'>+struct specdata3 {</div><div class='add'>+    uint32 specdata1;</div><div class='add'>+    uint32 specdata2;</div><div class='add'>+};</div><div class='add'>+typedef struct specdata3 specdata3;</div><div class='add'>+</div><div class='add'>+struct nfs_fh3 {</div><div class='add'>+    struct {</div><div class='add'>+        u_int data_len;</div><div class='add'>+        char *data_val;</div><div class='add'>+    } data;</div><div class='add'>+};</div><div class='add'>+typedef struct nfs_fh3 nfs_fh3;</div><div class='add'>+</div><div class='add'>+struct nfstime3 {</div><div class='add'>+    uint32 seconds;</div><div class='add'>+    uint32 nseconds;</div><div class='add'>+};</div><div class='add'>+typedef struct nfstime3 nfstime3;</div><div class='add'>+</div><div class='add'>+struct fattr3 {</div><div class='add'>+    ftype3 type;</div><div class='add'>+    mode3 mode;</div><div class='add'>+    uint32 nlink;</div><div class='add'>+    uid3 uid;</div><div class='add'>+    gid3 gid;</div><div class='add'>+    size3 size;</div><div class='add'>+    size3 used;</div><div class='add'>+    specdata3 rdev;</div><div class='add'>+    uint64 fsid;</div><div class='add'>+    fileid3 fileid;</div><div class='add'>+    nfstime3 atime;</div><div class='add'>+    nfstime3 mtime;</div><div class='add'>+    nfstime3 ctime;</div><div class='add'>+};</div><div class='add'>+typedef struct fattr3 fattr3;</div><div class='add'>+</div><div class='add'>+struct post_op_attr {</div><div class='add'>+    bool_t attributes_follow;</div><div class='add'>+    union {</div><div class='add'>+        fattr3 attributes;</div><div class='add'>+    } post_op_attr_u;</div><div class='add'>+};</div><div class='add'>+typedef struct post_op_attr post_op_attr;</div><div class='add'>+</div><div class='add'>+struct wcc_attr {</div><div class='add'>+    size3 size;</div><div class='add'>+    nfstime3 mtime;</div><div class='add'>+    nfstime3 ctime;</div><div class='add'>+};</div><div class='add'>+typedef struct wcc_attr wcc_attr;</div><div class='add'>+</div><div class='add'>+struct pre_op_attr {</div><div class='add'>+    bool_t attributes_follow;</div><div class='add'>+    union {</div><div class='add'>+        wcc_attr attributes;</div><div class='add'>+    } pre_op_attr_u;</div><div class='add'>+};</div><div class='add'>+typedef struct pre_op_attr pre_op_attr;</div><div class='add'>+</div><div class='add'>+struct wcc_data {</div><div class='add'>+    pre_op_attr before;</div><div class='add'>+    post_op_attr after;</div><div class='add'>+};</div><div class='add'>+typedef struct wcc_data wcc_data;</div><div class='add'>+</div><div class='add'>+struct post_op_fh3 {</div><div class='add'>+    bool_t handle_follows;</div><div class='add'>+    union {</div><div class='add'>+        nfs_fh3 handle;</div><div class='add'>+    } post_op_fh3_u;</div><div class='add'>+};</div><div class='add'>+typedef struct post_op_fh3 post_op_fh3;</div><div class='add'>+</div><div class='add'>+enum time_how {</div><div class='add'>+    DONT_CHANGE = 0,</div><div class='add'>+    SET_TO_SERVER_TIME = 1,</div><div class='add'>+    SET_TO_CLIENT_TIME = 2,</div><div class='add'>+};</div><div class='add'>+typedef enum time_how time_how;</div><div class='add'>+</div><div class='add'>+struct set_mode3 {</div><div class='add'>+    bool_t set_it;</div><div class='add'>+    union {</div><div class='add'>+        mode3 mode;</div><div class='add'>+    } set_mode3_u;</div><div class='add'>+};</div><div class='add'>+typedef struct set_mode3 set_mode3;</div><div class='add'>+</div><div class='add'>+struct set_uid3 {</div><div class='add'>+    bool_t set_it;</div><div class='add'>+    union {</div><div class='add'>+        uid3 uid;</div><div class='add'>+    } set_uid3_u;</div><div class='add'>+};</div><div class='add'>+typedef struct set_uid3 set_uid3;</div><div class='add'>+</div><div class='add'>+struct set_gid3 {</div><div class='add'>+    bool_t set_it;</div><div class='add'>+    union {</div><div class='add'>+        gid3 gid;</div><div class='add'>+    } set_gid3_u;</div><div class='add'>+};</div><div class='add'>+typedef struct set_gid3 set_gid3;</div><div class='add'>+</div><div class='add'>+struct set_size3 {</div><div class='add'>+    bool_t set_it;</div><div class='add'>+    union {</div><div class='add'>+        size3 size;</div><div class='add'>+    } set_size3_u;</div><div class='add'>+};</div><div class='add'>+typedef struct set_size3 set_size3;</div><div class='add'>+</div><div class='add'>+struct set_atime {</div><div class='add'>+    time_how set_it;</div><div class='add'>+    union {</div><div class='add'>+        nfstime3 atime;</div><div class='add'>+    } set_atime_u;</div><div class='add'>+};</div><div class='add'>+typedef struct set_atime set_atime;</div><div class='add'>+</div><div class='add'>+struct set_mtime {</div><div class='add'>+    time_how set_it;</div><div class='add'>+    union {</div><div class='add'>+        nfstime3 mtime;</div><div class='add'>+    } set_mtime_u;</div><div class='add'>+};</div><div class='add'>+typedef struct set_mtime set_mtime;</div><div class='add'>+</div><div class='add'>+struct sattr3 {</div><div class='add'>+    set_mode3 mode;</div><div class='add'>+    set_uid3 uid;</div><div class='add'>+    set_gid3 gid;</div><div class='add'>+    set_size3 size;</div><div class='add'>+    set_atime atime;</div><div class='add'>+    set_mtime mtime;</div><div class='add'>+};</div><div class='add'>+typedef struct sattr3 sattr3;</div><div class='add'>+</div><div class='add'>+struct diropargs3 {</div><div class='add'>+    nfs_fh3 dir;</div><div class='add'>+    filename3 name;</div><div class='add'>+};</div><div class='add'>+typedef struct diropargs3 diropargs3;</div><div class='add'>+</div><div class='add'>+struct getattr3args {</div><div class='add'>+    nfs_fh3 object;</div><div class='add'>+};</div><div class='add'>+typedef struct getattr3args getattr3args;</div><div class='add'>+</div><div class='add'>+struct getattr3resok {</div><div class='add'>+    fattr3 obj_attributes;</div><div class='add'>+};</div><div class='add'>+typedef struct getattr3resok getattr3resok;</div><div class='add'>+</div><div class='add'>+struct getattr3res {</div><div class='add'>+    nfsstat3 status;</div><div class='add'>+    union {</div><div class='add'>+        getattr3resok resok;</div><div class='add'>+    } getattr3res_u;</div><div class='add'>+};</div><div class='add'>+typedef struct getattr3res getattr3res;</div><div class='add'>+</div><div class='add'>+struct sattrguard3 {</div><div class='add'>+    bool_t check;</div><div class='add'>+    union {</div><div class='add'>+        nfstime3 obj_ctime;</div><div class='add'>+    } sattrguard3_u;</div><div class='add'>+};</div><div class='add'>+typedef struct sattrguard3 sattrguard3;</div><div class='add'>+</div><div class='add'>+struct setattr3args {</div><div class='add'>+    nfs_fh3 object;</div><div class='add'>+    sattr3 new_attributes;</div><div class='add'>+    sattrguard3 guard;</div><div class='add'>+};</div><div class='add'>+typedef struct setattr3args setattr3args;</div><div class='add'>+</div><div class='add'>+struct setattr3resok {</div><div class='add'>+    wcc_data obj_wcc;</div><div class='add'>+};</div><div class='add'>+typedef struct setattr3resok setattr3resok;</div><div class='add'>+</div><div class='add'>+struct setattr3resfail {</div><div class='add'>+    wcc_data obj_wcc;</div><div class='add'>+};</div><div class='add'>+typedef struct setattr3resfail setattr3resfail;</div><div class='add'>+</div><div class='add'>+struct setattr3res {</div><div class='add'>+    nfsstat3 status;</div><div class='add'>+    union {</div><div class='add'>+        setattr3resok resok;</div><div class='add'>+        setattr3resfail resfail;</div><div class='add'>+    } setattr3res_u;</div><div class='add'>+};</div><div class='add'>+typedef struct setattr3res setattr3res;</div><div class='add'>+</div><div class='add'>+struct lookup3args {</div><div class='add'>+    diropargs3 what;</div><div class='add'>+};</div><div class='add'>+typedef struct lookup3args lookup3args;</div><div class='add'>+</div><div class='add'>+struct lookup3resok {</div><div class='add'>+    nfs_fh3 object;</div><div class='add'>+    post_op_attr obj_attributes;</div><div class='add'>+    post_op_attr dir_attributes;</div><div class='add'>+};</div><div class='add'>+typedef struct lookup3resok lookup3resok;</div><div class='add'>+</div><div class='add'>+struct lookup3resfail {</div><div class='add'>+    post_op_attr dir_attributes;</div><div class='add'>+};</div><div class='add'>+typedef struct lookup3resfail lookup3resfail;</div><div class='add'>+</div><div class='add'>+struct lookup3res {</div><div class='add'>+    nfsstat3 status;</div><div class='add'>+    union {</div><div class='add'>+        lookup3resok resok;</div><div class='add'>+        lookup3resfail resfail;</div><div class='add'>+    } lookup3res_u;</div><div class='add'>+};</div><div class='add'>+typedef struct lookup3res lookup3res;</div><div class='add'>+#define ACCESS3_READ 0x0001</div><div class='add'>+#define ACCESS3_LOOKUP 0x0002</div><div class='add'>+#define ACCESS3_MODIFY 0x0004</div><div class='add'>+#define ACCESS3_EXTEND 0x0008</div><div class='add'>+#define ACCESS3_DELETE 0x0010</div><div class='add'>+#define ACCESS3_EXECUTE 0x0020</div><div class='add'>+</div><div class='add'>+struct access3args {</div><div class='add'>+    nfs_fh3 object;</div><div class='add'>+    uint32 access;</div><div class='add'>+};</div><div class='add'>+typedef struct access3args access3args;</div><div class='add'>+</div><div class='add'>+struct access3resok {</div><div class='add'>+    post_op_attr obj_attributes;</div><div class='add'>+    uint32 access;</div><div class='add'>+};</div><div class='add'>+typedef struct access3resok access3resok;</div><div class='add'>+</div><div class='add'>+struct access3resfail {</div><div class='add'>+    post_op_attr obj_attributes;</div><div class='add'>+};</div><div class='add'>+typedef struct access3resfail access3resfail;</div><div class='add'>+</div><div class='add'>+struct access3res {</div><div class='add'>+    nfsstat3 status;</div><div class='add'>+    union {</div><div class='add'>+        access3resok resok;</div><div class='add'>+        access3resfail resfail;</div><div class='add'>+    } access3res_u;</div><div class='add'>+};</div><div class='add'>+typedef struct access3res access3res;</div><div class='add'>+</div><div class='add'>+struct readlink3args {</div><div class='add'>+    nfs_fh3 symlink;</div><div class='add'>+};</div><div class='add'>+typedef struct readlink3args readlink3args;</div><div class='add'>+</div><div class='add'>+struct readlink3resok {</div><div class='add'>+    post_op_attr symlink_attributes;</div><div class='add'>+    nfspath3 data;</div><div class='add'>+};</div><div class='add'>+typedef struct readlink3resok readlink3resok;</div><div class='add'>+</div><div class='add'>+struct readlink3resfail {</div><div class='add'>+    post_op_attr symlink_attributes;</div><div class='add'>+};</div><div class='add'>+typedef struct readlink3resfail readlink3resfail;</div><div class='add'>+</div><div class='add'>+struct readlink3res {</div><div class='add'>+    nfsstat3 status;</div><div class='add'>+    union {</div><div class='add'>+        readlink3resok resok;</div><div class='add'>+        readlink3resfail resfail;</div><div class='add'>+    } readlink3res_u;</div><div class='add'>+};</div><div class='add'>+typedef struct readlink3res readlink3res;</div><div class='add'>+</div><div class='add'>+struct read3args {</div><div class='add'>+    nfs_fh3 file;</div><div class='add'>+    offset3 offset;</div><div class='add'>+    count3 count;</div><div class='add'>+};</div><div class='add'>+typedef struct read3args read3args;</div><div class='add'>+</div><div class='add'>+struct read3resok {</div><div class='add'>+    post_op_attr file_attributes;</div><div class='add'>+    count3 count;</div><div class='add'>+    bool_t eof;</div><div class='add'>+    struct {</div><div class='add'>+        u_int data_len;</div><div class='add'>+        char *data_val;</div><div class='add'>+    } data;</div><div class='add'>+};</div><div class='add'>+typedef struct read3resok read3resok;</div><div class='add'>+</div><div class='add'>+struct read3resfail {</div><div class='add'>+    post_op_attr file_attributes;</div><div class='add'>+};</div><div class='add'>+typedef struct read3resfail read3resfail;</div><div class='add'>+</div><div class='add'>+struct read3res {</div><div class='add'>+    nfsstat3 status;</div><div class='add'>+    union {</div><div class='add'>+        read3resok resok;</div><div class='add'>+        read3resfail resfail;</div><div class='add'>+    } read3res_u;</div><div class='add'>+};</div><div class='add'>+typedef struct read3res read3res;</div><div class='add'>+</div><div class='add'>+enum stable_how {</div><div class='add'>+    UNSTABLE = 0,</div><div class='add'>+    DATA_SYNC = 1,</div><div class='add'>+    FILE_SYNC = 2,</div><div class='add'>+};</div><div class='add'>+typedef enum stable_how stable_how;</div><div class='add'>+</div><div class='add'>+struct write3args {</div><div class='add'>+    nfs_fh3 file;</div><div class='add'>+    offset3 offset;</div><div class='add'>+    count3 count;</div><div class='add'>+    stable_how stable;</div><div class='add'>+    struct {</div><div class='add'>+        u_int data_len;</div><div class='add'>+        char *data_val;</div><div class='add'>+    } data;</div><div class='add'>+};</div><div class='add'>+typedef struct write3args write3args;</div><div class='add'>+</div><div class='add'>+/* Generally, the protocol allows the file handle to be less than 64 bytes but</div><div class='add'>+ * our server does not return file handles less than 64b so we can safely say</div><div class='add'>+ * sizeof (nfs_fh3) rather than first trying to extract the fh size of the</div><div class='add'>+ * network followed by a sized-read of the file handle.</div><div class='add'>+ */</div><div class='add'>+#define NFS3_WRITE3ARGS_SIZE                                                   \</div><div class='add'>+    (sizeof(uint32_t) + NFS3_FHSIZE + sizeof(offset3) + sizeof(count3) +       \</div><div class='add'>+     sizeof(uint32_t))</div><div class='add'>+struct write3resok {</div><div class='add'>+    wcc_data file_wcc;</div><div class='add'>+    count3 count;</div><div class='add'>+    stable_how committed;</div><div class='add'>+    writeverf3 verf;</div><div class='add'>+};</div><div class='add'>+typedef struct write3resok write3resok;</div><div class='add'>+</div><div class='add'>+struct write3resfail {</div><div class='add'>+    wcc_data file_wcc;</div><div class='add'>+};</div><div class='add'>+typedef struct write3resfail write3resfail;</div><div class='add'>+</div><div class='add'>+struct write3res {</div><div class='add'>+    nfsstat3 status;</div><div class='add'>+    union {</div><div class='add'>+        write3resok resok;</div><div class='add'>+        write3resfail resfail;</div><div class='add'>+    } write3res_u;</div><div class='add'>+};</div><div class='add'>+typedef struct write3res write3res;</div><div class='add'>+</div><div class='add'>+enum createmode3 {</div><div class='add'>+    UNCHECKED = 0,</div><div class='add'>+    GUARDED = 1,</div><div class='add'>+    EXCLUSIVE = 2,</div><div class='add'>+};</div><div class='add'>+typedef enum createmode3 createmode3;</div><div class='add'>+</div><div class='add'>+struct createhow3 {</div><div class='add'>+    createmode3 mode;</div><div class='add'>+    union {</div><div class='add'>+        sattr3 obj_attributes;</div><div class='add'>+        createverf3 verf;</div><div class='add'>+    } createhow3_u;</div><div class='add'>+};</div><div class='add'>+typedef struct createhow3 createhow3;</div><div class='add'>+</div><div class='add'>+struct create3args {</div><div class='add'>+    diropargs3 where;</div><div class='add'>+    createhow3 how;</div><div class='add'>+};</div><div class='add'>+typedef struct create3args create3args;</div><div class='add'>+</div><div class='add'>+struct create3resok {</div><div class='add'>+    post_op_fh3 obj;</div><div class='add'>+    post_op_attr obj_attributes;</div><div class='add'>+    wcc_data dir_wcc;</div><div class='add'>+};</div><div class='add'>+typedef struct create3resok create3resok;</div><div class='add'>+</div><div class='add'>+struct create3resfail {</div><div class='add'>+    wcc_data dir_wcc;</div><div class='add'>+};</div><div class='add'>+typedef struct create3resfail create3resfail;</div><div class='add'>+</div><div class='add'>+struct create3res {</div><div class='add'>+    nfsstat3 status;</div><div class='add'>+    union {</div><div class='add'>+        create3resok resok;</div><div class='add'>+        create3resfail resfail;</div><div class='add'>+    } create3res_u;</div><div class='add'>+};</div><div class='add'>+typedef struct create3res create3res;</div><div class='add'>+</div><div class='add'>+struct mkdir3args {</div><div class='add'>+    diropargs3 where;</div><div class='add'>+    sattr3 attributes;</div><div class='add'>+};</div><div class='add'>+typedef struct mkdir3args mkdir3args;</div><div class='add'>+</div><div class='add'>+struct mkdir3resok {</div><div class='add'>+    post_op_fh3 obj;</div><div class='add'>+    post_op_attr obj_attributes;</div><div class='add'>+    wcc_data dir_wcc;</div><div class='add'>+};</div><div class='add'>+typedef struct mkdir3resok mkdir3resok;</div><div class='add'>+</div><div class='add'>+struct mkdir3resfail {</div><div class='add'>+    wcc_data dir_wcc;</div><div class='add'>+};</div><div class='add'>+typedef struct mkdir3resfail mkdir3resfail;</div><div class='add'>+</div><div class='add'>+struct mkdir3res {</div><div class='add'>+    nfsstat3 status;</div><div class='add'>+    union {</div><div class='add'>+        mkdir3resok resok;</div><div class='add'>+        mkdir3resfail resfail;</div><div class='add'>+    } mkdir3res_u;</div><div class='add'>+};</div><div class='add'>+typedef struct mkdir3res mkdir3res;</div><div class='add'>+</div><div class='add'>+struct symlinkdata3 {</div><div class='add'>+    sattr3 symlink_attributes;</div><div class='add'>+    nfspath3 symlink_data;</div><div class='add'>+};</div><div class='add'>+typedef struct symlinkdata3 symlinkdata3;</div><div class='add'>+</div><div class='add'>+struct symlink3args {</div><div class='add'>+    diropargs3 where;</div><div class='add'>+    symlinkdata3 symlink;</div><div class='add'>+};</div><div class='add'>+typedef struct symlink3args symlink3args;</div><div class='add'>+</div><div class='add'>+struct symlink3resok {</div><div class='add'>+    post_op_fh3 obj;</div><div class='add'>+    post_op_attr obj_attributes;</div><div class='add'>+    wcc_data dir_wcc;</div><div class='add'>+};</div><div class='add'>+typedef struct symlink3resok symlink3resok;</div><div class='add'>+</div><div class='add'>+struct symlink3resfail {</div><div class='add'>+    wcc_data dir_wcc;</div><div class='add'>+};</div><div class='add'>+typedef struct symlink3resfail symlink3resfail;</div><div class='add'>+</div><div class='add'>+struct symlink3res {</div><div class='add'>+    nfsstat3 status;</div><div class='add'>+    union {</div><div class='add'>+        symlink3resok resok;</div><div class='add'>+        symlink3resfail resfail;</div><div class='add'>+    } symlink3res_u;</div><div class='add'>+};</div><div class='add'>+typedef struct symlink3res symlink3res;</div><div class='add'>+</div><div class='add'>+struct devicedata3 {</div><div class='add'>+    sattr3 dev_attributes;</div><div class='add'>+    specdata3 spec;</div><div class='add'>+};</div><div class='add'>+typedef struct devicedata3 devicedata3;</div><div class='add'>+</div><div class='add'>+struct mknoddata3 {</div><div class='add'>+    ftype3 type;</div><div class='add'>+    union {</div><div class='add'>+        devicedata3 device;</div><div class='add'>+        sattr3 pipe_attributes;</div><div class='add'>+    } mknoddata3_u;</div><div class='add'>+};</div><div class='add'>+typedef struct mknoddata3 mknoddata3;</div><div class='add'>+</div><div class='add'>+struct mknod3args {</div><div class='add'>+    diropargs3 where;</div><div class='add'>+    mknoddata3 what;</div><div class='add'>+};</div><div class='add'>+typedef struct mknod3args mknod3args;</div><div class='add'>+</div><div class='add'>+struct mknod3resok {</div><div class='add'>+    post_op_fh3 obj;</div><div class='add'>+    post_op_attr obj_attributes;</div><div class='add'>+    wcc_data dir_wcc;</div><div class='add'>+};</div><div class='add'>+typedef struct mknod3resok mknod3resok;</div><div class='add'>+</div><div class='add'>+struct mknod3resfail {</div><div class='add'>+    wcc_data dir_wcc;</div><div class='add'>+};</div><div class='add'>+typedef struct mknod3resfail mknod3resfail;</div><div class='add'>+</div><div class='add'>+struct mknod3res {</div><div class='add'>+    nfsstat3 status;</div><div class='add'>+    union {</div><div class='add'>+        mknod3resok resok;</div><div class='add'>+        mknod3resfail resfail;</div><div class='add'>+    } mknod3res_u;</div><div class='add'>+};</div><div class='add'>+typedef struct mknod3res mknod3res;</div><div class='add'>+</div><div class='add'>+struct remove3args {</div><div class='add'>+    diropargs3 object;</div><div class='add'>+};</div><div class='add'>+typedef struct remove3args remove3args;</div><div class='add'>+</div><div class='add'>+struct remove3resok {</div><div class='add'>+    wcc_data dir_wcc;</div><div class='add'>+};</div><div class='add'>+typedef struct remove3resok remove3resok;</div><div class='add'>+</div><div class='add'>+struct remove3resfail {</div><div class='add'>+    wcc_data dir_wcc;</div><div class='add'>+};</div><div class='add'>+typedef struct remove3resfail remove3resfail;</div><div class='add'>+</div><div class='add'>+struct remove3res {</div><div class='add'>+    nfsstat3 status;</div><div class='add'>+    union {</div><div class='add'>+        remove3resok resok;</div><div class='add'>+        remove3resfail resfail;</div><div class='add'>+    } remove3res_u;</div><div class='add'>+};</div><div class='add'>+typedef struct remove3res remove3res;</div><div class='add'>+</div><div class='add'>+struct rmdir3args {</div><div class='add'>+    diropargs3 object;</div><div class='add'>+};</div><div class='add'>+typedef struct rmdir3args rmdir3args;</div><div class='add'>+</div><div class='add'>+struct rmdir3resok {</div><div class='add'>+    wcc_data dir_wcc;</div><div class='add'>+};</div><div class='add'>+typedef struct rmdir3resok rmdir3resok;</div><div class='add'>+</div><div class='add'>+struct rmdir3resfail {</div><div class='add'>+    wcc_data dir_wcc;</div><div class='add'>+};</div><div class='add'>+typedef struct rmdir3resfail rmdir3resfail;</div><div class='add'>+</div><div class='add'>+struct rmdir3res {</div><div class='add'>+    nfsstat3 status;</div><div class='add'>+    union {</div><div class='add'>+        rmdir3resok resok;</div><div class='add'>+        rmdir3resfail resfail;</div><div class='add'>+    } rmdir3res_u;</div><div class='add'>+};</div><div class='add'>+typedef struct rmdir3res rmdir3res;</div><div class='add'>+</div><div class='add'>+struct rename3args {</div><div class='add'>+    diropargs3 from;</div><div class='add'>+    diropargs3 to;</div><div class='add'>+};</div><div class='add'>+typedef struct rename3args rename3args;</div><div class='add'>+</div><div class='add'>+struct rename3resok {</div><div class='add'>+    wcc_data fromdir_wcc;</div><div class='add'>+    wcc_data todir_wcc;</div><div class='add'>+};</div><div class='add'>+typedef struct rename3resok rename3resok;</div><div class='add'>+</div><div class='add'>+struct rename3resfail {</div><div class='add'>+    wcc_data fromdir_wcc;</div><div class='add'>+    wcc_data todir_wcc;</div><div class='add'>+};</div><div class='add'>+typedef struct rename3resfail rename3resfail;</div><div class='add'>+</div><div class='add'>+struct rename3res {</div><div class='add'>+    nfsstat3 status;</div><div class='add'>+    union {</div><div class='add'>+        rename3resok resok;</div><div class='add'>+        rename3resfail resfail;</div><div class='add'>+    } rename3res_u;</div><div class='add'>+};</div><div class='add'>+typedef struct rename3res rename3res;</div><div class='add'>+</div><div class='add'>+struct link3args {</div><div class='add'>+    nfs_fh3 file;</div><div class='add'>+    diropargs3 link;</div><div class='add'>+};</div><div class='add'>+typedef struct link3args link3args;</div><div class='add'>+</div><div class='add'>+struct link3resok {</div><div class='add'>+    post_op_attr file_attributes;</div><div class='add'>+    wcc_data linkdir_wcc;</div><div class='add'>+};</div><div class='add'>+typedef struct link3resok link3resok;</div><div class='add'>+</div><div class='add'>+struct link3resfail {</div><div class='add'>+    post_op_attr file_attributes;</div><div class='add'>+    wcc_data linkdir_wcc;</div><div class='add'>+};</div><div class='add'>+typedef struct link3resfail link3resfail;</div><div class='add'>+</div><div class='add'>+struct link3res {</div><div class='add'>+    nfsstat3 status;</div><div class='add'>+    union {</div><div class='add'>+        link3resok resok;</div><div class='add'>+        link3resfail resfail;</div><div class='add'>+    } link3res_u;</div><div class='add'>+};</div><div class='add'>+typedef struct link3res link3res;</div><div class='add'>+</div><div class='add'>+struct readdir3args {</div><div class='add'>+    nfs_fh3 dir;</div><div class='add'>+    cookie3 cookie;</div><div class='add'>+    cookieverf3 cookieverf;</div><div class='add'>+    count3 count;</div><div class='add'>+};</div><div class='add'>+typedef struct readdir3args readdir3args;</div><div class='add'>+</div><div class='add'>+struct entry3 {</div><div class='add'>+    fileid3 fileid;</div><div class='add'>+    filename3 name;</div><div class='add'>+    cookie3 cookie;</div><div class='add'>+    struct entry3 *nextentry;</div><div class='add'>+};</div><div class='add'>+typedef struct entry3 entry3;</div><div class='add'>+</div><div class='add'>+struct dirlist3 {</div><div class='add'>+    entry3 *entries;</div><div class='add'>+    bool_t eof;</div><div class='add'>+};</div><div class='add'>+typedef struct dirlist3 dirlist3;</div><div class='add'>+</div><div class='add'>+struct readdir3resok {</div><div class='add'>+    post_op_attr dir_attributes;</div><div class='add'>+    cookieverf3 cookieverf;</div><div class='add'>+    dirlist3 reply;</div><div class='add'>+};</div><div class='add'>+typedef struct readdir3resok readdir3resok;</div><div class='add'>+</div><div class='add'>+struct readdir3resfail {</div><div class='add'>+    post_op_attr dir_attributes;</div><div class='add'>+};</div><div class='add'>+typedef struct readdir3resfail readdir3resfail;</div><div class='add'>+</div><div class='add'>+struct readdir3res {</div><div class='add'>+    nfsstat3 status;</div><div class='add'>+    union {</div><div class='add'>+        readdir3resok resok;</div><div class='add'>+        readdir3resfail resfail;</div><div class='add'>+    } readdir3res_u;</div><div class='add'>+};</div><div class='add'>+typedef struct readdir3res readdir3res;</div><div class='add'>+</div><div class='add'>+struct readdirp3args {</div><div class='add'>+    nfs_fh3 dir;</div><div class='add'>+    cookie3 cookie;</div><div class='add'>+    cookieverf3 cookieverf;</div><div class='add'>+    count3 dircount;</div><div class='add'>+    count3 maxcount;</div><div class='add'>+};</div><div class='add'>+typedef struct readdirp3args readdirp3args;</div><div class='add'>+</div><div class='add'>+struct entryp3 {</div><div class='add'>+    fileid3 fileid;</div><div class='add'>+    filename3 name;</div><div class='add'>+    cookie3 cookie;</div><div class='add'>+    post_op_attr name_attributes;</div><div class='add'>+    post_op_fh3 name_handle;</div><div class='add'>+    struct entryp3 *nextentry;</div><div class='add'>+};</div><div class='add'>+typedef struct entryp3 entryp3;</div><div class='add'>+</div><div class='add'>+struct dirlistp3 {</div><div class='add'>+    entryp3 *entries;</div><div class='add'>+    bool_t eof;</div><div class='add'>+};</div><div class='add'>+typedef struct dirlistp3 dirlistp3;</div><div class='add'>+</div><div class='add'>+struct readdirp3resok {</div><div class='add'>+    post_op_attr dir_attributes;</div><div class='add'>+    cookieverf3 cookieverf;</div><div class='add'>+    dirlistp3 reply;</div><div class='add'>+};</div><div class='add'>+typedef struct readdirp3resok readdirp3resok;</div><div class='add'>+</div><div class='add'>+struct readdirp3resfail {</div><div class='add'>+    post_op_attr dir_attributes;</div><div class='add'>+};</div><div class='add'>+typedef struct readdirp3resfail readdirp3resfail;</div><div class='add'>+</div><div class='add'>+struct readdirp3res {</div><div class='add'>+    nfsstat3 status;</div><div class='add'>+    union {</div><div class='add'>+        readdirp3resok resok;</div><div class='add'>+        readdirp3resfail resfail;</div><div class='add'>+    } readdirp3res_u;</div><div class='add'>+};</div><div class='add'>+typedef struct readdirp3res readdirp3res;</div><div class='add'>+</div><div class='add'>+struct fsstat3args {</div><div class='add'>+    nfs_fh3 fsroot;</div><div class='add'>+};</div><div class='add'>+typedef struct fsstat3args fsstat3args;</div><div class='add'>+</div><div class='add'>+struct fsstat3resok {</div><div class='add'>+    post_op_attr obj_attributes;</div><div class='add'>+    size3 tbytes;</div><div class='add'>+    size3 fbytes;</div><div class='add'>+    size3 abytes;</div><div class='add'>+    size3 tfiles;</div><div class='add'>+    size3 ffiles;</div><div class='add'>+    size3 afiles;</div><div class='add'>+    uint32 invarsec;</div><div class='add'>+};</div><div class='add'>+typedef struct fsstat3resok fsstat3resok;</div><div class='add'>+</div><div class='add'>+struct fsstat3resfail {</div><div class='add'>+    post_op_attr obj_attributes;</div><div class='add'>+};</div><div class='add'>+typedef struct fsstat3resfail fsstat3resfail;</div><div class='add'>+</div><div class='add'>+struct fsstat3res {</div><div class='add'>+    nfsstat3 status;</div><div class='add'>+    union {</div><div class='add'>+        fsstat3resok resok;</div><div class='add'>+        fsstat3resfail resfail;</div><div class='add'>+    } fsstat3res_u;</div><div class='add'>+};</div><div class='add'>+typedef struct fsstat3res fsstat3res;</div><div class='add'>+#define FSF3_LINK 0x0001</div><div class='add'>+#define FSF3_SYMLINK 0x0002</div><div class='add'>+#define FSF3_HOMOGENEOUS 0x0008</div><div class='add'>+#define FSF3_CANSETTIME 0x0010</div><div class='add'>+</div><div class='add'>+struct fsinfo3args {</div><div class='add'>+    nfs_fh3 fsroot;</div><div class='add'>+};</div><div class='add'>+typedef struct fsinfo3args fsinfo3args;</div><div class='add'>+</div><div class='add'>+struct fsinfo3resok {</div><div class='add'>+    post_op_attr obj_attributes;</div><div class='add'>+    uint32 rtmax;</div><div class='add'>+    uint32 rtpref;</div><div class='add'>+    uint32 rtmult;</div><div class='add'>+    uint32 wtmax;</div><div class='add'>+    uint32 wtpref;</div><div class='add'>+    uint32 wtmult;</div><div class='add'>+    uint32 dtpref;</div><div class='add'>+    size3 maxfilesize;</div><div class='add'>+    nfstime3 time_delta;</div><div class='add'>+    uint32 properties;</div><div class='add'>+};</div><div class='add'>+typedef struct fsinfo3resok fsinfo3resok;</div><div class='add'>+</div><div class='add'>+struct fsinfo3resfail {</div><div class='add'>+    post_op_attr obj_attributes;</div><div class='add'>+};</div><div class='add'>+typedef struct fsinfo3resfail fsinfo3resfail;</div><div class='add'>+</div><div class='add'>+struct fsinfo3res {</div><div class='add'>+    nfsstat3 status;</div><div class='add'>+    union {</div><div class='add'>+        fsinfo3resok resok;</div><div class='add'>+        fsinfo3resfail resfail;</div><div class='add'>+    } fsinfo3res_u;</div><div class='add'>+};</div><div class='add'>+typedef struct fsinfo3res fsinfo3res;</div><div class='add'>+</div><div class='add'>+struct pathconf3args {</div><div class='add'>+    nfs_fh3 object;</div><div class='add'>+};</div><div class='add'>+typedef struct pathconf3args pathconf3args;</div><div class='add'>+</div><div class='add'>+struct pathconf3resok {</div><div class='add'>+    post_op_attr obj_attributes;</div><div class='add'>+    uint32 linkmax;</div><div class='add'>+    uint32 name_max;</div><div class='add'>+    bool_t no_trunc;</div><div class='add'>+    bool_t chown_restricted;</div><div class='add'>+    bool_t case_insensitive;</div><div class='add'>+    bool_t case_preserving;</div><div class='add'>+};</div><div class='add'>+typedef struct pathconf3resok pathconf3resok;</div><div class='add'>+</div><div class='add'>+struct pathconf3resfail {</div><div class='add'>+    post_op_attr obj_attributes;</div><div class='add'>+};</div><div class='add'>+typedef struct pathconf3resfail pathconf3resfail;</div><div class='add'>+</div><div class='add'>+struct pathconf3res {</div><div class='add'>+    nfsstat3 status;</div><div class='add'>+    union {</div><div class='add'>+        pathconf3resok resok;</div><div class='add'>+        pathconf3resfail resfail;</div><div class='add'>+    } pathconf3res_u;</div><div class='add'>+};</div><div class='add'>+typedef struct pathconf3res pathconf3res;</div><div class='add'>+</div><div class='add'>+struct commit3args {</div><div class='add'>+    nfs_fh3 file;</div><div class='add'>+    offset3 offset;</div><div class='add'>+    count3 count;</div><div class='add'>+};</div><div class='add'>+typedef struct commit3args commit3args;</div><div class='add'>+</div><div class='add'>+struct commit3resok {</div><div class='add'>+    wcc_data file_wcc;</div><div class='add'>+    writeverf3 verf;</div><div class='add'>+};</div><div class='add'>+typedef struct commit3resok commit3resok;</div><div class='add'>+</div><div class='add'>+struct commit3resfail {</div><div class='add'>+    wcc_data file_wcc;</div><div class='add'>+};</div><div class='add'>+typedef struct commit3resfail commit3resfail;</div><div class='add'>+</div><div class='add'>+struct commit3res {</div><div class='add'>+    nfsstat3 status;</div><div class='add'>+    union {</div><div class='add'>+        commit3resok resok;</div><div class='add'>+        commit3resfail resfail;</div><div class='add'>+    } commit3res_u;</div><div class='add'>+};</div><div class='add'>+typedef struct commit3res commit3res;</div><div class='add'>+#define MNTPATHLEN 1024</div><div class='add'>+#define MNTNAMLEN 255</div><div class='add'>+#define FHSIZE3 NFS3_FHSIZE</div><div class='add'>+</div><div class='add'>+typedef struct {</div><div class='add'>+    u_int fhandle3_len;</div><div class='add'>+    char *fhandle3_val;</div><div class='add'>+} fhandle3;</div><div class='add'>+</div><div class='add'>+typedef char *dirpath;</div><div class='add'>+</div><div class='add'>+typedef char *name;</div><div class='add'>+</div><div class='add'>+enum mountstat3 {</div><div class='add'>+    MNT3_OK = 0,</div><div class='add'>+    MNT3ERR_PERM = 1,</div><div class='add'>+    MNT3ERR_NOENT = 2,</div><div class='add'>+    MNT3ERR_IO = 5,</div><div class='add'>+    MNT3ERR_ACCES = 13,</div><div class='add'>+    MNT3ERR_NOTDIR = 20,</div><div class='add'>+    MNT3ERR_INVAL = 22,</div><div class='add'>+    MNT3ERR_NAMETOOLONG = 63,</div><div class='add'>+    MNT3ERR_NOTSUPP = 10004,</div><div class='add'>+    MNT3ERR_SERVERFAULT = 10006,</div><div class='add'>+};</div><div class='add'>+typedef enum mountstat3 mountstat3;</div><div class='add'>+</div><div class='add'>+struct mountres3_ok {</div><div class='add'>+    fhandle3 fhandle;</div><div class='add'>+    struct {</div><div class='add'>+        u_int auth_flavors_len;</div><div class='add'>+        int *auth_flavors_val;</div><div class='add'>+    } auth_flavors;</div><div class='add'>+};</div><div class='add'>+typedef struct mountres3_ok mountres3_ok;</div><div class='add'>+</div><div class='add'>+struct mountres3 {</div><div class='add'>+    mountstat3 fhs_status;</div><div class='add'>+    union {</div><div class='add'>+        mountres3_ok mountinfo;</div><div class='add'>+    } mountres3_u;</div><div class='add'>+};</div><div class='add'>+typedef struct mountres3 mountres3;</div><div class='add'>+</div><div class='add'>+typedef struct mountbody *mountlist;</div><div class='add'>+</div><div class='add'>+struct mountbody {</div><div class='add'>+    name ml_hostname;</div><div class='add'>+    dirpath ml_directory;</div><div class='add'>+    mountlist ml_next;</div><div class='add'>+};</div><div class='add'>+typedef struct mountbody mountbody;</div><div class='add'>+</div><div class='add'>+typedef struct groupnode *groups;</div><div class='add'>+</div><div class='add'>+struct groupnode {</div><div class='add'>+    name gr_name;</div><div class='add'>+    groups gr_next;</div><div class='add'>+};</div><div class='add'>+typedef struct groupnode groupnode;</div><div class='add'>+</div><div class='add'>+typedef struct exportnode *exports;</div><div class='add'>+</div><div class='add'>+struct exportnode {</div><div class='add'>+    dirpath ex_dir;</div><div class='add'>+    groups ex_groups;</div><div class='add'>+    exports ex_next;</div><div class='add'>+};</div><div class='add'>+typedef struct exportnode exportnode;</div><div class='add'>+</div><div class='add'>+#define NFS_PROGRAM 100003</div><div class='add'>+#define NFS_V3 3</div><div class='add'>+</div><div class='add'>+#define NFS3_NULL 0</div><div class='add'>+#define NFS3_GETATTR 1</div><div class='add'>+#define NFS3_SETATTR 2</div><div class='add'>+#define NFS3_LOOKUP 3</div><div class='add'>+#define NFS3_ACCESS 4</div><div class='add'>+#define NFS3_READLINK 5</div><div class='add'>+#define NFS3_READ 6</div><div class='add'>+#define NFS3_WRITE 7</div><div class='add'>+#define NFS3_CREATE 8</div><div class='add'>+#define NFS3_MKDIR 9</div><div class='add'>+#define NFS3_SYMLINK 10</div><div class='add'>+#define NFS3_MKNOD 11</div><div class='add'>+#define NFS3_REMOVE 12</div><div class='add'>+#define NFS3_RMDIR 13</div><div class='add'>+#define NFS3_RENAME 14</div><div class='add'>+#define NFS3_LINK 15</div><div class='add'>+#define NFS3_READDIR 16</div><div class='add'>+#define NFS3_READDIRP 17</div><div class='add'>+#define NFS3_FSSTAT 18</div><div class='add'>+#define NFS3_FSINFO 19</div><div class='add'>+#define NFS3_PATHCONF 20</div><div class='add'>+#define NFS3_COMMIT 21</div><div class='add'>+#define NFS3_PROC_COUNT 22</div><div class='add'>+</div><div class='add'>+#define MOUNT_PROGRAM 100005</div><div class='add'>+#define MOUNT_V3 3</div><div class='add'>+#define MOUNT_V1 1</div><div class='add'>+</div><div class='add'>+#define MOUNT3_NULL 0</div><div class='add'>+#define MOUNT3_MNT 1</div><div class='add'>+#define MOUNT3_DUMP 2</div><div class='add'>+#define MOUNT3_UMNT 3</div><div class='add'>+#define MOUNT3_UMNTALL 4</div><div class='add'>+#define MOUNT3_EXPORT 5</div><div class='add'>+#define MOUNT3_PROC_COUNT 6</div><div class='add'>+</div><div class='add'>+#define MOUNT1_NULL 0</div><div class='add'>+#define MOUNT1_MNT 1</div><div class='add'>+#define MOUNT1_DUMP 2</div><div class='add'>+#define MOUNT1_UMNT 3</div><div class='add'>+#define MOUNT1_UMNTALL 4</div><div class='add'>+#define MOUNT1_EXPORT 5</div><div class='add'>+#define MOUNT1_PROC_COUNT 6</div><div class='add'>+/* the xdr functions */</div><div class='add'>+</div><div class='add'>+extern bool_t</div><div class='add'>+xdr_uint64(XDR *, uint64 *);</div><div class='add'>+extern bool_t</div><div class='add'>+xdr_int64(XDR *, int64 *);</div><div class='add'>+extern bool_t</div><div class='add'>+xdr_uint32(XDR *, uint32 *);</div><div class='add'>+extern bool_t</div><div class='add'>+xdr_int32(XDR *, int32 *);</div><div class='add'>+extern bool_t</div><div class='add'>+xdr_filename3(XDR *, filename3 *);</div><div class='add'>+extern bool_t</div><div class='add'>+xdr_nfspath3(XDR *, nfspath3 *);</div><div class='add'>+extern bool_t</div><div class='add'>+xdr_fileid3(XDR *, fileid3 *);</div><div class='add'>+extern bool_t</div><div class='add'>+xdr_cookie3(XDR *, cookie3 *);</div><div class='add'>+extern bool_t</div><div class='add'>+xdr_cookieverf3(XDR *, cookieverf3);</div><div class='add'>+extern bool_t</div><div class='add'>+xdr_createverf3(XDR *, createverf3);</div><div class='add'>+extern bool_t</div><div class='add'>+xdr_writeverf3(XDR *, writeverf3);</div><div class='add'>+extern bool_t</div><div class='add'>+xdr_uid3(XDR *, uid3 *);</div><div class='add'>+extern bool_t</div><div class='add'>+xdr_gid3(XDR *, gid3 *);</div><div class='add'>+extern bool_t</div><div class='add'>+xdr_size3(XDR *, size3 *);</div><div class='add'>+extern bool_t</div><div class='add'>+xdr_offset3(XDR *, offset3 *);</div><div class='add'>+extern bool_t</div><div class='add'>+xdr_mode3(XDR *, mode3 *);</div><div class='add'>+extern bool_t</div><div class='add'>+xdr_count3(XDR *, count3 *);</div><div class='add'>+extern bool_t</div><div class='add'>+xdr_nfsstat3(XDR *, nfsstat3 *);</div><div class='add'>+extern bool_t</div><div class='add'>+xdr_ftype3(XDR *, ftype3 *);</div><div class='add'>+extern bool_t</div><div class='add'>+xdr_specdata3(XDR *, specdata3 *);</div><div class='add'>+extern bool_t</div><div class='add'>+xdr_nfs_fh3(XDR *, nfs_fh3 *);</div><div class='add'>+extern bool_t</div><div class='add'>+xdr_nfstime3(XDR *, nfstime3 *);</div><div class='add'>+extern bool_t</div><div class='add'>+xdr_fattr3(XDR *, fattr3 *);</div><div class='add'>+extern bool_t</div><div class='add'>+xdr_post_op_attr(XDR *, post_op_attr *);</div><div class='add'>+extern bool_t</div><div class='add'>+xdr_wcc_attr(XDR *, wcc_attr *);</div><div class='add'>+extern bool_t</div><div class='add'>+xdr_pre_op_attr(XDR *, pre_op_attr *);</div><div class='add'>+extern bool_t</div><div class='add'>+xdr_wcc_data(XDR *, wcc_data *);</div><div class='add'>+extern bool_t</div><div class='add'>+xdr_post_op_fh3(XDR *, post_op_fh3 *);</div><div class='add'>+extern bool_t</div><div class='add'>+xdr_time_how(XDR *, time_how *);</div><div class='add'>+extern bool_t</div><div class='add'>+xdr_set_mode3(XDR *, set_mode3 *);</div><div class='add'>+extern bool_t</div><div class='add'>+xdr_set_uid3(XDR *, set_uid3 *);</div><div class='add'>+extern bool_t</div><div class='add'>+xdr_set_gid3(XDR *, set_gid3 *);</div><div class='add'>+extern bool_t</div><div class='add'>+xdr_set_size3(XDR *, set_size3 *);</div><div class='add'>+extern bool_t</div><div class='add'>+xdr_set_atime(XDR *, set_atime *);</div><div class='add'>+extern bool_t</div><div class='add'>+xdr_set_mtime(XDR *, set_mtime *);</div><div class='add'>+extern bool_t</div><div class='add'>+xdr_sattr3(XDR *, sattr3 *);</div><div class='add'>+extern bool_t</div><div class='add'>+xdr_diropargs3(XDR *, diropargs3 *);</div><div class='add'>+extern bool_t</div><div class='add'>+xdr_getattr3args(XDR *, getattr3args *);</div><div class='add'>+extern bool_t</div><div class='add'>+xdr_getattr3resok(XDR *, getattr3resok *);</div><div class='add'>+extern bool_t</div><div class='add'>+xdr_getattr3res(XDR *, getattr3res *);</div><div class='add'>+extern bool_t</div><div class='add'>+xdr_sattrguard3(XDR *, sattrguard3 *);</div><div class='add'>+extern bool_t</div><div class='add'>+xdr_setattr3args(XDR *, setattr3args *);</div><div class='add'>+extern bool_t</div><div class='add'>+xdr_setattr3resok(XDR *, setattr3resok *);</div><div class='add'>+extern bool_t</div><div class='add'>+xdr_setattr3resfail(XDR *, setattr3resfail *);</div><div class='add'>+extern bool_t</div><div class='add'>+xdr_setattr3res(XDR *, setattr3res *);</div><div class='add'>+extern bool_t</div><div class='add'>+xdr_lookup3args(XDR *, lookup3args *);</div><div class='add'>+extern bool_t</div><div class='add'>+xdr_lookup3resok(XDR *, lookup3resok *);</div><div class='add'>+extern bool_t</div><div class='add'>+xdr_lookup3resfail(XDR *, lookup3resfail *);</div><div class='add'>+extern bool_t</div><div class='add'>+xdr_lookup3res(XDR *, lookup3res *);</div><div class='add'>+extern bool_t</div><div class='add'>+xdr_access3args(XDR *, access3args *);</div><div class='add'>+extern bool_t</div><div class='add'>+xdr_access3resok(XDR *, access3resok *);</div><div class='add'>+extern bool_t</div><div class='add'>+xdr_access3resfail(XDR *, access3resfail *);</div><div class='add'>+extern bool_t</div><div class='add'>+xdr_access3res(XDR *, access3res *);</div><div class='add'>+extern bool_t</div><div class='add'>+xdr_readlink3args(XDR *, readlink3args *);</div><div class='add'>+extern bool_t</div><div class='add'>+xdr_readlink3resok(XDR *, readlink3resok *);</div><div class='add'>+extern bool_t</div><div class='add'>+xdr_readlink3resfail(XDR *, readlink3resfail *);</div><div class='add'>+extern bool_t</div><div class='add'>+xdr_readlink3res(XDR *, readlink3res *);</div><div class='add'>+extern bool_t</div><div class='add'>+xdr_read3args(XDR *, read3args *);</div><div class='add'>+extern bool_t</div><div class='add'>+xdr_read3resok(XDR *, read3resok *);</div><div class='add'>+extern bool_t</div><div class='add'>+xdr_read3resfail(XDR *, read3resfail *);</div><div class='add'>+extern bool_t</div><div class='add'>+xdr_read3res(XDR *, read3res *);</div><div class='add'>+extern bool_t</div><div class='add'>+xdr_read3res_nocopy(XDR *xdrs, read3res *objp);</div><div class='add'>+extern bool_t</div><div class='add'>+xdr_stable_how(XDR *, stable_how *);</div><div class='add'>+extern bool_t</div><div class='add'>+xdr_write3args(XDR *, write3args *);</div><div class='add'>+extern bool_t</div><div class='add'>+xdr_write3resok(XDR *, write3resok *);</div><div class='add'>+extern bool_t</div><div class='add'>+xdr_write3resfail(XDR *, write3resfail *);</div><div class='add'>+extern bool_t</div><div class='add'>+xdr_write3res(XDR *, write3res *);</div><div class='add'>+extern bool_t</div><div class='add'>+xdr_createmode3(XDR *, createmode3 *);</div><div class='add'>+extern bool_t</div><div class='add'>+xdr_createhow3(XDR *, createhow3 *);</div><div class='add'>+extern bool_t</div><div class='add'>+xdr_create3args(XDR *, create3args *);</div><div class='add'>+extern bool_t</div><div class='add'>+xdr_create3resok(XDR *, create3resok *);</div><div class='add'>+extern bool_t</div><div class='add'>+xdr_create3resfail(XDR *, create3resfail *);</div><div class='add'>+extern bool_t</div><div class='add'>+xdr_create3res(XDR *, create3res *);</div><div class='add'>+extern bool_t</div><div class='add'>+xdr_mkdir3args(XDR *, mkdir3args *);</div><div class='add'>+extern bool_t</div><div class='add'>+xdr_mkdir3resok(XDR *, mkdir3resok *);</div><div class='add'>+extern bool_t</div><div class='add'>+xdr_mkdir3resfail(XDR *, mkdir3resfail *);</div><div class='add'>+extern bool_t</div><div class='add'>+xdr_mkdir3res(XDR *, mkdir3res *);</div><div class='add'>+extern bool_t</div><div class='add'>+xdr_symlinkdata3(XDR *, symlinkdata3 *);</div><div class='add'>+extern bool_t</div><div class='add'>+xdr_symlink3args(XDR *, symlink3args *);</div><div class='add'>+extern bool_t</div><div class='add'>+xdr_symlink3resok(XDR *, symlink3resok *);</div><div class='add'>+extern bool_t</div><div class='add'>+xdr_symlink3resfail(XDR *, symlink3resfail *);</div><div class='add'>+extern bool_t</div><div class='add'>+xdr_symlink3res(XDR *, symlink3res *);</div><div class='add'>+extern bool_t</div><div class='add'>+xdr_devicedata3(XDR *, devicedata3 *);</div><div class='add'>+extern bool_t</div><div class='add'>+xdr_mknoddata3(XDR *, mknoddata3 *);</div><div class='add'>+extern bool_t</div><div class='add'>+xdr_mknod3args(XDR *, mknod3args *);</div><div class='add'>+extern bool_t</div><div class='add'>+xdr_mknod3resok(XDR *, mknod3resok *);</div><div class='add'>+extern bool_t</div><div class='add'>+xdr_mknod3resfail(XDR *, mknod3resfail *);</div><div class='add'>+extern bool_t</div><div class='add'>+xdr_mknod3res(XDR *, mknod3res *);</div><div class='add'>+extern bool_t</div><div class='add'>+xdr_remove3args(XDR *, remove3args *);</div><div class='add'>+extern bool_t</div><div class='add'>+xdr_remove3resok(XDR *, remove3resok *);</div><div class='add'>+extern bool_t</div><div class='add'>+xdr_remove3resfail(XDR *, remove3resfail *);</div><div class='add'>+extern bool_t</div><div class='add'>+xdr_remove3res(XDR *, remove3res *);</div><div class='add'>+extern bool_t</div><div class='add'>+xdr_rmdir3args(XDR *, rmdir3args *);</div><div class='add'>+extern bool_t</div><div class='add'>+xdr_rmdir3resok(XDR *, rmdir3resok *);</div><div class='add'>+extern bool_t</div><div class='add'>+xdr_rmdir3resfail(XDR *, rmdir3resfail *);</div><div class='add'>+extern bool_t</div><div class='add'>+xdr_rmdir3res(XDR *, rmdir3res *);</div><div class='add'>+extern bool_t</div><div class='add'>+xdr_rename3args(XDR *, rename3args *);</div><div class='add'>+extern bool_t</div><div class='add'>+xdr_rename3resok(XDR *, rename3resok *);</div><div class='add'>+extern bool_t</div><div class='add'>+xdr_rename3resfail(XDR *, rename3resfail *);</div><div class='add'>+extern bool_t</div><div class='add'>+xdr_rename3res(XDR *, rename3res *);</div><div class='add'>+extern bool_t</div><div class='add'>+xdr_link3args(XDR *, link3args *);</div><div class='add'>+extern bool_t</div><div class='add'>+xdr_link3resok(XDR *, link3resok *);</div><div class='add'>+extern bool_t</div><div class='add'>+xdr_link3resfail(XDR *, link3resfail *);</div><div class='add'>+extern bool_t</div><div class='add'>+xdr_link3res(XDR *, link3res *);</div><div class='add'>+extern bool_t</div><div class='add'>+xdr_readdir3args(XDR *, readdir3args *);</div><div class='add'>+extern bool_t</div><div class='add'>+xdr_entry3(XDR *, entry3 *);</div><div class='add'>+extern bool_t</div><div class='add'>+xdr_dirlist3(XDR *, dirlist3 *);</div><div class='add'>+extern bool_t</div><div class='add'>+xdr_readdir3resok(XDR *, readdir3resok *);</div><div class='add'>+extern bool_t</div><div class='add'>+xdr_readdir3resfail(XDR *, readdir3resfail *);</div><div class='add'>+extern bool_t</div><div class='add'>+xdr_readdir3res(XDR *, readdir3res *);</div><div class='add'>+extern bool_t</div><div class='add'>+xdr_readdirp3args(XDR *, readdirp3args *);</div><div class='add'>+extern bool_t</div><div class='add'>+xdr_entryp3(XDR *, entryp3 *);</div><div class='add'>+extern bool_t</div><div class='add'>+xdr_dirlistp3(XDR *, dirlistp3 *);</div><div class='add'>+extern bool_t</div><div class='add'>+xdr_readdirp3resok(XDR *, readdirp3resok *);</div><div class='add'>+extern bool_t</div><div class='add'>+xdr_readdirp3resfail(XDR *, readdirp3resfail *);</div><div class='add'>+extern bool_t</div><div class='add'>+xdr_readdirp3res(XDR *, readdirp3res *);</div><div class='add'>+extern bool_t</div><div class='add'>+xdr_fsstat3args(XDR *, fsstat3args *);</div><div class='add'>+extern bool_t</div><div class='add'>+xdr_fsstat3resok(XDR *, fsstat3resok *);</div><div class='add'>+extern bool_t</div><div class='add'>+xdr_fsstat3resfail(XDR *, fsstat3resfail *);</div><div class='add'>+extern bool_t</div><div class='add'>+xdr_fsstat3res(XDR *, fsstat3res *);</div><div class='add'>+extern bool_t</div><div class='add'>+xdr_fsinfo3args(XDR *, fsinfo3args *);</div><div class='add'>+extern bool_t</div><div class='add'>+xdr_fsinfo3resok(XDR *, fsinfo3resok *);</div><div class='add'>+extern bool_t</div><div class='add'>+xdr_fsinfo3resfail(XDR *, fsinfo3resfail *);</div><div class='add'>+extern bool_t</div><div class='add'>+xdr_fsinfo3res(XDR *, fsinfo3res *);</div><div class='add'>+extern bool_t</div><div class='add'>+xdr_pathconf3args(XDR *, pathconf3args *);</div><div class='add'>+extern bool_t</div><div class='add'>+xdr_pathconf3resok(XDR *, pathconf3resok *);</div><div class='add'>+extern bool_t</div><div class='add'>+xdr_pathconf3resfail(XDR *, pathconf3resfail *);</div><div class='add'>+extern bool_t</div><div class='add'>+xdr_pathconf3res(XDR *, pathconf3res *);</div><div class='add'>+extern bool_t</div><div class='add'>+xdr_commit3args(XDR *, commit3args *);</div><div class='add'>+extern bool_t</div><div class='add'>+xdr_commit3resok(XDR *, commit3resok *);</div><div class='add'>+extern bool_t</div><div class='add'>+xdr_commit3resfail(XDR *, commit3resfail *);</div><div class='add'>+extern bool_t</div><div class='add'>+xdr_commit3res(XDR *, commit3res *);</div><div class='add'>+extern bool_t</div><div class='add'>+xdr_fhandle3(XDR *, fhandle3 *);</div><div class='add'>+extern bool_t</div><div class='add'>+xdr_dirpath(XDR *, dirpath *);</div><div class='add'>+extern bool_t</div><div class='add'>+xdr_name(XDR *, name *);</div><div class='add'>+extern bool_t</div><div class='add'>+xdr_mountstat3(XDR *, mountstat3 *);</div><div class='add'>+extern bool_t</div><div class='add'>+xdr_mountres3_ok(XDR *, mountres3_ok *);</div><div class='add'>+extern bool_t</div><div class='add'>+xdr_mountres3(XDR *, mountres3 *);</div><div class='add'>+extern bool_t</div><div class='add'>+xdr_mountlist(XDR *, mountlist *);</div><div class='add'>+extern bool_t</div><div class='add'>+xdr_mountbody(XDR *, mountbody *);</div><div class='add'>+extern bool_t</div><div class='add'>+xdr_groups(XDR *, groups *);</div><div class='add'>+extern bool_t</div><div class='add'>+xdr_groupnode(XDR *, groupnode *);</div><div class='add'>+extern bool_t</div><div class='add'>+xdr_exports(XDR *, exports *);</div><div class='add'>+extern bool_t</div><div class='add'>+xdr_exportnode(XDR *, exportnode *);</div><div class='add'>+</div><div class='add'>+extern void</div><div class='add'>+xdr_free_exports_list(struct exportnode *first);</div><div class='add'>+extern void</div><div class='add'>+xdr_free_mountlist(mountlist ml);</div><div class='add'>+</div><div class='add'>+extern void</div><div class='add'>+xdr_free_write3args_nocopy(write3args *wa);</div><div class='add'>+#endif</div><div class='head'>diff --git a/run-tests-in-vagrant.sh b/run-tests-in-vagrant.sh<br/>new file mode 100755<br/>index 00000000000..a3f2ac7c72d<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/run-tests-in-vagrant.sh?id=d1d7a6f35c816822fab51c820e25023863c239c1'>run-tests-in-vagrant.sh</a></div><div class='hunk'>@@ -0,0 +1,311 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+###############################################################################</div><div class='add'>+# TODO: Support other OSes.                                                   #</div><div class='add'>+###############################################################################</div><div class='add'>+</div><div class='add'>+ORIGIN_DIR=$PWD</div><div class='add'>+autostart="no"</div><div class='add'>+destroy_after_test="no"</div><div class='add'>+os="fedora"</div><div class='add'>+destroy_now="no"</div><div class='add'>+run_tests_args=""</div><div class='add'>+redirect="&gt;/dev/null 2&gt;&amp;1"</div><div class='add'>+ssh="no"</div><div class='add'>+custom_cflags=""</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+pushd () {</div><div class='add'>+    command pushd "$@" &gt;/dev/null</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+popd () {</div><div class='add'>+    command popd "$@" &gt;/dev/null</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+usage() {</div><div class='add'>+    echo "Usage: $0 [...]"</div><div class='add'>+    echo ''</div><div class='add'>+    echo 'The options that this script accepts are:'</div><div class='add'>+    echo ''</div><div class='add'>+    echo '-a, --autostart        configure the testVM to autostart on boot'</div><div class='add'>+    echo '--destroy-now          cleanup the testVM'</div><div class='add'>+    echo '--destroy-after-test   cleanup once the tests finishes'</div><div class='add'>+    echo '-h, --help             show this help text'</div><div class='add'>+    echo '--os=&lt;flavor&gt;          select the OS for the testVM (fedora, centos6)'</div><div class='add'>+    echo '--ssh                  ssh into the testVM'</div><div class='add'>+    echo '--verbose              show what commands in the testVM are executed'</div><div class='add'>+    echo ''</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function parse_args () {</div><div class='add'>+    args=`getopt \</div><div class='add'>+              --options ah \</div><div class='add'>+              --long autostart,os:,destroy-now,destroy-after-test,verbose,ssh,help \</div><div class='add'>+              -n 'run-tests-in-vagrant.sh' \</div><div class='add'>+              --  "$@"`</div><div class='add'>+    eval set -- "$args"</div><div class='add'>+    while true; do</div><div class='add'>+        case "$1" in</div><div class='add'>+            -a|--autostart) autostart="yes"; shift ;;</div><div class='add'>+            --destroy-after-test) destroy_after_test="yes"; shift ;;</div><div class='add'>+            --destroy-now)  destroy_now="yes"; shift ;;</div><div class='add'>+            -h|--help) usage ; exit 0 ;;</div><div class='add'>+            --ssh)  sshvm="yes"; shift ;;</div><div class='add'>+            --os)</div><div class='add'>+                case "$2" in</div><div class='add'>+                    "") shift 2 ;;</div><div class='add'>+                     *) os="$2" ; shift 2 ;;</div><div class='add'>+                esac ;;</div><div class='add'>+            --verbose)  redirect=""; shift ;;</div><div class='add'>+            --) shift ; break ;;</div><div class='add'>+            *) echo "Internal error!" ; exit 1;;</div><div class='add'>+        esac</div><div class='add'>+    done</div><div class='add'>+    run_tests_args="$@"</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function force_location()</div><div class='add'>+{</div><div class='add'>+    current_dir=$(dirname $0);</div><div class='add'>+</div><div class='add'>+    if [ ! -f ${current_dir}/tests/vagrant/vagrant-template-fedora/Vagrantfile ]; then</div><div class='add'>+        echo "Aborting."</div><div class='add'>+        echo "The tests/vagrant subdirectory seems to be missing."</div><div class='add'>+        echo "Please correct the problem and try again."</div><div class='add'>+        exit 1</div><div class='add'>+    fi</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function vagrant_check()</div><div class='add'>+{</div><div class='add'>+    vagrant -v &gt;/dev/null  2&gt;&amp;1;</div><div class='add'>+</div><div class='add'>+    if [ $? -ne 0 ]; then</div><div class='add'>+        echo "Aborting"</div><div class='add'>+        echo "Vagrant not found. Please install Vagrant and try again."</div><div class='add'>+        echo "On Fedora, run "dnf install vagrant vagrant-libvirt" "</div><div class='add'>+        exit 1</div><div class='add'>+    fi</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function ansible_check()</div><div class='add'>+{</div><div class='add'>+    ansible --version  &gt;/dev/null  2&gt;&amp;1 ;</div><div class='add'>+</div><div class='add'>+    if [ $? -ne 0 ]; then</div><div class='add'>+        echo "Aborting"</div><div class='add'>+        echo "Ansible not found. Please install Ansible and try again."</div><div class='add'>+        echo "On Fedora, run "dnf install ansible" "</div><div class='add'>+        exit 1</div><div class='add'>+    fi</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function set_branchname_from_git_branch()</div><div class='add'>+{</div><div class='add'>+    BRANCHNAME=`git rev-parse --abbrev-ref HEAD`</div><div class='add'>+    if [ $? -ne 0 ]; then</div><div class='add'>+        echo "Could not get branch name from git, will exit"</div><div class='add'>+        exit 1</div><div class='add'>+    fi</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+function destroy_vm()</div><div class='add'>+{</div><div class='add'>+    local retval=0</div><div class='add'>+</div><div class='add'>+    echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!!CAUTION!!!!!!!!!!!!!!!!!!!!!!!!!!!!"</div><div class='add'>+    echo "This will destroy VM and delete tests/vagrant/${BRANCHNAME} dir"</div><div class='add'>+    echo</div><div class='add'>+    while true; do</div><div class='add'>+        read -p "Do you want to continue?" yn</div><div class='add'>+        case $yn in</div><div class='add'>+            [Yy]* ) break;;</div><div class='add'>+            * ) echo "Did not get an yes, exiting."; exit 1 ;;</div><div class='add'>+        esac</div><div class='add'>+    done</div><div class='add'>+    if [ -d "tests/vagrant/${BRANCHNAME}" ]; then</div><div class='add'>+        pushd "tests/vagrant/${BRANCHNAME}"</div><div class='add'>+        eval vagrant destroy $redirect</div><div class='add'>+        popd</div><div class='add'>+        rm -rf "tests/vagrant/${BRANCHNAME}"</div><div class='add'>+    else</div><div class='add'>+        echo "Could not find vagrant dir for corresponding git branch, exiting"</div><div class='add'>+        retval=1</div><div class='add'>+    fi</div><div class='add'>+</div><div class='add'>+    return ${retval}</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+function create_vagrant_dir()</div><div class='add'>+{</div><div class='add'>+    mkdir -p tests/vagrant/$BRANCHNAME</div><div class='add'>+    if [ -d "tests/vagrant/vagrant-template-${os}" ]; then</div><div class='add'>+        echo "Copying tests/vagrant/vagrant-template-${os} dir to tests/vagrant/${BRANCHNAME} ...."</div><div class='add'>+        cp -R tests/vagrant/vagrant-template-${os}/* tests/vagrant/$BRANCHNAME</div><div class='add'>+    else</div><div class='add'>+        echo "Could not find template files for requested os $os, exiting"</div><div class='add'>+        exit 1</div><div class='add'>+    fi</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+function start_vm()</div><div class='add'>+{</div><div class='add'>+    echo "Doing vagrant up...."</div><div class='add'>+    pushd "tests/vagrant/${BRANCHNAME}"</div><div class='add'>+    eval vagrant up $redirect</div><div class='add'>+    if [ $? -eq 0 ]</div><div class='add'>+    then</div><div class='add'>+            popd</div><div class='add'>+    else</div><div class='add'>+            echo "Vagrant up failed, exiting....";</div><div class='add'>+            popd</div><div class='add'>+            exit 1</div><div class='add'>+    fi</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function set_vm_attributes()</div><div class='add'>+{</div><div class='add'>+    if [ "x$autostart" == "xyes" ] ; then</div><div class='add'>+        virsh autostart ${BRANCHNAME}_vagrant-testVM</div><div class='add'>+    fi</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function copy_source_code()</div><div class='add'>+{</div><div class='add'>+    echo "Copying source code from host machine to VM...."</div><div class='add'>+    pushd "tests/vagrant/${BRANCHNAME}"</div><div class='add'>+    vagrant ssh-config &gt; ssh_config</div><div class='add'>+    rsync -az -e "ssh -F ssh_config" --rsync-path="sudo rsync" "$ORIGIN_DIR/." vagrant-testVM:/home/vagrant/glusterfs</div><div class='add'>+    if [ $? -eq 0 ]</div><div class='add'>+    then</div><div class='add'>+            popd</div><div class='add'>+    else</div><div class='add'>+            echo "Copy failed, exiting...."</div><div class='add'>+            popd</div><div class='add'>+            exit 1</div><div class='add'>+    fi</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function compile_gluster()</div><div class='add'>+{</div><div class='add'>+    echo "Source compile and install Gluster...."</div><div class='add'>+    pushd "tests/vagrant/${BRANCHNAME}"</div><div class='add'>+    vagrant ssh -c "cd /home/vagrant/glusterfs ; sudo make clean $redirect" -- -t</div><div class='add'>+    vagrant ssh -c "cd /home/vagrant/glusterfs ; sudo ./autogen.sh $redirect" -- -t</div><div class='add'>+    if [ $? -ne 0 ]</div><div class='add'>+    then</div><div class='add'>+            echo "autogen failed, exiting...."</div><div class='add'>+            popd</div><div class='add'>+            exit 1</div><div class='add'>+    fi</div><div class='add'>+</div><div class='add'>+    # GCC on fedora complains about uninitialized variables and</div><div class='add'>+    # GCC on centos6 does not under don't warn on uninitialized variables flag.</div><div class='add'>+    if [ "x$os" == "fedora" ] ; then</div><div class='add'>+            custom_cflags="CFLAGS='-g -O0 -Werror -Wall -Wno-error=cpp -Wno-error=maybe-uninitialized'"</div><div class='add'>+    else</div><div class='add'>+            custom_cflags="CFLAGS='-g -O0 -Werror -Wall'"</div><div class='add'>+    fi</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+    custom_cflags=</div><div class='add'>+    vagrant ssh -c "cd /home/vagrant/glusterfs ; \</div><div class='add'>+            sudo \</div><div class='add'>+            $custom_cflags \</div><div class='add'>+            ./configure \</div><div class='add'>+            --prefix=/usr \</div><div class='add'>+            --exec-prefix=/usr \</div><div class='add'>+            --bindir=/usr/bin \</div><div class='add'>+            --sbindir=/usr/sbin \</div><div class='add'>+            --sysconfdir=/etc \</div><div class='add'>+            --datadir=/usr/share \</div><div class='add'>+            --includedir=/usr/include \</div><div class='add'>+            --libdir=/usr/lib64 \</div><div class='add'>+            --libexecdir=/usr/libexec \</div><div class='add'>+            --localstatedir=/var \</div><div class='add'>+            --sharedstatedir=/var/lib \</div><div class='add'>+            --mandir=/usr/share/man \</div><div class='add'>+            --infodir=/usr/share/info \</div><div class='add'>+            --libdir=/usr/lib64 \</div><div class='add'>+            --enable-gnfs \</div><div class='add'>+            --enable-debug $redirect" -- -t</div><div class='add'>+    if [ $? -ne 0 ]</div><div class='add'>+    then</div><div class='add'>+            echo "configure failed, exiting...."</div><div class='add'>+            popd</div><div class='add'>+            exit 1</div><div class='add'>+    fi</div><div class='add'>+    # Test for missing dependencies based on the BuildRequires in the</div><div class='add'>+    # glusterfs.spec. If anything is missing, install them (and only then, dnf</div><div class='add'>+    # cache is a large download).</div><div class='add'>+    vagrant ssh -c "cd /home/vagrant/glusterfs; ( sudo dnf -C -y builddep --spec glusterfs.spec || sudo dnf -y builddep --spec glusterfs.spec ) $redirect" -- -t</div><div class='add'>+    vagrant ssh -c "cd /home/vagrant/glusterfs; sudo make -j install $redirect" -- -t</div><div class='add'>+    if [ $? -ne 0 ]</div><div class='add'>+    then</div><div class='add'>+            echo "make failed, exiting...."</div><div class='add'>+            popd</div><div class='add'>+            exit 1</div><div class='add'>+    fi</div><div class='add'>+    popd</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function run_tests()</div><div class='add'>+{</div><div class='add'>+    local retval=0</div><div class='add'>+</div><div class='add'>+    pushd "tests/vagrant/${BRANCHNAME}"</div><div class='add'>+    vagrant ssh -c "cd /home/vagrant/glusterfs; sudo ./run-tests.sh $run_tests_args" -- -t</div><div class='add'>+    retval=$?</div><div class='add'>+    popd</div><div class='add'>+</div><div class='add'>+    return ${retval}</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function ssh_into_vm_using_exec()</div><div class='add'>+{</div><div class='add'>+    pushd "tests/vagrant/${BRANCHNAME}"</div><div class='add'>+    exec vagrant ssh</div><div class='add'>+    popd</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+echo</div><div class='add'>+parse_args "$@"</div><div class='add'>+</div><div class='add'>+# Check environment for dependencies</div><div class='add'>+force_location</div><div class='add'>+vagrant_check</div><div class='add'>+ansible_check</div><div class='add'>+</div><div class='add'>+# We have one vm per git branch, query git branch</div><div class='add'>+set_branchname_from_git_branch</div><div class='add'>+</div><div class='add'>+if [ "x$destroy_now" == "xyes" ] ; then</div><div class='add'>+    destroy_vm</div><div class='add'>+    exit $?</div><div class='add'>+fi</div><div class='add'>+</div><div class='add'>+if [ "x$sshvm" == "xyes" ] ; then</div><div class='add'>+    ssh_into_vm_using_exec</div><div class='add'>+fi</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+create_vagrant_dir</div><div class='add'>+start_vm</div><div class='add'>+set_vm_attributes</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+copy_source_code</div><div class='add'>+compile_gluster</div><div class='add'>+run_tests</div><div class='add'>+RET=$?</div><div class='add'>+</div><div class='add'>+if [ "x$destroy_after_test" == "xyes" ] ; then</div><div class='add'>+    destroy_vm</div><div class='add'>+fi</div><div class='add'>+</div><div class='add'>+exit ${RET}</div><div class='head'>diff --git a/run-tests.sh b/run-tests.sh<br/>new file mode 100755<br/>index 00000000000..e2a1655d8e0<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/run-tests.sh?id=d1d7a6f35c816822fab51c820e25023863c239c1'>run-tests.sh</a></div><div class='hunk'>@@ -0,0 +1,615 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+# Copyright (c) 2013-2014 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+#</div><div class='add'>+</div><div class='add'>+# As many tests are designed to take values of variables from 'env.rc',</div><div class='add'>+# it is good to source the file. While it is also required to source the</div><div class='add'>+# file individually in each tests (as it should be possible to run the</div><div class='add'>+# tests separately), exporting variables from env.rc is not harmful if</div><div class='add'>+# done here</div><div class='add'>+</div><div class='add'>+source ./tests/env.rc</div><div class='add'>+</div><div class='add'>+export TZ=UTC</div><div class='add'>+force="no"</div><div class='add'>+head="yes"</div><div class='add'>+retry="yes"</div><div class='add'>+tests=""</div><div class='add'>+exit_on_failure="yes"</div><div class='add'>+skip_bad_tests="yes"</div><div class='add'>+skip_known_bugs="yes"</div><div class='add'>+result_output="/tmp/gluster_regression.txt"</div><div class='add'>+section_separator="========================================"</div><div class='add'>+run_timeout=200</div><div class='add'>+kill_after_time=5</div><div class='add'>+nfs_tests=$RUN_NFS_TESTS</div><div class='add'>+</div><div class='add'>+# Option below preserves log tarballs for each run of a test separately</div><div class='add'>+#       named: &lt;test&gt;-iteration-&lt;n&gt;.tar</div><div class='add'>+# If set to any other value, then log tarball is just named after the test and</div><div class='add'>+# overwritten in each iteration (saves space)</div><div class='add'>+#       named: &lt;test&gt;.tar</div><div class='add'>+# Use option -p to override default behavior</div><div class='add'>+skip_preserve_logs="yes"</div><div class='add'>+</div><div class='add'>+OSTYPE=$(uname -s)</div><div class='add'>+</div><div class='add'>+# Function for use in generating filenames with increasing "-&lt;n&gt;" index</div><div class='add'>+# In:</div><div class='add'>+#       $1 basepath: Directory where file needs to be created</div><div class='add'>+#       $2 filename: Name of the file sans extension</div><div class='add'>+#       $3 extension: Extension string that would be appended to the generated</div><div class='add'>+#               filename</div><div class='add'>+# Out:</div><div class='add'>+#       string of next available filename with appended "-&lt;n&gt;"</div><div class='add'>+# Example:</div><div class='add'>+#       Interested routines that want to create a file name, say foo-&lt;n&gt;.txt at</div><div class='add'>+#       location /var/log/gluster would pass in "/var/log/gluster" "foo" "txt"</div><div class='add'>+#       and be returned next available foo-&lt;n&gt; filename to create.</div><div class='add'>+# Notes:</div><div class='add'>+#       Function will not accept empty extension, and will return the same name</div><div class='add'>+#       over and over (which can be fixed when there is a need for it)</div><div class='add'>+function get_next_filename()</div><div class='add'>+{</div><div class='add'>+        local basepath=$1</div><div class='add'>+        local filename=$2</div><div class='add'>+        local extension=$3</div><div class='add'>+        local next=1</div><div class='add'>+        local tfilename="${filename}-${next}"</div><div class='add'>+        while [ -e "${basepath}/${tfilename}.${extension}" ]; do</div><div class='add'>+                next=$((next+1))</div><div class='add'>+                tfilename="${filename}-${next}"</div><div class='add'>+        done</div><div class='add'>+</div><div class='add'>+        echo "$tfilename"</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+# Tar the gluster logs and generate a tarball named after the first parameter</div><div class='add'>+# passed in to the function. Ideally the test name is passed to this function</div><div class='add'>+# to generate the required tarball.</div><div class='add'>+# Tarball name is further controlled by the variable skip_preserve_logs</div><div class='add'>+function tar_logs()</div><div class='add'>+{</div><div class='add'>+        t=$1</div><div class='add'>+</div><div class='add'>+        logdir=$(gluster --print-logdir)</div><div class='add'>+        basetarname=$(basename "$t" .t)</div><div class='add'>+</div><div class='add'>+        if [ -n "$logdir" ]</div><div class='add'>+        then</div><div class='add'>+                if [[ $skip_preserve_logs == "yes" ]]; then</div><div class='add'>+                        savetarname=$(get_next_filename "${logdir}" \</div><div class='add'>+                                "${basetarname}-iteration" "tar" \</div><div class='add'>+                                | tail -1)</div><div class='add'>+                else</div><div class='add'>+                        savetarname="$basetarname"</div><div class='add'>+                fi</div><div class='add'>+</div><div class='add'>+                # Can't use --exclude here because NetBSD doesn't have it.</div><div class='add'>+                # However, both it and Linux have -X to take patterns from</div><div class='add'>+                # a file, so use that.</div><div class='add'>+                (echo '*.tar'; echo .notar) &gt; "${logdir}"/.notar \</div><div class='add'>+                        &amp;&amp; \</div><div class='add'>+                tar -cf "${logdir}"/"${savetarname}".tar -X "${logdir}"/.notar \</div><div class='add'>+                        "${logdir}"/* 2&gt; /dev/null \</div><div class='add'>+                        &amp;&amp; \</div><div class='add'>+                find "$logdir"/* -maxdepth 0 -name '*.tar' -prune \</div><div class='add'>+                                        -o -exec rm -rf '{}' ';'</div><div class='add'>+</div><div class='add'>+                echo "Logs preserved in tarball $savetarname.tar"</div><div class='add'>+        else</div><div class='add'>+                echo "Logs not preserved, as logdir is not set"</div><div class='add'>+        fi</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function check_dependencies()</div><div class='add'>+{</div><div class='add'>+    ## Check all dependencies are present</div><div class='add'>+    MISSING=""</div><div class='add'>+</div><div class='add'>+    # Check for dbench</div><div class='add'>+    env dbench --usage &gt; /dev/null 2&gt;&amp;1</div><div class='add'>+    if [ $? -ne 0 ]; then</div><div class='add'>+        MISSING="$MISSING dbench"</div><div class='add'>+    fi</div><div class='add'>+</div><div class='add'>+    # Check for git</div><div class='add'>+    env git --version &gt; /dev/null 2&gt;&amp;1</div><div class='add'>+    if [ $? -ne 0 ]; then</div><div class='add'>+        MISSING="$MISSING git"</div><div class='add'>+    fi</div><div class='add'>+</div><div class='add'>+    # Check for nfs-utils (Linux-only: built-in NetBSD with different name)</div><div class='add'>+    if [ "x`uname -s`" = "xLinux" ] ; then</div><div class='add'>+      env mount.nfs -V &gt; /dev/null 2&gt;&amp;1</div><div class='add'>+      if [ $? -ne 0 ]; then</div><div class='add'>+          MISSING="$MISSING nfs-utils"</div><div class='add'>+      fi</div><div class='add'>+    fi</div><div class='add'>+</div><div class='add'>+    # Check for netstat</div><div class='add'>+    env netstat --version &gt; /dev/null 2&gt;&amp;1</div><div class='add'>+    if [ $? -ne 0 ]; then</div><div class='add'>+        MISSING="$MISSING netstat"</div><div class='add'>+    fi</div><div class='add'>+</div><div class='add'>+    # Check for the Perl Test Harness</div><div class='add'>+    env prove --version &gt; /dev/null 2&gt;&amp;1</div><div class='add'>+    if [ $? -ne 0 ]; then</div><div class='add'>+        MISSING="$MISSING perl-Test-Harness"</div><div class='add'>+    fi</div><div class='add'>+</div><div class='add'>+    which json_verify &gt; /dev/null</div><div class='add'>+    if [ $? -ne 0 ]; then</div><div class='add'>+        MISSING="$MISSING json_verify"</div><div class='add'>+    fi</div><div class='add'>+</div><div class='add'>+    # Check for XFS programs (Linux Only: NetBSD does without)</div><div class='add'>+    if [ "x`uname -s`" = "xLinux" ] ; then</div><div class='add'>+      env mkfs.xfs -V &gt; /dev/null 2&gt;&amp;1</div><div class='add'>+      if [ $? -ne 0 ]; then</div><div class='add'>+          MISSING="$MISSING xfsprogs"</div><div class='add'>+      fi</div><div class='add'>+    fi</div><div class='add'>+</div><div class='add'>+    # Check for attr</div><div class='add'>+    env getfattr --version &gt; /dev/null 2&gt;&amp;1</div><div class='add'>+    if [ $? -ne 0 ]; then</div><div class='add'>+        MISSING="$MISSING attr"</div><div class='add'>+    fi</div><div class='add'>+</div><div class='add'>+    # Check for pidof</div><div class='add'>+    pidof pidof &gt; /dev/null 2&gt;&amp;1</div><div class='add'>+    if [ $? -ne 0 ]; then</div><div class='add'>+        MISSING="$MISSING pidof"</div><div class='add'>+    fi</div><div class='add'>+</div><div class='add'>+    # Check for netstat</div><div class='add'>+    env netstat --version &gt; /dev/null 2&gt;&amp;1</div><div class='add'>+    if [ $? -ne 0 ]; then</div><div class='add'>+        MISSING="$MISSING netstat"</div><div class='add'>+    fi</div><div class='add'>+</div><div class='add'>+    # check for psutil python package</div><div class='add'>+    test `uname -s` == "Darwin" || test `uname -s` == "FreeBSD" &amp;&amp; {</div><div class='add'>+        pip show psutil | grep -q psutil &gt;/dev/null 2&gt;&amp;1</div><div class='add'>+        if [ $? -ne 0 ]; then</div><div class='add'>+            MISSING="$MISSING psutil"</div><div class='add'>+        fi</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ## If dependencies are missing, warn the user and abort</div><div class='add'>+    if [ "x$MISSING" != "x" ]; then</div><div class='add'>+        test "x${force}" != "xyes" &amp;&amp; echo "Aborting."</div><div class='add'>+        echo</div><div class='add'>+        echo "The following required tools are missing:"</div><div class='add'>+        echo</div><div class='add'>+        for pkg in $MISSING; do</div><div class='add'>+            echo "  * $pkg"</div><div class='add'>+        done</div><div class='add'>+        echo</div><div class='add'>+        test "x${force}" = "xyes" &amp;&amp; return</div><div class='add'>+        echo "Please install them and try again."</div><div class='add'>+        echo</div><div class='add'>+        exit 2</div><div class='add'>+    fi</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function check_location()</div><div class='add'>+{</div><div class='add'>+    regression_testsdir=$(dirname $0);</div><div class='add'>+</div><div class='add'>+    if [ ! -f ${regression_testsdir}/tests/include.rc ]; then</div><div class='add'>+        echo "Aborting."</div><div class='add'>+        echo</div><div class='add'>+        echo "The tests/ subdirectory seems to be missing."</div><div class='add'>+        echo</div><div class='add'>+        echo "Please correct the problem and try again."</div><div class='add'>+        echo</div><div class='add'>+        exit 1</div><div class='add'>+    fi</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function check_user()</div><div class='add'>+{</div><div class='add'>+    # If we're not running as root, warn the user and abort</div><div class='add'>+    MYUID=`/usr/bin/id -u`</div><div class='add'>+    if [ 0${MYUID} -ne 0 ]; then</div><div class='add'>+        echo "Aborting."</div><div class='add'>+        echo</div><div class='add'>+        echo "The GlusterFS Test Framework must be run as root."</div><div class='add'>+        echo</div><div class='add'>+        echo "Please change to the root user and try again."</div><div class='add'>+        echo</div><div class='add'>+        exit 3</div><div class='add'>+    fi</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function match()</div><div class='add'>+{</div><div class='add'>+        # Patterns considered valid:</div><div class='add'>+        # 0. Empty means everything</div><div class='add'>+        #    ""           matches ** i.e all</div><div class='add'>+        # 1. full or partial file/directory names</div><div class='add'>+        #   basic         matches tests/basic</div><div class='add'>+        #   basic/afr     matches tests/basic/afr</div><div class='add'>+        # 2. globs</div><div class='add'>+        #   basic/*       matches all files and directories in basic</div><div class='add'>+        #   basic/*/      matches subdirectories in basic (afr|ec)</div><div class='add'>+        # 3. numbered bug matching</div><div class='add'>+        #   884455        matches bugs/bug-884455.t</div><div class='add'>+        #   859927        matches bugs/859927, bugs/bug-859927.t</div><div class='add'>+        #   1015990       matches /bugs/bug-1015990-rep.t, bug-1015990.t</div><div class='add'>+        # ...lots of other cases accepted as well, since globbing is tricky.</div><div class='add'>+        local t=$1</div><div class='add'>+        shift</div><div class='add'>+        local a</div><div class='add'>+        local match=1</div><div class='add'>+        if [ -z "$@" ]; then</div><div class='add'>+            match=0</div><div class='add'>+            return $match</div><div class='add'>+        fi</div><div class='add'>+        for a in $@ ; do</div><div class='add'>+            case "$t" in</div><div class='add'>+                *$a*)</div><div class='add'>+                    match=0</div><div class='add'>+                    ;;</div><div class='add'>+            esac</div><div class='add'>+        done</div><div class='add'>+        return $match</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+# Tests can have comment lines with some comma separated values within them.</div><div class='add'>+# Key names used to determine test status are</div><div class='add'>+# G_TESTDEF_TEST_STATUS_CENTOS6</div><div class='add'>+# G_TESTDEF_TEST_STATUS_NETBSD7</div><div class='add'>+# Some examples:</div><div class='add'>+# G_TESTDEF_TEST_STATUS_CENTOS6=BAD_TEST,BUG=123456</div><div class='add'>+# G_TESTDEF_TEST_STATUS_CENTOS6=BRICK_MUX_BAD_TEST,BUG=123456</div><div class='add'>+# G_TESTDEF_TEST_STATUS_NETBSD7=KNOWN_ISSUE,BUG=4444444</div><div class='add'>+# G_TESTDEF_TEST_STATUS_CENTOS6=BAD_TEST,BUG=123456;555555</div><div class='add'>+# G_TESTDEF_TEST_STATUS_CENTOS6=NFS_TESTS,BUG=1385758</div><div class='add'>+# You can change status of test to enabled or delete the line only if all the</div><div class='add'>+# bugs are closed or modified or if the patch fixes it.</div><div class='add'>+function get_test_status ()</div><div class='add'>+{</div><div class='add'>+    local test_name=$1</div><div class='add'>+    local host_os=""</div><div class='add'>+    local result=""</div><div class='add'>+</div><div class='add'>+    host_os=$(uname -s)</div><div class='add'>+</div><div class='add'>+    case "$host_os" in</div><div class='add'>+    # Leaving out the logic to determine the particular distro and version</div><div class='add'>+    # for later. Why does the key have the distro and version then?</div><div class='add'>+    # Because changing the key in all test files would be very big process</div><div class='add'>+    # updating just this function with a better logic much simpler.</div><div class='add'>+    Linux)</div><div class='add'>+        result=$(grep -e "^#G_TESTDEF_TEST_STATUS_CENTOS6" $test_name | \</div><div class='add'>+                 awk -F"," {'print $1'} | awk -F"=" {'print $2'}) ;;</div><div class='add'>+    NetBSD)</div><div class='add'>+        result=$(grep -e "^#G_TESTDEF_TEST_STATUS_NETBSD7" $test_name | \</div><div class='add'>+                 awk -F"," {'print $1'} | awk -F"=" {'print $2'}) ;;</div><div class='add'>+    *)</div><div class='add'>+        result="ENABLED" ;;</div><div class='add'>+    esac</div><div class='add'>+</div><div class='add'>+    echo "$result"</div><div class='add'>+</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function get_bug_list_for_disabled_test ()</div><div class='add'>+{</div><div class='add'>+    local test_name=$1</div><div class='add'>+    local host_os=""</div><div class='add'>+    local result=""</div><div class='add'>+</div><div class='add'>+    host_os=$(uname -s)</div><div class='add'>+</div><div class='add'>+    case "$host_os" in</div><div class='add'>+    # Leaving out the logic to determine the particular distro and version</div><div class='add'>+    # for later. Why does the key have the distro and version then?</div><div class='add'>+    # Because changing the key in all test files would be very big process</div><div class='add'>+    # updating just this function with a better logic much simpler.</div><div class='add'>+    Linux)</div><div class='add'>+        result=$(grep -e "^#G_TESTDEF_TEST_STATUS_CENTOS6" $test_name | \</div><div class='add'>+                 awk -F"," {'print $2'} | awk -F"=" {'print $2'}) ;;</div><div class='add'>+    NetBSD)</div><div class='add'>+        result=$(grep -e "^#G_TESTDEF_TEST_STATUS_NETBSD7" $test_name | \</div><div class='add'>+                 awk -F"," {'print $2'} | awk -F"=" {'print $2'}) ;;</div><div class='add'>+    *)</div><div class='add'>+        result="0000000" ;;</div><div class='add'>+    esac</div><div class='add'>+</div><div class='add'>+    echo "$result"</div><div class='add'>+</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function run_tests()</div><div class='add'>+{</div><div class='add'>+    RES=0</div><div class='add'>+    FLAKY=''</div><div class='add'>+    FAILED=''</div><div class='add'>+    TESTS_NEEDED_RETRY=''</div><div class='add'>+    GENERATED_CORE=''</div><div class='add'>+    total_tests=0</div><div class='add'>+    selected_tests=0</div><div class='add'>+    skipped_bad_tests=0</div><div class='add'>+    skipped_known_issue_tests=0</div><div class='add'>+    total_run_tests=0</div><div class='add'>+</div><div class='add'>+    # key = path of .t file; value = time taken to run the .t file</div><div class='add'>+    declare -A ELAPSEDTIMEMAP</div><div class='add'>+</div><div class='add'>+    # Test if -k is supported for timeout command</div><div class='add'>+    # This is not supported on centos6, but spuported on centos7</div><div class='add'>+    # The flags is required for running the command in both flavors</div><div class='add'>+    timeout_cmd_exists="yes"</div><div class='add'>+    timeout -k 1 10 echo "testing 'timeout' command"</div><div class='add'>+    if [ $? -ne 0 ]; then</div><div class='add'>+        timeout_cmd_exists="no"</div><div class='add'>+    fi</div><div class='add'>+</div><div class='add'>+    all_tests=($(find ${regression_testsdir}/tests -name '*.t' | sort))</div><div class='add'>+    all_tests_cnt=${#all_tests[@]}</div><div class='add'>+    for t in "${all_tests[@]}" ; do</div><div class='add'>+        old_cores=$(ls /*-*.core 2&gt; /dev/null | wc -l)</div><div class='add'>+        total_tests=$((total_tests+1))</div><div class='add'>+        if match $t "$@" ; then</div><div class='add'>+            selected_tests=$((selected_tests+1))</div><div class='add'>+            echo</div><div class='add'>+            echo $section_separator "(${total_tests} / ${all_tests_cnt})" $section_separator</div><div class='add'>+            if [[ $(get_test_status $t) =~ "BAD_TEST" ]] &amp;&amp; \</div><div class='add'>+               [[ $skip_bad_tests == "yes" ]]</div><div class='add'>+            then</div><div class='add'>+                skipped_bad_tests=$((skipped_bad_tests+1))</div><div class='add'>+                echo "Skipping bad test file $t"</div><div class='add'>+                echo "Reason: bug(s):" $(get_bug_list_for_disabled_test $t)</div><div class='add'>+                echo $section_separator$section_separator</div><div class='add'>+                echo</div><div class='add'>+                continue</div><div class='add'>+            fi</div><div class='add'>+            if [[ $(get_test_status $t) == "KNOWN_ISSUE" ]] &amp;&amp; \</div><div class='add'>+               [[ $skip_known_bugs == "yes" ]]</div><div class='add'>+            then</div><div class='add'>+                skipped_known_issue_tests=$((skipped_known_issue_tests+1))</div><div class='add'>+                echo "Skipping test file $t due to known issue"</div><div class='add'>+                echo "Reason: bug(s):" $(get_bug_list_for_disabled_test $t)</div><div class='add'>+                echo $section_separator$section_separator</div><div class='add'>+                echo</div><div class='add'>+                continue</div><div class='add'>+            fi</div><div class='add'>+            if [[ $(get_test_status $t) == "NFS_TEST" ]] &amp;&amp; \</div><div class='add'>+               [[ $nfs_tests == "no" ]]</div><div class='add'>+            then</div><div class='add'>+                echo "Skipping nfs test file $t"</div><div class='add'>+                echo $section_separator$section_separator</div><div class='add'>+                echo</div><div class='add'>+                continue</div><div class='add'>+            fi</div><div class='add'>+            total_run_tests=$((total_run_tests+1))</div><div class='add'>+            echo "[$(date +%H:%M:%S)] Running tests in file $t"</div><div class='add'>+            starttime="$(date +%s)"</div><div class='add'>+</div><div class='add'>+            local cmd_timeout=$run_timeout;</div><div class='add'>+            if [ ${timeout_cmd_exists} == "yes" ]; then</div><div class='add'>+                if [ $(grep -c "SCRIPT_TIMEOUT=" ${t}) == 1 ] ; then</div><div class='add'>+                    cmd_timeout=$(grep "SCRIPT_TIMEOUT=" ${t} | cut -f2 -d'=');</div><div class='add'>+                    echo "Timeout set is ${cmd_timeout}, default ${run_timeout}"</div><div class='add'>+                fi</div><div class='add'>+                timeout --foreground -k ${kill_after_time} ${cmd_timeout} prove -vmfe '/bin/bash' ${t}</div><div class='add'>+            else</div><div class='add'>+                prove -vmfe '/bin/bash' ${t}</div><div class='add'>+            fi</div><div class='add'>+            TMP_RES=$?</div><div class='add'>+            ELAPSEDTIMEMAP[$t]=`expr $(date +%s) - $starttime`</div><div class='add'>+            tar_logs "$t"</div><div class='add'>+</div><div class='add'>+            # timeout always return 124 if it is actually a timeout.</div><div class='add'>+            if ((${TMP_RES} == 124)); then</div><div class='add'>+                echo "${t} timed out after ${cmd_timeout} seconds"</div><div class='add'>+            fi</div><div class='add'>+</div><div class='add'>+            if [ ${TMP_RES} -ne 0 ]  &amp;&amp; [ "x${retry}" = "xyes" ] ; then</div><div class='add'>+                echo "$t: bad status $TMP_RES"</div><div class='add'>+                echo ""</div><div class='add'>+                echo "       *********************************"</div><div class='add'>+                echo "       *       REGRESSION FAILED       *"</div><div class='add'>+                echo "       * Retrying failed tests in case *"</div><div class='add'>+                echo "       * we got some spurious failures *"</div><div class='add'>+                echo "       *********************************"</div><div class='add'>+                echo ""</div><div class='add'>+</div><div class='add'>+                if [ ${timeout_cmd_exists} == "yes" ]; then</div><div class='add'>+                    timeout --foreground -k ${kill_after_time} ${cmd_timeout} prove -vmfe '/bin/bash' ${t}</div><div class='add'>+                else</div><div class='add'>+                    prove -vmfe '/bin/bash' ${t}</div><div class='add'>+                fi</div><div class='add'>+                TMP_RES=$?</div><div class='add'>+                tar_logs "$t"</div><div class='add'>+</div><div class='add'>+                if ((${TMP_RES} == 124)); then</div><div class='add'>+                    echo "${t} timed out after ${cmd_timeout} seconds"</div><div class='add'>+                fi</div><div class='add'>+</div><div class='add'>+                TESTS_NEEDED_RETRY="${TESTS_NEEDED_RETRY}${t} "</div><div class='add'>+            fi</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+            if [ ${TMP_RES} -ne 0 ] ; then</div><div class='add'>+		if [[ "$t" == *"tests/000-flaky/"* ]]; then</div><div class='add'>+                    FLAKY="${FLAKY}${t} "</div><div class='add'>+		    echo "FAILURE -&gt; SUCCESS: Flaky test"</div><div class='add'>+		    TMP_RES=0</div><div class='add'>+		else</div><div class='add'>+                    RES=${TMP_RES}</div><div class='add'>+                    FAILED="${FAILED}${t} "</div><div class='add'>+		fi</div><div class='add'>+            fi</div><div class='add'>+</div><div class='add'>+            new_cores=$(ls /*-*.core 2&gt; /dev/null | wc -l)</div><div class='add'>+            if [ x"$new_cores" != x"$old_cores" ]; then</div><div class='add'>+                core_diff=$((new_cores-old_cores))</div><div class='add'>+                echo "$t: $core_diff new core files"</div><div class='add'>+                RES=1</div><div class='add'>+                GENERATED_CORE="${GENERATED_CORE}${t} "</div><div class='add'>+            fi</div><div class='add'>+            echo "End of test $t"</div><div class='add'>+            echo $section_separator$section_separator</div><div class='add'>+            echo</div><div class='add'>+            if [ $RES -ne 0 ] &amp;&amp; [ x"$exit_on_failure" = "xyes" ] ; then</div><div class='add'>+                break;</div><div class='add'>+            fi</div><div class='add'>+        fi</div><div class='add'>+    done</div><div class='add'>+    echo</div><div class='add'>+    echo "Run complete"</div><div class='add'>+    echo $section_separator$section_separator</div><div class='add'>+    echo "Number of tests found:                             $total_tests"</div><div class='add'>+    echo "Number of tests selected for run based on pattern: $selected_tests"</div><div class='add'>+    echo "Number of tests skipped as they were marked bad:   $skipped_bad_tests"</div><div class='add'>+    echo "Number of tests skipped because of known_issues:   $skipped_known_issue_tests"</div><div class='add'>+    echo "Number of tests that were run:                     $total_run_tests"</div><div class='add'>+</div><div class='add'>+    echo</div><div class='add'>+    echo "Tests ordered by time taken, slowest to fastest: "</div><div class='add'>+    echo $section_separator$section_separator</div><div class='add'>+    for key in "${!ELAPSEDTIMEMAP[@]}"</div><div class='add'>+    do</div><div class='add'>+        echo "$key  -  ${ELAPSEDTIMEMAP["$key"]} second"</div><div class='add'>+    done | sort -rn -k3</div><div class='add'>+</div><div class='add'>+    # initialize the output file</div><div class='add'>+    echo &gt; "${result_output}"</div><div class='add'>+</div><div class='add'>+    # Output the errors into a file</div><div class='add'>+    if [ ${RES} -ne 0 ] ; then</div><div class='add'>+        FAILED=$( echo ${FAILED} | tr ' ' '\n' | sort -u )</div><div class='add'>+        FAILED_COUNT=$( echo -n "${FAILED}" | grep -c '^' )</div><div class='add'>+        echo -e "\n$FAILED_COUNT test(s) failed \n${FAILED}" &gt;&gt; "${result_output}"</div><div class='add'>+        GENERATED_CORE=$( echo  ${GENERATED_CORE} | tr ' ' '\n' | sort -u )</div><div class='add'>+        GENERATED_CORE_COUNT=$( echo -n "${GENERATED_CORE}" | grep -c '^' )</div><div class='add'>+        echo -e "\n$GENERATED_CORE_COUNT test(s) generated core \n${GENERATED_CORE}" &gt;&gt; "${result_output}"</div><div class='add'>+        cat "${result_output}"</div><div class='add'>+    fi</div><div class='add'>+    TESTS_NEEDED_RETRY=$( echo ${TESTS_NEEDED_RETRY} | tr ' ' '\n' | sort -u )</div><div class='add'>+    RETRY_COUNT=$( echo -n "${TESTS_NEEDED_RETRY}" | grep -c '^' )</div><div class='add'>+    if [ ${RETRY_COUNT} -ne 0 ] ; then</div><div class='add'>+        echo -e "\n${RETRY_COUNT} test(s) needed retry \n${TESTS_NEEDED_RETRY}" &gt;&gt; "${result_output}"</div><div class='add'>+    fi</div><div class='add'>+</div><div class='add'>+    FLAKY_TESTS_FAILED=$( echo ${FLAKY} | tr ' ' '\n' | sort -u )</div><div class='add'>+    RETRY_COUNT=$( echo -n "${FLAKY_TESTS_FAILED}" | grep -c '^' )</div><div class='add'>+    if [ ${RETRY_COUNT} -ne 0 ] ; then</div><div class='add'>+        echo -e "\n${RETRY_COUNT} flaky test(s) marked as success even though they failed \n${FLAKY_TESTS_FAILED}" &gt;&gt; "${result_output}"</div><div class='add'>+    fi</div><div class='add'>+</div><div class='add'>+    echo</div><div class='add'>+    echo "Result is $RES"</div><div class='add'>+    echo</div><div class='add'>+    return ${RES}</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function run_head_tests()</div><div class='add'>+{</div><div class='add'>+    [ -d ${regression_testsdir}/.git ] || return 0</div><div class='add'>+</div><div class='add'>+    # The git command needs $cwd to be within the repository, but run_tests</div><div class='add'>+    # needs it to be back where we started.</div><div class='add'>+    pushd $regression_testsdir</div><div class='add'>+    git_cmd="git diff-tree --no-commit-id --name-only --diff-filter=ACMRTUXB"</div><div class='add'>+    htests=$($git_cmd -r HEAD tests | grep '.t$')</div><div class='add'>+    popd</div><div class='add'>+    [ -n "$htests" ] || return 0</div><div class='add'>+</div><div class='add'>+    # Perhaps it's not ideal that we'll end up re-running these tests, but the</div><div class='add'>+    # gains from letting them fail fast in the first round should outweigh the</div><div class='add'>+    # losses from running them again in the second.  OTOH, with so many of our</div><div class='add'>+    # tests being non-deterministic, maybe it doesn't hurt to give the newest</div><div class='add'>+    # tests an extra workout.</div><div class='add'>+    run_tests "$htests"</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function show_usage ()</div><div class='add'>+{</div><div class='add'>+    cat &lt;&lt;EOF</div><div class='add'>+Usage: $0 &lt;opts&gt; [&lt;glob&gt;|&lt;bzid&gt;]...</div><div class='add'>+</div><div class='add'>+Options:</div><div class='add'>+</div><div class='add'>+-f  force</div><div class='add'>+-h  skip tests altering from HEAD</div><div class='add'>+-H  run only tests altering from HEAD</div><div class='add'>+-r  retry failed tests</div><div class='add'>+-R  do not retry failed tests</div><div class='add'>+-c  dont't exit on failure</div><div class='add'>+-b  don't skip bad tests</div><div class='add'>+-k  don't skip known bugs</div><div class='add'>+-p  don't keep logs from preceding runs</div><div class='add'>+-o  OUTPUT</div><div class='add'>+-t  TIMEOUT</div><div class='add'>+-n  skip NFS tests</div><div class='add'>+--help</div><div class='add'>+EOF</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+usage="no"</div><div class='add'>+</div><div class='add'>+function parse_args ()</div><div class='add'>+{</div><div class='add'>+    args=`getopt -u -l help frRcbkphHno:t: "$@"`</div><div class='add'>+    if ! [ $? -eq 0 ]; then</div><div class='add'>+	show_usage</div><div class='add'>+	exit 1</div><div class='add'>+    fi</div><div class='add'>+    set -- $args</div><div class='add'>+    while [ $# -gt 0 ]; do</div><div class='add'>+        case "$1" in</div><div class='add'>+        -f)    force="yes" ;;</div><div class='add'>+        -h)    head="no" ;;</div><div class='add'>+        -H)    head="only" ;;</div><div class='add'>+        -r)    retry="yes" ;;</div><div class='add'>+        -R)    retry="no" ;;</div><div class='add'>+        -c)    exit_on_failure="no" ;;</div><div class='add'>+        -b)    skip_bad_tests="no" ;;</div><div class='add'>+        -k)    skip_known_bugs="no" ;;</div><div class='add'>+        -p)    skip_preserve_logs="no" ;;</div><div class='add'>+        -o)    result_output="$2"; shift;;</div><div class='add'>+        -t)    run_timeout="$2"; shift;;</div><div class='add'>+        -n)    nfs_tests="no";;</div><div class='add'>+        --help) usage="yes" ;;</div><div class='add'>+        --)    shift; break;;</div><div class='add'>+        esac</div><div class='add'>+        shift</div><div class='add'>+    done</div><div class='add'>+    tests="$@"</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+echo</div><div class='add'>+echo ... GlusterFS Test Framework ...</div><div class='add'>+echo</div><div class='add'>+</div><div class='add'>+# Get user options</div><div class='add'>+parse_args "$@"</div><div class='add'>+if [ x"$usage" == x"yes" ]; then</div><div class='add'>+    show_usage</div><div class='add'>+    exit 0</div><div class='add'>+fi</div><div class='add'>+</div><div class='add'>+# Make sure we're running as the root user</div><div class='add'>+check_user</div><div class='add'>+</div><div class='add'>+# Make sure the needed programs are available</div><div class='add'>+check_dependencies</div><div class='add'>+</div><div class='add'>+# Check we're running from the right location</div><div class='add'>+check_location</div><div class='add'>+</div><div class='add'>+# Run the tests</div><div class='add'>+if [ x"$head" != x"no" ]; then</div><div class='add'>+        run_head_tests || exit 1</div><div class='add'>+fi</div><div class='add'>+if [ x"$head" != x"only" ]; then</div><div class='add'>+        run_tests "$tests" || exit 1</div><div class='add'>+fi</div><div class='head'>diff --git a/scheduler/Makefile.am b/scheduler/Makefile.am<br/>deleted file mode 100644<br/>index 618fa7dd8b8..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/scheduler/Makefile.am?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>scheduler/Makefile.am</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,3 +0,0 @@</div><div class='del'>-SUBDIRS = alu random nufa rr switch</div><div class='del'>-</div><div class='del'>-CLEANFILES = </div><div class='head'>diff --git a/scheduler/alu/src/Makefile.am b/scheduler/alu/src/Makefile.am<br/>deleted file mode 100644<br/>index eb7d0db07e0..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/scheduler/alu/src/Makefile.am?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>scheduler/alu/src/Makefile.am</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,14 +0,0 @@</div><div class='del'>-sched_LTLIBRARIES = alu.la</div><div class='del'>-scheddir = $(libdir)/glusterfs/$(PACKAGE_VERSION)/scheduler</div><div class='del'>-</div><div class='del'>-alu_la_LDFLAGS = -module -avoidversion</div><div class='del'>-</div><div class='del'>-alu_la_SOURCES = alu.c</div><div class='del'>-alu_la_LIBADD = $(top_builddir)/libglusterfs/src/libglusterfs.la</div><div class='del'>-</div><div class='del'>-noinst_HEADERS = alu.h</div><div class='del'>-</div><div class='del'>-AM_CFLAGS = -fPIC -D_FILE_OFFSET_BITS=64 -D_GNU_SOURCE -Wall -D$(GF_HOST_OS)\</div><div class='del'>-	-I$(top_srcdir)/libglusterfs/src -shared -nostartfiles $(GF_CFLAGS)</div><div class='del'>-</div><div class='del'>-CLEANFILES = </div><div class='head'>diff --git a/scheduler/alu/src/alu-mem-types.h b/scheduler/alu/src/alu-mem-types.h<br/>deleted file mode 100644<br/>index 39da342ec6c..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/scheduler/alu/src/alu-mem-types.h?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>scheduler/alu/src/alu-mem-types.h</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,35 +0,0 @@</div><div class='del'>-/*</div><div class='del'>-   Copyright (c) 2008-2009 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='del'>-   This file is part of GlusterFS.</div><div class='del'>-</div><div class='del'>-   GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-   it under the terms of the GNU General Public License as published</div><div class='del'>-   by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-   or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-   GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-   WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-   General Public License for more details.</div><div class='del'>-</div><div class='del'>-   You should have received a copy of the GNU General Public License</div><div class='del'>-   along with this program.  If not, see</div><div class='del'>-   &lt;http://www.gnu.org/licenses/&gt;.</div><div class='del'>-*/</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-#ifndef __ALU_MEM_TYPES_H__</div><div class='del'>-#define __ALU_MEM_TYPES_H__</div><div class='del'>-</div><div class='del'>-#include "mem-types.h"</div><div class='del'>-</div><div class='del'>-enum gf_alu_mem_types_ {</div><div class='del'>-        gf_alu_mt_alu_threshold = gf_common_mt_end + 1,</div><div class='del'>-        gf_alu_mt_alu_sched,</div><div class='del'>-        gf_alu_mt_alu_limits,</div><div class='del'>-        gf_alu_mt_alu_sched_struct,</div><div class='del'>-        gf_alu_mt_alu_sched_node,</div><div class='del'>-        gf_alu_mt_end</div><div class='del'>-};</div><div class='del'>-#endif</div><div class='del'>-</div><div class='head'>diff --git a/scheduler/alu/src/alu.c b/scheduler/alu/src/alu.c<br/>deleted file mode 100644<br/>index f2a0a08f481..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/scheduler/alu/src/alu.c?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>scheduler/alu/src/alu.c</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,1019 +0,0 @@</div><div class='del'>-/*</div><div class='del'>-  Copyright (c) 2006-2009 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='del'>-  This file is part of GlusterFS.</div><div class='del'>-</div><div class='del'>-  GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-  it under the terms of the GNU General Public License as published</div><div class='del'>-  by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-  or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-  GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-  WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-  General Public License for more details.</div><div class='del'>-</div><div class='del'>-  You should have received a copy of the GNU General Public License</div><div class='del'>-  along with this program.  If not, see</div><div class='del'>-  &lt;http://www.gnu.org/licenses/&gt;.</div><div class='del'>-*/</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-/* ALU code needs a complete re-write. This is one of the most important </div><div class='del'>- * part of GlusterFS and so needs more and more reviews and testing </div><div class='del'>- */</div><div class='del'>-</div><div class='del'>-#ifndef _CONFIG_H</div><div class='del'>-#define _CONFIG_H</div><div class='del'>-#include "config.h"</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-#include &lt;sys/time.h&gt;</div><div class='del'>-#include &lt;stdint.h&gt;</div><div class='del'>-#include "stack.h"</div><div class='del'>-#include "alu.h"</div><div class='del'>-#include "alu-mem-types.h"</div><div class='del'>-</div><div class='del'>-#define ALU_DISK_USAGE_ENTRY_THRESHOLD_DEFAULT         (1 * GF_UNIT_GB)</div><div class='del'>-#define ALU_DISK_USAGE_EXIT_THRESHOLD_DEFAULT          (512 * GF_UNIT_MB)</div><div class='del'>-</div><div class='del'>-#define ALU_WRITE_USAGE_ENTRY_THRESHOLD_DEFAULT        25</div><div class='del'>-#define ALU_WRITE_USAGE_EXIT_THRESHOLD_DEFAULT         5</div><div class='del'>-</div><div class='del'>-#define ALU_READ_USAGE_ENTRY_THRESHOLD_DEFAULT         25</div><div class='del'>-#define ALU_READ_USAGE_EXIT_THRESHOLD_DEFAULT          5</div><div class='del'>-</div><div class='del'>-#define ALU_OPEN_FILES_USAGE_ENTRY_THRESHOLD_DEFAULT   1000</div><div class='del'>-#define ALU_OPEN_FILES_USAGE_EXIT_THRESHOLD_DEFAULT    100</div><div class='del'>-</div><div class='del'>-#define ALU_LIMITS_TOTAL_DISK_SIZE_DEFAULT             100</div><div class='del'>-</div><div class='del'>-#define ALU_REFRESH_INTERVAL_DEFAULT                   5</div><div class='del'>-#define ALU_REFRESH_CREATE_COUNT_DEFAULT               5</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-static int64_t </div><div class='del'>-get_stats_disk_usage (struct xlator_stats *this)</div><div class='del'>-{</div><div class='del'>-	return this-&gt;disk_usage;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-static int64_t </div><div class='del'>-get_stats_write_usage (struct xlator_stats *this)</div><div class='del'>-{</div><div class='del'>-	return this-&gt;write_usage;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-static int64_t </div><div class='del'>-get_stats_read_usage (struct xlator_stats *this)</div><div class='del'>-{</div><div class='del'>-	return this-&gt;read_usage;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-static int64_t </div><div class='del'>-get_stats_disk_speed (struct xlator_stats *this)</div><div class='del'>-{</div><div class='del'>-	return this-&gt;disk_speed;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-static int64_t </div><div class='del'>-get_stats_file_usage (struct xlator_stats *this)</div><div class='del'>-{</div><div class='del'>-	/* Avoid warning "defined but not used" */</div><div class='del'>-	(void) &amp;get_stats_file_usage;    </div><div class='del'>-</div><div class='del'>-	return this-&gt;nr_files;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-static int64_t </div><div class='del'>-get_stats_free_disk (struct xlator_stats *this)</div><div class='del'>-{</div><div class='del'>-	if (this-&gt;total_disk_size &gt; 0)</div><div class='del'>-		return (this-&gt;free_disk * 100) / this-&gt;total_disk_size;</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-static int64_t </div><div class='del'>-get_max_diff_write_usage (struct xlator_stats *max, struct xlator_stats *min)</div><div class='del'>-{</div><div class='del'>-	return (max-&gt;write_usage - min-&gt;write_usage);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-static int64_t </div><div class='del'>-get_max_diff_read_usage (struct xlator_stats *max, struct xlator_stats *min)</div><div class='del'>-{</div><div class='del'>-	return (max-&gt;read_usage - min-&gt;read_usage);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-static int64_t </div><div class='del'>-get_max_diff_disk_usage (struct xlator_stats *max, struct xlator_stats *min)</div><div class='del'>-{</div><div class='del'>-	return (max-&gt;disk_usage - min-&gt;disk_usage);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-static int64_t </div><div class='del'>-get_max_diff_disk_speed (struct xlator_stats *max, struct xlator_stats *min)</div><div class='del'>-{</div><div class='del'>-	return (max-&gt;disk_speed - min-&gt;disk_speed);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-static int64_t </div><div class='del'>-get_max_diff_file_usage (struct xlator_stats *max, struct xlator_stats *min)</div><div class='del'>-{</div><div class='del'>-	return (max-&gt;nr_files - min-&gt;nr_files);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int </div><div class='del'>-alu_parse_options (xlator_t *xl, struct alu_sched *alu_sched)</div><div class='del'>-{</div><div class='del'>-	data_t *order = dict_get (xl-&gt;options, "scheduler.alu.order");</div><div class='del'>-	if (!order) {</div><div class='del'>-		gf_log (xl-&gt;name, GF_LOG_ERROR,</div><div class='del'>-			"option 'scheduler.alu.order' not specified");</div><div class='del'>-		return -1;</div><div class='del'>-	}</div><div class='del'>-	struct alu_threshold *_threshold_fn;</div><div class='del'>-	struct alu_threshold *tmp_threshold;</div><div class='del'>-	data_t *entry_fn = NULL;</div><div class='del'>-	data_t *exit_fn = NULL;</div><div class='del'>-	char *tmp_str = NULL;</div><div class='del'>-	char *order_str = strtok_r (order-&gt;data, ":", &amp;tmp_str);</div><div class='del'>-	/* Get the scheduling priority order, specified by the user. */</div><div class='del'>-	while (order_str) {</div><div class='del'>-		gf_log ("alu", GF_LOG_DEBUG,</div><div class='del'>-			"alu_init: order string: %s",</div><div class='del'>-			order_str);</div><div class='del'>-		if (strcmp (order_str, "disk-usage") == 0) {</div><div class='del'>-			/* Disk usage */</div><div class='del'>-			_threshold_fn = </div><div class='del'>-				GF_CALLOC (1,</div><div class='del'>-                                           sizeof (struct alu_threshold),</div><div class='del'>-                                           gf_alu_mt_alu_threshold);</div><div class='del'>-			ERR_ABORT (_threshold_fn);</div><div class='del'>-			_threshold_fn-&gt;diff_value = get_max_diff_disk_usage;</div><div class='del'>-			_threshold_fn-&gt;sched_value = get_stats_disk_usage;</div><div class='del'>-			entry_fn = </div><div class='del'>-				dict_get (xl-&gt;options, </div><div class='del'>-					  "scheduler.alu.disk-usage.entry-threshold");</div><div class='del'>-			if (entry_fn) {</div><div class='del'>-				if (gf_string2bytesize (entry_fn-&gt;data, </div><div class='del'>-							&amp;alu_sched-&gt;entry_limit.disk_usage) != 0) {</div><div class='del'>-					gf_log (xl-&gt;name, GF_LOG_ERROR, </div><div class='del'>-						"invalid number format \"%s\" "</div><div class='del'>-						"of \"option scheduler.alu."</div><div class='del'>-						"disk-usage.entry-threshold\"",</div><div class='del'>-						entry_fn-&gt;data);</div><div class='del'>-					return -1;</div><div class='del'>-				}</div><div class='del'>-			} else {</div><div class='del'>-				alu_sched-&gt;entry_limit.disk_usage = ALU_DISK_USAGE_ENTRY_THRESHOLD_DEFAULT;</div><div class='del'>-			}</div><div class='del'>-			_threshold_fn-&gt;entry_value = get_stats_disk_usage;</div><div class='del'>-			exit_fn = dict_get (xl-&gt;options, </div><div class='del'>-					    "scheduler.alu.disk-usage.exit-threshold");</div><div class='del'>-			if (exit_fn) {</div><div class='del'>-				if (gf_string2bytesize (exit_fn-&gt;data, &amp;alu_sched-&gt;exit_limit.disk_usage) != 0)	{</div><div class='del'>-					gf_log (xl-&gt;name, GF_LOG_ERROR, </div><div class='del'>-						"invalid number format \"%s\" "</div><div class='del'>-						"of \"option scheduler.alu."</div><div class='del'>-						"disk-usage.exit-threshold\"", </div><div class='del'>-						exit_fn-&gt;data);</div><div class='del'>-					return -1;</div><div class='del'>-				}</div><div class='del'>-			} else {</div><div class='del'>-				alu_sched-&gt;exit_limit.disk_usage = ALU_DISK_USAGE_EXIT_THRESHOLD_DEFAULT;</div><div class='del'>-			}</div><div class='del'>-			_threshold_fn-&gt;exit_value = get_stats_disk_usage;</div><div class='del'>-			tmp_threshold = alu_sched-&gt;threshold_fn;</div><div class='del'>-			if (!tmp_threshold) {</div><div class='del'>-				alu_sched-&gt;threshold_fn = _threshold_fn;</div><div class='del'>-			} else {</div><div class='del'>-				while (tmp_threshold-&gt;next) {</div><div class='del'>-					tmp_threshold = tmp_threshold-&gt;next;</div><div class='del'>-				}</div><div class='del'>-				tmp_threshold-&gt;next = _threshold_fn;</div><div class='del'>-			}</div><div class='del'>-			gf_log ("alu",</div><div class='del'>-				GF_LOG_DEBUG, "alu_init: = %"PRId64",%"PRId64"", </div><div class='del'>-				alu_sched-&gt;entry_limit.disk_usage, </div><div class='del'>-				alu_sched-&gt;exit_limit.disk_usage);</div><div class='del'>-			</div><div class='del'>-		} else if (strcmp (order_str, "write-usage") == 0) {</div><div class='del'>-			/* Handle "write-usage" */</div><div class='del'>-			</div><div class='del'>-			_threshold_fn = GF_CALLOC (1, sizeof (struct alu_threshold), gf_alu_mt_alu_threshold);</div><div class='del'>-			ERR_ABORT (_threshold_fn);</div><div class='del'>-			_threshold_fn-&gt;diff_value = get_max_diff_write_usage;</div><div class='del'>-			_threshold_fn-&gt;sched_value = get_stats_write_usage;</div><div class='del'>-			entry_fn = dict_get (xl-&gt;options, </div><div class='del'>-					     "scheduler.alu.write-usage.entry-threshold");</div><div class='del'>-			if (entry_fn) {</div><div class='del'>-				if (gf_string2bytesize (entry_fn-&gt;data, </div><div class='del'>-							&amp;alu_sched-&gt;entry_limit.write_usage) != 0) {</div><div class='del'>-					gf_log (xl-&gt;name, GF_LOG_ERROR, </div><div class='del'>-						"invalid number format \"%s\" "</div><div class='del'>-						"of option scheduler.alu."</div><div class='del'>-						"write-usage.entry-threshold", </div><div class='del'>-						entry_fn-&gt;data);</div><div class='del'>-					return -1;</div><div class='del'>-				}</div><div class='del'>-			} else {</div><div class='del'>-				alu_sched-&gt;entry_limit.write_usage = ALU_WRITE_USAGE_ENTRY_THRESHOLD_DEFAULT;</div><div class='del'>-			}</div><div class='del'>-			_threshold_fn-&gt;entry_value = get_stats_write_usage;</div><div class='del'>-			exit_fn = dict_get (xl-&gt;options, </div><div class='del'>-					    "scheduler.alu.write-usage.exit-threshold");</div><div class='del'>-			if (exit_fn) {</div><div class='del'>-				if (gf_string2bytesize (exit_fn-&gt;data, </div><div class='del'>-							&amp;alu_sched-&gt;exit_limit.write_usage) != 0) {</div><div class='del'>-					gf_log (xl-&gt;name, GF_LOG_ERROR, </div><div class='del'>-						"invalid number format \"%s\""</div><div class='del'>-						" of \"option scheduler.alu."</div><div class='del'>-						"write-usage.exit-threshold\"",</div><div class='del'>-						exit_fn-&gt;data);</div><div class='del'>-					return -1;</div><div class='del'>-				}</div><div class='del'>-			} else {</div><div class='del'>-				alu_sched-&gt;exit_limit.write_usage = ALU_WRITE_USAGE_EXIT_THRESHOLD_DEFAULT;</div><div class='del'>-			}</div><div class='del'>-			_threshold_fn-&gt;exit_value = get_stats_write_usage;</div><div class='del'>-			tmp_threshold = alu_sched-&gt;threshold_fn;</div><div class='del'>-			if (!tmp_threshold) {</div><div class='del'>-				alu_sched-&gt;threshold_fn = _threshold_fn;</div><div class='del'>-			} else {</div><div class='del'>-				while (tmp_threshold-&gt;next) {</div><div class='del'>-					tmp_threshold = tmp_threshold-&gt;next;</div><div class='del'>-				}</div><div class='del'>-				tmp_threshold-&gt;next = _threshold_fn;</div><div class='del'>-			}</div><div class='del'>-			gf_log (xl-&gt;name, GF_LOG_DEBUG, </div><div class='del'>-				"alu_init: = %"PRId64",%"PRId64"", </div><div class='del'>-				alu_sched-&gt;entry_limit.write_usage, </div><div class='del'>-				alu_sched-&gt;exit_limit.write_usage);</div><div class='del'>-			</div><div class='del'>-		} else if (strcmp (order_str, "read-usage") == 0) {</div><div class='del'>-			/* Read usage */</div><div class='del'>-			</div><div class='del'>-			_threshold_fn = GF_CALLOC (1, sizeof (struct alu_threshold), gf_alu_mt_alu_threshold);</div><div class='del'>-			ERR_ABORT (_threshold_fn);</div><div class='del'>-			_threshold_fn-&gt;diff_value = get_max_diff_read_usage;</div><div class='del'>-			_threshold_fn-&gt;sched_value = get_stats_read_usage;</div><div class='del'>-			entry_fn = dict_get (xl-&gt;options, </div><div class='del'>-					     "scheduler.alu.read-usage.entry-threshold");</div><div class='del'>-			if (entry_fn) {</div><div class='del'>-				if (gf_string2bytesize (entry_fn-&gt;data, </div><div class='del'>-							&amp;alu_sched-&gt;entry_limit.read_usage) != 0) {</div><div class='del'>-					gf_log (xl-&gt;name, </div><div class='del'>-						GF_LOG_ERROR, </div><div class='del'>-						"invalid number format \"%s\" "</div><div class='del'>-						"of \"option scheduler.alu."</div><div class='del'>-						"read-usage.entry-threshold\"",</div><div class='del'>-						entry_fn-&gt;data);</div><div class='del'>-					return -1;</div><div class='del'>-				}</div><div class='del'>-			} else {</div><div class='del'>-				alu_sched-&gt;entry_limit.read_usage = ALU_READ_USAGE_ENTRY_THRESHOLD_DEFAULT;</div><div class='del'>-			}</div><div class='del'>-			_threshold_fn-&gt;entry_value = get_stats_read_usage;</div><div class='del'>-			exit_fn = dict_get (xl-&gt;options, </div><div class='del'>-					    "scheduler.alu.read-usage.exit-threshold");</div><div class='del'>-			if (exit_fn)</div><div class='del'>-			{</div><div class='del'>-				if (gf_string2bytesize (exit_fn-&gt;data, </div><div class='del'>-							&amp;alu_sched-&gt;exit_limit.read_usage) != 0)</div><div class='del'>-				{</div><div class='del'>-					gf_log ("alu", GF_LOG_ERROR, </div><div class='del'>-						"invalid number format \"%s\" "</div><div class='del'>-						"of \"option scheduler.alu."</div><div class='del'>-						"read-usage.exit-threshold\"", </div><div class='del'>-						exit_fn-&gt;data);</div><div class='del'>-					return -1;</div><div class='del'>-				}</div><div class='del'>-			}</div><div class='del'>-			else</div><div class='del'>-			{</div><div class='del'>-				alu_sched-&gt;exit_limit.read_usage = ALU_READ_USAGE_EXIT_THRESHOLD_DEFAULT;</div><div class='del'>-			}</div><div class='del'>-			_threshold_fn-&gt;exit_value = get_stats_read_usage;</div><div class='del'>-			tmp_threshold = alu_sched-&gt;threshold_fn;</div><div class='del'>-			if (!tmp_threshold) {</div><div class='del'>-				alu_sched-&gt;threshold_fn = _threshold_fn;</div><div class='del'>-			}</div><div class='del'>-			else {</div><div class='del'>-				while (tmp_threshold-&gt;next) {</div><div class='del'>-					tmp_threshold = tmp_threshold-&gt;next;</div><div class='del'>-				}</div><div class='del'>-				tmp_threshold-&gt;next = _threshold_fn;</div><div class='del'>-			}</div><div class='del'>-			gf_log ("alu", GF_LOG_DEBUG, </div><div class='del'>-				"alu_init: = %"PRId64",%"PRId64"", </div><div class='del'>-				alu_sched-&gt;entry_limit.read_usage, </div><div class='del'>-				alu_sched-&gt;exit_limit.read_usage);</div><div class='del'>-			</div><div class='del'>-		} else if (strcmp (order_str, "open-files-usage") == 0) {</div><div class='del'>-			/* Open files counter */</div><div class='del'>-			</div><div class='del'>-			_threshold_fn = GF_CALLOC (1, sizeof (struct alu_threshold), gf_alu_mt_alu_threshold);</div><div class='del'>-			ERR_ABORT (_threshold_fn);</div><div class='del'>-			_threshold_fn-&gt;diff_value = get_max_diff_file_usage;</div><div class='del'>-			_threshold_fn-&gt;sched_value = get_stats_file_usage;</div><div class='del'>-			entry_fn = dict_get (xl-&gt;options, </div><div class='del'>-					     "scheduler.alu.open-files-usage.entry-threshold");</div><div class='del'>-			if (entry_fn) {</div><div class='del'>-				if (gf_string2uint64 (entry_fn-&gt;data, </div><div class='del'>-						      &amp;alu_sched-&gt;entry_limit.nr_files) != 0)</div><div class='del'>-				{</div><div class='del'>-					gf_log ("alu", GF_LOG_ERROR, </div><div class='del'>-						"invalid number format \"%s\" "</div><div class='del'>-						"of \"option scheduler.alu."</div><div class='del'>-						"open-files-usage.entry-"</div><div class='del'>-						"threshold\"", entry_fn-&gt;data);</div><div class='del'>-					return -1;</div><div class='del'>-				}</div><div class='del'>-			}</div><div class='del'>-			else</div><div class='del'>-			{</div><div class='del'>-				alu_sched-&gt;entry_limit.nr_files = ALU_OPEN_FILES_USAGE_ENTRY_THRESHOLD_DEFAULT;</div><div class='del'>-			}</div><div class='del'>-			_threshold_fn-&gt;entry_value = get_stats_file_usage;</div><div class='del'>-			exit_fn = dict_get (xl-&gt;options, </div><div class='del'>-					    "scheduler.alu.open-files-usage.exit-threshold");</div><div class='del'>-			if (exit_fn)</div><div class='del'>-			{</div><div class='del'>-				if (gf_string2uint64 (exit_fn-&gt;data, </div><div class='del'>-						      &amp;alu_sched-&gt;exit_limit.nr_files) != 0)</div><div class='del'>-				{</div><div class='del'>-					gf_log ("alu", GF_LOG_ERROR, </div><div class='del'>-						"invalid number format \"%s\" "</div><div class='del'>-						"of \"option scheduler.alu."</div><div class='del'>-						"open-files-usage.exit-"</div><div class='del'>-						"threshold\"", exit_fn-&gt;data);</div><div class='del'>-					return -1;</div><div class='del'>-				}</div><div class='del'>-			}</div><div class='del'>-			else</div><div class='del'>-			{</div><div class='del'>-				alu_sched-&gt;exit_limit.nr_files = ALU_OPEN_FILES_USAGE_EXIT_THRESHOLD_DEFAULT;</div><div class='del'>-			}</div><div class='del'>-			_threshold_fn-&gt;exit_value = get_stats_file_usage;</div><div class='del'>-			tmp_threshold = alu_sched-&gt;threshold_fn;</div><div class='del'>-			if (!tmp_threshold) {</div><div class='del'>-				alu_sched-&gt;threshold_fn = _threshold_fn;</div><div class='del'>-			}</div><div class='del'>-			else {</div><div class='del'>-				while (tmp_threshold-&gt;next) {</div><div class='del'>-					tmp_threshold = tmp_threshold-&gt;next;</div><div class='del'>-				}</div><div class='del'>-				tmp_threshold-&gt;next = _threshold_fn;</div><div class='del'>-			}</div><div class='del'>-			gf_log ("alu", GF_LOG_DEBUG, </div><div class='del'>-				"alu.c-&gt;alu_init: = %"PRIu64",%"PRIu64"", </div><div class='del'>-				alu_sched-&gt;entry_limit.nr_files, </div><div class='del'>-				alu_sched-&gt;exit_limit.nr_files);</div><div class='del'>-			</div><div class='del'>-		} else if (strcmp (order_str, "disk-speed-usage") == 0) {</div><div class='del'>-			/* Disk speed */</div><div class='del'>-			</div><div class='del'>-			_threshold_fn = GF_CALLOC (1, sizeof (struct alu_threshold), gf_alu_mt_alu_threshold);</div><div class='del'>-			ERR_ABORT (_threshold_fn);</div><div class='del'>-			_threshold_fn-&gt;diff_value = get_max_diff_disk_speed;</div><div class='del'>-			_threshold_fn-&gt;sched_value = get_stats_disk_speed;</div><div class='del'>-			entry_fn = dict_get (xl-&gt;options, </div><div class='del'>-					     "scheduler.alu.disk-speed-usage.entry-threshold");</div><div class='del'>-			if (entry_fn) {</div><div class='del'>-				gf_log ("alu", GF_LOG_DEBUG,</div><div class='del'>-					"entry-threshold is given, "</div><div class='del'>-					"value is constant");</div><div class='del'>-			}</div><div class='del'>-			_threshold_fn-&gt;entry_value = NULL;</div><div class='del'>-			exit_fn = dict_get (xl-&gt;options, </div><div class='del'>-					    "scheduler.alu.disk-speed-usage.exit-threshold");</div><div class='del'>-			if (exit_fn) {</div><div class='del'>-				gf_log ("alu", GF_LOG_DEBUG,</div><div class='del'>-					"exit-threshold is given, "</div><div class='del'>-					"value is constant");</div><div class='del'>-			}</div><div class='del'>-			_threshold_fn-&gt;exit_value = NULL;</div><div class='del'>-			tmp_threshold = alu_sched-&gt;threshold_fn;</div><div class='del'>-			if (!tmp_threshold) {</div><div class='del'>-				alu_sched-&gt;threshold_fn = _threshold_fn;</div><div class='del'>-			}</div><div class='del'>-			else {</div><div class='del'>-				while (tmp_threshold-&gt;next) {</div><div class='del'>-					tmp_threshold = tmp_threshold-&gt;next;</div><div class='del'>-				}</div><div class='del'>-				tmp_threshold-&gt;next = _threshold_fn;</div><div class='del'>-			}</div><div class='del'>-			</div><div class='del'>-		} else {</div><div class='del'>-			gf_log ("alu", GF_LOG_DEBUG,</div><div class='del'>-				"%s, unknown option provided to scheduler",</div><div class='del'>-				order_str);</div><div class='del'>-		}</div><div class='del'>-		order_str = strtok_r (NULL, ":", &amp;tmp_str);</div><div class='del'>-	}</div><div class='del'>-	</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-static int32_t</div><div class='del'>-alu_init (xlator_t *xl)</div><div class='del'>-{</div><div class='del'>-	struct alu_sched *alu_sched = NULL;</div><div class='del'>-	struct alu_limits *_limit_fn = NULL;</div><div class='del'>-	struct alu_limits *tmp_limits = NULL;</div><div class='del'>-	uint32_t min_free_disk = 0;</div><div class='del'>-	data_t *limits = NULL;</div><div class='del'>-  </div><div class='del'>-	alu_sched = GF_CALLOC (1, sizeof (struct alu_sched),</div><div class='del'>-                               gf_alu_mt_alu_sched);</div><div class='del'>-	ERR_ABORT (alu_sched);</div><div class='del'>-</div><div class='del'>-	{</div><div class='del'>-		alu_parse_options (xl, alu_sched);</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	/* Get the limits */</div><div class='del'>-	</div><div class='del'>-	limits = dict_get (xl-&gt;options, </div><div class='del'>-			   "scheduler.limits.min-free-disk");</div><div class='del'>-	if (limits) {</div><div class='del'>-		_limit_fn = GF_CALLOC (1, sizeof (struct alu_limits),</div><div class='del'>-                                       gf_alu_mt_alu_limits);</div><div class='del'>-		ERR_ABORT (_limit_fn);</div><div class='del'>-		_limit_fn-&gt;min_value = get_stats_free_disk;</div><div class='del'>-		_limit_fn-&gt;cur_value = get_stats_free_disk;</div><div class='del'>-		tmp_limits = alu_sched-&gt;limits_fn ;</div><div class='del'>-		_limit_fn-&gt;next = tmp_limits;</div><div class='del'>-		alu_sched-&gt;limits_fn = _limit_fn;</div><div class='del'>-		</div><div class='del'>-		if (gf_string2percent (limits-&gt;data, </div><div class='del'>-				       &amp;min_free_disk) != 0) {</div><div class='del'>-			gf_log ("alu", GF_LOG_ERROR, </div><div class='del'>-				"invalid number format \"%s\" "</div><div class='del'>-				"of \"option scheduler.limits."</div><div class='del'>-				"min-free-disk\"", limits-&gt;data);</div><div class='del'>-			return -1;</div><div class='del'>-		}</div><div class='del'>-		alu_sched-&gt;spec_limit.free_disk = min_free_disk;</div><div class='del'>-		</div><div class='del'>-		if (alu_sched-&gt;spec_limit.free_disk &gt;= 100) {</div><div class='del'>-			gf_log ("alu", GF_LOG_ERROR,</div><div class='del'>-				"check the \"option scheduler."</div><div class='del'>-				"limits.min-free-disk\", it should "</div><div class='del'>-				"be percentage value");</div><div class='del'>-			return -1;</div><div class='del'>-		}</div><div class='del'>-		alu_sched-&gt;spec_limit.total_disk_size = ALU_LIMITS_TOTAL_DISK_SIZE_DEFAULT; /* Its in % */</div><div class='del'>-		gf_log ("alu", GF_LOG_DEBUG,</div><div class='del'>-			"alu.limit.min-disk-free = %"PRId64"", </div><div class='del'>-			_limit_fn-&gt;cur_value (&amp;(alu_sched-&gt;spec_limit)));</div><div class='del'>-	}</div><div class='del'>-	</div><div class='del'>-	limits = dict_get (xl-&gt;options, </div><div class='del'>-			   "scheduler.limits.max-open-files");</div><div class='del'>-	if (limits) {</div><div class='del'>-		// Update alu_sched-&gt;priority properly</div><div class='del'>-		_limit_fn = GF_CALLOC (1, sizeof (struct alu_limits),</div><div class='del'>-                                       gf_alu_mt_alu_limits);</div><div class='del'>-		ERR_ABORT (_limit_fn);</div><div class='del'>-		_limit_fn-&gt;max_value = get_stats_file_usage;</div><div class='del'>-		_limit_fn-&gt;cur_value = get_stats_file_usage;</div><div class='del'>-		tmp_limits = alu_sched-&gt;limits_fn ;</div><div class='del'>-		_limit_fn-&gt;next = tmp_limits;</div><div class='del'>-		alu_sched-&gt;limits_fn = _limit_fn;</div><div class='del'>-		if (gf_string2uint64_base10 (limits-&gt;data, </div><div class='del'>-					     &amp;alu_sched-&gt;spec_limit.nr_files) != 0)</div><div class='del'>-		{</div><div class='del'>-			gf_log ("alu", GF_LOG_ERROR, </div><div class='del'>-				"invalid number format '%s' of option "</div><div class='del'>-				"scheduler.limits.max-open-files", </div><div class='del'>-				limits-&gt;data);</div><div class='del'>-			return -1;</div><div class='del'>-		}</div><div class='del'>-		</div><div class='del'>-		gf_log ("alu", GF_LOG_DEBUG,</div><div class='del'>-			"alu_init: limit.max-open-files = %"PRId64"",</div><div class='del'>-			_limit_fn-&gt;cur_value (&amp;(alu_sched-&gt;spec_limit)));</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-	/* Stats refresh options */</div><div class='del'>-	limits = dict_get (xl-&gt;options, </div><div class='del'>-			   "scheduler.refresh-interval");</div><div class='del'>-	if (limits) {</div><div class='del'>-		if (gf_string2time (limits-&gt;data, </div><div class='del'>-				    &amp;alu_sched-&gt;refresh_interval) != 0)	{</div><div class='del'>-			gf_log ("alu", GF_LOG_ERROR, </div><div class='del'>-				"invalid number format \"%s\" of "</div><div class='del'>-				"option scheduler.refresh-interval", </div><div class='del'>-				limits-&gt;data);</div><div class='del'>-			return -1;</div><div class='del'>-		}</div><div class='del'>-	} else {</div><div class='del'>-		alu_sched-&gt;refresh_interval = ALU_REFRESH_INTERVAL_DEFAULT;</div><div class='del'>-	}</div><div class='del'>-	gettimeofday (&amp;(alu_sched-&gt;last_stat_fetch), NULL);</div><div class='del'>-	</div><div class='del'>-	</div><div class='del'>-	limits = dict_get (xl-&gt;options, </div><div class='del'>-			   "scheduler.alu.stat-refresh.num-file-create");</div><div class='del'>-	if (limits) {</div><div class='del'>-		if (gf_string2uint32 (limits-&gt;data, </div><div class='del'>-				      &amp;alu_sched-&gt;refresh_create_count) != 0)</div><div class='del'>-		{</div><div class='del'>-			gf_log ("alu", GF_LOG_ERROR, </div><div class='del'>-				"invalid number format \"%s\" of \"option "</div><div class='del'>-				"alu.stat-refresh.num-file-create\"", </div><div class='del'>-				limits-&gt;data);</div><div class='del'>-			return -1;</div><div class='del'>-		}</div><div class='del'>-	} else {</div><div class='del'>-		alu_sched-&gt;refresh_create_count = ALU_REFRESH_CREATE_COUNT_DEFAULT;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	{</div><div class='del'>-		/* Build an array of child_nodes */</div><div class='del'>-		struct alu_sched_struct *sched_array = NULL;</div><div class='del'>-		xlator_list_t *trav_xl = xl-&gt;children;</div><div class='del'>-		data_t *data = NULL;</div><div class='del'>-		int32_t index = 0;</div><div class='del'>-		</div><div class='del'>-		while (trav_xl) {</div><div class='del'>-			index++;</div><div class='del'>-			trav_xl = trav_xl-&gt;next;</div><div class='del'>-		}</div><div class='del'>-		alu_sched-&gt;child_count = index;</div><div class='del'>-		sched_array = GF_CALLOC (index, sizeof (struct alu_sched_struct), gf_alu_mt_alu_sched_struct);</div><div class='del'>-		ERR_ABORT (sched_array);</div><div class='del'>-		trav_xl = xl-&gt;children;</div><div class='del'>-		index = 0;</div><div class='del'>-		while (trav_xl) {</div><div class='del'>-			sched_array[index].xl = trav_xl-&gt;xlator;</div><div class='del'>-			sched_array[index].eligible = 1;</div><div class='del'>-			index++;</div><div class='del'>-			trav_xl = trav_xl-&gt;next;</div><div class='del'>-		}</div><div class='del'>-		alu_sched-&gt;array = sched_array;</div><div class='del'>-</div><div class='del'>-		data = dict_get (xl-&gt;options, </div><div class='del'>-				 "scheduler.read-only-subvolumes");</div><div class='del'>-		if (data) {</div><div class='del'>-			char *child = NULL;</div><div class='del'>-			char *tmp = NULL;</div><div class='del'>-			char *childs_data = gf_strdup (data-&gt;data);</div><div class='del'>-      </div><div class='del'>-			child = strtok_r (childs_data, ",", &amp;tmp);</div><div class='del'>-			while (child) {</div><div class='del'>-				for (index = 1; index &lt; alu_sched-&gt;child_count; index++) {</div><div class='del'>-					if (strcmp (alu_sched-&gt;array[index -1].xl-&gt;name, child) == 0) {</div><div class='del'>-						memcpy (&amp;(alu_sched-&gt;array[index -1]), </div><div class='del'>-							&amp;(alu_sched-&gt;array[alu_sched-&gt;child_count -1]), </div><div class='del'>-							sizeof (struct alu_sched_struct));</div><div class='del'>-						alu_sched-&gt;child_count--;</div><div class='del'>-						break;</div><div class='del'>-					}</div><div class='del'>-				}</div><div class='del'>-				child = strtok_r (NULL, ",", &amp;tmp);</div><div class='del'>-			}</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	*((long *)xl-&gt;private) = (long)alu_sched;</div><div class='del'>-</div><div class='del'>-	/* Initialize all the alu_sched structure's elements */</div><div class='del'>-	{</div><div class='del'>-		alu_sched-&gt;sched_nodes_pending = 0;</div><div class='del'>-</div><div class='del'>-		alu_sched-&gt;min_limit.free_disk = 0x00FFFFFF;</div><div class='del'>-		alu_sched-&gt;min_limit.disk_usage = 0xFFFFFFFF;</div><div class='del'>-		alu_sched-&gt;min_limit.total_disk_size = 0xFFFFFFFF;</div><div class='del'>-		alu_sched-&gt;min_limit.disk_speed = 0xFFFFFFFF;</div><div class='del'>-		alu_sched-&gt;min_limit.write_usage = 0xFFFFFFFF;</div><div class='del'>-		alu_sched-&gt;min_limit.read_usage = 0xFFFFFFFF;</div><div class='del'>-		alu_sched-&gt;min_limit.nr_files = 0xFFFFFFFF;</div><div class='del'>-		alu_sched-&gt;min_limit.nr_clients = 0xFFFFFFFF;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	pthread_mutex_init (&amp;alu_sched-&gt;alu_mutex, NULL);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-static void</div><div class='del'>-alu_fini (xlator_t *xl)</div><div class='del'>-{</div><div class='del'>-	if (!xl)</div><div class='del'>-		return;</div><div class='del'>-	struct alu_sched *alu_sched = (struct alu_sched *)*((long *)xl-&gt;private);</div><div class='del'>-	struct alu_limits *limit = alu_sched-&gt;limits_fn;</div><div class='del'>-	struct alu_threshold *threshold = alu_sched-&gt;threshold_fn;</div><div class='del'>-	void *tmp = NULL;</div><div class='del'>-	pthread_mutex_destroy (&amp;alu_sched-&gt;alu_mutex);</div><div class='del'>-	GF_FREE (alu_sched-&gt;array);</div><div class='del'>-	while (limit) {</div><div class='del'>-		tmp = limit;</div><div class='del'>-		limit = limit-&gt;next;</div><div class='del'>-		GF_FREE (tmp);</div><div class='del'>-	}</div><div class='del'>-	while (threshold) {</div><div class='del'>-		tmp = threshold;</div><div class='del'>-		threshold = threshold-&gt;next;</div><div class='del'>-		GF_FREE (tmp);</div><div class='del'>-	}</div><div class='del'>-	GF_FREE (alu_sched);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-static int32_t </div><div class='del'>-update_stat_array_cbk (call_frame_t *frame,</div><div class='del'>-		       void *cookie,</div><div class='del'>-		       xlator_t *xl,</div><div class='del'>-		       int32_t op_ret,</div><div class='del'>-		       int32_t op_errno,</div><div class='del'>-		       struct xlator_stats *trav_stats)</div><div class='del'>-{</div><div class='del'>-	struct alu_sched *alu_sched = (struct alu_sched *)*((long *)xl-&gt;private);</div><div class='del'>-	struct alu_limits *limits_fn = alu_sched-&gt;limits_fn;</div><div class='del'>-	int32_t idx = 0;</div><div class='del'>-  </div><div class='del'>-	pthread_mutex_lock (&amp;alu_sched-&gt;alu_mutex);</div><div class='del'>-	for (idx = 0; idx &lt; alu_sched-&gt;child_count; idx++) {</div><div class='del'>-		if (alu_sched-&gt;array[idx].xl == (xlator_t *)cookie)</div><div class='del'>-			break;</div><div class='del'>-	}</div><div class='del'>-	pthread_mutex_unlock (&amp;alu_sched-&gt;alu_mutex);</div><div class='del'>-</div><div class='del'>-	if (op_ret == -1) {</div><div class='del'>-		alu_sched-&gt;array[idx].eligible = 0;</div><div class='del'>-	} else {</div><div class='del'>-		memcpy (&amp;(alu_sched-&gt;array[idx].stats), trav_stats, sizeof (struct xlator_stats));</div><div class='del'>-    </div><div class='del'>-		/* Get stats from all the child node */</div><div class='del'>-		/* Here check the limits specified by the user to </div><div class='del'>-		   consider the nodes to be used by scheduler */</div><div class='del'>-		alu_sched-&gt;array[idx].eligible = 1;</div><div class='del'>-		limits_fn = alu_sched-&gt;limits_fn;</div><div class='del'>-		while (limits_fn){</div><div class='del'>-			if (limits_fn-&gt;max_value &amp;&amp; </div><div class='del'>-			    (limits_fn-&gt;cur_value (trav_stats) &gt; </div><div class='del'>-			     limits_fn-&gt;max_value (&amp;(alu_sched-&gt;spec_limit)))) {</div><div class='del'>-				alu_sched-&gt;array[idx].eligible = 0;</div><div class='del'>-			}</div><div class='del'>-			if (limits_fn-&gt;min_value &amp;&amp; </div><div class='del'>-			    (limits_fn-&gt;cur_value (trav_stats) &lt; </div><div class='del'>-			     limits_fn-&gt;min_value (&amp;(alu_sched-&gt;spec_limit)))) {</div><div class='del'>-				alu_sched-&gt;array[idx].eligible = 0;</div><div class='del'>-			}</div><div class='del'>-			limits_fn = limits_fn-&gt;next;</div><div class='del'>-		}</div><div class='del'>-</div><div class='del'>-		/* Select minimum and maximum disk_usage */</div><div class='del'>-		if (trav_stats-&gt;disk_usage &gt; alu_sched-&gt;max_limit.disk_usage) {</div><div class='del'>-			alu_sched-&gt;max_limit.disk_usage = trav_stats-&gt;disk_usage;</div><div class='del'>-		}</div><div class='del'>-		if (trav_stats-&gt;disk_usage &lt; alu_sched-&gt;min_limit.disk_usage) {</div><div class='del'>-			alu_sched-&gt;min_limit.disk_usage = trav_stats-&gt;disk_usage;</div><div class='del'>-		}</div><div class='del'>-</div><div class='del'>-		/* Select minimum and maximum disk_speed */</div><div class='del'>-		if (trav_stats-&gt;disk_speed &gt; alu_sched-&gt;max_limit.disk_speed) {</div><div class='del'>-			alu_sched-&gt;max_limit.disk_speed = trav_stats-&gt;disk_speed;</div><div class='del'>-		}</div><div class='del'>-		if (trav_stats-&gt;disk_speed &lt; alu_sched-&gt;min_limit.disk_speed) {</div><div class='del'>-			alu_sched-&gt;min_limit.disk_speed = trav_stats-&gt;disk_speed;</div><div class='del'>-		}</div><div class='del'>-</div><div class='del'>-		/* Select minimum and maximum number of open files */</div><div class='del'>-		if (trav_stats-&gt;nr_files &gt; alu_sched-&gt;max_limit.nr_files) {</div><div class='del'>-			alu_sched-&gt;max_limit.nr_files = trav_stats-&gt;nr_files;</div><div class='del'>-		}</div><div class='del'>-		if (trav_stats-&gt;nr_files &lt; alu_sched-&gt;min_limit.nr_files) {</div><div class='del'>-			alu_sched-&gt;min_limit.nr_files = trav_stats-&gt;nr_files;</div><div class='del'>-		}</div><div class='del'>-</div><div class='del'>-		/* Select minimum and maximum write-usage */</div><div class='del'>-		if (trav_stats-&gt;write_usage &gt; alu_sched-&gt;max_limit.write_usage) {</div><div class='del'>-			alu_sched-&gt;max_limit.write_usage = trav_stats-&gt;write_usage;</div><div class='del'>-		}</div><div class='del'>-		if (trav_stats-&gt;write_usage &lt; alu_sched-&gt;min_limit.write_usage) {</div><div class='del'>-			alu_sched-&gt;min_limit.write_usage = trav_stats-&gt;write_usage;</div><div class='del'>-		}</div><div class='del'>-</div><div class='del'>-		/* Select minimum and maximum read-usage */</div><div class='del'>-		if (trav_stats-&gt;read_usage &gt; alu_sched-&gt;max_limit.read_usage) {</div><div class='del'>-			alu_sched-&gt;max_limit.read_usage = trav_stats-&gt;read_usage;</div><div class='del'>-		}</div><div class='del'>-		if (trav_stats-&gt;read_usage &lt; alu_sched-&gt;min_limit.read_usage) {</div><div class='del'>-			alu_sched-&gt;min_limit.read_usage = trav_stats-&gt;read_usage;</div><div class='del'>-		}</div><div class='del'>-</div><div class='del'>-		/* Select minimum and maximum free-disk */</div><div class='del'>-		if (trav_stats-&gt;free_disk &gt; alu_sched-&gt;max_limit.free_disk) {</div><div class='del'>-			alu_sched-&gt;max_limit.free_disk = trav_stats-&gt;free_disk;</div><div class='del'>-		}</div><div class='del'>-		if (trav_stats-&gt;free_disk &lt; alu_sched-&gt;min_limit.free_disk) {</div><div class='del'>-			alu_sched-&gt;min_limit.free_disk = trav_stats-&gt;free_disk;</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	STACK_DESTROY (frame-&gt;root);</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-static void </div><div class='del'>-update_stat_array (xlator_t *xl)</div><div class='del'>-{</div><div class='del'>-	/* This function schedules the file in one of the child nodes */</div><div class='del'>-	struct alu_sched *alu_sched = (struct alu_sched *)*((long *)xl-&gt;private);</div><div class='del'>-	int32_t idx = 0;</div><div class='del'>-	call_frame_t *frame = NULL;</div><div class='del'>-	call_pool_t *pool = xl-&gt;ctx-&gt;pool;</div><div class='del'>-</div><div class='del'>-	for (idx = 0 ; idx &lt; alu_sched-&gt;child_count; idx++) {</div><div class='del'>-		frame = create_frame (xl, pool);</div><div class='del'>-</div><div class='del'>-		STACK_WIND_COOKIE (frame,</div><div class='del'>-				   update_stat_array_cbk, </div><div class='del'>-				   alu_sched-&gt;array[idx].xl, //cookie</div><div class='del'>-				   alu_sched-&gt;array[idx].xl, </div><div class='del'>-				   (alu_sched-&gt;array[idx].xl)-&gt;mops-&gt;stats,</div><div class='del'>-				   0); //flag</div><div class='del'>-	}</div><div class='del'>-	return;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-static void </div><div class='del'>-alu_update (xlator_t *xl)</div><div class='del'>-{</div><div class='del'>-	struct timeval tv;</div><div class='del'>-	struct alu_sched *alu_sched = (struct alu_sched *)*((long *)xl-&gt;private);</div><div class='del'>-</div><div class='del'>-	gettimeofday (&amp;tv, NULL);</div><div class='del'>-	if (tv.tv_sec &gt; (alu_sched-&gt;refresh_interval + alu_sched-&gt;last_stat_fetch.tv_sec)) {</div><div class='del'>-		/* Update the stats from all the server */</div><div class='del'>-		update_stat_array (xl);</div><div class='del'>-		alu_sched-&gt;last_stat_fetch.tv_sec = tv.tv_sec;</div><div class='del'>-	}</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-static xlator_t *</div><div class='del'>-alu_scheduler (xlator_t *xl, const void *path)</div><div class='del'>-{</div><div class='del'>-	/* This function schedules the file in one of the child nodes */</div><div class='del'>-	struct alu_sched *alu_sched = (struct alu_sched *)*((long *)xl-&gt;private);</div><div class='del'>-	int32_t sched_index = 0;</div><div class='del'>-	int32_t sched_index_orig = 0;</div><div class='del'>-	int32_t idx = 0;</div><div class='del'>-</div><div class='del'>-	alu_update (xl);</div><div class='del'>-</div><div class='del'>-	/* Now check each threshold one by one if some nodes are classified */</div><div class='del'>-	{</div><div class='del'>-		struct alu_threshold *trav_threshold = alu_sched-&gt;threshold_fn;</div><div class='del'>-		struct alu_threshold *tmp_threshold = alu_sched-&gt;sched_method;</div><div class='del'>-		struct alu_sched_node *tmp_sched_node;   </div><div class='del'>-</div><div class='del'>-		/* This pointer 'trav_threshold' contains function pointers according to spec file</div><div class='del'>-		   give by user, */</div><div class='del'>-		while (trav_threshold) {</div><div class='del'>-			/* This check is needed for seeing if already there are nodes in this criteria </div><div class='del'>-			   to be scheduled */</div><div class='del'>-			if (!alu_sched-&gt;sched_nodes_pending) {</div><div class='del'>-				for (idx = 0; idx &lt; alu_sched-&gt;child_count; idx++) {</div><div class='del'>-					if (!alu_sched-&gt;array[idx].eligible) {</div><div class='del'>-						continue;</div><div class='del'>-					}</div><div class='del'>-					if (trav_threshold-&gt;entry_value) {</div><div class='del'>-						if (trav_threshold-&gt;diff_value (&amp;(alu_sched-&gt;max_limit),</div><div class='del'>-										&amp;(alu_sched-&gt;array[idx].stats)) &lt;</div><div class='del'>-						    trav_threshold-&gt;entry_value (&amp;(alu_sched-&gt;entry_limit))) {</div><div class='del'>-							continue;</div><div class='del'>-						}</div><div class='del'>-					}</div><div class='del'>-					tmp_sched_node = GF_CALLOC (1, sizeof (struct alu_sched_node), gf_alu_mt_alu_sched_node);</div><div class='del'>-					ERR_ABORT (tmp_sched_node);</div><div class='del'>-					tmp_sched_node-&gt;index = idx;</div><div class='del'>-					if (!alu_sched-&gt;sched_node) {</div><div class='del'>-						alu_sched-&gt;sched_node = tmp_sched_node;</div><div class='del'>-					} else {</div><div class='del'>-						pthread_mutex_lock (&amp;alu_sched-&gt;alu_mutex);</div><div class='del'>-						tmp_sched_node-&gt;next = alu_sched-&gt;sched_node;</div><div class='del'>-						alu_sched-&gt;sched_node = tmp_sched_node;</div><div class='del'>-						pthread_mutex_unlock (&amp;alu_sched-&gt;alu_mutex);</div><div class='del'>-					}</div><div class='del'>-					alu_sched-&gt;sched_nodes_pending++;</div><div class='del'>-				}</div><div class='del'>-			} /* end of if (sched_nodes_pending) */</div><div class='del'>-</div><div class='del'>-			/* This loop is required to check the eligible nodes */</div><div class='del'>-			struct alu_sched_node *trav_sched_node;</div><div class='del'>-			while (alu_sched-&gt;sched_nodes_pending) {</div><div class='del'>-				trav_sched_node = alu_sched-&gt;sched_node;</div><div class='del'>-				sched_index = trav_sched_node-&gt;index;</div><div class='del'>-				if (alu_sched-&gt;array[sched_index].eligible)</div><div class='del'>-					break;</div><div class='del'>-				alu_sched-&gt;sched_node = trav_sched_node-&gt;next;</div><div class='del'>-				GF_FREE (trav_sched_node);</div><div class='del'>-				alu_sched-&gt;sched_nodes_pending--;</div><div class='del'>-			}</div><div class='del'>-			if (alu_sched-&gt;sched_nodes_pending) {</div><div class='del'>-				/* There are some node in this criteria to be scheduled, no need </div><div class='del'>-				 * to sort and check other methods </div><div class='del'>-				 */</div><div class='del'>-				if (tmp_threshold &amp;&amp; tmp_threshold-&gt;exit_value) {</div><div class='del'>-					/* verify the exit value &amp;&amp; whether node is eligible or not */</div><div class='del'>-					if (tmp_threshold-&gt;diff_value (&amp;(alu_sched-&gt;max_limit),</div><div class='del'>-								       &amp;(alu_sched-&gt;array[sched_index].stats)) &gt;</div><div class='del'>-					    tmp_threshold-&gt;exit_value (&amp;(alu_sched-&gt;exit_limit))) {</div><div class='del'>-						/* Free the allocated info for the node :) */</div><div class='del'>-						pthread_mutex_lock (&amp;alu_sched-&gt;alu_mutex);</div><div class='del'>-						alu_sched-&gt;sched_node = trav_sched_node-&gt;next;</div><div class='del'>-						GF_FREE (trav_sched_node);</div><div class='del'>-						trav_sched_node = alu_sched-&gt;sched_node;</div><div class='del'>-						alu_sched-&gt;sched_nodes_pending--;</div><div class='del'>-						pthread_mutex_unlock (&amp;alu_sched-&gt;alu_mutex);</div><div class='del'>-					}</div><div class='del'>-				} else {</div><div class='del'>-					/* if there is no exit value, then exit after scheduling once */</div><div class='del'>-					pthread_mutex_lock (&amp;alu_sched-&gt;alu_mutex);</div><div class='del'>-					alu_sched-&gt;sched_node = trav_sched_node-&gt;next;</div><div class='del'>-					GF_FREE (trav_sched_node);</div><div class='del'>-					trav_sched_node = alu_sched-&gt;sched_node;</div><div class='del'>-					alu_sched-&gt;sched_nodes_pending--;</div><div class='del'>-					pthread_mutex_unlock (&amp;alu_sched-&gt;alu_mutex);</div><div class='del'>-				}</div><div class='del'>-	</div><div class='del'>-				alu_sched-&gt;sched_method = tmp_threshold; /* this is the method used for selecting */</div><div class='del'>-</div><div class='del'>-				/* */</div><div class='del'>-				if (trav_sched_node) {</div><div class='del'>-					tmp_sched_node = trav_sched_node;</div><div class='del'>-					while (trav_sched_node-&gt;next) {</div><div class='del'>-						trav_sched_node = trav_sched_node-&gt;next;</div><div class='del'>-					}</div><div class='del'>-					if (tmp_sched_node-&gt;next) {</div><div class='del'>-						pthread_mutex_lock (&amp;alu_sched-&gt;alu_mutex);</div><div class='del'>-						alu_sched-&gt;sched_node = tmp_sched_node-&gt;next;</div><div class='del'>-						tmp_sched_node-&gt;next = NULL;</div><div class='del'>-						trav_sched_node-&gt;next = tmp_sched_node;</div><div class='del'>-						pthread_mutex_unlock (&amp;alu_sched-&gt;alu_mutex);</div><div class='del'>-					}</div><div class='del'>-				}</div><div class='del'>-				/* return the scheduled node */</div><div class='del'>-				return alu_sched-&gt;array[sched_index].xl;</div><div class='del'>-			} /* end of if (pending_nodes) */</div><div class='del'>-      </div><div class='del'>-			tmp_threshold = trav_threshold;</div><div class='del'>-			trav_threshold = trav_threshold-&gt;next;</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='del'>-  </div><div class='del'>-	/* This is used only when there is everything seems ok, or no eligible nodes */</div><div class='del'>-	sched_index_orig = alu_sched-&gt;sched_index;</div><div class='del'>-	alu_sched-&gt;sched_method = NULL;</div><div class='del'>-	while (1) {</div><div class='del'>-		//lock</div><div class='del'>-		pthread_mutex_lock (&amp;alu_sched-&gt;alu_mutex);</div><div class='del'>-		sched_index = alu_sched-&gt;sched_index++;</div><div class='del'>-		alu_sched-&gt;sched_index = alu_sched-&gt;sched_index % alu_sched-&gt;child_count;</div><div class='del'>-		pthread_mutex_unlock (&amp;alu_sched-&gt;alu_mutex);</div><div class='del'>-		//unlock</div><div class='del'>-		if (alu_sched-&gt;array[sched_index].eligible)</div><div class='del'>-			break;</div><div class='del'>-		if (sched_index_orig == (sched_index + 1) % alu_sched-&gt;child_count) {</div><div class='del'>-			gf_log ("alu", GF_LOG_WARNING, "No node is eligible to schedule");</div><div class='del'>-			//lock</div><div class='del'>-			pthread_mutex_lock (&amp;alu_sched-&gt;alu_mutex);</div><div class='del'>-			alu_sched-&gt;sched_index++;</div><div class='del'>-			alu_sched-&gt;sched_index = alu_sched-&gt;sched_index % alu_sched-&gt;child_count;</div><div class='del'>-			pthread_mutex_unlock (&amp;alu_sched-&gt;alu_mutex);</div><div class='del'>-			//unlock</div><div class='del'>-			break;</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='del'>-	return alu_sched-&gt;array[sched_index].xl;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-/**</div><div class='del'>- * notify</div><div class='del'>- */</div><div class='del'>-void</div><div class='del'>-alu_notify (xlator_t *xl, int32_t event, void *data)</div><div class='del'>-{</div><div class='del'>-	struct alu_sched *alu_sched = NULL; </div><div class='del'>-	int32_t idx = 0;</div><div class='del'>-  </div><div class='del'>-	alu_sched = (struct alu_sched *)*((long *)xl-&gt;private);</div><div class='del'>-	if (!alu_sched)</div><div class='del'>-		return;</div><div class='del'>-</div><div class='del'>-	for (idx = 0; idx &lt; alu_sched-&gt;child_count; idx++) {</div><div class='del'>-		if (alu_sched-&gt;array[idx].xl == (xlator_t *)data)</div><div class='del'>-			break;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	switch (event)</div><div class='del'>-	{</div><div class='del'>-	case GF_EVENT_CHILD_UP:</div><div class='del'>-	{</div><div class='del'>-		//alu_sched-&gt;array[idx].eligible = 1;</div><div class='del'>-	}</div><div class='del'>-	break;</div><div class='del'>-	case GF_EVENT_CHILD_DOWN:</div><div class='del'>-	{</div><div class='del'>-		alu_sched-&gt;array[idx].eligible = 0;</div><div class='del'>-	}</div><div class='del'>-	break;</div><div class='del'>-	default:</div><div class='del'>-	{</div><div class='del'>-		;</div><div class='del'>-	}</div><div class='del'>-	break;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-alu_mem_acct_init (xlator_t *this)</div><div class='del'>-{</div><div class='del'>-        int     ret = -1;</div><div class='del'>-</div><div class='del'>-        if (!this)</div><div class='del'>-                return ret;</div><div class='del'>-</div><div class='del'>-        ret = xlator_mem_acct_init (this, gf_alu_mt_end + 1);</div><div class='del'>-        </div><div class='del'>-        if (ret != 0) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_ERROR, "Memory accounting init"</div><div class='del'>-                                "failed");</div><div class='del'>-                return ret;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-struct sched_ops sched = {</div><div class='del'>-	.init     = alu_init,</div><div class='del'>-	.fini     = alu_fini,</div><div class='del'>-	.update   = alu_update,</div><div class='del'>-	.schedule = alu_scheduler,</div><div class='del'>-	.notify   = alu_notify,</div><div class='del'>-        .mem_acct_init = alu_mem_acct_init,</div><div class='del'>-};</div><div class='del'>-</div><div class='del'>-struct volume_options options[] = {</div><div class='del'>-	{ .key   = { "scheduler.alu.order", "alu.order" },  </div><div class='del'>-	  .type  = GF_OPTION_TYPE_ANY </div><div class='del'>-	},</div><div class='del'>-	{ .key   = { "scheduler.alu.disk-usage.entry-threshold", </div><div class='del'>-		     "alu.disk-usage.entry-threshold" },  </div><div class='del'>-	  .type  = GF_OPTION_TYPE_SIZET</div><div class='del'>-	},</div><div class='del'>-	{ .key   = { "scheduler.alu.disk-usage.exit-threshold", </div><div class='del'>-		     "alu.disk-usage.exit-threshold" },  </div><div class='del'>-	  .type  = GF_OPTION_TYPE_SIZET</div><div class='del'>-	},</div><div class='del'>-	{ .key   = { "scheduler.alu.write-usage.entry-threshold", </div><div class='del'>-		     "alu.write-usage.entry-threshold" },  </div><div class='del'>-	  .type  = GF_OPTION_TYPE_SIZET</div><div class='del'>-	},</div><div class='del'>-	{ .key   = { "scheduler.alu.write-usage.exit-threshold", </div><div class='del'>-		     "alu.write-usage.exit-threshold" },  </div><div class='del'>-	  .type  = GF_OPTION_TYPE_SIZET </div><div class='del'>-	},</div><div class='del'>-	{ .key   = { "scheduler.alu.read-usage.entry-threshold", </div><div class='del'>-		     "alu.read-usage.entry-threshold" },  </div><div class='del'>-	  .type  = GF_OPTION_TYPE_SIZET</div><div class='del'>-	},</div><div class='del'>-	{ .key   = { "scheduler.alu.read-usage.exit-threshold", </div><div class='del'>-		     "alu.read-usage.exit-threshold" },  </div><div class='del'>-	  .type  = GF_OPTION_TYPE_SIZET </div><div class='del'>-	},</div><div class='del'>-	{ .key   = { "scheduler.alu.open-files-usage.entry-threshold", </div><div class='del'>-		     "alu.open-files-usage.entry-threshold" },  </div><div class='del'>-	  .type  = GF_OPTION_TYPE_INT</div><div class='del'>-	},</div><div class='del'>-	{ .key   = { "scheduler.alu.open-files-usage.exit-threshold", </div><div class='del'>-		     "alu.open-files-usage.exit-threshold" },  </div><div class='del'>-	  .type  = GF_OPTION_TYPE_INT </div><div class='del'>-	},</div><div class='del'>-	{ .key   = { "scheduler.read-only-subvolumes",</div><div class='del'>-		     "alu.read-only-subvolumes" },  </div><div class='del'>-	  .type  = GF_OPTION_TYPE_ANY </div><div class='del'>-	},</div><div class='del'>-	{ .key   = { "scheduler.refresh-interval", </div><div class='del'>-		     "alu.refresh-interval",</div><div class='del'>-		     "alu.stat-refresh.interval" },</div><div class='del'>-	  .type  = GF_OPTION_TYPE_TIME</div><div class='del'>-	},</div><div class='del'>-	{ .key   = { "scheduler.limits.min-free-disk", </div><div class='del'>-		     "alu.limits.min-free-disk" },  </div><div class='del'>-	  .type  = GF_OPTION_TYPE_PERCENT</div><div class='del'>-	},</div><div class='del'>-	{ .key   = { "scheduler.alu.stat-refresh.num-file-create"</div><div class='del'>-		     "alu.stat-refresh.num-file-create"},  </div><div class='del'>-	  .type  = GF_OPTION_TYPE_INT</div><div class='del'>-	},</div><div class='del'>-	{ .key  =  {NULL}, }</div><div class='del'>-};</div><div class='head'>diff --git a/scheduler/alu/src/alu.h b/scheduler/alu/src/alu.h<br/>deleted file mode 100644<br/>index 178db917c39..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/scheduler/alu/src/alu.h?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>scheduler/alu/src/alu.h</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,89 +0,0 @@</div><div class='del'>-/*</div><div class='del'>-   Copyright (c) 2006-2009 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='del'>-   This file is part of GlusterFS.</div><div class='del'>-</div><div class='del'>-   GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-   it under the terms of the GNU General Public License as published</div><div class='del'>-   by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-   or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-   GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-   WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-   General Public License for more details.</div><div class='del'>-</div><div class='del'>-   You should have received a copy of the GNU General Public License</div><div class='del'>-   along with this program.  If not, see</div><div class='del'>-   &lt;http://www.gnu.org/licenses/&gt;.</div><div class='del'>-*/</div><div class='del'>-</div><div class='del'>-#ifndef _ALU_H</div><div class='del'>-#define _ALU_H</div><div class='del'>-</div><div class='del'>-#ifndef _CONFIG_H</div><div class='del'>-#define _CONFIG_H</div><div class='del'>-#include "config.h"</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-#include "scheduler.h"</div><div class='del'>-</div><div class='del'>-struct alu_sched;</div><div class='del'>-</div><div class='del'>-struct alu_sched_struct {</div><div class='del'>-  xlator_t *xl;</div><div class='del'>-  struct xlator_stats stats;</div><div class='del'>-  unsigned char eligible;</div><div class='del'>-};</div><div class='del'>-</div><div class='del'>-// Write better name for these functions</div><div class='del'>-struct alu_limits {</div><div class='del'>-  struct alu_limits *next;</div><div class='del'>-  int64_t (*max_value) (struct xlator_stats *); /* Max limit, specified by the user */</div><div class='del'>-  int64_t (*min_value) (struct xlator_stats *); /* Min limit, specified by the user */</div><div class='del'>-  int64_t (*cur_value) (struct xlator_stats *); /* Current values of variables got from stats call */</div><div class='del'>-};</div><div class='del'>-</div><div class='del'>-struct alu_threshold {</div><div class='del'>-  struct alu_threshold *next;</div><div class='del'>-  int64_t (*diff_value) (struct xlator_stats *max, struct xlator_stats *min); /* Diff b/w max and min */</div><div class='del'>-  int64_t (*entry_value) (struct xlator_stats *); /* Limit specified user */</div><div class='del'>-  int64_t (*exit_value) (struct xlator_stats *); /* Exit point for the limit */</div><div class='del'>-  int64_t (*sched_value) (struct xlator_stats *); /* This will return the index of the child area */</div><div class='del'>-};</div><div class='del'>-</div><div class='del'>-struct alu_sched_node {</div><div class='del'>-  struct alu_sched_node *next;</div><div class='del'>-  int32_t index;</div><div class='del'>-};</div><div class='del'>-</div><div class='del'>-struct alu_sched {</div><div class='del'>-  struct alu_limits *limits_fn;</div><div class='del'>-  struct alu_threshold *threshold_fn;</div><div class='del'>-  struct alu_sched_struct *array;</div><div class='del'>-  struct alu_sched_node *sched_node;</div><div class='del'>-  struct alu_threshold *sched_method;</div><div class='del'>-  struct xlator_stats max_limit;</div><div class='del'>-  struct xlator_stats min_limit;</div><div class='del'>-  struct xlator_stats entry_limit;</div><div class='del'>-  struct xlator_stats exit_limit;</div><div class='del'>-  struct xlator_stats spec_limit;     /* User given limit */</div><div class='del'>-</div><div class='del'>-  pthread_mutex_t alu_mutex;</div><div class='del'>-  struct timeval last_stat_fetch;</div><div class='del'>-  uint32_t refresh_interval;      /* in seconds */</div><div class='del'>-  uint32_t refresh_create_count;  /* num-file-create */</div><div class='del'>-</div><div class='del'>-  int32_t sched_nodes_pending;</div><div class='del'>-</div><div class='del'>-  int32_t sched_index;  /* used for round robin scheduling in case of many nodes getting the criteria match. */</div><div class='del'>-  int32_t child_count;</div><div class='del'>-</div><div class='del'>-};</div><div class='del'>-</div><div class='del'>-struct _alu_local_t {</div><div class='del'>-  int32_t call_count;</div><div class='del'>-};</div><div class='del'>-</div><div class='del'>-typedef struct _alu_local_t alu_local_t;</div><div class='del'>-</div><div class='del'>-#endif /* _ALU_H */</div><div class='head'>diff --git a/scheduler/nufa/src/Makefile.am b/scheduler/nufa/src/Makefile.am<br/>deleted file mode 100644<br/>index 6eb3d39f1e2..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/scheduler/nufa/src/Makefile.am?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>scheduler/nufa/src/Makefile.am</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,12 +0,0 @@</div><div class='del'>-sched_LTLIBRARIES = nufa.la</div><div class='del'>-scheddir = $(libdir)/glusterfs/$(PACKAGE_VERSION)/scheduler</div><div class='del'>-</div><div class='del'>-nufa_la_LDFLAGS = -module -avoidversion</div><div class='del'>-</div><div class='del'>-nufa_la_SOURCES = nufa.c</div><div class='del'>-nufa_la_LIBADD = $(top_builddir)/libglusterfs/src/libglusterfs.la</div><div class='del'>-</div><div class='del'>-AM_CFLAGS = -fPIC -D_FILE_OFFSET_BITS=64 -D_GNU_SOURCE -Wall -D$(GF_HOST_OS)\</div><div class='del'>-	-I$(top_srcdir)/libglusterfs/src -shared -nostartfiles $(GF_CFLAGS)</div><div class='del'>-</div><div class='del'>-CLEANFILES = </div><div class='head'>diff --git a/scheduler/nufa/src/nufa-mem-types.h b/scheduler/nufa/src/nufa-mem-types.h<br/>deleted file mode 100644<br/>index d8ce993daf9..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/scheduler/nufa/src/nufa-mem-types.h?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>scheduler/nufa/src/nufa-mem-types.h</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,33 +0,0 @@</div><div class='del'>-/*</div><div class='del'>-   Copyright (c) 2008-2009 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='del'>-   This file is part of GlusterFS.</div><div class='del'>-</div><div class='del'>-   GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-   it under the terms of the GNU General Public License as published</div><div class='del'>-   by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-   or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-   GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-   WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-   General Public License for more details.</div><div class='del'>-</div><div class='del'>-   You should have received a copy of the GNU General Public License</div><div class='del'>-   along with this program.  If not, see</div><div class='del'>-   &lt;http://www.gnu.org/licenses/&gt;.</div><div class='del'>-*/</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-#ifndef __NUFA_MEM_TYPES_H__</div><div class='del'>-#define __NUFA_MEM_TYPES_H__</div><div class='del'>-</div><div class='del'>-#include "mem-types.h"</div><div class='del'>-</div><div class='del'>-enum gf_locks_mem_types_ {</div><div class='del'>-        gf_nufa_mt_nufa_struct = gf_common_mt_end + 1,</div><div class='del'>-        gf_nufa_mt_nufa_sched_struct,</div><div class='del'>-        gf_nufa_mt_int32_t,</div><div class='del'>-        gf_nufa_mt_end</div><div class='del'>-};</div><div class='del'>-#endif</div><div class='del'>-</div><div class='head'>diff --git a/scheduler/nufa/src/nufa.c b/scheduler/nufa/src/nufa.c<br/>deleted file mode 100644<br/>index f089782cd8c..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/scheduler/nufa/src/nufa.c?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>scheduler/nufa/src/nufa.c</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,429 +0,0 @@</div><div class='del'>-/*</div><div class='del'>-  Copyright (c) 2006-2009 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='del'>-  This file is part of GlusterFS.</div><div class='del'>-</div><div class='del'>-  GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-  it under the terms of the GNU General Public License as published</div><div class='del'>-  by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-  or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-  GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-  WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-  General Public License for more details.</div><div class='del'>-</div><div class='del'>-  You should have received a copy of the GNU General Public License</div><div class='del'>-  along with this program.  If not, see</div><div class='del'>-  &lt;http://www.gnu.org/licenses/&gt;.</div><div class='del'>-*/</div><div class='del'>-</div><div class='del'>-#ifndef _CONFIG_H</div><div class='del'>-#define _CONFIG_H</div><div class='del'>-#include "config.h"</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-#include &lt;sys/time.h&gt;</div><div class='del'>-</div><div class='del'>-#include "scheduler.h"</div><div class='del'>-#include "common-utils.h"</div><div class='del'>-#include "nufa-mem-types.h"</div><div class='del'>-</div><div class='del'>-struct nufa_sched_struct {</div><div class='del'>-	xlator_t *xl;</div><div class='del'>-	struct timeval last_stat_fetch;</div><div class='del'>-	int64_t free_disk;</div><div class='del'>-	int32_t refresh_interval;</div><div class='del'>-	unsigned char eligible;</div><div class='del'>-};</div><div class='del'>-</div><div class='del'>-struct nufa_struct {</div><div class='del'>-	struct nufa_sched_struct *array;</div><div class='del'>-	struct timeval last_stat_fetch;</div><div class='del'>-</div><div class='del'>-	int32_t *local_array; /* Used to keep the index of the local xlators */</div><div class='del'>-	int32_t local_xl_index; /* index in the above array */</div><div class='del'>-	int32_t local_xl_count; /* Count of the local subvolumes */</div><div class='del'>-</div><div class='del'>-	uint32_t refresh_interval;</div><div class='del'>-	uint32_t min_free_disk;</div><div class='del'>-  </div><div class='del'>-	gf_lock_t nufa_lock;</div><div class='del'>-	int32_t child_count;</div><div class='del'>-	int32_t sched_index;  </div><div class='del'>-};</div><div class='del'>-</div><div class='del'>-#define NUFA_LIMITS_MIN_FREE_DISK_DEFAULT    15</div><div class='del'>-#define NUFA_REFRESH_INTERVAL_DEFAULT        30</div><div class='del'>-</div><div class='del'>-static int32_t</div><div class='del'>-nufa_init (xlator_t *xl)</div><div class='del'>-{</div><div class='del'>-	int32_t index = 0;</div><div class='del'>-	data_t *local_name = NULL;</div><div class='del'>-	data_t *data = NULL;</div><div class='del'>-	xlator_list_t *trav_xl = xl-&gt;children;</div><div class='del'>-	struct nufa_struct *nufa_buf = NULL;</div><div class='del'>-</div><div class='del'>-	nufa_buf = GF_CALLOC (1, sizeof (struct nufa_struct),</div><div class='del'>-                              gf_nufa_mt_nufa_struct);</div><div class='del'>-	ERR_ABORT (nufa_buf);</div><div class='del'>-</div><div class='del'>-	data = dict_get (xl-&gt;options, "scheduler.limits.min-free-disk");</div><div class='del'>-	if (data) {</div><div class='del'>-		if (gf_string2percent (data-&gt;data, </div><div class='del'>-				       &amp;nufa_buf-&gt;min_free_disk) != 0) {</div><div class='del'>-			gf_log ("nufa", GF_LOG_ERROR, </div><div class='del'>-				"invalid number format \"%s\" of "</div><div class='del'>-				"\"option scheduler.limits.min-free-disk\"", </div><div class='del'>-				data-&gt;data);</div><div class='del'>-			return -1;</div><div class='del'>-		}</div><div class='del'>-		if (nufa_buf-&gt;min_free_disk &gt;= 100) {</div><div class='del'>-			gf_log ("nufa", GF_LOG_ERROR,</div><div class='del'>-				"check \"option scheduler.limits.min-free-disk"</div><div class='del'>-				"\", it should be percentage value");</div><div class='del'>-			return -1;</div><div class='del'>-		}</div><div class='del'>-	} else {</div><div class='del'>-		gf_log ("nufa", GF_LOG_WARNING, </div><div class='del'>-			"No option for limit min-free-disk given, "</div><div class='del'>-			"defaulting it to 15%%");</div><div class='del'>-		nufa_buf-&gt;min_free_disk = NUFA_LIMITS_MIN_FREE_DISK_DEFAULT;</div><div class='del'>-	}</div><div class='del'>-	data = dict_get (xl-&gt;options, "scheduler.refresh-interval");</div><div class='del'>-	if (data != NULL) {</div><div class='del'>-                if (gf_string2time (data-&gt;data, </div><div class='del'>-				    &amp;nufa_buf-&gt;refresh_interval) != 0) {</div><div class='del'>-                        gf_log ("nufa", GF_LOG_ERROR, </div><div class='del'>-                                "invalid number format \"%s\" of "</div><div class='del'>-                                "\"option scheduler.refresh-interval\"", </div><div class='del'>-                                data-&gt;data);</div><div class='del'>-                        return -1;</div><div class='del'>-                }</div><div class='del'>-        } else {</div><div class='del'>-		gf_log ("nufa", GF_LOG_WARNING, </div><div class='del'>-			"No option for scheduler.refresh-interval given, "</div><div class='del'>-			"defaulting it to 30");</div><div class='del'>-		nufa_buf-&gt;refresh_interval = NUFA_REFRESH_INTERVAL_DEFAULT;</div><div class='del'>-	}</div><div class='del'>-  </div><div class='del'>-	/* Get the array built */</div><div class='del'>-	while (trav_xl) {</div><div class='del'>-		index++;</div><div class='del'>-		trav_xl = trav_xl-&gt;next;</div><div class='del'>-	}</div><div class='del'>-	nufa_buf-&gt;child_count = index;</div><div class='del'>-	nufa_buf-&gt;sched_index = 0;</div><div class='del'>-	nufa_buf-&gt;array = GF_CALLOC (index, sizeof (struct nufa_sched_struct),</div><div class='del'>-                                     gf_nufa_mt_nufa_sched_struct);</div><div class='del'>-	ERR_ABORT (nufa_buf-&gt;array);</div><div class='del'>-	nufa_buf-&gt;local_array = GF_CALLOC (index, sizeof (int32_t),</div><div class='del'>-                                           gf_nufa_mt_int32_t);</div><div class='del'>-	ERR_ABORT (nufa_buf-&gt;array);</div><div class='del'>-	trav_xl = xl-&gt;children;</div><div class='del'>-	</div><div class='del'>-	local_name = dict_get (xl-&gt;options, "scheduler.local-volume-name");</div><div class='del'>-	if (!local_name) {</div><div class='del'>-		/* Error */</div><div class='del'>-		gf_log ("nufa", GF_LOG_ERROR, </div><div class='del'>-			"No 'local-volume-name' option given in volume file");</div><div class='del'>-		GF_FREE (nufa_buf-&gt;array);</div><div class='del'>-		GF_FREE (nufa_buf-&gt;local_array);</div><div class='del'>-		GF_FREE (nufa_buf);</div><div class='del'>-		return -1;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	/* Get the array properly */</div><div class='del'>-	index = 0;</div><div class='del'>-	trav_xl = xl-&gt;children;</div><div class='del'>-	while (trav_xl) {</div><div class='del'>-		nufa_buf-&gt;array[index].xl = trav_xl-&gt;xlator;</div><div class='del'>-		nufa_buf-&gt;array[index].eligible = 1;</div><div class='del'>-		nufa_buf-&gt;array[index].free_disk = nufa_buf-&gt;min_free_disk;</div><div class='del'>-		nufa_buf-&gt;array[index].refresh_interval = </div><div class='del'>-			nufa_buf-&gt;refresh_interval;</div><div class='del'>-</div><div class='del'>-		trav_xl = trav_xl-&gt;next;</div><div class='del'>-		index++;</div><div class='del'>-	}</div><div class='del'>-  </div><div class='del'>-	{ </div><div class='del'>-		int32_t array_index = 0;</div><div class='del'>-		char *child = NULL;</div><div class='del'>-		char *tmp = NULL;</div><div class='del'>-		char *childs_data = gf_strdup (local_name-&gt;data);</div><div class='del'>-		</div><div class='del'>-		child = strtok_r (childs_data, ",", &amp;tmp);</div><div class='del'>-		while (child) {</div><div class='del'>-			/* Check if the local_volume specified is proper </div><div class='del'>-			   subvolume of unify */</div><div class='del'>-			trav_xl = xl-&gt;children;</div><div class='del'>-			index=0;</div><div class='del'>-			while (trav_xl) {</div><div class='del'>-				if (strcmp (child, trav_xl-&gt;xlator-&gt;name) == 0)</div><div class='del'>-					break;</div><div class='del'>-				trav_xl = trav_xl-&gt;next;</div><div class='del'>-				index++;</div><div class='del'>-			}</div><div class='del'>-</div><div class='del'>-			if (!trav_xl) {</div><div class='del'>-				/* entry for 'local-volume-name' is wrong, </div><div class='del'>-				   not present in subvolumes */</div><div class='del'>-				gf_log ("nufa", GF_LOG_ERROR, </div><div class='del'>-					"option 'scheduler.local-volume-name' "</div><div class='del'>-					"%s is wrong", child);</div><div class='del'>-				GF_FREE (nufa_buf-&gt;array);</div><div class='del'>-				GF_FREE (nufa_buf-&gt;local_array);</div><div class='del'>-				GF_FREE (nufa_buf);</div><div class='del'>-				return -1;</div><div class='del'>-			} else {</div><div class='del'>-				nufa_buf-&gt;local_array[array_index++] = index;</div><div class='del'>-				nufa_buf-&gt;local_xl_count++;</div><div class='del'>-			}</div><div class='del'>-			child = strtok_r (NULL, ",", &amp;tmp);</div><div class='del'>-		}</div><div class='del'>-		GF_FREE (childs_data);</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	LOCK_INIT (&amp;nufa_buf-&gt;nufa_lock);</div><div class='del'>-	*((long *)xl-&gt;private) = (long)nufa_buf; // put it at the proper place</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-static void</div><div class='del'>-nufa_fini (xlator_t *xl)</div><div class='del'>-{</div><div class='del'>-	struct nufa_struct *nufa_buf = </div><div class='del'>-		(struct nufa_struct *)*((long *)xl-&gt;private);</div><div class='del'>-</div><div class='del'>-	LOCK_DESTROY (&amp;nufa_buf-&gt;nufa_lock);</div><div class='del'>-	GF_FREE (nufa_buf-&gt;local_array);</div><div class='del'>-	GF_FREE (nufa_buf-&gt;array);</div><div class='del'>-	GF_FREE (nufa_buf);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-static int32_t </div><div class='del'>-update_stat_array_cbk (call_frame_t *frame,</div><div class='del'>-		       void *cookie,</div><div class='del'>-		       xlator_t *xl,</div><div class='del'>-		       int32_t op_ret,</div><div class='del'>-		       int32_t op_errno,</div><div class='del'>-		       struct xlator_stats *trav_stats)</div><div class='del'>-{</div><div class='del'>-	struct nufa_struct *nufa_struct = NULL; </div><div class='del'>-	int32_t idx = 0;</div><div class='del'>-	int32_t percent = 0;</div><div class='del'>-</div><div class='del'>-	nufa_struct = (struct nufa_struct *)*((long *)xl-&gt;private);</div><div class='del'>-	LOCK (&amp;nufa_struct-&gt;nufa_lock);</div><div class='del'>-	for (idx = 0; idx &lt; nufa_struct-&gt;child_count; idx++) {</div><div class='del'>-		if (nufa_struct-&gt;array[idx].xl-&gt;name == (char *)cookie)</div><div class='del'>-			break;</div><div class='del'>-	}</div><div class='del'>-	UNLOCK (&amp;nufa_struct-&gt;nufa_lock);</div><div class='del'>-</div><div class='del'>-	if (op_ret == 0) {</div><div class='del'>-		percent = ((trav_stats-&gt;free_disk * 100) / </div><div class='del'>-			   trav_stats-&gt;total_disk_size);</div><div class='del'>-		if (nufa_struct-&gt;array[idx].free_disk &gt; percent) {</div><div class='del'>-			if (nufa_struct-&gt;array[idx].eligible)</div><div class='del'>-				gf_log ("nufa", GF_LOG_CRITICAL,</div><div class='del'>-					"node \"%s\" is _almost_ (%d %%) full",</div><div class='del'>-					nufa_struct-&gt;array[idx].xl-&gt;name, </div><div class='del'>-					100 - percent);</div><div class='del'>-			nufa_struct-&gt;array[idx].eligible = 0;</div><div class='del'>-		} else {</div><div class='del'>-			nufa_struct-&gt;array[idx].eligible = 1;</div><div class='del'>-		}</div><div class='del'>-	} else {</div><div class='del'>-		nufa_struct-&gt;array[idx].eligible = 0;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	STACK_DESTROY (frame-&gt;root);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-static void </div><div class='del'>-update_stat_array (xlator_t *xl)</div><div class='del'>-{</div><div class='del'>-	/* This function schedules the file in one of the child nodes */</div><div class='del'>-	int32_t idx;</div><div class='del'>-	struct nufa_struct *nufa_buf = </div><div class='del'>-		(struct nufa_struct *)*((long *)xl-&gt;private);</div><div class='del'>-	call_frame_t *frame = NULL;</div><div class='del'>-	call_pool_t *pool = xl-&gt;ctx-&gt;pool;</div><div class='del'>-</div><div class='del'>-	for (idx = 0; idx &lt; nufa_buf-&gt;child_count; idx++) {</div><div class='del'>-		frame = create_frame (xl, pool);</div><div class='del'>-</div><div class='del'>-		STACK_WIND_COOKIE (frame,</div><div class='del'>-				   update_stat_array_cbk, </div><div class='del'>-				   nufa_buf-&gt;array[idx].xl-&gt;name,</div><div class='del'>-				   nufa_buf-&gt;array[idx].xl, </div><div class='del'>-				   (nufa_buf-&gt;array[idx].xl)-&gt;mops-&gt;stats,</div><div class='del'>-				   0); //flag</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	return;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-static void </div><div class='del'>-nufa_update (xlator_t *xl)</div><div class='del'>-{</div><div class='del'>-	struct nufa_struct *nufa_buf = </div><div class='del'>-		(struct nufa_struct *)*((long *)xl-&gt;private);</div><div class='del'>-	struct timeval tv;</div><div class='del'>-	gettimeofday (&amp;tv, NULL);</div><div class='del'>-	if (tv.tv_sec &gt; (nufa_buf-&gt;refresh_interval </div><div class='del'>-			 + nufa_buf-&gt;last_stat_fetch.tv_sec)) {</div><div class='del'>-		/* Update the stats from all the server */</div><div class='del'>-		update_stat_array (xl);</div><div class='del'>-		nufa_buf-&gt;last_stat_fetch.tv_sec = tv.tv_sec;</div><div class='del'>-	}</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-static xlator_t *</div><div class='del'>-nufa_schedule (xlator_t *xl, const void *path)</div><div class='del'>-{</div><div class='del'>-	struct nufa_struct *nufa_buf = </div><div class='del'>-		(struct nufa_struct *)*((long *)xl-&gt;private);</div><div class='del'>-	int32_t nufa_orig = nufa_buf-&gt;local_xl_index;  </div><div class='del'>-	int32_t rr;</div><div class='del'>-  </div><div class='del'>-	nufa_update (xl);</div><div class='del'>-  </div><div class='del'>-	while (1) {</div><div class='del'>-		LOCK (&amp;nufa_buf-&gt;nufa_lock);</div><div class='del'>-		rr = nufa_buf-&gt;local_xl_index++;</div><div class='del'>-		nufa_buf-&gt;local_xl_index %= nufa_buf-&gt;local_xl_count;</div><div class='del'>-		UNLOCK (&amp;nufa_buf-&gt;nufa_lock);</div><div class='del'>-    </div><div class='del'>-		/* if 'eligible' or there are _no_ eligible nodes */</div><div class='del'>-		if (nufa_buf-&gt;array[nufa_buf-&gt;local_array[rr]].eligible) {</div><div class='del'>-			/* Return the local node */</div><div class='del'>-			return nufa_buf-&gt;array[nufa_buf-&gt;local_array[rr]].xl;</div><div class='del'>-		}</div><div class='del'>-		if ((rr + 1) % nufa_buf-&gt;local_xl_count == nufa_orig) {</div><div class='del'>-			gf_log ("nufa", GF_LOG_CRITICAL, </div><div class='del'>-				"No free space available on any local "</div><div class='del'>-				"volumes, using RR scheduler");</div><div class='del'>-			LOCK (&amp;nufa_buf-&gt;nufa_lock);</div><div class='del'>-			nufa_buf-&gt;local_xl_index++;</div><div class='del'>-			nufa_buf-&gt;local_xl_index %= nufa_buf-&gt;local_xl_count;</div><div class='del'>-			UNLOCK (&amp;nufa_buf-&gt;nufa_lock);</div><div class='del'>-			break;</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	nufa_orig = nufa_buf-&gt;sched_index;  </div><div class='del'>-	while (1) {</div><div class='del'>-		LOCK (&amp;nufa_buf-&gt;nufa_lock);</div><div class='del'>-		rr = nufa_buf-&gt;sched_index++;</div><div class='del'>-		nufa_buf-&gt;sched_index = (nufa_buf-&gt;sched_index % </div><div class='del'>-					 nufa_buf-&gt;child_count);</div><div class='del'>-		UNLOCK (&amp;nufa_buf-&gt;nufa_lock);</div><div class='del'>-    </div><div class='del'>-		/* if 'eligible' or there are _no_ eligible nodes */</div><div class='del'>-		if (nufa_buf-&gt;array[rr].eligible) {</div><div class='del'>-			break;</div><div class='del'>-		}</div><div class='del'>-		if ((rr + 1) % nufa_buf-&gt;child_count == nufa_orig) {</div><div class='del'>-			gf_log ("nufa", GF_LOG_CRITICAL, </div><div class='del'>-				"No free space available on any server, "</div><div class='del'>-				"using RR scheduler.");</div><div class='del'>-			LOCK (&amp;nufa_buf-&gt;nufa_lock);</div><div class='del'>-			nufa_buf-&gt;sched_index++;</div><div class='del'>-			nufa_buf-&gt;sched_index = (nufa_buf-&gt;sched_index % </div><div class='del'>-						 nufa_buf-&gt;child_count);</div><div class='del'>-			UNLOCK (&amp;nufa_buf-&gt;nufa_lock);</div><div class='del'>-			break;</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='del'>-	return nufa_buf-&gt;array[rr].xl;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-/**</div><div class='del'>- * notify</div><div class='del'>- */</div><div class='del'>-void</div><div class='del'>-nufa_notify (xlator_t *xl, int32_t event, void *data)</div><div class='del'>-{</div><div class='del'>-	struct nufa_struct *nufa_buf = </div><div class='del'>-		(struct nufa_struct *)*((long *)xl-&gt;private);</div><div class='del'>-	int32_t idx = 0;</div><div class='del'>-  </div><div class='del'>-	if (!nufa_buf)</div><div class='del'>-		return;</div><div class='del'>-</div><div class='del'>-	for (idx = 0; idx &lt; nufa_buf-&gt;child_count; idx++) {</div><div class='del'>-		if (strcmp (nufa_buf-&gt;array[idx].xl-&gt;name, </div><div class='del'>-			    ((xlator_t *)data)-&gt;name) == 0)</div><div class='del'>-			break;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	switch (event)</div><div class='del'>-	{</div><div class='del'>-	case GF_EVENT_CHILD_UP:</div><div class='del'>-	{</div><div class='del'>-		//nufa_buf-&gt;array[idx].eligible = 1;</div><div class='del'>-	}</div><div class='del'>-	break;</div><div class='del'>-	case GF_EVENT_CHILD_DOWN:</div><div class='del'>-	{</div><div class='del'>-		nufa_buf-&gt;array[idx].eligible = 0;</div><div class='del'>-	}</div><div class='del'>-	break;</div><div class='del'>-	default:</div><div class='del'>-	{</div><div class='del'>-		;</div><div class='del'>-	}</div><div class='del'>-	break;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-nufa_mem_acct_init (xlator_t *this)</div><div class='del'>-{</div><div class='del'>-        int     ret = -1;</div><div class='del'>-</div><div class='del'>-        if (!this)</div><div class='del'>-                return ret;</div><div class='del'>-</div><div class='del'>-        ret = xlator_mem_acct_init (this, gf_nufa_mt_end + 1);</div><div class='del'>-        </div><div class='del'>-        if (ret != 0) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_ERROR, "Memory accounting init"</div><div class='del'>-                                "failed");</div><div class='del'>-                return ret;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-struct sched_ops sched = {</div><div class='del'>-	.init     = nufa_init,</div><div class='del'>-	.fini     = nufa_fini,</div><div class='del'>-	.update   = nufa_update,</div><div class='del'>-	.schedule = nufa_schedule,</div><div class='del'>-	.notify   = nufa_notify,</div><div class='del'>-        .mem_acct_init = nufa_mem_acct_init,</div><div class='del'>-};</div><div class='del'>-</div><div class='del'>-struct volume_options options[] = {</div><div class='del'>-	{ .key   = { "scheduler.refresh-interval", </div><div class='del'>-		     "nufa.refresh-interval" },  </div><div class='del'>-	  .type  = GF_OPTION_TYPE_TIME</div><div class='del'>-	},</div><div class='del'>-	{ .key   = { "scheduler.limits.min-free-disk", </div><div class='del'>-		     "nufa.limits.min-free-disk" },  </div><div class='del'>-	  .type  = GF_OPTION_TYPE_PERCENT</div><div class='del'>-	},</div><div class='del'>-	{ .key   = { "scheduler.local-volume-name",</div><div class='del'>-		     "nufa.local-volume-name" },</div><div class='del'>-	  .type  = GF_OPTION_TYPE_XLATOR</div><div class='del'>-	},	</div><div class='del'>-	{ .key = {NULL} }</div><div class='del'>-};</div><div class='del'>-</div><div class='head'>diff --git a/scheduler/random/src/Makefile.am b/scheduler/random/src/Makefile.am<br/>deleted file mode 100644<br/>index 572181336c2..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/scheduler/random/src/Makefile.am?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>scheduler/random/src/Makefile.am</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,14 +0,0 @@</div><div class='del'>-sched_LTLIBRARIES = random.la</div><div class='del'>-scheddir = $(libdir)/glusterfs/$(PACKAGE_VERSION)/scheduler</div><div class='del'>-</div><div class='del'>-random_la_LDFLAGS = -module -avoidversion</div><div class='del'>-</div><div class='del'>-random_la_SOURCES = random.c</div><div class='del'>-random_la_LIBADD = $(top_builddir)/libglusterfs/src/libglusterfs.la</div><div class='del'>-</div><div class='del'>-noinst_HEADERS = random.h</div><div class='del'>-</div><div class='del'>-AM_CFLAGS = -fPIC -D_FILE_OFFSET_BITS=64 -D_GNU_SOURCE -Wall -D$(GF_HOST_OS)\</div><div class='del'>-	-I$(top_srcdir)/libglusterfs/src -shared -nostartfiles $(GF_CFLAGS)</div><div class='del'>-</div><div class='del'>-CLEANFILES = </div><div class='head'>diff --git a/scheduler/random/src/random-mem-types.h b/scheduler/random/src/random-mem-types.h<br/>deleted file mode 100644<br/>index 612e53dbdb6..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/scheduler/random/src/random-mem-types.h?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>scheduler/random/src/random-mem-types.h</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,32 +0,0 @@</div><div class='del'>-/*</div><div class='del'>-   Copyright (c) 2008-2009 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='del'>-   This file is part of GlusterFS.</div><div class='del'>-</div><div class='del'>-   GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-   it under the terms of the GNU General Public License as published</div><div class='del'>-   by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-   or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-   GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-   WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-   General Public License for more details.</div><div class='del'>-</div><div class='del'>-   You should have received a copy of the GNU General Public License</div><div class='del'>-   along with this program.  If not, see</div><div class='del'>-   &lt;http://www.gnu.org/licenses/&gt;.</div><div class='del'>-*/</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-#ifndef __RANDOM_MEM_TYPES_H__</div><div class='del'>-#define __RANDOM_MEM_TYPES_H__</div><div class='del'>-</div><div class='del'>-#include "mem-types.h"</div><div class='del'>-</div><div class='del'>-enum gf_random_mem_types_ {</div><div class='del'>-        gf_random_mt_random_struct = gf_common_mt_end + 1,</div><div class='del'>-        gf_random_mt_random_sched_struct,</div><div class='del'>-        gf_random_mt_end</div><div class='del'>-};</div><div class='del'>-#endif</div><div class='del'>-</div><div class='head'>diff --git a/scheduler/random/src/random.c b/scheduler/random/src/random.c<br/>deleted file mode 100644<br/>index e6bd34c3d7e..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/scheduler/random/src/random.c?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>scheduler/random/src/random.c</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,305 +0,0 @@</div><div class='del'>-/*</div><div class='del'>-  Copyright (c) 2006-2009 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='del'>-  This file is part of GlusterFS.</div><div class='del'>-</div><div class='del'>-  GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-  it under the terms of the GNU General Public License as published</div><div class='del'>-  by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-  or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-  GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-  WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-  General Public License for more details.</div><div class='del'>-</div><div class='del'>-  You should have received a copy of the GNU General Public License</div><div class='del'>-  along with this program.  If not, see</div><div class='del'>-  &lt;http://www.gnu.org/licenses/&gt;.</div><div class='del'>-*/</div><div class='del'>-</div><div class='del'>-#include &lt;stdlib.h&gt;</div><div class='del'>-#include &lt;sys/time.h&gt;</div><div class='del'>-</div><div class='del'>-#ifndef _CONFIG_H</div><div class='del'>-#define _CONFIG_H</div><div class='del'>-#include "config.h"</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-#include "random.h"</div><div class='del'>-#include "random-mem-types.h"</div><div class='del'>-</div><div class='del'>-#define RANDOM_LIMITS_MIN_FREE_DISK_DEFAULT    15</div><div class='del'>-#define RANDOM_REFRESH_INTERVAL_DEFAULT        10</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-static int32_t</div><div class='del'>-random_init (xlator_t *xl)</div><div class='del'>-{</div><div class='del'>-	struct random_struct *random_buf = NULL;</div><div class='del'>-	xlator_list_t *trav_xl = xl-&gt;children;</div><div class='del'>-	data_t *limit = NULL;</div><div class='del'>-	int32_t index = 0;</div><div class='del'>-</div><div class='del'>-	random_buf = GF_CALLOC (1, sizeof (struct random_struct),</div><div class='del'>-                                gf_random_mt_random_struct);</div><div class='del'>-	ERR_ABORT (random_buf);</div><div class='del'>-  </div><div class='del'>-	/* Set the seed for the 'random' function */</div><div class='del'>-	srandom ((uint32_t) time (NULL));</div><div class='del'>-  </div><div class='del'>-	limit = dict_get (xl-&gt;options, "scheduler.limits.min-free-disk");</div><div class='del'>-	if (limit) {</div><div class='del'>-		if (gf_string2percent (data_to_str (limit),</div><div class='del'>-				       &amp;random_buf-&gt;min_free_disk) != 0) {</div><div class='del'>-			gf_log ("random", GF_LOG_ERROR, </div><div class='del'>-				"invalid number format \"%s\" of \"option "</div><div class='del'>-				"scheduler.limits.min-free-disk\"", </div><div class='del'>-				limit-&gt;data);</div><div class='del'>-			return -1;</div><div class='del'>-		}</div><div class='del'>-		if (random_buf-&gt;min_free_disk &gt;= 100) {</div><div class='del'>-			gf_log ("random", GF_LOG_ERROR,</div><div class='del'>-				"check the \"option random.limits.min-free"</div><div class='del'>-				"-disk\", it should be percentage value");</div><div class='del'>-			return -1;</div><div class='del'>-		}</div><div class='del'>-      </div><div class='del'>-	} else {</div><div class='del'>-		gf_log ("random", GF_LOG_WARNING, </div><div class='del'>-			"No option for limit min-free-disk given, "</div><div class='del'>-			"defaulting it to 5%%");</div><div class='del'>-		random_buf-&gt;min_free_disk = </div><div class='del'>-			RANDOM_LIMITS_MIN_FREE_DISK_DEFAULT;</div><div class='del'>-	}</div><div class='del'>-  </div><div class='del'>-	limit = dict_get (xl-&gt;options, "scheduler.refresh-interval");</div><div class='del'>-	if (limit) {</div><div class='del'>-		if (gf_string2time (data_to_str (limit),</div><div class='del'>-				    &amp;random_buf-&gt;refresh_interval) != 0) {</div><div class='del'>-			gf_log ("random", GF_LOG_ERROR, </div><div class='del'>-				"invalid number format \"%s\" of "</div><div class='del'>-				"\"option random.refresh-interval\"", </div><div class='del'>-				limit-&gt;data);</div><div class='del'>-			return -1;</div><div class='del'>-		}</div><div class='del'>-	} else {</div><div class='del'>-		random_buf-&gt;refresh_interval = RANDOM_REFRESH_INTERVAL_DEFAULT;</div><div class='del'>-	}</div><div class='del'>-  </div><div class='del'>-	while (trav_xl) {</div><div class='del'>-		index++;</div><div class='del'>-		trav_xl = trav_xl-&gt;next;</div><div class='del'>-	}</div><div class='del'>-	random_buf-&gt;child_count = index;</div><div class='del'>-	random_buf-&gt;array = GF_CALLOC (index,</div><div class='del'>-                                       sizeof (struct random_sched_struct),</div><div class='del'>-                                       gf_random_mt_random_sched_struct);</div><div class='del'>-	ERR_ABORT (random_buf-&gt;array);</div><div class='del'>-	trav_xl = xl-&gt;children;</div><div class='del'>-	index = 0;</div><div class='del'>-</div><div class='del'>-	while (trav_xl) {</div><div class='del'>-		random_buf-&gt;array[index].xl = trav_xl-&gt;xlator;</div><div class='del'>-		random_buf-&gt;array[index].eligible = 1;</div><div class='del'>-		trav_xl = trav_xl-&gt;next;</div><div class='del'>-		index++;</div><div class='del'>-	}</div><div class='del'>-	pthread_mutex_init (&amp;random_buf-&gt;random_mutex, NULL);</div><div class='del'>-</div><div class='del'>-	// put it at the proper place  </div><div class='del'>-	*((long *)xl-&gt;private) = (long)random_buf; </div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-static void</div><div class='del'>-random_fini (xlator_t *xl)</div><div class='del'>-{</div><div class='del'>-	struct random_struct *random_buf = NULL;</div><div class='del'>-</div><div class='del'>-	random_buf = (struct random_struct *)*((long *)xl-&gt;private);</div><div class='del'>-	pthread_mutex_destroy (&amp;random_buf-&gt;random_mutex);</div><div class='del'>-	GF_FREE (random_buf-&gt;array);</div><div class='del'>-	GF_FREE (random_buf);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-static int32_t </div><div class='del'>-update_stat_array_cbk (call_frame_t *frame,</div><div class='del'>-		       void *cookie,</div><div class='del'>-		       xlator_t *xl,</div><div class='del'>-		       int32_t op_ret,</div><div class='del'>-		       int32_t op_errno,</div><div class='del'>-		       struct xlator_stats *trav_stats)</div><div class='del'>-{</div><div class='del'>-	int32_t idx = 0;</div><div class='del'>-	int32_t percent = 0;</div><div class='del'>-	struct random_struct *random_buf = NULL;</div><div class='del'>-	</div><div class='del'>-	random_buf = (struct random_struct *)*((long *)xl-&gt;private);</div><div class='del'>-</div><div class='del'>-	pthread_mutex_lock (&amp;random_buf-&gt;random_mutex);</div><div class='del'>-	for (idx = 0; idx &lt; random_buf-&gt;child_count; idx++) {</div><div class='del'>-		if (strcmp (random_buf-&gt;array[idx].xl-&gt;name, </div><div class='del'>-			    (char *)cookie) == 0)</div><div class='del'>-			break;</div><div class='del'>-	}</div><div class='del'>-	pthread_mutex_unlock (&amp;random_buf-&gt;random_mutex);</div><div class='del'>-</div><div class='del'>-	if (op_ret == 0) {</div><div class='del'>-		percent = ((trav_stats-&gt;free_disk *100) / </div><div class='del'>-			   trav_stats-&gt;total_disk_size);</div><div class='del'>-		if (random_buf-&gt;min_free_disk &gt; percent) {</div><div class='del'>-			random_buf-&gt;array[idx].eligible = 0;</div><div class='del'>-		} else {</div><div class='del'>-			random_buf-&gt;array[idx].eligible = 1;</div><div class='del'>-		}</div><div class='del'>-	} else {</div><div class='del'>-		random_buf-&gt;array[idx].eligible = 0;</div><div class='del'>-	}    </div><div class='del'>-</div><div class='del'>-	STACK_DESTROY (frame-&gt;root);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-static void </div><div class='del'>-update_stat_array (xlator_t *xl)</div><div class='del'>-{</div><div class='del'>-	int32_t idx;</div><div class='del'>-	struct random_struct *random_buf = NULL;</div><div class='del'>-	call_frame_t *frame = NULL;</div><div class='del'>-	call_pool_t *pool = xl-&gt;ctx-&gt;pool;</div><div class='del'>-</div><div class='del'>-	random_buf = (struct random_struct *)*((long *)xl-&gt;private);</div><div class='del'>-	for (idx = 0; idx &lt; random_buf-&gt;child_count; idx++) {</div><div class='del'>-		frame = create_frame (xl, pool);</div><div class='del'>-</div><div class='del'>-		STACK_WIND_COOKIE (frame,</div><div class='del'>-				   update_stat_array_cbk,</div><div class='del'>-				   random_buf-&gt;array[idx].xl-&gt;name,</div><div class='del'>-				   random_buf-&gt;array[idx].xl,</div><div class='del'>-				   (random_buf-&gt;array[idx].xl)-&gt;mops-&gt;stats,</div><div class='del'>-				   0);</div><div class='del'>-	}</div><div class='del'>-	return ;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-static void </div><div class='del'>-random_update (xlator_t *xl)</div><div class='del'>-{</div><div class='del'>-	struct timeval tv;</div><div class='del'>-	struct random_struct *random_buf = NULL;</div><div class='del'>-</div><div class='del'>-	random_buf = (struct random_struct *)*((long *)xl-&gt;private);</div><div class='del'>-</div><div class='del'>-	gettimeofday(&amp;tv, NULL);</div><div class='del'>-	if (tv.tv_sec &gt; (random_buf-&gt;refresh_interval + </div><div class='del'>-			 random_buf-&gt;last_stat_entry.tv_sec)) {</div><div class='del'>-		update_stat_array (xl);</div><div class='del'>-		random_buf-&gt;last_stat_entry.tv_sec = tv.tv_sec;</div><div class='del'>-	}</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-static xlator_t *</div><div class='del'>-random_schedule (xlator_t *xl, const void *path)</div><div class='del'>-{</div><div class='del'>-	struct random_struct *random_buf = NULL;       </div><div class='del'>-	int32_t rand = 0;</div><div class='del'>-	int32_t try = 0;</div><div class='del'>-	</div><div class='del'>-	random_buf = (struct random_struct *)*((long *)xl-&gt;private);</div><div class='del'>-</div><div class='del'>-	rand = (int32_t) (1.0*random_buf-&gt;child_count * </div><div class='del'>-			  (random() / (RAND_MAX + 1.0)));</div><div class='del'>-</div><div class='del'>-	random_update (xl);</div><div class='del'>-</div><div class='del'>-	while (!random_buf-&gt;array[rand].eligible) {</div><div class='del'>-		if (try++ &gt; 100) {</div><div class='del'>-			/* there is a chance of this becoming a </div><div class='del'>-			   infinite loop otherwise. */</div><div class='del'>-			break; </div><div class='del'>-		}</div><div class='del'>-		rand = (int32_t) (1.0*random_buf-&gt;child_count * </div><div class='del'>-				  (random() / (RAND_MAX + 1.0)));</div><div class='del'>-	}</div><div class='del'>-	return random_buf-&gt;array[rand].xl;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-random_mem_acct_init (xlator_t *this)</div><div class='del'>-{</div><div class='del'>-        int     ret = -1;</div><div class='del'>-</div><div class='del'>-        if (!this)</div><div class='del'>-                return ret;</div><div class='del'>-</div><div class='del'>-        ret = xlator_mem_acct_init (this, gf_random_mt_end + 1);</div><div class='del'>-        </div><div class='del'>-        if (ret != 0) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_ERROR, "Memory accounting init"</div><div class='del'>-                        " failed");</div><div class='del'>-                return ret;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-/**</div><div class='del'>- * notify</div><div class='del'>- */</div><div class='del'>-void</div><div class='del'>-random_notify (xlator_t *xl, int32_t event, void *data)</div><div class='del'>-{</div><div class='del'>-	struct random_struct *random_buf = NULL;</div><div class='del'>-	int32_t idx = 0;</div><div class='del'>-  </div><div class='del'>-	random_buf = (struct random_struct *)*((long *)xl-&gt;private);</div><div class='del'>-	if (!random_buf)</div><div class='del'>-		return;</div><div class='del'>-</div><div class='del'>-	for (idx = 0; idx &lt; random_buf-&gt;child_count; idx++) {</div><div class='del'>-		if (random_buf-&gt;array[idx].xl == (xlator_t *)data)</div><div class='del'>-			break;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	switch (event)</div><div class='del'>-	{</div><div class='del'>-	case GF_EVENT_CHILD_UP:</div><div class='del'>-	{</div><div class='del'>-		//random_buf-&gt;array[idx].eligible = 1;</div><div class='del'>-	}</div><div class='del'>-	break;</div><div class='del'>-	case GF_EVENT_CHILD_DOWN:</div><div class='del'>-	{</div><div class='del'>-		random_buf-&gt;array[idx].eligible = 0;</div><div class='del'>-	}</div><div class='del'>-	break;</div><div class='del'>-	default:</div><div class='del'>-	{</div><div class='del'>-		;</div><div class='del'>-	}</div><div class='del'>-	break;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-struct sched_ops sched = {</div><div class='del'>-	.init     = random_init,</div><div class='del'>-	.fini     = random_fini,</div><div class='del'>-	.update   = random_update,</div><div class='del'>-	.schedule = random_schedule,</div><div class='del'>-	.notify   = random_notify,</div><div class='del'>-        .mem_acct_init = random_mem_acct_init,</div><div class='del'>-};</div><div class='del'>-</div><div class='del'>-struct volume_options options[] = {</div><div class='del'>-	{ .key   = { "scheduler.refresh-interval", </div><div class='del'>-		     "random.refresh-interval" },  </div><div class='del'>-	  .type  = GF_OPTION_TYPE_TIME</div><div class='del'>-	},</div><div class='del'>-	{ .key   = { "scheduler.limits.min-free-disk", </div><div class='del'>-		     "random.limits.min-free-disk" },  </div><div class='del'>-	  .type  = GF_OPTION_TYPE_PERCENT</div><div class='del'>-	},</div><div class='del'>-	{ .key = {NULL} }</div><div class='del'>-};</div><div class='head'>diff --git a/scheduler/random/src/random.h b/scheduler/random/src/random.h<br/>deleted file mode 100644<br/>index 87c71f30022..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/scheduler/random/src/random.h?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>scheduler/random/src/random.h</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,46 +0,0 @@</div><div class='del'>-/*</div><div class='del'>-   Copyright (c) 2006-2009 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='del'>-   This file is part of GlusterFS.</div><div class='del'>-</div><div class='del'>-   GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-   it under the terms of the GNU General Public License as published</div><div class='del'>-   by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-   or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-   GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-   WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-   General Public License for more details.</div><div class='del'>-</div><div class='del'>-   You should have received a copy of the GNU General Public License</div><div class='del'>-   along with this program.  If not, see</div><div class='del'>-   &lt;http://www.gnu.org/licenses/&gt;.</div><div class='del'>-*/</div><div class='del'>-</div><div class='del'>-#ifndef _RANDOM_H</div><div class='del'>-#define _RANDOM_H</div><div class='del'>-</div><div class='del'>-#ifndef _CONFIG_H</div><div class='del'>-#define _CONFIG_H</div><div class='del'>-#include "config.h"</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-#include &lt;sys/time.h&gt;</div><div class='del'>-#include "scheduler.h"</div><div class='del'>-</div><div class='del'>-struct random_sched_struct {</div><div class='del'>-  xlator_t *xl;</div><div class='del'>-  unsigned char eligible;</div><div class='del'>-};</div><div class='del'>-</div><div class='del'>-struct random_struct {</div><div class='del'>-  int32_t child_count;</div><div class='del'>-  uint32_t refresh_interval;</div><div class='del'>-  uint32_t min_free_disk;</div><div class='del'>-  struct timeval last_stat_entry;</div><div class='del'>-  struct random_sched_struct *array;</div><div class='del'>-  pthread_mutex_t random_mutex;</div><div class='del'>-};</div><div class='del'>-</div><div class='del'>-#endif /* _RANDOM_H */</div><div class='head'>diff --git a/scheduler/rr/Makefile.am b/scheduler/rr/Makefile.am<br/>deleted file mode 100644<br/>index d471a3f9243..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/scheduler/rr/Makefile.am?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>scheduler/rr/Makefile.am</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,3 +0,0 @@</div><div class='del'>-SUBDIRS = src</div><div class='del'>-</div><div class='del'>-CLEANFILES = </div><div class='head'>diff --git a/scheduler/rr/src/Makefile.am b/scheduler/rr/src/Makefile.am<br/>deleted file mode 100644<br/>index 7e911c0eda8..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/scheduler/rr/src/Makefile.am?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>scheduler/rr/src/Makefile.am</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,13 +0,0 @@</div><div class='del'>-sched_LTLIBRARIES = rr.la</div><div class='del'>-scheddir = $(libdir)/glusterfs/$(PACKAGE_VERSION)/scheduler</div><div class='del'>-</div><div class='del'>-rr_la_LDFLAGS = -module -avoidversion</div><div class='del'>-</div><div class='del'>-rr_la_LIBADD = $(top_builddir)/libglusterfs/src/libglusterfs.la</div><div class='del'>-rr_la_SOURCES = rr.c rr-options.c</div><div class='del'>-noinst_HEADERS = rr.h rr-options.h</div><div class='del'>-</div><div class='del'>-AM_CFLAGS = -fPIC -D_FILE_OFFSET_BITS=64 -D_GNU_SOURCE -Wall -D$(GF_HOST_OS) \</div><div class='del'>-	-I$(top_srcdir)/libglusterfs/src -shared -nostartfiles $(GF_CFLAGS)</div><div class='del'>-</div><div class='del'>-CLEANFILES = </div><div class='head'>diff --git a/scheduler/rr/src/rr-mem-types.h b/scheduler/rr/src/rr-mem-types.h<br/>deleted file mode 100644<br/>index 4b283ca841d..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/scheduler/rr/src/rr-mem-types.h?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>scheduler/rr/src/rr-mem-types.h</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,32 +0,0 @@</div><div class='del'>-/*</div><div class='del'>-   Copyright (c) 2008-2009 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='del'>-   This file is part of GlusterFS.</div><div class='del'>-</div><div class='del'>-   GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-   it under the terms of the GNU General Public License as published</div><div class='del'>-   by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-   or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-   GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-   WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-   General Public License for more details.</div><div class='del'>-</div><div class='del'>-   You should have received a copy of the GNU General Public License</div><div class='del'>-   along with this program.  If not, see</div><div class='del'>-   &lt;http://www.gnu.org/licenses/&gt;.</div><div class='del'>-*/</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-#ifndef __RR_MEM_TYPES_H__</div><div class='del'>-#define __RR_MEM_TYPES_H__</div><div class='del'>-</div><div class='del'>-#include "mem-types.h"</div><div class='del'>-</div><div class='del'>-enum gf_rr_mem_types_ {</div><div class='del'>-        gf_rr_mt_rr_t = gf_common_mt_end + 1,</div><div class='del'>-        gf_rr_mt_rr_subvolume_t,</div><div class='del'>-        gf_rr_mt_end</div><div class='del'>-};</div><div class='del'>-#endif</div><div class='del'>-</div><div class='head'>diff --git a/scheduler/rr/src/rr-options.c b/scheduler/rr/src/rr-options.c<br/>deleted file mode 100644<br/>index b454ccd7c22..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/scheduler/rr/src/rr-options.c?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>scheduler/rr/src/rr-options.c</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,256 +0,0 @@</div><div class='del'>-/*</div><div class='del'>-  Copyright (c) 2008-2009 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='del'>-  This file is part of GlusterFS.</div><div class='del'>-</div><div class='del'>-  GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-  it under the terms of the GNU General Public License as published</div><div class='del'>-  by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-  or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-  GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-  WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-  General Public License for more details.</div><div class='del'>-</div><div class='del'>-  You should have received a copy of the GNU General Public License</div><div class='del'>-  along with this program.  If not, see</div><div class='del'>-  &lt;http://www.gnu.org/licenses/&gt;.</div><div class='del'>-*/</div><div class='del'>-</div><div class='del'>-#include "scheduler.h"</div><div class='del'>-#include "rr-options.h"</div><div class='del'>-</div><div class='del'>-#define RR_LIMITS_MIN_FREE_DISK_OPTION_STRING  "scheduler.limits.min-free-disk"</div><div class='del'>-#define RR_LIMITS_MIN_FREE_DISK_VALUE_DEFAULT  15</div><div class='del'>-#define RR_LIMITS_MIN_FREE_DISK_VALUE_MIN      0</div><div class='del'>-#define RR_LIMITS_MIN_FREE_DISK_VALUE_MAX      100</div><div class='del'>-</div><div class='del'>-#define RR_REFRESH_INTERVAL_OPTION_STRING      "scheduler.refresh-interval"</div><div class='del'>-#define RR_REFRESH_INTERVAL_VALUE_DEFAULT      10</div><div class='del'>-</div><div class='del'>-#define RR_READ_ONLY_SUBVOLUMES_OPTION_STRING  "scheduler.read-only-subvolumes"</div><div class='del'>-</div><div class='del'>-#define LOG_ERROR(args...)      gf_log ("rr-options", GF_LOG_ERROR, ##args)</div><div class='del'>-#define LOG_WARNING(args...)    gf_log ("rr-options", GF_LOG_WARNING, ##args)</div><div class='del'>-</div><div class='del'>-static int </div><div class='del'>-_rr_options_min_free_disk_validate (const char *value_string, uint32_t *n)</div><div class='del'>-{</div><div class='del'>-	uint32_t value = 0;</div><div class='del'>-  </div><div class='del'>-	if (value_string == NULL)</div><div class='del'>-	{</div><div class='del'>-		return -1;</div><div class='del'>-	}</div><div class='del'>-  </div><div class='del'>-	if (gf_string2percent (value_string, &amp;value) != 0)</div><div class='del'>-	{</div><div class='del'>-		gf_log ("rr", </div><div class='del'>-			GF_LOG_ERROR, </div><div class='del'>-			"invalid number format [%s] of option [%s]", </div><div class='del'>-			value_string, </div><div class='del'>-			RR_LIMITS_MIN_FREE_DISK_OPTION_STRING);</div><div class='del'>-		return -1;</div><div class='del'>-	}</div><div class='del'>-  </div><div class='del'>-	if ((value &lt;= RR_LIMITS_MIN_FREE_DISK_VALUE_MIN) || </div><div class='del'>-	    (value &gt;= RR_LIMITS_MIN_FREE_DISK_VALUE_MAX))</div><div class='del'>-	{</div><div class='del'>-		gf_log ("rr", </div><div class='del'>-			GF_LOG_ERROR, </div><div class='del'>-			"out of range [%d] of option [%s].  Allowed range is 0 to 100.", </div><div class='del'>-			value, </div><div class='del'>-			RR_LIMITS_MIN_FREE_DISK_OPTION_STRING);</div><div class='del'>-		return -1;</div><div class='del'>-	}</div><div class='del'>-  </div><div class='del'>-	*n = value;</div><div class='del'>-  </div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-static int </div><div class='del'>-_rr_options_refresh_interval_validate (const char *value_string, uint32_t *n)</div><div class='del'>-{</div><div class='del'>-	uint32_t value = 0;</div><div class='del'>-  </div><div class='del'>-	if (value_string == NULL)</div><div class='del'>-	{</div><div class='del'>-		return -1;</div><div class='del'>-	}</div><div class='del'>-  </div><div class='del'>-	if (gf_string2time (value_string, &amp;value) != 0)</div><div class='del'>-	{</div><div class='del'>-		gf_log ("rr", </div><div class='del'>-			GF_LOG_ERROR, </div><div class='del'>-			"invalid number format [%s] of option [%s]", </div><div class='del'>-			value_string, </div><div class='del'>-			RR_REFRESH_INTERVAL_OPTION_STRING);</div><div class='del'>-		return -1;</div><div class='del'>-	}</div><div class='del'>-  </div><div class='del'>-	*n = value;</div><div class='del'>-  </div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-static int </div><div class='del'>-_rr_options_read_only_subvolumes_validate (const char *value_string, </div><div class='del'>-					   char ***volume_list, </div><div class='del'>-					   uint64_t *volume_count)</div><div class='del'>-{</div><div class='del'>-	char **vlist = NULL;</div><div class='del'>-	int vcount = 0;</div><div class='del'>-	int i = 0;</div><div class='del'>-  </div><div class='del'>-	if (value_string == NULL || volume_list == NULL || volume_count)</div><div class='del'>-	{</div><div class='del'>-		return -1;</div><div class='del'>-	}</div><div class='del'>-  </div><div class='del'>-	if (gf_strsplit (value_string, </div><div class='del'>-			 ", ", </div><div class='del'>-			 &amp;vlist, </div><div class='del'>-			 &amp;vcount) != 0)</div><div class='del'>-	{</div><div class='del'>-		gf_log ("rr", </div><div class='del'>-			GF_LOG_ERROR, </div><div class='del'>-			"invalid subvolume list [%s] of option [%s]", </div><div class='del'>-			value_string, </div><div class='del'>-			RR_READ_ONLY_SUBVOLUMES_OPTION_STRING);</div><div class='del'>-		return -1;</div><div class='del'>-	}</div><div class='del'>-  </div><div class='del'>-	for (i = 0; i &lt; vcount; i++)</div><div class='del'>-	{</div><div class='del'>-		if (gf_volume_name_validate (vlist[i]) != 0)</div><div class='del'>-		{</div><div class='del'>-			gf_log ("rr", </div><div class='del'>-				GF_LOG_ERROR, </div><div class='del'>-				"invalid subvolume name [%s] in [%s] of option [%s]", </div><div class='del'>-				vlist[i], </div><div class='del'>-				value_string, </div><div class='del'>-				RR_READ_ONLY_SUBVOLUMES_OPTION_STRING);</div><div class='del'>-			goto free_exit;</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='del'>-  </div><div class='del'>-	*volume_list = vlist;</div><div class='del'>-	*volume_count = vcount;</div><div class='del'>-  </div><div class='del'>-	return 0;</div><div class='del'>-  </div><div class='del'>- free_exit:</div><div class='del'>-	for (i = 0; i &lt; vcount; i++)</div><div class='del'>-	{</div><div class='del'>-		GF_FREE (vlist[i]);</div><div class='del'>-	}</div><div class='del'>-	GF_FREE (vlist);</div><div class='del'>-  </div><div class='del'>-	return -1;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int </div><div class='del'>-rr_options_validate (dict_t *options, rr_options_t *rr_options)</div><div class='del'>-{</div><div class='del'>-	char *value_string = NULL;</div><div class='del'>-  </div><div class='del'>-	if (options == NULL || rr_options == NULL)</div><div class='del'>-	{</div><div class='del'>-		return -1;</div><div class='del'>-	}</div><div class='del'>-  </div><div class='del'>-	if (dict_get (options, RR_LIMITS_MIN_FREE_DISK_OPTION_STRING))</div><div class='del'>-		if (data_to_str (dict_get (options, RR_LIMITS_MIN_FREE_DISK_OPTION_STRING)))</div><div class='del'>-			value_string = data_to_str (dict_get (options, </div><div class='del'>-							      RR_LIMITS_MIN_FREE_DISK_OPTION_STRING));</div><div class='del'>-	if (value_string != NULL)</div><div class='del'>-	{</div><div class='del'>-		if (_rr_options_min_free_disk_validate (value_string, </div><div class='del'>-							&amp;rr_options-&gt;min_free_disk) != 0)</div><div class='del'>-		{</div><div class='del'>-			return -1;</div><div class='del'>-		}</div><div class='del'>-      </div><div class='del'>-		gf_log ("rr", </div><div class='del'>-			GF_LOG_WARNING, </div><div class='del'>-			"using %s = %d", </div><div class='del'>-			RR_LIMITS_MIN_FREE_DISK_OPTION_STRING, </div><div class='del'>-			rr_options-&gt;min_free_disk);</div><div class='del'>-	}</div><div class='del'>-	else </div><div class='del'>-	{</div><div class='del'>-		rr_options-&gt;min_free_disk = RR_LIMITS_MIN_FREE_DISK_VALUE_DEFAULT;</div><div class='del'>-      </div><div class='del'>-		gf_log ("rr", GF_LOG_DEBUG, </div><div class='del'>-			"using %s = %d [default]", </div><div class='del'>-			RR_LIMITS_MIN_FREE_DISK_OPTION_STRING, </div><div class='del'>-			rr_options-&gt;min_free_disk);</div><div class='del'>-	}</div><div class='del'>-  </div><div class='del'>-	value_string = NULL;</div><div class='del'>-	if (dict_get (options, RR_REFRESH_INTERVAL_OPTION_STRING))</div><div class='del'>-		value_string = data_to_str (dict_get (options, </div><div class='del'>-						      RR_REFRESH_INTERVAL_OPTION_STRING));</div><div class='del'>-	if (value_string != NULL)</div><div class='del'>-	{</div><div class='del'>-		if (_rr_options_refresh_interval_validate (value_string, </div><div class='del'>-							   &amp;rr_options-&gt;refresh_interval) != 0)</div><div class='del'>-		{</div><div class='del'>-			return -1;</div><div class='del'>-		}</div><div class='del'>-      </div><div class='del'>-		gf_log ("rr", </div><div class='del'>-			GF_LOG_WARNING, </div><div class='del'>-			"using %s = %d", </div><div class='del'>-			RR_REFRESH_INTERVAL_OPTION_STRING, </div><div class='del'>-			rr_options-&gt;refresh_interval);</div><div class='del'>-	}</div><div class='del'>-	else </div><div class='del'>-	{</div><div class='del'>-		rr_options-&gt;refresh_interval = RR_REFRESH_INTERVAL_VALUE_DEFAULT;</div><div class='del'>-      </div><div class='del'>-		gf_log ("rr", GF_LOG_DEBUG, </div><div class='del'>-			"using %s = %d [default]", </div><div class='del'>-			RR_REFRESH_INTERVAL_OPTION_STRING, </div><div class='del'>-			rr_options-&gt;refresh_interval);</div><div class='del'>-	}</div><div class='del'>-  </div><div class='del'>-	value_string = NULL;</div><div class='del'>-	if (dict_get (options, RR_READ_ONLY_SUBVOLUMES_OPTION_STRING))</div><div class='del'>-		value_string = data_to_str (dict_get (options, </div><div class='del'>-						      RR_READ_ONLY_SUBVOLUMES_OPTION_STRING));</div><div class='del'>-	if (value_string != NULL)</div><div class='del'>-	{</div><div class='del'>-		if (_rr_options_read_only_subvolumes_validate (value_string, </div><div class='del'>-							       &amp;rr_options-&gt;read_only_subvolume_list, </div><div class='del'>-							       &amp;rr_options-&gt;read_only_subvolume_count) != 0)</div><div class='del'>-		{</div><div class='del'>-			return -1;</div><div class='del'>-		}</div><div class='del'>-      </div><div class='del'>-		gf_log ("rr", </div><div class='del'>-			GF_LOG_WARNING, </div><div class='del'>-			"using %s = [%s]", </div><div class='del'>-			RR_READ_ONLY_SUBVOLUMES_OPTION_STRING, </div><div class='del'>-			value_string);</div><div class='del'>-	}</div><div class='del'>-  </div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-struct volume_options options[] = {</div><div class='del'>-	{ .key   = { "scheduler.refresh-interval", </div><div class='del'>-		     "rr.refresh-interval" },  </div><div class='del'>-	  .type  = GF_OPTION_TYPE_TIME</div><div class='del'>-	},</div><div class='del'>-	{ .key   = { "scheduler.limits.min-free-disk", </div><div class='del'>-		     "rr.limits.min-free-disk" },  </div><div class='del'>-	  .type  = GF_OPTION_TYPE_PERCENT</div><div class='del'>-	},</div><div class='del'>-	{ .key   = { "scheduler.read-only-subvolumes", </div><div class='del'>-		     "rr.read-only-subvolumes" },  </div><div class='del'>-	  .type  = GF_OPTION_TYPE_ANY</div><div class='del'>-	},</div><div class='del'>-	{ .key = {NULL} }</div><div class='del'>-};</div><div class='head'>diff --git a/scheduler/rr/src/rr-options.h b/scheduler/rr/src/rr-options.h<br/>deleted file mode 100644<br/>index 38d0d1e7b02..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/scheduler/rr/src/rr-options.h?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>scheduler/rr/src/rr-options.h</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,34 +0,0 @@</div><div class='del'>-/*</div><div class='del'>-   Copyright (c) 2008-2009 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='del'>-   This file is part of GlusterFS.</div><div class='del'>-</div><div class='del'>-   GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-   it under the terms of the GNU General Public License as published</div><div class='del'>-   by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-   or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-   GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-   WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-   General Public License for more details.</div><div class='del'>-</div><div class='del'>-   You should have received a copy of the GNU General Public License</div><div class='del'>-   along with this program.  If not, see</div><div class='del'>-   &lt;http://www.gnu.org/licenses/&gt;.</div><div class='del'>-*/</div><div class='del'>-</div><div class='del'>-#ifndef _RR_OPTIONS_H</div><div class='del'>-#define _RR_OPTIONS_H</div><div class='del'>-</div><div class='del'>-struct rr_options</div><div class='del'>-{</div><div class='del'>-  uint32_t min_free_disk;</div><div class='del'>-  uint32_t refresh_interval;</div><div class='del'>-  char     **read_only_subvolume_list;</div><div class='del'>-  uint64_t read_only_subvolume_count;</div><div class='del'>-};</div><div class='del'>-typedef struct rr_options rr_options_t;</div><div class='del'>-</div><div class='del'>-int rr_options_validate (dict_t *options, rr_options_t *rr_options);</div><div class='del'>-</div><div class='del'>-#endif</div><div class='head'>diff --git a/scheduler/rr/src/rr.c b/scheduler/rr/src/rr.c<br/>deleted file mode 100644<br/>index 83a0f267fd2..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/scheduler/rr/src/rr.c?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>scheduler/rr/src/rr.c</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,567 +0,0 @@</div><div class='del'>-/*</div><div class='del'>-  Copyright (c) 2006-2009 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='del'>-  This file is part of GlusterFS.</div><div class='del'>-</div><div class='del'>-  GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-  it under the terms of the GNU General Public License as published</div><div class='del'>-  by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-  or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-  GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-  WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-  General Public License for more details.</div><div class='del'>-</div><div class='del'>-  You should have received a copy of the GNU General Public License</div><div class='del'>-  along with this program.  If not, see</div><div class='del'>-  &lt;http://www.gnu.org/licenses/&gt;.</div><div class='del'>-*/</div><div class='del'>-</div><div class='del'>-#ifndef _CONFIG_H</div><div class='del'>-#define _CONFIG_H</div><div class='del'>-#include "config.h"</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-#include &lt;sys/time.h&gt;</div><div class='del'>-#include &lt;stdlib.h&gt;</div><div class='del'>-</div><div class='del'>-#include &lt;stdint.h&gt;</div><div class='del'>-</div><div class='del'>-#include "scheduler.h"</div><div class='del'>-</div><div class='del'>-#include "rr-options.h"</div><div class='del'>-#include "rr.h"</div><div class='del'>-#include "rr-mem-types.h"</div><div class='del'>-</div><div class='del'>-#define RR_MIN_FREE_DISK_NOT_REACHED    0</div><div class='del'>-#define RR_MIN_FREE_DISK_REACHED        1</div><div class='del'>-</div><div class='del'>-#define RR_SUBVOLUME_OFFLINE    0</div><div class='del'>-#define RR_SUBVOLUME_ONLINE     1</div><div class='del'>-</div><div class='del'>-#define LOG_ERROR(args...)      gf_log ("rr", GF_LOG_ERROR, ##args)</div><div class='del'>-#define LOG_WARNING(args...)    gf_log ("rr", GF_LOG_WARNING, ##args)</div><div class='del'>-#define LOG_CRITICAL(args...)    gf_log ("rr", GF_LOG_CRITICAL, ##args)</div><div class='del'>-</div><div class='del'>-#define ROUND_ROBIN(index, count)    ((index + 1) % count)</div><div class='del'>-</div><div class='del'>-static int </div><div class='del'>-_cleanup_rr (rr_t *rr)</div><div class='del'>-{</div><div class='del'>-	int i;</div><div class='del'>-  </div><div class='del'>-	if (rr == NULL)</div><div class='del'>-	{</div><div class='del'>-		return -1;</div><div class='del'>-	}</div><div class='del'>-  </div><div class='del'>-	if (rr-&gt;options.read_only_subvolume_list != NULL)</div><div class='del'>-	{</div><div class='del'>-		for (i = 0; i &lt; rr-&gt;options.read_only_subvolume_count; i++)</div><div class='del'>-		{</div><div class='del'>-			GF_FREE (rr-&gt;options.read_only_subvolume_list[i]);</div><div class='del'>-		}</div><div class='del'>-		GF_FREE (rr-&gt;options.read_only_subvolume_list);</div><div class='del'>-	}</div><div class='del'>-  </div><div class='del'>-	GF_FREE (rr-&gt;subvolume_list);</div><div class='del'>-  </div><div class='del'>-	GF_FREE (rr);</div><div class='del'>-  </div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int </div><div class='del'>-rr_init (xlator_t *this_xl)</div><div class='del'>-{</div><div class='del'>-	rr_t *rr = NULL;</div><div class='del'>-	dict_t *options = NULL;</div><div class='del'>-	xlator_list_t *children = NULL;</div><div class='del'>-	uint64_t children_count = 0;</div><div class='del'>-	int i = 0;</div><div class='del'>-	int j = 0;</div><div class='del'>-  </div><div class='del'>-	if (this_xl == NULL)</div><div class='del'>-	{</div><div class='del'>-		return -1;</div><div class='del'>-	}</div><div class='del'>-  </div><div class='del'>-	if ((options = this_xl-&gt;options) == NULL)</div><div class='del'>-	{</div><div class='del'>-		return -1;</div><div class='del'>-	}</div><div class='del'>-  </div><div class='del'>-	if ((children = this_xl-&gt;children) == NULL)</div><div class='del'>-	{</div><div class='del'>-		return -1;</div><div class='del'>-	}</div><div class='del'>-  </div><div class='del'>-	if ((rr = GF_CALLOC (1, sizeof (rr_t), gf_rr_mt_rr_t)) == NULL)</div><div class='del'>-	{</div><div class='del'>-		return -1;</div><div class='del'>-	}</div><div class='del'>-  </div><div class='del'>-	if (rr_options_validate (options, &amp;rr-&gt;options) != 0)</div><div class='del'>-	{</div><div class='del'>-		GF_FREE (rr);</div><div class='del'>-		return -1;</div><div class='del'>-	}</div><div class='del'>-  </div><div class='del'>-	for (i = 0; i &lt; rr-&gt;options.read_only_subvolume_count; i++)</div><div class='del'>-	{</div><div class='del'>-		char found = 0;</div><div class='del'>-      </div><div class='del'>-		for (children = this_xl-&gt;children; </div><div class='del'>-		     children != NULL; </div><div class='del'>-		     children = children-&gt;next)</div><div class='del'>-		{</div><div class='del'>-			if (strcmp (rr-&gt;options.read_only_subvolume_list[i], </div><div class='del'>-				    children-&gt;xlator-&gt;name) == 0)</div><div class='del'>-			{</div><div class='del'>-				found = 1;</div><div class='del'>-				break;</div><div class='del'>-			}</div><div class='del'>-		}</div><div class='del'>-      </div><div class='del'>-		if (!found)</div><div class='del'>-		{</div><div class='del'>-			LOG_ERROR ("read-only subvolume [%s] not found in volume list", </div><div class='del'>-				   rr-&gt;options.read_only_subvolume_list[i]);</div><div class='del'>-			_cleanup_rr (rr);</div><div class='del'>-			return -1;</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='del'>-  </div><div class='del'>-	for (children = this_xl-&gt;children; </div><div class='del'>-	     children != NULL; </div><div class='del'>-	     children = children-&gt;next)</div><div class='del'>-	{</div><div class='del'>-		children_count++;</div><div class='del'>-	}</div><div class='del'>-  </div><div class='del'>-	/* bala: excluding read_only_subvolumes */</div><div class='del'>-	if ((rr-&gt;subvolume_count = children_count - </div><div class='del'>-	     rr-&gt;options.read_only_subvolume_count) == 0)</div><div class='del'>-	{</div><div class='del'>-		LOG_ERROR ("no writable volumes found for scheduling");</div><div class='del'>-		_cleanup_rr (rr);</div><div class='del'>-		return -1;</div><div class='del'>-	}</div><div class='del'>-  </div><div class='del'>-	if ((rr-&gt;subvolume_list = GF_CALLOC (rr-&gt;subvolume_count, </div><div class='del'>-                                             sizeof (rr_subvolume_t),</div><div class='del'>-                                             gf_rr_mt_rr_subvolume_t)) == NULL)</div><div class='del'>-	{</div><div class='del'>-		_cleanup_rr (rr);</div><div class='del'>-		return -1;</div><div class='del'>-	}</div><div class='del'>-  </div><div class='del'>-	i = 0;</div><div class='del'>-	j = 0;</div><div class='del'>-	for (children = this_xl-&gt;children; </div><div class='del'>-	     children != NULL; </div><div class='del'>-	     children = children-&gt;next)</div><div class='del'>-	{</div><div class='del'>-		char found = 0;</div><div class='del'>-      </div><div class='del'>-		for (j = 0; j &lt; rr-&gt;options.read_only_subvolume_count; j++)</div><div class='del'>-		{</div><div class='del'>-			if (strcmp (rr-&gt;options.read_only_subvolume_list[i], </div><div class='del'>-				    children-&gt;xlator-&gt;name) == 0)</div><div class='del'>-			{</div><div class='del'>-				found = 1;</div><div class='del'>-				break;</div><div class='del'>-			}</div><div class='del'>-		}</div><div class='del'>-      </div><div class='del'>-		if (!found)</div><div class='del'>-		{</div><div class='del'>-			rr_subvolume_t *subvolume = NULL;</div><div class='del'>-	  </div><div class='del'>-			subvolume = &amp;rr-&gt;subvolume_list[i];</div><div class='del'>-	  </div><div class='del'>-			subvolume-&gt;xl = children-&gt;xlator;</div><div class='del'>-			subvolume-&gt;free_disk_status = RR_MIN_FREE_DISK_NOT_REACHED;</div><div class='del'>-			subvolume-&gt;status = RR_SUBVOLUME_ONLINE;</div><div class='del'>-	  </div><div class='del'>-			i++;</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='del'>-  </div><div class='del'>-	rr-&gt;schedule_index = UINT64_MAX;</div><div class='del'>-	rr-&gt;last_stat_fetched_time.tv_sec = 0;</div><div class='del'>-	rr-&gt;last_stat_fetched_time.tv_usec = 0;</div><div class='del'>-	pthread_mutex_init (&amp;rr-&gt;mutex, NULL);</div><div class='del'>-  </div><div class='del'>-	*((long *)this_xl-&gt;private) = (long)rr;</div><div class='del'>-  </div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-void </div><div class='del'>-rr_fini (xlator_t *this_xl)</div><div class='del'>-{</div><div class='del'>-	rr_t *rr = NULL;</div><div class='del'>-  </div><div class='del'>-	if (this_xl == NULL)</div><div class='del'>-	{</div><div class='del'>-		return;</div><div class='del'>-	}</div><div class='del'>-  </div><div class='del'>-	if ((rr = (rr_t *) *((long *)this_xl-&gt;private)) != NULL)</div><div class='del'>-	{</div><div class='del'>-		pthread_mutex_destroy (&amp;rr-&gt;mutex);</div><div class='del'>-		_cleanup_rr (rr);</div><div class='del'>-		this_xl-&gt;private = NULL;</div><div class='del'>-	}</div><div class='del'>-  </div><div class='del'>-	return;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-xlator_t *</div><div class='del'>-rr_schedule (xlator_t *this_xl, const void *path)</div><div class='del'>-{</div><div class='del'>-	rr_t *rr = NULL;</div><div class='del'>-	uint64_t next_schedule_index = 0;</div><div class='del'>-	int i = 0;</div><div class='del'>-  </div><div class='del'>-	if (this_xl == NULL || path == NULL)</div><div class='del'>-	{</div><div class='del'>-		return NULL;</div><div class='del'>-	}</div><div class='del'>-  </div><div class='del'>-	rr = (rr_t *) *((long *)this_xl-&gt;private);</div><div class='del'>-	next_schedule_index = ROUND_ROBIN (rr-&gt;schedule_index, </div><div class='del'>-					   rr-&gt;subvolume_count);</div><div class='del'>-  </div><div class='del'>-	rr_update (this_xl);</div><div class='del'>-  </div><div class='del'>-	for (i = next_schedule_index; i &lt; rr-&gt;subvolume_count; i++)</div><div class='del'>-	{</div><div class='del'>-		if (rr-&gt;subvolume_list[i].status == RR_SUBVOLUME_ONLINE &amp;&amp; </div><div class='del'>-		    rr-&gt;subvolume_list[i].status == RR_MIN_FREE_DISK_NOT_REACHED)</div><div class='del'>-		{</div><div class='del'>-			pthread_mutex_lock (&amp;rr-&gt;mutex);</div><div class='del'>-			rr-&gt;schedule_index = i;</div><div class='del'>-			pthread_mutex_unlock (&amp;rr-&gt;mutex);</div><div class='del'>-			return rr-&gt;subvolume_list[i].xl;</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='del'>-  </div><div class='del'>-	for (i = 0; i &lt; next_schedule_index; i++)</div><div class='del'>-	{</div><div class='del'>-		if (rr-&gt;subvolume_list[i].status == RR_SUBVOLUME_ONLINE &amp;&amp; </div><div class='del'>-		    rr-&gt;subvolume_list[i].status == RR_MIN_FREE_DISK_NOT_REACHED)</div><div class='del'>-		{</div><div class='del'>-			pthread_mutex_lock (&amp;rr-&gt;mutex);</div><div class='del'>-			rr-&gt;schedule_index = i;</div><div class='del'>-			pthread_mutex_unlock (&amp;rr-&gt;mutex);</div><div class='del'>-			return rr-&gt;subvolume_list[i].xl;</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='del'>-  </div><div class='del'>-	for (i = next_schedule_index; i &lt; rr-&gt;subvolume_count; i++)</div><div class='del'>-	{</div><div class='del'>-		if (rr-&gt;subvolume_list[i].status == RR_SUBVOLUME_ONLINE)</div><div class='del'>-		{</div><div class='del'>-			pthread_mutex_lock (&amp;rr-&gt;mutex);</div><div class='del'>-			rr-&gt;schedule_index = i;</div><div class='del'>-			pthread_mutex_unlock (&amp;rr-&gt;mutex);</div><div class='del'>-			return rr-&gt;subvolume_list[i].xl;</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='del'>-  </div><div class='del'>-	for (i = 0; i &lt; next_schedule_index; i++)</div><div class='del'>-	{</div><div class='del'>-		if (rr-&gt;subvolume_list[i].status == RR_SUBVOLUME_ONLINE)</div><div class='del'>-		{</div><div class='del'>-			pthread_mutex_lock (&amp;rr-&gt;mutex);</div><div class='del'>-			rr-&gt;schedule_index = i;</div><div class='del'>-			pthread_mutex_unlock (&amp;rr-&gt;mutex);</div><div class='del'>-			return rr-&gt;subvolume_list[i].xl;</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='del'>-  </div><div class='del'>-	return NULL;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-void</div><div class='del'>-rr_update (xlator_t *this_xl)</div><div class='del'>-{</div><div class='del'>-	rr_t *rr = NULL;</div><div class='del'>-	struct timeval ctime = {0, 0};</div><div class='del'>-	int i = 0;</div><div class='del'>-  </div><div class='del'>-	if (this_xl == NULL)</div><div class='del'>-	{</div><div class='del'>-		return ;</div><div class='del'>-	}</div><div class='del'>-  </div><div class='del'>-	if ((rr = (rr_t *) *((long *)this_xl-&gt;private)) == NULL)</div><div class='del'>-	{</div><div class='del'>-		return ;</div><div class='del'>-	}</div><div class='del'>-  </div><div class='del'>-	if (gettimeofday (&amp;ctime, NULL) != 0)</div><div class='del'>-	{</div><div class='del'>-		return ;</div><div class='del'>-	}</div><div class='del'>-  </div><div class='del'>-	if (ctime.tv_sec &gt; (rr-&gt;options.refresh_interval + </div><div class='del'>-			    rr-&gt;last_stat_fetched_time.tv_sec))</div><div class='del'>-	{</div><div class='del'>-		pthread_mutex_lock (&amp;rr-&gt;mutex);</div><div class='del'>-		rr-&gt;last_stat_fetched_time = ctime;</div><div class='del'>-		pthread_mutex_unlock (&amp;rr-&gt;mutex);</div><div class='del'>-      </div><div class='del'>-		for (i = 0; i &lt; rr-&gt;subvolume_count; i++)</div><div class='del'>-		{</div><div class='del'>-			xlator_t *subvolume_xl = NULL;</div><div class='del'>-			call_frame_t *frame = NULL;</div><div class='del'>-			call_pool_t *pool = NULL;</div><div class='del'>-	  </div><div class='del'>-			subvolume_xl = rr-&gt;subvolume_list[i].xl;</div><div class='del'>-	  </div><div class='del'>-			pool = this_xl-&gt;ctx-&gt;pool;</div><div class='del'>-	  </div><div class='del'>-			frame = create_frame (this_xl, pool);</div><div class='del'>-</div><div class='del'>-			STACK_WIND_COOKIE (frame,</div><div class='del'>-					   rr_update_cbk, </div><div class='del'>-					   subvolume_xl-&gt;name, </div><div class='del'>-					   subvolume_xl, </div><div class='del'>-					   subvolume_xl-&gt;mops-&gt;stats, </div><div class='del'>-					   0);</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='del'>-  </div><div class='del'>-	return ;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int </div><div class='del'>-rr_update_cbk (call_frame_t *frame, </div><div class='del'>-	       void *cookie, </div><div class='del'>-	       xlator_t *this_xl, </div><div class='del'>-	       int32_t op_ret, </div><div class='del'>-	       int32_t op_errno, </div><div class='del'>-	       struct xlator_stats *stats)</div><div class='del'>-{</div><div class='del'>-	rr_t *rr = NULL;</div><div class='del'>-	rr_subvolume_t *subvolume = NULL;</div><div class='del'>-	uint8_t free_disk_percent = 0;</div><div class='del'>-	int i = 0;</div><div class='del'>-  </div><div class='del'>-	if (frame == NULL)</div><div class='del'>-	{</div><div class='del'>-		return -1;</div><div class='del'>-	}</div><div class='del'>-  </div><div class='del'>-	if (cookie == NULL || this_xl == NULL)</div><div class='del'>-	{</div><div class='del'>-		STACK_DESTROY (frame-&gt;root);</div><div class='del'>-		return -1;</div><div class='del'>-	}</div><div class='del'>-  </div><div class='del'>-	if (op_ret == 0 &amp;&amp; stats == NULL)</div><div class='del'>-	{</div><div class='del'>-		LOG_CRITICAL ("fatal! op_ret is 0 and stats is NULL.  "</div><div class='del'>-			      "Please report this to &lt;gluster-devel@nongnu.org&gt;");</div><div class='del'>-		STACK_DESTROY (frame-&gt;root);</div><div class='del'>-		return -1;</div><div class='del'>-	}</div><div class='del'>-  </div><div class='del'>-	if ((rr = (rr_t *) *((long *)this_xl-&gt;private)) == NULL)</div><div class='del'>-	{</div><div class='del'>-		STACK_DESTROY (frame-&gt;root);</div><div class='del'>-		return -1;</div><div class='del'>-	}</div><div class='del'>-  </div><div class='del'>-	for (i = 0; i &lt; rr-&gt;subvolume_count; i++)</div><div class='del'>-	{</div><div class='del'>-		if (rr-&gt;subvolume_list[i].xl-&gt;name == (char *) cookie)</div><div class='del'>-		{</div><div class='del'>-			subvolume = &amp;rr-&gt;subvolume_list[i];</div><div class='del'>-			break;</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='del'>-  </div><div class='del'>-	if (subvolume == NULL)</div><div class='del'>-	{</div><div class='del'>-		LOG_ERROR ("unknown cookie [%s]", (char *) cookie);</div><div class='del'>-		STACK_DESTROY (frame-&gt;root);</div><div class='del'>-		return -1;</div><div class='del'>-	}</div><div class='del'>-  </div><div class='del'>-	if (op_ret == 0)</div><div class='del'>-	{</div><div class='del'>-		free_disk_percent = (stats-&gt;free_disk * 100) / stats-&gt;total_disk_size;</div><div class='del'>-		if (free_disk_percent &gt; rr-&gt;options.min_free_disk)</div><div class='del'>-		{</div><div class='del'>-			if (subvolume-&gt;free_disk_status != RR_MIN_FREE_DISK_NOT_REACHED)</div><div class='del'>-			{</div><div class='del'>-				pthread_mutex_lock (&amp;rr-&gt;mutex);</div><div class='del'>-				subvolume-&gt;free_disk_status = RR_MIN_FREE_DISK_NOT_REACHED;</div><div class='del'>-				pthread_mutex_unlock (&amp;rr-&gt;mutex);</div><div class='del'>-				LOG_WARNING ("subvolume [%s] is available with free space for scheduling", </div><div class='del'>-					     subvolume-&gt;xl-&gt;name);</div><div class='del'>-			}</div><div class='del'>-		}</div><div class='del'>-		else</div><div class='del'>-		{</div><div class='del'>-			if (subvolume-&gt;free_disk_status != RR_MIN_FREE_DISK_REACHED)</div><div class='del'>-			{</div><div class='del'>-				pthread_mutex_lock (&amp;rr-&gt;mutex);</div><div class='del'>-				subvolume-&gt;free_disk_status = RR_MIN_FREE_DISK_REACHED;</div><div class='del'>-				pthread_mutex_unlock (&amp;rr-&gt;mutex);</div><div class='del'>-				LOG_WARNING ("subvolume [%s] reached minimum disk space requirement", </div><div class='del'>-					     subvolume-&gt;xl-&gt;name);</div><div class='del'>-			}</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='del'>-	else </div><div class='del'>-	{</div><div class='del'>-		pthread_mutex_lock (&amp;rr-&gt;mutex);</div><div class='del'>-		subvolume-&gt;status = RR_SUBVOLUME_OFFLINE;</div><div class='del'>-		pthread_mutex_unlock (&amp;rr-&gt;mutex);</div><div class='del'>-		LOG_ERROR ("unable to get subvolume [%s] status information and "</div><div class='del'>-			   "scheduling is disabled", </div><div class='del'>-			   subvolume-&gt;xl-&gt;name);</div><div class='del'>-	}</div><div class='del'>-  </div><div class='del'>-	STACK_DESTROY (frame-&gt;root);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-void</div><div class='del'>-rr_notify (xlator_t *this_xl, int32_t event, void *data)</div><div class='del'>-{</div><div class='del'>-	rr_t *rr = NULL;</div><div class='del'>-	rr_subvolume_t *subvolume = NULL;</div><div class='del'>-	xlator_t *subvolume_xl = NULL;</div><div class='del'>-	int i = 0, ret = 0;</div><div class='del'>-	call_frame_t *frame = NULL;</div><div class='del'>-	call_pool_t *pool = NULL;</div><div class='del'>-	dict_t *xattr = get_new_dict ();</div><div class='del'>-	int32_t version[1] = {1};</div><div class='del'>-</div><div class='del'>-	if (this_xl == NULL || data == NULL) {</div><div class='del'>-		return ;</div><div class='del'>-	}</div><div class='del'>-  </div><div class='del'>-	if ((rr = (rr_t *) *((long *)this_xl-&gt;private)) == NULL) {</div><div class='del'>-		return ;</div><div class='del'>-	}</div><div class='del'>-  </div><div class='del'>-	subvolume_xl = (xlator_t *) data;</div><div class='del'>-  </div><div class='del'>-	for (i = 0; i &lt; rr-&gt;subvolume_count; i++) {</div><div class='del'>-		if (rr-&gt;subvolume_list[i].xl == subvolume_xl) {</div><div class='del'>-			subvolume = &amp;rr-&gt;subvolume_list[i];</div><div class='del'>-			break;</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='del'>-  </div><div class='del'>-	switch (event) {</div><div class='del'>-	case GF_EVENT_CHILD_UP:</div><div class='del'>-		/* Seeding, to be done only once */</div><div class='del'>-		if (rr-&gt;first_time &amp;&amp; (i == rr-&gt;subvolume_count)) {</div><div class='del'>-			loc_t loc = {0,};</div><div class='del'>-			xlator_t *trav = NULL;</div><div class='del'>-</div><div class='del'>-			pool = this_xl-&gt;ctx-&gt;pool;</div><div class='del'>-			frame = create_frame (this_xl, pool);</div><div class='del'>-			ret = dict_set_bin (xattr, "trusted.glusterfs.scheduler.rr",</div><div class='del'>-					    version, sizeof (int32_t));</div><div class='del'>-			if (-1 == ret) {</div><div class='del'>-				gf_log (this_xl-&gt;name, GF_LOG_ERROR, "rr seed setting failed");</div><div class='del'>-			}</div><div class='del'>-			if (xattr)</div><div class='del'>-				dict_ref (xattr);</div><div class='del'>-			</div><div class='del'>-			loc.path = gf_strdup ("/");</div><div class='del'>-			for (trav = this_xl-&gt;parents-&gt;xlator; trav; trav = trav-&gt;parents-&gt;xlator) {</div><div class='del'>-				if (trav-&gt;itable) {</div><div class='del'>-					loc.inode = trav-&gt;itable-&gt;root;</div><div class='del'>-					break;</div><div class='del'>-				}</div><div class='del'>-			}</div><div class='del'>-			STACK_WIND (frame,</div><div class='del'>-				    rr_notify_cbk,</div><div class='del'>-				    (xlator_t *)data,</div><div class='del'>-				    ((xlator_t *)data)-&gt;fops-&gt;xattrop,</div><div class='del'>-				    &amp;loc,</div><div class='del'>-				    GF_XATTROP_ADD_ARRAY,</div><div class='del'>-				    xattr);</div><div class='del'>-	  </div><div class='del'>-			if (xattr)</div><div class='del'>-				dict_unref (xattr);</div><div class='del'>-</div><div class='del'>-			rr-&gt;first_time = 0;</div><div class='del'>-		}</div><div class='del'>-		if (subvolume) {</div><div class='del'>-			pthread_mutex_lock (&amp;rr-&gt;mutex);</div><div class='del'>-			subvolume-&gt;status = RR_SUBVOLUME_ONLINE;</div><div class='del'>-			pthread_mutex_unlock (&amp;rr-&gt;mutex);</div><div class='del'>-		}</div><div class='del'>-		break;</div><div class='del'>-	case GF_EVENT_CHILD_DOWN:</div><div class='del'>-		if (subvolume) {</div><div class='del'>-			pthread_mutex_lock (&amp;rr-&gt;mutex);</div><div class='del'>-			subvolume-&gt;status = RR_SUBVOLUME_OFFLINE;</div><div class='del'>-			pthread_mutex_unlock (&amp;rr-&gt;mutex);</div><div class='del'>-		}</div><div class='del'>-		break;</div><div class='del'>-	}</div><div class='del'>-  </div><div class='del'>-	return ;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int </div><div class='del'>-rr_notify_cbk (call_frame_t *frame, </div><div class='del'>-	       void *cookie, </div><div class='del'>-	       xlator_t *this_xl, </div><div class='del'>-	       int32_t op_ret, </div><div class='del'>-	       int32_t op_errno,</div><div class='del'>-	       dict_t *xattr)</div><div class='del'>-{</div><div class='del'>-	rr_t *rr = NULL;</div><div class='del'>-	int32_t *index = NULL;</div><div class='del'>-	int32_t ret = -1;</div><div class='del'>-	void *tmp_index_ptr = NULL;</div><div class='del'>-</div><div class='del'>-	if (frame == NULL) </div><div class='del'>-	{</div><div class='del'>-		return -1;</div><div class='del'>-	}</div><div class='del'>-  </div><div class='del'>-	if ((this_xl == NULL) || (op_ret == -1))</div><div class='del'>-	{</div><div class='del'>-		STACK_DESTROY (frame-&gt;root);</div><div class='del'>-		return -1;</div><div class='del'>-	}</div><div class='del'>-  </div><div class='del'>-	if ((rr = (rr_t *) *((long *)this_xl-&gt;private)) == NULL)</div><div class='del'>-	{</div><div class='del'>-		STACK_DESTROY (frame-&gt;root);</div><div class='del'>-		return -1;</div><div class='del'>-	}</div><div class='del'>-  </div><div class='del'>-	ret = dict_get_bin (xattr, "trusted.glusterfs.scheduler.rr", &amp;tmp_index_ptr);</div><div class='del'>-	index = tmp_index_ptr;</div><div class='del'>-	if (ret == 0)</div><div class='del'>-		rr-&gt;schedule_index = (index[0] % rr-&gt;subvolume_count);</div><div class='del'>-	else</div><div class='del'>-		rr-&gt;schedule_index = 0;</div><div class='del'>-</div><div class='del'>-	STACK_DESTROY (frame-&gt;root);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-struct sched_ops sched = {</div><div class='del'>-	.init     = rr_init,</div><div class='del'>-	.fini     = rr_fini,</div><div class='del'>-	.update   = rr_update,</div><div class='del'>-	.schedule = rr_schedule,</div><div class='del'>-	.notify   = rr_notify</div><div class='del'>-};</div><div class='del'>-</div><div class='head'>diff --git a/scheduler/rr/src/rr.h b/scheduler/rr/src/rr.h<br/>deleted file mode 100644<br/>index 05c01da32e5..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/scheduler/rr/src/rr.h?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>scheduler/rr/src/rr.h</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,70 +0,0 @@</div><div class='del'>-/*</div><div class='del'>-   Copyright (c) 2006-2009 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='del'>-   This file is part of GlusterFS.</div><div class='del'>-</div><div class='del'>-   GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-   it under the terms of the GNU General Public License as published</div><div class='del'>-   by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-   or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-   GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-   WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-   General Public License for more details.</div><div class='del'>-</div><div class='del'>-   You should have received a copy of the GNU General Public License</div><div class='del'>-   along with this program.  If not, see</div><div class='del'>-   &lt;http://www.gnu.org/licenses/&gt;.</div><div class='del'>-*/</div><div class='del'>-</div><div class='del'>-#ifndef _RR_H</div><div class='del'>-#define _RR_H</div><div class='del'>-</div><div class='del'>-#ifndef _CONFIG_H</div><div class='del'>-#define _CONFIG_H</div><div class='del'>-#include "config.h"</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-#include "scheduler.h"</div><div class='del'>-#include &lt;stdint.h&gt;</div><div class='del'>-#include &lt;sys/time.h&gt;</div><div class='del'>-</div><div class='del'>-struct rr_subvolume</div><div class='del'>-{</div><div class='del'>-  xlator_t  *xl;</div><div class='del'>-  uint8_t   free_disk_status;</div><div class='del'>-  uint8_t   status;</div><div class='del'>-};</div><div class='del'>-typedef struct rr_subvolume rr_subvolume_t;</div><div class='del'>-</div><div class='del'>-struct rr</div><div class='del'>-{</div><div class='del'>-  rr_options_t    options;</div><div class='del'>-  rr_subvolume_t  *subvolume_list;</div><div class='del'>-  uint64_t        subvolume_count;</div><div class='del'>-  uint64_t        schedule_index;</div><div class='del'>-  struct timeval  last_stat_fetched_time;</div><div class='del'>-  pthread_mutex_t mutex;</div><div class='del'>-  char            first_time;</div><div class='del'>-};</div><div class='del'>-typedef struct rr rr_t;</div><div class='del'>-</div><div class='del'>-int rr_init (xlator_t *this_xl);</div><div class='del'>-void rr_fini (xlator_t *this_xl);</div><div class='del'>-xlator_t *rr_schedule (xlator_t *this_xl, const void *path);</div><div class='del'>-void rr_update (xlator_t *this_xl);</div><div class='del'>-int rr_update_cbk (call_frame_t *frame, </div><div class='del'>-		   void *cookie, </div><div class='del'>-		   xlator_t *this_xl, </div><div class='del'>-		   int32_t op_ret, </div><div class='del'>-		   int32_t op_errno, </div><div class='del'>-		   struct xlator_stats *stats);</div><div class='del'>-void rr_notify (xlator_t *this_xl, int32_t event, void *data);</div><div class='del'>-int rr_notify_cbk (call_frame_t *frame, </div><div class='del'>-		   void *cookie, </div><div class='del'>-		   xlator_t *this_xl, </div><div class='del'>-		   int32_t op_ret, </div><div class='del'>-		   int32_t op_errno,</div><div class='del'>-		   dict_t *xattr);</div><div class='del'>-</div><div class='del'>-#endif /* _RR_H */</div><div class='head'>diff --git a/scheduler/switch/Makefile.am b/scheduler/switch/Makefile.am<br/>deleted file mode 100644<br/>index d471a3f9243..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/scheduler/switch/Makefile.am?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>scheduler/switch/Makefile.am</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,3 +0,0 @@</div><div class='del'>-SUBDIRS = src</div><div class='del'>-</div><div class='del'>-CLEANFILES = </div><div class='head'>diff --git a/scheduler/switch/src/Makefile.am b/scheduler/switch/src/Makefile.am<br/>deleted file mode 100644<br/>index dc7d16d40d2..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/scheduler/switch/src/Makefile.am?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>scheduler/switch/src/Makefile.am</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,12 +0,0 @@</div><div class='del'>-sched_LTLIBRARIES = switch.la</div><div class='del'>-scheddir = $(libdir)/glusterfs/$(PACKAGE_VERSION)/scheduler</div><div class='del'>-</div><div class='del'>-switch_la_LDFLAGS = -module -avoidversion</div><div class='del'>-</div><div class='del'>-switch_la_SOURCES = switch.c</div><div class='del'>-switch_la_LIBADD = $(top_builddir)/libglusterfs/src/libglusterfs.la</div><div class='del'>-</div><div class='del'>-AM_CFLAGS = -fPIC -D_FILE_OFFSET_BITS=64 -D_GNU_SOURCE -Wall -D$(GF_HOST_OS) \</div><div class='del'>-	-I$(top_srcdir)/libglusterfs/src -shared -nostartfiles $(GF_CFLAGS)</div><div class='del'>-</div><div class='del'>-CLEANFILES = </div><div class='head'>diff --git a/scheduler/switch/src/switch-mem-types.h b/scheduler/switch/src/switch-mem-types.h<br/>deleted file mode 100644<br/>index 07773da4e2f..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/scheduler/switch/src/switch-mem-types.h?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>scheduler/switch/src/switch-mem-types.h</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,33 +0,0 @@</div><div class='del'>-/*</div><div class='del'>-   Copyright (c) 2008-2009 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='del'>-   This file is part of GlusterFS.</div><div class='del'>-</div><div class='del'>-   GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-   it under the terms of the GNU General Public License as published</div><div class='del'>-   by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-   or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-   GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-   WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-   General Public License for more details.</div><div class='del'>-</div><div class='del'>-   You should have received a copy of the GNU General Public License</div><div class='del'>-   along with this program.  If not, see</div><div class='del'>-   &lt;http://www.gnu.org/licenses/&gt;.</div><div class='del'>-*/</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-#ifndef __SWITCH_MEM_TYPES_H__</div><div class='del'>-#define __SWITCH_MEM_TYPES_H__</div><div class='del'>-</div><div class='del'>-#include "mem-types.h"</div><div class='del'>-</div><div class='del'>-enum gf_switch_mem_types_ {</div><div class='del'>-        gf_switch_mt_switch_struct = gf_common_mt_end + 1,</div><div class='del'>-        gf_switch_mt_switch_sched_struct,</div><div class='del'>-        gf_switch_mt_switch_sched_array,</div><div class='del'>-        gf_switch_mt_end</div><div class='del'>-};</div><div class='del'>-#endif</div><div class='del'>-</div><div class='head'>diff --git a/scheduler/switch/src/switch.c b/scheduler/switch/src/switch.c<br/>deleted file mode 100644<br/>index 5a5d20f8d50..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/scheduler/switch/src/switch.c?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>scheduler/switch/src/switch.c</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,451 +0,0 @@</div><div class='del'>-/*</div><div class='del'>-  Copyright (c) 2006-2009 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='del'>-  This file is part of GlusterFS.</div><div class='del'>-</div><div class='del'>-  GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-  it under the terms of the GNU General Public License as published</div><div class='del'>-  by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-  or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-  GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-  WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-  General Public License for more details.</div><div class='del'>-</div><div class='del'>-  You should have received a copy of the GNU General Public License</div><div class='del'>-  along with this program.  If not, see</div><div class='del'>-  &lt;http://www.gnu.org/licenses/&gt;.</div><div class='del'>-*/</div><div class='del'>-</div><div class='del'>-#include &lt;sys/time.h&gt;</div><div class='del'>-#include &lt;stdlib.h&gt;</div><div class='del'>-#include &lt;fnmatch.h&gt;</div><div class='del'>-</div><div class='del'>-#ifndef _CONFIG_H</div><div class='del'>-#define _CONFIG_H</div><div class='del'>-#include "config.h"</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-#include "xlator.h"</div><div class='del'>-#include "scheduler.h"</div><div class='del'>-#include "switch-mem-types.h"</div><div class='del'>-</div><div class='del'>-struct switch_sched_array {</div><div class='del'>-	xlator_t *xl;</div><div class='del'>-	int32_t   eligible;</div><div class='del'>-	int32_t   considered;</div><div class='del'>-};</div><div class='del'>-</div><div class='del'>-/* Select one of this struct based on the path's pattern match */</div><div class='del'>-struct switch_sched_struct {</div><div class='del'>-	struct switch_sched_struct *next;</div><div class='del'>-	struct switch_sched_array  *array;</div><div class='del'>-	char                        path_pattern[256];</div><div class='del'>-	int32_t                     node_index; /* Index of the node in </div><div class='del'>-						   this pattern. */</div><div class='del'>-	int32_t                     num_child;  /* Total num of child nodes </div><div class='del'>-						   with this pattern. */</div><div class='del'>-};</div><div class='del'>-</div><div class='del'>-struct switch_struct {</div><div class='del'>-	struct switch_sched_struct *cond;</div><div class='del'>-	struct switch_sched_array  *array;</div><div class='del'>-	pthread_mutex_t             switch_mutex;</div><div class='del'>-	int32_t                     child_count;</div><div class='del'>-};</div><div class='del'>-</div><div class='del'>-/* This function should return child node as '*:subvolumes' is inserterd */</div><div class='del'>-static xlator_t *</div><div class='del'>-switch_get_matching_xl (const char *path, struct switch_sched_struct *cond)</div><div class='del'>-{</div><div class='del'>-	struct switch_sched_struct *trav      = cond;</div><div class='del'>-	char                       *pathname  = gf_strdup (path);</div><div class='del'>-	int                         index     = 0;</div><div class='del'>-</div><div class='del'>-	while (trav) {</div><div class='del'>-		if (fnmatch (trav-&gt;path_pattern, </div><div class='del'>-			     pathname, FNM_NOESCAPE) == 0) {</div><div class='del'>-			GF_FREE (pathname);</div><div class='del'>-			trav-&gt;node_index %= trav-&gt;num_child;</div><div class='del'>-			index = (trav-&gt;node_index++) % trav-&gt;num_child;</div><div class='del'>-			return trav-&gt;array[index].xl;</div><div class='del'>-		}</div><div class='del'>-		trav = trav-&gt;next;</div><div class='del'>-	}</div><div class='del'>-	GF_FREE (pathname);</div><div class='del'>-	return NULL;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-static int32_t</div><div class='del'>-gf_unify_valid_child (const char *child, </div><div class='del'>-                      xlator_t *xl)</div><div class='del'>-{</div><div class='del'>-        xlator_list_t *children = NULL, *prev = NULL;</div><div class='del'>-        int32_t  ret = 0;</div><div class='del'>-</div><div class='del'>-        children = xl-&gt;children;</div><div class='del'>-        do {</div><div class='del'>-                if (!strcmp (child, children-&gt;xlator-&gt;name)) {</div><div class='del'>-                        ret = 1;</div><div class='del'>-                        break;</div><div class='del'>-                }</div><div class='del'>-                </div><div class='del'>-                prev = children;</div><div class='del'>-                children = prev-&gt;next;</div><div class='del'>-        } while (children);</div><div class='del'>-</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-static int32_t</div><div class='del'>-switch_init (xlator_t *xl)</div><div class='del'>-{</div><div class='del'>-	int32_t index = 0;</div><div class='del'>-	data_t *data = NULL;</div><div class='del'>-	char *child = NULL;</div><div class='del'>-	char *tmp = NULL;</div><div class='del'>-	char *childs_data = NULL;</div><div class='del'>-	xlator_list_t *trav_xl = xl-&gt;children;</div><div class='del'>-	struct switch_struct *switch_buf = NULL;</div><div class='del'>-  </div><div class='del'>-	switch_buf = GF_CALLOC (1, sizeof (struct switch_struct),</div><div class='del'>-                                gf_switch_mt_switch_struct);</div><div class='del'>-	ERR_ABORT (switch_buf);</div><div class='del'>-</div><div class='del'>-	while (trav_xl) {</div><div class='del'>-		index++;</div><div class='del'>-		trav_xl = trav_xl-&gt;next;</div><div class='del'>-	}</div><div class='del'>-	switch_buf-&gt;child_count = index;</div><div class='del'>-	switch_buf-&gt;array = GF_CALLOC (index + 1,</div><div class='del'>-                                       sizeof (struct switch_sched_struct),</div><div class='del'>-                                       gf_switch_mt_switch_sched_struct);</div><div class='del'>-	ERR_ABORT (switch_buf-&gt;array);</div><div class='del'>-	trav_xl = xl-&gt;children;</div><div class='del'>-	index = 0;</div><div class='del'>-</div><div class='del'>-	while (trav_xl) {</div><div class='del'>-		switch_buf-&gt;array[index].xl = trav_xl-&gt;xlator;</div><div class='del'>-		switch_buf-&gt;array[index].eligible = 1;</div><div class='del'>-		trav_xl = trav_xl-&gt;next;</div><div class='del'>-		index++;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	data = dict_get (xl-&gt;options, "scheduler.read-only-subvolumes");</div><div class='del'>-	if (data) {</div><div class='del'>-		childs_data = gf_strdup (data-&gt;data);</div><div class='del'>-		child = strtok_r (childs_data, ",", &amp;tmp);</div><div class='del'>-		while (child) {</div><div class='del'>-			for (index = 1; </div><div class='del'>-			     index &lt; switch_buf-&gt;child_count; index++) {</div><div class='del'>-				if (strcmp (switch_buf-&gt;array[index - 1].xl-&gt;name, child) == 0) {</div><div class='del'>-					gf_log ("switch", GF_LOG_DEBUG, </div><div class='del'>-						"Child '%s' is read-only", </div><div class='del'>-						child);</div><div class='del'>-					memcpy (&amp;(switch_buf-&gt;array[index-1]),</div><div class='del'>-						&amp;(switch_buf-&gt;array[switch_buf-&gt;child_count - 1]), </div><div class='del'>-						sizeof (struct switch_sched_array));</div><div class='del'>-					switch_buf-&gt;child_count--;</div><div class='del'>-					break;</div><div class='del'>-				}</div><div class='del'>-			}</div><div class='del'>-			child = strtok_r (NULL, ",", &amp;tmp);</div><div class='del'>-		}</div><div class='del'>-		GF_FREE (childs_data);</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	data = dict_get (xl-&gt;options, "scheduler.local-volume-name");</div><div class='del'>-	if (data) {</div><div class='del'>-		/* Means, give preference to that node first */</div><div class='del'>-		gf_log ("switch", GF_LOG_DEBUG, </div><div class='del'>-			"local volume defined as %s", data-&gt;data);</div><div class='del'>-</div><div class='del'>-		/* TODO: parse it properly, have an extra index to </div><div class='del'>-		   specify that first */</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	/*  *jpg:child1,child2;*mpg:child3;*:child4,child5,child6 */</div><div class='del'>-	data = dict_get (xl-&gt;options, "scheduler.switch.case");</div><div class='del'>-	if (data) {</div><div class='del'>-		char *tmp_str = NULL; </div><div class='del'>-		char *tmp_str1 = NULL;</div><div class='del'>-		char *dup_str = NULL;</div><div class='del'>-		char *switch_str = NULL;</div><div class='del'>-		char *pattern = NULL;</div><div class='del'>-		char *childs = NULL;</div><div class='del'>-		struct switch_sched_struct *switch_opt = NULL;</div><div class='del'>-		struct switch_sched_struct *trav = NULL;</div><div class='del'>-		/* Get the pattern for considering switch case. </div><div class='del'>-		   "option block-size *avi:10MB" etc */</div><div class='del'>-		switch_str = strtok_r (data-&gt;data, ";", &amp;tmp_str);</div><div class='del'>-		while (switch_str) {</div><div class='del'>-			dup_str = gf_strdup (switch_str);</div><div class='del'>-			switch_opt = </div><div class='del'>-				GF_CALLOC (1, sizeof (struct switch_sched_struct), gf_switch_mt_switch_sched_struct);</div><div class='del'>-			ERR_ABORT (switch_opt);</div><div class='del'>-</div><div class='del'>-			/* Link it to the main structure */</div><div class='del'>-			if (switch_buf-&gt;cond) {</div><div class='del'>-				/* there are already few entries */</div><div class='del'>-				trav = switch_buf-&gt;cond;</div><div class='del'>-				while (trav-&gt;next)</div><div class='del'>-					trav = trav-&gt;next;</div><div class='del'>-				trav-&gt;next = switch_opt;</div><div class='del'>-			} else {</div><div class='del'>-				/* First entry */</div><div class='del'>-				switch_buf-&gt;cond = switch_opt;</div><div class='del'>-			}</div><div class='del'>-			pattern = strtok_r (dup_str, ":", &amp;tmp_str1);</div><div class='del'>-			childs = strtok_r (NULL, ":", &amp;tmp_str1);</div><div class='del'>-			if (strncmp (pattern, "*", 2) == 0) {</div><div class='del'>-				gf_log ("switch", GF_LOG_WARNING,</div><div class='del'>-					"'*' pattern will be taken by default "</div><div class='del'>-					"for all the unconfigured child nodes,"</div><div class='del'>-					" hence neglecting current option");</div><div class='del'>-				switch_str = strtok_r (NULL, ";", &amp;tmp_str);</div><div class='del'>-				GF_FREE (dup_str);</div><div class='del'>-				continue;</div><div class='del'>-			}</div><div class='del'>-			memcpy (switch_opt-&gt;path_pattern, </div><div class='del'>-				pattern, strlen (pattern));</div><div class='del'>-			if (childs) {</div><div class='del'>-				int32_t idx = 0;</div><div class='del'>-				char *tmp1 = NULL;</div><div class='del'>-				char *dup_childs = NULL;</div><div class='del'>-				/* TODO: get the list of child nodes for </div><div class='del'>-				   the given pattern */</div><div class='del'>-				dup_childs = gf_strdup (childs);</div><div class='del'>-				child = strtok_r (dup_childs, ",", &amp;tmp);</div><div class='del'>-				while (child) {</div><div class='del'>-                                        if (gf_unify_valid_child (child, xl)) {</div><div class='del'>-                                                idx++;</div><div class='del'>-                                                child = strtok_r (NULL, ",", &amp;tmp);</div><div class='del'>-                                        } else {</div><div class='del'>-                                                gf_log ("switch", GF_LOG_ERROR,</div><div class='del'>-                                                        "%s is not a subvolume "</div><div class='del'>-                                                        "of %s. pattern can "</div><div class='del'>-                                                        "only be scheduled only"</div><div class='del'>-                                                        " to a subvolume of %s",</div><div class='del'>-                                                        child, xl-&gt;name,</div><div class='del'>-                                                        xl-&gt;name);</div><div class='del'>-                                                return -1;</div><div class='del'>-                                        }</div><div class='del'>-				}</div><div class='del'>-				GF_FREE (dup_childs);</div><div class='del'>-				child = strtok_r (childs, ",", &amp;tmp1);</div><div class='del'>-				switch_opt-&gt;num_child = idx;</div><div class='del'>-				switch_opt-&gt;array = </div><div class='del'>-					GF_CALLOC (1, idx * sizeof (struct switch_sched_array), gf_switch_mt_switch_sched_array);</div><div class='del'>-				ERR_ABORT (switch_opt-&gt;array);</div><div class='del'>-				idx = 0;</div><div class='del'>-				child = strtok_r (childs, ",", &amp;tmp);</div><div class='del'>-				while (child) {</div><div class='del'>-					for (index = 1; </div><div class='del'>-					     index &lt; switch_buf-&gt;child_count; </div><div class='del'>-					     index++) {</div><div class='del'>-						if (strcmp (switch_buf-&gt;array[index - 1].xl-&gt;name, </div><div class='del'>-							    child) == 0) {</div><div class='del'>-							gf_log ("switch", </div><div class='del'>-								GF_LOG_DEBUG,</div><div class='del'>-								"'%s' pattern will be scheduled to \"%s\"",</div><div class='del'>-								switch_opt-&gt;path_pattern, child);</div><div class='del'>-							/*</div><div class='del'>-							  if (switch_buf-&gt;array[index-1].considered) {</div><div class='del'>-							  gf_log ("switch", GF_LOG_DEBUG, </div><div class='del'>-							  "ambiguity found, exiting");</div><div class='del'>-							  return -1;</div><div class='del'>-							  }</div><div class='del'>-							*/</div><div class='del'>-							switch_opt-&gt;array[idx].xl = switch_buf-&gt;array[index-1].xl;</div><div class='del'>-							switch_buf-&gt;array[index-1].considered = 1;</div><div class='del'>-							idx++;</div><div class='del'>-							break;</div><div class='del'>-						}</div><div class='del'>-					}</div><div class='del'>-					child = strtok_r (NULL, ",", &amp;tmp1);</div><div class='del'>-				}</div><div class='del'>-			} else {</div><div class='del'>-				/* error */</div><div class='del'>-				gf_log ("switch", GF_LOG_ERROR, </div><div class='del'>-					"Check \"scheduler.switch.case\" "</div><div class='del'>-					"option in unify volume. Exiting");</div><div class='del'>-				GF_FREE (switch_buf-&gt;array);</div><div class='del'>-				GF_FREE (switch_buf);</div><div class='del'>-				return -1;</div><div class='del'>-			}</div><div class='del'>-			GF_FREE (dup_str);</div><div class='del'>-			switch_str = strtok_r (NULL, ";", &amp;tmp_str);</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='del'>-	/* Now, all the pattern based considerations done, so for all the </div><div class='del'>-	 * remaining pattern, '*' to all the remaining child nodes</div><div class='del'>-	 */</div><div class='del'>-	{</div><div class='del'>-		struct switch_sched_struct *switch_opt = NULL;</div><div class='del'>-		int32_t flag = 0;</div><div class='del'>-		int32_t index = 0;</div><div class='del'>-		for (index=0; index &lt; switch_buf-&gt;child_count; index++) {</div><div class='del'>-			/* check for considered flag */</div><div class='del'>-			if (switch_buf-&gt;array[index].considered)</div><div class='del'>-				continue;</div><div class='del'>-			flag++;</div><div class='del'>-		}</div><div class='del'>-		if (!flag) {</div><div class='del'>-			gf_log ("switch", GF_LOG_ERROR,</div><div class='del'>-				"No nodes left for pattern '*'. Exiting.");</div><div class='del'>-			return -1;</div><div class='del'>-		}</div><div class='del'>-		switch_opt = GF_CALLOC (1, sizeof (struct switch_sched_struct), gf_switch_mt_switch_sched_struct);</div><div class='del'>-		ERR_ABORT (switch_opt);</div><div class='del'>-		if (switch_buf-&gt;cond) {</div><div class='del'>-			/* there are already few entries */</div><div class='del'>-			struct switch_sched_struct *trav = switch_buf-&gt;cond;</div><div class='del'>-			while (trav-&gt;next)</div><div class='del'>-				trav = trav-&gt;next;</div><div class='del'>-			trav-&gt;next = switch_opt;</div><div class='del'>-		} else {</div><div class='del'>-			/* First entry */</div><div class='del'>-			switch_buf-&gt;cond = switch_opt;</div><div class='del'>-		}</div><div class='del'>-		/* Add the '*' pattern to the array */</div><div class='del'>-		memcpy (switch_opt-&gt;path_pattern, "*", 2);</div><div class='del'>-		switch_opt-&gt;num_child = flag;</div><div class='del'>-		switch_opt-&gt;array = </div><div class='del'>-			GF_CALLOC (1, flag * sizeof (struct switch_sched_array), gf_switch_mt_switch_sched_array);</div><div class='del'>-		ERR_ABORT (switch_opt-&gt;array);</div><div class='del'>-		flag = 0;</div><div class='del'>-		for (index=0; index &lt; switch_buf-&gt;child_count; index++) {</div><div class='del'>-			/* check for considered flag */</div><div class='del'>-			if (switch_buf-&gt;array[index].considered)</div><div class='del'>-				continue;</div><div class='del'>-			gf_log ("switch", GF_LOG_DEBUG,</div><div class='del'>-				"'%s' pattern will be scheduled to \"%s\"",</div><div class='del'>-				switch_opt-&gt;path_pattern, </div><div class='del'>-				switch_buf-&gt;array[index].xl-&gt;name);</div><div class='del'>-			switch_opt-&gt;array[flag].xl = </div><div class='del'>-				switch_buf-&gt;array[index].xl;</div><div class='del'>-			switch_buf-&gt;array[index].considered = 1;</div><div class='del'>-			flag++;</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	pthread_mutex_init (&amp;switch_buf-&gt;switch_mutex, NULL);</div><div class='del'>-</div><div class='del'>-	// put it at the proper place</div><div class='del'>-	*((long *)xl-&gt;private) = (long)switch_buf; </div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-static void</div><div class='del'>-switch_fini (xlator_t *xl)</div><div class='del'>-{</div><div class='del'>-	/* TODO: free all the allocated entries */</div><div class='del'>-	struct switch_struct *switch_buf = NULL;</div><div class='del'>-	switch_buf = (struct switch_struct *)*((long *)xl-&gt;private);</div><div class='del'>-</div><div class='del'>-	pthread_mutex_destroy (&amp;switch_buf-&gt;switch_mutex);</div><div class='del'>-	GF_FREE (switch_buf-&gt;array);</div><div class='del'>-	GF_FREE (switch_buf);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-static xlator_t *</div><div class='del'>-switch_schedule (xlator_t *xl, const void *path)</div><div class='del'>-{</div><div class='del'>-	struct switch_struct *switch_buf = NULL;</div><div class='del'>-	switch_buf = (struct switch_struct *)*((long *)xl-&gt;private);</div><div class='del'>-</div><div class='del'>-	return switch_get_matching_xl (path, switch_buf-&gt;cond);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-/**</div><div class='del'>- * notify</div><div class='del'>- */</div><div class='del'>-void</div><div class='del'>-switch_notify (xlator_t *xl, int32_t event, void *data)</div><div class='del'>-{</div><div class='del'>-	/* TODO: This should be checking in switch_sched_struct */</div><div class='del'>-#if 0</div><div class='del'>-	struct switch_struct *switch_buf = NULL;</div><div class='del'>-	int32_t idx = 0;</div><div class='del'>-</div><div class='del'>-	switch_buf = (struct switch_struct *)*((long *)xl-&gt;private);</div><div class='del'>-	if (!switch_buf)</div><div class='del'>-		return;</div><div class='del'>-</div><div class='del'>-	for (idx = 0; idx &lt; switch_buf-&gt;child_count; idx++) {</div><div class='del'>-		if (switch_buf-&gt;array[idx].xl == (xlator_t *)data)</div><div class='del'>-			break;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	switch (event)</div><div class='del'>-	{</div><div class='del'>-	case GF_EVENT_CHILD_UP:</div><div class='del'>-	{</div><div class='del'>-		switch_buf-&gt;array[idx].eligible = 1;</div><div class='del'>-	}</div><div class='del'>-	break;</div><div class='del'>-	case GF_EVENT_CHILD_DOWN:</div><div class='del'>-	{</div><div class='del'>-		switch_buf-&gt;array[idx].eligible = 0;</div><div class='del'>-	}</div><div class='del'>-	break;</div><div class='del'>-	default:</div><div class='del'>-	{</div><div class='del'>-		;</div><div class='del'>-	}</div><div class='del'>-	break;</div><div class='del'>-	}</div><div class='del'>-#endif</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-static void </div><div class='del'>-switch_update (xlator_t *xl)</div><div class='del'>-{</div><div class='del'>-	return;</div><div class='del'>-}</div><div class='del'>-        </div><div class='del'>-int32_t</div><div class='del'>-switch_mem_acct_init (xlator_t *this)</div><div class='del'>-{</div><div class='del'>-        int     ret = -1;</div><div class='del'>-</div><div class='del'>-        if (!this)</div><div class='del'>-                return ret;</div><div class='del'>-</div><div class='del'>-        ret = xlator_mem_acct_init (this, gf_switch_mt_end + 1);</div><div class='del'>-        </div><div class='del'>-        if (ret != 0) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_ERROR, "Memory accounting init"</div><div class='del'>-                        " failed");</div><div class='del'>-                return ret;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-struct sched_ops sched = {</div><div class='del'>-	.init     = switch_init,</div><div class='del'>-	.fini     = switch_fini,</div><div class='del'>-	.update   = switch_update,</div><div class='del'>-	.schedule = switch_schedule,</div><div class='del'>-	.notify   = switch_notify,</div><div class='del'>-        .mem_acct_init = switch_mem_acct_init,</div><div class='del'>-};</div><div class='del'>-</div><div class='del'>-struct volume_options options[] = {</div><div class='del'>-	{ .key   = { "scheduler.read-only-subvolumes" ,</div><div class='del'>-		     "switch.read-only-subvolumes"},  </div><div class='del'>-	  .type  = GF_OPTION_TYPE_ANY</div><div class='del'>-	},</div><div class='del'>-	{ .key   = { "scheduler.local-volume-name",</div><div class='del'>-		     "switch.nufa.local-volume-name" },</div><div class='del'>-	  .type  = GF_OPTION_TYPE_XLATOR</div><div class='del'>-	},</div><div class='del'>-	{ .key   = { "scheduler.switch.case",</div><div class='del'>-		     "switch.case" },</div><div class='del'>-	  .type  = GF_OPTION_TYPE_ANY</div><div class='del'>-	},</div><div class='del'>-	{ .key = {NULL} }</div><div class='del'>-};</div><div class='head'>diff --git a/site.h.in b/site.h.in<br/>new file mode 100644<br/>index 00000000000..eb2f062e60c<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/site.h.in?id=d1d7a6f35c816822fab51c820e25023863c239c1'>site.h.in</a></div><div class='hunk'>@@ -0,0 +1,44 @@</div><div class='add'>+/*</div><div class='add'>+ * Guidelines for using this file vs. configure.ac</div><div class='add'>+ *</div><div class='add'>+ * (1) If it already exists in configure.ac, leave it there.</div><div class='add'>+ *</div><div class='add'>+ * (2) If it needs to take effect at configure (not compile) time, it *needs*</div><div class='add'>+ * to go in configure.ac.</div><div class='add'>+ *</div><div class='add'>+ * (3) If it affects file paths, which are the things most likely to be based</div><div class='add'>+ * on an OS or distribution's generic filesystem hierarchy and not on a</div><div class='add'>+ * particular package's definition (e.g. an RPM specfile), it should probably</div><div class='add'>+ * go in configure.ac.</div><div class='add'>+ *</div><div class='add'>+ * (4) If it affects default sizes, limits, thresholds, or modes of operation</div><div class='add'>+ * (e.g. IPv4 vs. IPv6), it should probably go here.</div><div class='add'>+ *</div><div class='add'>+ * (5) For anything else, is it more like the things in 3 or the things in 4?</div><div class='add'>+ * Which approach is more convenient for the people who are likely to use the</div><div class='add'>+ * new option(s)?  Make your best guesses, confirm with others, and go with</div><div class='add'>+ * what works.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+#define SITE_H_ENABLE_LEAST_PRIORITY    "on"</div><div class='add'>+#define SITE_H_MD_CACHE_TIMEOUT         "1"</div><div class='add'>+#define SITE_H_NFS_DISABLE              "on"</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+ * As an example of how to use this file, here's what the Facebook version looks</div><div class='add'>+ * like:</div><div class='add'>+</div><div class='add'>+#define SITE_H_ENABLE_LEAST_PRIORITY    "off"</div><div class='add'>+#define SITE_H_MD_CACHE_TIMEOUT         "180"</div><div class='add'>+#define SITE_H_NFS_DISABLE              "off"</div><div class='add'>+</div><div class='add'>+ * Each time we add a value here, we lessen the risk of values being</div><div class='add'>+ * inconsistent across production automation, test automation, and manual</div><div class='add'>+ * developer testing. We also save effort compared to updating values for each</div><div class='add'>+ * kind of external automation. To do the same thing with configure scripts or</div><div class='add'>+ * specfiles, we'd have to make much more complicated and less discoverable</div><div class='add'>+ * changes there.</div><div class='add'>+ *</div><div class='add'>+ * Other orgs are likely to have the same issues regarding their preferred</div><div class='add'>+ * settings, and likewise should add their favorites here as well.</div><div class='add'>+ */</div><div class='head'>diff --git a/submit-for-review.sh b/submit-for-review.sh<br/>new file mode 120000<br/>index 00000000000..a21c0e2869a<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/submit-for-review.sh?id=d1d7a6f35c816822fab51c820e25023863c239c1'>submit-for-review.sh</a></div><div class='hunk'>@@ -0,0 +1 @@</div><div class='add'>+rfc.sh
\ No newline at end of file</div><div class='head'>diff --git a/tests/00-geo-rep/00-georep-verify-non-root-setup.t b/tests/00-geo-rep/00-georep-verify-non-root-setup.t<br/>new file mode 100644<br/>index 00000000000..a55fd3e5e6a<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/00-geo-rep/00-georep-verify-non-root-setup.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/00-geo-rep/00-georep-verify-non-root-setup.t</a></div><div class='hunk'>@@ -0,0 +1,294 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../include.rc</div><div class='add'>+. $(dirname $0)/../volume.rc</div><div class='add'>+. $(dirname $0)/../geo-rep.rc</div><div class='add'>+. $(dirname $0)/../env.rc</div><div class='add'>+</div><div class='add'>+SCRIPT_TIMEOUT=600</div><div class='add'>+</div><div class='add'>+### Basic Non-root geo-rep setup test with Distribute Replicate volumes</div><div class='add'>+</div><div class='add'>+##Cleanup and start glusterd</div><div class='add'>+cleanup;</div><div class='add'>+TEST glusterd;</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+##Variables</div><div class='add'>+GEOREP_CLI="$CLI volume geo-replication"</div><div class='add'>+master=$GMV0</div><div class='add'>+SH0="127.0.0.1"</div><div class='add'>+slave=${SH0}::${GSV0}</div><div class='add'>+num_active=2</div><div class='add'>+num_passive=2</div><div class='add'>+master_mnt=$M0</div><div class='add'>+slave_mnt=$M1</div><div class='add'>+</div><div class='add'>+##User and group to be used for non-root geo-rep setup</div><div class='add'>+usr="nroot"</div><div class='add'>+grp="ggroup"</div><div class='add'>+</div><div class='add'>+slave_url=$usr@$slave</div><div class='add'>+slave_vol=$GSV0</div><div class='add'>+ssh_url=$usr@$SH0</div><div class='add'>+</div><div class='add'>+############################################################</div><div class='add'>+#SETUP VOLUMES AND VARIABLES</div><div class='add'>+</div><div class='add'>+##create_and_start_master_volume</div><div class='add'>+TEST $CLI volume create $GMV0 replica 2 $H0:$B0/${GMV0}{1,2,3,4};</div><div class='add'>+TEST $CLI volume start $GMV0</div><div class='add'>+</div><div class='add'>+##create_and_start_slave_volume</div><div class='add'>+TEST $CLI volume create $GSV0 replica 2 $H0:$B0/${GSV0}{1,2,3,4};</div><div class='add'>+TEST $CLI volume start $GSV0</div><div class='add'>+</div><div class='add'>+##Mount master</div><div class='add'>+#TEST glusterfs -s $H0 --volfile-id $GMV0 $M0</div><div class='add'>+</div><div class='add'>+##Mount slave</div><div class='add'>+#TEST glusterfs -s $H0 --volfile-id $GSV0 $M1</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+##########################################################</div><div class='add'>+#TEST FUNCTIONS</div><div class='add'>+</div><div class='add'>+function distribute_key_non_root()</div><div class='add'>+{</div><div class='add'>+    ${GLUSTER_LIBEXECDIR}/set_geo_rep_pem_keys.sh $usr $master $slave_vol</div><div class='add'>+    echo $?</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+function check_status_non_root()</div><div class='add'>+{</div><div class='add'>+    local search_key=$1</div><div class='add'>+    $GEOREP_CLI $master $slave_url status | grep -F "$search_key" | wc -l</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+function check_and_clean_group()</div><div class='add'>+{</div><div class='add'>+        if [ $(getent group $grp) ]</div><div class='add'>+        then</div><div class='add'>+                groupdel $grp;</div><div class='add'>+                echo $?</div><div class='add'>+        else</div><div class='add'>+                echo 0</div><div class='add'>+        fi</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function clean_lock_files()</div><div class='add'>+{</div><div class='add'>+        if [ ! -f /etc/passwd.lock ];</div><div class='add'>+        then</div><div class='add'>+                rm -rf /etc/passwd.lock;</div><div class='add'>+        fi</div><div class='add'>+</div><div class='add'>+        if [ ! -f /etc/group.lock ];</div><div class='add'>+        then</div><div class='add'>+                rm -rf /etc/group.lock;</div><div class='add'>+        fi</div><div class='add'>+</div><div class='add'>+        if [ ! -f /etc/shadow.lock ];</div><div class='add'>+        then</div><div class='add'>+                rm -rf /etc/shadow.lock;</div><div class='add'>+        fi</div><div class='add'>+</div><div class='add'>+        if [ ! -f /etc/gshadow.lock ];</div><div class='add'>+        then</div><div class='add'>+                rm -rf /etc/gshadow.lock;</div><div class='add'>+        fi</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+###########################################################</div><div class='add'>+#SETUP NON-ROOT GEO REPLICATION</div><div class='add'>+</div><div class='add'>+##Create ggroup group</div><div class='add'>+##First test if group exists and then create new one</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 0 check_and_clean_group</div><div class='add'>+</div><div class='add'>+##cleanup *.lock files</div><div class='add'>+</div><div class='add'>+clean_lock_files</div><div class='add'>+</div><div class='add'>+TEST /usr/sbin/groupadd $grp</div><div class='add'>+</div><div class='add'>+clean_lock_files</div><div class='add'>+##Del if exists and create non-root user and assign it to newly created group</div><div class='add'>+userdel -r -f $usr</div><div class='add'>+TEST /usr/sbin/useradd -G $grp $usr</div><div class='add'>+</div><div class='add'>+##Modify password for non-root user to have control over distributing ssh-key</div><div class='add'>+echo "$usr:pass" | chpasswd</div><div class='add'>+</div><div class='add'>+##Set up mountbroker root</div><div class='add'>+TEST gluster-mountbroker setup /var/mountbroker-root $grp</div><div class='add'>+</div><div class='add'>+##Associate volume and non-root user to the mountbroker</div><div class='add'>+TEST gluster-mountbroker add $slave_vol $usr</div><div class='add'>+</div><div class='add'>+##Check ssh setting for clear text passwords</div><div class='add'>+sed '/^PasswordAuthentication /{s/no/yes/}' -i /etc/ssh/sshd_config &amp;&amp; grep '^PasswordAuthentication ' /etc/ssh/sshd_config &amp;&amp; service sshd restart</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+##Restart glusterd to reflect mountbroker changages</div><div class='add'>+TEST killall_gluster;</div><div class='add'>+TEST glusterd;</div><div class='add'>+TEST pidof glusterd;</div><div class='add'>+</div><div class='add'>+##Create, start and mount meta_volume</div><div class='add'>+TEST $CLI volume create $META_VOL replica 3 $H0:$B0/${META_VOL}{1,2,3};</div><div class='add'>+TEST $CLI volume start $META_VOL</div><div class='add'>+TEST mkdir -p $META_MNT</div><div class='add'>+EXPECT_WITHIN ${PROCESS_UP_TIMEOUT} "3" brick_count ${META_VOL}</div><div class='add'>+TEST glusterfs -s $H0 --volfile-id $META_VOL $META_MNT</div><div class='add'>+</div><div class='add'>+##Mount master</div><div class='add'>+EXPECT_WITHIN ${PROCESS_UP_TIMEOUT} "4" brick_count $GMV0</div><div class='add'>+TEST glusterfs -s $H0 --volfile-id $GMV0 $M0</div><div class='add'>+</div><div class='add'>+##Mount slave</div><div class='add'>+EXPECT_WITHIN ${PROCESS_UP_TIMEOUT} "4" brick_count $GSV0</div><div class='add'>+TEST glusterfs -s $H0 --volfile-id $GSV0 $M1</div><div class='add'>+</div><div class='add'>+## Check status of mount-broker</div><div class='add'>+TEST gluster-mountbroker status</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+##Setup password-less ssh for non-root user</div><div class='add'>+#sshpass -p "pass" ssh-copy-id -i ~/.ssh/id_rsa.pub $ssh_url</div><div class='add'>+##Run ssh agent</div><div class='add'>+eval "$(ssh-agent -s)"</div><div class='add'>+PASS="pass"</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+##Create a temp script to echo the SSH password, used by SSH_ASKPASS</div><div class='add'>+</div><div class='add'>+SSH_ASKPASS_SCRIPT=/tmp/ssh-askpass-script</div><div class='add'>+cat &gt; ${SSH_ASKPASS_SCRIPT} &lt;&lt;EOL</div><div class='add'>+#!/bin/bash</div><div class='add'>+echo "${PASS}"</div><div class='add'>+EOL</div><div class='add'>+chmod u+x ${SSH_ASKPASS_SCRIPT}</div><div class='add'>+</div><div class='add'>+##set no display, necessary for ssh to use with setsid and SSH_ASKPASS</div><div class='add'>+export DISPLAY</div><div class='add'>+</div><div class='add'>+export SSH_ASKPASS=${SSH_ASKPASS_SCRIPT}</div><div class='add'>+</div><div class='add'>+DISPLAY=: setsid ssh-copy-id -o 'PreferredAuthentications=password' -o 'StrictHostKeyChecking=no' -i ~/.ssh/id_rsa.pub $ssh_url</div><div class='add'>+</div><div class='add'>+##Setting up PATH for gluster binaries in case of source installation</div><div class='add'>+##ssh -oNumberOfPasswordPrompts=0 -oStrictHostKeyChecking=no $ssh_url "echo "export PATH=$PATH:/usr/local/sbin" &gt;&gt; ~/.bashrc"</div><div class='add'>+</div><div class='add'>+##Creating secret pem pub file</div><div class='add'>+TEST gluster-georep-sshkey generate</div><div class='add'>+</div><div class='add'>+##Create geo-rep non-root setup</div><div class='add'>+</div><div class='add'>+TEST $GEOREP_CLI $master $slave_url create push-pem</div><div class='add'>+</div><div class='add'>+#check for session creation</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 4 check_status_non_root "Created"</div><div class='add'>+#Config gluster-command-dir</div><div class='add'>+TEST $GEOREP_CLI $master $slave_url config gluster-command-dir ${GLUSTER_CMD_DIR}</div><div class='add'>+</div><div class='add'>+#Config gluster-command-dir</div><div class='add'>+TEST $GEOREP_CLI $master $slave_url config slave-gluster-command-dir ${GLUSTER_CMD_DIR}</div><div class='add'>+</div><div class='add'>+## Test for key distribution</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT  0 distribute_key_non_root</div><div class='add'>+</div><div class='add'>+##Wait for common secret pem file to be created</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT  0 check_common_secret_file</div><div class='add'>+</div><div class='add'>+#Enable_metavolume</div><div class='add'>+TEST $GEOREP_CLI $master $slave config use_meta_volume true</div><div class='add'>+</div><div class='add'>+#Start_georep</div><div class='add'>+TEST $GEOREP_CLI $master $slave_url start</div><div class='add'>+</div><div class='add'>+## Meta volume is enabled so looking for 2 Active and 2 Passive sessions</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT  2 check_status_non_root "Active"</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT  2 check_status_non_root "Passive"</div><div class='add'>+</div><div class='add'>+#Pause geo-replication session</div><div class='add'>+TEST $GEOREP_CLI  $master $slave_url pause</div><div class='add'>+</div><div class='add'>+#Resume geo-replication session</div><div class='add'>+TEST $GEOREP_CLI  $master $slave_url resume</div><div class='add'>+</div><div class='add'>+#Validate failure of volume stop when geo-rep is running</div><div class='add'>+TEST ! $CLI volume stop $GMV0</div><div class='add'>+</div><div class='add'>+#Negative test for ssh-port</div><div class='add'>+#Port should be integer and between 1-65535 range</div><div class='add'>+</div><div class='add'>+TEST ! $GEOREP_CLI $master $slave_url config ssh-port -22</div><div class='add'>+</div><div class='add'>+TEST ! $GEOREP_CLI $master $slave_url config ssh-port abc</div><div class='add'>+</div><div class='add'>+TEST ! $GEOREP_CLI $master $slave_url config ssh-port 6875943</div><div class='add'>+</div><div class='add'>+TEST ! $GEOREP_CLI $master $slave_url config ssh-port 4.5</div><div class='add'>+</div><div class='add'>+TEST ! $GEOREP_CLI $master $slave_url config ssh-port 22a</div><div class='add'>+</div><div class='add'>+#Config Set ssh-port to validate int validation</div><div class='add'>+TEST $GEOREP_CLI $master $slave config ssh-port 22</div><div class='add'>+</div><div class='add'>+#Hybrid directory rename test BZ#1763439</div><div class='add'>+</div><div class='add'>+TEST $GEOREP_CLI $master $slave_url config change_detector xsync</div><div class='add'>+#verify master and slave mount</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $CHECK_MOUNT_TIMEOUT "^1$" check_mounted ${master_mnt}</div><div class='add'>+EXPECT_WITHIN $CHECK_MOUNT_TIMEOUT "^1$" check_mounted ${slave_mnt}</div><div class='add'>+</div><div class='add'>+#Create test data for hybrid crawl</div><div class='add'>+TEST mkdir ${master_mnt}/dir1</div><div class='add'>+TEST mkdir ${master_mnt}/dir1/dir2</div><div class='add'>+TEST mkdir ${master_mnt}/dir1/dir3</div><div class='add'>+TEST mkdir ${master_mnt}/hybrid_d1</div><div class='add'>+</div><div class='add'>+mv ${master_mnt}/hybrid_d1 ${master_mnt}/hybrid_rn_d1</div><div class='add'>+mv ${master_mnt}/dir1/dir2 ${master_mnt}/rn_dir2</div><div class='add'>+mv ${master_mnt}/dir1/dir3 ${master_mnt}/dir1/rn_dir3</div><div class='add'>+</div><div class='add'>+#Verify hybrid crawl data on slave</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 0 directory_ok ${slave_mnt}/dir1</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 0 directory_ok ${slave_mnt}/hybrid_rn_d1</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 0 directory_ok ${slave_mnt}/rn_dir2</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 0 directory_ok ${slave_mnt}/dir1/rn_dir3</div><div class='add'>+</div><div class='add'>+#Stop Geo-rep</div><div class='add'>+TEST $GEOREP_CLI $master $slave_url stop</div><div class='add'>+</div><div class='add'>+#Delete Geo-rep</div><div class='add'>+TEST $GEOREP_CLI $master $slave_url delete</div><div class='add'>+</div><div class='add'>+#Cleanup authorized_keys</div><div class='add'>+sed -i '/^command=.*SSH_ORIGINAL_COMMAND#.*/d' /home/$usr/.ssh/authorized_keys</div><div class='add'>+sed -i '/^command=.*gsyncd.*/d' /home/$usr/.ssh/authorized_keys</div><div class='add'>+</div><div class='add'>+#clear mountbroker</div><div class='add'>+gluster-mountbroker remove --user $usr</div><div class='add'>+gluster-mountbroker remove --volume $slave_vol</div><div class='add'>+</div><div class='add'>+#delete group and user created for non-root setup</div><div class='add'>+TEST userdel -r -f $usr</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 0 check_and_clean_group</div><div class='add'>+</div><div class='add'>+##password script cleanup</div><div class='add'>+rm -rf /tmp/ssh-askpass-script</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='head'>diff --git a/tests/00-geo-rep/00-georep-verify-setup.t b/tests/00-geo-rep/00-georep-verify-setup.t<br/>new file mode 100644<br/>index 00000000000..0d46c04102d<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/00-geo-rep/00-georep-verify-setup.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/00-geo-rep/00-georep-verify-setup.t</a></div><div class='hunk'>@@ -0,0 +1,110 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../include.rc</div><div class='add'>+. $(dirname $0)/../volume.rc</div><div class='add'>+. $(dirname $0)/../geo-rep.rc</div><div class='add'>+. $(dirname $0)/../env.rc</div><div class='add'>+</div><div class='add'>+SCRIPT_TIMEOUT=400</div><div class='add'>+GEO_REP_TIMEOUT=200</div><div class='add'>+</div><div class='add'>+##Cleanup and start glusterd</div><div class='add'>+cleanup;</div><div class='add'>+TEST glusterd;</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+##Variables</div><div class='add'>+GEOREP_CLI="$CLI volume geo-replication"</div><div class='add'>+master=$GMV0</div><div class='add'>+SH0="127.0.0.1"</div><div class='add'>+slave=${SH0}::${GSV0}</div><div class='add'>+num_active=2</div><div class='add'>+num_passive=2</div><div class='add'>+master_mnt=$M0</div><div class='add'>+slave_mnt=$M1</div><div class='add'>+</div><div class='add'>+############################################################</div><div class='add'>+#SETUP VOLUMES AND GEO-REPLICATION</div><div class='add'>+############################################################</div><div class='add'>+</div><div class='add'>+##create_and_start_master_volume</div><div class='add'>+TEST $CLI volume create $GMV0 replica 2 $H0:$B0/${GMV0}{1,2,3,4};</div><div class='add'>+TEST $CLI volume start $GMV0</div><div class='add'>+</div><div class='add'>+##create_and_start_slave_volume</div><div class='add'>+TEST $CLI volume create $GSV0 replica 2 $H0:$B0/${GSV0}{1,2,3,4};</div><div class='add'>+TEST $CLI volume start $GSV0</div><div class='add'>+</div><div class='add'>+##Create, start and mount meta_volume</div><div class='add'>+TEST $CLI volume create $META_VOL replica 3 $H0:$B0/${META_VOL}{1,2,3};</div><div class='add'>+TEST $CLI volume start $META_VOL</div><div class='add'>+TEST mkdir -p $META_MNT</div><div class='add'>+TEST glusterfs -s $H0 --volfile-id $META_VOL $META_MNT</div><div class='add'>+</div><div class='add'>+##Mount master</div><div class='add'>+TEST glusterfs -s $H0 --volfile-id $GMV0 $M0</div><div class='add'>+</div><div class='add'>+##Mount slave</div><div class='add'>+TEST glusterfs -s $H0 --volfile-id $GSV0 $M1</div><div class='add'>+</div><div class='add'>+############################################################</div><div class='add'>+#BASIC GEO-REPLICATION TESTS</div><div class='add'>+############################################################</div><div class='add'>+</div><div class='add'>+#Test invalid slave url</div><div class='add'>+TEST ! $GEOREP_CLI $master ${SH0}:${GSV0} create push-pem</div><div class='add'>+TEST ! $GEOREP_CLI $master ${SH0}:::${GSV0} create push-pem</div><div class='add'>+</div><div class='add'>+#Create geo-rep session</div><div class='add'>+TEST create_georep_session $master $slave</div><div class='add'>+</div><div class='add'>+#Config gluster-command-dir</div><div class='add'>+TEST $GEOREP_CLI $master $slave config gluster-command-dir ${GLUSTER_CMD_DIR}</div><div class='add'>+</div><div class='add'>+#Config gluster-command-dir</div><div class='add'>+TEST $GEOREP_CLI $master $slave config slave-gluster-command-dir ${GLUSTER_CMD_DIR}</div><div class='add'>+</div><div class='add'>+#Enable_metavolume</div><div class='add'>+TEST $GEOREP_CLI $master $slave config use_meta_volume true</div><div class='add'>+</div><div class='add'>+#Wait for common secret pem file to be created</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT  0 check_common_secret_file</div><div class='add'>+</div><div class='add'>+#Verify the keys are distributed</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT  0 check_keys_distributed</div><div class='add'>+</div><div class='add'>+#Start_georep</div><div class='add'>+TEST $GEOREP_CLI $master $slave start</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT  2 check_status_num_rows "Active"</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT  2 check_status_num_rows "Passive"</div><div class='add'>+</div><div class='add'>+#get-state commamd shouldn't crash glusterd when geo-rep session is configured</div><div class='add'>+TEST $CLI get-state</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+</div><div class='add'>+TEST $CLI get-state detail</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+</div><div class='add'>+#Pause geo-replication session</div><div class='add'>+TEST $GEOREP_CLI  $master $slave pause</div><div class='add'>+</div><div class='add'>+#Resume geo-replication session</div><div class='add'>+TEST $GEOREP_CLI  $master $slave resume</div><div class='add'>+</div><div class='add'>+#Validate failure of volume stop when geo-rep is running</div><div class='add'>+TEST ! $CLI volume stop $GMV0</div><div class='add'>+</div><div class='add'>+#Stop Geo-rep</div><div class='add'>+TEST $GEOREP_CLI $master $slave stop</div><div class='add'>+</div><div class='add'>+#Delete Geo-rep</div><div class='add'>+TEST $GEOREP_CLI $master $slave delete</div><div class='add'>+</div><div class='add'>+#Cleanup authorized keys</div><div class='add'>+sed -i '/^command=.*SSH_ORIGINAL_COMMAND#.*/d' ~/.ssh/authorized_keys</div><div class='add'>+sed -i '/^command=.*gsyncd.*/d' ~/.ssh/authorized_keys</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+#G_TESTDEF_TEST_STATUS_NETBSD7=BAD_TEST,BUG=000000</div><div class='head'>diff --git a/tests/00-geo-rep/01-georep-glusterd-tests.t b/tests/00-geo-rep/01-georep-glusterd-tests.t<br/>new file mode 100644<br/>index 00000000000..47d5116af26<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/00-geo-rep/01-georep-glusterd-tests.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/00-geo-rep/01-georep-glusterd-tests.t</a></div><div class='hunk'>@@ -0,0 +1,213 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../include.rc</div><div class='add'>+. $(dirname $0)/../volume.rc</div><div class='add'>+. $(dirname $0)/../geo-rep.rc</div><div class='add'>+. $(dirname $0)/../env.rc</div><div class='add'>+</div><div class='add'>+SCRIPT_TIMEOUT=300</div><div class='add'>+</div><div class='add'>+#Cleanup and start glusterd</div><div class='add'>+cleanup;</div><div class='add'>+TEST glusterd;</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+#Variables</div><div class='add'>+GEOREP_CLI="$CLI volume geo-replication"</div><div class='add'>+master=$GMV0</div><div class='add'>+SH0="127.0.0.1"</div><div class='add'>+slave=${SH0}::${GSV0}</div><div class='add'>+slave1=root@${SH0}::${GSV1}</div><div class='add'>+num_active=2</div><div class='add'>+num_passive=2</div><div class='add'>+master_mnt=$M0</div><div class='add'>+slave_mnt=$M1</div><div class='add'>+</div><div class='add'>+############################################################</div><div class='add'>+#SETUP VOLUMES AND GEO-REPLICATION</div><div class='add'>+############################################################</div><div class='add'>+</div><div class='add'>+#create_and_start_master_volume</div><div class='add'>+TEST $CLI volume create $GMV0 replica 3 $H0:$B0/${GMV0}{1,2,3};</div><div class='add'>+</div><div class='add'>+#Negative testase: Create geo-rep session, master is not started</div><div class='add'>+TEST ! $GEOREP_CLI $master $slave create push-pem</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $GMV0</div><div class='add'>+</div><div class='add'>+#create_and_start_slave_volume</div><div class='add'>+TEST $CLI volume create $GSV0 replica 3 $H0:$B0/${GSV0}{1,2,3};</div><div class='add'>+</div><div class='add'>+#Negative testcase: Create geo-rep session, slave is not started</div><div class='add'>+TEST ! $GEOREP_CLI $master $slave create push-pem</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $GSV0</div><div class='add'>+</div><div class='add'>+#create_and_start_slave1_volume</div><div class='add'>+TEST $CLI volume create $GSV1 replica 3 $H0:$B0/${GSV1}{1,2,3};</div><div class='add'>+TEST $CLI volume start $GSV1</div><div class='add'>+</div><div class='add'>+#Create, start and mount meta_volume</div><div class='add'>+TEST $CLI volume create $META_VOL replica 3 $H0:$B0/${META_VOL}{1,2,3};</div><div class='add'>+TEST $CLI volume start $META_VOL</div><div class='add'>+TEST mkdir -p $META_MNT</div><div class='add'>+TEST glusterfs -s $H0 --volfile-id $META_VOL $META_MNT</div><div class='add'>+</div><div class='add'>+#Mount master</div><div class='add'>+TEST glusterfs -s $H0 --volfile-id $GMV0 $M0</div><div class='add'>+</div><div class='add'>+#Mount slave</div><div class='add'>+TEST glusterfs -s $H0 --volfile-id $GSV0 $M1</div><div class='add'>+</div><div class='add'>+############################################################</div><div class='add'>+#BASIC GEO-REPLICATION GLUSTERD TESTS WITH FANOUT SETUP</div><div class='add'>+############################################################</div><div class='add'>+</div><div class='add'>+#Negative testcase: Test invalid master</div><div class='add'>+TEST ! $GEOREP_CLI master1 ${SH0}::${GSV0} create push-pem</div><div class='add'>+</div><div class='add'>+#Negatvie testcase: Test invalid slave</div><div class='add'>+TEST ! $GEOREP_CLI $master ${SH0}::slave3 create push-pem</div><div class='add'>+</div><div class='add'>+##------------------- Session 1 Creation Begin-----------------##</div><div class='add'>+#Create geo-rep session</div><div class='add'>+TEST create_georep_session $master $slave</div><div class='add'>+</div><div class='add'>+#Config gluster-command-dir</div><div class='add'>+TEST $GEOREP_CLI $master $slave config gluster-command-dir ${GLUSTER_CMD_DIR}</div><div class='add'>+</div><div class='add'>+#Config gluster-command-dir</div><div class='add'>+TEST $GEOREP_CLI $master $slave config slave-gluster-command-dir ${GLUSTER_CMD_DIR}</div><div class='add'>+</div><div class='add'>+#Enable_metavolume</div><div class='add'>+TEST $GEOREP_CLI $master $slave config use_meta_volume true</div><div class='add'>+##------------------- Session 1 Creation End-----------------##</div><div class='add'>+</div><div class='add'>+##------------------- Session 2 Creation Begin-----------------##</div><div class='add'>+#Create geo-rep session2</div><div class='add'>+TEST $GEOREP_CLI $master $slave1 create ssh-port 22 no-verify</div><div class='add'>+</div><div class='add'>+#Config gluster-command-dir for session2</div><div class='add'>+TEST $GEOREP_CLI $master $slave1 config gluster-command-dir ${GLUSTER_CMD_DIR}</div><div class='add'>+</div><div class='add'>+#Config gluster-command-dir for session2</div><div class='add'>+TEST $GEOREP_CLI $master $slave1 config slave-gluster-command-dir ${GLUSTER_CMD_DIR}</div><div class='add'>+</div><div class='add'>+#Enable_metavolume for session2</div><div class='add'>+TEST $GEOREP_CLI $master $slave1 config use_meta_volume true</div><div class='add'>+##------------------- Session 2 Creation End-----------------##</div><div class='add'>+</div><div class='add'>+#Wait for common secret pem file to be created</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT  0 check_common_secret_file</div><div class='add'>+</div><div class='add'>+#Verify the keys are distributed</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT  0 check_keys_distributed</div><div class='add'>+</div><div class='add'>+#Start_georep</div><div class='add'>+TEST $GEOREP_CLI $master $slave start</div><div class='add'>+</div><div class='add'>+#check geo-rep status without specifying master and slave volumes</div><div class='add'>+TEST $GEOREP_CLI status</div><div class='add'>+</div><div class='add'>+#Start_georep force</div><div class='add'>+TEST $GEOREP_CLI $master $slave1 start force</div><div class='add'>+</div><div class='add'>+#Negative testcase: Create the same session after start, fails</div><div class='add'>+#With root@ prefix</div><div class='add'>+TEST ! $GEOREP_CLI $master $slave1 create push-pem</div><div class='add'>+#Without root@ prefix</div><div class='add'>+TEST ! $GEOREP_CLI $master ${SH0}::${GSV1} create push-pem</div><div class='add'>+TEST $GEOREP_CLI $master $slave1 create push-pem force</div><div class='add'>+</div><div class='add'>+##------------------- Fanout status testcases Begin --------------##</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT  1 check_status_num_rows "Active"</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT  2 check_status_num_rows "Passive"</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT  2 check_fanout_status_num_rows "Active"</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT  4 check_fanout_status_num_rows "Passive"</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT  2 check_fanout_status_detail_num_rows "Active"</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT  4 check_fanout_status_detail_num_rows "Passive"</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT  2 check_all_status_num_rows "Active"</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT  4 check_all_status_num_rows "Passive"</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT  2 check_all_status_detail_num_rows "Active"</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT  4 check_all_status_detail_num_rows "Passive"</div><div class='add'>+</div><div class='add'>+##------------------- Fanout status testcases End --------------##</div><div class='add'>+</div><div class='add'>+##------Checkpoint Testcase Begin---------------##</div><div class='add'>+#Write I/O</div><div class='add'>+echo "test data" &gt; $M0/file1</div><div class='add'>+TEST $GEOREP_CLI $master $slave config checkpoint now</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 0 verify_checkpoint_met $master $slave</div><div class='add'>+touch $M0</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 1 verify_checkpoint_met $master $slave</div><div class='add'>+##------Checkpoint Testcase End---------------##</div><div class='add'>+</div><div class='add'>+##------------------ Geo-rep config testcases Begin--------------------##</div><div class='add'>+TEST $GEOREP_CLI $master $slave config</div><div class='add'>+TEST ! $GEOREP_CLI $master $slave config arsync-options '-W'</div><div class='add'>+TEST $GEOREP_CLI $master $slave config rsync-options '-W'</div><div class='add'>+TEST $GEOREP_CLI $master $slave config rsync-options</div><div class='add'>+TEST $GEOREP_CLI $master $slave config \!rsync-options</div><div class='add'>+TEST $GEOREP_CLI $master $slave config sync-xattrs false</div><div class='add'>+##------------------ Geo-rep config testcases End --------------------##</div><div class='add'>+</div><div class='add'>+##---------------- Pause/Resume testcase Begin-------------##</div><div class='add'>+#Negative testcase: Resume geo-replication session when not paused</div><div class='add'>+TEST ! $GEOREP_CLI  $master $slave1 resume</div><div class='add'>+TEST $GEOREP_CLI  $master $slave1 resume force</div><div class='add'>+</div><div class='add'>+#Pause geo-replication session with root@</div><div class='add'>+TEST $GEOREP_CLI $master $slave1 pause force</div><div class='add'>+</div><div class='add'>+#Resume geo-replication session with root@</div><div class='add'>+TEST $GEOREP_CLI $master $slave1 resume force</div><div class='add'>+</div><div class='add'>+#Stop Geo-rep</div><div class='add'>+TEST $GEOREP_CLI $master $slave1 stop force</div><div class='add'>+</div><div class='add'>+#Negative testcase: Resume geo-replication session after geo-rep stop</div><div class='add'>+TEST ! $GEOREP_CLI  $master $slave1 resume</div><div class='add'>+##---------------- Pause/Resume testcase End-------------##</div><div class='add'>+</div><div class='add'>+##-----------------glusterd slave key/value upgrade testcase Begin ---------##</div><div class='add'>+#Upgrade test of slave key stored in glusterd info file</div><div class='add'>+src=$(grep slave2 /var/lib/glusterd/vols/$master/info)</div><div class='add'>+#Remove slave uuuid (last part after divided by : )</div><div class='add'>+dst=${src%:*}</div><div class='add'>+</div><div class='add'>+#Update glusterd info file with old slave format</div><div class='add'>+sed -i "s|$src|$dst|g" /var/lib/glusterd/vols/$master/info</div><div class='add'>+TEST ! grep $src /var/lib/glusterd/vols/$master/info</div><div class='add'>+</div><div class='add'>+#Restart glusterd to update in-memory volinfo</div><div class='add'>+TEST pkill glusterd</div><div class='add'>+TEST glusterd;</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+</div><div class='add'>+#Start geo-rep and validate slave format is updated</div><div class='add'>+TEST $GEOREP_CLI $master $slave1 start force</div><div class='add'>+TEST grep $src /var/lib/glusterd/vols/$master/info</div><div class='add'>+##-----------------glusted slave key/value upgrade testcase End ---------##</div><div class='add'>+</div><div class='add'>+#Negative testcase: Delete Geo-rep 2 fails as geo-rep is running</div><div class='add'>+TEST ! $GEOREP_CLI $master $slave1 delete</div><div class='add'>+</div><div class='add'>+#Stop and Delete Geo-rep 2</div><div class='add'>+TEST $GEOREP_CLI $master $slave1 stop force</div><div class='add'>+TEST $GEOREP_CLI $master $slave1 delete reset-sync-time</div><div class='add'>+</div><div class='add'>+#Stop and Delete Geo-rep 1</div><div class='add'>+TEST $GEOREP_CLI $master $slave stop</div><div class='add'>+TEST $GEOREP_CLI $master $slave delete</div><div class='add'>+</div><div class='add'>+#Cleanup authorized keys</div><div class='add'>+sed -i '/^command=.*SSH_ORIGINAL_COMMAND#.*/d' ~/.ssh/authorized_keys</div><div class='add'>+sed -i '/^command=.*gsyncd.*/d' ~/.ssh/authorized_keys</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+#G_TESTDEF_TEST_STATUS_NETBSD7=BAD_TEST,BUG=000000</div><div class='head'>diff --git a/tests/00-geo-rep/bug-1600145.t b/tests/00-geo-rep/bug-1600145.t<br/>new file mode 100644<br/>index 00000000000..1d38bf92682<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/00-geo-rep/bug-1600145.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/00-geo-rep/bug-1600145.t</a></div><div class='hunk'>@@ -0,0 +1,109 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../include.rc</div><div class='add'>+. $(dirname $0)/../volume.rc</div><div class='add'>+. $(dirname $0)/../geo-rep.rc</div><div class='add'>+. $(dirname $0)/../env.rc</div><div class='add'>+</div><div class='add'>+### Basic Tests with Distribute Replicate volumes</div><div class='add'>+</div><div class='add'>+##Cleanup and start glusterd</div><div class='add'>+cleanup;</div><div class='add'>+SCRIPT_TIMEOUT=600</div><div class='add'>+TEST glusterd;</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+</div><div class='add'>+##Variables</div><div class='add'>+GEOREP_CLI="$CLI volume geo-replication"</div><div class='add'>+master=$GMV0</div><div class='add'>+SH0="127.0.0.1"</div><div class='add'>+slave=${SH0}::${GSV0}</div><div class='add'>+num_active=2</div><div class='add'>+num_passive=2</div><div class='add'>+master_mnt=$M0</div><div class='add'>+slave_mnt=$M1</div><div class='add'>+</div><div class='add'>+############################################################</div><div class='add'>+#SETUP VOLUMES AND GEO-REPLICATION</div><div class='add'>+############################################################</div><div class='add'>+</div><div class='add'>+##create_and_start_master_volume</div><div class='add'>+TEST $CLI volume create $GMV0 replica 2 $H0:$B0/${GMV0}{1,2};</div><div class='add'>+gluster v set all cluster.brick-multiplex on</div><div class='add'>+TEST $CLI volume start $GMV0</div><div class='add'>+</div><div class='add'>+##create_and_start_slave_volume</div><div class='add'>+TEST $CLI volume create $GSV0 replica 2 $H0:$B0/${GSV0}{1,2};</div><div class='add'>+TEST $CLI volume start $GSV0</div><div class='add'>+</div><div class='add'>+##Create, start and mount meta_volume</div><div class='add'>+TEST $CLI volume create $META_VOL replica 3 $H0:$B0/${META_VOL}{1,2,3};</div><div class='add'>+TEST $CLI volume start $META_VOL</div><div class='add'>+TEST mkdir -p $META_MNT</div><div class='add'>+TEST glusterfs -s $H0 --volfile-id $META_VOL $META_MNT</div><div class='add'>+</div><div class='add'>+############################################################</div><div class='add'>+#BASIC GEO-REPLICATION TESTS</div><div class='add'>+############################################################</div><div class='add'>+</div><div class='add'>+#Create geo-rep session</div><div class='add'>+TEST create_georep_session $master $slave</div><div class='add'>+</div><div class='add'>+#Config gluster-command-dir</div><div class='add'>+TEST $GEOREP_CLI $master $slave config gluster-command-dir ${GLUSTER_CMD_DIR}</div><div class='add'>+</div><div class='add'>+#Config gluster-command-dir</div><div class='add'>+TEST $GEOREP_CLI $master $slave config slave-gluster-command-dir ${GLUSTER_CMD_DIR}</div><div class='add'>+</div><div class='add'>+#Enable_metavolume</div><div class='add'>+TEST $GEOREP_CLI $master $slave config use_meta_volume true</div><div class='add'>+</div><div class='add'>+#Wait for common secret pem file to be created</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT  0 check_common_secret_file</div><div class='add'>+</div><div class='add'>+#Verify the keys are distributed</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT  0 check_keys_distributed</div><div class='add'>+</div><div class='add'>+#Count no. of changelog socket</div><div class='add'>+brick_pid=`ps -aef | grep glusterfsd | grep -v "shared_storage" | grep -v grep | awk -F " " '{print $2}'`</div><div class='add'>+n=$(grep -Fc "changelog" /proc/$brick_pid/net/unix)</div><div class='add'>+</div><div class='add'>+#Start_georep</div><div class='add'>+TEST $GEOREP_CLI $master $slave start</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT  1 check_status_num_rows "Active"</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT  1 check_status_num_rows "Passive"</div><div class='add'>+</div><div class='add'>+#Count no. of changelog socket</div><div class='add'>+brick_pid=`ps -aef | grep glusterfsd | grep -v "shared_storage" | grep -v grep | awk -F " " '{print $2}'`</div><div class='add'>+c=$(grep -Fc "changelog" /proc/$brick_pid/net/unix)</div><div class='add'>+let expected=n+2</div><div class='add'>+TEST [ "$c" -eq "$expected" ]</div><div class='add'>+</div><div class='add'>+#Kill the "Active" brick</div><div class='add'>+brick=$($GEOREP_CLI $master $slave status | grep -F "Active" | awk {'print $3'})</div><div class='add'>+cat /proc/$brick_pid/net/unix | grep "changelog"</div><div class='add'>+TEST kill_brick $GMV0 $H0 $brick</div><div class='add'>+#Expect geo-rep status to be "Faulty"</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT  1 check_status_num_rows "Faulty"</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT  1 check_status_num_rows "Active"</div><div class='add'>+</div><div class='add'>+#Count no. of changelog socket</div><div class='add'>+brick_pid=`ps -aef | grep glusterfsd | grep -v "shared_storage" | grep -v grep | awk -F " " '{print $2}'`</div><div class='add'>+cat /proc/$brick_pid/net/unix | grep "changelog"</div><div class='add'>+ls -lrth /proc/$brick_pid/fd | grep "socket"</div><div class='add'>+c=$(grep -Fc "changelog" /proc/$brick_pid/net/unix)</div><div class='add'>+TEST [ "$c" -eq "$n" ]</div><div class='add'>+</div><div class='add'>+#Stop Geo-rep</div><div class='add'>+TEST $GEOREP_CLI $master $slave stop</div><div class='add'>+</div><div class='add'>+#Delete Geo-rep</div><div class='add'>+TEST $GEOREP_CLI $master $slave delete</div><div class='add'>+</div><div class='add'>+#Cleanup authorized keys</div><div class='add'>+sed -i '/^command=.*SSH_ORIGINAL_COMMAND#.*/d' ~/.ssh/authorized_keys</div><div class='add'>+sed -i '/^command=.*gsyncd.*/d' ~/.ssh/authorized_keys</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/00-geo-rep/bug-1708603.t b/tests/00-geo-rep/bug-1708603.t<br/>new file mode 100644<br/>index 00000000000..26913f1d318<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/00-geo-rep/bug-1708603.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/00-geo-rep/bug-1708603.t</a></div><div class='hunk'>@@ -0,0 +1,63 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../include.rc</div><div class='add'>+. $(dirname $0)/../volume.rc</div><div class='add'>+. $(dirname $0)/../geo-rep.rc</div><div class='add'>+. $(dirname $0)/../env.rc</div><div class='add'>+</div><div class='add'>+SCRIPT_TIMEOUT=300</div><div class='add'>+</div><div class='add'>+##Cleanup and start glusterd</div><div class='add'>+cleanup;</div><div class='add'>+TEST glusterd;</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+##Variables</div><div class='add'>+GEOREP_CLI="gluster volume geo-replication"</div><div class='add'>+master=$GMV0</div><div class='add'>+SH0="127.0.0.1"</div><div class='add'>+slave=${SH0}::${GSV0}</div><div class='add'>+num_active=2</div><div class='add'>+num_passive=2</div><div class='add'>+master_mnt=$M0</div><div class='add'>+slave_mnt=$M1</div><div class='add'>+</div><div class='add'>+############################################################</div><div class='add'>+#SETUP VOLUMES AND GEO-REPLICATION</div><div class='add'>+############################################################</div><div class='add'>+</div><div class='add'>+##create_and_start_master_volume</div><div class='add'>+TEST $CLI volume create $GMV0 replica 2 $H0:$B0/${GMV0}{1,2,3,4};</div><div class='add'>+TEST $CLI volume start $GMV0</div><div class='add'>+</div><div class='add'>+##create_and_start_slave_volume</div><div class='add'>+TEST $CLI volume create $GSV0 replica 2 $H0:$B0/${GSV0}{1,2,3,4};</div><div class='add'>+TEST $CLI volume start $GSV0</div><div class='add'>+</div><div class='add'>+##Mount master</div><div class='add'>+TEST glusterfs -s $H0 --volfile-id $GMV0 $M0</div><div class='add'>+</div><div class='add'>+##Mount slave</div><div class='add'>+TEST glusterfs -s $H0 --volfile-id $GSV0 $M1</div><div class='add'>+</div><div class='add'>+#Create geo-rep session</div><div class='add'>+TEST create_georep_session $master $slave</div><div class='add'>+</div><div class='add'>+echo n | $GEOREP_CLI $master $slave config ignore-deletes true &gt;/dev/null 2&gt;&amp;1</div><div class='add'>+EXPECT "false" echo $($GEOREP_CLI $master $slave config ignore-deletes)</div><div class='add'>+echo y | $GEOREP_CLI $master $slave config ignore-deletes true</div><div class='add'>+EXPECT "true" echo $($GEOREP_CLI $master $slave config ignore-deletes)</div><div class='add'>+</div><div class='add'>+#Stop Geo-rep</div><div class='add'>+TEST $GEOREP_CLI $master $slave stop</div><div class='add'>+</div><div class='add'>+#Delete Geo-rep</div><div class='add'>+TEST $GEOREP_CLI $master $slave delete</div><div class='add'>+</div><div class='add'>+#Cleanup authorized keys</div><div class='add'>+sed -i '/^command=.*SSH_ORIGINAL_COMMAND#.*/d' ~/.ssh/authorized_keys</div><div class='add'>+sed -i '/^command=.*gsyncd.*/d' ~/.ssh/authorized_keys</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+#G_TESTDEF_TEST_STATUS_NETBSD7=BAD_TEST,BUG=000000</div><div class='head'>diff --git a/tests/00-geo-rep/georep-basic-dr-rsync-arbiter.t b/tests/00-geo-rep/georep-basic-dr-rsync-arbiter.t<br/>new file mode 100644<br/>index 00000000000..c45d2ff62ce<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/00-geo-rep/georep-basic-dr-rsync-arbiter.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/00-geo-rep/georep-basic-dr-rsync-arbiter.t</a></div><div class='hunk'>@@ -0,0 +1,234 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../include.rc</div><div class='add'>+. $(dirname $0)/../volume.rc</div><div class='add'>+. $(dirname $0)/../geo-rep.rc</div><div class='add'>+. $(dirname $0)/../env.rc</div><div class='add'>+</div><div class='add'>+SCRIPT_TIMEOUT=500</div><div class='add'>+</div><div class='add'>+AREQUAL_PATH=$(dirname $0)/../utils</div><div class='add'>+test "`uname -s`" != "Linux" &amp;&amp; {</div><div class='add'>+    CFLAGS="$CFLAGS -lintl";</div><div class='add'>+}</div><div class='add'>+build_tester $AREQUAL_PATH/arequal-checksum.c $CFLAGS</div><div class='add'>+</div><div class='add'>+### Basic Tests with Distribute Replicate volumes</div><div class='add'>+</div><div class='add'>+##Cleanup and start glusterd</div><div class='add'>+cleanup;</div><div class='add'>+TEST glusterd;</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+##Variables</div><div class='add'>+GEOREP_CLI="$CLI volume geo-replication"</div><div class='add'>+master=$GMV0</div><div class='add'>+SH0="127.0.0.1"</div><div class='add'>+slave=${SH0}::${GSV0}</div><div class='add'>+num_active=2</div><div class='add'>+num_passive=4</div><div class='add'>+master_mnt=$M0</div><div class='add'>+slave_mnt=$M1</div><div class='add'>+</div><div class='add'>+############################################################</div><div class='add'>+#SETUP VOLUMES AND GEO-REPLICATION</div><div class='add'>+############################################################</div><div class='add'>+</div><div class='add'>+##create_and_start_master_volume</div><div class='add'>+TEST $CLI volume create $GMV0 replica 3 arbiter 1 $H0:$B0/${GMV0}{1,2,3,4,5,6};</div><div class='add'>+TEST $CLI volume start $GMV0</div><div class='add'>+</div><div class='add'>+##create_and_start_slave_volume</div><div class='add'>+TEST $CLI volume create $GSV0 replica 3 arbiter 1 $H0:$B0/${GSV0}{1,2,3,4,5,6};</div><div class='add'>+TEST $CLI volume start $GSV0</div><div class='add'>+TEST $CLI volume set $GSV0 performance.stat-prefetch off</div><div class='add'>+TEST $CLI volume set $GSV0 performance.quick-read off</div><div class='add'>+TEST $CLI volume set $GSV0 performance.readdir-ahead off</div><div class='add'>+TEST $CLI volume set $GSV0 performance.read-ahead off</div><div class='add'>+</div><div class='add'>+##Create, start and mount meta_volume</div><div class='add'>+TEST $CLI volume create $META_VOL replica 3 $H0:$B0/${META_VOL}{1,2,3};</div><div class='add'>+TEST $CLI volume start $META_VOL</div><div class='add'>+TEST mkdir -p $META_MNT</div><div class='add'>+TEST glusterfs -s $H0 --volfile-id $META_VOL $META_MNT</div><div class='add'>+</div><div class='add'>+##Mount master</div><div class='add'>+TEST glusterfs -s $H0 --volfile-id $GMV0 $M0</div><div class='add'>+</div><div class='add'>+##Mount slave</div><div class='add'>+TEST glusterfs -s $H0 --volfile-id $GSV0 $M1</div><div class='add'>+</div><div class='add'>+############################################################</div><div class='add'>+#BASIC GEO-REPLICATION TESTS</div><div class='add'>+############################################################</div><div class='add'>+</div><div class='add'>+#Check Hybrid Crawl</div><div class='add'>+TEST create_data "hybrid"</div><div class='add'>+TEST create_georep_session $master $slave</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 6 check_status_num_rows "Created"</div><div class='add'>+</div><div class='add'>+#Config gluster-command-dir</div><div class='add'>+TEST $GEOREP_CLI $master $slave config gluster-command-dir ${GLUSTER_CMD_DIR}</div><div class='add'>+</div><div class='add'>+#Config gluster-command-dir</div><div class='add'>+TEST $GEOREP_CLI $master $slave config slave-gluster-command-dir ${GLUSTER_CMD_DIR}</div><div class='add'>+</div><div class='add'>+#Enable_metavolume</div><div class='add'>+TEST $GEOREP_CLI $master $slave config use_meta_volume true</div><div class='add'>+</div><div class='add'>+#Set changelog roll-over time to 3 secs</div><div class='add'>+TEST $CLI volume set $GMV0 changelog.rollover-time 3</div><div class='add'>+</div><div class='add'>+#Wait for common secret pem file to be created</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT  0 check_common_secret_file</div><div class='add'>+</div><div class='add'>+#Verify the keys are distributed</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT  0 check_keys_distributed</div><div class='add'>+</div><div class='add'>+#Verify "features.read-only" Option</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 0 check_slave_read_only $GSV0</div><div class='add'>+</div><div class='add'>+#Start_georep</div><div class='add'>+TEST $GEOREP_CLI $master $slave start</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT  2 check_status_num_rows "Active"</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT  4 check_status_num_rows "Passive"</div><div class='add'>+</div><div class='add'>+#data_tests "hybrid"</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 0 regular_file_ok ${slave_mnt}/hybrid_f1</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 0 directory_ok ${slave_mnt}/hybrid_d1</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 0 rename_file_ok ${slave_mnt}/hybrid_f3 ${slave_mnt}/hybrid_f4</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 0 rename_dir_ok ${slave_mnt}/hybrid_d3 ${slave_mnt}/hybrid_d4</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 0 symlink_ok hybrid_f1 ${slave_mnt}/hybrid_sl1</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 0 hardlink_file_ok ${slave_mnt}/hybrid_f1 ${slave_mnt}/hybrid_hl1</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 1 unlink_ok ${slave_mnt}/hybrid_f2</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 1 unlink_ok ${slave_mnt}/hybrid_d2</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 0 data_ok ${slave_mnt}/hybrid_f1 "HelloWorld!"</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 0 chown_file_ok ${slave_mnt}/hybrid_chown_f1</div><div class='add'>+</div><div class='add'>+#Check History Crawl.</div><div class='add'>+TEST $GEOREP_CLI $master $slave stop</div><div class='add'>+TEST create_data "history"</div><div class='add'>+TEST $GEOREP_CLI $master $slave start</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT  2 check_status_num_rows "Active"</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT  4 check_status_num_rows "Passive"</div><div class='add'>+</div><div class='add'>+#data_tests "history"</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 0 regular_file_ok ${slave_mnt}/history_f1</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 0 directory_ok ${slave_mnt}/history_d1</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 0 rename_file_ok ${slave_mnt}/history_f3 ${slave_mnt}/history_f4</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 0 rename_dir_ok ${slave_mnt}/history_d3 ${slave_mnt}/history_d4</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 0 symlink_ok history_f1 ${slave_mnt}/history_sl1</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 0 hardlink_file_ok ${slave_mnt}/history_f1 ${slave_mnt}/history_hl1</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 1 unlink_ok ${slave_mnt}/history_f2</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 1 unlink_ok ${slave_mnt}/history_d2</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 0 data_ok ${slave_mnt}/history_f1 "HelloWorld!"</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 0 chown_file_ok ${slave_mnt}/history_chown_f1</div><div class='add'>+</div><div class='add'>+#Check Changelog Crawl.</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 2 check_status_num_rows "Changelog Crawl"</div><div class='add'>+TEST create_data "changelog"</div><div class='add'>+</div><div class='add'>+# logrotate test</div><div class='add'>+logrotate_file=${master_mnt}/logrotate/lg_test_file</div><div class='add'>+TEST mkdir -p ${master_mnt}/logrotate</div><div class='add'>+logrotate_simulate $logrotate_file 2</div><div class='add'>+logrotate_simulate $logrotate_file 2</div><div class='add'>+logrotate_simulate $logrotate_file 2</div><div class='add'>+logrotate_simulate $logrotate_file 2</div><div class='add'>+</div><div class='add'>+# CREATE + RENAME</div><div class='add'>+create_rename ${master_mnt}/rename_test_file</div><div class='add'>+</div><div class='add'>+# hard-link rename</div><div class='add'>+hardlink_rename ${master_mnt}/hardlink_rename_test_file</div><div class='add'>+</div><div class='add'>+#SYNC CHECK</div><div class='add'>+#data_tests "changelog"</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 0 regular_file_ok ${slave_mnt}/changelog_f1</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 0 directory_ok ${slave_mnt}/changelog_d1</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 0 rename_file_ok ${slave_mnt}/changelog_f3 ${slave_mnt}/changelog_f4</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 0 rename_dir_ok ${slave_mnt}/changelog_d3 ${slave_mnt}/changelog_d4</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 0 symlink_ok changelog_f1 ${slave_mnt}/changelog_sl1</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 0 hardlink_file_ok ${slave_mnt}/changelog_f1 ${slave_mnt}/changelog_hl1</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 1 unlink_ok ${slave_mnt}/changelog_f2</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 1 unlink_ok ${slave_mnt}/changelog_d2</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 0 data_ok ${slave_mnt}/changelog_f1 "HelloWorld!"</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 0 chown_file_ok ${slave_mnt}/changelog_chown_f1</div><div class='add'>+</div><div class='add'>+#logrotate</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 0 directory_ok ${slave_mnt}/logrotate</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT "x0" arequal_checksum ${master_mnt}/logrotate ${slave_mnt}/logrotate</div><div class='add'>+</div><div class='add'>+#CREATE+RENAME</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 0 create_rename_ok ${slave_mnt}/create_rename_test_file</div><div class='add'>+</div><div class='add'>+#hardlink rename</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 0 hardlink_rename_ok ${slave_mnt}/hardlink_rename_test_file</div><div class='add'>+</div><div class='add'>+#Stop Geo-rep</div><div class='add'>+TEST $GEOREP_CLI $master $slave stop</div><div class='add'>+</div><div class='add'>+#Symlink testcase: Rename symlink and create dir with same name</div><div class='add'>+TEST create_symlink_rename_mkdir_data</div><div class='add'>+</div><div class='add'>+#hardlink-rename-unlink usecase. Sonatype Nexus3 Usecase. BUG:1512483</div><div class='add'>+#TEST create_hardlink_rename_data</div><div class='add'>+</div><div class='add'>+#rsnapshot usecase</div><div class='add'>+TEST create_rsnapshot_data</div><div class='add'>+</div><div class='add'>+#Start Geo-rep</div><div class='add'>+TEST $GEOREP_CLI $master $slave start</div><div class='add'>+</div><div class='add'>+#Wait for geo-rep to come up</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT  2 check_status_num_rows "Active"</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT  4 check_status_num_rows "Passive"</div><div class='add'>+</div><div class='add'>+#Check for hardlink rename case. BUG: 1296174</div><div class='add'>+#It should not create src file again on changelog reprocessing</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 0 hardlink_rename_ok ${slave_mnt}/hardlink_rename_test_file</div><div class='add'>+</div><div class='add'>+#Symlink testcase: Rename symlink and create dir with same name</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 0 verify_symlink_rename_mkdir_data ${slave_mnt}/symlink_test1</div><div class='add'>+</div><div class='add'>+#hardlink-rename-unlink usecase. Sonatype Nexus3 Usecase. BUG:1512483</div><div class='add'>+#EXPECT_WITHIN $GEO_REP_TIMEOUT 0 verify_hardlink_rename_data ${slave_mnt}</div><div class='add'>+</div><div class='add'>+#rsnapshot usecase</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 0 verify_rsnapshot_data ${slave_mnt}</div><div class='add'>+</div><div class='add'>+#Test rsync-options set BUG:1629561</div><div class='add'>+TEST gluster volume geo-rep $master $slave config rsync-options "--whole-file"</div><div class='add'>+TEST "echo sampledata &gt; $master_mnt/rsync_option_test_file"</div><div class='add'>+</div><div class='add'>+#rename with existing destination case BUG:1694820</div><div class='add'>+TEST create_rename_with_existing_destination ${master_mnt}</div><div class='add'>+#verify rename with existing destination case BUG:1694820</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 0 verify_rename_with_existing_destination ${slave_mnt}</div><div class='add'>+</div><div class='add'>+#Verify arequal for whole volume</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT "x0" arequal_checksum ${master_mnt} ${slave_mnt}</div><div class='add'>+</div><div class='add'>+#Pause geo-replication session</div><div class='add'>+TEST $GEOREP_CLI  $master $slave pause force</div><div class='add'>+</div><div class='add'>+#Resume geo-replication session</div><div class='add'>+TEST $GEOREP_CLI  $master $slave resume force</div><div class='add'>+</div><div class='add'>+#Stop Geo-rep</div><div class='add'>+TEST $GEOREP_CLI $master $slave stop</div><div class='add'>+</div><div class='add'>+#Delete Geo-rep</div><div class='add'>+TEST $GEOREP_CLI $master $slave delete</div><div class='add'>+</div><div class='add'>+#Cleanup are-equal binary</div><div class='add'>+TEST rm $AREQUAL_PATH/arequal-checksum</div><div class='add'>+</div><div class='add'>+#Cleanup authorized keys</div><div class='add'>+sed -i '/^command=.*SSH_ORIGINAL_COMMAND#.*/d' ~/.ssh/authorized_keys</div><div class='add'>+sed -i '/^command=.*gsyncd.*/d' ~/.ssh/authorized_keys</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+#G_TESTDEF_TEST_STATUS_NETBSD7=BAD_TEST,BUG=000000</div><div class='head'>diff --git a/tests/00-geo-rep/georep-basic-dr-rsync.t b/tests/00-geo-rep/georep-basic-dr-rsync.t<br/>new file mode 100644<br/>index 00000000000..d785aa59fc9<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/00-geo-rep/georep-basic-dr-rsync.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/00-geo-rep/georep-basic-dr-rsync.t</a></div><div class='hunk'>@@ -0,0 +1,258 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../include.rc</div><div class='add'>+. $(dirname $0)/../volume.rc</div><div class='add'>+. $(dirname $0)/../geo-rep.rc</div><div class='add'>+. $(dirname $0)/../env.rc</div><div class='add'>+</div><div class='add'>+SCRIPT_TIMEOUT=500</div><div class='add'>+</div><div class='add'>+AREQUAL_PATH=$(dirname $0)/../utils</div><div class='add'>+test "`uname -s`" != "Linux" &amp;&amp; {</div><div class='add'>+    CFLAGS="$CFLAGS -lintl";</div><div class='add'>+}</div><div class='add'>+build_tester $AREQUAL_PATH/arequal-checksum.c $CFLAGS</div><div class='add'>+</div><div class='add'>+### Basic Tests with Distribute Replicate volumes</div><div class='add'>+</div><div class='add'>+##Cleanup and start glusterd</div><div class='add'>+cleanup;</div><div class='add'>+TEST glusterd;</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+##Variables</div><div class='add'>+GEOREP_CLI="$CLI volume geo-replication"</div><div class='add'>+master=$GMV0</div><div class='add'>+SH0="127.0.0.1"</div><div class='add'>+slave=${SH0}::${GSV0}</div><div class='add'>+num_active=2</div><div class='add'>+num_passive=2</div><div class='add'>+master_mnt=$M0</div><div class='add'>+slave_mnt=$M1</div><div class='add'>+</div><div class='add'>+############################################################</div><div class='add'>+#SETUP VOLUMES AND GEO-REPLICATION</div><div class='add'>+############################################################</div><div class='add'>+</div><div class='add'>+##create_and_start_master_volume</div><div class='add'>+TEST $CLI volume create $GMV0 replica 2 $H0:$B0/${GMV0}{1,2,3,4};</div><div class='add'>+TEST $CLI volume start $GMV0</div><div class='add'>+</div><div class='add'>+##create_and_start_slave_volume</div><div class='add'>+TEST $CLI volume create $GSV0 replica 2 $H0:$B0/${GSV0}{1,2,3,4};</div><div class='add'>+TEST $CLI volume start $GSV0</div><div class='add'>+TEST $CLI volume set $GSV0 performance.stat-prefetch off</div><div class='add'>+TEST $CLI volume set $GSV0 performance.quick-read off</div><div class='add'>+TEST $CLI volume set $GSV0 performance.readdir-ahead off</div><div class='add'>+TEST $CLI volume set $GSV0 performance.read-ahead off</div><div class='add'>+</div><div class='add'>+##Create, start and mount meta_volume</div><div class='add'>+TEST $CLI volume create $META_VOL replica 3 $H0:$B0/${META_VOL}{1,2,3};</div><div class='add'>+TEST $CLI volume start $META_VOL</div><div class='add'>+TEST mkdir -p $META_MNT</div><div class='add'>+TEST glusterfs -s $H0 --volfile-id $META_VOL $META_MNT</div><div class='add'>+</div><div class='add'>+##Mount master</div><div class='add'>+TEST glusterfs -s $H0 --volfile-id $GMV0 $M0</div><div class='add'>+</div><div class='add'>+##Mount slave</div><div class='add'>+TEST glusterfs -s $H0 --volfile-id $GSV0 $M1</div><div class='add'>+</div><div class='add'>+############################################################</div><div class='add'>+#BASIC GEO-REPLICATION TESTS</div><div class='add'>+############################################################</div><div class='add'>+</div><div class='add'>+#Check Hybrid Crawl</div><div class='add'>+TEST create_data "hybrid"</div><div class='add'>+TEST create_georep_session $master $slave</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 4 check_status_num_rows "Created"</div><div class='add'>+</div><div class='add'>+#Config gluster-command-dir</div><div class='add'>+TEST $GEOREP_CLI $master $slave config gluster-command-dir ${GLUSTER_CMD_DIR}</div><div class='add'>+</div><div class='add'>+#Negative test for ssh-port</div><div class='add'>+#Port should be integer and between 1-65535 range</div><div class='add'>+</div><div class='add'>+TEST ! $GEOREP_CLI $master $slave config ssh-port -22</div><div class='add'>+</div><div class='add'>+TEST ! $GEOREP_CLI $master $slave config ssh-port abc</div><div class='add'>+</div><div class='add'>+TEST ! $GEOREP_CLI $master $slave config ssh-port 6875943</div><div class='add'>+</div><div class='add'>+TEST ! $GEOREP_CLI $master $slave config ssh-port 4.5</div><div class='add'>+</div><div class='add'>+TEST ! $GEOREP_CLI $master $slave config ssh-port 22a</div><div class='add'>+</div><div class='add'>+#Config Set ssh-port to validate int validation</div><div class='add'>+TEST $GEOREP_CLI $master $slave config ssh-port 22</div><div class='add'>+</div><div class='add'>+#Config gluster-command-dir</div><div class='add'>+TEST $GEOREP_CLI $master $slave config slave-gluster-command-dir ${GLUSTER_CMD_DIR}</div><div class='add'>+</div><div class='add'>+#Enable_metavolume</div><div class='add'>+TEST $GEOREP_CLI $master $slave config use_meta_volume true</div><div class='add'>+</div><div class='add'>+#Set changelog roll-over time to 3 secs</div><div class='add'>+TEST $CLI volume set $GMV0 changelog.rollover-time 3</div><div class='add'>+</div><div class='add'>+#Wait for common secret pem file to be created</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT  0 check_common_secret_file</div><div class='add'>+</div><div class='add'>+#Verify the keys are distributed</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT  0 check_keys_distributed</div><div class='add'>+</div><div class='add'>+#Verify "features.read-only" Option</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 0 check_slave_read_only $GSV0</div><div class='add'>+</div><div class='add'>+#Start_georep</div><div class='add'>+TEST $GEOREP_CLI $master $slave start</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT  2 check_status_num_rows "Active"</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT  2 check_status_num_rows "Passive"</div><div class='add'>+</div><div class='add'>+#data_tests "hybrid"</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 0 regular_file_ok ${slave_mnt}/hybrid_f1</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 0 directory_ok ${slave_mnt}/hybrid_d1</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 0 rename_file_ok ${slave_mnt}/hybrid_f3 ${slave_mnt}/hybrid_f4</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 0 rename_dir_ok ${slave_mnt}/hybrid_d3 ${slave_mnt}/hybrid_d4</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 0 symlink_ok hybrid_f1 ${slave_mnt}/hybrid_sl1</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 0 hardlink_file_ok ${slave_mnt}/hybrid_f1 ${slave_mnt}/hybrid_hl1</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 1 unlink_ok ${slave_mnt}/hybrid_f2</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 1 unlink_ok ${slave_mnt}/hybrid_d2</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 0 data_ok ${slave_mnt}/hybrid_f1 "HelloWorld!"</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 0 chown_file_ok ${slave_mnt}/hybrid_chown_f1</div><div class='add'>+</div><div class='add'>+#Check History Crawl.</div><div class='add'>+TEST $GEOREP_CLI $master $slave stop</div><div class='add'>+TEST create_data "history"</div><div class='add'>+TEST create_rename_symlink_case</div><div class='add'>+TEST $GEOREP_CLI $master $slave start</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT  2 check_status_num_rows "Active"</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT  2 check_status_num_rows "Passive"</div><div class='add'>+</div><div class='add'>+#data_tests "history"</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 0 regular_file_ok ${slave_mnt}/history_f1</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 0 directory_ok ${slave_mnt}/history_d1</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 0 rename_file_ok ${slave_mnt}/history_f3 ${slave_mnt}/history_f4</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 0 rename_dir_ok ${slave_mnt}/history_d3 ${slave_mnt}/history_d4</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 0 symlink_ok history_f1 ${slave_mnt}/history_sl1</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 0 hardlink_file_ok ${slave_mnt}/history_f1 ${slave_mnt}/history_hl1</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 1 unlink_ok ${slave_mnt}/history_f2</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 1 unlink_ok ${slave_mnt}/history_d2</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 0 data_ok ${slave_mnt}/history_f1 "HelloWorld!"</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 0 chown_file_ok ${slave_mnt}/history_chown_f1</div><div class='add'>+</div><div class='add'>+#Check Changelog Crawl.</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 2 check_status_num_rows "Changelog Crawl"</div><div class='add'>+TEST create_data "changelog"</div><div class='add'>+</div><div class='add'>+# logrotate test</div><div class='add'>+logrotate_file=${master_mnt}/logrotate/lg_test_file</div><div class='add'>+TEST mkdir -p ${master_mnt}/logrotate</div><div class='add'>+logrotate_simulate $logrotate_file 2</div><div class='add'>+logrotate_simulate $logrotate_file 2</div><div class='add'>+logrotate_simulate $logrotate_file 2</div><div class='add'>+logrotate_simulate $logrotate_file 2</div><div class='add'>+</div><div class='add'>+# CREATE + RENAME</div><div class='add'>+create_rename ${master_mnt}/rename_test_file</div><div class='add'>+</div><div class='add'>+# hard-link rename</div><div class='add'>+hardlink_rename ${master_mnt}/hardlink_rename_test_file</div><div class='add'>+</div><div class='add'>+#SYNC CHECK</div><div class='add'>+#data_tests "changelog"</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 0 regular_file_ok ${slave_mnt}/changelog_f1</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 0 directory_ok ${slave_mnt}/changelog_d1</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 0 rename_file_ok ${slave_mnt}/changelog_f3 ${slave_mnt}/changelog_f4</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 0 rename_dir_ok ${slave_mnt}/changelog_d3 ${slave_mnt}/changelog_d4</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 0 symlink_ok changelog_f1 ${slave_mnt}/changelog_sl1</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 0 hardlink_file_ok ${slave_mnt}/changelog_f1 ${slave_mnt}/changelog_hl1</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 1 unlink_ok ${slave_mnt}/changelog_f2</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 1 unlink_ok ${slave_mnt}/changelog_d2</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 0 data_ok ${slave_mnt}/changelog_f1 "HelloWorld!"</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 0 chown_file_ok ${slave_mnt}/changelog_chown_f1</div><div class='add'>+</div><div class='add'>+#logrotate</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 0 directory_ok ${slave_mnt}/logrotate</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT "x0" arequal_checksum ${master_mnt}/logrotate ${slave_mnt}/logrotate</div><div class='add'>+</div><div class='add'>+#CREATE+RENAME</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 0 create_rename_ok ${slave_mnt}/create_rename_test_file</div><div class='add'>+</div><div class='add'>+#hardlink rename</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 0 hardlink_rename_ok ${slave_mnt}/hardlink_rename_test_file</div><div class='add'>+</div><div class='add'>+#Stop Geo-rep</div><div class='add'>+TEST $GEOREP_CLI $master $slave stop</div><div class='add'>+</div><div class='add'>+#Symlink testcase: Rename symlink and create dir with same name</div><div class='add'>+TEST create_symlink_rename_mkdir_data</div><div class='add'>+</div><div class='add'>+#hardlink-rename-unlink usecase. Sonatype Nexus3 Usecase. BUG:1512483</div><div class='add'>+TEST create_hardlink_rename_data</div><div class='add'>+</div><div class='add'>+#rsnapshot usecase</div><div class='add'>+TEST create_rsnapshot_data</div><div class='add'>+</div><div class='add'>+#Start Geo-rep</div><div class='add'>+TEST $GEOREP_CLI $master $slave start</div><div class='add'>+</div><div class='add'>+#Wait for geo-rep to come up</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT  2 check_status_num_rows "Active"</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT  2 check_status_num_rows "Passive"</div><div class='add'>+</div><div class='add'>+#Check for hardlink rename case. BUG: 1296174</div><div class='add'>+#It should not create src file again on changelog reprocessing</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 0 hardlink_rename_ok ${slave_mnt}/hardlink_rename_test_file</div><div class='add'>+</div><div class='add'>+#Symlink testcase: Rename symlink and create dir with same name</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 0 verify_symlink_rename_mkdir_data ${slave_mnt}/symlink_test1</div><div class='add'>+</div><div class='add'>+#hardlink-rename-unlink usecase. Sonatype Nexus3 Usecase. BUG:1512483</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 0 verify_hardlink_rename_data ${slave_mnt}</div><div class='add'>+</div><div class='add'>+#rsnapshot usecase</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 0 verify_rsnapshot_data ${slave_mnt}</div><div class='add'>+</div><div class='add'>+#Test rsync-options set BUG:1629561</div><div class='add'>+TEST gluster volume geo-rep $master $slave config rsync-options "--whole-file"</div><div class='add'>+TEST "echo sampledata &gt; $master_mnt/rsync_option_test_file"</div><div class='add'>+</div><div class='add'>+#rename with existing destination case BUG:1694820</div><div class='add'>+TEST create_rename_with_existing_destination ${master_mnt}</div><div class='add'>+#verify rename with existing destination case BUG:1694820</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 0 verify_rename_with_existing_destination ${slave_mnt}</div><div class='add'>+</div><div class='add'>+#Verify arequal for whole volume</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT "x0" arequal_checksum ${master_mnt} ${slave_mnt}</div><div class='add'>+</div><div class='add'>+#Test config upgrade BUG: 1707731</div><div class='add'>+config_file=$GLUSTERD_WORKDIR/geo-replication/${GMV0}_${SH0}_${GSV0}/gsyncd.conf</div><div class='add'>+cat &gt;&gt; $config_file&lt;&lt;EOL</div><div class='add'>+[peers ${GMV0} ${GSV0}]</div><div class='add'>+use_tarssh = true</div><div class='add'>+timeout = 1</div><div class='add'>+EOL</div><div class='add'>+TEST $GEOREP_CLI $master $slave stop</div><div class='add'>+TEST $GEOREP_CLI $master $slave start</div><div class='add'>+#verify that the config file is updated</div><div class='add'>+EXPECT "1" echo $(grep -Fc "vars" $config_file)</div><div class='add'>+EXPECT "1" echo $(grep -Fc "sync-method = tarssh" $config_file)</div><div class='add'>+EXPECT "1" echo $(grep -Fc "slave-timeout = 1" $config_file)</div><div class='add'>+#Stop Geo-rep</div><div class='add'>+TEST $GEOREP_CLI $master $slave stop</div><div class='add'>+</div><div class='add'>+#Delete Geo-rep</div><div class='add'>+TEST $GEOREP_CLI $master $slave delete</div><div class='add'>+</div><div class='add'>+#Cleanup are-equal binary</div><div class='add'>+TEST rm $AREQUAL_PATH/arequal-checksum</div><div class='add'>+</div><div class='add'>+#Cleanup authorized keys</div><div class='add'>+sed -i '/^command=.*SSH_ORIGINAL_COMMAND#.*/d' ~/.ssh/authorized_keys</div><div class='add'>+sed -i '/^command=.*gsyncd.*/d' ~/.ssh/authorized_keys</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+#G_TESTDEF_TEST_STATUS_NETBSD7=BAD_TEST,BUG=000000</div><div class='head'>diff --git a/tests/00-geo-rep/georep-basic-dr-tarssh-arbiter.t b/tests/00-geo-rep/georep-basic-dr-tarssh-arbiter.t<br/>new file mode 100644<br/>index 00000000000..8fed929ffca<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/00-geo-rep/georep-basic-dr-tarssh-arbiter.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/00-geo-rep/georep-basic-dr-tarssh-arbiter.t</a></div><div class='hunk'>@@ -0,0 +1,227 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../include.rc</div><div class='add'>+. $(dirname $0)/../volume.rc</div><div class='add'>+. $(dirname $0)/../geo-rep.rc</div><div class='add'>+. $(dirname $0)/../env.rc</div><div class='add'>+</div><div class='add'>+SCRIPT_TIMEOUT=500</div><div class='add'>+</div><div class='add'>+AREQUAL_PATH=$(dirname $0)/../utils</div><div class='add'>+test "`uname -s`" != "Linux" &amp;&amp; {</div><div class='add'>+    CFLAGS="$CFLAGS -lintl";</div><div class='add'>+}</div><div class='add'>+build_tester $AREQUAL_PATH/arequal-checksum.c $CFLAGS</div><div class='add'>+</div><div class='add'>+### Basic Tests with Distribute Replicate volumes</div><div class='add'>+</div><div class='add'>+##Cleanup and start glusterd</div><div class='add'>+cleanup;</div><div class='add'>+TEST glusterd;</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+##Variables</div><div class='add'>+GEOREP_CLI="$CLI volume geo-replication"</div><div class='add'>+master=$GMV0</div><div class='add'>+SH0="127.0.0.1"</div><div class='add'>+slave=${SH0}::${GSV0}</div><div class='add'>+num_active=2</div><div class='add'>+num_passive=4</div><div class='add'>+master_mnt=$M0</div><div class='add'>+slave_mnt=$M1</div><div class='add'>+</div><div class='add'>+############################################################</div><div class='add'>+#SETUP VOLUMES AND GEO-REPLICATION</div><div class='add'>+############################################################</div><div class='add'>+</div><div class='add'>+##create_and_start_master_volume</div><div class='add'>+TEST $CLI volume create $GMV0 replica 3 arbiter 1 $H0:$B0/${GMV0}{1,2,3,4,5,6};</div><div class='add'>+TEST $CLI volume start $GMV0</div><div class='add'>+</div><div class='add'>+##create_and_start_slave_volume</div><div class='add'>+TEST $CLI volume create $GSV0 replica 3 arbiter 1 $H0:$B0/${GSV0}{1,2,3,4,5,6};</div><div class='add'>+TEST $CLI volume start $GSV0</div><div class='add'>+TEST $CLI volume set $GSV0 performance.stat-prefetch off</div><div class='add'>+TEST $CLI volume set $GSV0 performance.quick-read off</div><div class='add'>+TEST $CLI volume set $GSV0 performance.readdir-ahead off</div><div class='add'>+TEST $CLI volume set $GSV0 performance.read-ahead off</div><div class='add'>+</div><div class='add'>+##Create, start and mount meta_volume</div><div class='add'>+TEST $CLI volume create $META_VOL replica 3 $H0:$B0/${META_VOL}{1,2,3};</div><div class='add'>+TEST $CLI volume start $META_VOL</div><div class='add'>+TEST mkdir -p $META_MNT</div><div class='add'>+TEST glusterfs -s $H0 --volfile-id $META_VOL $META_MNT</div><div class='add'>+</div><div class='add'>+##Mount master</div><div class='add'>+TEST glusterfs -s $H0 --volfile-id $GMV0 $M0</div><div class='add'>+</div><div class='add'>+##Mount slave</div><div class='add'>+TEST glusterfs -s $H0 --volfile-id $GSV0 $M1</div><div class='add'>+</div><div class='add'>+############################################################</div><div class='add'>+#BASIC GEO-REPLICATION TESTS</div><div class='add'>+############################################################</div><div class='add'>+</div><div class='add'>+#Check Hybrid Crawl</div><div class='add'>+TEST create_data "hybrid"</div><div class='add'>+TEST create_georep_session $master $slave</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 6 check_status_num_rows "Created"</div><div class='add'>+</div><div class='add'>+#Config gluster-command-dir</div><div class='add'>+TEST $GEOREP_CLI $master $slave config gluster-command-dir ${GLUSTER_CMD_DIR}</div><div class='add'>+</div><div class='add'>+#Config gluster-command-dir</div><div class='add'>+TEST $GEOREP_CLI $master $slave config slave-gluster-command-dir ${GLUSTER_CMD_DIR}</div><div class='add'>+</div><div class='add'>+#Enable_metavolume</div><div class='add'>+TEST $GEOREP_CLI $master $slave config use_meta_volume true</div><div class='add'>+</div><div class='add'>+#Set changelog roll-over time to 3 secs</div><div class='add'>+TEST $CLI volume set $GMV0 changelog.rollover-time 3</div><div class='add'>+</div><div class='add'>+#Config tarssh as sync-engine</div><div class='add'>+TEST $GEOREP_CLI $master $slave config sync-method tarssh</div><div class='add'>+</div><div class='add'>+#Wait for common secret pem file to be created</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT  0 check_common_secret_file</div><div class='add'>+</div><div class='add'>+#Verify the keys are distributed</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT  0 check_keys_distributed</div><div class='add'>+</div><div class='add'>+#Verify "features.read-only" Option</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 0 check_slave_read_only $GSV0</div><div class='add'>+</div><div class='add'>+#Start_georep</div><div class='add'>+TEST $GEOREP_CLI $master $slave start</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT  2 check_status_num_rows "Active"</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT  4 check_status_num_rows "Passive"</div><div class='add'>+</div><div class='add'>+#data_tests "hybrid"</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 0 regular_file_ok ${slave_mnt}/hybrid_f1</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 0 directory_ok ${slave_mnt}/hybrid_d1</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 0 rename_file_ok ${slave_mnt}/hybrid_f3 ${slave_mnt}/hybrid_f4</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 0 rename_dir_ok ${slave_mnt}/hybrid_d3 ${slave_mnt}/hybrid_d4</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 0 symlink_ok hybrid_f1 ${slave_mnt}/hybrid_sl1</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 0 hardlink_file_ok ${slave_mnt}/hybrid_f1 ${slave_mnt}/hybrid_hl1</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 1 unlink_ok ${slave_mnt}/hybrid_f2</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 1 unlink_ok ${slave_mnt}/hybrid_d2</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 0 data_ok ${slave_mnt}/hybrid_f1 "HelloWorld!"</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 0 chown_file_ok ${slave_mnt}/hybrid_chown_f1</div><div class='add'>+</div><div class='add'>+#Check History Crawl.</div><div class='add'>+TEST $GEOREP_CLI $master $slave stop</div><div class='add'>+TEST create_data "history"</div><div class='add'>+TEST $GEOREP_CLI $master $slave start</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT  2 check_status_num_rows "Active"</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT  4 check_status_num_rows "Passive"</div><div class='add'>+</div><div class='add'>+#data_tests "history"</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 0 regular_file_ok ${slave_mnt}/history_f1</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 0 directory_ok ${slave_mnt}/history_d1</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 0 rename_file_ok ${slave_mnt}/history_f3 ${slave_mnt}/history_f4</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 0 rename_dir_ok ${slave_mnt}/history_d3 ${slave_mnt}/history_d4</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 0 symlink_ok history_f1 ${slave_mnt}/history_sl1</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 0 hardlink_file_ok ${slave_mnt}/history_f1 ${slave_mnt}/history_hl1</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 1 unlink_ok ${slave_mnt}/history_f2</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 1 unlink_ok ${slave_mnt}/history_d2</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 0 data_ok ${slave_mnt}/history_f1 "HelloWorld!"</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 0 chown_file_ok ${slave_mnt}/history_chown_f1</div><div class='add'>+</div><div class='add'>+#Check Changelog Crawl.</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 2 check_status_num_rows "Changelog Crawl"</div><div class='add'>+TEST create_data "changelog"</div><div class='add'>+</div><div class='add'>+# logrotate test</div><div class='add'>+logrotate_file=${master_mnt}/logrotate/lg_test_file</div><div class='add'>+TEST mkdir -p ${master_mnt}/logrotate</div><div class='add'>+logrotate_simulate $logrotate_file 2</div><div class='add'>+logrotate_simulate $logrotate_file 2</div><div class='add'>+logrotate_simulate $logrotate_file 2</div><div class='add'>+logrotate_simulate $logrotate_file 2</div><div class='add'>+</div><div class='add'>+# CREATE + RENAME</div><div class='add'>+create_rename ${master_mnt}/rename_test_file</div><div class='add'>+</div><div class='add'>+# hard-link rename</div><div class='add'>+hardlink_rename ${master_mnt}/hardlink_rename_test_file</div><div class='add'>+</div><div class='add'>+#SYNC CHECK</div><div class='add'>+#data_tests "changelog"</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 0 regular_file_ok ${slave_mnt}/changelog_f1</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 0 directory_ok ${slave_mnt}/changelog_d1</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 0 rename_file_ok ${slave_mnt}/changelog_f3 ${slave_mnt}/changelog_f4</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 0 rename_dir_ok ${slave_mnt}/changelog_d3 ${slave_mnt}/changelog_d4</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 0 symlink_ok changelog_f1 ${slave_mnt}/changelog_sl1</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 0 hardlink_file_ok ${slave_mnt}/changelog_f1 ${slave_mnt}/changelog_hl1</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 1 unlink_ok ${slave_mnt}/changelog_f2</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 1 unlink_ok ${slave_mnt}/changelog_d2</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 0 data_ok ${slave_mnt}/changelog_f1 "HelloWorld!"</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 0 chown_file_ok ${slave_mnt}/changelog_chown_f1</div><div class='add'>+</div><div class='add'>+#logrotate</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 0 directory_ok ${slave_mnt}/logrotate</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT "x0" arequal_checksum ${master_mnt}/logrotate ${slave_mnt}/logrotate</div><div class='add'>+</div><div class='add'>+#CREATE+RENAME</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 0 create_rename_ok ${slave_mnt}/create_rename_test_file</div><div class='add'>+</div><div class='add'>+#hardlink rename</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 0 hardlink_rename_ok ${slave_mnt}/hardlink_rename_test_file</div><div class='add'>+</div><div class='add'>+#Stop Geo-rep</div><div class='add'>+TEST $GEOREP_CLI $master $slave stop</div><div class='add'>+</div><div class='add'>+#Symlink testcase: Rename symlink and create dir with same name</div><div class='add'>+TEST create_symlink_rename_mkdir_data</div><div class='add'>+</div><div class='add'>+#hardlink-rename-unlink usecase. Sonatype Nexus3 Usecase. BUG:1512483</div><div class='add'>+#TEST create_hardlink_rename_data</div><div class='add'>+</div><div class='add'>+#rsnapshot usecase</div><div class='add'>+TEST create_rsnapshot_data</div><div class='add'>+</div><div class='add'>+#Start Geo-rep</div><div class='add'>+TEST $GEOREP_CLI $master $slave start</div><div class='add'>+</div><div class='add'>+#Wait for geo-rep to come up</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT  2 check_status_num_rows "Active"</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT  4 check_status_num_rows "Passive"</div><div class='add'>+</div><div class='add'>+#Check for hardlink rename case. BUG: 1296174</div><div class='add'>+#It should not create src file again on changelog reprocessing</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 0 hardlink_rename_ok ${slave_mnt}/hardlink_rename_test_file</div><div class='add'>+</div><div class='add'>+#Symlink testcase: Rename symlink and create dir with same name</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 0 verify_symlink_rename_mkdir_data ${slave_mnt}/symlink_test1</div><div class='add'>+</div><div class='add'>+#hardlink-rename-unlink usecase. Sonatype Nexus3 Usecase. BUG:1512483</div><div class='add'>+#EXPECT_WITHIN $GEO_REP_TIMEOUT 0 verify_hardlink_rename_data ${slave_mnt}</div><div class='add'>+</div><div class='add'>+#rsnapshot usecase</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 0 verify_rsnapshot_data ${slave_mnt}</div><div class='add'>+</div><div class='add'>+#rename with existing destination case BUG:1694820</div><div class='add'>+TEST create_rename_with_existing_destination ${master_mnt}</div><div class='add'>+#verify rename with existing destination case BUG:1694820</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 0 verify_rename_with_existing_destination ${slave_mnt}</div><div class='add'>+</div><div class='add'>+#Verify arequal for whole volume</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT "x0" arequal_checksum ${master_mnt} ${slave_mnt}</div><div class='add'>+</div><div class='add'>+#Stop Geo-rep</div><div class='add'>+TEST $GEOREP_CLI $master $slave stop</div><div class='add'>+</div><div class='add'>+#Delete Geo-rep</div><div class='add'>+TEST $GEOREP_CLI $master $slave delete</div><div class='add'>+</div><div class='add'>+#Cleanup are-equal binary</div><div class='add'>+TEST rm $AREQUAL_PATH/arequal-checksum</div><div class='add'>+</div><div class='add'>+#Cleanup authorized keys</div><div class='add'>+sed -i '/^command=.*SSH_ORIGINAL_COMMAND#.*/d' ~/.ssh/authorized_keys</div><div class='add'>+sed -i '/^command=.*gsyncd.*/d' ~/.ssh/authorized_keys</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+#G_TESTDEF_TEST_STATUS_NETBSD7=BAD_TEST,BUG=000000</div><div class='head'>diff --git a/tests/00-geo-rep/georep-basic-dr-tarssh.t b/tests/00-geo-rep/georep-basic-dr-tarssh.t<br/>new file mode 100644<br/>index 00000000000..feb2de74c90<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/00-geo-rep/georep-basic-dr-tarssh.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/00-geo-rep/georep-basic-dr-tarssh.t</a></div><div class='hunk'>@@ -0,0 +1,227 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../include.rc</div><div class='add'>+. $(dirname $0)/../volume.rc</div><div class='add'>+. $(dirname $0)/../geo-rep.rc</div><div class='add'>+. $(dirname $0)/../env.rc</div><div class='add'>+</div><div class='add'>+SCRIPT_TIMEOUT=500</div><div class='add'>+</div><div class='add'>+AREQUAL_PATH=$(dirname $0)/../utils</div><div class='add'>+test "`uname -s`" != "Linux" &amp;&amp; {</div><div class='add'>+    CFLAGS="$CFLAGS -lintl";</div><div class='add'>+}</div><div class='add'>+build_tester $AREQUAL_PATH/arequal-checksum.c $CFLAGS</div><div class='add'>+</div><div class='add'>+### Basic Tests with Distribute Replicate volumes</div><div class='add'>+</div><div class='add'>+##Cleanup and start glusterd</div><div class='add'>+cleanup;</div><div class='add'>+TEST glusterd;</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+##Variables</div><div class='add'>+GEOREP_CLI="$CLI volume geo-replication"</div><div class='add'>+master=$GMV0</div><div class='add'>+SH0="127.0.0.1"</div><div class='add'>+slave=${SH0}::${GSV0}</div><div class='add'>+num_active=2</div><div class='add'>+num_passive=2</div><div class='add'>+master_mnt=$M0</div><div class='add'>+slave_mnt=$M1</div><div class='add'>+</div><div class='add'>+############################################################</div><div class='add'>+#SETUP VOLUMES AND GEO-REPLICATION</div><div class='add'>+############################################################</div><div class='add'>+</div><div class='add'>+##create_and_start_master_volume</div><div class='add'>+TEST $CLI volume create $GMV0 replica 2 $H0:$B0/${GMV0}{1,2,3,4};</div><div class='add'>+TEST $CLI volume start $GMV0</div><div class='add'>+</div><div class='add'>+##create_and_start_slave_volume</div><div class='add'>+TEST $CLI volume create $GSV0 replica 2 $H0:$B0/${GSV0}{1,2,3,4};</div><div class='add'>+TEST $CLI volume start $GSV0</div><div class='add'>+TEST $CLI volume set $GSV0 performance.stat-prefetch off</div><div class='add'>+TEST $CLI volume set $GSV0 performance.quick-read off</div><div class='add'>+TEST $CLI volume set $GSV0 performance.readdir-ahead off</div><div class='add'>+TEST $CLI volume set $GSV0 performance.read-ahead off</div><div class='add'>+</div><div class='add'>+##Create, start and mount meta_volume</div><div class='add'>+TEST $CLI volume create $META_VOL replica 3 $H0:$B0/${META_VOL}{1,2,3};</div><div class='add'>+TEST $CLI volume start $META_VOL</div><div class='add'>+TEST mkdir -p $META_MNT</div><div class='add'>+TEST glusterfs -s $H0 --volfile-id $META_VOL $META_MNT</div><div class='add'>+</div><div class='add'>+##Mount master</div><div class='add'>+TEST glusterfs -s $H0 --volfile-id $GMV0 $M0</div><div class='add'>+</div><div class='add'>+##Mount slave</div><div class='add'>+TEST glusterfs -s $H0 --volfile-id $GSV0 $M1</div><div class='add'>+</div><div class='add'>+############################################################</div><div class='add'>+#BASIC GEO-REPLICATION TESTS</div><div class='add'>+############################################################</div><div class='add'>+</div><div class='add'>+#Check Hybrid Crawl</div><div class='add'>+TEST create_data "hybrid"</div><div class='add'>+TEST create_georep_session $master $slave</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 4 check_status_num_rows "Created"</div><div class='add'>+</div><div class='add'>+#Config gluster-command-dir</div><div class='add'>+TEST $GEOREP_CLI $master $slave config gluster-command-dir ${GLUSTER_CMD_DIR}</div><div class='add'>+</div><div class='add'>+#Config gluster-command-dir</div><div class='add'>+TEST $GEOREP_CLI $master $slave config slave-gluster-command-dir ${GLUSTER_CMD_DIR}</div><div class='add'>+</div><div class='add'>+#Enable_metavolume</div><div class='add'>+TEST $GEOREP_CLI $master $slave config use_meta_volume true</div><div class='add'>+</div><div class='add'>+#Set changelog roll-over time to 3 secs</div><div class='add'>+TEST $CLI volume set $GMV0 changelog.rollover-time 3</div><div class='add'>+</div><div class='add'>+#Config tarssh as sync-engine</div><div class='add'>+TEST $GEOREP_CLI $master $slave config sync-method tarssh</div><div class='add'>+</div><div class='add'>+#Wait for common secret pem file to be created</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT  0 check_common_secret_file</div><div class='add'>+</div><div class='add'>+#Verify the keys are distributed</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT  0 check_keys_distributed</div><div class='add'>+</div><div class='add'>+#Verify "features.read-only" Option</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 0 check_slave_read_only $GSV0</div><div class='add'>+</div><div class='add'>+#Start_georep</div><div class='add'>+TEST $GEOREP_CLI $master $slave start</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT  2 check_status_num_rows "Active"</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT  2 check_status_num_rows "Passive"</div><div class='add'>+</div><div class='add'>+#data_tests "hybrid"</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 0 regular_file_ok ${slave_mnt}/hybrid_f1</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 0 directory_ok ${slave_mnt}/hybrid_d1</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 0 rename_file_ok ${slave_mnt}/hybrid_f3 ${slave_mnt}/hybrid_f4</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 0 rename_dir_ok ${slave_mnt}/hybrid_d3 ${slave_mnt}/hybrid_d4</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 0 symlink_ok hybrid_f1 ${slave_mnt}/hybrid_sl1</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 0 hardlink_file_ok ${slave_mnt}/hybrid_f1 ${slave_mnt}/hybrid_hl1</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 1 unlink_ok ${slave_mnt}/hybrid_f2</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 1 unlink_ok ${slave_mnt}/hybrid_d2</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 0 data_ok ${slave_mnt}/hybrid_f1 "HelloWorld!"</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 0 chown_file_ok ${slave_mnt}/hybrid_chown_f1</div><div class='add'>+</div><div class='add'>+#Check History Crawl.</div><div class='add'>+TEST $GEOREP_CLI $master $slave stop</div><div class='add'>+TEST create_data "history"</div><div class='add'>+TEST $GEOREP_CLI $master $slave start</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT  2 check_status_num_rows "Active"</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT  2 check_status_num_rows "Passive"</div><div class='add'>+</div><div class='add'>+#data_tests "history"</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 0 regular_file_ok ${slave_mnt}/history_f1</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 0 directory_ok ${slave_mnt}/history_d1</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 0 rename_file_ok ${slave_mnt}/history_f3 ${slave_mnt}/history_f4</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 0 rename_dir_ok ${slave_mnt}/history_d3 ${slave_mnt}/history_d4</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 0 symlink_ok history_f1 ${slave_mnt}/history_sl1</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 0 hardlink_file_ok ${slave_mnt}/history_f1 ${slave_mnt}/history_hl1</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 1 unlink_ok ${slave_mnt}/history_f2</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 1 unlink_ok ${slave_mnt}/history_d2</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 0 data_ok ${slave_mnt}/history_f1 "HelloWorld!"</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 0 chown_file_ok ${slave_mnt}/history_chown_f1</div><div class='add'>+</div><div class='add'>+#Check Changelog Crawl.</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 2 check_status_num_rows "Changelog Crawl"</div><div class='add'>+TEST create_data "changelog"</div><div class='add'>+</div><div class='add'>+# logrotate test</div><div class='add'>+logrotate_file=${master_mnt}/logrotate/lg_test_file</div><div class='add'>+TEST mkdir -p ${master_mnt}/logrotate</div><div class='add'>+logrotate_simulate $logrotate_file 2</div><div class='add'>+logrotate_simulate $logrotate_file 2</div><div class='add'>+logrotate_simulate $logrotate_file 2</div><div class='add'>+logrotate_simulate $logrotate_file 2</div><div class='add'>+</div><div class='add'>+# CREATE + RENAME</div><div class='add'>+create_rename ${master_mnt}/rename_test_file</div><div class='add'>+</div><div class='add'>+# hard-link rename</div><div class='add'>+hardlink_rename ${master_mnt}/hardlink_rename_test_file</div><div class='add'>+</div><div class='add'>+#SYNC CHECK</div><div class='add'>+#data_tests "changelog"</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 0 regular_file_ok ${slave_mnt}/changelog_f1</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 0 directory_ok ${slave_mnt}/changelog_d1</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 0 rename_file_ok ${slave_mnt}/changelog_f3 ${slave_mnt}/changelog_f4</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 0 rename_dir_ok ${slave_mnt}/changelog_d3 ${slave_mnt}/changelog_d4</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 0 symlink_ok changelog_f1 ${slave_mnt}/changelog_sl1</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 0 hardlink_file_ok ${slave_mnt}/changelog_f1 ${slave_mnt}/changelog_hl1</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 1 unlink_ok ${slave_mnt}/changelog_f2</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 1 unlink_ok ${slave_mnt}/changelog_d2</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 0 data_ok ${slave_mnt}/changelog_f1 "HelloWorld!"</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 0 chown_file_ok ${slave_mnt}/changelog_chown_f1</div><div class='add'>+</div><div class='add'>+#logrotate</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 0 directory_ok ${slave_mnt}/logrotate</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT "x0" arequal_checksum ${master_mnt}/logrotate ${slave_mnt}/logrotate</div><div class='add'>+</div><div class='add'>+#CREATE+RENAME</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 0 create_rename_ok ${slave_mnt}/create_rename_test_file</div><div class='add'>+</div><div class='add'>+#hardlink rename</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 0 hardlink_rename_ok ${slave_mnt}/hardlink_rename_test_file</div><div class='add'>+</div><div class='add'>+#Stop Geo-rep</div><div class='add'>+TEST $GEOREP_CLI $master $slave stop</div><div class='add'>+</div><div class='add'>+#Symlink testcase: Rename symlink and create dir with same name</div><div class='add'>+TEST create_symlink_rename_mkdir_data</div><div class='add'>+</div><div class='add'>+#hardlink-rename-unlink usecase. Sonatype Nexus3 Usecase. BUG:1512483</div><div class='add'>+TEST create_hardlink_rename_data</div><div class='add'>+</div><div class='add'>+#rsnapshot usecase</div><div class='add'>+TEST create_rsnapshot_data</div><div class='add'>+</div><div class='add'>+#Start Geo-rep</div><div class='add'>+TEST $GEOREP_CLI $master $slave start</div><div class='add'>+</div><div class='add'>+#Wait for geo-rep to come up</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT  2 check_status_num_rows "Active"</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT  2 check_status_num_rows "Passive"</div><div class='add'>+</div><div class='add'>+#Check for hardlink rename case. BUG: 1296174</div><div class='add'>+#It should not create src file again on changelog reprocessing</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 0 hardlink_rename_ok ${slave_mnt}/hardlink_rename_test_file</div><div class='add'>+</div><div class='add'>+#Symlink testcase: Rename symlink and create dir with same name</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 0 verify_symlink_rename_mkdir_data ${slave_mnt}/symlink_test1</div><div class='add'>+</div><div class='add'>+#hardlink-rename-unlink usecase. Sonatype Nexus3 Usecase. BUG:1512483</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 0 verify_hardlink_rename_data ${slave_mnt}</div><div class='add'>+</div><div class='add'>+#rsnapshot usecase</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 0 verify_rsnapshot_data ${slave_mnt}</div><div class='add'>+</div><div class='add'>+#rename with existing destination case BUG:1694820</div><div class='add'>+TEST create_rename_with_existing_destination ${master_mnt}</div><div class='add'>+#verify rename with existing destination case BUG:1694820</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 0 verify_rename_with_existing_destination ${slave_mnt}</div><div class='add'>+</div><div class='add'>+#Verify arequal for whole volume</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT "x0" arequal_checksum ${master_mnt} ${slave_mnt}</div><div class='add'>+</div><div class='add'>+#Stop Geo-rep</div><div class='add'>+TEST $GEOREP_CLI $master $slave stop</div><div class='add'>+</div><div class='add'>+#Delete Geo-rep</div><div class='add'>+TEST $GEOREP_CLI $master $slave delete</div><div class='add'>+</div><div class='add'>+#Cleanup are-equal binary</div><div class='add'>+TEST rm $AREQUAL_PATH/arequal-checksum</div><div class='add'>+</div><div class='add'>+#Cleanup authorized keys</div><div class='add'>+sed -i '/^command=.*SSH_ORIGINAL_COMMAND#.*/d' ~/.ssh/authorized_keys</div><div class='add'>+sed -i '/^command=.*gsyncd.*/d' ~/.ssh/authorized_keys</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+#G_TESTDEF_TEST_STATUS_NETBSD7=BAD_TEST,BUG=000000</div><div class='head'>diff --git a/tests/00-geo-rep/georep-basic-rsync-ec.t b/tests/00-geo-rep/georep-basic-rsync-ec.t<br/>new file mode 100644<br/>index 00000000000..dd1f94edbc9<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/00-geo-rep/georep-basic-rsync-ec.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/00-geo-rep/georep-basic-rsync-ec.t</a></div><div class='hunk'>@@ -0,0 +1,224 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../include.rc</div><div class='add'>+. $(dirname $0)/../volume.rc</div><div class='add'>+. $(dirname $0)/../geo-rep.rc</div><div class='add'>+. $(dirname $0)/../env.rc</div><div class='add'>+</div><div class='add'>+SCRIPT_TIMEOUT=500</div><div class='add'>+</div><div class='add'>+AREQUAL_PATH=$(dirname $0)/../utils</div><div class='add'>+test "`uname -s`" != "Linux" &amp;&amp; {</div><div class='add'>+    CFLAGS="$CFLAGS -lintl";</div><div class='add'>+}</div><div class='add'>+build_tester $AREQUAL_PATH/arequal-checksum.c $CFLAGS</div><div class='add'>+</div><div class='add'>+### Basic Tests with Distributed Disperse volumes</div><div class='add'>+</div><div class='add'>+##Cleanup and start glusterd</div><div class='add'>+cleanup;</div><div class='add'>+TEST glusterd;</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+##Variables</div><div class='add'>+GEOREP_CLI="$CLI volume geo-replication"</div><div class='add'>+master=$GMV0</div><div class='add'>+SH0="127.0.0.1"</div><div class='add'>+slave=${SH0}::${GSV0}</div><div class='add'>+num_active=2</div><div class='add'>+num_passive=10</div><div class='add'>+master_mnt=$M0</div><div class='add'>+slave_mnt=$M1</div><div class='add'>+</div><div class='add'>+############################################################</div><div class='add'>+#SETUP VOLUMES AND GEO-REPLICATION</div><div class='add'>+############################################################</div><div class='add'>+</div><div class='add'>+##create_and_start_master_volume</div><div class='add'>+TEST $CLI volume create $GMV0 disperse 3 redundancy 1 $H0:$B0/${GMV0}{0..5};</div><div class='add'>+TEST $CLI volume start $GMV0</div><div class='add'>+</div><div class='add'>+##create_and_start_slave_volume</div><div class='add'>+TEST $CLI volume create $GSV0 disperse 3 redundancy 1 $H0:$B0/${GSV0}{0..5};</div><div class='add'>+TEST $CLI volume start $GSV0</div><div class='add'>+</div><div class='add'>+##Create, start and mount meta_volume</div><div class='add'>+TEST $CLI volume create $META_VOL replica 3 $H0:$B0/${META_VOL}{1,2,3};</div><div class='add'>+TEST $CLI volume start $META_VOL</div><div class='add'>+TEST mkdir -p $META_MNT</div><div class='add'>+TEST glusterfs -s $H0 --volfile-id $META_VOL $META_MNT</div><div class='add'>+</div><div class='add'>+##Mount master</div><div class='add'>+TEST glusterfs -s $H0 --volfile-id $GMV0 $M0</div><div class='add'>+</div><div class='add'>+##Mount slave</div><div class='add'>+TEST glusterfs -s $H0 --volfile-id $GSV0 $M1</div><div class='add'>+</div><div class='add'>+############################################################</div><div class='add'>+#BASIC GEO-REPLICATION TESTS</div><div class='add'>+############################################################</div><div class='add'>+</div><div class='add'>+#Check Hybrid Crawl</div><div class='add'>+TEST create_data "hybrid"</div><div class='add'>+TEST create_georep_session $master $slave</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 6 check_status_num_rows "Created"</div><div class='add'>+</div><div class='add'>+#Config gluster-command-dir</div><div class='add'>+TEST $GEOREP_CLI $master $slave config gluster-command-dir ${GLUSTER_CMD_DIR}</div><div class='add'>+</div><div class='add'>+#Config gluster-command-dir</div><div class='add'>+TEST $GEOREP_CLI $master $slave config slave-gluster-command-dir ${GLUSTER_CMD_DIR}</div><div class='add'>+</div><div class='add'>+#Enable_metavolume</div><div class='add'>+TEST $GEOREP_CLI $master $slave config use_meta_volume true</div><div class='add'>+</div><div class='add'>+#Set changelog roll-over time to 3 secs</div><div class='add'>+TEST $CLI volume set $GMV0 changelog.rollover-time 3</div><div class='add'>+</div><div class='add'>+#Wait for common secret pem file to be created</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT  0 check_common_secret_file</div><div class='add'>+</div><div class='add'>+#Verify the keys are distributed</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT  0 check_keys_distributed</div><div class='add'>+</div><div class='add'>+#Verify "features.read-only" Option</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 0 check_slave_read_only $GSV0</div><div class='add'>+</div><div class='add'>+#Start_georep</div><div class='add'>+TEST $GEOREP_CLI $master $slave start</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT  2 check_status_num_rows "Active"</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT  4 check_status_num_rows "Passive"</div><div class='add'>+</div><div class='add'>+#data_tests "hybrid"</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 0 regular_file_ok ${slave_mnt}/hybrid_f1</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 0 directory_ok ${slave_mnt}/hybrid_d1</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 0 rename_file_ok ${slave_mnt}/hybrid_f3 ${slave_mnt}/hybrid_f4</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 0 rename_dir_ok ${slave_mnt}/hybrid_d3 ${slave_mnt}/hybrid_d4</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 0 symlink_ok hybrid_f1 ${slave_mnt}/hybrid_sl1</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 0 hardlink_file_ok ${slave_mnt}/hybrid_f1 ${slave_mnt}/hybrid_hl1</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 1 unlink_ok ${slave_mnt}/hybrid_f2</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 1 unlink_ok ${slave_mnt}/hybrid_d2</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 0 data_ok ${slave_mnt}/hybrid_f1 "HelloWorld!"</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 0 chown_file_ok ${slave_mnt}/hybrid_chown_f1</div><div class='add'>+</div><div class='add'>+#Check History Crawl.</div><div class='add'>+TEST $GEOREP_CLI $master $slave stop</div><div class='add'>+TEST create_data "history"</div><div class='add'>+TEST $GEOREP_CLI $master $slave start</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT  2 check_status_num_rows "Active"</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT  4 check_status_num_rows "Passive"</div><div class='add'>+</div><div class='add'>+#data_tests "history"</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 0 regular_file_ok ${slave_mnt}/history_f1</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 0 directory_ok ${slave_mnt}/history_d1</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 0 rename_file_ok ${slave_mnt}/history_f3 ${slave_mnt}/history_f4</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 0 rename_dir_ok ${slave_mnt}/history_d3 ${slave_mnt}/history_d4</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 0 symlink_ok history_f1 ${slave_mnt}/history_sl1</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 0 hardlink_file_ok ${slave_mnt}/history_f1 ${slave_mnt}/history_hl1</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 1 unlink_ok ${slave_mnt}/history_f2</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 1 unlink_ok ${slave_mnt}/history_d2</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 0 data_ok ${slave_mnt}/history_f1 "HelloWorld!"</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 0 chown_file_ok ${slave_mnt}/history_chown_f1</div><div class='add'>+</div><div class='add'>+#Check Changelog Crawl.</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 2 check_status_num_rows "Changelog Crawl"</div><div class='add'>+TEST create_data "changelog"</div><div class='add'>+</div><div class='add'>+# logrotate test</div><div class='add'>+logrotate_file=${master_mnt}/logrotate/lg_test_file</div><div class='add'>+TEST mkdir -p ${master_mnt}/logrotate</div><div class='add'>+logrotate_simulate $logrotate_file 2</div><div class='add'>+logrotate_simulate $logrotate_file 2</div><div class='add'>+logrotate_simulate $logrotate_file 2</div><div class='add'>+logrotate_simulate $logrotate_file 2</div><div class='add'>+</div><div class='add'>+# CREATE + RENAME</div><div class='add'>+create_rename ${master_mnt}/rename_test_file</div><div class='add'>+</div><div class='add'>+# hard-link rename</div><div class='add'>+hardlink_rename ${master_mnt}/hardlink_rename_test_file</div><div class='add'>+</div><div class='add'>+#SYNC CHECK</div><div class='add'>+#data_tests "changelog"</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 0 regular_file_ok ${slave_mnt}/changelog_f1</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 0 directory_ok ${slave_mnt}/changelog_d1</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 0 rename_file_ok ${slave_mnt}/changelog_f3 ${slave_mnt}/changelog_f4</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 0 rename_dir_ok ${slave_mnt}/changelog_d3 ${slave_mnt}/changelog_d4</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 0 symlink_ok changelog_f1 ${slave_mnt}/changelog_sl1</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 0 hardlink_file_ok ${slave_mnt}/changelog_f1 ${slave_mnt}/changelog_hl1</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 1 unlink_ok ${slave_mnt}/changelog_f2</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 1 unlink_ok ${slave_mnt}/changelog_d2</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 0 data_ok ${slave_mnt}/changelog_f1 "HelloWorld!"</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 0 chown_file_ok ${slave_mnt}/changelog_chown_f1</div><div class='add'>+</div><div class='add'>+#logrotate</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 0 directory_ok ${slave_mnt}/logrotate</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT "x0" arequal_checksum ${master_mnt}/logrotate ${slave_mnt}/logrotate</div><div class='add'>+</div><div class='add'>+#CREATE+RENAME</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 0 create_rename_ok ${slave_mnt}/create_rename_test_file</div><div class='add'>+</div><div class='add'>+#hardlink rename</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 0 hardlink_rename_ok ${slave_mnt}/hardlink_rename_test_file</div><div class='add'>+</div><div class='add'>+#Stop Geo-rep</div><div class='add'>+TEST $GEOREP_CLI $master $slave stop</div><div class='add'>+</div><div class='add'>+#Symlink testcase: Rename symlink and create dir with same name</div><div class='add'>+TEST create_symlink_rename_mkdir_data</div><div class='add'>+</div><div class='add'>+#hardlink-rename-unlink usecase. Sonatype Nexus3 Usecase. BUG:1512483</div><div class='add'>+TEST create_hardlink_rename_data</div><div class='add'>+</div><div class='add'>+#rsnapshot usecase</div><div class='add'>+#TEST create_rsnapshot_data</div><div class='add'>+</div><div class='add'>+#Start Geo-rep</div><div class='add'>+TEST $GEOREP_CLI $master $slave start</div><div class='add'>+</div><div class='add'>+#Wait for geo-rep to come up</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT  2 check_status_num_rows "Active"</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT  4 check_status_num_rows "Passive"</div><div class='add'>+</div><div class='add'>+#Check for hardlink rename case. BUG: 1296174</div><div class='add'>+#It should not create src file again on changelog reprocessing</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 0 hardlink_rename_ok ${slave_mnt}/hardlink_rename_test_file</div><div class='add'>+</div><div class='add'>+#Symlink testcase: Rename symlink and create dir with same name</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 0 verify_symlink_rename_mkdir_data ${slave_mnt}/symlink_test1</div><div class='add'>+</div><div class='add'>+#hardlink-rename-unlink usecase. Sonatype Nexus3 Usecase. BUG:1512483</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 0 verify_hardlink_rename_data ${slave_mnt}</div><div class='add'>+</div><div class='add'>+#rsnapshot usecase</div><div class='add'>+#EXPECT_WITHIN $GEO_REP_TIMEOUT 0 verify_rsnapshot_data ${slave_mnt}</div><div class='add'>+</div><div class='add'>+#Test rsync-options set BUG:1629561</div><div class='add'>+TEST gluster volume geo-rep $master $slave config rsync-options "--whole-file"</div><div class='add'>+TEST "echo sampledata &gt; $master_mnt/rsync_option_test_file"</div><div class='add'>+</div><div class='add'>+#rename with existing destination case BUG:1694820</div><div class='add'>+#TEST create_rename_with_existing_destination ${master_mnt}</div><div class='add'>+#verify rename with existing destination case BUG:1694820</div><div class='add'>+#EXPECT_WITHIN $GEO_REP_TIMEOUT 0 verify_rename_with_existing_destination ${slave_mnt}</div><div class='add'>+</div><div class='add'>+#Verify arequal for whole volume</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT "x0" arequal_checksum ${master_mnt} ${slave_mnt}</div><div class='add'>+</div><div class='add'>+#Stop Geo-rep</div><div class='add'>+TEST $GEOREP_CLI $master $slave stop</div><div class='add'>+</div><div class='add'>+#Delete Geo-rep</div><div class='add'>+TEST $GEOREP_CLI $master $slave delete</div><div class='add'>+</div><div class='add'>+#Cleanup are-equal binary</div><div class='add'>+TEST rm $AREQUAL_PATH/arequal-checksum</div><div class='add'>+</div><div class='add'>+#Cleanup authorized keys</div><div class='add'>+sed -i '/^command=.*SSH_ORIGINAL_COMMAND#.*/d' ~/.ssh/authorized_keys</div><div class='add'>+sed -i '/^command=.*gsyncd.*/d' ~/.ssh/authorized_keys</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+#G_TESTDEF_TEST_STATUS_NETBSD7=BAD_TEST,BUG=000000</div><div class='head'>diff --git a/tests/00-geo-rep/georep-basic-tarssh-ec.t b/tests/00-geo-rep/georep-basic-tarssh-ec.t<br/>new file mode 100644<br/>index 00000000000..987bd9391c8<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/00-geo-rep/georep-basic-tarssh-ec.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/00-geo-rep/georep-basic-tarssh-ec.t</a></div><div class='hunk'>@@ -0,0 +1,223 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../include.rc</div><div class='add'>+. $(dirname $0)/../volume.rc</div><div class='add'>+. $(dirname $0)/../geo-rep.rc</div><div class='add'>+. $(dirname $0)/../env.rc</div><div class='add'>+</div><div class='add'>+SCRIPT_TIMEOUT=500</div><div class='add'>+</div><div class='add'>+AREQUAL_PATH=$(dirname $0)/../utils</div><div class='add'>+test "`uname -s`" != "Linux" &amp;&amp; {</div><div class='add'>+    CFLAGS="$CFLAGS -lintl";</div><div class='add'>+}</div><div class='add'>+build_tester $AREQUAL_PATH/arequal-checksum.c $CFLAGS</div><div class='add'>+</div><div class='add'>+### Basic Tests with Distributed Disperse volumes</div><div class='add'>+</div><div class='add'>+##Cleanup and start glusterd</div><div class='add'>+cleanup;</div><div class='add'>+TEST glusterd;</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+##Variables</div><div class='add'>+GEOREP_CLI="$CLI volume geo-replication"</div><div class='add'>+master=$GMV0</div><div class='add'>+SH0="127.0.0.1"</div><div class='add'>+slave=${SH0}::${GSV0}</div><div class='add'>+num_active=2</div><div class='add'>+num_passive=10</div><div class='add'>+master_mnt=$M0</div><div class='add'>+slave_mnt=$M1</div><div class='add'>+</div><div class='add'>+############################################################</div><div class='add'>+#SETUP VOLUMES AND GEO-REPLICATION</div><div class='add'>+############################################################</div><div class='add'>+</div><div class='add'>+##create_and_start_master_volume</div><div class='add'>+TEST $CLI volume create $GMV0 disperse 3 redundancy 1 $H0:$B0/${GMV0}{0..5};</div><div class='add'>+TEST $CLI volume start $GMV0</div><div class='add'>+</div><div class='add'>+##create_and_start_slave_volume</div><div class='add'>+TEST $CLI volume create $GSV0 disperse 3 redundancy 1 $H0:$B0/${GSV0}{0..5};</div><div class='add'>+TEST $CLI volume start $GSV0</div><div class='add'>+</div><div class='add'>+##Create, start and mount meta_volume</div><div class='add'>+TEST $CLI volume create $META_VOL replica 3 $H0:$B0/${META_VOL}{1,2,3};</div><div class='add'>+TEST $CLI volume start $META_VOL</div><div class='add'>+TEST mkdir -p $META_MNT</div><div class='add'>+TEST glusterfs -s $H0 --volfile-id $META_VOL $META_MNT</div><div class='add'>+</div><div class='add'>+##Mount master</div><div class='add'>+TEST glusterfs -s $H0 --volfile-id $GMV0 $M0</div><div class='add'>+</div><div class='add'>+##Mount slave</div><div class='add'>+TEST glusterfs -s $H0 --volfile-id $GSV0 $M1</div><div class='add'>+</div><div class='add'>+############################################################</div><div class='add'>+#BASIC GEO-REPLICATION TESTS</div><div class='add'>+############################################################</div><div class='add'>+</div><div class='add'>+#Check Hybrid Crawl</div><div class='add'>+TEST create_data "hybrid"</div><div class='add'>+TEST create_georep_session $master $slave</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 6 check_status_num_rows "Created"</div><div class='add'>+</div><div class='add'>+#Config gluster-command-dir</div><div class='add'>+TEST $GEOREP_CLI $master $slave config gluster-command-dir ${GLUSTER_CMD_DIR}</div><div class='add'>+</div><div class='add'>+#Config gluster-command-dir</div><div class='add'>+TEST $GEOREP_CLI $master $slave config slave-gluster-command-dir ${GLUSTER_CMD_DIR}</div><div class='add'>+</div><div class='add'>+#Enable_metavolume</div><div class='add'>+TEST $GEOREP_CLI $master $slave config use_meta_volume true</div><div class='add'>+</div><div class='add'>+#Set changelog roll-over time to 3 secs</div><div class='add'>+TEST $CLI volume set $GMV0 changelog.rollover-time 3</div><div class='add'>+</div><div class='add'>+#Config tarssh as sync-engine</div><div class='add'>+TEST $GEOREP_CLI $master $slave config sync-method tarssh</div><div class='add'>+</div><div class='add'>+#Wait for common secret pem file to be created</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT  0 check_common_secret_file</div><div class='add'>+</div><div class='add'>+#Verify the keys are distributed</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT  0 check_keys_distributed</div><div class='add'>+</div><div class='add'>+#Verify "features.read-only" Option</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 0 check_slave_read_only $GSV0</div><div class='add'>+</div><div class='add'>+#Start_georep</div><div class='add'>+TEST $GEOREP_CLI $master $slave start</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT  2 check_status_num_rows "Active"</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT  4 check_status_num_rows "Passive"</div><div class='add'>+</div><div class='add'>+#data_tests "hybrid"</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 0 regular_file_ok ${slave_mnt}/hybrid_f1</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 0 directory_ok ${slave_mnt}/hybrid_d1</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 0 rename_file_ok ${slave_mnt}/hybrid_f3 ${slave_mnt}/hybrid_f4</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 0 rename_dir_ok ${slave_mnt}/hybrid_d3 ${slave_mnt}/hybrid_d4</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 0 symlink_ok hybrid_f1 ${slave_mnt}/hybrid_sl1</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 0 hardlink_file_ok ${slave_mnt}/hybrid_f1 ${slave_mnt}/hybrid_hl1</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 1 unlink_ok ${slave_mnt}/hybrid_f2</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 1 unlink_ok ${slave_mnt}/hybrid_d2</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 0 data_ok ${slave_mnt}/hybrid_f1 "HelloWorld!"</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 0 chown_file_ok ${slave_mnt}/hybrid_chown_f1</div><div class='add'>+</div><div class='add'>+#Check History Crawl.</div><div class='add'>+TEST $GEOREP_CLI $master $slave stop</div><div class='add'>+TEST create_data "history"</div><div class='add'>+TEST $GEOREP_CLI $master $slave start</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT  2 check_status_num_rows "Active"</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT  4 check_status_num_rows "Passive"</div><div class='add'>+</div><div class='add'>+#data_tests "history"</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 0 regular_file_ok ${slave_mnt}/history_f1</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 0 directory_ok ${slave_mnt}/history_d1</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 0 rename_file_ok ${slave_mnt}/history_f3 ${slave_mnt}/history_f4</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 0 rename_dir_ok ${slave_mnt}/history_d3 ${slave_mnt}/history_d4</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 0 symlink_ok history_f1 ${slave_mnt}/history_sl1</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 0 hardlink_file_ok ${slave_mnt}/history_f1 ${slave_mnt}/history_hl1</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 1 unlink_ok ${slave_mnt}/history_f2</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 1 unlink_ok ${slave_mnt}/history_d2</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 0 data_ok ${slave_mnt}/history_f1 "HelloWorld!"</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 0 chown_file_ok ${slave_mnt}/history_chown_f1</div><div class='add'>+</div><div class='add'>+#Check Changelog Crawl.</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 2 check_status_num_rows "Changelog Crawl"</div><div class='add'>+TEST create_data "changelog"</div><div class='add'>+</div><div class='add'>+# logrotate test</div><div class='add'>+logrotate_file=${master_mnt}/logrotate/lg_test_file</div><div class='add'>+TEST mkdir -p ${master_mnt}/logrotate</div><div class='add'>+logrotate_simulate $logrotate_file 2</div><div class='add'>+logrotate_simulate $logrotate_file 2</div><div class='add'>+logrotate_simulate $logrotate_file 2</div><div class='add'>+logrotate_simulate $logrotate_file 2</div><div class='add'>+</div><div class='add'>+# CREATE + RENAME</div><div class='add'>+create_rename ${master_mnt}/rename_test_file</div><div class='add'>+</div><div class='add'>+# hard-link rename</div><div class='add'>+hardlink_rename ${master_mnt}/hardlink_rename_test_file</div><div class='add'>+</div><div class='add'>+#SYNC CHECK</div><div class='add'>+#data_tests "changelog"</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 0 regular_file_ok ${slave_mnt}/changelog_f1</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 0 directory_ok ${slave_mnt}/changelog_d1</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 0 rename_file_ok ${slave_mnt}/changelog_f3 ${slave_mnt}/changelog_f4</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 0 rename_dir_ok ${slave_mnt}/changelog_d3 ${slave_mnt}/changelog_d4</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 0 symlink_ok changelog_f1 ${slave_mnt}/changelog_sl1</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 0 hardlink_file_ok ${slave_mnt}/changelog_f1 ${slave_mnt}/changelog_hl1</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 1 unlink_ok ${slave_mnt}/changelog_f2</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 1 unlink_ok ${slave_mnt}/changelog_d2</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 0 data_ok ${slave_mnt}/changelog_f1 "HelloWorld!"</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 0 chown_file_ok ${slave_mnt}/changelog_chown_f1</div><div class='add'>+</div><div class='add'>+#logrotate</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 0 directory_ok ${slave_mnt}/logrotate</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT "x0" arequal_checksum ${master_mnt}/logrotate ${slave_mnt}/logrotate</div><div class='add'>+</div><div class='add'>+#CREATE+RENAME</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 0 create_rename_ok ${slave_mnt}/create_rename_test_file</div><div class='add'>+</div><div class='add'>+#hardlink rename</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 0 hardlink_rename_ok ${slave_mnt}/hardlink_rename_test_file</div><div class='add'>+</div><div class='add'>+#Stop Geo-rep</div><div class='add'>+TEST $GEOREP_CLI $master $slave stop</div><div class='add'>+</div><div class='add'>+#Symlink testcase: Rename symlink and create dir with same name</div><div class='add'>+TEST create_symlink_rename_mkdir_data</div><div class='add'>+</div><div class='add'>+#hardlink-rename-unlink usecase. Sonatype Nexus3 Usecase. BUG:1512483</div><div class='add'>+TEST create_hardlink_rename_data</div><div class='add'>+</div><div class='add'>+#rsnapshot usecase</div><div class='add'>+#TEST create_rsnapshot_data</div><div class='add'>+</div><div class='add'>+#Start Geo-rep</div><div class='add'>+TEST $GEOREP_CLI $master $slave start</div><div class='add'>+</div><div class='add'>+#Wait for geo-rep to come up</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT  2 check_status_num_rows "Active"</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT  4 check_status_num_rows "Passive"</div><div class='add'>+</div><div class='add'>+#Check for hardlink rename case. BUG: 1296174</div><div class='add'>+#It should not create src file again on changelog reprocessing</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 0 hardlink_rename_ok ${slave_mnt}/hardlink_rename_test_file</div><div class='add'>+</div><div class='add'>+#Symlink testcase: Rename symlink and create dir with same name</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 0 verify_symlink_rename_mkdir_data ${slave_mnt}/symlink_test1</div><div class='add'>+</div><div class='add'>+#hardlink-rename-unlink usecase. Sonatype Nexus3 Usecase. BUG:1512483</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 0 verify_hardlink_rename_data ${slave_mnt}</div><div class='add'>+</div><div class='add'>+#rsnapshot usecase</div><div class='add'>+#EXPECT_WITHIN $GEO_REP_TIMEOUT 0 verify_rsnapshot_data ${slave_mnt}</div><div class='add'>+</div><div class='add'>+#rename with existing destination case BUG:1694820</div><div class='add'>+#TEST create_rename_with_existing_destination ${master_mnt}</div><div class='add'>+#verify rename with existing destination case BUG:1694820</div><div class='add'>+#EXPECT_WITHIN $GEO_REP_TIMEOUT 0 verify_rename_with_existing_destination ${slave_mnt}</div><div class='add'>+</div><div class='add'>+#Verify arequal for whole volume</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT "x0" arequal_checksum ${master_mnt} ${slave_mnt}</div><div class='add'>+</div><div class='add'>+#Stop Geo-rep</div><div class='add'>+TEST $GEOREP_CLI $master $slave stop</div><div class='add'>+</div><div class='add'>+#Delete Geo-rep</div><div class='add'>+TEST $GEOREP_CLI $master $slave delete</div><div class='add'>+</div><div class='add'>+#Cleanup are-equal binary</div><div class='add'>+TEST rm $AREQUAL_PATH/arequal-checksum</div><div class='add'>+</div><div class='add'>+#Cleanup authorized keys</div><div class='add'>+sed -i '/^command=.*SSH_ORIGINAL_COMMAND#.*/d' ~/.ssh/authorized_keys</div><div class='add'>+sed -i '/^command=.*gsyncd.*/d' ~/.ssh/authorized_keys</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+#G_TESTDEF_TEST_STATUS_NETBSD7=BAD_TEST,BUG=000000</div><div class='head'>diff --git a/tests/00-geo-rep/georep-config-upgrade.t b/tests/00-geo-rep/georep-config-upgrade.t<br/>new file mode 100644<br/>index 00000000000..557461cd9c4<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/00-geo-rep/georep-config-upgrade.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/00-geo-rep/georep-config-upgrade.t</a></div><div class='hunk'>@@ -0,0 +1,132 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../include.rc</div><div class='add'>+. $(dirname $0)/../volume.rc</div><div class='add'>+. $(dirname $0)/../geo-rep.rc</div><div class='add'>+. $(dirname $0)/../env.rc</div><div class='add'>+</div><div class='add'>+SCRIPT_TIMEOUT=300</div><div class='add'>+OLD_CONFIG_PATH=$(dirname $0)/gsyncd.conf.old</div><div class='add'>+WORKING_DIR=/var/lib/glusterd/geo-replication/master_127.0.0.1_slave</div><div class='add'>+</div><div class='add'>+##Cleanup and start glusterd</div><div class='add'>+cleanup;</div><div class='add'>+TEST glusterd;</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+</div><div class='add'>+##Variables</div><div class='add'>+GEOREP_CLI="$CLI volume geo-replication"</div><div class='add'>+master=$GMV0</div><div class='add'>+SH0="127.0.0.1"</div><div class='add'>+slave=${SH0}::${GSV0}</div><div class='add'>+num_active=2</div><div class='add'>+num_passive=2</div><div class='add'>+master_mnt=$M0</div><div class='add'>+slave_mnt=$M1</div><div class='add'>+</div><div class='add'>+############################################################</div><div class='add'>+#SETUP VOLUMES AND GEO-REPLICATION</div><div class='add'>+############################################################</div><div class='add'>+</div><div class='add'>+##create_and_start_master_volume</div><div class='add'>+TEST $CLI volume create $GMV0 replica 2 $H0:$B0/${GMV0}{1,2,3,4};</div><div class='add'>+TEST $CLI volume start $GMV0</div><div class='add'>+</div><div class='add'>+##create_and_start_slave_volume</div><div class='add'>+TEST $CLI volume create $GSV0 replica 2 $H0:$B0/${GSV0}{1,2,3,4};</div><div class='add'>+TEST $CLI volume start $GSV0</div><div class='add'>+</div><div class='add'>+##Create, start and mount meta_volume</div><div class='add'>+TEST $CLI volume create $META_VOL replica 3 $H0:$B0/${META_VOL}{1,2,3};</div><div class='add'>+TEST $CLI volume start $META_VOL</div><div class='add'>+TEST mkdir -p $META_MNT</div><div class='add'>+TEST glusterfs -s $H0 --volfile-id $META_VOL $META_MNT</div><div class='add'>+</div><div class='add'>+##Mount master</div><div class='add'>+TEST glusterfs -s $H0 --volfile-id $GMV0 $M0</div><div class='add'>+</div><div class='add'>+##Mount slave</div><div class='add'>+TEST glusterfs -s $H0 --volfile-id $GSV0 $M1</div><div class='add'>+</div><div class='add'>+############################################################</div><div class='add'>+#BASIC GEO-REPLICATION TESTS</div><div class='add'>+############################################################</div><div class='add'>+</div><div class='add'>+#Create geo-rep session</div><div class='add'>+TEST create_georep_session $master $slave</div><div class='add'>+</div><div class='add'>+#Config gluster-command-dir</div><div class='add'>+TEST $GEOREP_CLI $master $slave config gluster-command-dir ${GLUSTER_CMD_DIR}</div><div class='add'>+</div><div class='add'>+#Config gluster-command-dir</div><div class='add'>+TEST $GEOREP_CLI $master $slave config slave-gluster-command-dir ${GLUSTER_CMD_DIR}</div><div class='add'>+</div><div class='add'>+#Enable_metavolume</div><div class='add'>+TEST $GEOREP_CLI $master $slave config use_meta_volume true</div><div class='add'>+</div><div class='add'>+#Wait for common secret pem file to be created</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT  0 check_common_secret_file</div><div class='add'>+</div><div class='add'>+#Verify the keys are distributed</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT  0 check_keys_distributed</div><div class='add'>+</div><div class='add'>+#Start_georep</div><div class='add'>+TEST $GEOREP_CLI $master $slave start</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT  2 check_status_num_rows "Active"</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT  2 check_status_num_rows "Passive"</div><div class='add'>+</div><div class='add'>+TEST $GEOREP_CLI $master $slave config sync-method tarssh</div><div class='add'>+</div><div class='add'>+#Stop Geo-rep</div><div class='add'>+TEST $GEOREP_CLI $master $slave stop</div><div class='add'>+</div><div class='add'>+#Copy old config file</div><div class='add'>+mv -f $WORKING_DIR/gsyncd.conf $WORKING_DIR/gsyncd.conf.org</div><div class='add'>+cp -p $OLD_CONFIG_PATH $WORKING_DIR/gsyncd.conf</div><div class='add'>+</div><div class='add'>+#Check if config get all updates config_file</div><div class='add'>+TEST ! grep "sync-method" $WORKING_DIR/gsyncd.conf</div><div class='add'>+TEST $GEOREP_CLI $master $slave config</div><div class='add'>+TEST grep "sync-method" $WORKING_DIR/gsyncd.conf</div><div class='add'>+</div><div class='add'>+#Check if config get updates config_file</div><div class='add'>+rm -f $WORKING_DIR/gsyncd.conf</div><div class='add'>+cp -p $OLD_CONFIG_PATH $WORKING_DIR/gsyncd.conf</div><div class='add'>+TEST ! grep "sync-method" $WORKING_DIR/gsyncd.conf</div><div class='add'>+TEST $GEOREP_CLI $master $slave config sync-method</div><div class='add'>+TEST grep "sync-method" $WORKING_DIR/gsyncd.conf</div><div class='add'>+</div><div class='add'>+#Check if config set updates config_file</div><div class='add'>+rm -f $WORKING_DIR/gsyncd.conf</div><div class='add'>+cp -p $OLD_CONFIG_PATH $WORKING_DIR/gsyncd.conf</div><div class='add'>+TEST ! grep "sync-method" $WORKING_DIR/gsyncd.conf</div><div class='add'>+TEST $GEOREP_CLI $master $slave config sync-xattrs false</div><div class='add'>+TEST grep "sync-method" $WORKING_DIR/gsyncd.conf</div><div class='add'>+</div><div class='add'>+#Check if config reset updates config_file</div><div class='add'>+rm -f $WORKING_DIR/gsyncd.conf</div><div class='add'>+cp -p $OLD_CONFIG_PATH $WORKING_DIR/gsyncd.conf</div><div class='add'>+TEST ! grep "sync-method" $WORKING_DIR/gsyncd.conf</div><div class='add'>+TEST $GEOREP_CLI $master $slave config \!sync-xattrs</div><div class='add'>+TEST grep "sync-method" $WORKING_DIR/gsyncd.conf</div><div class='add'>+</div><div class='add'>+#Check if geo-rep start updates config_file</div><div class='add'>+rm -f $WORKING_DIR/gsyncd.conf</div><div class='add'>+cp -p $OLD_CONFIG_PATH $WORKING_DIR/gsyncd.conf</div><div class='add'>+TEST ! grep "sync-method" $WORKING_DIR/gsyncd.conf</div><div class='add'>+TEST $GEOREP_CLI $master $slave start</div><div class='add'>+TEST grep "sync-method" $WORKING_DIR/gsyncd.conf</div><div class='add'>+</div><div class='add'>+#Stop geo-rep</div><div class='add'>+TEST $GEOREP_CLI $master $slave stop</div><div class='add'>+</div><div class='add'>+#Delete Geo-rep</div><div class='add'>+TEST $GEOREP_CLI $master $slave delete</div><div class='add'>+</div><div class='add'>+#Cleanup authorized keys</div><div class='add'>+sed -i '/^command=.*SSH_ORIGINAL_COMMAND#.*/d' ~/.ssh/authorized_keys</div><div class='add'>+sed -i '/^command=.*gsyncd.*/d' ~/.ssh/authorized_keys</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+#G_TESTDEF_TEST_STATUS_NETBSD7=BAD_TEST,BUG=000000</div><div class='head'>diff --git a/tests/00-geo-rep/georep-stderr-hang.t b/tests/00-geo-rep/georep-stderr-hang.t<br/>new file mode 100644<br/>index 00000000000..496f0e6577d<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/00-geo-rep/georep-stderr-hang.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/00-geo-rep/georep-stderr-hang.t</a></div><div class='hunk'>@@ -0,0 +1,128 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../include.rc</div><div class='add'>+. $(dirname $0)/../volume.rc</div><div class='add'>+. $(dirname $0)/../geo-rep.rc</div><div class='add'>+. $(dirname $0)/../env.rc</div><div class='add'>+</div><div class='add'>+SCRIPT_TIMEOUT=500</div><div class='add'>+</div><div class='add'>+AREQUAL_PATH=$(dirname $0)/../utils</div><div class='add'>+test "`uname -s`" != "Linux" &amp;&amp; {</div><div class='add'>+    CFLAGS="$CFLAGS -lintl";</div><div class='add'>+}</div><div class='add'>+build_tester $AREQUAL_PATH/arequal-checksum.c $CFLAGS</div><div class='add'>+</div><div class='add'>+### Basic Tests with Distribute Replicate volumes</div><div class='add'>+</div><div class='add'>+##Cleanup and start glusterd</div><div class='add'>+cleanup;</div><div class='add'>+TEST glusterd;</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+##Variables</div><div class='add'>+GEOREP_CLI="$CLI volume geo-replication"</div><div class='add'>+master=$GMV0</div><div class='add'>+SH0="127.0.0.1"</div><div class='add'>+slave=${SH0}::${GSV0}</div><div class='add'>+num_active=2</div><div class='add'>+num_passive=2</div><div class='add'>+master_mnt=$M0</div><div class='add'>+slave_mnt=$M1</div><div class='add'>+</div><div class='add'>+############################################################</div><div class='add'>+#SETUP VOLUMES AND GEO-REPLICATION</div><div class='add'>+############################################################</div><div class='add'>+</div><div class='add'>+##create_and_start_master_volume</div><div class='add'>+TEST $CLI volume create $GMV0 $H0:$B0/${GMV0}1;</div><div class='add'>+TEST $CLI volume start $GMV0</div><div class='add'>+</div><div class='add'>+##create_and_start_slave_volume</div><div class='add'>+TEST $CLI volume create $GSV0 $H0:$B0/${GSV0}1;</div><div class='add'>+TEST $CLI volume start $GSV0</div><div class='add'>+TEST $CLI volume set $GSV0 performance.stat-prefetch off</div><div class='add'>+TEST $CLI volume set $GSV0 performance.quick-read off</div><div class='add'>+TEST $CLI volume set $GSV0 performance.readdir-ahead off</div><div class='add'>+TEST $CLI volume set $GSV0 performance.read-ahead off</div><div class='add'>+</div><div class='add'>+##Mount master</div><div class='add'>+TEST glusterfs -s $H0 --volfile-id $GMV0 $M0</div><div class='add'>+</div><div class='add'>+##Mount slave</div><div class='add'>+TEST glusterfs -s $H0 --volfile-id $GSV0 $M1</div><div class='add'>+</div><div class='add'>+############################################################</div><div class='add'>+#BASIC GEO-REPLICATION TESTS</div><div class='add'>+############################################################</div><div class='add'>+</div><div class='add'>+TEST create_georep_session $master $slave</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT 1 check_status_num_rows "Created"</div><div class='add'>+</div><div class='add'>+#Config gluster-command-dir</div><div class='add'>+TEST $GEOREP_CLI $master $slave config gluster-command-dir ${GLUSTER_CMD_DIR}</div><div class='add'>+</div><div class='add'>+#Config gluster-command-dir</div><div class='add'>+TEST $GEOREP_CLI $master $slave config slave-gluster-command-dir ${GLUSTER_CMD_DIR}</div><div class='add'>+</div><div class='add'>+#Set changelog roll-over time to 45 secs</div><div class='add'>+TEST $CLI volume set $GMV0 changelog.rollover-time 45</div><div class='add'>+</div><div class='add'>+#Wait for common secret pem file to be created</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT  0 check_common_secret_file</div><div class='add'>+</div><div class='add'>+#Verify the keys are distributed</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT  0 check_keys_distributed</div><div class='add'>+</div><div class='add'>+#Set sync-jobs to 1</div><div class='add'>+TEST $GEOREP_CLI $master $slave config sync-jobs 1</div><div class='add'>+</div><div class='add'>+#Start_georep</div><div class='add'>+TEST $GEOREP_CLI $master $slave start</div><div class='add'>+</div><div class='add'>+touch $M0</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT  1 check_status_num_rows "Active"</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT  1 check_status_num_rows "Changelog Crawl"</div><div class='add'>+</div><div class='add'>+#Check History Crawl.</div><div class='add'>+TEST $GEOREP_CLI $master $slave stop</div><div class='add'>+TEST create_data_hang "rsync_hang"</div><div class='add'>+TEST create_data "history_rsync"</div><div class='add'>+TEST $GEOREP_CLI $master $slave start</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT  1 check_status_num_rows "Active"</div><div class='add'>+</div><div class='add'>+#Verify arequal for whole volume</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT "x0" arequal_checksum ${master_mnt} ${slave_mnt}</div><div class='add'>+</div><div class='add'>+#Stop Geo-rep</div><div class='add'>+TEST $GEOREP_CLI $master $slave stop</div><div class='add'>+</div><div class='add'>+#Config tarssh as sync-engine</div><div class='add'>+TEST $GEOREP_CLI $master $slave config sync-method tarssh</div><div class='add'>+</div><div class='add'>+#Create tarssh hang data</div><div class='add'>+TEST create_data_hang "tarssh_hang"</div><div class='add'>+TEST create_data "history_tar"</div><div class='add'>+</div><div class='add'>+TEST $GEOREP_CLI $master $slave start</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT  1 check_status_num_rows "Active"</div><div class='add'>+</div><div class='add'>+#Verify arequal for whole volume</div><div class='add'>+EXPECT_WITHIN $GEO_REP_TIMEOUT "x0" arequal_checksum ${master_mnt} ${slave_mnt}</div><div class='add'>+</div><div class='add'>+#Stop Geo-rep</div><div class='add'>+TEST $GEOREP_CLI $master $slave stop</div><div class='add'>+</div><div class='add'>+#Delete Geo-rep</div><div class='add'>+TEST $GEOREP_CLI $master $slave delete</div><div class='add'>+</div><div class='add'>+#Cleanup are-equal binary</div><div class='add'>+TEST rm $AREQUAL_PATH/arequal-checksum</div><div class='add'>+</div><div class='add'>+#Cleanup authorized keys</div><div class='add'>+sed -i '/^command=.*SSH_ORIGINAL_COMMAND#.*/d' ~/.ssh/authorized_keys</div><div class='add'>+sed -i '/^command=.*gsyncd.*/d' ~/.ssh/authorized_keys</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+#G_TESTDEF_TEST_STATUS_NETBSD7=BAD_TEST,BUG=000000</div><div class='head'>diff --git a/tests/00-geo-rep/georep-upgrade.t b/tests/00-geo-rep/georep-upgrade.t<br/>new file mode 100644<br/>index 00000000000..7523068ed50<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/00-geo-rep/georep-upgrade.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/00-geo-rep/georep-upgrade.t</a></div><div class='hunk'>@@ -0,0 +1,79 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../include.rc</div><div class='add'>+</div><div class='add'>+SCRIPT_TIMEOUT=500</div><div class='add'>+</div><div class='add'>+###############################################################################################</div><div class='add'>+#Before upgrade</div><div class='add'>+###############################################################################################</div><div class='add'>+brick=/bricks/brick1</div><div class='add'>+epoch1=$(date '+%s')</div><div class='add'>+sleep 1</div><div class='add'>+epoch2=$(date '+%s')</div><div class='add'>+mkdir -p /bricks/brick1/.glusterfs/changelogs/htime</div><div class='add'>+mkdir -p /bricks/brick1/.glusterfs/changelogs</div><div class='add'>+</div><div class='add'>+#multiple htime files(changelog enable/disable scenario)</div><div class='add'>+TEST touch /bricks/brick1/.glusterfs/changelogs/htime/HTIME.$epoch1</div><div class='add'>+TEST touch /bricks/brick1/.glusterfs/changelogs/htime/HTIME.$epoch2</div><div class='add'>+</div><div class='add'>+#changelog files</div><div class='add'>+TEST touch /bricks/brick1/.glusterfs/changelogs/CHANGELOG.$epoch1</div><div class='add'>+TEST touch /bricks/brick1/.glusterfs/changelogs/CHANGELOG.$epoch2</div><div class='add'>+</div><div class='add'>+htime_file1=/bricks/brick1/.glusterfs/changelogs/htime/HTIME.$epoch1</div><div class='add'>+htime_file2=/bricks/brick1/.glusterfs/changelogs/htime/HTIME.$epoch2</div><div class='add'>+</div><div class='add'>+#data inside htime files before upgrade</div><div class='add'>+data1=/bricks/brick1/.glusterfs/changelogs/CHANGELOG.$epoch1</div><div class='add'>+data2=/bricks/brick1/.glusterfs/changelogs/CHANGELOG.$epoch2</div><div class='add'>+</div><div class='add'>+#data inside htime files after upgrade</div><div class='add'>+updated_data1=/bricks/brick1/.glusterfs/changelogs/`echo $(date '+%Y/%m/%d')`/CHANGELOG.$epoch1</div><div class='add'>+updated_data2=/bricks/brick1/.glusterfs/changelogs/`echo $(date '+%Y/%m/%d')`/CHANGELOG.$epoch2</div><div class='add'>+</div><div class='add'>+echo -n $data1&gt;$htime_file1</div><div class='add'>+echo -n $data2&gt;$htime_file2</div><div class='add'>+</div><div class='add'>+echo "Before upgrade:"</div><div class='add'>+EXPECT '1' echo $(grep $data1 $htime_file1 | wc -l)</div><div class='add'>+EXPECT '1' echo $(grep $data2 $htime_file2 | wc -l)</div><div class='add'>+</div><div class='add'>+EXPECT '1' echo $(ls /bricks/brick1/.glusterfs/changelogs/CHANGELOG.$epoch1 | wc -l)</div><div class='add'>+EXPECT '1' echo $(ls /bricks/brick1/.glusterfs/changelogs/htime/HTIME.$epoch1 | wc -l)</div><div class='add'>+EXPECT '1' echo $(ls /bricks/brick1/.glusterfs/changelogs/CHANGELOG.$epoch2 | wc -l)</div><div class='add'>+EXPECT '1' echo $(ls /bricks/brick1/.glusterfs/changelogs/htime/HTIME.$epoch2 | wc -l)</div><div class='add'>+###############################################################################################</div><div class='add'>+#Upgrade</div><div class='add'>+###############################################################################################</div><div class='add'>+### This needed to be fixed as this very vague finding a file with name in '/'</div><div class='add'>+### multiple file with same name can exist</div><div class='add'>+### for temp fix picking only 1st result</div><div class='add'>+TEST upgrade_script=$(find / -type f -name glusterfs-georep-upgrade.py -print | head -n 1)</div><div class='add'>+TEST python3 $upgrade_script $brick</div><div class='add'>+</div><div class='add'>+###############################################################################################</div><div class='add'>+#After upgrade</div><div class='add'>+###############################################################################################</div><div class='add'>+echo "After upgrade:"</div><div class='add'>+EXPECT '1' echo $(grep $updated_data1 $htime_file1 | wc -l)</div><div class='add'>+EXPECT '1' echo $(grep $updated_data2 $htime_file2 | wc -l)</div><div class='add'>+</div><div class='add'>+#Check directory structure inside changelogs</div><div class='add'>+TEST ! ls /bricks/brick1/.glusterfs/changelogs/CHANGELOG.$epoch1</div><div class='add'>+EXPECT '1' echo $(ls /bricks/brick1/.glusterfs/changelogs/htime/HTIME.$epoch1 | wc -l)</div><div class='add'>+EXPECT '1' echo $(ls /bricks/brick1/.glusterfs/changelogs/htime/HTIME.$epoch1.bak | wc -l)</div><div class='add'>+EXPECT '1' echo $(ls /bricks/brick1/.glusterfs/changelogs/`echo $(date '+%Y')` | wc -l)</div><div class='add'>+EXPECT '1' echo $(ls /bricks/brick1/.glusterfs/changelogs/`echo $(date '+%Y/%m')` | wc -l)</div><div class='add'>+EXPECT '2' echo $(ls /bricks/brick1/.glusterfs/changelogs/`echo $(date '+%Y/%m/%d')` | wc -l)</div><div class='add'>+EXPECT '1' echo $(ls /bricks/brick1/.glusterfs/changelogs/`echo $(date '+%Y/%m/%d')`/CHANGELOG.$epoch1 | wc -l)</div><div class='add'>+</div><div class='add'>+TEST ! ls /bricks/brick1/.glusterfs/changelogs/CHANGELOG.$epoch2</div><div class='add'>+EXPECT '1' echo $(ls /bricks/brick1/.glusterfs/changelogs/htime/HTIME.$epoch2 | wc -l)</div><div class='add'>+EXPECT '1' echo $(ls /bricks/brick1/.glusterfs/changelogs/htime/HTIME.$epoch2.bak | wc -l)</div><div class='add'>+EXPECT '1' echo $(ls /bricks/brick1/.glusterfs/changelogs/`echo $(date '+%Y')` | wc -l)</div><div class='add'>+EXPECT '1' echo $(ls /bricks/brick1/.glusterfs/changelogs/`echo $(date '+%Y/%m')`| wc -l)</div><div class='add'>+EXPECT '1' echo $(ls /bricks/brick1/.glusterfs/changelogs/`echo $(date '+%Y/%m/%d')`/CHANGELOG.$epoch2 | wc -l)</div><div class='add'>+</div><div class='add'>+TEST rm -rf /bricks</div><div class='head'>diff --git a/tests/00-geo-rep/gsyncd.conf.old b/tests/00-geo-rep/gsyncd.conf.old<br/>new file mode 100644<br/>index 00000000000..519acaf8f3e<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/00-geo-rep/gsyncd.conf.old?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/00-geo-rep/gsyncd.conf.old</a></div><div class='hunk'>@@ -0,0 +1,47 @@</div><div class='add'>+[__meta__]</div><div class='add'>+version = 2.0</div><div class='add'>+</div><div class='add'>+[peersrx . .]</div><div class='add'>+remote_gsyncd = /usr/local/libexec/glusterfs/gsyncd</div><div class='add'>+georep_session_working_dir = /var/lib/glusterd/geo-replication/${mastervol}_${remotehost}_${slavevol}/</div><div class='add'>+ssh_command_tar = ssh -oPasswordAuthentication=no -oStrictHostKeyChecking=no -i /var/lib/glusterd/geo-replication/tar_ssh.pem</div><div class='add'>+changelog_log_file = /var/log/glusterfs/geo-replication/${mastervol}/${eSlave}${local_id}-changes.log</div><div class='add'>+working_dir = /var/lib/misc/glusterfsd/${mastervol}/${eSlave}</div><div class='add'>+ignore_deletes = false</div><div class='add'>+pid_file = /var/lib/glusterd/geo-replication/${mastervol}_${remotehost}_${slavevol}/monitor.pid</div><div class='add'>+state_file = /var/lib/glusterd/geo-replication/${mastervol}_${remotehost}_${slavevol}/monitor.status</div><div class='add'>+gluster_command_dir = /usr/local/sbin/</div><div class='add'>+gluster_params = aux-gfid-mount acl</div><div class='add'>+ssh_command = ssh -oPasswordAuthentication=no -oStrictHostKeyChecking=no -i /var/lib/glusterd/geo-replication/secret.pem</div><div class='add'>+state_detail_file = /var/lib/glusterd/geo-replication/${mastervol}_${remotehost}_${slavevol}/${eSlave}-detail.status</div><div class='add'>+state_socket_unencoded = /var/lib/glusterd/geo-replication/${mastervol}_${remotehost}_${slavevol}/${eSlave}.socket</div><div class='add'>+socketdir = /var/run/gluster</div><div class='add'>+log_file = /var/log/glusterfs/geo-replication/${mastervol}/${eSlave}.log</div><div class='add'>+gluster_log_file = /var/log/glusterfs/geo-replication/${mastervol}/${eSlave}${local_id}.gluster.log</div><div class='add'>+special_sync_mode = partial</div><div class='add'>+change_detector = changelog</div><div class='add'>+pid-file = /var/lib/glusterd/geo-replication/${mastervol}_${remotehost}_${slavevol}/monitor.pid</div><div class='add'>+state-file = /var/lib/glusterd/geo-replication/${mastervol}_${remotehost}_${slavevol}/monitor.status</div><div class='add'>+</div><div class='add'>+[__section_order__]</div><div class='add'>+peersrx . . = 0</div><div class='add'>+peersrx . %5essh%3a = 2</div><div class='add'>+peersrx . = 3</div><div class='add'>+peers master slave = 4</div><div class='add'>+</div><div class='add'>+[peersrx . %5Essh%3A]</div><div class='add'>+remote_gsyncd = /nonexistent/gsyncd</div><div class='add'>+</div><div class='add'>+[peersrx .]</div><div class='add'>+gluster_command_dir = /usr/local/sbin/</div><div class='add'>+gluster_params = aux-gfid-mount acl</div><div class='add'>+log_file = /var/log/glusterfs/geo-replication-slaves/${session_owner}:${local_node}${local_id}.${slavevol}.log</div><div class='add'>+log_file_mbr = /var/log/glusterfs/geo-replication-slaves/mbr/${session_owner}:${local_node}${local_id}.${slavevol}.log</div><div class='add'>+gluster_log_file = /var/log/glusterfs/geo-replication-slaves/${session_owner}:${local_node}${local_id}.${slavevol}.gluster.log</div><div class='add'>+</div><div class='add'>+[peers master slave]</div><div class='add'>+session_owner = 0732cbd1-3ec5-4920-ab0d-aa5a896d5214</div><div class='add'>+master.stime_xattr_name = trusted.glusterfs.0732cbd1-3ec5-4920-ab0d-aa5a896d5214.07a9005c-ace4-4f67-b3c0-73938fb236c4.stime</div><div class='add'>+volume_id = 0732cbd1-3ec5-4920-ab0d-aa5a896d5214</div><div class='add'>+use_tarssh = true</div><div class='add'>+</div><div class='head'>diff --git a/tests/000-flaky/basic_afr_split-brain-favorite-child-policy.t b/tests/000-flaky/basic_afr_split-brain-favorite-child-policy.t<br/>new file mode 100644<br/>index 00000000000..77d82a4996f<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/000-flaky/basic_afr_split-brain-favorite-child-policy.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/000-flaky/basic_afr_split-brain-favorite-child-policy.t</a></div><div class='hunk'>@@ -0,0 +1,203 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+#Test the split-brain resolution CLI commands.</div><div class='add'>+. $(dirname $0)/../include.rc</div><div class='add'>+. $(dirname $0)/../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+</div><div class='add'>+#Create replica 2 volume</div><div class='add'>+TEST $CLI volume create $V0 replica 2 $H0:$B0/${V0}{0,1}</div><div class='add'>+TEST $CLI volume set $V0 performance.write-behind off</div><div class='add'>+TEST $CLI volume set $V0 cluster.self-heal-daemon off</div><div class='add'>+TEST $CLI volume set $V0 cluster.entry-self-heal off</div><div class='add'>+TEST $CLI volume set $V0 cluster.data-self-heal off</div><div class='add'>+TEST $CLI volume set $V0 cluster.metadata-self-heal off</div><div class='add'>+TEST $CLI volume set $V0 cluster.heal-timeout 5</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+TEST $GFS --volfile-id=/$V0 --volfile-server=$H0 $M0</div><div class='add'>+TEST touch $M0/file</div><div class='add'>+</div><div class='add'>+############ Healing using favorite-child-policy = ctime #################</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}0</div><div class='add'>+TEST dd if=/dev/urandom of=$M0/file bs=1024 count=1024</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status $V0 $H0 $B0/${V0}0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 0</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}1</div><div class='add'>+TEST dd if=/dev/urandom of=$M0/file bs=1024 count=1024</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status $V0 $H0 $B0/${V0}1</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 1</div><div class='add'>+TEST $CLI volume set $V0 cluster.self-heal-daemon on</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "Y" glustershd_up_status</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 1</div><div class='add'>+TEST $CLI volume heal $V0</div><div class='add'>+</div><div class='add'>+#file still in split-brain</div><div class='add'>+cat $M0/file &gt; /dev/null</div><div class='add'>+EXPECT "1" echo $?</div><div class='add'>+</div><div class='add'>+# Umount to prevent further FOPS on the file, then find the brick with latest ctime.</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+ctime1=`stat -c "%.Z"  $B0/${V0}0/file`</div><div class='add'>+ctime2=`stat -c "%.Z"  $B0/${V0}1/file`</div><div class='add'>+if (( $(echo "$ctime1 &gt; $ctime2" | bc -l) )); then</div><div class='add'>+        LATEST_CTIME_MD5=$(md5sum $B0/${V0}0/file | cut -d\  -f1)</div><div class='add'>+else</div><div class='add'>+        LATEST_CTIME_MD5=$(md5sum $B0/${V0}1/file | cut -d\  -f1)</div><div class='add'>+fi</div><div class='add'>+TEST $CLI volume set $V0 cluster.favorite-child-policy ctime</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "Y" glustershd_up_status</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 1</div><div class='add'>+TEST $CLI volume heal $V0</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "^0$" get_pending_heal_count $V0</div><div class='add'>+B0_MD5=$(md5sum $B0/${V0}0/file | cut -d\  -f1)</div><div class='add'>+B1_MD5=$(md5sum $B0/${V0}1/file | cut -d\  -f1)</div><div class='add'>+TEST [ "$LATEST_CTIME_MD5" == "$B0_MD5" ]</div><div class='add'>+TEST [ "$LATEST_CTIME_MD5" == "$B1_MD5" ]</div><div class='add'>+TEST glusterfs --volfile-id=/$V0 --volfile-server=$H0 $M0 --attribute-timeout=0 --entry-timeout=0</div><div class='add'>+cat $M0/file &gt; /dev/null</div><div class='add'>+EXPECT "0" echo $?</div><div class='add'>+</div><div class='add'>+############ Healing using favorite-child-policy = mtime #################</div><div class='add'>+TEST $CLI volume set $V0 cluster.favorite-child-policy none</div><div class='add'>+TEST $CLI volume set $V0 cluster.self-heal-daemon off</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}1</div><div class='add'>+TEST dd if=/dev/urandom of=$M0/file bs=1024 count=1024</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status $V0 $H0 $B0/${V0}1</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 1</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}0</div><div class='add'>+TEST dd if=/dev/urandom of=$M0/file bs=1024 count=1024</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status $V0 $H0 $B0/${V0}0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 0</div><div class='add'>+TEST $CLI volume set $V0 cluster.self-heal-daemon on</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "Y" glustershd_up_status</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 1</div><div class='add'>+TEST $CLI volume heal $V0</div><div class='add'>+</div><div class='add'>+#file still in split-brain</div><div class='add'>+cat $M0/file &gt; /dev/null</div><div class='add'>+EXPECT "1" echo $?</div><div class='add'>+</div><div class='add'>+#We know that the second brick has latest mtime.</div><div class='add'>+LATEST_CTIME_MD5=$(md5sum $B0/${V0}1/file | cut -d\  -f1)</div><div class='add'>+TEST $CLI volume set $V0 cluster.favorite-child-policy mtime</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "Y" glustershd_up_status</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 1</div><div class='add'>+TEST $CLI volume heal $V0</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "^0$" get_pending_heal_count $V0</div><div class='add'>+cat $M0/file &gt; /dev/null</div><div class='add'>+EXPECT "0" echo $?</div><div class='add'>+HEALED_MD5=$(md5sum $B0/${V0}0/file | cut -d\  -f1)</div><div class='add'>+TEST [ "$LATEST_CTIME_MD5" == "$HEALED_MD5" ]</div><div class='add'>+</div><div class='add'>+############ Healing using favorite-child-policy = size #################</div><div class='add'>+TEST $CLI volume set $V0 cluster.favorite-child-policy none</div><div class='add'>+TEST $CLI volume set $V0 cluster.self-heal-daemon off</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}1</div><div class='add'>+TEST dd if=/dev/urandom of=$M0/file bs=1024 count=1024</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status $V0 $H0 $B0/${V0}1</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 1</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}0</div><div class='add'>+TEST dd if=/dev/urandom of=$M0/file bs=1024 count=10240</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status $V0 $H0 $B0/${V0}0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 0</div><div class='add'>+TEST $CLI volume set $V0 cluster.self-heal-daemon on</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "Y" glustershd_up_status</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 1</div><div class='add'>+TEST $CLI volume heal $V0</div><div class='add'>+</div><div class='add'>+#file still in split-brain</div><div class='add'>+cat $M0/file &gt; /dev/null</div><div class='add'>+EXPECT "1" echo $?</div><div class='add'>+</div><div class='add'>+#We know that the second brick has the bigger size file.</div><div class='add'>+BIGGER_FILE_MD5=$(md5sum $B0/${V0}1/file | cut -d\  -f1)</div><div class='add'>+TEST $CLI volume set $V0 cluster.favorite-child-policy size</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "Y" glustershd_up_status</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 1</div><div class='add'>+TEST $CLI volume heal $V0</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "^0$" get_pending_heal_count $V0</div><div class='add'>+cat $M0/file &gt; /dev/null</div><div class='add'>+EXPECT "0" echo $?</div><div class='add'>+HEALED_MD5=$(md5sum $B0/${V0}0/file | cut -d\  -f1)</div><div class='add'>+TEST [ "$BIGGER_FILE_MD5" == "$HEALED_MD5" ]</div><div class='add'>+</div><div class='add'>+############ Healing using favorite-child-policy = majority on replica-3  #################</div><div class='add'>+</div><div class='add'>+#Convert volume to replica-3</div><div class='add'>+TEST $CLI volume add-brick $V0 replica 3 $H0:$B0/${V0}2</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status $V0 $H0 $B0/${V0}2</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 2</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "Y" glustershd_up_status</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 1</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 2</div><div class='add'>+TEST $CLI volume heal $V0</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "^0$" get_pending_heal_count $V0</div><div class='add'>+</div><div class='add'>+TEST $CLI volume set $V0 cluster.quorum-type none</div><div class='add'>+TEST $CLI volume set $V0 cluster.favorite-child-policy none</div><div class='add'>+TEST $CLI volume set $V0 cluster.self-heal-daemon off</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}0</div><div class='add'>+TEST dd if=/dev/urandom of=$M0/file bs=1024 count=1024</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status $V0 $H0 $B0/${V0}0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 0</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}1</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}2</div><div class='add'>+TEST dd if=/dev/urandom of=$M0/file bs=1024 count=10240</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status $V0 $H0 $B0/${V0}1</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status $V0 $H0 $B0/${V0}2</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 1</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 2</div><div class='add'>+TEST $CLI volume set $V0 cluster.self-heal-daemon on</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "Y" glustershd_up_status</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 1</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 2</div><div class='add'>+TEST $CLI volume heal $V0</div><div class='add'>+</div><div class='add'>+#file still in split-brain</div><div class='add'>+cat $M0/file &gt; /dev/null</div><div class='add'>+EXPECT "1" echo $?</div><div class='add'>+</div><div class='add'>+#We know that the second and third bricks agree with each other. Pick any one of them.</div><div class='add'>+MAJORITY_MD5=$(md5sum $B0/${V0}1/file | cut -d\  -f1)</div><div class='add'>+TEST $CLI volume set $V0 cluster.favorite-child-policy majority</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "Y" glustershd_up_status</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 1</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 2</div><div class='add'>+TEST $CLI volume heal $V0</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "^0$" get_pending_heal_count $V0</div><div class='add'>+cat $M0/file &gt; /dev/null</div><div class='add'>+EXPECT "0" echo $?</div><div class='add'>+HEALED_MD5=$(md5sum $B0/${V0}0/file | cut -d\  -f1)</div><div class='add'>+TEST [ "$MAJORITY_MD5" == "$HEALED_MD5" ]</div><div class='add'>+</div><div class='add'>+TEST force_umount $M0</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/000-flaky/basic_changelog_changelog-snapshot.t b/tests/000-flaky/basic_changelog_changelog-snapshot.t<br/>new file mode 100644<br/>index 00000000000..f6cd0b04d47<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/000-flaky/basic_changelog_changelog-snapshot.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/000-flaky/basic_changelog_changelog-snapshot.t</a></div><div class='hunk'>@@ -0,0 +1,60 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../include.rc</div><div class='add'>+. $(dirname $0)/../snapshot.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+ROLLOVER_TIME=3</div><div class='add'>+</div><div class='add'>+TEST verify_lvm_version;</div><div class='add'>+TEST glusterd;</div><div class='add'>+TEST pidof glusterd;</div><div class='add'>+</div><div class='add'>+TEST setup_lvm 1</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 $H0:$L1</div><div class='add'>+BRICK_LOG=$(echo "$L1" | tr / - | sed 's/^-//g')</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+#Enable changelog</div><div class='add'>+TEST $CLI volume set $V0 changelog.changelog on</div><div class='add'>+TEST $CLI volume set $V0 changelog.rollover-time $ROLLOVER_TIME</div><div class='add'>+TEST $GFS --volfile-id=$V0 --volfile-server=$H0 $M0;</div><div class='add'>+</div><div class='add'>+#Create snapshot</div><div class='add'>+S1="${V0}-snap1"</div><div class='add'>+</div><div class='add'>+mkdir $M0/RENAME</div><div class='add'>+mkdir $M0/LINK</div><div class='add'>+mkdir $M0/UNLINK</div><div class='add'>+mkdir $M0/RMDIR</div><div class='add'>+mkdir $M0/SYMLINK</div><div class='add'>+</div><div class='add'>+for i in {1..400} ; do touch $M0/RENAME/file$i; done</div><div class='add'>+for i in {1..400} ; do touch $M0/LINK/file$i; done</div><div class='add'>+for i in {1..400} ; do touch $M0/UNLINK/file$i; done</div><div class='add'>+for i in {1..400} ; do mkdir $M0/RMDIR/dir$i; done</div><div class='add'>+for i in {1..400} ; do touch $M0/SYMLINK/file$i; done</div><div class='add'>+</div><div class='add'>+#Write I/O in background</div><div class='add'>+for i in {1..400} ; do touch $M0/file$i 2&gt;/dev/null; done &amp;</div><div class='add'>+for i in {1..400} ; do mknod $M0/mknod-file$i p 2&gt;/dev/null; done &amp;</div><div class='add'>+for i in {1..400} ; do mkdir $M0/dir$i 2&gt;/dev/null; done &amp; 2&gt;/dev/null</div><div class='add'>+for i in {1..400} ; do mv $M0/RENAME/file$i $M0/RENAME/rn-file$i 2&gt;/dev/null; done &amp;</div><div class='add'>+for i in {1..400} ; do ln $M0/LINK/file$i $M0/LINK/ln-file$i 2&gt;/dev/null; done &amp;</div><div class='add'>+for i in {1..400} ; do rm -f $M0/UNLINK/file$i 2&gt;/dev/null; done &amp;</div><div class='add'>+for i in {1..400} ; do rmdir $M0/RMDIR/dir$i 2&gt;/dev/null; done &amp;</div><div class='add'>+for i in {1..400} ; do ln -s $M0/SYMLINK/file$i $M0/SYMLINK/sym-file$i 2&gt;/dev/null; done &amp;</div><div class='add'>+</div><div class='add'>+sleep 1</div><div class='add'>+TEST $CLI snapshot create $S1 $V0 no-timestamp</div><div class='add'>+TEST snapshot_exists 0 $S1</div><div class='add'>+</div><div class='add'>+TEST grep '"Enabled changelog barrier"' /var/log/glusterfs/bricks/$BRICK_LOG.log</div><div class='add'>+TEST grep '"Disabled changelog barrier"' /var/log/glusterfs/bricks/$BRICK_LOG.log</div><div class='add'>+</div><div class='add'>+TEST glusterfs -s $H0 --volfile-id=/snaps/$S1/$V0 $M1</div><div class='add'>+</div><div class='add'>+#Clean up</div><div class='add'>+TEST $CLI volume stop $V0 force</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/000-flaky/basic_distribute_rebal-all-nodes-migrate.t b/tests/000-flaky/basic_distribute_rebal-all-nodes-migrate.t<br/>new file mode 100644<br/>index 00000000000..eb5d3305ac1<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/000-flaky/basic_distribute_rebal-all-nodes-migrate.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/000-flaky/basic_distribute_rebal-all-nodes-migrate.t</a></div><div class='hunk'>@@ -0,0 +1,142 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../include.rc</div><div class='add'>+. $(dirname $0)/../cluster.rc</div><div class='add'>+. $(dirname $0)/../dht.rc</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+# Check if every single rebalance process migrated some files</div><div class='add'>+</div><div class='add'>+function cluster_rebal_all_nodes_migrated_files {</div><div class='add'>+        val=0</div><div class='add'>+        a=$($CLI_1 volume rebalance $V0 status | grep "completed" | awk '{print $2}');</div><div class='add'>+        b=($a)</div><div class='add'>+        for i in "${b[@]}"</div><div class='add'>+        do</div><div class='add'>+                if [ "$i" -eq "0" ]; then</div><div class='add'>+                        echo "false";</div><div class='add'>+                        val=1;</div><div class='add'>+                fi</div><div class='add'>+        done</div><div class='add'>+        echo $val</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='add'>+</div><div class='add'>+TEST launch_cluster 3;</div><div class='add'>+TEST $CLI_1 peer probe $H2;</div><div class='add'>+TEST $CLI_1 peer probe $H3;</div><div class='add'>+EXPECT_WITHIN $PROBE_TIMEOUT 2 peer_count</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+#Start with a pure distribute volume (multiple bricks on the same node)</div><div class='add'>+TEST $CLI_1 volume create $V0 $H1:$B1/dist1 $H1:$B1/dist2 $H2:$B2/dist3 $H2:$B2/dist4</div><div class='add'>+</div><div class='add'>+TEST $CLI_1 volume start $V0</div><div class='add'>+$CLI_1 volume info $V0</div><div class='add'>+</div><div class='add'>+#TEST $CLI_1 volume set $V0 client-log-level DEBUG</div><div class='add'>+</div><div class='add'>+## Mount FUSE</div><div class='add'>+TEST glusterfs -s $H1 --volfile-id $V0 $M0;</div><div class='add'>+</div><div class='add'>+TEST mkdir $M0/dir1 2&gt;/dev/null;</div><div class='add'>+TEST touch $M0/dir1/file-{1..500}</div><div class='add'>+</div><div class='add'>+## Add-brick and run rebalance to force file migration</div><div class='add'>+TEST $CLI_1 volume add-brick $V0 $H1:$B1/dist5 $H2:$B2/dist6</div><div class='add'>+</div><div class='add'>+#Start a rebalance</div><div class='add'>+TEST $CLI_1 volume rebalance $V0 start force</div><div class='add'>+</div><div class='add'>+#volume rebalance status should work</div><div class='add'>+#TEST $CLI_1 volume rebalance $V0 status</div><div class='add'>+#$CLI_1 volume rebalance $V0 status</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $REBALANCE_TIMEOUT "0" cluster_rebalance_completed</div><div class='add'>+EXPECT "0" cluster_rebal_all_nodes_migrated_files</div><div class='add'>+$CLI_1 volume rebalance $V0 status</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+TEST umount -f $M0</div><div class='add'>+TEST $CLI_1 volume stop $V0</div><div class='add'>+TEST $CLI_1 volume delete $V0</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+##############################################################</div><div class='add'>+</div><div class='add'>+# Next, a dist-rep volume</div><div class='add'>+TEST $CLI_1 volume create $V0 replica 2 $H1:$B1/drep1 $H2:$B2/drep1 $H1:$B1/drep2 $H2:$B2/drep2</div><div class='add'>+</div><div class='add'>+TEST $CLI_1 volume start $V0</div><div class='add'>+$CLI_1 volume info $V0</div><div class='add'>+</div><div class='add'>+#TEST $CLI_1 volume set $V0 client-log-level DEBUG</div><div class='add'>+</div><div class='add'>+## Mount FUSE</div><div class='add'>+TEST glusterfs -s $H1 --volfile-id $V0 $M0;</div><div class='add'>+</div><div class='add'>+TEST mkdir $M0/dir1 2&gt;/dev/null;</div><div class='add'>+TEST touch $M0/dir1/file-{1..500}</div><div class='add'>+</div><div class='add'>+## Add-brick and run rebalance to force file migration</div><div class='add'>+TEST $CLI_1 volume add-brick $V0 replica 2 $H1:$B1/drep3 $H2:$B2/drep3</div><div class='add'>+</div><div class='add'>+#Start a rebalance</div><div class='add'>+TEST $CLI_1 volume rebalance $V0 start force</div><div class='add'>+</div><div class='add'>+#volume rebalance status should work</div><div class='add'>+#TEST $CLI_1 volume rebalance $V0 status</div><div class='add'>+#$CLI_1 volume rebalance $V0 status</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $REBALANCE_TIMEOUT "0" cluster_rebalance_completed</div><div class='add'>+#EXPECT "0" cluster_rebal_all_nodes_migrated_files</div><div class='add'>+$CLI_1 volume rebalance $V0 status</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+TEST umount -f $M0</div><div class='add'>+TEST $CLI_1 volume stop $V0</div><div class='add'>+TEST $CLI_1 volume delete $V0</div><div class='add'>+</div><div class='add'>+##############################################################</div><div class='add'>+</div><div class='add'>+# Next, a disperse volume</div><div class='add'>+TEST $CLI_1 volume create $V0 disperse 3 $H1:$B1/ec1 $H2:$B1/ec2 $H3:$B1/ec3 force</div><div class='add'>+</div><div class='add'>+TEST $CLI_1 volume start $V0</div><div class='add'>+$CLI_1 volume info $V0</div><div class='add'>+</div><div class='add'>+#TEST $CLI_1 volume set $V0 client-log-level DEBUG</div><div class='add'>+</div><div class='add'>+## Mount FUSE</div><div class='add'>+TEST glusterfs -s $H1 --volfile-id $V0 $M0;</div><div class='add'>+</div><div class='add'>+TEST mkdir $M0/dir1 2&gt;/dev/null;</div><div class='add'>+TEST touch $M0/dir1/file-{1..500}</div><div class='add'>+</div><div class='add'>+## Add-brick and run rebalance to force file migration</div><div class='add'>+TEST $CLI_1 volume add-brick $V0 $H1:$B2/ec4 $H2:$B2/ec5 $H3:$B2/ec6</div><div class='add'>+</div><div class='add'>+#Start a rebalance</div><div class='add'>+TEST $CLI_1 volume rebalance $V0 start force</div><div class='add'>+</div><div class='add'>+#volume rebalance status should work</div><div class='add'>+#TEST $CLI_1 volume rebalance $V0 status</div><div class='add'>+#$CLI_1 volume rebalance $V0 status</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $REBALANCE_TIMEOUT "0" cluster_rebalance_completed</div><div class='add'>+</div><div class='add'>+# this will not work unless EC is changed to return all node-uuids</div><div class='add'>+# comment this out once that patch is ready</div><div class='add'>+#EXPECT "0" cluster_rebal_all_nodes_migrated_files</div><div class='add'>+$CLI_1 volume rebalance $V0 status</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+TEST umount -f $M0</div><div class='add'>+TEST $CLI_1 volume stop $V0</div><div class='add'>+TEST $CLI_1 volume delete $V0</div><div class='add'>+</div><div class='add'>+##############################################################</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='add'>+#G_TESTDEF_TEST_STATUS_NETBSD7=1501388</div><div class='head'>diff --git a/tests/000-flaky/basic_ec_ec-quorum-count-partial-failure.t b/tests/000-flaky/basic_ec_ec-quorum-count-partial-failure.t<br/>new file mode 100644<br/>index 00000000000..42808ce0c0e<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/000-flaky/basic_ec_ec-quorum-count-partial-failure.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/000-flaky/basic_ec_ec-quorum-count-partial-failure.t</a></div><div class='hunk'>@@ -0,0 +1,50 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../include.rc</div><div class='add'>+. $(dirname $0)/../volume.rc</div><div class='add'>+</div><div class='add'>+#This test checks that partial failure of fop results in main fop failure only</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 disperse 6 redundancy 2 $H0:$B0/${V0}{0..5}</div><div class='add'>+TEST $CLI volume create $V1 $H0:$B0/${V1}{0..5}</div><div class='add'>+TEST $CLI volume set $V0 performance.flush-behind off</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+TEST glusterfs --entry-timeout=0 --attribute-timeout=0 -s $H0 --volfile-id=/$V0 $M0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "6" ec_child_up_count $V0 0</div><div class='add'>+</div><div class='add'>+TEST dd if=/dev/urandom of=$M0/a bs=12347 count=1</div><div class='add'>+TEST dd if=/dev/urandom of=$M0/b bs=12347 count=1</div><div class='add'>+TEST cp $M0/b $M0/c</div><div class='add'>+TEST fallocate -p -l 101 $M0/c</div><div class='add'>+TEST $CLI volume stop $V0</div><div class='add'>+TEST $CLI volume set $V0 debug.delay-gen posix;</div><div class='add'>+TEST $CLI volume set $V0 delay-gen.delay-duration 10000000;</div><div class='add'>+TEST $CLI volume set $V0 delay-gen.enable WRITE;</div><div class='add'>+TEST $CLI volume set $V0 delay-gen.delay-percentage 100</div><div class='add'>+TEST $CLI volume set $V0 disperse.quorum-count 6</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "6" ec_child_up_count $V0 0</div><div class='add'>+cksum=$(dd if=$M0/a bs=12345 count=1 | md5sum | awk '{print $1}')</div><div class='add'>+truncate -s 12345 $M0/a &amp; #While write is waiting for 5 seconds, introduce failure</div><div class='add'>+fallocate -p -l 101 $M0/b &amp;</div><div class='add'>+sleep 1</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}0</div><div class='add'>+TEST wait</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "^0$" get_pending_heal_count ${V0}</div><div class='add'>+EXPECT "12345" stat --format=%s $M0/a</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}1</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}2</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0;</div><div class='add'>+TEST glusterfs --entry-timeout=0 --attribute-timeout=0 -s $H0 --volfile-id $V0 $M0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "4" ec_child_up_count $V0 0</div><div class='add'>+cksum_after_heal=$(dd if=$M0/a | md5sum | awk '{print $1}')</div><div class='add'>+TEST [[ $cksum == $cksum_after_heal ]]</div><div class='add'>+cksum=$(dd if=$M0/c | md5sum | awk '{print $1}')</div><div class='add'>+cksum_after_heal=$(dd if=$M0/b | md5sum | awk '{print $1}')</div><div class='add'>+TEST [[ $cksum == $cksum_after_heal ]]</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/000-flaky/basic_mount-nfs-auth.t b/tests/000-flaky/basic_mount-nfs-auth.t<br/>new file mode 100644<br/>index 00000000000..3d4a9cff00b<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/000-flaky/basic_mount-nfs-auth.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/000-flaky/basic_mount-nfs-auth.t</a></div><div class='hunk'>@@ -0,0 +1,342 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../include.rc</div><div class='add'>+. $(dirname $0)/../nfs.rc</div><div class='add'>+</div><div class='add'>+#G_TESTDEF_TEST_STATUS_CENTOS6=NFS_TEST</div><div class='add'>+</div><div class='add'>+# Our mount timeout must be as long as the time for a regular configuration</div><div class='add'>+# change to be acted upon *plus* AUTH_REFRESH_TIMEOUT, not one replacing the</div><div class='add'>+# other.  Otherwise this process races vs. the one making the change we're</div><div class='add'>+# trying to test, which leads to spurious failures.</div><div class='add'>+MY_MOUNT_TIMEOUT=$((CONFIG_UPDATE_TIMEOUT+AUTH_REFRESH_INTERVAL))</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+## Check whether glusterd is running</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume info</div><div class='add'>+</div><div class='add'>+H0IP=$(ip addr show |grep -w inet |grep -v 127.0.0.1|awk '{ print $2 }'| cut -d "/" -f 1)</div><div class='add'>+H0IP6=$(host $HOSTNAME | grep IPv6 | awk '{print $NF}')</div><div class='add'>+</div><div class='add'>+# Export variables for allow &amp; deny</div><div class='add'>+EXPORT_ALLOW="/$V0 $H0(sec=sys,rw,anonuid=0) @ngtop(sec=sys,rw,anonuid=0)"</div><div class='add'>+EXPORT_ALLOW_SLASH="/$V0/ $H0(sec=sys,rw,anonuid=0) @ngtop(sec=sys,rw,anonuid=0)"</div><div class='add'>+EXPORT_DENY="/$V0 1.2.3.4(sec=sys,rw,anonuid=0) @ngtop(sec=sys,rw,anonuid=0)"</div><div class='add'>+</div><div class='add'>+# Netgroup variables for allow &amp; deny</div><div class='add'>+NETGROUP_ALLOW="ngtop ng1000\nng1000 ng999\nng999 ng1\nng1 ng2\nng2 ($H0,,)"</div><div class='add'>+NETGROUP_DENY="ngtop ng1000\nng1000 ng999\nng999 ng1\nng1 ng2\nng2 (1.2.3.4,,)"</div><div class='add'>+</div><div class='add'>+V0L1="$V0/L1"</div><div class='add'>+V0L2="$V0L1/L2"</div><div class='add'>+V0L3="$V0L2/L3"</div><div class='add'>+</div><div class='add'>+# Other variations for allow &amp; deny</div><div class='add'>+EXPORT_ALLOW_RO="/$V0 $H0(sec=sys,ro,anonuid=0) @ngtop(sec=sys,ro,anonuid=0)"</div><div class='add'>+EXPORT_ALLOW_L1="/$V0L1 $H0(sec=sys,rw,anonuid=0) @ngtop(sec=sys,rw,anonuid=0)"</div><div class='add'>+EXPORT_WILDCARD="/$V0 *(sec=sys,rw,anonuid=0) @ngtop(sec=sys,rw,anonuid=0)"</div><div class='add'>+</div><div class='add'>+function build_dirs () {</div><div class='add'>+        mkdir -p $B0/b{0,1,2}/L1/L2/L3</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function export_allow_this_host_ipv6 () {</div><div class='add'>+        printf "$EXPORT_ALLOW6\n" &gt; "$GLUSTERD_WORKDIR"/nfs/exports</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function export_allow_this_host () {</div><div class='add'>+        printf "$EXPORT_ALLOW\n" &gt; ${NFSDIR}/exports</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function export_allow_this_host_with_slash () {</div><div class='add'>+        printf "$EXPORT_ALLOW_SLASH\n" &gt; ${NFSDIR}/exports</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function export_deny_this_host () {</div><div class='add'>+        printf "$EXPORT_DENY\n" &gt; ${NFSDIR}/exports</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function export_allow_this_host_l1 () {</div><div class='add'>+        printf "$EXPORT_ALLOW_L1\n" &gt;&gt; ${NFSDIR}/exports</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function export_allow_wildcard () {</div><div class='add'>+        printf "$EXPORT_WILDCARD\n" &gt; ${NFSDIR}/exports</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function export_allow_this_host_ro () {</div><div class='add'>+        printf "$EXPORT_ALLOW_RO\n" &gt; ${NFSDIR}/exports</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function netgroup_allow_this_host () {</div><div class='add'>+        printf "$NETGROUP_ALLOW\n" &gt; ${NFSDIR}/netgroups</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function netgroup_deny_this_host () {</div><div class='add'>+        printf "$NETGROUP_DENY\n" &gt; ${NFSDIR}/netgroups</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function create_vol () {</div><div class='add'>+        $CLI vol create $V0 $H0:$B0/b0</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function setup_cluster() {</div><div class='add'>+        build_dirs                      # Build directories</div><div class='add'>+        export_allow_this_host          # Allow this host in the exports file</div><div class='add'>+        netgroup_allow_this_host        # Allow this host in the netgroups file</div><div class='add'>+</div><div class='add'>+        glusterd</div><div class='add'>+        create_vol                      # Create the volume</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function check_mount_success {</div><div class='add'>+        mount_nfs $H0:/$1 $N0 nolock</div><div class='add'>+        if [ $? -eq 0 ]; then</div><div class='add'>+                echo "Y"</div><div class='add'>+        else</div><div class='add'>+                echo "N"</div><div class='add'>+        fi</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function check_mount_failure {</div><div class='add'>+        mount_nfs $H0:/$1 $N0 nolock</div><div class='add'>+        if [ $? -ne 0 ]; then</div><div class='add'>+                echo "Y"</div><div class='add'>+        else</div><div class='add'>+                local timeout=$UMOUNT_TIMEOUT</div><div class='add'>+                while ! umount_nfs $N0 &amp;&amp; [$timeout -ne 0] ; do</div><div class='add'>+                        timeout=$(( $timeout - 1 ))</div><div class='add'>+                        sleep 1</div><div class='add'>+                done</div><div class='add'>+        fi</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function small_write () {</div><div class='add'>+        dd if=/dev/zero of=$N0/test-small-write count=1 bs=1k 2&gt;&amp;1</div><div class='add'>+        if [ $? -ne 0 ]; then</div><div class='add'>+                echo "N"</div><div class='add'>+        else</div><div class='add'>+                echo "Y"</div><div class='add'>+        fi</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function bg_write () {</div><div class='add'>+        dd if=/dev/zero of=$N0/test-bg-write count=1 bs=1k &amp;</div><div class='add'>+        BG_WRITE_PID=$!</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function big_write() {</div><div class='add'>+        dd if=/dev/zero of=$N0/test-big-write count=500 bs=1024k</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function create () {</div><div class='add'>+        touch $N0/create-test</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function stat_nfs () {</div><div class='add'>+        ls $N0/</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+# Restarts the NFS server</div><div class='add'>+function restart_nfs () {</div><div class='add'>+        local NFS_PID=$(cat $GLUSTERD_PIDFILEDIR/nfs/nfs.pid)</div><div class='add'>+</div><div class='add'>+        # kill the NFS-server if it is running</div><div class='add'>+        while ps -q ${NFS_PID} 2&gt;&amp;1 &gt; /dev/null; do</div><div class='add'>+                kill ${NFS_PID}</div><div class='add'>+                sleep 0.5</div><div class='add'>+        done</div><div class='add'>+</div><div class='add'>+        # start-force starts the NFS-server again</div><div class='add'>+        $CLI vol start patchy force</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+setup_cluster</div><div class='add'>+</div><div class='add'>+# run preliminary tests</div><div class='add'>+TEST $CLI vol set $V0 nfs.disable off</div><div class='add'>+TEST $CLI vol start $V0</div><div class='add'>+</div><div class='add'>+# Get NFS state directory</div><div class='add'>+NFSDIR=$( $CLI volume get patchy nfs.mount-rmtab | \</div><div class='add'>+          awk '/^nfs.mount-rmtab/{print $2}' | \</div><div class='add'>+          xargs dirname )</div><div class='add'>+</div><div class='add'>+## Wait for volume to register with rpc.mountd</div><div class='add'>+EXPECT_WITHIN $NFS_EXPORT_TIMEOUT "1" is_nfs_export_available</div><div class='add'>+</div><div class='add'>+## NFS server starts with auth disabled</div><div class='add'>+## Do some tests to verify that.</div><div class='add'>+</div><div class='add'>+EXPECT "Y" check_mount_success $V0</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" umount_nfs $N0</div><div class='add'>+</div><div class='add'>+## Disallow host</div><div class='add'>+TEST export_deny_this_host</div><div class='add'>+TEST netgroup_deny_this_host</div><div class='add'>+</div><div class='add'>+## Technically deauthorized this host, but since auth is disabled we should be</div><div class='add'>+## able to do mounts, writes, etc.</div><div class='add'>+EXPECT_WITHIN $MY_MOUNT_TIMEOUT "Y" check_mount_success $V0</div><div class='add'>+EXPECT "Y" small_write</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" umount_nfs $N0</div><div class='add'>+</div><div class='add'>+## Reauthorize this host</div><div class='add'>+export_allow_this_host</div><div class='add'>+netgroup_allow_this_host</div><div class='add'>+</div><div class='add'>+## Restart NFS with auth enabled</div><div class='add'>+$CLI vol stop $V0</div><div class='add'>+TEST $CLI vol set $V0 nfs.exports-auth-enable on</div><div class='add'>+$CLI vol start $V0</div><div class='add'>+EXPECT_WITHIN $NFS_EXPORT_TIMEOUT "1" is_nfs_export_available</div><div class='add'>+</div><div class='add'>+## Mount NFS</div><div class='add'>+EXPECT "Y" check_mount_success $V0</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" umount_nfs $N0</div><div class='add'>+</div><div class='add'>+## Mount NFS using the IPv6 export</div><div class='add'>+export_allow_this_host_ipv6</div><div class='add'>+EXPECT "Y" check_mount_success $V0</div><div class='add'>+</div><div class='add'>+## Disallow host</div><div class='add'>+TEST export_deny_this_host</div><div class='add'>+TEST netgroup_deny_this_host</div><div class='add'>+</div><div class='add'>+## Writes should not be allowed, host is not authorized</div><div class='add'>+EXPECT_WITHIN $AUTH_REFRESH_INTERVAL "N" small_write</div><div class='add'>+</div><div class='add'>+## Unmount so we can test mount</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" umount_nfs $N0</div><div class='add'>+</div><div class='add'>+## Subsequent ounts should not be allowed, host is not authorized</div><div class='add'>+EXPECT "Y" check_mount_failure $V0</div><div class='add'>+</div><div class='add'>+## Reauthorize host</div><div class='add'>+TEST export_allow_this_host</div><div class='add'>+TEST netgroup_allow_this_host</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $MY_MOUNT_TIMEOUT "Y" check_mount_success $V0</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" umount_nfs $N0</div><div class='add'>+</div><div class='add'>+## Allow host in netgroups but not in exports, host should be allowed</div><div class='add'>+TEST export_deny_this_host</div><div class='add'>+TEST netgroup_allow_this_host</div><div class='add'>+</div><div class='add'>+# wait for the mount authentication to rebuild</div><div class='add'>+sleep $[$AUTH_REFRESH_INTERVAL + 1]</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $MY_MOUNT_TIMEOUT "Y" check_mount_success $V0</div><div class='add'>+EXPECT "Y" small_write</div><div class='add'>+TEST big_write</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" umount_nfs $N0</div><div class='add'>+</div><div class='add'>+## Allow host in exports but not in netgroups, host should be allowed</div><div class='add'>+TEST export_allow_this_host</div><div class='add'>+TEST netgroup_deny_this_host</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $MY_MOUNT_TIMEOUT "Y" check_mount_success $V0</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" umount_nfs $N0</div><div class='add'>+</div><div class='add'>+## Finally, reauth the host in export and netgroup, test mount &amp; write</div><div class='add'>+TEST export_allow_this_host_l1</div><div class='add'>+TEST netgroup_allow_this_host</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $MY_MOUNT_TIMEOUT "Y" check_mount_success $V0L1</div><div class='add'>+EXPECT "Y" small_write</div><div class='add'>+</div><div class='add'>+## Failover test: Restarting NFS and then doing a write should pass</div><div class='add'>+bg_write</div><div class='add'>+TEST restart_nfs</div><div class='add'>+EXPECT_WITHIN $NFS_EXPORT_TIMEOUT "1" is_nfs_export_available</div><div class='add'>+</div><div class='add'>+TEST wait $BG_WRITE_PID</div><div class='add'>+EXPECT "Y" small_write</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" umount_nfs $N0</div><div class='add'>+</div><div class='add'>+## Test deep mounts</div><div class='add'>+EXPECT "Y" check_mount_success $V0L1</div><div class='add'>+EXPECT "Y" small_write</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" umount_nfs $N0</div><div class='add'>+</div><div class='add'>+TEST export_allow_this_host_ro</div><div class='add'>+TEST netgroup_deny_this_host</div><div class='add'>+</div><div class='add'>+## Restart the nfs server to avoid spurious failure(BZ1256352)</div><div class='add'>+restart_nfs</div><div class='add'>+EXPECT_WITHIN $NFS_EXPORT_TIMEOUT "1" is_nfs_export_available</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $MY_MOUNT_TIMEOUT "Y" check_mount_success $V0</div><div class='add'>+EXPECT "N" small_write # Writes should not be allowed</div><div class='add'>+TEST ! create      # Create should not be allowed</div><div class='add'>+TEST stat_nfs      # Stat should be allowed</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" umount_nfs $N0</div><div class='add'>+</div><div class='add'>+TEST export_deny_this_host</div><div class='add'>+TEST netgroup_deny_this_host</div><div class='add'>+TEST export_allow_this_host_l1 # Allow this host at L1</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $MY_MOUNT_TIMEOUT "Y" check_mount_failure $V0 #V0 shouldnt be allowed</div><div class='add'>+EXPECT_WITHIN $MY_MOUNT_TIMEOUT "Y" check_mount_success $V0L1 #V0L1 should be</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" umount_nfs $N0</div><div class='add'>+</div><div class='add'>+## Test wildcard hosts</div><div class='add'>+TEST export_allow_wildcard</div><div class='add'>+</div><div class='add'>+# the $MY_MOUNT_TIMEOUT might not be long enough? restart should do</div><div class='add'>+restart_nfs</div><div class='add'>+EXPECT_WITHIN $NFS_EXPORT_TIMEOUT "1" is_nfs_export_available</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $MY_MOUNT_TIMEOUT "Y" check_mount_success $V0</div><div class='add'>+EXPECT_WITHIN $AUTH_REFRESH_INTERVAL "Y" small_write</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" umount_nfs $N0</div><div class='add'>+</div><div class='add'>+## Test if path is parsed correctly</div><div class='add'>+## by mounting host:vol/ instead of host:vol</div><div class='add'>+EXPECT "Y" check_mount_success $V0/</div><div class='add'>+EXPECT "Y" small_write</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" umount_nfs $N0</div><div class='add'>+</div><div class='add'>+TEST export_allow_this_host_with_slash</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $MY_MOUNT_TIMEOUT "Y" check_mount_success $V0</div><div class='add'>+EXPECT "Y" small_write</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" umount_nfs $N0</div><div class='add'>+</div><div class='add'>+EXPECT "Y" check_mount_success $V0/</div><div class='add'>+EXPECT "Y" small_write</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" umount_nfs $N0</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+## Turn off exports authentication</div><div class='add'>+$CLI vol stop $V0</div><div class='add'>+TEST $CLI vol set $V0 nfs.exports-auth-enable off</div><div class='add'>+$CLI vol start $V0</div><div class='add'>+EXPECT_WITHIN $NFS_EXPORT_TIMEOUT "1" is_nfs_export_available</div><div class='add'>+</div><div class='add'>+TEST export_deny_this_host # Deny the host</div><div class='add'>+TEST netgroup_deny_this_host</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $MY_MOUNT_TIMEOUT "Y" check_mount_success $V0 # Do a mount &amp; test</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" umount_nfs $N0</div><div class='add'>+</div><div class='add'>+## Turn back on the exports authentication</div><div class='add'>+$CLI vol stop $V0</div><div class='add'>+TEST $CLI vol set $V0 nfs.exports-auth-enable on</div><div class='add'>+$CLI vol start $V0</div><div class='add'>+EXPECT_WITHIN $NFS_EXPORT_TIMEOUT "1" is_nfs_export_available</div><div class='add'>+</div><div class='add'>+## Do a simple test to set the refresh time to 20 seconds</div><div class='add'>+TEST $CLI vol set $V0 nfs.auth-refresh-interval-sec 20</div><div class='add'>+</div><div class='add'>+## Do a simple test to see if the volume option exists</div><div class='add'>+TEST $CLI vol set $V0 nfs.auth-cache-ttl-sec 400</div><div class='add'>+</div><div class='add'>+## Finish up</div><div class='add'>+TEST $CLI volume stop $V0</div><div class='add'>+TEST $CLI volume delete $V0;</div><div class='add'>+TEST ! $CLI volume info $V0;</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/000-flaky/bugs_core_multiplex-limit-issue-151.t b/tests/000-flaky/bugs_core_multiplex-limit-issue-151.t<br/>new file mode 100644<br/>index 00000000000..5a88f97d726<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/000-flaky/bugs_core_multiplex-limit-issue-151.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/000-flaky/bugs_core_multiplex-limit-issue-151.t</a></div><div class='hunk'>@@ -0,0 +1,56 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../include.rc</div><div class='add'>+. $(dirname $0)/../traps.rc</div><div class='add'>+. $(dirname $0)/../volume.rc</div><div class='add'>+</div><div class='add'>+function count_up_bricks {</div><div class='add'>+        $CLI --xml volume status all | grep '&lt;status&gt;1' | wc -l</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function count_brick_processes {</div><div class='add'>+	pgrep glusterfsd | wc -l</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function count_brick_pids {</div><div class='add'>+        $CLI --xml volume status all | sed -n '/.*&lt;pid&gt;\([^&lt;]*\).*/s//\1/p' \</div><div class='add'>+                                     | grep -v "N/A" | sort | uniq | wc -l</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+</div><div class='add'>+TEST $CLI volume set all cluster.brick-multiplex on</div><div class='add'>+TEST ! $CLI volume set all cluster.max-bricks-per-process -1</div><div class='add'>+TEST ! $CLI volume set all cluster.max-bricks-per-process foobar</div><div class='add'>+TEST $CLI volume set all cluster.max-bricks-per-process 3</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/brick{0..5}</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+EXPECT 2 count_brick_processes</div><div class='add'>+EXPECT 2 count_brick_pids</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT 6 count_up_bricks</div><div class='add'>+</div><div class='add'>+pkill gluster</div><div class='add'>+TEST glusterd</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT 2 count_brick_processes</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT 2 count_brick_pids</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT 6 count_up_bricks</div><div class='add'>+</div><div class='add'>+TEST $CLI volume add-brick $V0 $H0:$B0/brick6</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT 3 count_brick_processes</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT 3 count_brick_pids</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT 7 count_up_bricks</div><div class='add'>+</div><div class='add'>+TEST $CLI volume remove-brick $V0 $H0:$B0/brick3 start</div><div class='add'>+TEST $CLI volume remove-brick $V0 $H0:$B0/brick3 force</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT 3 count_brick_processes</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT 3 count_brick_pids</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT 6 count_up_bricks</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/000-flaky/bugs_distribute_bug-1117851.t b/tests/000-flaky/bugs_distribute_bug-1117851.t<br/>new file mode 100644<br/>index 00000000000..5980bf2fd4b<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/000-flaky/bugs_distribute_bug-1117851.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/000-flaky/bugs_distribute_bug-1117851.t</a></div><div class='hunk'>@@ -0,0 +1,101 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+SCRIPT_TIMEOUT=250</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../include.rc</div><div class='add'>+. $(dirname $0)/../volume.rc</div><div class='add'>+</div><div class='add'>+create_files () {</div><div class='add'>+	for i in {1..1000}; do</div><div class='add'>+		orig=$(printf %s/abc%04d $1 $i)</div><div class='add'>+		real=$(printf %s/src%04d $1 $i)</div><div class='add'>+		# Make sure lots of these have linkfiles.</div><div class='add'>+		echo "This is file $i" &gt; $orig</div><div class='add'>+		mv $orig $real</div><div class='add'>+	done</div><div class='add'>+	sync</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+move_files_inner () {</div><div class='add'>+	sfile=$M0/status_$(basename $1)</div><div class='add'>+	for i in {1..1000}; do</div><div class='add'>+		src=$(printf %s/src%04d $1 $i)</div><div class='add'>+		dst=$(printf %s/dst%04d $1 $i)</div><div class='add'>+		mv $src $dst 2&gt; /dev/null</div><div class='add'>+	done</div><div class='add'>+	echo "done" &gt; $sfile</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+move_files () {</div><div class='add'>+        #Create the status file here to prevent spurious failures</div><div class='add'>+        #caused by the file not being created in time by the</div><div class='add'>+        #background process</div><div class='add'>+	sfile=$M0/status_$(basename $1)</div><div class='add'>+	echo "running" &gt; $sfile</div><div class='add'>+	move_files_inner $* &amp;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+check_files () {</div><div class='add'>+	errors=0</div><div class='add'>+	for i in {1..1000}; do</div><div class='add'>+		if [ ! -f $(printf %s/dst%04d $1 $i) ]; then</div><div class='add'>+			if [ -f $(printf %s/src%04d $1 $i) ]; then</div><div class='add'>+				echo "file $i didnt get moved" &gt; /dev/stderr</div><div class='add'>+			else</div><div class='add'>+				echo "file $i is MISSING" &gt; /dev/stderr</div><div class='add'>+				errors=$((errors+1))</div><div class='add'>+			fi</div><div class='add'>+		fi</div><div class='add'>+	done</div><div class='add'>+	if [ $((errors)) != 0 ]; then</div><div class='add'>+		: ls -l $1 &gt; /dev/stderr</div><div class='add'>+	fi</div><div class='add'>+	return $errors</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume info;</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 replica 2 $H0:$B0/${V0}{1,2,3,4,5,6};</div><div class='add'>+</div><div class='add'>+EXPECT "$V0" volinfo_field $V0 'Volume Name';</div><div class='add'>+EXPECT 'Created' volinfo_field $V0 'Status';</div><div class='add'>+EXPECT '6' brick_count $V0</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+EXPECT 'Started' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+## Mount FUSE with caching disabled (read-write)</div><div class='add'>+TEST glusterfs --entry-timeout=0 --attribute-timeout=0 -s $H0 --volfile-id $V0 $M0;</div><div class='add'>+</div><div class='add'>+TEST create_files $M0</div><div class='add'>+</div><div class='add'>+## Mount FUSE with caching disabled (read-write) again</div><div class='add'>+TEST glusterfs --entry-timeout=0 --attribute-timeout=0 -s $H0 --volfile-id $V0 $M1;</div><div class='add'>+</div><div class='add'>+TEST move_files $M0</div><div class='add'>+TEST move_files $M1</div><div class='add'>+</div><div class='add'>+# It's regrettable that renaming 1000 files might take more than 30 seconds,</div><div class='add'>+# but on our test systems sometimes it does, so double the time from what we'd</div><div class='add'>+# use otherwise.  There still seem to be some spurious failures, 1 in 20 when</div><div class='add'>+# this does not complete, added an additional 60 seconds to take false reports</div><div class='add'>+# out of the system, during test runs, especially on slower test systems.</div><div class='add'>+EXPECT_WITHIN 120 "done" cat $M0/status_0</div><div class='add'>+EXPECT_WITHIN 120 "done" cat $M1/status_1</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M1</div><div class='add'>+TEST glusterfs --entry-timeout=0 --attribute-timeout=0 -s $H0 --volfile-id $V0 $M0;</div><div class='add'>+TEST check_files $M0</div><div class='add'>+</div><div class='add'>+TEST $CLI volume stop $V0;</div><div class='add'>+EXPECT 'Stopped' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+TEST $CLI volume delete $V0;</div><div class='add'>+TEST ! $CLI volume info $V0;</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/000-flaky/bugs_distribute_bug-1122443.t b/tests/000-flaky/bugs_distribute_bug-1122443.t<br/>new file mode 100644<br/>index 00000000000..abd37082b33<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/000-flaky/bugs_distribute_bug-1122443.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/000-flaky/bugs_distribute_bug-1122443.t</a></div><div class='hunk'>@@ -0,0 +1,61 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../include.rc</div><div class='add'>+. $(dirname $0)/../volume.rc</div><div class='add'>+. $(dirname $0)/../dht.rc</div><div class='add'>+</div><div class='add'>+make_files() {</div><div class='add'>+    mkdir $1 &amp;&amp; \</div><div class='add'>+    ln -s ../ $1/symlink &amp;&amp; \</div><div class='add'>+    mknod $1/special_b b 1 2 &amp;&amp; \</div><div class='add'>+    mknod $1/special_c c 3 4 &amp;&amp; \</div><div class='add'>+    mknod $1/special_u u 5 6 &amp;&amp; \</div><div class='add'>+    mknod $1/special_p p &amp;&amp; \</div><div class='add'>+    touch -h --date=@1 $1/symlink &amp;&amp; \</div><div class='add'>+    touch -h --date=@2 $1/special_b &amp;&amp;</div><div class='add'>+    touch -h --date=@3 $1/special_c &amp;&amp;</div><div class='add'>+    touch -h --date=@4 $1/special_u &amp;&amp;</div><div class='add'>+    touch -h --date=@5 $1/special_p</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+bug_1113050_workaround() {</div><div class='add'>+    # Test if graph change has settled (bug-1113050?)</div><div class='add'>+    test=$(stat -c "%n:%Y" $1 2&gt;&amp;1 | tr '\n' ',')</div><div class='add'>+    if [ $? -eq 0 ] ; then</div><div class='add'>+	echo RECONNECTED</div><div class='add'>+    else</div><div class='add'>+	echo WAITING</div><div class='add'>+    fi</div><div class='add'>+    return 0</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/${V0}0</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+# Mount FUSE and create symlink</div><div class='add'>+TEST glusterfs -s $H0 --volfile-id $V0 $M0</div><div class='add'>+TEST make_files $M0/subdir</div><div class='add'>+</div><div class='add'>+# Get mtime before migration</div><div class='add'>+BEFORE="$(stat -c %n:%Y $M0/subdir/* | sort | tr '\n' ',')"</div><div class='add'>+echo $BEFORE</div><div class='add'>+# Migrate brick</div><div class='add'>+TEST $CLI volume add-brick $V0 $H0:$B0/${V0}1</div><div class='add'>+TEST $CLI volume remove-brick $V0 $H0:$B0/${V0}0 start</div><div class='add'>+EXPECT_WITHIN $REBALANCE_TIMEOUT "completed" remove_brick_status_completed_field "$V0 $H0:$B0/${V0}0"</div><div class='add'>+TEST $CLI volume remove-brick $V0 $H0:$B0/${V0}0 commit</div><div class='add'>+</div><div class='add'>+# Get mtime after migration</div><div class='add'>+EXPECT_WITHIN 30 RECONNECTED bug_1113050_workaround $M0/subdir/symlink</div><div class='add'>+sleep 3</div><div class='add'>+AFTER="$(stat -c %n:%Y $M0/subdir/* | sort | tr '\n' ',')"</div><div class='add'>+echo $AFTER</div><div class='add'>+# Check if mtime is unchanged</div><div class='add'>+TEST [ "$AFTER" == "$BEFORE" ]</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/000-flaky/bugs_glusterd_bug-857330/common.rc b/tests/000-flaky/bugs_glusterd_bug-857330/common.rc<br/>new file mode 100644<br/>index 00000000000..bd122eff18c<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/000-flaky/bugs_glusterd_bug-857330/common.rc?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/000-flaky/bugs_glusterd_bug-857330/common.rc</a></div><div class='hunk'>@@ -0,0 +1,57 @@</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+</div><div class='add'>+UUID_REGEX='[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}'</div><div class='add'>+</div><div class='add'>+TASK_ID=""</div><div class='add'>+COMMAND=""</div><div class='add'>+PATTERN=""</div><div class='add'>+</div><div class='add'>+function check-and-store-task-id()</div><div class='add'>+{</div><div class='add'>+        TASK_ID=""</div><div class='add'>+</div><div class='add'>+        local task_id=$($CLI $COMMAND | grep $PATTERN | grep -o -E "$UUID_REGEX")</div><div class='add'>+</div><div class='add'>+        if [ -z "$task_id" ] &amp;&amp; [ "${task_id+asdf}" = "asdf" ]; then</div><div class='add'>+                return 1</div><div class='add'>+        fi</div><div class='add'>+</div><div class='add'>+        TASK_ID=$task_id</div><div class='add'>+        return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function get-task-id()</div><div class='add'>+{</div><div class='add'>+        $CLI $COMMAND | grep $PATTERN | grep -o -E "$UUID_REGEX" | tail -n1</div><div class='add'>+</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function check-and-store-task-id-xml()</div><div class='add'>+{</div><div class='add'>+        TASK_ID=""</div><div class='add'>+</div><div class='add'>+        local task_id=$($CLI $COMMAND --xml | xmllint --format - | grep $PATTERN | grep -o -E "$UUID_REGEX")</div><div class='add'>+</div><div class='add'>+        if [ -z "$task_id" ] &amp;&amp; [ "${task_id+asdf}" = "asdf" ]; then</div><div class='add'>+                return 1</div><div class='add'>+        fi</div><div class='add'>+</div><div class='add'>+        TASK_ID=$task_id</div><div class='add'>+        return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function get-task-id-xml()</div><div class='add'>+{</div><div class='add'>+        $CLI $COMMAND --xml | xmllint --format - | grep $PATTERN | grep -o -E "$UUID_REGEX"</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function get-task-status()</div><div class='add'>+{</div><div class='add'>+        pattern=$1</div><div class='add'>+        val=1</div><div class='add'>+        test=$(gluster $COMMAND | grep -o $pattern 2&gt;&amp;1)</div><div class='add'>+        if [ $? -eq 0 ]; then</div><div class='add'>+                 val=0</div><div class='add'>+        fi</div><div class='add'>+        echo $val</div><div class='add'>+}</div><div class='head'>diff --git a/tests/000-flaky/bugs_glusterd_bug-857330/normal.t b/tests/000-flaky/bugs_glusterd_bug-857330/normal.t<br/>new file mode 100755<br/>index 00000000000..6c1cf54ec3c<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/000-flaky/bugs_glusterd_bug-857330/normal.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/000-flaky/bugs_glusterd_bug-857330/normal.t</a></div><div class='hunk'>@@ -0,0 +1,69 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/common.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume info;</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 replica 2 $H0:$B0/${V0}1 $H0:$B0/${V0}2;</div><div class='add'>+TEST $CLI volume info $V0;</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+</div><div class='add'>+TEST glusterfs -s $H0 --volfile-id=$V0 $M0;</div><div class='add'>+</div><div class='add'>+TEST $PYTHON $(dirname $0)/../../utils/create-files.py \</div><div class='add'>+             --multi -b 10 -d 10  -n 10 $M0;</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+</div><div class='add'>+###############</div><div class='add'>+## Rebalance ##</div><div class='add'>+###############</div><div class='add'>+TEST $CLI volume add-brick $V0 replica 2 $H0:$B0/${V0}3 $H0:$B0/${V0}4;</div><div class='add'>+</div><div class='add'>+COMMAND="volume rebalance $V0 start"</div><div class='add'>+PATTERN="ID:"</div><div class='add'>+TEST check-and-store-task-id</div><div class='add'>+</div><div class='add'>+COMMAND="volume status $V0"</div><div class='add'>+PATTERN="ID"</div><div class='add'>+EXPECT $TASK_ID get-task-id</div><div class='add'>+</div><div class='add'>+COMMAND="volume rebalance $V0 status"</div><div class='add'>+PATTERN="completed"</div><div class='add'>+EXPECT_WITHIN $REBALANCE_TIMEOUT "0" get-task-status $PATTERN</div><div class='add'>+</div><div class='add'>+###################</div><div class='add'>+## Replace-brick ##</div><div class='add'>+###################</div><div class='add'>+REP_BRICK_PAIR="$H0:$B0/${V0}2 $H0:$B0/${V0}5"</div><div class='add'>+</div><div class='add'>+TEST $CLI volume replace-brick $V0 $REP_BRICK_PAIR commit force;</div><div class='add'>+</div><div class='add'>+##################</div><div class='add'>+## Remove-brick ##</div><div class='add'>+##################</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status $V0 $H0 $B0/${V0}5</div><div class='add'>+</div><div class='add'>+COMMAND="volume remove-brick $V0 $H0:$B0/${V0}1 $H0:$B0/${V0}5 start"</div><div class='add'>+PATTERN="ID:"</div><div class='add'>+TEST check-and-store-task-id</div><div class='add'>+</div><div class='add'>+COMMAND="volume status $V0"</div><div class='add'>+PATTERN="ID"</div><div class='add'>+EXPECT $TASK_ID get-task-id</div><div class='add'>+</div><div class='add'>+COMMAND="volume remove-brick $V0 $H0:$B0/${V0}1 $H0:$B0/${V0}5 status"</div><div class='add'>+PATTERN="completed"</div><div class='add'>+EXPECT_WITHIN $REBALANCE_TIMEOUT "0" get-task-status $PATTERN</div><div class='add'>+</div><div class='add'>+TEST $CLI volume remove-brick $V0 $H0:$B0/${V0}1 $H0:$B0/${V0}5 commit</div><div class='add'>+</div><div class='add'>+TEST $CLI volume stop $V0;</div><div class='add'>+TEST $CLI volume delete $V0;</div><div class='add'>+TEST ! $CLI volume info $V0;</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/000-flaky/bugs_glusterd_bug-857330/xml.t b/tests/000-flaky/bugs_glusterd_bug-857330/xml.t<br/>new file mode 100755<br/>index 00000000000..11785adacdb<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/000-flaky/bugs_glusterd_bug-857330/xml.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/000-flaky/bugs_glusterd_bug-857330/xml.t</a></div><div class='hunk'>@@ -0,0 +1,83 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/common.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume info;</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 replica 2 $H0:$B0/${V0}1 $H0:$B0/${V0}2;</div><div class='add'>+TEST $CLI volume info $V0;</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+</div><div class='add'>+TEST glusterfs -s $H0 --volfile-id=$V0 $M0;</div><div class='add'>+</div><div class='add'>+TEST $PYTHON $(dirname $0)/../../utils/create-files.py \</div><div class='add'>+             --multi -b 10 -d 10  -n 10 $M0;</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+###############</div><div class='add'>+## Rebalance ##</div><div class='add'>+###############</div><div class='add'>+TEST $CLI volume add-brick $V0 replica 2 $H0:$B0/${V0}3 $H0:$B0/${V0}4;</div><div class='add'>+</div><div class='add'>+COMMAND="volume rebalance $V0 start"</div><div class='add'>+PATTERN="task-id"</div><div class='add'>+TEST check-and-store-task-id-xml</div><div class='add'>+</div><div class='add'>+COMMAND="volume status $V0"</div><div class='add'>+PATTERN="id"</div><div class='add'>+EXPECT $TASK_ID get-task-id-xml</div><div class='add'>+</div><div class='add'>+COMMAND="volume rebalance $V0 status"</div><div class='add'>+PATTERN="task-id"</div><div class='add'>+EXPECT $TASK_ID get-task-id-xml</div><div class='add'>+</div><div class='add'>+## TODO: Add tests for rebalance stop</div><div class='add'>+</div><div class='add'>+COMMAND="volume rebalance $V0 status"</div><div class='add'>+PATTERN="completed"</div><div class='add'>+EXPECT_WITHIN $REBALANCE_TIMEOUT "0" get-task-status $PATTERN</div><div class='add'>+</div><div class='add'>+###################</div><div class='add'>+## Replace-brick ##</div><div class='add'>+###################</div><div class='add'>+TEST $CLI volume replace-brick $V0 $H0:$B0/${V0}4 $H0:$B0/${V0}5 commit force</div><div class='add'>+</div><div class='add'>+##################</div><div class='add'>+## Remove-brick ##</div><div class='add'>+##################</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status $V0 $H0 $B0/${V0}5</div><div class='add'>+</div><div class='add'>+COMMAND="volume remove-brick $V0 $H0:$B0/${V0}3 $H0:$B0/${V0}5 start"</div><div class='add'>+PATTERN="task-id"</div><div class='add'>+TEST check-and-store-task-id-xml</div><div class='add'>+</div><div class='add'>+COMMAND="volume status $V0"</div><div class='add'>+PATTERN="id"</div><div class='add'>+EXPECT $TASK_ID get-task-id-xml</div><div class='add'>+</div><div class='add'>+COMMAND="volume remove-brick $V0 $H0:$B0/${V0}3 $H0:$B0/${V0}5 status"</div><div class='add'>+PATTERN="task-id"</div><div class='add'>+EXPECT $TASK_ID get-task-id-xml</div><div class='add'>+</div><div class='add'>+COMMAND="volume remove-brick $V0 $H0:$B0/${V0}3 $H0:$B0/${V0}5 status"</div><div class='add'>+PATTERN="completed"</div><div class='add'>+EXPECT_WITHIN  $REBALANCE_TIMEOUT "0" get-task-status $PATTERN</div><div class='add'>+</div><div class='add'>+## TODO: Add tests for remove-brick stop</div><div class='add'>+</div><div class='add'>+COMMAND="volume remove-brick $V0 $H0:$B0/${V0}3 $H0:$B0/${V0}5 commit"</div><div class='add'>+PATTERN="task-id"</div><div class='add'>+EXPECT $TASK_ID get-task-id-xml</div><div class='add'>+</div><div class='add'>+TEST $CLI volume stop $V0;</div><div class='add'>+TEST $CLI volume delete $V0;</div><div class='add'>+TEST ! $CLI volume info $V0;</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/000-flaky/bugs_glusterd_quorum-value-check.t b/tests/000-flaky/bugs_glusterd_quorum-value-check.t<br/>new file mode 100644<br/>index 00000000000..a431b8c4fd4<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/000-flaky/bugs_glusterd_quorum-value-check.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/000-flaky/bugs_glusterd_quorum-value-check.t</a></div><div class='hunk'>@@ -0,0 +1,37 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../include.rc</div><div class='add'>+. $(dirname $0)/../volume.rc</div><div class='add'>+</div><div class='add'>+#G_TESTDEF_TEST_STATUS_CENTOS6=NFS_TEST</div><div class='add'>+</div><div class='add'>+function check_quorum_nfs() {</div><div class='add'>+    local qnfs="$(less /var/lib/glusterd/nfs/nfs-server.vol | grep "quorum-count"| awk '{print $3}')"</div><div class='add'>+    local qinfo="$($CLI volume info $V0| grep "cluster.quorum-count"| awk '{print $2}')"</div><div class='add'>+</div><div class='add'>+    if [ $qnfs = $qinfo ]; then</div><div class='add'>+        echo "Y"</div><div class='add'>+    else</div><div class='add'>+        echo "N"</div><div class='add'>+    fi</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 replica 3 $H0:$B0/${V0}{0,1,2}</div><div class='add'>+TEST $CLI volume set $V0 nfs.disable off</div><div class='add'>+TEST $CLI volume set $V0 performance.write-behind off</div><div class='add'>+TEST $CLI volume set $V0 cluster.self-heal-daemon off</div><div class='add'>+TEST $CLI volume set $V0 cluster.quorum-type fixed</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+TEST $CLI volume set $V0 cluster.quorum-count 1</div><div class='add'>+EXPECT_WITHIN $CONFIG_UPDATE_TIMEOUT "Y" check_quorum_nfs</div><div class='add'>+TEST $CLI volume set $V0 cluster.quorum-count 2</div><div class='add'>+EXPECT_WITHIN $CONFIG_UPDATE_TIMEOUT "Y" check_quorum_nfs</div><div class='add'>+TEST $CLI volume set $V0 cluster.quorum-count 3</div><div class='add'>+EXPECT_WITHIN $CONFIG_UPDATE_TIMEOUT "Y" check_quorum_nfs</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/000-flaky/bugs_nfs_bug-1116503.t b/tests/000-flaky/bugs_nfs_bug-1116503.t<br/>new file mode 100644<br/>index 00000000000..fc50021acc7<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/000-flaky/bugs_nfs_bug-1116503.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/000-flaky/bugs_nfs_bug-1116503.t</a></div><div class='hunk'>@@ -0,0 +1,47 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+#</div><div class='add'>+# Verify that mounting NFS over UDP (MOUNT service only) works.</div><div class='add'>+#</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../include.rc</div><div class='add'>+. $(dirname $0)/../volume.rc</div><div class='add'>+. $(dirname $0)/../nfs.rc</div><div class='add'>+</div><div class='add'>+#G_TESTDEF_TEST_STATUS_CENTOS6=NFS_TEST</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/$V0</div><div class='add'>+TEST $CLI volume set $V0 nfs.disable false</div><div class='add'>+TEST $CLI volume set $V0 nfs.mount-udp on</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+EXPECT_WITHIN $NFS_EXPORT_TIMEOUT "1" is_nfs_export_available;</div><div class='add'>+</div><div class='add'>+TEST mount_nfs $H0:/$V0 $N0 nolock,mountproto=udp,proto=tcp;</div><div class='add'>+TEST mkdir -p $N0/foo/bar</div><div class='add'>+TEST ls $N0/foo</div><div class='add'>+TEST ls $N0/foo/bar</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $N0</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $NFS_EXPORT_TIMEOUT "1" is_nfs_export_available;</div><div class='add'>+TEST mount_nfs $H0:/$V0/foo $N0 nolock,mountproto=udp,proto=tcp;</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $N0</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $NFS_EXPORT_TIMEOUT "1" is_nfs_export_available;</div><div class='add'>+TEST mount_nfs $H0:/$V0/foo/bar $N0 nolock,mountproto=udp,proto=tcp;</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $N0</div><div class='add'>+</div><div class='add'>+TEST $CLI volume set $V0 nfs.addr-namelookup on</div><div class='add'>+TEST $CLI volume set $V0 nfs.rpc-auth-allow $H0</div><div class='add'>+EXPECT_WITHIN $NFS_EXPORT_TIMEOUT "1" is_nfs_export_available;</div><div class='add'>+TEST mount_nfs $H0:/$V0/foo/bar $N0 nolock,mountproto=udp,proto=tcp;</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $N0</div><div class='add'>+</div><div class='add'>+TEST $CLI volume set $V0 nfs.rpc-auth-reject $H0</div><div class='add'>+EXPECT_WITHIN $NFS_EXPORT_TIMEOUT "1" is_nfs_export_available;</div><div class='add'>+TEST ! mount_nfs $H0:/$V0/foo/bar $N0 nolock,mountproto=udp,proto=tcp;</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/000-flaky/features_lock-migration_lkmigration-set-option.t b/tests/000-flaky/features_lock-migration_lkmigration-set-option.t<br/>new file mode 100644<br/>index 00000000000..1327ef3579f<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/000-flaky/features_lock-migration_lkmigration-set-option.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/000-flaky/features_lock-migration_lkmigration-set-option.t</a></div><div class='hunk'>@@ -0,0 +1,34 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+# Test to check</div><div class='add'>+. $(dirname $0)/../include.rc</div><div class='add'>+. $(dirname $0)/../volume.rc</div><div class='add'>+</div><div class='add'>+#Check lock-migration set option sanity</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/brick1 $H0:$B0/brick2</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+TEST $CLI volume set $V0 lock-migration on</div><div class='add'>+EXPECT "on" echo `$CLI volume info | grep lock-migration | awk '{print $2}'`</div><div class='add'>+TEST $CLI volume set $V0 lock-migration off</div><div class='add'>+EXPECT "off" echo `$CLI volume info | grep lock-migration | awk '{print $2}'`</div><div class='add'>+TEST ! $CLI volume set $V0 lock-migration garbage</div><div class='add'>+#make sure it is still off</div><div class='add'>+EXPECT "off" echo `$CLI volume info | grep lock-migration | awk '{print $2}'`</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+TEST $CLI volume stop $V0;</div><div class='add'>+TEST $CLI volume delete $V0;</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+#create a afr volume and make sure option setting fails</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 replica 2 $H0:$B0/brick1 $H0:$B0/brick2</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+TEST ! $CLI volume set $V0 lock-migration on</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/README.md b/tests/README.md<br/>new file mode 100644<br/>index 00000000000..09c98576987<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/README.md?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/README.md</a></div><div class='hunk'>@@ -0,0 +1,43 @@</div><div class='add'>+Regression tests framework for GlusterFS</div><div class='add'>+========================================</div><div class='add'>+</div><div class='add'>+## Prereq</div><div class='add'>+- Build and install the version of glusterfs with your changes. Make</div><div class='add'>+  sure the installed version is accessible from $PATH.</div><div class='add'>+</div><div class='add'>+## Prereq for geo-rep regression tests.</div><div class='add'>+- Passwordless ssh on the test system to itself</div><div class='add'>+- arequal-checksum installed on the test-system.</div><div class='add'>+  You can find the repo here - https://github.com/raghavendrabhat/arequal</div><div class='add'>+</div><div class='add'>+## How-To</div><div class='add'>+- To mount glusterfs, NEVER use 'mount -t glusterfs', instead use</div><div class='add'>+  'glusterfs -s ' method. This is because with the patch build setup</div><div class='add'>+  doesnot install the /sbin/mount.glusterfs necessary, where as the</div><div class='add'>+  glusterfs binary will be accessible with $PATH, and will pick the</div><div class='add'>+  right version.</div><div class='add'>+- (optional) Set environment variables to specify location of</div><div class='add'>+  export directories and mount points. Unless you have special</div><div class='add'>+  requirements, the defaults should just work. The variables</div><div class='add'>+  themselves can be found at the top of tests/include.rc. All</div><div class='add'>+  of them can be overriden with environment variables.</div><div class='add'>+</div><div class='add'>+## Usage</div><div class='add'>+- Execute `/usr/share/glusterfs/run-tests.sh` as root.</div><div class='add'>+</div><div class='add'>+- If you want to run individual tests located in `/usr/share/glusterfs/tests`</div><div class='add'>+  as opposed to the full test-suite, invoke it as</div><div class='add'>+  `/usr/share/glusterfs/run-tests.sh [pattern]*`, where pattern can be:</div><div class='add'>+    - the trailing parts of the full path of a test,</div><div class='add'>+      e.g. `tests/basic/mount.t`</div><div class='add'>+    - the name of a file or directory, e.g `self-heal.t` or `basic/`</div><div class='add'>+    - bug number, which will match against numbered bugs in the</div><div class='add'>+      `tests/bugs/` directory.</div><div class='add'>+    - a glob pattern (see `man 7 glob` for mor info on globs)</div><div class='add'>+</div><div class='add'>+- To execute single ".t" file, use "prove -vf /path/to/.t"</div><div class='add'>+- If some test cases fail, report to GlusterFS community at</div><div class='add'>+  `gluster-devel@gluster.org`.</div><div class='add'>+</div><div class='add'>+## Reminder</div><div class='add'>+- BE WARNED THAT THE TEST CASES DELETE ``GLUSTERD_WORKDIR`` * !!!</div><div class='head'>diff --git a/tests/afr.rc b/tests/afr.rc<br/>new file mode 100644<br/>index 00000000000..241789903ba<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/afr.rc?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/afr.rc</a></div><div class='hunk'>@@ -0,0 +1,123 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+function create_brick_xattrop_entry {</div><div class='add'>+        local xattrop_dir=$(afr_get_index_path $1)</div><div class='add'>+        local base_entry=`ls $xattrop_dir|grep xattrop`</div><div class='add'>+        local gfid_str</div><div class='add'>+        local params=`echo "$@" | cut -d' ' -f2-`</div><div class='add'>+        echo $params</div><div class='add'>+</div><div class='add'>+        for file in $params</div><div class='add'>+        do</div><div class='add'>+                gfid_str=$(gf_gfid_xattr_to_str $(gf_get_gfid_xattr $1/$file))</div><div class='add'>+                ln $xattrop_dir/$base_entry $xattrop_dir/$gfid_str</div><div class='add'>+        done</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function diff_dirs {</div><div class='add'>+        diff &lt;(ls $1 | sort) &lt;(ls $2 | sort)</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function heal_status {</div><div class='add'>+        local f1_path="${1}/${3}"</div><div class='add'>+        local f2_path="${2}/${3}"</div><div class='add'>+        local zero_xattr="000000000000000000000000"</div><div class='add'>+        local insync=""</div><div class='add'>+        diff_dirs $f1_path $f2_path</div><div class='add'>+        if [ $? -eq 0 ];</div><div class='add'>+        then</div><div class='add'>+                insync="Y"</div><div class='add'>+        else</div><div class='add'>+                insync="N"</div><div class='add'>+        fi</div><div class='add'>+        local xattr11=$(get_hex_xattr trusted.afr.$V0-client-0 $f1_path)</div><div class='add'>+        local xattr12=$(get_hex_xattr trusted.afr.$V0-client-1 $f1_path)</div><div class='add'>+        local xattr21=$(get_hex_xattr trusted.afr.$V0-client-0 $f2_path)</div><div class='add'>+        local xattr22=$(get_hex_xattr trusted.afr.$V0-client-1 $f2_path)</div><div class='add'>+        local dirty1=$(get_hex_xattr trusted.afr.dirty $f1_path)</div><div class='add'>+        local dirty2=$(get_hex_xattr trusted.afr.dirty $f2_path)</div><div class='add'>+        if [ -z $xattr11 ]; then xattr11="000000000000000000000000"; fi</div><div class='add'>+        if [ -z $xattr12 ]; then xattr12="000000000000000000000000"; fi</div><div class='add'>+        if [ -z $xattr21 ]; then xattr21="000000000000000000000000"; fi</div><div class='add'>+        if [ -z $xattr22 ]; then xattr22="000000000000000000000000"; fi</div><div class='add'>+        if [ -z $dirty1 ]; then dirty1="000000000000000000000000"; fi</div><div class='add'>+        if [ -z $dirty2 ]; then dirty2="000000000000000000000000"; fi</div><div class='add'>+        echo ${insync}${xattr11}${xattr12}${xattr21}${xattr22}${dirty1}${dirty2}</div><div class='add'>+}</div><div class='add'>+# Check if given dir's self-heal is done</div><div class='add'>+function is_dir_heal_done {</div><div class='add'>+        local zero_xattr="000000000000000000000000"</div><div class='add'>+        if [ "$(heal_status $@)" == "Y${zero_xattr}${zero_xattr}${zero_xattr}${zero_xattr}${zero_xattr}${zero_xattr}" ];</div><div class='add'>+        then</div><div class='add'>+                echo "Y"</div><div class='add'>+        else</div><div class='add'>+                echo "N"</div><div class='add'>+        fi</div><div class='add'>+}</div><div class='add'>+# Check if the given file's self-heal is done</div><div class='add'>+function is_file_heal_done {</div><div class='add'>+        local f1_path="${1}/${3}"</div><div class='add'>+        local f2_path="${2}/${3}"</div><div class='add'>+        local zxattr="000000000000000000000000"</div><div class='add'>+        local size1=$(stat -c "%s" $f1_path)</div><div class='add'>+        local size2=$(stat -c "%s" $f2_path)</div><div class='add'>+        local diff=$((size1-size2))</div><div class='add'>+        local x11=$(get_hex_xattr trusted.afr.$V0-client-0 $f1_path)</div><div class='add'>+        local x12=$(get_hex_xattr trusted.afr.$V0-client-1 $f1_path)</div><div class='add'>+        local x21=$(get_hex_xattr trusted.afr.$V0-client-0 $f2_path)</div><div class='add'>+        local x22=$(get_hex_xattr trusted.afr.$V0-client-1 $f2_path)</div><div class='add'>+        local dirty1=$(get_hex_xattr trusted.afr.dirty $f1_path)</div><div class='add'>+        local dirty2=$(get_hex_xattr trusted.afr.dirty $f2_path)</div><div class='add'>+        if [ -z $x11 ]; then x11="000000000000000000000000"; fi</div><div class='add'>+        if [ -z $x12 ]; then x12="000000000000000000000000"; fi</div><div class='add'>+        if [ -z $x21 ]; then x21="000000000000000000000000"; fi</div><div class='add'>+        if [ -z $x22 ]; then x22="000000000000000000000000"; fi</div><div class='add'>+        if [ -z $dirty1 ]; then dirty1="000000000000000000000000"; fi</div><div class='add'>+        if [ -z $dirty2 ]; then dirty2="000000000000000000000000"; fi</div><div class='add'>+        if [ "${diff}${x11}${x12}${x21}${x22}${dirty1}${dirty2}" == "0${zxattr}${zxattr}${zxattr}${zxattr}${zxattr}${zxattr}" ];</div><div class='add'>+        then</div><div class='add'>+             echo "Y"</div><div class='add'>+        else</div><div class='add'>+             echo "N"</div><div class='add'>+        fi</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#count the number of entries marked for self-heal</div><div class='add'>+#in brick $1's index</div><div class='add'>+</div><div class='add'>+function count_index_entries()</div><div class='add'>+{</div><div class='add'>+    ls $1/.glusterfs/indices/xattrop | wc -l</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function afr_up_status()</div><div class='add'>+{</div><div class='add'>+        local v=$1</div><div class='add'>+        local m=$2</div><div class='add'>+        local replica_id=$3</div><div class='add'>+        grep -E "^up = " $m/.meta/graphs/active/${v}-replicate-${replica_id}/private | cut -f2 -d'='</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function get_quorum_type()</div><div class='add'>+{</div><div class='add'>+        local m="$1"</div><div class='add'>+        local v="$2"</div><div class='add'>+        local repl_id="$3"</div><div class='add'>+        cat $m/.meta/graphs/active/$v-replicate-$repl_id/private|grep quorum-type|awk '{print $3}'</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function afr_private_key_value()</div><div class='add'>+{</div><div class='add'>+        local v=$1</div><div class='add'>+        local m=$2</div><div class='add'>+        local replica_id=$3</div><div class='add'>+        local key=$4</div><div class='add'>+#xargs at the end will strip leading spaces</div><div class='add'>+        grep -E "^${key} = " $m/.meta/graphs/active/${v}-replicate-${replica_id}/private | cut -f2 -d'=' | xargs</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function afr_anon_entry_count()</div><div class='add'>+{</div><div class='add'>+    local b=$1</div><div class='add'>+    ls $b/.glusterfs-anonymous-inode* | wc -l</div><div class='add'>+}</div><div class='head'>diff --git a/tests/basic/0symbol-check.t b/tests/basic/0symbol-check.t<br/>new file mode 100755<br/>index 00000000000..69485a516af<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/0symbol-check.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/0symbol-check.t</a></div><div class='hunk'>@@ -0,0 +1,46 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+#</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../include.rc</div><div class='add'>+</div><div class='add'>+buildscratch=""</div><div class='add'>+</div><div class='add'>+case $OSTYPE in</div><div class='add'>+Linux)</div><div class='add'>+        ;;</div><div class='add'>+*)</div><div class='add'>+        echo "Skip Linux specific test" &gt;&amp;2</div><div class='add'>+        SKIP_TESTS</div><div class='add'>+        exit 0</div><div class='add'>+        ;;</div><div class='add'>+esac</div><div class='add'>+</div><div class='add'>+# look in the usual places for the build tree</div><div class='add'>+if [ -d /build/scratch ]; then</div><div class='add'>+        buildscratch="/build/scratch"</div><div class='add'>+else</div><div class='add'>+        # might be in developer's tree</div><div class='add'>+        if [ -d ./libglusterfs/src/.libs ]; then</div><div class='add'>+                buildscratch="."</div><div class='add'>+        elif [ -d ../libglusterfs/src/.libs ]; then</div><div class='add'>+                buildscratch=".."</div><div class='add'>+        fi</div><div class='add'>+fi</div><div class='add'>+</div><div class='add'>+if [ -z ${buildscratch} ]; then</div><div class='add'>+        echo "could find build tree in /build/scratch, . or .." &gt;&amp;2</div><div class='add'>+        SKIP_TESTS</div><div class='add'>+        exit 0</div><div class='add'>+fi</div><div class='add'>+</div><div class='add'>+# check symbols</div><div class='add'>+</div><div class='add'>+rm -f ./.symbol-check-errors</div><div class='add'>+</div><div class='add'>+TEST find ${buildscratch} -name \*.o -exec ./tests/basic/symbol-check.sh {} \\\;</div><div class='add'>+</div><div class='add'>+TEST [ ! -e ./.symbol-check-errors ]</div><div class='add'>+</div><div class='add'>+rm -f ./.symbol-check-errors</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/basic/afr/add-brick-self-heal.t b/tests/basic/afr/add-brick-self-heal.t<br/>new file mode 100644<br/>index 00000000000..c847e22977f<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/afr/add-brick-self-heal.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/afr/add-brick-self-heal.t</a></div><div class='hunk'>@@ -0,0 +1,74 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 replica 2 $H0:$B0/${V0}{0,1}</div><div class='add'>+EXPECT 'Created' volinfo_field $V0 'Status';</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+EXPECT 'Started' volinfo_field $V0 'Status';</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status $V0 $H0 $B0/${V0}0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status $V0 $H0 $B0/${V0}1</div><div class='add'>+</div><div class='add'>+TEST $CLI volume set $V0 cluster.data-self-heal off</div><div class='add'>+TEST $CLI volume set $V0 cluster.metadata-self-heal off</div><div class='add'>+TEST $CLI volume set $V0 cluster.entry-self-heal off</div><div class='add'>+TEST $CLI volume set $V0 cluster.heal-timeout 5</div><div class='add'>+</div><div class='add'>+TEST $CLI volume set $V0 self-heal-daemon off</div><div class='add'>+TEST $GFS --volfile-id=$V0 --volfile-server=$H0 $M0;</div><div class='add'>+</div><div class='add'>+# Create files</div><div class='add'>+for i in {1..5}</div><div class='add'>+do</div><div class='add'>+        echo $i &gt; $M0/file$i.txt</div><div class='add'>+done</div><div class='add'>+</div><div class='add'>+# Metadata changes</div><div class='add'>+TEST setfattr -n user.test -v qwerty $M0/file5.txt</div><div class='add'>+</div><div class='add'>+# Add brick1</div><div class='add'>+TEST $CLI volume add-brick $V0 replica 3 $H0:$B0/${V0}2</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status $V0 $H0 $B0/${V0}2</div><div class='add'>+</div><div class='add'>+# New-brick should accuse the old-bricks (Simulating case for data-loss)</div><div class='add'>+TEST setfattr -n trusted.afr.$V0-client-0 -v 0x000000000000000000000001 $B0/${V0}2/</div><div class='add'>+TEST setfattr -n trusted.afr.$V0-client-1 -v 0x000000000000000000000001 $B0/${V0}2/</div><div class='add'>+</div><div class='add'>+# Check if pending xattr and dirty-xattr are set for newly-added-brick</div><div class='add'>+EXPECT "000000000000000100000001" get_hex_xattr trusted.afr.$V0-client-2 $B0/${V0}0</div><div class='add'>+EXPECT "000000000000000100000001" get_hex_xattr trusted.afr.$V0-client-2 $B0/${V0}1</div><div class='add'>+EXPECT "000000000000000000000001" get_hex_xattr trusted.afr.dirty $B0/${V0}2</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 1</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 2</div><div class='add'>+</div><div class='add'>+TEST $CLI volume set $V0 self-heal-daemon on</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "Y" glustershd_up_status</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 1</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 2</div><div class='add'>+TEST $CLI volume heal $V0</div><div class='add'>+</div><div class='add'>+# Wait for heal to complete</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "^0$" get_pending_heal_count $V0</div><div class='add'>+</div><div class='add'>+# Check if entry-heal has happened</div><div class='add'>+TEST diff &lt;(ls $B0/${V0}0 | sort) &lt;(ls $B0/${V0}2 | sort)</div><div class='add'>+TEST diff &lt;(ls $B0/${V0}1 | sort) &lt;(ls $B0/${V0}2 | sort)</div><div class='add'>+</div><div class='add'>+# Test if data was healed</div><div class='add'>+TEST diff $B0/${V0}0/file1.txt $B0/${V0}2/file1.txt</div><div class='add'>+</div><div class='add'>+# Test if metadata was healed and exists on both the bricks</div><div class='add'>+EXPECT "qwerty" get_text_xattr user.test $B0/${V0}2/file5.txt</div><div class='add'>+EXPECT "qwerty" get_text_xattr user.test $B0/${V0}0/file5.txt</div><div class='add'>+</div><div class='add'>+EXPECT "000000000000000000000000" get_hex_xattr trusted.afr.$V0-client-2 $B0/${V0}0</div><div class='add'>+EXPECT "000000000000000000000000" get_hex_xattr trusted.afr.$V0-client-2 $B0/${V0}1</div><div class='add'>+EXPECT "000000000000000000000000" get_hex_xattr trusted.afr.dirty $B0/${V0}2</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/basic/afr/afr-anon-inode-no-quorum.t b/tests/basic/afr/afr-anon-inode-no-quorum.t<br/>new file mode 100644<br/>index 00000000000..896ba0c9b2c<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/afr/afr-anon-inode-no-quorum.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/afr/afr-anon-inode-no-quorum.t</a></div><div class='hunk'>@@ -0,0 +1,63 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+#Test that anon-inode entry is not cleaned up as long as there exists at least</div><div class='add'>+#one valid entry</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+. $(dirname $0)/../../afr.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 replica 2 $H0:$B0/${V0}{0,1}</div><div class='add'>+TEST $CLI volume heal $V0 disable</div><div class='add'>+TEST $CLI volume set $V0 performance.write-behind off</div><div class='add'>+TEST $CLI volume set $V0 performance.read-ahead off</div><div class='add'>+TEST $CLI volume set $V0 performance.readdir-ahead off</div><div class='add'>+TEST $CLI volume set $V0 performance.open-behind off</div><div class='add'>+TEST $CLI volume set $V0 performance.stat-prefetch off</div><div class='add'>+TEST $CLI volume set $V0 performance.io-cache off</div><div class='add'>+TEST $CLI volume set $V0 performance.quick-read off</div><div class='add'>+TEST $CLI volume set $V0 cluster.entry-self-heal off</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+TEST $GFS --volfile-id=/$V0 --volfile-server=$H0 $M0</div><div class='add'>+</div><div class='add'>+TEST touch $M0/a $M0/b</div><div class='add'>+</div><div class='add'>+gfid_a=$(gf_gfid_xattr_to_str $(gf_get_gfid_xattr $B0/${V0}0/a))</div><div class='add'>+gfid_b=$(gf_gfid_xattr_to_str $(gf_get_gfid_xattr $B0/${V0}0/b))</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}0</div><div class='add'>+TEST mv $M0/a $M0/a-new</div><div class='add'>+TEST mv $M0/b $M0/b-new</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status $V0 0</div><div class='add'>+TEST ! ls $M0/a</div><div class='add'>+TEST ! ls $M0/b</div><div class='add'>+anon_inode_name=$(ls -a $B0/${V0}0 | grep glusterfs-anonymous-inode)</div><div class='add'>+TEST stat $B0/${V0}0/$anon_inode_name/$gfid_a</div><div class='add'>+TEST stat $B0/${V0}0/$anon_inode_name/$gfid_b</div><div class='add'>+#Make sure index heal doesn't happen after enabling heal</div><div class='add'>+TEST setfattr -x trusted.afr.$V0-client-0 $B0/${V0}1</div><div class='add'>+TEST rm -f $B0/${V0}1/.glusterfs/indices/xattrop/*</div><div class='add'>+TEST $CLI volume heal $V0 enable</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "Y" glustershd_up_status</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 1</div><div class='add'>+TEST $CLI volume heal $V0</div><div class='add'>+#Allow time for a scan</div><div class='add'>+sleep 5</div><div class='add'>+TEST stat $B0/${V0}0/$anon_inode_name/$gfid_a</div><div class='add'>+TEST stat $B0/${V0}0/$anon_inode_name/$gfid_b</div><div class='add'>+inum_b=$(STAT_INO $B0/${V0}0/$anon_inode_name/$gfid_b)</div><div class='add'>+TEST rm -f $M0/a-new</div><div class='add'>+TEST stat $M0/b-new</div><div class='add'>+</div><div class='add'>+TEST $CLI volume heal $V0</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "^0$" afr_anon_entry_count $B0/${V0}0</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "^0$" afr_anon_entry_count $B0/${V0}1</div><div class='add'>+EXPECT "$inum_b" STAT_INO $B0/${V0}0/b-new</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/basic/afr/afr-anon-inode.t b/tests/basic/afr/afr-anon-inode.t<br/>new file mode 100644<br/>index 00000000000..f4cf37a2fa0<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/afr/afr-anon-inode.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/afr/afr-anon-inode.t</a></div><div class='hunk'>@@ -0,0 +1,114 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+#Tests that afr-anon-inode test cases work fine as expected</div><div class='add'>+#These are cases where in entry-heal/name-heal we dont know entry for an inode</div><div class='add'>+#so these inodes are kept in a special directory</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+. $(dirname $0)/../../afr.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 replica 3 $H0:$B0/${V0}{0..2}</div><div class='add'>+TEST $CLI volume set $V0 performance.quick-read off</div><div class='add'>+TEST $CLI volume set $V0 performance.io-cache off</div><div class='add'>+TEST $CLI volume set $V0 performance.write-behind off</div><div class='add'>+TEST $CLI volume set $V0 performance.stat-prefetch off</div><div class='add'>+TEST $CLI volume set $V0 performance.read-ahead off</div><div class='add'>+TEST $CLI volume set $V0 performance.open-behind off</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+TEST $GFS --volfile-id=$V0 --volfile-server=$H0 $M0;</div><div class='add'>+EXPECT "^1$" afr_private_key_value $V0 $M0 0 "use-anonymous-inode"</div><div class='add'>+TEST $CLI volume set $V0 cluster.use-anonymous-inode no</div><div class='add'>+EXPECT_WITHIN $CONFIG_UPDATE_TIMEOUT "^0$" afr_private_key_value $V0 $M0 0 "use-anonymous-inode"</div><div class='add'>+TEST $CLI volume set $V0 cluster.use-anonymous-inode yes</div><div class='add'>+EXPECT_WITHIN $CONFIG_UPDATE_TIMEOUT "^1$" afr_private_key_value $V0 $M0 0 "use-anonymous-inode"</div><div class='add'>+TEST mkdir -p $M0/d1/b $M0/d2/a</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}0</div><div class='add'>+TEST mv $M0/d2/a $M0/d1</div><div class='add'>+TEST mv $M0/d1/b $M0/d2</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "^0$" get_pending_heal_count $V0</div><div class='add'>+anon_inode_name=$(ls -a $B0/${V0}0 | grep glusterfs-anonymous-inode)</div><div class='add'>+TEST [[ -d $B0/${V0}1/$anon_inode_name ]]</div><div class='add'>+TEST [[ -d $B0/${V0}2/$anon_inode_name ]]</div><div class='add'>+anon_gfid=$(gf_get_gfid_xattr $B0/${V0}0/$anon_inode_name)</div><div class='add'>+EXPECT "$anon_gfid" gf_get_gfid_xattr $B0/${V0}1/$anon_inode_name</div><div class='add'>+EXPECT "$anon_gfid" gf_get_gfid_xattr $B0/${V0}2/$anon_inode_name</div><div class='add'>+</div><div class='add'>+TEST ! ls $M0/$anon_inode_name</div><div class='add'>+EXPECT "^4$" echo $(ls -a $M0 | wc -l)</div><div class='add'>+</div><div class='add'>+#Test purging code path by shd</div><div class='add'>+TEST $CLI volume heal $V0 disable</div><div class='add'>+TEST mkdir $M0/l0 $M0/l1 $M0/l2</div><div class='add'>+TEST touch $M0/del-file $M0/del-file-nolink $M0/l0/file</div><div class='add'>+TEST ln $M0/del-file $M0/del-file-link</div><div class='add'>+TEST ln $M0/l0/file $M0/l1/file-link1</div><div class='add'>+TEST ln $M0/l0/file $M0/l2/file-link2</div><div class='add'>+TEST mkdir -p $M0/del-recursive-dir/d1</div><div class='add'>+</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}0</div><div class='add'>+TEST rm -f $M0/del-file $M0/del-file-nolink</div><div class='add'>+TEST rm -rf $M0/del-recursive-dir</div><div class='add'>+TEST mv $M0/d1/a $M0/d2</div><div class='add'>+TEST mv $M0/l0/file $M0/l0/renamed-file</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "^1$" afr_child_up_status $V0 0</div><div class='add'>+</div><div class='add'>+nolink_gfid=$(gf_gfid_xattr_to_str $(gf_get_gfid_xattr $B0/${V0}0/del-file-nolink))</div><div class='add'>+link_gfid=$(gf_gfid_xattr_to_str $(gf_get_gfid_xattr $B0/${V0}0/del-file))</div><div class='add'>+dir_gfid=$(gf_gfid_xattr_to_str $(gf_get_gfid_xattr $B0/${V0}0/del-recursive-dir))</div><div class='add'>+rename_dir_gfid=$(gf_gfid_xattr_to_str $(gf_get_gfid_xattr $B0/${V0}0/d1/a))</div><div class='add'>+rename_file_gfid=$(gf_gfid_xattr_to_str $(gf_get_gfid_xattr $B0/${V0}0/l0/file))</div><div class='add'>+TEST ! stat $M0/del-file</div><div class='add'>+TEST stat $B0/${V0}0/$anon_inode_name/$link_gfid</div><div class='add'>+TEST ! stat $M0/del-file-nolink</div><div class='add'>+TEST ! stat $B0/${V0}0/$anon_inode_name/$nolink_gfid</div><div class='add'>+TEST ! stat $M0/del-recursive-dir</div><div class='add'>+TEST stat $B0/${V0}0/$anon_inode_name/$dir_gfid</div><div class='add'>+TEST ! stat $M0/d1/a</div><div class='add'>+TEST stat $B0/${V0}0/$anon_inode_name/$rename_dir_gfid</div><div class='add'>+TEST ! stat $M0/l0/file</div><div class='add'>+TEST stat $B0/${V0}0/$anon_inode_name/$rename_file_gfid</div><div class='add'>+</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}1</div><div class='add'>+TEST mv $M0/l1/file-link1 $M0/l1/renamed-file-link1</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "^1$" afr_child_up_status $V0 1</div><div class='add'>+TEST ! stat $M0/l1/file-link1</div><div class='add'>+TEST stat $B0/${V0}1/$anon_inode_name/$rename_file_gfid</div><div class='add'>+</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}2</div><div class='add'>+TEST mv $M0/l2/file-link2 $M0/l2/renamed-file-link2</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "^1$" afr_child_up_status $V0 2</div><div class='add'>+TEST ! stat $M0/l2/file-link2</div><div class='add'>+TEST stat $B0/${V0}2/$anon_inode_name/$rename_file_gfid</div><div class='add'>+</div><div class='add'>+#Simulate only anon-inodes present in all bricks</div><div class='add'>+TEST rm -f $M0/l0/renamed-file $M0/l1/renamed-file-link1 $M0/l2/renamed-file-link2</div><div class='add'>+</div><div class='add'>+#Test that shd doesn't cleanup anon-inodes when some bricks are down</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}1</div><div class='add'>+TEST $CLI volume heal $V0 enable</div><div class='add'>+$CLI volume heal $V0</div><div class='add'>+sleep 5 #Allow time for completion of one scan</div><div class='add'>+TEST stat $B0/${V0}0/$anon_inode_name/$link_gfid</div><div class='add'>+TEST stat $B0/${V0}0/$anon_inode_name/$rename_dir_gfid</div><div class='add'>+TEST stat $B0/${V0}0/$anon_inode_name/$dir_gfid</div><div class='add'>+rename_dir_inum=$(STAT_INO $B0/${V0}0/$anon_inode_name/$rename_dir_gfid)</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "^1$" afr_child_up_status $V0 1</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "^0$" get_pending_heal_count $V0</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "^0$" afr_anon_entry_count $B0/${V0}0</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "^0$" afr_anon_entry_count $B0/${V0}1</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "^0$" afr_anon_entry_count $B0/${V0}2</div><div class='add'>+</div><div class='add'>+#Test that rename indeed happened instead of rmdir/mkdir</div><div class='add'>+renamed_dir_inum=$(STAT_INO $B0/${V0}0/d2/a)</div><div class='add'>+EXPECT "$rename_dir_inum" echo $renamed_dir_inum</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/basic/afr/afr-no-fsync.t b/tests/basic/afr/afr-no-fsync.t<br/>new file mode 100644<br/>index 00000000000..0966d9b0a11<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/afr/afr-no-fsync.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/afr/afr-no-fsync.t</a></div><div class='hunk'>@@ -0,0 +1,20 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+#Tests that sequential write workload doesn't lead to FSYNCs</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 replica 3 $H0:$B0/brick{0,1,3}</div><div class='add'>+TEST $CLI volume set $V0 features.shard on</div><div class='add'>+TEST $CLI volume set $V0 performance.flush-behind off</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+TEST $CLI volume profile $V0 start</div><div class='add'>+TEST $GFS --volfile-id=$V0 --volfile-server=$H0 $M0;</div><div class='add'>+TEST dd if=/dev/zero of=$M0/a bs=1M count=500</div><div class='add'>+TEST ! "$CLI volume profile $V0 info incremental | grep FSYNC"</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/basic/afr/afr-read-hash-mode.t b/tests/basic/afr/afr-read-hash-mode.t<br/>new file mode 100644<br/>index 00000000000..eeff10d8ebd<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/afr/afr-read-hash-mode.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/afr/afr-read-hash-mode.t</a></div><div class='hunk'>@@ -0,0 +1,56 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='add'>+</div><div class='add'>+function reads_brick_count {</div><div class='add'>+        $CLI volume profile $V0 info incremental | grep -w READ | wc -l</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 replica 3 arbiter 1 $H0:$B0/${V0}{0..2}</div><div class='add'>+</div><div class='add'>+TEST $CLI volume set $V0 cluster.choose-local off</div><div class='add'>+TEST $CLI volume set $V0 performance.quick-read off</div><div class='add'>+TEST $CLI volume set $V0 performance.io-cache off</div><div class='add'>+TEST $CLI volume set $V0 performance.write-behind off</div><div class='add'>+TEST $CLI volume set $V0 performance.stat-prefetch off</div><div class='add'>+TEST $CLI volume set $V0 performance.read-ahead off</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+# Disable all caching</div><div class='add'>+TEST glusterfs --entry-timeout=0 --attribute-timeout=0 -s $H0 --volfile-id $V0 $M0</div><div class='add'>+TEST dd if=/dev/urandom of=$M0/FILE bs=1M count=8</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+</div><div class='add'>+# TEST if the option gives the intended behavior. The way we perform this test</div><div class='add'>+# is by performing reads from the mount and write to /dev/null. If the</div><div class='add'>+# read-hash-mode is 3, then for a given file, more than 1 brick should serve the</div><div class='add'>+# read-fops where as with the default read-hash-mode (i.e. 1), only 1 brick will.</div><div class='add'>+</div><div class='add'>+# read-hash-mode=1</div><div class='add'>+TEST glusterfs --entry-timeout=0 --attribute-timeout=0 -s $H0 --volfile-id $V0 $M0</div><div class='add'>+EXPECT "1" mount_get_option_value $M0 $V0-replicate-0 read-hash-mode</div><div class='add'>+TEST $CLI volume profile $V0 start</div><div class='add'>+TEST dd if=$M0/FILE of=/dev/null bs=1M</div><div class='add'>+count=`reads_brick_count`</div><div class='add'>+TEST [ $count -eq 1 ]</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+</div><div class='add'>+# read-hash-mode=3</div><div class='add'>+TEST glusterfs --entry-timeout=0 --attribute-timeout=0 -s $H0 --volfile-id $V0 $M0</div><div class='add'>+TEST $CLI volume set $V0 cluster.read-hash-mode 3</div><div class='add'>+EXPECT_WITHIN $CONFIG_UPDATE_TIMEOUT "3" mount_get_option_value $M0 $V0-replicate-0 read-hash-mode</div><div class='add'>+TEST $CLI volume profile $V0 info clear</div><div class='add'>+TEST dd if=$M0/FILE of=/dev/null bs=1M</div><div class='add'>+count=`reads_brick_count`</div><div class='add'>+TEST [ $count -eq 2 ]</div><div class='add'>+</div><div class='add'>+# Check that the arbiter did not serve any reads</div><div class='add'>+arbiter_reads=$($CLI volume top $V0 read brick $H0:$B0/${V0}2|grep FILE|awk '{print $1}')</div><div class='add'>+TEST [ -z $arbiter_reads ]</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/basic/afr/afr-seek.t b/tests/basic/afr/afr-seek.t<br/>new file mode 100644<br/>index 00000000000..c12ee011660<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/afr/afr-seek.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/afr/afr-seek.t</a></div><div class='hunk'>@@ -0,0 +1,55 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='add'>+</div><div class='add'>+SEEK=$(dirname $0)/seek</div><div class='add'>+build_tester $(dirname $0)/../seek.c -o ${SEEK}</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume info</div><div class='add'>+</div><div class='add'>+TEST mkdir -p $B0/${V0}{0..2}</div><div class='add'>+TEST $CLI volume create $V0 replica 3 $H0:$B0/${V0}{0..2}</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+TEST $GFS -s $H0 --volfile-id $V0 $M0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 1</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 2</div><div class='add'>+</div><div class='add'>+TEST ${SEEK} create ${M0}/test 0 1 1048576 1</div><div class='add'>+# Determine underlying filesystem allocation block size</div><div class='add'>+BSIZE="$(($(${SEEK} scan ${M0}/test hole 0) * 2))"</div><div class='add'>+</div><div class='add'>+TEST ${SEEK} create ${M0}/test 0 ${BSIZE} $((${BSIZE} * 4 + 512)) ${BSIZE}</div><div class='add'>+</div><div class='add'>+EXPECT "^0$" ${SEEK} scan ${M0}/test data 0</div><div class='add'>+EXPECT "^$((${BSIZE} / 2))$" ${SEEK} scan ${M0}/test data $((${BSIZE} / 2))</div><div class='add'>+EXPECT "^$((${BSIZE} - 1))$" ${SEEK} scan ${M0}/test data $((${BSIZE} - 1))</div><div class='add'>+EXPECT "^$((${BSIZE} * 4))$" ${SEEK} scan ${M0}/test data ${BSIZE}</div><div class='add'>+EXPECT "^$((${BSIZE} * 4))$" ${SEEK} scan ${M0}/test data $((${BSIZE} * 4))</div><div class='add'>+EXPECT "^$((${BSIZE} * 5))$" ${SEEK} scan ${M0}/test data $((${BSIZE} * 5))</div><div class='add'>+EXPECT "^$((${BSIZE} * 5 + 511))$" ${SEEK} scan ${M0}/test data $((${BSIZE} * 5 + 511))</div><div class='add'>+EXPECT "^ENXIO$" ${SEEK} scan ${M0}/test data $((${BSIZE} * 5 + 512))</div><div class='add'>+EXPECT "^ENXIO$" ${SEEK} scan ${M0}/test data $((${BSIZE} * 6))</div><div class='add'>+</div><div class='add'>+EXPECT "^${BSIZE}$" ${SEEK} scan ${M0}/test hole 0</div><div class='add'>+EXPECT "^${BSIZE}$" ${SEEK} scan ${M0}/test hole $((${BSIZE} / 2))</div><div class='add'>+EXPECT "^${BSIZE}$" ${SEEK} scan ${M0}/test hole $((${BSIZE} - 1))</div><div class='add'>+EXPECT "^${BSIZE}$" ${SEEK} scan ${M0}/test hole ${BSIZE}</div><div class='add'>+EXPECT "^$((${BSIZE} * 5 + 512))$" ${SEEK} scan ${M0}/test hole $((${BSIZE} * 4))</div><div class='add'>+EXPECT "^$((${BSIZE} * 5 + 512))$" ${SEEK} scan ${M0}/test hole $((${BSIZE} * 5))</div><div class='add'>+EXPECT "^$((${BSIZE} * 5 + 512))$" ${SEEK} scan ${M0}/test hole $((${BSIZE} * 5 + 511))</div><div class='add'>+EXPECT "^ENXIO$" ${SEEK} scan ${M0}/test hole $((${BSIZE} * 5 + 512))</div><div class='add'>+EXPECT "^ENXIO$" ${SEEK} scan ${M0}/test hole $((${BSIZE} * 6))</div><div class='add'>+</div><div class='add'>+rm -f ${SEEK}</div><div class='add'>+cleanup</div><div class='add'>+</div><div class='add'>+# Centos6 regression slaves seem to not support SEEK_DATA/SEEK_HOLE</div><div class='add'>+#G_TESTDEF_TEST_STATUS_CENTOS6=BAD_TEST,BUG=000000</div><div class='head'>diff --git a/tests/basic/afr/afr-up.t b/tests/basic/afr/afr-up.t<br/>new file mode 100644<br/>index 00000000000..428aac875e0<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/afr/afr-up.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/afr/afr-up.t</a></div><div class='hunk'>@@ -0,0 +1,28 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+#Tests that afr up/down works as expected</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+. $(dirname $0)/../../afr.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 replica 3 $H0:$B0/${V0}{0,1,3,4,5,6}</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+TEST $GFS --volfile-id=$V0 --volfile-server=$H0 $M0;</div><div class='add'>+EXPECT "1" afr_up_status $V0 $M0 0</div><div class='add'>+EXPECT "1" afr_up_status $V0 $M0 1</div><div class='add'>+</div><div class='add'>+#kill two bricks in first replica and check that afr_up_status is 0 for it</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}0</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}1</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $PROCESS_DOWN_TIMEOUT "0" afr_up_status $V0 $M0 0</div><div class='add'>+EXPECT "1" afr_up_status $V0 $M0 1</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_up_status $V0 $M0 0</div><div class='add'>+EXPECT "1" afr_up_status $V0 $M0 1</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/basic/afr/arbiter-add-brick.t b/tests/basic/afr/arbiter-add-brick.t<br/>new file mode 100644<br/>index 00000000000..77b93d9a210<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/afr/arbiter-add-brick.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/afr/arbiter-add-brick.t</a></div><div class='hunk'>@@ -0,0 +1,86 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+</div><div class='add'>+#Create replica 2 volume and create file/dir.</div><div class='add'>+TEST $CLI volume create $V0 replica 2 $H0:$B0/${V0}{0,1}</div><div class='add'>+TEST $CLI volume set $V0 performance.stat-prefetch off</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+TEST $CLI volume set $V0 self-heal-daemon off</div><div class='add'>+TEST $GFS --volfile-id=$V0 --volfile-server=$H0 $M0;</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 1</div><div class='add'>+TEST mkdir  $M0/dir1</div><div class='add'>+TEST dd if=/dev/urandom of=$M0/file1 bs=1024 count=1</div><div class='add'>+</div><div class='add'>+#Kill second brick and perform I/O to have pending heals.</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}1</div><div class='add'>+TEST mkdir $M0/dir2</div><div class='add'>+TEST dd if=/dev/urandom of=$M0/file1 bs=1024 count=1024</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+#convert replica 2 to arbiter volume</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status $V0 $H0 $B0/${V0}1</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 1</div><div class='add'>+</div><div class='add'>+#syntax check for add-brick.</div><div class='add'>+TEST ! $CLI volume add-brick $V0 replica 2 arbiter 1 $H0:$B0/${V0}2</div><div class='add'>+TEST ! $CLI volume add-brick $V0 replica 3 arbiter 2 $H0:$B0/${V0}2</div><div class='add'>+</div><div class='add'>+TEST $CLI volume add-brick $V0 replica 3 arbiter 1 $H0:$B0/${V0}2</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status $V0 $H0 $B0/${V0}2</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 2</div><div class='add'>+</div><div class='add'>+#Trigger name heals from client. If we just rely on index heal, the first index</div><div class='add'>+#crawl on B0 fails for /, dir2 and /file either due to lock collision or files</div><div class='add'>+#not being present on the other 2 bricks yet. It is getting healed only in the</div><div class='add'>+#next crawl after priv-&gt;shd.timeout (600 seconds) or by manually launching</div><div class='add'>+#index heal again.</div><div class='add'>+TEST $CLI volume set $V0 data-self-heal off</div><div class='add'>+TEST $CLI volume set $V0 metadata-self-heal off</div><div class='add'>+TEST $CLI volume set $V0 entry-self-heal off</div><div class='add'>+TEST stat $M0/dir1</div><div class='add'>+TEST stat $M0/dir2</div><div class='add'>+TEST stat $M0/file1</div><div class='add'>+</div><div class='add'>+#Heal files</div><div class='add'>+TEST $CLI volume set $V0 self-heal-daemon on</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "Y" glustershd_up_status</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 1</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 2</div><div class='add'>+TEST $CLI volume heal $V0</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "0" get_pending_heal_count $V0</div><div class='add'>+</div><div class='add'>+#Perform I/O after add-brick</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 1</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 2</div><div class='add'>+TEST mkdir $M0/dir3</div><div class='add'>+TEST dd if=/dev/urandom of=$M0/file2 bs=1024 count=1024</div><div class='add'>+</div><div class='add'>+# File hierarchy must be same in all 3 bricks.</div><div class='add'>+TEST diff &lt;(ls $B0/${V0}0 | sort) &lt;(ls $B0/${V0}2 | sort)</div><div class='add'>+TEST diff &lt;(ls $B0/${V0}1 | sort) &lt;(ls $B0/${V0}2 | sort)</div><div class='add'>+</div><div class='add'>+#Mount serves the correct file size</div><div class='add'>+EXPECT "1048576" stat -c %s $M0/file1</div><div class='add'>+EXPECT "1048576" stat -c %s $M0/file2</div><div class='add'>+</div><div class='add'>+#Check file size in arbiter brick</div><div class='add'>+EXPECT "0" stat -c %s $B0/${V0}2/file1</div><div class='add'>+EXPECT "0" stat -c %s $B0/${V0}2/file2</div><div class='add'>+</div><div class='add'>+#Increasing replica count of arbiter volumes must not be allowed.</div><div class='add'>+TEST !  $CLI volume add-brick $V0 replica 4 $H0:$B0/${V0}3</div><div class='add'>+TEST !  $CLI volume add-brick $V0 replica 4 arbiter 1 $H0:$B0/${V0}3</div><div class='add'>+</div><div class='add'>+#Adding another distribute leg should succeed.</div><div class='add'>+TEST $CLI volume add-brick $V0 replica 3 arbiter 1 $H0:$B0/${V0}{3..5}</div><div class='add'>+TEST force_umount $M0</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/basic/afr/arbiter-cli.t b/tests/basic/afr/arbiter-cli.t<br/>new file mode 100644<br/>index 00000000000..ad79de79d02<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/afr/arbiter-cli.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/afr/arbiter-cli.t</a></div><div class='hunk'>@@ -0,0 +1,30 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+. $(dirname $0)/../../afr.rc</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+# Negative test cases for arbiter volume creation should not crash.</div><div class='add'>+</div><div class='add'>+TEST glusterd;</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+</div><div class='add'>+# No replica count.</div><div class='add'>+TEST ! $CLI volume create $V0 arbiter 3 $H0:$B0/${V0}{0,1,2}</div><div class='add'>+</div><div class='add'>+# replica count given after arbiter count.</div><div class='add'>+TEST ! $CLI volume create $V0 arbiter 1 replica 3 $H0:$B0/${V0}{0,1,2}</div><div class='add'>+</div><div class='add'>+# Incorrect values for replica and arbiter count.</div><div class='add'>+TEST ! $CLI volume create $V0  replica 3 arbiter 2 $H0:$B0/${V0}{0,1,2}</div><div class='add'>+</div><div class='add'>+# Correct setup</div><div class='add'>+# Only documented value is replica=2 and arbiter=1.</div><div class='add'>+TEST $CLI volume create $V0  replica 2 arbiter 1 $H0:$B0/${V0}{0,1,2}</div><div class='add'>+</div><div class='add'>+# Earlier documents mentioned 'replica 3 arbiter 1' as the valid option</div><div class='add'>+# Preserve backward compatibility till Oct, 2019.</div><div class='add'>+TEST  $CLI volume create ${V0}-old  replica 3 arbiter 1 $H0:$B0/${V0}-old{0,1,2}</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/basic/afr/arbiter-mount.t b/tests/basic/afr/arbiter-mount.t<br/>new file mode 100644<br/>index 00000000000..404d334d2f9<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/afr/arbiter-mount.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/afr/arbiter-mount.t</a></div><div class='hunk'>@@ -0,0 +1,48 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+. $(dirname $0)/../../afr.rc</div><div class='add'>+. $(dirname $0)/../../nfs.rc</div><div class='add'>+</div><div class='add'>+#G_TESTDEF_TEST_STATUS_CENTOS6=NFS_TEST</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+#Check that mounting fails when only arbiter brick is up.</div><div class='add'>+</div><div class='add'>+TEST glusterd;</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 replica 3 arbiter 1 $H0:$B0/${V0}{0,1,2}</div><div class='add'>+TEST $CLI volume set $V0 nfs.disable false</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+EXPECT 'Started' volinfo_field $V0 'Status'</div><div class='add'>+EXPECT_WITHIN $NFS_EXPORT_TIMEOUT "1" is_nfs_export_available;</div><div class='add'>+</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}0</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}1</div><div class='add'>+</div><div class='add'>+# Doing `mount -t glusterfs $H0:$V0 $M0` fails right away but doesn't work on NetBSD</div><div class='add'>+# So check that stat &lt;mount&gt; fails instead.</div><div class='add'>+TEST $GFS --volfile-id=/$V0 --volfile-server=$H0 $M0</div><div class='add'>+TEST ! stat $M0</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+</div><div class='add'>+mount_nfs $H0:/$V0 $N0</div><div class='add'>+TEST [ $? -ne 0 ]</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status $V0 $H0 $B0/${V0}0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status $V0 $H0 $B0/${V0}1</div><div class='add'>+EXPECT_WITHIN $NFS_EXPORT_TIMEOUT "1" is_nfs_export_available;</div><div class='add'>+</div><div class='add'>+TEST $GFS --volfile-id=/$V0 --volfile-server=$H0 $M0</div><div class='add'>+TEST  stat $M0</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+</div><div class='add'>+mount_nfs $H0:/$V0 $N0</div><div class='add'>+TEST [ $? -eq 0 ]</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $N0</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/basic/afr/arbiter-remove-brick.t b/tests/basic/afr/arbiter-remove-brick.t<br/>new file mode 100644<br/>index 00000000000..ec93c8758e4<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/afr/arbiter-remove-brick.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/afr/arbiter-remove-brick.t</a></div><div class='hunk'>@@ -0,0 +1,36 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+</div><div class='add'>+#Create arbiter volume.</div><div class='add'>+TEST $CLI volume create $V0 replica 3 arbiter 1  $H0:$B0/${V0}{0,1,2}</div><div class='add'>+EXPECT "1 x \(2 \+ 1\) = 3" volinfo_field $V0 "Number of Bricks"</div><div class='add'>+TEST $CLI volume set $V0 performance.stat-prefetch off</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+TEST $GFS --volfile-id=$V0 --volfile-server=$H0 $M0;</div><div class='add'>+</div><div class='add'>+#syntax check for remove-brick.</div><div class='add'>+TEST ! $CLI volume remove-brick $V0 replica 2  $H0:$B0/${V0}0 force</div><div class='add'>+TEST ! $CLI volume remove-brick $V0 replica 2  $H0:$B0/${V0}1 force</div><div class='add'>+</div><div class='add'>+#convert to replica 2 volume</div><div class='add'>+TEST $CLI volume remove-brick $V0 replica 2  $H0:$B0/${V0}2 force</div><div class='add'>+EXPECT "1 x 2 = 2" volinfo_field $V0 "Number of Bricks"</div><div class='add'>+</div><div class='add'>+TEST mkdir $M0/dir</div><div class='add'>+TEST dd if=/dev/urandom of=$M0/file bs=1024 count=1024</div><div class='add'>+TEST diff &lt;(ls $B0/${V0}0 | sort) &lt;(ls $B0/${V0}1 | sort)</div><div class='add'>+</div><div class='add'>+#Mount serves the correct file size</div><div class='add'>+EXPECT "1048576" stat -c %s $M0/file</div><div class='add'>+</div><div class='add'>+#Check file size in bricks</div><div class='add'>+EXPECT "1048576" stat -c %s $B0/${V0}0/file</div><div class='add'>+EXPECT "1048576" stat -c %s $B0/${V0}1/file</div><div class='add'>+</div><div class='add'>+TEST force_umount $M0</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/basic/afr/arbiter-statfs.t b/tests/basic/afr/arbiter-statfs.t<br/>new file mode 100644<br/>index 00000000000..61cb9e1d04f<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/afr/arbiter-statfs.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/afr/arbiter-statfs.t</a></div><div class='hunk'>@@ -0,0 +1,41 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+#Test that statfs is not served from the arbiter brick.</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+EXIT_EARLY=1</div><div class='add'>+TEST glusterd</div><div class='add'>+</div><div class='add'>+#Create brick partitions</div><div class='add'>+TEST truncate -s 1G $B0/brick1</div><div class='add'>+TEST truncate -s 1G $B0/brick2</div><div class='add'>+#Arbiter brick is of a lesser size.</div><div class='add'>+TEST truncate -s 90M $B0/brick3</div><div class='add'>+LO1=`SETUP_LOOP $B0/brick1`</div><div class='add'>+TEST [ $? -eq 0 ]</div><div class='add'>+TEST MKFS_LOOP $LO1</div><div class='add'>+LO2=`SETUP_LOOP $B0/brick2`</div><div class='add'>+TEST [ $? -eq 0 ]</div><div class='add'>+TEST MKFS_LOOP $LO2</div><div class='add'>+LO3=`SETUP_LOOP $B0/brick3`</div><div class='add'>+TEST [ $? -eq 0 ]</div><div class='add'>+TEST MKFS_LOOP $LO3</div><div class='add'>+TEST mkdir -p $B0/${V0}1 $B0/${V0}2 $B0/${V0}3</div><div class='add'>+TEST MOUNT_LOOP $LO1 $B0/${V0}1</div><div class='add'>+TEST MOUNT_LOOP $LO2 $B0/${V0}2</div><div class='add'>+TEST MOUNT_LOOP $LO3 $B0/${V0}3</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 replica 3 arbiter 1 $H0:$B0/${V0}{1,2,3};</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+TEST $GFS --volfile-server=$H0 --volfile-id=$V0 $M0</div><div class='add'>+free_space=$(df -P $M0 | tail -1 | awk '{ print $4}')</div><div class='add'>+TEST [ $free_space -gt 100000 ]</div><div class='add'>+TEST force_umount $M0</div><div class='add'>+TEST $CLI volume stop $V0</div><div class='add'>+EXPECT 'Stopped' volinfo_field $V0 'Status';</div><div class='add'>+TEST $CLI volume delete $V0;</div><div class='add'>+UMOUNT_LOOP ${B0}/${V0}{1,2,3}</div><div class='add'>+rm -f ${B0}/brick{1,2,3}</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/basic/afr/arbiter.t b/tests/basic/afr/arbiter.t<br/>new file mode 100644<br/>index 00000000000..7c92a9fe6c9<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/afr/arbiter.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/afr/arbiter.t</a></div><div class='hunk'>@@ -0,0 +1,92 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+. $(dirname $0)/../../afr.rc</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd;</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+</div><div class='add'>+# Non arbiter replica 3 volumes should not have arbiter-count option enabled.</div><div class='add'>+TEST mkdir -p $B0/${V0}{0,1,2}</div><div class='add'>+TEST $CLI volume create $V0 replica 3 $H0:$B0/${V0}{0,1,2}</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+EXPECT 'Started' volinfo_field $V0 'Status'</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status $V0 $H0 $B0/${V0}0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status $V0 $H0 $B0/${V0}1</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status $V0 $H0 $B0/${V0}2</div><div class='add'>+TEST $GFS --volfile-id=$V0 --volfile-server=$H0 $M0;</div><div class='add'>+TEST ! stat $M0/.meta/graphs/active/$V0-replicate-0/options/arbiter-count</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+TEST $CLI volume stop $V0</div><div class='add'>+TEST $CLI volume delete $V0</div><div class='add'>+</div><div class='add'>+# Make sure we clean up *all the way* so we don't get "brick X is already part</div><div class='add'>+# of a volume" errors.</div><div class='add'>+cleanup;</div><div class='add'>+TEST glusterd;</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+</div><div class='add'>+# Create and mount a replica 3 arbiter volume.</div><div class='add'>+TEST mkdir -p $B0/${V0}{0,1,2}</div><div class='add'>+TEST $CLI volume create $V0 replica 3 arbiter 1 $H0:$B0/${V0}{0,1,2}</div><div class='add'>+TEST $CLI volume set $V0 performance.write-behind off</div><div class='add'>+TEST $CLI volume set $V0 performance.stat-prefetch off</div><div class='add'>+TEST $CLI volume set $V0 cluster.self-heal-daemon off</div><div class='add'>+TEST $CLI volume set $V0 cluster.metadata-self-heal off</div><div class='add'>+TEST $CLI volume set $V0 cluster.data-self-heal off</div><div class='add'>+TEST $CLI volume set $V0 cluster.entry-self-heal off</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+EXPECT 'Started' volinfo_field $V0 'Status'</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status $V0 $H0 $B0/${V0}0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status $V0 $H0 $B0/${V0}1</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status $V0 $H0 $B0/${V0}2</div><div class='add'>+TEST $GFS --volfile-id=$V0 --volfile-server=$H0 $M0;</div><div class='add'>+TEST stat $M0/.meta/graphs/active/$V0-replicate-0/options/arbiter-count</div><div class='add'>+EXPECT "1" cat $M0/.meta/graphs/active/$V0-replicate-0/options/arbiter-count</div><div class='add'>+</div><div class='add'>+# Write data and metadata</div><div class='add'>+TEST `echo hello &gt;&gt; $M0/file`</div><div class='add'>+TEST setfattr -n user.name -v value1  $M0/file</div><div class='add'>+</div><div class='add'>+# Data I/O will fail if arbiter is the only source.</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}0</div><div class='add'>+TEST `echo "B0 is down, B1 and B2 are sources" &gt;&gt; $M0/file`</div><div class='add'>+TEST setfattr -n user.name -v value2  $M0/file</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 0</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}1</div><div class='add'>+echo "B2 is down, B3 is the only source, writes will fail" &gt;&gt; $M0/file</div><div class='add'>+EXPECT_NOT "0" echo $?</div><div class='add'>+TEST ! cat $M0/file</div><div class='add'>+# Though metadata IO could have been served from arbiter, we do not allow it</div><div class='add'>+# anymore as FOPS like getfattr could be overloaded to return iatt buffers for</div><div class='add'>+# use by other translators.</div><div class='add'>+TEST ! getfattr -n user.name $M0/file</div><div class='add'>+TEST ! setfattr -n user.name -v value3 $M0/file</div><div class='add'>+</div><div class='add'>+#shd should not data self-heal from arbiter to the sinks.</div><div class='add'>+TEST $CLI volume set $V0 cluster.self-heal-daemon on</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "Y" glustershd_up_status</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 2</div><div class='add'>+$CLI volume heal $V0</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT '1' echo $(count_sh_entries $B0/$V0"1")</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT '1' echo $(count_sh_entries $B0/$V0"2")</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "Y" glustershd_up_status</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 1</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 2</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 1</div><div class='add'>+TEST $CLI volume heal $V0</div><div class='add'>+EXPECT 0 get_pending_heal_count $V0</div><div class='add'>+</div><div class='add'>+# I/O can resume again.</div><div class='add'>+TEST cat $M0/file</div><div class='add'>+TEST getfattr -n user.name $M0/file</div><div class='add'>+TEST `echo append&gt;&gt; $M0/file`</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/basic/afr/client-side-heal.t b/tests/basic/afr/client-side-heal.t<br/>new file mode 100755<br/>index 00000000000..1e9336184b5<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/afr/client-side-heal.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/afr/client-side-heal.t</a></div><div class='hunk'>@@ -0,0 +1,95 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 replica 2 $H0:$B0/${V0}{0,1}</div><div class='add'>+TEST $CLI volume set $V0 cluster.self-heal-daemon off</div><div class='add'>+TEST $CLI volume set $V0 cluster.entry-self-heal off</div><div class='add'>+TEST $CLI volume set $V0 cluster.data-self-heal off</div><div class='add'>+TEST $CLI volume set $V0 cluster.metadata-self-heal off</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+TEST $GFS --volfile-id=$V0 --volfile-server=$H0 $M0;</div><div class='add'>+echo "some data" &gt; $M0/datafile</div><div class='add'>+EXPECT 0 echo $?</div><div class='add'>+TEST touch $M0/mdatafile</div><div class='add'>+TEST touch $M0/mdatafile-backend-direct-modify</div><div class='add'>+TEST mkdir $M0/dir</div><div class='add'>+</div><div class='add'>+#Kill a brick and perform I/O to have pending heals.</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "0" afr_child_up_status $V0 0</div><div class='add'>+</div><div class='add'>+#pending data heal</div><div class='add'>+echo "some more data" &gt;&gt; $M0/datafile</div><div class='add'>+EXPECT 0 echo $?</div><div class='add'>+</div><div class='add'>+#pending metadata heal</div><div class='add'>+TEST chmod +x $M0/mdatafile</div><div class='add'>+TEST chmod +x $B0/${V0}0/mdatafile-backend-direct-modify</div><div class='add'>+</div><div class='add'>+#pending entry heal. Also causes pending metadata/data heals on file{1..5}</div><div class='add'>+TEST touch $M0/dir/file{1..5}</div><div class='add'>+</div><div class='add'>+EXPECT 8 get_pending_heal_count $V0</div><div class='add'>+</div><div class='add'>+#After brick comes back up, access from client should not trigger heals</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 0</div><div class='add'>+</div><div class='add'>+#Medatada heal via explicit lookup must not happen</div><div class='add'>+TEST getfattr -d -m. -e hex $M0/mdatafile</div><div class='add'>+TEST ls $M0/mdatafile-backend-direct-modify</div><div class='add'>+</div><div class='add'>+TEST [[ "$(stat -c %A $B0/${V0}0/mdatafile-backend-direct-modify)" != "$(stat -c %A $B0/${V0}1/mdatafile-backend-direct-modify)" ]]</div><div class='add'>+</div><div class='add'>+#Inode refresh must not trigger data metadata and entry heals.</div><div class='add'>+#To trigger inode refresh for sure, the volume is unmounted and mounted each time.</div><div class='add'>+#Check that data heal does not happen.</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+TEST $GFS --volfile-id=$V0 --volfile-server=$H0 $M0;</div><div class='add'>+TEST cat $M0/datafile</div><div class='add'>+#Check that entry heal does not happen.</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+TEST $GFS --volfile-id=$V0 --volfile-server=$H0 $M0;</div><div class='add'>+TEST ls $M0/dir</div><div class='add'>+#No heal must have happened</div><div class='add'>+EXPECT 8 get_pending_heal_count $V0</div><div class='add'>+</div><div class='add'>+#Enable heal client side heal options and trigger heals</div><div class='add'>+TEST $CLI volume set $V0 cluster.data-self-heal on</div><div class='add'>+TEST $CLI volume set $V0 cluster.metadata-self-heal on</div><div class='add'>+TEST $CLI volume set $V0 cluster.entry-self-heal on</div><div class='add'>+</div><div class='add'>+#Inode refresh must trigger data metadata and entry heals.</div><div class='add'>+#To trigger inode refresh for sure, the volume is unmounted and mounted each time.</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+TEST $GFS --volfile-id=$V0 --volfile-server=$H0 $M0;</div><div class='add'>+TEST ls $M0/mdatafile-backend-direct-modify</div><div class='add'>+</div><div class='add'>+TEST [[ "$(stat -c %A $B0/${V0}0/mdatafile-backend-direct-modify)" == "$(stat -c %A $B0/${V0}1/mdatafile-backend-direct-modify)" ]]</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+TEST getfattr -d -m. -e hex $M0/mdatafile</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT 7 get_pending_heal_count $V0</div><div class='add'>+</div><div class='add'>+TEST cat $M0/datafile</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT 6 get_pending_heal_count $V0</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+TEST $GFS --volfile-id=$V0 --volfile-server=$H0 $M0;</div><div class='add'>+TEST ls $M0/dir</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT 5 get_pending_heal_count $V0</div><div class='add'>+</div><div class='add'>+TEST cat  $M0/dir/file1</div><div class='add'>+TEST cat  $M0/dir/file2</div><div class='add'>+TEST cat  $M0/dir/file3</div><div class='add'>+TEST cat  $M0/dir/file4</div><div class='add'>+TEST cat  $M0/dir/file5</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT 0 get_pending_heal_count $V0</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/basic/afr/data-self-heal.t b/tests/basic/afr/data-self-heal.t<br/>new file mode 100644<br/>index 00000000000..0f417b4a0ba<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/afr/data-self-heal.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/afr/data-self-heal.t</a></div><div class='hunk'>@@ -0,0 +1,209 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+#Self-heal tests</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+. $(dirname $0)/../../afr.rc</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+function create_xattrop_entry {</div><div class='add'>+        local xattrop_dir0=$(afr_get_index_path $B0/brick0)</div><div class='add'>+        local xattrop_dir1=$(afr_get_index_path $B0/brick1)</div><div class='add'>+        local base_entry_b0=`ls $xattrop_dir0`</div><div class='add'>+        local base_entry_b1=`ls $xattrop_dir1`</div><div class='add'>+        local gfid_str</div><div class='add'>+</div><div class='add'>+        for file in "$@"</div><div class='add'>+        do</div><div class='add'>+                gfid_str=$(gf_gfid_xattr_to_str $(gf_get_gfid_xattr $B0/brick0/$file))</div><div class='add'>+                ln $xattrop_dir0/$base_entry_b0 $xattrop_dir0/$gfid_str</div><div class='add'>+                ln $xattrop_dir1/$base_entry_b1 $xattrop_dir1/$gfid_str</div><div class='add'>+        done</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function is_heal_done {</div><div class='add'>+        local f1_path="${1}/${3}"</div><div class='add'>+        local f2_path="${2}/${3}"</div><div class='add'>+        local zero_xattr="000000000000000000000000"</div><div class='add'>+        local size1=$(stat -c "%s" $f1_path)</div><div class='add'>+        local size2=$(stat -c "%s" $f2_path)</div><div class='add'>+        local diff=$((size1-size2))</div><div class='add'>+        local xattr11=$(get_hex_xattr trusted.afr.$V0-client-0 $f1_path)</div><div class='add'>+        local xattr12=$(get_hex_xattr trusted.afr.$V0-client-1 $f1_path)</div><div class='add'>+        local xattr21=$(get_hex_xattr trusted.afr.$V0-client-0 $f2_path)</div><div class='add'>+        local xattr22=$(get_hex_xattr trusted.afr.$V0-client-1 $f2_path)</div><div class='add'>+        local dirty1=$(get_hex_xattr trusted.afr.dirty $f1_path)</div><div class='add'>+        local dirty2=$(get_hex_xattr trusted.afr.dirty $f2_path)</div><div class='add'>+        if [ -z $xattr11 ]; then xattr11="000000000000000000000000"; fi</div><div class='add'>+        if [ -z $xattr12 ]; then xattr12="000000000000000000000000"; fi</div><div class='add'>+        if [ -z $xattr21 ]; then xattr21="000000000000000000000000"; fi</div><div class='add'>+        if [ -z $xattr22 ]; then xattr22="000000000000000000000000"; fi</div><div class='add'>+        if [ -z $dirty1 ]; then dirty1="000000000000000000000000"; fi</div><div class='add'>+        if [ -z $dirty2 ]; then dirty2="000000000000000000000000"; fi</div><div class='add'>+        if [ "${diff}${xattr11}${xattr12}${xattr21}${xattr22}${dirty1}${dirty2}" == "0${zero_xattr}${zero_xattr}${zero_xattr}${zero_xattr}${zero_xattr}${zero_xattr}" ];</div><div class='add'>+        then</div><div class='add'>+                echo "Y"</div><div class='add'>+        else</div><div class='add'>+                echo "N"</div><div class='add'>+        fi</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function print_pending_heals {</div><div class='add'>+        local result=":"</div><div class='add'>+        for i in "$@";</div><div class='add'>+        do</div><div class='add'>+                if [ "N" == $(is_heal_done $B0/brick0 $B0/brick1 $i) ];</div><div class='add'>+                then</div><div class='add'>+                        result="$result:$i"</div><div class='add'>+                fi</div><div class='add'>+        done</div><div class='add'>+#To prevent any match for EXPECT_WITHIN, print a char non-existent in file-names</div><div class='add'>+        if [ $result == ":" ]; then result="~"; fi</div><div class='add'>+        echo $result</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 replica 2 $H0:$B0/brick{0,1}</div><div class='add'>+TEST $CLI volume set $V0 cluster.background-self-heal-count 0</div><div class='add'>+TEST $CLI volume set $V0 performance.write-behind off</div><div class='add'>+TEST $CLI volume set $V0 performance.read-ahead off</div><div class='add'>+TEST $CLI volume set $V0 performance.io-cache off</div><div class='add'>+TEST $CLI volume set $V0 performance.stat-prefetch off</div><div class='add'>+TEST $CLI volume set $V0 performance.quick-read off</div><div class='add'>+TEST $CLI volume set $V0 performance.open-behind off</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "Y" glustershd_up_status</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 1</div><div class='add'>+TEST $GFS --volfile-id=$V0 --volfile-server=$H0 $M0;</div><div class='add'>+cd $M0</div><div class='add'>+TEST touch pending-changelog biggest-file-source.txt biggest-file-more-prio-than-changelog.txt same-size-more-prio-to-changelog.txt size-and-witness-same.txt self-accusing-vs-source.txt self-accusing-both.txt self-accusing-vs-innocent.txt self-accusing-bigger-exists.txt size-more-prio-than-self-accused.txt v1-dirty.txt split-brain.txt split-brain-all-dirty.txt split-brain-with-dirty.txt</div><div class='add'>+</div><div class='add'>+TEST setfattr -n trusted.afr.$V0-client-1 -v 0x000000010000000000000000 $B0/brick0/pending-changelog</div><div class='add'>+TEST "echo abc &gt; $B0/brick1/pending-changelog"</div><div class='add'>+</div><div class='add'>+TEST "echo abc &gt; $B0/brick0/biggest-file-source.txt"</div><div class='add'>+TEST "echo abcd &gt; $B0/brick1/biggest-file-source.txt"</div><div class='add'>+</div><div class='add'>+TEST "echo abc &gt; $B0/brick0/biggest-file-more-prio-than-changelog.txt"</div><div class='add'>+TEST "echo abcd &gt; $B0/brick1/biggest-file-more-prio-than-changelog.txt"</div><div class='add'>+TEST setfattr -n trusted.afr.dirty -v 0x000000200000000000000000 $B0/brick0/biggest-file-more-prio-than-changelog.txt</div><div class='add'>+</div><div class='add'>+TEST "echo abc &gt; $B0/brick0/same-size-more-prio-to-changelog.txt"</div><div class='add'>+TEST "echo def &gt; $B0/brick1/same-size-more-prio-to-changelog.txt"</div><div class='add'>+TEST setfattr -n trusted.afr.dirty -v 0x000000200000000000000000 $B0/brick0/same-size-more-prio-to-changelog.txt</div><div class='add'>+</div><div class='add'>+TEST "echo abc &gt; $B0/brick0/size-and-witness-same.txt"</div><div class='add'>+TEST "echo def &gt; $B0/brick1/size-and-witness-same.txt"</div><div class='add'>+TEST setfattr -n trusted.afr.dirty -v 0x000000200000000000000000 $B0/brick0/size-and-witness-same.txt</div><div class='add'>+TEST setfattr -n trusted.afr.dirty -v 0x000000200000000000000000 $B0/brick1/size-and-witness-same.txt</div><div class='add'>+</div><div class='add'>+TEST "echo abc &gt; $B0/brick0/split-brain.txt"</div><div class='add'>+TEST "echo def &gt; $B0/brick1/split-brain.txt"</div><div class='add'>+TEST setfattr -n trusted.afr.$V0-client-1 -v 0x000000200000000000000000 $B0/brick0/split-brain.txt</div><div class='add'>+TEST setfattr -n trusted.afr.$V0-client-0 -v 0x000000200000000000000000 $B0/brick1/split-brain.txt</div><div class='add'>+</div><div class='add'>+TEST "echo abc &gt; $B0/brick0/split-brain-all-dirty.txt"</div><div class='add'>+TEST "echo def &gt; $B0/brick1/split-brain-all-dirty.txt"</div><div class='add'>+TEST setfattr -n trusted.afr.$V0-client-1 -v 0x000000200000000000000000 $B0/brick0/split-brain-all-dirty.txt</div><div class='add'>+TEST setfattr -n trusted.afr.$V0-client-0 -v 0x000000200000000000000000 $B0/brick1/split-brain-all-dirty.txt</div><div class='add'>+TEST setfattr -n trusted.afr.dirty -v 0x000000200000000000000000 $B0/brick0/split-brain-all-dirty.txt</div><div class='add'>+TEST setfattr -n trusted.afr.dirty -v 0x000000200000000000000000 $B0/brick1/split-brain-all-dirty.txt</div><div class='add'>+</div><div class='add'>+TEST "echo abc &gt; $B0/brick0/split-brain-with-dirty.txt"</div><div class='add'>+TEST "echo def &gt; $B0/brick1/split-brain-with-dirty.txt"</div><div class='add'>+TEST setfattr -n trusted.afr.$V0-client-1 -v 0x000000200000000000000000 $B0/brick0/split-brain-with-dirty.txt</div><div class='add'>+TEST setfattr -n trusted.afr.$V0-client-0 -v 0x000000200000000000000000 $B0/brick1/split-brain-with-dirty.txt</div><div class='add'>+TEST setfattr -n trusted.afr.dirty -v 0x000000200000000000000000 $B0/brick1/split-brain-with-dirty.txt</div><div class='add'>+</div><div class='add'>+TEST "echo def &gt; $B0/brick1/self-accusing-vs-source.txt"</div><div class='add'>+TEST "echo abc &gt; $B0/brick0/self-accusing-vs-source.txt"</div><div class='add'>+TEST setfattr -n trusted.afr.$V0-client-0 -v 0x000000200000000000000000 $B0/brick1/self-accusing-vs-source.txt</div><div class='add'>+TEST setfattr -n trusted.afr.$V0-client-1 -v 0x000000200000000000000000 $B0/brick1/self-accusing-vs-source.txt</div><div class='add'>+TEST setfattr -n trusted.afr.$V0-client-1 -v 0x000000200000000000000000 $B0/brick0/self-accusing-vs-source.txt</div><div class='add'>+</div><div class='add'>+TEST "echo abc &gt; $B0/brick0/self-accusing-both.txt"</div><div class='add'>+TEST "echo def &gt; $B0/brick1/self-accusing-both.txt"</div><div class='add'>+TEST setfattr -n trusted.afr.$V0-client-0 -v 0x000000200000000000000000 $B0/brick0/self-accusing-both.txt</div><div class='add'>+TEST setfattr -n trusted.afr.$V0-client-1 -v 0x000000200000000000000000 $B0/brick0/self-accusing-both.txt</div><div class='add'>+TEST setfattr -n trusted.afr.$V0-client-0 -v 0x000000200000000000000000 $B0/brick1/self-accusing-both.txt</div><div class='add'>+TEST setfattr -n trusted.afr.$V0-client-1 -v 0x000000200000000000000000 $B0/brick1/self-accusing-both.txt</div><div class='add'>+</div><div class='add'>+TEST "echo abc &gt; $B0/brick0/self-accusing-vs-innocent.txt"</div><div class='add'>+TEST "echo def &gt; $B0/brick1/self-accusing-vs-innocent.txt"</div><div class='add'>+TEST setfattr -n trusted.afr.$V0-client-1 -v 0x000000200000000000000000 $B0/brick1/self-accusing-vs-innocent.txt</div><div class='add'>+</div><div class='add'>+TEST "echo abc &gt; $B0/brick0/self-accusing-bigger-exists.txt"</div><div class='add'>+TEST "echo def &gt; $B0/brick1/self-accusing-bigger-exists.txt"</div><div class='add'>+TEST setfattr -n trusted.afr.$V0-client-0 -v 0x000000200000000000000000 $B0/brick0/self-accusing-bigger-exists.txt</div><div class='add'>+TEST setfattr -n trusted.afr.$V0-client-1 -v 0x000000300000000000000000 $B0/brick0/self-accusing-bigger-exists.txt</div><div class='add'>+TEST setfattr -n trusted.afr.$V0-client-0 -v 0x000000200000000000000000 $B0/brick1/self-accusing-bigger-exists.txt</div><div class='add'>+TEST setfattr -n trusted.afr.$V0-client-1 -v 0x000000200000000000000000 $B0/brick1/self-accusing-bigger-exists.txt</div><div class='add'>+</div><div class='add'>+TEST "echo abc &gt; $B0/brick0/size-more-prio-than-self-accused.txt"</div><div class='add'>+TEST "echo defg &gt; $B0/brick1/size-more-prio-than-self-accused.txt"</div><div class='add'>+TEST setfattr -n trusted.afr.$V0-client-0 -v 0x000000200000000000000000 $B0/brick0/size-more-prio-than-self-accused.txt</div><div class='add'>+TEST setfattr -n trusted.afr.$V0-client-1 -v 0x000000300000000000000000 $B0/brick0/size-more-prio-than-self-accused.txt</div><div class='add'>+TEST setfattr -n trusted.afr.$V0-client-0 -v 0x000000200000000000000000 $B0/brick1/size-more-prio-than-self-accused.txt</div><div class='add'>+TEST setfattr -n trusted.afr.$V0-client-1 -v 0x000000200000000000000000 $B0/brick1/size-more-prio-than-self-accused.txt</div><div class='add'>+</div><div class='add'>+TEST "echo abc &gt; $B0/brick0/v1-dirty.txt"</div><div class='add'>+TEST "echo def &gt; $B0/brick1/v1-dirty.txt"</div><div class='add'>+TEST setfattr -n trusted.afr.$V0-client-0 -v 0x000000200000000000000000 $B0/brick0/v1-dirty.txt</div><div class='add'>+TEST setfattr -n trusted.afr.$V0-client-1 -v 0x000000100000000000000000 $B0/brick1/v1-dirty.txt</div><div class='add'>+</div><div class='add'>+#Create base entry in indices/xattrop</div><div class='add'>+echo "Data" &gt; $M0/FILE</div><div class='add'>+rm -f $M0/FILE</div><div class='add'>+EXPECT "1" count_index_entries $B0/brick0</div><div class='add'>+EXPECT "1" count_index_entries $B0/brick1</div><div class='add'>+cd -</div><div class='add'>+</div><div class='add'>+#Create gfid hard links for all files before triggering index heals.</div><div class='add'>+create_xattrop_entry pending-changelog biggest-file-source.txt biggest-file-more-prio-than-changelog.txt same-size-more-prio-to-changelog.txt size-and-witness-same.txt self-accusing-vs-source.txt self-accusing-both.txt self-accusing-vs-innocent.txt self-accusing-bigger-exists.txt size-more-prio-than-self-accused.txt v1-dirty.txt</div><div class='add'>+</div><div class='add'>+TEST $CLI volume heal $V0</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "~" print_pending_heals pending-changelog biggest-file-source.txt biggest-file-more-prio-than-changelog.txt same-size-more-prio-to-changelog.txt size-and-witness-same.txt self-accusing-vs-source.txt self-accusing-both.txt self-accusing-vs-innocent.txt self-accusing-bigger-exists.txt size-more-prio-than-self-accused.txt v1-dirty.txt</div><div class='add'>+EXPECT "N" is_heal_done $B0/brick0 $B0/brick1 split-brain.txt</div><div class='add'>+EXPECT "N" is_heal_done $B0/brick0 $B0/brick1 split-brain-all-dirty.txt</div><div class='add'>+EXPECT "N" is_heal_done $B0/brick0 $B0/brick1 split-brain-with-dirty.txt</div><div class='add'>+</div><div class='add'>+EXPECT "0" stat -c "%s" $M0/pending-changelog</div><div class='add'>+TEST cmp $B0/brick0/pending-changelog $B0/brick1/pending-changelog</div><div class='add'>+</div><div class='add'>+EXPECT "abcd" cat $M0/biggest-file-source.txt</div><div class='add'>+TEST cmp $B0/brick0/biggest-file-source.txt $B0/brick1/biggest-file-source.txt</div><div class='add'>+</div><div class='add'>+EXPECT "abcd" cat $M0/biggest-file-more-prio-than-changelog.txt</div><div class='add'>+TEST cmp $B0/brick0/biggest-file-more-prio-than-changelog.txt $B0/brick1/biggest-file-more-prio-than-changelog.txt</div><div class='add'>+</div><div class='add'>+EXPECT "abc" cat $M0/same-size-more-prio-to-changelog.txt</div><div class='add'>+TEST cmp $B0/brick0/same-size-more-prio-to-changelog.txt $B0/brick1/same-size-more-prio-to-changelog.txt</div><div class='add'>+</div><div class='add'>+EXPECT "(abc|def)" cat $M0/size-and-witness-same.txt</div><div class='add'>+TEST cmp $B0/brick0/size-and-witness-same.txt $B0/brick1/size-and-witness-same.txt</div><div class='add'>+</div><div class='add'>+TEST ! cat $M0/split-brain.txt</div><div class='add'>+TEST ! cat $M0/split-brain-all-dirty.txt</div><div class='add'>+TEST ! cat $M0/split-brain-with-dirty.txt</div><div class='add'>+</div><div class='add'>+EXPECT "abc" cat $M0/self-accusing-vs-source.txt</div><div class='add'>+TEST cmp $B0/brick0/self-accusing-vs-source.txt $B0/brick1/self-accusing-vs-source.txt</div><div class='add'>+</div><div class='add'>+EXPECT "(abc|def)" cat $M0/self-accusing-both.txt</div><div class='add'>+TEST cmp $B0/brick0/self-accusing-both.txt $B0/brick1/self-accusing-both.txt</div><div class='add'>+</div><div class='add'>+EXPECT "def" cat $M0/self-accusing-vs-innocent.txt</div><div class='add'>+TEST cmp $B0/brick0/self-accusing-vs-innocent.txt $B0/brick1/self-accusing-vs-innocent.txt</div><div class='add'>+</div><div class='add'>+EXPECT "abc" cat $M0/self-accusing-bigger-exists.txt</div><div class='add'>+TEST cmp $B0/brick0/self-accusing-bigger-exists.txt $B0/brick1/self-accusing-bigger-exists.txt</div><div class='add'>+</div><div class='add'>+EXPECT "defg" cat $M0/size-more-prio-than-self-accused.txt</div><div class='add'>+TEST cmp $B0/brick0/size-more-prio-than-self-accused.txt $B0/brick1/size-more-prio-than-self-accused.txt</div><div class='add'>+</div><div class='add'>+EXPECT "abc" cat $M0/v1-dirty.txt</div><div class='add'>+TEST cmp $B0/brick0/v1-dirty.txt $B0/brick1/v1-dirty.txt</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/basic/afr/durability-off.t b/tests/basic/afr/durability-off.t<br/>new file mode 100644<br/>index 00000000000..6e0f18b88f8<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/afr/durability-off.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/afr/durability-off.t</a></div><div class='hunk'>@@ -0,0 +1,46 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+#This test tests that self-heals don't perform fsync when durability is turned</div><div class='add'>+#off</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 replica 2 $H0:$B0/brick{0,1}</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+TEST $CLI volume profile $V0 start</div><div class='add'>+TEST $CLI volume set $V0 cluster.ensure-durability off</div><div class='add'>+TEST $GFS --volfile-id=$V0 --volfile-server=$H0 $M0;</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/brick0</div><div class='add'>+TEST dd of=$M0/a.txt if=/dev/zero bs=1024k count=1</div><div class='add'>+#NetBSD sends FSYNC so the counts go for a toss. Stop and start the volume.</div><div class='add'>+TEST $CLI volume stop $V0</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "Y" glustershd_up_status</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 1</div><div class='add'>+TEST $CLI volume heal $V0</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "0" get_pending_heal_count $V0</div><div class='add'>+EXPECT "^0$" echo $($CLI volume profile $V0 info | grep -w FSYNC | wc -l)</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status $V0 0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status $V0 1</div><div class='add'>+#Test that fsyncs happen when durability is on</div><div class='add'>+TEST $CLI volume set $V0 cluster.ensure-durability on</div><div class='add'>+TEST $CLI volume set $V0 performance.strict-write-ordering on</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/brick0</div><div class='add'>+TEST dd of=$M0/a.txt if=/dev/zero bs=1024k count=1</div><div class='add'>+#NetBSD sends FSYNC so the counts go for a toss. Stop and start the volume.</div><div class='add'>+TEST $CLI volume stop $V0</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "Y" glustershd_up_status</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 1</div><div class='add'>+TEST $CLI volume heal $V0</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "0" get_pending_heal_count $V0</div><div class='add'>+EXPECT "^2$" echo $($CLI volume profile $V0 info | grep -w FSYNC | wc -l)</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/basic/afr/entry-self-heal-anon-dir-off.t b/tests/basic/afr/entry-self-heal-anon-dir-off.t<br/>new file mode 100644<br/>index 00000000000..7bb6ee14193<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/afr/entry-self-heal-anon-dir-off.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/afr/entry-self-heal-anon-dir-off.t</a></div><div class='hunk'>@@ -0,0 +1,459 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+#This file checks if missing entry self-heal and entry self-heal are working</div><div class='add'>+#as expected.</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+. $(dirname $0)/../../afr.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+function get_file_type {</div><div class='add'>+        stat -c "%a:%F:%g:%t:%T:%u" $1</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function diff_dirs {</div><div class='add'>+        diff &lt;(ls $1 | sort) &lt;(ls $2 | sort)</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function heal_status {</div><div class='add'>+        local f1_path="${1}/${3}"</div><div class='add'>+        local f2_path="${2}/${3}"</div><div class='add'>+        local insync=""</div><div class='add'>+        diff_dirs $f1_path $f2_path</div><div class='add'>+        if [ $? -eq 0 ];</div><div class='add'>+        then</div><div class='add'>+                insync="Y"</div><div class='add'>+        else</div><div class='add'>+                insync="N"</div><div class='add'>+        fi</div><div class='add'>+        local xattr11=$(get_hex_xattr trusted.afr.$V0-client-0 $f1_path)</div><div class='add'>+        local xattr12=$(get_hex_xattr trusted.afr.$V0-client-1 $f1_path)</div><div class='add'>+        local xattr21=$(get_hex_xattr trusted.afr.$V0-client-0 $f2_path)</div><div class='add'>+        local xattr22=$(get_hex_xattr trusted.afr.$V0-client-1 $f2_path)</div><div class='add'>+        local dirty1=$(get_hex_xattr trusted.afr.dirty $f1_path)</div><div class='add'>+        local dirty2=$(get_hex_xattr trusted.afr.dirty $f2_path)</div><div class='add'>+        if [ -z $xattr11 ]; then xattr11="000000000000000000000000"; fi</div><div class='add'>+        if [ -z $xattr12 ]; then xattr12="000000000000000000000000"; fi</div><div class='add'>+        if [ -z $xattr21 ]; then xattr21="000000000000000000000000"; fi</div><div class='add'>+        if [ -z $xattr22 ]; then xattr22="000000000000000000000000"; fi</div><div class='add'>+        if [ -z $dirty1 ]; then dirty1="000000000000000000000000"; fi</div><div class='add'>+        if [ -z $dirty2 ]; then dirty2="000000000000000000000000"; fi</div><div class='add'>+        echo ${insync}${xattr11}${xattr12}${xattr21}${xattr22}${dirty1}${dirty2}</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function is_heal_done {</div><div class='add'>+        local zero_xattr="000000000000000000000000"</div><div class='add'>+        if [ "$(heal_status $@)" == "Y${zero_xattr}${zero_xattr}${zero_xattr}${zero_xattr}${zero_xattr}${zero_xattr}" ];</div><div class='add'>+        then</div><div class='add'>+                echo "Y"</div><div class='add'>+        else</div><div class='add'>+                echo "N"</div><div class='add'>+        fi</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function print_pending_heals {</div><div class='add'>+        local result=":"</div><div class='add'>+        for i in "$@";</div><div class='add'>+        do</div><div class='add'>+                if [ "N" == $(is_heal_done $B0/${V0}0 $B0/${V0}1 $i) ];</div><div class='add'>+                then</div><div class='add'>+                        result="$result:$i"</div><div class='add'>+                fi</div><div class='add'>+        done</div><div class='add'>+#To prevent any match for EXPECT_WITHIN, print a char non-existent in file-names</div><div class='add'>+        if [ $result == ":" ]; then result="~"; fi</div><div class='add'>+        echo $result</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+zero_xattr="000000000000000000000000"</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 replica 2 $H0:$B0/${V0}{0,1}</div><div class='add'>+TEST $CLI volume heal $V0 disable</div><div class='add'>+TEST $CLI volume set $V0 cluster.use-anonymous-inode off</div><div class='add'>+TEST $CLI volume set $V0 performance.write-behind off</div><div class='add'>+TEST $CLI volume set $V0 performance.read-ahead off</div><div class='add'>+TEST $CLI volume set $V0 performance.readdir-ahead off</div><div class='add'>+TEST $CLI volume set $V0 performance.open-behind off</div><div class='add'>+TEST $CLI volume set $V0 performance.stat-prefetch off</div><div class='add'>+TEST $CLI volume set $V0 performance.io-cache off</div><div class='add'>+TEST $CLI volume set $V0 performance.quick-read off</div><div class='add'>+TEST $CLI volume set $V0 cluster.data-self-heal on</div><div class='add'>+TEST $CLI volume set $V0 cluster.metadata-self-heal on</div><div class='add'>+TEST $CLI volume set $V0 cluster.entry-self-heal on</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+TEST $GFS --volfile-id=/$V0 --volfile-server=$H0 --use-readdirp=no $M0</div><div class='add'>+cd $M0</div><div class='add'>+#_me_ is dir on which missing entry self-heal happens, _heal is where dir self-heal happens</div><div class='add'>+#spb is split-brain, fool is all fool</div><div class='add'>+</div><div class='add'>+#source_self_accusing means there exists source and a sink which self-accuses.</div><div class='add'>+#This simulates failures where fops failed on the bricks without it going down.</div><div class='add'>+#Something like EACCESS/EDQUOT etc</div><div class='add'>+</div><div class='add'>+TEST mkdir spb_heal spb spb_me_heal spb_me fool_heal fool_me v1_fool_heal v1_fool_me source_creations_heal source_deletions_heal source_creations_me source_deletions_me v1_dirty_me v1_dirty_heal source_self_accusing</div><div class='add'>+TEST mkfifo source_deletions_heal/fifo</div><div class='add'>+TEST mknod  source_deletions_heal/block b 4 5</div><div class='add'>+TEST mknod  source_deletions_heal/char c 1 5</div><div class='add'>+TEST touch  source_deletions_heal/file</div><div class='add'>+TEST ln -s  source_deletions_heal/file source_deletions_heal/slink</div><div class='add'>+TEST mkdir  source_deletions_heal/dir1</div><div class='add'>+TEST mkdir  source_deletions_heal/dir1/dir2</div><div class='add'>+</div><div class='add'>+TEST mkfifo source_deletions_me/fifo</div><div class='add'>+TEST mknod  source_deletions_me/block b 4 5</div><div class='add'>+TEST mknod  source_deletions_me/char c 1 5</div><div class='add'>+TEST touch  source_deletions_me/file</div><div class='add'>+TEST ln -s  source_deletions_me/file source_deletions_me/slink</div><div class='add'>+TEST mkdir  source_deletions_me/dir1</div><div class='add'>+TEST mkdir  source_deletions_me/dir1/dir2</div><div class='add'>+</div><div class='add'>+TEST mkfifo source_self_accusing/fifo</div><div class='add'>+TEST mknod  source_self_accusing/block b 4 5</div><div class='add'>+TEST mknod  source_self_accusing/char c 1 5</div><div class='add'>+TEST touch  source_self_accusing/file</div><div class='add'>+TEST ln -s  source_self_accusing/file source_self_accusing/slink</div><div class='add'>+TEST mkdir  source_self_accusing/dir1</div><div class='add'>+TEST mkdir  source_self_accusing/dir1/dir2</div><div class='add'>+</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}0</div><div class='add'>+</div><div class='add'>+TEST touch spb_heal/0 spb/0 spb_me_heal/0 spb_me/0 fool_heal/0 fool_me/0 v1_fool_heal/0 v1_fool_me/0 v1_dirty_heal/0 v1_dirty_me/0</div><div class='add'>+TEST rm -rf source_deletions_heal/fifo source_deletions_heal/block source_deletions_heal/char source_deletions_heal/file source_deletions_heal/slink source_deletions_heal/dir1</div><div class='add'>+TEST rm -rf source_deletions_me/fifo source_deletions_me/block source_deletions_me/char source_deletions_me/file source_deletions_me/slink source_deletions_me/dir1</div><div class='add'>+TEST rm -rf source_self_accusing/fifo source_self_accusing/block source_self_accusing/char source_self_accusing/file source_self_accusing/slink source_self_accusing/dir1</div><div class='add'>+</div><div class='add'>+#Test that the files are deleted</div><div class='add'>+TEST ! stat $B0/${V0}1/source_deletions_heal/fifo</div><div class='add'>+TEST ! stat $B0/${V0}1/source_deletions_heal/block</div><div class='add'>+TEST ! stat $B0/${V0}1/source_deletions_heal/char</div><div class='add'>+TEST ! stat $B0/${V0}1/source_deletions_heal/file</div><div class='add'>+TEST ! stat $B0/${V0}1/source_deletions_heal/slink</div><div class='add'>+TEST ! stat $B0/${V0}1/source_deletions_heal/dir1</div><div class='add'>+TEST ! stat $B0/${V0}1/source_deletions_me/fifo</div><div class='add'>+TEST ! stat $B0/${V0}1/source_deletions_me/block</div><div class='add'>+TEST ! stat $B0/${V0}1/source_deletions_me/char</div><div class='add'>+TEST ! stat $B0/${V0}1/source_deletions_me/file</div><div class='add'>+TEST ! stat $B0/${V0}1/source_deletions_me/slink</div><div class='add'>+TEST ! stat $B0/${V0}1/source_deletions_me/dir1</div><div class='add'>+TEST ! stat $B0/${V0}1/source_self_accusing/fifo</div><div class='add'>+TEST ! stat $B0/${V0}1/source_self_accusing/block</div><div class='add'>+TEST ! stat $B0/${V0}1/source_self_accusing/char</div><div class='add'>+TEST ! stat $B0/${V0}1/source_self_accusing/file</div><div class='add'>+TEST ! stat $B0/${V0}1/source_self_accusing/slink</div><div class='add'>+TEST ! stat $B0/${V0}1/source_self_accusing/dir1</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+TEST mkfifo source_creations_heal/fifo</div><div class='add'>+TEST mknod  source_creations_heal/block b 4 5</div><div class='add'>+TEST mknod  source_creations_heal/char c 1 5</div><div class='add'>+TEST touch  source_creations_heal/file</div><div class='add'>+TEST ln -s  source_creations_heal/file source_creations_heal/slink</div><div class='add'>+TEST mkdir  source_creations_heal/dir1</div><div class='add'>+TEST mkdir  source_creations_heal/dir1/dir2</div><div class='add'>+</div><div class='add'>+TEST mkfifo source_creations_me/fifo</div><div class='add'>+TEST mknod  source_creations_me/block b 4 5</div><div class='add'>+TEST mknod  source_creations_me/char c 1 5</div><div class='add'>+TEST touch  source_creations_me/file</div><div class='add'>+TEST ln -s  source_creations_me/file source_creations_me/slink</div><div class='add'>+TEST mkdir  source_creations_me/dir1</div><div class='add'>+TEST mkdir  source_creations_me/dir1/dir2</div><div class='add'>+</div><div class='add'>+$CLI volume stop $V0</div><div class='add'>+</div><div class='add'>+#simulate fool fool scenario for fool_* dirs</div><div class='add'>+setfattr -x trusted.afr.$V0-client-0 $B0/${V0}1/{fool_heal,fool_me}</div><div class='add'>+setfattr -n trusted.afr.dirty -v 0x000000000000000000000001 $B0/${V0}1/{fool_heal,fool_me}</div><div class='add'>+setfattr -n trusted.afr.$V0-client-1 -v 0x000000000000000000000001 $B0/${V0}1/{v1_fool_heal,v1_fool_me}</div><div class='add'>+</div><div class='add'>+#Simulate v1-dirty(self-accusing but no pending ops on others) scenario for v1-dirty</div><div class='add'>+setfattr -x trusted.afr.$V0-client-0 $B0/${V0}1/v1_dirty_{heal,me}</div><div class='add'>+setfattr -n trusted.afr.$V0-client-1 -v 0x000000000000000000000001 $B0/${V0}1/v1_dirty_{heal,me}</div><div class='add'>+</div><div class='add'>+$CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 1</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}1</div><div class='add'>+</div><div class='add'>+TEST touch spb_heal/1 spb/0 spb_me_heal/1 spb_me/0 fool_heal/1 fool_me/1 v1_fool_heal/1 v1_fool_me/1</div><div class='add'>+</div><div class='add'>+$CLI volume stop $V0</div><div class='add'>+</div><div class='add'>+#simulate fool fool scenario for fool_* dirs</div><div class='add'>+setfattr -x trusted.afr.$V0-client-1 $B0/${V0}0/{fool_heal,fool_me}</div><div class='add'>+setfattr -n trusted.afr.dirty -v 0x000000000000000000000001 $B0/${V0}1/{fool_heal,fool_me}</div><div class='add'>+setfattr -n trusted.afr.$V0-client-0 -v 0x000000000000000000000001 $B0/${V0}1/{v1_fool_heal,v1_fool_me}</div><div class='add'>+</div><div class='add'>+#simulate self-accusing for source_self_accusing</div><div class='add'>+TEST setfattr -n trusted.afr.$V0-client-0 -v 0x000000000000000000000006 $B0/${V0}0/source_self_accusing</div><div class='add'>+</div><div class='add'>+$CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 1</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 0</div><div class='add'>+</div><div class='add'>+# Check if conservative merges happened correctly on _me_ dirs</div><div class='add'>+TEST stat spb_me_heal/1</div><div class='add'>+TEST stat $B0/${V0}0/spb_me_heal/1</div><div class='add'>+TEST stat $B0/${V0}1/spb_me_heal/1</div><div class='add'>+</div><div class='add'>+TEST stat spb_me_heal/0</div><div class='add'>+TEST stat $B0/${V0}0/spb_me_heal/0</div><div class='add'>+TEST stat $B0/${V0}1/spb_me_heal/0</div><div class='add'>+</div><div class='add'>+TEST stat fool_me/1</div><div class='add'>+TEST stat $B0/${V0}0/fool_me/1</div><div class='add'>+TEST stat $B0/${V0}1/fool_me/1</div><div class='add'>+</div><div class='add'>+TEST stat fool_me/0</div><div class='add'>+TEST stat $B0/${V0}0/fool_me/0</div><div class='add'>+TEST stat $B0/${V0}1/fool_me/0</div><div class='add'>+</div><div class='add'>+TEST stat v1_fool_me/0</div><div class='add'>+TEST stat $B0/${V0}0/v1_fool_me/0</div><div class='add'>+TEST stat $B0/${V0}1/v1_fool_me/0</div><div class='add'>+</div><div class='add'>+TEST stat v1_fool_me/1</div><div class='add'>+TEST stat $B0/${V0}0/v1_fool_me/1</div><div class='add'>+TEST stat $B0/${V0}1/v1_fool_me/1</div><div class='add'>+</div><div class='add'>+TEST stat v1_dirty_me/0</div><div class='add'>+TEST stat $B0/${V0}0/v1_dirty_me/0</div><div class='add'>+TEST stat $B0/${V0}1/v1_dirty_me/0</div><div class='add'>+</div><div class='add'>+#Check if files that have gfid-mismatches in _me_ are giving EIO</div><div class='add'>+TEST ! stat spb_me/0</div><div class='add'>+</div><div class='add'>+#Check if stale files are deleted on access</div><div class='add'>+TEST ! stat source_deletions_me/fifo</div><div class='add'>+TEST ! stat $B0/${V0}0/source_deletions_me/fifo</div><div class='add'>+TEST ! stat $B0/${V0}1/source_deletions_me/fifo</div><div class='add'>+TEST ! stat source_deletions_me/block</div><div class='add'>+TEST ! stat $B0/${V0}0/source_deletions_me/block</div><div class='add'>+TEST ! stat $B0/${V0}1/source_deletions_me/block</div><div class='add'>+TEST ! stat source_deletions_me/char</div><div class='add'>+TEST ! stat $B0/${V0}0/source_deletions_me/char</div><div class='add'>+TEST ! stat $B0/${V0}1/source_deletions_me/char</div><div class='add'>+TEST ! stat source_deletions_me/file</div><div class='add'>+TEST ! stat $B0/${V0}0/source_deletions_me/file</div><div class='add'>+TEST ! stat $B0/${V0}1/source_deletions_me/file</div><div class='add'>+TEST ! stat source_deletions_me/file</div><div class='add'>+TEST ! stat $B0/${V0}0/source_deletions_me/file</div><div class='add'>+TEST ! stat $B0/${V0}1/source_deletions_me/file</div><div class='add'>+TEST ! stat source_deletions_me/dir1/dir2</div><div class='add'>+TEST ! stat $B0/${V0}0/source_deletions_me/dir1/dir2</div><div class='add'>+TEST ! stat $B0/${V0}1/source_deletions_me/dir1/dir2</div><div class='add'>+TEST ! stat source_deletions_me/dir1</div><div class='add'>+TEST ! stat $B0/${V0}0/source_deletions_me/dir1</div><div class='add'>+TEST ! stat $B0/${V0}1/source_deletions_me/dir1</div><div class='add'>+</div><div class='add'>+#Test if the files created as part of access are healed correctly</div><div class='add'>+r=$(get_file_type source_creations_me/fifo)</div><div class='add'>+EXPECT "$r" get_file_type $B0/${V0}0/source_creations_me/fifo</div><div class='add'>+EXPECT "$r" get_file_type $B0/${V0}1/source_creations_me/fifo</div><div class='add'>+TEST [ -p source_creations_me/fifo ]</div><div class='add'>+</div><div class='add'>+r=$(get_file_type source_creations_me/block)</div><div class='add'>+EXPECT "$r" get_file_type $B0/${V0}0/source_creations_me/block</div><div class='add'>+EXPECT "$r" get_file_type $B0/${V0}1/source_creations_me/block</div><div class='add'>+EXPECT "^4 5$" stat -c "%t %T" $B0/${V0}1/source_creations_me/block</div><div class='add'>+EXPECT "^4 5$" stat -c "%t %T" $B0/${V0}0/source_creations_me/block</div><div class='add'>+TEST [ -b source_creations_me/block ]</div><div class='add'>+</div><div class='add'>+r=$(get_file_type source_creations_me/char)</div><div class='add'>+EXPECT "$r" get_file_type $B0/${V0}0/source_creations_me/char</div><div class='add'>+EXPECT "$r" get_file_type $B0/${V0}1/source_creations_me/char</div><div class='add'>+EXPECT "^1 5$" stat -c "%t %T" $B0/${V0}1/source_creations_me/char</div><div class='add'>+EXPECT "^1 5$" stat -c "%t %T" $B0/${V0}0/source_creations_me/char</div><div class='add'>+TEST [ -c source_creations_me/char ]</div><div class='add'>+</div><div class='add'>+r=$(get_file_type source_creations_me/file)</div><div class='add'>+EXPECT "$r" get_file_type $B0/${V0}0/source_creations_me/file</div><div class='add'>+EXPECT "$r" get_file_type $B0/${V0}1/source_creations_me/file</div><div class='add'>+TEST [ -f source_creations_me/file ]</div><div class='add'>+</div><div class='add'>+r=$(get_file_type source_creations_me/slink)</div><div class='add'>+EXPECT "$r" get_file_type $B0/${V0}0/source_creations_me/slink</div><div class='add'>+EXPECT "$r" get_file_type $B0/${V0}1/source_creations_me/slink</div><div class='add'>+TEST [ -h source_creations_me/slink ]</div><div class='add'>+</div><div class='add'>+r=$(get_file_type source_creations_me/dir1/dir2)</div><div class='add'>+EXPECT "$r" get_file_type $B0/${V0}0/source_creations_me/dir1/dir2</div><div class='add'>+EXPECT "$r" get_file_type $B0/${V0}1/source_creations_me/dir1/dir2</div><div class='add'>+TEST [ -d source_creations_me/dir1/dir2 ]</div><div class='add'>+</div><div class='add'>+r=$(get_file_type source_creations_me/dir1)</div><div class='add'>+EXPECT "$r" get_file_type $B0/${V0}0/source_creations_me/dir1</div><div class='add'>+EXPECT "$r" get_file_type $B0/${V0}1/source_creations_me/dir1</div><div class='add'>+TEST [ -d source_creations_me/dir1 ]</div><div class='add'>+</div><div class='add'>+#Trigger heal and check _heal dirs are healed properly</div><div class='add'>+#Trigger change in event generation number. That way inodes would get refreshed during lookup</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}1</div><div class='add'>+$CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 1</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 0</div><div class='add'>+</div><div class='add'>+TEST stat spb_heal</div><div class='add'>+TEST stat spb_me_heal</div><div class='add'>+TEST stat fool_heal</div><div class='add'>+TEST stat fool_me</div><div class='add'>+TEST stat v1_fool_heal</div><div class='add'>+TEST stat v1_fool_me</div><div class='add'>+TEST stat source_deletions_heal</div><div class='add'>+TEST stat source_deletions_me</div><div class='add'>+TEST stat source_self_accusing</div><div class='add'>+TEST stat source_creations_heal</div><div class='add'>+TEST stat source_creations_me</div><div class='add'>+TEST stat v1_dirty_heal</div><div class='add'>+TEST stat v1_dirty_me</div><div class='add'>+TEST $CLI volume stop $V0</div><div class='add'>+TEST rm -rf $B0/${V0}{0,1}/.glusterfs/indices/xattrop/*</div><div class='add'>+</div><div class='add'>+$CLI volume start $V0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 1</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 0</div><div class='add'>+</div><div class='add'>+#Create base entry in indices/xattrop</div><div class='add'>+echo "Data" &gt; $M0/FILE</div><div class='add'>+rm -f $M0/FILE</div><div class='add'>+EXPECT "1" count_index_entries $B0/${V0}0</div><div class='add'>+EXPECT "1" count_index_entries $B0/${V0}1</div><div class='add'>+</div><div class='add'>+TEST $CLI volume stop $V0;</div><div class='add'>+</div><div class='add'>+#Create entries for fool_heal and fool_me to ensure they are fully healed and dirty xattrs erased, before triggering index heal</div><div class='add'>+create_brick_xattrop_entry $B0/${V0}0 fool_heal fool_me source_creations_heal/dir1</div><div class='add'>+</div><div class='add'>+$CLI volume start $V0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 1</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 0</div><div class='add'>+</div><div class='add'>+$CLI volume heal $V0 enable</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "Y" glustershd_up_status</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 1</div><div class='add'>+</div><div class='add'>+TEST $CLI volume heal $V0;</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "~" print_pending_heals spb_heal spb_me_heal fool_heal fool_me v1_fool_heal v1_fool_me source_deletions_heal source_deletions_me source_creations_heal source_creations_me v1_dirty_heal v1_dirty_me source_self_accusing</div><div class='add'>+</div><div class='add'>+EXPECT "Y${zero_xattr}${zero_xattr}${zero_xattr}${zero_xattr}${zero_xattr}${zero_xattr}" heal_status $B0/${V0}0 $B0/${V0}1 spb_heal</div><div class='add'>+EXPECT "Y${zero_xattr}${zero_xattr}${zero_xattr}${zero_xattr}${zero_xattr}${zero_xattr}" heal_status $B0/${V0}0 $B0/${V0}1 spb_me_heal</div><div class='add'>+EXPECT "Y${zero_xattr}${zero_xattr}${zero_xattr}${zero_xattr}${zero_xattr}${zero_xattr}" heal_status $B0/${V0}0 $B0/${V0}1 fool_heal</div><div class='add'>+EXPECT "Y${zero_xattr}${zero_xattr}${zero_xattr}${zero_xattr}${zero_xattr}${zero_xattr}" heal_status $B0/${V0}0 $B0/${V0}1 fool_me</div><div class='add'>+EXPECT "Y${zero_xattr}${zero_xattr}${zero_xattr}${zero_xattr}${zero_xattr}${zero_xattr}" heal_status $B0/${V0}0 $B0/${V0}1 v1_fool_heal</div><div class='add'>+EXPECT "Y${zero_xattr}${zero_xattr}${zero_xattr}${zero_xattr}${zero_xattr}${zero_xattr}" heal_status $B0/${V0}0 $B0/${V0}1 v1_fool_me</div><div class='add'>+EXPECT "Y${zero_xattr}${zero_xattr}${zero_xattr}${zero_xattr}${zero_xattr}${zero_xattr}" heal_status $B0/${V0}0 $B0/${V0}1 source_deletions_heal</div><div class='add'>+EXPECT "Y${zero_xattr}${zero_xattr}${zero_xattr}${zero_xattr}${zero_xattr}${zero_xattr}" heal_status $B0/${V0}0 $B0/${V0}1 source_deletions_me</div><div class='add'>+EXPECT "Y${zero_xattr}${zero_xattr}${zero_xattr}${zero_xattr}${zero_xattr}${zero_xattr}" heal_status $B0/${V0}0 $B0/${V0}1 source_self_accusing</div><div class='add'>+EXPECT "Y${zero_xattr}${zero_xattr}${zero_xattr}${zero_xattr}${zero_xattr}${zero_xattr}" heal_status $B0/${V0}0 $B0/${V0}1 source_creations_heal</div><div class='add'>+EXPECT "Y${zero_xattr}${zero_xattr}${zero_xattr}${zero_xattr}${zero_xattr}${zero_xattr}" heal_status $B0/${V0}0 $B0/${V0}1 source_creations_me</div><div class='add'>+EXPECT "Y${zero_xattr}${zero_xattr}${zero_xattr}${zero_xattr}${zero_xattr}${zero_xattr}" heal_status $B0/${V0}0 $B0/${V0}1 v1_dirty_heal</div><div class='add'>+EXPECT "Y${zero_xattr}${zero_xattr}${zero_xattr}${zero_xattr}${zero_xattr}${zero_xattr}" heal_status $B0/${V0}0 $B0/${V0}1 v1_dirty_me</div><div class='add'>+</div><div class='add'>+#Don't access the files/dirs from mount point as that may cause self-heals</div><div class='add'>+# Check if conservative merges happened correctly on heal dirs</div><div class='add'>+TEST stat $B0/${V0}0/spb_heal/1</div><div class='add'>+TEST stat $B0/${V0}1/spb_heal/1</div><div class='add'>+</div><div class='add'>+TEST stat $B0/${V0}0/spb_heal/0</div><div class='add'>+TEST stat $B0/${V0}1/spb_heal/0</div><div class='add'>+</div><div class='add'>+TEST stat $B0/${V0}0/fool_heal/1</div><div class='add'>+TEST stat $B0/${V0}1/fool_heal/1</div><div class='add'>+</div><div class='add'>+TEST stat $B0/${V0}0/fool_heal/0</div><div class='add'>+TEST stat $B0/${V0}1/fool_heal/0</div><div class='add'>+</div><div class='add'>+TEST stat $B0/${V0}0/v1_fool_heal/0</div><div class='add'>+TEST stat $B0/${V0}1/v1_fool_heal/0</div><div class='add'>+</div><div class='add'>+TEST stat $B0/${V0}0/v1_fool_heal/1</div><div class='add'>+TEST stat $B0/${V0}1/v1_fool_heal/1</div><div class='add'>+</div><div class='add'>+TEST stat $B0/${V0}0/v1_dirty_heal/0</div><div class='add'>+TEST stat $B0/${V0}1/v1_dirty_heal/0</div><div class='add'>+</div><div class='add'>+#Check if files that have gfid-mismatches in spb are giving EIO</div><div class='add'>+TEST ! stat spb/0</div><div class='add'>+</div><div class='add'>+#Check if stale files are deleted on access</div><div class='add'>+TEST ! stat $B0/${V0}0/source_deletions_heal/fifo</div><div class='add'>+TEST ! stat $B0/${V0}1/source_deletions_heal/fifo</div><div class='add'>+TEST ! stat $B0/${V0}0/source_deletions_heal/block</div><div class='add'>+TEST ! stat $B0/${V0}1/source_deletions_heal/block</div><div class='add'>+TEST ! stat $B0/${V0}0/source_deletions_heal/char</div><div class='add'>+TEST ! stat $B0/${V0}1/source_deletions_heal/char</div><div class='add'>+TEST ! stat $B0/${V0}0/source_deletions_heal/file</div><div class='add'>+TEST ! stat $B0/${V0}1/source_deletions_heal/file</div><div class='add'>+TEST ! stat $B0/${V0}0/source_deletions_heal/file</div><div class='add'>+TEST ! stat $B0/${V0}1/source_deletions_heal/file</div><div class='add'>+TEST ! stat $B0/${V0}0/source_deletions_heal/dir1/dir2</div><div class='add'>+TEST ! stat $B0/${V0}1/source_deletions_heal/dir1/dir2</div><div class='add'>+TEST ! stat $B0/${V0}0/source_deletions_heal/dir1</div><div class='add'>+TEST ! stat $B0/${V0}1/source_deletions_heal/dir1</div><div class='add'>+</div><div class='add'>+#Check if stale files are deleted on access</div><div class='add'>+TEST ! stat $B0/${V0}0/source_self_accusing/fifo</div><div class='add'>+TEST ! stat $B0/${V0}1/source_self_accusing/fifo</div><div class='add'>+TEST ! stat $B0/${V0}0/source_self_accusing/block</div><div class='add'>+TEST ! stat $B0/${V0}1/source_self_accusing/block</div><div class='add'>+TEST ! stat $B0/${V0}0/source_self_accusing/char</div><div class='add'>+TEST ! stat $B0/${V0}1/source_self_accusing/char</div><div class='add'>+TEST ! stat $B0/${V0}0/source_self_accusing/file</div><div class='add'>+TEST ! stat $B0/${V0}1/source_self_accusing/file</div><div class='add'>+TEST ! stat $B0/${V0}0/source_self_accusing/file</div><div class='add'>+TEST ! stat $B0/${V0}1/source_self_accusing/file</div><div class='add'>+TEST ! stat $B0/${V0}0/source_self_accusing/dir1/dir2</div><div class='add'>+TEST ! stat $B0/${V0}1/source_self_accusing/dir1/dir2</div><div class='add'>+TEST ! stat $B0/${V0}0/source_self_accusing/dir1</div><div class='add'>+TEST ! stat $B0/${V0}1/source_self_accusing/dir1</div><div class='add'>+</div><div class='add'>+#Test if the files created as part of full self-heal correctly</div><div class='add'>+r=$(get_file_type $B0/${V0}0/source_creations_heal/fifo)</div><div class='add'>+EXPECT "$r" get_file_type $B0/${V0}1/source_creations_heal/fifo</div><div class='add'>+TEST [ -p $B0/${V0}0/source_creations_heal/fifo ]</div><div class='add'>+EXPECT "^4 5$" stat -c "%t %T" $B0/${V0}1/source_creations_heal/block</div><div class='add'>+EXPECT "^4 5$" stat -c "%t %T" $B0/${V0}0/source_creations_heal/block</div><div class='add'>+</div><div class='add'>+r=$(get_file_type $B0/${V0}0/source_creations_heal/block)</div><div class='add'>+EXPECT "$r" get_file_type $B0/${V0}1/source_creations_heal/block</div><div class='add'>+</div><div class='add'>+r=$(get_file_type $B0/${V0}0/source_creations_heal/char)</div><div class='add'>+EXPECT "$r" get_file_type $B0/${V0}1/source_creations_heal/char</div><div class='add'>+EXPECT "^1 5$" stat -c "%t %T" $B0/${V0}1/source_creations_heal/char</div><div class='add'>+EXPECT "^1 5$" stat -c "%t %T" $B0/${V0}0/source_creations_heal/char</div><div class='add'>+</div><div class='add'>+r=$(get_file_type $B0/${V0}0/source_creations_heal/file)</div><div class='add'>+EXPECT "$r" get_file_type $B0/${V0}1/source_creations_heal/file</div><div class='add'>+TEST [ -f $B0/${V0}0/source_creations_heal/file ]</div><div class='add'>+</div><div class='add'>+r=$(get_file_type source_creations_heal/file $B0/${V0}0/slink)</div><div class='add'>+EXPECT "$r" get_file_type $B0/${V0}1/source_creations_heal/file slink</div><div class='add'>+TEST [ -h $B0/${V0}0/source_creations_heal/slink ]</div><div class='add'>+</div><div class='add'>+r=$(get_file_type $B0/${V0}0/source_creations_heal/dir1/dir2)</div><div class='add'>+EXPECT "$r" get_file_type $B0/${V0}1/source_creations_heal/dir1/dir2</div><div class='add'>+TEST [ -d $B0/${V0}0/source_creations_heal/dir1/dir2 ]</div><div class='add'>+</div><div class='add'>+r=$(get_file_type $B0/${V0}0/source_creations_heal/dir1)</div><div class='add'>+EXPECT "$r" get_file_type $B0/${V0}1/source_creations_heal/dir1</div><div class='add'>+TEST [ -d $B0/${V0}0/source_creations_heal/dir1 ]</div><div class='add'>+</div><div class='add'>+cd -</div><div class='add'>+</div><div class='add'>+#Anonymous directory shouldn't be created</div><div class='add'>+TEST mkdir $M0/rename-dir</div><div class='add'>+before_rename=$(STAT_INO $B0/${V0}1/rename-dir)</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}1</div><div class='add'>+TEST mv $M0/rename-dir $M0/new-name</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+#'spb' is in split-brain so pending-heal-count will be 2</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "^2$" get_pending_heal_count $V0</div><div class='add'>+after_rename=$(STAT_INO $B0/${V0}1/new-name)</div><div class='add'>+EXPECT "0" echo $(ls -a $B0/${V0}0/ | grep anonymous-inode | wc -l)</div><div class='add'>+EXPECT "0" echo $(ls -a $B0/${V0}1/ | grep anonymous-inode | wc -l)</div><div class='add'>+EXPECT_NOT "$before_rename" echo $after_rename</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/basic/afr/entry-self-heal.t b/tests/basic/afr/entry-self-heal.t<br/>new file mode 100644<br/>index 00000000000..0c1da7d211e<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/afr/entry-self-heal.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/afr/entry-self-heal.t</a></div><div class='hunk'>@@ -0,0 +1,447 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+#This file checks if missing entry self-heal and entry self-heal are working</div><div class='add'>+#as expected.</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+. $(dirname $0)/../../afr.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+function get_file_type {</div><div class='add'>+        stat -c "%a:%F:%g:%t:%T:%u" $1</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function diff_dirs {</div><div class='add'>+        diff &lt;(ls $1 | sort) &lt;(ls $2 | sort)</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function heal_status {</div><div class='add'>+        local f1_path="${1}/${3}"</div><div class='add'>+        local f2_path="${2}/${3}"</div><div class='add'>+        local zero_xattr="000000000000000000000000"</div><div class='add'>+        local insync=""</div><div class='add'>+        diff_dirs $f1_path $f2_path</div><div class='add'>+        if [ $? -eq 0 ];</div><div class='add'>+        then</div><div class='add'>+                insync="Y"</div><div class='add'>+        else</div><div class='add'>+                insync="N"</div><div class='add'>+        fi</div><div class='add'>+        local xattr11=$(get_hex_xattr trusted.afr.$V0-client-0 $f1_path)</div><div class='add'>+        local xattr12=$(get_hex_xattr trusted.afr.$V0-client-1 $f1_path)</div><div class='add'>+        local xattr21=$(get_hex_xattr trusted.afr.$V0-client-0 $f2_path)</div><div class='add'>+        local xattr22=$(get_hex_xattr trusted.afr.$V0-client-1 $f2_path)</div><div class='add'>+        local dirty1=$(get_hex_xattr trusted.afr.dirty $f1_path)</div><div class='add'>+        local dirty2=$(get_hex_xattr trusted.afr.dirty $f2_path)</div><div class='add'>+        if [ -z $xattr11 ]; then xattr11="000000000000000000000000"; fi</div><div class='add'>+        if [ -z $xattr12 ]; then xattr12="000000000000000000000000"; fi</div><div class='add'>+        if [ -z $xattr21 ]; then xattr21="000000000000000000000000"; fi</div><div class='add'>+        if [ -z $xattr22 ]; then xattr22="000000000000000000000000"; fi</div><div class='add'>+        if [ -z $dirty1 ]; then dirty1="000000000000000000000000"; fi</div><div class='add'>+        if [ -z $dirty2 ]; then dirty2="000000000000000000000000"; fi</div><div class='add'>+        echo ${insync}${xattr11}${xattr12}${xattr21}${xattr22}${dirty1}${dirty2}</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function is_heal_done {</div><div class='add'>+        local zero_xattr="000000000000000000000000"</div><div class='add'>+        if [ "$(heal_status $@)" == "Y${zero_xattr}${zero_xattr}${zero_xattr}${zero_xattr}${zero_xattr}${zero_xattr}" ];</div><div class='add'>+        then</div><div class='add'>+                echo "Y"</div><div class='add'>+        else</div><div class='add'>+                echo "N"</div><div class='add'>+        fi</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function print_pending_heals {</div><div class='add'>+        local result=":"</div><div class='add'>+        for i in "$@";</div><div class='add'>+        do</div><div class='add'>+                if [ "N" == $(is_heal_done $B0/${V0}0 $B0/${V0}1 $i) ];</div><div class='add'>+                then</div><div class='add'>+                        result="$result:$i"</div><div class='add'>+                fi</div><div class='add'>+        done</div><div class='add'>+#To prevent any match for EXPECT_WITHIN, print a char non-existent in file-names</div><div class='add'>+        if [ $result == ":" ]; then result="~"; fi</div><div class='add'>+        echo $result</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+zero_xattr="000000000000000000000000"</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 replica 2 $H0:$B0/${V0}{0,1}</div><div class='add'>+TEST $CLI volume set $V0 self-heal-daemon off</div><div class='add'>+TEST $CLI volume set $V0 performance.write-behind off</div><div class='add'>+TEST $CLI volume set $V0 performance.read-ahead off</div><div class='add'>+TEST $CLI volume set $V0 performance.readdir-ahead off</div><div class='add'>+TEST $CLI volume set $V0 performance.open-behind off</div><div class='add'>+TEST $CLI volume set $V0 performance.stat-prefetch off</div><div class='add'>+TEST $CLI volume set $V0 performance.io-cache off</div><div class='add'>+TEST $CLI volume set $V0 performance.quick-read off</div><div class='add'>+TEST $CLI volume set $V0 cluster.data-self-heal on</div><div class='add'>+TEST $CLI volume set $V0 cluster.metadata-self-heal on</div><div class='add'>+TEST $CLI volume set $V0 cluster.entry-self-heal on</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+TEST $GFS --volfile-id=/$V0 --volfile-server=$H0 --use-readdirp=no $M0</div><div class='add'>+cd $M0</div><div class='add'>+#_me_ is dir on which missing entry self-heal happens, _heal is where dir self-heal happens</div><div class='add'>+#spb is split-brain, fool is all fool</div><div class='add'>+</div><div class='add'>+#source_self_accusing means there exists source and a sink which self-accuses.</div><div class='add'>+#This simulates failures where fops failed on the bricks without it going down.</div><div class='add'>+#Something like EACCESS/EDQUOT etc</div><div class='add'>+</div><div class='add'>+TEST mkdir spb_heal spb spb_me_heal spb_me fool_heal fool_me v1_fool_heal v1_fool_me source_creations_heal source_deletions_heal source_creations_me source_deletions_me v1_dirty_me v1_dirty_heal source_self_accusing</div><div class='add'>+TEST mkfifo source_deletions_heal/fifo</div><div class='add'>+TEST mknod  source_deletions_heal/block b 4 5</div><div class='add'>+TEST mknod  source_deletions_heal/char c 1 5</div><div class='add'>+TEST touch  source_deletions_heal/file</div><div class='add'>+TEST ln -s  source_deletions_heal/file source_deletions_heal/slink</div><div class='add'>+TEST mkdir  source_deletions_heal/dir1</div><div class='add'>+TEST mkdir  source_deletions_heal/dir1/dir2</div><div class='add'>+</div><div class='add'>+TEST mkfifo source_deletions_me/fifo</div><div class='add'>+TEST mknod  source_deletions_me/block b 4 5</div><div class='add'>+TEST mknod  source_deletions_me/char c 1 5</div><div class='add'>+TEST touch  source_deletions_me/file</div><div class='add'>+TEST ln -s  source_deletions_me/file source_deletions_me/slink</div><div class='add'>+TEST mkdir  source_deletions_me/dir1</div><div class='add'>+TEST mkdir  source_deletions_me/dir1/dir2</div><div class='add'>+</div><div class='add'>+TEST mkfifo source_self_accusing/fifo</div><div class='add'>+TEST mknod  source_self_accusing/block b 4 5</div><div class='add'>+TEST mknod  source_self_accusing/char c 1 5</div><div class='add'>+TEST touch  source_self_accusing/file</div><div class='add'>+TEST ln -s  source_self_accusing/file source_self_accusing/slink</div><div class='add'>+TEST mkdir  source_self_accusing/dir1</div><div class='add'>+TEST mkdir  source_self_accusing/dir1/dir2</div><div class='add'>+</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}0</div><div class='add'>+</div><div class='add'>+TEST touch spb_heal/0 spb/0 spb_me_heal/0 spb_me/0 fool_heal/0 fool_me/0 v1_fool_heal/0 v1_fool_me/0 v1_dirty_heal/0 v1_dirty_me/0</div><div class='add'>+TEST rm -rf source_deletions_heal/fifo source_deletions_heal/block source_deletions_heal/char source_deletions_heal/file source_deletions_heal/slink source_deletions_heal/dir1</div><div class='add'>+TEST rm -rf source_deletions_me/fifo source_deletions_me/block source_deletions_me/char source_deletions_me/file source_deletions_me/slink source_deletions_me/dir1</div><div class='add'>+TEST rm -rf source_self_accusing/fifo source_self_accusing/block source_self_accusing/char source_self_accusing/file source_self_accusing/slink source_self_accusing/dir1</div><div class='add'>+</div><div class='add'>+#Test that the files are deleted</div><div class='add'>+TEST ! stat $B0/${V0}1/source_deletions_heal/fifo</div><div class='add'>+TEST ! stat $B0/${V0}1/source_deletions_heal/block</div><div class='add'>+TEST ! stat $B0/${V0}1/source_deletions_heal/char</div><div class='add'>+TEST ! stat $B0/${V0}1/source_deletions_heal/file</div><div class='add'>+TEST ! stat $B0/${V0}1/source_deletions_heal/slink</div><div class='add'>+TEST ! stat $B0/${V0}1/source_deletions_heal/dir1</div><div class='add'>+TEST ! stat $B0/${V0}1/source_deletions_me/fifo</div><div class='add'>+TEST ! stat $B0/${V0}1/source_deletions_me/block</div><div class='add'>+TEST ! stat $B0/${V0}1/source_deletions_me/char</div><div class='add'>+TEST ! stat $B0/${V0}1/source_deletions_me/file</div><div class='add'>+TEST ! stat $B0/${V0}1/source_deletions_me/slink</div><div class='add'>+TEST ! stat $B0/${V0}1/source_deletions_me/dir1</div><div class='add'>+TEST ! stat $B0/${V0}1/source_self_accusing/fifo</div><div class='add'>+TEST ! stat $B0/${V0}1/source_self_accusing/block</div><div class='add'>+TEST ! stat $B0/${V0}1/source_self_accusing/char</div><div class='add'>+TEST ! stat $B0/${V0}1/source_self_accusing/file</div><div class='add'>+TEST ! stat $B0/${V0}1/source_self_accusing/slink</div><div class='add'>+TEST ! stat $B0/${V0}1/source_self_accusing/dir1</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+TEST mkfifo source_creations_heal/fifo</div><div class='add'>+TEST mknod  source_creations_heal/block b 4 5</div><div class='add'>+TEST mknod  source_creations_heal/char c 1 5</div><div class='add'>+TEST touch  source_creations_heal/file</div><div class='add'>+TEST ln -s  source_creations_heal/file source_creations_heal/slink</div><div class='add'>+TEST mkdir  source_creations_heal/dir1</div><div class='add'>+TEST mkdir  source_creations_heal/dir1/dir2</div><div class='add'>+</div><div class='add'>+TEST mkfifo source_creations_me/fifo</div><div class='add'>+TEST mknod  source_creations_me/block b 4 5</div><div class='add'>+TEST mknod  source_creations_me/char c 1 5</div><div class='add'>+TEST touch  source_creations_me/file</div><div class='add'>+TEST ln -s  source_creations_me/file source_creations_me/slink</div><div class='add'>+TEST mkdir  source_creations_me/dir1</div><div class='add'>+TEST mkdir  source_creations_me/dir1/dir2</div><div class='add'>+</div><div class='add'>+$CLI volume stop $V0</div><div class='add'>+</div><div class='add'>+#simulate fool fool scenario for fool_* dirs</div><div class='add'>+setfattr -x trusted.afr.$V0-client-0 $B0/${V0}1/{fool_heal,fool_me}</div><div class='add'>+setfattr -n trusted.afr.dirty -v 0x000000000000000000000001 $B0/${V0}1/{fool_heal,fool_me}</div><div class='add'>+setfattr -n trusted.afr.$V0-client-1 -v 0x000000000000000000000001 $B0/${V0}1/{v1_fool_heal,v1_fool_me}</div><div class='add'>+</div><div class='add'>+#Simulate v1-dirty(self-accusing but no pending ops on others) scenario for v1-dirty</div><div class='add'>+setfattr -x trusted.afr.$V0-client-0 $B0/${V0}1/v1_dirty_{heal,me}</div><div class='add'>+setfattr -n trusted.afr.$V0-client-1 -v 0x000000000000000000000001 $B0/${V0}1/v1_dirty_{heal,me}</div><div class='add'>+</div><div class='add'>+$CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 1</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}1</div><div class='add'>+</div><div class='add'>+TEST touch spb_heal/1 spb/0 spb_me_heal/1 spb_me/0 fool_heal/1 fool_me/1 v1_fool_heal/1 v1_fool_me/1</div><div class='add'>+</div><div class='add'>+$CLI volume stop $V0</div><div class='add'>+</div><div class='add'>+#simulate fool fool scenario for fool_* dirs</div><div class='add'>+setfattr -x trusted.afr.$V0-client-1 $B0/${V0}0/{fool_heal,fool_me}</div><div class='add'>+setfattr -n trusted.afr.dirty -v 0x000000000000000000000001 $B0/${V0}1/{fool_heal,fool_me}</div><div class='add'>+setfattr -n trusted.afr.$V0-client-0 -v 0x000000000000000000000001 $B0/${V0}1/{v1_fool_heal,v1_fool_me}</div><div class='add'>+</div><div class='add'>+#simulate self-accusing for source_self_accusing</div><div class='add'>+TEST setfattr -n trusted.afr.$V0-client-0 -v 0x000000000000000000000006 $B0/${V0}0/source_self_accusing</div><div class='add'>+</div><div class='add'>+$CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 1</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 0</div><div class='add'>+</div><div class='add'>+# Check if conservative merges happened correctly on _me_ dirs</div><div class='add'>+TEST stat spb_me_heal/1</div><div class='add'>+TEST stat $B0/${V0}0/spb_me_heal/1</div><div class='add'>+TEST stat $B0/${V0}1/spb_me_heal/1</div><div class='add'>+</div><div class='add'>+TEST stat spb_me_heal/0</div><div class='add'>+TEST stat $B0/${V0}0/spb_me_heal/0</div><div class='add'>+TEST stat $B0/${V0}1/spb_me_heal/0</div><div class='add'>+</div><div class='add'>+TEST stat fool_me/1</div><div class='add'>+TEST stat $B0/${V0}0/fool_me/1</div><div class='add'>+TEST stat $B0/${V0}1/fool_me/1</div><div class='add'>+</div><div class='add'>+TEST stat fool_me/0</div><div class='add'>+TEST stat $B0/${V0}0/fool_me/0</div><div class='add'>+TEST stat $B0/${V0}1/fool_me/0</div><div class='add'>+</div><div class='add'>+TEST stat v1_fool_me/0</div><div class='add'>+TEST stat $B0/${V0}0/v1_fool_me/0</div><div class='add'>+TEST stat $B0/${V0}1/v1_fool_me/0</div><div class='add'>+</div><div class='add'>+TEST stat v1_fool_me/1</div><div class='add'>+TEST stat $B0/${V0}0/v1_fool_me/1</div><div class='add'>+TEST stat $B0/${V0}1/v1_fool_me/1</div><div class='add'>+</div><div class='add'>+TEST stat v1_dirty_me/0</div><div class='add'>+TEST stat $B0/${V0}0/v1_dirty_me/0</div><div class='add'>+TEST stat $B0/${V0}1/v1_dirty_me/0</div><div class='add'>+</div><div class='add'>+#Check if files that have gfid-mismatches in _me_ are giving EIO</div><div class='add'>+TEST ! stat spb_me/0</div><div class='add'>+</div><div class='add'>+#Check if stale files are deleted on access</div><div class='add'>+TEST ! stat source_deletions_me/fifo</div><div class='add'>+TEST ! stat $B0/${V0}0/source_deletions_me/fifo</div><div class='add'>+TEST ! stat $B0/${V0}1/source_deletions_me/fifo</div><div class='add'>+TEST ! stat source_deletions_me/block</div><div class='add'>+TEST ! stat $B0/${V0}0/source_deletions_me/block</div><div class='add'>+TEST ! stat $B0/${V0}1/source_deletions_me/block</div><div class='add'>+TEST ! stat source_deletions_me/char</div><div class='add'>+TEST ! stat $B0/${V0}0/source_deletions_me/char</div><div class='add'>+TEST ! stat $B0/${V0}1/source_deletions_me/char</div><div class='add'>+TEST ! stat source_deletions_me/file</div><div class='add'>+TEST ! stat $B0/${V0}0/source_deletions_me/file</div><div class='add'>+TEST ! stat $B0/${V0}1/source_deletions_me/file</div><div class='add'>+TEST ! stat source_deletions_me/file</div><div class='add'>+TEST ! stat $B0/${V0}0/source_deletions_me/file</div><div class='add'>+TEST ! stat $B0/${V0}1/source_deletions_me/file</div><div class='add'>+TEST ! stat source_deletions_me/dir1/dir2</div><div class='add'>+TEST ! stat $B0/${V0}0/source_deletions_me/dir1/dir2</div><div class='add'>+TEST ! stat $B0/${V0}1/source_deletions_me/dir1/dir2</div><div class='add'>+TEST ! stat source_deletions_me/dir1</div><div class='add'>+TEST ! stat $B0/${V0}0/source_deletions_me/dir1</div><div class='add'>+TEST ! stat $B0/${V0}1/source_deletions_me/dir1</div><div class='add'>+</div><div class='add'>+#Test if the files created as part of access are healed correctly</div><div class='add'>+r=$(get_file_type source_creations_me/fifo)</div><div class='add'>+EXPECT "$r" get_file_type $B0/${V0}0/source_creations_me/fifo</div><div class='add'>+EXPECT "$r" get_file_type $B0/${V0}1/source_creations_me/fifo</div><div class='add'>+TEST [ -p source_creations_me/fifo ]</div><div class='add'>+</div><div class='add'>+r=$(get_file_type source_creations_me/block)</div><div class='add'>+EXPECT "$r" get_file_type $B0/${V0}0/source_creations_me/block</div><div class='add'>+EXPECT "$r" get_file_type $B0/${V0}1/source_creations_me/block</div><div class='add'>+EXPECT "^4 5$" stat -c "%t %T" $B0/${V0}1/source_creations_me/block</div><div class='add'>+EXPECT "^4 5$" stat -c "%t %T" $B0/${V0}0/source_creations_me/block</div><div class='add'>+TEST [ -b source_creations_me/block ]</div><div class='add'>+</div><div class='add'>+r=$(get_file_type source_creations_me/char)</div><div class='add'>+EXPECT "$r" get_file_type $B0/${V0}0/source_creations_me/char</div><div class='add'>+EXPECT "$r" get_file_type $B0/${V0}1/source_creations_me/char</div><div class='add'>+EXPECT "^1 5$" stat -c "%t %T" $B0/${V0}1/source_creations_me/char</div><div class='add'>+EXPECT "^1 5$" stat -c "%t %T" $B0/${V0}0/source_creations_me/char</div><div class='add'>+TEST [ -c source_creations_me/char ]</div><div class='add'>+</div><div class='add'>+r=$(get_file_type source_creations_me/file)</div><div class='add'>+EXPECT "$r" get_file_type $B0/${V0}0/source_creations_me/file</div><div class='add'>+EXPECT "$r" get_file_type $B0/${V0}1/source_creations_me/file</div><div class='add'>+TEST [ -f source_creations_me/file ]</div><div class='add'>+</div><div class='add'>+r=$(get_file_type source_creations_me/slink)</div><div class='add'>+EXPECT "$r" get_file_type $B0/${V0}0/source_creations_me/slink</div><div class='add'>+EXPECT "$r" get_file_type $B0/${V0}1/source_creations_me/slink</div><div class='add'>+TEST [ -h source_creations_me/slink ]</div><div class='add'>+</div><div class='add'>+r=$(get_file_type source_creations_me/dir1/dir2)</div><div class='add'>+EXPECT "$r" get_file_type $B0/${V0}0/source_creations_me/dir1/dir2</div><div class='add'>+EXPECT "$r" get_file_type $B0/${V0}1/source_creations_me/dir1/dir2</div><div class='add'>+TEST [ -d source_creations_me/dir1/dir2 ]</div><div class='add'>+</div><div class='add'>+r=$(get_file_type source_creations_me/dir1)</div><div class='add'>+EXPECT "$r" get_file_type $B0/${V0}0/source_creations_me/dir1</div><div class='add'>+EXPECT "$r" get_file_type $B0/${V0}1/source_creations_me/dir1</div><div class='add'>+TEST [ -d source_creations_me/dir1 ]</div><div class='add'>+</div><div class='add'>+#Trigger heal and check _heal dirs are healed properly</div><div class='add'>+#Trigger change in event generation number. That way inodes would get refreshed during lookup</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}1</div><div class='add'>+$CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 1</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 0</div><div class='add'>+</div><div class='add'>+TEST stat spb_heal</div><div class='add'>+TEST stat spb_me_heal</div><div class='add'>+TEST stat fool_heal</div><div class='add'>+TEST stat fool_me</div><div class='add'>+TEST stat v1_fool_heal</div><div class='add'>+TEST stat v1_fool_me</div><div class='add'>+TEST stat source_deletions_heal</div><div class='add'>+TEST stat source_deletions_me</div><div class='add'>+TEST stat source_self_accusing</div><div class='add'>+TEST stat source_creations_heal</div><div class='add'>+TEST stat source_creations_me</div><div class='add'>+TEST stat v1_dirty_heal</div><div class='add'>+TEST stat v1_dirty_me</div><div class='add'>+TEST $CLI volume stop $V0</div><div class='add'>+TEST rm -rf $B0/${V0}{0,1}/.glusterfs/indices/xattrop/*</div><div class='add'>+</div><div class='add'>+$CLI volume start $V0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 1</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 0</div><div class='add'>+</div><div class='add'>+#Create base entry in indices/xattrop</div><div class='add'>+echo "Data" &gt; $M0/FILE</div><div class='add'>+rm -f $M0/FILE</div><div class='add'>+EXPECT "1" count_index_entries $B0/${V0}0</div><div class='add'>+EXPECT "1" count_index_entries $B0/${V0}1</div><div class='add'>+</div><div class='add'>+TEST $CLI volume stop $V0;</div><div class='add'>+</div><div class='add'>+#Create entries for fool_heal and fool_me to ensure they are fully healed and dirty xattrs erased, before triggering index heal</div><div class='add'>+create_brick_xattrop_entry $B0/${V0}0 fool_heal fool_me source_creations_heal/dir1</div><div class='add'>+</div><div class='add'>+$CLI volume start $V0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 1</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 0</div><div class='add'>+</div><div class='add'>+$CLI volume set $V0 self-heal-daemon on</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "Y" glustershd_up_status</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 1</div><div class='add'>+</div><div class='add'>+TEST $CLI volume heal $V0;</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "~" print_pending_heals spb_heal spb_me_heal fool_heal fool_me v1_fool_heal v1_fool_me source_deletions_heal source_deletions_me source_creations_heal source_creations_me v1_dirty_heal v1_dirty_me source_self_accusing</div><div class='add'>+</div><div class='add'>+EXPECT "Y${zero_xattr}${zero_xattr}${zero_xattr}${zero_xattr}${zero_xattr}${zero_xattr}" heal_status $B0/${V0}0 $B0/${V0}1 spb_heal</div><div class='add'>+EXPECT "Y${zero_xattr}${zero_xattr}${zero_xattr}${zero_xattr}${zero_xattr}${zero_xattr}" heal_status $B0/${V0}0 $B0/${V0}1 spb_me_heal</div><div class='add'>+EXPECT "Y${zero_xattr}${zero_xattr}${zero_xattr}${zero_xattr}${zero_xattr}${zero_xattr}" heal_status $B0/${V0}0 $B0/${V0}1 fool_heal</div><div class='add'>+EXPECT "Y${zero_xattr}${zero_xattr}${zero_xattr}${zero_xattr}${zero_xattr}${zero_xattr}" heal_status $B0/${V0}0 $B0/${V0}1 fool_me</div><div class='add'>+EXPECT "Y${zero_xattr}${zero_xattr}${zero_xattr}${zero_xattr}${zero_xattr}${zero_xattr}" heal_status $B0/${V0}0 $B0/${V0}1 v1_fool_heal</div><div class='add'>+EXPECT "Y${zero_xattr}${zero_xattr}${zero_xattr}${zero_xattr}${zero_xattr}${zero_xattr}" heal_status $B0/${V0}0 $B0/${V0}1 v1_fool_me</div><div class='add'>+EXPECT "Y${zero_xattr}${zero_xattr}${zero_xattr}${zero_xattr}${zero_xattr}${zero_xattr}" heal_status $B0/${V0}0 $B0/${V0}1 source_deletions_heal</div><div class='add'>+EXPECT "Y${zero_xattr}${zero_xattr}${zero_xattr}${zero_xattr}${zero_xattr}${zero_xattr}" heal_status $B0/${V0}0 $B0/${V0}1 source_deletions_me</div><div class='add'>+EXPECT "Y${zero_xattr}${zero_xattr}${zero_xattr}${zero_xattr}${zero_xattr}${zero_xattr}" heal_status $B0/${V0}0 $B0/${V0}1 source_self_accusing</div><div class='add'>+EXPECT "Y${zero_xattr}${zero_xattr}${zero_xattr}${zero_xattr}${zero_xattr}${zero_xattr}" heal_status $B0/${V0}0 $B0/${V0}1 source_creations_heal</div><div class='add'>+EXPECT "Y${zero_xattr}${zero_xattr}${zero_xattr}${zero_xattr}${zero_xattr}${zero_xattr}" heal_status $B0/${V0}0 $B0/${V0}1 source_creations_me</div><div class='add'>+EXPECT "Y${zero_xattr}${zero_xattr}${zero_xattr}${zero_xattr}${zero_xattr}${zero_xattr}" heal_status $B0/${V0}0 $B0/${V0}1 v1_dirty_heal</div><div class='add'>+EXPECT "Y${zero_xattr}${zero_xattr}${zero_xattr}${zero_xattr}${zero_xattr}${zero_xattr}" heal_status $B0/${V0}0 $B0/${V0}1 v1_dirty_me</div><div class='add'>+</div><div class='add'>+#Don't access the files/dirs from mount point as that may cause self-heals</div><div class='add'>+# Check if conservative merges happened correctly on heal dirs</div><div class='add'>+TEST stat $B0/${V0}0/spb_heal/1</div><div class='add'>+TEST stat $B0/${V0}1/spb_heal/1</div><div class='add'>+</div><div class='add'>+TEST stat $B0/${V0}0/spb_heal/0</div><div class='add'>+TEST stat $B0/${V0}1/spb_heal/0</div><div class='add'>+</div><div class='add'>+TEST stat $B0/${V0}0/fool_heal/1</div><div class='add'>+TEST stat $B0/${V0}1/fool_heal/1</div><div class='add'>+</div><div class='add'>+TEST stat $B0/${V0}0/fool_heal/0</div><div class='add'>+TEST stat $B0/${V0}1/fool_heal/0</div><div class='add'>+</div><div class='add'>+TEST stat $B0/${V0}0/v1_fool_heal/0</div><div class='add'>+TEST stat $B0/${V0}1/v1_fool_heal/0</div><div class='add'>+</div><div class='add'>+TEST stat $B0/${V0}0/v1_fool_heal/1</div><div class='add'>+TEST stat $B0/${V0}1/v1_fool_heal/1</div><div class='add'>+</div><div class='add'>+TEST stat $B0/${V0}0/v1_dirty_heal/0</div><div class='add'>+TEST stat $B0/${V0}1/v1_dirty_heal/0</div><div class='add'>+</div><div class='add'>+#Check if files that have gfid-mismatches in spb are giving EIO</div><div class='add'>+TEST ! stat spb/0</div><div class='add'>+</div><div class='add'>+#Check if stale files are deleted on access</div><div class='add'>+TEST ! stat $B0/${V0}0/source_deletions_heal/fifo</div><div class='add'>+TEST ! stat $B0/${V0}1/source_deletions_heal/fifo</div><div class='add'>+TEST ! stat $B0/${V0}0/source_deletions_heal/block</div><div class='add'>+TEST ! stat $B0/${V0}1/source_deletions_heal/block</div><div class='add'>+TEST ! stat $B0/${V0}0/source_deletions_heal/char</div><div class='add'>+TEST ! stat $B0/${V0}1/source_deletions_heal/char</div><div class='add'>+TEST ! stat $B0/${V0}0/source_deletions_heal/file</div><div class='add'>+TEST ! stat $B0/${V0}1/source_deletions_heal/file</div><div class='add'>+TEST ! stat $B0/${V0}0/source_deletions_heal/file</div><div class='add'>+TEST ! stat $B0/${V0}1/source_deletions_heal/file</div><div class='add'>+TEST ! stat $B0/${V0}0/source_deletions_heal/dir1/dir2</div><div class='add'>+TEST ! stat $B0/${V0}1/source_deletions_heal/dir1/dir2</div><div class='add'>+TEST ! stat $B0/${V0}0/source_deletions_heal/dir1</div><div class='add'>+TEST ! stat $B0/${V0}1/source_deletions_heal/dir1</div><div class='add'>+</div><div class='add'>+#Check if stale files are deleted on access</div><div class='add'>+TEST ! stat $B0/${V0}0/source_self_accusing/fifo</div><div class='add'>+TEST ! stat $B0/${V0}1/source_self_accusing/fifo</div><div class='add'>+TEST ! stat $B0/${V0}0/source_self_accusing/block</div><div class='add'>+TEST ! stat $B0/${V0}1/source_self_accusing/block</div><div class='add'>+TEST ! stat $B0/${V0}0/source_self_accusing/char</div><div class='add'>+TEST ! stat $B0/${V0}1/source_self_accusing/char</div><div class='add'>+TEST ! stat $B0/${V0}0/source_self_accusing/file</div><div class='add'>+TEST ! stat $B0/${V0}1/source_self_accusing/file</div><div class='add'>+TEST ! stat $B0/${V0}0/source_self_accusing/file</div><div class='add'>+TEST ! stat $B0/${V0}1/source_self_accusing/file</div><div class='add'>+TEST ! stat $B0/${V0}0/source_self_accusing/dir1/dir2</div><div class='add'>+TEST ! stat $B0/${V0}1/source_self_accusing/dir1/dir2</div><div class='add'>+TEST ! stat $B0/${V0}0/source_self_accusing/dir1</div><div class='add'>+TEST ! stat $B0/${V0}1/source_self_accusing/dir1</div><div class='add'>+</div><div class='add'>+#Test if the files created as part of full self-heal correctly</div><div class='add'>+r=$(get_file_type $B0/${V0}0/source_creations_heal/fifo)</div><div class='add'>+EXPECT "$r" get_file_type $B0/${V0}1/source_creations_heal/fifo</div><div class='add'>+TEST [ -p $B0/${V0}0/source_creations_heal/fifo ]</div><div class='add'>+EXPECT "^4 5$" stat -c "%t %T" $B0/${V0}1/source_creations_heal/block</div><div class='add'>+EXPECT "^4 5$" stat -c "%t %T" $B0/${V0}0/source_creations_heal/block</div><div class='add'>+</div><div class='add'>+r=$(get_file_type $B0/${V0}0/source_creations_heal/block)</div><div class='add'>+EXPECT "$r" get_file_type $B0/${V0}1/source_creations_heal/block</div><div class='add'>+</div><div class='add'>+r=$(get_file_type $B0/${V0}0/source_creations_heal/char)</div><div class='add'>+EXPECT "$r" get_file_type $B0/${V0}1/source_creations_heal/char</div><div class='add'>+EXPECT "^1 5$" stat -c "%t %T" $B0/${V0}1/source_creations_heal/char</div><div class='add'>+EXPECT "^1 5$" stat -c "%t %T" $B0/${V0}0/source_creations_heal/char</div><div class='add'>+</div><div class='add'>+r=$(get_file_type $B0/${V0}0/source_creations_heal/file)</div><div class='add'>+EXPECT "$r" get_file_type $B0/${V0}1/source_creations_heal/file</div><div class='add'>+TEST [ -f $B0/${V0}0/source_creations_heal/file ]</div><div class='add'>+</div><div class='add'>+r=$(get_file_type source_creations_heal/file $B0/${V0}0/slink)</div><div class='add'>+EXPECT "$r" get_file_type $B0/${V0}1/source_creations_heal/file slink</div><div class='add'>+TEST [ -h $B0/${V0}0/source_creations_heal/slink ]</div><div class='add'>+</div><div class='add'>+r=$(get_file_type $B0/${V0}0/source_creations_heal/dir1/dir2)</div><div class='add'>+EXPECT "$r" get_file_type $B0/${V0}1/source_creations_heal/dir1/dir2</div><div class='add'>+TEST [ -d $B0/${V0}0/source_creations_heal/dir1/dir2 ]</div><div class='add'>+</div><div class='add'>+r=$(get_file_type $B0/${V0}0/source_creations_heal/dir1)</div><div class='add'>+EXPECT "$r" get_file_type $B0/${V0}1/source_creations_heal/dir1</div><div class='add'>+TEST [ -d $B0/${V0}0/source_creations_heal/dir1 ]</div><div class='add'>+</div><div class='add'>+cd -</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/basic/afr/gfid-heal.t b/tests/basic/afr/gfid-heal.t<br/>new file mode 100644<br/>index 00000000000..5e26e3307eb<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/afr/gfid-heal.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/afr/gfid-heal.t</a></div><div class='hunk'>@@ -0,0 +1,33 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+#gfid self-heal test on distributed replica. Make sure all the gfids are same</div><div class='add'>+#and the gfid exists on all the bricks</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+function get_gfid_count {</div><div class='add'>+        getfattr -d -m. -e hex $B0/brick{0,1,2,3,4,5}/$1 2&gt;&amp;1 | grep trusted.gfid | grep -v gfid2path | wc -l</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 replica 2 $H0:$B0/brick{0,1,2,3,4,5}</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+TEST $GFS --volfile-id=$V0 --volfile-server=$H0 $M0;</div><div class='add'>+</div><div class='add'>+TEST mkdir $B0/brick{0,1,2,3}/{0..9}</div><div class='add'>+sleep 2 #to prevent is_fresh_file code path</div><div class='add'>+TEST stat $M0/{0..9}</div><div class='add'>+EXPECT 6 get_gfid_count 0</div><div class='add'>+EXPECT 6 get_gfid_count 1</div><div class='add'>+EXPECT 6 get_gfid_count 2</div><div class='add'>+EXPECT 6 get_gfid_count 3</div><div class='add'>+EXPECT 6 get_gfid_count 4</div><div class='add'>+EXPECT 6 get_gfid_count 5</div><div class='add'>+EXPECT 6 get_gfid_count 6</div><div class='add'>+EXPECT 6 get_gfid_count 7</div><div class='add'>+EXPECT 6 get_gfid_count 8</div><div class='add'>+EXPECT 6 get_gfid_count 9</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/basic/afr/gfid-mismatch-resolution-with-cli.t b/tests/basic/afr/gfid-mismatch-resolution-with-cli.t<br/>new file mode 100644<br/>index 00000000000..b739ddc49cc<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/afr/gfid-mismatch-resolution-with-cli.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/afr/gfid-mismatch-resolution-with-cli.t</a></div><div class='hunk'>@@ -0,0 +1,168 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 replica 2 $H0:$B0/${V0}{0,1}</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+TEST $GFS --volfile-id=/$V0 --volfile-server=$H0 $M0</div><div class='add'>+TEST $CLI volume set $V0 self-heal-daemon off</div><div class='add'>+TEST $CLI volume set $V0 cluster.entry-self-heal off</div><div class='add'>+TEST $CLI volume set $V0 cluster.metadata-self-heal off</div><div class='add'>+TEST $CLI volume set $V0 cluster.data-self-heal off</div><div class='add'>+cd $M0</div><div class='add'>+</div><div class='add'>+##### Healing from latest mtime ######</div><div class='add'>+</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}0</div><div class='add'>+echo "Sink based on mtime" &gt; f1</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status $V0 $H0 $B0/${V0}0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status $V0 0</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}1</div><div class='add'>+echo "Source based on mtime" &gt; f1</div><div class='add'>+</div><div class='add'>+gfid_0=$(gf_get_gfid_xattr $B0/${V0}0/f1)</div><div class='add'>+gfid_1=$(gf_get_gfid_xattr $B0/${V0}1/f1)</div><div class='add'>+TEST [ "$gfid_0" != "$gfid_1" ]</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status $V0 $H0 $B0/${V0}1</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status $V0 1</div><div class='add'>+</div><div class='add'>+#We know that first brick has the latest mtime</div><div class='add'>+LATEST_MTIME_MD5=$(md5sum $B0/${V0}0/f1 | awk '{print $1}')</div><div class='add'>+</div><div class='add'>+TEST $CLI volume heal $V0 split-brain latest-mtime /f1</div><div class='add'>+</div><div class='add'>+#gfid split-brain should be resolved</div><div class='add'>+gfid_1=$(gf_get_gfid_xattr $B0/${V0}1/f1)</div><div class='add'>+TEST [ "$gfid_0" == "$gfid_1" ]</div><div class='add'>+</div><div class='add'>+#Heal the data and check the md5sum</div><div class='add'>+TEST $CLI volume set $V0 self-heal-daemon on</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "Y" glustershd_up_status</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 1</div><div class='add'>+TEST $CLI volume heal $V0</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "^0$" get_pending_heal_count $V0</div><div class='add'>+HEALED_MD5=$(md5sum $B0/${V0}1/f1 | awk '{print $1}')</div><div class='add'>+TEST [ "$LATEST_MTIME_MD5" == "$HEALED_MD5" ]</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+##### Healing from bigger file ######</div><div class='add'>+</div><div class='add'>+TEST mkdir test</div><div class='add'>+TEST $CLI volume set $V0 self-heal-daemon off</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}0</div><div class='add'>+echo "Bigger file" &gt; test/f2</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status $V0 $H0 $B0/${V0}0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status $V0 0</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}1</div><div class='add'>+echo "Small file" &gt; test/f2</div><div class='add'>+</div><div class='add'>+gfid_0=$(gf_get_gfid_xattr $B0/${V0}0/test/f2)</div><div class='add'>+gfid_1=$(gf_get_gfid_xattr $B0/${V0}1/test/f2)</div><div class='add'>+TEST [ "$gfid_0" != "$gfid_1" ]</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status $V0 $H0 $B0/${V0}1</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status $V0 1</div><div class='add'>+</div><div class='add'>+#We know that second brick has the bigger file</div><div class='add'>+BIGGER_FILE_MD5=$(md5sum $B0/${V0}1/test/f2 | awk '{print $1}')</div><div class='add'>+</div><div class='add'>+TEST $CLI volume heal $V0 split-brain bigger-file /test/f2</div><div class='add'>+</div><div class='add'>+#gfid split-brain should be resolved</div><div class='add'>+gfid_0=$(gf_get_gfid_xattr $B0/${V0}0/test/f2)</div><div class='add'>+TEST [ "$gfid_0" == "$gfid_1" ]</div><div class='add'>+</div><div class='add'>+#Heal the data and check the md5sum</div><div class='add'>+TEST $CLI volume set $V0 self-heal-daemon on</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "Y" glustershd_up_status</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 1</div><div class='add'>+TEST $CLI volume heal $V0</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "^0$" get_pending_heal_count $V0</div><div class='add'>+HEALED_MD5=$(md5sum $B0/${V0}0/test/f2 | awk '{print $1}')</div><div class='add'>+TEST [ "$BIGGER_FILE_MD5" == "$HEALED_MD5" ]</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+#Add one more brick, and heal.</div><div class='add'>+TEST $CLI volume add-brick $V0 replica 3 $H0:$B0/${V0}2</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "Y" glustershd_up_status</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status $V0 $H0 $B0/${V0}0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status $V0 $H0 $B0/${V0}1</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status $V0 $H0 $B0/${V0}2</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status $V0 0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status $V0 1</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status $V0 2</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 1</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 2</div><div class='add'>+</div><div class='add'>+TEST $CLI volume heal $V0</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "^0$" get_pending_heal_count $V0</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+##### Healing from source brick ######</div><div class='add'>+</div><div class='add'>+TEST $CLI volume set $V0 self-heal-daemon off</div><div class='add'>+TEST $CLI volume set $V0 cluster.quorum-type none</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}0</div><div class='add'>+echo "We will consider these as sinks" &gt; test/f3</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status $V0 $H0 $B0/${V0}0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status $V0 0</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}1</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}2</div><div class='add'>+echo "We will take this as source" &gt; test/f3</div><div class='add'>+</div><div class='add'>+gfid_0=$(gf_get_gfid_xattr $B0/${V0}0/test/f3)</div><div class='add'>+gfid_1=$(gf_get_gfid_xattr $B0/${V0}1/test/f3)</div><div class='add'>+gfid_2=$(gf_get_gfid_xattr $B0/${V0}2/test/f3)</div><div class='add'>+TEST [ "$gfid_0" != "$gfid_1" ]</div><div class='add'>+TEST [ "$gfid_1" == "$gfid_2" ]</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status $V0 $H0 $B0/${V0}1</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status $V0 $H0 $B0/${V0}2</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status $V0 1</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status $V0 2</div><div class='add'>+</div><div class='add'>+#We will try to heal the split-brain with bigger file option.</div><div class='add'>+#It should fail, since we have same file size in bricks 1 &amp; 2.</div><div class='add'>+EXPECT "No bigger file for file /test/f3" $CLI volume heal $V0 split-brain bigger-file /test/f3</div><div class='add'>+</div><div class='add'>+#Now heal from taking the brick 0 as the source</div><div class='add'>+SOURCE_MD5=$(md5sum $B0/${V0}0/test/f3 | awk '{print $1}')</div><div class='add'>+</div><div class='add'>+TEST $CLI volume heal $V0 split-brain source-brick $H0:$B0/${V0}0 /test/f3</div><div class='add'>+</div><div class='add'>+#gfid split-brain should be resolved</div><div class='add'>+gfid_1=$(gf_get_gfid_xattr $B0/${V0}1/test/f3)</div><div class='add'>+gfid_2=$(gf_get_gfid_xattr $B0/${V0}2/test/f3)</div><div class='add'>+TEST [ "$gfid_0" == "$gfid_1" ]</div><div class='add'>+TEST [ "$gfid_0" == "$gfid_2" ]</div><div class='add'>+</div><div class='add'>+#Heal the data and check the md5sum</div><div class='add'>+TEST $CLI volume set $V0 self-heal-daemon on</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "Y" glustershd_up_status</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 1</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 2</div><div class='add'>+TEST $CLI volume heal $V0</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "^0$" get_pending_heal_count $V0</div><div class='add'>+HEALED_MD5_1=$(md5sum $B0/${V0}1/test/f3 | awk '{print $1}')</div><div class='add'>+HEALED_MD5_2=$(md5sum $B0/${V0}2/test/f3 | awk '{print $1}')</div><div class='add'>+TEST [ "$SOURCE_MD5" == "$HEALED_MD5_1" ]</div><div class='add'>+TEST [ "$SOURCE_MD5" == "$HEALED_MD5_2" ]</div><div class='add'>+</div><div class='add'>+cd -</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/basic/afr/gfid-mismatch-resolution-with-fav-child-policy.t b/tests/basic/afr/gfid-mismatch-resolution-with-fav-child-policy.t<br/>new file mode 100644<br/>index 00000000000..35e295dc170<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/afr/gfid-mismatch-resolution-with-fav-child-policy.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/afr/gfid-mismatch-resolution-with-fav-child-policy.t</a></div><div class='hunk'>@@ -0,0 +1,229 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 replica 2 $H0:$B0/${V0}{0,1}</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+TEST $GFS --volfile-id=/$V0 --volfile-server=$H0 $M0</div><div class='add'>+TEST $CLI volume set $V0 cluster.heal-timeout 5</div><div class='add'>+TEST $CLI volume set $V0 self-heal-daemon off</div><div class='add'>+TEST $CLI volume set $V0 cluster.data-self-heal off</div><div class='add'>+TEST $CLI volume set $V0 cluster.metadata-self-heal off</div><div class='add'>+TEST $CLI volume set $V0 cluster.entry-self-heal off</div><div class='add'>+</div><div class='add'>+##### Healing with favorite-child-policy = mtime ######</div><div class='add'>+#####           and self-heal-daemon             ######</div><div class='add'>+</div><div class='add'>+TEST $CLI volume set $V0 favorite-child-policy mtime</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}0</div><div class='add'>+echo "Sink based on mtime" &gt; $M0/f1</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status $V0 $H0 $B0/${V0}0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status $V0 0</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}1</div><div class='add'>+echo "Source based on mtime" &gt; $M0/f1</div><div class='add'>+</div><div class='add'>+#Gfids of file f1 on bricks 0 &amp; 1 should differ</div><div class='add'>+gfid_0=$(gf_get_gfid_xattr $B0/${V0}0/f1)</div><div class='add'>+gfid_1=$(gf_get_gfid_xattr $B0/${V0}1/f1)</div><div class='add'>+TEST [ "$gfid_0" != "$gfid_1" ]</div><div class='add'>+</div><div class='add'>+TEST $CLI volume set $V0 self-heal-daemon on</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "Y" glustershd_up_status</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status $V0 $H0 $B0/${V0}1</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status $V0 1</div><div class='add'>+</div><div class='add'>+#We know that first brick has the latest mtime</div><div class='add'>+LATEST_MTIME_MD5=$(md5sum $B0/${V0}0/f1 | cut -d\  -f1)</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 1</div><div class='add'>+TEST $CLI volume heal $V0</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "^0$" get_pending_heal_count $V0</div><div class='add'>+</div><div class='add'>+#gfid split-brain should be resolved</div><div class='add'>+gfid_1=$(gf_get_gfid_xattr $B0/${V0}1/f1)</div><div class='add'>+TEST [ "$gfid_0" == "$gfid_1" ]</div><div class='add'>+</div><div class='add'>+HEALED_MD5=$(md5sum $B0/${V0}1/f1 | cut -d\  -f1)</div><div class='add'>+TEST [ "$LATEST_MTIME_MD5" == "$HEALED_MD5" ]</div><div class='add'>+</div><div class='add'>+TEST $CLI volume set $V0 self-heal-daemon off</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+##### Healing with favorite-child-policy = ctime ######</div><div class='add'>+#####            and self-heal-daemon            ######</div><div class='add'>+</div><div class='add'>+#gfid split-brain resolution should work even when the granular-enrty-heal is</div><div class='add'>+#enabled</div><div class='add'>+TEST $CLI volume heal $V0 granular-entry-heal enable</div><div class='add'>+</div><div class='add'>+TEST $CLI volume set $V0 favorite-child-policy ctime</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}1</div><div class='add'>+echo "Sink based on ctime" &gt; $M0/f2</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status $V0 $H0 $B0/${V0}1</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status $V0 1</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}0</div><div class='add'>+echo "Source based on ctime" &gt; $M0/f2</div><div class='add'>+</div><div class='add'>+#Gfids of file f2 on bricks 0 &amp; 1 should differ</div><div class='add'>+gfid_0=$(gf_get_gfid_xattr $B0/${V0}0/f2)</div><div class='add'>+gfid_1=$(gf_get_gfid_xattr $B0/${V0}1/f2)</div><div class='add'>+TEST [ "$gfid_0" != "$gfid_1" ]</div><div class='add'>+</div><div class='add'>+TEST $CLI volume set $V0 self-heal-daemon on</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "Y" glustershd_up_status</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status $V0 $H0 $B0/${V0}0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status $V0 0</div><div class='add'>+</div><div class='add'>+#We know that second brick has the latest ctime</div><div class='add'>+LATEST_CTIME_MD5=$(md5sum $B0/${V0}1/f2 | cut -d\  -f1)</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 1</div><div class='add'>+TEST $CLI volume heal $V0</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "^0$" get_pending_heal_count $V0</div><div class='add'>+</div><div class='add'>+#gfid split-brain should be resolved</div><div class='add'>+gfid_0=$(gf_get_gfid_xattr $B0/${V0}0/f2)</div><div class='add'>+TEST [ "$gfid_0" == "$gfid_1" ]</div><div class='add'>+</div><div class='add'>+HEALED_MD5=$(md5sum $B0/${V0}0/f2 | cut -d\  -f1)</div><div class='add'>+TEST [ "$LATEST_CTIME_MD5" == "$HEALED_MD5" ]</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+#Add one more brick, and heal.</div><div class='add'>+TEST $CLI volume add-brick $V0 replica 3 $H0:$B0/${V0}2</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "Y" glustershd_up_status</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status $V0 $H0 $B0/${V0}0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status $V0 $H0 $B0/${V0}1</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status $V0 $H0 $B0/${V0}2</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status $V0 0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status $V0 1</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status $V0 2</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 1</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 2</div><div class='add'>+</div><div class='add'>+TEST $CLI volume heal $V0</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "^0$" get_pending_heal_count $V0</div><div class='add'>+</div><div class='add'>+TEST $CLI volume set $V0 self-heal-daemon off</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+##### Healing using favorite-child-policy = size #####</div><div class='add'>+#####             and client side heal           #####</div><div class='add'>+</div><div class='add'>+TEST $CLI volume set $V0 cluster.data-self-heal on</div><div class='add'>+TEST $CLI volume set $V0 cluster.metadata-self-heal on</div><div class='add'>+TEST $CLI volume set $V0 cluster.entry-self-heal on</div><div class='add'>+</div><div class='add'>+#Set the quorum-type to none, and create a gfid split brain</div><div class='add'>+TEST $CLI volume set $V0 cluster.quorum-type none</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}0</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}1</div><div class='add'>+echo "Smallest file" &gt; $M0/f3</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status $V0 $H0 $B0/${V0}0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status $V0 0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status $V0 $H0 $B0/${V0}1</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status $V0 1</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}1</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}2</div><div class='add'>+echo "Second smallest file" &gt; $M0/f3</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status $V0 $H0 $B0/${V0}1</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status $V0 1</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status $V0 $H0 $B0/${V0}2</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status $V0 2</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}0</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}2</div><div class='add'>+echo "Biggest among the three files" &gt; $M0/f3</div><div class='add'>+</div><div class='add'>+#Bring back the down bricks.</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status $V0 $H0 $B0/${V0}0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status $V0 0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status $V0 $H0 $B0/${V0}2</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status $V0 2</div><div class='add'>+</div><div class='add'>+#Gfids of file f3 on all the bricks should differ</div><div class='add'>+gfid_0=$(gf_get_gfid_xattr $B0/${V0}0/f3)</div><div class='add'>+gfid_1=$(gf_get_gfid_xattr $B0/${V0}1/f3)</div><div class='add'>+gfid_2=$(gf_get_gfid_xattr $B0/${V0}2/f3)</div><div class='add'>+TEST [ "$gfid_0" != "$gfid_1" ]</div><div class='add'>+TEST [ "$gfid_0" != "$gfid_2" ]</div><div class='add'>+TEST [ "$gfid_1" != "$gfid_2" ]</div><div class='add'>+</div><div class='add'>+#We know that second brick has the bigger size file</div><div class='add'>+BIGGER_FILE_MD5=$(md5sum $B0/${V0}1/f3 | cut -d\  -f1)</div><div class='add'>+</div><div class='add'>+TEST ls $M0 #Trigger entry heal via readdir inode refresh</div><div class='add'>+TEST cat $M0/f3 #Trigger data heal via readv inode refresh</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "^0$" get_pending_heal_count $V0</div><div class='add'>+</div><div class='add'>+#gfid split-brain should be resolved</div><div class='add'>+gfid_0=$(gf_get_gfid_xattr $B0/${V0}0/f3)</div><div class='add'>+gfid_2=$(gf_get_gfid_xattr $B0/${V0}2/f3)</div><div class='add'>+TEST [ "$gfid_0" == "$gfid_1" ]</div><div class='add'>+TEST [ "$gfid_2" == "$gfid_1" ]</div><div class='add'>+</div><div class='add'>+HEALED_MD5_1=$(md5sum $B0/${V0}0/f3 | cut -d\  -f1)</div><div class='add'>+HEALED_MD5_2=$(md5sum $B0/${V0}2/f3 | cut -d\  -f1)</div><div class='add'>+TEST [ "$BIGGER_FILE_MD5" == "$HEALED_MD5_1" ]</div><div class='add'>+TEST [ "$BIGGER_FILE_MD5" == "$HEALED_MD5_2" ]</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+##### Healing using favorite-child-policy = majority #####</div><div class='add'>+#####             and client side heal               #####</div><div class='add'>+</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}0</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}1</div><div class='add'>+echo "Does not agree with bricks 0 &amp; 1" &gt; $M0/f4</div><div class='add'>+</div><div class='add'>+TEST $CLI v start $V0 force</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status $V0 $H0 $B0/${V0}0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status $V0 0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status $V0 $H0 $B0/${V0}1</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status $V0 1</div><div class='add'>+TEST kill_brick  $V0 $H0 $B0/${V0}2</div><div class='add'>+echo "Agree on bricks 0 &amp; 1" &gt; $M0/f4</div><div class='add'>+</div><div class='add'>+#Gfids of file f4 on bricks 0 &amp; 1 should be same and bricks 0 &amp; 2 should differ</div><div class='add'>+gfid_0=$(gf_get_gfid_xattr $B0/${V0}0/f4)</div><div class='add'>+gfid_1=$(gf_get_gfid_xattr $B0/${V0}1/f4)</div><div class='add'>+gfid_2=$(gf_get_gfid_xattr $B0/${V0}2/f4)</div><div class='add'>+TEST [ "$gfid_0" == "$gfid_1" ]</div><div class='add'>+TEST [ "$gfid_0" != "$gfid_2" ]</div><div class='add'>+</div><div class='add'>+#We know that first and second bricks agree with each other. Pick any one of</div><div class='add'>+#them as source</div><div class='add'>+MAJORITY_MD5=$(md5sum $B0/${V0}0/f4 | cut -d\  -f1)</div><div class='add'>+</div><div class='add'>+#Bring back the down brick and heal.</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status $V0 $H0 $B0/${V0}2</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status $V0 2</div><div class='add'>+</div><div class='add'>+TEST ls $M0 #Trigger entry heal via readdir inode refresh</div><div class='add'>+TEST cat $M0/f4  #Trigger data heal via readv inode refresh</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "^0$" get_pending_heal_count $V0</div><div class='add'>+</div><div class='add'>+#gfid split-brain should be resolved</div><div class='add'>+gfid_2=$(gf_get_gfid_xattr $B0/${V0}2/f4)</div><div class='add'>+TEST [ "$gfid_0" == "$gfid_2" ]</div><div class='add'>+</div><div class='add'>+HEALED_MD5=$(md5sum $B0/${V0}2/f4 | cut -d\  -f1)</div><div class='add'>+TEST [ "$MAJORITY_MD5" == "$HEALED_MD5" ]</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/basic/afr/gfid-mismatch.t b/tests/basic/afr/gfid-mismatch.t<br/>new file mode 100644<br/>index 00000000000..fc15793cf5a<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/afr/gfid-mismatch.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/afr/gfid-mismatch.t</a></div><div class='hunk'>@@ -0,0 +1,32 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+#Test that GFID mismatches result in EIO</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+#Init</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 replica 2 $H0:$B0/brick{0,1}</div><div class='add'>+TEST $CLI volume set $V0 self-heal-daemon off</div><div class='add'>+TEST $CLI volume set $V0 stat-prefetch off</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+TEST $CLI volume set $V0 cluster.background-self-heal-count 0</div><div class='add'>+# We can't count on brick0 getting a copy of the file immediately without this,</div><div class='add'>+# because (especially with multiplexing) it might not have *come up*</div><div class='add'>+# immediately.</div><div class='add'>+TEST $CLI volume set $V0 cluster.quorum-type auto</div><div class='add'>+TEST $GFS --volfile-id=$V0 -s $H0 $M0;</div><div class='add'>+</div><div class='add'>+#Test</div><div class='add'>+TEST touch $M0/file</div><div class='add'>+TEST setfattr -n trusted.gfid -v 0sBfz5vAdHTEK1GZ99qjqTIg== $B0/brick0/file</div><div class='add'>+TEST ! "find $M0/file"</div><div class='add'>+TEST ! "stat $M0/file"</div><div class='add'>+</div><div class='add'>+#Cleanup</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+TEST $CLI volume stop $V0</div><div class='add'>+TEST $CLI volume delete $V0</div><div class='add'>+TEST rm -rf $B0/*</div><div class='head'>diff --git a/tests/basic/afr/gfid-self-heal.t b/tests/basic/afr/gfid-self-heal.t<br/>new file mode 100644<br/>index 00000000000..5a530681186<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/afr/gfid-self-heal.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/afr/gfid-self-heal.t</a></div><div class='hunk'>@@ -0,0 +1,145 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+#Tests for files without gfids</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 replica 2 $H0:$B0/${V0}{0,1}</div><div class='add'>+TEST $CLI volume set $V0 self-heal-daemon off</div><div class='add'>+TEST $CLI volume set $V0 nfs.disable on</div><div class='add'>+TEST touch $B0/${V0}{0,1}/{1,2,3,4}</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+TEST $GFS --volfile-id=/$V0 --volfile-server=$H0 $M0</div><div class='add'>+#Test that readdir returns entries even when no gfids are present</div><div class='add'>+EXPECT 4 echo $(ls $M0 | grep -v '^\.' | wc -l)</div><div class='add'>+sleep 2;</div><div class='add'>+#stat the files and check that the files have same gfids on the bricks now</div><div class='add'>+TEST stat $M0/1</div><div class='add'>+gfid_0=$(gf_get_gfid_xattr $B0/${V0}0/1)</div><div class='add'>+gfid_1=$(gf_get_gfid_xattr $B0/${V0}1/1)</div><div class='add'>+TEST "[[ ! -z $gfid_0 ]]"</div><div class='add'>+EXPECT $gfid_0 echo $gfid_1</div><div class='add'>+</div><div class='add'>+TEST stat $M0/2</div><div class='add'>+gfid_0=$(gf_get_gfid_xattr $B0/${V0}0/2)</div><div class='add'>+gfid_1=$(gf_get_gfid_xattr $B0/${V0}1/2)</div><div class='add'>+TEST "[[ ! -z $gfid_0 ]]"</div><div class='add'>+EXPECT $gfid_0 echo $gfid_1</div><div class='add'>+</div><div class='add'>+TEST stat $M0/3</div><div class='add'>+gfid_0=$(gf_get_gfid_xattr $B0/${V0}0/3)</div><div class='add'>+gfid_1=$(gf_get_gfid_xattr $B0/${V0}1/3)</div><div class='add'>+TEST "[[ ! -z $gfid_0 ]]"</div><div class='add'>+EXPECT $gfid_0 echo $gfid_1</div><div class='add'>+</div><div class='add'>+TEST stat $M0/4</div><div class='add'>+gfid_0=$(gf_get_gfid_xattr $B0/${V0}0/4)</div><div class='add'>+gfid_1=$(gf_get_gfid_xattr $B0/${V0}1/4)</div><div class='add'>+TEST "[[ ! -z $gfid_0 ]]"</div><div class='add'>+EXPECT $gfid_0 echo $gfid_1</div><div class='add'>+</div><div class='add'>+#Check gfid self-heal happens from one brick to other when a file has missing</div><div class='add'>+#gfid</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}0</div><div class='add'>+TEST touch $M0/a</div><div class='add'>+gfid_1=$(gf_get_gfid_xattr $B0/${V0}1/a)</div><div class='add'>+TEST touch $B0/${V0}0/a</div><div class='add'>+# storage/posix considers that a file without gfid changed less than a second</div><div class='add'>+# before doesn't exist, so we need to wait for a second to force posix to</div><div class='add'>+# consider that this is a valid file but without gfid.</div><div class='add'>+sleep 1</div><div class='add'>+$CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 0</div><div class='add'>+TEST stat $M0/a</div><div class='add'>+gfid_0=$(gf_get_gfid_xattr $B0/${V0}0/a)</div><div class='add'>+EXPECT $gfid_1 echo $gfid_0</div><div class='add'>+</div><div class='add'>+#Check gfid self-heal doesn't happen from one brick to other when type mismatch</div><div class='add'>+#is present for a name, without any xattrs</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}0</div><div class='add'>+TEST touch $M0/b</div><div class='add'>+TEST mkdir $B0/${V0}0/b</div><div class='add'>+TEST setfattr -x trusted.afr.$V0-client-0 $B0/${V0}1</div><div class='add'>+# storage/posix considers that a file without gfid changed less than a second</div><div class='add'>+# before doesn't exist, so we need to wait for a second to force posix to</div><div class='add'>+# consider that this is a valid file but without gfid.</div><div class='add'>+sleep 1</div><div class='add'>+$CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 0</div><div class='add'>+TEST ! stat $M0/b</div><div class='add'>+gfid_0=$(gf_get_gfid_xattr $B0/${V0}0/b)</div><div class='add'>+TEST "[[ -z \"$gfid_0\" ]]"</div><div class='add'>+</div><div class='add'>+#Check gfid assigning doesn't happen when there is type mismatch</div><div class='add'>+TEST touch $B0/${V0}1/c</div><div class='add'>+TEST mkdir $B0/${V0}0/c</div><div class='add'>+# storage/posix considers that a file without gfid changed less than a second</div><div class='add'>+# before doesn't exist, so we need to wait for a second to force posix to</div><div class='add'>+# consider that this is a valid file but without gfid.</div><div class='add'>+sleep 1</div><div class='add'>+TEST ! stat $M0/c</div><div class='add'>+gfid_1=$(gf_get_gfid_xattr $B0/${V0}1/c)</div><div class='add'>+gfid_0=$(gf_get_gfid_xattr $B0/${V0}0/c)</div><div class='add'>+TEST "[[ -z \"$gfid_1\" ]]"</div><div class='add'>+TEST "[[ -z \"$gfid_0\" ]]"</div><div class='add'>+</div><div class='add'>+#Check gfid assigning doesn't happen only when even one brick is down to prevent</div><div class='add'>+# gfid split-brain</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}0</div><div class='add'>+TEST touch $B0/${V0}1/d</div><div class='add'>+# storage/posix considers that a file without gfid changed less than a second</div><div class='add'>+# before doesn't exist, so we need to wait for a second to force posix to</div><div class='add'>+# consider that this is a valid file but without gfid.</div><div class='add'>+sleep 1</div><div class='add'>+TEST ! stat $M0/d</div><div class='add'>+gfid_1=$(gf_get_gfid_xattr $B0/${V0}1/d)</div><div class='add'>+TEST "[[ -z \"$gfid_1\" ]]"</div><div class='add'>+TEST $CLI volume start $V0 force;</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 1</div><div class='add'>+</div><div class='add'>+#Check gfid self-heal doesn't happen from one brick to other when type mismatch</div><div class='add'>+#is present for a name without any pending xattrs</div><div class='add'>+#TEST kill_brick $V0 $H0 $B0/${V0}0</div><div class='add'>+#TEST touch $M0/e</div><div class='add'>+#TEST $CLI volume start $V0 force;</div><div class='add'>+#EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 0</div><div class='add'>+#TEST kill_brick $V0 $H0 $B0/${V0}1</div><div class='add'>+#TEST mkdir $M0/e</div><div class='add'>+#TEST $CLI volume stop $V0 force;</div><div class='add'>+#TEST setfattr -x trusted.gfid $B0/${V0}1/e</div><div class='add'>+#TEST setfattr -x trusted.gfid $B0/${V0}0/e</div><div class='add'>+#TEST $CLI volume set $V0 cluster.entry-self-heal off</div><div class='add'>+#$CLI volume start $V0 force</div><div class='add'>+#EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 0</div><div class='add'>+#EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 1</div><div class='add'>+#TEST ! stat $M0/e</div><div class='add'>+#gfid_1=$(gf_get_gfid_xattr $B0/${V0}1/e)</div><div class='add'>+#gfid_0=$(gf_get_gfid_xattr $B0/${V0}0/e)</div><div class='add'>+#TEST "[[ -z \"$gfid_1\" ]]"</div><div class='add'>+#TEST "[[ -z \"$gfid_0\" ]]"</div><div class='add'>+</div><div class='add'>+#Check if lookup fails with gfid-mismatch of a file</div><div class='add'>+#is present for a name without any pending xattrs</div><div class='add'>+#TEST kill_brick $V0 $H0 $B0/${V0}0</div><div class='add'>+#TEST touch $M0/f</div><div class='add'>+#$CLI volume start $V0 force</div><div class='add'>+#EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 0</div><div class='add'>+#TEST kill_brick $V0 $H0 $B0/${V0}1</div><div class='add'>+#TEST touch $M0/f</div><div class='add'>+#simulate no pending changelog</div><div class='add'>+#$CLI volume stop $V0 force</div><div class='add'>+#TEST setfattr -x trusted.afr.$V0-client-0 $B0/${V0}1</div><div class='add'>+#TEST setfattr -x trusted.afr.$V0-client-1 $B0/${V0}0</div><div class='add'>+#$CLI volume start $V0 force</div><div class='add'>+#EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 0</div><div class='add'>+#EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 1</div><div class='add'>+#TEST ! stat $M0/f</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/basic/afr/granular-esh/add-brick.t b/tests/basic/afr/granular-esh/add-brick.t<br/>new file mode 100644<br/>index 00000000000..270cf1d32a6<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/afr/granular-esh/add-brick.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/afr/granular-esh/add-brick.t</a></div><div class='hunk'>@@ -0,0 +1,80 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../../include.rc</div><div class='add'>+. $(dirname $0)/../../../volume.rc</div><div class='add'>+. $(dirname $0)/../../../afr.rc</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 replica 2 $H0:$B0/${V0}{0,1}</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+TEST $CLI volume set $V0 cluster.data-self-heal off</div><div class='add'>+TEST $CLI volume set $V0 cluster.metadata-self-heal off</div><div class='add'>+TEST $CLI volume set $V0 cluster.entry-self-heal off</div><div class='add'>+TEST $CLI volume set $V0 self-heal-daemon off</div><div class='add'>+TEST $CLI volume heal $V0 granular-entry-heal enable</div><div class='add'>+</div><div class='add'>+TEST glusterfs --volfile-id=$V0 --volfile-server=$H0 $M0</div><div class='add'>+</div><div class='add'>+# Create files</div><div class='add'>+for i in {1..5}</div><div class='add'>+do</div><div class='add'>+        echo $i &gt; $M0/file$i.txt</div><div class='add'>+done</div><div class='add'>+</div><div class='add'>+# Metadata changes</div><div class='add'>+TEST setfattr -n user.test -v qwerty $M0/file5.txt</div><div class='add'>+</div><div class='add'>+# Add brick1</div><div class='add'>+TEST $CLI volume add-brick $V0 replica 3 $H0:$B0/${V0}2</div><div class='add'>+</div><div class='add'>+# New-brick should accuse the old-bricks (Simulating case for data-loss)</div><div class='add'>+TEST setfattr -n trusted.afr.$V0-client-0 -v 0x000000000000000000000001 $B0/${V0}2/</div><div class='add'>+TEST setfattr -n trusted.afr.$V0-client-1 -v 0x000000000000000000000001 $B0/${V0}2/</div><div class='add'>+</div><div class='add'>+# Check if pending data, metadata and entry xattrs are set for newly-added-brick</div><div class='add'>+EXPECT "000000010000000100000001" get_hex_xattr trusted.afr.$V0-client-2 $B0/${V0}0</div><div class='add'>+EXPECT "000000010000000100000001" get_hex_xattr trusted.afr.$V0-client-2 $B0/${V0}1</div><div class='add'>+</div><div class='add'>+# Also ensure we are not mistakenly tampering with the new-brick's changelog xattrs</div><div class='add'>+EXPECT "000000000000000000000001" get_hex_xattr trusted.afr.$V0-client-0 $B0/${V0}2</div><div class='add'>+EXPECT "000000000000000000000001" get_hex_xattr trusted.afr.$V0-client-1 $B0/${V0}2</div><div class='add'>+</div><div class='add'>+# Check if dirty xattr is set for newly-added-brick</div><div class='add'>+EXPECT "000000000000000000000001" get_hex_xattr trusted.afr.dirty $B0/${V0}2</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 1</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 2</div><div class='add'>+</div><div class='add'>+TEST $CLI volume set $V0 self-heal-daemon on</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "Y" glustershd_up_status</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 1</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 2</div><div class='add'>+TEST $CLI volume heal $V0</div><div class='add'>+</div><div class='add'>+# Wait for heal to complete</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "^0$" get_pending_heal_count $V0</div><div class='add'>+</div><div class='add'>+# Check if entry-heal has happened</div><div class='add'>+TEST diff &lt;(ls $B0/${V0}0 | sort) &lt;(ls $B0/${V0}2 | sort)</div><div class='add'>+TEST diff &lt;(ls $B0/${V0}1 | sort) &lt;(ls $B0/${V0}2 | sort)</div><div class='add'>+</div><div class='add'>+# Test if data was healed</div><div class='add'>+TEST diff $B0/${V0}0/file1.txt $B0/${V0}2/file1.txt</div><div class='add'>+</div><div class='add'>+# Test if metadata was healed and exists on both the bricks</div><div class='add'>+EXPECT "qwerty" get_text_xattr user.test $B0/${V0}2/file5.txt</div><div class='add'>+EXPECT "qwerty" get_text_xattr user.test $B0/${V0}0/file5.txt</div><div class='add'>+</div><div class='add'>+# Ensure all changelog xattrs are now back to zero.</div><div class='add'>+EXPECT "000000000000000000000000" get_hex_xattr trusted.afr.$V0-client-2 $B0/${V0}0</div><div class='add'>+EXPECT "000000000000000000000000" get_hex_xattr trusted.afr.$V0-client-2 $B0/${V0}1</div><div class='add'>+EXPECT "000000000000000000000000" get_hex_xattr trusted.afr.dirty $B0/${V0}2</div><div class='add'>+EXPECT "000000000000000000000000" get_hex_xattr trusted.afr.$V0-client-0 $B0/${V0}2</div><div class='add'>+EXPECT "000000000000000000000000" get_hex_xattr trusted.afr.$V0-client-1 $B0/${V0}2</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/basic/afr/granular-esh/cli.t b/tests/basic/afr/granular-esh/cli.t<br/>new file mode 100644<br/>index 00000000000..10b6c6398da<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/afr/granular-esh/cli.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/afr/granular-esh/cli.t</a></div><div class='hunk'>@@ -0,0 +1,114 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../../include.rc</div><div class='add'>+. $(dirname $0)/../../../volume.rc</div><div class='add'>+. $(dirname $0)/../../../afr.rc</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='add'>+</div><div class='add'>+TESTS_EXPECTED_IN_LOOP=4</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+</div><div class='add'>+TEST   $CLI volume create $V0 replica 3 $H0:$B0/${V0}{0,1,2}</div><div class='add'>+# Test that enabling the option should work on a newly created volume</div><div class='add'>+TEST   $CLI volume set $V0 cluster.granular-entry-heal on</div><div class='add'>+TEST   $CLI volume set $V0 cluster.granular-entry-heal off</div><div class='add'>+</div><div class='add'>+#########################</div><div class='add'>+##### DISPERSE TEST #####</div><div class='add'>+#########################</div><div class='add'>+# Execute the same command on a disperse volume and make sure it fails.</div><div class='add'>+TEST $CLI volume create $V1 disperse 3 redundancy 1 $H0:$B0/${V1}{0,1,2}</div><div class='add'>+TEST $CLI volume start $V1</div><div class='add'>+TEST ! $CLI volume heal $V1 granular-entry-heal enable</div><div class='add'>+TEST ! $CLI volume heal $V1 granular-entry-heal disable</div><div class='add'>+</div><div class='add'>+######################</div><div class='add'>+### REPLICATE TEST ###</div><div class='add'>+######################</div><div class='add'>+TEST   $CLI volume start $V0</div><div class='add'>+TEST   $CLI volume set $V0 cluster.data-self-heal off</div><div class='add'>+TEST   $CLI volume set $V0 cluster.metadata-self-heal off</div><div class='add'>+TEST   $CLI volume set $V0 cluster.entry-self-heal off</div><div class='add'>+TEST   $CLI volume set $V0 self-heal-daemon off</div><div class='add'>+# Test that the volume-set way of enabling the option is disallowed</div><div class='add'>+TEST ! $CLI volume set $V0 granular-entry-heal on</div><div class='add'>+# Test that the volume-heal way of enabling the option is allowed</div><div class='add'>+TEST   $CLI volume heal $V0 granular-entry-heal enable</div><div class='add'>+# Volume-reset of the option should be allowed</div><div class='add'>+TEST   $CLI volume reset $V0 granular-entry-heal</div><div class='add'>+TEST   $CLI volume heal $V0 granular-entry-heal enable</div><div class='add'>+</div><div class='add'>+EXPECT "enable" volume_option $V0 cluster.granular-entry-heal</div><div class='add'>+</div><div class='add'>+TEST glusterfs --volfile-id=$V0 --volfile-server=$H0 $M0</div><div class='add'>+</div><div class='add'>+# Kill brick-0.</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}0</div><div class='add'>+</div><div class='add'>+# Disabling the option should work even when one or more bricks are down</div><div class='add'>+TEST $CLI volume heal $V0 granular-entry-heal disable</div><div class='add'>+# When a brick is down, 'enable' attempt should be failed</div><div class='add'>+TEST ! $CLI volume heal $V0 granular-entry-heal enable</div><div class='add'>+</div><div class='add'>+# Restart the killed brick</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 1</div><div class='add'>+</div><div class='add'>+# When all bricks are up, it should be possible to enable the option</div><div class='add'>+TEST $CLI volume heal $V0 granular-entry-heal enable</div><div class='add'>+</div><div class='add'>+# Kill brick-0 again</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}0</div><div class='add'>+</div><div class='add'>+# Create files under root</div><div class='add'>+for i in {1..2}</div><div class='add'>+do</div><div class='add'>+        echo $i &gt; $M0/f$i</div><div class='add'>+done</div><div class='add'>+</div><div class='add'>+# Test that the index associated with '/' is created on B1.</div><div class='add'>+TEST stat $B0/${V0}1/.glusterfs/indices/entry-changes/$ROOT_GFID</div><div class='add'>+</div><div class='add'>+# Check for successful creation of granular entry indices</div><div class='add'>+for i in {1..2}</div><div class='add'>+do</div><div class='add'>+        TEST_IN_LOOP stat $B0/${V0}1/.glusterfs/indices/entry-changes/$ROOT_GFID/f$i</div><div class='add'>+done</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 1</div><div class='add'>+</div><div class='add'>+TEST gluster volume set $V0 cluster.self-heal-daemon on</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "Y" glustershd_up_status</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 1</div><div class='add'>+</div><div class='add'>+TEST $CLI volume heal $V0</div><div class='add'>+</div><div class='add'>+# Wait for heal to complete</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "^0$" get_pending_heal_count $V0</div><div class='add'>+</div><div class='add'>+# Test if data was healed</div><div class='add'>+for i in {1..2}</div><div class='add'>+do</div><div class='add'>+        TEST_IN_LOOP diff $B0/${V0}0/f$i $B0/${V0}1/f$i</div><div class='add'>+done</div><div class='add'>+</div><div class='add'>+# Now verify that there are no name indices left after self-heal</div><div class='add'>+TEST ! stat $B0/${V0}1/.glusterfs/indices/entry-changes/$ROOT_GFID/f1</div><div class='add'>+TEST ! stat $B0/${V0}1/.glusterfs/indices/entry-changes/$ROOT_GFID/f2</div><div class='add'>+TEST ! stat $B0/${V0}1/.glusterfs/indices/entry-changes/$ROOT_GFID</div><div class='add'>+</div><div class='add'>+# Perform a volume-reset-all-options operation</div><div class='add'>+TEST $CLI volume reset $V0</div><div class='add'>+# Ensure that granular entry heal is also disabled</div><div class='add'>+EXPECT "no" volume_get_field $V0 cluster.granular-entry-heal</div><div class='add'>+EXPECT "off" volume_get_field $V0 cluster.entry-self-heal</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='add'>+#G_TESTDEF_TEST_STATUS_NETBSD7=BAD_TEST,BUG=1399038</div><div class='head'>diff --git a/tests/basic/afr/granular-esh/conservative-merge.t b/tests/basic/afr/granular-esh/conservative-merge.t<br/>new file mode 100644<br/>index 00000000000..b170e47e0cb<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/afr/granular-esh/conservative-merge.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/afr/granular-esh/conservative-merge.t</a></div><div class='hunk'>@@ -0,0 +1,138 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../../include.rc</div><div class='add'>+. $(dirname $0)/../../../volume.rc</div><div class='add'>+. $(dirname $0)/../../../afr.rc</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='add'>+</div><div class='add'>+TESTS_EXPECTED_IN_LOOP=4</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 replica 2 $H0:$B0/${V0}{0,1}</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+TEST $CLI volume set $V0 self-heal-daemon off</div><div class='add'>+TEST $CLI volume set $V0 data-self-heal off</div><div class='add'>+TEST $CLI volume set $V0 metadata-self-heal off</div><div class='add'>+TEST $CLI volume set $V0 entry-self-heal off</div><div class='add'>+TEST $CLI volume heal $V0 granular-entry-heal enable</div><div class='add'>+</div><div class='add'>+TEST $GFS --volfile-id=$V0 -s $H0 $M0</div><div class='add'>+</div><div class='add'>+TEST mkdir $M0/dir</div><div class='add'>+gfid_dir=$(get_gfid_string $M0/dir)</div><div class='add'>+</div><div class='add'>+echo "1" &gt; $M0/f1</div><div class='add'>+echo "2" &gt; $M0/f2</div><div class='add'>+</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}0</div><div class='add'>+</div><div class='add'>+TEST mkdir $M0/dir2</div><div class='add'>+gfid_dir2=$(get_gfid_string $M0/dir2)</div><div class='add'>+TEST unlink $M0/f1</div><div class='add'>+echo "3" &gt; $M0/f3</div><div class='add'>+TEST mkdir $M0/dir/subdir</div><div class='add'>+gfid_subdir=$(get_gfid_string $M0/dir/subdir)</div><div class='add'>+echo "dir2-1" &gt; $M0/dir2/f1</div><div class='add'>+echo "subdir-1" &gt; $M0/dir/subdir/f1</div><div class='add'>+</div><div class='add'>+TEST stat $B0/${V0}1/.glusterfs/indices/entry-changes/$ROOT_GFID</div><div class='add'>+TEST stat $B0/${V0}1/.glusterfs/indices/entry-changes/$ROOT_GFID/dir2</div><div class='add'>+TEST stat $B0/${V0}1/.glusterfs/indices/entry-changes/$ROOT_GFID/f1</div><div class='add'>+TEST stat $B0/${V0}1/.glusterfs/indices/entry-changes/$ROOT_GFID/f3</div><div class='add'>+TEST stat $B0/${V0}1/.glusterfs/indices/entry-changes/$gfid_dir2</div><div class='add'>+TEST stat $B0/${V0}1/.glusterfs/indices/entry-changes/$gfid_dir2/f1</div><div class='add'>+TEST stat $B0/${V0}1/.glusterfs/indices/entry-changes/$gfid_dir</div><div class='add'>+TEST stat $B0/${V0}1/.glusterfs/indices/entry-changes/$gfid_dir/subdir</div><div class='add'>+TEST stat $B0/${V0}1/.glusterfs/indices/entry-changes/$gfid_subdir</div><div class='add'>+TEST stat $B0/${V0}1/.glusterfs/indices/entry-changes/$gfid_subdir/f1</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 1</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}1</div><div class='add'>+</div><div class='add'>+TEST mkdir $M0/dir3</div><div class='add'>+gfid_dir3=$(get_gfid_string $M0/dir3)</div><div class='add'>+# Root is now in split-brain.</div><div class='add'>+TEST mkdir $M0/dir/subdir2</div><div class='add'>+gfid_subdir2=$(get_gfid_string $M0/dir/subdir2)</div><div class='add'>+# /dir is now in split-brain.</div><div class='add'>+echo "4" &gt; $M0/f4</div><div class='add'>+TEST unlink $M0/f2</div><div class='add'>+echo "dir3-1" &gt; $M0/dir3/f1</div><div class='add'>+echo "subdir2-1" &gt; $M0/dir/subdir2/f1</div><div class='add'>+</div><div class='add'>+TEST stat $B0/${V0}0/.glusterfs/indices/entry-changes/$ROOT_GFID</div><div class='add'>+TEST stat $B0/${V0}0/.glusterfs/indices/entry-changes/$ROOT_GFID/dir3</div><div class='add'>+TEST stat $B0/${V0}0/.glusterfs/indices/entry-changes/$ROOT_GFID/f2</div><div class='add'>+TEST stat $B0/${V0}0/.glusterfs/indices/entry-changes/$ROOT_GFID/f4</div><div class='add'>+TEST stat $B0/${V0}0/.glusterfs/indices/entry-changes/$gfid_dir</div><div class='add'>+TEST stat $B0/${V0}0/.glusterfs/indices/entry-changes/$gfid_dir/subdir2</div><div class='add'>+TEST stat $B0/${V0}0/.glusterfs/indices/entry-changes/$gfid_dir3</div><div class='add'>+TEST stat $B0/${V0}0/.glusterfs/indices/entry-changes/$gfid_dir3/f1</div><div class='add'>+TEST stat $B0/${V0}0/.glusterfs/indices/entry-changes/$gfid_subdir2</div><div class='add'>+TEST stat $B0/${V0}0/.glusterfs/indices/entry-changes/$gfid_subdir2/f1</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 1</div><div class='add'>+</div><div class='add'>+TEST $CLI volume set $V0 self-heal-daemon on</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "Y" glustershd_up_status</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 1</div><div class='add'>+</div><div class='add'>+TEST $CLI volume heal $V0</div><div class='add'>+</div><div class='add'>+# Wait for heal to complete</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "^0$" get_pending_heal_count $V0</div><div class='add'>+</div><div class='add'>+# Make sure entry self-heal did the right thing in terms of impunging deleted</div><div class='add'>+# files in the event of a split-brain.</div><div class='add'>+TEST stat $M0/f1</div><div class='add'>+TEST stat $M0/f2</div><div class='add'>+</div><div class='add'>+# Test if data was healed</div><div class='add'>+for i in {1..4}</div><div class='add'>+do</div><div class='add'>+        TEST_IN_LOOP diff $B0/${V0}0/f$i $B0/${V0}1/f$i</div><div class='add'>+done</div><div class='add'>+</div><div class='add'>+TEST diff $B0/${V0}0/dir2/f1 $B0/${V0}1/dir2/f1</div><div class='add'>+EXPECT "dir2-1" cat $M0/dir2/f1</div><div class='add'>+</div><div class='add'>+TEST diff $B0/${V0}0/dir/subdir/f1 $B0/${V0}1/dir/subdir/f1</div><div class='add'>+EXPECT "subdir-1" cat $M0/dir/subdir/f1</div><div class='add'>+</div><div class='add'>+TEST diff $B0/${V0}0/dir3/f1 $B0/${V0}1/dir3/f1</div><div class='add'>+EXPECT "dir3-1" cat $M0/dir3/f1</div><div class='add'>+</div><div class='add'>+TEST diff $B0/${V0}0/dir/subdir2/f1 $B0/${V0}1/dir/subdir2/f1</div><div class='add'>+EXPECT "subdir2-1" cat $M0/dir/subdir2/f1</div><div class='add'>+</div><div class='add'>+# Verify that all name indices have been removed after a successful heal.</div><div class='add'>+TEST ! stat $B0/${V0}1/.glusterfs/indices/entry-changes/$ROOT_GFID/dir2</div><div class='add'>+TEST ! stat $B0/${V0}0/.glusterfs/indices/entry-changes/$ROOT_GFID/dir3</div><div class='add'>+TEST ! stat $B0/${V0}1/.glusterfs/indices/entry-changes/$ROOT_GFID/f1</div><div class='add'>+TEST ! stat $B0/${V0}0/.glusterfs/indices/entry-changes/$ROOT_GFID/f2</div><div class='add'>+TEST ! stat $B0/${V0}1/.glusterfs/indices/entry-changes/$ROOT_GFID/f3</div><div class='add'>+TEST ! stat $B0/${V0}0/.glusterfs/indices/entry-changes/$ROOT_GFID/f4</div><div class='add'>+TEST ! stat $B0/${V0}1/.glusterfs/indices/entry-changes/$gfid_dir2/f1</div><div class='add'>+TEST ! stat $B0/${V0}1/.glusterfs/indices/entry-changes/$gfid_dir/subdir</div><div class='add'>+TEST ! stat $B0/${V0}0/.glusterfs/indices/entry-changes/$gfid_dir/subdir2</div><div class='add'>+TEST ! stat $B0/${V0}1/.glusterfs/indices/entry-changes/$gfid_subdir/f1</div><div class='add'>+TEST ! stat $B0/${V0}1/.glusterfs/indices/entry-changes/$gfid_dir3/f1</div><div class='add'>+TEST ! stat $B0/${V0}1/.glusterfs/indices/entry-changes/$gfid_subdir2/f1</div><div class='add'>+</div><div class='add'>+TEST ! stat $B0/${V0}1/.glusterfs/indices/entry-changes/$ROOT_GFID</div><div class='add'>+TEST ! stat $B0/${V0}0/.glusterfs/indices/entry-changes/$ROOT_GFID</div><div class='add'>+TEST ! stat $B0/${V0}1/.glusterfs/indices/entry-changes/$gfid_dir</div><div class='add'>+TEST ! stat $B0/${V0}0/.glusterfs/indices/entry-changes/$gfid_dir</div><div class='add'>+TEST ! stat $B0/${V0}1/.glusterfs/indices/entry-changes/$gfid_dir2</div><div class='add'>+TEST ! stat $B0/${V0}1/.glusterfs/indices/entry-changes/$gfid_subdir</div><div class='add'>+TEST ! stat $B0/${V0}1/.glusterfs/indices/entry-changes/$gfid_dir3</div><div class='add'>+TEST ! stat $B0/${V0}1/.glusterfs/indices/entry-changes/$gfid_subdir2</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/basic/afr/granular-esh/granular-esh.t b/tests/basic/afr/granular-esh/granular-esh.t<br/>new file mode 100644<br/>index 00000000000..de0e8f4290b<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/afr/granular-esh/granular-esh.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/afr/granular-esh/granular-esh.t</a></div><div class='hunk'>@@ -0,0 +1,168 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../../include.rc</div><div class='add'>+. $(dirname $0)/../../../volume.rc</div><div class='add'>+. $(dirname $0)/../../../afr.rc</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='add'>+</div><div class='add'>+TESTS_EXPECTED_IN_LOOP=12</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 replica 2 $H0:$B0/${V0}{0,1}</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+TEST $CLI volume set $V0 cluster.data-self-heal off</div><div class='add'>+TEST $CLI volume set $V0 cluster.metadata-self-heal off</div><div class='add'>+TEST $CLI volume set $V0 cluster.entry-self-heal off</div><div class='add'>+TEST $CLI volume set $V0 self-heal-daemon off</div><div class='add'>+TEST $CLI volume heal $V0 granular-entry-heal enable</div><div class='add'>+</div><div class='add'>+TEST glusterfs --volfile-id=$V0 --volfile-server=$H0 $M0</div><div class='add'>+</div><div class='add'>+# Create files under root</div><div class='add'>+for i in {1..4}</div><div class='add'>+do</div><div class='add'>+        echo $i &gt; $M0/f$i</div><div class='add'>+done</div><div class='add'>+</div><div class='add'>+# Create a directory and few files under it</div><div class='add'>+TEST mkdir $M0/dir</div><div class='add'>+gfid_dir=$(get_gfid_string $M0/dir)</div><div class='add'>+</div><div class='add'>+for i in {1..3}</div><div class='add'>+do</div><div class='add'>+        echo $i &gt; $M0/dir/f$i</div><div class='add'>+done</div><div class='add'>+</div><div class='add'>+# Kill brick-0.</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}0</div><div class='add'>+</div><div class='add'>+# Create more files</div><div class='add'>+for i in {5..6}</div><div class='add'>+do</div><div class='add'>+        echo $i &gt; $M0/f$i</div><div class='add'>+done</div><div class='add'>+</div><div class='add'>+# Test that the index associated with '/' is created on B1.</div><div class='add'>+TEST stat $B0/${V0}1/.glusterfs/indices/entry-changes/$ROOT_GFID</div><div class='add'>+</div><div class='add'>+# Check for successful creation of granular entry indices</div><div class='add'>+for i in {5..6}</div><div class='add'>+do</div><div class='add'>+        TEST_IN_LOOP stat $B0/${V0}1/.glusterfs/indices/entry-changes/$ROOT_GFID/f$i</div><div class='add'>+done</div><div class='add'>+</div><div class='add'>+# Delete an existing file</div><div class='add'>+TEST unlink $M0/f1</div><div class='add'>+</div><div class='add'>+# Rename an existing file</div><div class='add'>+TEST mv $M0/f2 $M0/f2_renamed</div><div class='add'>+</div><div class='add'>+# Create a hard link on f3</div><div class='add'>+TEST ln $M0/f3 $M0/link</div><div class='add'>+</div><div class='add'>+# Create a symlink on f4</div><div class='add'>+TEST ln -s $M0/f4 $M0/symlink</div><div class='add'>+</div><div class='add'>+# Check for successful creation of granular entry indices</div><div class='add'>+for i in {1..2}</div><div class='add'>+do</div><div class='add'>+        TEST_IN_LOOP stat $B0/${V0}1/.glusterfs/indices/entry-changes/$ROOT_GFID/f$i</div><div class='add'>+done</div><div class='add'>+</div><div class='add'>+TEST stat $B0/${V0}1/.glusterfs/indices/entry-changes/$ROOT_GFID/f2_renamed</div><div class='add'>+TEST stat $B0/${V0}1/.glusterfs/indices/entry-changes/$ROOT_GFID/link</div><div class='add'>+TEST stat $B0/${V0}1/.glusterfs/indices/entry-changes/$ROOT_GFID/symlink</div><div class='add'>+</div><div class='add'>+# Create a file and also delete it. This is to test deletion of stale indices during heal.</div><div class='add'>+TEST touch $M0/file_stale</div><div class='add'>+TEST unlink $M0/file_stale</div><div class='add'>+TEST stat $B0/${V0}1/.glusterfs/indices/entry-changes/$ROOT_GFID/file_stale</div><div class='add'>+</div><div class='add'>+# Create a directory and create its subdirs and files while a brick is down</div><div class='add'>+TEST mkdir -p $M0/newdir/newsubdir</div><div class='add'>+</div><div class='add'>+for i in {1..3}</div><div class='add'>+do</div><div class='add'>+        echo $i &gt; $M0/newdir/f$i</div><div class='add'>+        echo $i &gt; $M0/newdir/newsubdir/f$i</div><div class='add'>+done</div><div class='add'>+</div><div class='add'>+TEST stat $B0/${V0}1/.glusterfs/indices/entry-changes/$ROOT_GFID/newdir</div><div class='add'>+gfid_newdir=$(get_gfid_string $M0/newdir)</div><div class='add'>+gfid_newsubdir=$(get_gfid_string $M0/newdir/newsubdir)</div><div class='add'>+TEST stat $B0/${V0}1/.glusterfs/indices/entry-changes/$gfid_newdir/newsubdir</div><div class='add'>+# Check if 'data' segment of the changelog is set for the newly created directories 'newdir' and 'newsubdir'</div><div class='add'>+EXPECT "00000001" afr_get_specific_changelog_xattr $B0/${V0}1/newdir trusted.afr.$V0-client-0 data</div><div class='add'>+EXPECT "00000001" afr_get_specific_changelog_xattr $B0/${V0}1/newdir/newsubdir trusted.afr.$V0-client-0 data</div><div class='add'>+</div><div class='add'>+# Test that removal of an entire sub-tree in the hierarchy works.</div><div class='add'>+TEST rm -rf $M0/dir</div><div class='add'>+</div><div class='add'>+TEST stat $B0/${V0}1/.glusterfs/indices/entry-changes/$ROOT_GFID/dir</div><div class='add'>+TEST stat $B0/${V0}1/.glusterfs/indices/entry-changes/$gfid_dir/f1</div><div class='add'>+TEST stat $B0/${V0}1/.glusterfs/indices/entry-changes/$gfid_dir/f2</div><div class='add'>+TEST stat $B0/${V0}1/.glusterfs/indices/entry-changes/$gfid_dir/f3</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 1</div><div class='add'>+</div><div class='add'>+TEST gluster volume set $V0 cluster.self-heal-daemon on</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "Y" glustershd_up_status</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 1</div><div class='add'>+TEST $CLI volume heal $V0</div><div class='add'>+</div><div class='add'>+# Wait for heal to complete</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "^0$" get_pending_heal_count $V0</div><div class='add'>+</div><div class='add'>+# Test if data was healed</div><div class='add'>+for i in {5..6}</div><div class='add'>+do</div><div class='add'>+        TEST_IN_LOOP diff $B0/${V0}0/f$i $B0/${V0}1/f$i</div><div class='add'>+done</div><div class='add'>+</div><div class='add'>+for i in {1..3}</div><div class='add'>+do</div><div class='add'>+        TEST_IN_LOOP diff $B0/${V0}0/newdir/f$i $B0/${V0}1/newdir/f$i</div><div class='add'>+        TEST_IN_LOOP diff $B0/${V0}0/newdir/newsubdir/f$i $B0/${V0}1/newdir/newsubdir/f$i</div><div class='add'>+done</div><div class='add'>+</div><div class='add'>+# Verify that all the deleted names have been removed on the sink brick too by self-heal.</div><div class='add'>+TEST ! stat $B0/${V0}0/f1</div><div class='add'>+TEST ! stat $B0/${V0}0/f2</div><div class='add'>+TEST   stat $B0/${V0}0/f2_renamed</div><div class='add'>+TEST   stat $B0/${V0}0/symlink</div><div class='add'>+EXPECT "3" get_hard_link_count $B0/${V0}0/f3</div><div class='add'>+EXPECT "f4" readlink $B0/${V0}0/symlink</div><div class='add'>+TEST ! stat $B0/${V0}0/dir</div><div class='add'>+</div><div class='add'>+# Now verify that there are no name indices left after self-heal</div><div class='add'>+TEST ! stat $B0/${V0}1/.glusterfs/indices/entry-changes/$ROOT_GFID/f1</div><div class='add'>+TEST ! stat $B0/${V0}1/.glusterfs/indices/entry-changes/$ROOT_GFID/f2</div><div class='add'>+TEST ! stat $B0/${V0}1/.glusterfs/indices/entry-changes/$ROOT_GFID/f2_renamed</div><div class='add'>+TEST ! stat $B0/${V0}1/.glusterfs/indices/entry-changes/$ROOT_GFID/link</div><div class='add'>+TEST ! stat $B0/${V0}1/.glusterfs/indices/entry-changes/$ROOT_GFID/symlink</div><div class='add'>+TEST ! stat $B0/${V0}1/.glusterfs/indices/entry-changes/$ROOT_GFID/dir</div><div class='add'>+TEST ! stat $B0/${V0}1/.glusterfs/indices/entry-changes/$ROOT_GFID/newdir</div><div class='add'>+TEST ! stat $B0/${V0}1/.glusterfs/indices/entry-changes/$ROOT_GFID/file_stale</div><div class='add'>+</div><div class='add'>+TEST ! stat $B0/${V0}1/.glusterfs/indices/entry-changes/$gfid_dir/f1</div><div class='add'>+TEST ! stat $B0/${V0}1/.glusterfs/indices/entry-changes/$gfid_dir/f2</div><div class='add'>+TEST ! stat $B0/${V0}1/.glusterfs/indices/entry-changes/$gfid_dir/f3</div><div class='add'>+</div><div class='add'>+TEST ! stat $B0/${V0}1/.glusterfs/indices/entry-changes/$gfid_newdir/f1</div><div class='add'>+TEST ! stat $B0/${V0}1/.glusterfs/indices/entry-changes/$gfid_newdir/f2</div><div class='add'>+TEST ! stat $B0/${V0}1/.glusterfs/indices/entry-changes/$gfid_newdir/f3</div><div class='add'>+TEST ! stat $B0/${V0}1/.glusterfs/indices/entry-changes/$gfid_newsubdir/f1</div><div class='add'>+TEST ! stat $B0/${V0}1/.glusterfs/indices/entry-changes/$gfid_newsubdir/f2</div><div class='add'>+TEST ! stat $B0/${V0}1/.glusterfs/indices/entry-changes/$gfid_newsubdir/f3</div><div class='add'>+</div><div class='add'>+TEST ! stat $B0/${V0}1/.glusterfs/indices/entry-changes/$ROOT_GFID</div><div class='add'>+TEST ! stat $B0/${V0}1/.glusterfs/indices/entry-changes/$gfid_newdir</div><div class='add'>+TEST ! stat $B0/${V0}1/.glusterfs/indices/entry-changes/$gfid_newsubdir</div><div class='add'>+TEST ! stat $B0/${V0}1/.glusterfs/indices/entry-changes/$gfid_dir</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/basic/afr/granular-esh/granular-indices-but-non-granular-heal.t b/tests/basic/afr/granular-esh/granular-indices-but-non-granular-heal.t<br/>new file mode 100644<br/>index 00000000000..1b5421bf4b6<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/afr/granular-esh/granular-indices-but-non-granular-heal.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/afr/granular-esh/granular-indices-but-non-granular-heal.t</a></div><div class='hunk'>@@ -0,0 +1,76 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../../include.rc</div><div class='add'>+. $(dirname $0)/../../../volume.rc</div><div class='add'>+. $(dirname $0)/../../../afr.rc</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='add'>+</div><div class='add'>+TESTS_EXPECTED_IN_LOOP=4</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 replica 2 $H0:$B0/${V0}{0,1}</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+TEST $CLI volume set $V0 cluster.data-self-heal off</div><div class='add'>+TEST $CLI volume set $V0 cluster.metadata-self-heal off</div><div class='add'>+TEST $CLI volume set $V0 cluster.entry-self-heal off</div><div class='add'>+TEST $CLI volume set $V0 self-heal-daemon off</div><div class='add'>+TEST $CLI volume heal $V0 granular-entry-heal enable</div><div class='add'>+</div><div class='add'>+TEST glusterfs --volfile-id=$V0 --volfile-server=$H0 $M0</div><div class='add'>+</div><div class='add'>+# Kill brick-0.</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}0</div><div class='add'>+</div><div class='add'>+# Create files under root</div><div class='add'>+for i in {1..2}</div><div class='add'>+do</div><div class='add'>+        echo $i &gt; $M0/f$i</div><div class='add'>+done</div><div class='add'>+</div><div class='add'>+# Test that the index associated with '/' is created on B1.</div><div class='add'>+TEST stat $B0/${V0}1/.glusterfs/indices/entry-changes/$ROOT_GFID</div><div class='add'>+</div><div class='add'>+# Check for successful creation of granular entry indices</div><div class='add'>+for i in {1..2}</div><div class='add'>+do</div><div class='add'>+        TEST_IN_LOOP stat $B0/${V0}1/.glusterfs/indices/entry-changes/$ROOT_GFID/f$i</div><div class='add'>+done</div><div class='add'>+</div><div class='add'>+# Now disable granular-entry-heal</div><div class='add'>+TEST $CLI volume heal $V0 granular-entry-heal disable</div><div class='add'>+</div><div class='add'>+# Start the brick that was down</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 1</div><div class='add'>+</div><div class='add'>+# Enable shd</div><div class='add'>+TEST gluster volume set $V0 cluster.self-heal-daemon on</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "Y" glustershd_up_status</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 1</div><div class='add'>+</div><div class='add'>+# Now the indices created are granular but the heal is going to be of the</div><div class='add'>+# normal kind. We test to make sure that heal still completes fine and that</div><div class='add'>+# the stale granular indices are going to be deleted</div><div class='add'>+</div><div class='add'>+TEST $CLI volume heal $V0</div><div class='add'>+</div><div class='add'>+# Wait for heal to complete</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "^0$" get_pending_heal_count $V0</div><div class='add'>+</div><div class='add'>+# Test if data was healed</div><div class='add'>+for i in {1..2}</div><div class='add'>+do</div><div class='add'>+        TEST_IN_LOOP diff $B0/${V0}0/f$i $B0/${V0}1/f$i</div><div class='add'>+done</div><div class='add'>+</div><div class='add'>+# Now verify that there are no name indices left after self-heal</div><div class='add'>+TEST ! stat $B0/${V0}1/.glusterfs/indices/entry-changes/$ROOT_GFID/f1</div><div class='add'>+TEST ! stat $B0/${V0}1/.glusterfs/indices/entry-changes/$ROOT_GFID/f2</div><div class='add'>+TEST ! stat $B0/${V0}1/.glusterfs/indices/entry-changes/$ROOT_GFID</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/basic/afr/granular-esh/replace-brick.t b/tests/basic/afr/granular-esh/replace-brick.t<br/>new file mode 100644<br/>index 00000000000..5fc7811a8d8<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/afr/granular-esh/replace-brick.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/afr/granular-esh/replace-brick.t</a></div><div class='hunk'>@@ -0,0 +1,76 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+. $(dirname $0)/../../../include.rc</div><div class='add'>+. $(dirname $0)/../../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 replica 2 $H0:$B0/${V0}{0,1}</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+TEST $CLI volume set $V0 cluster.data-self-heal off</div><div class='add'>+TEST $CLI volume set $V0 cluster.metadata-self-heal off</div><div class='add'>+TEST $CLI volume set $V0 cluster.entry-self-heal off</div><div class='add'>+TEST $CLI volume set $V0 self-heal-daemon off</div><div class='add'>+TEST $CLI volume set $V0 cluster.heal-timeout 5</div><div class='add'>+TEST $CLI volume heal $V0 granular-entry-heal enable</div><div class='add'>+</div><div class='add'>+TEST glusterfs --volfile-id=$V0 --volfile-server=$H0 $M0;</div><div class='add'>+</div><div class='add'>+# Create files</div><div class='add'>+for i in {1..5}</div><div class='add'>+do</div><div class='add'>+        echo $i &gt; $M0/file$i.txt</div><div class='add'>+done</div><div class='add'>+</div><div class='add'>+# Metadata changes</div><div class='add'>+TEST setfattr -n user.test -v qwerty $M0/file5.txt</div><div class='add'>+</div><div class='add'>+# Replace brick1</div><div class='add'>+TEST $CLI volume replace-brick $V0 $H0:$B0/${V0}1 $H0:$B0/${V0}1_new commit force</div><div class='add'>+</div><div class='add'>+# Replaced-brick should accuse the non-replaced-brick (Simulating case for data-loss)</div><div class='add'>+TEST setfattr -n trusted.afr.$V0-client-0 -v 0x000000000000000000000001 $B0/${V0}1_new/</div><div class='add'>+</div><div class='add'>+# Check if data, metadata and entry segments of changelog are set for replaced-brick</div><div class='add'>+EXPECT "000000010000000100000001" get_hex_xattr trusted.afr.$V0-client-1 $B0/${V0}0</div><div class='add'>+</div><div class='add'>+# Also ensure we don't mistakenly tamper with the new brick's changelog xattrs</div><div class='add'>+EXPECT "000000000000000000000001" get_hex_xattr trusted.afr.$V0-client-0 $B0/${V0}1_new</div><div class='add'>+</div><div class='add'>+# Ensure the dirty xattr is set on the new brick.</div><div class='add'>+EXPECT "000000000000000000000001" get_hex_xattr trusted.afr.dirty $B0/${V0}1_new</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 1</div><div class='add'>+</div><div class='add'>+TEST $CLI volume set $V0 self-heal-daemon on</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "Y" glustershd_up_status</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 1</div><div class='add'>+TEST $CLI volume heal $V0</div><div class='add'>+</div><div class='add'>+# Wait for heal to complete</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "0" get_pending_heal_count $V0</div><div class='add'>+</div><div class='add'>+# Check if entry-heal has happened</div><div class='add'>+TEST diff &lt;(ls $B0/${V0}0 | sort) &lt;(ls $B0/${V0}1_new | sort)</div><div class='add'>+</div><div class='add'>+# To make sure that files were not lost from brick0</div><div class='add'>+TEST diff &lt;(ls $B0/${V0}0 | sort) &lt;(ls $B0/${V0}1 | sort)</div><div class='add'>+EXPECT "000000000000000000000000" get_hex_xattr trusted.afr.$V0-client-1 $B0/${V0}0</div><div class='add'>+</div><div class='add'>+# Test if data was healed</div><div class='add'>+TEST diff $B0/${V0}0/file1.txt $B0/${V0}1_new/file1.txt</div><div class='add'>+# To make sure that data was not lost from brick0</div><div class='add'>+TEST diff $B0/${V0}0/file1.txt $B0/${V0}1/file1.txt</div><div class='add'>+</div><div class='add'>+# Test if metadata was healed and exists on both the bricks</div><div class='add'>+EXPECT "qwerty" get_text_xattr user.test $B0/${V0}1_new/file5.txt</div><div class='add'>+EXPECT "qwerty" get_text_xattr user.test $B0/${V0}0/file5.txt</div><div class='add'>+</div><div class='add'>+EXPECT "000000000000000000000000" get_hex_xattr trusted.afr.$V0-client-1 $B0/${V0}0</div><div class='add'>+EXPECT "000000000000000000000000" get_hex_xattr trusted.afr.$V0-client-0 $B0/${V0}1_new</div><div class='add'>+EXPECT "000000000000000000000000" get_hex_xattr trusted.afr.dirty $B0/${V0}1_new</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/basic/afr/halo.t b/tests/basic/afr/halo.t<br/>new file mode 100644<br/>index 00000000000..3f61f5a0402<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/afr/halo.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/afr/halo.t</a></div><div class='hunk'>@@ -0,0 +1,61 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+#Tests that halo basic functionality works as expected</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+. $(dirname $0)/../../afr.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+function get_up_child()</div><div class='add'>+{</div><div class='add'>+    if [ "1" == $(afr_private_key_value $V0 $M0 0 "child_up\[0\]") ];</div><div class='add'>+    then</div><div class='add'>+        echo 0</div><div class='add'>+    elif [ "1" == $(afr_private_key_value $V0 $M0 0 "child_up\[1\]") ]</div><div class='add'>+    then</div><div class='add'>+        echo 1</div><div class='add'>+    fi</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 replica 2 $H0:$B0/${V0}{0,1}</div><div class='add'>+TEST $CLI volume set $V0 cluster.halo-enabled yes</div><div class='add'>+TEST $CLI volume set $V0 cluster.halo-max-replicas 1</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+TEST $GFS --volfile-id=$V0 --volfile-server=$H0 $M0;</div><div class='add'>+EXPECT "^1$" afr_private_key_value $V0 $M0 0 "halo_child_up\[0\]"</div><div class='add'>+EXPECT "^1$" afr_private_key_value $V0 $M0 0 "halo_child_up\[1\]"</div><div class='add'>+EXPECT_NOT "^-1$" afr_private_key_value $V0 $M0 0 "child_latency\[0\]"</div><div class='add'>+EXPECT_NOT "^-1$" afr_private_key_value $V0 $M0 0 "child_latency\[1\]"</div><div class='add'>+</div><div class='add'>+up_id=$(get_up_child)</div><div class='add'>+TEST [[ ! -z "$up_id" ]]</div><div class='add'>+</div><div class='add'>+down_id=$((1-up_id))</div><div class='add'>+</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}${up_id}</div><div class='add'>+#As max-replicas is configured to be 1, down_child should be up now</div><div class='add'>+EXPECT_WITHIN $PROCESS_DOWN_TIMEOUT "^1$" afr_private_key_value $V0 $M0 0 "halo_child_up\[${down_id}\]"</div><div class='add'>+EXPECT_WITHIN $PROCESS_DOWN_TIMEOUT "^1$" afr_private_key_value $V0 $M0 0 "child_up\[${down_id}\]"</div><div class='add'>+EXPECT_WITHIN $PROCESS_DOWN_TIMEOUT "^0$" afr_private_key_value $V0 $M0 0 "halo_child_up\[${up_id}\]"</div><div class='add'>+EXPECT_WITHIN $PROCESS_DOWN_TIMEOUT "^0$" afr_private_key_value $V0 $M0 0 "child_up\[${up_id}\]"</div><div class='add'>+EXPECT "^-1$" afr_private_key_value $V0 $M0 0 "child_latency\[${up_id}\]"</div><div class='add'>+EXPECT_NOT "^-1$" afr_private_key_value $V0 $M0 0 "child_latency\[${down_id}\]"</div><div class='add'>+</div><div class='add'>+#Bring the brick back up and the state should be restored</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "^1$" afr_private_key_value $V0 $M0 0 "halo_child_up\[${up_id}\]"</div><div class='add'>+</div><div class='add'>+up_id=$(get_up_child)</div><div class='add'>+TEST [[ ! -z "$up_id" ]]</div><div class='add'>+down_id=$((1-up_id))</div><div class='add'>+EXPECT_WITHIN $PROCESS_DOWN_TIMEOUT "^1$" afr_private_key_value $V0 $M0 0 "halo_child_up\[${down_id}\]"</div><div class='add'>+EXPECT_WITHIN $PROCESS_DOWN_TIMEOUT "^0$" afr_private_key_value $V0 $M0 0 "child_up\[${down_id}\]"</div><div class='add'>+EXPECT_WITHIN $PROCESS_DOWN_TIMEOUT "^1$" afr_private_key_value $V0 $M0 0 "halo_child_up\[${up_id}\]"</div><div class='add'>+EXPECT_WITHIN $PROCESS_DOWN_TIMEOUT "^1$" afr_private_key_value $V0 $M0 0 "child_up\[${up_id}\]"</div><div class='add'>+EXPECT_NOT "^-1$" afr_private_key_value $V0 $M0 0 "child_latency\[0\]"</div><div class='add'>+EXPECT_NOT "^-1$" afr_private_key_value $V0 $M0 0 "child_latency\[1\]"</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/basic/afr/heal-info.t b/tests/basic/afr/heal-info.t<br/>new file mode 100644<br/>index 00000000000..46d65007c88<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/afr/heal-info.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/afr/heal-info.t</a></div><div class='hunk'>@@ -0,0 +1,36 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+#Test that parallel heal-info command execution doesn't result in spurious</div><div class='add'>+#entries with locking-scheme granular</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+function heal_info_to_file {</div><div class='add'>+        while [ -f $M0/b.txt ]; do</div><div class='add'>+                $CLI volume heal $V0 info | grep -i number | grep -v 0 &gt;&gt; $1</div><div class='add'>+        done</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function write_and_del_file {</div><div class='add'>+        dd of=$M0/a.txt if=/dev/zero bs=1024k count=100</div><div class='add'>+        rm -f $M0/b.txt</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 replica 2 $H0:$B0/brick{0,1}</div><div class='add'>+TEST $CLI volume set $V0 locking-scheme granular</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+TEST $GFS --volfile-id=$V0 --volfile-server=$H0 $M0;</div><div class='add'>+TEST touch $M0/a.txt $M0/b.txt</div><div class='add'>+write_and_del_file &amp;</div><div class='add'>+touch $B0/f1 $B0/f2</div><div class='add'>+heal_info_to_file $B0/f1 &amp;</div><div class='add'>+heal_info_to_file $B0/f2 &amp;</div><div class='add'>+wait</div><div class='add'>+EXPECT "^$" cat $B0/f1</div><div class='add'>+EXPECT "^$" cat $B0/f2</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/basic/afr/heal-quota.t b/tests/basic/afr/heal-quota.t<br/>new file mode 100644<br/>index 00000000000..96e23363da8<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/afr/heal-quota.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/afr/heal-quota.t</a></div><div class='hunk'>@@ -0,0 +1,35 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+#This file tests that heal succeeds even when quota is exceeded</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 replica 2 $H0:$B0/${V0}{0,1}</div><div class='add'>+TEST $CLI volume set $V0 cluster.self-heal-daemon off</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+TEST $GFS --volfile-id=/$V0 --volfile-server=$H0 $M0;</div><div class='add'>+TEST $CLI volume quota $V0 enable</div><div class='add'>+TEST $CLI volume quota $V0 limit-usage / 10MB</div><div class='add'>+TEST $CLI volume quota $V0 soft-timeout 0</div><div class='add'>+TEST $CLI volume quota $V0 hard-timeout 0</div><div class='add'>+</div><div class='add'>+TEST touch $M0/a $M0/b</div><div class='add'>+dd if=/dev/zero of=$M0/b bs=1M count=7</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}0</div><div class='add'>+dd if=/dev/zero of=$M0/a bs=1M count=12 #This shall fail</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+TEST $CLI volume set $V0 cluster.self-heal-daemon on</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "Y" glustershd_up_status</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 1</div><div class='add'>+</div><div class='add'>+TEST $CLI volume heal $V0</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "0" get_pending_heal_count $V0</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/basic/afr/inodelk.t b/tests/basic/afr/inodelk.t<br/>new file mode 100644<br/>index 00000000000..a32aa8531b5<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/afr/inodelk.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/afr/inodelk.t</a></div><div class='hunk'>@@ -0,0 +1,87 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+#This test tests that inodelk fails when quorum is not met. Also tests the</div><div class='add'>+#success case where inodelk is obtained and unlocks are done correctly.</div><div class='add'>+</div><div class='add'>+TEST glusterd;</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 replica 3 arbiter 1 $H0:$B0/${V0}{0..5}</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+TEST $GFS -s $H0 --volfile-id=$V0 $M0</div><div class='add'>+</div><div class='add'>+#Test success case</div><div class='add'>+TEST mkdir $M0/dir1</div><div class='add'>+TEST mv $M0/dir1 $M0/dir2</div><div class='add'>+</div><div class='add'>+#If there is a problem with inodelk unlocking the following would hang.</div><div class='add'>+TEST mv $M0/dir2 $M0/dir1</div><div class='add'>+</div><div class='add'>+#Test failure case by bringing two of the bricks down</div><div class='add'>+#Test that the directory is not moved partially on some bricks but successful</div><div class='add'>+#on other subvol where quorum meets. Do that for both set of bricks</div><div class='add'>+</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}0</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}1</div><div class='add'>+TEST ! mv $M0/dir1 $M0/dir2</div><div class='add'>+</div><div class='add'>+TEST stat $B0/${V0}0/dir1</div><div class='add'>+TEST stat $B0/${V0}1/dir1</div><div class='add'>+TEST stat $B0/${V0}2/dir1</div><div class='add'>+TEST stat $B0/${V0}3/dir1</div><div class='add'>+TEST stat $B0/${V0}4/dir1</div><div class='add'>+TEST stat $B0/${V0}5/dir1</div><div class='add'>+TEST ! stat $B0/${V0}0/dir2</div><div class='add'>+TEST ! stat $B0/${V0}1/dir2</div><div class='add'>+TEST ! stat $B0/${V0}2/dir2</div><div class='add'>+TEST ! stat $B0/${V0}3/dir2</div><div class='add'>+TEST ! stat $B0/${V0}4/dir2</div><div class='add'>+TEST ! stat $B0/${V0}5/dir2</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}3</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}4</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 1</div><div class='add'>+TEST ! mv $M0/dir1 $M0/dir2</div><div class='add'>+TEST stat $B0/${V0}0/dir1</div><div class='add'>+TEST stat $B0/${V0}1/dir1</div><div class='add'>+TEST stat $B0/${V0}2/dir1</div><div class='add'>+TEST stat $B0/${V0}3/dir1</div><div class='add'>+TEST stat $B0/${V0}4/dir1</div><div class='add'>+TEST stat $B0/${V0}5/dir1</div><div class='add'>+TEST ! stat $B0/${V0}0/dir2</div><div class='add'>+TEST ! stat $B0/${V0}1/dir2</div><div class='add'>+TEST ! stat $B0/${V0}2/dir2</div><div class='add'>+TEST ! stat $B0/${V0}3/dir2</div><div class='add'>+TEST ! stat $B0/${V0}4/dir2</div><div class='add'>+TEST ! stat $B0/${V0}5/dir2</div><div class='add'>+</div><div class='add'>+#Bring the bricks back up and try mv once more, it should succeed.</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 3</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 4</div><div class='add'>+TEST mv $M0/dir1 $M0/dir2</div><div class='add'>+cleanup;</div><div class='add'>+#Do similar tests on replica 2</div><div class='add'>+TEST glusterd;</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 replica 2 $H0:$B0/${V0}{0..3}</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+TEST $GFS -s $H0 --volfile-id=$V0 $M0</div><div class='add'>+TEST mkdir $M0/dir1</div><div class='add'>+TEST mv $M0/dir1 $M0/dir2</div><div class='add'>+#Because we don't know hashed subvol, do the same test twice bringing 1 brick</div><div class='add'>+#from each down, quorum calculation should allow it.</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}0</div><div class='add'>+TEST mv $M0/dir2 $M0/dir1</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}2</div><div class='add'>+TEST mv $M0/dir1 $M0/dir2</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}0</div><div class='add'>+TEST mv $M0/dir2 $M0/dir1</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/basic/afr/lk-quorum.t b/tests/basic/afr/lk-quorum.t<br/>new file mode 100644<br/>index 00000000000..3364d8a6a1b<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/afr/lk-quorum.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/afr/lk-quorum.t</a></div><div class='hunk'>@@ -0,0 +1,257 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+SCRIPT_TIMEOUT=300</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+. $(dirname $0)/../../fileio.rc</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd;</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+</div><div class='add'>+#Tests for quorum-type option for replica 2</div><div class='add'>+TEST $CLI volume create $V0 replica 2 $H0:$B0/${V0}{0,1};</div><div class='add'>+TEST $CLI volume set $V0 performance.quick-read off</div><div class='add'>+TEST $CLI volume set $V0 performance.io-cache off</div><div class='add'>+TEST $CLI volume set $V0 performance.write-behind off</div><div class='add'>+TEST $CLI volume set $V0 performance.open-behind off</div><div class='add'>+TEST $CLI volume set $V0 performance.stat-prefetch off</div><div class='add'>+TEST $CLI volume set $V0 performance.read-ahead off</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+TEST $GFS -s $H0 --volfile-id=$V0 --direct-io-mode=enable $M0;</div><div class='add'>+</div><div class='add'>+TEST touch $M0/a</div><div class='add'>+</div><div class='add'>+#When all bricks are up, lock and unlock should succeed</div><div class='add'>+TEST fd1=`fd_available`</div><div class='add'>+TEST fd_open $fd1 'w' $M0/a</div><div class='add'>+TEST flock -x $fd1</div><div class='add'>+TEST fd_close $fd1</div><div class='add'>+</div><div class='add'>+#When all bricks are down, lock/unlock should fail</div><div class='add'>+TEST fd1=`fd_available`</div><div class='add'>+TEST fd_open $fd1 'w' $M0/a</div><div class='add'>+TEST $CLI volume stop $V0</div><div class='add'>+TEST ! flock -x $fd1</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 1</div><div class='add'>+TEST fd_close $fd1</div><div class='add'>+</div><div class='add'>+#Check locking behavior with quorum 'fixed' and quorum-count 2</div><div class='add'>+TEST $CLI volume set $V0 cluster.quorum-type fixed</div><div class='add'>+TEST $CLI volume set $V0 cluster.quorum-count 2</div><div class='add'>+EXPECT_WITHIN $CONFIG_UPDATE_TIMEOUT "^fixed$" mount_get_option_value $M0 $V0-replicate-0 quorum-type</div><div class='add'>+EXPECT_WITHIN $CONFIG_UPDATE_TIMEOUT "^2$" mount_get_option_value $M0 $V0-replicate-0 quorum-count</div><div class='add'>+</div><div class='add'>+#When all bricks are up, lock and unlock should succeed</div><div class='add'>+TEST fd1=`fd_available`</div><div class='add'>+TEST fd_open $fd1 'w' $M0/a</div><div class='add'>+TEST flock -x $fd1</div><div class='add'>+TEST fd_close $fd1</div><div class='add'>+</div><div class='add'>+#When all bricks are down, lock/unlock should fail</div><div class='add'>+TEST fd1=`fd_available`</div><div class='add'>+TEST fd_open $fd1 'w' $M0/a</div><div class='add'>+TEST $CLI volume stop $V0</div><div class='add'>+TEST ! flock -x $fd1</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 1</div><div class='add'>+TEST fd_close $fd1</div><div class='add'>+</div><div class='add'>+#When any of the bricks is down lock/unlock should fail</div><div class='add'>+#kill first brick</div><div class='add'>+TEST fd1=`fd_available`</div><div class='add'>+TEST fd_open $fd1 'w' $M0/a</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}0</div><div class='add'>+TEST ! flock -x $fd1</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 0</div><div class='add'>+TEST fd_close $fd1</div><div class='add'>+</div><div class='add'>+#kill 2nd brick</div><div class='add'>+TEST fd1=`fd_available`</div><div class='add'>+TEST fd_open $fd1 'w' $M0/a</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}1</div><div class='add'>+TEST ! flock -x $fd1</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 1</div><div class='add'>+TEST fd_close $fd1</div><div class='add'>+</div><div class='add'>+#Check locking behavior with quorum 'fixed' and quorum-count 1</div><div class='add'>+TEST $CLI volume set $V0 cluster.quorum-count 1</div><div class='add'>+EXPECT_WITHIN $CONFIG_UPDATE_TIMEOUT "^1$" mount_get_option_value $M0 $V0-replicate-0 quorum-count</div><div class='add'>+</div><div class='add'>+#When all bricks are up, lock and unlock should succeed</div><div class='add'>+TEST fd1=`fd_available`</div><div class='add'>+TEST fd_open $fd1 'w' $M0/a</div><div class='add'>+TEST flock -x $fd1</div><div class='add'>+TEST fd_close $fd1</div><div class='add'>+</div><div class='add'>+#When all bricks are down, lock/unlock should fail</div><div class='add'>+TEST fd1=`fd_available`</div><div class='add'>+TEST fd_open $fd1 'w' $M0/a</div><div class='add'>+TEST $CLI volume stop $V0</div><div class='add'>+TEST ! flock -x $fd1</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 1</div><div class='add'>+TEST fd_close $fd1</div><div class='add'>+</div><div class='add'>+#When any of the bricks is down lock/unlock should succeed</div><div class='add'>+#kill first brick</div><div class='add'>+TEST fd1=`fd_available`</div><div class='add'>+TEST fd_open $fd1 'w' $M0/a</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}0</div><div class='add'>+TEST flock -x $fd1</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 0</div><div class='add'>+TEST fd_close $fd1</div><div class='add'>+</div><div class='add'>+#kill 2nd brick</div><div class='add'>+TEST fd1=`fd_available`</div><div class='add'>+TEST fd_open $fd1 'w' $M0/a</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}1</div><div class='add'>+TEST flock -x $fd1</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 1</div><div class='add'>+TEST fd_close $fd1</div><div class='add'>+</div><div class='add'>+#Check locking behavior with quorum 'auto'</div><div class='add'>+TEST $CLI volume set $V0 cluster.quorum-type auto</div><div class='add'>+EXPECT_WITHIN $CONFIG_UPDATE_TIMEOUT "^auto$" mount_get_option_value $M0 $V0-replicate-0 quorum-type</div><div class='add'>+</div><div class='add'>+#When all bricks are up, lock and unlock should succeed</div><div class='add'>+TEST fd1=`fd_available`</div><div class='add'>+TEST fd_open $fd1 'w' $M0/a</div><div class='add'>+TEST flock -x $fd1</div><div class='add'>+TEST fd_close $fd1</div><div class='add'>+</div><div class='add'>+#When all bricks are down, lock/unlock should fail</div><div class='add'>+TEST fd1=`fd_available`</div><div class='add'>+TEST fd_open $fd1 'w' $M0/a</div><div class='add'>+TEST $CLI volume stop $V0</div><div class='add'>+TEST ! flock -x $fd1</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 1</div><div class='add'>+TEST fd_close $fd1</div><div class='add'>+</div><div class='add'>+#When first brick is down lock/unlock should fail</div><div class='add'>+#kill first brick</div><div class='add'>+TEST fd1=`fd_available`</div><div class='add'>+TEST fd_open $fd1 'w' $M0/a</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}0</div><div class='add'>+TEST ! flock -x $fd1</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 0</div><div class='add'>+TEST fd_close $fd1</div><div class='add'>+</div><div class='add'>+#When second brick is down lock/unlock should succeed</div><div class='add'>+TEST fd1=`fd_available`</div><div class='add'>+TEST fd_open $fd1 'w' $M0/a</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}1</div><div class='add'>+TEST flock -x $fd1</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 1</div><div class='add'>+TEST fd_close $fd1</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+TEST glusterd;</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+</div><div class='add'>+#Tests for replica 3</div><div class='add'>+TEST $CLI volume create $V0 replica 3 $H0:$B0/${V0}{0,1,2};</div><div class='add'>+TEST $CLI volume set $V0 performance.quick-read off</div><div class='add'>+TEST $CLI volume set $V0 performance.io-cache off</div><div class='add'>+TEST $CLI volume set $V0 performance.write-behind off</div><div class='add'>+TEST $CLI volume set $V0 performance.open-behind off</div><div class='add'>+TEST $CLI volume set $V0 performance.stat-prefetch off</div><div class='add'>+TEST $CLI volume set $V0 performance.read-ahead off</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+TEST $GFS -s $H0 --volfile-id=$V0 --direct-io-mode=enable $M0;</div><div class='add'>+</div><div class='add'>+TEST touch $M0/a</div><div class='add'>+</div><div class='add'>+#When all bricks are up, lock and unlock should succeed</div><div class='add'>+TEST fd1=`fd_available`</div><div class='add'>+TEST fd_open $fd1 'w' $M0/a</div><div class='add'>+TEST flock -x $fd1</div><div class='add'>+TEST fd_close $fd1</div><div class='add'>+</div><div class='add'>+#When all bricks are down, lock/unlock should fail</div><div class='add'>+TEST fd1=`fd_available`</div><div class='add'>+TEST fd_open $fd1 'w' $M0/a</div><div class='add'>+TEST $CLI volume stop $V0</div><div class='add'>+TEST ! flock -x $fd1</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 1</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 2</div><div class='add'>+TEST fd_close $fd1</div><div class='add'>+</div><div class='add'>+#When any of the bricks is down lock/unlock should succeed</div><div class='add'>+#kill first brick</div><div class='add'>+TEST fd1=`fd_available`</div><div class='add'>+TEST fd_open $fd1 'w' $M0/a</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}0</div><div class='add'>+TEST flock -x $fd1</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 0</div><div class='add'>+TEST fd_close $fd1</div><div class='add'>+</div><div class='add'>+#kill 2nd brick</div><div class='add'>+TEST fd1=`fd_available`</div><div class='add'>+TEST fd_open $fd1 'w' $M0/a</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}1</div><div class='add'>+TEST flock -x $fd1</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 1</div><div class='add'>+TEST fd_close $fd1</div><div class='add'>+</div><div class='add'>+#kill 3rd brick</div><div class='add'>+TEST fd1=`fd_available`</div><div class='add'>+TEST fd_open $fd1 'w' $M0/a</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}2</div><div class='add'>+TEST flock -x $fd1</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 2</div><div class='add'>+TEST fd_close $fd1</div><div class='add'>+</div><div class='add'>+#When any two of the bricks are down lock/unlock should fail</div><div class='add'>+#kill first,second bricks</div><div class='add'>+TEST fd1=`fd_available`</div><div class='add'>+TEST fd_open $fd1 'w' $M0/a</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}0</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}1</div><div class='add'>+TEST ! flock -x $fd1</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 1</div><div class='add'>+TEST fd_close $fd1</div><div class='add'>+</div><div class='add'>+#kill 2nd,3rd bricks</div><div class='add'>+TEST fd1=`fd_available`</div><div class='add'>+TEST fd_open $fd1 'w' $M0/a</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}1</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}2</div><div class='add'>+TEST ! flock -x $fd1</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 1</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 2</div><div class='add'>+TEST fd_close $fd1</div><div class='add'>+</div><div class='add'>+#kill 1st,3rd brick</div><div class='add'>+TEST fd1=`fd_available`</div><div class='add'>+TEST fd_open $fd1 'w' $M0/a</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}0</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}2</div><div class='add'>+TEST ! flock -x $fd1</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 2</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 0</div><div class='add'>+TEST fd_close $fd1</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/basic/afr/metadata-self-heal.t b/tests/basic/afr/metadata-self-heal.t<br/>new file mode 100644<br/>index 00000000000..275aecd2175<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/afr/metadata-self-heal.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/afr/metadata-self-heal.t</a></div><div class='hunk'>@@ -0,0 +1,133 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+#Self-heal tests</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+function is_heal_done {</div><div class='add'>+        local f1_path="${1}/${3}"</div><div class='add'>+        local f2_path="${2}/${3}"</div><div class='add'>+        local zero_xattr="000000000000000000000000"</div><div class='add'>+        local iatt1=$(stat -c "%g:%u:%A" $f1_path)</div><div class='add'>+        local iatt2=$(stat -c "%g:%u:%A" $f2_path)</div><div class='add'>+        local diff="1"</div><div class='add'>+        if [ "$iatt1" == "$iatt2" ]; then diff=0; fi</div><div class='add'>+        local xattr11=$(get_hex_xattr trusted.afr.$V0-client-0 $f1_path)</div><div class='add'>+        local xattr12=$(get_hex_xattr trusted.afr.$V0-client-1 $f1_path)</div><div class='add'>+        local xattr21=$(get_hex_xattr trusted.afr.$V0-client-0 $f2_path)</div><div class='add'>+        local xattr22=$(get_hex_xattr trusted.afr.$V0-client-1 $f2_path)</div><div class='add'>+        local dirty1=$(get_hex_xattr trusted.afr.dirty $f1_path)</div><div class='add'>+        local dirty2=$(get_hex_xattr trusted.afr.dirty $f2_path)</div><div class='add'>+        if [ -z $xattr11 ]; then xattr11="000000000000000000000000"; fi</div><div class='add'>+        if [ -z $xattr12 ]; then xattr12="000000000000000000000000"; fi</div><div class='add'>+        if [ -z $xattr21 ]; then xattr21="000000000000000000000000"; fi</div><div class='add'>+        if [ -z $xattr22 ]; then xattr22="000000000000000000000000"; fi</div><div class='add'>+        if [ -z $dirty1 ]; then dirty1="000000000000000000000000"; fi</div><div class='add'>+        if [ -z $dirty2 ]; then dirty2="000000000000000000000000"; fi</div><div class='add'>+        if [ "${diff}${xattr11}${xattr12}${xattr21}${xattr22}${dirty1}${dirty2}" == "0${zero_xattr}${zero_xattr}${zero_xattr}${zero_xattr}${zero_xattr}${zero_xattr}" ];</div><div class='add'>+        then</div><div class='add'>+                echo "Y"</div><div class='add'>+        else</div><div class='add'>+                echo "N"</div><div class='add'>+        fi</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function print_pending_heals {</div><div class='add'>+        local result=":"</div><div class='add'>+        for i in "$@";</div><div class='add'>+        do</div><div class='add'>+                if [ "N" == $(is_heal_done $B0/brick0 $B0/brick1 $i) ];</div><div class='add'>+                then</div><div class='add'>+                        result="$result:$i"</div><div class='add'>+                fi</div><div class='add'>+        done</div><div class='add'>+#To prevent any match for EXPECT_WITHIN, print a char non-existent in file-names</div><div class='add'>+        if [ $result == ":" ]; then result="~"; fi</div><div class='add'>+        echo $result</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 replica 2 $H0:$B0/brick{0,1}</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+TEST $GFS --volfile-id=/$V0 --volfile-server=$H0 $M0</div><div class='add'>+cd $M0</div><div class='add'>+</div><div class='add'>+TEST touch a</div><div class='add'>+</div><div class='add'>+#Test heal with pending xattrs</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/brick0</div><div class='add'>+TEST chmod 777 a</div><div class='add'>+TEST chown 100:100 a</div><div class='add'>+TEST setfattr -n trusted.abc -v 0x616263 a</div><div class='add'>+TEST setfattr -n trusted.def -v 0x646566 a</div><div class='add'>+permissions=$(stat -c "%A" a)</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "~" print_pending_heals a</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 0</div><div class='add'>+</div><div class='add'>+EXPECT $permissions stat -c "%A" a</div><div class='add'>+EXPECT $permissions stat -c "%A" $B0/brick0/a</div><div class='add'>+EXPECT $permissions stat -c "%A" $B0/brick1/a</div><div class='add'>+</div><div class='add'>+EXPECT 100 stat -c "%g" a</div><div class='add'>+EXPECT 100 stat -c "%g" $B0/brick0/a</div><div class='add'>+EXPECT 100 stat -c "%g" $B0/brick1/a</div><div class='add'>+</div><div class='add'>+EXPECT 100 stat -c "%u" a</div><div class='add'>+EXPECT 100 stat -c "%u" $B0/brick0/a</div><div class='add'>+EXPECT 100 stat -c "%u" $B0/brick1/a</div><div class='add'>+</div><div class='add'>+EXPECT 616263 get_hex_xattr trusted.abc a</div><div class='add'>+EXPECT 616263 get_hex_xattr trusted.abc $B0/brick0/a</div><div class='add'>+EXPECT 616263 get_hex_xattr trusted.abc $B0/brick1/a</div><div class='add'>+</div><div class='add'>+EXPECT 646566 get_hex_xattr trusted.def a</div><div class='add'>+EXPECT 646566 get_hex_xattr trusted.def $B0/brick0/a</div><div class='add'>+EXPECT 646566 get_hex_xattr trusted.def $B0/brick1/a</div><div class='add'>+</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/brick1</div><div class='add'>+TEST setfattr -n trusted.abc -v 0x646566 a</div><div class='add'>+TEST setfattr -x trusted.def a</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "~" print_pending_heals a</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 1</div><div class='add'>+</div><div class='add'>+EXPECT 646566 get_hex_xattr trusted.abc a</div><div class='add'>+EXPECT 646566 get_hex_xattr trusted.abc $B0/brick0/a</div><div class='add'>+EXPECT 646566 get_hex_xattr trusted.abc $B0/brick1/a</div><div class='add'>+</div><div class='add'>+TEST ! getfattr -n trusted.def a</div><div class='add'>+TEST ! getfattr -n trusted.def $B0/brick0/a</div><div class='add'>+TEST ! getfattr -n trusted.def $B0/brick1/a</div><div class='add'>+</div><div class='add'>+#Test split-brain &amp;&amp; iatt mismatch without any xattrs (this will be simulated)</div><div class='add'>+TEST $CLI volume set $V0 cluster.self-heal-daemon off</div><div class='add'>+TEST touch b</div><div class='add'>+TEST touch c</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/brick0</div><div class='add'>+TEST chmod 777 b</div><div class='add'>+TEST chmod 777 c</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 0</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/brick1</div><div class='add'>+TEST chown 100:100 b</div><div class='add'>+TEST chown 100:100 c</div><div class='add'>+TEST $CLI volume stop $V0</div><div class='add'>+TEST setfattr -x trusted.afr.$V0-client-0 $B0/brick1/c</div><div class='add'>+TEST setfattr -x trusted.afr.$V0-client-1 $B0/brick0/c</div><div class='add'>+TEST $CLI volume set $V0 cluster.self-heal-daemon on</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 1</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "Y" glustershd_up_status</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 1</div><div class='add'>+TEST $CLI volume heal $V0 full</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "~" print_pending_heals c</div><div class='add'>+EXPECT "N" is_heal_done $B0/brick0 $B0/brick1 b</div><div class='add'>+</div><div class='add'>+cd -</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/basic/afr/name-self-heal.t b/tests/basic/afr/name-self-heal.t<br/>new file mode 100644<br/>index 00000000000..50fc2ecc6c2<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/afr/name-self-heal.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/afr/name-self-heal.t</a></div><div class='hunk'>@@ -0,0 +1,112 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+#Self-heal tests</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+. $(dirname $0)/../../afr.rc</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+#Check that when quorum is not enabled name-heal happens correctly</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 replica 2 $H0:$B0/brick{0,1}</div><div class='add'>+TEST $CLI volume set $V0 performance.stat-prefetch off</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+TEST $CLI volume heal $V0 disable</div><div class='add'>+TEST $CLI volume set $V0 cluster.entry-self-heal off</div><div class='add'>+TEST $GFS --volfile-id=$V0 --volfile-server=$H0 $M0;</div><div class='add'>+</div><div class='add'>+TEST touch $M0/a</div><div class='add'>+TEST touch $M0/c</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/brick0</div><div class='add'>+TEST touch $M0/b</div><div class='add'>+TEST rm -f $M0/a</div><div class='add'>+TEST rm -f $M0/c</div><div class='add'>+TEST touch $M0/c #gfid mismatch case</div><div class='add'>+c_gfid=$(gf_get_gfid_xattr $B0/brick1/c)</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status $V0 0</div><div class='add'>+TEST ! stat $M0/a</div><div class='add'>+TEST ! stat $B0/brick0/a</div><div class='add'>+TEST ! stat $B0/brick1/a</div><div class='add'>+</div><div class='add'>+TEST stat $M0/b</div><div class='add'>+TEST stat $B0/brick0/b</div><div class='add'>+TEST stat $B0/brick1/b</div><div class='add'>+TEST [[ "$(gf_get_gfid_xattr $B0/brick0/b)" == "$(gf_get_gfid_xattr $B0/brick1/b)" ]]</div><div class='add'>+</div><div class='add'>+TEST stat $M0/c</div><div class='add'>+TEST stat $B0/brick0/c</div><div class='add'>+TEST stat $B0/brick1/c</div><div class='add'>+TEST [[ "$(gf_get_gfid_xattr $B0/brick0/c)" == "$c_gfid" ]]</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+#Check that when quorum is enabled name-heal happens as expected</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 replica 3 $H0:$B0/brick{0,1,2}</div><div class='add'>+TEST $CLI volume set $V0 performance.stat-prefetch off</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+TEST $CLI volume heal $V0 disable</div><div class='add'>+TEST $CLI volume set $V0 cluster.entry-self-heal off</div><div class='add'>+TEST $GFS --volfile-id=$V0 --volfile-server=$H0 $M0;</div><div class='add'>+</div><div class='add'>+TEST touch $M0/a</div><div class='add'>+TEST touch $M0/c</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/brick0</div><div class='add'>+TEST touch $M0/b</div><div class='add'>+TEST rm -f $M0/a</div><div class='add'>+TEST rm -f $M0/c</div><div class='add'>+TEST touch $M0/c #gfid mismatch case</div><div class='add'>+c_gfid=$(gf_get_gfid_xattr $B0/brick1/c)</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status $V0 0</div><div class='add'>+TEST ! stat $M0/a</div><div class='add'>+TEST ! stat $B0/brick0/a</div><div class='add'>+TEST ! stat $B0/brick1/a</div><div class='add'>+TEST ! stat $B0/brick2/a</div><div class='add'>+</div><div class='add'>+TEST stat $M0/b</div><div class='add'>+TEST ! stat $B0/brick0/b #Name heal shouldn't be triggered</div><div class='add'>+TEST stat $B0/brick1/b</div><div class='add'>+TEST stat $B0/brick2/b</div><div class='add'>+</div><div class='add'>+TEST stat $M0/c</div><div class='add'>+TEST stat $B0/brick0/c</div><div class='add'>+TEST stat $B0/brick1/c</div><div class='add'>+TEST stat $B0/brick2/c</div><div class='add'>+TEST [[ "$(gf_get_gfid_xattr $B0/brick0/c)" == "$c_gfid" ]]</div><div class='add'>+</div><div class='add'>+TEST $CLI volume set $V0 cluster.quorum-type none</div><div class='add'>+EXPECT_WITHIN $CONFIG_UPDATE_TIMEOUT "none" get_quorum_type $M0 $V0 0</div><div class='add'>+TEST stat $M0/b</div><div class='add'>+TEST stat $B0/brick0/b #Name heal should be triggered</div><div class='add'>+TEST stat $B0/brick1/b</div><div class='add'>+TEST stat $B0/brick2/b</div><div class='add'>+TEST [[ "$(gf_get_gfid_xattr $B0/brick0/b)" == "$(gf_get_gfid_xattr $B0/brick1/b)" ]]</div><div class='add'>+TEST $CLI volume set $V0 cluster.quorum-type auto</div><div class='add'>+EXPECT_WITHIN $CONFIG_UPDATE_TIMEOUT "auto" get_quorum_type $M0 $V0 0</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+</div><div class='add'>+#Missing parent xattrs cases</div><div class='add'>+TEST $CLI volume heal $V0 enable</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "Y" glustershd_up_status</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 1</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 2</div><div class='add'>+TEST $CLI volume heal $V0</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "0" get_pending_heal_count $V0</div><div class='add'>+</div><div class='add'>+TEST $GFS --volfile-id=$V0 --volfile-server=$H0 $M0;</div><div class='add'>+TEST $CLI volume heal $V0 disable</div><div class='add'>+#In cases where a good parent doesn't have pending xattrs and a file,</div><div class='add'>+#name-heal will be triggered</div><div class='add'>+TEST gf_rm_file_and_gfid_link $B0/brick1 c</div><div class='add'>+TEST stat $M0/c</div><div class='add'>+TEST stat $B0/brick0/c</div><div class='add'>+TEST stat $B0/brick1/c</div><div class='add'>+TEST stat $B0/brick2/c</div><div class='add'>+TEST [[ "$(gf_get_gfid_xattr $B0/brick0/c)" == "$c_gfid" ]]</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/basic/afr/quorum.t b/tests/basic/afr/quorum.t<br/>new file mode 100644<br/>index 00000000000..58116ba49f5<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/afr/quorum.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/afr/quorum.t</a></div><div class='hunk'>@@ -0,0 +1,97 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd;</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+</div><div class='add'>+function test_write {</div><div class='add'>+        dd of=$M0/a if=/dev/urandom bs=1k count=1 2&gt;&amp;1 &gt; /dev/null</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#Tests for quorum-type option for replica 2</div><div class='add'>+TEST $CLI volume create $V0 replica 2 $H0:$B0/${V0}{1,2};</div><div class='add'>+TEST $CLI volume set $V0 performance.quick-read off</div><div class='add'>+TEST $CLI volume set $V0 performance.io-cache off</div><div class='add'>+TEST $CLI volume set $V0 performance.write-behind off</div><div class='add'>+TEST $CLI volume set $V0 performance.stat-prefetch off</div><div class='add'>+TEST $CLI volume set $V0 performance.read-ahead off</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+TEST $GFS -s $H0 --volfile-id=$V0 --direct-io-mode=enable $M0;</div><div class='add'>+</div><div class='add'>+touch $M0/a</div><div class='add'>+echo abc &gt; $M0/b</div><div class='add'>+</div><div class='add'>+TEST ! $CLI volume set $V0 cluster.quorum-type ""</div><div class='add'>+TEST $CLI volume set $V0 cluster.quorum-type fixed</div><div class='add'>+EXPECT fixed volume_option $V0 cluster.quorum-type</div><div class='add'>+TEST $CLI volume set $V0 cluster.quorum-count 2</div><div class='add'>+TEST test_write</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}1</div><div class='add'>+TEST ! test_write</div><div class='add'>+TEST ! cat $M0/b</div><div class='add'>+</div><div class='add'>+TEST $CLI volume set $V0 cluster.quorum-type auto</div><div class='add'>+EXPECT auto volume_option $V0 cluster.quorum-type</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 0</div><div class='add'>+TEST test_write</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}1</div><div class='add'>+TEST ! test_write</div><div class='add'>+TEST ! cat $M0/b</div><div class='add'>+</div><div class='add'>+TEST $CLI volume set $V0 cluster.quorum-type none</div><div class='add'>+EXPECT none volume_option $V0 cluster.quorum-type</div><div class='add'>+TEST test_write</div><div class='add'>+#Default is 'none' for even number of bricks in replication</div><div class='add'>+TEST $CLI volume reset $V0 cluster.quorum-type</div><div class='add'>+TEST test_write</div><div class='add'>+EXPECT "abc" cat $M0/b</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+TEST glusterd;</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+</div><div class='add'>+#Tests for quorum-type option for replica 3</div><div class='add'>+TEST $CLI volume create $V0 replica 3 $H0:$B0/${V0}{1,2,3};</div><div class='add'>+TEST $CLI volume set $V0 performance.quick-read off</div><div class='add'>+TEST $CLI volume set $V0 performance.io-cache off</div><div class='add'>+TEST $CLI volume set $V0 performance.write-behind off</div><div class='add'>+TEST $CLI volume set $V0 performance.stat-prefetch off</div><div class='add'>+TEST $CLI volume set $V0 performance.read-ahead off</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+TEST $GFS -s $H0 --volfile-id=$V0 --direct-io-mode=enable $M0;</div><div class='add'>+</div><div class='add'>+touch $M0/a</div><div class='add'>+echo abc &gt; $M0/b</div><div class='add'>+</div><div class='add'>+TEST $CLI volume set $V0 cluster.quorum-type fixed</div><div class='add'>+EXPECT fixed volume_option $V0 cluster.quorum-type</div><div class='add'>+TEST $CLI volume set $V0 cluster.quorum-count 3</div><div class='add'>+TEST test_write</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}1</div><div class='add'>+TEST ! test_write</div><div class='add'>+TEST ! cat $M0/b</div><div class='add'>+</div><div class='add'>+TEST $CLI volume set $V0 cluster.quorum-type auto</div><div class='add'>+EXPECT auto volume_option $V0 cluster.quorum-type</div><div class='add'>+TEST test_write</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}3</div><div class='add'>+TEST ! test_write</div><div class='add'>+TEST ! cat $M0/b</div><div class='add'>+</div><div class='add'>+TEST $CLI volume set $V0 cluster.quorum-type none</div><div class='add'>+EXPECT none volume_option $V0 cluster.quorum-type</div><div class='add'>+TEST test_write</div><div class='add'>+#Default is 'auto' for odd number of bricks in replication</div><div class='add'>+TEST $CLI volume reset $V0 cluster.quorum-type</div><div class='add'>+EXPECT "^$" volume_option $V0 cluster.quorum-type</div><div class='add'>+TEST ! test_write</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 2</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}3</div><div class='add'>+TEST test_write</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/basic/afr/read-subvol-data.t b/tests/basic/afr/read-subvol-data.t<br/>new file mode 100644<br/>index 00000000000..39f43a15028<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/afr/read-subvol-data.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/afr/read-subvol-data.t</a></div><div class='hunk'>@@ -0,0 +1,33 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+#Test if the source is selected based on data transaction for a regular file.</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+#Init</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 replica 2 $H0:$B0/brick{0,1}</div><div class='add'>+TEST $CLI volume set $V0 self-heal-daemon off</div><div class='add'>+TEST $CLI volume set $V0 stat-prefetch off</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+TEST $CLI volume set $V0 cluster.background-self-heal-count 0</div><div class='add'>+TEST $GFS --volfile-id=$V0 --volfile-server=$H0 $M0;</div><div class='add'>+</div><div class='add'>+#Test</div><div class='add'>+TEST $CLI volume set $V0 cluster.read-subvolume $V0-client-1</div><div class='add'>+TEST $CLI volume set $V0 cluster.data-self-heal off</div><div class='add'>+TEST $CLI volume set $V0 cluster.metadata-self-heal off</div><div class='add'>+TEST $CLI volume set $V0 cluster.entry-self-heal off</div><div class='add'>+TEST dd if=/dev/urandom of=$M0/afr_success_5.txt bs=1024k count=1</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/brick0</div><div class='add'>+TEST dd if=/dev/urandom of=$M0/afr_success_5.txt bs=1024k count=10</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "10485760" echo `ls -l $M0/afr_success_5.txt | awk '{ print $5}'`</div><div class='add'>+</div><div class='add'>+#Cleanup</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+TEST $CLI volume stop $V0</div><div class='add'>+TEST $CLI volume delete $V0</div><div class='add'>+TEST rm -rf $B0/*</div><div class='head'>diff --git a/tests/basic/afr/read-subvol-entry.t b/tests/basic/afr/read-subvol-entry.t<br/>new file mode 100644<br/>index 00000000000..76b2dcf85b0<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/afr/read-subvol-entry.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/afr/read-subvol-entry.t</a></div><div class='hunk'>@@ -0,0 +1,35 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+#Test if the read child is selected based on entry transaction for directory</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+#Init</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 replica 2 $H0:$B0/brick{0,1}</div><div class='add'>+TEST $CLI volume set $V0 self-heal-daemon off</div><div class='add'>+TEST $CLI volume set $V0 stat-prefetch off</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+TEST $CLI volume set $V0 cluster.background-self-heal-count 0</div><div class='add'>+TEST $GFS --volfile-id=$V0 --volfile-server=$H0 $M0;</div><div class='add'>+</div><div class='add'>+#Test</div><div class='add'>+TEST mkdir -p $M0/abc/def</div><div class='add'>+</div><div class='add'>+TEST $CLI volume set $V0 cluster.data-self-heal off</div><div class='add'>+TEST $CLI volume set $V0 cluster.metadata-self-heal off</div><div class='add'>+TEST $CLI volume set $V0 cluster.entry-self-heal off</div><div class='add'>+</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/brick0</div><div class='add'>+</div><div class='add'>+TEST touch $M0/abc/def/ghi</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "ghi" echo `ls $M0/abc/def/`</div><div class='add'>+</div><div class='add'>+#Cleanup</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+TEST $CLI volume stop $V0</div><div class='add'>+TEST $CLI volume delete $V0</div><div class='add'>+TEST rm -rf $B0/*</div><div class='head'>diff --git a/tests/basic/afr/rename-data-loss.t b/tests/basic/afr/rename-data-loss.t<br/>new file mode 100644<br/>index 00000000000..256ee2aafce<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/afr/rename-data-loss.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/afr/rename-data-loss.t</a></div><div class='hunk'>@@ -0,0 +1,72 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+#Self-heal tests</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+. $(dirname $0)/../../afr.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 replica 2 $H0:$B0/brick{0,1}</div><div class='add'>+TEST $CLI volume set $V0 write-behind off</div><div class='add'>+TEST $CLI volume set $V0 self-heal-daemon off</div><div class='add'>+TEST $CLI volume set $V0 data-self-heal off</div><div class='add'>+TEST $CLI volume set $V0 metadata-self-heal off</div><div class='add'>+TEST $CLI volume set $V0 entry-self-heal off</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+EXPECT 'Started' volinfo_field $V0 'Status'</div><div class='add'>+TEST glusterfs --volfile-id=$V0 --volfile-server=$H0 $M0;</div><div class='add'>+</div><div class='add'>+cd $M0</div><div class='add'>+TEST `echo "line1" &gt;&gt; file1`</div><div class='add'>+TEST mkdir dir1</div><div class='add'>+TEST mkdir dir2</div><div class='add'>+TEST mkdir -p dir1/dira/dirb</div><div class='add'>+TEST `echo "line1"&gt;&gt;dir1/dira/dirb/file1`</div><div class='add'>+TEST mkdir delete_me</div><div class='add'>+TEST `echo "line1" &gt;&gt; delete_me/file1`</div><div class='add'>+</div><div class='add'>+#brick0 has witnessed the second write while brick1 is down.</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/brick1</div><div class='add'>+TEST `echo "line2" &gt;&gt; file1`</div><div class='add'>+TEST `echo "line2" &gt;&gt; dir1/dira/dirb/file1`</div><div class='add'>+TEST `echo "line2" &gt;&gt; delete_me/file1`</div><div class='add'>+</div><div class='add'>+#Toggle the bricks that are up/down.</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status $V0 1</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/brick0</div><div class='add'>+</div><div class='add'>+#Rename when the 'source' brick0 for data-selfheals is down.</div><div class='add'>+mv file1 file2</div><div class='add'>+mv dir1/dira dir2</div><div class='add'>+</div><div class='add'>+#Delete a dir when brick0 is down.</div><div class='add'>+rm -rf delete_me</div><div class='add'>+cd -</div><div class='add'>+</div><div class='add'>+#Bring everything up and trigger heal</div><div class='add'>+TEST $CLI volume set $V0 self-heal-daemon on</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status $V0 0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "Y" glustershd_up_status</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 1</div><div class='add'>+TEST $CLI volume heal $V0</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "^0$" get_pending_heal_count $V0</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "^0$" afr_anon_entry_count $B0/brick0</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "^0$" afr_anon_entry_count $B0/brick1</div><div class='add'>+</div><div class='add'>+#Remount to avoid reading from caches</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+TEST glusterfs --volfile-id=$V0 --volfile-server=$H0 $M0;</div><div class='add'>+EXPECT "line2" tail -1 $M0/file2</div><div class='add'>+EXPECT "line2" tail -1 $M0/dir2/dira/dirb/file1</div><div class='add'>+TEST ! stat $M0/delete_me/file1</div><div class='add'>+TEST ! stat $M0/delete_me</div><div class='add'>+</div><div class='add'>+anon_inode_name=$(ls -a $B0/brick0 | grep glusterfs-anonymous-inode)</div><div class='add'>+TEST [[ -d $B0/brick0/$anon_inode_name ]]</div><div class='add'>+TEST [[ -d $B0/brick1/$anon_inode_name ]]</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/basic/afr/replace-brick-self-heal.t b/tests/basic/afr/replace-brick-self-heal.t<br/>new file mode 100644<br/>index 00000000000..0360db71a2f<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/afr/replace-brick-self-heal.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/afr/replace-brick-self-heal.t</a></div><div class='hunk'>@@ -0,0 +1,64 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 replica 2 $H0:$B0/${V0}{0,1}</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+TEST $CLI volume set $V0 cluster.data-self-heal off</div><div class='add'>+TEST $CLI volume set $V0 cluster.metadata-self-heal off</div><div class='add'>+TEST $CLI volume set $V0 cluster.entry-self-heal off</div><div class='add'>+TEST $CLI volume set $V0 cluster.heal-timeout 5</div><div class='add'>+TEST $CLI volume set $V0 self-heal-daemon off</div><div class='add'>+TEST $GFS --volfile-id=$V0 --volfile-server=$H0 $M0;</div><div class='add'>+</div><div class='add'>+# Create files</div><div class='add'>+for i in {1..5}</div><div class='add'>+do</div><div class='add'>+        echo $i &gt; $M0/file$i.txt</div><div class='add'>+done</div><div class='add'>+</div><div class='add'>+# Metadata changes</div><div class='add'>+TEST setfattr -n user.test -v qwerty $M0/file5.txt</div><div class='add'>+</div><div class='add'>+# Replace brick1</div><div class='add'>+TEST $CLI volume replace-brick $V0 $H0:$B0/${V0}1 $H0:$B0/${V0}1_new commit force</div><div class='add'>+</div><div class='add'>+# Replaced-brick should accuse the non-replaced-brick (Simulating case for data-loss)</div><div class='add'>+TEST setfattr -n trusted.afr.$V0-client-0 -v 0x000000000000000000000001 $B0/${V0}1_new/</div><div class='add'>+</div><div class='add'>+# Check if pending xattr and dirty-xattr are set for replaced-brick</div><div class='add'>+EXPECT "000000000000000100000001" get_hex_xattr trusted.afr.$V0-client-1 $B0/${V0}0</div><div class='add'>+EXPECT "000000000000000000000001" get_hex_xattr trusted.afr.dirty $B0/${V0}1_new</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 1</div><div class='add'>+</div><div class='add'>+TEST $CLI volume set $V0 self-heal-daemon on</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "Y" glustershd_up_status</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 1</div><div class='add'>+TEST $CLI volume heal $V0</div><div class='add'>+</div><div class='add'>+# Wait for heal to complete</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "0" get_pending_heal_count $V0</div><div class='add'>+</div><div class='add'>+# Check if entry-heal has happened</div><div class='add'>+TEST diff &lt;(ls $B0/${V0}0 | sort) &lt;(ls $B0/${V0}1_new | sort)</div><div class='add'>+</div><div class='add'>+# To make sure that files were not lost from brick0</div><div class='add'>+TEST diff &lt;(ls $B0/${V0}0 | sort) &lt;(ls $B0/${V0}1 | sort)</div><div class='add'>+EXPECT "000000000000000000000000" get_hex_xattr trusted.afr.$V0-client-1 $B0/${V0}0</div><div class='add'>+</div><div class='add'>+# Test if data was healed</div><div class='add'>+TEST diff $B0/${V0}0/file1.txt $B0/${V0}1_new/file1.txt</div><div class='add'>+# To make sure that data was not lost from brick0</div><div class='add'>+TEST diff $B0/${V0}0/file1.txt $B0/${V0}1/file1.txt</div><div class='add'>+</div><div class='add'>+# Test if metadata was healed and exists on both the bricks</div><div class='add'>+EXPECT "qwerty" get_text_xattr user.test $B0/${V0}1_new/file5.txt</div><div class='add'>+EXPECT "qwerty" get_text_xattr user.test $B0/${V0}0/file5.txt</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/basic/afr/resolve.t b/tests/basic/afr/resolve.t<br/>new file mode 100644<br/>index 00000000000..a741eee6e5e<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/afr/resolve.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/afr/resolve.t</a></div><div class='hunk'>@@ -0,0 +1,55 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+#Check that operations succeed after changing the disk of the brick while</div><div class='add'>+#a brick is down</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 replica 2 $H0:$B0/${V0}{0,1}</div><div class='add'>+TEST $CLI volume set $V0 cluster.self-heal-daemon off</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+TEST $GFS --volfile-id=/$V0 --volfile-server=$H0 $M0;</div><div class='add'>+TEST $GFS --volfile-id=/$V0 --volfile-server=$H0 $M1;</div><div class='add'>+TEST cd $M0</div><div class='add'>+TEST mkdir -p a/b/c/d/e</div><div class='add'>+TEST cd a/b/c/d/e</div><div class='add'>+echo abc &gt; g</div><div class='add'>+</div><div class='add'>+#Simulate disk replacement</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}0</div><div class='add'>+rm -rf $B0/${V0}0/.glusterfs $B0/${V0}0/a</div><div class='add'>+</div><div class='add'>+#Ideally, disk replacement is done using reset-brick or replace-brick gluster CLI</div><div class='add'>+#which will create .glusterfs folder.</div><div class='add'>+mkdir $B0/${V0}0/.glusterfs &amp;&amp; chmod 600 $B0/${V0}0/.glusterfs</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_meta $M0 $V0-replicate-0 0</div><div class='add'>+#Test that the lookup returns ENOENT instead of ESTALE</div><div class='add'>+#If lookup returns ESTALE this command will fail with ESTALE</div><div class='add'>+TEST touch f</div><div class='add'>+</div><div class='add'>+#Test that ESTALE is ignored when there is a good copy</div><div class='add'>+EXPECT abc cat g</div><div class='add'>+</div><div class='add'>+#Simulate file changing only one mount</div><div class='add'>+#create the file on first mount</div><div class='add'>+echo ghi &gt; $M0/b</div><div class='add'>+</div><div class='add'>+#re-create the file on other mount while one of the bricks is down.</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}0</div><div class='add'>+TEST rm -f $M1/b</div><div class='add'>+echo jkl &gt; $M1/b</div><div class='add'>+#Clear the extended attributes on the directory to create a scenario where</div><div class='add'>+#gfid-mismatch happened. This should result in EIO</div><div class='add'>+TEST setfattr -x trusted.afr.$V0-client-0 $B0/${V0}1</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_meta $M0 $V0-replicate-0 0</div><div class='add'>+# The kernel knows nothing about the tricks done to the volume, and the file</div><div class='add'>+# may still be in page cache. Wait for timeout.</div><div class='add'>+EXPECT_WITHIN 10 "^$" cat $M0/b</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/basic/afr/root-squash-self-heal.t b/tests/basic/afr/root-squash-self-heal.t<br/>new file mode 100644<br/>index 00000000000..6e12098465a<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/afr/root-squash-self-heal.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/afr/root-squash-self-heal.t</a></div><div class='hunk'>@@ -0,0 +1,27 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 replica 2 $H0:$B0/${V0}{0,1}</div><div class='add'>+TEST $CLI volume set $V0 performance.stat-prefetch off</div><div class='add'>+TEST $CLI volume set $V0 self-heal-daemon off</div><div class='add'>+TEST $CLI volume set $V0 server.root-squash on</div><div class='add'>+TEST $CLI volume set $V0 cluster.data-self-heal on</div><div class='add'>+TEST $CLI volume set $V0 cluster.metadata-self-heal on</div><div class='add'>+TEST $CLI volume set $V0 cluster.entry-self-heal on</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+TEST $GFS --volfile-id=/$V0 --volfile-server=$H0 --no-root-squash=yes --use-readdirp=no $M0</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}0</div><div class='add'>+echo abc &gt; $M0/a</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 0</div><div class='add'>+find $M0 | xargs stat &gt; /dev/null</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "0" get_pending_heal_count $V0</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/basic/afr/self-heal.t b/tests/basic/afr/self-heal.t<br/>new file mode 100644<br/>index 00000000000..10fb152d046<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/afr/self-heal.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/afr/self-heal.t</a></div><div class='hunk'>@@ -0,0 +1,244 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+#Self-heal tests</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+#Init</div><div class='add'>+AREQUAL_PATH=$(dirname $0)/../../utils</div><div class='add'>+AREQUAL_BIN=$AREQUAL_PATH/arequal-checksum</div><div class='add'>+CFLAGS=""</div><div class='add'>+test "`uname -s`" != "Linux" &amp;&amp; {</div><div class='add'>+    CFLAGS="$CFLAGS -lintl";</div><div class='add'>+}</div><div class='add'>+build_tester $AREQUAL_PATH/arequal-checksum.c $CFLAGS</div><div class='add'>+TEST [ -e $AREQUAL_BIN ]</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 replica 2 $H0:$B0/brick{0,1}</div><div class='add'>+TEST $CLI volume set $V0 stat-prefetch off</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+TEST $CLI volume set $V0 cluster.background-self-heal-count 0</div><div class='add'>+TEST $GFS --volfile-id=$V0 --volfile-server=$H0 $M0;</div><div class='add'>+</div><div class='add'>+###############################################################################</div><div class='add'>+#1.Test successful data, metadata and entry self-heal</div><div class='add'>+</div><div class='add'>+#Test</div><div class='add'>+TEST mkdir -p $M0/abc/def $M0/abc/ghi</div><div class='add'>+TEST dd if=/dev/urandom of=$M0/abc/file_abc.txt bs=1024k count=2 2&gt;/dev/null</div><div class='add'>+TEST dd if=/dev/urandom of=$M0/abc/def/file_abc_def_1.txt bs=1024k count=2 2&gt;/dev/null</div><div class='add'>+TEST dd if=/dev/urandom of=$M0/abc/def/file_abc_def_2.txt bs=1024k count=3 2&gt;/dev/null</div><div class='add'>+TEST dd if=/dev/urandom of=$M0/abc/ghi/file_abc_ghi.txt bs=1024k count=4 2&gt;/dev/null</div><div class='add'>+</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/brick0</div><div class='add'>+TEST truncate -s 0 $M0/abc/def/file_abc_def_1.txt</div><div class='add'>+NEW_UID=36</div><div class='add'>+NEW_GID=36</div><div class='add'>+TEST chown  $NEW_UID:$NEW_GID $M0/abc/def/file_abc_def_2.txt</div><div class='add'>+TEST rm -rf $M0/abc/ghi</div><div class='add'>+TEST mkdir -p $M0/def/ghi $M0/jkl/mno</div><div class='add'>+TEST dd if=/dev/urandom of=$M0/def/ghi/file1.txt bs=1024k count=2 2&gt;/dev/null</div><div class='add'>+TEST dd if=/dev/urandom of=$M0/def/ghi/file2.txt bs=1024k count=3 2&gt;/dev/null</div><div class='add'>+TEST dd if=/dev/urandom of=$M0/jkl/mno/file.txt bs=1024k count=4 2&gt;/dev/null</div><div class='add'>+TEST chown  $NEW_UID:$NEW_GID $M0/def/ghi/file2.txt</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status $V0 0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "Y" glustershd_up_status</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 1</div><div class='add'>+TEST $CLI volume heal $V0</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "0" get_pending_heal_count $V0</div><div class='add'>+</div><div class='add'>+#check all files created/deleted on brick1 are also replicated on brick 0</div><div class='add'>+#(i.e. no reverse heal has happened)</div><div class='add'>+TEST ls $B0/brick0/def/ghi/file1.txt</div><div class='add'>+TEST ls $B0/brick0/def/ghi/file2.txt</div><div class='add'>+TEST ls $B0/brick0/jkl/mno/file.txt</div><div class='add'>+TEST ! ls $B0/brick0/abc/ghi</div><div class='add'>+EXPECT "$NEW_UID$NEW_GID" stat -c %u%g $B0/brick0/abc/def/file_abc_def_2.txt</div><div class='add'>+TEST diff &lt;($AREQUAL_BIN -p $B0/brick0 -i .glusterfs) &lt;($AREQUAL_BIN -p $B0/brick1 -i .glusterfs)</div><div class='add'>+</div><div class='add'>+#Cleanup</div><div class='add'>+TEST rm -rf $M0/*</div><div class='add'>+###############################################################################</div><div class='add'>+</div><div class='add'>+#2.Test successful self-heal of different file types.</div><div class='add'>+</div><div class='add'>+#Test</div><div class='add'>+TEST touch $M0/file</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/brick0</div><div class='add'>+TEST rm -f $M0/file</div><div class='add'>+TEST mkdir $M0/file</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status $V0 0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "Y" glustershd_up_status</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 1</div><div class='add'>+TEST $CLI volume heal $V0</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "0" get_pending_heal_count $V0</div><div class='add'>+</div><div class='add'>+#check heal has happened in the correct direction</div><div class='add'>+TEST test -d $B0/brick0/file</div><div class='add'>+TEST diff &lt;($AREQUAL_BIN -p $B0/brick0 -i .glusterfs) &lt;($AREQUAL_BIN -p $B0/brick1 -i .glusterfs)</div><div class='add'>+</div><div class='add'>+#Cleanup</div><div class='add'>+TEST rm -rf $M0/*</div><div class='add'>+###############################################################################</div><div class='add'>+</div><div class='add'>+#3.Test successful self-heal of file permissions.</div><div class='add'>+</div><div class='add'>+#Test</div><div class='add'>+TEST touch $M0/file</div><div class='add'>+TEST chmod 666 $M0/file</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/brick0</div><div class='add'>+TEST chmod 777 $M0/file</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status $V0 0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "Y" glustershd_up_status</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 1</div><div class='add'>+TEST $CLI volume heal $V0</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "0" get_pending_heal_count $V0</div><div class='add'>+</div><div class='add'>+#check heal has happened in the correct direction</div><div class='add'>+EXPECT "777" stat -c %a $B0/brick0/file</div><div class='add'>+TEST diff &lt;($AREQUAL_BIN -p $B0/brick0 -i .glusterfs) &lt;($AREQUAL_BIN -p $B0/brick1 -i .glusterfs)</div><div class='add'>+</div><div class='add'>+#Cleanup</div><div class='add'>+TEST rm -rf $M0/*</div><div class='add'>+###############################################################################</div><div class='add'>+</div><div class='add'>+#4.Test successful self-heal of file ownership</div><div class='add'>+</div><div class='add'>+#Test</div><div class='add'>+TEST touch $M0/file</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/brick0</div><div class='add'>+NEW_UID=36</div><div class='add'>+NEW_GID=36</div><div class='add'>+TEST chown $NEW_UID:$NEW_GID $M0/file</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status $V0 0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "Y" glustershd_up_status</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 1</div><div class='add'>+TEST $CLI volume heal $V0</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "0" get_pending_heal_count $V0</div><div class='add'>+</div><div class='add'>+#check heal has happened in the correct direction</div><div class='add'>+EXPECT "$NEW_UID$NEW_GID" stat -c %u%g $B0/brick0/file</div><div class='add'>+TEST diff &lt;($AREQUAL_BIN -p $B0/brick0 -i .glusterfs) &lt;($AREQUAL_BIN -p $B0/brick1 -i .glusterfs)</div><div class='add'>+</div><div class='add'>+#Cleanup</div><div class='add'>+TEST rm -rf $M0/*</div><div class='add'>+###############################################################################</div><div class='add'>+</div><div class='add'>+#5.File size test</div><div class='add'>+</div><div class='add'>+#Test</div><div class='add'>+TEST touch $M0/file</div><div class='add'>+TEST `echo "write1"&gt;$M0/file`</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/brick0</div><div class='add'>+TEST `echo "write2"&gt;&gt;$M0/file`</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status $V0 0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "Y" glustershd_up_status</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 1</div><div class='add'>+TEST $CLI volume heal $V0</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/brick1</div><div class='add'>+TEST truncate -s 0 $M0/file</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status $V0 1</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "Y" glustershd_up_status</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 1</div><div class='add'>+TEST $CLI volume heal $V0</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "0" get_pending_heal_count $V0</div><div class='add'>+</div><div class='add'>+#check heal has happened in the correct direction</div><div class='add'>+EXPECT 0 stat -c %s $B0/brick1/file</div><div class='add'>+TEST diff &lt;($AREQUAL_BIN -p $B0/brick0 -i .glusterfs) &lt;($AREQUAL_BIN -p $B0/brick1 -i .glusterfs)</div><div class='add'>+</div><div class='add'>+#Cleanup</div><div class='add'>+TEST rm -rf $M0/*</div><div class='add'>+###############################################################################</div><div class='add'>+</div><div class='add'>+#6.GFID heal</div><div class='add'>+</div><div class='add'>+#Test</div><div class='add'>+TEST touch $M0/file</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/brick0</div><div class='add'>+TEST rm -f $M0/file</div><div class='add'>+TEST touch $M0/file</div><div class='add'>+GFID=$(gf_get_gfid_xattr $B0/brick1/file)</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "Y" glustershd_up_status</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 1</div><div class='add'>+TEST $CLI volume heal $V0</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "0" get_pending_heal_count $V0</div><div class='add'>+</div><div class='add'>+#check heal has happened in the correct direction</div><div class='add'>+EXPECT "$GFID" gf_get_gfid_xattr $B0/brick0/file</div><div class='add'>+</div><div class='add'>+#Cleanup</div><div class='add'>+TEST rm -rf $M0/*</div><div class='add'>+###############################################################################</div><div class='add'>+</div><div class='add'>+#7. Link/symlink heal</div><div class='add'>+</div><div class='add'>+#Test</div><div class='add'>+TEST touch $M0/file</div><div class='add'>+TEST ln $M0/file $M0/link_to_file</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/brick0</div><div class='add'>+TEST rm -f $M0/link_to_file</div><div class='add'>+TEST ln -s $M0/file $M0/link_to_file</div><div class='add'>+TEST ln  $M0/file $M0/hard_link_to_file</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status $V0 0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "Y" glustershd_up_status</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 1</div><div class='add'>+TEST $CLI volume heal $V0</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "0" get_pending_heal_count $V0</div><div class='add'>+</div><div class='add'>+#check heal has happened in the correct direction</div><div class='add'>+TEST test -f $B0/brick0/hard_link_to_file</div><div class='add'>+TEST test -h $B0/brick0/link_to_file</div><div class='add'>+TEST diff &lt;($AREQUAL_BIN -p $B0/brick0 -i .glusterfs) &lt;($AREQUAL_BIN -p $B0/brick1 -i .glusterfs)</div><div class='add'>+</div><div class='add'>+#Cleanup</div><div class='add'>+TEST rm -rf $M0/*</div><div class='add'>+###############################################################################</div><div class='add'>+</div><div class='add'>+#8. Heal xattrs set by application</div><div class='add'>+</div><div class='add'>+#Test</div><div class='add'>+TEST touch $M0/file</div><div class='add'>+TEST setfattr -n user.myattr_1 -v My_attribute_1 $M0/file</div><div class='add'>+TEST setfattr -n user.myattr_2 -v "My_attribute_2" $M0/file</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/brick0</div><div class='add'>+TEST setfattr -n user.myattr_1 -v "My_attribute_1_modified" $M0/file</div><div class='add'>+TEST setfattr -n user.myattr_3 -v "My_attribute_3" $M0/file</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status $V0 0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "Y" glustershd_up_status</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 1</div><div class='add'>+TEST $CLI volume heal $V0</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "0" get_pending_heal_count $V0</div><div class='add'>+</div><div class='add'>+TEST diff &lt;(echo "user.myattr_1=\"My_attribute_1_modified\"") &lt;(getfattr -n user.myattr_1 $B0/brick1/file|grep user.myattr_1)</div><div class='add'>+TEST diff &lt;(echo "user.myattr_3=\"My_attribute_3\"") &lt;(getfattr -n user.myattr_3 $B0/brick1/file|grep user.myattr_3)</div><div class='add'>+</div><div class='add'>+#Cleanup</div><div class='add'>+TEST rm -rf $M0/*</div><div class='add'>+###############################################################################</div><div class='add'>+</div><div class='add'>+TEST rm -rf $AREQUAL_BIN</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/basic/afr/self-heald.t b/tests/basic/afr/self-heald.t<br/>new file mode 100644<br/>index 00000000000..24c82777921<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/afr/self-heald.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/afr/self-heald.t</a></div><div class='hunk'>@@ -0,0 +1,193 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+START_TIMESTAMP=`date +%s`</div><div class='add'>+</div><div class='add'>+function kill_multiple_bricks {</div><div class='add'>+        local vol=$1</div><div class='add'>+        local host=$2</div><div class='add'>+        local brickpath=$3</div><div class='add'>+</div><div class='add'>+        if [ $decide_kill == 0 ]</div><div class='add'>+        then</div><div class='add'>+                for ((i=0; i&lt;=4; i=i+2)) do</div><div class='add'>+                        TEST kill_brick $vol $host $brickpath/${vol}$i</div><div class='add'>+                done</div><div class='add'>+        else</div><div class='add'>+                for ((i=1; i&lt;=5; i=i+2)) do</div><div class='add'>+                        TEST kill_brick $vol $host $brickpath/${vol}$i</div><div class='add'>+                done</div><div class='add'>+        fi</div><div class='add'>+}</div><div class='add'>+function check_bricks_up {</div><div class='add'>+        local vol=$1</div><div class='add'>+        if [ $decide_kill == 0 ]</div><div class='add'>+        then</div><div class='add'>+                for ((i=0; i&lt;=4; i=i+2)) do</div><div class='add'>+                        EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status_in_shd $vol $i</div><div class='add'>+                done</div><div class='add'>+        else</div><div class='add'>+                for ((i=1; i&lt;=5; i=i+2)) do</div><div class='add'>+                        EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status_in_shd $vol $i</div><div class='add'>+                done</div><div class='add'>+        fi</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function disconnected_brick_count {</div><div class='add'>+        local vol=$1</div><div class='add'>+        $CLI volume heal $vol info | \</div><div class='add'>+            egrep -i '(transport|Socket is not connected)' | wc -l</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+TESTS_EXPECTED_IN_LOOP=20</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 replica 2 $H0:$B0/${V0}{0,1,2,3,4,5}</div><div class='add'>+TEST $CLI volume set $V0 cluster.background-self-heal-count 0</div><div class='add'>+TEST $CLI volume set $V0 cluster.eager-lock off</div><div class='add'>+TEST $CLI volume set $V0 performance.flush-behind off</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+TEST $GFS --volfile-id=/$V0 --volfile-server=$H0 $M0</div><div class='add'>+</div><div class='add'>+decide_kill=$((`date +"%j"|sed 's/^0*//'` % 2 ))</div><div class='add'>+</div><div class='add'>+kill_multiple_bricks $V0 $H0 $B0</div><div class='add'>+cd $M0</div><div class='add'>+HEAL_FILES=0</div><div class='add'>+for i in {1..10}</div><div class='add'>+do</div><div class='add'>+        dd if=/dev/urandom of=f bs=1024k count=10</div><div class='add'>+        HEAL_FILES=$(($HEAL_FILES+1)) #+1 for data/metadata self-heal of 'f'</div><div class='add'>+        mkdir a; cd a;</div><div class='add'>+        #+3 for metadata self-heal of 'a' one per subvolume of DHT</div><div class='add'>+        HEAL_FILES=$(($HEAL_FILES+3))</div><div class='add'>+done</div><div class='add'>+#+3 represents entry sh on "/", one per subvolume of DHT?</div><div class='add'>+HEAL_FILES=$(($HEAL_FILES + 3))</div><div class='add'>+</div><div class='add'>+cd ~</div><div class='add'>+EXPECT "$HEAL_FILES" get_pending_heal_count $V0</div><div class='add'>+</div><div class='add'>+#When bricks are down, it says Transport End point Not connected for them</div><div class='add'>+EXPECT "3" disconnected_brick_count $V0</div><div class='add'>+</div><div class='add'>+#Create some stale indices and verify that they are not counted in heal info</div><div class='add'>+#TO create stale index create and delete files when one brick is down in</div><div class='add'>+#replica pair.</div><div class='add'>+for i in {11..20}; do echo abc &gt; $M0/$i; done</div><div class='add'>+HEAL_FILES=$(($HEAL_FILES + 10)) #count extra 10 files</div><div class='add'>+EXPECT "$HEAL_FILES" get_pending_heal_count $V0</div><div class='add'>+#delete the files now, so that stale indices will remain.</div><div class='add'>+for i in {11..20}; do rm -f $M0/$i; done</div><div class='add'>+#After deleting files they should not appear in heal info</div><div class='add'>+HEAL_FILES=$(($HEAL_FILES - 10))</div><div class='add'>+EXPECT "$HEAL_FILES" get_pending_heal_count $V0</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+TEST ! $CLI volume heal $V0</div><div class='add'>+TEST $CLI volume set $V0 cluster.self-heal-daemon off</div><div class='add'>+TEST ! $CLI volume heal $V0</div><div class='add'>+TEST ! $CLI volume heal $V0 full</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+TEST $CLI volume set $V0 cluster.self-heal-daemon on</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "Y" glustershd_up_status</div><div class='add'>+</div><div class='add'>+check_bricks_up $V0</div><div class='add'>+</div><div class='add'>+TEST $CLI volume heal $V0</div><div class='add'>+sleep 5 #Until the heal-statistics command implementation</div><div class='add'>+#check that this heals the contents partially</div><div class='add'>+TEST [ $HEAL_FILES -gt $(get_pending_heal_count $V0) ]</div><div class='add'>+</div><div class='add'>+TEST $CLI volume heal $V0 full</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "^0$" get_pending_heal_count $V0</div><div class='add'>+</div><div class='add'>+#Test that ongoing IO is not considered as Pending heal</div><div class='add'>+(dd if=/dev/zero of=$M0/file1 bs=1k 2&gt;/dev/null 1&gt;/dev/null)&amp;</div><div class='add'>+back_pid1=$!;</div><div class='add'>+(dd if=/dev/zero of=$M0/file2 bs=1k 2&gt;/dev/null 1&gt;/dev/null)&amp;</div><div class='add'>+back_pid2=$!;</div><div class='add'>+(dd if=/dev/zero of=$M0/file3 bs=1k 2&gt;/dev/null 1&gt;/dev/null)&amp;</div><div class='add'>+back_pid3=$!;</div><div class='add'>+(dd if=/dev/zero of=$M0/file4 bs=1k 2&gt;/dev/null 1&gt;/dev/null)&amp;</div><div class='add'>+back_pid4=$!;</div><div class='add'>+(dd if=/dev/zero of=$M0/file5 bs=1k 2&gt;/dev/null 1&gt;/dev/null)&amp;</div><div class='add'>+back_pid5=$!;</div><div class='add'>+EXPECT 0 get_pending_heal_count $V0</div><div class='add'>+kill -SIGTERM $back_pid1;</div><div class='add'>+kill -SIGTERM $back_pid2;</div><div class='add'>+kill -SIGTERM $back_pid3;</div><div class='add'>+kill -SIGTERM $back_pid4;</div><div class='add'>+kill -SIGTERM $back_pid5;</div><div class='add'>+wait &gt;/dev/null 2&gt;&amp;1;</div><div class='add'>+</div><div class='add'>+#Test that volume heal info reports files even when self-heal</div><div class='add'>+#options are disabled</div><div class='add'>+TEST touch $M0/f</div><div class='add'>+TEST mkdir $M0/d</div><div class='add'>+#DATA</div><div class='add'>+TEST $CLI volume set $V0 cluster.data-self-heal off</div><div class='add'>+EXPECT "off" volume_option $V0 cluster.data-self-heal</div><div class='add'>+kill_multiple_bricks $V0 $H0 $B0</div><div class='add'>+echo abc &gt; $M0/f</div><div class='add'>+EXPECT 1 get_pending_heal_count $V0</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "Y" glustershd_up_status</div><div class='add'>+check_bricks_up $V0</div><div class='add'>+</div><div class='add'>+TEST $CLI volume heal $V0</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "^0$" get_pending_heal_count $V0</div><div class='add'>+TEST $CLI volume set $V0 cluster.data-self-heal on</div><div class='add'>+</div><div class='add'>+#METADATA</div><div class='add'>+TEST $CLI volume set $V0 cluster.metadata-self-heal off</div><div class='add'>+EXPECT "off" volume_option $V0 cluster.metadata-self-heal</div><div class='add'>+kill_multiple_bricks $V0 $H0 $B0</div><div class='add'>+</div><div class='add'>+TEST chmod 777 $M0/f</div><div class='add'>+EXPECT 1 get_pending_heal_count $V0</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "Y" glustershd_up_status</div><div class='add'>+check_bricks_up $V0</div><div class='add'>+</div><div class='add'>+TEST $CLI volume heal $V0</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "^0$" get_pending_heal_count $V0</div><div class='add'>+TEST $CLI volume set $V0 cluster.metadata-self-heal on</div><div class='add'>+</div><div class='add'>+#ENTRY</div><div class='add'>+TEST $CLI volume set $V0 cluster.entry-self-heal off</div><div class='add'>+EXPECT "off" volume_option $V0 cluster.entry-self-heal</div><div class='add'>+kill_multiple_bricks $V0 $H0 $B0</div><div class='add'>+TEST touch $M0/d/a</div><div class='add'>+# 4 if mtime/ctime is modified for d in bricks without a</div><div class='add'>+# 2 otherwise</div><div class='add'>+PENDING=$( get_pending_heal_count $V0 )</div><div class='add'>+TEST test $PENDING -eq 2 -o $PENDING -eq 4</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "Y" glustershd_up_status</div><div class='add'>+check_bricks_up $V0</div><div class='add'>+TEST $CLI volume heal $V0</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "^0$" get_pending_heal_count $V0</div><div class='add'>+TEST $CLI volume set $V0 cluster.entry-self-heal on</div><div class='add'>+</div><div class='add'>+#Negative test cases</div><div class='add'>+#Fail volume does not exist case</div><div class='add'>+TEST ! $CLI volume heal fail info</div><div class='add'>+</div><div class='add'>+#Fail volume stopped case</div><div class='add'>+TEST $CLI volume stop $V0</div><div class='add'>+TEST ! $CLI volume heal $V0 info</div><div class='add'>+</div><div class='add'>+#Fail non-replicate volume info</div><div class='add'>+TEST $CLI volume delete $V0</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/${V0}{6}</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+TEST ! $CLI volume heal $V0 info</div><div class='add'>+</div><div class='add'>+# Check for non Linux systems that we did not mess with directory offsets</div><div class='add'>+TEST ! log_newer $START_TIMESTAMP "offset reused from another DIR"</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/basic/afr/sparse-file-self-heal.t b/tests/basic/afr/sparse-file-self-heal.t<br/>new file mode 100644<br/>index 00000000000..04b77c41de1<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/afr/sparse-file-self-heal.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/afr/sparse-file-self-heal.t</a></div><div class='hunk'>@@ -0,0 +1,181 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+#This file checks if self-heal of files with holes is working properly or not</div><div class='add'>+#bigger is 2M, big is 1M, small is anything less</div><div class='add'>+#Also tests if non-sparse files with zeroes in it are healed correctly w.r.t</div><div class='add'>+#disk usage.</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 replica 2 $H0:$B0/${V0}{0,1}</div><div class='add'>+TEST $CLI volume set $V0 data-self-heal-algorithm full</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+TEST $GFS --volfile-id=/$V0 --volfile-server=$H0 $M0;</div><div class='add'>+TEST dd if=/dev/urandom of=$M0/small count=1 bs=1024k</div><div class='add'>+TEST dd if=/dev/urandom of=$M0/bigger2big count=1 bs=2048k</div><div class='add'>+TEST dd if=/dev/urandom of=$M0/big2bigger count=1 bs=1024k</div><div class='add'>+TEST truncate -s 1G $M0/FILE</div><div class='add'>+</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}0</div><div class='add'>+</div><div class='add'>+#File with &gt;128k size hole</div><div class='add'>+TEST truncate -s 1M $M0/big</div><div class='add'>+big_md5sum=$(md5sum $M0/big | awk '{print $1}')</div><div class='add'>+</div><div class='add'>+#File with &lt;128k hole</div><div class='add'>+TEST truncate -s 0 $M0/small</div><div class='add'>+TEST truncate -s 64k $M0/small</div><div class='add'>+small_md5sum=$(md5sum $M0/small | awk '{print $1}')</div><div class='add'>+</div><div class='add'>+#Bigger file truncated to big size hole.</div><div class='add'>+TEST truncate -s 0 $M0/bigger2big</div><div class='add'>+TEST truncate -s 1M $M0/bigger2big</div><div class='add'>+bigger2big_md5sum=$(md5sum $M0/bigger2big | awk '{print $1}')</div><div class='add'>+</div><div class='add'>+#Big file truncated to Bigger size hole</div><div class='add'>+TEST truncate -s 2M $M0/big2bigger</div><div class='add'>+big2bigger_md5sum=$(md5sum $M0/big2bigger | awk '{print $1}')</div><div class='add'>+</div><div class='add'>+#Write data to file and restore its sparseness</div><div class='add'>+TEST dd if=/dev/urandom of=$M0/FILE count=1 bs=131072</div><div class='add'>+TEST truncate -s 1G $M0/FILE</div><div class='add'>+</div><div class='add'>+#Create a non-sparse file containing zeroes.</div><div class='add'>+TEST dd if=/dev/zero of=$M0/zeroedfile bs=1024 count=1024</div><div class='add'>+</div><div class='add'>+$CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status $V0 0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "Y" glustershd_up_status</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 1</div><div class='add'>+TEST gluster volume heal $V0 full</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "0" get_pending_heal_count $V0</div><div class='add'>+</div><div class='add'>+#If the file system of bricks is XFS and speculative preallocation is on,</div><div class='add'>+#dropping cahce should be done to free speculatively pre-allocated blocks</div><div class='add'>+#by XFS.</div><div class='add'>+drop_cache $M0</div><div class='add'>+</div><div class='add'>+big_md5sum_0=$(md5sum $B0/${V0}0/big | awk '{print $1}')</div><div class='add'>+small_md5sum_0=$(md5sum $B0/${V0}0/small | awk '{print $1}')</div><div class='add'>+bigger2big_md5sum_0=$(md5sum $B0/${V0}0/bigger2big | awk '{print $1}')</div><div class='add'>+big2bigger_md5sum_0=$(md5sum $B0/${V0}0/big2bigger | awk '{print $1}')</div><div class='add'>+</div><div class='add'>+EXPECT $big_md5sum echo $big_md5sum_0</div><div class='add'>+EXPECT $small_md5sum echo $small_md5sum_0</div><div class='add'>+EXPECT $big2bigger_md5sum echo $big2bigger_md5sum_0</div><div class='add'>+EXPECT $bigger2big_md5sum echo $bigger2big_md5sum_0</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+EXPECT "1" has_holes $B0/${V0}0/big</div><div class='add'>+#Because self-heal writes the final chunk hole should not be there for</div><div class='add'>+#files &lt; 128K</div><div class='add'>+EXPECT "0" has_holes $B0/${V0}0/small</div><div class='add'>+# Since source is smaller than sink, self-heal does blind copy so no holes will</div><div class='add'>+# be present</div><div class='add'>+EXPECT "0" has_holes $B0/${V0}0/bigger2big</div><div class='add'>+EXPECT "1" has_holes $B0/${V0}0/big2bigger</div><div class='add'>+</div><div class='add'>+#Check that self-heal has not written 0s to sink and made it non-sparse.</div><div class='add'>+USED_KB=`du -s $B0/${V0}0/FILE|cut -f1`</div><div class='add'>+TEST [ $USED_KB -lt 1000000 ]</div><div class='add'>+</div><div class='add'>+#Check that the non-sparse file has the same file size on both bricks and that</div><div class='add'>+#the disk usage is greater than or equal to the file size. We could have checked</div><div class='add'>+#that the disk usage is just equal to the file size but XFS does speculative</div><div class='add'>+#preallocation due to which disk usage can be more than the file size.</div><div class='add'>+STAT_SIZE1=$(stat -c "%s" $B0/${V0}0/zeroedfile)</div><div class='add'>+STAT_SIZE2=$(stat -c "%s" $B0/${V0}1/zeroedfile)</div><div class='add'>+TEST [ $STAT_SIZE1 -eq $STAT_SIZE2 ]</div><div class='add'>+USED_KB1="$((`stat -c  %b $B0/${V0}0/zeroedfile` * `stat -c %B $B0/${V0}0/zeroedfile`))"</div><div class='add'>+TEST [ $USED_KB1 -ge $STAT_SIZE1 ]</div><div class='add'>+USED_KB2="$((`stat -c  %b $B0/${V0}1/zeroedfile` * `stat -c %B $B0/${V0}1/zeroedfile`))"</div><div class='add'>+TEST [ $USED_KB2 -ge $STAT_SIZE2 ]</div><div class='add'>+</div><div class='add'>+TEST rm -f $M0/*</div><div class='add'>+</div><div class='add'>+#check the same tests with diff self-heal</div><div class='add'>+TEST $CLI volume set $V0 data-self-heal-algorithm diff</div><div class='add'>+</div><div class='add'>+TEST dd if=/dev/urandom of=$M0/small count=1 bs=1024k</div><div class='add'>+TEST dd if=/dev/urandom of=$M0/big2bigger count=1 bs=1024k</div><div class='add'>+TEST dd if=/dev/urandom of=$M0/bigger2big count=1 bs=2048k</div><div class='add'>+TEST truncate -s 1G $M0/FILE</div><div class='add'>+</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}0</div><div class='add'>+</div><div class='add'>+#File with &gt;128k size hole</div><div class='add'>+TEST truncate -s 1M $M0/big</div><div class='add'>+big_md5sum=$(md5sum $M0/big | awk '{print $1}')</div><div class='add'>+</div><div class='add'>+#File with &lt;128k hole</div><div class='add'>+TEST truncate -s 0 $M0/small</div><div class='add'>+TEST truncate -s 64k $M0/small</div><div class='add'>+small_md5sum=$(md5sum $M0/small | awk '{print $1}')</div><div class='add'>+</div><div class='add'>+#Bigger file truncated to big size hole</div><div class='add'>+TEST truncate -s 0 $M0/bigger2big</div><div class='add'>+TEST truncate -s 1M $M0/bigger2big</div><div class='add'>+bigger2big_md5sum=$(md5sum $M0/bigger2big | awk '{print $1}')</div><div class='add'>+</div><div class='add'>+#Big file truncated to Bigger size hole</div><div class='add'>+TEST truncate -s 2M $M0/big2bigger</div><div class='add'>+big2bigger_md5sum=$(md5sum $M0/big2bigger | awk '{print $1}')</div><div class='add'>+</div><div class='add'>+#Write data to file and restore its sparseness</div><div class='add'>+TEST dd if=/dev/urandom of=$M0/FILE count=1 bs=131072</div><div class='add'>+TEST truncate -s 1G $M0/FILE</div><div class='add'>+</div><div class='add'>+#Create a non-sparse file containing zeroes.</div><div class='add'>+TEST dd if=/dev/zero of=$M0/zeroedfile bs=1024 count=1024</div><div class='add'>+</div><div class='add'>+$CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status $V0 0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "Y" glustershd_up_status</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 1</div><div class='add'>+TEST gluster volume heal $V0 full</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "0" get_pending_heal_count $V0</div><div class='add'>+</div><div class='add'>+#If the file system of bricks is XFS and speculative preallocation is on,</div><div class='add'>+#dropping cahce should be done to free speculatively pre-allocated blocks</div><div class='add'>+#by XFS.</div><div class='add'>+drop_cache $M0</div><div class='add'>+</div><div class='add'>+big_md5sum_0=$(md5sum $B0/${V0}0/big | awk '{print $1}')</div><div class='add'>+small_md5sum_0=$(md5sum $B0/${V0}0/small | awk '{print $1}')</div><div class='add'>+bigger2big_md5sum_0=$(md5sum $B0/${V0}0/bigger2big | awk '{print $1}')</div><div class='add'>+big2bigger_md5sum_0=$(md5sum $B0/${V0}0/big2bigger | awk '{print $1}')</div><div class='add'>+</div><div class='add'>+EXPECT $big_md5sum echo $big_md5sum_0</div><div class='add'>+EXPECT $small_md5sum echo $small_md5sum_0</div><div class='add'>+EXPECT $big2bigger_md5sum echo $big2bigger_md5sum_0</div><div class='add'>+EXPECT $bigger2big_md5sum echo $bigger2big_md5sum_0</div><div class='add'>+</div><div class='add'>+EXPECT "1" has_holes $B0/${V0}0/big</div><div class='add'>+EXPECT "1" has_holes $B0/${V0}0/big2bigger</div><div class='add'>+EXPECT "0" has_holes $B0/${V0}0/bigger2big</div><div class='add'>+EXPECT "0" has_holes $B0/${V0}0/small</div><div class='add'>+</div><div class='add'>+#Check that self-heal has not written 0s to sink and made it non-sparse.</div><div class='add'>+USED_KB=`du -s $B0/${V0}0/FILE|cut -f1`</div><div class='add'>+TEST [ $USED_KB -lt 1000000 ]</div><div class='add'>+</div><div class='add'>+#Check that the non-sparse file has the same file size on both bricks and that</div><div class='add'>+#the disk usage is greater than or equal to the file size. We could have checked</div><div class='add'>+#that the disk usage is just equal to the file size but XFS does speculative</div><div class='add'>+#preallocation due to which disk usage can be more than the file size.</div><div class='add'>+STAT_SIZE1=$(stat -c "%s" $B0/${V0}0/zeroedfile)</div><div class='add'>+STAT_SIZE2=$(stat -c "%s" $B0/${V0}1/zeroedfile)</div><div class='add'>+TEST [ $STAT_SIZE1 -eq $STAT_SIZE2 ]</div><div class='add'>+USED_KB1="$((`stat -c  %b $B0/${V0}0/zeroedfile` * `stat -c %B $B0/${V0}0/zeroedfile`))"</div><div class='add'>+TEST [ $USED_KB1 -ge $STAT_SIZE1 ]</div><div class='add'>+USED_KB2="$((`stat -c  %b $B0/${V0}1/zeroedfile` * `stat -c %B $B0/${V0}1/zeroedfile`))"</div><div class='add'>+TEST [ $USED_KB2 -ge $STAT_SIZE2 ]</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/basic/afr/split-brain-favorite-child-policy-client-side-healing.t b/tests/basic/afr/split-brain-favorite-child-policy-client-side-healing.t<br/>new file mode 100644<br/>index 00000000000..7c249c4bcbd<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/afr/split-brain-favorite-child-policy-client-side-healing.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/afr/split-brain-favorite-child-policy-client-side-healing.t</a></div><div class='hunk'>@@ -0,0 +1,124 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+#Test the client side split-brain resolution</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+GET_MDATA_PATH=$(dirname $0)/../../utils</div><div class='add'>+build_tester $GET_MDATA_PATH/get-mdata-xattr.c</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+</div><div class='add'>+count_files () {</div><div class='add'>+         ls $1 | wc -l</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#Create replica 2 volume</div><div class='add'>+TEST $CLI volume create $V0 replica 2 $H0:$B0/${V0}{0,1}</div><div class='add'>+TEST $CLI volume set $V0 performance.write-behind off</div><div class='add'>+TEST $CLI volume heal $V0 disable</div><div class='add'>+TEST $CLI volume set $V0 cluster.quorum-type fixed</div><div class='add'>+TEST $CLI volume set $V0 cluster.quorum-count 1</div><div class='add'>+TEST $CLI volume set $V0 cluster.metadata-self-heal on</div><div class='add'>+TEST $CLI volume set $V0 cluster.data-self-heal on</div><div class='add'>+TEST $CLI volume set $V0 cluster.entry-self-heal on</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+TEST $GFS --volfile-id=/$V0 --volfile-server=$H0 $M0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status $V0 0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status $V0 1</div><div class='add'>+</div><div class='add'>+TEST mkdir $M0/data</div><div class='add'>+TEST touch $M0/data/file</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+############ Client side healing using favorite-child-policy = mtime #################</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}0</div><div class='add'>+TEST dd if=/dev/urandom of=$M0/data/file bs=1024 count=1024</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status $V0 $H0 $B0/${V0}0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 0</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}1</div><div class='add'>+TEST dd if=/dev/urandom of=$M0/data/file bs=1024 count=1024</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status $V0 $H0 $B0/${V0}1</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 1</div><div class='add'>+</div><div class='add'>+mtime1=$(get_mtime $B0/${V0}0/data/file)</div><div class='add'>+mtime2=$(get_mtime $B0/${V0}1/data/file)</div><div class='add'>+if (( $(echo "$mtime1 &gt; $mtime2" | bc -l) )); then</div><div class='add'>+        LATEST_MTIME_MD5=$(md5sum $B0/${V0}0/data/file | cut -d\  -f1)</div><div class='add'>+else</div><div class='add'>+        LATEST_MTIME_MD5=$(md5sum $B0/${V0}1/data/file | cut -d\  -f1)</div><div class='add'>+fi</div><div class='add'>+</div><div class='add'>+#file will be in split-brain</div><div class='add'>+cat $M0/data/file &gt; /dev/null</div><div class='add'>+EXPECT "1" echo $?</div><div class='add'>+</div><div class='add'>+TEST $CLI volume set $V0 cluster.favorite-child-policy mtime</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "^2$" afr_get_split_brain_count $V0</div><div class='add'>+cat $M0/data/file &gt; /dev/null</div><div class='add'>+EXPECT "0" echo $?</div><div class='add'>+M0_MD5=$(md5sum $M0/data/file | cut -d\  -f1)</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "^0$" afr_get_split_brain_count $V0</div><div class='add'>+TEST [ "$LATEST_MTIME_MD5" == "$M0_MD5" ]</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "^0$" get_pending_heal_count $V0</div><div class='add'>+</div><div class='add'>+B0_MD5=$(md5sum $B0/${V0}0/data/file | cut -d\  -f1)</div><div class='add'>+B1_MD5=$(md5sum $B0/${V0}1/data/file | cut -d\  -f1)</div><div class='add'>+TEST [ "$LATEST_MTIME_MD5" == "$B0_MD5" ]</div><div class='add'>+TEST [ "$LATEST_MTIME_MD5" == "$B1_MD5" ]</div><div class='add'>+</div><div class='add'>+############ Client side directory conservative merge #################</div><div class='add'>+TEST $CLI volume reset $V0 cluster.favorite-child-policy</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}0</div><div class='add'>+TEST touch $M0/data/test</div><div class='add'>+files=$(count_files $M0/data)</div><div class='add'>+EXPECT "2" echo $files</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status $V0 $H0 $B0/${V0}0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 0</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}1</div><div class='add'>+TEST touch $M0/data/test1</div><div class='add'>+files=$(count_files $M0/data)</div><div class='add'>+EXPECT "2" echo $files</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status $V0 $H0 $B0/${V0}1</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 1</div><div class='add'>+</div><div class='add'>+#data dir will be in entry split-brain</div><div class='add'>+ls $M0/data &gt; /dev/null</div><div class='add'>+EXPECT "2" echo $?</div><div class='add'>+</div><div class='add'>+TEST $CLI volume set $V0 cluster.favorite-child-policy mtime</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "^2$" afr_get_split_brain_count $V0</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+ls $M0/data &gt; /dev/null</div><div class='add'>+EXPECT "0" echo $?</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "^0$" afr_get_split_brain_count $V0</div><div class='add'>+#Entry Split-brain is gone, but data self-heal is pending on the files</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "^2$" get_pending_heal_count $V0</div><div class='add'>+</div><div class='add'>+cat $M0/data/test &gt; /dev/null</div><div class='add'>+cat $M0/data/test1 &gt; /dev/null</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "^0$" get_pending_heal_count $V0</div><div class='add'>+files=$(count_files $M0/data)</div><div class='add'>+EXPECT "3" echo $files</div><div class='add'>+</div><div class='add'>+TEST force_umount $M0</div><div class='add'>+TEST rm $GET_MDATA_PATH/get-mdata-xattr</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/basic/afr/split-brain-heal-info.t b/tests/basic/afr/split-brain-heal-info.t<br/>new file mode 100644<br/>index 00000000000..2e4742fff08<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/afr/split-brain-heal-info.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/afr/split-brain-heal-info.t</a></div><div class='hunk'>@@ -0,0 +1,62 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+function volume_start_force()</div><div class='add'>+{</div><div class='add'>+        local vol=$1</div><div class='add'>+        TEST $CLI volume start $vol force</div><div class='add'>+        EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $vol 0</div><div class='add'>+        EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $vol 1</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+TESTS_EXPECTED_IN_LOOP=15</div><div class='add'>+SPB_FILES=0</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 replica 2 $H0:$B0/${V0}{0,1}</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+TEST $CLI volume set $V0 cluster.self-heal-daemon off</div><div class='add'>+TEST $GFS --volfile-id=/$V0 --volfile-server=$H0 $M0</div><div class='add'>+</div><div class='add'>+TEST mkdir $M0/dspb</div><div class='add'>+TEST mkdir $M0/mspb</div><div class='add'>+TEST mkdir $M0/espb</div><div class='add'>+TEST touch $M0/dspb/file</div><div class='add'>+</div><div class='add'>+#### Simlulate data-split-brain</div><div class='add'>+TEST kill_brick  $V0 $H0 $B0/${V0}0</div><div class='add'>+TEST `echo "abc" &gt; $M0/dspb/file`</div><div class='add'>+volume_start_force $V0</div><div class='add'>+TEST kill_brick  $V0 $H0 $B0/${V0}1</div><div class='add'>+TEST `echo "def" &gt; $M0/dspb/file`</div><div class='add'>+volume_start_force $V0</div><div class='add'>+SPB_FILES=$(($SPB_FILES + 1))</div><div class='add'>+</div><div class='add'>+### Simulate metadata-split-brain</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}0</div><div class='add'>+TEST chmod 757 $M0/mspb</div><div class='add'>+volume_start_force $V0</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}1</div><div class='add'>+TEST chmod 747 $M0/mspb</div><div class='add'>+volume_start_force $V0</div><div class='add'>+SPB_FILES=$(($SPB_FILES + 1))</div><div class='add'>+</div><div class='add'>+#### Simulate entry-split-brain</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}0</div><div class='add'>+EXPECT_WITHIN ${PROCESS_DOWN_TIMEOUT} "^0$" afr_child_up_status $V0 0</div><div class='add'>+TEST touch $M0/espb/a</div><div class='add'>+volume_start_force $V0</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}1</div><div class='add'>+EXPECT_WITHIN ${PROCESS_DOWN_TIMEOUT} "^0$" afr_child_up_status $V0 1</div><div class='add'>+TEST mkdir $M0/espb/a</div><div class='add'>+volume_start_force $V0</div><div class='add'>+SPB_FILES=$(($SPB_FILES + 1))</div><div class='add'>+</div><div class='add'>+#Multiply by 2, for each brick in replica pair</div><div class='add'>+SPB_FILES=$(($SPB_FILES * 2))</div><div class='add'>+EXPECT "$SPB_FILES" afr_get_split_brain_count $V0</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/basic/afr/split-brain-healing-ctime.t b/tests/basic/afr/split-brain-healing-ctime.t<br/>new file mode 100644<br/>index 00000000000..676788fce3f<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/afr/split-brain-healing-ctime.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/afr/split-brain-healing-ctime.t</a></div><div class='hunk'>@@ -0,0 +1,252 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+#Test the split-brain resolution CLI commands.</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+function get_replicate_subvol_number {</div><div class='add'>+        local filename=$1</div><div class='add'>+        #get_backend_paths</div><div class='add'>+        if [ -f $B0/${V0}1/$filename ]</div><div class='add'>+        then</div><div class='add'>+                echo 0</div><div class='add'>+        elif [ -f $B0/${V0}3/$filename ]</div><div class='add'>+        then    echo 1</div><div class='add'>+        else</div><div class='add'>+                echo -1</div><div class='add'>+        fi</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+AREQUAL_PATH=$(dirname $0)/../../utils</div><div class='add'>+GET_MDATA_PATH=$(dirname $0)/../../utils</div><div class='add'>+CFLAGS=""</div><div class='add'>+test "`uname -s`" != "Linux" &amp;&amp; {</div><div class='add'>+    CFLAGS="$CFLAGS -lintl";</div><div class='add'>+}</div><div class='add'>+build_tester $AREQUAL_PATH/arequal-checksum.c $CFLAGS</div><div class='add'>+build_tester $GET_MDATA_PATH/get-mdata-xattr.c</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 replica 2 $H0:$B0/${V0}{1,2,3,4}</div><div class='add'>+TEST $CLI volume set $V0 cluster.self-heal-daemon off</div><div class='add'>+TEST $CLI volume set $V0 cluster.data-self-heal off</div><div class='add'>+TEST $CLI volume set $V0 cluster.metadata-self-heal off</div><div class='add'>+TEST $CLI volume set $V0 cluster.entry-self-heal off</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+TEST $GFS --volfile-id=/$V0 --volfile-server=$H0 $M0</div><div class='add'>+</div><div class='add'>+cd $M0</div><div class='add'>+for i in {1..10}</div><div class='add'>+do</div><div class='add'>+        echo "Initial content"&gt;&gt;file$i</div><div class='add'>+done</div><div class='add'>+</div><div class='add'>+replica_0_files_list=(`ls $B0/${V0}1|grep -v '^\.'`)</div><div class='add'>+replica_1_files_list=(`ls $B0/${V0}3|grep -v '^\.'`)</div><div class='add'>+</div><div class='add'>+############ Create data split-brain in the files. ###########################</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}1</div><div class='add'>+for file in ${!replica_0_files_list[*]}</div><div class='add'>+do</div><div class='add'>+        echo "B1 is down"&gt;&gt;${replica_0_files_list[$file]}</div><div class='add'>+done</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}3</div><div class='add'>+for file in ${!replica_1_files_list[*]}</div><div class='add'>+do</div><div class='add'>+        echo "B3 is down"&gt;&gt;${replica_1_files_list[$file]}</div><div class='add'>+done</div><div class='add'>+</div><div class='add'>+SMALLER_FILE_SIZE=$(stat -c %s file1)</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 2</div><div class='add'>+</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}2</div><div class='add'>+for file in ${!replica_0_files_list[*]}</div><div class='add'>+do</div><div class='add'>+        echo "B2 is down"&gt;&gt;${replica_0_files_list[$file]}</div><div class='add'>+        echo "appending more content to make it the bigger file"&gt;&gt;${replica_0_files_list[$file]}</div><div class='add'>+done</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}4</div><div class='add'>+for file in ${!replica_1_files_list[*]}</div><div class='add'>+do</div><div class='add'>+        echo "B4 is down"&gt;&gt;${replica_1_files_list[$file]}</div><div class='add'>+        echo "appending more content to make it the bigger file"&gt;&gt;${replica_1_files_list[$file]}</div><div class='add'>+done</div><div class='add'>+</div><div class='add'>+BIGGER_FILE_SIZE=$(stat -c %s file1)</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 1</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 3</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+############### Acessing the files should now give EIO. ###############################</div><div class='add'>+TEST ! cat file1</div><div class='add'>+TEST ! cat file2</div><div class='add'>+TEST ! cat file3</div><div class='add'>+TEST ! cat file4</div><div class='add'>+TEST ! cat file5</div><div class='add'>+TEST ! cat file6</div><div class='add'>+TEST ! cat file7</div><div class='add'>+TEST ! cat file8</div><div class='add'>+TEST ! cat file9</div><div class='add'>+TEST ! cat file10</div><div class='add'>+###################</div><div class='add'>+TEST $CLI volume set $V0 cluster.self-heal-daemon on</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "Y" glustershd_up_status</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 1</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 2</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 3</div><div class='add'>+</div><div class='add'>+################ Heal file1 using the bigger-file option  ##############</div><div class='add'>+$CLI volume heal $V0 split-brain bigger-file /file1</div><div class='add'>+EXPECT "0" echo $?</div><div class='add'>+EXPECT $BIGGER_FILE_SIZE stat -c %s file1</div><div class='add'>+</div><div class='add'>+################ Heal file2 using the bigger-file option and its gfid ##############</div><div class='add'>+subvolume=$(get_replicate_subvol_number file2)</div><div class='add'>+if [ $subvolume == 0 ]</div><div class='add'>+then</div><div class='add'>+        GFID=$(gf_get_gfid_xattr $B0/${V0}1/file2)</div><div class='add'>+elif [ $subvolume == 1 ]</div><div class='add'>+then</div><div class='add'>+        GFID=$(gf_get_gfid_xattr $B0/${V0}3/file2)</div><div class='add'>+fi</div><div class='add'>+GFIDSTR="gfid:$(gf_gfid_xattr_to_str $GFID)"</div><div class='add'>+$CLI volume heal $V0 split-brain bigger-file $GFIDSTR</div><div class='add'>+EXPECT "0" echo $?</div><div class='add'>+</div><div class='add'>+################ Heal file3 using the source-brick option  ##############</div><div class='add'>+################ Use the brick having smaller file size as source #######</div><div class='add'>+subvolume=$(get_replicate_subvol_number file3)</div><div class='add'>+if [ $subvolume == 0 ]</div><div class='add'>+then</div><div class='add'>+        $CLI volume heal $V0 split-brain source-brick $H0:$B0/${V0}2 /file3</div><div class='add'>+elif [ $subvolume == 1 ]</div><div class='add'>+then</div><div class='add'>+        $CLI volume heal $V0 split-brain source-brick $H0:$B0/${V0}4 /file3</div><div class='add'>+fi</div><div class='add'>+EXPECT "0" echo $?</div><div class='add'>+EXPECT $SMALLER_FILE_SIZE stat -c %s file3</div><div class='add'>+</div><div class='add'>+################ Heal file4 using the source-brick option and it's gfid ##############</div><div class='add'>+################ Use the brick having smaller file size as source #######</div><div class='add'>+subvolume=$(get_replicate_subvol_number file4)</div><div class='add'>+if [ $subvolume == 0 ]</div><div class='add'>+then</div><div class='add'>+        GFID=$(gf_get_gfid_xattr $B0/${V0}1/file4)</div><div class='add'>+        GFIDSTR="gfid:$(gf_gfid_xattr_to_str $GFID)"</div><div class='add'>+        $CLI volume heal $V0 split-brain source-brick $H0:$B0/${V0}2 $GFIDSTR</div><div class='add'>+elif [ $subvolume == 1 ]</div><div class='add'>+then</div><div class='add'>+        GFID=$(gf_get_gfid_xattr $B0/${V0}3/file4)</div><div class='add'>+        GFIDSTR="gfid:$(gf_gfid_xattr_to_str $GFID)"</div><div class='add'>+        $CLI volume heal $V0 split-brain source-brick $H0:$B0/${V0}4 $GFIDSTR</div><div class='add'>+fi</div><div class='add'>+EXPECT "0" echo $?</div><div class='add'>+EXPECT $SMALLER_FILE_SIZE stat -c %s file4</div><div class='add'>+</div><div class='add'>+# With ctime enabled, the ctime xattr ("trusted.glusterfs.mdata") gets healed</div><div class='add'>+# as part of metadata heal. So mtime would be same, hence it can't be healed</div><div class='add'>+# using 'latest-mtime' policy, use 'source-brick' option instead.</div><div class='add'>+################ Heal file5 using the source-brick option  ##############</div><div class='add'>+subvolume=$(get_replicate_subvol_number file5)</div><div class='add'>+if [ $subvolume == 0 ]</div><div class='add'>+then</div><div class='add'>+        $CLI volume heal $V0 split-brain source-brick $H0:$B0/${V0}1 /file5</div><div class='add'>+elif [ $subvolume == 1 ]</div><div class='add'>+then</div><div class='add'>+        $CLI volume heal $V0 split-brain source-brick $H0:$B0/${V0}3 /file5</div><div class='add'>+fi</div><div class='add'>+EXPECT "0" echo $?</div><div class='add'>+</div><div class='add'>+if [ $subvolume == 0 ]</div><div class='add'>+then</div><div class='add'>+        mtime1_after_heal=$(get_mtime $B0/${V0}1/file5)</div><div class='add'>+        mtime2_after_heal=$(get_mtime $B0/${V0}2/file5)</div><div class='add'>+elif [ $subvolume == 1 ]</div><div class='add'>+then</div><div class='add'>+        mtime1_after_heal=$(get_mtime $B0/${V0}3/file5)</div><div class='add'>+        mtime2_after_heal=$(get_mtime $B0/${V0}4/file5)</div><div class='add'>+fi</div><div class='add'>+</div><div class='add'>+#TODO: To below comparisons on full sub-second resolution</div><div class='add'>+</div><div class='add'>+TEST [ $mtime1_after_heal -eq $mtime2_after_heal ]</div><div class='add'>+</div><div class='add'>+mtime_mount_after_heal=$(stat -c %Y file5)</div><div class='add'>+</div><div class='add'>+TEST [ $mtime1_after_heal -eq $mtime_mount_after_heal ]</div><div class='add'>+</div><div class='add'>+################ Heal file6 using the source-brick option and its gfid  ##############</div><div class='add'>+subvolume=$(get_replicate_subvol_number file6)</div><div class='add'>+if [ $subvolume == 0 ]</div><div class='add'>+then</div><div class='add'>+        GFID=$(gf_get_gfid_xattr $B0/${V0}1/file6)</div><div class='add'>+        GFIDSTR="gfid:$(gf_gfid_xattr_to_str $GFID)"</div><div class='add'>+        $CLI volume heal $V0 split-brain source-brick $H0:$B0/${V0}1 $GFIDSTR</div><div class='add'>+elif [ $subvolume == 1 ]</div><div class='add'>+then</div><div class='add'>+        GFID=$(gf_get_gfid_xattr $B0/${V0}3/file6)</div><div class='add'>+        GFIDSTR="gfid:$(gf_gfid_xattr_to_str $GFID)"</div><div class='add'>+        $CLI volume heal $V0 split-brain source-brick $H0:$B0/${V0}3 $GFIDSTR</div><div class='add'>+fi</div><div class='add'>+EXPECT "0" echo $?</div><div class='add'>+</div><div class='add'>+if [ $subvolume == 0 ]</div><div class='add'>+then</div><div class='add'>+        mtime1_after_heal=$(get_mtime $B0/${V0}1/file6)</div><div class='add'>+        mtime2_after_heal=$(get_mtime $B0/${V0}2/file6)</div><div class='add'>+elif [ $subvolume == 1 ]</div><div class='add'>+then</div><div class='add'>+        mtime1_after_heal=$(get_mtime $B0/${V0}3/file6)</div><div class='add'>+        mtime2_after_heal=$(get_mtime $B0/${V0}4/file6)</div><div class='add'>+fi</div><div class='add'>+</div><div class='add'>+#TODO: To below comparisons on full sub-second resolution</div><div class='add'>+</div><div class='add'>+TEST [ $mtime1_after_heal -eq $mtime2_after_heal ]</div><div class='add'>+</div><div class='add'>+mtime_mount_after_heal=$(stat -c %Y file6)</div><div class='add'>+</div><div class='add'>+TEST [ $mtime1_after_heal -eq $mtime_mount_after_heal ]</div><div class='add'>+</div><div class='add'>+################ Heal remaining SB'ed files of replica_0 using B1 as source ##############</div><div class='add'>+$CLI volume heal $V0 split-brain source-brick $H0:$B0/${V0}1</div><div class='add'>+EXPECT "0" echo $?</div><div class='add'>+</div><div class='add'>+################ Heal remaining SB'ed files of replica_1 using B3 as source ##############</div><div class='add'>+$CLI volume heal $V0 split-brain source-brick $H0:$B0/${V0}3</div><div class='add'>+EXPECT "0" echo $?</div><div class='add'>+</div><div class='add'>+############### Reading the files should now succeed. ###############################</div><div class='add'>+TEST  cat file1</div><div class='add'>+TEST  cat file2</div><div class='add'>+TEST  cat file3</div><div class='add'>+TEST  cat file4</div><div class='add'>+TEST  cat file5</div><div class='add'>+TEST  cat file6</div><div class='add'>+TEST  cat file7</div><div class='add'>+TEST  cat file8</div><div class='add'>+TEST  cat file9</div><div class='add'>+TEST  cat file10</div><div class='add'>+</div><div class='add'>+################ File contents on the bricks must be same. ################################</div><div class='add'>+TEST diff &lt;(arequal-checksum -p $B0/$V01 -i .glusterfs) &lt;(arequal-checksum -p $B0/$V02 -i .glusterfs)</div><div class='add'>+TEST diff &lt;(arequal-checksum -p $B0/$V03 -i .glusterfs) &lt;(arequal-checksum -p $B0/$V04 -i .glusterfs)</div><div class='add'>+</div><div class='add'>+############### Trying to heal files not in SB should fail. ###############################</div><div class='add'>+$CLI volume heal $V0 split-brain bigger-file /file1</div><div class='add'>+EXPECT "1" echo $?</div><div class='add'>+$CLI volume heal $V0 split-brain source-brick $H0:$B0/${V0}4 /file3</div><div class='add'>+EXPECT "1" echo $?</div><div class='add'>+</div><div class='add'>+cd -</div><div class='add'>+TEST rm $AREQUAL_PATH/arequal-checksum</div><div class='add'>+TEST rm $GET_MDATA_PATH/get-mdata-xattr</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/basic/afr/split-brain-healing.t b/tests/basic/afr/split-brain-healing.t<br/>new file mode 100644<br/>index 00000000000..315e815eb7e<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/afr/split-brain-healing.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/afr/split-brain-healing.t</a></div><div class='hunk'>@@ -0,0 +1,261 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+#Test the split-brain resolution CLI commands.</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+function get_replicate_subvol_number {</div><div class='add'>+        local filename=$1</div><div class='add'>+        #get_backend_paths</div><div class='add'>+        if [ -f $B0/${V0}1/$filename ]</div><div class='add'>+        then</div><div class='add'>+                echo 0</div><div class='add'>+        elif [ -f $B0/${V0}3/$filename ]</div><div class='add'>+        then    echo 1</div><div class='add'>+        else</div><div class='add'>+                echo -1</div><div class='add'>+        fi</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+AREQUAL_PATH=$(dirname $0)/../../utils</div><div class='add'>+GET_MDATA_PATH=$(dirname $0)/../../utils</div><div class='add'>+CFLAGS=""</div><div class='add'>+test "`uname -s`" != "Linux" &amp;&amp; {</div><div class='add'>+    CFLAGS="$CFLAGS -lintl";</div><div class='add'>+}</div><div class='add'>+build_tester $AREQUAL_PATH/arequal-checksum.c $CFLAGS</div><div class='add'>+build_tester $GET_MDATA_PATH/get-mdata-xattr.c</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 replica 2 $H0:$B0/${V0}{1,2,3,4}</div><div class='add'>+TEST $CLI volume set $V0 cluster.self-heal-daemon off</div><div class='add'>+TEST $CLI volume set $V0 cluster.data-self-heal off</div><div class='add'>+TEST $CLI volume set $V0 cluster.metadata-self-heal off</div><div class='add'>+TEST $CLI volume set $V0 cluster.entry-self-heal off</div><div class='add'>+TEST $CLI volume set $V0 ctime off</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+TEST $GFS --volfile-id=/$V0 --volfile-server=$H0 $M0</div><div class='add'>+</div><div class='add'>+cd $M0</div><div class='add'>+for i in {1..10}</div><div class='add'>+do</div><div class='add'>+        echo "Initial content"&gt;&gt;file$i</div><div class='add'>+done</div><div class='add'>+</div><div class='add'>+replica_0_files_list=(`ls $B0/${V0}1|grep -v '^\.'`)</div><div class='add'>+replica_1_files_list=(`ls $B0/${V0}3|grep -v '^\.'`)</div><div class='add'>+</div><div class='add'>+############ Create data split-brain in the files. ###########################</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}1</div><div class='add'>+for file in ${!replica_0_files_list[*]}</div><div class='add'>+do</div><div class='add'>+        echo "B1 is down"&gt;&gt;${replica_0_files_list[$file]}</div><div class='add'>+done</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}3</div><div class='add'>+for file in ${!replica_1_files_list[*]}</div><div class='add'>+do</div><div class='add'>+        echo "B3 is down"&gt;&gt;${replica_1_files_list[$file]}</div><div class='add'>+done</div><div class='add'>+</div><div class='add'>+SMALLER_FILE_SIZE=$(stat -c %s file1)</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 2</div><div class='add'>+</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}2</div><div class='add'>+for file in ${!replica_0_files_list[*]}</div><div class='add'>+do</div><div class='add'>+        echo "B2 is down"&gt;&gt;${replica_0_files_list[$file]}</div><div class='add'>+        echo "appending more content to make it the bigger file"&gt;&gt;${replica_0_files_list[$file]}</div><div class='add'>+done</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}4</div><div class='add'>+for file in ${!replica_1_files_list[*]}</div><div class='add'>+do</div><div class='add'>+        echo "B4 is down"&gt;&gt;${replica_1_files_list[$file]}</div><div class='add'>+        echo "appending more content to make it the bigger file"&gt;&gt;${replica_1_files_list[$file]}</div><div class='add'>+done</div><div class='add'>+</div><div class='add'>+BIGGER_FILE_SIZE=$(stat -c %s file1)</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 1</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 3</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+############### Acessing the files should now give EIO. ###############################</div><div class='add'>+TEST ! cat file1</div><div class='add'>+TEST ! cat file2</div><div class='add'>+TEST ! cat file3</div><div class='add'>+TEST ! cat file4</div><div class='add'>+TEST ! cat file5</div><div class='add'>+TEST ! cat file6</div><div class='add'>+TEST ! cat file7</div><div class='add'>+TEST ! cat file8</div><div class='add'>+TEST ! cat file9</div><div class='add'>+TEST ! cat file10</div><div class='add'>+###################</div><div class='add'>+TEST $CLI volume set $V0 cluster.self-heal-daemon on</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "Y" glustershd_up_status</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 1</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 2</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 3</div><div class='add'>+</div><div class='add'>+################ Heal file1 using the bigger-file option  ##############</div><div class='add'>+$CLI volume heal $V0 split-brain bigger-file /file1</div><div class='add'>+EXPECT "0" echo $?</div><div class='add'>+EXPECT $BIGGER_FILE_SIZE stat -c %s file1</div><div class='add'>+</div><div class='add'>+################ Heal file2 using the bigger-file option and its gfid ##############</div><div class='add'>+subvolume=$(get_replicate_subvol_number file2)</div><div class='add'>+if [ $subvolume == 0 ]</div><div class='add'>+then</div><div class='add'>+        GFID=$(gf_get_gfid_xattr $B0/${V0}1/file2)</div><div class='add'>+elif [ $subvolume == 1 ]</div><div class='add'>+then</div><div class='add'>+        GFID=$(gf_get_gfid_xattr $B0/${V0}3/file2)</div><div class='add'>+fi</div><div class='add'>+GFIDSTR="gfid:$(gf_gfid_xattr_to_str $GFID)"</div><div class='add'>+$CLI volume heal $V0 split-brain bigger-file $GFIDSTR</div><div class='add'>+EXPECT "0" echo $?</div><div class='add'>+</div><div class='add'>+################ Heal file3 using the source-brick option  ##############</div><div class='add'>+################ Use the brick having smaller file size as source #######</div><div class='add'>+subvolume=$(get_replicate_subvol_number file3)</div><div class='add'>+if [ $subvolume == 0 ]</div><div class='add'>+then</div><div class='add'>+        $CLI volume heal $V0 split-brain source-brick $H0:$B0/${V0}2 /file3</div><div class='add'>+elif [ $subvolume == 1 ]</div><div class='add'>+then</div><div class='add'>+        $CLI volume heal $V0 split-brain source-brick $H0:$B0/${V0}4 /file3</div><div class='add'>+fi</div><div class='add'>+EXPECT "0" echo $?</div><div class='add'>+EXPECT $SMALLER_FILE_SIZE stat -c %s file3</div><div class='add'>+</div><div class='add'>+################ Heal file4 using the source-brick option and it's gfid ##############</div><div class='add'>+################ Use the brick having smaller file size as source #######</div><div class='add'>+subvolume=$(get_replicate_subvol_number file4)</div><div class='add'>+if [ $subvolume == 0 ]</div><div class='add'>+then</div><div class='add'>+        GFID=$(gf_get_gfid_xattr $B0/${V0}1/file4)</div><div class='add'>+        GFIDSTR="gfid:$(gf_gfid_xattr_to_str $GFID)"</div><div class='add'>+        $CLI volume heal $V0 split-brain source-brick $H0:$B0/${V0}2 $GFIDSTR</div><div class='add'>+elif [ $subvolume == 1 ]</div><div class='add'>+then</div><div class='add'>+        GFID=$(gf_get_gfid_xattr $B0/${V0}3/file4)</div><div class='add'>+        GFIDSTR="gfid:$(gf_gfid_xattr_to_str $GFID)"</div><div class='add'>+        $CLI volume heal $V0 split-brain source-brick $H0:$B0/${V0}4 $GFIDSTR</div><div class='add'>+fi</div><div class='add'>+EXPECT "0" echo $?</div><div class='add'>+EXPECT $SMALLER_FILE_SIZE stat -c %s file4</div><div class='add'>+</div><div class='add'>+################ Heal file5 using the latest-mtime option  ##############</div><div class='add'>+subvolume=$(get_replicate_subvol_number file5)</div><div class='add'>+if [ $subvolume == 0 ]</div><div class='add'>+then</div><div class='add'>+        mtime1=$(get_mtime $B0/${V0}1/file5)</div><div class='add'>+        mtime2=$(get_mtime $B0/${V0}2/file5)</div><div class='add'>+        LATEST_MTIME=$(($mtime1 &gt; $mtime2 ? $mtime1:$mtime2))</div><div class='add'>+elif [ $subvolume == 1 ]</div><div class='add'>+then</div><div class='add'>+        mtime1=$(get_mtime $B0/${V0}3/file5)</div><div class='add'>+        mtime2=$(get_mtime $B0/${V0}4/file5)</div><div class='add'>+        LATEST_MTIME=$(($mtime1 &gt; $mtime2 ? $mtime1:$mtime2))</div><div class='add'>+fi</div><div class='add'>+$CLI volume heal $V0 split-brain latest-mtime /file5</div><div class='add'>+EXPECT "0" echo $?</div><div class='add'>+</div><div class='add'>+if [ $subvolume == 0 ]</div><div class='add'>+then</div><div class='add'>+        mtime1_after_heal=$(get_mtime $B0/${V0}1/file5)</div><div class='add'>+        mtime2_after_heal=$(get_mtime $B0/${V0}2/file5)</div><div class='add'>+elif [ $subvolume == 1 ]</div><div class='add'>+then</div><div class='add'>+        mtime1_after_heal=$(get_mtime $B0/${V0}3/file5)</div><div class='add'>+        mtime2_after_heal=$(get_mtime $B0/${V0}4/file5)</div><div class='add'>+fi</div><div class='add'>+</div><div class='add'>+#TODO: To below comparisons on full sub-second resolution</div><div class='add'>+</div><div class='add'>+TEST [ $LATEST_MTIME -eq $mtime1_after_heal ]</div><div class='add'>+TEST [ $LATEST_MTIME -eq $mtime2_after_heal ]</div><div class='add'>+</div><div class='add'>+mtime_mount_after_heal=$(stat -c %Y file5)</div><div class='add'>+</div><div class='add'>+TEST [ $LATEST_MTIME -eq $mtime_mount_after_heal ]</div><div class='add'>+</div><div class='add'>+################ Heal file6 using the latest-mtime option and its gfid  ##############</div><div class='add'>+subvolume=$(get_replicate_subvol_number file6)</div><div class='add'>+if [ $subvolume == 0 ]</div><div class='add'>+then</div><div class='add'>+        GFID=$(gf_get_gfid_xattr $B0/${V0}1/file6)</div><div class='add'>+        mtime1=$(get_mtime $B0/${V0}1/file6)</div><div class='add'>+        mtime2=$(get_mtime $B0/${V0}2/file6)</div><div class='add'>+        LATEST_MTIME=$(($mtime1 &gt; $mtime2 ? $mtime1:$mtime2))</div><div class='add'>+elif [ $subvolume == 1 ]</div><div class='add'>+then</div><div class='add'>+        GFID=$(gf_get_gfid_xattr $B0/${V0}3/file6)</div><div class='add'>+        mtime1=$(get_mtime $B0/${V0}3/file6)</div><div class='add'>+        mtime2=$(get_mtime $B0/${V0}4/file6)</div><div class='add'>+        LATEST_MTIME=$(($mtime1 &gt; $mtime2 ? $mtime1:$mtime2))</div><div class='add'>+fi</div><div class='add'>+GFIDSTR="gfid:$(gf_gfid_xattr_to_str $GFID)"</div><div class='add'>+$CLI volume heal $V0 split-brain latest-mtime $GFIDSTR</div><div class='add'>+EXPECT "0" echo $?</div><div class='add'>+</div><div class='add'>+if [ $subvolume == 0 ]</div><div class='add'>+then</div><div class='add'>+        mtime1_after_heal=$(get_mtime $B0/${V0}1/file6)</div><div class='add'>+        mtime2_after_heal=$(get_mtime $B0/${V0}2/file6)</div><div class='add'>+elif [ $subvolume == 1 ]</div><div class='add'>+then</div><div class='add'>+        mtime1_after_heal=$(get_mtime $B0/${V0}3/file6)</div><div class='add'>+        mtime2_after_heal=$(get_mtime $B0/${V0}4/file6)</div><div class='add'>+fi</div><div class='add'>+</div><div class='add'>+#TODO: To below comparisons on full sub-second resolution</div><div class='add'>+</div><div class='add'>+TEST [ $LATEST_MTIME -eq $mtime1_after_heal ]</div><div class='add'>+TEST [ $LATEST_MTIME -eq $mtime2_after_heal ]</div><div class='add'>+</div><div class='add'>+mtime_mount_after_heal=$(stat -c %Y file6)</div><div class='add'>+</div><div class='add'>+TEST [ $LATEST_MTIME -eq $mtime_mount_after_heal ]</div><div class='add'>+</div><div class='add'>+################ Heal remaining SB'ed files of replica_0 using B1 as source ##############</div><div class='add'>+$CLI volume heal $V0 split-brain source-brick $H0:$B0/${V0}1</div><div class='add'>+EXPECT "0" echo $?</div><div class='add'>+</div><div class='add'>+################ Heal remaining SB'ed files of replica_1 using B3 as source ##############</div><div class='add'>+$CLI volume heal $V0 split-brain source-brick $H0:$B0/${V0}3</div><div class='add'>+EXPECT "0" echo $?</div><div class='add'>+</div><div class='add'>+############### Reading the files should now succeed. ###############################</div><div class='add'>+TEST  cat file1</div><div class='add'>+TEST  cat file2</div><div class='add'>+TEST  cat file3</div><div class='add'>+TEST  cat file4</div><div class='add'>+TEST  cat file5</div><div class='add'>+TEST  cat file6</div><div class='add'>+TEST  cat file7</div><div class='add'>+TEST  cat file8</div><div class='add'>+TEST  cat file9</div><div class='add'>+TEST  cat file10</div><div class='add'>+</div><div class='add'>+################ File contents on the bricks must be same. ################################</div><div class='add'>+TEST diff &lt;(arequal-checksum -p $B0/$V01 -i .glusterfs) &lt;(arequal-checksum -p $B0/$V02 -i .glusterfs)</div><div class='add'>+TEST diff &lt;(arequal-checksum -p $B0/$V03 -i .glusterfs) &lt;(arequal-checksum -p $B0/$V04 -i .glusterfs)</div><div class='add'>+</div><div class='add'>+############### Trying to heal files not in SB should fail. ###############################</div><div class='add'>+$CLI volume heal $V0 split-brain bigger-file /file1</div><div class='add'>+EXPECT "1" echo $?</div><div class='add'>+$CLI volume heal $V0 split-brain source-brick $H0:$B0/${V0}4 /file3</div><div class='add'>+EXPECT "1" echo $?</div><div class='add'>+</div><div class='add'>+cd -</div><div class='add'>+TEST rm $AREQUAL_PATH/arequal-checksum</div><div class='add'>+TEST rm $GET_MDATA_PATH/get-mdata-xattr</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/basic/afr/split-brain-open.t b/tests/basic/afr/split-brain-open.t<br/>new file mode 100644<br/>index 00000000000..9b2f2856047<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/afr/split-brain-open.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/afr/split-brain-open.t</a></div><div class='hunk'>@@ -0,0 +1,38 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 replica 2 $H0:$B0/${V0}{0,1}</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+#Disable self-heal-daemon</div><div class='add'>+TEST $CLI volume heal $V0 disable</div><div class='add'>+</div><div class='add'>+TEST glusterfs --volfile-id=$V0 --volfile-server=$H0 --entry-timeout=0 $M0;</div><div class='add'>+</div><div class='add'>+TEST touch $M0/data-split-brain.txt</div><div class='add'>+</div><div class='add'>+#Create data split-brain</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}0</div><div class='add'>+</div><div class='add'>+`echo "brick1_alive" &gt; $M0/data-split-brain.txt`</div><div class='add'>+TEST [ $? == 0 ];</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}1</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 0</div><div class='add'>+</div><div class='add'>+`echo "brick0_alive" &gt; $M0/data-split-brain.txt`</div><div class='add'>+TEST [ $? == 0 ];</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 1</div><div class='add'>+</div><div class='add'>+echo "all-alive" &gt;&gt; $M0/data-split-brain.txt</div><div class='add'>+TEST [ $? != 0 ];</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/basic/afr/split-brain-resolution.t b/tests/basic/afr/split-brain-resolution.t<br/>new file mode 100644<br/>index 00000000000..834237c96ec<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/afr/split-brain-resolution.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/afr/split-brain-resolution.t</a></div><div class='hunk'>@@ -0,0 +1,105 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+function get_split_brain_status {</div><div class='add'>+        local path=$1</div><div class='add'>+        echo `getfattr -n replica.split-brain-status $path` | cut -f2 -d"=" | sed -e 's/^"//'  -e 's/"$//'</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 replica 2 $H0:$B0/${V0}{0,1}</div><div class='add'>+TEST $CLI volume set $V0 cluster.data-self-heal on</div><div class='add'>+TEST $CLI volume set $V0 cluster.metadata-self-heal on</div><div class='add'>+TEST $CLI volume set $V0 cluster.entry-self-heal on</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+#Disable self-heal-daemon</div><div class='add'>+TEST $CLI volume set $V0 cluster.self-heal-daemon off</div><div class='add'>+</div><div class='add'>+TEST $GFS --volfile-id=$V0 --volfile-server=$H0 $M0;</div><div class='add'>+</div><div class='add'>+TEST `echo "some-data" &gt; $M0/data-split-brain.txt`</div><div class='add'>+TEST `echo "some-data" &gt; $M0/metadata-split-brain.txt`</div><div class='add'>+</div><div class='add'>+#Create data and metadata split-brain</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}0</div><div class='add'>+</div><div class='add'>+TEST `echo "brick1_alive" &gt; $M0/data-split-brain.txt`</div><div class='add'>+TEST setfattr -n user.test -v brick1 $M0/metadata-split-brain.txt</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}1</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 0</div><div class='add'>+</div><div class='add'>+TEST `echo "brick0_alive" &gt; $M0/data-split-brain.txt`</div><div class='add'>+TEST setfattr -n user.test -v brick0 $M0/metadata-split-brain.txt</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 1</div><div class='add'>+</div><div class='add'>+EXPECT 4 get_pending_heal_count $V0</div><div class='add'>+</div><div class='add'>+TEST ! cat $M0/data-split-brain.txt</div><div class='add'>+TEST ! getfattr -n user.test $M0/metadata-split-brain.txt</div><div class='add'>+</div><div class='add'>+#Inspect file in data-split-brain</div><div class='add'>+EXPECT "data-split-brain:yes metadata-split-brain:no Choices:patchy-client-0,patchy-client-1" get_split_brain_status $M0/data-split-brain.txt</div><div class='add'>+TEST setfattr -n replica.split-brain-choice -v $V0-client-0 $M0/data-split-brain.txt</div><div class='add'>+</div><div class='add'>+#Should now be able to read the contents of data-split-brain.txt</div><div class='add'>+EXPECT "brick0_alive" cat $M0/data-split-brain.txt</div><div class='add'>+</div><div class='add'>+TEST setfattr -n replica.split-brain-choice-timeout -v 10 $M0/</div><div class='add'>+TEST setfattr -n replica.split-brain-choice -v $V0-client-1 $M0/data-split-brain.txt</div><div class='add'>+</div><div class='add'>+#Should now be able to read the contents of data-split-brain.txt</div><div class='add'>+EXPECT "brick1_alive" cat $M0/data-split-brain.txt</div><div class='add'>+</div><div class='add'>+#Inspect the file in metadata-split-brain</div><div class='add'>+EXPECT "data-split-brain:no metadata-split-brain:yes Choices:patchy-client-0,patchy-client-1" get_split_brain_status $M0/metadata-split-brain.txt</div><div class='add'>+TEST setfattr -n replica.split-brain-choice -v $V0-client-0 $M0/metadata-split-brain.txt</div><div class='add'>+</div><div class='add'>+EXPECT "brick0" get_text_xattr user.test $M0/metadata-split-brain.txt</div><div class='add'>+</div><div class='add'>+TEST setfattr -n replica.split-brain-choice -v $V0-client-1 $M0/metadata-split-brain.txt</div><div class='add'>+EXPECT "brick1" get_text_xattr user.test $M0/metadata-split-brain.txt</div><div class='add'>+</div><div class='add'>+#Check that setting split-brain-choice to "none" results in EIO again</div><div class='add'>+TEST setfattr -n replica.split-brain-choice -v none $M0/metadata-split-brain.txt</div><div class='add'>+TEST setfattr -n replica.split-brain-choice -v none $M0/data-split-brain.txt</div><div class='add'>+TEST ! getfattr -n user.test $M0/metadata-split-brain.txt</div><div class='add'>+TEST ! cat $M0/data-split-brain.txt</div><div class='add'>+</div><div class='add'>+#Check that after timeout fops result in EIO again.</div><div class='add'>+#Set one minute timeout</div><div class='add'>+TEST setfattr -n replica.split-brain-choice-timeout -v 1 $M0/</div><div class='add'>+TEST setfattr -n replica.split-brain-choice -v $V0-client-1 $M0/data-split-brain.txt</div><div class='add'>+EXPECT "brick1_alive" cat $M0/data-split-brain.txt</div><div class='add'>+TEST setfattr -n replica.split-brain-choice -v $V0-client-0 $M0/metadata-split-brain.txt</div><div class='add'>+EXPECT "brick0" get_text_xattr user.test $M0/metadata-split-brain.txt</div><div class='add'>+#Wait until timeout completes and test that the fops fail again</div><div class='add'>+sleep 62</div><div class='add'>+TEST ! getfattr -n user.test $M0/metadata-split-brain.txt</div><div class='add'>+TEST ! cat $M0/data-split-brain.txt</div><div class='add'>+</div><div class='add'>+#Negative test cases should fail</div><div class='add'>+TEST ! setfattr -n replica.split-brain-choice -v $V0-client-4 $M0/data-split-brain.txt</div><div class='add'>+TEST ! setfattr -n replica.split-brain-heal-finalize -v $V0-client-4 $M0/metadata-split-brain.txt</div><div class='add'>+</div><div class='add'>+#Heal the files</div><div class='add'>+TEST setfattr -n replica.split-brain-heal-finalize -v $V0-client-0 $M0/metadata-split-brain.txt</div><div class='add'>+TEST setfattr -n replica.split-brain-heal-finalize -v $V0-client-1 $M0/data-split-brain.txt</div><div class='add'>+</div><div class='add'>+EXPECT "brick0" get_text_xattr user.test $M0/metadata-split-brain.txt</div><div class='add'>+EXPECT "brick1_alive" cat $M0/data-split-brain.txt</div><div class='add'>+</div><div class='add'>+EXPECT 0 get_pending_heal_count $V0</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+#G_TESTDEF_TEST_STATUS_NETBSD7=BAD_TEST,BUG=000000</div><div class='add'>+#G_TESTDEF_TEST_STATUS_CENTOS6=BAD_TEST,BUG=000000</div><div class='head'>diff --git a/tests/basic/afr/stale-file-lookup.t b/tests/basic/afr/stale-file-lookup.t<br/>new file mode 100644<br/>index 00000000000..f30422fd009<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/afr/stale-file-lookup.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/afr/stale-file-lookup.t</a></div><div class='hunk'>@@ -0,0 +1,30 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+#This file checks if stale file lookup fails or not.</div><div class='add'>+#A file is deleted when a brick was down. Before self-heal could happen to it</div><div class='add'>+#the file is accessed. It should fail.</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 replica 2 $H0:$B0/${V0}{0,1}</div><div class='add'>+TEST $CLI volume set $V0 self-heal-daemon off</div><div class='add'>+TEST $CLI volume set $V0 cluster.metadata-self-heal off</div><div class='add'>+TEST $CLI volume set $V0 cluster.entry-self-heal off</div><div class='add'>+TEST $CLI volume set $V0 cluster.data-self-heal off</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+TEST $GFS --volfile-id=/$V0 --volfile-server=$H0 $M0;</div><div class='add'>+TEST touch $M0/a</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}0</div><div class='add'>+TEST rm -f $M0/a</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status $V0 0</div><div class='add'>+TEST stat $B0/${V0}0/a</div><div class='add'>+TEST ! stat $B0/${V0}1/a</div><div class='add'>+TEST ! ls -l $M0/a</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/basic/afr/ta-check-locks.t b/tests/basic/afr/ta-check-locks.t<br/>new file mode 100644<br/>index 00000000000..c0102c35b7b<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/afr/ta-check-locks.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/afr/ta-check-locks.t</a></div><div class='hunk'>@@ -0,0 +1,68 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+#This test checks if all the locks on</div><div class='add'>+#ta file are being held and released properly</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+. $(dirname $0)/../../thin-arbiter.rc</div><div class='add'>+</div><div class='add'>+function get_lock_count_on_ta()</div><div class='add'>+{</div><div class='add'>+    tapid=`cat $B0/ta.pid`</div><div class='add'>+    local sfile=$(generate_statedump $tapid)</div><div class='add'>+    count=$(grep "inodelk-count" $sfile | cut -f2 -d'=' | tail -1)</div><div class='add'>+    ncount=$(grep "inodelk.inodelk" $sfile | grep "len=1" | wc -l)</div><div class='add'>+    echo "count = $count : ncount = $ncount"</div><div class='add'>+    if [ "$count" = "" ]</div><div class='add'>+    then</div><div class='add'>+        count=0</div><div class='add'>+    fi</div><div class='add'>+</div><div class='add'>+    if [ "$count" -eq "$ncount" ]</div><div class='add'>+    then</div><div class='add'>+        echo "$count"</div><div class='add'>+    else</div><div class='add'>+        echo "-1"</div><div class='add'>+    fi</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+TEST ta_create_brick_and_volfile brick0</div><div class='add'>+TEST ta_create_brick_and_volfile brick1</div><div class='add'>+TEST ta_create_ta_and_volfile ta</div><div class='add'>+TEST ta_start_brick_process brick0</div><div class='add'>+TEST ta_start_brick_process brick1</div><div class='add'>+TEST ta_start_ta_process ta</div><div class='add'>+</div><div class='add'>+TEST ta_create_mount_volfile brick0 brick1 ta</div><div class='add'>+TEST ta_start_mount_process $M0</div><div class='add'>+TEST ta_start_mount_process $M1</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" ta_up_status $V0 $M0 0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" ta_up_status $V0 $M1 0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "trusted.afr.patchy-ta-2" ls $B0/ta</div><div class='add'>+</div><div class='add'>+TEST ta_create_shd_volfile brick0 brick1 ta</div><div class='add'>+TEST ta_start_shd_process glustershd</div><div class='add'>+shd_pid=$(cat $B0/glustershd.pid)</div><div class='add'>+</div><div class='add'>+TEST touch $M0/a.txt</div><div class='add'>+echo "Hello" &gt;&gt; $M0/a.txt</div><div class='add'>+EXPECT_WITHIN $IO_WAIT_TIMEOUT "0" get_lock_count_on_ta</div><div class='add'>+</div><div class='add'>+TEST ta_kill_brick brick0</div><div class='add'>+echo "Hello" &gt;&gt; $M0/a.txt</div><div class='add'>+EXPECT_WITHIN $IO_WAIT_TIMEOUT "1" get_lock_count_on_ta</div><div class='add'>+</div><div class='add'>+echo "Hello" &gt;&gt; $M1/a.txt</div><div class='add'>+EXPECT_WITHIN $IO_WAIT_TIMEOUT "2" get_lock_count_on_ta</div><div class='add'>+</div><div class='add'>+echo "xyz" &gt;&gt; $M0/a.txt</div><div class='add'>+EXPECT_WITHIN $IO_WAIT_TIMEOUT "2" get_lock_count_on_ta</div><div class='add'>+</div><div class='add'>+chmod 0666 $M0/a.txt</div><div class='add'>+EXPECT_WITHIN $IO_WAIT_TIMEOUT "2" get_lock_count_on_ta</div><div class='add'>+</div><div class='add'>+TEST ta_start_brick_process brick0</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "0" get_lock_count_on_ta</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/basic/afr/ta-read.t b/tests/basic/afr/ta-read.t<br/>new file mode 100644<br/>index 00000000000..3cfc16b9b8a<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/afr/ta-read.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/afr/ta-read.t</a></div><div class='hunk'>@@ -0,0 +1,64 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+# Test read transaction logic for thin-arbiter.</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+. $(dirname $0)/../../thin-arbiter.rc</div><div class='add'>+cleanup;</div><div class='add'>+TEST ta_create_brick_and_volfile brick0</div><div class='add'>+TEST ta_create_brick_and_volfile brick1</div><div class='add'>+TEST ta_create_ta_and_volfile ta</div><div class='add'>+TEST ta_start_brick_process brick0</div><div class='add'>+TEST ta_start_brick_process brick1</div><div class='add'>+TEST ta_start_ta_process ta</div><div class='add'>+</div><div class='add'>+TEST ta_create_mount_volfile brick0 brick1 ta</div><div class='add'>+TEST ta_start_mount_process $M0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" ta_up_status $V0 $M0 0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "trusted.afr.patchy-ta-2" ls $B0/ta</div><div class='add'>+</div><div class='add'>+TEST touch $M0/FILE</div><div class='add'>+TEST ls $B0/brick0/FILE</div><div class='add'>+TEST ls $B0/brick1/FILE</div><div class='add'>+TEST ! ls $B0/ta/FILE</div><div class='add'>+</div><div class='add'>+# Kill one brick and write to FILE.</div><div class='add'>+TEST ta_kill_brick brick0</div><div class='add'>+EXPECT_WITHIN $PROCESS_DOWN_TIMEOUT "0" ta_mount_child_up_status $M0 $V0 0</div><div class='add'>+echo "brick0 down"&gt;&gt; $M0/FILE</div><div class='add'>+TEST [ $? -eq 0 ]</div><div class='add'>+EXPECT "000000010000000000000000" get_hex_xattr trusted.afr.$V0-client-0 $B0/brick1/FILE</div><div class='add'>+EXPECT "000000010000000000000000" get_hex_xattr trusted.afr.$V0-client-0 $B0/ta/trusted.afr.patchy-ta-2</div><div class='add'>+</div><div class='add'>+#Umount and mount to remove cached data.</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+TEST ta_start_mount_process $M0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" ta_up_status $V0 $M0 0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" ta_mount_child_up_status $M0 $V0 1</div><div class='add'>+# Read must be allowed since good brick is up.</div><div class='add'>+TEST  cat $M0/FILE</div><div class='add'>+</div><div class='add'>+#Umount and mount to remove cached data.</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+TEST ta_start_mount_process $M0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" ta_up_status $V0 $M0 0</div><div class='add'>+# Toggle good and bad data brick processes.</div><div class='add'>+TEST ta_start_brick_process brick0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" ta_mount_child_up_status $M0 $V0 0</div><div class='add'>+TEST ta_kill_brick brick1</div><div class='add'>+EXPECT_WITHIN $PROCESS_DOWN_TIMEOUT "0" ta_mount_child_up_status $M0 $V0 1</div><div class='add'>+# Read must now fail.</div><div class='add'>+TEST ! cat $M0/FILE</div><div class='add'>+</div><div class='add'>+# Bring all data bricks up, and kill TA.</div><div class='add'>+TEST ta_start_brick_process brick1</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" ta_mount_child_up_status $M0 $V0 1</div><div class='add'>+TA_PID=$(ta_get_pid_by_brick_name ta)</div><div class='add'>+TEST [ -n $TA_PID ]</div><div class='add'>+TEST ta_kill_brick ta</div><div class='add'>+TA_PID=$(ta_get_pid_by_brick_name ta)</div><div class='add'>+TEST [ -z $TA_PID ]</div><div class='add'>+# Read must now succeed.</div><div class='add'>+TEST cat $M0/FILE</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/basic/afr/ta-shd.t b/tests/basic/afr/ta-shd.t<br/>new file mode 100644<br/>index 00000000000..96ecfc678e0<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/afr/ta-shd.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/afr/ta-shd.t</a></div><div class='hunk'>@@ -0,0 +1,49 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+#Self-heal tests</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+. $(dirname $0)/../../thin-arbiter.rc</div><div class='add'>+cleanup;</div><div class='add'>+TEST ta_create_brick_and_volfile brick0</div><div class='add'>+TEST ta_create_brick_and_volfile brick1</div><div class='add'>+TEST ta_create_ta_and_volfile ta</div><div class='add'>+TEST ta_start_brick_process brick0</div><div class='add'>+TEST ta_start_brick_process brick1</div><div class='add'>+TEST ta_start_ta_process ta</div><div class='add'>+</div><div class='add'>+TEST ta_create_mount_volfile brick0 brick1 ta</div><div class='add'>+TEST ta_start_mount_process $M0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" ta_up_status $V0 $M0 0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "trusted.afr.patchy-ta-2" ls $B0/ta</div><div class='add'>+</div><div class='add'>+TEST ta_create_shd_volfile brick0 brick1 ta</div><div class='add'>+TEST ta_start_shd_process glustershd</div><div class='add'>+</div><div class='add'>+TEST touch $M0/a.txt</div><div class='add'>+TEST ta_kill_brick brick0</div><div class='add'>+EXPECT_WITHIN $PROCESS_DOWN_TIMEOUT "0" ta_mount_child_up_status $M0 $V0 0</div><div class='add'>+echo "Hello" &gt;&gt; $M0/a.txt</div><div class='add'>+EXPECT "000000010000000000000000" get_hex_xattr trusted.afr.$V0-client-0 $B0/brick1/a.txt</div><div class='add'>+EXPECT "000000010000000000000000" get_hex_xattr trusted.afr.$V0-client-0 $B0/ta/trusted.afr.$V0-ta-2</div><div class='add'>+</div><div class='add'>+#TODO: After the write txn changes are merged, take statedump of TA process and</div><div class='add'>+#check whether AFR_TA_DOM_NOTIFY lock is held by the client here. Take the</div><div class='add'>+#statedump again after line #38 to check AFR_TA_DOM_NOTIFY lock is released by</div><div class='add'>+#the SHD process.</div><div class='add'>+</div><div class='add'>+TEST ta_start_brick_process brick0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" ta_mount_child_up_status $M0 $V0 0</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "000000000000000000000000" get_hex_xattr trusted.afr.$V0-client-0 $B0/brick1/a.txt</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "000000000000000000000000" get_hex_xattr trusted.afr.$V0-client-0 $B0/ta/trusted.afr.$V0-ta-2</div><div class='add'>+</div><div class='add'>+#Kill the previously up brick and try reading from other brick. Since the heal</div><div class='add'>+#has happened file content should be same.</div><div class='add'>+TEST ta_kill_brick brick1</div><div class='add'>+EXPECT_WITHIN $PROCESS_DOWN_TIMEOUT "0" ta_mount_child_up_status $M0 $V0 1</div><div class='add'>+#Umount and mount to remove cached data.</div><div class='add'>+TEST umount $M0</div><div class='add'>+TEST ta_start_mount_process $M0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" ta_up_status $V0 $M0 0</div><div class='add'>+EXPECT "Hello" cat $M0/a.txt</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/basic/afr/ta-write-on-bad-brick.t b/tests/basic/afr/ta-write-on-bad-brick.t<br/>new file mode 100644<br/>index 00000000000..096ca9f47cf<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/afr/ta-write-on-bad-brick.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/afr/ta-write-on-bad-brick.t</a></div><div class='hunk'>@@ -0,0 +1,51 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+. $(dirname $0)/../../thin-arbiter.rc</div><div class='add'>+cleanup;</div><div class='add'>+TEST ta_create_brick_and_volfile brick0</div><div class='add'>+TEST ta_create_brick_and_volfile brick1</div><div class='add'>+TEST ta_create_ta_and_volfile ta</div><div class='add'>+TEST ta_start_brick_process brick0</div><div class='add'>+TEST ta_start_brick_process brick1</div><div class='add'>+TEST ta_start_ta_process ta</div><div class='add'>+</div><div class='add'>+TEST ta_create_mount_volfile brick0 brick1 ta</div><div class='add'>+TEST ta_start_mount_process $M0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" ta_up_status $V0 $M0 0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "trusted.afr.patchy-ta-2" ls $B0/ta</div><div class='add'>+</div><div class='add'>+TEST touch $M0/a.txt</div><div class='add'>+TEST ls $B0/brick0/a.txt</div><div class='add'>+TEST ls $B0/brick1/a.txt</div><div class='add'>+TEST ! ls $B0/ta/a.txt</div><div class='add'>+</div><div class='add'>+TEST dd if=/dev/zero of=$M0/a.txt bs=1M count=5</div><div class='add'>+</div><div class='add'>+#Good Data brick is down. TA and bad brick are UP</div><div class='add'>+</div><div class='add'>+TEST ta_kill_brick brick1</div><div class='add'>+EXPECT_WITHIN $PROCESS_DOWN_TIMEOUT "0" ta_mount_child_up_status $M0 $V0 1</div><div class='add'>+TEST dd if=/dev/zero of=$M0/a.txt bs=1M count=5</div><div class='add'>+TEST ta_kill_brick brick0</div><div class='add'>+EXPECT_WITHIN $PROCESS_DOWN_TIMEOUT "0"  ta_mount_child_up_status $M0 $V0 0</div><div class='add'>+TEST ta_start_brick_process brick1</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" ta_mount_child_up_status $M0 $V0 1</div><div class='add'>+TEST ! dd if=/dev/zero of=$M0/a.txt bs=1M count=5</div><div class='add'>+</div><div class='add'>+# Good Data brick is UP. Bad and TA are down</div><div class='add'>+TEST ta_kill_brick brick1</div><div class='add'>+EXPECT_WITHIN $PROCESS_DOWN_TIMEOUT "0"  ta_mount_child_up_status $M0 $V0 1</div><div class='add'>+TEST ta_start_brick_process brick0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" ta_mount_child_up_status $M0 $V0 0</div><div class='add'>+TEST ta_kill_brick ta</div><div class='add'>+TEST ! dd if=/dev/zero of=$M0/a.txt bs=1M count=5</div><div class='add'>+</div><div class='add'>+# Good and Bad data bricks are UP. TA is down</div><div class='add'>+TEST ta_start_brick_process brick1</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" ta_mount_child_up_status $M0 $V0 1</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" ta_mount_child_up_status $M0 $V0 0</div><div class='add'>+TEST dd if=/dev/zero of=$M0/a.txt bs=1M count=5</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/basic/afr/ta.t b/tests/basic/afr/ta.t<br/>new file mode 100644<br/>index 00000000000..05d48431c95<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/afr/ta.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/afr/ta.t</a></div><div class='hunk'>@@ -0,0 +1,54 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+#Self-heal tests</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+. $(dirname $0)/../../thin-arbiter.rc</div><div class='add'>+cleanup;</div><div class='add'>+TEST ta_create_brick_and_volfile brick0</div><div class='add'>+TEST ta_create_brick_and_volfile brick1</div><div class='add'>+TEST ta_create_ta_and_volfile ta</div><div class='add'>+TEST ta_start_brick_process brick0</div><div class='add'>+TEST ta_start_brick_process brick1</div><div class='add'>+TEST ta_start_ta_process ta</div><div class='add'>+</div><div class='add'>+TEST ta_create_mount_volfile brick0 brick1 ta</div><div class='add'>+TEST ta_start_mount_process $M0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" ta_up_status $V0 $M0 0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "trusted.afr.patchy-ta-2" ls $B0/ta</div><div class='add'>+</div><div class='add'>+TEST touch $M0/a.txt</div><div class='add'>+TEST ls $B0/brick0/a.txt</div><div class='add'>+TEST ls $B0/brick1/a.txt</div><div class='add'>+TEST ! ls $B0/ta/a.txt</div><div class='add'>+</div><div class='add'>+TEST ta_kill_brick brick0</div><div class='add'>+EXPECT_WITHIN $PROCESS_DOWN_TIMEOUT "0" afr_child_up_status_meta $M0 $V0-replicate-0 0</div><div class='add'>+TEST touch $M0/b.txt</div><div class='add'>+EXPECT "000000000000000000000001" get_hex_xattr trusted.afr.$V0-client-0 $B0/brick1</div><div class='add'>+EXPECT "000000010000000200000000" get_hex_xattr trusted.afr.$V0-client-0 $B0/brick1/b.txt</div><div class='add'>+#New entry mark lead to pending data on the file and on ta</div><div class='add'>+EXPECT "000000010000000100000000" get_hex_xattr trusted.afr.$V0-client-0 $B0/ta/trusted.afr.patchy-ta-2</div><div class='add'>+TEST ! ls $B0/brick0/b.txt</div><div class='add'>+TEST ls $B0/brick1/b.txt</div><div class='add'>+</div><div class='add'>+#Try to create an entry while good brick is down and bad brick is UP. Should not create</div><div class='add'>+TEST ta_start_brick_process brick0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_meta $M0 $V0-replicate-0 0</div><div class='add'>+TEST ta_kill_brick brick1</div><div class='add'>+EXPECT_WITHIN $PROCESS_DOWN_TIMEOUT "0" afr_child_up_status_meta $M0 $V0-replicate-0 1</div><div class='add'>+TEST ! touch $M0/d.txt</div><div class='add'>+EXPECT "000000010000000100000000" get_hex_xattr trusted.afr.$V0-client-0 $B0/ta/trusted.afr.patchy-ta-2</div><div class='add'>+</div><div class='add'>+TEST ta_start_brick_process brick1</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_meta $M0 $V0-replicate-0 1</div><div class='add'>+TEST ta_kill_brick brick0</div><div class='add'>+EXPECT_WITHIN $PROCESS_DOWN_TIMEOUT "0" afr_child_up_status_meta $M0 $V0-replicate-0 0</div><div class='add'>+</div><div class='add'>+TEST ta_kill_brick ta</div><div class='add'>+# Entry create must fail if only one brick is UP, even if that is a good brick.</div><div class='add'>+TEST ! touch $M0/c.txt</div><div class='add'>+TEST ! ls $B0/brick0/c.txt</div><div class='add'>+TEST ! ls $B0/brick1/c.txt</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/basic/afr/tarissue.t b/tests/basic/afr/tarissue.t<br/>new file mode 100644<br/>index 00000000000..83f7463130c<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/afr/tarissue.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/afr/tarissue.t</a></div><div class='hunk'>@@ -0,0 +1,39 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+. $(dirname $0)/../../nfs.rc</div><div class='add'>+</div><div class='add'>+#G_TESTDEF_TEST_STATUS_CENTOS6=NFS_TEST</div><div class='add'>+</div><div class='add'>+TESTS_EXPECTED_IN_LOOP=10</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+#Basic checks</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+</div><div class='add'>+#Create a distributed-replicate volume</div><div class='add'>+TEST $CLI volume create $V0 replica 2 $H0:$B0/${V0}{1..6};</div><div class='add'>+TEST $CLI volume set $V0 cluster.consistent-metadata on</div><div class='add'>+TEST $CLI volume set $V0 cluster.post-op-delay-secs 0</div><div class='add'>+TEST $CLI volume set $V0 nfs.rdirplus off</div><div class='add'>+TEST $CLI volume set $V0 nfs.disable false</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+EXPECT_WITHIN $NFS_EXPORT_TIMEOUT "1" is_nfs_export_available;</div><div class='add'>+</div><div class='add'>+# Mount NFS</div><div class='add'>+mount_nfs $H0:/$V0 $N0 vers=3</div><div class='add'>+</div><div class='add'>+#Create files</div><div class='add'>+TEST mkdir -p $N0/nfs/dir1/dir2</div><div class='add'>+for i in {1..10}; do</div><div class='add'>+    TEST_IN_LOOP dd if=/dev/urandom of=$N0/nfs/dir1/dir2/file$i bs=1024k count=1</div><div class='add'>+done</div><div class='add'>+TEST tar cvf /tmp/dir1.tar.gz $N0/nfs/dir1</div><div class='add'>+</div><div class='add'>+TEST rm -f /tmp/dir1.tar.gz</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $N0</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/basic/all_squash.t b/tests/basic/all_squash.t<br/>new file mode 100644<br/>index 00000000000..29766c50af7<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/all_squash.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/all_squash.t</a></div><div class='hunk'>@@ -0,0 +1,74 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+. $(dirname $0)/../include.rc</div><div class='add'>+. $(dirname $0)/../volume.rc</div><div class='add'>+. $(dirname $0)/../nfs.rc</div><div class='add'>+</div><div class='add'>+#G_TESTDEF_TEST_STATUS_CENTOS6=NFS_TEST</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/${V0}{0,1}</div><div class='add'>+TEST $CLI volume set $V0 nfs.disable false</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+</div><div class='add'>+TEST glusterfs --entry-timeout=0 --attribute-timeout=0 -s $H0 --volfile-id $V0 $M0;</div><div class='add'>+EXPECT_WITHIN $NFS_EXPORT_TIMEOUT "1" is_nfs_export_available;</div><div class='add'>+TEST mount_nfs $H0:/$V0 $N0 nolock;</div><div class='add'>+</div><div class='add'>+# random uid/gid</div><div class='add'>+uid=22162</div><div class='add'>+gid=5845</div><div class='add'>+</div><div class='add'>+TEST $CLI volume set $V0 server.anonuid $uid;</div><div class='add'>+TEST $CLI volume set $V0 server.anongid $gid;</div><div class='add'>+</div><div class='add'>+# Ensure server.all-squash is disabled</div><div class='add'>+TEST $CLI volume set $V0 server.all-squash disable;</div><div class='add'>+</div><div class='add'>+# Tests for the fuse mount</div><div class='add'>+mkdir $M0/other;</div><div class='add'>+chown $uid:$gid $M0/other;</div><div class='add'>+</div><div class='add'>+TEST $CLI volume set $V0 server.all-squash enable;</div><div class='add'>+</div><div class='add'>+touch $M0/file 2&gt;/dev/null;</div><div class='add'>+TEST [ $? -ne 0 ]</div><div class='add'>+mkdir $M0/dir 2&gt;/dev/null;</div><div class='add'>+TEST [ $? -ne 0 ]</div><div class='add'>+</div><div class='add'>+TEST touch $M0/other/file 2&gt;/dev/null;</div><div class='add'>+TEST [ "$(stat -c %u:%g $M0/other/file)" = "$uid:$gid" ];</div><div class='add'>+TEST mkdir $M0/other/dir 2&gt;/dev/null;</div><div class='add'>+TEST [ "$(stat -c %u:%g $M0/other/dir)" = "$uid:$gid" ];</div><div class='add'>+</div><div class='add'>+TEST $CLI volume set $V0 server.all-squash disable;</div><div class='add'>+TEST rm -rf $M0/other;</div><div class='add'>+</div><div class='add'>+sleep 1;</div><div class='add'>+</div><div class='add'>+# tests for nfs mount</div><div class='add'>+mkdir $N0/other;</div><div class='add'>+chown $uid:$gid $N0/other;</div><div class='add'>+</div><div class='add'>+TEST $CLI volume set $V0 server.all-squash enable;</div><div class='add'>+</div><div class='add'>+touch $N0/file 2&gt;/dev/null;</div><div class='add'>+TEST [ $? -ne 0 ]</div><div class='add'>+mkdir $N0/dir 2&gt;/dev/null;</div><div class='add'>+TEST [ $? -ne 0 ]</div><div class='add'>+</div><div class='add'>+TEST touch $N0/other/file 2&gt;/dev/null;</div><div class='add'>+TEST [ "$(stat -c %u:%g $N0/other/file)" = "$uid:$gid" ];</div><div class='add'>+TEST mkdir $N0/other/dir 2&gt;/dev/null;</div><div class='add'>+TEST [ "$(stat -c %u:%g $N0/other/dir)" = "$uid:$gid" ];</div><div class='add'>+</div><div class='add'>+TEST $CLI volume set $V0 server.all-squash disable;</div><div class='add'>+TEST rm -rf $N0/other;</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $N0</div><div class='add'>+</div><div class='add'>+TEST $CLI volume stop $V0;</div><div class='add'>+TEST $CLI volume delete $V0;</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/basic/cdc.t b/tests/basic/cdc.t<br/>new file mode 100755<br/>index 00000000000..8653a77207a<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/cdc.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/cdc.t</a></div><div class='hunk'>@@ -0,0 +1,148 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../include.rc</div><div class='add'>+. $(dirname $0)/../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+function file_mime_type () {</div><div class='add'>+    mime_type=$(file --mime $1 2&gt;/dev/null | sed '/^[^:]*: /s///')</div><div class='add'>+    echo $mime_type</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+</div><div class='add'>+## Create a volume with one brick</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/${V0}1;</div><div class='add'>+EXPECT "$V0" volinfo_field $V0 'Volume Name';</div><div class='add'>+EXPECT 'Created' volinfo_field $V0 'Status';</div><div class='add'>+EXPECT '1' brick_count $V0</div><div class='add'>+</div><div class='add'>+## Turn off performance translators</div><div class='add'>+## This is required for testing readv calls</div><div class='add'>+TEST $CLI volume set $V0 performance.io-cache off</div><div class='add'>+EXPECT 'off' volinfo_field $V0 'performance.io-cache'</div><div class='add'>+TEST $CLI volume set $V0 performance.quick-read off</div><div class='add'>+EXPECT 'off' volinfo_field $V0 'performance.quick-read'</div><div class='add'>+</div><div class='add'>+TEST $CLI volume set $V0 performance.strict-write-ordering on</div><div class='add'>+EXPECT 'on' volinfo_field $V0 'performance.strict-write-ordering'</div><div class='add'>+</div><div class='add'>+## Turn on cdc xlator by setting network.compression to on</div><div class='add'>+TEST $CLI volume set $V0 network.compression on</div><div class='add'>+EXPECT 'on' volinfo_field $V0 'network.compression'</div><div class='add'>+</div><div class='add'>+## Make sure that user cannot change network.compression.mode</div><div class='add'>+## This would break the cdc xlator if allowed!</div><div class='add'>+TEST ! $CLI volume set $V0 network.compression.mode client</div><div class='add'>+</div><div class='add'>+## Turn on network.compression.debug option</div><div class='add'>+## This will dump compressed data onto disk as gzip file</div><div class='add'>+## This is used to check if compression actually happened</div><div class='add'>+TEST $CLI volume set $V0 network.compression.debug on</div><div class='add'>+EXPECT 'on' volinfo_field $V0 'network.compression.debug'</div><div class='add'>+</div><div class='add'>+## Start the volume</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+EXPECT 'Started' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+sleep 2</div><div class='add'>+## Mount FUSE with caching disabled</div><div class='add'>+TEST $GFS -s $H0 --volfile-id $V0 $M0;</div><div class='add'>+</div><div class='add'>+####################</div><div class='add'>+## Testing writev ##</div><div class='add'>+####################</div><div class='add'>+</div><div class='add'>+## Create a 1K file locally and find the md5sum</div><div class='add'>+TEST dd if=/dev/zero of=/tmp/cdc-orig count=1 bs=1k 2&gt;/dev/null</div><div class='add'>+checksum[original-file]=`md5sum /tmp/cdc-orig | cut -d' ' -f1`</div><div class='add'>+</div><div class='add'>+## Copy the file to mountpoint and find its md5sum on brick</div><div class='add'>+TEST dd if=/tmp/cdc-orig of=$M0/cdc-server count=1 bs=1k 2&gt;/dev/null</div><div class='add'>+checksum[brick-file]=`md5sum $B0/${V0}1/cdc-server | cut -d' ' -f1`</div><div class='add'>+</div><div class='add'>+## Uncompress the gzip dump file and find its md5sum</div><div class='add'>+# mime outputs for gzip are different for file version &gt; 5.14</div><div class='add'>+TEST touch /tmp/gzipfile</div><div class='add'>+TEST gzip /tmp/gzipfile</div><div class='add'>+GZIP_MIME_TYPE=$(file_mime_type /tmp/gzipfile.gz)</div><div class='add'>+</div><div class='add'>+TEST rm -f /tmp/gzipfile.gz</div><div class='add'>+</div><div class='add'>+EXPECT "$GZIP_MIME_TYPE" echo $(file_mime_type /tmp/cdcdump.gz)</div><div class='add'>+</div><div class='add'>+TEST gunzip -f /tmp/cdcdump.gz</div><div class='add'>+checksum[dump-file-writev]=`md5sum /tmp/cdcdump | cut -d' ' -f1`</div><div class='add'>+</div><div class='add'>+## Check if all 3 checksums are same</div><div class='add'>+TEST test ${checksum[original-file]} = ${checksum[brick-file]}</div><div class='add'>+TEST test ${checksum[brick-file]} = ${checksum[dump-file-writev]}</div><div class='add'>+</div><div class='add'>+## Cleanup files</div><div class='add'>+TEST rm -f /tmp/cdcdump.gz</div><div class='add'>+</div><div class='add'>+###################</div><div class='add'>+## Testing readv ##</div><div class='add'>+###################</div><div class='add'>+</div><div class='add'>+## Copy file from mount point to client and find checksum</div><div class='add'>+TEST dd if=$M0/cdc-server of=/tmp/cdc-client count=1 bs=1k 2&gt;/dev/null</div><div class='add'>+checksum[client-file]=`md5sum /tmp/cdc-client | cut -d' ' -f1`</div><div class='add'>+</div><div class='add'>+## Uncompress the gzip dump file and find its md5sum</div><div class='add'>+# mime outputs for gzip are different for file version &gt; 5.14</div><div class='add'>+EXPECT "$GZIP_MIME_TYPE" echo $(file_mime_type /tmp/cdcdump.gz)</div><div class='add'>+</div><div class='add'>+TEST gunzip -f /tmp/cdcdump.gz</div><div class='add'>+checksum[dump-file-readv]=`md5sum /tmp/cdcdump | cut -d' ' -f1`</div><div class='add'>+</div><div class='add'>+## Check if all 3 checksums are same</div><div class='add'>+TEST test ${checksum[brick-file]} = ${checksum[client-file]}</div><div class='add'>+TEST test ${checksum[client-file]} = ${checksum[dump-file-readv]}</div><div class='add'>+</div><div class='add'>+## Cleanup files and unmount</div><div class='add'>+TEST rm -f /tmp/cdc* $M0/cdc*</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+</div><div class='add'>+## Stop the volume</div><div class='add'>+TEST $CLI volume stop $V0;</div><div class='add'>+EXPECT 'Stopped' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+## Turn on network.compression.min-size and set it to 100 bytes</div><div class='add'>+## Compression should not take place if file size</div><div class='add'>+## is less than 100 bytes</div><div class='add'>+TEST $CLI volume set $V0 network.compression.min-size 100</div><div class='add'>+EXPECT '100' volinfo_field $V0 'network.compression.min-size'</div><div class='add'>+</div><div class='add'>+## Start the volume</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+EXPECT 'Started' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+## Mount FUSE with caching disabled</div><div class='add'>+TEST $GFS -s $H0 --volfile-id $V0 $M0;</div><div class='add'>+</div><div class='add'>+## Create a file of size 99 bytes on mountpoint</div><div class='add'>+## This is should not be compressed</div><div class='add'>+TEST dd if=/dev/zero of=$M0/cdc-small count=1 bs=99 2&gt;/dev/null</div><div class='add'>+TEST ! test -e /tmp/cdcdump.gz</div><div class='add'>+</div><div class='add'>+## Cleanup files and unmount</div><div class='add'>+TEST rm -f /tmp/cdc* $M0/cdc*</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+</div><div class='add'>+## Stop the volume</div><div class='add'>+TEST $CLI volume stop $V0;</div><div class='add'>+EXPECT 'Stopped' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+## Reset the network.compression options</div><div class='add'>+TEST $CLI volume reset $V0 network.compression.debug</div><div class='add'>+TEST $CLI volume reset $V0 network.compression.min-size</div><div class='add'>+TEST $CLI volume reset $V0 network.compression</div><div class='add'>+</div><div class='add'>+## Delete the volume</div><div class='add'>+TEST $CLI volume delete $V0;</div><div class='add'>+TEST ! $CLI volume info $V0;</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/basic/changelog/changelog-api.t b/tests/basic/changelog/changelog-api.t<br/>new file mode 100644<br/>index 00000000000..516c2f2f60d<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/changelog/changelog-api.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/changelog/changelog-api.t</a></div><div class='hunk'>@@ -0,0 +1,37 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+. $(dirname $0)/../../env.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+CHANGELOG_BIN_PATH=$(dirname $0)/../../utils/changelog</div><div class='add'>+build_tester $CHANGELOG_BIN_PATH/test-changelog-api.c -lgfchangelog</div><div class='add'>+</div><div class='add'>+CHANGELOG_PATH_0="$B0/${V0}0/.glusterfs/changelogs"</div><div class='add'>+ROLLOVER_TIME=2</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/${V0}0</div><div class='add'>+TEST $CLI volume set $V0 changelog.changelog on</div><div class='add'>+TEST $CLI volume set $V0 changelog.rollover-time $ROLLOVER_TIME</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+TEST $GFS --volfile-id=$V0 --volfile-server=$H0 $M0;</div><div class='add'>+</div><div class='add'>+sleep 3;</div><div class='add'>+</div><div class='add'>+#Listen to changelog journal notifcations</div><div class='add'>+$CHANGELOG_BIN_PATH/test-changelog-api &amp;</div><div class='add'>+for i in {1..12};do echo "data" &gt; $M0/file$i 2&gt;/dev/null; sleep 1;done &amp;</div><div class='add'>+</div><div class='add'>+#Wait for changelogs to be in .processed directory</div><div class='add'>+sleep 12</div><div class='add'>+</div><div class='add'>+EXPECT "Y" processed_changelogs "/tmp/scratch_v1/.processed"</div><div class='add'>+TEST rm $CHANGELOG_BIN_PATH/test-changelog-api</div><div class='add'>+rm -rf /tmp/scratch_v1</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/basic/changelog/changelog-history.t b/tests/basic/changelog/changelog-history.t<br/>new file mode 100644<br/>index 00000000000..ea952619652<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/changelog/changelog-history.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/changelog/changelog-history.t</a></div><div class='hunk'>@@ -0,0 +1,91 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+. $(dirname $0)/../../env.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+SCRIPT_TIMEOUT=300</div><div class='add'>+HISTORY_BIN_PATH=$(dirname $0)/../../utils/changelog</div><div class='add'>+build_tester $HISTORY_BIN_PATH/get-history.c -lgfchangelog</div><div class='add'>+</div><div class='add'>+time_before_enable1=$(date '+%s')</div><div class='add'>+CHANGELOG_PATH_0="$B0/${V0}0/.glusterfs/changelogs"</div><div class='add'>+ROLLOVER_TIME=2</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+</div><div class='add'>+sleep 3</div><div class='add'>+time_before_enable2=$(date '+%s')</div><div class='add'>+</div><div class='add'>+sleep 3</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/${V0}0</div><div class='add'>+TEST $CLI volume set $V0 changelog.changelog on</div><div class='add'>+TEST $CLI volume set $V0 changelog.rollover-time $ROLLOVER_TIME</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+sleep 3</div><div class='add'>+time_after_enable1=$(date '+%s')</div><div class='add'>+</div><div class='add'>+TEST $GFS --volfile-id=$V0 --volfile-server=$H0 $M0;</div><div class='add'>+touch $M0/file{1..10}</div><div class='add'>+</div><div class='add'>+sleep 3</div><div class='add'>+time_after_enable2=$(date '+%s')</div><div class='add'>+</div><div class='add'>+let time_future=time_after_enable2+600</div><div class='add'>+</div><div class='add'>+#Fails as start falls before changelog enable</div><div class='add'>+EXPECT "-3" $HISTORY_BIN_PATH/get-history $time_before_enable1 $time_before_enable2</div><div class='add'>+</div><div class='add'>+#Fails as start falls before changelog enable</div><div class='add'>+EXPECT "-3" $HISTORY_BIN_PATH/get-history $time_before_enable2 $time_after_enable1</div><div class='add'>+</div><div class='add'>+#Passes as start and end falls in same htime file</div><div class='add'>+EXPECT "0" $HISTORY_BIN_PATH/get-history $time_after_enable1 $time_after_enable2</div><div class='add'>+</div><div class='add'>+#Passes, gives the changelogs till continuous changelogs are available</div><div class='add'>+# but returns 1</div><div class='add'>+EXPECT "1" $HISTORY_BIN_PATH/get-history $time_after_enable2 $time_future</div><div class='add'>+</div><div class='add'>+#Disable and enable changelog</div><div class='add'>+TEST $CLI volume set $V0 changelog.changelog off</div><div class='add'>+sleep 6</div><div class='add'>+time_between_htime=$(date '+%s')</div><div class='add'>+sleep 6</div><div class='add'>+TEST $CLI volume set $V0 changelog.changelog on</div><div class='add'>+</div><div class='add'>+sleep 6</div><div class='add'>+touch $M0/test{1..10}</div><div class='add'>+time_in_sec_htime1=$(date '+%s')</div><div class='add'>+</div><div class='add'>+sleep 6</div><div class='add'>+touch $M0/test1{1..10}</div><div class='add'>+time_in_sec_htime2=$(date '+%s')</div><div class='add'>+</div><div class='add'>+sleep 3</div><div class='add'>+TEST $CLI volume set $V0 changelog.changelog off</div><div class='add'>+sleep 3</div><div class='add'>+time_after_disable=$(date '+%s')</div><div class='add'>+</div><div class='add'>+TEST $CLI volume set $V0 changelog.changelog on</div><div class='add'>+sleep 5</div><div class='add'>+</div><div class='add'>+#Passes, gives the changelogs till continuous changelogs are available</div><div class='add'>+# but returns 1</div><div class='add'>+EXPECT_WITHIN 10 "1" $HISTORY_BIN_PATH/get-history $time_after_enable1 $time_in_sec_htime2</div><div class='add'>+</div><div class='add'>+#Fails as start falls between htime files</div><div class='add'>+EXPECT_WITHIN 10 "-3" $HISTORY_BIN_PATH/get-history $time_between_htime $time_in_sec_htime1</div><div class='add'>+</div><div class='add'>+#Passes as start and end falls in same htime file</div><div class='add'>+EXPECT_WITHIN 10 "0" $HISTORY_BIN_PATH/get-history $time_in_sec_htime1 $time_in_sec_htime2</div><div class='add'>+</div><div class='add'>+#Passes, gives the changelogs till continuous changelogs are available</div><div class='add'>+EXPECT_WITHIN 10 "0" $HISTORY_BIN_PATH/get-history $time_in_sec_htime2 $time_after_disable</div><div class='add'>+</div><div class='add'>+TEST rm $HISTORY_BIN_PATH/get-history</div><div class='add'>+rm -rf /tmp/scratch_v1/*</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/basic/changelog/changelog-rename.t b/tests/basic/changelog/changelog-rename.t<br/>new file mode 100644<br/>index 00000000000..9a0ef527b5b<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/changelog/changelog-rename.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/changelog/changelog-rename.t</a></div><div class='hunk'>@@ -0,0 +1,44 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+CHANGELOG_PATH_0="$B0/${V0}0/.glusterfs/changelogs"</div><div class='add'>+ROLLOVER_TIME=30</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/${V0}0</div><div class='add'>+TEST $CLI volume set $V0 changelog.changelog on</div><div class='add'>+TEST $CLI volume set $V0 changelog.rollover-time $ROLLOVER_TIME</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+TEST $GFS --volfile-id=$V0 --volfile-server=$H0 $M0;</div><div class='add'>+touch $M0/file1</div><div class='add'>+mv $M0/file1 $M0/rn_file1</div><div class='add'>+mkdir $M0/dir1</div><div class='add'>+mv $M0/dir1 $M0/rn_dir1</div><div class='add'>+</div><div class='add'>+EXPECT "2" check_changelog_op ${CHANGELOG_PATH_0} "RENAME"</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+#####Test on multiple subvolume#####</div><div class='add'>+#==========================================#</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/${V0}{0,1}</div><div class='add'>+TEST $CLI volume set $V0 changelog.changelog on</div><div class='add'>+TEST $CLI volume set $V0 changelog.rollover-time $ROLLOVER_TIME</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+TEST $GFS --volfile-id=$V0 --volfile-server=$H0 $M0;</div><div class='add'>+touch $M0/gluster_file</div><div class='add'>+mv $M0/gluster_file $M0/rn_gluster_file</div><div class='add'>+mkdir $M0/dir1</div><div class='add'>+mv $M0/dir1 $M0/rn_dir1</div><div class='add'>+</div><div class='add'>+EXPECT "2" check_changelog_op ${CHANGELOG_PATH_0} "RENAME"</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/basic/changelog/history-api.t b/tests/basic/changelog/history-api.t<br/>new file mode 100644<br/>index 00000000000..9e63118cef9<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/changelog/history-api.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/changelog/history-api.t</a></div><div class='hunk'>@@ -0,0 +1,42 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+. $(dirname $0)/../../env.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+HISTORY_BIN_PATH=$(dirname $0)/../../utils/changelog</div><div class='add'>+build_tester $HISTORY_BIN_PATH/test-history-api.c -lgfchangelog</div><div class='add'>+</div><div class='add'>+CHANGELOG_PATH_0="$B0/${V0}0/.glusterfs/changelogs"</div><div class='add'>+ROLLOVER_TIME=2</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/${V0}0</div><div class='add'>+TEST $CLI volume set $V0 changelog.changelog on</div><div class='add'>+TEST $CLI volume set $V0 changelog.rollover-time $ROLLOVER_TIME</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+sleep 3</div><div class='add'>+start=$(date '+%s')</div><div class='add'>+</div><div class='add'>+TEST $GFS --volfile-id=$V0 --volfile-server=$H0 $M0;</div><div class='add'>+touch $M0/file{1..10}</div><div class='add'>+</div><div class='add'>+for i in {1..12};do echo "data" &gt; $M0/file$i; sleep 1;done</div><div class='add'>+end=$(date '+%s')</div><div class='add'>+sleep 2</div><div class='add'>+</div><div class='add'>+#Passes as start and end falls in same htime file</div><div class='add'>+EXPECT "0" $HISTORY_BIN_PATH/test-history-api $start $end</div><div class='add'>+</div><div class='add'>+#Wait for changelogs to be in .processed directory</div><div class='add'>+sleep 2</div><div class='add'>+</div><div class='add'>+EXPECT "Y" processed_changelogs "/tmp/scratch_v1/.history/.processed"</div><div class='add'>+TEST rm $HISTORY_BIN_PATH/test-history-api</div><div class='add'>+rm -rf /tmp/scratch_v1</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/basic/cloudsync-sanity.t b/tests/basic/cloudsync-sanity.t<br/>new file mode 100644<br/>index 00000000000..834ba96430c<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/cloudsync-sanity.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/cloudsync-sanity.t</a></div><div class='hunk'>@@ -0,0 +1,29 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../include.rc</div><div class='add'>+. $(dirname $0)/../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 replica 3  $H0:$B0/${V0}{1,2,3,4,5,6,7,8,9};</div><div class='add'>+TEST $CLI volume set $V0 features.cloudsync enable;</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+</div><div class='add'>+## Mount FUSE</div><div class='add'>+TEST $GFS -s $H0 --volfile-id $V0 $M1;</div><div class='add'>+</div><div class='add'>+# This test covers lookup, mkdir, mknod, symlink, link, rename,</div><div class='add'>+# create operations</div><div class='add'>+TEST $(dirname $0)/rpc-coverage.sh $M1</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+TEST cp $(dirname ${0})/gfapi/glfsxmp-coverage.c glfsxmp.c</div><div class='add'>+TEST build_tester ./glfsxmp.c -lgfapi</div><div class='add'>+./glfsxmp $V0 $H0</div><div class='add'>+cleanup_tester ./glfsxmp</div><div class='add'>+rm ./glfsxmp.c</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/basic/ctime/ctime-ec-heal.t b/tests/basic/ctime/ctime-ec-heal.t<br/>new file mode 100644<br/>index 00000000000..142237c5014<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/ctime/ctime-ec-heal.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/ctime/ctime-ec-heal.t</a></div><div class='hunk'>@@ -0,0 +1,70 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+#</div><div class='add'>+# This will test self healing of ctime xattr 'trusted.glusterfs.mdata'</div><div class='add'>+#</div><div class='add'>+###</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+. $(dirname $0)/../../afr.rc</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='add'>+</div><div class='add'>+#cleate and start volume</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 disperse 3 redundancy 1 $H0:$B0/${V0}{1..3}</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+#Mount the volume</div><div class='add'>+TEST $GFS --volfile-id=/$V0 --volfile-server=$H0 $M0;</div><div class='add'>+</div><div class='add'>+# Create files</div><div class='add'>+mkdir $M0/dir1</div><div class='add'>+echo "Initial content" &gt; $M0/file1</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT '3' get_mdata_count $B0/${V0}{1..3}/dir1</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT '1' get_mdata_uniq_count $B0/${V0}{1..3}/dir1</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT '3' get_mdata_count $B0/${V0}{1..3}/file1</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT '1' get_mdata_uniq_count $B0/${V0}{1..3}/file1</div><div class='add'>+</div><div class='add'>+# Kill brick</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}3</div><div class='add'>+</div><div class='add'>+echo "B3 is down" &gt;&gt; $M0/file1</div><div class='add'>+echo "Change dir1 time attributes" &gt; $M0/dir1/dir1_file1</div><div class='add'>+echo "Entry heal file" &gt; $M0/entry_heal_file1</div><div class='add'>+mkdir $M0/entry_heal_dir1</div><div class='add'>+</div><div class='add'>+# Check xattr</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT '3' get_mdata_count $B0/${V0}{1..3}/dir1</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT '2' get_mdata_uniq_count $B0/${V0}{1..3}/dir1</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT '3' get_mdata_count $B0/${V0}{1..3}/file1</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT '2' get_mdata_uniq_count $B0/${V0}{1..3}/file1</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT '2' get_mdata_count $B0/${V0}{1..3}/dir1/dir1_file1</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT '1' get_mdata_uniq_count $B0/${V0}{1..3}/dir1/dir1_file1</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT '2' get_mdata_count $B0/${V0}{1..3}/entry_heal_file1</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT '1' get_mdata_uniq_count $B0/${V0}{1..3}/entry_heal_file1</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT '2' get_mdata_count $B0/${V0}{1..3}/entry_heal_dir1</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT '1' get_mdata_uniq_count $B0/${V0}{1..3}/entry_heal_dir1</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+$CLI volume heal $V0</div><div class='add'>+</div><div class='add'>+# Check xattr</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT '3' get_mdata_count $B0/${V0}{1..3}/dir1</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT '1' get_mdata_uniq_count $B0/${V0}{1..3}/dir1</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT '3' get_mdata_count $B0/${V0}{1..3}/file1</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT '1' get_mdata_uniq_count $B0/${V0}{1..3}/file1</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT '3' get_mdata_count $B0/${V0}{1..3}/dir1/dir1_file1</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT '1' get_mdata_uniq_count $B0/${V0}{1..3}/dir1/dir1_file1</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT '3' get_mdata_count $B0/${V0}{1..3}/entry_heal_file1</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT '1' get_mdata_uniq_count $B0/${V0}{1..3}/entry_heal_file1</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT '3' get_mdata_count $B0/${V0}{1..3}/entry_heal_dir1</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT '1' get_mdata_uniq_count $B0/${V0}{1..3}/entry_heal_dir1</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/basic/ctime/ctime-ec-rebalance.t b/tests/basic/ctime/ctime-ec-rebalance.t<br/>new file mode 100644<br/>index 00000000000..2b73bcdd103<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/ctime/ctime-ec-rebalance.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/ctime/ctime-ec-rebalance.t</a></div><div class='hunk'>@@ -0,0 +1,43 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+#</div><div class='add'>+# This will test healing of ctime xattr 'trusted.glusterfs.mdata' after add-brick and rebalance</div><div class='add'>+#</div><div class='add'>+###</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+. $(dirname $0)/../../fallocate.rc</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='add'>+</div><div class='add'>+#cleate and start volume</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 disperse 3 redundancy 1 $H0:$B0/${V0}{0..5}</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+#Mount the volume</div><div class='add'>+TEST $GFS --volfile-id=/$V0 --volfile-server=$H0 $M0;</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "3" ec_child_up_count $V0 0</div><div class='add'>+</div><div class='add'>+# Create files</div><div class='add'>+mkdir $M0/dir1</div><div class='add'>+echo "test data" &gt; $M0/dir1/file1</div><div class='add'>+</div><div class='add'>+# Add brick</div><div class='add'>+TEST $CLI volume add-brick $V0 $H0:$B0/${V0}{6..8}</div><div class='add'>+</div><div class='add'>+#Trigger rebalance</div><div class='add'>+TEST $CLI volume rebalance $V0 start force</div><div class='add'>+EXPECT_WITHIN $REBALANCE_TIMEOUT "completed" rebalance_status_field $V0</div><div class='add'>+</div><div class='add'>+#Verify ctime xattr heal on directory</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT 'trusted.glusterfs.mdata' check_for_xattr 'trusted.glusterfs.mdata' "$B0/${V0}6/dir1"</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT 'trusted.glusterfs.mdata' check_for_xattr 'trusted.glusterfs.mdata' "$B0/${V0}7/dir1"</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT 'trusted.glusterfs.mdata' check_for_xattr 'trusted.glusterfs.mdata' "$B0/${V0}8/dir1"</div><div class='add'>+</div><div class='add'>+b6_mdata=$(get_mdata "$B0/${V0}6/dir1")</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "${b6_mdata}" get_mdata $B0/${V0}7/dir1</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "${b6_mdata}" get_mdata $B0/${V0}8/dir1</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/basic/ctime/ctime-glfs-init.c b/tests/basic/ctime/ctime-glfs-init.c<br/>new file mode 100644<br/>index 00000000000..e4f197b8f30<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/ctime/ctime-glfs-init.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/ctime/ctime-glfs-init.c</a></div><div class='hunk'>@@ -0,0 +1,68 @@</div><div class='add'>+#include &lt;fcntl.h&gt;</div><div class='add'>+#include &lt;unistd.h&gt;</div><div class='add'>+#include &lt;time.h&gt;</div><div class='add'>+#include &lt;limits.h&gt;</div><div class='add'>+#include &lt;string.h&gt;</div><div class='add'>+#include &lt;unistd.h&gt;</div><div class='add'>+#include &lt;stdio.h&gt;</div><div class='add'>+#include &lt;stdlib.h&gt;</div><div class='add'>+#include &lt;errno.h&gt;</div><div class='add'>+#include &lt;glusterfs/api/glfs.h&gt;</div><div class='add'>+#include &lt;glusterfs/api/glfs-handles.h&gt;</div><div class='add'>+</div><div class='add'>+#define LOG_ERR(msg)                                                           \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        fprintf(stderr, "%s : Error (%s)\n", msg, strerror(errno));            \</div><div class='add'>+    } while (0)</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+main(int argc, char *argv[])</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+    char *hostname = NULL;</div><div class='add'>+    char *volname = NULL;</div><div class='add'>+    char *logfile = NULL;</div><div class='add'>+    glfs_t *fs = NULL;</div><div class='add'>+</div><div class='add'>+    if (argc != 4) {</div><div class='add'>+        fprintf(stderr, "Invalid argument\n");</div><div class='add'>+        exit(1);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    hostname = argv[1];</div><div class='add'>+    volname = argv[2];</div><div class='add'>+    logfile = argv[3];</div><div class='add'>+</div><div class='add'>+    fs = glfs_new(volname);</div><div class='add'>+    if (!fs) {</div><div class='add'>+        LOG_ERR("glfs_new failed");</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = glfs_set_volfile_server(fs, "tcp", hostname, 24007);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        LOG_ERR("glfs_set_volfile_server failed");</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = glfs_set_logging(fs, logfile, 7);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        LOG_ERR("glfs_set_logging failed");</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = glfs_init(fs);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        LOG_ERR("glfs_init failed");</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    glfs_fini(fs);</div><div class='add'>+    fs = NULL;</div><div class='add'>+    return 0;</div><div class='add'>+err:</div><div class='add'>+    glfs_fini(fs);</div><div class='add'>+    fs = NULL;</div><div class='add'>+</div><div class='add'>+    return -1;</div><div class='add'>+}</div><div class='head'>diff --git a/tests/basic/ctime/ctime-glfs-init.t b/tests/basic/ctime/ctime-glfs-init.t<br/>new file mode 100644<br/>index 00000000000..56d7d6caee0<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/ctime/ctime-glfs-init.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/ctime/ctime-glfs-init.t</a></div><div class='hunk'>@@ -0,0 +1,23 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 replica 3 ${H0}:$B0/brick{1,2,3};</div><div class='add'>+TEST $CLI volume set $V0 performance.stat-prefetch off</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+</div><div class='add'>+logdir=`gluster --print-logdir`</div><div class='add'>+</div><div class='add'>+TEST build_tester $(dirname $0)/ctime-glfs-init.c -lgfapi -lpthread</div><div class='add'>+</div><div class='add'>+TEST ./$(dirname $0)/ctime-glfs-init ${H0} $V0 $logdir/ctime-glfs-init.log</div><div class='add'>+</div><div class='add'>+cleanup_tester $(dirname $0)/ctime-glfs-init</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='head'>diff --git a/tests/basic/ctime/ctime-heal-symlinks.t b/tests/basic/ctime/ctime-heal-symlinks.t<br/>new file mode 100644<br/>index 00000000000..547b1807e94<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/ctime/ctime-heal-symlinks.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/ctime/ctime-heal-symlinks.t</a></div><div class='hunk'>@@ -0,0 +1,65 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+. $(dirname $0)/../../afr.rc</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+###############################################################################</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 replica 3 $H0:$B0/${V0}{0,1,2}</div><div class='add'>+TEST $CLI volume set $V0 performance.stat-prefetch off</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+TEST glusterfs --volfile-id=$V0 --volfile-server=$H0 --entry-timeout=0 $M0;</div><div class='add'>+</div><div class='add'>+cd $M0</div><div class='add'>+TEST "echo hello_world &gt; FILE"</div><div class='add'>+TEST ln -s FILE SOFTLINK</div><div class='add'>+</div><div class='add'>+# Remove symlink only (not the .glusterfs entry) and trigger named heal.</div><div class='add'>+TEST rm -f $B0/${V0}2/SOFTLINK</div><div class='add'>+TEST stat SOFTLINK</div><div class='add'>+</div><div class='add'>+# To heal and clear new-entry mark on source bricks.</div><div class='add'>+TEST $CLI volume heal $V0</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "^0$" get_pending_heal_count $V0</div><div class='add'>+</div><div class='add'>+EXPECT 2 stat -c %h  $B0/${V0}2/SOFTLINK</div><div class='add'>+EXPECT "hello_world" cat $B0/${V0}2/SOFTLINK</div><div class='add'>+</div><div class='add'>+cd -</div><div class='add'>+cleanup</div><div class='add'>+###############################################################################</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 disperse 3 redundancy 1  $H0:$B0/${V0}{0,1,2}</div><div class='add'>+TEST $CLI volume set $V0 performance.stat-prefetch off</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+TEST glusterfs --volfile-id=$V0 --volfile-server=$H0 --entry-timeout=0 $M0;</div><div class='add'>+</div><div class='add'>+cd $M0</div><div class='add'>+TEST "echo hello_world &gt; FILE"</div><div class='add'>+TEST ln -s FILE SOFTLINK</div><div class='add'>+</div><div class='add'>+# Remove symlink only (not the .glusterfs entry) and trigger named heal.</div><div class='add'>+TEST rm -f $B0/${V0}2/SOFTLINK</div><div class='add'>+TEST stat SOFTLINK</div><div class='add'>+</div><div class='add'>+# To heal and clear new-entry mark on source bricks.</div><div class='add'>+TEST $CLI volume heal $V0</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "^0$" get_pending_heal_count $V0</div><div class='add'>+</div><div class='add'>+EXPECT 2 stat -c %h  $B0/${V0}2/SOFTLINK</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}0</div><div class='add'>+cd -</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+TEST glusterfs --volfile-id=$V0 --volfile-server=$H0 --entry-timeout=0 $M0;</div><div class='add'>+cd $M0</div><div class='add'>+EXPECT "hello_world" cat SOFTLINK</div><div class='add'>+</div><div class='add'>+cd -</div><div class='add'>+cleanup</div><div class='add'>+###############################################################################</div><div class='head'>diff --git a/tests/basic/ctime/ctime-mdata-legacy-files.t b/tests/basic/ctime/ctime-mdata-legacy-files.t<br/>new file mode 100644<br/>index 00000000000..2e782d5c99d<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/ctime/ctime-mdata-legacy-files.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/ctime/ctime-mdata-legacy-files.t</a></div><div class='hunk'>@@ -0,0 +1,83 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+. $(dirname $0)/../../afr.rc</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+###############################################################################</div><div class='add'>+#Replica volume</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 replica 3 $H0:$B0/${V0}{0,1,2}</div><div class='add'>+TEST $CLI volume set $V0 performance.stat-prefetch off</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+TEST glusterfs --volfile-id=$V0 --volfile-server=$H0 --entry-timeout=0 $M0;</div><div class='add'>+</div><div class='add'>+#Disable ctime and create file, file doesn't contain "trusted.glusterfs.mdata" xattr</div><div class='add'>+TEST $CLI volume set $V0 ctime off</div><div class='add'>+</div><div class='add'>+TEST "mkdir $M0/DIR"</div><div class='add'>+TEST "echo hello_world &gt; $M0/DIR/FILE"</div><div class='add'>+</div><div class='add'>+#Verify absence of xattr</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "" check_for_xattr 'trusted.glusterfs.mdata' "$B0/${V0}0/DIR"</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "" check_for_xattr 'trusted.glusterfs.mdata' "$B0/${V0}0/DIR/FILE"</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "" check_for_xattr 'trusted.glusterfs.mdata' "$B0/${V0}1/DIR"</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "" check_for_xattr 'trusted.glusterfs.mdata' "$B0/${V0}1/DIR/FILE"</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "" check_for_xattr 'trusted.glusterfs.mdata' "$B0/${V0}2/DIR"</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "" check_for_xattr 'trusted.glusterfs.mdata' "$B0/${V0}2/DIR/FILE"</div><div class='add'>+</div><div class='add'>+#Enable ctime</div><div class='add'>+TEST $CLI volume set $V0 ctime on</div><div class='add'>+sleep 3</div><div class='add'>+TEST stat $M0/DIR/FILE</div><div class='add'>+</div><div class='add'>+#Verify presence "trusted.glusterfs.mdata" xattr on backend</div><div class='add'>+#The lookup above should have created xattr</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT 'trusted.glusterfs.mdata' check_for_xattr 'trusted.glusterfs.mdata' "$B0/${V0}0/DIR"</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT 'trusted.glusterfs.mdata' check_for_xattr 'trusted.glusterfs.mdata' "$B0/${V0}0/DIR/FILE"</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT 'trusted.glusterfs.mdata' check_for_xattr 'trusted.glusterfs.mdata' "$B0/${V0}1/DIR"</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT 'trusted.glusterfs.mdata' check_for_xattr 'trusted.glusterfs.mdata' "$B0/${V0}1/DIR/FILE"</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT 'trusted.glusterfs.mdata' check_for_xattr 'trusted.glusterfs.mdata' "$B0/${V0}2/DIR"</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT 'trusted.glusterfs.mdata' check_for_xattr 'trusted.glusterfs.mdata' "$B0/${V0}2/DIR/FILE"</div><div class='add'>+</div><div class='add'>+###############################################################################</div><div class='add'>+#Disperse Volume</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V1 disperse 3 redundancy 1  $H0:$B0/${V1}{0,1,2}</div><div class='add'>+TEST $CLI volume set $V1 performance.stat-prefetch off</div><div class='add'>+TEST $CLI volume start $V1</div><div class='add'>+</div><div class='add'>+TEST glusterfs --volfile-id=$V1 --volfile-server=$H0 --entry-timeout=0 $M1;</div><div class='add'>+</div><div class='add'>+#Disable ctime and create file, file doesn't contain "trusted.glusterfs.mdata" xattr</div><div class='add'>+TEST $CLI volume set $V1 ctime off</div><div class='add'>+TEST "mkdir $M1/DIR"</div><div class='add'>+TEST "echo hello_world &gt; $M1/DIR/FILE"</div><div class='add'>+</div><div class='add'>+#Verify absence of xattr</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "" check_for_xattr 'trusted.glusterfs.mdata' "$B0/${V1}0/DIR"</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "" check_for_xattr 'trusted.glusterfs.mdata' "$B0/${V1}0/DIR/FILE"</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "" check_for_xattr 'trusted.glusterfs.mdata' "$B0/${V1}1/DIR"</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "" check_for_xattr 'trusted.glusterfs.mdata' "$B0/${V1}1/DIR/FILE"</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "" check_for_xattr 'trusted.glusterfs.mdata' "$B0/${V1}2/DIR"</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "" check_for_xattr 'trusted.glusterfs.mdata' "$B0/${V1}2/DIR/FILE"</div><div class='add'>+</div><div class='add'>+#Enable ctime</div><div class='add'>+TEST $CLI volume set $V1 ctime on</div><div class='add'>+sleep 3</div><div class='add'>+TEST stat $M1/DIR/FILE</div><div class='add'>+</div><div class='add'>+#Verify presence "trusted.glusterfs.mdata" xattr on backend</div><div class='add'>+#The lookup above should have created xattr</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT 'trusted.glusterfs.mdata' check_for_xattr 'trusted.glusterfs.mdata' "$B0/${V1}0/DIR"</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT 'trusted.glusterfs.mdata' check_for_xattr 'trusted.glusterfs.mdata' "$B0/${V1}0/DIR/FILE"</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT 'trusted.glusterfs.mdata' check_for_xattr 'trusted.glusterfs.mdata' "$B0/${V1}1/DIR"</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT 'trusted.glusterfs.mdata' check_for_xattr 'trusted.glusterfs.mdata' "$B0/${V1}1/DIR/FILE"</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT 'trusted.glusterfs.mdata' check_for_xattr 'trusted.glusterfs.mdata' "$B0/${V1}2/DIR"</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT 'trusted.glusterfs.mdata' check_for_xattr 'trusted.glusterfs.mdata' "$B0/${V1}2/DIR/FILE"</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+###############################################################################</div><div class='head'>diff --git a/tests/basic/ctime/ctime-noatime.t b/tests/basic/ctime/ctime-noatime.t<br/>new file mode 100644<br/>index 00000000000..609ccbd72c1<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/ctime/ctime-noatime.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/ctime/ctime-noatime.t</a></div><div class='hunk'>@@ -0,0 +1,49 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+. $(dirname $0)/../../afr.rc</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+function atime_compare {</div><div class='add'>+    local atime=$1</div><div class='add'>+    local file_name=$2</div><div class='add'>+    local atime1=$(stat -c "%X" $file_name)</div><div class='add'>+</div><div class='add'>+    if [ $atime == $atime1 ]</div><div class='add'>+    then</div><div class='add'>+        echo "0"</div><div class='add'>+    else</div><div class='add'>+        echo "1"</div><div class='add'>+    fi</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 replica 3 $H0:$B0/${V0}{0,1,2}</div><div class='add'>+TEST $CLI volume set $V0 performance.stat-prefetch off</div><div class='add'>+TEST $CLI volume set $V0 performance.read-ahead off</div><div class='add'>+TEST $CLI volume set $V0 performance.quick-read off</div><div class='add'>+TEST $CLI volume set $V0 performance.read-after-open off</div><div class='add'>+TEST $CLI volume set $V0 performance.open-behind off</div><div class='add'>+TEST $CLI volume set $V0 performance.write-behind off</div><div class='add'>+TEST $CLI volume set $V0 performance.io-cache off</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+TEST glusterfs --volfile-id=$V0 --volfile-server=$H0 --entry-timeout=0 $M0;</div><div class='add'>+</div><div class='add'>+cd $M0</div><div class='add'>+TEST "echo hello_world &gt; FILE"</div><div class='add'>+atime1=$(stat -c "%X" FILE)</div><div class='add'>+</div><div class='add'>+TEST "cat FILE &gt; /dev/null"</div><div class='add'>+EXPECT "0" atime_compare $atime1 FILE</div><div class='add'>+</div><div class='add'>+sleep 1</div><div class='add'>+</div><div class='add'>+TEST $CLI volume set $V0 noatime off</div><div class='add'>+TEST "cat FILE &gt; /dev/null"</div><div class='add'>+EXPECT "1" atime_compare $atime1 FILE</div><div class='add'>+</div><div class='add'>+cd -</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/basic/ctime/ctime-readdir.c b/tests/basic/ctime/ctime-readdir.c<br/>new file mode 100644<br/>index 00000000000..8760db29ae8<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/ctime/ctime-readdir.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/ctime/ctime-readdir.c</a></div><div class='hunk'>@@ -0,0 +1,29 @@</div><div class='add'>+#include &lt;stdio.h&gt;</div><div class='add'>+#include &lt;dirent.h&gt;</div><div class='add'>+#include &lt;string.h&gt;</div><div class='add'>+#include &lt;assert.h&gt;</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+main(int argc, char **argv)</div><div class='add'>+{</div><div class='add'>+    DIR *dir = NULL;</div><div class='add'>+    struct dirent *entry = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    char *path = NULL;</div><div class='add'>+</div><div class='add'>+    assert(argc == 2);</div><div class='add'>+    path = argv[1];</div><div class='add'>+</div><div class='add'>+    dir = opendir(path);</div><div class='add'>+    if (!dir) {</div><div class='add'>+        printf("opendir(%s) failed.\n", path);</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    while ((entry = readdir(dir)) != NULL) {</div><div class='add'>+    }</div><div class='add'>+    if (dir)</div><div class='add'>+        closedir(dir);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='head'>diff --git a/tests/basic/ctime/ctime-readdir.t b/tests/basic/ctime/ctime-readdir.t<br/>new file mode 100644<br/>index 00000000000..4564fc1b667<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/ctime/ctime-readdir.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/ctime/ctime-readdir.t</a></div><div class='hunk'>@@ -0,0 +1,50 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 replica 3 ${H0}:$B0/brick{1,2,3};</div><div class='add'>+TEST $CLI volume set $V0 performance.stat-prefetch on</div><div class='add'>+TEST $CLI volume set $V0 performance.readdir-ahead off</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+</div><div class='add'>+TEST glusterfs --volfile-id=$V0 --volfile-server=$H0 --entry-timeout=0 $M0;</div><div class='add'>+</div><div class='add'>+TEST mkdir $M0/dir0</div><div class='add'>+TEST "echo hello_world &gt; $M0/dir0/FILE"</div><div class='add'>+</div><div class='add'>+ctime1=$(stat -c %Z $M0/dir0/FILE)</div><div class='add'>+echo "Mount change time: $ctime1"</div><div class='add'>+</div><div class='add'>+sleep 2</div><div class='add'>+</div><div class='add'>+#Write to back end directly to modify ctime of backend file</div><div class='add'>+TEST "echo write_from_backend &gt;&gt; $B0/brick1/dir0/FILE"</div><div class='add'>+TEST "echo write_from_backend &gt;&gt; $B0/brick2/dir0/FILE"</div><div class='add'>+TEST "echo write_from_backend &gt;&gt; $B0/brick3/dir0/FILE"</div><div class='add'>+echo "Backend change time"</div><div class='add'>+echo "brick1: $(stat -c %Z $B0/brick1/dir0/FILE)"</div><div class='add'>+echo "brick2: $(stat -c %Z $B0/brick2/dir0/FILE)"</div><div class='add'>+echo "brick3: $(stat -c %Z $B0/brick3/dir0/FILE)"</div><div class='add'>+</div><div class='add'>+#Stop and start to hit the case of no inode for readdir</div><div class='add'>+TEST umount $M0</div><div class='add'>+TEST $CLI volume stop $V0</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+TEST glusterfs --volfile-id=$V0 --volfile-server=$H0 --entry-timeout=0 $M0;</div><div class='add'>+</div><div class='add'>+TEST build_tester $(dirname $0)/ctime-readdir.c</div><div class='add'>+</div><div class='add'>+#Do readdir</div><div class='add'>+TEST ./$(dirname $0)/ctime-readdir $M0/dir0</div><div class='add'>+</div><div class='add'>+EXPECT "$ctime1" stat -c %Z $M0/dir0/FILE</div><div class='add'>+echo "Mount change time after readdir $(stat -c %Z $M0/dir0/FILE)"</div><div class='add'>+</div><div class='add'>+cleanup_tester $(dirname $0)/ctime-readdir</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/basic/ctime/ctime-rep-heal.t b/tests/basic/ctime/ctime-rep-heal.t<br/>new file mode 100644<br/>index 00000000000..20517c74971<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/ctime/ctime-rep-heal.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/ctime/ctime-rep-heal.t</a></div><div class='hunk'>@@ -0,0 +1,70 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+#</div><div class='add'>+# This will test self healing of ctime xattr 'trusted.glusterfs.mdata'</div><div class='add'>+#</div><div class='add'>+###</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+. $(dirname $0)/../../afr.rc</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='add'>+</div><div class='add'>+#cleate and start volume</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 replica 3 $H0:$B0/${V0}{1..3}</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+#Mount the volume</div><div class='add'>+TEST $GFS --volfile-id=/$V0 --volfile-server=$H0 $M0;</div><div class='add'>+</div><div class='add'>+# Create files</div><div class='add'>+mkdir $M0/dir1</div><div class='add'>+echo "Initial content" &gt; $M0/file1</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT '3' get_mdata_count $B0/${V0}{1..3}/dir1</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT '1' get_mdata_uniq_count $B0/${V0}{1..3}/dir1</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT '3' get_mdata_count $B0/${V0}{1..3}/file1</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT '1' get_mdata_uniq_count $B0/${V0}{1..3}/file1</div><div class='add'>+</div><div class='add'>+# Kill brick</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}3</div><div class='add'>+</div><div class='add'>+echo "B3 is down" &gt;&gt; $M0/file1</div><div class='add'>+echo "Change dir1 time attributes" &gt; $M0/dir1/dir1_file1</div><div class='add'>+echo "Entry heal file" &gt; $M0/entry_heal_file1</div><div class='add'>+mkdir $M0/entry_heal_dir1</div><div class='add'>+</div><div class='add'>+# Check xattr</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT '3' get_mdata_count $B0/${V0}{1..3}/dir1</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT '2' get_mdata_uniq_count $B0/${V0}{1..3}/dir1</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT '3' get_mdata_count $B0/${V0}{1..3}/file1</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT '2' get_mdata_uniq_count $B0/${V0}{1..3}/file1</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT '2' get_mdata_count $B0/${V0}{1..3}/dir1/dir1_file1</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT '1' get_mdata_uniq_count $B0/${V0}{1..3}/dir1/dir1_file1</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT '2' get_mdata_count $B0/${V0}{1..3}/entry_heal_file1</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT '1' get_mdata_uniq_count $B0/${V0}{1..3}/entry_heal_file1</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT '2' get_mdata_count $B0/${V0}{1..3}/entry_heal_dir1</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT '1' get_mdata_uniq_count $B0/${V0}{1..3}/entry_heal_dir1</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+$CLI volume heal $V0</div><div class='add'>+</div><div class='add'>+# Check xattr</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT '3' get_mdata_count $B0/${V0}{1..3}/dir1</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT '1' get_mdata_uniq_count $B0/${V0}{1..3}/dir1</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT '3' get_mdata_count $B0/${V0}{1..3}/file1</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT '1' get_mdata_uniq_count $B0/${V0}{1..3}/file1</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT '3' get_mdata_count $B0/${V0}{1..3}/dir1/dir1_file1</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT '1' get_mdata_uniq_count $B0/${V0}{1..3}/dir1/dir1_file1</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT '3' get_mdata_count $B0/${V0}{1..3}/entry_heal_file1</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT '1' get_mdata_uniq_count $B0/${V0}{1..3}/entry_heal_file1</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT '3' get_mdata_count $B0/${V0}{1..3}/entry_heal_dir1</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT '1' get_mdata_uniq_count $B0/${V0}{1..3}/entry_heal_dir1</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/basic/ctime/ctime-rep-rebalance.t b/tests/basic/ctime/ctime-rep-rebalance.t<br/>new file mode 100644<br/>index 00000000000..866cf87e6cb<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/ctime/ctime-rep-rebalance.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/ctime/ctime-rep-rebalance.t</a></div><div class='hunk'>@@ -0,0 +1,41 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+#</div><div class='add'>+# This will test healing of ctime xattr 'trusted.glusterfs.mdata' after add-brick and rebalance</div><div class='add'>+#</div><div class='add'>+###</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+. $(dirname $0)/../../afr.rc</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='add'>+</div><div class='add'>+#cleate and start volume</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 replica 3 $H0:$B0/${V0}{0..5}</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+#Mount the volume</div><div class='add'>+TEST $GFS --volfile-id=/$V0 --volfile-server=$H0 $M0;</div><div class='add'>+</div><div class='add'>+# Create files</div><div class='add'>+mkdir $M0/dir1</div><div class='add'>+</div><div class='add'>+# Add brick</div><div class='add'>+TEST $CLI volume add-brick $V0 $H0:$B0/${V0}{6..8}</div><div class='add'>+</div><div class='add'>+#Trigger rebalance</div><div class='add'>+TEST $CLI volume rebalance $V0 start force</div><div class='add'>+EXPECT_WITHIN $REBALANCE_TIMEOUT "completed" rebalance_status_field $V0</div><div class='add'>+</div><div class='add'>+#Verify ctime xattr heal on directory</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT 'trusted.glusterfs.mdata' check_for_xattr 'trusted.glusterfs.mdata' "$B0/${V0}6/dir1"</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT 'trusted.glusterfs.mdata' check_for_xattr 'trusted.glusterfs.mdata' "$B0/${V0}7/dir1"</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT 'trusted.glusterfs.mdata' check_for_xattr 'trusted.glusterfs.mdata' "$B0/${V0}8/dir1"</div><div class='add'>+</div><div class='add'>+b6_mdata=$(get_mdata "$B0/${V0}6/dir1")</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "${b6_mdata}" get_mdata $B0/${V0}7/dir1</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "${b6_mdata}" get_mdata $B0/${V0}8/dir1</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/basic/ctime/ctime-utimesat.t b/tests/basic/ctime/ctime-utimesat.t<br/>new file mode 100644<br/>index 00000000000..540e57aec83<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/ctime/ctime-utimesat.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/ctime/ctime-utimesat.t</a></div><div class='hunk'>@@ -0,0 +1,28 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+. $(dirname $0)/../../afr.rc</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 replica 3 $H0:$B0/${V0}{0,1,2}</div><div class='add'>+TEST $CLI volume set $V0 performance.stat-prefetch off</div><div class='add'>+TEST $CLI volume set $V0 performance.read-ahead off</div><div class='add'>+TEST $CLI volume set $V0 performance.quick-read off</div><div class='add'>+TEST $CLI volume set $V0 performance.read-after-open off</div><div class='add'>+TEST $CLI volume set $V0 performance.open-behind off</div><div class='add'>+TEST $CLI volume set $V0 performance.write-behind off</div><div class='add'>+TEST $CLI volume set $V0 performance.io-cache off</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+TEST glusterfs --volfile-id=$V0 --volfile-server=$H0 --entry-timeout=0 $M0;</div><div class='add'>+</div><div class='add'>+touch $M0/FILE</div><div class='add'>+</div><div class='add'>+atime=$(stat -c "%.X" $M0/FILE)</div><div class='add'>+EXPECT $atime stat -c "%.Y" $M0/FILE</div><div class='add'>+EXPECT $atime stat -c "%.Z" $M0/FILE</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/basic/distribute/brick-down.t b/tests/basic/distribute/brick-down.t<br/>new file mode 100644<br/>index 00000000000..522ccc07210<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/distribute/brick-down.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/distribute/brick-down.t</a></div><div class='hunk'>@@ -0,0 +1,83 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+. $(dirname $0)/../../common-utils.rc</div><div class='add'>+. $(dirname $0)/../../dht.rc</div><div class='add'>+</div><div class='add'>+# Test 1 overview:</div><div class='add'>+# ----------------</div><div class='add'>+# Test whether lookups are sent after a brick comes up again</div><div class='add'>+#</div><div class='add'>+# 1. Create a 3 brick pure distribute volume</div><div class='add'>+# 2. Fuse mount the volume so the layout is set on the root</div><div class='add'>+# 3. Kill one brick and try to create a directory which hashes to that brick.</div><div class='add'>+#    It should fail with EIO.</div><div class='add'>+# 4. Restart the brick that was killed.</div><div class='add'>+# 5. Do not remount the volume. Try to create the same directory as in step 3.</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/$V0-{1..3}</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+# We want the lookup to reach DHT</div><div class='add'>+TEST $CLI volume set $V0 performance.stat-prefetch off</div><div class='add'>+</div><div class='add'>+# Mount using FUSE and lookup the mount so a layout is set on the brick root</div><div class='add'>+TEST glusterfs --entry-timeout=0 --attribute-timeout=0 -s $H0 --volfile-id $V0 $M0</div><div class='add'>+</div><div class='add'>+ls $M0/</div><div class='add'>+</div><div class='add'>+TEST mkdir $M0/level1</div><div class='add'>+</div><div class='add'>+# Find a dirname that will hash to the brick we are going to kill</div><div class='add'>+hashed=$V0-client-1</div><div class='add'>+TEST dht_first_filename_with_hashsubvol "$hashed" $M0 "dir-"</div><div class='add'>+roottestdir=$fn_return_val</div><div class='add'>+</div><div class='add'>+hashed=$V0-client-1</div><div class='add'>+TEST dht_first_filename_with_hashsubvol "$hashed" $M0/level1 "dir-"</div><div class='add'>+level1testdir=$fn_return_val</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/$V0-2</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "0" brick_up_status $V0 $H0 $B0/$V0-2</div><div class='add'>+</div><div class='add'>+TEST $CLI volume status $V0</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+# Unmount and mount the volume again so dht has an incomplete in memory layout</div><div class='add'>+</div><div class='add'>+umount -f $M0</div><div class='add'>+TEST glusterfs --entry-timeout=0 --attribute-timeout=0 -s $H0 --volfile-id $V0 $M0</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+mkdir $M0/$roottestdir</div><div class='add'>+TEST [ $? -ne 0 ]</div><div class='add'>+</div><div class='add'>+mkdir $M0/level1/$level1testdir</div><div class='add'>+TEST [ $? -ne 0 ]</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status $V0 $H0 $B0/$V0-2</div><div class='add'>+</div><div class='add'>+#$CLI volume status</div><div class='add'>+</div><div class='add'>+# It takes a while for the client to reconnect to the brick</div><div class='add'>+sleep 5</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+mkdir $M0/$roottestdir</div><div class='add'>+TEST [ $? -eq 0 ]</div><div class='add'>+</div><div class='add'>+mkdir $M0/$level1/level1testdir</div><div class='add'>+TEST [ $? -eq 0 ]</div><div class='add'>+</div><div class='add'>+# Cleanup</div><div class='add'>+cleanup</div><div class='add'>+</div><div class='add'>+</div><div class='head'>diff --git a/tests/basic/distribute/bug-1265677-use-readdirp.t b/tests/basic/distribute/bug-1265677-use-readdirp.t<br/>new file mode 100644<br/>index 00000000000..eef8affc8b9<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/distribute/bug-1265677-use-readdirp.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/distribute/bug-1265677-use-readdirp.t</a></div><div class='hunk'>@@ -0,0 +1,38 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+# This test checks use-readdirp disable/enable for dht</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/${V0}{0..1}</div><div class='add'>+TEST $CLI volume set $V0 nfs.disable yes</div><div class='add'>+TEST $CLI volume set $V0 dht.force-readdirp yes</div><div class='add'>+TEST $CLI volume set $V0 performance.readdir-ahead off</div><div class='add'>+TEST $CLI volume set $V0 performance.force-readdirp no</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+TEST $GFS --volfile-id=/$V0 --volfile-server=$H0 --use-readdirp=no $M0;</div><div class='add'>+TEST mkdir $M0/d</div><div class='add'>+TEST touch $M0/d/{1..10}</div><div class='add'>+</div><div class='add'>+TEST $CLI volume profile $V0 start</div><div class='add'>+#Clear all the fops till now</div><div class='add'>+TEST $CLI volume profile $V0 info</div><div class='add'>+</div><div class='add'>+EXPECT "^10$" echo $(ls $M0/d | wc -l)</div><div class='add'>+EXPECT_NOT "^0$" echo $($CLI volume profile $V0 info incremental | grep -w READDIRP | wc -l)</div><div class='add'>+EXPECT "^10$" echo $(ls $M0/d | wc -l)</div><div class='add'>+EXPECT "^0$" echo $($CLI volume profile $V0 info incremental | grep -w READDIR | wc -l)</div><div class='add'>+</div><div class='add'>+TEST $CLI volume set $V0 dht.force-readdirp no</div><div class='add'>+EXPECT_WITHIN $CONFIG_UPDATE_TIMEOUT "0" mount_get_option_value $M0 $V0-dht use-readdirp</div><div class='add'>+</div><div class='add'>+EXPECT "^10$" echo $(ls $M0/d | wc -l)</div><div class='add'>+EXPECT "^0$" echo $($CLI volume profile $V0 info incremental | grep -w READDIRP | wc -l)</div><div class='add'>+EXPECT "^10$" echo $(ls $M0/d | wc -l)</div><div class='add'>+EXPECT_NOT "^0$" echo $($CLI volume profile $V0 info incremental | grep -w READDIR | wc -l)</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/basic/distribute/debug-xattrs.t b/tests/basic/distribute/debug-xattrs.t<br/>new file mode 100644<br/>index 00000000000..6d87c0e8671<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/distribute/debug-xattrs.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/distribute/debug-xattrs.t</a></div><div class='hunk'>@@ -0,0 +1,54 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+. $(dirname $0)/../../nfs.rc</div><div class='add'>+. $(dirname $0)/../../common-utils.rc</div><div class='add'>+</div><div class='add'>+# Test overview: Test the virtual xattrs dht provides for debugging</div><div class='add'>+</div><div class='add'>+# Test 1 : "dht.file.hashed-subvol.&lt;filename&gt;"</div><div class='add'>+# Get the hashed subvolume for file1 in dir1 using xattr</div><div class='add'>+# Create file1 in dir1</div><div class='add'>+# Check if the file is created in the brick returned by xattr</div><div class='add'>+</div><div class='add'>+hashdebugxattr="dht.file.hashed-subvol."</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/$V0-{0..3}</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+# Mount using FUSE and create a file</div><div class='add'>+TEST glusterfs -s $H0 --volfile-id $V0 $M0</div><div class='add'>+</div><div class='add'>+# Test 1 : "dht.file.hashed-subvol.&lt;filename&gt;"</div><div class='add'>+# Get the hashed subvolume for file1 in dir1 using xattr</div><div class='add'>+# Create file1 in dir1</div><div class='add'>+# Check if the file is created in the brick returned by xattr</div><div class='add'>+# Create a directory on $M0</div><div class='add'>+</div><div class='add'>+TEST mkdir $M0/dir1</div><div class='add'>+</div><div class='add'>+xattrname=$hashdebugxattr"file1"</div><div class='add'>+</div><div class='add'>+hashed=$(getfattr --only-values -n "$xattrname" $M0/dir1)</div><div class='add'>+</div><div class='add'>+# Get the brick path for $hashed</div><div class='add'>+brickpath=$(cat "$M0/.meta/graphs/active/$hashed/options/remote-subvolume")</div><div class='add'>+brickpath=$brickpath"/dir1/file1"</div><div class='add'>+</div><div class='add'>+# Create the file for which we checked the xattr</div><div class='add'>+TEST touch $M0/dir1/file1</div><div class='add'>+TEST stat $brickpath</div><div class='add'>+</div><div class='add'>+# Non-existent directory</div><div class='add'>+TEST ! getfattr --only-values -n "$xattrname" $M0/dir2</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+# Cleanup</div><div class='add'>+cleanup</div><div class='add'>+</div><div class='head'>diff --git a/tests/basic/distribute/dir-heal.t b/tests/basic/distribute/dir-heal.t<br/>new file mode 100644<br/>index 00000000000..851f765b245<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/distribute/dir-heal.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/distribute/dir-heal.t</a></div><div class='hunk'>@@ -0,0 +1,145 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+. $(dirname $0)/../../nfs.rc</div><div class='add'>+. $(dirname $0)/../../common-utils.rc</div><div class='add'>+</div><div class='add'>+# Test 1 overview:</div><div class='add'>+# ----------------</div><div class='add'>+#</div><div class='add'>+# 1. Kill one brick of the volume.</div><div class='add'>+# 2. Create directories and change directory properties.</div><div class='add'>+# 3. Bring up the brick and access the directory</div><div class='add'>+# 4. Check the permissions and xattrs on the backend</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/$V0-{1..3}</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+# We want the lookup to reach DHT</div><div class='add'>+TEST $CLI volume set $V0 performance.stat-prefetch off</div><div class='add'>+</div><div class='add'>+# Mount using FUSE , kill a brick and create directories</div><div class='add'>+TEST glusterfs --entry-timeout=0 --attribute-timeout=0 -s $H0 --volfile-id $V0 $M0</div><div class='add'>+</div><div class='add'>+ls $M0/</div><div class='add'>+cd $M0</div><div class='add'>+</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/$V0-1</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "0" brick_up_status $V0 $H0 $B0/$V0-1</div><div class='add'>+</div><div class='add'>+TEST mkdir dir{1..4}</div><div class='add'>+</div><div class='add'>+# No change for dir1</div><div class='add'>+# Change permissions for dir2</div><div class='add'>+# Set xattr on dir3</div><div class='add'>+# Change permissions and set xattr on dir4</div><div class='add'>+</div><div class='add'>+TEST chmod 777 $M0/dir2</div><div class='add'>+</div><div class='add'>+TEST setfattr -n "user.test" -v "test" $M0/dir3</div><div class='add'>+</div><div class='add'>+TEST chmod 777 $M0/dir4</div><div class='add'>+TEST setfattr -n "user.test" -v "test" $M0/dir4</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+# Start all bricks</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status $V0 $H0 $B0/$V0-1</div><div class='add'>+</div><div class='add'>+#$CLI volume status</div><div class='add'>+</div><div class='add'>+# It takes a while for the client to reconnect to the brick</div><div class='add'>+sleep 5</div><div class='add'>+</div><div class='add'>+stat $M0/dir* &gt; /dev/null</div><div class='add'>+</div><div class='add'>+# Check that directories have been created on the brick that was killed</div><div class='add'>+</div><div class='add'>+TEST ls $B0/$V0-1/dir1</div><div class='add'>+</div><div class='add'>+TEST ls $B0/$V0-1/dir2</div><div class='add'>+EXPECT "777" stat -c "%a" $B0/$V0-1/dir2</div><div class='add'>+</div><div class='add'>+TEST ls $B0/$V0-1/dir3</div><div class='add'>+EXPECT "test" getfattr -n "user.test" --absolute-names --only-values $B0/$V0-1/dir3</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+TEST ls $B0/$V0-1/dir4</div><div class='add'>+EXPECT "777" stat -c "%a" $B0/$V0-1/dir4</div><div class='add'>+EXPECT "test" getfattr -n "user.test" --absolute-names --only-values $B0/$V0-1/dir4</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+TEST rm -rf $M0/*</div><div class='add'>+</div><div class='add'>+cd</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+# Test 2 overview:</div><div class='add'>+# ----------------</div><div class='add'>+# 1. Create directories with all bricks up.</div><div class='add'>+# 2. Kill a brick and change directory properties and set user xattr.</div><div class='add'>+# 2. Bring up the brick and access the directory</div><div class='add'>+# 3. Check the permissions and xattrs on the backend</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+TEST glusterfs --entry-timeout=0 --attribute-timeout=0 -s $H0 --volfile-id $V0 $M0</div><div class='add'>+</div><div class='add'>+ls $M0/</div><div class='add'>+cd $M0</div><div class='add'>+TEST mkdir dir{1..4}</div><div class='add'>+</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/$V0-1</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "0" brick_up_status $V0 $H0 $B0/$V0-1</div><div class='add'>+</div><div class='add'>+# No change for dir1</div><div class='add'>+# Change permissions for dir2</div><div class='add'>+# Set xattr on dir3</div><div class='add'>+# Change permissions and set xattr on dir4</div><div class='add'>+</div><div class='add'>+TEST chmod 777 $M0/dir2</div><div class='add'>+</div><div class='add'>+TEST setfattr -n "user.test" -v "test" $M0/dir3</div><div class='add'>+</div><div class='add'>+TEST chmod 777 $M0/dir4</div><div class='add'>+TEST setfattr -n "user.test" -v "test" $M0/dir4</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+# Start all bricks</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status $V0 $H0 $B0/$V0-1</div><div class='add'>+</div><div class='add'>+#$CLI volume status</div><div class='add'>+</div><div class='add'>+# It takes a while for the client to reconnect to the brick</div><div class='add'>+sleep 5</div><div class='add'>+</div><div class='add'>+stat $M0/dir* &gt; /dev/null</div><div class='add'>+</div><div class='add'>+# Check directories on the brick that was killed</div><div class='add'>+</div><div class='add'>+TEST ls $B0/$V0-1/dir2</div><div class='add'>+EXPECT "777" stat -c "%a" $B0/$V0-1/dir2</div><div class='add'>+</div><div class='add'>+TEST ls $B0/$V0-1/dir3</div><div class='add'>+EXPECT "test" getfattr -n "user.test" --absolute-names --only-values $B0/$V0-1/dir3</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+TEST ls $B0/$V0-1/dir4</div><div class='add'>+EXPECT "777" stat -c "%a" $B0/$V0-1/dir4</div><div class='add'>+EXPECT "test" getfattr -n "user.test" --absolute-names --only-values $B0/$V0-1/dir4</div><div class='add'>+cd</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+# Cleanup</div><div class='add'>+cleanup</div><div class='add'>+</div><div class='head'>diff --git a/tests/basic/distribute/file-create.t b/tests/basic/distribute/file-create.t<br/>new file mode 100644<br/>index 00000000000..41b662eefe2<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/distribute/file-create.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/distribute/file-create.t</a></div><div class='hunk'>@@ -0,0 +1,120 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+. $(dirname $0)/../../common-utils.rc</div><div class='add'>+. $(dirname $0)/../../dht.rc</div><div class='add'>+</div><div class='add'>+# Test overview: Test file creation in various scenarios</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+# Test 1 : "dht.file.hashed-subvol.&lt;filename&gt;"</div><div class='add'>+# Get the hashed subvolume for file1 in dir1 using xattr</div><div class='add'>+# Create file1 in dir1</div><div class='add'>+# Check if the file is created in the brick returned by xattr</div><div class='add'>+</div><div class='add'>+hashdebugxattr="dht.file.hashed-subvol."</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+</div><div class='add'>+# We want fixed size bricks to test min-free-disk</div><div class='add'>+</div><div class='add'>+# Create 2 loop devices, one per brick.</div><div class='add'>+TEST   truncate -s 25M $B0/brick1</div><div class='add'>+TEST   truncate -s 25M $B0/brick2</div><div class='add'>+</div><div class='add'>+TEST   L1=`SETUP_LOOP $B0/brick1`</div><div class='add'>+TEST   MKFS_LOOP $L1</div><div class='add'>+</div><div class='add'>+TEST   L2=`SETUP_LOOP $B0/brick2`</div><div class='add'>+TEST   MKFS_LOOP $L2</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+TEST   mkdir -p $B0/${V0}{1,2}</div><div class='add'>+</div><div class='add'>+TEST   MOUNT_LOOP $L1 $B0/${V0}1</div><div class='add'>+TEST   MOUNT_LOOP $L2 $B0/${V0}2</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+# Create a plain distribute volume with 2 subvols.</div><div class='add'>+TEST   $CLI volume create $V0 $H0:$B0/${V0}{1,2};</div><div class='add'>+TEST   $CLI volume start $V0;</div><div class='add'>+EXPECT "Started" volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+TEST   $CLI volume set $V0 cluster.min-free-disk 40%</div><div class='add'>+#TEST   $CLI volume set $V0 client-log-level DEBUG</div><div class='add'>+</div><div class='add'>+# Mount using FUSE and create a file</div><div class='add'>+TEST glusterfs -s $H0 --volfile-id $V0 $M0</div><div class='add'>+</div><div class='add'>+TEST mkdir $M0/dir1</div><div class='add'>+</div><div class='add'>+######################################################</div><div class='add'>+# Test 1 : Test file creation on correct hashed subvol</div><div class='add'>+######################################################</div><div class='add'>+</div><div class='add'>+hashed="$V0-client-0"</div><div class='add'>+TEST dht_first_filename_with_hashsubvol "$hashed" $M0/dir1 "big-"</div><div class='add'>+firstfile=$fn_return_val</div><div class='add'>+</div><div class='add'>+#Create a large file to fill up $hashed past the min-free-disk limits</div><div class='add'>+TEST  dd if=/dev/zero of=$M0/dir1/$firstfile bs=1M count=15</div><div class='add'>+</div><div class='add'>+brickpath_0=$(cat "$M0/.meta/graphs/active/$hashed/options/remote-subvolume")</div><div class='add'>+brickpath_1=$(cat "$M0/.meta/graphs/active/$V0-client-1/options/remote-subvolume")</div><div class='add'>+</div><div class='add'>+TEST stat "$brickpath_0/dir1/$firstfile"</div><div class='add'>+EXPECT "0" is_dht_linkfile "$brickpath_0/dir1/$firstfile"</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+######################################################</div><div class='add'>+# Test 2: Create a file which hashes to the subvol which has crossed</div><div class='add'>+# the min-free-disk limit. It should be created on the other subvol</div><div class='add'>+######################################################</div><div class='add'>+</div><div class='add'>+# DHT only checks disk usage every second. Create a new file and introduce a</div><div class='add'>+# delay here to ensure DHT updates the in memory disk usage</div><div class='add'>+sleep 2</div><div class='add'>+TEST  dd if=/dev/zero of=$M0/dir1/file-2 bs=1024 count=1</div><div class='add'>+</div><div class='add'>+# Find a file that will hash to $hash_subvol</div><div class='add'>+TEST dht_first_filename_with_hashsubvol $hashed $M0/dir1 "newfile-"</div><div class='add'>+newfile=$fn_return_val</div><div class='add'>+echo $newfile</div><div class='add'>+</div><div class='add'>+# Create $newfile - it should be created on the other subvol as its hash subvol</div><div class='add'>+# has crossed the min-free-disk limit</div><div class='add'>+TEST  dd if=/dev/zero of=$M0/dir1/$newfile bs=1024 count=20</div><div class='add'>+TEST stat "$brickpath_0/dir1/$newfile"</div><div class='add'>+EXPECT "1" is_dht_linkfile "$brickpath_0/dir1/$newfile"</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+#TEST rm -rf $M0/dir1/$firstfile</div><div class='add'>+#TEST rm -rf $M0/dir1/$newfile</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+######################################################</div><div class='add'>+# Test 3: Test dht_filter_loc_subvol_key</div><div class='add'>+######################################################</div><div class='add'>+</div><div class='add'>+TEST dht_first_filename_with_hashsubvol $V0-client-1 $M0/dir1 "filter-"</div><div class='add'>+newfile=$fn_return_val</div><div class='add'>+echo $newfile</div><div class='add'>+TEST dd if=/dev/zero of="$M0/dir1/$newfile@$V0-dht:$hashed" bs=1024 count=20</div><div class='add'>+TEST stat $M0/dir1/$newfile</div><div class='add'>+TEST stat "$brickpath_0/dir1/$newfile"</div><div class='add'>+EXPECT "1" is_dht_linkfile "$brickpath_1/dir1/$newfile"</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+force_umount $M0</div><div class='add'>+TEST $CLI volume stop $V0</div><div class='add'>+UMOUNT_LOOP ${B0}/${V0}{1,2}</div><div class='add'>+rm -f ${B0}/brick{1,2}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+# Cleanup</div><div class='add'>+cleanup</div><div class='add'>+</div><div class='head'>diff --git a/tests/basic/distribute/file-rename.t b/tests/basic/distribute/file-rename.t<br/>new file mode 100644<br/>index 00000000000..63111b8ad8f<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/distribute/file-rename.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/distribute/file-rename.t</a></div><div class='hunk'>@@ -0,0 +1,1021 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+. $(dirname $0)/../../nfs.rc</div><div class='add'>+. $(dirname $0)/../../common-utils.rc</div><div class='add'>+</div><div class='add'>+# Test overview:</div><div class='add'>+# Test all combinations of src-hashed/src-cached/dst-hashed/dst-cached</div><div class='add'>+</div><div class='add'>+hashdebugxattr="dht.file.hashed-subvol."</div><div class='add'>+</div><div class='add'>+function get_brick_index {</div><div class='add'>+        local inpath=$1</div><div class='add'>+        brickroot=$(getfattr -m . -n trusted.glusterfs.pathinfo $inpath | tr ' ' '\n' | sed -n 's/&lt;POSIX(\(.*\)):.*:.*&gt;.*/\1/p')</div><div class='add'>+        echo ${brickroot:(-1)}</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function get_brick_path_for_subvol {</div><div class='add'>+        local in_subvol=$1</div><div class='add'>+        local in_brickpath</div><div class='add'>+</div><div class='add'>+        in_brickpath=$(cat "$M0/.meta/graphs/active/$in_subvol/options/remote-subvolume")</div><div class='add'>+        echo $in_brickpath</div><div class='add'>+</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#Checks that file exists only on hashed and/or cached</div><div class='add'>+function file_existence_check</div><div class='add'>+{</div><div class='add'>+        local in_file_path=$1</div><div class='add'>+        local in_hashed=$2</div><div class='add'>+        local in_cached=$3</div><div class='add'>+        local in_client_subvol</div><div class='add'>+        local in_brickpath</div><div class='add'>+        local ret</div><div class='add'>+</div><div class='add'>+        for i in {0..3}</div><div class='add'>+        do</div><div class='add'>+               in_client_subvol="$V0-client-$i"</div><div class='add'>+               in_brickpath=$(cat "$M0/.meta/graphs/active/$in_client_subvol/options/remote-subvolume")</div><div class='add'>+               stat "$in_brickpath/$in_file_path" 2&gt;/dev/null</div><div class='add'>+               ret=$?</div><div class='add'>+               # Either the linkto or the data file must exist on the hashed</div><div class='add'>+               if [ "$in_client_subvol" == "$in_hashed" ]; then</div><div class='add'>+                        if [ $ret -ne 0 ]; then</div><div class='add'>+                            return 1</div><div class='add'>+                        fi</div><div class='add'>+                        continue</div><div class='add'>+               fi</div><div class='add'>+</div><div class='add'>+               # If the cached is non-null, we expect the file to exist on it</div><div class='add'>+               if [ "$in_client_subvol" == "$in_cached" ]; then</div><div class='add'>+                        if [ $ret -ne 0 ]; then</div><div class='add'>+                            return 1</div><div class='add'>+                        fi</div><div class='add'>+                        continue</div><div class='add'>+               fi</div><div class='add'>+</div><div class='add'>+               if [ $ret -eq 0 ]; then</div><div class='add'>+                  return 2</div><div class='add'>+               fi</div><div class='add'>+        done</div><div class='add'>+        return 0</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+# Check if file exists on any of the bricks of the volume</div><div class='add'>+function file_does_not_exist</div><div class='add'>+{</div><div class='add'>+        local inpath=$1</div><div class='add'>+        for i in `seq 0 3`</div><div class='add'>+        do</div><div class='add'>+                file_path=$B0/$V0-$i/$inpath</div><div class='add'>+                if [ -f "$file_path" ]; then</div><div class='add'>+                        echo "1"</div><div class='add'>+                        return 1</div><div class='add'>+                fi</div><div class='add'>+        done</div><div class='add'>+        return 0</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+# Input: filename dirpath</div><div class='add'>+function get_hash_subvol</div><div class='add'>+{</div><div class='add'>+      hash_subvol=$(getfattr --only-values -n "$hashdebugxattr$1" $2 2&gt;/dev/null)</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+# Find the first filename that hashes to a subvol</div><div class='add'>+# other than $1</div><div class='add'>+</div><div class='add'>+function first_filename_with_diff_hashsubvol</div><div class='add'>+{</div><div class='add'>+        local in_subvol=$1</div><div class='add'>+        local in_path=$2</div><div class='add'>+        local file_pattern=$3</div><div class='add'>+        local in_hash_subvol</div><div class='add'>+</div><div class='add'>+        for i in {1..100}</div><div class='add'>+        do</div><div class='add'>+               dstfilename="$file_pattern$i"</div><div class='add'>+               in_hash_subvol=$(get_hash_subvol "$dstfilename" "$in_path")</div><div class='add'>+               echo $in_hash_subvol</div><div class='add'>+               if [ "$in_subvol" != "$in_hash_subvol" ]; then</div><div class='add'>+                        return 0</div><div class='add'>+               fi</div><div class='add'>+        done</div><div class='add'>+        return 1</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+# Find the first filename that hashes to the same subvol</div><div class='add'>+# as $1</div><div class='add'>+function first_filename_with_same_hashsubvol</div><div class='add'>+{</div><div class='add'>+        local in_subvol=$1</div><div class='add'>+        local in_path=$2</div><div class='add'>+        local in_hash_subvol</div><div class='add'>+        local file_pattern=$3</div><div class='add'>+</div><div class='add'>+        for i in {1..100}</div><div class='add'>+        do</div><div class='add'>+               dstfilename="$file_pattern$i"</div><div class='add'>+               get_hash_subvol "$dstfilename" "$in_path"</div><div class='add'>+               in_hash_subvol=$hash_subvol</div><div class='add'>+#               echo $in_hash_subvol</div><div class='add'>+               if [ "$in_subvol" == "$in_hash_subvol" ]; then</div><div class='add'>+                        return 0</div><div class='add'>+               fi</div><div class='add'>+        done</div><div class='add'>+        return 1</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function file_is_linkto</div><div class='add'>+{</div><div class='add'>+    local  brick_filepath=$1</div><div class='add'>+</div><div class='add'>+    test=$(stat $brick_filepath 2&gt;&amp;1)</div><div class='add'>+    if [ $? -ne 0 ]; then</div><div class='add'>+        echo "2"</div><div class='add'>+        return</div><div class='add'>+    fi</div><div class='add'>+</div><div class='add'>+    test=$(getfattr -n trusted.glusterfs.dht.linkto -e text $brick_filepath 2&gt;&amp;1)</div><div class='add'>+</div><div class='add'>+    if [ $? -eq 0 ]; then</div><div class='add'>+       echo "1"</div><div class='add'>+    else</div><div class='add'>+       echo "0"</div><div class='add'>+    fi</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+# We need at least 4 bricks to test all combinations of hashed and</div><div class='add'>+# cached files</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/$V0-{0..3}</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+# Mount using FUSE</div><div class='add'>+TEST glusterfs -s $H0 --volfile-id $V0 $M0</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+################################################################</div><div class='add'>+# The first set of tests are those where the Dst file does not exist</div><div class='add'>+# dst-cached = NULL</div><div class='add'>+#</div><div class='add'>+###############################################################</div><div class='add'>+</div><div class='add'>+################### Test 1 ####################################</div><div class='add'>+#</div><div class='add'>+# src-hashed = src-cached = dst-hashed</div><div class='add'>+# dst-cached = null</div><div class='add'>+# src-file = src-1</div><div class='add'>+</div><div class='add'>+echo " **** Test 1 **** "</div><div class='add'>+</div><div class='add'>+src_file="src-1"</div><div class='add'>+</div><div class='add'>+TEST mkdir $M0/test-1</div><div class='add'>+TEST touch $M0/test-1/$src_file</div><div class='add'>+</div><div class='add'>+TEST get_hash_subvol $src_file $M0/test-1</div><div class='add'>+src_hashed=$hash_subvol</div><div class='add'>+#echo "Hashed subvol for $src_file: " $src_hashed</div><div class='add'>+</div><div class='add'>+# Find a file name that hashes to the same subvol as $src_file</div><div class='add'>+TEST first_filename_with_same_hashsubvol "$src_hashed" "$M0/test-1" "dst-"</div><div class='add'>+#echo "dst-file name: " $dstfilename</div><div class='add'>+dst_hashed=$src_hashed</div><div class='add'>+</div><div class='add'>+src_hash_brick=$(get_brick_path_for_subvol $src_hashed)</div><div class='add'>+</div><div class='add'>+echo "Renaming $src_file to $dstfilename"</div><div class='add'>+</div><div class='add'>+TEST mv $M0/test-1/$src_file $M0/test-1/$dstfilename</div><div class='add'>+</div><div class='add'>+# Expected:</div><div class='add'>+# dst file is accessible from the mount point</div><div class='add'>+# dst file exists only on the hashed brick.</div><div class='add'>+# no linkto files on any bricks</div><div class='add'>+# src files do not exist</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+TEST stat $M0/test-1/$dstfilename 2&gt;/dev/null</div><div class='add'>+TEST file_existence_check test-1/$dstfilename $src_hashed</div><div class='add'>+TEST file_does_not_exist test-1/$src_file</div><div class='add'>+EXPECT "0" file_is_linkto $src_hash_brick/test-1/$dstfilename</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+################### Test 2 ####################################</div><div class='add'>+</div><div class='add'>+# src-hashed = src-cached != dst-hashed</div><div class='add'>+# dst-cached = null</div><div class='add'>+</div><div class='add'>+echo " **** Test 2 **** "</div><div class='add'>+</div><div class='add'>+src_file="src-1"</div><div class='add'>+</div><div class='add'>+TEST mkdir $M0/test-2</div><div class='add'>+TEST touch $M0/test-2/$src_file</div><div class='add'>+</div><div class='add'>+TEST get_hash_subvol $src_file $M0/test-2</div><div class='add'>+src_hashed=$hash_subvol</div><div class='add'>+#echo "Hashed subvol for $src_file: " $src_hashed</div><div class='add'>+</div><div class='add'>+# Find a file name that hashes to a diff hashed subvol than $src_file</div><div class='add'>+TEST first_filename_with_diff_hashsubvol "$src_hashed" "$M0/test-2" "dst-"</div><div class='add'>+echo "dst-file name: " $dstfilename</div><div class='add'>+TEST get_hash_subvol $dstfilename $M0/test-2</div><div class='add'>+dst_hashed=$hash_subvol</div><div class='add'>+</div><div class='add'>+src_hash_brick=$(get_brick_path_for_subvol $src_hashed)</div><div class='add'>+dst_hash_brick=$(get_brick_path_for_subvol $dst_hashed)</div><div class='add'>+</div><div class='add'>+echo "Renaming $src_file to $dstfilename"</div><div class='add'>+</div><div class='add'>+TEST mv $M0/test-2/$src_file $M0/test-2/$dstfilename</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+# Expected:</div><div class='add'>+# dst file is accessible from the mount point</div><div class='add'>+# dst data file on src_hashed and dst linkto file on dst_hashed</div><div class='add'>+# src files do not exist</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+TEST stat $M0/test-2/$dstfilename 2&gt;/dev/null</div><div class='add'>+TEST file_existence_check test-2/$dstfilename $dst_hashed $src_hashed</div><div class='add'>+TEST file_does_not_exist test-2/$src_file</div><div class='add'>+EXPECT "1" file_is_linkto $dst_hash_brick/test-2/$dstfilename</div><div class='add'>+EXPECT "0" file_is_linkto $src_hash_brick/test-2/$dstfilename</div><div class='add'>+</div><div class='add'>+################### Test 3 ####################################</div><div class='add'>+</div><div class='add'>+# src-hashed = dst-hashed != src-cached</div><div class='add'>+</div><div class='add'>+echo " **** Test 3 **** "</div><div class='add'>+</div><div class='add'>+src_file0="abc-1"</div><div class='add'>+</div><div class='add'>+# 1. Create src file with src_cached != src_hashed</div><div class='add'>+TEST mkdir $M0/test-3</div><div class='add'>+TEST touch $M0/test-3/$src_file0</div><div class='add'>+</div><div class='add'>+TEST get_hash_subvol $src_file0 $M0/test-3</div><div class='add'>+src_cached=$hash_subvol</div><div class='add'>+#echo "Hashed subvol for $src_file0: " $src_cached</div><div class='add'>+</div><div class='add'>+# Find a file name that hashes to a diff hashed subvol than $src_file0</div><div class='add'>+TEST first_filename_with_diff_hashsubvol "$src_cached" "$M0/test-3" "src-"</div><div class='add'>+echo "dst-file name: " $dstfilename</div><div class='add'>+src_file=$dstfilename</div><div class='add'>+</div><div class='add'>+TEST mv $M0/test-3/$src_file0 $M0/test-3/$src_file</div><div class='add'>+</div><div class='add'>+TEST get_hash_subvol $src_file $M0/test-3</div><div class='add'>+src_hashed=$hash_subvol</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+# 2. Rename src to dst</div><div class='add'>+TEST first_filename_with_same_hashsubvol "$src_hashed" "$M0/test-3" "dst-"</div><div class='add'>+#echo "dst-file name: " $dstfilename</div><div class='add'>+</div><div class='add'>+src_hash_brick=$(get_brick_path_for_subvol $src_hashed)</div><div class='add'>+src_cached_brick=$(get_brick_path_for_subvol $src_cached)</div><div class='add'>+</div><div class='add'>+echo "Renaming $src_file to $dstfilename"</div><div class='add'>+</div><div class='add'>+TEST mv $M0/test-3/$src_file $M0/test-3/$dstfilename</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+# Expected:</div><div class='add'>+# dst file is accessible from the mount point</div><div class='add'>+TEST stat $M0/test-3/$dstfilename 2&gt;/dev/null</div><div class='add'>+</div><div class='add'>+# src file does not exist</div><div class='add'>+TEST file_does_not_exist test-3/$src_file</div><div class='add'>+</div><div class='add'>+# dst linkto file on src_hashed and dst data file on src_cached</div><div class='add'>+TEST file_existence_check test-3/$dstfilename $src_hashed $src_cached</div><div class='add'>+</div><div class='add'>+EXPECT "1" file_is_linkto $src_hash_brick/test-3/$dstfilename</div><div class='add'>+EXPECT "0" file_is_linkto $src_cached_brick/test-3/$dstfilename</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+################### Test 4 ####################################</div><div class='add'>+</div><div class='add'>+# src-cached = dst-hashed != src-hashed</div><div class='add'>+</div><div class='add'>+echo " **** Test 4 **** "</div><div class='add'>+</div><div class='add'>+src_file0="abc-1"</div><div class='add'>+</div><div class='add'>+# 1. Create src file with src_cached != src_hashed</div><div class='add'>+TEST mkdir $M0/test-4</div><div class='add'>+TEST touch $M0/test-4/$src_file0</div><div class='add'>+</div><div class='add'>+TEST get_hash_subvol $src_file0 $M0/test-4</div><div class='add'>+src_cached=$hash_subvol</div><div class='add'>+#echo "Hashed subvol for $src_file0: " $src_cached</div><div class='add'>+</div><div class='add'>+# Find a file name that hashes to a diff hashed subvol than $src_file0</div><div class='add'>+TEST first_filename_with_diff_hashsubvol "$src_cached" "$M0/test-4" "src-"</div><div class='add'>+src_file=$dstfilename</div><div class='add'>+</div><div class='add'>+TEST mv $M0/test-4/$src_file0 $M0/test-4/$src_file</div><div class='add'>+</div><div class='add'>+TEST get_hash_subvol $src_file $M0/test-4</div><div class='add'>+src_hashed=$hash_subvol</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+# 2. Rename src to dst</div><div class='add'>+TEST first_filename_with_same_hashsubvol "$src_cached" "$M0/test-4" "dst-"</div><div class='add'>+#echo "dst-file name: " $dstfilename</div><div class='add'>+</div><div class='add'>+src_hash_brick=$(get_brick_path_for_subvol $src_hashed)</div><div class='add'>+src_cached_brick=$(get_brick_path_for_subvol $src_cached)</div><div class='add'>+</div><div class='add'>+echo "Renaming $src_file to $dstfilename"</div><div class='add'>+</div><div class='add'>+TEST mv $M0/test-4/$src_file $M0/test-4/$dstfilename</div><div class='add'>+</div><div class='add'>+# Expected:</div><div class='add'>+# dst file is accessible from the mount point</div><div class='add'>+TEST stat $M0/test-4/$dstfilename 2&gt;/dev/null</div><div class='add'>+</div><div class='add'>+# src file does not exist</div><div class='add'>+TEST file_does_not_exist test-4/$src_file</div><div class='add'>+</div><div class='add'>+# dst linkto file on src_hashed and dst data file on src_cached</div><div class='add'>+TEST file_existence_check test-4/$dstfilename $src_cached</div><div class='add'>+</div><div class='add'>+EXPECT "0" file_is_linkto $src_cached_brick/test-4/$dstfilename</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+################### Test 5 ####################################</div><div class='add'>+</div><div class='add'>+# src-cached != src-hashed</div><div class='add'>+# src-hashed != dst-hashed</div><div class='add'>+# src-cached != dst-hashed</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+echo " **** Test 5 **** "</div><div class='add'>+</div><div class='add'>+# 1. Create src and dst files</div><div class='add'>+</div><div class='add'>+TEST mkdir $M0/test-5</div><div class='add'>+</div><div class='add'>+TEST first_filename_with_same_hashsubvol "$V0-client-0" "$M0/test-5" "abc-"</div><div class='add'>+src_file0=$dstfilename</div><div class='add'>+</div><div class='add'>+TEST touch $M0/test-5/$src_file0</div><div class='add'>+</div><div class='add'>+TEST get_hash_subvol $src_file0 $M0/test-5</div><div class='add'>+src_cached=$hash_subvol</div><div class='add'>+#echo "Hashed subvol for $src_file0: " $src_cached</div><div class='add'>+</div><div class='add'>+# Find a file name that hashes to a diff hashed subvol than $src_file0</div><div class='add'>+TEST first_filename_with_same_hashsubvol "$V0-client-1" "$M0/test-5" "src-"</div><div class='add'>+src_file=$dstfilename</div><div class='add'>+</div><div class='add'>+TEST mv $M0/test-5/$src_file0 $M0/test-5/$src_file</div><div class='add'>+</div><div class='add'>+TEST get_hash_subvol $src_file $M0/test-5</div><div class='add'>+src_hashed=$hash_subvol</div><div class='add'>+</div><div class='add'>+TEST first_filename_with_same_hashsubvol "$V0-client-2" "$M0/test-5" "dst-"</div><div class='add'>+#echo "dst-file name: " $dstfilename</div><div class='add'>+</div><div class='add'>+dst_hash_brick=$(get_brick_path_for_subvol "$V0-client-2")</div><div class='add'>+src_cached_brick=$(get_brick_path_for_subvol $src_cached)</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+# 2. Rename src to dst</div><div class='add'>+echo "Renaming $src_file to $dstfilename"</div><div class='add'>+</div><div class='add'>+TEST mv $M0/test-5/$src_file $M0/test-5/$dstfilename</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+# 3. Validate</div><div class='add'>+</div><div class='add'>+# Expected:</div><div class='add'>+# dst file is accessible from the mount point</div><div class='add'>+TEST stat $M0/test-5/$dstfilename 2&gt;/dev/null</div><div class='add'>+</div><div class='add'>+# src file does not exist</div><div class='add'>+TEST file_does_not_exist test-5/$src_file</div><div class='add'>+</div><div class='add'>+# dst linkto file on src_hashed and dst data file on src_cached</div><div class='add'>+</div><div class='add'>+EXPECT "0" file_is_linkto $src_cached_brick/test-5/$dstfilename</div><div class='add'>+EXPECT "1" file_is_linkto $dst_hash_brick/test-5/$dstfilename</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+########################################################################</div><div class='add'>+#</div><div class='add'>+# The Dst file exists</div><div class='add'>+#</div><div class='add'>+########################################################################</div><div class='add'>+</div><div class='add'>+################### Test 6 ####################################</div><div class='add'>+</div><div class='add'>+# src_hash = src_cached</div><div class='add'>+# dst_hash = dst_cached</div><div class='add'>+# dst_hash = src_hash</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+TEST mkdir $M0/test-6</div><div class='add'>+</div><div class='add'>+# 1. Create src and dst files</div><div class='add'>+</div><div class='add'>+TEST first_filename_with_same_hashsubvol "$V0-client-0" "$M0/test-6" "src-"</div><div class='add'>+src_file=$dstfilename</div><div class='add'>+</div><div class='add'>+TEST touch $M0/test-6/$src_file</div><div class='add'>+</div><div class='add'>+TEST first_filename_with_same_hashsubvol "$V0-client-0" "$M0/test-6" "dst-"</div><div class='add'>+dst_file=$dstfilename</div><div class='add'>+</div><div class='add'>+TEST touch $M0/test-6/$dst_file</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+# 2. Rename src to dst</div><div class='add'>+</div><div class='add'>+TEST mv $M0/test-6/$src_file $M0/test-6/$dst_file</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+# 3. Validate</div><div class='add'>+</div><div class='add'>+dst_hash_brick=$(get_brick_path_for_subvol "$V0-client-0")</div><div class='add'>+</div><div class='add'>+TEST stat $M0/test-6/$dst_file 2&gt;/dev/null</div><div class='add'>+TEST file_existence_check test-6/$dst_file "$V0-client-0"</div><div class='add'>+TEST file_does_not_exist test-6/$src_file</div><div class='add'>+EXPECT "0" file_is_linkto $dst_hash_brick/test-6/$dst_file</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+################### Test 7 ####################################</div><div class='add'>+</div><div class='add'>+# src_hash = src_cached</div><div class='add'>+# dst_hash = dst_cached</div><div class='add'>+# dst_hash != src_hash</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+echo " **** Test 7 **** "</div><div class='add'>+</div><div class='add'>+TEST mkdir $M0/test-7</div><div class='add'>+</div><div class='add'>+# 1. Create src and dst files</div><div class='add'>+</div><div class='add'>+TEST first_filename_with_same_hashsubvol "$V0-client-0" "$M0/test-7" "src-"</div><div class='add'>+src_file=$dstfilename</div><div class='add'>+</div><div class='add'>+TEST touch $M0/test-7/$src_file</div><div class='add'>+</div><div class='add'>+TEST first_filename_with_same_hashsubvol "$V0-client-1" "$M0/test-7" "dst-"</div><div class='add'>+dst_file=$dstfilename</div><div class='add'>+</div><div class='add'>+TEST touch $M0/test-7/$dst_file</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+# 2. Rename src to dst</div><div class='add'>+</div><div class='add'>+TEST mv $M0/test-7/$src_file $M0/test-7/$dst_file</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+# 3. Validate</div><div class='add'>+</div><div class='add'>+dst_hash_brick=$(get_brick_path_for_subvol "$V0-client-1")</div><div class='add'>+src_hash_brick=$(get_brick_path_for_subvol "$V0-client-0")</div><div class='add'>+</div><div class='add'>+TEST stat $M0/test-7/$dst_file 2&gt;/dev/null</div><div class='add'>+TEST file_existence_check test-7/$dst_file "$V0-client-1" "$V0-client-0"</div><div class='add'>+TEST file_does_not_exist test-7/$src_file</div><div class='add'>+</div><div class='add'>+EXPECT "0" file_is_linkto $src_hash_brick/test-7/$dst_file</div><div class='add'>+EXPECT "1" file_is_linkto $dst_hash_brick/test-7/$dst_file</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+################### Test 8 ####################################</div><div class='add'>+</div><div class='add'>+# src_hash = src_cached</div><div class='add'>+# dst_hash != dst_cached</div><div class='add'>+# dst_hash != src_hash</div><div class='add'>+# dst_cached != src_hash</div><div class='add'>+</div><div class='add'>+echo " **** Test 8 **** "</div><div class='add'>+</div><div class='add'>+TEST mkdir $M0/test-8</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+# 1. Create src and dst files</div><div class='add'>+</div><div class='add'>+TEST first_filename_with_same_hashsubvol "$V0-client-0" "$M0/test-8" "src-"</div><div class='add'>+src_file=$dstfilename</div><div class='add'>+TEST touch $M0/test-8/$src_file</div><div class='add'>+</div><div class='add'>+TEST first_filename_with_same_hashsubvol "$V0-client-1" "$M0/test-8" "dst0-"</div><div class='add'>+dst_file0=$dstfilename</div><div class='add'>+TEST touch $M0/test-8/$dst_file0</div><div class='add'>+</div><div class='add'>+TEST first_filename_with_same_hashsubvol "$V0-client-2" "$M0/test-8" "dst-"</div><div class='add'>+dst_file=$dstfilename</div><div class='add'>+</div><div class='add'>+mv $M0/test-8/$dst_file0  $M0/test-8/$dst_file</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+# 2. Rename the file</div><div class='add'>+</div><div class='add'>+mv $M0/test-8/$src_file  $M0/test-8/$dst_file</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+# 3. Validate</div><div class='add'>+</div><div class='add'>+dst_hash_brick=$(get_brick_path_for_subvol "$V0-client-2")</div><div class='add'>+src_hash_brick=$(get_brick_path_for_subvol "$V0-client-0")</div><div class='add'>+</div><div class='add'>+TEST stat $M0/test-8/$dst_file 2&gt;/dev/null</div><div class='add'>+TEST file_existence_check test-8/$dst_file "$V0-client-2" "$V0-client-0"</div><div class='add'>+TEST file_does_not_exist test-8/$src_file</div><div class='add'>+</div><div class='add'>+EXPECT "0" file_is_linkto $src_hash_brick/test-8/$dst_file</div><div class='add'>+EXPECT "1" file_is_linkto $dst_hash_brick/test-8/$dst_file</div><div class='add'>+</div><div class='add'>+################### Test 9 ####################################</div><div class='add'>+</div><div class='add'>+# src_hash = src_cached = dst_hash</div><div class='add'>+# dst_hash != dst_cached</div><div class='add'>+</div><div class='add'>+echo " **** Test 9 **** "</div><div class='add'>+</div><div class='add'>+TEST mkdir $M0/test-9</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+# 1. Create src and dst files</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+TEST first_filename_with_same_hashsubvol "$V0-client-0" "$M0/test-9" "src-"</div><div class='add'>+src_file=$dstfilename</div><div class='add'>+TEST touch $M0/test-9/$src_file</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+TEST first_filename_with_same_hashsubvol "$V0-client-1" "$M0/test-9" "dst0-"</div><div class='add'>+dst0_file=$dstfilename</div><div class='add'>+TEST touch $M0/test-9/$dst0_file</div><div class='add'>+</div><div class='add'>+TEST first_filename_with_same_hashsubvol "$V0-client-0" "$M0/test-9" "dst-"</div><div class='add'>+dst_file=$dstfilename</div><div class='add'>+</div><div class='add'>+TEST mv $M0/test-9/$dst0_file $M0/test-9/$dst_file</div><div class='add'>+</div><div class='add'>+# 2. Rename the file</div><div class='add'>+</div><div class='add'>+mv $M0/test-9/$src_file  $M0/test-9/$dst_file</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+# 3. Validate</div><div class='add'>+</div><div class='add'>+dst_hash_brick=$(get_brick_path_for_subvol "$V0-client-0")</div><div class='add'>+</div><div class='add'>+TEST stat $M0/test-9/$dst_file 2&gt;/dev/null</div><div class='add'>+TEST file_existence_check test-9/$dst_file "$V0-client-0"</div><div class='add'>+TEST file_does_not_exist test-9/$src_file</div><div class='add'>+EXPECT "0" file_is_linkto $dst_hash_brick/test-9/$dst_file</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+################### Test 10 ####################################</div><div class='add'>+</div><div class='add'>+# src_hash = src_cached = dst_cached</div><div class='add'>+# dst_hash != dst_cached</div><div class='add'>+</div><div class='add'>+echo " **** Test 10 **** "</div><div class='add'>+</div><div class='add'>+TEST mkdir $M0/test-10</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+# 1. Create src and dst files</div><div class='add'>+</div><div class='add'>+TEST first_filename_with_same_hashsubvol "$V0-client-0" "$M0/test-10" "src-"</div><div class='add'>+src_file=$dstfilename</div><div class='add'>+TEST touch $M0/test-10/$src_file</div><div class='add'>+</div><div class='add'>+TEST first_filename_with_same_hashsubvol "$V0-client-0" "$M0/test-10" "dst0-"</div><div class='add'>+dst0_file=$dstfilename</div><div class='add'>+TEST touch $M0/test-10/$dst0_file</div><div class='add'>+</div><div class='add'>+TEST first_filename_with_same_hashsubvol "$V0-client-1" "$M0/test-10" "dst-"</div><div class='add'>+dst_file=$dstfilename</div><div class='add'>+</div><div class='add'>+mv $M0/test-10/$dst0_file  $M0/test-10/$dst_file</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+# 2. Rename the file</div><div class='add'>+</div><div class='add'>+mv $M0/test-10/$src_file  $M0/test-10/$dst_file</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+# 3. Validate</div><div class='add'>+</div><div class='add'>+dst_hash_brick=$(get_brick_path_for_subvol "$V0-client-1")</div><div class='add'>+dst_cached_brick=$(get_brick_path_for_subvol "$V0-client-0")</div><div class='add'>+</div><div class='add'>+TEST stat $M0/test-10/$dst_file 2&gt;/dev/null</div><div class='add'>+TEST file_existence_check test-10/$dst_file "$V0-client-1" "$V0-client-0"</div><div class='add'>+TEST file_does_not_exist test-10/$src_file</div><div class='add'>+EXPECT "1" file_is_linkto $dst_hash_brick/test-10/$dst_file</div><div class='add'>+EXPECT "0" file_is_linkto $dst_cached_brick/test-10/$dst_file</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+################### Test 11 ####################################</div><div class='add'>+</div><div class='add'>+# src_hash != src_cached</div><div class='add'>+# dst_hash = dst_cached = src_cached</div><div class='add'>+</div><div class='add'>+echo " **** Test 11 **** "</div><div class='add'>+</div><div class='add'>+TEST mkdir $M0/test-11</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+# 1. Create src and dst files</div><div class='add'>+</div><div class='add'>+TEST first_filename_with_same_hashsubvol "$V0-client-0" "$M0/test-11" "src0-"</div><div class='add'>+src0_file=$dstfilename</div><div class='add'>+TEST touch $M0/test-11/$src0_file</div><div class='add'>+</div><div class='add'>+TEST first_filename_with_same_hashsubvol "$V0-client-1" "$M0/test-11" "src-"</div><div class='add'>+src_file=$dstfilename</div><div class='add'>+</div><div class='add'>+mv $M0/test-11/$src0_file  $M0/test-11/$src_file</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+TEST first_filename_with_same_hashsubvol "$V0-client-0" "$M0/test-11" "dst-"</div><div class='add'>+dst_file=$dstfilename</div><div class='add'>+TEST touch $M0/test-11/$dst_file</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+# 2. Rename the file</div><div class='add'>+</div><div class='add'>+mv $M0/test-11/$src_file  $M0/test-11/$dst_file</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+# 3. Validate</div><div class='add'>+</div><div class='add'>+dst_hash_brick=$(get_brick_path_for_subvol "$V0-client-0")</div><div class='add'>+</div><div class='add'>+TEST stat $M0/test-11/$dst_file 2&gt;/dev/null</div><div class='add'>+TEST file_existence_check test-11/$dst_file "$V0-client-0"</div><div class='add'>+TEST file_does_not_exist test-11/$src_file</div><div class='add'>+EXPECT "0" file_is_linkto $dst_hash_brick/test-11/$dst_file</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+################### Test 12 ####################################</div><div class='add'>+</div><div class='add'>+# src_hash != src_cached</div><div class='add'>+# dst_hash = dst_cached = src_hash</div><div class='add'>+</div><div class='add'>+echo " **** Test 12 **** "</div><div class='add'>+</div><div class='add'>+TEST mkdir $M0/test-12</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+# 1. Create src and dst files</div><div class='add'>+</div><div class='add'>+TEST first_filename_with_same_hashsubvol "$V0-client-0" "$M0/test-12" "src0-"</div><div class='add'>+src0_file=$dstfilename</div><div class='add'>+TEST touch $M0/test-12/$src0_file</div><div class='add'>+</div><div class='add'>+TEST first_filename_with_same_hashsubvol "$V0-client-1" "$M0/test-12" "src-"</div><div class='add'>+src_file=$dstfilename</div><div class='add'>+</div><div class='add'>+mv $M0/test-12/$src0_file  $M0/test-12/$src_file</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+TEST first_filename_with_same_hashsubvol "$V0-client-1" "$M0/test-12" "dst-"</div><div class='add'>+dst_file=$dstfilename</div><div class='add'>+TEST touch $M0/test-12/$dst_file</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+# 2. Rename the file</div><div class='add'>+</div><div class='add'>+mv $M0/test-12/$src_file  $M0/test-12/$dst_file</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+# 3. Validate</div><div class='add'>+</div><div class='add'>+dst_hash_brick=$(get_brick_path_for_subvol "$V0-client-1")</div><div class='add'>+dst_cached_brick=$(get_brick_path_for_subvol "$V0-client-0")</div><div class='add'>+</div><div class='add'>+TEST stat $M0/test-12/$dst_file 2&gt;/dev/null</div><div class='add'>+TEST file_existence_check test-12/$dst_file "$V0-client-1" "$V0-client-0"</div><div class='add'>+TEST file_does_not_exist test-12/$src_file</div><div class='add'>+EXPECT "1" file_is_linkto $dst_hash_brick/test-12/$dst_file</div><div class='add'>+EXPECT "0" file_is_linkto $dst_cached_brick/test-12/$dst_file</div><div class='add'>+</div><div class='add'>+################### Test 13 ####################################</div><div class='add'>+</div><div class='add'>+# src_hash != src_cached</div><div class='add'>+# dst_hash = dst_cached</div><div class='add'>+# dst_hash != src_cached</div><div class='add'>+# dst_hash != src_hash</div><div class='add'>+</div><div class='add'>+echo " **** Test 13 **** "</div><div class='add'>+</div><div class='add'>+TEST mkdir $M0/test-13</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+# 1. Create src and dst files</div><div class='add'>+</div><div class='add'>+TEST first_filename_with_same_hashsubvol "$V0-client-0" "$M0/test-13" "src0-"</div><div class='add'>+src0_file=$dstfilename</div><div class='add'>+TEST touch $M0/test-13/$src0_file</div><div class='add'>+</div><div class='add'>+TEST first_filename_with_same_hashsubvol "$V0-client-1" "$M0/test-13" "src-"</div><div class='add'>+src_file=$dstfilename</div><div class='add'>+</div><div class='add'>+mv $M0/test-13/$src0_file  $M0/test-13/$src_file</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+TEST first_filename_with_same_hashsubvol "$V0-client-2" "$M0/test-13" "dst-"</div><div class='add'>+dst_file=$dstfilename</div><div class='add'>+TEST touch $M0/test-13/$dst_file</div><div class='add'>+</div><div class='add'>+# 2. Rename the file</div><div class='add'>+</div><div class='add'>+mv $M0/test-13/$src_file  $M0/test-13/$dst_file</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+# 3. Validate</div><div class='add'>+</div><div class='add'>+dst_hash_brick=$(get_brick_path_for_subvol "$V0-client-2")</div><div class='add'>+dst_cached_brick=$(get_brick_path_for_subvol "$V0-client-0")</div><div class='add'>+</div><div class='add'>+TEST stat $M0/test-13/$dst_file 2&gt;/dev/null</div><div class='add'>+TEST file_existence_check test-13/$dst_file "$V0-client-2" "$V0-client-0"</div><div class='add'>+TEST file_does_not_exist test-13/$src_file</div><div class='add'>+EXPECT "1" file_is_linkto $dst_hash_brick/test-13/$dst_file</div><div class='add'>+EXPECT "0" file_is_linkto $dst_cached_brick/test-13/$dst_file</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+################### Test 14 ####################################</div><div class='add'>+</div><div class='add'>+# src_hash != src_cached</div><div class='add'>+# dst_hash = src_hash</div><div class='add'>+# dst_cached = src_cached</div><div class='add'>+</div><div class='add'>+echo " **** Test 14 **** "</div><div class='add'>+</div><div class='add'>+TEST mkdir $M0/test-14</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+# 1. Create src and dst files</div><div class='add'>+</div><div class='add'>+TEST first_filename_with_same_hashsubvol "$V0-client-0" "$M0/test-14" "src0-"</div><div class='add'>+src0_file=$dstfilename</div><div class='add'>+TEST touch $M0/test-14/$src0_file</div><div class='add'>+</div><div class='add'>+TEST first_filename_with_same_hashsubvol "$V0-client-1" "$M0/test-14" "src-"</div><div class='add'>+src_file=$dstfilename</div><div class='add'>+</div><div class='add'>+mv $M0/test-14/$src0_file  $M0/test-14/$src_file</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+TEST first_filename_with_same_hashsubvol "$V0-client-0" "$M0/test-14" "dst0-"</div><div class='add'>+dst0_file=$dstfilename</div><div class='add'>+TEST touch $M0/test-14/$dst0_file</div><div class='add'>+</div><div class='add'>+TEST first_filename_with_same_hashsubvol "$V0-client-1" "$M0/test-14" "dst-"</div><div class='add'>+dst_file=$dstfilename</div><div class='add'>+</div><div class='add'>+mv $M0/test-14/$dst0_file  $M0/test-14/$dst_file</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+# 2. Rename the file</div><div class='add'>+</div><div class='add'>+mv $M0/test-14/$src_file  $M0/test-14/$dst_file</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+# 3. Validate</div><div class='add'>+</div><div class='add'>+dst_hash_brick=$(get_brick_path_for_subvol "$V0-client-1")</div><div class='add'>+dst_cached_brick=$(get_brick_path_for_subvol "$V0-client-0")</div><div class='add'>+</div><div class='add'>+TEST stat $M0/test-14/$dst_file 2&gt;/dev/null</div><div class='add'>+TEST file_existence_check test-14/$dst_file "$V0-client-1" "$V0-client-0"</div><div class='add'>+TEST file_does_not_exist test-14/$src_file</div><div class='add'>+EXPECT "1" file_is_linkto $dst_hash_brick/test-14/$dst_file</div><div class='add'>+EXPECT "0" file_is_linkto $dst_cached_brick/test-14/$dst_file</div><div class='add'>+</div><div class='add'>+################### Test 15 ####################################</div><div class='add'>+</div><div class='add'>+# src_hash != src_cached</div><div class='add'>+# dst_hash != src_hash</div><div class='add'>+# dst_hash != src_cached</div><div class='add'>+# dst_cached = src_cached</div><div class='add'>+</div><div class='add'>+echo " **** Test 15 **** "</div><div class='add'>+</div><div class='add'>+TEST mkdir $M0/test-15</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+# 1. Create src and dst files</div><div class='add'>+</div><div class='add'>+TEST first_filename_with_same_hashsubvol "$V0-client-0" "$M0/test-15" "src0-"</div><div class='add'>+src0_file=$dstfilename</div><div class='add'>+TEST touch $M0/test-15/$src0_file</div><div class='add'>+</div><div class='add'>+TEST first_filename_with_same_hashsubvol "$V0-client-1" "$M0/test-15" "src-"</div><div class='add'>+src_file=$dstfilename</div><div class='add'>+</div><div class='add'>+mv $M0/test-15/$src0_file  $M0/test-15/$src_file</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+TEST first_filename_with_same_hashsubvol "$V0-client-0" "$M0/test-15" "dst0-"</div><div class='add'>+dst0_file=$dstfilename</div><div class='add'>+TEST touch $M0/test-15/$dst0_file</div><div class='add'>+</div><div class='add'>+TEST first_filename_with_same_hashsubvol "$V0-client-2" "$M0/test-15" "dst-"</div><div class='add'>+dst_file=$dstfilename</div><div class='add'>+</div><div class='add'>+mv $M0/test-15/$dst0_file  $M0/test-15/$dst_file</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+# 2. Rename the file</div><div class='add'>+</div><div class='add'>+mv $M0/test-15/$src_file  $M0/test-15/$dst_file</div><div class='add'>+</div><div class='add'>+# 3. Validate</div><div class='add'>+</div><div class='add'>+dst_hash_brick=$(get_brick_path_for_subvol "$V0-client-2")</div><div class='add'>+dst_cached_brick=$(get_brick_path_for_subvol "$V0-client-0")</div><div class='add'>+</div><div class='add'>+TEST stat $M0/test-15/$dst_file 2&gt;/dev/null</div><div class='add'>+TEST file_existence_check test-15/$dst_file "$V0-client-2" "$V0-client-0"</div><div class='add'>+TEST file_does_not_exist test-15/$src_file</div><div class='add'>+EXPECT "1" file_is_linkto $dst_hash_brick/test-15/$dst_file</div><div class='add'>+EXPECT "0" file_is_linkto $dst_cached_brick/test-15/$dst_file</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+################### Test 16 ####################################</div><div class='add'>+</div><div class='add'>+# src_hash != src_cached</div><div class='add'>+# dst_hash = src_cached</div><div class='add'>+# dst_cached = src_hash</div><div class='add'>+</div><div class='add'>+echo " **** Test 16 **** "</div><div class='add'>+</div><div class='add'>+TEST mkdir $M0/test-16</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+# 1. Create src and dst files</div><div class='add'>+</div><div class='add'>+TEST first_filename_with_same_hashsubvol "$V0-client-0" "$M0/test-16" "src0-"</div><div class='add'>+src0_file=$dstfilename</div><div class='add'>+TEST touch $M0/test-16/$src0_file</div><div class='add'>+</div><div class='add'>+TEST first_filename_with_same_hashsubvol "$V0-client-1" "$M0/test-16" "src-"</div><div class='add'>+src_file=$dstfilename</div><div class='add'>+</div><div class='add'>+mv $M0/test-16/$src0_file  $M0/test-16/$src_file</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+TEST first_filename_with_same_hashsubvol "$V0-client-1" "$M0/test-16" "dst0-"</div><div class='add'>+dst0_file=$dstfilename</div><div class='add'>+TEST touch $M0/test-16/$dst0_file</div><div class='add'>+</div><div class='add'>+TEST first_filename_with_same_hashsubvol "$V0-client-0" "$M0/test-16" "dst-"</div><div class='add'>+dst_file=$dstfilename</div><div class='add'>+</div><div class='add'>+mv $M0/test-16/$dst0_file  $M0/test-16/$dst_file</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+# 2. Rename the file</div><div class='add'>+</div><div class='add'>+mv $M0/test-16/$src_file  $M0/test-16/$dst_file</div><div class='add'>+</div><div class='add'>+# 3. Validate</div><div class='add'>+</div><div class='add'>+dst_hash_brick=$(get_brick_path_for_subvol "$V0-client-0")</div><div class='add'>+</div><div class='add'>+TEST stat $M0/test-16/$dst_file 2&gt;/dev/null</div><div class='add'>+TEST file_existence_check test-16/$dst_file "$V0-client-0"</div><div class='add'>+TEST file_does_not_exist test-16/$src_file</div><div class='add'>+EXPECT "0" file_is_linkto $dst_hash_brick/test-16/$dst_file</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+################### Test 17 ####################################</div><div class='add'>+</div><div class='add'>+# src_hash != src_cached</div><div class='add'>+# dst_hash != dst_cached</div><div class='add'>+# dst_hash != src_hash != src_cached</div><div class='add'>+# dst_cached = src_hash</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+echo " **** Test 17 **** "</div><div class='add'>+</div><div class='add'>+TEST mkdir $M0/test-17</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+# 1. Create src and dst files</div><div class='add'>+</div><div class='add'>+TEST first_filename_with_same_hashsubvol "$V0-client-0" "$M0/test-17" "src0-"</div><div class='add'>+src0_file=$dstfilename</div><div class='add'>+TEST touch $M0/test-17/$src0_file</div><div class='add'>+</div><div class='add'>+TEST first_filename_with_same_hashsubvol "$V0-client-1" "$M0/test-17" "src-"</div><div class='add'>+src_file=$dstfilename</div><div class='add'>+</div><div class='add'>+mv $M0/test-17/$src0_file  $M0/test-17/$src_file</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+TEST first_filename_with_same_hashsubvol "$V0-client-1" "$M0/test-17" "dst0-"</div><div class='add'>+dst0_file=$dstfilename</div><div class='add'>+TEST touch $M0/test-17/$dst0_file</div><div class='add'>+</div><div class='add'>+TEST first_filename_with_same_hashsubvol "$V0-client-2" "$M0/test-17" "dst-"</div><div class='add'>+dst_file=$dstfilename</div><div class='add'>+</div><div class='add'>+mv $M0/test-17/$dst0_file  $M0/test-17/$dst_file</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+# 2. Rename the file</div><div class='add'>+</div><div class='add'>+mv $M0/test-17/$src_file  $M0/test-17/$dst_file</div><div class='add'>+</div><div class='add'>+# 3. Validate</div><div class='add'>+</div><div class='add'>+dst_hash_brick=$(get_brick_path_for_subvol "$V0-client-2")</div><div class='add'>+dst_cached_brick=$(get_brick_path_for_subvol "$V0-client-0")</div><div class='add'>+</div><div class='add'>+TEST stat $M0/test-17/$dst_file 2&gt;/dev/null</div><div class='add'>+TEST file_existence_check test-17/$dst_file "$V0-client-2" "$V0-client-0"</div><div class='add'>+TEST file_does_not_exist test-17/$src_file</div><div class='add'>+EXPECT "1" file_is_linkto $dst_hash_brick/test-17/$dst_file</div><div class='add'>+EXPECT "0" file_is_linkto $dst_cached_brick/test-17/$dst_file</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+################### Test 18 ####################################</div><div class='add'>+</div><div class='add'>+# src_hash != src_cached</div><div class='add'>+# dst_hash != dst_cached</div><div class='add'>+# dst_hash != src_hash != src_cached != dst_cached</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+echo " **** Test 18 **** "</div><div class='add'>+</div><div class='add'>+TEST mkdir $M0/test-18</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+# 1. Create src and dst files</div><div class='add'>+</div><div class='add'>+TEST first_filename_with_same_hashsubvol "$V0-client-0" "$M0/test-18" "src0-"</div><div class='add'>+src0_file=$dstfilename</div><div class='add'>+TEST touch $M0/test-18/$src0_file</div><div class='add'>+</div><div class='add'>+TEST first_filename_with_same_hashsubvol "$V0-client-1" "$M0/test-18" "src-"</div><div class='add'>+src_file=$dstfilename</div><div class='add'>+</div><div class='add'>+mv $M0/test-18/$src0_file  $M0/test-18/$src_file</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+TEST first_filename_with_same_hashsubvol "$V0-client-2" "$M0/test-18" "dst0-"</div><div class='add'>+dst0_file=$dstfilename</div><div class='add'>+TEST touch $M0/test-18/$dst0_file</div><div class='add'>+</div><div class='add'>+TEST first_filename_with_same_hashsubvol "$V0-client-3" "$M0/test-18" "dst-"</div><div class='add'>+dst_file=$dstfilename</div><div class='add'>+</div><div class='add'>+mv $M0/test-18/$dst0_file  $M0/test-18/$dst_file</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+# 2. Rename the file</div><div class='add'>+</div><div class='add'>+mv $M0/test-18/$src_file  $M0/test-18/$dst_file</div><div class='add'>+</div><div class='add'>+# 3. Validate</div><div class='add'>+</div><div class='add'>+dst_hash_brick=$(get_brick_path_for_subvol "$V0-client-3")</div><div class='add'>+dst_cached_brick=$(get_brick_path_for_subvol "$V0-client-0")</div><div class='add'>+</div><div class='add'>+TEST stat $M0/test-18/$dst_file 2&gt;/dev/null</div><div class='add'>+TEST file_existence_check test-18/$dst_file "$V0-client-3" "$V0-client-0"</div><div class='add'>+TEST file_does_not_exist test-18/$src_file</div><div class='add'>+EXPECT "1" file_is_linkto $dst_hash_brick/test-18/$dst_file</div><div class='add'>+EXPECT "0" file_is_linkto $dst_cached_brick/test-18/$dst_file</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+# Cleanup</div><div class='add'>+cleanup</div><div class='add'>+</div><div class='head'>diff --git a/tests/basic/distribute/force-migration.t b/tests/basic/distribute/force-migration.t<br/>new file mode 100644<br/>index 00000000000..f6c4997a505<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/distribute/force-migration.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/distribute/force-migration.t</a></div><div class='hunk'>@@ -0,0 +1,50 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+#This tests checks if the file migration fails with force-migration</div><div class='add'>+#option set to off.</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/${V0}0 $H0:$B0/${V0}1</div><div class='add'>+TEST $CLI volume set $V0 performance.quick-read off</div><div class='add'>+TEST $CLI volume set $V0 performance.io-cache off</div><div class='add'>+TEST $CLI volume set $V0 performance.write-behind off</div><div class='add'>+TEST $CLI volume set $V0 performance.stat-prefetch off</div><div class='add'>+TEST $CLI volume set $V0 performance.read-ahead off</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+TEST glusterfs --volfile-id=/$V0 --volfile-server=$H0 $M0 --attribute-timeout=0 --entry-timeout=0</div><div class='add'>+TEST touch $M0/file</div><div class='add'>+#This rename creates a link file for tile in the other brick.</div><div class='add'>+TEST mv $M0/file $M0/tile</div><div class='add'>+#Lets keep writing to the file which will have a open fd</div><div class='add'>+dd if=/dev/zero of=$M0/tile bs=1b &amp;</div><div class='add'>+bg_pid=$!</div><div class='add'>+#Now rebalance will try to skip the file</div><div class='add'>+TEST $CLI volume set $V0 force-migration off</div><div class='add'>+TEST $CLI volume rebalance $V0 start force</div><div class='add'>+EXPECT_WITHIN $REBALANCE_TIMEOUT "completed" rebalance_status_field $V0</div><div class='add'>+skippedcount=`gluster v rebalance $V0 status | awk 'NR==3{print $6}'`</div><div class='add'>+TEST [[ $skippedcount -eq 1 ]]</div><div class='add'>+#file should be migrated now</div><div class='add'>+TEST $CLI volume set $V0 force-migration on</div><div class='add'>+TEST $CLI volume rebalance $V0 start force</div><div class='add'>+EXPECT_WITHIN $REBALANCE_TIMEOUT "completed" rebalance_status_field $V0</div><div class='add'>+skippedcount=`gluster v rebalance $V0 status | awk 'NR==3{print $6}'`</div><div class='add'>+rebalancedcount=`gluster v rebalance $V0 status | awk 'NR==3{print $2}'`</div><div class='add'>+TEST [[ $skippedcount -eq 0 ]]</div><div class='add'>+TEST [[ $rebalancedcount -eq 1 ]]</div><div class='add'>+kill -9 $bg_pid &gt; /dev/null 2&gt;&amp;1</div><div class='add'>+wait &gt; /dev/null 2&gt;&amp;1</div><div class='add'>+cleanup</div><div class='add'>+#Bad test because we are not sure writes are happening at the time of</div><div class='add'>+#rebalance. We need to write a test case which makes sure client</div><div class='add'>+#writes happen during rebalance. One way would be to set S+T bits on</div><div class='add'>+#src and write to file from client and then start rebalance. Currently</div><div class='add'>+#marking this as bad test.</div><div class='add'>+#G_TESTDEF_TEST_STATUS_CENTOS6=BAD_TEST,BUG=000000</div><div class='add'>+</div><div class='head'>diff --git a/tests/basic/distribute/lookup.t b/tests/basic/distribute/lookup.t<br/>new file mode 100644<br/>index 00000000000..f757bd99fd9<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/distribute/lookup.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/distribute/lookup.t</a></div><div class='hunk'>@@ -0,0 +1,54 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+. $(dirname $0)/../../nfs.rc</div><div class='add'>+. $(dirname $0)/../../common-utils.rc</div><div class='add'>+</div><div class='add'>+# Test overview:</div><div class='add'>+# Check that non-privileged users can also clean up stale linkto files</div><div class='add'>+#</div><div class='add'>+# 1. Use the current parallel-readdir behaviour of changing the DHT child subvols</div><div class='add'>+# in the graph to generate stale linkto files</div><div class='add'>+# 2. Access the file with the stale linkto file as a non-root user</div><div class='add'>+# 3. This should now succeed (returned EIO before commit 3fb1df7870e03c9de)</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/$V0-{1..3}</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+# Mount using FUSE and create a file</div><div class='add'>+TEST glusterfs -s $H0 --volfile-id $V0 $M0</div><div class='add'>+TEST glusterfs -s $H0 --volfile-id $V0 $M1</div><div class='add'>+</div><div class='add'>+ls $M0/FILE-1</div><div class='add'>+EXPECT "2" echo $?</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+# Create a file and a directory on $M0</div><div class='add'>+TEST dd if=/dev/urandom of=$M0/FILE-1 count=1 bs=16k</div><div class='add'>+TEST mkdir $M0/dir1</div><div class='add'>+</div><div class='add'>+ls $M0/FILE-1</div><div class='add'>+EXPECT "0" echo $?</div><div class='add'>+</div><div class='add'>+ls $M0/dir1</div><div class='add'>+EXPECT "0" echo $?</div><div class='add'>+</div><div class='add'>+#Use a fresh mount so as to trigger a fresh lookup</div><div class='add'>+TEST glusterfs -s $H0 --volfile-id $V0 $M1</div><div class='add'>+</div><div class='add'>+TEST ls $M1/FILE-1</div><div class='add'>+EXPECT "0" echo $?</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+ls $M1/dir1</div><div class='add'>+EXPECT "0" echo $?</div><div class='add'>+</div><div class='add'>+# Cleanup</div><div class='add'>+cleanup</div><div class='add'>+</div><div class='head'>diff --git a/tests/basic/distribute/non-root-unlink-stale-linkto.t b/tests/basic/distribute/non-root-unlink-stale-linkto.t<br/>new file mode 100644<br/>index 00000000000..d6c866ffc8e<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/distribute/non-root-unlink-stale-linkto.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/distribute/non-root-unlink-stale-linkto.t</a></div><div class='hunk'>@@ -0,0 +1,51 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+. $(dirname $0)/../../nfs.rc</div><div class='add'>+. $(dirname $0)/../../common-utils.rc</div><div class='add'>+</div><div class='add'>+# Test overview:</div><div class='add'>+# Check that non-privileged users can also clean up stale linkto files</div><div class='add'>+#</div><div class='add'>+# 1. Use the current parallel-readdir behaviour of changing the DHT child subvols</div><div class='add'>+# in the graph to generate stale linkto files</div><div class='add'>+# 2. Access the file with the stale linkto file as a non-root user</div><div class='add'>+# 3. This should now succeed (returned EIO before commit 3fb1df7870e03c9de)</div><div class='add'>+</div><div class='add'>+USERNAME=user11</div><div class='add'>+cleanup</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/$V0-{1,2}</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+TEST $CLI volume set $V0 performance.parallel-readdir on</div><div class='add'>+</div><div class='add'>+# Mount using FUSE and create a file</div><div class='add'>+TEST glusterfs -s $H0 --volfile-id $V0 $M0</div><div class='add'>+</div><div class='add'>+# Create a file for testing</div><div class='add'>+TEST dd if=/dev/urandom of=$M0/FILE-1 count=1 bs=16k</div><div class='add'>+</div><div class='add'>+#Rename to create a linkto file</div><div class='add'>+TEST mv $M0/FILE-1 $M0/FILE-2</div><div class='add'>+</div><div class='add'>+# This should change the graph and cause the linkto values to become stale</div><div class='add'>+TEST $CLI volume set $V0 performance.parallel-readdir off</div><div class='add'>+</div><div class='add'>+$CLI volume set $V0 allow-insecure on</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+TEST useradd -m $USERNAME</div><div class='add'>+</div><div class='add'>+#Use a fresh mount so as to trigger a lookup everywhere</div><div class='add'>+TEST glusterfs -s $H0 --volfile-id $V0 $M1</div><div class='add'>+TEST run_cmd_as_user $USERNAME "ls $M1/FILE-2"</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+# Cleanup</div><div class='add'>+TEST userdel --force $USERNAME</div><div class='add'>+cleanup</div><div class='add'>+</div><div class='head'>diff --git a/tests/basic/distribute/spare_file_rebalance.t b/tests/basic/distribute/spare_file_rebalance.t<br/>new file mode 100644<br/>index 00000000000..061c02f7392<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/distribute/spare_file_rebalance.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/distribute/spare_file_rebalance.t</a></div><div class='hunk'>@@ -0,0 +1,51 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+. $(dirname $0)/../../dht.rc</div><div class='add'>+</div><div class='add'>+# Initialize</div><div class='add'>+#------------------------------------------------------------</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+# Start glusterd</div><div class='add'>+TEST glusterd;</div><div class='add'>+TEST pidof glusterd;</div><div class='add'>+TEST $CLI volume info;</div><div class='add'>+</div><div class='add'>+# Create a volume</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/${V0}{1,2};</div><div class='add'>+</div><div class='add'>+# Verify volume creation</div><div class='add'>+EXPECT "$V0" volinfo_field $V0 'Volume Name';</div><div class='add'>+EXPECT 'Created' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+# Start volume and verify successful start</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+EXPECT 'Started' volinfo_field $V0 'Status';</div><div class='add'>+TEST glusterfs --volfile-id=$V0 --volfile-server=$H0 --entry-timeout=0 $M0;</div><div class='add'>+</div><div class='add'>+#------------------------------------------------------------</div><div class='add'>+</div><div class='add'>+# Test case - Create sparse files on MP and verify</div><div class='add'>+# file info after rebalance</div><div class='add'>+#------------------------------------------------------------</div><div class='add'>+</div><div class='add'>+# Create some sparse files and get their size</div><div class='add'>+TEST cd $M0;</div><div class='add'>+dd if=/dev/urandom of=sparse_file bs=10k count=1 seek=2M</div><div class='add'>+cp --sparse=always sparse_file sparse_file_3;</div><div class='add'>+</div><div class='add'>+# Add a 3rd brick</div><div class='add'>+TEST $CLI volume add-brick $V0 $H0:$B0/${V0}3;</div><div class='add'>+</div><div class='add'>+# Trigger rebalance</div><div class='add'>+TEST $CLI volume rebalance $V0 start force;</div><div class='add'>+EXPECT_WITHIN $REBALANCE_TIMEOUT "0" rebalance_completed;</div><div class='add'>+</div><div class='add'>+# Compare original and rebalanced files</div><div class='add'>+TEST cd $B0/${V0}2</div><div class='add'>+TEST cmp sparse_file $B0/${V0}3/sparse_file_3</div><div class='add'>+EXPECT_WITHIN 30 "";</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/basic/distribute/throttle-rebal.t b/tests/basic/distribute/throttle-rebal.t<br/>new file mode 100644<br/>index 00000000000..f4823cf4f21<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/distribute/throttle-rebal.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/distribute/throttle-rebal.t</a></div><div class='hunk'>@@ -0,0 +1,56 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+# Test to check</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+#Check rebal-throttle set option sanity</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/brick1 $H0:$B0/brick2</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+function set_throttle {</div><div class='add'>+        local level=$1</div><div class='add'>+        $CLI volume set $V0 cluster.rebal-throttle $level 2&gt;&amp;1 |grep -oE 'success|failed'</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#Determine number of cores</div><div class='add'>+cores=$(cat /proc/cpuinfo | grep processor | wc -l)</div><div class='add'>+if [ "$cores" == "" ]; then</div><div class='add'>+        echo "Could not get number of cores available"</div><div class='add'>+fi</div><div class='add'>+</div><div class='add'>+THROTTLE_LEVEL="lazy"</div><div class='add'>+EXPECT "success" set_throttle $THROTTLE_LEVEL</div><div class='add'>+EXPECT "$THROTTLE_LEVEL" echo `$CLI volume info | grep rebal-throttle | awk '{print $2}'`</div><div class='add'>+</div><div class='add'>+THROTTLE_LEVEL="normal"</div><div class='add'>+EXPECT "success" set_throttle $THROTTLE_LEVEL</div><div class='add'>+EXPECT "$THROTTLE_LEVEL" echo `$CLI volume info | grep rebal-throttle | awk '{print $2}'`</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+THROTTLE_LEVEL="aggressive"</div><div class='add'>+EXPECT "success" set_throttle $THROTTLE_LEVEL</div><div class='add'>+EXPECT "$THROTTLE_LEVEL" echo `$CLI volume info | grep rebal-throttle | awk '{print $2}'`</div><div class='add'>+</div><div class='add'>+THROTTLE_LEVEL="garbage"</div><div class='add'>+EXPECT "failed" set_throttle $THROTTLE_LEVEL</div><div class='add'>+</div><div class='add'>+#check if throttle-level is still aggressive</div><div class='add'>+EXPECT "aggressive" echo `$CLI volume info | grep rebal-throttle | awk '{print $2}'`</div><div class='add'>+</div><div class='add'>+EXPECT "success" set_throttle $cores</div><div class='add'>+</div><div class='add'>+#Setting thorttle number to be more than the number of cores should fail</div><div class='add'>+THORTTLE_LEVEL=$((cores+1))</div><div class='add'>+TEST echo $THORTTLE_LEVEL</div><div class='add'>+EXPECT "failed" set_throttle $THROTTLE_LEVEL</div><div class='add'>+EXPECT "$cores" echo `$CLI volume info | grep rebal-throttle | awk '{print $2}'`</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+TEST $CLI volume stop $V0;</div><div class='add'>+TEST $CLI volume delete $V0;</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/basic/ec/dht-rename.t b/tests/basic/ec/dht-rename.t<br/>new file mode 100644<br/>index 00000000000..81b41ff4c78<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/ec/dht-rename.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/ec/dht-rename.t</a></div><div class='hunk'>@@ -0,0 +1,19 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+# This test checks notify part of ec</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 disperse 3 redundancy 1 $H0:$B0/${V0}{0..5}</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+TEST $GFS --volfile-id=/$V0 --volfile-server=$H0 $M0;</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "3" ec_child_up_count $V0 0</div><div class='add'>+</div><div class='add'>+TEST touch $M0/1</div><div class='add'>+TEST mv $M0/1 $M0/10</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/basic/ec/ec-1468261.t b/tests/basic/ec/ec-1468261.t<br/>new file mode 100644<br/>index 00000000000..77d704cf880<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/ec/ec-1468261.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/ec/ec-1468261.t</a></div><div class='hunk'>@@ -0,0 +1,95 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+#</div><div class='add'>+# This test case verifies handling node down scenario with optimistic</div><div class='add'>+# changelog enabled on EC volume.</div><div class='add'>+###</div><div class='add'>+</div><div class='add'>+SCRIPT_TIMEOUT=300</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='add'>+</div><div class='add'>+#cleate and start volume</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 disperse 6 redundancy 2 $H0:$B0/${V0}{0..5}</div><div class='add'>+TEST $CLI volume set $V0 disperse.optimistic-change-log on</div><div class='add'>+TEST $CLI volume set $V0 disperse.other-eager-lock on</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+#Mount the volume</div><div class='add'>+TEST $GFS --volfile-id=/$V0 --volfile-server=$H0 $M0;</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "6" ec_child_up_count $V0 0</div><div class='add'>+</div><div class='add'>+#Verify that all is good</div><div class='add'>+TEST mkdir $M0/test_dir</div><div class='add'>+TEST touch $M0/test_dir/file</div><div class='add'>+sleep 2</div><div class='add'>+EXPECT_WITHIN $IO_WAIT_TIMEOUT "^$" get_hex_xattr trusted.ec.dirty $B0/${V0}0/test_dir</div><div class='add'>+EXPECT_WITHIN $IO_WAIT_TIMEOUT "^$" get_hex_xattr trusted.ec.dirty $B0/${V0}1/test_dir</div><div class='add'>+EXPECT_WITHIN $IO_WAIT_TIMEOUT "^$" get_hex_xattr trusted.ec.dirty $B0/${V0}2/test_dir</div><div class='add'>+EXPECT_WITHIN $IO_WAIT_TIMEOUT "^$" get_hex_xattr trusted.ec.dirty $B0/${V0}3/test_dir</div><div class='add'>+EXPECT_WITHIN $IO_WAIT_TIMEOUT "^$" get_hex_xattr trusted.ec.dirty $B0/${V0}4/test_dir</div><div class='add'>+EXPECT_WITHIN $IO_WAIT_TIMEOUT "^$" get_hex_xattr trusted.ec.dirty $B0/${V0}5/test_dir</div><div class='add'>+</div><div class='add'>+#Kill two bricks and touch a file</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}0</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}1</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "4" ec_child_up_count $V0 0</div><div class='add'>+TEST touch $M0/test_dir/new_file</div><div class='add'>+sleep 2</div><div class='add'>+</div><div class='add'>+#Dirty should be set on up bricks</div><div class='add'>+EXPECT_WITHIN $IO_WAIT_TIMEOUT  "^00000000000000010000000000000001$" get_hex_xattr trusted.ec.dirty $B0/${V0}2/test_dir</div><div class='add'>+EXPECT_WITHIN $IO_WAIT_TIMEOUT  "^00000000000000010000000000000001$" get_hex_xattr trusted.ec.dirty $B0/${V0}3/test_dir</div><div class='add'>+EXPECT_WITHIN $IO_WAIT_TIMEOUT  "^00000000000000010000000000000001$" get_hex_xattr trusted.ec.dirty $B0/${V0}4/test_dir</div><div class='add'>+EXPECT_WITHIN $IO_WAIT_TIMEOUT  "^00000000000000010000000000000001$" get_hex_xattr trusted.ec.dirty $B0/${V0}5/test_dir</div><div class='add'>+</div><div class='add'>+#Bring up the down bricks</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "6" ec_child_up_count $V0 0</div><div class='add'>+</div><div class='add'>+#remove mount point contents</div><div class='add'>+TEST rm -rf $M0"/*" 2&gt;/dev/null</div><div class='add'>+</div><div class='add'>+# unmount and remount the volume</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+TEST glusterfs -s $H0 --volfile-id $V0 $M0;</div><div class='add'>+</div><div class='add'>+#Create a tar file</div><div class='add'>+TEST mkdir /tmp/test_dir</div><div class='add'>+seq 1 3000 | xargs -n 1 -P 20 -I {} dd if=/dev/urandom of=/tmp/test_dir/file-{} bs=10K count=1</div><div class='add'>+tar -cf /tmp/test_dir.tar /tmp/test_dir/ 2&gt;/dev/null</div><div class='add'>+rm -rf /tmp/test_dir/</div><div class='add'>+</div><div class='add'>+#Untar the tar file</div><div class='add'>+tar -C $M0 -xf /tmp/test_dir.tar 2&gt;/dev/null&amp;</div><div class='add'>+</div><div class='add'>+#Kill 1st and 2nd brick</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}0</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}1</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "4" ec_child_up_count $V0 0</div><div class='add'>+</div><div class='add'>+#Stop untaring</div><div class='add'>+TEST kill %1</div><div class='add'>+rm -f /tmp/test_dir.tar</div><div class='add'>+</div><div class='add'>+#Bring up the down bricks</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "6" ec_child_up_count $V0 0</div><div class='add'>+</div><div class='add'>+#Wait for heal to complete</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "^0$" get_pending_heal_count $V0</div><div class='add'>+</div><div class='add'>+#Kill 3rd and 4th brick</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}3</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}4</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "4" ec_child_up_count $V0 0</div><div class='add'>+</div><div class='add'>+#remove mount point contents</div><div class='add'>+#this will fail if things are wrong</div><div class='add'>+TEST rm -rf $M0"/*" 2&gt;/dev/null</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/basic/ec/ec-3-1.t b/tests/basic/ec/ec-3-1.t<br/>new file mode 100644<br/>index 00000000000..511ca6420a2<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/ec/ec-3-1.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/ec/ec-3-1.t</a></div><div class='hunk'>@@ -0,0 +1,14 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+# This test checks basic dispersed volume functionality and cli interface</div><div class='add'>+</div><div class='add'>+DISPERSE=3</div><div class='add'>+REDUNDANCY=1</div><div class='add'>+</div><div class='add'>+# This must be equal to 36 * $DISPERSE + 109</div><div class='add'>+TESTS_EXPECTED_IN_LOOP=217</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/ec-common</div><div class='head'>diff --git a/tests/basic/ec/ec-4-1.t b/tests/basic/ec/ec-4-1.t<br/>new file mode 100644<br/>index 00000000000..3f0d0c72e44<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/ec/ec-4-1.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/ec/ec-4-1.t</a></div><div class='hunk'>@@ -0,0 +1,14 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+# This test checks basic dispersed volume functionality and cli interface</div><div class='add'>+</div><div class='add'>+DISPERSE=4</div><div class='add'>+REDUNDANCY=1</div><div class='add'>+</div><div class='add'>+# This must be equal to 36 * $DISPERSE + 109</div><div class='add'>+TESTS_EXPECTED_IN_LOOP=253</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/ec-common</div><div class='head'>diff --git a/tests/basic/ec/ec-5-2.t b/tests/basic/ec/ec-5-2.t<br/>new file mode 100644<br/>index 00000000000..6d9e91b0f58<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/ec/ec-5-2.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/ec/ec-5-2.t</a></div><div class='hunk'>@@ -0,0 +1,14 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+# This test checks basic dispersed volume functionality and cli interface</div><div class='add'>+</div><div class='add'>+DISPERSE=5</div><div class='add'>+REDUNDANCY=2</div><div class='add'>+</div><div class='add'>+# This must be equal to 36 * $DISPERSE + 109</div><div class='add'>+TESTS_EXPECTED_IN_LOOP=289</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/ec-common</div><div class='head'>diff --git a/tests/basic/ec/ec-6-2.t b/tests/basic/ec/ec-6-2.t<br/>new file mode 100644<br/>index 00000000000..b4451f905a1<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/ec/ec-6-2.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/ec/ec-6-2.t</a></div><div class='hunk'>@@ -0,0 +1,14 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+# This test checks basic dispersed volume functionality and cli interface</div><div class='add'>+</div><div class='add'>+DISPERSE=6</div><div class='add'>+REDUNDANCY=2</div><div class='add'>+</div><div class='add'>+# This must be equal to 36 * $DISPERSE + 109</div><div class='add'>+TESTS_EXPECTED_IN_LOOP=325</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/ec-common</div><div class='head'>diff --git a/tests/basic/ec/ec-anonymous-fd.t b/tests/basic/ec/ec-anonymous-fd.t<br/>new file mode 100644<br/>index 00000000000..a61628182ef<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/ec/ec-anonymous-fd.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/ec/ec-anonymous-fd.t</a></div><div class='hunk'>@@ -0,0 +1,42 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+. $(dirname $0)/../../fileio.rc</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='add'>+function num_entries {</div><div class='add'>+        ls -l $1 | wc -l</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 disperse 6 redundancy 2 $H0:$B0/${V0}{0..5}</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+TEST glusterfs --entry-timeout=0 --attribute-timeout=0 -s $H0 --volfile-id $V0 $M0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "6" ec_child_up_count $V0 0</div><div class='add'>+</div><div class='add'>+fd1=`fd_available`</div><div class='add'>+TEST fd_open $fd1 'w' $M0/file1</div><div class='add'>+TEST fd_write $fd1 testing</div><div class='add'>+TEST cat  $M0/file1</div><div class='add'>+TEST rm -rf $M0/file1</div><div class='add'>+TEST fd_write $fd1 testing</div><div class='add'>+TEST fd_write $fd1 testing</div><div class='add'>+TEST fd_write $fd1 testing</div><div class='add'>+</div><div class='add'>+EXPECT "^2$" num_entries $B0/${V0}0/.glusterfs/unlink/</div><div class='add'>+EXPECT "^2$" num_entries $B0/${V0}1/.glusterfs/unlink/</div><div class='add'>+EXPECT "^2$" num_entries $B0/${V0}2/.glusterfs/unlink/</div><div class='add'>+EXPECT "^2$" num_entries $B0/${V0}3/.glusterfs/unlink/</div><div class='add'>+EXPECT "^2$" num_entries $B0/${V0}4/.glusterfs/unlink/</div><div class='add'>+EXPECT "^2$" num_entries $B0/${V0}5/.glusterfs/unlink/</div><div class='add'>+TEST fd_close $fd1;</div><div class='add'>+EXPECT_WITHIN $UNLINK_TIMEOUT "^1$" num_entries $B0/${V0}0/.glusterfs/unlink/</div><div class='add'>+EXPECT_WITHIN $UNLINK_TIMEOUT "^1$" num_entries $B0/${V0}1/.glusterfs/unlink/</div><div class='add'>+EXPECT_WITHIN $UNLINK_TIMEOUT "^1$" num_entries $B0/${V0}2/.glusterfs/unlink/</div><div class='add'>+EXPECT_WITHIN $UNLINK_TIMEOUT "^1$" num_entries $B0/${V0}3/.glusterfs/unlink/</div><div class='add'>+EXPECT_WITHIN $UNLINK_TIMEOUT "^1$" num_entries $B0/${V0}4/.glusterfs/unlink/</div><div class='add'>+EXPECT_WITHIN $UNLINK_TIMEOUT "^1$" num_entries $B0/${V0}5/.glusterfs/unlink/</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/basic/ec/ec-background-heals.t b/tests/basic/ec/ec-background-heals.t<br/>new file mode 100644<br/>index 00000000000..29778a4f818<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/ec/ec-background-heals.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/ec/ec-background-heals.t</a></div><div class='hunk'>@@ -0,0 +1,105 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+# This test checks background heals option</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 disperse 3 redundancy 1 $H0:$B0/${V0}{0..2}</div><div class='add'>+TEST $CLI volume heal $V0 disable</div><div class='add'>+TEST $CLI volume set $V0 performance.stat-prefetch off</div><div class='add'>+TEST $CLI volume set $V0 performance.write-behind off</div><div class='add'>+TEST $CLI volume set $V0 performance.quick-read off</div><div class='add'>+TEST $CLI volume set $V0 performance.read-ahead off</div><div class='add'>+TEST $CLI volume set $V0 performance.io-cache off</div><div class='add'>+TEST $CLI volume set $V0 disperse.background-heals 0</div><div class='add'>+TEST $CLI volume set $V0 disperse.eager-lock off</div><div class='add'>+TEST $CLI volume set $V0 disperse.other-eager-lock off</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+TEST $GFS --volfile-id=/$V0 --volfile-server=$H0 $M0;</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "3" ec_child_up_count $V0 0</div><div class='add'>+EXPECT_WITHIN $CONFIG_UPDATE_TIMEOUT "0" mount_get_option_value $M0 $V0-disperse-0 background-heals</div><div class='add'>+EXPECT_WITHIN $CONFIG_UPDATE_TIMEOUT "0" mount_get_option_value $M0 $V0-disperse-0 heal-wait-qlength</div><div class='add'>+TEST touch $M0/a</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "^0$" count_sh_entries $B0/${V0}0</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "^0$" count_sh_entries $B0/${V0}1</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "^0$" count_sh_entries $B0/${V0}2</div><div class='add'>+</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}2</div><div class='add'>+echo abc &gt; $M0/a</div><div class='add'>+EXPECT 2 get_pending_heal_count $V0 #One for each active brick</div><div class='add'>+$CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "3" ec_child_up_count $V0 0</div><div class='add'>+#Accessing file shouldn't heal the file</div><div class='add'>+EXPECT "abc" cat $M0/a</div><div class='add'>+EXPECT 2 get_pending_heal_count $V0 #One for each active brick</div><div class='add'>+TEST $CLI volume set $V0 disperse.background-heals 1</div><div class='add'>+EXPECT_WITHIN $CONFIG_UPDATE_TIMEOUT "1" mount_get_option_value $M0 $V0-disperse-0 background-heals</div><div class='add'>+EXPECT_WITHIN $CONFIG_UPDATE_TIMEOUT "128" mount_get_option_value $M0 $V0-disperse-0 heal-wait-qlength</div><div class='add'>+#Accessing file should heal the file now</div><div class='add'>+EXPECT "abc" cat $M0/a</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "^0$" get_pending_heal_count $V0</div><div class='add'>+</div><div class='add'>+#Test above test cases with reset instead of setting background-heals to 1</div><div class='add'>+TEST $CLI volume set $V0 disperse.heal-wait-qlength 1024</div><div class='add'>+EXPECT_WITHIN $CONFIG_UPDATE_TIMEOUT "1" mount_get_option_value $M0 $V0-disperse-0 background-heals</div><div class='add'>+EXPECT_WITHIN $CONFIG_UPDATE_TIMEOUT "1024" mount_get_option_value $M0 $V0-disperse-0 heal-wait-qlength</div><div class='add'>+TEST $CLI volume set $V0 disperse.background-heals 0</div><div class='add'>+EXPECT_WITHIN $CONFIG_UPDATE_TIMEOUT "0" mount_get_option_value $M0 $V0-disperse-0 background-heals</div><div class='add'>+EXPECT_WITHIN $CONFIG_UPDATE_TIMEOUT "0" mount_get_option_value $M0 $V0-disperse-0 heal-wait-qlength</div><div class='add'>+TEST $CLI volume set $V0 disperse.heal-wait-qlength 200 #Changing qlength shouldn't affect anything now</div><div class='add'>+EXPECT_WITHIN $CONFIG_UPDATE_TIMEOUT "0" mount_get_option_value $M0 $V0-disperse-0 background-heals</div><div class='add'>+EXPECT_WITHIN $CONFIG_UPDATE_TIMEOUT "0" mount_get_option_value $M0 $V0-disperse-0 heal-wait-qlength</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}2</div><div class='add'>+echo abc &gt; $M0/a</div><div class='add'>+EXPECT 2 get_pending_heal_count $V0 #One for each active brick</div><div class='add'>+$CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "3" ec_child_up_count $V0 0</div><div class='add'>+#Accessing file shouldn't heal the file</div><div class='add'>+EXPECT "abc" cat $M0/a</div><div class='add'>+sleep 3</div><div class='add'>+EXPECT 2 get_pending_heal_count $V0 #One for each active brick</div><div class='add'>+TEST $CLI volume reset $V0 disperse.background-heals</div><div class='add'>+EXPECT_WITHIN $CONFIG_UPDATE_TIMEOUT "8" mount_get_option_value $M0 $V0-disperse-0 background-heals</div><div class='add'>+EXPECT_WITHIN $CONFIG_UPDATE_TIMEOUT "200" mount_get_option_value $M0 $V0-disperse-0 heal-wait-qlength</div><div class='add'>+#Accessing file should heal the file now</div><div class='add'>+EXPECT "abc" cat $M0/a</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "^0$" get_pending_heal_count $V0</div><div class='add'>+</div><div class='add'>+#Test that disabling background-heals still drains the queue</div><div class='add'>+TEST $CLI volume set $V0 disperse.background-heals 1</div><div class='add'>+TEST touch $M0/{a,b,c,d}</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}2</div><div class='add'>+EXPECT_WITHIN $CONFIG_UPDATE_TIMEOUT "1" mount_get_option_value $M0 $V0-disperse-0 background-heals</div><div class='add'>+EXPECT_WITHIN $CONFIG_UPDATE_TIMEOUT "200" mount_get_option_value $M0 $V0-disperse-0 heal-wait-qlength</div><div class='add'>+TEST truncate -s 1GB $M0/a</div><div class='add'>+echo abc &gt; $M0/b</div><div class='add'>+echo abc &gt; $M0/c</div><div class='add'>+echo abc &gt; $M0/d</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "3" ec_child_up_count $V0 0</div><div class='add'>+TEST chown root:root $M0/{a,b,c,d}</div><div class='add'>+TEST $CLI volume set $V0 disperse.background-heals 0</div><div class='add'>+EXPECT_NOT "0" mount_get_option_value $M0 $V0-disperse-0 heal-waiters</div><div class='add'>+TEST truncate -s 0 $M0/a # This completes the heal fast ;-)</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "^0$" get_pending_heal_count $V0</div><div class='add'>+</div><div class='add'>+#Test that background heals get rejected on meeting background-qlen limit</div><div class='add'>+TEST $CLI volume set $V0 disperse.background-heals 1</div><div class='add'>+TEST $CLI volume set $V0 disperse.heal-wait-qlength 0</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}2</div><div class='add'>+EXPECT_WITHIN $CONFIG_UPDATE_TIMEOUT "1" mount_get_option_value $M0 $V0-disperse-0 background-heals</div><div class='add'>+EXPECT_WITHIN $CONFIG_UPDATE_TIMEOUT "0" mount_get_option_value $M0 $V0-disperse-0 heal-wait-qlength</div><div class='add'>+TEST truncate -s 1GB $M0/a</div><div class='add'>+echo abc &gt; $M0/b</div><div class='add'>+echo abc &gt; $M0/c</div><div class='add'>+echo abc &gt; $M0/d</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "3" ec_child_up_count $V0 0</div><div class='add'>+TEST chown root:root $M0/{a,b,c,d}</div><div class='add'>+EXPECT "0" mount_get_option_value $M0 $V0-disperse-0 heal-waiters</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/basic/ec/ec-badfd.c b/tests/basic/ec/ec-badfd.c<br/>new file mode 100644<br/>index 00000000000..8be23c10eaf<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/ec/ec-badfd.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/ec/ec-badfd.c</a></div><div class='hunk'>@@ -0,0 +1,124 @@</div><div class='add'>+#include &lt;stdio.h&gt;</div><div class='add'>+#include &lt;fcntl.h&gt;</div><div class='add'>+#include &lt;unistd.h&gt;</div><div class='add'>+#include &lt;time.h&gt;</div><div class='add'>+#include &lt;limits.h&gt;</div><div class='add'>+#include &lt;string.h&gt;</div><div class='add'>+#include &lt;stdlib.h&gt;</div><div class='add'>+#include &lt;errno.h&gt;</div><div class='add'>+#include &lt;glusterfs/api/glfs.h&gt;</div><div class='add'>+#include &lt;glusterfs/api/glfs-handles.h&gt;</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+fill_iov(struct iovec *iov, char fillchar, int count)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    iov-&gt;iov_base = malloc(count + 1);</div><div class='add'>+    if (iov-&gt;iov_base == NULL) {</div><div class='add'>+        return ret;</div><div class='add'>+    } else {</div><div class='add'>+        iov-&gt;iov_len = count;</div><div class='add'>+        ret = 0;</div><div class='add'>+    }</div><div class='add'>+    memset(iov-&gt;iov_base, fillchar, count);</div><div class='add'>+    memset(iov-&gt;iov_base + count, '\0', 1);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+write_sync(glfs_t *fs, glfs_fd_t *glfd, int char_count)</div><div class='add'>+{</div><div class='add'>+    ssize_t ret = -1;</div><div class='add'>+    int flags = O_RDWR;</div><div class='add'>+    struct iovec iov = {0};</div><div class='add'>+</div><div class='add'>+    ret = fill_iov(&amp;iov, 'a', char_count);</div><div class='add'>+    if (ret) {</div><div class='add'>+        fprintf(stderr, "failed to create iov");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = glfs_pwritev(glfd, &amp;iov, 1, 0, flags);</div><div class='add'>+out:</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(stderr, "glfs_pwritev failed, %d", errno);</div><div class='add'>+    }</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+main(int argc, char *argv[])</div><div class='add'>+{</div><div class='add'>+    glfs_t *fs = NULL;</div><div class='add'>+    glfs_fd_t *fd = NULL;</div><div class='add'>+    int ret = 1;</div><div class='add'>+    char volume_cmd[4096] = {0};</div><div class='add'>+</div><div class='add'>+    if (argc != 4) {</div><div class='add'>+        fprintf(stderr, "Syntax: %s &lt;host&gt; &lt;volname&gt; &lt;file&gt;\n", argv[0]);</div><div class='add'>+        return 1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    fs = glfs_new(argv[2]);</div><div class='add'>+    if (!fs) {</div><div class='add'>+        fprintf(stderr, "glfs_new: returned NULL\n");</div><div class='add'>+        return 1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = glfs_set_volfile_server(fs, "tcp", argv[1], 24007);</div><div class='add'>+    if (ret != 0) {</div><div class='add'>+        fprintf(stderr, "glfs_set_volfile_server: returned %d\n", ret);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    ret = glfs_set_logging(fs, "/tmp/ec-badfd.log", 7);</div><div class='add'>+    if (ret != 0) {</div><div class='add'>+        fprintf(stderr, "glfs_set_logging: returned %d\n", ret);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    ret = glfs_init(fs);</div><div class='add'>+    if (ret != 0) {</div><div class='add'>+        fprintf(stderr, "glfs_init: returned %d\n", ret);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    fd = glfs_open(fs, argv[3], O_RDWR);</div><div class='add'>+    if (fd == NULL) {</div><div class='add'>+        fprintf(stderr, "glfs_open: returned NULL\n");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = write_sync(fs, fd, 16);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(stderr, "write_sync failed\n");</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    snprintf(volume_cmd, sizeof(volume_cmd),</div><div class='add'>+             "gluster --mode=script volume stop %s", argv[2]);</div><div class='add'>+    /*Stop the volume so that update-size-version fails*/</div><div class='add'>+    system(volume_cmd);</div><div class='add'>+    sleep(8); /* 3 seconds more than eager-lock-timeout*/</div><div class='add'>+    snprintf(volume_cmd, sizeof(volume_cmd),</div><div class='add'>+             "gluster --mode=script volume start %s", argv[2]);</div><div class='add'>+    system(volume_cmd);</div><div class='add'>+    sleep(8); /*wait for bricks to come up*/</div><div class='add'>+    ret = glfs_fsync(fd, NULL, NULL);</div><div class='add'>+    if (ret == 0) {</div><div class='add'>+        fprintf(stderr, "fsync succeeded on a BADFD\n");</div><div class='add'>+        exit(1);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = glfs_close(fd);</div><div class='add'>+    if (ret == 0) {</div><div class='add'>+        fprintf(stderr, "flush succeeded on a BADFD\n");</div><div class='add'>+        exit(1);</div><div class='add'>+    }</div><div class='add'>+    ret = 0;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    unlink("/tmp/ec-badfd.log");</div><div class='add'>+    glfs_fini(fs);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='head'>diff --git a/tests/basic/ec/ec-badfd.t b/tests/basic/ec/ec-badfd.t<br/>new file mode 100755<br/>index 00000000000..56feb47f115<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/ec/ec-badfd.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/ec/ec-badfd.t</a></div><div class='hunk'>@@ -0,0 +1,26 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 disperse 6 redundancy 2 $H0:$B0/${V0}{1..6}</div><div class='add'>+TEST $CLI volume set $V0 performance.write-behind off</div><div class='add'>+TEST $CLI volume set $V0 disperse.eager-lock-timeout 5</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+EXPECT 'Started' volinfo_field $V0 'Status'</div><div class='add'>+</div><div class='add'>+TEST $GFS -s $H0 --volfile-id $V0 $M0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "6" ec_child_up_count $V0 0</div><div class='add'>+TEST touch $M0/file</div><div class='add'>+</div><div class='add'>+TEST build_tester $(dirname $0)/ec-badfd.c -lgfapi -Wall -O2</div><div class='add'>+TEST $(dirname $0)/ec-badfd $H0 $V0 /file</div><div class='add'>+cleanup_tester $(dirname ${0})/ec-badfd</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/basic/ec/ec-common b/tests/basic/ec/ec-common<br/>new file mode 100644<br/>index 00000000000..152e3b51236<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/ec/ec-common?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/ec/ec-common</a></div><div class='hunk'>@@ -0,0 +1,145 @@</div><div class='add'>+SIZE_LIST="1048576 1000 12345 0"</div><div class='add'>+</div><div class='add'>+LAST_BRICK=$(($DISPERSE - 1))</div><div class='add'>+</div><div class='add'>+CHUNK_SIZE=512</div><div class='add'>+</div><div class='add'>+function fragment_size</div><div class='add'>+{</div><div class='add'>+    local fragments=$(($DISPERSE - $REDUNDANCY))</div><div class='add'>+    local block_size=$(($CHUNK_SIZE * $fragments))</div><div class='add'>+    local size=$(($1 + $block_size - 1))</div><div class='add'>+</div><div class='add'>+    echo $((( $size - ( $size ) % $block_size ) / $fragments))</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='add'>+</div><div class='add'>+tmp=`mktemp -d -t ${0##*/}.XXXXXX`</div><div class='add'>+if [ ! -d $tmp ]; then</div><div class='add'>+    exit 1</div><div class='add'>+fi</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 redundancy $REDUNDANCY $H0:$B0/${V0}{0..$LAST_BRICK}</div><div class='add'>+EXPECT 'Created' volinfo_field $V0 'Status'</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT 'Started' volinfo_field $V0 'Status'</div><div class='add'>+TEST $GFS --volfile-id=/$V0 --volfile-server=$H0 $M0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "$DISPERSE" ec_child_up_count $V0 0</div><div class='add'>+</div><div class='add'>+TEST dd if=/dev/urandom of=$tmp/small bs=1024 count=1</div><div class='add'>+TEST dd if=/dev/urandom of=$tmp/big bs=1024 count=4096</div><div class='add'>+</div><div class='add'>+cs_small=$(sha1sum $tmp/small | awk '{ print $1 }')</div><div class='add'>+cs_big=$(sha1sum $tmp/big | awk '{ print $1 }')</div><div class='add'>+cp $tmp/small $tmp/small1</div><div class='add'>+for size in $SIZE_LIST; do</div><div class='add'>+    truncate -s $size $tmp/small1</div><div class='add'>+    eval cs_small_truncate[$size]=$(sha1sum $tmp/small1 | awk '{ print $1 }')</div><div class='add'>+done</div><div class='add'>+cp $tmp/big $tmp/big1</div><div class='add'>+for size in $SIZE_LIST; do</div><div class='add'>+    truncate -s $size $tmp/big1</div><div class='add'>+    eval cs_big_truncate[$size]=$(sha1sum $tmp/big1 | awk '{ print $1 }')</div><div class='add'>+done</div><div class='add'>+</div><div class='add'>+TEST df -h $M0</div><div class='add'>+TEST stat $M0</div><div class='add'>+</div><div class='add'>+for idx in `seq 0 $LAST_BRICK`; do</div><div class='add'>+    brick[$idx]=$(gf_get_gfid_backend_file_path $B0/$V0$idx)</div><div class='add'>+done</div><div class='add'>+</div><div class='add'>+TEST stat $M0/</div><div class='add'>+TEST mkdir $M0/dir1</div><div class='add'>+TEST [ -d $M0/dir1 ]</div><div class='add'>+TEST touch $M0/file1</div><div class='add'>+TEST [ -f $M0/file1 ]</div><div class='add'>+</div><div class='add'>+for dir in . dir1; do</div><div class='add'>+    TEST cp $tmp/small $M0/$dir/small</div><div class='add'>+    TEST [ -f $M0/$dir/small ]</div><div class='add'>+    fsize=$(fragment_size 1024)</div><div class='add'>+    EXPECT "1024" stat -c "%s" $M0/$dir/small</div><div class='add'>+    for idx in `seq 0 $LAST_BRICK`; do</div><div class='add'>+        EXPECT "$fsize" stat -c "%s" ${brick[$idx]}/$dir/small</div><div class='add'>+    done</div><div class='add'>+</div><div class='add'>+    EXPECT "$cs_small" echo $(sha1sum $M0/$dir/small | awk '{ print $1 }')</div><div class='add'>+</div><div class='add'>+    TEST cp $tmp/big $M0/$dir/big</div><div class='add'>+    TEST [ -f $M0/$dir/big ]</div><div class='add'>+    fsize=$(fragment_size 4194304)</div><div class='add'>+    EXPECT "4194304" stat -c "%s" $M0/$dir/big</div><div class='add'>+    for idx in `seq 0 $LAST_BRICK`; do</div><div class='add'>+        EXPECT "$fsize" stat -c "%s" ${brick[$idx]}/$dir/big</div><div class='add'>+    done</div><div class='add'>+</div><div class='add'>+    EXPECT "$cs_big" echo $(sha1sum $M0/$dir/big | awk '{ print $1 }')</div><div class='add'>+</div><div class='add'>+# Give enough time for current operations to complete. Otherwise the</div><div class='add'>+# following kill_brick can cause data corruption and self-heal will be</div><div class='add'>+# needed, but this script is not prepared to handle self-healing.</div><div class='add'>+    sleep 2</div><div class='add'>+</div><div class='add'>+    for idx in `seq 0 $LAST_BRICK`; do</div><div class='add'>+        TEST kill_brick $V0 $H0 $B0/$V0$idx</div><div class='add'>+</div><div class='add'>+        EXPECT "1024" stat -c "%s" $M0/$dir/small</div><div class='add'>+        EXPECT "4194304" stat -c "%s" $M0/$dir/big</div><div class='add'>+</div><div class='add'>+        TEST $CLI volume start $V0 force</div><div class='add'>+        EXPECT_WITHIN $CHILD_UP_TIMEOUT "$DISPERSE" ec_child_up_count $V0 0</div><div class='add'>+    done</div><div class='add'>+</div><div class='add'>+    for size in $SIZE_LIST; do</div><div class='add'>+        TEST truncate -s $size $M0/$dir/small</div><div class='add'>+        TEST [ -f $M0/$dir/small ]</div><div class='add'>+        fsize=$(fragment_size $size)</div><div class='add'>+        EXPECT "$size" stat -c "%s" $M0/$dir/small</div><div class='add'>+        for idx in `seq 0 $LAST_BRICK`; do</div><div class='add'>+            EXPECT "$fsize" stat -c "%s" ${brick[$idx]}/$dir/small</div><div class='add'>+        done</div><div class='add'>+</div><div class='add'>+        EXPECT "${cs_small_truncate[$size]}" echo $(sha1sum $M0/$dir/small | awk '{ print $1 }')</div><div class='add'>+</div><div class='add'>+        TEST truncate -s $size $M0/$dir/big</div><div class='add'>+        TEST [ -f $M0/$dir/big ]</div><div class='add'>+        EXPECT "$size" stat -c "%s" $M0/$dir/big</div><div class='add'>+        for idx in `seq 0 $LAST_BRICK`; do</div><div class='add'>+            EXPECT "$fsize" stat -c "%s" ${brick[$idx]}/$dir/big</div><div class='add'>+        done</div><div class='add'>+</div><div class='add'>+        EXPECT "${cs_big_truncate[$size]}" echo $(sha1sum $M0/$dir/big | awk '{ print $1 }')</div><div class='add'>+    done</div><div class='add'>+</div><div class='add'>+    TEST rm -f $M0/$dir/small</div><div class='add'>+    TEST [ ! -e $M0/$dir/small ]</div><div class='add'>+    for idx in `seq 0 $LAST_BRICK`; do</div><div class='add'>+        TEST [ ! -e ${brick[$idx]}/$dir/small ]</div><div class='add'>+    done</div><div class='add'>+</div><div class='add'>+    TEST rm -f $M0/$dir/big</div><div class='add'>+    TEST [ ! -e $M0/$dir/big ]</div><div class='add'>+    for idx in `seq 0 $LAST_BRICK`; do</div><div class='add'>+        TEST [ ! -e ${brick[$idx]}/$dir/big ]</div><div class='add'>+    done</div><div class='add'>+done</div><div class='add'>+</div><div class='add'>+TEST rmdir $M0/dir1</div><div class='add'>+TEST [ ! -e $M0/dir1 ]</div><div class='add'>+for idx in `seq 0 $LAST_BRICK`; do</div><div class='add'>+    TEST [ ! -e ${brick[$idx]}/dir1 ]</div><div class='add'>+done</div><div class='add'>+</div><div class='add'>+TEST rm -f $M0/file1</div><div class='add'>+TEST [ ! -e $M0/file1 ]</div><div class='add'>+for idx in `seq 0 $LAST_BRICK`; do</div><div class='add'>+    TEST [ ! -e ${brick[$idx]}/file1 ]</div><div class='add'>+done</div><div class='add'>+</div><div class='add'>+rm -rf $tmp</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/basic/ec/ec-cpu-extensions.t b/tests/basic/ec/ec-cpu-extensions.t<br/>new file mode 100644<br/>index 00000000000..c9af27ea234<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/ec/ec-cpu-extensions.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/ec/ec-cpu-extensions.t</a></div><div class='hunk'>@@ -0,0 +1,62 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+DISPERSE=18</div><div class='add'>+REDUNDANCY=2</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+TESTS_EXPECTED_IN_LOOP=96</div><div class='add'>+</div><div class='add'>+function check_contents</div><div class='add'>+{</div><div class='add'>+    local src=$1</div><div class='add'>+    local cs=$2</div><div class='add'>+</div><div class='add'>+    TEST cp $src $M0/file</div><div class='add'>+    TEST [ -f $M0/file ]</div><div class='add'>+</div><div class='add'>+    for ext in none x64 sse avx; do</div><div class='add'>+        EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+        TEST $CLI volume set $V0 disperse.cpu-extensions $ext</div><div class='add'>+        TEST $GFS --volfile-id=/$V0 --volfile-server=$H0 $M0</div><div class='add'>+        EXPECT_WITHIN $CHILD_UP_TIMEOUT "$DISPERSE" ec_child_up_count $V0 0</div><div class='add'>+</div><div class='add'>+        EXPECT "$cs" echo $(sha1sum $M0/file | awk '{ print $1 }')</div><div class='add'>+    done</div><div class='add'>+</div><div class='add'>+    TEST rm -f $M0/file</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='add'>+</div><div class='add'>+tmp=`mktemp -p ${LOGDIR} -d -t ${0##*/}.XXXXXX`</div><div class='add'>+if [ ! -d $tmp ]; then</div><div class='add'>+    exit 1</div><div class='add'>+fi</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 redundancy $REDUNDANCY $H0:$B0/${V0}{1..$DISPERSE}</div><div class='add'>+TEST $CLI volume set $V0 performance.flush-behind off</div><div class='add'>+TEST $CLI volume set $V0 disperse.read-policy round-robin</div><div class='add'>+EXPECT 'Created' volinfo_field $V0 'Status'</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT 'Started' volinfo_field $V0 'Status'</div><div class='add'>+</div><div class='add'>+TEST dd if=/dev/urandom of=$tmp/file bs=1048576 count=1</div><div class='add'>+cs_file=$(sha1sum $tmp/file | awk '{ print $1 }')</div><div class='add'>+</div><div class='add'>+for ext in none x64 sse avx; do</div><div class='add'>+    TEST $CLI volume set $V0 disperse.cpu-extensions $ext</div><div class='add'>+    TEST $GFS --volfile-id=/$V0 --volfile-server=$H0 $M0</div><div class='add'>+    EXPECT_WITHIN $CHILD_UP_TIMEOUT "$DISPERSE" ec_child_up_count $V0 0</div><div class='add'>+</div><div class='add'>+    check_contents $tmp/file $cs_file</div><div class='add'>+</div><div class='add'>+    EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+done</div><div class='add'>+</div><div class='add'>+TEST rm -rf $tmp</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/basic/ec/ec-data-heal.t b/tests/basic/ec/ec-data-heal.t<br/>new file mode 100755<br/>index 00000000000..2672661c6b1<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/ec/ec-data-heal.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/ec/ec-data-heal.t</a></div><div class='hunk'>@@ -0,0 +1,75 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+#This test checks data corruption after heal while IO is going on</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 disperse 3 redundancy 1 $H0:$B0/${V0}{0..2}</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+TEST $GFS --volfile-id=/$V0 --volfile-server=$H0 $M0;</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "3" ec_child_up_count $V0 0</div><div class='add'>+</div><div class='add'>+############ Start IO ###########</div><div class='add'>+TEST touch $M0/file</div><div class='add'>+#start background IO on file</div><div class='add'>+dd if=/dev/urandom of=$M0/file conv=fdatasync &amp;</div><div class='add'>+iopid=$(echo $!)</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+############ Kill and start brick0 for heal ###########</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "2" ec_child_up_count $V0 0</div><div class='add'>+#sleep so that data can be written which will be healed later</div><div class='add'>+sleep 10</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+##wait for heal info to become 0 and kill IO</div><div class='add'>+EXPECT_WITHIN $IO_HEAL_TIMEOUT "^0$" get_pending_heal_count $V0</div><div class='add'>+kill $iopid</div><div class='add'>+EXPECT_WITHIN $IO_HEAL_TIMEOUT "^0$" get_pending_heal_count $V0</div><div class='add'>+</div><div class='add'>+############### Check md5sum #########################</div><div class='add'>+</div><div class='add'>+## unmount and mount get md5sum after killing brick0</div><div class='add'>+</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}0</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+TEST $GFS --volfile-id=/$V0 --volfile-server=$H0 $M0;</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "2" ec_child_up_count $V0 0</div><div class='add'>+mdsum0=`md5sum $M0/file | awk '{print $1}'`</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "3" ec_child_up_count $V0 0</div><div class='add'>+</div><div class='add'>+## unmount and mount get md5sum after killing brick1</div><div class='add'>+</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}1</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+TEST $GFS --volfile-id=/$V0 --volfile-server=$H0 $M0;</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "2" ec_child_up_count $V0 0</div><div class='add'>+mdsum1=`md5sum $M0/file | awk '{print $1}'`</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "3" ec_child_up_count $V0 0</div><div class='add'>+</div><div class='add'>+## unmount and mount get md5sum after killing brick2</div><div class='add'>+</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}2</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+TEST $GFS --volfile-id=/$V0 --volfile-server=$H0 $M0;</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "2" ec_child_up_count $V0 0</div><div class='add'>+mdsum2=`md5sum $M0/file | awk '{print $1}'`</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "3" ec_child_up_count $V0 0</div><div class='add'>+</div><div class='add'>+# compare all the three md5sums</div><div class='add'>+EXPECT "$mdsum0" echo $mdsum1</div><div class='add'>+EXPECT "$mdsum0" echo $mdsum2</div><div class='add'>+EXPECT "$mdsum1" echo $mdsum2</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/basic/ec/ec-dirty-flags.t b/tests/basic/ec/ec-dirty-flags.t<br/>new file mode 100644<br/>index 00000000000..68e66103f08<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/ec/ec-dirty-flags.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/ec/ec-dirty-flags.t</a></div><div class='hunk'>@@ -0,0 +1,23 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+# This checks if the fop keeps the dirty flags settings correctly after</div><div class='add'>+# finishing the fop.</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 disperse 3 redundancy 1 $H0:$B0/${V0}{0..2}</div><div class='add'>+TEST $CLI volume heal $V0 disable</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+TEST $GFS --volfile-id=/$V0 --volfile-server=$H0 $M0;</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "3" ec_child_up_count $V0 0</div><div class='add'>+cd $M0</div><div class='add'>+for i in {1..1000}; do dd if=/dev/zero of=file-${i} bs=512k count=2; done</div><div class='add'>+cd -</div><div class='add'>+EXPECT "^0$" get_pending_heal_count $V0</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/basic/ec/ec-discard.t b/tests/basic/ec/ec-discard.t<br/>new file mode 100644<br/>index 00000000000..001f4498c86<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/ec/ec-discard.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/ec/ec-discard.t</a></div><div class='hunk'>@@ -0,0 +1,205 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+#</div><div class='add'>+# Test discard functionality</div><div class='add'>+#</div><div class='add'>+# Test that basic discard (hole punch) functionality works via the fallocate</div><div class='add'>+# command line tool. Hole punch deallocates a region of a file, creating a hole</div><div class='add'>+# and a zero-filled data region. We verify that hole punch works, frees blocks</div><div class='add'>+# and that subsequent reads do not read stale data (caches are invalidated).</div><div class='add'>+#</div><div class='add'>+# NOTE: fuse fallocate is known to be broken with regard to cache invalidation</div><div class='add'>+# 	up to 3.9.0 kernels. Therefore, FOPEN_KEEP_CACHE is not used in this</div><div class='add'>+#	test (opens will invalidate the fuse cache).</div><div class='add'>+###</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../fallocate.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='add'>+</div><div class='add'>+#cleate and start volume</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 disperse 6 redundancy 2 $H0:$B0/${V0}{0..5}</div><div class='add'>+TEST $CLI volume set $V0 disperse.optimistic-change-log on</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+#Mount the volume</div><div class='add'>+TEST $GFS --volfile-id=/$V0 --volfile-server=$H0 $M0;</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "6" ec_child_up_count $V0 0</div><div class='add'>+</div><div class='add'>+#Check for fallocate and hole punch support</div><div class='add'>+require_fallocate -l 1m $M0/file</div><div class='add'>+require_fallocate -p -l 512k $M0/file &amp;&amp; rm -f $M0/file</div><div class='add'>+</div><div class='add'>+#Write some data, punch a hole and verify the file content changes</div><div class='add'>+TEST dd if=/dev/urandom of=$M0/file bs=1024k count=1</div><div class='add'>+TEST cp $M0/file $M0/file.copy.pre</div><div class='add'>+TEST fallocate -p -o 512k -l 128k $M0/file</div><div class='add'>+TEST ! cmp $M0/file.copy.pre $M0/file</div><div class='add'>+TEST rm -f $M0/file $M0/file.copy.pre</div><div class='add'>+</div><div class='add'>+#Allocate some blocks, punch a hole and verify block allocation</div><div class='add'>+TEST fallocate -l 1m $M0/file</div><div class='add'>+blksz=`stat -c %B $M0/file`</div><div class='add'>+nblks=`stat -c %b $M0/file`</div><div class='add'>+TEST [ $(($blksz * $nblks)) -ge 1048576 ]</div><div class='add'>+TEST fallocate -p -o 512k -l 128k $M0/file</div><div class='add'>+nblks=`stat -c %b $M0/file`</div><div class='add'>+TEST [ $(($blksz * $nblks)) -lt $((933889)) ]</div><div class='add'>+TEST unlink $M0/file</div><div class='add'>+</div><div class='add'>+###Punch hole test cases without fallocate</div><div class='add'>+##With write</div><div class='add'>+#Touching starting boundary</div><div class='add'>+TEST dd if=/dev/urandom of=$B0/test_file bs=1024 count=8</div><div class='add'>+TEST cp $B0/test_file $M0/test_file</div><div class='add'>+TEST fallocate -p -o 0 -l 500 $B0/test_file</div><div class='add'>+TEST fallocate -p -o 0 -l 500 $M0/test_file</div><div class='add'>+TEST md5_sum=`get_md5_sum $B0/test_file`</div><div class='add'>+EXPECT $md5_sum get_md5_sum $M0/test_file</div><div class='add'>+TEST rm -f $B0/test_file $M0/test_file</div><div class='add'>+</div><div class='add'>+#Touching boundary</div><div class='add'>+TEST dd if=/dev/urandom of=$B0/test_file bs=1024 count=8</div><div class='add'>+TEST cp $B0/test_file $M0/test_file</div><div class='add'>+TEST fallocate -p -o 500 -l 1548 $B0/test_file</div><div class='add'>+TEST fallocate -p -o 500 -l 1548 $M0/test_file</div><div class='add'>+TEST md5_sum=`get_md5_sum $B0/test_file`</div><div class='add'>+EXPECT $md5_sum get_md5_sum $M0/test_file</div><div class='add'>+TEST rm -f $B0/test_file $M0/test_file</div><div class='add'>+</div><div class='add'>+#Not touching boundary</div><div class='add'>+TEST dd if=/dev/urandom of=$B0/test_file bs=1024 count=8</div><div class='add'>+TEST cp $B0/test_file $M0/test_file</div><div class='add'>+TEST fallocate -p -o 500 -l 1000 $B0/test_file</div><div class='add'>+TEST fallocate -p -o 500 -l 1000 $M0/test_file</div><div class='add'>+TEST md5_sum=`get_md5_sum $B0/test_file`</div><div class='add'>+EXPECT $md5_sum get_md5_sum $M0/test_file</div><div class='add'>+TEST rm -f $B0/test_file $M0/test_file</div><div class='add'>+</div><div class='add'>+#Over boundary</div><div class='add'>+TEST dd if=/dev/urandom of=$B0/test_file bs=1024 count=8</div><div class='add'>+TEST cp $B0/test_file $M0/test_file</div><div class='add'>+TEST fallocate -p -o 1500 -l 1000 $B0/test_file</div><div class='add'>+TEST fallocate -p -o 1500 -l 1000 $M0/test_file</div><div class='add'>+TEST md5_sum=`get_md5_sum $B0/test_file`</div><div class='add'>+EXPECT $md5_sum get_md5_sum $M0/test_file</div><div class='add'>+TEST rm -f $B0/test_file $M0/test_file</div><div class='add'>+</div><div class='add'>+###Punch hole test cases with fallocate</div><div class='add'>+##Without write</div><div class='add'>+</div><div class='add'>+#Zero size</div><div class='add'>+TEST dd if=/dev/urandom of=$M0/test_file bs=1024 count=8</div><div class='add'>+TEST ! fallocate -p -o 1500 -l 0 $M0/test_file</div><div class='add'>+</div><div class='add'>+#Negative size</div><div class='add'>+TEST ! fallocate -p -o 1500 -l -100 $M0/test_file</div><div class='add'>+TEST rm -f $M0/test_file</div><div class='add'>+</div><div class='add'>+#Touching boundary</div><div class='add'>+TEST dd if=/dev/urandom of=$B0/test_file bs=1024 count=8</div><div class='add'>+TEST cp $B0/test_file $M0/test_file</div><div class='add'>+TEST fallocate -p -o 2048 -l 2048 $B0/test_file</div><div class='add'>+TEST fallocate -p -o 2048 -l 2048 $M0/test_file</div><div class='add'>+TEST md5_sum=`get_md5_sum $B0/test_file`</div><div class='add'>+EXPECT $md5_sum get_md5_sum $M0/test_file</div><div class='add'>+TEST rm -f $B0/test_file $M0/test_file</div><div class='add'>+</div><div class='add'>+#Touching boundary,multiple stripe</div><div class='add'>+TEST dd if=/dev/urandom of=$B0/test_file bs=1024 count=8</div><div class='add'>+TEST cp $B0/test_file $M0/test_file</div><div class='add'>+TEST fallocate -p -o 2048 -l 4096 $B0/test_file</div><div class='add'>+TEST fallocate -p -o 2048 -l 4096 $M0/test_file</div><div class='add'>+TEST md5_sum=`get_md5_sum $B0/test_file`</div><div class='add'>+EXPECT $md5_sum get_md5_sum $M0/test_file</div><div class='add'>+TEST rm -f $B0/test_file $M0/test_file</div><div class='add'>+</div><div class='add'>+##With write</div><div class='add'>+</div><div class='add'>+#Size ends in boundary</div><div class='add'>+TEST dd if=/dev/urandom of=$B0/test_file bs=1024 count=8</div><div class='add'>+TEST cp $B0/test_file $M0/test_file</div><div class='add'>+TEST fallocate -p -o 600 -l 3496 $B0/test_file</div><div class='add'>+TEST fallocate -p -o 600 -l 3496 $M0/test_file</div><div class='add'>+TEST md5_sum=`get_md5_sum $B0/test_file`</div><div class='add'>+EXPECT $md5_sum get_md5_sum $M0/test_file</div><div class='add'>+TEST rm -f $B0/test_file $M0/test_file</div><div class='add'>+</div><div class='add'>+#Offset at boundary</div><div class='add'>+TEST dd if=/dev/urandom of=$B0/test_file bs=1024 count=8</div><div class='add'>+TEST cp $B0/test_file $M0/test_file</div><div class='add'>+TEST fallocate -p -o 2048 -l 3072 $B0/test_file</div><div class='add'>+TEST fallocate -p -o 2048 -l 3072 $M0/test_file</div><div class='add'>+TEST md5_sum=`get_md5_sum $B0/test_file`</div><div class='add'>+EXPECT $md5_sum get_md5_sum $M0/test_file</div><div class='add'>+TEST rm -f $B0/test_file $M0/test_file</div><div class='add'>+</div><div class='add'>+#Offset and Size not at boundary covering a stripe</div><div class='add'>+TEST dd if=/dev/urandom of=$B0/test_file bs=1024 count=8</div><div class='add'>+TEST cp $B0/test_file $M0/test_file</div><div class='add'>+TEST fallocate -p -o 1500 -l 3000 $B0/test_file</div><div class='add'>+TEST fallocate -p -o 1500 -l 3000 $M0/test_file</div><div class='add'>+TEST md5_sum=`get_md5_sum $B0/test_file`</div><div class='add'>+EXPECT $md5_sum get_md5_sum $M0/test_file</div><div class='add'>+TEST rm -f $B0/test_file $M0/test_file</div><div class='add'>+</div><div class='add'>+#Offset and Size not at boundary</div><div class='add'>+TEST dd if=/dev/urandom of=$B0/test_file bs=1024 count=8</div><div class='add'>+TEST cp $B0/test_file $M0/test_file</div><div class='add'>+TEST fallocate -p -o 1000 -l 3072 $B0/test_file</div><div class='add'>+TEST fallocate -p -o 1000 -l 3072 $M0/test_file</div><div class='add'>+TEST md5_sum=`get_md5_sum $B0/test_file`</div><div class='add'>+EXPECT $md5_sum get_md5_sum $M0/test_file</div><div class='add'>+</div><div class='add'>+#Data Corruption Tests</div><div class='add'>+#Kill brick1 and brick2</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}0</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}1</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "4" ec_child_up_count $V0 0</div><div class='add'>+</div><div class='add'>+#Unmount and mount</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0;</div><div class='add'>+TEST $GFS --volfile-id=/$V0 --volfile-server=$H0 $M0;</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "4" ec_child_up_count $V0 0</div><div class='add'>+</div><div class='add'>+#verify md5 sum</div><div class='add'>+EXPECT $md5_sum get_md5_sum $M0/test_file</div><div class='add'>+</div><div class='add'>+#Bring up the bricks</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "6" ec_child_up_count $V0 0</div><div class='add'>+</div><div class='add'>+#Kill brick3 and brick4</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}2</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}3</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "4" ec_child_up_count $V0 0</div><div class='add'>+</div><div class='add'>+#Unmount and mount</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0;</div><div class='add'>+TEST $GFS --volfile-id=/$V0 --volfile-server=$H0 $M0;</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "4" ec_child_up_count $V0 0</div><div class='add'>+</div><div class='add'>+#verify md5 sum</div><div class='add'>+EXPECT $md5_sum get_md5_sum $M0/test_file</div><div class='add'>+</div><div class='add'>+#Bring up the bricks</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "6" ec_child_up_count $V0 0</div><div class='add'>+</div><div class='add'>+#Kill brick5 and brick6</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}4</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}5</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "4" ec_child_up_count $V0 0</div><div class='add'>+</div><div class='add'>+#Unmount and mount</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0;</div><div class='add'>+TEST $GFS --volfile-id=/$V0 --volfile-server=$H0 $M0;</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "4" ec_child_up_count $V0 0</div><div class='add'>+</div><div class='add'>+#verify md5 sum</div><div class='add'>+EXPECT $md5_sum get_md5_sum $M0/test_file</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/basic/ec/ec-fallocate.t b/tests/basic/ec/ec-fallocate.t<br/>new file mode 100644<br/>index 00000000000..1b827eed7df<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/ec/ec-fallocate.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/ec/ec-fallocate.t</a></div><div class='hunk'>@@ -0,0 +1,72 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+#</div><div class='add'>+# Run several commands to verify basic fallocate functionality. We verify that</div><div class='add'>+# fallocate creates and allocates blocks to a file. We also verify that the keep</div><div class='add'>+# size option does not modify the file size.</div><div class='add'>+###</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+. $(dirname $0)/../../fallocate.rc</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='add'>+</div><div class='add'>+#cleate and start volume</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 disperse 3 redundancy 1 $H0:$B0/${V0}{0..2}</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+#Mount the volume</div><div class='add'>+TEST $GFS --volfile-id=/$V0 --volfile-server=$H0 $M0;</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "3" ec_child_up_count $V0 0</div><div class='add'>+</div><div class='add'>+# check for fallocate support before continuing the test</div><div class='add'>+require_fallocate -l 1m -n $M0/file &amp;&amp; rm -f $M0/file</div><div class='add'>+</div><div class='add'>+# fallocate a file and verify blocks are allocated</div><div class='add'>+TEST fallocate -l 1m $M0/file</div><div class='add'>+blksz=`stat -c %b $M0/file`</div><div class='add'>+nblks=`stat -c %B $M0/file`</div><div class='add'>+TEST [ $(($blksz * $nblks)) -eq 1048576 ]</div><div class='add'>+</div><div class='add'>+TEST unlink $M0/file</div><div class='add'>+</div><div class='add'>+# truncate a file to a fixed size, fallocate and verify that the size does not</div><div class='add'>+# change</div><div class='add'>+TEST truncate -s 1M $M0/file</div><div class='add'>+TEST fallocate -l 2m -n $M0/file</div><div class='add'>+blksz=`stat -c %b $M0/file`</div><div class='add'>+nblks=`stat -c %B $M0/file`</div><div class='add'>+sz=`stat -c %s $M0/file`</div><div class='add'>+TEST [ $sz -eq 1048576 ]</div><div class='add'>+# Note that gluster currently incorporates a hack to limit the number of blocks</div><div class='add'>+# reported as allocated to the file by the file size. We have allocated beyond the</div><div class='add'>+# file size here. Just check for non-zero allocation to avoid setting a land mine</div><div class='add'>+# for if/when that behavior might change.</div><div class='add'>+TEST [ ! $(($blksz * $nblks)) -eq 0 ]</div><div class='add'>+TEST unlink $M0/file</div><div class='add'>+</div><div class='add'>+# write some data, fallocate within and outside the range</div><div class='add'>+# and check for data corruption.</div><div class='add'>+TEST dd if=/dev/urandom of=$M0/file bs=1024k count=1</div><div class='add'>+TEST cp $M0/file $M0/file.copy.pre</div><div class='add'>+TEST fallocate -o 512k -l 128k $M0/file</div><div class='add'>+TEST cp $M0/file $M0/file.copy.post</div><div class='add'>+TEST cmp $M0/file.copy.pre $M0/file.copy.post</div><div class='add'>+TEST fallocate -o 1000k -l 128k $M0/file</div><div class='add'>+TEST cp $M0/file $M0/file.copy.post2</div><div class='add'>+TEST ! cmp $M0/file.copy.pre $M0/file.copy.post2</div><div class='add'>+TEST truncate -s 1M $M0/file.copy.post2</div><div class='add'>+TEST cmp $M0/file.copy.pre $M0/file.copy.post2</div><div class='add'>+TEST unlink $M0/file</div><div class='add'>+</div><div class='add'>+#Make sure offset/size are modified so that 3 blocks are allocated</div><div class='add'>+TEST touch $M0/f1</div><div class='add'>+TEST fallocate -o 1280 -l 1024 $M0/f1</div><div class='add'>+EXPECT "^2304$" stat -c "%s" $M0/f1</div><div class='add'>+EXPECT "^1536$" stat -c "%s" $B0/${V0}0/f1</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/basic/ec/ec-fast-fgetxattr.c b/tests/basic/ec/ec-fast-fgetxattr.c<br/>new file mode 100644<br/>index 00000000000..bf982151861<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/ec/ec-fast-fgetxattr.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/ec/ec-fast-fgetxattr.c</a></div><div class='hunk'>@@ -0,0 +1,129 @@</div><div class='add'>+#include &lt;stdio.h&gt;</div><div class='add'>+#include &lt;fcntl.h&gt;</div><div class='add'>+#include &lt;unistd.h&gt;</div><div class='add'>+#include &lt;time.h&gt;</div><div class='add'>+#include &lt;limits.h&gt;</div><div class='add'>+#include &lt;string.h&gt;</div><div class='add'>+#include &lt;stdlib.h&gt;</div><div class='add'>+#include &lt;errno.h&gt;</div><div class='add'>+#include &lt;glusterfs/api/glfs.h&gt;</div><div class='add'>+#include &lt;glusterfs/api/glfs-handles.h&gt;</div><div class='add'>+</div><div class='add'>+int cbk_complete = 0;</div><div class='add'>+ssize_t cbk_ret_val = 0;</div><div class='add'>+int</div><div class='add'>+fill_iov(struct iovec *iov, char fillchar, int count)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    iov-&gt;iov_base = malloc(count + 1);</div><div class='add'>+    if (iov-&gt;iov_base == NULL) {</div><div class='add'>+        return ret;</div><div class='add'>+    } else {</div><div class='add'>+        iov-&gt;iov_len = count;</div><div class='add'>+        ret = 0;</div><div class='add'>+    }</div><div class='add'>+    memset(iov-&gt;iov_base, fillchar, count);</div><div class='add'>+    memset(iov-&gt;iov_base + count, '\0', 1);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+write_async_cbk(glfs_fd_t *fd, ssize_t ret, struct stat *prestat,</div><div class='add'>+                struct stat *poststat, void *cookie)</div><div class='add'>+{</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(stderr, "glfs_write failed");</div><div class='add'>+    }</div><div class='add'>+    cbk_ret_val = ret;</div><div class='add'>+    cbk_complete = 1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+write_async(glfs_t *fs, glfs_fd_t *glfd, int char_count)</div><div class='add'>+{</div><div class='add'>+    ssize_t ret = -1;</div><div class='add'>+    int flags = O_RDWR;</div><div class='add'>+    struct iovec iov = {0};</div><div class='add'>+</div><div class='add'>+    ret = fill_iov(&amp;iov, 'a', char_count);</div><div class='add'>+    if (ret) {</div><div class='add'>+        fprintf(stderr, "failed to create iov");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = glfs_pwritev_async(glfd, &amp;iov, 1, 0, flags, write_async_cbk, NULL);</div><div class='add'>+out:</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(stderr, "glfs_pwritev async failed");</div><div class='add'>+    }</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+main(int argc, char *argv[])</div><div class='add'>+{</div><div class='add'>+    glfs_t *fs = NULL;</div><div class='add'>+    glfs_fd_t *fd = NULL;</div><div class='add'>+    int ret = 1;</div><div class='add'>+    char buf[1024] = {0};</div><div class='add'>+</div><div class='add'>+    if (argc != 4) {</div><div class='add'>+        fprintf(stderr, "Syntax: %s &lt;host&gt; &lt;volname&gt; &lt;file&gt;\n", argv[0]);</div><div class='add'>+        return 1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    fs = glfs_new(argv[2]);</div><div class='add'>+    if (!fs) {</div><div class='add'>+        fprintf(stderr, "glfs_new: returned NULL\n");</div><div class='add'>+        return 1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = glfs_set_volfile_server(fs, "tcp", argv[1], 24007);</div><div class='add'>+    if (ret != 0) {</div><div class='add'>+        fprintf(stderr, "glfs_set_volfile_server: returned %d\n", ret);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    ret = glfs_set_logging(fs, "/tmp/ec-fgetxattr.log", 7);</div><div class='add'>+    if (ret != 0) {</div><div class='add'>+        fprintf(stderr, "glfs_set_logging: returned %d\n", ret);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    ret = glfs_init(fs);</div><div class='add'>+    if (ret != 0) {</div><div class='add'>+        fprintf(stderr, "glfs_init: returned %d\n", ret);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    fd = glfs_open(fs, argv[3], O_RDWR | O_TRUNC);</div><div class='add'>+    if (fd == NULL) {</div><div class='add'>+        fprintf(stderr, "glfs_open: returned NULL\n");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = write_async(fs, fd, 16);</div><div class='add'>+    if (ret) {</div><div class='add'>+        fprintf(stderr, "write_async failed\n");</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    sleep(1);</div><div class='add'>+    ret = glfs_fgetxattr(fd, "trusted.glusterfs.abc", buf, sizeof buf);</div><div class='add'>+    while (cbk_complete != 1) {</div><div class='add'>+        /* ret will be -ve as xattr doesn't exist, and fgetxattr should</div><div class='add'>+         * return waaaayyy before writev */</div><div class='add'>+        ret = 0;</div><div class='add'>+        sleep(1);</div><div class='add'>+    }</div><div class='add'>+    if (cbk_ret_val &lt; 0) {</div><div class='add'>+        fprintf(stderr, "cbk_ret_val is -ve\n");</div><div class='add'>+        ret = -1;</div><div class='add'>+    }</div><div class='add'>+    glfs_close(fd);</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    unlink("/tmp/ec-fgetxattr.log");</div><div class='add'>+    glfs_fini(fs);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='head'>diff --git a/tests/basic/ec/ec-fast-fgetxattr.t b/tests/basic/ec/ec-fast-fgetxattr.t<br/>new file mode 100755<br/>index 00000000000..eb12fa4a0ba<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/ec/ec-fast-fgetxattr.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/ec/ec-fast-fgetxattr.t</a></div><div class='hunk'>@@ -0,0 +1,40 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 disperse 6 redundancy 2 $H0:$B0/${V0}{1..6}</div><div class='add'>+TEST $CLI volume set $V0 performance.quick-read off</div><div class='add'>+TEST $CLI volume set $V0 performance.write-behind off</div><div class='add'>+TEST $CLI volume set $V0 performance.io-cache off</div><div class='add'>+TEST $CLI volume set $V0 performance.stat-prefetch off</div><div class='add'>+TEST $CLI volume set $V0 performance.client-io-threads off</div><div class='add'>+TEST $CLI volume set $V0 brick-log-level DEBUG</div><div class='add'>+TEST $CLI volume set $V0 delay-gen posix</div><div class='add'>+TEST $CLI volume set $V0 delay-gen.delay-duration 10000000</div><div class='add'>+TEST $CLI volume set $V0 delay-gen.delay-percentage 100</div><div class='add'>+TEST $CLI volume set $V0 delay-gen.enable read,write</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+EXPECT 'Started' volinfo_field $V0 'Status'</div><div class='add'>+</div><div class='add'>+TEST $GFS -s $H0 --volfile-id $V0 $M0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "6" ec_child_up_count $V0 0</div><div class='add'>+TEST touch $M0/file</div><div class='add'>+</div><div class='add'>+# Perform two writes to make sure io-threads have enough threads to perform</div><div class='add'>+# things in parallel when the test execution happens.</div><div class='add'>+echo abc &gt; $M0/file1 &amp;</div><div class='add'>+echo abc &gt; $M0/file2 &amp;</div><div class='add'>+wait</div><div class='add'>+</div><div class='add'>+TEST build_tester $(dirname $0)/ec-fast-fgetxattr.c -lgfapi -Wall -O2</div><div class='add'>+TEST $(dirname $0)/ec-fast-fgetxattr $H0 $V0 /file</div><div class='add'>+cleanup_tester $(dirname ${0})/ec-fast-fgetxattr</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/basic/ec/ec-fix-openfd.t b/tests/basic/ec/ec-fix-openfd.t<br/>new file mode 100644<br/>index 00000000000..04fdd802c62<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/ec/ec-fix-openfd.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/ec/ec-fix-openfd.t</a></div><div class='hunk'>@@ -0,0 +1,111 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+. $(dirname $0)/../../fileio.rc</div><div class='add'>+</div><div class='add'>+# This test checks for open fd heal on EC</div><div class='add'>+</div><div class='add'>+#Create Volume</div><div class='add'>+cleanup</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 disperse 3 redundancy 1 $H0:$B0/${V0}{0..2}</div><div class='add'>+TEST $CLI volume set $V0 performance.read-after-open yes</div><div class='add'>+TEST $CLI volume set $V0 performance.lazy-open no</div><div class='add'>+TEST $CLI volume set $V0 performance.open-behind off</div><div class='add'>+TEST $CLI volume set $V0 disperse.background-heals 0</div><div class='add'>+TEST $CLI volume heal $V0 disable</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+#Mount the volume</div><div class='add'>+TEST $GFS --volfile-id=/$V0 --volfile-server=$H0 $M0;</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "3" ec_child_up_count $V0 0</div><div class='add'>+</div><div class='add'>+#Touch a file</div><div class='add'>+TEST touch "$M0/test_file"</div><div class='add'>+</div><div class='add'>+#Kill a brick</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "2" ec_child_up_count $V0 0</div><div class='add'>+</div><div class='add'>+#Open the file in write mode</div><div class='add'>+TEST fd=`fd_available`</div><div class='add'>+TEST fd_open $fd 'rw' "$M0/test_file"</div><div class='add'>+</div><div class='add'>+#Bring up the killed brick</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "3" ec_child_up_count $V0 0</div><div class='add'>+</div><div class='add'>+sleep 1</div><div class='add'>+</div><div class='add'>+#Test the fd count</div><div class='add'>+EXPECT "0" get_fd_count $V0 $H0 $B0/${V0}0 test_file</div><div class='add'>+EXPECT "1" get_fd_count $V0 $H0 $B0/${V0}1 test_file</div><div class='add'>+EXPECT "1" get_fd_count $V0 $H0 $B0/${V0}2 test_file</div><div class='add'>+</div><div class='add'>+#Write to file</div><div class='add'>+dd iflag=fullblock if=/dev/urandom bs=1024 count=2 &gt;&amp;$fd 2&gt;/dev/null</div><div class='add'>+</div><div class='add'>+#Test the fd count</div><div class='add'>+EXPECT "1" get_fd_count $V0 $H0 $B0/${V0}0 test_file</div><div class='add'>+</div><div class='add'>+#Close fd</div><div class='add'>+TEST fd_close $fd</div><div class='add'>+</div><div class='add'>+#Stop the volume</div><div class='add'>+TEST $CLI volume stop $V0</div><div class='add'>+</div><div class='add'>+#Start the volume</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+#Kill brick1</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "2" ec_child_up_count $V0 0</div><div class='add'>+</div><div class='add'>+#Unmount and mount</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0;</div><div class='add'>+TEST $GFS --volfile-id=/$V0 --volfile-server=$H0 $M0;</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "2" ec_child_up_count $V0 0</div><div class='add'>+</div><div class='add'>+#Calculate md5 sum</div><div class='add'>+md5sum0=`get_md5_sum "$M0/test_file"`</div><div class='add'>+</div><div class='add'>+#Bring up the brick</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "3" ec_child_up_count $V0 0</div><div class='add'>+</div><div class='add'>+#Kill brick2</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}1</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "2" ec_child_up_count $V0 0</div><div class='add'>+</div><div class='add'>+#Unmount and mount</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+TEST $GFS --volfile-id=/$V0 --volfile-server=$H0 $M0;</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "2" ec_child_up_count $V0 0</div><div class='add'>+</div><div class='add'>+#Calculate md5 sum</div><div class='add'>+md5sum1=`get_md5_sum "$M0/test_file"`</div><div class='add'>+</div><div class='add'>+#Bring up the brick</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "3" ec_child_up_count $V0 0</div><div class='add'>+</div><div class='add'>+#Kill brick3</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}2</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "2" ec_child_up_count $V0 0</div><div class='add'>+</div><div class='add'>+#Unmount and mount</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+TEST $GFS --volfile-id=/$V0 --volfile-server=$H0 $M0;</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "2" ec_child_up_count $V0 0</div><div class='add'>+</div><div class='add'>+#Calculate md5 sum</div><div class='add'>+md5sum2=`get_md5_sum "$M0/test_file"`</div><div class='add'>+</div><div class='add'>+#compare the md5sum</div><div class='add'>+EXPECT "$md5sum0" echo $md5sum1</div><div class='add'>+EXPECT "$md5sum0" echo $md5sum2</div><div class='add'>+EXPECT "$md5sum1" echo $md5sum2</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/basic/ec/ec-internal-xattrs.t b/tests/basic/ec/ec-internal-xattrs.t<br/>new file mode 100644<br/>index 00000000000..5ef0502e016<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/ec/ec-internal-xattrs.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/ec/ec-internal-xattrs.t</a></div><div class='hunk'>@@ -0,0 +1,45 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+# This test checks internal xattr handling in ec</div><div class='add'>+TESTS_EXPECTED_IN_LOOP=11</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='add'>+function get_ec_xattrs</div><div class='add'>+{</div><div class='add'>+        getfattr -d -m. -e hex $1 | grep trusted.ec</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function get_xattr_count</div><div class='add'>+{</div><div class='add'>+        getfattr -d -m. -e hex $1 | grep "trusted" | wc -l</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+declare -a xattrs=("trusted.ec.config" "trusted.ec.size" "trusted.ec.version" "trusted.ec.heal")</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 redundancy 2 $H0:$B0/${V0}{0..5}</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+TEST $GFS --volfile-id=/$V0 --volfile-server=$H0 $M0;</div><div class='add'>+# Wait until all 6 children have been recognized by the ec xlator</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "6" ec_child_up_count $V0 0</div><div class='add'>+TEST touch $M0/a</div><div class='add'>+</div><div class='add'>+#Check that internal xattrs are not modifiable or readable</div><div class='add'>+for x in "${xattrs[@]}"; do</div><div class='add'>+        TEST_IN_LOOP ! setfattr -n $x "abc" $M0/a</div><div class='add'>+        TEST_IN_LOOP ! setfattr -x $x "abc" $M0/a</div><div class='add'>+        if [ $x != "trusted.ec.heal" ];</div><div class='add'>+        then</div><div class='add'>+                TEST_IN_LOOP ! getfattr -n $x $M0/a</div><div class='add'>+        fi</div><div class='add'>+done</div><div class='add'>+</div><div class='add'>+TEST ! get_ec_xattrs $M0/a</div><div class='add'>+TEST setfattr -n trusted.abc -v 0x616263 $M0/a</div><div class='add'>+EXPECT "616263" get_hex_xattr trusted.abc $M0/a</div><div class='add'>+EXPECT "1" get_xattr_count $M0/a</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/basic/ec/ec-new-entry.t b/tests/basic/ec/ec-new-entry.t<br/>new file mode 100644<br/>index 00000000000..be97aecd8e2<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/ec/ec-new-entry.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/ec/ec-new-entry.t</a></div><div class='hunk'>@@ -0,0 +1,70 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='add'>+function num_entries {</div><div class='add'>+        ls -l $1 | wc -l</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function get_md5sum {</div><div class='add'>+        md5sum $1 | awk '{print $1}'</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#after replace-brick immediately trusted.ec.version will be absent, so if it</div><div class='add'>+#is present we can assume that heal attempted on root</div><div class='add'>+function root_heal_attempted {</div><div class='add'>+        if [ -z $(get_hex_xattr trusted.ec.version $1) ];</div><div class='add'>+        then</div><div class='add'>+                echo "N";</div><div class='add'>+        else</div><div class='add'>+                echo "Y";</div><div class='add'>+        fi</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 disperse 6 redundancy 2 $H0:$B0/${V0}{0..5}</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+TEST glusterfs --entry-timeout=0 --attribute-timeout=0 -s $H0 --volfile-id $V0 $M0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "6" ec_child_up_count $V0 0</div><div class='add'>+touch $M0/{1..10}</div><div class='add'>+touch $M0/11</div><div class='add'>+TEST mknod $M0/char c 1 5</div><div class='add'>+TEST mknod $M0/block b 4 5</div><div class='add'>+for i in {1..10}; do dd if=/dev/zero of=$M0/$i bs=1M count=1; done</div><div class='add'>+TEST $CLI volume replace-brick $V0 $H0:$B0/${V0}5 $H0:$B0/${V0}6 commit force</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "6" ec_child_up_count $V0 0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "Y" glustershd_up_status</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "6" ec_child_up_count_shd $V0 0</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "Y" root_heal_attempted $B0/${V0}6</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "^0$" get_pending_heal_count $V0</div><div class='add'>+#ls -l gives "Total" line so number of lines will be 1 more</div><div class='add'>+EXPECT "^14$" num_entries $B0/${V0}6</div><div class='add'>+EXPECT "^1 5$" stat -c "%t %T" $B0/${V0}6/char</div><div class='add'>+EXPECT "^4 5$" stat -c "%t %T" $B0/${V0}6/block</div><div class='add'>+ec_version=$(get_hex_xattr trusted.ec.version $B0/${V0}0)</div><div class='add'>+EXPECT "$ec_version" get_hex_xattr trusted.ec.version $B0/${V0}1</div><div class='add'>+EXPECT "$ec_version" get_hex_xattr trusted.ec.version $B0/${V0}2</div><div class='add'>+EXPECT "$ec_version" get_hex_xattr trusted.ec.version $B0/${V0}3</div><div class='add'>+EXPECT "$ec_version" get_hex_xattr trusted.ec.version $B0/${V0}4</div><div class='add'>+EXPECT "$ec_version" get_hex_xattr trusted.ec.version $B0/${V0}6</div><div class='add'>+file_md5sum=$(get_md5sum $M0/1)</div><div class='add'>+empty_md5sum=$(get_md5sum $M0/11)</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}0</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}1</div><div class='add'>+echo $file_md5sum</div><div class='add'>+EXPECT "$file_md5sum" get_md5sum $M0/1</div><div class='add'>+EXPECT "$file_md5sum" get_md5sum $M0/2</div><div class='add'>+EXPECT "$file_md5sum" get_md5sum $M0/3</div><div class='add'>+EXPECT "$file_md5sum" get_md5sum $M0/4</div><div class='add'>+EXPECT "$file_md5sum" get_md5sum $M0/5</div><div class='add'>+EXPECT "$file_md5sum" get_md5sum $M0/6</div><div class='add'>+EXPECT "$file_md5sum" get_md5sum $M0/7</div><div class='add'>+EXPECT "$file_md5sum" get_md5sum $M0/8</div><div class='add'>+EXPECT "$file_md5sum" get_md5sum $M0/9</div><div class='add'>+EXPECT "$file_md5sum" get_md5sum $M0/10</div><div class='add'>+EXPECT "$empty_md5sum" get_md5sum $M0/11</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/basic/ec/ec-notify.t b/tests/basic/ec/ec-notify.t<br/>new file mode 100644<br/>index 00000000000..53290b7c798<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/ec/ec-notify.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/ec/ec-notify.t</a></div><div class='hunk'>@@ -0,0 +1,101 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+# This test checks notify part of ec</div><div class='add'>+</div><div class='add'>+# We *know* some of these mounts will succeed but not be actually usable</div><div class='add'>+# (terrible idea IMO), so speed things up and eliminate some noise by</div><div class='add'>+# overriding this function.</div><div class='add'>+_GFS () {</div><div class='add'>+	glusterfs "$@"</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+ec_up_brick_count () {</div><div class='add'>+	local bricknum</div><div class='add'>+	for bricknum in $(seq 0 2); do</div><div class='add'>+		brick_up_status $V0 $H0 $B0/$V0$bricknum</div><div class='add'>+	done | grep -E '^1$' | wc -l</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 disperse 3 redundancy 1 $H0:$B0/${V0}{0..2}</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "3" ec_up_brick_count</div><div class='add'>+</div><div class='add'>+#First time mount tests.</div><div class='add'>+# When all the bricks are up, mount should succeed and up-children</div><div class='add'>+# count should be 3</div><div class='add'>+TEST $GFS --volfile-id=/$V0 --volfile-server=$H0 $M0;</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "3" ec_child_up_count $V0 0</div><div class='add'>+TEST stat $M0</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+</div><div class='add'>+# When the volume is stopped mount succeeds and up-children will be 0</div><div class='add'>+TEST $CLI volume stop $V0</div><div class='add'>+TEST $GFS --volfile-id=/$V0 --volfile-server=$H0 $M0;</div><div class='add'>+# Wait for 5 seconds even after that up_count should show 0</div><div class='add'>+sleep 5;</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "0" ec_child_up_count $V0 0</div><div class='add'>+TEST ! stat $M0</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+</div><div class='add'>+# When 2 bricks are up, mount should succeed and up-children</div><div class='add'>+# count should be 2</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}2</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "2" ec_up_brick_count</div><div class='add'>+TEST $GFS --volfile-id=/$V0 --volfile-server=$H0 $M0;</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "2" ec_child_up_count $V0 0</div><div class='add'>+TEST stat $M0</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+</div><div class='add'>+# When only 1 brick is up mount should fail.</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}1</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" ec_up_brick_count</div><div class='add'>+TEST $GFS --volfile-id=/$V0 --volfile-server=$H0 $M0;</div><div class='add'>+# Wait for 5 seconds even after that up_count should show 1</div><div class='add'>+sleep 5</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" ec_child_up_count $V0 0</div><div class='add'>+TEST ! stat $M0</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+</div><div class='add'>+# Mount already succeeded. Test that the brick up down are leading to correct</div><div class='add'>+# state changes in ec.</div><div class='add'>+TEST $CLI volume stop $V0</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "3" ec_up_brick_count</div><div class='add'>+TEST $GFS --volfile-id=/$V0 --volfile-server=$H0 $M0;</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "3" ec_child_up_count $V0 0</div><div class='add'>+TEST touch $M0/a</div><div class='add'>+</div><div class='add'>+# kill 1 brick and the up_count should become 2, fops should still succeed</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}1</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "2" ec_up_brick_count</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "2" ec_child_up_count $V0 0</div><div class='add'>+TEST touch $M0/b</div><div class='add'>+</div><div class='add'>+# kill one more brick and the up_count should become 1, fops should fail</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}2</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" ec_up_brick_count</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" ec_child_up_count $V0 0</div><div class='add'>+TEST ! touch $M0/c</div><div class='add'>+</div><div class='add'>+# kill one more brick and the up_count should become 0, fops should still fail</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "0" ec_up_brick_count</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "0" ec_child_up_count $V0 0</div><div class='add'>+TEST ! touch $M0/c</div><div class='add'>+</div><div class='add'>+# Bring up all the bricks up and see that up_count is 3 and fops are succeeding</div><div class='add'>+# again.</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "3" ec_up_brick_count</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "3" ec_child_up_count $V0 0</div><div class='add'>+TEST touch $M0/c</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/basic/ec/ec-optimistic-changelog.t b/tests/basic/ec/ec-optimistic-changelog.t<br/>new file mode 100644<br/>index 00000000000..a372cd39a64<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/ec/ec-optimistic-changelog.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/ec/ec-optimistic-changelog.t</a></div><div class='hunk'>@@ -0,0 +1,153 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+# This test checks optimistic-change-log option</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 disperse 3 redundancy 1 $H0:$B0/${V0}{0..2}</div><div class='add'>+TEST $CLI volume heal $V0 disable</div><div class='add'>+</div><div class='add'>+TEST $CLI volume set $V0 performance.stat-prefetch off</div><div class='add'>+TEST $CLI volume set $V0 performance.write-behind off</div><div class='add'>+TEST $CLI volume set $V0 performance.quick-read off</div><div class='add'>+TEST $CLI volume set $V0 performance.read-ahead off</div><div class='add'>+TEST $CLI volume set $V0 performance.io-cache off</div><div class='add'>+TEST $CLI volume set $V0 disperse.background-heals 0</div><div class='add'>+TEST $CLI volume set $V0 disperse.optimistic-change-log off</div><div class='add'>+TEST $CLI volume set $V0 disperse.eager-lock off</div><div class='add'>+TEST $CLI volume set $V0 disperse.other-eager-lock off</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+TEST $GFS --volfile-id=/$V0 --volfile-server=$H0 $M0;</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "3" ec_child_up_count $V0 0</div><div class='add'>+EXPECT_WITHIN $CONFIG_UPDATE_TIMEOUT "0" mount_get_option_value $M0 $V0-disperse-0 background-heals</div><div class='add'>+EXPECT_WITHIN $CONFIG_UPDATE_TIMEOUT "0" mount_get_option_value $M0 $V0-disperse-0 heal-wait-qlength</div><div class='add'>+</div><div class='add'>+TEST $CLI volume set $V0 disperse.background-heals 1</div><div class='add'>+TEST touch $M0/a</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "^0$" count_sh_entries $B0/${V0}0</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "^0$" count_sh_entries $B0/${V0}1</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "^0$" count_sh_entries $B0/${V0}2</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+### optimistic-change-log = off ; All bricks good. Test file operation</div><div class='add'>+echo abc &gt; $M0/a</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "^0$" get_pending_heal_count $V0</div><div class='add'>+</div><div class='add'>+############################################################</div><div class='add'>+</div><div class='add'>+## optimistic-change-log = off ; Kill one brick . Test file operation</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}2</div><div class='add'>+echo abc &gt; $M0/a</div><div class='add'>+EXPECT 2 get_pending_heal_count $V0 #One for each active brick</div><div class='add'>+$CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "3" ec_child_up_count $V0 0</div><div class='add'>+#Accessing file should heal the file now</div><div class='add'>+EXPECT "abc" cat $M0/a</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "^0$" get_pending_heal_count $V0</div><div class='add'>+</div><div class='add'>+############################################################</div><div class='add'>+</div><div class='add'>+## optimistic-change-log = off ; All bricks good. Test entry operation</div><div class='add'>+TEST touch $M0/b</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "^0$" get_pending_heal_count $V0</div><div class='add'>+</div><div class='add'>+############################################################</div><div class='add'>+</div><div class='add'>+## optimistic-change-log = off ; All bricks good. Test metadata operation</div><div class='add'>+TEST chmod 0777 $M0/b</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "^0$" get_pending_heal_count $V0</div><div class='add'>+</div><div class='add'>+############################################################</div><div class='add'>+</div><div class='add'>+## optimistic-change-log = off ; Kill one brick. Test entry operation</div><div class='add'>+</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}2</div><div class='add'>+TEST touch $M0/c</div><div class='add'>+EXPECT 4 get_pending_heal_count $V0 #two for each active brick</div><div class='add'>+$CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "3" ec_child_up_count $V0 0</div><div class='add'>+getfattr -d -m. -e hex $M0 2&gt;&amp;1 &gt; /dev/null</div><div class='add'>+getfattr -d -m. -e hex $M0/c 2&gt;&amp;1 &gt; /dev/null</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "^0$" get_pending_heal_count $V0</div><div class='add'>+</div><div class='add'>+############################################################</div><div class='add'>+</div><div class='add'>+## optimistic-change-log = off ; Kill one brick. Test metadata operation</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}2</div><div class='add'>+TEST chmod 0777 $M0/c</div><div class='add'>+EXPECT 2 get_pending_heal_count $V0 #One for each active brick</div><div class='add'>+$CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "3" ec_child_up_count $V0 0</div><div class='add'>+getfattr -d -m. -e hex $M0/c 2&gt;&amp;1 &gt; /dev/null</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "^0$" get_pending_heal_count $V0</div><div class='add'>+</div><div class='add'>+############################################################</div><div class='add'>+</div><div class='add'>+TEST $CLI volume set $V0 disperse.optimistic-change-log on</div><div class='add'>+</div><div class='add'>+### optimistic-change-log = on ; All bricks good. Test file operation</div><div class='add'>+</div><div class='add'>+echo abc &gt; $M0/aa</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "^0$" get_pending_heal_count $V0</div><div class='add'>+</div><div class='add'>+############################################################</div><div class='add'>+</div><div class='add'>+## optimistic-change-log = on ; Kill one brick. Test file operation</div><div class='add'>+</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}2</div><div class='add'>+echo abc &gt; $M0/aa</div><div class='add'>+EXPECT 2 get_pending_heal_count $V0 #One for each active brick</div><div class='add'>+$CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "3" ec_child_up_count $V0 0</div><div class='add'>+#Accessing file should heal the file now</div><div class='add'>+getfattr -d -m. -e hex $M0/aa 2&gt;&amp;1 &gt; /dev/null</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "^0$" get_pending_heal_count $V0</div><div class='add'>+</div><div class='add'>+############################################################</div><div class='add'>+</div><div class='add'>+## optimistic-change-log = on ; All bricks good. Test entry operation</div><div class='add'>+</div><div class='add'>+TEST touch $M0/bb</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "^0$" get_pending_heal_count $V0</div><div class='add'>+</div><div class='add'>+############################################################</div><div class='add'>+</div><div class='add'>+## optimistic-change-log = on ; All bricks good. Test metadata operation</div><div class='add'>+</div><div class='add'>+TEST chmod 0777 $M0/bb</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "^0$" get_pending_heal_count $V0</div><div class='add'>+</div><div class='add'>+############################################################</div><div class='add'>+</div><div class='add'>+## optimistic-change-log = on ; Kill one brick. Test entry operation</div><div class='add'>+</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}2</div><div class='add'>+TEST touch $M0/cc</div><div class='add'>+EXPECT 4 get_pending_heal_count $V0 #two for each active brick</div><div class='add'>+$CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "3" ec_child_up_count $V0 0</div><div class='add'>+getfattr -d -m. -e hex $M0 2&gt;&amp;1 &gt; /dev/null</div><div class='add'>+getfattr -d -m. -e hex $M0/cc 2&gt;&amp;1 &gt; /dev/null</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "^0$" get_pending_heal_count $V0</div><div class='add'>+</div><div class='add'>+############################################################</div><div class='add'>+</div><div class='add'>+## optimistic-change-log = on ; Kill one brick. Test metadata operation</div><div class='add'>+</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}2</div><div class='add'>+TEST chmod 0777 $M0/cc</div><div class='add'>+EXPECT 2 get_pending_heal_count $V0 #One for each active brick</div><div class='add'>+$CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "3" ec_child_up_count $V0 0</div><div class='add'>+getfattr -d -m. -e hex $M0/cc 2&gt;&amp;1 &gt; /dev/null</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "^0$" get_pending_heal_count $V0</div><div class='add'>+</div><div class='add'>+############################################################</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/basic/ec/ec-quorum-count.t b/tests/basic/ec/ec-quorum-count.t<br/>new file mode 100644<br/>index 00000000000..9310ebbb8f2<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/ec/ec-quorum-count.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/ec/ec-quorum-count.t</a></div><div class='hunk'>@@ -0,0 +1,167 @@</div><div class='add'>+ #!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+. $(dirname $0)/../../ec.rc</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 disperse 6 redundancy 2 $H0:$B0/${V0}{0..5}</div><div class='add'>+TEST $CLI volume create $V1 $H0:$B0/${V1}{0..5}</div><div class='add'>+TEST $CLI volume set $V0 disperse.eager-lock-timeout 5</div><div class='add'>+TEST $CLI volume set $V0 performance.flush-behind off</div><div class='add'>+TEST $CLI volume set $V0 disperse.background-heals 0</div><div class='add'>+TEST $CLI volume set $V0 disperse.heal-wait-qlength 0</div><div class='add'>+</div><div class='add'>+#Should fail on non-disperse volume</div><div class='add'>+TEST ! $CLI volume set $V1 disperse.quorum-count 5</div><div class='add'>+</div><div class='add'>+#Should succeed on a valid range</div><div class='add'>+TEST ! $CLI volume set $V0 disperse.quorum-count 0</div><div class='add'>+TEST ! $CLI volume set $V0 disperse.quorum-count -0</div><div class='add'>+TEST ! $CLI volume set $V0 disperse.quorum-count abc</div><div class='add'>+TEST ! $CLI volume set $V0 disperse.quorum-count 10abc</div><div class='add'>+TEST ! $CLI volume set $V0 disperse.quorum-count 1</div><div class='add'>+TEST ! $CLI volume set $V0 disperse.quorum-count 2</div><div class='add'>+TEST ! $CLI volume set $V0 disperse.quorum-count 3</div><div class='add'>+TEST $CLI volume set $V0 disperse.quorum-count 4</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+TEST glusterfs --entry-timeout=0 --attribute-timeout=0 -s $H0 --volfile-id $V0 $M0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "6" ec_child_up_count $V0 0</div><div class='add'>+</div><div class='add'>+#Test that the option is reflected in the mount</div><div class='add'>+EXPECT_WITHIN $CONFIG_UPDATE_TIMEOUT "^4$" ec_option_value $V0 $M0 0 quorum-count</div><div class='add'>+TEST $CLI volume reset $V0 disperse.quorum-count</div><div class='add'>+EXPECT_WITHIN $CONFIG_UPDATE_TIMEOUT "^0$" ec_option_value $V0 $M0 0 quorum-count</div><div class='add'>+TEST $CLI volume set $V0 disperse.quorum-count 6</div><div class='add'>+EXPECT_WITHIN $CONFIG_UPDATE_TIMEOUT "^6$" ec_option_value $V0 $M0 0 quorum-count</div><div class='add'>+</div><div class='add'>+TEST touch $M0/a</div><div class='add'>+TEST touch $M0/data</div><div class='add'>+TEST setfattr -n trusted.def -v def $M0/a</div><div class='add'>+TEST touch $M0/src</div><div class='add'>+TEST touch $M0/del-me</div><div class='add'>+TEST mkdir $M0/dir1</div><div class='add'>+TEST dd if=/dev/zero of=$M0/read-file bs=1M count=1 oflag=direct</div><div class='add'>+TEST dd if=/dev/zero of=$M0/del-file bs=1M count=1 oflag=direct</div><div class='add'>+TEST gf_rm_file_and_gfid_link $B0/${V0}0 del-file</div><div class='add'>+#modify operations should fail as the file is not in quorum</div><div class='add'>+TEST ! dd if=/dev/zero of=$M0/del-file bs=1M count=1 oflag=direct</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}0</div><div class='add'>+#Read should succeed even when quorum-count is not met</div><div class='add'>+TEST dd if=$M0/read-file of=/dev/null iflag=direct</div><div class='add'>+TEST ! touch $M0/a2</div><div class='add'>+TEST ! mkdir $M0/dir2</div><div class='add'>+TEST ! mknod  $M0/b2 b 4 5</div><div class='add'>+TEST ! ln -s $M0/a $M0/symlink</div><div class='add'>+TEST ! ln $M0/a $M0/link</div><div class='add'>+TEST ! mv $M0/src $M0/dst</div><div class='add'>+TEST ! rm -f $M0/del-me</div><div class='add'>+TEST ! rmdir $M0/dir1</div><div class='add'>+TEST ! dd if=/dev/zero of=$M0/a bs=1M count=1 conv=notrunc</div><div class='add'>+TEST ! dd if=/dev/zero of=$M0/data bs=1M count=1 conv=notrunc</div><div class='add'>+TEST ! truncate -s 0 $M0/a</div><div class='add'>+TEST ! setfattr -n trusted.abc -v abc $M0/a</div><div class='add'>+TEST ! setfattr -x trusted.def $M0/a</div><div class='add'>+TEST ! chmod +x $M0/a</div><div class='add'>+TEST ! fallocate -l 2m -n $M0/a</div><div class='add'>+TEST ! fallocate -p -l 512k $M0/a</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "^0$" get_pending_heal_count ${V0}</div><div class='add'>+</div><div class='add'>+# reset the option and check whether the default redundancy count is</div><div class='add'>+# accepted or not.</div><div class='add'>+TEST $CLI volume reset $V0 disperse.quorum-count</div><div class='add'>+EXPECT_WITHIN $CONFIG_UPDATE_TIMEOUT "^0$" ec_option_value $V0 $M0 0 quorum-count</div><div class='add'>+TEST touch $M0/a1</div><div class='add'>+TEST touch $M0/data1</div><div class='add'>+TEST setfattr -n trusted.def -v def $M0/a1</div><div class='add'>+TEST touch $M0/src1</div><div class='add'>+TEST touch $M0/del-me1</div><div class='add'>+TEST mkdir $M0/dir11</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}0</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}1</div><div class='add'>+TEST touch $M0/a21</div><div class='add'>+TEST mkdir $M0/dir21</div><div class='add'>+TEST mknod  $M0/b21 b 4 5</div><div class='add'>+TEST ln -s $M0/a1 $M0/symlink1</div><div class='add'>+TEST ln $M0/a1 $M0/link1</div><div class='add'>+TEST mv $M0/src1 $M0/dst1</div><div class='add'>+TEST rm -f $M0/del-me1</div><div class='add'>+TEST rmdir $M0/dir11</div><div class='add'>+TEST dd if=/dev/zero of=$M0/a1 bs=1M count=1 conv=notrunc</div><div class='add'>+TEST dd if=/dev/zero of=$M0/data1 bs=1M count=1 conv=notrunc</div><div class='add'>+TEST truncate -s 0 $M0/a1</div><div class='add'>+TEST setfattr -n trusted.abc -v abc $M0/a1</div><div class='add'>+TEST setfattr -x trusted.def $M0/a1</div><div class='add'>+TEST chmod +x $M0/a1</div><div class='add'>+TEST fallocate -l 2m -n $M0/a1</div><div class='add'>+TEST fallocate -p -l 512k $M0/a1</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "6" ec_child_up_count $V0 0</div><div class='add'>+</div><div class='add'>+TEST touch $M0/a2</div><div class='add'>+TEST touch $M0/data2</div><div class='add'>+TEST setfattr -n trusted.def -v def $M0/a1</div><div class='add'>+TEST touch $M0/src2</div><div class='add'>+TEST touch $M0/del-me2</div><div class='add'>+TEST mkdir $M0/dir12</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}0</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}1</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}2</div><div class='add'>+TEST ! touch $M0/a22</div><div class='add'>+TEST ! mkdir $M0/dir22</div><div class='add'>+TEST ! mknod  $M0/b22 b 4 5</div><div class='add'>+TEST ! ln -s $M0/a2 $M0/symlink2</div><div class='add'>+TEST ! ln $M0/a2 $M0/link2</div><div class='add'>+TEST ! mv $M0/src2 $M0/dst2</div><div class='add'>+TEST ! rm -f $M0/del-me2</div><div class='add'>+TEST ! rmdir $M0/dir12</div><div class='add'>+TEST ! dd if=/dev/zero of=$M0/a2 bs=1M count=1 conv=notrunc</div><div class='add'>+TEST ! dd if=/dev/zero of=$M0/data2 bs=1M count=1 conv=notrunc</div><div class='add'>+TEST ! truncate -s 0 $M0/a2</div><div class='add'>+TEST ! setfattr -n trusted.abc -v abc $M0/a2</div><div class='add'>+TEST ! setfattr -x trusted.def $M0/a2</div><div class='add'>+TEST ! chmod +x $M0/a2</div><div class='add'>+TEST ! fallocate -l 2m -n $M0/a2</div><div class='add'>+TEST ! fallocate -p -l 512k $M0/a2</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "6" ec_child_up_count $V0 0</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "^0$" get_pending_heal_count ${V0}</div><div class='add'>+</div><div class='add'>+# Set quorum-count to 5 and kill 1 brick and the fops should pass</div><div class='add'>+TEST $CLI volume set $V0 disperse.quorum-count 5</div><div class='add'>+EXPECT_WITHIN $CONFIG_UPDATE_TIMEOUT "^5$" ec_option_value $V0 $M0 0 quorum-count</div><div class='add'>+TEST touch $M0/a3</div><div class='add'>+TEST touch $M0/data3</div><div class='add'>+TEST setfattr -n trusted.def -v def $M0/a3</div><div class='add'>+TEST touch $M0/src3</div><div class='add'>+TEST touch $M0/del-me3</div><div class='add'>+TEST mkdir $M0/dir13</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}0</div><div class='add'>+TEST touch $M0/a31</div><div class='add'>+TEST mkdir $M0/dir31</div><div class='add'>+TEST mknod  $M0/b31 b 4 5</div><div class='add'>+TEST ln -s $M0/a3 $M0/symlink3</div><div class='add'>+TEST ln $M0/a3 $M0/link3</div><div class='add'>+TEST mv $M0/src3 $M0/dst3</div><div class='add'>+TEST rm -f $M0/del-me3</div><div class='add'>+TEST rmdir $M0/dir13</div><div class='add'>+TEST dd if=/dev/zero of=$M0/a3 bs=1M count=1 conv=notrunc</div><div class='add'>+TEST dd if=/dev/zero of=$M0/data3 bs=1M count=1 conv=notrunc</div><div class='add'>+TEST truncate -s 0 $M0/a3</div><div class='add'>+TEST setfattr -n trusted.abc -v abc $M0/a3</div><div class='add'>+TEST setfattr -x trusted.def $M0/a3</div><div class='add'>+TEST chmod +x $M0/a3</div><div class='add'>+TEST fallocate -l 2m -n $M0/a3</div><div class='add'>+TEST fallocate -p -l 512k $M0/a3</div><div class='add'>+TEST dd if=/dev/urandom of=$M0/heal-file bs=1M count=1 oflag=direct</div><div class='add'>+cksum_before_heal="$(md5sum $M0/heal-file | awk '{print $1}')"</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "^0$" get_pending_heal_count ${V0}</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}4</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}5</div><div class='add'>+cksum_after_heal=$(dd if=$M0/heal-file iflag=direct | md5sum | awk '{print $1}')</div><div class='add'>+TEST [[ $cksum_before_heal == $cksum_after_heal ]]</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/basic/ec/ec-read-mask.t b/tests/basic/ec/ec-read-mask.t<br/>new file mode 100644<br/>index 00000000000..ddb556f2973<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/ec/ec-read-mask.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/ec/ec-read-mask.t</a></div><div class='hunk'>@@ -0,0 +1,114 @@</div><div class='add'>+ #!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+. $(dirname $0)/../../ec.rc</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 disperse 6 redundancy 2 $H0:$B0/${V0}{0..5}</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+#Empty read-mask should fail</div><div class='add'>+TEST ! $GFS --xlator-option=*.ec-read-mask="" -s $H0 --volfile-id $V0 $M0</div><div class='add'>+</div><div class='add'>+#Less than 4 number of bricks should fail</div><div class='add'>+TEST ! $GFS --xlator-option="*.ec-read-mask=0" -s $H0 --volfile-id $V0 $M0</div><div class='add'>+TEST ! $GFS --xlator-option="*.ec-read-mask=0:1" -s $H0 --volfile-id $V0 $M0</div><div class='add'>+TEST ! $GFS --xlator-option=*.ec-read-mask="0:1:2" -s $H0 --volfile-id $V0 $M0</div><div class='add'>+</div><div class='add'>+#ids greater than 5 should fail</div><div class='add'>+TEST ! $GFS --xlator-option="*.ec-read-mask=0:1:2:6" -s $H0 --volfile-id $V0 $M0</div><div class='add'>+</div><div class='add'>+#ids less than 0 should fail</div><div class='add'>+TEST ! $GFS --xlator-option="*.ec-read-mask=0:-1:2:5" -s $H0 --volfile-id $V0 $M0</div><div class='add'>+</div><div class='add'>+#read-mask with non-alphabet or comma should fail</div><div class='add'>+TEST ! $GFS --xlator-option="*.ec-read-mask=0:1:2:5:abc" -s $H0 --volfile-id $V0 $M0</div><div class='add'>+TEST ! $GFS --xlator-option="*.ec-read-mask=0:1:2:5a" -s $H0 --volfile-id $V0 $M0</div><div class='add'>+</div><div class='add'>+#mount with at least 4 read-mask-ids and all of them valid should pass</div><div class='add'>+TEST $GFS --xlator-option="*.ec-read-mask=0:1:2:5:4:3" -s $H0 --volfile-id $V0 $M0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "6" ec_child_up_count $V0 0</div><div class='add'>+EXPECT "^111111$" ec_option_value $V0 $M0 0 read-mask</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+</div><div class='add'>+TEST $GFS --xlator-option="*.ec-read-mask=0:1:2:5" -s $H0 --volfile-id $V0 $M0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "6" ec_child_up_count $V0 0</div><div class='add'>+EXPECT "^100111$" ec_option_value $V0 $M0 0 read-mask</div><div class='add'>+</div><div class='add'>+TEST dd if=/dev/urandom of=$M0/a bs=1M count=1</div><div class='add'>+md5=$(md5sum $M0/a | awk '{print $1}')</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+</div><div class='add'>+#Read on the file should fail if any of the read-mask is down when number of</div><div class='add'>+#ids is data-count</div><div class='add'>+TEST $GFS --xlator-option="*.ec-read-mask=0:1:2:5" -s $H0 --volfile-id $V0 $M0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "6" ec_child_up_count $V0 0</div><div class='add'>+EXPECT "^100111$" ec_option_value $V0 $M0 0 read-mask</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}0</div><div class='add'>+TEST ! dd if=$M0/a of=/dev/null</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+</div><div class='add'>+TEST $GFS --xlator-option="*.ec-read-mask=0:1:2:5" -s $H0 --volfile-id $V0 $M0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "6" ec_child_up_count $V0 0</div><div class='add'>+EXPECT "^100111$" ec_option_value $V0 $M0 0 read-mask</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}1</div><div class='add'>+TEST ! dd if=$M0/a of=/dev/null</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+</div><div class='add'>+TEST $GFS --xlator-option="*.ec-read-mask=0:1:2:5" -s $H0 --volfile-id $V0 $M0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "6" ec_child_up_count $V0 0</div><div class='add'>+EXPECT "^100111$" ec_option_value $V0 $M0 0 read-mask</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}2</div><div class='add'>+TEST ! dd if=$M0/a of=/dev/null</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+</div><div class='add'>+TEST $GFS --xlator-option="*.ec-read-mask=0:1:2:5" -s $H0 --volfile-id $V0 $M0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "6" ec_child_up_count $V0 0</div><div class='add'>+EXPECT "^100111$" ec_option_value $V0 $M0 0 read-mask</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}5</div><div class='add'>+TEST ! dd if=$M0/a of=/dev/null</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+</div><div class='add'>+#Read on file should succeed when non-read-mask bricks are down</div><div class='add'>+TEST $GFS --xlator-option="*.ec-read-mask=0:1:2:5" -s $H0 --volfile-id $V0 $M0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "6" ec_child_up_count $V0 0</div><div class='add'>+EXPECT "^100111$" ec_option_value $V0 $M0 0 read-mask</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}3</div><div class='add'>+EXPECT "^$md5$" echo $(dd if=$M0/a | md5sum | awk '{print $1}')</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+</div><div class='add'>+TEST $GFS --xlator-option="*.ec-read-mask=0:1:2:5" -s $H0 --volfile-id $V0 $M0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "6" ec_child_up_count $V0 0</div><div class='add'>+EXPECT "^100111$" ec_option_value $V0 $M0 0 read-mask</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}4</div><div class='add'>+EXPECT "^$md5$" echo $(dd if=$M0/a | md5sum | awk '{print $1}')</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+</div><div class='add'>+TEST $GFS --xlator-option="*.ec-read-mask=0:1:2:5" -s $H0 --volfile-id $V0 $M0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "6" ec_child_up_count $V0 0</div><div class='add'>+EXPECT "^100111$" ec_option_value $V0 $M0 0 read-mask</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}3</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}4</div><div class='add'>+EXPECT "^$md5$" echo $(dd if=$M0/a | md5sum | awk '{print $1}')</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+</div><div class='add'>+#Deliberately corrupt chunks 3: 4 and check that reads still give correct data</div><div class='add'>+TEST dd if=/dev/zero of=$B0/${V0}3/a bs=256k count=1</div><div class='add'>+TEST dd if=/dev/zero of=$B0/${V0}4/a bs=256k count=1</div><div class='add'>+TEST $GFS --xlator-option="*.ec-read-mask=0:1:2:5" -s $H0 --volfile-id $V0 $M0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "6" ec_child_up_count $V0 0</div><div class='add'>+EXPECT "^100111$" ec_option_value $V0 $M0 0 read-mask</div><div class='add'>+EXPECT "^$md5$" echo $(dd if=$M0/a | md5sum | awk '{print $1}')</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/basic/ec/ec-read-policy.t b/tests/basic/ec/ec-read-policy.t<br/>new file mode 100644<br/>index 00000000000..fe6fe6576e7<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/ec/ec-read-policy.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/ec/ec-read-policy.t</a></div><div class='hunk'>@@ -0,0 +1,52 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 disperse 6 redundancy 2 $H0:$B0/${V0}{0..5}</div><div class='add'>+TEST $CLI volume set $V0 performance.quick-read off</div><div class='add'>+TEST $CLI volume set $V0 performance.io-cache off</div><div class='add'>+TEST $CLI volume set $V0 performance.write-behind off</div><div class='add'>+TEST $CLI volume set $V0 performance.stat-prefetch off</div><div class='add'>+TEST $CLI volume set $V0 performance.read-ahead off</div><div class='add'>+TEST $CLI volume heal $V0 disable</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+#Disable all caching</div><div class='add'>+TEST glusterfs --direct-io-mode=yes --entry-timeout=0 --attribute-timeout=0 -s $H0 --volfile-id $V0 $M0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "6" ec_child_up_count $V0 0</div><div class='add'>+#TEST volume operations work fine</div><div class='add'>+</div><div class='add'>+EXPECT "gfid-hash" mount_get_option_value $M0 $V0-disperse-0 read-policy</div><div class='add'>+TEST $CLI volume set $V0 disperse.read-policy round-robin</div><div class='add'>+EXPECT_WITHIN $CONFIG_UPDATE_TIMEOUT "round-robin" mount_get_option_value $M0 $V0-disperse-0 read-policy</div><div class='add'>+</div><div class='add'>+#TEST if the option gives the intended behavior. The way we perform this test</div><div class='add'>+#is by performing reads from the mount and write to /dev/null. If the</div><div class='add'>+#read-policy is round-robin, then all bricks should have read-fop where as</div><div class='add'>+#with gfid-hash number of bricks with reads should be equal to (num-bricks - redundancy)</div><div class='add'>+#count</div><div class='add'>+</div><div class='add'>+TEST $CLI volume profile $V0 start</div><div class='add'>+TEST dd if=/dev/zero of=$M0/1 bs=1M count=4</div><div class='add'>+#Perform reads now from file on the mount, this only tests dispatch_min</div><div class='add'>+TEST dd if=$M0/1 of=/dev/null bs=1M count=4</div><div class='add'>+#TEST that reads are executed on all bricks</div><div class='add'>+rr_reads=$($CLI volume profile $V0 info cumulative| grep -w READ | wc -l)</div><div class='add'>+EXPECT "^6$" echo $rr_reads</div><div class='add'>+TEST $CLI volume profile $V0 info clear</div><div class='add'>+</div><div class='add'>+TEST $CLI volume set $V0 disperse.read-policy gfid-hash</div><div class='add'>+EXPECT_WITHIN $CONFIG_UPDATE_TIMEOUT "gfid-hash" mount_get_option_value $M0 $V0-disperse-0 read-policy</div><div class='add'>+</div><div class='add'>+#Perform reads now from file on the mount, this only tests dispatch_min</div><div class='add'>+TEST dd if=$M0/1 of=/dev/null bs=1M count=4</div><div class='add'>+#TEST that reads are executed on all bricks</div><div class='add'>+gh_reads=$($CLI volume profile $V0 info cumulative| grep -w READ |  wc -l)</div><div class='add'>+EXPECT "^4$" echo $gh_reads</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/basic/ec/ec-readdir.t b/tests/basic/ec/ec-readdir.t<br/>new file mode 100644<br/>index 00000000000..fad101bcabe<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/ec/ec-readdir.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/ec/ec-readdir.t</a></div><div class='hunk'>@@ -0,0 +1,46 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+# This test checks that readdir works fine on distributed disperse volume</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 disperse 3 redundancy 1 $H0:$B0/${V0}{0..5}</div><div class='add'>+TEST $CLI volume heal $V0 disable</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+TEST $GFS --volfile-id=/$V0 --volfile-server=$H0 $M0;</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "3" ec_child_up_count $V0 0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "3" ec_child_up_count $V0 1</div><div class='add'>+</div><div class='add'>+TEST mkdir $M0/d</div><div class='add'>+TEST touch $M0/d/{1..100}</div><div class='add'>+EXPECT "100" echo $(ls $M0/d/* | wc -l)</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}0</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}3</div><div class='add'>+TEST rm -rf $M0/d/{1..100}</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "3" ec_child_up_count $V0 0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "3" ec_child_up_count $V0 1</div><div class='add'>+#Do it 3 times so that even with all load balancing, readdir never falls</div><div class='add'>+#on stale bricks</div><div class='add'>+EXPECT "0" echo $(ls $M0/d/ | wc -l)</div><div class='add'>+EXPECT "0" echo $(ls $M0/d/ | wc -l)</div><div class='add'>+EXPECT "0" echo $(ls $M0/d/ | wc -l)</div><div class='add'>+#Do the same test above for creation of entries</div><div class='add'>+TEST mkdir $M0/d1</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}0</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}3</div><div class='add'>+TEST touch $M0/d1/{1..100}</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "3" ec_child_up_count $V0 0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "3" ec_child_up_count $V0 1</div><div class='add'>+#Do it 3 times so that even with all load balancing, readdir never falls</div><div class='add'>+#on stale bricks</div><div class='add'>+EXPECT "100" echo $(ls $M0/d1/ | wc -l)</div><div class='add'>+EXPECT "100" echo $(ls $M0/d1/ | wc -l)</div><div class='add'>+EXPECT "100" echo $(ls $M0/d1/ | wc -l)</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/basic/ec/ec-rebalance.t b/tests/basic/ec/ec-rebalance.t<br/>new file mode 100644<br/>index 00000000000..6cda3a3e4be<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/ec/ec-rebalance.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/ec/ec-rebalance.t</a></div><div class='hunk'>@@ -0,0 +1,61 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+#</div><div class='add'>+# This will test the rebalance failure reported in 1447559</div><div class='add'>+#</div><div class='add'>+###</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+. $(dirname $0)/../../fallocate.rc</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='add'>+</div><div class='add'>+#cleate and start volume</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 disperse 3 redundancy 1 $H0:$B0/${V0}{0..2}</div><div class='add'>+TEST $CLI volume set $V0 lookup-optimize on</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+#Mount the volume</div><div class='add'>+TEST $GFS --volfile-id=/$V0 --volfile-server=$H0 $M0;</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "3" ec_child_up_count $V0 0</div><div class='add'>+</div><div class='add'>+# Create files</div><div class='add'>+for i in {1..10}</div><div class='add'>+do</div><div class='add'>+    dd if=/dev/urandom of=$M0/file$i bs=1024k count=1</div><div class='add'>+done</div><div class='add'>+</div><div class='add'>+md5_1=$(md5sum $M0/file1 | awk '{print $1}')</div><div class='add'>+md5_2=$(md5sum $M0/file2 | awk '{print $1}')</div><div class='add'>+md5_3=$(md5sum $M0/file3 | awk '{print $1}')</div><div class='add'>+md5_4=$(md5sum $M0/file4 | awk '{print $1}')</div><div class='add'>+md5_5=$(md5sum $M0/file5 | awk '{print $1}')</div><div class='add'>+md5_6=$(md5sum $M0/file6 | awk '{print $1}')</div><div class='add'>+md5_7=$(md5sum $M0/file7 | awk '{print $1}')</div><div class='add'>+md5_8=$(md5sum $M0/file8 | awk '{print $1}')</div><div class='add'>+md5_9=$(md5sum $M0/file9 | awk '{print $1}')</div><div class='add'>+md5_10=$(md5sum $M0/file10 | awk '{print $1}')</div><div class='add'>+# Add brick</div><div class='add'>+TEST $CLI volume add-brick $V0 $H0:$B0/${V0}{3..5}</div><div class='add'>+</div><div class='add'>+#Trigger rebalance</div><div class='add'>+TEST $CLI volume rebalance $V0 start force</div><div class='add'>+EXPECT_WITHIN $REBALANCE_TIMEOUT "completed" rebalance_status_field $V0</div><div class='add'>+</div><div class='add'>+#Remount to avoid any caches</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+TEST $GFS --volfile-id=/$V0 --volfile-server=$H0 $M0;</div><div class='add'>+EXPECT "$md5_1" echo $(md5sum $M0/file1 | awk '{print $1}')</div><div class='add'>+EXPECT "$md5_2" echo $(md5sum $M0/file2 | awk '{print $1}')</div><div class='add'>+EXPECT "$md5_3" echo $(md5sum $M0/file3 | awk '{print $1}')</div><div class='add'>+EXPECT "$md5_4" echo $(md5sum $M0/file4 | awk '{print $1}')</div><div class='add'>+EXPECT "$md5_5" echo $(md5sum $M0/file5 | awk '{print $1}')</div><div class='add'>+EXPECT "$md5_6" echo $(md5sum $M0/file6 | awk '{print $1}')</div><div class='add'>+EXPECT "$md5_7" echo $(md5sum $M0/file7 | awk '{print $1}')</div><div class='add'>+EXPECT "$md5_8" echo $(md5sum $M0/file8 | awk '{print $1}')</div><div class='add'>+EXPECT "$md5_9" echo $(md5sum $M0/file9 | awk '{print $1}')</div><div class='add'>+EXPECT "$md5_10" echo $(md5sum $M0/file10 | awk '{print $1}')</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/basic/ec/ec-reset-brick.t b/tests/basic/ec/ec-reset-brick.t<br/>new file mode 100644<br/>index 00000000000..f1a625df4ff<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/ec/ec-reset-brick.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/ec/ec-reset-brick.t</a></div><div class='hunk'>@@ -0,0 +1,50 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='add'>+function num_entries {</div><div class='add'>+        ls -l $1 | wc -l</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 disperse 6 redundancy 2 $H0:$B0/${V0}{0..5}</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+TEST glusterfs --entry-timeout=0 --attribute-timeout=0 -s $H0 --volfile-id $V0 $M0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "6" ec_child_up_count $V0 0</div><div class='add'>+</div><div class='add'>+mkdir $M0/dir</div><div class='add'>+touch $M0/dir/{1..10}</div><div class='add'>+</div><div class='add'>+mkdir $M0/dir/dir1</div><div class='add'>+touch $M0/dir/dir1/{1..10}</div><div class='add'>+</div><div class='add'>+#kill brick process</div><div class='add'>+TEST $CLI volume reset-brick $V0 $H0:$B0/${V0}5 start</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "5" ec_child_up_count $V0 0</div><div class='add'>+</div><div class='add'>+#reset-brick by removing all the data and create dir again</div><div class='add'>+rm -rf $B0/${V0}5</div><div class='add'>+mkdir $B0/${V0}5</div><div class='add'>+</div><div class='add'>+#start brick  process and heal by commiting reset-brick</div><div class='add'>+TEST $CLI volume reset-brick $V0 $H0:$B0/${V0}5 $H0:$B0/${V0}5 commit force</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "Y" glustershd_up_status</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "6" ec_child_up_count_shd $V0 0</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "^0$" get_pending_heal_count ${V0}</div><div class='add'>+</div><div class='add'>+EXPECT "^12$" num_entries $B0/${V0}5/dir</div><div class='add'>+EXPECT "^11$" num_entries $B0/${V0}5/dir/dir1</div><div class='add'>+</div><div class='add'>+ec_version=$(get_hex_xattr trusted.ec.version $B0/${V0}0)</div><div class='add'>+EXPECT "$ec_version" get_hex_xattr trusted.ec.version $B0/${V0}1</div><div class='add'>+EXPECT "$ec_version" get_hex_xattr trusted.ec.version $B0/${V0}2</div><div class='add'>+EXPECT "$ec_version" get_hex_xattr trusted.ec.version $B0/${V0}3</div><div class='add'>+EXPECT "$ec_version" get_hex_xattr trusted.ec.version $B0/${V0}4</div><div class='add'>+EXPECT "$ec_version" get_hex_xattr trusted.ec.version $B0/${V0}5</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/basic/ec/ec-root-heal.t b/tests/basic/ec/ec-root-heal.t<br/>new file mode 100644<br/>index 00000000000..11ea7cdf9d4<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/ec/ec-root-heal.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/ec/ec-root-heal.t</a></div><div class='hunk'>@@ -0,0 +1,34 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='add'>+function num_entries {</div><div class='add'>+        ls -l $1 | wc -l</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 disperse 6 redundancy 2 $H0:$B0/${V0}{0..5}</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+TEST glusterfs --entry-timeout=0 --attribute-timeout=0 -s $H0 --volfile-id $V0 $M0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "6" ec_child_up_count $V0 0</div><div class='add'>+touch $M0/{1..10}</div><div class='add'>+TEST $CLI volume replace-brick $V0 $H0:$B0/${V0}5 $H0:$B0/${V0}6 commit force</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "Y" glustershd_up_status</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "6" ec_child_up_count_shd $V0 0</div><div class='add'>+</div><div class='add'>+# active heal</div><div class='add'>+TEST $CLI volume heal $V0 full</div><div class='add'>+#ls -l gives "Total" line so number of lines will be 1 more</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "^0$" get_pending_heal_count ${V0}</div><div class='add'>+EXPECT "^11$" num_entries $B0/${V0}6</div><div class='add'>+ec_version=$(get_hex_xattr trusted.ec.version $B0/${V0}0)</div><div class='add'>+EXPECT "$ec_version" get_hex_xattr trusted.ec.version $B0/${V0}1</div><div class='add'>+EXPECT "$ec_version" get_hex_xattr trusted.ec.version $B0/${V0}2</div><div class='add'>+EXPECT "$ec_version" get_hex_xattr trusted.ec.version $B0/${V0}3</div><div class='add'>+EXPECT "$ec_version" get_hex_xattr trusted.ec.version $B0/${V0}4</div><div class='add'>+EXPECT "$ec_version" get_hex_xattr trusted.ec.version $B0/${V0}6</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/basic/ec/ec-seek.t b/tests/basic/ec/ec-seek.t<br/>new file mode 100644<br/>index 00000000000..5a7d31b9f8f<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/ec/ec-seek.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/ec/ec-seek.t</a></div><div class='hunk'>@@ -0,0 +1,58 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='add'>+</div><div class='add'>+SEEK=$(dirname $0)/seek</div><div class='add'>+build_tester $(dirname $0)/../seek.c -o ${SEEK}</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume info</div><div class='add'>+</div><div class='add'>+TEST mkdir -p $B0/${V0}{0..2}</div><div class='add'>+TEST $CLI volume create $V0 disperse 3 redundancy 1 $H0:$B0/${V0}{0..2}</div><div class='add'>+</div><div class='add'>+EXPECT "$V0" volinfo_field $V0 'Volume Name'</div><div class='add'>+EXPECT 'Created' volinfo_field $V0 'Status'</div><div class='add'>+EXPECT '3' brick_count $V0</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT 'Started' volinfo_field $V0 'Status'</div><div class='add'>+</div><div class='add'>+TEST $GFS -s $H0 --volfile-id $V0 $M0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "3" ec_child_up_count $V0 0</div><div class='add'>+</div><div class='add'>+TEST ${SEEK} create ${M0}/test 0 1 1048576 1</div><div class='add'>+# Determine underlying filesystem allocation block size</div><div class='add'>+BSIZE="$(($(${SEEK} scan ${M0}/test hole 0) * 2))"</div><div class='add'>+</div><div class='add'>+TEST ${SEEK} create ${M0}/test 0 ${BSIZE} $((${BSIZE} * 4 + 512)) ${BSIZE}</div><div class='add'>+</div><div class='add'>+EXPECT "^0$" ${SEEK} scan ${M0}/test data 0</div><div class='add'>+EXPECT "^$((${BSIZE} / 2))$" ${SEEK} scan ${M0}/test data $((${BSIZE} / 2))</div><div class='add'>+EXPECT "^$((${BSIZE} - 1))$" ${SEEK} scan ${M0}/test data $((${BSIZE} - 1))</div><div class='add'>+EXPECT "^$((${BSIZE} * 4))$" ${SEEK} scan ${M0}/test data ${BSIZE}</div><div class='add'>+EXPECT "^$((${BSIZE} * 4))$" ${SEEK} scan ${M0}/test data $((${BSIZE} * 4))</div><div class='add'>+EXPECT "^$((${BSIZE} * 5))$" ${SEEK} scan ${M0}/test data $((${BSIZE} * 5))</div><div class='add'>+EXPECT "^$((${BSIZE} * 5 + 511))$" ${SEEK} scan ${M0}/test data $((${BSIZE} * 5 + 511))</div><div class='add'>+EXPECT "^ENXIO$" ${SEEK} scan ${M0}/test data $((${BSIZE} * 5 + 512))</div><div class='add'>+EXPECT "^ENXIO$" ${SEEK} scan ${M0}/test data $((${BSIZE} * 6))</div><div class='add'>+</div><div class='add'>+EXPECT "^${BSIZE}$" ${SEEK} scan ${M0}/test hole 0</div><div class='add'>+EXPECT "^${BSIZE}$" ${SEEK} scan ${M0}/test hole $((${BSIZE} / 2))</div><div class='add'>+EXPECT "^${BSIZE}$" ${SEEK} scan ${M0}/test hole $((${BSIZE} - 1))</div><div class='add'>+EXPECT "^${BSIZE}$" ${SEEK} scan ${M0}/test hole ${BSIZE}</div><div class='add'>+EXPECT "^$((${BSIZE} * 5 + 512))$" ${SEEK} scan ${M0}/test hole $((${BSIZE} * 4))</div><div class='add'>+EXPECT "^$((${BSIZE} * 5 + 512))$" ${SEEK} scan ${M0}/test hole $((${BSIZE} * 5))</div><div class='add'>+EXPECT "^$((${BSIZE} * 5 + 512))$" ${SEEK} scan ${M0}/test hole $((${BSIZE} * 5 + 511))</div><div class='add'>+EXPECT "^ENXIO$" ${SEEK} scan ${M0}/test hole $((${BSIZE} * 5 + 512))</div><div class='add'>+EXPECT "^ENXIO$" ${SEEK} scan ${M0}/test hole $((${BSIZE} * 6))</div><div class='add'>+</div><div class='add'>+rm -f ${SEEK}</div><div class='add'>+cleanup</div><div class='add'>+</div><div class='add'>+# Centos6 regression slaves seem to not support SEEK_DATA/SEEK_HOLE</div><div class='add'>+#G_TESTDEF_TEST_STATUS_CENTOS6=BAD_TEST,BUG=000000</div><div class='head'>diff --git a/tests/basic/ec/ec-stripe.t b/tests/basic/ec/ec-stripe.t<br/>new file mode 100644<br/>index 00000000000..98b92294feb<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/ec/ec-stripe.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/ec/ec-stripe.t</a></div><div class='hunk'>@@ -0,0 +1,227 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+# These tests will check the stripe cache functionality of</div><div class='add'>+# disperse volume</div><div class='add'>+</div><div class='add'>+test_index=0</div><div class='add'>+stripe_count=4</div><div class='add'>+loop_test=0</div><div class='add'>+</div><div class='add'>+TESTS_EXPECTED_IN_LOOP=182</div><div class='add'>+</div><div class='add'>+function get_mount_stripe_cache {</div><div class='add'>+        local sd=$1</div><div class='add'>+        local field=$2</div><div class='add'>+        local val=$(grep "$field" $sd | cut -f2 -d'=' | tail -1)</div><div class='add'>+        echo $val</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function get_stripes_in_cache {</div><div class='add'>+        local target=$1</div><div class='add'>+        local count=$2</div><div class='add'>+        local c=0</div><div class='add'>+        for (( c=0; c&lt;$count; c++ ))</div><div class='add'>+        do</div><div class='add'>+            let x=102+$c*1024</div><div class='add'>+            echo yy | dd of=$target oflag=seek_bytes,sync seek=$x conv=notrunc</div><div class='add'>+            if [ $? != 0 ]</div><div class='add'>+            then</div><div class='add'>+                break</div><div class='add'>+            fi</div><div class='add'>+        done</div><div class='add'>+        echo "$c"</div><div class='add'>+}</div><div class='add'>+# tests in this loop = 7</div><div class='add'>+function mount_get_test_files {</div><div class='add'>+        let test_index+=1</div><div class='add'>+        let loop_test+=7</div><div class='add'>+        echo "Test Case $test_index"</div><div class='add'>+        local stripe_count=$1</div><div class='add'>+        TEST $GFS --volfile-id=/$V0 --volfile-server=$H0 $M0;</div><div class='add'>+        EXPECT_WITHIN $CHILD_UP_TIMEOUT "3" ec_child_up_count $V0 0</div><div class='add'>+        TEST dd if=/dev/urandom of=$B0/test_file bs=1024 count=20</div><div class='add'>+        TEST cp $B0/test_file $M0/test_file</div><div class='add'>+        TEST dd if=/dev/urandom of=$B0/misc_file bs=1024 count=20</div><div class='add'>+        EXPECT_WITHIN $UMOUNT_TIMEOUT "$stripe_count" get_stripes_in_cache $B0/test_file $stripe_count</div><div class='add'>+        EXPECT_WITHIN $UMOUNT_TIMEOUT "$stripe_count" get_stripes_in_cache $M0/test_file $stripe_count</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#check_statedump_md5sum (hitcount misscount)</div><div class='add'>+#tests in this loop = 4</div><div class='add'>+function check_statedump_md5sum {</div><div class='add'>+        statedump=$(generate_mount_statedump $V0)</div><div class='add'>+        let loop_test+=4</div><div class='add'>+        sleep 1</div><div class='add'>+        nhits=$(get_mount_stripe_cache $statedump "hits")</div><div class='add'>+        nmisses=$(get_mount_stripe_cache $statedump "misses")</div><div class='add'>+        EXPECT "$1" echo $nhits</div><div class='add'>+        EXPECT "$2" echo $nmisses</div><div class='add'>+        TEST md5_sum=`get_md5_sum $B0/test_file`</div><div class='add'>+        EXPECT $md5_sum get_md5_sum $M0/test_file</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#tests in this loop = 2</div><div class='add'>+function clean_file_unmount {</div><div class='add'>+        let loop_test+=2</div><div class='add'>+        TEST rm -f $B0/test_file $M0/test_file $B0/misc_file</div><div class='add'>+        cleanup_mount_statedump $V0</div><div class='add'>+        EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 disperse 3 redundancy 1 $H0:$B0/${V0}{0..2}</div><div class='add'>+TEST $CLI volume heal $V0 disable</div><div class='add'>+TEST $CLI volume set $V0 performance.stat-prefetch off</div><div class='add'>+TEST $CLI volume set $V0 performance.write-behind off</div><div class='add'>+TEST $CLI volume set $V0 performance.quick-read off</div><div class='add'>+TEST $CLI volume set $V0 performance.read-ahead off</div><div class='add'>+TEST $CLI volume set $V0 performance.io-cache off</div><div class='add'>+TEST $CLI volume set $V0 disperse.background-heals 0</div><div class='add'>+TEST $CLI volume set $V0 disperse.eager-lock on</div><div class='add'>+TEST $CLI volume set $V0 disperse.other-eager-lock on</div><div class='add'>+TEST $CLI volume set $V0 disperse.stripe-cache 8</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+### 1 - offset and size in one stripes ####</div><div class='add'>+</div><div class='add'>+mount_get_test_files $stripe_count</div><div class='add'>+# This should have 4 hits on cached stripes</div><div class='add'>+get_stripes_in_cache $M0/test_file $stripe_count</div><div class='add'>+check_statedump_md5sum 4 4</div><div class='add'>+clean_file_unmount</div><div class='add'>+</div><div class='add'>+### 2 - Length less than a stripe size, covering two stripes ####</div><div class='add'>+</div><div class='add'>+mount_get_test_files $stripe_count</div><div class='add'>+TEST dd if=$B0/misc_file of=$B0/test_file  bs=1022 count=1  oflag=seek_bytes,sync seek=102 conv=notrunc</div><div class='add'>+TEST dd if=$B0/misc_file of=$M0/test_file  bs=1022 count=1  oflag=seek_bytes,sync seek=102 conv=notrunc</div><div class='add'>+check_statedump_md5sum 2 4</div><div class='add'>+clean_file_unmount</div><div class='add'>+</div><div class='add'>+### 3 -Length exactly equal to the stripe size, covering a single stripe  ####</div><div class='add'>+</div><div class='add'>+mount_get_test_files $stripe_count</div><div class='add'>+TEST dd if=$B0/misc_file of=$B0/test_file  bs=1024 count=1  oflag=seek_bytes,sync seek=0 conv=notrunc</div><div class='add'>+TEST dd if=$B0/misc_file of=$M0/test_file  bs=1024 count=1  oflag=seek_bytes,sync seek=0 conv=notrunc</div><div class='add'>+check_statedump_md5sum 0 4</div><div class='add'>+clean_file_unmount</div><div class='add'>+</div><div class='add'>+### 4 - Length exactly equal to the stripe size, covering two stripes  ####</div><div class='add'>+</div><div class='add'>+mount_get_test_files $stripe_count</div><div class='add'>+TEST dd if=$B0/misc_file of=$B0/test_file  bs=2048 count=1  oflag=seek_bytes,sync seek=1024 conv=notrunc</div><div class='add'>+TEST dd if=$B0/misc_file of=$M0/test_file  bs=2048 count=1  oflag=seek_bytes,sync seek=1024 conv=notrunc</div><div class='add'>+check_statedump_md5sum 0 4</div><div class='add'>+clean_file_unmount</div><div class='add'>+</div><div class='add'>+### 5 - Length greater than a stripe size, covering two stripes  ####</div><div class='add'>+</div><div class='add'>+mount_get_test_files $stripe_count</div><div class='add'>+TEST dd if=$B0/misc_file of=$B0/test_file  bs=1030 count=1  oflag=seek_bytes,sync seek=500 conv=notrunc</div><div class='add'>+TEST dd if=$B0/misc_file of=$M0/test_file  bs=1030 count=1  oflag=seek_bytes,sync seek=500 conv=notrunc</div><div class='add'>+check_statedump_md5sum 2 4</div><div class='add'>+clean_file_unmount</div><div class='add'>+</div><div class='add'>+### 6 - Length greater than a stripe size, covering three stripes  ####</div><div class='add'>+</div><div class='add'>+mount_get_test_files $stripe_count</div><div class='add'>+TEST dd if=$B0/misc_file of=$B0/test_file  bs=2078 count=1  oflag=seek_bytes,sync seek=1000 conv=notrunc</div><div class='add'>+TEST dd if=$B0/misc_file of=$M0/test_file  bs=2078 count=1  oflag=seek_bytes,sync seek=1000 conv=notrunc</div><div class='add'>+check_statedump_md5sum 2 4</div><div class='add'>+clean_file_unmount</div><div class='add'>+</div><div class='add'>+### 7 - Discard range - all stripe from cache should be invalidated complete stripes  ####</div><div class='add'>+</div><div class='add'>+mount_get_test_files $stripe_count</div><div class='add'>+TEST fallocate -p -o 0 -l 5120 $B0/test_file</div><div class='add'>+TEST fallocate -p -o 0 -l 5120 $M0/test_file</div><div class='add'>+TEST dd if=$B0/misc_file of=$B0/test_file  bs=1024 count=6  oflag=seek_bytes,sync seek=1030 conv=notrunc</div><div class='add'>+TEST dd if=$B0/misc_file of=$M0/test_file  bs=1024 count=6  oflag=seek_bytes,sync seek=1030 conv=notrunc</div><div class='add'>+check_statedump_md5sum 5 11</div><div class='add'>+clean_file_unmount</div><div class='add'>+</div><div class='add'>+### 8 - Discard range - starts in the middle of stripe, ends on the middle of next stripe####</div><div class='add'>+</div><div class='add'>+mount_get_test_files $stripe_count</div><div class='add'>+TEST fallocate -p -o 500 -l 1024 $B0/test_file</div><div class='add'>+TEST fallocate -p -o 500 -l 1024 $M0/test_file</div><div class='add'>+TEST dd if=$B0/misc_file of=$B0/test_file  bs=1024 count=5  oflag=seek_bytes,sync seek=500 conv=notrunc</div><div class='add'>+TEST dd if=$B0/misc_file of=$M0/test_file  bs=1024 count=5  oflag=seek_bytes,sync seek=500 conv=notrunc</div><div class='add'>+check_statedump_md5sum 10 6</div><div class='add'>+clean_file_unmount</div><div class='add'>+</div><div class='add'>+### 9 - Discard range - starts in the middle of stripe, ends on the middle of 3rd stripe#####</div><div class='add'>+</div><div class='add'>+mount_get_test_files $stripe_count</div><div class='add'>+TEST fallocate -p -o 500 -l 2048 $B0/test_file</div><div class='add'>+TEST fallocate -p -o 500 -l 2048 $M0/test_file</div><div class='add'>+TEST dd if=$B0/misc_file of=$B0/test_file  bs=1024 count=5  oflag=seek_bytes,sync seek=500 conv=notrunc</div><div class='add'>+TEST dd if=$B0/misc_file of=$M0/test_file  bs=1024 count=5  oflag=seek_bytes,sync seek=500 conv=notrunc</div><div class='add'>+check_statedump_md5sum 9 7</div><div class='add'>+clean_file_unmount</div><div class='add'>+</div><div class='add'>+### 10 - Discard range - starts and end within one stripe ####</div><div class='add'>+</div><div class='add'>+mount_get_test_files $stripe_count</div><div class='add'>+TEST fallocate -p -o 500 -l 100 $B0/test_file</div><div class='add'>+TEST fallocate -p -o 500 -l 100 $M0/test_file</div><div class='add'>+TEST dd if=$B0/misc_file of=$B0/test_file  bs=1024 count=1  oflag=seek_bytes,sync seek=0 conv=notrunc</div><div class='add'>+TEST dd if=$B0/misc_file of=$M0/test_file  bs=1024 count=1  oflag=seek_bytes,sync seek=0 conv=notrunc</div><div class='add'>+check_statedump_md5sum 1 4</div><div class='add'>+clean_file_unmount</div><div class='add'>+</div><div class='add'>+### 11 - Discard range - starts and end in one complete stripe ####</div><div class='add'>+</div><div class='add'>+mount_get_test_files $stripe_count</div><div class='add'>+TEST fallocate -p -o 0 -l 1024 $B0/test_file</div><div class='add'>+TEST fallocate -p -o 0 -l 1024 $M0/test_file</div><div class='add'>+TEST dd if=$B0/misc_file of=$B0/test_file  bs=1024 count=1  oflag=seek_bytes,sync seek=512 conv=notrunc</div><div class='add'>+TEST dd if=$B0/misc_file of=$M0/test_file  bs=1024 count=1  oflag=seek_bytes,sync seek=512 conv=notrunc</div><div class='add'>+check_statedump_md5sum 1 5</div><div class='add'>+clean_file_unmount</div><div class='add'>+</div><div class='add'>+### 12 - Discard range - starts and end two complete stripe ####</div><div class='add'>+</div><div class='add'>+mount_get_test_files $stripe_count</div><div class='add'>+TEST fallocate -p -o 0 -l 2048 $B0/test_file</div><div class='add'>+TEST fallocate -p -o 0 -l 2048 $M0/test_file</div><div class='add'>+TEST dd if=$B0/misc_file of=$B0/test_file  bs=1024 count=4  oflag=seek_bytes,sync seek=300 conv=notrunc</div><div class='add'>+TEST dd if=$B0/misc_file of=$M0/test_file  bs=1024 count=4  oflag=seek_bytes,sync seek=300 conv=notrunc</div><div class='add'>+check_statedump_md5sum 5 7</div><div class='add'>+clean_file_unmount</div><div class='add'>+</div><div class='add'>+### 13 - Truncate to invalidate  all the stripe in cache  ####</div><div class='add'>+</div><div class='add'>+mount_get_test_files $stripe_count</div><div class='add'>+TEST truncate -s 0 $B0/test_file</div><div class='add'>+TEST truncate -s 0 $M0/test_file</div><div class='add'>+TEST dd if=$B0/misc_file of=$B0/test_file  bs=1022 count=5  oflag=seek_bytes,sync seek=400 conv=notrunc</div><div class='add'>+TEST dd if=$B0/misc_file of=$M0/test_file  bs=1022 count=5  oflag=seek_bytes,sync seek=400 conv=notrunc</div><div class='add'>+check_statedump_md5sum 4 4</div><div class='add'>+clean_file_unmount</div><div class='add'>+</div><div class='add'>+### 14 - Truncate to invalidate  all but one the stripe in cache  ####</div><div class='add'>+</div><div class='add'>+mount_get_test_files $stripe_count</div><div class='add'>+TEST truncate -s 500 $B0/test_file</div><div class='add'>+TEST truncate -s 500 $M0/test_file</div><div class='add'>+TEST dd if=$B0/misc_file of=$B0/test_file  bs=1024 count=1  oflag=seek_bytes,sync seek=525 conv=notrunc</div><div class='add'>+TEST dd if=$B0/misc_file of=$M0/test_file  bs=1024 count=1  oflag=seek_bytes,sync seek=525 conv=notrunc</div><div class='add'>+check_statedump_md5sum  2 4</div><div class='add'>+clean_file_unmount</div><div class='add'>+</div><div class='add'>+### 15 - Truncate to invalidate  all but one the stripe in cache  ####</div><div class='add'>+mount_get_test_files $stripe_count</div><div class='add'>+TEST truncate -s 2148 $B0/test_file</div><div class='add'>+TEST truncate -s 2148 $M0/test_file</div><div class='add'>+TEST dd if=$B0/misc_file of=$B0/test_file  bs=1000 count=1  oflag=seek_bytes,sync seek=2050 conv=notrunc</div><div class='add'>+TEST dd if=$B0/misc_file of=$M0/test_file  bs=1000 count=1  oflag=seek_bytes,sync seek=2050 conv=notrunc</div><div class='add'>+check_statedump_md5sum 2 4</div><div class='add'>+clean_file_unmount</div><div class='add'>+echo "Total loop tests $loop_test"</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/basic/ec/ec-up.t b/tests/basic/ec/ec-up.t<br/>new file mode 100644<br/>index 00000000000..d54e7e1d022<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/ec/ec-up.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/ec/ec-up.t</a></div><div class='hunk'>@@ -0,0 +1,28 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+#Tests that ec subvolume is up/down correctly</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+. $(dirname $0)/../../ec.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 disperse-data 2 redundancy 1 $H0:$B0/${V0}{0,1,3,4,5,6}</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+TEST $GFS --volfile-id=$V0 --volfile-server=$H0 $M0;</div><div class='add'>+EXPECT "1" ec_up_status $V0 $M0 0</div><div class='add'>+EXPECT "1" ec_up_status $V0 $M0 1</div><div class='add'>+</div><div class='add'>+#kill two bricks in first disperse subvolume and check that ec_up_status is 0 for it</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}0</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}1</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $PROCESS_DOWN_TIMEOUT "0" ec_up_status $V0 $M0 0</div><div class='add'>+EXPECT "1" ec_up_status $V0 $M0 1</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" ec_up_status $V0 $M0 0</div><div class='add'>+EXPECT "1" ec_up_status $V0 $M0 1</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/basic/ec/ec.t b/tests/basic/ec/ec.t<br/>new file mode 100644<br/>index 00000000000..cc882771501<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/ec/ec.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/ec/ec.t</a></div><div class='hunk'>@@ -0,0 +1,259 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../traps.rc</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+TEST_USER=test-ec-user</div><div class='add'>+TEST_UID=27341</div><div class='add'>+</div><div class='add'>+function my_getfattr {</div><div class='add'>+    getfattr --only-values -e text $* 2&gt; /dev/null</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function get_rep_count {</div><div class='add'>+    v=$(my_getfattr -n trusted.jbr.rep-count $1)</div><div class='add'>+    #echo $v &gt; /dev/tty</div><div class='add'>+    echo $v</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function create_file {</div><div class='add'>+    dd if=/dev/urandom of=$1 bs=4k count=$2 conv=sync 2&gt; /dev/null</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function setup_perm_file {</div><div class='add'>+    mkdir $1/perm_dir               || return 1</div><div class='add'>+    chown ${TEST_USER} $1/perm_dir              || return 1</div><div class='add'>+    su ${TEST_USER} -c "touch $1/perm_dir/perm_file"    || return 1</div><div class='add'>+    return 0</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+# Functions to check repair for specific operation types.</div><div class='add'>+</div><div class='add'>+function check_create_write {</div><div class='add'>+    for b in $*; do</div><div class='add'>+        cmp $tmpdir/create-write $b/create-write || return 1</div><div class='add'>+    done</div><div class='add'>+    return 0</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function check_truncate {</div><div class='add'>+    truncate -s 8192 $tmpdir/truncate</div><div class='add'>+    for b in $*; do</div><div class='add'>+        cmp $tmpdir/truncate $b/truncate || return 1</div><div class='add'>+    done</div><div class='add'>+    return 0</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function check_hard_link {</div><div class='add'>+    stat $M0/hard-link-1</div><div class='add'>+    stat $M0/hard-link-2</div><div class='add'>+    for b in $*; do</div><div class='add'>+        inum1=$(ls -i $b/hard-link-1 | cut -d' ' -f1)</div><div class='add'>+        inum2=$(ls -i $b/hard-link-2 | cut -d' ' -f1)</div><div class='add'>+        if [ "$inum1" != "$inum2" ]; then</div><div class='add'>+            echo "N"</div><div class='add'>+            return 0</div><div class='add'>+        fi</div><div class='add'>+    done</div><div class='add'>+    echo "Y"</div><div class='add'>+    return 0</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function check_soft_link {</div><div class='add'>+    stat $M0/soft-link</div><div class='add'>+    for b in $*; do</div><div class='add'>+        if [ "$(readlink $b/soft-link)" != "soft-link-tgt" ]; then</div><div class='add'>+            echo "N"</div><div class='add'>+            return 0</div><div class='add'>+        fi</div><div class='add'>+    done</div><div class='add'>+    echo "Y"</div><div class='add'>+    return 0</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function check_unlink {</div><div class='add'>+    stat $M0/unlink</div><div class='add'>+    for b in $*; do</div><div class='add'>+        if [ -e $b/unlink ]; then</div><div class='add'>+            echo "N"</div><div class='add'>+            return 0</div><div class='add'>+        fi</div><div class='add'>+    done</div><div class='add'>+    echo "Y"</div><div class='add'>+    return 0</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function check_mkdir {</div><div class='add'>+    getfattr -m. -d $M0/mkdir</div><div class='add'>+    for b in $*; do</div><div class='add'>+        if [ ! -d $b/mkdir ]; then</div><div class='add'>+            echo "N"</div><div class='add'>+            return 0</div><div class='add'>+        fi</div><div class='add'>+    done</div><div class='add'>+    echo "Y"</div><div class='add'>+    return 0</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function check_rmdir {</div><div class='add'>+    getfattr -m. -d $M0/rmdir</div><div class='add'>+    for b in $*; do</div><div class='add'>+        if [ -e $b/rmdir ]; then</div><div class='add'>+            echo "N"</div><div class='add'>+            return 0</div><div class='add'>+        fi</div><div class='add'>+    done</div><div class='add'>+    echo "Y"</div><div class='add'>+    return 0</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function check_setxattr {</div><div class='add'>+    getfattr -d -m. -e hex $M0/setxattr</div><div class='add'>+    for b in $*; do</div><div class='add'>+        v=$(my_getfattr -n user.foo $b/setxattr)</div><div class='add'>+        if [ "$v" != "ash_nazg_durbatuluk" ]; then</div><div class='add'>+            echo "N"</div><div class='add'>+            return 0</div><div class='add'>+        fi</div><div class='add'>+    done</div><div class='add'>+    echo "Y"</div><div class='add'>+    return 0</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function check_removexattr {</div><div class='add'>+    getfattr -d -m. -e hex $M0/removexattr</div><div class='add'>+    for b in $*; do</div><div class='add'>+        my_getfattr -n user.bar $b/removexattr 2&gt; /dev/null</div><div class='add'>+        if [ $? -eq 0 ]; then</div><div class='add'>+            echo "N"</div><div class='add'>+            return 0</div><div class='add'>+        fi</div><div class='add'>+    done</div><div class='add'>+    echo "Y"</div><div class='add'>+    return 0</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function check_perm_file {</div><div class='add'>+    stat $M0/perm_dir/perm_file</div><div class='add'>+    getfattr -m. -d $M0/perm_dir</div><div class='add'>+    b1=$1</div><div class='add'>+    shift 1</div><div class='add'>+    ftext=$(stat -c "%u %g %a" $b1/perm_dir/perm_file)</div><div class='add'>+    #echo "first u/g/a = $ftext" &gt; /dev/tty</div><div class='add'>+    for b in $*; do</div><div class='add'>+        btext=$(stat -c "%u %g %a" $b/perm_dir/perm_file)</div><div class='add'>+        #echo "  next u/a/a = $btext" &gt; /dev/tty</div><div class='add'>+        if [ x"$btext" != x"$ftext" ]; then</div><div class='add'>+            echo "N"</div><div class='add'>+            return 0</div><div class='add'>+        fi</div><div class='add'>+    done</div><div class='add'>+    echo "Y"</div><div class='add'>+    return 0</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='add'>+</div><div class='add'>+TEST useradd -o -M -u ${TEST_UID} ${TEST_USER}</div><div class='add'>+push_trapfunc "userdel --force ${TEST_USER}"</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume info</div><div class='add'>+</div><div class='add'>+TEST mkdir -p $B0/${V0}{0,1,2,3,4,5,6,7,8,9}</div><div class='add'>+TEST $CLI volume create $V0 disperse 10 redundancy 2 $H0:$B0/${V0}{0,1,2,3,4,5,6,7,8,9}</div><div class='add'>+</div><div class='add'>+EXPECT "$V0" volinfo_field $V0 'Volume Name'</div><div class='add'>+EXPECT 'Created' volinfo_field $V0 'Status'</div><div class='add'>+EXPECT '10' brick_count $V0</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT 'Started' volinfo_field $V0 'Status'</div><div class='add'>+</div><div class='add'>+# Mount FUSE with caching disabled</div><div class='add'>+TEST $GFS -s $H0 --volfile-id $V0 $M0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "10" ec_child_up_count $V0 0</div><div class='add'>+</div><div class='add'>+# Create local files for comparisons etc.</div><div class='add'>+tmpdir=$(mktemp -d -t ${0##*/}.XXXXXX)</div><div class='add'>+push_trapfunc "rm -rf $tmpdir"</div><div class='add'>+TEST create_file $tmpdir/create-write 10</div><div class='add'>+TEST create_file $tmpdir/truncate 10</div><div class='add'>+</div><div class='add'>+# Prepare files and directories we'll need later.</div><div class='add'>+TEST cp $tmpdir/truncate $M0/</div><div class='add'>+TEST touch $M0/hard-link-1</div><div class='add'>+TEST touch $M0/unlink</div><div class='add'>+TEST mkdir $M0/rmdir</div><div class='add'>+TEST touch $M0/setxattr</div><div class='add'>+TEST touch $M0/removexattr</div><div class='add'>+TEST setfattr -n user.bar -v "ash_nazg_gimbatul" $M0/removexattr</div><div class='add'>+</div><div class='add'>+sleep 2</div><div class='add'>+</div><div class='add'>+# Kill a couple of bricks and allow some time for things to settle.</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}3</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}8</div><div class='add'>+sleep 10</div><div class='add'>+</div><div class='add'>+# Test create+write</div><div class='add'>+TEST cp $tmpdir/create-write $M0/</div><div class='add'>+# Test truncate</div><div class='add'>+TEST truncate -s 8192 $M0/truncate</div><div class='add'>+# Test hard link</div><div class='add'>+TEST ln $M0/hard-link-1 $M0/hard-link-2</div><div class='add'>+# Test soft link</div><div class='add'>+TEST ln -s soft-link-tgt $M0/soft-link</div><div class='add'>+# Test unlink</div><div class='add'>+TEST rm $M0/unlink</div><div class='add'>+# Test rmdir</div><div class='add'>+TEST rmdir $M0/rmdir</div><div class='add'>+# Test mkdir</div><div class='add'>+TEST mkdir $M0/mkdir</div><div class='add'>+# Test setxattr</div><div class='add'>+TEST setfattr -n user.foo -v "ash_nazg_durbatuluk" $M0/setxattr</div><div class='add'>+# Test removexattr</div><div class='add'>+TEST setfattr -x user.bar $M0/removexattr</div><div class='add'>+# Test uid/gid behavior</div><div class='add'>+TEST setup_perm_file $M0</div><div class='add'>+</div><div class='add'>+sleep 2</div><div class='add'>+</div><div class='add'>+# Unmount/remount so that create/write and truncate don't see cached data.</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+TEST $GFS -s $H0 --volfile-id $V0 $M1</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "8" ec_child_up_count $V0 0</div><div class='add'>+</div><div class='add'>+# Test create/write and truncate *before* the bricks are brought back.</div><div class='add'>+TEST check_create_write $M1</div><div class='add'>+TEST check_truncate $M1</div><div class='add'>+</div><div class='add'>+# Restart the bricks and allow repair to occur.</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT 'Started' volinfo_field $V0 'Status'</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "10" ec_child_up_count $V0 0</div><div class='add'>+</div><div class='add'>+# Unmount/remount again, same reason as before.</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M1</div><div class='add'>+TEST $GFS -s $H0 --volfile-id $V0 $M0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "10" ec_child_up_count $V0 0</div><div class='add'>+</div><div class='add'>+# Make sure everything is as it should be.  Most tests check for consistency</div><div class='add'>+# between the bricks and the front end.  This is not valid for disperse, so we</div><div class='add'>+# check the mountpoint state instead.</div><div class='add'>+</div><div class='add'>+TEST check_create_write $M0</div><div class='add'>+TEST check_truncate $M0</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "Y" check_hard_link $B0/${V0}{0..9}</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "Y" check_soft_link $B0/${V0}{0..9}</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "Y" check_unlink $B0/${V0}{0..9}</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "Y" check_rmdir $B0/${V0}{0..9}</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "Y" check_mkdir $B0/${V0}{0..9}</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "Y" check_setxattr $B0/${V0}{0..9}</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "Y" check_removexattr $B0/${V0}{0..9}</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "Y" check_perm_file $B0/${V0}{0..9}</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/basic/ec/gfapi-ec-open-truncate.c b/tests/basic/ec/gfapi-ec-open-truncate.c<br/>new file mode 100644<br/>index 00000000000..fb16807003a<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/ec/gfapi-ec-open-truncate.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/ec/gfapi-ec-open-truncate.c</a></div><div class='hunk'>@@ -0,0 +1,171 @@</div><div class='add'>+#include &lt;fcntl.h&gt;</div><div class='add'>+#include &lt;unistd.h&gt;</div><div class='add'>+#include &lt;time.h&gt;</div><div class='add'>+#include &lt;limits.h&gt;</div><div class='add'>+#include &lt;string.h&gt;</div><div class='add'>+#include &lt;stdio.h&gt;</div><div class='add'>+#include &lt;stdlib.h&gt;</div><div class='add'>+#include &lt;errno.h&gt;</div><div class='add'>+#include &lt;glusterfs/api/glfs.h&gt;</div><div class='add'>+#include &lt;glusterfs/api/glfs-handles.h&gt;</div><div class='add'>+</div><div class='add'>+#define LOG_ERR(msg)                                                           \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        fprintf(stderr, "%s : Error (%s)\n", msg, strerror(errno));            \</div><div class='add'>+    } while (0)</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+fill_iov(struct iovec *iov, char fillchar, int count)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    iov-&gt;iov_base = calloc(count + 1, sizeof(fillchar));</div><div class='add'>+    if (iov-&gt;iov_base == NULL) {</div><div class='add'>+        return ret;</div><div class='add'>+    } else {</div><div class='add'>+        iov-&gt;iov_len = count;</div><div class='add'>+        ret = 0;</div><div class='add'>+    }</div><div class='add'>+    memset(iov-&gt;iov_base, fillchar, count);</div><div class='add'>+    memset(iov-&gt;iov_base + count, '\0', 1);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+glfs_t *</div><div class='add'>+init_glfs(const char *hostname, const char *volname, const char *logfile)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    glfs_t *fs = NULL;</div><div class='add'>+</div><div class='add'>+    fs = glfs_new(volname);</div><div class='add'>+    if (!fs) {</div><div class='add'>+        LOG_ERR("glfs_new failed");</div><div class='add'>+        return NULL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = glfs_set_volfile_server(fs, "tcp", hostname, 24007);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        LOG_ERR("glfs_set_volfile_server failed");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = glfs_set_logging(fs, logfile, 7);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        LOG_ERR("glfs_set_logging failed");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = glfs_init(fs);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        LOG_ERR("glfs_init failed");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+out:</div><div class='add'>+    if (ret) {</div><div class='add'>+        glfs_fini(fs);</div><div class='add'>+        fs = NULL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return fs;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+main(int argc, char *argv[])</div><div class='add'>+{</div><div class='add'>+    char *hostname = NULL;</div><div class='add'>+    char *volname = NULL;</div><div class='add'>+    char *logfile = NULL;</div><div class='add'>+    glfs_t *fs = NULL;</div><div class='add'>+    glfs_fd_t *glfd = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    int i = 0;</div><div class='add'>+    int count = 200;</div><div class='add'>+    struct iovec iov = {0};</div><div class='add'>+    int flags = O_RDWR;</div><div class='add'>+    int bricksup = 0;</div><div class='add'>+    int fdopen = 0;</div><div class='add'>+</div><div class='add'>+    if (argc != 4) {</div><div class='add'>+        fprintf(stderr, "Invalid argument\n");</div><div class='add'>+        exit(1);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    hostname = argv[1];</div><div class='add'>+    volname = argv[2];</div><div class='add'>+    logfile = argv[3];</div><div class='add'>+</div><div class='add'>+    fs = init_glfs(hostname, volname, logfile);</div><div class='add'>+    if (fs == NULL) {</div><div class='add'>+        LOG_ERR("init_glfs failed");</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Brick is down and we are opening a file to trigger fd heal. */</div><div class='add'>+    /* Bypass Write-behind */</div><div class='add'>+    glfd = glfs_open(fs, "a", O_WRONLY | O_TRUNC | O_SYNC);</div><div class='add'>+    if (glfd == NULL) {</div><div class='add'>+        LOG_ERR("glfs_open_truncate failed");</div><div class='add'>+        exit(1);</div><div class='add'>+    }</div><div class='add'>+    system("gluster --mode=script volume start patchy force");</div><div class='add'>+    /*CHILD_UP_TIMEOUT is 20 seconds*/</div><div class='add'>+    for (i = 0; i &lt; 20; i++) {</div><div class='add'>+        ret = system(</div><div class='add'>+            "[ $(gluster --mode=script volume status patchy | "</div><div class='add'>+            "grep \" Y \" | awk '{print $(NF-1)}' | wc -l) == 3 ]");</div><div class='add'>+        if (WIFEXITED(ret) &amp;&amp; WEXITSTATUS(ret)) {</div><div class='add'>+            printf("Ret value of system: %d\n, ifexited: %d, exitstatus: %d",</div><div class='add'>+                   ret, WIFEXITED(ret), WEXITSTATUS(ret));</div><div class='add'>+            sleep(1);</div><div class='add'>+            continue;</div><div class='add'>+        }</div><div class='add'>+        printf("Number of loops: %d\n", i);</div><div class='add'>+        bricksup = 1;</div><div class='add'>+        break;</div><div class='add'>+    }</div><div class='add'>+    if (!bricksup) {</div><div class='add'>+        system("gluster --mode=script volume status patchy");</div><div class='add'>+        LOG_ERR("Bricks didn't come up\n");</div><div class='add'>+        exit(1);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /*Not sure how to check that the child-up reached EC, so sleep 3 for now*/</div><div class='add'>+    sleep(3);</div><div class='add'>+    ret = fill_iov(&amp;iov, 'a', 200);</div><div class='add'>+    if (ret) {</div><div class='add'>+        LOG_ERR("failed to create iov");</div><div class='add'>+        exit(1);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /*write will trigger re-open*/</div><div class='add'>+    ret = glfs_pwritev(glfd, &amp;iov, 1, 0, flags);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        LOG_ERR("glfs_test_function failed");</div><div class='add'>+        exit(1);</div><div class='add'>+    }</div><div class='add'>+    /*Check reopen happened by checking for open-fds on the brick*/</div><div class='add'>+    for (i = 0; i &lt; 20; i++) {</div><div class='add'>+        ret = system(</div><div class='add'>+            "[ $(for i in $(pgrep glusterfsd); do ls -l /proc/$i/fd | grep "</div><div class='add'>+            "\"[.]glusterfs\" | grep -v \".glusterfs/[0-9a-f][0-9a-f]\" | grep "</div><div class='add'>+            "-v health_check; done | wc -l) == 3 ]");</div><div class='add'>+        if (WIFEXITED(ret) &amp;&amp; WEXITSTATUS(ret)) {</div><div class='add'>+            printf("Ret value of system: %d\n, ifexited: %d, exitstatus: %d",</div><div class='add'>+                   ret, WIFEXITED(ret), WEXITSTATUS(ret));</div><div class='add'>+            sleep(1);</div><div class='add'>+            continue;</div><div class='add'>+        }</div><div class='add'>+        fdopen = 1;</div><div class='add'>+        break;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (!fdopen) {</div><div class='add'>+        LOG_ERR("fd reopen didn't succeed");</div><div class='add'>+        exit(1);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='head'>diff --git a/tests/basic/ec/gfapi-ec-open-truncate.t b/tests/basic/ec/gfapi-ec-open-truncate.t<br/>new file mode 100644<br/>index 00000000000..e22562c6ea3<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/ec/gfapi-ec-open-truncate.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/ec/gfapi-ec-open-truncate.t</a></div><div class='hunk'>@@ -0,0 +1,48 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+#This .t tests the functionality of open-fd-heal when opened with O_TRUNC.</div><div class='add'>+#If re-open is not done with O_TRUNC then the test will pass.</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 disperse 3 ${H0}:$B0/brick{1,2,3}</div><div class='add'>+EXPECT 'Created' volinfo_field $V0 'Status'</div><div class='add'>+#Disable heals to prevent any chance of heals masking the problem</div><div class='add'>+TEST $CLI volume set $V0 disperse.background-heals 0</div><div class='add'>+TEST $CLI volume set $V0 disperse.heal-wait-qlength 0</div><div class='add'>+TEST $CLI volume set $V0 performance.write-behind off</div><div class='add'>+</div><div class='add'>+#We need truncate fop to go through before pre-op completes for the write-fop</div><div class='add'>+#which triggers open-fd heal. Otherwise truncate won't be allowed on 'bad' brick</div><div class='add'>+TEST $CLI volume set $V0 delay-gen posix</div><div class='add'>+TEST $CLI volume set $V0 delay-gen.enable fxattrop</div><div class='add'>+TEST $CLI volume set $V0 delay-gen.delay-percentage 100</div><div class='add'>+TEST $CLI volume set $V0 delay-gen.delay-duration 1000000</div><div class='add'>+</div><div class='add'>+TEST $CLI volume heal $V0 disable</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+TEST $CLI volume profile $V0 start</div><div class='add'>+EXPECT 'Started' volinfo_field $V0 'Status'</div><div class='add'>+TEST glusterfs --entry-timeout=0 --attribute-timeout=0 -s $H0 --volfile-id $V0 $M0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "3" ec_child_up_count $V0 0</div><div class='add'>+TEST touch $M0/a</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/brick1</div><div class='add'>+logdir=`gluster --print-logdir`</div><div class='add'>+</div><div class='add'>+TEST build_tester $(dirname $0)/gfapi-ec-open-truncate.c -lgfapi</div><div class='add'>+</div><div class='add'>+TEST $CLI volume profile $V0 info clear</div><div class='add'>+TEST ./$(dirname $0)/gfapi-ec-open-truncate ${H0} $V0 $logdir/gfapi-ec-open-truncate.log</div><div class='add'>+</div><div class='add'>+EXPECT "^2$" echo $($CLI volume profile $V0 info incremental | grep -i truncate | wc -l)</div><div class='add'>+cleanup_tester $(dirname $0)/gfapi-ec-open-truncate</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/basic/ec/heal-info.t b/tests/basic/ec/heal-info.t<br/>new file mode 100644<br/>index 00000000000..1549d5fcdb0<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/ec/heal-info.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/ec/heal-info.t</a></div><div class='hunk'>@@ -0,0 +1,74 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+# This test checks if heal info works as expected or not</div><div class='add'>+</div><div class='add'>+function create_files {</div><div class='add'>+        for i in {21..1000};</div><div class='add'>+        do</div><div class='add'>+                dd if=/dev/zero of=$M0/$i bs=1M count=1 2&gt;&amp;1 &gt; /dev/null;</div><div class='add'>+        done</div><div class='add'>+        rm -f $M0/lock</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 redundancy 2 $H0:$B0/${V0}{0..5}</div><div class='add'>+TEST $CLI volume set $V0 client-log-level DEBUG</div><div class='add'>+TEST $CLI volume heal $V0 disable</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+TEST $GFS --volfile-id=/$V0 --volfile-server=$H0 --direct-io-mode=yes $M0;</div><div class='add'>+# Wait until all 6 childs have been recognized by the ec xlator</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "6" ec_child_up_count $V0 0</div><div class='add'>+</div><div class='add'>+#heal info should give zero entries to be healed when I/O is going on</div><div class='add'>+dd if=/dev/zero of=$M0/a bs=1M count=2048 &amp;</div><div class='add'>+dd_pid=$!</div><div class='add'>+sleep 3 #Wait for I/O to proceed for some time</div><div class='add'>+EXPECT "^0$" get_pending_heal_count $V0</div><div class='add'>+kill -9 $dd_pid</div><div class='add'>+touch $M0/lock</div><div class='add'>+create_files &amp;</div><div class='add'>+</div><div class='add'>+total_heal_count=0</div><div class='add'>+while [ -f $M0/lock ];</div><div class='add'>+do</div><div class='add'>+        heal_count=$(get_pending_heal_count $V0)</div><div class='add'>+        total_heal_count=$((heal_count+total_heal_count))</div><div class='add'>+done</div><div class='add'>+EXPECT "^0$" echo $total_heal_count</div><div class='add'>+</div><div class='add'>+#When only data heal is required it should print it</div><div class='add'>+#There is no easy way to create this using commands so assigning xattrs directly</div><div class='add'>+TEST setfattr -n trusted.ec.version -v 0x00000000000000020000000000000000 $B0/${V0}0/1000</div><div class='add'>+TEST setfattr -n trusted.ec.version -v 0x00000000000000020000000000000000 $B0/${V0}1/1000</div><div class='add'>+TEST setfattr -n trusted.ec.version -v 0x00000000000000020000000000000000 $B0/${V0}2/1000</div><div class='add'>+TEST setfattr -n trusted.ec.version -v 0x00000000000000020000000000000000 $B0/${V0}3/1000</div><div class='add'>+TEST setfattr -n trusted.ec.version -v 0x00000000000000020000000000000000 $B0/${V0}4/1000</div><div class='add'>+TEST setfattr -n trusted.ec.version -v 0x00000000000000010000000000000000 $B0/${V0}5/1000</div><div class='add'>+index_path=$B0/${V0}5/.glusterfs/indices/xattrop/$(gf_gfid_xattr_to_str $(gf_get_gfid_xattr $B0/${V0}5/1000))</div><div class='add'>+while [ -f $index_path ]; do :; done</div><div class='add'>+TEST touch $index_path</div><div class='add'>+EXPECT "^1$" get_pending_heal_count $V0</div><div class='add'>+TEST rm -f $M0/1000</div><div class='add'>+</div><div class='add'>+#When files/directories need heal test that it prints them</div><div class='add'>+TEST touch $M0/{1..10}</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}0</div><div class='add'>+for i in {11..20};</div><div class='add'>+do</div><div class='add'>+        echo abc &gt; $M0/$i #Data + entry + metadata heal</div><div class='add'>+done</div><div class='add'>+for i in {1..10};</div><div class='add'>+do</div><div class='add'>+        chmod +x $M0/$i;</div><div class='add'>+done</div><div class='add'>+</div><div class='add'>+EXPECT "^105$" get_pending_heal_count $V0</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='add'>+#G_TESTDEF_TEST_STATUS_CENTOS6=BAD_TEST,BUG=1533815</div><div class='head'>diff --git a/tests/basic/ec/lock-contention.t b/tests/basic/ec/lock-contention.t<br/>new file mode 100644<br/>index 00000000000..8f86cee16ad<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/ec/lock-contention.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/ec/lock-contention.t</a></div><div class='hunk'>@@ -0,0 +1,62 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+# This test verifies that when 'lock-notify-contention' option is enabled,</div><div class='add'>+# locks xlator actually sends an upcall notification that causes the acquired</div><div class='add'>+# lock from one client to be released before it's supposed to when another</div><div class='add'>+# client accesses the file.</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+function elapsed_time() {</div><div class='add'>+        local start="`date +%s`"</div><div class='add'>+</div><div class='add'>+        if [[ "test" == `cat "$1"` ]]; then</div><div class='add'>+                echo "$((`date +%s` - ${start}))"</div><div class='add'>+        fi</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 disperse 3 redundancy 1 $H0:$B0/${V0}{0..2}</div><div class='add'>+TEST $CLI volume set $V0 performance.stat-prefetch off</div><div class='add'>+TEST $CLI volume set $V0 performance.write-behind off</div><div class='add'>+TEST $CLI volume set $V0 performance.quick-read off</div><div class='add'>+TEST $CLI volume set $V0 performance.read-ahead off</div><div class='add'>+TEST $CLI volume set $V0 performance.io-cache off</div><div class='add'>+TEST $CLI volume set $V0 features.locks-notify-contention off</div><div class='add'>+TEST $CLI volume set $V0 disperse.eager-lock on</div><div class='add'>+TEST $CLI volume set $V0 disperse.eager-lock-timeout 6</div><div class='add'>+TEST $CLI volume set $V0 disperse.other-eager-lock on</div><div class='add'>+TEST $CLI volume set $V0 disperse.other-eager-lock-timeout 6</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+TEST $GFS --direct-io-mode=yes --volfile-id=/$V0 --volfile-server=$H0 $M0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "3" ec_child_up_count $V0 0 $M0</div><div class='add'>+</div><div class='add'>+TEST $GFS --direct-io-mode=yes --volfile-id=/$V0 --volfile-server=$H0 $M1</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "3" ec_child_up_count $V0 0 $M1</div><div class='add'>+</div><div class='add'>+TEST $(echo "test" &gt;$M0/file)</div><div class='add'>+</div><div class='add'>+# With locks-notify-contention set to off, accessing the file from another</div><div class='add'>+# client should take 6 seconds. Checking against 3 seconds to be safe.</div><div class='add'>+elapsed="$(elapsed_time $M1/file)"</div><div class='add'>+TEST [[ ${elapsed} -ge 3 ]]</div><div class='add'>+</div><div class='add'>+elapsed="$(elapsed_time $M0/file)"</div><div class='add'>+TEST [[ ${elapsed} -ge 3 ]]</div><div class='add'>+</div><div class='add'>+TEST $CLI volume set $V0 features.locks-notify-contention on</div><div class='add'>+</div><div class='add'>+# With locks-notify-contention set to on, accessing the file from another</div><div class='add'>+# client should be fast. Checking against 3 seconds to be safe.</div><div class='add'>+elapsed="$(elapsed_time $M1/file)"</div><div class='add'>+TEST [[ ${elapsed} -le 3 ]]</div><div class='add'>+</div><div class='add'>+elapsed="$(elapsed_time $M0/file)"</div><div class='add'>+TEST [[ ${elapsed} -le 3 ]]</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/basic/ec/nfs.t b/tests/basic/ec/nfs.t<br/>new file mode 100755<br/>index 00000000000..3f51a640ef7<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/ec/nfs.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/ec/nfs.t</a></div><div class='hunk'>@@ -0,0 +1,29 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../nfs.rc</div><div class='add'>+</div><div class='add'>+#G_TESTDEF_TEST_STATUS_CENTOS6=NFS_TEST</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 redundancy 2 $H0:$B0/${V0}{0..5}</div><div class='add'>+EXPECT "Created" volinfo_field $V0 'Status'</div><div class='add'>+TEST $CLI volume set $V0 nfs.disable false</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "Started" volinfo_field $V0 'Status'</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $NFS_EXPORT_TIMEOUT "1" is_nfs_export_available;</div><div class='add'>+TEST mount_nfs $H0:/$V0 $N0 nolock</div><div class='add'>+</div><div class='add'>+# The test below fails with "bs=1024k count=1k", but passes when "oflag=direct"</div><div class='add'>+# is used. There also does not seem to be an issue on systems with sufficient</div><div class='add'>+# memory. Reducing the "count" prevents hangs too.</div><div class='add'>+TEST dd if=/dev/zero of=$N0/test bs=1024k count=32</div><div class='add'>+</div><div class='add'>+## Before killing daemon to avoid deadlocks</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" umount_nfs $N0</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/basic/ec/quota.t b/tests/basic/ec/quota.t<br/>new file mode 100755<br/>index 00000000000..c9612c8b76a<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/ec/quota.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/ec/quota.t</a></div><div class='hunk'>@@ -0,0 +1,45 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='add'>+QDD=$(dirname $0)/quota</div><div class='add'>+# compile the test write program and run it</div><div class='add'>+build_tester $(dirname $0)/../quota.c -o $QDD</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 disperse $H0:$B0/${V0}{0..2}</div><div class='add'>+EXPECT 'Created' volinfo_field $V0 'Status'</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT 'Started' volinfo_field $V0 'Status'</div><div class='add'>+TEST $GFS --volfile-id=/$V0 --volfile-server=$H0 $M0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "3" ec_child_up_count $V0 0</div><div class='add'>+</div><div class='add'>+TEST mkdir -p $M0/test</div><div class='add'>+</div><div class='add'>+TEST $CLI volume quota $V0 enable</div><div class='add'>+</div><div class='add'>+TEST $CLI volume quota $V0 limit-usage /test 10MB</div><div class='add'>+</div><div class='add'>+EXPECT "10.0MB" quota_hard_limit "/test";</div><div class='add'>+EXPECT "80%" quota_soft_limit "/test";</div><div class='add'>+</div><div class='add'>+TEST $CLI volume quota $V0 soft-timeout 0</div><div class='add'>+TEST $CLI volume quota $V0 hard-timeout 0</div><div class='add'>+</div><div class='add'>+TEST ! $QDD $M0/test/file1.txt 256 48</div><div class='add'>+TEST rm $M0/test/file1.txt</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $MARKER_UPDATE_TIMEOUT "0Bytes" quotausage "/test"</div><div class='add'>+</div><div class='add'>+TEST $QDD $M0/test/file2.txt 256 32</div><div class='add'>+EXPECT_WITHIN $MARKER_UPDATE_TIMEOUT "8.0MB" quotausage "/test"</div><div class='add'>+</div><div class='add'>+TEST rm $M0/test/file2.txt</div><div class='add'>+EXPECT_WITHIN $MARKER_UPDATE_TIMEOUT "0Bytes" quotausage "/test"</div><div class='add'>+TEST $CLI volume stop $V0</div><div class='add'>+</div><div class='add'>+rm -f $QDD</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/basic/ec/self-heal-read-write-fail.t b/tests/basic/ec/self-heal-read-write-fail.t<br/>new file mode 100644<br/>index 00000000000..0ba591b5bb2<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/ec/self-heal-read-write-fail.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/ec/self-heal-read-write-fail.t</a></div><div class='hunk'>@@ -0,0 +1,69 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+#This test verifies that self-heal fails when read/write fails as part of heal</div><div class='add'>+cleanup</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume info</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 disperse 3 redundancy 1 $H0:$B0/${V0}{0,1,2}</div><div class='add'>+TEST $CLI volume heal $V0 disable</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+TEST $GFS --volfile-id=/$V0 --volfile-server=$H0 $M0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "3" ec_child_up_count $V0 0</div><div class='add'>+TEST touch $M0/a</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}0</div><div class='add'>+echo abc &gt;&gt; $M0/a</div><div class='add'>+</div><div class='add'>+# Umount the volume to force all pending writes to reach the bricks</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+</div><div class='add'>+#Load error-gen and fail read fop and test that heal fails</div><div class='add'>+TEST $CLI volume stop $V0 #Stop volume so that error-gen can be loaded</div><div class='add'>+TEST $CLI volume set $V0 debug.error-gen posix</div><div class='add'>+TEST $CLI volume set $V0 debug.error-fops read</div><div class='add'>+TEST $CLI volume set $V0 debug.error-number EBADF</div><div class='add'>+TEST $CLI volume set $V0 debug.error-failure 100</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+TEST $GFS --volfile-id=/$V0 --volfile-server=$H0 $M0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "3" ec_child_up_count $V0 0</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "^2$" get_pending_heal_count $V0</div><div class='add'>+TEST ! getfattr -n trusted.ec.heal $M0/a</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "^2$" get_pending_heal_count $V0</div><div class='add'>+</div><div class='add'>+#fail write fop and test that heal fails</div><div class='add'>+TEST $CLI volume stop $V0</div><div class='add'>+TEST $CLI volume set $V0 debug.error-fops write</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "3" ec_child_up_count $V0 0</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "^2$" get_pending_heal_count $V0</div><div class='add'>+TEST ! getfattr -n trusted.ec.heal $M0/a</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "^2$" get_pending_heal_count $V0</div><div class='add'>+</div><div class='add'>+TEST $CLI volume stop $V0 #Stop volume so that error-gen can be disabled</div><div class='add'>+TEST $CLI volume reset $V0 debug.error-gen</div><div class='add'>+TEST $CLI volume reset $V0 debug.error-fops</div><div class='add'>+TEST $CLI volume reset $V0 debug.error-number</div><div class='add'>+TEST $CLI volume reset $V0 debug.error-failure</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "3" ec_child_up_count $V0 0</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "^2$" get_pending_heal_count $V0</div><div class='add'>+TEST getfattr -n trusted.ec.heal $M0/a</div><div class='add'>+EXPECT "^0$" get_pending_heal_count $V0</div><div class='add'>+</div><div class='add'>+#Test that heal worked as expected by forcing read from brick0</div><div class='add'>+#remount to make sure data is not served from any cache</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+TEST $GFS --volfile-id=/$V0 --volfile-server=$H0 $M0</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}2</div><div class='add'>+EXPECT "abc" cat $M0/a</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/basic/ec/self-heal.t b/tests/basic/ec/self-heal.t<br/>new file mode 100644<br/>index 00000000000..6329bb60248<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/ec/self-heal.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/ec/self-heal.t</a></div><div class='hunk'>@@ -0,0 +1,235 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+SCRIPT_TIMEOUT=300</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+# This test checks self-healing feature of dispersed volumes</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='add'>+</div><div class='add'>+function check_mount_dir</div><div class='add'>+{</div><div class='add'>+    getfattr -d -m. -e hex $M0 2&gt;&amp;1 &gt; /dev/null</div><div class='add'>+    for i in {1..20}; do</div><div class='add'>+        ls -l $M0/ | grep "dir1"</div><div class='add'>+        if [ $? -ne 0 ]; then</div><div class='add'>+            return 1</div><div class='add'>+        fi</div><div class='add'>+    done</div><div class='add'>+</div><div class='add'>+    return 0</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function check_size</div><div class='add'>+{</div><div class='add'>+    cat $M0/$1 2&gt;&amp;1 &gt; /dev/null</div><div class='add'>+    for i in "${brick[@]}"; do</div><div class='add'>+        res=`stat -c "%s" $i/$1`</div><div class='add'>+        if [ "$res" != "$2" ]; then</div><div class='add'>+            echo "N"</div><div class='add'>+            return 0</div><div class='add'>+        fi</div><div class='add'>+    done</div><div class='add'>+    echo "Y"</div><div class='add'>+    return 0</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function check_mode</div><div class='add'>+{</div><div class='add'>+    getfattr -d -m. -e hex $M0/$1 2&gt;&amp;1 &gt; /dev/null</div><div class='add'>+    for i in "${brick[@]}"; do</div><div class='add'>+        res=`stat -c "%A" $i/$1`</div><div class='add'>+        if [ "$res" != "$2" ]; then</div><div class='add'>+            echo "N"</div><div class='add'>+            return 0</div><div class='add'>+        fi</div><div class='add'>+    done</div><div class='add'>+    echo "Y"</div><div class='add'>+    return 0</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function check_date</div><div class='add'>+{</div><div class='add'>+    getfattr -d -m. -e hex $M0/$1 2&gt;&amp;1 &gt; /dev/null</div><div class='add'>+    for i in "${brick[@]}"; do</div><div class='add'>+        res=`stat -c "%Y" $i/$1`</div><div class='add'>+        if [ "$res" != "$2" ]; then</div><div class='add'>+            echo "N"</div><div class='add'>+            return 0</div><div class='add'>+        fi</div><div class='add'>+    done</div><div class='add'>+    echo "Y"</div><div class='add'>+    return 0</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function check_xattr</div><div class='add'>+{</div><div class='add'>+    getfattr -d -m. -e hex $M0/$1 2&gt;&amp;1 &gt; /dev/null</div><div class='add'>+    for i in "${brick[@]}"; do</div><div class='add'>+        getfattr -n $2 $i/$1 2&gt;/dev/null</div><div class='add'>+        if [ $? -eq 0 ]; then</div><div class='add'>+            echo "N"</div><div class='add'>+            return 0</div><div class='add'>+        fi</div><div class='add'>+    done</div><div class='add'>+    echo "Y"</div><div class='add'>+    return 0</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function check_dir</div><div class='add'>+{</div><div class='add'>+    getfattr -m. -d $M0/dir1 2&gt;&amp;1 &gt; /dev/null</div><div class='add'>+    for i in "${brick[@]}"; do</div><div class='add'>+        if [ ! -d $i/dir1 ]; then</div><div class='add'>+            echo "N"</div><div class='add'>+            return 0</div><div class='add'>+        fi</div><div class='add'>+    done</div><div class='add'>+    echo "Y"</div><div class='add'>+    return 0</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function check_soft_link</div><div class='add'>+{</div><div class='add'>+    getfattr -d -m. -e hex $M0/test3 2&gt;&amp;1 &gt; /dev/null</div><div class='add'>+    for i in "${brick[@]}"; do</div><div class='add'>+        if [ ! -h $i/test3 ]; then</div><div class='add'>+            echo "N"</div><div class='add'>+            return 0</div><div class='add'>+        fi</div><div class='add'>+    done</div><div class='add'>+    echo "Y"</div><div class='add'>+    return 0</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function check_hard_link</div><div class='add'>+{</div><div class='add'>+    getfattr -d -m. -e hex $M0/test4 2&gt;&amp;1 &gt; /dev/null</div><div class='add'>+    for i in "${brick[@]}"; do</div><div class='add'>+        res=`stat -c "%h" $i/test4`</div><div class='add'>+        if [ "$res" != "3" ]; then</div><div class='add'>+            echo "N"</div><div class='add'>+            return 0</div><div class='add'>+        fi</div><div class='add'>+    done</div><div class='add'>+    echo "Y"</div><div class='add'>+    return 0</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+tmp=`mktemp -d -t ${0##*/}.XXXXXX`</div><div class='add'>+if [ ! -d $tmp ]; then</div><div class='add'>+    exit 1</div><div class='add'>+fi</div><div class='add'>+</div><div class='add'>+TESTS_EXPECTED_IN_LOOP=194</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 redundancy 2 $H0:$B0/${V0}{0..5}</div><div class='add'>+TEST $CLI volume set $V0 client-log-level DEBUG</div><div class='add'>+#Write-behind has a bug where lookup can race over write which leads to size mismatch on the mount after a 'cp'</div><div class='add'>+TEST $CLI volume set $V0 performance.write-behind off</div><div class='add'>+#md-cache can return stale stat due to default timeout being 1 sec</div><div class='add'>+TEST $CLI volume set $V0 performance.stat-prefetch off</div><div class='add'>+EXPECT "Created" volinfo_field $V0 'Status'</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "Started" volinfo_field $V0 'Status'</div><div class='add'>+#direct-io-mode is to make sure 'cat' leads to READ fop which triggers heal</div><div class='add'>+TEST $GFS --volfile-id=/$V0 --volfile-server=$H0 --direct-io-mode=yes $M0;</div><div class='add'>+# Wait until all 6 childs have been recognized by the ec xlator</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "6" ec_child_up_count $V0 0</div><div class='add'>+</div><div class='add'>+TEST dd if=/dev/urandom of=$tmp/test bs=1024 count=1024</div><div class='add'>+</div><div class='add'>+cs=$(sha1sum $tmp/test | awk '{ print $1 }')</div><div class='add'>+</div><div class='add'>+TEST df -h $M0</div><div class='add'>+TEST stat $M0</div><div class='add'>+</div><div class='add'>+for idx in {0..5}; do</div><div class='add'>+    brick[$idx]=$(gf_get_gfid_backend_file_path $B0/$V0$idx)</div><div class='add'>+done</div><div class='add'>+</div><div class='add'>+TEST cp $tmp/test $M0/test</div><div class='add'>+TEST chmod 644 $M0/test</div><div class='add'>+TEST touch -d "@946681200" $M0/test</div><div class='add'>+EXPECT "-rw-r--r--" stat -c "%A" $M0/test</div><div class='add'>+EXPECT "946681200" stat -c "%Y" $M0/test</div><div class='add'>+</div><div class='add'>+for idx1 in {0..5}; do</div><div class='add'>+    TEST chmod 666 ${brick[$idx1]}/test</div><div class='add'>+    TEST truncate -s 0 ${brick[$idx1]}/test</div><div class='add'>+    TEST setfattr -n user.test -v "test1" ${brick[$idx1]}/test</div><div class='add'>+    EXPECT "-rw-r--r--" stat -c "%A" $M0/test</div><div class='add'>+    EXPECT_WITHIN $HEAL_TIMEOUT "Y" check_size test "262144"</div><div class='add'>+    EXPECT_WITHIN $HEAL_TIMEOUT "Y" check_mode test "-rw-r--r--"</div><div class='add'>+    EXPECT_WITHIN $HEAL_TIMEOUT "Y" check_date test "946681200"</div><div class='add'>+    EXPECT_WITHIN $HEAL_TIMEOUT "Y" check_xattr test "user.test"</div><div class='add'>+done</div><div class='add'>+</div><div class='add'>+for idx1 in {0..4}; do</div><div class='add'>+    for idx2 in `seq $(($idx1 + 1)) 5`; do</div><div class='add'>+        if [ $idx1 -ne $idx2 ]; then</div><div class='add'>+            TEST chmod 666 ${brick[$idx1]}/test</div><div class='add'>+            TEST chmod 600 ${brick[$idx2]}/test</div><div class='add'>+            TEST truncate -s 0 ${brick[$idx1]}/test</div><div class='add'>+            TEST truncate -s 2097152 ${brick[$idx2]}/test</div><div class='add'>+            TEST setfattr -n user.test -v "test1" ${brick[$idx1]}/test</div><div class='add'>+            TEST setfattr -n user.test -v "test2" ${brick[$idx2]}/test</div><div class='add'>+            EXPECT "-rw-r--r--" stat -c "%A" $M0/test</div><div class='add'>+            EXPECT_WITHIN $HEAL_TIMEOUT "Y" check_size test "262144"</div><div class='add'>+            EXPECT_WITHIN $HEAL_TIMEOUT "Y" check_mode test "-rw-r--r--"</div><div class='add'>+            EXPECT_WITHIN $HEAL_TIMEOUT "Y" check_date test "946681200"</div><div class='add'>+            EXPECT_WITHIN $HEAL_TIMEOUT "Y" check_xattr test "user.test"</div><div class='add'>+        fi</div><div class='add'>+    done</div><div class='add'>+done</div><div class='add'>+</div><div class='add'>+sleep 2</div><div class='add'>+</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}0</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}1</div><div class='add'>+TEST cp $tmp/test $M0/test2</div><div class='add'>+EXPECT "1048576" stat -c "%s" $M0/test2</div><div class='add'>+TEST chmod 777 $M0/test2</div><div class='add'>+EXPECT "-rwxrwxrwx" stat -c "%A" $M0/test2</div><div class='add'>+</div><div class='add'>+TEST mkdir $M0/dir1</div><div class='add'>+TEST ls -al $M0/dir1</div><div class='add'>+</div><div class='add'>+TEST ln -s test2 $M0/test3</div><div class='add'>+TEST [ -h $M0/test3 ]</div><div class='add'>+</div><div class='add'>+TEST ln $M0/test2 $M0/test4</div><div class='add'>+TEST [ -f $M0/test4 ]</div><div class='add'>+EXPECT "2" stat -c "%h" $M0/test2</div><div class='add'>+EXPECT "2" stat -c "%h" $M0/test4</div><div class='add'>+</div><div class='add'>+sleep 2</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+# Wait until the killed bricks have been started and recognized by the ec</div><div class='add'>+# xlator</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "6" ec_child_up_count $V0 0</div><div class='add'>+</div><div class='add'>+TEST check_mount_dir</div><div class='add'>+</div><div class='add'>+EXPECT "1048576" stat -c "%s" $M0/test2</div><div class='add'>+EXPECT "-rwxrwxrwx" stat -c "%A" $M0/test2</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "Y" check_size test2 "262144"</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "Y" check_mode test2 "-rwxrwxrwx"</div><div class='add'>+</div><div class='add'>+TEST ls -al $M0/dir1</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "Y" check_dir</div><div class='add'>+</div><div class='add'>+TEST [ -h $M0/test3 ]</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "Y" check_soft_link</div><div class='add'>+</div><div class='add'>+EXPECT "2" stat -c "%h" $M0/test4</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "Y" check_hard_link</div><div class='add'>+</div><div class='add'>+TEST rm -rf $tmp</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/basic/ec/statedump.t b/tests/basic/ec/statedump.t<br/>new file mode 100644<br/>index 00000000000..8d311ec3d6d<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/ec/statedump.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/ec/statedump.t</a></div><div class='hunk'>@@ -0,0 +1,28 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 redundancy 1 $H0:$B0/${V0}{0..2}</div><div class='add'>+EXPECT "Created" volinfo_field $V0 'Status'</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "Started" volinfo_field $V0 'Status'</div><div class='add'>+TEST $GFS --volfile-id=/$V0 --volfile-server=$H0 $M0</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "3" ec_child_up_count $V0 0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" ec_child_up_status $V0 0 0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" ec_child_up_status $V0 0 1</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" ec_child_up_status $V0 0 2</div><div class='add'>+</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}0</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "2" ec_child_up_count $V0 0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "0" ec_child_up_status $V0 0 0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" ec_child_up_status $V0 0 1</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" ec_child_up_status $V0 0 2</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/basic/exports_parsing.t b/tests/basic/exports_parsing.t<br/>new file mode 100644<br/>index 00000000000..da88bbcb2cc<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/exports_parsing.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/exports_parsing.t</a></div><div class='hunk'>@@ -0,0 +1,57 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../include.rc</div><div class='add'>+. $(dirname $0)/../volume.rc</div><div class='add'>+</div><div class='add'>+EXP_FILES=$(dirname $0)/../configfiles</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='add'>+</div><div class='add'>+function test_good_file ()</div><div class='add'>+{</div><div class='add'>+        glusterfsd --print-exports $1</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function test_long_netgroup()</div><div class='add'>+{</div><div class='add'>+        glusterfsd --print-exports $1 2&gt;&amp;1 | sed -n 1p</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function test_bad_line ()</div><div class='add'>+{</div><div class='add'>+        glusterfsd --print-exports $1 2&gt;&amp;1 | sed -n 1p</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function test_big_file ()</div><div class='add'>+{</div><div class='add'>+        glusterfsd --print-exports $1 | sed -n 3p</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function test_bad_opt ()</div><div class='add'>+{</div><div class='add'>+        glusterfsd --print-exports $1 2&gt;&amp;1 | sed -n 1p</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function check_export_line() {</div><div class='add'>+  if [ "$1" == "$2" ]; then</div><div class='add'>+     echo "Y"</div><div class='add'>+  else</div><div class='add'>+    echo "N"</div><div class='add'>+  fi</div><div class='add'>+  return</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+export_result=$(test_good_file $EXP_FILES/exports)</div><div class='add'>+EXPECT "Y" check_export_line '/test @test(rw,anonuid=0,sec=sys,) 10.35.11.31(rw,anonuid=0,sec=sys,) ' "$export_result"</div><div class='add'>+</div><div class='add'>+export_result=$(test_good_file $EXP_FILES/exports-v6)</div><div class='add'>+EXPECT "Y" check_export_line '/test @test(rw,anonuid=0,sec=sys,) 2401:db00:11:1:face:0:3d:0(rw,anonuid=0,sec=sys,) ' "$export_result"</div><div class='add'>+</div><div class='add'>+EXPECT_KEYWORD "Error parsing netgroups for:" test_bad_line $EXP_FILES/bad_exports</div><div class='add'>+EXPECT_KEYWORD "Error parsing netgroups for:" test_long_netgroup $EXP_FILES/bad_exports</div><div class='add'>+</div><div class='add'>+EXPECT_KEYWORD "HDCDTY43SXOAH1TNUKB23MO9DE574W(rw,anonuid=0,sec=sys,)" test_big_file $EXP_FILES/big_exports</div><div class='add'>+</div><div class='add'>+EXPECT_KEYWORD "Could not find any valid options" test_bad_opt $EXP_FILES/exports_bad_opt</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/basic/fencing/afr-lock-heal-advanced.c b/tests/basic/fencing/afr-lock-heal-advanced.c<br/>new file mode 100644<br/>index 00000000000..e202ccd5b29<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/fencing/afr-lock-heal-advanced.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/fencing/afr-lock-heal-advanced.c</a></div><div class='hunk'>@@ -0,0 +1,227 @@</div><div class='add'>+#include &lt;stdio.h&gt;</div><div class='add'>+#include &lt;stdlib.h&gt;</div><div class='add'>+#include &lt;string.h&gt;</div><div class='add'>+#include &lt;errno.h&gt;</div><div class='add'>+#include &lt;signal.h&gt;</div><div class='add'>+#include &lt;unistd.h&gt;</div><div class='add'>+#include &lt;glusterfs/api/glfs.h&gt;</div><div class='add'>+#include &lt;glusterfs/api/glfs-handles.h&gt;</div><div class='add'>+</div><div class='add'>+#define GF_ENFORCE_MANDATORY_LOCK "trusted.glusterfs.enforce-mandatory-lock"</div><div class='add'>+</div><div class='add'>+FILE *logfile_fp;</div><div class='add'>+</div><div class='add'>+#define LOG_ERR(func, err)                                                     \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        if (!logfile_fp) {                                                     \</div><div class='add'>+            fprintf(stderr, "%\n%d %s : returned error (%s)\n", __LINE__,      \</div><div class='add'>+                    func, strerror(err));                                      \</div><div class='add'>+            fflush(stderr);                                                    \</div><div class='add'>+        } else {                                                               \</div><div class='add'>+            fprintf(logfile_fp, "\n%d %s : returned error (%s)\n", __LINE__,   \</div><div class='add'>+                    func, strerror(err));                                      \</div><div class='add'>+            fflush(logfile_fp);                                                \</div><div class='add'>+        }                                                                      \</div><div class='add'>+    } while (0)</div><div class='add'>+</div><div class='add'>+glfs_t *</div><div class='add'>+setup_client(char *hostname, char *volname, char *log_file)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+    glfs_t *fs = NULL;</div><div class='add'>+</div><div class='add'>+    fs = glfs_new(volname);</div><div class='add'>+    if (!fs) {</div><div class='add'>+        fprintf(logfile_fp, "\nglfs_new: returned NULL (%s)\n",</div><div class='add'>+                strerror(errno));</div><div class='add'>+        goto error;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = glfs_set_volfile_server(fs, "tcp", hostname, 24007);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(logfile_fp, "\nglfs_set_volfile_server failed ret:%d (%s)\n",</div><div class='add'>+                ret, strerror(errno));</div><div class='add'>+        goto error;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = glfs_set_logging(fs, log_file, 7);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(logfile_fp, "\nglfs_set_logging failed with ret: %d (%s)\n",</div><div class='add'>+                ret, strerror(errno));</div><div class='add'>+        goto error;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = glfs_init(fs);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(logfile_fp, "\nglfs_init failed with ret: %d (%s)\n", ret,</div><div class='add'>+                strerror(errno));</div><div class='add'>+        goto error;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return fs;</div><div class='add'>+error:</div><div class='add'>+    return NULL;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+glfs_fd_t *</div><div class='add'>+open_file(glfs_t *fs, char *fname)</div><div class='add'>+{</div><div class='add'>+    glfs_fd_t *fd = NULL;</div><div class='add'>+</div><div class='add'>+    fd = glfs_creat(fs, fname, O_CREAT, 0644);</div><div class='add'>+    if (!fd) {</div><div class='add'>+        LOG_ERR("glfs_creat", errno);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+out:</div><div class='add'>+    return fd;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+acquire_mandatory_lock(glfs_t *fs, glfs_fd_t *fd)</div><div class='add'>+{</div><div class='add'>+    struct flock lock;</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    /* initialize lock */</div><div class='add'>+    lock.l_type = F_WRLCK;</div><div class='add'>+    lock.l_whence = SEEK_SET;</div><div class='add'>+    lock.l_start = 0;</div><div class='add'>+    lock.l_len = 100;</div><div class='add'>+</div><div class='add'>+    ret = glfs_fsetxattr(fd, GF_ENFORCE_MANDATORY_LOCK, "set", 8, 0);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        LOG_ERR("glfs_fsetxattr", errno);</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* take a write mandatory lock */</div><div class='add'>+    ret = glfs_file_lock(fd, F_SETLKW, &amp;lock, GLFS_LK_MANDATORY);</div><div class='add'>+    if (ret) {</div><div class='add'>+        LOG_ERR("glfs_file_lock", errno);</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+perform_test(glfs_t *fs, char *file1, char *file2)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+    glfs_fd_t *fd1 = NULL;</div><div class='add'>+    glfs_fd_t *fd2 = NULL;</div><div class='add'>+    char *buf = "0123456789";</div><div class='add'>+</div><div class='add'>+    fd1 = open_file(fs, file1);</div><div class='add'>+    if (!fd1) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    fd2 = open_file(fs, file2);</div><div class='add'>+    if (!fd2) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Kill one brick from the .t.*/</div><div class='add'>+    pause();</div><div class='add'>+</div><div class='add'>+    ret = acquire_mandatory_lock(fs, fd1);</div><div class='add'>+    if (ret) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    ret = acquire_mandatory_lock(fs, fd2);</div><div class='add'>+    if (ret) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Bring the brick up and let the locks heal. */</div><div class='add'>+    pause();</div><div class='add'>+    /*At this point, the .t would have killed and brought back 2 bricks, marking</div><div class='add'>+     * the fd bad.*/</div><div class='add'>+</div><div class='add'>+    ret = glfs_write(fd1, buf, 10, 0);</div><div class='add'>+    if (ret &gt; 0) {</div><div class='add'>+        /* Write is supposed to fail with EBADFD*/</div><div class='add'>+        LOG_ERR("glfs_write", ret);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+out:</div><div class='add'>+    if (fd1)</div><div class='add'>+        glfs_close(fd1);</div><div class='add'>+    if (fd2)</div><div class='add'>+        glfs_close(fd2);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+sigusr1_handler(int signo)</div><div class='add'>+{</div><div class='add'>+    /*Signal caught. Just continue with the execution.*/</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+main(int argc, char *argv[])</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+    glfs_t *fs = NULL;</div><div class='add'>+    char *volname = NULL;</div><div class='add'>+    char log_file[100];</div><div class='add'>+    char *hostname = NULL;</div><div class='add'>+    char *fname1 = NULL;</div><div class='add'>+    char *fname2 = NULL;</div><div class='add'>+</div><div class='add'>+    if (argc != 7) {</div><div class='add'>+        fprintf(stderr,</div><div class='add'>+                "Expect following args %s &lt;host&gt; &lt;volname&gt; &lt;file1&gt; &lt;file2&gt; "</div><div class='add'>+                "&lt;log file "</div><div class='add'>+                "location&gt; &lt;log_file_suffix&gt;\n",</div><div class='add'>+                argv[0]);</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    hostname = argv[1];</div><div class='add'>+    volname = argv[2];</div><div class='add'>+    fname1 = argv[3];</div><div class='add'>+    fname2 = argv[4];</div><div class='add'>+</div><div class='add'>+    /*Use SIGUSR1 and pause()as a means of hitting break-points this program</div><div class='add'>+     *when signalled from the .t test case.*/</div><div class='add'>+    if (signal(SIGUSR1, sigusr1_handler) == SIG_ERR) {</div><div class='add'>+        LOG_ERR("SIGUSR1 handler error", errno);</div><div class='add'>+        exit(EXIT_FAILURE);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    sprintf(log_file, "%s/%s.%s.%s", argv[5], "lock-heal.c", argv[6], "log");</div><div class='add'>+    logfile_fp = fopen(log_file, "w");</div><div class='add'>+    if (!logfile_fp) {</div><div class='add'>+        fprintf(stderr, "\nfailed to open %s\n", log_file);</div><div class='add'>+        fflush(stderr);</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    sprintf(log_file, "%s/%s.%s.%s", argv[5], "glfs-client", argv[6], "log");</div><div class='add'>+    fs = setup_client(hostname, volname, log_file);</div><div class='add'>+    if (!fs) {</div><div class='add'>+        LOG_ERR("setup_client", errno);</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = perform_test(fs, fname1, fname2);</div><div class='add'>+</div><div class='add'>+error:</div><div class='add'>+    if (fs) {</div><div class='add'>+        /*glfs_fini(fs)*/;  // glfs fini path is racy and crashes the program</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    fclose(logfile_fp);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='head'>diff --git a/tests/basic/fencing/afr-lock-heal-advanced.t b/tests/basic/fencing/afr-lock-heal-advanced.t<br/>new file mode 100644<br/>index 00000000000..8a5b5989b5e<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/fencing/afr-lock-heal-advanced.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/fencing/afr-lock-heal-advanced.t</a></div><div class='hunk'>@@ -0,0 +1,115 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+PROCESS_UP_TIMEOUT=90</div><div class='add'>+</div><div class='add'>+function is_gfapi_program_alive()</div><div class='add'>+{</div><div class='add'>+        pid=$1</div><div class='add'>+        ps -p $pid</div><div class='add'>+        if [ $? -eq 0 ]</div><div class='add'>+        then</div><div class='add'>+                echo "Y"</div><div class='add'>+        else</div><div class='add'>+                echo "N"</div><div class='add'>+        fi</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function get_active_lock_count {</div><div class='add'>+    brick=$1</div><div class='add'>+    i1=$2</div><div class='add'>+    i2=$3</div><div class='add'>+    pattern="ACTIVE.*client-${brick: -1}"</div><div class='add'>+</div><div class='add'>+    sdump=$(generate_brick_statedump $V0 $H0 $brick)</div><div class='add'>+    lock_count1="$(egrep "$i1" $sdump -A3| egrep "$pattern"|uniq|wc -l)"</div><div class='add'>+    lock_count2="$(egrep "$i2" $sdump -A3| egrep "$pattern"|uniq|wc -l)"</div><div class='add'>+    echo "$((lock_count1+lock_count2))"</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume info;</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 replica 3 $H0:$B0/${V0}{0,1,2}</div><div class='add'>+EXPECT 'Created' volinfo_field $V0 'Status';</div><div class='add'>+TEST $CLI volume set $V0 performance.write-behind off</div><div class='add'>+TEST $CLI volume set $V0 performance.open-behind off</div><div class='add'>+TEST $CLI volume set $V0 locks.mandatory-locking forced</div><div class='add'>+TEST $CLI volume set $V0 enforce-mandatory-lock on</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+EXPECT 'Started' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+logdir=`gluster --print-logdir`</div><div class='add'>+TEST build_tester $(dirname $0)/afr-lock-heal-advanced.c -lgfapi -ggdb</div><div class='add'>+</div><div class='add'>+#------------------------------------------------------------------------------</div><div class='add'>+# Use more than 1 fd from same client so that list_for_each_* loops are executed more than once.</div><div class='add'>+$(dirname $0)/afr-lock-heal-advanced $H0 $V0 "/FILE1" "/FILE2" $logdir C1&amp;</div><div class='add'>+client_pid=$!</div><div class='add'>+TEST [ $client_pid ]</div><div class='add'>+</div><div class='add'>+TEST sleep 5 # By now, the client would  have opened an fd on FILE1 and FILE2 and waiting for a SIGUSR1.</div><div class='add'>+EXPECT "Y" is_gfapi_program_alive $client_pid</div><div class='add'>+</div><div class='add'>+gfid_str1=$(gf_gfid_xattr_to_str $(gf_get_gfid_xattr $B0/${V0}0/FILE1))</div><div class='add'>+inode1="FILE1|gfid:$gfid_str1"</div><div class='add'>+gfid_str2=$(gf_gfid_xattr_to_str $(gf_get_gfid_xattr $B0/${V0}0/FILE2))</div><div class='add'>+inode2="FILE2|gfid:$gfid_str2"</div><div class='add'>+</div><div class='add'>+# Kill brick-3 and let client-1 take lock on both files.</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}2</div><div class='add'>+TEST kill -SIGUSR1 $client_pid</div><div class='add'>+# If program is still alive, glfs_file_lock() was a success.</div><div class='add'>+EXPECT "Y" is_gfapi_program_alive $client_pid</div><div class='add'>+</div><div class='add'>+# Check lock is present on brick-1 and brick-2</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "2" get_active_lock_count $B0/${V0}0 $inode1 $inode2</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "2" get_active_lock_count $B0/${V0}1 $inode1 $inode2</div><div class='add'>+</div><div class='add'>+# Restart brick-3 and check that the lock has healed on it.</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status $V0 $H0 $B0/${V0}2</div><div class='add'>+TEST sleep 10 #Needed for client to re-open fd? Otherwise client_pre_lk_v2() fails with EBADFD for remote-fd.</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "2" get_active_lock_count $B0/${V0}2 $inode1 $inode2</div><div class='add'>+</div><div class='add'>+#------------------------------------------------------------------------------</div><div class='add'>+# Kill same brick before heal completes the first time and check it completes the second time.</div><div class='add'>+TEST $CLI volume set $V0 delay-gen locks</div><div class='add'>+TEST $CLI volume set $V0 delay-gen.delay-duration 5000000</div><div class='add'>+TEST $CLI volume set $V0 delay-gen.delay-percentage 100</div><div class='add'>+TEST $CLI volume set $V0 delay-gen.enable finodelk</div><div class='add'>+</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}0</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status $V0 $H0 $B0/${V0}0</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}0</div><div class='add'>+TEST $CLI volume reset $V0 delay-gen</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status $V0 $H0 $B0/${V0}0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "2" get_active_lock_count $B0/${V0}0 $inode1 $inode2</div><div class='add'>+</div><div class='add'>+#------------------------------------------------------------------------------</div><div class='add'>+# Kill 2 bricks and bring it back. The fds must be marked bad.</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}0</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}1</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status $V0 $H0 $B0/${V0}0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status $V0 $H0 $B0/${V0}1</div><div class='add'>+</div><div class='add'>+# TODO: `gluster v statedump $V0 client localhost:$client_pid` is not working,</div><div class='add'>+# so sleep for 20 seconds for the client to connect to connect to the bricks.</div><div class='add'>+TEST sleep $CHILD_UP_TIMEOUT</div><div class='add'>+</div><div class='add'>+# Try to write to FILE1 from the .c; it must fail.</div><div class='add'>+TEST kill -SIGUSR1 $client_pid</div><div class='add'>+wait $client_pid</div><div class='add'>+ret=$?</div><div class='add'>+TEST [ $ret == 0 ]</div><div class='add'>+</div><div class='add'>+cleanup_tester $(dirname $0)/afr-lock-heal-advanced</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/basic/fencing/afr-lock-heal-basic.c b/tests/basic/fencing/afr-lock-heal-basic.c<br/>new file mode 100644<br/>index 00000000000..768c9e57181<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/fencing/afr-lock-heal-basic.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/fencing/afr-lock-heal-basic.c</a></div><div class='hunk'>@@ -0,0 +1,182 @@</div><div class='add'>+#include &lt;stdio.h&gt;</div><div class='add'>+#include &lt;stdlib.h&gt;</div><div class='add'>+#include &lt;string.h&gt;</div><div class='add'>+#include &lt;errno.h&gt;</div><div class='add'>+#include &lt;signal.h&gt;</div><div class='add'>+#include &lt;unistd.h&gt;</div><div class='add'>+#include &lt;glusterfs/api/glfs.h&gt;</div><div class='add'>+#include &lt;glusterfs/api/glfs-handles.h&gt;</div><div class='add'>+</div><div class='add'>+#define GF_ENFORCE_MANDATORY_LOCK "trusted.glusterfs.enforce-mandatory-lock"</div><div class='add'>+</div><div class='add'>+FILE *logfile_fp;</div><div class='add'>+</div><div class='add'>+#define LOG_ERR(func, err)                                                     \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        if (!logfile_fp) {                                                     \</div><div class='add'>+            fprintf(stderr, "%\n%d %s : returned error (%s)\n", __LINE__,      \</div><div class='add'>+                    func, strerror(err));                                      \</div><div class='add'>+            fflush(stderr);                                                    \</div><div class='add'>+        } else {                                                               \</div><div class='add'>+            fprintf(logfile_fp, "\n%d %s : returned error (%s)\n", __LINE__,   \</div><div class='add'>+                    func, strerror(err));                                      \</div><div class='add'>+            fflush(logfile_fp);                                                \</div><div class='add'>+        }                                                                      \</div><div class='add'>+    } while (0)</div><div class='add'>+</div><div class='add'>+glfs_t *</div><div class='add'>+setup_client(char *hostname, char *volname, char *log_file)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+    glfs_t *fs = NULL;</div><div class='add'>+</div><div class='add'>+    fs = glfs_new(volname);</div><div class='add'>+    if (!fs) {</div><div class='add'>+        fprintf(logfile_fp, "\nglfs_new: returned NULL (%s)\n",</div><div class='add'>+                strerror(errno));</div><div class='add'>+        goto error;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = glfs_set_volfile_server(fs, "tcp", hostname, 24007);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(logfile_fp, "\nglfs_set_volfile_server failed ret:%d (%s)\n",</div><div class='add'>+                ret, strerror(errno));</div><div class='add'>+        goto error;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = glfs_set_logging(fs, log_file, 7);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(logfile_fp, "\nglfs_set_logging failed with ret: %d (%s)\n",</div><div class='add'>+                ret, strerror(errno));</div><div class='add'>+        goto error;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = glfs_init(fs);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(logfile_fp, "\nglfs_init failed with ret: %d (%s)\n", ret,</div><div class='add'>+                strerror(errno));</div><div class='add'>+        goto error;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return fs;</div><div class='add'>+error:</div><div class='add'>+    return NULL;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+acquire_mandatory_lock(glfs_t *fs, char *fname)</div><div class='add'>+{</div><div class='add'>+    struct flock lock;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    glfs_fd_t *fd = NULL;</div><div class='add'>+</div><div class='add'>+    fd = glfs_creat(fs, fname, O_CREAT, 0644);</div><div class='add'>+    if (!fd) {</div><div class='add'>+        if (errno != EEXIST) {</div><div class='add'>+            LOG_ERR("glfs_creat", errno);</div><div class='add'>+            ret = -1;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+        fd = glfs_open(fs, fname, O_RDWR | O_NONBLOCK);</div><div class='add'>+        if (!fd) {</div><div class='add'>+            LOG_ERR("glfs_open", errno);</div><div class='add'>+            ret = -1;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* initialize lock */</div><div class='add'>+    lock.l_type = F_WRLCK;</div><div class='add'>+    lock.l_whence = SEEK_SET;</div><div class='add'>+    lock.l_start = 0;</div><div class='add'>+    lock.l_len = 100;</div><div class='add'>+</div><div class='add'>+    ret = glfs_fsetxattr(fd, GF_ENFORCE_MANDATORY_LOCK, "set", 8, 0);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        LOG_ERR("glfs_fsetxattr", errno);</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    pause();</div><div class='add'>+</div><div class='add'>+    /* take a write mandatory lock */</div><div class='add'>+    ret = glfs_file_lock(fd, F_SETLKW, &amp;lock, GLFS_LK_MANDATORY);</div><div class='add'>+    if (ret) {</div><div class='add'>+        LOG_ERR("glfs_file_lock", errno);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    pause();</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (fd) {</div><div class='add'>+        glfs_close(fd);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+sigusr1_handler(int signo)</div><div class='add'>+{</div><div class='add'>+    /*Signal caught. Just continue with the execution.*/</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+main(int argc, char *argv[])</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+    glfs_t *fs = NULL;</div><div class='add'>+    char *volname = NULL;</div><div class='add'>+    char log_file[100];</div><div class='add'>+    char *hostname = NULL;</div><div class='add'>+    char *fname = NULL;</div><div class='add'>+</div><div class='add'>+    if (argc != 6) {</div><div class='add'>+        fprintf(stderr,</div><div class='add'>+                "Expect following args %s &lt;host&gt; &lt;volname&gt; &lt;file&gt; &lt;log file "</div><div class='add'>+                "location&gt; &lt;log_file_suffix&gt;\n",</div><div class='add'>+                argv[0]);</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    hostname = argv[1];</div><div class='add'>+    volname = argv[2];</div><div class='add'>+    fname = argv[3];</div><div class='add'>+</div><div class='add'>+    /*Use SIGUSR1 and pause()as a means of hitting break-points this program</div><div class='add'>+     *when signalled from the .t test case.*/</div><div class='add'>+    if (signal(SIGUSR1, sigusr1_handler) == SIG_ERR) {</div><div class='add'>+        LOG_ERR("SIGUSR1 handler error", errno);</div><div class='add'>+        exit(EXIT_FAILURE);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    sprintf(log_file, "%s/%s.%s.%s", argv[4], "lock-heal-basic.c", argv[5],</div><div class='add'>+            "log");</div><div class='add'>+    logfile_fp = fopen(log_file, "w");</div><div class='add'>+    if (!logfile_fp) {</div><div class='add'>+        fprintf(stderr, "\nfailed to open %s\n", log_file);</div><div class='add'>+        fflush(stderr);</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    sprintf(log_file, "%s/%s.%s.%s", argv[4], "glfs-client", argv[5], "log");</div><div class='add'>+    fs = setup_client(hostname, volname, log_file);</div><div class='add'>+    if (!fs) {</div><div class='add'>+        LOG_ERR("setup_client", errno);</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = acquire_mandatory_lock(fs, fname);</div><div class='add'>+</div><div class='add'>+error:</div><div class='add'>+    if (fs) {</div><div class='add'>+        /*glfs_fini(fs)*/;  // glfs fini path is racy and crashes the program</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    fclose(logfile_fp);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='head'>diff --git a/tests/basic/fencing/afr-lock-heal-basic.t b/tests/basic/fencing/afr-lock-heal-basic.t<br/>new file mode 100644<br/>index 00000000000..69131af085d<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/fencing/afr-lock-heal-basic.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/fencing/afr-lock-heal-basic.t</a></div><div class='hunk'>@@ -0,0 +1,102 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+function is_gfapi_program_alive()</div><div class='add'>+{</div><div class='add'>+        pid=$1</div><div class='add'>+        ps -p $pid</div><div class='add'>+        if [ $? -eq 0 ]</div><div class='add'>+        then</div><div class='add'>+                echo "Y"</div><div class='add'>+        else</div><div class='add'>+                echo "N"</div><div class='add'>+        fi</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume info;</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 replica 3 $H0:$B0/${V0}{0,1,2}</div><div class='add'>+EXPECT 'Created' volinfo_field $V0 'Status';</div><div class='add'>+TEST $CLI volume set $V0 performance.write-behind off</div><div class='add'>+TEST $CLI volume set $V0 performance.open-behind off</div><div class='add'>+TEST $CLI volume set $V0 locks.mandatory-locking forced</div><div class='add'>+TEST $CLI volume set $V0 enforce-mandatory-lock on</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+EXPECT 'Started' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+logdir=`gluster --print-logdir`</div><div class='add'>+TEST build_tester $(dirname $0)/afr-lock-heal-basic.c -lgfapi -ggdb</div><div class='add'>+</div><div class='add'>+$(dirname $0)/afr-lock-heal-basic $H0 $V0 "/FILE" $logdir C1&amp;</div><div class='add'>+client1_pid=$!</div><div class='add'>+TEST [ $client1_pid ]</div><div class='add'>+</div><div class='add'>+$(dirname $0)/afr-lock-heal-basic $H0 $V0 "/FILE" $logdir C2&amp;</div><div class='add'>+client2_pid=$!</div><div class='add'>+TEST [ $client2_pid ]</div><div class='add'>+</div><div class='add'>+TEST sleep 5 # By now, the 2 clients would  have opened an fd on FILE and waiting for a SIGUSR1.</div><div class='add'>+EXPECT "Y" is_gfapi_program_alive $client1_pid</div><div class='add'>+EXPECT "Y" is_gfapi_program_alive $client2_pid</div><div class='add'>+</div><div class='add'>+gfid_str=$(gf_gfid_xattr_to_str $(gf_get_gfid_xattr $B0/${V0}0/FILE))</div><div class='add'>+inode="FILE|gfid:$gfid_str"</div><div class='add'>+</div><div class='add'>+# Kill brick-3 and let client-1 take lock on the file.</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}2</div><div class='add'>+TEST kill -SIGUSR1 $client1_pid</div><div class='add'>+# If program is still alive, glfs_file_lock() was a success.</div><div class='add'>+EXPECT "Y" is_gfapi_program_alive $client1_pid</div><div class='add'>+</div><div class='add'>+# Check lock is present on brick-1 and brick-2</div><div class='add'>+b1_sdump=$(generate_brick_statedump $V0 $H0 $B0/${V0}0)</div><div class='add'>+c1_lock_on_b1="$(egrep "$inode" $b1_sdump -A3| egrep 'ACTIVE.*client-0'| uniq| awk '{print $1,$2,$3,S4,$5,$6,$7,$8}'|tr -d '(,), ,')"</div><div class='add'>+b2_sdump=$(generate_brick_statedump $V0 $H0 $B0/${V0}1)</div><div class='add'>+c1_lock_on_b2="$(egrep "$inode" $b2_sdump -A3| egrep 'ACTIVE.*client-1'| uniq| awk '{print $1,$2,$3,S4,$5,$6,$7,$8}'|tr -d '(,), ,')"</div><div class='add'>+TEST [ "$c1_lock_on_b1" == "$c1_lock_on_b2" ]</div><div class='add'>+</div><div class='add'>+# Restart brick-3 and check that the lock has healed on it.</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status $V0 $H0 $B0/${V0}2</div><div class='add'>+TEST sleep 10 #Needed for client to re-open fd? Otherwise client_pre_lk_v2() fails with EBADFD for remote-fd. Also wait for lock heal.</div><div class='add'>+</div><div class='add'>+b3_sdump=$(generate_brick_statedump $V0 $H0 $B0/${V0}2)</div><div class='add'>+c1_lock_on_b3="$(egrep "$inode" $b3_sdump -A3| egrep 'ACTIVE.*client-2'| uniq| awk '{print $1,$2,$3,S4,$5,$6,$7,$8}'|tr -d '(,), ,')"</div><div class='add'>+TEST [ "$c1_lock_on_b1" == "$c1_lock_on_b3" ]</div><div class='add'>+</div><div class='add'>+# Kill brick-1 and let client-2 preempt the lock on bricks 2 and 3.</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}0</div><div class='add'>+TEST kill -SIGUSR1 $client2_pid</div><div class='add'>+# If program is still alive, glfs_file_lock() was a success.</div><div class='add'>+EXPECT "Y" is_gfapi_program_alive $client2_pid</div><div class='add'>+</div><div class='add'>+# Restart brick-1 and let lock healing complete.</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status $V0 $H0 $B0/${V0}0</div><div class='add'>+TEST sleep 10 #Needed for client to re-open fd? Otherwise client_pre_lk_v2() fails with EBADFD for remote-fd. Also wait for lock heal.</div><div class='add'>+</div><div class='add'>+# Check that all bricks now have locks from client 2 only.</div><div class='add'>+b1_sdump=$(generate_brick_statedump $V0 $H0 $B0/${V0}0)</div><div class='add'>+c2_lock_on_b1="$(egrep "$inode" $b1_sdump -A3| egrep 'ACTIVE.*client-0'| uniq| awk '{print $1,$2,$3,S4,$5,$6,$7,$8}'|tr -d '(,), ,')"</div><div class='add'>+b2_sdump=$(generate_brick_statedump $V0 $H0 $B0/${V0}1)</div><div class='add'>+c2_lock_on_b2="$(egrep "$inode" $b2_sdump -A3| egrep 'ACTIVE.*client-1'| uniq| awk '{print $1,$2,$3,S4,$5,$6,$7,$8}'|tr -d '(,), ,')"</div><div class='add'>+b3_sdump=$(generate_brick_statedump $V0 $H0 $B0/${V0}2)</div><div class='add'>+c2_lock_on_b3="$(egrep "$inode" $b3_sdump -A3| egrep 'ACTIVE.*client-2'| uniq| awk '{print $1,$2,$3,S4,$5,$6,$7,$8}'|tr -d '(,), ,')"</div><div class='add'>+TEST [ "$c2_lock_on_b1" == "$c2_lock_on_b2" ]</div><div class='add'>+TEST [ "$c2_lock_on_b1" == "$c2_lock_on_b3" ]</div><div class='add'>+TEST [ "$c2_lock_on_b1" != "$c1_lock_on_b1" ]</div><div class='add'>+</div><div class='add'>+#Let the client programs run and exit.</div><div class='add'>+TEST kill -SIGUSR1 $client1_pid</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "N" is_gfapi_program_alive $client1_pid</div><div class='add'>+TEST kill -SIGUSR1 $client2_pid</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "N" is_gfapi_program_alive $client2_pid</div><div class='add'>+</div><div class='add'>+cleanup_tester $(dirname $0)/afr-lock-heal-basic</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/basic/fencing/fence-basic.c b/tests/basic/fencing/fence-basic.c<br/>new file mode 100644<br/>index 00000000000..4aa452e19b0<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/fencing/fence-basic.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/fencing/fence-basic.c</a></div><div class='hunk'>@@ -0,0 +1,229 @@</div><div class='add'>+#include &lt;glusterfs/api/glfs.h&gt;</div><div class='add'>+#include &lt;glusterfs/api/glfs-handles.h&gt;</div><div class='add'>+#include &lt;errno.h&gt;</div><div class='add'>+#include &lt;stdio.h&gt;</div><div class='add'>+#include &lt;stdlib.h&gt;</div><div class='add'>+#include &lt;string.h&gt;</div><div class='add'>+</div><div class='add'>+#define NO_INIT 1</div><div class='add'>+#define GF_ENFORCE_MANDATORY_LOCK "trusted.glusterfs.enforce-mandatory-lock"</div><div class='add'>+</div><div class='add'>+FILE *fp;</div><div class='add'>+char *buf = "0123456789";</div><div class='add'>+</div><div class='add'>+#define LOG_ERR(func, err)                                                     \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        if (!fp) {                                                             \</div><div class='add'>+            fprintf(stderr, "%\n%d %s : returned error (%s)\n", __LINE__,      \</div><div class='add'>+                    func, strerror(err));                                      \</div><div class='add'>+            fflush(stderr);                                                    \</div><div class='add'>+        } else {                                                               \</div><div class='add'>+            fprintf(fp, "\n%d %s : returned error (%s)\n", __LINE__, func,     \</div><div class='add'>+                    strerror(err));                                            \</div><div class='add'>+            fflush(fp);                                                        \</div><div class='add'>+        }                                                                      \</div><div class='add'>+    } while (0)</div><div class='add'>+</div><div class='add'>+glfs_t *</div><div class='add'>+setup_new_client(char *hostname, char *volname, char *log_file, int flag)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+    glfs_t *fs = NULL;</div><div class='add'>+</div><div class='add'>+    fs = glfs_new(volname);</div><div class='add'>+    if (!fs) {</div><div class='add'>+        fprintf(fp, "\nglfs_new: returned NULL (%s)\n", strerror(errno));</div><div class='add'>+        goto error;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = glfs_set_volfile_server(fs, "tcp", hostname, 24007);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(fp, "\nglfs_set_volfile_server failed ret:%d (%s)\n", ret,</div><div class='add'>+                strerror(errno));</div><div class='add'>+        goto error;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = glfs_set_logging(fs, log_file, 7);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(fp, "\nglfs_set_logging failed with ret: %d (%s)\n", ret,</div><div class='add'>+                strerror(errno));</div><div class='add'>+        goto error;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (flag == NO_INIT)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    ret = glfs_init(fs);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(fp, "\nglfs_init failed with ret: %d (%s)\n", ret,</div><div class='add'>+                strerror(errno));</div><div class='add'>+        goto error;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return fs;</div><div class='add'>+error:</div><div class='add'>+    return NULL;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* test plan</div><div class='add'>+ *</div><div class='add'>+ *  - take mandatory lock from client 1</div><div class='add'>+ *  - preempt mandatory lock from client 2</div><div class='add'>+ *  - write from client 1 which should fail</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+test(glfs_t *fs1, glfs_t *fs2, char *fname)</div><div class='add'>+{</div><div class='add'>+    struct flock lock;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    glfs_fd_t *fd1, *fd2 = NULL;</div><div class='add'>+</div><div class='add'>+    fd1 = glfs_creat(fs1, fname, O_RDWR, 0777);</div><div class='add'>+    if (ret) {</div><div class='add'>+        LOG_ERR("glfs_creat", errno);</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    fd2 = glfs_open(fs2, fname, O_RDWR | O_NONBLOCK);</div><div class='add'>+    if (ret) {</div><div class='add'>+        LOG_ERR("glfs_open", errno);</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* initialize lock */</div><div class='add'>+    lock.l_type = F_WRLCK;</div><div class='add'>+    lock.l_whence = SEEK_SET;</div><div class='add'>+    lock.l_start = 0;</div><div class='add'>+    lock.l_len = 100;</div><div class='add'>+</div><div class='add'>+    ret = glfs_fsetxattr(fd1, GF_ENFORCE_MANDATORY_LOCK, "set", 8, 0);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        LOG_ERR("glfs_fsetxattr", errno);</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* take a write mandatory lock */</div><div class='add'>+    ret = glfs_file_lock(fd1, F_SETLKW, &amp;lock, GLFS_LK_MANDATORY);</div><div class='add'>+    if (ret) {</div><div class='add'>+        LOG_ERR("glfs_file_lock", errno);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = glfs_write(fd1, buf, 10, 0);</div><div class='add'>+    if (ret != 10) {</div><div class='add'>+        LOG_ERR("glfs_write", errno);</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* write should fail */</div><div class='add'>+    ret = glfs_write(fd2, buf, 10, 0);</div><div class='add'>+    if (ret != -1) {</div><div class='add'>+        LOG_ERR("glfs_write", errno);</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* preempt mandatory lock from client 1*/</div><div class='add'>+    ret = glfs_file_lock(fd2, F_SETLKW, &amp;lock, GLFS_LK_MANDATORY);</div><div class='add'>+    if (ret) {</div><div class='add'>+        LOG_ERR("glfs_file_lock", errno);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* write should succeed from client 2 */</div><div class='add'>+    ret = glfs_write(fd2, buf, 10, 0);</div><div class='add'>+    if (ret == -1) {</div><div class='add'>+        LOG_ERR("glfs_write", errno);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* write should fail from client 1 */</div><div class='add'>+    ret = glfs_write(fd1, buf, 10, 0);</div><div class='add'>+    if (ret == 10) {</div><div class='add'>+        LOG_ERR("glfs_write", errno);</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (fd1) {</div><div class='add'>+        glfs_close(fd1);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (fd2) {</div><div class='add'>+        glfs_close(fd2);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+main(int argc, char *argv[])</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+    glfs_t *fs1 = NULL;</div><div class='add'>+    glfs_t *fs2 = NULL;</div><div class='add'>+    char *volname = NULL;</div><div class='add'>+    char log_file[100];</div><div class='add'>+    char *hostname = NULL;</div><div class='add'>+    char *fname = "/file";</div><div class='add'>+    glfs_fd_t *fd1 = NULL;</div><div class='add'>+    glfs_fd_t *fd2 = NULL;</div><div class='add'>+</div><div class='add'>+    if (argc != 4) {</div><div class='add'>+        fprintf(</div><div class='add'>+            stderr,</div><div class='add'>+            "Expect following args %s &lt;hostname&gt; &lt;Vol&gt; &lt;log file location&gt;\n",</div><div class='add'>+            argv[0]);</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    hostname = argv[1];</div><div class='add'>+    volname = argv[2];</div><div class='add'>+</div><div class='add'>+    sprintf(log_file, "%s/%s", argv[3], "fence-basic.log");</div><div class='add'>+    fp = fopen(log_file, "w");</div><div class='add'>+    if (!fp) {</div><div class='add'>+        fprintf(stderr, "\nfailed to open %s\n", log_file);</div><div class='add'>+        fflush(stderr);</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    sprintf(log_file, "%s/%s", argv[3], "glfs-client-1.log");</div><div class='add'>+    fs1 = setup_new_client(hostname, volname, log_file, 0);</div><div class='add'>+    if (!fs1) {</div><div class='add'>+        LOG_ERR("setup_new_client", errno);</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    sprintf(log_file, "%s/%s", argv[3], "glfs-client-2.log");</div><div class='add'>+    fs2 = setup_new_client(hostname, volname, log_file, 0);</div><div class='add'>+    if (!fs2) {</div><div class='add'>+        LOG_ERR("setup_new_client", errno);</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto error;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = test(fs1, fs2, fname);</div><div class='add'>+</div><div class='add'>+error:</div><div class='add'>+    if (fs1) {</div><div class='add'>+        glfs_fini(fs1);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (fs2) {</div><div class='add'>+        glfs_fini(fs2);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    fclose(fp);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='head'>diff --git a/tests/basic/fencing/fence-basic.t b/tests/basic/fencing/fence-basic.t<br/>new file mode 100755<br/>index 00000000000..30f379e7b20<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/fencing/fence-basic.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/fencing/fence-basic.t</a></div><div class='hunk'>@@ -0,0 +1,31 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume info;</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/brick1</div><div class='add'>+EXPECT 'Created' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+EXPECT 'Started' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+TEST $CLI volume set $V0 diagnostics.client-log-flush-timeout 30</div><div class='add'>+TEST $CLI volume set $V0 performance.write-behind off</div><div class='add'>+TEST $CLI volume set $V0 locks.mandatory-locking forced</div><div class='add'>+TEST $CLI volume set $V0 enforce-mandatory-lock on</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+logdir=`gluster --print-logdir`</div><div class='add'>+</div><div class='add'>+TEST build_tester $(dirname $0)/fence-basic.c -lgfapi -ggdb</div><div class='add'>+TEST $(dirname $0)/fence-basic $H0 $V0 $logdir</div><div class='add'>+</div><div class='add'>+cleanup_tester $(dirname $0)/fence-basic</div><div class='add'>+</div><div class='add'>+cleanup;
\ No newline at end of file</div><div class='head'>diff --git a/tests/basic/fencing/fencing-crash-conistency.t b/tests/basic/fencing/fencing-crash-conistency.t<br/>new file mode 100644<br/>index 00000000000..0c69411e90c<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/fencing/fencing-crash-conistency.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/fencing/fencing-crash-conistency.t</a></div><div class='hunk'>@@ -0,0 +1,62 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+# with lock enforcement flag write should fail with out lock</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume info;</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/${V0}1</div><div class='add'>+EXPECT 'Created' volinfo_field $V0 'Status';</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+EXPECT 'Started' volinfo_field $V0 'Status';</div><div class='add'>+TEST $CLI volume set $V0 performance.write-behind off</div><div class='add'>+TEST glusterfs -s $H0 --volfile-id $V0 $M0</div><div class='add'>+</div><div class='add'>+TEST touch $M0/file</div><div class='add'>+</div><div class='add'>+#write should pass</div><div class='add'>+TEST "echo "test" &gt; $M0/file"</div><div class='add'>+TEST "truncate -s 0 $M0/file"</div><div class='add'>+</div><div class='add'>+#enable mandatory locking</div><div class='add'>+TEST $CLI volume set $V0 locks.mandatory-locking forced</div><div class='add'>+TEST $CLI volume set $V0 enforce-mandatory-lock on</div><div class='add'>+</div><div class='add'>+#write should pass</div><div class='add'>+TEST "echo "test" &gt;&gt; $M0/file"</div><div class='add'>+TEST "truncate -s 0 $M0/file"</div><div class='add'>+</div><div class='add'>+#enforce lock on the file</div><div class='add'>+TEST setfattr -n trusted.glusterfs.enforce-mandatory-lock -v 1 $M0/file</div><div class='add'>+</div><div class='add'>+#write should fail</div><div class='add'>+TEST ! "echo "test" &gt;&gt; $M0/file"</div><div class='add'>+TEST ! "truncate -s 0 $M0/file"</div><div class='add'>+</div><div class='add'>+#remove lock enforcement flag</div><div class='add'>+TEST setfattr -x trusted.glusterfs.enforce-mandatory-lock $M0/file</div><div class='add'>+</div><div class='add'>+#write should pass</div><div class='add'>+TEST "echo "test" &gt;&gt; $M0/file"</div><div class='add'>+TEST "truncate -s 0 $M0/file"</div><div class='add'>+</div><div class='add'>+#enforce lock on the file</div><div class='add'>+TEST setfattr -n trusted.glusterfs.enforce-mandatory-lock -v 1 $M0/file</div><div class='add'>+#kill brick</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}1</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+</div><div class='add'>+# wait one second for the brick to come online</div><div class='add'>+sleep 2</div><div class='add'>+#write should fail (lock xlator gets lock enforcement info from disk)</div><div class='add'>+TEST ! "echo "test" &gt;&gt; $M0/file"</div><div class='add'>+TEST ! "truncate -s 0 $M0/file"</div><div class='add'>+</div><div class='add'>+cleanup;
\ No newline at end of file</div><div class='head'>diff --git a/tests/basic/fencing/test-fence-option.t b/tests/basic/fencing/test-fence-option.t<br/>new file mode 100644<br/>index 00000000000..115cbe7dbdf<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/fencing/test-fence-option.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/fencing/test-fence-option.t</a></div><div class='hunk'>@@ -0,0 +1,37 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+# with lock enforcement flag write should fail with out lock</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume info;</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/${V0}1</div><div class='add'>+EXPECT 'Created' volinfo_field $V0 'Status';</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+EXPECT 'Started' volinfo_field $V0 'Status';</div><div class='add'>+TEST glusterfs -s $H0 --volfile-id $V0 $M0</div><div class='add'>+</div><div class='add'>+TEST touch $M0/file</div><div class='add'>+</div><div class='add'>+#setfattr for mandatory-enforcement will fail</div><div class='add'>+TEST ! setfattr -n trusted.glusterfs.enforce-mandatory-lock -v 1 $M0/file</div><div class='add'>+</div><div class='add'>+#enable mandatory locking</div><div class='add'>+TEST $CLI volume set $V0 locks.mandatory-locking forced</div><div class='add'>+</div><div class='add'>+#setfattr will fail</div><div class='add'>+TEST ! setfattr -n trusted.glusterfs.enforce-mandatory-lock -v 1 $M0/file</div><div class='add'>+</div><div class='add'>+#set lock-enforcement option</div><div class='add'>+TEST $CLI volume set $V0 enforce-mandatory-lock on</div><div class='add'>+</div><div class='add'>+#setfattr should succeed</div><div class='add'>+TEST setfattr -n trusted.glusterfs.enforce-mandatory-lock -v 1 $M0/file</div><div class='add'>+</div><div class='add'>+cleanup;
\ No newline at end of file</div><div class='head'>diff --git a/tests/basic/fop-sampling.t b/tests/basic/fop-sampling.t<br/>new file mode 100644<br/>index 00000000000..cea8aa737c0<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/fop-sampling.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/fop-sampling.t</a></div><div class='hunk'>@@ -0,0 +1,61 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+#</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../include.rc</div><div class='add'>+. $(dirname $0)/../volume.rc</div><div class='add'>+</div><div class='add'>+SAMPLE_FILE="$(gluster --print-logdir)/samples/glusterfs_${V0}.samp"</div><div class='add'>+</div><div class='add'>+function print_cnt() {</div><div class='add'>+  local FOP_TYPE=$1</div><div class='add'>+  local FOP_CNT=$(grep ,${FOP_TYPE} ${SAMPLE_FILE} | wc -l)</div><div class='add'>+  echo $FOP_CNT</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+# Verify we got non-zero counts for stats/lookup/readdir</div><div class='add'>+check_samples() {</div><div class='add'>+        STAT_CNT=$(print_cnt STAT)</div><div class='add'>+        if [ "$STAT_CNT" -le "0" ]; then</div><div class='add'>+                echo "STAT count is zero"</div><div class='add'>+                return</div><div class='add'>+        fi</div><div class='add'>+</div><div class='add'>+        LOOKUP_CNT=$(print_cnt LOOKUP)</div><div class='add'>+        if [ "$LOOKUP_CNT" -le "0" ]; then</div><div class='add'>+                echo "LOOKUP count is zero"</div><div class='add'>+                return</div><div class='add'>+        fi</div><div class='add'>+</div><div class='add'>+        READDIR_CNT=$(print_cnt READDIR)</div><div class='add'>+        if [ "$READDIR_CNT" -le "0" ]; then</div><div class='add'>+                echo "READDIR count is zero"</div><div class='add'>+                return</div><div class='add'>+        fi</div><div class='add'>+</div><div class='add'>+        echo "OK"</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 replica 3 $H0:$B0/${V0}{0,1,2}</div><div class='add'>+TEST $CLI volume set $V0 nfs.disable off</div><div class='add'>+TEST $CLI volume set $V0 diagnostics.latency-measurement on</div><div class='add'>+TEST $CLI volume set $V0 diagnostics.count-fop-hits on</div><div class='add'>+TEST $CLI volume set $V0 diagnostics.stats-dump-interval 2</div><div class='add'>+TEST $CLI volume set $V0 diagnostics.fop-sample-buf-size 65535</div><div class='add'>+TEST $CLI volume set $V0 diagnostics.fop-sample-interval 1</div><div class='add'>+TEST $CLI volume set $V0 diagnostics.stats-dnscache-ttl-sec 3600</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+TEST glusterfs --volfile-id=/$V0 --volfile-server=$H0 $M0 --attribute-timeout=0 --entry-timeout=0</div><div class='add'>+</div><div class='add'>+for i in {1..5}</div><div class='add'>+do</div><div class='add'>+        dd if=/dev/zero of=${M0}/testfile$i bs=4k count=1</div><div class='add'>+done</div><div class='add'>+</div><div class='add'>+TEST ls -l $M0</div><div class='add'>+EXPECT_WITHIN 6 "OK" check_samples</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/basic/fops-sanity.c b/tests/basic/fops-sanity.c<br/>new file mode 100644<br/>index 00000000000..ef00aa0f088<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/fops-sanity.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/fops-sanity.c</a></div><div class='hunk'>@@ -0,0 +1,1033 @@</div><div class='add'>+/* Copyright (c) 2014 Red Hat, Inc. All rights reserved.</div><div class='add'>+</div><div class='add'>+* This copyrighted material is made available to anyone wishing</div><div class='add'>+* to use, modify, copy, or redistribute it subject to the terms</div><div class='add'>+* and conditions of the GNU General Public License version 2.</div><div class='add'>+</div><div class='add'>+* This program is distributed in the hope that it will be</div><div class='add'>+* useful, but WITHOUT ANY WARRANTY; without even the implied</div><div class='add'>+* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR</div><div class='add'>+* PURPOSE. See the GNU General Public License for more details.</div><div class='add'>+</div><div class='add'>+* You should have received a copy of the GNU General Public</div><div class='add'>+* License along with this program; if not, write to the Free</div><div class='add'>+* Software Foundation, Inc., 51 Franklin Street, Fifth Floor,</div><div class='add'>+* Boston, MA 02110-1301, USA.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+/* Filesystem basic sanity check, tests all (almost) fops. */</div><div class='add'>+</div><div class='add'>+#include &lt;stdio.h&gt;</div><div class='add'>+#include &lt;fcntl.h&gt;</div><div class='add'>+#include &lt;unistd.h&gt;</div><div class='add'>+#include &lt;sys/types.h&gt;</div><div class='add'>+#include &lt;sys/stat.h&gt;</div><div class='add'>+#include &lt;sys/xattr.h&gt;</div><div class='add'>+#include &lt;errno.h&gt;</div><div class='add'>+#include &lt;string.h&gt;</div><div class='add'>+#include &lt;dirent.h&gt;</div><div class='add'>+#include &lt;sys/sysmacros.h&gt;</div><div class='add'>+</div><div class='add'>+#ifndef linux</div><div class='add'>+#include &lt;sys/socket.h&gt;</div><div class='add'>+#include &lt;sys/types.h&gt;</div><div class='add'>+#include &lt;sys/un.h&gt;</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+/* for fd based fops after unlink */</div><div class='add'>+int</div><div class='add'>+fd_based_fops_1(char *filename);</div><div class='add'>+/* for fd based fops before unlink */</div><div class='add'>+int</div><div class='add'>+fd_based_fops_2(char *filename);</div><div class='add'>+/* fops based on fd after dup */</div><div class='add'>+int</div><div class='add'>+dup_fd_based_fops(char *filename);</div><div class='add'>+/* for fops based on path */</div><div class='add'>+int</div><div class='add'>+path_based_fops(char *filename);</div><div class='add'>+/* for fops which operate on directory */</div><div class='add'>+int</div><div class='add'>+dir_based_fops(char *filename);</div><div class='add'>+/* for fops which operate in link files (symlinks) */</div><div class='add'>+int</div><div class='add'>+link_based_fops(char *filename);</div><div class='add'>+/* to test open syscall with open modes available. */</div><div class='add'>+int</div><div class='add'>+test_open_modes(char *filename);</div><div class='add'>+/* generic function which does open write and read. */</div><div class='add'>+int</div><div class='add'>+generic_open_read_write(char *filename, int flag, mode_t mode);</div><div class='add'>+</div><div class='add'>+#define OPEN_MODE 0666</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+main(int argc, char *argv[])</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int result = 0;</div><div class='add'>+    char filename[255] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    if (argc &gt; 1)</div><div class='add'>+        strcpy(filename, argv[1]);</div><div class='add'>+    else</div><div class='add'>+        strcpy(filename, "temp-xattr-test-file");</div><div class='add'>+</div><div class='add'>+    ret = fd_based_fops_1(strcat(filename, "_1"));</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(stderr, "fd based file operation 1 failed\n");</div><div class='add'>+        result |= ret;</div><div class='add'>+    } else {</div><div class='add'>+        fprintf(stdout, "fd based file operation 1 passed\n");</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = fd_based_fops_2(strcat(filename, "_2"));</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        result |= ret;</div><div class='add'>+        fprintf(stderr, "fd based file operation 2 failed\n");</div><div class='add'>+    } else {</div><div class='add'>+        fprintf(stdout, "fd based file operation 2 passed\n");</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dup_fd_based_fops(strcat(filename, "_3"));</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        result |= ret;</div><div class='add'>+        fprintf(stderr, "dup fd based file operation failed\n");</div><div class='add'>+    } else {</div><div class='add'>+        fprintf(stdout, "dup fd based file operation passed\n");</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = path_based_fops(strcat(filename, "_4"));</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        result |= ret;</div><div class='add'>+        fprintf(stderr, "path based file operation failed\n");</div><div class='add'>+    } else {</div><div class='add'>+        fprintf(stdout, "path based file operation passed\n");</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dir_based_fops(strcat(filename, "_5"));</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        result |= ret;</div><div class='add'>+        fprintf(stderr, "directory based file operation failed\n");</div><div class='add'>+    } else {</div><div class='add'>+        fprintf(stdout, "directory based file operation passed\n");</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = link_based_fops(strcat(filename, "_5"));</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        result |= ret;</div><div class='add'>+        fprintf(stderr, "link based file operation failed\n");</div><div class='add'>+    } else {</div><div class='add'>+        fprintf(stdout, "link based file operation passed\n");</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = test_open_modes(strcat(filename, "_5"));</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        result |= ret;</div><div class='add'>+        fprintf(stderr, "testing modes of `open' call failed\n");</div><div class='add'>+    } else {</div><div class='add'>+        fprintf(stdout, "testing modes of `open' call passed\n");</div><div class='add'>+    }</div><div class='add'>+    return result;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* Execute all possible fops on a fd which is unlinked */</div><div class='add'>+int</div><div class='add'>+fd_based_fops_1(char *filename)</div><div class='add'>+{</div><div class='add'>+    int fd = 0;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int result = 0;</div><div class='add'>+    struct stat stbuf = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    char wstr[50] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    char rstr[50] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    fd = open(filename, O_RDWR | O_CREAT, OPEN_MODE);</div><div class='add'>+    if (fd &lt; 0) {</div><div class='add'>+        fprintf(stderr, "open failed : %s\n", strerror(errno));</div><div class='add'>+        return ret;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = unlink(filename);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(stderr, "unlink failed : %s\n", strerror(errno));</div><div class='add'>+        result |= ret;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    strcpy(wstr, "This is my string\n");</div><div class='add'>+    ret = write(fd, wstr, strlen(wstr));</div><div class='add'>+    if (ret &lt;= 0) {</div><div class='add'>+        fprintf(stderr, "write failed: %s\n", strerror(errno));</div><div class='add'>+        result |= ret;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = lseek(fd, 0, SEEK_SET);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(stderr, "lseek failed: %s\n", strerror(errno));</div><div class='add'>+        result |= ret;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = read(fd, rstr, strlen(wstr));</div><div class='add'>+    if (ret &lt;= 0) {</div><div class='add'>+        fprintf(stderr, "read failed: %s\n", strerror(errno));</div><div class='add'>+        result |= ret;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = memcmp(rstr, wstr, strlen(wstr));</div><div class='add'>+    if (ret != 0) {</div><div class='add'>+        fprintf(stderr, "read returning junk\n");</div><div class='add'>+        result |= ret;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = ftruncate(fd, 0);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(stderr, "ftruncate failed : %s\n", strerror(errno));</div><div class='add'>+        result |= ret;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = fstat(fd, &amp;stbuf);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(stderr, "fstat failed : %s\n", strerror(errno));</div><div class='add'>+        result |= ret;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = fsync(fd);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(stderr, "fsync failed : %s\n", strerror(errno));</div><div class='add'>+        result |= ret;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = fdatasync(fd);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(stderr, "fdatasync failed : %s\n", strerror(errno));</div><div class='add'>+        result |= ret;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /*</div><div class='add'>+     *      These metadata operations fail at the moment because kernel doesn't</div><div class='add'>+     *      pass the client fd in the operation.</div><div class='add'>+     *      The following bug tracks this change.</div><div class='add'>+     *      https://bugzilla.redhat.com/show_bug.cgi?id=1084422</div><div class='add'>+     *      ret = fchmod (fd, 0640);</div><div class='add'>+     *      if (ret &lt; 0) {</div><div class='add'>+     *              fprintf (stderr, "fchmod failed : %s\n", strerror (errno));</div><div class='add'>+     *              result |= ret;</div><div class='add'>+     *      }</div><div class='add'>+</div><div class='add'>+     *      ret = fchown (fd, 10001, 10001);</div><div class='add'>+     *      if (ret &lt; 0) {</div><div class='add'>+     *              fprintf (stderr, "fchown failed : %s\n", strerror (errno));</div><div class='add'>+     *              result |= ret;</div><div class='add'>+     *      }</div><div class='add'>+</div><div class='add'>+     *      ret = fsetxattr (fd, "trusted.xattr-test", "working", 8, 0);</div><div class='add'>+     *      if (ret &lt; 0) {</div><div class='add'>+     *              fprintf (stderr, "fsetxattr failed : %s\n", strerror</div><div class='add'>+     (errno));</div><div class='add'>+     *              result |= ret;</div><div class='add'>+     *      }</div><div class='add'>+</div><div class='add'>+     *      ret = flistxattr (fd, NULL, 0);</div><div class='add'>+     *      if (ret &lt;= 0) {</div><div class='add'>+     *              fprintf (stderr, "flistxattr failed : %s\n", strerror</div><div class='add'>+     (errno));</div><div class='add'>+     *              result |= ret;</div><div class='add'>+     *      }</div><div class='add'>+</div><div class='add'>+     *      ret = fgetxattr (fd, "trusted.xattr-test", NULL, 0);</div><div class='add'>+     *      if (ret &lt;= 0) {</div><div class='add'>+     *              fprintf (stderr, "fgetxattr failed : %s\n", strerror</div><div class='add'>+     (errno));</div><div class='add'>+     *              result |= ret;</div><div class='add'>+     *      }</div><div class='add'>+</div><div class='add'>+     *      ret = fremovexattr (fd, "trusted.xattr-test");</div><div class='add'>+     *      if (ret &lt; 0) {</div><div class='add'>+     *              fprintf (stderr, "fremovexattr failed : %s\n", strerror</div><div class='add'>+     (errno));</div><div class='add'>+     *              result |= ret;</div><div class='add'>+     *      }</div><div class='add'>+     */</div><div class='add'>+</div><div class='add'>+    if (fd)</div><div class='add'>+        close(fd);</div><div class='add'>+    return result;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+fd_based_fops_2(char *filename)</div><div class='add'>+{</div><div class='add'>+    int fd = 0;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int result = 0;</div><div class='add'>+    struct stat stbuf = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    char wstr[50] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    char rstr[50] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    fd = open(filename, O_RDWR | O_CREAT, OPEN_MODE);</div><div class='add'>+    if (fd &lt; 0) {</div><div class='add'>+        fprintf(stderr, "open failed : %s\n", strerror(errno));</div><div class='add'>+        return ret;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = ftruncate(fd, 0);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(stderr, "ftruncate failed : %s\n", strerror(errno));</div><div class='add'>+        result |= ret;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    strcpy(wstr, "This is my second string\n");</div><div class='add'>+    ret = write(fd, wstr, strlen(wstr));</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(stderr, "write failed: %s\n", strerror(errno));</div><div class='add'>+        result |= ret;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    lseek(fd, 0, SEEK_SET);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(stderr, "lseek failed: %s\n", strerror(errno));</div><div class='add'>+        result |= ret;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = read(fd, rstr, strlen(wstr));</div><div class='add'>+    if (ret &lt;= 0) {</div><div class='add'>+        fprintf(stderr, "read failed: %s\n", strerror(errno));</div><div class='add'>+        result |= ret;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = memcmp(rstr, wstr, strlen(wstr));</div><div class='add'>+    if (ret != 0) {</div><div class='add'>+        fprintf(stderr, "read returning junk\n");</div><div class='add'>+        result |= ret;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = fstat(fd, &amp;stbuf);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(stderr, "fstat failed : %s\n", strerror(errno));</div><div class='add'>+        result |= ret;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = fchmod(fd, 0640);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(stderr, "fchmod failed : %s\n", strerror(errno));</div><div class='add'>+        result |= ret;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = fchown(fd, 10001, 10001);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(stderr, "fchown failed : %s\n", strerror(errno));</div><div class='add'>+        result |= ret;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = fsync(fd);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(stderr, "fsync failed : %s\n", strerror(errno));</div><div class='add'>+        result |= ret;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = fsetxattr(fd, "trusted.xattr-test", "working", 8, 0);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(stderr, "fsetxattr failed : %s\n", strerror(errno));</div><div class='add'>+        result |= ret;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = fdatasync(fd);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(stderr, "fdatasync failed : %s\n", strerror(errno));</div><div class='add'>+        result |= ret;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = flistxattr(fd, NULL, 0);</div><div class='add'>+    if (ret &lt;= 0) {</div><div class='add'>+        fprintf(stderr, "flistxattr failed : %s\n", strerror(errno));</div><div class='add'>+        result |= ret;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = fgetxattr(fd, "trusted.xattr-test", NULL, 0);</div><div class='add'>+    if (ret &lt;= 0) {</div><div class='add'>+        fprintf(stderr, "fgetxattr failed : %s\n", strerror(errno));</div><div class='add'>+        result |= ret;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = fremovexattr(fd, "trusted.xattr-test");</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(stderr, "fremovexattr failed : %s\n", strerror(errno));</div><div class='add'>+        result |= ret;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (fd)</div><div class='add'>+        close(fd);</div><div class='add'>+    unlink(filename);</div><div class='add'>+</div><div class='add'>+    return result;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+path_based_fops(char *filename)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int fd = 0;</div><div class='add'>+    int result = 0;</div><div class='add'>+    struct stat stbuf = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    char newfilename[255] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    char *hardlink = "linkfile-hard.txt";</div><div class='add'>+    char *symlnk = "linkfile-soft.txt";</div><div class='add'>+    char buf[1024] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    fd = creat(filename, 0644);</div><div class='add'>+    if (fd &lt; 0) {</div><div class='add'>+        fprintf(stderr, "creat failed: %s\n", strerror(errno));</div><div class='add'>+        return ret;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = truncate(filename, 0);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(stderr, "truncate failed: %s\n", strerror(errno));</div><div class='add'>+        result |= ret;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = stat(filename, &amp;stbuf);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(stderr, "stat failed: %s\n", strerror(errno));</div><div class='add'>+        result |= ret;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = chmod(filename, 0640);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(stderr, "chmod failed: %s\n", strerror(errno));</div><div class='add'>+        result |= ret;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = chown(filename, 10001, 10001);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(stderr, "chown failed: %s\n", strerror(errno));</div><div class='add'>+        result |= ret;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = setxattr(filename, "trusted.xattr-test", "working", 8, 0);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(stderr, "setxattr failed: %s\n", strerror(errno));</div><div class='add'>+        result |= ret;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = listxattr(filename, NULL, 0);</div><div class='add'>+    if (ret &lt;= 0) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        fprintf(stderr, "listxattr failed: %s\n", strerror(errno));</div><div class='add'>+        result |= ret;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = getxattr(filename, "trusted.xattr-test", NULL, 0);</div><div class='add'>+    if (ret &lt;= 0) {</div><div class='add'>+        fprintf(stderr, "getxattr failed: %s\n", strerror(errno));</div><div class='add'>+        result |= ret;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = removexattr(filename, "trusted.xattr-test");</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(stderr, "removexattr failed: %s\n", strerror(errno));</div><div class='add'>+        result |= ret;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = access(filename, R_OK | W_OK);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(stderr, "access failed: %s\n", strerror(errno));</div><div class='add'>+        result |= ret;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = link(filename, hardlink);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(stderr, "link failed: %s\n", strerror(errno));</div><div class='add'>+        result |= ret;</div><div class='add'>+    }</div><div class='add'>+    unlink(hardlink);</div><div class='add'>+</div><div class='add'>+    ret = symlink(filename, symlnk);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(stderr, "symlink failed: %s\n", strerror(errno));</div><div class='add'>+        result |= ret;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = readlink(symlnk, buf, sizeof(buf));</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(stderr, "readlink failed: %s\n", strerror(errno));</div><div class='add'>+        result |= ret;</div><div class='add'>+    }</div><div class='add'>+    unlink(symlnk);</div><div class='add'>+</div><div class='add'>+    /* Create a character special file */</div><div class='add'>+    ret = mknod("cspecial", S_IFCHR | S_IRWXU | S_IRWXG, makedev(2, 3));</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(stderr, "cpsecial mknod failed: %s\n", strerror(errno));</div><div class='add'>+        result |= ret;</div><div class='add'>+    }</div><div class='add'>+    unlink("cspecial");</div><div class='add'>+</div><div class='add'>+    ret = mknod("bspecial", S_IFBLK | S_IRWXU | S_IRWXG, makedev(4, 5));</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(stderr, "bspecial mknod failed: %s\n", strerror(errno));</div><div class='add'>+        result |= ret;</div><div class='add'>+    }</div><div class='add'>+    unlink("bspecial");</div><div class='add'>+</div><div class='add'>+#ifdef linux</div><div class='add'>+    ret = mknod("fifo", S_IFIFO | S_IRWXU | S_IRWXG, 0);</div><div class='add'>+#else</div><div class='add'>+    ret = mkfifo("fifo", 0);</div><div class='add'>+#endif</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(stderr, "fifo mknod failed: %s\n", strerror(errno));</div><div class='add'>+        result |= ret;</div><div class='add'>+    }</div><div class='add'>+    unlink("fifo");</div><div class='add'>+</div><div class='add'>+#ifdef linux</div><div class='add'>+    ret = mknod("sock", S_IFSOCK | S_IRWXU | S_IRWXG, 0);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(stderr, "sock mknod failed: %s\n", strerror(errno));</div><div class='add'>+        result |= ret;</div><div class='add'>+    }</div><div class='add'>+#else</div><div class='add'>+    {</div><div class='add'>+        int s;</div><div class='add'>+        const char *pathname = "sock";</div><div class='add'>+        struct sockaddr_un addr;</div><div class='add'>+</div><div class='add'>+        s = socket(PF_LOCAL, SOCK_STREAM, 0);</div><div class='add'>+        memset(&amp;addr, 0, sizeof(addr));</div><div class='add'>+        strncpy(addr.sun_path, pathname, sizeof(addr.sun_path));</div><div class='add'>+        ret = bind(s, (const struct sockaddr *)&amp;addr, SUN_LEN(&amp;addr));</div><div class='add'>+        if (ret &lt; 0) {</div><div class='add'>+            fprintf(stderr, "fifo mknod failed: %s\n", strerror(errno));</div><div class='add'>+            result |= ret;</div><div class='add'>+        }</div><div class='add'>+        close(s);</div><div class='add'>+    }</div><div class='add'>+#endif</div><div class='add'>+    unlink("sock");</div><div class='add'>+</div><div class='add'>+    strcpy(newfilename, filename);</div><div class='add'>+    strcat(newfilename, "_new");</div><div class='add'>+    ret = rename(filename, newfilename);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(stderr, "rename failed: %s\n", strerror(errno));</div><div class='add'>+        result |= ret;</div><div class='add'>+    }</div><div class='add'>+    unlink(newfilename);</div><div class='add'>+</div><div class='add'>+    if (fd)</div><div class='add'>+        close(fd);</div><div class='add'>+</div><div class='add'>+    unlink(filename);</div><div class='add'>+    return result;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+dup_fd_based_fops(char *filename)</div><div class='add'>+{</div><div class='add'>+    int fd = 0;</div><div class='add'>+    int result = 0;</div><div class='add'>+    int newfd = 0;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    struct stat stbuf = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    char wstr[50] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    char rstr[50] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    fd = open(filename, O_RDWR | O_CREAT, OPEN_MODE);</div><div class='add'>+    if (fd &lt; 0) {</div><div class='add'>+        fprintf(stderr, "open failed : %s\n", strerror(errno));</div><div class='add'>+        return ret;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    newfd = dup(fd);</div><div class='add'>+    if (newfd &lt; 0) {</div><div class='add'>+        fprintf(stderr, "dup failed: %s\n", strerror(errno));</div><div class='add'>+        result |= ret;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    close(fd);</div><div class='add'>+</div><div class='add'>+    strcpy(wstr, "This is my string\n");</div><div class='add'>+    ret = write(newfd, wstr, strlen(wstr));</div><div class='add'>+    if (ret &lt;= 0) {</div><div class='add'>+        fprintf(stderr, "write failed: %s\n", strerror(errno));</div><div class='add'>+        result |= ret;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = lseek(newfd, 0, SEEK_SET);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(stderr, "lseek failed: %s\n", strerror(errno));</div><div class='add'>+        result |= ret;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = read(newfd, rstr, strlen(wstr));</div><div class='add'>+    if (ret &lt;= 0) {</div><div class='add'>+        fprintf(stderr, "read failed: %s\n", strerror(errno));</div><div class='add'>+        result |= ret;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = memcmp(rstr, wstr, strlen(wstr));</div><div class='add'>+    if (ret != 0) {</div><div class='add'>+        fprintf(stderr, "read returning junk\n");</div><div class='add'>+        result |= ret;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = ftruncate(newfd, 0);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(stderr, "ftruncate failed : %s\n", strerror(errno));</div><div class='add'>+        result |= ret;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = fstat(newfd, &amp;stbuf);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(stderr, "fstat failed : %s\n", strerror(errno));</div><div class='add'>+        result |= ret;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = fchmod(newfd, 0640);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(stderr, "fchmod failed : %s\n", strerror(errno));</div><div class='add'>+        result |= ret;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = fchown(newfd, 10001, 10001);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(stderr, "fchown failed : %s\n", strerror(errno));</div><div class='add'>+        result |= ret;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = fsync(newfd);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(stderr, "fsync failed : %s\n", strerror(errno));</div><div class='add'>+        result |= ret;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = fsetxattr(newfd, "trusted.xattr-test", "working", 8, 0);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(stderr, "fsetxattr failed : %s\n", strerror(errno));</div><div class='add'>+        result |= ret;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = fdatasync(newfd);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(stderr, "fdatasync failed : %s\n", strerror(errno));</div><div class='add'>+        result |= ret;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = flistxattr(newfd, NULL, 0);</div><div class='add'>+    if (ret &lt;= 0) {</div><div class='add'>+        fprintf(stderr, "flistxattr failed : %s\n", strerror(errno));</div><div class='add'>+        result |= ret;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = fgetxattr(newfd, "trusted.xattr-test", NULL, 0);</div><div class='add'>+    if (ret &lt;= 0) {</div><div class='add'>+        fprintf(stderr, "fgetxattr failed : %s\n", strerror(errno));</div><div class='add'>+        result |= ret;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = fremovexattr(newfd, "trusted.xattr-test");</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(stderr, "fremovexattr failed : %s\n", strerror(errno));</div><div class='add'>+        result |= ret;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (newfd)</div><div class='add'>+        close(newfd);</div><div class='add'>+    ret = unlink(filename);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(stderr, "unlink failed : %s\n", strerror(errno));</div><div class='add'>+        result |= ret;</div><div class='add'>+    }</div><div class='add'>+    return result;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+dir_based_fops(char *dirname)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int result = 0;</div><div class='add'>+    DIR *dp = NULL;</div><div class='add'>+    char buff[255] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    struct dirent *dbuff = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    struct stat stbuff = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    char newdname[255] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    char *cwd = NULL;</div><div class='add'>+</div><div class='add'>+    ret = mkdir(dirname, 0755);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(stderr, "mkdir failed: %s\n", strerror(errno));</div><div class='add'>+        return ret;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    dp = opendir(dirname);</div><div class='add'>+    if (dp == NULL) {</div><div class='add'>+        fprintf(stderr, "opendir failed: %s\n", strerror(errno));</div><div class='add'>+        result |= ret;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    dbuff = readdir(dp);</div><div class='add'>+    if (NULL == dbuff) {</div><div class='add'>+        fprintf(stderr, "readdir failed: %s\n", strerror(errno));</div><div class='add'>+        result |= ret;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = closedir(dp);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(stderr, "closedir failed: %s\n", strerror(errno));</div><div class='add'>+        result |= ret;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = stat(dirname, &amp;stbuff);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(stderr, "stat failed: %s\n", strerror(errno));</div><div class='add'>+        result |= ret;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = chmod(dirname, 0744);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(stderr, "chmod failed: %s\n", strerror(errno));</div><div class='add'>+        result |= ret;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = chown(dirname, 10001, 10001);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(stderr, "chmod failed: %s\n", strerror(errno));</div><div class='add'>+        result |= ret;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = setxattr(dirname, "trusted.xattr-test", "working", 8, 0);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(stderr, "setxattr failed: %s\n", strerror(errno));</div><div class='add'>+        result |= ret;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = listxattr(dirname, NULL, 0);</div><div class='add'>+    if (ret &lt;= 0) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        fprintf(stderr, "listxattr failed: %s\n", strerror(errno));</div><div class='add'>+        result |= ret;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = getxattr(dirname, "trusted.xattr-test", NULL, 0);</div><div class='add'>+    if (ret &lt;= 0) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        fprintf(stderr, "getxattr failed: %s\n", strerror(errno));</div><div class='add'>+        result |= ret;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = removexattr(dirname, "trusted.xattr-test");</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(stderr, "removexattr failed: %s\n", strerror(errno));</div><div class='add'>+        result |= ret;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    strcpy(newdname, dirname);</div><div class='add'>+    strcat(newdname, "/../");</div><div class='add'>+    ret = chdir(newdname);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(stderr, "chdir failed: %s\n", strerror(errno));</div><div class='add'>+        result |= ret;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    cwd = getcwd(buff, 255);</div><div class='add'>+    if (NULL == cwd) {</div><div class='add'>+        fprintf(stderr, "getcwd failed: %s\n", strerror(errno));</div><div class='add'>+        result |= ret;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    strcpy(newdname, dirname);</div><div class='add'>+    strcat(newdname, "new");</div><div class='add'>+    ret = rename(dirname, newdname);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(stderr, "rename failed: %s\n", strerror(errno));</div><div class='add'>+        result |= ret;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = rmdir(newdname);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(stderr, "rmdir failed: %s\n", strerror(errno));</div><div class='add'>+        result |= ret;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    rmdir(dirname);</div><div class='add'>+    return result;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+link_based_fops(char *filename)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int result = 0;</div><div class='add'>+    int fd = 0;</div><div class='add'>+    char newname[255] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    char linkname[255] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    struct stat lstbuf = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    fd = creat(filename, 0644);</div><div class='add'>+    if (fd &lt; 0) {</div><div class='add'>+        fd = 0;</div><div class='add'>+        fprintf(stderr, "creat failed: %s\n", strerror(errno));</div><div class='add'>+        return ret;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    strcpy(newname, filename);</div><div class='add'>+    strcat(newname, "_hlink");</div><div class='add'>+    ret = link(filename, newname);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(stderr, "link failed: %s\n", strerror(errno));</div><div class='add'>+        result |= ret;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = unlink(filename);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(stderr, "unlink failed: %s\n", strerror(errno));</div><div class='add'>+        result |= ret;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    strcpy(linkname, filename);</div><div class='add'>+    strcat(linkname, "_slink");</div><div class='add'>+    ret = symlink(newname, linkname);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(stderr, "symlink failed: %s\n", strerror(errno));</div><div class='add'>+        result |= ret;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = lstat(linkname, &amp;lstbuf);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(stderr, "lstbuf failed: %s\n", strerror(errno));</div><div class='add'>+        result |= ret;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = lchown(linkname, 10001, 10001);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(stderr, "lchown failed: %s\n", strerror(errno));</div><div class='add'>+        result |= ret;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = lsetxattr(linkname, "trusted.lxattr-test", "working", 8, 0);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(stderr, "lsetxattr failed: %s\n", strerror(errno));</div><div class='add'>+        result |= ret;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = llistxattr(linkname, NULL, 0);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        fprintf(stderr, "llistxattr failed: %s\n", strerror(errno));</div><div class='add'>+        result |= ret;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = lgetxattr(linkname, "trusted.lxattr-test", NULL, 0);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        fprintf(stderr, "lgetxattr failed: %s\n", strerror(errno));</div><div class='add'>+        result |= ret;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = lremovexattr(linkname, "trusted.lxattr-test");</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(stderr, "lremovexattr failed: %s\n", strerror(errno));</div><div class='add'>+        result |= ret;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (fd)</div><div class='add'>+        close(fd);</div><div class='add'>+    unlink(linkname);</div><div class='add'>+    unlink(newname);</div><div class='add'>+    return result;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+test_open_modes(char *filename)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int result = 0;</div><div class='add'>+</div><div class='add'>+    ret = generic_open_read_write(filename, O_CREAT | O_WRONLY, OPEN_MODE);</div><div class='add'>+    if (ret != 0) {</div><div class='add'>+        fprintf(stderr, "flag O_CREAT|O_WRONLY failed: \n");</div><div class='add'>+        result |= ret;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = generic_open_read_write(filename, O_CREAT | O_RDWR, OPEN_MODE);</div><div class='add'>+    if (ret != 0) {</div><div class='add'>+        fprintf(stderr, "flag O_CREAT|O_RDWR failed\n");</div><div class='add'>+        result |= ret;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = generic_open_read_write(filename, O_CREAT | O_RDONLY, OPEN_MODE);</div><div class='add'>+    if (ret != 0) {</div><div class='add'>+        fprintf(stderr, "flag O_CREAT|O_RDONLY failed\n");</div><div class='add'>+        result |= ret;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = creat(filename, 0644);</div><div class='add'>+    close(ret);</div><div class='add'>+    ret = generic_open_read_write(filename, O_WRONLY, 0);</div><div class='add'>+    if (ret != 0) {</div><div class='add'>+        fprintf(stderr, "flag O_WRONLY failed\n");</div><div class='add'>+        result |= ret;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = creat(filename, 0644);</div><div class='add'>+    close(ret);</div><div class='add'>+    ret = generic_open_read_write(filename, O_RDWR, 0);</div><div class='add'>+    if (0 != ret) {</div><div class='add'>+        fprintf(stderr, "flag O_RDWR failed\n");</div><div class='add'>+        result |= ret;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = creat(filename, 0644);</div><div class='add'>+    close(ret);</div><div class='add'>+    ret = generic_open_read_write(filename, O_RDONLY, 0);</div><div class='add'>+    if (0 != ret) {</div><div class='add'>+        fprintf(stderr, "flag O_RDONLY failed\n");</div><div class='add'>+        result |= ret;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = creat(filename, 0644);</div><div class='add'>+    close(ret);</div><div class='add'>+    ret = generic_open_read_write(filename, O_TRUNC | O_WRONLY, 0);</div><div class='add'>+    if (0 != ret) {</div><div class='add'>+        fprintf(stderr, "flag O_TRUNC|O_WRONLY failed\n");</div><div class='add'>+        result |= ret;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+#if 0 /* undefined behaviour, unable to reliably test */</div><div class='add'>+        ret = creat (filename, 0644);</div><div class='add'>+        close (ret);</div><div class='add'>+        ret = generic_open_read_write (filename, O_TRUNC|O_RDONLY, 0);</div><div class='add'>+        if (0 != ret) {</div><div class='add'>+               fprintf (stderr, "flag O_TRUNC|O_RDONLY failed\n");</div><div class='add'>+               result |= ret;</div><div class='add'>+        }</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+    ret = generic_open_read_write(filename, O_CREAT | O_RDWR | O_SYNC,</div><div class='add'>+                                  OPEN_MODE);</div><div class='add'>+    if (0 != ret) {</div><div class='add'>+        fprintf(stderr, "flag O_CREAT|O_RDWR|O_SYNC failed\n");</div><div class='add'>+        result |= ret;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = creat(filename, 0644);</div><div class='add'>+    close(ret);</div><div class='add'>+    ret = generic_open_read_write(filename, O_CREAT | O_EXCL, OPEN_MODE);</div><div class='add'>+    if (0 != ret) {</div><div class='add'>+        fprintf(stderr, "flag O_CREAT|O_EXCL failed\n");</div><div class='add'>+        result |= ret;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return result;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+generic_open_read_write(char *filename, int flag, mode_t mode)</div><div class='add'>+{</div><div class='add'>+    int fd = 0;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    char wstring[50] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    char rstring[50] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    fd = open(filename, flag, mode);</div><div class='add'>+    if (fd &lt; 0) {</div><div class='add'>+        if (flag == (O_CREAT | O_EXCL) &amp;&amp; errno == EEXIST) {</div><div class='add'>+            unlink(filename);</div><div class='add'>+            return 0;</div><div class='add'>+        } else {</div><div class='add'>+            fprintf(stderr, "open failed: %s\n", strerror(errno));</div><div class='add'>+            return -1;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    strcpy(wstring, "My string to write\n");</div><div class='add'>+    ret = write(fd, wstring, strlen(wstring));</div><div class='add'>+    if (ret &lt;= 0) {</div><div class='add'>+        if (errno != EBADF) {</div><div class='add'>+            fprintf(stderr, "write failed: %s\n", strerror(errno));</div><div class='add'>+            close(fd);</div><div class='add'>+            unlink(filename);</div><div class='add'>+            return ret;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = lseek(fd, 0, SEEK_SET);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        close(fd);</div><div class='add'>+        unlink(filename);</div><div class='add'>+        return ret;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = read(fd, rstring, strlen(wstring));</div><div class='add'>+    if (ret &lt; 0 &amp;&amp; flag != (O_CREAT | O_WRONLY) &amp;&amp; flag != O_WRONLY &amp;&amp;</div><div class='add'>+        flag != (O_TRUNC | O_WRONLY)) {</div><div class='add'>+        close(fd);</div><div class='add'>+        unlink(filename);</div><div class='add'>+        return ret;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Compare the rstring with wstring. But we do not want to return</div><div class='add'>+     * error when the flag is either O_RDONLY, O_CREAT|O_RDONLY or</div><div class='add'>+     * O_TRUNC|O_RDONLY. Because in that case we are not writing</div><div class='add'>+     * anything to the file.*/</div><div class='add'>+</div><div class='add'>+    ret = memcmp(wstring, rstring, strlen(wstring));</div><div class='add'>+    if (0 != ret &amp;&amp; flag != (O_TRUNC | O_WRONLY) &amp;&amp; flag != O_WRONLY &amp;&amp;</div><div class='add'>+        flag != (O_CREAT | O_WRONLY) &amp;&amp;</div><div class='add'>+        !(flag == (O_CREAT | O_RDONLY) || flag == O_RDONLY ||</div><div class='add'>+          flag == (O_TRUNC | O_RDONLY))) {</div><div class='add'>+        fprintf(stderr, "read is returning junk\n");</div><div class='add'>+        close(fd);</div><div class='add'>+        unlink(filename);</div><div class='add'>+        return ret;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    close(fd);</div><div class='add'>+    unlink(filename);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='head'>diff --git a/tests/basic/fops-sanity.t b/tests/basic/fops-sanity.t<br/>new file mode 100755<br/>index 00000000000..8962f3a2fba<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/fops-sanity.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/fops-sanity.t</a></div><div class='hunk'>@@ -0,0 +1,27 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../include.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume info;</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/brick1;</div><div class='add'>+EXPECT 'Created' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+EXPECT 'Started' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+#mount on a random dir</div><div class='add'>+TEST glusterfs --entry-timeout=3600 --attribute-timeout=3600 -s $H0 --volfile-id=$V0 $M0 --direct-io-mode=yes</div><div class='add'>+</div><div class='add'>+build_tester $(dirname $0)/fops-sanity.c</div><div class='add'>+</div><div class='add'>+TEST cp $(dirname $0)/fops-sanity $M0</div><div class='add'>+cd $M0</div><div class='add'>+TEST ./fops-sanity $V0</div><div class='add'>+cd -</div><div class='add'>+TEST rm -f $(dirname $0)/fops-sanity</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/basic/fuse/Makefile b/tests/basic/fuse/Makefile<br/>new file mode 100644<br/>index 00000000000..c446d253228<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/fuse/Makefile?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/fuse/Makefile</a></div><div class='hunk'>@@ -0,0 +1,12 @@</div><div class='add'>+CFLAGS   = -Wall -g</div><div class='add'>+LDFLAGS  =</div><div class='add'>+</div><div class='add'>+BINARIES = seek</div><div class='add'>+</div><div class='add'>+%: %.c</div><div class='add'>+	$(CC) $(CFLAGS) $(LDFLAGS) -o $@ $^</div><div class='add'>+</div><div class='add'>+all: $(BINARIES)</div><div class='add'>+</div><div class='add'>+clean:</div><div class='add'>+	-$(RM) $(BINARIES)</div><div class='head'>diff --git a/tests/basic/fuse/active-io-graph-switch.t b/tests/basic/fuse/active-io-graph-switch.t<br/>new file mode 100644<br/>index 00000000000..6ec3e1fcbfa<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/fuse/active-io-graph-switch.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/fuse/active-io-graph-switch.t</a></div><div class='hunk'>@@ -0,0 +1,65 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+TESTS_EXPECTED_IN_LOOP=12</div><div class='add'>+</div><div class='add'>+function perform_io_on_mount {</div><div class='add'>+    local m="$1"</div><div class='add'>+    local f="$2"</div><div class='add'>+    local lockfile="$3"</div><div class='add'>+    while [ -f "$m/$lockfile" ];</div><div class='add'>+    do</div><div class='add'>+        dd if=/dev/zero of=$m/$f bs=1M count=1</div><div class='add'>+    done</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function perform_graph_switch {</div><div class='add'>+    for i in {1..3}</div><div class='add'>+    do</div><div class='add'>+        TEST_IN_LOOP $CLI volume set $V0 performance.stat-prefetch off</div><div class='add'>+        sleep 3</div><div class='add'>+        TEST_IN_LOOP $CLI volume set $V0 performance.stat-prefetch on</div><div class='add'>+        sleep 3</div><div class='add'>+    done</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function count_files {</div><div class='add'>+    ls $M0 | wc -l</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 replica 3 $H0:$B0/${V0}{0,1,2}</div><div class='add'>+TEST $CLI volume set $V0 flush-behind off</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+TEST $GFS --volfile-id=/$V0 --volfile-server=$H0 $M0</div><div class='add'>+TEST touch $M0/lock</div><div class='add'>+for i in {1..100}; do perform_io_on_mount $M0 $i lock &amp; done</div><div class='add'>+EXPECT_WITHIN 5 "101" count_files</div><div class='add'>+</div><div class='add'>+perform_graph_switch</div><div class='add'>+TEST rm -f $M0/lock</div><div class='add'>+wait</div><div class='add'>+EXPECT "100" count_files</div><div class='add'>+TEST rm -f $M0/{1..100}</div><div class='add'>+EXPECT "0" count_files</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+</div><div class='add'>+#Repeat the tests with reader-thread-count</div><div class='add'>+TEST $GFS --reader-thread-count=10 --volfile-id=/$V0 --volfile-server=$H0 $M0</div><div class='add'>+TEST touch $M0/lock</div><div class='add'>+for i in {1..100}; do perform_io_on_mount $M0 $i lock &amp; done</div><div class='add'>+EXPECT_WITHIN 5 "101" count_files</div><div class='add'>+</div><div class='add'>+perform_graph_switch</div><div class='add'>+TEST rm -f $M0/lock</div><div class='add'>+wait</div><div class='add'>+EXPECT "100" count_files</div><div class='add'>+TEST rm -f $M0/{1..100}</div><div class='add'>+EXPECT "0" count_files</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/basic/fuse/seek.c b/tests/basic/fuse/seek.c<br/>new file mode 100644<br/>index 00000000000..30943ad0f33<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/fuse/seek.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/fuse/seek.c</a></div><div class='hunk'>@@ -0,0 +1,82 @@</div><div class='add'>+/* seek.c - use lseek() to find holes in a file</div><div class='add'>+ *</div><div class='add'>+ * Author: Niels de Vos &lt;ndevos@redhat.com&gt;</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+/* needed for SEEK_HOLE/SEEK_DATA */</div><div class='add'>+#ifndef _GNU_SOURCE</div><div class='add'>+#define _GNU_SOURCE</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#include &lt;sys/types.h&gt;</div><div class='add'>+#include &lt;sys/stat.h&gt;</div><div class='add'>+#include &lt;fcntl.h&gt;</div><div class='add'>+#include &lt;errno.h&gt;</div><div class='add'>+#include &lt;stdio.h&gt;</div><div class='add'>+#include &lt;stdlib.h&gt;</div><div class='add'>+#include &lt;unistd.h&gt;</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+main(int argc, char **argv)</div><div class='add'>+{</div><div class='add'>+    int ret = EXIT_SUCCESS;</div><div class='add'>+    int fd = -1;</div><div class='add'>+    char *filename = NULL;</div><div class='add'>+    struct stat st = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    off_t hole_start = 0;</div><div class='add'>+    off_t hole_end = 0;</div><div class='add'>+</div><div class='add'>+    if (argc != 2) {</div><div class='add'>+        fprintf(stderr, "Invalid argument, use %s &lt;file&gt;\n", argv[0]);</div><div class='add'>+        return EXIT_FAILURE;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    filename = argv[1];</div><div class='add'>+</div><div class='add'>+    fd = open(filename, O_RDONLY);</div><div class='add'>+    if (fd &lt;= 0) {</div><div class='add'>+        perror("open");</div><div class='add'>+        return EXIT_FAILURE;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (fstat(fd, &amp;st)) {</div><div class='add'>+        perror("fstat");</div><div class='add'>+        return EXIT_FAILURE;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    while (hole_end &lt; st.st_size) {</div><div class='add'>+        hole_start = lseek(fd, hole_end, SEEK_HOLE);</div><div class='add'>+        if (hole_start == -1 &amp;&amp; errno == ENXIO) {</div><div class='add'>+            /* no more holes */</div><div class='add'>+            break;</div><div class='add'>+        } else if (hole_start == -1 &amp;&amp; errno == ENOTSUP) {</div><div class='add'>+            /* SEEK_HOLE is not supported */</div><div class='add'>+            perror("lseek(SEEK_HOLE)");</div><div class='add'>+            ret = EXIT_FAILURE;</div><div class='add'>+            break;</div><div class='add'>+        } else if (hole_start == -1) {</div><div class='add'>+            perror("no more holes");</div><div class='add'>+            break;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        hole_end = lseek(fd, hole_start, SEEK_DATA);</div><div class='add'>+        if (hole_end == -1 &amp;&amp; errno == ENXIO) {</div><div class='add'>+            /* no more data */</div><div class='add'>+            break;</div><div class='add'>+        } else if (hole_end == -1 &amp;&amp; errno == ENOTSUP) {</div><div class='add'>+            /* SEEK_DATA is not supported */</div><div class='add'>+            perror("lseek(SEEK_DATA)");</div><div class='add'>+            ret = EXIT_FAILURE;</div><div class='add'>+            break;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        printf("HOLE found: %ld - %ld%s\n", hole_start, hole_end,</div><div class='add'>+               (hole_end == st.st_size) ? " (EOF)" : "");</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    close(fd);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='head'>diff --git a/tests/basic/geo-replication/marker-xattrs.t b/tests/basic/geo-replication/marker-xattrs.t<br/>new file mode 100755<br/>index 00000000000..7e5ea8eebec<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/geo-replication/marker-xattrs.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/geo-replication/marker-xattrs.t</a></div><div class='hunk'>@@ -0,0 +1,80 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+</div><div class='add'>+## Start and create a replicated volume</div><div class='add'>+TEST $CLI volume create $V0 replica 3 $H0:$B0/${V0}-{0,1,2,3,4,5}</div><div class='add'>+</div><div class='add'>+TEST $CLI volume set $V0 indexing on</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+</div><div class='add'>+## Mount native</div><div class='add'>+TEST glusterfs --volfile-server=$H0 --volfile-id=$V0 $M0</div><div class='add'>+</div><div class='add'>+## Mount client-pid=-1</div><div class='add'>+TEST glusterfs --volfile-server=$H0 --volfile-id=$V0 --client-pid=-1 $M1</div><div class='add'>+</div><div class='add'>+TEST touch $M0</div><div class='add'>+</div><div class='add'>+vol_uuid=$(get_volume_mark $M1)</div><div class='add'>+xtime=trusted.glusterfs.$vol_uuid.xtime</div><div class='add'>+</div><div class='add'>+TEST "getfattr -n $xtime $B0/${V0}-1 | grep -q ${xtime}="</div><div class='add'>+</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}-0</div><div class='add'>+</div><div class='add'>+TEST "getfattr -n $xtime $B0/${V0}-1 | grep -q ${xtime}="</div><div class='add'>+</div><div class='add'>+TEST getfattr -d -m. -e hex $M1</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M1</div><div class='add'>+</div><div class='add'>+TEST $CLI volume stop $V0;</div><div class='add'>+TEST $CLI volume delete $V0;</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+## Start and create a disperse volume</div><div class='add'>+TEST $CLI volume create $V0 disperse 3 redundancy 1 $H0:$B0/${V0}-{0,1,2}</div><div class='add'>+</div><div class='add'>+TEST $CLI volume set $V0 indexing on</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+</div><div class='add'>+## Mount native</div><div class='add'>+TEST glusterfs --volfile-server=$H0 --volfile-id=$V0 $M0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "3" mount_get_option_value $M0 $V0-disperse-0 childs_up</div><div class='add'>+</div><div class='add'>+## Mount client-pid=-1</div><div class='add'>+TEST glusterfs --volfile-server=$H0 --volfile-id=$V0 --client-pid=-1 $M1</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "3" mount_get_option_value $M1 $V0-disperse-0 childs_up</div><div class='add'>+</div><div class='add'>+TEST touch $M0</div><div class='add'>+</div><div class='add'>+vol_uuid=$(get_volume_mark $M1)</div><div class='add'>+xtime=trusted.glusterfs.$vol_uuid.xtime</div><div class='add'>+stime=trusted.glusterfs.$vol_uuid.stime</div><div class='add'>+</div><div class='add'>+stime_val=$(getfattr -e hex -n $xtime $B0/${V0}-1 | grep ${xtime}= | cut -f2 -d'=')</div><div class='add'>+TEST "setfattr -n $stime -v $stime_val $B0/${V0}-1"</div><div class='add'>+TEST "getfattr -n $xtime $B0/${V0}-1 | grep -q ${xtime}="</div><div class='add'>+</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}-0</div><div class='add'>+</div><div class='add'>+TEST "getfattr -n $xtime $B0/${V0}-1 | grep -q ${xtime}="</div><div class='add'>+TEST "getfattr -n $stime $M1 | grep -q ${stime}="</div><div class='add'>+</div><div class='add'>+TEST getfattr -d -m. -e hex $M1</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M1</div><div class='add'>+</div><div class='add'>+TEST $CLI volume stop $V0;</div><div class='add'>+TEST $CLI volume delete $V0;</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/basic/gfapi/Makefile b/tests/basic/gfapi/Makefile<br/>new file mode 100644<br/>index 00000000000..1c5cf03ca3d<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/gfapi/Makefile?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/gfapi/Makefile</a></div><div class='hunk'>@@ -0,0 +1,22 @@</div><div class='add'>+## compiles against the *system* version of libgfapi,</div><div class='add'>+## but not the libgfapi for the testcases</div><div class='add'>+</div><div class='add'>+CFLAGS   = -Wall -g $(shell pkg-config --cflags glusterfs-api)</div><div class='add'>+LDFLAGS  = $(shell pkg-config --libs glusterfs-api)</div><div class='add'>+</div><div class='add'>+BINARIES = upcall-cache-invalidate libgfapi-fini-hang anonymous_fd seek \</div><div class='add'>+	bug1283983 bug1291259 gfapi-ssl-test gfapi-load-volfile \</div><div class='add'>+        mandatory-lock-optimal</div><div class='add'>+</div><div class='add'>+%: %.c</div><div class='add'>+	$(CC) $(CFLAGS) $(LDFLAGS) -o $@ $^</div><div class='add'>+</div><div class='add'>+all: check-pkgconfig $(BINARIES)</div><div class='add'>+</div><div class='add'>+clean:</div><div class='add'>+	-$(RM) $(BINARIES)</div><div class='add'>+</div><div class='add'>+.phony: check-pkgconfig</div><div class='add'>+</div><div class='add'>+check-pkgconfig:</div><div class='add'>+	pkg-config --exists glusterfs-api</div><div class='head'>diff --git a/tests/basic/gfapi/anonymous_fd.t b/tests/basic/gfapi/anonymous_fd.t<br/>new file mode 100755<br/>index 00000000000..bc0fb0fa2f0<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/gfapi/anonymous_fd.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/gfapi/anonymous_fd.t</a></div><div class='hunk'>@@ -0,0 +1,26 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/brick1;</div><div class='add'>+EXPECT 'Created' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+EXPECT 'Started' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+logdir=`gluster --print-logdir`</div><div class='add'>+</div><div class='add'>+TEST build_tester $(dirname $0)/anonymous_fd_read_write.c -lgfapi -o $(dirname $0)/anonymous_fd</div><div class='add'>+TEST ./$(dirname $0)/anonymous_fd $H0 $V0  $logdir/anonymous_fd.log</div><div class='add'>+</div><div class='add'>+cleanup_tester $(dirname $0)/anonymous_fd</div><div class='add'>+</div><div class='add'>+TEST $CLI volume stop $V0</div><div class='add'>+TEST $CLI volume delete $V0</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/basic/gfapi/anonymous_fd_read_write.c b/tests/basic/gfapi/anonymous_fd_read_write.c<br/>new file mode 100644<br/>index 00000000000..fc276ca4310<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/gfapi/anonymous_fd_read_write.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/gfapi/anonymous_fd_read_write.c</a></div><div class='hunk'>@@ -0,0 +1,106 @@</div><div class='add'>+#include &lt;fcntl.h&gt;</div><div class='add'>+#include &lt;unistd.h&gt;</div><div class='add'>+#include &lt;time.h&gt;</div><div class='add'>+#include &lt;limits.h&gt;</div><div class='add'>+#include &lt;string.h&gt;</div><div class='add'>+#include &lt;stdio.h&gt;</div><div class='add'>+#include &lt;stdlib.h&gt;</div><div class='add'>+#include &lt;errno.h&gt;</div><div class='add'>+#include &lt;glusterfs/api/glfs.h&gt;</div><div class='add'>+#include &lt;glusterfs/api/glfs-handles.h&gt;</div><div class='add'>+</div><div class='add'>+#define LOG_ERR(func, ret)                                                     \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        if (ret != 0) {                                                        \</div><div class='add'>+            fprintf(stderr, "%s : returned error %d (%s)\n", func, ret,        \</div><div class='add'>+                    strerror(errno));                                          \</div><div class='add'>+            goto out;                                                          \</div><div class='add'>+        } else {                                                               \</div><div class='add'>+            fprintf(stderr, "%s : returned %d\n", func, ret);                  \</div><div class='add'>+        }                                                                      \</div><div class='add'>+    } while (0)</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+main(int argc, char *argv[])</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+    glfs_t *fs = NULL;</div><div class='add'>+    struct glfs_object *root = NULL, *file_obj = NULL;</div><div class='add'>+    struct stat sb = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    char readbuf[32], writebuf[32];</div><div class='add'>+    char *filename = "file.txt";</div><div class='add'>+    char *logfile = NULL;</div><div class='add'>+    char *volname = NULL;</div><div class='add'>+    char *hostname = NULL;</div><div class='add'>+</div><div class='add'>+    if (argc != 4) {</div><div class='add'>+        fprintf(stderr, "Invalid argument\n");</div><div class='add'>+        exit(1);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    hostname = argv[1];</div><div class='add'>+    volname = argv[2];</div><div class='add'>+    logfile = argv[3];</div><div class='add'>+</div><div class='add'>+    fs = glfs_new(volname);</div><div class='add'>+    if (!fs) {</div><div class='add'>+        fprintf(stderr, "glfs_new: returned NULL\n");</div><div class='add'>+        ret = -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = glfs_set_volfile_server(fs, "tcp", hostname, 24007);</div><div class='add'>+    LOG_ERR("glfs_set_volfile_server", ret);</div><div class='add'>+</div><div class='add'>+    ret = glfs_set_logging(fs, logfile, 7);</div><div class='add'>+    LOG_ERR("glfs_set_logging", ret);</div><div class='add'>+</div><div class='add'>+    ret = glfs_init(fs);</div><div class='add'>+    LOG_ERR("glfs_init", ret);</div><div class='add'>+</div><div class='add'>+    root = glfs_h_lookupat(fs, NULL, "/", &amp;sb, 0);</div><div class='add'>+    if (root == NULL) {</div><div class='add'>+        fprintf(stderr, "glfs_h_lookupat: error on lookup of / ,%s\n",</div><div class='add'>+                strerror(errno));</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    file_obj = glfs_h_creat(fs, root, filename, O_CREAT, 0644, &amp;sb);</div><div class='add'>+    if (file_obj == NULL) {</div><div class='add'>+        fprintf(stderr, "glfs_h_creat: error on create of %s: from (%p),%s\n",</div><div class='add'>+                filename, root, strerror(errno));</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* test read/write based on anonymous fd */</div><div class='add'>+    memcpy(writebuf, "abcdefghijklmnopqrstuvwxyz012345", 32);</div><div class='add'>+</div><div class='add'>+    ret = glfs_h_anonymous_write(fs, file_obj, writebuf, 32, 0);</div><div class='add'>+    if (ret &lt; 0)</div><div class='add'>+        LOG_ERR("glfs_h_anonymous_write", ret);</div><div class='add'>+</div><div class='add'>+    ret = glfs_h_anonymous_read(fs, file_obj, readbuf, 32, 0);</div><div class='add'>+    if (ret &lt; 0)</div><div class='add'>+        LOG_ERR("glfs_h_anonymous_read", ret);</div><div class='add'>+</div><div class='add'>+    if (memcmp(readbuf, writebuf, 32)) {</div><div class='add'>+        fprintf(stderr, "Failed to read what I wrote: %s %s\n", readbuf,</div><div class='add'>+                writebuf);</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+out:</div><div class='add'>+    if (file_obj)</div><div class='add'>+        glfs_h_close(file_obj);</div><div class='add'>+</div><div class='add'>+    if (fs) {</div><div class='add'>+        ret = glfs_fini(fs);</div><div class='add'>+        fprintf(stderr, "glfs_fini(fs) returned %d \n", ret);</div><div class='add'>+    }</div><div class='add'>+    if (ret)</div><div class='add'>+        exit(1);</div><div class='add'>+    exit(0);</div><div class='add'>+}</div><div class='head'>diff --git a/tests/basic/gfapi/bug-1241104.c b/tests/basic/gfapi/bug-1241104.c<br/>new file mode 100644<br/>index 00000000000..78c87595a71<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/gfapi/bug-1241104.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/gfapi/bug-1241104.c</a></div><div class='hunk'>@@ -0,0 +1,93 @@</div><div class='add'>+#include &lt;fcntl.h&gt;</div><div class='add'>+#include &lt;unistd.h&gt;</div><div class='add'>+#include &lt;time.h&gt;</div><div class='add'>+#include &lt;limits.h&gt;</div><div class='add'>+#include &lt;string.h&gt;</div><div class='add'>+#include &lt;stdio.h&gt;</div><div class='add'>+#include &lt;stdlib.h&gt;</div><div class='add'>+#include &lt;errno.h&gt;</div><div class='add'>+#include &lt;glusterfs/api/glfs.h&gt;</div><div class='add'>+#include &lt;glusterfs/api/glfs-handles.h&gt;</div><div class='add'>+#include &lt;sys/wait.h&gt;</div><div class='add'>+</div><div class='add'>+int gfapi = 1;</div><div class='add'>+</div><div class='add'>+#define LOG_ERR(func, ret)                                                     \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        if (ret != 0) {                                                        \</div><div class='add'>+            fprintf(stderr, "%s : returned error %d (%s)\n", func, ret,        \</div><div class='add'>+                    strerror(errno));                                          \</div><div class='add'>+            goto out;                                                          \</div><div class='add'>+        } else {                                                               \</div><div class='add'>+            fprintf(stderr, "%s : returned %d\n", func, ret);                  \</div><div class='add'>+        }                                                                      \</div><div class='add'>+    } while (0)</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+main(int argc, char *argv[])</div><div class='add'>+{</div><div class='add'>+    glfs_t *fs = NULL;</div><div class='add'>+    int ret = 0, i, status = 0;</div><div class='add'>+    glfs_fd_t *fd = NULL;</div><div class='add'>+    char *filename = "file_tmp";</div><div class='add'>+    char *volname = NULL;</div><div class='add'>+    char *logfile = NULL;</div><div class='add'>+    char *hostname = NULL;</div><div class='add'>+    struct flock lock = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    if (argc != 4) {</div><div class='add'>+        fprintf(stderr, "Invalid argument\n");</div><div class='add'>+        exit(1);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    hostname = argv[1];</div><div class='add'>+    volname = argv[2];</div><div class='add'>+    logfile = argv[3];</div><div class='add'>+</div><div class='add'>+    fs = glfs_new(volname);</div><div class='add'>+    if (!fs) {</div><div class='add'>+        fprintf(stderr, "glfs_new: returned NULL\n");</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = glfs_set_volfile_server(fs, "tcp", hostname, 24007);</div><div class='add'>+    LOG_ERR("glfs_set_volfile_server", ret);</div><div class='add'>+</div><div class='add'>+    ret = glfs_set_logging(fs, logfile, 7);</div><div class='add'>+    LOG_ERR("glfs_set_logging", ret);</div><div class='add'>+</div><div class='add'>+    ret = glfs_init(fs);</div><div class='add'>+    LOG_ERR("glfs_init", ret);</div><div class='add'>+</div><div class='add'>+    fd = glfs_creat(fs, filename, O_RDWR | O_SYNC, 0644);</div><div class='add'>+    if (fd &lt;= 0) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        LOG_ERR("glfs_creat", ret);</div><div class='add'>+    }</div><div class='add'>+    fprintf(stderr, "glfs-create fd - %d\n", fd);</div><div class='add'>+</div><div class='add'>+    /* validate locks for negative range */</div><div class='add'>+    lock.l_type = F_WRLCK;</div><div class='add'>+    lock.l_whence = SEEK_SET;</div><div class='add'>+    lock.l_start = 10;</div><div class='add'>+    lock.l_len = -9;</div><div class='add'>+</div><div class='add'>+    ret = glfs_posix_lock(fd, F_SETLK, &amp;lock);</div><div class='add'>+    LOG_ERR("glfs_posix_lock", ret);</div><div class='add'>+</div><div class='add'>+err:</div><div class='add'>+    glfs_close(fd);</div><div class='add'>+    LOG_ERR("glfs_close", ret);</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (fs) {</div><div class='add'>+        ret = glfs_fini(fs);</div><div class='add'>+        fprintf(stderr, "glfs_fini(fs) returned %d \n", ret);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (ret)</div><div class='add'>+        exit(1);</div><div class='add'>+    exit(0);</div><div class='add'>+}</div><div class='head'>diff --git a/tests/basic/gfapi/bug-1241104.t b/tests/basic/gfapi/bug-1241104.t<br/>new file mode 100755<br/>index 00000000000..e7f4759c3d5<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/gfapi/bug-1241104.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/gfapi/bug-1241104.t</a></div><div class='hunk'>@@ -0,0 +1,30 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/brick1;</div><div class='add'>+EXPECT 'Created' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+EXPECT 'Started' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+logdir=`gluster --print-logdir`</div><div class='add'>+</div><div class='add'>+## Enable Upcall cache-invalidation feature</div><div class='add'>+TEST $CLI volume set $V0 features.cache-invalidation on;</div><div class='add'>+</div><div class='add'>+TEST build_tester $(dirname $0)/bug-1241104.c -lgfapi</div><div class='add'>+</div><div class='add'>+TEST ./$(dirname $0)/bug-1241104 $H0 $V0 $logdir/bug-1241104.log</div><div class='add'>+</div><div class='add'>+cleanup_tester $(dirname $0)/bug-1241104</div><div class='add'>+</div><div class='add'>+TEST $CLI volume stop $V0</div><div class='add'>+TEST $CLI volume delete $V0</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/basic/gfapi/bug-1507896.c b/tests/basic/gfapi/bug-1507896.c<br/>new file mode 100644<br/>index 00000000000..1cc20849c2b<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/gfapi/bug-1507896.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/gfapi/bug-1507896.c</a></div><div class='hunk'>@@ -0,0 +1,49 @@</div><div class='add'>+#include &lt;stdio.h&gt;</div><div class='add'>+#include &lt;string.h&gt;</div><div class='add'>+#include &lt;errno.h&gt;</div><div class='add'>+#include &lt;glusterfs/api/glfs.h&gt;</div><div class='add'>+#include &lt;glusterfs/api/glfs-handles.h&gt;</div><div class='add'>+</div><div class='add'>+#define VALIDATE_AND_GOTO_LABEL_ON_ERROR(func, ret, label)                     \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        if (ret &lt; 0) {                                                         \</div><div class='add'>+            fprintf(stderr, "%s : returned error %d (%s)\n", func, ret,        \</div><div class='add'>+                    strerror(errno));                                          \</div><div class='add'>+            goto label;                                                        \</div><div class='add'>+        }                                                                      \</div><div class='add'>+    } while (0)</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+main(int argc, char *argv[])</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    glfs_t *fs = NULL;</div><div class='add'>+    char *volname = NULL;</div><div class='add'>+    char *logfile = NULL;</div><div class='add'>+    char *hostname = NULL;</div><div class='add'>+</div><div class='add'>+    hostname = argv[1];</div><div class='add'>+    volname = argv[2];</div><div class='add'>+    logfile = argv[3];</div><div class='add'>+</div><div class='add'>+    fs = glfs_new(volname);</div><div class='add'>+    if (!fs)</div><div class='add'>+        VALIDATE_AND_GOTO_LABEL_ON_ERROR("glfs_new(fs)", ret, out);</div><div class='add'>+</div><div class='add'>+    ret = glfs_set_volfile_server(fs, "tcp", hostname, 24007);</div><div class='add'>+    VALIDATE_AND_GOTO_LABEL_ON_ERROR("glfs_set_volfile_server(fs)", ret, out);</div><div class='add'>+</div><div class='add'>+    ret = glfs_set_logging(fs, logfile, 7);</div><div class='add'>+    VALIDATE_AND_GOTO_LABEL_ON_ERROR("glfs_set_logging(fs)", ret, out);</div><div class='add'>+</div><div class='add'>+    ret = glfs_init(fs);</div><div class='add'>+    VALIDATE_AND_GOTO_LABEL_ON_ERROR("glfs_init(fs)", ret, out);</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (fs) {</div><div class='add'>+        ret = glfs_fini(fs);</div><div class='add'>+        if (ret)</div><div class='add'>+            fprintf(stderr, "glfs_fini(fs) returned %d\n", ret);</div><div class='add'>+    }</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='head'>diff --git a/tests/basic/gfapi/bug-1507896.t b/tests/basic/gfapi/bug-1507896.t<br/>new file mode 100644<br/>index 00000000000..4764e650232<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/gfapi/bug-1507896.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/gfapi/bug-1507896.t</a></div><div class='hunk'>@@ -0,0 +1,33 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/brick1;</div><div class='add'>+EXPECT 'Created' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+EXPECT 'Started' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+logdir=`gluster --print-logdir`</div><div class='add'>+</div><div class='add'>+TEST build_tester $(dirname $0)/bug-1507896.c -lgfapi</div><div class='add'>+</div><div class='add'>+TEST ./$(dirname $0)/bug-1507896 $H0 $V0 $logdir/bug-1507896.log</div><div class='add'>+</div><div class='add'>+#volume name precedding with '/'</div><div class='add'>+TEST ! ./$(dirname $0)/bug-1507896 $H0 /$V0 $logdir/bug-1507896.log</div><div class='add'>+</div><div class='add'>+#volume name passed with any special characters</div><div class='add'>+TEST ! ./$(dirname $0)/bug-1507896 $H0 test@_$V0 $logdir/bug-1507896.log</div><div class='add'>+</div><div class='add'>+cleanup_tester $(dirname $0)/bug-1507896</div><div class='add'>+</div><div class='add'>+TEST $CLI volume stop $V0</div><div class='add'>+TEST $CLI volume delete $V0</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/basic/gfapi/bug1283983.c b/tests/basic/gfapi/bug1283983.c<br/>new file mode 100644<br/>index 00000000000..b920013d0e0<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/gfapi/bug1283983.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/gfapi/bug1283983.c</a></div><div class='hunk'>@@ -0,0 +1,122 @@</div><div class='add'>+#include &lt;fcntl.h&gt;</div><div class='add'>+#include &lt;unistd.h&gt;</div><div class='add'>+#include &lt;time.h&gt;</div><div class='add'>+#include &lt;limits.h&gt;</div><div class='add'>+#include &lt;string.h&gt;</div><div class='add'>+#include &lt;stdio.h&gt;</div><div class='add'>+#include &lt;errno.h&gt;</div><div class='add'>+#include &lt;stdlib.h&gt;</div><div class='add'>+#include &lt;glusterfs/api/glfs.h&gt;</div><div class='add'>+#include &lt;glusterfs/api/glfs-handles.h&gt;</div><div class='add'>+int gfapi = 1;</div><div class='add'>+</div><div class='add'>+#define LOG_ERR(func, ret)                                                     \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        if (ret != 0) {                                                        \</div><div class='add'>+            fprintf(stderr, "%s : returned error ret(%d), errno(%d)\n", func,  \</div><div class='add'>+                    ret, errno);                                               \</div><div class='add'>+            exit(1);                                                           \</div><div class='add'>+        } else {                                                               \</div><div class='add'>+            fprintf(stderr, "%s : returned %d\n", func, ret);                  \</div><div class='add'>+        }                                                                      \</div><div class='add'>+    } while (0)</div><div class='add'>+#define LOG_IF_NO_ERR(func, ret)                                               \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        if (ret == 0) {                                                        \</div><div class='add'>+            fprintf(stderr, "%s : hasn't returned error %d\n", func, ret);     \</div><div class='add'>+            exit(1);                                                           \</div><div class='add'>+        } else {                                                               \</div><div class='add'>+            fprintf(stderr, "%s : returned %d\n", func, ret);                  \</div><div class='add'>+        }                                                                      \</div><div class='add'>+    } while (0)</div><div class='add'>+int</div><div class='add'>+main(int argc, char *argv[])</div><div class='add'>+{</div><div class='add'>+    glfs_t *fs = NULL;</div><div class='add'>+    int ret = 0, i;</div><div class='add'>+    glfs_fd_t *fd = NULL;</div><div class='add'>+    char *filename = "/a1";</div><div class='add'>+    char *filename2 = "/a2";</div><div class='add'>+    struct stat sb = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    struct glfs_upcall *cbk = NULL;</div><div class='add'>+    char *logfile = NULL;</div><div class='add'>+    char *volname = NULL;</div><div class='add'>+    int cnt = 1;</div><div class='add'>+    struct glfs_upcall_inode *in_arg = NULL;</div><div class='add'>+    struct glfs_object *root = NULL, *leaf = NULL;</div><div class='add'>+</div><div class='add'>+    fprintf(stderr, "Starting libgfapi_fini\n");</div><div class='add'>+    if (argc != 4) {</div><div class='add'>+        fprintf(stderr, "Invalid argument\n");</div><div class='add'>+        exit(1);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    hostname = argv[1] volname = argv[2];</div><div class='add'>+    logfile = argv[3];</div><div class='add'>+</div><div class='add'>+    fs = glfs_new(volname);</div><div class='add'>+    if (!fs) {</div><div class='add'>+        fprintf(stderr, "glfs_new: returned NULL\n");</div><div class='add'>+        return 1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = glfs_set_volfile_server(fs, "tcp", hostname, 24007);</div><div class='add'>+    LOG_ERR("glfs_set_volfile_server", ret);</div><div class='add'>+</div><div class='add'>+    ret = glfs_set_logging(fs, logfile, 7);</div><div class='add'>+    LOG_ERR("glfs_set_logging", ret);</div><div class='add'>+</div><div class='add'>+    ret = glfs_init(fs);</div><div class='add'>+    LOG_ERR("glfs_init", ret);</div><div class='add'>+</div><div class='add'>+    sleep(2);</div><div class='add'>+    root = glfs_h_lookupat(fs, NULL, "/", &amp;sb, 0);</div><div class='add'>+    if (!root) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        LOG_ERR("glfs_h_lookupat root", ret);</div><div class='add'>+    }</div><div class='add'>+    leaf = glfs_h_lookupat(fs, root, filename, &amp;sb, 0);</div><div class='add'>+    if (!leaf) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        LOG_IF_NO_ERR("glfs_h_lookupat leaf", ret);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    leaf = glfs_h_creat(fs, root, filename, O_RDWR, 0644, &amp;sb);</div><div class='add'>+    if (!leaf) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        LOG_ERR("glfs_h_lookupat leaf", ret);</div><div class='add'>+    }</div><div class='add'>+    fprintf(stderr, "glfs_h_create leaf - %p\n", leaf);</div><div class='add'>+</div><div class='add'>+    leaf = glfs_h_lookupat(fs, root, filename2, &amp;sb, 0);</div><div class='add'>+    if (!leaf) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        LOG_IF_NO_ERR("glfs_h_lookupat leaf", ret);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = glfs_h_rename(fs, root, filename, root, filename2);</div><div class='add'>+    LOG_ERR("glfs_rename", ret);</div><div class='add'>+</div><div class='add'>+    while (cnt++ &lt; 5) {</div><div class='add'>+        ret = glfs_h_poll_upcall(fs, &amp;cbk);</div><div class='add'>+        LOG_ERR("glfs_h_poll_upcall", ret);</div><div class='add'>+</div><div class='add'>+        /* There should not be any upcalls sent */</div><div class='add'>+        if (glfs_upcall_get_reason(cbk) != GLFS_UPCALL_EVENT_NULL) {</div><div class='add'>+            fprintf(stderr, "Error: Upcall received(%d)\n",</div><div class='add'>+                    glfs_upcall_get_reason(cbk));</div><div class='add'>+            exit(1);</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        glfs_free(cbk);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = glfs_fini(fs);</div><div class='add'>+    LOG_ERR("glfs_fini", ret);</div><div class='add'>+</div><div class='add'>+    fprintf(stderr, "End of libgfapi_fini\n");</div><div class='add'>+</div><div class='add'>+    exit(0);</div><div class='add'>+}</div><div class='head'>diff --git a/tests/basic/gfapi/bug1283983.sh b/tests/basic/gfapi/bug1283983.sh<br/>new file mode 100755<br/>index 00000000000..931a0b55935<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/gfapi/bug1283983.sh?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/gfapi/bug1283983.sh</a></div><div class='hunk'>@@ -0,0 +1,33 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/brick1;</div><div class='add'>+EXPECT 'Created' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+EXPECT 'Started' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+logdir=`gluster --print-logdir`</div><div class='add'>+</div><div class='add'>+## Enable Upcall cache-invalidation feature</div><div class='add'>+TEST $CLI volume set $V0 features.cache-invalidation on;</div><div class='add'>+</div><div class='add'>+build_tester $(dirname $0)/bug1283983.c -lgfapi</div><div class='add'>+</div><div class='add'>+TEST ./$(dirname $0)/bug1283983 $H0 $V0  $logdir/bug1283983.log</div><div class='add'>+</div><div class='add'>+## There shouldn't be any NULL gfid messages logged</div><div class='add'>+TEST ! cat $logdir/bug1283983.log | grep "upcall" | grep "00000000-0000-0000-0000-000000000000"</div><div class='add'>+</div><div class='add'>+cleanup_tester $(dirname $0)/bug1283983</div><div class='add'>+</div><div class='add'>+TEST $CLI volume stop $V0</div><div class='add'>+TEST $CLI volume delete $V0</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/basic/gfapi/bug1291259.c b/tests/basic/gfapi/bug1291259.c<br/>new file mode 100644<br/>index 00000000000..cd7bc65268b<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/gfapi/bug1291259.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/gfapi/bug1291259.c</a></div><div class='hunk'>@@ -0,0 +1,181 @@</div><div class='add'>+#include &lt;fcntl.h&gt;</div><div class='add'>+#include &lt;unistd.h&gt;</div><div class='add'>+#include &lt;time.h&gt;</div><div class='add'>+#include &lt;limits.h&gt;</div><div class='add'>+#include &lt;string.h&gt;</div><div class='add'>+#include &lt;stdio.h&gt;</div><div class='add'>+#include &lt;errno.h&gt;</div><div class='add'>+#include &lt;stdlib.h&gt;</div><div class='add'>+#include &lt;glusterfs/api/glfs.h&gt;</div><div class='add'>+#include &lt;glusterfs/api/glfs-handles.h&gt;</div><div class='add'>+int gfapi = 1;</div><div class='add'>+</div><div class='add'>+#define LOG_ERR(func, ret)                                                     \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        if (ret != 0) {                                                        \</div><div class='add'>+            fprintf(stderr, "%s : returned error ret(%d), errno(%d)\n", func,  \</div><div class='add'>+                    ret, errno);                                               \</div><div class='add'>+            exit(1);                                                           \</div><div class='add'>+        } else {                                                               \</div><div class='add'>+            fprintf(stderr, "%s : returned %d\n", func, ret);                  \</div><div class='add'>+        }                                                                      \</div><div class='add'>+    } while (0)</div><div class='add'>+#define LOG_IF_NO_ERR(func, ret)                                               \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        if (ret == 0) {                                                        \</div><div class='add'>+            fprintf(stderr, "%s : hasn't returned error %d\n", func, ret);     \</div><div class='add'>+            exit(1);                                                           \</div><div class='add'>+        } else {                                                               \</div><div class='add'>+            fprintf(stderr, "%s : returned %d\n", func, ret);                  \</div><div class='add'>+        }                                                                      \</div><div class='add'>+    } while (0)</div><div class='add'>+</div><div class='add'>+#define GLAPI_UUID_LENGTH 16</div><div class='add'>+int</div><div class='add'>+main(int argc, char *argv[])</div><div class='add'>+{</div><div class='add'>+    glfs_t *fs = NULL;</div><div class='add'>+    glfs_t *fs2 = NULL;</div><div class='add'>+    int ret = 0, i;</div><div class='add'>+    glfs_fd_t *fd = NULL;</div><div class='add'>+    char *filename = "/a1";</div><div class='add'>+    char *filename2 = "/a2";</div><div class='add'>+    struct stat sb = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    char *logfile = NULL;</div><div class='add'>+    char *volname = NULL;</div><div class='add'>+    char *hostname = NULL;</div><div class='add'>+    int cnt = 1;</div><div class='add'>+    int upcall_received = 0;</div><div class='add'>+    struct glfs_upcall *cbk = NULL;</div><div class='add'>+    struct glfs_object *root = NULL, *leaf = NULL;</div><div class='add'>+    unsigned char globjhdl[GFAPI_HANDLE_LENGTH];</div><div class='add'>+    unsigned char globjhdl2[GFAPI_HANDLE_LENGTH];</div><div class='add'>+</div><div class='add'>+    fprintf(stderr, "Starting libgfapi_fini\n");</div><div class='add'>+    if (argc != 4) {</div><div class='add'>+        fprintf(stderr, "Invalid argument\n");</div><div class='add'>+        exit(1);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    hostname = argv[1];</div><div class='add'>+    volname = argv[2];</div><div class='add'>+    logfile = argv[3];</div><div class='add'>+</div><div class='add'>+    fs = glfs_new(volname);</div><div class='add'>+    if (!fs) {</div><div class='add'>+        fprintf(stderr, "glfs_new: returned NULL\n");</div><div class='add'>+        return 1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = glfs_set_volfile_server(fs, "tcp", hostname, 24007);</div><div class='add'>+    LOG_ERR("glfs_set_volfile_server", ret);</div><div class='add'>+</div><div class='add'>+    ret = glfs_set_logging(fs, logfile, 7);</div><div class='add'>+    LOG_ERR("glfs_set_logging", ret);</div><div class='add'>+</div><div class='add'>+    ret = glfs_init(fs);</div><div class='add'>+    LOG_ERR("glfs_init", ret);</div><div class='add'>+</div><div class='add'>+    /* This does not block, but enables caching of events. Real</div><div class='add'>+     * applications like NFS-Ganesha run this in a thread before activity</div><div class='add'>+     * on the fs (through this instance) happens. */</div><div class='add'>+    ret = glfs_h_poll_upcall(fs, &amp;cbk);</div><div class='add'>+    LOG_ERR("glfs_h_poll_upcall", ret);</div><div class='add'>+</div><div class='add'>+    fs2 = glfs_new(volname);</div><div class='add'>+    if (!fs) {</div><div class='add'>+        fprintf(stderr, "glfs_new: returned NULL\n");</div><div class='add'>+        return 1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = glfs_set_volfile_server(fs2, "tcp", hostname, 24007);</div><div class='add'>+    LOG_ERR("glfs_set_volfile_server", ret);</div><div class='add'>+</div><div class='add'>+    ret = glfs_set_logging(fs2, logfile, 7);</div><div class='add'>+    LOG_ERR("glfs_set_logging", ret);</div><div class='add'>+</div><div class='add'>+    ret = glfs_init(fs2);</div><div class='add'>+    LOG_ERR("glfs_init", ret);</div><div class='add'>+</div><div class='add'>+    sleep(2);</div><div class='add'>+    root = glfs_h_lookupat(fs, NULL, "/", &amp;sb, 0);</div><div class='add'>+    if (!root) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        LOG_ERR("glfs_h_lookupat root", ret);</div><div class='add'>+    }</div><div class='add'>+    leaf = glfs_h_lookupat(fs, root, filename, &amp;sb, 0);</div><div class='add'>+    if (!leaf) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        LOG_IF_NO_ERR("glfs_h_lookupat leaf", ret);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    root = glfs_h_lookupat(fs2, NULL, "/", &amp;sb, 0);</div><div class='add'>+    if (!root) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        LOG_ERR("glfs_h_lookupat root", ret);</div><div class='add'>+    }</div><div class='add'>+    leaf = glfs_h_creat(fs2, root, filename, O_RDWR, 0644, &amp;sb);</div><div class='add'>+    if (!leaf) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        LOG_ERR("glfs_h_lookupat leaf", ret);</div><div class='add'>+    }</div><div class='add'>+    fprintf(stderr, "glfs_h_create leaf - %p\n", leaf);</div><div class='add'>+</div><div class='add'>+    while (cnt++ &lt; 5 &amp;&amp; !upcall_received) {</div><div class='add'>+        enum glfs_upcall_reason reason = 0;</div><div class='add'>+        struct glfs_upcall_inode *in_arg = NULL;</div><div class='add'>+</div><div class='add'>+        ret = glfs_h_poll_upcall(fs, &amp;cbk);</div><div class='add'>+        LOG_ERR("glfs_h_poll_upcall", ret);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto retry;</div><div class='add'>+</div><div class='add'>+        reason = glfs_upcall_get_reason(cbk);</div><div class='add'>+        fprintf(stderr, "Upcall received(%d)\n", reason);</div><div class='add'>+</div><div class='add'>+        if (reason == GLFS_UPCALL_INODE_INVALIDATE) {</div><div class='add'>+            struct glfs_object *object = NULL;</div><div class='add'>+</div><div class='add'>+            in_arg = glfs_upcall_get_event(cbk);</div><div class='add'>+            object = glfs_upcall_inode_get_object(in_arg);</div><div class='add'>+</div><div class='add'>+            ret = glfs_h_extract_handle(root, globjhdl + GLAPI_UUID_LENGTH,</div><div class='add'>+                                        GFAPI_HANDLE_LENGTH);</div><div class='add'>+            LOG_ERR("glfs_h_extract_handle", (ret != 16));</div><div class='add'>+</div><div class='add'>+            ret = glfs_h_extract_handle(object, globjhdl2 + GLAPI_UUID_LENGTH,</div><div class='add'>+                                        GFAPI_HANDLE_LENGTH);</div><div class='add'>+            LOG_ERR("glfs_h_extract_handle", (ret != 16));</div><div class='add'>+</div><div class='add'>+            if (memcmp(globjhdl + GLAPI_UUID_LENGTH,</div><div class='add'>+                       globjhdl2 + GLAPI_UUID_LENGTH, 16)) {</div><div class='add'>+                fprintf(stderr, "Error: gfid mismatch\n");</div><div class='add'>+                exit(1);</div><div class='add'>+            }</div><div class='add'>+            upcall_received = 1;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+    retry:</div><div class='add'>+        if (!upcall_received)</div><div class='add'>+            sleep(1); /* glfs_h_poll_upcall() does not block */</div><div class='add'>+</div><div class='add'>+        if (!ret) {</div><div class='add'>+            glfs_free(cbk);</div><div class='add'>+            cbk = NULL;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (!upcall_received) {</div><div class='add'>+        fprintf(stderr, "Error: Upcall not received\n");</div><div class='add'>+        exit(1);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = glfs_fini(fs);</div><div class='add'>+    LOG_ERR("glfs_fini", ret);</div><div class='add'>+</div><div class='add'>+    fprintf(stderr, "End of libgfapi_fini\n");</div><div class='add'>+</div><div class='add'>+    exit(0);</div><div class='add'>+}</div><div class='head'>diff --git a/tests/basic/gfapi/bug1291259.t b/tests/basic/gfapi/bug1291259.t<br/>new file mode 100755<br/>index 00000000000..999cda2da3a<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/gfapi/bug1291259.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/gfapi/bug1291259.t</a></div><div class='hunk'>@@ -0,0 +1,32 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/brick1;</div><div class='add'>+EXPECT 'Created' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+EXPECT 'Started' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+logdir=`gluster --print-logdir`</div><div class='add'>+</div><div class='add'>+## Enable Upcall cache-invalidation feature</div><div class='add'>+TEST $CLI volume set $V0 features.cache-invalidation on;</div><div class='add'>+</div><div class='add'>+TEST build_tester $(dirname $0)/bug1291259.c -lgfapi</div><div class='add'>+</div><div class='add'>+TEST ./$(dirname $0)/bug1291259 $H0 $V0 $logdir/bug1291259.log</div><div class='add'>+</div><div class='add'>+cleanup_tester $(dirname $0)/bug1291259</div><div class='add'>+</div><div class='add'>+TEST $CLI volume stop $V0</div><div class='add'>+TEST $CLI volume delete $V0</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+#G_TESTDEF_TEST_STATUS_CENTOS6=BAD_TEST,BUG=1405301</div><div class='add'>+#G_TESTDEF_TEST_STATUS_NETBSD7=BAD_TEST,BUG=1405301</div><div class='head'>diff --git a/tests/basic/gfapi/bug1613098.c b/tests/basic/gfapi/bug1613098.c<br/>new file mode 100644<br/>index 00000000000..ee67e97a034<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/gfapi/bug1613098.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/gfapi/bug1613098.c</a></div><div class='hunk'>@@ -0,0 +1,96 @@</div><div class='add'>+#include &lt;inttypes.h&gt;</div><div class='add'>+#include &lt;stdio.h&gt;</div><div class='add'>+#include &lt;string.h&gt;</div><div class='add'>+#include &lt;errno.h&gt;</div><div class='add'>+</div><div class='add'>+#include &lt;glusterfs/api/glfs.h&gt;</div><div class='add'>+#include &lt;glusterfs/api/glfs-handles.h&gt;</div><div class='add'>+</div><div class='add'>+#define ACL_TYPE_ACCESS (0x8000)</div><div class='add'>+</div><div class='add'>+#define VALIDATE_AND_GOTO_LABEL_ON_ERROR(func, ret, label)                     \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        if (ret &lt; 0) {                                                         \</div><div class='add'>+            fprintf(stderr, "%s : returned error %d (%s)\n", func, ret,        \</div><div class='add'>+                    strerror(errno));                                          \</div><div class='add'>+            goto label;                                                        \</div><div class='add'>+        }                                                                      \</div><div class='add'>+    } while (0)</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+main(int argc, char *argv[])</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int flags = O_RDWR | O_SYNC;</div><div class='add'>+    glfs_t *fs = NULL;</div><div class='add'>+    glfs_fd_t *fd = NULL;</div><div class='add'>+    char *volname = NULL;</div><div class='add'>+    char *logfile = NULL;</div><div class='add'>+    const char *filename = "file_tmp";</div><div class='add'>+    struct glfs_object *object = NULL;</div><div class='add'>+    acl_t acl = NULL;</div><div class='add'>+    struct stat sb;</div><div class='add'>+</div><div class='add'>+    if (argc != 3) {</div><div class='add'>+        fprintf(stderr, "Invalid argument\n");</div><div class='add'>+        return 1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    volname = argv[1];</div><div class='add'>+    logfile = argv[2];</div><div class='add'>+</div><div class='add'>+    fs = glfs_new(volname);</div><div class='add'>+    if (!fs)</div><div class='add'>+        VALIDATE_AND_GOTO_LABEL_ON_ERROR("glfs_new", ret, out);</div><div class='add'>+</div><div class='add'>+    ret = glfs_set_volfile_server(fs, "tcp", "localhost", 24007);</div><div class='add'>+    VALIDATE_AND_GOTO_LABEL_ON_ERROR("glfs_set_volfile_server", ret, out);</div><div class='add'>+</div><div class='add'>+    ret = glfs_set_logging(fs, logfile, 7);</div><div class='add'>+    VALIDATE_AND_GOTO_LABEL_ON_ERROR("glfs_set_logging", ret, out);</div><div class='add'>+</div><div class='add'>+    ret = glfs_init(fs);</div><div class='add'>+    VALIDATE_AND_GOTO_LABEL_ON_ERROR("glfs_init", ret, out);</div><div class='add'>+</div><div class='add'>+    fd = glfs_creat(fs, filename, flags, 0044);</div><div class='add'>+    if (fd == NULL) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        VALIDATE_AND_GOTO_LABEL_ON_ERROR("glfs_creat", ret, out);</div><div class='add'>+    }</div><div class='add'>+    glfs_close(fd);</div><div class='add'>+</div><div class='add'>+    object = glfs_h_lookupat(fs, NULL, filename, NULL, 0);</div><div class='add'>+    if (object == NULL) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        VALIDATE_AND_GOTO_LABEL_ON_ERROR("glfs_h_lookupat", ret, out);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = glfs_chown(fs, filename, 99, 99);</div><div class='add'>+    VALIDATE_AND_GOTO_LABEL_ON_ERROR("glfs_chown", ret, out);</div><div class='add'>+</div><div class='add'>+    ret = glfs_setfsuid(99);</div><div class='add'>+    VALIDATE_AND_GOTO_LABEL_ON_ERROR("glfs_setfsuid", ret, out);</div><div class='add'>+</div><div class='add'>+    ret = glfs_setfsgid(99);</div><div class='add'>+    VALIDATE_AND_GOTO_LABEL_ON_ERROR("glfs_setfsgid", ret, out);</div><div class='add'>+</div><div class='add'>+    acl = glfs_h_acl_get(fs, object, ACL_TYPE_ACCESS);</div><div class='add'>+    if (acl == NULL) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        VALIDATE_AND_GOTO_LABEL_ON_ERROR("glfs_h_acl_get", ret, out);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = glfs_h_acl_set(fs, object, ACL_TYPE_ACCESS, acl);</div><div class='add'>+    VALIDATE_AND_GOTO_LABEL_ON_ERROR("glfs_h_acl_get", ret, out);</div><div class='add'>+out:</div><div class='add'>+    glfs_setfsuid(0);</div><div class='add'>+    glfs_setfsgid(0);</div><div class='add'>+</div><div class='add'>+    if (object)</div><div class='add'>+        glfs_h_close(object);</div><div class='add'>+</div><div class='add'>+    if (fs)</div><div class='add'>+        glfs_fini(fs);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='head'>diff --git a/tests/basic/gfapi/bug1613098.t b/tests/basic/gfapi/bug1613098.t<br/>new file mode 100755<br/>index 00000000000..e4acc2b76bf<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/gfapi/bug1613098.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/gfapi/bug1613098.t</a></div><div class='hunk'>@@ -0,0 +1,22 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 ${H0}:$B0/brick1;</div><div class='add'>+EXPECT 'Created' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+EXPECT 'Started' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+logdir=`gluster --print-logdir`</div><div class='add'>+</div><div class='add'>+build_tester $(dirname $0)/bug1613098.c -lgfapi</div><div class='add'>+</div><div class='add'>+TEST ./$(dirname $0)/bug1613098 $V0 $logdir/bug1613098.log</div><div class='add'>+</div><div class='add'>+cleanup_tester $(dirname $0)/bug1613098</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/basic/gfapi/gfapi-async-calls-test.c b/tests/basic/gfapi/gfapi-async-calls-test.c<br/>new file mode 100644<br/>index 00000000000..55835b14709<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/gfapi/gfapi-async-calls-test.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/gfapi/gfapi-async-calls-test.c</a></div><div class='hunk'>@@ -0,0 +1,494 @@</div><div class='add'>+#include &lt;fcntl.h&gt;</div><div class='add'>+#include &lt;unistd.h&gt;</div><div class='add'>+#include &lt;time.h&gt;</div><div class='add'>+#include &lt;limits.h&gt;</div><div class='add'>+#include &lt;string.h&gt;</div><div class='add'>+#include &lt;stdio.h&gt;</div><div class='add'>+#include &lt;stdlib.h&gt;</div><div class='add'>+#include &lt;errno.h&gt;</div><div class='add'>+#include &lt;glusterfs/api/glfs.h&gt;</div><div class='add'>+#include &lt;glusterfs/api/glfs-handles.h&gt;</div><div class='add'>+</div><div class='add'>+#define LOG_ERR(msg)                                                           \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        fprintf(stderr, "%s : Error (%s)\n", msg, strerror(errno));            \</div><div class='add'>+    } while (0)</div><div class='add'>+</div><div class='add'>+int cbk_complete = 0;</div><div class='add'>+int cbk_ret_val = -1;</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+cbk_check()</div><div class='add'>+{</div><div class='add'>+    while (cbk_complete != 1) {</div><div class='add'>+        sleep(1);</div><div class='add'>+    }</div><div class='add'>+    if (cbk_ret_val &lt; 0) {</div><div class='add'>+        fprintf(stderr, "cbk_ret_val is -ve\n");</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+fill_iov(struct iovec *iov, char fillchar, int count)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    iov-&gt;iov_base = malloc(count + 1);</div><div class='add'>+    if (iov-&gt;iov_base == NULL) {</div><div class='add'>+        return ret;</div><div class='add'>+    } else {</div><div class='add'>+        iov-&gt;iov_len = count;</div><div class='add'>+        ret = 0;</div><div class='add'>+    }</div><div class='add'>+    memset(iov-&gt;iov_base, fillchar, count);</div><div class='add'>+    memset(iov-&gt;iov_base + count, '\0', 1);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+glfs_t *</div><div class='add'>+init_glfs(const char *hostname, const char *volname, const char *logfile)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    glfs_t *fs = NULL;</div><div class='add'>+</div><div class='add'>+    fs = glfs_new(volname);</div><div class='add'>+    if (!fs) {</div><div class='add'>+        LOG_ERR("glfs_new failed");</div><div class='add'>+        return NULL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = glfs_set_volfile_server(fs, "tcp", hostname, 24007);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        LOG_ERR("glfs_set_volfile_server failed");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = glfs_set_logging(fs, logfile, 7);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        LOG_ERR("glfs_set_logging failed");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = glfs_init(fs);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        LOG_ERR("glfs_init failed");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+out:</div><div class='add'>+    if (ret) {</div><div class='add'>+        glfs_fini(fs);</div><div class='add'>+        fs = NULL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return fs;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+pwritev_async_cbk(glfs_fd_t *fd, ssize_t ret, struct stat *prestat,</div><div class='add'>+                  struct stat *poststat, void *cookie)</div><div class='add'>+{</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        LOG_ERR("glfs_pwritev failed");</div><div class='add'>+    }</div><div class='add'>+    cbk_ret_val = ret;</div><div class='add'>+    cbk_complete = 1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+pwritev_async(glfs_t *fs, glfs_fd_t *glfd, int char_count)</div><div class='add'>+{</div><div class='add'>+    ssize_t ret = -1;</div><div class='add'>+    int flags = O_RDWR;</div><div class='add'>+    struct iovec iov = {0};</div><div class='add'>+    void *write_cookie = NULL;</div><div class='add'>+</div><div class='add'>+    ret = fill_iov(&amp;iov, 'a', char_count);</div><div class='add'>+    if (ret) {</div><div class='add'>+        LOG_ERR("failed to create iov");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    write_cookie = strdup("write_cookie");</div><div class='add'>+    ret = glfs_pwritev_async(glfd, &amp;iov, 1, 0, flags, pwritev_async_cbk,</div><div class='add'>+                             &amp;write_cookie);</div><div class='add'>+out:</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        LOG_ERR("glfs_pwritev async failed");</div><div class='add'>+    }</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+pwrite_async_cbk(glfs_fd_t *fd, ssize_t ret, struct stat *prestat,</div><div class='add'>+                 struct stat *poststat, void *cookie)</div><div class='add'>+{</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        LOG_ERR("glfs_pwrite_cbk failed");</div><div class='add'>+    }</div><div class='add'>+    cbk_ret_val = ret;</div><div class='add'>+    cbk_complete = 1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+pwrite_async(glfs_fd_t *glfd)</div><div class='add'>+{</div><div class='add'>+    ssize_t ret = -1;</div><div class='add'>+    int flags = O_RDWR;</div><div class='add'>+    char buf1[10];</div><div class='add'>+    char *buf2 = "ten bytes!";</div><div class='add'>+    void *write_cookie = strdup("write_cookie");</div><div class='add'>+    ret = glfs_pwrite_async(glfd, buf1, 10, 0, flags, pwrite_async_cbk,</div><div class='add'>+                            &amp;write_cookie);</div><div class='add'>+</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        LOG_ERR("glfs_pwrite_async failed");</div><div class='add'>+    }</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+writev_async_cbk(glfs_fd_t *fd, ssize_t ret, struct stat *prestat,</div><div class='add'>+                 struct stat *poststat, void *cookie)</div><div class='add'>+{</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        LOG_ERR("glfs_writev_cbk failed");</div><div class='add'>+    }</div><div class='add'>+    cbk_ret_val = ret;</div><div class='add'>+    cbk_complete = 1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+writev_async(glfs_t *fs, glfs_fd_t *glfd, int char_count)</div><div class='add'>+{</div><div class='add'>+    ssize_t ret = -1;</div><div class='add'>+    int flags = O_RDWR;</div><div class='add'>+    struct iovec iov = {0};</div><div class='add'>+    void *write_cookie = NULL;</div><div class='add'>+</div><div class='add'>+    ret = fill_iov(&amp;iov, 'a', char_count);</div><div class='add'>+    if (ret) {</div><div class='add'>+        LOG_ERR("failed to create iov");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    write_cookie = strdup("write_cookie");</div><div class='add'>+    ret = glfs_writev_async(glfd, &amp;iov, 1, flags, writev_async_cbk,</div><div class='add'>+                            &amp;write_cookie);</div><div class='add'>+out:</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        LOG_ERR("glfs_writev_async failed");</div><div class='add'>+    }</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+write_async_cbk(glfs_fd_t *fd, ssize_t ret, struct stat *prestat,</div><div class='add'>+                struct stat *poststat, void *cookie)</div><div class='add'>+{</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        LOG_ERR("glfs_write_cbk failed");</div><div class='add'>+    }</div><div class='add'>+    cbk_ret_val = ret;</div><div class='add'>+    cbk_complete = 1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+write_async(glfs_fd_t *glfd)</div><div class='add'>+{</div><div class='add'>+    ssize_t ret = -1;</div><div class='add'>+    int flags = O_RDWR;</div><div class='add'>+    char buf1[10];</div><div class='add'>+    char *buf2 = "ten bytes!";</div><div class='add'>+    void *write_cookie = strdup("write_cookie");</div><div class='add'>+    ret = glfs_write_async(glfd, buf1, 10, flags, write_async_cbk,</div><div class='add'>+                           &amp;write_cookie);</div><div class='add'>+</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        LOG_ERR("glfs_write_async failed");</div><div class='add'>+    }</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+preadv_async_cbk(glfs_fd_t *fd, ssize_t ret, struct stat *prestat,</div><div class='add'>+                 struct stat *poststat, void *cookie)</div><div class='add'>+{</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        LOG_ERR("glfs_preadv_cbk failed");</div><div class='add'>+    }</div><div class='add'>+    cbk_ret_val = ret;</div><div class='add'>+    cbk_complete = 1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+preadv_async(glfs_t *fs, glfs_fd_t *glfd, int char_count)</div><div class='add'>+{</div><div class='add'>+    ssize_t ret = -1;</div><div class='add'>+    int flags = O_RDWR;</div><div class='add'>+    struct iovec iov = {0};</div><div class='add'>+    void *read_cookie = NULL;</div><div class='add'>+</div><div class='add'>+    ret = fill_iov(&amp;iov, 'a', char_count);</div><div class='add'>+    if (ret) {</div><div class='add'>+        LOG_ERR("failed to create iov");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    read_cookie = strdup("preadv_cookie");</div><div class='add'>+    ret = glfs_preadv_async(glfd, &amp;iov, 1, 0, flags, preadv_async_cbk,</div><div class='add'>+                            &amp;read_cookie);</div><div class='add'>+out:</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        LOG_ERR("glfs_preadv async failed");</div><div class='add'>+    }</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+pread_async_cbk(glfs_fd_t *fd, ssize_t ret, struct stat *prestat,</div><div class='add'>+                struct stat *poststat, void *cookie)</div><div class='add'>+{</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        LOG_ERR("glfs_pread_cbk failed");</div><div class='add'>+    }</div><div class='add'>+    cbk_ret_val = ret;</div><div class='add'>+    cbk_complete = 1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+pread_async(glfs_fd_t *glfd)</div><div class='add'>+{</div><div class='add'>+    ssize_t ret = -1;</div><div class='add'>+    int flags = O_RDWR;</div><div class='add'>+    char buf1[10];</div><div class='add'>+    void *read_cookie = strdup("read_cookie");</div><div class='add'>+    ret = glfs_pread_async(glfd, buf1, 10, 0, flags, pread_async_cbk,</div><div class='add'>+                           &amp;read_cookie);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        LOG_ERR("glfs_pread_async failed");</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+readv_async_cbk(glfs_fd_t *fd, ssize_t ret, struct stat *prestat,</div><div class='add'>+                struct stat *poststat, void *cookie)</div><div class='add'>+{</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        LOG_ERR("glfs_readv_cbk failed");</div><div class='add'>+    }</div><div class='add'>+    cbk_ret_val = ret;</div><div class='add'>+    cbk_complete = 1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+readv_async(glfs_t *fs, glfs_fd_t *glfd, int char_count)</div><div class='add'>+{</div><div class='add'>+    ssize_t ret = -1;</div><div class='add'>+    int flags = O_RDWR;</div><div class='add'>+    struct iovec iov = {0};</div><div class='add'>+    void *read_cookie = NULL;</div><div class='add'>+</div><div class='add'>+    ret = fill_iov(&amp;iov, 'a', char_count);</div><div class='add'>+    if (ret) {</div><div class='add'>+        LOG_ERR("failed to create iov");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    read_cookie = strdup("read_cookie");</div><div class='add'>+    ret = glfs_readv_async(glfd, &amp;iov, 1, flags, readv_async_cbk, &amp;read_cookie);</div><div class='add'>+out:</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        LOG_ERR("glfs_readv_async failed");</div><div class='add'>+    }</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+read_async_cbk(glfs_fd_t *fd, ssize_t ret, struct stat *prestat,</div><div class='add'>+               struct stat *poststat, void *cookie)</div><div class='add'>+{</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        LOG_ERR("glfs_read_cbk failed");</div><div class='add'>+    }</div><div class='add'>+    cbk_ret_val = ret;</div><div class='add'>+    cbk_complete = 1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+read_async(glfs_fd_t *glfd)</div><div class='add'>+{</div><div class='add'>+    ssize_t ret = -1;</div><div class='add'>+    int flags = O_RDWR;</div><div class='add'>+    char buf1[10];</div><div class='add'>+    void *read_cookie = strdup("read_cookie");</div><div class='add'>+    ret = glfs_read_async(glfd, buf1, 10, flags, read_async_cbk, &amp;read_cookie);</div><div class='add'>+</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        LOG_ERR("glfs_read_async failed");</div><div class='add'>+    }</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+fsync_async_cbk(glfs_fd_t *fd, ssize_t ret, struct stat *prestat,</div><div class='add'>+                struct stat *poststat, void *cookie)</div><div class='add'>+{</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        LOG_ERR("glfs_fsync_async_cbk failed");</div><div class='add'>+    }</div><div class='add'>+    cbk_ret_val = ret;</div><div class='add'>+    cbk_complete = 1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+fdatasync_async_cbk(glfs_fd_t *fd, ssize_t ret, struct stat *prestat,</div><div class='add'>+                    struct stat *poststat, void *cookie)</div><div class='add'>+{</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        LOG_ERR("glfs_fdatasync_async_cbk failed");</div><div class='add'>+    }</div><div class='add'>+    cbk_ret_val = ret;</div><div class='add'>+    cbk_complete = 1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ftruncate_async_cbk(glfs_fd_t *fd, ssize_t ret, struct stat *prestat,</div><div class='add'>+                    struct stat *poststat, void *cookie)</div><div class='add'>+{</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        LOG_ERR("glfs_ftruncate_async_cbk failed");</div><div class='add'>+    }</div><div class='add'>+    cbk_ret_val = ret;</div><div class='add'>+    cbk_complete = 1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+main(int argc, char *argv[])</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+    char *hostname = NULL;</div><div class='add'>+    char *volname = NULL;</div><div class='add'>+    char *logfile = NULL;</div><div class='add'>+    glfs_t *fs = NULL;</div><div class='add'>+    const char *filename = "glfs_test.txt";</div><div class='add'>+    int flags = (O_RDWR | O_CREAT);</div><div class='add'>+    glfs_fd_t *glfd = NULL;</div><div class='add'>+    int count = 200;</div><div class='add'>+    void *data = strdup("Sample_text");</div><div class='add'>+</div><div class='add'>+    if (argc != 4) {</div><div class='add'>+        fprintf(stderr, "Invalid argument\n");</div><div class='add'>+        exit(1);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    hostname = argv[1];</div><div class='add'>+    volname = argv[2];</div><div class='add'>+    logfile = argv[3];</div><div class='add'>+</div><div class='add'>+    fs = init_glfs(hostname, volname, logfile);</div><div class='add'>+    if (fs == NULL) {</div><div class='add'>+        LOG_ERR("init_glfs failed");</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    glfd = glfs_creat(fs, filename, flags, 0644);</div><div class='add'>+    if (glfd == NULL) {</div><div class='add'>+        LOG_ERR("glfs_creat failed");</div><div class='add'>+        exit(1);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = pwritev_async(fs, glfd, count);</div><div class='add'>+    if (ret) {</div><div class='add'>+        LOG_ERR("glfs_pwritev_async_test failed");</div><div class='add'>+        exit(1);</div><div class='add'>+    }</div><div class='add'>+    cbk_check();</div><div class='add'>+</div><div class='add'>+    ret = writev_async(fs, glfd, count);</div><div class='add'>+    if (ret) {</div><div class='add'>+        LOG_ERR("glfs_writev_async_test failed");</div><div class='add'>+        exit(1);</div><div class='add'>+    }</div><div class='add'>+    cbk_check();</div><div class='add'>+</div><div class='add'>+    ret = write_async(glfd);</div><div class='add'>+    if (ret) {</div><div class='add'>+        LOG_ERR("glfs_write_async_test failed");</div><div class='add'>+        exit(1);</div><div class='add'>+    }</div><div class='add'>+    cbk_check();</div><div class='add'>+</div><div class='add'>+    ret = preadv_async(fs, glfd, count);</div><div class='add'>+    if (ret) {</div><div class='add'>+        LOG_ERR("glfs_preadv_async_test failed");</div><div class='add'>+        exit(1);</div><div class='add'>+    }</div><div class='add'>+    cbk_check();</div><div class='add'>+</div><div class='add'>+    ret = pread_async(glfd);</div><div class='add'>+    if (ret) {</div><div class='add'>+        LOG_ERR("glfs_pread_async_test failed");</div><div class='add'>+        exit(1);</div><div class='add'>+    }</div><div class='add'>+    cbk_check();</div><div class='add'>+</div><div class='add'>+    ret = readv_async(fs, glfd, count);</div><div class='add'>+    if (ret) {</div><div class='add'>+        LOG_ERR("glfs_readv_async_test failed");</div><div class='add'>+        exit(1);</div><div class='add'>+    }</div><div class='add'>+    cbk_check();</div><div class='add'>+</div><div class='add'>+    ret = read_async(glfd);</div><div class='add'>+    if (ret) {</div><div class='add'>+        LOG_ERR("glfs_read_async_test failed");</div><div class='add'>+        exit(1);</div><div class='add'>+    }</div><div class='add'>+    cbk_check();</div><div class='add'>+</div><div class='add'>+    ret = glfs_fsync(glfd, NULL, NULL);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        LOG_ERR("glfs_fsync failed");</div><div class='add'>+        exit(1);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = glfs_fdatasync(glfd, NULL, NULL);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        LOG_ERR("glfs_fdatasync failed");</div><div class='add'>+        exit(1);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = glfs_fsync_async(glfd, fsync_async_cbk, data);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        LOG_ERR("glfs_fsync_async failed");</div><div class='add'>+        exit(1);</div><div class='add'>+    }</div><div class='add'>+    cbk_check();</div><div class='add'>+</div><div class='add'>+    ret = glfs_fdatasync_async(glfd, fdatasync_async_cbk, data);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        LOG_ERR("glfs_fdatasync_async failed");</div><div class='add'>+        exit(1);</div><div class='add'>+    }</div><div class='add'>+    cbk_check();</div><div class='add'>+</div><div class='add'>+    ret = glfs_ftruncate_async(glfd, 4, ftruncate_async_cbk, data);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        LOG_ERR("glfs_ftruncate_async failed");</div><div class='add'>+        exit(1);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = glfs_close(glfd);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        LOG_ERR("glfs close  failed");</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = glfs_fini(fs);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='head'>diff --git a/tests/basic/gfapi/gfapi-async-calls-test.t b/tests/basic/gfapi/gfapi-async-calls-test.t<br/>new file mode 100644<br/>index 00000000000..9e5cd7c92cc<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/gfapi/gfapi-async-calls-test.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/gfapi/gfapi-async-calls-test.t</a></div><div class='hunk'>@@ -0,0 +1,26 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+EXIT_EARLY=1;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 ${H0}:$B0/brick1;</div><div class='add'>+EXPECT 'Created' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+EXPECT 'Started' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+logdir=`gluster --print-logdir`</div><div class='add'>+</div><div class='add'>+TEST build_tester $(dirname $0)/gfapi-async-calls-test.c -lgfapi</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+TEST ./$(dirname $0)/gfapi-async-calls-test ${H0} $V0 $logdir/gfapi-async-calls-test.log</div><div class='add'>+</div><div class='add'>+cleanup_tester $(dirname $0)/gfapi-async-calls-test</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/basic/gfapi/gfapi-copy-file-range.t b/tests/basic/gfapi/gfapi-copy-file-range.t<br/>new file mode 100644<br/>index 00000000000..a56d3a58e07<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/gfapi/gfapi-copy-file-range.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/gfapi/gfapi-copy-file-range.t</a></div><div class='hunk'>@@ -0,0 +1,82 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+mkfs.xfs 2&gt;&amp;1 | grep reflink</div><div class='add'>+if [ $? -ne 0 ]; then</div><div class='add'>+    SKIP_TESTS</div><div class='add'>+    exit</div><div class='add'>+fi</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+</div><div class='add'>+TEST truncate -s 2G $B0/xfs_image</div><div class='add'>+# for now, a xfs filesystem with reflink support is created.</div><div class='add'>+# In future, better to make changes in MKFS_LOOP so that,</div><div class='add'>+# once can create a xfs filesystem with reflink enabled in</div><div class='add'>+# generic and simple way, instead of doing below steps each</div><div class='add'>+# time.</div><div class='add'>+TEST mkfs.xfs -f -i size=512 -m reflink=1 $B0/xfs_image;</div><div class='add'>+</div><div class='add'>+TEST mkdir $B0/bricks</div><div class='add'>+TEST mount -t xfs -o loop $B0/xfs_image $B0/bricks</div><div class='add'>+</div><div class='add'>+# Just a single brick volume. More test cases need to be</div><div class='add'>+# added in future for distribute, replicate,</div><div class='add'>+# distributed replicate and distributed replicated sharded</div><div class='add'>+# volumes.</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/bricks/brick1;</div><div class='add'>+EXPECT 'Created' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+EXPECT 'Started' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+TEST glusterfs --volfile-id=/$V0 --volfile-server=$H0 $M0</div><div class='add'>+</div><div class='add'>+TEST dd if=/dev/urandom of=$M0/file bs=1M count=555;</div><div class='add'>+</div><div class='add'>+# check for the existence of the created file</div><div class='add'>+TEST stat  $M0/file;</div><div class='add'>+</div><div class='add'>+# grab the size of the file</div><div class='add'>+SRC_SIZE=$(stat -c %s $M0/file);</div><div class='add'>+</div><div class='add'>+logdir=`gluster --print-logdir`</div><div class='add'>+</div><div class='add'>+# TODO:</div><div class='add'>+# For now, do not call copy-file-range utility. This is because,</div><div class='add'>+# the regression machines are centos-7 based which does not have</div><div class='add'>+# copy_file_range API available. So, instead of this testcase</div><div class='add'>+# causing regression failures, for now, this is just a dummy test</div><div class='add'>+# case. Uncomment the below tests (until volume stop) when there</div><div class='add'>+# is support for copy_file_range in the regression machines.</div><div class='add'>+#</div><div class='add'>+</div><div class='add'>+TEST build_tester $(dirname $0)/glfs-copy-file-range.c -lgfapi</div><div class='add'>+</div><div class='add'>+TEST ./$(dirname $0)/glfs-copy-file-range $H0 $V0 $logdir/gfapi-copy-file-range.log /file /new</div><div class='add'>+</div><div class='add'>+# check whether the destination file is created or not</div><div class='add'>+TEST stat $M0/new</div><div class='add'>+</div><div class='add'>+# check the size of the destination file</div><div class='add'>+DST_SIZE=$(stat -c %s $M0/new);</div><div class='add'>+</div><div class='add'>+# The sizes of the source and destination should be same.</div><div class='add'>+# Atleast it ensures that, copy_file_range API is working</div><div class='add'>+# as expected. Whether the actual cloning happened via reflink</div><div class='add'>+# or a read/write happened is different matter.</div><div class='add'>+TEST [ $SRC_SIZE == $DST_SIZE ];</div><div class='add'>+</div><div class='add'>+cleanup_tester $(dirname $0)/glfs-copy-file-range</div><div class='add'>+</div><div class='add'>+TEST $CLI volume stop $V0</div><div class='add'>+TEST $CLI volume delete $V0</div><div class='add'>+</div><div class='add'>+UMOUNT_LOOP $B0/bricks;</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/basic/gfapi/gfapi-dup.c b/tests/basic/gfapi/gfapi-dup.c<br/>new file mode 100644<br/>index 00000000000..028108e4590<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/gfapi/gfapi-dup.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/gfapi/gfapi-dup.c</a></div><div class='hunk'>@@ -0,0 +1,84 @@</div><div class='add'>+#include &lt;stdio.h&gt;</div><div class='add'>+#include &lt;string.h&gt;</div><div class='add'>+#include &lt;errno.h&gt;</div><div class='add'>+#include &lt;glusterfs/api/glfs.h&gt;</div><div class='add'>+#include &lt;glusterfs/api/glfs-handles.h&gt;</div><div class='add'>+</div><div class='add'>+#define VALIDATE_AND_GOTO_LABEL_ON_ERROR(func, ret, label)                     \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        if (ret &lt; 0) {                                                         \</div><div class='add'>+            fprintf(stderr, "%s : returned error %d (%s)\n", func, ret,        \</div><div class='add'>+                    strerror(errno));                                          \</div><div class='add'>+            goto label;                                                        \</div><div class='add'>+        }                                                                      \</div><div class='add'>+    } while (0)</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+main(int argc, char *argv[])</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int flags = O_RDWR | O_SYNC;</div><div class='add'>+    glfs_t *fs = NULL;</div><div class='add'>+    glfs_fd_t *fd1 = NULL;</div><div class='add'>+    glfs_fd_t *fd2 = NULL;</div><div class='add'>+    char *volname = NULL;</div><div class='add'>+    char *logfile = NULL;</div><div class='add'>+    char *hostname = NULL;</div><div class='add'>+    const char *filename = "file_tmp";</div><div class='add'>+    const char *buff =</div><div class='add'>+        "An opinion should be the result of thought, "</div><div class='add'>+        "not a substitute for it.";</div><div class='add'>+</div><div class='add'>+    if (argc != 4) {</div><div class='add'>+        fprintf(stderr, "Invalid argument\n");</div><div class='add'>+        return 1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    hostname = argv[1];</div><div class='add'>+    volname = argv[2];</div><div class='add'>+    logfile = argv[3];</div><div class='add'>+</div><div class='add'>+    fs = glfs_new(volname);</div><div class='add'>+    if (!fs)</div><div class='add'>+        VALIDATE_AND_GOTO_LABEL_ON_ERROR("glfs_new", ret, out);</div><div class='add'>+</div><div class='add'>+    ret = glfs_set_volfile_server(fs, "tcp", hostname, 24007);</div><div class='add'>+    VALIDATE_AND_GOTO_LABEL_ON_ERROR("glfs_set_volfile_server", ret, out);</div><div class='add'>+</div><div class='add'>+    ret = glfs_set_logging(fs, logfile, 7);</div><div class='add'>+    VALIDATE_AND_GOTO_LABEL_ON_ERROR("glfs_set_logging", ret, out);</div><div class='add'>+</div><div class='add'>+    ret = glfs_init(fs);</div><div class='add'>+    VALIDATE_AND_GOTO_LABEL_ON_ERROR("glfs_init", ret, out);</div><div class='add'>+</div><div class='add'>+    fd1 = glfs_creat(fs, filename, flags, 0644);</div><div class='add'>+    if (fd1 == NULL) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        VALIDATE_AND_GOTO_LABEL_ON_ERROR("glfs_creat", ret, out);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = glfs_write(fd1, buff, strlen(buff), flags);</div><div class='add'>+    VALIDATE_AND_GOTO_LABEL_ON_ERROR("glfs_write", ret, out);</div><div class='add'>+</div><div class='add'>+    fd2 = glfs_dup(fd1);</div><div class='add'>+    if (fd2 == NULL) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        VALIDATE_AND_GOTO_LABEL_ON_ERROR("glfs_dup", ret, out);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = glfs_lseek(fd2, 0, SEEK_SET);</div><div class='add'>+    VALIDATE_AND_GOTO_LABEL_ON_ERROR("glfs_lseek", ret, out);</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (fd1 != NULL)</div><div class='add'>+        glfs_close(fd1);</div><div class='add'>+    if (fd2 != NULL)</div><div class='add'>+        glfs_close(fd2);</div><div class='add'>+    if (fs) {</div><div class='add'>+        ret = glfs_fini(fs);</div><div class='add'>+        if (ret)</div><div class='add'>+            fprintf(stderr, "glfs_fini(fs) returned %d\n", ret);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='head'>diff --git a/tests/basic/gfapi/gfapi-dup.t b/tests/basic/gfapi/gfapi-dup.t<br/>new file mode 100755<br/>index 00000000000..849b106f90f<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/gfapi/gfapi-dup.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/gfapi/gfapi-dup.t</a></div><div class='hunk'>@@ -0,0 +1,27 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/brick1;</div><div class='add'>+EXPECT 'Created' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+EXPECT 'Started' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+logdir=`gluster --print-logdir`</div><div class='add'>+</div><div class='add'>+TEST build_tester $(dirname $0)/gfapi-dup.c -lgfapi</div><div class='add'>+</div><div class='add'>+TEST ./$(dirname $0)/gfapi-dup $H0 $V0  $logdir/gfapi-dup.log</div><div class='add'>+</div><div class='add'>+cleanup_tester $(dirname $0)/gfapi-dup</div><div class='add'>+</div><div class='add'>+TEST $CLI volume stop $V0</div><div class='add'>+TEST $CLI volume delete $V0</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/basic/gfapi/gfapi-graph-switch-open-fd.t b/tests/basic/gfapi/gfapi-graph-switch-open-fd.t<br/>new file mode 100644<br/>index 00000000000..2e666be7ec7<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/gfapi/gfapi-graph-switch-open-fd.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/gfapi/gfapi-graph-switch-open-fd.t</a></div><div class='hunk'>@@ -0,0 +1,44 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 replica 3 ${H0}:$B0/brick{0..2};</div><div class='add'>+EXPECT 'Created' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+EXPECT 'Started' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+TEST $GFS --volfile-id=$V0 --volfile-server=$H0 $M0;</div><div class='add'>+TEST touch $M0/sync</div><div class='add'>+logdir=`gluster --print-logdir`</div><div class='add'>+</div><div class='add'>+TEST build_tester $(dirname $0)/gfapi-keep-writing.c -lgfapi</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+#Launch a program to keep doing writes on an fd</div><div class='add'>+./$(dirname $0)/gfapi-keep-writing ${H0} $V0 $logdir/gfapi-async-calls-test.log sync &amp;</div><div class='add'>+p=$!</div><div class='add'>+sleep 1 #Let some writes go through</div><div class='add'>+#Check if graph switch will lead to any pending markers for ever</div><div class='add'>+TEST $CLI volume set $V0 performance.quick-read off</div><div class='add'>+TEST $CLI volume set $V0 performance.io-cache off</div><div class='add'>+TEST $CLI volume set $V0 performance.stat-prefetch off</div><div class='add'>+TEST $CLI volume set $V0 performance.read-ahead off</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+TEST rm -f $M0/sync #Make sure the glfd is closed</div><div class='add'>+TEST wait #Wait for background process to die</div><div class='add'>+#Goal is to check if there is permanent FOOL changelog</div><div class='add'>+sleep 5</div><div class='add'>+EXPECT "0x000000000000000000000000" afr_get_changelog_xattr $B0/brick0/glfs_test.txt trusted.afr.dirty</div><div class='add'>+EXPECT "0x000000000000000000000000" afr_get_changelog_xattr $B0/brick1/glfs_test.txt trusted.afr.dirty</div><div class='add'>+EXPECT "0x000000000000000000000000" afr_get_changelog_xattr $B0/brick2/glfs_test.txt trusted.afr.dirty</div><div class='add'>+</div><div class='add'>+cleanup_tester $(dirname $0)/gfapi-async-calls-test</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/basic/gfapi/gfapi-keep-writing.c b/tests/basic/gfapi/gfapi-keep-writing.c<br/>new file mode 100644<br/>index 00000000000..91b59cea02b<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/gfapi/gfapi-keep-writing.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/gfapi/gfapi-keep-writing.c</a></div><div class='hunk'>@@ -0,0 +1,129 @@</div><div class='add'>+#include &lt;fcntl.h&gt;</div><div class='add'>+#include &lt;unistd.h&gt;</div><div class='add'>+#include &lt;time.h&gt;</div><div class='add'>+#include &lt;limits.h&gt;</div><div class='add'>+#include &lt;string.h&gt;</div><div class='add'>+#include &lt;stdio.h&gt;</div><div class='add'>+#include &lt;stdlib.h&gt;</div><div class='add'>+#include &lt;errno.h&gt;</div><div class='add'>+#include &lt;glusterfs/api/glfs.h&gt;</div><div class='add'>+#include &lt;glusterfs/api/glfs-handles.h&gt;</div><div class='add'>+</div><div class='add'>+#define LOG_ERR(msg)                                                           \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        fprintf(stderr, "%s : Error (%s)\n", msg, strerror(errno));            \</div><div class='add'>+    } while (0)</div><div class='add'>+</div><div class='add'>+glfs_t *</div><div class='add'>+init_glfs(const char *hostname, const char *volname, const char *logfile)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    glfs_t *fs = NULL;</div><div class='add'>+</div><div class='add'>+    fs = glfs_new(volname);</div><div class='add'>+    if (!fs) {</div><div class='add'>+        LOG_ERR("glfs_new failed");</div><div class='add'>+        return NULL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = glfs_set_volfile_server(fs, "tcp", hostname, 24007);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        LOG_ERR("glfs_set_volfile_server failed");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = glfs_set_logging(fs, logfile, 7);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        LOG_ERR("glfs_set_logging failed");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = glfs_init(fs);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        LOG_ERR("glfs_init failed");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+out:</div><div class='add'>+    if (ret) {</div><div class='add'>+        glfs_fini(fs);</div><div class='add'>+        fs = NULL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return fs;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+glfs_test_function(const char *hostname, const char *volname,</div><div class='add'>+                   const char *logfile, const char *syncfile)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int flags = O_CREAT | O_RDWR;</div><div class='add'>+    glfs_t *fs = NULL;</div><div class='add'>+    glfs_fd_t *glfd = NULL;</div><div class='add'>+    const char *buff = "This is from my prog\n";</div><div class='add'>+    const char *filename = "glfs_test.txt";</div><div class='add'>+    struct stat buf = {0};</div><div class='add'>+</div><div class='add'>+    fs = init_glfs(hostname, volname, logfile);</div><div class='add'>+    if (fs == NULL) {</div><div class='add'>+        LOG_ERR("init_glfs failed");</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    glfd = glfs_creat(fs, filename, flags, 0644);</div><div class='add'>+    if (glfd == NULL) {</div><div class='add'>+        LOG_ERR("glfs_creat failed");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    while (glfs_stat(fs, syncfile, &amp;buf) == 0) {</div><div class='add'>+        ret = glfs_write(glfd, buff, strlen(buff), flags);</div><div class='add'>+        if (ret &lt; 0) {</div><div class='add'>+            LOG_ERR("glfs_write failed");</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = glfs_close(glfd);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        LOG_ERR("glfs_write failed");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    ret = glfs_fini(fs);</div><div class='add'>+    if (ret) {</div><div class='add'>+        LOG_ERR("glfs_fini failed");</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+main(int argc, char *argv[])</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+    char *hostname = NULL;</div><div class='add'>+    char *volname = NULL;</div><div class='add'>+    char *logfile = NULL;</div><div class='add'>+    char *syncfile = NULL;</div><div class='add'>+</div><div class='add'>+    if (argc != 5) {</div><div class='add'>+        fprintf(stderr, "Invalid argument\n");</div><div class='add'>+        exit(1);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    hostname = argv[1];</div><div class='add'>+    volname = argv[2];</div><div class='add'>+    logfile = argv[3];</div><div class='add'>+    syncfile = argv[4];</div><div class='add'>+</div><div class='add'>+    ret = glfs_test_function(hostname, volname, logfile, syncfile);</div><div class='add'>+    if (ret) {</div><div class='add'>+        LOG_ERR("glfs_test_function failed");</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='head'>diff --git a/tests/basic/gfapi/gfapi-load-volfile.c b/tests/basic/gfapi/gfapi-load-volfile.c<br/>new file mode 100644<br/>index 00000000000..fbfc6045cd7<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/gfapi/gfapi-load-volfile.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/gfapi/gfapi-load-volfile.c</a></div><div class='hunk'>@@ -0,0 +1,65 @@</div><div class='add'>+/*</div><div class='add'>+ * Create a glfs instance based on a .vol file</div><div class='add'>+ *</div><div class='add'>+ * This is used to measure memory leaks by initializing a graph through a .vol</div><div class='add'>+ * file and destroying it again.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+#include &lt;stdlib.h&gt;</div><div class='add'>+#include &lt;stdio.h&gt;</div><div class='add'>+#include &lt;string.h&gt;</div><div class='add'>+</div><div class='add'>+#include &lt;glusterfs/api/glfs.h&gt;</div><div class='add'>+</div><div class='add'>+#define PROGNAME "gfapi-load-volfile"</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+usage(FILE *output)</div><div class='add'>+{</div><div class='add'>+    fprintf(output, "Usage: " PROGNAME " &lt;volfile&gt;\n");</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+main(int argc, char **argv)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+    glfs_t *fs = NULL;</div><div class='add'>+</div><div class='add'>+    if (argc != 2) {</div><div class='add'>+        usage(stderr);</div><div class='add'>+        exit(EXIT_FAILURE);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (!strcmp(argv[1], "-h") || !strcmp(argv[1], "-h")) {</div><div class='add'>+        usage(stdout);</div><div class='add'>+        exit(EXIT_SUCCESS);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    fs = glfs_new(PROGNAME);</div><div class='add'>+    if (!fs) {</div><div class='add'>+        perror("glfs_new failed");</div><div class='add'>+        exit(EXIT_FAILURE);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    glfs_set_logging(fs, PROGNAME ".log", 9);</div><div class='add'>+</div><div class='add'>+    ret = glfs_set_volfile(fs, argv[1]);</div><div class='add'>+    if (ret) {</div><div class='add'>+        perror("glfs_set_volfile failed");</div><div class='add'>+        ret = EXIT_FAILURE;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = glfs_init(fs);</div><div class='add'>+    if (ret) {</div><div class='add'>+        perror("glfs_init failed");</div><div class='add'>+        ret = EXIT_FAILURE;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = EXIT_SUCCESS;</div><div class='add'>+out:</div><div class='add'>+    glfs_fini(fs);</div><div class='add'>+</div><div class='add'>+    exit(ret);</div><div class='add'>+}</div><div class='head'>diff --git a/tests/basic/gfapi/gfapi-load-volfile.t b/tests/basic/gfapi/gfapi-load-volfile.t<br/>new file mode 100644<br/>index 00000000000..d914cacd819<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/gfapi/gfapi-load-volfile.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/gfapi/gfapi-load-volfile.t</a></div><div class='hunk'>@@ -0,0 +1,28 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create ${V0} ${H0}:${B0}/brick0</div><div class='add'>+EXPECT 'Created' volinfo_field ${V0} 'Status'</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start ${V0}</div><div class='add'>+EXPECT 'Started' volinfo_field ${V0} 'Status'</div><div class='add'>+</div><div class='add'>+TEST build_tester $(dirname ${0})/gfapi-load-volfile.c -lgfapi</div><div class='add'>+</div><div class='add'>+sed -e "s,@@HOSTNAME@@,${H0},g" -e "s,@@BRICKPATH@@,${B0}/brick0,g" \</div><div class='add'>+            $(dirname ${0})/protocol-client.vol.in \</div><div class='add'>+            &gt; $(dirname ${0})/protocol-client.vol</div><div class='add'>+</div><div class='add'>+TEST ./$(dirname ${0})/gfapi-load-volfile \</div><div class='add'>+             $(dirname ${0})/protocol-client.vol</div><div class='add'>+</div><div class='add'>+cleanup_tester $(dirname ${0})/gfapi-load-volfile</div><div class='add'>+cleanup_tester $(dirname ${0})/protocol-client.vol</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/basic/gfapi/gfapi-ssl-load-volfile-test.c b/tests/basic/gfapi/gfapi-ssl-load-volfile-test.c<br/>new file mode 100644<br/>index 00000000000..7beb8dd1fe4<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/gfapi/gfapi-ssl-load-volfile-test.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/gfapi/gfapi-ssl-load-volfile-test.c</a></div><div class='hunk'>@@ -0,0 +1,127 @@</div><div class='add'>+#include &lt;fcntl.h&gt;</div><div class='add'>+#include &lt;unistd.h&gt;</div><div class='add'>+#include &lt;time.h&gt;</div><div class='add'>+#include &lt;limits.h&gt;</div><div class='add'>+#include &lt;string.h&gt;</div><div class='add'>+#include &lt;stdio.h&gt;</div><div class='add'>+#include &lt;stdlib.h&gt;</div><div class='add'>+#include &lt;errno.h&gt;</div><div class='add'>+#include &lt;glusterfs/api/glfs.h&gt;</div><div class='add'>+#include &lt;glusterfs/api/glfs-handles.h&gt;</div><div class='add'>+</div><div class='add'>+#define LOG_ERR(msg)                                                           \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        fprintf(stderr, "%s : Error (%s)\n", msg, strerror(errno));            \</div><div class='add'>+    } while (0)</div><div class='add'>+</div><div class='add'>+glfs_t *</div><div class='add'>+init_glfs(const char *hostname, const char *volname, const char *volfile,</div><div class='add'>+          const char *logfile)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    glfs_t *fs = NULL;</div><div class='add'>+</div><div class='add'>+    fs = glfs_new(volname);</div><div class='add'>+    if (!fs) {</div><div class='add'>+        LOG_ERR("glfs_new failed");</div><div class='add'>+        return NULL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = glfs_set_volfile(fs, volfile);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        LOG_ERR("glfs_set_volfile failed");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = glfs_set_logging(fs, logfile, 7);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        LOG_ERR("glfs_set_logging failed");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = glfs_init(fs);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        LOG_ERR("glfs_init failed");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+out:</div><div class='add'>+    if (ret) {</div><div class='add'>+        glfs_fini(fs);</div><div class='add'>+        fs = NULL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return fs;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+glfs_test_function(const char *hostname, const char *volname,</div><div class='add'>+                   const char *volfile, const char *logfile)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int flags = O_CREAT | O_RDWR;</div><div class='add'>+    glfs_t *fs = NULL;</div><div class='add'>+    glfs_fd_t *glfd = NULL;</div><div class='add'>+    const char *buff = "This is from my prog\n";</div><div class='add'>+    const char *filename = "glfs_test.txt";</div><div class='add'>+</div><div class='add'>+    fs = init_glfs(hostname, volname, volfile, logfile);</div><div class='add'>+    if (fs == NULL) {</div><div class='add'>+        LOG_ERR("init_glfs failed");</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    glfd = glfs_creat(fs, filename, flags, 0644);</div><div class='add'>+    if (glfd == NULL) {</div><div class='add'>+        LOG_ERR("glfs_creat failed");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = glfs_write(glfd, buff, strlen(buff), flags);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        LOG_ERR("glfs_write failed");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = glfs_close(glfd);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        LOG_ERR("glfs_write failed");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    ret = glfs_fini(fs);</div><div class='add'>+    if (ret) {</div><div class='add'>+        LOG_ERR("glfs_fini failed");</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+main(int argc, char *argv[])</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+    char *hostname = NULL;</div><div class='add'>+    char *volname = NULL;</div><div class='add'>+    char *volfile = NULL;</div><div class='add'>+    char *logfile = NULL;</div><div class='add'>+</div><div class='add'>+    if (argc != 5) {</div><div class='add'>+        fprintf(stderr, "Invalid argument\n");</div><div class='add'>+        exit(1);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    hostname = argv[1];</div><div class='add'>+    volname = argv[2];</div><div class='add'>+    volfile = argv[3];</div><div class='add'>+    logfile = argv[4];</div><div class='add'>+</div><div class='add'>+    ret = glfs_test_function(hostname, volname, volfile, logfile);</div><div class='add'>+    if (ret) {</div><div class='add'>+        LOG_ERR("glfs_test_function failed");</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='head'>diff --git a/tests/basic/gfapi/gfapi-ssl-load-volfile-test.t b/tests/basic/gfapi/gfapi-ssl-load-volfile-test.t<br/>new file mode 100755<br/>index 00000000000..8e94df9d321<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/gfapi/gfapi-ssl-load-volfile-test.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/gfapi/gfapi-ssl-load-volfile-test.t</a></div><div class='hunk'>@@ -0,0 +1,76 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+. $(dirname $0)/../../traps.rc</div><div class='add'>+. $(dirname $0)/../../ssl.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+sed -e "s,@@HOSTNAME@@,${H0},g" -e "s,@@BRICKPATH@@,${B0}/brick1,g" \</div><div class='add'>+            -e "s,@@SSL@@,off,g" \</div><div class='add'>+            $(dirname ${0})/protocol-client-ssl.vol.in \</div><div class='add'>+            &gt; $(dirname ${0})/protocol-client-ssl.vol</div><div class='add'>+</div><div class='add'>+TEST create_self_signed_certs</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/brick1;</div><div class='add'>+EXPECT 'Created' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+EXPECT 'Started' volinfo_field $V0 'Status';</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" online_brick_count</div><div class='add'>+</div><div class='add'>+logdir=`gluster --print-logdir`</div><div class='add'>+</div><div class='add'>+TEST build_tester $(dirname $0)/gfapi-ssl-load-volfile-test.c -lgfapi</div><div class='add'>+</div><div class='add'>+# Run test without I/O or management encryption</div><div class='add'>+TEST $(dirname $0)/gfapi-ssl-load-volfile-test $H0 $V0 \</div><div class='add'>+        $(dirname ${0})/protocol-client-ssl.vol \</div><div class='add'>+        $logdir/gfapi-ssl-load-volfile-test.log</div><div class='add'>+</div><div class='add'>+# Enable management encryption</div><div class='add'>+touch $GLUSTERD_WORKDIR/secure-access</div><div class='add'>+</div><div class='add'>+killall_gluster</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" online_brick_count</div><div class='add'>+</div><div class='add'>+# Run test with management encryption (No I/O encryption)</div><div class='add'>+TEST $(dirname $0)/gfapi-ssl-load-volfile-test $H0 $V0 \</div><div class='add'>+        $(dirname ${0})/protocol-client-ssl.vol \</div><div class='add'>+        $logdir/gfapi-ssl-load-volfile-test.log</div><div class='add'>+</div><div class='add'>+# Enable I/O encryption</div><div class='add'>+TEST $CLI volume set $V0 server.ssl on</div><div class='add'>+</div><div class='add'>+killall_gluster</div><div class='add'>+</div><div class='add'>+sed -e "s,@@HOSTNAME@@,${H0},g" -e "s,@@BRICKPATH@@,${B0}/brick1,g" \</div><div class='add'>+            -e "s,@@SSL@@,on,g" \</div><div class='add'>+            $(dirname ${0})/protocol-client-ssl.vol.in \</div><div class='add'>+            &gt; $(dirname ${0})/protocol-client-ssl.vol</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" online_brick_count</div><div class='add'>+</div><div class='add'>+# Run test without I/O or management encryption</div><div class='add'>+TEST $(dirname $0)/gfapi-ssl-load-volfile-test $H0 $V0 \</div><div class='add'>+        $(dirname ${0})/protocol-client-ssl.vol \</div><div class='add'>+        $logdir/gfapi-ssl-load-volfile-test.log</div><div class='add'>+</div><div class='add'>+cleanup_tester $(dirname $0)/gfapi-ssl-load-volfile-test</div><div class='add'>+</div><div class='add'>+TEST $CLI volume stop $V0</div><div class='add'>+TEST $CLI volume delete $V0</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+# NetBSD build scripts are not up to date therefore this test</div><div class='add'>+# is failing in NetBSD. Therefore skipping the test in NetBSD</div><div class='add'>+# as of now.</div><div class='add'>+#G_TESTDEF_TEST_STATUS_NETBSD7=KNOWN_ISSUE,BUG=000000</div><div class='head'>diff --git a/tests/basic/gfapi/gfapi-ssl-test.c b/tests/basic/gfapi/gfapi-ssl-test.c<br/>new file mode 100644<br/>index 00000000000..a27b5233702<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/gfapi/gfapi-ssl-test.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/gfapi/gfapi-ssl-test.c</a></div><div class='hunk'>@@ -0,0 +1,124 @@</div><div class='add'>+#include &lt;fcntl.h&gt;</div><div class='add'>+#include &lt;unistd.h&gt;</div><div class='add'>+#include &lt;time.h&gt;</div><div class='add'>+#include &lt;limits.h&gt;</div><div class='add'>+#include &lt;string.h&gt;</div><div class='add'>+#include &lt;stdio.h&gt;</div><div class='add'>+#include &lt;stdlib.h&gt;</div><div class='add'>+#include &lt;errno.h&gt;</div><div class='add'>+#include &lt;glusterfs/api/glfs.h&gt;</div><div class='add'>+#include &lt;glusterfs/api/glfs-handles.h&gt;</div><div class='add'>+</div><div class='add'>+#define LOG_ERR(msg)                                                           \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        fprintf(stderr, "%s : Error (%s)\n", msg, strerror(errno));            \</div><div class='add'>+    } while (0)</div><div class='add'>+</div><div class='add'>+glfs_t *</div><div class='add'>+init_glfs(const char *hostname, const char *volname, const char *logfile)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    glfs_t *fs = NULL;</div><div class='add'>+</div><div class='add'>+    fs = glfs_new(volname);</div><div class='add'>+    if (!fs) {</div><div class='add'>+        LOG_ERR("glfs_new failed");</div><div class='add'>+        return NULL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = glfs_set_volfile_server(fs, "tcp", hostname, 24007);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        LOG_ERR("glfs_set_volfile_server failed");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = glfs_set_logging(fs, logfile, 7);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        LOG_ERR("glfs_set_logging failed");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = glfs_init(fs);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        LOG_ERR("glfs_init failed");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+out:</div><div class='add'>+    if (ret) {</div><div class='add'>+        glfs_fini(fs);</div><div class='add'>+        fs = NULL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return fs;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+glfs_test_function(const char *hostname, const char *volname,</div><div class='add'>+                   const char *logfile)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int flags = O_CREAT | O_RDWR;</div><div class='add'>+    glfs_t *fs = NULL;</div><div class='add'>+    glfs_fd_t *glfd = NULL;</div><div class='add'>+    const char *buff = "This is from my prog\n";</div><div class='add'>+    const char *filename = "glfs_test.txt";</div><div class='add'>+</div><div class='add'>+    fs = init_glfs(hostname, volname, logfile);</div><div class='add'>+    if (fs == NULL) {</div><div class='add'>+        LOG_ERR("init_glfs failed");</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    glfd = glfs_creat(fs, filename, flags, 0644);</div><div class='add'>+    if (glfd == NULL) {</div><div class='add'>+        LOG_ERR("glfs_creat failed");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = glfs_write(glfd, buff, strlen(buff), flags);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        LOG_ERR("glfs_write failed");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = glfs_close(glfd);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        LOG_ERR("glfs_write failed");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    ret = glfs_fini(fs);</div><div class='add'>+    if (ret) {</div><div class='add'>+        LOG_ERR("glfs_fini failed");</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+main(int argc, char *argv[])</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+    char *hostname = NULL;</div><div class='add'>+    char *volname = NULL;</div><div class='add'>+    char *logfile = NULL;</div><div class='add'>+</div><div class='add'>+    if (argc != 4) {</div><div class='add'>+        fprintf(stderr, "Invalid argument\n");</div><div class='add'>+        exit(1);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    hostname = argv[1];</div><div class='add'>+    volname = argv[2];</div><div class='add'>+    logfile = argv[3];</div><div class='add'>+</div><div class='add'>+    ret = glfs_test_function(hostname, volname, logfile);</div><div class='add'>+    if (ret) {</div><div class='add'>+        LOG_ERR("glfs_test_function failed");</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='head'>diff --git a/tests/basic/gfapi/gfapi-ssl-test.t b/tests/basic/gfapi/gfapi-ssl-test.t<br/>new file mode 100755<br/>index 00000000000..937fcc83a4c<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/gfapi/gfapi-ssl-test.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/gfapi/gfapi-ssl-test.t</a></div><div class='hunk'>@@ -0,0 +1,61 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+. $(dirname $0)/../../traps.rc</div><div class='add'>+. $(dirname $0)/../../ssl.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST create_self_signed_certs</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/brick1;</div><div class='add'>+EXPECT 'Created' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+EXPECT 'Started' volinfo_field $V0 'Status';</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" online_brick_count</div><div class='add'>+</div><div class='add'>+logdir=`gluster --print-logdir`</div><div class='add'>+</div><div class='add'>+TEST build_tester $(dirname $0)/gfapi-ssl-test.c -lgfapi</div><div class='add'>+</div><div class='add'>+# Run test without I/O or management encryption</div><div class='add'>+TEST ./$(dirname $0)/gfapi-ssl-test $H0 $V0 $logdir/gfapi-ssl-test.log</div><div class='add'>+</div><div class='add'>+# Enable management encryption</div><div class='add'>+touch  $GLUSTERD_WORKDIR/secure-access</div><div class='add'>+</div><div class='add'>+killall_gluster</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" online_brick_count</div><div class='add'>+</div><div class='add'>+# Run test with management encryption (No I/O encryption)</div><div class='add'>+TEST ./$(dirname $0)/gfapi-ssl-test $H0 $V0 $logdir/gfapi-ssl-test.log</div><div class='add'>+</div><div class='add'>+# Enable I/O encryption</div><div class='add'>+TEST $CLI volume set $V0 client.ssl on</div><div class='add'>+TEST $CLI volume set $V0 server.ssl on</div><div class='add'>+</div><div class='add'>+killall_gluster</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" online_brick_count</div><div class='add'>+</div><div class='add'>+# Run test without I/O or management encryption</div><div class='add'>+TEST ./$(dirname $0)/gfapi-ssl-test $H0 $V0 $logdir/gfapi-ssl-test.log</div><div class='add'>+</div><div class='add'>+cleanup_tester $(dirname $0)/gfapi-ssl-test</div><div class='add'>+</div><div class='add'>+TEST $CLI volume stop $V0</div><div class='add'>+TEST $CLI volume delete $V0</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+# NetBSD build scripts are not up to date therefore this test</div><div class='add'>+# is failing in NetBSD. Therefore skipping the test in NetBSD</div><div class='add'>+# as of now.</div><div class='add'>+#G_TESTDEF_TEST_STATUS_NETBSD7=KNOWN_ISSUE,BUG=000000</div><div class='head'>diff --git a/tests/basic/gfapi/gfapi-statx-basic.c b/tests/basic/gfapi/gfapi-statx-basic.c<br/>new file mode 100644<br/>index 00000000000..a4943fa0fd1<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/gfapi/gfapi-statx-basic.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/gfapi/gfapi-statx-basic.c</a></div><div class='hunk'>@@ -0,0 +1,184 @@</div><div class='add'>+#include &lt;stdio.h&gt;</div><div class='add'>+#include &lt;errno.h&gt;</div><div class='add'>+#include &lt;string.h&gt;</div><div class='add'>+#include &lt;stdbool.h&gt;</div><div class='add'>+#include &lt;sys/types.h&gt;</div><div class='add'>+#include &lt;sys/stat.h&gt;</div><div class='add'>+#include &lt;unistd.h&gt;</div><div class='add'>+#include &lt;glusterfs/api/glfs.h&gt;</div><div class='add'>+</div><div class='add'>+#define VALIDATE_AND_GOTO_LABEL_ON_ERROR(func, ret, label)                     \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        if (ret &lt; 0) {                                                         \</div><div class='add'>+            fprintf(stderr, "%s : returned error %d (%s)\n", func, ret,        \</div><div class='add'>+                    strerror(errno));                                          \</div><div class='add'>+            goto label;                                                        \</div><div class='add'>+        }                                                                      \</div><div class='add'>+    } while (0)</div><div class='add'>+</div><div class='add'>+#define GOTO_LABEL_ON_FALSE(compstr, ret, label)                               \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        if (ret == false) {                                                    \</div><div class='add'>+            fprintf(stderr, "%s : comparison failed!\n", compstr);             \</div><div class='add'>+            goto label;                                                        \</div><div class='add'>+        }                                                                      \</div><div class='add'>+    } while (0)</div><div class='add'>+</div><div class='add'>+#define WRITE_SIZE 513</div><div class='add'>+#define TRUNC_SIZE 4096</div><div class='add'>+</div><div class='add'>+/* Using private function and hence providing a forward declation in sync with</div><div class='add'>+code in glfs-internal.h */</div><div class='add'>+int</div><div class='add'>+glfs_statx(struct glfs *fs, const char *path, unsigned int mask,</div><div class='add'>+           struct glfs_stat *statxbuf);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+main(int argc, char *argv[])</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int flags = O_RDWR | O_SYNC;</div><div class='add'>+    glfs_t *fs = NULL;</div><div class='add'>+    glfs_fd_t *fd1 = NULL;</div><div class='add'>+    char *volname = NULL;</div><div class='add'>+    char *logfile = NULL;</div><div class='add'>+    const char *filename = "file_tmp";</div><div class='add'>+    const char buff[WRITE_SIZE];</div><div class='add'>+    struct stat sb;</div><div class='add'>+    unsigned int mask;</div><div class='add'>+    struct glfs_stat statx;</div><div class='add'>+    bool bret;</div><div class='add'>+</div><div class='add'>+    if (argc != 3) {</div><div class='add'>+        fprintf(stderr, "Invalid argument\n");</div><div class='add'>+        fprintf(stderr, "Usage: %s &lt;volname&gt; &lt;logfile&gt;\n", argv[0]);</div><div class='add'>+        return 1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    volname = argv[1];</div><div class='add'>+    logfile = argv[2];</div><div class='add'>+</div><div class='add'>+    fs = glfs_new(volname);</div><div class='add'>+    if (!fs)</div><div class='add'>+        VALIDATE_AND_GOTO_LABEL_ON_ERROR("glfs_new", ret, out);</div><div class='add'>+</div><div class='add'>+    ret = glfs_set_volfile_server(fs, "tcp", "localhost", 24007);</div><div class='add'>+    VALIDATE_AND_GOTO_LABEL_ON_ERROR("glfs_set_volfile_server", ret, out);</div><div class='add'>+</div><div class='add'>+    ret = glfs_set_logging(fs, logfile, 7);</div><div class='add'>+    VALIDATE_AND_GOTO_LABEL_ON_ERROR("glfs_set_logging", ret, out);</div><div class='add'>+</div><div class='add'>+    ret = glfs_init(fs);</div><div class='add'>+    VALIDATE_AND_GOTO_LABEL_ON_ERROR("glfs_init", ret, out);</div><div class='add'>+</div><div class='add'>+    fd1 = glfs_creat(fs, filename, flags, 0644);</div><div class='add'>+    if (fd1 == NULL) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        VALIDATE_AND_GOTO_LABEL_ON_ERROR("glfs_creat", ret, out);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = glfs_truncate(fs, filename, TRUNC_SIZE);</div><div class='add'>+    VALIDATE_AND_GOTO_LABEL_ON_ERROR("glfs_truncate", ret, out);</div><div class='add'>+</div><div class='add'>+    ret = glfs_write(fd1, buff, WRITE_SIZE, flags);</div><div class='add'>+    VALIDATE_AND_GOTO_LABEL_ON_ERROR("glfs_write", ret, out);</div><div class='add'>+</div><div class='add'>+    ret = glfs_fstat(fd1, &amp;sb);</div><div class='add'>+    VALIDATE_AND_GOTO_LABEL_ON_ERROR("glfs_fstat", ret, out);</div><div class='add'>+</div><div class='add'>+    if (sb.st_size != TRUNC_SIZE) {</div><div class='add'>+        fprintf(stderr, "wrong size %jd should be %jd\n", (intmax_t)sb.st_size,</div><div class='add'>+                (intmax_t)2048);</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    glfs_close(fd1);</div><div class='add'>+    fd1 = NULL;</div><div class='add'>+</div><div class='add'>+    /* TEST 1: Invalid mask to statx */</div><div class='add'>+    mask = 0xfafadbdb;</div><div class='add'>+    ret = glfs_statx(fs, filename, mask, NULL);</div><div class='add'>+    if (ret == 0 || ((ret == -1) &amp;&amp; (errno != EINVAL))) {</div><div class='add'>+        fprintf(stderr,</div><div class='add'>+                "Invalid args passed, but error returned is"</div><div class='add'>+                " incorrect (ret - %d, errno - %d)\n",</div><div class='add'>+                ret, errno);</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    ret = 0;</div><div class='add'>+</div><div class='add'>+    /* TEST 2: Call statx and validate fields against prior fstat data */</div><div class='add'>+    /* NOTE: This fails, as iatt-&gt;ia_flags are not carried through the stack,</div><div class='add'>+     * for example if mdc_to_iatt is invoked to serve cached stat, we will loose</div><div class='add'>+     * the flags. */</div><div class='add'>+    mask = GLFS_STAT_ALL;</div><div class='add'>+    ret = glfs_statx(fs, filename, mask, &amp;statx);</div><div class='add'>+    VALIDATE_AND_GOTO_LABEL_ON_ERROR("glfs_statx", ret, out);</div><div class='add'>+</div><div class='add'>+    if ((statx.glfs_st_mask &amp; GLFS_STAT_BASIC_STATS) != GLFS_STAT_BASIC_STATS) {</div><div class='add'>+        fprintf(stderr, "Invalid glfs_st_mask, expecting 0x%x got 0x%x\n",</div><div class='add'>+                GLFS_STAT_ALL, statx.glfs_st_mask);</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    bret = (sb.st_ino == statx.glfs_st_ino);</div><div class='add'>+    GOTO_LABEL_ON_FALSE("(sb.st_ino == statx.glfs_st_ino)", bret, out);</div><div class='add'>+</div><div class='add'>+    bret = (sb.st_mode == statx.glfs_st_mode);</div><div class='add'>+    GOTO_LABEL_ON_FALSE("(sb.st_mode == statx.glfs_st_mode)", bret, out);</div><div class='add'>+</div><div class='add'>+    bret = (sb.st_nlink == statx.glfs_st_nlink);</div><div class='add'>+    GOTO_LABEL_ON_FALSE("(sb.st_nlink == statx.glfs_st_nlink)", bret, out);</div><div class='add'>+</div><div class='add'>+    bret = (sb.st_uid == statx.glfs_st_uid);</div><div class='add'>+    GOTO_LABEL_ON_FALSE("(sb.st_uid == statx.glfs_st_uid)", bret, out);</div><div class='add'>+</div><div class='add'>+    bret = (sb.st_gid == statx.glfs_st_gid);</div><div class='add'>+    GOTO_LABEL_ON_FALSE("(sb.st_gid == statx.glfs_st_gid)", bret, out);</div><div class='add'>+</div><div class='add'>+    bret = (sb.st_size == statx.glfs_st_size);</div><div class='add'>+    GOTO_LABEL_ON_FALSE("(sb.st_size == statx.glfs_st_size)", bret, out);</div><div class='add'>+</div><div class='add'>+    bret = (sb.st_blksize == statx.glfs_st_blksize);</div><div class='add'>+    GOTO_LABEL_ON_FALSE("(sb.st_blksize == statx.glfs_st_blksize)", bret, out);</div><div class='add'>+</div><div class='add'>+    bret = (sb.st_blocks == statx.glfs_st_blocks);</div><div class='add'>+    GOTO_LABEL_ON_FALSE("(sb.st_blocks == statx.glfs_st_blocks)", bret, out);</div><div class='add'>+</div><div class='add'>+    bret = (!memcmp(&amp;sb.st_atim, &amp;statx.glfs_st_atime,</div><div class='add'>+                    sizeof(struct timespec)));</div><div class='add'>+    GOTO_LABEL_ON_FALSE("(sb.st_atim == statx.glfs_st_atime)", bret, out);</div><div class='add'>+</div><div class='add'>+    bret = (!memcmp(&amp;sb.st_mtim, &amp;statx.glfs_st_mtime,</div><div class='add'>+                    sizeof(struct timespec)));</div><div class='add'>+    GOTO_LABEL_ON_FALSE("(sb.st_mtim == statx.glfs_st_mtime)", bret, out);</div><div class='add'>+</div><div class='add'>+    bret = (!memcmp(&amp;sb.st_ctim, &amp;statx.glfs_st_ctime,</div><div class='add'>+                    sizeof(struct timespec)));</div><div class='add'>+    GOTO_LABEL_ON_FALSE("(sb.st_ctim == statx.glfs_st_ctime)", bret, out);</div><div class='add'>+</div><div class='add'>+    /* TEST 3: Check if partial masks are accepted */</div><div class='add'>+    mask = GLFS_STAT_TYPE | GLFS_STAT_UID | GLFS_STAT_GID;</div><div class='add'>+    ret = glfs_statx(fs, filename, mask, &amp;statx);</div><div class='add'>+    VALIDATE_AND_GOTO_LABEL_ON_ERROR("glfs_statx", ret, out);</div><div class='add'>+</div><div class='add'>+    /* We currently still return all stats, as is acceptable based on the API</div><div class='add'>+     * definition in the header (and in statx as well) */</div><div class='add'>+    if ((statx.glfs_st_mask &amp; GLFS_STAT_BASIC_STATS) != GLFS_STAT_BASIC_STATS) {</div><div class='add'>+        fprintf(stderr, "Invalid glfs_st_mask, expecting 0x%x got 0x%x\n",</div><div class='add'>+                GLFS_STAT_ALL, statx.glfs_st_mask);</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+out:</div><div class='add'>+    if (fd1 != NULL)</div><div class='add'>+        glfs_close(fd1);</div><div class='add'>+    if (fs) {</div><div class='add'>+        (void)glfs_fini(fs);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='head'>diff --git a/tests/basic/gfapi/gfapi-statx-basic.t b/tests/basic/gfapi/gfapi-statx-basic.t<br/>new file mode 100755<br/>index 00000000000..d9acbce2f99<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/gfapi/gfapi-statx-basic.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/gfapi/gfapi-statx-basic.t</a></div><div class='hunk'>@@ -0,0 +1,30 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 ${H0}:$B0/brick1;</div><div class='add'>+EXPECT 'Created' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+EXPECT 'Started' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+# NOTE: Test is passing due to very specific volume configuration</div><div class='add'>+# Disable md-cache, as it does not save and return ia_flags from iatt</div><div class='add'>+# This is possibly going to be true of other xlators as well (ec/afr), need to</div><div class='add'>+# ensure these are fixed, or hack statx to return all basic attrs anyway.</div><div class='add'>+TEST $CLI volume set $V0 performance.md-cache-timeout 0</div><div class='add'>+</div><div class='add'>+logdir=`gluster --print-logdir`</div><div class='add'>+</div><div class='add'>+build_tester $(dirname $0)/gfapi-statx-basic.c -lgfapi</div><div class='add'>+</div><div class='add'>+TEST ./$(dirname $0)/gfapi-statx-basic $V0 $logdir/gfapi-statx-basic.log</div><div class='add'>+</div><div class='add'>+cleanup_tester $(dirname $0)/gfapi-statx-basic</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/basic/gfapi/gfapi-trunc.c b/tests/basic/gfapi/gfapi-trunc.c<br/>new file mode 100644<br/>index 00000000000..769f6cfa1d9<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/gfapi/gfapi-trunc.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/gfapi/gfapi-trunc.c</a></div><div class='hunk'>@@ -0,0 +1,89 @@</div><div class='add'>+#include &lt;inttypes.h&gt;</div><div class='add'>+#include &lt;stdio.h&gt;</div><div class='add'>+#include &lt;string.h&gt;</div><div class='add'>+#include &lt;errno.h&gt;</div><div class='add'>+#include &lt;glusterfs/api/glfs.h&gt;</div><div class='add'>+#include &lt;glusterfs/api/glfs-handles.h&gt;</div><div class='add'>+</div><div class='add'>+#define VALIDATE_AND_GOTO_LABEL_ON_ERROR(func, ret, label)                     \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        if (ret &lt; 0) {                                                         \</div><div class='add'>+            fprintf(stderr, "%s : returned error %d (%s)\n", func, ret,        \</div><div class='add'>+                    strerror(errno));                                          \</div><div class='add'>+            goto label;                                                        \</div><div class='add'>+        }                                                                      \</div><div class='add'>+    } while (0)</div><div class='add'>+</div><div class='add'>+#define WRITE_SIZE 4096</div><div class='add'>+#define TRUNC_SIZE 1234</div><div class='add'>+/* Make sure TRUNC_SIZE is smaller than WRITE_SIZE at compile time. */</div><div class='add'>+typedef char _size_check[WRITE_SIZE - TRUNC_SIZE];</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+main(int argc, char *argv[])</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int flags = O_RDWR | O_SYNC;</div><div class='add'>+    glfs_t *fs = NULL;</div><div class='add'>+    glfs_fd_t *fd1 = NULL;</div><div class='add'>+    char *volname = NULL;</div><div class='add'>+    char *logfile = NULL;</div><div class='add'>+    const char *filename = "file_tmp";</div><div class='add'>+    const char buff[WRITE_SIZE];</div><div class='add'>+    struct stat sb;</div><div class='add'>+</div><div class='add'>+    if (argc != 3) {</div><div class='add'>+        fprintf(stderr, "Invalid argument\n");</div><div class='add'>+        return 1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    volname = argv[1];</div><div class='add'>+    logfile = argv[2];</div><div class='add'>+</div><div class='add'>+    fs = glfs_new(volname);</div><div class='add'>+    if (!fs)</div><div class='add'>+        VALIDATE_AND_GOTO_LABEL_ON_ERROR("glfs_new", ret, out);</div><div class='add'>+</div><div class='add'>+    ret = glfs_set_volfile_server(fs, "tcp", "localhost", 24007);</div><div class='add'>+    VALIDATE_AND_GOTO_LABEL_ON_ERROR("glfs_set_volfile_server", ret, out);</div><div class='add'>+</div><div class='add'>+    ret = glfs_set_logging(fs, logfile, 7);</div><div class='add'>+    VALIDATE_AND_GOTO_LABEL_ON_ERROR("glfs_set_logging", ret, out);</div><div class='add'>+</div><div class='add'>+    ret = glfs_init(fs);</div><div class='add'>+    VALIDATE_AND_GOTO_LABEL_ON_ERROR("glfs_init", ret, out);</div><div class='add'>+</div><div class='add'>+    fd1 = glfs_creat(fs, filename, flags, 0644);</div><div class='add'>+    if (fd1 == NULL) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        VALIDATE_AND_GOTO_LABEL_ON_ERROR("glfs_creat", ret, out);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = glfs_write(fd1, buff, WRITE_SIZE, flags);</div><div class='add'>+    VALIDATE_AND_GOTO_LABEL_ON_ERROR("glfs_write", ret, out);</div><div class='add'>+</div><div class='add'>+    ret = glfs_truncate(fs, filename, TRUNC_SIZE);</div><div class='add'>+    VALIDATE_AND_GOTO_LABEL_ON_ERROR("glfs_truncate", ret, out);</div><div class='add'>+</div><div class='add'>+    ret = glfs_fstat(fd1, &amp;sb);</div><div class='add'>+    VALIDATE_AND_GOTO_LABEL_ON_ERROR("glfs_fstat", ret, out);</div><div class='add'>+</div><div class='add'>+    if (sb.st_size != TRUNC_SIZE) {</div><div class='add'>+        fprintf(stderr, "wrong size %jd should be %jd\n", (intmax_t)sb.st_size,</div><div class='add'>+                (intmax_t)2048);</div><div class='add'>+        ret = -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (fd1 != NULL)</div><div class='add'>+        glfs_close(fd1);</div><div class='add'>+    if (fs) {</div><div class='add'>+        /*</div><div class='add'>+         * If this fails (as it does on Special Snowflake NetBSD for no</div><div class='add'>+         * good reason), it shouldn't affect the result of the test.</div><div class='add'>+         */</div><div class='add'>+        (void)glfs_fini(fs);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='head'>diff --git a/tests/basic/gfapi/gfapi-trunc.t b/tests/basic/gfapi/gfapi-trunc.t<br/>new file mode 100644<br/>index 00000000000..4943a6be898<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/gfapi/gfapi-trunc.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/gfapi/gfapi-trunc.t</a></div><div class='hunk'>@@ -0,0 +1,22 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 ${H0}:$B0/brick1;</div><div class='add'>+EXPECT 'Created' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+EXPECT 'Started' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+logdir=`gluster --print-logdir`</div><div class='add'>+</div><div class='add'>+build_tester $(dirname $0)/gfapi-trunc.c -lgfapi</div><div class='add'>+</div><div class='add'>+TEST ./$(dirname $0)/gfapi-trunc $V0 $logdir/gfapi-trunc.log</div><div class='add'>+</div><div class='add'>+cleanup_tester $(dirname $0)/gfapi-trunc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/basic/gfapi/glfd-lkowner.c b/tests/basic/gfapi/glfd-lkowner.c<br/>new file mode 100644<br/>index 00000000000..ec0429dc3c4<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/gfapi/glfd-lkowner.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/gfapi/glfd-lkowner.c</a></div><div class='hunk'>@@ -0,0 +1,214 @@</div><div class='add'>+#include &lt;fcntl.h&gt;</div><div class='add'>+#include &lt;unistd.h&gt;</div><div class='add'>+#include &lt;time.h&gt;</div><div class='add'>+#include &lt;limits.h&gt;</div><div class='add'>+#include &lt;string.h&gt;</div><div class='add'>+#include &lt;stdio.h&gt;</div><div class='add'>+#include &lt;stdlib.h&gt;</div><div class='add'>+#include &lt;errno.h&gt;</div><div class='add'>+#include &lt;glusterfs/api/glfs.h&gt;</div><div class='add'>+#include &lt;glusterfs/api/glfs-handles.h&gt;</div><div class='add'>+#include &lt;sys/wait.h&gt;</div><div class='add'>+#include &lt;stdbool.h&gt;</div><div class='add'>+</div><div class='add'>+int gfapi = 1;</div><div class='add'>+</div><div class='add'>+#define LOG_ERR(func, ret)                                                     \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        if (ret != 0) {                                                        \</div><div class='add'>+            fprintf(stderr, "%s : returned error %d (%s)\n", func, ret,        \</div><div class='add'>+                    strerror(errno));                                          \</div><div class='add'>+            goto out;                                                          \</div><div class='add'>+        } else {                                                               \</div><div class='add'>+            fprintf(stderr, "%s : returned %d\n", func, ret);                  \</div><div class='add'>+        }                                                                      \</div><div class='add'>+    } while (0)</div><div class='add'>+</div><div class='add'>+char lownera[8] = "lownera", lownerb[8] = "lownerb";</div><div class='add'>+char lownerc[8] = "lownerc";</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+lock_test(glfs_fd_t *glfd1, glfs_fd_t *glfd2, bool should_fail, int l1_start,</div><div class='add'>+          int l1_len, char *l1_owner, int lo1_len, int l2_start, int l2_len,</div><div class='add'>+          char *l2_owner, int lo2_len)</div><div class='add'>+{</div><div class='add'>+    int ret = -1, f_ret = -1;</div><div class='add'>+    struct flock lock1 =</div><div class='add'>+                     {</div><div class='add'>+                         0,</div><div class='add'>+                     },</div><div class='add'>+                 lock2 = {</div><div class='add'>+                     0,</div><div class='add'>+                 };</div><div class='add'>+</div><div class='add'>+lock1:</div><div class='add'>+    if (!glfd1)</div><div class='add'>+        goto lock2;</div><div class='add'>+</div><div class='add'>+    /* lock on glfd1 */</div><div class='add'>+    lock1.l_type = F_WRLCK;</div><div class='add'>+    lock1.l_whence = SEEK_SET;</div><div class='add'>+    lock1.l_start = l1_start;</div><div class='add'>+    lock1.l_len = l1_len;</div><div class='add'>+</div><div class='add'>+    ret = glfs_fd_set_lkowner(glfd1, l1_owner, lo1_len);</div><div class='add'>+    LOG_ERR("glfs_fd_set_lkowner on glfd1", ret);</div><div class='add'>+</div><div class='add'>+    ret = glfs_posix_lock(glfd1, F_SETLK, &amp;lock1);</div><div class='add'>+    LOG_ERR("glfs_posix_lock on glfd1", ret);</div><div class='add'>+</div><div class='add'>+lock2:</div><div class='add'>+    if (!glfd2)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    /* lock on glfd2 */</div><div class='add'>+    lock2.l_type = F_WRLCK;</div><div class='add'>+    lock2.l_whence = SEEK_SET;</div><div class='add'>+    lock2.l_start = l2_start;</div><div class='add'>+    lock2.l_len = l2_len;</div><div class='add'>+</div><div class='add'>+    ret = glfs_fd_set_lkowner(glfd2, l2_owner, lo2_len);</div><div class='add'>+    LOG_ERR("glfs_fd_set_lkowner on glfd2", ret);</div><div class='add'>+</div><div class='add'>+    ret = glfs_posix_lock(glfd2, F_SETLK, &amp;lock2);</div><div class='add'>+</div><div class='add'>+    if (should_fail &amp;&amp; ret) {</div><div class='add'>+        f_ret = 0;</div><div class='add'>+    } else if (!ret &amp;&amp; !should_fail) {</div><div class='add'>+        f_ret = 0;</div><div class='add'>+    } else {</div><div class='add'>+        f_ret = -1;</div><div class='add'>+    }</div><div class='add'>+out:</div><div class='add'>+    fprintf(stderr,</div><div class='add'>+            "Lock test on glfd1 (start(%d), len(%d),"</div><div class='add'>+            " lk_owner(%s)) and glfd2 (start(%d), len(%d), "</div><div class='add'>+            "lk_owner(%s)) - expected(%s) - result(%s)\n",</div><div class='add'>+            l1_start, l1_len, l1_owner, l2_start, l2_len, l2_owner,</div><div class='add'>+            (should_fail ? "FAIL" : "SUCCESS"), (ret ? "FAIL" : "SUCCESS"));</div><div class='add'>+    return f_ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+main(int argc, char *argv[])</div><div class='add'>+{</div><div class='add'>+    glfs_t *fs = NULL;</div><div class='add'>+    int ret = 0, i, status = 0;</div><div class='add'>+    glfs_fd_t *fd1 = NULL;</div><div class='add'>+    glfs_fd_t *fd2 = NULL;</div><div class='add'>+    glfs_fd_t *fd3 = NULL;</div><div class='add'>+    char *filename = "file_tmp";</div><div class='add'>+    char *volname = NULL;</div><div class='add'>+    char *logfile = NULL;</div><div class='add'>+    char *hostname = NULL;</div><div class='add'>+</div><div class='add'>+    if (argc != 4) {</div><div class='add'>+        fprintf(stderr, "Invalid argument\n");</div><div class='add'>+        exit(1);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    hostname = argv[1];</div><div class='add'>+    volname = argv[2];</div><div class='add'>+    logfile = argv[3];</div><div class='add'>+</div><div class='add'>+    fs = glfs_new(volname);</div><div class='add'>+    if (!fs) {</div><div class='add'>+        fprintf(stderr, "glfs_new: returned NULL\n");</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = glfs_set_volfile_server(fs, "tcp", hostname, 24007);</div><div class='add'>+    LOG_ERR("glfs_set_volfile_server", ret);</div><div class='add'>+</div><div class='add'>+    ret = glfs_set_logging(fs, logfile, 7);</div><div class='add'>+    LOG_ERR("glfs_set_logging", ret);</div><div class='add'>+</div><div class='add'>+    ret = glfs_init(fs);</div><div class='add'>+    LOG_ERR("glfs_init", ret);</div><div class='add'>+</div><div class='add'>+    fd1 = glfs_creat(fs, filename, O_RDWR | O_SYNC, 0644);</div><div class='add'>+    if (fd1 &lt;= 0) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        LOG_ERR("glfs_creat", ret);</div><div class='add'>+    }</div><div class='add'>+    fprintf(stderr, "glfs-create fd1 - %d\n", fd1);</div><div class='add'>+</div><div class='add'>+    fd2 = glfs_dup(fd1);</div><div class='add'>+    fprintf(stderr, "glfs-dup fd2 - %d\n", fd2);</div><div class='add'>+</div><div class='add'>+    fd3 = glfs_open(fs, filename, O_RDWR | O_SYNC);</div><div class='add'>+    if (fd2 &lt;= 0) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        LOG_ERR("glfs_open", ret);</div><div class='add'>+    }</div><div class='add'>+    fprintf(stderr, "glfs-open fd3 - %d\n", fd3);</div><div class='add'>+</div><div class='add'>+    /* TEST 1: Conflicting ranges, same lk_owner</div><div class='add'>+     * lock1 (0, 10, lownera)</div><div class='add'>+     * lock2 (5, 10, lownera)</div><div class='add'>+     * Expected: should not fail but get merged</div><div class='add'>+     */</div><div class='add'>+    ret = lock_test(fd1, fd2, false, 0, 10, lownera, 8, 5, 10, lownera, 8);</div><div class='add'>+    LOG_ERR("==== glfs_lock_test_1", ret);</div><div class='add'>+</div><div class='add'>+    /* TEST 2: Conflicting ranges, different lk_owner</div><div class='add'>+     * lock1 (0, 10, lownera) - already taken</div><div class='add'>+     * lock2 (5, 10, lownerb)</div><div class='add'>+     * Expected: should fail and not get merged</div><div class='add'>+     */</div><div class='add'>+    ret = lock_test(NULL, fd2, true, 0, 10, lownera, 8, 5, 10, lownerb, 8);</div><div class='add'>+    LOG_ERR("==== glfs_lock_test_2", ret);</div><div class='add'>+</div><div class='add'>+    /* TEST 3: Different ranges, same lk_owner</div><div class='add'>+     * lock1 (0, 10, lownera) - already taken</div><div class='add'>+     * lock2 (30, 10, lownera)</div><div class='add'>+     * Expected: should not fail</div><div class='add'>+     */</div><div class='add'>+    ret = lock_test(NULL, fd2, false, 0, 10, lownera, 8, 30, 10, lownera, 8);</div><div class='add'>+    LOG_ERR("==== glfs_lock_test_3", ret);</div><div class='add'>+</div><div class='add'>+    /* TEST 4: Conflicting ranges, different lk_owner</div><div class='add'>+     * lock1 (0, 10, lownera) - already taken</div><div class='add'>+     * lock2 (50, 10, lownerb)</div><div class='add'>+     * Expected: should not fail</div><div class='add'>+     */</div><div class='add'>+    ret = lock_test(NULL, fd2, false, 0, 10, lownera, 8, 50, 10, lownerb, 8);</div><div class='add'>+    LOG_ERR("==== glfs_lock_test_4", ret);</div><div class='add'>+</div><div class='add'>+    /* TEST 5: Close fd1 &amp; retry TEST2</div><div class='add'>+     * lock1 (not applicable)</div><div class='add'>+     * lock2 (5, 10, lownerb)</div><div class='add'>+     * Expected: should succeed now</div><div class='add'>+     */</div><div class='add'>+    ret = glfs_close(fd1);</div><div class='add'>+    LOG_ERR("glfs_close", ret);</div><div class='add'>+</div><div class='add'>+    ret = lock_test(NULL, fd2, false, 0, 10, lownera, 8, 5, 10, lownerb, 8);</div><div class='add'>+    LOG_ERR("==== glfs_lock_test_5", ret);</div><div class='add'>+</div><div class='add'>+    /* TEST 6: Check closing fd1 doesn't flush fd2 locks</div><div class='add'>+     * retry TEST 4 but with fd2 and fd3.</div><div class='add'>+     * lock1 (50, 10, lownerb) - already taken</div><div class='add'>+     * lock2 (55, 10, lownerc)</div><div class='add'>+     * Expected: should fail</div><div class='add'>+     */</div><div class='add'>+    ret = lock_test(NULL, fd3, true, 50, 10, lownerb, 8, 55, 10, lownerc, 8);</div><div class='add'>+    LOG_ERR("==== glfs_lock_test_6", ret);</div><div class='add'>+</div><div class='add'>+err:</div><div class='add'>+    ret = glfs_close(fd2);</div><div class='add'>+    LOG_ERR("glfs_close", ret);</div><div class='add'>+</div><div class='add'>+    ret = glfs_close(fd3);</div><div class='add'>+    LOG_ERR("glfs_close", ret);</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (fs) {</div><div class='add'>+        ret = glfs_fini(fs);</div><div class='add'>+        fprintf(stderr, "glfs_fini(fs) returned %d\n", ret);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (ret)</div><div class='add'>+        exit(1);</div><div class='add'>+    exit(0);</div><div class='add'>+}</div><div class='head'>diff --git a/tests/basic/gfapi/glfd-lkowner.t b/tests/basic/gfapi/glfd-lkowner.t<br/>new file mode 100755<br/>index 00000000000..ad7b0260a14<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/gfapi/glfd-lkowner.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/gfapi/glfd-lkowner.t</a></div><div class='hunk'>@@ -0,0 +1,27 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/brick1;</div><div class='add'>+EXPECT 'Created' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+EXPECT 'Started' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+logdir=`gluster --print-logdir`</div><div class='add'>+</div><div class='add'>+TEST build_tester $(dirname $0)/glfd-lkowner.c -lgfapi</div><div class='add'>+</div><div class='add'>+TEST ./$(dirname $0)/glfd-lkowner $H0 $V0  $logdir/glfd-lkowner.log</div><div class='add'>+</div><div class='add'>+cleanup_tester $(dirname $0)/glfd-lkowner</div><div class='add'>+</div><div class='add'>+TEST $CLI volume stop $V0</div><div class='add'>+TEST $CLI volume delete $V0</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/basic/gfapi/glfs-copy-file-range.c b/tests/basic/gfapi/glfs-copy-file-range.c<br/>new file mode 100644<br/>index 00000000000..1c5fd81fc87<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/gfapi/glfs-copy-file-range.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/gfapi/glfs-copy-file-range.c</a></div><div class='hunk'>@@ -0,0 +1,180 @@</div><div class='add'>+/*</div><div class='add'>+ Copyright (c) 2018 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+ This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+ This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+ General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+ later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+ cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#include &lt;stdio.h&gt;</div><div class='add'>+#include &lt;stdlib.h&gt;</div><div class='add'>+#include &lt;errno.h&gt;</div><div class='add'>+#include &lt;glusterfs/api/glfs.h&gt;</div><div class='add'>+#include &lt;glusterfs/api/glfs-handles.h&gt;</div><div class='add'>+#include &lt;string.h&gt;</div><div class='add'>+#include &lt;time.h&gt;</div><div class='add'>+#include &lt;libgen.h&gt;</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+cleanup(glfs_t *fs)</div><div class='add'>+{</div><div class='add'>+    if (!fs)</div><div class='add'>+        return;</div><div class='add'>+#if 0</div><div class='add'>+        /* glfs fini path is still racy and crashing the program. Since</div><div class='add'>+         * this program any way has to die, we are not going to call fini</div><div class='add'>+         * in the released versions. i.e. final builds. For all</div><div class='add'>+         * internal testing lets enable this so that glfs_fini code</div><div class='add'>+         * path becomes stable. */</div><div class='add'>+        glfs_fini (fs);</div><div class='add'>+#endif</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+main(int argc, char **argv)</div><div class='add'>+{</div><div class='add'>+    glfs_t *fs = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    char *volname = NULL;</div><div class='add'>+    char *logfilepath = NULL;</div><div class='add'>+    char *path_src = NULL;</div><div class='add'>+    char *path_dst = NULL;</div><div class='add'>+    glfs_fd_t *glfd_in = NULL;</div><div class='add'>+    glfs_fd_t *glfd_out = NULL;</div><div class='add'>+    char *volfile_server = NULL;</div><div class='add'>+</div><div class='add'>+    struct stat stbuf = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    struct glfs_stat stat_src = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    struct glfs_stat prestat_dst = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    struct glfs_stat poststat_dst = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    size_t len;</div><div class='add'>+</div><div class='add'>+    if (argc &lt; 6) {</div><div class='add'>+        printf("%s &lt;volume&gt; &lt;log file path&gt; &lt;source&gt; &lt;destination&gt;", argv[0]);</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    volfile_server = argv[1];</div><div class='add'>+    volname = argv[2];</div><div class='add'>+    logfilepath = argv[3];</div><div class='add'>+    path_src = argv[4];</div><div class='add'>+    path_dst = argv[5];</div><div class='add'>+</div><div class='add'>+    if (path_src[0] != '/') {</div><div class='add'>+        fprintf(stderr, "source path %s is not absolute", path_src);</div><div class='add'>+        errno = EINVAL;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (path_dst[0] != '/') {</div><div class='add'>+        fprintf(stderr, "destination path %s is not absolute", path_dst);</div><div class='add'>+        errno = EINVAL;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    fs = glfs_new(volname);</div><div class='add'>+    if (!fs) {</div><div class='add'>+        ret = -errno;</div><div class='add'>+        fprintf(stderr, "Not able to initialize volume '%s'", volname);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = glfs_set_volfile_server(fs, "tcp", volfile_server, 24007);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        ret = -errno;</div><div class='add'>+        fprintf(stderr,</div><div class='add'>+                "Failed to set the volfile server, "</div><div class='add'>+                "%s",</div><div class='add'>+                strerror(errno));</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = glfs_set_logging(fs, logfilepath, 7);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        ret = -errno;</div><div class='add'>+        fprintf(stderr,</div><div class='add'>+                "Failed to set the log file path, "</div><div class='add'>+                "%s",</div><div class='add'>+                strerror(errno));</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = glfs_init(fs);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        ret = -errno;</div><div class='add'>+        if (errno == ENOENT) {</div><div class='add'>+            fprintf(stderr, "Volume %s does not exist", volname);</div><div class='add'>+        } else {</div><div class='add'>+            fprintf(stderr,</div><div class='add'>+                    "%s: Not able to fetch "</div><div class='add'>+                    "volfile from glusterd",</div><div class='add'>+                    volname);</div><div class='add'>+        }</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    glfd_in = glfs_open(fs, path_src, O_RDONLY | O_NONBLOCK);</div><div class='add'>+    if (!glfd_in) {</div><div class='add'>+        ret = -errno;</div><div class='add'>+        goto out;</div><div class='add'>+    } else {</div><div class='add'>+        printf("OPEN_SRC: opening %s is success\n", path_src);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    glfd_out = glfs_creat(fs, path_dst, O_RDWR, 0644);</div><div class='add'>+    if (!glfd_out) {</div><div class='add'>+        fprintf(stderr,</div><div class='add'>+                "FAILED_DST_OPEN: failed to "</div><div class='add'>+                "open (create) %s (%s)\n",</div><div class='add'>+                path_dst, strerror(errno));</div><div class='add'>+        ret = -errno;</div><div class='add'>+        goto out;</div><div class='add'>+    } else {</div><div class='add'>+        printf("OPEN_DST: opening %s is success\n", path_dst);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = glfs_fstat(glfd_in, &amp;stbuf);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        ret = -errno;</div><div class='add'>+        goto out;</div><div class='add'>+    } else {</div><div class='add'>+        printf("FSTAT_SRC: fstat on %s is success\n", path_dst);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    len = stbuf.st_size;</div><div class='add'>+</div><div class='add'>+    do {</div><div class='add'>+        ret = glfs_copy_file_range(glfd_in, NULL, glfd_out, NULL, len, 0,</div><div class='add'>+                                   &amp;stat_src, &amp;prestat_dst, &amp;poststat_dst);</div><div class='add'>+        if (ret == -1) {</div><div class='add'>+            fprintf(stderr, "copy_file_range failed with %s\n",</div><div class='add'>+                    strerror(errno));</div><div class='add'>+            ret = -errno;</div><div class='add'>+            break;</div><div class='add'>+        } else {</div><div class='add'>+            printf("copy_file_range successful\n");</div><div class='add'>+            len -= ret;</div><div class='add'>+        }</div><div class='add'>+    } while (len &gt; 0);</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (glfd_in)</div><div class='add'>+        glfs_close(glfd_in);</div><div class='add'>+    if (glfd_out)</div><div class='add'>+        glfs_close(glfd_out);</div><div class='add'>+</div><div class='add'>+    cleanup(fs);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='head'>diff --git a/tests/basic/gfapi/glfs_h_creat_open.c b/tests/basic/gfapi/glfs_h_creat_open.c<br/>new file mode 100644<br/>index 00000000000..7672561e73f<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/gfapi/glfs_h_creat_open.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/gfapi/glfs_h_creat_open.c</a></div><div class='hunk'>@@ -0,0 +1,118 @@</div><div class='add'>+#include &lt;fcntl.h&gt;</div><div class='add'>+#include &lt;unistd.h&gt;</div><div class='add'>+#include &lt;time.h&gt;</div><div class='add'>+#include &lt;limits.h&gt;</div><div class='add'>+#include &lt;string.h&gt;</div><div class='add'>+#include &lt;stdio.h&gt;</div><div class='add'>+#include &lt;errno.h&gt;</div><div class='add'>+#include &lt;stdlib.h&gt;</div><div class='add'>+#include &lt;glusterfs/api/glfs.h&gt;</div><div class='add'>+#include &lt;glusterfs/api/glfs-handles.h&gt;</div><div class='add'>+</div><div class='add'>+#define LOG_ERR(func, ret)                                                     \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        if (ret != 0) {                                                        \</div><div class='add'>+            fprintf(stderr, "%s : returned error ret(%d), errno(%d)\n", func,  \</div><div class='add'>+                    ret, errno);                                               \</div><div class='add'>+            exit(1);                                                           \</div><div class='add'>+        } else {                                                               \</div><div class='add'>+            fprintf(stderr, "%s : returned %d\n", func, ret);                  \</div><div class='add'>+        }                                                                      \</div><div class='add'>+    } while (0)</div><div class='add'>+#define LOG_IF_NO_ERR(func, ret)                                               \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        if (ret == 0) {                                                        \</div><div class='add'>+            fprintf(stderr, "%s : hasn't returned error %d\n", func, ret);     \</div><div class='add'>+            exit(1);                                                           \</div><div class='add'>+        } else {                                                               \</div><div class='add'>+            fprintf(stderr, "%s : returned %d\n", func, ret);                  \</div><div class='add'>+        }                                                                      \</div><div class='add'>+    } while (0)</div><div class='add'>+int</div><div class='add'>+main(int argc, char *argv[])</div><div class='add'>+{</div><div class='add'>+    glfs_t *fs = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    struct glfs_object *root = NULL, *leaf = NULL;</div><div class='add'>+    glfs_fd_t *fd = NULL;</div><div class='add'>+    char *filename = "/ro-file";</div><div class='add'>+    struct stat sb = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    char *logfile = NULL;</div><div class='add'>+    char *volname = NULL;</div><div class='add'>+    char *hostname = NULL;</div><div class='add'>+    char buf[32] = "abcdefghijklmnopqrstuvwxyz012345";</div><div class='add'>+</div><div class='add'>+    fprintf(stderr, "Starting glfs_h_creat_open\n");</div><div class='add'>+</div><div class='add'>+    if (argc != 4) {</div><div class='add'>+        fprintf(stderr, "Invalid argument\n");</div><div class='add'>+        exit(1);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    hostname = argv[1];</div><div class='add'>+    volname = argv[2];</div><div class='add'>+    logfile = argv[3];</div><div class='add'>+</div><div class='add'>+    fs = glfs_new(volname);</div><div class='add'>+    if (!fs) {</div><div class='add'>+        fprintf(stderr, "glfs_new: returned NULL\n");</div><div class='add'>+        return 1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = glfs_set_volfile_server(fs, "tcp", hostname, 24007);</div><div class='add'>+    LOG_ERR("glfs_set_volfile_server", ret);</div><div class='add'>+</div><div class='add'>+    ret = glfs_set_logging(fs, logfile, 7);</div><div class='add'>+    LOG_ERR("glfs_set_logging", ret);</div><div class='add'>+</div><div class='add'>+    ret = glfs_init(fs);</div><div class='add'>+    LOG_ERR("glfs_init", ret);</div><div class='add'>+</div><div class='add'>+    sleep(2);</div><div class='add'>+    root = glfs_h_lookupat(fs, NULL, "/", &amp;sb, 0);</div><div class='add'>+    if (!root) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        LOG_ERR("glfs_h_lookupat root", ret);</div><div class='add'>+    }</div><div class='add'>+    leaf = glfs_h_lookupat(fs, root, filename, &amp;sb, 0);</div><div class='add'>+    if (!leaf) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        LOG_IF_NO_ERR("glfs_h_lookupat leaf", ret);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    leaf = glfs_h_creat_open(fs, root, filename, O_RDONLY, 00444, &amp;sb, &amp;fd);</div><div class='add'>+    if (!leaf || !fd) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        LOG_ERR("glfs_h_creat leaf", ret);</div><div class='add'>+    }</div><div class='add'>+    fprintf(stderr, "glfs_h_create_open leaf - %p\n", leaf);</div><div class='add'>+</div><div class='add'>+    ret = glfs_write(fd, buf, 32, 0);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(stderr, "glfs_write: error writing to file %s, %s\n", filename,</div><div class='add'>+                strerror(errno));</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = glfs_h_getattrs(fs, leaf, &amp;sb);</div><div class='add'>+    LOG_ERR("glfs_h_getattrs", ret);</div><div class='add'>+</div><div class='add'>+    if (sb.st_size != 32) {</div><div class='add'>+        fprintf(stderr, "glfs_write: post size mismatch\n");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    fprintf(stderr, "Successfully opened and written to a read-only file \n");</div><div class='add'>+out:</div><div class='add'>+    if (fd)</div><div class='add'>+        glfs_close(fd);</div><div class='add'>+</div><div class='add'>+    ret = glfs_fini(fs);</div><div class='add'>+    LOG_ERR("glfs_fini", ret);</div><div class='add'>+</div><div class='add'>+    fprintf(stderr, "End of libgfapi_fini\n");</div><div class='add'>+</div><div class='add'>+    exit(0);</div><div class='add'>+}</div><div class='head'>diff --git a/tests/basic/gfapi/glfs_h_creat_open.t b/tests/basic/gfapi/glfs_h_creat_open.t<br/>new file mode 100755<br/>index 00000000000..f24ae7395be<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/gfapi/glfs_h_creat_open.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/gfapi/glfs_h_creat_open.t</a></div><div class='hunk'>@@ -0,0 +1,27 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/brick1;</div><div class='add'>+EXPECT 'Created' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+EXPECT 'Started' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+logdir=`gluster --print-logdir`</div><div class='add'>+</div><div class='add'>+TEST build_tester $(dirname $0)/glfs_h_creat_open.c -lgfapi</div><div class='add'>+</div><div class='add'>+TEST ./$(dirname $0)/glfs_h_creat_open $H0 $V0  $logdir/glfs.log</div><div class='add'>+</div><div class='add'>+cleanup_tester $(dirname $0)/glfs_h_creat_open</div><div class='add'>+</div><div class='add'>+TEST $CLI volume stop $V0</div><div class='add'>+TEST $CLI volume delete $V0</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/basic/gfapi/glfs_sysrq.c b/tests/basic/gfapi/glfs_sysrq.c<br/>new file mode 100644<br/>index 00000000000..13e06be6df2<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/gfapi/glfs_sysrq.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/gfapi/glfs_sysrq.c</a></div><div class='hunk'>@@ -0,0 +1,60 @@</div><div class='add'>+/** glfs_sysrq.c</div><div class='add'>+ *</div><div class='add'>+ * Simple test application to run all glfs_syqrq() debugging calls.</div><div class='add'>+ *</div><div class='add'>+ * Usage: ./glfs_sysrq &lt;host&gt; &lt;volume&gt; &lt;logfile&gt;</div><div class='add'>+ */</div><div class='add'>+#include &lt;errno.h&gt;</div><div class='add'>+#include &lt;stdio.h&gt;</div><div class='add'>+</div><div class='add'>+#include &lt;glusterfs/api/glfs.h&gt;</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+main(int argc, char *argv[])</div><div class='add'>+{</div><div class='add'>+    /* cmdline arguments */</div><div class='add'>+    char *host = NULL;</div><div class='add'>+    char *volume = NULL;</div><div class='add'>+    char *logfile = NULL;</div><div class='add'>+</div><div class='add'>+    /* other variables */</div><div class='add'>+    glfs_t *fs = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    if (argc != 4) {</div><div class='add'>+        fprintf(stderr, "Usage: %s &lt;host&gt; &lt;volume&gt; &lt;logfile&gt;\n", argv[0]);</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    host = argv[1];</div><div class='add'>+    volume = argv[2];</div><div class='add'>+    logfile = argv[3];</div><div class='add'>+</div><div class='add'>+    fs = glfs_new(volume);</div><div class='add'>+    if (!fs) {</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = glfs_set_logging(fs, logfile, 7);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = glfs_set_volfile_server(fs, "tcp", host, 24007);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = glfs_init(fs);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* checking of the results is easier in the script running this test */</div><div class='add'>+    glfs_sysrq(fs, GLFS_SYSRQ_HELP);</div><div class='add'>+    glfs_sysrq(fs, GLFS_SYSRQ_STATEDUMP);</div><div class='add'>+</div><div class='add'>+    glfs_fini(fs);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='head'>diff --git a/tests/basic/gfapi/glfs_sysrq.t b/tests/basic/gfapi/glfs_sysrq.t<br/>new file mode 100755<br/>index 00000000000..d1a0e9bc248<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/gfapi/glfs_sysrq.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/gfapi/glfs_sysrq.t</a></div><div class='hunk'>@@ -0,0 +1,39 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+#</div><div class='add'>+# Run glfs_sysrq, a gfapi applications calling all glfs_sysrq() commands.</div><div class='add'>+# Each command generates a specific log message, or something else that can be</div><div class='add'>+# tested for existance.</div><div class='add'>+#</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/brick1</div><div class='add'>+EXPECT 'Created' volinfo_field $V0 'Status'</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+EXPECT 'Started' volinfo_field $V0 'Status'</div><div class='add'>+</div><div class='add'>+logdir=$(gluster --print-logdir)</div><div class='add'>+</div><div class='add'>+# clear all statedumps</div><div class='add'>+cleanup_statedump</div><div class='add'>+TEST ! test -e $statedumpdir/*.dump.*</div><div class='add'>+# vim friendly command */</div><div class='add'>+</div><div class='add'>+build_tester $(dirname $0)/glfs_sysrq.c -lgfapi</div><div class='add'>+TEST $(dirname $0)/glfs_sysrq $H0 $V0 $logdir/glfs_sysrq.log</div><div class='add'>+</div><div class='add'>+# check for the help message in the log</div><div class='add'>+TEST grep -q '"(H)elp"' $logdir/glfs_sysrq.log</div><div class='add'>+</div><div class='add'>+# see if there is a statedump</div><div class='add'>+TEST test -e $statedumpdir/*.dump.*</div><div class='add'>+# vim friendly command */</div><div class='add'>+</div><div class='add'>+cleanup_tester $(dirname $0)/glfs_sysrq</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/basic/gfapi/glfs_xreaddirplus_r.c b/tests/basic/gfapi/glfs_xreaddirplus_r.c<br/>new file mode 100644<br/>index 00000000000..0c4c79123eb<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/gfapi/glfs_xreaddirplus_r.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/gfapi/glfs_xreaddirplus_r.c</a></div><div class='hunk'>@@ -0,0 +1,242 @@</div><div class='add'>+#include &lt;stdio.h&gt;</div><div class='add'>+#include &lt;stdlib.h&gt;</div><div class='add'>+#include &lt;string.h&gt;</div><div class='add'>+#include &lt;errno.h&gt;</div><div class='add'>+#include &lt;glusterfs/api/glfs.h&gt;</div><div class='add'>+#include &lt;glusterfs/api/glfs-handles.h&gt;</div><div class='add'>+#include &lt;time.h&gt;</div><div class='add'>+</div><div class='add'>+#define VALIDATE_AND_GOTO_LABEL_ON_ERROR(func, ret, label)                     \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        if (ret &lt; 0) {                                                         \</div><div class='add'>+            fprintf(stderr, "%s : returned error %d (%s)\n", func, ret,        \</div><div class='add'>+                    strerror(errno));                                          \</div><div class='add'>+            goto label;                                                        \</div><div class='add'>+        }                                                                      \</div><div class='add'>+    } while (0)</div><div class='add'>+</div><div class='add'>+#define VALIDATE_BOOL_AND_GOTO_LABEL_ON_ERROR(func, bool_var, ret, label)      \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        if (!bool_var) {                                                       \</div><div class='add'>+            fprintf(stderr, "%s : returned error (%s)\n", func,                \</div><div class='add'>+                    strerror(errno));                                          \</div><div class='add'>+            ret = -1;                                                          \</div><div class='add'>+            goto label;                                                        \</div><div class='add'>+        }                                                                      \</div><div class='add'>+    } while (0)</div><div class='add'>+</div><div class='add'>+#define MAX_FILES_CREATE 10</div><div class='add'>+#define MAXPATHNAME 512</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+assimilatetime(struct timespec *ts, struct timespec ts_st,</div><div class='add'>+               struct timespec ts_ed)</div><div class='add'>+{</div><div class='add'>+    if ((ts_ed.tv_nsec - ts_st.tv_nsec) &lt; 0) {</div><div class='add'>+        ts-&gt;tv_sec += ts_ed.tv_sec - ts_st.tv_sec - 1;</div><div class='add'>+        ts-&gt;tv_nsec += 1000000000 + ts_ed.tv_nsec - ts_st.tv_nsec;</div><div class='add'>+    } else {</div><div class='add'>+        ts-&gt;tv_sec += ts_ed.tv_sec - ts_st.tv_sec;</div><div class='add'>+        ts-&gt;tv_nsec += ts_ed.tv_nsec - ts_st.tv_nsec;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (ts-&gt;tv_nsec &gt; 1000000000) {</div><div class='add'>+        ts-&gt;tv_nsec = ts-&gt;tv_nsec - 1000000000;</div><div class='add'>+        ts-&gt;tv_sec += 1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+ * Returns '%' difference between ts1 &amp; ts2</div><div class='add'>+ */</div><div class='add'>+int</div><div class='add'>+comparetime(struct timespec ts1, struct timespec ts2)</div><div class='add'>+{</div><div class='add'>+    uint64_t ts1_n, ts2_n;</div><div class='add'>+    int pct = 0;</div><div class='add'>+</div><div class='add'>+    ts1_n = (ts1.tv_sec * 1000000000) + ts1.tv_nsec;</div><div class='add'>+    ts2_n = (ts2.tv_sec * 1000000000) + ts2.tv_nsec;</div><div class='add'>+</div><div class='add'>+    pct = ((ts1_n - ts2_n) * 100) / ts1_n;</div><div class='add'>+</div><div class='add'>+    return pct;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+old_readdir(glfs_t *fs)</div><div class='add'>+{</div><div class='add'>+    struct glfs_object *root = NULL;</div><div class='add'>+    struct glfs_fd *fd = NULL;</div><div class='add'>+    struct stat *sb = NULL;</div><div class='add'>+    char buf[512];</div><div class='add'>+    struct dirent *entry = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    struct glfs_object *glhandle = NULL;</div><div class='add'>+</div><div class='add'>+    if (!fs)</div><div class='add'>+        return -1;</div><div class='add'>+</div><div class='add'>+    root = glfs_h_lookupat(fs, NULL, "/", sb, 0);</div><div class='add'>+    VALIDATE_BOOL_AND_GOTO_LABEL_ON_ERROR("glfs_h_lookupat", !!root, ret, out);</div><div class='add'>+</div><div class='add'>+    fd = glfs_opendir(fs, "/");</div><div class='add'>+    VALIDATE_BOOL_AND_GOTO_LABEL_ON_ERROR("glfs_opendir", !!fd, ret, out);</div><div class='add'>+</div><div class='add'>+    while (glfs_readdir_r(fd, (struct dirent *)buf, &amp;entry), entry) {</div><div class='add'>+        if (strcmp(entry-&gt;d_name, ".") &amp;&amp; strcmp(entry-&gt;d_name, "..")) {</div><div class='add'>+            glhandle = glfs_h_lookupat(fs, root, "/", sb, 0);</div><div class='add'>+            VALIDATE_BOOL_AND_GOTO_LABEL_ON_ERROR("glfs_h_lookupat", !!glhandle,</div><div class='add'>+                                                  ret, out);</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    glfs_closedir(fd);</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+new_xreaddirplus(glfs_t *fs)</div><div class='add'>+{</div><div class='add'>+    struct glfs_fd *fd = NULL;</div><div class='add'>+    struct stat *sb = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    uint32_t rflags = (GFAPI_XREADDIRP_STAT | GFAPI_XREADDIRP_HANDLE);</div><div class='add'>+    struct glfs_xreaddirp_stat *xstat = NULL;</div><div class='add'>+    struct dirent de;</div><div class='add'>+    struct dirent *pde = NULL;</div><div class='add'>+    struct glfs_object *glhandle = NULL;</div><div class='add'>+</div><div class='add'>+    if (!fs)</div><div class='add'>+        return -1;</div><div class='add'>+</div><div class='add'>+    fd = glfs_opendir(fs, "/");</div><div class='add'>+    VALIDATE_BOOL_AND_GOTO_LABEL_ON_ERROR("glfs_opendir", !!fd, ret, out);</div><div class='add'>+</div><div class='add'>+    ret = glfs_xreaddirplus_r(fd, rflags, &amp;xstat, &amp;de, &amp;pde);</div><div class='add'>+    while (ret &gt; 0 &amp;&amp; pde != NULL) {</div><div class='add'>+        if (xstat) {</div><div class='add'>+            sb = glfs_xreaddirplus_get_stat(xstat);</div><div class='add'>+            VALIDATE_BOOL_AND_GOTO_LABEL_ON_ERROR("glfs_xreaddirplus_get_stat",</div><div class='add'>+                                                  !!sb, ret, out);</div><div class='add'>+</div><div class='add'>+            if (strcmp(de.d_name, ".") &amp;&amp; strcmp(de.d_name, "..")) {</div><div class='add'>+                glhandle = glfs_xreaddirplus_get_object(xstat);</div><div class='add'>+                VALIDATE_BOOL_AND_GOTO_LABEL_ON_ERROR(</div><div class='add'>+                    "glfs_xreaddirplus_get_object", !!glhandle, ret, out);</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        if (xstat) {</div><div class='add'>+            glfs_free(xstat);</div><div class='add'>+            xstat = NULL;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        ret = glfs_xreaddirplus_r(fd, rflags, &amp;xstat, &amp;de, &amp;pde);</div><div class='add'>+</div><div class='add'>+        VALIDATE_AND_GOTO_LABEL_ON_ERROR("glfs_xreaddirp_r", ret, out);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (xstat)</div><div class='add'>+        glfs_free(xstat);</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+main(int argc, char *argv[])</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    glfs_t *fs = NULL;</div><div class='add'>+    char *volname = NULL;</div><div class='add'>+    char *logfile = NULL;</div><div class='add'>+    char *hostname = NULL;</div><div class='add'>+    char *my_file = "file_";</div><div class='add'>+    char my_file_name[MAXPATHNAME];</div><div class='add'>+    uint32_t flags = O_RDWR | O_SYNC;</div><div class='add'>+    struct glfs_fd *fd = NULL;</div><div class='add'>+    int i = 0;</div><div class='add'>+    int pct = 0;</div><div class='add'>+    struct timespec timestamp = {0, 0}, st_timestamp, ed_timestamp;</div><div class='add'>+    struct timespec otimestamp = {0, 0}, ost_timestamp, oed_timestamp;</div><div class='add'>+</div><div class='add'>+    if (argc != 4) {</div><div class='add'>+        fprintf(stderr, "Invalid argument\n");</div><div class='add'>+        return 1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    hostname = argv[1];</div><div class='add'>+    volname = argv[2];</div><div class='add'>+    logfile = argv[3];</div><div class='add'>+</div><div class='add'>+    fs = glfs_new(volname);</div><div class='add'>+    VALIDATE_BOOL_AND_GOTO_LABEL_ON_ERROR("glfs_new", !!fs, ret, out);</div><div class='add'>+</div><div class='add'>+    ret = glfs_set_volfile_server(fs, "tcp", hostname, 24007);</div><div class='add'>+    VALIDATE_AND_GOTO_LABEL_ON_ERROR("glfs_set_volfile_server", ret, out);</div><div class='add'>+</div><div class='add'>+    ret = glfs_set_logging(fs, logfile, 7);</div><div class='add'>+    VALIDATE_AND_GOTO_LABEL_ON_ERROR("glfs_set_logging", ret, out);</div><div class='add'>+</div><div class='add'>+    ret = glfs_init(fs);</div><div class='add'>+    VALIDATE_AND_GOTO_LABEL_ON_ERROR("glfs_init", ret, out);</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; MAX_FILES_CREATE; i++) {</div><div class='add'>+        sprintf(my_file_name, "%s%d", my_file, i);</div><div class='add'>+</div><div class='add'>+        fd = glfs_creat(fs, my_file_name, flags, 0644);</div><div class='add'>+        VALIDATE_BOOL_AND_GOTO_LABEL_ON_ERROR("glfs_creat", !!fd, ret, out);</div><div class='add'>+</div><div class='add'>+        glfs_close(fd);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* measure performance using old readdir call and new xreaddirplus call and</div><div class='add'>+     * compare */</div><div class='add'>+    ret = clock_gettime(CLOCK_REALTIME, &amp;ost_timestamp);</div><div class='add'>+    VALIDATE_AND_GOTO_LABEL_ON_ERROR("clock_gettime", ret, out);</div><div class='add'>+</div><div class='add'>+    ret = old_readdir(fs);</div><div class='add'>+    VALIDATE_AND_GOTO_LABEL_ON_ERROR("old_readdir", ret, out);</div><div class='add'>+</div><div class='add'>+    ret = clock_gettime(CLOCK_REALTIME, &amp;oed_timestamp);</div><div class='add'>+    VALIDATE_AND_GOTO_LABEL_ON_ERROR("clock_gettime", ret, out);</div><div class='add'>+</div><div class='add'>+    assimilatetime(&amp;otimestamp, ost_timestamp, oed_timestamp);</div><div class='add'>+</div><div class='add'>+    printf("\tOverall time using readdir:\n\t\tSecs:%ld\n\t\tnSecs:%ld\n",</div><div class='add'>+           otimestamp.tv_sec, otimestamp.tv_nsec);</div><div class='add'>+</div><div class='add'>+    ret = clock_gettime(CLOCK_REALTIME, &amp;st_timestamp);</div><div class='add'>+    VALIDATE_AND_GOTO_LABEL_ON_ERROR("clock_gettime", ret, out);</div><div class='add'>+</div><div class='add'>+    ret = new_xreaddirplus(fs);</div><div class='add'>+    VALIDATE_AND_GOTO_LABEL_ON_ERROR("new_xreaddirplus", ret, out);</div><div class='add'>+</div><div class='add'>+    ret = clock_gettime(CLOCK_REALTIME, &amp;ed_timestamp);</div><div class='add'>+    VALIDATE_AND_GOTO_LABEL_ON_ERROR("clock_gettime", ret, out);</div><div class='add'>+</div><div class='add'>+    assimilatetime(&amp;timestamp, st_timestamp, ed_timestamp);</div><div class='add'>+</div><div class='add'>+    printf("\tOverall time using xreaddirplus:\n\t\tSecs:%ld\n\t\tnSecs:%ld\n",</div><div class='add'>+           timestamp.tv_sec, timestamp.tv_nsec);</div><div class='add'>+</div><div class='add'>+    pct = comparetime(otimestamp, timestamp);</div><div class='add'>+    printf("There is improvement by %d%%\n", pct);</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+out:</div><div class='add'>+    if (fs) {</div><div class='add'>+        ret = glfs_fini(fs);</div><div class='add'>+        if (ret)</div><div class='add'>+            fprintf(stderr, "glfs_fini(fs) returned %d\n", ret);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='head'>diff --git a/tests/basic/gfapi/glfs_xreaddirplus_r.t b/tests/basic/gfapi/glfs_xreaddirplus_r.t<br/>new file mode 100755<br/>index 00000000000..d21a00c66f2<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/gfapi/glfs_xreaddirplus_r.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/gfapi/glfs_xreaddirplus_r.t</a></div><div class='hunk'>@@ -0,0 +1,28 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/brick1;</div><div class='add'>+EXPECT 'Created' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+EXPECT 'Started' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+logdir=`gluster --print-logdir`</div><div class='add'>+</div><div class='add'>+TEST build_tester $(dirname $0)/glfs_xreaddirplus_r.c -lgfapi</div><div class='add'>+</div><div class='add'>+TEST $(dirname $0)/glfs_xreaddirplus_r $H0 $V0  $logdir/glfs_xreaddirplus_r.log</div><div class='add'>+</div><div class='add'>+cleanup_tester $(dirname $0)/glfs_xreaddirplus_r</div><div class='add'>+</div><div class='add'>+TEST $CLI volume stop $V0</div><div class='add'>+TEST $CLI volume delete $V0</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+#G_TESTDEF_TEST_STATUS_NETBSD7=BAD_TEST,BUG=000000</div><div class='head'>diff --git a/tests/basic/gfapi/glfsxmp-coverage.c b/tests/basic/gfapi/glfsxmp-coverage.c<br/>new file mode 100644<br/>index 00000000000..51650023efd<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/gfapi/glfsxmp-coverage.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/gfapi/glfsxmp-coverage.c</a></div><div class='hunk'>@@ -0,0 +1,1900 @@</div><div class='add'>+#include &lt;stdio.h&gt;</div><div class='add'>+#include &lt;stdlib.h&gt;</div><div class='add'>+#include &lt;errno.h&gt;</div><div class='add'>+#include &lt;glusterfs/api/glfs.h&gt;</div><div class='add'>+#include &lt;glusterfs/api/glfs-handles.h&gt;</div><div class='add'>+#include &lt;string.h&gt;</div><div class='add'>+#include &lt;time.h&gt;</div><div class='add'>+</div><div class='add'>+#define TEST_STR_LEN 2048</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+test_dirops(glfs_t *fs)</div><div class='add'>+{</div><div class='add'>+    glfs_fd_t *fd = NULL;</div><div class='add'>+    char buf[2048];</div><div class='add'>+    struct dirent *entry = NULL;</div><div class='add'>+</div><div class='add'>+    fd = glfs_opendir(fs, "/");</div><div class='add'>+    if (!fd) {</div><div class='add'>+        fprintf(stderr, "/: %s\n", strerror(errno));</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    fprintf(stderr, "Entries:\n");</div><div class='add'>+    while (glfs_readdir_r(fd, (struct dirent *)buf, &amp;entry), entry) {</div><div class='add'>+        fprintf(stderr, "%s: %lu\n", entry-&gt;d_name, glfs_telldir(fd));</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Should internally call fsyncdir(), hopefully */</div><div class='add'>+    glfs_fsync(fd, NULL, NULL);</div><div class='add'>+</div><div class='add'>+    glfs_closedir(fd);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+test_xattr(glfs_t *fs)</div><div class='add'>+{</div><div class='add'>+    char *filename = "/filename2";</div><div class='add'>+    char *linkfile = "/linkfile";</div><div class='add'>+    glfs_fd_t *fd = NULL;</div><div class='add'>+    char buf[512];</div><div class='add'>+    char *ptr;</div><div class='add'>+    int ret;</div><div class='add'>+</div><div class='add'>+    ret = glfs_setxattr(fs, filename, "user.testkey", "testval", 8, 0);</div><div class='add'>+    fprintf(stderr, "setxattr(%s): %d (%s)\n", filename, ret, strerror(errno));</div><div class='add'>+</div><div class='add'>+    ret = glfs_setxattr(fs, filename, "user.testkey2", "testval", 8, 0);</div><div class='add'>+    fprintf(stderr, "setxattr(%s): %d (%s)\n", filename, ret, strerror(errno));</div><div class='add'>+</div><div class='add'>+    ret = glfs_getxattr(fs, filename, "user.testkey", buf, 512);</div><div class='add'>+    fprintf(stderr, "getxattr(%s): %d (%s)\n", filename, ret, strerror(errno));</div><div class='add'>+    if (ret &lt; 0)</div><div class='add'>+        return -1;</div><div class='add'>+</div><div class='add'>+    ret = glfs_listxattr(fs, filename, buf, 512);</div><div class='add'>+    fprintf(stderr, "listxattr(%s): %d (%s)\n", filename, ret, strerror(errno));</div><div class='add'>+    if (ret &lt; 0)</div><div class='add'>+        return -1;</div><div class='add'>+</div><div class='add'>+    ret = glfs_symlink(fs, "filename", linkfile);</div><div class='add'>+    fprintf(stderr, "symlink(%s %s): %s\n", filename, linkfile,</div><div class='add'>+            strerror(errno));</div><div class='add'>+    if (ret &lt; 0)</div><div class='add'>+        return -1;</div><div class='add'>+</div><div class='add'>+    ret = glfs_readlink(fs, linkfile, buf, 512);</div><div class='add'>+    fprintf(stderr, "readlink(%s) : %d (%s)\n", filename, ret, strerror(errno));</div><div class='add'>+    if (ret &lt; 0)</div><div class='add'>+        return -1;</div><div class='add'>+</div><div class='add'>+    ret = glfs_lsetxattr(fs, filename, "user.testkey3", "testval", 8, 0);</div><div class='add'>+    fprintf(stderr, "lsetxattr(%s) : %d (%s)\n", linkfile, ret,</div><div class='add'>+            strerror(errno));</div><div class='add'>+    if (ret &lt; 0)</div><div class='add'>+        return -1;</div><div class='add'>+</div><div class='add'>+    ret = glfs_llistxattr(fs, linkfile, buf, 512);</div><div class='add'>+    fprintf(stderr, "llistxattr(%s): %d (%s)\n", filename, ret,</div><div class='add'>+            strerror(errno));</div><div class='add'>+    if (ret &lt; 0)</div><div class='add'>+        return -1;</div><div class='add'>+</div><div class='add'>+    ret = glfs_lgetxattr(fs, filename, "user.testkey3", buf, 512);</div><div class='add'>+    fprintf(stderr, "lgetxattr(%s): %d (%s)\n", linkfile, ret, strerror(errno));</div><div class='add'>+    if (ret &lt; 0)</div><div class='add'>+        return -1;</div><div class='add'>+</div><div class='add'>+    for (ptr = buf; ptr &lt; buf + ret; ptr++) {</div><div class='add'>+        printf("key=%s\n", ptr);</div><div class='add'>+        ptr += strlen(ptr);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = glfs_removexattr(fs, filename, "user.testkey2");</div><div class='add'>+    fprintf(stderr, "removexattr(%s): %d (%s)\n", filename, ret,</div><div class='add'>+            strerror(errno));</div><div class='add'>+</div><div class='add'>+    fd = glfs_open(fs, filename, O_RDWR);</div><div class='add'>+    fprintf(stderr, "open(%s): (%p) %s\n", filename, fd, strerror(errno));</div><div class='add'>+</div><div class='add'>+    ret = glfs_fsetxattr(fd, "user.testkey2", "testval", 8, 0);</div><div class='add'>+    fprintf(stderr, "fsetxattr(%s): %d (%s)\n", filename, ret, strerror(errno));</div><div class='add'>+</div><div class='add'>+    ret = glfs_fgetxattr(fd, "user.testkey2", buf, 512);</div><div class='add'>+    fprintf(stderr, "fgetxattr(%s): %d (%s)\n", filename, ret, strerror(errno));</div><div class='add'>+</div><div class='add'>+    ret = glfs_flistxattr(fd, buf, 512);</div><div class='add'>+    fprintf(stderr, "flistxattr(%s): %d (%s)\n", filename, ret,</div><div class='add'>+            strerror(errno));</div><div class='add'>+    if (ret &lt; 0)</div><div class='add'>+        return -1;</div><div class='add'>+</div><div class='add'>+    for (ptr = buf; ptr &lt; buf + ret; ptr++) {</div><div class='add'>+        printf("key=%s\n", ptr);</div><div class='add'>+        ptr += strlen(ptr);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = glfs_fremovexattr(fd, "user.testkey2");</div><div class='add'>+    fprintf(stderr, "fremovexattr(%s): %d (%s)\n", filename, ret,</div><div class='add'>+            strerror(errno));</div><div class='add'>+</div><div class='add'>+    glfs_close(fd);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+test_chdir(glfs_t *fs)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    char *dir = "/dir";</div><div class='add'>+    char *topdir = "/topdir";</div><div class='add'>+    char *linkdir = "/linkdir";</div><div class='add'>+    char *linkdir2 = "/linkdir2";</div><div class='add'>+    char *subdir = "./subdir";</div><div class='add'>+    char *respath = NULL;</div><div class='add'>+    char pathbuf[4096];</div><div class='add'>+</div><div class='add'>+    ret = glfs_mkdir(fs, topdir, 0755);</div><div class='add'>+    fprintf(stderr, "mkdir(%s): %s\n", topdir, strerror(errno));</div><div class='add'>+    if (ret)</div><div class='add'>+        return -1;</div><div class='add'>+</div><div class='add'>+    ret = glfs_mkdir(fs, dir, 0755);</div><div class='add'>+    fprintf(stderr, "mkdir(%s): %s\n", dir, strerror(errno));</div><div class='add'>+    if (ret)</div><div class='add'>+        return -1;</div><div class='add'>+</div><div class='add'>+    respath = glfs_getcwd(fs, pathbuf, 4096);</div><div class='add'>+    fprintf(stdout, "getcwd() = %s\n", respath);</div><div class='add'>+</div><div class='add'>+    ret = glfs_symlink(fs, "topdir", linkdir);</div><div class='add'>+    if (ret) {</div><div class='add'>+        fprintf(stderr, "symlink(%s, %s): %s\n", topdir, linkdir,</div><div class='add'>+                strerror(errno));</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = glfs_chdir(fs, linkdir);</div><div class='add'>+    if (ret) {</div><div class='add'>+        fprintf(stderr, "chdir(%s): %s\n", linkdir, strerror(errno));</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    respath = glfs_getcwd(fs, pathbuf, 4096);</div><div class='add'>+    fprintf(stdout, "getcwd() = %s\n", respath);</div><div class='add'>+</div><div class='add'>+    respath = glfs_realpath(fs, subdir, pathbuf);</div><div class='add'>+    if (respath) {</div><div class='add'>+        fprintf(stderr, "realpath(%s) worked unexpectedly: %s\n", subdir,</div><div class='add'>+                respath);</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = glfs_mkdir(fs, subdir, 0755);</div><div class='add'>+    if (ret) {</div><div class='add'>+        fprintf(stderr, "mkdir(%s): %s\n", subdir, strerror(errno));</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    respath = glfs_realpath(fs, subdir, pathbuf);</div><div class='add'>+    if (!respath) {</div><div class='add'>+        fprintf(stderr, "realpath(%s): %s\n", subdir, strerror(errno));</div><div class='add'>+    } else {</div><div class='add'>+        fprintf(stdout, "realpath(%s) = %s\n", subdir, respath);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = glfs_chdir(fs, subdir);</div><div class='add'>+    if (ret) {</div><div class='add'>+        fprintf(stderr, "chdir(%s): %s\n", subdir, strerror(errno));</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    respath = glfs_getcwd(fs, pathbuf, 4096);</div><div class='add'>+    fprintf(stdout, "getcwd() = %s\n", respath);</div><div class='add'>+</div><div class='add'>+    respath = glfs_realpath(fs, "/linkdir/subdir", pathbuf);</div><div class='add'>+    if (!respath) {</div><div class='add'>+        fprintf(stderr, "realpath(/linkdir/subdir): %s\n", strerror(errno));</div><div class='add'>+    } else {</div><div class='add'>+        fprintf(stdout, "realpath(/linkdir/subdir) = %s\n", respath);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#ifdef DEBUG</div><div class='add'>+static void</div><div class='add'>+peek_stat(struct stat *sb)</div><div class='add'>+{</div><div class='add'>+    printf("Dumping stat information:\n");</div><div class='add'>+    printf("File type:                ");</div><div class='add'>+</div><div class='add'>+    switch (sb-&gt;st_mode &amp; S_IFMT) {</div><div class='add'>+        case S_IFBLK:</div><div class='add'>+            printf("block device\n");</div><div class='add'>+            break;</div><div class='add'>+        case S_IFCHR:</div><div class='add'>+            printf("character device\n");</div><div class='add'>+            break;</div><div class='add'>+        case S_IFDIR:</div><div class='add'>+            printf("directory\n");</div><div class='add'>+            break;</div><div class='add'>+        case S_IFIFO:</div><div class='add'>+            printf("FIFO/pipe\n");</div><div class='add'>+            break;</div><div class='add'>+        case S_IFLNK:</div><div class='add'>+            printf("symlink\n");</div><div class='add'>+            break;</div><div class='add'>+        case S_IFREG:</div><div class='add'>+            printf("regular file\n");</div><div class='add'>+            break;</div><div class='add'>+        case S_IFSOCK:</div><div class='add'>+            printf("socket\n");</div><div class='add'>+            break;</div><div class='add'>+        default:</div><div class='add'>+            printf("unknown?\n");</div><div class='add'>+            break;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    printf("I-node number:            %ld\n", (long)sb-&gt;st_ino);</div><div class='add'>+</div><div class='add'>+    printf("Mode:                     %lo (octal)\n",</div><div class='add'>+           (unsigned long)sb-&gt;st_mode);</div><div class='add'>+</div><div class='add'>+    printf("Link count:               %ld\n", (long)sb-&gt;st_nlink);</div><div class='add'>+    printf("Ownership:                UID=%ld   GID=%ld\n", (long)sb-&gt;st_uid,</div><div class='add'>+           (long)sb-&gt;st_gid);</div><div class='add'>+</div><div class='add'>+    printf("Preferred I/O block size: %ld bytes\n", (long)sb-&gt;st_blksize);</div><div class='add'>+    printf("File size:                %lld bytes\n", (long long)sb-&gt;st_size);</div><div class='add'>+    printf("Blocks allocated:         %lld\n", (long long)sb-&gt;st_blocks);</div><div class='add'>+</div><div class='add'>+    printf("Last status change:       %s", ctime(&amp;sb-&gt;st_ctime));</div><div class='add'>+    printf("Last file access:         %s", ctime(&amp;sb-&gt;st_atime));</div><div class='add'>+    printf("Last file modification:   %s", ctime(&amp;sb-&gt;st_mtime));</div><div class='add'>+</div><div class='add'>+    return;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+peek_handle(unsigned char *glid)</div><div class='add'>+{</div><div class='add'>+    int i;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; GFAPI_HANDLE_LENGTH; i++) {</div><div class='add'>+        printf(":%02x:", glid[i]);</div><div class='add'>+    }</div><div class='add'>+    printf("\n");</div><div class='add'>+}</div><div class='add'>+#else  /* DEBUG */</div><div class='add'>+static void</div><div class='add'>+peek_stat(struct stat *sb)</div><div class='add'>+{</div><div class='add'>+    return;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+peek_handle(unsigned char *id)</div><div class='add'>+{</div><div class='add'>+    return;</div><div class='add'>+}</div><div class='add'>+#endif /* DEBUG */</div><div class='add'>+</div><div class='add'>+glfs_t *fs = NULL;</div><div class='add'>+char *full_parent_name = "/testdir", *parent_name = "testdir";</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+test_h_unlink(void)</div><div class='add'>+{</div><div class='add'>+    char *my_dir = "unlinkdir";</div><div class='add'>+    char *my_file = "file.txt";</div><div class='add'>+    char *my_subdir = "dir1";</div><div class='add'>+    struct glfs_object *parent = NULL, *leaf = NULL, *dir = NULL,</div><div class='add'>+                       *subdir = NULL, *subleaf = NULL;</div><div class='add'>+    struct stat sb;</div><div class='add'>+    int ret;</div><div class='add'>+</div><div class='add'>+    printf("glfs_h_unlink tests: In Progress\n");</div><div class='add'>+</div><div class='add'>+    /* Prepare tests */</div><div class='add'>+    parent = glfs_h_lookupat(fs, NULL, full_parent_name, &amp;sb, 0);</div><div class='add'>+    if (parent == NULL) {</div><div class='add'>+        fprintf(stderr,</div><div class='add'>+                "glfs_h_lookupat: error on lookup of %s: from (%p),%s\n",</div><div class='add'>+                full_parent_name, NULL, strerror(errno));</div><div class='add'>+        printf("glfs_h_lookupat tests: FAILED\n");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    peek_stat(&amp;sb);</div><div class='add'>+</div><div class='add'>+    dir = glfs_h_mkdir(fs, parent, my_dir, 0755, &amp;sb);</div><div class='add'>+    if (dir == NULL) {</div><div class='add'>+        fprintf(stderr, "glfs_h_mkdir: error creating %s: from (%p),%s\n",</div><div class='add'>+                my_dir, parent, strerror(errno));</div><div class='add'>+        printf("glfs_h_unlink tests: FAILED\n");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    leaf = glfs_h_creat(fs, dir, my_file, O_CREAT, 0644, &amp;sb);</div><div class='add'>+    if (leaf == NULL) {</div><div class='add'>+        fprintf(stderr, "glfs_h_creat: error creating %s: from (%p),%s\n",</div><div class='add'>+                my_file, dir, strerror(errno));</div><div class='add'>+        printf("glfs_h_unlink tests: FAILED\n");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    subdir = glfs_h_mkdir(fs, dir, my_subdir, 0755, &amp;sb);</div><div class='add'>+    if (subdir == NULL) {</div><div class='add'>+        fprintf(stderr, "glfs_h_mkdir: error creating %s: from (%p),%s\n",</div><div class='add'>+                my_subdir, dir, strerror(errno));</div><div class='add'>+        printf("glfs_h_unlink tests: FAILED\n");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    subleaf = glfs_h_creat(fs, subdir, my_file, O_CREAT, 0644, &amp;sb);</div><div class='add'>+    if (subleaf == NULL) {</div><div class='add'>+        fprintf(stderr, "glfs_h_creat: error creating %s: from (%p),%s\n",</div><div class='add'>+                my_file, subdir, strerror(errno));</div><div class='add'>+        printf("glfs_h_unlink tests: FAILED\n");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* unlink non empty directory */</div><div class='add'>+    ret = glfs_h_unlink(fs, dir, my_subdir);</div><div class='add'>+    if ((ret &amp;&amp; errno != ENOTEMPTY) || (ret == 0)) {</div><div class='add'>+        fprintf(stderr,</div><div class='add'>+                "glfs_h_unlink: error unlinking %s: it is non empty: %s\n",</div><div class='add'>+                my_subdir, strerror(errno));</div><div class='add'>+        printf("glfs_h_unlink tests: FAILED\n");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* unlink regular file */</div><div class='add'>+    ret = glfs_h_unlink(fs, subdir, my_file);</div><div class='add'>+    if (ret) {</div><div class='add'>+        fprintf(stderr, "glfs_h_unlink: error unlinking %s: from (%p),%s\n",</div><div class='add'>+                my_file, subdir, strerror(errno));</div><div class='add'>+        printf("glfs_h_unlink tests: FAILED\n");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* unlink directory */</div><div class='add'>+    ret = glfs_h_unlink(fs, dir, my_subdir);</div><div class='add'>+    if (ret) {</div><div class='add'>+        fprintf(stderr, "glfs_h_unlink: error unlinking %s: from (%p),%s\n",</div><div class='add'>+                my_subdir, dir, strerror(errno));</div><div class='add'>+        printf("glfs_h_unlink tests: FAILED\n");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* unlink regular file */</div><div class='add'>+    ret = glfs_h_unlink(fs, dir, my_file);</div><div class='add'>+    if (ret) {</div><div class='add'>+        fprintf(stderr, "glfs_h_unlink: error unlinking %s: from (%p),%s\n",</div><div class='add'>+                my_file, dir, strerror(errno));</div><div class='add'>+        printf("glfs_h_unlink tests: FAILED\n");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* unlink non-existent regular file */</div><div class='add'>+    ret = glfs_h_unlink(fs, dir, my_file);</div><div class='add'>+    if ((ret &amp;&amp; errno != ENOENT) || (ret == 0)) {</div><div class='add'>+        fprintf(stderr,</div><div class='add'>+                "glfs_h_unlink: error unlinking non-existent %s: invalid errno "</div><div class='add'>+                ",%d, %s\n",</div><div class='add'>+                my_file, ret, strerror(errno));</div><div class='add'>+        printf("glfs_h_unlink tests: FAILED\n");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* unlink non-existent directory */</div><div class='add'>+    ret = glfs_h_unlink(fs, dir, my_subdir);</div><div class='add'>+    if ((ret &amp;&amp; errno != ENOENT) || (ret == 0)) {</div><div class='add'>+        fprintf(stderr,</div><div class='add'>+                "glfs_h_unlink: error unlinking non-existent %s:  invalid "</div><div class='add'>+                "errno ,%d, %s\n",</div><div class='add'>+                my_subdir, ret, strerror(errno));</div><div class='add'>+        printf("glfs_h_unlink tests: FAILED\n");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* unlink directory */</div><div class='add'>+    ret = glfs_h_unlink(fs, parent, my_dir);</div><div class='add'>+    if (ret) {</div><div class='add'>+        fprintf(stderr, "glfs_h_unlink: error unlinking %s: from (%p),%s\n",</div><div class='add'>+                my_dir, dir, strerror(errno));</div><div class='add'>+        printf("glfs_h_unlink tests: FAILED\n");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    printf("glfs_h_unlink tests: PASSED\n");</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (dir)</div><div class='add'>+        glfs_h_close(dir);</div><div class='add'>+    if (leaf)</div><div class='add'>+        glfs_h_close(leaf);</div><div class='add'>+    if (subdir)</div><div class='add'>+        glfs_h_close(subdir);</div><div class='add'>+    if (subleaf)</div><div class='add'>+        glfs_h_close(subleaf);</div><div class='add'>+    if (parent)</div><div class='add'>+        glfs_h_close(parent);</div><div class='add'>+</div><div class='add'>+    return;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+test_h_getsetattrs(void)</div><div class='add'>+{</div><div class='add'>+    char *my_dir = "attrdir";</div><div class='add'>+    char *my_file = "attrfile.txt";</div><div class='add'>+    struct glfs_object *parent = NULL, *leaf = NULL, *dir = NULL;</div><div class='add'>+    struct stat sb, retsb;</div><div class='add'>+    int ret, valid;</div><div class='add'>+    struct timespec timestamp;</div><div class='add'>+</div><div class='add'>+    printf("glfs_h_getattrs and setattrs tests: In Progress\n");</div><div class='add'>+</div><div class='add'>+    /* Prepare tests */</div><div class='add'>+    parent = glfs_h_lookupat(fs, NULL, full_parent_name, &amp;sb, 0);</div><div class='add'>+    if (parent == NULL) {</div><div class='add'>+        fprintf(stderr,</div><div class='add'>+                "glfs_h_lookupat: error on lookup of %s: from (%p),%s\n",</div><div class='add'>+                full_parent_name, NULL, strerror(errno));</div><div class='add'>+        printf("glfs_h_lookupat tests: FAILED\n");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    peek_stat(&amp;sb);</div><div class='add'>+</div><div class='add'>+    dir = glfs_h_mkdir(fs, parent, my_dir, 0755, &amp;sb);</div><div class='add'>+    if (dir == NULL) {</div><div class='add'>+        fprintf(stderr, "glfs_h_mkdir: error creating %s: from (%p),%s\n",</div><div class='add'>+                my_dir, parent, strerror(errno));</div><div class='add'>+        printf("glfs_h_unlink tests: FAILED\n");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    peek_stat(&amp;sb);</div><div class='add'>+</div><div class='add'>+    leaf = glfs_h_creat(fs, dir, my_file, O_CREAT, 0644, &amp;sb);</div><div class='add'>+    if (leaf == NULL) {</div><div class='add'>+        fprintf(stderr, "glfs_h_creat: error creating %s: from (%p),%s\n",</div><div class='add'>+                my_file, dir, strerror(errno));</div><div class='add'>+        printf("glfs_h_unlink tests: FAILED\n");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    peek_stat(&amp;sb);</div><div class='add'>+</div><div class='add'>+    ret = glfs_h_getattrs(fs, dir, &amp;retsb);</div><div class='add'>+    if (ret != 0) {</div><div class='add'>+        fprintf(stderr, "glfs_h_getattrs: error %s: from (%p),%s\n", my_dir,</div><div class='add'>+                dir, strerror(errno));</div><div class='add'>+        printf("glfs_h_getattrs and setattrs tests: FAILED\n");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    peek_stat(&amp;retsb);</div><div class='add'>+    /* TODO: Compare stat information */</div><div class='add'>+</div><div class='add'>+    retsb.st_mode = 00666;</div><div class='add'>+    retsb.st_uid = 1000;</div><div class='add'>+    retsb.st_gid = 1001;</div><div class='add'>+    ret = clock_gettime(CLOCK_REALTIME, &amp;timestamp);</div><div class='add'>+    if (ret != 0) {</div><div class='add'>+        fprintf(stderr, "clock_gettime: error %s\n", strerror(errno));</div><div class='add'>+        printf("glfs_h_getattrs and setattrs tests: FAILED\n");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    retsb.st_atim = timestamp;</div><div class='add'>+    retsb.st_mtim = timestamp;</div><div class='add'>+    valid = GFAPI_SET_ATTR_MODE | GFAPI_SET_ATTR_UID | GFAPI_SET_ATTR_GID |</div><div class='add'>+            GFAPI_SET_ATTR_ATIME | GFAPI_SET_ATTR_MTIME;</div><div class='add'>+    peek_stat(&amp;retsb);</div><div class='add'>+</div><div class='add'>+    ret = glfs_h_setattrs(fs, dir, &amp;retsb, valid);</div><div class='add'>+    if (ret != 0) {</div><div class='add'>+        fprintf(stderr, "glfs_h_setattrs: error %s: from (%p),%s\n", my_dir,</div><div class='add'>+                dir, strerror(errno));</div><div class='add'>+        printf("glfs_h_getattrs and setattrs tests: FAILED\n");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    memset(&amp;retsb, 0, sizeof(struct stat));</div><div class='add'>+    ret = glfs_h_stat(fs, dir, &amp;retsb);</div><div class='add'>+    if (ret != 0) {</div><div class='add'>+        fprintf(stderr, "glfs_h_stat: error %s: from (%p),%s\n", my_dir, dir,</div><div class='add'>+                strerror(errno));</div><div class='add'>+        printf("glfs_h_getattrs and setattrs tests: FAILED\n");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    peek_stat(&amp;retsb);</div><div class='add'>+</div><div class='add'>+    printf("glfs_h_getattrs and setattrs tests: PASSED\n");</div><div class='add'>+out:</div><div class='add'>+    if (parent)</div><div class='add'>+        glfs_h_close(parent);</div><div class='add'>+    if (leaf)</div><div class='add'>+        glfs_h_close(leaf);</div><div class='add'>+    if (dir)</div><div class='add'>+        glfs_h_close(dir);</div><div class='add'>+</div><div class='add'>+    return;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+test_h_truncate(void)</div><div class='add'>+{</div><div class='add'>+    char *my_dir = "truncatedir";</div><div class='add'>+    char *my_file = "file.txt";</div><div class='add'>+    struct glfs_object *root = NULL, *parent = NULL, *leaf = NULL;</div><div class='add'>+    struct stat sb;</div><div class='add'>+    glfs_fd_t *fd = NULL;</div><div class='add'>+    char buf[32];</div><div class='add'>+    off_t offset = 0;</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    printf("glfs_h_truncate tests: In Progress\n");</div><div class='add'>+</div><div class='add'>+    /* Prepare tests */</div><div class='add'>+    root = glfs_h_lookupat(fs, NULL, full_parent_name, &amp;sb, 0);</div><div class='add'>+    if (root == NULL) {</div><div class='add'>+        fprintf(stderr,</div><div class='add'>+                "glfs_h_lookupat: error on lookup of %s: from (%p),%s\n",</div><div class='add'>+                full_parent_name, NULL, strerror(errno));</div><div class='add'>+        printf("glfs_h_truncate tests: FAILED\n");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    peek_stat(&amp;sb);</div><div class='add'>+</div><div class='add'>+    parent = glfs_h_mkdir(fs, root, my_dir, 0755, &amp;sb);</div><div class='add'>+    if (parent == NULL) {</div><div class='add'>+        fprintf(stderr, "glfs_h_mkdir: error creating %s: from (%p),%s\n",</div><div class='add'>+                my_dir, root, strerror(errno));</div><div class='add'>+        printf("glfs_h_truncate tests: FAILED\n");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    peek_stat(&amp;sb);</div><div class='add'>+</div><div class='add'>+    leaf = glfs_h_creat(fs, parent, my_file, O_CREAT, 0644, &amp;sb);</div><div class='add'>+    if (leaf == NULL) {</div><div class='add'>+        fprintf(stderr, "glfs_h_creat: error creating %s: from (%p),%s\n",</div><div class='add'>+                my_file, parent, strerror(errno));</div><div class='add'>+        printf("glfs_h_truncate tests: FAILED\n");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    peek_stat(&amp;sb);</div><div class='add'>+</div><div class='add'>+    fd = glfs_h_open(fs, leaf, O_RDWR);</div><div class='add'>+    if (fd == NULL) {</div><div class='add'>+        fprintf(stderr, "glfs_h_open: error on open of %s: %s\n", my_file,</div><div class='add'>+                strerror(errno));</div><div class='add'>+        printf("glfs_h_truncate tests: FAILED\n");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    memcpy(buf, "abcdefghijklmnopqrstuvwxyz012345", 32);</div><div class='add'>+    ret = glfs_write(fd, buf, 32, 0);</div><div class='add'>+</div><div class='add'>+    /* run tests */</div><div class='add'>+    /* truncate lower */</div><div class='add'>+    offset = 30;</div><div class='add'>+    ret = glfs_h_truncate(fs, leaf, offset);</div><div class='add'>+    if (ret != 0) {</div><div class='add'>+        fprintf(stderr, "glfs_h_truncate: error creating %s: from (%p),%s\n",</div><div class='add'>+                my_file, parent, strerror(errno));</div><div class='add'>+        printf("glfs_h_truncate tests: FAILED\n");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    ret = glfs_h_getattrs(fs, leaf, &amp;sb);</div><div class='add'>+    if (ret != 0) {</div><div class='add'>+        fprintf(stderr, "glfs_h_getattrs: error for %s (%p),%s\n", my_file,</div><div class='add'>+                leaf, strerror(errno));</div><div class='add'>+        printf("glfs_h_truncate tests: FAILED\n");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    if (sb.st_size != offset) {</div><div class='add'>+        fprintf(stderr, "glfs_h_truncate: post size mismatch\n");</div><div class='add'>+        printf("glfs_h_truncate tests: FAILED\n");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* truncate higher */</div><div class='add'>+    offset = 32;</div><div class='add'>+    ret = glfs_h_truncate(fs, leaf, offset);</div><div class='add'>+    if (ret != 0) {</div><div class='add'>+        fprintf(stderr, "glfs_h_truncate: error creating %s: from (%p),%s\n",</div><div class='add'>+                my_file, parent, strerror(errno));</div><div class='add'>+        printf("glfs_h_truncate tests: FAILED\n");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    ret = glfs_h_getattrs(fs, leaf, &amp;sb);</div><div class='add'>+    if (ret != 0) {</div><div class='add'>+        fprintf(stderr, "glfs_h_getattrs: error for %s (%p),%s\n", my_file,</div><div class='add'>+                leaf, strerror(errno));</div><div class='add'>+        printf("glfs_h_truncate tests: FAILED\n");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    if (sb.st_size != offset) {</div><div class='add'>+        fprintf(stderr, "glfs_h_truncate: post size mismatch\n");</div><div class='add'>+        printf("glfs_h_truncate tests: FAILED\n");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* truncate equal */</div><div class='add'>+    offset = 30;</div><div class='add'>+    ret = glfs_h_truncate(fs, leaf, offset);</div><div class='add'>+    if (ret != 0) {</div><div class='add'>+        fprintf(stderr, "glfs_h_truncate: error creating %s: from (%p),%s\n",</div><div class='add'>+                my_file, parent, strerror(errno));</div><div class='add'>+        printf("glfs_h_truncate tests: FAILED\n");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    ret = glfs_h_getattrs(fs, leaf, &amp;sb);</div><div class='add'>+    if (ret != 0) {</div><div class='add'>+        fprintf(stderr, "glfs_h_getattrs: error for %s (%p),%s\n", my_file,</div><div class='add'>+                leaf, strerror(errno));</div><div class='add'>+        printf("glfs_h_truncate tests: FAILED\n");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    if (sb.st_size != offset) {</div><div class='add'>+        fprintf(stderr, "glfs_h_truncate: post size mismatch\n");</div><div class='add'>+        printf("glfs_h_truncate tests: FAILED\n");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    printf("glfs_h_truncate tests: PASSED\n");</div><div class='add'>+out:</div><div class='add'>+    if (fd)</div><div class='add'>+        glfs_close(fd);</div><div class='add'>+    if (root)</div><div class='add'>+        glfs_h_close(root);</div><div class='add'>+    if (parent)</div><div class='add'>+        glfs_h_close(parent);</div><div class='add'>+    if (leaf)</div><div class='add'>+        glfs_h_close(leaf);</div><div class='add'>+</div><div class='add'>+    return;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+test_h_links(void)</div><div class='add'>+{</div><div class='add'>+    char *my_dir = "linkdir";</div><div class='add'>+    char *my_file = "file.txt";</div><div class='add'>+    char *my_symlnk = "slnk.txt";</div><div class='add'>+    char *my_lnk = "lnk.txt";</div><div class='add'>+    char *linksrc_dir = "dir1";</div><div class='add'>+    char *linktgt_dir = "dir2";</div><div class='add'>+    struct glfs_object *root = NULL, *parent = NULL, *leaf = NULL,</div><div class='add'>+                       *dirsrc = NULL, *dirtgt = NULL, *dleaf = NULL;</div><div class='add'>+    struct glfs_object *ln1 = NULL;</div><div class='add'>+    struct stat sb;</div><div class='add'>+    int ret;</div><div class='add'>+    char *buf = NULL;</div><div class='add'>+</div><div class='add'>+    printf("glfs_h_link(s) tests: In Progress\n");</div><div class='add'>+</div><div class='add'>+    /* Prepare tests */</div><div class='add'>+    root = glfs_h_lookupat(fs, NULL, full_parent_name, &amp;sb, 0);</div><div class='add'>+    if (root == NULL) {</div><div class='add'>+        fprintf(stderr,</div><div class='add'>+                "glfs_h_lookupat: error on lookup of %s: from (%p),%s\n",</div><div class='add'>+                full_parent_name, NULL, strerror(errno));</div><div class='add'>+        printf("glfs_h_link(s) tests: FAILED\n");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    peek_stat(&amp;sb);</div><div class='add'>+</div><div class='add'>+    parent = glfs_h_mkdir(fs, root, my_dir, 0755, &amp;sb);</div><div class='add'>+    if (parent == NULL) {</div><div class='add'>+        fprintf(stderr, "glfs_h_mkdir: error creating %s: from (%p),%s\n",</div><div class='add'>+                my_dir, root, strerror(errno));</div><div class='add'>+        printf("glfs_h_link(s) tests: FAILED\n");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    peek_stat(&amp;sb);</div><div class='add'>+</div><div class='add'>+    leaf = glfs_h_creat(fs, parent, my_file, O_CREAT, 0644, &amp;sb);</div><div class='add'>+    if (leaf == NULL) {</div><div class='add'>+        fprintf(stderr, "glfs_h_creat: error creating %s: from (%p),%s\n",</div><div class='add'>+                my_file, parent, strerror(errno));</div><div class='add'>+        printf("glfs_h_link(s) tests: FAILED\n");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    peek_stat(&amp;sb);</div><div class='add'>+</div><div class='add'>+    dirsrc = glfs_h_mkdir(fs, parent, linksrc_dir, 0755, &amp;sb);</div><div class='add'>+    if (dirsrc == NULL) {</div><div class='add'>+        fprintf(stderr, "glfs_h_mkdir: error creating %s: from (%p),%s\n",</div><div class='add'>+                linksrc_dir, parent, strerror(errno));</div><div class='add'>+        printf("glfs_h_link(s) tests: FAILED\n");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    peek_stat(&amp;sb);</div><div class='add'>+</div><div class='add'>+    dirtgt = glfs_h_mkdir(fs, parent, linktgt_dir, 0755, &amp;sb);</div><div class='add'>+    if (dirtgt == NULL) {</div><div class='add'>+        fprintf(stderr, "glfs_h_mkdir: error creating %s: from (%p),%s\n",</div><div class='add'>+                linktgt_dir, parent, strerror(errno));</div><div class='add'>+        printf("glfs_h_link(s) tests: FAILED\n");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    peek_stat(&amp;sb);</div><div class='add'>+</div><div class='add'>+    dleaf = glfs_h_creat(fs, dirsrc, my_file, O_CREAT, 0644, &amp;sb);</div><div class='add'>+    if (dleaf == NULL) {</div><div class='add'>+        fprintf(stderr, "glfs_h_creat: error creating %s: from (%p),%s\n",</div><div class='add'>+                my_file, dirsrc, strerror(errno));</div><div class='add'>+        printf("glfs_h_link(s) tests: FAILED\n");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    peek_stat(&amp;sb);</div><div class='add'>+</div><div class='add'>+    /* run tests */</div><div class='add'>+    /* sym link: /testdir/linkdir/file.txt to ./slnk.txt */</div><div class='add'>+    ln1 = glfs_h_symlink(fs, parent, my_symlnk, "./file.txt", &amp;sb);</div><div class='add'>+    if (ln1 == NULL) {</div><div class='add'>+        fprintf(stderr, "glfs_h_symlink: error creating %s: from (%p),%s\n",</div><div class='add'>+                my_symlnk, parent, strerror(errno));</div><div class='add'>+        printf("glfs_h_link(s) tests: FAILED\n");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    peek_stat(&amp;sb);</div><div class='add'>+</div><div class='add'>+    buf = calloc(1024, sizeof(char));</div><div class='add'>+    if (buf == NULL) {</div><div class='add'>+        fprintf(stderr, "Error allocating memory\n");</div><div class='add'>+        printf("glfs_h_link(s) tests: FAILED\n");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = glfs_h_readlink(fs, ln1, buf, 1024);</div><div class='add'>+    if (ret &lt;= 0) {</div><div class='add'>+        fprintf(stderr, "glfs_h_readlink: error reading %s: from (%p),%s\n",</div><div class='add'>+                my_symlnk, ln1, strerror(errno));</div><div class='add'>+        printf("glfs_h_link(s) tests: FAILED\n");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    if (!(strncmp(buf, my_symlnk, strlen(my_symlnk)))) {</div><div class='add'>+        fprintf(stderr,</div><div class='add'>+                "glfs_h_readlink: error mismatch in link name: actual %s: "</div><div class='add'>+                "retrieved %s\n",</div><div class='add'>+                my_symlnk, buf);</div><div class='add'>+        printf("glfs_h_link(s) tests: FAILED\n");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* link: /testdir/linkdir/file.txt to ./lnk.txt */</div><div class='add'>+    ret = glfs_h_link(fs, leaf, parent, my_lnk);</div><div class='add'>+    if (ret != 0) {</div><div class='add'>+        fprintf(stderr, "glfs_h_link: error creating %s: from (%p),%s\n",</div><div class='add'>+                my_lnk, parent, strerror(errno));</div><div class='add'>+        printf("glfs_h_link(s) tests: FAILED\n");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    /* TODO: Should write content to a file and read from the link */</div><div class='add'>+</div><div class='add'>+    /* link: /testdir/linkdir/dir1/file.txt to ../dir2/slnk.txt */</div><div class='add'>+    ret = glfs_h_link(fs, dleaf, dirtgt, my_lnk);</div><div class='add'>+    if (ret != 0) {</div><div class='add'>+        fprintf(stderr, "glfs_h_link: error creating %s: from (%p),%s\n",</div><div class='add'>+                my_lnk, dirtgt, strerror(errno));</div><div class='add'>+        printf("glfs_h_link(s) tests: FAILED\n");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    /* TODO: Should write content to a file and read from the link */</div><div class='add'>+</div><div class='add'>+    printf("glfs_h_link(s) tests: PASSED\n");</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (root)</div><div class='add'>+        glfs_h_close(root);</div><div class='add'>+    if (parent)</div><div class='add'>+        glfs_h_close(parent);</div><div class='add'>+    if (leaf)</div><div class='add'>+        glfs_h_close(leaf);</div><div class='add'>+    if (dirsrc)</div><div class='add'>+        glfs_h_close(dirsrc);</div><div class='add'>+    if (dirtgt)</div><div class='add'>+        glfs_h_close(dirtgt);</div><div class='add'>+    if (dleaf)</div><div class='add'>+        glfs_h_close(dleaf);</div><div class='add'>+    if (ln1)</div><div class='add'>+        glfs_h_close(ln1);</div><div class='add'>+    if (buf)</div><div class='add'>+        free(buf);</div><div class='add'>+</div><div class='add'>+    return;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+test_h_rename(void)</div><div class='add'>+{</div><div class='add'>+    char *my_dir = "renamedir";</div><div class='add'>+    char *my_file = "file.txt";</div><div class='add'>+    char *src_dir = "dir1";</div><div class='add'>+    char *tgt_dir = "dir2";</div><div class='add'>+    struct glfs_object *root = NULL, *parent = NULL, *leaf = NULL,</div><div class='add'>+                       *dirsrc = NULL, *dirtgt = NULL, *dleaf = NULL;</div><div class='add'>+    struct stat sb;</div><div class='add'>+    int ret;</div><div class='add'>+</div><div class='add'>+    printf("glfs_h_rename tests: In Progress\n");</div><div class='add'>+</div><div class='add'>+    /* Prepare tests */</div><div class='add'>+    root = glfs_h_lookupat(fs, NULL, full_parent_name, &amp;sb, 0);</div><div class='add'>+    if (root == NULL) {</div><div class='add'>+        fprintf(stderr,</div><div class='add'>+                "glfs_h_lookupat: error on lookup of %s: from (%p),%s\n",</div><div class='add'>+                full_parent_name, NULL, strerror(errno));</div><div class='add'>+        printf("glfs_h_rename tests: FAILED\n");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    peek_stat(&amp;sb);</div><div class='add'>+</div><div class='add'>+    parent = glfs_h_mkdir(fs, root, my_dir, 0755, &amp;sb);</div><div class='add'>+    if (parent == NULL) {</div><div class='add'>+        fprintf(stderr, "glfs_h_mkdir: error creating %s: from (%p),%s\n",</div><div class='add'>+                my_dir, root, strerror(errno));</div><div class='add'>+        printf("glfs_h_rename tests: FAILED\n");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    peek_stat(&amp;sb);</div><div class='add'>+</div><div class='add'>+    leaf = glfs_h_creat(fs, parent, my_file, O_CREAT, 0644, &amp;sb);</div><div class='add'>+    if (leaf == NULL) {</div><div class='add'>+        fprintf(stderr, "glfs_h_creat: error creating %s: from (%p),%s\n",</div><div class='add'>+                my_file, parent, strerror(errno));</div><div class='add'>+        printf("glfs_h_rename tests: FAILED\n");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    peek_stat(&amp;sb);</div><div class='add'>+</div><div class='add'>+    dirsrc = glfs_h_mkdir(fs, parent, src_dir, 0755, &amp;sb);</div><div class='add'>+    if (dirsrc == NULL) {</div><div class='add'>+        fprintf(stderr, "glfs_h_mkdir: error creating %s: from (%p),%s\n",</div><div class='add'>+                src_dir, parent, strerror(errno));</div><div class='add'>+        printf("glfs_h_rename tests: FAILED\n");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    peek_stat(&amp;sb);</div><div class='add'>+</div><div class='add'>+    dirtgt = glfs_h_mkdir(fs, parent, tgt_dir, 0755, &amp;sb);</div><div class='add'>+    if (dirtgt == NULL) {</div><div class='add'>+        fprintf(stderr, "glfs_h_mkdir: error creating %s: from (%p),%s\n",</div><div class='add'>+                tgt_dir, parent, strerror(errno));</div><div class='add'>+        printf("glfs_h_rename tests: FAILED\n");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    peek_stat(&amp;sb);</div><div class='add'>+</div><div class='add'>+    dleaf = glfs_h_creat(fs, dirsrc, my_file, O_CREAT, 0644, &amp;sb);</div><div class='add'>+    if (dleaf == NULL) {</div><div class='add'>+        fprintf(stderr, "glfs_h_creat: error creating %s: from (%p),%s\n",</div><div class='add'>+                my_file, dirsrc, strerror(errno));</div><div class='add'>+        printf("glfs_h_rename tests: FAILED\n");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    peek_stat(&amp;sb);</div><div class='add'>+</div><div class='add'>+    /* run tests */</div><div class='add'>+    /* Rename file.txt -&gt; file1.txt */</div><div class='add'>+    ret = glfs_h_rename(fs, parent, "file.txt", parent, "file1.txt");</div><div class='add'>+    if (ret != 0) {</div><div class='add'>+        fprintf(stderr, "glfs_h_rename: error renaming %s to %s (%s)\n",</div><div class='add'>+                "file.txt", "file1.txt", strerror(errno));</div><div class='add'>+        printf("glfs_h_rename tests: FAILED\n");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* rename dir1/file.txt -&gt; file.txt */</div><div class='add'>+    ret = glfs_h_rename(fs, dirsrc, "file.txt", parent, "file.txt");</div><div class='add'>+    if (ret != 0) {</div><div class='add'>+        fprintf(stderr, "glfs_h_rename: error renaming %s/%s to %s (%s)\n",</div><div class='add'>+                src_dir, "file.txt", "file.txt", strerror(errno));</div><div class='add'>+        printf("glfs_h_rename tests: FAILED\n");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* rename file1.txt -&gt; file.txt (exists) */</div><div class='add'>+    ret = glfs_h_rename(fs, parent, "file1.txt", parent, "file.txt");</div><div class='add'>+    if (ret != 0) {</div><div class='add'>+        fprintf(stderr, "glfs_h_rename: error renaming %s to %s (%s)\n",</div><div class='add'>+                "file.txt", "file.txt", strerror(errno));</div><div class='add'>+        printf("glfs_h_rename tests: FAILED\n");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* rename dir1 -&gt; dir3 */</div><div class='add'>+    ret = glfs_h_rename(fs, parent, "dir1", parent, "dir3");</div><div class='add'>+    if (ret != 0) {</div><div class='add'>+        fprintf(stderr, "glfs_h_rename: error renaming %s to %s (%s)\n", "dir1",</div><div class='add'>+                "dir3", strerror(errno));</div><div class='add'>+        printf("glfs_h_rename tests: FAILED\n");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* rename dir2 -&gt;dir3 (exists) */</div><div class='add'>+    ret = glfs_h_rename(fs, parent, "dir2", parent, "dir3");</div><div class='add'>+    if (ret != 0) {</div><div class='add'>+        fprintf(stderr, "glfs_h_rename: error renaming %s to %s (%s)\n", "dir2",</div><div class='add'>+                "dir3", strerror(errno));</div><div class='add'>+        printf("glfs_h_rename tests: FAILED\n");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* rename file.txt -&gt; dir3 (fail) */</div><div class='add'>+    ret = glfs_h_rename(fs, parent, "file.txt", parent, "dir3");</div><div class='add'>+    if (ret == 0) {</div><div class='add'>+        fprintf(stderr, "glfs_h_rename: NO error renaming %s to %s (%s)\n",</div><div class='add'>+                "file.txt", "dir3", strerror(errno));</div><div class='add'>+        printf("glfs_h_rename tests: FAILED\n");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* rename dir3 -&gt; file.txt (fail) */</div><div class='add'>+    ret = glfs_h_rename(fs, parent, "dir3", parent, "file.txt");</div><div class='add'>+    if (ret == 0) {</div><div class='add'>+        fprintf(stderr, "glfs_h_rename: NO error renaming %s to %s (%s)\n",</div><div class='add'>+                "dir3", "file.txt", strerror(errno));</div><div class='add'>+        printf("glfs_h_rename tests: FAILED\n");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    printf("glfs_h_rename tests: PASSED\n");</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (root)</div><div class='add'>+        glfs_h_close(root);</div><div class='add'>+    if (parent)</div><div class='add'>+        glfs_h_close(parent);</div><div class='add'>+    if (leaf)</div><div class='add'>+        glfs_h_close(leaf);</div><div class='add'>+    if (dirsrc)</div><div class='add'>+        glfs_h_close(dirsrc);</div><div class='add'>+    if (dirtgt)</div><div class='add'>+        glfs_h_close(dirtgt);</div><div class='add'>+    if (dleaf)</div><div class='add'>+        glfs_h_close(dleaf);</div><div class='add'>+</div><div class='add'>+    return;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+assimilatetime(struct timespec *ts, struct timespec ts_st,</div><div class='add'>+               struct timespec ts_ed)</div><div class='add'>+{</div><div class='add'>+    if ((ts_ed.tv_nsec - ts_st.tv_nsec) &lt; 0) {</div><div class='add'>+        ts-&gt;tv_sec += ts_ed.tv_sec - ts_st.tv_sec - 1;</div><div class='add'>+        ts-&gt;tv_nsec += 1000000000 + ts_ed.tv_nsec - ts_st.tv_nsec;</div><div class='add'>+    } else {</div><div class='add'>+        ts-&gt;tv_sec += ts_ed.tv_sec - ts_st.tv_sec;</div><div class='add'>+        ts-&gt;tv_nsec += ts_ed.tv_nsec - ts_st.tv_nsec;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (ts-&gt;tv_nsec &gt; 1000000000) {</div><div class='add'>+        ts-&gt;tv_nsec = ts-&gt;tv_nsec - 1000000000;</div><div class='add'>+        ts-&gt;tv_sec += 1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#define MAX_FILES_CREATE 10</div><div class='add'>+#define MAXPATHNAME 512</div><div class='add'>+void</div><div class='add'>+test_h_performance(void)</div><div class='add'>+{</div><div class='add'>+    char *my_dir = "perftest", *full_dir_path = "/testdir/perftest";</div><div class='add'>+    char *my_file = "file_", my_file_name[MAXPATHNAME];</div><div class='add'>+    struct glfs_object *parent = NULL, *leaf = NULL, *dir = NULL;</div><div class='add'>+    struct stat sb;</div><div class='add'>+    int ret, i;</div><div class='add'>+    struct glfs_fd *fd;</div><div class='add'>+    struct timespec c_ts = {0, 0}, c_ts_st, c_ts_ed;</div><div class='add'>+    struct timespec o_ts = {0, 0}, o_ts_st, o_ts_ed;</div><div class='add'>+</div><div class='add'>+    printf("glfs_h_performance tests: In Progress\n");</div><div class='add'>+</div><div class='add'>+    /* Prepare tests */</div><div class='add'>+    parent = glfs_h_lookupat(fs, NULL, full_parent_name, &amp;sb, 0);</div><div class='add'>+    if (parent == NULL) {</div><div class='add'>+        fprintf(stderr,</div><div class='add'>+                "glfs_h_lookupat: error on lookup of %s: from (%p),%s\n",</div><div class='add'>+                full_parent_name, NULL, strerror(errno));</div><div class='add'>+        printf("glfs_h_performance tests: FAILED\n");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    dir = glfs_h_mkdir(fs, parent, my_dir, 0755, &amp;sb);</div><div class='add'>+    if (dir == NULL) {</div><div class='add'>+        fprintf(stderr, "glfs_h_mkdir: error creating %s: from (%p),%s\n",</div><div class='add'>+                my_dir, parent, strerror(errno));</div><div class='add'>+        printf("glfs_h_performance tests: FAILED\n");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    peek_stat(&amp;sb);</div><div class='add'>+</div><div class='add'>+    /* create performance */</div><div class='add'>+    ret = clock_gettime(CLOCK_REALTIME, &amp;o_ts_st);</div><div class='add'>+    if (ret != 0) {</div><div class='add'>+        fprintf(stderr, "clock_gettime: error %s\n", strerror(errno));</div><div class='add'>+        printf("glfs_h_getattrs and setattrs tests: FAILED\n");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; MAX_FILES_CREATE; i++) {</div><div class='add'>+        sprintf(my_file_name, "%s%d", my_file, i);</div><div class='add'>+</div><div class='add'>+        ret = clock_gettime(CLOCK_REALTIME, &amp;c_ts_st);</div><div class='add'>+        if (ret != 0) {</div><div class='add'>+            fprintf(stderr, "clock_gettime: error %s\n", strerror(errno));</div><div class='add'>+            printf("glfs_h_getattrs and setattrs tests: FAILED\n");</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        leaf = glfs_h_lookupat(fs, dir, my_file_name, &amp;sb, 0);</div><div class='add'>+        if (leaf != NULL) {</div><div class='add'>+            fprintf(stderr, "glfs_h_lookup: exists %s\n", my_file_name);</div><div class='add'>+            printf("glfs_h_performance tests: FAILED\n");</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        leaf = glfs_h_creat(fs, dir, my_file_name, O_CREAT, 0644, &amp;sb);</div><div class='add'>+        if (leaf == NULL) {</div><div class='add'>+            fprintf(stderr, "glfs_h_creat: error creating %s: from (%p),%s\n",</div><div class='add'>+                    my_file, dir, strerror(errno));</div><div class='add'>+            printf("glfs_h_performance tests: FAILED\n");</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        ret = clock_gettime(CLOCK_REALTIME, &amp;c_ts_ed);</div><div class='add'>+        if (ret != 0) {</div><div class='add'>+            fprintf(stderr, "clock_gettime: error %s\n", strerror(errno));</div><div class='add'>+            printf("glfs_h_getattrs and setattrs tests: FAILED\n");</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        assimilatetime(&amp;c_ts, c_ts_st, c_ts_ed);</div><div class='add'>+        glfs_h_close(leaf);</div><div class='add'>+        leaf = NULL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = clock_gettime(CLOCK_REALTIME, &amp;o_ts_ed);</div><div class='add'>+    if (ret != 0) {</div><div class='add'>+        fprintf(stderr, "clock_gettime: error %s\n", strerror(errno));</div><div class='add'>+        printf("glfs_h_getattrs and setattrs tests: FAILED\n");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    assimilatetime(&amp;o_ts, o_ts_st, o_ts_ed);</div><div class='add'>+</div><div class='add'>+    printf("Creation performance (handle based):\n\t# empty files:%d\n",</div><div class='add'>+           MAX_FILES_CREATE);</div><div class='add'>+    printf("\tOverall time:\n\t\tSecs:%ld\n\t\tnSecs:%ld\n", o_ts.tv_sec,</div><div class='add'>+           o_ts.tv_nsec);</div><div class='add'>+    printf("\tcreate call time time:\n\t\tSecs:%ld\n\t\tnSecs:%ld\n",</div><div class='add'>+           c_ts.tv_sec, c_ts.tv_nsec);</div><div class='add'>+</div><div class='add'>+    /* create using path */</div><div class='add'>+    c_ts.tv_sec = o_ts.tv_sec = 0;</div><div class='add'>+    c_ts.tv_nsec = o_ts.tv_nsec = 0;</div><div class='add'>+</div><div class='add'>+    sprintf(my_file_name, "%s1", full_dir_path);</div><div class='add'>+    ret = glfs_mkdir(fs, my_file_name, 0755);</div><div class='add'>+    if (ret != 0) {</div><div class='add'>+        fprintf(stderr, "glfs_mkdir: error creating %s: from (%p),%s\n", my_dir,</div><div class='add'>+                parent, strerror(errno));</div><div class='add'>+        printf("glfs_h_performance tests: FAILED\n");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    peek_stat(&amp;sb);</div><div class='add'>+</div><div class='add'>+    ret = clock_gettime(CLOCK_REALTIME, &amp;o_ts_st);</div><div class='add'>+    if (ret != 0) {</div><div class='add'>+        fprintf(stderr, "clock_gettime: error %s\n", strerror(errno));</div><div class='add'>+        printf("glfs_h_getattrs and setattrs tests: FAILED\n");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; MAX_FILES_CREATE; i++) {</div><div class='add'>+        sprintf(my_file_name, "%s1/%sn%d", full_dir_path, my_file, i);</div><div class='add'>+</div><div class='add'>+        ret = clock_gettime(CLOCK_REALTIME, &amp;c_ts_st);</div><div class='add'>+        if (ret != 0) {</div><div class='add'>+            fprintf(stderr, "clock_gettime: error %s\n", strerror(errno));</div><div class='add'>+            printf("glfs_h_getattrs and setattrs tests: FAILED\n");</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        ret = glfs_stat(fs, my_file_name, &amp;sb);</div><div class='add'>+        if (ret == 0) {</div><div class='add'>+            fprintf(stderr, "glfs_stat: exists %s\n", my_file_name);</div><div class='add'>+            printf("glfs_h_performance tests: FAILED\n");</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        fd = glfs_creat(fs, my_file_name, O_CREAT, 0644);</div><div class='add'>+        if (fd == NULL) {</div><div class='add'>+            fprintf(stderr, "glfs_creat: error creating %s: from (%p),%s\n",</div><div class='add'>+                    my_file, dir, strerror(errno));</div><div class='add'>+            printf("glfs_h_performance tests: FAILED\n");</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        ret = clock_gettime(CLOCK_REALTIME, &amp;c_ts_ed);</div><div class='add'>+        if (ret != 0) {</div><div class='add'>+            fprintf(stderr, "clock_gettime: error %s\n", strerror(errno));</div><div class='add'>+            printf("glfs_h_getattrs and setattrs tests: FAILED\n");</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        assimilatetime(&amp;c_ts, c_ts_st, c_ts_ed);</div><div class='add'>+        glfs_close(fd);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = clock_gettime(CLOCK_REALTIME, &amp;o_ts_ed);</div><div class='add'>+    if (ret != 0) {</div><div class='add'>+        fprintf(stderr, "clock_gettime: error %s\n", strerror(errno));</div><div class='add'>+        printf("glfs_h_getattrs and setattrs tests: FAILED\n");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    assimilatetime(&amp;o_ts, o_ts_st, o_ts_ed);</div><div class='add'>+</div><div class='add'>+    printf("Creation performance (path based):\n\t# empty files:%d\n",</div><div class='add'>+           MAX_FILES_CREATE);</div><div class='add'>+    printf("\tOverall time:\n\t\tSecs:%ld\n\t\tnSecs:%ld\n", o_ts.tv_sec,</div><div class='add'>+           o_ts.tv_nsec);</div><div class='add'>+    printf("\tcreate call time time:\n\t\tSecs:%ld\n\t\tnSecs:%ld\n",</div><div class='add'>+           c_ts.tv_sec, c_ts.tv_nsec);</div><div class='add'>+out:</div><div class='add'>+    return;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+test_handleops(int argc, char *argv[])</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+    glfs_fd_t *fd = NULL;</div><div class='add'>+    struct stat sb = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    struct glfs_object *root = NULL, *parent = NULL, *leaf = NULL, *tmp = NULL;</div><div class='add'>+    char readbuf[32], writebuf[32];</div><div class='add'>+    unsigned char leaf_handle[GFAPI_HANDLE_LENGTH];</div><div class='add'>+</div><div class='add'>+    char *full_leaf_name = "/testdir/testfile.txt", *leaf_name = "testfile.txt",</div><div class='add'>+         *relative_leaf_name = "testdir/testfile.txt";</div><div class='add'>+    char *leaf_name1 = "testfile1.txt";</div><div class='add'>+    char *full_newparent_name = "/testdir/dir1", *newparent_name = "dir1";</div><div class='add'>+    char *full_newnod_name = "/testdir/nod1", *newnod_name = "nod1";</div><div class='add'>+</div><div class='add'>+    /* Initialize test area */</div><div class='add'>+    ret = glfs_mkdir(fs, full_parent_name, 0755);</div><div class='add'>+    if (ret != 0 &amp;&amp; errno != EEXIST) {</div><div class='add'>+        fprintf(stderr, "%s: (%p) %s\n", full_parent_name, fd, strerror(errno));</div><div class='add'>+        printf("Test initialization failed on volume %s\n", argv[1]);</div><div class='add'>+        goto out;</div><div class='add'>+    } else if (ret != 0) {</div><div class='add'>+        printf("Found test directory %s to be existing\n", full_parent_name);</div><div class='add'>+        printf("Cleanup test directory and restart tests\n");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    fd = glfs_creat(fs, full_leaf_name, O_CREAT, 0644);</div><div class='add'>+    if (fd == NULL) {</div><div class='add'>+        fprintf(stderr, "%s: (%p) %s\n", full_leaf_name, fd, strerror(errno));</div><div class='add'>+        printf("Test initialization failed on volume %s\n", argv[1]);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    glfs_close(fd);</div><div class='add'>+</div><div class='add'>+    printf("Initialized the test area, within volume %s\n", argv[1]);</div><div class='add'>+</div><div class='add'>+    /* Handle based APIs test area */</div><div class='add'>+</div><div class='add'>+    /* glfs_lookupat test */</div><div class='add'>+    printf("glfs_h_lookupat tests: In Progress\n");</div><div class='add'>+    /* start at root of the volume */</div><div class='add'>+    root = glfs_h_lookupat(fs, NULL, "/", &amp;sb, 0);</div><div class='add'>+    if (root == NULL) {</div><div class='add'>+        fprintf(stderr,</div><div class='add'>+                "glfs_h_lookupat: error on lookup of %s: from (%p),%s\n", "/",</div><div class='add'>+                NULL, strerror(errno));</div><div class='add'>+        printf("glfs_h_lookupat tests: FAILED\n");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    peek_stat(&amp;sb);</div><div class='add'>+</div><div class='add'>+    /* lookup a parent within root */</div><div class='add'>+    parent = glfs_h_lookupat(fs, root, parent_name, &amp;sb, 0);</div><div class='add'>+    if (parent == NULL) {</div><div class='add'>+        fprintf(stderr,</div><div class='add'>+                "glfs_h_lookupat: error on lookup of %s: from (%p),%s\n",</div><div class='add'>+                parent_name, root, strerror(errno));</div><div class='add'>+        printf("glfs_h_lookupat tests: FAILED\n");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    peek_stat(&amp;sb);</div><div class='add'>+</div><div class='add'>+    /* lookup a leaf/child within the parent */</div><div class='add'>+    leaf = glfs_h_lookupat(fs, parent, leaf_name, &amp;sb, 0);</div><div class='add'>+    if (leaf == NULL) {</div><div class='add'>+        fprintf(stderr,</div><div class='add'>+                "glfs_h_lookupat: error on lookup of %s: from (%p),%s\n",</div><div class='add'>+                leaf_name, parent, strerror(errno));</div><div class='add'>+        printf("glfs_h_lookupat tests: FAILED\n");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    peek_stat(&amp;sb);</div><div class='add'>+</div><div class='add'>+    /* reset */</div><div class='add'>+    glfs_h_close(root);</div><div class='add'>+    root = NULL;</div><div class='add'>+    glfs_h_close(leaf);</div><div class='add'>+    leaf = NULL;</div><div class='add'>+    glfs_h_close(parent);</div><div class='add'>+    parent = NULL;</div><div class='add'>+</div><div class='add'>+    /* check absolute paths */</div><div class='add'>+    root = glfs_h_lookupat(fs, NULL, "/", &amp;sb, 0);</div><div class='add'>+    if (root == NULL) {</div><div class='add'>+        fprintf(stderr,</div><div class='add'>+                "glfs_h_lookupat: error on lookup of %s: from (%p),%s\n", "/",</div><div class='add'>+                NULL, strerror(errno));</div><div class='add'>+        printf("glfs_h_lookupat tests: FAILED\n");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    peek_stat(&amp;sb);</div><div class='add'>+</div><div class='add'>+    parent = glfs_h_lookupat(fs, NULL, full_parent_name, &amp;sb, 0);</div><div class='add'>+    if (parent == NULL) {</div><div class='add'>+        fprintf(stderr,</div><div class='add'>+                "glfs_h_lookupat: error on lookup of %s: from (%p),%s\n",</div><div class='add'>+                full_parent_name, root, strerror(errno));</div><div class='add'>+        printf("glfs_h_lookupat tests: FAILED\n");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    peek_stat(&amp;sb);</div><div class='add'>+</div><div class='add'>+    leaf = glfs_h_lookupat(fs, NULL, full_leaf_name, &amp;sb, 0);</div><div class='add'>+    if (leaf == NULL) {</div><div class='add'>+        fprintf(stderr,</div><div class='add'>+                "glfs_h_lookupat: error on lookup of %s: from (%p),%s\n",</div><div class='add'>+                full_leaf_name, parent, strerror(errno));</div><div class='add'>+        printf("glfs_h_lookupat tests: FAILED\n");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    peek_stat(&amp;sb);</div><div class='add'>+</div><div class='add'>+    /* reset */</div><div class='add'>+    glfs_h_close(leaf);</div><div class='add'>+    leaf = NULL;</div><div class='add'>+</div><div class='add'>+    /* check multiple component paths */</div><div class='add'>+    leaf = glfs_h_lookupat(fs, root, relative_leaf_name, &amp;sb, 0);</div><div class='add'>+    if (leaf == NULL) {</div><div class='add'>+        fprintf(stderr,</div><div class='add'>+                "glfs_h_lookupat: error on lookup of %s: from (%p),%s\n",</div><div class='add'>+                relative_leaf_name, parent, strerror(errno));</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    peek_stat(&amp;sb);</div><div class='add'>+</div><div class='add'>+    /* reset */</div><div class='add'>+    glfs_h_close(root);</div><div class='add'>+    root = NULL;</div><div class='add'>+    glfs_h_close(parent);</div><div class='add'>+    parent = NULL;</div><div class='add'>+</div><div class='add'>+    /* check symlinks in path */</div><div class='add'>+</div><div class='add'>+    /* TODO: -ve test cases */</div><div class='add'>+    /* parent invalid</div><div class='add'>+     * path invalid</div><div class='add'>+     * path does not exist after some components</div><div class='add'>+     * no parent, but relative path</div><div class='add'>+     * parent and full path? -ve?</div><div class='add'>+     */</div><div class='add'>+</div><div class='add'>+    printf("glfs_h_lookupat tests: PASSED\n");</div><div class='add'>+</div><div class='add'>+    /* glfs_openat test */</div><div class='add'>+    printf("glfs_h_open tests: In Progress\n");</div><div class='add'>+    fd = glfs_h_open(fs, leaf, O_RDWR);</div><div class='add'>+    if (fd == NULL) {</div><div class='add'>+        fprintf(stderr, "glfs_h_open: error on open of %s: %s\n",</div><div class='add'>+                full_leaf_name, strerror(errno));</div><div class='add'>+        printf("glfs_h_open tests: FAILED\n");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* test read/write based on fd */</div><div class='add'>+    memcpy(writebuf, "abcdefghijklmnopqrstuvwxyz012345", 32);</div><div class='add'>+    ret = glfs_write(fd, writebuf, 32, 0);</div><div class='add'>+</div><div class='add'>+    glfs_lseek(fd, 10, SEEK_SET);</div><div class='add'>+</div><div class='add'>+    ret = glfs_read(fd, readbuf, 32, 0);</div><div class='add'>+    if (memcmp(readbuf, writebuf, 32)) {</div><div class='add'>+        printf("Failed to read what I wrote: %s %s\n", readbuf, writebuf);</div><div class='add'>+        glfs_close(fd);</div><div class='add'>+        printf("glfs_h_open tests: FAILED\n");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    glfs_h_close(leaf);</div><div class='add'>+    leaf = NULL;</div><div class='add'>+    glfs_close(fd);</div><div class='add'>+</div><div class='add'>+    printf("glfs_h_open tests: PASSED\n");</div><div class='add'>+</div><div class='add'>+    /* Create tests */</div><div class='add'>+    printf("glfs_h_creat tests: In Progress\n");</div><div class='add'>+    parent = glfs_h_lookupat(fs, NULL, full_parent_name, &amp;sb, 0);</div><div class='add'>+    if (parent == NULL) {</div><div class='add'>+        fprintf(stderr,</div><div class='add'>+                "glfs_h_lookupat: error on lookup of %s: from (%p),%s\n",</div><div class='add'>+                full_parent_name, root, strerror(errno));</div><div class='add'>+        printf("glfs_h_creat tests: FAILED\n");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    peek_stat(&amp;sb);</div><div class='add'>+</div><div class='add'>+    leaf = glfs_h_creat(fs, parent, leaf_name1, O_CREAT, 0644, &amp;sb);</div><div class='add'>+    if (leaf == NULL) {</div><div class='add'>+        fprintf(stderr, "glfs_h_creat: error on create of %s: from (%p),%s\n",</div><div class='add'>+                leaf_name1, parent, strerror(errno));</div><div class='add'>+        printf("glfs_h_creat tests: FAILED\n");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    peek_stat(&amp;sb);</div><div class='add'>+</div><div class='add'>+    glfs_h_close(leaf);</div><div class='add'>+    leaf = NULL;</div><div class='add'>+</div><div class='add'>+    leaf = glfs_h_creat(fs, parent, leaf_name1, O_CREAT | O_EXCL, 0644, &amp;sb);</div><div class='add'>+    if (leaf != NULL || errno != EEXIST) {</div><div class='add'>+        fprintf(stderr,</div><div class='add'>+                "glfs_h_creat: existing file, leaf = (%p), errno = %s\n", leaf,</div><div class='add'>+                strerror(errno));</div><div class='add'>+        printf("glfs_h_creat tests: FAILED\n");</div><div class='add'>+        if (leaf != NULL) {</div><div class='add'>+            glfs_h_close(leaf);</div><div class='add'>+            leaf = NULL;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    tmp = glfs_h_creat(fs, root, parent_name, O_CREAT, 0644, &amp;sb);</div><div class='add'>+    if (tmp != NULL || !(errno == EISDIR || errno == EINVAL)) {</div><div class='add'>+        fprintf(stderr, "glfs_h_creat: dir create, tmp = (%p), errno = %s\n",</div><div class='add'>+                leaf, strerror(errno));</div><div class='add'>+        printf("glfs_h_creat tests: FAILED\n");</div><div class='add'>+        if (tmp != NULL) {</div><div class='add'>+            glfs_h_close(tmp);</div><div class='add'>+            tmp = NULL;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* TODO: Other combinations and -ve cases as applicable */</div><div class='add'>+    printf("glfs_h_creat tests: PASSED\n");</div><div class='add'>+</div><div class='add'>+    /* extract handle and create from handle test */</div><div class='add'>+    printf(</div><div class='add'>+        "glfs_h_extract_handle and glfs_h_create_from_handle tests: In "</div><div class='add'>+        "Progress\n");</div><div class='add'>+    /* TODO: Change the lookup to create below for a GIFD recovery failure,</div><div class='add'>+     * that needs to be fixed */</div><div class='add'>+    leaf = glfs_h_lookupat(fs, parent, leaf_name1, &amp;sb, 0);</div><div class='add'>+    if (leaf == NULL) {</div><div class='add'>+        fprintf(stderr,</div><div class='add'>+                "glfs_h_lookupat: error on lookup of %s: from (%p),%s\n",</div><div class='add'>+                leaf_name1, parent, strerror(errno));</div><div class='add'>+        printf("glfs_h_extract_handle tests: FAILED\n");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    peek_stat(&amp;sb);</div><div class='add'>+</div><div class='add'>+    ret = glfs_h_extract_handle(leaf, leaf_handle, GFAPI_HANDLE_LENGTH);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(stderr,</div><div class='add'>+                "glfs_h_extract_handle: error extracting handle of %s: %s\n",</div><div class='add'>+                full_leaf_name, strerror(errno));</div><div class='add'>+        printf("glfs_h_extract_handle tests: FAILED\n");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    peek_handle(leaf_handle);</div><div class='add'>+</div><div class='add'>+    glfs_h_close(leaf);</div><div class='add'>+    leaf = NULL;</div><div class='add'>+</div><div class='add'>+    leaf = glfs_h_create_from_handle(fs, leaf_handle, GFAPI_HANDLE_LENGTH, &amp;sb);</div><div class='add'>+    if (leaf == NULL) {</div><div class='add'>+        fprintf(</div><div class='add'>+            stderr,</div><div class='add'>+            "glfs_h_create_from_handle: error on create of %s: from (%p),%s\n",</div><div class='add'>+            leaf_name1, leaf_handle, strerror(errno));</div><div class='add'>+        printf("glfs_h_create_from_handle tests: FAILED\n");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    peek_stat(&amp;sb);</div><div class='add'>+</div><div class='add'>+    fd = glfs_h_open(fs, leaf, O_RDWR);</div><div class='add'>+    if (fd == NULL) {</div><div class='add'>+        fprintf(stderr, "glfs_h_open: error on open of %s: %s\n",</div><div class='add'>+                full_leaf_name, strerror(errno));</div><div class='add'>+        printf("glfs_h_create_from_handle tests: FAILED\n");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* test read/write based on fd */</div><div class='add'>+    memcpy(writebuf, "abcdefghijklmnopqrstuvwxyz012345", 32);</div><div class='add'>+    ret = glfs_write(fd, writebuf, 32, 0);</div><div class='add'>+</div><div class='add'>+    glfs_lseek(fd, 0, SEEK_SET);</div><div class='add'>+</div><div class='add'>+    ret = glfs_read(fd, readbuf, 32, 0);</div><div class='add'>+    if (memcmp(readbuf, writebuf, 32)) {</div><div class='add'>+        printf("Failed to read what I wrote: %s %s\n", writebuf, writebuf);</div><div class='add'>+        printf("glfs_h_create_from_handle tests: FAILED\n");</div><div class='add'>+        glfs_close(fd);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    glfs_close(fd);</div><div class='add'>+    glfs_h_close(leaf);</div><div class='add'>+    leaf = NULL;</div><div class='add'>+    glfs_h_close(parent);</div><div class='add'>+    parent = NULL;</div><div class='add'>+</div><div class='add'>+    printf(</div><div class='add'>+        "glfs_h_extract_handle and glfs_h_create_from_handle tests: PASSED\n");</div><div class='add'>+</div><div class='add'>+    /* Mkdir tests */</div><div class='add'>+    printf("glfs_h_mkdir tests: In Progress\n");</div><div class='add'>+</div><div class='add'>+    ret = glfs_rmdir(fs, full_newparent_name);</div><div class='add'>+    if (ret &amp;&amp; errno != ENOENT) {</div><div class='add'>+        fprintf(stderr, "glfs_rmdir: Failed for %s: %s\n", full_newparent_name,</div><div class='add'>+                strerror(errno));</div><div class='add'>+        printf("glfs_h_mkdir tests: FAILED\n");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    parent = glfs_h_lookupat(fs, NULL, full_parent_name, &amp;sb, 0);</div><div class='add'>+    if (parent == NULL) {</div><div class='add'>+        fprintf(stderr,</div><div class='add'>+                "glfs_h_lookupat: error on lookup of %s: from (%p),%s\n",</div><div class='add'>+                full_parent_name, root, strerror(errno));</div><div class='add'>+        printf("glfs_h_mkdir tests: FAILED\n");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    peek_stat(&amp;sb);</div><div class='add'>+</div><div class='add'>+    leaf = glfs_h_mkdir(fs, parent, newparent_name, 0755, &amp;sb);</div><div class='add'>+    if (leaf == NULL) {</div><div class='add'>+        fprintf(stderr, "glfs_h_mkdir: error on mkdir of %s: from (%p),%s\n",</div><div class='add'>+                newparent_name, parent, strerror(errno));</div><div class='add'>+        printf("glfs_h_mkdir tests: FAILED\n");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    peek_stat(&amp;sb);</div><div class='add'>+</div><div class='add'>+    glfs_h_close(leaf);</div><div class='add'>+    leaf = NULL;</div><div class='add'>+</div><div class='add'>+    leaf = glfs_h_mkdir(fs, parent, newparent_name, 0755, &amp;sb);</div><div class='add'>+    if (leaf != NULL || errno != EEXIST) {</div><div class='add'>+        fprintf(stderr,</div><div class='add'>+                "glfs_h_mkdir: existing directory, leaf = (%p), errno = %s\n",</div><div class='add'>+                leaf, strerror(errno));</div><div class='add'>+        printf("glfs_h_mkdir tests: FAILED\n");</div><div class='add'>+        if (leaf != NULL) {</div><div class='add'>+            glfs_h_close(leaf);</div><div class='add'>+            leaf = NULL;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    glfs_h_close(parent);</div><div class='add'>+    parent = NULL;</div><div class='add'>+</div><div class='add'>+    printf("glfs_h_mkdir tests: PASSED\n");</div><div class='add'>+</div><div class='add'>+    /* Mknod tests */</div><div class='add'>+    printf("glfs_h_mknod tests: In Progress\n");</div><div class='add'>+    ret = glfs_unlink(fs, full_newnod_name);</div><div class='add'>+    if (ret &amp;&amp; errno != ENOENT) {</div><div class='add'>+        fprintf(stderr, "glfs_unlink: Failed for %s: %s\n", full_newnod_name,</div><div class='add'>+                strerror(errno));</div><div class='add'>+        printf("glfs_h_mknod tests: FAILED\n");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    parent = glfs_h_lookupat(fs, NULL, full_parent_name, &amp;sb, 0);</div><div class='add'>+    if (parent == NULL) {</div><div class='add'>+        fprintf(stderr,</div><div class='add'>+                "glfs_h_lookupat: error on lookup of %s: from (%p),%s\n",</div><div class='add'>+                full_parent_name, root, strerror(errno));</div><div class='add'>+        printf("glfs_h_mknod tests: FAILED\n");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    peek_stat(&amp;sb);</div><div class='add'>+</div><div class='add'>+    leaf = glfs_h_mknod(fs, parent, newnod_name, S_IFIFO, 0, &amp;sb);</div><div class='add'>+    if (leaf == NULL) {</div><div class='add'>+        fprintf(stderr, "glfs_h_mkdir: error on mkdir of %s: from (%p),%s\n",</div><div class='add'>+                newnod_name, parent, strerror(errno));</div><div class='add'>+        printf("glfs_h_mknod tests: FAILED\n");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    peek_stat(&amp;sb);</div><div class='add'>+</div><div class='add'>+    /* TODO: create op on a FIFO node hangs, need to check and fix</div><div class='add'>+    tmp = glfs_h_creat (fs, parent, newnod_name, O_CREAT, 0644, &amp;sb);</div><div class='add'>+    if (tmp != NULL || errno != EINVAL) {</div><div class='add'>+            fprintf (stderr, "glfs_h_creat: node create, tmp = (%p), errno =</div><div class='add'>+    %s\n", tmp, strerror (errno)); printf ("glfs_h_creat/mknod tests:</div><div class='add'>+    FAILED\n"); if (tmp != NULL) { glfs_h_close(tmp); tmp = NULL;</div><div class='add'>+            }</div><div class='add'>+    } */</div><div class='add'>+</div><div class='add'>+    glfs_h_close(leaf);</div><div class='add'>+    leaf = NULL;</div><div class='add'>+</div><div class='add'>+    leaf = glfs_h_mknod(fs, parent, newnod_name, 0644, 0, &amp;sb);</div><div class='add'>+    if (leaf != NULL || errno != EEXIST) {</div><div class='add'>+        fprintf(stderr,</div><div class='add'>+                "glfs_h_mknod: existing node, leaf = (%p), errno = %s\n", leaf,</div><div class='add'>+                strerror(errno));</div><div class='add'>+        printf("glfs_h_mknod tests: FAILED\n");</div><div class='add'>+        if (leaf != NULL) {</div><div class='add'>+            glfs_h_close(leaf);</div><div class='add'>+            leaf = NULL;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    glfs_h_close(parent);</div><div class='add'>+    parent = NULL;</div><div class='add'>+</div><div class='add'>+    printf("glfs_h_mknod tests: PASSED\n");</div><div class='add'>+</div><div class='add'>+    /* unlink tests */</div><div class='add'>+    test_h_unlink();</div><div class='add'>+</div><div class='add'>+    /* TODO: opendir tests */</div><div class='add'>+</div><div class='add'>+    /* getattr tests */</div><div class='add'>+    test_h_getsetattrs();</div><div class='add'>+</div><div class='add'>+    /* TODO: setattr tests */</div><div class='add'>+</div><div class='add'>+    /* truncate tests */</div><div class='add'>+    test_h_truncate();</div><div class='add'>+</div><div class='add'>+    /* link tests */</div><div class='add'>+    test_h_links();</div><div class='add'>+</div><div class='add'>+    /* rename tests */</div><div class='add'>+    test_h_rename();</div><div class='add'>+</div><div class='add'>+    /* performance tests */</div><div class='add'>+    test_h_performance();</div><div class='add'>+</div><div class='add'>+    /* END: New APIs test area */</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    /* Cleanup glfs handles */</div><div class='add'>+    if (root)</div><div class='add'>+        glfs_h_close(root);</div><div class='add'>+    if (parent)</div><div class='add'>+        glfs_h_close(parent);</div><div class='add'>+    if (leaf)</div><div class='add'>+        glfs_h_close(leaf);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+test_write_apis(glfs_t *fs)</div><div class='add'>+{</div><div class='add'>+    /* Add more content here */</div><div class='add'>+    /* Some apis we can get are */</div><div class='add'>+    /*</div><div class='add'>+      0. glfs_set_xlator_option()</div><div class='add'>+</div><div class='add'>+      Read/Write combinations:</div><div class='add'>+      . glfs_{p,}readv/{p,}writev</div><div class='add'>+      . glfs_pread/pwrite</div><div class='add'>+</div><div class='add'>+      tests/basic/gfapi/gfapi-async-calls-test.c</div><div class='add'>+      . glfs_read_async/write_async</div><div class='add'>+      . glfs_pread_async/pwrite_async</div><div class='add'>+      . glfs_readv_async/writev_async</div><div class='add'>+      . glfs_preadv_async/pwritev_async</div><div class='add'>+</div><div class='add'>+      . ftruncate/ftruncate_async</div><div class='add'>+      . fsync/fsync_async</div><div class='add'>+      . fdatasync/fdatasync_async</div><div class='add'>+</div><div class='add'>+    */</div><div class='add'>+</div><div class='add'>+    glfs_fd_t *fd = NULL;</div><div class='add'>+    char *filename = "/filename2";</div><div class='add'>+    int flags = O_RDWR;</div><div class='add'>+    char *buf = "some bytes!";</div><div class='add'>+    char writestr[TEST_STR_LEN];</div><div class='add'>+    struct iovec iov = {&amp;writestr, TEST_STR_LEN};</div><div class='add'>+    int ret, i;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; TEST_STR_LEN; i++)</div><div class='add'>+        writestr[i] = 0x11;</div><div class='add'>+</div><div class='add'>+    fd = glfs_open(fs, filename, flags);</div><div class='add'>+    if (!fd)</div><div class='add'>+        fprintf(stderr, "open(%s): (%p) %s\n", filename, fd, strerror(errno));</div><div class='add'>+</div><div class='add'>+    ret = glfs_writev(fd, &amp;iov, 1, flags);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(stderr, "writev(%s): %d (%s)\n", filename, ret,</div><div class='add'>+                strerror(errno));</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = glfs_pwrite(fd, buf, 10, 4, flags, NULL, NULL);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(stderr, "pwrite(%s): %d (%s)\n", filename, ret,</div><div class='add'>+                strerror(errno));</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = glfs_pwritev(fd, &amp;iov, 1, 4, flags);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(stderr, "pwritev(%s): %d (%s)\n", filename, ret,</div><div class='add'>+                strerror(errno));</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = glfs_fsync(fd, NULL, NULL);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(stderr, "fsync(%s): %d (%s)\n", filename, ret, strerror(errno));</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    glfs_close(fd);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+test_metadata_ops(glfs_t *fs, glfs_t *fs2)</div><div class='add'>+{</div><div class='add'>+    glfs_fd_t *fd = NULL;</div><div class='add'>+    glfs_fd_t *fd2 = NULL;</div><div class='add'>+    struct stat sb = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    struct glfs_stat gsb = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    struct statvfs sfs;</div><div class='add'>+    char readbuf[32];</div><div class='add'>+    char writebuf[11] = "helloworld";</div><div class='add'>+</div><div class='add'>+    char *filename = "/filename2";</div><div class='add'>+    int ret;</div><div class='add'>+</div><div class='add'>+    ret = glfs_lstat(fs, filename, &amp;sb);</div><div class='add'>+    fprintf(stderr, "lstat(%s): (%d) %s\n", filename, ret, strerror(errno));</div><div class='add'>+</div><div class='add'>+    fd = glfs_creat(fs, filename, O_RDWR, 0644);</div><div class='add'>+    if (!fd)</div><div class='add'>+        fprintf(stderr, "creat(%s): (%p) %s\n", filename, fd, strerror(errno));</div><div class='add'>+</div><div class='add'>+    fd2 = glfs_open(fs2, filename, O_RDWR);</div><div class='add'>+    if (!fd2)</div><div class='add'>+        fprintf(stderr, "open(%s): (%p) %s\n", filename, fd, strerror(errno));</div><div class='add'>+</div><div class='add'>+    ret = glfs_lstat(fs, filename, &amp;sb);</div><div class='add'>+    if (ret)</div><div class='add'>+        fprintf(stderr, "lstat(%s): (%d) %s\n", filename, ret, strerror(errno));</div><div class='add'>+</div><div class='add'>+    ret = glfs_write(fd, writebuf, 11, 0);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(stderr, "writev(%s): %d (%s)\n", filename, ret,</div><div class='add'>+                strerror(errno));</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    glfs_fsync(fd, NULL, NULL);</div><div class='add'>+</div><div class='add'>+    glfs_lseek(fd2, 5, SEEK_SET);</div><div class='add'>+</div><div class='add'>+    ret = glfs_read(fd2, readbuf, 32, 0);</div><div class='add'>+</div><div class='add'>+    printf("read %d, %s", ret, readbuf);</div><div class='add'>+</div><div class='add'>+    /* get stat */</div><div class='add'>+    ret = glfs_fstat(fd2, &amp;sb);</div><div class='add'>+    if (ret)</div><div class='add'>+        fprintf(stderr, "fstat(%s): %d (%s)\n", filename, ret, strerror(errno));</div><div class='add'>+</div><div class='add'>+    ret = glfs_access(fs, filename, R_OK);</div><div class='add'>+    if (ret)</div><div class='add'>+        fprintf(stderr, "access(%s): %d (%s)\n", filename, ret,</div><div class='add'>+                strerror(errno));</div><div class='add'>+</div><div class='add'>+    ret = glfs_fallocate(fd2, 1024, 1024, 1024);</div><div class='add'>+    if (ret)</div><div class='add'>+        fprintf(stderr, "fallocate(%s): %d (%s)\n", filename, ret,</div><div class='add'>+                strerror(errno));</div><div class='add'>+</div><div class='add'>+    ret = glfs_discard(fd2, 1024, 512);</div><div class='add'>+    if (ret)</div><div class='add'>+        fprintf(stderr, "discard(%s): %d (%s)\n", filename, ret,</div><div class='add'>+                strerror(errno));</div><div class='add'>+</div><div class='add'>+    ret = glfs_zerofill(fd2, 2048, 1024);</div><div class='add'>+    if (ret)</div><div class='add'>+        fprintf(stderr, "zerofill(%s): %d (%s)\n", filename, ret,</div><div class='add'>+                strerror(errno));</div><div class='add'>+</div><div class='add'>+    /* set stat */</div><div class='add'>+    /* TODO: got some errors, need to fix */</div><div class='add'>+    ret = glfs_fsetattr(fd2, &amp;gsb);</div><div class='add'>+</div><div class='add'>+    glfs_close(fd);</div><div class='add'>+    glfs_close(fd2);</div><div class='add'>+</div><div class='add'>+    filename = "/filename3";</div><div class='add'>+    ret = glfs_mknod(fs, filename, S_IFIFO, 0);</div><div class='add'>+    if (ret)</div><div class='add'>+        fprintf(stderr, "%s: (%d) %s\n", filename, ret, strerror(errno));</div><div class='add'>+</div><div class='add'>+    ret = glfs_lstat(fs, filename, &amp;sb);</div><div class='add'>+    if (ret)</div><div class='add'>+        fprintf(stderr, "%s: (%d) %s\n", filename, ret, strerror(errno));</div><div class='add'>+</div><div class='add'>+    ret = glfs_rename(fs, filename, "/filename4");</div><div class='add'>+    if (ret)</div><div class='add'>+        fprintf(stderr, "rename(%s): (%d) %s\n", filename, ret,</div><div class='add'>+                strerror(errno));</div><div class='add'>+</div><div class='add'>+    ret = glfs_unlink(fs, "/filename4");</div><div class='add'>+    if (ret)</div><div class='add'>+        fprintf(stderr, "unlink(%s): (%d) %s\n", "/filename4", ret,</div><div class='add'>+                strerror(errno));</div><div class='add'>+</div><div class='add'>+    filename = "/dirname2";</div><div class='add'>+    ret = glfs_mkdir(fs, filename, 0);</div><div class='add'>+    if (ret)</div><div class='add'>+        fprintf(stderr, "%s: (%d) %s\n", filename, ret, strerror(errno));</div><div class='add'>+</div><div class='add'>+    ret = glfs_lstat(fs, filename, &amp;sb);</div><div class='add'>+    if (ret)</div><div class='add'>+        fprintf(stderr, "lstat(%s): (%d) %s\n", filename, ret, strerror(errno));</div><div class='add'>+</div><div class='add'>+    ret = glfs_rmdir(fs, filename);</div><div class='add'>+    if (ret)</div><div class='add'>+        fprintf(stderr, "rmdir(%s): (%d) %s\n", filename, ret, strerror(errno));</div><div class='add'>+}</div><div class='add'>+int</div><div class='add'>+main(int argc, char *argv[])</div><div class='add'>+{</div><div class='add'>+    glfs_t *fs2 = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    glfs_fd_t *fd = NULL;</div><div class='add'>+    glfs_fd_t *fd2 = NULL;</div><div class='add'>+    struct stat sb = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    struct glfs_stat gsb = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    struct statvfs sfs;</div><div class='add'>+    char readbuf[32];</div><div class='add'>+    char writebuf[32];</div><div class='add'>+    char volumeid[64];</div><div class='add'>+</div><div class='add'>+    char *filename = "/filename2";</div><div class='add'>+</div><div class='add'>+    if ((argc &lt; 2) || (argc &gt; 3)) {</div><div class='add'>+        printf("Usage:\n\t%s &lt;volname&gt; &lt;hostname&gt;\n\t%s &lt;volfile-path&gt;",</div><div class='add'>+               argv[0], argv[0]);</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (argc == 2) {</div><div class='add'>+        /* Generally glfs_new() requires volume name as an argument */</div><div class='add'>+        fs = glfs_new("test-only");</div><div class='add'>+        if (!fs) {</div><div class='add'>+            fprintf(stderr, "glfs_new: returned NULL\n");</div><div class='add'>+            return 1;</div><div class='add'>+        }</div><div class='add'>+        ret = glfs_set_volfile(fs, argv[1]);</div><div class='add'>+        if (ret)</div><div class='add'>+            fprintf(stderr, "glfs_set_volfile failed\n");</div><div class='add'>+    } else {</div><div class='add'>+        fs = glfs_new(argv[1]);</div><div class='add'>+        if (!fs) {</div><div class='add'>+            fprintf(stderr, "glfs_new: returned NULL\n");</div><div class='add'>+            return 1;</div><div class='add'>+        }</div><div class='add'>+        // ret = glfs_set_volfile_server (fs, "unix", "/tmp/gluster.sock", 0);</div><div class='add'>+        ret = glfs_set_volfile_server(fs, "tcp", argv[2], 24007);</div><div class='add'>+        if (ret)</div><div class='add'>+            fprintf(stderr, "glfs_set_volfile_server failed\n");</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Change this to relevant file when running locally */</div><div class='add'>+    ret = glfs_set_logging(fs, "/dev/stderr", 5);</div><div class='add'>+    if (ret)</div><div class='add'>+        fprintf(stderr, "glfs_set_logging failed\n");</div><div class='add'>+</div><div class='add'>+    ret = glfs_init(fs);</div><div class='add'>+    if (ret)</div><div class='add'>+        fprintf(stderr, "glfs_init: returned %d\n", ret);</div><div class='add'>+</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    /* no major use for getting the volume id in this test, done for coverage */</div><div class='add'>+    ret = glfs_get_volumeid(fs, volumeid, 64);</div><div class='add'>+    if (ret) {</div><div class='add'>+        fprintf(stderr, "glfs_get_volumeid: returned %d\n", ret);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    sleep(2);</div><div class='add'>+</div><div class='add'>+    if (argc == 2) {</div><div class='add'>+        /* Generally glfs_new() requires volume name as an argument */</div><div class='add'>+        fs2 = glfs_new("test_only_volume");</div><div class='add'>+        if (!fs2) {</div><div class='add'>+            fprintf(stderr, "glfs_new(fs2): returned NULL\n");</div><div class='add'>+            return 1;</div><div class='add'>+        }</div><div class='add'>+        ret = glfs_set_volfile(fs2, argv[1]);</div><div class='add'>+        if (ret)</div><div class='add'>+            fprintf(stderr, "glfs_set_volfile failed(fs2)\n");</div><div class='add'>+    } else {</div><div class='add'>+        fs2 = glfs_new(argv[1]);</div><div class='add'>+        if (!fs2) {</div><div class='add'>+            fprintf(stderr, "glfs_new(fs2): returned NULL\n");</div><div class='add'>+            return 1;</div><div class='add'>+        }</div><div class='add'>+        ret = glfs_set_volfile_server(fs2, "tcp", argv[2], 24007);</div><div class='add'>+        if (ret)</div><div class='add'>+            fprintf(stderr, "glfs_set_volfile_server failed(fs2)\n");</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = glfs_set_statedump_path(fs2, "/tmp");</div><div class='add'>+    if (ret) {</div><div class='add'>+        fprintf(stderr, "glfs_set_statedump_path: %s\n", strerror(errno));</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = glfs_init(fs2);</div><div class='add'>+    if (ret)</div><div class='add'>+        fprintf(stderr, "glfs_init: returned %d\n", ret);</div><div class='add'>+</div><div class='add'>+    test_metadata_ops(fs, fs2);</div><div class='add'>+</div><div class='add'>+    test_dirops(fs);</div><div class='add'>+</div><div class='add'>+    test_xattr(fs);</div><div class='add'>+</div><div class='add'>+    test_chdir(fs);</div><div class='add'>+</div><div class='add'>+    test_handleops(argc, argv);</div><div class='add'>+    // done</div><div class='add'>+</div><div class='add'>+    /* Test some extra apis */</div><div class='add'>+    test_write_apis(fs);</div><div class='add'>+</div><div class='add'>+    glfs_statvfs(fs, "/", &amp;sfs);</div><div class='add'>+</div><div class='add'>+    glfs_unset_volfile_server(fs, "tcp", argv[2], 24007);</div><div class='add'>+</div><div class='add'>+    glfs_fini(fs);</div><div class='add'>+    glfs_fini(fs2);</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='head'>diff --git a/tests/basic/gfapi/glfsxmp.t b/tests/basic/gfapi/glfsxmp.t<br/>new file mode 100644<br/>index 00000000000..b3e6645c0f5<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/gfapi/glfsxmp.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/gfapi/glfsxmp.t</a></div><div class='hunk'>@@ -0,0 +1,30 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 replica 3 $H0:$B0/brick{0,1,2}</div><div class='add'>+EXPECT 'Created' volinfo_field $V0 'Status'</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+EXPECT 'Started' volinfo_field $V0 'Status'</div><div class='add'>+</div><div class='add'>+$CLI system getspec $V0 &gt; fubar.vol</div><div class='add'>+</div><div class='add'>+TEST cp $(dirname $0)/glfsxmp-coverage.c ./glfsxmp.c</div><div class='add'>+TEST build_tester ./glfsxmp.c -lgfapi</div><div class='add'>+TEST ./glfsxmp $V0 $H0</div><div class='add'>+</div><div class='add'>+TEST ./glfsxmp fubar.vol</div><div class='add'>+</div><div class='add'>+TEST cleanup_tester ./glfsxmp</div><div class='add'>+TEST rm ./glfsxmp.c</div><div class='add'>+</div><div class='add'>+TEST $CLI volume stop $V0</div><div class='add'>+TEST $CLI volume delete $V0</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/basic/gfapi/libgfapi-fini-hang.c b/tests/basic/gfapi/libgfapi-fini-hang.c<br/>new file mode 100644<br/>index 00000000000..37800e3188b<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/gfapi/libgfapi-fini-hang.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/gfapi/libgfapi-fini-hang.c</a></div><div class='hunk'>@@ -0,0 +1,62 @@</div><div class='add'>+#include &lt;fcntl.h&gt;</div><div class='add'>+#include &lt;unistd.h&gt;</div><div class='add'>+#include &lt;time.h&gt;</div><div class='add'>+#include &lt;limits.h&gt;</div><div class='add'>+#include &lt;string.h&gt;</div><div class='add'>+#include &lt;stdio.h&gt;</div><div class='add'>+#include &lt;stdlib.h&gt;</div><div class='add'>+#include &lt;glusterfs/api/glfs.h&gt;</div><div class='add'>+#include &lt;glusterfs/api/glfs-handles.h&gt;</div><div class='add'>+</div><div class='add'>+#define LOG_ERR(func, ret)                                                     \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        if (ret != 0) {                                                        \</div><div class='add'>+            fprintf(stderr, "%s : returned error %d\n", func, ret);            \</div><div class='add'>+            exit(1);                                                           \</div><div class='add'>+        } else {                                                               \</div><div class='add'>+            fprintf(stderr, "%s : returned %d\n", func, ret);                  \</div><div class='add'>+        }                                                                      \</div><div class='add'>+    } while (0)</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+main(int argc, char *argv[])</div><div class='add'>+{</div><div class='add'>+    glfs_t *fs = NULL;</div><div class='add'>+    int ret = 0, i;</div><div class='add'>+    glfs_fd_t *fd = NULL;</div><div class='add'>+    char readbuf[32];</div><div class='add'>+    char *logname = NULL;</div><div class='add'>+    char *hostname = NULL;</div><div class='add'>+    char *volname = NULL;</div><div class='add'>+</div><div class='add'>+    fprintf(stderr, "Starting libgfapi_fini\n");</div><div class='add'>+</div><div class='add'>+    if (argc &lt; 4) {</div><div class='add'>+        fprintf(stderr, "Invalid argument\n");</div><div class='add'>+        exit(1);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    hostname = argv[1];</div><div class='add'>+    volname = argv[2];</div><div class='add'>+    logname = argv[3];</div><div class='add'>+</div><div class='add'>+    fs = glfs_new(volname);</div><div class='add'>+    if (!fs) {</div><div class='add'>+        fprintf(stderr, "glfs_new: returned NULL\n");</div><div class='add'>+        exit(1);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = glfs_set_volfile_server(fs, "tcp", hostname, 0);</div><div class='add'>+    LOG_ERR("glfs_set_volfile_server", ret);</div><div class='add'>+</div><div class='add'>+    ret = glfs_set_logging(fs, logname, 7);</div><div class='add'>+    LOG_ERR("glfs_set_logging", ret);</div><div class='add'>+</div><div class='add'>+    /* Do not call glfs_init.</div><div class='add'>+     * glfs_fini() shouldn't hang in that case*/</div><div class='add'>+    ret = glfs_fini(fs);</div><div class='add'>+    LOG_ERR("glfs_fini", ret);</div><div class='add'>+    fprintf(stderr, "End of libgfapi_fini\n");</div><div class='add'>+</div><div class='add'>+    exit(0);</div><div class='add'>+}</div><div class='head'>diff --git a/tests/basic/gfapi/libgfapi-fini-hang.t b/tests/basic/gfapi/libgfapi-fini-hang.t<br/>new file mode 100755<br/>index 00000000000..ba262a943ee<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/gfapi/libgfapi-fini-hang.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/gfapi/libgfapi-fini-hang.t</a></div><div class='hunk'>@@ -0,0 +1,42 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+</div><div class='add'>+function check_process () {</div><div class='add'>+    ps -p $1</div><div class='add'>+    if [ $? -eq 1 ] ; then</div><div class='add'>+        echo "Y"</div><div class='add'>+    else</div><div class='add'>+        echo "N"</div><div class='add'>+    fi</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/brick1;</div><div class='add'>+EXPECT 'Created' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+EXPECT 'Started' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+logdir=$(gluster --print-logdir)</div><div class='add'>+</div><div class='add'>+TEST build_tester $(dirname $0)/libgfapi-fini-hang.c -o $M0/libgfapi-fini-hang -lgfapi</div><div class='add'>+TEST cd $M0</div><div class='add'>+ ./libgfapi-fini-hang $H0 $V0 $logdir/libgfapi-fini-hang.log &amp;</div><div class='add'>+PID=$!</div><div class='add'>+</div><div class='add'>+# check if the process "libgfapi-fini-hang" exits with in $PROCESS_UP_TIMEOUT</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT 'Y' check_process $PID</div><div class='add'>+</div><div class='add'>+# Kill the process if present</div><div class='add'>+TEST ! kill -9 $PID</div><div class='add'>+</div><div class='add'>+TEST rm -f $M0/libgfapi-fini-hang</div><div class='add'>+</div><div class='add'>+TEST $CLI volume stop $V0</div><div class='add'>+TEST $CLI volume delete $V0</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/basic/gfapi/mandatory-lock-optimal.c b/tests/basic/gfapi/mandatory-lock-optimal.c<br/>new file mode 100644<br/>index 00000000000..34fef8d0b80<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/gfapi/mandatory-lock-optimal.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/gfapi/mandatory-lock-optimal.c</a></div><div class='hunk'>@@ -0,0 +1,532 @@</div><div class='add'>+/* Pre-requisites:-</div><div class='add'>+ *</div><div class='add'>+ * 1. Make sure that performance translators are switched off while running this</div><div class='add'>+ * test.</div><div class='add'>+ * 2. Perform the following volume set operation:</div><div class='add'>+ *    # gluster volume set &lt;VOLNAME&gt; locks.mandatory-locking optimal</div><div class='add'>+ * 3. For installation under non-standard paths, export LD_LIBRARY_PATH to</div><div class='add'>+ *    automatically load exact libgfapi.so and compile this C file as follows:</div><div class='add'>+ *    $ gcc mandatory-lock-optimal.c -lgfapi -I &lt;include path for api/glfs.h&gt; -L</div><div class='add'>+ * &lt;include path for libgfapi shared library&gt;</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+#include &lt;errno.h&gt;</div><div class='add'>+#include &lt;stdio.h&gt;</div><div class='add'>+#include &lt;fcntl.h&gt;</div><div class='add'>+#include &lt;stdlib.h&gt;</div><div class='add'>+#include &lt;string.h&gt;</div><div class='add'>+#include &lt;unistd.h&gt;</div><div class='add'>+#include &lt;glusterfs/api/glfs.h&gt;</div><div class='add'>+</div><div class='add'>+#define TOTAL_TEST_COUNT 8</div><div class='add'>+</div><div class='add'>+/* C1 = Client 1 : C2 = Client 2 : C3 = Client 3 :</div><div class='add'>+ * fs1, fd1 are associated with C1. Similarly fs2, fd2 for C2</div><div class='add'>+ * and fs3, fd3 for C3 */</div><div class='add'>+</div><div class='add'>+FILE *fp;</div><div class='add'>+glfs_t *fs1, *fs2, *fs3;</div><div class='add'>+glfs_fd_t *fd, *fd1, *fd2, *fd3;</div><div class='add'>+struct flock lock;</div><div class='add'>+char buf1[10], *buf2 = "ten bytes!", *fname = "/mand.lock";</div><div class='add'>+int ret, test_count;</div><div class='add'>+off_t offset;</div><div class='add'>+</div><div class='add'>+/* run_test_1 ()   : C1 takes byte range mandatory read lock.</div><div class='add'>+                     C2 attempts to read from a conflicting range.</div><div class='add'>+   Expected result : Read from C2 should pass.</div><div class='add'>+</div><div class='add'>+ * run_test_2 ()   : C1 takes byte range mandatory read lock.</div><div class='add'>+                     C2 attempts write to a conflicting range.</div><div class='add'>+   Expected result : Write from C2 should fail with EAGAIN.</div><div class='add'>+</div><div class='add'>+ * run_test_3 ()   : C1 takes byte range advisory write lock.</div><div class='add'>+                     C2 attempts to read from a conflicting range.</div><div class='add'>+   Expected result : Read from C2 should pass.</div><div class='add'>+</div><div class='add'>+ * run_test_4 ()   : C1 takes byte range advisory write lock.</div><div class='add'>+                     C2 attempts write to a conflicting range.</div><div class='add'>+   Expected result : Write from C2 should pass.</div><div class='add'>+</div><div class='add'>+ * run_test_5 ()   : C1 takes byte range advisory read lock.</div><div class='add'>+                     C2 attempts to open the same file with O_TRUNC.</div><div class='add'>+   Expected result : Open from C2 should pass.</div><div class='add'>+</div><div class='add'>+ * run_test_6 ()   : C1 takes byte range mandatory read lock.</div><div class='add'>+                     C2 attempts to open the same file with O_TRUNC.</div><div class='add'>+   Expected result : Open from C2 should fail with EAGAIN.</div><div class='add'>+</div><div class='add'>+ * run_test_7 ()   : C1 takes byte range mandatory read lock.</div><div class='add'>+                     C2 attempts ftruncate on a conflicting range.</div><div class='add'>+   Expected result : Write from C2 should fail with EAGAIN.</div><div class='add'>+</div><div class='add'>+ * run_test_8 ()   : C1 takes byte range advisory read lock.</div><div class='add'>+                     C2 takes byte range mandatory read lock</div><div class='add'>+                     within the byte range for which C1 already</div><div class='add'>+                     holds an advisory lock so as to perform a</div><div class='add'>+                     basic split/merge. C3 repositions fd3 to</div><div class='add'>+                     start of C2's byte range mandatory lock</div><div class='add'>+                     offset and attempts a write. Then it again</div><div class='add'>+                     repositions fd3 to one byte past C2's byte</div><div class='add'>+                     range mandatoy lock and again attempts a write.</div><div class='add'>+   Expected result : First write should fail with EAGAIN.</div><div class='add'>+                     Second write should pass. */</div><div class='add'>+</div><div class='add'>+#define LOG_ERR(func, err)                                                     \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        if (!fp)                                                               \</div><div class='add'>+            fprintf(stderr, "\n%s : returned error (%s)\n", func,              \</div><div class='add'>+                    strerror(err));                                            \</div><div class='add'>+        else                                                                   \</div><div class='add'>+            fprintf(fp, "\n%s : returned error (%s)\n", func, strerror(err));  \</div><div class='add'>+        cleanup_and_exit(err);                                                 \</div><div class='add'>+    } while (0)</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+cleanup_and_exit(int exit_status)</div><div class='add'>+{</div><div class='add'>+    if (exit_status || test_count != TOTAL_TEST_COUNT) {</div><div class='add'>+        fprintf(fp, "\nAborting due to some test failures.\n");</div><div class='add'>+        exit_status = 1;</div><div class='add'>+    } else</div><div class='add'>+        fprintf(fp, "\nAll tests ran successfully.\n");</div><div class='add'>+    if (fp)</div><div class='add'>+        fclose(fp);</div><div class='add'>+    if (fd)</div><div class='add'>+        glfs_close(fd);</div><div class='add'>+    if (fd1)</div><div class='add'>+        glfs_close(fd1);</div><div class='add'>+    if (fd2)</div><div class='add'>+        glfs_close(fd2);</div><div class='add'>+</div><div class='add'>+    glfs_unlink(fs1, fname);</div><div class='add'>+</div><div class='add'>+    if (fs1)</div><div class='add'>+        glfs_fini(fs1);</div><div class='add'>+    if (fs2)</div><div class='add'>+        glfs_fini(fs2);</div><div class='add'>+</div><div class='add'>+    exit(exit_status);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+glfs_t *</div><div class='add'>+new_client_create(char *hostname, char *volname, char *logfile_name)</div><div class='add'>+{</div><div class='add'>+    glfs_t *fs = NULL;</div><div class='add'>+</div><div class='add'>+    fs = glfs_new(volname);</div><div class='add'>+    if (!fs)</div><div class='add'>+        LOG_ERR("glfs_new", errno);</div><div class='add'>+</div><div class='add'>+    ret = glfs_set_volfile_server(fs, "tcp", hostname, 24007);</div><div class='add'>+    if (ret)</div><div class='add'>+        LOG_ERR("glfs_set_volfile_server", errno);</div><div class='add'>+</div><div class='add'>+    ret = glfs_set_logging(fs, logfile_name, 7);</div><div class='add'>+    if (ret)</div><div class='add'>+        LOG_ERR("glfs_set_logging", errno);</div><div class='add'>+</div><div class='add'>+    ret = glfs_init(fs);</div><div class='add'>+    if (ret)</div><div class='add'>+        LOG_ERR("glfs_init", errno);</div><div class='add'>+</div><div class='add'>+    return fs;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+run_test_1(int i)</div><div class='add'>+{</div><div class='add'>+    fprintf(fp, "\nRunning Test-%d . . . ", i);</div><div class='add'>+</div><div class='add'>+    fd1 = glfs_open(fs1, fname, O_RDONLY | O_NONBLOCK);</div><div class='add'>+    if (!fd1)</div><div class='add'>+        LOG_ERR("glfs_open", errno);</div><div class='add'>+</div><div class='add'>+    lock.l_type = F_RDLCK;</div><div class='add'>+    lock.l_whence = SEEK_SET;</div><div class='add'>+    lock.l_start = 0L;</div><div class='add'>+    lock.l_len = 5L;</div><div class='add'>+</div><div class='add'>+    ret = glfs_file_lock(fd1, F_SETLK, &amp;lock, GLFS_LK_MANDATORY);</div><div class='add'>+    if (ret)</div><div class='add'>+        LOG_ERR("glfs_file_lock", errno);</div><div class='add'>+</div><div class='add'>+    fd2 = glfs_open(fs2, fname, O_RDONLY | O_NONBLOCK);</div><div class='add'>+    if (!fd2)</div><div class='add'>+        LOG_ERR("glfs_open", errno);</div><div class='add'>+</div><div class='add'>+    /* On successful read, 0 is returned as there is no content inside the</div><div class='add'>+     * file</div><div class='add'>+     */</div><div class='add'>+    ret = glfs_read(fd2, buf1, 10, 0);</div><div class='add'>+    if (ret)</div><div class='add'>+        LOG_ERR("glfs_read", errno);</div><div class='add'>+</div><div class='add'>+    ret = glfs_close(fd1);</div><div class='add'>+    if (ret)</div><div class='add'>+        LOG_ERR("glfs_close", errno);</div><div class='add'>+    fd1 = NULL;</div><div class='add'>+</div><div class='add'>+    ret = glfs_close(fd2);</div><div class='add'>+    if (ret)</div><div class='add'>+        LOG_ERR("glfs_close", errno);</div><div class='add'>+    fd2 = NULL;</div><div class='add'>+</div><div class='add'>+    test_count++;</div><div class='add'>+    fprintf(fp, "OK\n", i);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+run_test_2(int i)</div><div class='add'>+{</div><div class='add'>+    fprintf(fp, "\nRunning Test-%d . . . ", i);</div><div class='add'>+</div><div class='add'>+    fd1 = glfs_open(fs1, fname, O_RDONLY | O_NONBLOCK);</div><div class='add'>+    if (!fd1)</div><div class='add'>+        LOG_ERR("glfs_open", errno);</div><div class='add'>+</div><div class='add'>+    lock.l_type = F_RDLCK;</div><div class='add'>+    lock.l_whence = SEEK_SET;</div><div class='add'>+    lock.l_start = 0L;</div><div class='add'>+    lock.l_len = 5L;</div><div class='add'>+</div><div class='add'>+    ret = glfs_file_lock(fd1, F_SETLK, &amp;lock, GLFS_LK_MANDATORY);</div><div class='add'>+    if (ret)</div><div class='add'>+        LOG_ERR("glfs_file_lock", errno);</div><div class='add'>+</div><div class='add'>+    fd2 = glfs_open(fs2, fname, O_WRONLY | O_NONBLOCK);</div><div class='add'>+    if (!fd2)</div><div class='add'>+        LOG_ERR("glfs_open", errno);</div><div class='add'>+</div><div class='add'>+    ret = glfs_write(fd2, buf2, 10, 0);</div><div class='add'>+    if (ret == 10 || errno != EAGAIN)</div><div class='add'>+        LOG_ERR("glfs_write", errno);</div><div class='add'>+</div><div class='add'>+    ret = glfs_close(fd1);</div><div class='add'>+    if (ret)</div><div class='add'>+        LOG_ERR("glfs_close", errno);</div><div class='add'>+    fd1 = NULL;</div><div class='add'>+</div><div class='add'>+    ret = glfs_close(fd2);</div><div class='add'>+    if (ret)</div><div class='add'>+        LOG_ERR("glfs_close", errno);</div><div class='add'>+    fd2 = NULL;</div><div class='add'>+</div><div class='add'>+    test_count++;</div><div class='add'>+    fprintf(fp, "OK\n", i);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+run_test_3(int i)</div><div class='add'>+{</div><div class='add'>+    fprintf(fp, "\nRunning Test-%d . . . ", i);</div><div class='add'>+</div><div class='add'>+    fd1 = glfs_open(fs1, fname, O_WRONLY | O_NONBLOCK);</div><div class='add'>+    if (!fd1)</div><div class='add'>+        LOG_ERR("glfs_open", errno);</div><div class='add'>+</div><div class='add'>+    lock.l_type = F_WRLCK;</div><div class='add'>+    lock.l_whence = SEEK_SET;</div><div class='add'>+    lock.l_start = 0L;</div><div class='add'>+    lock.l_len = 5L;</div><div class='add'>+</div><div class='add'>+    ret = glfs_file_lock(fd1, F_SETLK, &amp;lock, GLFS_LK_ADVISORY);</div><div class='add'>+    if (ret)</div><div class='add'>+        LOG_ERR("glfs_file_lock", errno);</div><div class='add'>+</div><div class='add'>+    fd2 = glfs_open(fs2, fname, O_RDONLY | O_NONBLOCK);</div><div class='add'>+    if (!fd2)</div><div class='add'>+        LOG_ERR("glfs_open", errno);</div><div class='add'>+</div><div class='add'>+    /* Still there is no content inside file. So following read should</div><div class='add'>+     * return 0</div><div class='add'>+     */</div><div class='add'>+    ret = glfs_read(fd2, buf1, 10, 0);</div><div class='add'>+    if (ret)</div><div class='add'>+        LOG_ERR("glfs_read", errno);</div><div class='add'>+</div><div class='add'>+    ret = glfs_close(fd1);</div><div class='add'>+    if (ret)</div><div class='add'>+        LOG_ERR("glfs_close", errno);</div><div class='add'>+    fd1 = NULL;</div><div class='add'>+</div><div class='add'>+    ret = glfs_close(fd2);</div><div class='add'>+    if (ret)</div><div class='add'>+        LOG_ERR("glfs_close", errno);</div><div class='add'>+    fd2 = NULL;</div><div class='add'>+</div><div class='add'>+    test_count++;</div><div class='add'>+    fprintf(fp, "OK\n", i);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+run_test_4(int i)</div><div class='add'>+{</div><div class='add'>+    fprintf(fp, "\nRunning Test-%d . . . ", i);</div><div class='add'>+</div><div class='add'>+    fd1 = glfs_open(fs1, fname, O_WRONLY | O_NONBLOCK);</div><div class='add'>+    if (!fd1)</div><div class='add'>+        LOG_ERR("glfs_open", errno);</div><div class='add'>+</div><div class='add'>+    lock.l_type = F_WRLCK;</div><div class='add'>+    lock.l_whence = SEEK_SET;</div><div class='add'>+    lock.l_start = 0L;</div><div class='add'>+    lock.l_len = 5L;</div><div class='add'>+</div><div class='add'>+    ret = glfs_file_lock(fd1, F_SETLK, &amp;lock, GLFS_LK_ADVISORY);</div><div class='add'>+    if (ret)</div><div class='add'>+        LOG_ERR("glfs_file_lock", errno);</div><div class='add'>+</div><div class='add'>+    fd2 = glfs_open(fs2, fname, O_WRONLY | O_NONBLOCK);</div><div class='add'>+    if (!fd2)</div><div class='add'>+        LOG_ERR("glfs_open", errno);</div><div class='add'>+</div><div class='add'>+    ret = glfs_write(fd2, buf2, 10, 0);</div><div class='add'>+    if (ret != 10)</div><div class='add'>+        LOG_ERR("glfs_write", errno);</div><div class='add'>+</div><div class='add'>+    ret = glfs_close(fd1);</div><div class='add'>+    if (ret)</div><div class='add'>+        LOG_ERR("glfs_close", errno);</div><div class='add'>+    fd1 = NULL;</div><div class='add'>+</div><div class='add'>+    ret = glfs_close(fd2);</div><div class='add'>+    if (ret)</div><div class='add'>+        LOG_ERR("glfs_close", errno);</div><div class='add'>+    fd2 = NULL;</div><div class='add'>+</div><div class='add'>+    test_count++;</div><div class='add'>+    fprintf(fp, "OK\n", i);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+run_test_5(int i)</div><div class='add'>+{</div><div class='add'>+    fprintf(fp, "\nRunning Test-%d . . . ", i);</div><div class='add'>+</div><div class='add'>+    fd1 = glfs_open(fs1, fname, O_RDONLY | O_NONBLOCK);</div><div class='add'>+    if (!fd1)</div><div class='add'>+        LOG_ERR("glfs_open", errno);</div><div class='add'>+</div><div class='add'>+    lock.l_type = F_RDLCK;</div><div class='add'>+    lock.l_whence = SEEK_SET;</div><div class='add'>+    lock.l_start = 0L;</div><div class='add'>+    lock.l_len = 5L;</div><div class='add'>+</div><div class='add'>+    ret = glfs_file_lock(fd1, F_SETLK, &amp;lock, GLFS_LK_ADVISORY);</div><div class='add'>+    if (ret)</div><div class='add'>+        LOG_ERR("glfs_file_lock", errno);</div><div class='add'>+</div><div class='add'>+    fd2 = glfs_open(fs2, fname, O_RDONLY | O_NONBLOCK | O_TRUNC);</div><div class='add'>+    if (!fd2)</div><div class='add'>+        LOG_ERR("glfs_open", errno);</div><div class='add'>+</div><div class='add'>+    ret = glfs_close(fd1);</div><div class='add'>+    if (ret)</div><div class='add'>+        LOG_ERR("glfs_close", errno);</div><div class='add'>+    fd1 = NULL;</div><div class='add'>+</div><div class='add'>+    ret = glfs_close(fd2);</div><div class='add'>+    if (ret)</div><div class='add'>+        LOG_ERR("glfs_close", errno);</div><div class='add'>+    fd2 = NULL;</div><div class='add'>+</div><div class='add'>+    test_count++;</div><div class='add'>+    fprintf(fp, "OK\n", i);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+run_test_6(int i)</div><div class='add'>+{</div><div class='add'>+    fprintf(fp, "\nRunning Test-%d . . . ", i);</div><div class='add'>+</div><div class='add'>+    fd1 = glfs_open(fs1, fname, O_RDONLY | O_NONBLOCK);</div><div class='add'>+    if (!fd1)</div><div class='add'>+        LOG_ERR("glfs_open", errno);</div><div class='add'>+</div><div class='add'>+    lock.l_type = F_RDLCK;</div><div class='add'>+    lock.l_whence = SEEK_SET;</div><div class='add'>+    lock.l_start = 0L;</div><div class='add'>+    lock.l_len = 5L;</div><div class='add'>+</div><div class='add'>+    ret = glfs_file_lock(fd1, F_SETLK, &amp;lock, GLFS_LK_MANDATORY);</div><div class='add'>+    if (ret)</div><div class='add'>+        LOG_ERR("glfs_file_lock", errno);</div><div class='add'>+</div><div class='add'>+    fd2 = glfs_open(fs2, fname, O_RDONLY | O_NONBLOCK | O_TRUNC);</div><div class='add'>+    if (fd2)</div><div class='add'>+        LOG_ERR("glfs_open", errno);</div><div class='add'>+</div><div class='add'>+    ret = glfs_close(fd1);</div><div class='add'>+    if (ret)</div><div class='add'>+        LOG_ERR("glfs_close", errno);</div><div class='add'>+    fd1 = NULL;</div><div class='add'>+</div><div class='add'>+    test_count++;</div><div class='add'>+    fprintf(fp, "OK\n", i);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+run_test_7(int i)</div><div class='add'>+{</div><div class='add'>+    fprintf(fp, "\nRunning Test-%d . . . ", i);</div><div class='add'>+</div><div class='add'>+    fd1 = glfs_open(fs1, fname, O_RDONLY | O_NONBLOCK);</div><div class='add'>+    if (!fd1)</div><div class='add'>+        LOG_ERR("glfs_open", errno);</div><div class='add'>+</div><div class='add'>+    lock.l_type = F_RDLCK;</div><div class='add'>+    lock.l_whence = SEEK_SET;</div><div class='add'>+    lock.l_start = 0L;</div><div class='add'>+    lock.l_len = 5L;</div><div class='add'>+</div><div class='add'>+    ret = glfs_file_lock(fd1, F_SETLK, &amp;lock, GLFS_LK_MANDATORY);</div><div class='add'>+    if (ret)</div><div class='add'>+        LOG_ERR("glfs_file_lock", errno);</div><div class='add'>+</div><div class='add'>+    fd2 = glfs_open(fs2, fname, O_RDWR | O_NONBLOCK);</div><div class='add'>+    if (!fd2)</div><div class='add'>+        LOG_ERR("glfs_open", errno);</div><div class='add'>+</div><div class='add'>+    ret = glfs_ftruncate(fd2, 4, NULL, NULL);</div><div class='add'>+    if (ret == 0 || errno != EAGAIN)</div><div class='add'>+        LOG_ERR("glfs_ftruncate", errno);</div><div class='add'>+</div><div class='add'>+    ret = glfs_close(fd1);</div><div class='add'>+    if (ret)</div><div class='add'>+        LOG_ERR("glfs_close", errno);</div><div class='add'>+    fd1 = NULL;</div><div class='add'>+</div><div class='add'>+    ret = glfs_close(fd2);</div><div class='add'>+    if (ret)</div><div class='add'>+        LOG_ERR("glfs_close", errno);</div><div class='add'>+    fd2 = NULL;</div><div class='add'>+</div><div class='add'>+    test_count++;</div><div class='add'>+    fprintf(fp, "OK\n", i);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+run_test_8(int i)</div><div class='add'>+{</div><div class='add'>+    fprintf(fp, "\nRunning Test-%d . . . ", i);</div><div class='add'>+</div><div class='add'>+    fd1 = glfs_open(fs1, fname, O_RDONLY | O_NONBLOCK);</div><div class='add'>+    if (!fd1)</div><div class='add'>+        LOG_ERR("glfs_open", errno);</div><div class='add'>+</div><div class='add'>+    lock.l_type = F_RDLCK;</div><div class='add'>+    lock.l_whence = SEEK_SET;</div><div class='add'>+    lock.l_start = 0L;</div><div class='add'>+    lock.l_len = 10L;</div><div class='add'>+</div><div class='add'>+    ret = glfs_file_lock(fd1, F_SETLK, &amp;lock, GLFS_LK_ADVISORY);</div><div class='add'>+    if (ret)</div><div class='add'>+        LOG_ERR("glfs_file_lock", errno);</div><div class='add'>+</div><div class='add'>+    fd2 = glfs_open(fs2, fname, O_RDONLY | O_NONBLOCK);</div><div class='add'>+    if (!fd2)</div><div class='add'>+        LOG_ERR("glfs_open", errno);</div><div class='add'>+</div><div class='add'>+    lock.l_type = F_RDLCK;</div><div class='add'>+    lock.l_whence = SEEK_SET;</div><div class='add'>+    lock.l_start = 5L;</div><div class='add'>+    lock.l_len = 2L;</div><div class='add'>+</div><div class='add'>+    ret = glfs_file_lock(fd2, F_SETLK, &amp;lock, GLFS_LK_MANDATORY);</div><div class='add'>+    if (ret)</div><div class='add'>+        LOG_ERR("glfs_file_lock", errno);</div><div class='add'>+</div><div class='add'>+    fd3 = glfs_open(fs3, fname, O_RDWR | O_NONBLOCK);</div><div class='add'>+    if (!fd3)</div><div class='add'>+        LOG_ERR("glfs_open", errno);</div><div class='add'>+</div><div class='add'>+    offset = glfs_lseek(fd3, 5L, SEEK_SET);</div><div class='add'>+    if (offset != 5)</div><div class='add'>+        LOG_ERR("glfs_lseek", errno);</div><div class='add'>+</div><div class='add'>+    ret = glfs_write(fd3, buf2, 10, 0);</div><div class='add'>+    if (ret == 10 || errno != EAGAIN)</div><div class='add'>+        LOG_ERR("glfs_write", errno);</div><div class='add'>+</div><div class='add'>+    offset = glfs_lseek(fd3, 8L, SEEK_SET);</div><div class='add'>+    if (offset != 8)</div><div class='add'>+        LOG_ERR("glfs_lseek", errno);</div><div class='add'>+</div><div class='add'>+    ret = glfs_write(fd3, buf2, 10, 0);</div><div class='add'>+    if (ret != 10)</div><div class='add'>+        LOG_ERR("glfs_write", errno);</div><div class='add'>+</div><div class='add'>+    ret = glfs_close(fd1);</div><div class='add'>+    if (ret)</div><div class='add'>+        LOG_ERR("glfs_close", errno);</div><div class='add'>+    fd1 = NULL;</div><div class='add'>+</div><div class='add'>+    ret = glfs_close(fd2);</div><div class='add'>+    if (ret)</div><div class='add'>+        LOG_ERR("glfs_close", errno);</div><div class='add'>+    fd2 = NULL;</div><div class='add'>+</div><div class='add'>+    ret = glfs_close(fd3);</div><div class='add'>+    if (ret)</div><div class='add'>+        LOG_ERR("glfs_close", errno);</div><div class='add'>+    fd3 = NULL;</div><div class='add'>+</div><div class='add'>+    test_count++;</div><div class='add'>+    fprintf(fp, "OK\n", i);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+main(int argc, char *argv[])</div><div class='add'>+{</div><div class='add'>+    char logfile[50];</div><div class='add'>+</div><div class='add'>+    if (argc != 4) {</div><div class='add'>+        fprintf(stderr,</div><div class='add'>+                "Usage: %s &lt;server ip/hostname&gt; &lt;volume name&gt; &lt;test log "</div><div class='add'>+                "directory&gt;\n",</div><div class='add'>+                argv[0]);</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    sprintf(logfile, "%s/%s", argv[3], "mandatory-lock-optimal-test.log");</div><div class='add'>+    fp = fopen(logfile, "w");</div><div class='add'>+    if (!fp) {</div><div class='add'>+        fprintf(stderr, "\n%s\n", logfile);</div><div class='add'>+        LOG_ERR("Log file creation", errno);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    sprintf(logfile, "%s/%s", argv[3], "glfs-client-1.log");</div><div class='add'>+    fs1 = new_client_create(argv[1], argv[2], logfile);</div><div class='add'>+    if (!fs1)</div><div class='add'>+        LOG_ERR("client-1 creation", EINVAL);</div><div class='add'>+</div><div class='add'>+    sprintf(logfile, "%s/%s", argv[3], "glfs-client-2.log");</div><div class='add'>+    fs2 = new_client_create(argv[1], argv[2], logfile);</div><div class='add'>+    if (!fs2)</div><div class='add'>+        LOG_ERR("client-2 creation", EINVAL);</div><div class='add'>+</div><div class='add'>+    sprintf(logfile, "%s/%s", argv[3], "glfs-client-3.log");</div><div class='add'>+    fs3 = new_client_create(argv[1], argv[2], logfile);</div><div class='add'>+    if (!fs3)</div><div class='add'>+        LOG_ERR("client-3 creation", EINVAL);</div><div class='add'>+</div><div class='add'>+    fd = glfs_creat(fs1, fname, O_RDWR, 0644);</div><div class='add'>+    if (!fd)</div><div class='add'>+        LOG_ERR("glfs_creat", errno);</div><div class='add'>+</div><div class='add'>+    test_count = 0;</div><div class='add'>+</div><div class='add'>+    run_test_1(1);</div><div class='add'>+    run_test_2(2);</div><div class='add'>+    run_test_3(3);</div><div class='add'>+    run_test_4(4);</div><div class='add'>+    run_test_5(5);</div><div class='add'>+    run_test_6(6);</div><div class='add'>+    run_test_7(7);</div><div class='add'>+    run_test_8(8);</div><div class='add'>+</div><div class='add'>+    cleanup_and_exit(0);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='head'>diff --git a/tests/basic/gfapi/mandatory-lock-optimal.t b/tests/basic/gfapi/mandatory-lock-optimal.t<br/>new file mode 100644<br/>index 00000000000..27062e1f6c2<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/gfapi/mandatory-lock-optimal.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/gfapi/mandatory-lock-optimal.t</a></div><div class='hunk'>@@ -0,0 +1,38 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+</div><div class='add'>+# Create and start the volume</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/${V0}1</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+logdir=`gluster --print-logdir`</div><div class='add'>+</div><div class='add'>+# Switch off performance translators</div><div class='add'>+TEST $CLI volume set $V0 performance.open-behind off</div><div class='add'>+TEST $CLI volume set $V0 performance.write-behind off</div><div class='add'>+TEST $CLI volume set $V0 performance.quick-read off</div><div class='add'>+TEST $CLI volume set $V0 performance.io-cache off</div><div class='add'>+TEST $CLI volume set $V0 performance.read-ahead off</div><div class='add'>+TEST $CLI volume set $V0 performance.readdir-ahead off</div><div class='add'>+</div><div class='add'>+# Enable optimal mandatory-locking mode and restart the volume</div><div class='add'>+TEST $CLI volume set $V0 locks.mandatory-locking optimal</div><div class='add'>+TEST $CLI volume stop $V0</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+# Compile and run the test program</div><div class='add'>+TEST build_tester $(dirname $0)/mandatory-lock-optimal.c -lgfapi</div><div class='add'>+TEST ./$(dirname $0)/mandatory-lock-optimal $H0 $V0 $logdir</div><div class='add'>+</div><div class='add'>+# Cleanup the environment</div><div class='add'>+cleanup_tester $(dirname $0)/mandatory-lock-optimal</div><div class='add'>+TEST $CLI volume stop $V0</div><div class='add'>+TEST $CLI volume delete $V0</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/basic/gfapi/protocol-client-ssl.vol.in b/tests/basic/gfapi/protocol-client-ssl.vol.in<br/>new file mode 100644<br/>index 00000000000..cdc0c9d0671<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/gfapi/protocol-client-ssl.vol.in?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/gfapi/protocol-client-ssl.vol.in</a></div><div class='hunk'>@@ -0,0 +1,15 @@</div><div class='add'>+#</div><div class='add'>+# This .vol file expects that there is</div><div class='add'>+#</div><div class='add'>+#  1. GlusterD listening on @@HOSTNAME@@</div><div class='add'>+#  2. a volume that provides a brick on @@BRICKPATH@@</div><div class='add'>+#  3. the volume with the brick has been started</div><div class='add'>+#</div><div class='add'>+volume test</div><div class='add'>+    type protocol/client</div><div class='add'>+    option remote-host @@HOSTNAME@@</div><div class='add'>+    option remote-subvolume @@BRICKPATH@@</div><div class='add'>+    option transport-type socket</div><div class='add'>+    option transport.socket.ssl-enabled @@SSL@@</div><div class='add'>+end-volume</div><div class='add'>+</div><div class='head'>diff --git a/tests/basic/gfapi/protocol-client.vol.in b/tests/basic/gfapi/protocol-client.vol.in<br/>new file mode 100644<br/>index 00000000000..ef35001e29f<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/gfapi/protocol-client.vol.in?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/gfapi/protocol-client.vol.in</a></div><div class='hunk'>@@ -0,0 +1,14 @@</div><div class='add'>+#</div><div class='add'>+# This .vol file expects that there is</div><div class='add'>+#</div><div class='add'>+#  1. GlusterD listening on @@HOSTNAME@@</div><div class='add'>+#  2. a volume that provides a brick on @@BRICKPATH@@</div><div class='add'>+#  3. the volume with the brick has been started</div><div class='add'>+#</div><div class='add'>+volume test</div><div class='add'>+    type protocol/client</div><div class='add'>+    option remote-host @@HOSTNAME@@</div><div class='add'>+    option remote-subvolume @@BRICKPATH@@</div><div class='add'>+    option transport-type socket</div><div class='add'>+end-volume</div><div class='add'>+</div><div class='head'>diff --git a/tests/basic/gfapi/seek.c b/tests/basic/gfapi/seek.c<br/>new file mode 100644<br/>index 00000000000..85ea9b88141<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/gfapi/seek.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/gfapi/seek.c</a></div><div class='hunk'>@@ -0,0 +1,99 @@</div><div class='add'>+/* seek.c - use glfs_lseek() to find holes in a file</div><div class='add'>+ *</div><div class='add'>+ * Author: Niels de Vos &lt;ndevos@redhat.com&gt;</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+/* needed for SEEK_HOLE/SEEK_DATA */</div><div class='add'>+#ifndef _GNU_SOURCE</div><div class='add'>+#define _GNU_SOURCE</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#include &lt;sys/types.h&gt;</div><div class='add'>+#include &lt;errno.h&gt;</div><div class='add'>+#include &lt;stdio.h&gt;</div><div class='add'>+#include &lt;stdlib.h&gt;</div><div class='add'>+#include &lt;unistd.h&gt;</div><div class='add'>+</div><div class='add'>+#include &lt;glusterfs/api/glfs.h&gt;</div><div class='add'>+#include &lt;glusterfs/api/glfs-handles.h&gt;</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+main(int argc, char **argv)</div><div class='add'>+{</div><div class='add'>+    glfs_t *fs = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    glfs_fd_t *fd = NULL;</div><div class='add'>+    char *filename = NULL;</div><div class='add'>+    char *volname = NULL;</div><div class='add'>+    char *hostname = NULL;</div><div class='add'>+    struct stat st = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    off_t hole_start = 0;</div><div class='add'>+    off_t hole_end = 0;</div><div class='add'>+</div><div class='add'>+    if (argc != 4) {</div><div class='add'>+        fprintf(stderr, "Invalid argument, use %s &lt;hostname&gt; &lt;vol&gt; &lt;file&gt;\n",</div><div class='add'>+                argv[0]);</div><div class='add'>+        exit(1);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    hostname = argv[1];</div><div class='add'>+    volname = argv[2];</div><div class='add'>+    filename = argv[3];</div><div class='add'>+</div><div class='add'>+    fs = glfs_new(volname);</div><div class='add'>+    if (!fs) {</div><div class='add'>+        perror("glfs_new() returned NULL");</div><div class='add'>+        return 1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (glfs_set_volfile_server(fs, "tcp", hostname, 24007)) {</div><div class='add'>+        perror("glfs_set_volfile_server");</div><div class='add'>+        return 1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (glfs_init(fs)) {</div><div class='add'>+        perror("glfs_init");</div><div class='add'>+        return 1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    fd = glfs_open(fs, filename, O_RDONLY);</div><div class='add'>+    if (fd &lt;= 0) {</div><div class='add'>+        perror("glfs_open");</div><div class='add'>+        return 1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (glfs_fstat(fd, &amp;st)) {</div><div class='add'>+        perror("glfs_fstat");</div><div class='add'>+        return 1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    while (hole_end &lt; st.st_size) {</div><div class='add'>+        hole_start = glfs_lseek(fd, hole_end, SEEK_HOLE);</div><div class='add'>+        if (hole_start == -1 &amp;&amp; errno == ENXIO)</div><div class='add'>+            /* no more holes */</div><div class='add'>+            break;</div><div class='add'>+        if (hole_start == -1) {</div><div class='add'>+            perror("no more holes");</div><div class='add'>+            break;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        hole_end = glfs_lseek(fd, hole_start, SEEK_DATA);</div><div class='add'>+        if (hole_end == -1 &amp;&amp; errno == ENXIO) {</div><div class='add'>+            /* no more data */</div><div class='add'>+            break;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        printf("HOLE found: %ld - %ld%s\n", hole_start, hole_end,</div><div class='add'>+               (hole_end == st.st_size) ? " (EOF)" : "");</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    glfs_close(fd);</div><div class='add'>+</div><div class='add'>+    if (fs) {</div><div class='add'>+        glfs_fini(fs);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='head'>diff --git a/tests/basic/gfapi/sink.t b/tests/basic/gfapi/sink.t<br/>new file mode 100644<br/>index 00000000000..53af2ecf62d<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/gfapi/sink.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/gfapi/sink.t</a></div><div class='hunk'>@@ -0,0 +1,13 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='add'>+</div><div class='add'>+TEST build_tester $(dirname ${0})/gfapi-load-volfile.c -lgfapi</div><div class='add'>+TEST ./$(dirname ${0})/gfapi-load-volfile $(dirname $0)/sink.vol</div><div class='add'>+</div><div class='add'>+cleanup_tester $(dirname ${0})/gfapi-load-volfile</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/basic/gfapi/sink.vol b/tests/basic/gfapi/sink.vol<br/>new file mode 100644<br/>index 00000000000..d1c92261448<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/gfapi/sink.vol?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/gfapi/sink.vol</a></div><div class='hunk'>@@ -0,0 +1,24 @@</div><div class='add'>+#</div><div class='add'>+# The sink xlator does not do any memory allocations. It only passes the FOPs</div><div class='add'>+# through to the next xlator.</div><div class='add'>+#</div><div class='add'>+# For testing, there is no next xlator needed, we are only interested in the</div><div class='add'>+# resource usage of the Gluster core when gfapi is used.</div><div class='add'>+#</div><div class='add'>+# Note: The sink xlator does not handle any calls. Mounting is possible, but</div><div class='add'>+# any I/O needs additional functionality in the sink xlator.</div><div class='add'>+#</div><div class='add'>+volume sink</div><div class='add'>+    type debug/sink</div><div class='add'>+    # an option is required, otherwise the graph parsing fails</div><div class='add'>+    option an-option-is-required yes</div><div class='add'>+end-volume</div><div class='add'>+</div><div class='add'>+#</div><div class='add'>+# It is possible to test the resource usage of other xlators by adding them in</div><div class='add'>+# the graph before the "sink".</div><div class='add'>+#</div><div class='add'>+#volume mdcache-sink</div><div class='add'>+#    type performance/md-cache</div><div class='add'>+#    subvolumes sink</div><div class='add'>+#end-volume</div><div class='head'>diff --git a/tests/basic/gfapi/upcall-cache-invalidate.c b/tests/basic/gfapi/upcall-cache-invalidate.c<br/>new file mode 100644<br/>index 00000000000..078286a8956<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/gfapi/upcall-cache-invalidate.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/gfapi/upcall-cache-invalidate.c</a></div><div class='hunk'>@@ -0,0 +1,209 @@</div><div class='add'>+#include &lt;fcntl.h&gt;</div><div class='add'>+#include &lt;unistd.h&gt;</div><div class='add'>+#include &lt;time.h&gt;</div><div class='add'>+#include &lt;limits.h&gt;</div><div class='add'>+#include &lt;string.h&gt;</div><div class='add'>+#include &lt;stdio.h&gt;</div><div class='add'>+#include &lt;stdlib.h&gt;</div><div class='add'>+#include &lt;errno.h&gt;</div><div class='add'>+#include &lt;glusterfs/api/glfs.h&gt;</div><div class='add'>+#include &lt;glusterfs/api/glfs-handles.h&gt;</div><div class='add'>+</div><div class='add'>+#define LOG_ERR(func, ret)                                                     \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        if (ret != 0) {                                                        \</div><div class='add'>+            fprintf(stderr, "%s : returned error %d (%s)\n", func, ret,        \</div><div class='add'>+                    strerror(errno));                                          \</div><div class='add'>+            goto out;                                                          \</div><div class='add'>+        } else {                                                               \</div><div class='add'>+            fprintf(stderr, "%s : returned %d\n", func, ret);                  \</div><div class='add'>+        }                                                                      \</div><div class='add'>+    } while (0)</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+main(int argc, char *argv[])</div><div class='add'>+{</div><div class='add'>+    glfs_t *fs = NULL;</div><div class='add'>+    glfs_t *fs2 = NULL;</div><div class='add'>+    glfs_t *fs_tmp = NULL;</div><div class='add'>+    glfs_t *fs_tmp2 = NULL;</div><div class='add'>+    int ret = 0, i;</div><div class='add'>+    glfs_fd_t *fd = NULL;</div><div class='add'>+    glfs_fd_t *fd2 = NULL;</div><div class='add'>+    glfs_fd_t *fd_tmp = NULL;</div><div class='add'>+    glfs_fd_t *fd_tmp2 = NULL;</div><div class='add'>+    char readbuf[32];</div><div class='add'>+    char *filename = "file_tmp";</div><div class='add'>+    char *writebuf = NULL;</div><div class='add'>+    char *vol_id = NULL;</div><div class='add'>+    unsigned int cnt = 1;</div><div class='add'>+    struct glfs_upcall *cbk = NULL;</div><div class='add'>+    char *logfile = NULL;</div><div class='add'>+    char *volname = NULL;</div><div class='add'>+    char *hostname = NULL;</div><div class='add'>+</div><div class='add'>+    if (argc != 4) {</div><div class='add'>+        fprintf(stderr, "Invalid argument\n");</div><div class='add'>+        exit(1);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    hostname = argv[1];</div><div class='add'>+    volname = argv[2];</div><div class='add'>+    logfile = argv[3];</div><div class='add'>+</div><div class='add'>+    fs = glfs_new(volname);</div><div class='add'>+    if (!fs) {</div><div class='add'>+        fprintf(stderr, "glfs_new: returned NULL\n");</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = glfs_set_volfile_server(fs, "tcp", hostname, 24007);</div><div class='add'>+    LOG_ERR("glfs_set_volfile_server", ret);</div><div class='add'>+</div><div class='add'>+    ret = glfs_set_logging(fs, logfile, 7);</div><div class='add'>+    LOG_ERR("glfs_set_logging", ret);</div><div class='add'>+</div><div class='add'>+    ret = glfs_init(fs);</div><div class='add'>+    LOG_ERR("glfs_init", ret);</div><div class='add'>+</div><div class='add'>+    /* This does not block, but enables caching of events. Real</div><div class='add'>+     * applications like NFS-Ganesha run this in a thread before activity</div><div class='add'>+     * on the fs (through this instance) happens. */</div><div class='add'>+    ret = glfs_h_poll_upcall(fs_tmp, &amp;cbk);</div><div class='add'>+    LOG_ERR("glfs_h_poll_upcall", ret);</div><div class='add'>+</div><div class='add'>+    fs2 = glfs_new(volname);</div><div class='add'>+    if (!fs2) {</div><div class='add'>+        fprintf(stderr, "glfs_new fs2: returned NULL\n");</div><div class='add'>+        return 1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = glfs_set_volfile_server(fs2, "tcp", hostname, 24007);</div><div class='add'>+    LOG_ERR("glfs_set_volfile_server-fs2", ret);</div><div class='add'>+</div><div class='add'>+    ret = glfs_set_logging(fs2, logfile, 7);</div><div class='add'>+    LOG_ERR("glfs_set_logging-fs2", ret);</div><div class='add'>+</div><div class='add'>+    ret = glfs_init(fs2);</div><div class='add'>+    LOG_ERR("glfs_init-fs2", ret);</div><div class='add'>+</div><div class='add'>+    fd = glfs_creat(fs, filename, O_RDWR | O_SYNC, 0644);</div><div class='add'>+    if (fd &lt;= 0) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        LOG_ERR("glfs_creat", ret);</div><div class='add'>+    }</div><div class='add'>+    fprintf(stderr, "glfs-create fd - %d\n", fd);</div><div class='add'>+</div><div class='add'>+    fd2 = glfs_open(fs2, filename, O_SYNC | O_RDWR | O_CREAT);</div><div class='add'>+    if (fd2 &lt;= 0) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        LOG_ERR("glfs_open-fs2", ret);</div><div class='add'>+    }</div><div class='add'>+    fprintf(stderr, "glfs-open fd2 - %d\n", fd2);</div><div class='add'>+</div><div class='add'>+    do {</div><div class='add'>+        if (cnt % 2) {</div><div class='add'>+            fd_tmp = fd;</div><div class='add'>+            fs_tmp = fs;</div><div class='add'>+            fd_tmp2 = fd2;</div><div class='add'>+            fs_tmp2 = fs2;</div><div class='add'>+        } else {</div><div class='add'>+            fd_tmp = fd2;</div><div class='add'>+            fs_tmp = fs2;</div><div class='add'>+            fd_tmp2 = fd;</div><div class='add'>+            fs_tmp2 = fs;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        /* WRITE on fd_tmp */</div><div class='add'>+        writebuf = malloc(10);</div><div class='add'>+        if (writebuf) {</div><div class='add'>+            memcpy(writebuf, "abcd", 4);</div><div class='add'>+            ret = glfs_write(fd_tmp, writebuf, 4, 0);</div><div class='add'>+            if (ret &lt;= 0) {</div><div class='add'>+                ret = -1;</div><div class='add'>+                LOG_ERR("glfs_write", ret);</div><div class='add'>+            } else {</div><div class='add'>+                fprintf(stderr, "glfs_write succeeded\n");</div><div class='add'>+            }</div><div class='add'>+            free(writebuf);</div><div class='add'>+        } else {</div><div class='add'>+            fprintf(stderr, "Could not allocate writebuf\n");</div><div class='add'>+            return -1;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        /* READ on fd_tmp2 */</div><div class='add'>+        ret = glfs_lseek(fd_tmp2, 0, SEEK_SET);</div><div class='add'>+        LOG_ERR("glfs_lseek", ret);</div><div class='add'>+</div><div class='add'>+        memset(readbuf, 0, sizeof(readbuf));</div><div class='add'>+        ret = glfs_pread(fd_tmp2, readbuf, 4, 0, 0, NULL);</div><div class='add'>+</div><div class='add'>+        if (ret &lt;= 0) {</div><div class='add'>+            ret = -1;</div><div class='add'>+            LOG_ERR("glfs_pread", ret);</div><div class='add'>+        } else {</div><div class='add'>+            fprintf(stderr, "glfs_read: %s\n", readbuf);</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        /* Open() fops seem to be not performed on server side until</div><div class='add'>+         * there are I/Os on that fd</div><div class='add'>+         */</div><div class='add'>+        if (cnt &gt; 2) {</div><div class='add'>+            struct glfs_upcall_inode *in_arg = NULL;</div><div class='add'>+            enum glfs_upcall_reason reason = 0;</div><div class='add'>+            struct glfs_object *object = NULL;</div><div class='add'>+            uint64_t flags = 0;</div><div class='add'>+            uint64_t expire = 0;</div><div class='add'>+</div><div class='add'>+            ret = glfs_h_poll_upcall(fs_tmp, &amp;cbk);</div><div class='add'>+            LOG_ERR("glfs_h_poll_upcall", ret);</div><div class='add'>+</div><div class='add'>+            reason = glfs_upcall_get_reason(cbk);</div><div class='add'>+</div><div class='add'>+            /* Expect 'GLFS_INODE_INVALIDATE' upcall event. */</div><div class='add'>+            if (reason == GLFS_UPCALL_INODE_INVALIDATE) {</div><div class='add'>+                in_arg = glfs_upcall_get_event(cbk);</div><div class='add'>+</div><div class='add'>+                object = glfs_upcall_inode_get_object(in_arg);</div><div class='add'>+                flags = glfs_upcall_inode_get_flags(in_arg);</div><div class='add'>+                expire = glfs_upcall_inode_get_expire(in_arg);</div><div class='add'>+</div><div class='add'>+                fprintf(stderr,</div><div class='add'>+                        " upcall event type - %d,"</div><div class='add'>+                        " object(%p), flags(%d), "</div><div class='add'>+                        " expire_time_attr(%d)\n",</div><div class='add'>+                        reason, object, flags, expire);</div><div class='add'>+            } else {</div><div class='add'>+                fprintf(stderr, "Didn't receive upcall notify event");</div><div class='add'>+                ret = -1;</div><div class='add'>+                goto err;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            glfs_free(cbk);</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        sleep(5);</div><div class='add'>+    } while (++cnt &lt; 5);</div><div class='add'>+</div><div class='add'>+err:</div><div class='add'>+    glfs_close(fd);</div><div class='add'>+    LOG_ERR("glfs_close", ret);</div><div class='add'>+</div><div class='add'>+    glfs_close(fd2);</div><div class='add'>+    LOG_ERR("glfs_close-fd2", ret);</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (fs) {</div><div class='add'>+        ret = glfs_fini(fs);</div><div class='add'>+        fprintf(stderr, "glfs_fini(fs) returned %d \n", ret);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (fs2) {</div><div class='add'>+        ret = glfs_fini(fs2);</div><div class='add'>+        fprintf(stderr, "glfs_fini(fs2) returned %d \n", ret);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (ret)</div><div class='add'>+        exit(1);</div><div class='add'>+    exit(0);</div><div class='add'>+}</div><div class='head'>diff --git a/tests/basic/gfapi/upcall-cache-invalidate.t b/tests/basic/gfapi/upcall-cache-invalidate.t<br/>new file mode 100755<br/>index 00000000000..5fd6a3332e7<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/gfapi/upcall-cache-invalidate.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/gfapi/upcall-cache-invalidate.t</a></div><div class='hunk'>@@ -0,0 +1,30 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/brick1;</div><div class='add'>+EXPECT 'Created' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+EXPECT 'Started' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+logdir=`gluster --print-logdir`</div><div class='add'>+</div><div class='add'>+## Enable Upcall cache-invalidation feature</div><div class='add'>+TEST $CLI volume set $V0 features.cache-invalidation on;</div><div class='add'>+</div><div class='add'>+TEST build_tester $(dirname $0)/upcall-cache-invalidate.c -lgfapi</div><div class='add'>+</div><div class='add'>+TEST ./$(dirname $0)/upcall-cache-invalidate $H0 $V0  $logdir/upcall-cache-invalidate.log</div><div class='add'>+</div><div class='add'>+cleanup_tester $(dirname $0)/upcall-cache-invalidate</div><div class='add'>+</div><div class='add'>+TEST $CLI volume stop $V0</div><div class='add'>+TEST $CLI volume delete $V0</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/basic/gfapi/upcall-register-api.c b/tests/basic/gfapi/upcall-register-api.c<br/>new file mode 100644<br/>index 00000000000..53ce0ecdb68<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/gfapi/upcall-register-api.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/gfapi/upcall-register-api.c</a></div><div class='hunk'>@@ -0,0 +1,286 @@</div><div class='add'>+#include &lt;fcntl.h&gt;</div><div class='add'>+#include &lt;unistd.h&gt;</div><div class='add'>+#include &lt;time.h&gt;</div><div class='add'>+#include &lt;limits.h&gt;</div><div class='add'>+#include &lt;string.h&gt;</div><div class='add'>+#include &lt;stdio.h&gt;</div><div class='add'>+#include &lt;stdlib.h&gt;</div><div class='add'>+#include &lt;errno.h&gt;</div><div class='add'>+#include &lt;glusterfs/api/glfs.h&gt;</div><div class='add'>+#include &lt;glusterfs/api/glfs-handles.h&gt;</div><div class='add'>+</div><div class='add'>+#define LOG_ERR(func, ret)                                                     \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        if (ret != 0) {                                                        \</div><div class='add'>+            fprintf(stderr, "%s : returned error %d (%s)\n", func, ret,        \</div><div class='add'>+                    strerror(errno));                                          \</div><div class='add'>+            goto out;                                                          \</div><div class='add'>+        } else {                                                               \</div><div class='add'>+            fprintf(stderr, "%s : returned %d\n", func, ret);                  \</div><div class='add'>+        }                                                                      \</div><div class='add'>+    } while (0)</div><div class='add'>+</div><div class='add'>+int upcall_recv = 0;</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+up_async_invalidate(struct glfs_upcall *up_arg, void *data)</div><div class='add'>+{</div><div class='add'>+    struct glfs_upcall_inode *in_arg = NULL;</div><div class='add'>+    enum glfs_upcall_reason reason = 0;</div><div class='add'>+    struct glfs_object *object = NULL;</div><div class='add'>+    uint64_t flags = 0;</div><div class='add'>+    uint64_t expire = 0;</div><div class='add'>+</div><div class='add'>+    if (!up_arg)</div><div class='add'>+        return;</div><div class='add'>+</div><div class='add'>+    reason = glfs_upcall_get_reason(up_arg);</div><div class='add'>+</div><div class='add'>+    /* Expect 'GLFS_INODE_INVALIDATE' upcall event. */</div><div class='add'>+</div><div class='add'>+    if (reason == GLFS_UPCALL_INODE_INVALIDATE) {</div><div class='add'>+        in_arg = glfs_upcall_get_event(up_arg);</div><div class='add'>+</div><div class='add'>+        object = glfs_upcall_inode_get_object(in_arg);</div><div class='add'>+        flags = glfs_upcall_inode_get_flags(in_arg);</div><div class='add'>+        expire = glfs_upcall_inode_get_expire(in_arg);</div><div class='add'>+</div><div class='add'>+        fprintf(stderr,</div><div class='add'>+                " upcall event type - %d,"</div><div class='add'>+                " object(%p), flags(%d), "</div><div class='add'>+                " expire_time_attr(%d)\n",</div><div class='add'>+                reason, object, flags, expire);</div><div class='add'>+        upcall_recv++;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    glfs_free(up_arg);</div><div class='add'>+    return;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+perform_io(glfs_t *fs, glfs_t *fs2, int cnt)</div><div class='add'>+{</div><div class='add'>+    glfs_t *fs_tmp = NULL;</div><div class='add'>+    glfs_t *fs_tmp2 = NULL;</div><div class='add'>+    glfs_fd_t *fd_tmp = NULL;</div><div class='add'>+    glfs_fd_t *fd_tmp2 = NULL;</div><div class='add'>+    char readbuf[32];</div><div class='add'>+    char *writebuf = NULL;</div><div class='add'>+    glfs_fd_t *fd = NULL;</div><div class='add'>+    glfs_fd_t *fd2 = NULL;</div><div class='add'>+    char *filename = "file_tmp";</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    if (!fs || !fs2)</div><div class='add'>+        return -1;</div><div class='add'>+</div><div class='add'>+    /* Create file from fs and open it from fs2 */</div><div class='add'>+    fd = glfs_creat(fs, filename, O_RDWR | O_SYNC, 0644);</div><div class='add'>+    if (fd &lt;= 0) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        LOG_ERR("glfs_creat", ret);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    fd2 = glfs_open(fs2, filename, O_SYNC | O_RDWR | O_CREAT);</div><div class='add'>+    if (fd2 &lt;= 0) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        LOG_ERR("glfs_open-fs2", ret);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    do {</div><div class='add'>+        if (cnt % 2) {</div><div class='add'>+            fd_tmp = fd;</div><div class='add'>+            fs_tmp = fs;</div><div class='add'>+            fd_tmp2 = fd2;</div><div class='add'>+            fs_tmp2 = fs2;</div><div class='add'>+        } else {</div><div class='add'>+            fd_tmp = fd2;</div><div class='add'>+            fs_tmp = fs2;</div><div class='add'>+            fd_tmp2 = fd;</div><div class='add'>+            fs_tmp2 = fs;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        /* WRITE on fd_tmp */</div><div class='add'>+        writebuf = malloc(10);</div><div class='add'>+        if (writebuf) {</div><div class='add'>+            memcpy(writebuf, "abcd", 4);</div><div class='add'>+            ret = glfs_write(fd_tmp, writebuf, 4, 0);</div><div class='add'>+            if (ret &lt;= 0) {</div><div class='add'>+                ret = -1;</div><div class='add'>+                LOG_ERR("glfs_write", ret);</div><div class='add'>+            }</div><div class='add'>+            free(writebuf);</div><div class='add'>+        } else {</div><div class='add'>+            fprintf(stderr, "Could not allocate writebuf\n");</div><div class='add'>+            return -1;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        /* READ on fd_tmp2 */</div><div class='add'>+        ret = glfs_lseek(fd_tmp2, 0, SEEK_SET);</div><div class='add'>+        LOG_ERR("glfs_lseek", ret);</div><div class='add'>+</div><div class='add'>+        memset(readbuf, 0, sizeof(readbuf));</div><div class='add'>+        ret = glfs_pread(fd_tmp2, readbuf, 4, 0, 0, NULL);</div><div class='add'>+</div><div class='add'>+        if (ret &lt;= 0) {</div><div class='add'>+            ret = -1;</div><div class='add'>+            LOG_ERR("glfs_pread", ret);</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        sleep(2);</div><div class='add'>+    } while (--cnt &gt; 0);</div><div class='add'>+</div><div class='add'>+    sleep(2);</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+err:</div><div class='add'>+    glfs_close(fd);</div><div class='add'>+</div><div class='add'>+    glfs_close(fd2);</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+main(int argc, char *argv[])</div><div class='add'>+{</div><div class='add'>+    glfs_t *fs = NULL;</div><div class='add'>+    glfs_t *fs2 = NULL;</div><div class='add'>+    int ret = 0, i;</div><div class='add'>+    char *vol_id = NULL;</div><div class='add'>+    unsigned int cnt = 5;</div><div class='add'>+    struct glfs_upcall *cbk = NULL;</div><div class='add'>+    char *logfile = NULL;</div><div class='add'>+    char *volname = NULL;</div><div class='add'>+    char *hostname = NULL;</div><div class='add'>+    int up_events = GLFS_EVENT_ANY;</div><div class='add'>+</div><div class='add'>+    if (argc != 4) {</div><div class='add'>+        fprintf(stderr, "Invalid argument\n");</div><div class='add'>+        exit(1);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    hostname = argv[1];</div><div class='add'>+    volname = argv[2];</div><div class='add'>+    logfile = argv[3];</div><div class='add'>+</div><div class='add'>+    /* Initialize fs */</div><div class='add'>+    fs = glfs_new(volname);</div><div class='add'>+    if (!fs) {</div><div class='add'>+        fprintf(stderr, "glfs_new: returned NULL\n");</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = glfs_set_volfile_server(fs, "tcp", hostname, 24007);</div><div class='add'>+    LOG_ERR("glfs_set_volfile_server", ret);</div><div class='add'>+</div><div class='add'>+    ret = glfs_set_logging(fs, logfile, 7);</div><div class='add'>+    LOG_ERR("glfs_set_logging", ret);</div><div class='add'>+</div><div class='add'>+    ret = glfs_init(fs);</div><div class='add'>+    LOG_ERR("glfs_init", ret);</div><div class='add'>+</div><div class='add'>+    /* Initialize fs2 */</div><div class='add'>+    fs2 = glfs_new(volname);</div><div class='add'>+    if (!fs2) {</div><div class='add'>+        fprintf(stderr, "glfs_new fs2: returned NULL\n");</div><div class='add'>+        return 1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = glfs_set_volfile_server(fs2, "tcp", hostname, 24007);</div><div class='add'>+    LOG_ERR("glfs_set_volfile_server-fs2", ret);</div><div class='add'>+</div><div class='add'>+    ret = glfs_set_logging(fs2, logfile, 7);</div><div class='add'>+    LOG_ERR("glfs_set_logging-fs2", ret);</div><div class='add'>+</div><div class='add'>+    ret = glfs_init(fs2);</div><div class='add'>+    LOG_ERR("glfs_init-fs2", ret);</div><div class='add'>+</div><div class='add'>+    /* Register Upcalls */</div><div class='add'>+    ret = glfs_upcall_register(fs, up_events, up_async_invalidate, NULL);</div><div class='add'>+</div><div class='add'>+    /* Check if the return mask contains the event */</div><div class='add'>+    if (!(ret &amp; GLFS_EVENT_INODE_INVALIDATE)) {</div><div class='add'>+        fprintf(stderr,</div><div class='add'>+                "glfs_upcall_register return doesn't contain"</div><div class='add'>+                " upcall event\n");</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = glfs_upcall_register(fs2, up_events, up_async_invalidate, NULL);</div><div class='add'>+</div><div class='add'>+    /* Check if the return mask contains the event */</div><div class='add'>+    if ((ret &lt; 0) || !(ret &amp; GLFS_EVENT_INODE_INVALIDATE)) {</div><div class='add'>+        fprintf(stderr,</div><div class='add'>+                "glfs_upcall_register return doesn't contain"</div><div class='add'>+                " upcall event\n");</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Perform I/O */</div><div class='add'>+    ret = perform_io(fs, fs2, cnt);</div><div class='add'>+    LOG_ERR("perform_io", ret);</div><div class='add'>+</div><div class='add'>+    if (upcall_recv == 0) {</div><div class='add'>+        fprintf(stderr, "Upcalls are not received.\n");</div><div class='add'>+        ret = -1;</div><div class='add'>+    } else {</div><div class='add'>+        fprintf(stderr, "Received %d upcalls as expected\n", upcall_recv);</div><div class='add'>+        ret = 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    sleep(5); /* to flush out previous upcalls if any */</div><div class='add'>+</div><div class='add'>+    /* Now unregister and check there are no upcall events received */</div><div class='add'>+    ret = glfs_upcall_unregister(fs, up_events);</div><div class='add'>+</div><div class='add'>+    /* Check if the return mask contains the event */</div><div class='add'>+    if ((ret &lt; 0) || !(ret &amp; GLFS_EVENT_INODE_INVALIDATE)) {</div><div class='add'>+        fprintf(stderr,</div><div class='add'>+                "glfs_upcall_unregister return doesn't contain"</div><div class='add'>+                " upcall event\n");</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = glfs_upcall_unregister(fs2, up_events);</div><div class='add'>+</div><div class='add'>+    /* Check if the return mask contains the event */</div><div class='add'>+    if ((ret &lt; 0) || !(ret &amp; GLFS_EVENT_INODE_INVALIDATE)) {</div><div class='add'>+        fprintf(stderr,</div><div class='add'>+                "glfs_upcall_unregister return doesn't contain"</div><div class='add'>+                " upcall event\n");</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    upcall_recv = 0;</div><div class='add'>+</div><div class='add'>+    ret = perform_io(fs, fs2, cnt);</div><div class='add'>+    LOG_ERR("perform_io", ret);</div><div class='add'>+</div><div class='add'>+    if (upcall_recv != 0) {</div><div class='add'>+        fprintf(stderr, "%d upcalls received even after unregister.\n",</div><div class='add'>+                upcall_recv);</div><div class='add'>+        ret = -1;</div><div class='add'>+    } else {</div><div class='add'>+        fprintf(stderr,</div><div class='add'>+                "Post unregister, no upcalls received as"</div><div class='add'>+                " expected\n");</div><div class='add'>+        ret = 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (fs) {</div><div class='add'>+        ret = glfs_fini(fs);</div><div class='add'>+        fprintf(stderr, "glfs_fini(fs) returned %d\n", ret);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (fs2) {</div><div class='add'>+        ret = glfs_fini(fs2);</div><div class='add'>+        fprintf(stderr, "glfs_fini(fs2) returned %d\n", ret);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (ret)</div><div class='add'>+        exit(1);</div><div class='add'>+    exit(0);</div><div class='add'>+}</div><div class='head'>diff --git a/tests/basic/gfapi/upcall-register-api.t b/tests/basic/gfapi/upcall-register-api.t<br/>new file mode 100755<br/>index 00000000000..a46234ed7af<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/gfapi/upcall-register-api.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/gfapi/upcall-register-api.t</a></div><div class='hunk'>@@ -0,0 +1,30 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/brick1;</div><div class='add'>+EXPECT 'Created' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+EXPECT 'Started' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+logdir=`gluster --print-logdir`</div><div class='add'>+</div><div class='add'>+## Enable Upcall cache-invalidation feature</div><div class='add'>+TEST $CLI volume set $V0 features.cache-invalidation on;</div><div class='add'>+</div><div class='add'>+TEST build_tester $(dirname $0)/upcall-register-api.c -lgfapi</div><div class='add'>+</div><div class='add'>+TEST ./$(dirname $0)/upcall-register-api $H0 $V0  $logdir/upcall-register-api.log</div><div class='add'>+</div><div class='add'>+cleanup_tester $(dirname $0)/upcall-register-api</div><div class='add'>+</div><div class='add'>+TEST $CLI volume stop $V0</div><div class='add'>+TEST $CLI volume delete $V0</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/basic/gfid-access.t b/tests/basic/gfid-access.t<br/>new file mode 100644<br/>index 00000000000..19b6564e676<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/gfid-access.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/gfid-access.t</a></div><div class='hunk'>@@ -0,0 +1,80 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../include.rc</div><div class='add'>+. $(dirname $0)/../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/${V0}0</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+TEST $GFS --volfile-id=/$V0 --volfile-server=$H0 $M0 --aux-gfid-mount;</div><div class='add'>+TEST mkdir $M0/a</div><div class='add'>+TEST touch $M0/b</div><div class='add'>+a_gfid_str=$(gf_gfid_xattr_to_str $(gf_get_gfid_xattr $B0/${V0}0/a))</div><div class='add'>+b_gfid_str=$(gf_gfid_xattr_to_str $(gf_get_gfid_xattr $B0/${V0}0/b))</div><div class='add'>+</div><div class='add'>+#Operations on Directory</div><div class='add'>+TEST setfattr -n trusted.abc -v abc $M0/a</div><div class='add'>+EXPECT "abc" echo $(getfattr -n trusted.abc --only-values $M0/a)</div><div class='add'>+EXPECT "abc" echo $(getfattr -n trusted.abc --only-values $M0/.gfid/$a_gfid_str)</div><div class='add'>+TEST setfattr -x trusted.abc $M0/a</div><div class='add'>+TEST ! getfattr -n trusted.abc $M0/a</div><div class='add'>+TEST ! getfattr -n trusted.abc $M0/.gfid/$a_gfid_str</div><div class='add'>+TEST chmod 0777 $M0/a</div><div class='add'>+EXPECT "777" stat -c "%a" $M0/a</div><div class='add'>+EXPECT "777" stat -c "%a" $M0/.gfid/$a_gfid_str</div><div class='add'>+</div><div class='add'>+TEST setfattr -n trusted.abc -v def $M0/.gfid/$a_gfid_str</div><div class='add'>+EXPECT "def" echo $(getfattr -n trusted.abc --only-values $M0/a)</div><div class='add'>+EXPECT "def" echo $(getfattr -n trusted.abc --only-values $M0/.gfid/$a_gfid_str)</div><div class='add'>+TEST setfattr -x trusted.abc $M0/.gfid/$a_gfid_str</div><div class='add'>+TEST ! getfattr -n trusted.abc $M0/a</div><div class='add'>+TEST ! getfattr -n trusted.abc $M0/.gfid/$a_gfid_str</div><div class='add'>+TEST chmod 0777 $M0/.gfid/$a_gfid_str</div><div class='add'>+EXPECT "777" stat -c "%a" $M0/a</div><div class='add'>+EXPECT "777" stat -c "%a" $M0/.gfid/$a_gfid_str</div><div class='add'>+</div><div class='add'>+#Entry operations on directory</div><div class='add'>+#Test that virtual directories are not allowed to be deleted.</div><div class='add'>+TEST ! mkdir $M0/.gfid</div><div class='add'>+TEST ! rmdir $M0/.gfid</div><div class='add'>+TEST ! touch $M0/.gfid</div><div class='add'>+TEST ! rm -f $M0/.gfid</div><div class='add'>+TEST ! mv $M0/.gfid $M0/dont-rename</div><div class='add'>+TEST ! ln -s $M0/symlink $M0/.gfid</div><div class='add'>+TEST ! ln $M0/.gfid $M0/hlink</div><div class='add'>+TEST ! mknod $M0/.gfid b 0 0</div><div class='add'>+</div><div class='add'>+#Test that first level directory/file creations inside .gfid are not allowed.</div><div class='add'>+tmpfile=$(mktemp)</div><div class='add'>+TEST ! mkdir $M0/.gfid/a</div><div class='add'>+TEST ! touch $M0/.gfid/a</div><div class='add'>+TEST ! mv $tmpfile $M0/.gfid</div><div class='add'>+TEST ! mv $M0/a $M0/.gfid</div><div class='add'>+TEST ! mknod $M0/.gfid/b b 0 0</div><div class='add'>+rm -f $tmpfile</div><div class='add'>+</div><div class='add'>+#Operations on File</div><div class='add'>+TEST setfattr -n trusted.abc -v abc $M0/b</div><div class='add'>+EXPECT "abc" echo $(getfattr -n trusted.abc --only-values $M0/b)</div><div class='add'>+EXPECT "abc" echo $(getfattr -n trusted.abc --only-values $M0/.gfid/$b_gfid_str)</div><div class='add'>+TEST setfattr -x trusted.abc $M0/b</div><div class='add'>+TEST ! getfattr -n trusted.abc $M0/b</div><div class='add'>+TEST ! getfattr -n trusted.abc $M0/.gfid/$b_gfid_str</div><div class='add'>+TEST chmod 0777 $M0/b</div><div class='add'>+EXPECT "777" stat -c "%a" $M0/b</div><div class='add'>+EXPECT "777" stat -c "%a" $M0/.gfid/$b_gfid_str</div><div class='add'>+</div><div class='add'>+TEST setfattr -n trusted.abc -v def $M0/.gfid/$b_gfid_str</div><div class='add'>+EXPECT "def" echo $(getfattr -n trusted.abc --only-values $M0/b)</div><div class='add'>+EXPECT "def" echo $(getfattr -n trusted.abc --only-values $M0/.gfid/$b_gfid_str)</div><div class='add'>+TEST setfattr -x trusted.abc $M0/.gfid/$b_gfid_str</div><div class='add'>+TEST ! getfattr -n trusted.abc $M0/b</div><div class='add'>+TEST ! getfattr -n trusted.abc $M0/.gfid/$b_gfid_str</div><div class='add'>+TEST chmod 0777 $M0/.gfid/$b_gfid_str</div><div class='add'>+EXPECT "777" stat -c "%a" $M0/b</div><div class='add'>+EXPECT "777" stat -c "%a" $M0/.gfid/$b_gfid_str</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/basic/gfproxy.t b/tests/basic/gfproxy.t<br/>new file mode 100755<br/>index 00000000000..7aa8b70b793<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/gfproxy.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/gfproxy.t</a></div><div class='hunk'>@@ -0,0 +1,71 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../include.rc</div><div class='add'>+. $(dirname $0)/../volume.rc</div><div class='add'>+. $(dirname $0)/../nfs.rc</div><div class='add'>+</div><div class='add'>+function file_exists</div><div class='add'>+{</div><div class='add'>+        if [ -f $1 ]; then echo "Y"; else echo "N"; fi</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 replica 3 $H0:$B0/${V0}{0,1,2}</div><div class='add'>+TEST $CLI volume set $V0 config.gfproxyd enable</div><div class='add'>+TEST $CLI volume set $V0 failover-hosts "127.0.0.1,192.168.122.215,192.168.122.90"</div><div class='add'>+TEST $CLI volume set $V0 client-log-level TRACE</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+sleep 2</div><div class='add'>+</div><div class='add'>+REGULAR_CLIENT_VOLFILE="/var/lib/glusterd/vols/${V0}/trusted-${V0}.tcp-fuse.vol"</div><div class='add'>+GFPROXY_CLIENT_VOLFILE="/var/lib/glusterd/vols/${V0}/trusted-${V0}.tcp-gfproxy-fuse.vol"</div><div class='add'>+GFPROXYD_VOLFILE="/var/lib/glusterd/vols/${V0}/${V0}.gfproxyd.vol"</div><div class='add'>+</div><div class='add'>+# Client volfile must exist</div><div class='add'>+TEST [ -f $GFPROXY_CLIENT_VOLFILE ]</div><div class='add'>+</div><div class='add'>+# write-behind translators must exist</div><div class='add'>+TEST grep "performance/write-behind" $GFPROXY_CLIENT_VOLFILE</div><div class='add'>+</div><div class='add'>+# Make sure we didn't screw up the existing client</div><div class='add'>+TEST grep "performance/write-behind" $REGULAR_CLIENT_VOLFILE</div><div class='add'>+TEST grep "cluster/replicate" $REGULAR_CLIENT_VOLFILE</div><div class='add'>+TEST grep "cluster/distribute" $REGULAR_CLIENT_VOLFILE</div><div class='add'>+</div><div class='add'>+TEST [ -f $GFPROXYD_VOLFILE ]</div><div class='add'>+</div><div class='add'>+TEST grep "cluster/replicate" $GFPROXYD_VOLFILE</div><div class='add'>+TEST grep "cluster/distribute" $GFPROXYD_VOLFILE</div><div class='add'>+</div><div class='add'>+# write-behind must *not* exist</div><div class='add'>+TEST ! grep "performance/write-behind" $GFPROXYD_VOLFILE</div><div class='add'>+</div><div class='add'>+# Test that we can start the server and the client</div><div class='add'>+TEST glusterfs --thin-client --volfile-id=patchy --volfile-server=$H0 -l /var/log/glusterfs/${V0}-gfproxy-client.log $M0</div><div class='add'>+sleep 2</div><div class='add'>+TEST grep gfproxy-client/${V0} /proc/mounts</div><div class='add'>+</div><div class='add'>+# Write data to the mount and checksum it</div><div class='add'>+TEST dd if=/dev/urandom bs=1M count=10 of=/tmp/testfile1</div><div class='add'>+md5=$(md5sum /tmp/testfile1 | awk '{print $1}')</div><div class='add'>+TEST cp -v /tmp/testfile1 $M0/testfile1</div><div class='add'>+TEST [ "$(md5sum $M0/testfile1 | awk '{print $1}')" == "$md5" ]</div><div class='add'>+</div><div class='add'>+rm /tmp/testfile1</div><div class='add'>+</div><div class='add'>+dd if=/dev/zero of=$M0/bigfile bs=1K count=10240 &amp;</div><div class='add'>+BG_STRESS_PID=$!</div><div class='add'>+</div><div class='add'>+TEST wait $BG_STRESS_PID</div><div class='add'>+</div><div class='add'>+# Perform graph change and make sure the gfproxyd restarts</div><div class='add'>+TEST $CLI volume set $V0 stat-prefetch off</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "Y" file_exists $M0/bigfile</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+#G_TESTDEF_TEST_STATUS_NETBSD7=1501392</div><div class='head'>diff --git a/tests/basic/global-threading.t b/tests/basic/global-threading.t<br/>new file mode 100644<br/>index 00000000000..f7d34044b09<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/global-threading.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/global-threading.t</a></div><div class='hunk'>@@ -0,0 +1,104 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../include.rc</div><div class='add'>+. $(dirname $0)/../volume.rc</div><div class='add'>+</div><div class='add'>+# Test if the given process has a number of threads of a given type between</div><div class='add'>+# min and max.</div><div class='add'>+function check_threads() {</div><div class='add'>+    local pid="${1}"</div><div class='add'>+    local pattern="${2}"</div><div class='add'>+    local min="${3}"</div><div class='add'>+    local max="${4-}"</div><div class='add'>+    local count</div><div class='add'>+</div><div class='add'>+    count="$(ps hH -o comm ${pid} | grep "${pattern}" | wc -l)"</div><div class='add'>+    if [[ ${min} -gt ${count} ]]; then</div><div class='add'>+        return 1</div><div class='add'>+    fi</div><div class='add'>+    if [[ ! -z "${max}" &amp;&amp; ${max} -lt ${count} ]]; then</div><div class='add'>+        return 1</div><div class='add'>+    fi</div><div class='add'>+</div><div class='add'>+    return 0</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+</div><div class='add'>+# Glusterd shouldn't use any thread</div><div class='add'>+TEST check_threads $(get_glusterd_pid) glfs_tpw 0 0</div><div class='add'>+TEST check_threads $(get_glusterd_pid) glfs_iotwr 0 0</div><div class='add'>+</div><div class='add'>+TEST pkill -9 glusterd</div><div class='add'>+</div><div class='add'>+TEST glusterd --global-threading</div><div class='add'>+</div><div class='add'>+# Glusterd shouldn't use global threads, even if enabled</div><div class='add'>+TEST check_threads $(get_glusterd_pid) glfs_tpw 0 0</div><div class='add'>+TEST check_threads $(get_glusterd_pid) glfs_iotwr 0 0</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 replica 2 $H0:$B0/b{0,1}</div><div class='add'>+</div><div class='add'>+# Normal configuration using io-threads on bricks</div><div class='add'>+TEST $CLI volume set $V0 config.global-threading off</div><div class='add'>+TEST $CLI volume set $V0 performance.iot-pass-through off</div><div class='add'>+TEST $CLI volume set $V0 performance.client-io-threads off</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+# There shouldn't be global threads</div><div class='add'>+TEST check_threads $(get_brick_pid $V0 $H0 $B0/b0) glfs_tpw 0 0</div><div class='add'>+TEST check_threads $(get_brick_pid $V0 $H0 $B0/b1) glfs_tpw 0 0</div><div class='add'>+</div><div class='add'>+# There should be at least 1 io-thread</div><div class='add'>+TEST check_threads $(get_brick_pid $V0 $H0 $B0/b0) glfs_iotwr 1</div><div class='add'>+TEST check_threads $(get_brick_pid $V0 $H0 $B0/b1) glfs_iotwr 1</div><div class='add'>+</div><div class='add'>+# Self-heal should be using global threads</div><div class='add'>+TEST check_threads $(get_shd_process_pid) glfs_tpw 1</div><div class='add'>+TEST check_threads $(get_shd_process_pid) glfs_iotwr 0 0</div><div class='add'>+</div><div class='add'>+TEST $CLI volume stop $V0</div><div class='add'>+</div><div class='add'>+# Configuration with global threads on bricks</div><div class='add'>+TEST $CLI volume set $V0 config.global-threading on</div><div class='add'>+TEST $CLI volume set $V0 performance.iot-pass-through on</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+# There should be at least 1 global thread</div><div class='add'>+TEST check_threads $(get_brick_pid $V0 $H0 $B0/b0) glfs_tpw 1</div><div class='add'>+TEST check_threads $(get_brick_pid $V0 $H0 $B0/b1) glfs_tpw 1</div><div class='add'>+</div><div class='add'>+# There shouldn't be any io-thread worker threads</div><div class='add'>+TEST check_threads $(get_brick_pid $V0 $H0 $B0/b0) glfs_iotwr 0 0</div><div class='add'>+TEST check_threads $(get_brick_pid $V0 $H0 $B0/b1) glfs_iotwr 0 0</div><div class='add'>+</div><div class='add'>+# Normal configuration using io-threads on clients</div><div class='add'>+TEST $CLI volume set $V0 performance.iot-pass-through off</div><div class='add'>+TEST $CLI volume set $V0 performance.client-io-threads on</div><div class='add'>+TEST $GFS --volfile-id=/$V0 --volfile-server=$H0 $M0</div><div class='add'>+</div><div class='add'>+# There shouldn't be global threads</div><div class='add'>+TEST check_threads $(get_mount_process_pid $V0 $M0) glfs_tpw 0 0</div><div class='add'>+</div><div class='add'>+# There should be at least 1 io-thread</div><div class='add'>+TEST check_threads $(get_mount_process_pid $V0 $M0) glfs_iotwr 1</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+</div><div class='add'>+# Configuration with global threads on clients</div><div class='add'>+TEST $CLI volume set $V0 performance.client-io-threads off</div><div class='add'>+TEST $GFS --volfile-id=/$V0 --volfile-server=$H0 --global-threading $M0</div><div class='add'>+</div><div class='add'>+# There should be at least 1 global thread</div><div class='add'>+TEST check_threads $(get_mount_process_pid $V0 $M0) glfs_tpw 1</div><div class='add'>+</div><div class='add'>+# There shouldn't be io-threads</div><div class='add'>+TEST check_threads $(get_mount_process_pid $V0 $M0) glfs_iotwr 0 0</div><div class='add'>+</div><div class='add'>+# Some basic volume access checks with global-threading enabled everywhere</div><div class='add'>+TEST mkdir ${M0}/dir</div><div class='add'>+TEST dd if=/dev/zero of=${M0}/dir/file bs=128k count=8</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/basic/glusterd-restart-shd-mux.t b/tests/basic/glusterd-restart-shd-mux.t<br/>new file mode 100644<br/>index 00000000000..46d0dac2fce<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/glusterd-restart-shd-mux.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/glusterd-restart-shd-mux.t</a></div><div class='hunk'>@@ -0,0 +1,96 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../include.rc</div><div class='add'>+. $(dirname $0)/../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TESTS_EXPECTED_IN_LOOP=20</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 replica 3 $H0:$B0/${V0}{0,1,2,3,4,5}</div><div class='add'>+TEST $CLI volume set $V0 cluster.background-self-heal-count 0</div><div class='add'>+TEST $CLI volume set $V0 cluster.eager-lock off</div><div class='add'>+TEST $CLI volume set $V0 performance.flush-behind off</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+for i in $(seq 1 3); do</div><div class='add'>+   TEST $CLI volume create ${V0}_afr$i replica 3 $H0:$B0/${V0}_afr${i}{0,1,2,3,4,5}</div><div class='add'>+   TEST $CLI volume start ${V0}_afr$i</div><div class='add'>+   TEST $CLI volume create ${V0}_ec$i disperse 6 redundancy 2 $H0:$B0/${V0}_ec${i}{0,1,2,3,4,5}</div><div class='add'>+   TEST $CLI volume start ${V0}_ec$i</div><div class='add'>+done</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "^1$" shd_count</div><div class='add'>+</div><div class='add'>+#Stop the glusterd</div><div class='add'>+TEST pkill glusterd</div><div class='add'>+#Only stopping glusterd, so there will be one shd</div><div class='add'>+EXPECT_WITHIN $PROCESS_DOWN_TIMEOUT "^1$" shd_count</div><div class='add'>+TEST glusterd</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "^1$" shd_count</div><div class='add'>+#Check the thread count become to number of volumes*number of ec subvolume (3*6=18)</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "^18$" number_healer_threads_shd $V0 "ec_shd_index_healer"</div><div class='add'>+#Check the thread count become to number of volumes*number of afr subvolume (4*6=24)</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "^24$" number_healer_threads_shd $V0 "afr_shd_index_healer"</div><div class='add'>+</div><div class='add'>+shd_pid=$(get_shd_mux_pid $V0)</div><div class='add'>+for i in $(seq 1 3); do</div><div class='add'>+    afr_path="/var/run/gluster/shd/${V0}_afr$i/${V0}_afr$i-shd.pid"</div><div class='add'>+    EXPECT_WITHIN $PROCESS_UP_TIMEOUT "^${shd_pid}$" cat $afr_path</div><div class='add'>+    ec_path="/var/run/gluster/shd/${V0}_ec$i/${V0}_ec${i}-shd.pid"</div><div class='add'>+    EXPECT_WITHIN $PROCESS_UP_TIMEOUT "^${shd_pid}$" cat $ec_path</div><div class='add'>+done</div><div class='add'>+</div><div class='add'>+#Reboot a node scenario</div><div class='add'>+TEST pkill gluster</div><div class='add'>+#Only stopped glusterd, so there will be one shd</div><div class='add'>+EXPECT_WITHIN $PROCESS_DOWN_TIMEOUT "^0$" shd_count</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "^1$" shd_count</div><div class='add'>+</div><div class='add'>+#Check the thread count become to number of volumes*number of ec subvolume (3*6=18)</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "^18$" number_healer_threads_shd $V0 "ec_shd_index_healer"</div><div class='add'>+#Check the thread count become to number of volumes*number of afr subvolume (4*6=24)</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "^24$" number_healer_threads_shd $V0 "afr_shd_index_healer"</div><div class='add'>+</div><div class='add'>+shd_pid=$(get_shd_mux_pid $V0)</div><div class='add'>+for i in $(seq 1 3); do</div><div class='add'>+    afr_path="/var/run/gluster/shd/${V0}_afr$i/${V0}_afr$i-shd.pid"</div><div class='add'>+    EXPECT_WITHIN $PROCESS_UP_TIMEOUT "^${shd_pid}$" cat $afr_path</div><div class='add'>+    ec_path="/var/run/gluster/shd/${V0}_ec$i/${V0}_ec${i}-shd.pid"</div><div class='add'>+    EXPECT_WITHIN $PROCESS_UP_TIMEOUT "^${shd_pid}$" cat $ec_path</div><div class='add'>+done</div><div class='add'>+</div><div class='add'>+for i in $(seq 1 3); do</div><div class='add'>+   TEST $CLI volume stop ${V0}_afr$i</div><div class='add'>+   TEST $CLI volume stop ${V0}_ec$i</div><div class='add'>+done</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $PROCESS_DOWN_TIMEOUT "^6$" number_healer_threads_shd $V0 "afr_shd_index_healer"</div><div class='add'>+</div><div class='add'>+TEST $GFS --volfile-id=/$V0 --volfile-server=$H0 $M0</div><div class='add'>+</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}0</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}3</div><div class='add'>+</div><div class='add'>+TEST touch $M0/foo{1..100}</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "^204$" get_pending_heal_count $V0</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start ${V0} force</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "^0$" get_pending_heal_count $V0</div><div class='add'>+</div><div class='add'>+TEST rm -rf $M0/*</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+TEST $CLI volume stop ${V0}</div><div class='add'>+TEST $CLI volume delete ${V0}</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "^0$" shd_count</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/basic/glusterd/arbiter-volume-probe.t b/tests/basic/glusterd/arbiter-volume-probe.t<br/>new file mode 100644<br/>index 00000000000..cb05f4ada42<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/glusterd/arbiter-volume-probe.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/glusterd/arbiter-volume-probe.t</a></div><div class='hunk'>@@ -0,0 +1,25 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../cluster.rc</div><div class='add'>+</div><div class='add'>+#This tests if the arbiter-count is transferred to the other peer.</div><div class='add'>+function check_peers {</div><div class='add'>+        $CLI_1 peer status | grep 'Peer in Cluster (Connected)' | wc -l</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST launch_cluster 2;</div><div class='add'>+TEST $CLI_1 peer probe $H2;</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $PROBE_TIMEOUT 1 check_peers</div><div class='add'>+</div><div class='add'>+kill_glusterd 2</div><div class='add'>+$CLI_1 volume create $V0 replica 3 arbiter 1 $H0:$B0/b{1..3}</div><div class='add'>+TEST $glusterd_2</div><div class='add'>+EXPECT_WITHIN $PROBE_TIMEOUT 1 check_peers</div><div class='add'>+EXPECT "1 x \(2 \+ 1\) = 3" volinfo_field_1 $V0 "Number of Bricks"</div><div class='add'>+EXPECT "1 x \(2 \+ 1\) = 3" volinfo_field_2 $V0 "Number of Bricks"</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/basic/glusterd/check-cloudsync-ancestry.t b/tests/basic/glusterd/check-cloudsync-ancestry.t<br/>new file mode 100644<br/>index 00000000000..ff6ffee8db7<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/glusterd/check-cloudsync-ancestry.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/glusterd/check-cloudsync-ancestry.t</a></div><div class='hunk'>@@ -0,0 +1,48 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+# When shard and cloudsync xlators enabled on a volume, shard xlator</div><div class='add'>+# should be an ancestor of cloudsync. This testcase is to check this condition.</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/b1 $H0:$B0/b2 $H0:$B0/b3</div><div class='add'>+</div><div class='add'>+volfile=$(gluster system:: getwd)"/vols/$V0/trusted-$V0.tcp-fuse.vol"</div><div class='add'>+</div><div class='add'>+#Test that both shard and cloudsync are not loaded</div><div class='add'>+EXPECT "N" volgen_volume_exists $volfile $V0-shard features shard</div><div class='add'>+EXPECT "N" volgen_volume_exists $volfile $V0-cloudsync features cloudsync</div><div class='add'>+</div><div class='add'>+#Enable shard and cloudsync in that order and check if volfile is correct</div><div class='add'>+TEST $CLI volume set $V0 shard on</div><div class='add'>+TEST $CLI volume set $V0 cloudsync on</div><div class='add'>+</div><div class='add'>+#Test that both shard and cloudsync are loaded</div><div class='add'>+EXPECT "Y" volgen_volume_exists $volfile $V0-shard features shard</div><div class='add'>+EXPECT "Y" volgen_volume_exists $volfile $V0-cloudsync features cloudsync</div><div class='add'>+</div><div class='add'>+EXPECT "Y" volgen_check_ancestry $volfile features shard features cloudsync</div><div class='add'>+</div><div class='add'>+#Disable shard and cloudsync</div><div class='add'>+TEST $CLI volume set $V0 shard off</div><div class='add'>+TEST $CLI volume set $V0 cloudsync off</div><div class='add'>+</div><div class='add'>+#Test that both shard and cloudsync are not loaded</div><div class='add'>+EXPECT "N" volgen_volume_exists $volfile $V0-shard features shard</div><div class='add'>+EXPECT "N" volgen_volume_exists $volfile $V0-cloudsync features cloudsync</div><div class='add'>+</div><div class='add'>+#Enable cloudsync and shard in that order and check if volfile is correct</div><div class='add'>+TEST $CLI volume set $V0 cloudsync on</div><div class='add'>+TEST $CLI volume set $V0 shard on</div><div class='add'>+</div><div class='add'>+#Test that both shard and cloudsync are loaded</div><div class='add'>+EXPECT "Y" volgen_volume_exists $volfile $V0-shard features shard</div><div class='add'>+EXPECT "Y" volgen_volume_exists $volfile $V0-cloudsync features cloudsync</div><div class='add'>+</div><div class='add'>+EXPECT "Y" volgen_check_ancestry $volfile features shard features cloudsync</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/basic/glusterd/disperse-create.t b/tests/basic/glusterd/disperse-create.t<br/>new file mode 100644<br/>index 00000000000..db8a621d48e<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/glusterd/disperse-create.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/glusterd/disperse-create.t</a></div><div class='hunk'>@@ -0,0 +1,73 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+# This command tests the volume create command validation for disperse volumes.</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 disperse $H0:$B0/b1 $H0:$B0/b2 $H0:$B0/b3</div><div class='add'>+EXPECT "1 x \(2 \+ 1\) = 3" volinfo_field $V0 "Number of Bricks"</div><div class='add'>+</div><div class='add'>+TEST $CLI volume delete $V0</div><div class='add'>+TEST $CLI volume create $V0 disperse 3 $H0:$B0/b4 $H0:$B0/b5 $H0:$B0/b6</div><div class='add'>+EXPECT "1 x \(2 \+ 1\) = 3" volinfo_field $V0 "Number of Bricks"</div><div class='add'>+</div><div class='add'>+TEST $CLI volume delete $V0</div><div class='add'>+TEST $CLI volume create $V0 disperse 3 redundancy 1 $H0:$B0/b7 $H0:$B0/b8 $H0:$B0/b9</div><div class='add'>+EXPECT "1 x \(2 \+ 1\) = 3" volinfo_field $V0 "Number of Bricks"</div><div class='add'>+</div><div class='add'>+TEST $CLI volume delete $V0</div><div class='add'>+TEST $CLI volume create $V0 disperse-data 2 $H0:$B0/b10 $H0:$B0/b11 $H0:$B0/b12</div><div class='add'>+EXPECT "1 x \(2 \+ 1\) = 3" volinfo_field $V0 "Number of Bricks"</div><div class='add'>+</div><div class='add'>+TEST $CLI volume delete $V0</div><div class='add'>+TEST $CLI volume create $V0 redundancy 1 $H0:$B0/b10 $H0:$B0/b11 $H0:$B0/b12</div><div class='add'>+EXPECT "1 x \(2 \+ 1\) = 3" volinfo_field $V0 "Number of Bricks"</div><div class='add'>+</div><div class='add'>+TEST $CLI volume delete $V0</div><div class='add'>+TEST $CLI volume create $V0 disperse-data 2 redundancy 1 $H0:$B0/b11 $H0:$B0/b12 $H0:$B0/b13</div><div class='add'>+EXPECT "1 x \(2 \+ 1\) = 3" volinfo_field $V0 "Number of Bricks"</div><div class='add'>+</div><div class='add'>+TEST $CLI volume delete $V0</div><div class='add'>+TEST $CLI volume create $V0 disperse-data 2 redundancy 1 $H0:$B0/b11 $H0:$B0/b12 $H0:$B0/b13</div><div class='add'>+EXPECT "1 x \(2 \+ 1\) = 3" volinfo_field $V0 "Number of Bricks"</div><div class='add'>+</div><div class='add'>+TEST $CLI volume delete $V0</div><div class='add'>+TEST $CLI volume create $V0 disperse 3 disperse-data 2 $H0:$B0/b14 $H0:$B0/b15 $H0:$B0/b16</div><div class='add'>+EXPECT "1 x \(2 \+ 1\) = 3" volinfo_field $V0 "Number of Bricks"</div><div class='add'>+</div><div class='add'>+TEST $CLI volume delete $V0</div><div class='add'>+TEST $CLI volume create $V0 disperse 3 disperse-data 2 redundancy 1 $H0:$B0/b17 $H0:$B0/b18 $H0:$B0/b19</div><div class='add'>+EXPECT "1 x \(2 \+ 1\) = 3" volinfo_field $V0 "Number of Bricks"</div><div class='add'>+</div><div class='add'>+# -ve test cases</div><div class='add'>+#Key-words appearing more than once</div><div class='add'>+TEST ! $CLI volume create $V0 disperse 3 disperse 3 $H0:$B0/b20 $H0:$B0/b21 $H0:$B0/b22</div><div class='add'>+TEST ! $CLI volume create $V0 disperse-data 2 disperse-data 2 $H0:$B0/b20 $H0:$B0/b21 $H0:$B0/b22</div><div class='add'>+TEST ! $CLI volume create $V0 redundancy 1 redundancy 1 $H0:$B0/b20 $H0:$B0/b21 $H0:$B0/b22</div><div class='add'>+</div><div class='add'>+#Minimum counts test</div><div class='add'>+TEST ! $CLI volume create $V0 disperse 2 $H0:$B0/b20 $H0:$B0/b22</div><div class='add'>+TEST ! $CLI volume create $V0 disperse-data 1 redundancy 0 $H0:$B0/b20 $H0:$B0/b22</div><div class='add'>+TEST ! $CLI volume create $V0 disperse 4 disperse-data 4 $H0:$B0/b20 $H0:$B0/b21 $H0:$B0/b23 $H0:$B0/b24</div><div class='add'>+TEST ! $CLI volume create $V0 redundancy 0 $H0:$B0/b20 $H0:$B0/b22</div><div class='add'>+</div><div class='add'>+#Wrong count n != k+m</div><div class='add'>+TEST ! $CLI volume create $V0 disperse 4 disperse-data 4 redundancy 2 $H0:$B0/b20 $H0:$B0/b21 $H0:$B0/b22</div><div class='add'>+#Num bricks is not multiple of disperse count</div><div class='add'>+TEST ! $CLI volume create $V0 disperse 6 disperse-data 4 $H0:$B0/b20 $H0:$B0/b21 $H0:$B0/b22</div><div class='add'>+#Redundancy &gt; data</div><div class='add'>+TEST ! $CLI volume create $V0 disperse 6 disperse-data 2 redundancy 4 $H0:$B0/b20 $H0:$B0/b21 $H0:$B0/b22</div><div class='add'>+TEST ! $CLI volume create $V0 disperse 4 disperse-data 2 redundancy 2 $H0:$B0/b20 $H0:$B0/b21 $H0:$B0/b22</div><div class='add'>+#Replica + Disperse</div><div class='add'>+TEST ! $CLI volume create $V0 disperse 4 replica 2 $H0:$B0/b20 $H0:$B0/b21 $H0:$B0/b22</div><div class='add'>+TEST ! $CLI volume create $V0 disperse-data 2 replica 2 $H0:$B0/b20 $H0:$B0/b21 $H0:$B0/b22 $H0:$B0/b23</div><div class='add'>+TEST ! $CLI volume create $V0 redundancy 2 replica 2 $H0:$B0/b20 $H0:$B0/b21 $H0:$B0/b22</div><div class='add'>+TEST ! $CLI volume create $V0 replica 2 disperse 4 $H0:$B0/b20 $H0:$B0/b21 $H0:$B0/b22</div><div class='add'>+TEST ! $CLI volume create $V0 replica 2 disperse-data 2 $H0:$B0/b20 $H0:$B0/b21 $H0:$B0/b22 $H0:$B0/b23</div><div class='add'>+TEST ! $CLI volume create $V0 replica 2 redundancy 2 $H0:$B0/b20 $H0:$B0/b21 $H0:$B0/b22</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/basic/glusterd/heald.t b/tests/basic/glusterd/heald.t<br/>new file mode 100644<br/>index 00000000000..7dae3c3f0fb<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/glusterd/heald.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/glusterd/heald.t</a></div><div class='hunk'>@@ -0,0 +1,92 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+# This test contains volume heal commands handled by glusterd.</div><div class='add'>+# Covers enable/disable at the moment. Will be enhanced later to include</div><div class='add'>+# the other commands as well.</div><div class='add'>+</div><div class='add'>+function is_pid_running {</div><div class='add'>+    local pid=$1</div><div class='add'>+    num=`ps auxww | grep glustershd | grep $pid | grep -v grep | wc -l`</div><div class='add'>+    echo $num</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+</div><div class='add'>+#Commands should fail when volume doesn't exist</div><div class='add'>+TEST ! $CLI volume heal non-existent-volume enable</div><div class='add'>+TEST ! $CLI volume heal non-existent-volume disable</div><div class='add'>+</div><div class='add'>+# Glustershd shouldn't be running as long as there are no replicate/disperse</div><div class='add'>+# volumes</div><div class='add'>+TEST $CLI volume create dist $H0:$B0/dist</div><div class='add'>+TEST $CLI volume start dist</div><div class='add'>+TEST "[ -z $(get_shd_process_pid dist)]"</div><div class='add'>+TEST ! $CLI volume heal dist enable</div><div class='add'>+TEST ! $CLI volume heal dist disable</div><div class='add'>+</div><div class='add'>+# Commands should work on replicate/disperse volume.</div><div class='add'>+TEST $CLI volume create r2 replica 2 $H0:$B0/r2_0 $H0:$B0/r2_1</div><div class='add'>+TEST "[ -z $(get_shd_process_pid r2)]"</div><div class='add'>+TEST $CLI volume start r2</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "[0-9][0-9]*" get_shd_process_pid r2</div><div class='add'>+TEST $CLI volume heal r2 enable</div><div class='add'>+EXPECT "enable" volume_option r2 "cluster.self-heal-daemon"</div><div class='add'>+volfiler2=$(gluster system:: getwd)"/vols/r2/r2-shd.vol"</div><div class='add'>+EXPECT "enable" volgen_volume_option $volfiler2 r2-replicate-0 cluster replicate self-heal-daemon</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "[0-9][0-9]*" get_shd_process_pid r2</div><div class='add'>+pid=$( get_shd_process_pid r2 )</div><div class='add'>+TEST $CLI volume heal r2 disable</div><div class='add'>+EXPECT "disable" volume_option r2 "cluster.self-heal-daemon"</div><div class='add'>+EXPECT "disable" volgen_volume_option $volfiler2 r2-replicate-0 cluster replicate self-heal-daemon</div><div class='add'>+EXPECT "1" is_pid_running $pid</div><div class='add'>+</div><div class='add'>+# Commands should work on disperse volume.</div><div class='add'>+TEST $CLI volume create ec2 disperse 3 redundancy 1 $H0:$B0/ec2_0 $H0:$B0/ec2_1 $H0:$B0/ec2_2</div><div class='add'>+TEST $CLI volume start ec2</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "[0-9][0-9]*" get_shd_process_pid ec2</div><div class='add'>+TEST $CLI volume heal ec2 enable</div><div class='add'>+EXPECT "enable" volume_option ec2 "cluster.disperse-self-heal-daemon"</div><div class='add'>+volfileec2=$(gluster system:: getwd)"/vols/ec2/ec2-shd.vol"</div><div class='add'>+EXPECT "enable" volgen_volume_option $volfileec2 ec2-disperse-0 cluster disperse self-heal-daemon</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "[0-9][0-9]*" get_shd_process_pid ec2</div><div class='add'>+pid=$(get_shd_process_pid ec2)</div><div class='add'>+TEST $CLI volume heal ec2 disable</div><div class='add'>+EXPECT "disable" volume_option ec2 "cluster.disperse-self-heal-daemon"</div><div class='add'>+EXPECT "disable" volgen_volume_option $volfileec2 ec2-disperse-0 cluster disperse self-heal-daemon</div><div class='add'>+EXPECT "1" is_pid_running $pid</div><div class='add'>+</div><div class='add'>+#Check that shd graph is rewritten correctly on volume stop/start</div><div class='add'>+EXPECT "Y" volgen_volume_exists $volfileec2 ec2-disperse-0 cluster disperse</div><div class='add'>+</div><div class='add'>+EXPECT "Y" volgen_volume_exists $volfiler2 r2-replicate-0 cluster replicate</div><div class='add'>+TEST $CLI volume stop r2</div><div class='add'>+EXPECT "Y" volgen_volume_exists $volfileec2 ec2-disperse-0 cluster disperse</div><div class='add'>+TEST $CLI volume stop ec2</div><div class='add'>+# When both the volumes are stopped glustershd volfile is not modified just the</div><div class='add'>+# process is stopped</div><div class='add'>+TEST "[ -z $(get_shd_process_pid dist) ]"</div><div class='add'>+TEST "[ -z $(get_shd_process_pid ec2) ]"</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start r2</div><div class='add'>+EXPECT "Y" volgen_volume_exists $volfiler2 r2-replicate-0 cluster replicate</div><div class='add'>+</div><div class='add'>+TEST $CLI volume set r2 self-heal-daemon on</div><div class='add'>+TEST $CLI volume set r2 cluster.self-heal-daemon off</div><div class='add'>+TEST ! $CLI volume set ec2 self-heal-daemon off</div><div class='add'>+TEST ! $CLI volume set ec2 cluster.self-heal-daemon on</div><div class='add'>+TEST ! $CLI volume set dist self-heal-daemon off</div><div class='add'>+TEST ! $CLI volume set dist cluster.self-heal-daemon on</div><div class='add'>+</div><div class='add'>+TEST $CLI volume set ec2 disperse-self-heal-daemon off</div><div class='add'>+TEST $CLI volume set ec2 cluster.disperse-self-heal-daemon on</div><div class='add'>+TEST ! $CLI volume set r2 disperse-self-heal-daemon on</div><div class='add'>+TEST ! $CLI volume set r2 cluster.disperse-self-heal-daemon off</div><div class='add'>+TEST ! $CLI volume set dist disperse-self-heal-daemon off</div><div class='add'>+TEST ! $CLI volume set dist cluster.disperse-self-heal-daemon on</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/basic/glusterd/thin-arbiter-volume-probe.t b/tests/basic/glusterd/thin-arbiter-volume-probe.t<br/>new file mode 100644<br/>index 00000000000..acc6943806d<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/glusterd/thin-arbiter-volume-probe.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/glusterd/thin-arbiter-volume-probe.t</a></div><div class='hunk'>@@ -0,0 +1,25 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../cluster.rc</div><div class='add'>+</div><div class='add'>+#This tests if the thin-arbiter-count is transferred to the other peer.</div><div class='add'>+function check_peers {</div><div class='add'>+        $CLI_1 peer status | grep 'Peer in Cluster (Connected)' | wc -l</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST launch_cluster 2;</div><div class='add'>+TEST $CLI_1 peer probe $H2;</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $PROBE_TIMEOUT 1 check_peers</div><div class='add'>+</div><div class='add'>+kill_glusterd 2</div><div class='add'>+$CLI_1 volume create $V0 replica 2 thin-arbiter 1 $H0:$B0/b{1..3}</div><div class='add'>+TEST $glusterd_2</div><div class='add'>+EXPECT_WITHIN $PROBE_TIMEOUT 1 check_peers</div><div class='add'>+EXPECT "1 x 2 = 2" volinfo_field_1 $V0 "Number of Bricks"</div><div class='add'>+EXPECT "1 x 2 = 2" volinfo_field_2 $V0 "Number of Bricks"</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/basic/glusterd/thin-arbiter-volume.t b/tests/basic/glusterd/thin-arbiter-volume.t<br/>new file mode 100644<br/>index 00000000000..4e813890a45<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/glusterd/thin-arbiter-volume.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/glusterd/thin-arbiter-volume.t</a></div><div class='hunk'>@@ -0,0 +1,45 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../ volume.rc</div><div class='add'>+. $(dirname $0)/../../thin-arbiter.rc</div><div class='add'>+</div><div class='add'>+#This command tests the volume create command validation for thin-arbiter volumes.</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 replica 2 thin-arbiter 1 $H0:$B0/b1 $H0:$B0/b2 $H0:$B0/b3</div><div class='add'>+EXPECT "1 x 2 = 2" volinfo_field $V0 "Number of Bricks"</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+TEST $GFS --volfile-id=$V0 --volfile-server=$H0 $M0;</div><div class='add'>+</div><div class='add'>+TEST touch $M0/a.txt</div><div class='add'>+TEST ls $B0/b1/a.txt </div><div class='add'>+TEST ls $B0/b2/a.txt </div><div class='add'>+TEST ! ls $B0/b3/a.txt</div><div class='add'>+</div><div class='add'>+TEST umount $M0</div><div class='add'>+TEST $CLI volume stop $V0</div><div class='add'>+TEST $CLI volume delete $V0</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 replica 2 thin-arbiter 1 $H0:$B0/b{4..8}</div><div class='add'>+EXPECT "2 x 2 = 4" volinfo_field $V0 "Number of Bricks"</div><div class='add'>+</div><div class='add'>+TEST $CLI volume delete $V0</div><div class='add'>+</div><div class='add'>+TEST rm -rf $B0/b{1..3}</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 replica 2 thin-arbiter 1 $H0:$B0/b1 $H0:$B0/b2 $H0:$B0/b3</div><div class='add'>+EXPECT "1 x 2 = 2" volinfo_field $V0 "Number of Bricks"</div><div class='add'>+</div><div class='add'>+TEST killall -15 glusterd</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+EXPECT "1 x 2 = 2" volinfo_field $V0 "Number of Bricks"</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='add'>+</div><div class='head'>diff --git a/tests/basic/glusterd/volfile_server_switch.t b/tests/basic/glusterd/volfile_server_switch.t<br/>new file mode 100644<br/>index 00000000000..e11cfed509a<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/glusterd/volfile_server_switch.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/glusterd/volfile_server_switch.t</a></div><div class='hunk'>@@ -0,0 +1,46 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+. $(dirname $0)/../../cluster.rc</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+# * How this test works ?</div><div class='add'>+# 1. create a 3 node cluster</div><div class='add'>+# 2. add them to trusted pool</div><div class='add'>+# 3. create a volume and start</div><div class='add'>+# 4. mount the volume with all 3 backup-volfile servers</div><div class='add'>+# 5. kill glusterd in node 1</div><div class='add'>+# 6. make changes to volume using node 2, using 'volume set' here</div><div class='add'>+# 7. check whether those notifications are received by client</div><div class='add'>+</div><div class='add'>+TEST launch_cluster 3;</div><div class='add'>+</div><div class='add'>+TEST $CLI_1 peer probe $H2;</div><div class='add'>+EXPECT_WITHIN $PROBE_TIMEOUT 1 peer_count</div><div class='add'>+</div><div class='add'>+TEST $CLI_1 peer probe $H3;</div><div class='add'>+EXPECT_WITHIN $PROBE_TIMEOUT 2 peer_count</div><div class='add'>+</div><div class='add'>+TEST $CLI_1 volume create $V0 $H1:$B1/$V0 $H2:$B2/$V0 $H3:$B3/$V0</div><div class='add'>+</div><div class='add'>+TEST $CLI_1 volume start $V0</div><div class='add'>+</div><div class='add'>+TEST $CLI_1 volume status $V0;</div><div class='add'>+</div><div class='add'>+TEST glusterfs --volfile-id=/$V0 --volfile-server=$H1 --volfile-server=$H2 --volfile-server=$H3  $M0</div><div class='add'>+</div><div class='add'>+TEST kill_glusterd 1</div><div class='add'>+</div><div class='add'>+TEST $CLI_2 volume set $V0 performance.write-behind off</div><div class='add'>+</div><div class='add'>+# make sure by this time directory will be created</div><div class='add'>+# TODO: suggest ideal time to wait</div><div class='add'>+sleep 5</div><div class='add'>+</div><div class='add'>+count=$(find $M0/.meta/graphs/* -maxdepth 0 -type d -iname "*" | wc -l)</div><div class='add'>+TEST [ "$count" -gt "1" ]</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/basic/glusterd/volume-brick-count.t b/tests/basic/glusterd/volume-brick-count.t<br/>new file mode 100644<br/>index 00000000000..dc1a5278f4f<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/glusterd/volume-brick-count.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/glusterd/volume-brick-count.t</a></div><div class='hunk'>@@ -0,0 +1,61 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+function test_volume_config()</div><div class='add'>+{</div><div class='add'>+        volname=$1</div><div class='add'>+        type_string=$2</div><div class='add'>+        brickCount=$3</div><div class='add'>+        distCount=$4</div><div class='add'>+        replicaCount=$5</div><div class='add'>+        arbiterCount=$6</div><div class='add'>+        disperseCount=$7</div><div class='add'>+        redundancyCount=$8</div><div class='add'>+</div><div class='add'>+        EXPECT "$type_string" volinfo_field $volname "Number of Bricks"</div><div class='add'>+        EXPECT "$brickCount" get-xml "volume info $volname" "brickCount"</div><div class='add'>+        EXPECT "$distCount" get-xml "volume info $volname" "distCount"</div><div class='add'>+        EXPECT "$replicaCount" get-xml "volume info $volname" "replicaCount"</div><div class='add'>+        EXPECT "$arbiterCount" get-xml "volume info $volname" "arbiterCount"</div><div class='add'>+        EXPECT "$disperseCount" get-xml "volume info $volname" "disperseCount"</div><div class='add'>+        EXPECT "$redundancyCount" get-xml "volume info $volname" "redundancyCount"</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+# This command tests the volume create command and number of bricks for different volume types.</div><div class='add'>+cleanup;</div><div class='add'>+TESTS_EXPECTED_IN_LOOP=56</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create ${V0}_1 replica 3 arbiter 1 $H0:$B0/b1 $H0:$B0/b2 $H0:$B0/b3</div><div class='add'>+test_volume_config "${V0}_1" "1 x \(2 \+ 1\) = 3" "3" "1" "3" "1" "0" "0"</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create ${V0}_2 replica 3 arbiter 1 $H0:$B0/b{4..9}</div><div class='add'>+test_volume_config "${V0}_2" "2 x \(2 \+ 1\) = 6" "6" "2" "3" "1" "0" "0"</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create ${V0}_3 replica 3 arbiter 1 $H0:$B0/b{10..12}</div><div class='add'>+test_volume_config "${V0}_3" "1 x \(2 \+ 1\) = 3" "3" "1" "3" "1" "0" "0"</div><div class='add'>+TEST killall -15 glusterd</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+test_volume_config "${V0}_3" "1 x \(2 \+ 1\) = 3" "3" "1" "3" "1" "0" "0"</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create ${V0}_4 replica 3 $H0:$B0/b{13..15}</div><div class='add'>+test_volume_config "${V0}_4" "1 x 3 = 3" "3" "1" "3" "0" "0" "0"</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create ${V0}_5 replica 3 $H0:$B0/b{16..21}</div><div class='add'>+test_volume_config "${V0}_5" "2 x 3 = 6" "6" "2" "3" "0" "0" "0"</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create ${V0}_6 disperse 3 redundancy 1 $H0:$B0/b{22..24}</div><div class='add'>+test_volume_config "${V0}_6" "1 x \(2 \+ 1\) = 3" "3" "1" "1" "0" "3" "1"</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create ${V0}_7 disperse 3 redundancy 1 $H0:$B0/b{25..30}</div><div class='add'>+test_volume_config "${V0}_7" "2 x \(2 \+ 1\) = 6" "6" "2" "1" "0" "3" "1"</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create ${V0}_8 $H0:$B0/b{31..33}</div><div class='add'>+test_volume_config "${V0}_8" "3" "3" "3" "1" "0" "0" "0"</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/basic/glusterfsd-args.t b/tests/basic/glusterfsd-args.t<br/>new file mode 100644<br/>index 00000000000..2dd84b8c29e<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/glusterfsd-args.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/glusterfsd-args.t</a></div><div class='hunk'>@@ -0,0 +1,5 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../include.rc</div><div class='add'>+</div><div class='add'>+EXPECT $GLUSTER_LIBEXECDIR glusterfsd --print-libexecdir</div><div class='head'>diff --git a/tests/basic/graph-cleanup-brick-down-shd-mux.t b/tests/basic/graph-cleanup-brick-down-shd-mux.t<br/>new file mode 100644<br/>index 00000000000..3c621cdcc26<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/graph-cleanup-brick-down-shd-mux.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/graph-cleanup-brick-down-shd-mux.t</a></div><div class='hunk'>@@ -0,0 +1,64 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../include.rc</div><div class='add'>+. $(dirname $0)/../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TESTS_EXPECTED_IN_LOOP=4</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 replica 3 $H0:$B0/${V0}{0,1,2,3,4,5}</div><div class='add'>+TEST $CLI volume set $V0 cluster.background-self-heal-count 0</div><div class='add'>+TEST $CLI volume set $V0 cluster.eager-lock off</div><div class='add'>+TEST $CLI volume set $V0 performance.flush-behind off</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+for i in $(seq 1 2); do</div><div class='add'>+   TEST $CLI volume create ${V0}_afr$i replica 3 $H0:$B0/${V0}_afr${i}{0,1,2,3,4,5}</div><div class='add'>+   TEST $CLI volume start ${V0}_afr$i</div><div class='add'>+   TEST $CLI volume create ${V0}_ec$i disperse 6 redundancy 2 $H0:$B0/${V0}_ec${i}{0,1,2,3,4,5}</div><div class='add'>+   TEST $CLI volume start ${V0}_ec$i</div><div class='add'>+done</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "^1$" shd_count</div><div class='add'>+#Check the thread count become to number of volumes*number of ec subvolume (2*6=12)</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "^12$" number_healer_threads_shd $V0 "ec_shd_index_healer"</div><div class='add'>+#Check the thread count become to number of volumes*number of afr subvolume (3*6=18)</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "^18$" number_healer_threads_shd $V0 "afr_shd_index_healer"</div><div class='add'>+</div><div class='add'>+#kill one brick and test cleanup</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}0</div><div class='add'>+TEST $CLI volume stop $V0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "^12$" number_healer_threads_shd ${V0}_afr1 "afr_shd_index_healer"</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "^18$" number_healer_threads_shd ${V0}_afr1 "afr_shd_index_healer"</div><div class='add'>+</div><div class='add'>+#kill an entire subvol and test cleanup</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}0</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}1</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}2</div><div class='add'>+#wait for some time to create a race sceanrio</div><div class='add'>+sleep 1</div><div class='add'>+TEST $CLI volume stop $V0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "^12$" number_healer_threads_shd ${V0}_afr1 "afr_shd_index_healer"</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "^18$" number_healer_threads_shd ${V0}_afr1 "afr_shd_index_healer"</div><div class='add'>+</div><div class='add'>+#kill all bricks and test cleanup</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}0</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}1</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}2</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}3</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}4</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}5</div><div class='add'>+#wait for some time to create a race sceanrio</div><div class='add'>+sleep 2</div><div class='add'>+</div><div class='add'>+TEST $CLI volume stop $V0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "^12$" number_healer_threads_shd ${V0}_afr1 "afr_shd_index_healer"</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "^18$" number_healer_threads_shd ${V0}_afr1 "afr_shd_index_healer"</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/basic/hardlink-limit.t b/tests/basic/hardlink-limit.t<br/>new file mode 100644<br/>index 00000000000..ee65c650b59<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/hardlink-limit.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/hardlink-limit.t</a></div><div class='hunk'>@@ -0,0 +1,44 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../include.rc</div><div class='add'>+. $(dirname $0)/../volume.rc</div><div class='add'>+. $(dirname $0)/../dht.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume info;</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 replica 3  $H0:$B0/${V0}{1,2,3,4,5,6};</div><div class='add'>+</div><div class='add'>+EXPECT "$V0" volinfo_field $V0 'Volume Name';</div><div class='add'>+EXPECT 'Created' volinfo_field $V0 'Status';</div><div class='add'>+EXPECT '6' brick_count $V0</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+EXPECT 'Started' volinfo_field $V0 'Status';</div><div class='add'>+TEST $CLI volume set $V0 storage.max-hardlinks 3</div><div class='add'>+TEST glusterfs -s $H0 --volfile-id $V0 $M0;</div><div class='add'>+</div><div class='add'>+TEST dd if=/dev/zero of=$M0/testfile count=1</div><div class='add'>+</div><div class='add'>+# max-hardlinks is 3, should be able to create 2 links.</div><div class='add'>+TEST link $M0/testfile $M0/testfile.link1</div><div class='add'>+TEST link $M0/testfile $M0/testfile.link2</div><div class='add'>+</div><div class='add'>+# But not 3.</div><div class='add'>+TEST ! link $M0/testfile $M0/testfile.link3</div><div class='add'>+# If we remove one...</div><div class='add'>+TEST rm $M0/testfile.link1</div><div class='add'>+# Now we can add one.</div><div class='add'>+TEST link $M0/testfile $M0/testfile.link3</div><div class='add'>+</div><div class='add'>+# But not another</div><div class='add'>+TEST ! link $M0/testfile $M0/testfile.link4</div><div class='add'>+</div><div class='add'>+# Unless we disable the limit...</div><div class='add'>+TEST $CLI volume set $V0 storage.max-hardlinks 0</div><div class='add'>+TEST link $M0/testfile $M0/testfile.link4</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/basic/inode-leak.t b/tests/basic/inode-leak.t<br/>new file mode 100644<br/>index 00000000000..e112fdddf8a<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/inode-leak.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/inode-leak.t</a></div><div class='hunk'>@@ -0,0 +1,31 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../include.rc</div><div class='add'>+. $(dirname $0)/../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 replica 2 $H0:$B0/${V0}{0,1,2,3}</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+TEST glusterfs -s $H0 --volfile-id $V0 $M0</div><div class='add'>+</div><div class='add'>+EXPECT "1" get_mount_active_size_value $V0 $M0</div><div class='add'>+EXPECT "0" get_mount_lru_size_value $V0 $M0</div><div class='add'>+</div><div class='add'>+TEST cp -rf /etc $M0</div><div class='add'>+TEST find $M0</div><div class='add'>+TEST rm -rf $M0/*</div><div class='add'>+</div><div class='add'>+EXPECT "1" get_mount_active_size_value $V0 $M0</div><div class='add'>+EXPECT "0" get_mount_lru_size_value $V0 $M0</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='add'>+</div><div class='add'>+# Mainly marking it as known-issue as it is taking a *lot* of time.</div><div class='add'>+# Revert back if we are below an hour in regression runs.</div><div class='add'>+# Or consider running only in nightly regressions.</div><div class='add'>+</div><div class='add'>+#G_TESTDEF_TEST_STATUS_NETBSD7=KNOWN_ISSUE,BUG=000000</div><div class='add'>+#G_TESTDEF_TEST_STATUS_CENTOS6=KNOWN_ISSUE,BUG=000000</div><div class='head'>diff --git a/tests/basic/inode-quota-enforcing.t b/tests/basic/inode-quota-enforcing.t<br/>new file mode 100644<br/>index 00000000000..d666395dab1<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/inode-quota-enforcing.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/inode-quota-enforcing.t</a></div><div class='hunk'>@@ -0,0 +1,100 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../include.rc</div><div class='add'>+. $(dirname $0)/../volume.rc</div><div class='add'>+. $(dirname $0)/../nfs.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+QDD=$(dirname $0)/quota</div><div class='add'>+# compile the test write program and run it</div><div class='add'>+build_tester $(dirname $0)/quota.c -o $QDD</div><div class='add'>+</div><div class='add'>+TESTS_EXPECTED_IN_LOOP=9</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+</div><div class='add'>+# --------------------------------------------------</div><div class='add'>+# Create, start and mount a volume with single brick</div><div class='add'>+# --------------------------------------------------</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 replica 2 $H0:$B0/${V0}{1,2};</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+TEST $GFS -s $H0 --volfile-id $V0 $M0</div><div class='add'>+TEST mkdir -p $M0/test_dir</div><div class='add'>+</div><div class='add'>+#--------------------------------------------------------</div><div class='add'>+# Enable quota of the volume and set hard and soft timeout</div><div class='add'>+#------------------------------------------------------</div><div class='add'>+</div><div class='add'>+TEST $CLI volume quota $V0 enable</div><div class='add'>+EXPECT 'on' volinfo_field $V0 'features.quota'</div><div class='add'>+TEST $CLI volume quota $V0 soft-timeout 0</div><div class='add'>+EXPECT '0' volinfo_field $V0 'features.soft-timeout'</div><div class='add'>+TEST $CLI volume quota $V0 hard-timeout 0</div><div class='add'>+EXPECT '0' volinfo_field $V0 'features.hard-timeout'</div><div class='add'>+</div><div class='add'>+#-------------------------------------------------------</div><div class='add'>+# Set quota limits on the directory and</div><div class='add'>+# verify if the limits are being reflected properly</div><div class='add'>+#------------------------------------------------------</div><div class='add'>+</div><div class='add'>+TEST $CLI volume quota $V0 limit-objects /test_dir 10</div><div class='add'>+EXPECT "10" quota_object_list_field "/test_dir" 2</div><div class='add'>+</div><div class='add'>+TEST $CLI volume quota $V0 limit-usage /test_dir 100MB</div><div class='add'>+EXPECT "100.0MB" quota_list_field "/test_dir" 2</div><div class='add'>+</div><div class='add'>+#------------------------------------------------------</div><div class='add'>+# Check the quota enforcement mechanism for object count</div><div class='add'>+#-------------------------------------------------------</div><div class='add'>+</div><div class='add'>+# Try creating 9 files and it should succeed as object limit</div><div class='add'>+# is set to 10, since directory where limit is set is accounted</div><div class='add'>+# as well.</div><div class='add'>+</div><div class='add'>+for i in {1..9}; do</div><div class='add'>+        #TEST_IN_LOOP touch $M0/test_dir/test$i.txt</div><div class='add'>+        TEST_IN_LOOP $QDD $M0/test_dir/test$i.txt 256 4</div><div class='add'>+done</div><div class='add'>+EXPECT_WITHIN $MARKER_UPDATE_TIMEOUT "9" quota_object_list_field "/test_dir" 4</div><div class='add'>+EXPECT_WITHIN $MARKER_UPDATE_TIMEOUT "9.0MB" quotausage "/test_dir"</div><div class='add'>+</div><div class='add'>+# Check available limit</div><div class='add'>+EXPECT_WITHIN $MARKER_UPDATE_TIMEOUT "0" quota_object_list_field "/test_dir" 6</div><div class='add'>+EXPECT_WITHIN $MARKER_UPDATE_TIMEOUT "91.0MB" quota_list_field "/test_dir" 5</div><div class='add'>+</div><div class='add'>+# Check if hard-limit exceeded</div><div class='add'>+EXPECT "Yes" quota_object_list_field "/test_dir" 8</div><div class='add'>+</div><div class='add'>+# Check if soft-limit exceeded</div><div class='add'>+EXPECT "Yes" quota_object_list_field "/test_dir" 7</div><div class='add'>+</div><div class='add'>+# Creation of 11th file should throw out an error</div><div class='add'>+TEST ! touch $M0/test_dir/test11.txt</div><div class='add'>+</div><div class='add'>+#-------------------------------------------------------</div><div class='add'>+# remove  quota limits on the directory and</div><div class='add'>+# verify if the limit show 'N/A' and displayes only the usage</div><div class='add'>+#------------------------------------------------------</div><div class='add'>+TEST $CLI volume quota $V0 remove-objects /test_dir</div><div class='add'>+EXPECT "N/A" quota_object_list_field "/test_dir" 2</div><div class='add'>+EXPECT "9" quota_object_list_field "/test_dir" 4</div><div class='add'>+</div><div class='add'>+TEST $CLI volume quota $V0 remove /test_dir</div><div class='add'>+EXPECT "N/A" quota_list_field "/test_dir" 2</div><div class='add'>+EXPECT "9.0MB" quotausage "/test_dir" 4</div><div class='add'>+</div><div class='add'>+# Set back the limits</div><div class='add'>+TEST $CLI volume quota $V0 limit-objects /test_dir 10</div><div class='add'>+EXPECT "10" quota_object_list_field "/test_dir" 2</div><div class='add'>+</div><div class='add'>+# Remove all files and verify the file count</div><div class='add'>+TEST rm -rf $M0/test_dir/test*</div><div class='add'>+EXPECT_WITHIN $MARKER_UPDATE_TIMEOUT "0" quota_object_list_field "/test_dir" 4</div><div class='add'>+</div><div class='add'>+rm -f $QDD</div><div class='add'>+cleanup;</div><div class='add'>+#G_TESTDEF_TEST_STATUS_NETBSD7=BAD_TEST,BUG=1332021</div><div class='head'>diff --git a/tests/basic/ios-dump.t b/tests/basic/ios-dump.t<br/>new file mode 100644<br/>index 00000000000..0cfbdc6ae7c<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/ios-dump.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/ios-dump.t</a></div><div class='hunk'>@@ -0,0 +1,43 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../include.rc</div><div class='add'>+. $(dirname $0)/../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+function check_brick_inter_stats() {</div><div class='add'>+  local counter="$1"</div><div class='add'>+  local inter_cnt=""</div><div class='add'>+</div><div class='add'>+  inter_cnt=$(grep -h "\".*inter.*$counter\"" \</div><div class='add'>+    /var/lib/glusterd/stats/glusterfsd*.dump 2&gt;/dev/null |</div><div class='add'>+    grep -v '\"0.0000\"' | wc -l)</div><div class='add'>+  if (( $inter_cnt == 3 )); then</div><div class='add'>+    echo "Y"</div><div class='add'>+  else</div><div class='add'>+    echo "N"</div><div class='add'>+  fi</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 replica 3 $H0:$B0/${V0}{0,1,2}</div><div class='add'>+TEST $CLI volume set $V0 diagnostics.stats-dump-interval 5</div><div class='add'>+TEST $CLI volume set $V0 diagnostics.count-fop-hits on</div><div class='add'>+TEST $CLI volume set $V0 diagnostics.latency-measurement on</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+TEST glusterfs --volfile-id=/$V0 --volfile-server=$H0 $M0 --attribute-timeout=0 --entry-timeout=0</div><div class='add'>+</div><div class='add'>+# Generate some FOPs</div><div class='add'>+cd $M0</div><div class='add'>+for i in {1..10}; do</div><div class='add'>+  mkdir a</div><div class='add'>+  cd a</div><div class='add'>+  for g in {1..10}; do</div><div class='add'>+    dd if=/dev/zero of=test$g bs=128k count=1</div><div class='add'>+  done</div><div class='add'>+done</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN 30 "Y" check_brick_inter_stats fop.weighted_latency_ave_usec</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/basic/jbr/jbr-volgen.t b/tests/basic/jbr/jbr-volgen.t<br/>new file mode 100644<br/>index 00000000000..f368710c158<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/jbr/jbr-volgen.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/jbr/jbr-volgen.t</a></div><div class='hunk'>@@ -0,0 +1,39 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+volfiles=${GLUSTERD_WORKDIR}/vols/${V0}/</div><div class='add'>+check_brick_volfiles () {</div><div class='add'>+        for vf in ${volfiles}${V0}.$(hostname).*.vol; do</div><div class='add'>+                grep -qs experimental/jbr $vf || return</div><div class='add'>+                # At least for now, nothing else would put a client translator</div><div class='add'>+                # in a brick volfile.</div><div class='add'>+                grep -qs protocol/client $vf || return</div><div class='add'>+        done</div><div class='add'>+        echo "OK"</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 replica 2 $H0:$B0/${V0}{1,2}</div><div class='add'>+TEST $CLI volume set $V0 cluster.jbr on</div><div class='add'>+</div><div class='add'>+# Check that the client volfile got modified properly.</div><div class='add'>+TEST grep -qs experimental/jbrc ${volfiles}${V0}.tcp-fuse.vol</div><div class='add'>+</div><div class='add'>+# Check that the brick volfiles got modified as well.</div><div class='add'>+EXPECT "OK" check_brick_volfiles</div><div class='add'>+</div><div class='add'>+# Put things back and make sure the "undo" worked.</div><div class='add'>+TEST $CLI volume set $V0 cluster.jbr off</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+TEST $GFS -s $H0 --volfile-id $V0 $M0</div><div class='add'>+echo hello &gt; $M0/probe</div><div class='add'>+EXPECT hello cat ${B0}/${V0}1/probe</div><div class='add'>+EXPECT hello cat ${B0}/${V0}2/probe</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='add'>+#G_TESTDEF_TEST_STATUS_CENTOS6=KNOWN_ISSUE,BUG=1385758</div><div class='add'>+#G_TESTDEF_TEST_STATUS_NETBSD7=KNOWN_ISSUE,BUG=1385758</div><div class='head'>diff --git a/tests/basic/jbr/jbr.t b/tests/basic/jbr/jbr.t<br/>new file mode 100755<br/>index 00000000000..605344b5a7e<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/jbr/jbr.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/jbr/jbr.t</a></div><div class='hunk'>@@ -0,0 +1,38 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+. $(dirname $0)/../../cluster.rc</div><div class='add'>+. $(dirname $0)/../../snapshot.rc</div><div class='add'>+. $(dirname $0)/../../fdl.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST verify_lvm_version;</div><div class='add'>+#Create cluster with 3 nodes</div><div class='add'>+TEST launch_cluster 3;</div><div class='add'>+TEST setup_lvm 3</div><div class='add'>+</div><div class='add'>+TEST $CLI_1 peer probe $H2;</div><div class='add'>+TEST $CLI_1 peer probe $H3;</div><div class='add'>+EXPECT_WITHIN $PROBE_TIMEOUT 2 peer_count;</div><div class='add'>+</div><div class='add'>+TEST $CLI_1 volume create $V0 replica 3 $H1:$L1 $H2:$L2 $H3:$L3</div><div class='add'>+TEST $CLI_1 volume set $V0 cluster.jbr on</div><div class='add'>+TEST $CLI_1 volume set $V0 cluster.jbr.quorum-percent 100</div><div class='add'>+TEST $CLI_1 volume set $V0 features.fdl on</div><div class='add'>+#TEST $CLI_1 volume set $V0 diagnostics.brick-log-level DEBUG</div><div class='add'>+TEST $CLI_1 volume start $V0</div><div class='add'>+</div><div class='add'>+TEST glusterfs --volfile-id=$V0 --volfile-server=$H1 --entry-timeout=0 $M0;</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "3" jbrc_child_up_status $V0 0</div><div class='add'>+</div><div class='add'>+echo "file" &gt; $M0/file1</div><div class='add'>+TEST stat $L1/file1</div><div class='add'>+TEST stat $L2/file1</div><div class='add'>+TEST stat $L3/file1</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+#G_TESTDEF_TEST_STATUS_CENTOS6=KNOWN_ISSUE,BUG=1385758</div><div class='add'>+#G_TESTDEF_TEST_STATUS_NETBSD7=KNOWN_ISSUE,BUG=1385758</div><div class='head'>diff --git a/tests/basic/logchecks-messages.h b/tests/basic/logchecks-messages.h<br/>new file mode 100644<br/>index 00000000000..bf364848ec7<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/logchecks-messages.h?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/logchecks-messages.h</a></div><div class='hunk'>@@ -0,0 +1,105 @@</div><div class='add'>+/*</div><div class='add'>+ Copyright (c) 2013 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+ This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+ This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+ General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+ later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+ cases as published by the Free Software Foundation.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+#ifndef _LOGCHECKS_MESSAGES_H_</div><div class='add'>+#define _LOGCHECKS_MESSAGES_H_</div><div class='add'>+</div><div class='add'>+#include &lt;glusterfs/glfs-message-id.h&gt;</div><div class='add'>+</div><div class='add'>+/* NOTE: Rules for message additions</div><div class='add'>+ * 1) Each instance of a message is _better_ left with a unique message ID, even</div><div class='add'>+ *    if the message format is the same. Reasoning is that, if the message</div><div class='add'>+ *    format needs to change in one instance, the other instances are not</div><div class='add'>+ *    impacted or the new change does not change the ID of the instance being</div><div class='add'>+ *    modified.</div><div class='add'>+ * 2) Addition of a message,</div><div class='add'>+ *       - Should increment the GLFS_NUM_MESSAGES</div><div class='add'>+ *       - Append to the list of messages defined, towards the end</div><div class='add'>+ *       - Retain macro naming as glfs_msg_X (for redability across developers)</div><div class='add'>+ * NOTE: Rules for message format modifications</div><div class='add'>+ * 3) Check acorss the code if the message ID macro in question is reused</div><div class='add'>+ *    anywhere. If reused then then the modifications should ensure correctness</div><div class='add'>+ *    everywhere, or needs a new message ID as (1) above was not adhered to. If</div><div class='add'>+ *    not used anywhere, proceed with the required modification.</div><div class='add'>+ * NOTE: Rules for message deletion</div><div class='add'>+ * 4) Check (3) and if used anywhere else, then cannot be deleted. If not used</div><div class='add'>+ *    anywhere, then can be deleted, but will leave a hole by design, as</div><div class='add'>+ *    addition rules specify modification to the end of the list and not filling</div><div class='add'>+ *    holes.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+#define GLFS_COMP_BASE 1000</div><div class='add'>+#define GLFS_NUM_MESSAGES 19</div><div class='add'>+#define GLFS_MSGID_END (GLFS_COMP_BASE + GLFS_NUM_MESSAGES + 1)</div><div class='add'>+/* Messaged with message IDs */</div><div class='add'>+#define glfs_msg_start_x GLFS_COMP_BASE, "Invalid: Start of messages"</div><div class='add'>+/*------------*/</div><div class='add'>+#define logchecks_msg_1                                                        \</div><div class='add'>+    (GLFS_COMP_BASE + 1),                                                      \</div><div class='add'>+        "Informational: Testing logging"                                       \</div><div class='add'>+        " in gluster"</div><div class='add'>+#define logchecks_msg_2                                                        \</div><div class='add'>+    (GLFS_COMP_BASE + 2),                                                      \</div><div class='add'>+        "Informational: Format testing:"                                       \</div><div class='add'>+        " %d:%s:%x"</div><div class='add'>+#define logchecks_msg_3                                                        \</div><div class='add'>+    (GLFS_COMP_BASE + 3),                                                      \</div><div class='add'>+        "Critical: Testing logging"                                            \</div><div class='add'>+        " in gluster"</div><div class='add'>+#define logchecks_msg_4                                                        \</div><div class='add'>+    (GLFS_COMP_BASE + 4),                                                      \</div><div class='add'>+        "Critical: Format testing:"                                            \</div><div class='add'>+        " %d:%s:%x"</div><div class='add'>+#define logchecks_msg_5 (GLFS_COMP_BASE + 5), "Critical: Rotated the log"</div><div class='add'>+#define logchecks_msg_6 (GLFS_COMP_BASE + 6), "Critical: Flushed the log"</div><div class='add'>+#define logchecks_msg_7 (GLFS_COMP_BASE + 7), "Informational: gf_msg_callingfn"</div><div class='add'>+#define logchecks_msg_8                                                        \</div><div class='add'>+    (GLFS_COMP_BASE + 8),                                                      \</div><div class='add'>+        "Informational: "                                                      \</div><div class='add'>+        "gf_msg_callingfn: Format testing: %d:%s:%x"</div><div class='add'>+#define logchecks_msg_9 (GLFS_COMP_BASE + 9), "Critical: gf_msg_callingfn"</div><div class='add'>+#define logchecks_msg_10                                                       \</div><div class='add'>+    (GLFS_COMP_BASE + 10),                                                     \</div><div class='add'>+        "Critical: "                                                           \</div><div class='add'>+        "gf_msg_callingfn: Format testing: %d:%s:%x"</div><div class='add'>+#define logchecks_msg_11 (GLFS_COMP_BASE + 11), "=========================="</div><div class='add'>+#define logchecks_msg_12                                                       \</div><div class='add'>+    (GLFS_COMP_BASE + 12),                                                     \</div><div class='add'>+        "Test 1: Only stderr and"                                              \</div><div class='add'>+        " partial syslog"</div><div class='add'>+#define logchecks_msg_13                                                       \</div><div class='add'>+    (GLFS_COMP_BASE + 13),                                                     \</div><div class='add'>+        "Test 2: Only checklog and"                                            \</div><div class='add'>+        " partial syslog"</div><div class='add'>+#define logchecks_msg_14                                                       \</div><div class='add'>+    (GLFS_COMP_BASE + 14),                                                     \</div><div class='add'>+        "Test 5: Changing to"                                                  \</div><div class='add'>+        " traditional format"</div><div class='add'>+#define logchecks_msg_15                                                       \</div><div class='add'>+    (GLFS_COMP_BASE + 15),                                                     \</div><div class='add'>+        "Test 6: Changing log level"                                           \</div><div class='add'>+        " to critical and above"</div><div class='add'>+#define logchecks_msg_16 (GLFS_COMP_BASE + 16), "Test 7: Only to syslog"</div><div class='add'>+#define logchecks_msg_17                                                       \</div><div class='add'>+    (GLFS_COMP_BASE + 17),                                                     \</div><div class='add'>+        "Test 8: Only to syslog,"                                              \</div><div class='add'>+        " traditional format"</div><div class='add'>+#define logchecks_msg_18                                                       \</div><div class='add'>+    (GLFS_COMP_BASE + 18),                                                     \</div><div class='add'>+        "Test 9: Only to syslog,"                                              \</div><div class='add'>+        " only critical and above"</div><div class='add'>+#define logchecks_msg_19                                                       \</div><div class='add'>+    (GLFS_COMP_BASE + 19),                                                     \</div><div class='add'>+        "Pre init message, not to be"                                          \</div><div class='add'>+        " seen in logs"</div><div class='add'>+/*------------*/</div><div class='add'>+#define glfs_msg_end_x GLFS_MSGID_END, "Invalid: End of messages"</div><div class='add'>+</div><div class='add'>+#endif /* !_component_MESSAGES_H_ */
\ No newline at end of file</div><div class='head'>diff --git a/tests/basic/logchecks.c b/tests/basic/logchecks.c<br/>new file mode 100644<br/>index 00000000000..df0be28ace0<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/logchecks.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/logchecks.c</a></div><div class='hunk'>@@ -0,0 +1,214 @@</div><div class='add'>+/*</div><div class='add'>+ * Copyright (c) 2013 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+ * This file is part of GlusterFS.</div><div class='add'>+ *</div><div class='add'>+ * This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+ * General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+ * later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+ * cases as published by the Free Software Foundation.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+#include &lt;stdio.h&gt;</div><div class='add'>+#include &lt;unistd.h&gt;</div><div class='add'>+</div><div class='add'>+#include &lt;glusterfs/glusterfs.h&gt;</div><div class='add'>+#include &lt;glusterfs/globals.h&gt;</div><div class='add'>+#include &lt;glusterfs/logging.h&gt;</div><div class='add'>+</div><div class='add'>+#include "logchecks-messages.h"</div><div class='add'>+#include "../../libglusterfs/src/logging.h"</div><div class='add'>+</div><div class='add'>+glusterfs_ctx_t *ctx = NULL;</div><div class='add'>+</div><div class='add'>+#define TEST_FILENAME "/tmp/logchecks.log"</div><div class='add'>+#define GF_LOG_CONTROL_FILE "/etc/glusterfs/logger.conf"</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+go_log_vargs(gf_loglevel_t level, const char *fmt, ...)</div><div class='add'>+{</div><div class='add'>+    va_list ap;</div><div class='add'>+</div><div class='add'>+    va_start(ap, fmt);</div><div class='add'>+    gf_msg_vplain(level, fmt, ap);</div><div class='add'>+    va_end(ap);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+go_log(void)</div><div class='add'>+{</div><div class='add'>+    /*** gf_msg ***/</div><div class='add'>+    gf_msg("logchecks", GF_LOG_INFO, 0, logchecks_msg_1);</div><div class='add'>+    gf_msg("logchecks", GF_LOG_INFO, 22, logchecks_msg_2, 42, "Forty-Two", 42);</div><div class='add'>+    /* change criticality */</div><div class='add'>+    gf_msg("logchecks", GF_LOG_CRITICAL, 0, logchecks_msg_3);</div><div class='add'>+    gf_msg("logchecks", GF_LOG_CRITICAL, 22, logchecks_msg_4, 42, "Forty-Two",</div><div class='add'>+           42);</div><div class='add'>+</div><div class='add'>+    /*** msg_nomem ***/</div><div class='add'>+    gf_msg_nomem("logchecks", GF_LOG_ALERT, 555);</div><div class='add'>+    gf_msg_nomem("logchecks", GF_LOG_INFO, 555);</div><div class='add'>+</div><div class='add'>+    /*** msg_plain ***/</div><div class='add'>+    gf_msg_plain(GF_LOG_INFO,</div><div class='add'>+                 "Informational: gf_msg_plain with"</div><div class='add'>+                 " args %d:%s:%x",</div><div class='add'>+                 42, "Forty-Two", 42);</div><div class='add'>+    gf_msg_plain(GF_LOG_ALERT,</div><div class='add'>+                 "Alert: gf_msg_plain with"</div><div class='add'>+                 " args %d:%s:%x",</div><div class='add'>+                 42, "Forty-Two", 42);</div><div class='add'>+</div><div class='add'>+    /*** msg_vplain ***/</div><div class='add'>+    go_log_vargs(GF_LOG_INFO, "Informational: gf_msg_vplain: No args!!!");</div><div class='add'>+    go_log_vargs(GF_LOG_INFO,</div><div class='add'>+                 "Informational: gf_msg_vplain: Some"</div><div class='add'>+                 " args %d:%s:%x",</div><div class='add'>+                 42, "Forty-Two", 42);</div><div class='add'>+    go_log_vargs(GF_LOG_INFO, "Critical: gf_msg_vplain: No args!!!");</div><div class='add'>+    go_log_vargs(GF_LOG_INFO,</div><div class='add'>+                 "Critical: gf_msg_vplain: Some"</div><div class='add'>+                 " args %d:%s:%x",</div><div class='add'>+                 42, "Forty-Two", 42);</div><div class='add'>+</div><div class='add'>+    /*** msg_plain_nomem ***/</div><div class='add'>+    gf_msg_plain_nomem(GF_LOG_INFO, "Informational: gf_msg_plain_nomem");</div><div class='add'>+    gf_msg_plain_nomem(GF_LOG_ALERT, "Alert: gf_msg_plain_nomem");</div><div class='add'>+</div><div class='add'>+    /*** msg_backtrace_nomem ***/</div><div class='add'>+    // TODO: Need to create a stack depth and then call</div><div class='add'>+    gf_msg_backtrace_nomem(GF_LOG_INFO, 5);</div><div class='add'>+    gf_msg_backtrace_nomem(GF_LOG_ALERT, 5);</div><div class='add'>+</div><div class='add'>+    /*** gf_msg_callingfn ***/</div><div class='add'>+    // TODO: Need to create a stack depth and then call</div><div class='add'>+    gf_msg_callingfn("logchecks", GF_LOG_INFO, 0, logchecks_msg_7);</div><div class='add'>+    gf_msg_callingfn("logchecks", GF_LOG_INFO, 0, logchecks_msg_8, 42,</div><div class='add'>+                     "Forty-Two", 42);</div><div class='add'>+    gf_msg_callingfn("logchecks", GF_LOG_CRITICAL, 0, logchecks_msg_9);</div><div class='add'>+    gf_msg_callingfn("logchecks", GF_LOG_CRITICAL, 0, logchecks_msg_10, 42,</div><div class='add'>+                     "Forty-Two", 42);</div><div class='add'>+</div><div class='add'>+    /*** gf_msg_debug ***/</div><div class='add'>+    gf_msg_debug("logchecks", 0, "Debug: Hello World!!!");</div><div class='add'>+    gf_msg_debug("logchecks", 22, "Debug: With args %d:%s:%x", 42, "Forty-Two",</div><div class='add'>+                 42);</div><div class='add'>+</div><div class='add'>+    /*** gf_msg_trace ***/</div><div class='add'>+    gf_msg_trace("logchecks", 0, "Trace: Hello World!!!");</div><div class='add'>+    gf_msg_trace("logchecks", 22, "Trace: With args %d:%s:%x", 42, "Forty-Two",</div><div class='add'>+                 42);</div><div class='add'>+</div><div class='add'>+    /*** gf_msg_backtrace ***/</div><div class='add'>+    // TODO: Test with lower callstr values to check truncation</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+main(int argc, char *argv[])</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    unlink(GF_LOG_CONTROL_FILE);</div><div class='add'>+    creat(GF_LOG_CONTROL_FILE, O_RDONLY);</div><div class='add'>+    ctx = glusterfs_ctx_new();</div><div class='add'>+    if (!ctx)</div><div class='add'>+        return -1;</div><div class='add'>+</div><div class='add'>+    ret = glusterfs_globals_init(ctx);</div><div class='add'>+    if (ret) {</div><div class='add'>+        printf("Error from glusterfs_globals_init [%s]\n", strerror(errno));</div><div class='add'>+        return ret;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Pre init test, message should not be printed */</div><div class='add'>+    gf_msg("logchecks", GF_LOG_ALERT, 0, logchecks_msg_19);</div><div class='add'>+</div><div class='add'>+    THIS-&gt;ctx = ctx;</div><div class='add'>+</div><div class='add'>+    /* TEST 1: messages before initializing the log, goes to stderr</div><div class='add'>+     * and syslog based on criticality */</div><div class='add'>+    gf_msg("logchecks", GF_LOG_ALERT, 0, logchecks_msg_11);</div><div class='add'>+    gf_msg("logchecks", GF_LOG_ALERT, 0, logchecks_msg_12);</div><div class='add'>+    go_log();</div><div class='add'>+    gf_msg("logchecks", GF_LOG_ALERT, 0, logchecks_msg_11);</div><div class='add'>+</div><div class='add'>+    /* TEST 2: messages post initialization, goes to glusterlog and</div><div class='add'>+     * syslog based on severity */</div><div class='add'>+    ret = gf_log_init(ctx, TEST_FILENAME, "logchecks");</div><div class='add'>+    if (ret != 0) {</div><div class='add'>+        printf("Error from gf_log_init [%s]\n", strerror(errno));</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+    gf_msg("logchecks", GF_LOG_ALERT, 0, logchecks_msg_11);</div><div class='add'>+    gf_msg("logchecks", GF_LOG_ALERT, 0, logchecks_msg_13);</div><div class='add'>+    go_log();</div><div class='add'>+    gf_msg("logchecks", GF_LOG_ALERT, 0, logchecks_msg_11);</div><div class='add'>+</div><div class='add'>+    /* TEST 3: Test rotation */</div><div class='add'>+    gf_msg("logchecks", GF_LOG_ALERT, 0, logchecks_msg_11);</div><div class='add'>+    gf_log_logrotate(0);</div><div class='add'>+    gf_msg("logchecks", GF_LOG_CRITICAL, 0, logchecks_msg_5);</div><div class='add'>+    gf_msg("logchecks", GF_LOG_ALERT, 0, logchecks_msg_11);</div><div class='add'>+</div><div class='add'>+    /* TEST 4: Check flush, nothing noticeable should occur :) */</div><div class='add'>+    gf_msg("logchecks", GF_LOG_ALERT, 0, logchecks_msg_11);</div><div class='add'>+    gf_log_flush();</div><div class='add'>+    gf_msg("logchecks", GF_LOG_CRITICAL, 0, logchecks_msg_6);</div><div class='add'>+    gf_msg("logchecks", GF_LOG_ALERT, 0, logchecks_msg_11);</div><div class='add'>+</div><div class='add'>+    /* TEST 5: Change format */</div><div class='add'>+    gf_msg("logchecks", GF_LOG_ALERT, 0, logchecks_msg_11);</div><div class='add'>+    gf_log_set_logformat(gf_logformat_traditional);</div><div class='add'>+    gf_msg("logchecks", GF_LOG_ALERT, 0, logchecks_msg_14);</div><div class='add'>+    go_log();</div><div class='add'>+    gf_msg("logchecks", GF_LOG_ALERT, 0, logchecks_msg_11);</div><div class='add'>+</div><div class='add'>+    /* TEST 6: Change level */</div><div class='add'>+    gf_msg("logchecks", GF_LOG_ALERT, 0, logchecks_msg_11);</div><div class='add'>+    gf_log_set_loglevel(ctx, GF_LOG_CRITICAL);</div><div class='add'>+    gf_msg("logchecks", GF_LOG_ALERT, 0, logchecks_msg_15);</div><div class='add'>+    go_log();</div><div class='add'>+    gf_msg("logchecks", GF_LOG_ALERT, 0, logchecks_msg_11);</div><div class='add'>+</div><div class='add'>+    /* Reset to run with syslog */</div><div class='add'>+    gf_log_set_logformat(gf_logformat_withmsgid);</div><div class='add'>+    gf_log_set_loglevel(ctx, GF_LOG_INFO);</div><div class='add'>+</div><div class='add'>+    /* Run tests with logger changed to syslog */</div><div class='add'>+    /* TEST 7: No more gluster logs */</div><div class='add'>+    gf_msg("logchecks", GF_LOG_ALERT, 0, logchecks_msg_11);</div><div class='add'>+    gf_log_set_logger(gf_logger_syslog);</div><div class='add'>+    gf_msg("logchecks", GF_LOG_ALERT, 0, logchecks_msg_16);</div><div class='add'>+    go_log();</div><div class='add'>+    gf_msg("logchecks", GF_LOG_ALERT, 0, logchecks_msg_11);</div><div class='add'>+</div><div class='add'>+    /* TEST 8: Change format */</div><div class='add'>+    gf_msg("logchecks", GF_LOG_ALERT, 0, logchecks_msg_11);</div><div class='add'>+    gf_log_set_logformat(gf_logformat_traditional);</div><div class='add'>+    gf_msg("logchecks", GF_LOG_ALERT, 0, logchecks_msg_14);</div><div class='add'>+    go_log();</div><div class='add'>+    gf_msg("logchecks", GF_LOG_ALERT, 0, logchecks_msg_11);</div><div class='add'>+</div><div class='add'>+    /* TEST 9: Change level */</div><div class='add'>+    gf_msg("logchecks", GF_LOG_ALERT, 0, logchecks_msg_11);</div><div class='add'>+    gf_log_set_loglevel(ctx, GF_LOG_CRITICAL);</div><div class='add'>+    gf_msg("logchecks", GF_LOG_ALERT, 0, logchecks_msg_15);</div><div class='add'>+    go_log();</div><div class='add'>+    gf_msg("logchecks", GF_LOG_ALERT, 0, logchecks_msg_11);</div><div class='add'>+</div><div class='add'>+    // TODO: signal crash prints, but not yet feasible here</div><div class='add'>+    // TODO: Graph printing</div><div class='add'>+    // TODO: Multi threaded logging</div><div class='add'>+</div><div class='add'>+    /* Close out the logging */</div><div class='add'>+    gf_log_fini(ctx);</div><div class='add'>+    gf_log_globals_fini();</div><div class='add'>+</div><div class='add'>+    unlink(GF_LOG_CONTROL_FILE);</div><div class='add'>+    unlink(TEST_FILENAME);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='head'>diff --git a/tests/basic/md-cache/bug-1317785.t b/tests/basic/md-cache/bug-1317785.t<br/>new file mode 100644<br/>index 00000000000..5076e3612ac<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/md-cache/bug-1317785.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/md-cache/bug-1317785.t</a></div><div class='hunk'>@@ -0,0 +1,34 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/$V0</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+TEST $CLI volume set $V0 cache-swift-metadata on</div><div class='add'>+EXPECT 'on' volinfo_field $V0 'performance.cache-swift-metadata'</div><div class='add'>+</div><div class='add'>+TEST $CLI volume set $V0 cache-swift-metadata off</div><div class='add'>+EXPECT 'off' volinfo_field $V0 'performance.cache-swift-metadata'</div><div class='add'>+</div><div class='add'>+TEST $CLI volume set $V0 performance.cache-capability-xattrs off</div><div class='add'>+EXPECT 'off' volinfo_field $V0 'performance.cache-capability-xattrs'</div><div class='add'>+</div><div class='add'>+TEST $CLI volume set $V0 performance.cache-capability-xattrs on</div><div class='add'>+EXPECT 'on' volinfo_field $V0 'performance.cache-capability-xattrs'</div><div class='add'>+</div><div class='add'>+TEST $CLI volume set $V0 performance.cache-ima-xattrs off</div><div class='add'>+EXPECT 'off' volinfo_field $V0 'performance.cache-ima-xattrs'</div><div class='add'>+</div><div class='add'>+TEST $CLI volume set $V0 performance.cache-ima-xattrs on</div><div class='add'>+EXPECT 'on' volinfo_field $V0 'performance.cache-ima-xattrs'</div><div class='add'>+</div><div class='add'>+TEST $CLI volume stop $V0</div><div class='add'>+TEST $CLI volume delete $V0</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/basic/md-cache/bug-1418249.t b/tests/basic/md-cache/bug-1418249.t<br/>new file mode 100755<br/>index 00000000000..85a4f58ec10<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/md-cache/bug-1418249.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/md-cache/bug-1418249.t</a></div><div class='hunk'>@@ -0,0 +1,20 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/$V0</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+TEST $CLI volume set $V0 group metadata-cache</div><div class='add'>+EXPECT 'on' volinfo_field $V0 'performance.cache-invalidation'</div><div class='add'>+EXPECT '600' volinfo_field $V0 'performance.md-cache-timeout'</div><div class='add'>+EXPECT 'on' volinfo_field $V0 'performance.stat-prefetch'</div><div class='add'>+EXPECT '600' volinfo_field $V0 'features.cache-invalidation-timeout'</div><div class='add'>+EXPECT 'on' volinfo_field $V0 'features.cache-invalidation'</div><div class='add'>+EXPECT '200000' volinfo_field $V0  'network.inode-lru-limit'</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/basic/meta.t b/tests/basic/meta.t<br/>new file mode 100755<br/>index 00000000000..0bac3c6797d<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/meta.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/meta.t</a></div><div class='hunk'>@@ -0,0 +1,45 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../include.rc</div><div class='add'>+. $(dirname $0)/../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume info;</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 replica 3 $H0:$B0/${V0}{1..9};</div><div class='add'>+</div><div class='add'>+EXPECT "$V0" volinfo_field $V0 'Volume Name';</div><div class='add'>+EXPECT 'Created' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+EXPECT 'Started' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+TEST $GFS -s $H0 --volfile-id $V0 $M0;</div><div class='add'>+</div><div class='add'>+# verify json validity</div><div class='add'>+</div><div class='add'>+TEST json_verify &lt; $M0/.meta/frames;</div><div class='add'>+</div><div class='add'>+TEST json_verify &lt; $M0/.meta/cmdline;</div><div class='add'>+</div><div class='add'>+TEST json_verify &lt; $M0/.meta/version;</div><div class='add'>+</div><div class='add'>+# default log level (INFO) is 7</div><div class='add'>+TEST grep -q 7 $M0/.meta/logging/loglevel;</div><div class='add'>+</div><div class='add'>+# check for attribute_timeout exposed through state dump</div><div class='add'>+TEST grep -q attribute_timeout $M0/.meta/master/private;</div><div class='add'>+</div><div class='add'>+# check for mount point specified as an option</div><div class='add'>+TEST grep -q $M0 $M0/.meta/master/options/mountpoint;</div><div class='add'>+</div><div class='add'>+TEST $CLI volume stop $V0;</div><div class='add'>+EXPECT 'Stopped' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+TEST $CLI volume delete $V0;</div><div class='add'>+TEST ! $CLI volume info $V0;</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/basic/metadisp/fsyncdir.c b/tests/basic/metadisp/fsyncdir.c<br/>new file mode 100644<br/>index 00000000000..62b532b9ce4<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/metadisp/fsyncdir.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/metadisp/fsyncdir.c</a></div><div class='hunk'>@@ -0,0 +1,29 @@</div><div class='add'>+#include &lt;stdio.h&gt;</div><div class='add'>+#include &lt;stdlib.h&gt;</div><div class='add'>+#include &lt;unistd.h&gt;</div><div class='add'>+</div><div class='add'>+#include &lt;fcntl.h&gt;</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+main(int argc, char **argv)</div><div class='add'>+{</div><div class='add'>+    int pfd;</div><div class='add'>+</div><div class='add'>+    pfd = open(argv[1], O_RDONLY | O_DIRECTORY);</div><div class='add'>+    if (pfd == (-1)) {</div><div class='add'>+        perror("open");</div><div class='add'>+        return EXIT_FAILURE;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (rename(argv[2], argv[3]) == (-1)) {</div><div class='add'>+        perror("rename");</div><div class='add'>+        return EXIT_FAILURE;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (fsync(pfd) == (-1)) {</div><div class='add'>+        perror("fsync");</div><div class='add'>+        return EXIT_FAILURE;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return EXIT_SUCCESS;</div><div class='add'>+}</div><div class='head'>diff --git a/tests/basic/metadisp/ftruncate.c b/tests/basic/metadisp/ftruncate.c<br/>new file mode 100644<br/>index 00000000000..c9185212c31<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/metadisp/ftruncate.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/metadisp/ftruncate.c</a></div><div class='hunk'>@@ -0,0 +1,34 @@</div><div class='add'>+#include &lt;stdio.h&gt;</div><div class='add'>+#include &lt;stdlib.h&gt;</div><div class='add'>+#include &lt;unistd.h&gt;</div><div class='add'>+</div><div class='add'>+#include &lt;fcntl.h&gt;</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+main(int argc, char **argv)</div><div class='add'>+{</div><div class='add'>+    int pfd;</div><div class='add'>+</div><div class='add'>+    pfd = open(argv[1], O_RDWR);</div><div class='add'>+    if (pfd == (-1)) {</div><div class='add'>+        perror("open");</div><div class='add'>+        return EXIT_FAILURE;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (ftruncate(pfd, 0) == (-1)) {</div><div class='add'>+        perror("ftruncate");</div><div class='add'>+        return EXIT_FAILURE;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (write(pfd, "hello", 5) == (-1)) {</div><div class='add'>+        perror("write");</div><div class='add'>+        return EXIT_FAILURE;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (fsync(pfd) == (-1)) {</div><div class='add'>+        perror("fsync");</div><div class='add'>+        return EXIT_FAILURE;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return EXIT_SUCCESS;</div><div class='add'>+}</div><div class='head'>diff --git a/tests/basic/metadisp/fxattr.c b/tests/basic/metadisp/fxattr.c<br/>new file mode 100644<br/>index 00000000000..e552057778a<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/metadisp/fxattr.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/metadisp/fxattr.c</a></div><div class='hunk'>@@ -0,0 +1,107 @@</div><div class='add'>+#include &lt;stdio.h&gt;</div><div class='add'>+#include &lt;stdlib.h&gt;</div><div class='add'>+#include &lt;unistd.h&gt;</div><div class='add'>+</div><div class='add'>+#include &lt;fcntl.h&gt;</div><div class='add'>+#include &lt;string.h&gt;</div><div class='add'>+#include &lt;sys/types.h&gt;</div><div class='add'>+#include &lt;sys/xattr.h&gt;</div><div class='add'>+</div><div class='add'>+static char MY_XATTR[] = "user.fxtest";</div><div class='add'>+static char *PROGRAM;</div><div class='add'>+#define CONSUME(v)                                                             \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        if (!argc) {                                                           \</div><div class='add'>+            fprintf(stderr, "missing argument\n");                             \</div><div class='add'>+            return EXIT_FAILURE;                                               \</div><div class='add'>+        }                                                                      \</div><div class='add'>+        v = argv[0];                                                           \</div><div class='add'>+        ++argv;                                                                \</div><div class='add'>+        --argc;                                                                \</div><div class='add'>+    } while (0)</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+do_get(int argc, char **argv, int fd)</div><div class='add'>+{</div><div class='add'>+    char *value;</div><div class='add'>+    int ret;</div><div class='add'>+    char buf[1024];</div><div class='add'>+</div><div class='add'>+    CONSUME(value);</div><div class='add'>+</div><div class='add'>+    ret = fgetxattr(fd, MY_XATTR, buf, sizeof(buf));</div><div class='add'>+    if (ret == (-1)) {</div><div class='add'>+        perror("fgetxattr");</div><div class='add'>+        return EXIT_FAILURE;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (strncmp(buf, value, ret) != 0) {</div><div class='add'>+        fprintf(stderr, "data mismatch\n");</div><div class='add'>+        return EXIT_FAILURE;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return EXIT_SUCCESS;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+do_set(int argc, char **argv, int fd)</div><div class='add'>+{</div><div class='add'>+    char *value;</div><div class='add'>+    int ret;</div><div class='add'>+</div><div class='add'>+    CONSUME(value);</div><div class='add'>+</div><div class='add'>+    ret = fsetxattr(fd, MY_XATTR, value, strlen(value), 0);</div><div class='add'>+    if (ret == (-1)) {</div><div class='add'>+        perror("fsetxattr");</div><div class='add'>+        return EXIT_FAILURE;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return EXIT_SUCCESS;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+do_remove(int argc, char **argv, int fd)</div><div class='add'>+{</div><div class='add'>+    int ret;</div><div class='add'>+</div><div class='add'>+    ret = fremovexattr(fd, MY_XATTR);</div><div class='add'>+    if (ret == (-1)) {</div><div class='add'>+        perror("femovexattr");</div><div class='add'>+        return EXIT_FAILURE;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return EXIT_SUCCESS;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+main(int argc, char **argv)</div><div class='add'>+{</div><div class='add'>+    int fd;</div><div class='add'>+    char *path;</div><div class='add'>+    char *cmd;</div><div class='add'>+</div><div class='add'>+    CONSUME(PROGRAM);</div><div class='add'>+    CONSUME(path);</div><div class='add'>+    CONSUME(cmd);</div><div class='add'>+</div><div class='add'>+    fd = open(path, O_RDWR);</div><div class='add'>+    if (fd == (-1)) {</div><div class='add'>+        perror("open");</div><div class='add'>+        return EXIT_FAILURE;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (strcmp(cmd, "get") == 0) {</div><div class='add'>+        return do_get(argc, argv, fd);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (strcmp(cmd, "set") == 0) {</div><div class='add'>+        return do_set(argc, argv, fd);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (strcmp(cmd, "remove") == 0) {</div><div class='add'>+        return do_remove(argc, argv, fd);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return EXIT_SUCCESS;</div><div class='add'>+}</div><div class='head'>diff --git a/tests/basic/metadisp/gfs-fsetxattr.c b/tests/basic/metadisp/gfs-fsetxattr.c<br/>new file mode 100644<br/>index 00000000000..63578bc528f<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/metadisp/gfs-fsetxattr.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/metadisp/gfs-fsetxattr.c</a></div><div class='hunk'>@@ -0,0 +1,141 @@</div><div class='add'>+#include &lt;glusterfs/api/glfs.h&gt;</div><div class='add'>+#include &lt;glusterfs/api/glfs-handles.h&gt;</div><div class='add'>+#include &lt;errno.h&gt;</div><div class='add'>+#include &lt;stdio.h&gt;</div><div class='add'>+#include &lt;stdlib.h&gt;</div><div class='add'>+#include &lt;string.h&gt;</div><div class='add'>+</div><div class='add'>+int gfapi = 1;</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+main(int argc, char *argv[])</div><div class='add'>+{</div><div class='add'>+    glfs_t *fs = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    int i = 0;</div><div class='add'>+    glfs_fd_t *fd = NULL;</div><div class='add'>+    char *topdir = "topdir", *filename = "file1";</div><div class='add'>+    char *buf = NULL;</div><div class='add'>+    char *logfile = NULL;</div><div class='add'>+    char *hostname = NULL;</div><div class='add'>+    char *basename = NULL;</div><div class='add'>+    char *dir1 = NULL, *dir2 = NULL, *filename1 = NULL, *filename2 = NULL;</div><div class='add'>+    struct stat sb = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    if (argc != 5) {</div><div class='add'>+        fprintf(</div><div class='add'>+            stderr,</div><div class='add'>+            "Expect following args %s &lt;hostname&gt; &lt;Vol&gt; &lt;log file&gt; &lt;basename&gt;\n",</div><div class='add'>+            argv[0]);</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    hostname = argv[1];</div><div class='add'>+    logfile = argv[3];</div><div class='add'>+    basename = argv[4];</div><div class='add'>+</div><div class='add'>+    fs = glfs_new(argv[2]);</div><div class='add'>+    if (!fs) {</div><div class='add'>+        fprintf(stderr, "glfs_new: returned NULL (%s)\n", strerror(errno));</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = glfs_set_volfile_server(fs, "tcp", hostname, 24007);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(stderr, "glfs_set_volfile_server failed ret:%d (%s)\n", ret,</div><div class='add'>+                strerror(errno));</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = glfs_set_logging(fs, logfile, 7);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(stderr, "glfs_set_logging failed with ret: %d (%s)\n", ret,</div><div class='add'>+                strerror(errno));</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = glfs_init(fs);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(stderr, "glfs_init failed with ret: %d (%s)\n", ret,</div><div class='add'>+                strerror(errno));</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = asprintf(&amp;dir1, "%s-dir", basename);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(stderr, "cannot construct filename (%s)", strerror(errno));</div><div class='add'>+        return ret;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = glfs_mkdir(fs, dir1, 0755);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(stderr, "mkdir(%s): %s\n", dir1, strerror(errno));</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    fd = glfs_opendir(fs, dir1);</div><div class='add'>+    if (!fd) {</div><div class='add'>+        fprintf(stderr, "/: %s\n", strerror(errno));</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = glfs_fsetxattr(fd, "user.dirfattr", "fsetxattr", 9, 0);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(stderr, "fsetxattr(%s): %d (%s)\n", dir1, ret, strerror(errno));</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = glfs_closedir(fd);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(stderr, "glfs_closedir failed with ret: %d (%s)\n", ret,</div><div class='add'>+                strerror(errno));</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = asprintf(&amp;filename1, "%s-file", basename);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(stderr, "cannot construct filename (%s)", strerror(errno));</div><div class='add'>+        return ret;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = asprintf(&amp;filename2, "%s-file-renamed", basename);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(stderr, "cannot construct filename (%s)", strerror(errno));</div><div class='add'>+        return ret;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    fd = glfs_creat(fs, filename1, O_RDWR, 0644);</div><div class='add'>+    if (!fd) {</div><div class='add'>+        fprintf(stderr, "%s: (%p) %s\n", filename1, fd, strerror(errno));</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = glfs_rename(fs, filename1, filename2);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(stderr, "glfs_rename failed with ret: %d (%s)\n", ret,</div><div class='add'>+                strerror(errno));</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = glfs_lstat(fs, filename2, &amp;sb);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(stderr, "glfs_lstat failed with ret: %d (%s)\n", ret,</div><div class='add'>+                strerror(errno));</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = glfs_fsetxattr(fd, "user.filefattr", "fsetxattr", 9, 0);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(stderr, "fsetxattr(%s): %d (%s)\n", dir1, ret, strerror(errno));</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = glfs_close(fd);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(stderr, "glfs_close failed with ret: %d (%s)\n", ret,</div><div class='add'>+                strerror(errno));</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='head'>diff --git a/tests/basic/metadisp/metadisp.t b/tests/basic/metadisp/metadisp.t<br/>new file mode 100644<br/>index 00000000000..894ffe07226<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/metadisp/metadisp.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/metadisp/metadisp.t</a></div><div class='hunk'>@@ -0,0 +1,316 @@</div><div class='add'>+#!/usr/bin/env bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+# Considering `--enable-metadisp` is an option for `./configure`,</div><div class='add'>+# which is disabled by default, this test will never pass regression.</div><div class='add'>+# But to see the value of this test, run below after configuring</div><div class='add'>+# with above option :</div><div class='add'>+# `prove -vmfe '/bin/bash' tests/basic/metadisp/metadisp.t`</div><div class='add'>+</div><div class='add'>+#G_TESTDEF_TEST_STATUS_CENTOS6=BAD_TEST</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST mkdir -p $B0/b0/{0,1}</div><div class='add'>+</div><div class='add'>+TEST setfattr -n trusted.glusterfs.volume-id -v 0xddab9eece7b64a95b07351a1f748f56f ${B0}/b0/0</div><div class='add'>+TEST setfattr -n trusted.glusterfs.volume-id -v 0xddab9eece7b64a95b07351a1f748f56f ${B0}/b0/1</div><div class='add'>+</div><div class='add'>+TEST $GFS --volfile=$(dirname $0)/metadisp.vol --volfile-id=$V0 $M0;</div><div class='add'>+</div><div class='add'>+NUM_FILES=40</div><div class='add'>+TEST touch $M0/{1..${NUM_FILES}}</div><div class='add'>+</div><div class='add'>+# each drive should get 40 files</div><div class='add'>+TEST [ $(dir -1 $B0/b0/0/ | wc -l) -eq $NUM_FILES ]</div><div class='add'>+TEST [ $(dir -1 $B0/b0/1/ | wc -l) -eq $NUM_FILES ]</div><div class='add'>+</div><div class='add'>+# now write some data to a file</div><div class='add'>+echo "hello" &gt; $M0/3</div><div class='add'>+filename=$$</div><div class='add'>+echo "hello" &gt; /tmp/metadisp-write-${filename}</div><div class='add'>+checksum=$(md5sum /tmp/metadisp-write-${filename} | awk '{print $1}')</div><div class='add'>+TEST [ "$(md5sum $M0/3 | awk '{print $1}')" == "$checksum" ]</div><div class='add'>+</div><div class='add'>+# check that the backend file exists on b1</div><div class='add'>+gfid=$(gf_gfid_xattr_to_str $(gf_get_gfid_xattr $B0/b0/*/3))</div><div class='add'>+TEST [ $(dir -1 $B0/b0/1/$gfid | wc -l) -eq 1 ]</div><div class='add'>+</div><div class='add'>+# check that the backend file matches the frontend</div><div class='add'>+TEST [ "$(md5sum $B0/b0/1/$gfid | awk '{print $1}')" == "$checksum" ]</div><div class='add'>+</div><div class='add'>+# delete the file</div><div class='add'>+TEST rm $M0/3</div><div class='add'>+</div><div class='add'>+# ensure the frontend and backend files are cleaned up</div><div class='add'>+TEST ! -e $M0/3</div><div class='add'>+TEST ! [ stat $B0/b*/*/$gfid ]</div><div class='add'>+</div><div class='add'>+# Test TRUNCATE + WRITE flow</div><div class='add'>+echo "hello" | tee $M0/4</div><div class='add'>+echo "goo"   | tee $M0/4</div><div class='add'>+filename=$$</div><div class='add'>+echo "goo" | tee /tmp/metadisp-truncate-${filename}</div><div class='add'>+checksum=$(md5sum /tmp/metadisp-truncate-${filename} | awk '{print $1}')</div><div class='add'>+TEST [ "$(md5sum $M0/4 | awk '{print $1}')" == "$checksum" ]</div><div class='add'>+</div><div class='add'>+# Test mkdir + rmdir.</div><div class='add'>+TEST mkdir $M0/rmdir_me</div><div class='add'>+nfiles=$(ls -d $B0/b*/*/rmdir_me 2&gt; /dev/null | wc -l)</div><div class='add'>+TEST [ "$nfiles" = "1" ]</div><div class='add'>+TEST rmdir $M0/rmdir_me</div><div class='add'>+nfiles=$(ls -d $B0/b*/*/rmdir_me 2&gt; /dev/null | wc -l)</div><div class='add'>+TEST [ "$nfiles" = "0" ]</div><div class='add'>+</div><div class='add'>+# Test rename.</div><div class='add'>+TEST touch $M0/rename_me</div><div class='add'>+nfiles=$(ls $B0/b*/*/rename_me 2&gt; /dev/null | wc -l)</div><div class='add'>+TEST [ "$nfiles" = "1" ]</div><div class='add'>+nfiles=$(ls $B0/b*/*/such_rename 2&gt; /dev/null | wc -l)</div><div class='add'>+TEST [ "$nfiles" = "0" ]</div><div class='add'>+TEST mv $M0/rename_me $M0/such_rename</div><div class='add'>+nfiles=$(ls $B0/b*/*/rename_me 2&gt; /dev/null | wc -l)</div><div class='add'>+TEST [ "$nfiles" = "0" ]</div><div class='add'>+nfiles=$(ls $B0/b*/*/such_rename 2&gt; /dev/null | wc -l)</div><div class='add'>+TEST [ "$nfiles" = "1" ]</div><div class='add'>+</div><div class='add'>+# Test rename of a file that doesn't exist.</div><div class='add'>+TEST ! mv $M0/does-not-exist $M0/neither-does-this</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+# cleanup all the other files.</div><div class='add'>+TEST rm -v $M0/1 $M0/2 $M0/{4..${NUM_FILES}}</div><div class='add'>+TEST rm $M0/such_rename</div><div class='add'>+TEST [ $(ls /d/backends/b0/0/ | wc -l) -eq 0 ]</div><div class='add'>+TEST [ $(ls /d/backends/b0/1/ | wc -l) -eq 0 ]</div><div class='add'>+</div><div class='add'>+# Test CREATE flow</div><div class='add'>+NUM_FILES=40</div><div class='add'>+TEST touch $M0/{1..${NUM_FILES}}</div><div class='add'>+TEST [ $(ls /d/backends/b0/0/ | wc -l) -eq $NUM_FILES ]</div><div class='add'>+TEST [ $(ls /d/backends/b0/1/ | wc -l) -eq $NUM_FILES ]</div><div class='add'>+</div><div class='add'>+# Test UNLINK flow</div><div class='add'>+# No drives should have any files</div><div class='add'>+TEST rm -v $M0/{1..${NUM_FILES}}</div><div class='add'>+TEST [ $(ls /d/backends/b0/0/ | wc -l) -eq 0 ]</div><div class='add'>+TEST [ $(ls /d/backends/b0/1/ | wc -l) -eq 0 ]</div><div class='add'>+</div><div class='add'>+# Test CREATE + WRITE + READ flow</div><div class='add'>+filename=$$</div><div class='add'>+dd if=/dev/urandom of=/tmp/${filename} bs=1M count=10</div><div class='add'>+checksum=$(md5sum /tmp/${filename} | awk '{print $1}')</div><div class='add'>+TEST cp -v /tmp/${filename} $M0/1</div><div class='add'>+TEST cp -v /tmp/${filename} $M0/2</div><div class='add'>+TEST cp -v /tmp/${filename} $M0/3</div><div class='add'>+TEST cp -v /tmp/${filename} $M0/4</div><div class='add'>+TEST [ "$(md5sum $M0/1 | awk '{print $1}')" == "$checksum" ]</div><div class='add'>+TEST [ "$(md5sum $M0/2 | awk '{print $1}')" == "$checksum" ]</div><div class='add'>+TEST [ "$(md5sum $M0/3 | awk '{print $1}')" == "$checksum" ]</div><div class='add'>+TEST [ "$(md5sum $M0/4 | awk '{print $1}')" == "$checksum" ]</div><div class='add'>+</div><div class='add'>+# Test TRUNCATE + WRITE flow</div><div class='add'>+TEST dd if=/dev/zero of=$M0/1 bs=1M count=20</div><div class='add'>+</div><div class='add'>+# Check that readdir stats the files properly and we get the correct sizes</div><div class='add'>+TEST [ $(find $M0 -size +9M | wc -l) -eq 4 ];</div><div class='add'>+</div><div class='add'>+# Test mkdir + rmdir.</div><div class='add'>+TEST mkdir $M0/rmdir_me</div><div class='add'>+nfiles=$(ls -d $B0/b*/*/rmdir_me 2&gt; /dev/null | wc -l)</div><div class='add'>+TEST [ "$nfiles" = "1" ]</div><div class='add'>+TEST rmdir $M0/rmdir_me</div><div class='add'>+nfiles=$(ls -d $B0/b*/*/rmdir_me 2&gt; /dev/null | wc -l)</div><div class='add'>+TEST [ "$nfiles" = "0" ]</div><div class='add'>+</div><div class='add'>+# Test rename.</div><div class='add'>+# Still flaky, so disabled until it can be debugged.</div><div class='add'>+TEST touch $M0/rename_me</div><div class='add'>+nfiles=$(ls $B0/b*/*/rename_me 2&gt; /dev/null | wc -l)</div><div class='add'>+TEST [ "$nfiles" = "1" ]</div><div class='add'>+nfiles=$(ls $B0/b*/*/such_rename 2&gt; /dev/null | wc -l)</div><div class='add'>+TEST [ "$nfiles" = "0" ]</div><div class='add'>+TEST mv $M0/rename_me $M0/such_rename</div><div class='add'>+nfiles=$(ls $B0/b*/*/rename_me 2&gt; /dev/null | wc -l)</div><div class='add'>+TEST [ "$nfiles" = "0" ]</div><div class='add'>+nfiles=$(ls $B0/b*/*/such_rename 2&gt; /dev/null | wc -l)</div><div class='add'>+TEST [ "$nfiles" = "1" ]</div><div class='add'>+</div><div class='add'>+# Test rename of a file that doesn't exist.</div><div class='add'>+TEST ! mv $M0/does-not-exist $M0/neither-does-this</div><div class='add'>+</div><div class='add'>+# Test rename over an existing file.</div><div class='add'>+ok=yes</div><div class='add'>+for i in $(seq 0 9); do</div><div class='add'>+        echo foo &gt; $M0/src$i</div><div class='add'>+        echo bar &gt; $M0/dst$i</div><div class='add'>+done</div><div class='add'>+for i in $(seq 0 9); do</div><div class='add'>+        mv $M0/src$i $M0/dst$i</div><div class='add'>+done</div><div class='add'>+for i in $(seq 0 9); do</div><div class='add'>+        nfiles=$(cat $B0/b0/*/dst$i | wc -l)</div><div class='add'>+        if [ "$nfiles" = "2" ]; then</div><div class='add'>+                echo "COLLISION on dst$i"</div><div class='add'>+                (ls -l $B0/b0/*/dst$i; cat $B0/b0/*/dst$i) | sed "/^/s//  /"</div><div class='add'>+                ok=no</div><div class='add'>+        fi</div><div class='add'>+done</div><div class='add'>+EXPECT "yes" echo $ok</div><div class='add'>+</div><div class='add'>+# Test rename of a directory.</div><div class='add'>+count_copies () {</div><div class='add'>+        ls -d $B0/b?/?/$1 2&gt; /dev/null | wc -l</div><div class='add'>+}</div><div class='add'>+TEST mkdir $M0/foo_dir</div><div class='add'>+EXPECT 1 count_copies foo_dir</div><div class='add'>+EXPECT 0 count_copies bar_dir</div><div class='add'>+TEST mv $M0/foo_dir $M0/bar_dir</div><div class='add'>+EXPECT 0 count_copies foo_dir</div><div class='add'>+EXPECT 1 count_copies bar_dir</div><div class='add'>+</div><div class='add'>+for x in $(seq 0 99); do</div><div class='add'>+        touch $M0/target$x</div><div class='add'>+        ln -s $M0/target$x $M0/link$x</div><div class='add'>+done</div><div class='add'>+on_0=$(ls $B0/b*/0/link* | wc -l)</div><div class='add'>+on_1=$(ls $B0/b*/1/link* | wc -l)</div><div class='add'>+TEST [ "$on_0" -eq 100 ]</div><div class='add'>+TEST [ "$on_1" -eq 0 ]</div><div class='add'>+TEST [ "$(ls -l $M0/link* | wc -l)" = 100 ]</div><div class='add'>+</div><div class='add'>+# Test (hard) link.</div><div class='add'>+_test_hardlink () {</div><div class='add'>+        local b</div><div class='add'>+        local has_src</div><div class='add'>+        local has_dst</div><div class='add'>+        local src_inum</div><div class='add'>+        local dst_inum</div><div class='add'>+        touch $M0/hardsrc$1</div><div class='add'>+        ln $M0/hardsrc$1 $M0/harddst$1</div><div class='add'>+        for b in $B0/b{0}/{0,1}; do</div><div class='add'>+                [ -f $b/hardsrc$1 ]; has_src=$?</div><div class='add'>+                [ -f $b/harddst$1 ]; has_dst=$?</div><div class='add'>+                if [ "$has_src" != "$has_dst" ]; then</div><div class='add'>+                        echo "MISSING $b/hardxxx$1 $has_src $has_dst"</div><div class='add'>+                        return</div><div class='add'>+                fi</div><div class='add'>+                if [ "$has_src$has_dst" = "00" ]; then</div><div class='add'>+                        src_inum=$(stat -c '%i' $b/hardsrc$1)</div><div class='add'>+                        dst_inum=$(stat -c '%i' $b/harddst$1)</div><div class='add'>+                        if [ "$dst_inum" != "$src_inum" ]; then</div><div class='add'>+                                echo "MISMATCH $b/hardxx$i $src_inum $dst_inum"</div><div class='add'>+                                return</div><div class='add'>+                        fi</div><div class='add'>+                fi</div><div class='add'>+        done</div><div class='add'>+        echo "OK"</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+test_hardlink () {</div><div class='add'>+        local result=$(_test_hardlink $*)</div><div class='add'>+        # [ "$result" = "OK" ] || echo $result &gt; /dev/tty</div><div class='add'>+        echo $result</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+# Do this multiple times to make sure colocation isn't a fluke.</div><div class='add'>+EXPECT "OK" test_hardlink 0</div><div class='add'>+EXPECT "OK" test_hardlink 1</div><div class='add'>+EXPECT "OK" test_hardlink 2</div><div class='add'>+EXPECT "OK" test_hardlink 3</div><div class='add'>+EXPECT "OK" test_hardlink 4</div><div class='add'>+EXPECT "OK" test_hardlink 5</div><div class='add'>+EXPECT "OK" test_hardlink 6</div><div class='add'>+EXPECT "OK" test_hardlink 7</div><div class='add'>+EXPECT "OK" test_hardlink 8</div><div class='add'>+EXPECT "OK" test_hardlink 9</div><div class='add'>+</div><div class='add'>+# Test remove hardlink source. ensure deleting one file</div><div class='add'>+# doesn't delete the data unless link-count is 1</div><div class='add'>+TEST mkdir $M0/hardlink</div><div class='add'>+TEST touch $M0/hardlink/fileA</div><div class='add'>+echo "data" &gt;&gt; $M0/hardlink/fileA</div><div class='add'>+checksum=$(md5sum $M0/hardlink/fileA | awk '{print $1}')</div><div class='add'>+TEST ln $M0/hardlink/fileA $M0/hardlink/fileB</div><div class='add'>+TEST [ $(dir -1 $M0/hardlink/ | wc -l) -eq 2 ]</div><div class='add'>+TEST rm $M0/hardlink/fileA</div><div class='add'>+TEST [ $(dir -1 $M0/hardlink/ | wc -l) -eq 1 ]</div><div class='add'>+TEST [ "$(md5sum $M0/hardlink/fileB | awk '{print $1}')" == "$checksum" ]</div><div class='add'>+</div><div class='add'>+#</div><div class='add'>+# FIXME: statfs values look ok but the test is bad</div><div class='add'>+#</div><div class='add'>+# Test statfs. If we're doing it right, the numbers for the mountpoint should be</div><div class='add'>+# double those for the brick filesystem times the number of bricks,</div><div class='add'>+# but unless we're on a completely idle</div><div class='add'>+# system (which never happens) the numbers can change even while this function</div><div class='add'>+# runs and that would trip us up. Do a sloppy comparison to deal with that.</div><div class='add'>+#compare_fields () {</div><div class='add'>+#       val1=$(df $1 | grep / | awk "{print \$$3}")</div><div class='add'>+#        val2=$(df $2 | grep / | awk "{print \$$3}")</div><div class='add'>+#       [ "$val2" -gt "$(((val1/(29/10))*19/10))" -a "$val2" -lt "$(((val1/(31/10))*21/10))" ]</div><div class='add'>+#}</div><div class='add'>+</div><div class='add'>+#brick_df=$(df $B0 | grep /)</div><div class='add'>+#mount_df=$(df $M0 | grep /)</div><div class='add'>+#TEST compare_fields $B0 $M0 2       # Total blocks</div><div class='add'>+#TEST compare_fields $B0 $M0 3       # Used</div><div class='add'>+#TEST compare_fields $B0 $M0 4       # Available</div><div class='add'>+</div><div class='add'>+# Test removexattr.</div><div class='add'>+#RXATTR_FILE=$(get_file_not_on_disk0 rxtest)</div><div class='add'>+#TEST setfattr -n user.foo -v bar $M0/$RXATTR_FILE</div><div class='add'>+#TEST getfattr -n user.foo $B0/b0/1/$RXATTR_FILE</div><div class='add'>+#TEST setfattr -x user.foo $M0/$RXATTR_FILE</div><div class='add'>+#TEST ! getfattr -n user.foo $B0/b0/1/$RXATTR_FILE</div><div class='add'>+</div><div class='add'>+# Test fsyncdir. We can't really test whether it's doing the right thing,</div><div class='add'>+# but we can test that it doesn't fail and we can hand-check that it's calling</div><div class='add'>+# down to all of the disks instead of just one.</div><div class='add'>+#</div><div class='add'>+# P.S. There's no fsyncdir test in the rest of Gluster, so who even knows if</div><div class='add'>+# other translators are handling it correctly?</div><div class='add'>+</div><div class='add'>+#FSYNCDIR_EXE=$(dirname $0)/fsyncdir</div><div class='add'>+#build_tester ${FSYNCDIR_EXE}.c</div><div class='add'>+#TEST touch $M0/fsyncdir_src</div><div class='add'>+#TEST $FSYNCDIR_EXE $M0 $M0/fsyncdir_src $M0/fsyncdir_dst</div><div class='add'>+#TEST rm -f $FSYNCDIR_EXE</div><div class='add'>+</div><div class='add'>+# Test fsetxattr, fgetxattr, fremovexattr (in that order).</div><div class='add'>+FXATTR_FILE=$M0/fxfile1</div><div class='add'>+TEST touch $FXATTR_FILE</div><div class='add'>+FXATTR_EXE=$(dirname $0)/fxattr</div><div class='add'>+build_tester ${FXATTR_EXE}.c</div><div class='add'>+TEST ! getfattr -n user.fxtest $FXATTR_FILE</div><div class='add'>+TEST $FXATTR_EXE $FXATTR_FILE set value1</div><div class='add'>+TEST getfattr -n user.fxtest $FXATTR_FILE</div><div class='add'>+TEST setfattr -n user.fxtest -v value2 $FXATTR_FILE</div><div class='add'>+TEST $FXATTR_EXE $FXATTR_FILE get value2</div><div class='add'>+TEST $FXATTR_EXE $FXATTR_FILE remove</div><div class='add'>+TEST ! getfattr -n user.fxtest $FXATTR_FILE</div><div class='add'>+TEST rm -f $FXATTR_EXE</div><div class='add'>+</div><div class='add'>+# Test ftruncate</div><div class='add'>+FTRUNCATE_EXE=$(dirname $0)/ftruncate</div><div class='add'>+build_tester ${FTRUNCATE_EXE}.c</div><div class='add'>+FTRUNCATE_FILE=$M0/ftfile1</div><div class='add'>+TEST dd if=/dev/urandom of=$FTRUNCATE_FILE count=1 bs=1MB </div><div class='add'>+TEST $FTRUNCATE_EXE $FTRUNCATE_FILE</div><div class='add'>+#gfid=$(gf_gfid_xattr_to_str $(gf_get_gfid_xattr $B0/b0/*/ftfile1))</div><div class='add'>+</div><div class='add'>+# Test fallocate, discard, zerofill. Actually we don't so much check that these</div><div class='add'>+# *work* as that they don't throw any errors (especially ENOENT because the</div><div class='add'>+# file's not on disk zero).</div><div class='add'>+FALLOC_FILE=fatest1</div><div class='add'>+TEST touch $M0/$FALLOC_FILE</div><div class='add'>+TEST fallocate -l $((4096*5)) $M0/$FALLOC_FILE</div><div class='add'>+TEST fallocate -p -o 4096 -l 4096 $M0/$FALLOC_FILE</div><div class='add'>+# This actually fails with "operation not supported" on most filesystems, so</div><div class='add'>+# don't leave it enabled except to test changes.</div><div class='add'>+#TEST fallocate -z -o $((4096*3)) -l 4096 $M0/$FALLOC_FILE</div><div class='add'>+</div><div class='add'>+#cleanup;</div><div class='head'>diff --git a/tests/basic/metadisp/metadisp.vol b/tests/basic/metadisp/metadisp.vol<br/>new file mode 100644<br/>index 00000000000..58ae2f6f2a8<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/metadisp/metadisp.vol?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/metadisp/metadisp.vol</a></div><div class='hunk'>@@ -0,0 +1,14 @@</div><div class='add'>+volume posix-0</div><div class='add'>+  type storage/posix</div><div class='add'>+  option directory /d/backends/b0/0</div><div class='add'>+end-volume</div><div class='add'>+</div><div class='add'>+volume posix-1</div><div class='add'>+  type storage/posix</div><div class='add'>+  option directory /d/backends/b0/1</div><div class='add'>+end-volume</div><div class='add'>+</div><div class='add'>+volume metadisp-0</div><div class='add'>+  type features/metadisp</div><div class='add'>+  subvolumes posix-0 posix-1</div><div class='add'>+end-volume</div><div class='head'>diff --git a/tests/basic/mgmt_v3-locks.t b/tests/basic/mgmt_v3-locks.t<br/>new file mode 100644<br/>index 00000000000..9d766f40602<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/mgmt_v3-locks.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/mgmt_v3-locks.t</a></div><div class='hunk'>@@ -0,0 +1,120 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../include.rc</div><div class='add'>+. $(dirname $0)/../cluster.rc</div><div class='add'>+</div><div class='add'>+function check_peers {</div><div class='add'>+        $CLI_1 peer status | grep 'Peer in Cluster (Connected)' | wc -l</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function volume_count {</div><div class='add'>+        local cli=$1;</div><div class='add'>+        if [ $cli -eq '1' ] ; then</div><div class='add'>+                $CLI_1 volume info | grep 'Volume Name' | wc -l;</div><div class='add'>+        else</div><div class='add'>+                $CLI_2 volume info | grep 'Volume Name' | wc -l;</div><div class='add'>+        fi</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function volinfo_field()</div><div class='add'>+{</div><div class='add'>+    local vol=$1;</div><div class='add'>+    local field=$2;</div><div class='add'>+</div><div class='add'>+    $CLI_1 volume info $vol | grep "^$field: " | sed 's/.*: //';</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function two_diff_vols_create {</div><div class='add'>+        # Both volume creates should be successful</div><div class='add'>+        $CLI_1 volume create $V0 $H1:$B1/$V0 $H2:$B2/$V0 $H3:$B3/$V0 &amp;</div><div class='add'>+        PID_1=$!</div><div class='add'>+</div><div class='add'>+        $CLI_2 volume create $V1 $H1:$B1/$V1 $H2:$B2/$V1 $H3:$B3/$V1 &amp;</div><div class='add'>+        PID_2=$!</div><div class='add'>+</div><div class='add'>+        wait $PID_1 $PID_2</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function two_diff_vols_start {</div><div class='add'>+        # Both volume starts should be successful</div><div class='add'>+        $CLI_1 volume start $V0 &amp;</div><div class='add'>+        PID_1=$!</div><div class='add'>+</div><div class='add'>+        $CLI_2 volume start $V1 &amp;</div><div class='add'>+        PID_2=$!</div><div class='add'>+</div><div class='add'>+        wait $PID_1 $PID_2</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function two_diff_vols_stop_force {</div><div class='add'>+        # Force stop, so that if rebalance from the</div><div class='add'>+        # remove bricks is in progress, stop can</div><div class='add'>+        # still go ahead. Both volume stops should</div><div class='add'>+        # be successful</div><div class='add'>+        $CLI_1 volume stop $V0 force &amp;</div><div class='add'>+        PID_1=$!</div><div class='add'>+</div><div class='add'>+        $CLI_2 volume stop $V1 force &amp;</div><div class='add'>+        PID_2=$!</div><div class='add'>+</div><div class='add'>+        wait $PID_1 $PID_2</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function same_vol_remove_brick {</div><div class='add'>+</div><div class='add'>+        # Running two same vol commands at the same time can result in</div><div class='add'>+        # two success', two failures, or one success and one failure, all</div><div class='add'>+        # of which are valid. The only thing that shouldn't happen is a</div><div class='add'>+        # glusterd crash.</div><div class='add'>+</div><div class='add'>+        local vol=$1</div><div class='add'>+        local brick=$2</div><div class='add'>+        $CLI_1 volume remove-brick $1 $2 start &amp;</div><div class='add'>+        PID=$!</div><div class='add'>+        $CLI_2 volume remove-brick $1 $2 start</div><div class='add'>+        wait $PID</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST launch_cluster 3;</div><div class='add'>+TEST $CLI_1 peer probe $H2;</div><div class='add'>+TEST $CLI_1 peer probe $H3;</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $PROBE_TIMEOUT 2 check_peers</div><div class='add'>+</div><div class='add'>+two_diff_vols_create</div><div class='add'>+EXPECT 'Created' volinfo_field $V0 'Status';</div><div class='add'>+EXPECT 'Created' volinfo_field $V1 'Status';</div><div class='add'>+</div><div class='add'>+two_diff_vols_start</div><div class='add'>+EXPECT 'Started' volinfo_field $V0 'Status';</div><div class='add'>+EXPECT 'Started' volinfo_field $V1 'Status';</div><div class='add'>+</div><div class='add'>+same_vol_remove_brick $V0 $H2:$B2/$V0</div><div class='add'>+# Checking glusterd crashed or not after same volume remove brick</div><div class='add'>+# on both nodes.</div><div class='add'>+EXPECT_WITHIN $PROBE_TIMEOUT 2 check_peers</div><div class='add'>+</div><div class='add'>+same_vol_remove_brick $V1 $H2:$B2/$V1</div><div class='add'>+# Checking glusterd crashed or not after same volume remove brick</div><div class='add'>+# on both nodes.</div><div class='add'>+EXPECT_WITHIN $PROBE_TIMEOUT 2 check_peers</div><div class='add'>+</div><div class='add'>+$CLI_1 volume set $V0 diagnostics.client-log-level DEBUG &amp;</div><div class='add'>+PID=$!</div><div class='add'>+$CLI_1 volume set $V1 diagnostics.client-log-level DEBUG</div><div class='add'>+wait $PID</div><div class='add'>+kill_glusterd 3</div><div class='add'>+$CLI_1 volume status $V0</div><div class='add'>+$CLI_2 volume status $V1</div><div class='add'>+$CLI_1 peer status</div><div class='add'>+EXPECT_WITHIN $PROBE_TIMEOUT 1 check_peers</div><div class='add'>+EXPECT 'Started' volinfo_field $V0 'Status';</div><div class='add'>+EXPECT 'Started' volinfo_field $V1 'Status';</div><div class='add'>+</div><div class='add'>+TEST $glusterd_3</div><div class='add'>+$CLI_1 volume status $V0</div><div class='add'>+$CLI_2 volume status $V1</div><div class='add'>+$CLI_1 peer status</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/basic/mount-options.disabled b/tests/basic/mount-options.disabled<br/>new file mode 100644<br/>index 00000000000..a04c8686276<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/mount-options.disabled?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/mount-options.disabled</a></div><div class='hunk'>@@ -0,0 +1,143 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../include.rc</div><div class='add'>+. $(dirname $0)/../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd --xlator-option=*.rpc-auth-allow-insecure=on</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 replica 2 $H0:$B0/${V0}{0,1,2,3,4,5}</div><div class='add'>+TEST $CLI volume set $V0 server.allow-insecure on</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+#test all the options available to see if the mount succeeds with those options</div><div class='add'>+#or not. This does not test functionality. This is added to prevent options</div><div class='add'>+#being removed in future breaking backward-compatibility.</div><div class='add'>+</div><div class='add'>+TEST glusterfs --volfile-id=/$V0 --volfile-server=$H0 $M0</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+</div><div class='add'>+TEST glusterfs --volfile-id=/$V0 --volfile-server=$H0 $M0 --attribute-timeout=0</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+</div><div class='add'>+TEST glusterfs --volfile-id=/$V0 --volfile-server=$H0 $M0 --entry-timeout=0</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+</div><div class='add'>+TEST glusterfs --volfile=$GLUSTERD_WORKDIR/vols/$V0/${V0}-fuse.vol $M0</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+</div><div class='add'>+TEST glusterfs --volfile-id=/$V0 --volfile-server=$H0 --log-file=/tmp/a.txt --log-level=DEBUG $M0</div><div class='add'>+EXPECT_NOT "0" wc -l /tmp/a.txt</div><div class='add'>+TEST grep " D " /tmp/a.txt</div><div class='add'>+TEST rm -f /tmp/a.txt</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+</div><div class='add'>+TEST glusterfs --volfile-id=/$V0 --volfile-server=$H0 $M0 --acl</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+</div><div class='add'>+TEST glusterfs --volfile-id=/$V0 --volfile-server=$H0 $M0 --aux-gfid-mount</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+</div><div class='add'>+TEST glusterfs --volfile-id=/$V0 --volfile-server=$H0 $M0 --enable-ino32</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+</div><div class='add'>+TEST glusterfs --volfile-id=/$V0 --volfile-server=$H0 $M0 --fopen-keep-cache=yes</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+TEST glusterfs --volfile-id=/$V0 --volfile-server=$H0 $M0 --fopen-keep-cache=no</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+TEST ! glusterfs --volfile-id=/$V0 --volfile-server=$H0 $M0 --fopen-keep-cache=fail</div><div class='add'>+</div><div class='add'>+TEST glusterfs --volfile-id=/$V0 --volfile-server=$H0 $M0 --mac-compat=yes</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+TEST glusterfs --volfile-id=/$V0 --volfile-server=$H0 $M0 --mac-compat=no</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+TEST ! glusterfs --volfile-id=/$V0 --volfile-server=$H0 $M0 --mac-compat=fail</div><div class='add'>+</div><div class='add'>+TEST glusterfs --volfile-id=/$V0 --volfile-server=$H0 $M0 --use-readdirp=yes</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+TEST glusterfs --volfile-id=/$V0 --volfile-server=$H0 $M0 --use-readdirp=no</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+TEST ! glusterfs --volfile-id=/$V0 --volfile-server=$H0 $M0 --use-readdirp=fail</div><div class='add'>+</div><div class='add'>+TEST glusterfs --volfile-id=/$V0 --volfile-server=$H0 $M0 --direct-io-mode=yes</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+TEST glusterfs --volfile-id=/$V0 --volfile-server=$H0 $M0 --direct-io-mode=no</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+TEST ! glusterfs --volfile-id=/$V0 --volfile-server=$H0 $M0 --direct-io-mode=fail</div><div class='add'>+</div><div class='add'>+TEST glusterfs --volfile-id=/$V0 --volfile-server=$H0 $M0 --read-only</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+</div><div class='add'>+TEST glusterfs --volfile-id=/$V0 --volfile-server=$H0 $M0 --selinux</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+</div><div class='add'>+TEST glusterfs --volfile-id=/$V0 --volfile-server=$H0 $M0 --worm</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+</div><div class='add'>+TEST glusterfs --volfile-id=/$V0 --volfile-server=$H0 $M0 --volfile-check</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+</div><div class='add'>+TEST glusterfs --volfile-id=/$V0 --volfile-server=$H0 $M0 --dump-fuse=/tmp/a.txt</div><div class='add'>+EXPECT "0" stat /tmp/a.txt</div><div class='add'>+TEST rm -f /tmp/a.txt</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+</div><div class='add'>+TEST glusterfs --volfile-id=/$V0 --volfile-server=$H0 $M0 --gid-timeout=0</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+</div><div class='add'>+TEST glusterfs --volfile-id=/$V0 --volfile-server=$H0 $M0 --gid-timeout=-1</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+</div><div class='add'>+TEST ! glusterfs --volfile-id=/$V0 --volfile-server=$H0 $M0 --gid-timeout=abc</div><div class='add'>+</div><div class='add'>+TEST glusterfs --volfile-id=/$V0 --volfile-server=$H0 $M0 --background-qlen=16</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+</div><div class='add'>+TEST ! glusterfs --volfile-id=/$V0 --volfile-server=$H0 $M0 --background-qlen=abc</div><div class='add'>+</div><div class='add'>+TEST ! glusterfs --volfile-id=/$V0 --volfile-server=$H0 $M0 --background-qlen=-1</div><div class='add'>+</div><div class='add'>+TEST glusterfs --volfile-id=/$V0 --volfile-server=$H0 $M0 --congestion-threshold=12</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+</div><div class='add'>+TEST ! glusterfs --volfile-id=/$V0 --volfile-server=$H0 $M0 --congestion-threshold=abc</div><div class='add'>+</div><div class='add'>+TEST ! glusterfs --volfile-id=/$V0 --volfile-server=$H0 $M0 --congestion=threshold=-1</div><div class='add'>+</div><div class='add'>+TEST glusterfs --volfile-id=/$V0 --volfile-server=$H0 $M0 --negative-timeout=10</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+</div><div class='add'>+TEST ! glusterfs --volfile-id=/$V0 --volfile-server=$H0 $M0 --negative-timeout=abc</div><div class='add'>+TEST ! glusterfs --volfile-id=/$V0 --volfile-server=$H0 $M0 --negative-timeout=-1</div><div class='add'>+</div><div class='add'>+TEST glusterfs --volfile-id=/$V0 --volfile-server=$H0 $M0 --pid-file=/tmp/a.txt</div><div class='add'>+EXPECT_NOT "0" wc -l /tmp/a.txt</div><div class='add'>+TEST rm -f /tmp/a.txt</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+</div><div class='add'>+TEST glusterfs --volfile-id=/$V0 --volfile-server=$H0 $M0 --volfile-server-port=24007</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+</div><div class='add'>+TEST ! glusterfs --volfile-id=/$V0 --volfile-server=$H0 $M0 --volfile-server-port=2400</div><div class='add'>+</div><div class='add'>+TEST glusterfs --volfile-id=/$V0 --volfile-server=$H0 $M0 --volfile-server-transport=tcp</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+</div><div class='add'>+TEST glusterfs --volfile-id=/$V0 --volfile-server=$H0 $M0 --volfile-server-transport=ib-verbs</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+</div><div class='add'>+TEST glusterfs --volfile-id=/$V0 --volfile-server=$H0 $M0 --auto-invalidation=off</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+</div><div class='add'>+TEST ! glusterfs --volfile-id=/$V0 --volfile-server=$H0 $M0 --volfile-server-port=socket</div><div class='add'>+</div><div class='add'>+TEST glusterfs --volfile-id=/$V0 --volfile-server=$H0 $M0 --volume-name=$V0</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+</div><div class='add'>+TEST ! glusterfs --volfile-id=/$V0 --volfile-server=$H0 $M0 --volume-name=abcd</div><div class='add'>+</div><div class='add'>+TEST ! glusterfs --volfile-id=/$V0 --volfile-server=$H0 $M0 --invalid-option</div><div class='add'>+</div><div class='add'>+TEST ! glusterfs --volfile-id=/$V0 --volfile-server=$H0 $M0 --invalid-option=abc</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/basic/mount.t b/tests/basic/mount.t<br/>new file mode 100755<br/>index 00000000000..3a3d7cc9d8d<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/mount.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/mount.t</a></div><div class='hunk'>@@ -0,0 +1,85 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../include.rc</div><div class='add'>+. $(dirname $0)/../nfs.rc</div><div class='add'>+</div><div class='add'>+#G_TESTDEF_TEST_STATUS_CENTOS6=NFS_TEST</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+## Start and create a volume</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume info;</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 replica 3 $H0:$B0/${V0}{1,2,3,4,5,6,7,8,9};</div><div class='add'>+TEST $CLI volume set $V0 nfs.disable false</div><div class='add'>+</div><div class='add'>+function volinfo_field()</div><div class='add'>+{</div><div class='add'>+    local vol=$1;</div><div class='add'>+    local field=$2;</div><div class='add'>+</div><div class='add'>+    $CLI volume info $vol | grep "^$field: " | sed 's/.*: //';</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+## Verify volume is is created</div><div class='add'>+EXPECT "$V0" volinfo_field $V0 'Volume Name';</div><div class='add'>+EXPECT 'Created' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+## Start volume and verify</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+EXPECT 'Started' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+## Make volume tightly consistent for metdata</div><div class='add'>+TEST $CLI volume set $V0 performance.stat-prefetch off;</div><div class='add'>+</div><div class='add'>+## Mount FUSE with caching disabled (read-write)</div><div class='add'>+TEST $GFS -s $H0 --volfile-id $V0 $M0;</div><div class='add'>+</div><div class='add'>+## Check consistent "rw" option</div><div class='add'>+TEST 'mount -t $MOUNT_TYPE_FUSE | grep -E "^$H0:$V0 "|$GREP_MOUNT_OPT_RW';</div><div class='add'>+TEST 'grep -E "^$H0:$V0 .+ ,?rw,?" /proc/mounts';</div><div class='add'>+</div><div class='add'>+## Mount FUSE with caching disabled (read-only)</div><div class='add'>+TEST $GFS --read-only -s $H0 --volfile-id $V0 $M1;</div><div class='add'>+</div><div class='add'>+## Check consistent "ro" option</div><div class='add'>+TEST 'mount -t $MOUNT_TYPE_FUSE | grep -E "^$H0:$V0 "|$GREP_MOUNT_OPT_RO';</div><div class='add'>+TEST 'grep -E "^$H0:$V0 .+ ,?ro(,.+)?" /proc/mounts';</div><div class='add'>+</div><div class='add'>+## Wait for volume to register with rpc.mountd</div><div class='add'>+EXPECT_WITHIN $NFS_EXPORT_TIMEOUT "1" is_nfs_export_available;</div><div class='add'>+</div><div class='add'>+## Mount NFS</div><div class='add'>+TEST mount_nfs $H0:/$V0 $N0 nolock;</div><div class='add'>+</div><div class='add'>+## Test for consistent views between NFS and FUSE mounts</div><div class='add'>+## write access to $M1 should fail</div><div class='add'>+TEST ! stat $M0/newfile;</div><div class='add'>+TEST ! touch $M1/newfile;</div><div class='add'>+TEST touch $M0/newfile;</div><div class='add'>+TEST stat $M1/newfile;</div><div class='add'>+TEST stat $N0/newfile;</div><div class='add'>+TEST ! rm -f $M1/newfile;</div><div class='add'>+TEST rm -f $N0/newfile;</div><div class='add'>+TEST ! stat $M0/newfile;</div><div class='add'>+TEST ! stat $M1/newfile;</div><div class='add'>+</div><div class='add'>+# No need to check for status here right now</div><div class='add'>+$(dirname $0)/rpc-coverage.sh $N0 &gt;/dev/null</div><div class='add'>+</div><div class='add'>+## Before killing daemon to avoid deadlocks</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" umount_nfs $N0</div><div class='add'>+</div><div class='add'>+## Finish up</div><div class='add'>+TEST $CLI volume stop $V0;</div><div class='add'>+EXPECT 'Stopped' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+TEST $CLI volume delete $V0;</div><div class='add'>+TEST ! $CLI volume info $V0;</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/basic/mpx-compat.t b/tests/basic/mpx-compat.t<br/>new file mode 100644<br/>index 00000000000..baf629dbf9b<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/mpx-compat.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/mpx-compat.t</a></div><div class='hunk'>@@ -0,0 +1,53 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+#This test tests that self-heals don't perform fsync when durability is turned</div><div class='add'>+#off</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../include.rc</div><div class='add'>+. $(dirname $0)/../traps.rc</div><div class='add'>+. $(dirname $0)/../volume.rc</div><div class='add'>+</div><div class='add'>+function count_processes {</div><div class='add'>+	# It would generally be a good idea to use "pgrep -x" to ensure an</div><div class='add'>+	# exact match, but the version of pgrep we have on NetBSD (a.k.a.</div><div class='add'>+	# the worst operating system ever) doesn't support that option.</div><div class='add'>+	# Fortunately, "glusterfsd" isn't the prefix of any other name,</div><div class='add'>+	# so this works anyway.  For now.</div><div class='add'>+	pgrep glusterfsd | wc -w</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function count_brick_pids {</div><div class='add'>+        $CLI --xml volume status all | sed -n '/.*&lt;pid&gt;\([^&lt;]*\).*/s//\1/p' \</div><div class='add'>+                                     | grep -v "N/A" | sort | uniq | wc -l</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST $CLI volume set all cluster.brick-multiplex yes</div><div class='add'>+</div><div class='add'>+# Create two vanilla volumes.</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/brick-${V0}-{0,1}</div><div class='add'>+TEST $CLI volume create $V1 $H0:$B0/brick-${V1}-{0,1}</div><div class='add'>+</div><div class='add'>+# Enable brick log-level to DEBUG</div><div class='add'>+gluster v set $V0 diagnostics.brick-log-level DEBUG</div><div class='add'>+</div><div class='add'>+# Start both.</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+TEST $CLI volume start $V1</div><div class='add'>+</div><div class='add'>+# There should be only one process for compatible volumes.  We can't use</div><div class='add'>+# EXPECT_WITHIN here because it could transiently see one process as two are</div><div class='add'>+# coming up, and yield a false positive.</div><div class='add'>+sleep $PROCESS_UP_TIMEOUT</div><div class='add'>+EXPECT "1" count_processes</div><div class='add'>+EXPECT 1 count_brick_pids</div><div class='add'>+</div><div class='add'>+# Make the second volume incompatible with the first.</div><div class='add'>+TEST $CLI volume stop $V1</div><div class='add'>+TEST $CLI volume set $V1 server.manage-gids no</div><div class='add'>+TEST $CLI volume start $V1</div><div class='add'>+</div><div class='add'>+# There should be two processes this time (can't share protocol/server).</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "2" count_processes</div><div class='add'>+</div><div class='add'>+cleanup;
\ No newline at end of file</div><div class='head'>diff --git a/tests/basic/multiple-volume-shd-mux.t b/tests/basic/multiple-volume-shd-mux.t<br/>new file mode 100644<br/>index 00000000000..d7cfbaec85f<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/multiple-volume-shd-mux.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/multiple-volume-shd-mux.t</a></div><div class='hunk'>@@ -0,0 +1,46 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../include.rc</div><div class='add'>+. $(dirname $0)/../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TESTS_EXPECTED_IN_LOOP=16</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 replica 3 $H0:$B0/${V0}{0,1,2,3,4,5}</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+shd_pid=$(get_shd_mux_pid $V0)</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "^6$" number_healer_threads_shd $V0 "afr_shd_index_healer"</div><div class='add'>+</div><div class='add'>+for i in $(seq 1 3); do</div><div class='add'>+   TEST $CLI volume create ${V0}_afr$i replica 3 $H0:$B0/${V0}_afr${i}{0,1,2,3,4,5}</div><div class='add'>+   TEST $CLI volume start ${V0}_afr$i</div><div class='add'>+   TEST $CLI volume create ${V0}_ec$i disperse 6 redundancy 2 $H0:$B0/${V0}_ec${i}{0,1,2,3,4,5}</div><div class='add'>+   TEST $CLI volume start ${V0}_ec$i</div><div class='add'>+done</div><div class='add'>+</div><div class='add'>+#Check the thread count become to number of volumes*number of ec subvolume (3*6=18)</div><div class='add'>+EXPECT_WITHIN $PROCESS_DOWN_TIMEOUT "^18$" number_healer_threads_shd $V0 "ec_shd_index_healer"</div><div class='add'>+#Check the thread count become to number of volumes*number of afr subvolume (4*6=24)</div><div class='add'>+EXPECT_WITHIN $PROCESS_DOWN_TIMEOUT "^24$" number_healer_threads_shd $V0 "afr_shd_index_healer"</div><div class='add'>+#Delete the volumes</div><div class='add'>+for i in $(seq 1 3); do</div><div class='add'>+   TEST $CLI volume stop ${V0}_afr$i</div><div class='add'>+   TEST $CLI volume stop ${V0}_ec$i</div><div class='add'>+   TEST $CLI volume delete ${V0}_afr$i</div><div class='add'>+   TEST $CLI volume delete ${V0}_ec$i</div><div class='add'>+done</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "^${shd_pid}$" get_shd_mux_pid $V0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "^1$" shd_count</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $PROCESS_DOWN_TIMEOUT "^6$" number_healer_threads_shd $V0 "afr_shd_index_healer"</div><div class='add'>+</div><div class='add'>+TEST $CLI volume stop ${V0}</div><div class='add'>+TEST $CLI volume delete ${V0}</div><div class='add'>+EXPECT_WITHIN $PROCESS_DOWN_TIMEOUT "^0$" shd_count</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/basic/multiplex.t b/tests/basic/multiplex.t<br/>new file mode 100644<br/>index 00000000000..2f558a6824b<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/multiplex.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/multiplex.t</a></div><div class='hunk'>@@ -0,0 +1,78 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../include.rc</div><div class='add'>+. $(dirname $0)/../traps.rc</div><div class='add'>+. $(dirname $0)/../volume.rc</div><div class='add'>+</div><div class='add'>+function count_up_bricks {</div><div class='add'>+        $CLI --xml volume status $V0 | grep '&lt;status&gt;1' | wc -l</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function count_brick_processes {</div><div class='add'>+	pgrep glusterfsd | wc -l</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function count_brick_pids {</div><div class='add'>+        $CLI --xml volume status $V0 | sed -n '/.*&lt;pid&gt;\([^&lt;]*\).*/s//\1/p' \</div><div class='add'>+                                     | grep -v "N/A" | sort | uniq | wc -l</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST $CLI volume set all cluster.brick-multiplex on</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/brick{0,1}</div><div class='add'>+TEST $CLI volume set $V0 features.trash enable</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+# Without multiplexing, there would be two.</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT 2 count_up_bricks</div><div class='add'>+EXPECT 1 count_brick_processes</div><div class='add'>+</div><div class='add'>+TEST $CLI volume stop $V0</div><div class='add'>+#Testing the volume set command introduced for protocol/server</div><div class='add'>+TEST $CLI volume set $V0 transport.listen-backlog 1024</div><div class='add'>+EXPECT_WITHIN $PROCESS_DOWN_TIMEOUT 0 count_brick_processes</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT 2 count_up_bricks</div><div class='add'>+EXPECT 1 count_brick_processes</div><div class='add'>+</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/brick1</div><div class='add'>+EXPECT_WITHIN $PROCESS_DOWN_TIMEOUT 1 count_up_bricks</div><div class='add'>+# Make sure the whole process didn't go away.</div><div class='add'>+EXPECT 1 count_brick_processes</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT 2 count_up_bricks</div><div class='add'>+EXPECT 1 count_brick_processes</div><div class='add'>+</div><div class='add'>+# Killing the first brick is a bit more of a challenge due to socket-path</div><div class='add'>+# issues.</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/brick0</div><div class='add'>+EXPECT_WITHIN $PROCESS_DOWN_TIMEOUT 1 count_up_bricks</div><div class='add'>+EXPECT 1 count_brick_processes</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT 2 count_up_bricks</div><div class='add'>+EXPECT 1 count_brick_processes</div><div class='add'>+</div><div class='add'>+# Make sure that the two bricks show the same PID.</div><div class='add'>+EXPECT 1 count_brick_pids</div><div class='add'>+</div><div class='add'>+# Do a quick test to make sure that the bricks are acting as separate bricks</div><div class='add'>+# even though they're in the same process.</div><div class='add'>+TEST $GFS --volfile-id=$V0 --volfile-server=$H0 $M0</div><div class='add'>+for i in $(seq 10 99); do</div><div class='add'>+        echo hello &gt; $M0/file$i</div><div class='add'>+done</div><div class='add'>+nbrick0=$(ls $B0/brick0/file?? | wc -l)</div><div class='add'>+nbrick1=$(ls $B0/brick1/file?? | wc -l)</div><div class='add'>+TEST [ $((nbrick0 + nbrick1)) -eq 90 ]</div><div class='add'>+TEST [ $((nbrick0 * nbrick1)) -ne 0 ]</div><div class='add'>+</div><div class='add'>+pkill gluster</div><div class='add'>+TEST glusterd</div><div class='add'>+EXPECT_WITHIN $PROCESS_DOWN_TIMEOUT 1 count_brick_pids</div><div class='add'>+EXPECT_WITHIN $PROCESS_DOWN_TIMEOUT 1 count_brick_processes</div><div class='add'>+</div><div class='add'>+cleanup;
\ No newline at end of file</div><div class='head'>diff --git a/tests/basic/namespace.t b/tests/basic/namespace.t<br/>new file mode 100644<br/>index 00000000000..d1bbe7eea29<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/namespace.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/namespace.t</a></div><div class='hunk'>@@ -0,0 +1,131 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../include.rc</div><div class='add'>+. $(dirname $0)/../volume.rc</div><div class='add'>+. $(dirname $0)/../nfs.rc</div><div class='add'>+</div><div class='add'>+#G_TESTDEF_TEST_STATUS_CENTOS6=NFS_TEST</div><div class='add'>+</div><div class='add'>+# These hashes are a result of calling SuperFastHash</div><div class='add'>+# on the corresponding folder names.</div><div class='add'>+NAMESPACE_HASH=28153613</div><div class='add'>+NAMESPACE2_HASH=3926991974</div><div class='add'>+NAMESPACE3_HASH=3493960770</div><div class='add'>+</div><div class='add'>+function check_brick_multiplex() {</div><div class='add'>+        local ret=$($CLI volume info|grep "cluster.brick-multiplex"|cut -d" " -f2)</div><div class='add'>+        local cnt="$(ls /var/log/glusterfs/bricks|wc -l)"</div><div class='add'>+        local bcnt="$(brick_count)"</div><div class='add'>+</div><div class='add'>+        if [ $bcnt -ne 1 ]; then</div><div class='add'>+           if [ -z $ret ]; then</div><div class='add'>+              ret="no"</div><div class='add'>+           fi</div><div class='add'>+</div><div class='add'>+           if [ $ret = "on" ] || [ $cnt -eq 1 ]; then</div><div class='add'>+              echo "Y"</div><div class='add'>+           else</div><div class='add'>+              echo "N"</div><div class='add'>+           fi</div><div class='add'>+        else</div><div class='add'>+           echo "N"</div><div class='add'>+        fi</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function check_samples() {</div><div class='add'>+        local FOP_TYPE=$1</div><div class='add'>+        local NS_HASH=$2</div><div class='add'>+        local FILE=$3</div><div class='add'>+        local BRICK=$4</div><div class='add'>+        local GFID="$(getfattr -n trusted.gfid -e text --only-values $B0/$BRICK$FILE | xxd -p)"</div><div class='add'>+        local val="$(check_brick_multiplex)"</div><div class='add'>+</div><div class='add'>+        if [ $val = "Y" ]; then</div><div class='add'>+           BRICK="${V0}0"</div><div class='add'>+        fi</div><div class='add'>+</div><div class='add'>+        grep -i "ns_$OP" /var/log/glusterfs/bricks/d-backends-$BRICK.log |</div><div class='add'>+             grep -- $NS_HASH | sed 's/\-//g' | grep -- $GFID</div><div class='add'>+        if [ $? -eq 0 ]; then</div><div class='add'>+          echo "Y"</div><div class='add'>+         else</div><div class='add'>+          echo "N"</div><div class='add'>+        fi</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST mkdir -p $B0/${V0}{0,1,2,3,4,5,6,7,8,9}</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 replica 3 $H0:$B0/${V0}{0,1,2,3,4,5,6,7,8}</div><div class='add'>+TEST $CLI volume set $V0 nfs.disable off</div><div class='add'>+TEST $CLI volume set $V0 performance.stat-prefetch off</div><div class='add'>+TEST $CLI volume set $V0 performance.nfs.stat-prefetch off</div><div class='add'>+TEST $CLI volume set $V0 cluster.read-subvolume-index 0</div><div class='add'>+TEST $CLI volume set $V0 diagnostics.brick-log-level DEBUG</div><div class='add'>+TEST $CLI volume set $V0 features.tag-namespaces on</div><div class='add'>+TEST $CLI volume set $V0 storage.build-pgfid on</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+sleep 2</div><div class='add'>+</div><div class='add'>+TEST mount_nfs $H0:/$V0 $N0 nolock;</div><div class='add'>+</div><div class='add'>+################################</div><div class='add'>+# Paths in the samples #</div><div class='add'>+################################</div><div class='add'>+</div><div class='add'>+mkdir -p $N0/namespace</div><div class='add'>+</div><div class='add'>+# subvol_1 = bar, subvol_2 = foo, subvol_3 = hey</div><div class='add'>+# Test create, write (tagged by loc, fd respectively).</div><div class='add'>+touch $N0/namespace/{bar,foo,hey}</div><div class='add'>+echo "garbage" &gt; $N0/namespace/bar</div><div class='add'>+echo "garbage" &gt; $N0/namespace/foo</div><div class='add'>+echo "garbage" &gt; $N0/namespace/hey</div><div class='add'>+EXPECT_WITHIN 10 "Y" check_samples CREATE $NAMESPACE_HASH /namespace/bar patchy0</div><div class='add'>+EXPECT_WITHIN 10 "Y" check_samples CREATE $NAMESPACE_HASH /namespace/foo patchy3</div><div class='add'>+EXPECT_WITHIN 10 "Y" check_samples CREATE $NAMESPACE_HASH /namespace/hey patchy6</div><div class='add'>+EXPECT_WITHIN 10 "Y" check_samples WRITEV $NAMESPACE_HASH /namespace/bar patchy0</div><div class='add'>+EXPECT_WITHIN 10 "Y" check_samples WRITEV $NAMESPACE_HASH /namespace/foo patchy3</div><div class='add'>+EXPECT_WITHIN 10 "Y" check_samples WRITEV $NAMESPACE_HASH /namespace/hey patchy6</div><div class='add'>+</div><div class='add'>+# Test stat (tagged by loc)</div><div class='add'>+stat $N0/namespace/bar &amp;&gt; /dev/null</div><div class='add'>+stat $N0/namespace/foo &amp;&gt; /dev/null</div><div class='add'>+stat $N0/namespace/hey &amp;&gt; /dev/null</div><div class='add'>+EXPECT_WITHIN 10 "Y" check_samples STAT $NAMESPACE_HASH /namespace/bar patchy0</div><div class='add'>+EXPECT_WITHIN 10 "Y" check_samples STAT $NAMESPACE_HASH /namespace/foo patchy3</div><div class='add'>+EXPECT_WITHIN 10 "Y" check_samples STAT $NAMESPACE_HASH /namespace/hey patchy6</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN 10 "Y" umount_nfs $N0;</div><div class='add'>+sleep 1</div><div class='add'>+TEST mount_nfs $H0:/$V0 $N0 nolock;</div><div class='add'>+</div><div class='add'>+cat $N0/namespace/bar &amp;&gt; /dev/null</div><div class='add'>+EXPECT_WITHIN 10 "Y" check_samples READ $NAMESPACE_HASH /namespace/bar patchy0</div><div class='add'>+</div><div class='add'>+dir $N0/namespace &amp;&gt; /dev/null</div><div class='add'>+EXPECT_WITHIN 10 "Y" check_samples LOOKUP $NAMESPACE_HASH /namespace patchy0</div><div class='add'>+</div><div class='add'>+mkdir -p $N0/namespace{2,3}</div><div class='add'>+EXPECT_WITHIN 10 "Y" check_samples MKDIR $NAMESPACE2_HASH /namespace2 patchy0</div><div class='add'>+EXPECT_WITHIN 10 "Y" check_samples MKDIR $NAMESPACE3_HASH /namespace3 patchy0</div><div class='add'>+</div><div class='add'>+touch $N0/namespace2/file</div><div class='add'>+touch $N0/namespace3/file</div><div class='add'>+EXPECT_WITHIN 10 "Y" check_samples CREATE $NAMESPACE2_HASH /namespace2/file patchy0</div><div class='add'>+EXPECT_WITHIN 10 "Y" check_samples CREATE $NAMESPACE3_HASH /namespace3/file patchy0</div><div class='add'>+</div><div class='add'>+truncate -s 0 $N0/namespace/bar</div><div class='add'>+EXPECT_WITHIN 10 "Y" check_samples TRUNCATE $NAMESPACE_HASH /namespace/bar patchy0</div><div class='add'>+</div><div class='add'>+ln -s $N0/namespace/foo $N0/namespace/foo_link</div><div class='add'>+EXPECT_WITHIN 10 "Y" check_samples SYMLINK $NAMESPACE_HASH /namespace/foo patchy3</div><div class='add'>+</div><div class='add'>+open $N0/namespace/hey</div><div class='add'>+EXPECT_WITHIN 10 "Y" check_samples OPEN $NAMESPACE_HASH /namespace/hey patchy6</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/basic/netgroup_parsing.t b/tests/basic/netgroup_parsing.t<br/>new file mode 100644<br/>index 00000000000..cf8d871f1f8<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/netgroup_parsing.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/netgroup_parsing.t</a></div><div class='hunk'>@@ -0,0 +1,56 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../include.rc</div><div class='add'>+. $(dirname $0)/../volume.rc</div><div class='add'>+</div><div class='add'>+NG_FILES=$(dirname $0)/../configfiles</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+function test_ng_1 ()</div><div class='add'>+{</div><div class='add'>+        glusterfsd --print-netgroups $1 | sed -n 1p</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function test_ng_2 ()</div><div class='add'>+{</div><div class='add'>+        glusterfsd --print-netgroups $1 | sed -n 2p</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function test_ng_3 ()</div><div class='add'>+{</div><div class='add'>+        glusterfsd --print-netgroups $1 | sed -n 3p</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function test_ng_4 ()</div><div class='add'>+{</div><div class='add'>+        glusterfsd --print-netgroups $1 | sed -n 4p</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function test_bad_ng ()</div><div class='add'>+{</div><div class='add'>+        glusterfsd --print-netgroups $1 2&gt;&amp;1 | sed -n 1p</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function test_large_file ()</div><div class='add'>+{</div><div class='add'>+        # The build system needs this path for the test to pass.</div><div class='add'>+        # This is an important test because this file is ~1800 lines</div><div class='add'>+        # longs and is a "real-world" netgroups file.</div><div class='add'>+        glusterfsd --print-netgroups ~/opsfiles/storage/netgroup/netgroup | sed -n 1p</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function test_empty_ng ()</div><div class='add'>+{</div><div class='add'>+        glusterfsd --print-netgroups $1 2&gt;&amp;1 | sed -n 2p</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+EXPECT_KEYWORD "ng3 (dev-1763.prn-2.example.com,,)" test_ng_1 $NG_FILES/netgroups</div><div class='add'>+EXPECT_KEYWORD "ng2 (dev1763.prn2.example.com,,)" test_ng_2 $NG_FILES/netgroups</div><div class='add'>+EXPECT_KEYWORD "ng1 ng2 (dev1763.prn2.example.com,,)" test_ng_3 $NG_FILES/netgroups</div><div class='add'>+EXPECT_KEYWORD "asdf ng1 ng2 (dev1763.prn2.example.com,,)" test_ng_4  $NG_FILES/netgroups</div><div class='add'>+# TODO: get a real-world large netgroup file</div><div class='add'>+#EXPECT_KEYWORD "wikipedia001.07.prn1 (wikipedia003.prn1.example.com,,)(wikipedia002.prn1.example.com,,)(wikipedia001.prn1.example.com,,)"  test_large_file</div><div class='add'>+EXPECT_KEYWORD "Parse error" test_bad_ng $NG_FILES/bad_netgroups</div><div class='add'>+EXPECT_KEYWORD "No netgroups were specified except for the parent" test_empty_ng $NG_FILES/bad_netgroups</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/basic/nl-cache.t b/tests/basic/nl-cache.t<br/>new file mode 100755<br/>index 00000000000..90c778c8a88<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/nl-cache.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/nl-cache.t</a></div><div class='hunk'>@@ -0,0 +1,98 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../include.rc</div><div class='add'>+. $(dirname $0)/../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/${V0}{0..4}</div><div class='add'>+EXPECT 'Created' volinfo_field $V0 'Status'</div><div class='add'>+</div><div class='add'>+TEST $CLI volume set $V0 group nl-cache</div><div class='add'>+EXPECT '600' volinfo_field $V0 'performance.nl-cache-timeout'</div><div class='add'>+EXPECT 'on' volinfo_field $V0 'performance.nl-cache'</div><div class='add'>+EXPECT '600' volinfo_field $V0 'features.cache-invalidation-timeout'</div><div class='add'>+EXPECT 'on' volinfo_field $V0 'features.cache-invalidation'</div><div class='add'>+EXPECT '200000' volinfo_field $V0  'network.inode-lru-limit'</div><div class='add'>+TEST $CLI volume set $V0 nl-cache-positive-entry on</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+EXPECT 'Started' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+TEST glusterfs --volfile-id=/$V0 --volfile-server=$H0 $M0</div><div class='add'>+TEST glusterfs --volfile-id=/$V0 --volfile-server=$H0 $M1</div><div class='add'>+</div><div class='add'>+TEST ! ls $M0/file2</div><div class='add'>+TEST touch $M0/file1</div><div class='add'>+TEST ! ls $M0/file2</div><div class='add'>+TEST touch $M0/file2</div><div class='add'>+TEST ls $M0/file2</div><div class='add'>+TEST rm $M0/file2</div><div class='add'>+TEST rm $M0/file1</div><div class='add'>+</div><div class='add'>+TEST mkdir $M0/dir1</div><div class='add'>+TEST ! ls -l $M0/dir1/file</div><div class='add'>+TEST mkdir $M0/dir1/dir2</div><div class='add'>+TEST ! ls -l $M0/dir1/file</div><div class='add'>+TEST ! ls -l $M0/dir1/dir2/file</div><div class='add'>+TEST ls -l $M0/dir1/dir2</div><div class='add'>+TEST rmdir $M0/dir1/dir2</div><div class='add'>+TEST rmdir $M0/dir1</div><div class='add'>+</div><div class='add'>+TEST ! ls -l $M0/file2</div><div class='add'>+TEST touch $M1/file2</div><div class='add'>+TEST ls -l $M0/file2</div><div class='add'>+TEST rm $M1/file2</div><div class='add'>+</div><div class='add'>+TEST ! ls -l $M0/dir1</div><div class='add'>+TEST mkdir $M1/dir1</div><div class='add'>+TEST ls -l $M0/dir1</div><div class='add'>+TEST ! ls -l $M0/dir1/file1</div><div class='add'>+TEST mkdir $M1/dir1/dir2</div><div class='add'>+TEST ! ls -l $M0/dir1/file1</div><div class='add'>+TEST ls -l $M0/dir1/dir2</div><div class='add'>+TEST ! ls -l $M1/dir1/file1</div><div class='add'>+</div><div class='add'>+TEST touch $M0/dir1/file</div><div class='add'>+TEST ln $M0/dir1/file $M0/dir1/file_link</div><div class='add'>+TEST ls -l $M1/dir1/file</div><div class='add'>+TEST ls -l $M1/dir1/file_link</div><div class='add'>+TEST rm $M0/dir1/file</div><div class='add'>+TEST rm $M0/dir1/file_link</div><div class='add'>+TEST rmdir $M0/dir1/dir2</div><div class='add'>+TEST rmdir $M0/dir1</div><div class='add'>+</div><div class='add'>+#Check mknod</div><div class='add'>+TEST ! ls -l $M0/dir</div><div class='add'>+TEST mkdir $M0/dir</div><div class='add'>+TEST mknod -m 0666 $M0/dir/block b 4 5</div><div class='add'>+TEST mknod -m 0666 $M0/dir/char c 1 5</div><div class='add'>+TEST mknod -m 0666 $M0/dir/fifo p</div><div class='add'>+TEST rm $M0/dir/block</div><div class='add'>+TEST rm $M0/dir/char</div><div class='add'>+TEST rm $M0/dir/fifo</div><div class='add'>+</div><div class='add'>+#Check getxattr</div><div class='add'>+TEST touch $M0/file1</div><div class='add'>+TEST getfattr -d -m. -e hex $M0/file1</div><div class='add'>+TEST getfattr -n "glusterfs.get_real_filename:file1" $M0;</div><div class='add'>+TEST getfattr -n "glusterfs.get_real_filename:FILE1" $M0;</div><div class='add'>+TEST ! getfattr -n "glusterfs.get_real_filename:FILE2" $M0;</div><div class='add'>+</div><div class='add'>+#Check statedump</div><div class='add'>+TEST generate_mount_statedump $V0 $M0</div><div class='add'>+TEST cleanup_mount_statedump $V0</div><div class='add'>+</div><div class='add'>+#Check reconfigure</div><div class='add'>+TEST $CLI volume reset $V0 nl-cache-timeout</div><div class='add'>+TEST $CLI volume reset $V0 nl-cache-positive-entry</div><div class='add'>+TEST $CLI volume reset $V0 nl-cache-limit</div><div class='add'>+TEST $CLI volume reset $V0 nl-cache-pass-through</div><div class='add'>+</div><div class='add'>+TEST $CLI volume stop $V0</div><div class='add'>+TEST $CLI volume delete $V0</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+#G_TESTDEF_TEST_STATUS_NETBSD7=BAD_TEST,BUG=000000</div><div class='head'>diff --git a/tests/basic/nufa.t b/tests/basic/nufa.t<br/>new file mode 100644<br/>index 00000000000..cb09fc5bbbf<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/nufa.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/nufa.t</a></div><div class='hunk'>@@ -0,0 +1,41 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../include.rc</div><div class='add'>+. $(dirname $0)/../volume.rc</div><div class='add'>+. $(dirname $0)/../nfs.rc</div><div class='add'>+</div><div class='add'>+#G_TESTDEF_TEST_STATUS_CENTOS6=NFS_TEST</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume info;</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 replica 3 $H0:$B0/${V0}{1,2,3,4,5,6};</div><div class='add'>+TEST $CLI volume set $V0 nfs.disable false</div><div class='add'>+</div><div class='add'>+EXPECT "$V0" volinfo_field $V0 'Volume Name';</div><div class='add'>+EXPECT 'Created' volinfo_field $V0 'Status';</div><div class='add'>+EXPECT '6' brick_count $V0</div><div class='add'>+</div><div class='add'>+TEST $CLI volume set $V0 nufa on;</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+EXPECT 'Started' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+## Mount FUSE with caching disabled (read-only)</div><div class='add'>+TEST $GFS --read-only -s $H0 --volfile-id $V0 $M1;</div><div class='add'>+</div><div class='add'>+## Wait for volume to register with rpc.mountd</div><div class='add'>+sleep 5;</div><div class='add'>+</div><div class='add'>+##Wait for connection establishment between nfs server and brick process</div><div class='add'>+EXPECT_WITHIN $NFS_EXPORT_TIMEOUT "1" is_nfs_export_available;</div><div class='add'>+## Mount NFS</div><div class='add'>+TEST mount_nfs $H0:/$V0 $N0 nolock;</div><div class='add'>+</div><div class='add'>+## Before killing daemon to avoid deadlocks</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" umount_nfs $N0</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/basic/op_errnos.t b/tests/basic/op_errnos.t<br/>new file mode 100755<br/>index 00000000000..9c48d7a02ad<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/op_errnos.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/op_errnos.t</a></div><div class='hunk'>@@ -0,0 +1,34 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../include.rc</div><div class='add'>+. $(dirname $0)/../snapshot.rc</div><div class='add'>+</div><div class='add'>+function get-op_errno-xml()</div><div class='add'>+{</div><div class='add'>+        $CLI $1 --xml | xmllint --format - | grep opErrno | sed 's/\(&lt;opErrno&gt;\|&lt;\/opErrno&gt;\)//g'</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+TEST verify_lvm_version;</div><div class='add'>+TEST glusterd;</div><div class='add'>+TEST pidof glusterd;</div><div class='add'>+</div><div class='add'>+TEST setup_lvm 1</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 $H0:$L1</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+EXPECT 0 get-op_errno-xml "snapshot create snap1 $V0 no-timestamp"</div><div class='add'>+EXPECT 30806 get-op_errno-xml "snapshot create snap1 imaginary_volume"</div><div class='add'>+EXPECT 30807 get-op_errno-xml "snapshot delete imaginary_snap"</div><div class='add'>+EXPECT 30809 get-op_errno-xml "snapshot restore snap1"</div><div class='add'>+TEST $CLI volume stop $V0</div><div class='add'>+EXPECT 30810 get-op_errno-xml "snapshot create snap1 $V0"</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+EXPECT 30811 get-op_errno-xml "snapshot clone $V0 snap1"</div><div class='add'>+EXPECT 30812 get-op_errno-xml "snapshot create snap1 $V0 no-timestamp"</div><div class='add'>+</div><div class='add'>+EXPECT 0 get-op_errno-xml "snapshot delete snap1"</div><div class='add'>+TEST $CLI volume stop $V0</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/basic/open-behind/open-behind.t b/tests/basic/open-behind/open-behind.t<br/>new file mode 100644<br/>index 00000000000..5e865d602e2<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/open-behind/open-behind.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/open-behind/open-behind.t</a></div><div class='hunk'>@@ -0,0 +1,183 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+WD="$(dirname "${0}")"</div><div class='add'>+</div><div class='add'>+. ${WD}/../../include.rc</div><div class='add'>+. ${WD}/../../volume.rc</div><div class='add'>+</div><div class='add'>+function assign() {</div><div class='add'>+    local _assign_var="${1}"</div><div class='add'>+    local _assign_value="${2}"</div><div class='add'>+</div><div class='add'>+    printf -v "${_assign_var}" "%s" "${_assign_value}"</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function pipe_create() {</div><div class='add'>+    local _pipe_create_var="${1}"</div><div class='add'>+    local _pipe_create_name</div><div class='add'>+    local _pipe_create_fd</div><div class='add'>+</div><div class='add'>+    _pipe_create_name="$(mktemp -u)"</div><div class='add'>+    mkfifo "${_pipe_create_name}"</div><div class='add'>+    exec {_pipe_create_fd}&lt;&gt;"${_pipe_create_name}"</div><div class='add'>+    rm "${_pipe_create_name}"</div><div class='add'>+</div><div class='add'>+    assign "${_pipe_create_var}" "${_pipe_create_fd}"</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function pipe_close() {</div><div class='add'>+    local _pipe_close_fd="${!1}"</div><div class='add'>+</div><div class='add'>+    exec {_pipe_close_fd}&gt;&amp;-</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function tester_start() {</div><div class='add'>+    declare -ag tester</div><div class='add'>+    local tester_in</div><div class='add'>+    local tester_out</div><div class='add'>+</div><div class='add'>+    pipe_create tester_in</div><div class='add'>+    pipe_create tester_out</div><div class='add'>+</div><div class='add'>+    ${WD}/tester &lt;&amp;${tester_in} &gt;&amp;${tester_out} &amp;</div><div class='add'>+</div><div class='add'>+    tester=("$!" "${tester_in}" "${tester_out}")</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function tester_send() {</div><div class='add'>+    declare -ag tester</div><div class='add'>+    local tester_res</div><div class='add'>+    local tester_extra</div><div class='add'>+</div><div class='add'>+    echo "${*}" &gt;&amp;${tester[1]}</div><div class='add'>+</div><div class='add'>+    read -t 3 -u ${tester[2]} tester_res tester_extra</div><div class='add'>+    echo "${tester_res} ${tester_extra}"</div><div class='add'>+    if [[ "${tester_res}" == "OK" ]]; then</div><div class='add'>+        return 0</div><div class='add'>+    fi</div><div class='add'>+</div><div class='add'>+    return 1</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function tester_stop() {</div><div class='add'>+    declare -ag tester</div><div class='add'>+    local tester_res</div><div class='add'>+</div><div class='add'>+    tester_send "quit"</div><div class='add'>+</div><div class='add'>+    tester_res=0</div><div class='add'>+    if ! wait ${tester[0]}; then</div><div class='add'>+        tester_res=$?</div><div class='add'>+    fi</div><div class='add'>+</div><div class='add'>+    unset tester</div><div class='add'>+</div><div class='add'>+    return ${tester_res}</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function count_open() {</div><div class='add'>+    local file="$(realpath "${B0}/${V0}/${1}")"</div><div class='add'>+    local count="0"</div><div class='add'>+    local inode</div><div class='add'>+    local ref</div><div class='add'>+</div><div class='add'>+    inode="$(stat -c %i "${file}")"</div><div class='add'>+</div><div class='add'>+    for fd in /proc/${BRICK_PID}/fd/*; do</div><div class='add'>+        ref="$(readlink "${fd}")"</div><div class='add'>+        if [[ "${ref}" == "${B0}/${V0}/"* ]]; then</div><div class='add'>+            if [[ "$(stat -c %i "${ref}")" == "${inode}" ]]; then</div><div class='add'>+                count="$((${count} + 1))"</div><div class='add'>+            fi</div><div class='add'>+        fi</div><div class='add'>+    done</div><div class='add'>+</div><div class='add'>+    echo "${count}"</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='add'>+</div><div class='add'>+TEST build_tester ${WD}/tester.c ${WD}/tester-fd.c</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST ${CLI} volume create ${V0} ${H0}:${B0}/${V0}</div><div class='add'>+TEST ${CLI} volume set ${V0} flush-behind off</div><div class='add'>+TEST ${CLI} volume set ${V0} write-behind off</div><div class='add'>+TEST ${CLI} volume set ${V0} quick-read off</div><div class='add'>+TEST ${CLI} volume set ${V0} stat-prefetch on</div><div class='add'>+TEST ${CLI} volume set ${V0} io-cache off</div><div class='add'>+TEST ${CLI} volume set ${V0} open-behind on</div><div class='add'>+TEST ${CLI} volume set ${V0} lazy-open off</div><div class='add'>+TEST ${CLI} volume set ${V0} read-after-open off</div><div class='add'>+TEST ${CLI} volume start ${V0}</div><div class='add'>+</div><div class='add'>+TEST ${GFS} --volfile-id=/${V0} --volfile-server=${H0} ${M0};</div><div class='add'>+</div><div class='add'>+BRICK_PID="$(get_brick_pid ${V0} ${H0} ${B0}/${V0})"</div><div class='add'>+</div><div class='add'>+TEST touch "${M0}/test"</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+TEST ${GFS} --volfile-id=/${V0} --volfile-server=${H0} ${M0};</div><div class='add'>+</div><div class='add'>+TEST tester_start</div><div class='add'>+</div><div class='add'>+TEST tester_send fd open 0 "${M0}/test"</div><div class='add'>+EXPECT_WITHIN 5 "1" count_open "/test"</div><div class='add'>+TEST tester_send fd close 0</div><div class='add'>+EXPECT_WITHIN 5 "0" count_open "/test"</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+TEST ${CLI} volume set ${V0} lazy-open on</div><div class='add'>+TEST ${GFS} --volfile-id=/${V0} --volfile-server=${H0} ${M0};</div><div class='add'>+</div><div class='add'>+TEST tester_send fd open 0 "${M0}/test"</div><div class='add'>+sleep 2</div><div class='add'>+EXPECT "0" count_open "/test"</div><div class='add'>+TEST tester_send fd write 0 "test"</div><div class='add'>+EXPECT "1" count_open "/test"</div><div class='add'>+TEST tester_send fd close 0</div><div class='add'>+EXPECT_WITHIN 5 "0" count_open "/test"</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+TEST ${GFS} --volfile-id=/${V0} --volfile-server=${H0} ${M0};</div><div class='add'>+</div><div class='add'>+TEST tester_send fd open 0 "${M0}/test"</div><div class='add'>+EXPECT "0" count_open "/test"</div><div class='add'>+EXPECT "test" tester_send fd read 0 64</div><div class='add'>+# Even though read-after-open is disabled, use-anonymous-fd is also disabled,</div><div class='add'>+# so reads need to open the file first.</div><div class='add'>+EXPECT "1" count_open "/test"</div><div class='add'>+TEST tester_send fd close 0</div><div class='add'>+EXPECT "0" count_open "/test"</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+TEST ${GFS} --volfile-id=/${V0} --volfile-server=${H0} ${M0};</div><div class='add'>+</div><div class='add'>+TEST tester_send fd open 0 "${M0}/test"</div><div class='add'>+EXPECT "0" count_open "/test"</div><div class='add'>+TEST tester_send fd open 1 "${M0}/test"</div><div class='add'>+EXPECT "2" count_open "/test"</div><div class='add'>+TEST tester_send fd close 0</div><div class='add'>+EXPECT_WITHIN 5 "1" count_open "/test"</div><div class='add'>+TEST tester_send fd close 1</div><div class='add'>+EXPECT_WITHIN 5 "0" count_open "/test"</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+TEST ${CLI} volume set ${V0} read-after-open on</div><div class='add'>+TEST ${GFS} --volfile-id=/${V0} --volfile-server=${H0} ${M0};</div><div class='add'>+</div><div class='add'>+TEST tester_send fd open 0 "${M0}/test"</div><div class='add'>+EXPECT "0" count_open "/test"</div><div class='add'>+EXPECT "test" tester_send fd read 0 64</div><div class='add'>+EXPECT "1" count_open "/test"</div><div class='add'>+TEST tester_send fd close 0</div><div class='add'>+EXPECT_WITHIN 5 "0" count_open "/test"</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+</div><div class='add'>+TEST tester_stop</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/basic/open-behind/tester-fd.c b/tests/basic/open-behind/tester-fd.c<br/>new file mode 100644<br/>index 00000000000..00f02bc5b0a<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/open-behind/tester-fd.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/open-behind/tester-fd.c</a></div><div class='hunk'>@@ -0,0 +1,99 @@</div><div class='add'>+/*</div><div class='add'>+  Copyright (c) 2020 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#include "tester.h"</div><div class='add'>+</div><div class='add'>+#include &lt;stdlib.h&gt;</div><div class='add'>+#include &lt;unistd.h&gt;</div><div class='add'>+#include &lt;sys/types.h&gt;</div><div class='add'>+#include &lt;sys/stat.h&gt;</div><div class='add'>+#include &lt;fcntl.h&gt;</div><div class='add'>+#include &lt;string.h&gt;</div><div class='add'>+#include &lt;ctype.h&gt;</div><div class='add'>+#include &lt;errno.h&gt;</div><div class='add'>+</div><div class='add'>+static int32_t</div><div class='add'>+fd_open(context_t *ctx, command_t *cmd)</div><div class='add'>+{</div><div class='add'>+    obj_t *obj;</div><div class='add'>+    int32_t fd;</div><div class='add'>+</div><div class='add'>+    obj = cmd-&gt;args[0].obj.ref;</div><div class='add'>+</div><div class='add'>+    fd = open(cmd-&gt;args[1].str.data, O_RDWR);</div><div class='add'>+    if (fd &lt; 0) {</div><div class='add'>+        return error(errno, "open() failed");</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    obj-&gt;type = OBJ_TYPE_FD;</div><div class='add'>+    obj-&gt;fd = fd;</div><div class='add'>+</div><div class='add'>+    out_ok("%d", fd);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int32_t</div><div class='add'>+fd_close(context_t *ctx, command_t *cmd)</div><div class='add'>+{</div><div class='add'>+    obj_t *obj;</div><div class='add'>+</div><div class='add'>+    obj = cmd-&gt;args[0].obj.ref;</div><div class='add'>+    obj-&gt;type = OBJ_TYPE_NONE;</div><div class='add'>+</div><div class='add'>+    if (close(obj-&gt;fd) != 0) {</div><div class='add'>+        return error(errno, "close() failed");</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    out_ok();</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int32_t</div><div class='add'>+fd_write(context_t *ctx, command_t *cmd)</div><div class='add'>+{</div><div class='add'>+    ssize_t len, ret;</div><div class='add'>+</div><div class='add'>+    len = strlen(cmd-&gt;args[1].str.data);</div><div class='add'>+    ret = write(cmd-&gt;args[0].obj.ref-&gt;fd, cmd-&gt;args[1].str.data, len);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        return error(errno, "write() failed");</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    out_ok("%zd", ret);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int32_t</div><div class='add'>+fd_read(context_t *ctx, command_t *cmd)</div><div class='add'>+{</div><div class='add'>+    char data[cmd-&gt;args[1].num.value + 1];</div><div class='add'>+    ssize_t ret;</div><div class='add'>+</div><div class='add'>+    ret = read(cmd-&gt;args[0].obj.ref-&gt;fd, data, cmd-&gt;args[1].num.value);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        return error(errno, "read() failed");</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    data[ret] = 0;</div><div class='add'>+</div><div class='add'>+    out_ok("%zd %s", ret, data);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+command_t fd_commands[] = {</div><div class='add'>+    {"open", fd_open, CMD_ARGS(ARG_VAL(OBJ_TYPE_NONE), ARG_STR(1024))},</div><div class='add'>+    {"close", fd_close, CMD_ARGS(ARG_VAL(OBJ_TYPE_FD))},</div><div class='add'>+    {"write", fd_write, CMD_ARGS(ARG_VAL(OBJ_TYPE_FD), ARG_STR(1024))},</div><div class='add'>+    {"read", fd_read, CMD_ARGS(ARG_VAL(OBJ_TYPE_FD), ARG_NUM(0, 1024))},</div><div class='add'>+    CMD_END};</div><div class='head'>diff --git a/tests/basic/open-behind/tester.c b/tests/basic/open-behind/tester.c<br/>new file mode 100644<br/>index 00000000000..b2da71c8385<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/open-behind/tester.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/open-behind/tester.c</a></div><div class='hunk'>@@ -0,0 +1,444 @@</div><div class='add'>+/*</div><div class='add'>+  Copyright (c) 2020 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#include "tester.h"</div><div class='add'>+</div><div class='add'>+#include &lt;stdlib.h&gt;</div><div class='add'>+#include &lt;unistd.h&gt;</div><div class='add'>+#include &lt;string.h&gt;</div><div class='add'>+#include &lt;ctype.h&gt;</div><div class='add'>+#include &lt;errno.h&gt;</div><div class='add'>+</div><div class='add'>+static void *</div><div class='add'>+mem_alloc(size_t size)</div><div class='add'>+{</div><div class='add'>+    void *ptr;</div><div class='add'>+</div><div class='add'>+    ptr = malloc(size);</div><div class='add'>+    if (ptr == NULL) {</div><div class='add'>+        error(ENOMEM, "Failed to allocate memory (%zu bytes)", size);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return ptr;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+mem_free(void *ptr)</div><div class='add'>+{</div><div class='add'>+    free(ptr);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static bool</div><div class='add'>+buffer_create(context_t *ctx, size_t size)</div><div class='add'>+{</div><div class='add'>+    ctx-&gt;buffer.base = mem_alloc(size);</div><div class='add'>+    if (ctx-&gt;buffer.base == NULL) {</div><div class='add'>+        return false;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ctx-&gt;buffer.size = size;</div><div class='add'>+    ctx-&gt;buffer.len = 0;</div><div class='add'>+    ctx-&gt;buffer.pos = 0;</div><div class='add'>+</div><div class='add'>+    return true;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+buffer_destroy(context_t *ctx)</div><div class='add'>+{</div><div class='add'>+    mem_free(ctx-&gt;buffer.base);</div><div class='add'>+    ctx-&gt;buffer.size = 0;</div><div class='add'>+    ctx-&gt;buffer.len = 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int32_t</div><div class='add'>+buffer_get(context_t *ctx)</div><div class='add'>+{</div><div class='add'>+    ssize_t len;</div><div class='add'>+</div><div class='add'>+    if (ctx-&gt;buffer.pos &gt;= ctx-&gt;buffer.len) {</div><div class='add'>+        len = read(0, ctx-&gt;buffer.base, ctx-&gt;buffer.size);</div><div class='add'>+        if (len &lt; 0) {</div><div class='add'>+            return error(errno, "read() failed");</div><div class='add'>+        }</div><div class='add'>+        if (len == 0) {</div><div class='add'>+            return 0;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        ctx-&gt;buffer.len = len;</div><div class='add'>+        ctx-&gt;buffer.pos = 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return ctx-&gt;buffer.base[ctx-&gt;buffer.pos++];</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int32_t</div><div class='add'>+str_skip_spaces(context_t *ctx, int32_t current)</div><div class='add'>+{</div><div class='add'>+    while ((current &gt; 0) &amp;&amp; (current != '\n') &amp;&amp; isspace(current)) {</div><div class='add'>+        current = buffer_get(ctx);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return current;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int32_t</div><div class='add'>+str_token(context_t *ctx, char *buffer, uint32_t size, int32_t current)</div><div class='add'>+{</div><div class='add'>+    uint32_t len;</div><div class='add'>+</div><div class='add'>+    current = str_skip_spaces(ctx, current);</div><div class='add'>+</div><div class='add'>+    len = 0;</div><div class='add'>+    while ((size &gt; 0) &amp;&amp; (current &gt; 0) &amp;&amp; (current != '\n') &amp;&amp;</div><div class='add'>+           !isspace(current)) {</div><div class='add'>+        len++;</div><div class='add'>+        *buffer++ = current;</div><div class='add'>+        size--;</div><div class='add'>+        current = buffer_get(ctx);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (len == 0) {</div><div class='add'>+        return error(ENODATA, "Expecting a token");</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (size == 0) {</div><div class='add'>+        return error(ENOBUFS, "Token too long");</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    *buffer = 0;</div><div class='add'>+</div><div class='add'>+    return current;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int32_t</div><div class='add'>+str_number(context_t *ctx, uint64_t min, uint64_t max, uint64_t *value,</div><div class='add'>+           int32_t current)</div><div class='add'>+{</div><div class='add'>+    char text[32], *ptr;</div><div class='add'>+    uint64_t num;</div><div class='add'>+</div><div class='add'>+    current = str_token(ctx, text, sizeof(text), current);</div><div class='add'>+    if (current &gt; 0) {</div><div class='add'>+        num = strtoul(text, &amp;ptr, 0);</div><div class='add'>+        if ((*ptr != 0) || (num &lt; min) || (num &gt; max)) {</div><div class='add'>+            return error(ERANGE, "Invalid number");</div><div class='add'>+        }</div><div class='add'>+        *value = num;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return current;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int32_t</div><div class='add'>+str_eol(context_t *ctx, int32_t current)</div><div class='add'>+{</div><div class='add'>+    current = str_skip_spaces(ctx, current);</div><div class='add'>+    if (current != '\n') {</div><div class='add'>+        return error(EINVAL, "Expecting end of command");</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return current;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+str_skip(context_t *ctx, int32_t current)</div><div class='add'>+{</div><div class='add'>+    while ((current &gt; 0) &amp;&amp; (current != '\n')) {</div><div class='add'>+        current = buffer_get(ctx);</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int32_t</div><div class='add'>+cmd_parse_obj(context_t *ctx, arg_t *arg, int32_t current)</div><div class='add'>+{</div><div class='add'>+    obj_t *obj;</div><div class='add'>+    uint64_t id;</div><div class='add'>+</div><div class='add'>+    current = str_number(ctx, 0, ctx-&gt;obj_count, &amp;id, current);</div><div class='add'>+    if (current &lt;= 0) {</div><div class='add'>+        return current;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    obj = &amp;ctx-&gt;objs[id];</div><div class='add'>+    if (obj-&gt;type != arg-&gt;obj.type) {</div><div class='add'>+        if (obj-&gt;type != OBJ_TYPE_NONE) {</div><div class='add'>+            return error(EBUSY, "Object is in use");</div><div class='add'>+        }</div><div class='add'>+        return error(ENOENT, "Object is not defined");</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    arg-&gt;obj.ref = obj;</div><div class='add'>+</div><div class='add'>+    return current;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int32_t</div><div class='add'>+cmd_parse_num(context_t *ctx, arg_t *arg, int32_t current)</div><div class='add'>+{</div><div class='add'>+    return str_number(ctx, arg-&gt;num.min, arg-&gt;num.max, &amp;arg-&gt;num.value,</div><div class='add'>+                      current);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int32_t</div><div class='add'>+cmd_parse_str(context_t *ctx, arg_t *arg, int32_t current)</div><div class='add'>+{</div><div class='add'>+    return str_token(ctx, arg-&gt;str.data, arg-&gt;str.size, current);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int32_t</div><div class='add'>+cmd_parse_args(context_t *ctx, command_t *cmd, int32_t current)</div><div class='add'>+{</div><div class='add'>+    arg_t *arg;</div><div class='add'>+</div><div class='add'>+    for (arg = cmd-&gt;args; arg-&gt;type != ARG_TYPE_NONE; arg++) {</div><div class='add'>+        switch (arg-&gt;type) {</div><div class='add'>+            case ARG_TYPE_OBJ:</div><div class='add'>+                current = cmd_parse_obj(ctx, arg, current);</div><div class='add'>+                break;</div><div class='add'>+            case ARG_TYPE_NUM:</div><div class='add'>+                current = cmd_parse_num(ctx, arg, current);</div><div class='add'>+                break;</div><div class='add'>+            case ARG_TYPE_STR:</div><div class='add'>+                current = cmd_parse_str(ctx, arg, current);</div><div class='add'>+                break;</div><div class='add'>+            default:</div><div class='add'>+                return error(EINVAL, "Unknown argument type");</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (current &lt; 0) {</div><div class='add'>+        return current;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    current = str_eol(ctx, current);</div><div class='add'>+    if (current &lt;= 0) {</div><div class='add'>+        return error(EINVAL, "Syntax error");</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return cmd-&gt;handler(ctx, cmd);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int32_t</div><div class='add'>+cmd_parse(context_t *ctx, command_t *cmds)</div><div class='add'>+{</div><div class='add'>+    char text[32];</div><div class='add'>+    command_t *cmd;</div><div class='add'>+    int32_t current;</div><div class='add'>+</div><div class='add'>+    cmd = cmds;</div><div class='add'>+    do {</div><div class='add'>+        current = str_token(ctx, text, sizeof(text), buffer_get(ctx));</div><div class='add'>+        if (current &lt;= 0) {</div><div class='add'>+            return current;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        while (cmd-&gt;name != NULL) {</div><div class='add'>+            if (strcmp(cmd-&gt;name, text) == 0) {</div><div class='add'>+                if (cmd-&gt;handler != NULL) {</div><div class='add'>+                    return cmd_parse_args(ctx, cmd, current);</div><div class='add'>+                }</div><div class='add'>+                cmd = cmd-&gt;cmds;</div><div class='add'>+                break;</div><div class='add'>+            }</div><div class='add'>+            cmd++;</div><div class='add'>+        }</div><div class='add'>+    } while (cmd-&gt;name != NULL);</div><div class='add'>+</div><div class='add'>+    str_skip(ctx, current);</div><div class='add'>+</div><div class='add'>+    return error(ENOTSUP, "Unknown command");</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+cmd_fini(context_t *ctx, command_t *cmds)</div><div class='add'>+{</div><div class='add'>+    command_t *cmd;</div><div class='add'>+    arg_t *arg;</div><div class='add'>+</div><div class='add'>+    for (cmd = cmds; cmd-&gt;name != NULL; cmd++) {</div><div class='add'>+        if (cmd-&gt;handler == NULL) {</div><div class='add'>+            cmd_fini(ctx, cmd-&gt;cmds);</div><div class='add'>+        } else {</div><div class='add'>+            for (arg = cmd-&gt;args; arg-&gt;type != ARG_TYPE_NONE; arg++) {</div><div class='add'>+                switch (arg-&gt;type) {</div><div class='add'>+                    case ARG_TYPE_STR:</div><div class='add'>+                        mem_free(arg-&gt;str.data);</div><div class='add'>+                        arg-&gt;str.data = NULL;</div><div class='add'>+                        break;</div><div class='add'>+                    default:</div><div class='add'>+                        break;</div><div class='add'>+                }</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static bool</div><div class='add'>+cmd_init(context_t *ctx, command_t *cmds)</div><div class='add'>+{</div><div class='add'>+    command_t *cmd;</div><div class='add'>+    arg_t *arg;</div><div class='add'>+</div><div class='add'>+    for (cmd = cmds; cmd-&gt;name != NULL; cmd++) {</div><div class='add'>+        if (cmd-&gt;handler == NULL) {</div><div class='add'>+            if (!cmd_init(ctx, cmd-&gt;cmds)) {</div><div class='add'>+                return false;</div><div class='add'>+            }</div><div class='add'>+        } else {</div><div class='add'>+            for (arg = cmd-&gt;args; arg-&gt;type != ARG_TYPE_NONE; arg++) {</div><div class='add'>+                switch (arg-&gt;type) {</div><div class='add'>+                    case ARG_TYPE_STR:</div><div class='add'>+                        arg-&gt;str.data = mem_alloc(arg-&gt;str.size);</div><div class='add'>+                        if (arg-&gt;str.data == NULL) {</div><div class='add'>+                            return false;</div><div class='add'>+                        }</div><div class='add'>+                        break;</div><div class='add'>+                    default:</div><div class='add'>+                        break;</div><div class='add'>+                }</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return true;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static bool</div><div class='add'>+objs_create(context_t *ctx, uint32_t count)</div><div class='add'>+{</div><div class='add'>+    uint32_t i;</div><div class='add'>+</div><div class='add'>+    ctx-&gt;objs = mem_alloc(sizeof(obj_t) * count);</div><div class='add'>+    if (ctx-&gt;objs == NULL) {</div><div class='add'>+        return false;</div><div class='add'>+    }</div><div class='add'>+    ctx-&gt;obj_count = count;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; count; i++) {</div><div class='add'>+        ctx-&gt;objs[i].type = OBJ_TYPE_NONE;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return true;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int32_t</div><div class='add'>+objs_destroy(context_t *ctx)</div><div class='add'>+{</div><div class='add'>+    uint32_t i;</div><div class='add'>+    int32_t err;</div><div class='add'>+</div><div class='add'>+    err = 0;</div><div class='add'>+    for (i = 0; i &lt; ctx-&gt;obj_count; i++) {</div><div class='add'>+        if (ctx-&gt;objs[i].type != OBJ_TYPE_NONE) {</div><div class='add'>+            err = error(ENOTEMPTY, "Objects not destroyed");</div><div class='add'>+            break;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    mem_free(ctx-&gt;objs);</div><div class='add'>+    ctx-&gt;objs = NULL;</div><div class='add'>+    ctx-&gt;obj_count = 0;</div><div class='add'>+</div><div class='add'>+    return err;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static context_t *</div><div class='add'>+init(size_t size, uint32_t objs, command_t *cmds)</div><div class='add'>+{</div><div class='add'>+    context_t *ctx;</div><div class='add'>+</div><div class='add'>+    ctx = mem_alloc(sizeof(context_t));</div><div class='add'>+    if (ctx == NULL) {</div><div class='add'>+        goto failed;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (!buffer_create(ctx, size)) {</div><div class='add'>+        goto failed_ctx;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (!objs_create(ctx, objs)) {</div><div class='add'>+        goto failed_buffer;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (!cmd_init(ctx, cmds)) {</div><div class='add'>+        goto failed_objs;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ctx-&gt;active = true;</div><div class='add'>+</div><div class='add'>+    return ctx;</div><div class='add'>+</div><div class='add'>+failed_objs:</div><div class='add'>+    cmd_fini(ctx, cmds);</div><div class='add'>+    objs_destroy(ctx);</div><div class='add'>+failed_buffer:</div><div class='add'>+    buffer_destroy(ctx);</div><div class='add'>+failed_ctx:</div><div class='add'>+    mem_free(ctx);</div><div class='add'>+failed:</div><div class='add'>+    return NULL;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int32_t</div><div class='add'>+fini(context_t *ctx, command_t *cmds)</div><div class='add'>+{</div><div class='add'>+    int32_t ret;</div><div class='add'>+</div><div class='add'>+    cmd_fini(ctx, cmds);</div><div class='add'>+    buffer_destroy(ctx);</div><div class='add'>+</div><div class='add'>+    ret = objs_destroy(ctx);</div><div class='add'>+</div><div class='add'>+    ctx-&gt;active = false;</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int32_t</div><div class='add'>+exec_quit(context_t *ctx, command_t *cmd)</div><div class='add'>+{</div><div class='add'>+    ctx-&gt;active = false;</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static command_t commands[] = {{"fd", NULL, CMD_SUB(fd_commands)},</div><div class='add'>+                               {"quit", exec_quit, CMD_ARGS()},</div><div class='add'>+                               CMD_END};</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+main(int32_t argc, char *argv[])</div><div class='add'>+{</div><div class='add'>+    context_t *ctx;</div><div class='add'>+    int32_t res;</div><div class='add'>+</div><div class='add'>+    ctx = init(1024, 16, commands);</div><div class='add'>+    if (ctx == NULL) {</div><div class='add'>+        return 1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    do {</div><div class='add'>+        res = cmd_parse(ctx, commands);</div><div class='add'>+        if (res &lt; 0) {</div><div class='add'>+            out_err(-res);</div><div class='add'>+        }</div><div class='add'>+    } while (ctx-&gt;active);</div><div class='add'>+</div><div class='add'>+    res = fini(ctx, commands);</div><div class='add'>+    if (res &gt;= 0) {</div><div class='add'>+        out_ok();</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    out_err(-res);</div><div class='add'>+</div><div class='add'>+    return 1;</div><div class='add'>+}</div><div class='head'>diff --git a/tests/basic/open-behind/tester.h b/tests/basic/open-behind/tester.h<br/>new file mode 100644<br/>index 00000000000..64e940c78fc<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/open-behind/tester.h?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/open-behind/tester.h</a></div><div class='hunk'>@@ -0,0 +1,145 @@</div><div class='add'>+/*</div><div class='add'>+  Copyright (c) 2020 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#ifndef __TESTER_H__</div><div class='add'>+#define __TESTER_H__</div><div class='add'>+</div><div class='add'>+#include &lt;stdio.h&gt;</div><div class='add'>+#include &lt;inttypes.h&gt;</div><div class='add'>+#include &lt;stdbool.h&gt;</div><div class='add'>+</div><div class='add'>+enum _obj_type;</div><div class='add'>+typedef enum _obj_type obj_type_t;</div><div class='add'>+</div><div class='add'>+enum _arg_type;</div><div class='add'>+typedef enum _arg_type arg_type_t;</div><div class='add'>+</div><div class='add'>+struct _buffer;</div><div class='add'>+typedef struct _buffer buffer_t;</div><div class='add'>+</div><div class='add'>+struct _obj;</div><div class='add'>+typedef struct _obj obj_t;</div><div class='add'>+</div><div class='add'>+struct _context;</div><div class='add'>+typedef struct _context context_t;</div><div class='add'>+</div><div class='add'>+struct _arg;</div><div class='add'>+typedef struct _arg arg_t;</div><div class='add'>+</div><div class='add'>+struct _command;</div><div class='add'>+typedef struct _command command_t;</div><div class='add'>+</div><div class='add'>+enum _obj_type { OBJ_TYPE_NONE, OBJ_TYPE_FD };</div><div class='add'>+</div><div class='add'>+enum _arg_type { ARG_TYPE_NONE, ARG_TYPE_OBJ, ARG_TYPE_NUM, ARG_TYPE_STR };</div><div class='add'>+</div><div class='add'>+struct _buffer {</div><div class='add'>+    char *base;</div><div class='add'>+    uint32_t size;</div><div class='add'>+    uint32_t len;</div><div class='add'>+    uint32_t pos;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct _obj {</div><div class='add'>+    obj_type_t type;</div><div class='add'>+    union {</div><div class='add'>+        int32_t fd;</div><div class='add'>+    };</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct _context {</div><div class='add'>+    obj_t *objs;</div><div class='add'>+    buffer_t buffer;</div><div class='add'>+    uint32_t obj_count;</div><div class='add'>+    bool active;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct _arg {</div><div class='add'>+    arg_type_t type;</div><div class='add'>+    union {</div><div class='add'>+        struct {</div><div class='add'>+            obj_type_t type;</div><div class='add'>+            obj_t *ref;</div><div class='add'>+        } obj;</div><div class='add'>+        struct {</div><div class='add'>+            uint64_t value;</div><div class='add'>+            uint64_t min;</div><div class='add'>+            uint64_t max;</div><div class='add'>+        } num;</div><div class='add'>+        struct {</div><div class='add'>+            uint32_t size;</div><div class='add'>+            char *data;</div><div class='add'>+        } str;</div><div class='add'>+    };</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct _command {</div><div class='add'>+    const char *name;</div><div class='add'>+    int32_t (*handler)(context_t *ctx, command_t *cmd);</div><div class='add'>+    union {</div><div class='add'>+        arg_t *args;</div><div class='add'>+        command_t *cmds;</div><div class='add'>+    };</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+#define msg(_stream, _fmt, _args...)                                           \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        fprintf(_stream, _fmt "\n", ##_args);                                  \</div><div class='add'>+        fflush(_stream);                                                       \</div><div class='add'>+    } while (0)</div><div class='add'>+</div><div class='add'>+#define msg_out(_fmt, _args...) msg(stdout, _fmt, ##_args)</div><div class='add'>+#define msg_err(_err, _fmt, _args...)                                          \</div><div class='add'>+    ({                                                                         \</div><div class='add'>+        int32_t __msg_err = (_err);                                            \</div><div class='add'>+        msg(stderr, "[%4u:%-15s] " _fmt, __LINE__, __FUNCTION__, __msg_err,    \</div><div class='add'>+            ##_args);                                                          \</div><div class='add'>+        -__msg_err;                                                            \</div><div class='add'>+    })</div><div class='add'>+</div><div class='add'>+#define error(_err, _fmt, _args...) msg_err(_err, "E(%4d) " _fmt, ##_args)</div><div class='add'>+#define warn(_err, _fmt, _args...) msg_err(_err, "W(%4d) " _fmt, ##_args)</div><div class='add'>+#define info(_err, _fmt, _args...) msg_err(_err, "I(%4d) " _fmt, ##_args)</div><div class='add'>+</div><div class='add'>+#define out_ok(_args...) msg_out("OK " _args)</div><div class='add'>+#define out_err(_err) msg_out("ERR %d", _err)</div><div class='add'>+</div><div class='add'>+#define ARG_END                                                                \</div><div class='add'>+    {                                                                          \</div><div class='add'>+        ARG_TYPE_NONE                                                          \</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+#define CMD_ARGS1(_x, _args...)                                                \</div><div class='add'>+    .args = (arg_t[]) { _args }</div><div class='add'>+#define CMD_ARGS(_args...) CMD_ARGS1(, ##_args, ARG_END)</div><div class='add'>+</div><div class='add'>+#define CMD_SUB(_cmds) .cmds = _cmds</div><div class='add'>+</div><div class='add'>+#define CMD_END                                                                \</div><div class='add'>+    {                                                                          \</div><div class='add'>+        NULL, NULL, CMD_SUB(NULL)                                              \</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+#define ARG_VAL(_type)                                                         \</div><div class='add'>+    {                                                                          \</div><div class='add'>+        ARG_TYPE_OBJ, .obj = {.type = _type }                                  \</div><div class='add'>+    }</div><div class='add'>+#define ARG_NUM(_min, _max)                                                    \</div><div class='add'>+    {                                                                          \</div><div class='add'>+        ARG_TYPE_NUM, .num = {.min = _min, .max = _max }                       \</div><div class='add'>+    }</div><div class='add'>+#define ARG_STR(_size)                                                         \</div><div class='add'>+    {                                                                          \</div><div class='add'>+        ARG_TYPE_STR, .str = {.size = _size }                                  \</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+extern command_t fd_commands[];</div><div class='add'>+</div><div class='add'>+#endif /* __TESTER_H__ */
\ No newline at end of file</div><div class='head'>diff --git a/tests/basic/open-fd-snap-delete.t b/tests/basic/open-fd-snap-delete.t<br/>new file mode 100644<br/>index 00000000000..a9f47cac19d<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/open-fd-snap-delete.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/open-fd-snap-delete.t</a></div><div class='hunk'>@@ -0,0 +1,74 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../include.rc</div><div class='add'>+. $(dirname $0)/../volume.rc</div><div class='add'>+. $(dirname $0)/../snapshot.rc</div><div class='add'>+. $(dirname $0)/../fileio.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST init_n_bricks 3;</div><div class='add'>+TEST setup_lvm 3;</div><div class='add'>+</div><div class='add'>+# start glusterd</div><div class='add'>+TEST glusterd;</div><div class='add'>+</div><div class='add'>+TEST pidof glusterd;</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 $H0:$L1 $H0:$L2 $H0:$L3;</div><div class='add'>+TEST $CLI volume set $V0 nfs.disable false</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+</div><div class='add'>+TEST $GFS --volfile-server=$H0 --volfile-id=$V0 $M0;</div><div class='add'>+</div><div class='add'>+for i in {1..10} ; do echo "file" &gt; $M0/file$i ; done</div><div class='add'>+</div><div class='add'>+# Create file and directory</div><div class='add'>+TEST touch $M0/f1</div><div class='add'>+TEST mkdir $M0/dir</div><div class='add'>+</div><div class='add'>+TEST $CLI snapshot config activate-on-create enable</div><div class='add'>+TEST $CLI volume set $V0 features.uss enable;</div><div class='add'>+</div><div class='add'>+for i in {1..10} ; do echo "file" &gt; $M0/dir/file$i ; done</div><div class='add'>+</div><div class='add'>+TEST $CLI snapshot create snap1 $V0 no-timestamp;</div><div class='add'>+</div><div class='add'>+for i in {11..20} ; do echo "file" &gt; $M0/file$i ; done</div><div class='add'>+for i in {11..20} ; do echo "file" &gt; $M0/dir/file$i ; done</div><div class='add'>+</div><div class='add'>+TEST $CLI snapshot create snap2 $V0 no-timestamp;</div><div class='add'>+</div><div class='add'>+TEST fd1=`fd_available`</div><div class='add'>+TEST fd_open $fd1 'r' $M0/.snaps/snap2/dir/file11;</div><div class='add'>+TEST fd_cat $fd1</div><div class='add'>+</div><div class='add'>+TEST $CLI snapshot delete snap2;</div><div class='add'>+</div><div class='add'>+TEST ! fd_cat $fd1;</div><div class='add'>+</div><div class='add'>+# the return value of this command (i.e. fd_close) depetends</div><div class='add'>+# mainly on how the release operation on a file descriptor is</div><div class='add'>+# handled in snapview-server process. As of now snapview-server</div><div class='add'>+# returns 0 for the release operation. And it is similar to how</div><div class='add'>+# posix xlator does. So, as of now the expectation is to receive</div><div class='add'>+# success for the close operation.</div><div class='add'>+TEST fd_close $fd1;</div><div class='add'>+</div><div class='add'>+# This check is mainly to ensure that the snapshot daemon</div><div class='add'>+# (snapd) is up and running. If it is not running, the following</div><div class='add'>+# stat would receive ENOTCONN.</div><div class='add'>+</div><div class='add'>+TEST stat $M0/.snaps/snap1/dir/file1</div><div class='add'>+</div><div class='add'>+TEST $CLI snapshot delete snap1;</div><div class='add'>+</div><div class='add'>+TEST rm -rf $M0/*;</div><div class='add'>+</div><div class='add'>+TEST $CLI volume stop $V0;</div><div class='add'>+</div><div class='add'>+TEST $CLI volume delete $V0;</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/basic/peer-parsing.t b/tests/basic/peer-parsing.t<br/>new file mode 100644<br/>index 00000000000..813b65e2ae1<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/peer-parsing.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/peer-parsing.t</a></div><div class='hunk'>@@ -0,0 +1,52 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../include.rc</div><div class='add'>+</div><div class='add'>+PEER_DIR="$GLUSTERD_WORKDIR"/peers</div><div class='add'>+TEST mkdir -p $PEER_DIR</div><div class='add'>+</div><div class='add'>+declare -i HOST_NUM=100</div><div class='add'>+</div><div class='add'>+create_random_peer_files() {</div><div class='add'>+        for i in $(seq 0 9); do</div><div class='add'>+                local peer_uuid=$(uuidgen)</div><div class='add'>+                # The rules for quoting and variable substitution in</div><div class='add'>+                # here documents would force this to be even less</div><div class='add'>+                # readable that way.</div><div class='add'>+                (</div><div class='add'>+                        echo "state=1"</div><div class='add'>+                        echo "uuid=$peer_uuid"</div><div class='add'>+                        echo "hostname=127.0.0.$HOST_NUM"</div><div class='add'>+                ) &gt; $PEER_DIR/$peer_uuid</div><div class='add'>+                HOST_NUM+=1</div><div class='add'>+        done</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+create_non_peer_file() {</div><div class='add'>+        echo "random stuff" &gt; $PEER_DIR/not_a_peer_file</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+create_malformed_peer_file() {</div><div class='add'>+        echo "more random stuff" &gt; $PEER_DIR/$(uuidgen)</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+# We create lots of files, in batches, to ensure that our bogus ones are</div><div class='add'>+# properly interspersed with the valid ones.</div><div class='add'>+</div><div class='add'>+TEST create_random_peer_files</div><div class='add'>+TEST create_non_peer_file</div><div class='add'>+TEST create_random_peer_files</div><div class='add'>+TEST create_malformed_peer_file</div><div class='add'>+TEST create_random_peer_files</div><div class='add'>+</div><div class='add'>+# There should be 30 peers, not counting the two bogus files.</div><div class='add'>+TEST glusterd</div><div class='add'>+N_PEERS=$($CLI peer status | grep ^Uuid: | wc -l)</div><div class='add'>+TEST [ "$N_PEERS" = "30" ]</div><div class='add'>+</div><div class='add'>+# For extra credit, check the logs for messages about bogus files.</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+</div><div class='head'>diff --git a/tests/basic/pgfid-feat.t b/tests/basic/pgfid-feat.t<br/>new file mode 100644<br/>index 00000000000..a7baeec7b7a<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/pgfid-feat.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/pgfid-feat.t</a></div><div class='hunk'>@@ -0,0 +1,35 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../include.rc</div><div class='add'>+. $(dirname $0)/../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+function get_ancestry_path() {</div><div class='add'>+	local path=$1</div><div class='add'>+	local ancestry=$(getfattr --absolute-names -e text -n glusterfs.ancestry.path "$M0/$path" | grep "^glusterfs.ancestry.path" | cut -d"=" -f2 | tr -d \");</div><div class='add'>+	echo $ancestry;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume info;</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 replica 2  $H0:$B0/${V0}{1,2,3,4};</div><div class='add'>+TEST $CLI volume set $V0 build-pgfid on;</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+TEST $GFS -s $H0 --volfile-id $V0 $M0;</div><div class='add'>+</div><div class='add'>+TEST mkdir $M0/a;</div><div class='add'>+TEST touch $M0/a/b;</div><div class='add'>+</div><div class='add'>+EXPECT "/a/b" get_ancestry_path "/a/b";</div><div class='add'>+</div><div class='add'>+TEST $CLI volume set $V0 build-pgfid off;</div><div class='add'>+EXPECT "" get_ancestry_path "/a/b";</div><div class='add'>+</div><div class='add'>+TEST $CLI volume stop $V0;</div><div class='add'>+TEST $CLI volume delete $V0;</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/basic/playground/template-xlator-sanity.t b/tests/basic/playground/template-xlator-sanity.t<br/>new file mode 100755<br/>index 00000000000..1c665502bfe<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/playground/template-xlator-sanity.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/playground/template-xlator-sanity.t</a></div><div class='hunk'>@@ -0,0 +1,43 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST mkdir -p $B0/single-brick</div><div class='add'>+cat &gt; $B0/template.vol &lt;&lt;EOF</div><div class='add'>+volume posix</div><div class='add'>+  type storage/posix</div><div class='add'>+  option directory $B0/single-brick</div><div class='add'>+end-volume</div><div class='add'>+</div><div class='add'>+volume template</div><div class='add'>+  type playground/template</div><div class='add'>+  subvolumes posix</div><div class='add'>+  option dummy 13</div><div class='add'>+end-volume</div><div class='add'>+EOF</div><div class='add'>+</div><div class='add'>+TEST glusterfs -f $B0/template.vol $M0</div><div class='add'>+</div><div class='add'>+TEST $(dirname $0)/../rpc-coverage.sh --no-locks $M0</div><div class='add'>+</div><div class='add'>+# Take statedump to get maximum code coverage</div><div class='add'>+pid=$(ps auxww | grep glusterfs | grep -E "template.vol" | awk '{print $2}' | head -1)</div><div class='add'>+</div><div class='add'>+TEST generate_statedump $pid</div><div class='add'>+</div><div class='add'>+# For monitor output</div><div class='add'>+kill -USR2 $pid</div><div class='add'>+</div><div class='add'>+# Handle SIGHUP and reconfigure</div><div class='add'>+sed -i -e '/s/dummy 13/dummy 42/g' $B0/template.vol</div><div class='add'>+kill -HUP $pid</div><div class='add'>+</div><div class='add'>+# for calling 'fini()'</div><div class='add'>+kill -TERM $pid</div><div class='add'>+</div><div class='add'>+force_umount $M0</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/basic/posix/shared-statfs.t b/tests/basic/posix/shared-statfs.t<br/>new file mode 100644<br/>index 00000000000..0e4a1bb409f<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/posix/shared-statfs.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/posix/shared-statfs.t</a></div><div class='hunk'>@@ -0,0 +1,58 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+#Test that statfs is not served from posix backend FS.</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+TEST glusterd</div><div class='add'>+</div><div class='add'>+#Create brick partitions</div><div class='add'>+TEST truncate -s 100M $B0/brick1</div><div class='add'>+TEST truncate -s 100M $B0/brick2</div><div class='add'>+LO1=`SETUP_LOOP $B0/brick1`</div><div class='add'>+TEST [ $? -eq 0 ]</div><div class='add'>+TEST MKFS_LOOP $LO1</div><div class='add'>+LO2=`SETUP_LOOP $B0/brick2`</div><div class='add'>+TEST [ $? -eq 0 ]</div><div class='add'>+TEST MKFS_LOOP $LO2</div><div class='add'>+TEST mkdir -p $B0/${V0}1 $B0/${V0}2</div><div class='add'>+TEST MOUNT_LOOP $LO1 $B0/${V0}1</div><div class='add'>+TEST MOUNT_LOOP $LO2 $B0/${V0}2</div><div class='add'>+</div><div class='add'>+total_brick_blocks=$(df -P $B0/${V0}1 $B0/${V0}2 | tail -2 | awk '{sum = sum+$2}END{print sum}')</div><div class='add'>+#Account for rounding error</div><div class='add'>+brick_blocks_two_percent_less=$((total_brick_blocks*98/100))</div><div class='add'>+# Create a subdir in mountpoint and use that for volume.</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/${V0}1/1 $H0:$B0/${V0}2/1;</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "2" online_brick_count</div><div class='add'>+TEST $GFS --volfile-server=$H0 --volfile-id=$V0 $M0</div><div class='add'>+total_mount_blocks=$(df -P $M0 | tail -1 | awk '{ print $2}')</div><div class='add'>+# Keeping the size less than 200M mainly because XFS will use</div><div class='add'>+# some storage in brick to keep its own metadata.</div><div class='add'>+TEST [ $total_mount_blocks -gt $brick_blocks_two_percent_less -a $total_mount_blocks -lt 200000 ]</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+TEST force_umount $M0</div><div class='add'>+TEST $CLI volume stop $V0</div><div class='add'>+EXPECT 'Stopped' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+# From the same mount point, share another 2 bricks with the volume</div><div class='add'>+TEST $CLI volume add-brick $V0 $H0:$B0/${V0}1/2 $H0:$B0/${V0}2/2 $H0:$B0/${V0}1/3 $H0:$B0/${V0}2/3</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "6" online_brick_count</div><div class='add'>+TEST $GFS --volfile-server=$H0 --volfile-id=$V0 $M0</div><div class='add'>+total_mount_blocks=$(df -P $M0 | tail -1 | awk '{ print $2}')</div><div class='add'>+TEST [ $total_mount_blocks -gt $brick_blocks_two_percent_less -a $total_mount_blocks -lt 200000 ]</div><div class='add'>+</div><div class='add'>+TEST force_umount $M0</div><div class='add'>+TEST $CLI volume stop $V0</div><div class='add'>+EXPECT 'Stopped' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+TEST $CLI volume delete $V0;</div><div class='add'>+</div><div class='add'>+UMOUNT_LOOP ${B0}/${V0}{1,2}</div><div class='add'>+rm -f ${B0}/brick{1,2}</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/basic/posix/zero-fill-enospace.c b/tests/basic/posix/zero-fill-enospace.c<br/>new file mode 100644<br/>index 00000000000..b1f142c6be9<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/posix/zero-fill-enospace.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/posix/zero-fill-enospace.c</a></div><div class='hunk'>@@ -0,0 +1,67 @@</div><div class='add'>+#include &lt;stdio.h&gt;</div><div class='add'>+#include &lt;stdlib.h&gt;</div><div class='add'>+#include &lt;glusterfs/api/glfs.h&gt;</div><div class='add'>+#include &lt;glusterfs/api/glfs-handles.h&gt;</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+main(int argc, char *argv[])</div><div class='add'>+{</div><div class='add'>+    glfs_t *fs = NULL;</div><div class='add'>+    glfs_fd_t *fd = NULL;</div><div class='add'>+    int ret = 1;</div><div class='add'>+    off_t size = 0;</div><div class='add'>+</div><div class='add'>+    if (argc != 6) {</div><div class='add'>+        fprintf(stderr,</div><div class='add'>+                "Syntax: %s &lt;host&gt; &lt;volname&gt; &lt;file-path&gt; &lt;log-file&gt; &lt;size&gt;\n",</div><div class='add'>+                argv[0]);</div><div class='add'>+        return 1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    fs = glfs_new(argv[2]);</div><div class='add'>+    if (!fs) {</div><div class='add'>+        fprintf(stderr, "glfs_new: returned NULL\n");</div><div class='add'>+        return 1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = glfs_set_volfile_server(fs, "tcp", argv[1], 24007);</div><div class='add'>+    if (ret != 0) {</div><div class='add'>+        fprintf(stderr, "glfs_set_volfile_server: returned %d\n", ret);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    ret = glfs_set_logging(fs, argv[4], 7);</div><div class='add'>+    if (ret != 0) {</div><div class='add'>+        fprintf(stderr, "glfs_set_logging: returned %d\n", ret);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    ret = glfs_init(fs);</div><div class='add'>+    if (ret != 0) {</div><div class='add'>+        fprintf(stderr, "glfs_init: returned %d\n", ret);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    fd = glfs_open(fs, argv[3], O_RDWR);</div><div class='add'>+    if (fd == NULL) {</div><div class='add'>+        fprintf(stderr, "glfs_open: returned NULL\n");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    size = strtol(argv[5], NULL, 10);</div><div class='add'>+    if (size &lt; 0) {</div><div class='add'>+        fprintf(stderr, "Wrong size %s", argv[5]);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    ret = glfs_zerofill(fd, 0, size);</div><div class='add'>+    if (ret &lt;= 0) {</div><div class='add'>+        fprintf(stderr, "glfs_zerofill: returned %d\n", ret);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (fd)</div><div class='add'>+        glfs_close(fd);</div><div class='add'>+    glfs_fini(fs);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='head'>diff --git a/tests/basic/posix/zero-fill-enospace.t b/tests/basic/posix/zero-fill-enospace.t<br/>new file mode 100644<br/>index 00000000000..ac2e61b10cf<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/posix/zero-fill-enospace.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/posix/zero-fill-enospace.t</a></div><div class='hunk'>@@ -0,0 +1,35 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+. $(dirname $0)/../../dht.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd;</div><div class='add'>+TEST pidof glusterd;</div><div class='add'>+</div><div class='add'>+TEST truncate -s 100M $B0/brick1</div><div class='add'>+</div><div class='add'>+TEST L1=`SETUP_LOOP $B0/brick1`</div><div class='add'>+TEST MKFS_LOOP $L1</div><div class='add'>+</div><div class='add'>+TEST mkdir -p $B0/${V0}1</div><div class='add'>+</div><div class='add'>+TEST MOUNT_LOOP $L1 $B0/${V0}1</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/${V0}1</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+</div><div class='add'>+TEST glusterfs -s $H0 --volfile-id=$V0 $M0</div><div class='add'>+TEST touch $M0/foo</div><div class='add'>+TEST build_tester $(dirname $0)/zero-fill-enospace.c -lgfapi -Wall -O2</div><div class='add'>+TEST ! $(dirname $0)/zero-fill-enospace $H0 $V0 /foo `gluster --print-logdir`/glfs-$V0.log 104857600</div><div class='add'>+</div><div class='add'>+TEST force_umount $M0</div><div class='add'>+TEST $CLI volume stop $V0</div><div class='add'>+UMOUNT_LOOP ${B0}/${V0}1</div><div class='add'>+rm -f ${B0}/brick1</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/basic/posixonly.t b/tests/basic/posixonly.t<br/>new file mode 100755<br/>index 00000000000..4844818fcc3<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/posixonly.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/posixonly.t</a></div><div class='hunk'>@@ -0,0 +1,31 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../include.rc</div><div class='add'>+. $(dirname $0)/../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST mkdir -p $B0/posixonly</div><div class='add'>+cat &gt; $B0/posixonly.vol &lt;&lt;EOF</div><div class='add'>+volume poisxonly</div><div class='add'>+  type storage/posix</div><div class='add'>+  option directory $B0/posixonly</div><div class='add'>+end-volume</div><div class='add'>+EOF</div><div class='add'>+</div><div class='add'>+TEST glusterfs -f $B0/posixonly.vol $M0;</div><div class='add'>+</div><div class='add'>+TEST touch $M0/filename;</div><div class='add'>+TEST stat $M0/filename;</div><div class='add'>+TEST mkdir $M0/dirname;</div><div class='add'>+TEST stat $M0/dirname;</div><div class='add'>+TEST touch $M0/dirname/filename;</div><div class='add'>+TEST stat $M0/dirname/filename;</div><div class='add'>+TEST ln $M0/dirname/filename $M0/dirname/linkname;</div><div class='add'>+TEST chown 100:100 $M0/dirname/filename;</div><div class='add'>+TEST chown 100:100 $M0/dirname;</div><div class='add'>+TEST rm -rf $M0/filename $M0/dirname;</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/basic/quick-read-with-upcall.t b/tests/basic/quick-read-with-upcall.t<br/>new file mode 100644<br/>index 00000000000..dfb751dfcdb<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/quick-read-with-upcall.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/quick-read-with-upcall.t</a></div><div class='hunk'>@@ -0,0 +1,72 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../include.rc</div><div class='add'>+ #. $(dirname $0)/../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+#Basic checks</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume info</div><div class='add'>+</div><div class='add'>+#Create a distributed volume</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/${V0}{1..2};</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+# Mount FUSE without selinux:</div><div class='add'>+TEST glusterfs -s $H0 --volfile-id $V0 --direct-io-mode=enable $M0;</div><div class='add'>+TEST glusterfs -s $H0 --volfile-id $V0 --direct-io-mode=enable $M1;</div><div class='add'>+</div><div class='add'>+D0="test-message0";</div><div class='add'>+D1="test-message1";</div><div class='add'>+</div><div class='add'>+function write_to()</div><div class='add'>+{</div><div class='add'>+    local file="$1";</div><div class='add'>+    local data="$2";</div><div class='add'>+    echo "$data" &gt; "$file";</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+TEST write_to "$M0/test.txt" "$D0"</div><div class='add'>+EXPECT "$D0" cat $M0/test.txt</div><div class='add'>+EXPECT "$D0" cat $M1/test.txt</div><div class='add'>+</div><div class='add'>+TEST write_to "$M0/test.txt" "$D1"</div><div class='add'>+EXPECT "$D1" cat $M0/test.txt</div><div class='add'>+EXPECT "$D0" cat $M1/test.txt</div><div class='add'>+</div><div class='add'>+sleep 1</div><div class='add'>+</div><div class='add'>+# TODO: This line normally fails</div><div class='add'>+EXPECT "$D1" cat $M1/test.txt</div><div class='add'>+</div><div class='add'>+TEST $CLI volume set $V0 features.cache-invalidation on</div><div class='add'>+TEST $CLI volume set $V0 performance.quick-read-cache-timeout 15</div><div class='add'>+TEST $CLI volume set $V0 performance.md-cache-timeout 15</div><div class='add'>+</div><div class='add'>+TEST write_to "$M0/test1.txt" "$D0"</div><div class='add'>+EXPECT "$D0" cat $M0/test1.txt</div><div class='add'>+EXPECT "$D0" cat $M1/test1.txt</div><div class='add'>+</div><div class='add'>+TEST write_to "$M0/test1.txt" "$D1"</div><div class='add'>+EXPECT "$D1" cat $M0/test1.txt</div><div class='add'>+EXPECT "$D0" cat $M1/test1.txt</div><div class='add'>+</div><div class='add'>+sleep 1</div><div class='add'>+EXPECT "$D0" cat $M1/test1.txt</div><div class='add'>+</div><div class='add'>+sleep 30</div><div class='add'>+EXPECT "$D1" cat $M1/test1.txt</div><div class='add'>+</div><div class='add'>+TEST $CLI volume set $V0 performance.quick-read-cache-invalidation on</div><div class='add'>+TEST $CLI volume set $V0 performance.cache-invalidation on</div><div class='add'>+</div><div class='add'>+TEST write_to "$M0/test2.txt" "$D0"</div><div class='add'>+EXPECT "$D0" cat $M0/test2.txt</div><div class='add'>+EXPECT "$D0" cat $M1/test2.txt</div><div class='add'>+</div><div class='add'>+TEST write_to "$M0/test2.txt" "$D1"</div><div class='add'>+EXPECT "$D1" cat $M0/test2.txt</div><div class='add'>+EXPECT "$D1" cat $M1/test2.txt</div><div class='head'>diff --git a/tests/basic/quota-ancestry-building.t b/tests/basic/quota-ancestry-building.t<br/>new file mode 100755<br/>index 00000000000..fcb39ee31f5<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/quota-ancestry-building.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/quota-ancestry-building.t</a></div><div class='hunk'>@@ -0,0 +1,71 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../include.rc</div><div class='add'>+. $(dirname $0)/../volume.rc</div><div class='add'>+. $(dirname $0)/../fileio.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+# This tests quota enforcing on an inode without any path information.</div><div class='add'>+# This should cover anon-fd type of workload as well.</div><div class='add'>+</div><div class='add'>+QDD=$(dirname $0)/quota</div><div class='add'>+# compile the test write program and run it</div><div class='add'>+build_tester $(dirname $0)/quota.c -o $QDD</div><div class='add'>+</div><div class='add'>+TESTS_EXPECTED_IN_LOOP=8</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume info;</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 replica 2 $H0:$B0/brick1 $H0:$B0/brick2;</div><div class='add'>+</div><div class='add'>+TEST $CLI volume set $V0 performance.write-behind off</div><div class='add'>+TEST $CLI volume set $V0 cluster.self-heal-daemon off</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+TEST glusterfs --volfile-id=/$V0 --volfile-server=$H0 $M0 --attribute-timeout=0 --entry-timeout=0</div><div class='add'>+EXPECT 'Started' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+TEST $CLI volume quota $V0 enable</div><div class='add'>+TEST $CLI volume quota $V0 limit-usage / 1B</div><div class='add'>+TEST $CLI volume quota $V0 soft-timeout 0</div><div class='add'>+TEST $CLI volume quota $V0 hard-timeout 0</div><div class='add'>+</div><div class='add'>+deep=/0/1/2/3/4/5/6/7/8/9</div><div class='add'>+TEST mkdir -p $M0/$deep</div><div class='add'>+</div><div class='add'>+TEST touch $M0/$deep/file1 $M0/$deep/file2 $M0/$deep/file3 $M0/$deep/file4</div><div class='add'>+</div><div class='add'>+TEST fd_open 3 'w' "$M0/$deep/file1"</div><div class='add'>+TEST fd_open 4 'w' "$M0/$deep/file2"</div><div class='add'>+TEST fd_open 5 'w' "$M0/$deep/file3"</div><div class='add'>+TEST fd_open 6 'w' "$M0/$deep/file4"</div><div class='add'>+</div><div class='add'>+# consume all quota</div><div class='add'>+TEST ! $QDD $M0/$deep/file 256 4</div><div class='add'>+</div><div class='add'>+# simulate name-less lookups for re-open where the parent information is lost.</div><div class='add'>+# Stopping and starting the bricks will trigger client re-open which happens on</div><div class='add'>+# a gfid without any parent information. Since no operations are performed on</div><div class='add'>+# the fds {3..6} every-xl will be under the impression that they are good fds</div><div class='add'>+</div><div class='add'>+TEST $CLI volume stop $V0</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 1</div><div class='add'>+</div><div class='add'>+for i in $(seq 3 6); do</div><div class='add'>+# failing writes indicate that we are enforcing quota set on /</div><div class='add'>+TEST_IN_LOOP ! fd_write $i "content"</div><div class='add'>+TEST_IN_LOOP sync</div><div class='add'>+done</div><div class='add'>+</div><div class='add'>+exec 3&gt;&amp;-</div><div class='add'>+exec 4&gt;&amp;-</div><div class='add'>+exec 5&gt;&amp;-</div><div class='add'>+exec 6&gt;&amp;-</div><div class='add'>+</div><div class='add'>+TEST $CLI volume stop $V0</div><div class='add'>+</div><div class='add'>+rm -f $QDD</div><div class='add'>+cleanup;</div><div class='add'>+#G_TESTDEF_TEST_STATUS_NETBSD7=BAD_TEST,BUG=1332020</div><div class='head'>diff --git a/tests/basic/quota-anon-fd-nfs.t b/tests/basic/quota-anon-fd-nfs.t<br/>new file mode 100755<br/>index 00000000000..9e6675af6ec<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/quota-anon-fd-nfs.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/quota-anon-fd-nfs.t</a></div><div class='hunk'>@@ -0,0 +1,117 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../include.rc</div><div class='add'>+. $(dirname $0)/../volume.rc</div><div class='add'>+. $(dirname $0)/../nfs.rc</div><div class='add'>+. $(dirname $0)/../fileio.rc</div><div class='add'>+</div><div class='add'>+#G_TESTDEF_TEST_STATUS_CENTOS6=NFS_TEST</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+QDD=$(dirname $0)/quota</div><div class='add'>+# compile the test write program and run it</div><div class='add'>+build_tester $(dirname $0)/quota.c -o $QDD</div><div class='add'>+</div><div class='add'>+TESTS_EXPECTED_IN_LOOP=16</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume info;</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/brick1;</div><div class='add'>+EXPECT 'Created' volinfo_field $V0 'Status';</div><div class='add'>+TEST $CLI volume set $V0 nfs.disable false</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+# The test makes use of inode-lru-limit to hit a scenario, where we</div><div class='add'>+# find an inode whose ancestry is not there. Following is the</div><div class='add'>+# hypothesis (which is confirmed by seeing logs indicating that</div><div class='add'>+# codepath has been executed, but not through a good understanding of</div><div class='add'>+# NFS internals).</div><div class='add'>+</div><div class='add'>+#     At the end of an fop, the reference count of an inode would be</div><div class='add'>+#     zero. The inode (and its ancestry) persists in memory only</div><div class='add'>+#     because of non-zero lookup count. These looked up inodes are put</div><div class='add'>+#     in an lru queue of size 1 (here). So, there can be at most one</div><div class='add'>+#     such inode in memory.</div><div class='add'>+</div><div class='add'>+#     NFS Server makes use of anonymous fds. So, if it cannot find</div><div class='add'>+#     valid fd, it does a nameless lookup. This gives us an inode</div><div class='add'>+#     whose ancestry is NULL. When a write happens on this inode,</div><div class='add'>+#     quota-enforcer/marker finds a NULL ancestry and asks</div><div class='add'>+#     storage/posix to build it.</div><div class='add'>+</div><div class='add'>+TEST $CLI volume set $V0 network.inode-lru-limit 1</div><div class='add'>+TEST $CLI volume set $V0 performance.nfs.write-behind off</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+EXPECT 'Started' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+TEST $CLI volume quota $V0 enable</div><div class='add'>+TEST $CLI volume quota $V0 limit-usage / 1</div><div class='add'>+TEST $CLI volume quota $V0 soft-timeout 0</div><div class='add'>+TEST $CLI volume quota $V0 hard-timeout 0</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $NFS_EXPORT_TIMEOUT "1" is_nfs_export_available;</div><div class='add'>+TEST mount_nfs $H0:/$V0 $N0 noac,soft,nolock,vers=3;</div><div class='add'>+deep=/0/1/2/3/4/5/6/7/8/9</div><div class='add'>+TEST mkdir -p $N0/$deep</div><div class='add'>+</div><div class='add'>+TEST touch $N0/$deep/file1 $N0/$deep/file2 $N0/$deep/file3 $N0/$deep/file4</div><div class='add'>+</div><div class='add'>+TEST fd_open 3 'w' "$N0/$deep/file1"</div><div class='add'>+TEST fd_open 4 'w' "$N0/$deep/file2"</div><div class='add'>+TEST fd_open 5 'w' "$N0/$deep/file3"</div><div class='add'>+TEST fd_open 6 'w' "$N0/$deep/file4"</div><div class='add'>+</div><div class='add'>+# consume all quota</div><div class='add'>+echo "Hello" &gt; $N0/$deep/new_file_1</div><div class='add'>+echo "World" &gt;&gt; $N0/$deep/new_file_1</div><div class='add'>+echo 1 &gt;&gt; $N0/$deep/new_file_1</div><div class='add'>+echo 2 &gt;&gt; $N0/$deep/new_file_1</div><div class='add'>+</div><div class='add'>+# Try to create a 1M file which should fail</div><div class='add'>+TEST ! $QDD $N0/$deep/new_file_2 256 4</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+# At the end of each fop in server, reference count of the</div><div class='add'>+# inode associated with each of the file above drops to zero and hence</div><div class='add'>+# put into lru queue. Since lru-limit is set to 1, an fop next file</div><div class='add'>+# will displace the current inode from itable. This will ensure that</div><div class='add'>+# when writes happens on same fd, fd resolution results in</div><div class='add'>+# nameless lookup from server and quota_writev encounters an fd</div><div class='add'>+# associated with an inode whose parent is not present in itable.</div><div class='add'>+</div><div class='add'>+for j in $(seq 1 2); do</div><div class='add'>+    for i in $(seq 3 6); do</div><div class='add'>+        # failing writes indicate that we are enforcing quota set on /</div><div class='add'>+        # even with anonymous fds.</div><div class='add'>+        TEST_IN_LOOP ! fd_write $i "content"</div><div class='add'>+        TEST_IN_LOOP sync</div><div class='add'>+    done</div><div class='add'>+done</div><div class='add'>+</div><div class='add'>+exec 3&gt;&amp;-</div><div class='add'>+exec 4&gt;&amp;-</div><div class='add'>+exec 5&gt;&amp;-</div><div class='add'>+exec 6&gt;&amp;-</div><div class='add'>+</div><div class='add'>+$CLI volume statedump $V0 all</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $N0</div><div class='add'>+</div><div class='add'>+# This is ugly, but there seems to be a latent race between other actions and</div><div class='add'>+# stopping the volume.  The visible symptom is that "umount -l" (run from</div><div class='add'>+# gf_umount_lazy in glusterd) hangs.  This happens pretty consistently with the</div><div class='add'>+# new mem-pool code, though it's not really anything to do with memory pools -</div><div class='add'>+# just with changed timing.  Adding the sleep here makes it work consistently.</div><div class='add'>+#</div><div class='add'>+# If anyone else wants to debug the race condition, feel free.</div><div class='add'>+sleep 3</div><div class='add'>+</div><div class='add'>+TEST $CLI volume stop $V0</div><div class='add'>+</div><div class='add'>+rm -f $QDD</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+#G_TESTDEF_TEST_STATUS_NETBSD7=BAD_TEST,BUG=000000</div><div class='head'>diff --git a/tests/basic/quota-nfs.t b/tests/basic/quota-nfs.t<br/>new file mode 100755<br/>index 00000000000..de94a950a7f<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/quota-nfs.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/quota-nfs.t</a></div><div class='hunk'>@@ -0,0 +1,66 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../include.rc</div><div class='add'>+. $(dirname $0)/../volume.rc</div><div class='add'>+. $(dirname $0)/../nfs.rc</div><div class='add'>+</div><div class='add'>+#G_TESTDEF_TEST_STATUS_CENTOS6=NFS_TEST</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+QDD=$(dirname $0)/quota</div><div class='add'>+# compile the test write program and run it</div><div class='add'>+build_tester $(dirname $0)/quota.c -o $QDD</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume info;</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/brick1;</div><div class='add'>+EXPECT 'Created' volinfo_field $V0 'Status';</div><div class='add'>+TEST $CLI volume set $V0 nfs.disable false</div><div class='add'>+</div><div class='add'>+TEST $CLI volume set $V0 network.inode-lru-limit 1</div><div class='add'>+TEST $CLI volume set $V0 performance.nfs.write-behind off</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+EXPECT 'Started' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $NFS_EXPORT_TIMEOUT 1 is_nfs_export_available</div><div class='add'>+TEST mount_nfs $H0:/$V0 $N0</div><div class='add'>+deep=/0/1/2/3/4/5/6/7/8/9</div><div class='add'>+TEST mkdir -p $N0/$deep</div><div class='add'>+</div><div class='add'>+TEST $QDD $N0/$deep/file 256 40</div><div class='add'>+</div><div class='add'>+TEST $CLI volume quota $V0 enable</div><div class='add'>+TEST $CLI volume quota $V0 limit-usage / 20MB</div><div class='add'>+TEST $CLI volume quota $V0 soft-timeout 0</div><div class='add'>+TEST $CLI volume quota $V0 hard-timeout 0</div><div class='add'>+</div><div class='add'>+TEST $QDD $N0/$deep/newfile_1 256 20</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "0" STAT $N0/$deep/file</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "0" STAT $N0/$deep/newfile_1</div><div class='add'>+</div><div class='add'>+#Unmount and mount to flush the data</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" umount_nfs $N0</div><div class='add'>+TEST mount_nfs $H0:/$V0 $N0</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "0" STAT $N0/$deep/file</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "0" STAT $N0/$deep/newfile_1</div><div class='add'>+</div><div class='add'>+# wait for write behind to complete.</div><div class='add'>+EXPECT_WITHIN $MARKER_UPDATE_TIMEOUT "15.0MB" quotausage "/"</div><div class='add'>+</div><div class='add'>+# Try to create a 100Mb file which should fail</div><div class='add'>+TEST ! $QDD $N0/$deep/newfile_2 256 400</div><div class='add'>+TEST rm -f $N0/$deep/newfile_2</div><div class='add'>+</div><div class='add'>+## Before killing daemon to avoid deadlocks</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" umount_nfs $N0</div><div class='add'>+</div><div class='add'>+TEST $CLI volume stop $V0</div><div class='add'>+</div><div class='add'>+rm -f $QDD</div><div class='add'>+cleanup;</div><div class='add'>+#G_TESTDEF_TEST_STATUS_NETBSD7=BAD_TEST,BUG=000000</div><div class='head'>diff --git a/tests/basic/quota-rename.t b/tests/basic/quota-rename.t<br/>new file mode 100644<br/>index 00000000000..37438689d9f<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/quota-rename.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/quota-rename.t</a></div><div class='hunk'>@@ -0,0 +1,37 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+# This regression test tries to ensure renaming a directory with content, and</div><div class='add'>+# no limit set, is accounted properly, when moved into a directory with quota</div><div class='add'>+# limit set.</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../include.rc</div><div class='add'>+. $(dirname $0)/../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/${V0}</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+</div><div class='add'>+TEST $CLI volume quota $V0 enable;</div><div class='add'>+</div><div class='add'>+TEST glusterfs --volfile-id=$V0 --volfile-server=$H0 $M0;</div><div class='add'>+</div><div class='add'>+TEST $CLI volume quota $V0 hard-timeout 0</div><div class='add'>+TEST $CLI volume quota $V0 soft-timeout 0</div><div class='add'>+</div><div class='add'>+TEST mkdir -p $M0/dir/dir1</div><div class='add'>+TEST $CLI volume quota $V0 limit-objects /dir 20</div><div class='add'>+</div><div class='add'>+TEST mkdir $M0/dir/dir1/d{1..5}</div><div class='add'>+TEST touch $M0/dir/dir1/f{1..5}</div><div class='add'>+TEST mv $M0/dir/dir1 $M0/dir/dir2</div><div class='add'>+</div><div class='add'>+#Number of files under /dir is 5</div><div class='add'>+EXPECT_WITHIN $MARKER_UPDATE_TIMEOUT "5" quota_object_list_field "/dir" 4</div><div class='add'>+</div><div class='add'>+#Number of directories under /dir is 7</div><div class='add'>+EXPECT_WITHIN $MARKER_UPDATE_TIMEOUT "7" quota_object_list_field "/dir" 5</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/basic/quota.c b/tests/basic/quota.c<br/>new file mode 100644<br/>index 00000000000..809ceb8e54c<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/quota.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/quota.c</a></div><div class='hunk'>@@ -0,0 +1,89 @@</div><div class='add'>+#include &lt;stdlib.h&gt;</div><div class='add'>+#include &lt;stdio.h&gt;</div><div class='add'>+#include &lt;sys/types.h&gt;</div><div class='add'>+#include &lt;sys/stat.h&gt;</div><div class='add'>+#include &lt;fcntl.h&gt;</div><div class='add'>+#include &lt;errno.h&gt;</div><div class='add'>+#include &lt;string.h&gt;</div><div class='add'>+#include &lt;unistd.h&gt;</div><div class='add'>+</div><div class='add'>+ssize_t</div><div class='add'>+nwrite(int fd, const void *buf, size_t count)</div><div class='add'>+{</div><div class='add'>+    ssize_t ret = 0;</div><div class='add'>+    ssize_t written = 0;</div><div class='add'>+</div><div class='add'>+    for (written = 0; written != count; written += ret) {</div><div class='add'>+        ret = write(fd, buf + written, count - written);</div><div class='add'>+        if (ret &lt; 0) {</div><div class='add'>+            if (errno == EINTR)</div><div class='add'>+                ret = 0;</div><div class='add'>+            else</div><div class='add'>+                goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = written;</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+file_write(char *filename, int bs, int count)</div><div class='add'>+{</div><div class='add'>+    int fd = 0;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int i = 0;</div><div class='add'>+    char *buf = NULL;</div><div class='add'>+</div><div class='add'>+    bs = bs * 1024;</div><div class='add'>+</div><div class='add'>+    buf = (char *)malloc(bs);</div><div class='add'>+    if (buf == NULL)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    memset(buf, 0, bs);</div><div class='add'>+</div><div class='add'>+    fd = open(filename, O_RDWR | O_CREAT | O_SYNC, 0600);</div><div class='add'>+    while (i &lt; count) {</div><div class='add'>+        ret = nwrite(fd, buf, bs);</div><div class='add'>+        if (ret == -1) {</div><div class='add'>+            close(fd);</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+        i++;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = fdatasync(fd);</div><div class='add'>+    if (ret) {</div><div class='add'>+        close(fd);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = close(fd);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (buf)</div><div class='add'>+        free(buf);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+main(int argc, char **argv)</div><div class='add'>+{</div><div class='add'>+    if (argc != 4) {</div><div class='add'>+        printf("Usage: %s &lt;filename&gt; &lt;block size in k&gt; &lt;count&gt;\n", argv[0]);</div><div class='add'>+        return EXIT_FAILURE;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (file_write(argv[1], atoi(argv[2]), atoi(argv[3])) &lt; 0) {</div><div class='add'>+        perror("write failed");</div><div class='add'>+        return EXIT_FAILURE;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return EXIT_SUCCESS;</div><div class='add'>+}</div><div class='head'>diff --git a/tests/basic/quota.t b/tests/basic/quota.t<br/>new file mode 100755<br/>index 00000000000..46d1bafff84<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/quota.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/quota.t</a></div><div class='hunk'>@@ -0,0 +1,236 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../include.rc</div><div class='add'>+. $(dirname $0)/../volume.rc</div><div class='add'>+. $(dirname $0)/../nfs.rc</div><div class='add'>+. $(dirname $0)/../dht.rc</div><div class='add'>+. $(dirname $0)/../nfs.rc</div><div class='add'>+</div><div class='add'>+#G_TESTDEF_TEST_STATUS_CENTOS6=NFS_TEST</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+QDD=$(dirname $0)/quota</div><div class='add'>+# compile the test write program and run it</div><div class='add'>+build_tester $(dirname $0)/quota.c -o $QDD</div><div class='add'>+</div><div class='add'>+TESTS_EXPECTED_IN_LOOP=19</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume info;</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 replica 2  $H0:$B0/${V0}{1,2,3,4};</div><div class='add'>+</div><div class='add'>+EXPECT "$V0" volinfo_field $V0 'Volume Name';</div><div class='add'>+EXPECT 'Created' volinfo_field $V0 'Status';</div><div class='add'>+EXPECT '4' brick_count $V0</div><div class='add'>+</div><div class='add'>+TEST $CLI volume set $V0 nfs.disable false</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+EXPECT 'Started' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+TEST $GFS -s $H0 --volfile-id $V0 $M0;</div><div class='add'>+</div><div class='add'>+TEST mkdir -p $M0/test_dir/in_test_dir</div><div class='add'>+</div><div class='add'>+## --------------------------------------------------------------------------</div><div class='add'>+## Verify quota commands and check if quota-deem-statfs is enabled by default</div><div class='add'>+## --------------------------------------------------------------------------</div><div class='add'>+TEST $CLI volume quota $V0 enable</div><div class='add'>+EXPECT 'on' volinfo_field $V0 'features.quota'</div><div class='add'>+EXPECT 'on' volinfo_field $V0 'features.inode-quota'</div><div class='add'>+EXPECT 'on' volinfo_field $V0 'features.quota-deem-statfs'</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+TEST $CLI volume quota $V0 limit-usage /test_dir 100MB</div><div class='add'>+</div><div class='add'>+TEST $CLI volume quota $V0 limit-usage /test_dir/in_test_dir 150MB</div><div class='add'>+</div><div class='add'>+EXPECT "150.0MB" quota_hard_limit "/test_dir/in_test_dir";</div><div class='add'>+EXPECT "80%" quota_soft_limit "/test_dir/in_test_dir";</div><div class='add'>+</div><div class='add'>+TEST $CLI volume quota $V0 remove /test_dir/in_test_dir</div><div class='add'>+</div><div class='add'>+EXPECT "100.0MB" quota_hard_limit "/test_dir";</div><div class='add'>+</div><div class='add'>+TEST $CLI volume quota $V0 limit-usage /test_dir 10MB</div><div class='add'>+EXPECT "10.0MB" quota_hard_limit "/test_dir";</div><div class='add'>+EXPECT "80%" quota_soft_limit "/test_dir";</div><div class='add'>+</div><div class='add'>+TEST $CLI volume quota $V0 soft-timeout 0</div><div class='add'>+TEST $CLI volume quota $V0 hard-timeout 0</div><div class='add'>+</div><div class='add'>+## ------------------------------</div><div class='add'>+## Verify quota enforcement</div><div class='add'>+## -----------------------------</div><div class='add'>+</div><div class='add'>+# Try to create a 12MB file which should fail</div><div class='add'>+TEST ! $QDD $M0/test_dir/1.txt 256 48</div><div class='add'>+TEST rm $M0/test_dir/1.txt</div><div class='add'>+</div><div class='add'>+# wait for marker's accounting to complete</div><div class='add'>+EXPECT_WITHIN $MARKER_UPDATE_TIMEOUT "0Bytes" quotausage "/test_dir"</div><div class='add'>+</div><div class='add'>+TEST $QDD $M0/test_dir/2.txt 256 32</div><div class='add'>+EXPECT_WITHIN $MARKER_UPDATE_TIMEOUT "8.0MB" quotausage "/test_dir"</div><div class='add'>+</div><div class='add'>+# Checking internal xattr</div><div class='add'>+# This confirms that pgfid is also filtered</div><div class='add'>+TEST ! "getfattr -d -e hex -m . $M0/test_dir/2.txt | grep pgfid ";</div><div class='add'>+# just check for quota xattr are visible or not</div><div class='add'>+TEST ! "getfattr -d -e hex -m . $M0/test_dir | grep quota";</div><div class='add'>+</div><div class='add'>+# setfattr should fail</div><div class='add'>+TEST ! setfattr -n trusted.glusterfs.quota.limit-set -v 10 $M0/test_dir;</div><div class='add'>+</div><div class='add'>+# remove xattr should fail</div><div class='add'>+TEST ! setfattr -x trusted.glusterfs.quota.limit-set $M0/test_dir;</div><div class='add'>+</div><div class='add'>+TEST rm $M0/test_dir/2.txt</div><div class='add'>+EXPECT_WITHIN $MARKER_UPDATE_TIMEOUT "0Bytes" quotausage "/test_dir"</div><div class='add'>+</div><div class='add'>+## rename tests</div><div class='add'>+TEST $QDD $M0/test_dir/2 256 32</div><div class='add'>+EXPECT_WITHIN $MARKER_UPDATE_TIMEOUT "8.0MB" quotausage "/test_dir"</div><div class='add'>+TEST mv $M0/test_dir/2 $M0/test_dir/0</div><div class='add'>+EXPECT_WITHIN $MARKER_UPDATE_TIMEOUT "8.0MB" quotausage "/test_dir"</div><div class='add'>+TEST rm $M0/test_dir/0</div><div class='add'>+EXPECT_WITHIN $MARKER_UPDATE_TIMEOUT "0Bytes" quotausage "/test_dir"</div><div class='add'>+</div><div class='add'>+## rename tests under different directories</div><div class='add'>+TEST mkdir -p $M0/1/2;</div><div class='add'>+TEST $CLI volume quota $V0 limit-usage /1/2 100MB 70%;</div><div class='add'>+</div><div class='add'>+# The corresponding write(3) should fail with EDQUOT ("Disk quota exceeded")</div><div class='add'>+TEST ! $QDD $M0/1/2/file 256 408</div><div class='add'>+</div><div class='add'>+TEST mkdir -p $M0/1/3;</div><div class='add'>+TEST $QDD $M0/1/3/file 256 408</div><div class='add'>+</div><div class='add'>+#The corresponding rename(3) should fail with EDQUOT ("Disk quota exceeded")</div><div class='add'>+TEST ! mv $M0/1/3/ $M0/1/2/3_mvd;</div><div class='add'>+</div><div class='add'>+## ---------------------------</div><div class='add'>+</div><div class='add'>+## ------------------------------</div><div class='add'>+## Check if presence of nfs mount results in ESTALE errors for I/O</div><div class='add'>+#  on a fuse mount. Note: Quota command internally uses a fuse mount,</div><div class='add'>+#  though this may change.</div><div class='add'>+## -----------------------------</div><div class='add'>+</div><div class='add'>+##Wait for connection establishment between nfs server and brick process</div><div class='add'>+EXPECT_WITHIN $NFS_EXPORT_TIMEOUT "1" is_nfs_export_available;</div><div class='add'>+</div><div class='add'>+TEST mount_nfs $H0:/$V0 $N0 nolock;</div><div class='add'>+TEST $CLI volume quota $V0 limit-usage /test_dir 100MB</div><div class='add'>+</div><div class='add'>+TEST $CLI volume quota $V0 limit-usage /test_dir/in_test_dir 150MB</div><div class='add'>+</div><div class='add'>+EXPECT "150.0MB" quota_hard_limit "/test_dir/in_test_dir";</div><div class='add'>+## -----------------------------</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+###################################################</div><div class='add'>+## ------------------------------------------------</div><div class='add'>+## &lt;Test quota functionality in add-brick scenarios&gt;</div><div class='add'>+## ------------------------------------------------</div><div class='add'>+###################################################</div><div class='add'>+QUOTALIMIT=100</div><div class='add'>+QUOTALIMITROOT=2048</div><div class='add'>+TESTDIR="addbricktest"</div><div class='add'>+</div><div class='add'>+rm -rf $M0/*;</div><div class='add'>+</div><div class='add'>+## &lt;Create directories and test&gt;</div><div class='add'>+## -----------------------------</div><div class='add'>+# 41-42</div><div class='add'>+TEST mkdir $M0/$TESTDIR</div><div class='add'>+TEST mkdir $M0/$TESTDIR/dir{1..10};</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+# 43-52</div><div class='add'>+## &lt;set limits&gt;</div><div class='add'>+## -----------------------------</div><div class='add'>+TEST $CLI volume quota $V0 limit-usage / "$QUOTALIMITROOT"MB;</div><div class='add'>+for i in {1..10}; do</div><div class='add'>+        TEST_IN_LOOP $CLI volume quota $V0 limit-usage /$TESTDIR/dir$i \</div><div class='add'>+                          "$QUOTALIMIT"MB;</div><div class='add'>+done</div><div class='add'>+## &lt;/Enable quota and set limits&gt;</div><div class='add'>+</div><div class='add'>+#53-62</div><div class='add'>+for i in `seq 1 9`; do</div><div class='add'>+        TEST_IN_LOOP $QDD "$M0/$TESTDIR/dir1/10MBfile$i" 256 40</div><div class='add'>+done</div><div class='add'>+</div><div class='add'>+# 63-64</div><div class='add'>+## &lt;Add brick and start rebalance&gt;</div><div class='add'>+## -------------------------------</div><div class='add'>+TEST $CLI volume add-brick $V0 $H0:$B0/brick{3,4}</div><div class='add'>+TEST $CLI volume rebalance $V0 start;</div><div class='add'>+</div><div class='add'>+## Wait for rebalance</div><div class='add'>+EXPECT_WITHIN $REBALANCE_TIMEOUT "0" rebalance_completed</div><div class='add'>+</div><div class='add'>+## &lt;Try creating data beyond limit&gt;</div><div class='add'>+## --------------------------------</div><div class='add'>+for i in `seq 1 200`; do</div><div class='add'>+        $QDD of="$M0/$TESTDIR/dir1/1MBfile$i" 256 4\</div><div class='add'>+           2&gt;&amp;1 | egrep -v '(No space left|Disc quota exceeded)'</div><div class='add'>+done</div><div class='add'>+</div><div class='add'>+# 65</div><div class='add'>+## &lt;Test whether quota limit crossed more than 10% of limit&gt;</div><div class='add'>+## ---------------------------------------------------------</div><div class='add'>+USED_KB=`du -ks $M0/$TESTDIR/dir1 | cut -f1`;</div><div class='add'>+USED_MB=$(($USED_KB/1024));</div><div class='add'>+TEST [ $USED_MB -le $((($QUOTALIMIT * 110) / 100)) ]</div><div class='add'>+</div><div class='add'>+# 66-67</div><div class='add'>+## &lt;Test the xattrs healed to new brick&gt;</div><div class='add'>+## -------------------------------------</div><div class='add'>+TEST getfattr -d -m "trusted.glusterfs.quota.limit-set" -e hex \</div><div class='add'>+              --absolute-names $B0/brick{3,4}/$TESTDIR/dir{1..10};</div><div class='add'>+# Test on root.</div><div class='add'>+TEST getfattr -d -m "trusted.glusterfs.quota.limit-set" -e hex \</div><div class='add'>+              --absolute-names $B0/brick{3,4};</div><div class='add'>+</div><div class='add'>+## -------------------------------------------------</div><div class='add'>+## &lt;/Test quota functionality in add-brick scenarios&gt;</div><div class='add'>+## -------------------------------------------------</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $N0</div><div class='add'>+</div><div class='add'>+## ---------------------------</div><div class='add'>+## Test quota volume options</div><div class='add'>+## ---------------------------</div><div class='add'>+TEST $CLI volume reset $V0</div><div class='add'>+EXPECT 'on' volinfo_field $V0 'features.quota'</div><div class='add'>+EXPECT 'on' volinfo_field $V0 'features.inode-quota'</div><div class='add'>+EXPECT 'on' volinfo_field $V0 'features.quota-deem-statfs'</div><div class='add'>+</div><div class='add'>+TEST $CLI volume reset $V0 force</div><div class='add'>+EXPECT 'on' volinfo_field $V0 'features.quota'</div><div class='add'>+EXPECT 'on' volinfo_field $V0 'features.inode-quota'</div><div class='add'>+EXPECT 'on' volinfo_field $V0 'features.quota-deem-statfs'</div><div class='add'>+</div><div class='add'>+TEST $CLI volume reset $V0 features.quota-deem-statfs</div><div class='add'>+EXPECT 'on' volinfo_field $V0 'features.quota-deem-statfs'</div><div class='add'>+</div><div class='add'>+TEST $CLI volume set $V0 features.quota-deem-statfs off</div><div class='add'>+EXPECT 'off' volinfo_field $V0 'features.quota-deem-statfs'</div><div class='add'>+</div><div class='add'>+TEST $CLI volume set $V0 features.quota-deem-statfs on</div><div class='add'>+EXPECT 'on' volinfo_field $V0 'features.quota-deem-statfs'</div><div class='add'>+</div><div class='add'>+TEST $CLI volume quota $V0 disable</div><div class='add'>+EXPECT 'off' volinfo_field $V0 'features.quota'</div><div class='add'>+EXPECT 'off' volinfo_field $V0 'features.inode-quota'</div><div class='add'>+EXPECT '' volinfo_field $V0 'features.quota-deem-statfs'</div><div class='add'>+</div><div class='add'>+TEST $CLI volume stop $V0;</div><div class='add'>+</div><div class='add'>+rm -f $QDD</div><div class='add'>+cleanup;</div><div class='add'>+#G_TESTDEF_TEST_STATUS_NETBSD7=BAD_TEST,BUG=1332045</div><div class='head'>diff --git a/tests/basic/quota_aux_mount.t b/tests/basic/quota_aux_mount.t<br/>new file mode 100755<br/>index 00000000000..78d7f47e373<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/quota_aux_mount.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/quota_aux_mount.t</a></div><div class='hunk'>@@ -0,0 +1,53 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../include.rc</div><div class='add'>+. $(dirname $0)/../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+##-------------------------------------------------------------</div><div class='add'>+## Tests to verify that aux mount is unmounted after each quota</div><div class='add'>+## command executes.</div><div class='add'>+##-------------------------------------------------------------</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume info;</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 replica 2  $H0:$B0/${V0}{1,2,3,4};</div><div class='add'>+</div><div class='add'>+EXPECT "$V0" volinfo_field $V0 'Volume Name';</div><div class='add'>+EXPECT 'Created' volinfo_field $V0 'Status';</div><div class='add'>+EXPECT '4' brick_count $V0</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+EXPECT 'Started' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+TEST $GFS -s $H0 --volfile-id $V0 $M0;</div><div class='add'>+</div><div class='add'>+TEST mkdir -p $M0/test_dir/</div><div class='add'>+</div><div class='add'>+TEST $CLI volume quota $V0 enable</div><div class='add'>+EXPECT 'on' volinfo_field $V0 'features.quota'</div><div class='add'>+EXPECT 'on' volinfo_field $V0 'features.inode-quota'</div><div class='add'>+</div><div class='add'>+TEST $CLI volume quota $V0 limit-usage /test_dir 150MB</div><div class='add'>+EXPECT "1"  get_limit_aux</div><div class='add'>+TEST $CLI volume quota $V0 limit-objects /test_dir 10</div><div class='add'>+EXPECT "1"  get_limit_aux</div><div class='add'>+EXPECT "150.0MB" quota_hard_limit "/test_dir";</div><div class='add'>+EXPECT "1"  get_list_aux</div><div class='add'>+EXPECT "10" quota_object_hard_limit "/test_dir";</div><div class='add'>+EXPECT "1"  get_list_aux</div><div class='add'>+</div><div class='add'>+TEST $CLI volume quota $V0 remove /test_dir/</div><div class='add'>+EXPECT "1"  get_limit_aux</div><div class='add'>+TEST $CLI volume quota $V0 remove-objects /test_dir</div><div class='add'>+EXPECT "1"  get_limit_aux</div><div class='add'>+</div><div class='add'>+TEST $CLI volume quota $V0 disable</div><div class='add'>+</div><div class='add'>+TEST $CLI volume stop $V0;</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+#G_TESTDEF_TEST_STATUS_NETBSD7=BAD_TEST,BUG=1447344</div><div class='head'>diff --git a/tests/basic/rpc-coverage.sh b/tests/basic/rpc-coverage.sh<br/>new file mode 100755<br/>index 00000000000..6203f0ac7cb<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/rpc-coverage.sh?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/rpc-coverage.sh</a></div><div class='hunk'>@@ -0,0 +1,499 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+# This script can be used to provoke 35 fops (if afr is used),</div><div class='add'>+# 28 fops (if afr is not used) (-fstat,-readdirp, and lk,xattrop calls)</div><div class='add'>+# Pending are 7 procedures.</div><div class='add'>+# getspec, fsyncdir, access, fentrylk, fsetxattr, fgetxattr, rchecksum</div><div class='add'>+# TODO: add commands which can generate fops for missing fops</div><div class='add'>+</div><div class='add'>+## Script tests below File Operations over RPC (when afr is used)</div><div class='add'>+</div><div class='add'>+# CREATE</div><div class='add'>+# ENTRYLK</div><div class='add'>+# FINODELK</div><div class='add'>+# FLUSH</div><div class='add'>+# FSTAT</div><div class='add'>+# FSYNC</div><div class='add'>+# FTRUNCATE</div><div class='add'>+# FXATTROP</div><div class='add'>+# GETXATTR</div><div class='add'>+# INODELK</div><div class='add'>+# LINK</div><div class='add'>+# LK</div><div class='add'>+# LOOKUP</div><div class='add'>+# MKDIR</div><div class='add'>+# MKNOD</div><div class='add'>+# OPEN</div><div class='add'>+# OPENDIR</div><div class='add'>+# READ</div><div class='add'>+# READDIR</div><div class='add'>+# READDIRP</div><div class='add'>+# READLINK</div><div class='add'>+# RELEASE</div><div class='add'>+# RELEASEDIR</div><div class='add'>+# REMOVEXATTR</div><div class='add'>+# RENAME</div><div class='add'>+# RMDIR</div><div class='add'>+# SETATTR</div><div class='add'>+# SETXATTR</div><div class='add'>+# STAT</div><div class='add'>+# STATFS</div><div class='add'>+# SYMLINK</div><div class='add'>+# TRUNCATE</div><div class='add'>+# UNLINK</div><div class='add'>+# WRITE</div><div class='add'>+# XATTROP</div><div class='add'>+</div><div class='add'>+#set -e;</div><div class='add'>+set -o pipefail;</div><div class='add'>+</div><div class='add'>+# pull compatibility functions (e.g.: stat replacement if not running Linux)</div><div class='add'>+. $(dirname $0)/../include.rc</div><div class='add'>+</div><div class='add'>+function fail() {</div><div class='add'>+    echo "$*: failed.";</div><div class='add'>+    exit 1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function test_mkdir()</div><div class='add'>+{</div><div class='add'>+    mkdir -p $PFX/dir;</div><div class='add'>+    test $(stat -c '%F' $PFX/dir) == "directory" || fail "mkdir"</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+function test_create()</div><div class='add'>+{</div><div class='add'>+    : &gt; $PFX/dir/file;</div><div class='add'>+</div><div class='add'>+    test "$(stat -c '%F' $PFX/dir/file)" == "regular empty file" || fail "create"</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+function test_statfs()</div><div class='add'>+{</div><div class='add'>+    local size;</div><div class='add'>+</div><div class='add'>+    mode=$(stat -c '%a' $PFX/dir/file);</div><div class='add'>+    test "x$mode" == "x644" || fail "statfs"</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+function test_open()</div><div class='add'>+{</div><div class='add'>+    exec 4&lt;$PFX/dir/file || fail "open"</div><div class='add'>+    exec 4&gt;&amp;- || fail "open"</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+function test_write()</div><div class='add'>+{</div><div class='add'>+    dd if=/dev/zero of=$PFX/dir/file bs=65536 count=16</div><div class='add'>+    test $(stat -c '%s' $PFX/dir/file) == 1048576 || fail "write"</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+function test_read()</div><div class='add'>+{</div><div class='add'>+    local count;</div><div class='add'>+</div><div class='add'>+    count=$(dd if=$PFX/dir/file bs=64k count=16 2&gt;/dev/null | wc -c);</div><div class='add'>+    test $count == 1048576 || fail "read"</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+function test_truncate()</div><div class='add'>+{</div><div class='add'>+    truncate -s 512 $PFX/dir/file;</div><div class='add'>+    test $(stat -c '%s' $PFX/dir/file) == 512 || fail "truncate"</div><div class='add'>+</div><div class='add'>+    truncate -s 0 $PFX/dir/file;</div><div class='add'>+    test $(stat -c '%s' $PFX/dir/file) == 0 || fail "truncate"</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+function test_fstat()</div><div class='add'>+{</div><div class='add'>+    local msg;</div><div class='add'>+</div><div class='add'>+    export PFX;</div><div class='add'>+    echo hooha &gt; $PFX/dir/file</div><div class='add'>+    sleep 1</div><div class='add'>+    msg=$(sh -c 'tail $PFX/dir/file')</div><div class='add'>+    test "x$msg" == "xhooha" || fail "fstat"</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+function test_mknod()</div><div class='add'>+{</div><div class='add'>+    mknod -m 0666 $PFX/dir/block b 13 42;</div><div class='add'>+    test "$(stat -c '%F %a %t %T' $PFX/dir/block)" == "block special file 666 d 2a" \</div><div class='add'>+	|| fail "mknod for block device"</div><div class='add'>+</div><div class='add'>+    mknod -m 0666 $PFX/dir/char c 13 42;</div><div class='add'>+    test "$(stat -c '%F %a %t %T' $PFX/dir/char)" == "character special file 666 d 2a" \</div><div class='add'>+	|| fail "mknod for character device"</div><div class='add'>+</div><div class='add'>+    mknod -m 0666 $PFX/dir/fifo p;</div><div class='add'>+    test "$(stat -c '%F %a' $PFX/dir/fifo)" == "fifo 666" || \</div><div class='add'>+	fail "mknod for fifo"</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+function test_symlink()</div><div class='add'>+{</div><div class='add'>+    local msg;</div><div class='add'>+</div><div class='add'>+    ( cd $PFX/dir &amp;&amp; ln -s file symlink; )</div><div class='add'>+</div><div class='add'>+    test "$(stat -c '%F' $PFX/dir/symlink)" == "symbolic link" || fail "Creation of symlink"</div><div class='add'>+</div><div class='add'>+    msg=$(cat $PFX/dir/symlink);</div><div class='add'>+    test "x$msg" == "xhooha" || fail "Content match for symlink"</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+function test_hardlink()</div><div class='add'>+{</div><div class='add'>+    local ino1;</div><div class='add'>+    local ino2;</div><div class='add'>+    local nlink1;</div><div class='add'>+    local nlink2;</div><div class='add'>+    local msg;</div><div class='add'>+</div><div class='add'>+    ln $PFX/dir/file $PFX/dir/hardlink;</div><div class='add'>+</div><div class='add'>+    ino1=$(stat -c '%i' $PFX/dir/file);</div><div class='add'>+    nlink1=$(stat -c '%h' $PFX/dir/file);</div><div class='add'>+    ino2=$(stat -c '%i' $PFX/dir/hardlink);</div><div class='add'>+    nlink2=$(stat -c '%h' $PFX/dir/hardlink);</div><div class='add'>+</div><div class='add'>+    test $ino1 == $ino2 || fail "Inode comparison for hardlink"</div><div class='add'>+    test $nlink1 == 2 || fail "Link count for hardlink"</div><div class='add'>+    test $nlink2 == 2 || fail "Link count for hardlink"</div><div class='add'>+</div><div class='add'>+    msg=$(cat $PFX/dir/hardlink);</div><div class='add'>+</div><div class='add'>+    test "x$msg" == "xhooha" || fail "Content match for hardlinks"</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+function test_rename()</div><div class='add'>+{</div><div class='add'>+    local ino1;</div><div class='add'>+    local ino2;</div><div class='add'>+    local ino3;</div><div class='add'>+    local msg;</div><div class='add'>+</div><div class='add'>+    #### file</div><div class='add'>+</div><div class='add'>+    ino1=$(stat -c '%i' $PFX/dir/file);</div><div class='add'>+</div><div class='add'>+    mv $PFX/dir/file $PFX/dir/file2 || fail "mv"</div><div class='add'>+    msg=$(cat $PFX/dir/file2);</div><div class='add'>+    test "x$msg" == "xhooha" || fail "File contents comparison after mv"</div><div class='add'>+</div><div class='add'>+    ino2=$(stat -c '%i' $PFX/dir/file2);</div><div class='add'>+    test $ino1 == $ino2 || fail "Inode comparison after mv"</div><div class='add'>+</div><div class='add'>+    mv $PFX/dir/file2 $PFX/dir/file;</div><div class='add'>+    msg=$(cat $PFX/dir/file);</div><div class='add'>+    test "x$msg" == "xhooha" || fail "File contents comparison after mv"</div><div class='add'>+</div><div class='add'>+    ino3=$(stat -c '%i' $PFX/dir/file);</div><div class='add'>+    test $ino1 == $ino3 || fail "Inode comparison after mv"</div><div class='add'>+</div><div class='add'>+    #### dir</div><div class='add'>+</div><div class='add'>+    ino1=$(stat -c '%i' $PFX/dir);</div><div class='add'>+</div><div class='add'>+    mv $PFX/dir $PFX/dir2 || fail "Directory mv"</div><div class='add'>+    ino2=$(stat -c '%i' $PFX/dir2);</div><div class='add'>+    test $ino1 == $ino2 || fail "Inode comparison after directory mv"</div><div class='add'>+</div><div class='add'>+    mv $PFX/dir2 $PFX/dir || fail "Directory mv"</div><div class='add'>+    ino3=$(stat -c '%i' $PFX/dir);</div><div class='add'>+    test $ino1 == $ino3 || fail "Inode comparison after directory mv"</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+function test_chmod()</div><div class='add'>+{</div><div class='add'>+    local mode0;</div><div class='add'>+    local mode1;</div><div class='add'>+    local mode2;</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+    #### file</div><div class='add'>+</div><div class='add'>+    mode0=$(stat -c '%a' $PFX/dir/file);</div><div class='add'>+    chmod 0753 $PFX/dir/file || fail "chmod"</div><div class='add'>+</div><div class='add'>+    mode1=$(stat -c '%a' $PFX/dir/file);</div><div class='add'>+    test 0$mode1 == 0753 || fail "Mode comparison after chmod"</div><div class='add'>+</div><div class='add'>+    chmod 0$mode0 $PFX/dir/file || fail "chmod"</div><div class='add'>+    mode2=$(stat -c '%a' $PFX/dir/file);</div><div class='add'>+    test 0$mode2 == 0$mode0 || fail "Mode comparison after chmod"</div><div class='add'>+</div><div class='add'>+    #### dir</div><div class='add'>+</div><div class='add'>+    mode0=$(stat -c '%a' $PFX/dir);</div><div class='add'>+    chmod 0753 $PFX/dir || fail "chmod"</div><div class='add'>+</div><div class='add'>+    mode1=$(stat -c '%a' $PFX/dir);</div><div class='add'>+    test 0$mode1 == 0753 || fail "Mode comparison after chmod"</div><div class='add'>+</div><div class='add'>+    chmod 0$mode0 $PFX/dir || fail "chmod"</div><div class='add'>+    mode2=$(stat -c '%a' $PFX/dir);</div><div class='add'>+    test 0$mode2 == 0$mode0  || fail "Mode comparison after chmod"</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+function test_chown()</div><div class='add'>+{</div><div class='add'>+    local user1;</div><div class='add'>+    local user2;</div><div class='add'>+    local group1;</div><div class='add'>+    local group2;</div><div class='add'>+</div><div class='add'>+    #### file</div><div class='add'>+</div><div class='add'>+    user1=$(stat -c '%u' $PFX/dir/file);</div><div class='add'>+    group1=$(stat -c '%g' $PFX/dir/file);</div><div class='add'>+</div><div class='add'>+    chown 13:42 $PFX/dir/file || fail "chown"</div><div class='add'>+</div><div class='add'>+    user2=$(stat -c '%u' $PFX/dir/file);</div><div class='add'>+    group2=$(stat -c '%g' $PFX/dir/file);</div><div class='add'>+</div><div class='add'>+    test $user2 == 13 || fail "User comparison after chown"</div><div class='add'>+    test $group2 == 42 || fail "Group comparison after chown"</div><div class='add'>+</div><div class='add'>+    chown $user1:$group1 $PFX/dir/file || fail "chown"</div><div class='add'>+</div><div class='add'>+    user2=$(stat -c '%u' $PFX/dir/file);</div><div class='add'>+    group2=$(stat -c '%g' $PFX/dir/file);</div><div class='add'>+</div><div class='add'>+    test $user2 == $user1 || fail "User comparison after chown"</div><div class='add'>+    test $group2 == $group1 || fail "Group comparison after chown"</div><div class='add'>+</div><div class='add'>+    #### dir</div><div class='add'>+</div><div class='add'>+    user1=$(stat -c '%u' $PFX/dir);</div><div class='add'>+    group1=$(stat -c '%g' $PFX/dir);</div><div class='add'>+</div><div class='add'>+    chown 13:42 $PFX/dir || fail "chown"</div><div class='add'>+</div><div class='add'>+    user2=$(stat -c '%u' $PFX/dir);</div><div class='add'>+    group2=$(stat -c '%g' $PFX/dir);</div><div class='add'>+</div><div class='add'>+    test $user2 == 13 || fail "User comparison after chown"</div><div class='add'>+    test $group2 == 42 || fail "Group comparison after chown"</div><div class='add'>+</div><div class='add'>+    chown $user1:$group1 $PFX/dir || fail "chown"</div><div class='add'>+</div><div class='add'>+    user2=$(stat -c '%u' $PFX/dir);</div><div class='add'>+    group2=$(stat -c '%g' $PFX/dir);</div><div class='add'>+</div><div class='add'>+    test $user2 == $user1 || fail "User comparison after chown"</div><div class='add'>+    test $group2 == $group1 || fail "Group comparison after chown"</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+function test_utimes()</div><div class='add'>+{</div><div class='add'>+    local acc0;</div><div class='add'>+    local acc1;</div><div class='add'>+    local acc2;</div><div class='add'>+    local mod0;</div><div class='add'>+    local mod1;</div><div class='add'>+    local mod2;</div><div class='add'>+</div><div class='add'>+    #### file</div><div class='add'>+</div><div class='add'>+    acc0=$(stat -c '%X' $PFX/dir/file);</div><div class='add'>+    mod0=$(stat -c '%Y' $PFX/dir/file);</div><div class='add'>+</div><div class='add'>+    sleep 1;</div><div class='add'>+    touch -a $PFX/dir/file || fail "atime change on file"</div><div class='add'>+</div><div class='add'>+    acc1=$(stat -c '%X' $PFX/dir/file);</div><div class='add'>+    mod1=$(stat -c '%Y' $PFX/dir/file);</div><div class='add'>+</div><div class='add'>+    sleep 1;</div><div class='add'>+    touch -m $PFX/dir/file || fail "mtime change on file"</div><div class='add'>+</div><div class='add'>+    acc2=$(stat -c '%X' $PFX/dir/file);</div><div class='add'>+    mod2=$(stat -c '%Y' $PFX/dir/file);</div><div class='add'>+</div><div class='add'>+    test $acc0 != $acc1 || fail "atime mismatch comparison on file"</div><div class='add'>+    test $acc1 == $acc2 || fail "atime match comparison on file"</div><div class='add'>+    test $mod0 == $mod1 || fail "mtime match comparison on file"</div><div class='add'>+    test $mod1 != $mod2 || fail "mtime mismatch comparison on file"</div><div class='add'>+</div><div class='add'>+    #### dir</div><div class='add'>+</div><div class='add'>+    acc0=$(stat -c '%X' $PFX/dir);</div><div class='add'>+    mod0=$(stat -c '%Y' $PFX/dir);</div><div class='add'>+</div><div class='add'>+    sleep 1;</div><div class='add'>+    touch -a $PFX/dir || fail "atime change on directory"</div><div class='add'>+</div><div class='add'>+    acc1=$(stat -c '%X' $PFX/dir);</div><div class='add'>+    mod1=$(stat -c '%Y' $PFX/dir);</div><div class='add'>+</div><div class='add'>+    sleep 1;</div><div class='add'>+    touch -m $PFX/dir || fail "mtime change on directory"</div><div class='add'>+</div><div class='add'>+    acc2=$(stat -c '%X' $PFX/dir);</div><div class='add'>+    mod2=$(stat -c '%Y' $PFX/dir);</div><div class='add'>+</div><div class='add'>+    test $acc0 != $acc1 || fail "atime mismatch comparison on directory"</div><div class='add'>+    test $acc1 == $acc2 || fail "atime match comparison on directory"</div><div class='add'>+    test $mod0 == $mod1 || fail "mtime match comparison on directory"</div><div class='add'>+    test $mod1 != $mod2 || fail "mtime mismatch comparison on directory"</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+function test_locks()</div><div class='add'>+{</div><div class='add'>+    exec 100&gt;$PFX/dir/lockfile || fail "exec"</div><div class='add'>+</div><div class='add'>+    ## exclusive locks test</div><div class='add'>+    flock -x 100 || fail "flock -x"</div><div class='add'>+    ! flock -n -x $PFX/dir/lockfile -c true || fail "! flock -n -x"</div><div class='add'>+    ! flock -n -s $PFX/dir/lockfile -c true || fail "! flock -n -s"</div><div class='add'>+    flock -u 100 || fail "flock -u"</div><div class='add'>+</div><div class='add'>+    ## shared locks test</div><div class='add'>+    flock -s 100 || fail "flock -s"</div><div class='add'>+    ! flock -n -x $PFX/dir/lockfile -c true || fail "! flock -n -x"</div><div class='add'>+    flock -n -s $PFX/dir/lockfile -c true || fail "! flock -n -s"</div><div class='add'>+    flock -u 100 || fail "flock -u"</div><div class='add'>+</div><div class='add'>+    exec 100&gt;&amp;- || fail "exec"</div><div class='add'>+</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+function test_readdir()</div><div class='add'>+{</div><div class='add'>+    /bin/ls $PFX/dir &gt;/dev/null || fail "ls"</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+function test_setxattr()</div><div class='add'>+{</div><div class='add'>+    setfattr -n trusted.testing -v c00k33 $PFX/dir/file || fail "setfattr"</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+function test_listxattr()</div><div class='add'>+{</div><div class='add'>+    getfattr -m trusted $PFX/dir/file 2&gt;/dev/null | grep -q trusted.testing || fail "getfattr"</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+function test_getxattr()</div><div class='add'>+{</div><div class='add'>+    getfattr -n trusted.testing $PFX/dir/file 2&gt;/dev/null | grep -q c00k33 || fail "getfattr"</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+function test_removexattr()</div><div class='add'>+{</div><div class='add'>+    setfattr -x trusted.testing $PFX/dir/file || fail "setfattr remove"</div><div class='add'>+    getfattr -n trusted.testing $PFXf/dir/file 2&gt;&amp;1 | grep -q "No such attribute"</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+function test_unlink()</div><div class='add'>+{</div><div class='add'>+    rm $PFX/dir/file || fail "rm"</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+function test_rmdir()</div><div class='add'>+{</div><div class='add'>+    rm -rf $PFX || fail "rm -rf"</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function test_statvfs()</div><div class='add'>+{</div><div class='add'>+    df $DIR 2&gt;&amp;1 || fail "df"</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+function run_tests()</div><div class='add'>+{</div><div class='add'>+    test_statvfs;</div><div class='add'>+    test_mkdir;</div><div class='add'>+    test_create;</div><div class='add'>+    test_statfs;</div><div class='add'>+    test_open;</div><div class='add'>+    test_write;</div><div class='add'>+    test_read;</div><div class='add'>+    test_truncate;</div><div class='add'>+    test_fstat;</div><div class='add'>+    test_mknod;</div><div class='add'>+    test_hardlink;</div><div class='add'>+    test_symlink;</div><div class='add'>+    test_rename;</div><div class='add'>+    test_chmod;</div><div class='add'>+    test_chown;</div><div class='add'>+    test_readdir;</div><div class='add'>+    test_setxattr;</div><div class='add'>+    test_listxattr;</div><div class='add'>+    test_getxattr;</div><div class='add'>+    test_removexattr;</div><div class='add'>+    if [ "$run_lock_tests" = "1" ]; then</div><div class='add'>+        test_locks;</div><div class='add'>+    fi</div><div class='add'>+    test_utimes;</div><div class='add'>+    test_unlink;</div><div class='add'>+    test_rmdir;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+function _init()</div><div class='add'>+{</div><div class='add'>+    DIR=$(pwd);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+run_lock_tests=1</div><div class='add'>+function parse_cmdline()</div><div class='add'>+{</div><div class='add'>+    if [ "x$1" == "x" ] ; then</div><div class='add'>+        echo "Usage: $0 [--no-locks] /path/mount"</div><div class='add'>+        exit 1</div><div class='add'>+    fi</div><div class='add'>+</div><div class='add'>+    if [ "$1" == "--no-locks" ] ; then</div><div class='add'>+        run_lock_tests=0</div><div class='add'>+        shift</div><div class='add'>+    fi</div><div class='add'>+</div><div class='add'>+    DIR=$1;</div><div class='add'>+</div><div class='add'>+    if [ ! -d "$DIR" ] ; then</div><div class='add'>+        echo "$DIR: not a directory"</div><div class='add'>+        exit 1</div><div class='add'>+    fi</div><div class='add'>+</div><div class='add'>+    PFX="$DIR/coverage";</div><div class='add'>+    rm -rvf $PFX;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+function main()</div><div class='add'>+{</div><div class='add'>+    parse_cmdline "$@";</div><div class='add'>+</div><div class='add'>+    run_tests;</div><div class='add'>+</div><div class='add'>+    exit 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+_init &amp;&amp; main "$@";</div><div class='head'>diff --git a/tests/basic/rpc-coverage.t b/tests/basic/rpc-coverage.t<br/>new file mode 100755<br/>index 00000000000..2c1bcd5a63a<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/rpc-coverage.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/rpc-coverage.t</a></div><div class='hunk'>@@ -0,0 +1,25 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../include.rc</div><div class='add'>+. $(dirname $0)/../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume info;</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 replica 3  $H0:$B0/${V0}{1,2,3,4,5,6,7,8,9};</div><div class='add'>+</div><div class='add'>+EXPECT "$V0" volinfo_field $V0 'Volume Name';</div><div class='add'>+EXPECT 'Created' volinfo_field $V0 'Status';</div><div class='add'>+EXPECT '9' brick_count $V0</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+EXPECT 'Started' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+## Mount FUSE</div><div class='add'>+TEST $GFS -s $H0 --volfile-id $V0 $M1;</div><div class='add'>+</div><div class='add'>+TEST $(dirname $0)/rpc-coverage.sh $M1</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/basic/sdfs-sanity.t b/tests/basic/sdfs-sanity.t<br/>new file mode 100644<br/>index 00000000000..16d0bed866f<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/sdfs-sanity.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/sdfs-sanity.t</a></div><div class='hunk'>@@ -0,0 +1,28 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../include.rc</div><div class='add'>+. $(dirname $0)/../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 replica 3  $H0:$B0/${V0}{1,2,3,4,5,6,7,8,9};</div><div class='add'>+TEST $CLI volume set $V0 features.sdfs enable;</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+</div><div class='add'>+## Mount FUSE</div><div class='add'>+TEST $GFS -s $H0 --volfile-id $V0 $M1;</div><div class='add'>+</div><div class='add'>+# This test covers lookup, mkdir, mknod, symlink, link, rename,</div><div class='add'>+# create operations</div><div class='add'>+TEST $(dirname $0)/rpc-coverage.sh $M1</div><div class='add'>+</div><div class='add'>+TEST cp $(dirname ${0})/gfapi/glfsxmp-coverage.c glfsxmp.c</div><div class='add'>+TEST build_tester ./glfsxmp.c -lgfapi</div><div class='add'>+TEST ./glfsxmp $V0 $H0</div><div class='add'>+TEST cleanup_tester ./glfsxmp</div><div class='add'>+TEST rm ./glfsxmp.c</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/basic/seek.c b/tests/basic/seek.c<br/>new file mode 100644<br/>index 00000000000..54fa6f463af<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/seek.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/seek.c</a></div><div class='hunk'>@@ -0,0 +1,182 @@</div><div class='add'>+</div><div class='add'>+#define _GNU_SOURCE</div><div class='add'>+</div><div class='add'>+#include &lt;stdio.h&gt;</div><div class='add'>+#include &lt;stdlib.h&gt;</div><div class='add'>+#include &lt;unistd.h&gt;</div><div class='add'>+#include &lt;sys/types.h&gt;</div><div class='add'>+#include &lt;sys/stat.h&gt;</div><div class='add'>+#include &lt;fcntl.h&gt;</div><div class='add'>+#include &lt;string.h&gt;</div><div class='add'>+#include &lt;errno.h&gt;</div><div class='add'>+</div><div class='add'>+static char buffer[65536];</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+parse_int(const char *text, size_t *value)</div><div class='add'>+{</div><div class='add'>+    char *ptr;</div><div class='add'>+    size_t val;</div><div class='add'>+</div><div class='add'>+    val = strtoul(text, &amp;ptr, 0);</div><div class='add'>+    if (*ptr != 0) {</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    *value = val;</div><div class='add'>+</div><div class='add'>+    return 1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+fill_area(int fd, off_t offset, size_t size)</div><div class='add'>+{</div><div class='add'>+    size_t len;</div><div class='add'>+    ssize_t res;</div><div class='add'>+</div><div class='add'>+    while (size &gt; 0) {</div><div class='add'>+        len = sizeof(buffer);</div><div class='add'>+        if (len &gt; size) {</div><div class='add'>+            len = size;</div><div class='add'>+        }</div><div class='add'>+        res = pwrite(fd, buffer, len, offset);</div><div class='add'>+        if (res &lt; 0) {</div><div class='add'>+            fprintf(stderr, "pwrite(%d, %p, %lu, %lu) failed: %d\n", fd, buffer,</div><div class='add'>+                    size, offset, errno);</div><div class='add'>+            return 0;</div><div class='add'>+        }</div><div class='add'>+        if (res != len) {</div><div class='add'>+            fprintf(stderr,</div><div class='add'>+                    "pwrite(%d, %p, %lu, %lu) didn't wrote all "</div><div class='add'>+                    "data: %lu/%lu\n",</div><div class='add'>+                    fd, buffer, size, offset, res, len);</div><div class='add'>+            return 0;</div><div class='add'>+        }</div><div class='add'>+        offset += len;</div><div class='add'>+        size -= len;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+syntax(void)</div><div class='add'>+{</div><div class='add'>+    fprintf(stderr, "Syntax: seek create &lt;path&gt; &lt;offset&gt; &lt;size&gt; [...]\n");</div><div class='add'>+    fprintf(stderr, "        seek scan &lt;path&gt; data|hole &lt;offset&gt;\n");</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+seek_create(const char *path, int argc, char *argv[])</div><div class='add'>+{</div><div class='add'>+    size_t off, size;</div><div class='add'>+    int fd;</div><div class='add'>+    int ret = 1;</div><div class='add'>+</div><div class='add'>+    fd = open(path, O_CREAT | O_TRUNC | O_RDWR, 0644);</div><div class='add'>+    if (fd &lt; 0) {</div><div class='add'>+        fprintf(stderr, "Failed to create the file\n");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    while (argc &gt; 0) {</div><div class='add'>+        if (!parse_int(argv[0], &amp;off) || !parse_int(argv[1], &amp;size)) {</div><div class='add'>+            syntax();</div><div class='add'>+            goto out_close;</div><div class='add'>+        }</div><div class='add'>+        if (!fill_area(fd, off, size)) {</div><div class='add'>+            goto out_close;</div><div class='add'>+        }</div><div class='add'>+        argv += 2;</div><div class='add'>+        argc -= 2;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+</div><div class='add'>+out_close:</div><div class='add'>+    close(fd);</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+seek_scan(const char *path, const char *type, const char *pos)</div><div class='add'>+{</div><div class='add'>+    size_t off, res;</div><div class='add'>+    int fd, whence;</div><div class='add'>+    int ret = 1;</div><div class='add'>+</div><div class='add'>+    if (strcmp(type, "data") == 0) {</div><div class='add'>+        whence = SEEK_DATA;</div><div class='add'>+    } else if (strcmp(type, "hole") == 0) {</div><div class='add'>+        whence = SEEK_HOLE;</div><div class='add'>+    } else {</div><div class='add'>+        syntax();</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (!parse_int(pos, &amp;off)) {</div><div class='add'>+        syntax();</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    fd = open(path, O_RDWR);</div><div class='add'>+    if (fd &lt; 0) {</div><div class='add'>+        fprintf(stderr, "Failed to open the file\n");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    res = lseek(fd, off, whence);</div><div class='add'>+    if (res == (off_t)-1) {</div><div class='add'>+        if (errno != ENXIO) {</div><div class='add'>+            fprintf(stderr, "seek(%d, %lu, %d) failed: %d\n", fd, off, whence,</div><div class='add'>+                    errno);</div><div class='add'>+            goto out_close;</div><div class='add'>+        }</div><div class='add'>+        fprintf(stdout, "ENXIO\n");</div><div class='add'>+    } else {</div><div class='add'>+        fprintf(stdout, "%lu\n", res);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+</div><div class='add'>+out_close:</div><div class='add'>+    close(fd);</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+main(int argc, char *argv[])</div><div class='add'>+{</div><div class='add'>+    int ret = 1;</div><div class='add'>+</div><div class='add'>+    memset(buffer, 0x55, sizeof(buffer));</div><div class='add'>+</div><div class='add'>+    if (argc &lt; 3) {</div><div class='add'>+        syntax();</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (strcmp(argv[1], "create") == 0) {</div><div class='add'>+        if (((argc - 3) &amp; 1) != 0) {</div><div class='add'>+            syntax();</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+        ret = seek_create(argv[2], argc - 3, argv + 3);</div><div class='add'>+    } else if (strcmp(argv[1], "scan") == 0) {</div><div class='add'>+        if (argc != 5) {</div><div class='add'>+            syntax();</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+        ret = seek_scan(argv[2], argv[3], argv[4]);</div><div class='add'>+    } else {</div><div class='add'>+        syntax();</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='head'>diff --git a/tests/basic/shd-mux-afr.t b/tests/basic/shd-mux-afr.t<br/>new file mode 100644<br/>index 00000000000..cf300c148bb<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/shd-mux-afr.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/shd-mux-afr.t</a></div><div class='hunk'>@@ -0,0 +1,70 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../include.rc</div><div class='add'>+. $(dirname $0)/../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 replica 3 $H0:$B0/${V0}{0,1,2,3,4,5}</div><div class='add'>+TEST $CLI volume set $V0 cluster.background-self-heal-count 0</div><div class='add'>+TEST $CLI volume set $V0 cluster.eager-lock off</div><div class='add'>+TEST $CLI volume set $V0 performance.flush-behind off</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+TEST $GFS --volfile-id=/$V0 --volfile-server=$H0 $M0</div><div class='add'>+</div><div class='add'>+shd_pid=$(get_shd_mux_pid $V0)</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "^6$" number_healer_threads_shd $V0 "afr_shd_index_healer"</div><div class='add'>+</div><div class='add'>+#Create a one more volume</div><div class='add'>+TEST $CLI volume create ${V0}_1 replica 3 $H0:$B0/${V0}_1{0,1,2,3,4,5}</div><div class='add'>+TEST $CLI volume start ${V0}_1</div><div class='add'>+</div><div class='add'>+#Check whether the shd has multiplexed or not</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "^1$" shd_count</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "^${shd_pid}$" get_shd_mux_pid ${V0}_1</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "^${shd_pid}$" get_shd_mux_pid ${V0}</div><div class='add'>+</div><div class='add'>+TEST $CLI volume set ${V0}_1 cluster.background-self-heal-count 0</div><div class='add'>+TEST $CLI volume set ${V0}_1 cluster.eager-lock off</div><div class='add'>+TEST $CLI volume set ${V0}_1 performance.flush-behind off</div><div class='add'>+TEST $GFS --volfile-id=/${V0}_1 --volfile-server=$H0 $M1</div><div class='add'>+</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}0</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}4</div><div class='add'>+TEST kill_brick ${V0}_1 $H0 $B0/${V0}_10</div><div class='add'>+TEST kill_brick ${V0}_1 $H0 $B0/${V0}_14</div><div class='add'>+</div><div class='add'>+TEST touch $M0/foo{1..100}</div><div class='add'>+TEST touch $M1/foo{1..100}</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "^204$" get_pending_heal_count $V0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "^204$" get_pending_heal_count ${V0}_1</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start ${V0} force</div><div class='add'>+TEST $CLI volume start ${V0}_1 force</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "^0$" get_pending_heal_count $V0</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "^0$" get_pending_heal_count ${V0}_1</div><div class='add'>+</div><div class='add'>+TEST rm -rf $M0/*</div><div class='add'>+TEST rm -rf $M1/*</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M1</div><div class='add'>+</div><div class='add'>+#Stop the volume</div><div class='add'>+TEST $CLI volume stop ${V0}_1</div><div class='add'>+TEST $CLI volume delete ${V0}_1</div><div class='add'>+</div><div class='add'>+#Check the stop succeeded and detached the volume with out restarting it</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "^1$" shd_count</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "^${shd_pid}$" get_shd_mux_pid $V0</div><div class='add'>+</div><div class='add'>+#Check the thread count become to earlier number after stopping</div><div class='add'>+EXPECT_WITHIN $PROCESS_DOWN_TIMEOUT "^6$" number_healer_threads_shd $V0 "afr_shd_index_healer"</div><div class='add'>+</div><div class='add'>+TEST $CLI volume stop ${V0}</div><div class='add'>+TEST $CLI volume delete ${V0}</div><div class='add'>+EXPECT_WITHIN $PROCESS_DOWN_TIMEOUT "^0$" shd_count</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/basic/shd-mux-ec.t b/tests/basic/shd-mux-ec.t<br/>new file mode 100644<br/>index 00000000000..ef4d65018d3<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/shd-mux-ec.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/shd-mux-ec.t</a></div><div class='hunk'>@@ -0,0 +1,75 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../include.rc</div><div class='add'>+. $(dirname $0)/../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 replica 3 $H0:$B0/${V0}{0,1,2,3,4,5}</div><div class='add'>+TEST $CLI volume set $V0 cluster.background-self-heal-count 0</div><div class='add'>+TEST $CLI volume set $V0 cluster.eager-lock off</div><div class='add'>+TEST $CLI volume set $V0 performance.flush-behind off</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+TEST $GFS --volfile-id=/$V0 --volfile-server=$H0 $M0</div><div class='add'>+</div><div class='add'>+shd_pid=$(get_shd_mux_pid $V0)</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "^6$" number_healer_threads_shd $V0 "afr_shd_index_healer"</div><div class='add'>+</div><div class='add'>+#Now create a  ec volume and check mux works</div><div class='add'>+TEST $CLI volume create ${V0}_2 disperse 6 redundancy 2 $H0:$B0/${V0}_2{0,1,2,3,4,5}</div><div class='add'>+TEST $CLI volume start ${V0}_2</div><div class='add'>+</div><div class='add'>+#Check whether the shd has multiplexed or not</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "^1$" shd_count</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "^${shd_pid}$" get_shd_mux_pid ${V0}_2</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "^${shd_pid}$" get_shd_mux_pid ${V0}</div><div class='add'>+</div><div class='add'>+TEST $CLI volume set ${V0}_2 cluster.background-self-heal-count 0</div><div class='add'>+TEST $CLI volume set ${V0}_2 cluster.eager-lock off</div><div class='add'>+TEST $CLI volume set ${V0}_2 performance.flush-behind off</div><div class='add'>+TEST $GFS --volfile-id=/${V0}_2 --volfile-server=$H0 $M1</div><div class='add'>+</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}0</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}4</div><div class='add'>+TEST kill_brick ${V0}_2 $H0 $B0/${V0}_20</div><div class='add'>+TEST kill_brick ${V0}_2 $H0 $B0/${V0}_22</div><div class='add'>+</div><div class='add'>+TEST touch $M0/foo{1..100}</div><div class='add'>+TEST touch $M1/foo{1..100}</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "^204$" get_pending_heal_count $V0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "^404$" get_pending_heal_count ${V0}_2</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start ${V0} force</div><div class='add'>+TEST $CLI volume start ${V0}_2 force</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "^6$" number_healer_threads_shd $V0 "ec_shd_index_healer"</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "^0$" get_pending_heal_count $V0</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "^0$" get_pending_heal_count ${V0}_2</div><div class='add'>+</div><div class='add'>+TEST rm -rf $M0/*</div><div class='add'>+TEST rm -rf $M1/*</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+#Stop the volume</div><div class='add'>+TEST $CLI volume stop ${V0}_2</div><div class='add'>+TEST $CLI volume delete ${V0}_2</div><div class='add'>+</div><div class='add'>+#Check the stop succeeded and detached the volume with out restarting it</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "^1$" shd_count</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "^${shd_pid}$" get_shd_mux_pid $V0</div><div class='add'>+</div><div class='add'>+#Check the thread count become to zero for ec related threads</div><div class='add'>+EXPECT_WITHIN $PROCESS_DOWN_TIMEOUT "^0$" number_healer_threads_shd $V0 "ec_shd_index_healer"</div><div class='add'>+#Check the thread count become to earlier number after stopping</div><div class='add'>+EXPECT_WITHIN $PROCESS_DOWN_TIMEOUT "^6$" number_healer_threads_shd $V0 "afr_shd_index_healer"</div><div class='add'>+</div><div class='add'>+TEST $CLI volume stop ${V0}</div><div class='add'>+TEST $CLI volume delete ${V0}</div><div class='add'>+EXPECT_WITHIN $PROCESS_DOWN_TIMEOUT "^0$" shd_count</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/basic/stats-dump.t b/tests/basic/stats-dump.t<br/>new file mode 100644<br/>index 00000000000..ed73fd1d14a<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/stats-dump.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/stats-dump.t</a></div><div class='hunk'>@@ -0,0 +1,55 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../include.rc</div><div class='add'>+. $(dirname $0)/../volume.rc</div><div class='add'>+. $(dirname $0)/../nfs.rc</div><div class='add'>+</div><div class='add'>+#G_TESTDEF_TEST_STATUS_CENTOS6=NFS_TEST</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 replica 3 $H0:$B0/${V0}{0,1,2}</div><div class='add'>+TEST $CLI volume set $V0 diagnostics.latency-measurement on</div><div class='add'>+TEST $CLI volume set $V0 diagnostics.count-fop-hits on</div><div class='add'>+TEST $CLI volume set $V0 diagnostics.stats-dump-interval 1</div><div class='add'>+TEST $CLI volume set $V0 performance.nfs.io-threads on</div><div class='add'>+TEST $CLI volume set $V0 nfs.disable off</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+EXPECT_WITHIN $NFS_EXPORT_TIMEOUT "1" is_nfs_export_available</div><div class='add'>+TEST glusterfs --volfile-id=/$V0 --volfile-server=$H0 $M0 --attribute-timeout=0 --entry-timeout=0</div><div class='add'>+TEST mount_nfs $H0:/$V0 $N0 nolock,soft,intr</div><div class='add'>+</div><div class='add'>+for i in {1..10};do</div><div class='add'>+  dd if=/dev/zero of=$M0/fuse_testfile$i bs=4k count=100</div><div class='add'>+done</div><div class='add'>+</div><div class='add'>+for i in {1..10};do</div><div class='add'>+  dd if=/dev/zero of=$N0/nfs_testfile$i bs=4k count=100</div><div class='add'>+done</div><div class='add'>+</div><div class='add'>+# Wait for one dump interval to be done, some seconds past 1 that is the dump</div><div class='add'>+# interval set</div><div class='add'>+sleep 2</div><div class='add'>+</div><div class='add'>+# Change the dump interval to 0, so that when reading the file contents we</div><div class='add'>+# do not get them truncated by the next interval that is overwriting the latest</div><div class='add'>+# stats data</div><div class='add'>+TEST $CLI volume set $V0 diagnostics.stats-dump-interval 0</div><div class='add'>+</div><div class='add'>+# Verify we have non-zero write counts from the bricks, gNFSd</div><div class='add'>+# and the FUSE mount.</div><div class='add'>+TEST [ $(grep 'aggr.fop.write.count' ${GLUSTERD_WORKDIR}/stats/glusterfs_nfsd.dump|tail -1|cut -d: -f2) != "0," ]</div><div class='add'>+TEST [ $(grep 'aggr.fop.write.count' ${GLUSTERD_WORKDIR}/stats/glusterfs_patchy.dump|tail -1|cut -d: -f2) != "0," ]</div><div class='add'>+TEST [ $(grep 'aggr.fop.write.count' ${GLUSTERD_WORKDIR}/stats/glusterfsd__d_backends_patchy0.dump|tail -1|cut -d: -f2) != "0," ]</div><div class='add'>+TEST [ $(grep 'aggr.fop.write.count' ${GLUSTERD_WORKDIR}/stats/glusterfsd__d_backends_patchy1.dump|tail -1|cut -d: -f2) != "0," ]</div><div class='add'>+TEST [ $(grep 'aggr.fop.write.count' ${GLUSTERD_WORKDIR}/stats/glusterfsd__d_backends_patchy2.dump|tail -1|cut -d: -f2) != "0," ]</div><div class='add'>+</div><div class='add'>+# Test that io-stats is getting queue sizes from io-threads</div><div class='add'>+TEST grep '.queue_size' ${GLUSTERD_WORKDIR}/stats/glusterfs_nfsd.dump</div><div class='add'>+TEST grep '.queue_size' ${GLUSTERD_WORKDIR}/stats/glusterfsd__d_backends_patchy0.dump</div><div class='add'>+TEST grep '.queue_size' ${GLUSTERD_WORKDIR}/stats/glusterfsd__d_backends_patchy1.dump</div><div class='add'>+TEST grep '.queue_size' ${GLUSTERD_WORKDIR}/stats/glusterfsd__d_backends_patchy2.dump</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/basic/symbol-check.sh b/tests/basic/symbol-check.sh<br/>new file mode 100755<br/>index 00000000000..0f8243ca731<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/symbol-check.sh?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/symbol-check.sh</a></div><div class='hunk'>@@ -0,0 +1,114 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+syscalls=$'access\nchmod\nchown\nclose\nclosedir\ncreat64\n\</div><div class='add'>+fallocate64\nfchmod\nfchown\nfdatasync\nfgetxattr\nflistxattr\n\</div><div class='add'>+fremovexattr\nfsetxattr\nfsync\nftruncate64\n__fxstat64\n\</div><div class='add'>+__fxstatat64\nlchown\nlgetxattr\nlinkat\nllistxattr\nlremovexattr\n\</div><div class='add'>+lseek64\nlsetxattr\n__lxstat64\nmkdir\nmkdirat\nopenat64\nopendir\n\</div><div class='add'>+pread64\npwrite64\npreadv64\npwritev64\nread\nreaddir64\nreadlink\n\</div><div class='add'>+readv\nrename\nrmdir\n statvfs64\nsymlink\n\truncate64\nunlink\n\</div><div class='add'>+utimeswrite\nwritev\n\__xmknod\n__xstat64'</div><div class='add'>+</div><div class='add'>+syscalls32=$'creat\nfallocate\nftruncate\n__fxstat\n__fxstatat\n\</div><div class='add'>+lseek\n__lxstat\nopenat\nreaddir\nstatvfs\ntruncate\nstat\n\</div><div class='add'>+preadv\npwritev\npread\npwrite'</div><div class='add'>+</div><div class='add'>+glibccalls=$'tmpfile'</div><div class='add'>+</div><div class='add'>+exclude_files=$'/libglusterfs/src/.libs/libglusterfs_la-syscall.o\n\</div><div class='add'>+/libglusterfs/src/.libs/libglusterfs_la-gen_uuid.o\n\</div><div class='add'>+/contrib/fuse-util/fusermount.o\n\</div><div class='add'>+/contrib/fuse-util/mount_util.o\n\</div><div class='add'>+/contrib/fuse-util/mount-common.o\n\</div><div class='add'>+/xlators/mount/fuse/src/.libs/mount.o\n\</div><div class='add'>+/xlators/mount/fuse/src/.libs/mount-common.o\n\</div><div class='add'>+/xlators/features/qemu-block/src/.libs/block.o\n\</div><div class='add'>+/xlators/features/qemu-block/src/.libs/cutils.o\n\</div><div class='add'>+/xlators/features/qemu-block/src/.libs/oslib-posix.o'</div><div class='add'>+</div><div class='add'>+function main()</div><div class='add'>+{</div><div class='add'>+    for exclude_file in ${exclude_files}; do</div><div class='add'>+        if [[ ${1} = *${exclude_file} ]]; then</div><div class='add'>+            exit 0</div><div class='add'>+        fi</div><div class='add'>+    done</div><div class='add'>+</div><div class='add'>+    local retval=0</div><div class='add'>+    local t</div><div class='add'>+    t=$(nm "${1}" | grep " U " | sed -e "s/  //g" -e "s/ U //g")</div><div class='add'>+</div><div class='add'>+    for symy in ${t}; do</div><div class='add'>+</div><div class='add'>+        for symx in ${syscalls}; do</div><div class='add'>+</div><div class='add'>+            if [[ ${symx} = "${symy}" ]]; then</div><div class='add'>+</div><div class='add'>+                case ${symx} in</div><div class='add'>+                "creat64") sym="creat";;</div><div class='add'>+                "fallocate64") sym="fallocate";;</div><div class='add'>+                "ftruncate64") sym="ftruncate";;</div><div class='add'>+                "lseek64") sym="lseek";;</div><div class='add'>+                "preadv64") sym="preadv";;</div><div class='add'>+                "pwritev64") sym="pwritev";;</div><div class='add'>+                "pread64") sym="pread";;</div><div class='add'>+                "pwrite64") sym="pwrite";;</div><div class='add'>+                "openat64") sym="openat";;</div><div class='add'>+                "readdir64") sym="readdir";;</div><div class='add'>+                "truncate64") sym="truncate";;</div><div class='add'>+                "__statvfs64") sym="statvfs";;</div><div class='add'>+                "__fxstat64") sym="fstat";;</div><div class='add'>+                "__fxstatat64") sym="fstatat";;</div><div class='add'>+                "__lxstat64") sym="lstat";;</div><div class='add'>+                "__xmknod") sym="mknod";;</div><div class='add'>+                "__xstat64") sym="stat";;</div><div class='add'>+                *) sym=${symx};;</div><div class='add'>+                esac</div><div class='add'>+</div><div class='add'>+	        echo "${1} should call sys_${sym}, not ${sym}" &gt;&amp;2</div><div class='add'>+                retval=1</div><div class='add'>+	    fi</div><div class='add'>+</div><div class='add'>+        done</div><div class='add'>+</div><div class='add'>+        for symx in ${syscalls32}; do</div><div class='add'>+</div><div class='add'>+            if [[ ${symx} = "${symy}" ]]; then</div><div class='add'>+</div><div class='add'>+                echo "${1} was not compiled with -D_FILE_OFFSET_BITS=64" &gt;&amp;2</div><div class='add'>+                retval=1</div><div class='add'>+            fi</div><div class='add'>+        done</div><div class='add'>+</div><div class='add'>+        symy_glibc=$(echo "${symy}" | sed -e "s/@@GLIBC.*//g")</div><div class='add'>+        # Eliminate false positives, check if we have a GLIBC symbol in 'y'</div><div class='add'>+        if [[ ${symy} != "${symy_glibc}" ]]; then</div><div class='add'>+            for symx in ${glibccalls}; do</div><div class='add'>+</div><div class='add'>+                if [[ ${symx} = "${symy_glibc}" ]]; then</div><div class='add'>+</div><div class='add'>+                    case ${symx} in</div><div class='add'>+                    "tmpfile") alt="mkstemp";;</div><div class='add'>+                    *) alt="none";;</div><div class='add'>+                    esac</div><div class='add'>+</div><div class='add'>+                    if [[ ${alt} = "none" ]]; then</div><div class='add'>+                        echo "${1} should not call ${symy_glibc}";</div><div class='add'>+                    else</div><div class='add'>+                        echo "${1} should use ${alt} instead of ${symy_glibc}" &gt;&amp;2;</div><div class='add'>+                    fi</div><div class='add'>+</div><div class='add'>+                    retval=1</div><div class='add'>+                fi</div><div class='add'>+            done</div><div class='add'>+        fi</div><div class='add'>+</div><div class='add'>+    done</div><div class='add'>+</div><div class='add'>+    if [ ${retval} = 1 ]; then</div><div class='add'>+        touch ./.symbol-check-errors</div><div class='add'>+    fi</div><div class='add'>+    exit ${retval}</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+main "$@"</div><div class='head'>diff --git a/tests/basic/trace.t b/tests/basic/trace.t<br/>new file mode 100755<br/>index 00000000000..01e7c9e0a25<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/trace.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/trace.t</a></div><div class='hunk'>@@ -0,0 +1,55 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../include.rc</div><div class='add'>+. $(dirname $0)/../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST mkdir -p $B0/single-brick</div><div class='add'>+cat &gt; $B0/template.vol &lt;&lt;EOF</div><div class='add'>+volume posix</div><div class='add'>+  type storage/posix</div><div class='add'>+  option directory $B0/single-brick</div><div class='add'>+end-volume</div><div class='add'>+</div><div class='add'>+volume trace</div><div class='add'>+  type debug/trace</div><div class='add'>+  option log-file yes</div><div class='add'>+  option log-history yes</div><div class='add'>+  subvolumes posix</div><div class='add'>+end-volume</div><div class='add'>+EOF</div><div class='add'>+</div><div class='add'>+TEST glusterfs -f $B0/template.vol $M0</div><div class='add'>+</div><div class='add'>+TEST $(dirname $0)/rpc-coverage.sh --no-locks $M0</div><div class='add'>+</div><div class='add'>+# Take statedump to get maximum code coverage</div><div class='add'>+pid=$(ps auxww | grep glusterfs | grep -E "template.vol" | awk '{print $2}' | head -1)</div><div class='add'>+</div><div class='add'>+TEST generate_statedump $pid</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+</div><div class='add'>+# Now, use the glusterd way of enabling trace</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST $CLI volume create $V0 replica 3  $H0:$B0/${V0}{1,2,3,4,5,6};</div><div class='add'>+</div><div class='add'>+TEST $CLI volume set $V0 debug.trace marker</div><div class='add'>+TEST $CLI volume set $V0 debug.log-file yes</div><div class='add'>+#TEST $CLI volume set $V0 debug.log-history yes</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+</div><div class='add'>+TEST $GFS -s $H0 --volfile-id $V0 $M1;</div><div class='add'>+</div><div class='add'>+TEST $(dirname $0)/rpc-coverage.sh --no-locks $M1</div><div class='add'>+cp $(dirname ${0})/gfapi/glfsxmp-coverage.c ./glfsxmp.c</div><div class='add'>+build_tester ./glfsxmp.c -lgfapi</div><div class='add'>+./glfsxmp $V0 $H0 &gt; /dev/null</div><div class='add'>+cleanup_tester ./glfsxmp</div><div class='add'>+rm ./glfsxmp.c</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M1</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/basic/uss.t b/tests/basic/uss.t<br/>new file mode 100644<br/>index 00000000000..09dd00ef995<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/uss.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/uss.t</a></div><div class='hunk'>@@ -0,0 +1,421 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../include.rc</div><div class='add'>+. $(dirname $0)/../volume.rc</div><div class='add'>+. $(dirname $0)/../snapshot.rc</div><div class='add'>+. $(dirname $0)/../fileio.rc</div><div class='add'>+. $(dirname $0)/../nfs.rc</div><div class='add'>+</div><div class='add'>+#G_TESTDEF_TEST_STATUS_CENTOS6=NFS_TEST</div><div class='add'>+</div><div class='add'>+function check_readonly()</div><div class='add'>+{</div><div class='add'>+    $@ 2&gt;&amp;1 | grep -q 'Read-only file system'</div><div class='add'>+    return $?</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function lookup()</div><div class='add'>+{</div><div class='add'>+    ls $1</div><div class='add'>+    if [ "$?" == "0" ]</div><div class='add'>+    then</div><div class='add'>+        echo "Y"</div><div class='add'>+    else</div><div class='add'>+        echo "N"</div><div class='add'>+    fi</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+TESTS_EXPECTED_IN_LOOP=10</div><div class='add'>+</div><div class='add'>+TEST init_n_bricks 3;</div><div class='add'>+TEST setup_lvm 3;</div><div class='add'>+</div><div class='add'>+TEST glusterd;</div><div class='add'>+</div><div class='add'>+TEST pidof glusterd;</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 $H0:$L1 $H0:$L2 $H0:$L3;</div><div class='add'>+</div><div class='add'>+TEST $CLI volume set $V0 nfs.disable false</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+</div><div class='add'>+TEST $GFS --volfile-server=$H0 --volfile-id=$V0 $M0;</div><div class='add'>+</div><div class='add'>+for i in {1..10} ; do echo "file" &gt; $M0/file$i ; done</div><div class='add'>+</div><div class='add'>+# Create file and hard-links</div><div class='add'>+TEST touch $M0/f1</div><div class='add'>+TEST mkdir $M0/dir</div><div class='add'>+TEST ln $M0/f1 $M0/f2</div><div class='add'>+TEST ln $M0/f1 $M0/dir/f3</div><div class='add'>+</div><div class='add'>+TEST $CLI snapshot config activate-on-create enable</div><div class='add'>+TEST $CLI volume set $V0 features.uss enable;</div><div class='add'>+</div><div class='add'>+TEST ! $CLI snapshot create snap1 $V0 no-timestamp description "";</div><div class='add'>+TEST $CLI snapshot create snap1 $V0 no-timestamp;</div><div class='add'>+</div><div class='add'>+for i in {11..20} ; do echo "file" &gt; $M0/file$i ; done</div><div class='add'>+</div><div class='add'>+TEST $CLI snapshot create snap2 $V0 no-timestamp;</div><div class='add'>+</div><div class='add'>+########### Test inode numbers ###########</div><div class='add'>+s1_f1_ino=$(STAT_INO $M0/.snaps/snap1/f1)</div><div class='add'>+TEST [ $s1_f1_ino != 0 ]</div><div class='add'>+</div><div class='add'>+# Inode number of f1 should be same as f2 f3 within snapshot</div><div class='add'>+EXPECT $s1_f1_ino STAT_INO $M0/.snaps/snap1/f2</div><div class='add'>+EXPECT $s1_f1_ino STAT_INO $M0/.snaps/snap1/dir/f3</div><div class='add'>+EXPECT $s1_f1_ino STAT_INO $M0/dir/.snaps/snap1/f3</div><div class='add'>+</div><div class='add'>+# Inode number of f1 in snap1 should be different from f1 in snap2</div><div class='add'>+tmp_ino=$(STAT_INO $M0/.snaps/snap2/f1)</div><div class='add'>+TEST [ $s1_f1_ino != $tmp_ino ]</div><div class='add'>+</div><div class='add'>+# Inode number of f1 in snap1 should be different from f1 in regular volume</div><div class='add'>+tmp_ino=$(STAT_INO $M0/f1)</div><div class='add'>+TEST [ $s1_f1_ino != $tmp_ino ]</div><div class='add'>+</div><div class='add'>+# Directory inode of snap1 should be different in each sub-dir</div><div class='add'>+s1_ino=$(STAT_INO $M0/.snaps/snap1)</div><div class='add'>+tmp_ino=$(STAT_INO $M0/dir/.snaps/snap1)</div><div class='add'>+TEST [ $s1_ino != $tmp_ino ]</div><div class='add'>+##########################################</div><div class='add'>+</div><div class='add'>+mkdir $M0/dir1;</div><div class='add'>+mkdir $M0/dir2;</div><div class='add'>+</div><div class='add'>+for i in {1..10} ; do echo "foo" &gt; $M0/dir1/foo$i ; done</div><div class='add'>+for i in {1..10} ; do echo "foo" &gt; $M0/dir2/foo$i ; done</div><div class='add'>+</div><div class='add'>+TEST $CLI snapshot create snap3 $V0 no-timestamp;</div><div class='add'>+</div><div class='add'>+for i in {11..20} ; do echo "foo" &gt; $M0/dir1/foo$i ; done</div><div class='add'>+for i in {11..20} ; do echo "foo" &gt; $M0/dir2/foo$i ; done</div><div class='add'>+</div><div class='add'>+TEST $CLI snapshot create snap4 $V0 no-timestamp;</div><div class='add'>+## Test that features.uss takes only options enable/disable and throw error for</div><div class='add'>+## any other argument.</div><div class='add'>+for i in {1..10}; do</div><div class='add'>+        RANDOM_STRING=$(uuidgen | tr -dc 'a-zA-Z' | head -c 8)</div><div class='add'>+        TEST_IN_LOOP ! $CLI volume set $V0 features.uss $RANDOM_STRING</div><div class='add'>+done</div><div class='add'>+</div><div class='add'>+## Test that features.snapshot-directory:</div><div class='add'>+##   contains only '0-9a-z-_'</div><div class='add'>+#    starts with dot (.)</div><div class='add'>+#    value cannot exceed 255 characters</div><div class='add'>+## and throws error for any other argument.</div><div class='add'>+TEST ! $CLI volume set $V0 features.snapshot-directory a/b</div><div class='add'>+TEST ! $CLI volume set $V0 features.snapshot-directory snaps</div><div class='add'>+TEST ! $CLI volume set $V0 features.snapshot-directory -a</div><div class='add'>+TEST ! $CLI volume set $V0 features.snapshot-directory .</div><div class='add'>+TEST ! $CLI volume set $V0 features.snapshot-directory ..</div><div class='add'>+TEST ! $CLI volume set $V0 features.snapshot-directory .123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+</div><div class='add'>+TEST $GFS --volfile-server=$H0 --volfile-id=$V0 $M0;</div><div class='add'>+</div><div class='add'>+# test 15</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "4" count_snaps $M0</div><div class='add'>+</div><div class='add'>+NUM_SNAPS=$(ls $M0/.snaps | wc -l);</div><div class='add'>+</div><div class='add'>+TEST [ $NUM_SNAPS == 4 ]</div><div class='add'>+TEST ls $M0/.snaps/snap1;</div><div class='add'>+TEST ls $M0/.snaps/snap2;</div><div class='add'>+TEST ls $M0/.snaps/snap3;</div><div class='add'>+TEST ls $M0/.snaps/snap4;</div><div class='add'>+</div><div class='add'>+TEST ls $M0/.snaps/snap3/dir1;</div><div class='add'>+TEST ls $M0/.snaps/snap3/dir2;</div><div class='add'>+</div><div class='add'>+TEST ls $M0/.snaps/snap4/dir1;</div><div class='add'>+TEST ls $M0/.snaps/snap4/dir2;</div><div class='add'>+</div><div class='add'>+TEST ls $M0/dir1/.snaps/</div><div class='add'>+TEST ! ls $M0/dir1/.snaps/snap1;</div><div class='add'>+TEST ! ls $M0/dir2/.snaps/snap2;</div><div class='add'>+TEST   ls $M0/dir1/.snaps/snap3;</div><div class='add'>+TEST   ls $M0/dir2/.snaps/snap4;</div><div class='add'>+</div><div class='add'>+TEST fd1=`fd_available`</div><div class='add'>+TEST fd_open $fd1 'r' $M0/.snaps/snap1/file1;</div><div class='add'>+TEST fd_cat $fd1</div><div class='add'>+</div><div class='add'>+# opening fd with in write mode for snapshot files should fail</div><div class='add'>+TEST fd2=`fd_available`</div><div class='add'>+TEST ! fd_open $fd1 'w' $M0/.snaps/snap1/file2;</div><div class='add'>+</div><div class='add'>+# lookup on .snaps in the snapshot world should fail</div><div class='add'>+TEST ! stat $M0/.snaps/snap1/.snaps</div><div class='add'>+</div><div class='add'>+# creating new entries in snapshots should fail</div><div class='add'>+TEST check_readonly mkdir $M0/.snaps/new</div><div class='add'>+TEST check_readonly touch $M0/.snaps/snap2/other;</div><div class='add'>+</div><div class='add'>+TEST fd3=`fd_available`</div><div class='add'>+TEST fd_open $fd3 'r' $M0/dir1/.snaps/snap3/foo1</div><div class='add'>+</div><div class='add'>+TEST fd_cat $fd3;</div><div class='add'>+</div><div class='add'>+TEST fd_close $fd1;</div><div class='add'>+TEST fd_close $fd2;</div><div class='add'>+TEST fd_close $fd3</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+# similar tests on nfs mount</div><div class='add'>+##Wait for connection establishment between nfs server and brick process</div><div class='add'>+EXPECT_WITHIN $NFS_EXPORT_TIMEOUT "1" is_nfs_export_available;</div><div class='add'>+#test 44</div><div class='add'>+TEST mount_nfs $H0:/$V0 $N0 nolock;</div><div class='add'>+</div><div class='add'>+NUM_SNAPS=$(ls $N0/.snaps | wc -l);</div><div class='add'>+</div><div class='add'>+TEST [ $NUM_SNAPS == 4 ];</div><div class='add'>+</div><div class='add'>+TEST stat $N0/.snaps/snap1;</div><div class='add'>+TEST stat $N0/.snaps/snap2;</div><div class='add'>+</div><div class='add'>+TEST ls -l $N0/.snaps;</div><div class='add'>+</div><div class='add'>+# readdir + lookup on each entry</div><div class='add'>+TEST ls -l $N0/.snaps/snap1;</div><div class='add'>+TEST ls -l $N0/.snaps/snap2;</div><div class='add'>+</div><div class='add'>+# readdir + access each entry by doing stat. If snapview-server has not</div><div class='add'>+# filled the fs instance and handle in the inode context of the entry as</div><div class='add'>+# part of readdirp, then when stat comes (i.e fop comes directly without</div><div class='add'>+# a previous lookup), snapview-server should do a lookup of the entry via</div><div class='add'>+# gfapi call and fill in the fs instance + handle information in the inode</div><div class='add'>+# context</div><div class='add'>+TEST ls $N0/.snaps/snap3/;</div><div class='add'>+TEST stat $N0/.snaps/snap3/dir1;</div><div class='add'>+TEST stat $N0/.snaps/snap3/dir2;</div><div class='add'>+</div><div class='add'>+TEST ls -l $N0/.snaps/snap3/dir1;</div><div class='add'>+TEST ls -l $N0/.snaps/snap3/dir2;</div><div class='add'>+TEST ls -l $N0/.snaps/snap4/dir1;</div><div class='add'>+TEST ls -l $N0/.snaps/snap4/dir2;</div><div class='add'>+</div><div class='add'>+TEST ! ls -l $N0/dir1/.snaps/snap1;</div><div class='add'>+TEST ! ls -l $N0/dir2/.snaps/snap2;</div><div class='add'>+TEST   ls -l $N0/dir1/.snaps/snap3;</div><div class='add'>+TEST   ls -l $N0/dir2/.snaps/snap4;</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+TEST fd1=`fd_available`</div><div class='add'>+TEST fd_open $fd1 'r' $N0/.snaps/snap1/file1;</div><div class='add'>+TEST fd_cat $fd1</div><div class='add'>+</div><div class='add'>+TEST fd2=`fd_available`</div><div class='add'>+TEST ! fd_open $fd1 'w' $N0/.snaps/snap1/file2;</div><div class='add'>+</div><div class='add'>+TEST ! stat $N0/.snaps/snap1/.stat</div><div class='add'>+</div><div class='add'>+TEST check_readonly mkdir $N0/.snaps/new</div><div class='add'>+</div><div class='add'>+TEST check_readonly touch $N0/.snaps/snap2/other;</div><div class='add'>+</div><div class='add'>+TEST fd3=`fd_available`</div><div class='add'>+TEST fd_open $fd3 'r' $N0/dir1/.snaps/snap3/foo1</div><div class='add'>+</div><div class='add'>+TEST fd_cat $fd3;</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+TEST fd_close $fd1;</div><div class='add'>+TEST fd_close $fd2;</div><div class='add'>+TEST fd_close $fd3;</div><div class='add'>+</div><div class='add'>+# test 73</div><div class='add'>+TEST $CLI volume set $V0 "features.snapshot-directory" .history</div><div class='add'>+</div><div class='add'>+#snapd client might take fraction of time to compare the volfile from glusterd</div><div class='add'>+#hence a EXPECT_WITHIN is a better choice here</div><div class='add'>+EXPECT_WITHIN 2 "Y" lookup "$M0/.history";</div><div class='add'>+</div><div class='add'>+NUM_SNAPS=$(ls $M0/.history | wc -l);</div><div class='add'>+</div><div class='add'>+TEST [ $NUM_SNAPS == 4 ]</div><div class='add'>+</div><div class='add'>+TEST ls $M0/.history/snap1;</div><div class='add'>+TEST ls $M0/.history/snap2;</div><div class='add'>+TEST ls $M0/.history/snap3;</div><div class='add'>+TEST ls $M0/.history/snap4;</div><div class='add'>+</div><div class='add'>+TEST ls $M0/.history/snap3/dir1;</div><div class='add'>+TEST ls $M0/.history/snap3/dir2;</div><div class='add'>+</div><div class='add'>+TEST ls $M0/.history/snap4/dir1;</div><div class='add'>+TEST ls $M0/.history/snap4/dir2;</div><div class='add'>+</div><div class='add'>+TEST ls $M0/dir1/.history/</div><div class='add'>+TEST ! ls $M0/dir1/.history/snap1;</div><div class='add'>+TEST ! ls $M0/dir2/.history/snap2;</div><div class='add'>+TEST   ls $M0/dir1/.history/snap3;</div><div class='add'>+TEST   ls $M0/dir2/.history/snap4;</div><div class='add'>+</div><div class='add'>+TEST fd1=`fd_available`</div><div class='add'>+TEST fd_open $fd1 'r' $M0/.history/snap1/file1;</div><div class='add'>+TEST fd_cat $fd1</div><div class='add'>+</div><div class='add'>+# opening fd with in write mode for snapshot files should fail</div><div class='add'>+TEST fd2=`fd_available`</div><div class='add'>+TEST ! fd_open $fd1 'w' $M0/.history/snap1/file2;</div><div class='add'>+</div><div class='add'>+# lookup on .history in the snapshot world should fail</div><div class='add'>+TEST ! stat $M0/.history/snap1/.history</div><div class='add'>+</div><div class='add'>+# creating new entries in snapshots should fail</div><div class='add'>+TEST check_readonly mkdir $M0/.history/new</div><div class='add'>+TEST check_readonly touch $M0/.history/snap2/other;</div><div class='add'>+</div><div class='add'>+TEST fd3=`fd_available`</div><div class='add'>+TEST fd_open $fd3 'r' $M0/dir1/.history/snap3/foo1</div><div class='add'>+</div><div class='add'>+TEST fd_cat $fd3;</div><div class='add'>+</div><div class='add'>+TEST fd_close $fd1;</div><div class='add'>+TEST fd_close $fd2;</div><div class='add'>+TEST fd_close $fd3</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+# similar tests on nfs mount</div><div class='add'>+# test 103</div><div class='add'>+TEST ls $N0/.history;</div><div class='add'>+</div><div class='add'>+NUM_SNAPS=$(ls $N0/.history | wc -l);</div><div class='add'>+</div><div class='add'>+TEST [ $NUM_SNAPS == 4 ];</div><div class='add'>+</div><div class='add'>+TEST ls -l $N0/.history/snap1;</div><div class='add'>+TEST ls -l $N0/.history/snap2;</div><div class='add'>+TEST ls -l $N0/.history/snap3;</div><div class='add'>+TEST ls -l $N0/.history/snap4;</div><div class='add'>+</div><div class='add'>+TEST ls -l $N0/.history/snap3/dir1;</div><div class='add'>+TEST ls -l $N0/.history/snap3/dir2;</div><div class='add'>+</div><div class='add'>+TEST ls -l $N0/.history/snap4/dir1;</div><div class='add'>+TEST ls -l $N0/.history/snap4/dir2;</div><div class='add'>+</div><div class='add'>+TEST ! ls -l $N0/dir1/.history/snap1;</div><div class='add'>+TEST ! ls -l $N0/dir2/.history/snap2;</div><div class='add'>+TEST   ls -l $N0/dir1/.history/snap3;</div><div class='add'>+TEST   ls -l $N0/dir2/.history/snap4;</div><div class='add'>+</div><div class='add'>+TEST fd1=`fd_available`</div><div class='add'>+TEST fd_open $fd1 'r' $N0/.history/snap1/file1;</div><div class='add'>+TEST fd_cat $fd1</div><div class='add'>+</div><div class='add'>+TEST fd2=`fd_available`</div><div class='add'>+TEST ! fd_open $fd1 'w' $N0/.history/snap1/file2;</div><div class='add'>+</div><div class='add'>+TEST ! stat $N0/.history/snap1/.stat</div><div class='add'>+</div><div class='add'>+TEST check_readonly mkdir $N0/.history/new</div><div class='add'>+</div><div class='add'>+TEST check_readonly touch $N0/.history/snap2/other;</div><div class='add'>+</div><div class='add'>+TEST fd3=`fd_available`</div><div class='add'>+TEST fd_open $fd3 'r' $N0/dir1/.history/snap3/foo1</div><div class='add'>+</div><div class='add'>+TEST fd_cat $fd3;</div><div class='add'>+</div><div class='add'>+TEST fd_close $fd1;</div><div class='add'>+TEST fd_close $fd2;</div><div class='add'>+TEST fd_close $fd3;</div><div class='add'>+</div><div class='add'>+## Before killing daemon to avoid deadlocks</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" umount_nfs $N0</div><div class='add'>+</div><div class='add'>+#test 131</div><div class='add'>+TEST $CLI snapshot create snap5 $V0 no-timestamp</div><div class='add'>+TEST ls $M0/.history;</div><div class='add'>+</div><div class='add'>+function count_snaps</div><div class='add'>+{</div><div class='add'>+    local mount_point=$1;</div><div class='add'>+    local num_snaps;</div><div class='add'>+</div><div class='add'>+    num_snaps=$(ls $mount_point/.history | wc -l);</div><div class='add'>+</div><div class='add'>+    echo $num_snaps;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN 30 "5" count_snaps $M0;</div><div class='add'>+</div><div class='add'>+# deletion of a snapshot and creation of a new snapshot with same name</div><div class='add'>+# should not create problems. The data that was supposed to be present</div><div class='add'>+# in the deleted snapshot need not be present in the new snapshot just</div><div class='add'>+# because the name is same. Ex:</div><div class='add'>+# 1) Create a file "aaa"</div><div class='add'>+# 2) Create a snapshot snap6</div><div class='add'>+# 3) stat the file "aaa" in snap6 and it should succeed</div><div class='add'>+# 4) delete the file "aaa"</div><div class='add'>+# 5) Delete the snapshot snap6</div><div class='add'>+# 6) Create a snapshot snap6</div><div class='add'>+# 7) stat the file "aaa" in snap6 and it should fail now</div><div class='add'>+</div><div class='add'>+echo "aaa" &gt; $M0/aaa;</div><div class='add'>+</div><div class='add'>+TEST $CLI snapshot create snap6 $V0 no-timestamp</div><div class='add'>+</div><div class='add'>+TEST ls $M0/.history;</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN 30 "6" count_snaps $M0;</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN 10 "Y" lookup $M0/.history/snap6/aaa</div><div class='add'>+</div><div class='add'>+TEST rm -f $M0/aaa;</div><div class='add'>+</div><div class='add'>+TEST $CLI snapshot delete snap6;</div><div class='add'>+</div><div class='add'>+# drop the caches so that, the dentry for "snap6" is</div><div class='add'>+# is forgotten from the client cache.</div><div class='add'>+drop_cache $M0</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN 30 "5" count_snaps $M0;</div><div class='add'>+</div><div class='add'>+# This should fail, as snap6 just got deleted.</div><div class='add'>+TEST ! stat $M0/.history/snap6</div><div class='add'>+</div><div class='add'>+TEST $CLI snapshot create snap6 $V0 no-timestamp</div><div class='add'>+</div><div class='add'>+TEST ls $M0/.history;</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN 30 "6" count_snaps $M0;</div><div class='add'>+</div><div class='add'>+TEST ls $M0/.history/snap6/;</div><div class='add'>+</div><div class='add'>+TEST ! stat $M0/.history/snap6/aaa;</div><div class='add'>+</div><div class='add'>+TEST stat $M0</div><div class='add'>+</div><div class='add'>+# done with the tests start cleaning up of things</div><div class='add'>+TEST $CLI volume set $V0 features.uss disable</div><div class='add'>+</div><div class='add'>+TEST $CLI snapshot delete snap6;</div><div class='add'>+</div><div class='add'>+TEST $CLI snapshot delete snap5;</div><div class='add'>+</div><div class='add'>+TEST $CLI snapshot delete snap4;</div><div class='add'>+</div><div class='add'>+TEST $CLI snapshot delete snap3;</div><div class='add'>+</div><div class='add'>+TEST $CLI snapshot delete snap2;</div><div class='add'>+</div><div class='add'>+TEST $CLI snapshot delete snap1;</div><div class='add'>+</div><div class='add'>+# nfs client has been already unmounted at line 333</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+</div><div class='add'>+TEST $CLI volume stop $V0</div><div class='add'>+</div><div class='add'>+TEST $CLI volume delete $V0</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/basic/volfile-sanity.t b/tests/basic/volfile-sanity.t<br/>new file mode 100644<br/>index 00000000000..ef2f9344468<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/volfile-sanity.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/volfile-sanity.t</a></div><div class='hunk'>@@ -0,0 +1,29 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../include.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+## Start and create a volume</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0  $H0:$B0/${V0}1</div><div class='add'>+</div><div class='add'>+killall glusterd</div><div class='add'>+</div><div class='add'>+# Client by default tries to connect to port 24007</div><div class='add'>+# So, start server on that port, and you can see</div><div class='add'>+# client successfully working.</div><div class='add'>+TEST $GFS --xlator-option "${V0}-server.transport.socket.listen-port=24007" \</div><div class='add'>+     -f /var/lib/glusterd/vols/${V0}/${V0}.${H0}.*.vol</div><div class='add'>+TEST $GFS -f /var/lib/glusterd/vols/${V0}/${V0}.tcp-fuse.vol $M0</div><div class='add'>+</div><div class='add'>+TEST $(df -h $M0 | grep -q ${V0})</div><div class='add'>+TEST $(cat /proc/mounts | grep -q $M0)</div><div class='add'>+</div><div class='add'>+TEST ! stat $M0/newfile;</div><div class='add'>+TEST touch $M0/newfile;</div><div class='add'>+TEST rm $M0/newfile;</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/basic/volume-scale-shd-mux.t b/tests/basic/volume-scale-shd-mux.t<br/>new file mode 100644<br/>index 00000000000..102de22468e<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/volume-scale-shd-mux.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/volume-scale-shd-mux.t</a></div><div class='hunk'>@@ -0,0 +1,116 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../include.rc</div><div class='add'>+. $(dirname $0)/../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TESTS_EXPECTED_IN_LOOP=6</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 replica 3 $H0:$B0/${V0}{0,1,2,3,4,5}</div><div class='add'>+TEST $CLI volume set $V0 cluster.background-self-heal-count 0</div><div class='add'>+TEST $CLI volume set $V0 cluster.eager-lock off</div><div class='add'>+TEST $CLI volume set $V0 performance.flush-behind off</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+for i in $(seq 1 2); do</div><div class='add'>+   TEST $CLI volume create ${V0}_afr$i replica 3 $H0:$B0/${V0}_afr${i}{0,1,2,3,4,5}</div><div class='add'>+   TEST $CLI volume start ${V0}_afr$i</div><div class='add'>+   TEST $CLI volume create ${V0}_ec$i disperse 6 redundancy 2 $H0:$B0/${V0}_ec${i}{0,1,2,3,4,5}</div><div class='add'>+   TEST $CLI volume start ${V0}_ec$i</div><div class='add'>+done</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "^1$" shd_count</div><div class='add'>+#Check the thread count become to number of volumes*number of ec subvolume (2*6=12)</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "^12$" number_healer_threads_shd $V0 "ec_shd_index_healer"</div><div class='add'>+#Check the thread count become to number of volumes*number of afr subvolume (3*6=18)</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "^18$" number_healer_threads_shd $V0 "afr_shd_index_healer"</div><div class='add'>+</div><div class='add'>+TEST $CLI volume add-brick $V0 replica 3 $H0:$B0/${V0}{6,7,8};</div><div class='add'>+#Check the thread count become to number of volumes*number of afr subvolume plus 3 additional threads from newly added bricks (3*6+3=21)</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "^1$" shd_count</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "^21$" number_healer_threads_shd $V0 "afr_shd_index_healer"</div><div class='add'>+</div><div class='add'>+#Remove the brick and check the detach is successful</div><div class='add'>+$CLI volume remove-brick $V0 $H0:$B0/${V0}{6,7,8} force</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "^18$" number_healer_threads_shd $V0 "afr_shd_index_healer"</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $PROCESS_DOWN_TIMEOUT "^0$" number_healer_threads_shd $V0 "glusterfs_graph_cleanup"</div><div class='add'>+TEST $CLI volume add-brick ${V0}_ec1 $H0:$B0/${V0}_ec1_add{0,1,2,3,4,5};</div><div class='add'>+#Check the thread count become to number of volumes*number of ec subvolume plus 2 additional threads from newly added bricks (2*6+6=18)</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "^1$" shd_count</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "^18$" number_healer_threads_shd $V0 "ec_shd_index_healer"</div><div class='add'>+</div><div class='add'>+#Remove the brick and check the detach is successful</div><div class='add'>+$CLI volume remove-brick ${V0}_ec1 $H0:$B0/${V0}_ec1_add{0,1,2,3,4,5} force</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "^12$" number_healer_threads_shd $V0 "ec_shd_index_healer"</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+for i in $(seq 1 2); do</div><div class='add'>+   TEST $CLI volume stop ${V0}_afr$i</div><div class='add'>+   TEST $CLI volume stop ${V0}_ec$i</div><div class='add'>+done</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $PROCESS_DOWN_TIMEOUT "^6$" number_healer_threads_shd $V0 "afr_shd_index_healer"</div><div class='add'>+</div><div class='add'>+TEST $GFS --volfile-id=/$V0 --volfile-server=$H0 $M0</div><div class='add'>+</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}0</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}4</div><div class='add'>+</div><div class='add'>+TEST touch $M0/foo{1..100}</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "^204$" get_pending_heal_count $V0</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start ${V0} force</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "^0$" get_pending_heal_count $V0</div><div class='add'>+</div><div class='add'>+TEST rm -rf $M0/*</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+shd_pid=$(get_shd_mux_pid $V0)</div><div class='add'>+TEST $CLI volume create ${V0}_distribute1 $H0:$B0/${V0}_distribute10</div><div class='add'>+TEST $CLI volume start ${V0}_distribute1</div><div class='add'>+</div><div class='add'>+#Creating a non-replicate/non-ec volume should not have any effect in shd</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "^6$" number_healer_threads_shd $V0 "afr_shd_index_healer"</div><div class='add'>+EXPECT "^${shd_pid}$" get_shd_mux_pid $V0</div><div class='add'>+</div><div class='add'>+TEST mkdir $B0/add/</div><div class='add'>+#Now convert the distributed volume to replicate</div><div class='add'>+TEST $CLI volume add-brick ${V0}_distribute1 replica 3 $H0:$B0/add/{2..3}</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "^9$" number_healer_threads_shd $V0 "afr_shd_index_healer"</div><div class='add'>+</div><div class='add'>+#scale down the volume</div><div class='add'>+TEST $CLI volume remove-brick ${V0}_distribute1 replica 1 $H0:$B0/add/{2..3} force</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "^6$" number_healer_threads_shd $V0 "afr_shd_index_healer"</div><div class='add'>+</div><div class='add'>+#Before stopping the process, make sure there is no pending clenup threads hanging</div><div class='add'>+EXPECT_WITHIN $PROCESS_DOWN_TIMEOUT "^0$" number_healer_threads_shd $V0 "glusterfs_graph_cleanup"</div><div class='add'>+</div><div class='add'>+TEST $CLI volume stop ${V0}</div><div class='add'>+TEST $CLI volume delete ${V0}</div><div class='add'>+EXPECT_WITHIN $PROCESS_DOWN_TIMEOUT "^0$" shd_count</div><div class='add'>+</div><div class='add'>+TEST rm -rf $B0/add/2 $B0/add/3</div><div class='add'>+</div><div class='add'>+#Now convert the distributed volume back to replicate and make sure that a new shd is spawned</div><div class='add'>+TEST $CLI volume add-brick ${V0}_distribute1 replica 3 $H0:$B0/add/{2..3};</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "^1$" shd_count</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "^3$" number_healer_threads_shd ${V0}_distribute1 "afr_shd_index_healer"</div><div class='add'>+</div><div class='add'>+#Now convert the replica volume to distribute again and make sure the shd is now stopped</div><div class='add'>+TEST $CLI volume remove-brick ${V0}_distribute1 replica 1 $H0:$B0/add/{2..3} force</div><div class='add'>+TEST rm -rf $B0/add/</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $PROCESS_DOWN_TIMEOUT "^0$" shd_count</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='add'>+</div><div class='add'>+#G_TESTDEF_TEST_STATUS_NETBSD7=BAD_TEST,BUG=1708929</div><div class='add'>+#G_TESTDEF_TEST_STATUS_CENTOS6=BAD_TEST,BUG=1708929</div><div class='head'>diff --git a/tests/basic/volume-snap-scheduler.t b/tests/basic/volume-snap-scheduler.t<br/>new file mode 100644<br/>index 00000000000..a638c5cc46a<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/volume-snap-scheduler.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/volume-snap-scheduler.t</a></div><div class='hunk'>@@ -0,0 +1,49 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../include.rc</div><div class='add'>+. $(dirname $0)/../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd;</div><div class='add'>+TEST pidof glusterd;</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 replica 2 $H0:$B0/${GMV0}{1,2,3,4};</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+## Create, start and mount meta_volume as</div><div class='add'>+## snap_scheduler expects shared storage to be enabled.</div><div class='add'>+## This test is very basic in nature not creating any snapshot</div><div class='add'>+## and purpose is to validate snap scheduling commands.</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $META_VOL replica 3 $H0:$B0/${META_VOL}{1,2,3};</div><div class='add'>+TEST $CLI volume start $META_VOL</div><div class='add'>+TEST mkdir -p $META_MNT</div><div class='add'>+TEST glusterfs -s $H0 --volfile-id $META_VOL $META_MNT</div><div class='add'>+</div><div class='add'>+##function to check status</div><div class='add'>+function check_status_scheduler()</div><div class='add'>+{</div><div class='add'>+     local key=$1</div><div class='add'>+     snap_scheduler.py status | grep -F "$key" | wc -l</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+##Basic snap_scheduler command test init/enable/disable/list</div><div class='add'>+</div><div class='add'>+TEST snap_scheduler.py init</div><div class='add'>+</div><div class='add'>+TEST snap_scheduler.py enable</div><div class='add'>+</div><div class='add'>+EXPECT 1 check_status_scheduler "Enabled"</div><div class='add'>+</div><div class='add'>+TEST snap_scheduler.py disable</div><div class='add'>+</div><div class='add'>+EXPECT 1 check_status_scheduler "Disabled"</div><div class='add'>+</div><div class='add'>+TEST snap_scheduler.py list</div><div class='add'>+</div><div class='add'>+TEST $CLI volume stop $V0;</div><div class='add'>+</div><div class='add'>+TEST $CLI volume delete $V0;</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/basic/volume-snapshot-clone.t b/tests/basic/volume-snapshot-clone.t<br/>new file mode 100755<br/>index 00000000000..e6da9d7ddca<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/volume-snapshot-clone.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/volume-snapshot-clone.t</a></div><div class='hunk'>@@ -0,0 +1,129 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../include.rc</div><div class='add'>+. $(dirname $0)/../volume.rc</div><div class='add'>+. $(dirname $0)/../cluster.rc</div><div class='add'>+. $(dirname $0)/../snapshot.rc</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+V1="patchy2"</div><div class='add'>+</div><div class='add'>+function create_volumes() {</div><div class='add'>+        $CLI_1 volume create $V0 $H1:$L1 &amp;</div><div class='add'>+        PID_1=$!</div><div class='add'>+</div><div class='add'>+        $CLI_2 volume create $V1 $H2:$L2 $H3:$L3 &amp;</div><div class='add'>+        PID_2=$!</div><div class='add'>+</div><div class='add'>+        wait $PID_1 $PID_2</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function create_snapshots() {</div><div class='add'>+</div><div class='add'>+        $CLI_1 snapshot create $1 $2 no-timestamp&amp;</div><div class='add'>+        PID_1=$!</div><div class='add'>+</div><div class='add'>+        wait $PID_1</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+function delete_snapshot() {</div><div class='add'>+        $CLI_1 snapshot delete $1 &amp;</div><div class='add'>+        PID_1=$!</div><div class='add'>+</div><div class='add'>+        wait $PID_1</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST verify_lvm_version;</div><div class='add'>+#Create cluster with 3 nodes</div><div class='add'>+TEST launch_cluster 3;</div><div class='add'>+TEST setup_lvm 3</div><div class='add'>+</div><div class='add'>+TEST $CLI_1 peer probe $H2;</div><div class='add'>+TEST $CLI_1 peer probe $H3;</div><div class='add'>+EXPECT_WITHIN $PROBE_TIMEOUT 2 peer_count;</div><div class='add'>+</div><div class='add'>+create_volumes</div><div class='add'>+EXPECT 'Created' volinfo_field $V0 'Status';</div><div class='add'>+EXPECT 'Created' volinfo_field $V1 'Status';</div><div class='add'>+</div><div class='add'>+start_volumes 2</div><div class='add'>+EXPECT 'Started' volinfo_field $V0 'Status';</div><div class='add'>+EXPECT 'Started' volinfo_field $V1 'Status';</div><div class='add'>+</div><div class='add'>+TEST $CLI_1 snapshot config activate-on-create enable</div><div class='add'>+</div><div class='add'>+#Snapshot Operations</div><div class='add'>+create_snapshots ${V0}_snap ${V0};</div><div class='add'>+create_snapshots ${V1}_snap ${V1};</div><div class='add'>+</div><div class='add'>+EXPECT 'Started' snapshot_status ${V0}_snap;</div><div class='add'>+EXPECT 'Started' snapshot_status ${V1}_snap;</div><div class='add'>+</div><div class='add'>+sleep 5</div><div class='add'>+TEST $CLI_1 snapshot clone ${V0}_clone ${V0}_snap</div><div class='add'>+TEST $CLI_1 snapshot clone ${V1}_clone ${V1}_snap</div><div class='add'>+</div><div class='add'>+EXPECT 'Created' volinfo_field ${V0}_clone 'Status';</div><div class='add'>+EXPECT 'Created' volinfo_field ${V1}_clone 'Status';</div><div class='add'>+</div><div class='add'>+TEST $CLI_1 volume start ${V0}_clone force;</div><div class='add'>+TEST $CLI_1 volume start ${V1}_clone force;</div><div class='add'>+</div><div class='add'>+EXPECT 'Started' volinfo_field ${V0}_clone 'Status';</div><div class='add'>+EXPECT 'Started' volinfo_field ${V1}_clone 'Status';</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+TEST glusterfs -s $H1 --volfile-id=/${V0}_clone $M0</div><div class='add'>+TEST glusterfs -s $H2 --volfile-id=/${V1}_clone $M1</div><div class='add'>+</div><div class='add'>+TEST touch $M0/file1</div><div class='add'>+TEST touch $M1/file1</div><div class='add'>+</div><div class='add'>+TEST echo "Hello world" $M0/file1</div><div class='add'>+TEST echo "Hello world" $M1/file1</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M1</div><div class='add'>+</div><div class='add'>+TEST kill_glusterd 2;</div><div class='add'>+sleep 15</div><div class='add'>+TEST $glusterd_2;</div><div class='add'>+sleep 15</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $PROBE_TIMEOUT 2 peer_count;</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT 'Started' volinfo_field ${V0}_clone 'Status';</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT 'Started' volinfo_field ${V1}_clone 'Status';</div><div class='add'>+</div><div class='add'>+TEST $CLI_1 volume stop ${V0}_clone</div><div class='add'>+TEST $CLI_1 volume stop ${V1}_clone</div><div class='add'>+</div><div class='add'>+TEST $CLI_1 volume delete ${V0}_clone</div><div class='add'>+TEST $CLI_1 volume delete ${V1}_clone</div><div class='add'>+</div><div class='add'>+TEST $CLI_1 snapshot clone ${V0}_clone ${V0}_snap</div><div class='add'>+TEST $CLI_1 snapshot clone ${V1}_clone ${V1}_snap</div><div class='add'>+</div><div class='add'>+EXPECT 'Created' volinfo_field ${V0}_clone 'Status';</div><div class='add'>+EXPECT 'Created' volinfo_field ${V1}_clone 'Status';</div><div class='add'>+</div><div class='add'>+#Clean up</div><div class='add'>+stop_force_volumes 2</div><div class='add'>+EXPECT_WITHIN $CONFIG_UPDATE_TIMEOUT 'Stopped' volinfo_field $V0 'Status';</div><div class='add'>+EXPECT_WITHIN $CONFIG_UPDATE_TIMEOUT 'Stopped' volinfo_field $V1 'Status';</div><div class='add'>+</div><div class='add'>+TEST delete_snapshot ${V0}_snap</div><div class='add'>+TEST delete_snapshot ${V1}_snap</div><div class='add'>+</div><div class='add'>+TEST ! snapshot_exists 1 ${V0}_snap</div><div class='add'>+TEST ! snapshot_exists 1 ${V1}_snap</div><div class='add'>+</div><div class='add'>+delete_volumes 2</div><div class='add'>+EXPECT_WITHIN $CONFIG_UPDATE_TIMEOUT "N" volume_exists $V0</div><div class='add'>+EXPECT_WITHIN $CONFIG_UPDATE_TIMEOUT "N" volume_exists $V1</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/basic/volume-snapshot-xml.t b/tests/basic/volume-snapshot-xml.t<br/>new file mode 100755<br/>index 00000000000..ff63b54538d<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/volume-snapshot-xml.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/volume-snapshot-xml.t</a></div><div class='hunk'>@@ -0,0 +1,72 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../include.rc</div><div class='add'>+. $(dirname $0)/../volume.rc</div><div class='add'>+. $(dirname $0)/../snapshot.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+TEST verify_lvm_version;</div><div class='add'>+TEST glusterd;</div><div class='add'>+TEST pidof glusterd;</div><div class='add'>+</div><div class='add'>+TEST setup_lvm 1</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 $H0:$L1</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+# Snapshot config xmls</div><div class='add'>+EXPECT "enable" get-xml "snapshot config activate-on-create enable" "activateOnCreate"</div><div class='add'>+EXPECT "100" get-xml "snapshot config $V0 snap-max-hard-limit 100" "newHardLimit"</div><div class='add'>+EXPECT "70" get-xml "snapshot config snap-max-soft-limit 70" "newSoftLimit"</div><div class='add'>+EXPECT "enable" get-xml "snapshot config auto-delete enable" "autoDelete"</div><div class='add'>+</div><div class='add'>+# Snapshot create, activate, deactivate xmls</div><div class='add'>+EXPECT "snap1" get-xml "snapshot create snap1 $V0 no-timestamp" "name"</div><div class='add'>+EXPECT "snap1" get-xml "snapshot deactivate snap1" "name"</div><div class='add'>+EXPECT "snap1" get-xml "snapshot activate snap1" "name"</div><div class='add'>+EXPECT "snap2" get-xml "snapshot create snap2 $V0 no-timestamp" "name"</div><div class='add'>+</div><div class='add'>+# Snapshot info xmls</div><div class='add'>+EXPECT "2" get-xml "snapshot info" "count"</div><div class='add'>+EXPECT "Started" get-xml "snapshot info" "status"</div><div class='add'>+EXPECT "2" get-xml "snapshot info volume $V0" "count"</div><div class='add'>+EXPECT "Started" get-xml "snapshot info volume $V0" "status"</div><div class='add'>+EXPECT "1" get-xml "snapshot info snap1" "count"</div><div class='add'>+EXPECT "2" get-xml "snapshot info snap1" "snapCount"</div><div class='add'>+EXPECT "Started" get-xml "snapshot info snap1" "status"</div><div class='add'>+</div><div class='add'>+# Snapshot list xmls</div><div class='add'>+EXPECT "2" get-xml "snapshot list" "count"</div><div class='add'>+EXPECT "snap2" get-xml "snapshot list $V0" "snapshot"</div><div class='add'>+</div><div class='add'>+# Snapshot status xmls</div><div class='add'>+EXPECT "snap2" get-xml "snapshot status" "name"</div><div class='add'>+EXPECT "snap2" get-xml "snapshot deactivate snap2" "name"</div><div class='add'>+#XPECT "N/A" get-xml "snapshot status" "pid"</div><div class='add'>+EXPECT "snap1" get-xml "snapshot status snap1" "name"</div><div class='add'>+EXPECT "Yes" get-xml "snapshot status snap1" "brick_running"</div><div class='add'>+</div><div class='add'>+# Snapshot restore xmls</div><div class='add'>+TEST $CLI volume stop $V0</div><div class='add'>+EXPECT "snap2" get-xml "snapshot restore snap2" "name"</div><div class='add'>+EXPECT "30807" get-xml "snapshot restore snap2" "opErrno"</div><div class='add'>+EXPECT "0" get-xml "snapshot restore snap1" "opErrno"</div><div class='add'>+</div><div class='add'>+# Snapshot delete xmls</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT "snap1" get-xml "snapshot create snap1 $V0 no-timestamp" "name"</div><div class='add'>+EXPECT "snap2" get-xml "snapshot create snap2 $V0 no-timestamp" "name"</div><div class='add'>+EXPECT "snap3" get-xml "snapshot create snap3 $V0 no-timestamp" "name"</div><div class='add'>+EXPECT "Success" get-xml "snapshot delete snap3" "status"</div><div class='add'>+EXPECT "Success" get-xml "snapshot delete all" "status"</div><div class='add'>+EXPECT "0" get-xml "snapshot list" "count"</div><div class='add'>+#XPECT "snap1" get-xml "snapshot create snap1 $V0 no-timestamp" "name"</div><div class='add'>+#XPECT "snap2" get-xml "snapshot create snap2 $V0 no-timestamp" "name"</div><div class='add'>+#XPECT "snap3" get-xml "snapshot create snap3 $V0 no-timestamp" "name"</div><div class='add'>+#XPECT "Success" get-xml "snapshot delete volume $V0" "status"</div><div class='add'>+#XPECT "0" get-xml "snapshot list" "count"</div><div class='add'>+</div><div class='add'>+# Snapshot clone xmls</div><div class='add'>+# Snapshot clone xml is broken. Once it is fixed it will be added here.</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/basic/volume-snapshot.t b/tests/basic/volume-snapshot.t<br/>new file mode 100755<br/>index 00000000000..dd938b4064a<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/volume-snapshot.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/volume-snapshot.t</a></div><div class='hunk'>@@ -0,0 +1,172 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../include.rc</div><div class='add'>+. $(dirname $0)/../volume.rc</div><div class='add'>+. $(dirname $0)/../cluster.rc</div><div class='add'>+. $(dirname $0)/../snapshot.rc</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+V1="patchy2"</div><div class='add'>+</div><div class='add'>+function create_volumes() {</div><div class='add'>+        $CLI_1 volume create $V0 $H1:$L1 &amp;</div><div class='add'>+        PID_1=$!</div><div class='add'>+</div><div class='add'>+        $CLI_2 volume create $V1 $H2:$L2 $H3:$L3 &amp;</div><div class='add'>+        PID_2=$!</div><div class='add'>+</div><div class='add'>+        wait $PID_1 $PID_2</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function create_snapshots() {</div><div class='add'>+        $CLI_1 snapshot create ${V0}_snap ${V0} no-timestamp &amp;</div><div class='add'>+        PID_1=$!</div><div class='add'>+</div><div class='add'>+        $CLI_1 snapshot create ${V1}_snap ${V1} no-timestamp &amp;</div><div class='add'>+        PID_2=$!</div><div class='add'>+</div><div class='add'>+        wait $PID_1 $PID_2</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function create_snapshots_with_timestamp() {</div><div class='add'>+        $CLI_1 snapshot create ${V0}_snap1 ${V0}&amp;</div><div class='add'>+        PID_1=$!</div><div class='add'>+        $CLI_1 snapshot create ${V1}_snap1 ${V1}&amp;</div><div class='add'>+        PID_2=$!</div><div class='add'>+</div><div class='add'>+        wait $PID_1 $PID_2</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+function activate_snapshots() {</div><div class='add'>+        $CLI_1 snapshot activate ${V0}_snap &amp;</div><div class='add'>+        PID_1=$!</div><div class='add'>+</div><div class='add'>+        $CLI_1 snapshot activate ${V1}_snap &amp;</div><div class='add'>+        PID_2=$!</div><div class='add'>+</div><div class='add'>+        wait $PID_1 $PID_2</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function deactivate_snapshots() {</div><div class='add'>+        $CLI_1 snapshot deactivate ${V0}_snap &amp;</div><div class='add'>+        PID_1=$!</div><div class='add'>+</div><div class='add'>+        $CLI_1 snapshot deactivate ${V1}_snap &amp;</div><div class='add'>+        PID_2=$!</div><div class='add'>+</div><div class='add'>+        wait $PID_1 $PID_2</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function delete_snapshots() {</div><div class='add'>+        $CLI_1 snapshot delete $1 &amp;</div><div class='add'>+        PID_1=$!</div><div class='add'>+</div><div class='add'>+        $CLI_1 snapshot delete $2 &amp;</div><div class='add'>+        PID_2=$!</div><div class='add'>+</div><div class='add'>+        wait $PID_1 $PID_2</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function restore_snapshots() {</div><div class='add'>+        $CLI_1 snapshot restore ${V0}_snap &amp;</div><div class='add'>+        PID_1=$!</div><div class='add'>+</div><div class='add'>+        $CLI_1 snapshot restore ${V1}_snap &amp;</div><div class='add'>+        PID_2=$!</div><div class='add'>+</div><div class='add'>+        wait $PID_1 $PID_2</div><div class='add'>+}</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST verify_lvm_version;</div><div class='add'>+#Create cluster with 3 nodes</div><div class='add'>+TEST launch_cluster 3;</div><div class='add'>+TEST setup_lvm 3</div><div class='add'>+</div><div class='add'>+TEST $CLI_1 peer probe $H2;</div><div class='add'>+TEST $CLI_1 peer probe $H3;</div><div class='add'>+EXPECT_WITHIN $PROBE_TIMEOUT 2 peer_count;</div><div class='add'>+</div><div class='add'>+create_volumes</div><div class='add'>+EXPECT 'Created' volinfo_field $V0 'Status';</div><div class='add'>+EXPECT 'Created' volinfo_field $V1 'Status';</div><div class='add'>+</div><div class='add'>+start_volumes 2</div><div class='add'>+EXPECT 'Started' volinfo_field $V0 'Status';</div><div class='add'>+EXPECT 'Started' volinfo_field $V1 'Status';</div><div class='add'>+</div><div class='add'>+TEST $CLI_1 snapshot config activate-on-create enable</div><div class='add'>+</div><div class='add'>+#Snapshot Operations</div><div class='add'>+create_snapshots</div><div class='add'>+</div><div class='add'>+EXPECT 'Started' snapshot_status ${V0}_snap;</div><div class='add'>+EXPECT 'Started' snapshot_status ${V1}_snap;</div><div class='add'>+</div><div class='add'>+EXPECT '1' volinfo_field $V0 'Snapshot Count';</div><div class='add'>+EXPECT '1' volinfo_field $V1 'Snapshot Count';</div><div class='add'>+EXPECT "1" get-cmd-field-xml "volume info $V0" "snapshotCount"</div><div class='add'>+EXPECT "1" get-cmd-field-xml "volume info $V1" "snapshotCount"</div><div class='add'>+</div><div class='add'>+deactivate_snapshots</div><div class='add'>+</div><div class='add'>+EXPECT 'Stopped' snapshot_status ${V0}_snap;</div><div class='add'>+EXPECT 'Stopped' snapshot_status ${V1}_snap;</div><div class='add'>+</div><div class='add'>+activate_snapshots</div><div class='add'>+</div><div class='add'>+EXPECT 'Started' snapshot_status ${V0}_snap;</div><div class='add'>+EXPECT 'Started' snapshot_status ${V1}_snap;</div><div class='add'>+</div><div class='add'>+deactivate_snapshots</div><div class='add'>+activate_snapshots</div><div class='add'>+</div><div class='add'>+TEST snapshot_exists 1 ${V0}_snap</div><div class='add'>+TEST snapshot_exists 1 ${V1}_snap</div><div class='add'>+TEST $CLI_1 snapshot config $V0 snap-max-hard-limit 100</div><div class='add'>+TEST $CLI_1 snapshot config $V1 snap-max-hard-limit 100</div><div class='add'>+</div><div class='add'>+TEST glusterfs -s $H1 --volfile-id=/snaps/${V0}_snap/${V0} $M0</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+TEST glusterfs -s $H2 --volfile-id=/snaps/${V1}_snap/${V1} $M0</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+</div><div class='add'>+#create timestamp appended snaps</div><div class='add'>+create_snapshots_with_timestamp;</div><div class='add'>+new_name1=`$CLI_1 snapshot list ${V0} | grep ${V0}_snap1`;</div><div class='add'>+new_name2=`$CLI_1 snapshot list ${V1} | grep ${V1}_snap1`;</div><div class='add'>+</div><div class='add'>+EXPECT '2' volinfo_field $V0 'Snapshot Count';</div><div class='add'>+EXPECT '2' volinfo_field $V1 'Snapshot Count';</div><div class='add'>+EXPECT "2" get-cmd-field-xml "volume info $V0" "snapshotCount"</div><div class='add'>+EXPECT "2" get-cmd-field-xml "volume info $V1" "snapshotCount"</div><div class='add'>+</div><div class='add'>+EXPECT_NOT "{V0}_snap1" echo $new_name1;</div><div class='add'>+EXPECT_NOT "{V1}_snap1" echo $new_name1;</div><div class='add'>+delete_snapshots $new_name1 $new_name2;</div><div class='add'>+</div><div class='add'>+EXPECT '1' volinfo_field $V0 'Snapshot Count';</div><div class='add'>+EXPECT '1' volinfo_field $V1 'Snapshot Count';</div><div class='add'>+EXPECT "1" get-cmd-field-xml "volume info $V0" "snapshotCount"</div><div class='add'>+EXPECT "1" get-cmd-field-xml "volume info $V1" "snapshotCount"</div><div class='add'>+</div><div class='add'>+#Clean up</div><div class='add'>+stop_force_volumes 2</div><div class='add'>+EXPECT 'Stopped' volinfo_field $V0 'Status';</div><div class='add'>+EXPECT 'Stopped' volinfo_field $V1 'Status';</div><div class='add'>+</div><div class='add'>+restore_snapshots</div><div class='add'>+TEST ! snapshot_exists 1 ${V0}_snap</div><div class='add'>+TEST ! snapshot_exists 1 ${V1}_snap</div><div class='add'>+</div><div class='add'>+EXPECT '0' volinfo_field $V0 'Snapshot Count';</div><div class='add'>+EXPECT '0' volinfo_field $V1 'Snapshot Count';</div><div class='add'>+EXPECT "0" get-cmd-field-xml "volume info $V0" "snapshotCount"</div><div class='add'>+EXPECT "0" get-cmd-field-xml "volume info $V1" "snapshotCount"</div><div class='add'>+</div><div class='add'>+delete_volumes 2</div><div class='add'>+EXPECT_WITHIN $CONFIG_UPDATE_TIMEOUT "N" volume_exists $V0</div><div class='add'>+EXPECT_WITHIN $CONFIG_UPDATE_TIMEOUT "N" volume_exists $V1</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/basic/volume-status.t b/tests/basic/volume-status.t<br/>new file mode 100644<br/>index 00000000000..01d7ebf6c07<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/volume-status.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/volume-status.t</a></div><div class='hunk'>@@ -0,0 +1,114 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../include.rc</div><div class='add'>+. $(dirname $0)/../volume.rc</div><div class='add'>+. $(dirname $0)/../nfs.rc</div><div class='add'>+</div><div class='add'>+#G_TESTDEF_TEST_STATUS_CENTOS6=NFS_TEST</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+function gluster_client_list_status () {</div><div class='add'>+        gluster volume status $V0 client-list | sed -n '/Name/','/total/'p | wc -l</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function gluster_fd_status () {</div><div class='add'>+        gluster volume status $V0 fd | sed -n '/Brick :/ p' | wc -l</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function gluster_inode_status () {</div><div class='add'>+        gluster volume status $V0 inode | sed -n '/Connection / p' | wc -l</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume info;</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 replica 3 $H0:$B0/${V0}{1,2,3,4,5,6};</div><div class='add'>+TEST $CLI volume set $V0 nfs.disable false</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "Y" glustershd_up_status</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "Y" nfs_up_status</div><div class='add'>+</div><div class='add'>+## Mount FUSE</div><div class='add'>+TEST $GFS -s $H0 --volfile-id $V0 $M0;</div><div class='add'>+TEST touch $M0/file{1..20}</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "6" gluster_fd_status</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "768" gluster_inode_status</div><div class='add'>+</div><div class='add'>+##Disabling this test until the client-list command works for brick-multiplexing</div><div class='add'>+#EXPECT_WITHIN $PROCESS_UP_TIMEOUT "7" gluster_client_list_status</div><div class='add'>+</div><div class='add'>+##Wait for connection establishment between nfs server and brick process</div><div class='add'>+EXPECT_WITHIN $NFS_EXPORT_TIMEOUT "1" is_nfs_export_available;</div><div class='add'>+</div><div class='add'>+## Mount NFS</div><div class='add'>+TEST mount_nfs $H0:/$V0 $N0 nolock;</div><div class='add'>+</div><div class='add'>+TEST $CLI volume status all</div><div class='add'>+TEST $CLI volume status $V0</div><div class='add'>+</div><div class='add'>+function test_nfs_cmds () {</div><div class='add'>+    local ret=0</div><div class='add'>+    declare -a nfs_cmds=("clients" "mem" "inode" "callpool")</div><div class='add'>+    for cmd in ${nfs_cmds[@]}; do</div><div class='add'>+        $CLI volume status $V0 nfs $cmd</div><div class='add'>+        (( ret += $? ))</div><div class='add'>+        $CLI volume status $V0 nfs $cmd --xml</div><div class='add'>+        (( ret += $? ))</div><div class='add'>+    done</div><div class='add'>+    return $ret</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function test_shd_cmds () {</div><div class='add'>+    local ret=0</div><div class='add'>+    declare -a shd_cmds=("mem" "inode" "callpool")</div><div class='add'>+    for cmd in ${shd_cmds[@]}; do</div><div class='add'>+        $CLI volume status $V0 shd $cmd</div><div class='add'>+        (( ret += $? ))</div><div class='add'>+        $CLI volume status $V0 shd $cmd --xml</div><div class='add'>+        (( ret += $? ))</div><div class='add'>+    done</div><div class='add'>+    return $ret</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function test_brick_cmds () {</div><div class='add'>+    local ret=0</div><div class='add'>+    declare -a cmds=("detail" "clients" "mem" "inode" "fd" "callpool")</div><div class='add'>+    for cmd in ${cmds[@]}; do</div><div class='add'>+        for i in {1..2}; do</div><div class='add'>+            $CLI volume status $V0 $H0:$B0/${V0}$i $cmd</div><div class='add'>+            (( ret += $? ))</div><div class='add'>+            $CLI volume status $V0 $H0:$B0/${V0}$i $cmd --xml</div><div class='add'>+            (( ret += $? ))</div><div class='add'>+        done</div><div class='add'>+    done</div><div class='add'>+    return $ret</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function test_status_cmds () {</div><div class='add'>+    local ret=0</div><div class='add'>+    declare -a cmds=("detail" "clients" "mem" "inode" "fd" "callpool" "tasks" "client-list")</div><div class='add'>+    for cmd in ${cmds[@]}; do</div><div class='add'>+        $CLI volume status $V0 $cmd</div><div class='add'>+        (( ret += $? ))</div><div class='add'>+        $CLI volume status $V0 $cmd --xml</div><div class='add'>+        (( ret += $? ))</div><div class='add'>+    done</div><div class='add'>+    return $ret</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+TEST test_shd_cmds;</div><div class='add'>+TEST test_nfs_cmds;</div><div class='add'>+TEST test_brick_cmds;</div><div class='add'>+TEST test_status_cmds;</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+## Before killing daemon to avoid deadlocks</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" umount_nfs $N0</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/basic/volume.t b/tests/basic/volume.t<br/>new file mode 100644<br/>index 00000000000..27fe093d07d<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/volume.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/volume.t</a></div><div class='hunk'>@@ -0,0 +1,60 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../include.rc</div><div class='add'>+. $(dirname $0)/../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume info;</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 replica 3 $H0:$B0/${V0}{1,2,3,4,5,6};</div><div class='add'>+</div><div class='add'>+EXPECT "$V0" volinfo_field $V0 'Volume Name';</div><div class='add'>+EXPECT 'Created' volinfo_field $V0 'Status';</div><div class='add'>+EXPECT '6' brick_count $V0</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+EXPECT 'Started' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+TEST $CLI volume add-brick $V0 $H0:$B0/${V0}{9,10,11};</div><div class='add'>+EXPECT '9' brick_count $V0</div><div class='add'>+</div><div class='add'>+TEST $CLI volume remove-brick $V0 $H0:$B0/${V0}{1,2,3} force;</div><div class='add'>+EXPECT '6' brick_count $V0</div><div class='add'>+</div><div class='add'>+TEST $CLI volume top $V0 read-perf bs 4096 count 1000</div><div class='add'>+TEST $CLI volume top $V0 write-perf bs 1048576 count 2</div><div class='add'>+</div><div class='add'>+TEST touch $M0/foo</div><div class='add'>+</div><div class='add'>+# statedump path should be a directory, setting it to a file path should fail</div><div class='add'>+</div><div class='add'>+TEST ! $CLI v set $V0 server.statedump-path $M0/foo;</div><div class='add'>+EXPECT '/var/run/gluster' $CLI v get $V0 server.statedump-path</div><div class='add'>+</div><div class='add'>+#set the statedump path to an existing ditectory which should succeed</div><div class='add'>+TEST mkdir $D0/level;</div><div class='add'>+TEST $CLI v set $V0 server.statedump-path $D0/level</div><div class='add'>+EXPECT '/level' volinfo_field $V0 'server.statedump-path'</div><div class='add'>+</div><div class='add'>+ret=$(ls $D0/level | wc -l);</div><div class='add'>+TEST [ $ret == 0 ]</div><div class='add'>+TEST $CLI v statedump $V0;</div><div class='add'>+ret=$(ls $D0/level | wc -l);</div><div class='add'>+TEST ! [ $ret == 0 ]</div><div class='add'>+</div><div class='add'>+#set the statedump path to a non - existing directory which should fail</div><div class='add'>+TEST ! $CLI v set $V0 server.statedump-path /root/test</div><div class='add'>+EXPECT '/level' volinfo_field $V0 'server.statedump-path'</div><div class='add'>+</div><div class='add'>+TEST rm -rf $D0/level</div><div class='add'>+</div><div class='add'>+TEST $CLI volume stop $V0</div><div class='add'>+EXPECT 'Stopped' volinfo_field $V0 'Status'</div><div class='add'>+</div><div class='add'>+TEST $CLI volume delete $V0</div><div class='add'>+TEST ! $CLI volume info $V0</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/basic/xlator-pass-through-sanity.t b/tests/basic/xlator-pass-through-sanity.t<br/>new file mode 100644<br/>index 00000000000..e996be89260<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/basic/xlator-pass-through-sanity.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/basic/xlator-pass-through-sanity.t</a></div><div class='hunk'>@@ -0,0 +1,22 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../include.rc</div><div class='add'>+. $(dirname $0)/../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/${V0}</div><div class='add'>+TEST $CLI volume set $V0 performance.io-cache-pass-through enable;</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+</div><div class='add'>+## Mount FUSE</div><div class='add'>+TEST $GFS -s $H0 --volfile-id $V0 $M1;</div><div class='add'>+</div><div class='add'>+# This test covers lookup, mkdir, mknod, symlink, link, rename,</div><div class='add'>+# create operations</div><div class='add'>+TEST $(dirname $0)/rpc-coverage.sh $M1</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bitrot/br-signer-threads-config-1797869.t b/tests/bitrot/br-signer-threads-config-1797869.t<br/>new file mode 100644<br/>index 00000000000..657ef3eedaf<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bitrot/br-signer-threads-config-1797869.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bitrot/br-signer-threads-config-1797869.t</a></div><div class='hunk'>@@ -0,0 +1,73 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../include.rc</div><div class='add'>+. $(dirname $0)/../volume.rc</div><div class='add'>+. $(dirname $0)/../cluster.rc</div><div class='add'>+</div><div class='add'>+function get_bitd_count_1 {</div><div class='add'>+        ps auxww | grep glusterfs | grep bitd.pid | grep -v grep | grep $H1 | wc -l</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function get_bitd_count_2 {</div><div class='add'>+        ps auxww | grep glusterfs | grep bitd.pid | grep -v grep | grep $H2 | wc -l</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function get_bitd_pid_1 {</div><div class='add'>+        ps auxww | grep glusterfs | grep bitd.pid | grep -v grep | grep $H1 | awk '{print $2}'</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function get_bitd_pid_2 {</div><div class='add'>+        ps auxww | grep glusterfs | grep bitd.pid | grep -v grep | grep $H2 | awk '{print $2}'</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function get_signer_th_count_1 {</div><div class='add'>+        ps -eL | grep $(get_bitd_pid_1) | grep glfs_brpobj | wc -l</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function get_signer_th_count_2 {</div><div class='add'>+        ps -eL | grep $(get_bitd_pid_2) | grep glfs_brpobj | wc -l</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST launch_cluster 2</div><div class='add'>+</div><div class='add'>+TEST $CLI_1 peer probe $H2;</div><div class='add'>+EXPECT_WITHIN $PROBE_TIMEOUT 1 peer_count;</div><div class='add'>+</div><div class='add'>+TEST $CLI_1 volume create $V0 $H1:$B1</div><div class='add'>+TEST $CLI_1 volume create $V1 $H2:$B2</div><div class='add'>+EXPECT 'Created' volinfo_field_1 $V0 'Status';</div><div class='add'>+EXPECT 'Created' volinfo_field_1 $V1 'Status';</div><div class='add'>+</div><div class='add'>+TEST $CLI_1 volume start $V0</div><div class='add'>+TEST $CLI_1 volume start $V1</div><div class='add'>+EXPECT 'Started' volinfo_field_1 $V0 'Status';</div><div class='add'>+EXPECT 'Started' volinfo_field_1 $V1 'Status';</div><div class='add'>+</div><div class='add'>+#Enable bitrot</div><div class='add'>+TEST $CLI_1 volume bitrot $V0 enable</div><div class='add'>+TEST $CLI_1 volume bitrot $V1 enable</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" get_bitd_count_1</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" get_bitd_count_2</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "4" get_signer_th_count_1</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "4" get_signer_th_count_2</div><div class='add'>+</div><div class='add'>+old_bitd_pid_1=$(get_bitd_pid_1)</div><div class='add'>+old_bitd_pid_2=$(get_bitd_pid_2)</div><div class='add'>+TEST $CLI_1 volume bitrot $V0 signer-threads 1</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" get_signer_th_count_1</div><div class='add'>+EXPECT_NOT "$old_bitd_pid_1" get_bitd_pid_1;</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "4" get_signer_th_count_2</div><div class='add'>+EXPECT "$old_bitd_pid_2" get_bitd_pid_2;</div><div class='add'>+</div><div class='add'>+old_bitd_pid_1=$(get_bitd_pid_1)</div><div class='add'>+old_bitd_pid_2=$(get_bitd_pid_2)</div><div class='add'>+TEST $CLI_1 volume bitrot $V1 signer-threads 2</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "2" get_signer_th_count_2</div><div class='add'>+EXPECT_NOT "$old_bitd_pid_2" get_bitd_pid_2;</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" get_signer_th_count_1</div><div class='add'>+EXPECT "$old_bitd_pid_1" get_bitd_pid_1;</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bitrot/br-state-check.t b/tests/bitrot/br-state-check.t<br/>new file mode 100644<br/>index 00000000000..2142275699e<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bitrot/br-state-check.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bitrot/br-state-check.t</a></div><div class='hunk'>@@ -0,0 +1,83 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../include.rc</div><div class='add'>+. $(dirname $0)/../volume.rc</div><div class='add'>+. $(dirname $0)/../nfs.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+SCRIPT_TIMEOUT=350</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+</div><div class='add'>+## Create a distribute volume</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/${V0}1 $H0:$B0/${V0}2 $H0:$B0/${V0}3;</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+</div><div class='add'>+## Enable bitrot on volume $V0</div><div class='add'>+TEST $CLI volume bitrot $V0 enable</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" get_bitd_count</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" get_scrubd_count</div><div class='add'>+</div><div class='add'>+## perform a series of scrub related state change tests. As of now, there'</div><div class='add'>+## no way to check if a given change has been correctly acknowledged by</div><div class='add'>+## the scrub process as there isn't an _interface_ to check scrub internal</div><div class='add'>+## state (yet). What's been verified here is scrub state machine execution</div><div class='add'>+## w.r.t. locking and faults.</div><div class='add'>+</div><div class='add'>+## 0x0: verify scrub rescheduling</div><div class='add'>+TEST $CLI volume bitrot $V0 scrub-frequency monthly</div><div class='add'>+TEST $CLI volume bitrot $V0 scrub-frequency daily</div><div class='add'>+TEST $CLI volume bitrot $V0 scrub-frequency hourly</div><div class='add'>+</div><div class='add'>+## 0x1: test reschedule after pause/resume</div><div class='add'>+TEST $CLI volume bitrot $V0 scrub pause</div><div class='add'>+TEST $CLI volume bitrot $V0 scrub-frequency daily</div><div class='add'>+TEST $CLI volume bitrot $V0 scrub resume</div><div class='add'>+</div><div class='add'>+## 0x2: test reschedule w/ an offline brick</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}1</div><div class='add'>+</div><div class='add'>+TEST $CLI volume bitrot $V0 scrub-frequency hourly</div><div class='add'>+TEST $CLI volume bitrot $V0 scrub-throttle aggressive</div><div class='add'>+</div><div class='add'>+## 0x3: test pause/resume w/ an offline brick</div><div class='add'>+TEST $CLI volume bitrot $V0 scrub pause</div><div class='add'>+TEST $CLI volume bitrot $V0 scrub-frequency monthly</div><div class='add'>+TEST $CLI volume bitrot $V0 scrub resume</div><div class='add'>+</div><div class='add'>+## 0x4: test "start" from a paused scrub state</div><div class='add'>+</div><div class='add'>+TEST $CLI volume bitrot $V0 scrub pause</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+</div><div class='add'>+## 0x4a: try pausing an already paused scrub</div><div class='add'>+TEST ! $CLI volume bitrot $V0 scrub pause</div><div class='add'>+</div><div class='add'>+## 0x4b: perform configuration changes</div><div class='add'>+TEST $CLI volume bitrot $V0 scrub-frequency hourly</div><div class='add'>+TEST $CLI volume bitrot $V0 scrub-throttle lazy</div><div class='add'>+TEST $CLI volume bitrot $V0 scrub resume</div><div class='add'>+</div><div class='add'>+## 0x5: test cleanup upon brick going offline</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}1</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}2</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}3</div><div class='add'>+</div><div class='add'>+## 0x6: test cleanup upon brick going offline when srubber is paused</div><div class='add'>+##      (initially paused and otherwise)</div><div class='add'>+</div><div class='add'>+## 0x6a: initially paused case</div><div class='add'>+TEST $CLI volume bitrot $V0 scrub pause</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}3</div><div class='add'>+TEST $CLI volume bitrot $V0 scrub resume</div><div class='add'>+</div><div class='add'>+## 0x6b: paused _after_ execution</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+TEST $CLI volume bitrot $V0 scrub pause</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}2</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+#G_TESTDEF_TEST_STATUS_NETBSD7=KNOWN_ISSUE,BUG=1332473</div><div class='head'>diff --git a/tests/bitrot/br-stub.c b/tests/bitrot/br-stub.c<br/>new file mode 100644<br/>index 00000000000..1111f710f59<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bitrot/br-stub.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bitrot/br-stub.c</a></div><div class='hunk'>@@ -0,0 +1,195 @@</div><div class='add'>+#define _GNU_SOURCE</div><div class='add'>+</div><div class='add'>+#include &lt;stdio.h&gt;</div><div class='add'>+#include &lt;stdlib.h&gt;</div><div class='add'>+#include &lt;string.h&gt;</div><div class='add'>+#include &lt;limits.h&gt;</div><div class='add'>+#include &lt;unistd.h&gt;</div><div class='add'>+#include &lt;fcntl.h&gt;</div><div class='add'>+#include &lt;stdint.h&gt;</div><div class='add'>+#include &lt;sys/types.h&gt;</div><div class='add'>+#include &lt;sys/xattr.h&gt;</div><div class='add'>+#include &lt;errno.h&gt;</div><div class='add'>+</div><div class='add'>+#include "bit-rot-object-version.h"</div><div class='add'>+</div><div class='add'>+/* NOTE: no size discovery */</div><div class='add'>+int</div><div class='add'>+brstub_validate_version(char *bpath, unsigned long version)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+    int match = 0;</div><div class='add'>+    size_t xsize = 0;</div><div class='add'>+    br_version_t *xv = NULL;</div><div class='add'>+</div><div class='add'>+    xsize = sizeof(br_version_t);</div><div class='add'>+</div><div class='add'>+    xv = calloc(1, xsize);</div><div class='add'>+    if (!xv) {</div><div class='add'>+        match = -1;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = getxattr(bpath, "trusted.bit-rot.version", xv, xsize);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        if (errno == ENODATA)</div><div class='add'>+            match = -2;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (xv-&gt;ongoingversion != version) {</div><div class='add'>+        match = -3;</div><div class='add'>+        fprintf(stderr, "ongoingversion: %lu\n", xv-&gt;ongoingversion);</div><div class='add'>+    }</div><div class='add'>+    free(xv);</div><div class='add'>+</div><div class='add'>+err:</div><div class='add'>+    return match;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+brstub_write_validation(char *filp, char *bpath, unsigned long startversion)</div><div class='add'>+{</div><div class='add'>+    int fd1 = 0;</div><div class='add'>+    int fd2 = 0;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    char *string = "string\n";</div><div class='add'>+</div><div class='add'>+    /* read only check */</div><div class='add'>+    fd1 = open(filp, O_RDONLY);</div><div class='add'>+    if (fd1 &lt; 0)</div><div class='add'>+        goto err;</div><div class='add'>+    close(fd1);</div><div class='add'>+</div><div class='add'>+    ret = brstub_validate_version(bpath, startversion);</div><div class='add'>+    if (ret != -2)</div><div class='add'>+        goto err;</div><div class='add'>+</div><div class='add'>+    /* single open (write/) check */</div><div class='add'>+    fd1 = open(filp, O_RDWR);</div><div class='add'>+    if (fd1 &lt; 0)</div><div class='add'>+        goto err;</div><div class='add'>+</div><div class='add'>+    ret = write(fd1, string, strlen(string));</div><div class='add'>+    if (ret &lt;= 0)</div><div class='add'>+        goto err;</div><div class='add'>+    /**</div><div class='add'>+     * Fsync is done so that the write call has properly reached the</div><div class='add'>+     * disk. For fuse mounts write-behind xlator would have held the</div><div class='add'>+     * writes with itself and for nfs, client would have held the</div><div class='add'>+     * write in its cache. So write fop would not have triggered the</div><div class='add'>+     * versioning as it would have not reached the bit-rot-stub.</div><div class='add'>+     */</div><div class='add'>+    fsync(fd1);</div><div class='add'>+    ret = brstub_validate_version(bpath, startversion);</div><div class='add'>+    if (ret != 0)</div><div class='add'>+        goto err;</div><div class='add'>+    ret = write(fd1, string, strlen(string));</div><div class='add'>+    if (ret &lt;= 0)</div><div class='add'>+        goto err;</div><div class='add'>+    fsync(fd1); /* let it reach the disk */</div><div class='add'>+</div><div class='add'>+    ret = brstub_validate_version(bpath, startversion);</div><div class='add'>+    if (ret != 0)</div><div class='add'>+        goto err;</div><div class='add'>+</div><div class='add'>+    close(fd1);</div><div class='add'>+</div><div class='add'>+    /**</div><div class='add'>+     * Well, this is not a _real_ test per se . For this test to pass</div><div class='add'>+     * the inode should not get a forget() in the interim. Therefore,</div><div class='add'>+     * perform this test asap.</div><div class='add'>+     */</div><div class='add'>+</div><div class='add'>+    /* multi open (write/) check */</div><div class='add'>+    fd1 = open(filp, O_RDWR);</div><div class='add'>+    if (fd1 &lt; 0)</div><div class='add'>+        goto err;</div><div class='add'>+    fd2 = open(filp, O_WRONLY);</div><div class='add'>+    if (fd1 &lt; 0)</div><div class='add'>+        goto err;</div><div class='add'>+</div><div class='add'>+    ret = write(fd1, string, strlen(string));</div><div class='add'>+    if (ret &lt;= 0)</div><div class='add'>+        goto err;</div><div class='add'>+</div><div class='add'>+    ret = write(fd2, string, strlen(string));</div><div class='add'>+    if (ret &lt;= 0)</div><div class='add'>+        goto err;</div><div class='add'>+</div><div class='add'>+    /* probably do a syncfs() */</div><div class='add'>+    fsync(fd1);</div><div class='add'>+    fsync(fd2);</div><div class='add'>+</div><div class='add'>+    close(fd1);</div><div class='add'>+    close(fd2);</div><div class='add'>+</div><div class='add'>+    /**</div><div class='add'>+     * incremented once per write()/write().../close()/close() sequence</div><div class='add'>+     */</div><div class='add'>+    ret = brstub_validate_version(bpath, startversion);</div><div class='add'>+    if (ret != 0)</div><div class='add'>+        goto err;</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+</div><div class='add'>+err:</div><div class='add'>+    return -1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+brstub_new_object_validate(char *filp, char *brick)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+    char *fname = NULL;</div><div class='add'>+    char bpath[PATH_MAX] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    fname = basename(filp);</div><div class='add'>+    if (!fname)</div><div class='add'>+        goto err;</div><div class='add'>+</div><div class='add'>+    (void)snprintf(bpath, PATH_MAX, "%s/%s", brick, fname);</div><div class='add'>+</div><div class='add'>+    printf("Validating initial version..\n");</div><div class='add'>+    ret = brstub_validate_version(bpath, 2);</div><div class='add'>+    if (ret != -2) /* version _should_ be missing */</div><div class='add'>+        goto err;</div><div class='add'>+</div><div class='add'>+    printf("Validating version on modifications..\n");</div><div class='add'>+    ret = brstub_write_validation(filp, bpath, 2);</div><div class='add'>+    if (ret &lt; 0)</div><div class='add'>+        goto err;</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+</div><div class='add'>+err:</div><div class='add'>+    return -1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+main(int argc, char **argv)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+    char *filp = NULL;</div><div class='add'>+    char *brick = NULL;</div><div class='add'>+</div><div class='add'>+    if (argc != 3) {</div><div class='add'>+        printf("Usage: %s &lt;path&gt; &lt;brick&gt;\n", argv[0]);</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    filp = argv[1];</div><div class='add'>+    brick = argv[2];</div><div class='add'>+</div><div class='add'>+    printf("Validating object version [%s]\n", filp);</div><div class='add'>+    ret = brstub_new_object_validate(filp, brick);</div><div class='add'>+    if (ret &lt; 0)</div><div class='add'>+        goto err;</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+</div><div class='add'>+err:</div><div class='add'>+    return -1;</div><div class='add'>+}</div><div class='head'>diff --git a/tests/bitrot/br-stub.t b/tests/bitrot/br-stub.t<br/>new file mode 100644<br/>index 00000000000..cc0319afac9<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bitrot/br-stub.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bitrot/br-stub.t</a></div><div class='hunk'>@@ -0,0 +1,66 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../include.rc</div><div class='add'>+. $(dirname $0)/../volume.rc</div><div class='add'>+. $(dirname $0)/../nfs.rc</div><div class='add'>+</div><div class='add'>+#G_TESTDEF_TEST_STATUS_CENTOS6=NFS_TEST</div><div class='add'>+</div><div class='add'>+STUB_SOURCE=$(dirname $0)/br-stub.c</div><div class='add'>+STUB_EXEC=$(dirname $0)/br-stub</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+</div><div class='add'>+## Create a distribute volume (B=2)</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/${V0}1 $H0:$B0/${V0}2;</div><div class='add'>+EXPECT "$V0" volinfo_field $V0 'Volume Name';</div><div class='add'>+EXPECT 'Created' volinfo_field $V0 'Status';</div><div class='add'>+EXPECT '2' brick_count $V0</div><div class='add'>+TEST $CLI volume set $V0 nfs.disable false</div><div class='add'>+</div><div class='add'>+## Turn off write-behind (write-behind clubs writes together)</div><div class='add'>+TEST $CLI volume set $V0 performance.write-behind off</div><div class='add'>+#EXPECT 'off' volinfo_field $V0 'performance.open-behind'</div><div class='add'>+</div><div class='add'>+## Start the volume</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+EXPECT 'Started' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+## enable bitrot</div><div class='add'>+TEST $CLI volume bitrot $V0 enable;</div><div class='add'>+</div><div class='add'>+## Wait for gluster nfs to come up</div><div class='add'>+EXPECT_WITHIN $NFS_EXPORT_TIMEOUT "1" is_nfs_export_available</div><div class='add'>+</div><div class='add'>+## Mount the volume</div><div class='add'>+TEST $GFS --volfile-server=$H0 --volfile-id=$V0 $M0;</div><div class='add'>+TEST mount_nfs $H0:/$V0 $N0 nolock;</div><div class='add'>+</div><div class='add'>+## Build stub C source</div><div class='add'>+build_tester $STUB_SOURCE -o $STUB_EXEC -I$(dirname $0)/../../xlators/features/bit-rot/src/stub</div><div class='add'>+TEST [ -e $STUB_EXEC ]</div><div class='add'>+</div><div class='add'>+## create &amp; check version</div><div class='add'>+fname="$M0/filezero"</div><div class='add'>+touch $fname;</div><div class='add'>+backpath=$(get_backend_paths $fname)</div><div class='add'>+</div><div class='add'>+TEST $STUB_EXEC $fname $(dirname $backpath)</div><div class='add'>+</div><div class='add'>+rm -f $fname;</div><div class='add'>+</div><div class='add'>+## test nfs</div><div class='add'>+fname="$N0/filezero"</div><div class='add'>+touch $fname; # backpath remains same..</div><div class='add'>+</div><div class='add'>+TEST $STUB_EXEC $fname $(dirname $backpath)</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" umount_nfs $N0</div><div class='add'>+</div><div class='add'>+##cleanups..</div><div class='add'>+rm -f $STUB_EXEC</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bitrot/bug-1207627-bitrot-scrub-status.t b/tests/bitrot/bug-1207627-bitrot-scrub-status.t<br/>new file mode 100644<br/>index 00000000000..a361986fdaf<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bitrot/bug-1207627-bitrot-scrub-status.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bitrot/bug-1207627-bitrot-scrub-status.t</a></div><div class='hunk'>@@ -0,0 +1,52 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+## Test case for bitrot scrub status BZ:1207627</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../include.rc</div><div class='add'>+. $(dirname $0)/../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+## Start glusterd</div><div class='add'>+TEST glusterd;</div><div class='add'>+TEST pidof glusterd;</div><div class='add'>+</div><div class='add'>+## Lets create and start the volume</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/${V0}1</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+## Enable bitrot for volume $V0</div><div class='add'>+TEST $CLI volume bitrot $V0 enable</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" get_bitd_count</div><div class='add'>+</div><div class='add'>+## Setting scrubber frequency daily</div><div class='add'>+TEST $CLI volume bitrot $V0 scrub-frequency hourly</div><div class='add'>+</div><div class='add'>+## Setting scrubber throttle value lazy</div><div class='add'>+TEST $CLI volume bitrot $V0 scrub-throttle lazy</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT 'Active' scrub_status $V0 'State of scrub'</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT 'lazy'   scrub_status $V0 'Scrub impact'</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT 'hourly' scrub_status $V0 'Scrub frequency'</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT '/var/log/glusterfs/bitd.log' scrub_status $V0 'Bitrot error log location'</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT '/var/log/glusterfs/scrub.log' scrub_status $V0 'Scrubber error log location'</div><div class='add'>+</div><div class='add'>+## Set expiry-timeout to 1 sec</div><div class='add'>+TEST $CLI volume set $V0 features.expiry-time 1</div><div class='add'>+</div><div class='add'>+##Mount $V0</div><div class='add'>+TEST $GFS --volfile-id=$V0 --volfile-server=$H0 $M0</div><div class='add'>+</div><div class='add'>+#Create sample file</div><div class='add'>+TEST `echo "1234" &gt; $M0/FILE1`</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT 'trusted.bit-rot.signature' check_for_xattr 'trusted.bit-rot.signature' "/$B0/${V0}1/FILE1"</div><div class='add'>+</div><div class='add'>+##Corrupt the file</div><div class='add'>+TEST `echo "corrupt" &gt;&gt; /$B0/${V0}1/FILE1`</div><div class='add'>+</div><div class='add'>+## Ondemand scrub</div><div class='add'>+TEST $CLI volume bitrot $V0 scrub ondemand</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT 'trusted.bit-rot.bad-file' check_for_xattr 'trusted.bit-rot.bad-file' "/$B0/${V0}1/FILE1"</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bitrot/bug-1221914.t b/tests/bitrot/bug-1221914.t<br/>new file mode 100644<br/>index 00000000000..7f6c10c50df<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bitrot/bug-1221914.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bitrot/bug-1221914.t</a></div><div class='hunk'>@@ -0,0 +1,51 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../include.rc</div><div class='add'>+. $(dirname $0)/../volume.rc</div><div class='add'>+. $(dirname $0)/../nfs.rc</div><div class='add'>+</div><div class='add'>+STUB_SOURCE=$(dirname $0)/br-stub.c</div><div class='add'>+STUB_EXEC=$(dirname $0)/br-stub</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+</div><div class='add'>+## Create a distribute volume (B=2)</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/${V0}1 $H0:$B0/${V0}2;</div><div class='add'>+EXPECT "$V0" volinfo_field $V0 'Volume Name';</div><div class='add'>+EXPECT 'Created' volinfo_field $V0 'Status';</div><div class='add'>+EXPECT '2' brick_count $V0</div><div class='add'>+</div><div class='add'>+## Turn off write-behind (write-behind clubs writes together)</div><div class='add'>+TEST $CLI volume set $V0 performance.write-behind off</div><div class='add'>+</div><div class='add'>+## Start the volume</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+EXPECT 'Started' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+## Enable bitrot</div><div class='add'>+TEST $CLI volume bitrot $V0 enable;</div><div class='add'>+</div><div class='add'>+## Mount the volume</div><div class='add'>+TEST $GFS --volfile-server=$H0 --volfile-id=$V0 $M0;</div><div class='add'>+</div><div class='add'>+## Build stub C source</div><div class='add'>+build_tester $STUB_SOURCE -o $STUB_EXEC -I$(dirname $0)/../../xlators/features/bit-rot/src/stub</div><div class='add'>+TEST [ -e $STUB_EXEC ]</div><div class='add'>+</div><div class='add'>+## create &amp; check version</div><div class='add'>+fname="$M0/filezero"</div><div class='add'>+$PYTHON -c "import os,stat; os.mknod('${fname}', stat.S_IFREG | stat.S_IRUSR | stat.S_IWUSR | stat.S_IROTH | stat.S_IRGRP)"</div><div class='add'>+</div><div class='add'>+backpath=$(get_backend_paths $fname)</div><div class='add'>+</div><div class='add'>+TEST $STUB_EXEC $fname $(dirname $backpath)</div><div class='add'>+</div><div class='add'>+rm -f $fname;</div><div class='add'>+</div><div class='add'>+##cleanups..</div><div class='add'>+rm -f $STUB_EXEC</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bitrot/bug-1244613.t b/tests/bitrot/bug-1244613.t<br/>new file mode 100644<br/>index 00000000000..57b86a94ac0<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bitrot/bug-1244613.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bitrot/bug-1244613.t</a></div><div class='hunk'>@@ -0,0 +1,95 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../include.rc</div><div class='add'>+. $(dirname $0)/../volume.rc</div><div class='add'>+. $(dirname $0)/../nfs.rc</div><div class='add'>+. $(dirname $0)/../fileio.rc</div><div class='add'>+</div><div class='add'>+#G_TESTDEF_TEST_STATUS_CENTOS6=NFS_TEST</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TESTS_EXPECTED_IN_LOOP=16</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume info;</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/brick1;</div><div class='add'>+EXPECT 'Created' volinfo_field $V0 'Status';</div><div class='add'>+TEST $CLI volume set $V0 nfs.disable false</div><div class='add'>+</div><div class='add'>+# The test makes use of inode-lru-limit to hit a scenario, where we</div><div class='add'>+# find an inode whose ancestry is not there. Following is the</div><div class='add'>+# hypothesis (which is confirmed by seeing logs indicating that</div><div class='add'>+# codepath has been executed, but not through a good understanding of</div><div class='add'>+# NFS internals).</div><div class='add'>+</div><div class='add'>+#     At the end of an fop, the reference count of an inode would be</div><div class='add'>+#     zero. The inode (and its ancestry) persists in memory only</div><div class='add'>+#     because of non-zero lookup count. These looked up inodes are put</div><div class='add'>+#     in an lru queue of size 1 (here). So, there can be at most one</div><div class='add'>+#     such inode in memory.</div><div class='add'>+</div><div class='add'>+#     NFS Server makes use of anonymous fds. So, if it cannot find</div><div class='add'>+#     valid fd, it does a nameless lookup. This gives us an inode</div><div class='add'>+#     whose ancestry is NULL. When a write happens on this inode,</div><div class='add'>+#     quota-enforcer/marker finds a NULL ancestry and asks</div><div class='add'>+#     storage/posix to build it.</div><div class='add'>+</div><div class='add'>+TEST $CLI volume set $V0 network.inode-lru-limit 1</div><div class='add'>+TEST $CLI volume set $V0 performance.nfs.write-behind off</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+EXPECT 'Started' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+## Enable bitrot</div><div class='add'>+TEST $CLI volume bitrot $V0 enable;</div><div class='add'>+</div><div class='add'>+## Wait for gluster nfs to come up</div><div class='add'>+EXPECT_WITHIN $NFS_EXPORT_TIMEOUT "1" is_nfs_export_available</div><div class='add'>+</div><div class='add'>+TEST mount_nfs $H0:/$V0 $N0;</div><div class='add'>+deep=/0/1/2/3/4/5/6/7/8/9</div><div class='add'>+TEST mkdir -p $N0/$deep</div><div class='add'>+</div><div class='add'>+TEST touch $N0/$deep/file1 $N0/$deep/file2 $N0/$deep/file3 $N0/$deep/file4</div><div class='add'>+</div><div class='add'>+TEST fd_open 3 'w' "$N0/$deep/file1"</div><div class='add'>+TEST fd_open 4 'w' "$N0/$deep/file2"</div><div class='add'>+TEST fd_open 5 'w' "$N0/$deep/file3"</div><div class='add'>+TEST fd_open 6 'w' "$N0/$deep/file4"</div><div class='add'>+</div><div class='add'>+# consume all quota</div><div class='add'>+echo "Hello" &gt; $N0/$deep/new_file_1</div><div class='add'>+echo "World" &gt;&gt; $N0/$deep/new_file_1</div><div class='add'>+echo 1 &gt;&gt; $N0/$deep/new_file_1</div><div class='add'>+echo 2 &gt;&gt; $N0/$deep/new_file_1</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+# At the end of each fop in server, reference count of the</div><div class='add'>+# inode associated with each of the file above drops to zero and hence</div><div class='add'>+# put into lru queue. Since lru-limit is set to 1, an fop next file</div><div class='add'>+# will displace the current inode from itable. This will ensure that</div><div class='add'>+# when writes happens on same fd, fd resolution results in</div><div class='add'>+# nameless lookup from server and encounters an fd</div><div class='add'>+# associated with an inode whose parent is not present in itable.</div><div class='add'>+</div><div class='add'>+for j in $(seq 1 2); do</div><div class='add'>+    for i in $(seq 3 6); do</div><div class='add'>+        TEST_IN_LOOP fd_write $i "content"</div><div class='add'>+        TEST_IN_LOOP sync</div><div class='add'>+    done</div><div class='add'>+done</div><div class='add'>+</div><div class='add'>+exec 3&gt;&amp;-</div><div class='add'>+exec 4&gt;&amp;-</div><div class='add'>+exec 5&gt;&amp;-</div><div class='add'>+exec 6&gt;&amp;-</div><div class='add'>+</div><div class='add'>+$CLI volume statedump $V0 all</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $N0</div><div class='add'>+</div><div class='add'>+TEST $CLI volume stop $V0</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bitrot/bug-1294786.t b/tests/bitrot/bug-1294786.t<br/>new file mode 100644<br/>index 00000000000..5b4b6ddb4d3<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bitrot/bug-1294786.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bitrot/bug-1294786.t</a></div><div class='hunk'>@@ -0,0 +1,95 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../include.rc</div><div class='add'>+. $(dirname $0)/../volume.rc</div><div class='add'>+. $(dirname $0)/../cluster.rc</div><div class='add'>+</div><div class='add'>+function get_bitd_count_1 {</div><div class='add'>+        ps auxww | grep glusterfs | grep bitd.pid | grep -v grep | grep $H1 | wc -l</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function get_bitd_count_2 {</div><div class='add'>+        ps auxww | grep glusterfs | grep bitd.pid | grep -v grep | grep $H2 | wc -l</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function get_node_uuid {</div><div class='add'>+        getfattr -n trusted.glusterfs.node-uuid --only-values $M0/FILE1 2&gt;/dev/null</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST launch_cluster 2</div><div class='add'>+</div><div class='add'>+TEST $CLI_1 peer probe $H2;</div><div class='add'>+EXPECT_WITHIN $PROBE_TIMEOUT 1 peer_count;</div><div class='add'>+</div><div class='add'>+TEST $CLI_1 volume create $V0 replica 2 $H1:$B1 $H2:$B2</div><div class='add'>+EXPECT 'Created' volinfo_field_1 $V0 'Status';</div><div class='add'>+</div><div class='add'>+TEST $CLI_1 volume start $V0</div><div class='add'>+EXPECT 'Started' volinfo_field_1 $V0 'Status';</div><div class='add'>+</div><div class='add'>+uuid1=$($CLI_1 system:: uuid get | awk '{print $2}')</div><div class='add'>+uuid2=$($CLI_2 system:: uuid get | awk '{print $2}')</div><div class='add'>+</div><div class='add'>+##Mount $V0</div><div class='add'>+TEST $GFS --volfile-id=$V0 --volfile-server=$H1 $M0</div><div class='add'>+</div><div class='add'>+#Enable bitrot</div><div class='add'>+TEST $CLI_1 volume bitrot $V0 enable</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" get_bitd_count_1</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" get_bitd_count_2</div><div class='add'>+</div><div class='add'>+#Create sample file</div><div class='add'>+TEST `echo "1234" &gt; $M0/FILE1`</div><div class='add'>+TEST `echo "5678" &gt; $M0/FILE2`</div><div class='add'>+gfid1=$(getfattr -n glusterfs.gfid.string --only-values $M0/FILE1)</div><div class='add'>+gfid2=$(getfattr -n glusterfs.gfid.string --only-values $M0/FILE2)</div><div class='add'>+</div><div class='add'>+EXPECT "$uuid1" get_node_uuid;</div><div class='add'>+</div><div class='add'>+#Corrupt file from back-end</div><div class='add'>+TEST stat $B1/FILE1</div><div class='add'>+TEST stat $B1/FILE2</div><div class='add'>+echo "Corrupted data" &gt;&gt; $B1/FILE1</div><div class='add'>+echo "Corrupted data" &gt;&gt; $B1/FILE2</div><div class='add'>+#Manually set bad-file xattr since we can't wait for an hour for scrubber.</div><div class='add'>+TEST setfattr -n trusted.bit-rot.bad-file -v 0x3100 $B1/FILE1</div><div class='add'>+TEST setfattr -n trusted.bit-rot.bad-file -v 0x3100 $B1/FILE2</div><div class='add'>+TEST touch "$B1/.glusterfs/quarantine/$gfid1"</div><div class='add'>+TEST chmod 000 "$B1/.glusterfs/quarantine/$gfid1"</div><div class='add'>+TEST touch "$B1/.glusterfs/quarantine/$gfid2"</div><div class='add'>+TEST chmod 000 "$B1/.glusterfs/quarantine/$gfid2"</div><div class='add'>+EXPECT "4" get_quarantine_count "$B1";</div><div class='add'>+</div><div class='add'>+TEST $CLI_1 volume stop $V0</div><div class='add'>+TEST $CLI_1 volume start $V0</div><div class='add'>+EXPECT 'Started' volinfo_field_1 $V0 'Status';</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" cluster_brick_up_status 1 $V0 $H1 $B1</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" cluster_brick_up_status 1 $V0 $H2 $B2</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status $V0 0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status $V0 1</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" get_bitd_count_1</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" get_bitd_count_2</div><div class='add'>+#Trigger lookup so that bitrot xlator marks file as bad in its inode context.</div><div class='add'>+TEST stat $M0/FILE1</div><div class='add'>+TEST stat $M0/FILE2</div><div class='add'>+</div><div class='add'>+EXPECT "$uuid2" get_node_uuid;</div><div class='add'>+</div><div class='add'>+#BUG 1308961</div><div class='add'>+#Remove bad files from  mount, it should be removed from quarantine directory.</div><div class='add'>+TEST rm -f $M0/FILE1</div><div class='add'>+TEST ! stat "$B1/.glusterfs/quarantine/$gfid1"</div><div class='add'>+</div><div class='add'>+#BUG 1308961</div><div class='add'>+#Set network.inode-lru-limit to 5 and exceed the limit by creating 10 other files.</div><div class='add'>+#The bad entry from quarantine directory should not be removed.</div><div class='add'>+TEST $CLI_1 volume set $V0 network.inode-lru-limit 5</div><div class='add'>+for i in {1..10}</div><div class='add'>+do</div><div class='add'>+     echo "1234" &gt; $M0/file_$i</div><div class='add'>+done</div><div class='add'>+TEST stat "$B1/.glusterfs/quarantine/$gfid2"</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bitrot/bug-1373520.t b/tests/bitrot/bug-1373520.t<br/>new file mode 100644<br/>index 00000000000..6af5124e86e<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bitrot/bug-1373520.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bitrot/bug-1373520.t</a></div><div class='hunk'>@@ -0,0 +1,71 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../include.rc</div><div class='add'>+. $(dirname $0)/../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+</div><div class='add'>+#Create a disperse volume</div><div class='add'>+TEST $CLI volume create $V0 disperse 6 redundancy 2 $H0:$B0/${V0}{0..5}</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "6" online_brick_count</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT 'Started' volinfo_field $V0 'Status'</div><div class='add'>+</div><div class='add'>+#Disable self heal daemon as it races in this test with lookup on volume</div><div class='add'>+#stop and start.</div><div class='add'>+$CLI volume set $V0 self-heal-daemon off</div><div class='add'>+</div><div class='add'>+#Disable few perf xlators to get the first lookup on the brick</div><div class='add'>+TEST $CLI volume set $V0 performance.stat-prefetch off</div><div class='add'>+TEST $CLI volume set $V0 performance.force-readdirp off</div><div class='add'>+TEST $CLI volume set $V0 dht.force-readdirp off</div><div class='add'>+</div><div class='add'>+#Mount the volume</div><div class='add'>+TEST $GFS -s $H0 --use-readdirp=no --attribute-timeout=0 --entry-timeout=0 --volfile-id $V0 $M0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "6" ec_child_up_count $V0 0</div><div class='add'>+</div><div class='add'>+#Enable bitrot</div><div class='add'>+TEST $CLI volume bitrot $V0 enable</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" get_bitd_count</div><div class='add'>+</div><div class='add'>+#Create sample file</div><div class='add'>+TEST `echo "1234" &gt; $M0/FILE1`</div><div class='add'>+#Create hardlink</div><div class='add'>+TEST `ln $M0/FILE1 $M0/HL_FILE1`</div><div class='add'>+</div><div class='add'>+#Corrupt file from back-end</div><div class='add'>+TEST stat $B0/${V0}5/FILE1</div><div class='add'>+SIZE=$(stat -c %s $B0/${V0}5/FILE1)</div><div class='add'>+echo "Corrupted data" &gt;&gt; $B0/${V0}5/FILE1</div><div class='add'>+gfid1=$(getfattr -n glusterfs.gfid.string --only-values $M0/FILE1)</div><div class='add'>+</div><div class='add'>+#Manually set bad-file xattr</div><div class='add'>+TEST setfattr -n trusted.bit-rot.bad-file -v 0x3100 $B0/${V0}5/FILE1</div><div class='add'>+TEST touch "$B0/${V0}5/.glusterfs/quarantine/$gfid1"</div><div class='add'>+TEST chmod 000 "$B0/${V0}5/.glusterfs/quarantine/$gfid1"</div><div class='add'>+EXPECT "3" get_quarantine_count "$B0/${V0}5";</div><div class='add'>+</div><div class='add'>+TEST $CLI volume stop $V0</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "6" ec_child_up_count $V0 0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" get_bitd_count</div><div class='add'>+</div><div class='add'>+#Delete file and all links from backend</div><div class='add'>+TEST rm -rf $(find $B0/${V0}5 -inum $(stat -c %i $B0/${V0}5/FILE1))</div><div class='add'>+</div><div class='add'>+#New mount for recovery</div><div class='add'>+TEST $GFS -s $H0 --use-readdirp=no --attribute-timeout=0 --entry-timeout=0 --volfile-id $V0 $M1</div><div class='add'>+</div><div class='add'>+$CLI volume set $V0 self-heal-daemon on</div><div class='add'>+TEST $CLI volume heal $V0</div><div class='add'>+</div><div class='add'>+#Access files</div><div class='add'>+TEST cat $M1/FILE1</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "$SIZE" path_size $B0/${V0}5/FILE1</div><div class='add'>+TEST cat $M1/HL_FILE1</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "$SIZE" path_size $B0/${V0}5/HL_FILE1</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bitrot/bug-1700078.t b/tests/bitrot/bug-1700078.t<br/>new file mode 100644<br/>index 00000000000..f27374211fe<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bitrot/bug-1700078.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bitrot/bug-1700078.t</a></div><div class='hunk'>@@ -0,0 +1,87 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../include.rc</div><div class='add'>+. $(dirname $0)/../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+## Start glusterd</div><div class='add'>+TEST glusterd;</div><div class='add'>+TEST pidof glusterd;</div><div class='add'>+</div><div class='add'>+## Lets create and start the volume</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/${V0}1</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+## Enable bitrot for volume $V0</div><div class='add'>+TEST $CLI volume bitrot $V0 enable</div><div class='add'>+</div><div class='add'>+## Turn off quick-read so that it wont cache the contents</div><div class='add'>+# of the file in lookup. For corrupted files, it might</div><div class='add'>+# end up in reads being served from the cache instead of</div><div class='add'>+# an error.</div><div class='add'>+TEST $CLI volume set $V0 performance.quick-read off</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" get_bitd_count</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT 'Active' scrub_status $V0 'State of scrub'</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT '/var/log/glusterfs/bitd.log' scrub_status $V0 'Bitrot error log location'</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT '/var/log/glusterfs/scrub.log' scrub_status $V0 'Scrubber error log location'</div><div class='add'>+</div><div class='add'>+## Set expiry-timeout to 1 sec</div><div class='add'>+TEST $CLI volume set $V0 features.expiry-time 1</div><div class='add'>+</div><div class='add'>+##Mount $V0</div><div class='add'>+TEST glusterfs --volfile-id=$V0 --volfile-server=$H0 $M0 --attribute-timeout=0 --entry-timeout=0</div><div class='add'>+</div><div class='add'>+## Turn off quick-read xlator so that, the contents are not served from the</div><div class='add'>+# quick-read cache.</div><div class='add'>+TEST $CLI volume set $V0 performance.quick-read off</div><div class='add'>+</div><div class='add'>+#Create sample file</div><div class='add'>+TEST `echo "1234" &gt; $M0/FILE1`</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT 'trusted.bit-rot.signature' check_for_xattr 'trusted.bit-rot.signature' "/$B0/${V0}1/FILE1"</div><div class='add'>+</div><div class='add'>+##disable bitrot</div><div class='add'>+TEST $CLI volume bitrot $V0 disable</div><div class='add'>+</div><div class='add'>+## modify the file</div><div class='add'>+TEST `echo "write" &gt;&gt; $M0/FILE1`</div><div class='add'>+</div><div class='add'>+# unmount and remount when the file has to be accessed.</div><div class='add'>+# This is to ensure that, when the remount happens,</div><div class='add'>+# and the file is read, its contents are served from the</div><div class='add'>+# brick instead of cache.</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+</div><div class='add'>+##enable bitrot</div><div class='add'>+TEST $CLI volume bitrot $V0 enable</div><div class='add'>+</div><div class='add'>+# expiry time is set to 1 second. Hence sleep for 2 seconds for the</div><div class='add'>+# oneshot crawler to finish its crawling and sign the file properly.</div><div class='add'>+sleep 2</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" get_bitd_count</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT 'Active' scrub_status $V0 'State of scrub'</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT '/var/log/glusterfs/bitd.log' scrub_status $V0 'Bitrot error log location'</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT '/var/log/glusterfs/scrub.log' scrub_status $V0 'Scrubber error log location'</div><div class='add'>+</div><div class='add'>+## Ondemand scrub</div><div class='add'>+TEST $CLI volume bitrot $V0 scrub ondemand</div><div class='add'>+</div><div class='add'>+# the scrub ondemand CLI command, just ensures that</div><div class='add'>+# the scrubber has received the ondemand scrub directive</div><div class='add'>+# and started. sleep for 2 seconds for scrubber to finish</div><div class='add'>+# crawling and marking file(s) as bad (if if finds that</div><div class='add'>+# corruption has happened) which are filesystem operations.</div><div class='add'>+sleep 2</div><div class='add'>+</div><div class='add'>+TEST ! getfattr -n 'trusted.bit-rot.bad-file' $B0/${V0}1/FILE1</div><div class='add'>+</div><div class='add'>+##Mount $V0</div><div class='add'>+TEST glusterfs --volfile-id=$V0 --volfile-server=$H0 $M0 --attribute-timeout=0 --entry-timeout=0</div><div class='add'>+</div><div class='add'>+TEST cat $M0/FILE1</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bitrot/bug-internal-xattrs-check-1243391.t b/tests/bitrot/bug-internal-xattrs-check-1243391.t<br/>new file mode 100644<br/>index 00000000000..bc9c12520b2<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bitrot/bug-internal-xattrs-check-1243391.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bitrot/bug-internal-xattrs-check-1243391.t</a></div><div class='hunk'>@@ -0,0 +1,42 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../include.rc</div><div class='add'>+. $(dirname $0)/../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+</div><div class='add'>+## Create a distribute volume (B=2)</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/${V0}1 $H0:$B0/${V0}2;</div><div class='add'>+EXPECT "$V0" volinfo_field $V0 'Volume Name';</div><div class='add'>+EXPECT 'Created' volinfo_field $V0 'Status';</div><div class='add'>+EXPECT '2' brick_count $V0</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+## Start the volume</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+EXPECT 'Started' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+## Mount the volume</div><div class='add'>+TEST $GFS --volfile-server=$H0 --volfile-id=$V0 $M0;</div><div class='add'>+</div><div class='add'>+echo "123" &gt;&gt; $M0/file;</div><div class='add'>+</div><div class='add'>+TEST ! setfattr -n "trusted.glusterfs.set-signature" -v "123" $M0/file;</div><div class='add'>+TEST ! setfattr -n "trusted.glusterfs.get-signature" -v "123" $M0/file;</div><div class='add'>+</div><div class='add'>+# sign xattr</div><div class='add'>+TEST ! setfattr -n "trusted.bit-rot.signature" -v "123" $M0/file;</div><div class='add'>+TEST ! setfattr -x "trusted.bit-rot.signature" $M0/file;</div><div class='add'>+</div><div class='add'>+# versioning xattr</div><div class='add'>+TEST ! setfattr -n "trusted.bit-rot.version" -v "123" $M0/file;</div><div class='add'>+TEST ! setfattr -x "trusted.bit-rot.version" $M0/file;</div><div class='add'>+</div><div class='add'>+# bad file xattr</div><div class='add'>+TEST ! setfattr -n "trusted.bit-rot.bad-file" -v "123" $M0/file;</div><div class='add'>+TEST ! setfattr -x "trusted.bit-rot.bad-file" $M0/file;</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/access-control/bug-1051896.c b/tests/bugs/access-control/bug-1051896.c<br/>new file mode 100644<br/>index 00000000000..31799d97a71<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/access-control/bug-1051896.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/access-control/bug-1051896.c</a></div><div class='hunk'>@@ -0,0 +1,94 @@</div><div class='add'>+#include &lt;sys/param.h&gt;</div><div class='add'>+#include &lt;sys/stat.h&gt;</div><div class='add'>+#include &lt;stdio.h&gt;</div><div class='add'>+#include &lt;stdlib.h&gt;</div><div class='add'>+#include &lt;unistd.h&gt;</div><div class='add'>+#include &lt;fcntl.h&gt;</div><div class='add'>+#include &lt;grp.h&gt;</div><div class='add'>+#include &lt;string.h&gt;</div><div class='add'>+#include &lt;ctype.h&gt;</div><div class='add'>+#include &lt;errno.h&gt;</div><div class='add'>+#include &lt;assert.h&gt;</div><div class='add'>+#include &lt;sys/types.h&gt;</div><div class='add'>+#include &lt;utime.h&gt;</div><div class='add'>+#include &lt;sys/acl.h&gt;</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+do_setfacl(const char *path, const char *options, const char *textacl)</div><div class='add'>+{</div><div class='add'>+    int r;</div><div class='add'>+    int type;</div><div class='add'>+    acl_t acl;</div><div class='add'>+    int dob;</div><div class='add'>+    int dok;</div><div class='add'>+    int dom;</div><div class='add'>+    struct stat st;</div><div class='add'>+    char textmode[30];</div><div class='add'>+</div><div class='add'>+    r = 0;</div><div class='add'>+    dob = strchr(options, 'b') != (char *)NULL;</div><div class='add'>+    dok = strchr(options, 'k') != (char *)NULL;</div><div class='add'>+    dom = strchr(options, 'm') != (char *)NULL;</div><div class='add'>+    if ((dom &amp;&amp; !textacl) ||</div><div class='add'>+        (!dom &amp;&amp; (textacl || (!dok &amp;&amp; !dob) || strchr(options, 'd')))) {</div><div class='add'>+        errno = EBADRQC; /* "bad request" */</div><div class='add'>+        r = -1;</div><div class='add'>+    } else {</div><div class='add'>+        if (dob || dok) {</div><div class='add'>+            r = acl_delete_def_file(path);</div><div class='add'>+        }</div><div class='add'>+        if (dob &amp;&amp; !r) {</div><div class='add'>+            if (!stat(path, &amp;st)) {</div><div class='add'>+                sprintf(textmode, "u::%c%c%c,g::%c%c%c,o::%c%c%c",</div><div class='add'>+                        (st.st_mode &amp; 0400 ? 'r' : '-'),</div><div class='add'>+                        (st.st_mode &amp; 0200 ? 'w' : '-'),</div><div class='add'>+                        (st.st_mode &amp; 0100 ? 'x' : '-'),</div><div class='add'>+                        (st.st_mode &amp; 0040 ? 'r' : '-'),</div><div class='add'>+                        (st.st_mode &amp; 0020 ? 'w' : '-'),</div><div class='add'>+                        (st.st_mode &amp; 0010 ? 'x' : '-'),</div><div class='add'>+                        (st.st_mode &amp; 004 ? 'r' : '-'),</div><div class='add'>+                        (st.st_mode &amp; 002 ? 'w' : '-'),</div><div class='add'>+                        (st.st_mode &amp; 001 ? 'x' : '-'));</div><div class='add'>+                acl = acl_from_text(textmode);</div><div class='add'>+                if (acl) {</div><div class='add'>+                    r = acl_set_file(path, ACL_TYPE_ACCESS, acl);</div><div class='add'>+                    acl_free(acl);</div><div class='add'>+                } else</div><div class='add'>+                    r = -1;</div><div class='add'>+            } else</div><div class='add'>+                r = -1;</div><div class='add'>+        }</div><div class='add'>+        if (!r &amp;&amp; dom) {</div><div class='add'>+            if (strchr(options, 'd'))</div><div class='add'>+                type = ACL_TYPE_DEFAULT;</div><div class='add'>+            else</div><div class='add'>+                type = ACL_TYPE_ACCESS;</div><div class='add'>+            acl = acl_from_text(textacl);</div><div class='add'>+            if (acl) {</div><div class='add'>+                r = acl_set_file(path, type, acl);</div><div class='add'>+                acl_free(acl);</div><div class='add'>+            } else</div><div class='add'>+                r = -1;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    if (r)</div><div class='add'>+        r = -errno;</div><div class='add'>+    return r;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+main(int argc, char *argv[])</div><div class='add'>+{</div><div class='add'>+    int rc = 0;</div><div class='add'>+</div><div class='add'>+    if (argc != 4) {</div><div class='add'>+        fprintf(stderr, "usage: ./setfacl_test &lt;path&gt; &lt;options&gt; &lt;textacl&gt;\n");</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='add'>+    rc = do_setfacl(argv[1], argv[2], argv[3]);</div><div class='add'>+    if (rc != 0) {</div><div class='add'>+        fprintf(stderr, "do_setfacl failed: %s\n", strerror(errno));</div><div class='add'>+        return rc;</div><div class='add'>+    }</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='head'>diff --git a/tests/bugs/access-control/bug-1051896.t b/tests/bugs/access-control/bug-1051896.t<br/>new file mode 100644<br/>index 00000000000..870ede7db21<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/access-control/bug-1051896.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/access-control/bug-1051896.t</a></div><div class='hunk'>@@ -0,0 +1,34 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+case $OSTYPE in</div><div class='add'>+NetBSD)</div><div class='add'>+        echo "Skip test on ACL which are not available on NetBSD" &gt;&amp;2</div><div class='add'>+        SKIP_TESTS</div><div class='add'>+        exit 0</div><div class='add'>+        ;;</div><div class='add'>+*)</div><div class='add'>+        ;;</div><div class='add'>+esac</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+## Start and create a volume</div><div class='add'>+TEST glusterd;</div><div class='add'>+TEST pidof glusterd;</div><div class='add'>+TEST $CLI volume info;</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 replica 2 $H0:$B0/${V0}{1,2,3,4};</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+</div><div class='add'>+TEST glusterfs --entry-timeout=0 --attribute-timeout=0 --acl -s $H0 --volfile-id $V0 $M0;</div><div class='add'>+</div><div class='add'>+TEST touch $M0/file1;</div><div class='add'>+</div><div class='add'>+TEST $CC $(dirname $0)/bug-1051896.c -o $(dirname $0)/bug-1051896 -lacl</div><div class='add'>+TEST ! $(dirname $0)/bug-1051896 $M0/file1 m 'u::r,u::w,g::r--,o::r--'</div><div class='add'>+TEST rm -f $(dirname $0)/bug-1051896</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/bugs/access-control/bug-1387241.c b/tests/bugs/access-control/bug-1387241.c<br/>new file mode 100644<br/>index 00000000000..e2e843a2fda<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/access-control/bug-1387241.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/access-control/bug-1387241.c</a></div><div class='hunk'>@@ -0,0 +1,18 @@</div><div class='add'>+#include &lt;stdio.h&gt;</div><div class='add'>+#include &lt;stdlib.h&gt;</div><div class='add'>+#include &lt;unistd.h&gt;</div><div class='add'>+#include &lt;fcntl.h&gt;</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+main(int argc, char *argv[])</div><div class='add'>+{</div><div class='add'>+    int ret = EXIT_FAILURE;</div><div class='add'>+    int fd = open(argv[1], O_RDONLY | O_TRUNC);</div><div class='add'>+</div><div class='add'>+    if (fd) {</div><div class='add'>+        ret = EXIT_SUCCESS;</div><div class='add'>+        close(fd);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='head'>diff --git a/tests/bugs/access-control/bug-1387241.t b/tests/bugs/access-control/bug-1387241.t<br/>new file mode 100644<br/>index 00000000000..2efd80547d6<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/access-control/bug-1387241.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/access-control/bug-1387241.t</a></div><div class='hunk'>@@ -0,0 +1,36 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+case $OSTYPE in</div><div class='add'>+NetBSD)</div><div class='add'>+        echo "Skip test on ACL which are not available on NetBSD" &gt;&amp;2</div><div class='add'>+        SKIP_TESTS</div><div class='add'>+        exit 0</div><div class='add'>+        ;;</div><div class='add'>+*)</div><div class='add'>+        ;;</div><div class='add'>+esac</div><div class='add'>+</div><div class='add'>+#cleanup;</div><div class='add'>+</div><div class='add'>+## Start and create a volume</div><div class='add'>+TEST glusterd;</div><div class='add'>+TEST pidof glusterd;</div><div class='add'>+TEST $CLI volume info;</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 replica 2 $H0:$B0/${V0}{1,2,3,4};</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+</div><div class='add'>+TEST glusterfs --entry-timeout=0 --attribute-timeout=0 --acl -s $H0 --volfile-id $V0 $M0;</div><div class='add'>+</div><div class='add'>+TEST touch $M0/file1;</div><div class='add'>+</div><div class='add'>+TEST $CC $(dirname $0)/bug-1387241.c -o $(dirname $0)/bug-1387241</div><div class='add'>+</div><div class='add'>+TEST $(dirname $0)/bug-1387241 $M0/file1</div><div class='add'>+</div><div class='add'>+TEST rm -f $(dirname $0)/bug-1387241</div><div class='add'>+</div><div class='add'>+#cleanup</div><div class='head'>diff --git a/tests/bugs/access-control/bug-887098-gmount-crash.t b/tests/bugs/access-control/bug-887098-gmount-crash.t<br/>new file mode 100644<br/>index 00000000000..ba9937bd5bf<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/access-control/bug-887098-gmount-crash.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/access-control/bug-887098-gmount-crash.t</a></div><div class='hunk'>@@ -0,0 +1,42 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+## Start and create a volume</div><div class='add'>+TEST glusterd;</div><div class='add'>+TEST pidof glusterd;</div><div class='add'>+TEST $CLI volume info;</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 replica 2 $H0:$B0/${V0}{1,2,3,4};</div><div class='add'>+</div><div class='add'>+## Verify volume is is created</div><div class='add'>+EXPECT "$V0" volinfo_field $V0 'Volume Name';</div><div class='add'>+EXPECT 'Created' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+## Start volume and verify</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+EXPECT 'Started' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+TEST glusterfs -s $H0 --volfile-id=$V0 --acl $M0</div><div class='add'>+MOUNT_PID=$(get_mount_process_pid $V0)</div><div class='add'>+</div><div class='add'>+for i in {1..25};</div><div class='add'>+do</div><div class='add'>+    mkdir $M0/tmp_$i &amp;&amp; cat /etc/hosts &gt; $M0/tmp_$i/file</div><div class='add'>+    cp -RPp $M0/tmp_$i $M0/newtmp_$i &amp;&amp; cat /etc/hosts &gt; $M0/newtmp_$i/newfile</div><div class='add'>+done</div><div class='add'>+</div><div class='add'>+EXPECT "$MOUNT_PID" get_mount_process_pid $V0</div><div class='add'>+TEST rm -rf $M0/*</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+</div><div class='add'>+## Finish up</div><div class='add'>+TEST $CLI volume stop $V0;</div><div class='add'>+EXPECT 'Stopped' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+TEST $CLI volume delete $V0;</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/access-control/bug-958691.t b/tests/bugs/access-control/bug-958691.t<br/>new file mode 100644<br/>index 00000000000..8b70607bdbb<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/access-control/bug-958691.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/access-control/bug-958691.t</a></div><div class='hunk'>@@ -0,0 +1,52 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+. $(dirname $0)/../../nfs.rc</div><div class='add'>+</div><div class='add'>+#G_TESTDEF_TEST_STATUS_CENTOS6=NFS_TEST</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/${V0}{0,1}</div><div class='add'>+TEST $CLI volume set $V0 nfs.disable false</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+</div><div class='add'>+TEST glusterfs --volfile-server=$H0 --volfile-id=$V0 $M0;</div><div class='add'>+EXPECT_WITHIN $NFS_EXPORT_TIMEOUT "1" is_nfs_export_available;</div><div class='add'>+TEST mount_nfs $H0:/$V0 $N0 nolock;</div><div class='add'>+</div><div class='add'>+# Tests for the fuse mount</div><div class='add'>+TEST mkdir $M0/dir;</div><div class='add'>+TEST chmod 1777 $M0/dir;</div><div class='add'>+TEST touch $M0/dir/file{1,2};</div><div class='add'>+</div><div class='add'>+TEST $CLI volume set $V0 server.root-squash enable;</div><div class='add'>+</div><div class='add'>+mv $M0/dir/file1 $M0/dir/file11 2&gt;/dev/null;</div><div class='add'>+TEST [ $? -ne 0 ];</div><div class='add'>+</div><div class='add'>+TEST $CLI volume set $V0 server.root-squash disable;</div><div class='add'>+TEST rm -rf $M0/dir;</div><div class='add'>+</div><div class='add'>+sleep 1;</div><div class='add'>+</div><div class='add'>+# tests for nfs mount</div><div class='add'>+TEST mkdir $N0/dir;</div><div class='add'>+TEST chmod 1777 $N0/dir;</div><div class='add'>+TEST touch $N0/dir/file{1,2};</div><div class='add'>+</div><div class='add'>+TEST $CLI volume set $V0 server.root-squash enable;</div><div class='add'>+</div><div class='add'>+mv $N0/dir/file1 $N0/dir/file11 2&gt;/dev/null;</div><div class='add'>+TEST [ $? -ne 0 ];</div><div class='add'>+</div><div class='add'>+TEST $CLI volume set $V0 server.root-squash disable;</div><div class='add'>+TEST rm -rf $N0/dir;</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $N0</div><div class='add'>+</div><div class='add'>+TEST $CLI volume stop $V0;</div><div class='add'>+TEST $CLI volume delete $V0;</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/bitrot/1207029-bitrot-daemon-should-start-on-valid-node.t b/tests/bugs/bitrot/1207029-bitrot-daemon-should-start-on-valid-node.t<br/>new file mode 100755<br/>index 00000000000..691ebc303e4<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/bitrot/1207029-bitrot-daemon-should-start-on-valid-node.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/bitrot/1207029-bitrot-daemon-should-start-on-valid-node.t</a></div><div class='hunk'>@@ -0,0 +1,57 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+## Test case for bitrot</div><div class='add'>+## bitd daemon should not start on the node which dont have any brick</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+. $(dirname $0)/../../cluster.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+function get_bitd_count {</div><div class='add'>+        ps auxw | grep glusterfs | grep bitd.pid | grep -v grep | wc -l</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+## Start a 2 node virtual cluster</div><div class='add'>+TEST launch_cluster 2;</div><div class='add'>+</div><div class='add'>+## Peer probe server 2 from server 1 cli</div><div class='add'>+TEST $CLI_1 peer probe $H2;</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $PROBE_TIMEOUT 1 peer_count</div><div class='add'>+</div><div class='add'>+## Creating a volume which is having brick only on one node</div><div class='add'>+TEST $CLI_1 volume create $V0 $H1:$B1/${V0}0 $H1:$B1/${V0}1</div><div class='add'>+</div><div class='add'>+## Start the volume</div><div class='add'>+TEST $CLI_1 volume start $V0</div><div class='add'>+</div><div class='add'>+## Enable bitrot on volume from 2nd node.</div><div class='add'>+TEST $CLI_2 volume bitrot $V0 enable</div><div class='add'>+</div><div class='add'>+## Bitd daemon should be running on the node which is having brick. Here node1</div><div class='add'>+## only have brick so bitrot daemon count value should be 1.</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" get_bitd_count</div><div class='add'>+</div><div class='add'>+## Bitd daemon should not run on 2nd node and it should not create bitrot</div><div class='add'>+## volfile on this node. Below test case it to check whether its creating bitrot</div><div class='add'>+## volfile or not for 2nd node which dont have any brick.</div><div class='add'>+## Get current working directory of 2nd node which dont have any brick and do</div><div class='add'>+## stat on bitrot volfile.</div><div class='add'>+</div><div class='add'>+cur_wrk_dir2=$($CLI_2 system:: getwd)</div><div class='add'>+TEST ! stat $cur_wrk_dir2/bitd/bitd-server.vol</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+## Bitd daemon should run on 1st node and it should create bitrot</div><div class='add'>+## volfile on this node. Below test case it to check whether its creating bitrot</div><div class='add'>+## volfile or not for 1st node which is having brick.</div><div class='add'>+## Get current working directory of 1st node which have brick and do</div><div class='add'>+## stat on bitrot volfile.</div><div class='add'>+</div><div class='add'>+cur_wrk_dir1=$($CLI_1 system:: getwd)</div><div class='add'>+TEST stat $cur_wrk_dir1/bitd/bitd-server.vol</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/bitrot/1209751-bitrot-scrub-tunable-reset.t b/tests/bugs/bitrot/1209751-bitrot-scrub-tunable-reset.t<br/>new file mode 100644<br/>index 00000000000..919ffc3ba62<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/bitrot/1209751-bitrot-scrub-tunable-reset.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/bitrot/1209751-bitrot-scrub-tunable-reset.t</a></div><div class='hunk'>@@ -0,0 +1,48 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+## Test case for bitrot</div><div class='add'>+## On restarting glusterd should not reset bitrot tunable value to default</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+. $(dirname $0)/../../cluster.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+## Start glusterd</div><div class='add'>+TEST glusterd;</div><div class='add'>+TEST pidof glusterd;</div><div class='add'>+</div><div class='add'>+## Lets create and start the volume</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/${V0}0 $H0:$B0/${V0}1</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+## Enable bitrot on volume $V0</div><div class='add'>+TEST $CLI volume bitrot $V0 enable</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" get_bitd_count</div><div class='add'>+</div><div class='add'>+## Set bitrot scrub-throttle value to lazy</div><div class='add'>+TEST $CLI volume bitrot $V0 scrub-throttle lazy</div><div class='add'>+</div><div class='add'>+## Set bitrot scrub-frequency value to monthly</div><div class='add'>+TEST $CLI volume bitrot $V0 scrub-frequency monthly</div><div class='add'>+</div><div class='add'>+## Set bitrot scrubber to pause state</div><div class='add'>+TEST $CLI volume bitrot $V0 scrub pause</div><div class='add'>+</div><div class='add'>+## restart glusterd process</div><div class='add'>+pkill glusterd;</div><div class='add'>+TEST glusterd;</div><div class='add'>+TEST pidof glusterd;</div><div class='add'>+</div><div class='add'>+## All the bitrot scrub tunable value should come back again.</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT 'Started' volinfo_field $V0 'Status';</div><div class='add'>+EXPECT 'lazy' volinfo_field $V0 'features.scrub-throttle';</div><div class='add'>+EXPECT 'monthly' volinfo_field $V0 'features.scrub-freq';</div><div class='add'>+EXPECT 'pause' volinfo_field $V0 'features.scrub';</div><div class='add'>+EXPECT 'on' volinfo_field $V0 'features.bitrot';</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/bitrot/1209752-volume-status-should-show-bitrot-scrub-info.t b/tests/bugs/bitrot/1209752-volume-status-should-show-bitrot-scrub-info.t<br/>new file mode 100644<br/>index 00000000000..6101910666c<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/bitrot/1209752-volume-status-should-show-bitrot-scrub-info.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/bitrot/1209752-volume-status-should-show-bitrot-scrub-info.t</a></div><div class='hunk'>@@ -0,0 +1,70 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+## Test case for bitrot</div><div class='add'>+## gluster volume status command should show status of bitrot daemon</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+. $(dirname $0)/../../cluster.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+## Start a 2 node virtual cluster</div><div class='add'>+TEST launch_cluster 2;</div><div class='add'>+</div><div class='add'>+## Peer probe server 2 from server 1 cli</div><div class='add'>+TEST $CLI_1 peer probe $H2;</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $PROBE_TIMEOUT 1 peer_count</div><div class='add'>+</div><div class='add'>+## Lets create and start the volume</div><div class='add'>+TEST $CLI_1 volume create $V0 $H1:$B1/${V0}0 $H2:$B2/${V0}1</div><div class='add'>+TEST $CLI_1 volume start $V0</div><div class='add'>+</div><div class='add'>+## Enable bitrot on volume $V0</div><div class='add'>+TEST $CLI_1 volume bitrot $V0 enable</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "2" get_bitd_count</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "2" get_scrubd_count</div><div class='add'>+</div><div class='add'>+## From node 1 Gluster volume status command should show the status of bitrot</div><div class='add'>+## daemon of all the nodes. there are 2 nodes in a cluster with having brick</div><div class='add'>+## ${V0}1 and ${V0}2 . So there should be 2 bitrot daemon running.</div><div class='add'>+</div><div class='add'>+bitd=$($CLI_1 volume status $V0 | grep "Bitrot Daemon" | grep -v grep | wc -l)</div><div class='add'>+TEST [ "$bitd" -eq 2 ];</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+## From node 2 Gluster volume status command should show the status of Scrubber</div><div class='add'>+## daemon of all the nodes. There are 2 nodes in a cluster with having brick</div><div class='add'>+## ${V0}1 and ${V0}2 . So there should be 2 Scrubber daemon running.</div><div class='add'>+</div><div class='add'>+scrub=$($CLI_2 volume status $V0 | grep "Scrubber Daemon" | grep -v grep | \</div><div class='add'>+        wc -l)</div><div class='add'>+TEST [ "$scrub" -eq 2 ];</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+## From node 1 Gluster volume status command should print status of only</div><div class='add'>+## scrubber daemon. There should be total 2 scrubber daemon running, one daemon</div><div class='add'>+## for each node</div><div class='add'>+</div><div class='add'>+scrub=$($CLI_1 volume status $V0 scrub | grep "Scrubber Daemon" | \</div><div class='add'>+        grep -v grep | wc -l)</div><div class='add'>+TEST [ "$scrub" -eq 2 ];</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+## From node 2 Gluster volume status command should print status of only</div><div class='add'>+## bitd daemon. There should be total 2 bitd daemon running, one daemon</div><div class='add'>+## for each node</div><div class='add'>+</div><div class='add'>+bitd=$($CLI_2 volume status $V0 bitd | grep "Bitrot Daemon" | \</div><div class='add'>+       grep -v grep | wc -l)</div><div class='add'>+TEST [ "$bitd" -eq 2 ];</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/bitrot/1209818-vol-info-show-scrub-process-properly.t b/tests/bugs/bitrot/1209818-vol-info-show-scrub-process-properly.t<br/>new file mode 100644<br/>index 00000000000..4fe02dc7f63<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/bitrot/1209818-vol-info-show-scrub-process-properly.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/bitrot/1209818-vol-info-show-scrub-process-properly.t</a></div><div class='hunk'>@@ -0,0 +1,48 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+## Test case for bitrot.</div><div class='add'>+## volume info should not show 'features.scrub: resume' if scrub process is</div><div class='add'>+## resumed from paused state.</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+. $(dirname $0)/../../cluster.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+## Start glusterd</div><div class='add'>+TEST glusterd;</div><div class='add'>+TEST pidof glusterd;</div><div class='add'>+</div><div class='add'>+## Lets create and start the volume</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/${V0}0 $H0:$B0/${V0}1</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+## Enable bitrot on volume $V0</div><div class='add'>+TEST $CLI volume bitrot $V0 enable</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" get_bitd_count</div><div class='add'>+</div><div class='add'>+## Set bitrot scrubber process to pause state</div><div class='add'>+TEST $CLI volume bitrot $V0 scrub pause</div><div class='add'>+</div><div class='add'>+## gluster volume info command should show scrub process pause.</div><div class='add'>+EXPECT 'pause' volinfo_field $V0 'features.scrub';</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+## Resume scrub process on volume $V0</div><div class='add'>+TEST $CLI volume bitrot $V0 scrub resume</div><div class='add'>+</div><div class='add'>+## gluster volume info command should show scrub process Active</div><div class='add'>+EXPECT 'Active' volinfo_field $V0 'features.scrub';</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+## Disable bitrot on volume $V0</div><div class='add'>+TEST $CLI volume bitrot $V0 disable</div><div class='add'>+</div><div class='add'>+## gluster volume info command should show scrub process Inactive</div><div class='add'>+EXPECT 'Inactive' volinfo_field $V0 'features.scrub';</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/bitrot/bug-1210684-scrub-pause-resume-error-handling.t b/tests/bugs/bitrot/bug-1210684-scrub-pause-resume-error-handling.t<br/>new file mode 100644<br/>index 00000000000..b15b908d21a<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/bitrot/bug-1210684-scrub-pause-resume-error-handling.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/bitrot/bug-1210684-scrub-pause-resume-error-handling.t</a></div><div class='hunk'>@@ -0,0 +1,39 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+## Test case for bitrot BZ:1210684</div><div class='add'>+## Bitrot scrub pause/resume option should give proper error if scrubber is</div><div class='add'>+## already pause/resume and admin try to perform same operation on a volume</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+. $(dirname $0)/../../cluster.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+## Start glusterd</div><div class='add'>+TEST glusterd;</div><div class='add'>+TEST pidof glusterd;</div><div class='add'>+</div><div class='add'>+## Lets create and start the volume</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/${V0}{1..2}</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+## Enable bitrot for volume $V0</div><div class='add'>+TEST $CLI volume bitrot $V0 enable</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" get_bitd_count</div><div class='add'>+</div><div class='add'>+## Pause scrubber operation on volume $V0</div><div class='add'>+TEST $CLI volume bitrot $V0 scrub pause</div><div class='add'>+</div><div class='add'>+## Pausing scrubber again should not success and should give error</div><div class='add'>+TEST ! $CLI volume bitrot $V0 scrub pause</div><div class='add'>+</div><div class='add'>+## Resume scrubber operation on volume $V0</div><div class='add'>+TEST $CLI volume bitrot $V0 scrub resume</div><div class='add'>+</div><div class='add'>+## Resuming scrubber again should not success and should give error</div><div class='add'>+TEST ! $CLI volume bitrot $V0 scrub resume</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/bitrot/bug-1227996.t b/tests/bugs/bitrot/bug-1227996.t<br/>new file mode 100644<br/>index 00000000000..121c7b5f279<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/bitrot/bug-1227996.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/bitrot/bug-1227996.t</a></div><div class='hunk'>@@ -0,0 +1,57 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+## Test case for bitrot</div><div class='add'>+## Tunable object signing waiting time value for bitrot.</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+. $(dirname $0)/../../cluster.rc</div><div class='add'>+</div><div class='add'>+SLEEP_TIME=3</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+## Start glusterd</div><div class='add'>+TEST glusterd;</div><div class='add'>+TEST pidof glusterd;</div><div class='add'>+</div><div class='add'>+## Lets create and start the volume</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/${V0}0 $H0:$B0/${V0}1</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+## Enable bitrot on volume $V0</div><div class='add'>+TEST $CLI volume bitrot $V0 enable</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" get_bitd_count</div><div class='add'>+</div><div class='add'>+# wait a bit for oneshot crawler to finish</div><div class='add'>+sleep $SLEEP_TIME</div><div class='add'>+</div><div class='add'>+## Set object expiry time value</div><div class='add'>+TEST $CLI volume bitrot $V0 signing-time $SLEEP_TIME</div><div class='add'>+</div><div class='add'>+## Mount the volume</div><div class='add'>+TEST $GFS --volfile-server=$H0 --volfile-id=$V0 $M0;</div><div class='add'>+</div><div class='add'>+# create and check object signature</div><div class='add'>+fname="$M0/filezero"</div><div class='add'>+echo "ZZZ" &gt; $fname</div><div class='add'>+</div><div class='add'>+# wait till the object is signed</div><div class='add'>+sleep `expr $SLEEP_TIME \* 2`</div><div class='add'>+</div><div class='add'>+backpath=$(get_backend_paths $fname)</div><div class='add'>+TEST getfattr -m . -n trusted.bit-rot.signature $backpath</div><div class='add'>+</div><div class='add'>+## for now just remove the signature xattr to test for signing</div><div class='add'>+## upon truncate()</div><div class='add'>+TEST setfattr -x trusted.bit-rot.signature $backpath</div><div class='add'>+</div><div class='add'>+## overwrite the file (truncate(), write())</div><div class='add'>+echo "XYX" &gt; $fname</div><div class='add'>+</div><div class='add'>+# wait till the object is signed</div><div class='add'>+sleep `expr $SLEEP_TIME \* 2`</div><div class='add'>+</div><div class='add'>+# test for new signature</div><div class='add'>+TEST getfattr -m . -n trusted.bit-rot.signature $backpath</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/bitrot/bug-1228680.t b/tests/bugs/bitrot/bug-1228680.t<br/>new file mode 100644<br/>index 00000000000..23db9d5e208<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/bitrot/bug-1228680.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/bitrot/bug-1228680.t</a></div><div class='hunk'>@@ -0,0 +1,48 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+## Test case for bitrot</div><div class='add'>+## Tunable object signing waiting time value for bitrot.</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+. $(dirname $0)/../../cluster.rc</div><div class='add'>+</div><div class='add'>+SLEEP_TIME=3</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+## Start glusterd</div><div class='add'>+TEST glusterd;</div><div class='add'>+TEST pidof glusterd;</div><div class='add'>+</div><div class='add'>+## Lets create and start the volume</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/${V0}0 $H0:$B0/${V0}1</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+## Enable bitrot on volume $V0</div><div class='add'>+TEST $CLI volume bitrot $V0 enable</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" get_bitd_count</div><div class='add'>+</div><div class='add'>+# wait a bit for oneshot crawler to finish</div><div class='add'>+sleep $SLEEP_TIME</div><div class='add'>+</div><div class='add'>+## negative test</div><div class='add'>+TEST ! $CLI volume bitrot $V0 signing-time -100</div><div class='add'>+</div><div class='add'>+## Set object expiry time value 5 second.</div><div class='add'>+TEST $CLI volume bitrot $V0 signing-time $SLEEP_TIME</div><div class='add'>+</div><div class='add'>+## Mount the volume</div><div class='add'>+TEST $GFS --volfile-server=$H0 --volfile-id=$V0 $M0;</div><div class='add'>+</div><div class='add'>+# create and check object signature</div><div class='add'>+fname="$M0/filezero"</div><div class='add'>+echo "ZZZ" &gt; $fname</div><div class='add'>+</div><div class='add'>+# wait till the object is signed</div><div class='add'>+sleep `expr $SLEEP_TIME \* 2`</div><div class='add'>+</div><div class='add'>+backpath=$(get_backend_paths $fname)</div><div class='add'>+TEST getfattr -m . -n trusted.bit-rot.signature $backpath</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/bitrot/bug-1229134-bitd-not-support-vol-set.t b/tests/bugs/bitrot/bug-1229134-bitd-not-support-vol-set.t<br/>new file mode 100644<br/>index 00000000000..471471f4b6b<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/bitrot/bug-1229134-bitd-not-support-vol-set.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/bitrot/bug-1229134-bitd-not-support-vol-set.t</a></div><div class='hunk'>@@ -0,0 +1,38 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+## Test case for bitrot BZ:1229134</div><div class='add'>+## gluster volume set &lt;VOLNAME&gt; bitrot * command succeeds,</div><div class='add'>+## which is not supported to enable bitrot.</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+. $(dirname $0)/../../cluster.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+## Start glusterd</div><div class='add'>+TEST glusterd;</div><div class='add'>+TEST pidof glusterd;</div><div class='add'>+</div><div class='add'>+## Lets create and start the volume</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/${V0}{1..2}</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+## 'gluster volume set &lt;VOLNAME&gt;' command for bitrot should failed.</div><div class='add'>+TEST ! $CLI volume set $V0 bitrot enable</div><div class='add'>+TEST ! $CLI volume set $V0 bitrot disable</div><div class='add'>+TEST ! $CLI volume set $V0 scrub-frequency daily</div><div class='add'>+TEST ! $CLI volume set $V0 scrub pause</div><div class='add'>+TEST ! $CLI volume set $V0 scrub-throttle lazy</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+## 'gluster volume bitrot &lt;VOLNAME&gt; *' command for bitrot should succeeds.</div><div class='add'>+TEST $CLI volume bitrot $V0 enable</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" get_bitd_count</div><div class='add'>+</div><div class='add'>+TEST $CLI volume bitrot $V0 scrub pause</div><div class='add'>+TEST $CLI volume bitrot $V0 scrub-frequency daily</div><div class='add'>+TEST $CLI volume bitrot $V0 scrub-throttle lazy</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='head'>diff --git a/tests/bugs/bitrot/bug-1245981.t b/tests/bugs/bitrot/bug-1245981.t<br/>new file mode 100644<br/>index 00000000000..f3955256b01<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/bitrot/bug-1245981.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/bitrot/bug-1245981.t</a></div><div class='hunk'>@@ -0,0 +1,55 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+## Test case for bitrot</div><div class='add'>+## Tunable object signing waiting time value for bitrot.</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+. $(dirname $0)/../../cluster.rc</div><div class='add'>+</div><div class='add'>+SLEEP_TIME=5</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+## Start glusterd</div><div class='add'>+TEST glusterd;</div><div class='add'>+TEST pidof glusterd;</div><div class='add'>+</div><div class='add'>+## Lets create and start the volume</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/${V0}0 $H0:$B0/${V0}1</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+TEST $CLI volume set $V0 network.inode-lru-limit 1</div><div class='add'>+## Enable bitrot on volume $V0</div><div class='add'>+TEST $CLI volume bitrot $V0 enable</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" get_bitd_count</div><div class='add'>+</div><div class='add'>+# wait a bit for oneshot crawler to finish</div><div class='add'>+sleep 2;</div><div class='add'>+</div><div class='add'>+## Set object expiry time value</div><div class='add'>+TEST $CLI volume bitrot $V0 signing-time $SLEEP_TIME</div><div class='add'>+</div><div class='add'>+## Mount the volume</div><div class='add'>+TEST $GFS --volfile-server=$H0 --volfile-id=$V0 $M0;</div><div class='add'>+</div><div class='add'>+# create and check object signature</div><div class='add'>+fname="$M0/filezero"</div><div class='add'>+echo "ZZZ" &gt; $fname</div><div class='add'>+echo "123" &gt; $M0/new_file;</div><div class='add'>+</div><div class='add'>+touch $M0/1</div><div class='add'>+touch $M0/2</div><div class='add'>+touch $M0/3</div><div class='add'>+touch $M0/4</div><div class='add'>+touch $M0/5</div><div class='add'>+</div><div class='add'>+# wait till the object is signed</div><div class='add'>+sleep `expr $SLEEP_TIME \* 2`</div><div class='add'>+</div><div class='add'>+backpath=$(get_backend_paths $fname)</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT 'trusted.bit-rot.signature' check_for_xattr 'trusted.bit-rot.signature' $backpath</div><div class='add'>+</div><div class='add'>+backpath=$(get_backend_paths $M0/new_file)</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT 'trusted.bit-rot.signature' check_for_xattr 'trusted.bit-rot.signature' $backpath</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/bitrot/bug-1288490.t b/tests/bugs/bitrot/bug-1288490.t<br/>new file mode 100644<br/>index 00000000000..5f67f4a6ec5<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/bitrot/bug-1288490.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/bitrot/bug-1288490.t</a></div><div class='hunk'>@@ -0,0 +1,48 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 replica 2 $H0:$B0/brick{0,1}</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+TEST $CLI volume bitrot $V0 enable</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" get_bitd_count</div><div class='add'>+</div><div class='add'>+TEST $GFS --volfile-id=$V0 --volfile-server=$H0 $M0</div><div class='add'>+TEST dd if=/dev/urandom of=$M0/FILE bs=1024 count=1</div><div class='add'>+</div><div class='add'>+# corrupt data -- append 2 bytes</div><div class='add'>+echo -n "~~" &gt;&gt; $B0/brick0/FILE</div><div class='add'>+# manually set bad-file xattr</div><div class='add'>+TEST setfattr -n trusted.bit-rot.bad-file -v 0x3100 $B0/brick0/FILE</div><div class='add'>+</div><div class='add'>+TEST $CLI volume stop $V0</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+EXPECT 'Started' volinfo_field $V0 'Status';</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status $V0 $H0 $B0/brick0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status $V0 $H0 $B0/brick1</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status $V0 0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status $V0 1</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" get_bitd_count</div><div class='add'>+</div><div class='add'>+# trigger lookup</div><div class='add'>+TEST stat $M0/FILE</div><div class='add'>+</div><div class='add'>+# extend the file</div><div class='add'>+TEST dd if=/dev/urandom of=$M0/FILE bs=1024 count=1 oflag=append conv=notrunc</div><div class='add'>+</div><div class='add'>+# check backend file size</div><div class='add'>+EXPECT "1026" stat -c "%s" $B0/brick0/FILE</div><div class='add'>+EXPECT "2048" stat -c "%s" $B0/brick1/FILE</div><div class='add'>+</div><div class='add'>+# check file size on mount</div><div class='add'>+EXPECT "2048" stat -c "%s" $M0/FILE</div><div class='add'>+</div><div class='add'>+TEST umount $M0</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/bugs/bug-1064147.t b/tests/bugs/bug-1064147.t<br/>new file mode 100755<br/>index 00000000000..27ffde4eb44<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/bug-1064147.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/bug-1064147.t</a></div><div class='hunk'>@@ -0,0 +1,72 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../include.rc</div><div class='add'>+. $(dirname $0)/../volume.rc</div><div class='add'>+</div><div class='add'>+# Initialize</div><div class='add'>+#------------------------------------------------------------</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+# Start glusterd</div><div class='add'>+TEST glusterd;</div><div class='add'>+TEST pidof glusterd;</div><div class='add'>+TEST $CLI volume info;</div><div class='add'>+</div><div class='add'>+# Create a volume</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/${V0}{1,2}</div><div class='add'>+</div><div class='add'>+# Verify volume creation</div><div class='add'>+EXPECT "$V0" volinfo_field $V0 'Volume Name';</div><div class='add'>+EXPECT 'Created' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+# Start volume and verify successful start</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+EXPECT 'Started' volinfo_field $V0 'Status';</div><div class='add'>+TEST glusterfs --volfile-id=$V0 --volfile-server=$H0 --entry-timeout=0 $M0;</div><div class='add'>+#------------------------------------------------------------</div><div class='add'>+</div><div class='add'>+# Test case 1 - Subvolume down + Healing</div><div class='add'>+#------------------------------------------------------------</div><div class='add'>+# Kill 2nd brick process</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}2</div><div class='add'>+EXPECT_WITHIN ${PROCESS_UP_TIMEOUT} "1" online_brick_count</div><div class='add'>+</div><div class='add'>+# Change root permissions</div><div class='add'>+TEST chmod 444 $M0</div><div class='add'>+</div><div class='add'>+# Store permission for comparision</div><div class='add'>+TEST permission_new=`stat -c "%A" $M0`</div><div class='add'>+</div><div class='add'>+# Bring up the killed brick process</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+</div><div class='add'>+# Perform lookup</div><div class='add'>+sleep 5</div><div class='add'>+TEST ls $M0</div><div class='add'>+</div><div class='add'>+# Check brick permissions</div><div class='add'>+TEST brick_perm=`stat -c "%A" $B0/${V0}2`</div><div class='add'>+TEST [ ${brick_perm} = ${permission_new} ]</div><div class='add'>+#------------------------------------------------------------</div><div class='add'>+</div><div class='add'>+# Test case 2 - Add-brick + Healing</div><div class='add'>+#------------------------------------------------------------</div><div class='add'>+# Change root permissions</div><div class='add'>+TEST chmod 777 $M0</div><div class='add'>+</div><div class='add'>+# Store permission for comparision</div><div class='add'>+TEST permission_new_2=`stat -c "%A" $M0`</div><div class='add'>+</div><div class='add'>+# Add a 3rd brick</div><div class='add'>+TEST $CLI volume add-brick $V0 $H0:$B0/${V0}3</div><div class='add'>+</div><div class='add'>+# Perform lookup</div><div class='add'>+sleep 5</div><div class='add'>+TEST ls $M0</div><div class='add'>+</div><div class='add'>+# Check permissions on the new brick</div><div class='add'>+TEST brick_perm2=`stat -c "%A" $B0/${V0}3`</div><div class='add'>+</div><div class='add'>+TEST [ ${brick_perm2} = ${permission_new_2} ]</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/bug-1110262.t b/tests/bugs/bug-1110262.t<br/>new file mode 100644<br/>index 00000000000..90b101fc98d<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/bug-1110262.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/bug-1110262.t</a></div><div class='hunk'>@@ -0,0 +1,72 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../include.rc</div><div class='add'>+. $(dirname $0)/../volume.rc</div><div class='add'>+. $(dirname $0)/../traps.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+## Start glusterd</div><div class='add'>+TEST glusterd;</div><div class='add'>+TEST pidof glusterd;</div><div class='add'>+TEST $CLI volume info;</div><div class='add'>+</div><div class='add'>+## Lets create volume</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/${V0}{1,2};</div><div class='add'>+TEST $CLI volume set $V0 nfs.disable false</div><div class='add'>+</div><div class='add'>+## Verify volume is created</div><div class='add'>+EXPECT "$V0" volinfo_field $V0 'Volume Name';</div><div class='add'>+EXPECT 'Created' volinfo_field $V0 'Status';</div><div class='add'>+## Start volume and verify</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+EXPECT 'Started' volinfo_field $V0 'Status';</div><div class='add'>+TEST glusterfs -s $H0 --volfile-id=$V0 $M0</div><div class='add'>+</div><div class='add'>+#do some operation on mount, so that kill_brick is guaranteed to be</div><div class='add'>+#done _after_ first lookup on root and dht has a proper layout on</div><div class='add'>+#it. Otherwise mkdir done in later stages of script might fail due to</div><div class='add'>+#lack of layout on "/" as dht-self-heal won't proceed if any of its</div><div class='add'>+#subvolumes are down.</div><div class='add'>+TEST ls $M0</div><div class='add'>+#kill one of the brick process</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}2</div><div class='add'>+</div><div class='add'>+cleanup_user_group () {</div><div class='add'>+	userdel --force dev</div><div class='add'>+	groupdel QA</div><div class='add'>+}</div><div class='add'>+push_trapfunc cleanup_user_group</div><div class='add'>+</div><div class='add'>+#create a user and group</div><div class='add'>+TEST useradd dev</div><div class='add'>+TEST groupadd QA</div><div class='add'>+</div><div class='add'>+#create a new directory now with special user, group and mode bits</div><div class='add'>+mkdir -m 7777 $M0/dironedown</div><div class='add'>+TEST chown dev $M0/dironedown</div><div class='add'>+TEST chgrp QA $M0/dironedown</div><div class='add'>+</div><div class='add'>+#store the permissions for comparision</div><div class='add'>+permission_onedown=`ls -l $M0 | grep dironedown | awk '{print $1}'`</div><div class='add'>+</div><div class='add'>+#Now bring up the brick process</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+</div><div class='add'>+#The updation of directory attrs happens on the revalidate path. Hence, atmax on</div><div class='add'>+#2 lookups the update will happen.</div><div class='add'>+sleep 5</div><div class='add'>+TEST ls $M0/dironedown;</div><div class='add'>+</div><div class='add'>+#check directory that was created post brick going down</div><div class='add'>+TEST brick_perm=`ls -l $B0/${V0}2 | grep dironedown | awk '{print $1}'`</div><div class='add'>+TEST echo $brick_perm;</div><div class='add'>+TEST [ ${brick_perm} = ${permission_onedown} ]</div><div class='add'>+uid=`ls -l $B0/${V0}2 | grep dironedown | awk '{print $3}'`</div><div class='add'>+TEST echo $uid</div><div class='add'>+TEST [ $uid = dev ]</div><div class='add'>+gid=`ls -l $B0/${V0}2 | grep dironedown | awk '{print $4}'`</div><div class='add'>+TEST echo $gid</div><div class='add'>+TEST [ $gid = QA ]</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/bugs/bug-1138841.t b/tests/bugs/bug-1138841.t<br/>new file mode 100644<br/>index 00000000000..abec5e89d56<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/bug-1138841.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/bug-1138841.t</a></div><div class='hunk'>@@ -0,0 +1,25 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+. $(dirname $0)/../include.rc</div><div class='add'>+. $(dirname $0)/../volume.rc</div><div class='add'>+. $(dirname $0)/../dht.rc</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+</div><div class='add'>+## Create a volume and set auth.allow using cidr format ip</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/${V0}{0,1}</div><div class='add'>+TEST $CLI volume set $V0 auth.allow 127.0.0.1/20</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+## mount the volume and create a file on the mount point</div><div class='add'>+</div><div class='add'>+TEST $GFS --volfile-server=$H0 --volfile-id=$V0 $M0</div><div class='add'>+TEST touch $M0/tmp1</div><div class='add'>+</div><div class='add'>+## Stop the volume and do the cleanup</div><div class='add'>+</div><div class='add'>+TEST $CLI volume stop $V0</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/bugs/bug-1258069.t b/tests/bugs/bug-1258069.t<br/>new file mode 100755<br/>index 00000000000..b87ecbf2fe8<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/bug-1258069.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/bug-1258069.t</a></div><div class='hunk'>@@ -0,0 +1,30 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../include.rc</div><div class='add'>+. $(dirname $0)/../volume.rc</div><div class='add'>+. $(dirname $0)/../nfs.rc</div><div class='add'>+</div><div class='add'>+#G_TESTDEF_TEST_STATUS_CENTOS6=NFS_TEST</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 replica 3 $H0:$B0/${V0}{0,1,2}</div><div class='add'>+TEST $CLI volume set $V0 cluster.choose-local off</div><div class='add'>+TEST $CLI volume set $V0 nfs.disable off</div><div class='add'>+TEST $CLI volume set $V0 diagnostics.client-log-level DEBUG</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $NFS_EXPORT_TIMEOUT "1" is_nfs_export_available</div><div class='add'>+TEST mount_nfs $H0:/$V0 $N0 nolock</div><div class='add'>+TEST mkdir -p $N0/a/b/c</div><div class='add'>+TEST umount_nfs $N0</div><div class='add'>+TEST glusterfs --volfile-id=/$V0 --volfile-server=$H0 $M0 --attribute-timeout=0 --entry-timeout=0</div><div class='add'>+rmdir $M0/a/b/c</div><div class='add'>+mkdir $M0/a/b/c</div><div class='add'>+TEST mount_nfs $H0:/$V0/a/b/c $N0 nolock</div><div class='add'>+TEST umount_nfs $N0</div><div class='add'>+TEST umount $M0</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/bugs/bug-1368312.t b/tests/bugs/bug-1368312.t<br/>new file mode 100644<br/>index 00000000000..c60d562bbd7<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/bug-1368312.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/bug-1368312.t</a></div><div class='hunk'>@@ -0,0 +1,86 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+. $(dirname $0)/../include.rc</div><div class='add'>+. $(dirname $0)/../volume.rc</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+function compare_get_split_brain_status {</div><div class='add'>+        local path=$1</div><div class='add'>+        local choice=$2</div><div class='add'>+        echo `getfattr -n replica.split-brain-status $path` | cut -f2 -d"=" | sed -e 's/^"//'  -e 's/"$//' | grep $choice</div><div class='add'>+        if [ $? -ne 0 ]</div><div class='add'>+        then</div><div class='add'>+                echo 1</div><div class='add'>+        else</div><div class='add'>+                echo 0</div><div class='add'>+        fi</div><div class='add'>+</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 replica 2 $H0:$B0/${V0}{0,1,2,3,4,5}</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+#Disable self-heal-daemon</div><div class='add'>+TEST $CLI volume set $V0 cluster.self-heal-daemon off</div><div class='add'>+</div><div class='add'>+TEST glusterfs --volfile-id=$V0 --volfile-server=$H0 --entry-timeout=0 $M0;</div><div class='add'>+</div><div class='add'>+TEST mkdir $M0/tmp1</div><div class='add'>+</div><div class='add'>+#Create metadata split-brain</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}2</div><div class='add'>+TEST chmod 666 $M0/tmp1</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}3</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 2</div><div class='add'>+</div><div class='add'>+TEST chmod 757 $M0/tmp1</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 2</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 3</div><div class='add'>+</div><div class='add'>+EXPECT 2 get_pending_heal_count $V0</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}4</div><div class='add'>+TEST chmod 755 $M0/tmp1</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}5</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 4</div><div class='add'>+</div><div class='add'>+TEST chmod 766 $M0/tmp1</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 4</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 5</div><div class='add'>+</div><div class='add'>+EXPECT 4 get_pending_heal_count $V0</div><div class='add'>+</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}0</div><div class='add'>+TEST chmod 765 $M0/tmp1</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}1</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 0</div><div class='add'>+</div><div class='add'>+TEST chmod 756 $M0/tmp1</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 1</div><div class='add'>+</div><div class='add'>+EXPECT 6 get_pending_heal_count $V0</div><div class='add'>+</div><div class='add'>+cd $M0</div><div class='add'>+EXPECT 0 compare_get_split_brain_status ./tmp1 patchy-client-0</div><div class='add'>+EXPECT 0 compare_get_split_brain_status ./tmp1 patchy-client-1</div><div class='add'>+EXPECT 0 compare_get_split_brain_status ./tmp1 patchy-client-2</div><div class='add'>+EXPECT 0 compare_get_split_brain_status ./tmp1 patchy-client-3</div><div class='add'>+EXPECT 0 compare_get_split_brain_status ./tmp1 patchy-client-4</div><div class='add'>+EXPECT 0 compare_get_split_brain_status ./tmp1 patchy-client-5</div><div class='add'>+</div><div class='add'>+cd -</div><div class='add'>+cleanup</div><div class='add'>+#G_TESTDEF_TEST_STATUS_NETBSD7=BAD_TEST,BUG=000000</div><div class='add'>+#G_TESTDEF_TEST_STATUS_CENTOS6=BAD_TEST,BUG=000000</div><div class='head'>diff --git a/tests/bugs/bug-1371806.t b/tests/bugs/bug-1371806.t<br/>new file mode 100644<br/>index 00000000000..08180525650<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/bug-1371806.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/bug-1371806.t</a></div><div class='hunk'>@@ -0,0 +1,81 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+. $(dirname $0)/../include.rc</div><div class='add'>+. $(dirname $0)/../volume.rc</div><div class='add'>+. $(dirname $0)/../dht.rc</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+function get_getfattr {</div><div class='add'>+        local path=$1</div><div class='add'>+        echo `getfattr -n user.foo $path` | cut -f2 -d"=" | sed -e 's/^"//'  -e 's/"$//'</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function set_fattr {</div><div class='add'>+        for i in `seq 1 10`</div><div class='add'>+        do</div><div class='add'>+                setfattr -n user.foo -v "newabc" ./tmp${i}</div><div class='add'>+                if [ "$?" = "0" ]</div><div class='add'>+                 then</div><div class='add'>+                    succ=$((succ+1))</div><div class='add'>+                else</div><div class='add'>+                    fail=$((fail+1))</div><div class='add'>+                fi</div><div class='add'>+        done</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/${V0}{0,1,2,3,4,5}</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+EXPECT_WITHIN ${PROCESS_UP_TIMEOUT} "6" online_brick_count</div><div class='add'>+</div><div class='add'>+TEST glusterfs --volfile-id=$V0 --volfile-server=$H0 --entry-timeout=0 $M0;</div><div class='add'>+</div><div class='add'>+cd $M0</div><div class='add'>+TEST mkdir tmp{1..10}</div><div class='add'>+</div><div class='add'>+##First set user.foo xattr with value abc on all dirs</div><div class='add'>+</div><div class='add'>+TEST setfattr -n user.foo -v "abc" ./tmp{1..10}</div><div class='add'>+EXPECT "abc" get_getfattr ./tmp{1..10}</div><div class='add'>+EXPECT "abc" get_getfattr $B0/${V0}5/tmp{1..10}</div><div class='add'>+</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}5</div><div class='add'>+EXPECT_WITHIN ${PROCESS_UP_TIMEOUT} "5" online_brick_count</div><div class='add'>+</div><div class='add'>+succ=fail=0</div><div class='add'>+## set user.foo xattr with value newabc after kill one brick</div><div class='add'>+set_fattr</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN ${PROCESS_UP_TIMEOUT} "6" online_brick_count</div><div class='add'>+</div><div class='add'>+cd -</div><div class='add'>+TEST umount $M0</div><div class='add'>+TEST glusterfs --volfile-id=$V0 --volfile-server=$H0 --entry-timeout=0 $M0;</div><div class='add'>+</div><div class='add'>+cd $M0</div><div class='add'>+## At this point dht code will heal xattr on down brick only for those dirs</div><div class='add'>+## hashed subvol was up at the time of update xattr</div><div class='add'>+TEST stat ./tmp{1..10}</div><div class='add'>+</div><div class='add'>+## Count the user.foo xattr value with abc on mount point and compare with fail value</div><div class='add'>+count=`getfattr -n user.foo ./tmp{1..10} | grep "user.foo" | grep -iw "abc" | wc -l`</div><div class='add'>+EXPECT "$fail" echo $count</div><div class='add'>+</div><div class='add'>+## Count the user.foo xattr value with newabc on mount point and compare with succ value</div><div class='add'>+count=`getfattr -n user.foo ./tmp{1..10} | grep "user.foo" | grep -iw "newabc" | wc -l`</div><div class='add'>+EXPECT "$succ" echo $count</div><div class='add'>+</div><div class='add'>+## Count the user.foo xattr value with abc on brick and compare with succ value</div><div class='add'>+count=`getfattr -n user.foo $B0/${V0}5/tmp{1..10} | grep "user.foo" | grep -iw "abc" | wc -l`</div><div class='add'>+EXPECT "$fail" echo $count</div><div class='add'>+</div><div class='add'>+## Count the user.foo xattr value with newabc on brick and compare with succ value</div><div class='add'>+count=`getfattr -n user.foo $B0/${V0}5/tmp{1..10} | grep "user.foo" | grep -iw "newabc" | wc -l`</div><div class='add'>+EXPECT "$succ" echo $count</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+cd -</div><div class='add'>+cleanup</div><div class='add'>+exit</div><div class='head'>diff --git a/tests/bugs/bug-1371806_1.t b/tests/bugs/bug-1371806_1.t<br/>new file mode 100644<br/>index 00000000000..df19a8c1c2a<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/bug-1371806_1.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/bug-1371806_1.t</a></div><div class='hunk'>@@ -0,0 +1,48 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+. $(dirname $0)/../include.rc</div><div class='add'>+. $(dirname $0)/../volume.rc</div><div class='add'>+. $(dirname $0)/../dht.rc</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+function get_getfattr {</div><div class='add'>+        local path=$1</div><div class='add'>+        echo `getfattr -n user.foo $path` | cut -f2 -d"=" | sed -e 's/^"//'  -e 's/"$//'</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function remove_mds_xattr {</div><div class='add'>+</div><div class='add'>+       for i in `seq 1 10`</div><div class='add'>+       do</div><div class='add'>+               setfattr -x trusted.glusterfs.dht.mds $1/tmp${i} 2&gt; /dev/null</div><div class='add'>+       done</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/${V0}{0,1,2,3}</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+TEST glusterfs --volfile-id=$V0 --volfile-server=$H0 $M0;</div><div class='add'>+</div><div class='add'>+cd $M0</div><div class='add'>+TEST mkdir tmp{1..10}</div><div class='add'>+</div><div class='add'>+##Remove internal mds xattr from all directory</div><div class='add'>+remove_mds_xattr $B0/${V0}0</div><div class='add'>+remove_mds_xattr $B0/${V0}1</div><div class='add'>+remove_mds_xattr $B0/${V0}2</div><div class='add'>+remove_mds_xattr $B0/${V0}3</div><div class='add'>+</div><div class='add'>+cd -</div><div class='add'>+umount $M0</div><div class='add'>+</div><div class='add'>+TEST glusterfs --volfile-id=$V0 --volfile-server=$H0 $M0;</div><div class='add'>+cd $M0</div><div class='add'>+</div><div class='add'>+TEST setfattr -n user.foo -v "abc" ./tmp{1..10}</div><div class='add'>+EXPECT "abc" get_getfattr ./tmp{1..10}</div><div class='add'>+</div><div class='add'>+cd -</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/bugs/bug-1371806_2.t b/tests/bugs/bug-1371806_2.t<br/>new file mode 100644<br/>index 00000000000..e6aa8e7c1ad<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/bug-1371806_2.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/bug-1371806_2.t</a></div><div class='hunk'>@@ -0,0 +1,52 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+. $(dirname $0)/../include.rc</div><div class='add'>+. $(dirname $0)/../volume.rc</div><div class='add'>+. $(dirname $0)/../dht.rc</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+function get_getfattr {</div><div class='add'>+        local path=$1</div><div class='add'>+        echo `getfattr -n user.foo $path` | cut -f2 -d"=" | sed -e 's/^"//'  -e 's/"$//'</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function remove_mds_xattr {</div><div class='add'>+</div><div class='add'>+       for i in `seq 1 10`</div><div class='add'>+       do</div><div class='add'>+               setfattr -x trusted.glusterfs.dht.mds $1/tmp${i} 2&gt; /dev/null</div><div class='add'>+       done</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/${V0}{0,1,2,3}</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+TEST glusterfs --volfile-id=$V0 --volfile-server=$H0 --entry-timeout=0 --attribute-timeout=0 $M0;</div><div class='add'>+cd $M0</div><div class='add'>+TEST mkdir tmp{1..10}</div><div class='add'>+</div><div class='add'>+##Remove internal mds xattr from all directory</div><div class='add'>+remove_mds_xattr $B0/${V0}0</div><div class='add'>+remove_mds_xattr $B0/${V0}1</div><div class='add'>+remove_mds_xattr $B0/${V0}2</div><div class='add'>+remove_mds_xattr $B0/${V0}3</div><div class='add'>+</div><div class='add'>+##First set user.foo xattr with value abc on all dirs</div><div class='add'>+</div><div class='add'>+TEST setfattr -n user.foo -v "abc" ./tmp{1..10}</div><div class='add'>+EXPECT "abc" get_getfattr ./tmp{1..10}</div><div class='add'>+EXPECT "abc" get_getfattr $B0/${V0}0/tmp{1..10}</div><div class='add'>+EXPECT "abc" get_getfattr $B0/${V0}1/tmp{1..10}</div><div class='add'>+EXPECT "abc" get_getfattr $B0/${V0}2/tmp{1..10}</div><div class='add'>+EXPECT "abc" get_getfattr $B0/${V0}3/tmp{1..10}</div><div class='add'>+</div><div class='add'>+cd -</div><div class='add'>+TEST umount $M0</div><div class='add'>+</div><div class='add'>+cd -</div><div class='add'>+cleanup</div><div class='add'>+exit</div><div class='head'>diff --git a/tests/bugs/bug-1371806_3.t b/tests/bugs/bug-1371806_3.t<br/>new file mode 100644<br/>index 00000000000..cb13f37c737<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/bug-1371806_3.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/bug-1371806_3.t</a></div><div class='hunk'>@@ -0,0 +1,63 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+. $(dirname $0)/../include.rc</div><div class='add'>+. $(dirname $0)/../volume.rc</div><div class='add'>+. $(dirname $0)/../dht.rc</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+function get_getfattr {</div><div class='add'>+        local path=$1</div><div class='add'>+        echo `getfattr -n user.foo $path` | cut -f2 -d"=" | sed -e 's/^"//'  -e 's/"$//'</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function set_fattr {</div><div class='add'>+        for i in `seq 1 10`</div><div class='add'>+        do</div><div class='add'>+                setfattr -n user.foo -v "newabc" ./tmp${i}</div><div class='add'>+                if [ "$?" = "0" ]</div><div class='add'>+                 then</div><div class='add'>+                    succ=$((succ+1))</div><div class='add'>+                else</div><div class='add'>+                    fail=$((fail+1))</div><div class='add'>+                fi</div><div class='add'>+        done</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/${V0}{0,1,2,3}</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+TEST glusterfs --volfile-id=$V0 --volfile-server=$H0 --entry-timeout=0 --attribute-timeout=0 $M0;</div><div class='add'>+</div><div class='add'>+cd $M0</div><div class='add'>+TEST mkdir tmp{1..10}</div><div class='add'>+</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}3</div><div class='add'>+EXPECT_WITHIN ${PROCESS_UP_TIMEOUT} "3" online_brick_count</div><div class='add'>+</div><div class='add'>+succ=fail=0</div><div class='add'>+## set user.foo xattr with value newabc after kill one brick</div><div class='add'>+set_fattr</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN ${PROCESS_UP_TIMEOUT} "4" online_brick_count</div><div class='add'>+</div><div class='add'>+cd -</div><div class='add'>+TEST umount $M0</div><div class='add'>+TEST glusterfs --volfile-id=$V0 --volfile-server=$H0 --entry-timeout=0 --attribute-timeout=0 $M0;</div><div class='add'>+</div><div class='add'>+cd $M0</div><div class='add'>+## At this point dht code will heal xattr on down brick only for those dirs</div><div class='add'>+## hashed subvol was up at the time of update xattr</div><div class='add'>+TEST stat ./tmp{1..10}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+## Count the user.foo xattr value with newabc on brick and compare with succ value</div><div class='add'>+count=`getfattr -n user.foo $B0/${V0}3/tmp{1..10} | grep "user.foo" | grep -iw "newabc" | wc -l`</div><div class='add'>+EXPECT "$succ" echo $count</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+cd -</div><div class='add'>+cleanup</div><div class='add'>+exit</div><div class='head'>diff --git a/tests/bugs/bug-1371806_acl.t b/tests/bugs/bug-1371806_acl.t<br/>new file mode 100644<br/>index 00000000000..c39165628cc<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/bug-1371806_acl.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/bug-1371806_acl.t</a></div><div class='hunk'>@@ -0,0 +1,96 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+. $(dirname $0)/../include.rc</div><div class='add'>+. $(dirname $0)/../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+TEST useradd tmpuser</div><div class='add'>+</div><div class='add'>+function set_facl_user {</div><div class='add'>+        for i in `seq 1 10`</div><div class='add'>+        do</div><div class='add'>+                setfacl -m u:tmpuser:rw ./tmp${i}</div><div class='add'>+                if [ "$?" = "0" ]</div><div class='add'>+                 then</div><div class='add'>+                    succ=$((succ+1))</div><div class='add'>+                else</div><div class='add'>+                    fail=$((fail+1))</div><div class='add'>+                fi</div><div class='add'>+        done</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function set_facl_default {</div><div class='add'>+        for i in `seq 1 10`</div><div class='add'>+        do</div><div class='add'>+                setfacl -m d:o:rw ./tmp${i}</div><div class='add'>+                if [ "$?" = "0" ]</div><div class='add'>+                 then</div><div class='add'>+                    succ1=$((succ1+1))</div><div class='add'>+                else</div><div class='add'>+                    fail1=$((fail1+1))</div><div class='add'>+                fi</div><div class='add'>+        done</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/${V0}{0,1,2,3,4,5}</div><div class='add'>+TEST $CLI volume set $V0 diagnostics.client-log-level DEBUG</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+EXPECT_WITHIN ${PROCESS_UP_TIMEOUT} "6" online_brick_count</div><div class='add'>+</div><div class='add'>+TEST glusterfs --volfile-id=$V0 --acl --volfile-server=$H0 --entry-timeout=0 $M0;</div><div class='add'>+</div><div class='add'>+cd $M0</div><div class='add'>+TEST mkdir tmp{1..10}</div><div class='add'>+TEST setfacl -m u:tmpuser:rwx ./tmp{1..10}</div><div class='add'>+count=`getfacl -p $M0/tmp{1..10} | grep -c "user:tmpuser:rwx"`</div><div class='add'>+EXPECT "10" echo $count</div><div class='add'>+TEST setfacl -m d:o:rwx ./tmp{1..10}</div><div class='add'>+count=`getfacl -p $M0/tmp{1..10} | grep -c "default:other::rwx"`</div><div class='add'>+EXPECT "10" echo $count</div><div class='add'>+count=`getfacl -p $B0/${V0}5/tmp{1..10} | grep -c "user:tmpuser:rwx"`</div><div class='add'>+EXPECT "10" echo $count</div><div class='add'>+count=`getfacl -p $B0/${V0}5/tmp{1..10} | grep -c "default:other::rwx"`</div><div class='add'>+EXPECT "10" echo $count</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}5</div><div class='add'>+EXPECT_WITHIN ${PROCESS_UP_TIMEOUT} "5" online_brick_count</div><div class='add'>+</div><div class='add'>+succ=fail=0</div><div class='add'>+## Update acl attributes on dir after kill one brick</div><div class='add'>+set_facl_user</div><div class='add'>+succ1=fail1=0</div><div class='add'>+set_facl_default</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN ${PROCESS_UP_TIMEOUT} "6" online_brick_count</div><div class='add'>+</div><div class='add'>+cd -</div><div class='add'>+TEST umount $M0</div><div class='add'>+TEST glusterfs --volfile-id=$V0 --acl --volfile-server=$H0 --entry-timeout=0 $M0;</div><div class='add'>+</div><div class='add'>+cd $M0</div><div class='add'>+## At this point dht will heal xatts on down brick only for those hashed_subvol</div><div class='add'>+## was up at the time of updated xattrs</div><div class='add'>+TEST stat ./tmp{1..10}</div><div class='add'>+</div><div class='add'>+# Make sure to send a write and read on the file inside mount</div><div class='add'>+echo "helloworld" &gt; ./tmp1/file</div><div class='add'>+TEST cat ./tmp1/file</div><div class='add'>+</div><div class='add'>+## Compare succ value with updated acl attributes</div><div class='add'>+count=`getfacl -p $B0/${V0}5/tmp{1..10} | grep -c "user:tmpuser:rw-"`</div><div class='add'>+EXPECT "$succ" echo $count</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+count=`getfacl -p $B0/${V0}5/tmp{1..10} | grep -c "default:other::rw-"`</div><div class='add'>+EXPECT "$succ1" echo $count</div><div class='add'>+</div><div class='add'>+cd -</div><div class='add'>+userdel --force tmpuser</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/bugs/bug-1584517.t b/tests/bugs/bug-1584517.t<br/>new file mode 100644<br/>index 00000000000..7f48015a034<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/bug-1584517.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/bug-1584517.t</a></div><div class='hunk'>@@ -0,0 +1,70 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+. $(dirname $0)/../include.rc</div><div class='add'>+. $(dirname $0)/../volume.rc</div><div class='add'>+. $(dirname $0)/../dht.rc</div><div class='add'>+cleanup;</div><div class='add'>+#This test case verifies attributes (uid/gid/perm) for the</div><div class='add'>+#directory are healed after stop/start brick. To verify the same</div><div class='add'>+#test case change attributes of the directory after down a DHT subvolume</div><div class='add'>+#and one AFR children. After start the volume with force and run lookup</div><div class='add'>+#operation attributes should be healed on started bricks at the backend.</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 replica 3 $H0:$B0/${V0}{0,1,2,3,4,5}</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+TEST useradd dev -M</div><div class='add'>+TEST groupadd QA</div><div class='add'>+</div><div class='add'>+TEST glusterfs --volfile-id=$V0 --volfile-server=$H0 $M0;</div><div class='add'>+</div><div class='add'>+TEST mkdir $M0/dironedown</div><div class='add'>+</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}2</div><div class='add'>+EXPECT_WITHIN ${PROCESS_UP_TIMEOUT} "5" online_brick_count</div><div class='add'>+</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}3</div><div class='add'>+EXPECT_WITHIN ${PROCESS_UP_TIMEOUT} "4" online_brick_count</div><div class='add'>+</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}4</div><div class='add'>+EXPECT_WITHIN ${PROCESS_UP_TIMEOUT} "3" online_brick_count</div><div class='add'>+</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}5</div><div class='add'>+EXPECT_WITHIN ${PROCESS_UP_TIMEOUT} "2" online_brick_count</div><div class='add'>+</div><div class='add'>+TEST chown dev $M0/dironedown</div><div class='add'>+TEST chgrp QA $M0/dironedown</div><div class='add'>+TEST chmod 777 $M0/dironedown</div><div class='add'>+</div><div class='add'>+#store the permissions for comparision</div><div class='add'>+permission_onedown=`ls -l $M0 | grep dironedown | awk '{print $1}'`</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN ${PROCESS_UP_TIMEOUT} "6" online_brick_count</div><div class='add'>+</div><div class='add'>+TEST glusterfs --volfile-id=$V0 --volfile-server=$H0 $M0;</div><div class='add'>+</div><div class='add'>+#Run lookup two times to hit revalidate code path in dht</div><div class='add'>+# to heal user attr</div><div class='add'>+</div><div class='add'>+TEST ls $M0/dironedown</div><div class='add'>+</div><div class='add'>+#check attributes those were created post brick going down</div><div class='add'>+TEST brick_perm=`ls -l $B0/${V0}3 | grep dironedown | awk '{print $1}'`</div><div class='add'>+TEST echo $brick_perm</div><div class='add'>+TEST [ ${brick_perm} = ${permission_onedown} ]</div><div class='add'>+uid=`ls -l $B0/${V0}3 | grep dironedown | awk '{print $3}'`</div><div class='add'>+TEST echo $uid</div><div class='add'>+TEST [ $uid = dev ]</div><div class='add'>+gid=`ls -l $B0/${V0}3 | grep dironedown | awk '{print $4}'`</div><div class='add'>+TEST echo $gid</div><div class='add'>+TEST [ $gid = QA ]</div><div class='add'>+</div><div class='add'>+TEST umount $M0</div><div class='add'>+userdel --force dev</div><div class='add'>+groupdel QA</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='add'>+exit</div><div class='add'>+</div><div class='head'>diff --git a/tests/bugs/bug-1620580.t b/tests/bugs/bug-1620580.t<br/>new file mode 100644<br/>index 00000000000..0c74d4a6089<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/bug-1620580.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/bug-1620580.t</a></div><div class='hunk'>@@ -0,0 +1,67 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../include.rc</div><div class='add'>+. $(dirname $0)/../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+## Start glusterd</div><div class='add'>+TEST glusterd;</div><div class='add'>+TEST pidof glusterd;</div><div class='add'>+TEST $CLI volume info;</div><div class='add'>+</div><div class='add'>+## Lets create volume</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/${V0}{1,2};</div><div class='add'>+</div><div class='add'>+## Verify volume is created</div><div class='add'>+EXPECT "$V0" volinfo_field $V0 'Volume Name';</div><div class='add'>+EXPECT 'Created' volinfo_field $V0 'Status';</div><div class='add'>+## Start volume and verify</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+EXPECT 'Started' volinfo_field $V0 'Status';</div><div class='add'>+TEST glusterfs -s $H0 --volfile-id=$V0 $M0</div><div class='add'>+</div><div class='add'>+#do some operation on mount, so that kill_brick is guaranteed to be</div><div class='add'>+#done _after_ first lookup on root</div><div class='add'>+</div><div class='add'>+TEST ls $M0</div><div class='add'>+TEST touch $M0/file</div><div class='add'>+</div><div class='add'>+TEST $CLI volume stop $V0</div><div class='add'>+TEST $CLI volume delete $V0</div><div class='add'>+</div><div class='add'>+# Case of Same volume name, but different bricks</div><div class='add'>+TEST $CLI volume create $V0 replica 2 $H0:$B0/${V0}{3,4};</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+</div><div class='add'>+# Give time for 'reconnect' to happen</div><div class='add'>+sleep 4</div><div class='add'>+</div><div class='add'>+TEST ! ls $M0</div><div class='add'>+TEST ! touch $M0/file1</div><div class='add'>+</div><div class='add'>+# Case of Same brick, but different volume (ie, recreated).</div><div class='add'>+TEST $CLI volume create $V1 $H0:$B0/${V0}{1,2};</div><div class='add'>+TEST $CLI volume start $V1;</div><div class='add'>+</div><div class='add'>+# Give time for 'reconnect' to happen</div><div class='add'>+sleep 4</div><div class='add'>+TEST ! ls $M0</div><div class='add'>+TEST ! touch $M0/file2</div><div class='add'>+</div><div class='add'>+TEST $CLI volume stop $V0</div><div class='add'>+TEST $CLI volume delete $V0</div><div class='add'>+TEST $CLI volume stop $V1</div><div class='add'>+TEST $CLI volume delete $V1</div><div class='add'>+</div><div class='add'>+# Case of Same brick, but different volume (but same volume name)</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/${V0}{1,2}</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+</div><div class='add'>+# Give time for 'reconnect' to happen</div><div class='add'>+sleep 4</div><div class='add'>+TEST ! ls $M0</div><div class='add'>+TEST ! touch $M0/file3</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/bugs/bug-1694920.t b/tests/bugs/bug-1694920.t<br/>new file mode 100644<br/>index 00000000000..5bf93c92f94<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/bug-1694920.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/bug-1694920.t</a></div><div class='hunk'>@@ -0,0 +1,63 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+SCRIPT_TIMEOUT=300</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../include.rc</div><div class='add'>+. $(dirname $0)/../volume.rc</div><div class='add'>+. $(dirname $0)/../fileio.rc</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd;</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/${V0};</div><div class='add'>+TEST $CLI volume set $V0 performance.quick-read off</div><div class='add'>+TEST $CLI volume set $V0 performance.io-cache off</div><div class='add'>+TEST $CLI volume set $V0 performance.write-behind off</div><div class='add'>+TEST $CLI volume set $V0 performance.open-behind off</div><div class='add'>+TEST $CLI volume set $V0 performance.stat-prefetch off</div><div class='add'>+TEST $CLI volume set $V0 performance.read-ahead off</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+TEST $GFS -s $H0 --volfile-id=$V0  $M0;</div><div class='add'>+</div><div class='add'>+TEST touch $M0/a</div><div class='add'>+</div><div class='add'>+#When all bricks are up, lock and unlock should succeed</div><div class='add'>+TEST fd1=`fd_available`</div><div class='add'>+TEST fd_open $fd1 'w' $M0/a</div><div class='add'>+TEST flock -x $fd1</div><div class='add'>+TEST fd_close $fd1</div><div class='add'>+</div><div class='add'>+#When all bricks are down, lock/unlock should fail</div><div class='add'>+TEST fd1=`fd_available`</div><div class='add'>+TEST fd_open $fd1 'w' $M0/a</div><div class='add'>+TEST $CLI volume stop $V0</div><div class='add'>+TEST ! flock -x $fd1</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" client_connected_status_meta $M0 $V0-client-0</div><div class='add'>+TEST fd_close $fd1</div><div class='add'>+</div><div class='add'>+#When a brick goes down and comes back up operations on fd which had locks on it should succeed by default</div><div class='add'>+TEST fd1=`fd_available`</div><div class='add'>+TEST fd_open $fd1 'w' $M0/a</div><div class='add'>+TEST flock -x $fd1</div><div class='add'>+TEST $CLI volume stop $V0</div><div class='add'>+sleep 2</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" client_connected_status_meta $M0 $V0-client-0</div><div class='add'>+TEST fd_write $fd1 "data"</div><div class='add'>+TEST fd_close $fd1</div><div class='add'>+</div><div class='add'>+#When a brick goes down and comes back up operations on fd which had locks on it should fail when client.strict-locks is on</div><div class='add'>+TEST $CLI volume set $V0 client.strict-locks on</div><div class='add'>+TEST fd1=`fd_available`</div><div class='add'>+TEST fd_open $fd1 'w' $M0/a</div><div class='add'>+TEST flock -x $fd1</div><div class='add'>+TEST $CLI volume stop $V0</div><div class='add'>+sleep 2</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" client_connected_status_meta $M0 $V0-client-0</div><div class='add'>+TEST ! fd_write $fd1 "data"</div><div class='add'>+TEST fd_close $fd1</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/bugs/bug-1702299.t b/tests/bugs/bug-1702299.t<br/>new file mode 100644<br/>index 00000000000..1cff2ed5d3d<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/bug-1702299.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/bug-1702299.t</a></div><div class='hunk'>@@ -0,0 +1,67 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+. $(dirname $0)/../include.rc</div><div class='add'>+. $(dirname $0)/../volume.rc</div><div class='add'>+. $(dirname $0)/../dht.rc</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+function get_getfattr {</div><div class='add'>+        local path=$1</div><div class='add'>+        echo `getfattr -n user.foo $path` | cut -f2 -d"=" | sed -e 's/^"//'  -e 's/"$//'</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function set_fattr {</div><div class='add'>+        for i in `seq 1 10`</div><div class='add'>+        do</div><div class='add'>+                setfattr -n user.foo -v "newabc" ./tmp${i}</div><div class='add'>+                if [ "$?" = "0" ]</div><div class='add'>+                 then</div><div class='add'>+                    succ=$((succ+1))</div><div class='add'>+                else</div><div class='add'>+                    fail=$((fail+1))</div><div class='add'>+                fi</div><div class='add'>+        done</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/${V0}{0,1,2,3}</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+TEST glusterfs --volfile-id=$V0 --volfile-server=$H0 --entry-timeout=0 --attribute-timeout=0 $M0;</div><div class='add'>+</div><div class='add'>+cd $M0</div><div class='add'>+TEST mkdir tmp{1..10}</div><div class='add'>+</div><div class='add'>+succ=fail=0</div><div class='add'>+## set user.foo xattr with value newabc after kill one brick</div><div class='add'>+set_fattr</div><div class='add'>+count=10</div><div class='add'>+EXPECT "$succ" echo $count</div><div class='add'>+count=0</div><div class='add'>+EXPECT "$fail" echo $count</div><div class='add'>+</div><div class='add'>+cd -</div><div class='add'>+</div><div class='add'>+# Add-brick</div><div class='add'>+TEST $CLI volume add-brick $V0 $H0:$B0/${V0}{4,5}</div><div class='add'>+</div><div class='add'>+cd $M0</div><div class='add'>+## At this point dht code will heal xattr on down brick only for those dirs</div><div class='add'>+## hashed subvol was up at the time of update xattr</div><div class='add'>+TEST stat ./tmp{1..10}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+## Count the user.foo xattr value with newabc on brick and compare with succ value</div><div class='add'>+count=`getfattr -n user.foo $B0/${V0}4/tmp{1..10} | grep "user.foo" | grep -iw "newabc" | wc -l`</div><div class='add'>+EXPECT "$succ" echo $count</div><div class='add'>+</div><div class='add'>+## Count the user.foo xattr value with newabc on brick and compare with succ value</div><div class='add'>+count=`getfattr -n user.foo $B0/${V0}5/tmp{1..10} | grep "user.foo" | grep -iw "newabc" | wc -l`</div><div class='add'>+EXPECT "$succ" echo $count</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+cd -</div><div class='add'>+TEST umount $M0</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/bugs/changelog/bug-1208470.t b/tests/bugs/changelog/bug-1208470.t<br/>new file mode 100755<br/>index 00000000000..526f8f20612<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/changelog/bug-1208470.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/changelog/bug-1208470.t</a></div><div class='hunk'>@@ -0,0 +1,40 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+## Testcase:</div><div class='add'>+## Avoid creating any EMPTY changelog(over the changelog rollover time)</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+. $(dirname $0)/../../changelog.rc</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+## override current changelog rollover-time</div><div class='add'>+## to avoid sleeping for long duration.</div><div class='add'>+CL_RO_TIME=5</div><div class='add'>+</div><div class='add'>+## Start and create a volume</div><div class='add'>+TEST glusterd;</div><div class='add'>+TEST pidof glusterd;</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/$V0"1";</div><div class='add'>+</div><div class='add'>+## Verify volume is created</div><div class='add'>+EXPECT "$V0" volinfo_field $V0 'Volume Name';</div><div class='add'>+EXPECT 'Created' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+## Start volume and verify</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+EXPECT 'Started' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+## Set changelog ON</div><div class='add'>+TEST $CLI volume set $V0 changelog.changelog on;</div><div class='add'>+</div><div class='add'>+EXPECT 1 count_changelog_files $B0/${V0}1</div><div class='add'>+</div><div class='add'>+## Set changelog rollover time</div><div class='add'>+TEST $CLI volume set $V0 changelog.rollover-time $CL_RO_TIME;</div><div class='add'>+</div><div class='add'>+## Wait for changelog rollover time</div><div class='add'>+sleep $CL_RO_TIME</div><div class='add'>+</div><div class='add'>+## NO additional empty changelogs created</div><div class='add'>+EXPECT 1 count_changelog_files $B0/${V0}1</div><div class='head'>diff --git a/tests/bugs/changelog/bug-1211327.t b/tests/bugs/changelog/bug-1211327.t<br/>new file mode 100644<br/>index 00000000000..a849ec3981f<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/changelog/bug-1211327.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/changelog/bug-1211327.t</a></div><div class='hunk'>@@ -0,0 +1,46 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+#Testcase:</div><div class='add'>+#On brick restart, new HTIME.TSTAMP file should not be created.</div><div class='add'>+#But on changelog disable/enable HTIME.TSTAMP should be created.</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+. $(dirname $0)/../../changelog.rc</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+## Start and create a volume</div><div class='add'>+TEST glusterd;</div><div class='add'>+TEST pidof glusterd;</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/$V0"1";</div><div class='add'>+</div><div class='add'>+## Verify volume is is created</div><div class='add'>+EXPECT "$V0" volinfo_field $V0 'Volume Name';</div><div class='add'>+EXPECT 'Created' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+## Start volume and verify</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+EXPECT 'Started' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+TEST $CLI volume set $V0 changelog.changelog on;</div><div class='add'>+##Let changelog init complete before killing gluster processes</div><div class='add'>+sleep 1</div><div class='add'>+</div><div class='add'>+TEST killall_gluster;</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "0" online_brick_count</div><div class='add'>+</div><div class='add'>+TEST glusterd;</div><div class='add'>+TEST pidof glusterd;</div><div class='add'>+</div><div class='add'>+##Let the brick processes starts</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" online_brick_count</div><div class='add'>+</div><div class='add'>+##On brick restart only one HTIME should be found.</div><div class='add'>+EXPECT 1 count_htime_files;</div><div class='add'>+</div><div class='add'>+##On changelog disable/enable, new HTIME should be created.</div><div class='add'>+TEST $CLI volume set $V0 changelog.changelog off;</div><div class='add'>+TEST $CLI volume set $V0 changelog.changelog on;</div><div class='add'>+EXPECT 2 count_htime_files;</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/changelog/bug-1225542.t b/tests/bugs/changelog/bug-1225542.t<br/>new file mode 100644<br/>index 00000000000..a646aa88014<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/changelog/bug-1225542.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/changelog/bug-1225542.t</a></div><div class='hunk'>@@ -0,0 +1,30 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+#Testcase:</div><div class='add'>+#On snapshot, notify changelog reconfigure upon explicit rollover</div><div class='add'>+#irrespective of any failures and send error back to barrier if any.</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../snapshot.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+TEST verify_lvm_version</div><div class='add'>+TEST glusterd;</div><div class='add'>+TEST pidof glusterd;</div><div class='add'>+</div><div class='add'>+TEST setup_lvm 1</div><div class='add'>+</div><div class='add'>+## Create a volume</div><div class='add'>+TEST $CLI volume create $V0 $H0:$L1</div><div class='add'>+</div><div class='add'>+## Start volume and verify</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+TEST $CLI volume set $V0 changelog.changelog on</div><div class='add'>+##Wait for changelog init to complete.</div><div class='add'>+sleep 1</div><div class='add'>+</div><div class='add'>+## Take snapshot</div><div class='add'>+TEST $CLI snapshot create snap1 $V0</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/changelog/bug-1321955.t b/tests/bugs/changelog/bug-1321955.t<br/>new file mode 100644<br/>index 00000000000..9e3752b1728<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/changelog/bug-1321955.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/changelog/bug-1321955.t</a></div><div class='hunk'>@@ -0,0 +1,60 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+#This file checks if missing entry self-heal and entry self-heal are working</div><div class='add'>+#as expected.</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+. $(dirname $0)/../../afr.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 replica 2 $H0:$B0/${V0}{0,1}</div><div class='add'>+TEST $CLI volume set $V0 changelog.changelog enable</div><div class='add'>+TEST $CLI volume set $V0 changelog.capture-del-path on</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+#Mount the volume</div><div class='add'>+TEST glusterfs --volfile-id=/$V0 --volfile-server=$H0 $M0 --attribute-timeout=0 --entry-timeout=0</div><div class='add'>+</div><div class='add'>+#Create files</div><div class='add'>+TEST touch $M0/file1</div><div class='add'>+TEST mkdir $M0/dir1</div><div class='add'>+TEST touch $M0/dir1/file1</div><div class='add'>+</div><div class='add'>+#Check for presence of files</div><div class='add'>+TEST stat $B0/${V0}0/dir1/file1</div><div class='add'>+TEST stat $B0/${V0}1/dir1/file1</div><div class='add'>+TEST stat $B0/${V0}0/file1</div><div class='add'>+TEST stat $B0/${V0}1/file1</div><div class='add'>+</div><div class='add'>+#Kill brick1</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}1</div><div class='add'>+</div><div class='add'>+#Del dir1/file1</div><div class='add'>+TEST rm -f $M0/dir1/file1</div><div class='add'>+</div><div class='add'>+#file1 should be present in brick1 and not in brick0</div><div class='add'>+TEST ! stat $B0/${V0}0/dir1/file1</div><div class='add'>+TEST stat $B0/${V0}1/dir1/file1</div><div class='add'>+</div><div class='add'>+#Bring up the brick which is down</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status $V0 0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status $V0 1</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 1</div><div class='add'>+</div><div class='add'>+#Initiate heal</div><div class='add'>+TEST $CLI volume heal $V0</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "0" get_pending_heal_count $V0</div><div class='add'>+</div><div class='add'>+#dir1/file1 in brick1 should be deleted</div><div class='add'>+TEST ! stat $B0/${V0}1/dir1/file1</div><div class='add'>+</div><div class='add'>+#file1 under root should not be deleted in brick1</div><div class='add'>+TEST stat $B0/${V0}1/file1</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/cli/bug-1004218.t b/tests/bugs/cli/bug-1004218.t<br/>new file mode 100644<br/>index 00000000000..ab8307d6405<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/cli/bug-1004218.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/cli/bug-1004218.t</a></div><div class='hunk'>@@ -0,0 +1,26 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+# Test if only a single xml document is generated by 'status all'</div><div class='add'>+# when a volume is not started</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create ${V0}1 $H0:$B0/${V0}1{1,2}</div><div class='add'>+TEST $CLI volume create ${V0}2 $H0:$B0/${V0}2{1,2}</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start ${V0}1</div><div class='add'>+</div><div class='add'>+function test_status_all ()</div><div class='add'>+{</div><div class='add'>+        $CLI volume status all --xml | xmllint -format -</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+TEST test_status_all</div><div class='add'>+</div><div class='add'>+TEST $CLI volume stop ${V0}1</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/bugs/cli/bug-1022905.t b/tests/bugs/cli/bug-1022905.t<br/>new file mode 100644<br/>index 00000000000..ee629e970d9<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/cli/bug-1022905.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/cli/bug-1022905.t</a></div><div class='hunk'>@@ -0,0 +1,37 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+## Create a volume</div><div class='add'>+TEST glusterd;</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume info;</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/${V0}{1};</div><div class='add'>+EXPECT 'Created' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+## Volume start</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+EXPECT 'Started' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+## Enable a protected and a resettable/unprotected option</div><div class='add'>+TEST $CLI volume quota $V0 enable</div><div class='add'>+TEST $CLI volume set $V0 diagnostics.client-log-level DEBUG</div><div class='add'>+</div><div class='add'>+## Reset cmd resets only unprotected option(s), succeeds.</div><div class='add'>+TEST $CLI volume reset $V0;</div><div class='add'>+</div><div class='add'>+## Set an unprotected option</div><div class='add'>+TEST $CLI volume set $V0 diagnostics.client-log-level DEBUG</div><div class='add'>+</div><div class='add'>+## Now 1 protected and 1 unprotected options are set</div><div class='add'>+## Reset force should succeed</div><div class='add'>+TEST $CLI volume reset $V0 force;</div><div class='add'>+</div><div class='add'>+TEST $CLI volume stop $V0</div><div class='add'>+TEST $CLI volume delete $V0</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/cli/bug-1030580.t b/tests/bugs/cli/bug-1030580.t<br/>new file mode 100644<br/>index 00000000000..ac8b1d8f6db<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/cli/bug-1030580.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/cli/bug-1030580.t</a></div><div class='hunk'>@@ -0,0 +1,53 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+function write_to_file {</div><div class='add'>+    dd of=$M0/1 if=/dev/zero bs=1024k count=128 oflag=append 2&gt;&amp;1 &gt;/dev/null</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 replica 2 $H0:$B0/${V0}0 $H0:$B0/${V0}1</div><div class='add'>+# Increasing the json stats dump time interval, so that it doesn't mess with the test.</div><div class='add'>+TEST $CLI volume set $V0 diagnostics.stats-dump-interval 3600</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+TEST $CLI volume profile $V0 start</div><div class='add'>+TEST glusterfs --volfile-id=/$V0 --volfile-server=$H0 $M0 --attribute-timeout=0 --entry-timeout=0</div><div class='add'>+</div><div class='add'>+# Clear the profile info uptill now.</div><div class='add'>+TEST $CLI volume profile $V0 info clear</div><div class='add'>+</div><div class='add'>+# Verify 'volume profile info' prints both cumulative and incremental stats</div><div class='add'>+write_to_file &amp;</div><div class='add'>+wait</div><div class='add'>+output=$($CLI volume profile $V0 info)</div><div class='add'>+EXPECT 2 cumulative_stat_count "$output"</div><div class='add'>+EXPECT 2 incremental_stat_count "$output" ' 0 '</div><div class='add'>+</div><div class='add'>+# Verify 'volume profile info incremental' prints incremental stats only</div><div class='add'>+write_to_file &amp;</div><div class='add'>+wait</div><div class='add'>+output=$($CLI volume profile $V0 info incremental)</div><div class='add'>+EXPECT 0 cumulative_stat_count "$output"</div><div class='add'>+EXPECT 2 incremental_stat_count "$output" ' 1 '</div><div class='add'>+</div><div class='add'>+# Verify 'volume profile info cumulative' prints cumulative stats only</div><div class='add'>+write_to_file &amp;</div><div class='add'>+wait</div><div class='add'>+output=$($CLI volume profile $V0 info cumulative)</div><div class='add'>+EXPECT 2 cumulative_stat_count "$output"</div><div class='add'>+EXPECT 0 incremental_stat_count "$output" '.*'</div><div class='add'>+</div><div class='add'>+# Verify the 'volume profile info cumulative' command above didn't alter</div><div class='add'>+# the interval id</div><div class='add'>+write_to_file &amp;</div><div class='add'>+wait</div><div class='add'>+output=$($CLI volume profile $V0 info incremental)</div><div class='add'>+EXPECT 0 cumulative_stat_count "$output"</div><div class='add'>+EXPECT 2 incremental_stat_count "$output" ' 2 '</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/cli/bug-1047378.t b/tests/bugs/cli/bug-1047378.t<br/>new file mode 100644<br/>index 00000000000..33ee6be3d8b<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/cli/bug-1047378.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/cli/bug-1047378.t</a></div><div class='hunk'>@@ -0,0 +1,12 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+</div><div class='add'>+TEST "echo volume list | $CLI --xml | xmllint --format -"</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/bugs/cli/bug-1047416.t b/tests/bugs/cli/bug-1047416.t<br/>new file mode 100644<br/>index 00000000000..864301034c9<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/cli/bug-1047416.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/cli/bug-1047416.t</a></div><div class='hunk'>@@ -0,0 +1,71 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+function write_to_file {</div><div class='add'>+    dd of=$M0/1 if=/dev/zero bs=1024k count=128 oflag=append 2&gt;&amp;1 &gt;/dev/null</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 replica 2 $H0:$B0/${V0}0 $H0:$B0/${V0}1</div><div class='add'>+# Increasing the json stats dump time interval, so that it doesn't mess with the test.</div><div class='add'>+TEST $CLI volume set $V0 diagnostics.stats-dump-interval 3600</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+TEST $CLI volume profile $V0 start</div><div class='add'>+TEST glusterfs --volfile-id=/$V0 --volfile-server=$H0 $M0 --attribute-timeout=0 --entry-timeout=0</div><div class='add'>+</div><div class='add'>+# Clear the profile info uptill now.</div><div class='add'>+TEST $CLI volume profile $V0 info clear</div><div class='add'>+</div><div class='add'>+# Verify 'volume profile info' prints both cumulative and incremental stats</div><div class='add'>+write_to_file &amp;</div><div class='add'>+wait</div><div class='add'>+output=$($CLI volume profile $V0 info)</div><div class='add'>+EXPECT 2 cumulative_stat_count "$output"</div><div class='add'>+EXPECT 2 incremental_stat_count "$output" ' 0 '</div><div class='add'>+</div><div class='add'>+# Verify 'volume profile info peek' prints both cumulative and incremental stats</div><div class='add'>+# without clearing incremental stats</div><div class='add'>+write_to_file &amp;</div><div class='add'>+wait</div><div class='add'>+output=$($CLI volume profile $V0 info peek)</div><div class='add'>+EXPECT 2 cumulative_stat_count "$output"</div><div class='add'>+EXPECT 2 incremental_stat_count "$output" ' 1 '</div><div class='add'>+</div><div class='add'>+write_to_file &amp;</div><div class='add'>+wait</div><div class='add'>+output=$($CLI volume profile $V0 info peek)</div><div class='add'>+EXPECT 2 cumulative_stat_count "$output"</div><div class='add'>+EXPECT 2 incremental_stat_count "$output" ' 1 '</div><div class='add'>+</div><div class='add'>+# Verify 'volume profile info incremental peek' prints incremental stats only</div><div class='add'>+# without clearing incremental stats</div><div class='add'>+write_to_file &amp;</div><div class='add'>+wait</div><div class='add'>+output=$($CLI volume profile $V0 info incremental peek)</div><div class='add'>+EXPECT 0 cumulative_stat_count "$output"</div><div class='add'>+EXPECT 2 incremental_stat_count "$output" ' 1 '</div><div class='add'>+</div><div class='add'>+write_to_file &amp;</div><div class='add'>+wait</div><div class='add'>+output=$($CLI volume profile $V0 info incremental peek)</div><div class='add'>+EXPECT 0 cumulative_stat_count "$output"</div><div class='add'>+EXPECT 2 incremental_stat_count "$output" ' 1 '</div><div class='add'>+</div><div class='add'>+# Verify 'volume profile info clear' clears both incremental and cumulative stats</div><div class='add'>+write_to_file &amp;</div><div class='add'>+wait</div><div class='add'>+output=$($CLI volume profile $V0 info clear)</div><div class='add'>+EXPECT 2 cleared_stat_count "$output"</div><div class='add'>+</div><div class='add'>+output=$($CLI volume profile $V0 info)</div><div class='add'>+EXPECT 2 cumulative_stat_count "$output"</div><div class='add'>+EXPECT 2 incremental_stat_count "$output" ' 0 '</div><div class='add'>+EXPECT 4 data_read_count "$output" ' 0 '</div><div class='add'>+EXPECT 4 data_written_count "$output" ' 0 '</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/cli/bug-1077682.t b/tests/bugs/cli/bug-1077682.t<br/>new file mode 100644<br/>index 00000000000..eab5d86d04b<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/cli/bug-1077682.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/cli/bug-1077682.t</a></div><div class='hunk'>@@ -0,0 +1,24 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/${V0}{1,2,3,4}</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+TEST ! $CLI volume remove-brick $V0 $H0:$B0/${V0}1</div><div class='add'>+TEST $CLI volume remove-brick $V0 $H0:$B0/${V0}2 force</div><div class='add'>+TEST $CLI volume remove-brick $V0 $H0:$B0/${V0}3 start</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $REBALANCE_TIMEOUT "completed" remove_brick_status_completed_field "$V0" \</div><div class='add'>+"$H0:$B0/${V0}3"</div><div class='add'>+</div><div class='add'>+TEST $CLI volume remove-brick $V0 $H0:$B0/${V0}3 commit</div><div class='add'>+TEST killall glusterd</div><div class='add'>+TEST glusterd</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/bugs/cli/bug-1087487.t b/tests/bugs/cli/bug-1087487.t<br/>new file mode 100755<br/>index 00000000000..0659ffab684<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/cli/bug-1087487.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/cli/bug-1087487.t</a></div><div class='hunk'>@@ -0,0 +1,23 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+function rebalance_start {</div><div class='add'>+         $CLI volume rebalance $1 start | head -1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/${V0}0 $H0:$B0/${V0}1</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+EXPECT "volume rebalance: $V0: success: Rebalance on $V0 has \</div><div class='add'>+been started successfully. Use rebalance status command to \</div><div class='add'>+check status of the rebalance process." rebalance_start $V0</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/cli/bug-1113476.t b/tests/bugs/cli/bug-1113476.t<br/>new file mode 100644<br/>index 00000000000..fc7dbca537d<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/cli/bug-1113476.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/cli/bug-1113476.t</a></div><div class='hunk'>@@ -0,0 +1,45 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+. $(dirname $0)/../../snapshot.rc</div><div class='add'>+</div><div class='add'>+function volinfo_validate ()</div><div class='add'>+{</div><div class='add'>+        local var=$1</div><div class='add'>+        $CLI volume info $V0 | grep "^$var" | sed 's/.*: //'</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST verify_lvm_version</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST setup_lvm 1</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 $H0:$L1</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+EXPECT '' volinfo_validate 'snap-max-hard-limit'</div><div class='add'>+EXPECT '' volinfo_validate 'snap-max-soft-limit'</div><div class='add'>+EXPECT '' volinfo_validate 'auto-delete'</div><div class='add'>+</div><div class='add'>+TEST $CLI snapshot config snap-max-hard-limit 100</div><div class='add'>+TEST $CLI snapshot config $V0 snap-max-hard-limit 50</div><div class='add'>+EXPECT '' volinfo_validate 'snap-max-hard-limit'</div><div class='add'>+EXPECT '' volinfo_validate 'snap-max-soft-limit'</div><div class='add'>+EXPECT '' volinfo_validate 'auto-delete'</div><div class='add'>+</div><div class='add'>+TEST $CLI snapshot config snap-max-soft-limit 50</div><div class='add'>+EXPECT '' volinfo_validate 'snap-max-hard-limit'</div><div class='add'>+EXPECT '' volinfo_validate 'snap-max-soft-limit'</div><div class='add'>+EXPECT '' volinfo_validate 'auto-delete'</div><div class='add'>+</div><div class='add'>+TEST $CLI snapshot config auto-delete enable</div><div class='add'>+EXPECT '' volinfo_validate 'snap-max-hard-limit'</div><div class='add'>+EXPECT '' volinfo_validate 'snap-max-soft-limit'</div><div class='add'>+EXPECT 'enable' volinfo_validate 'auto-delete'</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+</div><div class='head'>diff --git a/tests/bugs/cli/bug-1169302.c b/tests/bugs/cli/bug-1169302.c<br/>new file mode 100644<br/>index 00000000000..7c6b5fbf856<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/cli/bug-1169302.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/cli/bug-1169302.c</a></div><div class='hunk'>@@ -0,0 +1,79 @@</div><div class='add'>+#include &lt;errno.h&gt;</div><div class='add'>+#include &lt;stdio.h&gt;</div><div class='add'>+#include &lt;signal.h&gt;</div><div class='add'>+</div><div class='add'>+#include &lt;glusterfs/api/glfs.h&gt;</div><div class='add'>+#include &lt;glusterfs/api/glfs-handles.h&gt;</div><div class='add'>+</div><div class='add'>+int keep_running = 1;</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+stop_running(int sig)</div><div class='add'>+{</div><div class='add'>+    if (sig == SIGTERM)</div><div class='add'>+        keep_running = 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+main(int argc, char *argv[])</div><div class='add'>+{</div><div class='add'>+    glfs_t *fs = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    glfs_fd_t *fd = NULL;</div><div class='add'>+    char *filename = NULL;</div><div class='add'>+    char *logfile = NULL;</div><div class='add'>+    char *host = NULL;</div><div class='add'>+</div><div class='add'>+    if (argc != 5) {</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    host = argv[2];</div><div class='add'>+    logfile = argv[3];</div><div class='add'>+    filename = argv[4];</div><div class='add'>+</div><div class='add'>+    /* setup signal handler for exiting */</div><div class='add'>+    signal(SIGTERM, stop_running);</div><div class='add'>+</div><div class='add'>+    fs = glfs_new(argv[1]);</div><div class='add'>+    if (!fs) {</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = glfs_set_volfile_server(fs, "tcp", host, 24007);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = glfs_set_logging(fs, logfile, 7);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = glfs_init(fs);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    fd = glfs_creat(fs, filename, O_RDWR, 0644);</div><div class='add'>+    if (!fd) {</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* sleep until SIGTERM has been received */</div><div class='add'>+    while (keep_running) {</div><div class='add'>+        sleep(1);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = glfs_close(fd);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = glfs_fini(fs);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='head'>diff --git a/tests/bugs/cli/bug-1169302.t b/tests/bugs/cli/bug-1169302.t<br/>new file mode 100755<br/>index 00000000000..19660e033a8<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/cli/bug-1169302.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/cli/bug-1169302.t</a></div><div class='hunk'>@@ -0,0 +1,55 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+. $(dirname $0)/../../cluster.rc</div><div class='add'>+</div><div class='add'>+function check_peers {</div><div class='add'>+    $CLI_1 peer status | grep 'Peer in Cluster (Connected)' | wc -l</div><div class='add'>+}</div><div class='add'>+cleanup</div><div class='add'>+</div><div class='add'>+#setup cluster and test volume</div><div class='add'>+TEST launch_cluster 3; # start 3-node virtual cluster</div><div class='add'>+TEST $CLI_1 peer probe $H2; # peer probe server 2 from server 1 cli</div><div class='add'>+TEST $CLI_1 peer probe $H3; # peer probe server 3 from server 1 cli</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $PROBE_TIMEOUT 2 check_peers;</div><div class='add'>+</div><div class='add'>+TEST $CLI_1 volume create $V0 $H1:$B1/$V0 $H2:$B2/$V0 $H3:$B3/$V0</div><div class='add'>+TEST $CLI_1 volume start $V0</div><div class='add'>+</div><div class='add'>+# test CLI parameter acceptance</div><div class='add'>+TEST $CLI_1 volume statedump $V0</div><div class='add'>+TEST $CLI_2 volume statedump $V0</div><div class='add'>+TEST $CLI_3 volume statedump $V0</div><div class='add'>+TEST ! $CLI_1 volume statedump $V0 client $H2:0</div><div class='add'>+TEST ! $CLI_2 volume statedump $V0 client $H2:-1</div><div class='add'>+TEST $CLI_3 volume statedump $V0 client $H2:765</div><div class='add'>+TEST ! $CLI_1 volume statedump $V0 client $H2:</div><div class='add'>+TEST ! $CLI_2 volume statedump $V0 client</div><div class='add'>+TEST ! $CLI_3 volume statedump $V0 client $H2 $GFAPI_PID</div><div class='add'>+</div><div class='add'>+# build and run a gfapi appliction for triggering a statedump</div><div class='add'>+logdir=`gluster --print-logdir`</div><div class='add'>+STATEDUMP_TIMEOUT=60</div><div class='add'>+</div><div class='add'>+build_tester $(dirname $0)/bug-1169302.c -lgfapi</div><div class='add'>+$(dirname $0)/bug-1169302 $V0 $H1 $logdir/bug-1169302.log testfile &amp; GFAPI_PID=$!</div><div class='add'>+</div><div class='add'>+cleanup_statedump</div><div class='add'>+</div><div class='add'>+# Take the statedump of the process connected to $H1, it should match the</div><div class='add'>+# hostname or IP-address with the connection from the bug-1169302 executable.</div><div class='add'>+# In our CI it seems not possible to use $H0, 'localhost', $(hostname --fqdn)</div><div class='add'>+# or even "127.0.0.1"....</div><div class='add'>+sleep 2</div><div class='add'>+host=`netstat -nap | grep $GFAPI_PID | grep 24007 |  awk '{print $4}' | cut -d: -f1`</div><div class='add'>+TEST $CLI_3 volume statedump $V0 client $host:$GFAPI_PID</div><div class='add'>+EXPECT_WITHIN $STATEDUMP_TIMEOUT "Y" path_exists $statedumpdir/glusterdump.$GFAPI_PID*</div><div class='add'>+</div><div class='add'>+kill $GFAPI_PID</div><div class='add'>+</div><div class='add'>+cleanup_statedump</div><div class='add'>+cleanup_tester $(dirname $0)/bug-1169302</div><div class='add'>+cleanup
\ No newline at end of file</div><div class='head'>diff --git a/tests/bugs/cli/bug-1320388.t b/tests/bugs/cli/bug-1320388.t<br/>new file mode 100755<br/>index 00000000000..e719fc59033<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/cli/bug-1320388.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/cli/bug-1320388.t</a></div><div class='hunk'>@@ -0,0 +1,44 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+# This test enables management ssl and then test the</div><div class='add'>+# heal info command.</div><div class='add'>+</div><div class='add'>+for d in /etc/ssl /etc/openssl /usr/local/etc/openssl ; do</div><div class='add'>+        if test -d $d ; then</div><div class='add'>+                SSL_BASE=$d</div><div class='add'>+                break</div><div class='add'>+        fi</div><div class='add'>+done</div><div class='add'>+</div><div class='add'>+SSL_KEY=$SSL_BASE/glusterfs.key</div><div class='add'>+SSL_CERT=$SSL_BASE/glusterfs.pem</div><div class='add'>+SSL_CA=$SSL_BASE/glusterfs.ca</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+rm -f $SSL_BASE/glusterfs.*</div><div class='add'>+touch "$GLUSTERD_WORKDIR"/secure-access</div><div class='add'>+</div><div class='add'>+TEST openssl genrsa -out $SSL_KEY 2048</div><div class='add'>+TEST openssl req -new -x509 -key $SSL_KEY -subj /CN=Anyone -out $SSL_CERT</div><div class='add'>+ln $SSL_CERT $SSL_CA</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 disperse 6 redundancy 2 $H0:$B0/${V0}{0..5}</div><div class='add'>+TEST $CLI volume set $V0 disperse.eager-lock off</div><div class='add'>+TEST $CLI volume set $V0 disperse.other-eager-lock off</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+TEST glusterfs --entry-timeout=0 --attribute-timeout=0 -s $H0 --volfile-id $V0 $M0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "^6$" ec_child_up_count $V0 0</div><div class='add'>+touch $M0/a</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}5</div><div class='add'>+echo abc &gt; $M0/a</div><div class='add'>+EXPECT_WITHIN  $HEAL_TIMEOUT "^5$" get_pending_heal_count $V0 #One for each active brick</div><div class='add'>+$CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "^6$" ec_child_up_count $V0 0</div><div class='add'>+TEST gluster volume heal $V0 info</div><div class='add'>+EXPECT_WITHIN  $HEAL_TIMEOUT "^0$" get_pending_heal_count $V0 #One for each active brick</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/cli/bug-1353156-get-state-cli-validations.t b/tests/bugs/cli/bug-1353156-get-state-cli-validations.t<br/>new file mode 100644<br/>index 00000000000..a4556c9c997<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/cli/bug-1353156-get-state-cli-validations.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/cli/bug-1353156-get-state-cli-validations.t</a></div><div class='hunk'>@@ -0,0 +1,147 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+. $(dirname $0)/../../snapshot.rc</div><div class='add'>+. $(dirname $0)/../../traps.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+ODIR="/var/tmp/gdstates/"</div><div class='add'>+NOEXDIR="/var/tmp/gdstatesfoo/"</div><div class='add'>+</div><div class='add'>+function get_daemon_not_supported_part {</div><div class='add'>+        echo $1</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function get_usage_part {</div><div class='add'>+        echo $7</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function get_directory_doesnt_exist_part {</div><div class='add'>+        echo $1</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function get_parsing_arguments_part {</div><div class='add'>+        echo $1</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function positive_test {</div><div class='add'>+	local text=$("$@")</div><div class='add'>+	echo $text &gt; /dev/stderr</div><div class='add'>+	(echo -n $text | grep -qs ' state dumped to ') || return 1</div><div class='add'>+	local opath=$(echo -n $text | awk '{print $5}')</div><div class='add'>+	[ -r $opath ] || return 1</div><div class='add'>+	rm -f $opath</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST mkdir -p $ODIR</div><div class='add'>+</div><div class='add'>+push_trapfunc rm -rf $ODIR</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 disperse $H0:$B0/b1 $H0:$B0/b2 $H0:$B0/b3</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+TEST setup_lvm 1</div><div class='add'>+TEST $CLI volume create $V1 $H0:$L1;</div><div class='add'>+TEST $CLI volume start $V1</div><div class='add'>+</div><div class='add'>+TEST $CLI snapshot create ${V1}_snap $V1</div><div class='add'>+</div><div class='add'>+TEST positive_test $CLI get-state</div><div class='add'>+</div><div class='add'>+TEST positive_test $CLI get-state glusterd</div><div class='add'>+</div><div class='add'>+TEST ! $CLI get-state glusterfsd;</div><div class='add'>+ERRSTR=$($CLI get-state glusterfsd 2&gt;&amp;1 &gt;/dev/null);</div><div class='add'>+EXPECT 'glusterd' get_daemon_not_supported_part $ERRSTR;</div><div class='add'>+EXPECT 'Usage:' get_usage_part $ERRSTR;</div><div class='add'>+</div><div class='add'>+TEST positive_test $CLI get-state file gdstate</div><div class='add'>+</div><div class='add'>+TEST positive_test $CLI get-state glusterd file gdstate</div><div class='add'>+</div><div class='add'>+TEST ! $CLI get-state glusterfsd file gdstate;</div><div class='add'>+ERRSTR=$($CLI get-state glusterfsd file gdstate 2&gt;&amp;1 &gt;/dev/null);</div><div class='add'>+EXPECT 'glusterd' get_daemon_not_supported_part $ERRSTR;</div><div class='add'>+EXPECT 'Usage:' get_usage_part $ERRSTR;</div><div class='add'>+</div><div class='add'>+TEST positive_test $CLI get-state odir $ODIR</div><div class='add'>+</div><div class='add'>+TEST positive_test $CLI get-state glusterd odir $ODIR</div><div class='add'>+</div><div class='add'>+TEST positive_test $CLI get-state odir $ODIR file gdstate</div><div class='add'>+</div><div class='add'>+TEST positive_test $CLI get-state glusterd odir $ODIR file gdstate</div><div class='add'>+</div><div class='add'>+TEST positive_test $CLI get-state detail</div><div class='add'>+</div><div class='add'>+TEST positive_test $CLI get-state glusterd detail</div><div class='add'>+</div><div class='add'>+TEST positive_test $CLI get-state odir $ODIR detail</div><div class='add'>+</div><div class='add'>+TEST positive_test $CLI get-state glusterd odir $ODIR detail</div><div class='add'>+</div><div class='add'>+TEST positive_test $CLI get-state glusterd odir $ODIR file gdstate detail</div><div class='add'>+</div><div class='add'>+TEST positive_test $CLI get-state volumeoptions</div><div class='add'>+</div><div class='add'>+TEST positive_test $CLI get-state glusterd volumeoptions</div><div class='add'>+</div><div class='add'>+TEST positive_test $CLI get-state odir $ODIR volumeoptions</div><div class='add'>+</div><div class='add'>+TEST positive_test $CLI get-state glusterd odir $ODIR volumeoptions</div><div class='add'>+</div><div class='add'>+TEST positive_test $CLI get-state glusterd odir $ODIR file gdstate volumeoptions</div><div class='add'>+</div><div class='add'>+TEST ! $CLI get-state glusterfsd odir $ODIR;</div><div class='add'>+ERRSTR=$($CLI get-state glusterfsd odir $ODIR 2&gt;&amp;1 &gt;/dev/null);</div><div class='add'>+EXPECT 'glusterd' get_daemon_not_supported_part $ERRSTR;</div><div class='add'>+EXPECT 'Usage:' get_usage_part $ERRSTR;</div><div class='add'>+</div><div class='add'>+TEST ! $CLI get-state glusterfsd odir $ODIR file gdstate;</div><div class='add'>+ERRSTR=$($CLI get-state glusterfsd odir $ODIR file gdstate 2&gt;&amp;1 &gt;/dev/null);</div><div class='add'>+EXPECT 'glusterd' get_daemon_not_supported_part $ERRSTR;</div><div class='add'>+EXPECT 'Usage:' get_usage_part $ERRSTR;</div><div class='add'>+</div><div class='add'>+TEST ! $CLI get-state glusterfsd odir $NOEXDIR file gdstate;</div><div class='add'>+ERRSTR=$($CLI get-state glusterfsd odir $NOEXDIR file gdstate 2&gt;&amp;1 &gt;/dev/null);</div><div class='add'>+EXPECT 'glusterd' get_daemon_not_supported_part $ERRSTR;</div><div class='add'>+EXPECT 'Usage:' get_usage_part $ERRSTR;</div><div class='add'>+</div><div class='add'>+TEST ! $CLI get-state odir $NOEXDIR;</div><div class='add'>+ERRSTR=$($CLI get-state odir $NOEXDIR 2&gt;&amp;1 &gt;/dev/null);</div><div class='add'>+EXPECT 'Failed' get_directory_doesnt_exist_part $ERRSTR;</div><div class='add'>+</div><div class='add'>+TEST ! $CLI get-state odir $NOEXDIR file gdstate;</div><div class='add'>+ERRSTR=$($CLI get-state odir $NOEXDIR 2&gt;&amp;1 &gt;/dev/null);</div><div class='add'>+EXPECT 'Failed' get_directory_doesnt_exist_part $ERRSTR;</div><div class='add'>+</div><div class='add'>+TEST ! $CLI get-state foo bar;</div><div class='add'>+ERRSTR=$($CLI get-state foo bar 2&gt;&amp;1 &gt;/dev/null);</div><div class='add'>+EXPECT 'glusterd' get_daemon_not_supported_part $ERRSTR;</div><div class='add'>+EXPECT 'Usage:' get_usage_part $ERRSTR;</div><div class='add'>+</div><div class='add'>+TEST ! $CLI get-state glusterd foo bar;</div><div class='add'>+ERRSTR=$($CLI get-state glusterd foo bar 2&gt;&amp;1 &gt;/dev/null);</div><div class='add'>+EXPECT 'Problem' get_parsing_arguments_part $ERRSTR;</div><div class='add'>+</div><div class='add'>+TEST ! $CLI get-state glusterd detail file gdstate;</div><div class='add'>+ERRSTR=$($CLI get-state glusterd foo bar 2&gt;&amp;1 &gt;/dev/null);</div><div class='add'>+EXPECT 'Problem' get_parsing_arguments_part $ERRSTR;</div><div class='add'>+</div><div class='add'>+TEST ! $CLI get-state glusterd foo bar detail;</div><div class='add'>+ERRSTR=$($CLI get-state glusterd foo bar 2&gt;&amp;1 &gt;/dev/null);</div><div class='add'>+EXPECT 'Problem' get_parsing_arguments_part $ERRSTR;</div><div class='add'>+</div><div class='add'>+TEST ! $CLI get-state glusterd volumeoptions file gdstate;</div><div class='add'>+ERRSTR=$($CLI get-state glusterd foo bar 2&gt;&amp;1 &gt;/dev/null);</div><div class='add'>+EXPECT 'Problem' get_parsing_arguments_part $ERRSTR;</div><div class='add'>+</div><div class='add'>+TEST ! $CLI get-state glusterd foo bar volumeoptions;</div><div class='add'>+ERRSTR=$($CLI get-state glusterd foo bar 2&gt;&amp;1 &gt;/dev/null);</div><div class='add'>+EXPECT 'Problem' get_parsing_arguments_part $ERRSTR;</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/cli/bug-1378842-volume-get-all.t b/tests/bugs/cli/bug-1378842-volume-get-all.t<br/>new file mode 100644<br/>index 00000000000..be41f25b000<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/cli/bug-1378842-volume-get-all.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/cli/bug-1378842-volume-get-all.t</a></div><div class='hunk'>@@ -0,0 +1,23 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+</div><div class='add'>+TEST $CLI volume set all server-quorum-ratio 80</div><div class='add'>+</div><div class='add'>+# Execute volume get without having an explicit option, this should fail</div><div class='add'>+TEST ! $CLI volume get all</div><div class='add'>+</div><div class='add'>+# Execute volume get with an explicit global option</div><div class='add'>+TEST $CLI volume get all server-quorum-ratio</div><div class='add'>+EXPECT '80' volume_get_field all 'cluster.server-quorum-ratio'</div><div class='add'>+</div><div class='add'>+# Execute volume get with 'all'</div><div class='add'>+TEST $CLI volume get all all</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='head'>diff --git a/tests/bugs/cli/bug-764638.t b/tests/bugs/cli/bug-764638.t<br/>new file mode 100644<br/>index 00000000000..ffc613409d6<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/cli/bug-764638.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/cli/bug-764638.t</a></div><div class='hunk'>@@ -0,0 +1,13 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+</div><div class='add'>+TEST $CLI pool list;</div><div class='add'>+TEST $CLI pool list --xml;</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/cli/bug-822830.t b/tests/bugs/cli/bug-822830.t<br/>new file mode 100755<br/>index 00000000000..a9904854110<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/cli/bug-822830.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/cli/bug-822830.t</a></div><div class='hunk'>@@ -0,0 +1,64 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+## Start and create a volume</div><div class='add'>+TEST glusterd;</div><div class='add'>+TEST pidof glusterd;</div><div class='add'>+TEST $CLI volume create $V0 replica 3 $H0:$B0/${V0}{1,2,3,4,5,6};</div><div class='add'>+</div><div class='add'>+## Verify volume is is created</div><div class='add'>+EXPECT "$V0" volinfo_field $V0 'Volume Name';</div><div class='add'>+EXPECT 'Created' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+## Start volume and verify</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+EXPECT 'Started' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+## Setting nfs.rpc-auth-reject as 192.{}.1.2</div><div class='add'>+TEST ! $CLI volume set $V0 nfs.rpc-auth-reject 192.{}.1.2</div><div class='add'>+EXPECT '' volinfo_field $V0 'nfs.rpc-auth-reject';</div><div class='add'>+</div><div class='add'>+# Setting nfs.rpc-auth-allow as a.a.</div><div class='add'>+TEST ! $CLI volume set $V0 nfs.rpc-auth-allow a.a.</div><div class='add'>+EXPECT '' volinfo_field $V0 'nfs.rpc-auth-allow';</div><div class='add'>+</div><div class='add'>+## Setting nfs.rpc-auth-reject as 192.*..*</div><div class='add'>+TEST $CLI volume set $V0 nfs.rpc-auth-reject 192.*..*</div><div class='add'>+EXPECT '192.*..*' volinfo_field $V0 'nfs.rpc-auth-reject';</div><div class='add'>+</div><div class='add'>+# Setting nfs.rpc-auth-allow as a.a</div><div class='add'>+TEST $CLI volume set $V0 nfs.rpc-auth-allow a.a</div><div class='add'>+EXPECT 'a.a' volinfo_field $V0 'nfs.rpc-auth-allow';</div><div class='add'>+</div><div class='add'>+# Setting nfs.rpc-auth-allow as *.redhat.com</div><div class='add'>+TEST $CLI volume set $V0 nfs.rpc-auth-allow *.redhat.com</div><div class='add'>+EXPECT '\*.redhat.com' volinfo_field $V0 'nfs.rpc-auth-allow';</div><div class='add'>+</div><div class='add'>+# Setting nfs.rpc-auth-allow as 192.168.10.[1-5]</div><div class='add'>+TEST $CLI volume set $V0 nfs.rpc-auth-allow 192.168.10.[1-5]</div><div class='add'>+EXPECT '192.168.10.\[1-5]' volinfo_field $V0 'nfs.rpc-auth-allow';</div><div class='add'>+</div><div class='add'>+# Setting nfs.rpc-auth-allow as 192.168.70.?</div><div class='add'>+TEST $CLI volume set $V0 nfs.rpc-auth-allow 192.168.70.?</div><div class='add'>+EXPECT '192.168.70.?' volinfo_field $V0 'nfs.rpc-auth-allow';</div><div class='add'>+</div><div class='add'>+# Setting nfs.rpc-auth-reject as 192.168.10.5/16</div><div class='add'>+TEST $CLI volume set $V0 nfs.rpc-auth-reject 192.168.10.5/16</div><div class='add'>+EXPECT '192.168.10.5/16' volinfo_field $V0 'nfs.rpc-auth-reject';</div><div class='add'>+</div><div class='add'>+## Setting nfs.rpc-auth-reject as 192.*.*</div><div class='add'>+TEST $CLI volume set $V0 nfs.rpc-auth-reject 192.*.*</div><div class='add'>+EXPECT '192.*.*' volinfo_field $V0 'nfs.rpc-auth-reject';</div><div class='add'>+</div><div class='add'>+## Finish up</div><div class='add'>+TEST $CLI volume stop $V0;</div><div class='add'>+EXPECT 'Stopped' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+TEST $CLI volume delete $V0;</div><div class='add'>+TEST ! $CLI volume info $V0;</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/cli/bug-867252.t b/tests/bugs/cli/bug-867252.t<br/>new file mode 100644<br/>index 00000000000..ccc33d82a0f<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/cli/bug-867252.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/cli/bug-867252.t</a></div><div class='hunk'>@@ -0,0 +1,41 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume info;</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/${V0}1;</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+function volinfo_field()</div><div class='add'>+{</div><div class='add'>+    local vol=$1;</div><div class='add'>+    local field=$2;</div><div class='add'>+</div><div class='add'>+    $CLI volume info $vol | grep "^$field: " | sed 's/.*: //';</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+function brick_count()</div><div class='add'>+{</div><div class='add'>+    local vol=$1;</div><div class='add'>+</div><div class='add'>+    $CLI volume info $vol | egrep "^Brick[0-9]+: " | wc -l;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+EXPECT "$V0" volinfo_field $V0 'Volume Name';</div><div class='add'>+EXPECT 'Created' volinfo_field $V0 'Status';</div><div class='add'>+EXPECT '1' brick_count $V0</div><div class='add'>+</div><div class='add'>+TEST $CLI volume add-brick $V0 $H0:$B0/${V0}2;</div><div class='add'>+EXPECT '2' brick_count $V0</div><div class='add'>+</div><div class='add'>+TEST $CLI volume remove-brick $V0 $H0:$B0/${V0}2 force;</div><div class='add'>+EXPECT '1' brick_count $V0</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/cli/bug-921215.t b/tests/bugs/cli/bug-921215.t<br/>new file mode 100755<br/>index 00000000000..02532562cff<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/cli/bug-921215.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/cli/bug-921215.t</a></div><div class='hunk'>@@ -0,0 +1,13 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+# This is test case for bug no 921215 "Can not create volume with a . in the name"</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST ! $CLI volume create $V0.temp replica 2 $H0:$B0/${V0}0 $H0:$B0/${V0}1</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/cli/bug-949298.t b/tests/bugs/cli/bug-949298.t<br/>new file mode 100644<br/>index 00000000000..e0692f0c157<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/cli/bug-949298.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/cli/bug-949298.t</a></div><div class='hunk'>@@ -0,0 +1,12 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+</div><div class='add'>+TEST $CLI --xml volume info $V0</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/cli/bug-961307.t b/tests/bugs/cli/bug-961307.t<br/>new file mode 100644<br/>index 00000000000..602a6e34bce<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/cli/bug-961307.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/cli/bug-961307.t</a></div><div class='hunk'>@@ -0,0 +1,20 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+REPLICA=2</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 replica $REPLICA $H0:$B0/${V0}-00 $H0:$B0/${V0}-01 $H0:$B0/${V0}-10 $H0:$B0/${V0}-11</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+var1=$($CLI volume remove-brick $H0:$B0/${V0}-00 $H0:$B0/${V0}-01 start 2&gt;&amp;1)</div><div class='add'>+var2="volume remove-brick start: failed: Volume $H0:$B0/${V0}-00 does not exist"</div><div class='add'>+</div><div class='add'>+EXPECT "$var2" echo "$var1"</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/cli/bug-969193.t b/tests/bugs/cli/bug-969193.t<br/>new file mode 100755<br/>index 00000000000..dd6d7cdf100<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/cli/bug-969193.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/cli/bug-969193.t</a></div><div class='hunk'>@@ -0,0 +1,13 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+# Test that "system getspec" works without op_version problems.</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume info</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/brick1</div><div class='add'>+TEST $CLI system getspec $V0</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/cli/bug-977246.t b/tests/bugs/cli/bug-977246.t<br/>new file mode 100644<br/>index 00000000000..bb8d6328e8b<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/cli/bug-977246.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/cli/bug-977246.t</a></div><div class='hunk'>@@ -0,0 +1,21 @@</div><div class='add'>+#! /bin/bash</div><div class='add'>+</div><div class='add'>+# This test checks if address validation, correctly catches hostnames</div><div class='add'>+# with consective dots, such as 'example..org', as invalid</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/${V0}1</div><div class='add'>+TEST $CLI volume info $V0</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+TEST ! $CLI volume set $V0 auth.allow example..org</div><div class='add'>+</div><div class='add'>+TEST $CLI volume stop $V0</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/cli/bug-982174.t b/tests/bugs/cli/bug-982174.t<br/>new file mode 100644<br/>index 00000000000..067e5b97c17<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/cli/bug-982174.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/cli/bug-982174.t</a></div><div class='hunk'>@@ -0,0 +1,36 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+# Test to check</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+#Check if incorrect log-level keywords does not crash the CLI</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/brick1 $H0:$B0/brick2</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+function set_log_level_status {</div><div class='add'>+        local level=$1</div><div class='add'>+        $CLI volume set $V0 diagnostics.client-log-level $level 2&gt;&amp;1 |grep -oE 'success|failed'</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+LOG_LEVEL="trace"</div><div class='add'>+EXPECT "failed" set_log_level_status $LOG_LEVEL</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+LOG_LEVEL="error-gen"</div><div class='add'>+EXPECT "failed" set_log_level_status $LOG_LEVEL</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+LOG_LEVEL="TRACE"</div><div class='add'>+EXPECT "success" set_log_level_status $LOG_LEVEL</div><div class='add'>+</div><div class='add'>+EXPECT "$LOG_LEVEL" echo `$CLI volume info | grep diagnostics | awk '{print $2}'`</div><div class='add'>+</div><div class='add'>+TEST $CLI volume stop $V0;</div><div class='add'>+TEST $CLI volume delete $V0;</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/cli/bug-983317-volume-get.t b/tests/bugs/cli/bug-983317-volume-get.t<br/>new file mode 100644<br/>index 00000000000..c793bbc9f0c<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/cli/bug-983317-volume-get.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/cli/bug-983317-volume-get.t</a></div><div class='hunk'>@@ -0,0 +1,45 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/${V0}{1,2};</div><div class='add'>+EXPECT 'Created' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+# Set a volume option</div><div class='add'>+TEST $CLI volume set $V0 open-behind on</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+TEST $CLI volume set all server-quorum-ratio 80</div><div class='add'>+</div><div class='add'>+TEST $CLI volume set $V0 user.metadata 'dummy'</div><div class='add'>+</div><div class='add'>+# Execute volume get without having an explicit option, this should fail</div><div class='add'>+TEST ! $CLI volume get $V0</div><div class='add'>+</div><div class='add'>+# Execute volume get with an explicit option</div><div class='add'>+TEST $CLI volume get $V0 open-behind</div><div class='add'>+EXPECT 'on' volume_get_field $V0 'open-behind'</div><div class='add'>+</div><div class='add'>+# Execute volume get with 'all"</div><div class='add'>+TEST $CLI volume get $V0 all</div><div class='add'>+</div><div class='add'>+# Check if volume get can display correct global options values as well</div><div class='add'>+EXPECT '80' volume_get_field $V0 'server-quorum-ratio'</div><div class='add'>+</div><div class='add'>+# Check user.* options can also be retrived using volume get</div><div class='add'>+EXPECT 'dummy' volume_get_field $V0 'user.metadata'</div><div class='add'>+</div><div class='add'>+TEST $CLI volume set all brick-multiplex enable</div><div class='add'>+EXPECT 'enable' volume_get_field $V0 'brick-multiplex'</div><div class='add'>+</div><div class='add'>+TEST $CLI volume set all brick-multiplex disable</div><div class='add'>+EXPECT 'disable' volume_get_field $V0 'brick-multiplex'</div><div class='add'>+</div><div class='add'>+#setting an cluster level option for single volume should fail</div><div class='add'>+TEST ! $CLI volume set $V0 brick-multiplex enable</div><div class='add'>+</div><div class='head'>diff --git a/tests/bugs/core/949327.t b/tests/bugs/core/949327.t<br/>new file mode 100644<br/>index 00000000000..6b8033a5c85<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/core/949327.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/core/949327.t</a></div><div class='hunk'>@@ -0,0 +1,23 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+function tmp_file_count()</div><div class='add'>+{</div><div class='add'>+    echo $(ls -lh /tmp/tmp.* 2&gt;/dev/null |  wc -l)</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+old_count=$(tmp_file_count);</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 replica 2 $H0:$B0/${V0}0 $H0:$B0/${V0}1</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+new_count=$(tmp_file_count);</div><div class='add'>+</div><div class='add'>+TEST [ "$old_count" -eq "$new_count" ]</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/bugs/core/brick-mux-fd-cleanup.t b/tests/bugs/core/brick-mux-fd-cleanup.t<br/>new file mode 100644<br/>index 00000000000..de11c177b8a<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/core/brick-mux-fd-cleanup.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/core/brick-mux-fd-cleanup.t</a></div><div class='hunk'>@@ -0,0 +1,78 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+#This .t tests that the fds from client are closed on brick when gluster volume</div><div class='add'>+#stop is executed in brick-mux setup.</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+</div><div class='add'>+function keep_fd_open {</div><div class='add'>+#This function has to be run as background job because opening the fd in</div><div class='add'>+#foreground and running commands is leading to flush calls on these fds</div><div class='add'>+#which is making it very difficult to create the race where fds will be left</div><div class='add'>+#open even after the brick dies.</div><div class='add'>+    exec 5&gt;$M1/a</div><div class='add'>+    exec 6&gt;$M1/b</div><div class='add'>+    while [ -f $M0/a ]; do sleep 1; done</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function count_open_files {</div><div class='add'>+    local brick_pid="$1"</div><div class='add'>+    local pattern="$2"</div><div class='add'>+    ls -l /proc/$brick_pid/fd | grep -i "$pattern" | wc -l</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+TEST $CLI volume set all cluster.brick-multiplex on</div><div class='add'>+TEST $CLI volume create $V0 replica 2 $H0:$B0/${V0}{0,1}</div><div class='add'>+TEST $CLI volume create $V1 replica 2 $H0:$B0/${V1}{2,3}</div><div class='add'>+#Have same configuration on both bricks so that they are multiplexed</div><div class='add'>+#Delay flush fop for a second</div><div class='add'>+TEST $CLI volume heal $V0 disable</div><div class='add'>+TEST $CLI volume heal $V1 disable</div><div class='add'>+TEST $CLI volume set $V0 delay-gen posix</div><div class='add'>+TEST $CLI volume set $V0 delay-gen.enable flush</div><div class='add'>+TEST $CLI volume set $V0 delay-gen.delay-percentage 100</div><div class='add'>+TEST $CLI volume set $V0 delay-gen.delay-duration 1000000</div><div class='add'>+TEST $CLI volume set $V1 delay-gen posix</div><div class='add'>+TEST $CLI volume set $V1 delay-gen.enable flush</div><div class='add'>+TEST $CLI volume set $V1 delay-gen.delay-percentage 100</div><div class='add'>+TEST $CLI volume set $V1 delay-gen.delay-duration 1000000</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+TEST $CLI volume start $V1</div><div class='add'>+</div><div class='add'>+TEST $GFS -s $H0 --volfile-id=$V0 --direct-io-mode=enable $M0</div><div class='add'>+TEST $GFS -s $H0 --volfile-id=$V1 --direct-io-mode=enable $M1</div><div class='add'>+</div><div class='add'>+TEST touch $M0/a</div><div class='add'>+keep_fd_open &amp;</div><div class='add'>+TEST $CLI volume profile $V1 start</div><div class='add'>+brick_pid=$(get_brick_pid $V1 $H0 $B0/${V1}2)</div><div class='add'>+TEST count_open_files $brick_pid "$B0/${V1}2/a"</div><div class='add'>+TEST count_open_files $brick_pid "$B0/${V1}2/b"</div><div class='add'>+TEST count_open_files $brick_pid "$B0/${V1}3/a"</div><div class='add'>+TEST count_open_files $brick_pid "$B0/${V1}3/b"</div><div class='add'>+</div><div class='add'>+#If any other flush fops are introduced into the system other than the one at</div><div class='add'>+#cleanup it interferes with the race, so test for it</div><div class='add'>+EXPECT "^0$" echo "$($CLI volume profile $V1 info incremental | grep -i flush | wc -l)"</div><div class='add'>+#Stop the volume</div><div class='add'>+TEST $CLI volume stop $V1</div><div class='add'>+</div><div class='add'>+#Wait for cleanup resources or volume V1</div><div class='add'>+EXPECT_WITHIN $GRAPH_SWITCH_TIMEOUT "^0$" count_open_files $brick_pid "$B0/${V1}2/a"</div><div class='add'>+EXPECT_WITHIN $GRAPH_SWITCH_TIMEOUT "^0$" count_open_files $brick_pid "$B0/${V1}2/b"</div><div class='add'>+EXPECT_WITHIN $GRAPH_SWITCH_TIMEOUT "^0$" count_open_files $brick_pid "$B0/${V1}3/a"</div><div class='add'>+EXPECT_WITHIN $GRAPH_SWITCH_TIMEOUT "^0$" count_open_files $brick_pid "$B0/${V1}3/b"</div><div class='add'>+</div><div class='add'>+TEST rm -f $M0/a #Exit keep_fd_open()</div><div class='add'>+wait</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M1</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/bugs/core/bug-1110917.t b/tests/bugs/core/bug-1110917.t<br/>new file mode 100644<br/>index 00000000000..c4b04fbf2c7<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/core/bug-1110917.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/core/bug-1110917.t</a></div><div class='hunk'>@@ -0,0 +1,39 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/brick1 $H0:$B0/brick2;</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+</div><div class='add'>+TEST glusterfs --volfile-id=/$V0 --volfile-server=$H0 $M0 --attribute-timeout=0 --entry-timeout=0</div><div class='add'>+</div><div class='add'>+TEST $CLI volume set $V0 changelog on</div><div class='add'>+TEST $CLI volume set $V0 changelog.fsync-interval 1</div><div class='add'>+</div><div class='add'>+# perform I/O on the background</div><div class='add'>+f=$(basename `mktemp -t ${0##*/}.XXXXXX`)</div><div class='add'>+dd if=/dev/urandom of=$M0/$f count=100000 bs=4k &amp;</div><div class='add'>+</div><div class='add'>+# this is the best we can do without inducing _error points_ in the code</div><div class='add'>+# without the patch reconfigre() would hang...</div><div class='add'>+TEST $CLI volume set $V0 changelog.rollover-time `expr $((RANDOM % 9)) + 1`</div><div class='add'>+TEST $CLI volume set $V0 changelog.rollover-time `expr $((RANDOM % 9)) + 1`</div><div class='add'>+</div><div class='add'>+TEST $CLI volume set $V0 changelog off</div><div class='add'>+TEST $CLI volume set $V0 changelog on</div><div class='add'>+TEST $CLI volume set $V0 changelog off</div><div class='add'>+TEST $CLI volume set $V0 changelog on</div><div class='add'>+</div><div class='add'>+TEST $CLI volume set $V0 changelog.rollover-time `expr $((RANDOM % 9)) + 1`</div><div class='add'>+TEST $CLI volume set $V0 changelog.rollover-time `expr $((RANDOM % 9)) + 1`</div><div class='add'>+</div><div class='add'>+# if there's a deadlock, this would hang</div><div class='add'>+wait;</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/core/bug-1111557.t b/tests/bugs/core/bug-1111557.t<br/>new file mode 100644<br/>index 00000000000..4ed45761bce<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/core/bug-1111557.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/core/bug-1111557.t</a></div><div class='hunk'>@@ -0,0 +1,12 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/${V0}{0}</div><div class='add'>+TEST $CLI volume set $V0 diagnostics.brick-log-buf-size 0</div><div class='add'>+TEST ! $CLI volume set $V0 diagnostics.brick-log-buf-size -0</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/bugs/core/bug-1117951.t b/tests/bugs/core/bug-1117951.t<br/>new file mode 100644<br/>index 00000000000..b484fee2fe4<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/core/bug-1117951.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/core/bug-1117951.t</a></div><div class='hunk'>@@ -0,0 +1,24 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/brick</div><div class='add'>+EXPECT 'Created' volinfo_field $V0 'Status';</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+# Running with a locale not using '.' as decimal separator should work</div><div class='add'>+export LC_NUMERIC=sv_SE.utf8</div><div class='add'>+TEST glusterfs --volfile-id=$V0 --volfile-server=$H0 $M0</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+</div><div class='add'>+# As should a locale using '.' as a decimal separator</div><div class='add'>+export LC_NUMERIC=C</div><div class='add'>+TEST glusterfs --volfile-id=$V0 --volfile-server=$H0 $M0</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/bugs/core/bug-1119582.t b/tests/bugs/core/bug-1119582.t<br/>new file mode 100644<br/>index 00000000000..c30057c2b2c<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/core/bug-1119582.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/core/bug-1119582.t</a></div><div class='hunk'>@@ -0,0 +1,24 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+. $(dirname $0)/../../fileio.rc</div><div class='add'>+. $(dirname $0)/../../nfs.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd;</div><div class='add'>+</div><div class='add'>+TEST pidof glusterd;</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/${V0}0 $H0:$B0/${V0}1</div><div class='add'>+</div><div class='add'>+TEST $CLI volume set $V0 features.uss disable;</div><div class='add'>+</div><div class='add'>+TEST killall glusterd;</div><div class='add'>+</div><div class='add'>+rm -f $GLUSTERD_WORKDIR/vols/$V0/snapd.info</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+</div><div class='add'>+cleanup  ;</div><div class='head'>diff --git a/tests/bugs/core/bug-1135514-allow-setxattr-with-null-value.t b/tests/bugs/core/bug-1135514-allow-setxattr-with-null-value.t<br/>new file mode 100644<br/>index 00000000000..d26aa561321<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/core/bug-1135514-allow-setxattr-with-null-value.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/core/bug-1135514-allow-setxattr-with-null-value.t</a></div><div class='hunk'>@@ -0,0 +1,18 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+#Test</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/${V0}0</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+TEST glusterfs --volfile-id=/$V0 --volfile-server=$H0 $M0 --attribute-timeout=0 --entry-timeout=0</div><div class='add'>+TEST touch $M0/file</div><div class='add'>+TEST setfattr -n user.attribute1 $M0/file</div><div class='add'>+TEST getfattr -n user.attribute1 $M0/file</div><div class='add'>+cleanup</div><div class='add'>+</div><div class='head'>diff --git a/tests/bugs/core/bug-1168803-snapd-option-validation-fix.t b/tests/bugs/core/bug-1168803-snapd-option-validation-fix.t<br/>new file mode 100755<br/>index 00000000000..89b015d6374<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/core/bug-1168803-snapd-option-validation-fix.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/core/bug-1168803-snapd-option-validation-fix.t</a></div><div class='hunk'>@@ -0,0 +1,30 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+## Test case for BZ-1168803 - snapd option validation should not fail if the</div><div class='add'>+#snapd is not running</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+## Start glusterd</div><div class='add'>+TEST glusterd;</div><div class='add'>+TEST pidof glusterd;</div><div class='add'>+</div><div class='add'>+## create volume</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/${V0}{1,2};</div><div class='add'>+TEST $CLI volume set $V0 features.uss enable</div><div class='add'>+</div><div class='add'>+## Now set another volume option, this should not fail</div><div class='add'>+TEST $CLI volume set $V0 performance.io-cache off</div><div class='add'>+</div><div class='add'>+## start the volume</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+## Kill snapd daemon and then try to stop the volume which should not fail</div><div class='add'>+kill $(ps aux | grep glusterfsd | grep snapd | awk '{print $2}')</div><div class='add'>+</div><div class='add'>+TEST $CLI volume stop $V0</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/core/bug-1402841.t-mt-dir-scan-race.t b/tests/bugs/core/bug-1402841.t-mt-dir-scan-race.t<br/>new file mode 100755<br/>index 00000000000..a1b9a851bf7<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/core/bug-1402841.t-mt-dir-scan-race.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/core/bug-1402841.t-mt-dir-scan-race.t</a></div><div class='hunk'>@@ -0,0 +1,42 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+FILE_COUNT=500</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 replica 2 $H0:$B0/${V0}{0,1}</div><div class='add'>+TEST $CLI volume set $V0 self-heal-daemon off</div><div class='add'>+TEST $CLI volume set $V0 cluster.shd-wait-qlength 100</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+TEST glusterfs --volfile-id=$V0 --volfile-server=$H0 $M0;</div><div class='add'>+for i in `seq 1 $FILE_COUNT`;  do touch $M0/file$i; done</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}1</div><div class='add'>+for i in `seq 1 $FILE_COUNT`; do echo hello&gt;$M0/file$i; chmod -x $M0/file$i; done</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status $V0 $H0 $B0/${V0}1</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 1</div><div class='add'>+</div><div class='add'>+EXPECT "$FILE_COUNT" get_pending_heal_count $V0</div><div class='add'>+TEST $CLI volume set $V0 self-heal-daemon on</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "Y" glustershd_up_status</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 1</div><div class='add'>+</div><div class='add'>+TEST $CLI volume heal $V0</div><div class='add'>+TEST $CLI volume set $V0 self-heal-daemon off</div><div class='add'>+EXPECT_NOT "^0$" get_pending_heal_count $V0</div><div class='add'>+TEST $CLI volume set $V0 self-heal-daemon on</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "Y" glustershd_up_status</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 1</div><div class='add'>+</div><div class='add'>+TEST $CLI volume heal $V0</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "^0$" get_pending_heal_count $V0</div><div class='add'>+TEST umount $M0</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/core/bug-1421721-mpx-toggle.t b/tests/bugs/core/bug-1421721-mpx-toggle.t<br/>new file mode 100644<br/>index 00000000000..231be5b81a0<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/core/bug-1421721-mpx-toggle.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/core/bug-1421721-mpx-toggle.t</a></div><div class='hunk'>@@ -0,0 +1,25 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+write_a_file () {</div><div class='add'>+	echo $1 &gt; $2</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/${V0}[0,1]</div><div class='add'>+</div><div class='add'>+TEST $CLI volume set all cluster.brick-multiplex on</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+TEST $GFS -s $H0 --volfile-id=$V0 $M0</div><div class='add'>+TEST write_a_file "hello" $M0/a_file</div><div class='add'>+</div><div class='add'>+TEST force_umount $M0</div><div class='add'>+TEST $CLI volume stop $V0</div><div class='add'>+</div><div class='add'>+TEST $CLI volume set all cluster.brick-multiplex off</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/bugs/core/bug-1432542-mpx-restart-crash.t b/tests/bugs/core/bug-1432542-mpx-restart-crash.t<br/>new file mode 100644<br/>index 00000000000..2793d7008e1<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/core/bug-1432542-mpx-restart-crash.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/core/bug-1432542-mpx-restart-crash.t</a></div><div class='hunk'>@@ -0,0 +1,116 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+SCRIPT_TIMEOUT=800</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+. $(dirname $0)/../../traps.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+NUM_VOLS=15</div><div class='add'>+MOUNT_BASE=$(dirname $M0)</div><div class='add'>+</div><div class='add'>+# GlusterD reports that bricks are started when in fact their attach requests</div><div class='add'>+# might still need to be retried.  That's a bit of a hack, but there's no</div><div class='add'>+# feasible way to wait at that point (in attach_brick) and the rest of the</div><div class='add'>+# code is unprepared to deal with transient errors so the whole "brick start"</div><div class='add'>+# would fail.  Meanwhile, glusterfsd can only handle attach requests at a</div><div class='add'>+# rather slow rate.  After GlusterD tries to start a couple of hundred bricks,</div><div class='add'>+# glusterfsd can fall behind and we start getting mount failures.  Arguably,</div><div class='add'>+# those are spurious because we will eventually catch up.  We're just not</div><div class='add'>+# ready *yet*.  More to the point, even if the errors aren't spurious that's</div><div class='add'>+# not what we're testing right now.  Therefore, we give glusterfsd a bit more</div><div class='add'>+# breathing room for this test than we would otherwise.</div><div class='add'>+MOUNT_TIMEOUT=15</div><div class='add'>+</div><div class='add'>+get_brick_base () {</div><div class='add'>+	printf "%s/vol%02d" $B0 $1</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+get_mount_point () {</div><div class='add'>+	printf "%s/vol%02d" $MOUNT_BASE $1</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function count_up_bricks {</div><div class='add'>+        vol=$1;</div><div class='add'>+        $CLI --xml volume status $vol | grep '&lt;status&gt;1' | wc -l</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+create_volume () {</div><div class='add'>+</div><div class='add'>+	local vol_name=$(printf "%s-vol%02d" $V0 $1)</div><div class='add'>+</div><div class='add'>+	local brick_base=$(get_brick_base $1)</div><div class='add'>+	local cmd="$CLI volume create $vol_name replica 3"</div><div class='add'>+	local b</div><div class='add'>+	for b in $(seq 0 5); do</div><div class='add'>+		local this_brick=${brick_base}/brick$b</div><div class='add'>+		mkdir -p $this_brick</div><div class='add'>+		cmd="$cmd $H0:$this_brick"</div><div class='add'>+	done</div><div class='add'>+	TEST $cmd</div><div class='add'>+	TEST $CLI volume start $vol_name</div><div class='add'>+	# check for 6 bricks and 1 shd daemon to be up and running</div><div class='add'>+        EXPECT_WITHIN 120 7 count_up_bricks $vol_name</div><div class='add'>+	local mount_point=$(get_mount_point $1)</div><div class='add'>+	mkdir -p $mount_point</div><div class='add'>+	TEST $GFS -s $H0 --volfile-id=$vol_name $mount_point</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+cleanup_func () {</div><div class='add'>+	local v</div><div class='add'>+	for v in $(seq 1 $NUM_VOLS); do</div><div class='add'>+		local mount_point=$(get_mount_point $v)</div><div class='add'>+		force_umount $mount_point</div><div class='add'>+		rm -rf $mount_point</div><div class='add'>+		local vol_name=$(printf "%s-vol%02d" $V0 $v)</div><div class='add'>+		$CLI volume stop $vol_name</div><div class='add'>+		$CLI volume delete $vol_name</div><div class='add'>+		rm -rf $(get_brick_base $1) &amp;</div><div class='add'>+	done &amp;&gt; /dev/null</div><div class='add'>+	wait</div><div class='add'>+}</div><div class='add'>+push_trapfunc cleanup_func</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST $CLI volume set all cluster.brick-multiplex on</div><div class='add'>+</div><div class='add'>+# Our infrastructure can't handle an arithmetic expression here.  The formula</div><div class='add'>+# is (NUM_VOLS-1)*5 because it sees each TEST/EXPECT once but needs the other</div><div class='add'>+# NUM_VOLS-1 and there are 5 such statements in each iteration.</div><div class='add'>+TESTS_EXPECTED_IN_LOOP=84</div><div class='add'>+for i in $(seq 1 $NUM_VOLS); do</div><div class='add'>+        starttime="$(date +%s)";</div><div class='add'>+</div><div class='add'>+	create_volume $i</div><div class='add'>+	TEST dd if=/dev/zero of=$(get_mount_point $i)/a_file bs=4k count=1</div><div class='add'>+        # Unmounting to reduce memory footprint on regression hosts</div><div class='add'>+        mnt_point=$(get_mount_point $i)</div><div class='add'>+        EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $mnt_point</div><div class='add'>+        endtime=$(expr $(date +%s) - $starttime)</div><div class='add'>+</div><div class='add'>+        echo "Memory Used after $i volumes : $(pmap -x $(pgrep glusterfsd) | grep total)"</div><div class='add'>+        echo "Thread Count after $i volumes: $(ps -T -p $(pgrep glusterfsd) | wc -l)"</div><div class='add'>+        echo "Time taken                   : ${endtime} seconds"</div><div class='add'>+done</div><div class='add'>+</div><div class='add'>+echo "=========="</div><div class='add'>+echo "List of all the threads in the Brick process"</div><div class='add'>+ps -T -p $(pgrep glusterfsd)</div><div class='add'>+echo "=========="</div><div class='add'>+</div><div class='add'>+# Kill glusterd, and wait a bit for all traces to disappear.</div><div class='add'>+TEST killall -9 glusterd</div><div class='add'>+sleep 5</div><div class='add'>+TEST killall -9 glusterfsd</div><div class='add'>+sleep 5</div><div class='add'>+</div><div class='add'>+# Restart glusterd.  This is where the brick daemon supposedly dumps core,</div><div class='add'>+# though I (jdarcy) have yet to see that.  Again, give it a while to settle,</div><div class='add'>+# just to be sure.</div><div class='add'>+TEST glusterd</div><div class='add'>+</div><div class='add'>+cleanup_func</div><div class='add'>+trap - EXIT</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/bugs/core/bug-1650403.t b/tests/bugs/core/bug-1650403.t<br/>new file mode 100644<br/>index 00000000000..43d09bc8bd9<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/core/bug-1650403.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/core/bug-1650403.t</a></div><div class='hunk'>@@ -0,0 +1,113 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+SCRIPT_TIMEOUT=500</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+. $(dirname $0)/../../traps.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+NUM_VOLS=5</div><div class='add'>+MOUNT_BASE=$(dirname $M0)</div><div class='add'>+</div><div class='add'>+# GlusterD reports that bricks are started when in fact their attach requests</div><div class='add'>+# might still need to be retried.  That's a bit of a hack, but there's no</div><div class='add'>+# feasible way to wait at that point (in attach_brick) and the rest of the</div><div class='add'>+# code is unprepared to deal with transient errors so the whole "brick start"</div><div class='add'>+# would fail.  Meanwhile, glusterfsd can only handle attach requests at a</div><div class='add'>+# rather slow rate.  After GlusterD tries to start a couple of hundred bricks,</div><div class='add'>+# glusterfsd can fall behind and we start getting mount failures.  Arguably,</div><div class='add'>+# those are spurious because we will eventually catch up.  We're just not</div><div class='add'>+# ready *yet*.  More to the point, even if the errors aren't spurious that's</div><div class='add'>+# not what we're testing right now.  Therefore, we give glusterfsd a bit more</div><div class='add'>+# breathing room for this test than we would otherwise.</div><div class='add'>+MOUNT_TIMEOUT=15</div><div class='add'>+</div><div class='add'>+get_brick_base () {</div><div class='add'>+	printf "%s/vol%02d" $B0 $1</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+get_mount_point () {</div><div class='add'>+	printf "%s/vol%02d" $MOUNT_BASE $1</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function count_up_bricks {</div><div class='add'>+        vol=$1;</div><div class='add'>+        $CLI --xml volume status $vol | grep '&lt;status&gt;1' | wc -l</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+create_volume () {</div><div class='add'>+</div><div class='add'>+	local vol_name=$(printf "%s-vol%02d" $V0 $1)</div><div class='add'>+</div><div class='add'>+	local brick_base=$(get_brick_base $1)</div><div class='add'>+	local cmd="$CLI volume create $vol_name replica 3"</div><div class='add'>+	local b</div><div class='add'>+	for b in $(seq 0 5); do</div><div class='add'>+		local this_brick=${brick_base}/brick$b</div><div class='add'>+		mkdir -p $this_brick</div><div class='add'>+		cmd="$cmd $H0:$this_brick"</div><div class='add'>+	done</div><div class='add'>+	TEST $cmd</div><div class='add'>+	TEST $CLI volume start $vol_name</div><div class='add'>+	# check for 6 bricks and 1 shd daemon to be up and running</div><div class='add'>+        EXPECT_WITHIN 120 7 count_up_bricks $vol_name</div><div class='add'>+	local mount_point=$(get_mount_point $1)</div><div class='add'>+	mkdir -p $mount_point</div><div class='add'>+	TEST $GFS -s $H0 --volfile-id=$vol_name $mount_point</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+cleanup_func () {</div><div class='add'>+	local v</div><div class='add'>+	for v in $(seq 1 $NUM_VOLS); do</div><div class='add'>+		local mount_point=$(get_mount_point $v)</div><div class='add'>+		force_umount $mount_point</div><div class='add'>+		rm -rf $mount_point</div><div class='add'>+		local vol_name=$(printf "%s-vol%02d" $V0 $v)</div><div class='add'>+		$CLI volume stop $vol_name</div><div class='add'>+		$CLI volume delete $vol_name</div><div class='add'>+		rm -rf $(get_brick_base $1) &amp;</div><div class='add'>+	done &amp;&gt; /dev/null</div><div class='add'>+	wait</div><div class='add'>+}</div><div class='add'>+push_trapfunc cleanup_func</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST $CLI volume set all cluster.brick-multiplex on</div><div class='add'>+</div><div class='add'>+# Our infrastructure can't handle an arithmetic expression here.  The formula</div><div class='add'>+# is (NUM_VOLS-1)*5 because it sees each TEST/EXPECT once but needs the other</div><div class='add'>+# NUM_VOLS-1 and there are 5 such statements in each iteration.</div><div class='add'>+TESTS_EXPECTED_IN_LOOP=24</div><div class='add'>+for i in $(seq 1 $NUM_VOLS); do</div><div class='add'>+	create_volume $i</div><div class='add'>+	TEST dd if=/dev/zero of=$(get_mount_point $i)/a_file bs=4k count=1</div><div class='add'>+        # Unmounting to reduce memory footprint on regression hosts</div><div class='add'>+        mnt_point=$(get_mount_point $i)</div><div class='add'>+        EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $mnt_point</div><div class='add'>+done</div><div class='add'>+</div><div class='add'>+glustershd_pid=`ps auxwww | grep glustershd | grep -v grep | awk -F " " '{print $2}'`</div><div class='add'>+TEST [ $glustershd_pid != 0 ]</div><div class='add'>+start=`pmap -x $glustershd_pid | grep total | awk -F " " '{print $4}'`</div><div class='add'>+echo "Memory consumption for glustershd process"</div><div class='add'>+for i in $(seq 1 50); do</div><div class='add'>+        pmap -x $glustershd_pid | grep total</div><div class='add'>+        for j in $(seq 1 $NUM_VOLS); do</div><div class='add'>+                vol_name=$(printf "%s-vol%02d" $V0 $j)</div><div class='add'>+                gluster v set $vol_name cluster.self-heal-daemon off &gt; /dev/null</div><div class='add'>+                gluster v set $vol_name cluster.self-heal-daemon on  &gt; /dev/null</div><div class='add'>+        done</div><div class='add'>+done</div><div class='add'>+</div><div class='add'>+end=`pmap -x $glustershd_pid | grep total | awk -F " " '{print $4}'`</div><div class='add'>+diff=$((end-start))</div><div class='add'>+</div><div class='add'>+# If memory consumption is more than 10M it means some leak in reconfigure</div><div class='add'>+# code path</div><div class='add'>+</div><div class='add'>+TEST [ $diff -lt 10000 ]</div><div class='add'>+</div><div class='add'>+trap - EXIT</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/bugs/core/bug-1699025-brick-mux-detach-brick-fd-issue.t b/tests/bugs/core/bug-1699025-brick-mux-detach-brick-fd-issue.t<br/>new file mode 100644<br/>index 00000000000..1acbaa8dc0b<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/core/bug-1699025-brick-mux-detach-brick-fd-issue.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/core/bug-1699025-brick-mux-detach-brick-fd-issue.t</a></div><div class='hunk'>@@ -0,0 +1,33 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+. $(dirname $0)/../../cluster.rc</div><div class='add'>+</div><div class='add'>+function count_brick_processes {</div><div class='add'>+        pgrep glusterfsd | wc -l</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='add'>+</div><div class='add'>+#bug-1444596 - validating brick mux</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/brick{0,1}</div><div class='add'>+TEST $CLI volume create $V1 $H0:$B0/brick{2,3}</div><div class='add'>+</div><div class='add'>+TEST $CLI volume set all cluster.brick-multiplex on</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+TEST $CLI volume start $V1</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT 4 online_brick_count</div><div class='add'>+EXPECT 1 count_brick_processes</div><div class='add'>+</div><div class='add'>+TEST $CLI volume stop $V1</div><div class='add'>+# At the time initialize brick daemon it always keeps open</div><div class='add'>+# standard fd's (0, 1 , 2) so after stop 1 volume fd's should</div><div class='add'>+# be open</div><div class='add'>+nofds=$(ls -lrth /proc/`pgrep glusterfsd`/fd | grep dev/null | wc -l)</div><div class='add'>+TEST [ $((nofds)) -eq 3 ]</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/bugs/core/bug-834465.c b/tests/bugs/core/bug-834465.c<br/>new file mode 100644<br/>index 00000000000..33dd270b112<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/core/bug-834465.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/core/bug-834465.c</a></div><div class='hunk'>@@ -0,0 +1,60 @@</div><div class='add'>+#include &lt;sys/file.h&gt;</div><div class='add'>+#include &lt;stdio.h&gt;</div><div class='add'>+#include &lt;string.h&gt;</div><div class='add'>+#include &lt;errno.h&gt;</div><div class='add'>+#include &lt;sys/types.h&gt;</div><div class='add'>+#include &lt;sys/stat.h&gt;</div><div class='add'>+#include &lt;fcntl.h&gt;</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+main(int argc, char *argv[])</div><div class='add'>+{</div><div class='add'>+    int fd = -1;</div><div class='add'>+    char *filename = NULL;</div><div class='add'>+    struct flock lock = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int i = 0;</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    if (argc != 2) {</div><div class='add'>+        fprintf(stderr, "Usage: %s &lt;filename&gt; ", argv[0]);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    filename = argv[1];</div><div class='add'>+</div><div class='add'>+    fd = open(filename, O_RDWR | O_CREAT, 0);</div><div class='add'>+    if (fd &lt; 0) {</div><div class='add'>+        fprintf(stderr, "open (%s) failed (%s)\n", filename, strerror(errno));</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    lock.l_type = F_WRLCK;</div><div class='add'>+    lock.l_whence = SEEK_SET;</div><div class='add'>+    lock.l_start = 1;</div><div class='add'>+    lock.l_len = 1;</div><div class='add'>+</div><div class='add'>+    while (i &lt; 100) {</div><div class='add'>+        lock.l_type = F_WRLCK;</div><div class='add'>+        ret = fcntl(fd, F_SETLK, &amp;lock);</div><div class='add'>+        if (ret &lt; 0) {</div><div class='add'>+            fprintf(stderr, "fcntl setlk failed (%s)\n", strerror(errno));</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        lock.l_type = F_UNLCK;</div><div class='add'>+        ret = fcntl(fd, F_SETLK, &amp;lock);</div><div class='add'>+        if (ret &lt; 0) {</div><div class='add'>+            fprintf(stderr, "fcntl setlk failed (%s)\n", strerror(errno));</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        i++;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='head'>diff --git a/tests/bugs/core/bug-834465.t b/tests/bugs/core/bug-834465.t<br/>new file mode 100755<br/>index 00000000000..996248d4116<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/core/bug-834465.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/core/bug-834465.t</a></div><div class='hunk'>@@ -0,0 +1,51 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume info;</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/brick1 $H0:$B0/brick2;</div><div class='add'>+EXPECT 'Created' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+EXPECT 'Started' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+MOUNTDIR=$M0;</div><div class='add'>+</div><div class='add'>+#memory-accounting is enabled by default</div><div class='add'>+TEST glusterfs --volfile-server=$H0 --volfile-id=$V0 $MOUNTDIR;</div><div class='add'>+</div><div class='add'>+sdump1=$(generate_mount_statedump $V0);</div><div class='add'>+nalloc1=0</div><div class='add'>+grep -A3 "fuse - usage-type gf_common_mt_fd_lk_ctx_node_t" $sdump1</div><div class='add'>+if [ $? -eq '0' ]</div><div class='add'>+then</div><div class='add'>+        nalloc1=`grep -A3 "fuse - usage-type gf_common_mt_fd_lk_ctx_node_t" $sdump1 | grep -E "^num_allocs" | cut -d '=' -f2`</div><div class='add'>+fi</div><div class='add'>+</div><div class='add'>+build_tester $(dirname $0)/bug-834465.c</div><div class='add'>+</div><div class='add'>+TEST $(dirname $0)/bug-834465 $M0/testfile</div><div class='add'>+</div><div class='add'>+sdump2=$(generate_mount_statedump $V0);</div><div class='add'>+nalloc2=0</div><div class='add'>+grep -A3 "fuse - usage-type gf_common_mt_fd_lk_ctx_node_t" $sdump2</div><div class='add'>+if [ $? -eq '0' ]</div><div class='add'>+then</div><div class='add'>+        nalloc2=`grep -A3 "fuse - usage-type gf_common_mt_fd_lk_ctx_node_t" $sdump2 | grep -E "^num_allocs" | cut -d '=' -f2`</div><div class='add'>+fi</div><div class='add'>+</div><div class='add'>+TEST [ $nalloc1 -eq $nalloc2 ];</div><div class='add'>+</div><div class='add'>+TEST rm -rf $MOUNTDIR/*</div><div class='add'>+TEST rm -rf $(dirname $0)/bug-834465</div><div class='add'>+cleanup_mount_statedump $V0</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $MOUNTDIR</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/core/bug-845213.t b/tests/bugs/core/bug-845213.t<br/>new file mode 100644<br/>index 00000000000..136e4126d14<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/core/bug-845213.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/core/bug-845213.t</a></div><div class='hunk'>@@ -0,0 +1,19 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+## Start and create a volume</div><div class='add'>+TEST glusterd;</div><div class='add'>+TEST pidof glusterd;</div><div class='add'>+TEST $CLI volume info;</div><div class='add'>+</div><div class='add'>+## Create and start a volume with aio enabled</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/${V0}{1,2};</div><div class='add'>+TEST $CLI volume set $V0 remote-dio enable;</div><div class='add'>+TEST $CLI volume set $V0 network.remote-dio disable;</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='head'>diff --git a/tests/bugs/core/bug-903336.t b/tests/bugs/core/bug-903336.t<br/>new file mode 100644<br/>index 00000000000..b52c1a4758e<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/core/bug-903336.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/core/bug-903336.t</a></div><div class='hunk'>@@ -0,0 +1,13 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/${V0}</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+TEST glusterfs --volfile-id=/$V0 --volfile-server=$H0 $M0 --attribute-timeout=0 --entry-timeout=0</div><div class='add'>+TEST setfattr -n trusted.io-stats-dump -v /tmp $M0</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/bugs/core/bug-908146.t b/tests/bugs/core/bug-908146.t<br/>new file mode 100755<br/>index 00000000000..327be6e54bc<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/core/bug-908146.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/core/bug-908146.t</a></div><div class='hunk'>@@ -0,0 +1,30 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+. $(dirname $0)/../../fileio.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/${V0}0</div><div class='add'>+TEST $CLI volume set $V0 performance.open-behind off</div><div class='add'>+TEST $CLI volume set $V0 performance.flush-behind off</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+TEST glusterfs --volfile-id=/$V0 --volfile-server=$H0 $M0 --attribute-timeout=0 --entry-timeout=0 --direct-io-mode=enable</div><div class='add'>+TEST glusterfs --volfile-id=/$V0 --volfile-server=$H0 $M1 --attribute-timeout=0 --entry-timeout=0 --direct-io-mode=enable</div><div class='add'>+</div><div class='add'>+TEST touch $M0/a</div><div class='add'>+</div><div class='add'>+exec 4&gt;"$M0/a"</div><div class='add'>+exec 5&gt;"$M1/a"</div><div class='add'>+EXPECT "2" get_fd_count $V0 $H0 $B0/${V0}0 a</div><div class='add'>+</div><div class='add'>+exec 4&gt;&amp;-</div><div class='add'>+EXPECT "1" get_fd_count $V0 $H0 $B0/${V0}0 a</div><div class='add'>+</div><div class='add'>+exec 5&gt;&amp;-</div><div class='add'>+EXPECT "0" get_fd_count $V0 $H0 $B0/${V0}0 a</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/bugs/core/bug-913544.t b/tests/bugs/core/bug-913544.t<br/>new file mode 100644<br/>index 00000000000..af421722590<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/core/bug-913544.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/core/bug-913544.t</a></div><div class='hunk'>@@ -0,0 +1,24 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+#simulate a split-brain of a file and do truncate. This should not crash the mount point</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 replica 2 $H0:$B0/${V0}0 $H0:$B0/${V0}1</div><div class='add'>+TEST $CLI volume set $V0 stat-prefetch off</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+TEST glusterfs --volfile-id=/$V0 --volfile-server=$H0 $M0 --attribute-timeout=0 --entry-timeout=0</div><div class='add'>+cd $M0</div><div class='add'>+TEST touch a</div><div class='add'>+#simulate no-changelog data split-brain</div><div class='add'>+echo "abc" &gt; $B0/${V0}1/a</div><div class='add'>+echo "abcd" &gt; $B0/${V0}0/a</div><div class='add'>+TEST truncate -s 0 a</div><div class='add'>+TEST ls</div><div class='add'>+cd</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/bugs/core/bug-924075.t b/tests/bugs/core/bug-924075.t<br/>new file mode 100755<br/>index 00000000000..61ce0f18286<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/core/bug-924075.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/core/bug-924075.t</a></div><div class='hunk'>@@ -0,0 +1,23 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+#FIXME: there is another patch which moves the following function into</div><div class='add'>+#include.rc</div><div class='add'>+function process_leak_count ()</div><div class='add'>+{</div><div class='add'>+    local pid=$1;</div><div class='add'>+    return $(ls -lh /proc/$pid/fd | grep "(deleted)" | wc -l)</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+TEST glusterd;</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/${V0}1;</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+TEST glusterfs -s $H0 --volfile-id $V0 $M0;</div><div class='add'>+mount_pid=$(get_mount_process_pid $V0);</div><div class='add'>+TEST process_leak_count $mount_pid;</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/core/bug-927616.t b/tests/bugs/core/bug-927616.t<br/>new file mode 100755<br/>index 00000000000..18257131ac7<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/core/bug-927616.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/core/bug-927616.t</a></div><div class='hunk'>@@ -0,0 +1,65 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../nfs.rc</div><div class='add'>+</div><div class='add'>+#G_TESTDEF_TEST_STATUS_CENTOS6=NFS_TEST</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 replica 2 $H0:$B0/${V0}{1,2};</div><div class='add'>+TEST $CLI volume set $V0 performance.open-behind off;</div><div class='add'>+TEST $CLI volume set $V0 nfs.disable false</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+## Mount FUSE with caching disabled</div><div class='add'>+TEST glusterfs --entry-timeout=0 --attribute-timeout=0 -s $H0 --volfile-id $V0 $M0;</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $NFS_EXPORT_TIMEOUT "1" is_nfs_export_available;</div><div class='add'>+TEST mount_nfs $H0:/$V0 $N0 nolock;</div><div class='add'>+</div><div class='add'>+TEST mkdir $M0/dir;</div><div class='add'>+</div><div class='add'>+mkdir $M0/other;</div><div class='add'>+cp /etc/passwd $M0/;</div><div class='add'>+cp $M0/passwd $M0/file;</div><div class='add'>+chmod 600 $M0/file;</div><div class='add'>+</div><div class='add'>+chown -R nfsnobody:nfsnobody $M0/dir;</div><div class='add'>+</div><div class='add'>+TEST $CLI volume set $V0 server.root-squash on;</div><div class='add'>+</div><div class='add'>+sleep 1;</div><div class='add'>+</div><div class='add'>+# tests should fail.</div><div class='add'>+touch $M0/foo 2&gt;/dev/null;</div><div class='add'>+TEST [ $? -ne 0 ]</div><div class='add'>+touch $N0/foo 2&gt;/dev/null;</div><div class='add'>+TEST [ $? -ne 0 ]</div><div class='add'>+mkdir $M0/new 2&gt;/dev/null;</div><div class='add'>+TEST [ $? -ne 0 ]</div><div class='add'>+mkdir $N0/new 2&gt;/dev/null;</div><div class='add'>+TEST [ $? -ne 0 ]</div><div class='add'>+</div><div class='add'>+TEST $CLI volume set $V0 server.root-squash off;</div><div class='add'>+</div><div class='add'>+sleep 1;</div><div class='add'>+</div><div class='add'>+# tests should pass.</div><div class='add'>+touch $M0/foo 2&gt;/dev/null;</div><div class='add'>+TEST [ $? -eq 0 ]</div><div class='add'>+touch $N0/bar 2&gt;/dev/null;</div><div class='add'>+TEST [ $? -eq 0 ]</div><div class='add'>+mkdir $M0/new 2&gt;/dev/null;</div><div class='add'>+TEST [ $? -eq 0 ]</div><div class='add'>+mkdir $N0/old 2&gt;/dev/null;</div><div class='add'>+TEST [ $? -eq 0 ]</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" umount_nfs $N0</div><div class='add'>+</div><div class='add'>+TEST $CLI volume stop $V0;</div><div class='add'>+TEST $CLI volume delete $V0;</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/core/bug-949242.t b/tests/bugs/core/bug-949242.t<br/>new file mode 100644<br/>index 00000000000..5e916cbdbe6<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/core/bug-949242.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/core/bug-949242.t</a></div><div class='hunk'>@@ -0,0 +1,55 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+#</div><div class='add'>+# Bug 949242 - Test basic fallocate functionality.</div><div class='add'>+#</div><div class='add'>+# Run several commands to verify basic fallocate functionality. We verify that</div><div class='add'>+# fallocate creates and allocates blocks to a file. We also verify that the keep</div><div class='add'>+# size option does not modify the file size.</div><div class='add'>+###</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../fallocate.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 replica 2 $H0:$B0/${V0}{1,2,3,4}</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+TEST glusterfs --volfile-id=$V0 --volfile-server=$H0 $M0 --attribute-timeout=0 --entry-timeout=0</div><div class='add'>+</div><div class='add'>+# check for fallocate support before continuing the test</div><div class='add'>+require_fallocate -l 1m -n $M0/file &amp;&amp; rm -f $M0/file</div><div class='add'>+</div><div class='add'>+# fallocate a file and verify blocks are allocated</div><div class='add'>+TEST fallocate -l 1m $M0/file</div><div class='add'>+blksz=`stat -c %b $M0/file`</div><div class='add'>+nblks=`stat -c %B $M0/file`</div><div class='add'>+TEST [ $(($blksz * $nblks)) -eq 1048576 ]</div><div class='add'>+</div><div class='add'>+TEST unlink $M0/file</div><div class='add'>+</div><div class='add'>+# truncate a file to a fixed size, fallocate and verify that the size does not</div><div class='add'>+# change</div><div class='add'>+TEST truncate -s 1M $M0/file</div><div class='add'>+TEST fallocate -l 2m -n $M0/file</div><div class='add'>+blksz=`stat -c %b $M0/file`</div><div class='add'>+nblks=`stat -c %B $M0/file`</div><div class='add'>+sz=`stat -c %s $M0/file`</div><div class='add'>+TEST [ $sz -eq 1048576 ]</div><div class='add'>+# Note that gluster currently incorporates a hack to limit the number of blocks</div><div class='add'>+# reported as allocated to the file by the file size. We have allocated beyond the</div><div class='add'>+# file size here. Just check for non-zero allocation to avoid setting a land mine</div><div class='add'>+# for if/when that behavior might change.</div><div class='add'>+TEST [ ! $(($blksz * $nblks)) -eq 0 ]</div><div class='add'>+</div><div class='add'>+TEST unlink $M0/file</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+</div><div class='add'>+TEST $CLI volume stop $V0</div><div class='add'>+TEST $CLI volume delete $V0</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/core/bug-986429.t b/tests/bugs/core/bug-986429.t<br/>new file mode 100644<br/>index 00000000000..e512301775f<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/core/bug-986429.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/core/bug-986429.t</a></div><div class='hunk'>@@ -0,0 +1,19 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+## This tests failover achieved by providing multiple</div><div class='add'>+## servers from the trusted pool for fetching volume</div><div class='add'>+## specification</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/$V0</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+TEST glusterfs --entry-timeout=0 --attribute-timeout=0 -s non-existent -s $H0 --volfile-id=/$V0 $M0</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/core/io-stats-1322825.t b/tests/bugs/core/io-stats-1322825.t<br/>new file mode 100755<br/>index 00000000000..53f2d040daa<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/core/io-stats-1322825.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/core/io-stats-1322825.t</a></div><div class='hunk'>@@ -0,0 +1,67 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+# Test details:</div><div class='add'>+# This is to test that the io-stat-dump xattr is not set on the brick,</div><div class='add'>+# against the path that is used to trigger the stats dump.</div><div class='add'>+# Additionally it also tests if as many io-stat dumps are generated as there</div><div class='add'>+# are io-stat xlators in the graphs, which is 2 by default</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+</div><div class='add'>+# Covering replication and distribution in the test</div><div class='add'>+TEST $CLI volume create $V0 replica 2 $H0:$B0/${V0}{1..4}</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+TEST $GFS -s $H0 --volfile-id $V0 $M0</div><div class='add'>+</div><div class='add'>+# Generate some activity for the stats to produce something useful</div><div class='add'>+TEST $CLI volume profile $V0 start</div><div class='add'>+TEST mkdir $M0/dir1</div><div class='add'>+</div><div class='add'>+# Generate the stat dump across the io-stat instances</div><div class='add'>+TEST setfattr -n trusted.io-stats-dump -v io-stats-1322825 $M0</div><div class='add'>+</div><div class='add'>+# Check if $M0 is clean w.r.t xattr information</div><div class='add'>+# TODO: if there are better ways to check we really get no attr error, please</div><div class='add'>+# correct the following.</div><div class='add'>+getfattr -n trusted.io-stats-dump $B0/${V0}1 2&gt;&amp;1 | grep -qi "no such attribute"</div><div class='add'>+ret=$(echo $?)</div><div class='add'>+EXPECT 0 echo $ret</div><div class='add'>+getfattr -n trusted.io-stats-dump $B0/${V0}2 2&gt;&amp;1 | grep -qi "no such attribute"</div><div class='add'>+ret=$(echo $?)</div><div class='add'>+EXPECT 0 echo $ret</div><div class='add'>+getfattr -n trusted.io-stats-dump $B0/${V0}3 2&gt;&amp;1 | grep -qi "no such attribute"</div><div class='add'>+ret=$(echo $?)</div><div class='add'>+EXPECT 0 echo $ret</div><div class='add'>+getfattr -n trusted.io-stats-dump $B0/${V0}4 2&gt;&amp;1 | grep -qi "no such attribute"</div><div class='add'>+ret=$(echo $?)</div><div class='add'>+EXPECT 0 echo $ret</div><div class='add'>+</div><div class='add'>+# Check if we have 5 io-stat files in /tmp</div><div class='add'>+EXPECT 5 ls -1 /var/run/gluster/io-stats-1322825*</div><div class='add'>+# Cleanup the 5 generated files</div><div class='add'>+rm -f /var/run/gluster/io-stats-1322825*</div><div class='add'>+</div><div class='add'>+# Rinse and repeat above for a directory</div><div class='add'>+TEST setfattr -n trusted.io-stats-dump -v io-stats-1322825 $M0/dir1</div><div class='add'>+getfattr -n trusted.io-stats-dump $B0/${V0}1/dir1 2&gt;&amp;1 | grep -qi "no such attribute"</div><div class='add'>+ret=$(echo $?)</div><div class='add'>+EXPECT 0 echo $ret</div><div class='add'>+getfattr -n trusted.io-stats-dump $B0/${V0}2/dir1 2&gt;&amp;1 | grep -qi "no such attribute"</div><div class='add'>+ret=$(echo $?)</div><div class='add'>+EXPECT 0 echo $ret</div><div class='add'>+getfattr -n trusted.io-stats-dump $B0/${V0}3/dir1 2&gt;&amp;1 | grep -qi "no such attribute"</div><div class='add'>+ret=$(echo $?)</div><div class='add'>+EXPECT 0 echo $ret</div><div class='add'>+getfattr -n trusted.io-stats-dump $B0/${V0}4/dir1 2&gt;&amp;1 | grep -qi "no such attribute"</div><div class='add'>+ret=$(echo $?)</div><div class='add'>+EXPECT 0 echo $ret</div><div class='add'>+</div><div class='add'>+EXPECT 5 ls -1 /var/run/gluster/io-stats-1322825*</div><div class='add'>+rm -f /var/run/gluster/io-stats-1322825*</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/core/log-bug-1362520.t b/tests/bugs/core/log-bug-1362520.t<br/>new file mode 100755<br/>index 00000000000..cde854c3349<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/core/log-bug-1362520.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/core/log-bug-1362520.t</a></div><div class='hunk'>@@ -0,0 +1,43 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+#. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+#Basic checks</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume info</div><div class='add'>+</div><div class='add'>+#Create a distributed volume</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/${V0}{1};</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+# Mount FUSE without selinux:</div><div class='add'>+TEST glusterfs -s $H0 --volfile-id $V0 $@ $M0</div><div class='add'>+</div><div class='add'>+#Get the client log file</div><div class='add'>+log_wd=$(gluster --print-logdir)</div><div class='add'>+log_id=${M0:1}     # Remove initial slash</div><div class='add'>+log_id=${log_id//\//-} # Replace remaining slashes with dashes</div><div class='add'>+log_file=$log_wd/$log_id.log</div><div class='add'>+</div><div class='add'>+#Set the client xlator log-level to TRACE and check if the TRACE logs get</div><div class='add'>+#printed</div><div class='add'>+TEST setfattr -n trusted.glusterfs.$V0-client-0.set-log-level -v TRACE $M0</div><div class='add'>+TEST ! stat $M0/xyz</div><div class='add'>+grep -q " T \[rpc-clnt\.c" $log_file</div><div class='add'>+res=$?</div><div class='add'>+EXPECT '0' echo $res</div><div class='add'>+</div><div class='add'>+#Set the client xlator log-level to INFO and make sure the TRACE logs do</div><div class='add'>+#not get printed</div><div class='add'>+echo &gt; $log_file</div><div class='add'>+TEST setfattr -n trusted.glusterfs.$V0-client-0.set-log-level -v INFO $M0</div><div class='add'>+TEST ! stat $M0/xyz</div><div class='add'>+grep -q " T \[rpc-clnt\.c" $log_file</div><div class='add'>+res=$?</div><div class='add'>+EXPECT_NOT '0' echo $res</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/ctime/issue-832.t b/tests/bugs/ctime/issue-832.t<br/>new file mode 100755<br/>index 00000000000..740f731ab73<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/ctime/issue-832.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/ctime/issue-832.t</a></div><div class='hunk'>@@ -0,0 +1,32 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+. $(dirname $0)/../../traps.rc</div><div class='add'>+</div><div class='add'>+#Trigger trusted.glusterfs.mdata setting codepath and see things work as expected</div><div class='add'>+cleanup</div><div class='add'>+</div><div class='add'>+TEST_USER=test-ctime-user</div><div class='add'>+TEST_UID=27341</div><div class='add'>+</div><div class='add'>+TEST useradd -o -M -u ${TEST_UID} ${TEST_USER}</div><div class='add'>+push_trapfunc "userdel --force ${TEST_USER}"</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/$V0</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+$GFS --volfile-id=/$V0 --volfile-server=$H0 $M0;</div><div class='add'>+echo abc &gt; $M0/test</div><div class='add'>+TEST chmod 755 $M0/</div><div class='add'>+TEST chmod 744 $M0/test</div><div class='add'>+TEST setfattr -x trusted.glusterfs.mdata $B0/$V0/test</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+$GFS --volfile-id=/$V0 --volfile-server=$H0 $M0;</div><div class='add'>+su ${TEST_USER} -c "cat $M0/test"</div><div class='add'>+TEST getfattr -n trusted.glusterfs.mdata $B0/$V0/test</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/bugs/distribute/bug-1042725.t b/tests/bugs/distribute/bug-1042725.t<br/>new file mode 100644<br/>index 00000000000..5497eb8bc00<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/distribute/bug-1042725.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/distribute/bug-1042725.t</a></div><div class='hunk'>@@ -0,0 +1,49 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+#Basic checks</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume info</div><div class='add'>+</div><div class='add'>+#Create a distributed volume</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/${V0}{1..2};</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+# Mount FUSE</div><div class='add'>+TEST glusterfs -s $H0 --volfile-id $V0 $M0</div><div class='add'>+</div><div class='add'>+#Create files</div><div class='add'>+TEST mkdir $M0/foo</div><div class='add'>+TEST touch $M0/foo/{1..20}</div><div class='add'>+for file in {1..20}; do</div><div class='add'>+    ln $M0/foo/$file $M0/foo/${file}_linkfile;</div><div class='add'>+done</div><div class='add'>+</div><div class='add'>+#Stop one of the brick</div><div class='add'>+TEST kill_brick ${V0} ${H0} ${B0}/${V0}1</div><div class='add'>+</div><div class='add'>+rm -rf $M0/foo 2&gt;/dev/null</div><div class='add'>+TEST stat $M0/foo</div><div class='add'>+</div><div class='add'>+touch $M0/foo/{1..20} 2&gt;/dev/null</div><div class='add'>+touch $M0/foo/{1..20}_linkfile 2&gt;/dev/null</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0 force;</div><div class='add'>+sleep 5</div><div class='add'>+function verify_duplicate {</div><div class='add'>+    count=`ls $M0/foo | sort | uniq --repeated | grep [0-9] -c`</div><div class='add'>+    echo $count</div><div class='add'>+}</div><div class='add'>+EXPECT 0 verify_duplicate</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+TEST $CLI volume stop $V0</div><div class='add'>+TEST $CLI volume delete $V0;</div><div class='add'>+TEST ! $CLI volume info $V0;</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/distribute/bug-1066798.t b/tests/bugs/distribute/bug-1066798.t<br/>new file mode 100755<br/>index 00000000000..03de970a637<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/distribute/bug-1066798.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/distribute/bug-1066798.t</a></div><div class='hunk'>@@ -0,0 +1,88 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TESTS_EXPECTED_IN_LOOP=200</div><div class='add'>+</div><div class='add'>+## Start glusterd</div><div class='add'>+TEST glusterd;</div><div class='add'>+TEST pidof glusterd;</div><div class='add'>+TEST $CLI volume info;</div><div class='add'>+</div><div class='add'>+## Lets create volume</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/${V0}{1,2};</div><div class='add'>+</div><div class='add'>+## Verify volume is created</div><div class='add'>+EXPECT "$V0" volinfo_field $V0 'Volume Name';</div><div class='add'>+EXPECT 'Created' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+## Start volume and verify</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+EXPECT 'Started' volinfo_field $V0 'Status';</div><div class='add'>+TEST glusterfs -s $H0 --volfile-id=$V0 $M0</div><div class='add'>+</div><div class='add'>+############################################################</div><div class='add'>+#TEST_PLAN#</div><div class='add'>+#Create a file</div><div class='add'>+#Store the hashed brick information</div><div class='add'>+#Create hard links to it</div><div class='add'>+#Remove the hashed brick</div><div class='add'>+#Check now all the hardlinks are migrated in to "OTHERBRICK"</div><div class='add'>+#Check also in mount point for all the files</div><div class='add'>+#check there is no failures and skips for migration</div><div class='add'>+############################################################</div><div class='add'>+</div><div class='add'>+TEST touch $M0/file1;</div><div class='add'>+</div><div class='add'>+file_perm=`ls -l $M0/file1 | grep file1 | awk '{print $1}'`;</div><div class='add'>+</div><div class='add'>+if [ -f $B0/${V0}1/file1 ]</div><div class='add'>+then</div><div class='add'>+        HASHED=$B0/${V0}1</div><div class='add'>+        OTHER=$B0/${V0}2</div><div class='add'>+else</div><div class='add'>+        HASHED=$B0/${V0}2</div><div class='add'>+        OTHER=$B0/${V0}1</div><div class='add'>+fi</div><div class='add'>+</div><div class='add'>+#create hundred hard links</div><div class='add'>+for i in {1..50};</div><div class='add'>+do</div><div class='add'>+TEST_IN_LOOP ln $M0/file1 $M0/link$i;</div><div class='add'>+done</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+TEST $CLI volume remove-brick $V0 $H0:${HASHED} start</div><div class='add'>+EXPECT_WITHIN $REBALANCE_TIMEOUT "completed" remove_brick_status_completed_field "$V0" "$H0:${HASHED}";</div><div class='add'>+</div><div class='add'>+#check consistency in mount point</div><div class='add'>+#And also check all the links are migrated to OTHER</div><div class='add'>+for i in {1..50}</div><div class='add'>+do</div><div class='add'>+TEST_IN_LOOP [ -f ${OTHER}/link${i} ];</div><div class='add'>+TEST_IN_LOOP [ -f ${M0}/link${i} ];</div><div class='add'>+done;</div><div class='add'>+</div><div class='add'>+#check in OTHER that all the files has proper permission (Means no</div><div class='add'>+#linkto files)</div><div class='add'>+</div><div class='add'>+for i in {1..50}</div><div class='add'>+do</div><div class='add'>+link_perm=`ls -l $OTHER | grep -w link${i} | awk '{print $1}'`;</div><div class='add'>+TEST_IN_LOOP [ "${file_perm}" == "${link_perm}" ]</div><div class='add'>+</div><div class='add'>+done</div><div class='add'>+</div><div class='add'>+#check that remove-brick status should not have any failed or skipped files</div><div class='add'>+</div><div class='add'>+var=`$CLI volume remove-brick $V0 $H0:${HASHED} status | grep completed`</div><div class='add'>+</div><div class='add'>+TEST [ `echo $var | awk '{print $5}'` = "0"  ]</div><div class='add'>+TEST [ `echo $var | awk '{print $6}'` = "0"  ]</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='add'>+#G_TESTDEF_TEST_STATUS_CENTOS6=BAD_TEST,BUG=000000</div><div class='add'>+#G_TESTDEF_TEST_STATUS_NETBSD7=BAD_TEST,BUG=000000</div><div class='head'>diff --git a/tests/bugs/distribute/bug-1086228.t b/tests/bugs/distribute/bug-1086228.t<br/>new file mode 100755<br/>index 00000000000..e14ea572b61<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/distribute/bug-1086228.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/distribute/bug-1086228.t</a></div><div class='hunk'>@@ -0,0 +1,34 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+. $(dirname $0)/../../fileio.rc</div><div class='add'>+. $(dirname $0)/../../dht.rc</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+## Start and create a volume</div><div class='add'>+TEST glusterd;</div><div class='add'>+TEST pidof glusterd;</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/${V0}{1,2}</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+TEST glusterfs --direct-io-mode=yes --entry-timeout=0 --attribute-timeout=0 -s $H0 --volfile-id $V0 $M0;</div><div class='add'>+</div><div class='add'>+echo "D" &gt; $M0/file1;</div><div class='add'>+TEST chmod +st $M0/file1;</div><div class='add'>+</div><div class='add'>+TEST $CLI volume add-brick $V0 $H0:$B0/${V0}"3"</div><div class='add'>+TEST $CLI volume rebalance $V0 start force</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN "10" "0" rebalance_completed</div><div class='add'>+count=0</div><div class='add'>+for i in `ls $B0/$V0"3"`;</div><div class='add'>+	do</div><div class='add'>+		var=`stat -c %A $B0/$V0"3"/$i | cut -c 4`;</div><div class='add'>+		echo $B0/$V0"3"/$i $var</div><div class='add'>+		if [ "$var" != "S" ]; then</div><div class='add'>+			count=$((count + 1))</div><div class='add'>+		fi</div><div class='add'>+	done</div><div class='add'>+</div><div class='add'>+TEST [[ $count == 0 ]]</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/bugs/distribute/bug-1088231.t b/tests/bugs/distribute/bug-1088231.t<br/>new file mode 100755<br/>index 00000000000..8d4d1db73a5<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/distribute/bug-1088231.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/distribute/bug-1088231.t</a></div><div class='hunk'>@@ -0,0 +1,173 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+. $(dirname $0)/../../fileio.rc</div><div class='add'>+. $(dirname $0)/../../dht.rc</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0  $H0:$B0/${V0}{0,1}</div><div class='add'>+TEST $CLI volume set $V0 cluster.randomize-hash-range-by-gfid on</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+TEST glusterfs --volfile-id=/$V0 --aux-gfid-mount --volfile-server=$H0 $M0</div><div class='add'>+TEST mkdir $M0/a</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+## Bug Description: In case of dht_discover code path, which is triggered</div><div class='add'>+## when lookup done is nameless lookup, at the end of the lookup, even if</div><div class='add'>+## it finds that self-heal is needed to fix-the layout it wont heal because</div><div class='add'>+## healing code path is not added under nameless lookup.</div><div class='add'>+</div><div class='add'>+## What to test: With Patch, Even in case of nameless lookup, if layout</div><div class='add'>+## needs to be fixed,  the it will be fixed wherever lookup is successful</div><div class='add'>+## and it will not create any directory for subvols having ENOENT as it is</div><div class='add'>+## nameless lookup.</div><div class='add'>+</div><div class='add'>+gfid_with_hyphen=`getfattr -n glusterfs.gfid.string $M0/a 2&gt;/dev/null \</div><div class='add'>+                  | grep glusterfs.gfid.string | cut -d '"' -f 2`</div><div class='add'>+</div><div class='add'>+TEST setfattr -x trusted.glusterfs.dht $B0/$V0"0"/a</div><div class='add'>+</div><div class='add'>+## new healing code don't attempt healing if inode is already</div><div class='add'>+## populated. So, unmount and remount before we do stat.</div><div class='add'>+TEST umount $M0</div><div class='add'>+TEST glusterfs --volfile-id=/$V0 --aux-gfid-mount --volfile-server=$H0 $M0</div><div class='add'>+</div><div class='add'>+TEST stat $M0/.gfid/$gfid_with_hyphen</div><div class='add'>+</div><div class='add'>+##  Assuming that we have two bricks, we can have two permutations of layout</div><div class='add'>+##   Case 1:  Brick - A               Brick -  B</div><div class='add'>+##              0 - 50                   51-100</div><div class='add'>+##</div><div class='add'>+##   Case 2:  Brick - A               Brick -  B</div><div class='add'>+##             51 - 100                   0 - 50</div><div class='add'>+##</div><div class='add'>+##  To ensure layout is assigned properly, the following tests should be</div><div class='add'>+##  performed.</div><div class='add'>+##</div><div class='add'>+##   Case 1:    Layout_b0_s = 0; Layout_b0_e = 50, Layout_b1_s=51,</div><div class='add'>+##              Layout_b1_e = 100;</div><div class='add'>+##</div><div class='add'>+##              layout_b1_s = layout_b0_e + 1;</div><div class='add'>+##              layout_b0_s = layout_b1_e + 1; but b0_s is 0, so change to 101</div><div class='add'>+##                                             then compare</div><div class='add'>+##  Case 2:     Layout_b0_s = 51, Layout_b0_e = 100, Layout_b1_s=0,</div><div class='add'>+##              Layout_b1_e = 51</div><div class='add'>+##</div><div class='add'>+##             layout_b0_s  = Layout_b1_e + 1;</div><div class='add'>+##             layout_b1_s  = Layout_b0_e + 1; but b1_s is 0, so chage to 101.</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+##Extract Layout</div><div class='add'>+echo `get_layout  $B0/$V0"0"/a`</div><div class='add'>+echo `get_layout  $B0/$V0"1"/a`</div><div class='add'>+layout_b0_s=`get_layout $B0/$V0"0"/a  | cut -c19-26`</div><div class='add'>+layout_b0_e=`get_layout $B0/$V0"0"/a  | cut -c27-34`</div><div class='add'>+layout_b1_s=`get_layout $B0/$V0"1"/a  | cut -c19-26`</div><div class='add'>+layout_b1_e=`get_layout $B0/$V0"1"/a  | cut -c27-34`</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+##Add 0X to perform Hex arithematic</div><div class='add'>+layout_b0_s="0x"$layout_b0_s</div><div class='add'>+layout_b0_e="0x"$layout_b0_e</div><div class='add'>+layout_b1_s="0x"$layout_b1_s</div><div class='add'>+layout_b1_e="0x"$layout_b1_e</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+## Logic of converting starting layout "0" to "Max_value of layout + 1"</div><div class='add'>+comp1=$(($layout_b0_s + 0))</div><div class='add'>+if [ "$comp1" == "0" ];then</div><div class='add'>+	comp1=4294967296</div><div class='add'>+fi</div><div class='add'>+</div><div class='add'>+comp2=$(($layout_b1_s + 0))</div><div class='add'>+if [ "$comp2" == "0" ];then</div><div class='add'>+	comp2=4294967296</div><div class='add'>+fi</div><div class='add'>+</div><div class='add'>+diff1=$(($layout_b0_e + 1))</div><div class='add'>+diff2=$(($layout_b1_e + 1))</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+healed=0</div><div class='add'>+</div><div class='add'>+if [ "$comp1" == "$diff1" ] &amp;&amp; [ "$comp2" == "$diff2" ]; then</div><div class='add'>+   healed=$(($healed + 1))</div><div class='add'>+fi</div><div class='add'>+</div><div class='add'>+if [ "$comp1" == "$diff2" ] &amp;&amp; [ "$comp2" == "$diff1" ]; then</div><div class='add'>+	healed=$(($healed + 1))</div><div class='add'>+fi</div><div class='add'>+</div><div class='add'>+TEST [ $healed == 1 ]</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0  $H0:$B0/${V0}{0,1}</div><div class='add'>+TEST $CLI volume set $V0 cluster.randomize-hash-range-by-gfid on</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+TEST glusterfs --volfile-id=/$V0 --aux-gfid-mount --volfile-server=$H0 $M0</div><div class='add'>+TEST mkdir $M0/a</div><div class='add'>+</div><div class='add'>+gfid_with_hyphen=`getfattr -n glusterfs.gfid.string $M0/a 2&gt;/dev/null \</div><div class='add'>+                  | grep glusterfs.gfid.string | cut -d '"' -f 2`</div><div class='add'>+</div><div class='add'>+TEST setfattr -x trusted.glusterfs.dht $B0/$V0"0"/a</div><div class='add'>+TEST setfattr -x trusted.glusterfs.dht $B0/$V0"1"/a</div><div class='add'>+</div><div class='add'>+## new healing code don't attempt healing if inode is already</div><div class='add'>+## populated. So, unmount and remount before we do stat.</div><div class='add'>+TEST umount $M0</div><div class='add'>+TEST glusterfs --volfile-id=/$V0 --aux-gfid-mount --volfile-server=$H0 $M0</div><div class='add'>+</div><div class='add'>+TEST stat $M0/.gfid/$gfid_with_hyphen</div><div class='add'>+</div><div class='add'>+##Extract Layout</div><div class='add'>+</div><div class='add'>+layout_b0_s=`get_layout $B0/$V0"0"/a  | cut -c19-26`</div><div class='add'>+layout_b0_e=`get_layout $B0/$V0"0"/a  | cut -c27-34`</div><div class='add'>+layout_b1_s=`get_layout $B0/$V0"1"/a  | cut -c19-26`</div><div class='add'>+layout_b1_e=`get_layout $B0/$V0"1"/a  | cut -c27-34`</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+##Add 0X to perform Hex arithematic</div><div class='add'>+layout_b0_s="0x"$layout_b0_s</div><div class='add'>+layout_b0_e="0x"$layout_b0_e</div><div class='add'>+layout_b1_s="0x"$layout_b1_s</div><div class='add'>+layout_b1_e="0x"$layout_b1_e</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+## Logic of converting starting layout "0" to "Max_value of layout + 1"</div><div class='add'>+comp1=$(($layout_b0_s + 0))</div><div class='add'>+if [ "$comp1" == "0" ];then</div><div class='add'>+        comp1=4294967296</div><div class='add'>+fi</div><div class='add'>+</div><div class='add'>+comp2=$(($layout_b1_s + 0))</div><div class='add'>+if [ "$comp2" == "0" ];then</div><div class='add'>+        comp2=4294967296</div><div class='add'>+fi</div><div class='add'>+</div><div class='add'>+diff1=$(($layout_b0_e + 1))</div><div class='add'>+diff2=$(($layout_b1_e + 1))</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+healed=0</div><div class='add'>+</div><div class='add'>+if [ "$comp1" == "$diff1" ] &amp;&amp; [ "$comp2" == "$diff2" ]; then</div><div class='add'>+   healed=$(($healed + 1))</div><div class='add'>+fi</div><div class='add'>+</div><div class='add'>+if [ "$comp1" == "$diff2" ] &amp;&amp; [ "$comp2" == "$diff1" ]; then</div><div class='add'>+        healed=$(($healed + 1))</div><div class='add'>+fi</div><div class='add'>+</div><div class='add'>+TEST [ $healed == 1 ]</div><div class='add'>+cleanup</div><div class='add'>+</div><div class='head'>diff --git a/tests/bugs/distribute/bug-1099890.t b/tests/bugs/distribute/bug-1099890.t<br/>new file mode 100644<br/>index 00000000000..1a19ba880c0<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/distribute/bug-1099890.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/distribute/bug-1099890.t</a></div><div class='hunk'>@@ -0,0 +1,130 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+. $(dirname $0)/../../dht.rc</div><div class='add'>+</div><div class='add'>+## TO-DO: Fix the following once the dht du refresh interval issue is fixed:</div><div class='add'>+## 1. Do away with sleep(1).</div><div class='add'>+## 2. Do away with creation of empty files.</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+QDD=$(dirname $0)/quota</div><div class='add'>+# compile the test write program and run it</div><div class='add'>+build_tester $(dirname $0)/../../basic/quota.c -o $QDD</div><div class='add'>+</div><div class='add'>+TEST   glusterd;</div><div class='add'>+TEST   pidof glusterd;</div><div class='add'>+</div><div class='add'>+# Create 2 loop devices, one per brick.</div><div class='add'>+TEST   truncate -s 100M $B0/brick1</div><div class='add'>+TEST   truncate -s 100M $B0/brick2</div><div class='add'>+</div><div class='add'>+TEST   L1=`SETUP_LOOP $B0/brick1`</div><div class='add'>+TEST   MKFS_LOOP $L1</div><div class='add'>+</div><div class='add'>+TEST   L2=`SETUP_LOOP $B0/brick2`</div><div class='add'>+TEST   MKFS_LOOP $L2</div><div class='add'>+</div><div class='add'>+TEST   mkdir -p $B0/${V0}{1,2}</div><div class='add'>+</div><div class='add'>+TEST   MOUNT_LOOP $L1 $B0/${V0}1</div><div class='add'>+TEST   MOUNT_LOOP $L2 $B0/${V0}2</div><div class='add'>+</div><div class='add'>+# Create a plain distribute volume with 2 subvols.</div><div class='add'>+TEST   $CLI volume create $V0 $H0:$B0/${V0}{1,2};</div><div class='add'>+</div><div class='add'>+TEST   $CLI volume start $V0;</div><div class='add'>+EXPECT "Started" volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+TEST   $CLI volume quota $V0 enable;</div><div class='add'>+</div><div class='add'>+TEST   $CLI volume set $V0 features.quota-deem-statfs on</div><div class='add'>+</div><div class='add'>+TEST   $CLI volume quota $V0 limit-usage / 150MB;</div><div class='add'>+</div><div class='add'>+TEST   $CLI volume set $V0 cluster.min-free-disk 50%</div><div class='add'>+</div><div class='add'>+TEST   glusterfs -s $H0 --volfile-id=$V0 $M0</div><div class='add'>+</div><div class='add'>+# Make sure quota-deem-statfs is working as expected</div><div class='add'>+EXPECT "150M" echo `df -h $M0 -P | tail -1 | awk {'print $2'}`</div><div class='add'>+</div><div class='add'>+# Create a new file 'foo' under the root of the volume, which hashes to subvol-0</div><div class='add'>+# of DHT, that consumes 40M</div><div class='add'>+TEST $QDD $M0/foo 256 160</div><div class='add'>+</div><div class='add'>+TEST   stat $B0/${V0}1/foo</div><div class='add'>+TEST ! stat $B0/${V0}2/foo</div><div class='add'>+</div><div class='add'>+# Create a new file 'bar' under the root of the volume, which hashes to subvol-1</div><div class='add'>+# of DHT, that consumes 40M</div><div class='add'>+TEST $QDD $M0/bar 256 160</div><div class='add'>+</div><div class='add'>+TEST ! stat $B0/${V0}1/bar</div><div class='add'>+TEST   stat $B0/${V0}2/bar</div><div class='add'>+</div><div class='add'>+# Touch a zero-byte file on the root of the volume to make sure the statfs data</div><div class='add'>+# on DHT is refreshed</div><div class='add'>+sleep 1;</div><div class='add'>+TEST   touch $M0/empty1;</div><div class='add'>+</div><div class='add'>+# At this point, the available space on each subvol {60M,60M} is greater than</div><div class='add'>+# their min-free-disk {50M,50M}, but if this bug still exists, then</div><div class='add'>+# the total available space on the volume as perceived by DHT should be less</div><div class='add'>+# than min-free-disk, i.e.,</div><div class='add'>+#</div><div class='add'>+# consumed space returned per subvol by quota = (40M + 40M) = 80M</div><div class='add'>+#</div><div class='add'>+# Therefore, consumed space per subvol computed by DHT WITHOUT the fix would be:</div><div class='add'>+# (80M/150M)*100 = 53%</div><div class='add'>+#</div><div class='add'>+# Available space per subvol as perceived by DHT with the bug = 47%</div><div class='add'>+# which is less than min-free-disk</div><div class='add'>+</div><div class='add'>+# Now I create a file that hashes to subvol-1 (counting from 0) of DHT.</div><div class='add'>+# If this bug still exists,then DHT should be routing this creation to subvol-0.</div><div class='add'>+# If this bug is fixed, then DHT should be routing the creation to subvol-1 only</div><div class='add'>+# as it has more than min-free-disk space available.</div><div class='add'>+</div><div class='add'>+TEST $QDD $M0/file 1 1</div><div class='add'>+sleep 1;</div><div class='add'>+TEST ! stat $B0/${V0}1/file</div><div class='add'>+TEST   stat $B0/${V0}2/file</div><div class='add'>+</div><div class='add'>+# Touch another zero-byte file on the root of the volume to refresh statfs</div><div class='add'>+# values stored by DHT.</div><div class='add'>+</div><div class='add'>+TEST touch $M0/empty2;</div><div class='add'>+</div><div class='add'>+# Now I create a new file that hashes to subvol-0, at the end of which, there</div><div class='add'>+# will be less than min-free-disk space available on it.</div><div class='add'>+TEST $QDD $M0/fil 256 80</div><div class='add'>+sleep 1;</div><div class='add'>+TEST   stat $B0/${V0}1/fil</div><div class='add'>+TEST ! stat $B0/${V0}2/fil</div><div class='add'>+</div><div class='add'>+# Touch to refresh statfs info cached by DHT</div><div class='add'>+</div><div class='add'>+TEST   touch $M0/empty3;</div><div class='add'>+</div><div class='add'>+# Now I create a file that hashes to subvol-0 but since it has less than</div><div class='add'>+# min-free-disk space available, its data will be cached on subvol-1.</div><div class='add'>+</div><div class='add'>+TEST $QDD $M0/zz 256 20</div><div class='add'>+</div><div class='add'>+TEST   stat $B0/${V0}1/zz</div><div class='add'>+TEST   stat $B0/${V0}2/zz</div><div class='add'>+</div><div class='add'>+EXPECT "$V0-client-1" dht_get_linkto_target "$B0/${V0}1/zz"</div><div class='add'>+</div><div class='add'>+EXPECT "1" is_dht_linkfile "$B0/${V0}1/zz"</div><div class='add'>+</div><div class='add'>+force_umount $M0</div><div class='add'>+TEST $CLI volume stop $V0</div><div class='add'>+UMOUNT_LOOP ${B0}/${V0}{1,2}</div><div class='add'>+rm -f ${B0}/brick{1,2}</div><div class='add'>+</div><div class='add'>+rm -f $QDD</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/bugs/distribute/bug-1125824.t b/tests/bugs/distribute/bug-1125824.t<br/>new file mode 100755<br/>index 00000000000..7e401092273<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/distribute/bug-1125824.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/distribute/bug-1125824.t</a></div><div class='hunk'>@@ -0,0 +1,103 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+. $(dirname $0)/../../nfs.rc</div><div class='add'>+</div><div class='add'>+#G_TESTDEF_TEST_STATUS_CENTOS6=NFS_TEST</div><div class='add'>+</div><div class='add'>+create_files () {</div><div class='add'>+        for i in {1..10}; do</div><div class='add'>+                orig=$(printf %s/file%04d $1 $i)</div><div class='add'>+                echo "This is file $i" &gt; $orig</div><div class='add'>+        done</div><div class='add'>+        for i in {1..10}; do</div><div class='add'>+                mkdir $(printf %s/dir%04d $1 $i)</div><div class='add'>+        done</div><div class='add'>+        sync</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+create_dirs () {</div><div class='add'>+        for i in {1..10}; do</div><div class='add'>+                mkdir $(printf %s/dir%04d $1 $i)</div><div class='add'>+                create_files $(printf %s/dir%04d $1 $i)</div><div class='add'>+        done</div><div class='add'>+        sync</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+stat_files () {</div><div class='add'>+        for i in {1..10}; do</div><div class='add'>+                orig=$(printf %s/file%04d $1 $i)</div><div class='add'>+                stat $orig</div><div class='add'>+        done</div><div class='add'>+        for i in {1..10}; do</div><div class='add'>+                stat $(printf %s/dir%04d $1 $i)</div><div class='add'>+        done</div><div class='add'>+        sync</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+stat_dirs () {</div><div class='add'>+        for i in {1..10}; do</div><div class='add'>+                stat $(printf %s/dir%04d $1 $i)</div><div class='add'>+                stat_files $(printf %s/dir%04d $1 $i)</div><div class='add'>+        done</div><div class='add'>+        sync</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume info;</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 replica 2 $H0:$B0/${V0}{1,2,3,4};</div><div class='add'>+</div><div class='add'>+EXPECT "$V0" volinfo_field $V0 'Volume Name';</div><div class='add'>+EXPECT 'Created' volinfo_field $V0 'Status';</div><div class='add'>+EXPECT '4' brick_count $V0</div><div class='add'>+</div><div class='add'>+TEST $CLI volume set $V0 nfs.disable false</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+EXPECT 'Started' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $NFS_EXPORT_TIMEOUT "1" is_nfs_export_available;</div><div class='add'>+TEST mount_nfs $H0:/$V0 $N0</div><div class='add'>+</div><div class='add'>+# Create and poulate the NFS inode tables</div><div class='add'>+TEST create_dirs $N0</div><div class='add'>+TEST stat_dirs $N0</div><div class='add'>+</div><div class='add'>+# add-bricks changing the state of the volume where some bricks</div><div class='add'>+# would have some directories and others would not</div><div class='add'>+TEST $CLI volume add-brick $V0 replica 2 $H0:$B0/${V0}{5,6,7,8}</div><div class='add'>+</div><div class='add'>+# Post this dht_access was creating a mess for directories which is fixed</div><div class='add'>+# with this commit. The issues could range from getting ENOENT or</div><div class='add'>+# ESTALE or entries missing to directories not having complete</div><div class='add'>+# layouts.</div><div class='add'>+TEST cd $N0</div><div class='add'>+TEST ls -lR</div><div class='add'>+</div><div class='add'>+TEST $CLI volume rebalance $V0 start force</div><div class='add'>+EXPECT_WITHIN $REBALANCE_TIMEOUT "completed" rebalance_status_field $V0</div><div class='add'>+</div><div class='add'>+# tests to check post rebalance if layouts and entires are fine and</div><div class='add'>+# accessible by NFS to clear the volume</div><div class='add'>+TEST ls -lR</div><div class='add'>+rm -rf ./*</div><div class='add'>+# There are additional bugs where NFS+DHT does not delete all entries</div><div class='add'>+# on an rm -rf, so we do an additional rm -rf to ensure all is done</div><div class='add'>+# and we are facing this transient issue, rather than a bad directory</div><div class='add'>+# layout that is cached in memory</div><div class='add'>+TEST rm -rf ./*</div><div class='add'>+</div><div class='add'>+# Get out of the mount, so that umount can work</div><div class='add'>+TEST cd /</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $N0</div><div class='add'>+TEST $CLI volume stop $V0;</div><div class='add'>+EXPECT 'Stopped' volinfo_field $V0 'Status';</div><div class='add'>+TEST $CLI volume delete $V0;</div><div class='add'>+TEST ! $CLI volume info $V0;</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/distribute/bug-1161156.t b/tests/bugs/distribute/bug-1161156.t<br/>new file mode 100755<br/>index 00000000000..2b9e15407ca<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/distribute/bug-1161156.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/distribute/bug-1161156.t</a></div><div class='hunk'>@@ -0,0 +1,58 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+. $(dirname $0)/../../nfs.rc</div><div class='add'>+</div><div class='add'>+#G_TESTDEF_TEST_STATUS_CENTOS6=NFS_TEST</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+QDD=$(dirname $0)/quota</div><div class='add'>+# compile the test write program and run it</div><div class='add'>+build_tester $(dirname $0)/../../basic/quota.c -o $QDD</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume info;</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 replica 2 $H0:$B0/${V0}{1,2,3,4,5,6};</div><div class='add'>+EXPECT 'Created' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+TEST $CLI volume set $V0 nfs.disable false</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+EXPECT 'Started' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+# Testing with NFS for no particular reason</div><div class='add'>+EXPECT_WITHIN $NFS_EXPORT_TIMEOUT 1 is_nfs_export_available</div><div class='add'>+TEST mount_nfs $H0:/$V0 $N0</div><div class='add'>+mydir="dir"</div><div class='add'>+TEST mkdir -p $N0/$mydir</div><div class='add'>+TEST mkdir -p $N0/newdir</div><div class='add'>+</div><div class='add'>+TEST $QDD $N0/$mydir/file 256 40</div><div class='add'>+</div><div class='add'>+TEST $CLI volume quota $V0 enable</div><div class='add'>+TEST $CLI volume quota $V0 limit-usage / 20MB</div><div class='add'>+TEST $CLI volume quota $V0 limit-usage /newdir 5MB</div><div class='add'>+TEST $CLI volume quota $V0 soft-timeout 0</div><div class='add'>+TEST $CLI volume quota $V0 hard-timeout 0</div><div class='add'>+</div><div class='add'>+TEST $QDD $N0/$mydir/newfile_1 256 20</div><div class='add'>+# wait for write behind to complete.</div><div class='add'>+EXPECT_WITHIN $MARKER_UPDATE_TIMEOUT "15.0MB" quotausage "/"</div><div class='add'>+TEST ! $QDD $N0/$mydir/newfile_2 256 40</div><div class='add'>+</div><div class='add'>+# Test rename within a directory. It should pass even when the</div><div class='add'>+# corresponding directory quota is filled.</div><div class='add'>+TEST mv $N0/dir/file $N0/dir/newfile_3</div><div class='add'>+</div><div class='add'>+# rename should fail here with disk quota exceeded</div><div class='add'>+TEST ! mv $N0/dir/newfile_3 $N0/newdir/</div><div class='add'>+</div><div class='add'>+umount_nfs $N0</div><div class='add'>+TEST $CLI volume stop $V0</div><div class='add'>+</div><div class='add'>+rm -f $QDD</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/distribute/bug-1161311.t b/tests/bugs/distribute/bug-1161311.t<br/>new file mode 100755<br/>index 00000000000..62796068928<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/distribute/bug-1161311.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/distribute/bug-1161311.t</a></div><div class='hunk'>@@ -0,0 +1,164 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+SCRIPT_TIMEOUT=350</div><div class='add'>+</div><div class='add'>+# This tests for hard link preservation for files that are linked, when the</div><div class='add'>+# file is undergoing migration</div><div class='add'>+</div><div class='add'>+# --- Improvements and other tests ---</div><div class='add'>+## Fail rebalance of the large file for which links are created during P1/2</div><div class='add'>+### phases of migration</div><div class='add'>+## Start with multiple hard links to the file and then create more during P1/2</div><div class='add'>+### phases of migration</div><div class='add'>+## Test the same with NFS as the mount rather than FUSE</div><div class='add'>+## Create links when file is under P2 of migration specifically</div><div class='add'>+## Test with quota, to error out during hard link creation (if possible)</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='add'>+TEST truncate -s 10GB $B0/brick1</div><div class='add'>+TEST truncate -s 10GB $B0/brick2</div><div class='add'>+TEST truncate -s 10GB $B0/brick3</div><div class='add'>+</div><div class='add'>+TEST LO1=`SETUP_LOOP $B0/brick1`</div><div class='add'>+TEST MKFS_LOOP $LO1</div><div class='add'>+</div><div class='add'>+TEST LO2=`SETUP_LOOP $B0/brick2`</div><div class='add'>+TEST MKFS_LOOP $LO2</div><div class='add'>+</div><div class='add'>+TEST LO3=`SETUP_LOOP $B0/brick3`</div><div class='add'>+TEST MKFS_LOOP $LO3</div><div class='add'>+</div><div class='add'>+TEST mkdir -p $B0/${V0}1 $B0/${V0}2  $B0/${V0}3</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+TEST MOUNT_LOOP $LO1 $B0/${V0}1</div><div class='add'>+TEST MOUNT_LOOP $LO2 $B0/${V0}2</div><div class='add'>+TEST MOUNT_LOOP $LO3 $B0/${V0}3</div><div class='add'>+</div><div class='add'>+checksticky () {</div><div class='add'>+	i=0;</div><div class='add'>+	while [ ! -k $1 ]; do</div><div class='add'>+		sleep 1</div><div class='add'>+		i=$((i+1));</div><div class='add'>+		# Try for 10 seconds to get the sticky bit state</div><div class='add'>+		# else fail the test, as we may never see it</div><div class='add'>+		if [[ $i == 10 ]]; then</div><div class='add'>+			return $i</div><div class='add'>+		fi</div><div class='add'>+		echo "Waiting... $i"</div><div class='add'>+	done</div><div class='add'>+        echo "Done... got out @ $i"</div><div class='add'>+	return 0</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume info;</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/${V0}{1..3};</div><div class='add'>+</div><div class='add'>+EXPECT "$V0" volinfo_field $V0 'Volume Name';</div><div class='add'>+EXPECT 'Created' volinfo_field $V0 'Status';</div><div class='add'>+EXPECT '3' brick_count $V0</div><div class='add'>+</div><div class='add'>+TEST $CLI volume set $V0 parallel-readdir on</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+EXPECT 'Started' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+## Mount FUSE with caching disabled (read-write)</div><div class='add'>+TEST glusterfs -s $H0 --volfile-id $V0 $M0;</div><div class='add'>+</div><div class='add'>+# Create a directories to hold the links</div><div class='add'>+TEST mkdir $M0/dir1</div><div class='add'>+TEST mkdir -p $M0/dir2/dir3</div><div class='add'>+</div><div class='add'>+# Create a large file (8 GB), so that rebalance takes time</div><div class='add'>+# Since we really don't care about the contents of the file, we use fallocate</div><div class='add'>+# to generate the file much faster. We could also use truncate, which is even</div><div class='add'>+# faster, but rebalance could take advantage of an sparse file and migrate it</div><div class='add'>+# in an optimized way, but we don't want a fast migration.</div><div class='add'>+TEST fallocate -l 8G $M0/dir1/FILE2</div><div class='add'>+</div><div class='add'>+# Rename the file to create a linkto, for rebalance to</div><div class='add'>+# act on the file</div><div class='add'>+## FILE1 and FILE2 hashes are, 678b1c4a e22c1ada, so they fall</div><div class='add'>+## into separate bricks when brick count is 3</div><div class='add'>+TEST mv $M0/dir1/FILE2 $M0/dir1/FILE1</div><div class='add'>+</div><div class='add'>+brick_loc=$(get_backend_paths $M0/dir1/FILE1)</div><div class='add'>+</div><div class='add'>+# unmount and remount the volume</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+TEST glusterfs -s $H0 --volfile-id $V0 $M0;</div><div class='add'>+</div><div class='add'>+# Start the rebalance</div><div class='add'>+TEST $CLI volume rebalance $V0 start force</div><div class='add'>+</div><div class='add'>+# Wait for FILE to get the sticky bit on, so that file is under</div><div class='add'>+# active rebalance, before creating the links</div><div class='add'>+TEST checksticky $brick_loc</div><div class='add'>+</div><div class='add'>+# Create the links</div><div class='add'>+## FILE3 FILE5 FILE7 have hashes, c8c91469 566d26ce 22ce7eba</div><div class='add'>+## Which fall into separate bricks on a 3 brick layout</div><div class='add'>+cd $M0</div><div class='add'>+TEST ln ./dir1/FILE1 ./dir1/FILE7</div><div class='add'>+TEST ln ./dir1/FILE1 ./dir1/FILE5</div><div class='add'>+TEST ln ./dir1/FILE1 ./dir1/FILE3</div><div class='add'>+</div><div class='add'>+TEST ln ./dir1/FILE1 ./dir2/FILE7</div><div class='add'>+TEST ln ./dir1/FILE1 ./dir2/FILE5</div><div class='add'>+TEST ln ./dir1/FILE1 ./dir2/FILE3</div><div class='add'>+</div><div class='add'>+TEST ln ./dir1/FILE1 ./dir2/dir3/FILE7</div><div class='add'>+TEST ln ./dir1/FILE1 ./dir2/dir3/FILE5</div><div class='add'>+TEST ln ./dir1/FILE1 ./dir2/dir3/FILE3</div><div class='add'>+cd /</div><div class='add'>+</div><div class='add'>+# Ideally for this test to have done its job, the file should still be</div><div class='add'>+# under migration, so check the sticky bit again</div><div class='add'>+TEST checksticky $brick_loc</div><div class='add'>+</div><div class='add'>+# Wait for rebalance to complete</div><div class='add'>+EXPECT_WITHIN $REBALANCE_TIMEOUT "completed" rebalance_status_field $V0</div><div class='add'>+</div><div class='add'>+# Check if all files are clean and migrated right</div><div class='add'>+## stat on the original file should show linkcount of 10</div><div class='add'>+linkcountsrc=$(stat -c %h $M0/dir1/FILE1)</div><div class='add'>+TEST [[ $linkcountsrc == 10 ]]</div><div class='add'>+</div><div class='add'>+## inode and size of every file should be same as original file</div><div class='add'>+inodesrc=$(stat -c %i $M0/dir1/FILE1)</div><div class='add'>+TEST [[ $(stat -c %i $M0/dir1/FILE3) == $inodesrc ]]</div><div class='add'>+TEST [[ $(stat -c %i $M0/dir1/FILE5) == $inodesrc ]]</div><div class='add'>+TEST [[ $(stat -c %i $M0/dir1/FILE7) == $inodesrc ]]</div><div class='add'>+</div><div class='add'>+TEST [[ $(stat -c %i $M0/dir2/FILE3) == $inodesrc ]]</div><div class='add'>+TEST [[ $(stat -c %i $M0/dir2/FILE5) == $inodesrc ]]</div><div class='add'>+TEST [[ $(stat -c %i $M0/dir2/FILE7) == $inodesrc ]]</div><div class='add'>+</div><div class='add'>+TEST [[ $(stat -c %i $M0/dir2/dir3/FILE3) == $inodesrc ]]</div><div class='add'>+TEST [[ $(stat -c %i $M0/dir2/dir3/FILE5) == $inodesrc ]]</div><div class='add'>+TEST [[ $(stat -c %i $M0/dir2/dir3/FILE7) == $inodesrc ]]</div><div class='add'>+</div><div class='add'>+# Check, newer link creations</div><div class='add'>+cd $M0</div><div class='add'>+TEST ln ./dir1/FILE1 ./FILE1</div><div class='add'>+TEST ln ./dir2/FILE3 ./FILE3</div><div class='add'>+TEST ln ./dir2/dir3/FILE5 ./FILE5</div><div class='add'>+TEST ln ./dir1/FILE7 ./FILE7</div><div class='add'>+cd /</div><div class='add'>+linkcountsrc=$(stat -c %h $M0/dir1/FILE1)</div><div class='add'>+TEST [[ $linkcountsrc == 14 ]]</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+# Stop the volume</div><div class='add'>+TEST $CLI volume stop $V0;</div><div class='add'>+</div><div class='add'>+UMOUNT_LOOP ${B0}/${V0}{1..3}</div><div class='add'>+rm -f ${B0}/brick{1..3}</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/distribute/bug-1190734.t b/tests/bugs/distribute/bug-1190734.t<br/>new file mode 100644<br/>index 00000000000..9256088f7a0<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/distribute/bug-1190734.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/distribute/bug-1190734.t</a></div><div class='hunk'>@@ -0,0 +1,93 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+. $(dirname $0)/../../nfs.rc</div><div class='add'>+</div><div class='add'>+#G_TESTDEF_TEST_STATUS_CENTOS6=NFS_TEST</div><div class='add'>+</div><div class='add'>+BRICK_COUNT=3</div><div class='add'>+FILE_COUNT=100</div><div class='add'>+FILE_COUNT_TIME=5</div><div class='add'>+</div><div class='add'>+function create_files {</div><div class='add'>+    rm -rf $2</div><div class='add'>+    mkdir $2</div><div class='add'>+    for i in `seq 1 $1`; do</div><div class='add'>+        touch $2/file_$i</div><div class='add'>+    done</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function get_file_count {</div><div class='add'>+    ls $1/file_[0-9]* | wc -l</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function reset {</div><div class='add'>+    $CLI volume stop $V0</div><div class='add'>+    ${UMOUNT_F} $1</div><div class='add'>+    $CLI volume delete $V0</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function start_mount_fuse {</div><div class='add'>+    $CLI volume start $V0</div><div class='add'>+    [ $? -ne 0 ] &amp;&amp; return 1</div><div class='add'>+</div><div class='add'>+    $GFS --volfile-id=/$V0 --volfile-server=$H0 $M0</div><div class='add'>+    [ $? -ne 0 ] &amp;&amp; return 1</div><div class='add'>+</div><div class='add'>+    create_files $FILE_COUNT $M0/$1</div><div class='add'>+    [ $? -ne 0 ] &amp;&amp; return 1</div><div class='add'>+</div><div class='add'>+    return 0</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function start_mount_nfs {</div><div class='add'>+    $CLI volume start $V0</div><div class='add'>+    [ $? -ne 0 ] &amp;&amp; return 1</div><div class='add'>+</div><div class='add'>+    sleep 3</div><div class='add'>+    mount_nfs $H0:/$V0 $N0</div><div class='add'>+    [ $? -ne 0 ] &amp;&amp; return 1</div><div class='add'>+</div><div class='add'>+    create_files $FILE_COUNT $N0/$1</div><div class='add'>+    [ $? -ne 0 ] &amp;&amp; return 1</div><div class='add'>+</div><div class='add'>+    return 0</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+</div><div class='add'>+# Test 1-2 Create repliacted volume</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 replica 2 $H0:$B0/${V0}0 $H0:$B0/${V0}1 \</div><div class='add'>+    $H0:$B0/${V0}2 $H0:$B0/${V0}3 $H0:$B0/${V0}4 $H0:$B0/${V0}5</div><div class='add'>+TEST $CLI volume set $V0 nfs.disable false</div><div class='add'>+</div><div class='add'>+# ------- test 1: AFR, fuse + remove bricks</div><div class='add'>+</div><div class='add'>+TEST start_mount_fuse test1</div><div class='add'>+EXPECT_WITHIN $FILE_COUNT_TIME $FILE_COUNT get_file_count $M0/test1</div><div class='add'>+TEST $CLI volume remove-brick $V0 replica 2 $H0:$B0/${V0}{2,3} start</div><div class='add'>+EXPECT_WITHIN $REBALANCE_TIMEOUT "completed" remove_brick_status_completed_field "$V0" "$H0:$B0/${V0}2  $H0:$B0/${V0}3"</div><div class='add'>+TEST $CLI volume remove-brick $V0 replica 2 $H0:$B0/${V0}{2,3} commit</div><div class='add'>+EXPECT_WITHIN $FILE_COUNT_TIME $FILE_COUNT get_file_count $M0/test1</div><div class='add'>+reset $M0</div><div class='add'>+</div><div class='add'>+# ------- test 2: AFR, nfs + remove bricks</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 replica 2 $H0:$B0/${V0}0 $H0:$B0/${V0}1 \</div><div class='add'>+    $H0:$B0/${V0}2 $H0:$B0/${V0}3 $H0:$B0/${V0}4 $H0:$B0/${V0}5</div><div class='add'>+TEST $CLI volume set $V0 nfs.disable false</div><div class='add'>+</div><div class='add'>+TEST start_mount_nfs test2</div><div class='add'>+EXPECT_WITHIN $FILE_COUNT_TIME $FILE_COUNT get_file_count $N0/test2</div><div class='add'>+TEST $CLI volume remove-brick $V0 replica 2 $H0:$B0/${V0}2  $H0:$B0/${V0}3 start</div><div class='add'>+EXPECT_WITHIN $REBALANCE_TIMEOUT "completed" remove_brick_status_completed_field "$V0" "$H0:$B0/${V0}2  $H0:$B0/${V0}3"</div><div class='add'>+TEST $CLI volume remove-brick $V0 replica 2 $H0:$B0/${V0}{2,3} commit</div><div class='add'>+EXPECT_WITHIN $FILE_COUNT_TIME $FILE_COUNT get_file_count $N0/test2</div><div class='add'>+reset $N0</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/bugs/distribute/bug-1193636.c b/tests/bugs/distribute/bug-1193636.c<br/>new file mode 100644<br/>index 00000000000..ea3f79a4e06<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/distribute/bug-1193636.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/distribute/bug-1193636.c</a></div><div class='hunk'>@@ -0,0 +1,68 @@</div><div class='add'>+#include &lt;stdio.h&gt;</div><div class='add'>+#include &lt;stdlib.h&gt;</div><div class='add'>+#include &lt;sys/types.h&gt;</div><div class='add'>+#include &lt;sys/xattr.h&gt;</div><div class='add'>+#include &lt;fcntl.h&gt;</div><div class='add'>+#include &lt;string.h&gt;</div><div class='add'>+</div><div class='add'>+#define MY_XATTR_NAME "user.ftest"</div><div class='add'>+#define MY_XATTR_VAL "ftestval"</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+usage(void)</div><div class='add'>+{</div><div class='add'>+    printf("Usage : bug-1193636 &lt;filename&gt; &lt;xattr_name&gt; &lt;op&gt;\n");</div><div class='add'>+    printf("   op : 0 - set, 1 - remove\n");</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+main(int argc, char **argv)</div><div class='add'>+{</div><div class='add'>+    int fd;</div><div class='add'>+    int err = 0;</div><div class='add'>+    char *xattr_name = NULL;</div><div class='add'>+    int op = 0;</div><div class='add'>+</div><div class='add'>+    if (argc != 4) {</div><div class='add'>+        usage();</div><div class='add'>+        exit(1);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    op = atoi(argv[3]);</div><div class='add'>+</div><div class='add'>+    if ((op != 0) &amp;&amp; (op != 1)) {</div><div class='add'>+        printf("Invalid operation specified.\n");</div><div class='add'>+        usage();</div><div class='add'>+        exit(1);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    xattr_name = argv[2];</div><div class='add'>+</div><div class='add'>+    fd = open(argv[1], O_RDWR);</div><div class='add'>+    if (fd == -1) {</div><div class='add'>+        printf("Failed to open file %s\n", argv[1]);</div><div class='add'>+        exit(1);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (!op) {</div><div class='add'>+        err = fsetxattr(fd, xattr_name, MY_XATTR_VAL, strlen(MY_XATTR_VAL) + 1,</div><div class='add'>+                        XATTR_CREATE);</div><div class='add'>+</div><div class='add'>+        if (err) {</div><div class='add'>+            printf("Failed to set xattr %s: %m\n", xattr_name);</div><div class='add'>+            exit(1);</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+    } else {</div><div class='add'>+        err = fremovexattr(fd, xattr_name);</div><div class='add'>+</div><div class='add'>+        if (err) {</div><div class='add'>+            printf("Failed to remove xattr %s: %m\n", xattr_name);</div><div class='add'>+            exit(1);</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    close(fd);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='head'>diff --git a/tests/bugs/distribute/bug-1193636.t b/tests/bugs/distribute/bug-1193636.t<br/>new file mode 100644<br/>index 00000000000..b377910336e<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/distribute/bug-1193636.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/distribute/bug-1193636.t</a></div><div class='hunk'>@@ -0,0 +1,74 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+checksticky () {</div><div class='add'>+        i=0;</div><div class='add'>+        while [ ! -k $1 ]; do</div><div class='add'>+                sleep 1</div><div class='add'>+                i=$((i+1));</div><div class='add'>+                if [[ $i == 10 ]]; then</div><div class='add'>+                        return $i</div><div class='add'>+                fi</div><div class='add'>+                echo "Waiting... $i"</div><div class='add'>+        done</div><div class='add'>+        echo "done ...got out @ $i"</div><div class='add'>+        return 0</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+#Basic checks</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume info</div><div class='add'>+</div><div class='add'>+#Create a distributed volume</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/${V0}{1..3};</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+# Mount FUSE</div><div class='add'>+TEST glusterfs -s $H0 --volfile-id $V0 $M0</div><div class='add'>+</div><div class='add'>+TEST mkdir $M0/dir1</div><div class='add'>+</div><div class='add'>+# Create a large file (1GB), so that rebalance takes time</div><div class='add'>+dd if=/dev/zero of=$M0/dir1/FILE2 bs=64k count=10240</div><div class='add'>+</div><div class='add'>+# Rename the file to create a linkto, for rebalance to</div><div class='add'>+# act on the file</div><div class='add'>+TEST mv $M0/dir1/FILE2 $M0/dir1/FILE1</div><div class='add'>+</div><div class='add'>+brick_loc=$(get_backend_paths $M0/dir1/FILE1)</div><div class='add'>+</div><div class='add'>+build_tester $(dirname $0)/bug-1193636.c</div><div class='add'>+</div><div class='add'>+TEST $CLI volume rebalance $V0 start force</div><div class='add'>+</div><div class='add'>+TEST checksticky $brick_loc</div><div class='add'>+</div><div class='add'>+TEST setfattr -n "user.test1" -v "test1" $M0/dir1/FILE1</div><div class='add'>+TEST setfattr -n "user.test2" -v "test1" $M0/dir1/FILE1</div><div class='add'>+TEST setfattr -n "user.test3" -v "test1" $M0/dir1/FILE1</div><div class='add'>+</div><div class='add'>+TEST $(dirname $0)/bug-1193636 $M0/dir1/FILE1 user.fsetx 0</div><div class='add'>+TEST $(dirname $0)/bug-1193636 $M0/dir1/FILE1 user.fremx 0</div><div class='add'>+</div><div class='add'>+TEST getfattr -n "user.fremx" $M0/dir1/FILE1</div><div class='add'>+TEST setfattr -x "user.test2" $M0/dir1/FILE1</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+TEST $(dirname $0)/bug-1193636 $M0/dir1/FILE1 user.fremx 1</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $REBALANCE_TIMEOUT "completed" rebalance_status_field $V0</div><div class='add'>+</div><div class='add'>+TEST getfattr -n "user.fsetx" $M0/dir1/FILE1</div><div class='add'>+TEST getfattr -n "user.test1" $M0/dir1/FILE1</div><div class='add'>+TEST ! getfattr -n "user.test2" $M0/dir1/FILE1</div><div class='add'>+TEST ! getfattr -n "user.fremx" $M0/dir1/FILE1</div><div class='add'>+TEST getfattr -n "user.test3" $M0/dir1/FILE1</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/distribute/bug-1204140.t b/tests/bugs/distribute/bug-1204140.t<br/>new file mode 100755<br/>index 00000000000..050c069ea30<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/distribute/bug-1204140.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/distribute/bug-1204140.t</a></div><div class='hunk'>@@ -0,0 +1,22 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../dht.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/${V0}0 $H0:$B0/${V0}1 $H0:$B0/${V0}2</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+## Mount FUSE</div><div class='add'>+TEST glusterfs -s $H0 --volfile-id $V0 $M0;</div><div class='add'>+TEST touch $M0/new.txt;</div><div class='add'>+TEST getfattr -n "glusterfs.get_real_filename:NEW.txt" $M0;</div><div class='add'>+TEST ! getfattr -n "glusterfs.get_realfilename:NEXT.txt" $M0;</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/distribute/bug-1247563.t b/tests/bugs/distribute/bug-1247563.t<br/>new file mode 100644<br/>index 00000000000..a2fc722896f<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/distribute/bug-1247563.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/distribute/bug-1247563.t</a></div><div class='hunk'>@@ -0,0 +1,62 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+is_sticky_set () {</div><div class='add'>+        echo $1</div><div class='add'>+        if [ -k $1 ];</div><div class='add'>+        then</div><div class='add'>+                echo "yes"</div><div class='add'>+        else</div><div class='add'>+                echo "no"</div><div class='add'>+        fi</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+#Basic checks</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume info</div><div class='add'>+</div><div class='add'>+#Create a distributed volume</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/${V0}{1..3};</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+# Mount FUSE</div><div class='add'>+TEST glusterfs --acl -s $H0 --volfile-id $V0 $M0</div><div class='add'>+</div><div class='add'>+TEST mkdir $M0/dir1</div><div class='add'>+</div><div class='add'>+echo "Testing pacls on rebalance" &gt; $M0/dir1/FILE1</div><div class='add'>+</div><div class='add'>+FPATH1=`find $B0/ -name FILE1`</div><div class='add'>+</div><div class='add'>+# Rename the file to create a linkto, for rebalance to</div><div class='add'>+# act on the file</div><div class='add'>+</div><div class='add'>+TEST mv $M0/dir1/FILE1 $M0/dir1/FILE2</div><div class='add'>+FPATH2=`find $B0/ -perm 1000 -name FILE2`</div><div class='add'>+</div><div class='add'>+setfacl -m user:root:rwx $M0/dir1/FILE2</div><div class='add'>+</div><div class='add'>+# Run rebalance without the force option to skip</div><div class='add'>+# the file migration</div><div class='add'>+TEST $CLI volume rebalance $V0 start</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $REBALANCE_TIMEOUT "completed" rebalance_status_field $V0</div><div class='add'>+</div><div class='add'>+#Check that the file has been skipped,i.e., the linkto still exists</div><div class='add'>+EXPECT "yes" is_sticky_set $FPATH2</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+#The linkto file should not have any posix acls set</div><div class='add'>+COUNT=`getfacl $FPATH2 |grep -c "user:root:rwx"`</div><div class='add'>+EXPECT "0" echo $COUNT</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+#G_TESTDEF_TEST_STATUS_CENTOS6=BAD_TEST,BUG=000000</div><div class='add'>+#G_TESTDEF_TEST_STATUS_NETBSD7=BAD_TEST,BUG=000000</div><div class='head'>diff --git a/tests/bugs/distribute/bug-1368012.t b/tests/bugs/distribute/bug-1368012.t<br/>new file mode 100644<br/>index 00000000000..0b626353aab<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/distribute/bug-1368012.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/distribute/bug-1368012.t</a></div><div class='hunk'>@@ -0,0 +1,51 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+function get_permission {</div><div class='add'>+        stat -c "%A" $1</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+## Start glusterd</div><div class='add'>+TEST glusterd;</div><div class='add'>+TEST pidof glusterd;</div><div class='add'>+TEST $CLI volume info;</div><div class='add'>+</div><div class='add'>+## Lets create volume</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/${V0}{1,2};</div><div class='add'>+</div><div class='add'>+## Verify volume is created</div><div class='add'>+EXPECT "$V0" volinfo_field $V0 'Volume Name';</div><div class='add'>+EXPECT 'Created' volinfo_field $V0 'Status';</div><div class='add'>+## Start volume and verify</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "2" online_brick_count</div><div class='add'>+TEST $CLI volume set $V0 performance.stat-prefetch off</div><div class='add'>+EXPECT 'Started' volinfo_field $V0 'Status';</div><div class='add'>+TEST glusterfs -s $H0 --volfile-id=$V0 $M0</div><div class='add'>+</div><div class='add'>+##Test case: Add-brick</div><div class='add'>+#------------------------------------------------------------</div><div class='add'>+#change permission of both root</div><div class='add'>+TEST chmod 444 $M0</div><div class='add'>+</div><div class='add'>+#store permission for comparision</div><div class='add'>+TEST permission_root=`stat -c "%A" $M0`</div><div class='add'>+TEST echo $permission_root</div><div class='add'>+#Add-brick</div><div class='add'>+TEST $CLI volume add-brick $V0 $H0:$B0/${V0}3</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "3" online_brick_count</div><div class='add'>+</div><div class='add'>+#Allow one lookup to happen</div><div class='add'>+TEST ls $M0</div><div class='add'>+#Generate another lookup</div><div class='add'>+echo 3 &gt; /proc/sys/vm/drop_caches</div><div class='add'>+TEST ls $M0</div><div class='add'>+#check root permission</div><div class='add'>+EXPECT_WITHIN "5" $permission_root get_permission $M0</div><div class='add'>+#check permission on the new-brick</div><div class='add'>+EXPECT $permission_root get_permission $B0/${V0}3</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/bugs/distribute/bug-1389697.t b/tests/bugs/distribute/bug-1389697.t<br/>new file mode 100644<br/>index 00000000000..0d428b8d9d2<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/distribute/bug-1389697.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/distribute/bug-1389697.t</a></div><div class='hunk'>@@ -0,0 +1,42 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../cluster.rc</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='add'>+</div><div class='add'>+TEST launch_cluster 2;</div><div class='add'>+TEST $CLI_1 peer probe $H2;</div><div class='add'>+EXPECT_WITHIN $PROBE_TIMEOUT 1 peer_count</div><div class='add'>+</div><div class='add'>+TEST $CLI_1 volume create $V0 $H1:$B1/b1 $H1:$B1/b2 $H2:$B2/b3</div><div class='add'>+TEST $CLI_1 volume start $V0</div><div class='add'>+</div><div class='add'>+#Start a fix-layout</div><div class='add'>+TEST $CLI_1 volume rebalance $V0 fix-layout start</div><div class='add'>+</div><div class='add'>+#volume rebalance status should work</div><div class='add'>+TEST $CLI_1 volume rebalance $V0 status</div><div class='add'>+$CLI_1 volume rebalance $V0 status</div><div class='add'>+</div><div class='add'>+val=$($CLI_1 volume rebalance $V0 status |grep "fix-layout" 2&gt;&amp;1)</div><div class='add'>+val=$?</div><div class='add'>+TEST [ $val -eq 0 ];</div><div class='add'>+</div><div class='add'>+#Start a remove brick for the brick on H2</div><div class='add'>+TEST $CLI_1 volume remove-brick $V0 $H2:$B2/b3 start</div><div class='add'>+TEST $CLI_1 volume remove-brick $V0 $H2:$B2/b3 status</div><div class='add'>+</div><div class='add'>+#Check remove brick status from H1</div><div class='add'>+$CLI_1 volume remove-brick $V0 $H2:$B2/b3 status |grep "fix-layout" 2&gt;&amp;1</div><div class='add'>+val=$?</div><div class='add'>+TEST [ $val -eq 1 ];</div><div class='add'>+</div><div class='add'>+$CLI_1 volume remove-brick $V0 $H2:$B2/b3 status</div><div class='add'>+$CLI_2 volume remove-brick $V0 $H2:$B2/b3 status</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+TEST $CLI_1 volume remove-brick $V0 $H2:$B2/b3 stop</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/bugs/distribute/bug-1543279.t b/tests/bugs/distribute/bug-1543279.t<br/>new file mode 100644<br/>index 00000000000..47b8b4a4a95<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/distribute/bug-1543279.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/distribute/bug-1543279.t</a></div><div class='hunk'>@@ -0,0 +1,67 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+. $(dirname $0)/../../dht.rc</div><div class='add'>+</div><div class='add'>+TESTS_EXPECTED_IN_LOOP=44</div><div class='add'>+SCRIPT_TIMEOUT=600</div><div class='add'>+</div><div class='add'>+rename_files() {</div><div class='add'>+    MOUNT=$1</div><div class='add'>+    ITERATIONS=$2</div><div class='add'>+    for i in $(seq 1 $ITERATIONS); do uuid="`uuidgen`"; echo "some data" &gt; $MOUNT/test$uuid; mv $MOUNT/test$uuid $MOUNT/test -f || return $?; done</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+run_test_for_volume() {</div><div class='add'>+    VOLUME=$1</div><div class='add'>+    ITERATIONS=$2</div><div class='add'>+    TEST_IN_LOOP $CLI volume start $VOLUME</div><div class='add'>+</div><div class='add'>+    TEST_IN_LOOP glusterfs -s $H0 --volfile-id $VOLUME $M0</div><div class='add'>+    TEST_IN_LOOP glusterfs -s $H0 --volfile-id $VOLUME $M1</div><div class='add'>+    TEST_IN_LOOP glusterfs -s $H0 --volfile-id $VOLUME $M2</div><div class='add'>+    TEST_IN_LOOP glusterfs -s $H0 --volfile-id $VOLUME $M3</div><div class='add'>+</div><div class='add'>+    rename_files $M0 $ITERATIONS &amp;</div><div class='add'>+    M0_RENAME_PID=$!</div><div class='add'>+</div><div class='add'>+    rename_files $M1 $ITERATIONS &amp;</div><div class='add'>+    M1_RENAME_PID=$!</div><div class='add'>+</div><div class='add'>+    rename_files $M2 $ITERATIONS &amp;</div><div class='add'>+    M2_RENAME_PID=$!</div><div class='add'>+</div><div class='add'>+    rename_files $M3 $ITERATIONS &amp;</div><div class='add'>+    M3_RENAME_PID=$!</div><div class='add'>+</div><div class='add'>+    TEST_IN_LOOP wait $M0_RENAME_PID</div><div class='add'>+    TEST_IN_LOOP wait $M1_RENAME_PID</div><div class='add'>+    TEST_IN_LOOP wait $M2_RENAME_PID</div><div class='add'>+    TEST_IN_LOOP wait $M3_RENAME_PID</div><div class='add'>+</div><div class='add'>+    TEST_IN_LOOP $CLI volume stop $VOLUME</div><div class='add'>+    TEST_IN_LOOP $CLI volume delete $VOLUME</div><div class='add'>+    umount $M0 $M1 $M2 $M3</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/${V0}{0..8} force</div><div class='add'>+run_test_for_volume $V0 200</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 replica 3 arbiter 1 $H0:$B0/${V0}{0..8} force</div><div class='add'>+run_test_for_volume $V0 200</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 replica 3 $H0:$B0/${V0}{0..8} force</div><div class='add'>+run_test_for_volume $V0 200</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 disperse 6 redundancy 2 $H0:$B0/${V0}{0..5} force</div><div class='add'>+run_test_for_volume $V0 200</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='add'>+#G_TESTDEF_TEST_STATUS_CENTOS6=BAD_TEST,BUG=000000</div><div class='add'>+#G_TESTDEF_TEST_STATUS_NETBSD7=BAD_TEST,BUG=000000</div><div class='head'>diff --git a/tests/bugs/distribute/bug-1600379.t b/tests/bugs/distribute/bug-1600379.t<br/>new file mode 100644<br/>index 00000000000..8d2f6154100<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/distribute/bug-1600379.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/distribute/bug-1600379.t</a></div><div class='hunk'>@@ -0,0 +1,54 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+# Initialize</div><div class='add'>+#------------------------------------------------------------</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+# Start glusterd</div><div class='add'>+TEST glusterd;</div><div class='add'>+TEST pidof glusterd;</div><div class='add'>+TEST $CLI volume info;</div><div class='add'>+</div><div class='add'>+# Create a volume</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/${V0}{1,2}</div><div class='add'>+</div><div class='add'>+# Verify volume creation</div><div class='add'>+EXPECT "$V0" volinfo_field $V0 'Volume Name';</div><div class='add'>+EXPECT 'Created' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+# Start volume and verify successful start</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+EXPECT 'Started' volinfo_field $V0 'Status';</div><div class='add'>+TEST glusterfs --volfile-id=$V0 --volfile-server=$H0 --entry-timeout=0 $M0;</div><div class='add'>+#------------------------------------------------------------</div><div class='add'>+</div><div class='add'>+# Test case - Remove xattr from killed brick on lookup</div><div class='add'>+#------------------------------------------------------------</div><div class='add'>+# Create a dir and set custom xattr</div><div class='add'>+TEST mkdir $M0/testdir</div><div class='add'>+TEST setfattr -n user.attr -v val $M0/testdir</div><div class='add'>+xattr_val=`getfattr -d $B0/${V0}2/testdir | awk '{print $1}'`;</div><div class='add'>+TEST ${xattr_val}='user.attr="val"';</div><div class='add'>+</div><div class='add'>+# Kill 2nd brick process</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}2</div><div class='add'>+EXPECT_WITHIN ${PROCESS_UP_TIMEOUT} "1" online_brick_count</div><div class='add'>+</div><div class='add'>+# Remove custom xattr</div><div class='add'>+TEST setfattr -x user.attr $M0/testdir</div><div class='add'>+</div><div class='add'>+# Bring up the killed brick process</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+</div><div class='add'>+# Perform lookup</div><div class='add'>+sleep 5</div><div class='add'>+TEST ls $M0/testdir</div><div class='add'>+</div><div class='add'>+# Check brick xattrs</div><div class='add'>+xattr_val_2=`getfattr -d $B0/${V0}2/testdir`;</div><div class='add'>+TEST [ ${xattr_val_2} = ''] ;</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/distribute/bug-1667804.t b/tests/bugs/distribute/bug-1667804.t<br/>new file mode 100644<br/>index 00000000000..3f7c43111d7<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/distribute/bug-1667804.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/distribute/bug-1667804.t</a></div><div class='hunk'>@@ -0,0 +1,63 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+. $(dirname $0)/../../dht.rc</div><div class='add'>+</div><div class='add'>+function confirm_all_linkto_files ()</div><div class='add'>+{</div><div class='add'>+   inpath=$1</div><div class='add'>+   for infile in $inpath/*</div><div class='add'>+   do</div><div class='add'>+      echo $infile</div><div class='add'>+      ret1=$(is_dht_linkfile $infile)</div><div class='add'>+      if [ "$ret1" -eq 0 ]; then</div><div class='add'>+        echo "$infile is not a linkto file"</div><div class='add'>+        echo 0</div><div class='add'>+        return</div><div class='add'>+      fi</div><div class='add'>+   done</div><div class='add'>+   echo  1</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+#Basic checks</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume info</div><div class='add'>+</div><div class='add'>+#Create a distributed volume</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/${V0}{1..2};</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+# Mount FUSE</div><div class='add'>+TEST glusterfs -s $H0 --volfile-id $V0 $M0</div><div class='add'>+</div><div class='add'>+#Create files and rename them in order to create linkto files</div><div class='add'>+TEST mkdir -p $M0/dir0/dir1</div><div class='add'>+TEST touch $M0/dir0/dir1/file-{1..50}</div><div class='add'>+</div><div class='add'>+for i in {1..50}; do</div><div class='add'>+    mv $M0/dir0/dir1/file-$i $M0/dir0/dir1/nfile-$i;</div><div class='add'>+done</div><div class='add'>+</div><div class='add'>+#Remove the second brick to force the creation of linkto files</div><div class='add'>+#on the removed brick</div><div class='add'>+</div><div class='add'>+TEST $CLI volume remove-brick $V0 $H0:$B0/${V0}2 start</div><div class='add'>+EXPECT_WITHIN $REBALANCE_TIMEOUT "completed" remove_brick_status_completed_field "$V0 $H0:$B0/${V0}2"</div><div class='add'>+TEST $CLI volume remove-brick $V0 $H0:$B0/${V0}2 stop</div><div class='add'>+</div><div class='add'>+EXPECT "1" confirm_all_linkto_files $B0/${V0}2/dir0/dir1</div><div class='add'>+</div><div class='add'>+#Modify the xattrs of the linkto files on the removed brick to point to itself.</div><div class='add'>+</div><div class='add'>+target=$(cat $M0/.meta/graphs/active/$V0-dht/subvolumes/1/name)</div><div class='add'>+</div><div class='add'>+setfattr -n trusted.glusterfs.dht.linkto -v "$target\0" $B0/${V0}2/dir0/dir1/nfile*</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+TEST rm -rf $M0/dir0</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/distribute/bug-1786679.t b/tests/bugs/distribute/bug-1786679.t<br/>new file mode 100755<br/>index 00000000000..219ce51c8a9<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/distribute/bug-1786679.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/distribute/bug-1786679.t</a></div><div class='hunk'>@@ -0,0 +1,69 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+SCRIPT_TIMEOUT=250</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+. $(dirname $0)/../../dht.rc</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+# create 2 subvols</div><div class='add'>+# create a dir</div><div class='add'>+# create a file</div><div class='add'>+# change layout</div><div class='add'>+# remove the file</div><div class='add'>+# execute create from a different mount</div><div class='add'>+# Without the patch, the file will be present on both of the bricks</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='add'>+</div><div class='add'>+function get_layout () {</div><div class='add'>+</div><div class='add'>+layout=`getfattr -n trusted.glusterfs.dht -e hex $1 2&gt;&amp;1 | grep dht | gawk -F"=" '{print $2}'`</div><div class='add'>+</div><div class='add'>+echo $layout</div><div class='add'>+</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function set_layout()</div><div class='add'>+{</div><div class='add'>+    setfattr -n  "trusted.glusterfs.dht" -v $1 $2</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+</div><div class='add'>+BRICK1=$B0/${V0}-0</div><div class='add'>+BRICK2=$B0/${V0}-1</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 $H0:$BRICK1 $H0:$BRICK2</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+# Mount FUSE and create symlink</div><div class='add'>+TEST glusterfs -s $H0 --volfile-id $V0 $M0</div><div class='add'>+TEST mkdir $M0/dir</div><div class='add'>+TEST touch $M0/dir/file</div><div class='add'>+TEST ! stat "$BRICK1/dir/file"</div><div class='add'>+TEST stat "$BRICK2/dir/file"</div><div class='add'>+</div><div class='add'>+layout1="$(get_layout "$BRICK1/dir")"</div><div class='add'>+layout2="$(get_layout "$BRICK2/dir")"</div><div class='add'>+</div><div class='add'>+TEST set_layout $layout1 "$BRICK2/dir"</div><div class='add'>+TEST set_layout $layout2 "$BRICK1/dir"</div><div class='add'>+</div><div class='add'>+TEST rm $M0/dir/file -f</div><div class='add'>+TEST gluster v set $V0 client-log-level DEBUG</div><div class='add'>+</div><div class='add'>+#Without the patch in place, this client will create the file in $BRICK2</div><div class='add'>+#which will lead to two files being on both the bricks when a new client</div><div class='add'>+#create the file with the same name</div><div class='add'>+TEST touch $M0/dir/file</div><div class='add'>+</div><div class='add'>+TEST glusterfs -s $H0 --volfile-id $V0 $M1</div><div class='add'>+TEST touch $M1/dir/file</div><div class='add'>+</div><div class='add'>+TEST stat "$BRICK1/dir/file"</div><div class='add'>+TEST ! stat "$BRICK2/dir/file"</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/bugs/distribute/bug-853258.t b/tests/bugs/distribute/bug-853258.t<br/>new file mode 100755<br/>index 00000000000..6817d9e2cd3<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/distribute/bug-853258.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/distribute/bug-853258.t</a></div><div class='hunk'>@@ -0,0 +1,47 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+</div><div class='add'>+mkdir -p $H0:$B0/${V0}0</div><div class='add'>+mkdir -p $H0:$B0/${V0}1</div><div class='add'>+mkdir -p $H0:$B0/${V0}2</div><div class='add'>+mkdir -p $H0:$B0/${V0}3</div><div class='add'>+</div><div class='add'>+# Create and start a volume.</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/${V0}0 $H0:$B0/${V0}1 $H0:$B0/${V0}2</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT 'Started' volinfo_field $V0 'Status';</div><div class='add'>+TEST $CLI volume set $V0 cluster.weighted-rebalance off</div><div class='add'>+</div><div class='add'>+# Force assignment of initial ranges.</div><div class='add'>+TEST $CLI volume rebalance $V0 fix-layout start</div><div class='add'>+EXPECT_WITHIN $REBALANCE_TIMEOUT "fix-layout completed" fix-layout_status_field $V0</div><div class='add'>+</div><div class='add'>+# Get the original values.</div><div class='add'>+xattrs=""</div><div class='add'>+for i in $(seq 0 2); do</div><div class='add'>+	xattrs="$xattrs $(dht_get_layout $B0/${V0}$i)"</div><div class='add'>+done</div><div class='add'>+</div><div class='add'>+# Expand the volume and force assignment of new ranges.</div><div class='add'>+TEST $CLI volume add-brick $V0 $H0:$B0/${V0}3</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "4" online_brick_count</div><div class='add'>+# Force assignment of initial ranges.</div><div class='add'>+TEST $CLI volume rebalance $V0 fix-layout start</div><div class='add'>+EXPECT_WITHIN $REBALANCE_TIMEOUT "fix-layout completed" fix-layout_status_field $V0</div><div class='add'>+</div><div class='add'>+for i in $(seq 0 3); do</div><div class='add'>+	xattrs="$xattrs $(dht_get_layout $B0/${V0}$i)"</div><div class='add'>+done</div><div class='add'>+</div><div class='add'>+overlap=$( $PYTHON $(dirname $0)/overlap.py $xattrs)</div><div class='add'>+# 2863311531 = 0xaaaaaaab = 2/3 overlap</div><div class='add'>+TEST [ "$overlap" -ge 2863311531 ]</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/bugs/distribute/bug-860663.c b/tests/bugs/distribute/bug-860663.c<br/>new file mode 100644<br/>index 00000000000..ca0c31ffe8f<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/distribute/bug-860663.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/distribute/bug-860663.c</a></div><div class='hunk'>@@ -0,0 +1,41 @@</div><div class='add'>+#include &lt;stdio.h&gt;</div><div class='add'>+#include &lt;unistd.h&gt;</div><div class='add'>+#include &lt;stdlib.h&gt;</div><div class='add'>+#include &lt;fcntl.h&gt;</div><div class='add'>+#include &lt;string.h&gt;</div><div class='add'>+#include &lt;err.h&gt;</div><div class='add'>+#include &lt;sys/param.h&gt;</div><div class='add'>+</div><div class='add'>+int main(argc, argv) int argc;</div><div class='add'>+char **argv;</div><div class='add'>+{</div><div class='add'>+    char *basepath;</div><div class='add'>+    char path[MAXPATHLEN + 1];</div><div class='add'>+    unsigned int count;</div><div class='add'>+    int i, fd;</div><div class='add'>+</div><div class='add'>+    if (argc != 3)</div><div class='add'>+        errx(1, "usage: %s path count", argv[0]);</div><div class='add'>+</div><div class='add'>+    basepath = argv[1];</div><div class='add'>+    count = atoi(argv[2]);</div><div class='add'>+</div><div class='add'>+    if (count &gt; 999999)</div><div class='add'>+        errx(1, "count too big");</div><div class='add'>+</div><div class='add'>+    if (strlen(basepath) &gt; MAXPATHLEN - 6)</div><div class='add'>+        errx(1, "path too long");</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; count; i++) {</div><div class='add'>+        (void)sprintf(path, "%s%06d", basepath, i);</div><div class='add'>+</div><div class='add'>+        fd = open(path, O_CREAT | O_RDWR, 0644);</div><div class='add'>+        if (fd == -1)</div><div class='add'>+            err(1, "create %s failed", path);</div><div class='add'>+</div><div class='add'>+        if (close(fd) != 0)</div><div class='add'>+            warn("close %s failed", path);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='head'>diff --git a/tests/bugs/distribute/bug-860663.t b/tests/bugs/distribute/bug-860663.t<br/>new file mode 100644<br/>index 00000000000..59b8223ef3f<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/distribute/bug-860663.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/distribute/bug-860663.t</a></div><div class='hunk'>@@ -0,0 +1,56 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+function file_count()</div><div class='add'>+{</div><div class='add'>+        val=1</div><div class='add'>+</div><div class='add'>+        if [ "$1" == "$2" ]</div><div class='add'>+        then</div><div class='add'>+                val=0</div><div class='add'>+        fi</div><div class='add'>+        echo $val</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+BRICK_COUNT=3</div><div class='add'>+</div><div class='add'>+build_tester $(dirname $0)/bug-860663.c</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/${V0}0 $H0:$B0/${V0}1 $H0:$B0/${V0}2</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+## Mount FUSE</div><div class='add'>+TEST glusterfs -s $H0 --volfile-id $V0 $M0;</div><div class='add'>+</div><div class='add'>+TEST $(dirname $0)/bug-860663 $M0/files 1000</div><div class='add'>+</div><div class='add'>+ORIG_FILE_COUNT=`ls -l $M0 | wc -l`;</div><div class='add'>+TEST [ $ORIG_FILE_COUNT -ge 1000 ]</div><div class='add'>+</div><div class='add'>+# Kill a brick process</div><div class='add'>+kill_brick $V0 $H0 $B0/${V0}1</div><div class='add'>+</div><div class='add'>+TEST $CLI volume rebalance $V0 fix-layout start</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $REBALANCE_TIMEOUT "fix-layout failed" fix-layout_status_field $V0;</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status $V0 $H0 $B0/${V0}1</div><div class='add'>+</div><div class='add'>+# Unmount and remount to make sure we're doing fresh lookups.</div><div class='add'>+TEST umount $M0</div><div class='add'>+TEST glusterfs -s $H0 --volfile-id $V0 $M0;</div><div class='add'>+</div><div class='add'>+NEW_FILE_COUNT=`ls -l $M0 | wc -l`;</div><div class='add'>+</div><div class='add'>+EXPECT "0" file_count $ORIG_FILE_COUNT $NEW_FILE_COUNT</div><div class='add'>+</div><div class='add'>+rm -f $(dirname $0)/bug-860663</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/distribute/bug-862967.t b/tests/bugs/distribute/bug-862967.t<br/>new file mode 100644<br/>index 00000000000..2fb0848bd7c<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/distribute/bug-862967.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/distribute/bug-862967.t</a></div><div class='hunk'>@@ -0,0 +1,59 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+function uid_gid_compare()</div><div class='add'>+{</div><div class='add'>+        val=1</div><div class='add'>+</div><div class='add'>+        if [ "$1" == "$3" ]</div><div class='add'>+        then</div><div class='add'>+                if [ "$2" == "$4" ]</div><div class='add'>+                        then</div><div class='add'>+                                val=0</div><div class='add'>+                fi</div><div class='add'>+        fi</div><div class='add'>+        echo "$val"</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+BRICK_COUNT=3</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/${V0}0 $H0:$B0/${V0}1 $H0:$B0/${V0}2</div><div class='add'>+TEST $CLI volume set $V0 stat-prefetch off</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+## Mount FUSE</div><div class='add'>+TEST glusterfs --attribute-timeout=0 --entry-timeout=0 --gid-timeout=-1 -s $H0 --volfile-id $V0 $M0;</div><div class='add'>+</div><div class='add'>+# change dir permissions</div><div class='add'>+mkdir $M0/dir;</div><div class='add'>+chown 1:1 $M0/dir;</div><div class='add'>+</div><div class='add'>+# Kill a brick process</div><div class='add'>+</div><div class='add'>+kill_brick $V0 $H0 $B0/${V0}2</div><div class='add'>+# change dir ownership</div><div class='add'>+NEW_UID=36;</div><div class='add'>+NEW_GID=36;</div><div class='add'>+chown $NEW_UID:$NEW_GID $M0/dir;</div><div class='add'>+</div><div class='add'>+# bring the brick back up</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+</div><div class='add'>+sleep 10;</div><div class='add'>+</div><div class='add'>+ls -l $M0/dir;</div><div class='add'>+</div><div class='add'>+# check if uid/gid is healed on backend brick which was taken down</div><div class='add'>+BACKEND_UID=`stat -c %u $B0/${V0}2/dir`;</div><div class='add'>+BACKEND_GID=`stat -c %g $B0/${V0}2/dir`;</div><div class='add'>+</div><div class='add'>+EXPECT "0" uid_gid_compare $NEW_UID $NEW_GID $BACKEND_UID $BACKEND_GID</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/distribute/bug-882278.t b/tests/bugs/distribute/bug-882278.t<br/>new file mode 100755<br/>index 00000000000..8cb51474720<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/distribute/bug-882278.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/distribute/bug-882278.t</a></div><div class='hunk'>@@ -0,0 +1,73 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+cleanup</div><div class='add'>+</div><div class='add'>+# Is there a good reason to require --fqdn elsewhere?  It's worse than useless</div><div class='add'>+# here.</div><div class='add'>+H0=$(hostname -s)</div><div class='add'>+</div><div class='add'>+function recreate {</div><div class='add'>+	# The rm is necessary so we don't get fooled by leftovers from old runs.</div><div class='add'>+	rm -rf $1 &amp;&amp; mkdir -p $1</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function count_lines {</div><div class='add'>+	grep "$1" $2/* | wc -l</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume info;</div><div class='add'>+</div><div class='add'>+## Start and create a volume</div><div class='add'>+TEST recreate ${B0}/${V0}-0</div><div class='add'>+TEST recreate ${B0}/${V0}-1</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/${V0}-{0,1}</div><div class='add'>+TEST $CLI volume set $V0 cluster.nufa on</div><div class='add'>+</div><div class='add'>+function volinfo_field()</div><div class='add'>+{</div><div class='add'>+    local vol=$1;</div><div class='add'>+    local field=$2;</div><div class='add'>+</div><div class='add'>+    $CLI volume info $vol | grep "^$field: " | sed 's/.*: //';</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+## Verify volume is created</div><div class='add'>+EXPECT "$V0" volinfo_field $V0 'Volume Name';</div><div class='add'>+EXPECT 'Created' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+## Start volume and verify</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+EXPECT 'Started' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+## Mount native</div><div class='add'>+special_option="--xlator-option ${V0}-dht.local-volume-name=${V0}-client-1"</div><div class='add'>+TEST glusterfs --volfile-server=$H0 --volfile-id=$V0 $special_option $M0</div><div class='add'>+</div><div class='add'>+## Create a bunch of test files.</div><div class='add'>+for i in $(seq 0 99); do</div><div class='add'>+	echo hello &gt; $(printf $M0/file%02d $i)</div><div class='add'>+done</div><div class='add'>+</div><div class='add'>+## Make sure the files went to the right place.  There might be link files in</div><div class='add'>+## the other brick, but they won't have any contents.</div><div class='add'>+EXPECT "0" count_lines hello ${B0}/${V0}-0</div><div class='add'>+EXPECT "100" count_lines hello ${B0}/${V0}-1</div><div class='add'>+</div><div class='add'>+if [ "$EXIT_EARLY" = "1" ]; then</div><div class='add'>+	exit 0;</div><div class='add'>+fi</div><div class='add'>+</div><div class='add'>+## Finish up</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+TEST $CLI volume stop $V0;</div><div class='add'>+EXPECT 'Stopped' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+TEST $CLI volume delete $V0;</div><div class='add'>+TEST ! $CLI volume info $V0;</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/distribute/bug-884455.t b/tests/bugs/distribute/bug-884455.t<br/>new file mode 100755<br/>index 00000000000..59413cd5408<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/distribute/bug-884455.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/distribute/bug-884455.t</a></div><div class='hunk'>@@ -0,0 +1,84 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../dht.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+function layout_compare()</div><div class='add'>+{</div><div class='add'>+        res=0</div><div class='add'>+</div><div class='add'>+        if [ "$1" == "$2" ]</div><div class='add'>+        then</div><div class='add'>+                res=1</div><div class='add'>+        fi</div><div class='add'>+        if [ "$1" == "$3" ]</div><div class='add'>+        then</div><div class='add'>+                res=1</div><div class='add'>+        fi</div><div class='add'>+        if [ "$2" == "$3" ]</div><div class='add'>+        then</div><div class='add'>+                res=1</div><div class='add'>+        fi</div><div class='add'>+</div><div class='add'>+        echo $res</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function get_layout()</div><div class='add'>+{</div><div class='add'>+        layout1=`getfattr -n trusted.glusterfs.dht -e hex $1 2&gt;&amp;1|grep dht |cut -d = -f2`</div><div class='add'>+        layout2=`getfattr -n trusted.glusterfs.dht -e hex $2 2&gt;&amp;1|grep dht |cut -d = -f2`</div><div class='add'>+        layout3=`getfattr -n trusted.glusterfs.dht -e hex $3 2&gt;&amp;1|grep dht |cut -d = -f2`</div><div class='add'>+</div><div class='add'>+        ret=$(layout_compare $layout1 $layout2 $layout3)</div><div class='add'>+</div><div class='add'>+        if [ $ret -ne 0 ]</div><div class='add'>+        then</div><div class='add'>+                echo 1</div><div class='add'>+        else</div><div class='add'>+                echo 0</div><div class='add'>+        fi</div><div class='add'>+</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+BRICK_COUNT=3</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/${V0}0 $H0:$B0/${V0}1</div><div class='add'>+## set subvols-per-dir option</div><div class='add'>+TEST $CLI volume set $V0 subvols-per-directory 2</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+## Mount FUSE</div><div class='add'>+TEST glusterfs -s $H0 --volfile-id $V0 $M0;</div><div class='add'>+</div><div class='add'>+TEST mkdir $M0/dir{1..10} 2&gt;/dev/null;</div><div class='add'>+</div><div class='add'>+## Add-brick n run rebalance to force re-write of layout</div><div class='add'>+TEST $CLI volume add-brick $V0 $H0:$B0/${V0}2</div><div class='add'>+sleep 5;</div><div class='add'>+</div><div class='add'>+## trigger dir self heal on client</div><div class='add'>+TEST ls -l $M0 2&gt;/dev/null;</div><div class='add'>+</div><div class='add'>+TEST $CLI volume rebalance $V0 start force</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $REBALANCE_TIMEOUT "0" rebalance_completed</div><div class='add'>+</div><div class='add'>+## check for layout overlaps.</div><div class='add'>+EXPECT "0" get_layout $B0/${V0}0 $B0/${V0}1 $B0/${V0}2</div><div class='add'>+EXPECT "0" get_layout $B0/${V0}0/dir1 $B0/${V0}1/dir1 $B0/${V0}2/dir1</div><div class='add'>+EXPECT "0" get_layout $B0/${V0}0/dir2 $B0/${V0}1/dir2 $B0/${V0}2/dir2</div><div class='add'>+EXPECT "0" get_layout $B0/${V0}0/dir3 $B0/${V0}1/dir3 $B0/${V0}2/dir3</div><div class='add'>+EXPECT "0" get_layout $B0/${V0}0/dir4 $B0/${V0}1/dir4 $B0/${V0}2/dir4</div><div class='add'>+EXPECT "0" get_layout $B0/${V0}0/dir5 $B0/${V0}1/dir5 $B0/${V0}2/dir5</div><div class='add'>+EXPECT "0" get_layout $B0/${V0}0/dir6 $B0/${V0}1/dir6 $B0/${V0}2/dir6</div><div class='add'>+EXPECT "0" get_layout $B0/${V0}0/dir7 $B0/${V0}1/dir7 $B0/${V0}2/dir7</div><div class='add'>+EXPECT "0" get_layout $B0/${V0}0/dir8 $B0/${V0}1/dir8 $B0/${V0}2/dir8</div><div class='add'>+EXPECT "0" get_layout $B0/${V0}0/dir9 $B0/${V0}1/dir9 $B0/${V0}2/dir9</div><div class='add'>+EXPECT "0" get_layout $B0/${V0}0/dir10 $B0/${V0}1/dir10 $B0/${V0}2/dir10</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/distribute/bug-884597.t b/tests/bugs/distribute/bug-884597.t<br/>new file mode 100755<br/>index 00000000000..d6a2c65f370<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/distribute/bug-884597.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/distribute/bug-884597.t</a></div><div class='hunk'>@@ -0,0 +1,173 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../dht.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+BRICK_COUNT=3</div><div class='add'>+function uid_gid_compare()</div><div class='add'>+{</div><div class='add'>+        val=1</div><div class='add'>+</div><div class='add'>+        if [ "$1" == "$3" ]</div><div class='add'>+        then</div><div class='add'>+                if [ "$2" == "$4" ]</div><div class='add'>+                        then</div><div class='add'>+                                val=0</div><div class='add'>+                fi</div><div class='add'>+        fi</div><div class='add'>+        echo "$val"</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/${V0}0 $H0:$B0/${V0}1 $H0:$B0/${V0}2</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+## Mount FUSE</div><div class='add'>+TEST glusterfs --attribute-timeout=0 --entry-timeout=0 -s $H0 --volfile-id $V0 $M0;</div><div class='add'>+</div><div class='add'>+i=1</div><div class='add'>+NEW_UID=36</div><div class='add'>+NEW_GID=36</div><div class='add'>+</div><div class='add'>+TEST touch $M0/$i</div><div class='add'>+</div><div class='add'>+chown $NEW_UID:$NEW_GID $M0/$i</div><div class='add'>+## rename till file gets a linkfile</div><div class='add'>+</div><div class='add'>+has_link=0</div><div class='add'>+while [ $i -lt 100 ]</div><div class='add'>+do</div><div class='add'>+        mv $M0/$i $M0/$(( $i+1 ))</div><div class='add'>+        if [ $? -ne 0 ]</div><div class='add'>+        then</div><div class='add'>+                break</div><div class='add'>+        fi</div><div class='add'>+        let i++</div><div class='add'>+        file_has_linkfile $i</div><div class='add'>+        has_link=$?</div><div class='add'>+        if [ $has_link -eq 2 ]</div><div class='add'>+        then</div><div class='add'>+                break;</div><div class='add'>+        fi</div><div class='add'>+done</div><div class='add'>+</div><div class='add'>+TEST [ $has_link -eq 2 ]</div><div class='add'>+</div><div class='add'>+get_hashed_brick $i</div><div class='add'>+cached=$?</div><div class='add'>+</div><div class='add'>+# check if uid/gid on linkfile is created with correct uid/gid</div><div class='add'>+BACKEND_UID=`stat -c %u $B0/${V0}$cached/$i`;</div><div class='add'>+BACKEND_GID=`stat -c %g $B0/${V0}$cached/$i`;</div><div class='add'>+</div><div class='add'>+EXPECT "0" uid_gid_compare $NEW_UID $NEW_GID $BACKEND_UID $BACKEND_GID</div><div class='add'>+</div><div class='add'>+# remove linkfile from backend, and trigger a lookup heal. uid/gid should match</div><div class='add'>+rm -rf $B0/${V0}$cached/$i</div><div class='add'>+</div><div class='add'>+# without a unmount, we are not able to trigger a lookup based heal</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+</div><div class='add'>+## Mount FUSE</div><div class='add'>+TEST glusterfs --attribute-timeout=0 --entry-timeout=0 -s $H0 --volfile-id $V0 $M0;</div><div class='add'>+</div><div class='add'>+lookup=`ls -l $M0/$i 2&gt;/dev/null`</div><div class='add'>+</div><div class='add'>+# check if uid/gid on linkfile is created with correct uid/gid</div><div class='add'>+BACKEND_UID=`stat -c %u $B0/${V0}$cached/$i`;</div><div class='add'>+BACKEND_GID=`stat -c %g $B0/${V0}$cached/$i`;</div><div class='add'>+</div><div class='add'>+EXPECT "0" uid_gid_compare $NEW_UID $NEW_GID $BACKEND_UID $BACKEND_GID</div><div class='add'>+# create hardlinks. Make sure a linkfile gets created</div><div class='add'>+</div><div class='add'>+i=1</div><div class='add'>+NEW_UID=36</div><div class='add'>+NEW_GID=36</div><div class='add'>+</div><div class='add'>+TEST touch $M0/file</div><div class='add'>+chown $NEW_UID:$NEW_GID $M0/file;</div><div class='add'>+</div><div class='add'>+## ln till file gets a linkfile</div><div class='add'>+</div><div class='add'>+has_link=0</div><div class='add'>+while [ $i -lt 100 ]</div><div class='add'>+do</div><div class='add'>+        ln $M0/file $M0/link$i</div><div class='add'>+        if [ $? -ne 0 ]</div><div class='add'>+        then</div><div class='add'>+                break</div><div class='add'>+        fi</div><div class='add'>+        file_has_linkfile link$i</div><div class='add'>+        has_link=$?</div><div class='add'>+        if [ $has_link -eq 2 ]</div><div class='add'>+        then</div><div class='add'>+                break;</div><div class='add'>+        fi</div><div class='add'>+        let i++</div><div class='add'>+done</div><div class='add'>+</div><div class='add'>+TEST [ $has_link -eq 2 ]</div><div class='add'>+</div><div class='add'>+get_hashed_brick link$i</div><div class='add'>+cached=$?</div><div class='add'>+</div><div class='add'>+# check if uid/gid on linkfile is created with correct uid/gid</div><div class='add'>+BACKEND_UID=`stat -c %u $B0/${V0}$cached/link$i`;</div><div class='add'>+BACKEND_GID=`stat -c %g $B0/${V0}$cached/link$i`;</div><div class='add'>+</div><div class='add'>+EXPECT "0" uid_gid_compare $NEW_UID $NEW_GID $BACKEND_UID $BACKEND_GID</div><div class='add'>+</div><div class='add'>+## UID/GID creation as different user</div><div class='add'>+i=1</div><div class='add'>+NEW_UID=36</div><div class='add'>+NEW_GID=36</div><div class='add'>+</div><div class='add'>+TEST touch $M0/user_file1</div><div class='add'>+TEST chown $NEW_UID:$NEW_GID $M0/user_file1;</div><div class='add'>+</div><div class='add'>+## Give permission on volume, so that different users can perform rename</div><div class='add'>+</div><div class='add'>+TEST chmod 0777 $M0</div><div class='add'>+</div><div class='add'>+## Add a user known as ABC and perform renames</div><div class='add'>+TEST `useradd -M ABC 2&gt;/dev/null`</div><div class='add'>+</div><div class='add'>+TEST cd $M0</div><div class='add'>+## rename as different user till file gets a linkfile</div><div class='add'>+</div><div class='add'>+has_link=0</div><div class='add'>+while [ $i -lt 100 ]</div><div class='add'>+do</div><div class='add'>+        su -m ABC -c "mv $M0/user_file$i $M0/user_file$(( $i+1 ))"</div><div class='add'>+        if [ $? -ne 0 ]</div><div class='add'>+        then</div><div class='add'>+                break</div><div class='add'>+        fi</div><div class='add'>+        let i++</div><div class='add'>+        file_has_linkfile user_file$i</div><div class='add'>+        has_link=$?</div><div class='add'>+        if [ $has_link -eq 2 ]</div><div class='add'>+        then</div><div class='add'>+                break;</div><div class='add'>+        fi</div><div class='add'>+done</div><div class='add'>+</div><div class='add'>+TEST [ $has_link -eq 2 ]</div><div class='add'>+</div><div class='add'>+## del user ABC</div><div class='add'>+TEST userdel ABC</div><div class='add'>+</div><div class='add'>+get_hashed_brick user_file$i</div><div class='add'>+cached=$?</div><div class='add'>+</div><div class='add'>+# check if uid/gid on linkfile is created with correct uid/gid</div><div class='add'>+BACKEND_UID=`stat -c %u $B0/${V0}$cached/user_file$i`;</div><div class='add'>+BACKEND_GID=`stat -c %g $B0/${V0}$cached/user_file$i`;</div><div class='add'>+</div><div class='add'>+EXPECT "0" uid_gid_compare $NEW_UID $NEW_GID $BACKEND_UID $BACKEND_GID</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/distribute/bug-907072.t b/tests/bugs/distribute/bug-907072.t<br/>new file mode 100755<br/>index 00000000000..a4d98831380<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/distribute/bug-907072.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/distribute/bug-907072.t</a></div><div class='hunk'>@@ -0,0 +1,49 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../fileio.rc</div><div class='add'>+. $(dirname $0)/../../dht.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd;</div><div class='add'>+TEST pidof glusterd;</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/${V0}{0,1,2,3};</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+</div><div class='add'>+TEST glusterfs -s $H0 --volfile-id $V0 $M0;</div><div class='add'>+</div><div class='add'>+TEST mkdir $M0/test;</div><div class='add'>+</div><div class='add'>+# Extract the layout sans the commit hash</div><div class='add'>+OLD_LAYOUT0=`get_layout $B0/${V0}0/test | cut -c11-34`;</div><div class='add'>+OLD_LAYOUT1=`get_layout $B0/${V0}1/test | cut -c11-34`;</div><div class='add'>+OLD_LAYOUT2=`get_layout $B0/${V0}2/test | cut -c11-34`;</div><div class='add'>+OLD_LAYOUT3=`get_layout $B0/${V0}3/test | cut -c11-34`;</div><div class='add'>+</div><div class='add'>+TEST killall glusterfsd;</div><div class='add'>+</div><div class='add'>+# Delete directory on one brick</div><div class='add'>+TEST rm -rf $B0/${V}1/test;</div><div class='add'>+</div><div class='add'>+# And only layout xattr on another brick</div><div class='add'>+TEST setfattr -x trusted.glusterfs.dht $B0/${V0}2/test;</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0 force;</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+TEST glusterfs -s $H0 --volfile-id $V0 $M0;</div><div class='add'>+TEST stat $M0/test;</div><div class='add'>+</div><div class='add'>+# Extract the layout sans the commit hash</div><div class='add'>+NEW_LAYOUT0=`get_layout $B0/${V0}0/test | cut -c11-34`;</div><div class='add'>+NEW_LAYOUT1=`get_layout $B0/${V0}1/test | cut -c11-34`;</div><div class='add'>+NEW_LAYOUT2=`get_layout $B0/${V0}2/test | cut -c11-34`;</div><div class='add'>+NEW_LAYOUT3=`get_layout $B0/${V0}3/test | cut -c11-34`;</div><div class='add'>+</div><div class='add'>+EXPECT $OLD_LAYOUT0 echo $NEW_LAYOUT0;</div><div class='add'>+EXPECT $OLD_LAYOUT1 echo $NEW_LAYOUT1;</div><div class='add'>+EXPECT $OLD_LAYOUT2 echo $NEW_LAYOUT2;</div><div class='add'>+EXPECT $OLD_LAYOUT3 echo $NEW_LAYOUT3;</div><div class='head'>diff --git a/tests/bugs/distribute/bug-912564.t b/tests/bugs/distribute/bug-912564.t<br/>new file mode 100755<br/>index 00000000000..d437728f83b<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/distribute/bug-912564.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/distribute/bug-912564.t</a></div><div class='hunk'>@@ -0,0 +1,92 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+# Test that the rsync and "extra" regexes cause rename-in-place without</div><div class='add'>+# creating linkfiles, when they're supposed to.  Without the regex we'd have a</div><div class='add'>+# 1/4 chance of each file being assigned to the right place, so with 16 files</div><div class='add'>+# we have a 1/2^32 chance of getting the correct result by accident.</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+function count_linkfiles {</div><div class='add'>+	local i</div><div class='add'>+	local count=0</div><div class='add'>+	for i in $(seq $2 $3); do</div><div class='add'>+		x=$(find $1$i -perm -1000 | wc -l)</div><div class='add'>+		# Divide by two because of the .glusterfs links.</div><div class='add'>+		count=$((count+x/2))</div><div class='add'>+	done</div><div class='add'>+	echo $count</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+# This function only exists to get around quoting difficulties in TEST.</div><div class='add'>+function set_regex {</div><div class='add'>+	$CLI volume set $1 cluster.extra-hash-regex '^foo(.+)bar$'</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+</div><div class='add'>+mkdir -p $H0:$B0/${V0}0</div><div class='add'>+mkdir -p $H0:$B0/${V0}1</div><div class='add'>+mkdir -p $H0:$B0/${V0}2</div><div class='add'>+mkdir -p $H0:$B0/${V0}3</div><div class='add'>+</div><div class='add'>+# Create and start a volume.</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/${V0}0 $H0:$B0/${V0}1 \</div><div class='add'>+			    $H0:$B0/${V0}2 $H0:$B0/${V0}3</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT 'Started' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+# Mount it.</div><div class='add'>+TEST glusterfs --volfile-server=$H0 --volfile-id=$V0 $M0</div><div class='add'>+</div><div class='add'>+# Make sure the rsync regex works, by verifying that no linkfiles are</div><div class='add'>+# created.</div><div class='add'>+rm -f $M0/file*</div><div class='add'>+for i in $(seq 0 15); do</div><div class='add'>+	fn=$(printf file%x $i)</div><div class='add'>+	tmp_fn=$(printf .%s.%d $fn $RANDOM)</div><div class='add'>+	echo testing &gt; $M0/$tmp_fn</div><div class='add'>+	mv $M0/$tmp_fn $M0/$fn</div><div class='add'>+done</div><div class='add'>+lf=$(count_linkfiles $B0/$V0 0 3)</div><div class='add'>+TEST [ "$lf" -eq "0" ]</div><div class='add'>+</div><div class='add'>+# Make sure that linkfiles *are* created for normal files.</div><div class='add'>+rm -f $M0/file*</div><div class='add'>+for i in $(seq 0 15); do</div><div class='add'>+	fn=$(printf file%x $i)</div><div class='add'>+	tmp_fn=$(printf foo%sbar $fn)</div><div class='add'>+	echo testing &gt; $M0/$tmp_fn</div><div class='add'>+	mv $M0/$tmp_fn $M0/$fn</div><div class='add'>+done</div><div class='add'>+lf=$(count_linkfiles $B0/$V0 0 3)</div><div class='add'>+TEST [ "$lf" -ne "0" ]</div><div class='add'>+</div><div class='add'>+# Make sure that setting an extra regex suppresses the linkfiles.</div><div class='add'>+TEST set_regex $V0</div><div class='add'>+rm -f $M0/file*</div><div class='add'>+for i in $(seq 0 15); do</div><div class='add'>+	fn=$(printf file%x $i)</div><div class='add'>+	tmp_fn=$(printf foo%sbar $fn)</div><div class='add'>+	echo testing &gt; $M0/$tmp_fn</div><div class='add'>+	mv $M0/$tmp_fn $M0/$fn</div><div class='add'>+done</div><div class='add'>+lf=$(count_linkfiles $B0/$V0 0 3)</div><div class='add'>+TEST [ "$lf" -eq "0" ]</div><div class='add'>+</div><div class='add'>+# Re-test the rsync regex, to make sure the extra one didn't break it.</div><div class='add'>+rm -f $M0/file*</div><div class='add'>+for i in $(seq 0 15); do</div><div class='add'>+	fn=$(printf file%x $i)</div><div class='add'>+	tmp_fn=$(printf .%s.%d $fn $RANDOM)</div><div class='add'>+	echo testing &gt; $M0/$tmp_fn</div><div class='add'>+	mv $M0/$tmp_fn $M0/$fn</div><div class='add'>+done</div><div class='add'>+lf=$(count_linkfiles $B0/$V0 0 3)</div><div class='add'>+TEST [ "$lf" -eq "0" ]</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/bugs/distribute/bug-915554.t b/tests/bugs/distribute/bug-915554.t<br/>new file mode 100755<br/>index 00000000000..1f59008c56f<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/distribute/bug-915554.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/distribute/bug-915554.t</a></div><div class='hunk'>@@ -0,0 +1,76 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+#</div><div class='add'>+# Bug &lt;915554&gt;</div><div class='add'>+#</div><div class='add'>+# This test checks for a condition where a rebalance migrates a file and does</div><div class='add'>+# not preserve the original file size. This can occur due to hole preservation</div><div class='add'>+# logic in the file migration code. If a file size is aligned to a disk sector</div><div class='add'>+# boundary (512b) and the tail portion of the file is zero-filled, the file</div><div class='add'>+# may end up truncated to the end of the last data region in the file.</div><div class='add'>+#</div><div class='add'>+###</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../dht.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+</div><div class='add'>+BRICK_COUNT=3</div><div class='add'>+# create, start and mount a two brick DHT volume</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/${V0}0 $H0:$B0/${V0}1 $H0:$B0/${V0}2</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+TEST glusterfs --attribute-timeout=0 --entry-timeout=0 --gid-timeout=-1 -s $H0 --volfile-id $V0 $M0;</div><div class='add'>+</div><div class='add'>+i=1</div><div class='add'>+# Write some data to a file and extend such that the file is sparse to a sector</div><div class='add'>+# aligned boundary.</div><div class='add'>+echo test &gt; $M0/$i</div><div class='add'>+TEST truncate -s 1M $M0/$i</div><div class='add'>+</div><div class='add'>+# cache the original size</div><div class='add'>+SIZE1=`stat -c %s $M0/$i`</div><div class='add'>+</div><div class='add'>+# rename till file gets a linkfile</div><div class='add'>+</div><div class='add'>+while [ $i -ne 0 ]</div><div class='add'>+do</div><div class='add'>+        test=`mv $M0/$i $M0/$(( $i+1 )) 2&gt;/dev/null`</div><div class='add'>+        if [ $? -ne 0 ]</div><div class='add'>+        then</div><div class='add'>+                echo "rename failed"</div><div class='add'>+                break</div><div class='add'>+        fi</div><div class='add'>+        let i++</div><div class='add'>+        file_has_linkfile $i</div><div class='add'>+        has_link=$?</div><div class='add'>+        if [ $has_link -eq 2 ]</div><div class='add'>+        then</div><div class='add'>+                break;</div><div class='add'>+        fi</div><div class='add'>+done</div><div class='add'>+</div><div class='add'>+# start a rebalance (force option to overide checks) to trigger migration of</div><div class='add'>+# file</div><div class='add'>+</div><div class='add'>+TEST $CLI volume rebalance $V0 start force</div><div class='add'>+</div><div class='add'>+# check if rebalance has completed for up to 15 secs</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $REBALANCE_TIMEOUT "0" rebalance_completed</div><div class='add'>+</div><div class='add'>+# validate the file size after the migration</div><div class='add'>+SIZE2=`stat -c %s $M0/$i`</div><div class='add'>+</div><div class='add'>+TEST [ $SIZE1 -eq $SIZE2 ]</div><div class='add'>+</div><div class='add'>+TEST rm -f $M0/$i</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+TEST $CLI volume stop $V0</div><div class='add'>+TEST $CLI volume delete $V0</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/distribute/bug-921408.t b/tests/bugs/distribute/bug-921408.t<br/>new file mode 100755<br/>index 00000000000..559114bb85a<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/distribute/bug-921408.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/distribute/bug-921408.t</a></div><div class='hunk'>@@ -0,0 +1,90 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../fileio.rc</div><div class='add'>+. $(dirname $0)/../../dht.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+wait_check_status ()</div><div class='add'>+{</div><div class='add'>+        n=0</div><div class='add'>+        while [ $n -lt $1 ]</div><div class='add'>+        do</div><div class='add'>+                ret=$(rebalance_completed)</div><div class='add'>+                if [ $ret == "0" ]</div><div class='add'>+                then</div><div class='add'>+                        return 0;</div><div class='add'>+                else</div><div class='add'>+                        sleep 1</div><div class='add'>+                        n=`expr $n + 1`;</div><div class='add'>+                fi</div><div class='add'>+       done</div><div class='add'>+       return 1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+addbr_rebal_till_layout_change()</div><div class='add'>+{</div><div class='add'>+        val=1</div><div class='add'>+        l=$1</div><div class='add'>+        i=1</div><div class='add'>+        while [ $i -lt 5 ]</div><div class='add'>+        do</div><div class='add'>+                $CLI volume add-brick $V0 $H0:$B0/${V0}$l &amp;&gt;/dev/null</div><div class='add'>+                $CLI volume rebalance $V0 fix-layout start &amp;&gt;/dev/null</div><div class='add'>+                wait_check_status $REBALANCE_TIMEOUT</div><div class='add'>+                if [ $? -eq 1 ]</div><div class='add'>+                then</div><div class='add'>+                        break</div><div class='add'>+                fi</div><div class='add'>+                NEW_LAYOUT=`get_layout $B0/${V0}0 | cut -c11-34`</div><div class='add'>+                if [ $OLD_LAYOUT == $NEW_LAYOUT ]</div><div class='add'>+                then</div><div class='add'>+                        i=`expr $i + 1`;</div><div class='add'>+                        l=`expr $l + 1`;</div><div class='add'>+                else</div><div class='add'>+                        val=0</div><div class='add'>+                        break</div><div class='add'>+                fi</div><div class='add'>+        done</div><div class='add'>+        return $val</div><div class='add'>+}</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/${V0}0</div><div class='add'>+TEST $CLI volume set $V0 subvols-per-directory 1</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+TEST glusterfs -s $H0 --volfile-id $V0 $M0;</div><div class='add'>+</div><div class='add'>+TEST mkdir $M0/test</div><div class='add'>+TEST touch $M0/test/test</div><div class='add'>+</div><div class='add'>+fd=`fd_available`</div><div class='add'>+TEST fd_open $fd "rw" $M0/test/test</div><div class='add'>+</div><div class='add'>+OLD_LAYOUT=`get_layout $B0/${V0}0 | cut -c11-34`</div><div class='add'>+</div><div class='add'>+addbr_rebal_till_layout_change 1</div><div class='add'>+</div><div class='add'>+TEST [ $? -eq 0 ]</div><div class='add'>+</div><div class='add'>+for i in $(seq 1 1000)</div><div class='add'>+do</div><div class='add'>+	ls -l $M0/ &gt;/dev/null</div><div class='add'>+	ret=$?</div><div class='add'>+	if [ $ret != 0 ]</div><div class='add'>+	then</div><div class='add'>+		break</div><div class='add'>+	fi</div><div class='add'>+done</div><div class='add'>+</div><div class='add'>+TEST [ $ret == 0 ];</div><div class='add'>+TEST fd_close $fd;</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+TEST $CLI volume stop $V0</div><div class='add'>+TEST $CLI volume delete $V0</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/bugs/distribute/bug-924265.t b/tests/bugs/distribute/bug-924265.t<br/>new file mode 100755<br/>index 00000000000..67c21de97cb<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/distribute/bug-924265.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/distribute/bug-924265.t</a></div><div class='hunk'>@@ -0,0 +1,35 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+# Test that setting cluster.dht-xattr-name works, and that DHT consistently</div><div class='add'>+# uses the specified name instead of the default.</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+# We only care about the exit code, so keep it quiet.</div><div class='add'>+function silent_getfattr {</div><div class='add'>+    getfattr $* &amp;&gt; /dev/null</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+</div><div class='add'>+mkdir -p $H0:$B0/${V0}0</div><div class='add'>+</div><div class='add'>+# Create a volume and set the option.</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/${V0}0</div><div class='add'>+TEST $CLI volume set $V0 cluster.dht-xattr-name trusted.foo.bar</div><div class='add'>+</div><div class='add'>+# Start and mount the volume.</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT 'Started' volinfo_field $V0 'Status';</div><div class='add'>+TEST glusterfs --volfile-server=$H0 --volfile-id=$V0 $M0</div><div class='add'>+</div><div class='add'>+# Create a directory and make sure it has the right xattr.</div><div class='add'>+mkdir $M0/test</div><div class='add'>+TEST ! silent_getfattr -n trusted.glusterfs.dht $B0/${V0}0/test</div><div class='add'>+TEST silent_getfattr -n trusted.foo.bar $B0/${V0}0/test</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/bugs/distribute/bug-961615.t b/tests/bugs/distribute/bug-961615.t<br/>new file mode 100644<br/>index 00000000000..00938e8fa9b<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/distribute/bug-961615.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/distribute/bug-961615.t</a></div><div class='hunk'>@@ -0,0 +1,34 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+#This test tests that an extra fd_unref does not happen in rebalance</div><div class='add'>+#migration completion check code path in dht</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/${V0}0 $H0:$B0/${V0}1</div><div class='add'>+TEST $CLI volume set $V0 performance.quick-read off</div><div class='add'>+TEST $CLI volume set $V0 performance.io-cache off</div><div class='add'>+TEST $CLI volume set $V0 performance.write-behind off</div><div class='add'>+TEST $CLI volume set $V0 performance.stat-prefetch off</div><div class='add'>+TEST $CLI volume set $V0 performance.read-ahead off</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+TEST glusterfs --volfile-id=/$V0 --volfile-server=$H0 $M0 --attribute-timeout=0 --entry-timeout=0</div><div class='add'>+TEST touch $M0/1</div><div class='add'>+#This rename creates a link file for 10 in the other volume.</div><div class='add'>+TEST mv $M0/1 $M0/10</div><div class='add'>+#Lets keep writing to the file which will trigger rebalance completion check</div><div class='add'>+dd if=/dev/zero of=$M0/10 bs=1k &amp;</div><div class='add'>+bg_pid=$!</div><div class='add'>+#Now rebalance force will migrate file '10'</div><div class='add'>+TEST $CLI volume rebalance $V0 start force</div><div class='add'>+EXPECT_WITHIN $REBALANCE_TIMEOUT "completed" rebalance_status_field $V0</div><div class='add'>+#If the bug exists mount would have crashed by now</div><div class='add'>+TEST ls $M0</div><div class='add'>+kill -9 $bg_pid &gt; /dev/null 2&gt;&amp;1</div><div class='add'>+wait &gt; /dev/null 2&gt;&amp;1</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/bugs/distribute/bug-973073.t b/tests/bugs/distribute/bug-973073.t<br/>new file mode 100755<br/>index 00000000000..cdb785abac0<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/distribute/bug-973073.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/distribute/bug-973073.t</a></div><div class='hunk'>@@ -0,0 +1,48 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../dht.rc</div><div class='add'>+</div><div class='add'>+## Steps followed are one described in bugzilla</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+function get_layout()</div><div class='add'>+{</div><div class='add'>+        layout1=`getfattr -n trusted.glusterfs.dht -e hex $1 2&gt;&amp;1`</div><div class='add'>+</div><div class='add'>+        if [ $? -ne 0 ]</div><div class='add'>+        then</div><div class='add'>+                echo 1</div><div class='add'>+        else</div><div class='add'>+                echo 0</div><div class='add'>+        fi</div><div class='add'>+</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+BRICK_COUNT=3</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/${V0}0 $H0:$B0/${V0}1 $H0:$B0/${V0}2</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+## Mount FUSE</div><div class='add'>+TEST glusterfs -s $H0 --volfile-id $V0 $M0;</div><div class='add'>+</div><div class='add'>+TEST $CLI volume remove-brick $V0 $H0:$B0/${V0}2 start</div><div class='add'>+</div><div class='add'>+## remove-brick status == rebalance_status</div><div class='add'>+EXPECT_WITHIN $REBALANCE_TIMEOUT "0" remove_brick_completed</div><div class='add'>+</div><div class='add'>+TEST $CLI volume remove-brick $V0 $H0:$B0/${V0}2 stop</div><div class='add'>+</div><div class='add'>+TEST $CLI volume rebalance $V0 fix-layout start</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $REBALANCE_TIMEOUT "0" rebalance_completed</div><div class='add'>+</div><div class='add'>+TEST mkdir $M0/dir 2&gt;/dev/null;</div><div class='add'>+</div><div class='add'>+EXPECT "0" get_layout $B0/${V0}2/dir</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/distribute/issue-1327.t b/tests/bugs/distribute/issue-1327.t<br/>new file mode 100755<br/>index 00000000000..acd8c8c6614<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/distribute/issue-1327.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/distribute/issue-1327.t</a></div><div class='hunk'>@@ -0,0 +1,33 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+SCRIPT_TIMEOUT=250</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+. $(dirname $0)/../../dht.rc</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+</div><div class='add'>+BRICK1=$B0/${V0}-0</div><div class='add'>+BRICK2=$B0/${V0}-1</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 $H0:$BRICK1 $H0:$BRICK2</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+TEST glusterfs -s $H0 --volfile-id $V0 $M0</div><div class='add'>+TEST mkdir $M0/dir</div><div class='add'>+</div><div class='add'>+#remove dir from one of the brick</div><div class='add'>+TEST rmdir $BRICK2/dir</div><div class='add'>+</div><div class='add'>+#safe cache timeout for lookup to be triggered</div><div class='add'>+sleep 2</div><div class='add'>+</div><div class='add'>+TEST ls $M0/dir</div><div class='add'>+</div><div class='add'>+TEST stat $BRICK2/dir</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/bugs/distribute/overlap.py b/tests/bugs/distribute/overlap.py<br/>new file mode 100755<br/>index 00000000000..2813979787b<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/distribute/overlap.py?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/distribute/overlap.py</a></div><div class='hunk'>@@ -0,0 +1,59 @@</div><div class='add'>+</div><div class='add'>+from __future__ import print_function</div><div class='add'>+import sys</div><div class='add'>+</div><div class='add'>+def calculate_one (ov, nv):</div><div class='add'>+    old_start = int(ov[18:26], 16)</div><div class='add'>+    old_end = int(ov[26:34], 16)</div><div class='add'>+    new_start = int(nv[18:26], 16)</div><div class='add'>+    new_end = int(nv[26:34], 16)</div><div class='add'>+    if (new_end &lt; old_start) or (new_start &gt; old_end):</div><div class='add'>+        #print '%s, %s -&gt; ZERO' % (ov, nv)</div><div class='add'>+        return 0</div><div class='add'>+    all_start = max(old_start, new_start)</div><div class='add'>+    all_end = min(old_end, new_end)</div><div class='add'>+    #print '%s, %s -&gt; %08x' % (ov, nv, all_end - all_start + 1)</div><div class='add'>+    return all_end - all_start + 1</div><div class='add'>+</div><div class='add'>+def calculate_all (values):</div><div class='add'>+    total = 0</div><div class='add'>+    nv_index = len(values) // 2</div><div class='add'>+    for old_val in values[:nv_index]:</div><div class='add'>+        new_val = values[nv_index]</div><div class='add'>+        nv_index += 1</div><div class='add'>+        total += calculate_one(old_val, new_val)</div><div class='add'>+    return total</div><div class='add'>+</div><div class='add'>+"""</div><div class='add'>+test1_vals = [</div><div class='add'>+    '0x0000000000000000000000003fffffff',   # first quarter</div><div class='add'>+    '0x0000000000000000400000007fffffff',   # second quarter</div><div class='add'>+    '0x000000000000000080000000ffffffff',   # second half</div><div class='add'>+    '0x00000000000000000000000055555554',   # first third</div><div class='add'>+    '0x000000000000000055555555aaaaaaa9',   # second third</div><div class='add'>+    '0x0000000000000000aaaaaaaaffffffff',   # last third</div><div class='add'>+]</div><div class='add'>+</div><div class='add'>+test2_vals = [</div><div class='add'>+    '0x0000000000000000000000003fffffff',   # first quarter</div><div class='add'>+    '0x0000000000000000400000007fffffff',   # second quarter</div><div class='add'>+    '0x000000000000000080000000ffffffff',   # second half</div><div class='add'>+    '0x00000000000000000000000055555554',   # first third</div><div class='add'>+    # Next two are (incorrectly) swapped.</div><div class='add'>+    '0x0000000000000000aaaaaaaaffffffff',   # last third</div><div class='add'>+    '0x000000000000000055555555aaaaaaa9',   # second third</div><div class='add'>+]</div><div class='add'>+</div><div class='add'>+print '%08x' % calculate_one(test1_vals[0], test1_vals[3])</div><div class='add'>+print '%08x' % calculate_one(test1_vals[1], test1_vals[4])</div><div class='add'>+print '%08x' % calculate_one(test1_vals[2], test1_vals[5])</div><div class='add'>+print '= %08x' % calculate_all(test1_vals)</div><div class='add'>+print '%08x' % calculate_one(test2_vals[0], test2_vals[3])</div><div class='add'>+print '%08x' % calculate_one(test2_vals[1], test2_vals[4])</div><div class='add'>+print '%08x' % calculate_one(test2_vals[2], test2_vals[5])</div><div class='add'>+print '= %08x' % calculate_all(test2_vals)</div><div class='add'>+"""</div><div class='add'>+</div><div class='add'>+if __name__ == '__main__':</div><div class='add'>+    # Return decimal so bash can reason about it.</div><div class='add'>+    print('%d' % calculate_all(sys.argv[1:]))</div><div class='head'>diff --git a/tests/bugs/ec/bug-1161621.t b/tests/bugs/ec/bug-1161621.t<br/>new file mode 100644<br/>index 00000000000..84361e440dc<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/ec/bug-1161621.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/ec/bug-1161621.t</a></div><div class='hunk'>@@ -0,0 +1,42 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../traps.rc</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 disperse 5 redundancy 2 $H0:$B0/${V0}{0..4}</div><div class='add'>+EXPECT "Created" volinfo_field $V0 'Status'</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "Started" volinfo_field $V0 'Status'</div><div class='add'>+TEST $GFS --volfile-id=/$V0 --volfile-server=$H0 $M0</div><div class='add'>+TEST $GFS --volfile-id=/$V0 --volfile-server=$H0 $M1</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "5" ec_child_up_count $V0 0</div><div class='add'>+</div><div class='add'>+tmpdir=$(mktemp -d -t ${0##*/}.XXXXXX)</div><div class='add'>+push_trapfunc "rm -rf $tmpdir"</div><div class='add'>+</div><div class='add'>+TEST dd if=/dev/urandom of=$tmpdir/file bs=1234 count=20</div><div class='add'>+cs=$(sha1sum $tmpdir/file | awk '{ print $1 }')</div><div class='add'>+# Test O_APPEND on create</div><div class='add'>+TEST dd if=$tmpdir/file of=$M0/file bs=1234 count=10 oflag=append</div><div class='add'>+# Test O_APPEND on open</div><div class='add'>+TEST dd if=$tmpdir/file of=$M0/file bs=1234 skip=10 oflag=append conv=notrunc</div><div class='add'>+EXPECT "$cs" echo $(sha1sum $M0/file | awk '{ print $1 }')</div><div class='add'>+</div><div class='add'>+# Fill a file with ff (I don't use 0's because empty holes created by an</div><div class='add'>+# incorrect offset will be returned as 0's and won't be detected)</div><div class='add'>+dd if=/dev/zero bs=24680 count=1000 | tr '\0' '\377' &gt;$tmpdir/shared</div><div class='add'>+cs=$(sha1sum $tmpdir/shared | awk '{ print $1 }')</div><div class='add'>+# Test concurrent writes to the same file using O_APPEND</div><div class='add'>+dd if=$tmpdir/shared of=$M0/shared bs=123400 count=100 oflag=append conv=notrunc &amp;</div><div class='add'>+dd if=$tmpdir/shared of=$M1/shared bs=123400 count=100 oflag=append conv=notrunc &amp;</div><div class='add'>+wait</div><div class='add'>+</div><div class='add'>+EXPECT "24680000" stat -c "%s" $M0/shared</div><div class='add'>+EXPECT "$cs" echo $(sha1sum $M0/shared | awk '{ print $1 }')</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/bugs/ec/bug-1161886.c b/tests/bugs/ec/bug-1161886.c<br/>new file mode 100644<br/>index 00000000000..1f12650ea6d<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/ec/bug-1161886.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/ec/bug-1161886.c</a></div><div class='hunk'>@@ -0,0 +1,53 @@</div><div class='add'>+</div><div class='add'>+#include &lt;stdio.h&gt;</div><div class='add'>+#include &lt;glusterfs/api/glfs.h&gt;</div><div class='add'>+#include &lt;glusterfs/api/glfs-handles.h&gt;</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+main(int argc, char *argv[])</div><div class='add'>+{</div><div class='add'>+    glfs_t *fs = NULL;</div><div class='add'>+    glfs_fd_t *fd = NULL;</div><div class='add'>+    int ret = 1;</div><div class='add'>+</div><div class='add'>+    if (argc != 4) {</div><div class='add'>+        fprintf(stderr, "Syntax: %s &lt;host&gt; &lt;volname&gt; &lt;file&gt;\n", argv[0]);</div><div class='add'>+        return 1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    fs = glfs_new(argv[2]);</div><div class='add'>+    if (!fs) {</div><div class='add'>+        fprintf(stderr, "glfs_new: returned NULL\n");</div><div class='add'>+        return 1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = glfs_set_volfile_server(fs, "tcp", argv[1], 24007);</div><div class='add'>+    if (ret != 0) {</div><div class='add'>+        fprintf(stderr, "glfs_set_volfile_server: returned %d\n", ret);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    ret = glfs_set_logging(fs, "/dev/null", 7);</div><div class='add'>+    if (ret != 0) {</div><div class='add'>+        fprintf(stderr, "glfs_set_logging: returned %d\n", ret);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    ret = glfs_init(fs);</div><div class='add'>+    if (ret != 0) {</div><div class='add'>+        fprintf(stderr, "glfs_init: returned %d\n", ret);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    fd = glfs_open(fs, argv[3], O_RDWR | O_TRUNC);</div><div class='add'>+    if (fd == NULL) {</div><div class='add'>+        fprintf(stderr, "glfs_open: returned NULL\n");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    glfs_close(fd);</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    glfs_fini(fs);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='head'>diff --git a/tests/bugs/ec/bug-1161886.t b/tests/bugs/ec/bug-1161886.t<br/>new file mode 100644<br/>index 00000000000..e7322210a3e<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/ec/bug-1161886.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/ec/bug-1161886.t</a></div><div class='hunk'>@@ -0,0 +1,44 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+function check_ec_size</div><div class='add'>+{</div><div class='add'>+    local res</div><div class='add'>+</div><div class='add'>+    for i in {0..2}; do</div><div class='add'>+        res=$(( `getfattr -n trusted.ec.size -e hex $B0/$V0$i/$1 | sed -n "s/^trusted.ec.size=//p"` ))</div><div class='add'>+        if [ "x$res" == "x" -o "$res" != "$2" ]; then</div><div class='add'>+            echo "N"</div><div class='add'>+            return 0</div><div class='add'>+        fi</div><div class='add'>+    done</div><div class='add'>+    echo "Y"</div><div class='add'>+    return 0</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 redundancy 1 $H0:$B0/${V0}{0..2}</div><div class='add'>+EXPECT "Created" volinfo_field $V0 'Status'</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "Started" volinfo_field $V0 'Status'</div><div class='add'>+TEST $GFS --volfile-id=/$V0 --volfile-server=$H0 $M0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "3" ec_child_up_count $V0 0</div><div class='add'>+</div><div class='add'>+TEST dd if=/dev/zero of=$M0/file1 bs=4k count=1</div><div class='add'>+TEST mv $M0/file1 $M0/file2</div><div class='add'>+TEST ! stat $M0/file1</div><div class='add'>+TEST stat $M0/file2</div><div class='add'>+</div><div class='add'>+TEST build_tester $(dirname $0)/bug-1161886.c -lgfapi -Wall -O2</div><div class='add'>+TEST $(dirname $0)/bug-1161886 $H0 $V0 /file2</div><div class='add'>+EXPECT "^0$" stat -c "%s" $M0/file2</div><div class='add'>+EXPECT "^Y$" check_ec_size file2 0</div><div class='add'>+</div><div class='add'>+rm -f $(dirname $0)/bug-1161886</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/bugs/ec/bug-1179050.t b/tests/bugs/ec/bug-1179050.t<br/>new file mode 100644<br/>index 00000000000..ea2d7b39838<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/ec/bug-1179050.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/ec/bug-1179050.t</a></div><div class='hunk'>@@ -0,0 +1,23 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 redundancy 1 $H0:$B0/${V0}{0..2}</div><div class='add'>+EXPECT "Created" volinfo_field $V0 'Status'</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "Started" volinfo_field $V0 'Status'</div><div class='add'>+TEST $GFS --volfile-id=/$V0 --volfile-server=$H0 $M0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "3" ec_child_up_count $V0 0</div><div class='add'>+</div><div class='add'>+TEST $CLI volume clear-locks $V0 / kind all inode</div><div class='add'>+</div><div class='add'>+sleep 1</div><div class='add'>+</div><div class='add'>+EXPECT "3" ec_child_up_count $V0 0</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/bugs/ec/bug-1187474.t b/tests/bugs/ec/bug-1187474.t<br/>new file mode 100644<br/>index 00000000000..e6344c26e73<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/ec/bug-1187474.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/ec/bug-1187474.t</a></div><div class='hunk'>@@ -0,0 +1,43 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+. $(dirname $0)/../../nfs.rc</div><div class='add'>+</div><div class='add'>+#G_TESTDEF_TEST_STATUS_CENTOS6=NFS_TEST</div><div class='add'>+</div><div class='add'>+function check_dir()</div><div class='add'>+{</div><div class='add'>+    local count</div><div class='add'>+</div><div class='add'>+    count=`ls $1 | grep "dir.[0-9]*" | wc -l`</div><div class='add'>+    if [[ $count -eq 100 ]]; then</div><div class='add'>+        echo "Y"</div><div class='add'>+    else</div><div class='add'>+        echo "N"</div><div class='add'>+    fi</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 redundancy 2 $H0:$B0/${V0}{0..5}</div><div class='add'>+EXPECT "Created" volinfo_field $V0 'Status'</div><div class='add'>+TEST $CLI volume set $V0 nfs.disable false</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "Started" volinfo_field $V0 'Status'</div><div class='add'>+EXPECT_WITHIN $NFS_EXPORT_TIMEOUT "1" is_nfs_export_available</div><div class='add'>+TEST mount_nfs $H0:/$V0 $N0</div><div class='add'>+TEST $GFS --volfile-id=/$V0 --volfile-server=$H0 $M0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "6" ec_child_up_count $V0 0</div><div class='add'>+</div><div class='add'>+TEST mkdir $M0/dir.{1..100}</div><div class='add'>+</div><div class='add'>+sleep 2</div><div class='add'>+</div><div class='add'>+EXPECT "Y" check_dir $N0</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" umount_nfs $N0</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/bugs/ec/bug-1188145.t b/tests/bugs/ec/bug-1188145.t<br/>new file mode 100644<br/>index 00000000000..aa3a59bc62f<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/ec/bug-1188145.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/ec/bug-1188145.t</a></div><div class='hunk'>@@ -0,0 +1,50 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+function create_dirs()</div><div class='add'>+{</div><div class='add'>+    local stop=$1</div><div class='add'>+    local idx</div><div class='add'>+    local res</div><div class='add'>+</div><div class='add'>+    res=0</div><div class='add'>+    idx=1</div><div class='add'>+    while [[ -f ${stop} ]]; do</div><div class='add'>+        mkdir $M0/${idx}</div><div class='add'>+        if [[ $? -ne 0 ]]; then</div><div class='add'>+            res=1</div><div class='add'>+            break;</div><div class='add'>+        fi</div><div class='add'>+        idx=$(( idx + 1 ))</div><div class='add'>+    done</div><div class='add'>+</div><div class='add'>+    return ${res}</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 redundancy 2 $H0:$B0/${V0}{0..5}</div><div class='add'>+EXPECT "Created" volinfo_field $V0 'Status'</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "Started" volinfo_field $V0 'Status'</div><div class='add'>+TEST $GFS --volfile-id=/$V0 --volfile-server=$H0 $M0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "6" ec_child_up_count $V0 0</div><div class='add'>+</div><div class='add'>+name=`mktemp -t ${0##*/}.XXXXXX`</div><div class='add'>+create_dirs ${name} &amp;</div><div class='add'>+pid=$!</div><div class='add'>+</div><div class='add'>+sleep 2</div><div class='add'>+TEST $CLI volume set $V0 uss on</div><div class='add'>+sleep 5</div><div class='add'>+TEST $CLI volume set $V0 uss off</div><div class='add'>+sleep 5</div><div class='add'>+</div><div class='add'>+TEST rm -f ${name}</div><div class='add'>+TEST wait ${pid}</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/bugs/ec/bug-1227869.t b/tests/bugs/ec/bug-1227869.t<br/>new file mode 100644<br/>index 00000000000..00fad825fae<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/ec/bug-1227869.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/ec/bug-1227869.t</a></div><div class='hunk'>@@ -0,0 +1,33 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='add'>+</div><div class='add'>+QDD=$(dirname $0)/quota</div><div class='add'>+# compile the test write program and run it</div><div class='add'>+build_tester $(dirname $0)/../../basic/quota.c -o $QDD</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 disperse 3 $H0:$B0/${V0}{1..3}</div><div class='add'>+EXPECT "Created" volinfo_field $V0 'Status'</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "Started" volinfo_field $V0 'Status'</div><div class='add'>+</div><div class='add'>+TEST $CLI volume quota $V0 enable</div><div class='add'>+TEST $CLI volume quota $V0 limit-usage / 100MB</div><div class='add'>+</div><div class='add'>+TEST $GFS --volfile-id=/$V0 --volfile-server=$H0 $M0</div><div class='add'>+</div><div class='add'>+TEST $QDD $M0/file 256 40</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $MARKER_UPDATE_TIMEOUT "10.0MB" quotausage "/"</div><div class='add'>+</div><div class='add'>+EXPECT "0" echo $(df -k $M0 | grep -q '10240 '; echo $?)</div><div class='add'>+EXPECT "0" echo $(df -k $M0 | grep -q '92160 '; echo $?)</div><div class='add'>+</div><div class='add'>+rm -f $QDD</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/bugs/ec/bug-1236065.t b/tests/bugs/ec/bug-1236065.t<br/>new file mode 100644<br/>index 00000000000..9181e73ec19<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/ec/bug-1236065.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/ec/bug-1236065.t</a></div><div class='hunk'>@@ -0,0 +1,95 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+SCRIPT_TIMEOUT=400</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='add'>+</div><div class='add'>+ec_test_dir=$M0/test</div><div class='add'>+</div><div class='add'>+function ec_test_generate_src()</div><div class='add'>+{</div><div class='add'>+    mkdir -p $ec_test_dir</div><div class='add'>+    for i in `seq 0 19`; do</div><div class='add'>+        dd if=/dev/zero of=$ec_test_dir/$i.c bs=1024 count=2</div><div class='add'>+    done</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function ec_test_make()</div><div class='add'>+{</div><div class='add'>+    for i in `ls *.c`; do</div><div class='add'>+        file=`basename $i`</div><div class='add'>+        filename=${file%.*}</div><div class='add'>+        cp $i $filename.o</div><div class='add'>+    done</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+## step 1</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 disperse 7 redundancy 3 $H0:$B0/${V0}{0..6}</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+TEST glusterfs --entry-timeout=0 --attribute-timeout=0 -s $H0 --volfile-id $V0 $M0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "7" ec_child_up_count $V0 0</div><div class='add'>+</div><div class='add'>+## step 2</div><div class='add'>+TEST ec_test_generate_src</div><div class='add'>+</div><div class='add'>+cd $ec_test_dir</div><div class='add'>+TEST ec_test_make</div><div class='add'>+</div><div class='add'>+## step 3</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}0</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}1</div><div class='add'>+EXPECT '5' online_brick_count</div><div class='add'>+</div><div class='add'>+TEST rm -f *.o</div><div class='add'>+TEST ec_test_make</div><div class='add'>+</div><div class='add'>+## step 4</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "7" online_brick_count</div><div class='add'>+</div><div class='add'>+# active heal</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "Y" glustershd_up_status</div><div class='add'>+TEST $CLI volume heal $V0 full</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "^0$" get_pending_heal_count $V0</div><div class='add'>+</div><div class='add'>+TEST rm -f *.o</div><div class='add'>+TEST ec_test_make</div><div class='add'>+</div><div class='add'>+## step 5</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}2</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}3</div><div class='add'>+EXPECT '5' online_brick_count</div><div class='add'>+</div><div class='add'>+TEST rm -f *.o</div><div class='add'>+TEST ec_test_make</div><div class='add'>+</div><div class='add'>+EXPECT '5' online_brick_count</div><div class='add'>+</div><div class='add'>+## step 6</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "7" online_brick_count</div><div class='add'>+</div><div class='add'>+# self-healing</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "Y" glustershd_up_status</div><div class='add'>+TEST $CLI volume heal $V0 full</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "^0$" get_pending_heal_count $V0</div><div class='add'>+</div><div class='add'>+TEST rm -f *.o</div><div class='add'>+TEST ec_test_make</div><div class='add'>+</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+EXPECT "$V0" volinfo_field $V0 'Volume Name'</div><div class='add'>+EXPECT 'Started' volinfo_field $V0 'Status'</div><div class='add'>+EXPECT '7' online_brick_count</div><div class='add'>+## cleanup</div><div class='add'>+cd</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+TEST $CLI volume stop $V0</div><div class='add'>+TEST $CLI volume delete $V0</div><div class='add'>+TEST rm -rf $B0/*</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/ec/bug-1251446.t b/tests/bugs/ec/bug-1251446.t<br/>new file mode 100644<br/>index 00000000000..5779c2e973b<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/ec/bug-1251446.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/ec/bug-1251446.t</a></div><div class='hunk'>@@ -0,0 +1,50 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 disperse 4 redundancy 1 $H0:$B0/${V0}{0..3}</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+TEST glusterfs --entry-timeout=0 --attribute-timeout=0 -s $H0 --volfile-id $V0 $M0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "4" ec_child_up_count $V0 0</div><div class='add'>+</div><div class='add'>+TEST dd if=/dev/urandom of=$M0/test1 bs=1024k count=2</div><div class='add'>+cs=$(sha1sum $M0/test1 | awk '{ print $1 }')</div><div class='add'>+</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}0</div><div class='add'>+EXPECT '3' online_brick_count</div><div class='add'>+</div><div class='add'>+TEST cp $M0/test1 $M0/test2</div><div class='add'>+EXPECT "$cs" echo $(sha1sum $M0/test2 | awk '{ print $1 }')</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT '4' online_brick_count</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "Y" glustershd_up_status</div><div class='add'>+TEST $CLI volume heal $V0 full</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "^0$" get_pending_heal_count $V0</div><div class='add'>+</div><div class='add'>+EXPECT "699392" stat -c "%s" $B0/${V0}0/test2</div><div class='add'>+</div><div class='add'>+# force cache clear</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+TEST $CLI volume stop $V0</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+TEST glusterfs --entry-timeout=0 --attribute-timeout=0 -s $H0 --volfile-id $V0 $M0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "4" ec_child_up_count $V0 0</div><div class='add'>+</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}3</div><div class='add'>+EXPECT '3' online_brick_count</div><div class='add'>+</div><div class='add'>+EXPECT "$cs" echo $(sha1sum $M0/test2 | awk '{ print $1 }')</div><div class='add'>+</div><div class='add'>+## cleanup</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+TEST $CLI volume stop $V0</div><div class='add'>+TEST $CLI volume delete $V0</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/ec/bug-1304988.t b/tests/bugs/ec/bug-1304988.t<br/>new file mode 100755<br/>index 00000000000..334e5c25932<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/ec/bug-1304988.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/ec/bug-1304988.t</a></div><div class='hunk'>@@ -0,0 +1,42 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+# This test renames files from dir to test and vice versa in an infinite loop</div><div class='add'>+# at the same time add-brick and rebalance starts which should NOT be hanged</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+function rename_files {</div><div class='add'>+while :</div><div class='add'>+do</div><div class='add'>+        for i in {1..100}; do mv $M0/dir/file-$i $M0/test/newfile-$i; done</div><div class='add'>+        for i in {1..100}; do mv $M0/test/newfile-$i $M0/dir/file-$i; done</div><div class='add'>+done</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 disperse 6 redundancy 2 $H0:$B0/${V0}{0..5}</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+TEST glusterfs --entry-timeout=0 --attribute-timeout=0 -s $H0 --volfile-id $V0 $M0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "6" ec_child_up_count $V0 0</div><div class='add'>+</div><div class='add'>+mkdir $M0/dir</div><div class='add'>+mkdir $M0/test</div><div class='add'>+touch $M0/dir/file-{1..100}</div><div class='add'>+rename_files &amp;</div><div class='add'>+back_pid1=$!;</div><div class='add'>+echo "Started rename $back_pid1"</div><div class='add'>+</div><div class='add'>+TEST $CLI volume add-brick $V0 $H0:$B0/${V0}{6..11}</div><div class='add'>+TEST $CLI volume rebalance $V0 start force</div><div class='add'>+</div><div class='add'>+#Test if rebalance completed with success.</div><div class='add'>+EXPECT_WITHIN $REBALANCE_TIMEOUT "completed" rebalance_status_field $V0</div><div class='add'>+echo "rebalance done..."</div><div class='add'>+kill $back_pid1</div><div class='add'>+cleanup;</div><div class='add'>+#G_TESTDEF_TEST_STATUS_NETBSD7=BAD_TEST,BUG=1332022</div><div class='add'>+#G_TESTDEF_TEST_STATUS_CENTOS6=BAD_TEST,BUG=1332022</div><div class='head'>diff --git a/tests/bugs/ec/bug-1547662.t b/tests/bugs/ec/bug-1547662.t<br/>new file mode 100644<br/>index 00000000000..5748218587e<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/ec/bug-1547662.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/ec/bug-1547662.t</a></div><div class='hunk'>@@ -0,0 +1,41 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+# Immediately after replace-brick, trusted.ec.version will be absent, so if it</div><div class='add'>+# is present we can assume that heal was started on root</div><div class='add'>+function root_heal_attempted {</div><div class='add'>+        if [ -z $(get_hex_xattr trusted.ec.version $1) ]; then</div><div class='add'>+                echo "N"</div><div class='add'>+        else</div><div class='add'>+                echo "Y"</div><div class='add'>+        fi</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST ${CLI} volume create ${V0} disperse 6 redundancy 2 ${H0}:${B0}/${V0}{0..5}</div><div class='add'>+TEST ${CLI} volume start ${V0}</div><div class='add'>+TEST ${GFS} --volfile-server ${H0} --volfile-id ${V0} ${M0}</div><div class='add'>+EXPECT_WITHIN ${CHILD_UP_TIMEOUT} "6" ec_child_up_count ${V0} 0</div><div class='add'>+</div><div class='add'>+TEST mkdir ${M0}/base</div><div class='add'>+TEST mkdir ${M0}/base/dir.{1,2}</div><div class='add'>+TEST mkdir ${M0}/base/dir.{1,2}/dir.{1,2}</div><div class='add'>+TEST mkdir ${M0}/base/dir.{1,2}/dir.{1,2}/dir.{1,2}</div><div class='add'>+TEST mkdir ${M0}/base/dir.{1,2}/dir.{1,2}/dir.{1,2}/dir.{1,2}</div><div class='add'>+TEST mkdir ${M0}/base/dir.{1,2}/dir.{1,2}/dir.{1,2}/dir.{1,2}/dir.{1,2}</div><div class='add'>+TEST mkdir ${M0}/base/dir.{1,2}/dir.{1,2}/dir.{1,2}/dir.{1,2}/dir.{1,2}/dir.{1,2}</div><div class='add'>+</div><div class='add'>+TEST ${CLI} volume replace-brick ${V0} ${H0}:${B0}/${V0}5 ${H0}:${B0}/${V0}6 commit force</div><div class='add'>+EXPECT_WITHIN ${CHILD_UP_TIMEOUT} "6" ec_child_up_count ${V0} 0</div><div class='add'>+EXPECT_WITHIN ${PROCESS_UP_TIMEOUT} "Y" glustershd_up_status</div><div class='add'>+EXPECT_WITHIN ${CHILD_UP_TIMEOUT} "6" ec_child_up_count_shd ${V0} 0</div><div class='add'>+EXPECT_WITHIN ${HEAL_TIMEOUT} "Y" root_heal_attempted ${B0}/${V0}6</div><div class='add'>+EXPECT_WITHIN ${HEAL_TIMEOUT} "^0$" get_pending_heal_count ${V0}</div><div class='add'>+EXPECT "^127$" echo $(find ${B0}/${V0}6/base -type d | wc -l)</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/ec/bug-1699866-check-reopen-fd.t b/tests/bugs/ec/bug-1699866-check-reopen-fd.t<br/>new file mode 100644<br/>index 00000000000..4386d010318<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/ec/bug-1699866-check-reopen-fd.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/ec/bug-1699866-check-reopen-fd.t</a></div><div class='hunk'>@@ -0,0 +1,34 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+. $(dirname $0)/../../fileio.rc</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 disperse 6 redundancy 2 $H0:$B0/${V0}{0..5}</div><div class='add'>+TEST $CLI volume heal $V0 disable</div><div class='add'>+TEST $CLI volume set $V0 disperse.background-heals 0</div><div class='add'>+TEST $CLI volume set $V0 write-behind off</div><div class='add'>+TEST $CLI volume set $V0 open-behind off</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+TEST glusterfs --entry-timeout=0 --attribute-timeout=0 -s $H0 --volfile-id $V0 $M0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "6" ec_child_up_count $V0 0</div><div class='add'>+</div><div class='add'>+TEST mkdir -p $M0/dir</div><div class='add'>+</div><div class='add'>+fd="$(fd_available)"</div><div class='add'>+</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "5" ec_child_up_count $V0 0</div><div class='add'>+</div><div class='add'>+TEST fd_open ${fd} rw $M0/dir/test</div><div class='add'>+TEST fd_write ${fd} "test1"</div><div class='add'>+TEST $CLI volume replace-brick ${V0} $H0:$B0/${V0}0 $H0:$B0/${V0}0_1 commit force</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "6" ec_child_up_count $V0 0</div><div class='add'>+TEST fd_write ${fd} "test2"</div><div class='add'>+TEST fd_close ${fd}</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/bugs/ec/bug-1708156-honor-inodelk-contention-notify-on-partial-locks.t b/tests/bugs/ec/bug-1708156-honor-inodelk-contention-notify-on-partial-locks.t<br/>new file mode 100644<br/>index 00000000000..67fdb184b46<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/ec/bug-1708156-honor-inodelk-contention-notify-on-partial-locks.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/ec/bug-1708156-honor-inodelk-contention-notify-on-partial-locks.t</a></div><div class='hunk'>@@ -0,0 +1,54 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+function do_ls() {</div><div class='add'>+    local dir="${1}"</div><div class='add'>+    local i</div><div class='add'>+</div><div class='add'>+    for i in {1..50}; do</div><div class='add'>+        ls -l $M0/${dir} &gt;/dev/null &amp;</div><div class='add'>+        ls -l $M1/${dir} &gt;/dev/null &amp;</div><div class='add'>+        ls -l $M2/${dir} &gt;/dev/null &amp;</div><div class='add'>+        ls -l $M3/${dir} &gt;/dev/null &amp;</div><div class='add'>+    done</div><div class='add'>+    wait</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function measure_time() {</div><div class='add'>+    {</div><div class='add'>+        LC_ALL=C</div><div class='add'>+        time -p "${@}"</div><div class='add'>+    } 2&gt;&amp;1 | awk '/^real/ { print $2 * 1000 }'</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 disperse 6 redundancy 2 $H0:$B0/${V0}{0..5}</div><div class='add'>+</div><div class='add'>+TEST $CLI volume set $V0 disperse.eager-lock on</div><div class='add'>+TEST $CLI volume set $V0 disperse.other-eager-lock on</div><div class='add'>+TEST $CLI volume set $V0 features.locks-notify-contention on</div><div class='add'>+TEST $CLI volume set $V0 disperse.eager-lock-timeout 10</div><div class='add'>+TEST $CLI volume set $V0 disperse.other-eager-lock-timeout 10</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+TEST $GFS --volfile-id=/$V0 --volfile-server=$H0 $M0</div><div class='add'>+TEST $GFS --volfile-id=/$V0 --volfile-server=$H0 $M1</div><div class='add'>+TEST $GFS --volfile-id=/$V0 --volfile-server=$H0 $M2</div><div class='add'>+TEST $GFS --volfile-id=/$V0 --volfile-server=$H0 $M3</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "6" ec_child_up_count $V0 0 $M0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "6" ec_child_up_count $V0 0 $M1</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "6" ec_child_up_count $V0 0 $M2</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "6" ec_child_up_count $V0 0 $M3</div><div class='add'>+TEST mkdir $M0/dir</div><div class='add'>+TEST touch $M0/dir/file.{1..10}</div><div class='add'>+</div><div class='add'>+# Run multiple 'ls' concurrently from multiple clients so that they collide and</div><div class='add'>+# cause partial locks.</div><div class='add'>+TEST [[ $(measure_time do_ls dir) -lt 10000 ]]</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/bugs/error-gen/bug-767095.t b/tests/bugs/error-gen/bug-767095.t<br/>new file mode 100755<br/>index 00000000000..6cc254f559d<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/error-gen/bug-767095.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/error-gen/bug-767095.t</a></div><div class='hunk'>@@ -0,0 +1,51 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+## Start and create a volume</div><div class='add'>+TEST glusterd;</div><div class='add'>+TEST pidof glusterd;</div><div class='add'>+TEST $CLI volume info;</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 replica 3 $H0:$B0/${V0}{1,2,3,4,5,6};</div><div class='add'>+</div><div class='add'>+function volinfo_field()</div><div class='add'>+{</div><div class='add'>+    local vol=$1;</div><div class='add'>+    local field=$2;</div><div class='add'>+</div><div class='add'>+    $CLI volume info $vol | grep "^$field: " | sed 's/.*: //';</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+dump_dir='/tmp/gerrit_glusterfs'</div><div class='add'>+TEST mkdir -p $dump_dir;</div><div class='add'>+## Verify volume is is created</div><div class='add'>+EXPECT "$V0" volinfo_field $V0 'Volume Name';</div><div class='add'>+EXPECT 'Created' volinfo_field $V0 'Status';</div><div class='add'>+TEST $CLI volume set $V0 error-gen posix;</div><div class='add'>+TEST $CLI volume set $V0 server.statedump-path $dump_dir;</div><div class='add'>+</div><div class='add'>+## Start volume and verify</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+EXPECT 'Started' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+TEST PID=`gluster --xml volume status patchy | grep -A 8 patchy1 | grep '&lt;pid&gt;' | cut -d '&gt;' -f 2 | cut -d '&lt;' -f 1`</div><div class='add'>+TEST kill -USR1 $PID;</div><div class='add'>+sleep 2;</div><div class='add'>+for file_name in $(ls $dump_dir)</div><div class='add'>+do</div><div class='add'>+    TEST grep "error-gen.priv" $dump_dir/$file_name;</div><div class='add'>+done</div><div class='add'>+</div><div class='add'>+## Finish up</div><div class='add'>+TEST $CLI volume stop $V0;</div><div class='add'>+EXPECT 'Stopped' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+TEST $CLI volume delete $V0;</div><div class='add'>+TEST ! $CLI volume info $V0;</div><div class='add'>+</div><div class='add'>+TEST rm -rf $dump_dir;</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/fuse/bug-1030208.t b/tests/bugs/fuse/bug-1030208.t<br/>new file mode 100644<br/>index 00000000000..526283cf101<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/fuse/bug-1030208.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/fuse/bug-1030208.t</a></div><div class='hunk'>@@ -0,0 +1,35 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+#Test case: Hardlink test</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+#Basic checks</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume info</div><div class='add'>+</div><div class='add'>+#Create a distributed volume</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/${V0}{1..2};</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+# Mount FUSE</div><div class='add'>+TEST glusterfs -s $H0 --volfile-id $V0 $M0</div><div class='add'>+</div><div class='add'>+#Create a file and perform fop on a DIR</div><div class='add'>+TEST touch $M0/foo</div><div class='add'>+TEST ls $M0/</div><div class='add'>+</div><div class='add'>+#Create hardlink</div><div class='add'>+TEST ln $M0/foo $M0/bar</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+TEST $CLI volume stop $V0</div><div class='add'>+TEST $CLI volume delete $V0;</div><div class='add'>+TEST ! $CLI volume info $V0;</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/fuse/bug-1126048.c b/tests/bugs/fuse/bug-1126048.c<br/>new file mode 100644<br/>index 00000000000..19165ecf6f7<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/fuse/bug-1126048.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/fuse/bug-1126048.c</a></div><div class='hunk'>@@ -0,0 +1,43 @@</div><div class='add'>+#include &lt;stdio.h&gt;</div><div class='add'>+#include &lt;unistd.h&gt;</div><div class='add'>+#include &lt;sys/types.h&gt;</div><div class='add'>+#include &lt;sys/stat.h&gt;</div><div class='add'>+#include &lt;fcntl.h&gt;</div><div class='add'>+#include &lt;errno.h&gt;</div><div class='add'>+#include &lt;string.h&gt;</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+ * This function opens a file and to trigger migration failure, unlinks the</div><div class='add'>+ * file and performs graph switch (cmd passed in argv). If everything goes fine,</div><div class='add'>+ * fsync should fail without crashing the mount process.</div><div class='add'>+ */</div><div class='add'>+int</div><div class='add'>+main(int argc, char **argv)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+    int fd = 0;</div><div class='add'>+    char *cmd = argv[1];</div><div class='add'>+    struct stat stbuf = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    printf("cmd is: %s\n", cmd);</div><div class='add'>+    fd = open("a.txt", O_CREAT | O_RDWR, 0644);</div><div class='add'>+    if (fd &lt; 0)</div><div class='add'>+        printf("open failed: %s\n", strerror(errno));</div><div class='add'>+</div><div class='add'>+    ret = unlink("a.txt");</div><div class='add'>+    if (ret &lt; 0)</div><div class='add'>+        printf("unlink failed: %s\n", strerror(errno));</div><div class='add'>+    if (write(fd, "abc", 3) &lt; 0)</div><div class='add'>+        printf("Not able to print %s\n", strerror(errno));</div><div class='add'>+    system(cmd);</div><div class='add'>+    sleep(1); /* No way to confirm graph switch so sleep 1 */</div><div class='add'>+    ret = fstat(fd, &amp;stbuf);</div><div class='add'>+    if (ret &lt; 0)</div><div class='add'>+        printf("fstat failed %\n", strerror(errno));</div><div class='add'>+    ret = fsync(fd);</div><div class='add'>+    if (ret &lt; 0)</div><div class='add'>+        printf("Not able to fsync %s\n", strerror(errno));</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='head'>diff --git a/tests/bugs/fuse/bug-1126048.t b/tests/bugs/fuse/bug-1126048.t<br/>new file mode 100755<br/>index 00000000000..5e2ed293cd3<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/fuse/bug-1126048.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/fuse/bug-1126048.t</a></div><div class='hunk'>@@ -0,0 +1,30 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+function grep_for_ebadf {</div><div class='add'>+        $M0/bug-1126048 "gluster --mode=script --wignore volume add-brick $V0 $H0:$B0/brick2" | grep -i "Bad file descriptor"</div><div class='add'>+}</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume info;</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/brick1;</div><div class='add'>+EXPECT 'Created' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+EXPECT 'Started' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+TEST glusterfs -s $H0 --volfile-id=$V0 $M0 --direct-io-mode=yes</div><div class='add'>+</div><div class='add'>+build_tester $(dirname $0)/bug-1126048.c</div><div class='add'>+</div><div class='add'>+TEST cp $(dirname $0)/bug-1126048 $M0</div><div class='add'>+cd $M0</div><div class='add'>+TEST grep_for_ebadf</div><div class='add'>+TEST ls -l $M0</div><div class='add'>+cd -</div><div class='add'>+TEST rm -f $(dirname $0)/bug-1126048</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/fuse/bug-1283103.t b/tests/bugs/fuse/bug-1283103.t<br/>new file mode 100644<br/>index 00000000000..56612534cb9<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/fuse/bug-1283103.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/fuse/bug-1283103.t</a></div><div class='hunk'>@@ -0,0 +1,59 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+#</div><div class='add'>+# https://bugzilla.redhat.com/show_bug.cgi?id=1283103</div><div class='add'>+#</div><div class='add'>+# Test that it is possible to set and get security.*</div><div class='add'>+# xattrs other thatn security.selinux irrespective of</div><div class='add'>+# whether the mount was done with --selinux. This is</div><div class='add'>+# for example important for Samba to be able to store</div><div class='add'>+# the Windows-level acls in the security.NTACL xattr</div><div class='add'>+# when the acl_xattr vfs module is used.</div><div class='add'>+#</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+#Basic checks</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume info</div><div class='add'>+</div><div class='add'>+#Create a distributed volume</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/${V0}{1..2};</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+# Mount FUSE without selinux:</div><div class='add'>+TEST glusterfs -s $H0 --volfile-id $V0 $M0</div><div class='add'>+</div><div class='add'>+TESTFILE="$M0/testfile"</div><div class='add'>+TEST touch ${TESTFILE}</div><div class='add'>+</div><div class='add'>+TEST echo "setfattr -n security.foobar -v value ${TESTFILE}"</div><div class='add'>+TEST setfattr -n security.foobar -v value ${TESTFILE}</div><div class='add'>+TEST getfattr -n security.foobar ${TESTFILE}</div><div class='add'>+TEST setfattr -x security.foobar ${TESTFILE}</div><div class='add'>+</div><div class='add'>+# can not currently test the security.selinux xattrs</div><div class='add'>+# since the kernel intercepts them.</div><div class='add'>+# see https://bugzilla.redhat.com/show_bug.cgi?id=1272868</div><div class='add'>+#TEST ! getfattr -n security.selinux ${TESTFILE}</div><div class='add'>+#TEST ! setfattr -n security.selinux -v value ${TESTFILE}</div><div class='add'>+</div><div class='add'>+TEST umount $M0</div><div class='add'>+</div><div class='add'>+# Mount FUSE with selinux:</div><div class='add'>+TEST glusterfs -s $H0 --volfile-id $V0 --selinux $M0</div><div class='add'>+</div><div class='add'>+TEST setfattr -n security.foobar -v value ${TESTFILE}</div><div class='add'>+TEST getfattr -n security.foobar ${TESTFILE}</div><div class='add'>+TEST setfattr -x security.foobar ${TESTFILE}</div><div class='add'>+</div><div class='add'>+# can not currently test the security.selinux xattrs</div><div class='add'>+# since the kernel intercepts them.</div><div class='add'>+# see https://bugzilla.redhat.com/show_bug.cgi?id=1272868</div><div class='add'>+#TEST setfattr -n security.selinux -v value ${TESTFILE}</div><div class='add'>+#TEST getfattr -n security.selinux ${TESTFILE}</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/fuse/bug-1309462.t b/tests/bugs/fuse/bug-1309462.t<br/>new file mode 100644<br/>index 00000000000..975d72d82ed<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/fuse/bug-1309462.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/fuse/bug-1309462.t</a></div><div class='hunk'>@@ -0,0 +1,50 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+#</div><div class='add'>+# https://bugzilla.redhat.com/show_bug.cgi?id=1309462</div><div class='add'>+# Test the new fuse mount option --capability.</div><div class='add'>+# Set/get xattr on security.capability should be sent</div><div class='add'>+# down from fuse, only if --selinux or --capability option</div><div class='add'>+# is used for mounting.</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+#Basic checks</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+</div><div class='add'>+#Create a distributed volume</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/${V0}{1..2};</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+# Mount FUSE without selinux:</div><div class='add'>+TEST glusterfs -s $H0 --volfile-id $V0 $M0</div><div class='add'>+</div><div class='add'>+TESTFILE="$M0/testfile"</div><div class='add'>+TEST touch ${TESTFILE}</div><div class='add'>+</div><div class='add'>+TEST ! setfattr -n security.capability -v value ${TESTFILE}</div><div class='add'>+TEST ! getfattr -n security.capability ${TESTFILE}</div><div class='add'>+</div><div class='add'>+TEST umount $M0</div><div class='add'>+</div><div class='add'>+# Mount FUSE with selinux:</div><div class='add'>+TEST glusterfs -s $H0 --volfile-id $V0 --selinux $M0</div><div class='add'>+</div><div class='add'>+TEST setfattr -n security.capability -v value ${TESTFILE}</div><div class='add'>+TEST getfattr -n security.capability ${TESTFILE}</div><div class='add'>+TEST setfattr -x security.capability ${TESTFILE}</div><div class='add'>+</div><div class='add'>+TEST umount $M0</div><div class='add'>+</div><div class='add'>+# Mount FUSE with capability:</div><div class='add'>+TEST glusterfs -s $H0 --volfile-id $V0 --capability $M0</div><div class='add'>+</div><div class='add'>+TEST setfattr -n security.capability -v value ${TESTFILE}</div><div class='add'>+TEST getfattr -n security.capability ${TESTFILE}</div><div class='add'>+TEST setfattr -x security.capability ${TESTFILE}</div><div class='add'>+</div><div class='add'>+TEST umount $M0</div><div class='add'>+#G_TESTDEF_TEST_STATUS_CENTOS6=BAD_TEST,BUG=1581735</div><div class='add'>+#G_TESTDEF_TEST_STATUS_NETBSD7=BAD_TEST,BUG=1581735
\ No newline at end of file</div><div class='head'>diff --git a/tests/bugs/fuse/bug-1336818.t b/tests/bugs/fuse/bug-1336818.t<br/>new file mode 100644<br/>index 00000000000..53286521742<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/fuse/bug-1336818.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/fuse/bug-1336818.t</a></div><div class='hunk'>@@ -0,0 +1,52 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+#Test case: OOM score adjust</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+# Prepare</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume info;</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/brick1;</div><div class='add'>+EXPECT 'Created' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+EXPECT 'Started' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+# Basic check</div><div class='add'>+TEST glusterfs -s $H0 --volfile-id $V0 $M0</div><div class='add'>+TEST umount $M0</div><div class='add'>+</div><div class='add'>+# Check valid value (&lt; 0)</div><div class='add'>+TEST glusterfs --oom-score-adj=-1000 -s $H0 --volfile-id $V0 $M0</div><div class='add'>+TEST umount $M0</div><div class='add'>+</div><div class='add'>+# Check valid value (&gt; 0)</div><div class='add'>+TEST glusterfs --oom-score-adj=1000 -s $H0 --volfile-id $V0 $M0</div><div class='add'>+TEST umount $M0</div><div class='add'>+</div><div class='add'>+# Check valid value (= 0)</div><div class='add'>+TEST glusterfs --oom-score-adj=0 -s $H0 --volfile-id $V0 $M0</div><div class='add'>+TEST umount $M0</div><div class='add'>+</div><div class='add'>+# Check invalid value (no value given)</div><div class='add'>+TEST ! glusterfs --oom-score-adj -s $H0 --volfile-id $V0 $M0</div><div class='add'>+</div><div class='add'>+# Check invalid value (&lt; OOM_SCORE_ADJ_MIN)</div><div class='add'>+TEST ! glusterfs --oom-score-adj=-1001 -s $H0 --volfile-id $V0 $M0</div><div class='add'>+</div><div class='add'>+# Check invalid value (&gt; OOM_SCORE_ADJ_MAX)</div><div class='add'>+TEST ! glusterfs --oom-score-adj=1001 -s $H0 --volfile-id $V0 $M0</div><div class='add'>+</div><div class='add'>+# Check invalid value (float)</div><div class='add'>+TEST ! glusterfs --oom-score-adj=12.34 -s $H0 --volfile-id $V0 $M0</div><div class='add'>+</div><div class='add'>+# Check invalid value (non-integer string)</div><div class='add'>+TEST ! glusterfs --oom-score-adj=qwerty -s $H0 --volfile-id $V0 $M0</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/fuse/bug-858215.t b/tests/bugs/fuse/bug-858215.t<br/>new file mode 100755<br/>index 00000000000..95999f6ad24<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/fuse/bug-858215.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/fuse/bug-858215.t</a></div><div class='hunk'>@@ -0,0 +1,79 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+## Start and create a volume</div><div class='add'>+TEST glusterd;</div><div class='add'>+TEST pidof glusterd;</div><div class='add'>+TEST $CLI volume info;</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 replica 3 $H0:$B0/${V0}{1,2,3,4,5,6};</div><div class='add'>+TEST $CLI volume set $V0 nfs.disable off</div><div class='add'>+</div><div class='add'>+function volinfo_field()</div><div class='add'>+{</div><div class='add'>+    local vol=$1;</div><div class='add'>+    local field=$2;</div><div class='add'>+</div><div class='add'>+    $CLI volume info $vol | grep "^$field: " | sed 's/.*: //';</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+## Verify volume is is created</div><div class='add'>+EXPECT "$V0" volinfo_field $V0 'Volume Name';</div><div class='add'>+EXPECT 'Created' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+## Start volume and verify</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+EXPECT 'Started' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+## Mount FUSE with caching disabled</div><div class='add'>+TEST glusterfs --entry-timeout=0 --attribute-timeout=0 --event-history=on -s $H0 --volfile-id $V0 $M0;</div><div class='add'>+</div><div class='add'>+## Test for checking whether the fops have been saved in the event-history</div><div class='add'>+TEST ! stat $M0/newfile;</div><div class='add'>+TEST touch $M0/newfile;</div><div class='add'>+TEST stat $M0/newfile;</div><div class='add'>+TEST rm $M0/newfile;</div><div class='add'>+</div><div class='add'>+nfs_pid=$(cat $GLUSTERD_PIDFILEDIR/nfs/nfs.pid || echo -1);</div><div class='add'>+glustershd_pid=`ps auxwww | grep glustershd | grep -v grep | awk -F " " '{print $2}'`</div><div class='add'>+TEST [ $glustershd_pid != 0 ];</div><div class='add'>+pids=$(pidof glusterfs);</div><div class='add'>+for i in $pids</div><div class='add'>+do</div><div class='add'>+        if [ $i -ne $nfs_pid ] &amp;&amp; [ $i -ne $glustershd_pid ]; then</div><div class='add'>+                mount_pid=$i;</div><div class='add'>+                break;</div><div class='add'>+        fi</div><div class='add'>+done</div><div class='add'>+</div><div class='add'>+dump_dir='/tmp/gerrit_glusterfs'</div><div class='add'>+cat &gt;$statedumpdir/glusterdump.options &lt;&lt;EOF</div><div class='add'>+all=yes</div><div class='add'>+path=$dump_dir</div><div class='add'>+EOF</div><div class='add'>+</div><div class='add'>+TEST mkdir -p $dump_dir;</div><div class='add'>+TEST kill -USR1 $mount_pid;</div><div class='add'>+sleep 2;</div><div class='add'>+for file_name in $(ls $dump_dir)</div><div class='add'>+do</div><div class='add'>+    TEST grep -q "xlator.mount.fuse.history" $dump_dir/$file_name;</div><div class='add'>+done</div><div class='add'>+</div><div class='add'>+## Finish up</div><div class='add'>+TEST $CLI volume stop $V0;</div><div class='add'>+EXPECT 'Stopped' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+TEST $CLI volume delete $V0;</div><div class='add'>+TEST ! $CLI volume info $V0;</div><div class='add'>+</div><div class='add'>+TEST rm -rf $dump_dir;</div><div class='add'>+TEST rm $statedumpdir/glusterdump.options;</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/fuse/bug-858488-min-free-disk.t b/tests/bugs/fuse/bug-858488-min-free-disk.t<br/>new file mode 100644<br/>index 00000000000..635dc04d1e6<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/fuse/bug-858488-min-free-disk.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/fuse/bug-858488-min-free-disk.t</a></div><div class='hunk'>@@ -0,0 +1,108 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+## Start glusterd</div><div class='add'>+TEST glusterd;</div><div class='add'>+TEST pidof glusterd;</div><div class='add'>+TEST $CLI volume info;</div><div class='add'>+</div><div class='add'>+## Lets create partitions for bricks</div><div class='add'>+TEST truncate -s 100M $B0/brick1</div><div class='add'>+TEST truncate -s 200M $B0/brick2</div><div class='add'>+TEST LO1=`SETUP_LOOP $B0/brick1`</div><div class='add'>+TEST MKFS_LOOP $LO1</div><div class='add'>+TEST LO2=`SETUP_LOOP $B0/brick2`</div><div class='add'>+TEST MKFS_LOOP $LO2</div><div class='add'>+TEST mkdir -p $B0/${V0}1 $B0/${V0}2</div><div class='add'>+TEST MOUNT_LOOP $LO1 $B0/${V0}1</div><div class='add'>+TEST MOUNT_LOOP $LO2 $B0/${V0}2</div><div class='add'>+</div><div class='add'>+## Lets create volume</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/${V0}{1,2};</div><div class='add'>+</div><div class='add'>+## Verify volume is created</div><div class='add'>+EXPECT "$V0" volinfo_field $V0 'Volume Name';</div><div class='add'>+EXPECT 'Created' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+## Start volume and verify</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+EXPECT 'Started' volinfo_field $V0 'Status';</div><div class='add'>+TEST glusterfs -s $H0 --volfile-id=$V0 --acl $M0</div><div class='add'>+## Real test starts here</div><div class='add'>+## ----------------------------------------------------------------------------</div><div class='add'>+</div><div class='add'>+MINFREEDISKVALUE=90%</div><div class='add'>+</div><div class='add'>+## Set min free disk to MINFREEDISKVALUE percent</div><div class='add'>+TEST $CLI volume set $V0 cluster.min-free-disk $MINFREEDISKVALUE</div><div class='add'>+</div><div class='add'>+## We need to have file name to brick map based on hash.</div><div class='add'>+## We will use this info in test case 0.</div><div class='add'>+i=1</div><div class='add'>+CONTINUE=2</div><div class='add'>+BRICK1FILE=0</div><div class='add'>+BRICK2FILE=0</div><div class='add'>+while [[ $CONTINUE -ne 0 ]]</div><div class='add'>+do</div><div class='add'>+        dd if=/dev/zero of=$M0/file$i.data bs=1024 count=1024 1&gt;/dev/null 2&gt;&amp;1</div><div class='add'>+</div><div class='add'>+        if  [[ -e  $B0/${V0}1/file$i.data &amp;&amp;  $BRICK1FILE = "0" ]]</div><div class='add'>+        then</div><div class='add'>+                BRICK1FILE=file$i.data</div><div class='add'>+                CONTINUE=$(( $CONTINUE - 1 ))</div><div class='add'>+        fi</div><div class='add'>+</div><div class='add'>+        if [[ -e  $B0/${V0}2/file$i.data &amp;&amp;  $BRICK2FILE = "0" ]]</div><div class='add'>+        then</div><div class='add'>+                BRICK2FILE=file$i.data</div><div class='add'>+                CONTINUE=$(( $CONTINUE - 1 ))</div><div class='add'>+        fi</div><div class='add'>+</div><div class='add'>+        rm $M0/file$i.data</div><div class='add'>+        let i++</div><div class='add'>+done</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+## Bring free space on one of the bricks to less than minfree value by</div><div class='add'>+## creating one big file.</div><div class='add'>+dd if=/dev/zero of=$M0/fillonebrick.data bs=1024 count=25600 1&gt;/dev/null 2&gt;&amp;1</div><div class='add'>+</div><div class='add'>+#Lets find out where it was created</div><div class='add'>+if [ -f $B0/${V0}1/fillonebrick.data ]</div><div class='add'>+then</div><div class='add'>+        FILETOCREATE=$BRICK1FILE</div><div class='add'>+        OTHERBRICK=$B0/${V0}2</div><div class='add'>+else</div><div class='add'>+        FILETOCREATE=$BRICK2FILE</div><div class='add'>+        OTHERBRICK=$B0/${V0}1</div><div class='add'>+fi</div><div class='add'>+</div><div class='add'>+##--------------------------------TEST CASE 0-----------------------------------</div><div class='add'>+## If we try to create a file which should go into full brick as per hash, it</div><div class='add'>+## should go into the other brick instead.</div><div class='add'>+</div><div class='add'>+## Before that let us create files just to make gluster refresh the stat</div><div class='add'>+## Using touch so it should not change the disk usage stats</div><div class='add'>+for k in {1..20};</div><div class='add'>+do</div><div class='add'>+        touch $M0/dummyfile$k</div><div class='add'>+done</div><div class='add'>+</div><div class='add'>+dd if=/dev/zero of=$M0/$FILETOCREATE bs=1024 count=2048 1&gt;/dev/null 2&gt;&amp;1</div><div class='add'>+TEST [ -e $OTHERBRICK/$FILETOCREATE ]</div><div class='add'>+## Done testing, lets clean up</div><div class='add'>+TEST rm -rf $M0/*</div><div class='add'>+</div><div class='add'>+## Finish up</div><div class='add'>+TEST $CLI volume stop $V0;</div><div class='add'>+EXPECT 'Stopped' volinfo_field $V0 'Status';</div><div class='add'>+$CLI volume delete $V0;</div><div class='add'>+</div><div class='add'>+UMOUNT_LOOP ${B0}/${V0}{1,2}</div><div class='add'>+rm -f ${B0}/brick{1,2}</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/fuse/bug-924726.t b/tests/bugs/fuse/bug-924726.t<br/>new file mode 100755<br/>index 00000000000..2d3c7680798<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/fuse/bug-924726.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/fuse/bug-924726.t</a></div><div class='hunk'>@@ -0,0 +1,45 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+TESTS_EXPECTED_IN_LOOP=10</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+function get_socket_count() {</div><div class='add'>+         netstat -nap | grep $1 | wc -l</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume info;</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0  $H0:$B0/$V0</div><div class='add'>+EXPECT 'Created' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+EXPECT 'Started' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+TEST glusterfs -s $H0 --volfile-id $V0 $M0;</div><div class='add'>+</div><div class='add'>+TEST ls $M0</div><div class='add'>+</div><div class='add'>+GLFS_MNT_PID=`ps ax | grep "glusterfs -s $H0 \-\-volfile\-id $V0 $M0" | sed -e "s/^ *\([0-9]*\).*/\1/g"`</div><div class='add'>+</div><div class='add'>+SOCKETS_BEFORE_SWITCH=`netstat -nap | grep $GLFS_MNT_PID | grep ESTABLISHED | wc -l`</div><div class='add'>+</div><div class='add'>+for i in $(seq 1 5); do</div><div class='add'>+    TEST_IN_LOOP $CLI volume set $V0 performance.write-behind off;</div><div class='add'>+    sleep 1;</div><div class='add'>+    TEST_IN_LOOP $CLI volume set $V0 performance.write-behind on;</div><div class='add'>+    sleep 1;</div><div class='add'>+done</div><div class='add'>+</div><div class='add'>+SOCKETS_AFTER_SWITCH=`netstat -nap | grep $GLFS_MNT_PID | grep ESTABLISHED | wc -l`</div><div class='add'>+</div><div class='add'>+# currently active graph is not cleaned up till some operation on</div><div class='add'>+# mount-point. Hence there is one extra graph.</div><div class='add'>+TEST [ $SOCKETS_AFTER_SWITCH = `expr $SOCKETS_BEFORE_SWITCH + 1` ]</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/fuse/bug-963678.t b/tests/bugs/fuse/bug-963678.t<br/>new file mode 100644<br/>index 00000000000..006181f26e1<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/fuse/bug-963678.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/fuse/bug-963678.t</a></div><div class='hunk'>@@ -0,0 +1,57 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+#</div><div class='add'>+# Bug 963678 - Test discard functionality</div><div class='add'>+#</div><div class='add'>+# Test that basic discard (hole punch) functionality works via the fallocate</div><div class='add'>+# command line tool. Hole punch deallocates a region of a file, creating a hole</div><div class='add'>+# and a zero-filled data region. We verify that hole punch works, frees blocks</div><div class='add'>+# and that subsequent reads do not read stale data (caches are invalidated).</div><div class='add'>+#</div><div class='add'>+# NOTE: fuse fallocate is known to be broken with regard to cache invalidation</div><div class='add'>+# 	up to 3.9.0 kernels. Therefore, FOPEN_KEEP_CACHE is not used in this</div><div class='add'>+#	test (opens will invalidate the fuse cache).</div><div class='add'>+###</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../fallocate.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 replica 2 $H0:$B0/${V0}{1,2}</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+TEST glusterfs --volfile-id=$V0 --volfile-server=$H0 $M0 --attribute-timeout=0 --entry-timeout=0</div><div class='add'>+</div><div class='add'>+# check for fallocate and hole punch support</div><div class='add'>+require_fallocate -l 1m $M0/file</div><div class='add'>+require_fallocate -p -l 512k $M0/file &amp;&amp; rm -f $M0/file</div><div class='add'>+</div><div class='add'>+# allocate some blocks, punch a hole and verify block allocation</div><div class='add'>+TEST fallocate -l 1m $M0/file</div><div class='add'>+blksz=`stat -c %B $M0/file`</div><div class='add'>+nblks=`stat -c %b $M0/file`</div><div class='add'>+TEST [ $(($blksz * $nblks)) -ge 1048576 ]</div><div class='add'>+TEST fallocate -p -o 512k -l 128k $M0/file</div><div class='add'>+</div><div class='add'>+nblks=`stat -c %b $M0/file`</div><div class='add'>+# allow some room for xattr blocks</div><div class='add'>+TEST [ $(($blksz * $nblks)) -lt $((917504 + 16384)) ]</div><div class='add'>+TEST unlink $M0/file</div><div class='add'>+</div><div class='add'>+# write some data, punch a hole and verify the file content changes</div><div class='add'>+TEST dd if=/dev/urandom of=$M0/file bs=1024k count=1</div><div class='add'>+TEST cp $M0/file $M0/file.copy.pre</div><div class='add'>+TEST fallocate -p -o 512k -l 128k $M0/file</div><div class='add'>+TEST cp $M0/file $M0/file.copy.post</div><div class='add'>+TEST ! cmp $M0/file.copy.pre $M0/file.copy.post</div><div class='add'>+TEST unlink $M0/file</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+</div><div class='add'>+TEST $CLI volume stop $V0</div><div class='add'>+TEST $CLI volume delete $V0</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/fuse/bug-983477.t b/tests/bugs/fuse/bug-983477.t<br/>new file mode 100755<br/>index 00000000000..41ddd9e55a9<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/fuse/bug-983477.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/fuse/bug-983477.t</a></div><div class='hunk'>@@ -0,0 +1,53 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+#This script checks if use-readdirp option works as accepted in mount options</div><div class='add'>+</div><div class='add'>+function get_use_readdirp_value {</div><div class='add'>+        local vol=$1</div><div class='add'>+        local statedump=$(generate_mount_statedump $vol)</div><div class='add'>+        sleep 1</div><div class='add'>+        local val=$(grep "use_readdirp=" $statedump | cut -f2 -d'=' | tail -1)</div><div class='add'>+        rm -f $statedump</div><div class='add'>+        echo $val</div><div class='add'>+}</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/${V0}</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+#If readdirp is enabled statedump should reflect it</div><div class='add'>+TEST glusterfs --volfile-id=/$V0 --volfile-server=$H0 $M0 --attribute-timeout=0 --entry-timeout=0 --use-readdirp=yes</div><div class='add'>+TEST cd $M0</div><div class='add'>+EXPECT "1" get_use_readdirp_value $V0</div><div class='add'>+TEST cd -</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+</div><div class='add'>+#If readdirp is enabled statedump should reflect it</div><div class='add'>+TEST glusterfs --volfile-id=/$V0 --volfile-server=$H0 $M0 --attribute-timeout=0 --entry-timeout=0 --use-readdirp=no</div><div class='add'>+TEST cd $M0</div><div class='add'>+EXPECT "0" get_use_readdirp_value $V0</div><div class='add'>+TEST cd -</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+</div><div class='add'>+#Since args are optional on this argument just specifying "--use-readdirp" should also turn it `on` not `off`</div><div class='add'>+TEST glusterfs --volfile-id=/$V0 --volfile-server=$H0 $M0 --attribute-timeout=0 --entry-timeout=0 --use-readdirp</div><div class='add'>+TEST cd $M0</div><div class='add'>+EXPECT "1" get_use_readdirp_value $V0</div><div class='add'>+TEST cd -</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+</div><div class='add'>+#By default it is enabled.</div><div class='add'>+TEST glusterfs --volfile-id=/$V0 --volfile-server=$H0 $M0 --attribute-timeout=0 --entry-timeout=0</div><div class='add'>+TEST cd $M0</div><div class='add'>+EXPECT "1" get_use_readdirp_value $V0</div><div class='add'>+TEST cd -</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+</div><div class='add'>+#Invalid values for use-readdirp should not be accepted</div><div class='add'>+TEST ! glusterfs --volfile-id=/$V0 --volfile-server=$H0 $M0 --attribute-timeout=0 --entry-timeout=0 --use-readdirp=please-fail</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/bugs/fuse/bug-985074.t b/tests/bugs/fuse/bug-985074.t<br/>new file mode 100644<br/>index 00000000000..ffa6df54144<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/fuse/bug-985074.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/fuse/bug-985074.t</a></div><div class='hunk'>@@ -0,0 +1,54 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+#</div><div class='add'>+# Bug 985074 - Verify stale inode/dentry mappings are cleaned out.</div><div class='add'>+#</div><div class='add'>+# This test verifies that an inode/dentry mapping for a file removed via a</div><div class='add'>+# separate mount point is cleaned up appropriately. We create a file and hard</div><div class='add'>+# link from client 1. Next we remove the link via client 2. Finally, from client</div><div class='add'>+# 1 we attempt to rename the original filename to the name of the just removed</div><div class='add'>+# hard link.</div><div class='add'>+#</div><div class='add'>+# If the inode is not unlinked properly, the removed directory entry can resolve</div><div class='add'>+# to an inode (on the client that never saw the rm) that ends up passed down</div><div class='add'>+# through the lookup call. If md-cache holds valid metadata on the inode (due to</div><div class='add'>+# a large timeout value or recent lookup on the valid name), it is tricked into</div><div class='add'>+# returning a successful lookup that should have returned ENOENT. This manifests</div><div class='add'>+# as an error from the mv command in the following test sequence because file</div><div class='add'>+# and file.link resolve to the same file:</div><div class='add'>+#</div><div class='add'>+# # mv /mnt/glusterfs/0/file /mnt/glusterfs/0/file.link</div><div class='add'>+# mv: `/mnt/glusterfs/0/file' and `/mnt/glusterfs/0/file.link' are the same file</div><div class='add'>+#</div><div class='add'>+###</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/$V0</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+TEST $CLI volume set $V0 performance.stat-prefetch off</div><div class='add'>+</div><div class='add'>+TEST glusterfs --volfile-id=$V0 --volfile-server=$H0 $M0 --entry-timeout=0 --attribute-timeout=0</div><div class='add'>+TEST glusterfs --volfile-id=$V0 --volfile-server=$H0 $M1 --entry-timeout=0 --attribute-timeout=0</div><div class='add'>+</div><div class='add'>+TEST touch $M0/file</div><div class='add'>+TEST ln $M0/file $M0/file.link</div><div class='add'>+TEST ls -ali $M0 $M1</div><div class='add'>+TEST rm -f $M1/file.link</div><div class='add'>+TEST ls -ali $M0 $M1</div><div class='add'>+</div><div class='add'>+TEST mv $M0/file $M0/file.link</div><div class='add'>+TEST stat $M0/file.link</div><div class='add'>+TEST ! stat $M0/file</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M1</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+</div><div class='add'>+TEST $CLI volume stop $V0</div><div class='add'>+TEST $CLI volume delete $V0</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/fuse/many-groups-for-acl.t b/tests/bugs/fuse/many-groups-for-acl.t<br/>new file mode 100755<br/>index 00000000000..a51b1bc7267<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/fuse/many-groups-for-acl.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/fuse/many-groups-for-acl.t</a></div><div class='hunk'>@@ -0,0 +1,123 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+. $(dirname $0)/../../nfs.rc</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='add'>+</div><div class='add'>+# prepare the users and groups</div><div class='add'>+NEW_USER=bug1246275</div><div class='add'>+NEW_UID=1246275</div><div class='add'>+NEW_GID=1246275</div><div class='add'>+LAST_GID=1246403</div><div class='add'>+NEW_GIDS=${NEW_GID}</div><div class='add'>+</div><div class='add'>+# OS-specific overrides</div><div class='add'>+case $OSTYPE in</div><div class='add'>+NetBSD|Darwin)</div><div class='add'>+        # no ACLs, and only NGROUPS_MAX=16 secondary groups are supported</div><div class='add'>+        SKIP_TESTS</div><div class='add'>+        exit 0</div><div class='add'>+        ;;</div><div class='add'>+FreeBSD)</div><div class='add'>+        # NGROUPS_MAX=1023 (FreeBSD&gt;=8.0), we can afford 200 groups</div><div class='add'>+        ;;</div><div class='add'>+Linux)</div><div class='add'>+        # NGROUPS_MAX=65536, we can afford 200 groups</div><div class='add'>+        ;;</div><div class='add'>+*)</div><div class='add'>+        ;;</div><div class='add'>+esac</div><div class='add'>+</div><div class='add'>+# create a user that belongs to many groups</div><div class='add'>+for GID in $(seq  -f '%6.0f' ${NEW_GID} ${LAST_GID})</div><div class='add'>+do</div><div class='add'>+        groupadd -o -g ${GID} ${NEW_USER}-${GID}</div><div class='add'>+        NEW_GIDS="${NEW_GIDS},${NEW_USER}-${GID}"</div><div class='add'>+done</div><div class='add'>+TEST useradd -o -M -u ${NEW_UID} -g ${NEW_GID} -G ${NEW_USER}-${NEW_GIDS} ${NEW_USER}</div><div class='add'>+</div><div class='add'>+# Linux &lt; 3.8 exports only first 32 gids of pid to userspace</div><div class='add'>+kernel_exports_few_gids=0</div><div class='add'>+if [ "$OSTYPE" = Linux ] &amp;&amp; \</div><div class='add'>+   su -m ${NEW_USER} -c "grep ^Groups: /proc/self/status | wc -w | xargs -I@ expr @ - 1 '&lt;' $LAST_GID - $NEW_GID + 1" &gt; /dev/null; then</div><div class='add'>+       kernel_exports_few_gids=1</div><div class='add'>+fi</div><div class='add'>+</div><div class='add'>+# preparation done, start the tests</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create ${V0} ${H0}:${B0}/${V0}1</div><div class='add'>+TEST $CLI volume set $V0 nfs.disable off</div><div class='add'>+# disable manage-gids on the server-side for now, gets enabled later</div><div class='add'>+TEST $CLI volume set ${V0} server.manage-gids off</div><div class='add'>+TEST $CLI volume start ${V0}</div><div class='add'>+</div><div class='add'>+# This is just a synchronization hack to make sure the bricks are</div><div class='add'>+# up before going on.</div><div class='add'>+EXPECT_WITHIN ${NFS_EXPORT_TIMEOUT} "1" is_nfs_export_available</div><div class='add'>+</div><div class='add'>+# mount the volume with POSIX ACL support, without --resolve-gids</div><div class='add'>+TEST glusterfs --acl --volfile-id=/${V0} --volfile-server=${H0} ${M0}</div><div class='add'>+</div><div class='add'>+# create some directories for testing</div><div class='add'>+TEST mkdir ${M0}/first-32-gids-1</div><div class='add'>+TEST setfacl -m g:${NEW_UID}:rwx ${M0}/first-32-gids-1</div><div class='add'>+TEST mkdir ${M0}/first-32-gids-2</div><div class='add'>+TEST setfacl -m g:$[NEW_UID+16]:rwx ${M0}/first-32-gids-2</div><div class='add'>+TEST mkdir ${M0}/gid-64</div><div class='add'>+TEST setfacl -m g:$[NEW_UID+64]:rwx ${M0}/gid-64</div><div class='add'>+TEST mkdir ${M0}/gid-120</div><div class='add'>+TEST setfacl -m g:$[NEW_UID+120]:rwx ${M0}/gid-120</div><div class='add'>+</div><div class='add'>+su -m ${NEW_USER} -c "touch ${M0}/first-32-gids-1/success &gt; /dev/null"</div><div class='add'>+TEST [ $? -eq 0 ]</div><div class='add'>+</div><div class='add'>+su -m ${NEW_USER} -c "touch ${M0}/first-32-gids-2/success &gt; /dev/null"</div><div class='add'>+TEST [ $? -eq 0 ]</div><div class='add'>+</div><div class='add'>+su -m ${NEW_USER} -c "touch ${M0}/gid-64/success--if-all-gids-exported &gt; /dev/null"</div><div class='add'>+TEST [ $? -eq $kernel_exports_few_gids ]</div><div class='add'>+</div><div class='add'>+su -m ${NEW_USER} -c "touch ${M0}/gid-120/failure &gt; /dev/null"</div><div class='add'>+TEST [ $? -ne 0 ]</div><div class='add'>+</div><div class='add'>+# unmount and remount with --resolve-gids</div><div class='add'>+EXPECT_WITHIN ${UMOUNT_TIMEOUT} "Y" force_umount ${M0}</div><div class='add'>+TEST glusterfs --acl --resolve-gids --volfile-id=/${V0} --volfile-server=${H0} ${M0}</div><div class='add'>+</div><div class='add'>+su -m ${NEW_USER} -c "touch ${M0}/gid-64/success &gt; /dev/null"</div><div class='add'>+TEST [ $? -eq 0 ]</div><div class='add'>+</div><div class='add'>+su -m ${NEW_USER} -c "touch ${M0}/gid-120/failure &gt; /dev/null"</div><div class='add'>+TEST [ $? -ne 0 ]</div><div class='add'>+</div><div class='add'>+# enable server-side resolving of the groups</div><div class='add'>+# stopping and starting is not really needed, but it prevents races</div><div class='add'>+TEST $CLI volume stop ${V0}</div><div class='add'>+TEST $CLI volume set ${V0} server.manage-gids on</div><div class='add'>+TEST $CLI volume start ${V0}</div><div class='add'>+EXPECT_WITHIN ${NFS_EXPORT_TIMEOUT} "1" is_nfs_export_available</div><div class='add'>+</div><div class='add'>+# unmount and remount to prevent more race conditions on test systems</div><div class='add'>+EXPECT_WITHIN ${UMOUNT_TIMEOUT} "Y" force_umount ${M0}</div><div class='add'>+TEST glusterfs --acl --resolve-gids --volfile-id=/${V0} --volfile-server=${H0} ${M0}</div><div class='add'>+</div><div class='add'>+su -m ${NEW_USER} -c "touch ${M0}/gid-120/success &gt; /dev/null"</div><div class='add'>+TEST [ $? -eq 0 ]</div><div class='add'>+</div><div class='add'>+# cleanup</div><div class='add'>+userdel --force ${NEW_USER}</div><div class='add'>+for GID in $(seq  -f '%6.0f' ${NEW_GID} ${LAST_GID})</div><div class='add'>+do</div><div class='add'>+        groupdel ${NEW_USER}-${GID}</div><div class='add'>+done</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN ${UMOUNT_TIMEOUT} "Y" force_umount ${M0}</div><div class='add'>+</div><div class='add'>+TEST ${CLI} volume stop ${V0}</div><div class='add'>+TEST ${CLI} volume delete ${V0}</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/bugs/fuse/setup.sh b/tests/bugs/fuse/setup.sh<br/>new file mode 100755<br/>index 00000000000..d44d8dba027<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/fuse/setup.sh?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/fuse/setup.sh</a></div><div class='hunk'>@@ -0,0 +1,20 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+#. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+#Basic checks</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume info</div><div class='add'>+</div><div class='add'>+#Create a distributed volume</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/${V0}{1..2};</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+# Mount FUSE without selinux:</div><div class='add'>+TEST glusterfs -s $H0 --volfile-id $V0 $@ $M0</div><div class='add'>+</div><div class='add'>+echo "Gluster started and volume '$V0' mounted under '$M0'"</div><div class='head'>diff --git a/tests/bugs/fuse/teardown.sh b/tests/bugs/fuse/teardown.sh<br/>new file mode 100755<br/>index 00000000000..5d57974e1f9<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/fuse/teardown.sh?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/fuse/teardown.sh</a></div><div class='hunk'>@@ -0,0 +1,5 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/geo-replication/bug-1111490.t b/tests/bugs/geo-replication/bug-1111490.t<br/>new file mode 100644<br/>index 00000000000..9686fb5a0ef<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/geo-replication/bug-1111490.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/geo-replication/bug-1111490.t</a></div><div class='hunk'>@@ -0,0 +1,35 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/${V0}0</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+# mount with auxiliary gfid mount</div><div class='add'>+TEST $GFS --volfile-id=/$V0 --volfile-server=$H0 $M0 --aux-gfid-mount</div><div class='add'>+</div><div class='add'>+# create file with specific gfid</div><div class='add'>+uuid=`uuidgen`</div><div class='add'>+TEST chown 10:10 $M0</div><div class='add'>+EXPECT "File creation OK" $PYTHON $(dirname $0)/../../utils/gfid-access.py \</div><div class='add'>+                                  $M0 ROOT file0 $uuid file 10 10 0644</div><div class='add'>+</div><div class='add'>+# check gfid</div><div class='add'>+EXPECT "$uuid" getfattr --only-values -n glusterfs.gfid.string $M0/file0</div><div class='add'>+</div><div class='add'>+# unmount and mount again so as to start with a fresh inode table</div><div class='add'>+# or use another mount...</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+TEST $GFS --volfile-id=/$V0 --volfile-server=$H0 $M0 --aux-gfid-mount</div><div class='add'>+</div><div class='add'>+# touch the file again (gfid-access.py handles errno)</div><div class='add'>+EXPECT "File creation OK" $PYTHON  $(dirname $0)/../../utils/gfid-access.py \</div><div class='add'>+                                   $M0 ROOT file0 $uuid file 10 10 0644</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/geo-replication/bug-1296496.t b/tests/bugs/geo-replication/bug-1296496.t<br/>new file mode 100644<br/>index 00000000000..a157be7849a<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/geo-replication/bug-1296496.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/geo-replication/bug-1296496.t</a></div><div class='hunk'>@@ -0,0 +1,44 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+</div><div class='add'>+## Start and create a replicated volume</div><div class='add'>+TEST $CLI volume create $V0 replica 2 $H0:$B0/${V0}-{0,1}</div><div class='add'>+</div><div class='add'>+TEST $CLI volume set $V0 indexing on</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+</div><div class='add'>+## Mount native</div><div class='add'>+TEST glusterfs --volfile-server=$H0 --volfile-id=$V0 $M0</div><div class='add'>+</div><div class='add'>+## Mount client-pid=-1</div><div class='add'>+TEST glusterfs --volfile-server=$H0 --volfile-id=$V0 --client-pid=-1 $M1</div><div class='add'>+</div><div class='add'>+TEST touch $M0</div><div class='add'>+</div><div class='add'>+vol_uuid=$(gluster vol info $V0 | grep "Volume ID" | awk '{print $3}')</div><div class='add'>+</div><div class='add'>+xtime="trusted.glusterfs.$vol_uuid.xtime"</div><div class='add'>+</div><div class='add'>+#TEST xtime</div><div class='add'>+TEST ! getfattr -n $xtime $M0</div><div class='add'>+TEST getfattr -n $xtime $B0/${V0}-0</div><div class='add'>+TEST getfattr -n $xtime $B0/${V0}-1</div><div class='add'>+</div><div class='add'>+#TEST stime</div><div class='add'>+slave_uuid=$(uuidgen)</div><div class='add'>+stime="trusted.glusterfs.$vol_uuid.$slave_uuid.stime"</div><div class='add'>+TEST setfattr -n $stime -v "0xFFFE" $B0/${V0}-0</div><div class='add'>+TEST setfattr -n $stime -v "0xFFFF" $B0/${V0}-1</div><div class='add'>+</div><div class='add'>+TEST ! getfattr -n $stime $M0</div><div class='add'>+TEST getfattr -n $stime $M1</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/geo-replication/bug-877293.t b/tests/bugs/geo-replication/bug-877293.t<br/>new file mode 100755<br/>index 00000000000..c5205e8109e<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/geo-replication/bug-877293.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/geo-replication/bug-877293.t</a></div><div class='hunk'>@@ -0,0 +1,41 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+</div><div class='add'>+## Start and create a replicated volume</div><div class='add'>+mkdir -p ${B0}/${V0}-0</div><div class='add'>+mkdir -p ${B0}/${V0}-1</div><div class='add'>+TEST $CLI volume create $V0 replica 2 $H0:$B0/${V0}-{0,1}</div><div class='add'>+</div><div class='add'>+TEST $CLI volume set $V0 indexing on</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+</div><div class='add'>+## Mount native</div><div class='add'>+TEST glusterfs --volfile-server=$H0 --volfile-id=$V0 $M0</div><div class='add'>+</div><div class='add'>+## Mount client-pid=-1</div><div class='add'>+TEST glusterfs --volfile-server=$H0 --volfile-id=$V0 --client-pid=-1 $M1</div><div class='add'>+</div><div class='add'>+TEST touch $M0</div><div class='add'>+</div><div class='add'>+vol_uuid=`getfattr -n trusted.glusterfs.volume-mark -ehex $M1 | sed -n 's/^trusted.glusterfs.volume-mark=0x//p' | cut -b5-36 | sed 's/\([a-f0-9]\{8\}\)\([a-f0-9]\{4\}\)\([a-f0-9]\{4\}\)\([a-f0-9]\{4\}\)/\1-\2-\3-\4-/'`</div><div class='add'>+xtime=trusted.glusterfs.$vol_uuid.xtime</div><div class='add'>+</div><div class='add'>+TEST "getfattr -n $xtime $B0/${V0}-0 | grep -q ${xtime}="</div><div class='add'>+</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}-0</div><div class='add'>+</div><div class='add'>+TEST "getfattr -n $xtime $B0/${V0}-1 | grep -q ${xtime}="</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M1</div><div class='add'>+</div><div class='add'>+TEST $CLI volume stop $V0;</div><div class='add'>+TEST $CLI volume delete $V0;</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/bugs/gfapi/bug-1032894.t b/tests/bugs/gfapi/bug-1032894.t<br/>new file mode 100644<br/>index 00000000000..88d110136e2<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/gfapi/bug-1032894.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/gfapi/bug-1032894.t</a></div><div class='hunk'>@@ -0,0 +1,33 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+#Check stale indices are deleted as part of self-heal-daemon crawl.</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 replica 2 $H0:$B0/${V0}{0,1}</div><div class='add'>+TEST $CLI volume set $V0 cluster.self-heal-daemon off</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+TEST glusterfs --volfile-id=/$V0 --volfile-server=$H0 $M0</div><div class='add'>+cd $M0</div><div class='add'>+TEST mkdir a</div><div class='add'>+cd a</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}0</div><div class='add'>+# Create stale indices</div><div class='add'>+for i in {1..10}; do echo abc &gt; $i; done</div><div class='add'>+for i in {1..10}; do rm -f $i; done</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 0</div><div class='add'>+TEST $CLI volume set $V0 cluster.self-heal-daemon on</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "Y" glustershd_up_status</div><div class='add'>+</div><div class='add'>+#Since maximum depth of the directory structure that needs healin is 2</div><div class='add'>+#Trigger two self-heals. That should make sure the heal is complete</div><div class='add'>+TEST $CLI volume heal $V0</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "0"  afr_get_index_count $B0/${V0}1</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/bugs/gfapi/bug-1093594.c b/tests/bugs/gfapi/bug-1093594.c<br/>new file mode 100644<br/>index 00000000000..f7a06dd5ba8<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/gfapi/bug-1093594.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/gfapi/bug-1093594.c</a></div><div class='hunk'>@@ -0,0 +1,311 @@</div><div class='add'>+#include &lt;glusterfs/api/glfs.h&gt;</div><div class='add'>+#include &lt;glusterfs/api/glfs-handles.h&gt;</div><div class='add'>+#include &lt;errno.h&gt;</div><div class='add'>+#include &lt;stdio.h&gt;</div><div class='add'>+#include &lt;stdlib.h&gt;</div><div class='add'>+#include &lt;string.h&gt;</div><div class='add'>+</div><div class='add'>+#define WRITE_SIZE (128 * 1024)</div><div class='add'>+#define READ_WRITE_LOOP 100</div><div class='add'>+#define FOP_LOOP_COUNT 20</div><div class='add'>+#define TEST_CASE_LOOP 20</div><div class='add'>+</div><div class='add'>+int gfapi = 1;</div><div class='add'>+static int extension = 1;</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+large_number_of_fops(glfs_t *fs)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+    int i = 0;</div><div class='add'>+    glfs_fd_t *fd = NULL;</div><div class='add'>+    glfs_fd_t *fd1 = NULL;</div><div class='add'>+    char *dir1 = NULL, *dir2 = NULL, *filename1 = NULL, *filename2 = NULL;</div><div class='add'>+    char *buf = NULL;</div><div class='add'>+    struct stat sb = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; FOP_LOOP_COUNT; i++) {</div><div class='add'>+        ret = asprintf(&amp;dir1, "dir%d", extension);</div><div class='add'>+        if (ret &lt; 0) {</div><div class='add'>+            fprintf(stderr, "cannot construct filename (%s)", strerror(errno));</div><div class='add'>+            return ret;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        extension++;</div><div class='add'>+</div><div class='add'>+        ret = glfs_mkdir(fs, dir1, 0755);</div><div class='add'>+        if (ret &lt; 0) {</div><div class='add'>+            fprintf(stderr, "mkdir(%s): %s\n", dir1, strerror(errno));</div><div class='add'>+            return -1;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        fd = glfs_opendir(fs, dir1);</div><div class='add'>+        if (!fd) {</div><div class='add'>+            fprintf(stderr, "/: %s\n", strerror(errno));</div><div class='add'>+            return -1;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        ret = glfs_fsetxattr(fd, "user.dirfattr", "fsetxattr", 8, 0);</div><div class='add'>+        if (ret &lt; 0) {</div><div class='add'>+            fprintf(stderr, "fsetxattr(%s): %d (%s)\n", dir1, ret,</div><div class='add'>+                    strerror(errno));</div><div class='add'>+            return -1;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        ret = glfs_closedir(fd);</div><div class='add'>+        if (ret &lt; 0) {</div><div class='add'>+            fprintf(stderr, "glfs_closedir failed with ret: %d (%s)\n", ret,</div><div class='add'>+                    strerror(errno));</div><div class='add'>+            return -1;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        ret = glfs_rmdir(fs, dir1);</div><div class='add'>+        if (ret &lt; 0) {</div><div class='add'>+            fprintf(stderr, "glfs_unlink failed with ret: %d (%s)\n", ret,</div><div class='add'>+                    strerror(errno));</div><div class='add'>+            return -1;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        ret = asprintf(&amp;filename1, "file%d", extension);</div><div class='add'>+        if (ret &lt; 0) {</div><div class='add'>+            fprintf(stderr, "cannot construct filename (%s)", strerror(errno));</div><div class='add'>+            return ret;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        ret = asprintf(&amp;filename2, "file-%d", extension);</div><div class='add'>+        if (ret &lt; 0) {</div><div class='add'>+            fprintf(stderr, "cannot construct filename (%s)", strerror(errno));</div><div class='add'>+            return ret;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        extension++;</div><div class='add'>+</div><div class='add'>+        fd = glfs_creat(fs, filename1, O_RDWR, 0644);</div><div class='add'>+        if (!fd) {</div><div class='add'>+            fprintf(stderr, "%s: (%p) %s\n", filename1, fd, strerror(errno));</div><div class='add'>+            return -1;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        ret = glfs_rename(fs, filename1, filename2);</div><div class='add'>+        if (ret &lt; 0) {</div><div class='add'>+            fprintf(stderr, "glfs_rename failed with ret: %d (%s)\n", ret,</div><div class='add'>+                    strerror(errno));</div><div class='add'>+            return -1;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        ret = glfs_lstat(fs, filename2, &amp;sb);</div><div class='add'>+        if (ret &lt; 0) {</div><div class='add'>+            fprintf(stderr, "glfs_lstat failed with ret: %d (%s)\n", ret,</div><div class='add'>+                    strerror(errno));</div><div class='add'>+            return -1;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        ret = glfs_close(fd);</div><div class='add'>+        if (ret &lt; 0) {</div><div class='add'>+            fprintf(stderr, "glfs_close failed with ret: %d (%s)\n", ret,</div><div class='add'>+                    strerror(errno));</div><div class='add'>+            return -1;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        ret = glfs_unlink(fs, filename2);</div><div class='add'>+        if (ret &lt; 0) {</div><div class='add'>+            fprintf(stderr, "glfs_unlink failed with ret: %d (%s)\n", ret,</div><div class='add'>+                    strerror(errno));</div><div class='add'>+            return -1;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+large_read_write(glfs_t *fs)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+    int j = 0;</div><div class='add'>+    glfs_fd_t *fd = NULL;</div><div class='add'>+    glfs_fd_t *fd1 = NULL;</div><div class='add'>+    char *filename = NULL;</div><div class='add'>+    char *buf = NULL;</div><div class='add'>+</div><div class='add'>+    ret = asprintf(&amp;filename, "filerw%d", extension);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(stderr, "cannot construct filename (%s)", strerror(errno));</div><div class='add'>+        return ret;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    extension++;</div><div class='add'>+</div><div class='add'>+    fd = glfs_creat(fs, filename, O_RDWR, 0644);</div><div class='add'>+    if (!fd) {</div><div class='add'>+        fprintf(stderr, "%s: (%p) %s\n", filename, fd, strerror(errno));</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    buf = (char *)malloc(WRITE_SIZE);</div><div class='add'>+    memset(buf, '-', WRITE_SIZE);</div><div class='add'>+</div><div class='add'>+    for (j = 0; j &lt; READ_WRITE_LOOP; j++) {</div><div class='add'>+        ret = glfs_write(fd, buf, WRITE_SIZE, 0);</div><div class='add'>+        if (ret &lt; 0) {</div><div class='add'>+            fprintf(stderr, "Write(%s): %d (%s)\n", filename, ret,</div><div class='add'>+                    strerror(errno));</div><div class='add'>+            return ret;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    fd1 = glfs_open(fs, filename, O_RDWR);</div><div class='add'>+    if (fd1 &lt; 0) {</div><div class='add'>+        fprintf(stderr, "Open(%s): %d (%s)\n", filename, ret, strerror(errno));</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    glfs_lseek(fd1, 0, SEEK_SET);</div><div class='add'>+    for (j = 0; j &lt; READ_WRITE_LOOP; j++) {</div><div class='add'>+        ret = glfs_read(fd1, buf, WRITE_SIZE, 0);</div><div class='add'>+        if (ret &lt; 0) {</div><div class='add'>+            fprintf(stderr, "Read(%s): %d (%s)\n", filename, ret,</div><div class='add'>+                    strerror(errno));</div><div class='add'>+            return ret;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    for (j = 0; j &lt; READ_WRITE_LOOP; j++) {</div><div class='add'>+        ret = glfs_write(fd1, buf, WRITE_SIZE, 0);</div><div class='add'>+        if (ret &lt; 0) {</div><div class='add'>+            fprintf(stderr, "Write(%s): %d (%s)\n", filename, ret,</div><div class='add'>+                    strerror(errno));</div><div class='add'>+            return ret;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    glfs_close(fd);</div><div class='add'>+    glfs_close(fd1);</div><div class='add'>+    ret = glfs_unlink(fs, filename);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(stderr, "glfs_unlink failed with ret: %d (%s)\n", ret,</div><div class='add'>+                strerror(errno));</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    free(buf);</div><div class='add'>+    free(filename);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+volfile_change(const char *volname)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+    char *cmd = NULL, *cmd1 = NULL;</div><div class='add'>+</div><div class='add'>+    ret = asprintf(&amp;cmd, "gluster volume set %s stat-prefetch off", volname);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(stderr, "cannot construct cli command string (%s)",</div><div class='add'>+                strerror(errno));</div><div class='add'>+        return ret;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = asprintf(&amp;cmd1, "gluster volume set %s stat-prefetch on", volname);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(stderr, "cannot construct cli command string (%s)",</div><div class='add'>+                strerror(errno));</div><div class='add'>+        return ret;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = system(cmd);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(stderr, "stat-prefetch off on (%s) failed", volname);</div><div class='add'>+        return ret;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = system(cmd1);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(stderr, "stat-prefetch on on (%s) failed", volname);</div><div class='add'>+        return ret;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    free(cmd);</div><div class='add'>+    free(cmd1);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+main(int argc, char *argv[])</div><div class='add'>+{</div><div class='add'>+    glfs_t *fs = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    int i = 0;</div><div class='add'>+    glfs_fd_t *fd = NULL;</div><div class='add'>+    glfs_fd_t *fd1 = NULL;</div><div class='add'>+    char *topdir = "topdir", *filename = "file1";</div><div class='add'>+    char *buf = NULL;</div><div class='add'>+    char *logfile = NULL;</div><div class='add'>+    char *hostname = NULL;</div><div class='add'>+</div><div class='add'>+    if (argc != 4) {</div><div class='add'>+        fprintf(stderr,</div><div class='add'>+                "Expect following args %s &lt;hostname&gt; &lt;Vol&gt; &lt;log file&gt;\n",</div><div class='add'>+                argv[0]);</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    hostname = argv[1];</div><div class='add'>+    logfile = argv[3];</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; TEST_CASE_LOOP; i++) {</div><div class='add'>+        fs = glfs_new(argv[2]);</div><div class='add'>+        if (!fs) {</div><div class='add'>+            fprintf(stderr, "glfs_new: returned NULL (%s)\n", strerror(errno));</div><div class='add'>+            return -1;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        ret = glfs_set_volfile_server(fs, "tcp", hostname, 24007);</div><div class='add'>+        if (ret &lt; 0) {</div><div class='add'>+            fprintf(stderr, "glfs_set_volfile_server failed ret:%d (%s)\n", ret,</div><div class='add'>+                    strerror(errno));</div><div class='add'>+            return -1;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        ret = glfs_set_logging(fs, logfile, 7);</div><div class='add'>+        if (ret &lt; 0) {</div><div class='add'>+            fprintf(stderr, "glfs_set_logging failed with ret: %d (%s)\n", ret,</div><div class='add'>+                    strerror(errno));</div><div class='add'>+            return -1;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        ret = glfs_init(fs);</div><div class='add'>+        if (ret &lt; 0) {</div><div class='add'>+            fprintf(stderr, "glfs_init failed with ret: %d (%s)\n", ret,</div><div class='add'>+                    strerror(errno));</div><div class='add'>+            return -1;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        ret = large_number_of_fops(fs);</div><div class='add'>+        if (ret &lt; 0)</div><div class='add'>+            return -1;</div><div class='add'>+</div><div class='add'>+        ret = large_read_write(fs);</div><div class='add'>+        if (ret &lt; 0)</div><div class='add'>+            return -1;</div><div class='add'>+</div><div class='add'>+        ret = volfile_change(argv[2]);</div><div class='add'>+        if (ret &lt; 0)</div><div class='add'>+            return -1;</div><div class='add'>+</div><div class='add'>+        ret = large_number_of_fops(fs);</div><div class='add'>+        if (ret &lt; 0)</div><div class='add'>+            return -1;</div><div class='add'>+</div><div class='add'>+        ret = large_read_write(fs);</div><div class='add'>+        if (ret &lt; 0)</div><div class='add'>+            return -1;</div><div class='add'>+</div><div class='add'>+        ret = glfs_fini(fs);</div><div class='add'>+        if (ret &lt; 0) {</div><div class='add'>+            fprintf(stderr, "glfs_fini failed with ret: %d (%s)\n", ret,</div><div class='add'>+                    strerror(errno));</div><div class='add'>+            return -1;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='head'>diff --git a/tests/bugs/gfapi/bug-1093594.t b/tests/bugs/gfapi/bug-1093594.t<br/>new file mode 100755<br/>index 00000000000..0c220b3b007<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/gfapi/bug-1093594.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/gfapi/bug-1093594.t</a></div><div class='hunk'>@@ -0,0 +1,22 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+## Start and create a volume</div><div class='add'>+TEST glusterd;</div><div class='add'>+TEST pidof glusterd;</div><div class='add'>+TEST $CLI volume info;</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/${V0}{1,2};</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+logdir=`gluster --print-logdir`</div><div class='add'>+</div><div class='add'>+TEST build_tester $(dirname $0)/bug-1093594.c -lgfapi</div><div class='add'>+TEST $(dirname $0)/bug-1093594 $H0 $V0 $logdir/bug-1093594.log</div><div class='add'>+</div><div class='add'>+cleanup_tester $(dirname $0)/bug-1093594</div><div class='add'>+cleanup;</div><div class='add'>+#G_TESTDEF_TEST_STATUS_NETBSD7=BAD_TEST,BUG=1371541</div><div class='add'>+#G_TESTDEF_TEST_STATUS_CENTOS6=BAD_TEST,BUG=1371541</div><div class='head'>diff --git a/tests/bugs/gfapi/bug-1319374-THIS-crash.t b/tests/bugs/gfapi/bug-1319374-THIS-crash.t<br/>new file mode 100755<br/>index 00000000000..8d3db421c88<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/gfapi/bug-1319374-THIS-crash.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/gfapi/bug-1319374-THIS-crash.t</a></div><div class='hunk'>@@ -0,0 +1,27 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume info;</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/brick1 $H0:$B0/brick2;</div><div class='add'>+EXPECT 'Created' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+EXPECT 'Started' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+TEST $CLI volume set $V0 diagnostics.client-log-flush-timeout 30</div><div class='add'>+</div><div class='add'>+logdir=`gluster --print-logdir`</div><div class='add'>+</div><div class='add'>+TEST build_tester $(dirname $0)/bug-1319374.c -lgfapi</div><div class='add'>+TEST $(dirname $0)/bug-1319374 $H0 $V0 $logdir/bug-1319374.log</div><div class='add'>+</div><div class='add'>+cleanup_tester $(dirname $0)/bug-1319374</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/gfapi/bug-1319374.c b/tests/bugs/gfapi/bug-1319374.c<br/>new file mode 100644<br/>index 00000000000..ea0dfb6b0f2<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/gfapi/bug-1319374.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/gfapi/bug-1319374.c</a></div><div class='hunk'>@@ -0,0 +1,131 @@</div><div class='add'>+#include &lt;glusterfs/api/glfs.h&gt;</div><div class='add'>+#include &lt;glusterfs/api/glfs-handles.h&gt;</div><div class='add'>+#include &lt;errno.h&gt;</div><div class='add'>+#include &lt;stdio.h&gt;</div><div class='add'>+#include &lt;stdlib.h&gt;</div><div class='add'>+#include &lt;string.h&gt;</div><div class='add'>+</div><div class='add'>+#define NO_INIT 1</div><div class='add'>+</div><div class='add'>+glfs_t *</div><div class='add'>+setup_new_client(char *hostname, char *volname, char *log_file, int flag)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+    glfs_t *fs = NULL;</div><div class='add'>+</div><div class='add'>+    fs = glfs_new(volname);</div><div class='add'>+    if (!fs) {</div><div class='add'>+        fprintf(stderr, "\nglfs_new: returned NULL (%s)\n", strerror(errno));</div><div class='add'>+        goto error;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = glfs_set_volfile_server(fs, "tcp", hostname, 24007);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(stderr, "\nglfs_set_volfile_server failed ret:%d (%s)\n", ret,</div><div class='add'>+                strerror(errno));</div><div class='add'>+        goto error;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = glfs_set_logging(fs, log_file, 7);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(stderr, "\nglfs_set_logging failed with ret: %d (%s)\n", ret,</div><div class='add'>+                strerror(errno));</div><div class='add'>+        goto error;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (flag == NO_INIT)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    ret = glfs_init(fs);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(stderr, "\nglfs_init failed with ret: %d (%s)\n", ret,</div><div class='add'>+                strerror(errno));</div><div class='add'>+        goto error;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return fs;</div><div class='add'>+error:</div><div class='add'>+    return NULL;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+main(int argc, char *argv[])</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+    glfs_t *fs1 = NULL;</div><div class='add'>+    glfs_t *fs2 = NULL;</div><div class='add'>+    glfs_t *fs3 = NULL;</div><div class='add'>+    char *volname = NULL;</div><div class='add'>+    char *log_file = NULL;</div><div class='add'>+    char *hostname = NULL;</div><div class='add'>+</div><div class='add'>+    if (argc != 4) {</div><div class='add'>+        fprintf(</div><div class='add'>+            stderr,</div><div class='add'>+            "Expect following args %s &lt;hostname&gt; &lt;Vol&gt; &lt;log file location&gt;\n",</div><div class='add'>+            argv[0]);</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    hostname = argv[1];</div><div class='add'>+    volname = argv[2];</div><div class='add'>+    log_file = argv[3];</div><div class='add'>+</div><div class='add'>+    fs1 = setup_new_client(hostname, volname, log_file, NO_INIT);</div><div class='add'>+    if (!fs1) {</div><div class='add'>+        fprintf(stderr, "\nsetup_new_client: returned NULL (%s)\n",</div><div class='add'>+                strerror(errno));</div><div class='add'>+        goto error;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    fs2 = setup_new_client(hostname, volname, log_file, 0);</div><div class='add'>+    if (!fs2) {</div><div class='add'>+        fprintf(stderr, "\nsetup_new_client: returned NULL (%s)\n",</div><div class='add'>+                strerror(errno));</div><div class='add'>+        goto error;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    fs3 = setup_new_client(hostname, volname, log_file, 0);</div><div class='add'>+    if (!fs3) {</div><div class='add'>+        fprintf(stderr, "\nsetup_new_client: returned NULL (%s)\n",</div><div class='add'>+                strerror(errno));</div><div class='add'>+        goto error;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = glfs_fini(fs3);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(stderr, "glfs_fini failed with ret: %d (%s)\n", ret,</div><div class='add'>+                strerror(errno));</div><div class='add'>+        goto error;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* The crash is seen in gf_log_flush_timeout_cbk(), and this gets</div><div class='add'>+     * triggered when 30s timer expires, hence the sleep of 31s</div><div class='add'>+     */</div><div class='add'>+    sleep(31);</div><div class='add'>+    ret = glfs_fini(fs2);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(stderr, "glfs_fini failed with ret: %d (%s)\n", ret,</div><div class='add'>+                strerror(errno));</div><div class='add'>+        goto error;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = glfs_init(fs1);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(stderr, "\nglfs_init failed with ret: %d (%s)\n", ret,</div><div class='add'>+                strerror(errno));</div><div class='add'>+        goto error;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = glfs_fini(fs1);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(stderr, "glfs_fini failed with ret: %d (%s)\n", ret,</div><div class='add'>+                strerror(errno));</div><div class='add'>+        goto error;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+error:</div><div class='add'>+    return -1;</div><div class='add'>+}</div><div class='head'>diff --git a/tests/bugs/gfapi/bug-1447266/1460514.c b/tests/bugs/gfapi/bug-1447266/1460514.c<br/>new file mode 100644<br/>index 00000000000..c721559a668<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/gfapi/bug-1447266/1460514.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/gfapi/bug-1447266/1460514.c</a></div><div class='hunk'>@@ -0,0 +1,150 @@</div><div class='add'>+#include &lt;fcntl.h&gt;</div><div class='add'>+#include &lt;unistd.h&gt;</div><div class='add'>+#include &lt;time.h&gt;</div><div class='add'>+#include &lt;limits.h&gt;</div><div class='add'>+#include &lt;string.h&gt;</div><div class='add'>+#include &lt;stdio.h&gt;</div><div class='add'>+#include &lt;stdlib.h&gt;</div><div class='add'>+#include &lt;errno.h&gt;</div><div class='add'>+#include &lt;glusterfs/api/glfs.h&gt;</div><div class='add'>+#include &lt;glusterfs/api/glfs-handles.h&gt;</div><div class='add'>+</div><div class='add'>+#define LOG_ERR(func, ret)                                                     \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        if (ret != 0) {                                                        \</div><div class='add'>+            fprintf(stderr, "%s : returned error %d (%s)\n", func, ret,        \</div><div class='add'>+                    strerror(errno));                                          \</div><div class='add'>+            goto out;                                                          \</div><div class='add'>+        } else {                                                               \</div><div class='add'>+            fprintf(stderr, "%s : returned %d\n", func, ret);                  \</div><div class='add'>+        }                                                                      \</div><div class='add'>+    } while (0)</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+main(int argc, char *argv[])</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+    glfs_t *fs = NULL;</div><div class='add'>+    struct glfs_object *root = NULL, *dir = NULL, *subdir = NULL;</div><div class='add'>+    struct stat sb = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    char *dirname = "dir";</div><div class='add'>+    char *subdirname = "subdir";</div><div class='add'>+    char *logfile = NULL;</div><div class='add'>+    char *volname = NULL;</div><div class='add'>+    char *hostname = NULL;</div><div class='add'>+    unsigned char subdir_handle[GFAPI_HANDLE_LENGTH] = {'\0'};</div><div class='add'>+</div><div class='add'>+    if (argc != 4) {</div><div class='add'>+        fprintf(stderr, "Invalid argument\n");</div><div class='add'>+        exit(1);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    hostname = argv[1];</div><div class='add'>+    volname = argv[2];</div><div class='add'>+    logfile = argv[3];</div><div class='add'>+</div><div class='add'>+    fs = glfs_new(volname);</div><div class='add'>+    if (!fs) {</div><div class='add'>+        fprintf(stderr, "glfs_new: returned NULL\n");</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = glfs_set_volfile_server(fs, "tcp", hostname, 24007);</div><div class='add'>+    LOG_ERR("glfs_set_volfile_server", ret);</div><div class='add'>+</div><div class='add'>+    ret = glfs_set_logging(fs, logfile, 7);</div><div class='add'>+    LOG_ERR("glfs_set_logging", ret);</div><div class='add'>+</div><div class='add'>+    ret = glfs_init(fs);</div><div class='add'>+    LOG_ERR("first attempt glfs_init", ret);</div><div class='add'>+</div><div class='add'>+    root = glfs_h_lookupat(fs, NULL, "/", &amp;sb, 0);</div><div class='add'>+    if (root == NULL) {</div><div class='add'>+        fprintf(stderr, "glfs_h_lookupat: error on lookup of / ,%s\n",</div><div class='add'>+                strerror(errno));</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    dir = glfs_h_mkdir(fs, root, dirname, 0644, &amp;sb);</div><div class='add'>+    if (dir == NULL) {</div><div class='add'>+        fprintf(stderr, "glfs_h_mkdir: error on directory creation dir ,%s\n",</div><div class='add'>+                strerror(errno));</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    subdir = glfs_h_mkdir(fs, root, subdirname, 0644, &amp;sb);</div><div class='add'>+    if (subdir == NULL) {</div><div class='add'>+        fprintf(stderr,</div><div class='add'>+                "glfs_h_mkdir: error on directory creation subdir ,%s\n",</div><div class='add'>+                strerror(errno));</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    ret = glfs_h_extract_handle(subdir, subdir_handle, GFAPI_HANDLE_LENGTH);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(stderr,</div><div class='add'>+                "glfs_h_extract_handle: error extracting handle of %s: %s\n",</div><div class='add'>+                subdirname, strerror(errno));</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    glfs_h_close(subdir);</div><div class='add'>+    subdir = NULL;</div><div class='add'>+    glfs_h_close(dir);</div><div class='add'>+    dir = NULL;</div><div class='add'>+</div><div class='add'>+    if (fs) {</div><div class='add'>+        ret = glfs_fini(fs);</div><div class='add'>+        fprintf(stderr, "glfs_fini(fs) returned %d \n", ret);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    fs = NULL;</div><div class='add'>+</div><div class='add'>+    fs = glfs_new(volname);</div><div class='add'>+    if (!fs) {</div><div class='add'>+        fprintf(stderr, "glfs_new: returned NULL\n");</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = glfs_set_volfile_server(fs, "tcp", hostname, 24007);</div><div class='add'>+    LOG_ERR("glfs_set_volfile_server", ret);</div><div class='add'>+</div><div class='add'>+    ret = glfs_set_logging(fs, logfile, 7);</div><div class='add'>+    LOG_ERR("glfs_set_logging", ret);</div><div class='add'>+</div><div class='add'>+    ret = glfs_init(fs);</div><div class='add'>+    LOG_ERR("second attempt glfs_init", ret);</div><div class='add'>+</div><div class='add'>+    subdir = glfs_h_create_from_handle(fs, subdir_handle, GFAPI_HANDLE_LENGTH,</div><div class='add'>+                                       &amp;sb);</div><div class='add'>+    if (subdir == NULL) {</div><div class='add'>+        fprintf(</div><div class='add'>+            stderr,</div><div class='add'>+            "glfs_h_create_from_handle: error on create of %s: from (%p),%s\n",</div><div class='add'>+            subdirname, subdir_handle, strerror(errno));</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    dir = glfs_h_lookupat(fs, subdir, "..", &amp;sb, 0);</div><div class='add'>+    if (dir == NULL) {</div><div class='add'>+        fprintf(stderr,</div><div class='add'>+                "glfs_h_lookupat: error on directory lookup dir using .. ,%s\n",</div><div class='add'>+                strerror(errno));</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (subdir)</div><div class='add'>+        glfs_h_close(subdir);</div><div class='add'>+    if (dir)</div><div class='add'>+        glfs_h_close(dir);</div><div class='add'>+</div><div class='add'>+    if (fs) {</div><div class='add'>+        ret = glfs_fini(fs);</div><div class='add'>+        fprintf(stderr, "glfs_fini(fs) returned %d \n", ret);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (ret)</div><div class='add'>+        exit(1);</div><div class='add'>+    exit(0);</div><div class='add'>+}</div><div class='head'>diff --git a/tests/bugs/gfapi/bug-1447266/1460514.t b/tests/bugs/gfapi/bug-1447266/1460514.t<br/>new file mode 100644<br/>index 00000000000..594af75cae2<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/gfapi/bug-1447266/1460514.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/gfapi/bug-1447266/1460514.t</a></div><div class='hunk'>@@ -0,0 +1,26 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../../include.rc</div><div class='add'>+. $(dirname $0)/../../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/brick1;</div><div class='add'>+EXPECT 'Created' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+EXPECT 'Started' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+logdir=`gluster --print-logdir`</div><div class='add'>+</div><div class='add'>+TEST build_tester $(dirname $0)/1460514.c -lgfapi -o $(dirname $0)/1460514</div><div class='add'>+TEST ./$(dirname $0)/1460514 $H0 $V0  $logdir/1460514.log</div><div class='add'>+</div><div class='add'>+cleanup_tester $(dirname $0)/1460514</div><div class='add'>+</div><div class='add'>+TEST $CLI volume stop $V0</div><div class='add'>+TEST $CLI volume delete $V0</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/gfapi/bug-1447266/bug-1447266.c b/tests/bugs/gfapi/bug-1447266/bug-1447266.c<br/>new file mode 100644<br/>index 00000000000..2b7e2d627fe<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/gfapi/bug-1447266/bug-1447266.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/gfapi/bug-1447266/bug-1447266.c</a></div><div class='hunk'>@@ -0,0 +1,107 @@</div><div class='add'>+#include &lt;glusterfs/api/glfs.h&gt;</div><div class='add'>+#include &lt;stdio.h&gt;</div><div class='add'>+#include &lt;errno.h&gt;</div><div class='add'>+#include &lt;string.h&gt;</div><div class='add'>+#include &lt;stdlib.h&gt;</div><div class='add'>+#define TOTAL_ARGS 4</div><div class='add'>+int</div><div class='add'>+main(int argc, char *argv[])</div><div class='add'>+{</div><div class='add'>+    char *cwd = (char *)malloc(PATH_MAX * sizeof(char *));</div><div class='add'>+    char *resolved = NULL;</div><div class='add'>+    char *result = NULL;</div><div class='add'>+    char *buf = NULL;</div><div class='add'>+    struct stat st;</div><div class='add'>+    char *path = NULL;</div><div class='add'>+    int ret;</div><div class='add'>+</div><div class='add'>+    if (argc != TOTAL_ARGS) {</div><div class='add'>+        printf(</div><div class='add'>+            "Please give all required command line args.\n"</div><div class='add'>+            "Format : &lt;volname&gt; &lt;server_ip&gt; &lt;path_name&gt;\n");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    glfs_t *fs = glfs_new(argv[1]);</div><div class='add'>+</div><div class='add'>+    if (fs == NULL) {</div><div class='add'>+        printf("glfs_new: %s\n", strerror(errno));</div><div class='add'>+        /* No need to fail the test for this error */</div><div class='add'>+        ret = 0;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = glfs_set_volfile_server(fs, "tcp", argv[2], 24007);</div><div class='add'>+    if (ret) {</div><div class='add'>+        printf("glfs_set_volfile_server: %s\n", strerror(errno));</div><div class='add'>+        /* No need to fail the test for this error */</div><div class='add'>+        ret = 0;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    path = argv[3];</div><div class='add'>+</div><div class='add'>+    ret = glfs_set_logging(fs, "/tmp/gfapi.log", 7);</div><div class='add'>+    if (ret) {</div><div class='add'>+        printf("glfs_set_logging: %s\n", strerror(errno));</div><div class='add'>+        /* No need to fail the test for this error */</div><div class='add'>+        ret = 0;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = glfs_init(fs);</div><div class='add'>+    if (ret) {</div><div class='add'>+        printf("glfs_init: %s\n", strerror(errno));</div><div class='add'>+        /* No need to fail the test for this error */</div><div class='add'>+        ret = 0;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    sleep(1);</div><div class='add'>+</div><div class='add'>+    ret = glfs_chdir(fs, path);</div><div class='add'>+    if (ret) {</div><div class='add'>+        printf("glfs_chdir: %s\n", strerror(errno));</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    buf = glfs_getcwd(fs, cwd, PATH_MAX);</div><div class='add'>+    if (cwd == NULL) {</div><div class='add'>+        printf("glfs_getcwd: %s\n", strerror(errno));</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    printf("\ncwd = %s\n\n", cwd);</div><div class='add'>+</div><div class='add'>+    result = glfs_realpath(fs, path, resolved);</div><div class='add'>+    if (result == NULL) {</div><div class='add'>+        printf("glfs_realpath: %s\n", strerror(errno));</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = glfs_stat(fs, path, &amp;st);</div><div class='add'>+    if (ret) {</div><div class='add'>+        printf("glfs_stat: %s\n", strerror(errno));</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    if (cwd)</div><div class='add'>+        free(cwd);</div><div class='add'>+</div><div class='add'>+    result = glfs_realpath(fs, path, resolved);</div><div class='add'>+    if (result == NULL) {</div><div class='add'>+        printf("glfs_realpath: %s\n", strerror(errno));</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = glfs_fini(fs);</div><div class='add'>+    if (ret) {</div><div class='add'>+        printf("glfs_fini: %s\n", strerror(errno));</div><div class='add'>+        /* No need to fail the test for this error */</div><div class='add'>+        ret = 0;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    printf("\n");</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='head'>diff --git a/tests/bugs/gfapi/bug-1447266/bug-1447266.t b/tests/bugs/gfapi/bug-1447266/bug-1447266.t<br/>new file mode 100644<br/>index 00000000000..45547f4f0e7<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/gfapi/bug-1447266/bug-1447266.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/gfapi/bug-1447266/bug-1447266.t</a></div><div class='hunk'>@@ -0,0 +1,60 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../../include.rc</div><div class='add'>+. $(dirname $0)/../../../volume.rc</div><div class='add'>+. $(dirname $0)/../../../snapshot.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST init_n_bricks 3;</div><div class='add'>+TEST setup_lvm 3;</div><div class='add'>+</div><div class='add'>+TEST glusterd;</div><div class='add'>+</div><div class='add'>+TEST pidof glusterd;</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 $H0:$L1 $H0:$L2 $H0:$L3;</div><div class='add'>+TEST $CLI volume set $V0 nfs.disable false</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+</div><div class='add'>+TEST $GFS --volfile-server=$H0 --volfile-id=$V0 $M0;</div><div class='add'>+</div><div class='add'>+for i in {1..10} ; do echo "file" &gt; $M0/file$i ; done</div><div class='add'>+</div><div class='add'>+# Create file and hard-links</div><div class='add'>+TEST touch $M0/f1</div><div class='add'>+TEST mkdir $M0/dir</div><div class='add'>+TEST ln $M0/f1 $M0/f2</div><div class='add'>+TEST ln $M0/f1 $M0/dir/f3</div><div class='add'>+</div><div class='add'>+TEST $CLI snapshot config activate-on-create enable</div><div class='add'>+TEST $CLI volume set $V0 features.uss enable;</div><div class='add'>+</div><div class='add'>+TEST $CLI snapshot create snap1 $V0 no-timestamp;</div><div class='add'>+</div><div class='add'>+for i in {11..20} ; do echo "file" &gt; $M0/file$i ; done</div><div class='add'>+</div><div class='add'>+TEST $CLI snapshot create snap2 $V0 no-timestamp;</div><div class='add'>+TEST build_tester $(dirname $0)/bug-1447266.c -lgfapi</div><div class='add'>+</div><div class='add'>+#Testing strts from here--&gt;</div><div class='add'>+</div><div class='add'>+TEST $(dirname $0)/bug-1447266 $V0 $H0 "/.."</div><div class='add'>+TEST $(dirname $0)/bug-1447266 $V0 $H0 "/."</div><div class='add'>+TEST $(dirname $0)/bug-1447266 $V0 $H0 "/../."</div><div class='add'>+TEST $(dirname $0)/bug-1447266 $V0 $H0 "/../.."</div><div class='add'>+TEST $(dirname $0)/bug-1447266 $V0 $H0 "/dir/../."</div><div class='add'>+#Since dir1 is not present, this test should fail</div><div class='add'>+TEST ! $(dirname $0)/bug-1447266 $V0 $H0 "/dir/../dir1"</div><div class='add'>+TEST $(dirname $0)/bug-1447266 $V0 $H0 "/dir/.."</div><div class='add'>+TEST $(dirname $0)/bug-1447266 $V0 $H0 "/.snaps"</div><div class='add'>+TEST $(dirname $0)/bug-1447266 $V0 $H0 "/.snaps/."</div><div class='add'>+#Since snap3 is not present, this test should fail</div><div class='add'>+TEST ! $(dirname $0)/bug-1447266 $V0 $H0 "/.snaps/.././snap3"</div><div class='add'>+TEST $(dirname $0)/bug-1447266 $V0 $H0 "/.snaps/../."</div><div class='add'>+TEST $(dirname $0)/bug-1447266 $V0 $H0 "/.snaps/./snap1/./../snap1/dir/."</div><div class='add'>+</div><div class='add'>+cleanup_tester $(dirname $0)/bug-1447266</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/gfapi/bug-1630804/gfapi-bz1630804.c b/tests/bugs/gfapi/bug-1630804/gfapi-bz1630804.c<br/>new file mode 100644<br/>index 00000000000..d151784627c<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/gfapi/bug-1630804/gfapi-bz1630804.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/gfapi/bug-1630804/gfapi-bz1630804.c</a></div><div class='hunk'>@@ -0,0 +1,112 @@</div><div class='add'>+#include &lt;inttypes.h&gt;</div><div class='add'>+#include &lt;stdio.h&gt;</div><div class='add'>+#include &lt;string.h&gt;</div><div class='add'>+#include &lt;errno.h&gt;</div><div class='add'>+#include &lt;stdlib.h&gt;</div><div class='add'>+#include &lt;glusterfs/api/glfs.h&gt;</div><div class='add'>+#include &lt;glusterfs/api/glfs-handles.h&gt;</div><div class='add'>+</div><div class='add'>+#define VALIDATE_AND_GOTO_LABEL_ON_ERROR(func, ret, label)                     \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        if (ret &lt; 0) {                                                         \</div><div class='add'>+            fprintf(stderr, "%s : returned error %d (%s)\n", func, ret,        \</div><div class='add'>+                    strerror(errno));                                          \</div><div class='add'>+            goto label;                                                        \</div><div class='add'>+        }                                                                      \</div><div class='add'>+    } while (0)</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+main(int argc, char *argv[])</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int flags = O_WRONLY | O_CREAT | O_TRUNC;</div><div class='add'>+    int do_write = 0;</div><div class='add'>+    glfs_t *fs = NULL;</div><div class='add'>+    glfs_fd_t *fd1 = NULL;</div><div class='add'>+    glfs_fd_t *fd2 = NULL;</div><div class='add'>+    char *volname = NULL;</div><div class='add'>+    char *logfile = NULL;</div><div class='add'>+    const char *dirname = "/some_dir1";</div><div class='add'>+    const char *filename = "/some_dir1/testfile";</div><div class='add'>+    const char *short_filename = "testfile";</div><div class='add'>+    struct stat sb;</div><div class='add'>+    char buf[512];</div><div class='add'>+    struct dirent *entry = NULL;</div><div class='add'>+</div><div class='add'>+    if (argc != 4) {</div><div class='add'>+        fprintf(stderr, "Invalid argument\n");</div><div class='add'>+        fprintf(stderr, "Usage: %s &lt;volname&gt; &lt;logfile&gt; &lt;do-write [0/1]\n",</div><div class='add'>+                argv[0]);</div><div class='add'>+        return 1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    volname = argv[1];</div><div class='add'>+    logfile = argv[2];</div><div class='add'>+    do_write = atoi(argv[3]);</div><div class='add'>+</div><div class='add'>+    fs = glfs_new(volname);</div><div class='add'>+    if (!fs)</div><div class='add'>+        VALIDATE_AND_GOTO_LABEL_ON_ERROR("glfs_new", ret, out);</div><div class='add'>+</div><div class='add'>+    ret = glfs_set_volfile_server(fs, "tcp", "localhost", 24007);</div><div class='add'>+    VALIDATE_AND_GOTO_LABEL_ON_ERROR("glfs_set_volfile_server", ret, out);</div><div class='add'>+</div><div class='add'>+    ret = glfs_set_logging(fs, logfile, 7);</div><div class='add'>+    VALIDATE_AND_GOTO_LABEL_ON_ERROR("glfs_set_logging", ret, out);</div><div class='add'>+</div><div class='add'>+    ret = glfs_init(fs);</div><div class='add'>+    VALIDATE_AND_GOTO_LABEL_ON_ERROR("glfs_init", ret, out);</div><div class='add'>+</div><div class='add'>+    ret = glfs_mkdir(fs, dirname, 0755);</div><div class='add'>+    if (ret &amp;&amp; errno != EEXIST)</div><div class='add'>+        VALIDATE_AND_GOTO_LABEL_ON_ERROR("glfs_mkdir", ret, out);</div><div class='add'>+</div><div class='add'>+    fd1 = glfs_creat(fs, filename, flags, 0644);</div><div class='add'>+    if (fd1 == NULL) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        VALIDATE_AND_GOTO_LABEL_ON_ERROR("glfs_creat", ret, out);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (do_write) {</div><div class='add'>+        ret = glfs_write(fd1, "hello world", 11, flags);</div><div class='add'>+        VALIDATE_AND_GOTO_LABEL_ON_ERROR("glfs_write", ret, out);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    fd2 = glfs_opendir(fs, dirname);</div><div class='add'>+    if (fd2 == NULL) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        VALIDATE_AND_GOTO_LABEL_ON_ERROR("glfs_opendir", ret, out);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    do {</div><div class='add'>+        ret = glfs_readdirplus_r(fd2, &amp;sb, (struct dirent *)buf, &amp;entry);</div><div class='add'>+        if (entry != NULL) {</div><div class='add'>+            if (!strcmp(entry-&gt;d_name, short_filename)) {</div><div class='add'>+                if (sb.st_mode == 0) {</div><div class='add'>+                    fprintf(</div><div class='add'>+                        stderr,</div><div class='add'>+                        "Mode bits are incorrect: d_name - %s, st_mode - %jd\n",</div><div class='add'>+                        entry-&gt;d_name, (intmax_t)sb.st_mode);</div><div class='add'>+                    ret = -1;</div><div class='add'>+                    goto out;</div><div class='add'>+                }</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+    } while (entry != NULL);</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (fd1 != NULL)</div><div class='add'>+        glfs_close(fd1);</div><div class='add'>+    if (fd2 != NULL)</div><div class='add'>+        glfs_closedir(fd2);</div><div class='add'>+</div><div class='add'>+    if (fs) {</div><div class='add'>+        /*</div><div class='add'>+         * If this fails (as it does on Special Snowflake NetBSD for no</div><div class='add'>+         * good reason), it shouldn't affect the result of the test.</div><div class='add'>+         */</div><div class='add'>+        (void)glfs_fini(fs);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='head'>diff --git a/tests/bugs/gfapi/bug-1630804/gfapi-bz1630804.t b/tests/bugs/gfapi/bug-1630804/gfapi-bz1630804.t<br/>new file mode 100644<br/>index 00000000000..ac59aeeb47b<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/gfapi/bug-1630804/gfapi-bz1630804.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/gfapi/bug-1630804/gfapi-bz1630804.t</a></div><div class='hunk'>@@ -0,0 +1,25 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../../include.rc</div><div class='add'>+. $(dirname $0)/../../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 ${H0}:$B0/brick1;</div><div class='add'>+EXPECT 'Created' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+EXPECT 'Started' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+logdir=`gluster --print-logdir`</div><div class='add'>+</div><div class='add'>+build_tester $(dirname $0)/gfapi-bz1630804.c -lgfapi</div><div class='add'>+</div><div class='add'>+TEST ./$(dirname $0)/gfapi-bz1630804 $V0 $logdir/gfapi-bz1630804.log 0</div><div class='add'>+TEST ./$(dirname $0)/gfapi-bz1630804 $V0 $logdir/gfapi-bz1630804.log 1</div><div class='add'>+</div><div class='add'>+cleanup_tester $(dirname $0)/gfapi-trunc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/gfapi/glfs_vol_set_IO_ERR.c b/tests/bugs/gfapi/glfs_vol_set_IO_ERR.c<br/>new file mode 100644<br/>index 00000000000..f38f01144d3<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/gfapi/glfs_vol_set_IO_ERR.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/gfapi/glfs_vol_set_IO_ERR.c</a></div><div class='hunk'>@@ -0,0 +1,163 @@</div><div class='add'>+#include &lt;glusterfs/api/glfs.h&gt;</div><div class='add'>+#include &lt;glusterfs/api/glfs-handles.h&gt;</div><div class='add'>+#include &lt;errno.h&gt;</div><div class='add'>+#include &lt;stdio.h&gt;</div><div class='add'>+#include &lt;stdlib.h&gt;</div><div class='add'>+#include &lt;string.h&gt;</div><div class='add'>+</div><div class='add'>+#define WRITE_SIZE (128)</div><div class='add'>+</div><div class='add'>+glfs_t *</div><div class='add'>+setup_new_client(char *hostname, char *volname, char *log_fileile)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+    glfs_t *fs = NULL;</div><div class='add'>+</div><div class='add'>+    fs = glfs_new(volname);</div><div class='add'>+    if (!fs) {</div><div class='add'>+        fprintf(stderr, "\nglfs_new: returned NULL (%s)\n", strerror(errno));</div><div class='add'>+        goto error;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = glfs_set_volfile_server(fs, "tcp", hostname, 24007);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(stderr, "\nglfs_set_volfile_server failed ret:%d (%s)\n", ret,</div><div class='add'>+                strerror(errno));</div><div class='add'>+        goto error;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = glfs_set_logging(fs, log_fileile, 7);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(stderr, "\nglfs_set_logging failed with ret: %d (%s)\n", ret,</div><div class='add'>+                strerror(errno));</div><div class='add'>+        goto error;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = glfs_init(fs);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(stderr, "\nglfs_init failed with ret: %d (%s)\n", ret,</div><div class='add'>+                strerror(errno));</div><div class='add'>+        goto error;</div><div class='add'>+    }</div><div class='add'>+    return fs;</div><div class='add'>+error:</div><div class='add'>+    return NULL;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+write_something(glfs_t *fs)</div><div class='add'>+{</div><div class='add'>+    glfs_fd_t *fd = NULL;</div><div class='add'>+    char *buf = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    int j = 0;</div><div class='add'>+</div><div class='add'>+    fd = glfs_creat(fs, "filename", O_RDWR, 0644);</div><div class='add'>+    if (!fd) {</div><div class='add'>+        fprintf(stderr, "%s: (%p) %s\n", "filename", fd, strerror(errno));</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    buf = (char *)malloc(WRITE_SIZE);</div><div class='add'>+    memset(buf, '-', WRITE_SIZE);</div><div class='add'>+</div><div class='add'>+    for (j = 0; j &lt; 4; j++) {</div><div class='add'>+        ret = glfs_write(fd, buf, WRITE_SIZE, 0);</div><div class='add'>+        if (ret &lt; 0) {</div><div class='add'>+            fprintf(stderr, "Write(%s): %d (%s)\n", "filename", ret,</div><div class='add'>+                    strerror(errno));</div><div class='add'>+            return ret;</div><div class='add'>+        }</div><div class='add'>+        glfs_lseek(fd, 0, SEEK_SET);</div><div class='add'>+    }</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+volfile_change(const char *volname)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+    char *cmd = NULL, *cmd1 = NULL;</div><div class='add'>+</div><div class='add'>+    ret = asprintf(&amp;cmd, "gluster volume set %s quick-read on", volname);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(stderr, "cannot construct cli command string (%s)",</div><div class='add'>+                strerror(errno));</div><div class='add'>+        return ret;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = asprintf(&amp;cmd1, "gluster volume set %s quick-read off", volname);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(stderr, "cannot construct cli command string (%s)",</div><div class='add'>+                strerror(errno));</div><div class='add'>+        return ret;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = system(cmd);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(stderr, "quick-read off on (%s) failed", volname);</div><div class='add'>+        return ret;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = system(cmd1);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(stderr, "quick-read on on (%s) failed", volname);</div><div class='add'>+        return ret;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = system(cmd);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(stderr, "quick-read off on (%s) failed", volname);</div><div class='add'>+        return ret;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    free(cmd);</div><div class='add'>+    free(cmd1);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+main(int argc, char *argv[])</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+    glfs_t *fs = NULL;</div><div class='add'>+    char buf[100];</div><div class='add'>+    glfs_fd_t *fd = NULL;</div><div class='add'>+</div><div class='add'>+    if (argc != 4) {</div><div class='add'>+        fprintf(</div><div class='add'>+            stderr,</div><div class='add'>+            "Expect following args %s &lt;hostname&gt; &lt;Vol&gt; &lt;log file location&gt;\n",</div><div class='add'>+            argv[0]);</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    fs = setup_new_client(argv[1], argv[2], argv[3]);</div><div class='add'>+    if (!fs)</div><div class='add'>+        goto error;</div><div class='add'>+</div><div class='add'>+    ret = volfile_change(argv[2]);</div><div class='add'>+    if (ret &lt; 0)</div><div class='add'>+        goto error;</div><div class='add'>+</div><div class='add'>+    /* This is required as volfile change takes a while to reach this</div><div class='add'>+     * gfapi client and precess the graph change. Without this the issue</div><div class='add'>+     * cannot be reproduced as in cannot be tested.</div><div class='add'>+     */</div><div class='add'>+    sleep(10);</div><div class='add'>+</div><div class='add'>+    ret = write_something(fs);</div><div class='add'>+    if (ret &lt; 0)</div><div class='add'>+        goto error;</div><div class='add'>+</div><div class='add'>+    ret = glfs_fini(fs);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(stderr, "glfs_fini failed with ret: %d (%s)\n", ret,</div><div class='add'>+                strerror(errno));</div><div class='add'>+        goto error;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+error:</div><div class='add'>+    return -1;</div><div class='add'>+}</div><div class='head'>diff --git a/tests/bugs/gfapi/glfs_vol_set_IO_ERR.t b/tests/bugs/gfapi/glfs_vol_set_IO_ERR.t<br/>new file mode 100755<br/>index 00000000000..5893ef273bd<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/gfapi/glfs_vol_set_IO_ERR.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/gfapi/glfs_vol_set_IO_ERR.t</a></div><div class='hunk'>@@ -0,0 +1,20 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+## Start and create a volume</div><div class='add'>+TEST glusterd;</div><div class='add'>+TEST pidof glusterd;</div><div class='add'>+TEST $CLI volume info;</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/${V0}{1,2};</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+logdir=`gluster --print-logdir`</div><div class='add'>+</div><div class='add'>+TEST build_tester $(dirname $0)/glfs_vol_set_IO_ERR.c -lgfapi</div><div class='add'>+TEST $(dirname $0)/glfs_vol_set_IO_ERR $H0 $V0 $logdir/glfs_vol_set_IO_ERR.log</div><div class='add'>+</div><div class='add'>+cleanup_tester $(dirname $0)/glfs_vol_set_IO_ERR</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/glusterd/859927/repl.t b/tests/bugs/glusterd/859927/repl.t<br/>new file mode 100755<br/>index 00000000000..6e7c23b5b1d<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/glusterd/859927/repl.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/glusterd/859927/repl.t</a></div><div class='hunk'>@@ -0,0 +1,59 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../../include.rc</div><div class='add'>+. $(dirname $0)/../../../volume.rc</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd;</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+</div><div class='add'>+#Tests for data-self-heal-algorithm option</div><div class='add'>+function create_setup_for_self_heal {</div><div class='add'>+        file=$1</div><div class='add'>+        kill_brick $V0 $H0 $B0/${V0}1</div><div class='add'>+        dd of=$file if=/dev/urandom bs=1024k count=1 2&gt;&amp;1 &gt; /dev/null</div><div class='add'>+        $CLI volume start $V0 force</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function test_write {</div><div class='add'>+        dd of=$M0/a if=/dev/urandom bs=1k count=1 2&gt;&amp;1 &gt; /dev/null</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 replica 2 $H0:$B0/${V0}{1,2};</div><div class='add'>+TEST $CLI volume set $V0 cluster.self-heal-daemon off</div><div class='add'>+TEST $CLI volume set $V0 performance.stat-prefetch off</div><div class='add'>+TEST $CLI volume set $V0 client-log-level DEBUG</div><div class='add'>+TEST $CLI volume set $V0 cluster.data-self-heal on</div><div class='add'>+TEST $CLI volume set $V0 cluster.metadata-self-heal on</div><div class='add'>+TEST $CLI volume set $V0 cluster.entry-self-heal on</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+TEST glusterfs --entry-timeout=0 --attribute-timeout=0 -s $H0 --volfile-id=$V0 $M0;</div><div class='add'>+</div><div class='add'>+touch $M0/a</div><div class='add'>+</div><div class='add'>+TEST $CLI volume set $V0 cluster.data-self-heal-algorithm full</div><div class='add'>+EXPECT full volume_option $V0 cluster.data-self-heal-algorithm</div><div class='add'>+create_setup_for_self_heal $M0/a</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status $V0 0</div><div class='add'>+cat $file &gt; /dev/null 2&gt;&amp;1</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT 0 get_pending_heal_count $V0</div><div class='add'>+TEST cmp $B0/${V0}1/a $B0/${V0}2/a</div><div class='add'>+</div><div class='add'>+TEST $CLI volume set $V0 cluster.data-self-heal-algorithm diff</div><div class='add'>+EXPECT diff volume_option $V0 cluster.data-self-heal-algorithm</div><div class='add'>+create_setup_for_self_heal $M0/a</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status $V0 0</div><div class='add'>+cat $file &gt; /dev/null 2&gt;&amp;1</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT 0 get_pending_heal_count $V0</div><div class='add'>+TEST cmp $B0/${V0}1/a $B0/${V0}2/a</div><div class='add'>+</div><div class='add'>+TEST $CLI volume reset $V0 cluster.data-self-heal-algorithm</div><div class='add'>+create_setup_for_self_heal $M0/a</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status $V0 0</div><div class='add'>+cat $file &gt; /dev/null 2&gt;&amp;1</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT 0 get_pending_heal_count $V0</div><div class='add'>+TEST cmp $B0/${V0}1/a $B0/${V0}2/a</div><div class='add'>+</div><div class='add'>+TEST ! $CLI volume set $V0 cluster.data-self-heal-algorithm ""</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/glusterd/add-brick-and-validate-replicated-volume-options.t b/tests/bugs/glusterd/add-brick-and-validate-replicated-volume-options.t<br/>new file mode 100644<br/>index 00000000000..95d0eb69ac1<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/glusterd/add-brick-and-validate-replicated-volume-options.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/glusterd/add-brick-and-validate-replicated-volume-options.t</a></div><div class='hunk'>@@ -0,0 +1,110 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 replica 2 $H0:$B0/${V0}{1,2};</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT 'Started' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+#bug-1102656 - validating volume top command</div><div class='add'>+</div><div class='add'>+TEST $CLI volume top $V0 open</div><div class='add'>+TEST ! $CLI volume top $V0 open brick $H0:/tmp/brick</div><div class='add'>+TEST $CLI volume top $V0 read</div><div class='add'>+</div><div class='add'>+TEST $CLI volume status</div><div class='add'>+</div><div class='add'>+#bug- 1002556</div><div class='add'>+EXPECT '1 x 2 = 2' volinfo_field $V0 'Number of Bricks';</div><div class='add'>+</div><div class='add'>+TEST $CLI volume add-brick $V0 replica 3 $H0:$B0/${V0}3</div><div class='add'>+EXPECT '1 x 3 = 3' volinfo_field $V0 'Number of Bricks';</div><div class='add'>+</div><div class='add'>+TEST $CLI volume remove-brick $V0 replica 2 $H0:$B0/${V0}3 force</div><div class='add'>+EXPECT '1 x 2 = 2' volinfo_field $V0 'Number of Bricks';</div><div class='add'>+</div><div class='add'>+TEST killall glusterd</div><div class='add'>+TEST glusterd</div><div class='add'>+</div><div class='add'>+EXPECT '1 x 2 = 2' volinfo_field $V0 'Number of Bricks';</div><div class='add'>+</div><div class='add'>+#bug-1406411- fail-add-brick-when-replica-count-changes</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status $V0 $H0 $B0/${V0}1</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status $V0 $H0 $B0/${V0}2</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}1</div><div class='add'>+</div><div class='add'>+#add-brick should fail</div><div class='add'>+TEST ! $CLI_NO_FORCE volume add-brick $V0 replica 3 $H0:$B0/${V0}3</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status $V0 $H0 $B0/${V0}1</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status $V0 $H0 $B0/${V0}2</div><div class='add'>+TEST $CLI volume add-brick $V0 replica 3 $H0:$B0/${V0}3</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V1 $H0:$B0/${V1}{1,2};</div><div class='add'>+TEST $CLI volume start $V1</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status $V1 $H0 $B0/${V1}1</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status $V1 $H0 $B0/${V1}2</div><div class='add'>+TEST kill_brick $V1 $H0 $B0/${V1}1</div><div class='add'>+</div><div class='add'>+#add-brick should fail</div><div class='add'>+TEST ! $CLI_NO_FORCE volume add-brick $V1 replica 2 $H0:$B0/${V1}{3,4}</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V1 force</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status $V1 $H0 $B0/${V1}1</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status $V1 $H0 $B0/${V1}2</div><div class='add'>+</div><div class='add'>+TEST $CLI volume add-brick $V1 replica 2 $H0:$B0/${V1}{3,4}</div><div class='add'>+</div><div class='add'>+#bug-905307 - validate cluster.post-op-delay-secs option</div><div class='add'>+</div><div class='add'>+#Strings should not be accepted.</div><div class='add'>+TEST ! $CLI volume set $V0 cluster.post-op-delay-secs abc</div><div class='add'>+</div><div class='add'>+#-ve ints should not be accepted.</div><div class='add'>+TEST ! $CLI volume set $V0 cluster.post-op-delay-secs -1</div><div class='add'>+</div><div class='add'>+#INT_MAX+1 should not be accepted.</div><div class='add'>+TEST ! $CLI volume set $V0 cluster.post-op-delay-secs 2147483648</div><div class='add'>+</div><div class='add'>+#floats should not be accepted.</div><div class='add'>+TEST ! $CLI volume set $V0 cluster.post-op-delay-secs 1.25</div><div class='add'>+</div><div class='add'>+#min val 0 should be accepted</div><div class='add'>+TEST $CLI volume set $V0 cluster.post-op-delay-secs 0</div><div class='add'>+EXPECT "0" volume_option $V0 cluster.post-op-delay-secs</div><div class='add'>+</div><div class='add'>+#max val 2147483647 should be accepted</div><div class='add'>+TEST $CLI volume set $V0 cluster.post-op-delay-secs 2147483647</div><div class='add'>+EXPECT "2147483647" volume_option $V0 cluster.post-op-delay-secs</div><div class='add'>+</div><div class='add'>+#some middle val in range 2147 should be accepted</div><div class='add'>+TEST $CLI volume set $V0 cluster.post-op-delay-secs 2147</div><div class='add'>+EXPECT "2147" volume_option $V0 cluster.post-op-delay-secs</div><div class='add'>+</div><div class='add'>+#bug-1265479 - validate-replica-volume-options</div><div class='add'>+</div><div class='add'>+#Setting data-self-heal option on for distribute-replicate volume</div><div class='add'>+TEST $CLI volume set $V1 data-self-heal on</div><div class='add'>+EXPECT 'on' volinfo_field $V1 'cluster.data-self-heal';</div><div class='add'>+TEST $CLI volume set $V1 cluster.data-self-heal on</div><div class='add'>+EXPECT 'on' volinfo_field $V1 'cluster.data-self-heal';</div><div class='add'>+</div><div class='add'>+#Setting metadata-self-heal option on for distribute-replicate volume</div><div class='add'>+TEST $CLI volume set $V1 metadata-self-heal on</div><div class='add'>+EXPECT 'on' volinfo_field $V1 'cluster.metadata-self-heal';</div><div class='add'>+TEST $CLI volume set $V1 cluster.metadata-self-heal on</div><div class='add'>+</div><div class='add'>+#Setting entry-self-heal option on for distribute-replicate volume</div><div class='add'>+TEST $CLI volume set $V1 entry-self-heal on</div><div class='add'>+EXPECT 'on' volinfo_field $V1 'cluster.entry-self-heal';</div><div class='add'>+TEST $CLI volume set $V1 cluster.entry-self-heal on</div><div class='add'>+EXPECT 'on' volinfo_field $V1 'cluster.entry-self-heal';</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/bugs/glusterd/brick-mux-validation-in-cluster.t b/tests/bugs/glusterd/brick-mux-validation-in-cluster.t<br/>new file mode 100644<br/>index 00000000000..b6af487a791<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/glusterd/brick-mux-validation-in-cluster.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/glusterd/brick-mux-validation-in-cluster.t</a></div><div class='hunk'>@@ -0,0 +1,108 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../cluster.rc</div><div class='add'>+</div><div class='add'>+function count_brick_processes {</div><div class='add'>+        pgrep glusterfsd | wc -l</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function count_brick_pids {</div><div class='add'>+        $CLI_1 --xml volume status all | sed -n '/.*&lt;pid&gt;\([^&lt;]*\).*/s//\1/p' \</div><div class='add'>+                                     | grep -v "N/A" | sort | uniq | wc -l</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function count_N/A_brick_pids {</div><div class='add'>+        $CLI_1 --xml volume status all | sed -n '/.*&lt;pid&gt;\([^&lt;]*\).*/s//\1/p' \</div><div class='add'>+                                     | grep -- '\-1' | sort | uniq | wc -l</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function check_peers {</div><div class='add'>+        $CLI_2 peer status | grep 'Peer in Cluster (Connected)' | wc -l</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST launch_cluster 3</div><div class='add'>+TEST $CLI_1 peer probe $H2;</div><div class='add'>+EXPECT_WITHIN $PROBE_TIMEOUT 1 peer_count</div><div class='add'>+</div><div class='add'>+TEST $CLI_1 peer probe $H3;</div><div class='add'>+EXPECT_WITHIN $PROBE_TIMEOUT 2 peer_count</div><div class='add'>+</div><div class='add'>+TEST $CLI_1 volume set all cluster.brick-multiplex on</div><div class='add'>+#bug-1609163 - bricks of normal volume should not attach to bricks of gluster_shared_storage volume</div><div class='add'>+</div><div class='add'>+##Create, start and mount meta_volume i.e., shared_storage</div><div class='add'>+TEST $CLI_1 volume create $META_VOL replica 3 $H1:$B1/${META_VOL}1 $H2:$B2/${META_VOL}1 $H3:$B3/${META_VOL}1</div><div class='add'>+TEST $CLI_1 volume start $META_VOL</div><div class='add'>+TEST mkdir -p $META_MNT</div><div class='add'>+TEST glusterfs -s $H1 --volfile-id $META_VOL $META_MNT</div><div class='add'>+</div><div class='add'>+TEST $CLI_1 volume info gluster_shared_storage</div><div class='add'>+</div><div class='add'>+EXPECT 3 count_brick_processes</div><div class='add'>+</div><div class='add'>+#create and start a new volume</div><div class='add'>+TEST $CLI_1 volume create $V0 replica 3 $H1:$B1/${V0}{1..3} $H2:$B2/${V0}{1..3}</div><div class='add'>+TEST $CLI_1 volume start $V0</div><div class='add'>+</div><div class='add'>+# bricks of normal volume should not attach to bricks of gluster_shared_storage volume</div><div class='add'>+EXPECT 5 count_brick_processes</div><div class='add'>+</div><div class='add'>+#bug-1549996 - stale brick processes on the nodes after volume deletion</div><div class='add'>+</div><div class='add'>+TEST $CLI_1 volume create $V1 replica 3 $H1:$B1/${V1}{1..3} $H2:$B2/${V1}{1..3}</div><div class='add'>+TEST $CLI_1 volume start $V1</div><div class='add'>+</div><div class='add'>+EXPECT 5 count_brick_processes</div><div class='add'>+</div><div class='add'>+TEST $CLI_1 volume stop $V0</div><div class='add'>+TEST $CLI_1 volume stop $V1</div><div class='add'>+</div><div class='add'>+EXPECT 3 count_brick_processes</div><div class='add'>+</div><div class='add'>+TEST $CLI_1 volume stop $META_VOL</div><div class='add'>+</div><div class='add'>+TEST $CLI_1 volume delete $META_VOL</div><div class='add'>+TEST $CLI_1 volume delete $V0</div><div class='add'>+TEST $CLI_1 volume delete $V1</div><div class='add'>+</div><div class='add'>+#bug-1773856 - Brick process fails to come up with brickmux on</div><div class='add'>+</div><div class='add'>+TEST $CLI_1 volume create $V0 $H1:$B1/${V0}1 $H2:$B2/${V0}1 $H3:$B3/${V0}1 force</div><div class='add'>+TEST $CLI_1 volume start $V0</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+EXPECT 3 count_brick_processes</div><div class='add'>+</div><div class='add'>+#create and start a new volume</div><div class='add'>+TEST $CLI_1 volume create $V1 $H1:$B1/${V1}2 $H2:$B2/${V1}2 $H3:$B3/${V1}2 force</div><div class='add'>+TEST $CLI_1 volume start $V1</div><div class='add'>+</div><div class='add'>+EXPECT 3 count_brick_processes</div><div class='add'>+</div><div class='add'>+V2=patchy2</div><div class='add'>+TEST $CLI_1 volume create $V2 $H1:$B1/${V2}3 $H2:$B2/${V2}3 $H3:$B3/${V2}3 force</div><div class='add'>+TEST $CLI_1 volume start $V2</div><div class='add'>+</div><div class='add'>+EXPECT 3 count_brick_processes</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT 3 count_brick_pids</div><div class='add'>+</div><div class='add'>+TEST kill_node 1</div><div class='add'>+</div><div class='add'>+sleep 10</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $PROBE_TIMEOUT 1 check_peers;</div><div class='add'>+</div><div class='add'>+$CLI_2 volume set $V0 performance.readdir-ahead on</div><div class='add'>+$CLI_2 volume set $V1 performance.readdir-ahead on</div><div class='add'>+</div><div class='add'>+TEST $glusterd_1;</div><div class='add'>+EXPECT_WITHIN $PROBE_TIMEOUT 2 peer_count</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT 4 count_brick_pids</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT 0  count_N/A_brick_pids</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/glusterd/brick-mux-validation.t b/tests/bugs/glusterd/brick-mux-validation.t<br/>new file mode 100644<br/>index 00000000000..61b0455f9a8<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/glusterd/brick-mux-validation.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/glusterd/brick-mux-validation.t</a></div><div class='hunk'>@@ -0,0 +1,104 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../traps.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+function count_brick_processes {</div><div class='add'>+        pgrep glusterfsd | wc -l</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function count_brick_pids {</div><div class='add'>+        $CLI --xml volume status all | sed -n '/.*&lt;pid&gt;\([^&lt;]*\).*/s//\1/p' \</div><div class='add'>+                                     | grep -v "N/A" | sort | uniq | wc -l</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+#bug-1451248 - validate brick mux after glusterd reboot</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST $CLI volume set all cluster.brick-multiplex on</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/${V0}{1..3}</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+EXPECT 1 count_brick_processes</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT 1 count_brick_pids</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT 3 online_brick_count</div><div class='add'>+</div><div class='add'>+pkill gluster</div><div class='add'>+TEST glusterd</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT 1 count_brick_processes</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT 1 count_brick_pids</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT 3 online_brick_count</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V1 $H0:$B0/${V1}{1..3}</div><div class='add'>+TEST $CLI volume start $V1</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT 1 count_brick_processes</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT 1 count_brick_pids</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT 6 online_brick_count</div><div class='add'>+</div><div class='add'>+#bug-1560957 - brick status goes offline after remove-brick followed by add-brick</div><div class='add'>+</div><div class='add'>+pkill glusterd</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST $CLI volume remove-brick $V0 $H0:$B0/${V0}1 force</div><div class='add'>+TEST $CLI volume add-brick $V0 $H0:$B0/${V0}1_new force</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT 1 count_brick_processes</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT 1 count_brick_pids</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT 6 online_brick_count</div><div class='add'>+</div><div class='add'>+#bug-1446172 - reset brick with brick multiplexing enabled</div><div class='add'>+</div><div class='add'>+TEST glusterfs --volfile-id=$V0 --volfile-server=$H0 $M0;</div><div class='add'>+# Create files</div><div class='add'>+for i in {1..5}</div><div class='add'>+do</div><div class='add'>+        echo $i &gt; $M0/file$i.txt</div><div class='add'>+done</div><div class='add'>+</div><div class='add'>+TEST $CLI volume reset-brick $V0 $H0:$B0/${V0}1_new start</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $PROCESS_DOWN_TIMEOUT 5 online_brick_count</div><div class='add'>+EXPECT 1 count_brick_processes</div><div class='add'>+</div><div class='add'>+# Negative case with brick killed but volume-id xattr present</div><div class='add'>+TEST ! $CLI volume reset-brick $V0 $H0:$B0/${V0}1 $H0:$B0/${V0}1 commit</div><div class='add'>+</div><div class='add'>+# reset-brick commit force should work and should bring up the brick</div><div class='add'>+TEST $CLI volume reset-brick $V0 $H0:$B0/${V0}1_new $H0:$B0/${V0}1_new commit force</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT 6 online_brick_count</div><div class='add'>+EXPECT 1 count_brick_processes</div><div class='add'>+TEST glusterfs --volfile-id=$V1 --volfile-server=$H0 $M1;</div><div class='add'>+# Create files</div><div class='add'>+for i in {1..5}</div><div class='add'>+do</div><div class='add'>+        echo $i &gt; $M1/file$i.txt</div><div class='add'>+done</div><div class='add'>+</div><div class='add'>+TEST $CLI volume reset-brick $V1 $H0:$B0/${V1}1 start</div><div class='add'>+EXPECT_WITHIN $PROCESS_DOWN_TIMEOUT 5 online_brick_count</div><div class='add'>+EXPECT 1 count_brick_processes</div><div class='add'>+</div><div class='add'>+# Simulate reset disk</div><div class='add'>+for i in {1..5}</div><div class='add'>+do</div><div class='add'>+        rm -rf $B0/${V1}1/file$i.txt</div><div class='add'>+done</div><div class='add'>+</div><div class='add'>+setfattr -x trusted.glusterfs.volume-id $B0/${V1}1</div><div class='add'>+setfattr -x trusted.gfid $B0/${V1}1</div><div class='add'>+</div><div class='add'>+# Test reset-brick commit. Using CLI_IGNORE_PARTITION since normal CLI  uses</div><div class='add'>+# the --wignore flag that essentially makes the command act like "commit force"</div><div class='add'>+TEST $CLI_IGNORE_PARTITION volume reset-brick $V1 $H0:$B0/${V1}1 $H0:$B0/${V1}1 commit</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT 6 online_brick_count</div><div class='add'>+EXPECT 1 count_brick_processes</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/glusterd/brick-mux.t b/tests/bugs/glusterd/brick-mux.t<br/>new file mode 100644<br/>index 00000000000..927940534c1<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/glusterd/brick-mux.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/glusterd/brick-mux.t</a></div><div class='hunk'>@@ -0,0 +1,81 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+. $(dirname $0)/../../cluster.rc</div><div class='add'>+</div><div class='add'>+function count_brick_processes {</div><div class='add'>+        pgrep glusterfsd | wc -l</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='add'>+</div><div class='add'>+#bug-1444596 - validating brick mux</div><div class='add'>+</div><div class='add'>+TEST glusterd -LDEBUG</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/brick{0,1}</div><div class='add'>+TEST $CLI volume create $V1 $H0:$B0/brick{2,3}</div><div class='add'>+</div><div class='add'>+TEST $CLI volume set all cluster.brick-multiplex on</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+TEST $CLI volume start $V1</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT 4 online_brick_count</div><div class='add'>+EXPECT 1 count_brick_processes</div><div class='add'>+</div><div class='add'>+#bug-1499509 - stop all the bricks when a brick process is killed</div><div class='add'>+kill -9 $(pgrep glusterfsd)</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT 0 online_brick_count</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+TEST $CLI volume start $V1 force</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT 4 online_brick_count</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+pkill glusterd</div><div class='add'>+TEST glusterd</div><div class='add'>+</div><div class='add'>+#Check brick status after restart glusterd</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT 4 online_brick_count</div><div class='add'>+EXPECT 1 count_brick_processes</div><div class='add'>+</div><div class='add'>+TEST $CLI volume set $V1 performance.io-cache-size 32MB</div><div class='add'>+TEST $CLI volume stop $V1</div><div class='add'>+TEST $CLI volume start $V1</div><div class='add'>+</div><div class='add'>+#Check No. of brick processes after change option</div><div class='add'>+EXPECT 2 count_brick_processes</div><div class='add'>+</div><div class='add'>+pkill glusterd</div><div class='add'>+TEST glusterd</div><div class='add'>+</div><div class='add'>+#Check brick status after restart glusterd should not be NA</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT 4 online_brick_count</div><div class='add'>+EXPECT 2 count_brick_processes</div><div class='add'>+</div><div class='add'>+pkill glusterd</div><div class='add'>+TEST glusterd</div><div class='add'>+</div><div class='add'>+#Check brick status after restart glusterd should not be NA</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT 4 online_brick_count</div><div class='add'>+EXPECT 2 count_brick_processes</div><div class='add'>+</div><div class='add'>+#bug-1444596_brick_mux_posix_hlth_chk_status</div><div class='add'>+</div><div class='add'>+TEST $CLI volume stop $V0</div><div class='add'>+TEST $CLI volume delete $V0</div><div class='add'>+TEST rm -rf $H0:$B0/brick{0,1}</div><div class='add'>+</div><div class='add'>+#Check No. of brick processes after remove brick from back-end</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT 2 online_brick_count</div><div class='add'>+</div><div class='add'>+TEST glusterfs -s $H0 --volfile-id $V1 $M0</div><div class='add'>+TEST touch $M0/file{1..10}</div><div class='add'>+</div><div class='add'>+pkill glusterd</div><div class='add'>+TEST glusterd -LDEBUG</div><div class='add'>+sleep 5</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT 2 online_brick_count</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='add'>+</div><div class='head'>diff --git a/tests/bugs/glusterd/brick-order-check-add-brick.t b/tests/bugs/glusterd/brick-order-check-add-brick.t<br/>new file mode 100644<br/>index 00000000000..0be31dac768<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/glusterd/brick-order-check-add-brick.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/glusterd/brick-order-check-add-brick.t</a></div><div class='hunk'>@@ -0,0 +1,61 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+. $(dirname $0)/../../cluster.rc</div><div class='add'>+. $(dirname $0)/../../snapshot.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST verify_lvm_version;</div><div class='add'>+#Create cluster with 3 nodes</div><div class='add'>+TEST launch_cluster 3 -NO_DEBUG -NO_FORCE</div><div class='add'>+TEST setup_lvm 3</div><div class='add'>+</div><div class='add'>+TEST $CLI_1 peer probe $H2</div><div class='add'>+TEST $CLI_1 peer probe $H3</div><div class='add'>+EXPECT_WITHIN $PROBE_TIMEOUT 2 peer_count</div><div class='add'>+</div><div class='add'>+TEST $CLI_1 volume create $V0 replica 3 $H1:$L1/$V0 $H2:$L2/$V0 $H3:$L3/$V0</div><div class='add'>+EXPECT '1 x 3 = 3' volinfo_field $V0 'Number of Bricks'</div><div class='add'>+EXPECT 'Created' volinfo_field $V0 'Status'</div><div class='add'>+</div><div class='add'>+TEST $CLI_1 volume start $V0</div><div class='add'>+EXPECT 'Started' volinfo_field $V0 'Status'</div><div class='add'>+</div><div class='add'>+#add-brick with or without mentioning the replica count should not fail</div><div class='add'>+TEST $CLI_1 volume add-brick $V0 replica 3 $H1:$L1/${V0}_1 $H2:$L2/${V0}_1 $H3:$L3/${V0}_1</div><div class='add'>+EXPECT '2 x 3 = 6' volinfo_field $V0 'Number of Bricks'</div><div class='add'>+</div><div class='add'>+TEST $CLI_1 volume add-brick $V0 $H1:$L1/${V0}_2 $H2:$L2/${V0}_2 $H3:$L3/${V0}_2</div><div class='add'>+EXPECT '3 x 3 = 9' volinfo_field $V0 'Number of Bricks'</div><div class='add'>+</div><div class='add'>+#adding bricks from same host should fail the brick order check</div><div class='add'>+TEST ! $CLI_1 volume add-brick $V0 $H1:$L1/${V0}_3 $H1:$L1/${V0}_4 $H1:$L1/${V0}_5</div><div class='add'>+EXPECT '3 x 3 = 9' volinfo_field $V0 'Number of Bricks'</div><div class='add'>+</div><div class='add'>+#adding bricks from same host with force should succeed</div><div class='add'>+TEST $CLI_1 volume add-brick $V0 $H1:$L1/${V0}_3 $H1:$L1/${V0}_4 $H1:$L1/${V0}_5 force</div><div class='add'>+EXPECT '4 x 3 = 12' volinfo_field $V0 'Number of Bricks'</div><div class='add'>+</div><div class='add'>+TEST $CLI_1 volume stop $V0</div><div class='add'>+TEST $CLI_1 volume delete $V0</div><div class='add'>+</div><div class='add'>+TEST $CLI_1 volume create $V0 replica 2 $H1:$L1/${V0}1 $H2:$L2/${V0}1</div><div class='add'>+EXPECT '1 x 2 = 2' volinfo_field $V0 'Number of Bricks'</div><div class='add'>+EXPECT 'Created' volinfo_field $V0 'Status'</div><div class='add'>+</div><div class='add'>+TEST $CLI_1 volume start $V0</div><div class='add'>+EXPECT 'Started' volinfo_field $V0 'Status'</div><div class='add'>+</div><div class='add'>+#Add-brick with Increasing replica count</div><div class='add'>+TEST $CLI_1 volume add-brick $V0 replica 3 $H3:$L3/${V0}1</div><div class='add'>+EXPECT '1 x 3 = 3' volinfo_field $V0 'Number of Bricks'</div><div class='add'>+</div><div class='add'>+#Add-brick with Increasing replica count from same host should fail</div><div class='add'>+TEST ! $CLI_1 volume add-brick $V0 replica 5 $H1:$L1/${V0}2 $H1:$L1/${V0}3</div><div class='add'>+</div><div class='add'>+#adding multiple bricks from same host should fail the brick order check</div><div class='add'>+TEST ! $CLI_1 volume add-brick $V0 replica 3 $H1:$L1/${V0}{4..6} $H2:$L2/${V0}{7..9}</div><div class='add'>+EXPECT '1 x 3 = 3' volinfo_field $V0 'Number of Bricks'</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/bugs/glusterd/bug-1070734.t b/tests/bugs/glusterd/bug-1070734.t<br/>new file mode 100755<br/>index 00000000000..0afcb3b37b3<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/glusterd/bug-1070734.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/glusterd/bug-1070734.t</a></div><div class='hunk'>@@ -0,0 +1,80 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+. $(dirname $0)/../../nfs.rc</div><div class='add'>+</div><div class='add'>+#G_TESTDEF_TEST_STATUS_CENTOS6=NFS_TEST</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+## Start glusterd</div><div class='add'>+TEST glusterd;</div><div class='add'>+TEST pidof glusterd;</div><div class='add'>+TEST $CLI volume info;</div><div class='add'>+</div><div class='add'>+## Lets create volume</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/${V0}{1,2};</div><div class='add'>+</div><div class='add'>+## Verify volume is created</div><div class='add'>+EXPECT "$V0" volinfo_field $V0 'Volume Name';</div><div class='add'>+EXPECT 'Created' volinfo_field $V0 'Status';</div><div class='add'>+TEST $CLI volume set $V0 nfs.disable false</div><div class='add'>+</div><div class='add'>+## Start volume and verify</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+EXPECT 'Started' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $NFS_EXPORT_TIMEOUT "1" is_nfs_export_available;</div><div class='add'>+TEST mount_nfs $H0:/$V0 $N0;</div><div class='add'>+</div><div class='add'>+############################################################################</div><div class='add'>+#TEST-PLAN:</div><div class='add'>+#Create a directory DIR and a file inside DIR</div><div class='add'>+#check the hash brick of the file</div><div class='add'>+#delete the directory for recreating later after remove-brick</div><div class='add'>+#remove the brick where the files hashed to</div><div class='add'>+#After remove-brick status says complete go on creating the same directory \</div><div class='add'>+#DIR and file</div><div class='add'>+#Check if the file now falls into the other brick</div><div class='add'>+#Check if the other brick gets the full layout and the remove brick gets \</div><div class='add'>+#the zeroed layout</div><div class='add'>+############################################################################</div><div class='add'>+</div><div class='add'>+TEST mkdir $N0/DIR;</div><div class='add'>+</div><div class='add'>+TEST touch $N0/DIR/file;</div><div class='add'>+</div><div class='add'>+if [ -f $B0/${V0}1/DIR/file ]</div><div class='add'>+then</div><div class='add'>+        HASHED=$B0/${V0}1;</div><div class='add'>+        OTHERBRICK=$B0/${V0}2;</div><div class='add'>+else</div><div class='add'>+        HASHED=$B0/${V0}2;</div><div class='add'>+        OTHERBRICK=$B0/${V0}1;</div><div class='add'>+fi</div><div class='add'>+</div><div class='add'>+TEST rm -f $N0/DIR/file;</div><div class='add'>+TEST rmdir $N0/DIR;</div><div class='add'>+TEST $CLI volume remove-brick $V0 $H0:${HASHED} start;</div><div class='add'>+EXPECT_WITHIN $REBALANCE_TIMEOUT "completed" remove_brick_status_completed_field "$V0" \</div><div class='add'>+"$H0:${HASHED}";</div><div class='add'>+</div><div class='add'>+TEST mkdir $N0/DIR;</div><div class='add'>+TEST touch $N0/DIR/file;</div><div class='add'>+</div><div class='add'>+#Check now the file should fall in to OTHERBRICK</div><div class='add'>+TEST [ -f ${OTHERBRICK}/DIR/file ]</div><div class='add'>+</div><div class='add'>+#Check the DIR on HASHED should have got zeroed layout and the \</div><div class='add'>+#OTHERBRICK should have got full layout</div><div class='add'>+shorter_layout () {</div><div class='add'>+	dht_get_layout $1 | cut -c 19-</div><div class='add'>+}</div><div class='add'>+EXPECT "0000000000000000" shorter_layout $HASHED/DIR ;</div><div class='add'>+EXPECT "00000000ffffffff" shorter_layout $OTHERBRICK/DIR;</div><div class='add'>+</div><div class='add'>+## Before killing daemon to avoid deadlocks</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" umount_nfs $N0</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/bugs/glusterd/bug-1085330-and-bug-916549.t b/tests/bugs/glusterd/bug-1085330-and-bug-916549.t<br/>new file mode 100644<br/>index 00000000000..892a30d74ea<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/glusterd/bug-1085330-and-bug-916549.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/glusterd/bug-1085330-and-bug-916549.t</a></div><div class='hunk'>@@ -0,0 +1,93 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+STR="1234567890"</div><div class='add'>+volname="Vol"</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume info;</div><div class='add'>+</div><div class='add'>+#testcase: bug-1085330</div><div class='add'>+</div><div class='add'>+# Construct volname string such that its more than 256 characters</div><div class='add'>+for i in {1..30}</div><div class='add'>+do</div><div class='add'>+    volname+=$STR</div><div class='add'>+done</div><div class='add'>+# Now $volname is more than 256 chars</div><div class='add'>+</div><div class='add'>+TEST ! $CLI volume create $volname $H0:$B0/${volname}{1,2};</div><div class='add'>+</div><div class='add'>+TEST $CLI volume info;</div><div class='add'>+</div><div class='add'>+# Construct brick string such that its more than 256 characters</div><div class='add'>+volname="Vol1234"</div><div class='add'>+brick="brick"</div><div class='add'>+for i in {1..30}</div><div class='add'>+do</div><div class='add'>+    brick+=$STR</div><div class='add'>+done</div><div class='add'>+# Now $brick1 is more than 256 chars</div><div class='add'>+</div><div class='add'>+TEST ! $CLI volume create $volname $H0:$B0/$brick;</div><div class='add'>+</div><div class='add'>+TEST $CLI volume info;</div><div class='add'>+</div><div class='add'>+# Now try to create a volume with couple of bricks (strlen(volname) = 128 &amp;</div><div class='add'>+# strlen(brick1) = 128</div><div class='add'>+# Command should still fail as strlen(volp path) &gt; 256</div><div class='add'>+</div><div class='add'>+volname="Volume-0"</div><div class='add'>+brick="brick-00"</div><div class='add'>+STR="12345678"</div><div class='add'>+</div><div class='add'>+for i in {1..15}</div><div class='add'>+do</div><div class='add'>+    volname+=$STR</div><div class='add'>+    brick+=$STR</div><div class='add'>+done</div><div class='add'>+TEST ! $CLI volume create $volname $H0:$B0/$brick;</div><div class='add'>+</div><div class='add'>+TEST $CLI volume info;</div><div class='add'>+</div><div class='add'>+# test case with brick path as 255 and a trailing "/"</div><div class='add'>+brick=""</div><div class='add'>+STR1="12345678"</div><div class='add'>+volname="vol"</div><div class='add'>+</div><div class='add'>+for i in {1..31}</div><div class='add'>+do</div><div class='add'>+    brick+=$STR1</div><div class='add'>+done</div><div class='add'>+brick+="123456/"</div><div class='add'>+</div><div class='add'>+echo $brick | wc -c</div><div class='add'>+# Now $brick is exactly 255 chars, but at end a trailing space</div><div class='add'>+# This will still fail as volfpath exceeds more than _POSIX_MAX chars</div><div class='add'>+</div><div class='add'>+TEST ! $CLI volume create $volname $H0:$B0/$brick;</div><div class='add'>+</div><div class='add'>+TEST $CLI volume info;</div><div class='add'>+</div><div class='add'>+# Positive test case</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/${V0}1;</div><div class='add'>+</div><div class='add'>+TEST $CLI volume info;</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+</div><div class='add'>+#testcase: bug-916549</div><div class='add'>+</div><div class='add'>+pid_file=$(ls $GLUSTERD_PIDFILEDIR/vols/$V0/);</div><div class='add'>+brick_pid=$(cat $GLUSTERD_PIDFILEDIR/vols/$V0/$pid_file);</div><div class='add'>+</div><div class='add'>+kill -SIGKILL $brick_pid;</div><div class='add'>+TEST $CLI volume start $V0 force;</div><div class='add'>+TEST process_leak_count $(pidof glusterd);</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='add'>+</div><div class='head'>diff --git a/tests/bugs/glusterd/bug-1091935-brick-order-check-from-cli-to-glusterd.t b/tests/bugs/glusterd/bug-1091935-brick-order-check-from-cli-to-glusterd.t<br/>new file mode 100755<br/>index 00000000000..9ac9d8fedd9<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/glusterd/bug-1091935-brick-order-check-from-cli-to-glusterd.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/glusterd/bug-1091935-brick-order-check-from-cli-to-glusterd.t</a></div><div class='hunk'>@@ -0,0 +1,93 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+. $(dirname $0)/../../cluster.rc</div><div class='add'>+</div><div class='add'>+function check_peers {</div><div class='add'>+        $CLI_1 peer status | grep 'Peer in Cluster (Connected)' | wc -l</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+## Lets create partitions for bricks</div><div class='add'>+TEST truncate -s 100M $B0/brick1</div><div class='add'>+TEST truncate -s 200M $B0/brick2</div><div class='add'>+TEST truncate -s 200M $B0/brick3</div><div class='add'>+TEST truncate -s 200M $B0/brick4</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+TEST LO1=`SETUP_LOOP $B0/brick1`</div><div class='add'>+TEST LO2=`SETUP_LOOP $B0/brick2`</div><div class='add'>+TEST LO3=`SETUP_LOOP $B0/brick3`</div><div class='add'>+TEST LO4=`SETUP_LOOP $B0/brick4`</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+TEST MKFS_LOOP $LO1</div><div class='add'>+TEST MKFS_LOOP $LO2</div><div class='add'>+TEST MKFS_LOOP $LO3</div><div class='add'>+TEST MKFS_LOOP $LO4</div><div class='add'>+</div><div class='add'>+TEST mkdir -p ${B0}/${V0}{0..3}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+TEST MOUNT_LOOP $LO1 $B0/${V0}0</div><div class='add'>+TEST MOUNT_LOOP $LO2 $B0/${V0}1</div><div class='add'>+TEST MOUNT_LOOP $LO3 $B0/${V0}2</div><div class='add'>+TEST MOUNT_LOOP $LO4 $B0/${V0}3</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+TEST launch_cluster 2;</div><div class='add'>+TEST $CLI_1 peer probe $H2;</div><div class='add'>+EXPECT_WITHIN $PROBE_TIMEOUT 1 check_peers;</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+CLI_1_WITHOUT_WIGNORE=$(echo $CLI_1 | sed 's/ --wignore//')</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+# Creating volume with non resolvable host name</div><div class='add'>+TEST ! $CLI_1_WITHOUT_WIGNORE volume create $V0 replica 2 \</div><div class='add'>+        $H1:$B0/${V0}0/brick redhat:$B0/${V0}1/brick \</div><div class='add'>+        $H1:$B0/${V0}2/brick redhat:$B0/${V0}3/brick</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+#Workaround for Bug:1091935</div><div class='add'>+#Failure to create volume above leaves 1st brick with xattrs.</div><div class='add'>+rm -rf $B0/${V0}{0..3}/brick;</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+# Creating distribute-replica volume with bad brick order. It will fail</div><div class='add'>+# due to bad brick order.</div><div class='add'>+TEST ! $CLI_1_WITHOUT_WIGNORE volume create $V0 replica 2 \</div><div class='add'>+        $H1:$B0/${V0}0/brick $H1:$B0/${V0}1/brick \</div><div class='add'>+        $H1:$B0/${V0}2/brick $H1:$B0/${V0}3/brick</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+#Workaround for Bug:1091935</div><div class='add'>+#Failure to create volume above leaves 1st brick with xattrs.</div><div class='add'>+rm -rf $B0/${V0}{0..3}/brick;</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+# Test for positive case, volume create should pass for</div><div class='add'>+# resolved hostnames and bricks in order.</div><div class='add'>+TEST $CLI_1_WITHOUT_WIGNORE volume create $V0 replica 2 \</div><div class='add'>+        $H1:$B0/${V0}0/brick $H2:$B0/${V0}1/brick \</div><div class='add'>+        $H1:$B0/${V0}2/brick $H2:$B0/${V0}3/brick</div><div class='add'>+</div><div class='add'>+# Delete the volume as we want to reuse bricks</div><div class='add'>+TEST $CLI_1_WITHOUT_WIGNORE volume delete $V0</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+# Now with force at the end of command it will bypass brick-order check</div><div class='add'>+# for replicate or distribute-replicate volume. and it will create volume</div><div class='add'>+TEST $CLI_1_WITHOUT_WIGNORE volume create $V0 replica 2 \</div><div class='add'>+        $H1:$B0/${V0}0/brick $H1:$B0/${V0}1/brick \</div><div class='add'>+        $H1:$B0/${V0}2/brick $H1:$B0/${V0}3/brick force</div><div class='add'>+</div><div class='add'>+# Need to cleanup the loop back devices.</div><div class='add'>+UMOUNT_LOOP ${B0}/${V0}{0..3}</div><div class='add'>+rm -f ${B0}/brick{1..4}</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/glusterd/bug-1238706-daemons-stop-on-peer-cleanup.t b/tests/bugs/glusterd/bug-1238706-daemons-stop-on-peer-cleanup.t<br/>new file mode 100644<br/>index 00000000000..7be076caaf3<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/glusterd/bug-1238706-daemons-stop-on-peer-cleanup.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/glusterd/bug-1238706-daemons-stop-on-peer-cleanup.t</a></div><div class='hunk'>@@ -0,0 +1,44 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+## Test case for stopping all running daemons service on peer detach.</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+. $(dirname $0)/../../cluster.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+## Start a 2 node virtual cluster</div><div class='add'>+TEST launch_cluster 2;</div><div class='add'>+</div><div class='add'>+## Peer probe server 2 from server 1 cli</div><div class='add'>+TEST $CLI_1 peer probe $H2;</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $PROBE_TIMEOUT 1 peer_count</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+## Creating and starting volume</div><div class='add'>+TEST $CLI_1 volume create $V0 $H1:$B1/${V0}0 $H1:$B1/${V0}1</div><div class='add'>+TEST $CLI_1 volume start $V0</div><div class='add'>+</div><div class='add'>+TEST $CLI_1 volume set $V0 nfs.disable off</div><div class='add'>+</div><div class='add'>+## To Do: Add test case for quota and snapshot daemon. Currently quota</div><div class='add'>+##        Daemon is not working in cluster framework. And sanpd daemon</div><div class='add'>+##        Start only in one node in cluster framework. Add test case</div><div class='add'>+##        once patch http://review.gluster.org/#/c/11666/ merged,</div><div class='add'>+</div><div class='add'>+## We are having 2 node "nfs" daemon should run on both node.</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "2" get_nfs_count</div><div class='add'>+</div><div class='add'>+## Detach 2nd node from the cluster.</div><div class='add'>+TEST $CLI_1 peer detach $H2;</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+## After detaching 2nd node we will have only 1 nfs and quota daemon running.</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" get_nfs_count</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+#G_TESTDEF_TEST_STATUS_NETBSD7=BAD_TEST,BUG=000000</div><div class='add'>+#G_TESTDEF_TEST_STATUS_CENTOS6=BAD_TEST,BUG=000000</div><div class='head'>diff --git a/tests/bugs/glusterd/bug-1242875-do-not-pass-volinfo-quota.t b/tests/bugs/glusterd/bug-1242875-do-not-pass-volinfo-quota.t<br/>new file mode 100644<br/>index 00000000000..c229d4371b6<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/glusterd/bug-1242875-do-not-pass-volinfo-quota.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/glusterd/bug-1242875-do-not-pass-volinfo-quota.t</a></div><div class='hunk'>@@ -0,0 +1,38 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+. $(dirname $0)/../../cluster.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+## Start glusterd</div><div class='add'>+TEST glusterd;</div><div class='add'>+TEST pidof glusterd;</div><div class='add'>+</div><div class='add'>+## Lets create volume V0 and start the volume</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/${V0}0 $H0:$B0/${V0}1</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+## Lets create volume V1 and start the volume</div><div class='add'>+TEST $CLI volume create $V1 $H0:$B0/${V0}2 $H0:$B0/${V0}3</div><div class='add'>+TEST $CLI volume start $V1</div><div class='add'>+</div><div class='add'>+## Enable quota on 2nd volume</div><div class='add'>+TEST $CLI volume quota $V1 enable</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" get_quotad_count</div><div class='add'>+</div><div class='add'>+## Killing all gluster process</div><div class='add'>+pkill gluster;</div><div class='add'>+</div><div class='add'>+## there should not be any quota daemon running after killing quota process</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "0" get_quotad_count</div><div class='add'>+</div><div class='add'>+## Start glusterd</div><div class='add'>+TEST glusterd;</div><div class='add'>+TEST pidof glusterd;</div><div class='add'>+</div><div class='add'>+## Quotad daemon should start on restarting the glusterd</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" get_quotad_count</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/glusterd/bug-1482906-peer-file-blank-line.t b/tests/bugs/glusterd/bug-1482906-peer-file-blank-line.t<br/>new file mode 100644<br/>index 00000000000..967595e4dbb<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/glusterd/bug-1482906-peer-file-blank-line.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/glusterd/bug-1482906-peer-file-blank-line.t</a></div><div class='hunk'>@@ -0,0 +1,29 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../cluster.rc</div><div class='add'>+</div><div class='add'>+#Tests for add new line in peers file</div><div class='add'>+function add_new_line_to_peer_file  {</div><div class='add'>+	UUID_NAME=$($CLI_1 peer status  | grep Uuid)</div><div class='add'>+	PEER_ID=$(echo $UUID_NAME | cut -c 7-)</div><div class='add'>+	GD_WD=$($CLI_1 system getwd)</div><div class='add'>+	GD_WD+=/peers/</div><div class='add'>+	PATH_TO_PEER_FILE=$GD_WD$PEER_ID</div><div class='add'>+	sed -i '1s/^/\n/gm; $s/$/\n/gm' $PATH_TO_PEER_FILE</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST launch_cluster 2;</div><div class='add'>+</div><div class='add'>+TEST $CLI_1 peer probe $H2;</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $PROBE_TIMEOUT 1 peer_count</div><div class='add'>+</div><div class='add'>+add_new_line_to_peer_file</div><div class='add'>+</div><div class='add'>+TEST kill_glusterd 1</div><div class='add'>+TEST  $glusterd_1</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/glusterd/bug-1595320.t b/tests/bugs/glusterd/bug-1595320.t<br/>new file mode 100644<br/>index 00000000000..c10e11821a1<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/glusterd/bug-1595320.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/glusterd/bug-1595320.t</a></div><div class='hunk'>@@ -0,0 +1,93 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+. $(dirname $0)/../../snapshot.rc</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='add'>+</div><div class='add'>+function count_up_bricks {</div><div class='add'>+        $CLI --xml volume status $V0 | grep '&lt;status&gt;1' | wc -l</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function count_brick_processes {</div><div class='add'>+        pgrep glusterfsd | wc -l</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+# Setup 3 LVMS</div><div class='add'>+LVM_PREFIX="test"</div><div class='add'>+TEST init_n_bricks 3</div><div class='add'>+TEST setup_lvm 3</div><div class='add'>+</div><div class='add'>+# Start glusterd</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+</div><div class='add'>+# Create volume and enable brick multiplexing</div><div class='add'>+TEST $CLI volume create $V0 $H0:$L1 $H0:$L2 $H0:$L3</div><div class='add'>+TEST $CLI v set all cluster.brick-multiplex on</div><div class='add'>+</div><div class='add'>+# Start the volume</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT 3 count_up_bricks</div><div class='add'>+EXPECT 1 count_brick_processes</div><div class='add'>+</div><div class='add'>+# Kill volume ungracefully</div><div class='add'>+brick_pid=`pgrep glusterfsd`</div><div class='add'>+</div><div class='add'>+# Make sure every brick root should be consumed by a brick process</div><div class='add'>+n=`ls -lrth /proc/$brick_pid/fd | grep -iw $L1 | grep -v ".glusterfs" | wc -l`</div><div class='add'>+TEST [ $n -eq 1 ]</div><div class='add'>+n=`ls -lrth /proc/$brick_pid/fd | grep -iw $L2 | grep -v ".glusterfs" | wc -l`</div><div class='add'>+TEST [ $n -eq 1 ]</div><div class='add'>+n=`ls -lrth /proc/$brick_pid/fd | grep -iw $L3 | grep -v ".glusterfs" | wc -l`</div><div class='add'>+TEST [ $n -eq 1 ]</div><div class='add'>+</div><div class='add'>+b1_pid_file=$(ls $GLUSTERD_PIDFILEDIR/vols/$V0/*d-backends-1*.pid)</div><div class='add'>+b2_pid_file=$(ls $GLUSTERD_PIDFILEDIR/vols/$V0/*d-backends-2*.pid)</div><div class='add'>+b3_pid_file=$(ls $GLUSTERD_PIDFILEDIR/vols/$V0/*d-backends-3*.pid)</div><div class='add'>+</div><div class='add'>+kill -9 $brick_pid</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT 0 count_brick_processes</div><div class='add'>+</div><div class='add'>+# Unmount 3rd brick root from node</div><div class='add'>+brick_root=$L3</div><div class='add'>+_umount_lv 3</div><div class='add'>+</div><div class='add'>+# Start the volume only 2 brick should be start</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT 2 count_up_bricks</div><div class='add'>+EXPECT 1 count_brick_processes</div><div class='add'>+</div><div class='add'>+brick_pid=`pgrep glusterfsd`</div><div class='add'>+</div><div class='add'>+# Make sure only two brick root should be consumed by a brick process</div><div class='add'>+n=`ls -lrth /proc/$brick_pid/fd | grep -iw $L1 | grep -v ".glusterfs" | wc -l`</div><div class='add'>+TEST [ $n -eq 1 ]</div><div class='add'>+n=`ls -lrth /proc/$brick_pid/fd | grep -iw $L2 | grep -v ".glusterfs" | wc -l`</div><div class='add'>+TEST [ $n -eq 1 ]</div><div class='add'>+n=`ls -lrth /proc/$brick_pid/fd | grep -iw $L3 | grep -v ".glusterfs" | wc -l`</div><div class='add'>+TEST [ $n -eq 0 ]</div><div class='add'>+</div><div class='add'>+# Mount the brick root</div><div class='add'>+TEST mkdir -p $brick_root</div><div class='add'>+TEST mount -t xfs -o nouuid  /dev/test_vg_3/brick_lvm $brick_root</div><div class='add'>+</div><div class='add'>+# Replace brick_pid file to test brick_attach code</div><div class='add'>+TEST cp $b1_pid_file $b3_pid_file</div><div class='add'>+</div><div class='add'>+# Start the volume all brick should be up</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT 3 count_up_bricks</div><div class='add'>+EXPECT 1 count_brick_processes</div><div class='add'>+</div><div class='add'>+# Make sure every brick root should be consumed by a brick process</div><div class='add'>+n=`ls -lrth /proc/$brick_pid/fd | grep -iw $L1 | grep -v ".glusterfs" | wc -l`</div><div class='add'>+TEST [ $n -eq 1 ]</div><div class='add'>+n=`ls -lrth /proc/$brick_pid/fd | grep -iw $L2 | grep -v ".glusterfs" | wc -l`</div><div class='add'>+TEST [ $n -eq 1 ]</div><div class='add'>+n=`ls -lrth /proc/$brick_pid/fd | grep -iw $L3 | grep -v ".glusterfs" | wc -l`</div><div class='add'>+TEST [ $n -eq 1 ]</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/bugs/glusterd/bug-1696046.t b/tests/bugs/glusterd/bug-1696046.t<br/>new file mode 100644<br/>index 00000000000..e1c1eb2ceb9<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/glusterd/bug-1696046.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/glusterd/bug-1696046.t</a></div><div class='hunk'>@@ -0,0 +1,113 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+function count_up_bricks {</div><div class='add'>+        $CLI --xml volume status $1 | grep '&lt;status&gt;1' | wc -l</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function count_brick_processes {</div><div class='add'>+        pgrep glusterfsd | wc -l</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+logdir=`gluster --print-logdir`</div><div class='add'>+</div><div class='add'>+## Start and create a volume</div><div class='add'>+TEST glusterd;</div><div class='add'>+TEST pidof glusterd;</div><div class='add'>+</div><div class='add'>+TEST $CLI volume set all cluster.brick-multiplex on</div><div class='add'>+TEST $CLI volume create $V0 replica 3 $H0:$B0/${V0}{1,2,3};</div><div class='add'>+TEST $CLI volume create $V1 replica 3 $H0:$B0/${V1}{1,2,3};</div><div class='add'>+</div><div class='add'>+## Start volume and verify</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+EXPECT 'Started' volinfo_field $V0 'Status';</div><div class='add'>+TEST $CLI volume start $V1;</div><div class='add'>+EXPECT 'Started' volinfo_field $V1 'Status';</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT 4 count_up_bricks $V0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT 4 count_up_bricks $V1</div><div class='add'>+</div><div class='add'>+EXPECT 1 count_brick_processes</div><div class='add'>+</div><div class='add'>+# Mount V0</div><div class='add'>+TEST glusterfs --volfile-id=$V0 --volfile-server=$H0 --entry-timeout=0 $M0;</div><div class='add'>+</div><div class='add'>+function client-log-file-name()</div><div class='add'>+{</div><div class='add'>+    logfilename=$M0".log"</div><div class='add'>+    echo ${logfilename:1} | tr / -</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function brick-log-file-name()</div><div class='add'>+{</div><div class='add'>+    logfilename=$B0"/"$V0"1.log"</div><div class='add'>+    echo ${logfilename:1} | tr / -</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+log_file=$logdir"/"`client-log-file-name`</div><div class='add'>+nofdlog=$(cat $log_file | grep " D " | wc -l)</div><div class='add'>+TEST [ $((nofdlog)) -eq 0 ]</div><div class='add'>+</div><div class='add'>+brick_log_file=$logdir"/bricks/"`brick-log-file-name`</div><div class='add'>+nofdlog=$(cat $brick_log_file | grep " D " | wc -l)</div><div class='add'>+TEST [ $((nofdlog)) -eq 0 ]</div><div class='add'>+</div><div class='add'>+## Set brick-log-level to DEBUG</div><div class='add'>+TEST $CLI volume set $V0 diagnostics.brick-log-level DEBUG</div><div class='add'>+</div><div class='add'>+# Do some operation</div><div class='add'>+touch $M0/file1</div><div class='add'>+</div><div class='add'>+# Check debug message debug message should be exist only for V0</div><div class='add'>+# Server xlator is common in brick_mux so after enabling DEBUG log</div><div class='add'>+# some debug message should be available for other xlators like posix</div><div class='add'>+</div><div class='add'>+brick_log_file=$logdir"/bricks/"`brick-log-file-name`</div><div class='add'>+nofdlog=$(cat $brick_log_file | grep file1 | grep -v server | wc -l)</div><div class='add'>+TEST [ $((nofdlog)) -ne 0 ]</div><div class='add'>+</div><div class='add'>+#Check if any debug log exist in client-log file</div><div class='add'>+nofdlog=$(cat $log_file | grep " D " | wc -l)</div><div class='add'>+TEST [ $((nofdlog)) -eq 0 ]</div><div class='add'>+</div><div class='add'>+## Set brick-log-level to INFO</div><div class='add'>+TEST $CLI volume set $V0 diagnostics.brick-log-level INFO</div><div class='add'>+</div><div class='add'>+## Set client-log-level to DEBUG</div><div class='add'>+TEST $CLI volume set $V0 diagnostics.client-log-level DEBUG</div><div class='add'>+</div><div class='add'>+# Do some operation</div><div class='add'>+touch $M0/file2</div><div class='add'>+</div><div class='add'>+nofdlog=$(cat $brick_log_file | grep " D " | grep file2 | wc -l)</div><div class='add'>+TEST [ $((nofdlog)) -eq 0 ]</div><div class='add'>+</div><div class='add'>+nofdlog=$(cat $log_file | grep " D " | wc -l)</div><div class='add'>+TEST [ $((nofdlog)) -ne 0 ]</div><div class='add'>+</div><div class='add'>+# Unmount V0</div><div class='add'>+TEST umount $M0</div><div class='add'>+</div><div class='add'>+#Mount V1</div><div class='add'>+TEST glusterfs --volfile-id=$V1 --volfile-server=$H0 --entry-timeout=0 $M0;</div><div class='add'>+</div><div class='add'>+#do some operation</div><div class='add'>+touch $M0/file3</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+# DEBUG log level is enabled only for V0 so no debug message should be available</div><div class='add'>+# in log specific to file2 creation except for server xlator, server xlator is</div><div class='add'>+# common xlator in brick mulitplex</div><div class='add'>+nofdlog=$(cat $brick_log_file | grep file3 | grep -v server | wc -l)</div><div class='add'>+TEST [ $((nofdlog)) -eq 0 ]</div><div class='add'>+</div><div class='add'>+# Unmount V1</div><div class='add'>+TEST umount $M0</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/glusterd/bug-1699339.t b/tests/bugs/glusterd/bug-1699339.t<br/>new file mode 100644<br/>index 00000000000..bb8d4f46eb8<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/glusterd/bug-1699339.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/glusterd/bug-1699339.t</a></div><div class='hunk'>@@ -0,0 +1,73 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+. $(dirname $0)/../../cluster.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+NUM_VOLS=15</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+get_brick_base () {</div><div class='add'>+	printf "%s/vol%02d" $B0 $1</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function count_up_bricks {</div><div class='add'>+        vol=$1;</div><div class='add'>+        $CLI_1 --xml volume status $vol | grep '&lt;status&gt;1' | wc -l</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+create_volume () {</div><div class='add'>+</div><div class='add'>+	local vol_name=$(printf "%s-vol%02d" $V0 $1)</div><div class='add'>+</div><div class='add'>+        TEST $CLI_1 volume create $vol_name replica 3 $H1:$B1/${vol_name} $H2:$B2/${vol_name} $H3:$B3/${vol_name}</div><div class='add'>+	TEST $CLI_1 volume start $vol_name</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+TEST launch_cluster 3</div><div class='add'>+TEST $CLI_1 volume set all cluster.brick-multiplex on</div><div class='add'>+</div><div class='add'>+# The option accepts the value in the range from 5 to 200</div><div class='add'>+TEST ! $CLI_1 volume set all glusterd.vol_count_per_thread 210</div><div class='add'>+TEST ! $CLI_1 volume set all glusterd.vol_count_per_thread 4</div><div class='add'>+</div><div class='add'>+TEST $CLI_1 volume set all glusterd.vol_count_per_thread 5</div><div class='add'>+</div><div class='add'>+TEST $CLI_1 peer probe $H2;</div><div class='add'>+EXPECT_WITHIN $PROBE_TIMEOUT 1 peer_count</div><div class='add'>+</div><div class='add'>+TEST $CLI_1 peer probe $H3;</div><div class='add'>+EXPECT_WITHIN $PROBE_TIMEOUT 2 peer_count</div><div class='add'>+</div><div class='add'>+# Our infrastructure can't handle an arithmetic expression here.  The formula</div><div class='add'>+# is (NUM_VOLS-1)*5 because it sees each TEST/EXPECT once but needs the other</div><div class='add'>+# NUM_VOLS-1 and there are 5 such statements in each iteration.</div><div class='add'>+TESTS_EXPECTED_IN_LOOP=28</div><div class='add'>+for i in $(seq 1 $NUM_VOLS); do</div><div class='add'>+        starttime="$(date +%s)";</div><div class='add'>+	create_volume $i</div><div class='add'>+done</div><div class='add'>+</div><div class='add'>+TEST kill_glusterd 1</div><div class='add'>+</div><div class='add'>+TESTS_EXPECTED_IN_LOOP=4</div><div class='add'>+for i in `seq 1 3 15`</div><div class='add'>+do</div><div class='add'>+vol1=$(printf "%s-vol%02d" $V0 $i)</div><div class='add'>+TEST $CLI_2 volume set $vol1 performance.readdir-ahead on</div><div class='add'>+done</div><div class='add'>+</div><div class='add'>+# Bring back 1st glusterd</div><div class='add'>+TEST $glusterd_1</div><div class='add'>+EXPECT_WITHIN $PROBE_TIMEOUT 2 peer_count</div><div class='add'>+</div><div class='add'>+TESTS_EXPECTED_IN_LOOP=4</div><div class='add'>+for i in `seq 1 3 15`</div><div class='add'>+do</div><div class='add'>+vol1=$(printf "%s-vol%02d" $V0 $i)</div><div class='add'>+EXPECT_WITHIN $PROBE_TIMEOUT "on" volinfo_field_1 $vol1 performance.readdir-ahead</div><div class='add'>+done</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/bugs/glusterd/bug-1720566.t b/tests/bugs/glusterd/bug-1720566.t<br/>new file mode 100644<br/>index 00000000000..99bcf6ff785<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/glusterd/bug-1720566.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/glusterd/bug-1720566.t</a></div><div class='hunk'>@@ -0,0 +1,50 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../cluster.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+V0="TestLongVolnamec363b7b536700ff06eedeae0dd9037fec363b7b536700ff06eedeae0dd9037fec363b7b536700ff06eedeae0dd9abcd"</div><div class='add'>+V1="TestLongVolname3102bd28a16c49440bd5210e4ec4d5d93102bd28a16c49440bd5210e4ec4d5d933102bd28a16c49440bd5210e4ebbcd"</div><div class='add'>+TEST launch_cluster 2;</div><div class='add'>+TEST $CLI_1 peer probe $H2;</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $PROBE_TIMEOUT 1 peer_count</div><div class='add'>+</div><div class='add'>+$CLI_1 volume create $V0 $H1:$B1/$V0  $H2:$B2/$V0</div><div class='add'>+EXPECT 'Created' cluster_volinfo_field 1 $V0 'Status';</div><div class='add'>+$CLI_1 volume create $V1 $H1:$B1/$V1  $H2:$B2/$V1</div><div class='add'>+EXPECT 'Created' cluster_volinfo_field 1 $V1 'Status';</div><div class='add'>+</div><div class='add'>+$CLI_1 volume start $V0</div><div class='add'>+EXPECT 'Started' cluster_volinfo_field 1 $V0 'Status';</div><div class='add'>+</div><div class='add'>+$CLI_1 volume start $V1</div><div class='add'>+EXPECT 'Started' cluster_volinfo_field 1 $V1 'Status';</div><div class='add'>+</div><div class='add'>+#Mount FUSE</div><div class='add'>+TEST glusterfs -s $H1 --volfile-id=$V0 $M0;</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+#Mount FUSE</div><div class='add'>+TEST glusterfs -s $H1 --volfile-id=$V1 $M1;</div><div class='add'>+</div><div class='add'>+TEST mkdir $M0/dir{1..4};</div><div class='add'>+TEST touch $M0/dir{1..4}/files{1..4};</div><div class='add'>+</div><div class='add'>+TEST mkdir $M1/dir{1..4};</div><div class='add'>+TEST touch $M1/dir{1..4}/files{1..4};</div><div class='add'>+</div><div class='add'>+TEST $CLI_1 volume add-brick $V0 $H1:$B1/${V0}_1 $H2:$B2/${V0}_1</div><div class='add'>+TEST $CLI_1 volume add-brick $V1 $H1:$B1/${V1}_1 $H2:$B2/${V1}_1</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+TEST $CLI_1 volume rebalance $V0 start</div><div class='add'>+TEST $CLI_1 volume rebalance $V1  start</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $REBALANCE_TIMEOUT "completed" cluster_rebalance_status_field 1 $V0</div><div class='add'>+EXPECT_WITHIN $REBALANCE_TIMEOUT "completed" cluster_rebalance_status_field 1  $V1</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/glusterd/bug-824753-file-locker.c b/tests/bugs/glusterd/bug-824753-file-locker.c<br/>new file mode 100644<br/>index 00000000000..f5dababad30<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/glusterd/bug-824753-file-locker.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/glusterd/bug-824753-file-locker.c</a></div><div class='hunk'>@@ -0,0 +1,46 @@</div><div class='add'>+#include &lt;stdio.h&gt;</div><div class='add'>+#include &lt;string.h&gt;</div><div class='add'>+#include &lt;fcntl.h&gt;</div><div class='add'>+#include &lt;sys/types.h&gt;</div><div class='add'>+#include &lt;unistd.h&gt;</div><div class='add'>+#include &lt;stdlib.h&gt;</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+main(int argc, char *argv[])</div><div class='add'>+{</div><div class='add'>+    int fd = -1;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    char command[2048] = "";</div><div class='add'>+    char filepath[255] = "";</div><div class='add'>+    struct flock fl;</div><div class='add'>+</div><div class='add'>+    fl.l_type = F_WRLCK;</div><div class='add'>+    fl.l_whence = SEEK_SET;</div><div class='add'>+    fl.l_start = 7;</div><div class='add'>+    fl.l_len = 1;</div><div class='add'>+    fl.l_pid = getpid();</div><div class='add'>+</div><div class='add'>+    snprintf(filepath, 255, "%s/%s", argv[4], argv[5]);</div><div class='add'>+</div><div class='add'>+    fd = open(filepath, O_RDWR);</div><div class='add'>+</div><div class='add'>+    if (fd == -1)</div><div class='add'>+        return -1;</div><div class='add'>+</div><div class='add'>+    if (fcntl(fd, F_SETLKW, &amp;fl) == -1) {</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    snprintf(command, sizeof(command),</div><div class='add'>+             "gluster volume clear-locks %s /%s kind all posix 0,7-1 |"</div><div class='add'>+             " grep %s | awk -F'..: ' '{print $1}' | grep %s:%s/%s",</div><div class='add'>+             argv[1], argv[5], argv[2], argv[2], argv[3], argv[1]);</div><div class='add'>+</div><div class='add'>+    ret = system(command);</div><div class='add'>+    close(fd);</div><div class='add'>+</div><div class='add'>+    if (ret)</div><div class='add'>+        return -1;</div><div class='add'>+    else</div><div class='add'>+        return 0;</div><div class='add'>+}</div><div class='head'>diff --git a/tests/bugs/glusterd/bug-824753.t b/tests/bugs/glusterd/bug-824753.t<br/>new file mode 100755<br/>index 00000000000..b969e28f35e<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/glusterd/bug-824753.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/glusterd/bug-824753.t</a></div><div class='hunk'>@@ -0,0 +1,45 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+## Start and create a volume</div><div class='add'>+TEST glusterd;</div><div class='add'>+TEST pidof glusterd;</div><div class='add'>+TEST $CLI volume info;</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 replica 3 $H0:$B0/${V0}{1,2,3,4,5,6};</div><div class='add'>+</div><div class='add'>+function volinfo_field()</div><div class='add'>+{</div><div class='add'>+    local vol=$1;</div><div class='add'>+    local field=$2;</div><div class='add'>+</div><div class='add'>+    $CLI volume info $vol | grep "^$field: " | sed 's/.*: //';</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+## Verify volume is is created</div><div class='add'>+EXPECT "$V0" volinfo_field $V0 'Volume Name';</div><div class='add'>+EXPECT 'Created' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+## Start volume and verify</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+EXPECT 'Started' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+TEST glusterfs -s $H0 --volfile-id=$V0 $M0</div><div class='add'>+touch $M0/file1;</div><div class='add'>+</div><div class='add'>+TEST $CC -g $(dirname $0)/bug-824753-file-locker.c -o $(dirname $0)/file-locker</div><div class='add'>+</div><div class='add'>+TEST $(dirname $0)/file-locker $V0 $H0 $B0 $M0 file1</div><div class='add'>+</div><div class='add'>+## Finish up</div><div class='add'>+TEST rm -f $(dirname $0)/file-locker</div><div class='add'>+TEST $CLI volume stop $V0;</div><div class='add'>+EXPECT 'Stopped' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+TEST $CLI volume delete $V0;</div><div class='add'>+TEST ! $CLI volume info $V0;</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/glusterd/bug-948729/bug-948729-force.t b/tests/bugs/glusterd/bug-948729/bug-948729-force.t<br/>new file mode 100644<br/>index 00000000000..f4f71f9a1e2<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/glusterd/bug-948729/bug-948729-force.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/glusterd/bug-948729/bug-948729-force.t</a></div><div class='hunk'>@@ -0,0 +1,103 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../../include.rc</div><div class='add'>+. $(dirname $0)/../../../volume.rc</div><div class='add'>+. $(dirname $0)/../../../cluster.rc</div><div class='add'>+</div><div class='add'>+function check_peers {</div><div class='add'>+        $CLI_1 peer status | grep 'Peer in Cluster (Connected)' | wc -l</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+uuid1=`uuidgen`;</div><div class='add'>+uuid2=`uuidgen`;</div><div class='add'>+uuid3=`uuidgen`;</div><div class='add'>+</div><div class='add'>+V1=patchy1</div><div class='add'>+V2=patchy2</div><div class='add'>+</div><div class='add'>+TEST launch_cluster 2;</div><div class='add'>+</div><div class='add'>+TEST $CLI_1 peer probe $H2;</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $PROBE_TIMEOUT 1 check_peers;</div><div class='add'>+</div><div class='add'>+B3=/d/backends/3</div><div class='add'>+B4=/d/backends/4</div><div class='add'>+B5=/d/backends/5</div><div class='add'>+B6=/d/backends/6</div><div class='add'>+</div><div class='add'>+mkdir -p $B3 $B4 $B5 $B6</div><div class='add'>+</div><div class='add'>+TEST truncate -s 16M $B1/brick1</div><div class='add'>+TEST truncate -s 16M $B2/brick2</div><div class='add'>+TEST truncate -s 16M $B3/brick3</div><div class='add'>+TEST truncate -s 16M $B4/brick4</div><div class='add'>+TEST truncate -s 16M $B5/brick5</div><div class='add'>+TEST truncate -s 16M $B6/brick6</div><div class='add'>+</div><div class='add'>+TEST LD1=`SETUP_LOOP $B1/brick1`</div><div class='add'>+TEST MKFS_LOOP $LD1</div><div class='add'>+TEST LD2=`SETUP_LOOP $B2/brick2`</div><div class='add'>+TEST MKFS_LOOP $LD2</div><div class='add'>+TEST LD3=`SETUP_LOOP $B3/brick3`</div><div class='add'>+TEST MKFS_LOOP $LD3</div><div class='add'>+TEST LD4=`SETUP_LOOP $B4/brick4`</div><div class='add'>+TEST MKFS_LOOP $LD4</div><div class='add'>+TEST LD5=`SETUP_LOOP $B5/brick5`</div><div class='add'>+TEST MKFS_LOOP $LD5</div><div class='add'>+TEST LD6=`SETUP_LOOP $B6/brick6`</div><div class='add'>+TEST MKFS_LOOP $LD6</div><div class='add'>+</div><div class='add'>+mkdir -p $B1/$V0 $B2/$V0 $B3/$V0 $B4/$V0 $B5/$V0 $B6/$V0</div><div class='add'>+</div><div class='add'>+TEST MOUNT_LOOP $LD1 $B1/$V0</div><div class='add'>+TEST MOUNT_LOOP $LD2 $B2/$V0</div><div class='add'>+TEST MOUNT_LOOP $LD3 $B3/$V0</div><div class='add'>+TEST MOUNT_LOOP $LD4 $B4/$V0</div><div class='add'>+TEST MOUNT_LOOP $LD5 $B5/$V0</div><div class='add'>+TEST MOUNT_LOOP $LD6 $B6/$V0</div><div class='add'>+</div><div class='add'>+#Case 0: Parent directory of the brick is absent</div><div class='add'>+TEST ! $CLI1 volume create $V0 $H1:$B1/$V0/nonexistent/b1 $H2:$B2/$V0/nonexistent/b2 force</div><div class='add'>+</div><div class='add'>+#Case 1: File system root is being used as brick directory</div><div class='add'>+TEST   $CLI1 volume create $V0 $H1:$B5/$V0 $H2:$B6/$V0 force</div><div class='add'>+</div><div class='add'>+#Case 2: Brick directory contains only one component</div><div class='add'>+TEST   $CLI1 volume create $V1 $H1:/$uuid1 $H2:/$uuid2 force</div><div class='add'>+</div><div class='add'>+#Case 3: Sub-directories of the backend FS being used as brick directory</div><div class='add'>+TEST   $CLI1 volume create $V2 $H1:$B1/$V0/brick1 $H2:$B2/$V0/brick2 force</div><div class='add'>+</div><div class='add'>+#add-brick tests</div><div class='add'>+TEST ! $CLI1 volume add-brick $V0 $H1:$B3/$V0/nonexistent/brick3 force</div><div class='add'>+TEST   $CLI1 volume add-brick $V0 $H1:$B3/$V0 force</div><div class='add'>+TEST   $CLI1 volume add-brick $V1 $H1:/$uuid3 force</div><div class='add'>+TEST   $CLI1 volume add-brick $V2 $H1:$B4/$V0/brick3 force</div><div class='add'>+</div><div class='add'>+#####replace-brick tests</div><div class='add'>+#FIX-ME: replace-brick does not work with the newly introduced cluster test</div><div class='add'>+#####framework</div><div class='add'>+</div><div class='add'>+rmdir /$uuid1 /$uuid2 /$uuid3;</div><div class='add'>+</div><div class='add'>+$CLI volume stop $V0</div><div class='add'>+$CLI volume stop $V1</div><div class='add'>+$CLI volume stop $V2</div><div class='add'>+</div><div class='add'>+UMOUNT_LOOP $B1/$V0</div><div class='add'>+UMOUNT_LOOP $B2/$V0</div><div class='add'>+UMOUNT_LOOP $B3/$V0</div><div class='add'>+UMOUNT_LOOP $B4/$V0</div><div class='add'>+UMOUNT_LOOP $B5/$V0</div><div class='add'>+UMOUNT_LOOP $B6/$V0</div><div class='add'>+</div><div class='add'>+rm -f $B1/brick1</div><div class='add'>+rm -f $B2/brick2</div><div class='add'>+rm -f $B3/brick3</div><div class='add'>+rm -f $B4/brick4</div><div class='add'>+rm -f $B5/brick5</div><div class='add'>+rm -f $B6/brick6</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/glusterd/bug-948729/bug-948729-mode-script.t b/tests/bugs/glusterd/bug-948729/bug-948729-mode-script.t<br/>new file mode 100644<br/>index 00000000000..18bf9a1c4b6<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/glusterd/bug-948729/bug-948729-mode-script.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/glusterd/bug-948729/bug-948729-mode-script.t</a></div><div class='hunk'>@@ -0,0 +1,77 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../../include.rc</div><div class='add'>+. $(dirname $0)/../../../volume.rc</div><div class='add'>+. $(dirname $0)/../../../cluster.rc</div><div class='add'>+</div><div class='add'>+function check_peers {</div><div class='add'>+        $CLI_1 peer status | grep 'Peer in Cluster (Connected)' | wc -l</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+uuid1=`uuidgen`;</div><div class='add'>+uuid2=`uuidgen`;</div><div class='add'>+uuid3=`uuidgen`;</div><div class='add'>+</div><div class='add'>+TEST launch_cluster 2;</div><div class='add'>+</div><div class='add'>+TEST $CLI_1 peer probe $H2;</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $PROBE_TIMEOUT 1 check_peers;</div><div class='add'>+</div><div class='add'>+B3=/d/backends/3</div><div class='add'>+mkdir -p $B3</div><div class='add'>+</div><div class='add'>+TEST truncate -s 16M $B1/brick1</div><div class='add'>+TEST truncate -s 16M $B2/brick2</div><div class='add'>+TEST truncate -s 16M $B3/brick3</div><div class='add'>+</div><div class='add'>+TEST LD1=`SETUP_LOOP $B1/brick1`</div><div class='add'>+TEST MKFS_LOOP $LD1</div><div class='add'>+TEST LD2=`SETUP_LOOP $B2/brick2`</div><div class='add'>+TEST MKFS_LOOP $LD2</div><div class='add'>+TEST LD3=`SETUP_LOOP $B3/brick3`</div><div class='add'>+TEST MKFS_LOOP $LD3</div><div class='add'>+</div><div class='add'>+mkdir -p $B1/$V0 $B2/$V0 $B3/$V0</div><div class='add'>+</div><div class='add'>+TEST MOUNT_LOOP $LD1 $B1/$V0</div><div class='add'>+TEST MOUNT_LOOP $LD2 $B2/$V0</div><div class='add'>+TEST MOUNT_LOOP $LD3 $B3/$V0</div><div class='add'>+</div><div class='add'>+cli1=$(echo $CLI1 | sed 's/ --wignore//')</div><div class='add'>+</div><div class='add'>+#Case 0: Parent directory of the brick is absent</div><div class='add'>+TEST ! $cli1 volume create $V0 $H1:$B1/$V0/nonexistent/b1 $H2:$B2/$V0/nonexistent/b2</div><div class='add'>+</div><div class='add'>+#Case 1: File system root being used as brick directory</div><div class='add'>+TEST   ! $cli1 volume create $V0 $H1:$B1/$V0 $H2:$B2/$V0</div><div class='add'>+</div><div class='add'>+#Case 2: Brick directory contains only one component</div><div class='add'>+TEST   ! $cli1 volume create $V0 $H1:/$uuid1 $H2:/$uuid2</div><div class='add'>+</div><div class='add'>+#Case 3: Sub-directories of the backend FS being used as brick directory</div><div class='add'>+TEST   $cli1 volume create $V0 $H1:$B1/$V0/brick1 $H2:$B2/$V0/brick2</div><div class='add'>+</div><div class='add'>+#add-brick tests</div><div class='add'>+TEST ! $cli1 volume add-brick $V0 $H1:$B3/$V0/nonexistent/brick3</div><div class='add'>+TEST ! $cli1 volume add-brick $V0 $H1:$B3/$V0</div><div class='add'>+TEST ! $cli1 volume add-brick $V0 $H1:/$uuid3</div><div class='add'>+TEST   $cli1 volume add-brick $V0 $H1:$B3/$V0/brick3</div><div class='add'>+</div><div class='add'>+#####replace-brick tests</div><div class='add'>+#FIX-ME : replace-brick does not currently work in the newly introduced</div><div class='add'>+#####cluster test framework</div><div class='add'>+</div><div class='add'>+$CLI1 volume stop $V0</div><div class='add'>+</div><div class='add'>+UMOUNT_LOOP $B1/$V0</div><div class='add'>+UMOUNT_LOOP $B2/$V0</div><div class='add'>+UMOUNT_LOOP $B3/$V0</div><div class='add'>+</div><div class='add'>+rm -f  $B1/brick1</div><div class='add'>+rm -f  $B2/brick2</div><div class='add'>+rm -f  $B3/brick3</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/glusterd/bug-948729/bug-948729.t b/tests/bugs/glusterd/bug-948729/bug-948729.t<br/>new file mode 100644<br/>index 00000000000..2b574aa1a14<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/glusterd/bug-948729/bug-948729.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/glusterd/bug-948729/bug-948729.t</a></div><div class='hunk'>@@ -0,0 +1,80 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../../include.rc</div><div class='add'>+. $(dirname $0)/../../../volume.rc</div><div class='add'>+. $(dirname $0)/../../../cluster.rc</div><div class='add'>+</div><div class='add'>+function check_peers {</div><div class='add'>+        $CLI_1 peer status | grep 'Peer in Cluster (Connected)' | wc -l</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+uuid1=`uuidgen`;</div><div class='add'>+uuid2=`uuidgen`;</div><div class='add'>+uuid3=`uuidgen`;</div><div class='add'>+</div><div class='add'>+TEST launch_cluster 2;</div><div class='add'>+</div><div class='add'>+TEST $CLI_1 peer probe $H2;</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $PROBE_TIMEOUT 1 check_peers;</div><div class='add'>+</div><div class='add'>+B3=/d/backends/3</div><div class='add'>+</div><div class='add'>+mkdir -p $B3</div><div class='add'>+</div><div class='add'>+TEST truncate -s 16M $B1/brick1</div><div class='add'>+TEST truncate -s 16M $B2/brick2</div><div class='add'>+TEST truncate -s 16M $B3/brick3</div><div class='add'>+</div><div class='add'>+TEST LD1=`SETUP_LOOP $B1/brick1`</div><div class='add'>+TEST MKFS_LOOP $LD1</div><div class='add'>+TEST LD2=`SETUP_LOOP $B2/brick2`</div><div class='add'>+TEST MKFS_LOOP $LD2</div><div class='add'>+TEST LD3=`SETUP_LOOP $B3/brick3`</div><div class='add'>+TEST MKFS_LOOP $LD3</div><div class='add'>+</div><div class='add'>+mkdir -p $B1/$V0 $B2/$V0 $B3/$V0</div><div class='add'>+</div><div class='add'>+TEST MOUNT_LOOP $LD1 $B1/$V0</div><div class='add'>+TEST MOUNT_LOOP $LD2 $B2/$V0</div><div class='add'>+TEST MOUNT_LOOP $LD3 $B3/$V0</div><div class='add'>+</div><div class='add'>+#Tests without options 'mode=script' and 'wignore'</div><div class='add'>+cli1=$(echo $CLI1 | sed 's/ --mode=script//')</div><div class='add'>+cli1=$(echo $cli1 | sed 's/ --wignore//')</div><div class='add'>+#Case 0: Parent directory of the brick is absent</div><div class='add'>+TEST ! $cli1 volume create $V0 $H1:$B1/$V0/nonexistent/b1 $H2:$B2/$V0/nonexistent/b2</div><div class='add'>+</div><div class='add'>+#Case 1: File system root being used as brick directory</div><div class='add'>+TEST ! $cli1 volume create $V0 $H1:$B1/$V0 $H2:$B2/$V0</div><div class='add'>+</div><div class='add'>+#Case 2: Brick directory contains only one component</div><div class='add'>+TEST ! $cli1 volume create $V0 $H1:/$uuid1 $H2:/$uuid2</div><div class='add'>+</div><div class='add'>+#Case 3: Sub-directories of the backend FS being used as brick directory</div><div class='add'>+TEST   $cli1 volume create $V0 $H1:$B1/$V0/brick1 $H2:$B2/$V0/brick2</div><div class='add'>+</div><div class='add'>+#add-brick tests</div><div class='add'>+TEST ! $cli1 volume add-brick $V0 $H1:$B3/$V0/nonexistent/b3</div><div class='add'>+TEST ! $cli1 volume add-brick $V0 $H1:$B3/$V0</div><div class='add'>+TEST ! $cli1 volume add-brick $V0 $H1:/$uuid3</div><div class='add'>+TEST   $cli1 volume add-brick $V0 $H1:$B3/$V0/brick3</div><div class='add'>+</div><div class='add'>+#####replace-brick tests</div><div class='add'>+#FIX-ME: Replace-brick does not work currently in the newly introduced cluster</div><div class='add'>+#####test framework.</div><div class='add'>+</div><div class='add'>+$CLI1 volume stop $V0</div><div class='add'>+</div><div class='add'>+UMOUNT_LOOP $B1/$V0</div><div class='add'>+UMOUNT_LOOP $B2/$V0</div><div class='add'>+UMOUNT_LOOP $B3/$V0</div><div class='add'>+</div><div class='add'>+rm -f  $B1/brick1</div><div class='add'>+rm -f  $B2/brick2</div><div class='add'>+rm -f  $B3/brick3</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/glusterd/bug-949930.t b/tests/bugs/glusterd/bug-949930.t<br/>new file mode 100644<br/>index 00000000000..9a6d38fa37f<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/glusterd/bug-949930.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/glusterd/bug-949930.t</a></div><div class='hunk'>@@ -0,0 +1,29 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+V1=patchy2</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd;</div><div class='add'>+TEST pidof glusterd;</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/${V0}{1,2};</div><div class='add'>+TEST $CLI volume set $V0 nfs.disable off</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V1 $H0:$B0/${V1}{1,2};</div><div class='add'>+TEST $CLI volume set $V1 nfs.disable off</div><div class='add'>+TEST $CLI volume start $V1;</div><div class='add'>+</div><div class='add'>+TEST ! $CLI volume set $V0 performance.nfs.read-ahead blah</div><div class='add'>+EXPECT '' volume_option $V0 performance.nfs.read-ahead</div><div class='add'>+</div><div class='add'>+TEST $CLI volume set $V0 performance.nfs.read-ahead on</div><div class='add'>+EXPECT "on" volume_option $V0 performance.nfs.read-ahead</div><div class='add'>+</div><div class='add'>+EXPECT '' volume_option $V1 performance.nfs.read-ahead</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='head'>diff --git a/tests/bugs/glusterd/check_elastic_server.t b/tests/bugs/glusterd/check_elastic_server.t<br/>new file mode 100644<br/>index 00000000000..41d2140aa2b<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/glusterd/check_elastic_server.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/glusterd/check_elastic_server.t</a></div><div class='hunk'>@@ -0,0 +1,63 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../cluster.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+function cluster_rebalance_status {</div><div class='add'>+        local vol=$1</div><div class='add'>+        $CLI_2 volume status | grep -iw "Rebalance" -A 5 | grep "Status" | sed 's/.*: //'</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+TEST launch_cluster 4;</div><div class='add'>+TEST $CLI_1 peer probe $H2;</div><div class='add'>+TEST $CLI_1 peer probe $H3;</div><div class='add'>+TEST $CLI_1 peer probe $H4;</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $PROBE_TIMEOUT 3 peer_count</div><div class='add'>+</div><div class='add'>+TEST $CLI_1 volume create $V0 $H1:$B1/$V0  $H2:$B2/$V0</div><div class='add'>+EXPECT 'Created' cluster_volinfo_field 1 $V0 'Status';</div><div class='add'>+</div><div class='add'>+$CLI_1 volume start $V0</div><div class='add'>+EXPECT 'Started' cluster_volinfo_field 1 $V0 'Status';</div><div class='add'>+</div><div class='add'>+#Mount invalid volume</div><div class='add'>+TEST ! glusterfs -s $H1 --volfile-id=$V0_NA $M0;</div><div class='add'>+</div><div class='add'>+#Mount FUSE</div><div class='add'>+TEST glusterfs -s $H1 --volfile-id=$V0 $M0;</div><div class='add'>+</div><div class='add'>+TEST mkdir $M0/dir{1..4};</div><div class='add'>+TEST touch $M0/dir{1..4}/files{1..4};</div><div class='add'>+</div><div class='add'>+TEST $CLI_1 volume remove-brick $V0 $H1:$B1/$V0 start</div><div class='add'>+EXPECT_WITHIN $REBALANCE_TIMEOUT "completed" cluster_remove_brick_status_completed_field "$V0 $H1:$B1/$V0"</div><div class='add'>+</div><div class='add'>+TEST $CLI_1 volume remove-brick $V0 $H1:$B1/$V0 commit</div><div class='add'>+</div><div class='add'>+kill_glusterd 1</div><div class='add'>+</div><div class='add'>+total_files=`find $M0 -name "files*" | wc -l`</div><div class='add'>+TEST [ $total_files -eq 16 ];</div><div class='add'>+</div><div class='add'>+TEST $CLI_2 volume add-brick $V0 $H3:$B3/$V0</div><div class='add'>+</div><div class='add'>+TEST $CLI_2 volume rebalance $V0  start</div><div class='add'>+EXPECT_WITHIN $REBALANCE_TIMEOUT "completed" cluster_rebalance_status $V0</div><div class='add'>+</div><div class='add'>+total_files=`find $M0 -name "files*" | wc -l`</div><div class='add'>+TEST [ $total_files -eq 16 ];</div><div class='add'>+</div><div class='add'>+TEST $CLI_2 volume add-brick $V0 $H4:$B4/$V0</div><div class='add'>+</div><div class='add'>+TEST $CLI_2 volume rebalance $V0  start</div><div class='add'>+EXPECT_WITHIN $REBALANCE_TIMEOUT "completed" cluster_rebalance_status $V0</div><div class='add'>+kill_glusterd 2</div><div class='add'>+</div><div class='add'>+total_files=`find $M0 -name "files*" | wc -l`</div><div class='add'>+TEST [ $total_files -eq 16 ];</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='head'>diff --git a/tests/bugs/glusterd/daemon-log-level-option.t b/tests/bugs/glusterd/daemon-log-level-option.t<br/>new file mode 100644<br/>index 00000000000..66e55e3d758<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/glusterd/daemon-log-level-option.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/glusterd/daemon-log-level-option.t</a></div><div class='hunk'>@@ -0,0 +1,93 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+</div><div class='add'>+function Info_messages_count() {</div><div class='add'>+        local shd_log=$1</div><div class='add'>+        cat $shd_log | grep " I " | wc -l</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function Warning_messages_count() {</div><div class='add'>+        local shd_log=$1</div><div class='add'>+        cat $shd_log | grep " W " | wc -l</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function Debug_messages_count() {</div><div class='add'>+        local shd_log=$1</div><div class='add'>+        cat $shd_log | grep " D " | wc -l</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function Trace_messages_count() {</div><div class='add'>+        local shd_log=$1</div><div class='add'>+        cat $shd_log | grep " T " | wc -l</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+# Basic checks</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume info</div><div class='add'>+</div><div class='add'>+# set cluster.daemon-log-level option to DEBUG</div><div class='add'>+TEST $CLI volume set all cluster.daemon-log-level DEBUG</div><div class='add'>+</div><div class='add'>+#Create a 3X2 distributed-replicate volume</div><div class='add'>+TEST $CLI volume create $V0 replica 2 $H0:$B0/${V0}{1..6};</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+# log should not have any trace messages</div><div class='add'>+EXPECT 0 Trace_messages_count "/var/log/glusterfs/glustershd.log"</div><div class='add'>+</div><div class='add'>+# stop the volume and remove glustershd log</div><div class='add'>+TEST $CLI volume stop $V0</div><div class='add'>+rm -f /var/log/glusterfs/glustershd.log</div><div class='add'>+</div><div class='add'>+# set cluster.daemon-log-level option to INFO and start the volume</div><div class='add'>+TEST $CLI volume set all cluster.daemon-log-level INFO</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+# log should not have any debug messages</div><div class='add'>+EXPECT 0 Debug_messages_count "/var/log/glusterfs/glustershd.log"</div><div class='add'>+</div><div class='add'>+# log should not have any trace messages</div><div class='add'>+EXPECT 0 Trace_messages_count "/var/log/glusterfs/glustershd.log"</div><div class='add'>+</div><div class='add'>+# stop the volume and remove glustershd log</div><div class='add'>+TEST $CLI volume stop $V0</div><div class='add'>+rm -f /var/log/glusterfs/glustershd.log</div><div class='add'>+</div><div class='add'>+# set cluster.daemon-log-level option to WARNING and start the volume</div><div class='add'>+TEST $CLI volume set all cluster.daemon-log-level WARNING</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+# log should not have any info messages</div><div class='add'>+EXPECT 0 Info_messages_count "/var/log/glusterfs/glustershd.log"</div><div class='add'>+</div><div class='add'>+# log should not have any debug messages</div><div class='add'>+EXPECT 0 Debug_messages_count "/var/log/glusterfs/glustershd.log"</div><div class='add'>+</div><div class='add'>+# log should not have any trace messages</div><div class='add'>+EXPECT 0 Trace_messages_count "/var/log/glusterfs/glustershd.log"</div><div class='add'>+</div><div class='add'>+# stop the volume and remove glustershd log</div><div class='add'>+TEST $CLI volume stop $V0</div><div class='add'>+rm -f /var/log/glusterfs/glustershd.log</div><div class='add'>+</div><div class='add'>+# set cluster.daemon-log-level option to ERROR and start the volume</div><div class='add'>+TEST $CLI volume set all cluster.daemon-log-level ERROR</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+# log should not have any info messages</div><div class='add'>+EXPECT 0 Info_messages_count "/var/log/glusterfs/glustershd.log"</div><div class='add'>+</div><div class='add'>+# log should not have any warning messages</div><div class='add'>+EXPECT 0 Warning_messages_count "/var/log/glusterfs/glustershd.log"</div><div class='add'>+</div><div class='add'>+# log should not have any debug messages</div><div class='add'>+EXPECT 0 Debug_messages_count "/var/log/glusterfs/glustershd.log"</div><div class='add'>+</div><div class='add'>+# log should not have any trace messages</div><div class='add'>+EXPECT 0 Trace_messages_count "/var/log/glusterfs/glustershd.log"</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/bugs/glusterd/df-results-post-replace-brick-operations.t b/tests/bugs/glusterd/df-results-post-replace-brick-operations.t<br/>new file mode 100644<br/>index 00000000000..04f75889388<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/glusterd/df-results-post-replace-brick-operations.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/glusterd/df-results-post-replace-brick-operations.t</a></div><div class='hunk'>@@ -0,0 +1,61 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='add'>+TEST glusterd</div><div class='add'>+</div><div class='add'>+#Create brick partitions</div><div class='add'>+TEST truncate -s 100M $B0/brick1</div><div class='add'>+TEST truncate -s 100M $B0/brick2</div><div class='add'>+TEST truncate -s 100M $B0/brick3</div><div class='add'>+TEST truncate -s 100M $B0/brick4</div><div class='add'>+TEST truncate -s 100M $B0/brick5</div><div class='add'>+</div><div class='add'>+LO1=`SETUP_LOOP $B0/brick1`</div><div class='add'>+TEST [ $? -eq 0 ]</div><div class='add'>+TEST MKFS_LOOP $LO1</div><div class='add'>+</div><div class='add'>+LO2=`SETUP_LOOP $B0/brick2`</div><div class='add'>+TEST [ $? -eq 0 ]</div><div class='add'>+TEST MKFS_LOOP $LO2</div><div class='add'>+</div><div class='add'>+LO3=`SETUP_LOOP $B0/brick3`</div><div class='add'>+TEST [ $? -eq 0 ]</div><div class='add'>+TEST MKFS_LOOP $LO3</div><div class='add'>+</div><div class='add'>+LO4=`SETUP_LOOP $B0/brick4`</div><div class='add'>+TEST [ $? -eq 0 ]</div><div class='add'>+TEST MKFS_LOOP $LO4</div><div class='add'>+</div><div class='add'>+LO5=`SETUP_LOOP $B0/brick5`</div><div class='add'>+TEST [ $? -eq 0 ]</div><div class='add'>+TEST MKFS_LOOP $LO5</div><div class='add'>+</div><div class='add'>+TEST mkdir -p $B0/${V0}1 $B0/${V0}2 $B0/${V0}3 $B0/${V0}4 $B0/${V0}5</div><div class='add'>+TEST MOUNT_LOOP $LO1 $B0/${V0}1</div><div class='add'>+TEST MOUNT_LOOP $LO2 $B0/${V0}2</div><div class='add'>+TEST MOUNT_LOOP $LO3 $B0/${V0}3</div><div class='add'>+TEST MOUNT_LOOP $LO4 $B0/${V0}4</div><div class='add'>+TEST MOUNT_LOOP $LO5 $B0/${V0}5</div><div class='add'>+</div><div class='add'>+# create a subdirectory in mount point and use it for volume creation</div><div class='add'>+TEST $CLI volume create $V0 replica 3 $H0:$B0/${V0}1/brick1 $H0:$B0/${V0}2/brick1 $H0:$B0/${V0}3/brick1</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "3" online_brick_count</div><div class='add'>+</div><div class='add'>+# mount the volume and check the size at mount point</div><div class='add'>+TEST $GFS --volfile-server=$H0 --volfile-id=$V0 $M0</div><div class='add'>+total_space=$(df -P $M0 | tail -1 | awk '{ print $2}')</div><div class='add'>+</div><div class='add'>+# perform replace brick operations</div><div class='add'>+TEST $CLI volume replace-brick $V0 $H0:$B0/${V0}1/brick1 $H0:$B0/${V0}4/brick1 commit force</div><div class='add'>+TEST $CLI volume replace-brick $V0 $H0:$B0/${V0}2/brick1 $H0:$B0/${V0}5/brick1 commit force</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status $V0 0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status $V0 1</div><div class='add'>+</div><div class='add'>+# check for the size at mount point, it should be same as previous</div><div class='add'>+total_space_new=$(df -P $M0 | tail -1 | awk '{ print $2}')</div><div class='add'>+TEST [ $total_space -eq $total_space_new ]</div><div class='head'>diff --git a/tests/bugs/glusterd/mgmt-handshake-and-volume-sync-post-glusterd-restart.t b/tests/bugs/glusterd/mgmt-handshake-and-volume-sync-post-glusterd-restart.t<br/>new file mode 100644<br/>index 00000000000..8001359e6b3<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/glusterd/mgmt-handshake-and-volume-sync-post-glusterd-restart.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/glusterd/mgmt-handshake-and-volume-sync-post-glusterd-restart.t</a></div><div class='hunk'>@@ -0,0 +1,71 @@</div><div class='add'>+#! /bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../cluster.rc</div><div class='add'>+</div><div class='add'>+function check_peers {</div><div class='add'>+eval \$CLI_$1 peer status | grep 'Peer in Cluster (Connected)' | wc -l</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='add'>+</div><div class='add'>+TEST launch_cluster 3</div><div class='add'>+</div><div class='add'>+TEST $CLI_1 peer probe $H2</div><div class='add'>+</div><div class='add'>+#bug-1109741 - validate mgmt handshake</div><div class='add'>+</div><div class='add'>+TEST ! $CLI_3 peer probe $H1</div><div class='add'>+</div><div class='add'>+GD1_WD=$($CLI_1 system getwd)</div><div class='add'>+OP_VERS_ORIG=$(grep 'operating-version' ${GD1_WD}/glusterd.info | cut -d '=' -f 2)</div><div class='add'>+</div><div class='add'>+TEST $CLI_3 system uuid get # Needed for glusterd.info to be created</div><div class='add'>+</div><div class='add'>+GD3_WD=$($CLI_3 system getwd)</div><div class='add'>+TEST sed -rnie "'s/(operating-version=)\w+/\130600/gip'" ${GD3_WD}/glusterd.info</div><div class='add'>+</div><div class='add'>+TEST kill_glusterd 3</div><div class='add'>+TEST start_glusterd 3</div><div class='add'>+</div><div class='add'>+TEST ! $CLI_3 peer probe $H1</div><div class='add'>+</div><div class='add'>+OP_VERS_NEW=$(grep 'operating-version' ${GD1_WD}/glusterd.info | cut -d '=' -f 2)</div><div class='add'>+TEST [[ $OP_VERS_ORIG == $OP_VERS_NEW ]]</div><div class='add'>+</div><div class='add'>+#bug-948686 - volume sync after bringing up the killed node</div><div class='add'>+</div><div class='add'>+TEST $CLI_1 peer probe $H3</div><div class='add'>+EXPECT_WITHIN $PROBE_TIMEOUT 2 check_peers 1</div><div class='add'>+EXPECT_WITHIN $PROBE_TIMEOUT 2 check_peers 2</div><div class='add'>+EXPECT_WITHIN $PROBE_TIMEOUT 2 check_peers 3</div><div class='add'>+</div><div class='add'>+TEST $CLI_1 volume create $V0 replica 2 $H1:$B1/$V0 $H1:$B1/${V0}_1 $H2:$B2/$V0 $H3:$B3/$V0</div><div class='add'>+TEST $CLI_1 volume start $V0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT 'Started' volinfo_field_1 $V0 'Status'</div><div class='add'>+TEST glusterfs --volfile-server=$H1 --volfile-id=$V0 $M0</div><div class='add'>+</div><div class='add'>+#kill a node</div><div class='add'>+TEST kill_node 3</div><div class='add'>+EXPECT_WITHIN $PROBE_TIMEOUT 1 check_peers 1</div><div class='add'>+EXPECT_WITHIN $PROBE_TIMEOUT 1 check_peers 2</div><div class='add'>+</div><div class='add'>+#modify volume config to see change in volume-sync</div><div class='add'>+TEST $CLI_1 volume set $V0 write-behind off</div><div class='add'>+#add some files to the volume to see effect of volume-heal cmd</div><div class='add'>+TEST touch $M0/{1..100};</div><div class='add'>+TEST $CLI_1 volume stop $V0;</div><div class='add'>+EXPECT_WITHIN $PROCESS_DOWN_TIMEOUT 'Stopped' volinfo_field_1 $V0 'Status'</div><div class='add'>+</div><div class='add'>+TEST $glusterd_3;</div><div class='add'>+EXPECT_WITHIN $PROBE_TIMEOUT 2 check_peers 1</div><div class='add'>+EXPECT_WITHIN $PROBE_TIMEOUT 2 check_peers 2</div><div class='add'>+EXPECT_WITHIN $PROBE_TIMEOUT 2 check_peers 3</div><div class='add'>+</div><div class='add'>+sleep 5</div><div class='add'>+TEST $CLI_3 volume start $V0;</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT 'Started' volinfo_field_1 $V0 'Status'</div><div class='add'>+TEST $CLI_2 volume stop $V0;</div><div class='add'>+TEST $CLI_2 volume delete $V0;</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/bugs/glusterd/optimized-basic-testcases-in-cluster.t b/tests/bugs/glusterd/optimized-basic-testcases-in-cluster.t<br/>new file mode 100644<br/>index 00000000000..99272e14245<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/glusterd/optimized-basic-testcases-in-cluster.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/glusterd/optimized-basic-testcases-in-cluster.t</a></div><div class='hunk'>@@ -0,0 +1,115 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../cluster.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+function peer_count {</div><div class='add'>+eval \$CLI_$1 peer status | grep 'Peer in Cluster (Connected)' | wc -l</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+#bug-1454418 -  Setting Port number in specific range</div><div class='add'>+sysctl net.ipv4.ip_local_reserved_ports="24007-24008,32765-32768,49152-49156"</div><div class='add'>+</div><div class='add'>+TEST launch_cluster 4;</div><div class='add'>+</div><div class='add'>+#bug-1223213</div><div class='add'>+</div><div class='add'>+# Fool the cluster to operate with 3.5 version even though binary's op-version</div><div class='add'>+# is &gt; 3.5. This is to ensure 3.5 code path is hit to test that volume status</div><div class='add'>+# works when a node is upgraded from 3.5 to 3.7 or higher as mgmt_v3 lock is</div><div class='add'>+# been introduced in 3.6 version and onwards</div><div class='add'>+</div><div class='add'>+GD1_WD=$($CLI_1 system getwd)</div><div class='add'>+$CLI_1 system uuid get</div><div class='add'>+Old_op_version=$(cat ${GD1_WD}/glusterd.info | grep operating-version | cut -d '=' -f 2)</div><div class='add'>+</div><div class='add'>+TEST sed -rnie "'s/(operating-version=)\w+/\130500/gip'" ${GD1_WD}/glusterd.info</div><div class='add'>+</div><div class='add'>+TEST kill_glusterd 1</div><div class='add'>+TEST start_glusterd 1</div><div class='add'>+</div><div class='add'>+TEST $CLI_1 peer probe $H2;</div><div class='add'>+EXPECT_WITHIN $PROBE_TIMEOUT 1 peer_count 1</div><div class='add'>+</div><div class='add'>+TEST `sed -i "s/"30500"/${Old_op_version}/g" ${GD1_WD}/glusterd.info`</div><div class='add'>+</div><div class='add'>+TEST kill_glusterd 1</div><div class='add'>+TEST start_glusterd 1</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $PROBE_TIMEOUT 1 peer_count 1</div><div class='add'>+EXPECT_WITHIN $PROBE_TIMEOUT 1 peer_count 2</div><div class='add'>+</div><div class='add'>+#bug-1454418</div><div class='add'>+sysctl net.ipv4.ip_local_reserved_ports="</div><div class='add'>+"</div><div class='add'>+</div><div class='add'>+TEST $CLI_1 volume create $V0 $H1:$B1/$V0 $H2:$B2/$V0</div><div class='add'>+TEST $CLI_1 volume start $V0</div><div class='add'>+</div><div class='add'>+#bug-888752 - volume status --xml from peer in the cluster</div><div class='add'>+</div><div class='add'>+TEST $CLI_1 volume status $V0 $H2:$B2/$V0 --xml</div><div class='add'>+</div><div class='add'>+TEST $CLI_1 volume stop $V0</div><div class='add'>+TEST $CLI_1 volume delete $V0</div><div class='add'>+</div><div class='add'>+TEST $CLI_1 volume create $V0 $H1:$B1/$V0 $H2:$B2/$V0</div><div class='add'>+TEST $CLI_1 volume create $V1 $H1:$B1/$V1</div><div class='add'>+</div><div class='add'>+# bug - 1635820</div><div class='add'>+# rebooting a node which doen't host bricks for any one volume</div><div class='add'>+# peer should not go into rejected state</div><div class='add'>+TEST kill_glusterd 2</div><div class='add'>+TEST start_glusterd 2</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $PROBE_TIMEOUT 1 peer_count 1</div><div class='add'>+EXPECT_WITHIN $PROBE_TIMEOUT 1 peer_count 2</div><div class='add'>+</div><div class='add'>+TEST $CLI_1 volume start $V0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT 'Started' volinfo_field_1 $V0 'Status'</div><div class='add'>+</div><div class='add'>+TEST $CLI_1 volume start $V1</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT 'Started' volinfo_field_1 $V1 'Status'</div><div class='add'>+</div><div class='add'>+TEST $CLI_1 peer probe $H3;</div><div class='add'>+EXPECT_WITHIN $PROBE_TIMEOUT 2 peer_count 1</div><div class='add'>+</div><div class='add'>+TEST $CLI_1 peer probe $H4;</div><div class='add'>+EXPECT_WITHIN $PROBE_TIMEOUT 3 peer_count 1</div><div class='add'>+</div><div class='add'>+#bug-1173414 - validate mgmt-v3-remote-lock-failure</div><div class='add'>+</div><div class='add'>+for i in {1..20}</div><div class='add'>+do</div><div class='add'>+$CLI_1 volume set $V0 diagnostics.client-log-level DEBUG &amp;</div><div class='add'>+$CLI_1 volume set $V1 barrier on</div><div class='add'>+$CLI_2 volume set $V0 diagnostics.client-log-level DEBUG &amp;</div><div class='add'>+$CLI_2 volume set $V1 barrier on</div><div class='add'>+done</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $PROBE_TIMEOUT 3 peer_count 1</div><div class='add'>+TEST $CLI_1 volume status</div><div class='add'>+TEST $CLI_2 volume status</div><div class='add'>+</div><div class='add'>+#bug-1293414 - validate peer detach</div><div class='add'>+</div><div class='add'>+# peers hosting bricks cannot be detached</div><div class='add'>+TEST ! $CLI_4 peer detach $H1</div><div class='add'>+EXPECT_WITHIN $PROBE_TIMEOUT 3 peer_count 1</div><div class='add'>+</div><div class='add'>+# peer not hosting bricks should be detachable</div><div class='add'>+TEST $CLI_4 peer detach $H3</div><div class='add'>+EXPECT_WITHIN $PROBE_TIMEOUT 2 peer_count 1</div><div class='add'>+</div><div class='add'>+#bug-1344407 - deleting a volume when peer is down should fail</div><div class='add'>+</div><div class='add'>+#volume should be stopped before deletion</div><div class='add'>+TEST $CLI_1 volume stop $V0</div><div class='add'>+</div><div class='add'>+TEST kill_glusterd 2</div><div class='add'>+TEST ! $CLI_1 volume delete $V0</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/bugs/glusterd/optimized-basic-testcases.t b/tests/bugs/glusterd/optimized-basic-testcases.t<br/>new file mode 100644<br/>index 00000000000..b89ca22415e<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/glusterd/optimized-basic-testcases.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/glusterd/optimized-basic-testcases.t</a></div><div class='hunk'>@@ -0,0 +1,305 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+. $(dirname $0)/../../nfs.rc</div><div class='add'>+</div><div class='add'>+function get_opret_value () {</div><div class='add'>+  local VOL=$1</div><div class='add'>+  $CLI volume info $VOL --xml | sed -ne 's/.*&lt;opRet&gt;\([-0-9]*\)&lt;\/opRet&gt;/\1/p'</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function check_brick()</div><div class='add'>+{</div><div class='add'>+        vol=$1;</div><div class='add'>+        num=$2</div><div class='add'>+        $CLI volume info $V0 | grep "Brick$num" | awk '{print $2}';</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function brick_count()</div><div class='add'>+{</div><div class='add'>+        local vol=$1;</div><div class='add'>+</div><div class='add'>+        $CLI volume info $vol | egrep "^Brick[0-9]+: " | wc -l;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function get_brick_host_uuid()</div><div class='add'>+{</div><div class='add'>+    local vol=$1;</div><div class='add'>+    local uuid_regex='[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}'</div><div class='add'>+    local host_uuid_list=$($CLI volume info $vol --xml | grep "brick.uuid" | grep -o -E "$uuid_regex");</div><div class='add'>+</div><div class='add'>+    echo $host_uuid_list | awk '{print $1}'</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function generate_statedump_and_check_for_glusterd_info {</div><div class='add'>+        pid=`pidof glusterd`</div><div class='add'>+        #remove old stale statedumps</div><div class='add'>+        cleanup_statedump $pid</div><div class='add'>+        kill -USR1 $pid</div><div class='add'>+        #Wait till the statedump is generated</div><div class='add'>+        sleep 1</div><div class='add'>+        fname=$(ls $statedumpdir | grep -E "\.$pid\.dump\.")</div><div class='add'>+        cat $statedumpdir/$fname | grep "xlator.glusterd.priv" | wc -l</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd;</div><div class='add'>+TEST pidof glusterd;</div><div class='add'>+</div><div class='add'>+#bug-1238135-lazy-daemon-initialization-on-demand</div><div class='add'>+</div><div class='add'>+GDWD=$($CLI system getwd)</div><div class='add'>+</div><div class='add'>+# glusterd.info file will be created on either first peer probe or volume</div><div class='add'>+# creation, hence we expect file to be not present in this case</div><div class='add'>+TEST ! -e $GDWD/glusterd.info</div><div class='add'>+</div><div class='add'>+#bug-913487 - setting volume options before creation of volume should fail</div><div class='add'>+</div><div class='add'>+TEST ! $CLI volume set $V0 performance.open-behind off;</div><div class='add'>+TEST pidof glusterd;</div><div class='add'>+</div><div class='add'>+#bug-1433578 - glusterd should not crash after probing a invalid peer</div><div class='add'>+</div><div class='add'>+TEST ! $CLI peer probe invalid-peer</div><div class='add'>+TEST pidof glusterd;</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/${V0}{1,2};</div><div class='add'>+EXPECT 'Created' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+#bug-1786478 - default volume option after volume reset</div><div class='add'>+addr_family=`volinfo_field $V0 'transport.address-family'`</div><div class='add'>+TEST $CLI volume reset $V0</div><div class='add'>+EXPECT $addr_family  volinfo_field $V0 'transport.address-family'</div><div class='add'>+</div><div class='add'>+#bug-955588 - uuid validation</div><div class='add'>+</div><div class='add'>+uuid=`grep UUID $GLUSTERD_WORKDIR/glusterd.info | cut -f2 -d=`</div><div class='add'>+EXPECT $uuid get_brick_host_uuid $V0</div><div class='add'>+TEST $CLI volume delete $V0;</div><div class='add'>+TEST ! $CLI volume info $V0;</div><div class='add'>+</div><div class='add'>+#bug-958790 - set options from file</div><div class='add'>+</div><div class='add'>+touch $GLUSTERD_WORKDIR/groups/test</div><div class='add'>+echo "read-ahead=off" &gt; $GLUSTERD_WORKDIR/groups/test</div><div class='add'>+echo "open-behind=off" &gt;&gt; $GLUSTERD_WORKDIR/groups/test</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/${V0}{1,2};</div><div class='add'>+TEST $CLI volume set $V0 group test</div><div class='add'>+EXPECT "off" volume_option $V0 performance.read-ahead</div><div class='add'>+EXPECT "off" volume_option $V0 performance.open-behind</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+EXPECT 'Started' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+#bug-1321836 - validate opret value for non existing volume</div><div class='add'>+</div><div class='add'>+EXPECT 0 get_opret_value $V0</div><div class='add'>+EXPECT -1 get_opret_value "novol"</div><div class='add'>+</div><div class='add'>+EXPECT '2' brick_count $V0</div><div class='add'>+</div><div class='add'>+#bug-862834 - validate brick status</div><div class='add'>+</div><div class='add'>+EXPECT "$H0:$B0/${V0}1" check_brick $V0 '1';</div><div class='add'>+EXPECT "$H0:$B0/${V0}2" check_brick $V0 '2';</div><div class='add'>+</div><div class='add'>+TEST ! $CLI volume create $V1 $H0:$B0/${V1}0 $H0:$B0/${V0}1;</div><div class='add'>+</div><div class='add'>+#bug-1482344 - setting volume-option-at-cluster-level should not result in glusterd crash</div><div class='add'>+</div><div class='add'>+TEST ! $CLI volume set all transport.listen-backlog 128</div><div class='add'>+</div><div class='add'>+# Check the volume info output, if glusterd would have crashed then this command</div><div class='add'>+# will fail</div><div class='add'>+TEST $CLI volume info $V0;</div><div class='add'>+</div><div class='add'>+#bug-1002556 and bug-1199451 - command should retrieve current op-version of the node</div><div class='add'>+TEST $CLI volume get all cluster.op-version</div><div class='add'>+</div><div class='add'>+#bug-1315186 - reject-lowering-down-op-version</div><div class='add'>+</div><div class='add'>+OP_VERS_ORIG=$(grep 'operating-version' ${GDWD}/glusterd.info | cut -d '=' -f 2)</div><div class='add'>+OP_VERS_NEW=`expr $OP_VERS_ORIG-1`</div><div class='add'>+</div><div class='add'>+TEST ! $CLI volume set all $V0 cluster.op-version $OP_VERS_NEW</div><div class='add'>+</div><div class='add'>+#bug-1022055 - validate log rotate command</div><div class='add'>+</div><div class='add'>+TEST ! $CLI volume log rotate $V0;</div><div class='add'>+TEST $CLI volume log $V0 rotate;</div><div class='add'>+</div><div class='add'>+#bug-1092841 - validating barrier enable/disable</div><div class='add'>+</div><div class='add'>+TEST $CLI volume barrier $V0 enable;</div><div class='add'>+TEST ! $CLI volume barrier $V0 enable;</div><div class='add'>+</div><div class='add'>+TEST $CLI volume barrier $V0 disable;</div><div class='add'>+TEST ! $CLI volume barrier $V0 disable;</div><div class='add'>+</div><div class='add'>+#bug-1095097 - validate volume profile command</div><div class='add'>+</div><div class='add'>+TEST $CLI volume profile $V0 start</div><div class='add'>+TEST $CLI volume profile $V0 info</div><div class='add'>+</div><div class='add'>+#bug-839595 - validate server-quorum options</div><div class='add'>+</div><div class='add'>+TEST $CLI volume set $V0 cluster.server-quorum-type server</div><div class='add'>+EXPECT "server" volume_option $V0 cluster.server-quorum-type</div><div class='add'>+TEST $CLI volume set $V0 cluster.server-quorum-type none</div><div class='add'>+EXPECT "none" volume_option $V0 cluster.server-quorum-type</div><div class='add'>+TEST $CLI volume reset $V0 cluster.server-quorum-type</div><div class='add'>+TEST ! $CLI volume set $V0 cluster.server-quorum-type abc</div><div class='add'>+TEST ! $CLI volume set all cluster.server-quorum-type none</div><div class='add'>+TEST ! $CLI volume set $V0 cluster.server-quorum-ratio 100</div><div class='add'>+</div><div class='add'>+TEST ! $CLI volume set all cluster.server-quorum-ratio abc</div><div class='add'>+TEST ! $CLI volume set all cluster.server-quorum-ratio -1</div><div class='add'>+TEST ! $CLI volume set all cluster.server-quorum-ratio 100.0000005</div><div class='add'>+TEST $CLI volume set all cluster.server-quorum-ratio 0</div><div class='add'>+EXPECT "0" volume_option $V0 cluster.server-quorum-ratio</div><div class='add'>+TEST $CLI volume set all cluster.server-quorum-ratio 100</div><div class='add'>+EXPECT "100" volume_option $V0 cluster.server-quorum-ratio</div><div class='add'>+TEST $CLI volume set all cluster.server-quorum-ratio 0.0000005</div><div class='add'>+EXPECT "0.0000005" volume_option $V0 cluster.server-quorum-ratio</div><div class='add'>+TEST $CLI volume set all cluster.server-quorum-ratio 100%</div><div class='add'>+EXPECT "100%" volume_option $V0 cluster.server-quorum-ratio</div><div class='add'>+</div><div class='add'>+#bug-1265479 - validate-distributed-volume-options</div><div class='add'>+</div><div class='add'>+#Setting data-self-heal option on for distribute volume</div><div class='add'>+TEST ! $CLI volume set $V0 data-self-heal on</div><div class='add'>+EXPECT '' volinfo_field $V0 'cluster.data-self-heal';</div><div class='add'>+TEST ! $CLI volume set $V0 cluster.data-self-heal on</div><div class='add'>+EXPECT '' volinfo_field $V0 'cluster.data-self-heal';</div><div class='add'>+</div><div class='add'>+#Setting metadata-self-heal option on for distribute volume</div><div class='add'>+TEST ! $CLI volume set $V0 metadata-self-heal on</div><div class='add'>+EXPECT '' volinfo_field $V0 'cluster.metadata-self-heal';</div><div class='add'>+TEST ! $CLI volume set $V0 cluster.metadata-self-heal on</div><div class='add'>+EXPECT '' volinfo_field $V0 'cluster.metadata-self-heal';</div><div class='add'>+</div><div class='add'>+#Setting entry-self-heal option on for distribute volume</div><div class='add'>+TEST ! $CLI volume set $V0 entry-self-heal on</div><div class='add'>+EXPECT '' volinfo_field $V0 'cluster.entrydata-self-heal';</div><div class='add'>+TEST ! $CLI volume set $V0 cluster.entry-self-heal on</div><div class='add'>+EXPECT '' volinfo_field $V0 'cluster.entrydata-self-heal';</div><div class='add'>+</div><div class='add'>+#bug-1163108 - validate min-free-disk-option</div><div class='add'>+</div><div class='add'>+## Setting invalid value for option cluster.min-free-disk should fail</div><div class='add'>+TEST ! $CLI volume set $V0 min-free-disk ""</div><div class='add'>+TEST ! $CLI volume set $V0 min-free-disk 143.!/12</div><div class='add'>+TEST ! $CLI volume set $V0 min-free-disk 123%</div><div class='add'>+TEST ! $CLI volume set $V0 min-free-disk 194.34%</div><div class='add'>+</div><div class='add'>+## Setting fractional value as a size (unit is byte) for option</div><div class='add'>+## cluster.min-free-disk should fail</div><div class='add'>+TEST ! $CLI volume set $V0 min-free-disk 199.051</div><div class='add'>+TEST ! $CLI volume set $V0 min-free-disk 111.999</div><div class='add'>+</div><div class='add'>+## Setting valid value for option cluster.min-free-disk should pass</div><div class='add'>+TEST  $CLI volume set $V0 min-free-disk 12%</div><div class='add'>+TEST  $CLI volume set $V0 min-free-disk 56.7%</div><div class='add'>+TEST  $CLI volume set $V0 min-free-disk 120</div><div class='add'>+TEST  $CLI volume set $V0 min-free-disk 369.0000</div><div class='add'>+</div><div class='add'>+#bug-1179175-uss-option-validation</div><div class='add'>+</div><div class='add'>+## Set features.uss option with non-boolean value. These non-boolean value</div><div class='add'>+## for features.uss option should fail.</div><div class='add'>+TEST ! $CLI volume set $V0 features.uss abcd</div><div class='add'>+TEST ! $CLI volume set $V0 features.uss #$#$</div><div class='add'>+TEST ! $CLI volume set $V0 features.uss 2324</div><div class='add'>+</div><div class='add'>+## Setting other options with valid value. These options should succeed.</div><div class='add'>+TEST $CLI volume set $V0 barrier enable</div><div class='add'>+TEST $CLI volume set $V0 ping-timeout 60</div><div class='add'>+</div><div class='add'>+## Set features.uss option with valid boolean value. It should succeed.</div><div class='add'>+TEST  $CLI volume set $V0 features.uss enable</div><div class='add'>+TEST  $CLI volume set $V0 features.uss disable</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+## Setting other options with valid value. These options should succeed.</div><div class='add'>+TEST $CLI volume set $V0 barrier enable</div><div class='add'>+TEST $CLI volume set $V0 ping-timeout 60</div><div class='add'>+</div><div class='add'>+#bug-1209329 - daemon-svcs-on-reset-volume</div><div class='add'>+</div><div class='add'>+##enable the bitrot and verify bitd is running or not</div><div class='add'>+TEST $CLI volume bitrot $V0 enable</div><div class='add'>+EXPECT 'on' volinfo_field $V0 'features.bitrot'</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" get_bitd_count</div><div class='add'>+</div><div class='add'>+##Do reset force which set the bitrot options to default</div><div class='add'>+TEST $CLI volume reset $V0 force;</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "0" get_bitd_count</div><div class='add'>+</div><div class='add'>+##enable the uss option and verify snapd is running or not</div><div class='add'>+TEST $CLI volume set $V0 features.uss on</div><div class='add'>+EXPECT 'on' volinfo_field $V0 'features.uss'</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" get_snapd_count</div><div class='add'>+</div><div class='add'>+##Do reset force which set the uss options to default</div><div class='add'>+TEST $CLI volume reset $V0 force;</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "0" get_snapd_count</div><div class='add'>+</div><div class='add'>+##verify initial nfs disabled by default</div><div class='add'>+EXPECT "0" get_nfs_count</div><div class='add'>+</div><div class='add'>+##enable nfs and verify</div><div class='add'>+TEST $CLI volume set $V0 nfs.disable off</div><div class='add'>+EXPECT_WITHIN $NFS_EXPORT_TIMEOUT "1" is_nfs_export_available</div><div class='add'>+EXPECT "1" get_nfs_count</div><div class='add'>+</div><div class='add'>+##Do reset force which set the nfs.option to default</div><div class='add'>+TEST $CLI volume reset $V0 force;</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "0" get_nfs_count</div><div class='add'>+</div><div class='add'>+##enable the uss option and verify snapd is running or not</div><div class='add'>+TEST $CLI volume set $V0 features.uss on</div><div class='add'>+EXPECT 'on' volinfo_field $V0 'features.uss'</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" get_snapd_count</div><div class='add'>+</div><div class='add'>+##Disable the uss option using set command and verify snapd</div><div class='add'>+TEST $CLI volume set $V0 features.uss  off</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "0" get_snapd_count</div><div class='add'>+</div><div class='add'>+##enable nfs.disable and verify</div><div class='add'>+TEST $CLI volume set $V0 nfs.disable on</div><div class='add'>+EXPECT 'on' volinfo_field $V0 'nfs.disable'</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "0" get_nfs_count</div><div class='add'>+</div><div class='add'>+## disable nfs.disable option using set command</div><div class='add'>+TEST $CLI volume set $V0 nfs.disable  off</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" get_nfs_count</div><div class='add'>+</div><div class='add'>+TEST $CLI volume info;</div><div class='add'>+TEST $CLI volume create $V1 $H0:$B0/${V1}1</div><div class='add'>+TEST $CLI volume start $V1</div><div class='add'>+pkill glusterd;</div><div class='add'>+pkill glusterfsd;</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST $CLI volume status $V1</div><div class='add'>+</div><div class='add'>+#bug-853601 - Avoid using /var/lib/glusterd as a brick</div><div class='add'>+TEST ! $CLI volume create "test" $H0:/var/lib/glusterd</div><div class='add'>+TEST ! $CLI volume create "test" $H0:/var/lib/glusterd force</div><div class='add'>+TEST ! $CLI volume create "test" $H0:/var/lib/glusterd/abc</div><div class='add'>+TEST ! $CLI volume create "test" $H0:/var/lib/glusterd/abc force</div><div class='add'>+mkdir -p /xyz/var/lib/glusterd/abc</div><div class='add'>+</div><div class='add'>+#bug 1716812 - volfile should be created with transport type both</div><div class='add'>+TEST  $CLI volume create "test" transport tcp,rdma $H0:/xyz/var/lib/glusterd/abc</div><div class='add'>+EXPECT 'Created' volinfo_field "test" 'Status';</div><div class='add'>+</div><div class='add'>+#While taking a statedump, there is a TRY_LOCK on call_frame, which might may cause</div><div class='add'>+#failure. So Adding a EXPECT_WITHIN</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "^1$" generate_statedump_and_check_for_glusterd_info</div><div class='add'>+</div><div class='add'>+cleanup_statedump `pidof glusterd`</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/bugs/glusterd/quorum-validation.t b/tests/bugs/glusterd/quorum-validation.t<br/>new file mode 100644<br/>index 00000000000..3cc3351b43b<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/glusterd/quorum-validation.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/glusterd/quorum-validation.t</a></div><div class='hunk'>@@ -0,0 +1,122 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+. $(dirname $0)/../../cluster.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST launch_cluster 2</div><div class='add'>+</div><div class='add'>+TEST $CLI_1 peer probe $H2;</div><div class='add'>+EXPECT_WITHIN $PROBE_TIMEOUT 1 peer_count</div><div class='add'>+</div><div class='add'>+TEST $CLI_1 volume create $V0 $H1:$B1/${V0}0 $H2:$B2/${V0}1</div><div class='add'>+TEST $CLI_1 volume set $V0 cluster.server-quorum-type server</div><div class='add'>+TEST $CLI_1 volume start $V0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" cluster_brick_up_status 1 $V0 $H1 $B1/${V0}0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" cluster_brick_up_status 1 $V0 $H2 $B2/${V0}1</div><div class='add'>+</div><div class='add'>+#bug-1177132 - sync server quorum options when a node is brought up</div><div class='add'>+TEST $CLI_1 volume set all cluster.server-quorum-ratio 52</div><div class='add'>+</div><div class='add'>+#Bring down 2nd glusterd</div><div class='add'>+TEST kill_glusterd 2</div><div class='add'>+EXPECT_WITHIN $PROBE_TIMEOUT 0 peer_count</div><div class='add'>+</div><div class='add'>+#bug-1104642 - sync server quorum options when a node is brought up</div><div class='add'>+#set the volume all options from the 1st glusterd</div><div class='add'>+TEST $CLI_1 volume set all cluster.server-quorum-ratio 80</div><div class='add'>+</div><div class='add'>+# Now quorum is not meet. Add-brick, Remove-brick, volume-set command</div><div class='add'>+#(Command based on syncop framework)should fail</div><div class='add'>+TEST ! $CLI_1 volume add-brick $V0 $H1:$B1/${V0}2</div><div class='add'>+TEST ! $CLI_1 volume remove-brick $V0 $H1:$B1/${V0}0 start</div><div class='add'>+TEST ! $CLI_1 volume set $V0 barrier enable</div><div class='add'>+</div><div class='add'>+#quorum is not met, rebalance/profile start should fail</div><div class='add'>+TEST ! $CLI_1 volume rebalance $V0 start</div><div class='add'>+TEST ! $CLI_1 volume profile $V0 start</div><div class='add'>+</div><div class='add'>+#bug-1690753 - Volume stop when quorum not met is successful</div><div class='add'>+TEST ! $CLI_1 volume stop $V0</div><div class='add'>+</div><div class='add'>+#Bring back the 2nd glusterd</div><div class='add'>+TEST $glusterd_2</div><div class='add'>+</div><div class='add'>+#verify whether the value has been synced</div><div class='add'>+EXPECT_WITHIN $PROBE_TIMEOUT "80" volinfo_field_1 all cluster.server-quorum-ratio</div><div class='add'>+EXPECT_WITHIN $PROBE_TIMEOUT '1' peer_count</div><div class='add'>+EXPECT_WITHIN $PROBE_TIMEOUT "80" volinfo_field_2 all cluster.server-quorum-ratio</div><div class='add'>+</div><div class='add'>+# Now quorum is meet.</div><div class='add'>+# Add-brick, Remove-brick, volume-set command should success</div><div class='add'>+TEST  $CLI_1 volume add-brick $V0 $H2:$B2/${V0}2</div><div class='add'>+TEST  $CLI_1 volume remove-brick $V0 $H2:$B2/${V0}2 start</div><div class='add'>+TEST  $CLI_1 volume set $V0 barrier enable</div><div class='add'>+TEST  $CLI_1 volume remove-brick $V0 $H2:$B2/${V0}2 stop</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" cluster_brick_up_status 1 $V0 $H1 $B1/${V0}0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" cluster_brick_up_status 1 $V0 $H2 $B2/${V0}1</div><div class='add'>+</div><div class='add'>+## Stop the volume</div><div class='add'>+TEST $CLI_1 volume stop $V0</div><div class='add'>+</div><div class='add'>+## Bring down 2nd glusterd</div><div class='add'>+TEST kill_glusterd 2</div><div class='add'>+</div><div class='add'>+## Now quorum is not meet. Starting volume on 1st node should not success</div><div class='add'>+TEST ! $CLI_1 volume start $V0</div><div class='add'>+</div><div class='add'>+## Bring back 2nd glusterd</div><div class='add'>+TEST $glusterd_2</div><div class='add'>+</div><div class='add'>+# After 2nd glusterd come back, there will be 2 nodes in a cluster</div><div class='add'>+EXPECT_WITHIN $PROBE_TIMEOUT 1 peer_count;</div><div class='add'>+</div><div class='add'>+## Now quorum is meet. Starting volume on 1st node should be success.</div><div class='add'>+TEST $CLI_1 volume start $V0</div><div class='add'>+</div><div class='add'>+# Now re-execute the same profile command and this time it should succeed</div><div class='add'>+TEST $CLI_1 volume profile $V0 start</div><div class='add'>+</div><div class='add'>+#bug-1352277</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" cluster_brick_up_status 1 $V0 $H1 $B1/${V0}0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" cluster_brick_up_status 1 $V0 $H2 $B2/${V0}1</div><div class='add'>+</div><div class='add'>+TEST $CLI_1 volume set $V0 cluster.server-quorum-type none</div><div class='add'>+</div><div class='add'>+# Bring down all the gluster processes</div><div class='add'>+TEST killall_gluster</div><div class='add'>+</div><div class='add'>+#bring back 1st glusterd and check whether the brick process comes back</div><div class='add'>+TEST $glusterd_1</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" cluster_brick_up_status 1 $V0 $H1 $B1/${V0}0</div><div class='add'>+</div><div class='add'>+#enabling quorum should bring down the brick</div><div class='add'>+TEST $CLI_1 volume set $V0 cluster.server-quorum-type server</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "0" cluster_brick_up_status 1 $V0 $H1 $B1/${V0}0</div><div class='add'>+</div><div class='add'>+TEST $glusterd_2</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" cluster_brick_up_status 1 $V0 $H1 $B1/${V0}0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" cluster_brick_up_status 1 $V0 $H2 $B2/${V0}1</div><div class='add'>+</div><div class='add'>+#bug-1367478 - brick processes should not be up when quorum is not met</div><div class='add'>+TEST $CLI_1 volume create $V1 $H1:$B1/${V1}1 $H2:$B2/${V1}2</div><div class='add'>+TEST $CLI_1 volume start $V1</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" cluster_brick_up_status 1 $V1 $H1 $B1/${V1}1</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" cluster_brick_up_status 1 $V1 $H2 $B2/${V1}2</div><div class='add'>+</div><div class='add'>+# Restart 2nd glusterd</div><div class='add'>+TEST kill_glusterd 2</div><div class='add'>+TEST $glusterd_2</div><div class='add'>+</div><div class='add'>+# Check if all bricks are up</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" cluster_brick_up_status 1 $V0 $H1 $B1/${V0}0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" cluster_brick_up_status 1 $V0 $H2 $B2/${V0}1</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" cluster_brick_up_status 1 $V1 $H1 $B1/${V1}1</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" cluster_brick_up_status 1 $V1 $H2 $B2/${V1}2</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/bugs/glusterd/rebalance-in-cluster.t b/tests/bugs/glusterd/rebalance-in-cluster.t<br/>new file mode 100644<br/>index 00000000000..469ec6cd48e<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/glusterd/rebalance-in-cluster.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/glusterd/rebalance-in-cluster.t</a></div><div class='hunk'>@@ -0,0 +1,52 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../cluster.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+function rebalance_status_field_1 {</div><div class='add'>+        $CLI_1 volume rebalance $1 status | awk '{print $7}' | sed -n 3p</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+TEST launch_cluster 2;</div><div class='add'>+TEST $CLI_1 peer probe $H2;</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $PROBE_TIMEOUT 1 peer_count</div><div class='add'>+</div><div class='add'>+$CLI_1 volume create $V0 $H1:$B1/$V0  $H2:$B2/$V0</div><div class='add'>+EXPECT 'Created' cluster_volinfo_field 1 $V0 'Status';</div><div class='add'>+</div><div class='add'>+$CLI_1 volume start $V0</div><div class='add'>+EXPECT 'Started' cluster_volinfo_field 1 $V0 'Status';</div><div class='add'>+</div><div class='add'>+#bug-1231437</div><div class='add'>+</div><div class='add'>+#Mount FUSE</div><div class='add'>+TEST glusterfs -s $H1 --volfile-id=$V0 $M0;</div><div class='add'>+</div><div class='add'>+TEST mkdir $M0/dir{1..4};</div><div class='add'>+TEST touch $M0/dir{1..4}/files{1..4};</div><div class='add'>+</div><div class='add'>+TEST $CLI_1 volume add-brick $V0 $H1:$B1/${V0}1 $H2:$B2/${V0}1</div><div class='add'>+</div><div class='add'>+TEST $CLI_1 volume rebalance $V0  start</div><div class='add'>+EXPECT_WITHIN $REBALANCE_TIMEOUT "completed" cluster_rebalance_status_field 1  $V0</div><div class='add'>+</div><div class='add'>+#bug - 1764119 - rebalance status should display detailed info when any of the node is dowm</div><div class='add'>+TEST kill_glusterd 2</div><div class='add'>+EXPECT_WITHIN $REBALANCE_TIMEOUT "completed" rebalance_status_field_1 $V0</div><div class='add'>+</div><div class='add'>+TEST start_glusterd 2</div><div class='add'>+#bug-1245142</div><div class='add'>+</div><div class='add'>+$CLI_1 volume rebalance $V0  start &amp;</div><div class='add'>+#kill glusterd2 after requst sent, so that call back is called</div><div class='add'>+#with rpc-&gt;status fail ,so roughly 1sec delay is introduced to get this scenario.</div><div class='add'>+sleep 1</div><div class='add'>+kill_glusterd 2</div><div class='add'>+#check glusterd commands are working after rebalance start command</div><div class='add'>+EXPECT 'Started' cluster_volinfo_field 1 $V0 'Status';</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='head'>diff --git a/tests/bugs/glusterd/rebalance-operations-in-single-node.t b/tests/bugs/glusterd/rebalance-operations-in-single-node.t<br/>new file mode 100644<br/>index 00000000000..ef85887f440<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/glusterd/rebalance-operations-in-single-node.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/glusterd/rebalance-operations-in-single-node.t</a></div><div class='hunk'>@@ -0,0 +1,131 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../cluster.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+function get_rebalanced_info()</div><div class='add'>+{</div><div class='add'>+        local rebal_info_key=$2</div><div class='add'>+        $CLI  volume rebalance $1 status | awk '{print $'$rebal_info_key'}' |sed -n 3p| sed 's/ *$//g'</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+volname="StartMigrationDuringRebalanceTest"</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd;</div><div class='add'>+</div><div class='add'>+TEST $CLI volume info;</div><div class='add'>+TEST $CLI volume create $volname $H0:$B0/${volname}{1..4};</div><div class='add'>+TEST $CLI volume start $volname;</div><div class='add'>+</div><div class='add'>+#bug-1046308 - validate rebalance on a specified volume name</div><div class='add'>+TEST $CLI volume rebalance $volname start;</div><div class='add'>+</div><div class='add'>+#bug-1089668 - validation of rebalance status and remove brick status</div><div class='add'>+#bug-963541 - after remove brick start rebalance/remove brick start without commiting should fail</div><div class='add'>+</div><div class='add'>+TEST ! $CLI volume remove-brick $volname $H0:$B0/${volname}1 status</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $REBALANCE_TIMEOUT "completed" rebalance_status_field $volname</div><div class='add'>+</div><div class='add'>+TEST $CLI volume remove-brick $volname $H0:$B0/${volname}1 start</div><div class='add'>+TEST ! $CLI volume rebalance $volname start</div><div class='add'>+TEST ! $CLI volume rebalance $volname status</div><div class='add'>+TEST ! $CLI volume remove-brick $volname $H0:$B0/${volname}2 start</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $REBALANCE_TIMEOUT "completed" remove_brick_status_completed_field \</div><div class='add'>+"$volname" "$H0:$B0/${volname}1"</div><div class='add'>+TEST $CLI volume remove-brick $volname $H0:$B0/${volname}1 commit</div><div class='add'>+</div><div class='add'>+TEST $CLI volume rebalance $volname start</div><div class='add'>+EXPECT_WITHIN $REBALANCE_TIMEOUT "completed" rebalance_status_field $volname</div><div class='add'>+TEST $CLI volume rebalance $volname stop</div><div class='add'>+</div><div class='add'>+TEST $CLI volume remove-brick $volname $H0:$B0/${volname}2 start</div><div class='add'>+TEST $CLI volume remove-brick $volname $H0:$B0/${volname}2 stop</div><div class='add'>+</div><div class='add'>+#bug-1351021-rebalance-info-post-glusterd-restart</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/${V0}{1..3};</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+</div><div class='add'>+#Mount volume and create data</div><div class='add'>+TEST glusterfs -s $H0 --volfile-id $V0 $M0;</div><div class='add'>+TEST mkdir $M0/dir{1..10}</div><div class='add'>+TEST touch $M0/dir{1..10}/file{1..10}</div><div class='add'>+</div><div class='add'>+# Add-brick and start rebalance</div><div class='add'>+TEST $CLI volume add-brick $V0 $H0:$B0/${V0}4</div><div class='add'>+TEST $CLI volume rebalance $V0 start</div><div class='add'>+EXPECT_WITHIN $REBALANCE_TIMEOUT "completed" rebalance_status_field $V0</div><div class='add'>+</div><div class='add'>+#Rebalance info before glusterd restart</div><div class='add'>+OLD_REBAL_FILES=$(get_rebalanced_info $V0 2)</div><div class='add'>+OLD_SIZE=$(get_rebalanced_info $V0 3)</div><div class='add'>+OLD_SCANNED=$(get_rebalanced_info $V0 4)</div><div class='add'>+OLD_FAILURES=$(get_rebalanced_info $V0 5)</div><div class='add'>+OLD_SKIPPED=$(get_rebalanced_info $V0 6)</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+pkill glusterd;</div><div class='add'>+pkill glusterfsd;</div><div class='add'>+TEST glusterd</div><div class='add'>+</div><div class='add'>+#Rebalance info after glusterd restart</div><div class='add'>+NEW_REBAL_FILES=$(get_rebalanced_info $V0 2)</div><div class='add'>+NEW_SIZE=$(get_rebalanced_info $V0 3)</div><div class='add'>+NEW_SCANNED=$(get_rebalanced_info $V0 4)</div><div class='add'>+NEW_FAILURES=$(get_rebalanced_info $V0 5)</div><div class='add'>+NEW_SKIPPED=$(get_rebalanced_info $V0 6)</div><div class='add'>+#Check rebalance info before and after glusterd restart</div><div class='add'>+TEST [ $OLD_REBAL_FILES == $NEW_REBAL_FILES ]</div><div class='add'>+TEST [ $OLD_SIZE == $NEW_SIZE ]</div><div class='add'>+TEST [ $OLD_SCANNED == $NEW_SCANNED ]</div><div class='add'>+TEST [ $OLD_FAILURES == $NEW_FAILURES ]</div><div class='add'>+TEST [ $OLD_SKIPPED == $NEW_SKIPPED ]</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+</div><div class='add'>+#bug-1004744 - validation of rebalance fix layout</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+TEST glusterfs -s $H0 --volfile-id $V0 $M0;</div><div class='add'>+</div><div class='add'>+for i in `seq 11 20`;</div><div class='add'>+do</div><div class='add'>+       mkdir $M0/dir_$i</div><div class='add'>+       echo file&gt;$M0/dir_$i/file_$i</div><div class='add'>+       for j in `seq 1 100`;</div><div class='add'>+       do</div><div class='add'>+                mkdir $M0/dir_$i/dir_$j</div><div class='add'>+                echo file&gt;$M0/dir_$i/dir_$j/file_$j</div><div class='add'>+       done</div><div class='add'>+done</div><div class='add'>+</div><div class='add'>+#add 2 bricks</div><div class='add'>+TEST $CLI volume add-brick $V0 $H0:$B0/${V0}{5,6};</div><div class='add'>+</div><div class='add'>+#perform rebalance fix-layout</div><div class='add'>+TEST $CLI volume rebalance $V0 fix-layout start</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $REBALANCE_TIMEOUT "fix-layout completed" fix-layout_status_field $V0;</div><div class='add'>+</div><div class='add'>+#bug-1075087 - rebalance post add brick</div><div class='add'>+TEST mkdir $M0/dir{21..30};</div><div class='add'>+TEST touch $M0/dir{21..30}/files{1..10};</div><div class='add'>+</div><div class='add'>+TEST $CLI volume add-brick $V0 $H0:$B0/${V0}{7,8}</div><div class='add'>+</div><div class='add'>+TEST $CLI volume rebalance $V0 start force</div><div class='add'>+EXPECT_WITHIN 180 "completed" rebalance_status_field $V0</div><div class='add'>+</div><div class='add'>+TEST pkill gluster</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+</div><div class='add'>+# status should be "completed" immediate after glusterd has respawned.</div><div class='add'>+EXPECT_WITHIN 20 "completed" rebalance_status_field $V0</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/bugs/glusterd/remove-brick-in-cluster.t b/tests/bugs/glusterd/remove-brick-in-cluster.t<br/>new file mode 100644<br/>index 00000000000..de94220a906<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/glusterd/remove-brick-in-cluster.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/glusterd/remove-brick-in-cluster.t</a></div><div class='hunk'>@@ -0,0 +1,60 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../cluster.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST launch_cluster 2;</div><div class='add'>+</div><div class='add'>+#bug-1047955 - remove brick from new peer in cluster</div><div class='add'>+TEST $CLI_1 volume create $V0 replica 2 $H1:$B1/${V0}{1,2,3,4}</div><div class='add'>+TEST $CLI_1 volume start $V0;</div><div class='add'>+</div><div class='add'>+TEST $CLI_1 peer probe $H2;</div><div class='add'>+EXPECT_WITHIN $PROBE_TIMEOUT 1 peer_count</div><div class='add'>+</div><div class='add'>+TEST $CLI_2 volume remove-brick $V0 $H1:$B1/${V0}{3,4} start;</div><div class='add'>+TEST $CLI_2 volume info</div><div class='add'>+</div><div class='add'>+#bug-964059 - volume status post remove brick start</div><div class='add'>+TEST $CLI_1 volume create $V1 $H1:$B1/${V1}0 $H2:$B2/${V1}1</div><div class='add'>+TEST $CLI_1 volume start $V1</div><div class='add'>+TEST $CLI_1 volume remove-brick $V1 $H2:$B2/${V1}1 start</div><div class='add'>+TEST $CLI_1 volume status</div><div class='add'>+</div><div class='add'>+TEST $CLI_1 volume stop $V0</div><div class='add'>+TEST $CLI_1 volume delete $V0</div><div class='add'>+</div><div class='add'>+#bug-1230121 - decrease replica count by remove-brick and increse by add-brick</div><div class='add'>+## Creating a 2x3 replicate volume</div><div class='add'>+TEST $CLI_1 volume create $V0 replica 3 $H1:$B1/brick1 $H2:$B2/brick2 \</div><div class='add'>+                                        $H1:$B1/brick3 $H2:$B2/brick4 \</div><div class='add'>+                                        $H1:$B1/brick5 $H2:$B2/brick6</div><div class='add'>+</div><div class='add'>+## Start the volume</div><div class='add'>+TEST $CLI_1 volume start $V0</div><div class='add'>+</div><div class='add'>+## Shrinking volume replica 2x3 to 2x2 by performing remove-brick operation.</div><div class='add'>+TEST $CLI_1 volume remove-brick $V0 replica 2 $H1:$B1/brick1 $H2:$B2/brick6 force</div><div class='add'>+</div><div class='add'>+## Shrinking volume replica 2x2 to 1x2 by performing remove-brick operation</div><div class='add'>+TEST $CLI_1 volume remove-brick $V0 replica 2 $H1:$B1/brick3 $H2:$B2/brick2 force</div><div class='add'>+</div><div class='add'>+## Shrinking volume replica from 1x2 to 1x1 by performing remove-brick operation</div><div class='add'>+TEST $CLI_1 volume remove-brick $V0 replica 1 $H1:$B1/brick5 force</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+### Expanding volume replica by performing add-brick operation.</div><div class='add'>+</div><div class='add'>+## Expend volume replica from 1x1 to 1x2 by performing add-brick operation</div><div class='add'>+TEST $CLI_1 volume add-brick $V0 replica 2 $H1:$B1/brick5 force</div><div class='add'>+</div><div class='add'>+## Expend volume replica from 1x2 to 2x2 by performing add-brick operation</div><div class='add'>+TEST $CLI_1 volume add-brick $V0 replica 2 $H1:$B1/brick3 $H2:$B2/brick2 force</div><div class='add'>+</div><div class='add'>+## Expend volume replica from 2x2 to 2x3 by performing add-brick operation</div><div class='add'>+TEST $CLI_1 volume add-brick $V0 replica 3 $H1:$B1/brick1 $H2:$B2/brick6 force</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='add'>+</div><div class='head'>diff --git a/tests/bugs/glusterd/remove-brick-testcases.t b/tests/bugs/glusterd/remove-brick-testcases.t<br/>new file mode 100644<br/>index 00000000000..2f982d5266f<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/glusterd/remove-brick-testcases.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/glusterd/remove-brick-testcases.t</a></div><div class='hunk'>@@ -0,0 +1,119 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+. $(dirname $0)/../../cluster.rc</div><div class='add'>+</div><div class='add'>+function check_peers {</div><div class='add'>+        $CLI_1 peer status | grep 'Peer in Cluster (Connected)' | wc -l</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function brick_count()</div><div class='add'>+{</div><div class='add'>+    local vol=$1;</div><div class='add'>+</div><div class='add'>+    $CLI volume info $vol | egrep "^Brick[0-9]+: " | wc -l;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/${V0}{1..5}</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+#bug-1225716 - remove-brick on a brick which is down should fail</div><div class='add'>+#kill a brick process</div><div class='add'>+kill_brick $V0 $H0 $B0/${V0}1</div><div class='add'>+EXPECT_WITHIN $PROCESS_DOWN_TIMEOUT "0" brick_up_status $V0 $H0 $B0/${V0}1</div><div class='add'>+</div><div class='add'>+#remove-brick start should fail as the brick is down</div><div class='add'>+TEST ! $CLI volume remove-brick $V0 $H0:$B0/${V0}1 start</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status $V0 $H0 $B0/${V0}1</div><div class='add'>+</div><div class='add'>+#remove-brick start should succeed as the brick is up</div><div class='add'>+TEST $CLI volume remove-brick $V0 $H0:$B0/${V0}1 start</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $REBALANCE_TIMEOUT "completed" remove_brick_status_completed_field "$V0 $H0:$B0/${V0}1"</div><div class='add'>+</div><div class='add'>+#kill a brick process</div><div class='add'>+kill_brick $V0 $H0 $B0/${V0}1</div><div class='add'>+</div><div class='add'>+#remove-brick commit should pass even if the brick is down</div><div class='add'>+TEST $CLI volume remove-brick $V0 $H0:$B0/${V0}1 commit</div><div class='add'>+</div><div class='add'>+#bug-1121584 - brick-existing-validation-for-remove-brick-status-stop</div><div class='add'>+## Start remove-brick operation on the volume</div><div class='add'>+TEST $CLI volume remove-brick $V0 $H0:$B0/${V0}2 start</div><div class='add'>+</div><div class='add'>+## By giving non existing brick for remove-brick status/stop command should</div><div class='add'>+## give error.</div><div class='add'>+TEST ! $CLI volume remove-brick $V0 $H0:$B0/ABCD status</div><div class='add'>+TEST ! $CLI volume remove-brick $V0 $H0:$B0/ABCD stop</div><div class='add'>+</div><div class='add'>+## By giving brick which is part of volume for remove-brick status/stop command</div><div class='add'>+## should print statistics of remove-brick operation or stop remove-brick</div><div class='add'>+## operation.</div><div class='add'>+TEST $CLI volume remove-brick $V0 $H0:$B0/${V0}2 status</div><div class='add'>+TEST $CLI volume remove-brick $V0 $H0:$B0/${V0}2 stop</div><div class='add'>+</div><div class='add'>+#bug-878004 - validate remove brick force</div><div class='add'>+TEST $CLI volume remove-brick $V0 $H0:$B0/${V0}2 force;</div><div class='add'>+EXPECT '3' brick_count $V0</div><div class='add'>+</div><div class='add'>+TEST $CLI volume remove-brick $V0 $H0:$B0/${V0}3 force;</div><div class='add'>+EXPECT '2' brick_count $V0</div><div class='add'>+</div><div class='add'>+#bug-1027171 - Do not allow commit if the bricks are not decommissioned</div><div class='add'>+#Remove bricks and commit without starting</div><div class='add'>+function remove_brick_commit_status {</div><div class='add'>+        $CLI volume remove-brick $V0 \</div><div class='add'>+        $H0:$B0/${V0}4 commit 2&gt;&amp;1 |grep -oE "success|decommissioned"</div><div class='add'>+}</div><div class='add'>+EXPECT "decommissioned"  remove_brick_commit_status;</div><div class='add'>+</div><div class='add'>+TEST $CLI volume stop $V0</div><div class='add'>+TEST $CLI volume delete $V0;</div><div class='add'>+</div><div class='add'>+#Create a 2X3 distributed-replicate volume</div><div class='add'>+TEST $CLI volume create $V0 replica 3 $H0:$B0/${V0}{1..6};</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+#Try to reduce replica count with start option</div><div class='add'>+function remove_brick_start_status {</div><div class='add'>+        $CLI volume remove-brick $V0 replica 2 \</div><div class='add'>+        $H0:$B0/${V0}3  $H0:$B0/${V0}6 start 2&gt;&amp;1 |grep -oE "success|failed"</div><div class='add'>+}</div><div class='add'>+EXPECT "failed"  remove_brick_start_status;</div><div class='add'>+</div><div class='add'>+#Remove bricks with commit option</div><div class='add'>+function remove_brick_commit_status2 {</div><div class='add'>+        $CLI volume remove-brick $V0 replica 2 \</div><div class='add'>+        $H0:$B0/${V0}3  $H0:$B0/${V0}6 commit 2&gt;&amp;1  |</div><div class='add'>+        grep -oE "success|decommissioned"</div><div class='add'>+}</div><div class='add'>+EXPECT "decommissioned"  remove_brick_commit_status2;</div><div class='add'>+TEST $CLI volume info $V0</div><div class='add'>+</div><div class='add'>+#bug-1040408 - reduce replica count of distributed replicate volume</div><div class='add'>+</div><div class='add'>+# Reduce to 2x2 volume by specifying bricks in reverse order</div><div class='add'>+function remove_brick_status {</div><div class='add'>+        $CLI volume remove-brick $V0 replica 2 \</div><div class='add'>+        $H0:$B0/${V0}6  $H0:$B0/${V0}3 force 2&gt;&amp;1 |grep -oE "success|failed"</div><div class='add'>+}</div><div class='add'>+EXPECT "success"  remove_brick_status;</div><div class='add'>+TEST $CLI volume info $V0</div><div class='add'>+</div><div class='add'>+#bug-1120647 - remove brick validation</div><div class='add'>+</div><div class='add'>+TEST $CLI volume remove-brick $V0 $H0:$B0/${V0}{4..5} start</div><div class='add'>+EXPECT_WITHIN 10 "completed" remove_brick_status_completed_field  "$V0 $H0:$B0/${V0}5"</div><div class='add'>+EXPECT_WITHIN 10 "completed" remove_brick_status_completed_field  "$V0 $H0:$B0/${V0}4"</div><div class='add'>+TEST $CLI volume remove-brick $V0 $H0:$B0/${V0}{4..5} commit</div><div class='add'>+TEST $CLI volume remove-brick $V0 replica 1 $H0:$B0/${V0}2 force</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/bugs/glusterd/remove-brick-validation.t b/tests/bugs/glusterd/remove-brick-validation.t<br/>new file mode 100644<br/>index 00000000000..a0ff4ff6a24<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/glusterd/remove-brick-validation.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/glusterd/remove-brick-validation.t</a></div><div class='hunk'>@@ -0,0 +1,68 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+. $(dirname $0)/../../cluster.rc</div><div class='add'>+</div><div class='add'>+function peer_count {</div><div class='add'>+eval \$CLI_$1 peer status | grep 'Peer in Cluster (Connected)' | wc -l</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+## start a 3 node virtual cluster</div><div class='add'>+TEST launch_cluster 3;</div><div class='add'>+</div><div class='add'>+## peer probe server 2 from server 1 cli</div><div class='add'>+TEST $CLI_1 peer probe $H2;</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $PROBE_TIMEOUT 1 peer_count 1</div><div class='add'>+</div><div class='add'>+#testcase: bug-1245045-remove-brick-validation</div><div class='add'>+</div><div class='add'>+TEST $CLI_1 peer probe $H3;</div><div class='add'>+EXPECT_WITHIN $PROBE_TIMEOUT 2 peer_count 1</div><div class='add'>+</div><div class='add'>+TEST $CLI_1 volume create $V0 $H1:$B1/$V0 $H2:$B2/$V0</div><div class='add'>+TEST $CLI_1 volume start $V0</div><div class='add'>+</div><div class='add'>+kill_glusterd 2</div><div class='add'>+</div><div class='add'>+#remove-brick should fail as the peer hosting the brick is down</div><div class='add'>+TEST ! $CLI_1 volume remove-brick $V0 $H2:$B2/${V0} start</div><div class='add'>+</div><div class='add'>+TEST $glusterd_2</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" cluster_brick_up_status 1 $V0 $H2 $B2/${V0}</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $PROBE_TIMEOUT 2 peer_count 1</div><div class='add'>+</div><div class='add'>+#volume status should work</div><div class='add'>+TEST $CLI_2 volume status</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $PROBE_TIMEOUT 2 peer_count 3</div><div class='add'>+TEST $CLI_1 volume remove-brick $V0 $H2:$B2/${V0} start</div><div class='add'>+kill_glusterd 2</div><div class='add'>+</div><div class='add'>+#remove-brick commit should fail as the peer hosting the brick is down</div><div class='add'>+TEST ! $CLI_1 volume remove-brick $V0 $H2:$B2/${V0} commit</div><div class='add'>+</div><div class='add'>+TEST $glusterd_2</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" cluster_brick_up_status 1 $V0 $H2 $B2/${V0}</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $PROBE_TIMEOUT 2 peer_count 1</div><div class='add'>+</div><div class='add'>+#volume status should work</div><div class='add'>+TEST $CLI_2 volume status</div><div class='add'>+</div><div class='add'>+TEST $CLI_1 volume remove-brick $V0 $H2:$B2/${V0} stop</div><div class='add'>+</div><div class='add'>+kill_glusterd 3</div><div class='add'>+EXPECT_WITHIN $PROBE_TIMEOUT 1 peer_count 1</div><div class='add'>+</div><div class='add'>+TEST $CLI_1 volume remove-brick $V0 $H2:$B2/${V0} start</div><div class='add'>+</div><div class='add'>+TEST start_glusterd 3</div><div class='add'>+EXPECT_WITHIN $PROBE_TIMEOUT 2 peer_count 1</div><div class='add'>+TEST $CLI_3 volume status</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/bugs/glusterd/removing-multiple-bricks-in-single-remove-brick-command.t b/tests/bugs/glusterd/removing-multiple-bricks-in-single-remove-brick-command.t<br/>new file mode 100644<br/>index 00000000000..00beab59137<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/glusterd/removing-multiple-bricks-in-single-remove-brick-command.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/glusterd/removing-multiple-bricks-in-single-remove-brick-command.t</a></div><div class='hunk'>@@ -0,0 +1,80 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+#Basic checks</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume info</div><div class='add'>+</div><div class='add'>+#Create a 3X2 distributed-replicate volume</div><div class='add'>+TEST $CLI volume create $V0 replica 2 $H0:$B0/${V0}{1..6};</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+#bug-974007 - remove multiple replica pairs in a single brick command</div><div class='add'>+# Mount FUSE and create files</div><div class='add'>+TEST glusterfs -s $H0 --volfile-id $V0 $M0</div><div class='add'>+TEST touch $M0/file{1..10}</div><div class='add'>+</div><div class='add'>+# Remove bricks from two sub-volumes to make it a 1x2 vol.</div><div class='add'>+# Bricks in question are given in a random order but from the same subvols.</div><div class='add'>+function remove_brick_start_status {</div><div class='add'>+        $CLI volume remove-brick $V0 \</div><div class='add'>+        $H0:$B0/${V0}6  $H0:$B0/${V0}1 \</div><div class='add'>+        $H0:$B0/${V0}2  $H0:$B0/${V0}5 start 2&gt;&amp;1 |grep -oE "success|failed"</div><div class='add'>+}</div><div class='add'>+EXPECT "success"  remove_brick_start_status;</div><div class='add'>+</div><div class='add'>+# Wait for rebalance to complete</div><div class='add'>+EXPECT_WITHIN $REBALANCE_TIMEOUT "completed" remove_brick_status_completed_field "$V0" "$H0:$B0/${V0}6 $H0:$B0/${V0}1 $H0:$B0/${V0}2 $H0:$B0/${V0}5"</div><div class='add'>+</div><div class='add'>+# Check commit status</div><div class='add'>+function remove_brick_commit_status {</div><div class='add'>+        $CLI volume remove-brick $V0 \</div><div class='add'>+         $H0:$B0/${V0}6  $H0:$B0/${V0}1 \</div><div class='add'>+         $H0:$B0/${V0}2  $H0:$B0/${V0}5 commit 2&gt;&amp;1 |grep -oE "success|failed"</div><div class='add'>+}</div><div class='add'>+EXPECT "success" remove_brick_commit_status;</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+# Check the volume type</div><div class='add'>+EXPECT "Replicate" echo `$CLI volume info |grep Type |awk '{print $2}'`</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+</div><div class='add'>+#bug-961669 - remove brick start should fail when reducing the replica count</div><div class='add'>+</div><div class='add'>+#Create a 3x3 dist-rep volume</div><div class='add'>+TEST $CLI volume create $V1 replica 3 $H0:$B0/${V1}{0,1,2,3,4,5,6,7,8};</div><div class='add'>+TEST $CLI volume start $V1</div><div class='add'>+EXPECT_WITHIN ${PROCESS_UP_TIMEOUT} "9" brick_count ${V1}</div><div class='add'>+</div><div class='add'>+# Mount FUSE and create file/directory</div><div class='add'>+TEST glusterfs -s $H0 --volfile-id $V1 $M0</div><div class='add'>+TEST touch $M0/zerobytefile.txt</div><div class='add'>+TEST mkdir $M0/test_dir</div><div class='add'>+TEST dd if=/dev/zero of=$M0/file bs=1024 count=1024</div><div class='add'>+</div><div class='add'>+function remove_brick_start {</div><div class='add'>+        $CLI volume remove-brick $V1 replica 2 $H0:$B0/${V1}{1,4,7} start 2&gt;&amp;1|grep -oE 'success|failed'</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function remove_brick {</div><div class='add'>+        $CLI volume remove-brick $V1 replica 2 $H0:$B0/${V1}{1,4,7} force 2&gt;&amp;1|grep -oE 'success|failed'</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#remove-brick start variant</div><div class='add'>+#Actual message displayed at cli is:</div><div class='add'>+#"volume remove-brick start: failed: Rebalancing not needed when reducing replica count. Try without the 'start' option"</div><div class='add'>+EXPECT "failed" remove_brick_start;</div><div class='add'>+</div><div class='add'>+#remove-brick commit-force</div><div class='add'>+#Actual message displayed at cli is:</div><div class='add'>+#"volume remove-brick commit force: success"</div><div class='add'>+EXPECT "success" remove_brick</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/glusterd/replace-brick-operations.t b/tests/bugs/glusterd/replace-brick-operations.t<br/>new file mode 100644<br/>index 00000000000..044aa3d6c6d<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/glusterd/replace-brick-operations.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/glusterd/replace-brick-operations.t</a></div><div class='hunk'>@@ -0,0 +1,48 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+## Test case for BZ: 1094119  Remove replace-brick support from gluster</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+# Start glusterd</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+</div><div class='add'>+## Lets create and start volume</div><div class='add'>+TEST $CLI volume create $V0 replica 2 $H0:$B0/${V0}{1,2}</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+#bug-1094119-remove-replace-brick-support-from-glusterd</div><div class='add'>+</div><div class='add'>+## Now with this patch replace-brick only accept following commad</div><div class='add'>+## volume replace-brick &lt;VOLNAME&gt; &lt;SOURCE-BRICK&gt; &lt;NEW-BRICK&gt; {commit force}</div><div class='add'>+## Apart form this replace brick command will failed.</div><div class='add'>+</div><div class='add'>+TEST ! $CLI volume replace-brick $V0 $H0:$B0/${V0}2 $H0:$B0/${V0}3 start</div><div class='add'>+TEST ! $CLI volume replace-brick $V0 $H0:$B0/${V0}2 $H0:$B0/${V0}3 status</div><div class='add'>+TEST ! $CLI volume replace-brick $V0 $H0:$B0/${V0}2 $H0:$B0/${V0}3 abort</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+## replace-brick commit force command should success</div><div class='add'>+TEST $CLI volume replace-brick $V0 $H0:$B0/${V0}2 $H0:$B0/${V0}3 commit force</div><div class='add'>+</div><div class='add'>+#bug-1242543-replace-brick validation</div><div class='add'>+</div><div class='add'>+TEST glusterfs --volfile-id=$V0 --volfile-server=$H0 $M0;</div><div class='add'>+</div><div class='add'>+# Replace brick1 without killing</div><div class='add'>+TEST $CLI volume replace-brick $V0 $H0:$B0/${V0}1 $H0:$B0/${V0}1_new commit force</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 1</div><div class='add'>+</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}1_new</div><div class='add'>+</div><div class='add'>+# Replace brick1 after killing the brick</div><div class='add'>+TEST $CLI volume replace-brick $V0 $H0:$B0/${V0}1_new $H0:$B0/${V0}1_newer commit force</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 1</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/glusterd/reset-brick-and-daemons-follow-quorum.t b/tests/bugs/glusterd/reset-brick-and-daemons-follow-quorum.t<br/>new file mode 100644<br/>index 00000000000..e6e65c48456<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/glusterd/reset-brick-and-daemons-follow-quorum.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/glusterd/reset-brick-and-daemons-follow-quorum.t</a></div><div class='hunk'>@@ -0,0 +1,63 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+. $(dirname $0)/../../cluster.rc</div><div class='add'>+</div><div class='add'>+function shd_up_status_1 {</div><div class='add'>+        $CLI_1 volume status | grep "localhost" | grep "Self-heal Daemon" | awk '{print $7}'</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function shd_up_status_2 {</div><div class='add'>+        $CLI_2 volume status | grep "localhost" | grep "Self-heal Daemon" | awk '{print $7}'</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function get_shd_pid_2 {</div><div class='add'>+        $CLI_2 volume status | grep "localhost" | grep "Self-heal Daemon" | awk '{print $8}'</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+function check_peers {</div><div class='add'>+        $CLI_1 peer status | grep 'Peer in Cluster (Connected)' | wc -l</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+TEST launch_cluster 3</div><div class='add'>+TEST $CLI_1 peer probe $H2;</div><div class='add'>+EXPECT_WITHIN $PROBE_TIMEOUT 1 check_peers</div><div class='add'>+</div><div class='add'>+TEST $CLI_1 volume create $V0 replica 2 $H1:$B0/${V0} $H2:$B0/${V0}</div><div class='add'>+TEST $CLI_1 volume start $V0</div><div class='add'>+</div><div class='add'>+#testcase: bug-1507466 - validate reset-brick commit force</div><div class='add'>+# Negative case with brick not killed &amp;&amp; volume-id xattrs present</div><div class='add'>+TEST ! $CLI_1 volume reset-brick $V0 $H1:$B0/${V0} $H1:$B0/${V0} commit force</div><div class='add'>+</div><div class='add'>+TEST $CLI_1 volume reset-brick $V0 $H1:$B0/${V0} start</div><div class='add'>+# Now test if reset-brick commit force works</div><div class='add'>+TEST $CLI_1 volume reset-brick $V0 $H1:$B0/${V0} $H1:$B0/${V0} commit force</div><div class='add'>+</div><div class='add'>+#testcase: bug-1383893 - shd should not come up after restarting the peer glusterd</div><div class='add'>+</div><div class='add'>+TEST $CLI_1 peer probe $H3;</div><div class='add'>+EXPECT_WITHIN $PROBE_TIMEOUT 2  peer_count</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" cluster_brick_up_status 1 $V0 $H1 $B0/${V0}</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" cluster_brick_up_status 1 $V0 $H2 $B0/${V0}</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "Y" shd_up_status_1</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "Y" shd_up_status_2</div><div class='add'>+</div><div class='add'>+# Bring down shd on 2nd node</div><div class='add'>+kill -15 $(get_shd_pid_2)</div><div class='add'>+</div><div class='add'>+# Bring down glusterd on 1st node</div><div class='add'>+TEST kill_glusterd 1</div><div class='add'>+</div><div class='add'>+#Bring back 1st glusterd</div><div class='add'>+TEST $glusterd_1</div><div class='add'>+</div><div class='add'>+# We need to wait till PROCESS_UP_TIMEOUT and then check shd service started</div><div class='add'>+#on node 2, because once glusterd regains quorum, it will restart all volume</div><div class='add'>+#level daemons</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "Y" shd_up_status_2</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/glusterd/serialize-shd-manager-glusterd-restart.t b/tests/bugs/glusterd/serialize-shd-manager-glusterd-restart.t<br/>new file mode 100644<br/>index 00000000000..a871e112d87<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/glusterd/serialize-shd-manager-glusterd-restart.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/glusterd/serialize-shd-manager-glusterd-restart.t</a></div><div class='hunk'>@@ -0,0 +1,54 @@</div><div class='add'>+#! /bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../cluster.rc</div><div class='add'>+</div><div class='add'>+function check_peers {</div><div class='add'>+count=`$CLI_3 peer status | grep 'Peer in Cluster (Connected)' | wc -l`</div><div class='add'>+echo $count</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function check_shd {</div><div class='add'>+ps aux | grep $1 | grep glustershd | wc -l</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+TEST launch_cluster 6</div><div class='add'>+</div><div class='add'>+TESTS_EXPECTED_IN_LOOP=25</div><div class='add'>+for i in $(seq 2 6); do</div><div class='add'>+    hostname="H$i"</div><div class='add'>+    TEST $CLI_1 peer probe ${!hostname}</div><div class='add'>+done</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $PROBE_TIMEOUT 5 check_peers;</div><div class='add'>+for i in $(seq 1 5); do</div><div class='add'>+</div><div class='add'>+    TEST $CLI_1 volume create ${V0}_$i replica 3 $H1:$B1/${V0}_$i $H2:$B2/${V0}_$i $H3:$B3/${V0}_$i $H4:$B4/${V0}_$i $H5:$B5/${V0}_$i $H6:$B6/${V0}_$i</div><div class='add'>+    TEST $CLI_1 volume start ${V0}_$i force</div><div class='add'>+</div><div class='add'>+done</div><div class='add'>+</div><div class='add'>+#kill a node</div><div class='add'>+TEST kill_node 3</div><div class='add'>+</div><div class='add'>+TEST $glusterd_3;</div><div class='add'>+EXPECT_WITHIN $PROBE_TIMEOUT 5 check_peers</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT 1 check_shd $H3</div><div class='add'>+</div><div class='add'>+for i in $(seq 1 5); do</div><div class='add'>+</div><div class='add'>+    TEST $CLI_1 volume stop ${V0}_$i</div><div class='add'>+    TEST $CLI_1 volume delete ${V0}_$i</div><div class='add'>+</div><div class='add'>+done</div><div class='add'>+</div><div class='add'>+for i in $(seq 1 6); do</div><div class='add'>+    hostname="H$i"</div><div class='add'>+    EXPECT_WITHIN $PROCESS_DOWN_TIMEOUT 0 check_shd ${!hostname}</div><div class='add'>+done</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/bugs/glusterd/snapshot-operations.t b/tests/bugs/glusterd/snapshot-operations.t<br/>new file mode 100644<br/>index 00000000000..4705577d741<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/glusterd/snapshot-operations.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/glusterd/snapshot-operations.t</a></div><div class='hunk'>@@ -0,0 +1,50 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../cluster.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+. $(dirname $0)/../../snapshot.rc</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST verify_lvm_version</div><div class='add'>+TEST launch_cluster 3;</div><div class='add'>+TEST setup_lvm 3;</div><div class='add'>+</div><div class='add'>+TEST $CLI_1 peer probe $H2;</div><div class='add'>+EXPECT_WITHIN $PROBE_TIMEOUT 1 peer_count</div><div class='add'>+</div><div class='add'>+TEST $CLI_1 volume create $V0 replica 2 $H1:$L1 $H2:$L2</div><div class='add'>+EXPECT 'Created' volinfo_field $V0 'Status'</div><div class='add'>+</div><div class='add'>+TEST $CLI_1 volume start $V0</div><div class='add'>+EXPECT 'Started' volinfo_field $V0 'Status'</div><div class='add'>+</div><div class='add'>+#bug-1318591 - skip-non-directories-inside-vols</div><div class='add'>+</div><div class='add'>+b="B1"</div><div class='add'>+TEST touch ${!b}/glusterd/vols/file</div><div class='add'>+</div><div class='add'>+TEST $CLI_1 snapshot create snap1 $V0 no-timestamp;</div><div class='add'>+</div><div class='add'>+TEST touch ${!b}/glusterd/snaps/snap1/file</div><div class='add'>+</div><div class='add'>+#bug-1322145 - peer hosting snapshotted bricks should not be detachable</div><div class='add'>+</div><div class='add'>+kill_glusterd 2</div><div class='add'>+</div><div class='add'>+TEST $CLI_1 peer probe $H3;</div><div class='add'>+EXPECT_WITHIN $PROBE_TIMEOUT 1 peer_count</div><div class='add'>+</div><div class='add'>+TEST $CLI_1 volume replace-brick $V0 $H2:$L2 $H3:$L3 commit force</div><div class='add'>+</div><div class='add'>+# peer hosting snapshotted bricks should not be detachable</div><div class='add'>+TEST ! $CLI_1 peer detach $H2</div><div class='add'>+</div><div class='add'>+TEST killall_gluster</div><div class='add'>+TEST $glusterd_1</div><div class='add'>+TEST $glusterd_2</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='head'>diff --git a/tests/bugs/glusterd/sync-post-glusterd-restart.t b/tests/bugs/glusterd/sync-post-glusterd-restart.t<br/>new file mode 100644<br/>index 00000000000..de3dff715ab<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/glusterd/sync-post-glusterd-restart.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/glusterd/sync-post-glusterd-restart.t</a></div><div class='hunk'>@@ -0,0 +1,54 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../cluster.rc</div><div class='add'>+</div><div class='add'>+function volume_get_field()</div><div class='add'>+{</div><div class='add'>+     local vol=$1</div><div class='add'>+     local field=$2</div><div class='add'>+     $CLI_2 volume get $vol $field | tail -1 | awk '{print $2}'</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='add'>+</div><div class='add'>+TEST launch_cluster 2;</div><div class='add'>+TEST $CLI_1 peer probe $H2;</div><div class='add'>+EXPECT_WITHIN $PROBE_TIMEOUT 1 peer_count</div><div class='add'>+</div><div class='add'>+TEST $CLI_1 volume create $V0 $H1:$B1/$V0 $H2:$B2/$V0</div><div class='add'>+TEST $CLI_1 volume start $V0</div><div class='add'>+</div><div class='add'>+TEST $CLI_1 volume set $V0 performance.readdir-ahead on</div><div class='add'>+</div><div class='add'>+# Bring down 2nd glusterd</div><div class='add'>+TEST kill_glusterd 2</div><div class='add'>+</div><div class='add'>+##bug-1420637 and bug-1323287 - sync post glusterd restart</div><div class='add'>+</div><div class='add'>+TEST $CLI_1 volume set all cluster.server-quorum-ratio 60</div><div class='add'>+TEST $CLI_1 volume set $V0 performance.readdir-ahead off</div><div class='add'>+TEST $CLI_1 volume set $V0 performance.write-behind off</div><div class='add'>+</div><div class='add'>+# Bring back 2nd glusterd</div><div class='add'>+TEST $glusterd_2</div><div class='add'>+</div><div class='add'>+# After 2nd glusterd come back, there will be 2 nodes in a cluster</div><div class='add'>+EXPECT_WITHIN $PROBE_TIMEOUT 1 peer_count;</div><div class='add'>+</div><div class='add'>+#bug-1420637-volume sync post glusterd restart</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $PROBE_TIMEOUT "60" volinfo_field_2 all cluster.server-quorum-ratio</div><div class='add'>+EXPECT_WITHIN $PROBE_TIMEOUT "off" volinfo_field_2 $V0 performance.readdir-ahead</div><div class='add'>+</div><div class='add'>+#bug-1323287</div><div class='add'>+EXPECT_WITHIN $PROBE_TIMEOUT 'off' volume_get_field $V0 'write-behind'</div><div class='add'>+</div><div class='add'>+#bug-1213295 - volume stop should not crash glusterd post glusterd restart</div><div class='add'>+</div><div class='add'>+TEST $CLI_2 volume stop $V0</div><div class='add'>+EXPECT_WITHIN $PROBE_TIMEOUT 1 peer_count</div><div class='add'>+</div><div class='add'>+TEST $CLI_1 volume create $V1 $H1:$B1/$V1  $H2:$B2/$V1</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/bugs/glusterd/validating-options-for-replicated-volume.t b/tests/bugs/glusterd/validating-options-for-replicated-volume.t<br/>new file mode 100644<br/>index 00000000000..ddc80b17870<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/glusterd/validating-options-for-replicated-volume.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/glusterd/validating-options-for-replicated-volume.t</a></div><div class='hunk'>@@ -0,0 +1,142 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 replica 3 $H0:$B0/${V0}{1,2,3,4,5,6};</div><div class='add'>+</div><div class='add'>+## start volume and verify</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+EXPECT 'Started' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+#bug-1314649 - validate group virt</div><div class='add'>+TEST $CLI volume set $V0 group virt;</div><div class='add'>+</div><div class='add'>+#bug-765230 - remove-quota-related-option-after-disabling-quota</div><div class='add'>+## setting soft-timeout as 20</div><div class='add'>+TEST $CLI volume set $V0 features.soft-timeout 20</div><div class='add'>+EXPECT '20' volinfo_field $V0 'features.soft-timeout';</div><div class='add'>+</div><div class='add'>+## enabling features.quota-deem-statfs</div><div class='add'>+TEST ! $CLI volume set $V0 features.quota-deem-statfs on</div><div class='add'>+EXPECT '' volinfo_field $V0 'features.quota-deem-statfs'</div><div class='add'>+</div><div class='add'>+## enabling quota</div><div class='add'>+TEST $CLI volume quota $V0 enable</div><div class='add'>+EXPECT 'on' volinfo_field $V0 'features.quota'</div><div class='add'>+</div><div class='add'>+## eetting soft-timeout as 20</div><div class='add'>+TEST $CLI volume set $V0 features.soft-timeout 20</div><div class='add'>+EXPECT '20' volinfo_field $V0 'features.soft-timeout';</div><div class='add'>+</div><div class='add'>+## enabling features.quota-deem-statfs</div><div class='add'>+TEST $CLI volume set $V0 features.quota-deem-statfs on</div><div class='add'>+EXPECT 'on' volinfo_field $V0 'features.quota-deem-statfs'</div><div class='add'>+</div><div class='add'>+## disabling quota</div><div class='add'>+TEST $CLI volume quota $V0 disable</div><div class='add'>+EXPECT 'off' volinfo_field $V0 'features.quota'</div><div class='add'>+EXPECT '' volinfo_field $V0 'features.quota-deem-statfs'</div><div class='add'>+EXPECT '' volinfo_field $V0 'features.soft-timeout'</div><div class='add'>+</div><div class='add'>+## setting soft-timeout as 30</div><div class='add'>+TEST $CLI volume set $V0 features.soft-timeout 30</div><div class='add'>+EXPECT '30' volinfo_field $V0 'features.soft-timeout';</div><div class='add'>+</div><div class='add'>+## disabling features.quota-deem-statfs</div><div class='add'>+TEST ! $CLI volume set $V0 features.quota-deem-statfs off</div><div class='add'>+EXPECT '' volinfo_field $V0 'features.quota-deem-statfs'</div><div class='add'>+</div><div class='add'>+TEST ! $CLI volume set $V0 statedump-path ""</div><div class='add'>+TEST ! $CLI volume set $V0 statedump-path "     "</div><div class='add'>+TEST   $CLI volume set $V0 statedump-path "/home/"</div><div class='add'>+EXPECT "/home/" volume_option $V0 server.statedump-path</div><div class='add'>+</div><div class='add'>+TEST ! $CLI volume set $V0 background-self-heal-count ""</div><div class='add'>+TEST ! $CLI volume set $V0 background-self-heal-count "      "</div><div class='add'>+TEST   $CLI volume set $V0 background-self-heal-count 10</div><div class='add'>+EXPECT "10" volume_option $V0 cluster.background-self-heal-count</div><div class='add'>+</div><div class='add'>+TEST ! $CLI volume set $V0 io-cache-size ""</div><div class='add'>+TEST ! $CLI volume set $V0 io-cache-size "    "</div><div class='add'>+TEST   $CLI volume set $V0 io-cache-size 64MB</div><div class='add'>+EXPECT "64MB" volume_option $V0 performance.io-cache-size</div><div class='add'>+</div><div class='add'>+TEST ! $CLI volume set $V0 quick-read-cache-size ""</div><div class='add'>+TEST ! $CLI volume set $V0 quick-read-cache-size "    "</div><div class='add'>+TEST   $CLI volume set $V0 quick-read-cache-size 512MB</div><div class='add'>+EXPECT "512MB" volume_option $V0 performance.quick-read-cache-size</div><div class='add'>+</div><div class='add'>+TEST ! $CLI volume set $V0 self-heal-daemon ""</div><div class='add'>+TEST ! $CLI volume set $V0 self-heal-daemon "    "</div><div class='add'>+TEST   $CLI volume set $V0 self-heal-daemon on</div><div class='add'>+EXPECT "on" volume_option $V0 cluster.self-heal-daemon</div><div class='add'>+</div><div class='add'>+TEST ! $CLI volume set $V0 read-subvolume ""</div><div class='add'>+TEST ! $CLI volume set $V0 read-subvolume "    "</div><div class='add'>+TEST   $CLI volume set $V0 read-subvolume $V0-client-0</div><div class='add'>+EXPECT "$V0-client-0" volume_option  $V0 cluster.read-subvolume</div><div class='add'>+</div><div class='add'>+TEST ! $CLI volume set $V0 data-self-heal-algorithm ""</div><div class='add'>+TEST ! $CLI volume set $V0 data-self-heal-algorithm "     "</div><div class='add'>+TEST ! $CLI volume set $V0 data-self-heal-algorithm on</div><div class='add'>+TEST   $CLI volume set $V0 data-self-heal-algorithm full</div><div class='add'>+EXPECT "full" volume_option $V0 cluster.data-self-heal-algorithm</div><div class='add'>+</div><div class='add'>+TEST ! $CLI volume set $V0 min-free-inodes ""</div><div class='add'>+TEST ! $CLI volume set $V0 min-free-inodes "     "</div><div class='add'>+TEST  $CLI volume set $V0 min-free-inodes 60%</div><div class='add'>+EXPECT "60%" volume_option $V0 cluster.min-free-inodes</div><div class='add'>+</div><div class='add'>+TEST ! $CLI volume set $V0 min-free-disk ""</div><div class='add'>+TEST ! $CLI volume set $V0 min-free-disk "     "</div><div class='add'>+TEST  $CLI volume set $V0 min-free-disk 60%</div><div class='add'>+EXPECT "60%" volume_option $V0 cluster.min-free-disk</div><div class='add'>+</div><div class='add'>+TEST  $CLI volume set $V0 min-free-disk 120</div><div class='add'>+EXPECT "120" volume_option $V0 cluster.min-free-disk</div><div class='add'>+</div><div class='add'>+TEST ! $CLI volume set $V0 frame-timeout ""</div><div class='add'>+TEST ! $CLI volume set $V0 frame-timeout "      "</div><div class='add'>+TEST  $CLI volume set $V0 frame-timeout 0</div><div class='add'>+EXPECT "0" volume_option $V0 network.frame-timeout</div><div class='add'>+</div><div class='add'>+TEST ! $CLI volume set $V0 auth.allow ""</div><div class='add'>+TEST ! $CLI volume set $V0 auth.allow "       "</div><div class='add'>+TEST   $CLI volume set $V0 auth.allow 192.168.122.1</div><div class='add'>+EXPECT "192.168.122.1" volume_option $V0 auth.allow</div><div class='add'>+</div><div class='add'>+#bug-782095 - validate performance cache min/max size value</div><div class='add'>+</div><div class='add'>+## setting performance cache min size as 2MB</div><div class='add'>+TEST $CLI volume set $V0 performance.cache-min-file-size 2MB</div><div class='add'>+EXPECT '2MB' volinfo_field $V0 'performance.cache-min-file-size';</div><div class='add'>+</div><div class='add'>+## setting performance cache max size as 20MB</div><div class='add'>+TEST $CLI volume set $V0 performance.cache-max-file-size 20MB</div><div class='add'>+EXPECT '20MB' volinfo_field $V0 'performance.cache-max-file-size';</div><div class='add'>+</div><div class='add'>+## trying to set performance cache min size as 25MB</div><div class='add'>+TEST ! $CLI volume set $V0 performance.cache-min-file-size 25MB</div><div class='add'>+EXPECT '2MB' volinfo_field $V0 'performance.cache-min-file-size';</div><div class='add'>+</div><div class='add'>+## able to set performance cache min size as long as its lesser than max size</div><div class='add'>+TEST $CLI volume set $V0 performance.cache-min-file-size 15MB</div><div class='add'>+EXPECT '15MB' volinfo_field $V0 'performance.cache-min-file-size';</div><div class='add'>+</div><div class='add'>+## trying it out with only cache-max-file-size in CLI as 10MB</div><div class='add'>+TEST ! $CLI volume set $V0 cache-max-file-size 10MB</div><div class='add'>+EXPECT '20MB' volinfo_field $V0 'performance.cache-max-file-size';</div><div class='add'>+</div><div class='add'>+## finish up</div><div class='add'>+TEST $CLI volume stop $V0;</div><div class='add'>+EXPECT 'Stopped' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+TEST $CLI volume delete $V0;</div><div class='add'>+TEST ! $CLI volume info $V0;</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/bugs/glusterd/validating-server-quorum.t b/tests/bugs/glusterd/validating-server-quorum.t<br/>new file mode 100644<br/>index 00000000000..ae7d83fd81c<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/glusterd/validating-server-quorum.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/glusterd/validating-server-quorum.t</a></div><div class='hunk'>@@ -0,0 +1,125 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+. $(dirname $0)/../../cluster.rc</div><div class='add'>+</div><div class='add'>+function check_fs {</div><div class='add'>+        df $1 &amp;&gt; /dev/null</div><div class='add'>+        echo $?</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function check_peers {</div><div class='add'>+        $CLI_1 peer status | grep 'Peer in Cluster (Connected)' | wc -l</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST launch_cluster 3</div><div class='add'>+</div><div class='add'>+TEST $CLI_1 peer probe $H2;</div><div class='add'>+EXPECT_WITHIN $PROBE_TIMEOUT 1  peer_count</div><div class='add'>+</div><div class='add'>+TEST $CLI_1 peer probe $H3;</div><div class='add'>+EXPECT_WITHIN $PROBE_TIMEOUT 2  peer_count</div><div class='add'>+</div><div class='add'>+# Lets create the volume</div><div class='add'>+TEST $CLI_1 volume create $V0 replica 3 $H1:$B1/${V0}1 $H2:$B2/${V0}2 $H3:$B3/${V0}3</div><div class='add'>+TEST $CLI_1 volume set $V0 cluster.server-quorum-type server</div><div class='add'>+</div><div class='add'>+# Start the volume</div><div class='add'>+TEST $CLI_1 volume start $V0</div><div class='add'>+</div><div class='add'>+#bug-1345727 - bricks should be down when quorum is not met</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" cluster_brick_up_status 1 $V0 $H1 $B1/${V0}1</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" cluster_brick_up_status 1 $V0 $H2 $B2/${V0}2</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" cluster_brick_up_status 1 $V0 $H3 $B3/${V0}3</div><div class='add'>+</div><div class='add'>+# Bring down glusterd on 2nd node</div><div class='add'>+TEST kill_glusterd 2</div><div class='add'>+EXPECT_WITHIN $PROBE_TIMEOUT 1 peer_count</div><div class='add'>+</div><div class='add'>+TEST kill_glusterd 3</div><div class='add'>+EXPECT_WITHIN $PROBE_TIMEOUT 0 peer_count</div><div class='add'>+</div><div class='add'>+# Server quorum is not met. Brick on 1st node must be down</div><div class='add'>+EXPECT_WITHIN $PROCESS_DOWN_TIMEOUT "0" cluster_brick_up_status 1 $V0 $H1 $B1/${V0}1</div><div class='add'>+</div><div class='add'>+# Set quorum ratio 95. means 95 % or more than 95% nodes of total available node</div><div class='add'>+# should be available for performing volume operation.</div><div class='add'>+# i.e. Server-side quorum is met if the number of nodes that are available is</div><div class='add'>+# greater than or equal to 'quorum-ratio' times the number of nodes in the</div><div class='add'>+# cluster</div><div class='add'>+TEST $CLI_1 volume set all cluster.server-quorum-ratio 95</div><div class='add'>+</div><div class='add'>+#bug-1483058 - replace-brick should fail when quorum is not met</div><div class='add'>+TEST ! $CLI_1 volume replace-brick $V0 $H2:$B2/${V0}2 $H1:$B1/${V0}2_new commit force</div><div class='add'>+</div><div class='add'>+#Bring back 2nd glusterd</div><div class='add'>+TEST $glusterd_2</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $PROBE_TIMEOUT 1 peer_count</div><div class='add'>+</div><div class='add'>+# Server quorum is still not met. Bricks should be down on 1st and 2nd nodes</div><div class='add'>+EXPECT_WITHIN $PROCESS_DOWN_TIMEOUT "0" cluster_brick_up_status 1 $V0 $H1 $B1/${V0}1</div><div class='add'>+EXPECT_WITHIN $PROCESS_DOWN_TIMEOUT "0" cluster_brick_up_status 1 $V0 $H2 $B2/${V0}2</div><div class='add'>+</div><div class='add'>+# Bring back 3rd glusterd</div><div class='add'>+TEST $glusterd_3</div><div class='add'>+EXPECT_WITHIN $PROBE_TIMEOUT 2 peer_count</div><div class='add'>+</div><div class='add'>+# Server quorum is met now. Bricks should be up on all nodes</div><div class='add'>+# Check from 3rd instance of glusterd so that the 3rd node finishes all its</div><div class='add'>+# handshake and then report back the brick status</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" cluster_brick_up_status 3 $V0 $H1 $B1/${V0}1</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" cluster_brick_up_status 3 $V0 $H2 $B2/${V0}2</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" cluster_brick_up_status 3 $V0 $H3 $B3/${V0}3</div><div class='add'>+</div><div class='add'>+# Check from 1st instance of glusterd</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" cluster_brick_up_status 3 $V0 $H1 $B1/${V0}1</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" cluster_brick_up_status 3 $V0 $H2 $B2/${V0}2</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" cluster_brick_up_status 3 $V0 $H3 $B3/${V0}3</div><div class='add'>+</div><div class='add'>+# TODO : Because commit fe71ee7 introduced a delay of 1 sec to wait for shd connect and</div><div class='add'>+# disconnect events to be serially processed during a restart of shd daemon,</div><div class='add'>+# this introduced a race where while releasing big lock, if any command sneaks</div><div class='add'>+# and acquires the big lock, it might be able to work on a volinfo which is</div><div class='add'>+# stale. We need to find a better way to fix this.</div><div class='add'>+</div><div class='add'>+sleep 3</div><div class='add'>+</div><div class='add'>+# quorum is met. replace-brick will execute successfully</div><div class='add'>+EXPECT_WITHIN $PEER_SYNC_TIMEOUT 0 attempt_replace_brick 1 $V0 $H2:$B2/${V0}2 $H2:$B2/${V0}2_new</div><div class='add'>+</div><div class='add'>+TEST $CLI_1 volume reset all</div><div class='add'>+TEST $CLI_1 volume set $V0 cluster.server-quorum-type server</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" cluster_brick_up_status 1 $V0 $H1 $B1/${V0}1</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" cluster_brick_up_status 1 $V0 $H2 $B2/${V0}2_new</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" cluster_brick_up_status 1 $V0 $H3 $B3/${V0}3</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+#bug-913555 - volume should become unwritable when quorum does not met</div><div class='add'>+</div><div class='add'>+TEST glusterfs --volfile-server=$H1 --volfile-id=$V0 $M0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT 0 check_fs $M0;</div><div class='add'>+</div><div class='add'>+# Kill one pseudo-node, make sure the others survive and volume stays up.</div><div class='add'>+TEST kill_node 3;</div><div class='add'>+EXPECT_WITHIN $PROBE_TIMEOUT 1 check_peers;</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" cluster_brick_up_status 1 $V0 $H1 $B1/${V0}1</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" cluster_brick_up_status 1 $V0 $H2 $B2/${V0}2_new</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT 0 check_fs $M0;</div><div class='add'>+</div><div class='add'>+# Kill another pseudo-node, make sure the last one dies and volume goes down.</div><div class='add'>+TEST kill_node 2;</div><div class='add'>+EXPECT_WITHIN $PROBE_TIMEOUT 0 check_peers</div><div class='add'>+#two glusterfsds of the other two glusterds must be dead</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "0" cluster_brick_up_status 1 $V0 $H1 $B1/${V0}1</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT 1 check_fs $M0;</div><div class='add'>+</div><div class='add'>+TEST $glusterd_2;</div><div class='add'>+TEST $glusterd_3;</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT 0 check_fs $M0;</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/bugs/glusterfs-server/bug-852147.t b/tests/bugs/glusterfs-server/bug-852147.t<br/>new file mode 100755<br/>index 00000000000..75db2a26e05<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/glusterfs-server/bug-852147.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/glusterfs-server/bug-852147.t</a></div><div class='hunk'>@@ -0,0 +1,85 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+logdir=`gluster --print-logdir`"/bricks"</div><div class='add'>+</div><div class='add'>+## Start and create a volume</div><div class='add'>+TEST glusterd;</div><div class='add'>+TEST pidof glusterd;</div><div class='add'>+TEST $CLI volume info;</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 replica 3 $H0:$B0/${V0}{1,2,3,4,5,6};</div><div class='add'>+</div><div class='add'>+## Verify volume is is created</div><div class='add'>+EXPECT "$V0" volinfo_field $V0 'Volume Name';</div><div class='add'>+EXPECT 'Created' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+## Start volume and verify</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+EXPECT 'Started' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+TEST glusterfs -s $H0 --volfile-id=$V0 $M0</div><div class='add'>+touch $M0/file1;</div><div class='add'>+</div><div class='add'>+TEST $CLI volume set $V0 performance.cache-max-file-size 20MB</div><div class='add'>+TEST $CLI volume set $V0 performance.cache-min-file-size 10MB</div><div class='add'>+</div><div class='add'>+EXPECT "20MB" volinfo_field $V0 'performance.cache-max-file-size';</div><div class='add'>+EXPECT "10MB" volinfo_field $V0 'performance.cache-min-file-size';</div><div class='add'>+</div><div class='add'>+#Performing volume reset and verifying.</div><div class='add'>+TEST $CLI volume reset $V0</div><div class='add'>+EXPECT "" volinfo_field $V0 'performance.cache-max-file-size';</div><div class='add'>+EXPECT "" volinfo_field $V0 'performance.cache-min-file-size';</div><div class='add'>+</div><div class='add'>+#Verifying vlolume-profile start, info and stop</div><div class='add'>+EXPECT "Starting volume profile on $V0 has been successful " $CLI volume profile $V0 start</div><div class='add'>+</div><div class='add'>+function vol_prof_info()</div><div class='add'>+{</div><div class='add'>+    $CLI volume profile $V0 info | grep Brick | wc -l</div><div class='add'>+}</div><div class='add'>+EXPECT "6" vol_prof_info</div><div class='add'>+</div><div class='add'>+EXPECT "Stopping volume profile on $V0 has been successful " $CLI volume profile $V0 stop</div><div class='add'>+</div><div class='add'>+function log-file-name()</div><div class='add'>+{</div><div class='add'>+    logfilename=$B0"/"$V0"1.log"</div><div class='add'>+    echo ${logfilename:1} | tr / -</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function file-size()</div><div class='add'>+{</div><div class='add'>+    ls -lrt $1 | awk '{print $5}'</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#Finding the current log file's size</div><div class='add'>+log_file=$logdir"/"`log-file-name`</div><div class='add'>+log_file_size=`file-size $log_file`</div><div class='add'>+</div><div class='add'>+#Removing the old backup log files</div><div class='add'>+ren_file=$log_file".*"</div><div class='add'>+rm -rf $ren_file</div><div class='add'>+</div><div class='add'>+#Initiating log rotate</div><div class='add'>+TEST $CLI volume log $V0 rotate</div><div class='add'>+</div><div class='add'>+#Capturing new log file's size</div><div class='add'>+new_file_size=`file-size $log_file`</div><div class='add'>+</div><div class='add'>+#Verifying the size of the new log file and the creation of the backup log file</div><div class='add'>+TEST ! [ $new_file_size -eq $log_file_size ]</div><div class='add'>+TEST ls -lrt $ren_file</div><div class='add'>+</div><div class='add'>+## Finish up</div><div class='add'>+TEST $CLI volume stop $V0;</div><div class='add'>+EXPECT 'Stopped' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+TEST $CLI volume delete $V0;</div><div class='add'>+TEST ! $CLI volume info $V0;</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/glusterfs-server/bug-861542.t b/tests/bugs/glusterfs-server/bug-861542.t<br/>new file mode 100755<br/>index 00000000000..60d1b132fb4<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/glusterfs-server/bug-861542.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/glusterfs-server/bug-861542.t</a></div><div class='hunk'>@@ -0,0 +1,50 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume info;</div><div class='add'>+# Distributed volume with a single brick was chosen solely for the ease of</div><div class='add'>+#implementing the test case (to be precise, for the ease of extracting the port number).</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/brick0;</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+</div><div class='add'>+function port_field()</div><div class='add'>+{</div><div class='add'>+    local vol=$1;</div><div class='add'>+    local opt=$2;</div><div class='add'>+    if [ $opt -eq '0' ]; then</div><div class='add'>+        $CLI volume status $vol | grep "brick0" | awk '{print $3}';</div><div class='add'>+    else</div><div class='add'>+        $CLI volume status $vol detail | grep "^TCP Port " | awk '{print $4}';</div><div class='add'>+    fi</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function xml_port_field()</div><div class='add'>+{</div><div class='add'>+    local vol=$1;</div><div class='add'>+    local opt=$2;</div><div class='add'>+        $CLI --xml volume status $vol $opt | tr -d '\n' |\</div><div class='add'>+#Find the first occurrence of the string between &lt;port&gt; and &lt;/port&gt;</div><div class='add'>+        sed -rn 's/&lt;port&gt;/&amp;###/;s/&lt;\/port&gt;/###&amp;/;s/^.*###(.*)###.*$/\1/p'</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+TEST $CLI volume status $V0;</div><div class='add'>+TEST $CLI volume status $V0 detail;</div><div class='add'>+TEST $CLI --xml volume status $V0;</div><div class='add'>+TEST $CLI --xml volume status $V0 detail;</div><div class='add'>+</div><div class='add'>+# Kill the brick process. After this, port number for the killed (in this case brick) process must be "N/A".</div><div class='add'>+kill `cat $GLUSTERD_PIDFILEDIR/vols/$V0/$H0-d-backends-brick0.pid`</div><div class='add'>+</div><div class='add'>+EXPECT "N/A" port_field $V0 '0'; # volume status</div><div class='add'>+EXPECT "N/A" port_field $V0 '1'; # volume status detail</div><div class='add'>+</div><div class='add'>+EXPECT "N/A" xml_port_field $V0 '';</div><div class='add'>+EXPECT "N/A" xml_port_field $V0 'detail';</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/glusterfs-server/bug-864222.t b/tests/bugs/glusterfs-server/bug-864222.t<br/>new file mode 100755<br/>index 00000000000..01a7a4e3afd<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/glusterfs-server/bug-864222.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/glusterfs-server/bug-864222.t</a></div><div class='hunk'>@@ -0,0 +1,30 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../nfs.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+#G_TESTDEF_TEST_STATUS_CENTOS6=NFS_TEST</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/brick0</div><div class='add'>+TEST $CLI volume set $V0 nfs.disable false</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $NFS_EXPORT_TIMEOUT "1" is_nfs_export_available;</div><div class='add'>+TEST mount_nfs $H0:/$V0 $N0 nolock</div><div class='add'>+cd $N0</div><div class='add'>+</div><div class='add'>+TEST ls</div><div class='add'>+</div><div class='add'>+TEST $CLI volume set $V0 nfs.enable-ino32 on</div><div class='add'>+# Main test. This should pass.</div><div class='add'>+TEST ls</div><div class='add'>+</div><div class='add'>+cd</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $N0</div><div class='add'>+cleanup</div><div class='add'>+</div><div class='head'>diff --git a/tests/bugs/glusterfs-server/bug-873549.t b/tests/bugs/glusterfs-server/bug-873549.t<br/>new file mode 100644<br/>index 00000000000..8b5534728fd<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/glusterfs-server/bug-873549.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/glusterfs-server/bug-873549.t</a></div><div class='hunk'>@@ -0,0 +1,17 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd -LDEBUG;</div><div class='add'>+TEST pidof glusterd;</div><div class='add'>+TEST $CLI volume info;</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/${V0}{1,2};</div><div class='add'>+</div><div class='add'>+TEST $CLI volume set $V0 performance.quick-read-cache-size 512MB</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+TEST $CLI volume statedump $V0 all</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/glusterfs-server/bug-877992.t b/tests/bugs/glusterfs-server/bug-877992.t<br/>new file mode 100755<br/>index 00000000000..300000bcf2c<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/glusterfs-server/bug-877992.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/glusterfs-server/bug-877992.t</a></div><div class='hunk'>@@ -0,0 +1,63 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+## Start and create a volume</div><div class='add'>+TEST glusterd -LDEBUG</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+function volinfo_field()</div><div class='add'>+{</div><div class='add'>+    local vol=$1;</div><div class='add'>+    local field=$2;</div><div class='add'>+</div><div class='add'>+    $CLI volume info $vol | grep "^$field: " | sed 's/.*: //';</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+function hooks_prep ()</div><div class='add'>+{</div><div class='add'>+    local event=$1</div><div class='add'>+    touch /tmp/pre.out /tmp/post.out</div><div class='add'>+    touch $GLUSTERD_WORKDIR/hooks/1/"$event"/pre/Spre.sh</div><div class='add'>+    touch $GLUSTERD_WORKDIR/hooks/1/"$event"/post/Spost.sh</div><div class='add'>+</div><div class='add'>+    printf "#! /bin/bash\necho "$event"Pre &gt; /tmp/pre.out\n" &gt; $GLUSTERD_WORKDIR/hooks/1/"$event"/pre/Spre.sh</div><div class='add'>+    printf "#! /bin/bash\necho "$event"Post &gt; /tmp/post.out\n" &gt; $GLUSTERD_WORKDIR/hooks/1/"$event"/post/Spost.sh</div><div class='add'>+    chmod a+x $GLUSTERD_WORKDIR/hooks/1/"$event"/pre/Spre.sh</div><div class='add'>+    chmod a+x $GLUSTERD_WORKDIR/hooks/1/"$event"/post/Spost.sh</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function hooks_cleanup ()</div><div class='add'>+{</div><div class='add'>+    local event=$1</div><div class='add'>+    rm /tmp/pre.out /tmp/post.out</div><div class='add'>+    rm $GLUSTERD_WORKDIR/hooks/1/"$event"/pre/Spre.sh</div><div class='add'>+    rm $GLUSTERD_WORKDIR/hooks/1/"$event"/post/Spost.sh</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+## Verify volume is created and its hooks script ran</div><div class='add'>+hooks_prep 'create'</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/${V0}1;</div><div class='add'>+EXPECT "$V0" volinfo_field $V0 'Volume Name';</div><div class='add'>+EXPECT 'Created' volinfo_field $V0 'Status';</div><div class='add'>+EXPECT 'createPre' cat /tmp/pre.out;</div><div class='add'>+# Spost.sh comes after S10selinux-label-brick.sh under create post hook script</div><div class='add'>+# list. So consider the delay in setting SELinux context on bricks</div><div class='add'>+EXPECT_WITHIN 5 'createPost' cat /tmp/post.out;</div><div class='add'>+hooks_cleanup 'create'</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+## Start volume and verify that its hooks script ran</div><div class='add'>+hooks_prep 'start'</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+EXPECT 'Started' volinfo_field $V0 'Status';</div><div class='add'>+EXPECT_WITHIN 5 'startPre' cat /tmp/pre.out;</div><div class='add'>+EXPECT_WITHIN 5 'startPost' cat /tmp/post.out;</div><div class='add'>+hooks_cleanup 'start'</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/glusterfs-server/bug-887145.t b/tests/bugs/glusterfs-server/bug-887145.t<br/>new file mode 100755<br/>index 00000000000..db2cf3c050b<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/glusterfs-server/bug-887145.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/glusterfs-server/bug-887145.t</a></div><div class='hunk'>@@ -0,0 +1,99 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../nfs.rc</div><div class='add'>+</div><div class='add'>+#G_TESTDEF_TEST_STATUS_CENTOS6=NFS_TEST</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 replica 2 $H0:$B0/${V0}{1,2};</div><div class='add'>+TEST $CLI volume set $V0 performance.open-behind off;</div><div class='add'>+TEST $CLI volume set $V0 nfs.disable false</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+## Mount FUSE with caching disabled</div><div class='add'>+TEST glusterfs --entry-timeout=0 --attribute-timeout=0 -s $H0 --volfile-id $V0 $M0;</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $NFS_EXPORT_TIMEOUT "1" is_nfs_export_available;</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+useradd tmp_user 2&gt;/dev/null 1&gt;/dev/null;</div><div class='add'>+mkdir $M0/dir;</div><div class='add'>+mkdir $M0/other;</div><div class='add'>+cp /etc/passwd $M0/;</div><div class='add'>+cp $M0/passwd $M0/file;</div><div class='add'>+chmod 600 $M0/file;</div><div class='add'>+</div><div class='add'>+TEST mount_nfs $H0:/$V0 $N0 nolock;</div><div class='add'>+</div><div class='add'>+grep nfsnobody /etc/passwd &gt; /dev/null</div><div class='add'>+if [ $? -eq 1 ]; then</div><div class='add'>+usr=nobody</div><div class='add'>+grp=nobody</div><div class='add'>+else</div><div class='add'>+usr=nfsnobody</div><div class='add'>+grp=nfsnobody</div><div class='add'>+fi</div><div class='add'>+chown -R $usr:$grp $M0/dir;</div><div class='add'>+chown -R tmp_user:tmp_user $M0/other;</div><div class='add'>+</div><div class='add'>+TEST $CLI volume set $V0 server.root-squash on;</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $NFS_EXPORT_TIMEOUT "1" is_nfs_export_available;</div><div class='add'>+</div><div class='add'>+# create files and directories in the root of the glusterfs and nfs mount</div><div class='add'>+# which is owned by root and hence the right behavior is getting EACCESS</div><div class='add'>+# as the fops are executed as nfsnobody/nobody.</div><div class='add'>+touch $M0/foo 2&gt;/dev/null;</div><div class='add'>+TEST [ $? -ne 0 ]</div><div class='add'>+touch $N0/foo 2&gt;/dev/null;</div><div class='add'>+TEST [ $? -ne 0 ]</div><div class='add'>+mkdir $M0/new 2&gt;/dev/null;</div><div class='add'>+TEST [ $? -ne 0 ]</div><div class='add'>+mkdir $N0/new 2&gt;/dev/null;</div><div class='add'>+TEST [ $? -ne 0 ]</div><div class='add'>+cp $M0/file $M0/tmp_file 2&gt;/dev/null;</div><div class='add'>+TEST [ $? -ne 0 ]</div><div class='add'>+cp $N0/file $N0/tmp_file 2&gt;/dev/null;</div><div class='add'>+TEST [ $? -ne 0 ]</div><div class='add'>+cat $M0/file 2&gt;/dev/null;</div><div class='add'>+TEST [ $? -ne 0 ]</div><div class='add'>+# here read should be allowed because eventhough file "passwd" is owned</div><div class='add'>+# by root, the permissions if the file allow other users to read it.</div><div class='add'>+cat $M0/passwd 1&gt;/dev/null;</div><div class='add'>+TEST [ $? -eq 0 ]</div><div class='add'>+cat $N0/passwd 1&gt;/dev/null;</div><div class='add'>+TEST [ $? -eq 0 ]</div><div class='add'>+</div><div class='add'>+# create files and directories should succeed as the fops are being executed</div><div class='add'>+# inside the directory owned by nfsnobody/nobody</div><div class='add'>+TEST touch $M0/dir/file;</div><div class='add'>+TEST touch $N0/dir/foo;</div><div class='add'>+TEST mkdir $M0/dir/new;</div><div class='add'>+TEST mkdir $N0/dir/other;</div><div class='add'>+TEST rm -f $M0/dir/file $M0/dir/foo;</div><div class='add'>+TEST rmdir $N0/dir/*;</div><div class='add'>+</div><div class='add'>+# create files and directories here should fail as other directory is owned</div><div class='add'>+# by tmp_user.</div><div class='add'>+touch $M0/other/foo 2&gt;/dev/null;</div><div class='add'>+TEST [ $? -ne 0 ]</div><div class='add'>+touch $N0/other/foo 2&gt;/dev/null;</div><div class='add'>+TEST [ $? -ne 0 ]</div><div class='add'>+mkdir $M0/other/new 2&gt;/dev/null;</div><div class='add'>+TEST [ $? -ne 0 ]</div><div class='add'>+mkdir $N0/other/new 2&gt;/dev/null;</div><div class='add'>+TEST [ $? -ne 0 ]</div><div class='add'>+</div><div class='add'>+userdel tmp_user;</div><div class='add'>+rm -rf /home/tmp_user;</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" umount_nfs $N0</div><div class='add'>+</div><div class='add'>+TEST $CLI volume stop $V0;</div><div class='add'>+TEST $CLI volume delete $V0;</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/glusterfs-server/bug-889996.t b/tests/bugs/glusterfs-server/bug-889996.t<br/>new file mode 100644<br/>index 00000000000..d7d25c42933<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/glusterfs-server/bug-889996.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/glusterfs-server/bug-889996.t</a></div><div class='hunk'>@@ -0,0 +1,19 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume info;</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/${V0}{1,2};</div><div class='add'>+</div><div class='add'>+rm -rf $B0/${V0}1;</div><div class='add'>+</div><div class='add'>+TEST ! $CLI volume start $V0;</div><div class='add'>+EXPECT 0 online_brick_count;</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/glusterfs-server/bug-904300.t b/tests/bugs/glusterfs-server/bug-904300.t<br/>new file mode 100755<br/>index 00000000000..95d5d381c8b<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/glusterfs-server/bug-904300.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/glusterfs-server/bug-904300.t</a></div><div class='hunk'>@@ -0,0 +1,65 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../nfs.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+#G_TESTDEF_TEST_STATUS_CENTOS6=NFS_TEST</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+# 1-8</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/$V0;</div><div class='add'>+TEST $CLI volume set $V0 nfs.disable false</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+EXPECT_WITHIN $NFS_EXPORT_TIMEOUT 1 is_nfs_export_available</div><div class='add'>+</div><div class='add'>+TEST mount_nfs $H0:/$V0 $N0 nolock</div><div class='add'>+TEST mkdir $N0/dir1</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $N0</div><div class='add'>+</div><div class='add'>+#</div><div class='add'>+# Case 1: Allow "dir1" to be mounted only from 127.0.0.1</div><div class='add'>+# 9-12</div><div class='add'>+TEST $CLI volume set $V0 export-dir \""/dir1(127.0.0.1)"\"</div><div class='add'>+EXPECT_WITHIN $NFS_EXPORT_TIMEOUT 2 is_nfs_export_available</div><div class='add'>+</div><div class='add'>+TEST mount_nfs localhost:/$V0/dir1 $N0 nolock</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $N0</div><div class='add'>+</div><div class='add'>+#</div><div class='add'>+# Case 2: Allow "dir1" to be mounted only from 8.8.8.8. This is</div><div class='add'>+#         a negative test case therefore the mount should fail.</div><div class='add'>+# 13-16</div><div class='add'>+TEST $CLI volume set $V0 export-dir \""/dir1(8.8.8.8)"\"</div><div class='add'>+EXPECT_WITHIN $NFS_EXPORT_TIMEOUT 2 is_nfs_export_available</div><div class='add'>+</div><div class='add'>+TEST ! mount_nfs $H0:/$V0/dir1 $N0 nolock</div><div class='add'>+TEST ! umount $N0</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+# Case 3: Variation of test case1. Here we are checking with hostname</div><div class='add'>+#         instead of ip address.</div><div class='add'>+# 17-20</div><div class='add'>+TEST $CLI volume set $V0 export-dir \""/dir1($H0)"\"</div><div class='add'>+EXPECT_WITHIN $NFS_EXPORT_TIMEOUT 2 is_nfs_export_available</div><div class='add'>+</div><div class='add'>+TEST mount_nfs $H0:/$V0/dir1 $N0 nolock</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $N0</div><div class='add'>+</div><div class='add'>+# Case 4: Variation of test case1. Here we are checking with IP range</div><div class='add'>+# 21-24</div><div class='add'>+TEST $CLI volume set $V0 export-dir \""/dir1(127.0.0.0/24)"\"</div><div class='add'>+EXPECT_WITHIN $NFS_EXPORT_TIMEOUT 2 is_nfs_export_available</div><div class='add'>+</div><div class='add'>+TEST mount_nfs localhost:/$V0/dir1 $N0 nolock</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $N0</div><div class='add'>+</div><div class='add'>+## Finish up</div><div class='add'>+TEST $CLI volume stop $V0;</div><div class='add'>+TEST $CLI volume delete $V0;</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/glusterfs-server/bug-905864.c b/tests/bugs/glusterfs-server/bug-905864.c<br/>new file mode 100644<br/>index 00000000000..f70003736e7<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/glusterfs-server/bug-905864.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/glusterfs-server/bug-905864.c</a></div><div class='hunk'>@@ -0,0 +1,83 @@</div><div class='add'>+#include &lt;stdio.h&gt;</div><div class='add'>+#include &lt;string.h&gt;</div><div class='add'>+#include &lt;unistd.h&gt;</div><div class='add'>+#include &lt;fcntl.h&gt;</div><div class='add'>+#include &lt;pthread.h&gt;</div><div class='add'>+</div><div class='add'>+pthread_t th[5] = {0};</div><div class='add'>+void</div><div class='add'>+flock_init(struct flock *f, short int type, off_t start, off_t len)</div><div class='add'>+{</div><div class='add'>+    f-&gt;l_type = type;</div><div class='add'>+    f-&gt;l_start = start;</div><div class='add'>+    f-&gt;l_len = len;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+flock_range_in_steps(int fd, int is_set, short l_type, int start, int end,</div><div class='add'>+                     int step)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+    int i = 0;</div><div class='add'>+    struct flock f = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    for (i = start; i + step &lt; end; i += step) {</div><div class='add'>+        flock_init(&amp;f, l_type, i, step);</div><div class='add'>+        ret = fcntl(fd, (is_set) ? F_SETLKW : F_GETLK, &amp;f);</div><div class='add'>+        if (ret) {</div><div class='add'>+            perror("fcntl");</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void *</div><div class='add'>+random_locker(void *arg)</div><div class='add'>+{</div><div class='add'>+    int fd = *(int *)arg;</div><div class='add'>+    int i = 0;</div><div class='add'>+    int is_set = 0;</div><div class='add'>+</div><div class='add'>+    /* use thread id to choose GETLK or SETLK operation*/</div><div class='add'>+    is_set = pthread_self() % 2;</div><div class='add'>+    (void)flock_range_in_steps(fd, is_set, F_WRLCK, 0, 400, 1);</div><div class='add'>+</div><div class='add'>+    return NULL;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+main(int argc, char **argv)</div><div class='add'>+{</div><div class='add'>+    int fd = -1;</div><div class='add'>+    int ret = 1;</div><div class='add'>+    int i = 0;</div><div class='add'>+    char *fname = NULL;</div><div class='add'>+</div><div class='add'>+    if (argc &lt; 2)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    fname = argv[1];</div><div class='add'>+    fd = open(fname, O_RDWR);</div><div class='add'>+    if (fd == -1) {</div><div class='add'>+        perror("open");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = flock_range_in_steps(fd, 1, F_WRLCK, 0, 2000, 2);</div><div class='add'>+    for (i = 0; i &lt; 5; i++) {</div><div class='add'>+        pthread_create(&amp;th[i], NULL, random_locker, (void *)&amp;fd);</div><div class='add'>+    }</div><div class='add'>+    ret = flock_range_in_steps(fd, 1, F_WRLCK, 0, 2000, 2);</div><div class='add'>+    for (i = 0; i &lt; 5; i++) {</div><div class='add'>+        pthread_join(th[i], NULL);</div><div class='add'>+    }</div><div class='add'>+out:</div><div class='add'>+    if (fd != -1)</div><div class='add'>+        close(fd);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='head'>diff --git a/tests/bugs/glusterfs-server/bug-905864.t b/tests/bugs/glusterfs-server/bug-905864.t<br/>new file mode 100644<br/>index 00000000000..44923a85333<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/glusterfs-server/bug-905864.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/glusterfs-server/bug-905864.t</a></div><div class='hunk'>@@ -0,0 +1,32 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+## Start and create a volume</div><div class='add'>+TEST glusterd;</div><div class='add'>+TEST pidof glusterd;</div><div class='add'>+TEST $CLI volume info;</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 replica 2 $H0:$B0/${V0}{1,2,3,4};</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+</div><div class='add'>+TEST glusterfs --entry-timeout=0 --attribute-timeout=0 -s $H0 --volfile-id $V0 $M0;</div><div class='add'>+TEST glusterfs --entry-timeout=0 --attribute-timeout=0 -s $H0 --volfile-id $V0 $M1;</div><div class='add'>+</div><div class='add'>+TEST touch $M0/file1;</div><div class='add'>+</div><div class='add'>+#following C program tries open up race(s) if any, in F_GETLK/F_SETLKW codepaths</div><div class='add'>+#of locks xlator</div><div class='add'>+TEST $CC -pthread -g3 $(dirname $0)/bug-905864.c -o $(dirname $0)/bug-905864</div><div class='add'>+</div><div class='add'>+$(dirname $0)/bug-905864 $M0/file1 &amp;</div><div class='add'>+$(dirname $0)/bug-905864 $M1/file1;</div><div class='add'>+wait</div><div class='add'>+</div><div class='add'>+TEST rm -f $(dirname $0)/bug-905864</div><div class='add'>+EXPECT $(brick_count $V0) online_brick_count</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/bugs/glusterfs-server/bug-912297.t b/tests/bugs/glusterfs-server/bug-912297.t<br/>new file mode 100755<br/>index 00000000000..08f5dcea9b9<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/glusterfs-server/bug-912297.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/glusterfs-server/bug-912297.t</a></div><div class='hunk'>@@ -0,0 +1,44 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+## Start and create a volume</div><div class='add'>+TEST glusterd;</div><div class='add'>+TEST pidof glusterd;</div><div class='add'>+TEST $CLI volume create $V0 replica 3 $H0:$B0/${V0}{1,2,3,4,5,6};</div><div class='add'>+</div><div class='add'>+## Verify volume is is created</div><div class='add'>+EXPECT "$V0" volinfo_field $V0 'Volume Name';</div><div class='add'>+EXPECT 'Created' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+## Start volume and verify</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+EXPECT 'Started' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+## Setting owner-uid as -12</div><div class='add'>+TEST ! $CLI volume set $V0 owner-uid -12</div><div class='add'>+EXPECT '' volinfo_field $V0 'storage.owner-uid'</div><div class='add'>+</div><div class='add'>+## Setting owner-gid as -5</div><div class='add'>+TEST ! $CLI volume set $V0 owner-gid -5</div><div class='add'>+EXPECT '' volinfo_field $V0 'storage.owner-gid'</div><div class='add'>+</div><div class='add'>+## Setting owner-uid as 36</div><div class='add'>+TEST $CLI volume set $V0 owner-uid 36</div><div class='add'>+EXPECT '36' volinfo_field $V0 'storage.owner-uid'</div><div class='add'>+</div><div class='add'>+## Setting owner-gid as 36</div><div class='add'>+TEST $CLI volume set $V0 owner-gid 36</div><div class='add'>+EXPECT '36' volinfo_field $V0 'storage.owner-gid'</div><div class='add'>+</div><div class='add'>+## Finish up</div><div class='add'>+TEST $CLI volume stop $V0;</div><div class='add'>+EXPECT 'Stopped' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+TEST $CLI volume delete $V0;</div><div class='add'>+TEST ! $CLI volume info $V0;</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/glusterfs/bug-1482528.t b/tests/bugs/glusterfs/bug-1482528.t<br/>new file mode 100644<br/>index 00000000000..3adf260bdcd<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/glusterfs/bug-1482528.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/glusterfs/bug-1482528.t</a></div><div class='hunk'>@@ -0,0 +1,100 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='add'>+#Basic checks</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+</div><div class='add'>+#Create a distributed volume</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/${V0}{1..2}</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+# Mount FUSE without selinux:</div><div class='add'>+TEST glusterfs -s $H0 --volfile-id $V0 $@ $M0</div><div class='add'>+</div><div class='add'>+TEST touch $M0/default.txt</div><div class='add'>+EXPECT "644" stat -c %a $M0/default.txt</div><div class='add'>+</div><div class='add'>+TEST chmod 0444 $M0/default.txt</div><div class='add'>+EXPECT "444" stat -c %a $M0/default.txt</div><div class='add'>+</div><div class='add'>+TEST mkdir $M0/default</div><div class='add'>+EXPECT "755" stat -c %a $M0/default</div><div class='add'>+</div><div class='add'>+TEST chmod 0444 $M0/default</div><div class='add'>+EXPECT "444" stat -c %a $M0/default</div><div class='add'>+</div><div class='add'>+TEST mkfifo $M0/mkfifo</div><div class='add'>+EXPECT "644" stat -c %a $M0/mkfifo</div><div class='add'>+</div><div class='add'>+TEST mknod $M0/dmknod b 4 5</div><div class='add'>+EXPECT "644" stat -c %a $M0/dmknod</div><div class='add'>+</div><div class='add'>+#Set the create-directory-mask and create-mask options</div><div class='add'>+TEST $CLI volume set $V0 storage.create-directory-mask 0444</div><div class='add'>+TEST $CLI volume set $V0 storage.create-mask 0444</div><div class='add'>+</div><div class='add'>+TEST mkdir $M0/create-directory</div><div class='add'>+EXPECT "444" stat -c %a $M0/create-directory</div><div class='add'>+</div><div class='add'>+TEST touch $M0/create-mask.txt</div><div class='add'>+EXPECT "444" stat -c %a $M0/create-mask.txt</div><div class='add'>+</div><div class='add'>+TEST chmod 0777 $M0/create-mask.txt</div><div class='add'>+EXPECT "444" stat -c %a $M0/create-mask.txt</div><div class='add'>+</div><div class='add'>+TEST chmod 0400 $M0/create-mask.txt</div><div class='add'>+EXPECT "400" stat -c %a $M0/create-mask.txt</div><div class='add'>+</div><div class='add'>+TEST chmod 0777 $M0/create-directory</div><div class='add'>+EXPECT "444" stat -c %a $M0/create-directory</div><div class='add'>+</div><div class='add'>+TEST chmod 0400 $M0/create-directory</div><div class='add'>+EXPECT "400" stat -c %a $M0/create-directory</div><div class='add'>+</div><div class='add'>+TEST mkfifo $M0/cfifo</div><div class='add'>+EXPECT "444" stat -c %a $M0/cfifo</div><div class='add'>+</div><div class='add'>+TEST chmod 0777 $M0/cfifo</div><div class='add'>+EXPECT "444" stat -c %a $M0/cfifo</div><div class='add'>+</div><div class='add'>+TEST mknod $M0/cmknod b 4 5</div><div class='add'>+EXPECT "444" stat -c %a $M0/cmknod</div><div class='add'>+</div><div class='add'>+#set force-create-mode and force-directory-mode options</div><div class='add'>+TEST $CLI volume set $V0 storage.force-create-mode 0777</div><div class='add'>+TEST $CLI volume set $V0 storage.force-directory-mode 0333</div><div class='add'>+</div><div class='add'>+TEST touch $M0/force-create-mode.txt</div><div class='add'>+EXPECT "777" stat -c %a $M0/force-create-mode.txt</div><div class='add'>+</div><div class='add'>+TEST mkdir $M0/force-directory</div><div class='add'>+EXPECT "777" stat -c %a $M0/force-directory</div><div class='add'>+</div><div class='add'>+TEST chmod 0222 $M0/force-create-mode.txt</div><div class='add'>+EXPECT "777" stat -c %a $M0/force-create-mode.txt</div><div class='add'>+</div><div class='add'>+TEST chmod 0222 $M0/force-directory</div><div class='add'>+EXPECT "333" stat -c %a $M0/force-directory</div><div class='add'>+</div><div class='add'>+TEST mkdir $M0/link</div><div class='add'>+TEST ln -s $M0/force-create-mode.txt $M0/link</div><div class='add'>+EXPECT "777" stat -c %a $M0/link/force-create-mode.txt</div><div class='add'>+</div><div class='add'>+TEST ln $M0/force-create-mode.txt $M0/link/fc.txt</div><div class='add'>+EXPECT "777" stat -c %a $M0/link/fc.txt</div><div class='add'>+</div><div class='add'>+TEST setfacl -m o:r $M0/force-create-mode.txt</div><div class='add'>+EXPECT "777" stat -c %a $M0/force-create-mode.txt</div><div class='add'>+</div><div class='add'>+TEST ln -s $M0/force-directory $M0/link</div><div class='add'>+EXPECT "777" stat -c %a $M0/link/force-directory</div><div class='add'>+</div><div class='add'>+TEST mkfifo $M0/ffifo</div><div class='add'>+EXPECT "777" stat -c %a $M0/ffifo</div><div class='add'>+</div><div class='add'>+TEST mknod $M0/mknod b 4 5</div><div class='add'>+EXPECT "777" stat -c %a $M0/mknod</div><div class='head'>diff --git a/tests/bugs/glusterfs/bug-811493.t b/tests/bugs/glusterfs/bug-811493.t<br/>new file mode 100755<br/>index 00000000000..98f7c121a02<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/glusterfs/bug-811493.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/glusterfs/bug-811493.t</a></div><div class='hunk'>@@ -0,0 +1,18 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI system uuid reset;</div><div class='add'>+</div><div class='add'>+uuid1=$(grep UUID $GLUSTERD_WORKDIR/glusterd.info | cut -f 2 -d "=");</div><div class='add'>+</div><div class='add'>+TEST $CLI system uuid reset;</div><div class='add'>+uuid2=$(grep UUID $GLUSTERD_WORKDIR/glusterd.info | cut -f 2 -d "=");</div><div class='add'>+</div><div class='add'>+TEST [ $uuid1 != $uuid2 ]</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/bugs/glusterfs/bug-844688.t b/tests/bugs/glusterfs/bug-844688.t<br/>new file mode 100755<br/>index 00000000000..65f41b342a5<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/glusterfs/bug-844688.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/glusterfs/bug-844688.t</a></div><div class='hunk'>@@ -0,0 +1,55 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+function check_callstack_log {</div><div class='add'>+    local text=$1</div><div class='add'>+    statedump_file=$(generate_mount_statedump $V0);</div><div class='add'>+    grep $text $statedump_file 2&gt;/dev/null 1&gt;/dev/null;</div><div class='add'>+    if [ $? -eq 0 ]; then</div><div class='add'>+        echo "1";</div><div class='add'>+    else</div><div class='add'>+        echo "0";</div><div class='add'>+    fi;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/brick0</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+TEST glusterfs -s $H0 --volfile-id $V0 $M0</div><div class='add'>+</div><div class='add'>+mount_pid=$(get_mount_process_pid $V0);</div><div class='add'>+# enable dumping of call stack creation and frame creation times in statedump</div><div class='add'>+# monitoring is enabled by default</div><div class='add'>+</div><div class='add'>+# We want to make sure that there is a pending frame in gluster stack.</div><div class='add'>+# For that we are creating a blocking lock scenario.</div><div class='add'>+</div><div class='add'>+TEST touch $M0/lockfile;</div><div class='add'>+# Open two fd's on the same file</div><div class='add'>+exec 8&gt;$M0/lockfile;</div><div class='add'>+exec 9&gt;$M0/lockfile;</div><div class='add'>+</div><div class='add'>+# First flock will succeed and the second one will block, hence the background run.</div><div class='add'>+flock -x 8 ;</div><div class='add'>+flock -x 9 &amp;</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" check_callstack_log "callstack-creation-time";</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" check_callstack_log "frame-creation-time";</div><div class='add'>+</div><div class='add'>+flock -u 8</div><div class='add'>+flock -u 9;</div><div class='add'>+</div><div class='add'>+# Closing the fd's</div><div class='add'>+exec 8&gt;&amp;-</div><div class='add'>+exec 9&gt;&amp;-</div><div class='add'>+</div><div class='add'>+TEST rm -f $M0/lockfile;</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+</div><div class='add'>+rm -f $statedumpdir/glusterdump.$mount_pid.*;</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/bugs/glusterfs/bug-848251.t b/tests/bugs/glusterfs/bug-848251.t<br/>new file mode 100644<br/>index 00000000000..69ffe680f7f<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/glusterfs/bug-848251.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/glusterfs/bug-848251.t</a></div><div class='hunk'>@@ -0,0 +1,52 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume info;</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/brick1;</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+</div><div class='add'>+#enable quota</div><div class='add'>+TEST $CLI volume quota $V0 enable;</div><div class='add'>+</div><div class='add'>+#mount on a random dir</div><div class='add'>+TEST MOUNTDIR="/tmp/$RANDOM"</div><div class='add'>+TEST mkdir $MOUNTDIR</div><div class='add'>+TEST glusterfs -s $H0 --volfile-id=$V0 $MOUNTDIR</div><div class='add'>+</div><div class='add'>+function set_quota(){</div><div class='add'>+        mkdir "$MOUNTDIR/$name"</div><div class='add'>+        $CLI volume quota $V0 limit-usage /$name 50KB</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function quota_list(){</div><div class='add'>+        $CLI volume quota $V0 list | grep -- /$name | awk '{print $3}'</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+TEST   name=":d1"</div><div class='add'>+#file name containing ':' in the start</div><div class='add'>+TEST   set_quota</div><div class='add'>+EXPECT "80%" quota_list</div><div class='add'>+</div><div class='add'>+TEST   name=":d1/d:1"</div><div class='add'>+#file name containing ':' in between</div><div class='add'>+TEST   set_quota</div><div class='add'>+EXPECT "80%" quota_list</div><div class='add'>+</div><div class='add'>+TEST   name=":d1/d:1/d1:"</div><div class='add'>+#file name containing ':' in the end</div><div class='add'>+TEST   set_quota</div><div class='add'>+EXPECT "80%" quota_list</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $MOUNTDIR</div><div class='add'>+TEST   rm -rf $MOUNTDIR</div><div class='add'>+TEST $CLI volume stop $V0</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/glusterfs/bug-853690.t b/tests/bugs/glusterfs/bug-853690.t<br/>new file mode 100755<br/>index 00000000000..59facfcddb0<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/glusterfs/bug-853690.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/glusterfs/bug-853690.t</a></div><div class='hunk'>@@ -0,0 +1,91 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+#</div><div class='add'>+# Bug 853690 - Test that short writes do not lead to corruption.</div><div class='add'>+#</div><div class='add'>+# Mismanagement of short writes in AFR leads to corruption and immediately</div><div class='add'>+# detectable split-brain. Write a file to a replica volume using error-gen</div><div class='add'>+# to cause short writes on one replica.</div><div class='add'>+#</div><div class='add'>+# Short writes are also possible during heal. If ignored, the files are marked</div><div class='add'>+# consistent and silently differ. After reading the file, cause a lookup, wait</div><div class='add'>+# for self-heal and verify that the afr xattrs do not match.</div><div class='add'>+#</div><div class='add'>+########</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST mkdir -p $B0/test{1,2}</div><div class='add'>+</div><div class='add'>+# Our graph is a two brick replica with 100% frequency of short writes on one</div><div class='add'>+# side of the replica. This guarantees a single write fop leads to an out-of-sync</div><div class='add'>+# situation.</div><div class='add'>+cat &gt; $B0/test.vol &lt;&lt;EOF</div><div class='add'>+volume test-posix-0</div><div class='add'>+    type storage/posix</div><div class='add'>+    option directory $B0/test1</div><div class='add'>+end-volume</div><div class='add'>+</div><div class='add'>+volume test-error-0</div><div class='add'>+    type debug/error-gen</div><div class='add'>+    option failure 100</div><div class='add'>+    option enable writev</div><div class='add'>+    option error-no GF_ERROR_SHORT_WRITE</div><div class='add'>+    subvolumes test-posix-0</div><div class='add'>+end-volume</div><div class='add'>+</div><div class='add'>+volume test-locks-0</div><div class='add'>+    type features/locks</div><div class='add'>+    subvolumes test-error-0</div><div class='add'>+end-volume</div><div class='add'>+</div><div class='add'>+volume test-posix-1</div><div class='add'>+    type storage/posix</div><div class='add'>+    option directory $B0/test2</div><div class='add'>+end-volume</div><div class='add'>+</div><div class='add'>+volume test-locks-1</div><div class='add'>+    type features/locks</div><div class='add'>+    subvolumes test-posix-1</div><div class='add'>+end-volume</div><div class='add'>+</div><div class='add'>+volume test-replicate-0</div><div class='add'>+    type cluster/replicate</div><div class='add'>+    option background-self-heal-count 0</div><div class='add'>+    subvolumes test-locks-0 test-locks-1</div><div class='add'>+end-volume</div><div class='add'>+EOF</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+</div><div class='add'>+TEST glusterfs --volfile=$B0/test.vol --attribute-timeout=0 --entry-timeout=0 $M0</div><div class='add'>+</div><div class='add'>+# Send a single write, guaranteed to be short on one replica, and attempt to</div><div class='add'>+# read the data back. Failure to detect the short write results in different</div><div class='add'>+# file sizes and immediate split-brain (EIO).</div><div class='add'>+TEST dd if=/dev/urandom of=$M0/file bs=128k count=1</div><div class='add'>+TEST dd if=$M0/file of=/dev/null bs=128k count=1</div><div class='add'>+########</div><div class='add'>+#</div><div class='add'>+# Test self-heal with short writes...</div><div class='add'>+#</div><div class='add'>+########</div><div class='add'>+</div><div class='add'>+# Cause a lookup and wait a few seconds for posterity. This self-heal also fails</div><div class='add'>+# due to a short write.</div><div class='add'>+TEST ls $M0/file</div><div class='add'>+# Verify the attributes on the healthy replica do not reflect consistency with</div><div class='add'>+# the other replica.</div><div class='add'>+xa=`getfattr -n trusted.afr.test-locks-0 -e hex $B0/test2/file 2&gt;&amp;1 | grep = | cut -f2 -d=`</div><div class='add'>+EXPECT_NOT 0x000000000000000000000000 echo $xa</div><div class='add'>+</div><div class='add'>+TEST rm -f $M0/file</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+</div><div class='add'>+rm -f $B0/test.vol</div><div class='add'>+rm -rf $B0/test1 $B0/test2</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='head'>diff --git a/tests/bugs/glusterfs/bug-856455.t b/tests/bugs/glusterfs/bug-856455.t<br/>new file mode 100644<br/>index 00000000000..d02b39bda8e<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/glusterfs/bug-856455.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/glusterfs/bug-856455.t</a></div><div class='hunk'>@@ -0,0 +1,43 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+BRICK_COUNT=3</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/${V0}0 $H0:$B0/${V0}1 $H0:$B0/${V0}2</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+## Mount FUSE with caching disabled</div><div class='add'>+TEST $GFS -s $H0 --volfile-id $V0 $M0;</div><div class='add'>+</div><div class='add'>+function query_pathinfo()</div><div class='add'>+{</div><div class='add'>+    local path=$1;</div><div class='add'>+    local retval;</div><div class='add'>+</div><div class='add'>+    local pathinfo=$(getfattr  -n trusted.glusterfs.pathinfo $path);</div><div class='add'>+    retval=$(echo $pathinfo | grep -o 'POSIX' | wc -l);</div><div class='add'>+    echo $retval</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+TEST touch $M0/f00f;</div><div class='add'>+TEST mkdir $M0/f00d;</div><div class='add'>+</div><div class='add'>+# verify pathinfo for a file and directory</div><div class='add'>+EXPECT 1 query_pathinfo $M0/f00f;</div><div class='add'>+EXPECT $BRICK_COUNT query_pathinfo $M0/f00d;</div><div class='add'>+</div><div class='add'>+# Kill a brick process and then query for pathinfo</div><div class='add'>+# for directories pathinfo should list backend patch from available (up) subvolumes</div><div class='add'>+</div><div class='add'>+kill_brick $V0 $H0 ${B0}/${V0}1</div><div class='add'>+</div><div class='add'>+EXPECT `expr $BRICK_COUNT - 1` query_pathinfo $M0/f00d;</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/glusterfs/bug-860297.t b/tests/bugs/glusterfs/bug-860297.t<br/>new file mode 100644<br/>index 00000000000..c2d21553f68<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/glusterfs/bug-860297.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/glusterfs/bug-860297.t</a></div><div class='hunk'>@@ -0,0 +1,13 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume info</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/brick1</div><div class='add'>+setfattr -x trusted.glusterfs.volume-id $B0/brick1</div><div class='add'>+## If Extended attribute trusted.glusterfs.volume-id is not present</div><div class='add'>+## then volume should not be able to start</div><div class='add'>+TEST ! $CLI volume start $V0;</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/glusterfs/bug-861015-index.t b/tests/bugs/glusterfs/bug-861015-index.t<br/>new file mode 100644<br/>index 00000000000..74ffc45bf2e<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/glusterfs/bug-861015-index.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/glusterfs/bug-861015-index.t</a></div><div class='hunk'>@@ -0,0 +1,36 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 replica 2 $H0:$B0/${V0}{0,1,2,3,4,5}</div><div class='add'>+TEST $CLI volume set $V0 ensure-durability off</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "Y" glustershd_up_status</div><div class='add'>+TEST glusterfs --volfile-id=/$V0 --volfile-server=$H0 $M0 --attribute-timeout=0 --entry-timeout=0</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}0</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}2</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}4</div><div class='add'>+cd $M0</div><div class='add'>+HEAL_FILES=0</div><div class='add'>+for i in {1..10}</div><div class='add'>+do</div><div class='add'>+        echo "abc" &gt; $i</div><div class='add'>+        HEAL_FILES=$(($HEAL_FILES+1))</div><div class='add'>+done</div><div class='add'>+HEAL_FILES=$(($HEAL_FILES+3)) #count brick root distribute-subvol num of times</div><div class='add'>+</div><div class='add'>+cd ~</div><div class='add'>+EXPECT "$HEAL_FILES" get_pending_heal_count $V0</div><div class='add'>+TEST rm -f $M0/*</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+TEST $CLI volume heal $V0 info</div><div class='add'>+#Only root dir should be present now in the indices</div><div class='add'>+EXPECT "1" afr_get_num_indices_in_brick $B0/${V0}1</div><div class='add'>+EXPECT "1" afr_get_num_indices_in_brick $B0/${V0}3</div><div class='add'>+EXPECT "1" afr_get_num_indices_in_brick $B0/${V0}5</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/bugs/glusterfs/bug-861015-log.t b/tests/bugs/glusterfs/bug-861015-log.t<br/>new file mode 100644<br/>index 00000000000..2f3e0ad14f4<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/glusterfs/bug-861015-log.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/glusterfs/bug-861015-log.t</a></div><div class='hunk'>@@ -0,0 +1,29 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+log_wd=$(gluster --print-logdir)</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+rm -f $log_wd/glustershd.log</div><div class='add'>+TEST $CLI volume create $V0 replica 2 $H0:$B0/${V0}{0,1}</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+TEST glusterfs --volfile-id=/$V0 --volfile-server=$H0 $M0 --attribute-timeout=0 --entry-timeout=0</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}0</div><div class='add'>+cd $M0</div><div class='add'>+for i in {1..10}</div><div class='add'>+do</div><div class='add'>+        dd if=/dev/urandom of=f bs=1024k count=10 2&gt;/dev/null</div><div class='add'>+done</div><div class='add'>+</div><div class='add'>+cd ~</div><div class='add'>+TEST $CLI volume heal $V0 info</div><div class='add'>+function count_inode_link_failures {</div><div class='add'>+        logfile=$1</div><div class='add'>+        grep "inode link failed on the inode" $logfile | wc -l</div><div class='add'>+}</div><div class='add'>+EXPECT "0" count_inode_link_failures $log_wd/glustershd.log</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/bugs/glusterfs/bug-866459.t b/tests/bugs/glusterfs/bug-866459.t<br/>new file mode 100644<br/>index 00000000000..a6c767b4b0e<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/glusterfs/bug-866459.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/glusterfs/bug-866459.t</a></div><div class='hunk'>@@ -0,0 +1,44 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+## Start and create a volume</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume info;</div><div class='add'>+</div><div class='add'>+## Create and start a volume with aio enabled</div><div class='add'>+TEST $CLI volume create $V0 replica 2 $H0:$B0/${V0}{1,2};</div><div class='add'>+TEST $CLI volume set $V0 linux-aio on</div><div class='add'>+TEST $CLI volume set $V0 background-self-heal-count 0</div><div class='add'>+TEST $CLI volume set $V0 performance.stat-prefetch off;</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+## Mount FUSE with caching disabled</div><div class='add'>+TEST glusterfs --entry-timeout=0 --attribute-timeout=0 -s $H0 --volfile-id $V0 $M0;</div><div class='add'>+</div><div class='add'>+dd of=$M0/a if=/dev/urandom bs=1024k count=1 2&gt;&amp;1 &gt; /dev/null</div><div class='add'>+B0_hiphenated=`echo $B0 | tr '/' '-'`</div><div class='add'>+## Bring a brick down</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}1</div><div class='add'>+## Rewrite the file</div><div class='add'>+dd of=$M0/a if=/dev/urandom bs=1024k count=1 2&gt;&amp;1 &gt; /dev/null</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+## Wait for the brick to give CHILD_UP in client protocol</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status $V0 0</div><div class='add'>+md5offile2=`md5sum $B0/${V0}2/a | awk '{print $1}'`</div><div class='add'>+</div><div class='add'>+##trigger self-heal</div><div class='add'>+ls -l $M0/a</div><div class='add'>+</div><div class='add'>+EXPECT "$md5offile2" echo `md5sum $B0/${V0}1/a | awk '{print $1}'`</div><div class='add'>+</div><div class='add'>+## Finish up</div><div class='add'>+TEST $CLI volume stop $V0;</div><div class='add'>+TEST $CLI volume delete $V0;</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/glusterfs/bug-867253.t b/tests/bugs/glusterfs/bug-867253.t<br/>new file mode 100644<br/>index 00000000000..8c3c39baace<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/glusterfs/bug-867253.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/glusterfs/bug-867253.t</a></div><div class='hunk'>@@ -0,0 +1,64 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+. $(dirname $0)/../../nfs.rc</div><div class='add'>+</div><div class='add'>+#G_TESTDEF_TEST_STATUS_CENTOS6=NFS_TEST</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+function file_count()</div><div class='add'>+{</div><div class='add'>+        val=1</div><div class='add'>+</div><div class='add'>+        if [ "$1" == "0" ]</div><div class='add'>+        then</div><div class='add'>+                if [ "$2" == "0" ]</div><div class='add'>+                then</div><div class='add'>+                        val=0</div><div class='add'>+                fi</div><div class='add'>+        fi</div><div class='add'>+        echo $val</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+BRICK_COUNT=2</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/${V0}0 $H0:$B0/${V0}1</div><div class='add'>+TEST $CLI volume set $V0 nfs.disable false</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $NFS_EXPORT_TIMEOUT "1" is_nfs_export_available;</div><div class='add'>+## Mount nfs, with nocache option</div><div class='add'>+TEST mount_nfs $H0:/$V0 $M0 nolock,noac;</div><div class='add'>+</div><div class='add'>+touch $M0/files{1..1000};</div><div class='add'>+</div><div class='add'>+# Kill a brick process</div><div class='add'>+kill_brick $V0 $H0 $B0/${V0}0</div><div class='add'>+</div><div class='add'>+drop_cache $M0</div><div class='add'>+</div><div class='add'>+ls -l $M0 &gt;/dev/null;</div><div class='add'>+</div><div class='add'>+NEW_FILE_COUNT=`echo $?`;</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+</div><div class='add'>+# Kill a brick process</div><div class='add'>+kill_brick $V0 $H0 $B0/${V0}1</div><div class='add'>+</div><div class='add'>+drop_cache $M0</div><div class='add'>+</div><div class='add'>+ls -l $M0 &gt;/dev/null;</div><div class='add'>+</div><div class='add'>+NEW_FILE_COUNT1=`echo $?`;</div><div class='add'>+</div><div class='add'>+EXPECT "0" file_count $NEW_FILE_COUNT $NEW_FILE_COUNT1</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/bugs/glusterfs/bug-869724.t b/tests/bugs/glusterfs/bug-869724.t<br/>new file mode 100644<br/>index 00000000000..ca5bb17081c<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/glusterfs/bug-869724.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/glusterfs/bug-869724.t</a></div><div class='hunk'>@@ -0,0 +1,37 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+## Start and create a volume</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/${V0}1;</div><div class='add'>+</div><div class='add'>+## Verify volume is is created</div><div class='add'>+EXPECT "$V0" volinfo_field $V0 'Volume Name';</div><div class='add'>+EXPECT 'Created' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+## Start volume and verify</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+EXPECT 'Started' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+## Make volume tightly consistent for metdata</div><div class='add'>+TEST $CLI volume set $V0 performance.stat-prefetch off;</div><div class='add'>+</div><div class='add'>+## Mount FUSE with caching disabled</div><div class='add'>+TEST glusterfs --entry-timeout=0 --attribute-timeout=0 -s $H0 --volfile-id $V0 $M0;</div><div class='add'>+</div><div class='add'>+touch $M0/test;</div><div class='add'>+build_tester $(dirname $0)/getlk_owner.c</div><div class='add'>+</div><div class='add'>+TEST $(dirname $0)/getlk_owner $M0/test;</div><div class='add'>+</div><div class='add'>+rm -f $(dirname $0)/getlk_owner</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='head'>diff --git a/tests/bugs/glusterfs/bug-872923.t b/tests/bugs/glusterfs/bug-872923.t<br/>new file mode 100755<br/>index 00000000000..00e02c89cbe<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/glusterfs/bug-872923.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/glusterfs/bug-872923.t</a></div><div class='hunk'>@@ -0,0 +1,59 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+. $(dirname $0)/../../nfs.rc</div><div class='add'>+</div><div class='add'>+#G_TESTDEF_TEST_STATUS_CENTOS6=NFS_TEST</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume info</div><div class='add'>+TEST $CLI volume create $V0 replica 2 $H0:$B0/brick0 $H0:$B0/brick1</div><div class='add'>+TEST $CLI volume set $V0 nfs.disable false</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $NFS_EXPORT_TIMEOUT "1" is_nfs_export_available;</div><div class='add'>+TEST mount_nfs $H0:/$V0 $N0 nolock</div><div class='add'>+</div><div class='add'>+cd $N0</div><div class='add'>+mkdir test_hardlink_self_heal;</div><div class='add'>+cd test_hardlink_self_heal;</div><div class='add'>+</div><div class='add'>+for i in `seq 1 5`;</div><div class='add'>+do</div><div class='add'>+    mkdir dir.$i;</div><div class='add'>+    for j in `seq 1 10`;</div><div class='add'>+    do</div><div class='add'>+        dd if=/dev/zero of=dir.$i/file.$j bs=1k count=$j &gt; /dev/null 2&gt;&amp;1;</div><div class='add'>+    done;</div><div class='add'>+done;</div><div class='add'>+</div><div class='add'>+cd ..</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/brick0</div><div class='add'>+cd test_hardlink_self_heal;</div><div class='add'>+</div><div class='add'>+RET=0</div><div class='add'>+for i in `seq 1 5`;</div><div class='add'>+do</div><div class='add'>+    for j in `seq 1 10`;</div><div class='add'>+    do</div><div class='add'>+        ln dir.$i/file.$j dir.$i/link_file.$j &gt; /dev/null 2&gt;&amp;1;</div><div class='add'>+        RET=$?</div><div class='add'>+        if [ $RET -ne 0 ]; then</div><div class='add'>+           break;</div><div class='add'>+        fi</div><div class='add'>+    done ;</div><div class='add'>+    if [ $RET -ne 0 ]; then</div><div class='add'>+        break;</div><div class='add'>+    fi</div><div class='add'>+done;</div><div class='add'>+</div><div class='add'>+cd</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $N0</div><div class='add'>+</div><div class='add'>+EXPECT "0" echo $RET;</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/glusterfs/bug-873962-spb.t b/tests/bugs/glusterfs/bug-873962-spb.t<br/>new file mode 100644<br/>index 00000000000..db71cc0f6fe<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/glusterfs/bug-873962-spb.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/glusterfs/bug-873962-spb.t</a></div><div class='hunk'>@@ -0,0 +1,40 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 replica 2 $H0:$B0/${V0}{0,1}</div><div class='add'>+TEST $CLI volume set $V0 cluster.self-heal-daemon off</div><div class='add'>+TEST $CLI volume set $V0 performance.quick-read off</div><div class='add'>+TEST $CLI volume set $V0 performance.io-cache off</div><div class='add'>+TEST $CLI volume set $V0 performance.write-behind off</div><div class='add'>+TEST $CLI volume set $V0 performance.stat-prefetch off</div><div class='add'>+TEST $CLI volume set $V0 performance.read-ahead off</div><div class='add'>+TEST $CLI volume set $V0 performance.open-behind off</div><div class='add'>+TEST $CLI volume set $V0 cluster.background-self-heal-count 0</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+TEST glusterfs --entry-timeout=0 --attribute-timeout=0 -s $H0 --volfile-id=$V0 $M0 --direct-io-mode=enable</div><div class='add'>+touch $M0/a</div><div class='add'>+</div><div class='add'>+exec 5&lt;$M0/a</div><div class='add'>+</div><div class='add'>+kill_brick $V0 $H0 $B0/${V0}0</div><div class='add'>+echo "hi" &gt; $M0/a</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status $V0 0</div><div class='add'>+</div><div class='add'>+kill_brick $V0 $H0 $B0/${V0}1</div><div class='add'>+echo "bye" &gt; $M0/a</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status $V0 1</div><div class='add'>+</div><div class='add'>+TEST ! cat $M0/a #To mark split-brain</div><div class='add'>+</div><div class='add'>+TEST ! read -u 5 line</div><div class='add'>+exec 5&lt;&amp;-</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/glusterfs/bug-873962.t b/tests/bugs/glusterfs/bug-873962.t<br/>new file mode 100755<br/>index 00000000000..7faa9998159<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/glusterfs/bug-873962.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/glusterfs/bug-873962.t</a></div><div class='hunk'>@@ -0,0 +1,107 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+#AFR TEST-IDENTIFIER SPLIT-BRAIN</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume info;</div><div class='add'>+</div><div class='add'>+B0_hiphenated=`echo $B0 | tr '/' '-'`</div><div class='add'>+TEST $CLI volume create $V0 replica 2 $H0:$B0/${V0}{1,2}</div><div class='add'>+</div><div class='add'>+# If we allow self-heal to happen in the background, we'll get spurious</div><div class='add'>+# failures - especially at the point labeled "FAIL HERE" but</div><div class='add'>+# occasionally elsewhere.  This behavior is very timing-dependent.  It</div><div class='add'>+# doesn't show up in Jenkins, but it does on JD's and KP's machines, and</div><div class='add'>+# it got sharply worse because of an unrelated fsync change (6ae6f3d)</div><div class='add'>+# which changed timing.  Putting anything at the FAIL HERE marker tends</div><div class='add'>+# to make it go away most of the time on affected machines, even if the</div><div class='add'>+# "anything" is unrelated.</div><div class='add'>+#</div><div class='add'>+# What's going on is that the I/O on the first mountpoint is allowed to</div><div class='add'>+# complete even though self-heal is still in progress and the state on</div><div class='add'>+# disk does not reflect its result.  In fact, the state changes during</div><div class='add'>+# self-heal create the appearance of split brain when the second I/O</div><div class='add'>+# comes in, so that fails even though we haven't actually been in split</div><div class='add'>+# brain since the manual xattr operations.  By disallowing background</div><div class='add'>+# self-heal, we ensure that the second I/O can't happen before self-heal</div><div class='add'>+# is complete, because it has to follow the first I/O which now has to</div><div class='add'>+# follow self-heal.</div><div class='add'>+TEST $CLI volume set $V0 cluster.background-self-heal-count 0</div><div class='add'>+</div><div class='add'>+#Make sure self-heal is not triggered when the bricks are re-started</div><div class='add'>+TEST $CLI volume set $V0 cluster.self-heal-daemon off</div><div class='add'>+TEST $CLI volume set $V0 performance.stat-prefetch off</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+TEST glusterfs --entry-timeout=0 --attribute-timeout=0 -s $H0 --volfile-id=$V0 $M0 --direct-io-mode=enable</div><div class='add'>+TEST touch $M0/a</div><div class='add'>+TEST touch $M0/b</div><div class='add'>+TEST touch $M0/c</div><div class='add'>+TEST touch $M0/d</div><div class='add'>+echo "1" &gt; $M0/b</div><div class='add'>+echo "1" &gt; $M0/d</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}2</div><div class='add'>+echo "1" &gt; $M0/a</div><div class='add'>+echo "1" &gt; $M0/c</div><div class='add'>+TEST setfattr -n trusted.mdata -v abc $M0/b</div><div class='add'>+TEST setfattr -n trusted.mdata -v abc $M0/d</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status $V0 1</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}1</div><div class='add'>+echo "2" &gt; $M0/a</div><div class='add'>+echo "2" &gt; $M0/c</div><div class='add'>+TEST setfattr -n trusted.mdata -v def $M0/b</div><div class='add'>+TEST setfattr -n trusted.mdata -v def $M0/d</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status $V0 0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status $V0 1</div><div class='add'>+</div><div class='add'>+TEST glusterfs --entry-timeout=0 --attribute-timeout=0 -s $H0 --volfile-id=$V0 $M1 --direct-io-mode=enable</div><div class='add'>+</div><div class='add'>+#Files are in split-brain, so open should fail</div><div class='add'>+TEST ! cat $M0/a;</div><div class='add'>+TEST ! cat $M1/a;</div><div class='add'>+TEST ! cat $M0/b;</div><div class='add'>+TEST ! cat $M1/b;</div><div class='add'>+</div><div class='add'>+#Reset split-brain status</div><div class='add'>+TEST setfattr -n trusted.afr.$V0-client-1 -v 0x000000000000000000000000 $B0/${V0}1/a;</div><div class='add'>+TEST setfattr -n trusted.afr.$V0-client-1 -v 0x000000000000000000000000 $B0/${V0}1/b;</div><div class='add'>+</div><div class='add'>+#The operations should do self-heal and give correct output</div><div class='add'>+EXPECT "2" cat $M0/a;</div><div class='add'>+# FAIL HERE - see comment about cluster.self-heal-background-count above.</div><div class='add'>+EXPECT "2" cat $M1/a;</div><div class='add'>+TEST dd if=$M0/b of=/dev/null bs=1024k</div><div class='add'>+EXPECT "def" getfattr -n trusted.mdata --only-values $M0/b 2&gt;/dev/null</div><div class='add'>+EXPECT "def" getfattr -n trusted.mdata --only-values $M1/b 2&gt;/dev/null</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M1</div><div class='add'>+</div><div class='add'>+TEST $CLI volume set $V0 cluster.data-self-heal off</div><div class='add'>+TEST $CLI volume set $V0 cluster.metadata-self-heal off</div><div class='add'>+</div><div class='add'>+TEST glusterfs --entry-timeout=0 --attribute-timeout=0 -s $H0 --volfile-id=$V0 $M0 --direct-io-mode=enable</div><div class='add'>+TEST glusterfs --entry-timeout=0 --attribute-timeout=0 -s $H0 --volfile-id=$V0 $M1 --direct-io-mode=enable</div><div class='add'>+</div><div class='add'>+#Files are in split-brain, so open should fail</div><div class='add'>+TEST ! cat $M0/c</div><div class='add'>+TEST ! cat $M1/c</div><div class='add'>+TEST ! cat $M0/d</div><div class='add'>+TEST ! cat $M1/d</div><div class='add'>+</div><div class='add'>+TEST setfattr -n trusted.afr.$V0-client-1 -v 0x000000000000000000000000 $B0/${V0}1/c</div><div class='add'>+TEST setfattr -n trusted.afr.$V0-client-1 -v 0x000000000000000000000000 $B0/${V0}1/d</div><div class='add'>+</div><div class='add'>+#The operations should NOT do self-heal but give correct output</div><div class='add'>+EXPECT "2" cat $M0/c</div><div class='add'>+EXPECT "2" cat $M1/c</div><div class='add'>+EXPECT "1" cat $M0/d</div><div class='add'>+EXPECT "1" cat $M1/d</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/glusterfs/bug-879490.t b/tests/bugs/glusterfs/bug-879490.t<br/>new file mode 100755<br/>index 00000000000..fb8d4263919<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/glusterfs/bug-879490.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/glusterfs/bug-879490.t</a></div><div class='hunk'>@@ -0,0 +1,37 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+## Start and create a volume</div><div class='add'>+TEST glusterd;</div><div class='add'>+TEST pidof glusterd;</div><div class='add'>+TEST $CLI volume info;</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 replica 3 $H0:$B0/${V0}{1,2,3,4,5,6};</div><div class='add'>+</div><div class='add'>+## Verify volume is is created</div><div class='add'>+EXPECT "$V0" volinfo_field $V0 'Volume Name';</div><div class='add'>+EXPECT 'Created' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+## Start volume and verify</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+EXPECT 'Started' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+function peer_probe()</div><div class='add'>+{</div><div class='add'>+    $CLI peer probe a.b.c.d --xml | xmllint --format - | grep "&lt;opErrstr&gt;"</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+EXPECT "  &lt;opErrstr&gt;Probe returned with Transport endpoint is not connected&lt;/opErrstr&gt;" peer_probe</div><div class='add'>+</div><div class='add'>+## Finish up</div><div class='add'>+TEST $CLI volume stop $V0;</div><div class='add'>+EXPECT 'Stopped' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+TEST $CLI volume delete $V0;</div><div class='add'>+TEST ! $CLI volume info $V0;</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/glusterfs/bug-879494.t b/tests/bugs/glusterfs/bug-879494.t<br/>new file mode 100755<br/>index 00000000000..12ee466b33a<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/glusterfs/bug-879494.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/glusterfs/bug-879494.t</a></div><div class='hunk'>@@ -0,0 +1,37 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+## Start and create a volume</div><div class='add'>+TEST glusterd;</div><div class='add'>+TEST pidof glusterd;</div><div class='add'>+TEST $CLI volume info;</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 replica 3 $H0:$B0/${V0}{1,2,3,4,5,6};</div><div class='add'>+</div><div class='add'>+## Verify volume is is created</div><div class='add'>+EXPECT "$V0" volinfo_field $V0 'Volume Name';</div><div class='add'>+EXPECT 'Created' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+## Start volume and verify</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+EXPECT 'Started' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+function peer_probe()</div><div class='add'>+{</div><div class='add'>+    $CLI peer detach a.b.c.d --xml | xmllint --format - | grep "&lt;opErrstr&gt;"</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+EXPECT "  &lt;opErrstr&gt;a.b.c.d is not part of cluster&lt;/opErrstr&gt;" peer_probe</div><div class='add'>+</div><div class='add'>+## Finish up</div><div class='add'>+TEST $CLI volume stop $V0;</div><div class='add'>+EXPECT 'Stopped' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+TEST $CLI volume delete $V0;</div><div class='add'>+TEST ! $CLI volume info $V0;</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/glusterfs/bug-892730.t b/tests/bugs/glusterfs/bug-892730.t<br/>new file mode 100755<br/>index 00000000000..a76961134c5<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/glusterfs/bug-892730.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/glusterfs/bug-892730.t</a></div><div class='hunk'>@@ -0,0 +1,77 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+#</div><div class='add'>+# Bug 892730 - Verify that afr handles EIO errors from the brick properly.</div><div class='add'>+#</div><div class='add'>+# The associated bug describes a problem where EIO errors returned from the</div><div class='add'>+# local filesystem of a brick that is part of a replica volume are exposed to</div><div class='add'>+# the user. This test simulates such failures and verifies that the volume</div><div class='add'>+# operates as expected.</div><div class='add'>+#</div><div class='add'>+########</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST mkdir -p $B0/test{1,2}</div><div class='add'>+</div><div class='add'>+# The graph is a two brick replica with error-gen enabled on the second brick</div><div class='add'>+# and configured to return EIO lookup errors 100% of the time. This simulates</div><div class='add'>+# a brick with a crashed or shut down local filesystem. Note that the order in</div><div class='add'>+# which errors occur is a factor in reproducing the original bug (error-gen</div><div class='add'>+# must be enabled in the second brick for this test to be effective).</div><div class='add'>+</div><div class='add'>+cat &gt; $B0/test.vol &lt;&lt;EOF</div><div class='add'>+volume test-posix-0</div><div class='add'>+    type storage/posix</div><div class='add'>+    option directory $B0/test1</div><div class='add'>+end-volume</div><div class='add'>+</div><div class='add'>+volume test-locks-0</div><div class='add'>+    type features/locks</div><div class='add'>+    subvolumes test-posix-0</div><div class='add'>+end-volume</div><div class='add'>+</div><div class='add'>+volume test-posix-1</div><div class='add'>+    type storage/posix</div><div class='add'>+    option directory $B0/test2</div><div class='add'>+end-volume</div><div class='add'>+</div><div class='add'>+volume test-error-1</div><div class='add'>+    type debug/error-gen</div><div class='add'>+    option failure 100</div><div class='add'>+    option enable lookup</div><div class='add'>+    option error-no EIO</div><div class='add'>+    subvolumes test-posix-1</div><div class='add'>+end-volume</div><div class='add'>+</div><div class='add'>+volume test-locks-1</div><div class='add'>+    type features/locks</div><div class='add'>+    subvolumes test-error-1</div><div class='add'>+end-volume</div><div class='add'>+</div><div class='add'>+volume test-replicate-0</div><div class='add'>+    type cluster/replicate</div><div class='add'>+    option background-self-heal-count 0</div><div class='add'>+    subvolumes test-locks-0 test-locks-1</div><div class='add'>+end-volume</div><div class='add'>+EOF</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+</div><div class='add'>+TEST glusterfs --volfile=$B0/test.vol --attribute-timeout=0 --entry-timeout=0 $M0</div><div class='add'>+</div><div class='add'>+# We should be able to create and remove a file without interference from the</div><div class='add'>+# "broken" brick.</div><div class='add'>+</div><div class='add'>+TEST touch $M0/file</div><div class='add'>+TEST rm $M0/file</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+</div><div class='add'>+rm -f $B0/test.vol</div><div class='add'>+rm -rf $B0/test1 $B0/test2</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='head'>diff --git a/tests/bugs/glusterfs/bug-893338.t b/tests/bugs/glusterfs/bug-893338.t<br/>new file mode 100644<br/>index 00000000000..b915d3e791e<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/glusterfs/bug-893338.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/glusterfs/bug-893338.t</a></div><div class='hunk'>@@ -0,0 +1,34 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+## Start and create a volume</div><div class='add'>+TEST glusterd;</div><div class='add'>+TEST pidof glusterd;</div><div class='add'>+TEST $CLI volume info;</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 replica 3 $H0:$B0/${V0}{1,2,3,4,5,6};</div><div class='add'>+</div><div class='add'>+## Verify volume is is created</div><div class='add'>+EXPECT "$V0" volinfo_field $V0 'Volume Name';</div><div class='add'>+EXPECT 'Created' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+## Start volume and verify</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+</div><div class='add'>+TEST glusterfs -s $H0 --volfile-id=$V0 $M0</div><div class='add'>+</div><div class='add'>+## Test for symlink success</div><div class='add'>+TEST touch $M0/reg_file</div><div class='add'>+TEST ln -s $M0/reg_file $M0/symlink</div><div class='add'>+</div><div class='add'>+## Finish up</div><div class='add'>+TEST $CLI volume stop $V0;</div><div class='add'>+EXPECT 'Stopped' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+TEST $CLI volume delete $V0;</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/glusterfs/bug-893378.t b/tests/bugs/glusterfs/bug-893378.t<br/>new file mode 100755<br/>index 00000000000..444dafb44bc<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/glusterfs/bug-893378.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/glusterfs/bug-893378.t</a></div><div class='hunk'>@@ -0,0 +1,75 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+BRICK_COUNT=3</div><div class='add'>+</div><div class='add'>+function file_has_linkfile()</div><div class='add'>+{</div><div class='add'>+        i=0</div><div class='add'>+        j=0</div><div class='add'>+        while [ $i -lt $BRICK_COUNT ]</div><div class='add'>+        do</div><div class='add'>+                stat=`stat $B0/${V0}$i/$1 2&gt;/dev/null`</div><div class='add'>+                if [ $? -eq 0 ]</div><div class='add'>+                then</div><div class='add'>+                        let j++</div><div class='add'>+                        let "BRICK${j}=$i"</div><div class='add'>+</div><div class='add'>+                fi</div><div class='add'>+                let i++</div><div class='add'>+        done</div><div class='add'>+        return $j</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function get_cached_brick()</div><div class='add'>+{</div><div class='add'>+        i=1</div><div class='add'>+        while [ $i -lt 3 ]</div><div class='add'>+        do</div><div class='add'>+                test=`getfattr -n trusted.glusterfs.dht.linkto -e text $B0/${V0}$BRICK$i 2&gt;&amp;1`</div><div class='add'>+                if [ $? -eq 1 ]</div><div class='add'>+                then</div><div class='add'>+                        cached=$BRICK"$i"</div><div class='add'>+                        i=$(( $i+3 ))</div><div class='add'>+                fi</div><div class='add'>+                let i++</div><div class='add'>+        done</div><div class='add'>+</div><div class='add'>+        return $cached</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/${V0}0 $H0:$B0/${V0}1 $H0:$B0/${V0}2</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+## Mount FUSE</div><div class='add'>+TEST glusterfs --attribute-timeout=0 --entry-timeout=0 -s $H0 --volfile-id $V0 $M0;</div><div class='add'>+</div><div class='add'>+## create a linkfile on subvolume 0</div><div class='add'>+TEST touch $M0/1</div><div class='add'>+TEST mv $M0/1 $M0/2</div><div class='add'>+</div><div class='add'>+file_has_linkfile 2</div><div class='add'>+has_link=$?</div><div class='add'>+if [ $has_link -eq 2 ]</div><div class='add'>+then</div><div class='add'>+        get_cached_brick</div><div class='add'>+        CACHED=$?</div><div class='add'>+        # Kill a brick process</div><div class='add'>+	kill_brick $V0 $H0 $B0/${V0}$CACHED</div><div class='add'>+fi</div><div class='add'>+</div><div class='add'>+## trigger a lookup</div><div class='add'>+ls -l $M0/2 2&gt;/dev/null</div><div class='add'>+</div><div class='add'>+## fail dd if file exists.</div><div class='add'>+</div><div class='add'>+dd if=/dev/zero of=$M0/2 bs=1 count=1 conv=excl 2&gt;/dev/null</div><div class='add'>+EXPECT "1" echo $?</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/glusterfs/bug-895235.t b/tests/bugs/glusterfs/bug-895235.t<br/>new file mode 100644<br/>index 00000000000..ac9caae9561<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/glusterfs/bug-895235.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/glusterfs/bug-895235.t</a></div><div class='hunk'>@@ -0,0 +1,23 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 replica 2 $H0:$B0/${V0}{0,1}</div><div class='add'>+TEST $CLI volume set $V0 ensure-durability off</div><div class='add'>+TEST $CLI volume set $V0 performance.write-behind off</div><div class='add'>+TEST $CLI volume set $V0 cluster.eager-lock off</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+TEST glusterfs --entry-timeout=0 --attribute-timeout=0 -s $H0 --volfile-id=$V0 $M0 --direct-io-mode=enable</div><div class='add'>+</div><div class='add'>+TEST gluster volume profile $V0 start</div><div class='add'>+TEST dd of=$M0/a if=/dev/zero bs=1024k count=1 oflag=append</div><div class='add'>+finodelk_max_latency=$($CLI volume profile $V0 info | grep FINODELK | awk 'BEGIN {max = 0} {if ($6 &gt; max) max=$6;} END {print max}' | cut -d. -f 1 | egrep "[0-9]{7,}")</div><div class='add'>+</div><div class='add'>+TEST [ -z $finodelk_max_latency ]</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/glusterfs/bug-896431.t b/tests/bugs/glusterfs/bug-896431.t<br/>new file mode 100755<br/>index 00000000000..61f71141713<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/glusterfs/bug-896431.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/glusterfs/bug-896431.t</a></div><div class='hunk'>@@ -0,0 +1,89 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+## Start and create a volume</div><div class='add'>+TEST glusterd;</div><div class='add'>+TEST pidof glusterd;</div><div class='add'>+TEST $CLI volume create $V0 replica 3 $H0:$B0/${V0}{1,2,3,4,5,6};</div><div class='add'>+</div><div class='add'>+## Verify volume is created</div><div class='add'>+EXPECT "$V0" volinfo_field $V0 'Volume Name';</div><div class='add'>+EXPECT 'Created' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+## Start volume and verify</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+EXPECT 'Started' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+## Setting cluster.subvols-per-directory as -5</div><div class='add'>+TEST ! $CLI volume set $V0 cluster.subvols-per-directory -5</div><div class='add'>+EXPECT '' volinfo_field $V0 'cluster.subvols-per-directory';</div><div class='add'>+TEST ! $CLI volume set $V0 subvols-per-directory -5</div><div class='add'>+EXPECT '' volinfo_field $V0 'cluster.subvols-per-directory';</div><div class='add'>+</div><div class='add'>+## Setting cluster.subvols-per-directory as 0</div><div class='add'>+TEST ! $CLI volume set $V0 cluster.subvols-per-directory 0</div><div class='add'>+EXPECT '' volinfo_field $V0 'cluster.subvols-per-directory';</div><div class='add'>+TEST ! $CLI volume set $V0 subvols-per-directory 0</div><div class='add'>+EXPECT '' volinfo_field $V0 'cluster.subvols-per-directory';</div><div class='add'>+</div><div class='add'>+## Setting cluster.subvols-per-directory as 4 (the total number of bricks)</div><div class='add'>+TEST ! $CLI volume set $V0 cluster.subvols-per-directory 4</div><div class='add'>+EXPECT '' volinfo_field $V0 'cluster.subvols-per-directory';</div><div class='add'>+TEST ! $CLI volume set $V0 subvols-per-directory 4</div><div class='add'>+EXPECT '' volinfo_field $V0 'cluster.subvols-per-directory';</div><div class='add'>+</div><div class='add'>+## Setting cluster.subvols-per-directory as 2 (the total number of subvolumes)</div><div class='add'>+TEST $CLI volume set $V0 cluster.subvols-per-directory 2</div><div class='add'>+EXPECT '2' volinfo_field $V0 'cluster.subvols-per-directory';</div><div class='add'>+</div><div class='add'>+## Setting cluster.subvols-per-directory as 1</div><div class='add'>+TEST $CLI volume set $V0 subvols-per-directory 1</div><div class='add'>+EXPECT '1' volinfo_field $V0 'cluster.subvols-per-directory';</div><div class='add'>+</div><div class='add'>+## Finish up</div><div class='add'>+TEST $CLI volume stop $V0;</div><div class='add'>+EXPECT 'Stopped' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+TEST $CLI volume delete $V0;</div><div class='add'>+TEST ! $CLI volume info $V0;</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+## Start and create a pure replicate volume</div><div class='add'>+TEST glusterd;</div><div class='add'>+TEST pidof glusterd;</div><div class='add'>+TEST $CLI volume create $V0 replica 8 $H0:$B0/${V0}{1,2,3,4,5,6,7,8};</div><div class='add'>+</div><div class='add'>+## Verify volume is created</div><div class='add'>+EXPECT "$V0" volinfo_field $V0 'Volume Name';</div><div class='add'>+EXPECT 'Created' volinfo_field $V0 'Status';</div><div class='add'>+EXPECT 'Replicate' volinfo_field $V0 'Type';</div><div class='add'>+</div><div class='add'>+## Start volume and verify</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+EXPECT 'Started' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+## Setting cluster.subvols-per-directory as 8 for a replicate volume</div><div class='add'>+TEST ! $CLI volume set $V0 cluster.subvols-per-directory 8</div><div class='add'>+EXPECT '' volinfo_field $V0 'cluster.subvols-per-directory';</div><div class='add'>+TEST ! $CLI volume set $V0 subvols-per-directory 8</div><div class='add'>+EXPECT '' volinfo_field $V0 'cluster.subvols-per-directory';</div><div class='add'>+</div><div class='add'>+## Setting cluster.subvols-per-directory as 1 for a replicate volume</div><div class='add'>+TEST $CLI volume set $V0 cluster.subvols-per-directory 1</div><div class='add'>+EXPECT '1' volinfo_field $V0 'cluster.subvols-per-directory';</div><div class='add'>+TEST $CLI volume set $V0 subvols-per-directory 1</div><div class='add'>+EXPECT '1' volinfo_field $V0 'cluster.subvols-per-directory';</div><div class='add'>+</div><div class='add'>+## Finish up</div><div class='add'>+TEST $CLI volume stop $V0;</div><div class='add'>+EXPECT 'Stopped' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+TEST $CLI volume delete $V0;</div><div class='add'>+TEST ! $CLI volume info $V0;</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/glusterfs/bug-902610.t b/tests/bugs/glusterfs/bug-902610.t<br/>new file mode 100755<br/>index 00000000000..112c947e116<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/glusterfs/bug-902610.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/glusterfs/bug-902610.t</a></div><div class='hunk'>@@ -0,0 +1,66 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+## Layout-spread set to 3, but subvols up are 2. So layout should split 50-50</div><div class='add'>+function get_layout()</div><div class='add'>+{</div><div class='add'>+        layout1=`getfattr -n trusted.glusterfs.dht -e hex $1 2&gt;&amp;1|grep dht |cut -d = -f2`</div><div class='add'>+	layout1_s=$(echo $layout1 | cut -c 19-26)</div><div class='add'>+	layout1_e=$(echo $layout1 | cut -c 27-34)</div><div class='add'>+	#echo "layout1 from $layout1_s to $layout1_e" &gt; /dev/tty</div><div class='add'>+        layout2=`getfattr -n trusted.glusterfs.dht -e hex $2 2&gt;&amp;1|grep dht |cut -d = -f2`</div><div class='add'>+	layout2_s=$(echo $layout2 | cut -c 19-26)</div><div class='add'>+	layout2_e=$(echo $layout2 | cut -c 27-34)</div><div class='add'>+	#echo "layout2 from $layout2_s to $layout2_e" &gt; /dev/tty</div><div class='add'>+</div><div class='add'>+	if [ x"$layout2_s" = x"00000000" ]; then</div><div class='add'>+		# Reverse so we only have the real logic in one place.</div><div class='add'>+		tmp_s=$layout1_s</div><div class='add'>+		tmp_e=$layout1_e</div><div class='add'>+		layout1_s=$layout2_s</div><div class='add'>+		layout1_e=$layout2_e</div><div class='add'>+		layout2_s=$tmp_s</div><div class='add'>+		layout2_e=$tmp_e</div><div class='add'>+	fi</div><div class='add'>+</div><div class='add'>+	# Figure out where the join point is.</div><div class='add'>+	target=$( $PYTHON -c "print('%08x' % (0x$layout1_e + 1))")</div><div class='add'>+	#echo "target for layout2 = $target" &gt; /dev/tty</div><div class='add'>+</div><div class='add'>+	# The second layout should cover everything that the first doesn't.</div><div class='add'>+	if [ x"$layout2_s" = x"$target" -a x"$layout2_e" = x"ffffffff" ]; then</div><div class='add'>+		return 0</div><div class='add'>+	fi</div><div class='add'>+</div><div class='add'>+	return 1</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+BRICK_COUNT=4</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/${V0}0 $H0:$B0/${V0}1 $H0:$B0/${V0}2 $H0:$B0/${V0}3</div><div class='add'>+## set subvols-per-dir option</div><div class='add'>+TEST $CLI volume set $V0 subvols-per-directory 3</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+## Mount FUSE</div><div class='add'>+TEST glusterfs -s $H0 --volfile-id $V0 $M0 --entry-timeout=0 --attribute-timeout=0;</div><div class='add'>+</div><div class='add'>+TEST ls -l $M0</div><div class='add'>+</div><div class='add'>+## kill 2 bricks to bring down available subvol &lt; spread count</div><div class='add'>+kill_brick $V0 $H0 $B0/${V0}2</div><div class='add'>+kill_brick $V0 $H0 $B0/${V0}3</div><div class='add'>+</div><div class='add'>+mkdir $M0/dir1 2&gt;/dev/null</div><div class='add'>+</div><div class='add'>+get_layout $B0/${V0}0/dir1 $B0/${V0}1/dir1</div><div class='add'>+EXPECT "0" echo $?</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/glusterfs/bug-906646.t b/tests/bugs/glusterfs/bug-906646.t<br/>new file mode 100644<br/>index 00000000000..37b8fe5c8eb<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/glusterfs/bug-906646.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/glusterfs/bug-906646.t</a></div><div class='hunk'>@@ -0,0 +1,97 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+REPLICA=2</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 replica $REPLICA $H0:$B0/${V0}-00 $H0:$B0/${V0}-01 $H0:$B0/${V0}-10 $H0:$B0/${V0}-11</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+TEST $CLI volume set $V0 cluster.background-self-heal-count 0</div><div class='add'>+</div><div class='add'>+## Mount FUSE with caching disabled</div><div class='add'>+TEST $GFS -s $H0 --volfile-id $V0 $M0;</div><div class='add'>+</div><div class='add'>+function xattr_query_check()</div><div class='add'>+{</div><div class='add'>+    local path=$1</div><div class='add'>+    local xa_name=$2</div><div class='add'>+</div><div class='add'>+    local ret=$(getfattr -n $xa_name $path 2&gt;&amp;1 | grep -o "$xa_name: No such attribute" | wc -l)</div><div class='add'>+    echo $ret</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function set_xattr()</div><div class='add'>+{</div><div class='add'>+    local path=$1</div><div class='add'>+    local xa_name=$2</div><div class='add'>+    local xa_val=$3</div><div class='add'>+</div><div class='add'>+    setfattr -n $xa_name -v $xa_val $path</div><div class='add'>+    echo $?</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function remove_xattr()</div><div class='add'>+{</div><div class='add'>+    local path=$1</div><div class='add'>+    local xa_name=$2</div><div class='add'>+</div><div class='add'>+    setfattr -x $xa_name $path</div><div class='add'>+    echo $?</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+f=f00f</div><div class='add'>+pth=$M0/$f</div><div class='add'>+</div><div class='add'>+TEST touch $pth</div><div class='add'>+</div><div class='add'>+# fetch backend paths</div><div class='add'>+backend_paths=`get_backend_paths $pth`</div><div class='add'>+</div><div class='add'>+# convert it into and array</div><div class='add'>+backend_paths_array=($backend_paths)</div><div class='add'>+</div><div class='add'>+# setxattr xattr for this file</div><div class='add'>+EXPECT 0 set_xattr $pth "trusted.name" "test"</div><div class='add'>+</div><div class='add'>+# confirm the set on backend</div><div class='add'>+EXPECT 0 xattr_query_check ${backend_paths_array[0]} "trusted.name"</div><div class='add'>+EXPECT 0 xattr_query_check ${backend_paths_array[1]} "trusted.name"</div><div class='add'>+</div><div class='add'>+brick_path=`echo ${backend_paths_array[0]} | sed -n 's/\(.*\)\/'$f'/\1/p'`</div><div class='add'>+brick_id=`$CLI volume info $V0 | grep "Brick[[:digit:]]" | grep -n $brick_path  | cut -f1 -d:`</div><div class='add'>+</div><div class='add'>+# Kill a brick process</div><div class='add'>+TEST kill_brick $V0 $H0 $brick_path</div><div class='add'>+</div><div class='add'>+# remove the xattr from the mount point</div><div class='add'>+EXPECT 0 remove_xattr $pth "trusted.name"</div><div class='add'>+</div><div class='add'>+# we killed ${backend_paths[0]} - so expect the xattr to be there</div><div class='add'>+# on the backend there</div><div class='add'>+EXPECT 0 xattr_query_check ${backend_paths_array[0]} "trusted.name"</div><div class='add'>+EXPECT 1 xattr_query_check ${backend_paths_array[1]} "trusted.name"</div><div class='add'>+</div><div class='add'>+# restart the brick process</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "Y" glustershd_up_status</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 1</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 2</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 3</div><div class='add'>+</div><div class='add'>+TEST $CLI volume heal $V0</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "0" get_pending_heal_count $V0</div><div class='add'>+# check backends - xattr should not be present anywhere</div><div class='add'>+EXPECT 1 xattr_query_check ${backend_paths_array[0]} "trusted.name"</div><div class='add'>+EXPECT 1 xattr_query_check ${backend_paths_array[1]} "trusted.name"</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/glusterfs/getlk_owner.c b/tests/bugs/glusterfs/getlk_owner.c<br/>new file mode 100644<br/>index 00000000000..cbe277318c1<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/glusterfs/getlk_owner.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/glusterfs/getlk_owner.c</a></div><div class='hunk'>@@ -0,0 +1,124 @@</div><div class='add'>+#include &lt;stdio.h&gt;</div><div class='add'>+#include &lt;unistd.h&gt;</div><div class='add'>+#include &lt;fcntl.h&gt;</div><div class='add'>+#include &lt;string.h&gt;</div><div class='add'>+</div><div class='add'>+#define GETLK_OWNER_CHECK(f, cp, label)                                        \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        switch (f.l_type) {                                                    \</div><div class='add'>+            case F_RDLCK:                                                      \</div><div class='add'>+            case F_WRLCK:                                                      \</div><div class='add'>+                ret = 1;                                                       \</div><div class='add'>+                goto label;                                                    \</div><div class='add'>+            case F_UNLCK:                                                      \</div><div class='add'>+                if (!are_flocks_sane(&amp;f, &amp;cp)) {                               \</div><div class='add'>+                    ret = 1;                                                   \</div><div class='add'>+                    goto label;                                                \</div><div class='add'>+                }                                                              \</div><div class='add'>+                break;                                                         \</div><div class='add'>+        }                                                                      \</div><div class='add'>+    } while (0)</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+flock_init(struct flock *f, short int type, off_t start, off_t len)</div><div class='add'>+{</div><div class='add'>+    f-&gt;l_type = type;</div><div class='add'>+    f-&gt;l_start = start;</div><div class='add'>+    f-&gt;l_len = len;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+flock_cp(struct flock *dst, struct flock *src)</div><div class='add'>+{</div><div class='add'>+    memcpy((void *)dst, (void *)src, sizeof(struct flock));</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+are_flocks_sane(struct flock *src, struct flock *cpy)</div><div class='add'>+{</div><div class='add'>+    return ((src-&gt;l_whence == cpy-&gt;l_whence) &amp;&amp;</div><div class='add'>+            (src-&gt;l_start == cpy-&gt;l_start) &amp;&amp; (src-&gt;l_len == cpy-&gt;l_len));</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+ * Test description:</div><div class='add'>+ * SETLK (0,3), F_WRLCK</div><div class='add'>+ * SETLK (3,3), F_WRLCK</div><div class='add'>+ *</div><div class='add'>+ * the following GETLK requests must return flock struct unmodified</div><div class='add'>+ * except for l_type to F_UNLCK</div><div class='add'>+ * GETLK (3,3), F_WRLCK</div><div class='add'>+ * GETLK (3,3), F_RDLCK</div><div class='add'>+ *</div><div class='add'>+ * */</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+main(int argc, char **argv)</div><div class='add'>+{</div><div class='add'>+    int fd = -1;</div><div class='add'>+    int ret = 1;</div><div class='add'>+    char *fname = NULL;</div><div class='add'>+    struct flock f = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    struct flock cp = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    if (argc &lt; 2)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    fname = argv[1];</div><div class='add'>+    fd = open(fname, O_RDWR);</div><div class='add'>+    if (fd == -1) {</div><div class='add'>+        perror("open");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    flock_init(&amp;f, F_WRLCK, 0, 3);</div><div class='add'>+    flock_cp(&amp;cp, &amp;f);</div><div class='add'>+    ret = fcntl(fd, F_SETLK, &amp;f);</div><div class='add'>+    if (ret) {</div><div class='add'>+        perror("fcntl");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    if (!are_flocks_sane(&amp;f, &amp;cp)) {</div><div class='add'>+        ret = 1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    flock_init(&amp;f, F_WRLCK, 3, 3);</div><div class='add'>+    flock_cp(&amp;cp, &amp;f);</div><div class='add'>+    ret = fcntl(fd, F_SETLK, &amp;f);</div><div class='add'>+    if (ret) {</div><div class='add'>+        perror("fcntl");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    if (!are_flocks_sane(&amp;f, &amp;cp)) {</div><div class='add'>+        ret = 1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    flock_init(&amp;f, F_WRLCK, 3, 3);</div><div class='add'>+    flock_cp(&amp;cp, &amp;f);</div><div class='add'>+    ret = fcntl(fd, F_GETLK, &amp;f);</div><div class='add'>+    if (ret) {</div><div class='add'>+        perror("fcntl");</div><div class='add'>+        return 1;</div><div class='add'>+    }</div><div class='add'>+    GETLK_OWNER_CHECK(f, cp, out);</div><div class='add'>+</div><div class='add'>+    flock_init(&amp;f, F_RDLCK, 3, 3);</div><div class='add'>+    flock_cp(&amp;cp, &amp;f);</div><div class='add'>+    ret = fcntl(fd, F_GETLK, &amp;f);</div><div class='add'>+    if (ret) {</div><div class='add'>+        perror("fcntl");</div><div class='add'>+        return 1;</div><div class='add'>+    }</div><div class='add'>+    GETLK_OWNER_CHECK(f, cp, out);</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (fd != -1)</div><div class='add'>+        close(fd);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='head'>diff --git a/tests/bugs/heal-symlinks.t b/tests/bugs/heal-symlinks.t<br/>new file mode 100644<br/>index 00000000000..ecd2b525be1<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/heal-symlinks.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/heal-symlinks.t</a></div><div class='hunk'>@@ -0,0 +1,65 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+. $(dirname $0)/../include.rc</div><div class='add'>+. $(dirname $0)/../volume.rc</div><div class='add'>+. $(dirname $0)/../afr.rc</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+###############################################################################</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 replica 3 $H0:$B0/${V0}{0,1,2}</div><div class='add'>+TEST $CLI volume set $V0 performance.stat-prefetch off</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+TEST glusterfs --volfile-id=$V0 --volfile-server=$H0 --entry-timeout=0 $M0;</div><div class='add'>+</div><div class='add'>+cd $M0</div><div class='add'>+TEST "echo hello_world &gt; FILE"</div><div class='add'>+TEST ln -s FILE SOFTLINK</div><div class='add'>+</div><div class='add'>+# Remove symlink only (not the .glusterfs entry) and trigger named heal.</div><div class='add'>+TEST rm -f $B0/${V0}2/SOFTLINK</div><div class='add'>+TEST stat SOFTLINK</div><div class='add'>+</div><div class='add'>+# To heal and clear new-entry mark on source bricks.</div><div class='add'>+TEST $CLI volume heal $V0</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "^0$" get_pending_heal_count $V0</div><div class='add'>+</div><div class='add'>+EXPECT 2 stat -c %h  $B0/${V0}2/SOFTLINK</div><div class='add'>+EXPECT "hello_world" cat $B0/${V0}2/SOFTLINK</div><div class='add'>+</div><div class='add'>+cd -</div><div class='add'>+cleanup</div><div class='add'>+###############################################################################</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 disperse 3 redundancy 1  $H0:$B0/${V0}{0,1,2}</div><div class='add'>+TEST $CLI volume set $V0 performance.stat-prefetch off</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+TEST glusterfs --volfile-id=$V0 --volfile-server=$H0 --entry-timeout=0 $M0;</div><div class='add'>+</div><div class='add'>+cd $M0</div><div class='add'>+TEST "echo hello_world &gt; FILE"</div><div class='add'>+TEST ln -s FILE SOFTLINK</div><div class='add'>+</div><div class='add'>+# Remove symlink only (not the .glusterfs entry) and trigger named heal.</div><div class='add'>+TEST rm -f $B0/${V0}2/SOFTLINK</div><div class='add'>+TEST stat SOFTLINK</div><div class='add'>+</div><div class='add'>+# To heal and clear new-entry mark on source bricks.</div><div class='add'>+TEST $CLI volume heal $V0</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "^0$" get_pending_heal_count $V0</div><div class='add'>+</div><div class='add'>+EXPECT 2 stat -c %h  $B0/${V0}2/SOFTLINK</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}0</div><div class='add'>+cd -</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+TEST glusterfs --volfile-id=$V0 --volfile-server=$H0 --entry-timeout=0 $M0;</div><div class='add'>+cd $M0</div><div class='add'>+EXPECT "hello_world" cat SOFTLINK</div><div class='add'>+</div><div class='add'>+cd -</div><div class='add'>+cleanup</div><div class='add'>+###############################################################################</div><div class='head'>diff --git a/tests/bugs/index/bug-1559004-EMLINK-handling.t b/tests/bugs/index/bug-1559004-EMLINK-handling.t<br/>new file mode 100644<br/>index 00000000000..5596fa56c4c<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/index/bug-1559004-EMLINK-handling.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/index/bug-1559004-EMLINK-handling.t</a></div><div class='hunk'>@@ -0,0 +1,91 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+. $(dirname $0)/../../afr.rc</div><div class='add'>+</div><div class='add'>+function create_fake_links() {</div><div class='add'>+        local dst="$1"</div><div class='add'>+        local dir="$2"</div><div class='add'>+        local end=0</div><div class='add'>+        local start=0</div><div class='add'>+        local src</div><div class='add'>+</div><div class='add'>+        src="$(ls ${dst}/.glusterfs/indices/${dir}/${dir}-* | head -1)"</div><div class='add'>+        mkdir -p ${dst}/.glusterfs/dummy/${dir}</div><div class='add'>+        while ln ${src} ${dst}/.glusterfs/dummy/${dir}/link-${end}; do</div><div class='add'>+                end="$((${end} + 1))"</div><div class='add'>+        done</div><div class='add'>+</div><div class='add'>+        if [[ ${end} -gt 50 ]]; then</div><div class='add'>+                start="$((${end} - 50))"</div><div class='add'>+        fi</div><div class='add'>+        if [[ ${end} -gt 0 ]]; then</div><div class='add'>+                end="$((${end} - 1))"</div><div class='add'>+        fi</div><div class='add'>+</div><div class='add'>+        for i in $(seq ${start} ${end}); do</div><div class='add'>+                rm -f ${dst}/.glusterfs/dummy/${dir}/link-${i}</div><div class='add'>+        done</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function count_fake_links() {</div><div class='add'>+        local dst="$1"</div><div class='add'>+        local dir="$2"</div><div class='add'>+</div><div class='add'>+        echo "$(find ${dst}/.glusterfs/dummy/${dir}/ -name "link-*" | wc -l)"</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume info</div><div class='add'>+</div><div class='add'>+TEST touch $B0/ext4-1</div><div class='add'>+TEST touch $B0/ext4-2</div><div class='add'>+TEST touch $B0/ext4-3</div><div class='add'>+TEST truncate -s 2GB $B0/ext4-1</div><div class='add'>+TEST truncate -s 2GB $B0/ext4-2</div><div class='add'>+TEST truncate -s 2GB $B0/ext4-3</div><div class='add'>+</div><div class='add'>+TEST mkfs.ext4 -F $B0/ext4-1</div><div class='add'>+TEST mkfs.ext4 -F $B0/ext4-2</div><div class='add'>+TEST mkfs.ext4 -F $B0/ext4-3</div><div class='add'>+TEST mkdir $B0/ext41</div><div class='add'>+TEST mkdir $B0/ext42</div><div class='add'>+TEST mkdir $B0/ext43</div><div class='add'>+TEST mount -t ext4 -o loop $B0/ext4-1 $B0/ext41</div><div class='add'>+TEST mount -t ext4 -o loop $B0/ext4-2 $B0/ext42</div><div class='add'>+TEST mount -t ext4 -o loop $B0/ext4-3 $B0/ext43</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 replica 3 $H0:$B0/ext4{1,2,3}</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+TEST $CLI volume heal $V0 granular-entry-heal enable</div><div class='add'>+TEST $GFS --volfile-id=$V0 --volfile-server=$H0 $M0</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/ext41</div><div class='add'>+</div><div class='add'>+# Make sure indices exist and are initialized</div><div class='add'>+TEST touch $M0/dummy</div><div class='add'>+</div><div class='add'>+# Create enough hard links on bricks to make it fail faster. This is much</div><div class='add'>+# faster than creating ~70000 files on a volume.</div><div class='add'>+create_fake_links $B0/ext42 xattrop &amp;</div><div class='add'>+create_fake_links $B0/ext42 entry-changes &amp;</div><div class='add'>+wait</div><div class='add'>+count_xattrop="$(count_fake_links $B0/ext42 xattrop)"</div><div class='add'>+count_entry="$(count_fake_links $B0/ext42 entry-changes)"</div><div class='add'>+</div><div class='add'>+TEST mkdir $M0/d{1..10}</div><div class='add'>+TEST touch $M0/d{1..10}/{1..10}</div><div class='add'>+</div><div class='add'>+#On ext4 max number of hardlinks is ~65k, so there should be 2 base index files</div><div class='add'>+EXPECT "^2$" echo $(ls $B0/ext42/.glusterfs/indices/xattrop | grep xattrop | wc -l)</div><div class='add'>+EXPECT "^2$" echo $(ls $B0/ext42/.glusterfs/indices/entry-changes | grep entry-changes | wc -l)</div><div class='add'>+</div><div class='add'>+#Number of hardlinks: count_xattrop/count_entry for fake links, 101 for files,</div><div class='add'>+# 10 for dirs and 2 for base-indices and root-dir for xattrop</div><div class='add'>+EXPECT "$((${count_xattrop} + 114))" echo $(ls -l $B0/ext42/.glusterfs/indices/xattrop | grep xattrop | awk '{sum+=$2} END{print sum}')</div><div class='add'>+EXPECT "$((${count_entry} + 113))" echo $(ls -l $B0/ext42/.glusterfs/indices/entry-changes | grep entry-changes | awk '{sum+=$2} END{print sum}')</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/bugs/io-cache/bug-858242.c b/tests/bugs/io-cache/bug-858242.c<br/>new file mode 100644<br/>index 00000000000..ac87a15533e<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/io-cache/bug-858242.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/io-cache/bug-858242.c</a></div><div class='hunk'>@@ -0,0 +1,84 @@</div><div class='add'>+#define _GNU_SOURCE</div><div class='add'>+</div><div class='add'>+#include &lt;stdio.h&gt;</div><div class='add'>+#include &lt;errno.h&gt;</div><div class='add'>+#include &lt;string.h&gt;</div><div class='add'>+#include &lt;sys/types.h&gt;</div><div class='add'>+#include &lt;sys/stat.h&gt;</div><div class='add'>+#include &lt;fcntl.h&gt;</div><div class='add'>+#include &lt;stdlib.h&gt;</div><div class='add'>+#include &lt;unistd.h&gt;</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+main(int argc, char *argv[])</div><div class='add'>+{</div><div class='add'>+    char *filename = NULL, *volname = NULL, *cmd = NULL;</div><div class='add'>+    char buffer[1024] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int fd = -1;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    struct stat statbuf = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    if (argc != 3) {</div><div class='add'>+        fprintf(stderr, "usage: %s &lt;file-name&gt; &lt;volname&gt;\n", argv[0]);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    filename = argv[1];</div><div class='add'>+    volname = argv[2];</div><div class='add'>+</div><div class='add'>+    fd = open(filename, O_RDWR | O_CREAT, 0);</div><div class='add'>+    if (fd &lt; 0) {</div><div class='add'>+        fprintf(stderr, "open (%s) failed (%s)\n", filename, strerror(errno));</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = write(fd, "test-content", 12);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(stderr, "write failed (%s)", strerror(errno));</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = fsync(fd);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(stderr, "fsync failed (%s)", strerror(errno));</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = fstat(fd, &amp;statbuf);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(stderr, "fstat failed (%s)", strerror(errno));</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = asprintf(&amp;cmd, "gluster --mode=script volume stop %s force", volname);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(stderr, "cannot construct cli command string (%s)",</div><div class='add'>+                strerror(errno));</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = system(cmd);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(stderr, "stopping volume (%s) failed", volname);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    sleep(3);</div><div class='add'>+</div><div class='add'>+    ret = read(fd, buffer, 1024);</div><div class='add'>+    if (ret &gt;= 0) {</div><div class='add'>+        fprintf(stderr,</div><div class='add'>+                "read should've returned error, "</div><div class='add'>+                "but is successful\n");</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='head'>diff --git a/tests/bugs/io-cache/bug-858242.t b/tests/bugs/io-cache/bug-858242.t<br/>new file mode 100755<br/>index 00000000000..0c8ffb6ab30<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/io-cache/bug-858242.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/io-cache/bug-858242.t</a></div><div class='hunk'>@@ -0,0 +1,28 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume info;</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/brick1;</div><div class='add'>+EXPECT 'Created' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+EXPECT 'Started' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+TEST $CLI volume set $V0 performance.quick-read off</div><div class='add'>+</div><div class='add'>+#mount on a random dir</div><div class='add'>+TEST glusterfs --entry-timeout=3600 --attribute-timeout=3600 -s $H0 --volfile-id=$V0 $M0 --direct-io-mode=yes</div><div class='add'>+</div><div class='add'>+build_tester $(dirname $0)/bug-858242.c</div><div class='add'>+</div><div class='add'>+TEST $(dirname $0)/bug-858242 $M0/testfile $V0</div><div class='add'>+</div><div class='add'>+TEST rm -rf $(dirname $0)/858242</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='head'>diff --git a/tests/bugs/io-cache/bug-read-hang.c b/tests/bugs/io-cache/bug-read-hang.c<br/>new file mode 100644<br/>index 00000000000..e1fae97e7e8<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/io-cache/bug-read-hang.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/io-cache/bug-read-hang.c</a></div><div class='hunk'>@@ -0,0 +1,125 @@</div><div class='add'>+#include &lt;glusterfs/api/glfs.h&gt;</div><div class='add'>+#include &lt;glusterfs/api/glfs-handles.h&gt;</div><div class='add'>+#include &lt;errno.h&gt;</div><div class='add'>+#include &lt;stdio.h&gt;</div><div class='add'>+#include &lt;stdlib.h&gt;</div><div class='add'>+#include &lt;string.h&gt;</div><div class='add'>+</div><div class='add'>+#define NO_INIT 1</div><div class='add'>+</div><div class='add'>+int count = 0;</div><div class='add'>+void</div><div class='add'>+read_cbk(glfs_fd_t *fd, ssize_t ret, void *data)</div><div class='add'>+{</div><div class='add'>+    count++;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+glfs_t *</div><div class='add'>+setup_new_client(char *hostname, char *volname, char *log_file, int flag)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+    glfs_t *fs = NULL;</div><div class='add'>+</div><div class='add'>+    fs = glfs_new(volname);</div><div class='add'>+    if (!fs) {</div><div class='add'>+        fprintf(stderr, "\nglfs_new: returned NULL (%s)\n", strerror(errno));</div><div class='add'>+        goto error;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = glfs_set_volfile_server(fs, "tcp", hostname, 24007);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(stderr, "\nglfs_set_volfile_server failed ret:%d (%s)\n", ret,</div><div class='add'>+                strerror(errno));</div><div class='add'>+        goto error;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = glfs_set_logging(fs, log_file, 7);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(stderr, "\nglfs_set_logging failed with ret: %d (%s)\n", ret,</div><div class='add'>+                strerror(errno));</div><div class='add'>+        goto error;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (flag == NO_INIT)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    ret = glfs_init(fs);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(stderr, "\nglfs_init failed with ret: %d (%s)\n", ret,</div><div class='add'>+                strerror(errno));</div><div class='add'>+        goto error;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return fs;</div><div class='add'>+error:</div><div class='add'>+    return NULL;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+main(int argc, char *argv[])</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+    glfs_t *fs = NULL;</div><div class='add'>+    struct glfs_fd *fd = NULL;</div><div class='add'>+    char *volname = NULL;</div><div class='add'>+    char *log_file = NULL;</div><div class='add'>+    char *hostname = NULL;</div><div class='add'>+    char *buf = NULL;</div><div class='add'>+    struct stat stat;</div><div class='add'>+</div><div class='add'>+    if (argc != 4) {</div><div class='add'>+        fprintf(</div><div class='add'>+            stderr,</div><div class='add'>+            "Expect following args %s &lt;hostname&gt; &lt;Vol&gt; &lt;log file location&gt;\n",</div><div class='add'>+            argv[0]);</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    hostname = argv[1];</div><div class='add'>+    volname = argv[2];</div><div class='add'>+    log_file = argv[3];</div><div class='add'>+</div><div class='add'>+    fs = setup_new_client(hostname, volname, log_file, 0);</div><div class='add'>+    if (!fs) {</div><div class='add'>+        fprintf(stderr, "\nsetup_new_client: returned NULL (%s)\n",</div><div class='add'>+                strerror(errno));</div><div class='add'>+        goto error;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    fd = glfs_opendir(fs, "/");</div><div class='add'>+    if (!fd) {</div><div class='add'>+        fprintf(stderr, "/: %s\n", strerror(errno));</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    glfs_readdirplus(fd, &amp;stat);</div><div class='add'>+</div><div class='add'>+    fd = glfs_open(fs, "/test", O_RDWR);</div><div class='add'>+    if (fd == NULL) {</div><div class='add'>+        fprintf(stderr, "glfs_open: returned NULL\n");</div><div class='add'>+        goto error;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    buf = (char *)malloc(5);</div><div class='add'>+</div><div class='add'>+    ret = glfs_pread(fd, buf, 5, 0, 0, NULL);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(stderr, "Read(%s): %d (%s)\n", "test", ret, strerror(errno));</div><div class='add'>+        return ret;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    free(buf);</div><div class='add'>+    glfs_close(fd);</div><div class='add'>+</div><div class='add'>+    ret = glfs_fini(fs);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(stderr, "glfs_fini failed with ret: %d (%s)\n", ret,</div><div class='add'>+                strerror(errno));</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+error:</div><div class='add'>+    return -1;</div><div class='add'>+}</div><div class='head'>diff --git a/tests/bugs/io-cache/bug-read-hang.t b/tests/bugs/io-cache/bug-read-hang.t<br/>new file mode 100755<br/>index 00000000000..f8efe281723<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/io-cache/bug-read-hang.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/io-cache/bug-read-hang.t</a></div><div class='hunk'>@@ -0,0 +1,34 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+#. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+#Basic checks</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume info</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 replica 2 $H0:$B0/${V0}{1..2};</div><div class='add'>+</div><div class='add'>+TEST $CLI volume set $V0 features.cache-invalidation on</div><div class='add'>+TEST $CLI volume set $V0 features.cache-invalidation-timeout 600</div><div class='add'>+TEST $CLI volume set $V0 performance.cache-invalidation on</div><div class='add'>+TEST $CLI volume set $V0 performance.md-cache-timeout 600</div><div class='add'>+TEST $CLI volume set $V0 performance.cache-samba-metadata on</div><div class='add'>+TEST $CLI volume set $V0 open-behind off</div><div class='add'>+</div><div class='add'>+logdir=`gluster --print-logdir`</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+TEST glusterfs --volfile-id=/$V0 --volfile-server=$H0 $M0</div><div class='add'>+echo "Hello" &gt; $M0/test</div><div class='add'>+</div><div class='add'>+TEST build_tester $(dirname $0)/bug-read-hang.c -lgfapi</div><div class='add'>+TEST $(dirname $0)/bug-read-hang $H0 $V0 $logdir/bug-read-hang.log</div><div class='add'>+</div><div class='add'>+cleanup_tester $(dirname $0)/bug-read-hang</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/io-stats/bug-1598548.t b/tests/bugs/io-stats/bug-1598548.t<br/>new file mode 100755<br/>index 00000000000..19b0c053d08<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/io-stats/bug-1598548.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/io-stats/bug-1598548.t</a></div><div class='hunk'>@@ -0,0 +1,41 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+. $(dirname $0)/../../nfs.rc</div><div class='add'>+</div><div class='add'>+checkdumpthread () {</div><div class='add'>+        local brick_pid=$(get_brick_pid $1 $2 $3)</div><div class='add'>+        local thread_count=$(gstack $brick_pid | grep -c _ios_dump_thread)</div><div class='add'>+        echo $thread_count</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/${V0}0</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+TEST $CLI volume profile $V0 start</div><div class='add'>+EXPECT 0 checkdumpthread $V0 $H0 $B0/${V0}0</div><div class='add'>+</div><div class='add'>+TEST $CLI volume set $V0 diagnostics.stats-dump-interval 3</div><div class='add'>+EXPECT 1 checkdumpthread $V0 $H0 $B0/${V0}0</div><div class='add'>+</div><div class='add'>+TEST $CLI volume set $V0 diagnostics.stats-dump-interval 10</div><div class='add'>+EXPECT 1 checkdumpthread $V0 $H0 $B0/${V0}0</div><div class='add'>+</div><div class='add'>+TEST $CLI volume set $V0 diagnostics.stats-dump-interval 0</div><div class='add'>+EXPECT 0 checkdumpthread $V0 $H0 $B0/${V0}0</div><div class='add'>+</div><div class='add'>+TEST $CLI volume set $V0 diagnostics.stats-dump-interval 7</div><div class='add'>+EXPECT 1 checkdumpthread $V0 $H0 $B0/${V0}0</div><div class='add'>+</div><div class='add'>+TEST $CLI volume set $V0 diagnostics.stats-dump-interval 0</div><div class='add'>+EXPECT 0 checkdumpthread $V0 $H0 $B0/${V0}0</div><div class='add'>+</div><div class='add'>+TEST $CLI volume set $V0 diagnostics.stats-dump-interval 11</div><div class='add'>+EXPECT 1 checkdumpthread $V0 $H0 $B0/${V0}0</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/logging/bug-823081.t b/tests/bugs/logging/bug-823081.t<br/>new file mode 100755<br/>index 00000000000..bd1965d2d49<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/logging/bug-823081.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/logging/bug-823081.t</a></div><div class='hunk'>@@ -0,0 +1,41 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+cmd_log_history="cmd_history.log"</div><div class='add'>+V1=patchy2</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+</div><div class='add'>+logdir=`gluster --print-logdir`</div><div class='add'>+function set_tail ()</div><div class='add'>+{</div><div class='add'>+        vol=$1;</div><div class='add'>+        tail_success="volume create $vol $H0:$B0/${vol}1 $H0:$B0/${vol}2 : SUCCESS"</div><div class='add'>+        tail_failure="volume create $vol $H0:$B0/${vol}1 $H0:$B0/${vol}2 : FAILED : Volume $vol already exists"</div><div class='add'>+        tail_success_force="volume create $vol $H0:$B0/${vol}1 $H0:$B0/${vol}2 force : SUCCESS"</div><div class='add'>+        tail_failure_force="volume create $vol $H0:$B0/${vol}1 $H0:$B0/${vol}2 force : FAILED : Volume $vol already exists"</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+set_tail $V0;</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/${V0}{1,2};</div><div class='add'>+tail=`tail -n 1 $logdir/$cmd_log_history | cut -d " " -f 6-`</div><div class='add'>+TEST [[ \"$tail\" == \"$tail_success\" ]]</div><div class='add'>+</div><div class='add'>+TEST ! $CLI volume create $V0 $H0:$B0/${V0}{1,2};</div><div class='add'>+tail=`tail -n 1 $logdir/$cmd_log_history | cut -d " " -f 6-`</div><div class='add'>+TEST [[ \"$tail\" == \"$tail_failure\" ]]</div><div class='add'>+</div><div class='add'>+set_tail $V1;</div><div class='add'>+TEST gluster volume create $V1 $H0:$B0/${V1}{1,2} force;</div><div class='add'>+tail=`tail -n 1 $logdir/$cmd_log_history | cut -d " " -f 6-`</div><div class='add'>+TEST [[ \"$tail\" == \"$tail_success_force\" ]]</div><div class='add'>+</div><div class='add'>+TEST ! gluster volume create $V1 $H0:$B0/${V1}{1,2} force;</div><div class='add'>+tail=`tail -n 1 $logdir/$cmd_log_history | cut -d " " -f 6-`</div><div class='add'>+TEST [[ \"$tail\" == \"$tail_failure_force\" ]]</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/md-cache/afr-stale-read.t b/tests/bugs/md-cache/afr-stale-read.t<br/>new file mode 100755<br/>index 00000000000..7cee5afe27e<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/md-cache/afr-stale-read.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/md-cache/afr-stale-read.t</a></div><div class='hunk'>@@ -0,0 +1,44 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+#. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+#Basic checks</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume info</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 replica 2 $H0:$B0/${V0}{1..2};</div><div class='add'>+</div><div class='add'>+TEST $CLI volume set $V0 features.cache-invalidation on</div><div class='add'>+TEST $CLI volume set $V0 features.cache-invalidation-timeout 600</div><div class='add'>+TEST $CLI volume set $V0 performance.cache-invalidation on</div><div class='add'>+TEST $CLI volume set $V0 performance.md-cache-timeout 600</div><div class='add'>+TEST $CLI volume set $V0 performance.cache-samba-metadata on</div><div class='add'>+TEST $CLI volume set $V0 cluster.self-heal-daemon off</div><div class='add'>+TEST $CLI volume set $V0 read-subvolume $V0-client-0</div><div class='add'>+TEST $CLI volume set $V0 performance.quick-read off</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+TEST glusterfs --volfile-id=/$V0 --volfile-server=$H0 $M0</div><div class='add'>+TEST glusterfs --volfile-id=/$V0 --volfile-server=$H0 $M1</div><div class='add'>+</div><div class='add'>+#Write some data from M0 and read it from M1,</div><div class='add'>+#so that M1 selects a read subvol, and caches the lookup</div><div class='add'>+TEST `echo "one" &gt; $M0/file1`</div><div class='add'>+EXPECT "one" cat $M1/file1</div><div class='add'>+</div><div class='add'>+#Fail few writes from M0 on brick-0, as a result of this failure</div><div class='add'>+#upcall in brick-0 will invalidate the read subvolume of M1.</div><div class='add'>+TEST chattr +i $B0/${V0}1/file1</div><div class='add'>+TEST `echo "two" &gt; $M0/file1`</div><div class='add'>+TEST `echo "three" &gt; $M0/file1`</div><div class='add'>+TEST `echo "four" &gt; $M0/file1`</div><div class='add'>+TEST `echo "five" &gt; $M0/file1`</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $MDC_TIMEOUT "five" cat $M1/file1</div><div class='add'>+TEST chattr -i $B0/${V0}1/file1</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/md-cache/bug-1211863.t b/tests/bugs/md-cache/bug-1211863.t<br/>new file mode 100755<br/>index 00000000000..ba9bde9fee8<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/md-cache/bug-1211863.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/md-cache/bug-1211863.t</a></div><div class='hunk'>@@ -0,0 +1,69 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+## 1. Start glusterd</div><div class='add'>+TEST glusterd;</div><div class='add'>+</div><div class='add'>+## 2. Lets create volume</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/${V0}{1,2,3};</div><div class='add'>+</div><div class='add'>+## 3. Start the volume</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+## 4. Enable the upcall xlator, and increase the md-cache timeout to max</div><div class='add'>+TEST $CLI volume set $V0 performance.md-cache-timeout 600</div><div class='add'>+TEST $CLI volume set $V0 performance.xattr-cache-list "user.*"</div><div class='add'>+</div><div class='add'>+## 6. Create two gluster mounts</div><div class='add'>+TEST glusterfs --volfile-id=/$V0 --volfile-server=$H0 $M0</div><div class='add'>+TEST glusterfs --volfile-id=/$V0 --volfile-server=$H0 $M1</div><div class='add'>+</div><div class='add'>+## 8. Create a file</div><div class='add'>+TEST touch $M0/file1</div><div class='add'>+</div><div class='add'>+## 9. Setxattr from mount-0</div><div class='add'>+TEST "setfattr -n user.DOSATTRIB -v "abc" $M0/file1"</div><div class='add'>+## 10. Getxattr from mount-1, this should return the correct value as it is a fresh getxattr</div><div class='add'>+TEST "getfattr -n user.DOSATTRIB $M1/file1 | grep -q abc"</div><div class='add'>+</div><div class='add'>+## 11. Now modify the same xattr from mount-0 again</div><div class='add'>+TEST "setfattr -n user.DOSATTRIB -v "xyz" $M0/file1"</div><div class='add'>+## 12. Since the xattr is already cached in mount-1 it returns the old xattr</div><div class='add'>+       #value, until the timeout (600)</div><div class='add'>+TEST "getfattr -n user.DOSATTRIB $M1/file1 | grep -q abc"</div><div class='add'>+</div><div class='add'>+## 13. Unmount to clean all the cache</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M1</div><div class='add'>+</div><div class='add'>+TEST $CLI volume set $V0 features.cache-invalidation on</div><div class='add'>+TEST $CLI volume set $V0 features.cache-invalidation-timeout 600</div><div class='add'>+TEST $CLI volume set $V0 performance.cache-invalidation on</div><div class='add'>+</div><div class='add'>+## 19. Restart the volume to restart the bick process</div><div class='add'>+TEST $CLI volume stop $V0</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+## 21. Create two gluster mounts</div><div class='add'>+TEST glusterfs --volfile-id=/$V0 --volfile-server=$H0 $M0</div><div class='add'>+TEST glusterfs --volfile-id=/$V0 --volfile-server=$H0 $M1</div><div class='add'>+</div><div class='add'>+## 23. Repeat the tests 11-14, but this time since cache invalidation is on,</div><div class='add'>+       #the getxattr will reflect the new value</div><div class='add'>+TEST "setfattr -n user.DOSATTRIB -v "abc" $M0/file1"</div><div class='add'>+TEST "getfattr -n user.DOSATTRIB $M1/file1 | grep -q abc"</div><div class='add'>+TEST "setfattr -n user.DOSATTRIB -v "xyz" $M0/file1"</div><div class='add'>+sleep 2; #There can be a very very small window where the next getxattr</div><div class='add'>+         #reaches md-cache, before the cache-invalidation caused by previous</div><div class='add'>+         #setxattr, reaches md-cache. Hence sleeping for 2 sec.</div><div class='add'>+         #Also it should not be &gt; 600.</div><div class='add'>+TEST "getfattr -n user.DOSATTRIB $M1/file1 | grep -q xyz"</div><div class='add'>+</div><div class='add'>+TEST $CLI volume set $V0 cache-samba-metadata off</div><div class='add'>+EXPECT 'off' volinfo_field $V0 'performance.cache-samba-metadata'</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/md-cache/bug-1211863_unlink.t b/tests/bugs/md-cache/bug-1211863_unlink.t<br/>new file mode 100755<br/>index 00000000000..34392ed919f<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/md-cache/bug-1211863_unlink.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/md-cache/bug-1211863_unlink.t</a></div><div class='hunk'>@@ -0,0 +1,49 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+## Start glusterd</div><div class='add'>+TEST glusterd;</div><div class='add'>+</div><div class='add'>+## Lets create volume</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/${V0}{1,2,3};</div><div class='add'>+</div><div class='add'>+## Start the volume</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+## Enable the upcall xlator, and increase the md-cache timeout to max</div><div class='add'>+TEST $CLI volume set $V0 features.cache-invalidation on</div><div class='add'>+TEST $CLI volume set $V0 features.cache-invalidation-timeout 600</div><div class='add'>+TEST $CLI volume set $V0 performance.cache-invalidation on</div><div class='add'>+TEST $CLI volume set $V0 performance.md-cache-timeout 600</div><div class='add'>+TEST $CLI volume set $V0 performance.cache-samba-metadata on</div><div class='add'>+</div><div class='add'>+## Create two gluster mounts</div><div class='add'>+TEST glusterfs --volfile-id=/$V0 --volfile-server=$H0 $M0</div><div class='add'>+TEST glusterfs --volfile-id=/$V0 --volfile-server=$H0 $M1</div><div class='add'>+</div><div class='add'>+## Create files and directories from M0</div><div class='add'>+TEST mkdir $M0/dir1</div><div class='add'>+TEST touch $M0/dir1/file{1..5}</div><div class='add'>+</div><div class='add'>+## Lookup few files from M1, so that md-cache cahces</div><div class='add'>+TEST ls -l $M1/dir1/file2</div><div class='add'>+TEST ls -l $M1/dir1/file3</div><div class='add'>+</div><div class='add'>+## Remove the looked up file from M0</div><div class='add'>+TEST rm $M0/dir1/file2</div><div class='add'>+TEST mv $M0/dir1/file3 $M0/dir1/file6</div><div class='add'>+</div><div class='add'>+## Check if the files are not visible from both M0 and M1</div><div class='add'>+EXPECT_WITHIN $MDC_TIMEOUT "N" path_exists $M0/dir1/file2</div><div class='add'>+EXPECT_WITHIN $MDC_TIMEOUT "N" path_exists $M0/dir1/file3</div><div class='add'>+EXPECT_WITHIN $MDC_TIMEOUT "Y" path_exists $M0/dir1/file6</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $MDC_TIMEOUT "N" path_exists $M1/dir1/file2</div><div class='add'>+EXPECT_WITHIN $MDC_TIMEOUT "N" path_exists $M1/dir1/file3</div><div class='add'>+EXPECT_WITHIN $MDC_TIMEOUT "Y" path_exists $M1/dir1/file6</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/md-cache/bug-1476324.t b/tests/bugs/md-cache/bug-1476324.t<br/>new file mode 100644<br/>index 00000000000..c34f412a15e<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/md-cache/bug-1476324.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/md-cache/bug-1476324.t</a></div><div class='hunk'>@@ -0,0 +1,27 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd;</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/${V0}{1,2,3};</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+TEST $CLI volume set $V0 performance.md-cache-timeout 600</div><div class='add'>+TEST $CLI volume set $V0 performance.cache-samba-metadata on</div><div class='add'>+</div><div class='add'>+TEST glusterfs --volfile-id=/$V0 --volfile-server=$H0 $M0</div><div class='add'>+</div><div class='add'>+TEST touch $M0/file1</div><div class='add'>+</div><div class='add'>+TEST "setfattr -n user.DOSATTRIB -v 0sAAOW $M0/file1"</div><div class='add'>+TEST "getfattr -n user.DOSATTRIB $M0/file1 -e base64 | grep -q 0sAAOW"</div><div class='add'>+</div><div class='add'>+TEST "setfattr -n user.DOSATTRIB -v 0x00ff $M0/file1"</div><div class='add'>+TEST "getfattr -n user.DOSATTRIB $M0/file1 -e hex | grep -q 0x00ff"</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/md-cache/bug-1632503.t b/tests/bugs/md-cache/bug-1632503.t<br/>new file mode 100755<br/>index 00000000000..aeb57f65639<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/md-cache/bug-1632503.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/md-cache/bug-1632503.t</a></div><div class='hunk'>@@ -0,0 +1,24 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+TESTS_EXPECTED_IN_LOOP=5</div><div class='add'>+</div><div class='add'>+TEST glusterd;</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/${V0}{1,2,3};</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+TEST $CLI volume set $V0 performance.md-cache-timeout 600</div><div class='add'>+TEST $CLI volume set $V0 performance.md-cache-statfs on</div><div class='add'>+</div><div class='add'>+TEST glusterfs --volfile-id=/$V0 --volfile-server=$H0 $M0</div><div class='add'>+</div><div class='add'>+for i in $(seq 1 5); do</div><div class='add'>+    TEST_IN_LOOP df $M0;</div><div class='add'>+done</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/md-cache/bug-1726205.t b/tests/bugs/md-cache/bug-1726205.t<br/>new file mode 100644<br/>index 00000000000..795130e9bd8<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/md-cache/bug-1726205.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/md-cache/bug-1726205.t</a></div><div class='hunk'>@@ -0,0 +1,22 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd;</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/${V0}{1,2,3};</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+TEST $CLI volume set $V0 group samba</div><div class='add'>+</div><div class='add'>+TEST $GFS --volfile-id=/$V0 --volfile-server=$H0 $M0</div><div class='add'>+</div><div class='add'>+TEST touch $M0/file</div><div class='add'>+TEST "setfattr -n "user.DosStream.Zone.Identifier:\$DATA" -v '\0' $M0/file"</div><div class='add'>+TEST "getfattr -n "user.DosStream.Zone.Identifier:\$DATA" -e hex $M0/file | grep -q 0x00"</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/md-cache/setxattr-prepoststat.t b/tests/bugs/md-cache/setxattr-prepoststat.t<br/>new file mode 100755<br/>index 00000000000..01fa768299c<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/md-cache/setxattr-prepoststat.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/md-cache/setxattr-prepoststat.t</a></div><div class='hunk'>@@ -0,0 +1,38 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+## 1. Start glusterd</div><div class='add'>+TEST glusterd;</div><div class='add'>+</div><div class='add'>+## 2. Lets create volume</div><div class='add'>+TEST $CLI volume create $V0 disperse 6 redundancy 2 $H0:$B0/${V0}{0..5}</div><div class='add'>+</div><div class='add'>+TEST $CLI volume set $V0 group metadata-cache</div><div class='add'>+TEST $CLI volume set $V0 performance.xattr-cache-list "user.*"</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+TEST glusterfs --volfile-id=/$V0 --volfile-server=$H0 $M0</div><div class='add'>+TEST glusterfs --volfile-id=/$V0 --volfile-server=$H0 $M1</div><div class='add'>+</div><div class='add'>+TEST touch $M0/file1</div><div class='add'>+TEST `echo "abakjshdjahskjdhakjhdskjac" &gt;&gt; $M0/file1`</div><div class='add'>+size=`stat -c '%s' $M0/file1`</div><div class='add'>+</div><div class='add'>+## Setxattr from mount-0</div><div class='add'>+TEST "setfattr -n user.DOSATTRIB -v "abc" $M0/file1"</div><div class='add'>+EXPECT $size stat -c '%s' $M0/file1</div><div class='add'>+</div><div class='add'>+## Getxattr from mount-1, this should return the correct value</div><div class='add'>+TEST "getfattr -n user.DOSATTRIB $M1/file1 | grep -q abc"</div><div class='add'>+</div><div class='add'>+TEST "setfattr -x user.DOSATTRIB $M1/file1"</div><div class='add'>+EXPECT $size stat -c '%s' $M1/file1</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M1</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/nfs/bug-1053579.t b/tests/bugs/nfs/bug-1053579.t<br/>new file mode 100755<br/>index 00000000000..2f53172e24c<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/nfs/bug-1053579.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/nfs/bug-1053579.t</a></div><div class='hunk'>@@ -0,0 +1,114 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+. $(dirname $0)/../../nfs.rc</div><div class='add'>+</div><div class='add'>+#G_TESTDEF_TEST_STATUS_CENTOS6=NFS_TEST</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='add'>+</div><div class='add'>+# prepare the users and groups</div><div class='add'>+NEW_USER=bug1053579</div><div class='add'>+NEW_UID=1053579</div><div class='add'>+NEW_GID=1053579</div><div class='add'>+LAST_GID=1053779</div><div class='add'>+NEW_GIDS=${NEW_GID}</div><div class='add'>+</div><div class='add'>+# OS-specific overrides</div><div class='add'>+case $OSTYPE in</div><div class='add'>+NetBSD|Darwin)</div><div class='add'>+        # only NGROUPS_MAX=16 secondary groups are supported</div><div class='add'>+        LAST_GID=1053593</div><div class='add'>+        ;;</div><div class='add'>+FreeBSD)</div><div class='add'>+        # NGROUPS_MAX=1023 (FreeBSD&gt;=8.0), we can afford 200 groups</div><div class='add'>+        ;;</div><div class='add'>+Linux)</div><div class='add'>+        # NGROUPS_MAX=65536, we can afford 200 groups</div><div class='add'>+        ;;</div><div class='add'>+*)</div><div class='add'>+        ;;</div><div class='add'>+esac</div><div class='add'>+</div><div class='add'>+# create a user that belongs to many groups</div><div class='add'>+for GID in $(seq  -f '%6.0f' ${NEW_GID} ${LAST_GID})</div><div class='add'>+do</div><div class='add'>+        groupadd -o -g ${GID} ${NEW_USER}-${GID}</div><div class='add'>+        NEW_GIDS="${NEW_GIDS},${NEW_USER}-${GID}"</div><div class='add'>+done</div><div class='add'>+TEST useradd -o -M -u ${NEW_UID} -g ${NEW_GID} -G ${NEW_USER}-${NEW_GIDS} ${NEW_USER}</div><div class='add'>+</div><div class='add'>+# preparation done, start the tests</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/${V0}1</div><div class='add'>+TEST $CLI volume set $V0 nfs.disable false</div><div class='add'>+TEST $CLI volume set $V0 nfs.server-aux-gids on</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $NFS_EXPORT_TIMEOUT "1" is_nfs_export_available</div><div class='add'>+</div><div class='add'>+# mount the volume</div><div class='add'>+TEST mount_nfs $H0:/$V0 $N0 nolock</div><div class='add'>+TEST glusterfs --volfile-id=/$V0 --volfile-server=$H0 $M0</div><div class='add'>+</div><div class='add'>+# the actual test, this used to crash</div><div class='add'>+su -m ${NEW_USER} -c "stat $N0/. &gt; /dev/null"</div><div class='add'>+TEST [ $? -eq 0 ]</div><div class='add'>+</div><div class='add'>+# create a file that only a user in a high-group can access</div><div class='add'>+echo 'Hello World!' &gt; $N0/README</div><div class='add'>+chgrp ${LAST_GID} $N0/README</div><div class='add'>+chmod 0640 $N0/README</div><div class='add'>+</div><div class='add'>+#su -m ${NEW_USER} -c "cat $N0/README 2&gt;&amp;1 &gt; /dev/null"</div><div class='add'>+su -m ${NEW_USER} -c "cat $N0/README"</div><div class='add'>+ret=$?</div><div class='add'>+</div><div class='add'>+case $OSTYPE in</div><div class='add'>+Linux)  # Linux NFS fails with big GID</div><div class='add'>+        if [ $ret -ne 0 ] ; then</div><div class='add'>+            res="Y"</div><div class='add'>+        else</div><div class='add'>+            res="N"</div><div class='add'>+        fi</div><div class='add'>+        ;;</div><div class='add'>+*)      # Other systems should cope better</div><div class='add'>+        if [ $ret -eq 0 ] ; then</div><div class='add'>+            res="Y"</div><div class='add'>+        else</div><div class='add'>+            res="N"</div><div class='add'>+        fi</div><div class='add'>+        ;;</div><div class='add'>+esac</div><div class='add'>+TEST [ "x$res" = "xY" ]</div><div class='add'>+</div><div class='add'>+# This passes only on build.gluster.org, not reproducible on other machines?!</div><div class='add'>+#su -m ${NEW_USER}  -c "cat $M0/README 2&gt;&amp;1 &gt; /dev/null"</div><div class='add'>+#TEST [ $? -ne 0 ]</div><div class='add'>+</div><div class='add'>+# enable server.manage-gids and things should work</div><div class='add'>+TEST $CLI volume set $V0 server.manage-gids on</div><div class='add'>+</div><div class='add'>+su -m ${NEW_USER} -c "cat $N0/README 2&gt;&amp;1 &gt; /dev/null"</div><div class='add'>+TEST [ $? -eq 0 ]</div><div class='add'>+su -m ${NEW_USER} -c "cat $M0/README 2&gt;&amp;1 &gt; /dev/null"</div><div class='add'>+TEST [ $? -eq 0 ]</div><div class='add'>+</div><div class='add'>+# cleanup</div><div class='add'>+userdel --force ${NEW_USER}</div><div class='add'>+for GID in $(seq  -f '%6.0f' ${NEW_GID} ${LAST_GID})</div><div class='add'>+do</div><div class='add'>+        groupdel ${NEW_USER}-${GID}</div><div class='add'>+done</div><div class='add'>+</div><div class='add'>+rm -f $N0/README</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $N0</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+</div><div class='add'>+TEST $CLI volume stop $V0</div><div class='add'>+TEST $CLI volume delete $V0</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/bugs/nfs/bug-1143880-fix-gNFSd-auth-crash.t b/tests/bugs/nfs/bug-1143880-fix-gNFSd-auth-crash.t<br/>new file mode 100644<br/>index 00000000000..c360db4c91c<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/nfs/bug-1143880-fix-gNFSd-auth-crash.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/nfs/bug-1143880-fix-gNFSd-auth-crash.t</a></div><div class='hunk'>@@ -0,0 +1,24 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../nfs.rc</div><div class='add'>+</div><div class='add'>+#G_TESTDEF_TEST_STATUS_CENTOS6=NFS_TEST</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 replica 2 $H0:$B0/${V0}{1,2}</div><div class='add'>+TEST $CLI volume set $V0 nfs.disable false</div><div class='add'>+TEST $CLI volume set $V0 performance.open-behind off</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $NFS_EXPORT_TIMEOUT 1 is_nfs_export_available</div><div class='add'>+</div><div class='add'>+TEST mount_nfs $H0:/$V0 $N0 nolock</div><div class='add'>+TEST mkdir -p $N0/foo</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" umount_nfs $N0</div><div class='add'>+TEST mount_nfs $H0:/$V0/foo $N0 nolock</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" umount_nfs $N0</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/bugs/nfs/bug-1157223-symlink-mounting.t b/tests/bugs/nfs/bug-1157223-symlink-mounting.t<br/>new file mode 100644<br/>index 00000000000..dea609ed193<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/nfs/bug-1157223-symlink-mounting.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/nfs/bug-1157223-symlink-mounting.t</a></div><div class='hunk'>@@ -0,0 +1,126 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../nfs.rc</div><div class='add'>+</div><div class='add'>+#G_TESTDEF_TEST_STATUS_CENTOS6=NFS_TEST</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+## Start and create a volume</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+</div><div class='add'>+TEST $CLI volume info;</div><div class='add'>+TEST $CLI volume create $V0  $H0:$B0/$V0</div><div class='add'>+TEST $CLI volume set $V0 nfs.disable false</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+</div><div class='add'>+## Wait for volume to register with rpc.mountd</div><div class='add'>+EXPECT_WITHIN $NFS_EXPORT_TIMEOUT "1" is_nfs_export_available;</div><div class='add'>+</div><div class='add'>+## Mount NFS</div><div class='add'>+TEST mount_nfs $H0:/$V0 $N0 nolock;</div><div class='add'>+</div><div class='add'>+mkdir $N0/dir1;</div><div class='add'>+mkdir $N0/dir2;</div><div class='add'>+pushd $N0/ ;</div><div class='add'>+</div><div class='add'>+##link created using relative path</div><div class='add'>+ln -s dir1 symlink1;</div><div class='add'>+</div><div class='add'>+##relative path contains ".."</div><div class='add'>+ln -s ../dir1 dir2/symlink2;</div><div class='add'>+</div><div class='add'>+##link created using absolute path</div><div class='add'>+ln -s $N0/dir1 symlink3;</div><div class='add'>+</div><div class='add'>+##link pointing to another symlinks</div><div class='add'>+ln -s symlink1 symlink4</div><div class='add'>+ln -s symlink3 symlink5</div><div class='add'>+</div><div class='add'>+##dead links</div><div class='add'>+ln -s does/not/exist symlink6</div><div class='add'>+</div><div class='add'>+##link which contains ".." points out of glusterfs</div><div class='add'>+ln -s ../../ symlink7</div><div class='add'>+</div><div class='add'>+##links pointing to unauthorized area</div><div class='add'>+ln -s .glusterfs symlink8</div><div class='add'>+</div><div class='add'>+popd ;</div><div class='add'>+</div><div class='add'>+##Umount the volume</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" umount_nfs $N0</div><div class='add'>+</div><div class='add'>+## Mount and umount NFS via directory</div><div class='add'>+TEST mount_nfs $H0:/$V0/dir1 $N0 nolock;</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" umount_nfs $N0</div><div class='add'>+</div><div class='add'>+## Mount and umount NFS via symlink1</div><div class='add'>+TEST mount_nfs $H0:/$V0/symlink1 $N0 nolock;</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" umount_nfs $N0</div><div class='add'>+</div><div class='add'>+## Mount and umount NFS via symlink2</div><div class='add'>+TEST  mount_nfs $H0:/$V0/dir2/symlink2 $N0 nolock;</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" umount_nfs $N0</div><div class='add'>+</div><div class='add'>+## Mount NFS via symlink3 should fail</div><div class='add'>+TEST ! mount_nfs $H0:/$V0/symlink3 $N0 nolock;</div><div class='add'>+</div><div class='add'>+## Mount and umount NFS via symlink4</div><div class='add'>+TEST  mount_nfs $H0:/$V0/symlink4 $N0 nolock;</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" umount_nfs $N0</div><div class='add'>+</div><div class='add'>+## Mount NFS via symlink5 should fail</div><div class='add'>+TEST ! mount_nfs $H0:/$V0/symlink5 $N0 nolock;</div><div class='add'>+</div><div class='add'>+## Mount NFS via symlink6 should fail</div><div class='add'>+TEST ! mount_nfs $H0:/$V0/symlink6 $N0 nolock;</div><div class='add'>+</div><div class='add'>+## Mount NFS via symlink7 should fail</div><div class='add'>+TEST ! mount_nfs $H0:/$V0/symlink7 $N0 nolock;</div><div class='add'>+</div><div class='add'>+## Mount NFS via symlink8 should fail</div><div class='add'>+TEST ! mount_nfs $H0:/$V0/symlink8 $N0 nolock;</div><div class='add'>+</div><div class='add'>+##Similar check for udp mount</div><div class='add'>+$CLI volume stop $V0</div><div class='add'>+TEST $CLI volume set $V0 nfs.mount-udp on</div><div class='add'>+$CLI volume start $V0</div><div class='add'>+</div><div class='add'>+## Wait for volume to register with rpc.mountd</div><div class='add'>+EXPECT_WITHIN $NFS_EXPORT_TIMEOUT "1" is_nfs_export_available;</div><div class='add'>+</div><div class='add'>+## Mount and umount NFS via directory</div><div class='add'>+TEST mount_nfs $H0:/$V0/dir1 $N0 nolock,mountproto=udp,proto=tcp;</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" umount_nfs $N0</div><div class='add'>+</div><div class='add'>+## Mount and umount NFS via symlink1</div><div class='add'>+TEST mount_nfs $H0:/$V0/symlink1 $N0 nolock,mountproto=udp,proto=tcp;</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" umount_nfs $N0</div><div class='add'>+</div><div class='add'>+## Mount and umount NFS via symlink2</div><div class='add'>+TEST  mount_nfs $H0:/$V0/dir2/symlink2 $N0 nolock,mountproto=udp,proto=tcp;</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" umount_nfs $N0</div><div class='add'>+</div><div class='add'>+## Mount NFS via symlink3 should fail</div><div class='add'>+TEST ! mount_nfs $H0:/$V0/symlink3 $N0 nolock,mountproto=udp,proto=tcp;</div><div class='add'>+</div><div class='add'>+## Mount and umount NFS via symlink4</div><div class='add'>+TEST  mount_nfs $H0:/$V0/symlink4 $N0 nolock,mountproto=udp,proto=tcp;</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" umount_nfs $N0</div><div class='add'>+</div><div class='add'>+## Mount NFS via symlink5 should fail</div><div class='add'>+TEST ! mount_nfs $H0:/$V0/symlink5 $N0 nolock,mountproto=udp,proto=tcp;</div><div class='add'>+</div><div class='add'>+## Mount NFS via symlink6 should fail</div><div class='add'>+TEST ! mount_nfs $H0:/$V0/symlink6 $N0 nolock,mountproto=udp,proto=tcp;</div><div class='add'>+</div><div class='add'>+##symlink7 is not check here, because in udp mount ../../ resolves into root '/'</div><div class='add'>+</div><div class='add'>+## Mount NFS via symlink8 should fail</div><div class='add'>+TEST ! mount_nfs $H0:/$V0/symlink8 $N0 nolock,mountproto=udp,proto=tcp;</div><div class='add'>+</div><div class='add'>+rm -rf $H0:$B0/</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/nfs/bug-1161092-nfs-acls.t b/tests/bugs/nfs/bug-1161092-nfs-acls.t<br/>new file mode 100644<br/>index 00000000000..45a22e79336<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/nfs/bug-1161092-nfs-acls.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/nfs/bug-1161092-nfs-acls.t</a></div><div class='hunk'>@@ -0,0 +1,39 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../nfs.rc</div><div class='add'>+</div><div class='add'>+#G_TESTDEF_TEST_STATUS_CENTOS6=NFS_TEST</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume info</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/brick1;</div><div class='add'>+EXPECT 'Created' volinfo_field $V0 'Status';</div><div class='add'>+TEST $CLI volume set $V0 nfs.disable false</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+EXPECT 'Started' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $NFS_EXPORT_TIMEOUT 1 is_nfs_export_available</div><div class='add'>+TEST mount_nfs $H0:/$V0 $N0</div><div class='add'>+</div><div class='add'>+TEST touch $N0/file1</div><div class='add'>+TEST chmod 700 $N0/file1</div><div class='add'>+TEST getfacl $N0/file1</div><div class='add'>+</div><div class='add'>+TEST $CLI volume set $V0 root-squash on</div><div class='add'>+TEST getfacl $N0/file1</div><div class='add'>+</div><div class='add'>+TEST umount_nfs $H0:/$V0 $N0</div><div class='add'>+TEST mount_nfs $H0:/$V0 $N0</div><div class='add'>+TEST getfacl $N0/file1</div><div class='add'>+</div><div class='add'>+## Before killing daemon to avoid deadlocks</div><div class='add'>+umount_nfs $N0</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='head'>diff --git a/tests/bugs/nfs/bug-1166862.t b/tests/bugs/nfs/bug-1166862.t<br/>new file mode 100755<br/>index 00000000000..c4f51a2d446<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/nfs/bug-1166862.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/nfs/bug-1166862.t</a></div><div class='hunk'>@@ -0,0 +1,69 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+#</div><div class='add'>+# When nfs.mount-rmtab is disabled, it should not get updated.</div><div class='add'>+#</div><div class='add'>+# Based on: bug-904065.t</div><div class='add'>+#</div><div class='add'>+</div><div class='add'>+#G_TESTDEF_TEST_STATUS_CENTOS6=NFS_TEST</div><div class='add'>+</div><div class='add'>+# count the lines of a file, return 0 if the file does not exist</div><div class='add'>+function count_lines()</div><div class='add'>+{</div><div class='add'>+        if [ -n "$1" ]</div><div class='add'>+        then</div><div class='add'>+                $@ 2&gt;/dev/null | wc -l</div><div class='add'>+        else</div><div class='add'>+                echo 0</div><div class='add'>+        fi</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../nfs.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/brick1</div><div class='add'>+EXPECT 'Created' volinfo_field $V0 'Status'</div><div class='add'>+TEST $CLI volume set $V0 nfs.disable false</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+EXPECT 'Started' volinfo_field $V0 'Status'</div><div class='add'>+</div><div class='add'>+# glusterfs/nfs needs some time to start up in the background</div><div class='add'>+EXPECT_WITHIN $NFS_EXPORT_TIMEOUT 1 is_nfs_export_available</div><div class='add'>+</div><div class='add'>+# disable the rmtab by settting it to the magic "/-" value</div><div class='add'>+TEST $CLI volume set $V0 nfs.mount-rmtab /-</div><div class='add'>+</div><div class='add'>+# before mounting the rmtab should be empty</div><div class='add'>+EXPECT '0' count_lines cat $GLUSTERD_WORKDIR/nfs/rmtab</div><div class='add'>+</div><div class='add'>+TEST mount_nfs $H0:/$V0 $N0 nolock</div><div class='add'>+EXPECT '0' count_lines cat $GLUSTERD_WORKDIR/nfs/rmtab</div><div class='add'>+</div><div class='add'>+# showmount should list one client</div><div class='add'>+EXPECT '1' count_lines showmount --no-headers $H0</div><div class='add'>+</div><div class='add'>+# unmount</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $N0</div><div class='add'>+</div><div class='add'>+# after resetting the option, the rmtab should get updated again</div><div class='add'>+TEST $CLI volume reset $V0 nfs.mount-rmtab</div><div class='add'>+</div><div class='add'>+# before mounting the rmtab should be empty</div><div class='add'>+EXPECT '0' count_lines cat $GLUSTERD_WORKDIR/nfs/rmtab</div><div class='add'>+</div><div class='add'>+TEST mount_nfs $H0:/$V0 $N0 nolock</div><div class='add'>+EXPECT '2' count_lines cat $GLUSTERD_WORKDIR/nfs/rmtab</div><div class='add'>+</div><div class='add'>+# removing a mount</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $N0</div><div class='add'>+EXPECT '0' count_lines cat $GLUSTERD_WORKDIR/nfs/rmtab</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/bugs/nfs/bug-1210338.c b/tests/bugs/nfs/bug-1210338.c<br/>new file mode 100644<br/>index 00000000000..d4099244176<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/nfs/bug-1210338.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/nfs/bug-1210338.c</a></div><div class='hunk'>@@ -0,0 +1,31 @@</div><div class='add'>+#include &lt;stdio.h&gt;</div><div class='add'>+#include &lt;stdlib.h&gt;</div><div class='add'>+#include &lt;unistd.h&gt;</div><div class='add'>+#include &lt;string.h&gt;</div><div class='add'>+#include &lt;errno.h&gt;</div><div class='add'>+#include &lt;sys/types.h&gt;</div><div class='add'>+#include &lt;fcntl.h&gt;</div><div class='add'>+#include &lt;sys/stat.h&gt;</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+main(int argc, char *argv[])</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int fd = -1;</div><div class='add'>+</div><div class='add'>+    fd = open(argv[1], O_CREAT | O_EXCL, 0644);</div><div class='add'>+</div><div class='add'>+    if (fd == -1) {</div><div class='add'>+        fprintf(stderr, "creation of the file %s failed (%s)\n", argv[1],</div><div class='add'>+                strerror(errno));</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (fd &gt; 0)</div><div class='add'>+        close(fd);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='head'>diff --git a/tests/bugs/nfs/bug-1210338.t b/tests/bugs/nfs/bug-1210338.t<br/>new file mode 100644<br/>index 00000000000..b5c9245affd<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/nfs/bug-1210338.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/nfs/bug-1210338.t</a></div><div class='hunk'>@@ -0,0 +1,30 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+. $(dirname $0)/../../nfs.rc</div><div class='add'>+</div><div class='add'>+#G_TESTDEF_TEST_STATUS_CENTOS6=NFS_TEST</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+NFS_SOURCE=$(dirname $0)/bug-1210338.c</div><div class='add'>+NFS_EXEC=$(dirname $0)/excl_create</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/$V0</div><div class='add'>+TEST $CLI volume set $V0 nfs.disable false</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+EXPECT_WITHIN $NFS_EXPORT_TIMEOUT "1" is_nfs_export_available;</div><div class='add'>+TEST mount_nfs $H0:/$V0 $N0 nolock</div><div class='add'>+</div><div class='add'>+build_tester $NFS_SOURCE -o $NFS_EXEC</div><div class='add'>+TEST [ -e $NFS_EXEC ]</div><div class='add'>+</div><div class='add'>+TEST $NFS_EXEC $N0/my_file</div><div class='add'>+</div><div class='add'>+rm -f $NFS_EXEC;</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/bugs/nfs/bug-1302948.t b/tests/bugs/nfs/bug-1302948.t<br/>new file mode 100755<br/>index 00000000000..a2fb0e68ff0<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/nfs/bug-1302948.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/nfs/bug-1302948.t</a></div><div class='hunk'>@@ -0,0 +1,13 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+# TEST the nfs.rdirplus option</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/$V0</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+TEST $CLI volume set $V0 nfs.rdirplus off</div><div class='add'>+TEST $CLI volume set $V0 nfs.rdirplus on</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/bugs/nfs/bug-847622.t b/tests/bugs/nfs/bug-847622.t<br/>new file mode 100755<br/>index 00000000000..5ccee722ed9<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/nfs/bug-847622.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/nfs/bug-847622.t</a></div><div class='hunk'>@@ -0,0 +1,39 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../nfs.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+#G_TESTDEF_TEST_STATUS_CENTOS6=NFS_TEST</div><div class='add'>+</div><div class='add'>+case $OSTYPE in</div><div class='add'>+NetBSD)</div><div class='add'>+        echo "Skip test on ACL which are not available on NetBSD" &gt;&amp;2</div><div class='add'>+        SKIP_TESTS</div><div class='add'>+        exit 0</div><div class='add'>+        ;;</div><div class='add'>+*)</div><div class='add'>+        ;;</div><div class='add'>+esac</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/brick0</div><div class='add'>+TEST $CLI volume set $V0 nfs.disable false</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $NFS_EXPORT_TIMEOUT "1" is_nfs_export_available;</div><div class='add'>+TEST mount_nfs $H0:/$V0 $N0 nolock</div><div class='add'>+cd $N0</div><div class='add'>+</div><div class='add'>+# simple getfacl setfacl commands</div><div class='add'>+TEST touch testfile</div><div class='add'>+TEST setfacl -m u:14:r testfile</div><div class='add'>+TEST getfacl testfile</div><div class='add'>+</div><div class='add'>+cd</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $N0</div><div class='add'>+cleanup</div><div class='add'>+</div><div class='head'>diff --git a/tests/bugs/nfs/bug-877885.t b/tests/bugs/nfs/bug-877885.t<br/>new file mode 100755<br/>index 00000000000..dca315a3d01<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/nfs/bug-877885.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/nfs/bug-877885.t</a></div><div class='hunk'>@@ -0,0 +1,39 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../nfs.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+#G_TESTDEF_TEST_STATUS_CENTOS6=NFS_TEST</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 replica 2 $H0:$B0/brick0 $H0:$B0/brick1</div><div class='add'>+TEST $CLI volume set $V0 nfs.disable false</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+## Mount FUSE with caching disabled</div><div class='add'>+TEST glusterfs --entry-timeout=0 --attribute-timeout=0 -s $H0 --volfile-id $V0 \</div><div class='add'>+$M0;</div><div class='add'>+</div><div class='add'>+TEST touch $M0/file</div><div class='add'>+TEST mkdir $M0/dir</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $NFS_EXPORT_TIMEOUT "1" is_nfs_export_available;</div><div class='add'>+TEST mount_nfs $H0:/$V0 $N0 nolock</div><div class='add'>+cd $N0</div><div class='add'>+</div><div class='add'>+rm -rf * &amp;</div><div class='add'>+</div><div class='add'>+TEST mount_nfs $H0:/$V0 $N1 retry=0,nolock;</div><div class='add'>+</div><div class='add'>+cd;</div><div class='add'>+</div><div class='add'>+kill %1;</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $N0</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $N1</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/bugs/nfs/bug-904065.t b/tests/bugs/nfs/bug-904065.t<br/>new file mode 100755<br/>index 00000000000..0eba86e7ee8<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/nfs/bug-904065.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/nfs/bug-904065.t</a></div><div class='hunk'>@@ -0,0 +1,100 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+#</div><div class='add'>+# This test does not use 'showmount' from the nfs-utils package, it would</div><div class='add'>+# require setting up a portmapper (either rpcbind or portmap, depending on the</div><div class='add'>+# Linux distribution used for testing). The persistancy of the rmtab should not</div><div class='add'>+# affect the current showmount outputs, so existing regression tests should be</div><div class='add'>+# sufficient.</div><div class='add'>+#</div><div class='add'>+</div><div class='add'>+#G_TESTDEF_TEST_STATUS_CENTOS6=NFS_TEST</div><div class='add'>+</div><div class='add'>+# count the lines of a file, return 0 if the file does not exist</div><div class='add'>+function count_lines()</div><div class='add'>+{</div><div class='add'>+        if [ -e "$1" ]</div><div class='add'>+        then</div><div class='add'>+                wc -l &lt; $1</div><div class='add'>+        else</div><div class='add'>+                echo 0</div><div class='add'>+        fi</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../nfs.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/brick1</div><div class='add'>+EXPECT 'Created' volinfo_field $V0 'Status'</div><div class='add'>+TEST $CLI volume set $V0 nfs.disable false</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+EXPECT 'Started' volinfo_field $V0 'Status'</div><div class='add'>+</div><div class='add'>+# glusterfs/nfs needs some time to start up in the background</div><div class='add'>+EXPECT_WITHIN $NFS_EXPORT_TIMEOUT 1 is_nfs_export_available</div><div class='add'>+</div><div class='add'>+# before mounting the rmtab should be empty</div><div class='add'>+EXPECT '0' count_lines $GLUSTERD_WORKDIR/nfs/rmtab</div><div class='add'>+</div><div class='add'>+TEST mount_nfs $H0:/$V0 $N0 nolock</div><div class='add'>+# the output would looks similar to:</div><div class='add'>+#</div><div class='add'>+#   hostname-0=172.31.122.104</div><div class='add'>+#   mountpoint-0=/ufo</div><div class='add'>+#</div><div class='add'>+EXPECT '2' count_lines $GLUSTERD_WORKDIR/nfs/rmtab</div><div class='add'>+</div><div class='add'>+# duplicate mounts should not be recorded (client could have crashed)</div><div class='add'>+TEST mount_nfs $H0:/$V0 $N1 nolock</div><div class='add'>+EXPECT '2' count_lines $GLUSTERD_WORKDIR/nfs/rmtab</div><div class='add'>+</div><div class='add'>+# removing a mount should (even if there are two) should remove the entry</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $N1</div><div class='add'>+EXPECT '0' count_lines $GLUSTERD_WORKDIR/nfs/rmtab</div><div class='add'>+</div><div class='add'>+# unmounting the other mount should work flawlessly</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $N0</div><div class='add'>+EXPECT '0' count_lines $GLUSTERD_WORKDIR/nfs/rmtab</div><div class='add'>+</div><div class='add'>+TEST glusterfs --entry-timeout=0 --attribute-timeout=0 --volfile-server=$H0 --volfile-id=$V0 $M0</div><div class='add'>+</div><div class='add'>+# we'll create a fake rmtab here, similar to how an other storage server would do</div><div class='add'>+# using an invalid IP address to prevent (unlikely) collisions on the test-machine</div><div class='add'>+cat &lt;&lt; EOF &gt; $M0/rmtab</div><div class='add'>+hostname-0=127.0.0.256</div><div class='add'>+mountpoint-0=/ufo</div><div class='add'>+EOF</div><div class='add'>+EXPECT '2' count_lines $M0/rmtab</div><div class='add'>+</div><div class='add'>+# reconfigure merges the rmtab with the one on the volume</div><div class='add'>+TEST gluster volume set $V0 nfs.mount-rmtab $M0/rmtab</div><div class='add'>+</div><div class='add'>+# glusterfs/nfs needs some time to restart</div><div class='add'>+EXPECT_WITHIN $NFS_EXPORT_TIMEOUT 1 is_nfs_export_available</div><div class='add'>+</div><div class='add'>+# Apparently "is_nfs_export_available" might return even if the export is</div><div class='add'>+# not, in fact, available.  (eyeroll)  Give it a bit of extra time.</div><div class='add'>+#</div><div class='add'>+# TBD: fix the broken shell function instead of working around it here</div><div class='add'>+sleep 5</div><div class='add'>+</div><div class='add'>+# a new mount should be added to the rmtab, not overwrite exiting ones</div><div class='add'>+TEST mount_nfs $H0:/$V0 $N0 nolock</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT '4' count_lines $M0/rmtab</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $N0</div><div class='add'>+EXPECT '2' count_lines $M0/rmtab</div><div class='add'>+</div><div class='add'>+# TODO: nfs/reconfigure() is never called and is therefor disabled. When the</div><div class='add'>+# NFS-server supports reloading and does not get restarted anymore, we should</div><div class='add'>+# add a test that includes the merging of entries in the old rmtab with the new</div><div class='add'>+# rmtab.</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/bugs/nfs/bug-915280.t b/tests/bugs/nfs/bug-915280.t<br/>new file mode 100755<br/>index 00000000000..bd279157c25<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/nfs/bug-915280.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/nfs/bug-915280.t</a></div><div class='hunk'>@@ -0,0 +1,54 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+. $(dirname $0)/../../nfs.rc</div><div class='add'>+</div><div class='add'>+#G_TESTDEF_TEST_STATUS_CENTOS6=NFS_TEST</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+</div><div class='add'>+function volinfo_field()</div><div class='add'>+{</div><div class='add'>+    local vol=$1;</div><div class='add'>+    local field=$2;</div><div class='add'>+</div><div class='add'>+    $CLI volume info $vol | grep "^$field: " | sed 's/.*: //';</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/brick1 $H0:$B0/brick2;</div><div class='add'>+EXPECT 'Created' volinfo_field $V0 'Status';</div><div class='add'>+TEST $CLI volume set $V0 nfs.disable false</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+EXPECT 'Started' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+MOUNTDIR=$N0;</div><div class='add'>+EXPECT_WITHIN $NFS_EXPORT_TIMEOUT "1" is_nfs_export_available;</div><div class='add'>+TEST mount_nfs $H0:/$V0 $N0 nolock,timeo=30,retrans=1</div><div class='add'>+TEST touch $N0/testfile</div><div class='add'>+</div><div class='add'>+TEST $CLI volume set $V0 debug.error-gen client</div><div class='add'>+TEST $CLI volume set $V0 debug.error-fops stat</div><div class='add'>+TEST $CLI volume set $V0 debug.error-failure 100</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $NFS_EXPORT_TIMEOUT "1" is_nfs_export_available;</div><div class='add'>+</div><div class='add'>+pid_file=$(read_nfs_pidfile);</div><div class='add'>+</div><div class='add'>+getfacl $N0/testfile 2&gt;/dev/null</div><div class='add'>+</div><div class='add'>+nfs_pid=$(get_nfs_pid);</div><div class='add'>+if [ ! $nfs_pid ]</div><div class='add'>+then</div><div class='add'>+  nfs_pid=0;</div><div class='add'>+fi</div><div class='add'>+</div><div class='add'>+TEST [ $nfs_pid -eq $pid_file ]</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $MOUNTDIR</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/nfs/bug-970070.t b/tests/bugs/nfs/bug-970070.t<br/>new file mode 100755<br/>index 00000000000..61be4844e51<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/nfs/bug-970070.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/nfs/bug-970070.t</a></div><div class='hunk'>@@ -0,0 +1,13 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+# TEST the nfs.acl option</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/$V0</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+TEST $CLI volume set $V0 nfs.acl off</div><div class='add'>+TEST $CLI volume set $V0 nfs.acl on</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/bugs/nfs/bug-974972.t b/tests/bugs/nfs/bug-974972.t<br/>new file mode 100755<br/>index 00000000000..975c46f85a4<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/nfs/bug-974972.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/nfs/bug-974972.t</a></div><div class='hunk'>@@ -0,0 +1,41 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+. $(dirname $0)/../../nfs.rc</div><div class='add'>+</div><div class='add'>+#G_TESTDEF_TEST_STATUS_CENTOS6=NFS_TEST</div><div class='add'>+</div><div class='add'>+#This script checks that nfs mount does not fail lookup on files with split-brain</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 replica 2 $H0:$B0/${V0}{0,1}</div><div class='add'>+TEST $CLI volume set $V0 self-heal-daemon off</div><div class='add'>+TEST $CLI volume set $V0 cluster.eager-lock off</div><div class='add'>+TEST $CLI volume set $V0 nfs.disable false</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+EXPECT_WITHIN $NFS_EXPORT_TIMEOUT "1" is_nfs_export_available;</div><div class='add'>+TEST mount_nfs $H0:/$V0 $N0</div><div class='add'>+TEST touch $N0/1</div><div class='add'>+TEST kill_brick ${V0} ${H0} ${B0}/${V0}1</div><div class='add'>+echo abc &gt; $N0/1</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "Y" nfs_up_status</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_nfs $V0 0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_nfs $V0 1</div><div class='add'>+</div><div class='add'>+TEST kill_brick ${V0} ${H0} ${B0}/${V0}0</div><div class='add'>+echo def &gt; $N0/1</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "Y" nfs_up_status</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_nfs $V0 0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_nfs $V0 1</div><div class='add'>+</div><div class='add'>+#Lookup should not fail</div><div class='add'>+TEST ls $N0/1</div><div class='add'>+TEST ! cat $N0/1</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $N0</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/bugs/nfs/showmount-many-clients.t b/tests/bugs/nfs/showmount-many-clients.t<br/>new file mode 100644<br/>index 00000000000..c6c9c35d60a<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/nfs/showmount-many-clients.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/nfs/showmount-many-clients.t</a></div><div class='hunk'>@@ -0,0 +1,43 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+#</div><div class='add'>+# The nfs.rpc-auth-allow volume option is used to generate the list of clients</div><div class='add'>+# that are displayed as able to mount the export. The "group" in the export</div><div class='add'>+# should be a list of all clients, identified by "name". In previous versions,</div><div class='add'>+# the "name" was the copied string from nfs.rpc-auth-allow. This is not</div><div class='add'>+# correct, as the volume option should be parsed and split into different</div><div class='add'>+# groups.</div><div class='add'>+#</div><div class='add'>+# When the single string is passed, this testcase fails when the</div><div class='add'>+# nfs.rpc-auth-allow volume option is longer than 256 characters. By splitting</div><div class='add'>+# the groups into their own structures, this testcase passes.</div><div class='add'>+#</div><div class='add'>+</div><div class='add'>+#G_TESTDEF_TEST_STATUS_CENTOS6=NFS_TEST</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../nfs.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/brick1</div><div class='add'>+EXPECT 'Created' volinfo_field $V0 'Status'</div><div class='add'>+TEST $CLI volume set $V0 nfs.disable false</div><div class='add'>+</div><div class='add'>+CLIENTS=$(echo 127.0.0.{1..128} | tr ' ' ,)</div><div class='add'>+TEST $CLI volume set $V0 nfs.rpc-auth-allow ${CLIENTS}</div><div class='add'>+TEST $CLI volume set $V0 nfs.rpc-auth-reject all</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+EXPECT 'Started' volinfo_field $V0 'Status'</div><div class='add'>+</div><div class='add'>+# glusterfs/nfs needs some time to start up in the background</div><div class='add'>+EXPECT_WITHIN $NFS_EXPORT_TIMEOUT 1 is_nfs_export_available</div><div class='add'>+</div><div class='add'>+# showmount should not timeout (no reply is sent on error)</div><div class='add'>+TEST showmount -e $H0</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/bugs/nfs/socket-as-fifo.py b/tests/bugs/nfs/socket-as-fifo.py<br/>new file mode 100755<br/>index 00000000000..eb507e1d30b<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/nfs/socket-as-fifo.py?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/nfs/socket-as-fifo.py</a></div><div class='hunk'>@@ -0,0 +1,33 @@</div><div class='add'>+#</div><div class='add'>+# Create a unix domain socket and test if it is a socket (and not a fifo/pipe).</div><div class='add'>+#</div><div class='add'>+# Author: Niels de Vos &lt;ndevos@redhat.com&gt;</div><div class='add'>+#</div><div class='add'>+</div><div class='add'>+from __future__ import print_function</div><div class='add'>+import os</div><div class='add'>+import stat</div><div class='add'>+import sys</div><div class='add'>+import socket</div><div class='add'>+</div><div class='add'>+ret = 1</div><div class='add'>+</div><div class='add'>+if len(sys.argv) != 2:</div><div class='add'>+        print('Usage: %s &lt;socket&gt;' % (sys.argv[0]))</div><div class='add'>+        sys.exit(ret)</div><div class='add'>+</div><div class='add'>+path = sys.argv[1]</div><div class='add'>+</div><div class='add'>+sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)</div><div class='add'>+sock.bind(path)</div><div class='add'>+</div><div class='add'>+stbuf = os.stat(path)</div><div class='add'>+mode = stbuf.st_mode</div><div class='add'>+</div><div class='add'>+if stat.S_ISSOCK(mode):</div><div class='add'>+        ret = 0</div><div class='add'>+</div><div class='add'>+sock.close()</div><div class='add'>+os.unlink(path)</div><div class='add'>+</div><div class='add'>+sys.exit(ret)</div><div class='head'>diff --git a/tests/bugs/nfs/socket-as-fifo.t b/tests/bugs/nfs/socket-as-fifo.t<br/>new file mode 100644<br/>index 00000000000..d9b9e959ce3<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/nfs/socket-as-fifo.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/nfs/socket-as-fifo.t</a></div><div class='hunk'>@@ -0,0 +1,25 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+. $(dirname $0)/../../nfs.rc</div><div class='add'>+</div><div class='add'>+#G_TESTDEF_TEST_STATUS_CENTOS6=NFS_TEST</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/$V0</div><div class='add'>+TEST $CLI volume set $V0 nfs.disable false</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+EXPECT_WITHIN $NFS_EXPORT_TIMEOUT "1" is_nfs_export_available;</div><div class='add'>+TEST mount_nfs $H0:/$V0 $N0 nolock</div><div class='add'>+</div><div class='add'>+# this is the actual test</div><div class='add'>+TEST $PYTHON $(dirname $0)/socket-as-fifo.py $N0/not-a-fifo.socket</div><div class='add'>+</div><div class='add'>+TEST umount_nfs $N0</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/bugs/nfs/subdir-trailing-slash.t b/tests/bugs/nfs/subdir-trailing-slash.t<br/>new file mode 100644<br/>index 00000000000..6a114877ac7<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/nfs/subdir-trailing-slash.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/nfs/subdir-trailing-slash.t</a></div><div class='hunk'>@@ -0,0 +1,32 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+#</div><div class='add'>+# Verify that mounting a subdir over NFS works, even with a trailing /</div><div class='add'>+#</div><div class='add'>+# For example:</div><div class='add'>+#    mount -t nfs server.example.com:/volume/subdir/</div><div class='add'>+#</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+. $(dirname $0)/../../nfs.rc</div><div class='add'>+</div><div class='add'>+#G_TESTDEF_TEST_STATUS_CENTOS6=NFS_TEST</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/$V0</div><div class='add'>+TEST $CLI volume set $V0 nfs.disable false</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+EXPECT_WITHIN $NFS_EXPORT_TIMEOUT "1" is_nfs_export_available</div><div class='add'>+</div><div class='add'>+TEST mount_nfs $H0:/$V0 $N0 nolock</div><div class='add'>+TEST mkdir -p $N0/subdir</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $N0</div><div class='add'>+</div><div class='add'>+TEST mount_nfs $H0:/$V0/subdir/ $N0 nolock</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $N0</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/bugs/nfs/zero-atime.t b/tests/bugs/nfs/zero-atime.t<br/>new file mode 100755<br/>index 00000000000..2a940091ad9<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/nfs/zero-atime.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/nfs/zero-atime.t</a></div><div class='hunk'>@@ -0,0 +1,33 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+#</div><div class='add'>+# posix_do_utimes() sets atime and mtime to the values in the passed IATT. If</div><div class='add'>+# not set, these values are 0 and cause a atime/mtime set to the Epoch.</div><div class='add'>+#</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+. $(dirname $0)/../../nfs.rc</div><div class='add'>+</div><div class='add'>+#G_TESTDEF_TEST_STATUS_CENTOS6=NFS_TEST</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/$V0</div><div class='add'>+TEST $CLI volume set $V0 nfs.disable false</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+EXPECT_WITHIN $NFS_EXPORT_TIMEOUT "1" is_nfs_export_available;</div><div class='add'>+TEST mount_nfs $H0:/$V0 $N0 nolock</div><div class='add'>+</div><div class='add'>+# create a file for testing</div><div class='add'>+TEST dd if=/dev/urandom of=$M0/small count=1 bs=1024k</div><div class='add'>+</div><div class='add'>+# timezone in UTC results in atime=0 if not set correctly</div><div class='add'>+TEST TZ=UTC dd if=/dev/urandom of=$M0/small bs=64k count=1 conv=nocreat</div><div class='add'>+TEST [ "$(stat --format=%X $M0/small)" != "0" ]</div><div class='add'>+</div><div class='add'>+TEST rm $M0/small</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/bugs/nl-cache/bug-1451588.t b/tests/bugs/nl-cache/bug-1451588.t<br/>new file mode 100755<br/>index 00000000000..cf07d04c5cc<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/nl-cache/bug-1451588.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/nl-cache/bug-1451588.t</a></div><div class='hunk'>@@ -0,0 +1,25 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/${V0}{0..4}</div><div class='add'>+EXPECT 'Created' volinfo_field $V0 'Status'</div><div class='add'>+</div><div class='add'>+TEST $CLI volume set $V0 performance.nl-cache on</div><div class='add'>+TEST $CLI volume set $V0 features.cache-invalidation on</div><div class='add'>+TEST $CLI volume set $V0 features.cache-invalidation-timeout 600</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+EXPECT 'Started' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+TEST glusterfs --volfile-id=/$V0 --aux-gfid-mount --volfile-server=$H0 $M0</div><div class='add'>+</div><div class='add'>+TEST ! stat $M0/.gfid/1901b1a0-c612-46ee-b45a-e8345d5a0b48</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+G_TESTDEF_TEST_STATUS_NETBSD7=BAD_TEST,BUG=000000</div><div class='head'>diff --git a/tests/bugs/posix/bug-1034716.t b/tests/bugs/posix/bug-1034716.t<br/>new file mode 100644<br/>index 00000000000..d36f8b598f4<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/posix/bug-1034716.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/posix/bug-1034716.t</a></div><div class='hunk'>@@ -0,0 +1,60 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+#Basic checks</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume info</div><div class='add'>+</div><div class='add'>+#Create a distributed volume</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/${V0}{1..2};</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+# Mount FUSE</div><div class='add'>+TEST glusterfs -s $H0 --volfile-id $V0 $M0</div><div class='add'>+</div><div class='add'>+#Create a file and perform fop on a DIR</div><div class='add'>+TEST touch $M0/foo</div><div class='add'>+</div><div class='add'>+function xattr_query_check() {</div><div class='add'>+    local path=$1</div><div class='add'>+</div><div class='add'>+    local ret=`getfattr -m . -d $path 2&gt;&amp;1 | grep -c 'trusted.glusterfs'`</div><div class='add'>+    echo $ret</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function set_xattr() {</div><div class='add'>+    local path=$1</div><div class='add'>+    local xa_name=$2</div><div class='add'>+    local xa_val=$3</div><div class='add'>+</div><div class='add'>+    setfattr -n $xa_name -v $xa_val $path</div><div class='add'>+    echo $?</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function remove_xattr() {</div><div class='add'>+    local path=$1</div><div class='add'>+    local xa_name=$2</div><div class='add'>+</div><div class='add'>+    setfattr -x $xa_name $path</div><div class='add'>+    echo $?</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+EXPECT 0 xattr_query_check $M0/</div><div class='add'>+EXPECT 0 xattr_query_check $M0/foo</div><div class='add'>+</div><div class='add'>+EXPECT 1 set_xattr $M0/ 'trusted.glusterfs.volume-id' 'foo'</div><div class='add'>+EXPECT 1 remove_xattr $M0/ 'trusted.glusterfs.volume-id'</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+## Finish up</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+TEST $CLI volume stop $V0</div><div class='add'>+TEST $CLI volume delete $V0;</div><div class='add'>+TEST ! $CLI volume info $V0;</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/posix/bug-1040275-brick-uid-reset-on-volume-restart.t b/tests/bugs/posix/bug-1040275-brick-uid-reset-on-volume-restart.t<br/>new file mode 100755<br/>index 00000000000..3839c6e3380<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/posix/bug-1040275-brick-uid-reset-on-volume-restart.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/posix/bug-1040275-brick-uid-reset-on-volume-restart.t</a></div><div class='hunk'>@@ -0,0 +1,60 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+function get_uid() {</div><div class='add'>+    stat -c '%u' $1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function get_gid() {</div><div class='add'>+    stat -c '%g' $1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function check_stat() {</div><div class='add'>+    stat $1</div><div class='add'>+    echo $?</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 replica 3 $H0:$B0/${V0}{1,2,3,4,5,6};</div><div class='add'>+</div><div class='add'>+EXPECT "$V0" volinfo_field $V0 'Volume Name';</div><div class='add'>+EXPECT 'Created' volinfo_field $V0 'Status';</div><div class='add'>+EXPECT '6' brick_count $V0</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+EXPECT 'Started' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+TEST glusterfs -s $H0 --volfile-id $V0 $M0;</div><div class='add'>+</div><div class='add'>+EXPECT 0 get_uid $M0;</div><div class='add'>+EXPECT 0 get_gid $M0;</div><div class='add'>+</div><div class='add'>+TEST chown 100:101 $M0;</div><div class='add'>+</div><div class='add'>+EXPECT 100 get_uid $M0;</div><div class='add'>+EXPECT 101 get_gid $M0;</div><div class='add'>+</div><div class='add'>+TEST $CLI volume stop $V0;</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "0" online_brick_count</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "6" online_brick_count</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 1</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 2</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 3</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 4</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 5</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "0" check_stat $M0</div><div class='add'>+EXPECT 100 get_uid $M0;</div><div class='add'>+EXPECT 101 get_gid $M0;</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/posix/bug-1113960.t b/tests/bugs/posix/bug-1113960.t<br/>new file mode 100755<br/>index 00000000000..ee42de2a092<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/posix/bug-1113960.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/posix/bug-1113960.t</a></div><div class='hunk'>@@ -0,0 +1,98 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+. $(dirname $0)/../../nfs.rc</div><div class='add'>+</div><div class='add'>+NUM_DIRS=50</div><div class='add'>+NUM_FILES=10</div><div class='add'>+</div><div class='add'>+create_dirs () {</div><div class='add'>+        for (( i=1; i&lt;=$NUM_DIRS; i+=1));do</div><div class='add'>+                mkdir $1/olddir$i</div><div class='add'>+                for (( j=0; j&lt;$NUM_FILES; j+=1));do</div><div class='add'>+                        echo "This is file $j in dir $i" &gt; $1/olddir$i/file$j;</div><div class='add'>+                done</div><div class='add'>+        done</div><div class='add'>+        echo "0" &gt; $M0/status</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+move_dirs () {</div><div class='add'>+        old_path="$1"</div><div class='add'>+        new_path="$1"</div><div class='add'>+</div><div class='add'>+        #Create a deep directory</div><div class='add'>+        for (( i=$NUM_DIRS; i&gt;=2; i-=1));do</div><div class='add'>+            mv $1/olddir$i $1/olddir`expr $i - 1` &gt; /dev/null 2&gt;&amp;1;</div><div class='add'>+        done</div><div class='add'>+</div><div class='add'>+        #Start renaming files and dirs so the paths change for the</div><div class='add'>+        #posix_handle_path calculations</div><div class='add'>+</div><div class='add'>+        for (( i=1; i&lt;=$NUM_DIRS; i+=1));do</div><div class='add'>+                old_path="$new_path/olddir$i"</div><div class='add'>+                new_path="$new_path/longernamedir$i"</div><div class='add'>+                mv $old_path $new_path;</div><div class='add'>+</div><div class='add'>+                for (( j=0; j&lt;$NUM_FILES; j+=1));do</div><div class='add'>+                       mv $new_path/file$j $new_path/newfile$j &gt; /dev/null 2&gt;&amp;1;</div><div class='add'>+                done</div><div class='add'>+        done</div><div class='add'>+        echo "done" &gt; $M0/status</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+ls_loop ()  {</div><div class='add'>+        #Loop until the move_dirs function is done</div><div class='add'>+        for (( i=0; i&lt;=500; i+=1 )); do</div><div class='add'>+                ls -lR $1 &gt; /dev/null 2&gt;&amp;1</div><div class='add'>+        done</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume info;</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/${V0}{1,2,3,4};</div><div class='add'>+</div><div class='add'>+EXPECT "$V0" volinfo_field $V0 'Volume Name';</div><div class='add'>+EXPECT 'Created' volinfo_field $V0 'Status';</div><div class='add'>+EXPECT '4' brick_count $V0</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+EXPECT 'Started' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+## Mount FUSE with caching disabled (read-write)</div><div class='add'>+TEST glusterfs --entry-timeout=0 --attribute-timeout=0 -s $H0 --volfile-id $V0 $M0;</div><div class='add'>+</div><div class='add'>+TEST create_dirs $M0</div><div class='add'>+</div><div class='add'>+## Mount FUSE with caching disabled (read-write) again</div><div class='add'>+TEST glusterfs --entry-timeout=0 --attribute-timeout=0 -s $H0 --volfile-id $V0 $M1;</div><div class='add'>+</div><div class='add'>+TEST glusterfs -s $H0 --volfile-id $V0 $M2;</div><div class='add'>+</div><div class='add'>+(ls_loop $M1)&amp;</div><div class='add'>+ls_pid1=$!</div><div class='add'>+</div><div class='add'>+(ls_loop $M2)&amp;</div><div class='add'>+ls_pid2=$!</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+#Start moving/renaming the directories so the paths change</div><div class='add'>+TEST move_dirs $M0</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN 180 "done" cat $M0/status</div><div class='add'>+</div><div class='add'>+#Kill the ls processes</div><div class='add'>+</div><div class='add'>+kill -SIGTERM $ls_pid1</div><div class='add'>+kill -SIGTERM $ls_pid2</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+#Check if all bricks are still up</div><div class='add'>+EXPECT '4' online_brick_count $V0</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/posix/bug-1122028.t b/tests/bugs/posix/bug-1122028.t<br/>new file mode 100755<br/>index 00000000000..492668cf1dc<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/posix/bug-1122028.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/posix/bug-1122028.t</a></div><div class='hunk'>@@ -0,0 +1,51 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume info</div><div class='add'>+</div><div class='add'>+# Create a 1x1 distributed volume</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/${V0}0</div><div class='add'>+EXPECT 'Created' volinfo_field $V0 'Status'</div><div class='add'>+</div><div class='add'>+# Start volume</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+EXPECT 'Started' volinfo_field $V0 'Status'</div><div class='add'>+</div><div class='add'>+# Mount volume over FUSE</div><div class='add'>+TEST glusterfs -s $H0 --volfile-id $V0 $M0</div><div class='add'>+</div><div class='add'>+TEST mkdir $M0/dir</div><div class='add'>+TEST touch $M0/dir/a</div><div class='add'>+TEST ln $M0/dir/a $M0/dir/b</div><div class='add'>+</div><div class='add'>+# Confirm hardlinks</div><div class='add'>+inum1=$(ls -i $M0/dir/a | cut -d' ' -f1)</div><div class='add'>+inum2=$(ls -i $M0/dir/b | cut -d' ' -f1)</div><div class='add'>+TEST [ "$inum1" = "$inum2" ]</div><div class='add'>+</div><div class='add'>+# Turn on build-pgfid</div><div class='add'>+TEST $CLI volume set $V0 build-pgfid on</div><div class='add'>+EXPECT 'on' volinfo_field $V0 'storage.build-pgfid'</div><div class='add'>+</div><div class='add'>+# Unlink files</div><div class='add'>+TEST unlink $M0/dir/a</div><div class='add'>+TEST unlink $M0/dir/b</div><div class='add'>+</div><div class='add'>+# Unmount</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+</div><div class='add'>+# Stop the volume</div><div class='add'>+TEST $CLI volume stop $V0;</div><div class='add'>+EXPECT 'Stopped' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+# Delete the volume</div><div class='add'>+TEST $CLI volume delete $V0;</div><div class='add'>+TEST ! $CLI volume info $V0;</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/bugs/posix/bug-1175711.c b/tests/bugs/posix/bug-1175711.c<br/>new file mode 100644<br/>index 00000000000..8ab193c4014<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/posix/bug-1175711.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/posix/bug-1175711.c</a></div><div class='hunk'>@@ -0,0 +1,37 @@</div><div class='add'>+#include &lt;stdio.h&gt;</div><div class='add'>+#include &lt;dirent.h&gt;</div><div class='add'>+#include &lt;string.h&gt;</div><div class='add'>+#include &lt;assert.h&gt;</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+main(int argc, char **argv)</div><div class='add'>+{</div><div class='add'>+    DIR *dir = NULL;</div><div class='add'>+    struct dirent *entry = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    char *path = NULL;</div><div class='add'>+</div><div class='add'>+    assert(argc == 2);</div><div class='add'>+    path = argv[1];</div><div class='add'>+</div><div class='add'>+    dir = opendir(path);</div><div class='add'>+    if (!dir) {</div><div class='add'>+        printf("opendir(%s) failed.\n", path);</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+#ifdef _DIRENT_HAVE_D_TYPE</div><div class='add'>+    while ((entry = readdir(dir)) != NULL) {</div><div class='add'>+        if (entry-&gt;d_type == DT_UNKNOWN) {</div><div class='add'>+            printf("d_type found to be DT_UNKNOWN\n");</div><div class='add'>+            ret = -1;</div><div class='add'>+            break;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+    if (dir)</div><div class='add'>+        closedir(dir);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='head'>diff --git a/tests/bugs/posix/bug-1175711.t b/tests/bugs/posix/bug-1175711.t<br/>new file mode 100755<br/>index 00000000000..f4162544d92<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/posix/bug-1175711.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/posix/bug-1175711.t</a></div><div class='hunk'>@@ -0,0 +1,30 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+# Create, start and mount the volume.</div><div class='add'>+TEST glusterd;</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/$V0;</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+TEST glusterfs --entry-timeout=0 --attribute-timeout=0 -s $H0 --volfile-id $V0 $M0</div><div class='add'>+</div><div class='add'>+# Compile the test program</div><div class='add'>+TEST $CC -Wall $(dirname $0)/bug-1175711.c -o $(dirname $0)/bug-1175711</div><div class='add'>+</div><div class='add'>+# Create directory and some entries inside them.</div><div class='add'>+mkdir -p $M0/dir-bug-1175711</div><div class='add'>+mkdir -p $M0/dir-bug-1175711/DT_DIR</div><div class='add'>+touch $M0/dir-bug-1175711/DT_REG</div><div class='add'>+</div><div class='add'>+# Invoke the test program and pass path of directory to it.</div><div class='add'>+TEST $(dirname $0)/bug-1175711 $M0/dir-bug-1175711</div><div class='add'>+</div><div class='add'>+# Unmount, stop and delete the volume</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+TEST $CLI volume stop $V0;</div><div class='add'>+TEST $CLI volume delete $V0;</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/posix/bug-1360679.t b/tests/bugs/posix/bug-1360679.t<br/>new file mode 100644<br/>index 00000000000..fbb9d027ddb<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/posix/bug-1360679.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/posix/bug-1360679.t</a></div><div class='hunk'>@@ -0,0 +1,36 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+. $(dirname $0)/../../fileio.rc</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='add'>+function num_entries {</div><div class='add'>+        ls -l $1 | wc -l</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function create_unlink_entry {</div><div class='add'>+	for i in {0..1}</div><div class='add'>+	do</div><div class='add'>+		mkdir -p $B0/${V0}$i/.glusterfs/unlink/{1..3}/{1..10}/1</div><div class='add'>+		dd if=/dev/urandom of=$B0/${V0}$i/.glusterfs/unlink/file-1 bs=1M count=1</div><div class='add'>+		dd if=/dev/urandom of=$B0/${V0}$i/.glusterfs/unlink/file-2 bs=1M count=1</div><div class='add'>+		dd if=/dev/urandom of=$B0/${V0}$i/.glusterfs/unlink/1/file-1 bs=1M count=1</div><div class='add'>+		dd if=/dev/urandom of=$B0/${V0}$i/.glusterfs/unlink/2/file-1 bs=1M count=1</div><div class='add'>+		dd if=/dev/urandom of=$B0/${V0}$i/.glusterfs/unlink/3/file-1 bs=1M count=1</div><div class='add'>+		ln $B0/${V0}$i/.glusterfs/unlink/file-1 $B0/${V0}$i/.glusterfs/unlink/file-link</div><div class='add'>+		ln -s $B0/${V0}$i/.glusterfs/unlink/1 $B0/${V0}$i/.glusterfs/unlink/link</div><div class='add'>+		ln -s $B0/${V0}$i/.glusterfs/unlink/2 $B0/${V0}$i/.glusterfs/unlink/link-2</div><div class='add'>+	done</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 disperse 6 redundancy 2 $H0:$B0/${V0}{0..5}</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+TEST $CLI volume stop $V0</div><div class='add'>+create_unlink_entry</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+EXPECT_WITHIN $UNLINK_TIMEOUT "^1$" num_entries $B0/${V0}0/.glusterfs/unlink/</div><div class='add'>+EXPECT_WITHIN $UNLINK_TIMEOUT "^1$" num_entries $B0/${V0}1/.glusterfs/unlink/</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/posix/bug-1619720.t b/tests/bugs/posix/bug-1619720.t<br/>new file mode 100755<br/>index 00000000000..bfd304dc809<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/posix/bug-1619720.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/posix/bug-1619720.t</a></div><div class='hunk'>@@ -0,0 +1,58 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../dht.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+# Test steps:</div><div class='add'>+# The test checks to make sure that the trusted.pgfid.xx xattr is set on</div><div class='add'>+# both the linkto and data files post the final rename.</div><div class='add'>+# The test creates files file-1 and file-3 so that src_hashed = dst_hashed,</div><div class='add'>+# src_cached = dst_cached and xxx_hashed != xxx_cached.</div><div class='add'>+# It then renames file-1 to file-3 which triggers the posix_mknod call</div><div class='add'>+# which updates the trusted.pgfid.xx xattr.</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/${V0}0 $H0:$B0/${V0}1</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+TEST $CLI volume set $V0 storage.build-pgfid on</div><div class='add'>+</div><div class='add'>+## Mount FUSE</div><div class='add'>+TEST glusterfs -s $H0 --volfile-id $V0 $M0;</div><div class='add'>+</div><div class='add'>+TEST mkdir $M0/tmp</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+# Not the best way to do this but I need files which hash to the same subvol and</div><div class='add'>+# whose cached subvols are the same.</div><div class='add'>+# In a 2 subvol distributed volume, file-{1,3} hash to the same subvol.</div><div class='add'>+# file-2 will hash to the other subvol</div><div class='add'>+</div><div class='add'>+TEST touch $M0/tmp/file-2</div><div class='add'>+pgfid_xattr_name=$(getfattr -m "trusted.pgfid.*" $B0/${V0}1/tmp/file-2 | grep "trusted.pgfid")</div><div class='add'>+echo $pgfid_xattr_name</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+TEST mv $M0/tmp/file-2 $M0/tmp/file-1</div><div class='add'>+TEST touch $M0/tmp/file-2</div><div class='add'>+TEST mv $M0/tmp/file-2 $M0/tmp/file-3</div><div class='add'>+</div><div class='add'>+# At this point, both the file-1 and file-3 data files exist on one subvol</div><div class='add'>+# and both linkto files on the other</div><div class='add'>+</div><div class='add'>+TEST mv -f $M0/tmp/file-1 $M0/tmp/file-3</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+TEST getfattr -n $pgfid_xattr_name $B0/${V0}0/tmp/file-3</div><div class='add'>+TEST getfattr -n $pgfid_xattr_name $B0/${V0}1/tmp/file-3</div><div class='add'>+</div><div class='add'>+# Not required for the test but an extra check if required.</div><div class='add'>+# The linkto file was not renamed Without the fix.</div><div class='add'>+#TEST mv $M0/tmp/file-3 $M0/tmp/file-6</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/posix/bug-1651445.t b/tests/bugs/posix/bug-1651445.t<br/>new file mode 100644<br/>index 00000000000..4d08b69b9b0<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/posix/bug-1651445.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/posix/bug-1651445.t</a></div><div class='hunk'>@@ -0,0 +1,54 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+. $(dirname $0)/../../snapshot.rc</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='add'>+</div><div class='add'>+TEST verify_lvm_version</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST init_n_bricks 3</div><div class='add'>+TEST setup_lvm 3</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 replica 3 $H0:$L{1,2,3}</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+TEST glusterfs --volfile-id=/$V0 --volfile-server=$H0 $M0</div><div class='add'>+</div><div class='add'>+#Setting the size in bytes</div><div class='add'>+TEST $CLI volume set $V0 storage.reserve 40MB</div><div class='add'>+</div><div class='add'>+#wait 5s to reset disk_space_full flag</div><div class='add'>+sleep 5</div><div class='add'>+</div><div class='add'>+TEST dd if=/dev/zero of=$M0/a bs=100M count=1</div><div class='add'>+TEST dd if=/dev/zero of=$M0/b bs=10M count=1</div><div class='add'>+</div><div class='add'>+# Wait 5s to update disk_space_full flag because thread check disk space</div><div class='add'>+# after every 5s</div><div class='add'>+</div><div class='add'>+sleep 5</div><div class='add'>+# setup_lvm create lvm partition of 150M and 40M are reserve so after</div><div class='add'>+# consuming more than 110M next dd should fail</div><div class='add'>+TEST ! dd if=/dev/zero of=$M0/c bs=5M count=1</div><div class='add'>+TEST dd if=/dev/urandom of=$M0/a  bs=1022 count=1  oflag=seek_bytes,sync seek=102 conv=notrunc</div><div class='add'>+</div><div class='add'>+rm -rf $M0/*</div><div class='add'>+</div><div class='add'>+#Setting the size in percent and repeating the above steps</div><div class='add'>+TEST $CLI volume set $V0 storage.reserve 40</div><div class='add'>+</div><div class='add'>+sleep 5</div><div class='add'>+</div><div class='add'>+TEST dd if=/dev/zero of=$M0/a bs=80M count=1</div><div class='add'>+TEST dd if=/dev/zero of=$M0/b bs=10M count=1</div><div class='add'>+</div><div class='add'>+sleep 5</div><div class='add'>+TEST ! dd if=/dev/zero of=$M0/c bs=5M count=1</div><div class='add'>+</div><div class='add'>+TEST $CLI volume stop $V0</div><div class='add'>+TEST $CLI volume delete $V0</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/bugs/posix/bug-765380.t b/tests/bugs/posix/bug-765380.t<br/>new file mode 100644<br/>index 00000000000..384b8022a42<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/posix/bug-765380.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/posix/bug-765380.t</a></div><div class='hunk'>@@ -0,0 +1,39 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+</div><div class='add'>+REPLICA=2</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 replica $REPLICA $H0:$B0/${V0}00 $H0:$B0/${V0}01 $H0:$B0/${V0}10 $H0:$B0/${V0}11</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+## Mount FUSE with caching disabled</div><div class='add'>+TEST $GFS -s $H0 --volfile-id $V0 $M0;</div><div class='add'>+</div><div class='add'>+function count_hostname_or_uuid_from_pathinfo()</div><div class='add'>+{</div><div class='add'>+    pathinfo=$(getfattr -n trusted.glusterfs.pathinfo $M0/f00f)</div><div class='add'>+    echo $pathinfo | grep -o $1 | wc -l</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+TEST touch $M0/f00f</div><div class='add'>+</div><div class='add'>+EXPECT $REPLICA count_hostname_or_uuid_from_pathinfo $H0</div><div class='add'>+</div><div class='add'>+# turn on node-uuid-pathinfo option</div><div class='add'>+TEST $CLI volume set $V0 node-uuid-pathinfo on</div><div class='add'>+</div><div class='add'>+# do not expext hostname as part of the pathinfo string</div><div class='add'>+EXPECT 0 count_hostname_or_uuid_from_pathinfo $H0</div><div class='add'>+</div><div class='add'>+uuid=$(grep UUID $GLUSTERD_WORKDIR/glusterd.info | cut -f2 -d=)</div><div class='add'>+</div><div class='add'>+# ... but expect the uuid $REPLICA times</div><div class='add'>+EXPECT $REPLICA count_hostname_or_uuid_from_pathinfo $uuid</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/posix/bug-990028.t b/tests/bugs/posix/bug-990028.t<br/>new file mode 100755<br/>index 00000000000..bef36a8897d<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/posix/bug-990028.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/posix/bug-990028.t</a></div><div class='hunk'>@@ -0,0 +1,157 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+. $(dirname $0)/../../fileio.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TESTS_EXPECTED_IN_LOOP=153</div><div class='add'>+</div><div class='add'>+function __init()</div><div class='add'>+{</div><div class='add'>+    TEST glusterd</div><div class='add'>+    TEST pidof glusterd</div><div class='add'>+    TEST $CLI volume info;</div><div class='add'>+</div><div class='add'>+    TEST $CLI volume create $V0 $H0:$B0/brick</div><div class='add'>+</div><div class='add'>+    EXPECT 'Created' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+    TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+    TEST glusterfs --volfile-id=$V0 --volfile-server=$H0 $M0</div><div class='add'>+</div><div class='add'>+    TEST $CLI volume quota $V0 enable</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#CASE-1</div><div class='add'>+#checking pgfid under same directory</div><div class='add'>+function links_in_same_directory()</div><div class='add'>+{</div><div class='add'>+    # create a file file1</div><div class='add'>+    TEST touch $M0/file1</div><div class='add'>+</div><div class='add'>+    # create 50 hardlinks for file1</div><div class='add'>+    for i in `seq 2 50`; do</div><div class='add'>+        TEST_IN_LOOP ln $M0/file1 $M0/file$i</div><div class='add'>+    done</div><div class='add'>+</div><div class='add'>+    # store the pgfid of file1 in PGFID_FILE1 [should be 50 now (0x000000032)]</div><div class='add'>+    PGFID_FILE1=`getfattr -m "trusted.pgfid.*" -de hex  $B0/brick/file1 2&gt;&amp;1 | grep "trusted.pgfid" | gawk -F '=' '{print $2}'`</div><div class='add'>+</div><div class='add'>+    # compare the pgfid(link value ) of each  hard links are equal or not</div><div class='add'>+    for i in `seq  2 50`; do</div><div class='add'>+        TEMP=`getfattr -m "trusted.pgfid.*" -de hex $B0/brick/file$i 2&gt;&amp;1 | grep "trusted.pgfid" | gawk -F '=' '{print $2}'`</div><div class='add'>+        TEST_IN_LOOP [ $PGFID_FILE1 = $TEMP ]</div><div class='add'>+    done</div><div class='add'>+</div><div class='add'>+    # check if no of links value is 50 or not</div><div class='add'>+    TEST [ $PGFID_FILE1 = "0x00000032" ]</div><div class='add'>+</div><div class='add'>+    # unlink file 2 to 50</div><div class='add'>+    for i in `seq 2 50`; do</div><div class='add'>+        TEST_IN_LOOP unlink $M0/file$i;</div><div class='add'>+    done</div><div class='add'>+</div><div class='add'>+    # now check if pgfid value is 1 or not</div><div class='add'>+    PGFID_FILE1=`getfattr -m "trusted.pgfid.*" -de hex  $B0/brick/file1 2&gt;&amp;1 | grep "trusted.pgfid" | gawk -F '=' '{print $2}'`;</div><div class='add'>+</div><div class='add'>+    TEST [ $PGFID_FILE1 = "0x00000001" ]</div><div class='add'>+</div><div class='add'>+    TEST rm -f $M0/*</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+##checking pgfid under diff directories</div><div class='add'>+function links_across_directories()</div><div class='add'>+{</div><div class='add'>+    TEST mkdir $M0/dir1 $M0/dir2;</div><div class='add'>+</div><div class='add'>+    # create a file in dir1</div><div class='add'>+    TEST touch $M0/dir1/file1;</div><div class='add'>+</div><div class='add'>+    # create  hard link for file1 in dir2</div><div class='add'>+    TEST ln $M0/dir1/file1 $M0/dir2/file2;</div><div class='add'>+</div><div class='add'>+    #first check is to find whether there are two pgfids or not</div><div class='add'>+    LINES=`getfattr -m "trusted.pgfid.*" -de hex $B0/brick/dir1/file1 2&gt;&amp;1 | grep "trusted.pgfid" | wc -l`</div><div class='add'>+    TEST [ $LINES = 2 ]</div><div class='add'>+</div><div class='add'>+    for i in $(seq 1  2); do</div><div class='add'>+        HL=`getfattr -m "trusted.pgfid.*" -de hex $B0/brick/dir$i/file$i 2&gt;&amp;1 | grep "trusted.pgfid" | awk -v n=$i 'NR==n' | cut -d'=' -f2`</div><div class='add'>+        TEST_IN_LOOP [ $HL = "0x00000001" ]</div><div class='add'>+    done</div><div class='add'>+</div><div class='add'>+    #now unlink file2 and check the pgfid of file1</div><div class='add'>+    #1. no. of pgfid should be one</div><div class='add'>+    #2. no. of hard link should be one</div><div class='add'>+    TEST unlink $M0/dir2/file2</div><div class='add'>+</div><div class='add'>+    LINES=`getfattr -m "trusted.pgfid.*" -de hex $B0/brick/dir1/file1 2&gt;&amp;1 | grep "trusted.pgfid" | wc -l`</div><div class='add'>+    TEST [ $LINES == 1 ]</div><div class='add'>+</div><div class='add'>+    #next to check is to whether they contain hard link value of one or not</div><div class='add'>+    HL=`getfattr -m "trusted.pgfid.*" -de hex $B0/brick/dir1/file1 2&gt;&amp;1 | grep "trusted.pgfid" | cut -d'=' -f2`</div><div class='add'>+    TEST [ $HL = "0x00000001" ]</div><div class='add'>+</div><div class='add'>+    #rename file under same directory</div><div class='add'>+</div><div class='add'>+    TEST touch $M0/r_file1</div><div class='add'>+    PGFID_rfile1=`getfattr -m "trusted.pgfid.*" -de hex $B0/brick/r_file1 2&gt;&amp;1 | grep "trusted.pgfid"`</div><div class='add'>+</div><div class='add'>+    #cross check whether hard link count is one</div><div class='add'>+    HL=`getfattr -m "trusted.pgfid.*" -de hex $B0/brick/r_file1 2&gt;&amp;1 | grep "trusted.pgfid" | cut -d'=' -f2`</div><div class='add'>+</div><div class='add'>+    TEST [ $HL = "0x00000001" ]</div><div class='add'>+</div><div class='add'>+    #now rename the file to r_file1</div><div class='add'>+    TEST mv $M0/r_file1 $M0/r_file2</div><div class='add'>+</div><div class='add'>+    #now check the pgfid hard link count is still one or not</div><div class='add'>+    HL=`getfattr -m "trusted.pgfid.*" -de hex $B0/brick/r_file2 2&gt;&amp;1 | grep "trusted.pgfid" | cut -d'=' -f2`</div><div class='add'>+</div><div class='add'>+    TEST [ $HL = "0x00000001" ]</div><div class='add'>+</div><div class='add'>+    #now move the file to a different directory where it has no hard link and check</div><div class='add'>+    TEST mkdir $M0/dir3;</div><div class='add'>+    TEST mv $M0/r_file2 $M0/dir3;</div><div class='add'>+</div><div class='add'>+    #now check the pgfid has changed or not and hard limit is one or not</div><div class='add'>+    PGFID_newDir=`getfattr -m "trusted.pgfid.*" -de hex $B0/brick/dir3/r_file2 2&gt;&amp;1 | grep "trusted.pgfid"`</div><div class='add'>+</div><div class='add'>+    #now the older pgfid and new pgfid shouldn't match</div><div class='add'>+    TEST [ $PGFID_rfile1 != $PGFID_newDir ]</div><div class='add'>+</div><div class='add'>+    HL=`getfattr -m "trusted.pgfid" -de hex $B0/brick/dir3/r_file2 2&gt;&amp;1 | grep "trusted.pgfid" | cut -d'=' -f2`</div><div class='add'>+    TEST [ $HL = "0x00000001" ]</div><div class='add'>+</div><div class='add'>+    TEST touch $M0/dir1/rl_file_1</div><div class='add'>+    ln $M0/dir1/rl_file_1 $M0/dir2/rl_file_2</div><div class='add'>+    mv $M0/dir1/rl_file_1 $M0/dir2</div><div class='add'>+</div><div class='add'>+    #now the there should be just one pgfid for both files</div><div class='add'>+    for i in $(seq 1 2); do</div><div class='add'>+            NL=`getfattr -m "trusted.pgfid" -de hex $B0/brick/dir2/rl_file_$i 2&gt;&amp;1 | grep "trusted.pgfid"|wc -l `</div><div class='add'>+            TEST_IN_LOOP [ $HL = "0x00000001" ]</div><div class='add'>+    done</div><div class='add'>+</div><div class='add'>+    #now pgfid of both files should match</div><div class='add'>+    P_rl_file_1=`getfattr -m "trusted.pgfid" -de hex $B0/brick/dir2/rl_file_1 2&gt;&amp;1 | grep "trusted.pgfid"`</div><div class='add'>+    P_rl_file_2=`getfattr -m "trusted.pgfid" -de hex $B0/brick/dir2/rl_file_2 2&gt;&amp;1 | grep "trusted.pgfid"`</div><div class='add'>+    TEST [ $P_rl_file_1 = $P_rl_file_2 ]</div><div class='add'>+</div><div class='add'>+    #now the no of hard link should be two for both rl_file_1 and rl_file_2</div><div class='add'>+    for i in  $(seq 1 2); do</div><div class='add'>+        HL=`getfattr -m "trusted.pgfid" -de hex $B0/brick/dir2/rl_file_$i 2&gt;&amp;1 | grep "trusted.pgfid" | cut -d'=' -f2`</div><div class='add'>+        TEST_IN_LOOP [ $HL = "0x00000002" ]</div><div class='add'>+    done</div><div class='add'>+</div><div class='add'>+    TEST rm -rf $M0/*</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+__init;</div><div class='add'>+links_in_same_directory;</div><div class='add'>+links_across_directories;</div><div class='add'>+TEST $CLI volume stop $V0</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/bugs/posix/bug-gfid-path.t b/tests/bugs/posix/bug-gfid-path.t<br/>new file mode 100644<br/>index 00000000000..1bbbe9f0670<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/posix/bug-gfid-path.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/posix/bug-gfid-path.t</a></div><div class='hunk'>@@ -0,0 +1,70 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+# This test case is for the bug where, even though a file is</div><div class='add'>+# created when gfid2path option is turned off (default is ON),</div><div class='add'>+# getfattr of "glusterfs.gfidtopath" was succeeding for that</div><div class='add'>+# file. Ideally the getfattr should fail, as the file does not</div><div class='add'>+# have its path(s) stored as a extended attribute (because it</div><div class='add'>+# was created when gfid2path option was off)</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume info;</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/${V0}{1,2,3,4};</div><div class='add'>+</div><div class='add'>+EXPECT "$V0" volinfo_field $V0 'Volume Name';</div><div class='add'>+EXPECT 'Created' volinfo_field $V0 'Status';</div><div class='add'>+EXPECT '4' brick_count $V0</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+EXPECT 'Started' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+TEST glusterfs -s $H0 --volfile-id $V0 $M0;</div><div class='add'>+</div><div class='add'>+TEST mkdir $M0/dir</div><div class='add'>+TEST mkdir $M0/new</div><div class='add'>+TEST mkdir $M0/3</div><div class='add'>+</div><div class='add'>+TEST touch $M0/dir/file</div><div class='add'>+</div><div class='add'>+# except success as by default gfid2path is enabled</div><div class='add'>+# and the glusterfs.gfidtopath xattr should give the</div><div class='add'>+# path of the object as the value</div><div class='add'>+</div><div class='add'>+TEST getfattr -n glusterfs.gfidtopath $M0/dir/file</div><div class='add'>+</div><div class='add'>+# turn off gfid2path feature</div><div class='add'>+TEST $CLI volume set $V0 storage.gfid2path off</div><div class='add'>+</div><div class='add'>+TEST touch $M0/new/foo</div><div class='add'>+</div><div class='add'>+# again enable gfid2path. This has to be enabled before</div><div class='add'>+# trying the getfattr. Because, glusterfs.gfidtopath xattr</div><div class='add'>+# request is handled only if gfid2path is enabled. If not,</div><div class='add'>+# then getxattr on glusterfs.gfid2path fails anyways. In this</div><div class='add'>+# context we want getfattr to fail, because the file was created</div><div class='add'>+# when gfid2path feature was disabled and not because gfid2path</div><div class='add'>+# feature itself is disabled.</div><div class='add'>+TEST $CLI volume set $V0 storage.gfid2path on</div><div class='add'>+</div><div class='add'>+# getfattr should fail as it is attempted on a file</div><div class='add'>+# which does not have its path stored as a xattr</div><div class='add'>+# (because file got created after disabling gfid2path)</div><div class='add'>+TEST ! getfattr -n glusterfs.gfidtopath $M0/new/foo;</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+TEST touch $M0/3/new</div><div class='add'>+</div><div class='add'>+# should be successful</div><div class='add'>+TEST getfattr -n glusterfs.gfidtopath $M0/3/new</div><div class='add'>+</div><div class='add'>+TEST rm -rf $M0/*</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/posix/disallow-gfid-volumeid-fremovexattr.c b/tests/bugs/posix/disallow-gfid-volumeid-fremovexattr.c<br/>new file mode 100644<br/>index 00000000000..4ed3181d48f<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/posix/disallow-gfid-volumeid-fremovexattr.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/posix/disallow-gfid-volumeid-fremovexattr.c</a></div><div class='hunk'>@@ -0,0 +1,104 @@</div><div class='add'>+#include &lt;glusterfs/api/glfs.h&gt;</div><div class='add'>+#include &lt;errno.h&gt;</div><div class='add'>+#include &lt;stdio.h&gt;</div><div class='add'>+#include &lt;stdlib.h&gt;</div><div class='add'>+#include &lt;string.h&gt;</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+main(int argc, char *argv[])</div><div class='add'>+{</div><div class='add'>+    glfs_t *fs = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    int i = 0;</div><div class='add'>+    glfs_fd_t *fd = NULL;</div><div class='add'>+    char *logfile = NULL;</div><div class='add'>+    char *hostname = NULL;</div><div class='add'>+</div><div class='add'>+    if (argc != 4) {</div><div class='add'>+        fprintf(stderr,</div><div class='add'>+                "Expect following args %s &lt;hostname&gt; &lt;Vol&gt; &lt;log file&gt;\n",</div><div class='add'>+                argv[0]);</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    hostname = argv[1];</div><div class='add'>+    logfile = argv[3];</div><div class='add'>+</div><div class='add'>+    fs = glfs_new(argv[2]);</div><div class='add'>+    if (!fs) {</div><div class='add'>+        fprintf(stderr, "glfs_new: returned NULL (%s)\n", strerror(errno));</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = glfs_set_volfile_server(fs, "tcp", hostname, 24007);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(stderr, "glfs_set_volfile_server failed ret:%d (%s)\n", ret,</div><div class='add'>+                strerror(errno));</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = glfs_set_logging(fs, logfile, 7);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(stderr, "glfs_set_logging failed with ret: %d (%s)\n", ret,</div><div class='add'>+                strerror(errno));</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = glfs_init(fs);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(stderr, "glfs_init failed with ret: %d (%s)\n", ret,</div><div class='add'>+                strerror(errno));</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    fd = glfs_opendir(fs, "/");</div><div class='add'>+    if (!fd) {</div><div class='add'>+        fprintf(stderr, "glfs_opendir failed with (%s)\n", strerror(errno));</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = glfs_fremovexattr(fd, "trusted.gfid");</div><div class='add'>+    if (ret == 0 || errno != EPERM) {</div><div class='add'>+        fprintf(stderr,</div><div class='add'>+                "glfs_fremovexattr gfid exited with ret: "</div><div class='add'>+                "%d (%s)\n",</div><div class='add'>+                ret, strerror(errno));</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = glfs_fremovexattr(fd, "trusted.glusterfs.volume-id");</div><div class='add'>+    if (ret == 0 || errno != EPERM) {</div><div class='add'>+        fprintf(stderr,</div><div class='add'>+                "glfs_fremovexattr volume-id exited with ret: "</div><div class='add'>+                "%d (%s)\n",</div><div class='add'>+                ret, strerror(errno));</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = glfs_fsetxattr(fd, "trusted.abc", "abc", 3, 0);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(stderr,</div><div class='add'>+                "glfs_fsetxattr trusted.abc exited with ret: "</div><div class='add'>+                "%d (%s)\n",</div><div class='add'>+                ret, strerror(errno));</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = glfs_fremovexattr(fd, "trusted.abc");</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(stderr,</div><div class='add'>+                "glfs_fremovexattr trusted.abc exited with "</div><div class='add'>+                "ret: %d (%s)\n",</div><div class='add'>+                ret, strerror(errno));</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    (void)glfs_closedir(fd);</div><div class='add'>+    ret = glfs_fini(fs);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(stderr, "glfs_fini failed with ret: %d (%s)\n", ret,</div><div class='add'>+                strerror(errno));</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='head'>diff --git a/tests/bugs/posix/disallow-gfid-volumeid-fremovexattr.t b/tests/bugs/posix/disallow-gfid-volumeid-fremovexattr.t<br/>new file mode 100755<br/>index 00000000000..b9fd44ae0d7<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/posix/disallow-gfid-volumeid-fremovexattr.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/posix/disallow-gfid-volumeid-fremovexattr.t</a></div><div class='hunk'>@@ -0,0 +1,21 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+## Start and create a volume</div><div class='add'>+TEST glusterd;</div><div class='add'>+TEST pidof glusterd;</div><div class='add'>+TEST $CLI volume info;</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/${V0};</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+logdir=`gluster --print-logdir`</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+TEST build_tester $(dirname $0)/disallow-gfid-volumeid-fremovexattr.c -lgfapi</div><div class='add'>+TEST $(dirname $0)/disallow-gfid-volumeid-fremovexattr $H0 $V0 $logdir/disallow-gfid-volumeid-fremovexattr.log</div><div class='add'>+</div><div class='add'>+cleanup_tester $(dirname $0)/disallow-gfid-volumeid-fremovexattr</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/posix/disallow-gfid-volumeid-removexattr.t b/tests/bugs/posix/disallow-gfid-volumeid-removexattr.t<br/>new file mode 100644<br/>index 00000000000..d26eb21ccc5<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/posix/disallow-gfid-volumeid-removexattr.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/posix/disallow-gfid-volumeid-removexattr.t</a></div><div class='hunk'>@@ -0,0 +1,26 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+#This test checks that gfid/volume-id removexattrs are not allowed.</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+#Basic checks</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume info</div><div class='add'>+</div><div class='add'>+#Create a distributed volume</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/${V0}{1..2};</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+# Mount FUSE</div><div class='add'>+TEST glusterfs -s $H0 --volfile-id $V0 $M0</div><div class='add'>+</div><div class='add'>+TEST ! setfattr -x trusted.gfid $M0</div><div class='add'>+TEST ! setfattr -x trusted.glusterfs.volume-id $M0</div><div class='add'>+TEST setfattr -n trusted.abc -v abc $M0</div><div class='add'>+TEST setfattr -x trusted.abc $M0</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/protocol/bug-1321578.t b/tests/bugs/protocol/bug-1321578.t<br/>new file mode 100644<br/>index 00000000000..83904817467<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/protocol/bug-1321578.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/protocol/bug-1321578.t</a></div><div class='hunk'>@@ -0,0 +1,82 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+check_mounted () {</div><div class='add'>+	df | grep $1 | wc -l</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+CHECK_MOUNT_TIMEOUT=7</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/$V0</div><div class='add'>+</div><div class='add'>+# Set auth.allow to dummy hostname so it *doesn't* include ourselves.</div><div class='add'>+TEST $CLI volume set $V0 auth.allow example.org</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+# "System getspec" will include the username and password if the request comes</div><div class='add'>+# from a server (which we are).  Unfortunately, this will cause authentication</div><div class='add'>+# to succeed in auth.login regardless of whether auth.addr is working properly</div><div class='add'>+# or not, which is useless to us.  To get a proper test, strip out those lines.</div><div class='add'>+$CLI system getspec $V0 | sed -e /username/d -e /password/d &gt; fubar.vol</div><div class='add'>+</div><div class='add'>+# This mount should fail because auth.allow doesn't include us.</div><div class='add'>+TEST $GFS -f fubar.vol $M0</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $CHECK_MOUNT_TIMEOUT 0 check_mounted $M0</div><div class='add'>+</div><div class='add'>+# Add tests when only username is present, but not password</div><div class='add'>+# "System getspec" will include the username and password if the request comes</div><div class='add'>+# from a server (which we are).  Unfortunately, this will cause authentication</div><div class='add'>+# to succeed in auth.login regardless of whether auth.addr is working properly</div><div class='add'>+# or not, which is useless to us.  To get a proper test, strip out those lines.</div><div class='add'>+$CLI system getspec $V0 | sed -e /password/d &gt; fubar.vol</div><div class='add'>+</div><div class='add'>+# This mount should fail because auth.allow doesn't include our password.</div><div class='add'>+TEST $GFS -f fubar.vol $M0</div><div class='add'>+</div><div class='add'>+# If we had DONT_EXPECT_WITHIN we could use that, but we don't.</div><div class='add'>+EXPECT_WITHIN $CHECK_MOUNT_TIMEOUT 0 check_mounted $M0</div><div class='add'>+</div><div class='add'>+# Now, add a test for login failure when server doesn't have the password entry</div><div class='add'>+# Add tests when only username is present, but not password</div><div class='add'>+# "System getspec" will include the username and password if the request comes</div><div class='add'>+# from a server (which we are).  Unfortunately, this will cause authentication</div><div class='add'>+# to succeed in auth.login regardless of whether auth.addr is working properly</div><div class='add'>+# or not, which is useless to us.  To get a proper test, strip out those lines.</div><div class='add'>+$CLI system getspec $V0 &gt; fubar.vol</div><div class='add'>+TEST $CLI volume stop $V0</div><div class='add'>+</div><div class='add'>+sed -i -e '/password /d' /var/lib/glusterd/vols/$V0/$V0.*$V0.vol</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+# This mount should fail because auth.allow doesn't include our password.</div><div class='add'>+TEST $GFS -f fubar.vol $M0</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $CHECK_MOUNT_TIMEOUT 0 check_mounted $M0</div><div class='add'>+</div><div class='add'>+# Set auth.allow to include us.  This mount should therefore succeed.</div><div class='add'>+TEST $CLI volume set $V0 auth.allow $H0</div><div class='add'>+$CLI system getspec $V0 | sed -e /password/d &gt; fubar.vol</div><div class='add'>+</div><div class='add'>+TEST $GFS -f fubar.vol $M0</div><div class='add'>+EXPECT_WITHIN $CHECK_MOUNT_TIMEOUT 1 check_mounted $M0</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+</div><div class='add'>+# Set auth.reject to include us.  This mount should therefore fail.</div><div class='add'>+TEST $CLI volume stop $V0</div><div class='add'>+</div><div class='add'>+TEST $CLI volume set $V0 auth.allow "\*"</div><div class='add'>+TEST $CLI volume set $V0 auth.reject $H0</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+# Do this, so login module is not in picture</div><div class='add'>+$CLI system getspec $V0 | sed -e /password/d &gt; fubar.vol</div><div class='add'>+</div><div class='add'>+TEST $GFS -f fubar.vol $M0</div><div class='add'>+EXPECT_WITHIN $CHECK_MOUNT_TIMEOUT 0 check_mounted $M0</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/bugs/protocol/bug-1390914.t b/tests/bugs/protocol/bug-1390914.t<br/>new file mode 100644<br/>index 00000000000..e3dab92de5a<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/protocol/bug-1390914.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/protocol/bug-1390914.t</a></div><div class='hunk'>@@ -0,0 +1,36 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+. $(dirname $0)/../../fileio.rc</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+#test that fops are not wound on anon-fd when fd is not open on that brick</div><div class='add'>+TEST glusterd;</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 replica 3 $H0:$B0/${V0}{1,2,3};</div><div class='add'>+TEST $CLI volume set $V0 performance.open-behind off</div><div class='add'>+TEST $CLI volume set $V0 diagnostics.client-log-level DEBUG</div><div class='add'>+TEST $CLI volume heal $V0 disable</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+TEST $CLI volume profile $V0 start</div><div class='add'>+TEST $GFS -s $H0 --volfile-id=$V0 --direct-io-mode=enable $M0;</div><div class='add'>+</div><div class='add'>+TEST touch $M0/1</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}1</div><div class='add'>+TEST fd_open 200 'w' "$M0/1"</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 0</div><div class='add'>+</div><div class='add'>+#lk should only happen on 2 bricks, if there is a bug, it will plant a lock</div><div class='add'>+#with anon-fd on first-brick which will never be released because flush won't</div><div class='add'>+#be wound below server xlator for anon-fd</div><div class='add'>+TEST flock -x -n 200</div><div class='add'>+TEST fd_close 200</div><div class='add'>+</div><div class='add'>+TEST fd_open 200 'w' "$M0/1"</div><div class='add'>+#this lock will fail if there is a stale lock</div><div class='add'>+TEST flock -x -n 200</div><div class='add'>+TEST fd_close 200</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/protocol/bug-1433815-auth-allow.t b/tests/bugs/protocol/bug-1433815-auth-allow.t<br/>new file mode 100644<br/>index 00000000000..a78c0eb7111<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/protocol/bug-1433815-auth-allow.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/protocol/bug-1433815-auth-allow.t</a></div><div class='hunk'>@@ -0,0 +1,40 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+check_mounted () {</div><div class='add'>+	df | grep $1 | wc -l</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+get_addresses () {</div><div class='add'>+	ip addr | sed -n '/.*inet \([0-9.]*\).*/s//\1/p' | tr '\n' ','</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/$V0</div><div class='add'>+</div><div class='add'>+# Set auth.allow so it *doesn't* include ourselves.</div><div class='add'>+TEST $CLI volume set $V0 auth.allow 1.2.3.4</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" online_brick_count</div><div class='add'>+</div><div class='add'>+# "System getspec" will include the username and password if the request comes</div><div class='add'>+# from a server (which we are).  Unfortunately, this will cause authentication</div><div class='add'>+# to succeed in auth.login regardless of whether auth.addr is working properly</div><div class='add'>+# or not, which is useless to us.  To get a proper test, strip out those lines.</div><div class='add'>+$CLI system getspec $V0 | sed -e /username/d -e /password/d &gt; fubar.vol</div><div class='add'>+</div><div class='add'>+# This mount should fail because auth.allow doesn't include us.</div><div class='add'>+TEST $GFS -f fubar.vol $M0</div><div class='add'>+# If we had DONT_EXPECT_WITHIN we could use that, but we don't.</div><div class='add'>+sleep 10</div><div class='add'>+EXPECT 0 check_mounted $M0</div><div class='add'>+</div><div class='add'>+# Set auth.allow to include us.  This mount should therefore succeed.</div><div class='add'>+TEST $CLI volume set $V0 auth.allow "$(get_addresses)"</div><div class='add'>+TEST $GFS -f fubar.vol $M0</div><div class='add'>+sleep 10</div><div class='add'>+EXPECT 1 check_mounted $M0</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/bugs/protocol/bug-762989.t b/tests/bugs/protocol/bug-762989.t<br/>new file mode 100755<br/>index 00000000000..7d201b78b58<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/protocol/bug-762989.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/protocol/bug-762989.t</a></div><div class='hunk'>@@ -0,0 +1,40 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+# Skip the entire test if ip_local_reserved_ports does not exist</div><div class='add'>+if [ ! -f /proc/sys/net/ipv4/ip_local_reserved_ports ] ; then</div><div class='add'>+    echo "Skip test on /proc/sys/net/ipv4/ip_local_reserved_ports, "\</div><div class='add'>+         "which does not exists on this system" &gt;&amp;2</div><div class='add'>+    SKIP_TESTS</div><div class='add'>+    exit 0</div><div class='add'>+fi</div><div class='add'>+</div><div class='add'>+## reserve port 1023</div><div class='add'>+older_ports=$(cat /proc/sys/net/ipv4/ip_local_reserved_ports);</div><div class='add'>+echo "1023" &gt; /proc/sys/net/ipv4/ip_local_reserved_ports;</div><div class='add'>+</div><div class='add'>+## Start and create a volume</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume info;</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 replica 3 $H0:$B0/${V0}{1,2,3,4,5,6};</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+</div><div class='add'>+TEST glusterfs --entry-timeout=0 --attribute-timeout=0 -s $H0 --volfile-id $V0 \</div><div class='add'>+$M0;</div><div class='add'>+</div><div class='add'>+## Wait for volume to register with rpc.mountd</div><div class='add'>+sleep 6;</div><div class='add'>+## check if port 1023 (which has been reserved) is used by the gluster processes</div><div class='add'>+op=$(netstat -ntp | grep gluster | grep -w 1023);</div><div class='add'>+EXPECT "" echo $op;</div><div class='add'>+</div><div class='add'>+#set the reserved ports to the older values</div><div class='add'>+echo $older_ports &gt; /proc/sys/net/ipv4/ip_local_reserved_ports</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/protocol/bug-808400-dist.t b/tests/bugs/protocol/bug-808400-dist.t<br/>new file mode 100755<br/>index 00000000000..0df972585c0<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/protocol/bug-808400-dist.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/protocol/bug-808400-dist.t</a></div><div class='hunk'>@@ -0,0 +1,32 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume info;</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/brick1 $H0:$B0/brick2;</div><div class='add'>+EXPECT 'Created' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+EXPECT 'Started' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+MOUNTDIR=$M0;</div><div class='add'>+TEST glusterfs --entry-timeout=0 --attribute-timeout=0 --volfile-server=$H0 --volfile-id=$V0 $MOUNTDIR;</div><div class='add'>+</div><div class='add'>+build_tester $(dirname $0)/bug-808400-flock.c</div><div class='add'>+build_tester $(dirname $0)/bug-808400-fcntl.c</div><div class='add'>+</div><div class='add'>+TEST $(dirname $0)/bug-808400-flock $MOUNTDIR/testfile \'gluster volume set $V0 performance.write-behind off\'</div><div class='add'>+TEST $(dirname $0)/bug-808400-fcntl $MOUNTDIR/testfile \'gluster volume set $V0 performance.write-behind on\'</div><div class='add'>+</div><div class='add'>+TEST rm -rf $MOUNTDIR/*</div><div class='add'>+TEST rm -rf $(dirname $0)/bug-808400-flock $(dirname $0)/bug-808400-fcntl $(dirname $0)/glusterfs.log</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $MOUNTDIR</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/protocol/bug-808400-fcntl.c b/tests/bugs/protocol/bug-808400-fcntl.c<br/>new file mode 100644<br/>index 00000000000..a703ca5c120<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/protocol/bug-808400-fcntl.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/protocol/bug-808400-fcntl.c</a></div><div class='hunk'>@@ -0,0 +1,124 @@</div><div class='add'>+#include &lt;sys/file.h&gt;</div><div class='add'>+#include &lt;stdio.h&gt;</div><div class='add'>+#include &lt;string.h&gt;</div><div class='add'>+#include &lt;errno.h&gt;</div><div class='add'>+#include &lt;sys/types.h&gt;</div><div class='add'>+#include &lt;sys/stat.h&gt;</div><div class='add'>+#include &lt;fcntl.h&gt;</div><div class='add'>+#include &lt;sys/wait.h&gt;</div><div class='add'>+</div><div class='add'>+#ifndef linux</div><div class='add'>+#define fstat64(fd, st) fstat(fd, st)</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+run_child(char *filename)</div><div class='add'>+{</div><div class='add'>+    int fd = -1, ret = -1;</div><div class='add'>+    struct flock lock = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int ppid = 0;</div><div class='add'>+</div><div class='add'>+    fd = open(filename, O_RDWR);</div><div class='add'>+    if (fd &lt; 0) {</div><div class='add'>+        fprintf(stderr, "open failed (%s)\n", strerror(errno));</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ppid = getppid();</div><div class='add'>+</div><div class='add'>+    lock.l_type = F_WRLCK;</div><div class='add'>+    lock.l_whence = SEEK_SET;</div><div class='add'>+    lock.l_start = 0;</div><div class='add'>+    lock.l_len = 0;</div><div class='add'>+</div><div class='add'>+    ret = fcntl(fd, F_GETLK, &amp;lock);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(stderr, "GETLK failed (%s)\n", strerror(errno));</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if ((lock.l_type == F_UNLCK) || (ppid != lock.l_pid)) {</div><div class='add'>+        fprintf(stderr,</div><div class='add'>+                "no locks present, though parent has held "</div><div class='add'>+                "one\n");</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+main(int argc, char *argv[])</div><div class='add'>+{</div><div class='add'>+    int fd = -1, ret = -1, status = 0;</div><div class='add'>+    char *filename = NULL, *cmd = NULL;</div><div class='add'>+    struct stat stbuf = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    struct flock lock = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    if (argc != 3) {</div><div class='add'>+        fprintf(stderr,</div><div class='add'>+                "Usage: %s &lt;filename&gt; "</div><div class='add'>+                "&lt;gluster-cmd-to-trigger-graph-switch&gt;\n",</div><div class='add'>+                argv[0]);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    filename = argv[1];</div><div class='add'>+    cmd = argv[2];</div><div class='add'>+</div><div class='add'>+    fd = open(filename, O_RDWR | O_CREAT, 0);</div><div class='add'>+    if (fd &lt; 0) {</div><div class='add'>+        fprintf(stderr, "open (%s) failed (%s)\n", filename, strerror(errno));</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    lock.l_type = F_WRLCK;</div><div class='add'>+    lock.l_whence = SEEK_SET;</div><div class='add'>+    lock.l_start = 0;</div><div class='add'>+    lock.l_len = 0;</div><div class='add'>+</div><div class='add'>+    ret = fcntl(fd, F_SETLK, &amp;lock);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(stderr, "fcntl failed (%s)\n", strerror(errno));</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    system(cmd);</div><div class='add'>+</div><div class='add'>+    /* wait till graph switch completes */</div><div class='add'>+    ret = fstat64(fd, &amp;stbuf);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(stderr, "fstat64 failure (%s)\n", strerror(errno));</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    sleep(10);</div><div class='add'>+</div><div class='add'>+    /* By now old-graph would be disconnected and locks should be cleaned</div><div class='add'>+     * up if they are not migrated. Check that by trying to acquire a lock</div><div class='add'>+     * on a new fd opened by another process on same file.</div><div class='add'>+     */</div><div class='add'>+    ret = fork();</div><div class='add'>+    if (ret == 0) {</div><div class='add'>+        ret = run_child(filename);</div><div class='add'>+    } else {</div><div class='add'>+        wait(&amp;status);</div><div class='add'>+        if (WIFEXITED(status)) {</div><div class='add'>+            ret = WEXITSTATUS(status);</div><div class='add'>+        } else {</div><div class='add'>+            ret = 0;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='head'>diff --git a/tests/bugs/protocol/bug-808400-flock.c b/tests/bugs/protocol/bug-808400-flock.c<br/>new file mode 100644<br/>index 00000000000..54a507cc227<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/protocol/bug-808400-flock.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/protocol/bug-808400-flock.c</a></div><div class='hunk'>@@ -0,0 +1,100 @@</div><div class='add'>+#include &lt;sys/file.h&gt;</div><div class='add'>+#include &lt;stdio.h&gt;</div><div class='add'>+#include &lt;string.h&gt;</div><div class='add'>+#include &lt;errno.h&gt;</div><div class='add'>+#include &lt;sys/types.h&gt;</div><div class='add'>+#include &lt;sys/stat.h&gt;</div><div class='add'>+#include &lt;fcntl.h&gt;</div><div class='add'>+#include &lt;sys/wait.h&gt;</div><div class='add'>+</div><div class='add'>+#ifndef linux</div><div class='add'>+#define fstat64(fd, st) fstat(fd, st)</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+run_child(char *filename)</div><div class='add'>+{</div><div class='add'>+    int fd = -1, ret = -1;</div><div class='add'>+</div><div class='add'>+    fd = open(filename, O_RDWR);</div><div class='add'>+    if (fd &lt; 0) {</div><div class='add'>+        fprintf(stderr, "open failed (%s)\n", strerror(errno));</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = flock(fd, LOCK_EX | LOCK_NB);</div><div class='add'>+    if ((ret == 0) || (errno != EWOULDBLOCK)) {</div><div class='add'>+        fprintf(stderr,</div><div class='add'>+                "no locks present, though parent has held "</div><div class='add'>+                "one\n");</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+main(int argc, char *argv[])</div><div class='add'>+{</div><div class='add'>+    int fd = -1, ret = -1, status = 0;</div><div class='add'>+    char *filename = NULL, *cmd = NULL;</div><div class='add'>+    struct stat stbuf = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    if (argc != 3) {</div><div class='add'>+        fprintf(stderr,</div><div class='add'>+                "Usage: %s &lt;filename&gt; "</div><div class='add'>+                "&lt;gluster-cmd-to-trigger-graph-switch&gt;\n",</div><div class='add'>+                argv[0]);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    filename = argv[1];</div><div class='add'>+    cmd = argv[2];</div><div class='add'>+</div><div class='add'>+    fd = open(filename, O_RDWR | O_CREAT, 0);</div><div class='add'>+    if (fd &lt; 0) {</div><div class='add'>+        fprintf(stderr, "open (%s) failed (%s)\n", filename, strerror(errno));</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = flock(fd, LOCK_EX);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(stderr, "flock failed (%s)\n", strerror(errno));</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    system(cmd);</div><div class='add'>+</div><div class='add'>+    /* wait till graph switch completes */</div><div class='add'>+    ret = fstat64(fd, &amp;stbuf);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(stderr, "fstat64 failure (%s)\n", strerror(errno));</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    sleep(10);</div><div class='add'>+</div><div class='add'>+    /* By now old-graph would be disconnected and locks should be cleaned</div><div class='add'>+     * up if they are not migrated. Check that by trying to acquire a lock</div><div class='add'>+     * on a new fd opened by another process on same file</div><div class='add'>+     */</div><div class='add'>+    ret = fork();</div><div class='add'>+    if (ret == 0) {</div><div class='add'>+        ret = run_child(filename);</div><div class='add'>+    } else {</div><div class='add'>+        wait(&amp;status);</div><div class='add'>+        if (WIFEXITED(status)) {</div><div class='add'>+            ret = WEXITSTATUS(status);</div><div class='add'>+        } else {</div><div class='add'>+            ret = 0;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='head'>diff --git a/tests/bugs/protocol/bug-808400-repl.t b/tests/bugs/protocol/bug-808400-repl.t<br/>new file mode 100755<br/>index 00000000000..611e5ec93b7<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/protocol/bug-808400-repl.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/protocol/bug-808400-repl.t</a></div><div class='hunk'>@@ -0,0 +1,31 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume info;</div><div class='add'>+TEST $CLI volume create $V0 replica 2 $H0:$B0/brick1 $H0:$B0/brick2;</div><div class='add'>+EXPECT 'Created' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+EXPECT 'Started' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+MOUNTDIR=$M0;</div><div class='add'>+TEST glusterfs --entry-timeout=0 --attribute-timeout=0 --volfile-server=$H0 --volfile-id=$V0 $MOUNTDIR;</div><div class='add'>+</div><div class='add'>+build_tester $(dirname $0)/bug-808400-flock.c</div><div class='add'>+build_tester $(dirname $0)/bug-808400-fcntl.c</div><div class='add'>+</div><div class='add'>+TEST $(dirname $0)/bug-808400-flock $MOUNTDIR/testfile \'gluster volume set $V0 performance.write-behind off\'</div><div class='add'>+TEST $(dirname $0)/bug-808400-fcntl $MOUNTDIR/testfile \'gluster volume set $V0 performance.write-behind on\'</div><div class='add'>+</div><div class='add'>+TEST rm -rf $MOUNTDIR/*</div><div class='add'>+TEST rm -rf $(dirname $0)/bug-808400-flock $(dirname $0)/bug-808400-fcntl $(dirname $0)/glusterfs.log</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $MOUNTDIR</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/protocol/bug-808400.t b/tests/bugs/protocol/bug-808400.t<br/>new file mode 100755<br/>index 00000000000..4ae1722fca2<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/protocol/bug-808400.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/protocol/bug-808400.t</a></div><div class='hunk'>@@ -0,0 +1,35 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume info;</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/brick1;</div><div class='add'>+EXPECT 'Created' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+EXPECT 'Started' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+#mount on a random dir</div><div class='add'>+TEST MOUNTDIR="/tmp/$RANDOM"</div><div class='add'>+TEST mkdir $MOUNTDIR</div><div class='add'>+TEST glusterfs --entry-timeout=0 --attribute-timeout=0 --volfile-server=$H0 --volfile-id=$V0 $MOUNTDIR;</div><div class='add'>+</div><div class='add'>+build_tester $(dirname $0)/bug-808400-flock.c</div><div class='add'>+build_tester $(dirname $0)/bug-808400-fcntl.c</div><div class='add'>+</div><div class='add'>+TEST $(dirname $0)/bug-808400-flock $MOUNTDIR/testfile \'gluster volume set $V0 performance.write-behind off\'</div><div class='add'>+TEST $(dirname $0)/bug-808400-fcntl $MOUNTDIR/testfile \'gluster volume set $V0 performance.write-behind on\'</div><div class='add'>+</div><div class='add'>+TEST rm -rf $MOUNTDIR/*</div><div class='add'>+TEST rm -rf $(dirname $0)/bug-808400-flock $(dirname $0)/bug-808400-fcntl $(dirname $0)/glusterfs.log</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $MOUNTDIR</div><div class='add'>+TEST   rm -rf $MOUNTDIR</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/quick-read/bug-846240.t b/tests/bugs/quick-read/bug-846240.t<br/>new file mode 100755<br/>index 00000000000..bb997e10013<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/quick-read/bug-846240.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/quick-read/bug-846240.t</a></div><div class='hunk'>@@ -0,0 +1,59 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+. $(dirname $0)/../../fileio.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume info;</div><div class='add'>+</div><div class='add'>+function volinfo_field()</div><div class='add'>+{</div><div class='add'>+    local vol=$1;</div><div class='add'>+    local field=$2;</div><div class='add'>+</div><div class='add'>+    $CLI volume info $vol | grep "^$field: " | sed 's/.*: //';</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/brick1 $H0:$B0/brick2;</div><div class='add'>+EXPECT 'Created' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+EXPECT 'Started' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+MOUNTDIR=$M0;</div><div class='add'>+TEST glusterfs --volfile-server=$H0 --volfile-id=$V0 $MOUNTDIR;</div><div class='add'>+TEST glusterfs --volfile-server=$H0 --volfile-id=$V0 $M1;</div><div class='add'>+</div><div class='add'>+TEST touch $M0/testfile;</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+TEST glusterfs --volfile-server=$H0 --volfile-id=$V0 $M0;</div><div class='add'>+</div><div class='add'>+# open the file with the fd as 4</div><div class='add'>+TEST fd=`fd_available`;</div><div class='add'>+TEST fd_open $fd 'w' "$M0/testfile";</div><div class='add'>+</div><div class='add'>+# remove the file from the other mount point. If unlink is sent from</div><div class='add'>+# $M0 itself, then the file will be actually opened by open-behind which</div><div class='add'>+# we dont want for this testcase</div><div class='add'>+TEST rm -f $M1/testfile;</div><div class='add'>+</div><div class='add'>+# below command opens the file and writes to the file.</div><div class='add'>+# upon open, open-behind unwinds the open call with success.</div><div class='add'>+# now when write comes, open-behind actually opens the file</div><div class='add'>+# and then sends write on the fd. But before sending open itself,</div><div class='add'>+# the file would have been removed from the mount $M1. open() gets error</div><div class='add'>+# and the write call which is put into a stub (open had to be sent first)</div><div class='add'>+# should unwind with the error received in the open call.</div><div class='add'>+TEST ! fd_write $fd data</div><div class='add'>+</div><div class='add'>+TEST fd_close $fd;</div><div class='add'>+</div><div class='add'>+TEST rm -rf $MOUNTDIR/*</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $MOUNTDIR</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/quick-read/bz1523599/bz1523599.t b/tests/bugs/quick-read/bz1523599/bz1523599.t<br/>new file mode 100755<br/>index 00000000000..5027efe8e9a<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/quick-read/bz1523599/bz1523599.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/quick-read/bz1523599/bz1523599.t</a></div><div class='hunk'>@@ -0,0 +1,32 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../../include.rc</div><div class='add'>+. $(dirname $0)/../../../volume.rc</div><div class='add'>+. $(dirname $0)/../../../fileio.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/brick1;</div><div class='add'>+EXPECT 'Created' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+EXPECT 'Started' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+logdir=`gluster --print-logdir`</div><div class='add'>+</div><div class='add'>+TEST build_tester $(dirname $0)/test_bz1523599.c -lgfapi -o $(dirname $0)/test_bz1523599</div><div class='add'>+TEST ./$(dirname $0)/test_bz1523599 0 $H0 $V0 test_bz1523599 $logdir/bz1523599.log</div><div class='add'>+TEST ./$(dirname $0)/test_bz1523599 1 $H0 $V0 test_bz1523599 $logdir/bz1523599.log</div><div class='add'>+TEST ./$(dirname $0)/test_bz1523599 0 $H0 $V0 test_bz1523599 $logdir/bz1523599.log</div><div class='add'>+TEST ./$(dirname $0)/test_bz1523599 2 $H0 $V0 test_bz1523599 $logdir/bz1523599.log</div><div class='add'>+</div><div class='add'>+cleanup_tester $(dirname $0)/test_bz1523599</div><div class='add'>+</div><div class='add'>+TEST $CLI volume stop $V0</div><div class='add'>+TEST $CLI volume delete $V0</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='head'>diff --git a/tests/bugs/quick-read/bz1523599/test_bz1523599.c b/tests/bugs/quick-read/bz1523599/test_bz1523599.c<br/>new file mode 100644<br/>index 00000000000..5076a9447f3<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/quick-read/bz1523599/test_bz1523599.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/quick-read/bz1523599/test_bz1523599.c</a></div><div class='hunk'>@@ -0,0 +1,198 @@</div><div class='add'>+/*</div><div class='add'>+ * ./test_bz1523599 0 vm140-111 gv0 test211 log</div><div class='add'>+ * ./test_bz1523599 1 vm140-111 gv0 test211 log</div><div class='add'>+ * Open - Discard - Read - Then check read information to see if the initial</div><div class='add'>+ * TEST_STR_LEN/2 bytes read zero</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+#define _GNU_SOURCE</div><div class='add'>+#include &lt;stdio.h&gt;</div><div class='add'>+#include &lt;stdlib.h&gt;</div><div class='add'>+#include &lt;glusterfs/api/glfs.h&gt;</div><div class='add'>+#include &lt;glusterfs/api/glfs-handles.h&gt;</div><div class='add'>+#include &lt;errno.h&gt;</div><div class='add'>+#include &lt;sys/uio.h&gt;</div><div class='add'>+</div><div class='add'>+#define TEST_STR_LEN 2048</div><div class='add'>+</div><div class='add'>+enum fallocate_flag {</div><div class='add'>+    TEST_WRITE,</div><div class='add'>+    TEST_DISCARD,</div><div class='add'>+    TEST_ZEROFILL,</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+print_str(char *str, int len)</div><div class='add'>+{</div><div class='add'>+    int i, addr;</div><div class='add'>+</div><div class='add'>+    printf("%07x\t", 0);</div><div class='add'>+    for (i = 0; i &lt; len; i++) {</div><div class='add'>+        printf("%02x", str[i]);</div><div class='add'>+        if (i) {</div><div class='add'>+            if ((i + 1) % 16 == 0)</div><div class='add'>+                printf("\n%07x\t", i + 1);</div><div class='add'>+            else if ((i + 1) % 4 == 0)</div><div class='add'>+                printf(" ");</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    printf("\n");</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+test_read(char *str, int total_length, int len_zero)</div><div class='add'>+{</div><div class='add'>+    int i;</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; len_zero; i++) {</div><div class='add'>+        if (str[i]) {</div><div class='add'>+            fprintf(stderr, "char at position %d not zeroed out\n", i);</div><div class='add'>+            ret = -EIO;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    for (i = len_zero; i &lt; total_length; i++) {</div><div class='add'>+        if (str[i] != 0x11) {</div><div class='add'>+            fprintf(stderr, "char at position %d does not contain pattern\n",</div><div class='add'>+                    i);</div><div class='add'>+            ret = -EIO;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+main(int argc, char *argv[])</div><div class='add'>+{</div><div class='add'>+    int opcode;</div><div class='add'>+    char *host_name, *volume_name, *file_path, *glfs_log_path;</div><div class='add'>+    glfs_t *fs = NULL;</div><div class='add'>+    glfs_fd_t *fd = NULL;</div><div class='add'>+    off_t offset = 0;</div><div class='add'>+    size_t len_zero = TEST_STR_LEN / 2;</div><div class='add'>+    char writestr[TEST_STR_LEN];</div><div class='add'>+    char readstr[TEST_STR_LEN];</div><div class='add'>+    struct iovec iov = {&amp;readstr, TEST_STR_LEN};</div><div class='add'>+    int i;</div><div class='add'>+    int ret = 1;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; TEST_STR_LEN; i++)</div><div class='add'>+        writestr[i] = 0x11;</div><div class='add'>+    for (i = 0; i &lt; TEST_STR_LEN; i++)</div><div class='add'>+        readstr[i] = 0x22;</div><div class='add'>+</div><div class='add'>+    if (argc != 6) {</div><div class='add'>+        fprintf(</div><div class='add'>+            stderr,</div><div class='add'>+            "Syntax: %s &lt;test type&gt; &lt;host&gt; &lt;volname&gt; &lt;file-path&gt; &lt;log-file&gt;\n",</div><div class='add'>+            argv[0]);</div><div class='add'>+        return 1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    opcode = atoi(argv[1]);</div><div class='add'>+    host_name = argv[2];</div><div class='add'>+    volume_name = argv[3];</div><div class='add'>+    file_path = argv[4];</div><div class='add'>+    glfs_log_path = argv[5];</div><div class='add'>+</div><div class='add'>+    fs = glfs_new(volume_name);</div><div class='add'>+    if (!fs) {</div><div class='add'>+        perror("glfs_new");</div><div class='add'>+        return 1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = glfs_set_volfile_server(fs, "tcp", host_name, 24007);</div><div class='add'>+    if (ret != 0) {</div><div class='add'>+        perror("glfs_set_volfile_server");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = glfs_set_logging(fs, glfs_log_path, 7);</div><div class='add'>+    if (ret != 0) {</div><div class='add'>+        perror("glfs_set_logging");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = glfs_init(fs);</div><div class='add'>+    if (ret != 0) {</div><div class='add'>+        perror("glfs_init");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    fd = glfs_creat(fs, file_path, O_RDWR, 0777);</div><div class='add'>+    if (fd == NULL) {</div><div class='add'>+        perror("glfs_creat");</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    switch (opcode) {</div><div class='add'>+        case TEST_WRITE:</div><div class='add'>+            fprintf(stderr, "Test Write\n");</div><div class='add'>+            ret = glfs_write(fd, writestr, TEST_STR_LEN, 0);</div><div class='add'>+            if (ret &lt; 0) {</div><div class='add'>+                perror("glfs_write");</div><div class='add'>+                goto out;</div><div class='add'>+            } else if (ret != TEST_STR_LEN) {</div><div class='add'>+                fprintf(stderr, "insufficient data written %d \n", ret);</div><div class='add'>+                ret = -EIO;</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+            ret = 0;</div><div class='add'>+            goto out;</div><div class='add'>+        case TEST_DISCARD:</div><div class='add'>+            fprintf(stderr, "Test Discard\n");</div><div class='add'>+            ret = glfs_discard(fd, offset, len_zero);</div><div class='add'>+            if (ret &lt; 0) {</div><div class='add'>+                if (errno == EOPNOTSUPP) {</div><div class='add'>+                    fprintf(stderr, "Operation not supported\n");</div><div class='add'>+                    ret = 0;</div><div class='add'>+                    goto out;</div><div class='add'>+                }</div><div class='add'>+                perror("glfs_discard");</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+            goto test_read;</div><div class='add'>+        case TEST_ZEROFILL:</div><div class='add'>+            fprintf(stderr, "Test Zerofill\n");</div><div class='add'>+            ret = glfs_zerofill(fd, offset, len_zero);</div><div class='add'>+            if (ret &lt; 0) {</div><div class='add'>+                if (errno == EOPNOTSUPP) {</div><div class='add'>+                    fprintf(stderr, "Operation not supported\n");</div><div class='add'>+                    ret = 0;</div><div class='add'>+                    goto out;</div><div class='add'>+                }</div><div class='add'>+                perror("glfs_zerofill");</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+            goto test_read;</div><div class='add'>+        default:</div><div class='add'>+            ret = -1;</div><div class='add'>+            fprintf(stderr, "Incorrect test code %d\n", opcode);</div><div class='add'>+            goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+test_read:</div><div class='add'>+    ret = glfs_readv(fd, &amp;iov, 1, 0);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        perror("glfs_readv");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* printf("Read str\n"); print_str(readstr, TEST_STR_LEN); printf("\n"); */</div><div class='add'>+    ret = test_read(readstr, TEST_STR_LEN, len_zero);</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (fd)</div><div class='add'>+        glfs_close(fd);</div><div class='add'>+    glfs_fini(fs);</div><div class='add'>+</div><div class='add'>+    if (ret)</div><div class='add'>+        return -1;</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='head'>diff --git a/tests/bugs/quota/afr-quota-xattr-mdata-heal.t b/tests/bugs/quota/afr-quota-xattr-mdata-heal.t<br/>new file mode 100644<br/>index 00000000000..ebfa5545728<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/quota/afr-quota-xattr-mdata-heal.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/quota/afr-quota-xattr-mdata-heal.t</a></div><div class='hunk'>@@ -0,0 +1,140 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST $CLI volume create $V0 replica 2 $H0:$B0/${V0}{0,1}</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+TEST glusterfs --volfile-id=/$V0 --volfile-server=$H0 $M0 --attribute-timeout=0 --entry-timeout=0</div><div class='add'>+TEST $CLI volume quota $V0 enable</div><div class='add'>+TEST $CLI volume quota $V0 limit-usage / 1MB</div><div class='add'>+TEST mkdir $M0/d</div><div class='add'>+TEST $CLI volume quota $V0 limit-usage /d 1MB</div><div class='add'>+TEST touch $M0/d/a</div><div class='add'>+echo abc &gt; $M0/d/a</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $MARKER_UPDATE_TIMEOUT "512Bytes" quotausage "/"</div><div class='add'>+</div><div class='add'>+#Set the acl xattrs directly on backend, for some reason on mount it gives error</div><div class='add'>+acl_access_val="0x0200000001000600ffffffff04000400ffffffff10000400ffffffff20000400ffffffff"</div><div class='add'>+acl_file_val="0x0000000400000001ffffffff0006000000000004ffffffff0004000000000010ffffffff0004000000000020ffffffff00040000"</div><div class='add'>+TEST setfattr -n system.posix_acl_access -v $acl_access_val $B0/${V0}0/d</div><div class='add'>+TEST setfattr -n trusted.SGI_ACL_FILE -v $acl_file_val $B0/${V0}0/d</div><div class='add'>+TEST setfattr -n system.posix_acl_access -v $acl_access_val $B0/${V0}1/d</div><div class='add'>+TEST setfattr -n trusted.SGI_ACL_FILE -v $acl_file_val $B0/${V0}1/d</div><div class='add'>+TEST setfattr -n trusted.foo -v "baz" $M0/d</div><div class='add'>+TEST setfattr -n trusted.foo -v "baz" $M0/d/a</div><div class='add'>+TEST setfattr -n trusted.foo1 -v "baz1" $M0/d</div><div class='add'>+TEST setfattr -n trusted.foo1 -v "baz1" $M0/d/a</div><div class='add'>+TEST setfattr -n trusted.foo3 -v "unchanged" $M0/d</div><div class='add'>+TEST setfattr -n trusted.foo3 -v "unchanged" $M0/d/a</div><div class='add'>+</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}0</div><div class='add'>+#Induce metadata self-heal</div><div class='add'>+TEST setfattr -n trusted.foo -v "bar" $M0/d</div><div class='add'>+TEST setfattr -n trusted.foo -v "bar" $M0/d/a</div><div class='add'>+TEST setfattr -x trusted.foo1 $M0/d</div><div class='add'>+TEST setfattr -x trusted.foo1 $M0/d/a</div><div class='add'>+TEST setfattr -n trusted.foo2 -v "bar2" $M0/d</div><div class='add'>+TEST setfattr -n trusted.foo2 -v "bar2" $M0/d/a</div><div class='add'>+d_quota_contri=$(getfattr -d -m . -e hex $B0/${V0}1/d | grep -E "trusted.glusterfs.quota.*.contri")</div><div class='add'>+d_quota_dirty=$(getfattr -d -m . -e hex  $B0/${V0}1/d | grep -E "trusted.glusterfs.quota.dirty")</div><div class='add'>+d_quota_limit=$(getfattr -d -m . -e hex  $B0/${V0}1/d | grep -E "trusted.glusterfs.quota.limit-set")</div><div class='add'>+d_quota_size=$(getfattr -d -m . -e hex   $B0/${V0}1/d | grep -E "trusted.glusterfs.quota.size")</div><div class='add'>+</div><div class='add'>+a_pgfid=$(getfattr -d -m . -e hex   $B0/${V0}1/d/a | grep -E "trusted.pgfid.")</div><div class='add'>+</div><div class='add'>+#Change internal xattrs in the backend, later check that they are not healed</div><div class='add'>+TEST setfattr -n trusted.glusterfs.quota.00000000-0000-0000-0000-000000000001.contri -v 0x0000000000000400 $B0/${V0}0/d</div><div class='add'>+TEST setfattr -n trusted.glusterfs.quota.dirty -v 0x0000000000000400 $B0/${V0}0/d</div><div class='add'>+TEST setfattr -n trusted.glusterfs.quota.limit-set -v 0x0000000000000400 $B0/${V0}0/d #This will be healed, this is external xattr</div><div class='add'>+TEST setfattr -n trusted.glusterfs.quota.size -v 0x0000000000000400 $B0/${V0}0/d</div><div class='add'>+TEST setfattr -n $(echo $a_pgfid | cut -f1 -d'=') -v "orphan" $B0/${V0}0/d/a</div><div class='add'>+</div><div class='add'>+TEST $CLI volume set $V0 cluster.self-heal-daemon on</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "Y" glustershd_up_status</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 0</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "0" get_pending_heal_count $V0</div><div class='add'>+</div><div class='add'>+#Check external xattrs match</div><div class='add'>+EXPECT "bar" echo $(getfattr -d -m. -e text $B0/${V0}0/d | grep trusted.foo)</div><div class='add'>+EXPECT "bar" echo $(getfattr -d -m. -e text $B0/${V0}0/d/a | grep trusted.foo)</div><div class='add'>+TEST ! getfattr -n trusted.foo1 $B0/${V0}0/d</div><div class='add'>+TEST ! getfattr -n trusted.foo1 $B0/${V0}0/d/a</div><div class='add'>+EXPECT "unchanged" echo $(getfattr -d -m. -e text $B0/${V0}0/d | grep trusted.foo3)</div><div class='add'>+EXPECT "unchanged" echo $(getfattr -d -m. -e text $B0/${V0}0/d/a | grep trusted.foo3)</div><div class='add'>+EXPECT "bar2" echo $(getfattr -d -m. -e text $B0/${V0}0/d | grep trusted.foo2)</div><div class='add'>+EXPECT "bar2" echo $(getfattr -d -m. -e text $B0/${V0}0/d/a | grep trusted.foo2)</div><div class='add'>+EXPECT "$d_quota_limit" echo $(getfattr -d -m . -e hex  $B0/${V0}0/d | grep "trusted.glusterfs.quota.limit-set")</div><div class='add'>+</div><div class='add'>+EXPECT "bar" echo $(getfattr -d -m. -e text $B0/${V0}1/d | grep trusted.foo)</div><div class='add'>+EXPECT "bar" echo $(getfattr -d -m. -e text $B0/${V0}1/d/a | grep trusted.foo)</div><div class='add'>+TEST ! getfattr -n trusted.foo1 $B0/${V0}1/d</div><div class='add'>+TEST ! getfattr -n trusted.foo1 $B0/${V0}1/d/a</div><div class='add'>+EXPECT "unchanged" echo $(getfattr -d -m. -e text $B0/${V0}1/d | grep trusted.foo3)</div><div class='add'>+EXPECT "unchanged" echo $(getfattr -d -m. -e text $B0/${V0}1/d/a | grep trusted.foo3)</div><div class='add'>+EXPECT "bar2" echo $(getfattr -d -m. -e text $B0/${V0}1/d | grep trusted.foo2)</div><div class='add'>+EXPECT "bar2" echo $(getfattr -d -m. -e text $B0/${V0}1/d/a | grep trusted.foo2)</div><div class='add'>+EXPECT "$d_quota_limit" echo $(getfattr -d -m . -e hex  $B0/${V0}1/d | grep "trusted.glusterfs.quota.limit-set")</div><div class='add'>+</div><div class='add'>+#Test that internal xattrs on B0 are not healed</div><div class='add'>+EXPECT 0x0000000000000400 echo $(getfattr -d -m. -e hex $B0/${V0}0/d | grep trusted.glusterfs.quota.00000000-0000-0000-0000-000000000001.contri)</div><div class='add'>+EXPECT 0x0000000000000400 echo $(getfattr -d -m. -e hex $B0/${V0}0/d | grep trusted.glusterfs.quota.dirty)</div><div class='add'>+EXPECT "$d_quota_limit" echo $(getfattr -d -m. -e hex $B0/${V0}0/d | grep trusted.glusterfs.quota.limit-set) #This will be healed, this is external xattr</div><div class='add'>+EXPECT 0x0000000000000400 echo $(getfattr -d -m. -e hex $B0/${V0}0/d | grep trusted.glusterfs.quota.size)</div><div class='add'>+EXPECT "$acl_access_val" echo $(getfattr -d -m. -e hex $B0/${V0}0/d | grep system.posix_acl_access)</div><div class='add'>+EXPECT "$acl_file_val" echo $(getfattr -d -m. -e hex $B0/${V0}0/d | grep trusted.SGI_ACL_FILE)</div><div class='add'>+EXPECT "orphan" echo $(getfattr -d -m. -e text $B0/${V0}0/d/a | grep $(echo $a_pgfid | cut -f1 -d'='))</div><div class='add'>+</div><div class='add'>+#Test that xattrs didn't go bad in source</div><div class='add'>+EXPECT "$d_quota_contri" echo $(getfattr -d -m . -e hex $B0/${V0}1/d | grep -E "trusted.glusterfs.quota.*.contri")</div><div class='add'>+EXPECT "$d_quota_dirty"  echo $(getfattr -d -m . -e hex  $B0/${V0}1/d | grep -E "trusted.glusterfs.quota.dirty")</div><div class='add'>+EXPECT "$d_quota_limit"  echo $(getfattr -d -m . -e hex  $B0/${V0}1/d | grep -E "trusted.glusterfs.quota.limit-set")</div><div class='add'>+EXPECT "$d_quota_size"   echo $(getfattr -d -m . -e hex   $B0/${V0}1/d | grep -E "trusted.glusterfs.quota.size")</div><div class='add'>+EXPECT "$a_pgfid" echo $(getfattr -d -m . -e hex   $B0/${V0}1/d/a | grep -E "trusted.pgfid.")</div><div class='add'>+EXPECT "$acl_access_val" echo $(getfattr -d -m. -e hex $B0/${V0}1/d | grep system.posix_acl_access)</div><div class='add'>+EXPECT "$acl_file_val" echo $(getfattr -d -m. -e hex $B0/${V0}1/d | grep trusted.SGI_ACL_FILE)</div><div class='add'>+</div><div class='add'>+#Do a lookup and it shouldn't trigger metadata self-heal and heal xattrs</div><div class='add'>+EXPECT "bar" echo $(getfattr -d -m. -e text $B0/${V0}0/d | grep trusted.foo)</div><div class='add'>+EXPECT "bar" echo $(getfattr -d -m. -e text $B0/${V0}0/d/a | grep trusted.foo)</div><div class='add'>+TEST ! getfattr -n trusted.foo1 $B0/${V0}0/d</div><div class='add'>+TEST ! getfattr -n trusted.foo1 $B0/${V0}0/d/a</div><div class='add'>+EXPECT "unchanged" echo $(getfattr -d -m. -e text $B0/${V0}0/d | grep trusted.foo3)</div><div class='add'>+EXPECT "unchanged" echo $(getfattr -d -m. -e text $B0/${V0}0/d/a | grep trusted.foo3)</div><div class='add'>+EXPECT "bar2" echo $(getfattr -d -m. -e text $B0/${V0}0/d | grep trusted.foo2)</div><div class='add'>+EXPECT "bar2" echo $(getfattr -d -m. -e text $B0/${V0}0/d/a | grep trusted.foo2)</div><div class='add'>+EXPECT "$d_quota_limit" echo $(getfattr -d -m . -e hex  $B0/${V0}0/d | grep "trusted.glusterfs.quota.limit-set")</div><div class='add'>+</div><div class='add'>+EXPECT "bar" echo $(getfattr -d -m. -e text $B0/${V0}1/d | grep trusted.foo)</div><div class='add'>+EXPECT "bar" echo $(getfattr -d -m. -e text $B0/${V0}1/d/a | grep trusted.foo)</div><div class='add'>+TEST ! getfattr -n trusted.foo1 $B0/${V0}1/d</div><div class='add'>+TEST ! getfattr -n trusted.foo1 $B0/${V0}1/d/a</div><div class='add'>+EXPECT "unchanged" echo $(getfattr -d -m. -e text $B0/${V0}1/d | grep trusted.foo3)</div><div class='add'>+EXPECT "unchanged" echo $(getfattr -d -m. -e text $B0/${V0}1/d/a | grep trusted.foo3)</div><div class='add'>+EXPECT "bar2" echo $(getfattr -d -m. -e text $B0/${V0}1/d | grep trusted.foo2)</div><div class='add'>+EXPECT "bar2" echo $(getfattr -d -m. -e text $B0/${V0}1/d/a | grep trusted.foo2)</div><div class='add'>+EXPECT "$d_quota_limit" echo $(getfattr -d -m . -e hex  $B0/${V0}1/d | grep "trusted.glusterfs.quota.limit-set")</div><div class='add'>+</div><div class='add'>+#Test that internal xattrs on B0 are not healed</div><div class='add'>+EXPECT 0x0000000000000400 echo $(getfattr -d -m. -e hex $B0/${V0}0/d | grep trusted.glusterfs.quota.00000000-0000-0000-0000-000000000001.contri)</div><div class='add'>+EXPECT 0x0000000000000400 echo $(getfattr -d -m. -e hex $B0/${V0}0/d | grep trusted.glusterfs.quota.dirty)</div><div class='add'>+EXPECT "$d_quota_limit" echo $(getfattr -d -m. -e hex $B0/${V0}0/d | grep trusted.glusterfs.quota.limit-set) #This will be healed, this is external xattr</div><div class='add'>+EXPECT 0x0000000000000400 echo $(getfattr -d -m. -e hex $B0/${V0}0/d | grep trusted.glusterfs.quota.size)</div><div class='add'>+EXPECT "orphan" echo $(getfattr -d -m. -e text $B0/${V0}0/d/a | grep $(echo $a_pgfid | cut -f1 -d'='))</div><div class='add'>+</div><div class='add'>+#Test that xattrs didn't go bad in source</div><div class='add'>+EXPECT "$d_quota_contri" echo $(getfattr -d -m . -e hex $B0/${V0}1/d | grep -E "trusted.glusterfs.quota.*.contri")</div><div class='add'>+EXPECT "$d_quota_dirty"  echo $(getfattr -d -m . -e hex  $B0/${V0}1/d | grep -E "trusted.glusterfs.quota.dirty")</div><div class='add'>+EXPECT "$d_quota_limit"  echo $(getfattr -d -m . -e hex  $B0/${V0}1/d | grep -E "trusted.glusterfs.quota.limit-set")</div><div class='add'>+EXPECT "$d_quota_size"   echo $(getfattr -d -m . -e hex   $B0/${V0}1/d | grep -E "trusted.glusterfs.quota.size")</div><div class='add'>+EXPECT "$a_pgfid" echo $(getfattr -d -m . -e hex   $B0/${V0}1/d/a | grep -E "trusted.pgfid.")</div><div class='add'>+</div><div class='add'>+EXPECT "$acl_access_val" echo $(getfattr -d -m. -e hex $B0/${V0}0/d | grep system.posix_acl_access)</div><div class='add'>+EXPECT "$acl_file_val" echo $(getfattr -d -m. -e hex $B0/${V0}0/d | grep trusted.SGI_ACL_FILE)</div><div class='add'>+EXPECT "$acl_access_val" echo $(getfattr -d -m. -e hex $B0/${V0}1/d | grep system.posix_acl_access)</div><div class='add'>+EXPECT "$acl_file_val" echo $(getfattr -d -m. -e hex $B0/${V0}1/d | grep trusted.SGI_ACL_FILE)</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/bugs/quota/bug-1035576.t b/tests/bugs/quota/bug-1035576.t<br/>new file mode 100644<br/>index 00000000000..cbc1b69ebb3<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/quota/bug-1035576.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/quota/bug-1035576.t</a></div><div class='hunk'>@@ -0,0 +1,53 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+#This script tests that self-heal of limit-set xattr is happening on a directory</div><div class='add'>+#but self-heal of quota.size xattr is not happening</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST $CLI volume create $V0 replica 2 $H0:$B0/${V0}{0,1}</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+#Lets disable perf-xls so that lookup would reach afr</div><div class='add'>+TEST $CLI volume set $V0 performance.quick-read off</div><div class='add'>+TEST $CLI volume set $V0 performance.io-cache off</div><div class='add'>+TEST $CLI volume set $V0 performance.write-behind off</div><div class='add'>+TEST $CLI volume set $V0 performance.stat-prefetch off</div><div class='add'>+TEST $CLI volume set $V0 performance.read-ahead off</div><div class='add'>+TEST $CLI volume set $V0 self-heal-daemon off</div><div class='add'>+TEST $CLI volume set $V0 cluster.data-self-heal on</div><div class='add'>+TEST $CLI volume set $V0 cluster.metadata-self-heal on</div><div class='add'>+TEST $CLI volume set $V0 cluster.entry-self-heal on</div><div class='add'>+TEST $CLI volume quota $V0 enable</div><div class='add'>+</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}0</div><div class='add'>+TEST glusterfs --volfile-id=/$V0 --volfile-server=$H0 $M0 --attribute-timeout=0 --entry-timeout=0</div><div class='add'>+cd $M0</div><div class='add'>+TEST mkdir $M0/a</div><div class='add'>+TEST $CLI volume quota $V0 limit-usage /a 1GB</div><div class='add'>+echo abc &gt; $M0/a/f</div><div class='add'>+$CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status $V0 0</div><div class='add'>+quota_limit_val1=$(get_hex_xattr trusted.glusterfs.quota.limit-set $B0/${V0}1/a)</div><div class='add'>+quota_size_val1=$(get_hex_xattr trusted.glusterfs.quota.size $B0/${V0}1/a)</div><div class='add'>+</div><div class='add'>+#Trigger entry,metadata self-heal</div><div class='add'>+TEST ls $M0/a</div><div class='add'>+</div><div class='add'>+quota_limit_val0=$(get_hex_xattr trusted.glusterfs.quota.limit-set $B0/${V0}0/a)</div><div class='add'>+quota_size_val0=$(get_hex_xattr trusted.glusterfs.quota.size $B0/${V0}0/a)</div><div class='add'>+</div><div class='add'>+#Test that limit-set xattr is healed</div><div class='add'>+TEST [ $quota_limit_val0 == $quota_limit_val1 ]</div><div class='add'>+</div><div class='add'>+#Only entry, metadata self-heal is done quota size value should not be same</div><div class='add'>+TEST [ $quota_size_val0 != $quota_size_val1 ]</div><div class='add'>+TEST cat $M0/a/f</div><div class='add'>+</div><div class='add'>+#Now that data self-heal is done quota size value should be same</div><div class='add'>+quota_size_val0=$(get_hex_xattr trusted.glusterfs.quota.size $B0/${V0}0/a)</div><div class='add'>+TEST [ $quota_size_val0 == $quota_size_val1 ]</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/bugs/quota/bug-1038598.t b/tests/bugs/quota/bug-1038598.t<br/>new file mode 100644<br/>index 00000000000..108e14cb8d8<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/quota/bug-1038598.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/quota/bug-1038598.t</a></div><div class='hunk'>@@ -0,0 +1,52 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+.  $(dirname $0)/../../include.rc</div><div class='add'>+.  $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+QDD=$(dirname $0)/quota</div><div class='add'>+# compile the test write program and run it</div><div class='add'>+build_tester $(dirname $0)/../../basic/quota.c -o $QDD</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 replica 2  $H0:$B0/${V0}{1,2};</div><div class='add'>+</div><div class='add'>+EXPECT "$V0" volinfo_field $V0 'Volume Name';</div><div class='add'>+EXPECT 'Created' volinfo_field $V0 'Status';</div><div class='add'>+EXPECT '2' brick_count $V0</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+</div><div class='add'>+TEST $CLI volume quota $V0 enable</div><div class='add'>+sleep 5</div><div class='add'>+</div><div class='add'>+TEST glusterfs -s $H0 --volfile-id $V0 $M0;</div><div class='add'>+</div><div class='add'>+TEST mkdir -p $M0/test_dir</div><div class='add'>+TEST $CLI volume quota $V0 limit-usage /test_dir 10MB 50</div><div class='add'>+</div><div class='add'>+EXPECT "10.0MB" quota_hard_limit "/test_dir";</div><div class='add'>+EXPECT "50%" quota_soft_limit "/test_dir";</div><div class='add'>+</div><div class='add'>+TEST $QDD $M0/test_dir/file1.txt 256 16</div><div class='add'>+EXPECT_WITHIN $MARKER_UPDATE_TIMEOUT "4.0MB" quotausage "/test_dir";</div><div class='add'>+EXPECT 'No' quota_sl_exceeded "/test_dir";</div><div class='add'>+EXPECT 'No' quota_hl_exceeded "/test_dir";</div><div class='add'>+</div><div class='add'>+TEST $QDD $M0/test_dir/file1.txt 256 24</div><div class='add'>+EXPECT_WITHIN $MARKER_UPDATE_TIMEOUT "6.0MB" quotausage "/test_dir";</div><div class='add'>+EXPECT 'Yes' quota_sl_exceeded "/test_dir";</div><div class='add'>+EXPECT 'No' quota_hl_exceeded "/test_dir";</div><div class='add'>+</div><div class='add'>+#set timeout to 0 so that quota gets enforced without any lag</div><div class='add'>+TEST $CLI volume set $V0 features.hard-timeout 0</div><div class='add'>+TEST $CLI volume set $V0 features.soft-timeout 0</div><div class='add'>+</div><div class='add'>+TEST ! $QDD $M0/test_dir/file1.txt 256 60</div><div class='add'>+EXPECT_WITHIN $MARKER_UPDATE_TIMEOUT 'Yes' quota_sl_exceeded "/test_dir";</div><div class='add'>+EXPECT 'Yes' quota_hl_exceeded "/test_dir";</div><div class='add'>+</div><div class='add'>+rm -f $QDD</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/quota/bug-1087198.t b/tests/bugs/quota/bug-1087198.t<br/>new file mode 100644<br/>index 00000000000..618a46b957d<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/quota/bug-1087198.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/quota/bug-1087198.t</a></div><div class='hunk'>@@ -0,0 +1,86 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+## The script tests the logging of the quota in the bricks after reaching soft</div><div class='add'>+## limit of the configured limit.</div><div class='add'>+##</div><div class='add'>+##  Steps:</div><div class='add'>+##  1. Create and mount the volume</div><div class='add'>+##  2. Enable quota and set the limit on 2 directories</div><div class='add'>+##  3. Write some data to cross the limit</div><div class='add'>+##  4. Grep the string expected in brick logs</div><div class='add'>+##  5. Wait for 10 seconds (alert timeout is set to 10s)</div><div class='add'>+##  6. Repeat 3 and 4.</div><div class='add'>+##  7. Cleanup</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../fileio.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+. $(dirname $0)/../../nfs.rc</div><div class='add'>+</div><div class='add'>+#G_TESTDEF_TEST_STATUS_CENTOS6=NFS_TEST</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+QDD=$(dirname $0)/quota</div><div class='add'>+# compile the test write program and run it</div><div class='add'>+build_tester $(dirname $0)/../../basic/quota.c -o $QDD</div><div class='add'>+</div><div class='add'>+#1</div><div class='add'>+## Step 1</div><div class='add'>+TEST glusterd</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/brick{1..4};</div><div class='add'>+TEST $CLI volume set $V0 nfs.disable false</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $NFS_EXPORT_TIMEOUT "1" is_nfs_export_available;</div><div class='add'>+TEST mount_nfs $H0:/$V0 $N0 noac,nolock</div><div class='add'>+</div><div class='add'>+QUOTA_LIMIT_DIR="quota_limit_dir"</div><div class='add'>+BRICK_LOG_DIR="`gluster --print-logdir`/bricks"</div><div class='add'>+</div><div class='add'>+#9</div><div class='add'>+TEST mkdir $N0/$QUOTA_LIMIT_DIR</div><div class='add'>+</div><div class='add'>+#10</div><div class='add'>+## Step 2</div><div class='add'>+TEST $CLI volume quota $V0 enable</div><div class='add'>+TEST $CLI volume quota $V0 alert-time 10</div><div class='add'>+TEST $CLI volume quota $V0 hard-timeout 0</div><div class='add'>+TEST $CLI volume quota $V0 soft-timeout 0</div><div class='add'>+</div><div class='add'>+# Set limit to 200KB (204800B)</div><div class='add'>+TEST $CLI volume quota $V0 limit-usage / 204800B</div><div class='add'>+TEST $CLI volume quota $V0 limit-usage /$QUOTA_LIMIT_DIR 100KB</div><div class='add'>+</div><div class='add'>+#16</div><div class='add'>+## Step 3 and 4</div><div class='add'>+TEST $QDD $N0/$QUOTA_LIMIT_DIR/95KB_file 1 95</div><div class='add'>+#Uncomment below TEST once the bug# 1202292 is fixed</div><div class='add'>+#TEST grep -e "\"Usage crossed soft limit:.*used by /$QUOTA_LIMIT_DIR\"" -- $BRICK_LOG_DIR/*</div><div class='add'>+</div><div class='add'>+TEST $QDD $N0/100KB_file 1 100</div><div class='add'>+#Uncomment below TEST once the bug# 1202292 is fixed</div><div class='add'>+#TEST grep -e "\"Usage crossed soft limit:.*used by /\"" -- $BRICK_LOG_DIR/*</div><div class='add'>+</div><div class='add'>+#20</div><div class='add'>+## Step 5</div><div class='add'>+TEST sleep 10</div><div class='add'>+</div><div class='add'>+## Step 6</div><div class='add'>+TEST $QDD $N0/$QUOTA_LIMIT_DIR/1KB_file 1 1</div><div class='add'>+TEST grep -e "\"Usage is above soft limit:.*used by /$QUOTA_LIMIT_DIR\"" -- $BRICK_LOG_DIR/*</div><div class='add'>+</div><div class='add'>+#23</div><div class='add'>+TEST $QDD $N0/1KB_file 1 1</div><div class='add'>+TEST grep -e "\"Usage is above soft limit:.*used by /\"" -- $BRICK_LOG_DIR/*</div><div class='add'>+</div><div class='add'>+#25</div><div class='add'>+## Step 7</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $N0</div><div class='add'>+</div><div class='add'>+TEST $CLI volume stop $V0</div><div class='add'>+</div><div class='add'>+rm -f $QDD</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/quota/bug-1104692.t b/tests/bugs/quota/bug-1104692.t<br/>new file mode 100755<br/>index 00000000000..9640996135f<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/quota/bug-1104692.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/quota/bug-1104692.t</a></div><div class='hunk'>@@ -0,0 +1,26 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 replica 2 $H0:$B0/${V0}0 $H0:$B0/${V0}1 $H0:$B0/${V0}2 $H0:$B0/${V0}3</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+TEST glusterfs -s $H0 --volfile-id $V0 $M0;</div><div class='add'>+TEST mkdir -p $M0/limit_one/limit_two/limit_three $M0/limit_four  \</div><div class='add'>+              $M0/limit_one/limit_five</div><div class='add'>+</div><div class='add'>+TEST $CLI volume set $V0 server.root-squash on</div><div class='add'>+TEST $CLI volume quota $V0 enable</div><div class='add'>+</div><div class='add'>+TEST $CLI volume quota $V0 limit-usage / 1GB</div><div class='add'>+TEST $CLI volume quota $V0 limit-usage /limit_one 1GB</div><div class='add'>+TEST $CLI volume quota $V0 limit-usage /limit_one/limit_two 1GB</div><div class='add'>+TEST $CLI volume quota $V0 limit-usage /limit_one/limit_two/limit_three 1GB</div><div class='add'>+TEST $CLI volume quota $V0 limit-usage /limit_four 1GB</div><div class='add'>+TEST $CLI volume quota $V0 limit-usage /limit_one/limit_five 1GB</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/quota/bug-1153964.t b/tests/bugs/quota/bug-1153964.t<br/>new file mode 100644<br/>index 00000000000..2e449d3ba00<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/quota/bug-1153964.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/quota/bug-1153964.t</a></div><div class='hunk'>@@ -0,0 +1,81 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+. $(dirname $0)/../../nfs.rc</div><div class='add'>+</div><div class='add'>+#G_TESTDEF_TEST_STATUS_CENTOS6=NFS_TEST</div><div class='add'>+</div><div class='add'>+function rename_loop()</div><div class='add'>+{</div><div class='add'>+        local i=0</div><div class='add'>+        local limit=$1</div><div class='add'>+        while [ $i -lt $limit ]</div><div class='add'>+        do</div><div class='add'>+                j=$[$i + 1]</div><div class='add'>+                mv $N0/test_dir/file$i $N0/test_dir/file$j</div><div class='add'>+                if [ "$?" != "0" ]</div><div class='add'>+                then</div><div class='add'>+                        return 1</div><div class='add'>+                fi</div><div class='add'>+                i=$[$i + 1]</div><div class='add'>+        done</div><div class='add'>+        return 0</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function createFile_and_checkLimit()</div><div class='add'>+{</div><div class='add'>+        local count_val=$1;</div><div class='add'>+        dd if=/dev/zero of="$N0/test_dir/file0" bs=1048576 count=$count_val</div><div class='add'>+        sleep 3</div><div class='add'>+        if [ -f $N0/test_dir/file0 ]</div><div class='add'>+        then</div><div class='add'>+                rename_loop 10</div><div class='add'>+                if [ "$?" == "0" ]</div><div class='add'>+                then</div><div class='add'>+                        echo "Y"</div><div class='add'>+                else</div><div class='add'>+                        echo "N"</div><div class='add'>+                fi</div><div class='add'>+        fi</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/${V0}1 $H0:$B0/${V0}2</div><div class='add'>+TEST $CLI volume set $V0 nfs.disable false</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+TEST $CLI volume quota $V0 enable</div><div class='add'>+EXPECT 'on' volinfo_field $V0 'features.quota'</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $NFS_EXPORT_TIMEOUT "1" is_nfs_export_available;</div><div class='add'>+TEST mount_nfs $H0:/$V0 $N0 nolock;</div><div class='add'>+TEST mkdir -p $N0/test_dir/</div><div class='add'>+</div><div class='add'>+# Try to rename file under various case and check if</div><div class='add'>+# quota limit exceeds or not.</div><div class='add'>+TEST $CLI volume quota $V0 limit-usage /test_dir 100MB</div><div class='add'>+# Case1 : If used size is less than hard-limit size</div><div class='add'>+# Create a 600MB file</div><div class='add'>+EXPECT 'Y' createFile_and_checkLimit 60</div><div class='add'>+</div><div class='add'>+TEST rm -rf $N0/test_dir/*</div><div class='add'>+# Case2 : If used size is equal to hard-limit size</div><div class='add'>+# Create a 100MB file</div><div class='add'>+EXPECT 'Y' createFile_and_checkLimit 100</div><div class='add'>+</div><div class='add'>+TEST rm -rf $N0/test_dir/*</div><div class='add'>+# Case3 : If used size is greater than hard-limit size</div><div class='add'>+# Create a 110MB file</div><div class='add'>+EXPECT 'Y' createFile_and_checkLimit 110</div><div class='add'>+</div><div class='add'>+# remove this directory as it has been created as part</div><div class='add'>+# of above testcase</div><div class='add'>+TEST rm -rf $N0/test_dir/</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $N0</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/quota/bug-1178130.t b/tests/bugs/quota/bug-1178130.t<br/>new file mode 100644<br/>index 00000000000..ccd6b792cf8<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/quota/bug-1178130.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/quota/bug-1178130.t</a></div><div class='hunk'>@@ -0,0 +1,44 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+# This regression test tries to ensure renaming a directory with content, and</div><div class='add'>+# no limit set, is accounted properly, when moved into a directory with quota</div><div class='add'>+# limit set.</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+QDD=$(dirname $0)/quota</div><div class='add'>+# compile the test write program and run it</div><div class='add'>+build_tester $(dirname $0)/../../basic/quota.c -o $QDD</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 replica 2 $H0:$B0/${V0}{1,2};</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+</div><div class='add'>+TEST $CLI volume quota $V0 enable;</div><div class='add'>+</div><div class='add'>+TEST glusterfs --volfile-id=$V0 --volfile-server=$H0 $M0;</div><div class='add'>+</div><div class='add'>+TEST $CLI volume quota $V0 limit-usage / 500MB</div><div class='add'>+TEST $CLI volume quota $V0 hard-timeout 0</div><div class='add'>+TEST $CLI volume quota $V0 soft-timeout 0</div><div class='add'>+</div><div class='add'>+TEST $QDD $M0/file 256 40</div><div class='add'>+EXPECT_WITHIN $MARKER_UPDATE_TIMEOUT "10.0MB" quotausage "/"</div><div class='add'>+</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}2</div><div class='add'>+TEST mv $M0/file $M0/file2</div><div class='add'>+TEST $CLI volume start $V0 force;</div><div class='add'>+</div><div class='add'>+#wait for self heal to complete</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "0" STAT "$B0/${V0}2/file2"</div><div class='add'>+</div><div class='add'>+#usage should remain same after rename and self-heal operation</div><div class='add'>+EXPECT "10.0MB" quotausage "/"</div><div class='add'>+</div><div class='add'>+rm -f $QDD</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/quota/bug-1235182.t b/tests/bugs/quota/bug-1235182.t<br/>new file mode 100644<br/>index 00000000000..6091146cb97<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/quota/bug-1235182.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/quota/bug-1235182.t</a></div><div class='hunk'>@@ -0,0 +1,61 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+# This regression test tries to ensure renaming a directory with content, and</div><div class='add'>+# no limit set, is accounted properly, when moved into a directory with quota</div><div class='add'>+# limit set.</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+QDD=$(dirname $0)/quota</div><div class='add'>+# compile the test write program and run it</div><div class='add'>+build_tester $(dirname $0)/../../basic/quota.c -o $QDD</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST $CLI volume info;</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/${V0};</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+</div><div class='add'>+TEST $CLI volume quota $V0 enable;</div><div class='add'>+</div><div class='add'>+TEST glusterfs --volfile-id=$V0 --volfile-server=$H0 $M0;</div><div class='add'>+</div><div class='add'>+TEST $CLI volume quota $V0 limit-usage / 1GB</div><div class='add'>+TEST $CLI volume quota $V0 hard-timeout 0</div><div class='add'>+TEST $CLI volume quota $V0 soft-timeout 0</div><div class='add'>+</div><div class='add'>+TEST mkdir $M0/1</div><div class='add'>+$QDD $M0/1/f1 256 400&amp;</div><div class='add'>+PID=$!</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "0" STAT $M0/1/f1</div><div class='add'>+TESTS_EXPECTED_IN_LOOP=150</div><div class='add'>+for i in {1..50}; do</div><div class='add'>+        ii=`expr $i + 1`;</div><div class='add'>+        touch $M0/$i/f$ii</div><div class='add'>+        echo Hello &gt; $M0/$i/f$ii</div><div class='add'>+</div><div class='add'>+        #rename within same dir</div><div class='add'>+        TEST_IN_LOOP mv -f $M0/$i/f$i $M0/$i/f$ii;</div><div class='add'>+</div><div class='add'>+        #rename to different dir</div><div class='add'>+        TEST_IN_LOOP mkdir $M0/$ii</div><div class='add'>+        TEST_IN_LOOP mv -f $M0/$i/f$ii $M0/$ii/f$ii;</div><div class='add'>+        stat $M0/$ii/f$ii &gt;/dev/null</div><div class='add'>+done</div><div class='add'>+</div><div class='add'>+echo "Wait for process with pid $PID to complete"</div><div class='add'>+wait $PID</div><div class='add'>+echo "Process with pid $PID finished"</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "0" STAT $M0/51/f51</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $MARKER_UPDATE_TIMEOUT "100.0MB" quotausage "/"</div><div class='add'>+</div><div class='add'>+rm -f $QDD</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+#G_TESTDEF_TEST_STATUS_CENTOS6=BAD_TEST,BUG=000000</div><div class='add'>+#G_TESTDEF_TEST_STATUS_NETBSD7=BAD_TEST,BUG=000000</div><div class='head'>diff --git a/tests/bugs/quota/bug-1243798.t b/tests/bugs/quota/bug-1243798.t<br/>new file mode 100644<br/>index 00000000000..fa6abeb08fb<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/quota/bug-1243798.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/quota/bug-1243798.t</a></div><div class='hunk'>@@ -0,0 +1,46 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+. $(dirname $0)/../../nfs.rc</div><div class='add'>+</div><div class='add'>+#G_TESTDEF_TEST_STATUS_CENTOS6=NFS_TEST</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/$V0</div><div class='add'>+TEST $CLI volume set $V0 nfs.disable false</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $NFS_EXPORT_TIMEOUT "1" is_nfs_export_available;</div><div class='add'>+TEST mount_nfs $H0:/$V0 $N0 noac,nolock</div><div class='add'>+</div><div class='add'>+TEST mkdir -p $N0/dir1/dir2</div><div class='add'>+TEST touch $N0/dir1/dir2/file</div><div class='add'>+</div><div class='add'>+TEST $CLI volume quota $V0 enable</div><div class='add'>+TEST $CLI volume quota $V0 hard-timeout 0</div><div class='add'>+TEST $CLI volume quota $V0 soft-timeout 0</div><div class='add'>+TEST $CLI volume quota $V0 limit-objects /dir1 10</div><div class='add'>+</div><div class='add'>+TEST stat $N0/dir1/dir2/file</div><div class='add'>+</div><div class='add'>+sleep 2</div><div class='add'>+</div><div class='add'>+#Remove size and contri xattr from /dir1</div><div class='add'>+#Remove contri xattr from /dir1/dir2</div><div class='add'>+setfattr -x trusted.glusterfs.quota.size.1 $B0/$V0/dir1</div><div class='add'>+setfattr -x trusted.glusterfs.quota.00000000-0000-0000-0000-000000000001.contri.1 $B0/$V0/dir1</div><div class='add'>+contri=$(getfattr -d -m . -e hex $B0/$V0/dir1/dir2 | grep contri | awk -F= '{print $1}')</div><div class='add'>+setfattr -x $contri $B0/$V0/dir1/dir2</div><div class='add'>+</div><div class='add'>+#Initiate healing by writing to a file</div><div class='add'>+echo Hello &gt; $N0/dir1/dir2/file</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $MARKER_UPDATE_TIMEOUT "2" quota_object_list_field "/dir1" 5</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $N0</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/quota/bug-1250582-volume-reset-should-not-remove-quota-quota-deem-statfs.t b/tests/bugs/quota/bug-1250582-volume-reset-should-not-remove-quota-quota-deem-statfs.t<br/>new file mode 100644<br/>index 00000000000..3b55e739bf9<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/quota/bug-1250582-volume-reset-should-not-remove-quota-quota-deem-statfs.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/quota/bug-1250582-volume-reset-should-not-remove-quota-quota-deem-statfs.t</a></div><div class='hunk'>@@ -0,0 +1,53 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+# This test ensures that 'gluster volume reset' command do not remove</div><div class='add'>+# features.quota-deem-statfs, features.quota.</div><div class='add'>+# Also, tests that 'gluster volume set features.quota-deem-statfs' can be</div><div class='add'>+# turned on/off when quota is enabled.</div><div class='add'>+</div><div class='add'>+.  $(dirname $0)/../../include.rc</div><div class='add'>+.  $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd;</div><div class='add'>+TEST pidof glusterd;</div><div class='add'>+TEST $CLI volume info;</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 replica 2 $H0:$B0/${v0}{1,2};</div><div class='add'>+EXPECT 'Created' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+EXPECT 'Started' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+TEST $CLI volume quota $V0 enable</div><div class='add'>+EXPECT 'on' volinfo_field $V0 'features.quota'</div><div class='add'>+EXPECT 'on' volinfo_field $V0 'features.inode-quota'</div><div class='add'>+EXPECT 'on' volinfo_field $V0 'features.quota-deem-statfs'</div><div class='add'>+</div><div class='add'>+TEST $CLI volume reset $V0</div><div class='add'>+EXPECT 'on' volinfo_field $V0 'features.quota'</div><div class='add'>+EXPECT 'on' volinfo_field $V0 'features.inode-quota'</div><div class='add'>+EXPECT 'on' volinfo_field $V0 'features.quota-deem-statfs'</div><div class='add'>+</div><div class='add'>+TEST $CLI volume reset $V0 force</div><div class='add'>+EXPECT 'on' volinfo_field $V0 'features.quota'</div><div class='add'>+EXPECT 'on' volinfo_field $V0 'features.inode-quota'</div><div class='add'>+EXPECT 'on' volinfo_field $V0 'features.quota-deem-statfs'</div><div class='add'>+</div><div class='add'>+TEST $CLI volume reset $V0 features.quota-deem-statfs</div><div class='add'>+EXPECT 'on' volinfo_field $V0 'features.quota-deem-statfs'</div><div class='add'>+</div><div class='add'>+TEST $CLI volume set $V0 features.quota-deem-statfs off</div><div class='add'>+EXPECT 'off' volinfo_field $V0 'features.quota-deem-statfs'</div><div class='add'>+</div><div class='add'>+TEST $CLI volume set $V0 features.quota-deem-statfs on</div><div class='add'>+EXPECT 'on' volinfo_field $V0 'features.quota-deem-statfs'</div><div class='add'>+</div><div class='add'>+TEST $CLI volume quota $V0 disable</div><div class='add'>+EXPECT 'off' volinfo_field $V0 'features.quota'</div><div class='add'>+EXPECT 'off' volinfo_field $V0 'features.inode-quota'</div><div class='add'>+EXPECT '' volinfo_field $V0 'features.quota-deem-statfs'</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='head'>diff --git a/tests/bugs/quota/bug-1260545.t b/tests/bugs/quota/bug-1260545.t<br/>new file mode 100644<br/>index 00000000000..46808022f01<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/quota/bug-1260545.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/quota/bug-1260545.t</a></div><div class='hunk'>@@ -0,0 +1,53 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+QDD=$(dirname $0)/quota</div><div class='add'>+# compile the test write program and run it</div><div class='add'>+build_tester $(dirname $0)/../../basic/quota.c -o $QDD</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST $CLI volume info;</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/${V0}1 $H0:$B0/${V0}2;</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+</div><div class='add'>+TEST $CLI volume quota $V0 enable;</div><div class='add'>+</div><div class='add'>+TEST glusterfs --volfile-id=$V0 --volfile-server=$H0 $M0;</div><div class='add'>+</div><div class='add'>+TEST $CLI volume quota $V0 limit-usage / 11MB</div><div class='add'>+TEST $CLI volume quota $V0 hard-timeout 0</div><div class='add'>+TEST $CLI volume quota $V0 soft-timeout 0</div><div class='add'>+</div><div class='add'>+TEST $QDD $M0/f1 256 40</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $MARKER_UPDATE_TIMEOUT "10.0MB" quotausage "/"</div><div class='add'>+</div><div class='add'>+if [ -f "$B0/${V0}1/f1" ]; then</div><div class='add'>+        HASHED="$B0/${V0}1"</div><div class='add'>+        OTHER="$B0/${V0}2"</div><div class='add'>+else</div><div class='add'>+        HASHED="$B0/${V0}2"</div><div class='add'>+        OTHER="$B0/${V0}1"</div><div class='add'>+fi</div><div class='add'>+</div><div class='add'>+TEST $CLI volume remove-brick $V0 $H0:${HASHED} start</div><div class='add'>+EXPECT_WITHIN $REBALANCE_TIMEOUT "completed" remove_brick_status_completed_field "$V0" "$H0:${HASHED}";</div><div class='add'>+</div><div class='add'>+#check consistency in mount point and also check that file is migrated to OTHER</div><div class='add'>+TEST [ -f "$OTHER/f1" ];</div><div class='add'>+TEST [ -f "$M0/f1" ];</div><div class='add'>+</div><div class='add'>+#check that remove-brick status should not have any failed or skipped files</div><div class='add'>+var=`$CLI volume remove-brick $V0 $H0:${HASHED} status | grep completed`</div><div class='add'>+TEST [ `echo $var | awk '{print $5}'` = "0"  ]</div><div class='add'>+TEST [ `echo $var | awk '{print $6}'` = "0"  ]</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $MARKER_UPDATE_TIMEOUT "10.0MB" quotausage "/"</div><div class='add'>+</div><div class='add'>+rm -f $QDD</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/quota/bug-1287996.t b/tests/bugs/quota/bug-1287996.t<br/>new file mode 100644<br/>index 00000000000..2f46ee1ca2d<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/quota/bug-1287996.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/quota/bug-1287996.t</a></div><div class='hunk'>@@ -0,0 +1,21 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../cluster.rc</div><div class='add'>+</div><div class='add'>+function check_peers {</div><div class='add'>+        $CLI_1 peer status | grep 'Peer in Cluster (Connected)' | wc -l</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST launch_cluster 2;</div><div class='add'>+</div><div class='add'>+TEST $CLI_1 volume create $V0 $H1:$B1/$V0</div><div class='add'>+TEST $CLI_1 volume start $V0</div><div class='add'>+TEST $CLI_1 volume quota $V0 enable</div><div class='add'>+</div><div class='add'>+TEST $CLI_1 peer probe $H2;</div><div class='add'>+EXPECT_WITHIN $PROBE_TIMEOUT 1 check_peers</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/quota/bug-1292020.t b/tests/bugs/quota/bug-1292020.t<br/>new file mode 100644<br/>index 00000000000..b70047ae3f9<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/quota/bug-1292020.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/quota/bug-1292020.t</a></div><div class='hunk'>@@ -0,0 +1,28 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+function write_sample_data () {</div><div class='add'>+        dd if=/dev/zero of=$M0/f1 bs=256k count=400 2&gt;&amp;1 |</div><div class='add'>+            egrep -i 'exceeded|no space' &amp;&amp; echo 'passed'</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd;</div><div class='add'>+TEST pidof glusterd;</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/$V0</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+TEST $CLI volume quota $V0 enable;</div><div class='add'>+TEST $CLI volume quota $V0 limit-usage / 1</div><div class='add'>+</div><div class='add'>+TEST glusterfs --volfile-server=$H0 --volfile-id=$V0 $M0;</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN 30 "passed" write_sample_data</div><div class='add'>+</div><div class='add'>+TEST $CLI volume stop $V0</div><div class='add'>+TEST $CLI volume delete $V0</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/quota/bug-1293601.t b/tests/bugs/quota/bug-1293601.t<br/>new file mode 100644<br/>index 00000000000..741758b73f5<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/quota/bug-1293601.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/quota/bug-1293601.t</a></div><div class='hunk'>@@ -0,0 +1,33 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 replica 2 $H0:$B0/${V0}{1,2,3,4}</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "4" online_brick_count</div><div class='add'>+TEST $CLI volume quota $V0 enable</div><div class='add'>+</div><div class='add'>+TEST glusterfs --volfile-server=$H0 --volfile-id=$V0 $M0;</div><div class='add'>+</div><div class='add'>+for i in {1..512}; do</div><div class='add'>+    dd if=/dev/zero of=$M0/f$i bs=1k count=1</div><div class='add'>+done</div><div class='add'>+</div><div class='add'>+mkdir $M0/dir1</div><div class='add'>+for i in {513..1024}; do</div><div class='add'>+    dd if=/dev/zero of=$M0/dir1/f$i bs=1k count=1</div><div class='add'>+done</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $MARKER_UPDATE_TIMEOUT "1.0MB" quotausage "/"</div><div class='add'>+</div><div class='add'>+TEST $CLI volume quota $V0 disable</div><div class='add'>+TEST $CLI volume quota $V0 enable</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN 60 "1.0MB" quotausage "/"</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/read-only/bug-1134822-read-only-default-in-graph.t b/tests/bugs/read-only/bug-1134822-read-only-default-in-graph.t<br/>new file mode 100644<br/>index 00000000000..cc27d04656f<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/read-only/bug-1134822-read-only-default-in-graph.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/read-only/bug-1134822-read-only-default-in-graph.t</a></div><div class='hunk'>@@ -0,0 +1,67 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+#Test case: This test checks when a volume is made read-only though volume set</div><div class='add'>+#           and bricks are not restarted no write operations can be performed on</div><div class='add'>+#           this volume</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+</div><div class='add'>+#Create a volume</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/${V0}0;</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+# Mount FUSE and create file/directory, create should succeed as the read-only</div><div class='add'>+# is off by default</div><div class='add'>+TEST glusterfs -s $H0 --volfile-id $V0 $M0</div><div class='add'>+TEST touch $M0/zerobytefile1.txt</div><div class='add'>+TEST mkdir $M0/test_dir1</div><div class='add'>+TEST dd if=/dev/zero of=$M0/file1 bs=1024 count=1024</div><div class='add'>+</div><div class='add'>+# turn on read-only option through volume set</div><div class='add'>+TEST gluster volume set $V0 read-only on</div><div class='add'>+</div><div class='add'>+# worm feature can't be enabled if read-only is enabled</div><div class='add'>+TEST ! gluster volume set $V0 worm on</div><div class='add'>+</div><div class='add'>+# turn off read-only option through volume set</div><div class='add'>+TEST gluster volume set $V0 read-only off</div><div class='add'>+</div><div class='add'>+# turn on worm option through volume set</div><div class='add'>+TEST gluster volume set $V0 worm on</div><div class='add'>+</div><div class='add'>+# read-only feature can't be enabled if worm is enabled</div><div class='add'>+TEST ! gluster volume set $V0 read-only on</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+TEST gluster volume set $V0 worm off</div><div class='add'>+TEST gluster volume set $V0 read-only on</div><div class='add'>+</div><div class='add'>+# Check whether read-operations can be performed or not</div><div class='add'>+TEST cat $M0/file1</div><div class='add'>+</div><div class='add'>+# All write operations should fail now</div><div class='add'>+TEST ! touch $M0/zerobytefile2.txt</div><div class='add'>+TEST ! mkdir $M0/test_dir2</div><div class='add'>+TEST ! dd if=/dev/zero of=$M0/file2 bs=1024 count=1024</div><div class='add'>+</div><div class='add'>+# turn off read-only option through volume set</div><div class='add'>+TEST gluster volume set $V0 read-only off</div><div class='add'>+</div><div class='add'>+# All write operations should succeed now</div><div class='add'>+TEST touch $M0/zerobytefile2.txt</div><div class='add'>+TEST mkdir $M0/test_dir2</div><div class='add'>+TEST dd if=/dev/zero of=$M0/file2 bs=1024 count=1024</div><div class='add'>+</div><div class='add'>+# Turn on worm</div><div class='add'>+TEST gluster volume set $V0 worm on</div><div class='add'>+</div><div class='add'>+# unlink should fail now</div><div class='add'>+TEST ! rm -rf $M0/zerobytefile2.txt</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/readdir-ahead/bug-1390050.c b/tests/bugs/readdir-ahead/bug-1390050.c<br/>new file mode 100644<br/>index 00000000000..9578df2dd90<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/readdir-ahead/bug-1390050.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/readdir-ahead/bug-1390050.c</a></div><div class='hunk'>@@ -0,0 +1,72 @@</div><div class='add'>+#include &lt;stdio.h&gt;</div><div class='add'>+#include &lt;sys/types.h&gt;</div><div class='add'>+#include &lt;sys/stat.h&gt;</div><div class='add'>+#include &lt;unistd.h&gt;</div><div class='add'>+#include &lt;fcntl.h&gt;</div><div class='add'>+#include &lt;dirent.h&gt;</div><div class='add'>+#include &lt;string.h&gt;</div><div class='add'>+#include &lt;errno.h&gt;</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+main(int argc, char *argv[])</div><div class='add'>+{</div><div class='add'>+    const char *glfs_dir = NULL, *filepath = NULL;</div><div class='add'>+    DIR *dirfd = NULL;</div><div class='add'>+    int filefd = 0, ret = 0;</div><div class='add'>+    struct stat stbuf = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    size_t size_before_write = 0;</div><div class='add'>+</div><div class='add'>+    glfs_dir = argv[1];</div><div class='add'>+    filepath = argv[2];</div><div class='add'>+    dirfd = opendir(glfs_dir);</div><div class='add'>+    if (dirfd == NULL) {</div><div class='add'>+        fprintf(stderr, "opening directory failed (%s)\n", strerror(errno));</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    filefd = open(filepath, O_RDWR);</div><div class='add'>+    if (filefd &lt; 0) {</div><div class='add'>+        fprintf(stderr, "open failed on path %s (%s)\n", filepath,</div><div class='add'>+                strerror(errno));</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = stat(filepath, &amp;stbuf);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(stderr, "stat failed on path %s (%s)\n", filepath,</div><div class='add'>+                strerror(errno));</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    size_before_write = stbuf.st_size;</div><div class='add'>+</div><div class='add'>+    ret = write(filefd, "testdata", strlen("testdata123") + 1);</div><div class='add'>+    if (ret &lt;= 0) {</div><div class='add'>+        fprintf(stderr, "write failed (%s)\n", strerror(errno));</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    while (readdir(dirfd)) {</div><div class='add'>+        /* do nothing */</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = stat(filepath, &amp;stbuf);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(stderr, "stat failed on path %s (%s)\n", strerror(errno));</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (stbuf.st_size == size_before_write) {</div><div class='add'>+        fprintf(stderr,</div><div class='add'>+                "file size (%lu) has not changed even after "</div><div class='add'>+                "its written to\n",</div><div class='add'>+                stbuf.st_size);</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+err:</div><div class='add'>+    return -1;</div><div class='add'>+}</div><div class='head'>diff --git a/tests/bugs/readdir-ahead/bug-1390050.t b/tests/bugs/readdir-ahead/bug-1390050.t<br/>new file mode 100644<br/>index 00000000000..ab1d7d4ead9<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/readdir-ahead/bug-1390050.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/readdir-ahead/bug-1390050.t</a></div><div class='hunk'>@@ -0,0 +1,29 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+. $(dirname $0)/../../fileio.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B{0..1}/$V0</div><div class='add'>+TEST $CLI volume set $V0 readdir-ahead on</div><div class='add'>+</div><div class='add'>+DIRECTORY="$M0/subdir1/subdir2"</div><div class='add'>+</div><div class='add'>+#Make sure md-cache has large timeout to hold stat from readdirp_cbk in its cache</div><div class='add'>+TEST $CLI volume set $V0 performance.md-cache-timeout 600</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+TEST glusterfs --volfile-server=$H0 --volfile-id=$V0 $M0</div><div class='add'>+rm -rf $M0/*</div><div class='add'>+TEST mkdir -p $DIRECTORY</div><div class='add'>+rm -rf $DIRECTORY/*</div><div class='add'>+TEST touch $DIRECTORY/file{0..10}</div><div class='add'>+rdd_tester=$(dirname $0)/rdd-tester</div><div class='add'>+TEST build_tester $(dirname $0)/bug-1390050.c -o $rdd_tester</div><div class='add'>+TEST $rdd_tester $DIRECTORY $DIRECTORY/file4</div><div class='add'>+rm -f $rdd_tester</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='head'>diff --git a/tests/bugs/readdir-ahead/bug-1436090.t b/tests/bugs/readdir-ahead/bug-1436090.t<br/>new file mode 100755<br/>index 00000000000..e0877f15684<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/readdir-ahead/bug-1436090.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/readdir-ahead/bug-1436090.t</a></div><div class='hunk'>@@ -0,0 +1,44 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+. $(dirname $0)/../../cluster.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST launch_cluster 2;</div><div class='add'>+TEST $CLI_1 peer probe $H2;</div><div class='add'>+EXPECT_WITHIN $PROBE_TIMEOUT 1 peer_count</div><div class='add'>+</div><div class='add'>+$CLI_1 volume create $V0 $H1:$B1/$V0  $H2:$B2/$V0</div><div class='add'>+EXPECT 'Created' cluster_volinfo_field 1 $V0 'Status';</div><div class='add'>+</div><div class='add'>+$CLI_1 volume start $V0</div><div class='add'>+EXPECT 'Started' cluster_volinfo_field 1 $V0 'Status';</div><div class='add'>+</div><div class='add'>+TEST glusterfs -s $H1 --volfile-id $V0 $M0;</div><div class='add'>+TEST mkdir $M0/dir1</div><div class='add'>+</div><div class='add'>+# Create a large file (4 GB), so that rebalance takes time</div><div class='add'>+# Since we really don't care about the contents of the file, we use fallocate</div><div class='add'>+# to generate the file much faster. We could also use truncate, which is even</div><div class='add'>+# faster, but rebalance could take advantage of an sparse file and migrate it</div><div class='add'>+# in an optimized way, but we don't want a fast migration.</div><div class='add'>+TEST fallocate -l 4G $M0/dir1/foo</div><div class='add'>+</div><div class='add'>+TEST mv $M0/dir1/foo $M0/dir1/bar</div><div class='add'>+</div><div class='add'>+TEST $CLI_1 volume rebalance $V0 start force</div><div class='add'>+TEST ! $CLI_1 volume set $V0 parallel-readdir on</div><div class='add'>+EXPECT_WITHIN $REBALANCE_TIMEOUT "completed" cluster_rebalance_status_field 1 $V0</div><div class='add'>+EXPECT_WITHIN $REBALANCE_TIMEOUT "completed" cluster_rebalance_status_field 2 $V0</div><div class='add'>+TEST $CLI_1 volume set $V0 parallel-readdir on</div><div class='add'>+TEST mv $M0/dir1/bar $M0/dir1/foo</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+TEST glusterfs -s $H1 --volfile-id $V0 $M0;</div><div class='add'>+TEST $CLI_1 volume rebalance $V0 start force</div><div class='add'>+TEST ln $M0/dir1/foo $M0/dir1/bar</div><div class='add'>+EXPECT_WITHIN $REBALANCE_TIMEOUT "completed" cluster_rebalance_status_field 1 $V0</div><div class='add'>+EXPECT_WITHIN $REBALANCE_TIMEOUT "completed" cluster_rebalance_status_field 2 $V0</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/readdir-ahead/bug-1439640.t b/tests/bugs/readdir-ahead/bug-1439640.t<br/>new file mode 100755<br/>index 00000000000..dcd54076444<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/readdir-ahead/bug-1439640.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/readdir-ahead/bug-1439640.t</a></div><div class='hunk'>@@ -0,0 +1,31 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B{0..1}/$V0</div><div class='add'>+TEST $CLI volume set $V0 readdir-ahead on</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+TEST ! $CLI volume set $V0 parallel-readdir sdf</div><div class='add'>+</div><div class='add'>+TEST $CLI volume set $V0 parallel-readdir off</div><div class='add'>+TEST $CLI volume set $V0 parallel-readdir on</div><div class='add'>+</div><div class='add'>+TEST ! $CLI volume set $V0 rda-cache-limit 0</div><div class='add'>+TEST ! $CLI volume set $V0 rda-cache-limit -634</div><div class='add'>+TEST ! $CLI volume set $V0 rda-cache-limit 87adh</div><div class='add'>+TEST ! $CLI volume set $V0 parallel-readdir sdf</div><div class='add'>+</div><div class='add'>+TEST ! $CLI volume set $V0 rda-request-size 0</div><div class='add'>+TEST ! $CLI volume set $V0 rda-request-size -634</div><div class='add'>+TEST ! $CLI volume set $V0 rda-request-size 87adh</div><div class='add'>+</div><div class='add'>+TEST $CLI volume set $V0 rda-cache-limit 10MB</div><div class='add'>+TEST $CLI volume set $V0 rda-request-size 128KB</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/readdir-ahead/bug-1446516.t b/tests/bugs/readdir-ahead/bug-1446516.t<br/>new file mode 100755<br/>index 00000000000..2bf6520d861<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/readdir-ahead/bug-1446516.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/readdir-ahead/bug-1446516.t</a></div><div class='hunk'>@@ -0,0 +1,21 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/${V0}{1..4}</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+TEST $CLI volume set $V0 parallel-readdir on</div><div class='add'>+</div><div class='add'>+TEST $CLI volume set $V0 rda-cache-limit 4GB</div><div class='add'>+</div><div class='add'>+TEST $CLI volume set $V0 parallel-readdir off</div><div class='add'>+</div><div class='add'>+TEST glusterfs --volfile-server=$H0 --volfile-id=$V0 $M0</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/readdir-ahead/bug-1512437.t b/tests/bugs/readdir-ahead/bug-1512437.t<br/>new file mode 100755<br/>index 00000000000..50eaa7d6696<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/readdir-ahead/bug-1512437.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/readdir-ahead/bug-1512437.t</a></div><div class='hunk'>@@ -0,0 +1,23 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/${V0}1</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+TEST $CLI volume set $V0 parallel-readdir on</div><div class='add'>+TEST $CLI volume set $V0 readdir-optimize on</div><div class='add'>+</div><div class='add'>+TEST glusterfs --volfile-server=$H0 --volfile-id=$V0 $M0</div><div class='add'>+TEST mkdir -p $M0/subdir1/subdir2;</div><div class='add'>+umount $M0</div><div class='add'>+TEST glusterfs --volfile-server=$H0 --volfile-id=$V0 $M0</div><div class='add'>+count=`ls -1 $M0/subdir1 | wc -l`</div><div class='add'>+TEST [ $count -eq 1 ]</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/readdir-ahead/bug-1670253-consistent-metadata.t b/tests/bugs/readdir-ahead/bug-1670253-consistent-metadata.t<br/>new file mode 100644<br/>index 00000000000..6adfc17c92c<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/readdir-ahead/bug-1670253-consistent-metadata.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/readdir-ahead/bug-1670253-consistent-metadata.t</a></div><div class='hunk'>@@ -0,0 +1,23 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 replica 3 $H0:$B0/${V0}{0,1,2}</div><div class='add'>+TEST $CLI volume set $V0 readdir-ahead on #on by default as of writing this .t.</div><div class='add'>+TEST $CLI volume set $V0 consistent-metadata on</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+TEST glusterfs --volfile-server=$H0 --volfile-id=$V0 $M0</div><div class='add'>+TEST touch $M0/FILE</div><div class='add'>+echo "abc" &gt;&gt; $M0/FILE</div><div class='add'>+EXPECT "^0$" echo $?</div><div class='add'>+EXPECT "abc" cat $M0/FILE</div><div class='add'>+echo "truncate" &gt;$M0/FILE</div><div class='add'>+EXPECT "^0$" echo $?</div><div class='add'>+EXPECT "truncate" cat $M0/FILE</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/replicate/886998/strict-readdir.t b/tests/bugs/replicate/886998/strict-readdir.t<br/>new file mode 100644<br/>index 00000000000..63fe313b201<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/replicate/886998/strict-readdir.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/replicate/886998/strict-readdir.t</a></div><div class='hunk'>@@ -0,0 +1,52 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../../include.rc</div><div class='add'>+. $(dirname $0)/../../../volume.rc</div><div class='add'>+</div><div class='add'>+function num_files_in_dir {</div><div class='add'>+        d=$1</div><div class='add'>+        ls $d | sort | uniq | wc -l</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#Basic sanity tests for readdir functionality</div><div class='add'>+cleanup;</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 replica 2 $H0:$B0/r2d2_0 $H0:$B0/r2d2_1 $H0:$B0/r2d2_2 $H0:$B0/r2d2_3</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+TEST glusterfs --volfile-server=$H0 --volfile-id=/$V0 $M0</div><div class='add'>+</div><div class='add'>+TEST touch $M0/{1..100}</div><div class='add'>+EXPECT "100" num_files_in_dir $M0</div><div class='add'>+</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/r2d2_0</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/r2d2_2</div><div class='add'>+EXPECT "100" num_files_in_dir $M0</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status $V0 0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status $V0 2</div><div class='add'>+</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/r2d2_1</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/r2d2_3</div><div class='add'>+EXPECT "100" num_files_in_dir $M0</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status $V0 1</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status $V0 3</div><div class='add'>+</div><div class='add'>+TEST $CLI volume set $V0 cluster.strict-readdir on</div><div class='add'>+EXPECT "on" volinfo_field $V0 cluster.strict-readdir</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/r2d2_0</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/r2d2_2</div><div class='add'>+EXPECT "100" num_files_in_dir $M0</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status $V0 0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status $V0 2</div><div class='add'>+</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/r2d2_1</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/r2d2_3</div><div class='add'>+EXPECT "100" num_files_in_dir $M0</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/replicate/bug-1015990-rep.t b/tests/bugs/replicate/bug-1015990-rep.t<br/>new file mode 100755<br/>index 00000000000..ab8166e372a<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/replicate/bug-1015990-rep.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/replicate/bug-1015990-rep.t</a></div><div class='hunk'>@@ -0,0 +1,61 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+. $(dirname $0)/../../afr.rc</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+## Start and create a volume</div><div class='add'>+TEST glusterd;</div><div class='add'>+TEST pidof glusterd;</div><div class='add'>+TEST $CLI volume info;</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 replica 2 $H0:$B0/${V0}{1,2,3,4};</div><div class='add'>+## Verify volume is is created</div><div class='add'>+EXPECT "$V0" volinfo_field $V0 'Volume Name';</div><div class='add'>+EXPECT 'Created' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+## Start volume and verify</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+EXPECT 'Started' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+TEST glusterfs --volfile-id=/$V0 --volfile-server=$H0 $M0 --attribute-timeout=0 --entry-timeout=0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 1</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 2</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 3</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/$V0"1"</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/$V0"3"</div><div class='add'>+</div><div class='add'>+for  i in  {1..100}; do echo "STRING" &gt; $M0/File$i; done</div><div class='add'>+</div><div class='add'>+# Check shd is connected to all up bricks before running statistics command.</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 1</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 3</div><div class='add'>+</div><div class='add'>+command_output=$(gluster volume heal $V0 statistics heal-count replica $H0:$B0/$V0"1")</div><div class='add'>+substring="Number of entries:"</div><div class='add'>+count=0</div><div class='add'>+while read -r line;</div><div class='add'>+do</div><div class='add'>+        if [[ "$line" == *$substring* ]]</div><div class='add'>+                then</div><div class='add'>+                        value=$(echo $line | cut -f 2 -d :)</div><div class='add'>+                        count=$(($count + $value))</div><div class='add'>+        fi</div><div class='add'>+</div><div class='add'>+done &lt;&lt;&lt; "$command_output"</div><div class='add'>+</div><div class='add'>+brick_2_entries_count=$count</div><div class='add'>+xattrop_count_brick_2=$(count_sh_entries $B0/$V0"2")</div><div class='add'>+EXPECT $brick_2_entries_count echo $xattrop_count_brick_2</div><div class='add'>+</div><div class='add'>+## Finish up</div><div class='add'>+TEST $CLI volume stop $V0;</div><div class='add'>+EXPECT 'Stopped' volinfo_field $V0 'Status';</div><div class='add'>+TEST $CLI volume delete $V0;</div><div class='add'>+TEST ! $CLI volume info $V0</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/replicate/bug-1015990.t b/tests/bugs/replicate/bug-1015990.t<br/>new file mode 100755<br/>index 00000000000..a8b12f2c202<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/replicate/bug-1015990.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/replicate/bug-1015990.t</a></div><div class='hunk'>@@ -0,0 +1,69 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+. $(dirname $0)/../../afr.rc</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+## Start and create a volume</div><div class='add'>+TEST glusterd;</div><div class='add'>+TEST pidof glusterd;</div><div class='add'>+TEST $CLI volume info;</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 replica 2 $H0:$B0/${V0}{1,2,3,4};</div><div class='add'>+</div><div class='add'>+## Verify volume is is created</div><div class='add'>+EXPECT "$V0" volinfo_field $V0 'Volume Name';</div><div class='add'>+EXPECT 'Created' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+## Start volume and verify</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+EXPECT 'Started' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+TEST glusterfs --volfile-id=/$V0 --volfile-server=$H0 $M0 --attribute-timeout=0 --entry-timeout=0</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/$V0"1"</div><div class='add'>+sleep 5</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/$V0"3"</div><div class='add'>+sleep 5</div><div class='add'>+</div><div class='add'>+for  i in  {1..100}; do echo "STRING" &gt; $M0/File$i; done</div><div class='add'>+</div><div class='add'>+brick_2_sh_entries=$(count_sh_entries $B0/$V0"2")</div><div class='add'>+brick_4_sh_entries=$(count_sh_entries $B0/$V0"4")</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+command_output=$(gluster volume heal $V0 statistics heal-count)</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+substring="Number of entries:"</div><div class='add'>+count=0</div><div class='add'>+while read -r line;</div><div class='add'>+do</div><div class='add'>+        if [[ "$line" == *$substring* ]]</div><div class='add'>+                then</div><div class='add'>+                        value=$(echo $line | cut -f 2 -d :)</div><div class='add'>+                        count=$(($count + $value))</div><div class='add'>+        fi</div><div class='add'>+</div><div class='add'>+done &lt;&lt;&lt; "$command_output"</div><div class='add'>+</div><div class='add'>+brick_2_entries_count=$(($count-$value))</div><div class='add'>+brick_4_entries_count=$value</div><div class='add'>+</div><div class='add'>+xattrop_count_brick_2=$(count_sh_entries $B0/$V0"2")</div><div class='add'>+xattrop_count_brick_4=$(count_sh_entries $B0/$V0"4")</div><div class='add'>+EXPECT $brick_2_entries_count echo $xattrop_count_brick_2</div><div class='add'>+EXPECT $brick_4_entries_count echo $xattrop_count_brick_4</div><div class='add'>+</div><div class='add'>+## Finish up</div><div class='add'>+TEST $CLI volume stop $V0;</div><div class='add'>+EXPECT 'Stopped' volinfo_field $V0 'Status';</div><div class='add'>+TEST $CLI volume delete $V0;</div><div class='add'>+TEST ! $CLI volume info $V0</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='head'>diff --git a/tests/bugs/replicate/bug-1032927.t b/tests/bugs/replicate/bug-1032927.t<br/>new file mode 100644<br/>index 00000000000..eb663d03fed<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/replicate/bug-1032927.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/replicate/bug-1032927.t</a></div><div class='hunk'>@@ -0,0 +1,32 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+#This tests if pathinfo getxattr fails when one of the bricks is down</div><div class='add'>+#Lets hope it doesn't</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+function get_pathinfo_in_loop {</div><div class='add'>+        failed=0</div><div class='add'>+        for i in {1..1000}</div><div class='add'>+        do</div><div class='add'>+                getfattr -n trusted.glusterfs.pathinfo $M0 2&gt;/dev/null</div><div class='add'>+                if [ $? -ne 0 ]; then failed=1;break; fi</div><div class='add'>+        done</div><div class='add'>+        return $failed</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 replica 2 $H0:$B0/${V0}{0,1}</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+TEST glusterfs --volfile-id=/$V0 --volfile-server=$H0 $M0 --attribute-timeout=0 --entry-timeout=0</div><div class='add'>+cd $M0</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}1</div><div class='add'>+</div><div class='add'>+#when one of the bricks is down getfattr of pathinfo should not fail</div><div class='add'>+#Lets just do the test for 1000 times to see if we hit the race</div><div class='add'>+TEST get_pathinfo_in_loop</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/bugs/replicate/bug-1037501.t b/tests/bugs/replicate/bug-1037501.t<br/>new file mode 100755<br/>index 00000000000..ce079555b50<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/replicate/bug-1037501.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/replicate/bug-1037501.t</a></div><div class='hunk'>@@ -0,0 +1,104 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+function write_file()</div><div class='add'>+{</div><div class='add'>+	path="$1"; shift</div><div class='add'>+	echo "$*" &gt; "$path"</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume info;</div><div class='add'>+</div><div class='add'>+## Start and create a volume</div><div class='add'>+mkdir -p ${B0}/${V0}-0</div><div class='add'>+mkdir -p ${B0}/${V0}-1</div><div class='add'>+mkdir -p ${B0}/${V0}-2</div><div class='add'>+TEST $CLI volume create $V0 replica 3 $H0:$B0/${V0}-{0,1,2}</div><div class='add'>+</div><div class='add'>+## Verify volume is created</div><div class='add'>+EXPECT "$V0" volinfo_field $V0 'Volume Name';</div><div class='add'>+EXPECT 'Created' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+## Start volume and verify</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+EXPECT 'Started' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+## Mount native</div><div class='add'>+TEST glusterfs --volfile-server=$H0 --volfile-id=$V0 $M0</div><div class='add'>+</div><div class='add'>+TEST `echo "TEST-FILE" &gt; $M0/File`</div><div class='add'>+TEST `mkdir $M0/Dir`</div><div class='add'>+TEST `ln  $M0/File $M0/Link`</div><div class='add'>+TEST `mknod $M0/FIFO p`</div><div class='add'>+</div><div class='add'>+TEST $CLI volume add-brick $V0 replica 4 $H0:$B0/$V0-3 force</div><div class='add'>+TEST $CLI volume add-brick $V0 replica 5 $H0:$B0/$V0-4 force</div><div class='add'>+TEST $CLI volume add-brick $V0 replica 6 $H0:$B0/$V0-5 force</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "Y" glustershd_up_status</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 3</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 4</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 5</div><div class='add'>+TEST gluster volume heal $V0 full</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "Y" path_exists $B0/$V0-0/File</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "Y" path_exists $B0/$V0-1/File</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "Y" path_exists $B0/$V0-2/File</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "Y" path_exists $B0/$V0-3/File</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "Y" path_exists $B0/$V0-4/File</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "Y" path_exists $B0/$V0-5/File</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "Y" path_exists $B0/$V0-0/Link</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "Y" path_exists $B0/$V0-1/Link</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "Y" path_exists $B0/$V0-2/Link</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "Y" path_exists $B0/$V0-3/Link</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "Y" path_exists $B0/$V0-4/Link</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "Y" path_exists $B0/$V0-5/Link</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "Y" path_exists $B0/$V0-0/Dir</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "Y" path_exists $B0/$V0-1/Dir</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "Y" path_exists $B0/$V0-2/Dir</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "Y" path_exists $B0/$V0-3/Dir</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "Y" path_exists $B0/$V0-4/Dir</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "Y" path_exists $B0/$V0-5/Dir</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "Y" path_exists $B0/$V0-0/FIFO</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "Y" path_exists $B0/$V0-1/FIFO</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "Y" path_exists $B0/$V0-2/FIFO</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "Y" path_exists $B0/$V0-3/FIFO</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "Y" path_exists $B0/$V0-4/FIFO</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "Y" path_exists $B0/$V0-5/FIFO</div><div class='add'>+</div><div class='add'>+EXPECT 10 stat -c '%s' $B0/$V0-0/File</div><div class='add'>+EXPECT 10 stat -c '%s' $B0/$V0-1/File</div><div class='add'>+EXPECT 10 stat -c '%s' $B0/$V0-2/File</div><div class='add'>+EXPECT 10 stat -c '%s' $B0/$V0-3/File</div><div class='add'>+EXPECT 10 stat -c '%s' $B0/$V0-4/File</div><div class='add'>+EXPECT 10 stat -c '%s' $B0/$V0-5/File</div><div class='add'>+</div><div class='add'>+EXPECT 3 stat -c '%h' $B0/$V0-0/Link</div><div class='add'>+EXPECT 3 stat -c '%h' $B0/$V0-1/Link</div><div class='add'>+EXPECT 3 stat -c '%h' $B0/$V0-2/Link</div><div class='add'>+EXPECT 3 stat -c '%h' $B0/$V0-3/Link</div><div class='add'>+EXPECT 3 stat -c '%h' $B0/$V0-4/Link</div><div class='add'>+EXPECT 3 stat -c '%h' $B0/$V0-5/Link</div><div class='add'>+</div><div class='add'>+EXPECT 'directory' stat -c '%F' $B0/$V0-0/Dir</div><div class='add'>+EXPECT 'directory' stat -c '%F' $B0/$V0-1/Dir</div><div class='add'>+EXPECT 'directory' stat -c '%F' $B0/$V0-2/Dir</div><div class='add'>+EXPECT 'directory' stat -c '%F' $B0/$V0-3/Dir</div><div class='add'>+EXPECT 'directory' stat -c '%F' $B0/$V0-4/Dir</div><div class='add'>+EXPECT 'directory' stat -c '%F' $B0/$V0-5/Dir</div><div class='add'>+</div><div class='add'>+EXPECT 'fifo' stat -c '%F' $B0/$V0-0/FIFO</div><div class='add'>+EXPECT 'fifo' stat -c '%F' $B0/$V0-1/FIFO</div><div class='add'>+EXPECT 'fifo' stat -c '%F' $B0/$V0-2/FIFO</div><div class='add'>+EXPECT 'fifo' stat -c '%F' $B0/$V0-3/FIFO</div><div class='add'>+EXPECT 'fifo' stat -c '%F' $B0/$V0-4/FIFO</div><div class='add'>+EXPECT 'fifo' stat -c '%F' $B0/$V0-5/FIFO</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/replicate/bug-1046624.t b/tests/bugs/replicate/bug-1046624.t<br/>new file mode 100755<br/>index 00000000000..e2762ea6764<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/replicate/bug-1046624.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/replicate/bug-1046624.t</a></div><div class='hunk'>@@ -0,0 +1,47 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+</div><div class='add'>+## Start and create a volume</div><div class='add'>+TEST $CLI volume create $V0 replica 2 $H0:$B0/${V0}-{0,1}</div><div class='add'>+</div><div class='add'>+## Verify volume is created</div><div class='add'>+EXPECT "$V0" volinfo_field $V0 'Volume Name';</div><div class='add'>+EXPECT 'Created' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+## Make sure automatic self-heal doesn't perturb our results.</div><div class='add'>+TEST $CLI volume set $V0 cluster.self-heal-daemon off</div><div class='add'>+TEST $CLI volume set $V0 stat-prefetch off</div><div class='add'>+TEST $CLI volume set $V0 background-self-heal-count 0</div><div class='add'>+</div><div class='add'>+## Start volume and verify</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+EXPECT 'Started' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+## Mount native</div><div class='add'>+TEST ${GFS} --volfile-server=$H0 --volfile-id=$V0 --use-readdirp=no $M0</div><div class='add'>+</div><div class='add'>+TEST `echo "TEST-FILE" &gt; $M0/File`</div><div class='add'>+TEST `mkdir $M0/Dir`</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}-0</div><div class='add'>+EXPECT_WITHIN ${PROCESS_DOWN_TIMEOUT} "^0$" afr_child_up_status $V0 0</div><div class='add'>+</div><div class='add'>+TEST `ln -s $M0/File $M0/Link1`</div><div class='add'>+TEST `ln -s $M0/Dir $M0/Link2`</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status $V0 0</div><div class='add'>+</div><div class='add'>+TEST `find $M0/ 2&gt;/dev/null 1&gt;/dev/null`</div><div class='add'>+TEST `find $M0/ | xargs stat 2&gt;/dev/null 1&gt;/dev/null`</div><div class='add'>+</div><div class='add'>+TEST stat $B0/${V0}-0/Link1</div><div class='add'>+TEST stat $B0/${V0}-0/Link2</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/replicate/bug-1058797.t b/tests/bugs/replicate/bug-1058797.t<br/>new file mode 100644<br/>index 00000000000..598062a0dab<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/replicate/bug-1058797.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/replicate/bug-1058797.t</a></div><div class='hunk'>@@ -0,0 +1,48 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+#Test that the setuid bit is healed correctly.</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+#Basic checks</div><div class='add'>+TEST glusterd</div><div class='add'>+</div><div class='add'>+#Create a 1x2 replica volume</div><div class='add'>+TEST $CLI volume create $V0 replica 2 $H0:$B0/brick{0,1};</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+TEST $CLI volume set $V0 cluster.self-heal-daemon off</div><div class='add'>+TEST $CLI volume set $V0 cluster.data-self-heal on</div><div class='add'>+TEST $CLI volume set $V0 cluster.metadata-self-heal on</div><div class='add'>+TEST $CLI volume set $V0 cluster.entry-self-heal on</div><div class='add'>+</div><div class='add'>+# FUSE mount;create a file</div><div class='add'>+TEST glusterfs -s $H0 --volfile-id $V0 $M0</div><div class='add'>+TEST touch $M0/file</div><div class='add'>+</div><div class='add'>+#Kill brick1 and set S_ISUID and S_ISGID bits from mount point</div><div class='add'>+kill_brick $V0 $H0 $B0/brick1</div><div class='add'>+TEST chmod +x,+s $M0/file</div><div class='add'>+</div><div class='add'>+#Get file permissions from backend brick0 and verify that S_ISUID is indeed set</div><div class='add'>+file_permissions1=`ls -l $B0/brick0/file | awk '{print $1}'| cut -d. -f1 | cut -d- -f2,3,4,5,6`</div><div class='add'>+setuid_bit1=`echo $file_permissions1 | cut -b3`</div><div class='add'>+EXPECT "s" echo $setuid_bit1</div><div class='add'>+</div><div class='add'>+#Restart volume and do lookup from mount to trigger heal</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status $V0 1</div><div class='add'>+TEST dd if=$M0/file of=/dev/null</div><div class='add'>+</div><div class='add'>+#Get file permissions from healed brick1 and verify that S_ISUID is indeed set</div><div class='add'>+file_permissions2=`ls -l $B0/brick1/file | awk '{print $1}' | cut -d. -f1 | cut -d- -f2,3,4,5,6`</div><div class='add'>+setuid_bit2=`echo $file_permissions2 | cut -b3`</div><div class='add'>+EXPECT "s" echo $setuid_bit2</div><div class='add'>+</div><div class='add'>+#Also compare the entire permission string,just to be sure</div><div class='add'>+EXPECT $file_permissions1 echo $file_permissions2</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+TEST $CLI volume stop $V0</div><div class='add'>+TEST $CLI volume delete $V0;</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/replicate/bug-1101647.t b/tests/bugs/replicate/bug-1101647.t<br/>new file mode 100644<br/>index 00000000000..708bc1a1e29<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/replicate/bug-1101647.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/replicate/bug-1101647.t</a></div><div class='hunk'>@@ -0,0 +1,31 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+. $(dirname $0)/../../afr.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 replica 2 $H0:$B0/${V0}{1,2};</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+TEST glusterfs --volfile-id=/$V0 --volfile-server=$H0 $M0 --attribute-timeout=0 --entry-timeout=0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "Y" glustershd_up_status</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 1</div><div class='add'>+</div><div class='add'>+#Create base entry in indices/xattrop</div><div class='add'>+echo "Data"&gt;$M0/file</div><div class='add'>+</div><div class='add'>+TEST $CLI volume heal $V0</div><div class='add'>+#Entries from indices/xattrop should not be cleared after a heal.</div><div class='add'>+EXPECT 1 count_index_entries  $B0/$V0"1"</div><div class='add'>+EXPECT 1 count_index_entries  $B0/$V0"2"</div><div class='add'>+</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}2</div><div class='add'>+echo "More data"&gt;&gt;$M0/file</div><div class='add'>+</div><div class='add'>+EXPECT 1 echo `$CLI volume heal $V0 statistics heal-count|grep "Number of entries:"|head -n1|awk '{print $4}'`</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/replicate/bug-1130892.t b/tests/bugs/replicate/bug-1130892.t<br/>new file mode 100644<br/>index 00000000000..c7509f33cc2<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/replicate/bug-1130892.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/replicate/bug-1130892.t</a></div><div class='hunk'>@@ -0,0 +1,76 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+. $(dirname $0)/../../afr.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume info;</div><div class='add'>+</div><div class='add'>+# Create a 1X2 replica</div><div class='add'>+TEST $CLI volume create $V0 replica 2 $H0:$B0/${V0}-{0,1}</div><div class='add'>+EXPECT 'Created' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+# Disable self-heal daemon</div><div class='add'>+TEST gluster volume set $V0 self-heal-daemon off</div><div class='add'>+</div><div class='add'>+# Enable Client side heal</div><div class='add'>+TEST $CLI volume set $V0 cluster.data-self-heal off</div><div class='add'>+TEST $CLI volume set $V0 cluster.metadata-self-heal off</div><div class='add'>+TEST $CLI volume set $V0 cluster.entry-self-heal off</div><div class='add'>+</div><div class='add'>+# Disable all perf-xlators</div><div class='add'>+TEST $CLI volume set $V0 performance.quick-read off</div><div class='add'>+TEST $CLI volume set $V0 performance.io-cache off</div><div class='add'>+TEST $CLI volume set $V0 performance.write-behind off</div><div class='add'>+TEST $CLI volume set $V0 performance.stat-prefetch off</div><div class='add'>+TEST $CLI volume set $V0 performance.read-ahead off</div><div class='add'>+</div><div class='add'>+# Volume start</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+EXPECT 'Started' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+# FUSE Mount</div><div class='add'>+TEST ${GFS} -s $H0 --volfile-id $V0 $M0</div><div class='add'>+</div><div class='add'>+# Create files and dirs</div><div class='add'>+TEST mkdir -p $M0/one/two/</div><div class='add'>+TEST `echo "Carpe diem" &gt; $M0/one/two/three`</div><div class='add'>+</div><div class='add'>+# Simulate disk-replacement</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}-1</div><div class='add'>+EXPECT_WITHIN ${PROCESS_DOWN_TIMEOUT} "^0$" afr_child_up_status $V0 1</div><div class='add'>+TEST rm -rf $B0/${V0}-1/one</div><div class='add'>+TEST rm -rf $B0/${V0}-1/.glusterfs</div><div class='add'>+</div><div class='add'>+#Ideally, disk replacement is done using reset-brick or replace-brick gluster CLI</div><div class='add'>+#which will create .glusterfs folder.</div><div class='add'>+mkdir $B0/${V0}-1/.glusterfs &amp;&amp; chmod 600 $B0/${V0}-1/.glusterfs</div><div class='add'>+</div><div class='add'>+# Start force</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status $V0 1</div><div class='add'>+</div><div class='add'>+TEST stat $M0/one</div><div class='add'>+</div><div class='add'>+sleep 1</div><div class='add'>+</div><div class='add'>+# Check pending xattrs</div><div class='add'>+EXPECT "00000000" afr_get_specific_changelog_xattr $B0/${V0}-0/one trusted.afr.$V0-client-1 data</div><div class='add'>+EXPECT_NOT "00000000" afr_get_specific_changelog_xattr $B0/${V0}-0/one trusted.afr.$V0-client-1 entry</div><div class='add'>+EXPECT_NOT "00000000" afr_get_specific_changelog_xattr $B0/${V0}-0/one trusted.afr.$V0-client-1 metadata</div><div class='add'>+</div><div class='add'>+TEST gluster volume set $V0 self-heal-daemon on</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "Y" glustershd_up_status</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 1</div><div class='add'>+TEST $CLI volume heal $V0</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "Y" is_dir_heal_done $B0/${V0}-0 $B0/${V0}-1 one</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "Y" is_dir_heal_done $B0/${V0}-0 $B0/${V0}-1 one/two</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "Y" is_file_heal_done $B0/${V0}-0 $B0/${V0}-1 one/two/three</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/replicate/bug-1132102.t b/tests/bugs/replicate/bug-1132102.t<br/>new file mode 100644<br/>index 00000000000..c7dbbf818aa<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/replicate/bug-1132102.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/replicate/bug-1132102.t</a></div><div class='hunk'>@@ -0,0 +1,28 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+#This tests that mknod and create fops mark necessary pending changelog</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 replica 2 $H0:$B0/${V0}{0,1}</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+TEST glusterfs --volfile-id=/$V0 --volfile-server=$H0 $M0 --attribute-timeout=0 --entry-timeout=0</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}0</div><div class='add'>+cd $M0</div><div class='add'>+TEST mkfifo fifo</div><div class='add'>+TEST mknod block b 0 0</div><div class='add'>+TEST touch a</div><div class='add'>+EXPECT "00000000" afr_get_specific_changelog_xattr $B0/${V0}1/fifo trusted.afr.$V0-client-0 data</div><div class='add'>+EXPECT "00000000" afr_get_specific_changelog_xattr $B0/${V0}1/fifo trusted.afr.$V0-client-0 entry</div><div class='add'>+EXPECT_NOT "00000000" afr_get_specific_changelog_xattr $B0/${V0}1/fifo trusted.afr.$V0-client-0 metadata</div><div class='add'>+EXPECT "00000000" afr_get_specific_changelog_xattr $B0/${V0}1/block trusted.afr.$V0-client-0 data</div><div class='add'>+EXPECT "00000000" afr_get_specific_changelog_xattr $B0/${V0}1/block trusted.afr.$V0-client-0 entry</div><div class='add'>+EXPECT_NOT "00000000" afr_get_specific_changelog_xattr $B0/${V0}1/block trusted.afr.$V0-client-0 metadata</div><div class='add'>+EXPECT_NOT "00000000" afr_get_specific_changelog_xattr $B0/${V0}1/a trusted.afr.$V0-client-0 data</div><div class='add'>+EXPECT "00000000" afr_get_specific_changelog_xattr $B0/${V0}1/a trusted.afr.$V0-client-0 entry</div><div class='add'>+EXPECT_NOT "00000000" afr_get_specific_changelog_xattr $B0/${V0}1/a trusted.afr.$V0-client-0 metadata</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/bugs/replicate/bug-1134691-afr-lookup-metadata-heal.t b/tests/bugs/replicate/bug-1134691-afr-lookup-metadata-heal.t<br/>new file mode 100644<br/>index 00000000000..b69a38ae788<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/replicate/bug-1134691-afr-lookup-metadata-heal.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/replicate/bug-1134691-afr-lookup-metadata-heal.t</a></div><div class='hunk'>@@ -0,0 +1,56 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+#### Test iatt and user xattr heal from lookup code path ####</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 replica 3 $H0:$B0/brick{0,1,2}</div><div class='add'>+TEST $CLI volume set $V0 performance.stat-prefetch off</div><div class='add'>+TEST $CLI volume set $V0 cluster.self-heal-daemon off</div><div class='add'>+TEST $CLI volume set $V0 cluster.data-self-heal on</div><div class='add'>+TEST $CLI volume set $V0 cluster.metadata-self-heal on</div><div class='add'>+TEST $CLI volume set $V0 cluster.entry-self-heal on</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+TEST glusterfs --volfile-id=/$V0 --volfile-server=$H0 $M0 --attribute-timeout=0 --entry-timeout=0</div><div class='add'>+</div><div class='add'>+cd $M0</div><div class='add'>+TEST touch file</div><div class='add'>+TEST setfattr -n user.attribute1 -v "value" $B0/brick0/file</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/brick2</div><div class='add'>+TEST chmod +x file</div><div class='add'>+iatt=$(stat -c "%g:%u:%A" file)</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 2</div><div class='add'>+EXPECT 2 get_pending_heal_count $V0</div><div class='add'>+</div><div class='add'>+#Trigger metadataheal</div><div class='add'>+TEST stat file</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "^0$" get_pending_heal_count $V0</div><div class='add'>+</div><div class='add'>+#iattrs must be matching</div><div class='add'>+iatt1=$(stat -c "%g:%u:%A" $B0/brick0/file)</div><div class='add'>+iatt2=$(stat -c "%g:%u:%A" $B0/brick1/file)</div><div class='add'>+iatt3=$(stat -c "%g:%u:%A" $B0/brick2/file)</div><div class='add'>+EXPECT $iatt echo $iatt1</div><div class='add'>+EXPECT $iatt echo $iatt2</div><div class='add'>+EXPECT $iatt echo $iatt3</div><div class='add'>+</div><div class='add'>+#xattrs must be matching</div><div class='add'>+xatt1_cnt=$(getfattr -d $B0/brick0/file|wc|awk '{print $1}')</div><div class='add'>+xatt2_cnt=$(getfattr -d $B0/brick1/file|wc|awk '{print $1}')</div><div class='add'>+xatt3_cnt=$(getfattr -d $B0/brick2/file|wc|awk '{print $1}')</div><div class='add'>+EXPECT "$xatt1_cnt" echo $xatt2_cnt</div><div class='add'>+EXPECT "$xatt1_cnt" echo $xatt3_cnt</div><div class='add'>+</div><div class='add'>+#changelogs must be zero</div><div class='add'>+xattr1=$(get_hex_xattr trusted.afr.$V0-client-2 $B0/brick0/file)</div><div class='add'>+xattr2=$(get_hex_xattr trusted.afr.$V0-client-2 $B0/brick1/file)</div><div class='add'>+EXPECT "000000000000000000000000" echo $xattr1</div><div class='add'>+EXPECT "000000000000000000000000" echo $xattr2</div><div class='add'>+</div><div class='add'>+cd -</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/replicate/bug-1139230.t b/tests/bugs/replicate/bug-1139230.t<br/>new file mode 100644<br/>index 00000000000..9ceac6c4f4e<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/replicate/bug-1139230.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/replicate/bug-1139230.t</a></div><div class='hunk'>@@ -0,0 +1,58 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+. $(dirname $0)/../../afr.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume info;</div><div class='add'>+</div><div class='add'>+# Create a 1X2 replica</div><div class='add'>+TEST $CLI volume create $V0 replica 2 $H0:$B0/${V0}-{0,1}</div><div class='add'>+EXPECT 'Created' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+# Volume start</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+EXPECT 'Started' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+# FUSE Mount</div><div class='add'>+TEST glusterfs -s $H0 --volfile-id $V0 $M0</div><div class='add'>+</div><div class='add'>+TEST mkdir -p $M0/one</div><div class='add'>+</div><div class='add'>+# Kill a brick</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}-1</div><div class='add'>+</div><div class='add'>+TEST `echo "A long" &gt; $M0/one/two`</div><div class='add'>+</div><div class='add'>+# Start force</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status $V0 1</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "Y" is_dir_heal_done $B0/${V0}-0 $B0/${V0}-1 one</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "Y" is_file_heal_done $B0/${V0}-0 $B0/${V0}-1 one/two</div><div class='add'>+</div><div class='add'>+# Pending xattrs should be set for all the bricks once self-heal is done</div><div class='add'>+# Check pending xattrs</div><div class='add'>+EXPECT "0x000000000000000000000000" afr_get_changelog_xattr $B0/${V0}-0/one trusted.afr.$V0-client-0</div><div class='add'>+EXPECT "0x000000000000000000000000" afr_get_changelog_xattr $B0/${V0}-0/one trusted.afr.$V0-client-1</div><div class='add'>+EXPECT "0x000000000000000000000000" afr_get_changelog_xattr $B0/${V0}-1/one trusted.afr.$V0-client-0</div><div class='add'>+EXPECT "0x000000000000000000000000" afr_get_changelog_xattr $B0/${V0}-1/one trusted.afr.$V0-client-1</div><div class='add'>+EXPECT "0x000000000000000000000000" afr_get_changelog_xattr $B0/${V0}-0/one trusted.afr.dirty</div><div class='add'>+EXPECT "0x000000000000000000000000" afr_get_changelog_xattr $B0/${V0}-1/one trusted.afr.dirty</div><div class='add'>+</div><div class='add'>+TEST `echo "time ago" &gt; $M0/one/three`</div><div class='add'>+</div><div class='add'>+# Pending xattrs should be set for all the bricks once transaction is done</div><div class='add'>+# Check pending xattrs</div><div class='add'>+EXPECT "0x000000000000000000000000" afr_get_changelog_xattr $B0/${V0}-0/one/three trusted.afr.$V0-client-0</div><div class='add'>+EXPECT "0x000000000000000000000000" afr_get_changelog_xattr $B0/${V0}-0/one/three trusted.afr.$V0-client-1</div><div class='add'>+EXPECT "0x000000000000000000000000" afr_get_changelog_xattr $B0/${V0}-1/one/three trusted.afr.$V0-client-0</div><div class='add'>+EXPECT "0x000000000000000000000000" afr_get_changelog_xattr $B0/${V0}-1/one/three trusted.afr.$V0-client-1</div><div class='add'>+EXPECT "0x000000000000000000000000" afr_get_changelog_xattr $B0/${V0}-0/one/three trusted.afr.dirty</div><div class='add'>+EXPECT "0x000000000000000000000000" afr_get_changelog_xattr $B0/${V0}-1/one/three trusted.afr.dirty</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/replicate/bug-1180545.t b/tests/bugs/replicate/bug-1180545.t<br/>new file mode 100644<br/>index 00000000000..5e40edd6c38<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/replicate/bug-1180545.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/replicate/bug-1180545.t</a></div><div class='hunk'>@@ -0,0 +1,77 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+#Create gfid split-brain of directory and check if conservative merge</div><div class='add'>+#completes successfully.</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+. $(dirname $0)/../../afr.rc</div><div class='add'>+</div><div class='add'>+function check_sh_entries() {</div><div class='add'>+        local expected="$1"</div><div class='add'>+        local count=</div><div class='add'>+        local good="0"</div><div class='add'>+        shift</div><div class='add'>+</div><div class='add'>+        for i in $*; do</div><div class='add'>+                count="$(count_sh_entries $i)"</div><div class='add'>+                if [[ "x${count}" == "x${expected}" ]]; then</div><div class='add'>+                        good="$((good + 1))"</div><div class='add'>+                fi</div><div class='add'>+        done</div><div class='add'>+        if [[ "x${good}" != "x${last_good}" ]]; then</div><div class='add'>+                last_good="${good}"</div><div class='add'>+# This triggers a sweep of the heal index. However if more than one brick</div><div class='add'>+# tries to heal the same directory at the same time, one of them will take</div><div class='add'>+# the lock and the other will give up, waiting for the next heal cycle, which</div><div class='add'>+# is set to 60 seconds (the minimum valid value). So, each time we detect</div><div class='add'>+# that one brick has completed the heal, we trigger another heal.</div><div class='add'>+                $CLI volume heal $V0</div><div class='add'>+        fi</div><div class='add'>+</div><div class='add'>+        echo "${good}"</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 replica 2 $H0:$B0/brick{0,1}</div><div class='add'>+TEST $CLI volume set $V0 cluster.heal-timeout 60</div><div class='add'>+TEST $CLI volume set $V0 cluster.self-heal-daemon off</div><div class='add'>+TEST $CLI volume set $V0 stat-prefetch off</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+TEST $GFS --volfile-id=$V0 --volfile-server=$H0 $M0;</div><div class='add'>+</div><div class='add'>+#Create files with alternate brick down. One file has gfid mismatch.</div><div class='add'>+TEST mkdir $M0/DIR</div><div class='add'>+</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/brick1</div><div class='add'>+TEST touch $M0/DIR/FILE</div><div class='add'>+TEST touch $M0/DIR/file{1..5}</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status $V0 1</div><div class='add'>+</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/brick0</div><div class='add'>+TEST touch $M0/DIR/FILE</div><div class='add'>+TEST touch $M0/DIR/file{6..10}</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status $V0 0</div><div class='add'>+</div><div class='add'>+#Trigger heal and verify number of entries in backend</div><div class='add'>+TEST $CLI volume set $V0 cluster.self-heal-daemon on</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "Y" glustershd_up_status</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 1</div><div class='add'>+</div><div class='add'>+TEST $CLI volume heal $V0</div><div class='add'>+</div><div class='add'>+last_good=""</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "2" check_sh_entries 2 $B0/brick{0,1}</div><div class='add'>+</div><div class='add'>+#Two entries for DIR and two for FILE</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "4" get_pending_heal_count $V0</div><div class='add'>+TEST diff &lt;(ls $B0/brick0/DIR) &lt;(ls $B0/brick1/DIR)</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/bugs/replicate/bug-1190069-afr-stale-index-entries.t b/tests/bugs/replicate/bug-1190069-afr-stale-index-entries.t<br/>new file mode 100644<br/>index 00000000000..fe8e992e8f8<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/replicate/bug-1190069-afr-stale-index-entries.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/replicate/bug-1190069-afr-stale-index-entries.t</a></div><div class='hunk'>@@ -0,0 +1,57 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+. $(dirname $0)/../../afr.rc</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+#Stale entries in xattrop folder for files which do not need heal must be removed during the next index heal crawl.</div><div class='add'>+</div><div class='add'>+TEST glusterd;</div><div class='add'>+TEST pidof glusterd;</div><div class='add'>+TEST $CLI volume create $V0 replica 2 $H0:$B0/${V0}{0,1};</div><div class='add'>+TEST $CLI volume set $V0 cluster.self-heal-daemon off</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+TEST glusterfs --volfile-id=/$V0 --volfile-server=$H0 $M0 --attribute-timeout=0 --entry-timeout=0</div><div class='add'>+TEST `echo hello&gt;$M0/datafile`</div><div class='add'>+TEST touch $M0/mdatafile</div><div class='add'>+</div><div class='add'>+#Create split-brain and reset the afr xattrs, so that we have only the entry inside xattrop folder.</div><div class='add'>+#This is to simulate the case where the brick crashed just before pre-op happened, but index xlator created the entry inside xattrop folder.</div><div class='add'>+</div><div class='add'>+#Create data, metadata SB.</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/$V0"1"</div><div class='add'>+TEST stat $M0/datafile</div><div class='add'>+TEST `echo append&gt;&gt;$M0/datafile`</div><div class='add'>+TEST chmod +x $M0/mdatafile</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT '1' afr_child_up_status_meta $M0 $V0-replicate-0 1</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/$V0"0"</div><div class='add'>+TEST stat $M0/datafile</div><div class='add'>+TEST `echo append&gt;&gt;$M0/datafile`</div><div class='add'>+TEST chmod -x $M0/mdatafile</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT '1' afr_child_up_status_meta $M0 $V0-replicate-0 0</div><div class='add'>+TEST ! cat $M0/datafile</div><div class='add'>+</div><div class='add'>+TEST $CLI volume set $V0 cluster.self-heal-daemon on</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "Y" glustershd_up_status</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT '1' afr_child_up_status_in_shd $V0 0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT '1' afr_child_up_status_in_shd $V0 1</div><div class='add'>+</div><div class='add'>+TEST $CLI volume heal $V0</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT '2' count_sh_entries $B0/$V0"0"</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT '2' count_sh_entries $B0/$V0"1"</div><div class='add'>+</div><div class='add'>+#Reset xattrs and trigger heal.</div><div class='add'>+TEST setfattr -n trusted.afr.$V0-client-1 -v 0x000000000000000000000000 $B0/${V0}0/datafile</div><div class='add'>+TEST setfattr -n trusted.afr.$V0-client-0 -v 0x000000000000000000000000 $B0/${V0}1/datafile</div><div class='add'>+</div><div class='add'>+TEST setfattr -n trusted.afr.$V0-client-1 -v 0x000000000000000000000000 $B0/${V0}0/mdatafile</div><div class='add'>+TEST setfattr -n trusted.afr.$V0-client-0 -v 0x000000000000000000000000 $B0/${V0}1/mdatafile</div><div class='add'>+</div><div class='add'>+TEST $CLI volume heal $V0</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "0" get_pending_heal_count $V0</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT '0' count_sh_entries $B0/$V0"0"</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT '0' count_sh_entries $B0/$V0"1"</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/bugs/replicate/bug-1221481-allow-fops-on-dir-split-brain.t b/tests/bugs/replicate/bug-1221481-allow-fops-on-dir-split-brain.t<br/>new file mode 100644<br/>index 00000000000..6ff471fbf15<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/replicate/bug-1221481-allow-fops-on-dir-split-brain.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/replicate/bug-1221481-allow-fops-on-dir-split-brain.t</a></div><div class='hunk'>@@ -0,0 +1,42 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+. $(dirname $0)/../../afr.rc</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+#Allow readdirs to proceed on directories that are in split-brain</div><div class='add'>+</div><div class='add'>+TEST glusterd;</div><div class='add'>+TEST pidof glusterd;</div><div class='add'>+TEST $CLI volume create $V0 replica 2 $H0:$B0/${V0}{0,1};</div><div class='add'>+TEST $CLI volume set $V0 cluster.self-heal-daemon off</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+TEST $GFS --volfile-id=/$V0 --volfile-server=$H0 $M0</div><div class='add'>+TEST mkdir $M0/dir</div><div class='add'>+TEST touch $M0/dir/file{1..5}</div><div class='add'>+</div><div class='add'>+#Create entry split-brain</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/$V0"1"</div><div class='add'>+EXPECT_WITHIN ${PROCESS_DOWN_TIMEOUT} "^0$" afr_child_up_status $V0 1</div><div class='add'>+TEST touch $M0/dir/FILE</div><div class='add'>+EXPECT_WITHIN ${UMOUNT_TIMEOUT} "^Y$" force_umount $M0</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+TEST $GFS --volfile-id=/$V0 --volfile-server=$H0 $M0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT '1' afr_child_up_status_meta $M0 $V0-replicate-0 0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT '1' afr_child_up_status_meta $M0 $V0-replicate-0 1</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/$V0"0"</div><div class='add'>+EXPECT_WITHIN ${PROCESS_DOWN_TIMEOUT} "^0$" afr_child_up_status $V0 0</div><div class='add'>+TEST touch $M0/dir/FILE</div><div class='add'>+EXPECT_WITHIN ${UMOUNT_TIMEOUT} "^Y$" force_umount $M0</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+TEST $GFS --volfile-id=/$V0 --volfile-server=$H0 $M0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT '1' afr_child_up_status_meta $M0 $V0-replicate-0 0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT '1' afr_child_up_status_meta $M0 $V0-replicate-0 1</div><div class='add'>+</div><div class='add'>+cd $M0/dir</div><div class='add'>+EXPECT "6" echo $(ls | wc -l)</div><div class='add'>+TEST ! cat FILE</div><div class='add'>+TEST `echo hello&gt;hello.txt`</div><div class='add'>+cd -</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/bugs/replicate/bug-1238398-split-brain-resolution.t b/tests/bugs/replicate/bug-1238398-split-brain-resolution.t<br/>new file mode 100644<br/>index 00000000000..8ef3aae979f<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/replicate/bug-1238398-split-brain-resolution.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/replicate/bug-1238398-split-brain-resolution.t</a></div><div class='hunk'>@@ -0,0 +1,51 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+function get_split_brain_status {</div><div class='add'>+        local path=$1</div><div class='add'>+        echo `getfattr -n replica.split-brain-status $path` | cut -f2 -d"=" | sed -e 's/^"//'  -e 's/"$//'</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 replica 2 $H0:$B0/${V0}{0,1}</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+#Disable self-heal-daemon</div><div class='add'>+TEST $CLI volume set $V0 cluster.self-heal-daemon off</div><div class='add'>+</div><div class='add'>+TEST glusterfs --volfile-id=$V0 --volfile-server=$H0 --entry-timeout=0 $M0;</div><div class='add'>+</div><div class='add'>+TEST `echo "some-data" &gt; $M0/metadata-split-brain.txt`</div><div class='add'>+</div><div class='add'>+#Create metadata split-brain</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}0</div><div class='add'>+TEST chmod 666 $M0/metadata-split-brain.txt</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}1</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 0</div><div class='add'>+</div><div class='add'>+TEST chmod 757 $M0/metadata-split-brain.txt</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 1</div><div class='add'>+</div><div class='add'>+EXPECT 2 get_pending_heal_count $V0</div><div class='add'>+</div><div class='add'>+#Inspect the file in metadata-split-brain</div><div class='add'>+EXPECT "data-split-brain:no metadata-split-brain:yes Choices:patchy-client-0,patchy-client-1" get_split_brain_status $M0/metadata-split-brain.txt</div><div class='add'>+TEST setfattr -n replica.split-brain-choice -v $V0-client-0 $M0/metadata-split-brain.txt</div><div class='add'>+</div><div class='add'>+EXPECT "757" stat -c %a $M0/metadata-split-brain.txt</div><div class='add'>+</div><div class='add'>+TEST setfattr -n replica.split-brain-choice -v $V0-client-1 $M0/metadata-split-brain.txt</div><div class='add'>+EXPECT "666" stat -c %a $M0/metadata-split-brain.txt</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+#G_TESTDEF_TEST_STATUS_NETBSD7=BAD_TEST,BUG=000000</div><div class='add'>+#G_TESTDEF_TEST_STATUS_CENTOS6=BAD_TEST,BUG=000000</div><div class='head'>diff --git a/tests/bugs/replicate/bug-1238508-self-heal.t b/tests/bugs/replicate/bug-1238508-self-heal.t<br/>new file mode 100644<br/>index 00000000000..24fb07d31f0<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/replicate/bug-1238508-self-heal.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/replicate/bug-1238508-self-heal.t</a></div><div class='hunk'>@@ -0,0 +1,51 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 replica 2 $H0:$B0/${V0}{0,1}</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+# Disable self-heal-daemon</div><div class='add'>+TEST $CLI volume set $V0 cluster.self-heal-daemon off</div><div class='add'>+</div><div class='add'>+TEST glusterfs --volfile-id=$V0 --volfile-server=$H0 $M0;</div><div class='add'>+</div><div class='add'>+TEST mkdir $M0/olddir;</div><div class='add'>+TEST `echo "some-data" &gt; $M0/olddir/oldfile`</div><div class='add'>+</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}1</div><div class='add'>+TEST mv $M0/olddir/oldfile $M0/olddir/newfile;</div><div class='add'>+TEST mv $M0/olddir $M0/newdir;</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 1</div><div class='add'>+</div><div class='add'>+TEST $CLI volume set $V0 cluster.self-heal-daemon on</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "Y" glustershd_up_status</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 1</div><div class='add'>+</div><div class='add'>+TEST $CLI volume heal $V0</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "0" get_pending_heal_count $V0</div><div class='add'>+</div><div class='add'>+# Test if the files are present on both the bricks</div><div class='add'>+EXPECT "newdir" ls $B0/${V0}0/</div><div class='add'>+EXPECT "newdir" ls $B0/${V0}1/</div><div class='add'>+EXPECT "newfile" ls $B0/${V0}0/newdir/</div><div class='add'>+EXPECT "newfile" ls $B0/${V0}1/newdir/</div><div class='add'>+</div><div class='add'>+# Test if gfid-link files in .glusterfs also provide correct info</div><div class='add'>+brick0gfid=$(gf_get_gfid_backend_file_path $B0/${V0}0 newdir)</div><div class='add'>+brick1gfid=$(gf_get_gfid_backend_file_path $B0/${V0}1 newdir)</div><div class='add'>+EXPECT "newfile" ls $brick0gfid</div><div class='add'>+EXPECT "newfile" ls $brick1gfid</div><div class='add'>+</div><div class='add'>+# Test if the files are accessible from the mount</div><div class='add'>+EXPECT "newdir" ls $M0/</div><div class='add'>+EXPECT "newfile" ls $M0/newdir</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/replicate/bug-1250170-fsync.c b/tests/bugs/replicate/bug-1250170-fsync.c<br/>new file mode 100644<br/>index 00000000000..21fd96594aa<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/replicate/bug-1250170-fsync.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/replicate/bug-1250170-fsync.c</a></div><div class='hunk'>@@ -0,0 +1,56 @@</div><div class='add'>+#include &lt;stdio.h&gt;</div><div class='add'>+#include &lt;stdlib.h&gt;</div><div class='add'>+#include &lt;inttypes.h&gt;</div><div class='add'>+#include &lt;sys/types.h&gt;</div><div class='add'>+#include &lt;sys/stat.h&gt;</div><div class='add'>+#include &lt;fcntl.h&gt;</div><div class='add'>+#include &lt;unistd.h&gt;</div><div class='add'>+#include &lt;string.h&gt;</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+main(int argc, char **argv)</div><div class='add'>+{</div><div class='add'>+    char *file = NULL;</div><div class='add'>+    int fd = -1;</div><div class='add'>+    char *buffer = NULL;</div><div class='add'>+    size_t buf_size = 0;</div><div class='add'>+    size_t written = 0;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    off_t offset = 0;</div><div class='add'>+    int i = 0;</div><div class='add'>+    int loop_count = 5;</div><div class='add'>+</div><div class='add'>+    if (argc &lt; 2) {</div><div class='add'>+        printf("Usage:%s &lt;filename&gt;\n", argv[0]);</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    file = argv[1];</div><div class='add'>+    buf_size = 1024;</div><div class='add'>+    buffer = malloc(buf_size);</div><div class='add'>+    if (!buffer) {</div><div class='add'>+        perror("malloc");</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+    memset(buffer, 'R', buf_size);</div><div class='add'>+</div><div class='add'>+    fd = open(file, O_WRONLY);</div><div class='add'>+    if (fd == -1) {</div><div class='add'>+        perror("open");</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; loop_count; i++) {</div><div class='add'>+        ret = write(fd, buffer, buf_size);</div><div class='add'>+        if (ret == -1) {</div><div class='add'>+            perror("write");</div><div class='add'>+            return ret;</div><div class='add'>+        } else {</div><div class='add'>+            written += ret;</div><div class='add'>+        }</div><div class='add'>+        offset = lseek(fd, 0, SEEK_SET);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    free(buffer);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='head'>diff --git a/tests/bugs/replicate/bug-1250170-fsync.t b/tests/bugs/replicate/bug-1250170-fsync.t<br/>new file mode 100644<br/>index 00000000000..7a3fdbf8bb5<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/replicate/bug-1250170-fsync.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/replicate/bug-1250170-fsync.t</a></div><div class='hunk'>@@ -0,0 +1,35 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+TEST gcc  $(dirname $0)/bug-1250170-fsync.c -o  $(dirname $0)/bug-1250170-fsync</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 replica 2 $H0:$B0/${V0}{0,1}</div><div class='add'>+TEST $CLI volume set $V0 performance.write-behind off</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+TEST $GFS --volfile-id=$V0 --volfile-server=$H0 $M0;</div><div class='add'>+</div><div class='add'>+TEST touch $M0/file</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}0</div><div class='add'>+TEST gluster volume profile $V0 start</div><div class='add'>+#Perform 5 non-sequential writes.</div><div class='add'>+TEST $(dirname $0)/bug-1250170-fsync $M0/file</div><div class='add'>+</div><div class='add'>+#Run profile info initially to filter out the interval statistics in the</div><div class='add'>+#subsequent runs.</div><div class='add'>+TEST $CLI volume profile $V0 info</div><div class='add'>+#We get only cumulative statistics.</div><div class='add'>+write_count=$($CLI volume profile $V0 info | grep WRITE |awk '{count += $8} END {print count}')</div><div class='add'>+fsync_count=$($CLI volume profile $V0 info | grep FSYNC |awk '{count += $8} END {print count}')</div><div class='add'>+</div><div class='add'>+EXPECT "5" echo $write_count</div><div class='add'>+TEST [ -z $fsync_count ]</div><div class='add'>+</div><div class='add'>+TEST $CLI volume profile $V0 stop</div><div class='add'>+TEST umount $M0</div><div class='add'>+rm -f $(dirname $0)/bug-1250170-fsync</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/bugs/replicate/bug-1266876-allow-reset-brick-for-same-path.t b/tests/bugs/replicate/bug-1266876-allow-reset-brick-for-same-path.t<br/>new file mode 100644<br/>index 00000000000..884b7892954<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/replicate/bug-1266876-allow-reset-brick-for-same-path.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/replicate/bug-1266876-allow-reset-brick-for-same-path.t</a></div><div class='hunk'>@@ -0,0 +1,54 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 replica 2 $H0:$B0/${V0}{0,1}</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+TEST glusterfs --volfile-id=$V0 --volfile-server=$H0 $M0;</div><div class='add'>+# Create files</div><div class='add'>+for i in {1..5}</div><div class='add'>+do</div><div class='add'>+        echo $i &gt; $M0/file$i.txt</div><div class='add'>+done</div><div class='add'>+</div><div class='add'>+# Negative case with brick not killed &amp;&amp; volume-id xattrs present</div><div class='add'>+TEST ! $CLI volume reset-brick $V0 $H0:$B0/${V0}1 $H0:$B0/${V0}1 commit force</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}1</div><div class='add'>+</div><div class='add'>+# Negative case with brick killed but volume-id xattr present</div><div class='add'>+TEST ! $CLI volume reset-brick $V0 $H0:$B0/${V0}1 $H0:$B0/${V0}1 commit</div><div class='add'>+</div><div class='add'>+TEST $CLI volume reset-brick $V0 $H0:$B0/${V0}1 start</div><div class='add'>+# Simulated reset disk</div><div class='add'>+for i in {1..5}</div><div class='add'>+do</div><div class='add'>+        rm -rf $B0/${V0}{1}/file$i.txt</div><div class='add'>+done</div><div class='add'>+for i in {6..10}</div><div class='add'>+do</div><div class='add'>+        echo $i &gt; $M0/file$i.txt</div><div class='add'>+done</div><div class='add'>+</div><div class='add'>+# Now reset the brick</div><div class='add'>+TEST $CLI volume reset-brick $V0 $H0:$B0/${V0}1 $H0:$B0/${V0}1 commit force</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 1</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "Y" glustershd_up_status</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 1</div><div class='add'>+</div><div class='add'>+TEST $CLI volume heal $V0</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "0" get_pending_heal_count $V0</div><div class='add'>+</div><div class='add'>+# Check if entry-heal has happened</div><div class='add'>+TEST diff &lt;(ls $B0/${V0}0 | sort) &lt;(ls $B0/${V0}1 | sort)</div><div class='add'>+EXPECT "10" echo $(ls $B0/${V0}1 | wc -l)</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/replicate/bug-1292379.t b/tests/bugs/replicate/bug-1292379.t<br/>new file mode 100644<br/>index 00000000000..be1bf699173<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/replicate/bug-1292379.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/replicate/bug-1292379.t</a></div><div class='hunk'>@@ -0,0 +1,58 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+. $(dirname $0)/../../afr.rc</div><div class='add'>+. $(dirname $0)/../../fileio.rc</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume info</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 replica 2 $H0:$B0/${V0}{0,1}</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+EXPECT 'Started' volinfo_field $V0 'Status'</div><div class='add'>+TEST $CLI volume set $V0 cluster.self-heal-daemon off</div><div class='add'>+TEST $CLI volume set $V0 cluster.entry-self-heal off</div><div class='add'>+TEST $CLI volume set $V0 cluster.data-self-heal off</div><div class='add'>+TEST $CLI volume set $V0 cluster.metadata-self-heal off</div><div class='add'>+TEST $CLI volume set $V0 cluster.eager-lock off</div><div class='add'>+</div><div class='add'>+TEST glusterfs --volfile-id=$V0 --volfile-server=$H0 $M0</div><div class='add'>+</div><div class='add'>+TEST wfd=`fd_available`</div><div class='add'>+TEST fd_open $wfd "w" $M0/a</div><div class='add'>+</div><div class='add'>+TEST fd_write $wfd "abcd"</div><div class='add'>+</div><div class='add'>+# Kill brick-0</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}0</div><div class='add'>+</div><div class='add'>+# While brick-0 is down, rename 'a' to 'b'</div><div class='add'>+TEST mv $M0/a $M0/b</div><div class='add'>+</div><div class='add'>+TEST fd_write $wfd "lmn"</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status $V0 0</div><div class='add'>+TEST fd_write $wfd "pqrs"</div><div class='add'>+TEST $CLI volume set $V0 self-heal-daemon on</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "Y" glustershd_up_status</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 1</div><div class='add'>+</div><div class='add'>+TEST $CLI volume heal $V0</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "^0$" get_pending_heal_count $V0</div><div class='add'>+</div><div class='add'>+TEST fd_write $wfd "xyz"</div><div class='add'>+TEST fd_close $wfd</div><div class='add'>+</div><div class='add'>+md5sum_b0=$(md5sum $B0/${V0}0/b | awk '{print $1}')</div><div class='add'>+</div><div class='add'>+EXPECT "$md5sum_b0" echo `md5sum $B0/${V0}1/b | awk '{print $1}'`</div><div class='add'>+</div><div class='add'>+TEST umount $M0</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/bugs/replicate/bug-1297695.t b/tests/bugs/replicate/bug-1297695.t<br/>new file mode 100644<br/>index 00000000000..d5c1a214fe2<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/replicate/bug-1297695.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/replicate/bug-1297695.t</a></div><div class='hunk'>@@ -0,0 +1,43 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='add'>+</div><div class='add'>+function write_to_file {</div><div class='add'>+        dd of=$M0/dir/file if=/dev/urandom bs=1024k count=128 2&gt;&amp;1 &gt;/dev/null</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 replica 2 $H0:$B0/${V0}0 $H0:$B0/${V0}1</div><div class='add'>+</div><div class='add'>+TEST $CLI volume set $V0 cluster.eager-lock on</div><div class='add'>+TEST $CLI volume set $V0 post-op-delay-secs 3</div><div class='add'>+TEST $CLI volume set $V0 cluster.entry-self-heal off</div><div class='add'>+TEST $CLI volume set $V0 cluster.data-self-heal off</div><div class='add'>+TEST $CLI volume set $V0 cluster.metadata-self-heal off</div><div class='add'>+TEST $CLI volume set $V0 cluster.self-heal-daemon off</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+TEST $CLI volume profile $V0 start</div><div class='add'>+TEST $CLI volume set $V0 ensure-durability off</div><div class='add'>+TEST glusterfs --volfile-id=/$V0 --volfile-server=$H0 $M0 --attribute-timeout=0 --entry-timeout=0</div><div class='add'>+TEST mkdir $M0/dir</div><div class='add'>+TEST touch $M0/dir/file</div><div class='add'>+</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}0</div><div class='add'>+TEST `echo 'abc' &gt; $M0/dir/file`</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 1</div><div class='add'>+</div><div class='add'>+write_to_file &amp;</div><div class='add'>+#Test if the MAX [F]INODELK fop latency is of the order of seconds.</div><div class='add'>+EXPECT "^1$" get_pending_heal_count $V0</div><div class='add'>+inodelk_max_latency=$($CLI volume profile $V0 info | grep INODELK | awk 'BEGIN {max = 0} {if ($6 &gt; max) max=$6;} END {print max}' | cut -d. -f 1 | egrep "[0-9]{7,}")</div><div class='add'>+TEST [ -z $inodelk_max_latency ]</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/bugs/replicate/bug-1305031-block-reads-on-metadata-sbrain.t b/tests/bugs/replicate/bug-1305031-block-reads-on-metadata-sbrain.t<br/>new file mode 100644<br/>index 00000000000..780ddb9250c<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/replicate/bug-1305031-block-reads-on-metadata-sbrain.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/replicate/bug-1305031-block-reads-on-metadata-sbrain.t</a></div><div class='hunk'>@@ -0,0 +1,40 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+#Test that for files in metadata-split-brain, we do not wind even a single read.</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 replica 2 $H0:$B0/${V0}{0,1}</div><div class='add'>+</div><div class='add'>+TEST $CLI volume set $V0 self-heal-daemon off</div><div class='add'>+TEST $CLI volume set $V0 performance.read-ahead off</div><div class='add'>+TEST $CLI volume set $V0 performance.write-behind off</div><div class='add'>+TEST $CLI volume set $V0 performance.io-cache off</div><div class='add'>+TEST $CLI volume set $V0 performance.stat-prefetch off</div><div class='add'>+TEST $CLI volume set $V0 performance.quick-read off</div><div class='add'>+TEST $CLI volume set $V0 performance.open-behind off</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+TEST glusterfs --volfile-id=/$V0 --volfile-server=$H0 $M0</div><div class='add'>+TEST dd if=/dev/urandom of=$M0/file bs=1024 count=1024</div><div class='add'>+</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}0</div><div class='add'>+TEST chmod 700 $M0/file</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 0</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}1</div><div class='add'>+TEST chmod 777 $M0/file</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 1</div><div class='add'>+TEST umount $M0</div><div class='add'>+TEST glusterfs --volfile-id=/$V0 --volfile-server=$H0 $M0</div><div class='add'>+</div><div class='add'>+lines=`cat $M0/file|wc|awk '{print $1}'`</div><div class='add'>+EXPECT 0  echo $lines</div><div class='add'>+TEST umount $M0</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/bugs/replicate/bug-1325792.t b/tests/bugs/replicate/bug-1325792.t<br/>new file mode 100644<br/>index 00000000000..73190e5f341<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/replicate/bug-1325792.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/replicate/bug-1325792.t</a></div><div class='hunk'>@@ -0,0 +1,25 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 replica 2 $H0:$B0/${V0}{0,1,2,3}</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+TEST glusterfs --volfile-id=$V0 --volfile-server=$H0 --entry-timeout=0 $M0;</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 1</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 2</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 3</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+EXPECT 1 echo `$CLI volume heal $V0 statistics heal-count replica $H0:$B0/${V0}0 | grep -A 1 ${V0}0 | grep "entries" | wc -l`</div><div class='add'>+EXPECT 1 echo `$CLI volume heal $V0 statistics heal-count replica $H0:$B0/${V0}1 | grep -A 1 ${V0}1 | grep "entries" | wc -l`</div><div class='add'>+EXPECT 1 echo `$CLI volume heal $V0 statistics heal-count replica $H0:$B0/${V0}2 | grep -A 1 ${V0}2 | grep "entries" | wc -l`</div><div class='add'>+EXPECT 1 echo `$CLI volume heal $V0 statistics heal-count replica $H0:$B0/${V0}3 | grep -A 1 ${V0}3 | grep "entries" | wc -l`</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/bugs/replicate/bug-1335652.t b/tests/bugs/replicate/bug-1335652.t<br/>new file mode 100644<br/>index 00000000000..653a1b05ce2<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/replicate/bug-1335652.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/replicate/bug-1335652.t</a></div><div class='hunk'>@@ -0,0 +1,29 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 replica 3 $H0:$B0/${V0}{0,1,2}</div><div class='add'>+TEST $CLI volume set $V0 shard on</div><div class='add'>+TEST $CLI volume set $V0 self-heal-daemon off</div><div class='add'>+TEST $CLI volume set $V0 data-self-heal off</div><div class='add'>+TEST $CLI volume set $V0 entry-self-heal off</div><div class='add'>+TEST $CLI volume set $V0 metadata-self-heal off</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+TEST glusterfs --volfile-id=$V0 --volfile-server=$H0 $M0;</div><div class='add'>+</div><div class='add'>+#Kill the zero'th brick so that 1st and 2nd get marked dirty</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}0</div><div class='add'>+</div><div class='add'>+TEST dd if=/dev/urandom of=$M0/file bs=10MB count=20</div><div class='add'>+</div><div class='add'>+#At any point value of dirty should not be greater than 0 on source bricks</div><div class='add'>+EXPECT "000000000000000000000000" get_hex_xattr trusted.afr.dirty $B0/${V0}1/.shard</div><div class='add'>+EXPECT "000000000000000000000000" get_hex_xattr trusted.afr.dirty $B0/${V0}2/.shard</div><div class='add'>+</div><div class='add'>+rm -rf $M0/file;</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/replicate/bug-1340623-mkdir-fails-remove-brick-started.t b/tests/bugs/replicate/bug-1340623-mkdir-fails-remove-brick-started.t<br/>new file mode 100644<br/>index 00000000000..6d177a7d3f8<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/replicate/bug-1340623-mkdir-fails-remove-brick-started.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/replicate/bug-1340623-mkdir-fails-remove-brick-started.t</a></div><div class='hunk'>@@ -0,0 +1,46 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+. $(dirname $0)/../../nfs.rc</div><div class='add'>+</div><div class='add'>+#G_TESTDEF_TEST_STATUS_CENTOS6=NFS_TEST</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+</div><div class='add'>+## Create a 2x2 volume</div><div class='add'>+TEST $CLI volume create $V0 replica 2 $H0:$B0/r11 $H0:$B0/r12 $H0:$B0/r21 $H0:$B0/r22;</div><div class='add'>+EXPECT "$V0" volinfo_field $V0 'Volume Name';</div><div class='add'>+EXPECT 'Created' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+## Start the volume</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+EXPECT 'Started' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+## for release &gt; 3.7 , gluster nfs is off by default</div><div class='add'>+TEST $CLI vol set $V0 nfs.disable off;</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $NFS_EXPORT_TIMEOUT "1" is_nfs_export_available;</div><div class='add'>+</div><div class='add'>+TEST mount_nfs $H0:/$V0 $N0;</div><div class='add'>+</div><div class='add'>+## create some directories and files inside mount</div><div class='add'>+mkdir $N0/io;</div><div class='add'>+for j in {1..10}; do mkdir $N0/io/b$j; for k in {1..10}; do touch $N0/io/b$j/c$k; done done</div><div class='add'>+</div><div class='add'>+TEST $CLI volume remove-brick $V0 $H0:$B0/r11 $H0:$B0/r12 start;</div><div class='add'>+</div><div class='add'>+TEST mkdir $N0/dir1;</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $REBALANCE_TIMEOUT "completed" remove_brick_status_completed_field "$V0" "$H0:$B0/r11 $H0:$B0/r12"</div><div class='add'>+</div><div class='add'>+TEST $CLI volume remove-brick $V0 $H0:$B0/r11 $H0:$B0/r12 commit;</div><div class='add'>+</div><div class='add'>+TEST mkdir $N0/dir2;</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $N0</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/replicate/bug-1341650.t b/tests/bugs/replicate/bug-1341650.t<br/>new file mode 100644<br/>index 00000000000..610342ca5bd<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/replicate/bug-1341650.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/replicate/bug-1341650.t</a></div><div class='hunk'>@@ -0,0 +1,63 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+. $(dirname $0)/../../afr.rc</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume info</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 replica 3 $H0:$B0/${V0}{0..2}</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+EXPECT 'Started' volinfo_field $V0 'Status'</div><div class='add'>+TEST $CLI volume quota $V0 enable</div><div class='add'>+TEST $CLI volume set $V0 quota-deem-statfs on</div><div class='add'>+TEST $CLI volume set $V0 soft-timeout 0</div><div class='add'>+TEST $CLI volume set $V0 hard-timeout 0</div><div class='add'>+</div><div class='add'>+TEST glusterfs --volfile-id=$V0 --volfile-server=$H0 $M0</div><div class='add'>+TEST mkdir $M0/dir</div><div class='add'>+TEST $CLI volume quota $V0 limit-objects /dir 10</div><div class='add'>+</div><div class='add'>+TEST touch $M0/dir/file1</div><div class='add'>+TEST touch $M0/dir/file2</div><div class='add'>+TEST touch $M0/dir/file3</div><div class='add'>+TEST touch $M0/dir/file4</div><div class='add'>+TEST touch $M0/dir/file5</div><div class='add'>+</div><div class='add'>+# Kill 3rd brick and create entries</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}2</div><div class='add'>+TEST touch $M0/dir/file6</div><div class='add'>+TEST touch $M0/dir/file7</div><div class='add'>+TEST touch $M0/dir/file8</div><div class='add'>+TEST touch $M0/dir/file9</div><div class='add'>+</div><div class='add'>+# Quota object limit is reached. Remove object for create to succeed.</div><div class='add'>+TEST ! touch $M0/dir/file10</div><div class='add'>+</div><div class='add'>+TEST rm $M0/dir/file1</div><div class='add'>+TEST touch $M0/dir/file10</div><div class='add'>+</div><div class='add'>+EXPECT "000000000000000000000000" get_hex_xattr trusted.afr.dirty $B0/${V0}0/dir</div><div class='add'>+EXPECT "000000000000000000000000" get_hex_xattr trusted.afr.dirty $B0/${V0}1/dir</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "Y" glustershd_up_status</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 1</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 2</div><div class='add'>+</div><div class='add'>+TEST $CLI volume heal $V0</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "^0$" get_pending_heal_count $V0</div><div class='add'>+</div><div class='add'>+#Check that no convervative merge happened.file1 must not be present on any brick.</div><div class='add'>+TEST ! stat $B0/${V0}0/dir/file1</div><div class='add'>+TEST ! stat $B0/${V0}1/dir/file1</div><div class='add'>+TEST ! stat $B0/${V0}2/dir/file1</div><div class='add'>+</div><div class='add'>+TEST umount $M0</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/bugs/replicate/bug-1363721.t b/tests/bugs/replicate/bug-1363721.t<br/>new file mode 100644<br/>index 00000000000..0ed34d8a4f4<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/replicate/bug-1363721.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/replicate/bug-1363721.t</a></div><div class='hunk'>@@ -0,0 +1,118 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+FILE_UPDATE_TIMEOUT=20</div><div class='add'>+cleanup</div><div class='add'>+</div><div class='add'>+function size_increased {</div><div class='add'>+        local file=$1</div><div class='add'>+        local size=$2</div><div class='add'>+        local new_size=$(stat -c%s $file)</div><div class='add'>+        if [ $new_size -gt $size ];</div><div class='add'>+        then</div><div class='add'>+                echo "Y"</div><div class='add'>+        else</div><div class='add'>+                echo "N"</div><div class='add'>+        fi</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function has_write_failed {</div><div class='add'>+        local pid=$1</div><div class='add'>+        if [ -d /proc/$pid ]; then echo "N"; else echo "Y"; fi</div><div class='add'>+}</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 replica 3 $H0:$B0/${V0}{0,1,2}</div><div class='add'>+TEST $CLI volume set $V0 performance.write-behind off</div><div class='add'>+TEST $CLI volume set $V0 cluster.self-heal-daemon off</div><div class='add'>+TEST $CLI volume set $V0 cluster.data-self-heal off</div><div class='add'>+TEST $CLI volume set $V0 cluster.metadata-self-heal off</div><div class='add'>+TEST $CLI volume set $V0 cluster.entry-self-heal off</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+TEST $GFS --volfile-id=$V0 --volfile-server=$H0 --direct-io-mode=enable $M0</div><div class='add'>+</div><div class='add'>+cd $M0</div><div class='add'>+</div><div class='add'>+# Start writing to a file.</div><div class='add'>+(dd if=/dev/urandom of=$M0/file1 bs=1k 2&gt;/dev/null 1&gt;/dev/null)&amp;</div><div class='add'>+dd_pid=$!</div><div class='add'>+</div><div class='add'>+# Let IO happen</div><div class='add'>+EXPECT_WITHIN $FILE_UPDATE_TIMEOUT "Y" size_increased file1 0</div><div class='add'>+</div><div class='add'>+# Now kill the zeroth brick</div><div class='add'>+kill_brick $V0 $H0 $B0/${V0}0</div><div class='add'>+</div><div class='add'>+# Let IO continue</div><div class='add'>+EXPECT_WITHIN $FILE_UPDATE_TIMEOUT "Y" size_increased file1 $(stat -c%s file1)</div><div class='add'>+</div><div class='add'>+# Now bring the brick back up</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status $V0 0</div><div class='add'>+</div><div class='add'>+# Let IO continue</div><div class='add'>+EXPECT_WITHIN $FILE_UPDATE_TIMEOUT "Y" size_increased file1 $(stat -c%s file1)</div><div class='add'>+</div><div class='add'>+# Now kill the first brick</div><div class='add'>+kill_brick $V0 $H0 $B0/${V0}1</div><div class='add'>+</div><div class='add'>+# Let IO continue</div><div class='add'>+EXPECT_WITHIN $FILE_UPDATE_TIMEOUT "Y" size_increased file1 $(stat -c%s file1)</div><div class='add'>+</div><div class='add'>+# Now bring the brick back up</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status $V0 1</div><div class='add'>+</div><div class='add'>+# Let IO continue for 3 seconds</div><div class='add'>+sleep 3</div><div class='add'>+</div><div class='add'>+# Now kill the second brick</div><div class='add'>+kill_brick $V0 $H0 $B0/${V0}2</div><div class='add'>+</div><div class='add'>+# At this point the write should have been failed.</div><div class='add'>+EXPECT_WITHIN $PROCESS_DOWN_TIMEOUT "Y" has_write_failed $dd_pid</div><div class='add'>+</div><div class='add'>+# Also make sure that the second brick is never an accused.</div><div class='add'>+</div><div class='add'>+md5sum_2=$(md5sum $B0/${V0}2/file1 | awk '{print $1}')</div><div class='add'>+</div><div class='add'>+EXPECT_NOT "$md5sum_2" echo `md5sum $B0/${V0}0/file1 | awk '{print $1}'`</div><div class='add'>+EXPECT_NOT "$md5sum_2" echo `md5sum $B0/${V0}1/file1 | awk '{print $1}'`</div><div class='add'>+</div><div class='add'>+EXPECT_NOT "00000000" afr_get_specific_changelog_xattr $B0/${V0}0/file1 trusted.afr.dirty data</div><div class='add'>+EXPECT_NOT "00000000" afr_get_specific_changelog_xattr $B0/${V0}1/file1 trusted.afr.dirty data</div><div class='add'>+</div><div class='add'>+EXPECT "00000000" afr_get_specific_changelog_xattr $B0/${V0}0/file1 trusted.afr.$V0-client-2 data</div><div class='add'>+EXPECT "00000000" afr_get_specific_changelog_xattr $B0/${V0}1/file1 trusted.afr.$V0-client-2 data</div><div class='add'>+EXPECT "00000000" afr_get_specific_changelog_xattr $B0/${V0}2/file1 trusted.afr.$V0-client-2 data</div><div class='add'>+EXPECT "00000000" afr_get_specific_changelog_xattr $B0/${V0}0/file1 trusted.afr.$V0-client-2 metadata</div><div class='add'>+EXPECT "00000000" afr_get_specific_changelog_xattr $B0/${V0}1/file1 trusted.afr.$V0-client-2 metadata</div><div class='add'>+EXPECT "00000000" afr_get_specific_changelog_xattr $B0/${V0}2/file1 trusted.afr.$V0-client-2 metadata</div><div class='add'>+</div><div class='add'>+# Now bring the brick back up</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status $V0 2</div><div class='add'>+</div><div class='add'>+# Enable shd</div><div class='add'>+TEST $CLI volume set $V0 self-heal-daemon on</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "Y" glustershd_up_status</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 1</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 2</div><div class='add'>+</div><div class='add'>+TEST $CLI volume heal $V0</div><div class='add'>+</div><div class='add'>+# Wait for heal to complete</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "^0$" get_pending_heal_count $V0</div><div class='add'>+</div><div class='add'>+EXPECT "$md5sum_2" echo `md5sum $B0/${V0}0/file1 | awk '{print $1}'`</div><div class='add'>+EXPECT "$md5sum_2" echo `md5sum $B0/${V0}1/file1 | awk '{print $1}'`</div><div class='add'>+EXPECT "$md5sum_2" echo `md5sum $B0/${V0}2/file1 | awk '{print $1}'`</div><div class='add'>+</div><div class='add'>+cd ~</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/bugs/replicate/bug-1365455.t b/tests/bugs/replicate/bug-1365455.t<br/>new file mode 100644<br/>index 00000000000..1953e2a9327<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/replicate/bug-1365455.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/replicate/bug-1365455.t</a></div><div class='hunk'>@@ -0,0 +1,54 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+function check_size</div><div class='add'>+{</div><div class='add'>+    for i in {1..10}; do</div><div class='add'>+        size1=`stat -c %s $B0/${V0}0/tmp$i`</div><div class='add'>+        size2=`stat -c %s $B0/${V0}1/tmp$i`</div><div class='add'>+        if [[ $size1 -eq 0 ]] || [[ $size2 -eq 0 ]] || [[ $size1 -ne $size2 ]]; then</div><div class='add'>+            return 1</div><div class='add'>+        fi</div><div class='add'>+    done</div><div class='add'>+</div><div class='add'>+    return 0</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/${V0}0;</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+</div><div class='add'>+TEST glusterfs -s $H0 --volfile-id $V0 $M0</div><div class='add'>+</div><div class='add'>+for i in {1..10}</div><div class='add'>+do</div><div class='add'>+        echo abc &gt; $M0/tmp$i</div><div class='add'>+done</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+# Add Another brick</div><div class='add'>+TEST $CLI volume add-brick $V0 replica 2 $H0:$B0/${V0}1</div><div class='add'>+</div><div class='add'>+#Check if self heal daemon has come up</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "Y" glustershd_up_status</div><div class='add'>+</div><div class='add'>+#Check if self heal daemon is able to see all bricks</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 1</div><div class='add'>+</div><div class='add'>+# Wait for heal to complete</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "^0$" get_pending_heal_count $V0</div><div class='add'>+</div><div class='add'>+# Check if entry-heal has happened</div><div class='add'>+TEST diff &lt;(ls $B0/${V0}0 | sort) &lt;(ls $B0/${V0}1 | sort)</div><div class='add'>+</div><div class='add'>+#Check size of files on bricks</div><div class='add'>+TEST check_size</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/replicate/bug-1386188-sbrain-fav-child.t b/tests/bugs/replicate/bug-1386188-sbrain-fav-child.t<br/>new file mode 100644<br/>index 00000000000..d049d95ef9a<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/replicate/bug-1386188-sbrain-fav-child.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/replicate/bug-1386188-sbrain-fav-child.t</a></div><div class='hunk'>@@ -0,0 +1,82 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 replica 2 $H0:$B0/${V0}{0,1}</div><div class='add'>+TEST $CLI volume set $V0 self-heal-daemon off</div><div class='add'>+TEST $CLI volume set $V0 data-self-heal off</div><div class='add'>+TEST $CLI volume set $V0 entry-self-heal off</div><div class='add'>+TEST $CLI volume set $V0 metadata-self-heal off</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+TEST glusterfs --volfile-id=$V0 --volfile-server=$H0 $M0;</div><div class='add'>+TEST touch $M0/data.txt</div><div class='add'>+TEST touch $M0/mdata.txt</div><div class='add'>+</div><div class='add'>+#Create data and metadata split-brain</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}0</div><div class='add'>+TEST dd if=/dev/urandom of=$M0/data.txt bs=1024 count=1024</div><div class='add'>+TEST setfattr -n user.value -v value1 $M0/mdata.txt</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status $V0 $H0 $B0/${V0}0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 0</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}1</div><div class='add'>+TEST dd if=/dev/urandom of=$M0/data.txt bs=1024 count=1024</div><div class='add'>+TEST setfattr -n user.value -v value2 $M0/mdata.txt</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status $V0 $H0 $B0/${V0}1</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 1</div><div class='add'>+</div><div class='add'>+## Check that the file still in split-brain,</div><div class='add'>+  ## I/O fails</div><div class='add'>+  cat $M0/data.txt &gt; /dev/null</div><div class='add'>+  EXPECT "1" echo $?</div><div class='add'>+  ## pending xattrs blame each other.</div><div class='add'>+  brick0_pending=$(get_hex_xattr trusted.afr.$V0-client-1 $B0/${V0}0/data.txt)</div><div class='add'>+  brick1_pending=$(get_hex_xattr trusted.afr.$V0-client-0 $B0/${V0}1/data.txt)</div><div class='add'>+  TEST [ $brick0_pending -ne "000000000000000000000000" ]</div><div class='add'>+  TEST [ $brick1_pending -ne "000000000000000000000000" ]</div><div class='add'>+</div><div class='add'>+  ## I/O fails</div><div class='add'>+  getfattr -n user.value $M0/mdata.txt</div><div class='add'>+  EXPECT "1" echo $?</div><div class='add'>+  brick0_pending=$(get_hex_xattr trusted.afr.$V0-client-1 $B0/${V0}0/mdata.txt)</div><div class='add'>+  brick1_pending=$(get_hex_xattr trusted.afr.$V0-client-0 $B0/${V0}1/mdata.txt)</div><div class='add'>+  TEST [ $brick0_pending -ne "000000000000000000000000" ]</div><div class='add'>+  TEST [ $brick1_pending -ne "000000000000000000000000" ]</div><div class='add'>+</div><div class='add'>+## Let us use mtime as fav-child policy. So brick0 will be source.</div><div class='add'>+   # Set dirty (data part) on the sink brick to check if it is reset later along with the pending xattr.</div><div class='add'>+   TEST setfattr -n trusted.afr.dirty -v 0x000000010000000000000000 $B0/${V0}1/data.txt</div><div class='add'>+   # Set dirty (metadata part) on the sink brick to check if it is reset later along with the pending xattr.</div><div class='add'>+   TEST setfattr -n trusted.afr.dirty -v 0x000000000000000100000000 $B0/${V0}1/mdata.txt</div><div class='add'>+</div><div class='add'>+   TEST $CLI volume set $V0 favorite-child-policy mtime</div><div class='add'>+</div><div class='add'>+   # Reading the file should be allowed and sink brick xattrs must be reset.</div><div class='add'>+   cat $M0/data.txt &gt; /dev/null</div><div class='add'>+   EXPECT "0" echo $?</div><div class='add'>+   TEST brick1_pending=$(get_hex_xattr trusted.afr.$V0-client-0 $B0/${V0}1/data.txt)</div><div class='add'>+   TEST brick1_dirty=$(get_hex_xattr trusted.afr.dirty $B0/${V0}1/data.txt)</div><div class='add'>+   TEST [ $brick1_dirty -eq "000000000000000000000000" ]</div><div class='add'>+   TEST [ $brick1_pending -eq "000000000000000000000000" ]</div><div class='add'>+</div><div class='add'>+   # Accessing the file should be allowed and sink brick xattrs must be reset.</div><div class='add'>+   EXPECT "value2" echo $(getfattr --only-values -n user.value  $M0/mdata.txt)</div><div class='add'>+   TEST brick1_pending=$(get_hex_xattr trusted.afr.$V0-client-0 $B0/${V0}1/data.txt)</div><div class='add'>+   TEST brick1_dirty=$(get_hex_xattr trusted.afr.dirty $B0/${V0}1/data.txt)</div><div class='add'>+   TEST [ $brick1_dirty -eq "000000000000000000000000" ]</div><div class='add'>+   TEST [ $brick1_pending -eq "000000000000000000000000" ]</div><div class='add'>+</div><div class='add'>+#Enable shd and heal the file.</div><div class='add'>+TEST $CLI volume set $V0 cluster.self-heal-daemon on</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "Y" glustershd_up_status</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 1</div><div class='add'>+TEST $CLI volume heal $V0</div><div class='add'>+EXPECT 0 get_pending_heal_count $V0</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/replicate/bug-1402730.t b/tests/bugs/replicate/bug-1402730.t<br/>new file mode 100644<br/>index 00000000000..c7866df463b<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/replicate/bug-1402730.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/replicate/bug-1402730.t</a></div><div class='hunk'>@@ -0,0 +1,47 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 replica 3 $H0:$B0/${V0}{0,1,2}</div><div class='add'>+TEST $CLI volume set $V0 granular-entry-heal on</div><div class='add'>+TEST $CLI volume set $V0 cluster.data-self-heal off</div><div class='add'>+TEST $CLI volume set $V0 cluster.metadata-self-heal off</div><div class='add'>+TEST $CLI volume set $V0 cluster.entry-self-heal off</div><div class='add'>+TEST $CLI volume set $V0 cluster.self-heal-daemon off</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+TEST glusterfs --volfile-id=$V0 --volfile-server=$H0 --entry-timeout=0 $M0</div><div class='add'>+</div><div class='add'>+TEST mkdir -p $M0/a/b/c -p</div><div class='add'>+cd $M0/a/b/c</div><div class='add'>+</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}2</div><div class='add'>+rm -rf $B0/${V0}2/*</div><div class='add'>+rm -rf $B0/${V0}2/.glusterfs</div><div class='add'>+</div><div class='add'>+#Ideally, disk replacement is done using reset-brick or replace-brick gluster CLI</div><div class='add'>+#which will create .glusterfs folder.</div><div class='add'>+mkdir $B0/${V0}2/.glusterfs &amp;&amp; chmod 600 $B0/${V0}2/.glusterfs</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 1</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 2</div><div class='add'>+</div><div class='add'>+TEST touch file</div><div class='add'>+</div><div class='add'>+GFID_C=$(get_gfid_string $M0/a/b/c)</div><div class='add'>+TEST stat $B0/${V0}0/.glusterfs/indices/entry-changes/$GFID_C/file</div><div class='add'>+TEST stat $B0/${V0}1/.glusterfs/indices/entry-changes/$GFID_C/file</div><div class='add'>+</div><div class='add'>+EXPECT_NOT "00000000" afr_get_specific_changelog_xattr $B0/${V0}0/a/b/c trusted.afr.$V0-client-2 entry</div><div class='add'>+EXPECT_NOT "00000000" afr_get_specific_changelog_xattr $B0/${V0}1/a/b/c trusted.afr.$V0-client-2 entry</div><div class='add'>+</div><div class='add'>+cd ~</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/bugs/replicate/bug-1408712.t b/tests/bugs/replicate/bug-1408712.t<br/>new file mode 100644<br/>index 00000000000..9499a598ef1<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/replicate/bug-1408712.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/replicate/bug-1408712.t</a></div><div class='hunk'>@@ -0,0 +1,101 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+. $(dirname $0)/../../afr.rc</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='add'>+</div><div class='add'>+TESTS_EXPECTED_IN_LOOP=12</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 replica 3 $H0:$B0/${V0}{0,1,2}</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+EXPECT 'Started' volinfo_field $V0 'Status'</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status $V0 $H0 $B0/${V0}0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status $V0 $H0 $B0/${V0}1</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status $V0 $H0 $B0/${V0}2</div><div class='add'>+</div><div class='add'>+TEST $CLI volume set $V0 features.shard on</div><div class='add'>+TEST $CLI volume set $V0 features.shard-block-size 4MB</div><div class='add'>+TEST $CLI volume heal $V0 granular-entry-heal enable</div><div class='add'>+TEST $CLI volume set $V0 cluster.data-self-heal off</div><div class='add'>+TEST $CLI volume set $V0 cluster.metadata-self-heal off</div><div class='add'>+TEST $CLI volume set $V0 cluster.entry-self-heal off</div><div class='add'>+TEST $CLI volume set $V0 self-heal-daemon off</div><div class='add'>+TEST $CLI volume set $V0 performance.flush-behind off</div><div class='add'>+</div><div class='add'>+TEST glusterfs --volfile-id=$V0 --volfile-server=$H0 $M0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_meta $M0 $V0-replicate-0 0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_meta $M0 $V0-replicate-0 1</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_meta $M0 $V0-replicate-0 2</div><div class='add'>+</div><div class='add'>+TEST glusterfs --volfile-id=$V0 --volfile-server=$H0 $M1</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_meta $M1 $V0-replicate-0 0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_meta $M1 $V0-replicate-0 1</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_meta $M1 $V0-replicate-0 2</div><div class='add'>+</div><div class='add'>+TEST cd $M0</div><div class='add'>+TEST dd if=/dev/zero of=file bs=1M count=8</div><div class='add'>+</div><div class='add'>+# Kill brick-0.</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}0</div><div class='add'>+EXPECT_WITHIN $PROCESS_DOWN_TIMEOUT "0" brick_up_status $V0 $H0 $B0/${V0}0</div><div class='add'>+</div><div class='add'>+TEST "dd if=/dev/zero bs=1M count=8 &gt;&gt; file"</div><div class='add'>+</div><div class='add'>+FILE_GFID=$(get_gfid_string $M0/file)</div><div class='add'>+</div><div class='add'>+# Test that the index associated with '/.shard' is created on B1 and B2.</div><div class='add'>+TEST stat $B0/${V0}1/.glusterfs/indices/entry-changes/$DOT_SHARD_GFID</div><div class='add'>+TEST stat $B0/${V0}2/.glusterfs/indices/entry-changes/$DOT_SHARD_GFID</div><div class='add'>+# Check for successful creation of granular entry indices</div><div class='add'>+for i in {2..3}</div><div class='add'>+do</div><div class='add'>+        TEST_IN_LOOP stat $B0/${V0}1/.glusterfs/indices/entry-changes/$DOT_SHARD_GFID/$FILE_GFID.$i</div><div class='add'>+        TEST_IN_LOOP stat $B0/${V0}2/.glusterfs/indices/entry-changes/$DOT_SHARD_GFID/$FILE_GFID.$i</div><div class='add'>+done</div><div class='add'>+</div><div class='add'>+TEST cd ~</div><div class='add'>+TEST md5sum $M1/file</div><div class='add'>+</div><div class='add'>+# Test that the index associated with '/.shard' and the created shards do not disappear on B1 and B2.</div><div class='add'>+TEST stat $B0/${V0}1/.glusterfs/indices/entry-changes/$DOT_SHARD_GFID</div><div class='add'>+TEST stat $B0/${V0}2/.glusterfs/indices/entry-changes/$DOT_SHARD_GFID</div><div class='add'>+for i in {2..3}</div><div class='add'>+do</div><div class='add'>+        TEST_IN_LOOP stat $B0/${V0}1/.glusterfs/indices/entry-changes/$DOT_SHARD_GFID/$FILE_GFID.$i</div><div class='add'>+        TEST_IN_LOOP stat $B0/${V0}2/.glusterfs/indices/entry-changes/$DOT_SHARD_GFID/$FILE_GFID.$i</div><div class='add'>+done</div><div class='add'>+</div><div class='add'>+# Start the brick that was down</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 1</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 2</div><div class='add'>+</div><div class='add'>+# Enable shd</div><div class='add'>+TEST gluster volume set $V0 cluster.self-heal-daemon on</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "Y" glustershd_up_status</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 1</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 2</div><div class='add'>+</div><div class='add'>+TEST $CLI volume heal $V0</div><div class='add'>+</div><div class='add'>+# Wait for heal to complete</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "^0$" get_pending_heal_count $V0</div><div class='add'>+</div><div class='add'>+# Now verify that there are no name indices left after self-heal</div><div class='add'>+TEST ! stat $B0/${V0}1/.glusterfs/indices/entry-changes/$DOT_SHARD_GFID</div><div class='add'>+TEST ! stat $B0/${V0}2/.glusterfs/indices/entry-changes/$DOT_SHARD_GFID</div><div class='add'>+</div><div class='add'>+for i in {2..3}</div><div class='add'>+do</div><div class='add'>+        TEST_IN_LOOP ! stat $B0/${V0}1/.glusterfs/indices/entry-changes/$DOT_SHARD_GFID/$FILE_GFID.$i</div><div class='add'>+        TEST_IN_LOOP ! stat $B0/${V0}2/.glusterfs/indices/entry-changes/$DOT_SHARD_GFID/$FILE_GFID.$i</div><div class='add'>+done</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/bugs/replicate/bug-1417522-block-split-brain-resolution.t b/tests/bugs/replicate/bug-1417522-block-split-brain-resolution.t<br/>new file mode 100644<br/>index 00000000000..d0e2fee8bcd<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/replicate/bug-1417522-block-split-brain-resolution.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/replicate/bug-1417522-block-split-brain-resolution.t</a></div><div class='hunk'>@@ -0,0 +1,69 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 replica 3 $H0:$B0/${V0}{0..2}</div><div class='add'>+TEST $CLI volume set $V0 self-heal-daemon off</div><div class='add'>+TEST $CLI volume set $V0 data-self-heal off</div><div class='add'>+TEST $CLI volume set $V0 entry-self-heal off</div><div class='add'>+TEST $CLI volume set $V0 metadata-self-heal off</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+TEST glusterfs --volfile-id=$V0 --volfile-server=$H0 $M0;</div><div class='add'>+TEST touch $M0/file</div><div class='add'>+</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}1</div><div class='add'>+TEST dd if=/dev/urandom of=$M0/file bs=1024 count=10</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status $V0 $H0 $B0/${V0}1</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 1</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}2</div><div class='add'>+TEST dd if=/dev/urandom of=$M0/file bs=1024 count=20</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status $V0 $H0 $B0/${V0}2</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 2</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}0</div><div class='add'>+TEST ! dd if=$M0/file of=/dev/null</div><div class='add'>+SOURCE_BRICK_MD5=$(md5sum $B0/${V0}0/file | cut -d\  -f1)</div><div class='add'>+</div><div class='add'>+# Various fav-child policies must not heal the file when some bricks are down.</div><div class='add'>+TEST $CLI volume set $V0 favorite-child-policy size</div><div class='add'>+TEST ! dd if=$M0/file of=/dev/null</div><div class='add'>+TEST $CLI volume set $V0 favorite-child-policy ctime</div><div class='add'>+TEST ! dd if=$M0/file of=/dev/null</div><div class='add'>+TEST $CLI volume set $V0 favorite-child-policy mtime</div><div class='add'>+TEST ! dd if=$M0/file of=/dev/null</div><div class='add'>+TEST $CLI volume set $V0 favorite-child-policy majority</div><div class='add'>+TEST ! dd if=$M0/file of=/dev/null</div><div class='add'>+</div><div class='add'>+# CLI/mount based split-brain resolution must also not work.</div><div class='add'>+TEST ! $CLI volume heal $V0 split-brain bigger-file /file</div><div class='add'>+TEST ! $CLI volume heal $V0 split-brain mtime /file</div><div class='add'>+TEST ! $CLI volume heal $V0 split-brain source-brick $H0:$B0/${V0}2 /file1</div><div class='add'>+</div><div class='add'>+TEST ! getfattr -n replica.split-brain-status $M0/file</div><div class='add'>+TEST ! setfattr -n replica.split-brain-choice -v $V0-client-1 $M0/file</div><div class='add'>+</div><div class='add'>+# Bring all bricks back up and launch heal.</div><div class='add'>+TEST $CLI volume set $V0 self-heal-daemon on</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status $V0 $H0 $B0/${V0}0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "Y" glustershd_up_status</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 1</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 2</div><div class='add'>+TEST $CLI volume heal $V0</div><div class='add'>+EXPECT 0 get_pending_heal_count $V0</div><div class='add'>+B1_MD5=$(md5sum $B0/${V0}1/file | cut -d\  -f1)</div><div class='add'>+B2_MD5=$(md5sum $B0/${V0}2/file | cut -d\  -f1)</div><div class='add'>+TEST [ "$SOURCE_BRICK_MD5" == "$B1_MD5" ]</div><div class='add'>+TEST [ "$SOURCE_BRICK_MD5" == "$B2_MD5" ]</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+#G_TESTDEF_TEST_STATUS_NETBSD7=BAD_TEST,BUG=000000</div><div class='add'>+#G_TESTDEF_TEST_STATUS_CENTOS6=BAD_TEST,BUG=000000</div><div class='head'>diff --git a/tests/bugs/replicate/bug-1433571-undo-pending-only-on-up-bricks.t b/tests/bugs/replicate/bug-1433571-undo-pending-only-on-up-bricks.t<br/>new file mode 100644<br/>index 00000000000..10ce0131f4f<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/replicate/bug-1433571-undo-pending-only-on-up-bricks.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/replicate/bug-1433571-undo-pending-only-on-up-bricks.t</a></div><div class='hunk'>@@ -0,0 +1,79 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 replica 3 $H0:$B0/${V0}{0,1,2}</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+TEST $GFS --volfile-id=$V0 --volfile-server=$H0 $M0;</div><div class='add'>+</div><div class='add'>+# Disable self-heal-daemon, client-side-heal and set quorum-type to none</div><div class='add'>+TEST $CLI volume set $V0 cluster.self-heal-daemon off</div><div class='add'>+TEST $CLI volume set $V0 cluster.data-self-heal off</div><div class='add'>+TEST $CLI volume set $V0 cluster.metadata-self-heal off</div><div class='add'>+TEST $CLI volume set $V0 cluster.entry-self-heal off</div><div class='add'>+TEST $CLI volume set $V0 cluster.quorum-type none</div><div class='add'>+</div><div class='add'>+#Kill bricks 0 &amp; 1 and create a file to have pending entry for 0 &amp; 1 on brick 2</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}0</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}1</div><div class='add'>+echo "file 1" &gt;&gt; $M0/f1</div><div class='add'>+EXPECT "000000000000000000000001" get_hex_xattr trusted.afr.$V0-client-0 $B0/${V0}2</div><div class='add'>+EXPECT "000000000000000000000001" get_hex_xattr trusted.afr.$V0-client-1 $B0/${V0}2</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status $V0 0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status $V0 1</div><div class='add'>+</div><div class='add'>+#Kill bricks 1 &amp; 2 and create a file to have pending entry for 1 &amp; 2 on brick 0</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}1</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}2</div><div class='add'>+echo "file 2" &gt;&gt; $M0/f2</div><div class='add'>+EXPECT "000000000000000000000001" get_hex_xattr trusted.afr.$V0-client-1 $B0/${V0}0</div><div class='add'>+EXPECT "000000000000000000000001" get_hex_xattr trusted.afr.$V0-client-2 $B0/${V0}0</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status $V0 1</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status $V0 2</div><div class='add'>+</div><div class='add'>+#Kill bricks 2 &amp; 0 and create a file to have pending entry for 2 &amp; 0 on brick 1</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}2</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}0</div><div class='add'>+echo "file 3" &gt;&gt; $M0/f3</div><div class='add'>+EXPECT "000000000000000000000001" get_hex_xattr trusted.afr.$V0-client-0 $B0/${V0}1</div><div class='add'>+EXPECT "000000000000000000000001" get_hex_xattr trusted.afr.$V0-client-2 $B0/${V0}1</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status $V0 0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status $V0 2</div><div class='add'>+</div><div class='add'>+# We were killing one brick and checking that entry heal does not reset the</div><div class='add'>+# pending xattrs for the down brick. Now that we need all bricks to be up for</div><div class='add'>+# entry heal, I'm removing that test from the .t</div><div class='add'>+</div><div class='add'>+TEST $CLI volume set $V0 cluster.data-self-heal on</div><div class='add'>+TEST $CLI volume set $V0 cluster.metadata-self-heal on</div><div class='add'>+TEST $CLI volume set $V0 cluster.entry-self-heal on</div><div class='add'>+</div><div class='add'>+TEST ls $M0</div><div class='add'>+TEST cat $M0/f1</div><div class='add'>+TEST cat $M0/f2</div><div class='add'>+TEST cat $M0/f3</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "^0$" get_pending_heal_count $V0</div><div class='add'>+</div><div class='add'>+EXPECT "000000000000000000000000" get_hex_xattr trusted.afr.$V0-client-1 $B0/${V0}0</div><div class='add'>+EXPECT "000000000000000000000000" get_hex_xattr trusted.afr.$V0-client-2 $B0/${V0}0</div><div class='add'>+EXPECT "000000000000000000000000" get_hex_xattr trusted.afr.$V0-client-0 $B0/${V0}1</div><div class='add'>+EXPECT "000000000000000000000000" get_hex_xattr trusted.afr.$V0-client-2 $B0/${V0}1</div><div class='add'>+EXPECT "000000000000000000000000" get_hex_xattr trusted.afr.$V0-client-0 $B0/${V0}2</div><div class='add'>+EXPECT "000000000000000000000000" get_hex_xattr trusted.afr.$V0-client-1 $B0/${V0}2</div><div class='add'>+</div><div class='add'>+#Check whether all the bricks contains all the 3 files.</div><div class='add'>+EXPECT "3" echo $(ls $B0/${V0}0 | wc -l)</div><div class='add'>+EXPECT "3" echo $(ls $B0/${V0}1 | wc -l)</div><div class='add'>+EXPECT "3" echo $(ls $B0/${V0}2 | wc -l)</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/replicate/bug-1438255-do-not-mark-self-accusing-xattrs.t b/tests/bugs/replicate/bug-1438255-do-not-mark-self-accusing-xattrs.t<br/>new file mode 100644<br/>index 00000000000..cdcaf62c925<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/replicate/bug-1438255-do-not-mark-self-accusing-xattrs.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/replicate/bug-1438255-do-not-mark-self-accusing-xattrs.t</a></div><div class='hunk'>@@ -0,0 +1,46 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+NEW_USER=bug1438255</div><div class='add'>+NEW_UID=1438255</div><div class='add'>+NEW_GID=1438255</div><div class='add'>+</div><div class='add'>+TEST groupadd -o -g ${NEW_GID} ${NEW_USER}-${NEW_GID}</div><div class='add'>+TEST useradd -o -M -u ${NEW_UID} -g ${NEW_GID} -K MAIL_DIR=/dev/null ${NEW_USER}</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 replica 3 $H0:$B0/${V0}{0,1,2}</div><div class='add'>+TEST $CLI volume set $V0 cluster.self-heal-daemon off</div><div class='add'>+TEST $CLI volume set $V0 cluster.data-self-heal off</div><div class='add'>+TEST $CLI volume set $V0 cluster.metadata-self-heal off</div><div class='add'>+TEST $CLI volume set $V0 cluster.entry-self-heal off</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+EXPECT 'Started' volinfo_field $V0 'Status'</div><div class='add'>+TEST glusterfs --volfile-id=/$V0 --volfile-server=$H0 $M0 --attribute-timeout=0 --entry-timeout=0</div><div class='add'>+</div><div class='add'>+TEST touch $M0/FILE</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}2</div><div class='add'>+chown $NEW_UID:$NEW_GID $M0/FILE</div><div class='add'>+EXPECT "000000000000000100000000" get_hex_xattr trusted.afr.$V0-client-2 $B0/${V0}0/FILE</div><div class='add'>+EXPECT "000000000000000100000000" get_hex_xattr trusted.afr.$V0-client-2 $B0/${V0}1/FILE</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 2</div><div class='add'>+</div><div class='add'>+# setfattr done as NEW_USER fails on 3rd brick with EPERM but suceeds on</div><div class='add'>+# the first 2 and hence on the mount.</div><div class='add'>+su -m bug1438255 -c "setfattr -n user.myattr -v myvalue  $M0/FILE"</div><div class='add'>+TEST [ $? -eq 0 ]</div><div class='add'>+EXPECT "000000000000000200000000" get_hex_xattr trusted.afr.$V0-client-2 $B0/${V0}0/FILE</div><div class='add'>+EXPECT "000000000000000200000000" get_hex_xattr trusted.afr.$V0-client-2 $B0/${V0}1/FILE</div><div class='add'>+# Brick 3 does not have any self-blaming pending xattr.</div><div class='add'>+TEST ! getfattr -n trusted.afr.$V0-client-2 $B0/${V0}2/FILE</div><div class='add'>+</div><div class='add'>+TEST userdel --force ${NEW_USER}</div><div class='add'>+TEST groupdel ${NEW_USER}-${NEW_GID}</div><div class='add'>+cleanup</div><div class='add'>+#G_TESTDEF_TEST_STATUS_CENTOS6=BAD_TEST,BUG=000000</div><div class='add'>+#G_TESTDEF_TEST_STATUS_NETBSD7=BAD_TEST,BUG=000000</div><div class='head'>diff --git a/tests/bugs/replicate/bug-1448804-check-quorum-type-values.t b/tests/bugs/replicate/bug-1448804-check-quorum-type-values.t<br/>new file mode 100644<br/>index 00000000000..5bacf3edcfe<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/replicate/bug-1448804-check-quorum-type-values.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/replicate/bug-1448804-check-quorum-type-values.t</a></div><div class='hunk'>@@ -0,0 +1,47 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+. $(dirname $0)/../../afr.rc</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 replica 2 $H0:$B0/${V0}{0..1}</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+EXPECT 'Started' volinfo_field $V0 'Status'</div><div class='add'>+</div><div class='add'>+TEST glusterfs --volfile-id=$V0 --volfile-server=$H0 $M0;</div><div class='add'>+</div><div class='add'>+# Default quorum-type for replica 2 is none. quorum-count is zero but it is not displayed.</div><div class='add'>+EXPECT_WITHIN $CONFIG_UPDATE_TIMEOUT "none" get_quorum_type $M0 $V0 0</div><div class='add'>+cat $M0/.meta/graphs/active/$V0-replicate-0/private|grep quorum-count</div><div class='add'>+TEST [ $? -ne 0 ]</div><div class='add'>+</div><div class='add'>+# Convert to replica-3.</div><div class='add'>+TEST $CLI volume add-brick $V0 replica 3 $H0:$B0/${V0}2</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 2</div><div class='add'>+</div><div class='add'>+# Default quorum-type for replica 3 is auto. quorum-count is INT_MAX but it is not displayed.</div><div class='add'>+EXPECT_WITHIN $CONFIG_UPDATE_TIMEOUT "auto" get_quorum_type $M0 $V0 0</div><div class='add'>+cat $M0/.meta/graphs/active/$V0-replicate-0/private|grep quorum-count</div><div class='add'>+TEST [ $? -ne 0 ]</div><div class='add'>+</div><div class='add'>+# Change the type to fixed.</div><div class='add'>+TEST $CLI volume set $V0 cluster.quorum-type fixed</div><div class='add'>+# We haven't set quorum-count yet, so it takes the default value of zero in reconfigure() and hence the quorum-type is displayed as none.</div><div class='add'>+EXPECT_WITHIN $CONFIG_UPDATE_TIMEOUT "none" get_quorum_type $M0 $V0 0</div><div class='add'>+cat $M0/.meta/graphs/active/$V0-replicate-0/private|grep quorum-count</div><div class='add'>+TEST [ $? -ne 0 ]</div><div class='add'>+</div><div class='add'>+# set quorum-count and check.</div><div class='add'>+TEST $CLI volume set $V0 cluster.quorum-count 1</div><div class='add'>+EXPECT_WITHIN $CONFIG_UPDATE_TIMEOUT "fixed" get_quorum_type $M0 $V0 0</div><div class='add'>+EXPECT "1" echo `cat $M0/.meta/graphs/active/$V0-replicate-0/private|grep quorum-count|awk '{print $3}'`</div><div class='add'>+</div><div class='add'>+# reset to default values.</div><div class='add'>+TEST $CLI volume reset $V0 cluster.quorum-type</div><div class='add'>+EXPECT_WITHIN $CONFIG_UPDATE_TIMEOUT "auto" get_quorum_type $M0 $V0 0</div><div class='add'>+cat $M0/.meta/graphs/active/$V0-replicate-0/private|grep quorum-count</div><div class='add'>+TEST [ $? -ne 0 ]</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/replicate/bug-1473026.t b/tests/bugs/replicate/bug-1473026.t<br/>new file mode 100644<br/>index 00000000000..efb3ffa0d39<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/replicate/bug-1473026.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/replicate/bug-1473026.t</a></div><div class='hunk'>@@ -0,0 +1,31 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+#G_TESTDEF_TEST_STATUS_CENTOS6=KNOWN_ISSUE,BUG=1473026</div><div class='add'>+#G_TESTDEF_TEST_STATUS_NETBSD7=KNOWN_ISSUE,BUG=1473026</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 replica 3 $H0:$B0/${V0}{0,1,2}</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+</div><div class='add'>+#kill one brick (this has some issue)</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}1</div><div class='add'>+</div><div class='add'>+#kill the brick to be replaced</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}0</div><div class='add'>+</div><div class='add'>+# We know this command would fail because file system is read only now</div><div class='add'>+TEST ! $CLI volume replace-brick $V0 $H0:$B0/${V0}0 $H0:$B0/${V0}4 commit force</div><div class='add'>+</div><div class='add'>+TEST pkill glusterd</div><div class='add'>+</div><div class='add'>+# Glusterd should start but the volume info and brick volfiles don't match</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/replicate/bug-1477169-entry-selfheal-rename.t b/tests/bugs/replicate/bug-1477169-entry-selfheal-rename.t<br/>new file mode 100644<br/>index 00000000000..bb858a8a63d<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/replicate/bug-1477169-entry-selfheal-rename.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/replicate/bug-1477169-entry-selfheal-rename.t</a></div><div class='hunk'>@@ -0,0 +1,52 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 replica 3 $H0:$B0/${V0}{0,1,2}</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+TEST $GFS --volfile-id=$V0 --volfile-server=$H0 --attribute-timeout=0 --entry-timeout=0 $M0;</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status $V0 0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status $V0 1</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status $V0 2</div><div class='add'>+</div><div class='add'>+TEST mkdir -p $M0/d1/dir012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 $M0/d2</div><div class='add'>+gfid_d1=$(gf_get_gfid_xattr $B0/${V0}0/d1)</div><div class='add'>+gfid_d2=$(gf_get_gfid_xattr $B0/${V0}0/d2)</div><div class='add'>+gfid_dir=$(gf_get_gfid_xattr $B0/${V0}0/d1/dir012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789)</div><div class='add'>+</div><div class='add'>+gfid_str_d1=$(gf_gfid_xattr_to_str $gfid_d1)</div><div class='add'>+gfid_str_d2=$(gf_gfid_xattr_to_str $gfid_d2)</div><div class='add'>+gfid_str_d3=$(gf_gfid_xattr_to_str $gfid_dir)</div><div class='add'>+</div><div class='add'>+# Kill 3rd brick and rename the dir from mount.</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}2</div><div class='add'>+TEST mv $M0/d1/dir012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 $M0/d2</div><div class='add'>+</div><div class='add'>+# Bring it back and trigger heal.</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status $V0 2</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "Y" glustershd_up_status</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 1</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 2</div><div class='add'>+</div><div class='add'>+TEST $CLI volume heal $V0</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "^0$" get_pending_heal_count $V0</div><div class='add'>+</div><div class='add'>+# Check that .glusterfs symlink for dir exists and points to d2/dir012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789</div><div class='add'>+TEST linkname=$(readlink $B0/${V0}2/.glusterfs/${gfid_str_d3:0:2}/${gfid_str_d3:2:2}/$gfid_str_d3)</div><div class='add'>+EXPECT "dir012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789" basename $linkname</div><div class='add'>+TEST parent_dir_gfid_str=$(echo $linkname|cut -d / -f5)</div><div class='add'>+EXPECT $gfid_str_d2 echo $parent_dir_gfid_str</div><div class='add'>+</div><div class='add'>+TEST rmdir $M0/d2/dir012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789</div><div class='add'>+</div><div class='add'>+TEST ! stat $B0/${V0}0/.glusterfs/${gfid_str_d3:0:2}/${gfid_str_d3:2:2}/$gfid_str_d3</div><div class='add'>+TEST ! stat $B0/${V0}1/.glusterfs/${gfid_str_d3:0:2}/${gfid_str_d3:2:2}/$gfid_str_d3</div><div class='add'>+TEST ! stat $B0/${V0}2/.glusterfs/${gfid_str_d3:0:2}/${gfid_str_d3:2:2}/$gfid_str_d3</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/replicate/bug-1480525.t b/tests/bugs/replicate/bug-1480525.t<br/>new file mode 100644<br/>index 00000000000..7c63bb2e4ea<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/replicate/bug-1480525.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/replicate/bug-1480525.t</a></div><div class='hunk'>@@ -0,0 +1,18 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 replica 2 $H0:$B0/${V0}{0,1}</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+TEST $GFS --volfile-id=$V0 --volfile-server=$H0 $M0</div><div class='add'>+</div><div class='add'>+EXPECT_NOT "-1" echo `cat $M0/.meta/graphs/active/$V0-replicate-0/private|grep read_child |awk '{print $3}'`</div><div class='add'>+TEST $CLI volume set $V0 choose-local off</div><div class='add'>+EXPECT_WITHIN $CONFIG_UPDATE_TIMEOUT "-1" echo `cat $M0/.meta/graphs/active/$V0-replicate-0/private|grep read_child |awk '{print $3}'`</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/bugs/replicate/bug-1493415-gfid-heal.t b/tests/bugs/replicate/bug-1493415-gfid-heal.t<br/>new file mode 100644<br/>index 00000000000..8a79febf4b4<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/replicate/bug-1493415-gfid-heal.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/replicate/bug-1493415-gfid-heal.t</a></div><div class='hunk'>@@ -0,0 +1,78 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+. $(dirname $0)/../../afr.rc</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 replica 2 $H0:$B0/${V0}{0,1}</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+TEST $GFS --volfile-id=$V0 --volfile-server=$H0 --attribute-timeout=0 --entry-timeout=0 $M0;</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status $V0 0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status $V0 1</div><div class='add'>+TEST $CLI volume set $V0 self-heal-daemon off</div><div class='add'>+</div><div class='add'>+# Create base entry in indices/xattrop</div><div class='add'>+echo "Data" &gt; $M0/FILE</div><div class='add'>+</div><div class='add'>+#------------------------------------------------------------------------------#</div><div class='add'>+TEST touch $M0/f1</div><div class='add'>+gfid_f1=$(gf_get_gfid_xattr $B0/${V0}0/f1)</div><div class='add'>+gfid_str_f1=$(gf_gfid_xattr_to_str $gfid_f1)</div><div class='add'>+</div><div class='add'>+# Remove gfid xattr and .glusterfs hard link from 2nd brick. This simulates a</div><div class='add'>+# brick crash at the point where file got created but no xattrs were set.</div><div class='add'>+TEST setfattr -x trusted.gfid $B0/${V0}1/f1</div><div class='add'>+TEST rm $B0/${V0}1/.glusterfs/${gfid_str_f1:0:2}/${gfid_str_f1:2:2}/$gfid_str_f1</div><div class='add'>+</div><div class='add'>+# storage/posix considers that a file without gfid changed less than a second</div><div class='add'>+# before doesn't exist, so we need to wait for a second to force posix to</div><div class='add'>+# consider that this is a valid file but without gfid.</div><div class='add'>+sleep 2</div><div class='add'>+</div><div class='add'>+# Assume there were no pending xattrs on parent dir due to 1st brick crashing</div><div class='add'>+# too. Then name heal from client must heal the gfid.</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+TEST $GFS --volfile-id=$V0 --volfile-server=$H0 --attribute-timeout=0 --entry-timeout=0 $M0;</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status $V0 0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status $V0 1</div><div class='add'>+TEST stat $M0/f1</div><div class='add'>+EXPECT "$gfid_f1" gf_get_gfid_xattr $B0/${V0}1/f1</div><div class='add'>+TEST stat $B0/${V0}1/.glusterfs/${gfid_str_f1:0:2}/${gfid_str_f1:2:2}/$gfid_str_f1</div><div class='add'>+</div><div class='add'>+#------------------------------------------------------------------------------#</div><div class='add'>+TEST mkdir $M0/dir</div><div class='add'>+TEST touch $M0/dir/f2</div><div class='add'>+gfid_f2=$(gf_get_gfid_xattr $B0/${V0}0/dir/f2)</div><div class='add'>+gfid_str_f2=$(gf_gfid_xattr_to_str $gfid_f2)</div><div class='add'>+</div><div class='add'>+# Remove gfid xattr and .glusterfs hard link from 2nd brick. This simulates a</div><div class='add'>+# brick crash at the point where file got created but no xattrs were set.</div><div class='add'>+TEST setfattr -x trusted.gfid $B0/${V0}1/dir/f2</div><div class='add'>+TEST rm $B0/${V0}1/.glusterfs/${gfid_str_f2:0:2}/${gfid_str_f2:2:2}/$gfid_str_f2</div><div class='add'>+</div><div class='add'>+#Now simulate setting of pending entry xattr on parent dir of 1st brick.</div><div class='add'>+TEST setfattr -n trusted.afr.$V0-client-1 -v 0x000000000000000000000001 $B0/${V0}0/dir</div><div class='add'>+create_brick_xattrop_entry $B0/${V0}0 dir</div><div class='add'>+</div><div class='add'>+# storage/posix considers that a file without gfid changed less than a second</div><div class='add'>+# before doesn't exist, so we need to wait for a second to force posix to</div><div class='add'>+# consider that this is a valid file but without gfid.</div><div class='add'>+sleep 2</div><div class='add'>+</div><div class='add'>+#Trigger entry-heal via shd</div><div class='add'>+TEST $CLI volume set $V0 self-heal-daemon on</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "Y" glustershd_up_status</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 1</div><div class='add'>+</div><div class='add'>+TEST $CLI volume heal $V0</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "^0$" get_pending_heal_count $V0</div><div class='add'>+</div><div class='add'>+EXPECT "$gfid_f2" gf_get_gfid_xattr $B0/${V0}1/dir/f2</div><div class='add'>+TEST stat $B0/${V0}1/.glusterfs/${gfid_str_f2:0:2}/${gfid_str_f2:2:2}/$gfid_str_f2</div><div class='add'>+</div><div class='add'>+#------------------------------------------------------------------------------#</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/replicate/bug-1498570-client-iot-graph-check.t b/tests/bugs/replicate/bug-1498570-client-iot-graph-check.t<br/>new file mode 100644<br/>index 00000000000..2b3b3040228<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/replicate/bug-1498570-client-iot-graph-check.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/replicate/bug-1498570-client-iot-graph-check.t</a></div><div class='hunk'>@@ -0,0 +1,48 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+. $(dirname $0)/../../afr.rc</div><div class='add'>+</div><div class='add'>+TESTS_EXPECTED_IN_LOOP=21</div><div class='add'>+function reset_cluster</div><div class='add'>+{</div><div class='add'>+        cleanup</div><div class='add'>+        TEST glusterd</div><div class='add'>+        TEST pidof glusterd</div><div class='add'>+</div><div class='add'>+}</div><div class='add'>+function check_iot_option</div><div class='add'>+{</div><div class='add'>+        local enabled=$1</div><div class='add'>+        local is_loaded_in_graph=$2</div><div class='add'>+</div><div class='add'>+        EXPECT "$enabled" volume_get_field $V0 client-io-threads</div><div class='add'>+        IOT_STRING="volume\ $V0-io-threads"</div><div class='add'>+        grep "$IOT_STRING" $GLUSTERD_WORKDIR/vols/$V0/trusted-$V0.tcp-fuse.vol</div><div class='add'>+        TEST ret=$?</div><div class='add'>+        EXPECT_NOT "$is_loaded_in_graph" echo $ret</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+reset_cluster</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/${V0}{0,1}</div><div class='add'>+check_iot_option on 1</div><div class='add'>+</div><div class='add'>+reset_cluster</div><div class='add'>+TEST $CLI volume create $V0 replica 2 $H0:$B0/${V0}{0,1}</div><div class='add'>+check_iot_option off 0</div><div class='add'>+</div><div class='add'>+reset_cluster</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/${V0}0</div><div class='add'>+TEST $CLI volume add-brick $V0 replica 2 $H0:$B0/${V0}1</div><div class='add'>+check_iot_option off 0</div><div class='add'>+TEST $CLI volume remove-brick $V0 replica 1 $H0:$B0/${V0}1 force</div><div class='add'>+check_iot_option on 1</div><div class='add'>+</div><div class='add'>+reset_cluster</div><div class='add'>+TEST $CLI volume create $V0 replica 3 $H0:$B0/${V0}{0..5}</div><div class='add'>+TEST $CLI volume set $V0 client-io-threads on</div><div class='add'>+check_iot_option on 1</div><div class='add'>+TEST $CLI volume remove-brick $V0 replica 2 $H0:$B0/${V0}2 $H0:$B0/${V0}5 force</div><div class='add'>+check_iot_option on 1</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/bugs/replicate/bug-1539358-split-brain-detection.t b/tests/bugs/replicate/bug-1539358-split-brain-detection.t<br/>new file mode 100755<br/>index 00000000000..7b71a7a9e7d<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/replicate/bug-1539358-split-brain-detection.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/replicate/bug-1539358-split-brain-detection.t</a></div><div class='hunk'>@@ -0,0 +1,89 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+. $(dirname $0)/../../afr.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+## Start and create a volume</div><div class='add'>+TEST glusterd;</div><div class='add'>+TEST pidof glusterd;</div><div class='add'>+TEST $CLI volume info;</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 replica 3 $H0:$B0/${V0}{0,1,2};</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+EXPECT 'Started' volinfo_field $V0 'Status';</div><div class='add'>+TEST $CLI volume set $V0 self-heal-daemon off</div><div class='add'>+TEST glusterfs --volfile-id=/$V0 --volfile-server=$H0 $M0 --attribute-timeout=0 --entry-timeout=0</div><div class='add'>+</div><div class='add'>+###############################################################################yy</div><div class='add'>+# Case of 2 bricks blaming the third and the third blaming the other two.</div><div class='add'>+</div><div class='add'>+TEST `echo "hello" &gt;&gt; $M0/file`</div><div class='add'>+</div><div class='add'>+# B0 and B2 must blame B1</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/$V0"1"</div><div class='add'>+TEST `echo "append" &gt;&gt; $M0/file`</div><div class='add'>+EXPECT "00000001" afr_get_specific_changelog_xattr $B0/${V0}0/file trusted.afr.$V0-client-1 data</div><div class='add'>+EXPECT "00000001" afr_get_specific_changelog_xattr $B0/${V0}2/file trusted.afr.$V0-client-1 data</div><div class='add'>+CLIENT_MD5=$(md5sum $M0/file | cut -d\  -f1)</div><div class='add'>+</div><div class='add'>+# B1 must blame B0 and B2</div><div class='add'>+setfattr -n trusted.afr.$V0-client-0 -v 0x000000010000000000000000 $B0/$V0"1"/file</div><div class='add'>+setfattr -n trusted.afr.$V0-client-2 -v 0x000000010000000000000000 $B0/$V0"1"/file</div><div class='add'>+</div><div class='add'>+# Launch heal</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status $V0 $H0 $B0/${V0}1</div><div class='add'>+TEST $CLI volume set $V0 self-heal-daemon on</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "Y" glustershd_up_status</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 1</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 2</div><div class='add'>+TEST $CLI volume heal $V0</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "^0$" get_pending_heal_count $V0</div><div class='add'>+B0_MD5=$(md5sum $B0/${V0}0/file | cut -d\  -f1)</div><div class='add'>+B1_MD5=$(md5sum $B0/${V0}1/file | cut -d\  -f1)</div><div class='add'>+B2_MD5=$(md5sum $B0/${V0}2/file | cut -d\  -f1)</div><div class='add'>+TEST [ "$CLIENT_MD5" == "$B0_MD5" ]</div><div class='add'>+TEST [ "$CLIENT_MD5" == "$B1_MD5" ]</div><div class='add'>+TEST [ "$CLIENT_MD5" == "$B2_MD5" ]</div><div class='add'>+</div><div class='add'>+TEST rm $M0/file</div><div class='add'>+</div><div class='add'>+###############################################################################yy</div><div class='add'>+# Case of each brick blaming the next one in a cyclic manner</div><div class='add'>+</div><div class='add'>+TEST `echo "hello" &gt;&gt; $M0/file`</div><div class='add'>+# Mark cyclic xattrs and modify file content directly on the bricks.</div><div class='add'>+TEST $CLI volume set $V0 self-heal-daemon off</div><div class='add'>+setfattr -n trusted.afr.$V0-client-1 -v 0x000000010000000000000000 $B0/$V0"0"/file</div><div class='add'>+setfattr -n trusted.afr.dirty -v 0x000000010000000000000000 $B0/$V0"0"/file</div><div class='add'>+setfattr -n trusted.afr.$V0-client-2 -v 0x000000010000000000000000 $B0/$V0"1"/file</div><div class='add'>+setfattr -n trusted.afr.dirty -v 0x000000010000000000000000 $B0/$V0"1"/file</div><div class='add'>+setfattr -n trusted.afr.$V0-client-0 -v 0x000000010000000000000000 $B0/$V0"2"/file</div><div class='add'>+setfattr -n trusted.afr.dirty -v 0x000000010000000000000000 $B0/$V0"2"/file</div><div class='add'>+</div><div class='add'>+TEST `echo "ab" &gt;&gt; $B0/$V0"0"/file`</div><div class='add'>+TEST `echo "cdef" &gt;&gt; $B0/$V0"1"/file`</div><div class='add'>+TEST `echo "ghi" &gt;&gt; $B0/$V0"2"/file`</div><div class='add'>+</div><div class='add'>+# Add entry to xattrop dir to trigger index heal.</div><div class='add'>+xattrop_dir0=$(afr_get_index_path $B0/$V0"0")</div><div class='add'>+base_entry_b0=`ls $xattrop_dir0`</div><div class='add'>+gfid_str=$(gf_gfid_xattr_to_str $(gf_get_gfid_xattr $B0/$V0"0"/file))</div><div class='add'>+ln $xattrop_dir0/$base_entry_b0 $xattrop_dir0/$gfid_str</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "^1$" get_pending_heal_count $V0</div><div class='add'>+</div><div class='add'>+# Launch heal</div><div class='add'>+TEST $CLI volume set $V0 self-heal-daemon on</div><div class='add'>+TEST $CLI volume heal $V0</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "^0$" get_pending_heal_count $V0</div><div class='add'>+B0_MD5=$(md5sum $B0/${V0}0/file | cut -d\  -f1)</div><div class='add'>+B1_MD5=$(md5sum $B0/${V0}1/file | cut -d\  -f1)</div><div class='add'>+B2_MD5=$(md5sum $B0/${V0}2/file | cut -d\  -f1)</div><div class='add'>+TEST [ "$B0_MD5" == "$B1_MD5" ]</div><div class='add'>+TEST [ "$B0_MD5" == "$B2_MD5" ]</div><div class='add'>+###############################################################################yy</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/bugs/replicate/bug-1561129-enospc.t b/tests/bugs/replicate/bug-1561129-enospc.t<br/>new file mode 100644<br/>index 00000000000..1b402fcc781<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/replicate/bug-1561129-enospc.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/replicate/bug-1561129-enospc.t</a></div><div class='hunk'>@@ -0,0 +1,24 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+#Tests that sequential write workload doesn't lead to FSYNCs</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST truncate -s 128M $B0/xfs_image</div><div class='add'>+TEST mkfs.xfs -f $B0/xfs_image</div><div class='add'>+TEST mkdir $B0/bricks</div><div class='add'>+TEST mount -t xfs -o loop $B0/xfs_image $B0/bricks</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 replica 3 $H0:$B0/bricks/brick{0,1,3}</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+TEST $GFS --volfile-id=$V0 --volfile-server=$H0 $M0;</div><div class='add'>+</div><div class='add'>+# Write 50MB of data, which will try to consume 50x3=150MB on $B0/bricks.</div><div class='add'>+# Before that, we hit ENOSPC in pre-op cbk, which should not crash the mount.</div><div class='add'>+TEST ! dd if=/dev/zero of=$M0/a bs=1M count=50</div><div class='add'>+TEST stat $M0/a</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/replicate/bug-1586020-mark-dirty-for-entry-txn-on-quorum-failure.t b/tests/bugs/replicate/bug-1586020-mark-dirty-for-entry-txn-on-quorum-failure.t<br/>new file mode 100644<br/>index 00000000000..49c4dea4e9c<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/replicate/bug-1586020-mark-dirty-for-entry-txn-on-quorum-failure.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/replicate/bug-1586020-mark-dirty-for-entry-txn-on-quorum-failure.t</a></div><div class='hunk'>@@ -0,0 +1,72 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+function create_files {</div><div class='add'>+        local i=1</div><div class='add'>+        while (true)</div><div class='add'>+        do</div><div class='add'>+                dd if=/dev/zero of=$M0/file$i bs=1M count=10</div><div class='add'>+                if [ -e $B0/${V0}0/file$i ] || [ -e $B0/${V0}1/file$i ]; then</div><div class='add'>+                        ((i++))</div><div class='add'>+                else</div><div class='add'>+                        break</div><div class='add'>+                fi</div><div class='add'>+        done</div><div class='add'>+        echo $i</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+</div><div class='add'>+#Create brick partitions</div><div class='add'>+TEST truncate -s 100M $B0/brick0</div><div class='add'>+TEST truncate -s 100M $B0/brick1</div><div class='add'>+#Have the 3rd brick of a higher size to test the scenario of entry transaction</div><div class='add'>+#passing on only one brick and not on other bricks.</div><div class='add'>+TEST truncate -s 110M $B0/brick2</div><div class='add'>+LO1=`SETUP_LOOP $B0/brick0`</div><div class='add'>+TEST [ $? -eq 0 ]</div><div class='add'>+TEST MKFS_LOOP $LO1</div><div class='add'>+LO2=`SETUP_LOOP $B0/brick1`</div><div class='add'>+TEST [ $? -eq 0 ]</div><div class='add'>+TEST MKFS_LOOP $LO2</div><div class='add'>+LO3=`SETUP_LOOP $B0/brick2`</div><div class='add'>+TEST [ $? -eq 0 ]</div><div class='add'>+TEST MKFS_LOOP $LO3</div><div class='add'>+TEST mkdir -p $B0/${V0}0 $B0/${V0}1 $B0/${V0}2</div><div class='add'>+TEST MOUNT_LOOP $LO1 $B0/${V0}0</div><div class='add'>+TEST MOUNT_LOOP $LO2 $B0/${V0}1</div><div class='add'>+TEST MOUNT_LOOP $LO3 $B0/${V0}2</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 replica 3 $H0:$B0/${V0}{0,1,2}</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+TEST $CLI volume set $V0 performance.write-behind off</div><div class='add'>+TEST $CLI volume set $V0 self-heal-daemon off</div><div class='add'>+TEST $GFS --volfile-server=$H0 --volfile-id=$V0 $M0</div><div class='add'>+</div><div class='add'>+i=$(create_files)</div><div class='add'>+TEST ! ls $B0/${V0}0/file$i</div><div class='add'>+TEST ! ls $B0/${V0}1/file$i</div><div class='add'>+TEST ls $B0/${V0}2/file$i</div><div class='add'>+dirty=$(get_hex_xattr trusted.afr.dirty $B0/${V0}2)</div><div class='add'>+TEST [ "$dirty" != "000000000000000000000000" ]</div><div class='add'>+</div><div class='add'>+TEST $CLI volume set $V0 self-heal-daemon on</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "Y" glustershd_up_status</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 1</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 2</div><div class='add'>+TEST rm -f $M0/file1</div><div class='add'>+</div><div class='add'>+TEST $CLI volume heal $V0</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "0" get_pending_heal_count $V0</div><div class='add'>+TEST force_umount $M0</div><div class='add'>+TEST $CLI volume stop $V0</div><div class='add'>+EXPECT 'Stopped' volinfo_field $V0 'Status';</div><div class='add'>+TEST $CLI volume delete $V0;</div><div class='add'>+UMOUNT_LOOP ${B0}/${V0}{0,1,2}</div><div class='add'>+rm -f ${B0}/brick{0,1,2}</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/replicate/bug-1591193-assign-gfid-and-heal.t b/tests/bugs/replicate/bug-1591193-assign-gfid-and-heal.t<br/>new file mode 100644<br/>index 00000000000..c6e5459e9a8<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/replicate/bug-1591193-assign-gfid-and-heal.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/replicate/bug-1591193-assign-gfid-and-heal.t</a></div><div class='hunk'>@@ -0,0 +1,128 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+. $(dirname $0)/../../afr.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+function check_gfid_and_link_count</div><div class='add'>+{</div><div class='add'>+        local file=$1</div><div class='add'>+</div><div class='add'>+        file_gfid_b0=$(gf_get_gfid_xattr $B0/${V0}0/$file)</div><div class='add'>+        TEST [ ! -z $file_gfid_b0 ]</div><div class='add'>+        file_gfid_b1=$(gf_get_gfid_xattr $B0/${V0}1/$file)</div><div class='add'>+        file_gfid_b2=$(gf_get_gfid_xattr $B0/${V0}2/$file)</div><div class='add'>+        EXPECT $file_gfid_b0 echo $file_gfid_b1</div><div class='add'>+        EXPECT $file_gfid_b0 echo $file_gfid_b2</div><div class='add'>+</div><div class='add'>+        EXPECT "2" stat -c %h $B0/${V0}0/$file</div><div class='add'>+        EXPECT "2" stat -c %h $B0/${V0}1/$file</div><div class='add'>+        EXPECT "2" stat -c %h $B0/${V0}2/$file</div><div class='add'>+}</div><div class='add'>+TESTS_EXPECTED_IN_LOOP=30</div><div class='add'>+</div><div class='add'>+##############################################################################</div><div class='add'>+# Test on 1x3 volume</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 replica 3 $H0:$B0/${V0}{0,1,2};</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status $V0 $H0 $B0/${V0}0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status $V0 $H0 $B0/${V0}1</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status $V0 $H0 $B0/${V0}2</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "Y" glustershd_up_status</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 1</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 2</div><div class='add'>+</div><div class='add'>+TEST glusterfs --volfile-id=/$V0 --volfile-server=$H0 --attribute-timeout=0 --entry-timeout=0 $M0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 1</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 2</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+# Create files directly in the backend on different bricks</div><div class='add'>+echo $RANDOM &gt;&gt; $B0/${V0}0/file1</div><div class='add'>+echo $RANDOM &gt;&gt; $B0/${V0}1/file2</div><div class='add'>+echo $RANDOM &gt;&gt; $B0/${V0}2/file3</div><div class='add'>+</div><div class='add'>+# To prevent is_fresh_file code path</div><div class='add'>+sleep 2</div><div class='add'>+</div><div class='add'>+# Access them from mount to trigger name + gfid heal.</div><div class='add'>+TEST stat $M0/file1</div><div class='add'>+TEST stat $M0/file2</div><div class='add'>+TEST stat $M0/file3</div><div class='add'>+</div><div class='add'>+# Launch index heal to complete any pending data/metadata heals.</div><div class='add'>+TEST $CLI volume heal $V0</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "^0$" get_pending_heal_count $V0</div><div class='add'>+</div><div class='add'>+# Check each file has a gfid and the .glusterfs hardlink</div><div class='add'>+check_gfid_and_link_count file1</div><div class='add'>+check_gfid_and_link_count file2</div><div class='add'>+check_gfid_and_link_count file3</div><div class='add'>+</div><div class='add'>+TEST rm $M0/file1</div><div class='add'>+TEST rm $M0/file2</div><div class='add'>+TEST rm $M0/file3</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+##############################################################################</div><div class='add'>+# Test on 1x (2+1) volume</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 replica 3 arbiter 1 $H0:$B0/${V0}{0,1,2};</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status $V0 $H0 $B0/${V0}0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status $V0 $H0 $B0/${V0}1</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status $V0 $H0 $B0/${V0}2</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "Y" glustershd_up_status</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 1</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 2</div><div class='add'>+</div><div class='add'>+TEST glusterfs --volfile-id=/$V0 --volfile-server=$H0 --attribute-timeout=0 --entry-timeout=0 $M0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 1</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 2</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+# Create files directly in the backend on different bricks</div><div class='add'>+echo $RANDOM &gt;&gt; $B0/${V0}0/file1</div><div class='add'>+echo $RANDOM &gt;&gt; $B0/${V0}1/file2</div><div class='add'>+touch $B0/${V0}2/file3</div><div class='add'>+</div><div class='add'>+# To prevent is_fresh_file code path</div><div class='add'>+sleep 2</div><div class='add'>+</div><div class='add'>+# Access them from mount to trigger name + gfid heal.</div><div class='add'>+TEST stat $M0/file1</div><div class='add'>+TEST stat $M0/file2</div><div class='add'>+</div><div class='add'>+# Though file is created on all 3 bricks, lookup will fail as arbiter blames the</div><div class='add'>+# other 2 bricks and ariter is not 'readable'.</div><div class='add'>+TEST ! stat $M0/file3</div><div class='add'>+</div><div class='add'>+# Launch index heal to complete any pending data/metadata heals.</div><div class='add'>+TEST $CLI volume heal $V0</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "^0$" get_pending_heal_count $V0</div><div class='add'>+</div><div class='add'>+# Now file3 should be accesible from mount.</div><div class='add'>+TEST stat $M0/file3</div><div class='add'>+</div><div class='add'>+# Check each file has a gfid and the .glusterfs hardlink</div><div class='add'>+check_gfid_and_link_count file1</div><div class='add'>+check_gfid_and_link_count file2</div><div class='add'>+check_gfid_and_link_count file3</div><div class='add'>+</div><div class='add'>+TEST rm $M0/file1</div><div class='add'>+TEST rm $M0/file2</div><div class='add'>+TEST rm $M0/file3</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/replicate/bug-1626994-info-split-brain.t b/tests/bugs/replicate/bug-1626994-info-split-brain.t<br/>new file mode 100644<br/>index 00000000000..86bfecb1a9e<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/replicate/bug-1626994-info-split-brain.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/replicate/bug-1626994-info-split-brain.t</a></div><div class='hunk'>@@ -0,0 +1,62 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+. $(dirname $0)/../../afr.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+# Test to check dirs having dirty xattr do not show up in info split-brain.</div><div class='add'>+</div><div class='add'>+TEST glusterd;</div><div class='add'>+TEST pidof glusterd;</div><div class='add'>+TEST $CLI volume create $V0 replica 3 $H0:$B0/${V0}{0,1,2};</div><div class='add'>+TEST $CLI volume set $V0 self-heal-daemon off</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+EXPECT 'Started' volinfo_field $V0 'Status';</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status $V0 $H0 $B0/${V0}0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status $V0 $H0 $B0/${V0}1</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status $V0 $H0 $B0/${V0}2</div><div class='add'>+TEST $GFS --volfile-id=/$V0 --volfile-server=$H0 $M0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 1</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 2</div><div class='add'>+</div><div class='add'>+# Create base entry in indices/xattrop</div><div class='add'>+echo "Data" &gt; $M0/FILE</div><div class='add'>+rm -f $M0/FILE</div><div class='add'>+EXPECT "1" count_index_entries $B0/${V0}0</div><div class='add'>+EXPECT "1" count_index_entries $B0/${V0}1</div><div class='add'>+EXPECT "1" count_index_entries $B0/${V0}2</div><div class='add'>+</div><div class='add'>+TEST mkdir $M0/dirty_dir</div><div class='add'>+TEST mkdir $M0/pending_dir</div><div class='add'>+</div><div class='add'>+# Set dirty xattrs on all bricks to simulate the case where entry transaction</div><div class='add'>+# succeeded only the pre-op phase.</div><div class='add'>+TEST setfattr -n trusted.afr.dirty -v 0x000000000000000000000001 $B0/${V0}0/dirty_dir</div><div class='add'>+TEST setfattr -n trusted.afr.dirty -v 0x000000000000000000000001 $B0/${V0}1/dirty_dir</div><div class='add'>+TEST setfattr -n trusted.afr.dirty -v 0x000000000000000000000001 $B0/${V0}2/dirty_dir</div><div class='add'>+create_brick_xattrop_entry $B0/${V0}0  dirty_dir</div><div class='add'>+# Should not show up as split-brain.</div><div class='add'>+EXPECT "0" afr_get_split_brain_count $V0</div><div class='add'>+</div><div class='add'>+# replace/reset brick case where the new brick has dirty and the other 2 bricks</div><div class='add'>+# blame it should not be reported as split-brain.</div><div class='add'>+TEST setfattr -n trusted.afr.$V0-client-2 -v 0x000000000000000000000001 $B0/${V0}0</div><div class='add'>+TEST setfattr -n trusted.afr.$V0-client-2 -v 0x000000000000000000000001 $B0/${V0}1</div><div class='add'>+TEST setfattr -n trusted.afr.dirty -v 0x000000000000000000000001 $B0/${V0}2</div><div class='add'>+create_brick_xattrop_entry $B0/${V0}0 "/"</div><div class='add'>+# Should not show up as split-brain.</div><div class='add'>+EXPECT "0" afr_get_split_brain_count $V0</div><div class='add'>+</div><div class='add'>+# Set pending xattrs on all bricks blaming each other to simulate the case of</div><div class='add'>+# entry split-brain.</div><div class='add'>+TEST setfattr -n trusted.afr.$V0-client-1 -v 0x000000000000000000000001 $B0/${V0}0/pending_dir</div><div class='add'>+TEST setfattr -n trusted.afr.$V0-client-2 -v 0x000000000000000000000001 $B0/${V0}1/pending_dir</div><div class='add'>+TEST setfattr -n trusted.afr.$V0-client-0 -v 0x000000000000000000000001 $B0/${V0}2/pending_dir</div><div class='add'>+create_brick_xattrop_entry $B0/${V0}0 pending_dir</div><div class='add'>+# Should show up as split-brain.</div><div class='add'>+EXPECT "1" afr_get_split_brain_count $V0</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/replicate/bug-1637249-gfid-heal.t b/tests/bugs/replicate/bug-1637249-gfid-heal.t<br/>new file mode 100644<br/>index 00000000000..e824f14531e<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/replicate/bug-1637249-gfid-heal.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/replicate/bug-1637249-gfid-heal.t</a></div><div class='hunk'>@@ -0,0 +1,149 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+. $(dirname $0)/../../afr.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd;</div><div class='add'>+TEST pidof glusterd;</div><div class='add'>+TEST $CLI volume create $V0 replica 2 $H0:$B0/${V0}{0,1};</div><div class='add'>+TEST $CLI volume set $V0 self-heal-daemon off</div><div class='add'>+TEST $CLI volume set $V0 entry-self-heal off</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status $V0 $H0 $B0/${V0}0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status $V0 $H0 $B0/${V0}1</div><div class='add'>+</div><div class='add'>+TEST $GFS --volfile-id=/$V0 --volfile-server=$H0 --attribute-timeout=0 --entry-timeout=0 $M0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 1</div><div class='add'>+</div><div class='add'>+###############################################################################</div><div class='add'>+</div><div class='add'>+# Test for gfid + name heal when there is no 'source' brick, i.e. parent dir</div><div class='add'>+# xattrs are in split-brain or have dirty xattrs.</div><div class='add'>+</div><div class='add'>+TEST mkdir $M0/dir_pending</div><div class='add'>+TEST dd if=/dev/urandom of=$M0/dir_pending/file1 bs=1024 count=1024</div><div class='add'>+TEST mkdir $M0/dir_pending/dir11</div><div class='add'>+TEST mkdir $M0/dir_dirty</div><div class='add'>+TEST touch $M0/dir_dirty/file2</div><div class='add'>+</div><div class='add'>+# Set pending entry xattrs on dir_pending and remove gfid of entries under it on one brick.</div><div class='add'>+TEST setfattr -n trusted.afr.$V0-client-1 -v 0x000000000000000000000001 $B0/${V0}0/dir_pending</div><div class='add'>+TEST setfattr -n trusted.afr.$V0-client-0 -v 0x000000000000000000000001 $B0/${V0}1/dir_pending</div><div class='add'>+</div><div class='add'>+gfid_f1=$(gf_get_gfid_xattr $B0/${V0}0/dir_pending/file1)</div><div class='add'>+gfid_str_f1=$(gf_gfid_xattr_to_str $gfid_f1)</div><div class='add'>+TEST setfattr -x trusted.gfid $B0/${V0}1/dir_pending/file1</div><div class='add'>+TEST rm $B0/${V0}1/.glusterfs/${gfid_str_f1:0:2}/${gfid_str_f1:2:2}/$gfid_str_f1</div><div class='add'>+</div><div class='add'>+gfid_d11=$(gf_get_gfid_xattr $B0/${V0}0/dir_pending/dir11)</div><div class='add'>+gfid_str_d11=$(gf_gfid_xattr_to_str $gfid_d11)</div><div class='add'>+TEST setfattr -x trusted.gfid $B0/${V0}1/dir_pending/dir11</div><div class='add'>+TEST rm $B0/${V0}1/.glusterfs/${gfid_str_d11:0:2}/${gfid_str_d11:2:2}/$gfid_str_d11</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+# Set dirty entry xattrs on dir_dirty and remove gfid of entries under it on one brick.</div><div class='add'>+TEST setfattr -n trusted.afr.dirty -v 0x000000000000000000000001 $B0/${V0}1/dir_dirty</div><div class='add'>+gfid_f2=$(gf_get_gfid_xattr $B0/${V0}0/dir_dirty/file2)</div><div class='add'>+gfid_str_f2=$(gf_gfid_xattr_to_str $gfid_f2)</div><div class='add'>+TEST setfattr -x trusted.gfid $B0/${V0}1/dir_dirty/file2</div><div class='add'>+TEST rm $B0/${V0}1/.glusterfs/${gfid_str_f2:0:2}/${gfid_str_f2:2:2}/$gfid_str_f2</div><div class='add'>+</div><div class='add'>+# Create a file under dir_pending directly on the backend only on 1 brick</div><div class='add'>+TEST touch $B0/${V0}1/dir_pending/file3</div><div class='add'>+</div><div class='add'>+# Create a file under dir_pending directly on the backend on all bricks</div><div class='add'>+TEST touch $B0/${V0}0/dir_pending/file4</div><div class='add'>+TEST touch $B0/${V0}1/dir_pending/file4</div><div class='add'>+</div><div class='add'>+# Stop  &amp; start the volume and mount client again.</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+TEST $CLI volume stop  $V0</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status $V0 $H0 $B0/${V0}0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status $V0 $H0 $B0/${V0}1</div><div class='add'>+TEST $GFS --volfile-id=/$V0 --volfile-server=$H0 --attribute-timeout=0 --entry-timeout=0 $M0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 1</div><div class='add'>+</div><div class='add'>+TEST stat $M0/dir_pending/file1</div><div class='add'>+EXPECT "$gfid_f1" gf_get_gfid_xattr $B0/${V0}1/dir_pending/file1</div><div class='add'>+TEST stat $B0/${V0}1/.glusterfs/${gfid_str_f1:0:2}/${gfid_str_f1:2:2}/$gfid_str_f1</div><div class='add'>+</div><div class='add'>+TEST stat $M0/dir_pending/dir11</div><div class='add'>+EXPECT "$gfid_d11" gf_get_gfid_xattr $B0/${V0}1/dir_pending/dir11</div><div class='add'>+TEST stat $B0/${V0}1/.glusterfs/${gfid_str_d11:0:2}/${gfid_str_d11:2:2}/$gfid_str_d11</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+TEST stat $M0/dir_dirty/file2</div><div class='add'>+EXPECT "$gfid_f2" gf_get_gfid_xattr $B0/${V0}1/dir_dirty/file2</div><div class='add'>+TEST stat $B0/${V0}1/.glusterfs/${gfid_str_f2:0:2}/${gfid_str_f2:2:2}/$gfid_str_f2</div><div class='add'>+</div><div class='add'>+TEST stat $M0/dir_pending/file3 # This assigns gfid on 2nd brick and heals the entry on to the 1st brick.</div><div class='add'>+gfid_f3=$(gf_get_gfid_xattr $B0/${V0}1/dir_pending/file3)</div><div class='add'>+TEST [ ! -z "$gfid_f3" ]</div><div class='add'>+EXPECT "$gfid_f3" gf_get_gfid_xattr $B0/${V0}0/dir_pending/file3</div><div class='add'>+</div><div class='add'>+TEST stat $M0/dir_pending/file4</div><div class='add'>+gfid_f4=$(gf_get_gfid_xattr $B0/${V0}0/dir_pending/file4)</div><div class='add'>+TEST [ ! -z "$gfid_f4" ]</div><div class='add'>+EXPECT "$gfid_f4" gf_get_gfid_xattr $B0/${V0}1/dir_pending/file4</div><div class='add'>+###############################################################################</div><div class='add'>+</div><div class='add'>+# Test for gfid + name heal when all bricks are 'source', i.e. parent dir</div><div class='add'>+# does not have any pending or dirty xattrs.</div><div class='add'>+</div><div class='add'>+TEST mkdir $M0/dir_clean</div><div class='add'>+TEST dd if=/dev/urandom of=$M0/dir_clean/file1 bs=1024 count=1024</div><div class='add'>+TEST mkdir $M0/dir_clean/dir11</div><div class='add'>+</div><div class='add'>+gfid_f1=$(gf_get_gfid_xattr $B0/${V0}0/dir_clean/file1)</div><div class='add'>+gfid_str_f1=$(gf_gfid_xattr_to_str $gfid_f1)</div><div class='add'>+TEST setfattr -x trusted.gfid $B0/${V0}1/dir_clean/file1</div><div class='add'>+TEST rm $B0/${V0}1/.glusterfs/${gfid_str_f1:0:2}/${gfid_str_f1:2:2}/$gfid_str_f1</div><div class='add'>+</div><div class='add'>+gfid_d11=$(gf_get_gfid_xattr $B0/${V0}0/dir_clean/dir11)</div><div class='add'>+gfid_str_d11=$(gf_gfid_xattr_to_str $gfid_d11)</div><div class='add'>+TEST setfattr -x trusted.gfid $B0/${V0}1/dir_clean/dir11</div><div class='add'>+TEST rm $B0/${V0}1/.glusterfs/${gfid_str_d11:0:2}/${gfid_str_d11:2:2}/$gfid_str_d11</div><div class='add'>+</div><div class='add'>+# Create a file under dir_clean directly on the backend only on 1 brick</div><div class='add'>+TEST touch $B0/${V0}1/dir_clean/file3</div><div class='add'>+</div><div class='add'>+# Create a file under dir_clean directly on the backend on all bricks</div><div class='add'>+TEST touch $B0/${V0}0/dir_clean/file4</div><div class='add'>+TEST touch $B0/${V0}1/dir_clean/file4</div><div class='add'>+</div><div class='add'>+# Stop  &amp; start the volume and mount client again.</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+TEST $CLI volume stop  $V0</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status $V0 $H0 $B0/${V0}0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status $V0 $H0 $B0/${V0}1</div><div class='add'>+TEST $GFS --volfile-id=/$V0 --volfile-server=$H0 --attribute-timeout=0 --entry-timeout=0 $M0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 1</div><div class='add'>+</div><div class='add'>+TEST stat $M0/dir_clean/file1</div><div class='add'>+EXPECT "$gfid_f1" gf_get_gfid_xattr $B0/${V0}1/dir_clean/file1</div><div class='add'>+TEST stat $B0/${V0}1/.glusterfs/${gfid_str_f1:0:2}/${gfid_str_f1:2:2}/$gfid_str_f1</div><div class='add'>+</div><div class='add'>+TEST stat $M0/dir_clean/dir11</div><div class='add'>+EXPECT "$gfid_d11" gf_get_gfid_xattr $B0/${V0}1/dir_clean/dir11</div><div class='add'>+TEST stat $B0/${V0}1/.glusterfs/${gfid_str_d11:0:2}/${gfid_str_d11:2:2}/$gfid_str_d11</div><div class='add'>+</div><div class='add'>+TEST stat $M0/dir_clean/file3 # This assigns gfid on 2nd brick and heals the entry on to the 1st brick.</div><div class='add'>+gfid_f3=$(gf_get_gfid_xattr $B0/${V0}1/dir_clean/file3)</div><div class='add'>+TEST [ ! -z "$gfid_f3" ]</div><div class='add'>+EXPECT "$gfid_f3" gf_get_gfid_xattr $B0/${V0}0/dir_clean/file3</div><div class='add'>+</div><div class='add'>+TEST stat $M0/dir_clean/file4</div><div class='add'>+gfid_f4=$(gf_get_gfid_xattr $B0/${V0}0/dir_clean/file4)</div><div class='add'>+TEST [ ! -z "$gfid_f4" ]</div><div class='add'>+EXPECT "$gfid_f4" gf_get_gfid_xattr $B0/${V0}1/dir_clean/file4</div><div class='add'>+###############################################################################</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/replicate/bug-1637802-arbiter-stale-data-heal-lock.t b/tests/bugs/replicate/bug-1637802-arbiter-stale-data-heal-lock.t<br/>new file mode 100644<br/>index 00000000000..d7d1f285e01<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/replicate/bug-1637802-arbiter-stale-data-heal-lock.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/replicate/bug-1637802-arbiter-stale-data-heal-lock.t</a></div><div class='hunk'>@@ -0,0 +1,45 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+. $(dirname $0)/../../afr.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+# Test to check that data self-heal does not leave any stale lock.</div><div class='add'>+</div><div class='add'>+TEST glusterd;</div><div class='add'>+TEST pidof glusterd;</div><div class='add'>+TEST $CLI volume create $V0 replica 3 arbiter 1 $H0:$B0/${V0}{0,1,2};</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+EXPECT 'Started' volinfo_field $V0 'Status';</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status $V0 $H0 $B0/${V0}0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status $V0 $H0 $B0/${V0}1</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status $V0 $H0 $B0/${V0}2</div><div class='add'>+TEST $GFS --volfile-id=/$V0 --volfile-server=$H0 $M0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 1</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 2</div><div class='add'>+</div><div class='add'>+# Create base entry in indices/xattrop</div><div class='add'>+echo "Data" &gt; $M0/FILE</div><div class='add'>+</div><div class='add'>+# Kill arbiter brick and write to FILE.</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}2</div><div class='add'>+echo "arbiter down" &gt;&gt; $M0/FILE</div><div class='add'>+EXPECT 2 get_pending_heal_count $V0</div><div class='add'>+</div><div class='add'>+# Bring it back up and let heal complete.</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status $V0 $H0 $B0/${V0}2</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "Y" glustershd_up_status</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 1</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 2</div><div class='add'>+TEST $CLI volume heal $V0</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "^0$" get_pending_heal_count $V0</div><div class='add'>+</div><div class='add'>+# write to the FILE must succeed.</div><div class='add'>+echo "this must succeed" &gt;&gt; $M0/FILE</div><div class='add'>+TEST [ $? -eq 0 ]</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/replicate/bug-1655050-dir-sbrain-size-policy.t b/tests/bugs/replicate/bug-1655050-dir-sbrain-size-policy.t<br/>new file mode 100644<br/>index 00000000000..63f72e86bf6<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/replicate/bug-1655050-dir-sbrain-size-policy.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/replicate/bug-1655050-dir-sbrain-size-policy.t</a></div><div class='hunk'>@@ -0,0 +1,55 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+</div><div class='add'>+#Create replica 2 volume</div><div class='add'>+TEST $CLI volume create $V0 replica 2 $H0:$B0/${V0}{0,1}</div><div class='add'>+TEST $CLI volume set $V0 self-heal-daemon off</div><div class='add'>+TEST $CLI volume set $V0 data-self-heal off</div><div class='add'>+TEST $CLI volume set $V0 entry-self-heal off</div><div class='add'>+TEST $CLI volume set $V0 metadata-self-heal off</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+TEST glusterfs --volfile-id=$V0 --volfile-server=$H0 $M0;</div><div class='add'>+</div><div class='add'>+cd $M0</div><div class='add'>+TEST mkdir dir</div><div class='add'>+</div><div class='add'>+#Create metadata split-brain</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}0</div><div class='add'>+TEST chmod 757 dir</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status $V0 $H0 $B0/${V0}0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 0</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}1</div><div class='add'>+TEST chmod 747 dir</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status $V0 $H0 $B0/${V0}1</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 1</div><div class='add'>+</div><div class='add'>+#Use size as fav-child policy.</div><div class='add'>+TEST $CLI volume set $V0 cluster.favorite-child-policy size</div><div class='add'>+</div><div class='add'>+#Enable shd and heal the file.</div><div class='add'>+TEST $CLI volume set $V0 cluster.self-heal-daemon on</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "Y" glustershd_up_status</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 1</div><div class='add'>+TEST $CLI volume heal $V0</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "2" get_pending_heal_count $V0</div><div class='add'>+</div><div class='add'>+b1c1dir=$(afr_get_specific_changelog_xattr $B0/${V0}0/dir \</div><div class='add'>+          trusted.afr.$V0-client-1 "metadata")</div><div class='add'>+b2c0dir=$(afr_get_specific_changelog_xattr $B0/${V0}1/dir \</div><div class='add'>+          trusted.afr.$V0-client-0 "metadata")</div><div class='add'>+</div><div class='add'>+EXPECT "00000001" echo $b1c1dir</div><div class='add'>+EXPECT "00000001" echo $b2c0dir</div><div class='add'>+</div><div class='add'>+#Finish up</div><div class='add'>+TEST force_umount $M0</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/replicate/bug-1655052-sbrain-policy-same-size.t b/tests/bugs/replicate/bug-1655052-sbrain-policy-same-size.t<br/>new file mode 100755<br/>index 00000000000..319736e1157<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/replicate/bug-1655052-sbrain-policy-same-size.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/replicate/bug-1655052-sbrain-policy-same-size.t</a></div><div class='hunk'>@@ -0,0 +1,55 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+#Test the split-brain resolution CLI commands.</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+</div><div class='add'>+#Create replica 2 volume</div><div class='add'>+TEST $CLI volume create $V0 replica 2 $H0:$B0/${V0}{0,1}</div><div class='add'>+TEST $CLI volume set $V0 performance.write-behind off</div><div class='add'>+TEST $CLI volume set $V0 cluster.self-heal-daemon off</div><div class='add'>+TEST $CLI volume set $V0 cluster.entry-self-heal off</div><div class='add'>+TEST $CLI volume set $V0 cluster.data-self-heal off</div><div class='add'>+TEST $CLI volume set $V0 cluster.metadata-self-heal off</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+TEST $GFS --volfile-id=/$V0 --volfile-server=$H0 $M0</div><div class='add'>+TEST touch $M0/file</div><div class='add'>+</div><div class='add'>+############ Healing using favorite-child-policy = size and size of bricks is same #################</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}1</div><div class='add'>+TEST dd if=/dev/urandom of=$M0/file bs=1024 count=1024</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status $V0 $H0 $B0/${V0}1</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 1</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}0</div><div class='add'>+TEST dd if=/dev/urandom of=$M0/file bs=1024 count=1024</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status $V0 $H0 $B0/${V0}0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 0</div><div class='add'>+TEST $CLI volume set $V0 cluster.self-heal-daemon on</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "Y" glustershd_up_status</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 1</div><div class='add'>+TEST $CLI volume heal $V0</div><div class='add'>+</div><div class='add'>+#file still in split-brain</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "2" get_pending_heal_count $V0</div><div class='add'>+cat $M0/file &gt; /dev/null</div><div class='add'>+EXPECT_NOT "^0$" echo $?</div><div class='add'>+</div><div class='add'>+#We know that both bricks have same size file</div><div class='add'>+TEST $CLI volume set $V0 cluster.favorite-child-policy size</div><div class='add'>+TEST $CLI volume heal $V0</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "2" get_pending_heal_count $V0</div><div class='add'>+cat $M0/file &gt; /dev/null</div><div class='add'>+EXPECT_NOT "^0$" echo $?</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+cleanup</div><div class='add'>+</div><div class='head'>diff --git a/tests/bugs/replicate/bug-1655854-support-dist-to-rep3-arb-conversion.t b/tests/bugs/replicate/bug-1655854-support-dist-to-rep3-arb-conversion.t<br/>new file mode 100644<br/>index 00000000000..783016dc3c0<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/replicate/bug-1655854-support-dist-to-rep3-arb-conversion.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/replicate/bug-1655854-support-dist-to-rep3-arb-conversion.t</a></div><div class='hunk'>@@ -0,0 +1,95 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+</div><div class='add'>+# Conversion from 2x1 to 2x3</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/${V0}{0,1}</div><div class='add'>+EXPECT 'Created' volinfo_field $V0 'Status';</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+EXPECT 'Started' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status $V0 $H0 $B0/${V0}0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status $V0 $H0 $B0/${V0}1</div><div class='add'>+</div><div class='add'>+TEST $GFS --volfile-id=$V0 --volfile-server=$H0 $M0;</div><div class='add'>+TEST mkdir $M0/dir</div><div class='add'>+TEST dd if=/dev/urandom of=$M0/dir/file bs=100K count=5</div><div class='add'>+file_md5sum=$(md5sum $M0/dir/file | awk '{print $1}')</div><div class='add'>+</div><div class='add'>+TEST $CLI volume add-brick $V0 replica 3 $H0:$B0/${V0}{2..5}</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status $V0 $H0 $B0/${V0}2</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status $V0 $H0 $B0/${V0}3</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status $V0 $H0 $B0/${V0}4</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status $V0 $H0 $B0/${V0}5</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "Y" glustershd_up_status</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 1</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 2</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 3</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 4</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 5</div><div class='add'>+</div><div class='add'>+# Trigger heal and wait for for it to complete</div><div class='add'>+TEST $CLI volume heal $V0</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "^0$" get_pending_heal_count $V0</div><div class='add'>+</div><div class='add'>+# Check whether the directory &amp; file are healed to the newly added bricks</div><div class='add'>+TEST ls $B0/${V0}2/dir</div><div class='add'>+TEST ls $B0/${V0}3/dir</div><div class='add'>+TEST ls $B0/${V0}4/dir</div><div class='add'>+TEST ls $B0/${V0}5/dir</div><div class='add'>+</div><div class='add'>+TEST [ $file_md5sum == $(md5sum $B0/${V0}4/dir/file | awk '{print $1}') ]</div><div class='add'>+TEST [ $file_md5sum == $(md5sum $B0/${V0}5/dir/file | awk '{print $1}') ]</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+# Conversion from 2x1 to 2x(2+1)</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V1 $H0:$B0/${V1}{0,1}</div><div class='add'>+EXPECT 'Created' volinfo_field $V1 'Status';</div><div class='add'>+TEST $CLI volume start $V1</div><div class='add'>+EXPECT 'Started' volinfo_field $V1 'Status';</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status $V1 $H0 $B0/${V1}0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status $V1 $H0 $B0/${V1}1</div><div class='add'>+</div><div class='add'>+TEST $GFS --volfile-id=$V1 --volfile-server=$H0 $M1;</div><div class='add'>+TEST mkdir $M1/dir</div><div class='add'>+TEST dd if=/dev/urandom of=$M1/dir/file bs=100K count=5</div><div class='add'>+file_md5sum=$(md5sum $M1/dir/file | awk '{print $1}')</div><div class='add'>+</div><div class='add'>+TEST $CLI volume add-brick $V1 replica 3 arbiter 1 $H0:$B0/${V1}{2..5}</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status $V1 $H0 $B0/${V1}2</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status $V1 $H0 $B0/${V1}3</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status $V1 $H0 $B0/${V1}4</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status $V1 $H0 $B0/${V1}5</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "Y" glustershd_up_status</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V1 0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V1 1</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V1 2</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V1 3</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V1 4</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V1 5</div><div class='add'>+</div><div class='add'>+# Trigger heal and wait for for it to complete</div><div class='add'>+TEST $CLI volume heal $V1</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "^0$" get_pending_heal_count $V1</div><div class='add'>+</div><div class='add'>+# Check whether the directory &amp; file are healed to the newly added bricks</div><div class='add'>+TEST ls $B0/${V1}2/dir</div><div class='add'>+TEST ls $B0/${V1}3/dir</div><div class='add'>+TEST ls $B0/${V1}4/dir</div><div class='add'>+TEST ls $B0/${V1}5/dir</div><div class='add'>+</div><div class='add'>+EXPECT "0" stat -c %s $B0/${V1}5/dir/file</div><div class='add'>+TEST [ $file_md5sum == $(md5sum $B0/${V1}4/dir/file | awk '{print $1}') ]</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/replicate/bug-1657783-do-not-update-read-subvol-on-rename-link.t b/tests/bugs/replicate/bug-1657783-do-not-update-read-subvol-on-rename-link.t<br/>new file mode 100644<br/>index 00000000000..b180f0e1239<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/replicate/bug-1657783-do-not-update-read-subvol-on-rename-link.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/replicate/bug-1657783-do-not-update-read-subvol-on-rename-link.t</a></div><div class='hunk'>@@ -0,0 +1,40 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 replica 3 $H0:$B0/${V0}{0..2}</div><div class='add'>+TEST $CLI volume set $V0 self-heal-daemon off</div><div class='add'>+TEST $CLI volume set $V0 cluster.data-self-heal off</div><div class='add'>+TEST $CLI volume set $V0 cluster.metadata-self-heal off</div><div class='add'>+TEST $CLI volume set $V0 cluster.entry-self-heal off</div><div class='add'>+TEST $CLI volume set $V0 performance.write-behind off</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+TEST $GFS --volfile-id=$V0 --volfile-server=$H0 $M0;</div><div class='add'>+TEST mkdir $M0/dir</div><div class='add'>+TEST "echo abc &gt; $M0/file1"</div><div class='add'>+TEST "echo uvw &gt; $M0/file2"</div><div class='add'>+</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}0</div><div class='add'>+TEST "echo def &gt; $M0/file1"</div><div class='add'>+TEST "echo xyz &gt; $M0/file2"</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status $V0 $H0 $B0/${V0}0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 0</div><div class='add'>+</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}1</div><div class='add'>+</div><div class='add'>+# Rename file1 and read it. Read should be served from the 3rd brick</div><div class='add'>+TEST mv $M0/file1 $M0/file3</div><div class='add'>+EXPECT "def" cat $M0/file3</div><div class='add'>+</div><div class='add'>+# Create a link to file2 and read it. Read should be served from the 3rd brick</div><div class='add'>+TEST ln $M0/file2 $M0/dir/file4</div><div class='add'>+EXPECT "xyz" cat $M0/dir/file4</div><div class='add'>+EXPECT "xyz" cat $M0/file2</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/bugs/replicate/bug-1686568-send-truncate-on-arbiter-from-shd.t b/tests/bugs/replicate/bug-1686568-send-truncate-on-arbiter-from-shd.t<br/>new file mode 100644<br/>index 00000000000..78581e99614<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/replicate/bug-1686568-send-truncate-on-arbiter-from-shd.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/replicate/bug-1686568-send-truncate-on-arbiter-from-shd.t</a></div><div class='hunk'>@@ -0,0 +1,38 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+CHANGELOG_PATH_0="$B0/${V0}2/.glusterfs/changelogs"</div><div class='add'>+ROLLOVER_TIME=100</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 replica 2 $H0:$B0/${V0}{0,1}</div><div class='add'>+TEST $CLI volume set $V0 changelog.changelog on</div><div class='add'>+TEST $CLI volume set $V0 changelog.rollover-time $ROLLOVER_TIME</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status $V0 $H0 $B0/${V0}0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status $V0 $H0 $B0/${V0}1</div><div class='add'>+</div><div class='add'>+TEST $GFS --volfile-id=$V0 --volfile-server=$H0 $M0;</div><div class='add'>+TEST dd if=/dev/zero of=$M0/file1 bs=128K count=5</div><div class='add'>+</div><div class='add'>+TEST $CLI volume profile $V0 start</div><div class='add'>+TEST $CLI volume add-brick $V0 replica 3 arbiter 1 $H0:$B0/${V0}2</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status $V0 $H0 $B0/${V0}2</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "Y" glustershd_up_status</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 1</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 2</div><div class='add'>+</div><div class='add'>+TEST $CLI volume heal $V0</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "^0$" get_pending_heal_count $V0</div><div class='add'>+</div><div class='add'>+TEST $CLI volume profile $V0 info</div><div class='add'>+truncate_count=$($CLI volume profile $V0 info | grep TRUNCATE | awk '{count += $8} END {print count}')</div><div class='add'>+</div><div class='add'>+EXPECT "1" echo $truncate_count</div><div class='add'>+EXPECT "1" check_changelog_op ${CHANGELOG_PATH_0} "^ D "</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/replicate/bug-1696599-io-hang.t b/tests/bugs/replicate/bug-1696599-io-hang.t<br/>new file mode 100755<br/>index 00000000000..869cdb94bda<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/replicate/bug-1696599-io-hang.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/replicate/bug-1696599-io-hang.t</a></div><div class='hunk'>@@ -0,0 +1,47 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+. $(dirname $0)/../../fileio.rc</div><div class='add'>+</div><div class='add'>+#Tests that local structures in afr are removed from granted/blocked list of</div><div class='add'>+#locks when inodelk fails on all bricks</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 replica 3 $H0:$B0/${V0}{1..3}</div><div class='add'>+TEST $CLI volume set $V0 performance.quick-read off</div><div class='add'>+TEST $CLI volume set $V0 performance.write-behind off</div><div class='add'>+TEST $CLI volume set $V0 performance.io-cache off</div><div class='add'>+TEST $CLI volume set $V0 performance.stat-prefetch off</div><div class='add'>+TEST $CLI volume set $V0 performance.client-io-threads off</div><div class='add'>+TEST $CLI volume set $V0 delay-gen locks</div><div class='add'>+TEST $CLI volume set $V0 delay-gen.delay-duration 5000000</div><div class='add'>+TEST $CLI volume set $V0 delay-gen.delay-percentage 100</div><div class='add'>+TEST $CLI volume set $V0 delay-gen.enable finodelk</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+EXPECT 'Started' volinfo_field $V0 'Status'</div><div class='add'>+</div><div class='add'>+TEST $GFS -s $H0 --volfile-id $V0 $M0</div><div class='add'>+TEST touch $M0/file</div><div class='add'>+#Trigger write and stop bricks so inodelks fail on all bricks leading to</div><div class='add'>+#lock failure condition</div><div class='add'>+echo abc &gt;&gt; $M0/file &amp;</div><div class='add'>+</div><div class='add'>+TEST $CLI volume stop $V0</div><div class='add'>+TEST $CLI volume reset $V0 delay-gen</div><div class='add'>+wait</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_meta $M0 $V0-replicate-0 0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_meta $M0 $V0-replicate-0 1</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_meta $M0 $V0-replicate-0 2</div><div class='add'>+#Test that only one write succeeded, this tests that delay-gen worked as</div><div class='add'>+#expected</div><div class='add'>+echo abc &gt;&gt; $M0/file</div><div class='add'>+EXPECT "abc" cat $M0/file</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/replicate/bug-1717819-metadata-split-brain-detection.t b/tests/bugs/replicate/bug-1717819-metadata-split-brain-detection.t<br/>new file mode 100644<br/>index 00000000000..76d1f2170f2<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/replicate/bug-1717819-metadata-split-brain-detection.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/replicate/bug-1717819-metadata-split-brain-detection.t</a></div><div class='hunk'>@@ -0,0 +1,136 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+. $(dirname $0)/../../afr.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+## Start and create a volume</div><div class='add'>+TEST glusterd;</div><div class='add'>+TEST pidof glusterd;</div><div class='add'>+TEST $CLI volume info;</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 replica 3 $H0:$B0/${V0}{0,1,2};</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+EXPECT 'Started' volinfo_field $V0 'Status';</div><div class='add'>+TEST $CLI volume heal $V0 disable</div><div class='add'>+TEST $GFS --volfile-id=/$V0 --volfile-server=$H0 $M0</div><div class='add'>+</div><div class='add'>+###############################################################################</div><div class='add'>+# Case of 2 bricks blaming the third and the third blaming the other two.</div><div class='add'>+</div><div class='add'>+TEST mkdir $M0/dir</div><div class='add'>+</div><div class='add'>+# B0 and B2 must blame B1</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/$V0"1"</div><div class='add'>+TEST setfattr -n user.metadata -v 1 $M0/dir</div><div class='add'>+EXPECT "00000001" afr_get_specific_changelog_xattr $B0/${V0}0/dir trusted.afr.$V0-client-1 metadata</div><div class='add'>+EXPECT "00000001" afr_get_specific_changelog_xattr $B0/${V0}2/dir trusted.afr.$V0-client-1 metadata</div><div class='add'>+CLIENT_XATTR=$(getfattr -n 'user.metadata' --absolute-names --only-values $M0/dir)</div><div class='add'>+</div><div class='add'>+# B1 must blame B0 and B2</div><div class='add'>+setfattr -n trusted.afr.$V0-client-0 -v 0x000000000000000100000000 $B0/$V0"1"/dir</div><div class='add'>+setfattr -n trusted.afr.$V0-client-2 -v 0x000000000000000100000000 $B0/$V0"1"/dir</div><div class='add'>+</div><div class='add'>+# Launch heal</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "^1$" brick_up_status $V0 $H0 $B0/${V0}1</div><div class='add'>+TEST $CLI volume heal $V0 enable</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "^Y$" glustershd_up_status</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "^1$" afr_child_up_status_in_shd $V0 0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "^1$" afr_child_up_status_in_shd $V0 1</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "^1$" afr_child_up_status_in_shd $V0 2</div><div class='add'>+TEST $CLI volume heal $V0</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "^0$" get_pending_heal_count $V0</div><div class='add'>+</div><div class='add'>+B0_XATTR=$(getfattr -n 'user.metadata' --absolute-names --only-values $B0/${V0}0/dir)</div><div class='add'>+B1_XATTR=$(getfattr -n 'user.metadata' --absolute-names --only-values $B0/${V0}1/dir)</div><div class='add'>+B2_XATTR=$(getfattr -n 'user.metadata' --absolute-names --only-values $B0/${V0}2/dir)</div><div class='add'>+</div><div class='add'>+TEST [ "$CLIENT_XATTR" == "$B0_XATTR" ]</div><div class='add'>+TEST [ "$CLIENT_XATTR" == "$B1_XATTR" ]</div><div class='add'>+TEST [ "$CLIENT_XATTR" == "$B2_XATTR" ]</div><div class='add'>+TEST setfattr -x user.metadata $M0/dir</div><div class='add'>+</div><div class='add'>+###############################################################################</div><div class='add'>+# Case of each brick blaming the next one in a cyclic manner</div><div class='add'>+</div><div class='add'>+TEST $CLI volume heal $V0 disable</div><div class='add'>+TEST `echo "hello" &gt;&gt; $M0/dir/file`</div><div class='add'>+# Mark cyclic xattrs and modify metadata directly on the bricks.</div><div class='add'>+setfattr -n trusted.afr.$V0-client-1 -v 0x000000000000000100000000 $B0/$V0"0"/dir/file</div><div class='add'>+setfattr -n trusted.afr.$V0-client-2 -v 0x000000000000000100000000 $B0/$V0"1"/dir/file</div><div class='add'>+setfattr -n trusted.afr.$V0-client-0 -v 0x000000000000000100000000 $B0/$V0"2"/dir/file</div><div class='add'>+</div><div class='add'>+setfattr -n user.metadata -v 1 $B0/$V0"0"/dir/file</div><div class='add'>+setfattr -n user.metadata -v 2 $B0/$V0"1"/dir/file</div><div class='add'>+setfattr -n user.metadata -v 3 $B0/$V0"2"/dir/file</div><div class='add'>+</div><div class='add'>+# Add entry to xattrop dir to trigger index heal.</div><div class='add'>+xattrop_dir0=$(afr_get_index_path $B0/$V0"0")</div><div class='add'>+base_entry_b0=`ls $xattrop_dir0`</div><div class='add'>+gfid_str=$(gf_gfid_xattr_to_str $(gf_get_gfid_xattr $B0/$V0"0"/dir/file))</div><div class='add'>+ln $xattrop_dir0/$base_entry_b0 $xattrop_dir0/$gfid_str</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "^1$" get_pending_heal_count $V0</div><div class='add'>+</div><div class='add'>+# Launch heal</div><div class='add'>+TEST $CLI volume heal $V0 enable</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "^Y$" glustershd_up_status</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "^1$" afr_child_up_status_in_shd $V0 0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "^1$" afr_child_up_status_in_shd $V0 1</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "^1$" afr_child_up_status_in_shd $V0 2</div><div class='add'>+TEST $CLI volume heal $V0</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "^0$" get_pending_heal_count $V0</div><div class='add'>+</div><div class='add'>+B0_XATTR=$(getfattr -n 'user.metadata' --absolute-names --only-values $B0/${V0}0/dir/file)</div><div class='add'>+B1_XATTR=$(getfattr -n 'user.metadata' --absolute-names --only-values $B0/${V0}1/dir/file)</div><div class='add'>+B2_XATTR=$(getfattr -n 'user.metadata' --absolute-names --only-values $B0/${V0}2/dir/file)</div><div class='add'>+</div><div class='add'>+TEST [ "$B0_XATTR" == "$B1_XATTR" ]</div><div class='add'>+TEST [ "$B0_XATTR" == "$B2_XATTR" ]</div><div class='add'>+TEST rm -f $M0/dir/file</div><div class='add'>+</div><div class='add'>+###############################################################################</div><div class='add'>+# Case of 2 bricks having quorum blaming and the other having only one blaming.</div><div class='add'>+</div><div class='add'>+TEST $CLI volume heal $V0 disable</div><div class='add'>+TEST `echo "hello" &gt;&gt; $M0/dir/file`</div><div class='add'>+# B0 and B2 must blame B1</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/$V0"1"</div><div class='add'>+TEST setfattr -n user.metadata -v 1 $M0/dir/file</div><div class='add'>+EXPECT "00000001" afr_get_specific_changelog_xattr $B0/${V0}0/dir/file trusted.afr.$V0-client-1 metadata</div><div class='add'>+EXPECT "00000001" afr_get_specific_changelog_xattr $B0/${V0}2/dir/file trusted.afr.$V0-client-1 metadata</div><div class='add'>+</div><div class='add'>+# B1 must blame B0 and B2</div><div class='add'>+setfattr -n trusted.afr.$V0-client-0 -v 0x000000000000000100000000 $B0/$V0"1"/dir/file</div><div class='add'>+setfattr -n trusted.afr.$V0-client-2 -v 0x000000000000000100000000 $B0/$V0"1"/dir/file</div><div class='add'>+</div><div class='add'>+# B0 must blame B2</div><div class='add'>+setfattr -n trusted.afr.$V0-client-2 -v 0x000000000000000100000000 $B0/$V0"0"/dir/file</div><div class='add'>+</div><div class='add'>+# Modify the metadata directly on the bricks B1 &amp; B2.</div><div class='add'>+setfattr -n user.metadata -v 2 $B0/$V0"1"/dir/file</div><div class='add'>+setfattr -n user.metadata -v 3 $B0/$V0"2"/dir/file</div><div class='add'>+</div><div class='add'>+# Launch heal</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "^1$" brick_up_status $V0 $H0 $B0/${V0}1</div><div class='add'>+TEST $CLI volume heal $V0 enable</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "^Y$" glustershd_up_status</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "^1$" afr_child_up_status_in_shd $V0 0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "^1$" afr_child_up_status_in_shd $V0 1</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "^1$" afr_child_up_status_in_shd $V0 2</div><div class='add'>+TEST $CLI volume heal $V0</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "^0$" get_pending_heal_count $V0</div><div class='add'>+</div><div class='add'>+B0_XATTR=$(getfattr -n 'user.metadata' --absolute-names --only-values $B0/${V0}0/dir/file)</div><div class='add'>+B1_XATTR=$(getfattr -n 'user.metadata' --absolute-names --only-values $B0/${V0}1/dir/file)</div><div class='add'>+B2_XATTR=$(getfattr -n 'user.metadata' --absolute-names --only-values $B0/${V0}2/dir/file)</div><div class='add'>+</div><div class='add'>+TEST [ "$B0_XATTR" == "$B1_XATTR" ]</div><div class='add'>+TEST [ "$B0_XATTR" == "$B2_XATTR" ]</div><div class='add'>+</div><div class='add'>+###############################################################################</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/bugs/replicate/bug-1722507-type-mismatch-error-handling.t b/tests/bugs/replicate/bug-1722507-type-mismatch-error-handling.t<br/>new file mode 100644<br/>index 00000000000..0aeaaafc84c<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/replicate/bug-1722507-type-mismatch-error-handling.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/replicate/bug-1722507-type-mismatch-error-handling.t</a></div><div class='hunk'>@@ -0,0 +1,116 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+. $(dirname $0)/../../afr.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+## Start and create a volume</div><div class='add'>+TEST glusterd;</div><div class='add'>+TEST pidof glusterd;</div><div class='add'>+TEST $CLI volume info;</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 replica 3 $H0:$B0/${V0}{0,1,2};</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+TEST $CLI volume set $V0 cluster.heal-timeout 5</div><div class='add'>+TEST $CLI volume heal $V0 disable</div><div class='add'>+EXPECT 'Started' volinfo_field $V0 'Status';</div><div class='add'>+TEST $GFS --volfile-id=/$V0 --volfile-server=$H0 $M0</div><div class='add'>+</div><div class='add'>+TEST mkdir $M0/dir</div><div class='add'>+</div><div class='add'>+##########################################################################################</div><div class='add'>+# GFID link file and the GFID is missing on one brick and all the bricks are being blamed.</div><div class='add'>+</div><div class='add'>+TEST touch $M0/dir/file</div><div class='add'>+#TEST kill_brick $V0 $H0 $B0/$V0"1"</div><div class='add'>+</div><div class='add'>+#B0 and B2 must blame B1</div><div class='add'>+setfattr -n trusted.afr.$V0-client-0 -v 0x000000000000000000000001 $B0/$V0"2"/dir</div><div class='add'>+setfattr -n trusted.afr.$V0-client-1 -v 0x000000000000000000000001 $B0/$V0"0"/dir</div><div class='add'>+setfattr -n trusted.afr.$V0-client-2 -v 0x000000000000000000000001 $B0/$V0"0"/dir</div><div class='add'>+</div><div class='add'>+# Add entry to xattrop dir to trigger index heal.</div><div class='add'>+xattrop_dir0=$(afr_get_index_path $B0/$V0"0")</div><div class='add'>+base_entry_b0=`ls $xattrop_dir0`</div><div class='add'>+gfid_str=$(gf_gfid_xattr_to_str $(gf_get_gfid_xattr $B0/$V0"0"/dir/))</div><div class='add'>+ln -s $xattrop_dir0/$base_entry_b0 $xattrop_dir0/$gfid_str</div><div class='add'>+EXPECT "^1$" get_pending_heal_count $V0</div><div class='add'>+</div><div class='add'>+# Remove the gfid xattr and the link file on one brick.</div><div class='add'>+gfid_file=$(gf_get_gfid_xattr $B0/$V0"0"/dir/file)</div><div class='add'>+gfid_str_file=$(gf_gfid_xattr_to_str $gfid_file)</div><div class='add'>+TEST setfattr -x trusted.gfid $B0/${V0}0/dir/file</div><div class='add'>+TEST rm -f $B0/${V0}0/.glusterfs/${gfid_str_file:0:2}/${gfid_str_file:2:2}/$gfid_str_file</div><div class='add'>+</div><div class='add'>+# Launch heal</div><div class='add'>+TEST $CLI volume heal $V0 enable</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "^Y$" glustershd_up_status</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "^1$" afr_child_up_status_in_shd $V0 0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "^1$" afr_child_up_status_in_shd $V0 1</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "^1$" afr_child_up_status_in_shd $V0 2</div><div class='add'>+</div><div class='add'>+# Wait for 2 second to force posix to consider that this is a valid file but</div><div class='add'>+# without gfid.</div><div class='add'>+sleep 2</div><div class='add'>+TEST $CLI volume heal $V0</div><div class='add'>+</div><div class='add'>+# Heal should not fail as the file is missing gfid xattr and the link file,</div><div class='add'>+# which is not actually the gfid or type mismatch.</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "^0$" get_pending_heal_count $V0</div><div class='add'>+</div><div class='add'>+EXPECT "$gfid_file" gf_get_gfid_xattr $B0/${V0}0/dir/file</div><div class='add'>+TEST stat $B0/${V0}0/.glusterfs/${gfid_str_file:0:2}/${gfid_str_file:2:2}/$gfid_str_file</div><div class='add'>+rm -f $M0/dir/file</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+###########################################################################################</div><div class='add'>+# GFID link file and the GFID is missing on two bricks and all the bricks are being blamed.</div><div class='add'>+</div><div class='add'>+TEST $CLI volume heal $V0 disable</div><div class='add'>+TEST touch $M0/dir/file</div><div class='add'>+#TEST kill_brick $V0 $H0 $B0/$V0"1"</div><div class='add'>+</div><div class='add'>+#B0 and B2 must blame B1</div><div class='add'>+setfattr -n trusted.afr.$V0-client-0 -v 0x000000000000000000000001 $B0/$V0"2"/dir</div><div class='add'>+setfattr -n trusted.afr.$V0-client-1 -v 0x000000000000000000000001 $B0/$V0"0"/dir</div><div class='add'>+setfattr -n trusted.afr.$V0-client-2 -v 0x000000000000000000000001 $B0/$V0"0"/dir</div><div class='add'>+</div><div class='add'>+# Add entry to xattrop dir to trigger index heal.</div><div class='add'>+xattrop_dir0=$(afr_get_index_path $B0/$V0"0")</div><div class='add'>+base_entry_b0=`ls $xattrop_dir0`</div><div class='add'>+gfid_str=$(gf_gfid_xattr_to_str $(gf_get_gfid_xattr $B0/$V0"0"/dir/))</div><div class='add'>+ln -s $xattrop_dir0/$base_entry_b0 $xattrop_dir0/$gfid_str</div><div class='add'>+EXPECT "^1$" get_pending_heal_count $V0</div><div class='add'>+</div><div class='add'>+# Remove the gfid xattr and the link file on two bricks.</div><div class='add'>+gfid_file=$(gf_get_gfid_xattr $B0/$V0"0"/dir/file)</div><div class='add'>+gfid_str_file=$(gf_gfid_xattr_to_str $gfid_file)</div><div class='add'>+TEST setfattr -x trusted.gfid $B0/${V0}0/dir/file</div><div class='add'>+TEST rm -f $B0/${V0}0/.glusterfs/${gfid_str_file:0:2}/${gfid_str_file:2:2}/$gfid_str_file</div><div class='add'>+TEST setfattr -x trusted.gfid $B0/${V0}1/dir/file</div><div class='add'>+TEST rm -f $B0/${V0}1/.glusterfs/${gfid_str_file:0:2}/${gfid_str_file:2:2}/$gfid_str_file</div><div class='add'>+</div><div class='add'>+# Launch heal</div><div class='add'>+TEST $CLI volume heal $V0 enable</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "^Y$" glustershd_up_status</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "^1$" afr_child_up_status_in_shd $V0 0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "^1$" afr_child_up_status_in_shd $V0 1</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "^1$" afr_child_up_status_in_shd $V0 2</div><div class='add'>+</div><div class='add'>+# Wait for 2 second to force posix to consider that this is a valid file but</div><div class='add'>+# without gfid.</div><div class='add'>+sleep 2</div><div class='add'>+TEST $CLI volume heal $V0</div><div class='add'>+</div><div class='add'>+# Heal should not fail as the file is missing gfid xattr and the link file,</div><div class='add'>+# which is not actually the gfid or type mismatch.</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "^0$" get_pending_heal_count $V0</div><div class='add'>+</div><div class='add'>+EXPECT "$gfid_file" gf_get_gfid_xattr $B0/${V0}0/dir/file</div><div class='add'>+TEST stat $B0/${V0}0/.glusterfs/${gfid_str_file:0:2}/${gfid_str_file:2:2}/$gfid_str_file</div><div class='add'>+EXPECT "$gfid_file" gf_get_gfid_xattr $B0/${V0}1/dir/file</div><div class='add'>+TEST stat $B0/${V0}1/.glusterfs/${gfid_str_file:0:2}/${gfid_str_file:2:2}/$gfid_str_file</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/bugs/replicate/bug-1728770-pass-xattrs.t b/tests/bugs/replicate/bug-1728770-pass-xattrs.t<br/>new file mode 100644<br/>index 00000000000..159c4fcc6a1<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/replicate/bug-1728770-pass-xattrs.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/replicate/bug-1728770-pass-xattrs.t</a></div><div class='hunk'>@@ -0,0 +1,52 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+. $(dirname $0)/../../snapshot.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+function fop_on_bad_disk {</div><div class='add'>+    local path=$1</div><div class='add'>+    mkdir $path/dir{1..1000} 2&gt;/dev/null</div><div class='add'>+    mv $path/dir1 $path/newdir</div><div class='add'>+    touch $path/foo.txt</div><div class='add'>+    echo $?</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function ls_fop_on_bad_disk {</div><div class='add'>+    local path=$1</div><div class='add'>+    ls $path</div><div class='add'>+    echo $?</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+TEST init_n_bricks 6;</div><div class='add'>+TEST setup_lvm 6;</div><div class='add'>+</div><div class='add'>+TEST glusterd;</div><div class='add'>+TEST pidof glusterd;</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 replica 3 $H0:$L1 $H0:$L2 $H0:$L3 $H0:$L4 $H0:$L5 $H0:$L6;</div><div class='add'>+TEST $CLI volume set $V0 health-check-interval 1000;</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+</div><div class='add'>+TEST $GFS --volfile-server=$H0 --volfile-id=$V0 $M0;</div><div class='add'>+#corrupt last disk</div><div class='add'>+dd if=/dev/urandom of=/dev/mapper/patchy_snap_vg_6-brick_lvm bs=512K count=200 status=progress &amp;&amp; sync</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+# Test the disk is now returning EIO for touch and ls</div><div class='add'>+EXPECT_WITHIN $DISK_FAIL_TIMEOUT "^1$" fop_on_bad_disk "$L6"</div><div class='add'>+EXPECT_WITHIN $DISK_FAIL_TIMEOUT "^2$" ls_fop_on_bad_disk "$L6"</div><div class='add'>+</div><div class='add'>+TEST touch $M0/foo{1..100}</div><div class='add'>+TEST $CLI volume remove-brick $V0 replica 3 $H0:$L4 $H0:$L5 $H0:$L6 start</div><div class='add'>+EXPECT_WITHIN $REBALANCE_TIMEOUT "completed" remove_brick_status_completed_field "$V0" "$H0:$L4 $H0:$L5 $H0:$L6";</div><div class='add'>+</div><div class='add'>+#check that remove-brick status should not have any failed or skipped files</div><div class='add'>+var=`$CLI volume remove-brick $V0 $H0:$L4 $H0:$L5 $H0:$L6 status | grep completed`</div><div class='add'>+TEST [ `echo $var | awk '{print $5}'` = "0"  ]</div><div class='add'>+TEST [ `echo $var | awk '{print $6}'` = "0"  ]</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/replicate/bug-1734370-entry-heal-restore-time.t b/tests/bugs/replicate/bug-1734370-entry-heal-restore-time.t<br/>new file mode 100644<br/>index 00000000000..14dfae89135<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/replicate/bug-1734370-entry-heal-restore-time.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/replicate/bug-1734370-entry-heal-restore-time.t</a></div><div class='hunk'>@@ -0,0 +1,102 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+. $(dirname $0)/../../afr.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+function time_stamps_match {</div><div class='add'>+        path=$1</div><div class='add'>+        mtime_source_b0=$(get_mtime $B0/${V0}0/$path)</div><div class='add'>+        atime_source_b0=$(get_atime $B0/${V0}0/$path)</div><div class='add'>+        mtime_source_b2=$(get_mtime $B0/${V0}2/$path)</div><div class='add'>+        atime_source_b2=$(get_atime $B0/${V0}2/$path)</div><div class='add'>+        mtime_sink_b1=$(get_mtime $B0/${V0}1/$path)</div><div class='add'>+        atime_sink_b1=$(get_atime $B0/${V0}1/$path)</div><div class='add'>+</div><div class='add'>+        #The same brick must be the source of heal for both atime and mtime.</div><div class='add'>+        if [[ ( $mtime_source_b0 -eq $mtime_sink_b1 &amp;&amp; $atime_source_b0 -eq $atime_sink_b1 ) || \</div><div class='add'>+              ( $mtime_source_b2 -eq $mtime_sink_b1 &amp;&amp; $atime_source_b2 -eq $atime_sink_b1 ) ]]</div><div class='add'>+        then</div><div class='add'>+            echo "Y"</div><div class='add'>+        else</div><div class='add'>+            echo "Mtimes: $mtime_source_b0:$mtime_sink_b1:$mtime_source_b2 Atimes: $atime_source_b0:$atime_sink_b1:$atime_source_b2"</div><div class='add'>+        fi</div><div class='add'>+</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function mtimes_match {</div><div class='add'>+        path=$1</div><div class='add'>+        mtime_source_b0=$(get_mtime $B0/${V0}0/$path)</div><div class='add'>+        mtime_source_b2=$(get_mtime $B0/${V0}2/$path)</div><div class='add'>+        mtime_sink_b1=$(get_mtime $B0/${V0}1/$path)</div><div class='add'>+</div><div class='add'>+        if [[ ( $mtime_source_b0 -eq $mtime_sink_b1) || \</div><div class='add'>+              ( $mtime_source_b2 -eq $mtime_sink_b1) ]]</div><div class='add'>+        then</div><div class='add'>+            echo "Y"</div><div class='add'>+        else</div><div class='add'>+            echo "Mtimes: $mtime_source_b0:$mtime_sink_b1:$mtime_source_b2"</div><div class='add'>+        fi</div><div class='add'>+</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+# Test that the parent dir's timestamps are restored during entry-heal.</div><div class='add'>+GET_MDATA_PATH=$(dirname $0)/../../utils</div><div class='add'>+build_tester $GET_MDATA_PATH/get-mdata-xattr.c</div><div class='add'>+</div><div class='add'>+TEST glusterd;</div><div class='add'>+TEST pidof glusterd;</div><div class='add'>+TEST $CLI volume create $V0 replica 3 $H0:$B0/${V0}{0,1,2};</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+</div><div class='add'>+TEST $GFS --volfile-id=/$V0 --volfile-server=$H0 --attribute-timeout=0 --entry-timeout=0 $M0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 1</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 2</div><div class='add'>+</div><div class='add'>+###############################################################################</div><div class='add'>+TEST mkdir $M0/DIR</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}1</div><div class='add'>+TEST touch $M0/DIR/FILE</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status $V0 1</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "Y" glustershd_up_status</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 1</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 2</div><div class='add'>+TEST $CLI volume heal $V0</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "0" get_pending_heal_count $V0</div><div class='add'>+</div><div class='add'>+EXPECT "Y" time_stamps_match DIR</div><div class='add'>+ctime_source1=$(get_ctime $B0/${V0}0/$path)</div><div class='add'>+ctime_source2=$(get_ctime $B0/${V0}2/$path)</div><div class='add'>+ctime_sink=$(get_ctime $B0/${V0}1/$path)</div><div class='add'>+TEST [ $ctime_source1 -eq $ctime_sink ]</div><div class='add'>+TEST [ $ctime_source2 -eq $ctime_sink ]</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+###############################################################################</div><div class='add'>+# Repeat the test with ctime feature disabled.</div><div class='add'>+TEST $CLI volume set $V0 features.ctime off</div><div class='add'>+TEST mkdir $M0/DIR2</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}1</div><div class='add'>+TEST touch $M0/DIR2/FILE</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status $V0 0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "Y" glustershd_up_status</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 1</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 2</div><div class='add'>+TEST $CLI volume heal $V0</div><div class='add'>+#Executing parallel heal may lead to changing atime after heal. So better</div><div class='add'>+#to test just the mtime</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "0" get_pending_heal_count $V0</div><div class='add'>+</div><div class='add'>+EXPECT "Y" mtimes_match DIR2</div><div class='add'>+</div><div class='add'>+TEST rm $GET_MDATA_PATH/get-mdata-xattr</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/replicate/bug-1744548-heal-timeout.t b/tests/bugs/replicate/bug-1744548-heal-timeout.t<br/>new file mode 100644<br/>index 00000000000..011535066f9<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/replicate/bug-1744548-heal-timeout.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/replicate/bug-1744548-heal-timeout.t</a></div><div class='hunk'>@@ -0,0 +1,47 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+. $(dirname $0)/../../afr.rc</div><div class='add'>+</div><div class='add'>+function get_cumulative_opendir_count {</div><div class='add'>+#sed command prints content between Cumulative and Interval, this keeps content from Cumulative stats</div><div class='add'>+    $CLI volume profile $V0 info |sed -n '/^Cumulative/,/^Interval/p'|grep OPENDIR| awk '{print $8}'|tr -d '\n'</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd;</div><div class='add'>+TEST pidof glusterd;</div><div class='add'>+TEST $CLI volume create $V0 replica 3 $H0:$B0/${V0}{0,1,2}</div><div class='add'>+TEST $CLI volume heal $V0 disable</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status $V0 $H0 $B0/${V0}0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status $V0 $H0 $B0/${V0}1</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status $V0 $H0 $B0/${V0}2</div><div class='add'>+TEST ! $CLI volume heal $V0</div><div class='add'>+</div><div class='add'>+# Enable shd and verify that index crawl is triggered immediately.</div><div class='add'>+TEST $CLI volume profile $V0 start</div><div class='add'>+TEST $CLI volume profile $V0 info clear</div><div class='add'>+TEST $CLI volume heal $V0 enable</div><div class='add'>+# Each brick does 4 opendirs, corresponding to dirty, xattrop and entry-changes, anonymous-inode</div><div class='add'>+EXPECT_WITHIN 4 "^444$" get_cumulative_opendir_count</div><div class='add'>+</div><div class='add'>+# Check that a change in heal-timeout is honoured immediately.</div><div class='add'>+TEST $CLI volume set $V0 cluster.heal-timeout 5</div><div class='add'>+sleep 10</div><div class='add'>+# Two crawls must have happened.</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "^121212$" get_cumulative_opendir_count</div><div class='add'>+</div><div class='add'>+# shd must not heal if it is disabled and heal-timeout is changed.</div><div class='add'>+TEST $CLI volume heal $V0 disable</div><div class='add'>+#Wait for configuration update and any opendir fops to complete</div><div class='add'>+sleep 10</div><div class='add'>+TEST $CLI volume profile $V0 info clear</div><div class='add'>+TEST $CLI volume set $V0 cluster.heal-timeout 6</div><div class='add'>+#Better to wait for more than 6 seconds to account for configuration updates</div><div class='add'>+sleep 10</div><div class='add'>+COUNT=`$CLI volume profile $V0 info incremental |grep OPENDIR|awk '{print $8}'|tr -d '\n'`</div><div class='add'>+TEST [ -z $COUNT ]</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/replicate/bug-1749322-entry-heal-not-happening.t b/tests/bugs/replicate/bug-1749322-entry-heal-not-happening.t<br/>new file mode 100644<br/>index 00000000000..96279084065<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/replicate/bug-1749322-entry-heal-not-happening.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/replicate/bug-1749322-entry-heal-not-happening.t</a></div><div class='hunk'>@@ -0,0 +1,89 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+. $(dirname $0)/../../afr.rc</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='add'>+</div><div class='add'>+function check_gfid_and_link_count</div><div class='add'>+{</div><div class='add'>+        local file=$1</div><div class='add'>+</div><div class='add'>+        file_gfid_b0=$(gf_get_gfid_xattr $B0/${V0}0/$file)</div><div class='add'>+        TEST [ ! -z $file_gfid_b0 ]</div><div class='add'>+        file_gfid_b1=$(gf_get_gfid_xattr $B0/${V0}1/$file)</div><div class='add'>+        file_gfid_b2=$(gf_get_gfid_xattr $B0/${V0}2/$file)</div><div class='add'>+        EXPECT $file_gfid_b0 echo $file_gfid_b1</div><div class='add'>+        EXPECT $file_gfid_b0 echo $file_gfid_b2</div><div class='add'>+</div><div class='add'>+        EXPECT "2" stat -c %h $B0/${V0}0/$file</div><div class='add'>+        EXPECT "2" stat -c %h $B0/${V0}1/$file</div><div class='add'>+        EXPECT "2" stat -c %h $B0/${V0}2/$file</div><div class='add'>+}</div><div class='add'>+TESTS_EXPECTED_IN_LOOP=18</div><div class='add'>+</div><div class='add'>+################################################################################</div><div class='add'>+## Start and create a volume</div><div class='add'>+TEST glusterd;</div><div class='add'>+TEST pidof glusterd;</div><div class='add'>+TEST $CLI volume info;</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 replica 3 $H0:$B0/${V0}{0,1,2};</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+TEST $CLI volume set $V0 cluster.heal-timeout 5</div><div class='add'>+TEST $CLI volume heal $V0 disable</div><div class='add'>+EXPECT 'Started' volinfo_field $V0 'Status';</div><div class='add'>+TEST $GFS --volfile-id=/$V0 --volfile-server=$H0 $M0</div><div class='add'>+</div><div class='add'>+TEST mkdir $M0/dir</div><div class='add'>+TEST `echo "File 1 " &gt; $M0/dir/file1`</div><div class='add'>+TEST touch $M0/dir/file{2..4}</div><div class='add'>+</div><div class='add'>+# Remove file2 from 1st &amp; 3rd bricks</div><div class='add'>+TEST rm -f $B0/$V0"0"/dir/file2</div><div class='add'>+TEST rm -f $B0/$V0"2"/dir/file2</div><div class='add'>+</div><div class='add'>+# Remove file3 and the .glusterfs hardlink from 1st &amp; 2nd bricks</div><div class='add'>+gfid_file3=$(gf_get_gfid_xattr $B0/$V0"0"/dir/file3)</div><div class='add'>+gfid_str_file3=$(gf_gfid_xattr_to_str $gfid_file3)</div><div class='add'>+TEST rm $B0/$V0"0"/.glusterfs/${gfid_str_file3:0:2}/${gfid_str_file3:2:2}/$gfid_str_file3</div><div class='add'>+TEST rm $B0/$V0"1"/.glusterfs/${gfid_str_file3:0:2}/${gfid_str_file3:2:2}/$gfid_str_file3</div><div class='add'>+TEST rm -f $B0/$V0"0"/dir/file3</div><div class='add'>+TEST rm -f $B0/$V0"1"/dir/file3</div><div class='add'>+</div><div class='add'>+# Remove the .glusterfs hardlink and the gfid xattr of file4 on 3rd brick</div><div class='add'>+gfid_file4=$(gf_get_gfid_xattr $B0/$V0"0"/dir/file4)</div><div class='add'>+gfid_str_file4=$(gf_gfid_xattr_to_str $gfid_file4)</div><div class='add'>+TEST rm $B0/$V0"2"/.glusterfs/${gfid_str_file4:0:2}/${gfid_str_file4:2:2}/$gfid_str_file4</div><div class='add'>+TEST setfattr -x trusted.gfid $B0/$V0"2"/dir/file4</div><div class='add'>+</div><div class='add'>+# B0 and B2 blame each other</div><div class='add'>+setfattr -n trusted.afr.$V0-client-0 -v 0x000000000000000000000001 $B0/$V0"2"/dir</div><div class='add'>+setfattr -n trusted.afr.$V0-client-2 -v 0x000000000000000000000001 $B0/$V0"0"/dir</div><div class='add'>+</div><div class='add'>+# Add entry to xattrop dir on first brick.</div><div class='add'>+xattrop_dir0=$(afr_get_index_path $B0/$V0"0")</div><div class='add'>+base_entry_b0=`ls $xattrop_dir0`</div><div class='add'>+gfid_str=$(gf_gfid_xattr_to_str $(gf_get_gfid_xattr $B0/$V0"0"/dir/))</div><div class='add'>+TEST ln $xattrop_dir0/$base_entry_b0 $xattrop_dir0/$gfid_str</div><div class='add'>+</div><div class='add'>+EXPECT "^1$" get_pending_heal_count $V0</div><div class='add'>+</div><div class='add'>+# Launch heal</div><div class='add'>+TEST $CLI volume heal $V0 enable</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "^Y$" glustershd_up_status</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "^1$" afr_child_up_status_in_shd $V0 0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "^1$" afr_child_up_status_in_shd $V0 1</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "^1$" afr_child_up_status_in_shd $V0 2</div><div class='add'>+TEST $CLI volume heal $V0</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "^0$" get_pending_heal_count $V0</div><div class='add'>+</div><div class='add'>+# All the files must be present on all the bricks after conservative merge and</div><div class='add'>+# should have the gfid xattr and the .glusterfs hardlink.</div><div class='add'>+check_gfid_and_link_count dir/file1</div><div class='add'>+check_gfid_and_link_count dir/file2</div><div class='add'>+check_gfid_and_link_count dir/file3</div><div class='add'>+check_gfid_and_link_count dir/file4</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/bugs/replicate/bug-1756938-replica-3-sbrain-cli.t b/tests/bugs/replicate/bug-1756938-replica-3-sbrain-cli.t<br/>new file mode 100644<br/>index 00000000000..c1bdf34ee6d<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/replicate/bug-1756938-replica-3-sbrain-cli.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/replicate/bug-1756938-replica-3-sbrain-cli.t</a></div><div class='hunk'>@@ -0,0 +1,111 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+. $(dirname $0)/../../afr.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd;</div><div class='add'>+TEST pidof glusterd;</div><div class='add'>+TEST $CLI volume create $V0 replica 3 $H0:$B0/${V0}{0,1,2}</div><div class='add'>+TEST $CLI volume set $V0 features.shard enable</div><div class='add'>+TEST $CLI volume set $V0 features.shard-block-size 4MB</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status $V0 $H0 $B0/${V0}0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status $V0 $H0 $B0/${V0}1</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status $V0 $H0 $B0/${V0}2</div><div class='add'>+TEST glusterfs --volfile-server=$H0 --volfile-id=/$V0 $M0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status $V0 0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status $V0 1</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status $V0 2</div><div class='add'>+</div><div class='add'>+#Create split-brain by setting afr xattrs/gfids manually.</div><div class='add'>+#file1 is non-sharded and will be in data split-brain.</div><div class='add'>+#file2 will have one shard which will be in data split-brain.</div><div class='add'>+#file3 will have one shard which will be in gfid split-brain.</div><div class='add'>+#file4 will have one shard which will be in data &amp; metadata split-brain.</div><div class='add'>+TEST dd if=/dev/zero of=$M0/file1 bs=1024 count=1024 oflag=direct</div><div class='add'>+TEST dd if=/dev/zero of=$M0/file2 bs=1M count=6 oflag=direct</div><div class='add'>+TEST dd if=/dev/zero of=$M0/file3 bs=1M count=6 oflag=direct</div><div class='add'>+TEST dd if=/dev/zero of=$M0/file4 bs=1M count=6 oflag=direct</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+</div><div class='add'>+#-------------------------------------------------------------------------------</div><div class='add'>+TEST setfattr -n trusted.afr.$V0-client-1 -v 0x000000010000000000000000 $B0/${V0}0/file1</div><div class='add'>+TEST setfattr -n trusted.afr.$V0-client-2 -v 0x000000010000000000000000 $B0/${V0}0/file1</div><div class='add'>+TEST setfattr -n trusted.afr.$V0-client-0 -v 0x000000010000000000000000 $B0/${V0}1/file1</div><div class='add'>+TEST setfattr -n trusted.afr.$V0-client-2 -v 0x000000010000000000000000 $B0/${V0}1/file1</div><div class='add'>+TEST setfattr -n trusted.afr.$V0-client-0 -v 0x000000010000000000000000 $B0/${V0}2/file1</div><div class='add'>+TEST setfattr -n trusted.afr.$V0-client-1 -v 0x000000010000000000000000 $B0/${V0}2/file1</div><div class='add'>+</div><div class='add'>+#-------------------------------------------------------------------------------</div><div class='add'>+gfid_f2=$(gf_gfid_xattr_to_str $(gf_get_gfid_xattr $B0/${V0}0/file2))</div><div class='add'>+TEST setfattr -n trusted.afr.$V0-client-1 -v 0x000000010000000000000000 $B0/${V0}0/.shard/$gfid_f2.1</div><div class='add'>+TEST setfattr -n trusted.afr.$V0-client-2 -v 0x000000010000000000000000 $B0/${V0}0/.shard/$gfid_f2.1</div><div class='add'>+TEST setfattr -n trusted.afr.$V0-client-0 -v 0x000000010000000000000000 $B0/${V0}1/.shard/$gfid_f2.1</div><div class='add'>+TEST setfattr -n trusted.afr.$V0-client-2 -v 0x000000010000000000000000 $B0/${V0}1/.shard/$gfid_f2.1</div><div class='add'>+TEST setfattr -n trusted.afr.$V0-client-0 -v 0x000000010000000000000000 $B0/${V0}2/.shard/$gfid_f2.1</div><div class='add'>+TEST setfattr -n trusted.afr.$V0-client-1 -v 0x000000010000000000000000 $B0/${V0}2/.shard/$gfid_f2.1</div><div class='add'>+</div><div class='add'>+#-------------------------------------------------------------------------------</div><div class='add'>+TESTS_EXPECTED_IN_LOOP=5</div><div class='add'>+function assign_new_gfid {</div><div class='add'>+    brickpath=$1</div><div class='add'>+    filename=$2</div><div class='add'>+    gfid=$(gf_gfid_xattr_to_str $(gf_get_gfid_xattr $brickpath/$filename))</div><div class='add'>+    gfid_shard=$(gf_gfid_xattr_to_str $(gf_get_gfid_xattr $brickpath/.shard/$gfid.1))</div><div class='add'>+</div><div class='add'>+    TEST rm $brickpath/.glusterfs/${gfid_shard:0:2}/${gfid_shard:2:2}/$gfid_shard</div><div class='add'>+    TEST setfattr -x trusted.gfid $brickpath/.shard/$gfid.1</div><div class='add'>+    new_gfid=$(get_random_gfid)</div><div class='add'>+    new_gfid_str=$(gf_gfid_xattr_to_str $new_gfid)</div><div class='add'>+    TEST setfattr -n trusted.gfid -v $new_gfid $brickpath/.shard/$gfid.1</div><div class='add'>+    TEST mkdir -p $brickpath/.glusterfs/${new_gfid_str:0:2}/${new_gfid_str:2:2}</div><div class='add'>+    TEST ln $brickpath/.shard/$gfid.1 $brickpath/.glusterfs/${new_gfid_str:0:2}/${new_gfid_str:2:2}/$new_gfid_str</div><div class='add'>+}</div><div class='add'>+assign_new_gfid $B0/$V0"1" file3</div><div class='add'>+assign_new_gfid $B0/$V0"2" file3</div><div class='add'>+</div><div class='add'>+#-------------------------------------------------------------------------------</div><div class='add'>+gfid_f4=$(gf_gfid_xattr_to_str $(gf_get_gfid_xattr $B0/${V0}0/file4))</div><div class='add'>+TEST setfattr -n trusted.afr.$V0-client-1 -v 0x000000010000000100000000 $B0/${V0}0/.shard/$gfid_f4.1</div><div class='add'>+TEST setfattr -n trusted.afr.$V0-client-2 -v 0x000000010000000100000000 $B0/${V0}0/.shard/$gfid_f4.1</div><div class='add'>+TEST setfattr -n trusted.afr.$V0-client-0 -v 0x000000010000000100000000 $B0/${V0}1/.shard/$gfid_f4.1</div><div class='add'>+TEST setfattr -n trusted.afr.$V0-client-2 -v 0x000000010000000100000000 $B0/${V0}1/.shard/$gfid_f4.1</div><div class='add'>+TEST setfattr -n trusted.afr.$V0-client-0 -v 0x000000010000000100000000 $B0/${V0}2/.shard/$gfid_f4.1</div><div class='add'>+TEST setfattr -n trusted.afr.$V0-client-1 -v 0x000000010000000100000000 $B0/${V0}2/.shard/$gfid_f4.1</div><div class='add'>+</div><div class='add'>+#-------------------------------------------------------------------------------</div><div class='add'>+#Add entry to xattrop dir on first brick and check for split-brain.</div><div class='add'>+xattrop_dir0=$(afr_get_index_path $B0/$V0"0")</div><div class='add'>+base_entry_b0=`ls $xattrop_dir0`</div><div class='add'>+</div><div class='add'>+gfid_f1=$(gf_gfid_xattr_to_str $(gf_get_gfid_xattr $B0/$V0"0"/file1))</div><div class='add'>+TEST ln  $xattrop_dir0/$base_entry_b0 $xattrop_dir0/$gfid_f1</div><div class='add'>+</div><div class='add'>+gfid_f2_shard1=$(gf_gfid_xattr_to_str $(gf_get_gfid_xattr $B0/$V0"0"/.shard/$gfid_f2.1))</div><div class='add'>+TEST ln  $xattrop_dir0/$base_entry_b0 $xattrop_dir0/$gfid_f2_shard1</div><div class='add'>+</div><div class='add'>+gfid_f3=$(gf_gfid_xattr_to_str $(gf_get_gfid_xattr $B0/${V0}0/file3))</div><div class='add'>+gfid_f3_shard1=$(gf_gfid_xattr_to_str $(gf_get_gfid_xattr $B0/$V0"0"/.shard/$gfid_f3.1))</div><div class='add'>+TEST ln $xattrop_dir0/$base_entry_b0 $xattrop_dir0/$gfid_f3_shard1</div><div class='add'>+</div><div class='add'>+gfid_f4_shard1=$(gf_gfid_xattr_to_str $(gf_get_gfid_xattr $B0/$V0"0"/.shard/$gfid_f4.1))</div><div class='add'>+TEST ln  $xattrop_dir0/$base_entry_b0 $xattrop_dir0/$gfid_f4_shard1</div><div class='add'>+</div><div class='add'>+#-------------------------------------------------------------------------------</div><div class='add'>+#gfid split-brain won't show up in split-brain count.</div><div class='add'>+EXPECT "3" afr_get_split_brain_count $V0</div><div class='add'>+EXPECT_NOT "^0$" get_pending_heal_count $V0</div><div class='add'>+</div><div class='add'>+#Resolve split-brains</div><div class='add'>+TEST $CLI volume heal $V0 split-brain source-brick $H0:$B0/${V0}1 /file1</div><div class='add'>+GFIDSTR="gfid:$gfid_f2_shard1"</div><div class='add'>+TEST $CLI volume heal $V0 split-brain source-brick $H0:$B0/${V0}1 $GFIDSTR</div><div class='add'>+TEST $CLI volume heal $V0 split-brain source-brick $H0:$B0/${V0}1 /.shard/$gfid_f3.1</div><div class='add'>+TEST $CLI volume heal $V0 split-brain source-brick $H0:$B0/${V0}1 /.shard/$gfid_f4.1</div><div class='add'>+TEST $CLI volume heal $V0</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "^0$" get_pending_heal_count $V0</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/replicate/bug-1761531-metadata-heal-restore-time.t b/tests/bugs/replicate/bug-1761531-metadata-heal-restore-time.t<br/>new file mode 100644<br/>index 00000000000..7e24eaec03d<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/replicate/bug-1761531-metadata-heal-restore-time.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/replicate/bug-1761531-metadata-heal-restore-time.t</a></div><div class='hunk'>@@ -0,0 +1,74 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+. $(dirname $0)/../../afr.rc</div><div class='add'>+cleanup</div><div class='add'>+</div><div class='add'>+GET_MDATA_PATH=$(dirname $0)/../../utils</div><div class='add'>+build_tester $GET_MDATA_PATH/get-mdata-xattr.c</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 replica 3 $H0:$B0/brick{0..2}</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+TEST $GFS --volfile-id=/$V0 --volfile-server=$H0 $M0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 1</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 2</div><div class='add'>+</div><div class='add'>+TEST touch $M0/a</div><div class='add'>+sleep 1</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/brick0</div><div class='add'>+TEST touch $M0/a</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "^2$" get_pending_heal_count $V0</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status $V0 1</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "Y" glustershd_up_status</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 1</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 2</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "^0$" get_pending_heal_count $V0</div><div class='add'>+</div><div class='add'>+mtime0=$(get_mtime $B0/brick0/a)</div><div class='add'>+mtime1=$(get_mtime $B0/brick1/a)</div><div class='add'>+TEST [ $mtime0 -eq $mtime1 ]</div><div class='add'>+</div><div class='add'>+ctime0=$(get_ctime $B0/brick0/a)</div><div class='add'>+ctime1=$(get_ctime $B0/brick1/a)</div><div class='add'>+TEST [ $ctime0 -eq $ctime1 ]</div><div class='add'>+</div><div class='add'>+###############################################################################</div><div class='add'>+# Repeat the test with ctime feature disabled.</div><div class='add'>+TEST $CLI volume set $V0 features.ctime off</div><div class='add'>+</div><div class='add'>+TEST touch $M0/b</div><div class='add'>+sleep 1</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/brick0</div><div class='add'>+TEST touch $M0/b</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "^2$" get_pending_heal_count $V0</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status $V0 1</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "Y" glustershd_up_status</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 1</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 2</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "^0$" get_pending_heal_count $V0</div><div class='add'>+</div><div class='add'>+mtime2=$(get_mtime $B0/brick0/b)</div><div class='add'>+mtime3=$(get_mtime $B0/brick1/b)</div><div class='add'>+TEST [ $mtime2 -eq $mtime3 ]</div><div class='add'>+</div><div class='add'>+TEST rm $GET_MDATA_PATH/get-mdata-xattr</div><div class='add'>+</div><div class='add'>+TEST force_umount $M0</div><div class='add'>+TEST $CLI volume stop $V0</div><div class='add'>+TEST $CLI volume delete $V0</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/bugs/replicate/bug-1801624-entry-heal.t b/tests/bugs/replicate/bug-1801624-entry-heal.t<br/>new file mode 100644<br/>index 00000000000..94b465181fa<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/replicate/bug-1801624-entry-heal.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/replicate/bug-1801624-entry-heal.t</a></div><div class='hunk'>@@ -0,0 +1,58 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 replica 3 $H0:$B0/brick{0,1,2}</div><div class='add'>+TEST $CLI volume set $V0 heal-timeout 5</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 1</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 2</div><div class='add'>+TEST $CLI volume heal $V0 granular-entry-heal enable</div><div class='add'>+</div><div class='add'>+TEST glusterfs --volfile-id=/$V0 --volfile-server=$H0 $M0 --attribute-timeout=0 --entry-timeout=0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 1</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 2</div><div class='add'>+echo "Data"&gt;$M0/FILE</div><div class='add'>+ret=$?</div><div class='add'>+TEST [ $ret -eq 0 ]</div><div class='add'>+</div><div class='add'>+# Re-create the file when a brick is down.</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/brick1</div><div class='add'>+TEST rm $M0/FILE</div><div class='add'>+echo "New Data"&gt;$M0/FILE</div><div class='add'>+ret=$?</div><div class='add'>+TEST [ $ret -eq 0 ]</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "4" get_pending_heal_count $V0</div><div class='add'>+</div><div class='add'>+# Launching index heal must not reset parent dir afr xattrs or remove granular entry indices.</div><div class='add'>+$CLI volume heal $V0 # CLI will fail but heal is launched anyway.</div><div class='add'>+TEST sleep 5 # give index heal a chance to do one run.</div><div class='add'>+brick0_pending=$(get_hex_xattr trusted.afr.$V0-client-1 $B0/brick0/)</div><div class='add'>+brick2_pending=$(get_hex_xattr trusted.afr.$V0-client-1 $B0/brick2/)</div><div class='add'>+TEST [ $brick0_pending -eq "000000000000000000000002" ]</div><div class='add'>+TEST [ $brick2_pending -eq "000000000000000000000002" ]</div><div class='add'>+EXPECT "FILE" ls $B0/brick0/.glusterfs/indices/entry-changes/00000000-0000-0000-0000-000000000001/</div><div class='add'>+EXPECT "FILE" ls $B0/brick2/.glusterfs/indices/entry-changes/00000000-0000-0000-0000-000000000001/</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status $V0 $H0 $B0/brick1</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 1</div><div class='add'>+$CLI volume heal $V0</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "0" get_pending_heal_count $V0</div><div class='add'>+</div><div class='add'>+# No gfid-split-brain (i.e. EIO) must be seen. Try on fresh mount to avoid cached values.</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+TEST glusterfs --volfile-id=/$V0 --volfile-server=$H0 $M0 --attribute-timeout=0 --entry-timeout=0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 1</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 2</div><div class='add'>+TEST cat $M0/FILE</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/replicate/bug-765564.t b/tests/bugs/replicate/bug-765564.t<br/>new file mode 100644<br/>index 00000000000..098d225018f<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/replicate/bug-765564.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/replicate/bug-765564.t</a></div><div class='hunk'>@@ -0,0 +1,86 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+</div><div class='add'>+## Start and create a volume</div><div class='add'>+mkdir -p ${B0}/${V0}-0</div><div class='add'>+mkdir -p ${B0}/${V0}-1</div><div class='add'>+TEST $CLI volume create $V0 replica 2 $H0:$B0/${V0}-{0,1}</div><div class='add'>+</div><div class='add'>+TEST $CLI volume set $V0 performance.io-cache off;</div><div class='add'>+TEST $CLI volume set $V0 performance.write-behind off;</div><div class='add'>+TEST $CLI volume set $V0 performance.stat-prefetch off</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+</div><div class='add'>+## Mount native</div><div class='add'>+TEST glusterfs --volfile-server=$H0 --volfile-id=$V0 $M0</div><div class='add'>+</div><div class='add'>+#returns success if 'olddir' is absent</div><div class='add'>+#'olddir' must be absent in both replicas</div><div class='add'>+function rm_succeeded () {</div><div class='add'>+    local dir1=$1</div><div class='add'>+    [[ -d $H0:$B0/${V0}-0/$dir1 || -d $H0:$B0/${V0}-1/$dir1 ]] &amp;&amp; return 0</div><div class='add'>+    return 1</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+# returns successes if 'newdir' is present</div><div class='add'>+#'newdir' must be present in both replicas</div><div class='add'>+function mv_succeeded () {</div><div class='add'>+    local dir1=$1</div><div class='add'>+    [[ -d $H0:$B0/${V0}-0/$dir1 &amp;&amp; -d $H0:$B0/${V0}-1/$dir1 ]] &amp;&amp; return 1</div><div class='add'>+    return 0</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+# returns zero on success</div><div class='add'>+# Only one of rm and mv can succeed. This is captured by the XOR below</div><div class='add'>+</div><div class='add'>+function chk_backend_consistency(){</div><div class='add'>+    local dir1=$1</div><div class='add'>+    local dir2=$2</div><div class='add'>+    local rm_status=rm_succeeded $dir1</div><div class='add'>+    local mv_status=mv_succeeded $dir2</div><div class='add'>+    [[ ( $rm_status &amp;&amp; ! $mv_status ) || ( ! $rm_status &amp;&amp; $mv_status ) ]] &amp;&amp; return 0</div><div class='add'>+    return 1</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#concurrent removal/rename of dirs</div><div class='add'>+function rm_mv_correctness () {</div><div class='add'>+    ret=0</div><div class='add'>+    for i in {1..100}; do</div><div class='add'>+        mkdir $M0/"dir"$i</div><div class='add'>+        rmdir $M0/"dir"$i &amp;</div><div class='add'>+        mv $M0/"dir"$i $M0/"adir"$i &amp;</div><div class='add'>+        wait</div><div class='add'>+        tmp_ret=$(chk_backend_consistency "dir"$i "adir"$i)</div><div class='add'>+        (( ret += tmp_ret ))</div><div class='add'>+        rm -rf $M0/"dir"$i</div><div class='add'>+        rm -rf $M0/"adir"$i</div><div class='add'>+    done</div><div class='add'>+    return $ret</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+TEST touch $M0/a;</div><div class='add'>+TEST mv $M0/a $M0/b;</div><div class='add'>+</div><div class='add'>+#test rename fop when one of the bricks is down</div><div class='add'>+kill_brick ${V0} ${H0} ${B0}/${V0}-1;</div><div class='add'>+TEST touch $M0/h;</div><div class='add'>+TEST mv $M0/h $M0/1;</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0 force;</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status $V0 1;</div><div class='add'>+find $M0 2&gt;/dev/null 1&gt;/dev/null;</div><div class='add'>+find $M0 | xargs stat 2&gt;/dev/null 1&gt;/dev/null;</div><div class='add'>+</div><div class='add'>+TEST rm_mv_correctness;</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='head'>diff --git a/tests/bugs/replicate/bug-767585-gfid.t b/tests/bugs/replicate/bug-767585-gfid.t<br/>new file mode 100755<br/>index 00000000000..4176aabb544<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/replicate/bug-767585-gfid.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/replicate/bug-767585-gfid.t</a></div><div class='hunk'>@@ -0,0 +1,42 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+#Test cases to perform gfid-self-heal</div><div class='add'>+#file 'a' should be assigned a fresh gfid</div><div class='add'>+#file 'b' should be healed with gfid1 from brick1</div><div class='add'>+#file 'c' should be healed with gfid2 from brick2</div><div class='add'>+</div><div class='add'>+gfid1="0x8428b7193a764bf8be8046fb860b8993"</div><div class='add'>+gfid2="0x85ad91afa2f74694bf52c3326d048209"</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 replica 2 $H0:$B0/${V0}0 $H0:$B0/${V0}1</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+TEST glusterfs --volfile-id=/$V0 --volfile-server=$H0 $M0 --attribute-timeout=0 --entry-timeout=0 --direct-io-mode=enable</div><div class='add'>+touch $B0/${V0}0/a $B0/${V0}1/a</div><div class='add'>+touch $B0/${V0}0/b $B0/${V0}1/b</div><div class='add'>+touch $B0/${V0}0/c $B0/${V0}1/c</div><div class='add'>+</div><div class='add'>+TEST setfattr -n trusted.gfid -v $gfid1 $B0/${V0}0/b</div><div class='add'>+TEST setfattr -n trusted.gfid -v $gfid2 $B0/${V0}1/c</div><div class='add'>+</div><div class='add'>+sleep 2</div><div class='add'>+</div><div class='add'>+TEST stat $M0/a</div><div class='add'>+TEST stat $M0/b</div><div class='add'>+TEST stat $M0/c</div><div class='add'>+</div><div class='add'>+TEST gf_get_gfid_xattr $B0/${V0}0/a</div><div class='add'>+TEST gf_get_gfid_xattr $B0/${V0}1/a</div><div class='add'>+</div><div class='add'>+EXPECT "$gfid1" gf_get_gfid_xattr $B0/${V0}0/b</div><div class='add'>+EXPECT "$gfid1" gf_get_gfid_xattr $B0/${V0}1/b</div><div class='add'>+</div><div class='add'>+EXPECT "$gfid2" gf_get_gfid_xattr $B0/${V0}0/c</div><div class='add'>+EXPECT "$gfid2" gf_get_gfid_xattr $B0/${V0}1/c</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/replicate/bug-802417.t b/tests/bugs/replicate/bug-802417.t<br/>new file mode 100755<br/>index 00000000000..f213439401e<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/replicate/bug-802417.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/replicate/bug-802417.t</a></div><div class='hunk'>@@ -0,0 +1,120 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+function write_file()</div><div class='add'>+{</div><div class='add'>+	path="$1"; shift</div><div class='add'>+	echo "$*" &gt; "$path"</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+#####################################################</div><div class='add'>+# We are currently not triggering data heal unless all bricks of the replica are</div><div class='add'>+# up. We will need to modify this .t once the fix for preventing stale reads</div><div class='add'>+# being served to clients for files in spurious split-brains is done. Spurious</div><div class='add'>+# split-brains here means afr xattrs indicates sbrain but it is actually not.</div><div class='add'>+# Self-heal will heal such files automatically but before the heal completes,</div><div class='add'>+# reads can be served which needs fixing.</div><div class='add'>+#G_TESTDEF_TEST_STATUS_NETBSD7=BAD_TEST,BUG=000000</div><div class='add'>+#G_TESTDEF_TEST_STATUS_CENTOS6=BAD_TEST,BUG=000000</div><div class='add'>+######################################################</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume info;</div><div class='add'>+</div><div class='add'>+## Start and create a volume</div><div class='add'>+mkdir -p ${B0}/${V0}-0</div><div class='add'>+mkdir -p ${B0}/${V0}-1</div><div class='add'>+mkdir -p ${B0}/${V0}-2</div><div class='add'>+TEST $CLI volume create $V0 replica 3 $H0:$B0/${V0}-{0,1,2}</div><div class='add'>+</div><div class='add'>+## Verify volume is created</div><div class='add'>+EXPECT "$V0" volinfo_field $V0 'Volume Name';</div><div class='add'>+EXPECT 'Created' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+## Make sure io-cache and write-behind don't interfere.</div><div class='add'>+TEST $CLI volume set $V0 performance.io-cache off;</div><div class='add'>+TEST $CLI volume set $V0 performance.write-behind off;</div><div class='add'>+TEST $CLI volume set $V0 performance.stat-prefetch off</div><div class='add'>+</div><div class='add'>+## Make sure automatic self-heal doesn't perturb our results.</div><div class='add'>+TEST $CLI volume set $V0 cluster.self-heal-daemon off</div><div class='add'>+TEST $CLI volume set $V0 cluster.data-self-heal on</div><div class='add'>+</div><div class='add'>+## Start volume and verify</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+EXPECT 'Started' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+TEST $CLI volume set $V0 cluster.quorum-type none</div><div class='add'>+## Mount native</div><div class='add'>+TEST glusterfs --volfile-server=$H0 --volfile-id=$V0 $M0</div><div class='add'>+</div><div class='add'>+## Create a file with some recognizably stale data.</div><div class='add'>+TEST write_file $M0/a_file "old_data"</div><div class='add'>+</div><div class='add'>+## Kill two of the bricks and write some newer data.</div><div class='add'>+TEST kill_brick ${V0} ${H0} ${B0}/${V0}-1</div><div class='add'>+TEST kill_brick ${V0} ${H0} ${B0}/${V0}-2</div><div class='add'>+TEST write_file $M0/a_file "new_data"</div><div class='add'>+</div><div class='add'>+## Bring all the bricks up and kill one so we do a partial self-heal.</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status $V0 0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status $V0 1</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status $V0 2</div><div class='add'>+TEST kill_brick ${V0} ${H0} ${B0}/${V0}-2</div><div class='add'>+TEST dd if=${M0}/a_file of=/dev/null</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+obs_path_0=${B0}/${V0}-0/a_file</div><div class='add'>+obs_path_1=${B0}/${V0}-1/a_file</div><div class='add'>+obs_path_2=${B0}/${V0}-2/a_file</div><div class='add'>+</div><div class='add'>+tgt_xattr_0="trusted.afr.${V0}-client-0"</div><div class='add'>+tgt_xattr_1="trusted.afr.${V0}-client-1"</div><div class='add'>+tgt_xattr_2="trusted.afr.${V0}-client-2"</div><div class='add'>+</div><div class='add'>+actual=$(afr_get_changelog_xattr $obs_path_0 $tgt_xattr_0)</div><div class='add'>+EXPECT "0x000000000000000000000000|^\$" echo $actual</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "0x000000000000000000000000" \</div><div class='add'>+afr_get_changelog_xattr $obs_path_0 $tgt_xattr_1</div><div class='add'>+</div><div class='add'>+actual=$(afr_get_changelog_xattr $obs_path_0 $tgt_xattr_2)</div><div class='add'>+EXPECT "0x000000030000000000000000" echo $actual</div><div class='add'>+</div><div class='add'>+actual=$(afr_get_changelog_xattr $obs_path_1 $tgt_xattr_0)</div><div class='add'>+EXPECT "0x000000000000000000000000|^\$" echo $actual</div><div class='add'>+</div><div class='add'>+actual=$(afr_get_changelog_xattr $obs_path_1 $tgt_xattr_1)</div><div class='add'>+EXPECT "0x000000000000000000000000|^\$" echo $actual</div><div class='add'>+</div><div class='add'>+actual=$(afr_get_changelog_xattr $obs_path_1 $tgt_xattr_2)</div><div class='add'>+EXPECT "0x000000010000000000000000" echo $actual</div><div class='add'>+</div><div class='add'>+actual=$(afr_get_changelog_xattr $obs_path_2 $tgt_xattr_0)</div><div class='add'>+EXPECT "0x000000000000000000000000|^\$" echo $actual</div><div class='add'>+</div><div class='add'>+actual=$(afr_get_changelog_xattr $obs_path_2 $tgt_xattr_1)</div><div class='add'>+EXPECT "0x000000000000000000000000|^\$" echo $actual</div><div class='add'>+</div><div class='add'>+actual=$(afr_get_changelog_xattr $obs_path_2 $tgt_xattr_2)</div><div class='add'>+EXPECT "0x000000000000000000000000|^\$" echo $actual</div><div class='add'>+</div><div class='add'>+if [ "$EXIT_EARLY" = "1" ]; then</div><div class='add'>+	exit 0;</div><div class='add'>+fi</div><div class='add'>+</div><div class='add'>+## Finish up</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+TEST $CLI volume stop $V0;</div><div class='add'>+EXPECT 'Stopped' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+TEST $CLI volume delete $V0;</div><div class='add'>+TEST ! $CLI volume info $V0;</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/replicate/bug-821056.t b/tests/bugs/replicate/bug-821056.t<br/>new file mode 100644<br/>index 00000000000..81186d86309<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/replicate/bug-821056.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/replicate/bug-821056.t</a></div><div class='hunk'>@@ -0,0 +1,52 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 replica 2 $H0:$B0/${V0}{0,1}</div><div class='add'>+TEST $CLI volume set $V0 cluster.eager-lock off</div><div class='add'>+TEST $CLI volume set $V0 cluster.self-heal-daemon off</div><div class='add'>+TEST $CLI volume set $V0 performance.quick-read off</div><div class='add'>+TEST $CLI volume set $V0 performance.open-behind off</div><div class='add'>+TEST $CLI volume set $V0 performance.io-cache off</div><div class='add'>+TEST $CLI volume set $V0 performance.write-behind on</div><div class='add'>+TEST $CLI volume set $V0 performance.stat-prefetch off</div><div class='add'>+TEST $CLI volume set $V0 performance.read-ahead off</div><div class='add'>+TEST $CLI volume set $V0 cluster.background-self-heal-count 0</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+TEST glusterfs --entry-timeout=0 --attribute-timeout=0 -s $H0 --volfile-id=$V0 $M0 --direct-io-mode=enable</div><div class='add'>+touch $M0/a</div><div class='add'>+</div><div class='add'>+#Open file with fd as 5</div><div class='add'>+exec 5&gt;$M0/a</div><div class='add'>+realpath=$(gf_get_gfid_backend_file_path $B0/${V0}0 "a")</div><div class='add'>+</div><div class='add'>+kill_brick $V0 $H0 $B0/${V0}0</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status $V0 0</div><div class='add'>+</div><div class='add'>+EXPECT "Y" gf_check_file_opened_in_brick $V0 $H0 $B0/${V0}0 "$realpath"</div><div class='add'>+</div><div class='add'>+kill_brick $V0 $H0 $B0/${V0}0</div><div class='add'>+TEST gf_rm_file_and_gfid_link $B0/${V0}0 "a"</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status $V0 0</div><div class='add'>+ls -l $M0/a &gt; /dev/null 2&gt;&amp;1  #Make sure the file is re-created</div><div class='add'>+EXPECT "N" gf_check_file_opened_in_brick $V0 $H0 $B0/${V0}0 "$realpath"</div><div class='add'>+EXPECT "N" gf_check_file_opened_in_brick $V0 $H0 $B0/${V0}0 $B0/${V0}0/a</div><div class='add'>+</div><div class='add'>+for i in {1..1024}; do</div><div class='add'>+        echo "open sesame" &gt;&amp;5</div><div class='add'>+done</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $REOPEN_TIMEOUT "Y" gf_check_file_opened_in_brick $V0 $H0 $B0/${V0}0 "$realpath"</div><div class='add'>+#close the fd</div><div class='add'>+exec 5&gt;&amp;-</div><div class='add'>+</div><div class='add'>+#Check that anon-fd based file is not leaking.</div><div class='add'>+EXPECT_WITHIN $REOPEN_TIMEOUT "N" gf_check_file_opened_in_brick $V0 $H0 $B0/${V0}0 "$realpath"</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/replicate/bug-830665.t b/tests/bugs/replicate/bug-830665.t<br/>new file mode 100755<br/>index 00000000000..68180424803<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/replicate/bug-830665.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/replicate/bug-830665.t</a></div><div class='hunk'>@@ -0,0 +1,127 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../nfs.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+#G_TESTDEF_TEST_STATUS_CENTOS6=NFS_TEST</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+function recreate {</div><div class='add'>+	rm -rf $1 &amp;&amp; mkdir -p $1</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume info;</div><div class='add'>+</div><div class='add'>+## Start and create a volume</div><div class='add'>+recreate ${B0}/${V0}-0</div><div class='add'>+recreate ${B0}/${V0}-1</div><div class='add'>+TEST $CLI volume create $V0 replica 2 $H0:$B0/${V0}-{0,1}</div><div class='add'>+TEST $CLI volume set $V0 nfs.disable false</div><div class='add'>+</div><div class='add'>+function volinfo_field()</div><div class='add'>+{</div><div class='add'>+    local vol=$1;</div><div class='add'>+    local field=$2;</div><div class='add'>+</div><div class='add'>+    $CLI volume info $vol | grep "^$field: " | sed 's/.*: //';</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#EXPECT_WITHIN fails the test if the command it executes fails. This function</div><div class='add'>+#returns "" when the file doesn't exist</div><div class='add'>+function friendly_cat {</div><div class='add'>+        if [ ! -f $1 ];</div><div class='add'>+        then</div><div class='add'>+                echo "";</div><div class='add'>+        else</div><div class='add'>+                cat $1;</div><div class='add'>+        fi</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+## Verify volume is created</div><div class='add'>+EXPECT "$V0" volinfo_field $V0 'Volume Name';</div><div class='add'>+EXPECT 'Created' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+## Make sure stat-prefetch doesn't prevent self-heal checks.</div><div class='add'>+TEST $CLI volume set $V0 performance.stat-prefetch off;</div><div class='add'>+</div><div class='add'>+## Make sure automatic self-heal doesn't perturb our results.</div><div class='add'>+TEST $CLI volume set $V0 cluster.self-heal-daemon off</div><div class='add'>+TEST $CLI volume set $V0 cluster.background-self-heal-count 0</div><div class='add'>+</div><div class='add'>+## Start volume and verify</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+EXPECT 'Started' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $NFS_EXPORT_TIMEOUT "1" is_nfs_export_available;</div><div class='add'>+## Mount NFS</div><div class='add'>+TEST mount_nfs $H0:/$V0 $N0 nolock;</div><div class='add'>+</div><div class='add'>+## Create some files and directories</div><div class='add'>+echo "test_data" &gt; $N0/a_file;</div><div class='add'>+mkdir $N0/a_dir;</div><div class='add'>+echo "more_test_data" &gt; $N0/a_dir/another_file;</div><div class='add'>+</div><div class='add'>+## Unmount and stop the volume.</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $N0</div><div class='add'>+TEST $CLI volume stop $V0;</div><div class='add'>+</div><div class='add'>+# Recreate the brick. Note that because of http://review.gluster.org/#change,4202</div><div class='add'>+# we need to preserve and restore the volume ID or else the brick (and thus the</div><div class='add'>+# entire not-very-HA-any-more volume) won't start. When that bug is fixed, we can</div><div class='add'>+# remove the [gs]etxattr calls.</div><div class='add'>+volid=$(getfattr -e hex -n trusted.glusterfs.volume-id $B0/${V0}-0 2&gt; /dev/null \</div><div class='add'>+	| grep = | cut -d= -f2)</div><div class='add'>+rm -rf $B0/${V0}-0;</div><div class='add'>+mkdir $B0/${V0}-0;</div><div class='add'>+#Ideally, disk replacement is done using reset-brick or replace-brick gluster CLI</div><div class='add'>+#which will create .glusterfs folder.</div><div class='add'>+mkdir $B0/${V0}-0/.glusterfs &amp;&amp; chmod 600 $B0/${V0}-0/.glusterfs</div><div class='add'>+</div><div class='add'>+setfattr -n trusted.glusterfs.volume-id -v $volid $B0/${V0}-0</div><div class='add'>+</div><div class='add'>+## Restart and remount. Note that we use actimeo=0 so that the stat calls</div><div class='add'>+## we need for self-heal don't get blocked by the NFS client.</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+EXPECT_WITHIN $NFS_EXPORT_TIMEOUT "1" is_nfs_export_available;</div><div class='add'>+TEST mount_nfs $H0:/$V0 $N0 nolock,actimeo=0;</div><div class='add'>+</div><div class='add'>+## The Linux NFS client has a really charming habit of caching stuff right</div><div class='add'>+## after mount, even though we set actimeo=0 above. Life would be much easier</div><div class='add'>+## if NFS developers cared as much about correctness as they do about shaving</div><div class='add'>+## a few seconds off of benchmarks.</div><div class='add'>+ls -l $N0 &amp;&gt; /dev/null;</div><div class='add'>+sleep 5;</div><div class='add'>+</div><div class='add'>+## Force entry self-heal.</div><div class='add'>+TEST $CLI volume set $V0 cluster.self-heal-daemon on</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "Y" glustershd_up_status</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 1</div><div class='add'>+TEST gluster volume heal $V0 full</div><div class='add'>+#ls -lR $N0 &gt; /dev/null;</div><div class='add'>+</div><div class='add'>+## Do NOT check through the NFS mount here. That will force a new self-heal</div><div class='add'>+## check, but we want to test whether self-heal already happened.</div><div class='add'>+</div><div class='add'>+## Make sure everything's in order on the recreated brick.</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT 'test_data' friendly_cat $B0/${V0}-0/a_file;</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT 'more_test_data' friendly_cat $B0/${V0}-0/a_dir/another_file;</div><div class='add'>+</div><div class='add'>+if [ "$EXIT_EARLY" = "1" ]; then</div><div class='add'>+	exit 0;</div><div class='add'>+fi</div><div class='add'>+</div><div class='add'>+## Finish up</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $N0</div><div class='add'>+TEST $CLI volume stop $V0;</div><div class='add'>+EXPECT 'Stopped' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+TEST $CLI volume delete $V0;</div><div class='add'>+TEST ! $CLI volume info $V0;</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/replicate/bug-859581.t b/tests/bugs/replicate/bug-859581.t<br/>new file mode 100755<br/>index 00000000000..d8b45a257a1<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/replicate/bug-859581.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/replicate/bug-859581.t</a></div><div class='hunk'>@@ -0,0 +1,53 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 replica 2 $H0:$B0/${V0}{1,2}</div><div class='add'>+EXPECT 'Created' volinfo_field $V0 'Status';</div><div class='add'>+TEST $CLI volume set $V0 performance.stat-prefetch off</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+EXPECT 'Started' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+TEST glusterfs --direct-io-mode=yes --use-readdirp=no --entry-timeout=0 --attribute-timeout=0 -s $H0 --volfile-id $V0 $M0;</div><div class='add'>+</div><div class='add'>+mkdir -p $M0/dir1/dir2</div><div class='add'>+</div><div class='add'>+TEST rm -f $(gf_get_gfid_backend_file_path $B0/${V0}1 "dir1")</div><div class='add'>+TEST rmdir $B0/${V0}1/dir1/dir2</div><div class='add'>+</div><div class='add'>+TEST stat $M0/dir1/dir2</div><div class='add'>+</div><div class='add'>+TEST [ -d $B0/${V0}1/dir1/dir2 ]</div><div class='add'>+TEST [ ! -d $(gf_get_gfid_backend_file_path $B0/${V0}1 "dir1") ]</div><div class='add'>+</div><div class='add'>+# Stop the volume to flush caches and force symlink recreation</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+TEST $CLI volume stop $V0</div><div class='add'>+EXPECT 'Stopped' volinfo_field $V0 'Status';</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+EXPECT 'Started' volinfo_field $V0 'Status';</div><div class='add'>+TEST glusterfs --entry-timeout=0 --attribute-timeout=0 -s $H0 --volfile-id $V0 $M0;</div><div class='add'>+</div><div class='add'>+# Till now, protocol/server was not doing inode linking as part of readdirp.</div><div class='add'>+# But pas part of user servicable snapshots patcth, changes to do inode linking</div><div class='add'>+# in protocol/server in readdirp,  were introduced. So now to make sure</div><div class='add'>+# the gfid handle of dir1 is healed, explicit lookup has to be sent on it.</div><div class='add'>+# Otherwise, whenever ls -l is done just on the mount point $M0, lookup on the</div><div class='add'>+# entries received as part of readdirp, is not sent, because the inodes for</div><div class='add'>+# those entries were linked as part of readdirp itself. i.e instead of doing</div><div class='add'>+# "ls -l $M0", it has to be the below command.</div><div class='add'>+ls -l $M0/dir1;</div><div class='add'>+</div><div class='add'>+TEST [ -h $(gf_get_gfid_backend_file_path $B0/${V0}1 "dir1") ]</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+TEST $CLI volume stop $V0</div><div class='add'>+TEST $CLI volume delete $V0</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='add'>+</div><div class='head'>diff --git a/tests/bugs/replicate/bug-865825.t b/tests/bugs/replicate/bug-865825.t<br/>new file mode 100755<br/>index 00000000000..ffb2e0f6437<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/replicate/bug-865825.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/replicate/bug-865825.t</a></div><div class='hunk'>@@ -0,0 +1,82 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume info;</div><div class='add'>+</div><div class='add'>+## Start and create a volume</div><div class='add'>+mkdir -p ${B0}/${V0}-0</div><div class='add'>+mkdir -p ${B0}/${V0}-1</div><div class='add'>+mkdir -p ${B0}/${V0}-2</div><div class='add'>+TEST $CLI volume create $V0 replica 3 $H0:$B0/${V0}-{0,1,2}</div><div class='add'>+</div><div class='add'>+function volinfo_field()</div><div class='add'>+{</div><div class='add'>+    local vol=$1;</div><div class='add'>+    local field=$2;</div><div class='add'>+</div><div class='add'>+    $CLI volume info $vol | grep "^$field: " | sed 's/.*: //';</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+## Verify volume is created</div><div class='add'>+EXPECT "$V0" volinfo_field $V0 'Volume Name';</div><div class='add'>+EXPECT 'Created' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+## Make sure io-cache and write-behind don't interfere.</div><div class='add'>+TEST $CLI volume set $V0 cluster.background-self-heal-count 0</div><div class='add'>+TEST $CLI volume set $V0 performance.io-cache off;</div><div class='add'>+TEST $CLI volume set $V0 performance.quick-read off;</div><div class='add'>+TEST $CLI volume set $V0 performance.write-behind off;</div><div class='add'>+TEST $CLI volume set $V0 performance.stat-prefetch off</div><div class='add'>+</div><div class='add'>+## Make sure automatic self-heal doesn't perturb our results.</div><div class='add'>+TEST $CLI volume set $V0 cluster.self-heal-daemon off</div><div class='add'>+</div><div class='add'>+## Start volume and verify</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+EXPECT 'Started' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+## Mount native</div><div class='add'>+TEST glusterfs --volfile-server=$H0 --volfile-id=$V0 $M0</div><div class='add'>+</div><div class='add'>+## Create a file with some recognizable contents.</div><div class='add'>+echo "test_data" &gt; $M0/a_file;</div><div class='add'>+</div><div class='add'>+## Unmount.</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+</div><div class='add'>+## Mess with the flags as though brick-0 accuses brick-2 while brick-1 is</div><div class='add'>+## missing its brick-2 changelog altogether.</div><div class='add'>+value=0x000000010000000000000000</div><div class='add'>+setfattr -n trusted.afr.${V0}-client-2 -v $value $B0/${V0}-0/a_file</div><div class='add'>+setfattr -x trusted.afr.${V0}-client-2 $B0/${V0}-1/a_file</div><div class='add'>+echo "wrong_data" &gt; $B0/${V0}-2/a_file</div><div class='add'>+</div><div class='add'>+gluster volume set $V0 cluster.self-heal-daemon on</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "Y" glustershd_up_status</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 1</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 2</div><div class='add'>+gluster volume heal $V0 full</div><div class='add'>+</div><div class='add'>+## Make sure brick 2 now has the correct contents.</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "test_data" cat $B0/${V0}-2/a_file</div><div class='add'>+</div><div class='add'>+if [ "$EXIT_EARLY" = "1" ]; then</div><div class='add'>+	exit 0;</div><div class='add'>+fi</div><div class='add'>+</div><div class='add'>+## Finish up</div><div class='add'>+TEST $CLI volume stop $V0;</div><div class='add'>+EXPECT 'Stopped' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+TEST $CLI volume delete $V0;</div><div class='add'>+TEST ! $CLI volume info $V0;</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/replicate/bug-880898.t b/tests/bugs/replicate/bug-880898.t<br/>new file mode 100644<br/>index 00000000000..660d34ca25f<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/replicate/bug-880898.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/replicate/bug-880898.t</a></div><div class='hunk'>@@ -0,0 +1,30 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST $CLI volume create $V0 replica 2 $H0:$B0/brick1 $H0:$B0/brick2</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+EXPECT 'Started' volinfo_field $V0 'Status'</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status $V0 $H0 $B0/brick1</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status $V0 $H0 $B0/brick2</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "Y" glustershd_up_status</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 1</div><div class='add'>+pkill glusterfs</div><div class='add'>+uuid=""</div><div class='add'>+for line in $(cat $GLUSTERD_WORKDIR/glusterd.info)</div><div class='add'>+do</div><div class='add'>+	if [[ $line == UUID* ]]</div><div class='add'>+	then</div><div class='add'>+		uuid=`echo $line | sed -r 's/^.{5}//'`</div><div class='add'>+	fi</div><div class='add'>+done</div><div class='add'>+</div><div class='add'>+#Command execution should fail reporting that the bricks are not running.</div><div class='add'>+TEST ! $CLI volume heal $V0 info</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/replicate/bug-884328.t b/tests/bugs/replicate/bug-884328.t<br/>new file mode 100644<br/>index 00000000000..acc8e542240<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/replicate/bug-884328.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/replicate/bug-884328.t</a></div><div class='hunk'>@@ -0,0 +1,12 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+</div><div class='add'>+TEST check_option_help_presence "cluster.quorum-type"</div><div class='add'>+TEST check_option_help_presence "cluster.quorum-count"</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/replicate/bug-886998.t b/tests/bugs/replicate/bug-886998.t<br/>new file mode 100644<br/>index 00000000000..bcac235ff09<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/replicate/bug-886998.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/replicate/bug-886998.t</a></div><div class='hunk'>@@ -0,0 +1,52 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+# This tests that the replicate trash directory(.landfill) has following</div><div class='add'>+# properties.</div><div class='add'>+# Note: This is to have backward compatibility with 3.3 glusterfs</div><div class='add'>+#       In the latest releases this dir is present inside .glusterfs of brick.</div><div class='add'>+# 1) lookup of trash dir fails</div><div class='add'>+# 2) readdir does not show this directory</div><div class='add'>+# 3) Self-heal does not do any self-heal of these directories.</div><div class='add'>+gfid1="0xc2e75dde97f346e7842d1076a8e699f8"</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 replica 2 $H0:$B0/${V0}0 $H0:$B0/${V0}1</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+TEST glusterfs --volfile-id=/$V0 --volfile-server=$H0 $M0 --attribute-timeout=0 --entry-timeout=0 --direct-io-mode=enable</div><div class='add'>+</div><div class='add'>+TEST mkdir $B0/${V0}1/.landfill</div><div class='add'>+TEST setfattr -n trusted.gfid -v $gfid1 $B0/${V0}1/.landfill</div><div class='add'>+TEST mkdir $B0/${V0}0/.landfill</div><div class='add'>+TEST setfattr -n trusted.gfid -v $gfid1 $B0/${V0}0/.landfill</div><div class='add'>+</div><div class='add'>+TEST ! stat $M0/.landfill</div><div class='add'>+EXPECT "" echo $(ls -a $M0 | grep ".landfill")</div><div class='add'>+</div><div class='add'>+TEST rmdir $B0/${V0}0/.landfill</div><div class='add'>+#Force a conservative merge and it should not create .landfill</div><div class='add'>+TEST setfattr -n trusted.afr.$V0-client-0 -v 0x000000000000000000000000 $B0/${V0}0/</div><div class='add'>+TEST setfattr -n trusted.afr.$V0-client-1 -v 0x000000000000000000000001 $B0/${V0}0/</div><div class='add'>+</div><div class='add'>+TEST setfattr -n trusted.afr.$V0-client-0 -v 0x000000000000000000000001 $B0/${V0}1/</div><div class='add'>+TEST setfattr -n trusted.afr.$V0-client-1 -v 0x000000000000000000000000 $B0/${V0}1/</div><div class='add'>+</div><div class='add'>+EXPECT "" echo $(ls -a $M0 | grep ".landfill")</div><div class='add'>+TEST ! stat $B0/${V0}0/.landfill</div><div class='add'>+TEST stat $B0/${V0}1/.landfill</div><div class='add'>+</div><div class='add'>+#TEST that the dir is not deleted even when xattrs suggest to delete</div><div class='add'>+TEST setfattr -n trusted.afr.$V0-client-0 -v 0x000000000000000000000000 $B0/${V0}0/</div><div class='add'>+TEST setfattr -n trusted.afr.$V0-client-1 -v 0x000000000000000000000001 $B0/${V0}0/</div><div class='add'>+</div><div class='add'>+TEST setfattr -n trusted.afr.$V0-client-0 -v 0x000000000000000000000000 $B0/${V0}1/</div><div class='add'>+TEST setfattr -n trusted.afr.$V0-client-1 -v 0x000000000000000000000000 $B0/${V0}1/</div><div class='add'>+</div><div class='add'>+EXPECT "" echo $(ls -a $M0 | grep ".landfill")</div><div class='add'>+TEST ! stat $B0/${V0}0/.landfill</div><div class='add'>+TEST stat $B0/${V0}1/.landfill</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/replicate/bug-888174.t b/tests/bugs/replicate/bug-888174.t<br/>new file mode 100644<br/>index 00000000000..8c70265513d<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/replicate/bug-888174.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/replicate/bug-888174.t</a></div><div class='hunk'>@@ -0,0 +1,62 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+#This tests if flush, fsync wakes up the delayed post-op or not.</div><div class='add'>+#If it is not woken up, INODELK from the next command waits</div><div class='add'>+#for post-op-delay secs. There would be pending changelog even after the command</div><div class='add'>+#completes.</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 replica 2 $H0:$B0/r2_0 $H0:$B0/r2_1</div><div class='add'>+</div><div class='add'>+TEST $CLI volume set $V0 cluster.eager-lock on</div><div class='add'>+</div><div class='add'>+TEST $CLI volume set $V0 performance.flush-behind off</div><div class='add'>+EXPECT "off" volume_option $V0 performance.flush-behind</div><div class='add'>+</div><div class='add'>+TEST $CLI volume set $V0 cluster.post-op-delay-secs 3</div><div class='add'>+EXPECT "3" volume_option $V0 cluster.post-op-delay-secs</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+TEST glusterfs --entry-timeout=0 --attribute-timeout=0 -s $H0 --volfile-id=$V0 $M0</div><div class='add'>+</div><div class='add'>+#Check that INODELK MAX latency is not in the order of seconds</div><div class='add'>+TEST gluster volume profile $V0 start</div><div class='add'>+for i in {1..5}</div><div class='add'>+do</div><div class='add'>+        echo hi &gt; $M0/a</div><div class='add'>+done</div><div class='add'>+#Test if the MAX INODELK fop latency is of the order of seconds.</div><div class='add'>+inodelk_max_latency=$($CLI volume profile $V0 info | grep INODELK | awk 'BEGIN {max = 0} {if ($6 &gt; max) max=$6;} END {print max}' | cut -d. -f 1 | egrep "[0-9]{7,}")</div><div class='add'>+</div><div class='add'>+TEST [ -z $inodelk_max_latency ]</div><div class='add'>+</div><div class='add'>+TEST dd of=$M0/a if=/dev/urandom bs=1024k count=10 conv=fsync</div><div class='add'>+#Check for no trace of pending changelog. Flush should make sure of it.</div><div class='add'>+EXPECT "0x000000000000000000000000" afr_get_changelog_xattr $B0/r2_0/a trusted.afr.dirty</div><div class='add'>+EXPECT "0x000000000000000000000000" afr_get_changelog_xattr $B0/r2_1/a trusted.afr.dirty</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+dd of=$M0/a if=/dev/urandom bs=1024k count=1024 2&gt;/dev/null &amp;</div><div class='add'>+p=$!</div><div class='add'>+#trigger graph switches, tests for fsync not leaving any pending flags</div><div class='add'>+TEST $CLI volume set $V0 performance.quick-read off</div><div class='add'>+TEST $CLI volume set $V0 performance.io-cache off</div><div class='add'>+TEST $CLI volume set $V0 performance.stat-prefetch off</div><div class='add'>+TEST $CLI volume set $V0 performance.read-ahead off</div><div class='add'>+</div><div class='add'>+kill -TERM $p</div><div class='add'>+#wait for dd to exit</div><div class='add'>+wait  &gt; /dev/null 2&gt;&amp;1</div><div class='add'>+</div><div class='add'>+#Goal is to check if there is permanent FOOL changelog</div><div class='add'>+sleep 5</div><div class='add'>+EXPECT "0x000000000000000000000000" afr_get_changelog_xattr $B0/r2_0/a trusted.afr.dirty</div><div class='add'>+EXPECT "0x000000000000000000000000" afr_get_changelog_xattr $B0/r2_1/a trusted.afr.dirty</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/replicate/bug-913051.t b/tests/bugs/replicate/bug-913051.t<br/>new file mode 100644<br/>index 00000000000..6794995e6fe<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/replicate/bug-913051.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/replicate/bug-913051.t</a></div><div class='hunk'>@@ -0,0 +1,56 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+. $(dirname $0)/../../fileio.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+#Test that afr opens the file on the bricks that were offline at the time of</div><div class='add'>+# open after the brick comes online. This tests for writev, readv triggering</div><div class='add'>+# open-fd-fix in afr.</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 replica 2 $H0:$B0/${V0}0 $H0:$B0/${V0}1</div><div class='add'>+TEST $CLI volume set $V0 cluster.self-heal-daemon off</div><div class='add'>+TEST $CLI volume set $V0 performance.quick-read off</div><div class='add'>+TEST $CLI volume set $V0 performance.open-behind off</div><div class='add'>+TEST $CLI volume set $V0 performance.io-cache off</div><div class='add'>+TEST $CLI volume set $V0 performance.write-behind off</div><div class='add'>+TEST $CLI volume set $V0 performance.stat-prefetch off</div><div class='add'>+TEST $CLI volume set $V0 performance.read-ahead off</div><div class='add'>+TEST $CLI volume set $V0 cluster.background-self-heal-count 0</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+TEST $GFS --entry-timeout=0 --attribute-timeout=0 -s $H0 --volfile-id=$V0 --direct-io-mode=enable $M0</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}0</div><div class='add'>+</div><div class='add'>+TEST mkdir $M0/dir</div><div class='add'>+TEST touch $M0/dir/a</div><div class='add'>+TEST touch $M0/dir/b</div><div class='add'>+echo abc &gt; $M0/dir/b</div><div class='add'>+</div><div class='add'>+TEST wfd=`fd_available`</div><div class='add'>+TEST fd_open $wfd "w" $M0/dir/a</div><div class='add'>+TEST rfd=`fd_available`</div><div class='add'>+TEST fd_open $rfd "r" $M0/dir/b</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status $V0 0</div><div class='add'>+</div><div class='add'>+#attempt self-heal so that the files are created on brick-0</div><div class='add'>+</div><div class='add'>+TEST dd if=$M0/dir/a of=/dev/null bs=1024k</div><div class='add'>+TEST dd if=$M0/dir/b of=/dev/null bs=1024k</div><div class='add'>+</div><div class='add'>+#trigger writev for attempting open-fd-fix in afr</div><div class='add'>+TEST fd_write $wfd "open sesame"</div><div class='add'>+</div><div class='add'>+#trigger readv for attempting open-fd-fix in afr</div><div class='add'>+TEST fd_cat $rfd</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $REOPEN_TIMEOUT "Y" gf_check_file_opened_in_brick $V0 $H0 $B0/${V0}0 "$realpatha"</div><div class='add'>+EXPECT_WITHIN $REOPEN_TIMEOUT "Y" gf_check_file_opened_in_brick $V0 $H0 $B0/${V0}0 "$realpathb"</div><div class='add'>+</div><div class='add'>+TEST fd_close $wfd</div><div class='add'>+TEST fd_close $rfd</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/replicate/bug-916226.t b/tests/bugs/replicate/bug-916226.t<br/>new file mode 100644<br/>index 00000000000..893905f9a47<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/replicate/bug-916226.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/replicate/bug-916226.t</a></div><div class='hunk'>@@ -0,0 +1,26 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 replica 2 $H0:$B0/${V0}0 $H0:$B0/${V0}1 $H0:$B0/${V0}2 $H0:$B0/${V0}3</div><div class='add'>+TEST $CLI volume set $V0 cluster.eager-lock on</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+## Mount FUSE</div><div class='add'>+TEST glusterfs -s $H0 --volfile-id $V0 $M0;</div><div class='add'>+</div><div class='add'>+TEST mkdir $M0/dir{1..10};</div><div class='add'>+TEST touch $M0/dir{1..10}/files{1..10};</div><div class='add'>+</div><div class='add'>+TEST $CLI volume add-brick $V0 $H0:$B0/${V0}4 $H0:/$B0/${V0}5</div><div class='add'>+</div><div class='add'>+TEST $CLI volume rebalance $V0 start force</div><div class='add'>+EXPECT_WITHIN $REBALANCE_TIMEOUT "completed" rebalance_status_field $V0</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/replicate/bug-918437-sh-mtime.t b/tests/bugs/replicate/bug-918437-sh-mtime.t<br/>new file mode 100644<br/>index 00000000000..6a194b14a9b<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/replicate/bug-918437-sh-mtime.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/replicate/bug-918437-sh-mtime.t</a></div><div class='hunk'>@@ -0,0 +1,71 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+function get_mtime {</div><div class='add'>+        local f=$1</div><div class='add'>+        stat $f | grep Modify | awk '{print $2 $3}' | cut -f1 -d'.'</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function file_exists {</div><div class='add'>+        if [ -f $1 ]; then echo "Y"; else echo "N"; fi</div><div class='add'>+}</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+## Tests if mtime is correct after self-heal.</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST mkdir -p $B0/gfs0/brick0{1,2}</div><div class='add'>+TEST $CLI volume create $V0 replica 2 transport tcp $H0:$B0/gfs0/brick01 $H0:$B0/gfs0/brick02</div><div class='add'>+TEST $CLI volume set $V0 nfs.disable on</div><div class='add'>+TEST $CLI volume set $V0 performance.stat-prefetch off</div><div class='add'>+TEST $CLI volume set $V0 cluster.background-self-heal-count 0</div><div class='add'>+TEST $CLI volume set $V0 cluster.self-heal-daemon off</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+TEST glusterfs --volfile-id=/$V0 --volfile-server=$H0 $M0 --direct-io-mode=enable</div><div class='add'>+# file 'a' is healed from brick02 to brick01 where as file 'b' is healed from</div><div class='add'>+# brick01 to brick02</div><div class='add'>+</div><div class='add'>+TEST cp -p /etc/passwd $M0/a</div><div class='add'>+TEST cp -p /etc/passwd $M0/b</div><div class='add'>+</div><div class='add'>+#Store mtimes before self-heals</div><div class='add'>+TEST modify_atstamp=$(get_mtime $B0/gfs0/brick02/a)</div><div class='add'>+TEST modify_btstamp=$(get_mtime $B0/gfs0/brick02/b)</div><div class='add'>+</div><div class='add'>+TEST $CLI volume stop $V0</div><div class='add'>+TEST gf_rm_file_and_gfid_link $B0/gfs0/brick01 a</div><div class='add'>+TEST gf_rm_file_and_gfid_link $B0/gfs0/brick02 b</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status $V0 0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status $V0 1</div><div class='add'>+</div><div class='add'>+TEST $CLI volume set $V0 cluster.self-heal-daemon on</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "Y" glustershd_up_status</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 1</div><div class='add'>+</div><div class='add'>+#TODO remove these 2 lines once heal-full is fixed in v2.</div><div class='add'>+TEST stat $M0/a</div><div class='add'>+TEST stat $M0/b</div><div class='add'>+</div><div class='add'>+TEST gluster volume heal $V0 full</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "Y" file_exists $B0/gfs0/brick01/a</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "Y" file_exists $B0/gfs0/brick02/b</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT 0 get_pending_heal_count $V0</div><div class='add'>+</div><div class='add'>+size=`stat -c '%s' /etc/passwd`</div><div class='add'>+EXPECT $size stat -c '%s' $B0/gfs0/brick01/a</div><div class='add'>+</div><div class='add'>+TEST modify_atstamp1=$(get_mtime $B0/gfs0/brick01/a)</div><div class='add'>+TEST modify_atstamp2=$(get_mtime $B0/gfs0/brick02/a)</div><div class='add'>+EXPECT $modify_atstamp echo $modify_atstamp1</div><div class='add'>+EXPECT $modify_atstamp echo $modify_atstamp2</div><div class='add'>+</div><div class='add'>+TEST modify_btstamp1=$(get_mtime $B0/gfs0/brick01/b)</div><div class='add'>+TEST modify_btstamp2=$(get_mtime $B0/gfs0/brick02/b)</div><div class='add'>+EXPECT $modify_btstamp echo $modify_btstamp1</div><div class='add'>+EXPECT $modify_btstamp echo $modify_btstamp2</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/replicate/bug-921231.t b/tests/bugs/replicate/bug-921231.t<br/>new file mode 100755<br/>index 00000000000..81504612f63<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/replicate/bug-921231.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/replicate/bug-921231.t</a></div><div class='hunk'>@@ -0,0 +1,31 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+# This test writes to same file with 2 fds and tests that cluster.eager-lock is not</div><div class='add'>+# causing extra delay because of post-op-delay-secs</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+function write_to_file {</div><div class='add'>+        dd of=$M0/1 if=/dev/zero bs=1024k count=128 oflag=append 2&gt;&amp;1 &gt;/dev/null</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 replica 2 $H0:$B0/${V0}0 $H0:$B0/${V0}1</div><div class='add'>+TEST $CLI volume set $V0 cluster.eager-lock on</div><div class='add'>+TEST $CLI volume set $V0 post-op-delay-secs 3</div><div class='add'>+TEST $CLI volume set $V0 client-log-level DEBUG</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+TEST $CLI volume profile $V0 start</div><div class='add'>+TEST $CLI volume set $V0 ensure-durability off</div><div class='add'>+TEST glusterfs --volfile-id=/$V0 --volfile-server=$H0 $M0 --attribute-timeout=0 --entry-timeout=0</div><div class='add'>+write_to_file &amp;</div><div class='add'>+write_to_file &amp;</div><div class='add'>+wait</div><div class='add'>+#Test if the MAX [F]INODELK fop latency is of the order of seconds.</div><div class='add'>+inodelk_max_latency=$($CLI volume profile $V0 info | grep INODELK | awk 'BEGIN {max = 0} {if ($6 &gt; max) max=$6;} END {print max}' | cut -d. -f 1 | egrep "[0-9]{7,}")</div><div class='add'>+TEST [ -z $inodelk_max_latency ]</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/replicate/bug-957877.t b/tests/bugs/replicate/bug-957877.t<br/>new file mode 100644<br/>index 00000000000..bcce7e3c9e7<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/replicate/bug-957877.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/replicate/bug-957877.t</a></div><div class='hunk'>@@ -0,0 +1,33 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+. $(dirname $0)/../../afr.rc</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 replica 2 $H0:$B0/${V0}{0,1}</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+</div><div class='add'>+TEST glusterfs --volfile-server=$H0 --volfile-id=$V0 $M0;</div><div class='add'>+kill_brick $V0 $H0 $B0/${V0}0</div><div class='add'>+TEST touch $M0/f1</div><div class='add'>+TEST setfattr -n "user.foo" -v "test" $M0/f1</div><div class='add'>+</div><div class='add'>+BRICK=$B0"/${V0}1"</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "Y" glustershd_up_status</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 1</div><div class='add'>+TEST $CLI volume heal $V0</div><div class='add'>+</div><div class='add'>+# Wait for self-heal to complete</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT '0' count_sh_entries $BRICK;</div><div class='add'>+</div><div class='add'>+TEST getfattr -n "user.foo" $B0/${V0}0/f1;</div><div class='add'>+</div><div class='add'>+TEST $CLI volume stop $V0;</div><div class='add'>+TEST $CLI volume delete $V0;</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/replicate/bug-976800.t b/tests/bugs/replicate/bug-976800.t<br/>new file mode 100644<br/>index 00000000000..27f8b27619e<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/replicate/bug-976800.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/replicate/bug-976800.t</a></div><div class='hunk'>@@ -0,0 +1,29 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+# This test checks if there are any open fds on the brick</div><div class='add'>+# even after the file is closed on the mount. This particular</div><div class='add'>+# test tests dd with "fsync" to check afr's fsync codepath</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+function is_fd_open {</div><div class='add'>+        local v=$1</div><div class='add'>+        local h=$2</div><div class='add'>+        local b=$3</div><div class='add'>+        local bpid=$(get_brick_pid $v $h $b)</div><div class='add'>+        ls -l /proc/$bpid/fd | grep -w "\-&gt; $b/1"</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 replica 2 $H0:$B0/${V0}{0,1}</div><div class='add'>+TEST $CLI volume set $V0 ensure-durability off</div><div class='add'>+TEST $CLI volume set $V0 cluster.eager-lock off</div><div class='add'>+TEST $CLI volume set $V0 flush-behind off</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+TEST glusterfs --volfile-id=/$V0 --volfile-server=$H0 $M0 --attribute-timeout=0 --entry-timeout=0</div><div class='add'>+TEST dd of=$M0/1 if=/dev/zero bs=1k count=1 conv=fsync</div><div class='add'>+TEST ! is_fd_open $V0 $H0 $B0/${V0}0</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/replicate/bug-977797.t b/tests/bugs/replicate/bug-977797.t<br/>new file mode 100755<br/>index 00000000000..9a8f36c956c<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/replicate/bug-977797.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/replicate/bug-977797.t</a></div><div class='hunk'>@@ -0,0 +1,96 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+## Start and create a volume</div><div class='add'>+TEST glusterd;</div><div class='add'>+TEST pidof glusterd;</div><div class='add'>+TEST $CLI volume info;</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 replica 2 $H0:$B0/${V0}{1,2};</div><div class='add'>+</div><div class='add'>+## Verify volume is is created</div><div class='add'>+EXPECT "$V0" volinfo_field $V0 'Volume Name';</div><div class='add'>+EXPECT 'Created' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+## Start volume and verify</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+EXPECT 'Started' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+TEST $CLI volume set $V0 self-heal-daemon off</div><div class='add'>+TEST $CLI volume set $V0 open-behind off</div><div class='add'>+TEST $CLI volume set $V0 quick-read off</div><div class='add'>+TEST $CLI volume set $V0 read-ahead off</div><div class='add'>+TEST $CLI volume set $V0 write-behind off</div><div class='add'>+TEST $CLI volume set $V0 io-cache off</div><div class='add'>+TEST $CLI volume set $V0 cluster.data-self-heal on</div><div class='add'>+TEST $CLI volume set $V0 cluster.metadata-self-heal on</div><div class='add'>+TEST $CLI volume set $V0 cluster.entry-self-heal on</div><div class='add'>+</div><div class='add'>+TEST $GFS --volfile-id=/$V0 --volfile-server=$H0 $M0</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+TEST mkdir -p $M0/a</div><div class='add'>+TEST `echo "GLUSTERFS" &gt; $M0/a/file`</div><div class='add'>+</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/$V0"1"</div><div class='add'>+</div><div class='add'>+TEST chown root $M0/a</div><div class='add'>+TEST chown root $M0/a/file</div><div class='add'>+TEST `echo "GLUSTER-FILE-SYSTEM" &gt; $M0/a/file`</div><div class='add'>+TEST mkdir $M0/a/b</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status $V0 0;</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/$V0"2"</div><div class='add'>+</div><div class='add'>+TEST chmod 757 $M0/a</div><div class='add'>+TEST chmod 757 $M0/a/file</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status $V0 1;</div><div class='add'>+</div><div class='add'>+#Trigger entry heal of $M0/a</div><div class='add'>+getfattr -n user.nosuchattr $M0/a</div><div class='add'>+dd if=$M0/a/file of=/dev/null bs=1024k</div><div class='add'>+#read fails, but heal is triggered.</div><div class='add'>+TEST [ $? -ne 0 ]</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "00000000"  \</div><div class='add'>+afr_get_specific_changelog_xattr $B0/$V0"1"/a/file trusted.afr.$V0-client-0 "data"</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "00000000" \</div><div class='add'>+afr_get_specific_changelog_xattr $B0/$V0"1"/a/file trusted.afr.$V0-client-1 "data"</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "00000000" \</div><div class='add'>+afr_get_specific_changelog_xattr $B0/$V0"2"/a/file trusted.afr.$V0-client-0 "data"</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT  "00000000" \</div><div class='add'>+afr_get_specific_changelog_xattr $B0/$V0"2"/a/file trusted.afr.$V0-client-1 "data"</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "00000000" \</div><div class='add'>+afr_get_specific_changelog_xattr $B0/$V0"1"/a trusted.afr.$V0-client-0 "entry"</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "00000000" \</div><div class='add'>+afr_get_specific_changelog_xattr $B0/$V0"1"/a trusted.afr.$V0-client-1 "entry"</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "00000000" \</div><div class='add'>+afr_get_specific_changelog_xattr $B0/$V0"2"/a trusted.afr.$V0-client-0 "entry"</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT  "00000000" \</div><div class='add'>+afr_get_specific_changelog_xattr $B0/$V0"2"/a trusted.afr.$V0-client-1 "entry"</div><div class='add'>+</div><div class='add'>+## Finish up</div><div class='add'>+TEST $CLI volume stop $V0;</div><div class='add'>+EXPECT 'Stopped' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+TEST $CLI volume delete $V0;</div><div class='add'>+TEST ! $CLI volume info $V0;</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/replicate/bug-978794.t b/tests/bugs/replicate/bug-978794.t<br/>new file mode 100644<br/>index 00000000000..8e43e74bf79<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/replicate/bug-978794.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/replicate/bug-978794.t</a></div><div class='hunk'>@@ -0,0 +1,29 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+. $(dirname $0)/../../fileio.rc</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+# This test opens 100 fds and triggers graph switches to check if fsync</div><div class='add'>+# as part of graph-switch causes crash or not.</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 replica 2 $H0:$B0/${V0}{0,1}</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+TEST glusterfs --volfile-id=/$V0 --volfile-server=$H0 $M0</div><div class='add'>+TEST touch $M0/{1..100}</div><div class='add'>+for i in {1..100}; do fd[$i]=`fd_available`; fd_open ${fd[$i]} 'w' $M0/$i; done</div><div class='add'>+TEST $CLI volume add-brick $V0 $H0:$B0/${V0}{2,3}</div><div class='add'>+TEST $CLI volume rebalance $V0 start force</div><div class='add'>+EXPECT_WITHIN $REBALANCE_TIMEOUT "completed" rebalance_status_field $V0</div><div class='add'>+TEST cat $M0/{1..100}</div><div class='add'>+for i in {1..100}; do fd_write ${fd[$i]} 'abc'; done</div><div class='add'>+TEST $CLI volume add-brick $V0 $H0:$B0/${V0}{4,5}</div><div class='add'>+TEST $CLI volume rebalance $V0 start force</div><div class='add'>+EXPECT_WITHIN $REBALANCE_TIMEOUT "completed" rebalance_status_field $V0</div><div class='add'>+for i in {1..100}; do fd_write ${fd[$i]} 'abc'; done</div><div class='add'>+TEST cat $M0/{1..100}</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/bugs/replicate/bug-979365.t b/tests/bugs/replicate/bug-979365.t<br/>new file mode 100755<br/>index 00000000000..c09c7d51772<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/replicate/bug-979365.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/replicate/bug-979365.t</a></div><div class='hunk'>@@ -0,0 +1,47 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+#This script checks that ensure-durability option enables/disables afr</div><div class='add'>+#sending fsyncs</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+function num_fsyncs {</div><div class='add'>+        $CLI volume profile $V0 info | grep -w FSYNC | wc -l</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 replica 2 $H0:$B0/${V0}{0,1}</div><div class='add'>+TEST $CLI volume set $V0 ensure-durability on</div><div class='add'>+TEST $CLI volume set $V0 cluster.eager-lock off</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+TEST $CLI volume profile $V0 start</div><div class='add'>+TEST glusterfs --volfile-id=/$V0 --volfile-server=$H0 $M0</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}0</div><div class='add'>+TEST dd of=$M0/a if=/dev/zero bs=1024k count=10</div><div class='add'>+#fsyncs take a while to complete.</div><div class='add'>+sleep 5</div><div class='add'>+</div><div class='add'>+# There can be zero or more fsyncs, depending on the order</div><div class='add'>+# in which the writes reached the server, in turn deciding</div><div class='add'>+# whether they were treated as "appending" writes or not.</div><div class='add'>+</div><div class='add'>+TEST [[ $(num_fsyncs) -ge 0 ]]</div><div class='add'>+#Stop the volume to erase the profile info of old operations</div><div class='add'>+TEST $CLI volume profile $V0 stop</div><div class='add'>+TEST $CLI volume stop $V0</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+#Disable ensure-durability now to disable fsyncs in afr.</div><div class='add'>+TEST $CLI volume set $V0 ensure-durability off</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}0</div><div class='add'>+TEST glusterfs --volfile-id=/$V0 --volfile-server=$H0 $M0</div><div class='add'>+TEST $CLI volume profile $V0 start</div><div class='add'>+TEST dd of=$M0/a if=/dev/zero bs=1024k count=10</div><div class='add'>+#fsyncs take a while to complete.</div><div class='add'>+sleep 5</div><div class='add'>+TEST [[ $(num_fsyncs) -eq 0 ]]</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/bugs/replicate/bug-986905.t b/tests/bugs/replicate/bug-986905.t<br/>new file mode 100755<br/>index 00000000000..f4f7386ebc4<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/replicate/bug-986905.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/replicate/bug-986905.t</a></div><div class='hunk'>@@ -0,0 +1,27 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+#This script checks if hardlinks that are created while a brick is down are</div><div class='add'>+#healed properly.</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+function get_inum {</div><div class='add'>+        ls -i $1 | awk '{print $1}'</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 replica 2 $H0:$B0/${V0}{0,1}</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+TEST glusterfs --volfile-id=/$V0 --volfile-server=$H0 $M0 --attribute-timeout=0 --entry-timeout=0</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}0</div><div class='add'>+TEST touch $M0/a</div><div class='add'>+TEST ln $M0/a $M0/link_a</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status $V0 0</div><div class='add'>+TEST ls -l $M0</div><div class='add'>+inum=$(get_inum $B0/${V0}0/a)</div><div class='add'>+EXPECT "$inum" get_inum $B0/${V0}0/link_a</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/bugs/replicate/issue-1254-prioritize-enospc.t b/tests/bugs/replicate/issue-1254-prioritize-enospc.t<br/>new file mode 100644<br/>index 00000000000..fab94b71b27<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/replicate/issue-1254-prioritize-enospc.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/replicate/issue-1254-prioritize-enospc.t</a></div><div class='hunk'>@@ -0,0 +1,80 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='add'>+</div><div class='add'>+function create_bricks {</div><div class='add'>+    TEST truncate -s 100M $B0/brick0</div><div class='add'>+    TEST truncate -s 100M $B0/brick1</div><div class='add'>+    TEST truncate -s 20M $B0/brick2</div><div class='add'>+    LO1=`SETUP_LOOP $B0/brick0`</div><div class='add'>+    TEST [ $? -eq 0 ]</div><div class='add'>+    TEST MKFS_LOOP $LO1</div><div class='add'>+    LO2=`SETUP_LOOP $B0/brick1`</div><div class='add'>+    TEST [ $? -eq 0 ]</div><div class='add'>+    TEST MKFS_LOOP $LO2</div><div class='add'>+    LO3=`SETUP_LOOP $B0/brick2`</div><div class='add'>+    TEST [ $? -eq 0 ]</div><div class='add'>+    TEST MKFS_LOOP $LO3</div><div class='add'>+    TEST mkdir -p $B0/${V0}0 $B0/${V0}1 $B0/${V0}2</div><div class='add'>+    TEST MOUNT_LOOP $LO1 $B0/${V0}0</div><div class='add'>+    TEST MOUNT_LOOP $LO2 $B0/${V0}1</div><div class='add'>+    TEST MOUNT_LOOP $LO3 $B0/${V0}2</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function create_files {</div><div class='add'>+        local i=1</div><div class='add'>+        while (true)</div><div class='add'>+        do</div><div class='add'>+                touch $M0/file$i</div><div class='add'>+                if [ -e $B0/${V0}2/file$i ];</div><div class='add'>+                then</div><div class='add'>+                        ((i++))</div><div class='add'>+                else</div><div class='add'>+                        break</div><div class='add'>+                fi</div><div class='add'>+        done</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+TESTS_EXPECTED_IN_LOOP=13</div><div class='add'>+</div><div class='add'>+#Arbiter volume: Check for ENOSPC when arbiter brick becomes full#</div><div class='add'>+TEST glusterd</div><div class='add'>+create_bricks</div><div class='add'>+TEST $CLI volume create $V0 replica 3 arbiter 1 $H0:$B0/${V0}{0,1,2}</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+TEST $CLI volume set $V0 performance.write-behind off</div><div class='add'>+TEST $GFS --volfile-server=$H0 --volfile-id=$V0 $M0</div><div class='add'>+</div><div class='add'>+create_files</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}1</div><div class='add'>+error1=$(touch $M0/file-1 2&gt;&amp;1)</div><div class='add'>+EXPECT "No space left on device" echo $error1</div><div class='add'>+error2=$(mkdir $M0/dir-1 2&gt;&amp;1)</div><div class='add'>+EXPECT "No space left on device" echo $error2</div><div class='add'>+error3=$((echo "Test" &gt; $M0/file-3) 2&gt;&amp;1)</div><div class='add'>+EXPECT "No space left on device" echo $error3</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='add'>+</div><div class='add'>+#Replica-3 volume: Check for ENOSPC when one of the brick becomes full#</div><div class='add'>+#Keeping the third brick of lower size to simulate disk full scenario#</div><div class='add'>+TEST glusterd</div><div class='add'>+create_bricks</div><div class='add'>+TEST $CLI volume create $V0 replica 3 $H0:$B0/${V0}{0,1,2}</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+TEST $CLI volume set $V0 performance.write-behind off</div><div class='add'>+TEST $GFS --volfile-server=$H0 --volfile-id=$V0 $M0</div><div class='add'>+</div><div class='add'>+create_files</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}1</div><div class='add'>+error1=$(touch $M0/file-1 2&gt;&amp;1)</div><div class='add'>+EXPECT "No space left on device" echo $error1</div><div class='add'>+error2=$(mkdir $M0/dir-1 2&gt;&amp;1)</div><div class='add'>+EXPECT "No space left on device" echo $error2</div><div class='add'>+error3=$((cat /dev/zero &gt; $M0/file1) 2&gt;&amp;1)</div><div class='add'>+EXPECT "No space left on device" echo $error3</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/bugs/replicate/mdata-heal-no-xattrs.t b/tests/bugs/replicate/mdata-heal-no-xattrs.t<br/>new file mode 100644<br/>index 00000000000..d3b0c504c80<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/replicate/mdata-heal-no-xattrs.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/replicate/mdata-heal-no-xattrs.t</a></div><div class='hunk'>@@ -0,0 +1,59 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 replica 3 $H0:$B0/${V0}{0,1,2};</div><div class='add'>+TEST $CLI volume set $V0 cluster.self-heal-daemon off</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+TEST glusterfs --volfile-id=/$V0 --volfile-server=$H0 $M0 --attribute-timeout=0 --entry-timeout=0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 1</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" afr_child_up_status $V0 2</div><div class='add'>+echo "Data"&gt;$M0/FILE</div><div class='add'>+ret=$?</div><div class='add'>+TEST [ $ret -eq 0 ]</div><div class='add'>+</div><div class='add'>+# Change permission on brick-0: simulates the case where there is metadata</div><div class='add'>+# mismatch but no pending xattrs. This brick will become the source for heal.</div><div class='add'>+TEST chmod +x $B0/$V0"0"/FILE</div><div class='add'>+</div><div class='add'>+# Add gfid to xattrop</div><div class='add'>+xattrop_b0=$(afr_get_index_path $B0/$V0"0")</div><div class='add'>+base_entry_b0=`ls $xattrop_b0`</div><div class='add'>+gfid_str_FILE=$(gf_gfid_xattr_to_str $(gf_get_gfid_xattr $B0/$V0"0"/FILE))</div><div class='add'>+TEST ln $xattrop_b0/$base_entry_b0 $xattrop_b0/$gfid_str_FILE</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "^1$" get_pending_heal_count $V0</div><div class='add'>+</div><div class='add'>+TEST $CLI volume set $V0 cluster.self-heal-daemon on</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 1</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 2</div><div class='add'>+TEST $CLI volume heal $V0</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "^0$" get_pending_heal_count $V0</div><div class='add'>+</div><div class='add'>+# Brick-0 should contain xattrs blaming other 2 bricks.</div><div class='add'>+# The values will be zero because heal is over.</div><div class='add'>+EXPECT "000000000000000000000000" get_hex_xattr trusted.afr.$V0-client-1 $B0/${V0}0/FILE</div><div class='add'>+EXPECT "000000000000000000000000" get_hex_xattr trusted.afr.$V0-client-2 $B0/${V0}0/FILE</div><div class='add'>+TEST ! getfattr -n trusted.afr.$V0-client-0 $B0/${V0}0/FILE</div><div class='add'>+</div><div class='add'>+# Brick-1 and Brick-2 must not contain any afr xattrs.</div><div class='add'>+TEST ! getfattr -n trusted.afr.$V0-client-0 $B0/${V0}1/FILE</div><div class='add'>+TEST ! getfattr -n trusted.afr.$V0-client-1 $B0/${V0}1/FILE</div><div class='add'>+TEST ! getfattr -n trusted.afr.$V0-client-2 $B0/${V0}1/FILE</div><div class='add'>+TEST ! getfattr -n trusted.afr.$V0-client-0 $B0/${V0}2/FILE</div><div class='add'>+TEST ! getfattr -n trusted.afr.$V0-client-1 $B0/${V0}2/FILE</div><div class='add'>+TEST ! getfattr -n trusted.afr.$V0-client-2 $B0/${V0}2/FILE</div><div class='add'>+</div><div class='add'>+# check permission bits.</div><div class='add'>+EXPECT '755' stat -c %a $B0/${V0}0/FILE</div><div class='add'>+EXPECT '755' stat -c %a $B0/${V0}1/FILE</div><div class='add'>+EXPECT '755' stat -c %a $B0/${V0}2/FILE</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/replicate/ta-inode-refresh-read.t b/tests/bugs/replicate/ta-inode-refresh-read.t<br/>new file mode 100644<br/>index 00000000000..6dd6ff7f163<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/replicate/ta-inode-refresh-read.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/replicate/ta-inode-refresh-read.t</a></div><div class='hunk'>@@ -0,0 +1,40 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+# Test read transaction inode refresh logic for thin-arbiter.</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+. $(dirname $0)/../../thin-arbiter.rc</div><div class='add'>+cleanup;</div><div class='add'>+TEST ta_create_brick_and_volfile brick0</div><div class='add'>+TEST ta_create_brick_and_volfile brick1</div><div class='add'>+TEST ta_create_ta_and_volfile ta</div><div class='add'>+TEST ta_start_brick_process brick0</div><div class='add'>+TEST ta_start_brick_process brick1</div><div class='add'>+TEST ta_start_ta_process ta</div><div class='add'>+</div><div class='add'>+TEST ta_create_mount_volfile brick0 brick1 ta</div><div class='add'>+# Set afr xlator options to choose brick0 as read-subvol.</div><div class='add'>+sed -i '/iam-self-heal-daemon/a \     option read-subvolume-index 0' $B0/mount.vol</div><div class='add'>+TEST [ $? -eq 0 ]</div><div class='add'>+sed -i '/iam-self-heal-daemon/a \     option choose-local false' $B0/mount.vol</div><div class='add'>+TEST [ $? -eq 0 ]</div><div class='add'>+</div><div class='add'>+TEST ta_start_mount_process $M0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" ta_up_status $V0 $M0 0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "trusted.afr.patchy-ta-2" ls $B0/ta</div><div class='add'>+</div><div class='add'>+TEST touch $M0/FILE</div><div class='add'>+TEST ls $B0/brick0/FILE</div><div class='add'>+TEST ls $B0/brick1/FILE</div><div class='add'>+TEST ! ls $B0/ta/FILE</div><div class='add'>+TEST setfattr -n user.name -v ravi $M0/FILE</div><div class='add'>+</div><div class='add'>+# Remove gfid hardlink from brick0 which is the read-subvol for FILE.</div><div class='add'>+# This triggers inode refresh up on a getfattr and eventually calls</div><div class='add'>+# afr_ta_read_txn(). Without this patch, afr_ta_read_txn() will again query</div><div class='add'>+# brick0 causing getfattr to fail.</div><div class='add'>+TEST rm -f $(gf_get_gfid_backend_file_path $B0/brick0 FILE)</div><div class='add'>+TEST getfattr -n user.name $M0/FILE</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/rpc/bug-1043886.t b/tests/bugs/rpc/bug-1043886.t<br/>new file mode 100755<br/>index 00000000000..c1ea7a71e8b<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/rpc/bug-1043886.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/rpc/bug-1043886.t</a></div><div class='hunk'>@@ -0,0 +1,58 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../nfs.rc</div><div class='add'>+</div><div class='add'>+#G_TESTDEF_TEST_STATUS_CENTOS6=NFS_TEST</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 replica 2 $H0:$B0/${V0}{1,2};</div><div class='add'>+TEST $CLI volume set $V0 nfs.disable false</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+## Mount FUSE with caching disabled</div><div class='add'>+TEST glusterfs --entry-timeout=0 --attribute-timeout=0 -s $H0 --volfile-id $V0 $M0;</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $NFS_EXPORT_TIMEOUT "1" is_nfs_export_available;</div><div class='add'>+</div><div class='add'>+## Mount volume as NFS export</div><div class='add'>+TEST mount_nfs $H0:/$V0 $N0 nolock;</div><div class='add'>+</div><div class='add'>+# just a random uid/gid</div><div class='add'>+uid=22162</div><div class='add'>+gid=5845</div><div class='add'>+</div><div class='add'>+mkdir $N0/other;</div><div class='add'>+chown $uid:$gid $N0/other;</div><div class='add'>+</div><div class='add'>+TEST $CLI volume set $V0 server.root-squash on;</div><div class='add'>+TEST $CLI volume set $V0 server.anonuid $uid;</div><div class='add'>+TEST $CLI volume set $V0 server.anongid $gid;</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $NFS_EXPORT_TIMEOUT "1" is_nfs_export_available;</div><div class='add'>+</div><div class='add'>+# create files and directories in the root of the glusterfs and nfs mount</div><div class='add'>+# which is owned by root and hence the right behavior is getting EACCESS</div><div class='add'>+# as the fops are executed as nfsnobody.</div><div class='add'>+touch $M0/file 2&gt;/dev/null;</div><div class='add'>+TEST [ $? -ne 0 ]</div><div class='add'>+mkdir $M0/dir 2&gt;/dev/null;</div><div class='add'>+TEST [ $? -ne 0 ]</div><div class='add'>+</div><div class='add'>+# Here files and directories should be getting created as other directory is owned</div><div class='add'>+# by tmp_user as server.anonuid and server.anongid have the value of tmp_user uid and gid</div><div class='add'>+TEST touch $M0/other/file 2&gt;/dev/null;</div><div class='add'>+TEST [ "$(stat -c %u:%g $N0/other/file)" = "$uid:$gid" ];</div><div class='add'>+TEST mkdir $M0/other/dir 2&gt;/dev/null;</div><div class='add'>+TEST [ "$(stat -c %u:%g $N0/other/dir)" = "$uid:$gid" ];</div><div class='add'>+</div><div class='add'>+## Before killing daemon to avoid deadlocks</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" umount_nfs $N0</div><div class='add'>+</div><div class='add'>+TEST $CLI volume stop $V0;</div><div class='add'>+TEST $CLI volume delete $V0;</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/rpc/bug-847624.t b/tests/bugs/rpc/bug-847624.t<br/>new file mode 100755<br/>index 00000000000..fe8fc982887<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/rpc/bug-847624.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/rpc/bug-847624.t</a></div><div class='hunk'>@@ -0,0 +1,29 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../nfs.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+#G_TESTDEF_TEST_STATUS_CENTOS6=NFS_TEST</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='add'>+</div><div class='add'>+#1</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+#3</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/$V0</div><div class='add'>+TEST $CLI volume set $V0 nfs.disable off</div><div class='add'>+TEST $CLI volume set $V0 nfs.drc on</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+EXPECT_WITHIN $NFS_EXPORT_TIMEOUT "1" is_nfs_export_available;</div><div class='add'>+TEST mount_nfs $H0:/$V0 $N0 nolock</div><div class='add'>+cd $N0</div><div class='add'>+#7</div><div class='add'>+TEST dbench -t 10 10</div><div class='add'>+TEST rm -rf $N0/*</div><div class='add'>+cd</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $N0</div><div class='add'>+#10</div><div class='add'>+TEST $CLI volume set $V0 nfs.drc-size 10000</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/bugs/rpc/bug-884452.t b/tests/bugs/rpc/bug-884452.t<br/>new file mode 100644<br/>index 00000000000..c161a68190d<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/rpc/bug-884452.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/rpc/bug-884452.t</a></div><div class='hunk'>@@ -0,0 +1,47 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/$V0</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+TEST glusterfs -s $H0 --volfile-id $V0 $M0</div><div class='add'>+TEST touch $M0/{1..10000}</div><div class='add'>+</div><div class='add'>+RUN_LS_LOOP_FILE="$M0/run-ls-loop"</div><div class='add'>+function ls-loop</div><div class='add'>+{</div><div class='add'>+  while [ -f $RUN_LS_LOOP_FILE ]; do</div><div class='add'>+    ls -lR $M0 1&gt;/dev/null 2&gt;&amp;1</div><div class='add'>+  done;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+touch $RUN_LS_LOOP_FILE</div><div class='add'>+ls-loop &amp;</div><div class='add'>+</div><div class='add'>+function vol-status-loop</div><div class='add'>+{</div><div class='add'>+  for i in {1..1000}; do</div><div class='add'>+    $CLI volume status $V0 clients &gt;/dev/null 2&gt;&amp;1</div><div class='add'>+    if [ $? -ne 0 ]; then</div><div class='add'>+      return 1</div><div class='add'>+    fi</div><div class='add'>+  done;</div><div class='add'>+</div><div class='add'>+  return 0</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+TEST vol-status-loop</div><div class='add'>+</div><div class='add'>+rm -f $RUN_LS_LOOP_FILE</div><div class='add'>+wait</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/rpc/bug-921072.t b/tests/bugs/rpc/bug-921072.t<br/>new file mode 100755<br/>index 00000000000..ae7eb0101bc<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/rpc/bug-921072.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/rpc/bug-921072.t</a></div><div class='hunk'>@@ -0,0 +1,132 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../nfs.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+#G_TESTDEF_TEST_STATUS_CENTOS6=NFS_TEST</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+#1</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/$V0</div><div class='add'>+TEST $CLI volume set $V0 nfs.disable false</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+EXPECT_WITHIN $NFS_EXPORT_TIMEOUT 1 is_nfs_export_available</div><div class='add'>+TEST mount_nfs $H0:/$V0 $N0 nolock</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $N0</div><div class='add'>+</div><div class='add'>+# based on ip addresses (1-4)</div><div class='add'>+# case 1: allow only localhost ip</div><div class='add'>+TEST $CLI volume set $V0 nfs.rpc-auth-allow 127.0.0.1</div><div class='add'>+EXPECT_WITHIN $NFS_EXPORT_TIMEOUT 1 is_nfs_export_available</div><div class='add'>+</div><div class='add'>+TEST mount_nfs localhost:/$V0 $N0 nolock</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $N0</div><div class='add'>+</div><div class='add'>+# case 2: allow only non-localhost ip</div><div class='add'>+TEST $CLI volume set $V0 nfs.rpc-auth-allow 192.168.1.1</div><div class='add'>+EXPECT_WITHIN $NFS_EXPORT_TIMEOUT 1 is_nfs_export_available</div><div class='add'>+#11</div><div class='add'>+TEST ! mount_nfs localhost:/$V0 $N0 nolock</div><div class='add'>+TEST $CLI volume reset $V0 force</div><div class='add'>+TEST $CLI volume set $V0 nfs.disable off</div><div class='add'>+# case 3: reject only localhost ip</div><div class='add'>+TEST $CLI volume set $V0 nfs.rpc-auth-reject 127.0.0.1</div><div class='add'>+EXPECT_WITHIN $NFS_EXPORT_TIMEOUT 1 is_nfs_export_available</div><div class='add'>+</div><div class='add'>+TEST ! mount_nfs localhost:/$V0 $N0 nolock</div><div class='add'>+</div><div class='add'>+# case 4: reject only non-localhost ip</div><div class='add'>+TEST $CLI volume set $V0 nfs.rpc-auth-reject 192.168.1.1</div><div class='add'>+EXPECT_WITHIN $NFS_EXPORT_TIMEOUT 1 is_nfs_export_available</div><div class='add'>+</div><div class='add'>+TEST mount_nfs localhost:/$V0 $N0 nolock</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $N0</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+# NEED TO CHECK BOTH IP AND NAME BASED AUTH.</div><div class='add'>+# CASES WITH NFS.ADDR-NAMELOOKUP ON (5-12)</div><div class='add'>+TEST $CLI volume reset $V0 force</div><div class='add'>+TEST $CLI volume set $V0 nfs.disable off</div><div class='add'>+TEST $CLI volume set $V0 nfs.addr-namelookup on</div><div class='add'>+EXPECT_WITHIN $NFS_EXPORT_TIMEOUT 1 is_nfs_export_available</div><div class='add'>+#20</div><div class='add'>+TEST mount_nfs localhost:/$V0 $N0 nolock</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $N0</div><div class='add'>+</div><div class='add'>+# case 5: allow only localhost</div><div class='add'>+TEST $CLI volume set $V0 nfs.rpc-auth-allow localhost</div><div class='add'>+EXPECT_WITHIN $NFS_EXPORT_TIMEOUT 1 is_nfs_export_available</div><div class='add'>+</div><div class='add'>+TEST mount_nfs localhost:/$V0 $N0 nolock</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $N0</div><div class='add'>+</div><div class='add'>+# case 6: allow only somehost</div><div class='add'>+TEST $CLI volume set $V0 nfs.rpc-auth-allow somehost</div><div class='add'>+EXPECT_WITHIN $NFS_EXPORT_TIMEOUT 1 is_nfs_export_available</div><div class='add'>+</div><div class='add'>+TEST ! mount_nfs localhost:/$V0 $N0 nolock</div><div class='add'>+</div><div class='add'>+# case 7: reject only localhost</div><div class='add'>+TEST $CLI volume reset $V0 force</div><div class='add'>+TEST $CLI volume set $V0 nfs.disable off</div><div class='add'>+TEST $CLI volume set $V0 nfs.addr-namelookup on</div><div class='add'>+TEST $CLI volume set $V0 nfs.rpc-auth-reject localhost</div><div class='add'>+EXPECT_WITHIN $NFS_EXPORT_TIMEOUT 1 is_nfs_export_available</div><div class='add'>+#30</div><div class='add'>+TEST ! mount_nfs localhost:/$V0 $N0 nolock</div><div class='add'>+</div><div class='add'>+# case 8: reject only somehost</div><div class='add'>+TEST $CLI volume set $V0 nfs.rpc-auth-reject somehost</div><div class='add'>+EXPECT_WITHIN $NFS_EXPORT_TIMEOUT 1 is_nfs_export_available</div><div class='add'>+</div><div class='add'>+TEST mount_nfs localhost:/$V0 $N0 nolock</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $N0</div><div class='add'>+</div><div class='add'>+# based on ip addresses: repeat of cases 1-4</div><div class='add'>+# case 9: allow only localhost ip</div><div class='add'>+TEST $CLI volume reset $V0 force</div><div class='add'>+TEST $CLI volume set $V0 nfs.disable off</div><div class='add'>+TEST $CLI volume set $V0 nfs.addr-namelookup on</div><div class='add'>+TEST $CLI volume set $V0 nfs.rpc-auth-allow 127.0.0.1</div><div class='add'>+EXPECT_WITHIN $NFS_EXPORT_TIMEOUT 1 is_nfs_export_available</div><div class='add'>+</div><div class='add'>+TEST mount_nfs localhost:/$V0 $N0 nolock</div><div class='add'>+TEST mkdir -p $N0/subdir</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $N0</div><div class='add'>+</div><div class='add'>+# case 10: allow a non-localhost ip</div><div class='add'>+TEST $CLI volume set $V0 nfs.rpc-auth-allow 192.168.1.1</div><div class='add'>+EXPECT_WITHIN $NFS_EXPORT_TIMEOUT 1 is_nfs_export_available</div><div class='add'>+#41</div><div class='add'>+TEST ! mount_nfs localhost:/$V0 $N0 nolock</div><div class='add'>+</div><div class='add'>+# case 11: reject only localhost ip</div><div class='add'>+TEST $CLI volume reset $V0 force</div><div class='add'>+TEST $CLI volume set $V0 nfs.disable off</div><div class='add'>+TEST $CLI volume set $V0 nfs.addr-namelookup on</div><div class='add'>+TEST $CLI volume set $V0 nfs.rpc-auth-reject 127.0.0.1</div><div class='add'>+EXPECT_WITHIN $NFS_EXPORT_TIMEOUT 1 is_nfs_export_available</div><div class='add'>+</div><div class='add'>+TEST ! mount_nfs localhost:/$V0 $N0 nolock</div><div class='add'>+TEST ! mount_nfs localhost:/$V0/subdir $N0 nolock</div><div class='add'>+</div><div class='add'>+# case 12: reject only non-localhost ip</div><div class='add'>+TEST $CLI volume set $V0 nfs.rpc-auth-reject 192.168.1.1</div><div class='add'>+EXPECT_WITHIN $NFS_EXPORT_TIMEOUT 1 is_nfs_export_available</div><div class='add'>+</div><div class='add'>+TEST mount_nfs localhost:/$V0 $N0 nolock</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $N0</div><div class='add'>+</div><div class='add'>+TEST mount_nfs localhost:/$V0/subdir $N0 nolock</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $N0</div><div class='add'>+</div><div class='add'>+TEST $CLI volume stop --mode=script $V0</div><div class='add'>+#52</div><div class='add'>+TEST $CLI volume delete --mode=script $V0</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/bugs/rpc/bug-954057.t b/tests/bugs/rpc/bug-954057.t<br/>new file mode 100755<br/>index 00000000000..40acdc2fdc7<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/rpc/bug-954057.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/rpc/bug-954057.t</a></div><div class='hunk'>@@ -0,0 +1,63 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+# This script checks if use-readdirp option works as accepted in mount options</div><div class='add'>+</div><div class='add'>+# Note on re-reading $M0/new after enabling root-squash:</div><div class='add'>+# Since we have readen it once, the file is present in various caches.</div><div class='add'>+# In order to actually fail on second attempt we must:</div><div class='add'>+# 1) drop kernel cache</div><div class='add'>+# 2) make sure FUSE does not cache the entry. This is also</div><div class='add'>+#    in the kernel, but not flushed by a failed umount.</div><div class='add'>+#    Using $GFS enforces this because it sets --entry-timeout=0</div><div class='add'>+# 3) make sure reading new permissins does not produce stale</div><div class='add'>+#    information from glusterfs metadata cache. Setting volume</div><div class='add'>+#    option performance.stat-prefetch off enforces that.</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/${V0}</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+TEST $GFS --volfile-id=/$V0 --volfile-server=$H0 $M0</div><div class='add'>+</div><div class='add'>+TEST mkdir $M0/dir</div><div class='add'>+TEST mkdir $M0/nobody</div><div class='add'>+grep nfsnobody /etc/passwd &gt; /dev/null</div><div class='add'>+if [ $? -eq 1 ]; then</div><div class='add'>+usr=nobody</div><div class='add'>+grp=nobody</div><div class='add'>+else</div><div class='add'>+usr=nfsnobody</div><div class='add'>+grp=nfsnobody</div><div class='add'>+fi</div><div class='add'>+TEST chown $usr:$grp $M0/nobody</div><div class='add'>+TEST `echo "file" &gt;&gt; $M0/file`</div><div class='add'>+TEST cp $M0/file $M0/new</div><div class='add'>+TEST chmod 700 $M0/new</div><div class='add'>+TEST cat $M0/new</div><div class='add'>+</div><div class='add'>+TEST $CLI volume set $V0 performance.stat-prefetch off</div><div class='add'>+TEST $CLI volume set $V0 server.root-squash enable</div><div class='add'>+drop_cache $M0</div><div class='add'>+TEST ! mkdir $M0/other</div><div class='add'>+TEST mkdir $M0/nobody/other</div><div class='add'>+TEST cat $M0/file</div><div class='add'>+TEST ! cat $M0/new</div><div class='add'>+TEST `echo "nobody" &gt;&gt; $M0/nobody/file`</div><div class='add'>+</div><div class='add'>+#mount the client without root-squashing</div><div class='add'>+TEST $GFS --volfile-id=/$V0 --volfile-server=$H0 --no-root-squash=yes $M1</div><div class='add'>+TEST mkdir $M1/m1_dir</div><div class='add'>+TEST `echo "file" &gt;&gt; $M1/m1_file`</div><div class='add'>+TEST cp $M0/file $M1/new</div><div class='add'>+TEST chmod 700 $M1/new</div><div class='add'>+TEST cat $M1/new</div><div class='add'>+</div><div class='add'>+TEST $CLI volume set $V0 server.root-squash disable</div><div class='add'>+TEST mkdir $M0/other</div><div class='add'>+TEST cat $M0/new</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/bugs/shard/bug-1245547.t b/tests/bugs/shard/bug-1245547.t<br/>new file mode 100644<br/>index 00000000000..3c46785d10f<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/shard/bug-1245547.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/shard/bug-1245547.t</a></div><div class='hunk'>@@ -0,0 +1,35 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/${V0}{0,1}</div><div class='add'>+TEST $CLI volume set $V0 features.shard on</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+TEST $GFS --volfile-id=$V0 --volfile-server=$H0 $M0</div><div class='add'>+#Create a file.</div><div class='add'>+TEST touch $M0/foo</div><div class='add'>+#Write some data into it.</div><div class='add'>+TEST `echo "abc" &gt; $M0/foo`</div><div class='add'>+</div><div class='add'>+#This should ensure /.shard is created on the bricks.</div><div class='add'>+TEST stat $B0/${V0}0/.shard</div><div class='add'>+TEST stat $B0/${V0}1/.shard</div><div class='add'>+</div><div class='add'>+#Create a file 'bar' with holes.</div><div class='add'>+TEST touch $M0/bar</div><div class='add'>+TEST truncate -s 10G $M0/bar</div><div class='add'>+#Unlink on such a file should succeed.</div><div class='add'>+TEST unlink $M0/bar</div><div class='add'>+</div><div class='add'>+#Create a file 'baz' with holes.</div><div class='add'>+TEST touch $M0/baz</div><div class='add'>+TEST truncate -s 10G $M0/baz</div><div class='add'>+#Rename with a sharded existing dest that has holes must succeed.</div><div class='add'>+TEST mv -f $M0/foo $M0/baz</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/bugs/shard/bug-1248887.t b/tests/bugs/shard/bug-1248887.t<br/>new file mode 100644<br/>index 00000000000..2c51f7ce0e8<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/shard/bug-1248887.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/shard/bug-1248887.t</a></div><div class='hunk'>@@ -0,0 +1,39 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 replica 2 $H0:$B0/${V0}{0,1}</div><div class='add'>+TEST $CLI volume set $V0 features.shard on</div><div class='add'>+TEST $CLI volume set $V0 features.shard-block-size 4MB</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+TEST $GFS --volfile-id=$V0 --volfile-server=$H0 $M0</div><div class='add'>+#Create a file.</div><div class='add'>+TEST touch $M0/foo</div><div class='add'>+#Write some data into it.</div><div class='add'>+TEST `echo "abc" &gt; $M0/foo`</div><div class='add'>+EXPECT "0000000000400000" get_hex_xattr trusted.glusterfs.shard.block-size $B0/${V0}0/foo</div><div class='add'>+EXPECT "0000000000000004000000000000000000000000000000010000000000000000" get_hex_xattr trusted.glusterfs.shard.file-size $B0/${V0}0/foo</div><div class='add'>+EXPECT "0000000000400000" get_hex_xattr trusted.glusterfs.shard.block-size $B0/${V0}1/foo</div><div class='add'>+EXPECT "0000000000000004000000000000000000000000000000010000000000000000" get_hex_xattr trusted.glusterfs.shard.file-size $B0/${V0}1/foo</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}0</div><div class='add'>+TEST `echo "abc" &gt;&gt; $M0/foo`</div><div class='add'>+EXPECT "0000000000400000" get_hex_xattr trusted.glusterfs.shard.block-size $B0/${V0}1/foo</div><div class='add'>+EXPECT "0000000000000008000000000000000000000000000000010000000000000000" get_hex_xattr trusted.glusterfs.shard.file-size $B0/${V0}1/foo</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "Y" glustershd_up_status</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 1</div><div class='add'>+TEST $CLI volume heal $V0</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "0" get_pending_heal_count $V0</div><div class='add'>+EXPECT "0000000000400000" get_hex_xattr trusted.glusterfs.shard.block-size $B0/${V0}0/foo</div><div class='add'>+EXPECT "0000000000000008000000000000000000000000000000010000000000000000" get_hex_xattr trusted.glusterfs.shard.file-size $B0/${V0}0/foo</div><div class='add'>+EXPECT "0000000000400000" get_hex_xattr trusted.glusterfs.shard.block-size $B0/${V0}1/foo</div><div class='add'>+EXPECT "0000000000000008000000000000000000000000000000010000000000000000" get_hex_xattr trusted.glusterfs.shard.file-size $B0/${V0}1/foo</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/shard/bug-1250855.t b/tests/bugs/shard/bug-1250855.t<br/>new file mode 100644<br/>index 00000000000..b8bc3b42513<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/shard/bug-1250855.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/shard/bug-1250855.t</a></div><div class='hunk'>@@ -0,0 +1,34 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TESTS_EXPECTED_IN_LOOP=40</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/${V0}{0,1}</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+TEST $GFS --volfile-id=$V0 --volfile-server=$H0 $M0</div><div class='add'>+TEST mkdir $M0/dir</div><div class='add'>+</div><div class='add'>+for i in {1..20}; do</div><div class='add'>+        TEST_IN_LOOP touch $M0/dir/$i;</div><div class='add'>+done</div><div class='add'>+</div><div class='add'>+TEST $CLI volume set $V0 features.shard on</div><div class='add'>+</div><div class='add'>+TEST ls $M0</div><div class='add'>+TEST ls $M0/dir</div><div class='add'>+</div><div class='add'>+for i in {1..10}; do</div><div class='add'>+        TEST_IN_LOOP mv $M0/dir/$i $M0/dir/$i-sharded;</div><div class='add'>+done</div><div class='add'>+</div><div class='add'>+for i in {11..20}; do</div><div class='add'>+        TEST_IN_LOOP unlink $M0/dir/$i;</div><div class='add'>+done</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/shard/bug-1251824.t b/tests/bugs/shard/bug-1251824.t<br/>new file mode 100644<br/>index 00000000000..d81685d01de<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/shard/bug-1251824.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/shard/bug-1251824.t</a></div><div class='hunk'>@@ -0,0 +1,109 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+. $(dirname $0)/../../common-utils.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 replica 2 $H0:$B0/${V0}{0,1,2,3}</div><div class='add'>+TEST $CLI volume set $V0 features.shard on</div><div class='add'>+TEST $CLI volume set $V0 features.shard-block-size 4MB</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+TEST glusterfs --volfile-id=$V0 --volfile-server=$H0 $M0</div><div class='add'>+TEST useradd -M test_user 2&gt;/dev/null</div><div class='add'>+</div><div class='add'>+# Create 3 files as root.</div><div class='add'>+TEST touch $M0/foo</div><div class='add'>+TEST touch $M0/bar</div><div class='add'>+TEST touch $M0/baz</div><div class='add'>+TEST touch $M0/qux</div><div class='add'>+TEST mkdir $M0/dir</div><div class='add'>+</div><div class='add'>+# Change ownership to non-root on foo and bar.</div><div class='add'>+TEST chown test_user:test_user $M0/foo</div><div class='add'>+TEST chown test_user:test_user $M0/bar</div><div class='add'>+</div><div class='add'>+# Write 6M of data on foo as non-root, 2M overflowing into block-1.</div><div class='add'>+TEST run_cmd_as_user test_user "dd if=/dev/zero of=$M0/foo bs=1M count=6"</div><div class='add'>+</div><div class='add'>+# Ensure owner and group are root on the block-1 shard.</div><div class='add'>+gfid_foo=$(get_gfid_string $M0/foo)</div><div class='add'>+</div><div class='add'>+EXPECT "root" echo `find $B0 -name $gfid_foo.1 | xargs stat -c %U`</div><div class='add'>+EXPECT "root" echo `find $B0 -name $gfid_foo.1 | xargs stat -c %G`</div><div class='add'>+</div><div class='add'>+#Ensure /.shard is owned by root.</div><div class='add'>+EXPECT "root" echo `find $B0/${V0}0 -name .shard | xargs stat -c %U`</div><div class='add'>+EXPECT "root" echo `find $B0/${V0}0 -name .shard | xargs stat -c %G`</div><div class='add'>+EXPECT "root" echo `find $B0/${V0}1 -name .shard | xargs stat -c %U`</div><div class='add'>+EXPECT "root" echo `find $B0/${V0}1 -name .shard | xargs stat -c %G`</div><div class='add'>+EXPECT "root" echo `find $B0/${V0}2 -name .shard | xargs stat -c %U`</div><div class='add'>+EXPECT "root" echo `find $B0/${V0}2 -name .shard | xargs stat -c %G`</div><div class='add'>+EXPECT "root" echo `find $B0/${V0}3 -name .shard | xargs stat -c %U`</div><div class='add'>+EXPECT "root" echo `find $B0/${V0}3 -name .shard | xargs stat -c %G`</div><div class='add'>+</div><div class='add'>+# Write 6M of data on bar as root.</div><div class='add'>+TEST dd if=/dev/zero of=$M0/bar bs=1M count=6</div><div class='add'>+</div><div class='add'>+# Ensure owner and group are root on the block-1 shard.</div><div class='add'>+gfid_bar=$(get_gfid_string $M0/bar)</div><div class='add'>+</div><div class='add'>+EXPECT "root" echo `find $B0 -name $gfid_bar.1 | xargs stat -c %U`</div><div class='add'>+EXPECT "root" echo `find $B0 -name $gfid_bar.1 | xargs stat -c %G`</div><div class='add'>+</div><div class='add'>+# Write 6M of data on baz as root.</div><div class='add'>+TEST dd if=/dev/zero of=$M0/baz bs=1M count=6</div><div class='add'>+</div><div class='add'>+gfid_baz=$(get_gfid_string $M0/baz)</div><div class='add'>+</div><div class='add'>+# Ensure owner and group are root on the block-1 shard.</div><div class='add'>+EXPECT "root" echo `find $B0 -name $gfid_baz.1 | xargs stat -c %U`</div><div class='add'>+EXPECT "root" echo `find $B0 -name $gfid_baz.1 | xargs stat -c %G`</div><div class='add'>+</div><div class='add'>+# Test to ensure unlink from an unauthorized user does not lead to only</div><div class='add'>+# the shards under /.shard getting unlinked while that on the base file fails</div><div class='add'>+# with EPERM/ACCES.</div><div class='add'>+</div><div class='add'>+TEST ! run_cmd_as_user test_user "unlink $M0/baz"</div><div class='add'>+TEST find $B0/*/.shard/$gfid_baz.1</div><div class='add'>+</div><div class='add'>+# Test to ensure rename of a file where the dest file exists and is sharded,</div><div class='add'>+# from an unauthorized user does not lead to only the shards under /.shard</div><div class='add'>+# getting unlinked while that on the base file fails with EPERM/ACCES.</div><div class='add'>+</div><div class='add'>+TEST ! run_cmd_as_user test_user "mv -f $M0/qux $M0/baz"</div><div class='add'>+TEST find $B0/*/.shard/$gfid_baz.1</div><div class='add'>+TEST stat $M0/qux</div><div class='add'>+</div><div class='add'>+# Shard translator executes steps in the following order while doing a truncate</div><div class='add'>+# to a lower size:</div><div class='add'>+# 1) unlinking shards under /.shard first with frame-&gt;root-&gt;{uid,gid} being 0,</div><div class='add'>+# 2) truncate the original file by the right amount.</div><div class='add'>+# The following two tests are towards ensuring that truncate attempt from an</div><div class='add'>+# unauthorised user doesn't result in only the shards under /.shard getting</div><div class='add'>+# removed (since they're being performed as root) while step 2) above fails,</div><div class='add'>+# leaving the file in an inconsistent state.</div><div class='add'>+</div><div class='add'>+TEST ! run_cmd_as_user test_user "truncate -s 1M $M0/baz"</div><div class='add'>+TEST find $B0/*/.shard/$gfid_baz.1</div><div class='add'>+</div><div class='add'>+# Perform a cp as non-root user. This should trigger readv() which will trigger</div><div class='add'>+# reads on first shard of "foo" under /.shard, and this must not fail if shard</div><div class='add'>+# translator correctly sets frame-&gt;root-&gt;uid,gid to 0 before reading off the</div><div class='add'>+# first shard, since it's owned by root.</div><div class='add'>+TEST chown test_user:test_user $M0/dir</div><div class='add'>+TEST run_cmd_as_user test_user "cp $M0/foo $M0/dir/quux"</div><div class='add'>+</div><div class='add'>+md5sum_foo=$(md5sum $M0/foo | awk '{print $1}')</div><div class='add'>+EXPECT "$md5sum_foo" echo `md5sum $M0/dir/quux | awk '{print $1}'`</div><div class='add'>+</div><div class='add'>+userdel test_user</div><div class='add'>+</div><div class='add'>+TEST $CLI volume stop $V0</div><div class='add'>+TEST $CLI volume delete $V0</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/shard/bug-1256580.t b/tests/bugs/shard/bug-1256580.t<br/>new file mode 100644<br/>index 00000000000..279fcc54e48<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/shard/bug-1256580.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/shard/bug-1256580.t</a></div><div class='hunk'>@@ -0,0 +1,34 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 replica 2 $H0:$B0/${V0}{0,1,2,3}</div><div class='add'>+TEST $CLI volume set $V0 features.shard on</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+TEST glusterfs --volfile-id=$V0 --volfile-server=$H0 $M0</div><div class='add'>+</div><div class='add'>+TEST mkdir $M0/dir</div><div class='add'>+TEST touch $M0/dir/file</div><div class='add'>+</div><div class='add'>+# Create "file" with holes.</div><div class='add'>+TEST truncate -s 6M $M0/dir/file</div><div class='add'>+EXPECT '6291456' stat -c %s $M0/dir/file</div><div class='add'>+</div><div class='add'>+# Perform writes that do not cross the 6M boundary</div><div class='add'>+TEST dd if=/dev/zero of=$M0/dir/file bs=1024 seek=3072 count=2048 conv=notrunc</div><div class='add'>+</div><div class='add'>+# Ensure that the file size is 6M (as opposed to 8M that would appear in the</div><div class='add'>+# presence of this bug).</div><div class='add'>+EXPECT '6291456' stat -c %s $M0/dir/file</div><div class='add'>+</div><div class='add'>+#Extend the write beyond EOF such that it again creates a hole of 1M size</div><div class='add'>+TEST dd if=/dev/zero of=$M0/dir/file bs=1024 seek=7168 count=2048 conv=notrunc</div><div class='add'>+</div><div class='add'>+# Ensure that the file size is not greater than 9M.</div><div class='add'>+EXPECT '9437184' stat -c %s $M0/dir/file</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/bugs/shard/bug-1258334.t b/tests/bugs/shard/bug-1258334.t<br/>new file mode 100644<br/>index 00000000000..94ed822aae8<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/shard/bug-1258334.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/shard/bug-1258334.t</a></div><div class='hunk'>@@ -0,0 +1,40 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 replica 2 $H0:$B0/${V0}{0,1,2,3}</div><div class='add'>+TEST $CLI volume set $V0 features.shard on</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+TEST glusterfs --volfile-id=$V0 --volfile-server=$H0 $M0</div><div class='add'>+</div><div class='add'>+TEST mkdir $M0/dir</div><div class='add'>+TEST touch $M0/dir/foo</div><div class='add'>+TEST touch $M0/dir/bar</div><div class='add'>+TEST touch $M0/dir/new</div><div class='add'>+</div><div class='add'>+TEST truncate -s 14M $M0/dir/foo</div><div class='add'>+TEST truncate -s 14M $M0/dir/bar</div><div class='add'>+</div><div class='add'>+# Perform writes that fall on the 2nd block of "foo" (counting from 0)</div><div class='add'>+TEST dd if=/dev/zero of=$M0/dir/foo bs=1024 seek=10240 count=2048 conv=notrunc</div><div class='add'>+</div><div class='add'>+# Perform writes that fall on the 2nd block of "bar" (counting from 0)</div><div class='add'>+TEST dd if=/dev/zero of=$M0/dir/bar bs=1024 seek=10240 count=2048 conv=notrunc</div><div class='add'>+</div><div class='add'>+# Now unlink "foo". If the bug exists, it should fail with EINVAL.</div><div class='add'>+TEST unlink $M0/dir/foo</div><div class='add'>+</div><div class='add'>+# Now rename "new" to "bar". If the bug exists, it should fail with EINVAL.</div><div class='add'>+TEST mv -f $M0/dir/new $M0/dir/bar</div><div class='add'>+</div><div class='add'>+TEST dd if=/dev/zero of=$M0/dir/new bs=1024 count=5120</div><div class='add'>+</div><div class='add'>+# Now test that this fix does not break unlink of files without holes</div><div class='add'>+TEST unlink $M0/dir/new</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/bugs/shard/bug-1259651.t b/tests/bugs/shard/bug-1259651.t<br/>new file mode 100644<br/>index 00000000000..72856fdbaad<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/shard/bug-1259651.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/shard/bug-1259651.t</a></div><div class='hunk'>@@ -0,0 +1,40 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 replica 2 $H0:$B0/${V0}{0,1,2,3}</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+TEST glusterfs --volfile-id=$V0 --volfile-server=$H0 $M0</div><div class='add'>+</div><div class='add'>+TEST mkdir $M0/dir</div><div class='add'>+TEST touch $M0/dir/file_plain</div><div class='add'>+</div><div class='add'>+# Create "file_plain" with holes.</div><div class='add'>+TEST truncate -s 12M $M0/dir/file_plain</div><div class='add'>+</div><div class='add'>+# Perform writes on it that would create holes.</div><div class='add'>+TEST dd if=/dev/zero of=$M0/dir/file_plain bs=1024 seek=10240 count=1024 conv=notrunc</div><div class='add'>+</div><div class='add'>+md5sum_file_plain=$(md5sum $M0/dir/file_plain | awk '{print $1}')</div><div class='add'>+</div><div class='add'>+# Now enable sharding on the volume.</div><div class='add'>+TEST $CLI volume set $V0 features.shard on</div><div class='add'>+</div><div class='add'>+# Create a sharded file called "file_sharded"</div><div class='add'>+TEST touch $M0/dir/file_sharded</div><div class='add'>+</div><div class='add'>+# Truncate it to make it sparse</div><div class='add'>+TEST truncate -s 12M $M0/dir/file_sharded</div><div class='add'>+</div><div class='add'>+# Perform writes on it that would create holes in block-0 and block-1.</div><div class='add'>+TEST dd if=/dev/zero of=$M0/dir/file_sharded bs=1024 seek=10240 count=1024 conv=notrunc</div><div class='add'>+</div><div class='add'>+# If this bug is fixed, md5sum of file_sharded and file_plain should be same.</div><div class='add'>+EXPECT "$md5sum_file_plain" echo `md5sum $M0/dir/file_sharded | awk '{print $1}'`</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/bugs/shard/bug-1260637.t b/tests/bugs/shard/bug-1260637.t<br/>new file mode 100644<br/>index 00000000000..21008ee19dd<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/shard/bug-1260637.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/shard/bug-1260637.t</a></div><div class='hunk'>@@ -0,0 +1,42 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/${V0}0</div><div class='add'>+TEST $CLI volume set $V0 features.shard on</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+TEST glusterfs --volfile-id=$V0 --volfile-server=$H0 $M0</div><div class='add'>+</div><div class='add'>+# Create a file.</div><div class='add'>+TEST touch $M0/foo</div><div class='add'>+</div><div class='add'>+# Check that the shard xattrs are set in the backend.</div><div class='add'>+TEST getfattr -n trusted.glusterfs.shard.block-size $B0/${V0}0/foo</div><div class='add'>+TEST getfattr -n trusted.glusterfs.shard.file-size $B0/${V0}0/foo</div><div class='add'>+</div><div class='add'>+# Verify that shard xattrs are not exposed on the mount.</div><div class='add'>+TEST ! getfattr -n trusted.glusterfs.shard.block-size $M0/foo</div><div class='add'>+TEST ! getfattr -n trusted.glusterfs.shard.file-size $M0/foo</div><div class='add'>+</div><div class='add'>+# Verify that shard xattrs cannot be set from the mount.</div><div class='add'>+TEST ! setfattr -n trusted.glusterfs.shard.block-size -v "123" $M0/foo</div><div class='add'>+TEST ! setfattr -n trusted.glusterfs.shard.file-size  -v "123" $M0/foo</div><div class='add'>+</div><div class='add'>+# Verify that shard xattrs cannot be removed from the mount.</div><div class='add'>+TEST ! setfattr -x trusted.glusterfs.shard.block-size $M0/foo</div><div class='add'>+TEST ! setfattr -x trusted.glusterfs.shard.file-size $M0/foo</div><div class='add'>+</div><div class='add'>+# Verify that shard xattrs are not listed when listxattr is triggered.</div><div class='add'>+TEST ! "getfattr -d -m . $M0/foo | grep shard"</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+TEST $CLI volume stop $V0</div><div class='add'>+TEST $CLI volume delete $V0</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/bugs/shard/bug-1261773.t b/tests/bugs/shard/bug-1261773.t<br/>new file mode 100644<br/>index 00000000000..46d5a8b91c9<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/shard/bug-1261773.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/shard/bug-1261773.t</a></div><div class='hunk'>@@ -0,0 +1,14 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+</div><div class='add'>+TEST check_option_help_presence "features.shard"</div><div class='add'>+TEST check_option_help_presence "features.shard-block-size"</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/bugs/shard/bug-1272986.t b/tests/bugs/shard/bug-1272986.t<br/>new file mode 100644<br/>index 00000000000..66e896ad0c4<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/shard/bug-1272986.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/shard/bug-1272986.t</a></div><div class='hunk'>@@ -0,0 +1,35 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 replica 2 $H0:$B0/${V0}{0,1,2,3}</div><div class='add'>+TEST $CLI volume set $V0 features.shard on</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+# $M0 is where the reads will be done and $M1 is where files will be created,</div><div class='add'>+# written to, etc.</div><div class='add'>+TEST glusterfs --volfile-id=$V0 --volfile-server=$H0 $M0</div><div class='add'>+TEST glusterfs --volfile-id=$V0 --volfile-server=$H0 $M1</div><div class='add'>+</div><div class='add'>+# Write some data into a file, such that its size crosses the shard block size.</div><div class='add'>+TEST dd if=/dev/urandom of=$M1/file bs=1M count=5 conv=notrunc oflag=direct</div><div class='add'>+</div><div class='add'>+md5sum1_reader=$(md5sum $M0/file | awk '{print $1}')</div><div class='add'>+</div><div class='add'>+EXPECT "$md5sum1_reader" echo `md5sum $M1/file | awk '{print $1}'`</div><div class='add'>+</div><div class='add'>+# Append some more data into the file.</div><div class='add'>+TEST dd if=/dev/urandom of=$M1/file bs=256k count=1 conv=notrunc oflag=direct</div><div class='add'>+</div><div class='add'>+md5sum2_reader=$(dd if=$M0/file iflag=direct bs=256k| md5sum | awk '{print $1}')</div><div class='add'>+</div><div class='add'>+# Test to see if the reader refreshes its cache correctly as part of the reads</div><div class='add'>+# triggered through md5sum. If it does, then the md5sum on the reader and writer</div><div class='add'>+# must match.</div><div class='add'>+EXPECT "$md5sum2_reader" echo `md5sum $M1/file | awk '{print $1}'`</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/bugs/shard/bug-1342298.t b/tests/bugs/shard/bug-1342298.t<br/>new file mode 100644<br/>index 00000000000..ecd7720e8db<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/shard/bug-1342298.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/shard/bug-1342298.t</a></div><div class='hunk'>@@ -0,0 +1,23 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 replica 2 $H0:$B0/${V0}{0,1}</div><div class='add'>+TEST $CLI volume set $V0 performance.quick-read off</div><div class='add'>+TEST $CLI volume set $V0 performance.io-cache off</div><div class='add'>+TEST $CLI volume set $V0 performance.write-behind off</div><div class='add'>+TEST $CLI volume set $V0 performance.stat-prefetch off</div><div class='add'>+TEST $CLI volume set $V0 performance.read-ahead off</div><div class='add'>+TEST $CLI volume set $V0 performance.open-behind off</div><div class='add'>+TEST $CLI volume set $V0 features.shard on</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+TEST $GFS --volfile-id=$V0 --volfile-server=$H0 $M0</div><div class='add'>+echo a &gt; $M0/a</div><div class='add'>+TEST dd if=$M0/a of=/dev/null bs=4096 count=1 iflag=direct</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/shard/bug-1468483.t b/tests/bugs/shard/bug-1468483.t<br/>new file mode 100644<br/>index 00000000000..e462b8d54d5<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/shard/bug-1468483.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/shard/bug-1468483.t</a></div><div class='hunk'>@@ -0,0 +1,58 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+. $(dirname $0)/../../common-utils.rc</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/${V0}0</div><div class='add'>+TEST $CLI volume set $V0 performance.write-behind off</div><div class='add'>+TEST $CLI volume set $V0 features.shard on</div><div class='add'>+TEST $CLI volume set $V0 features.shard-block-size 16MB</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+TEST $CLI volume profile $V0 start</div><div class='add'>+</div><div class='add'>+TEST $GFS --volfile-id=$V0 --volfile-server=$H0 $M0</div><div class='add'>+TEST dd if=/dev/zero conv=fsync of=$M0/foo bs=1M count=100</div><div class='add'>+</div><div class='add'>+#This should ensure /.shard is created on the bricks.</div><div class='add'>+TEST stat $B0/${V0}0/.shard</div><div class='add'>+</div><div class='add'>+gfid_foo=$(get_gfid_string $M0/foo)</div><div class='add'>+</div><div class='add'>+TEST stat $B0/${V0}0/.shard/$gfid_foo.1</div><div class='add'>+TEST stat $B0/${V0}0/.shard/$gfid_foo.2</div><div class='add'>+TEST stat $B0/${V0}0/.shard/$gfid_foo.3</div><div class='add'>+TEST stat $B0/${V0}0/.shard/$gfid_foo.4</div><div class='add'>+TEST stat $B0/${V0}0/.shard/$gfid_foo.5</div><div class='add'>+TEST stat $B0/${V0}0/.shard/$gfid_foo.6</div><div class='add'>+</div><div class='add'>+# For a file with 7 shards, there should be 7 fsyncs on the brick. Without this</div><div class='add'>+# fix, I was seeing only 1 fsync (on the base shard alone).</div><div class='add'>+</div><div class='add'>+EXPECT "7" echo `$CLI volume profile $V0 info incremental | grep -w FSYNC | awk '{print $8}'`</div><div class='add'>+</div><div class='add'>+useradd -M test_user 2&gt;/dev/null</div><div class='add'>+</div><div class='add'>+TEST touch $M0/bar</div><div class='add'>+</div><div class='add'>+# Change ownership to non-root on bar.</div><div class='add'>+TEST chown test_user:test_user $M0/bar</div><div class='add'>+</div><div class='add'>+TEST $CLI volume profile $V0 stop</div><div class='add'>+TEST $CLI volume profile $V0 start</div><div class='add'>+</div><div class='add'>+# Write 100M of data on bar as non-root.</div><div class='add'>+TEST run_cmd_as_user test_user "dd if=/dev/zero conv=fsync of=$M0/bar bs=1M count=100"</div><div class='add'>+</div><div class='add'>+EXPECT "7" echo `$CLI volume profile $V0 info incremental | grep -w FSYNC | awk '{print $8}'`</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+userdel test_user</div><div class='add'>+TEST $CLI volume stop $V0</div><div class='add'>+TEST $CLI volume delete $V0</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/bugs/shard/bug-1488546.t b/tests/bugs/shard/bug-1488546.t<br/>new file mode 100644<br/>index 00000000000..60480dc55e5<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/shard/bug-1488546.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/shard/bug-1488546.t</a></div><div class='hunk'>@@ -0,0 +1,25 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 replica 3 $H0:$B0/${V0}{0,1,2}</div><div class='add'>+TEST $CLI volume set $V0 features.shard on</div><div class='add'>+TEST $CLI volume set $V0 md-cache-timeout 60</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+TEST glusterfs --volfile-id=$V0 --volfile-server=$H0 $M0</div><div class='add'>+</div><div class='add'>+TEST dd if=/dev/zero of=$M0/file bs=1M count=20</div><div class='add'>+TEST ln $M0/file $M0/linkey</div><div class='add'>+</div><div class='add'>+EXPECT "20971520" stat -c %s $M0/linkey</div><div class='add'>+</div><div class='add'>+TEST $CLI volume stop $V0</div><div class='add'>+TEST $CLI volume delete $V0</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/shard/bug-1568521-EEXIST.t b/tests/bugs/shard/bug-1568521-EEXIST.t<br/>new file mode 100644<br/>index 00000000000..2f9f165aa63<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/shard/bug-1568521-EEXIST.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/shard/bug-1568521-EEXIST.t</a></div><div class='hunk'>@@ -0,0 +1,91 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='add'>+</div><div class='add'>+function get_file_count {</div><div class='add'>+    ls $1* | wc -l</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+FILE_COUNT_TIME=5</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 replica 2 $H0:$B0/${V0}{0,1}</div><div class='add'>+TEST $CLI volume set $V0 features.shard on</div><div class='add'>+TEST $CLI volume set $V0 features.shard-block-size 4MB</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+TEST glusterfs --volfile-id=$V0 --volfile-server=$H0 $M0</div><div class='add'>+</div><div class='add'>+TEST mkdir $M0/dir</div><div class='add'>+# Unlink a temporary file to trigger creation of .remove_me</div><div class='add'>+TEST touch $M0/tmp</div><div class='add'>+TEST unlink $M0/tmp</div><div class='add'>+</div><div class='add'>+TEST stat $B0/${V0}0/.shard/.remove_me</div><div class='add'>+TEST stat $B0/${V0}1/.shard/.remove_me</div><div class='add'>+</div><div class='add'>+TEST dd if=/dev/zero of=$M0/dir/file bs=1024 count=9216</div><div class='add'>+gfid_file=$(get_gfid_string $M0/dir/file)</div><div class='add'>+</div><div class='add'>+# Create marker file from the backend to simulate ENODATA.</div><div class='add'>+touch $B0/${V0}0/.shard/.remove_me/$gfid_file</div><div class='add'>+touch $B0/${V0}1/.shard/.remove_me/$gfid_file</div><div class='add'>+</div><div class='add'>+# Set block and file size to incorrect values of 64MB and 5MB to simulate "stale xattrs" case</div><div class='add'>+# and confirm that the correct values are set when the actual unlink takes place</div><div class='add'>+</div><div class='add'>+TEST setfattr -n trusted.glusterfs.shard.block-size -v 0x0000000004000000 $B0/${V0}0/.shard/.remove_me/$gfid_file</div><div class='add'>+TEST setfattr -n trusted.glusterfs.shard.block-size -v 0x0000000004000000 $B0/${V0}1/.shard/.remove_me/$gfid_file</div><div class='add'>+</div><div class='add'>+TEST setfattr -n trusted.glusterfs.shard.file-size -v 0x0000000000500000000000000000000000000000000000000000000000000000 $B0/${V0}0/.shard/.remove_me/$gfid_file</div><div class='add'>+TEST setfattr -n trusted.glusterfs.shard.file-size -v 0x0000000000500000000000000000000000000000000000000000000000000000 $B0/${V0}1/.shard/.remove_me/$gfid_file</div><div class='add'>+</div><div class='add'>+# Sleep for 2 seconds to prevent posix_gfid_heal() from believing marker file is "fresh" and failing lookup with ENOENT</div><div class='add'>+sleep 2</div><div class='add'>+</div><div class='add'>+TEST unlink $M0/dir/file</div><div class='add'>+TEST ! stat $B0/${V0}0/dir/file</div><div class='add'>+TEST ! stat $B0/${V0}1/dir/file</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $FILE_COUNT_TIME 0 get_file_count $B0/${V0}0/.shard/.remove_me/$gfid_file</div><div class='add'>+EXPECT_WITHIN $FILE_COUNT_TIME 0 get_file_count $B0/${V0}1/.shard/.remove_me/$gfid_file</div><div class='add'>+EXPECT_WITHIN $FILE_COUNT_TIME 0 get_file_count $B0/${V0}0/.shard/$gfid_file</div><div class='add'>+EXPECT_WITHIN $FILE_COUNT_TIME 0 get_file_count $B0/${V0}1/.shard/$gfid_file</div><div class='add'>+</div><div class='add'>+##############################</div><div class='add'>+### Repeat test for rename ###</div><div class='add'>+##############################</div><div class='add'>+</div><div class='add'>+TEST touch $M0/src</div><div class='add'>+TEST dd if=/dev/zero of=$M0/dir/dst bs=1024 count=9216</div><div class='add'>+gfid_dst=$(get_gfid_string $M0/dir/dst)</div><div class='add'>+</div><div class='add'>+# Create marker file from the backend to simulate ENODATA.</div><div class='add'>+touch $B0/${V0}0/.shard/.remove_me/$gfid_dst</div><div class='add'>+touch $B0/${V0}1/.shard/.remove_me/$gfid_dst</div><div class='add'>+</div><div class='add'>+# Set block and file size to incorrect values of 64MB and 5MB to simulate "stale xattrs" case</div><div class='add'>+# and confirm that the correct values are set when the actual unlink takes place</div><div class='add'>+</div><div class='add'>+TEST setfattr -n trusted.glusterfs.shard.block-size -v 0x0000000004000000 $B0/${V0}0/.shard/.remove_me/$gfid_dst</div><div class='add'>+TEST setfattr -n trusted.glusterfs.shard.block-size -v 0x0000000004000000 $B0/${V0}1/.shard/.remove_me/$gfid_dst</div><div class='add'>+</div><div class='add'>+TEST setfattr -n trusted.glusterfs.shard.file-size -v 0x0000000000500000000000000000000000000000000000000000000000000000 $B0/${V0}0/.shard/.remove_me/$gfid_dst</div><div class='add'>+TEST setfattr -n trusted.glusterfs.shard.file-size -v 0x0000000000500000000000000000000000000000000000000000000000000000 $B0/${V0}1/.shard/.remove_me/$gfid_dst</div><div class='add'>+</div><div class='add'>+# Sleep for 2 seconds to prevent posix_gfid_heal() from believing marker file is "fresh" and failing lookup with ENOENT</div><div class='add'>+sleep 2</div><div class='add'>+</div><div class='add'>+TEST mv -f $M0/src $M0/dir/dst</div><div class='add'>+TEST ! stat $B0/${V0}0/src</div><div class='add'>+TEST ! stat $B0/${V0}1/src</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $FILE_COUNT_TIME 0 get_file_count $B0/${V0}0/.shard/.remove_me/$gfid_dst</div><div class='add'>+EXPECT_WITHIN $FILE_COUNT_TIME 0 get_file_count $B0/${V0}1/.shard/.remove_me/$gfid_dst</div><div class='add'>+EXPECT_WITHIN $FILE_COUNT_TIME 0 get_file_count $B0/${V0}0/.shard/$gfid_dst</div><div class='add'>+EXPECT_WITHIN $FILE_COUNT_TIME 0 get_file_count $B0/${V0}1/.shard/$gfid_dst</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/bugs/shard/bug-1568521.t b/tests/bugs/shard/bug-1568521.t<br/>new file mode 100644<br/>index 00000000000..167fb635ac8<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/shard/bug-1568521.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/shard/bug-1568521.t</a></div><div class='hunk'>@@ -0,0 +1,53 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+function delete_files {</div><div class='add'>+        local mountpoint=$1;</div><div class='add'>+        local success=0;</div><div class='add'>+        local value=$2</div><div class='add'>+        for i in {1..500}; do</div><div class='add'>+                unlink $mountpoint/file-$i 2&gt;/dev/null 1&gt;/dev/null</div><div class='add'>+                if [ $? -eq 0 ]; then</div><div class='add'>+                        echo $2 &gt;&gt; $B0/output.txt</div><div class='add'>+                fi</div><div class='add'>+        done</div><div class='add'>+        echo $success</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 replica 2 $H0:$B0/${V0}{0,1}</div><div class='add'>+TEST $CLI volume set $V0 features.shard on</div><div class='add'>+TEST $CLI volume set $V0 shard-block-size 4MB</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+TEST $GFS --volfile-id=$V0 --volfile-server=$H0 $M0</div><div class='add'>+TEST $GFS --volfile-id=$V0 --volfile-server=$H0 $M1</div><div class='add'>+</div><div class='add'>+for i in {1..500}; do</div><div class='add'>+        dd if=/dev/urandom of=$M0/file-$i bs=1M count=2</div><div class='add'>+done</div><div class='add'>+</div><div class='add'>+for i in {1..500}; do</div><div class='add'>+        stat $M1/file-$i &gt; /dev/null</div><div class='add'>+done</div><div class='add'>+</div><div class='add'>+delete_files $M0 0 &amp;</div><div class='add'>+delete_files $M1 1 &amp;</div><div class='add'>+wait</div><div class='add'>+</div><div class='add'>+success1=$(grep 0 $B0/output.txt | wc -l);</div><div class='add'>+success2=$(grep 1 $B0/output.txt | wc -l);</div><div class='add'>+</div><div class='add'>+echo "Success1 is $success1";</div><div class='add'>+echo "Success2 is $success2";</div><div class='add'>+</div><div class='add'>+success_total=$((success1 + success2));</div><div class='add'>+</div><div class='add'>+EXPECT 500 echo $success_total</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/bugs/shard/bug-1605056-2.t b/tests/bugs/shard/bug-1605056-2.t<br/>new file mode 100644<br/>index 00000000000..a9c10fec3ea<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/shard/bug-1605056-2.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/shard/bug-1605056-2.t</a></div><div class='hunk'>@@ -0,0 +1,34 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 replica 3 $H0:$B0/${V0}{0,1,2}</div><div class='add'>+TEST $CLI volume set $V0 features.shard on</div><div class='add'>+TEST $CLI volume set $V0 features.shard-block-size 4MB</div><div class='add'>+TEST $CLI volume set $V0 features.shard-lru-limit 25</div><div class='add'>+TEST $CLI volume set $V0 performance.write-behind off</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+TEST $GFS --volfile-id=$V0 --volfile-server=$H0 $M0</div><div class='add'>+</div><div class='add'>+# Perform a write that would cause 25 shards to be created under .shard</div><div class='add'>+TEST dd if=/dev/zero of=$M0/foo bs=1M count=104</div><div class='add'>+</div><div class='add'>+# Write into another file bar to ensure all of foo's shards are evicted from lru list of $M0</div><div class='add'>+TEST dd if=/dev/zero of=$M0/bar bs=1M count=104</div><div class='add'>+</div><div class='add'>+# Delete foo from $M0. If there's a bug, the mount will crash.</div><div class='add'>+TEST unlink $M0/foo</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+</div><div class='add'>+TEST $CLI volume stop $V0</div><div class='add'>+TEST $CLI volume delete $V0</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/bugs/shard/bug-1605056.t b/tests/bugs/shard/bug-1605056.t<br/>new file mode 100644<br/>index 00000000000..c2329ea79f8<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/shard/bug-1605056.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/shard/bug-1605056.t</a></div><div class='hunk'>@@ -0,0 +1,63 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+SHARD_COUNT_TIME=5</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 replica 3 $H0:$B0/${V0}{0,1,2}</div><div class='add'>+TEST $CLI volume set $V0 features.shard on</div><div class='add'>+TEST $CLI volume set $V0 features.shard-block-size 4MB</div><div class='add'>+TEST $CLI volume set $V0 features.shard-lru-limit 25</div><div class='add'>+TEST $CLI volume set $V0 performance.write-behind off</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+TEST $GFS --volfile-id=$V0 --volfile-server=$H0 $M0</div><div class='add'>+TEST $GFS --volfile-id=$V0 --volfile-server=$H0 $M1</div><div class='add'>+</div><div class='add'>+# Perform a write that would cause 25 shards to be created under .shard</div><div class='add'>+TEST dd if=/dev/zero of=$M0/foo bs=1M count=104</div><div class='add'>+</div><div class='add'>+# Read the file from $M1, indirectly filling up the lru list.</div><div class='add'>+TEST `cat $M1/foo &gt; /dev/null`</div><div class='add'>+statedump=$(generate_mount_statedump $V0 $M1)</div><div class='add'>+sleep 1</div><div class='add'>+EXPECT "25" echo $(grep "inode-count" $statedump | cut -f2 -d'=' | tail -1)</div><div class='add'>+rm -f $statedump</div><div class='add'>+</div><div class='add'>+# Delete foo from $M0.</div><div class='add'>+TEST unlink $M0/foo</div><div class='add'>+</div><div class='add'>+# Send stat on foo from $M1 to force $M1 to "forget" inode associated with foo.</div><div class='add'>+# Now the ghost shards associated with "foo" are still in lru list of $M1.</div><div class='add'>+TEST ! stat $M1/foo</div><div class='add'>+</div><div class='add'>+# Let's force the ghost shards of "foo" out of lru list by looking up more shards</div><div class='add'>+# through I/O on a file named "bar" from $M1. This should crash if the base inode</div><div class='add'>+# had been destroyed by now.</div><div class='add'>+</div><div class='add'>+TEST dd if=/dev/zero of=$M1/bar bs=1M count=104</div><div class='add'>+</div><div class='add'>+###############################################</div><div class='add'>+#### Now for some inode ref-leak tests ... ####</div><div class='add'>+###############################################</div><div class='add'>+</div><div class='add'>+# Expect there to be 29 active inodes - 26 belonging to "bar", 1 for .shard,</div><div class='add'>+# 1 for .shard/remove_me and 1 for '/'</div><div class='add'>+EXPECT_WITHIN $SHARD_COUNT_TIME `expr 26 + 3` get_mount_active_size_value $V0 $M1</div><div class='add'>+</div><div class='add'>+TEST rm -f $M1/bar</div><div class='add'>+EXPECT_WITHIN $SHARD_COUNT_TIME 3 get_mount_active_size_value $V0 $M1</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M1</div><div class='add'>+</div><div class='add'>+TEST $CLI volume stop $V0</div><div class='add'>+TEST $CLI volume delete $V0</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/bugs/shard/bug-1669077.t b/tests/bugs/shard/bug-1669077.t<br/>new file mode 100644<br/>index 00000000000..8d3a67a36be<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/shard/bug-1669077.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/shard/bug-1669077.t</a></div><div class='hunk'>@@ -0,0 +1,29 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+SHARD_COUNT_TIME=5</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 replica 3 $H0:$B0/${V0}{0,1,2}</div><div class='add'>+TEST $CLI volume set $V0 features.shard on</div><div class='add'>+TEST $CLI volume set $V0 features.shard-block-size 4MB</div><div class='add'>+TEST $CLI volume set $V0 features.shard-lru-limit 25</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+TEST $GFS --volfile-id=$V0 --volfile-server=$H0 $M0</div><div class='add'>+</div><div class='add'>+# If the bug still exists, client should crash during fallocate below</div><div class='add'>+TEST fallocate -l 200M $M0/foo</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+</div><div class='add'>+TEST $CLI volume stop $V0</div><div class='add'>+TEST $CLI volume delete $V0</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/bugs/shard/bug-1696136-lru-limit-equals-deletion-rate.t b/tests/bugs/shard/bug-1696136-lru-limit-equals-deletion-rate.t<br/>new file mode 100644<br/>index 00000000000..3e4a65af19a<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/shard/bug-1696136-lru-limit-equals-deletion-rate.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/shard/bug-1696136-lru-limit-equals-deletion-rate.t</a></div><div class='hunk'>@@ -0,0 +1,34 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+. $(dirname $0)/../../fallocate.rc</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 replica 3 $H0:$B0/${V0}{0,1,2}</div><div class='add'>+TEST $CLI volume set $V0 features.shard on</div><div class='add'>+TEST $CLI volume set $V0 features.shard-block-size 4MB</div><div class='add'>+TEST $CLI volume set $V0 features.shard-lru-limit 120</div><div class='add'>+TEST $CLI volume set $V0 features.shard-deletion-rate 120</div><div class='add'>+TEST $CLI volume set $V0 performance.write-behind off</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+TEST $GFS --volfile-id=$V0 --volfile-server=$H0 $M0</div><div class='add'>+</div><div class='add'>+TEST build_tester $(dirname $0)/bug-1696136.c -lgfapi -Wall -O2</div><div class='add'>+</div><div class='add'>+# Create a file</div><div class='add'>+TEST touch $M0/file1</div><div class='add'>+</div><div class='add'>+# Fallocate a 500M file. This will make sure number of participant shards are &gt; lru-limit</div><div class='add'>+TEST $(dirname $0)/bug-1696136 $H0 $V0 "0" "0" "536870912" /file1 `gluster --print-logdir`/glfs-$V0.log</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+TEST $CLI volume stop $V0</div><div class='add'>+TEST $CLI volume delete $V0</div><div class='add'>+rm -f $(dirname $0)/bug-1696136</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/bugs/shard/bug-1696136.c b/tests/bugs/shard/bug-1696136.c<br/>new file mode 100644<br/>index 00000000000..cb650535b09<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/shard/bug-1696136.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/shard/bug-1696136.c</a></div><div class='hunk'>@@ -0,0 +1,122 @@</div><div class='add'>+#define _GNU_SOURCE</div><div class='add'>+#include &lt;fcntl.h&gt;</div><div class='add'>+#include &lt;stdio.h&gt;</div><div class='add'>+#include &lt;stdlib.h&gt;</div><div class='add'>+#include &lt;glusterfs/api/glfs.h&gt;</div><div class='add'>+#include &lt;glusterfs/api/glfs-handles.h&gt;</div><div class='add'>+</div><div class='add'>+enum fallocate_flag {</div><div class='add'>+    TEST_FALLOCATE_NONE,</div><div class='add'>+    TEST_FALLOCATE_KEEP_SIZE,</div><div class='add'>+    TEST_FALLOCATE_ZERO_RANGE,</div><div class='add'>+    TEST_FALLOCATE_PUNCH_HOLE,</div><div class='add'>+    TEST_FALLOCATE_MAX,</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+get_fallocate_flag(int opcode)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    switch (opcode) {</div><div class='add'>+        case TEST_FALLOCATE_NONE:</div><div class='add'>+            ret = 0;</div><div class='add'>+            break;</div><div class='add'>+        case TEST_FALLOCATE_KEEP_SIZE:</div><div class='add'>+            ret = FALLOC_FL_KEEP_SIZE;</div><div class='add'>+            break;</div><div class='add'>+        case TEST_FALLOCATE_ZERO_RANGE:</div><div class='add'>+            ret = FALLOC_FL_ZERO_RANGE;</div><div class='add'>+            break;</div><div class='add'>+        case TEST_FALLOCATE_PUNCH_HOLE:</div><div class='add'>+            ret = FALLOC_FL_PUNCH_HOLE;</div><div class='add'>+            break;</div><div class='add'>+        default:</div><div class='add'>+            ret = -1;</div><div class='add'>+            break;</div><div class='add'>+    }</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+main(int argc, char *argv[])</div><div class='add'>+{</div><div class='add'>+    int ret = 1;</div><div class='add'>+    int opcode = -1;</div><div class='add'>+    off_t offset = 0;</div><div class='add'>+    size_t len = 0;</div><div class='add'>+    glfs_t *fs = NULL;</div><div class='add'>+    glfs_fd_t *fd = NULL;</div><div class='add'>+</div><div class='add'>+    if (argc != 8) {</div><div class='add'>+        fprintf(stderr,</div><div class='add'>+                "Syntax: %s &lt;host&gt; &lt;volname&gt; &lt;opcode&gt; &lt;offset&gt; &lt;len&gt; "</div><div class='add'>+                "&lt;file-path&gt; &lt;log-file&gt;\n",</div><div class='add'>+                argv[0]);</div><div class='add'>+        return 1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    fs = glfs_new(argv[2]);</div><div class='add'>+    if (!fs) {</div><div class='add'>+        fprintf(stderr, "glfs_new: returned NULL\n");</div><div class='add'>+        return 1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = glfs_set_volfile_server(fs, "tcp", argv[1], 24007);</div><div class='add'>+    if (ret != 0) {</div><div class='add'>+        fprintf(stderr, "glfs_set_volfile_server: returned %d\n", ret);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = glfs_set_logging(fs, argv[7], 7);</div><div class='add'>+    if (ret != 0) {</div><div class='add'>+        fprintf(stderr, "glfs_set_logging: returned %d\n", ret);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = glfs_init(fs);</div><div class='add'>+    if (ret != 0) {</div><div class='add'>+        fprintf(stderr, "glfs_init: returned %d\n", ret);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    opcode = atoi(argv[3]);</div><div class='add'>+    opcode = get_fallocate_flag(opcode);</div><div class='add'>+    if (opcode &lt; 0) {</div><div class='add'>+        fprintf(stderr, "get_fallocate_flag: invalid flag \n");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Note that off_t is signed but size_t isn't. */</div><div class='add'>+    offset = strtol(argv[4], NULL, 10);</div><div class='add'>+    len = strtoul(argv[5], NULL, 10);</div><div class='add'>+</div><div class='add'>+    fd = glfs_open(fs, argv[6], O_RDWR);</div><div class='add'>+    if (fd == NULL) {</div><div class='add'>+        fprintf(stderr, "glfs_open: returned NULL\n");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = glfs_fallocate(fd, opcode, offset, len);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(stderr, "glfs_fallocate: returned %d\n", ret);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = glfs_unlink(fs, argv[6]);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(stderr, "glfs_unlink: returned %d\n", ret);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    /* Sleep for 3s to give enough time for background deletion to complete</div><div class='add'>+     * during which if the bug exists, the process will crash.</div><div class='add'>+     */</div><div class='add'>+    sleep(3);</div><div class='add'>+    ret = 0;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (fd)</div><div class='add'>+        glfs_close(fd);</div><div class='add'>+    glfs_fini(fs);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='head'>diff --git a/tests/bugs/shard/bug-1696136.t b/tests/bugs/shard/bug-1696136.t<br/>new file mode 100644<br/>index 00000000000..b6dc858f083<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/shard/bug-1696136.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/shard/bug-1696136.t</a></div><div class='hunk'>@@ -0,0 +1,33 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+. $(dirname $0)/../../fallocate.rc</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 replica 3 $H0:$B0/${V0}{0,1,2}</div><div class='add'>+TEST $CLI volume set $V0 features.shard on</div><div class='add'>+TEST $CLI volume set $V0 features.shard-block-size 4MB</div><div class='add'>+TEST $CLI volume set $V0 features.shard-lru-limit 120</div><div class='add'>+TEST $CLI volume set $V0 performance.write-behind off</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+TEST $GFS --volfile-id=$V0 --volfile-server=$H0 $M0</div><div class='add'>+</div><div class='add'>+TEST build_tester $(dirname $0)/bug-1696136.c -lgfapi -Wall -O2</div><div class='add'>+</div><div class='add'>+# Create a file</div><div class='add'>+TEST touch $M0/file1</div><div class='add'>+</div><div class='add'>+# Fallocate a 500M file. This will make sure number of participant shards are &gt; lru-limit</div><div class='add'>+TEST $(dirname $0)/bug-1696136 $H0 $V0 "0" "0" "536870912" /file1 `gluster --print-logdir`/glfs-$V0.log</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+TEST $CLI volume stop $V0</div><div class='add'>+TEST $CLI volume delete $V0</div><div class='add'>+rm -f $(dirname $0)/bug-1696136</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/bugs/shard/bug-1705884.t b/tests/bugs/shard/bug-1705884.t<br/>new file mode 100644<br/>index 00000000000..f6e50376a58<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/shard/bug-1705884.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/shard/bug-1705884.t</a></div><div class='hunk'>@@ -0,0 +1,32 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+. $(dirname $0)/../../fallocate.rc</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='add'>+</div><div class='add'>+require_fallocate -l 1m $M0/file</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 replica 3 $H0:$B0/${V0}{0,1,2}</div><div class='add'>+TEST $CLI volume set $V0 features.shard on</div><div class='add'>+TEST $CLI volume set $V0 performance.write-behind off</div><div class='add'>+TEST $CLI volume set $V0 performance.stat-prefetch off</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+TEST $GFS --volfile-id=$V0 --volfile-server=$H0 $M0</div><div class='add'>+</div><div class='add'>+TEST fallocate -l 200M $M0/foo</div><div class='add'>+EXPECT `echo "$(( ( 200 * 1024 * 1024 ) / 512 ))"`  stat -c %b $M0/foo</div><div class='add'>+TEST truncate -s 0 $M0/foo</div><div class='add'>+EXPECT "0" stat -c %b $M0/foo</div><div class='add'>+TEST fallocate -l 100M $M0/foo</div><div class='add'>+EXPECT `echo "$(( ( 100 * 1024 * 1024 ) / 512 ))"`  stat -c %b $M0/foo</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+TEST $CLI volume stop $V0</div><div class='add'>+TEST $CLI volume delete $V0</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/bugs/shard/bug-1738419.t b/tests/bugs/shard/bug-1738419.t<br/>new file mode 100644<br/>index 00000000000..8d0a31d9754<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/shard/bug-1738419.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/shard/bug-1738419.t</a></div><div class='hunk'>@@ -0,0 +1,29 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 replica 3 $H0:$B0/${V0}{0,1,2}</div><div class='add'>+TEST $CLI volume set $V0 features.shard on</div><div class='add'>+TEST $CLI volume set $V0 network.remote-dio off</div><div class='add'>+TEST $CLI volume set $V0 performance.io-cache off</div><div class='add'>+TEST $CLI volume set $V0 performance.quick-read off</div><div class='add'>+TEST $CLI volume set $V0 performance.read-ahead off</div><div class='add'>+TEST $CLI volume set $V0 performance.strict-o-direct on</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+TEST $GFS --volfile-id=$V0 --volfile-server=$H0 $M0</div><div class='add'>+</div><div class='add'>+TEST dd if=/dev/zero of=$M0/metadata bs=501 count=1</div><div class='add'>+</div><div class='add'>+EXPECT "501" echo $("dd" if=$M0/metadata bs=4096 count=1 of=/dev/null iflag=direct 2&gt;&amp;1 | awk '/bytes/ {print $1}')</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+TEST $CLI volume stop $V0</div><div class='add'>+TEST $CLI volume delete $V0</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/bugs/shard/bug-shard-discard.c b/tests/bugs/shard/bug-shard-discard.c<br/>new file mode 100644<br/>index 00000000000..6fa93fb89d1<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/shard/bug-shard-discard.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/shard/bug-shard-discard.c</a></div><div class='hunk'>@@ -0,0 +1,70 @@</div><div class='add'>+#include &lt;stdio.h&gt;</div><div class='add'>+#include &lt;stdlib.h&gt;</div><div class='add'>+#include &lt;glusterfs/api/glfs.h&gt;</div><div class='add'>+#include &lt;glusterfs/api/glfs-handles.h&gt;</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+main(int argc, char *argv[])</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+    off_t off = 0;</div><div class='add'>+    size_t len = 0;</div><div class='add'>+    glfs_t *fs = NULL;</div><div class='add'>+    glfs_fd_t *fd = NULL;</div><div class='add'>+</div><div class='add'>+    if (argc != 7) {</div><div class='add'>+        fprintf(</div><div class='add'>+            stderr,</div><div class='add'>+            "Syntax: %s &lt;host&gt; &lt;volname&gt; &lt;file-path&gt; &lt;off&gt; &lt;len&gt; &lt;log-file&gt;\n",</div><div class='add'>+            argv[0]);</div><div class='add'>+        return 1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    fs = glfs_new(argv[2]);</div><div class='add'>+    if (!fs) {</div><div class='add'>+        fprintf(stderr, "glfs_new: returned NULL\n");</div><div class='add'>+        return 1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = glfs_set_volfile_server(fs, "tcp", argv[1], 24007);</div><div class='add'>+    if (ret != 0) {</div><div class='add'>+        fprintf(stderr, "glfs_set_volfile_server: returned %d\n", ret);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = glfs_set_logging(fs, argv[6], 7);</div><div class='add'>+    if (ret != 0) {</div><div class='add'>+        fprintf(stderr, "glfs_set_logging: returned %d\n", ret);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = glfs_init(fs);</div><div class='add'>+    if (ret != 0) {</div><div class='add'>+        fprintf(stderr, "glfs_init: returned %d\n", ret);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    fd = glfs_open(fs, argv[3], O_RDWR);</div><div class='add'>+    if (fd == NULL) {</div><div class='add'>+        fprintf(stderr, "glfs_open: returned NULL\n");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Note that off_t is signed but size_t isn't. */</div><div class='add'>+    off = strtol(argv[4], NULL, 10);</div><div class='add'>+    len = strtoul(argv[5], NULL, 10);</div><div class='add'>+</div><div class='add'>+    ret = glfs_discard(fd, off, len);</div><div class='add'>+    if (ret &lt;= 0) {</div><div class='add'>+        fprintf(stderr, "glfs_discard: returned %d\n", ret);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (fd)</div><div class='add'>+        glfs_close(fd);</div><div class='add'>+    glfs_fini(fs);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='head'>diff --git a/tests/bugs/shard/bug-shard-discard.t b/tests/bugs/shard/bug-shard-discard.t<br/>new file mode 100644<br/>index 00000000000..910ade14801<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/shard/bug-shard-discard.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/shard/bug-shard-discard.t</a></div><div class='hunk'>@@ -0,0 +1,65 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='add'>+</div><div class='add'>+FILE_COUNT_TIME=5</div><div class='add'>+</div><div class='add'>+function get_shard_count {</div><div class='add'>+    ls $1/$2.* | wc -l</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 replica 2 $H0:$B0/${V0}{0..3}</div><div class='add'>+TEST $CLI volume set $V0 features.shard on</div><div class='add'>+TEST $CLI volume set $V0 features.shard-block-size 4MB</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+TEST $GFS --volfile-id=$V0 --volfile-server=$H0 $M0</div><div class='add'>+</div><div class='add'>+# Create a file.</div><div class='add'>+TEST touch $M0/foo</div><div class='add'>+TEST dd if=/dev/urandom of=$M0/foo bs=1M count=10</div><div class='add'>+</div><div class='add'>+# This should ensure /.shard is created on the bricks.</div><div class='add'>+TEST stat $B0/${V0}0/.shard</div><div class='add'>+TEST stat $B0/${V0}1/.shard</div><div class='add'>+TEST stat $B0/${V0}2/.shard</div><div class='add'>+TEST stat $B0/${V0}3/.shard</div><div class='add'>+</div><div class='add'>+#Note the size of the file, it should be 10M</div><div class='add'>+EXPECT '10485760' stat -c %s $M0/foo</div><div class='add'>+</div><div class='add'>+gfid_foo=$(get_gfid_string $M0/foo)</div><div class='add'>+</div><div class='add'>+TEST build_tester $(dirname $0)/bug-shard-discard.c -lgfapi -Wall -O2</div><div class='add'>+#Call discard on the file at off=7M and len=3M</div><div class='add'>+TEST $(dirname $0)/bug-shard-discard $H0 $V0 /foo 7340032 3145728 `gluster --print-logdir`/glfs-$V0.log</div><div class='add'>+</div><div class='add'>+#Ensure that discard doesn't change the original size of the file.</div><div class='add'>+EXPECT '10485760' stat -c %s $M0/foo</div><div class='add'>+</div><div class='add'>+# Ensure that the last shard is all zero'd out</div><div class='add'>+EXPECT "1" file_all_zeroes `find $B0 -name $gfid_foo.2`</div><div class='add'>+EXPECT_NOT "1" file_all_zeroes `find $B0 -name $gfid_foo.1`</div><div class='add'>+</div><div class='add'>+# Now unlink the file. And ensure that all shards associated with the file are cleaned up</div><div class='add'>+TEST unlink $M0/foo</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $FILE_COUNT_TIME 0 get_shard_count $B0/${V0}0/.shard $gfid_foo</div><div class='add'>+EXPECT_WITHIN $FILE_COUNT_TIME 0 get_shard_count $B0/${V0}1/.shard $gfid_foo</div><div class='add'>+EXPECT_WITHIN $FILE_COUNT_TIME 0 get_shard_count $B0/${V0}2/.shard $gfid_foo</div><div class='add'>+EXPECT_WITHIN $FILE_COUNT_TIME 0 get_shard_count $B0/${V0}3/.shard $gfid_foo</div><div class='add'>+TEST ! stat $M0/foo</div><div class='add'>+</div><div class='add'>+#clean up everything</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+TEST $CLI volume stop $V0</div><div class='add'>+TEST $CLI volume delete $V0</div><div class='add'>+</div><div class='add'>+TEST rm -f $(dirname $0)/bug-shard-discard</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/bugs/shard/bug-shard-zerofill.c b/tests/bugs/shard/bug-shard-zerofill.c<br/>new file mode 100644<br/>index 00000000000..ed4c8c54dc2<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/shard/bug-shard-zerofill.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/shard/bug-shard-zerofill.c</a></div><div class='hunk'>@@ -0,0 +1,60 @@</div><div class='add'>+#include &lt;stdio.h&gt;</div><div class='add'>+#include &lt;glusterfs/api/glfs.h&gt;</div><div class='add'>+#include &lt;glusterfs/api/glfs-handles.h&gt;</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+main(int argc, char *argv[])</div><div class='add'>+{</div><div class='add'>+    glfs_t *fs = NULL;</div><div class='add'>+    glfs_fd_t *fd = NULL;</div><div class='add'>+    int ret = 1;</div><div class='add'>+</div><div class='add'>+    if (argc != 5) {</div><div class='add'>+        fprintf(stderr, "Syntax: %s &lt;host&gt; &lt;volname&gt; &lt;file-path&gt; &lt;log-file&gt;\n",</div><div class='add'>+                argv[0]);</div><div class='add'>+        return 1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    fs = glfs_new(argv[2]);</div><div class='add'>+    if (!fs) {</div><div class='add'>+        fprintf(stderr, "glfs_new: returned NULL\n");</div><div class='add'>+        return 1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = glfs_set_volfile_server(fs, "tcp", argv[1], 24007);</div><div class='add'>+    if (ret != 0) {</div><div class='add'>+        fprintf(stderr, "glfs_set_volfile_server: returned %d\n", ret);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    ret = glfs_set_logging(fs, argv[4], 7);</div><div class='add'>+    if (ret != 0) {</div><div class='add'>+        fprintf(stderr, "glfs_set_logging: returned %d\n", ret);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    ret = glfs_init(fs);</div><div class='add'>+    if (ret != 0) {</div><div class='add'>+        fprintf(stderr, "glfs_init: returned %d\n", ret);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    fd = glfs_open(fs, argv[3], O_RDWR);</div><div class='add'>+    if (fd == NULL) {</div><div class='add'>+        fprintf(stderr, "glfs_open: returned NULL\n");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Zero-fill "foo" with 10MB of data */</div><div class='add'>+    ret = glfs_zerofill(fd, 0, 10485760);</div><div class='add'>+    if (ret &lt;= 0) {</div><div class='add'>+        fprintf(stderr, "glfs_zerofill: returned %d\n", ret);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (fd)</div><div class='add'>+        glfs_close(fd);</div><div class='add'>+    glfs_fini(fs);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='head'>diff --git a/tests/bugs/shard/bug-shard-zerofill.t b/tests/bugs/shard/bug-shard-zerofill.t<br/>new file mode 100644<br/>index 00000000000..4a919a24b99<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/shard/bug-shard-zerofill.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/shard/bug-shard-zerofill.t</a></div><div class='hunk'>@@ -0,0 +1,46 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 replica 2 $H0:$B0/${V0}{0..3}</div><div class='add'>+TEST $CLI volume set $V0 features.shard on</div><div class='add'>+TEST $CLI volume set $V0 features.shard-block-size 4MB</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+TEST $GFS --volfile-id=$V0 --volfile-server=$H0 $M0</div><div class='add'>+</div><div class='add'>+# Create a file.</div><div class='add'>+TEST touch $M0/foo</div><div class='add'>+</div><div class='add'>+gfid_foo=$(get_gfid_string $M0/foo)</div><div class='add'>+</div><div class='add'>+TEST build_tester $(dirname $0)/bug-shard-zerofill.c -lgfapi -Wall -O2</div><div class='add'>+TEST $(dirname $0)/bug-shard-zerofill $H0 $V0 /foo `gluster --print-logdir`/glfs-$V0.log</div><div class='add'>+</div><div class='add'>+# This should ensure /.shard is created on the bricks.</div><div class='add'>+TEST stat $B0/${V0}0/.shard</div><div class='add'>+TEST stat $B0/${V0}1/.shard</div><div class='add'>+TEST stat $B0/${V0}2/.shard</div><div class='add'>+TEST stat $B0/${V0}3/.shard</div><div class='add'>+</div><div class='add'>+EXPECT "4194304" echo `find $B0 -name $gfid_foo.1 | xargs stat -c %s`</div><div class='add'>+EXPECT "2097152" echo `find $B0 -name $gfid_foo.2 | xargs stat -c %s`</div><div class='add'>+</div><div class='add'>+EXPECT "1" file_all_zeroes $M0/foo</div><div class='add'>+</div><div class='add'>+TEST `echo "abc" &gt;&gt; $M0/foo`</div><div class='add'>+</div><div class='add'>+EXPECT_NOT "1" file_all_zeroes $M0/foo</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+TEST $CLI volume stop $V0</div><div class='add'>+TEST $CLI volume delete $V0</div><div class='add'>+</div><div class='add'>+TEST rm -f $(dirname $0)/bug-shard-zerofill</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/bugs/shard/configure-lru-limit.t b/tests/bugs/shard/configure-lru-limit.t<br/>new file mode 100644<br/>index 00000000000..923a4d8d747<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/shard/configure-lru-limit.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/shard/configure-lru-limit.t</a></div><div class='hunk'>@@ -0,0 +1,52 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+cleanup</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 replica 3 $H0:$B0/${V0}{0,1,2}</div><div class='add'>+TEST $CLI volume set $V0 features.shard on</div><div class='add'>+TEST $CLI volume set $V0 features.shard-block-size 4MB</div><div class='add'>+TEST $CLI volume set $V0 features.shard-lru-limit 25</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+EXPECT 'Started' volinfo_field $V0 'Status';</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status $V0 $H0 $B0/${V0}0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status $V0 $H0 $B0/${V0}1</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status $V0 $H0 $B0/${V0}2</div><div class='add'>+</div><div class='add'>+TEST $GFS --volfile-id=$V0 --volfile-server=$H0 $M0</div><div class='add'>+</div><div class='add'>+# Perform a write that would cause 25 shards to be created, 24 of them under .shard</div><div class='add'>+TEST dd if=/dev/zero of=$M0/foo bs=1M count=100</div><div class='add'>+</div><div class='add'>+statedump=$(generate_mount_statedump $V0)</div><div class='add'>+sleep 1</div><div class='add'>+EXPECT "25" echo $(grep "lru-max-limit" $statedump | cut -f2 -d'=' | tail -1)</div><div class='add'>+</div><div class='add'>+# Base shard is never added to this list. So all other shards should make up for 24 inodes in lru list</div><div class='add'>+EXPECT "24" echo $(grep "inode-count" $statedump | cut -f2 -d'=' | tail -1)</div><div class='add'>+</div><div class='add'>+rm -f $statedump</div><div class='add'>+</div><div class='add'>+# Test to ensure there's no "reconfiguration" of the value once set.</div><div class='add'>+TEST $CLI volume set $V0 features.shard-lru-limit 30</div><div class='add'>+statedump=$(generate_mount_statedump $V0)</div><div class='add'>+sleep 1</div><div class='add'>+EXPECT "25" echo $(grep "lru-max-limit" $statedump | cut -f2 -d'=' | tail -1)</div><div class='add'>+rm -f $statedump</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+</div><div class='add'>+TEST $GFS --volfile-id=$V0 --volfile-server=$H0 $M0</div><div class='add'>+statedump=$(generate_mount_statedump $V0)</div><div class='add'>+sleep 1</div><div class='add'>+EXPECT "30" echo $(grep "lru-max-limit" $statedump | cut -f2 -d'=' | tail -1)</div><div class='add'>+rm -f $statedump</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+TEST $CLI volume stop $V0</div><div class='add'>+TEST $CLI volume delete $V0</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/bugs/shard/issue-1243.t b/tests/bugs/shard/issue-1243.t<br/>new file mode 100644<br/>index 00000000000..ba22d2b74fe<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/shard/issue-1243.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/shard/issue-1243.t</a></div><div class='hunk'>@@ -0,0 +1,43 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/${V0}{0,1}</div><div class='add'>+TEST $CLI volume set $V0 features.shard on</div><div class='add'>+TEST $CLI volume set $V0 features.shard-block-size 4MB</div><div class='add'>+TEST $CLI volume set $V0 performance.quick-read off</div><div class='add'>+TEST $CLI volume set $V0 performance.io-cache off</div><div class='add'>+TEST $CLI volume set $V0 performance.read-ahead off</div><div class='add'>+TEST $CLI volume set $V0 performance.strict-o-direct on</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+TEST $GFS --volfile-id=$V0 --volfile-server=$H0 $M0</div><div class='add'>+</div><div class='add'>+TEST $CLI volume set $V0 md-cache-timeout 10</div><div class='add'>+</div><div class='add'>+# Write data into a file such that its size crosses shard-block-size</div><div class='add'>+TEST dd if=/dev/zero of=$M0/foo bs=1048576 count=8 oflag=direct</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+TEST $GFS --volfile-id=$V0 --volfile-server=$H0 $M0</div><div class='add'>+</div><div class='add'>+# Execute a setxattr on the file.</div><div class='add'>+TEST setfattr -n trusted.libvirt -v some-value $M0/foo</div><div class='add'>+</div><div class='add'>+# Size of the file should be the aggregated size, not the shard-block-size</div><div class='add'>+EXPECT '8388608' stat -c %s $M0/foo</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+TEST $GFS --volfile-id=$V0 --volfile-server=$H0 $M0</div><div class='add'>+</div><div class='add'>+# Execute a removexattr on the file.</div><div class='add'>+TEST setfattr -x trusted.libvirt $M0/foo</div><div class='add'>+</div><div class='add'>+# Size of the file should be the aggregated size, not the shard-block-size</div><div class='add'>+EXPECT '8388608' stat -c %s $M0/foo</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/bugs/shard/issue-1281.t b/tests/bugs/shard/issue-1281.t<br/>new file mode 100644<br/>index 00000000000..9704caa8944<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/shard/issue-1281.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/shard/issue-1281.t</a></div><div class='hunk'>@@ -0,0 +1,34 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/${V0}{0,1}</div><div class='add'>+TEST $CLI volume set $V0 features.shard on</div><div class='add'>+TEST $CLI volume set $V0 performance.quick-read off</div><div class='add'>+TEST $CLI volume set $V0 performance.io-cache off</div><div class='add'>+TEST $CLI volume set $V0 performance.read-ahead off</div><div class='add'>+TEST $CLI volume set $V0 performance.write-behind off</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+TEST $GFS --volfile-id=$V0 --volfile-server=$H0 $M0</div><div class='add'>+</div><div class='add'>+#Open a file and store descriptor in fd = 5</div><div class='add'>+exec 5&gt;$M0/foo</div><div class='add'>+</div><div class='add'>+#Unlink the same file which is opened in prev step</div><div class='add'>+TEST unlink $M0/foo</div><div class='add'>+</div><div class='add'>+#Write something on the file using the open fd = 5</div><div class='add'>+echo "issue-1281" &gt;&amp;5</div><div class='add'>+</div><div class='add'>+#Write on the descriptor should be succesful</div><div class='add'>+EXPECT 0 echo $?</div><div class='add'>+</div><div class='add'>+#Close the fd = 5</div><div class='add'>+exec 5&gt;&amp;-</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/bugs/shard/issue-1425.t b/tests/bugs/shard/issue-1425.t<br/>new file mode 100644<br/>index 00000000000..bbe82c0e5b2<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/shard/issue-1425.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/shard/issue-1425.t</a></div><div class='hunk'>@@ -0,0 +1,45 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+FILE_COUNT_TIME=5</div><div class='add'>+</div><div class='add'>+function get_file_count {</div><div class='add'>+    ls $1* | wc -l</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/${V0}0</div><div class='add'>+TEST $CLI volume set $V0 features.shard on</div><div class='add'>+TEST $CLI volume set $V0 features.shard-block-size 4MB</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+TEST $CLI volume profile $V0 start</div><div class='add'>+</div><div class='add'>+TEST $GFS --volfile-id=$V0 --volfile-server=$H0 $M0</div><div class='add'>+</div><div class='add'>+TEST fallocate -l 20M $M0/foo</div><div class='add'>+gfid_new=$(get_gfid_string $M0/foo)</div><div class='add'>+</div><div class='add'>+# Check for the base shard</div><div class='add'>+TEST stat $M0/foo</div><div class='add'>+TEST stat $B0/${V0}0/foo</div><div class='add'>+</div><div class='add'>+# There should be 4 associated shards</div><div class='add'>+EXPECT_WITHIN $FILE_COUNT_TIME 4 get_file_count $B0/${V0}0/.shard/$gfid_new</div><div class='add'>+</div><div class='add'>+# There should be 1+4 shards and we expect 4 lookups less than on the build without this patch</div><div class='add'>+EXPECT "21" echo `$CLI volume profile $V0 info incremental | grep -w LOOKUP | awk '{print $8}'`</div><div class='add'>+</div><div class='add'>+# Delete the base shard and check shards get cleaned up</div><div class='add'>+TEST unlink $M0/foo</div><div class='add'>+</div><div class='add'>+TEST ! stat $M0/foo</div><div class='add'>+TEST ! stat $B0/${V0}0/foo</div><div class='add'>+</div><div class='add'>+# There should be no shards now</div><div class='add'>+EXPECT_WITHIN $FILE_COUNT_TIME 0 get_file_count $B0/${V0}0/.shard/$gfid_new</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/bugs/shard/parallel-truncate-read.t b/tests/bugs/shard/parallel-truncate-read.t<br/>new file mode 100644<br/>index 00000000000..4de876f58f6<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/shard/parallel-truncate-read.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/shard/parallel-truncate-read.t</a></div><div class='hunk'>@@ -0,0 +1,48 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+#This test will crash if shard's LRU contains a shard's inode even after the</div><div class='add'>+#inode is forgotten. Minimum time for crash to happen I saw was 180 seconds</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+</div><div class='add'>+function keep_writing {</div><div class='add'>+        cd $M0;</div><div class='add'>+        while [ -f /tmp/parallel-truncate-read ]</div><div class='add'>+        do</div><div class='add'>+                dd if=/dev/zero of=file1 bs=1M count=16</div><div class='add'>+        done</div><div class='add'>+        cd</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function keep_reading {</div><div class='add'>+        cd $M0;</div><div class='add'>+        while [ -f /tmp/parallel-truncate-read ]</div><div class='add'>+        do</div><div class='add'>+                cat file1 &gt; /dev/null</div><div class='add'>+        done</div><div class='add'>+        cd</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST touch /tmp/parallel-truncate-read</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 replica 3 $H0:$B0/${V0}{0,1,2}</div><div class='add'>+TEST $CLI volume set $V0 features.shard on</div><div class='add'>+TEST $CLI volume set $V0 performance.quick-read off</div><div class='add'>+TEST $CLI volume set $V0 performance.io-cache off</div><div class='add'>+TEST $CLI volume set $V0 performance.stat-prefetch off</div><div class='add'>+TEST $CLI volume set $V0 performance.read-ahead off</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+TEST $GFS --volfile-id=$V0 --volfile-server=$H0 $M0</div><div class='add'>+keep_writing &amp;</div><div class='add'>+keep_reading &amp;</div><div class='add'>+sleep 180</div><div class='add'>+TEST rm -f /tmp/parallel-truncate-read</div><div class='add'>+wait</div><div class='add'>+#test that the mount is operational</div><div class='add'>+TEST stat $M0</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/shard/shard-append-test.c b/tests/bugs/shard/shard-append-test.c<br/>new file mode 100644<br/>index 00000000000..c7debb2b182<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/shard/shard-append-test.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/shard/shard-append-test.c</a></div><div class='hunk'>@@ -0,0 +1,183 @@</div><div class='add'>+#include &lt;fcntl.h&gt;</div><div class='add'>+#include &lt;unistd.h&gt;</div><div class='add'>+#include &lt;time.h&gt;</div><div class='add'>+#include &lt;limits.h&gt;</div><div class='add'>+#include &lt;string.h&gt;</div><div class='add'>+#include &lt;pthread.h&gt;</div><div class='add'>+#include &lt;stdio.h&gt;</div><div class='add'>+#include &lt;stdlib.h&gt;</div><div class='add'>+#include &lt;errno.h&gt;</div><div class='add'>+#include &lt;glusterfs/api/glfs.h&gt;</div><div class='add'>+#include &lt;glusterfs/api/glfs-handles.h&gt;</div><div class='add'>+</div><div class='add'>+#define LOG_ERR(msg)                                                           \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        fprintf(stderr, "%s : Error (%s)\n", msg, strerror(errno));            \</div><div class='add'>+    } while (0)</div><div class='add'>+</div><div class='add'>+/*This test tests that shard xlator handles offset in appending writes</div><div class='add'>+ * correctly. This test performs writes of 1025 bytes 1025 times, in 5 threads</div><div class='add'>+ * with different threads. The buffer to be written is same character repeated</div><div class='add'>+ * 1025 times in the buffer for a thread. At the end it reads the buffer till</div><div class='add'>+ * end of file and tests that the read of 1025 bytes is always same character</div><div class='add'>+ * and the content read is 5*1025*1025 size. 1025 bytes is chosen because it</div><div class='add'>+ * will lead to write on more than one shard at some point when the size is</div><div class='add'>+ * going over the initial shard*/</div><div class='add'>+pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;</div><div class='add'>+int thread_data = '1';</div><div class='add'>+</div><div class='add'>+glfs_t *</div><div class='add'>+init_glfs(const char *hostname, const char *volname, const char *logfile)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    glfs_t *fs = NULL;</div><div class='add'>+</div><div class='add'>+    fs = glfs_new(volname);</div><div class='add'>+    if (!fs) {</div><div class='add'>+        LOG_ERR("glfs_new failed");</div><div class='add'>+        return NULL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = glfs_set_volfile_server(fs, "tcp", hostname, 24007);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        LOG_ERR("glfs_set_volfile_server failed");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = glfs_set_logging(fs, logfile, 7);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        LOG_ERR("glfs_set_logging failed");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = glfs_init(fs);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        LOG_ERR("glfs_init failed");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+out:</div><div class='add'>+    if (ret) {</div><div class='add'>+        glfs_fini(fs);</div><div class='add'>+        fs = NULL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return fs;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void *</div><div class='add'>+write_data(void *data)</div><div class='add'>+{</div><div class='add'>+    char buf[1025] = {0};</div><div class='add'>+    glfs_fd_t *glfd = NULL;</div><div class='add'>+    glfs_t *fs = data;</div><div class='add'>+    int i = 0;</div><div class='add'>+</div><div class='add'>+    pthread_mutex_lock(&amp;lock);</div><div class='add'>+    {</div><div class='add'>+        memset(buf, thread_data, sizeof(buf));</div><div class='add'>+        thread_data++;</div><div class='add'>+    }</div><div class='add'>+    pthread_mutex_unlock(&amp;lock);</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; 1025; i++) {</div><div class='add'>+        glfd = glfs_creat(fs, "parallel-write.txt", O_WRONLY | O_APPEND,</div><div class='add'>+                          S_IRUSR | S_IWUSR | O_SYNC);</div><div class='add'>+        if (!glfd) {</div><div class='add'>+            LOG_ERR("Failed to create file");</div><div class='add'>+            exit(1);</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        if (glfs_write(glfd, buf, sizeof(buf), 0) &lt; 0) {</div><div class='add'>+            LOG_ERR("Failed to write to file");</div><div class='add'>+            exit(1);</div><div class='add'>+        }</div><div class='add'>+        if (glfs_close(glfd) != 0) {</div><div class='add'>+            LOG_ERR("Failed to close file");</div><div class='add'>+            exit(1);</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    return NULL;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+main(int argc, char *argv[])</div><div class='add'>+{</div><div class='add'>+    pthread_t tid[5] = {0};</div><div class='add'>+    char buf[1025] = {0};</div><div class='add'>+    char cmp_buf[1025] = {0};</div><div class='add'>+    int ret = 0;</div><div class='add'>+    char *hostname = NULL;</div><div class='add'>+    char *volname = NULL;</div><div class='add'>+    char *logfile = NULL;</div><div class='add'>+    glfs_t *fs = NULL;</div><div class='add'>+    glfs_fd_t *glfd = NULL;</div><div class='add'>+    ssize_t bytes_read = 0;</div><div class='add'>+    ssize_t total_bytes_read = 0;</div><div class='add'>+    int i = 0;</div><div class='add'>+</div><div class='add'>+    if (argc != 4) {</div><div class='add'>+        fprintf(stderr, "Invalid argument\n");</div><div class='add'>+        exit(1);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    hostname = argv[1];</div><div class='add'>+    volname = argv[2];</div><div class='add'>+    logfile = argv[3];</div><div class='add'>+</div><div class='add'>+    fs = init_glfs(hostname, volname, logfile);</div><div class='add'>+    if (fs == NULL) {</div><div class='add'>+        LOG_ERR("init_glfs failed");</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; 5; i++) {</div><div class='add'>+        pthread_create(&amp;tid[i], NULL, write_data, fs);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; 5; i++) {</div><div class='add'>+        pthread_join(tid[i], NULL);</div><div class='add'>+    }</div><div class='add'>+    glfd = glfs_open(fs, "parallel-write.txt", O_RDONLY);</div><div class='add'>+    if (!glfd) {</div><div class='add'>+        LOG_ERR("Failed to open file for reading");</div><div class='add'>+        exit(1);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    while ((bytes_read = glfs_read(glfd, buf, sizeof(buf), 0)) &gt; 0) {</div><div class='add'>+        if (bytes_read != sizeof(buf)) {</div><div class='add'>+            fprintf(stderr,</div><div class='add'>+                    "Didn't read complete data read: %zd "</div><div class='add'>+                    "expected: %lu",</div><div class='add'>+                    bytes_read, sizeof(buf));</div><div class='add'>+            exit(1);</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        total_bytes_read += bytes_read;</div><div class='add'>+        if (buf[0] &lt; '1' || buf[0] &gt;= thread_data) {</div><div class='add'>+            fprintf(stderr, "Invalid character found: %c", buf[0]);</div><div class='add'>+            exit(1);</div><div class='add'>+        }</div><div class='add'>+        memset(cmp_buf, buf[0], sizeof(cmp_buf));</div><div class='add'>+        if (memcmp(cmp_buf, buf, sizeof(cmp_buf))) {</div><div class='add'>+            LOG_ERR("Data corrupted");</div><div class='add'>+            exit(1);</div><div class='add'>+        }</div><div class='add'>+        memset(cmp_buf, 0, sizeof(cmp_buf));</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (total_bytes_read != 5 * 1025 * 1025) {</div><div class='add'>+        fprintf(stderr,</div><div class='add'>+                "Failed to read what is written, read; %zd, "</div><div class='add'>+                "expected %zu",</div><div class='add'>+                total_bytes_read, 5 * 1025 * 1025);</div><div class='add'>+        exit(1);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (glfs_close(glfd) != 0) {</div><div class='add'>+        LOG_ERR("Failed to close");</div><div class='add'>+        exit(1);</div><div class='add'>+    }</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='head'>diff --git a/tests/bugs/shard/shard-append-test.t b/tests/bugs/shard/shard-append-test.t<br/>new file mode 100644<br/>index 00000000000..f8719f2a2c1<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/shard/shard-append-test.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/shard/shard-append-test.t</a></div><div class='hunk'>@@ -0,0 +1,32 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 replica 3 ${H0}:$B0/brick{1,2,3};</div><div class='add'>+TEST $CLI volume set $V0 features.shard on</div><div class='add'>+TEST $CLI volume set $V0 features.shard-block-size 4MB</div><div class='add'>+TEST $CLI volume set $V0 performance.quick-read off</div><div class='add'>+TEST $CLI volume set $V0 performance.io-cache off</div><div class='add'>+</div><div class='add'>+#Uncomment the following line after shard-queuing is implemented</div><div class='add'>+#TEST $CLI volume set $V0 performance.write-behind off</div><div class='add'>+</div><div class='add'>+TEST $CLI volume set $V0 performance.strict-o-direct on</div><div class='add'>+TEST $CLI volume set $V0 performance.stat-prefetch off</div><div class='add'>+TEST $CLI volume set $V0 performance.read-ahead off</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+</div><div class='add'>+logdir=`gluster --print-logdir`</div><div class='add'>+</div><div class='add'>+TEST build_tester $(dirname $0)/shard-append-test.c -lgfapi -lpthread</div><div class='add'>+</div><div class='add'>+TEST ./$(dirname $0)/shard-append-test ${H0} $V0 $logdir/shard-append-test.log</div><div class='add'>+</div><div class='add'>+cleanup_tester $(dirname $0)/shard-append-test</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/shard/shard-fallocate.c b/tests/bugs/shard/shard-fallocate.c<br/>new file mode 100644<br/>index 00000000000..cb0714e8564<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/shard/shard-fallocate.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/shard/shard-fallocate.c</a></div><div class='hunk'>@@ -0,0 +1,113 @@</div><div class='add'>+#define _GNU_SOURCE</div><div class='add'>+#include &lt;fcntl.h&gt;</div><div class='add'>+#include &lt;stdio.h&gt;</div><div class='add'>+#include &lt;stdlib.h&gt;</div><div class='add'>+#include &lt;glusterfs/api/glfs.h&gt;</div><div class='add'>+#include &lt;glusterfs/api/glfs-handles.h&gt;</div><div class='add'>+</div><div class='add'>+enum fallocate_flag {</div><div class='add'>+    TEST_FALLOCATE_NONE,</div><div class='add'>+    TEST_FALLOCATE_KEEP_SIZE,</div><div class='add'>+    TEST_FALLOCATE_ZERO_RANGE,</div><div class='add'>+    TEST_FALLOCATE_PUNCH_HOLE,</div><div class='add'>+    TEST_FALLOCATE_MAX,</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+get_fallocate_flag(int opcode)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    switch (opcode) {</div><div class='add'>+        case TEST_FALLOCATE_NONE:</div><div class='add'>+            ret = 0;</div><div class='add'>+            break;</div><div class='add'>+        case TEST_FALLOCATE_KEEP_SIZE:</div><div class='add'>+            ret = FALLOC_FL_KEEP_SIZE;</div><div class='add'>+            break;</div><div class='add'>+        case TEST_FALLOCATE_ZERO_RANGE:</div><div class='add'>+            ret = FALLOC_FL_ZERO_RANGE;</div><div class='add'>+            break;</div><div class='add'>+        case TEST_FALLOCATE_PUNCH_HOLE:</div><div class='add'>+            ret = FALLOC_FL_PUNCH_HOLE;</div><div class='add'>+            break;</div><div class='add'>+        default:</div><div class='add'>+            ret = -1;</div><div class='add'>+            break;</div><div class='add'>+    }</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+main(int argc, char *argv[])</div><div class='add'>+{</div><div class='add'>+    int ret = 1;</div><div class='add'>+    int opcode = -1;</div><div class='add'>+    off_t offset = 0;</div><div class='add'>+    size_t len = 0;</div><div class='add'>+    glfs_t *fs = NULL;</div><div class='add'>+    glfs_fd_t *fd = NULL;</div><div class='add'>+</div><div class='add'>+    if (argc != 8) {</div><div class='add'>+        fprintf(stderr,</div><div class='add'>+                "Syntax: %s &lt;host&gt; &lt;volname&gt; &lt;opcode&gt; &lt;offset&gt; &lt;len&gt; "</div><div class='add'>+                "&lt;file-path&gt; &lt;log-file&gt;\n",</div><div class='add'>+                argv[0]);</div><div class='add'>+        return 1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    fs = glfs_new(argv[2]);</div><div class='add'>+    if (!fs) {</div><div class='add'>+        fprintf(stderr, "glfs_new: returned NULL\n");</div><div class='add'>+        return 1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = glfs_set_volfile_server(fs, "tcp", argv[1], 24007);</div><div class='add'>+    if (ret != 0) {</div><div class='add'>+        fprintf(stderr, "glfs_set_volfile_server: returned %d\n", ret);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = glfs_set_logging(fs, argv[7], 7);</div><div class='add'>+    if (ret != 0) {</div><div class='add'>+        fprintf(stderr, "glfs_set_logging: returned %d\n", ret);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = glfs_init(fs);</div><div class='add'>+    if (ret != 0) {</div><div class='add'>+        fprintf(stderr, "glfs_init: returned %d\n", ret);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    opcode = atoi(argv[3]);</div><div class='add'>+    opcode = get_fallocate_flag(opcode);</div><div class='add'>+    if (opcode &lt; 0) {</div><div class='add'>+        fprintf(stderr, "get_fallocate_flag: invalid flag \n");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Note that off_t is signed but size_t isn't. */</div><div class='add'>+    offset = strtol(argv[4], NULL, 10);</div><div class='add'>+    len = strtoul(argv[5], NULL, 10);</div><div class='add'>+</div><div class='add'>+    fd = glfs_open(fs, argv[6], O_RDWR);</div><div class='add'>+    if (fd == NULL) {</div><div class='add'>+        fprintf(stderr, "glfs_open: returned NULL\n");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = glfs_fallocate(fd, opcode, offset, len);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(stderr, "glfs_fallocate: returned %d\n", ret);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (fd)</div><div class='add'>+        glfs_close(fd);</div><div class='add'>+    glfs_fini(fs);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='head'>diff --git a/tests/bugs/shard/shard-inode-refcount-test.t b/tests/bugs/shard/shard-inode-refcount-test.t<br/>new file mode 100644<br/>index 00000000000..3fd181be690<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/shard/shard-inode-refcount-test.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/shard/shard-inode-refcount-test.t</a></div><div class='hunk'>@@ -0,0 +1,30 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='add'>+</div><div class='add'>+SHARD_COUNT_TIME=5</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/${V0}0</div><div class='add'>+TEST $CLI volume set $V0 features.shard on</div><div class='add'>+TEST $CLI volume set $V0 features.shard-block-size 4MB</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+TEST glusterfs --volfile-id=$V0 --volfile-server=$H0 $M0</div><div class='add'>+</div><div class='add'>+TEST dd if=/dev/zero conv=fsync of=$M0/one-plus-five-shards bs=1M count=23</div><div class='add'>+</div><div class='add'>+ACTIVE_INODES_BEFORE=$(get_mount_active_size_value $V0)</div><div class='add'>+TEST rm -f $M0/one-plus-five-shards</div><div class='add'>+# Expect 5 inodes less. But one inode more than before because .remove_me would be created.</div><div class='add'>+EXPECT_WITHIN $SHARD_COUNT_TIME `expr $ACTIVE_INODES_BEFORE - 5 + 1` get_mount_active_size_value $V0 $M0</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+TEST $CLI volume stop $V0</div><div class='add'>+TEST $CLI volume delete $V0</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/bugs/shard/unlinks-and-renames.t b/tests/bugs/shard/unlinks-and-renames.t<br/>new file mode 100644<br/>index 00000000000..990ca69a8b1<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/shard/unlinks-and-renames.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/shard/unlinks-and-renames.t</a></div><div class='hunk'>@@ -0,0 +1,333 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='add'>+</div><div class='add'>+# The aim of this test script is to exercise the various codepaths of unlink</div><div class='add'>+# and rename fops in sharding and make sure they work fine.</div><div class='add'>+#</div><div class='add'>+</div><div class='add'>+FILE_COUNT_TIME=5</div><div class='add'>+</div><div class='add'>+function get_file_count {</div><div class='add'>+    ls $1* | wc -l</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#################################################</div><div class='add'>+################### UNLINK ######################</div><div class='add'>+#################################################</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 replica 2 $H0:$B0/${V0}{0,1}</div><div class='add'>+TEST $CLI volume set $V0 features.shard on</div><div class='add'>+TEST $CLI volume set $V0 features.shard-block-size 4MB</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+TEST glusterfs --volfile-id=$V0 --volfile-server=$H0 $M0</div><div class='add'>+</div><div class='add'>+TEST mkdir $M0/dir</div><div class='add'>+TEST touch $M0/dir/foo</div><div class='add'>+TEST touch $M0/dir/new</div><div class='add'>+</div><div class='add'>+##########################################</div><div class='add'>+##### 01. Unlink with /.shard absent #####</div><div class='add'>+##########################################</div><div class='add'>+</div><div class='add'>+TEST truncate -s 5M $M0/dir/foo</div><div class='add'>+TEST ! stat $B0/${V0}0/.shard</div><div class='add'>+TEST ! stat $B0/${V0}1/.shard</div><div class='add'>+# Test to ensure that unlink doesn't fail due to absence of /.shard</div><div class='add'>+gfid_foo=$(get_gfid_string $M0/dir/foo)</div><div class='add'>+TEST unlink $M0/dir/foo</div><div class='add'>+TEST stat $B0/${V0}0/.shard/.remove_me</div><div class='add'>+TEST stat $B0/${V0}1/.shard/.remove_me</div><div class='add'>+EXPECT_WITHIN $FILE_COUNT_TIME 0 get_file_count $B0/${V0}0/.shard/.remove_me/$gfid_foo</div><div class='add'>+EXPECT_WITHIN $FILE_COUNT_TIME 0 get_file_count $B0/${V0}1/.shard/.remove_me/$gfid_foo</div><div class='add'>+</div><div class='add'>+######################################################</div><div class='add'>+##### 02. Unlink of a sharded file without holes #####</div><div class='add'>+######################################################</div><div class='add'>+</div><div class='add'>+# Create a 9M sharded file</div><div class='add'>+TEST dd if=/dev/zero of=$M0/dir/new bs=1024 count=9216</div><div class='add'>+gfid_new=$(get_gfid_string $M0/dir/new)</div><div class='add'>+# Ensure its shards are created.</div><div class='add'>+TEST stat $B0/${V0}0/.shard/$gfid_new.1</div><div class='add'>+TEST stat $B0/${V0}1/.shard/$gfid_new.1</div><div class='add'>+TEST stat $B0/${V0}0/.shard/$gfid_new.2</div><div class='add'>+TEST stat $B0/${V0}1/.shard/$gfid_new.2</div><div class='add'>+TEST unlink $M0/dir/new</div><div class='add'>+EXPECT_WITHIN $FILE_COUNT_TIME 0 get_file_count $B0/${V0}0/.shard/$gfid_new</div><div class='add'>+EXPECT_WITHIN $FILE_COUNT_TIME 0 get_file_count $B0/${V0}1/.shard/$gfid_new</div><div class='add'>+TEST ! stat $M0/dir/new</div><div class='add'>+TEST ! stat $B0/${V0}0/dir/new</div><div class='add'>+TEST ! stat $B0/${V0}1/dir/new</div><div class='add'>+EXPECT_WITHIN $FILE_COUNT_TIME 0 get_file_count $B0/${V0}0/.shard/.remove_me/$gfid_new</div><div class='add'>+EXPECT_WITHIN $FILE_COUNT_TIME 0 get_file_count $B0/${V0}1/.shard/.remove_me/$gfid_new</div><div class='add'>+</div><div class='add'>+###########################################</div><div class='add'>+##### 03. Unlink with /.shard present #####</div><div class='add'>+###########################################</div><div class='add'>+</div><div class='add'>+TEST truncate -s 5M $M0/dir/foo</div><div class='add'>+gfid_foo=$(get_gfid_string $M0/dir/foo)</div><div class='add'>+# Ensure its shards are absent.</div><div class='add'>+TEST ! stat $B0/${V0}0/.shard/$gfid_foo.1</div><div class='add'>+TEST ! stat $B0/${V0}1/.shard/$gfid_foo.1</div><div class='add'>+# Test to ensure that unlink of a sparse file works fine.</div><div class='add'>+TEST unlink $M0/dir/foo</div><div class='add'>+TEST ! stat $B0/${V0}0/dir/foo</div><div class='add'>+TEST ! stat $B0/${V0}1/dir/foo</div><div class='add'>+TEST ! stat $M0/dir/foo</div><div class='add'>+EXPECT_WITHIN $FILE_COUNT_TIME 0 get_file_count $B0/${V0}0/.shard/.remove_me/$gfid_foo</div><div class='add'>+EXPECT_WITHIN $FILE_COUNT_TIME 0 get_file_count $B0/${V0}1/.shard/.remove_me/$gfid_foo</div><div class='add'>+</div><div class='add'>+#################################################################</div><div class='add'>+##### 04. Unlink of a file with only one block (the zeroth) #####</div><div class='add'>+#################################################################</div><div class='add'>+</div><div class='add'>+TEST touch $M0/dir/foo</div><div class='add'>+gfid_foo=$(get_gfid_string $M0/dir/foo)</div><div class='add'>+TEST dd if=/dev/zero of=$M0/dir/foo bs=1024 count=1024</div><div class='add'>+# Test to ensure that unlink of a file with only base shard works fine.</div><div class='add'>+TEST unlink $M0/dir/foo</div><div class='add'>+TEST ! stat $B0/${V0}0/dir/foo</div><div class='add'>+TEST ! stat $B0/${V0}1/dir/foo</div><div class='add'>+TEST ! stat $M0/dir/foo</div><div class='add'>+EXPECT_WITHIN $FILE_COUNT_TIME 0 get_file_count $B0/${V0}0/.shard/.remove_me/$gfid_foo</div><div class='add'>+EXPECT_WITHIN $FILE_COUNT_TIME 0 get_file_count $B0/${V0}1/.shard/.remove_me/$gfid_foo</div><div class='add'>+</div><div class='add'>+########################################################</div><div class='add'>+##### 05. Unlink of a sharded file with hard-links #####</div><div class='add'>+########################################################</div><div class='add'>+</div><div class='add'>+# Create a 9M sharded file</div><div class='add'>+TEST dd if=/dev/zero of=$M0/dir/original bs=1024 count=9216</div><div class='add'>+gfid_original=$(get_gfid_string $M0/dir/original)</div><div class='add'>+# Ensure its shards are created.</div><div class='add'>+TEST stat $B0/${V0}0/.shard/$gfid_original.1</div><div class='add'>+TEST stat $B0/${V0}1/.shard/$gfid_original.1</div><div class='add'>+TEST stat $B0/${V0}0/.shard/$gfid_original.2</div><div class='add'>+TEST stat $B0/${V0}1/.shard/$gfid_original.2</div><div class='add'>+# Create a hard link.</div><div class='add'>+TEST ln $M0/dir/original $M0/link</div><div class='add'>+# Now delete the original file.</div><div class='add'>+TEST unlink $M0/dir/original</div><div class='add'>+TEST ! stat $B0/${V0}0/.shard/.remove_me/$gfid_original</div><div class='add'>+TEST ! stat $B0/${V0}1/.shard/.remove_me/$gfid_original</div><div class='add'>+# Ensure the shards are still intact.</div><div class='add'>+TEST stat $B0/${V0}0/.shard/$gfid_original.1</div><div class='add'>+TEST stat $B0/${V0}1/.shard/$gfid_original.1</div><div class='add'>+TEST stat $B0/${V0}0/.shard/$gfid_original.2</div><div class='add'>+TEST stat $B0/${V0}1/.shard/$gfid_original.2</div><div class='add'>+TEST ! stat $M0/dir/original</div><div class='add'>+TEST stat $M0/link</div><div class='add'>+TEST stat $B0/${V0}0/link</div><div class='add'>+TEST stat $B0/${V0}1/link</div><div class='add'>+# Now delete the last link.</div><div class='add'>+TEST unlink $M0/link</div><div class='add'>+EXPECT_WITHIN $FILE_COUNT_TIME 0 get_file_count $B0/${V0}0/.shard/.remove_me/$gfid_original</div><div class='add'>+EXPECT_WITHIN $FILE_COUNT_TIME 0 get_file_count $B0/${V0}1/.shard/.remove_me/$gfid_original</div><div class='add'>+# Ensure that the shards are all cleaned up.</div><div class='add'>+EXPECT_WITHIN $FILE_COUNT_TIME 0 get_file_count $B0/${V0}0/.shard/$gfid_original</div><div class='add'>+EXPECT_WITHIN $FILE_COUNT_TIME 0 get_file_count $B0/${V0}1/.shard/$gfid_original</div><div class='add'>+TEST ! stat $M0/link</div><div class='add'>+TEST ! stat $B0/${V0}0/link</div><div class='add'>+TEST ! stat $B0/${V0}1/link</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+TEST $CLI volume stop $V0</div><div class='add'>+TEST $CLI volume delete $V0</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='add'>+</div><div class='add'>+#################################################</div><div class='add'>+################### RENAME ######################</div><div class='add'>+#################################################</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 replica 2 $H0:$B0/${V0}{0,1}</div><div class='add'>+TEST $CLI volume set $V0 features.shard on</div><div class='add'>+TEST $CLI volume set $V0 features.shard-block-size 4MB</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+TEST glusterfs --volfile-id=$V0 --volfile-server=$H0 $M0</div><div class='add'>+</div><div class='add'>+TEST mkdir $M0/dir</div><div class='add'>+TEST touch $M0/dir/src</div><div class='add'>+TEST touch $M0/dir/dst</div><div class='add'>+</div><div class='add'>+##########################################</div><div class='add'>+##### 06. Rename with /.shard absent #####</div><div class='add'>+##########################################</div><div class='add'>+</div><div class='add'>+TEST truncate -s 5M $M0/dir/dst</div><div class='add'>+gfid_dst=$(get_gfid_string $M0/dir/dst)</div><div class='add'>+TEST ! stat $B0/${V0}0/.shard</div><div class='add'>+TEST ! stat $B0/${V0}1/.shard</div><div class='add'>+# Test to ensure that rename doesn't fail due to absence of /.shard</div><div class='add'>+TEST mv -f $M0/dir/src $M0/dir/dst</div><div class='add'>+TEST ! stat $M0/dir/src</div><div class='add'>+TEST   stat $M0/dir/dst</div><div class='add'>+TEST ! stat $B0/${V0}0/dir/src</div><div class='add'>+TEST ! stat $B0/${V0}1/dir/src</div><div class='add'>+TEST   stat $B0/${V0}0/dir/dst</div><div class='add'>+TEST   stat $B0/${V0}1/dir/dst</div><div class='add'>+EXPECT_WITHIN $FILE_COUNT_TIME 0 get_file_count $B0/${V0}0/.shard/.remove_me/$gfid_dst</div><div class='add'>+EXPECT_WITHIN $FILE_COUNT_TIME 0 get_file_count $B0/${V0}1/.shard/.remove_me/$gfid_dst</div><div class='add'>+</div><div class='add'>+######################################################</div><div class='add'>+##### 07. Rename to a sharded file without holes #####</div><div class='add'>+######################################################</div><div class='add'>+</div><div class='add'>+TEST unlink $M0/dir/dst</div><div class='add'>+TEST touch $M0/dir/src</div><div class='add'>+# Create a 9M sharded file</div><div class='add'>+TEST dd if=/dev/zero of=$M0/dir/dst bs=1024 count=9216</div><div class='add'>+gfid_dst=$(get_gfid_string $M0/dir/dst)</div><div class='add'>+# Ensure its shards are created.</div><div class='add'>+TEST stat $B0/${V0}0/.shard/$gfid_dst.1</div><div class='add'>+TEST stat $B0/${V0}1/.shard/$gfid_dst.1</div><div class='add'>+TEST stat $B0/${V0}0/.shard/$gfid_dst.2</div><div class='add'>+TEST stat $B0/${V0}1/.shard/$gfid_dst.2</div><div class='add'>+TEST mv -f $M0/dir/src $M0/dir/dst</div><div class='add'>+EXPECT_WITHIN $FILE_COUNT_TIME 0 get_file_count $B0/${V0}0/.shard/$gfid_dst</div><div class='add'>+EXPECT_WITHIN $FILE_COUNT_TIME 0 get_file_count $B0/${V0}1/.shard/$gfid_dst</div><div class='add'>+TEST ! stat $M0/dir/src</div><div class='add'>+TEST   stat $M0/dir/dst</div><div class='add'>+TEST ! stat $B0/${V0}0/dir/src</div><div class='add'>+TEST ! stat $B0/${V0}1/dir/src</div><div class='add'>+TEST   stat $B0/${V0}0/dir/dst</div><div class='add'>+TEST   stat $B0/${V0}1/dir/dst</div><div class='add'>+EXPECT_WITHIN $FILE_COUNT_TIME 0 get_file_count $B0/${V0}0/.shard/.remove_me/$gfid_dst</div><div class='add'>+EXPECT_WITHIN $FILE_COUNT_TIME 0 get_file_count $B0/${V0}1/.shard/.remove_me/$gfid_dst</div><div class='add'>+</div><div class='add'>+#######################################################</div><div class='add'>+##### 08. Rename of dst file with /.shard present #####</div><div class='add'>+#######################################################</div><div class='add'>+</div><div class='add'>+TEST unlink $M0/dir/dst</div><div class='add'>+TEST touch $M0/dir/src</div><div class='add'>+TEST truncate -s 5M $M0/dir/dst</div><div class='add'>+gfid_dst=$(get_gfid_string $M0/dir/dst)</div><div class='add'>+# Test to ensure that rename into a sparse file works fine.</div><div class='add'>+TEST mv -f $M0/dir/src $M0/dir/dst</div><div class='add'>+TEST ! stat $M0/dir/src</div><div class='add'>+TEST   stat $M0/dir/dst</div><div class='add'>+TEST ! stat $B0/${V0}0/dir/src</div><div class='add'>+TEST ! stat $B0/${V0}1/dir/src</div><div class='add'>+TEST   stat $B0/${V0}0/dir/dst</div><div class='add'>+TEST   stat $B0/${V0}1/dir/dst</div><div class='add'>+EXPECT_WITHIN $FILE_COUNT_TIME 0 get_file_count $B0/${V0}0/.shard/.remove_me/$gfid_dst</div><div class='add'>+EXPECT_WITHIN $FILE_COUNT_TIME 0 get_file_count $B0/${V0}1/.shard/.remove_me/$gfid_dst</div><div class='add'>+</div><div class='add'>+###################################################################</div><div class='add'>+##### 09. Rename of dst file with only one block (the zeroth) #####</div><div class='add'>+###################################################################</div><div class='add'>+</div><div class='add'>+TEST unlink $M0/dir/dst</div><div class='add'>+TEST touch $M0/dir/src</div><div class='add'>+TEST dd if=/dev/zero of=$M0/dir/dst bs=1024 count=1024</div><div class='add'>+gfid_dst=$(get_gfid_string $M0/dir/dst)</div><div class='add'>+# Test to ensure that rename into a file with only base shard works fine.</div><div class='add'>+TEST mv -f $M0/dir/src $M0/dir/dst</div><div class='add'>+TEST ! stat $M0/dir/src</div><div class='add'>+TEST   stat $M0/dir/dst</div><div class='add'>+TEST ! stat $B0/${V0}0/dir/src</div><div class='add'>+TEST ! stat $B0/${V0}1/dir/src</div><div class='add'>+TEST   stat $B0/${V0}0/dir/dst</div><div class='add'>+TEST   stat $B0/${V0}1/dir/dst</div><div class='add'>+EXPECT_WITHIN $FILE_COUNT_TIME 0 get_file_count $B0/${V0}0/.shard/.remove_me/$gfid_dst</div><div class='add'>+EXPECT_WITHIN $FILE_COUNT_TIME 0 get_file_count $B0/${V0}1/.shard/.remove_me/$gfid_dst</div><div class='add'>+</div><div class='add'>+############################################################</div><div class='add'>+##### 10. Rename to a dst sharded file with hard-links #####</div><div class='add'>+############################################################</div><div class='add'>+</div><div class='add'>+TEST unlink $M0/dir/dst</div><div class='add'>+TEST touch $M0/dir/src</div><div class='add'>+# Create a 9M sharded file</div><div class='add'>+TEST dd if=/dev/zero of=$M0/dir/dst bs=1024 count=9216</div><div class='add'>+gfid_dst=$(get_gfid_string $M0/dir/dst)</div><div class='add'>+# Ensure its shards are created.</div><div class='add'>+TEST stat $B0/${V0}0/.shard/$gfid_dst.1</div><div class='add'>+TEST stat $B0/${V0}1/.shard/$gfid_dst.1</div><div class='add'>+TEST stat $B0/${V0}0/.shard/$gfid_dst.2</div><div class='add'>+TEST stat $B0/${V0}1/.shard/$gfid_dst.2</div><div class='add'>+# Create a hard link.</div><div class='add'>+TEST ln $M0/dir/dst $M0/link</div><div class='add'>+# Now rename src to the dst.</div><div class='add'>+TEST mv -f $M0/dir/src $M0/dir/dst</div><div class='add'>+# Ensure the shards are still intact.</div><div class='add'>+TEST stat $B0/${V0}0/.shard/$gfid_dst.1</div><div class='add'>+TEST stat $B0/${V0}1/.shard/$gfid_dst.1</div><div class='add'>+TEST stat $B0/${V0}0/.shard/$gfid_dst.2</div><div class='add'>+TEST stat $B0/${V0}1/.shard/$gfid_dst.2</div><div class='add'>+TEST ! stat $M0/dir/src</div><div class='add'>+TEST ! stat $B0/${V0}0/dir/src</div><div class='add'>+TEST ! stat $B0/${V0}1/dir/src</div><div class='add'>+TEST ! stat $B0/${V0}0/.shard/.remove_me/$gfid_dst</div><div class='add'>+TEST ! stat $B0/${V0}1/.shard/.remove_me/$gfid_dst</div><div class='add'>+# Now rename another file to the last link.</div><div class='add'>+TEST touch $M0/dir/src2</div><div class='add'>+TEST mv -f $M0/dir/src2 $M0/link</div><div class='add'>+# Ensure that the shards are all cleaned up.</div><div class='add'>+EXPECT_WITHIN $FILE_COUNT_TIME 0 get_file_count $B0/${V0}0/.shard/$gfid_dst</div><div class='add'>+EXPECT_WITHIN $FILE_COUNT_TIME 0 get_file_count $B0/${V0}1/.shard/$gfid_dst</div><div class='add'>+TEST ! stat $B0/${V0}0/.shard/$gfid_dst.1</div><div class='add'>+TEST ! stat $B0/${V0}1/.shard/$gfid_dst.1</div><div class='add'>+TEST ! stat $B0/${V0}0/.shard/$gfid_dst.2</div><div class='add'>+TEST ! stat $B0/${V0}1/.shard/$gfid_dst.2</div><div class='add'>+TEST ! stat $M0/dir/src2</div><div class='add'>+TEST ! stat $B0/${V0}0/dir/src2</div><div class='add'>+TEST ! stat $B0/${V0}1/dir/src2</div><div class='add'>+EXPECT_WITHIN $FILE_COUNT_TIME 0 get_file_count $B0/${V0}0/.shard/.remove_me/$gfid_dst</div><div class='add'>+EXPECT_WITHIN $FILE_COUNT_TIME 0 get_file_count $B0/${V0}1/.shard/.remove_me/$gfid_dst</div><div class='add'>+</div><div class='add'>+##############################################################</div><div class='add'>+##### 11. Rename with non-existent dst and a sharded src #####</div><div class='add'>+##############################################################l</div><div class='add'>+</div><div class='add'>+TEST touch $M0/dir/src</div><div class='add'>+TEST dd if=/dev/zero of=$M0/dir/src bs=1024 count=9216</div><div class='add'>+gfid_src=$(get_gfid_string $M0/dir/src)</div><div class='add'>+# Ensure its shards are created.</div><div class='add'>+TEST stat $B0/${V0}0/.shard/$gfid_src.1</div><div class='add'>+TEST stat $B0/${V0}1/.shard/$gfid_src.1</div><div class='add'>+TEST stat $B0/${V0}0/.shard/$gfid_src.2</div><div class='add'>+TEST stat $B0/${V0}1/.shard/$gfid_src.2</div><div class='add'>+# Now rename src to the dst.</div><div class='add'>+TEST mv $M0/dir/src $M0/dir/dst2</div><div class='add'>+</div><div class='add'>+TEST   stat $B0/${V0}0/.shard/$gfid_src.1</div><div class='add'>+TEST   stat $B0/${V0}1/.shard/$gfid_src.1</div><div class='add'>+TEST   stat $B0/${V0}0/.shard/$gfid_src.2</div><div class='add'>+TEST   stat $B0/${V0}1/.shard/$gfid_src.2</div><div class='add'>+TEST ! stat $M0/dir/src</div><div class='add'>+TEST ! stat $B0/${V0}0/dir/src</div><div class='add'>+TEST ! stat $B0/${V0}1/dir/src</div><div class='add'>+TEST   stat $M0/dir/dst2</div><div class='add'>+TEST   stat $B0/${V0}0/dir/dst2</div><div class='add'>+TEST   stat $B0/${V0}1/dir/dst2</div><div class='add'>+</div><div class='add'>+#############################################################################</div><div class='add'>+##### 12. Rename with non-existent dst and a sharded src with no shards #####</div><div class='add'>+#############################################################################</div><div class='add'>+</div><div class='add'>+TEST touch $M0/dir/src</div><div class='add'>+TEST dd if=/dev/zero of=$M0/dir/src bs=1024 count=1024</div><div class='add'>+gfid_src=$(get_gfid_string $M0/dir/src)</div><div class='add'>+TEST ! stat $B0/${V0}0/.shard/$gfid_src.1</div><div class='add'>+TEST ! stat $B0/${V0}1/.shard/$gfid_src.1</div><div class='add'>+# Now rename src to the dst.</div><div class='add'>+TEST mv $M0/dir/src $M0/dir/dst1</div><div class='add'>+TEST ! stat $M0/dir/src</div><div class='add'>+TEST ! stat $B0/${V0}0/dir/src</div><div class='add'>+TEST ! stat $B0/${V0}1/dir/src</div><div class='add'>+TEST   stat $M0/dir/dst1</div><div class='add'>+TEST   stat $B0/${V0}0/dir/dst1</div><div class='add'>+TEST   stat $B0/${V0}1/dir/dst1</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/bugs/shard/zero-flag.t b/tests/bugs/shard/zero-flag.t<br/>new file mode 100644<br/>index 00000000000..1f39787ab9f<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/shard/zero-flag.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/shard/zero-flag.t</a></div><div class='hunk'>@@ -0,0 +1,76 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+. $(dirname $0)/../../fallocate.rc</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='add'>+</div><div class='add'>+require_fallocate -l 1m $M0/file</div><div class='add'>+require_fallocate -p -l 512k $M0/file &amp;&amp; rm -f $M0/file</div><div class='add'>+require_fallocate -z -l 512k $M0/file &amp;&amp; rm -f $M0/file</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 replica 2 $H0:$B0/${V0}{0,1,2,3}</div><div class='add'>+TEST $CLI volume set $V0 features.shard on</div><div class='add'>+TEST $CLI volume set $V0 features.shard-block-size 4MB</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+TEST $GFS --volfile-id=$V0 --volfile-server=$H0 $M0</div><div class='add'>+TEST build_tester $(dirname $0)/shard-fallocate.c -lgfapi -Wall -O2</div><div class='add'>+</div><div class='add'>+# On file1 confirm that when fallocate's offset + len &gt; cur file size,</div><div class='add'>+# the new file size will increase.</div><div class='add'>+TEST touch $M0/tmp</div><div class='add'>+TEST `echo 'abcdefghijklmnopqrstuvwxyz' &gt; $M0/tmp`</div><div class='add'>+TEST touch $M0/file1</div><div class='add'>+</div><div class='add'>+gfid_file1=$(get_gfid_string $M0/file1)</div><div class='add'>+</div><div class='add'>+TEST $(dirname $0)/shard-fallocate $H0 $V0 "0" "0" "6291456" /file1 `gluster --print-logdir`/glfs-$V0.log</div><div class='add'>+</div><div class='add'>+EXPECT '6291456' stat -c %s $M0/file1</div><div class='add'>+</div><div class='add'>+# This should ensure /.shard is created on the bricks.</div><div class='add'>+TEST stat $B0/${V0}0/.shard</div><div class='add'>+TEST stat $B0/${V0}1/.shard</div><div class='add'>+TEST stat $B0/${V0}2/.shard</div><div class='add'>+TEST stat $B0/${V0}3/.shard</div><div class='add'>+</div><div class='add'>+EXPECT "2097152" echo `find $B0 -name $gfid_file1.1 | xargs stat -c %s`</div><div class='add'>+EXPECT "1" file_all_zeroes $M0/file1</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+# On file2 confirm that fallocate to already allocated region of the</div><div class='add'>+# file does not change the content of the file.</div><div class='add'>+TEST truncate -s 6M $M0/file2</div><div class='add'>+TEST dd if=$M0/tmp of=$M0/file2 bs=1 seek=3145728 count=26 conv=notrunc</div><div class='add'>+md5sum_file2=$(md5sum $M0/file2 | awk '{print $1}')</div><div class='add'>+</div><div class='add'>+TEST $(dirname $0)/shard-fallocate $H0 $V0 "0" "3145728" "26" /file2 `gluster --print-logdir`/glfs-$V0.log</div><div class='add'>+</div><div class='add'>+EXPECT '6291456' stat -c %s $M0/file2</div><div class='add'>+EXPECT "$md5sum_file2" echo `md5sum $M0/file2 | awk '{print $1}'`</div><div class='add'>+</div><div class='add'>+# On file3 confirm that fallocate to a region of the file that consists</div><div class='add'>+#of holes creates a new shard in its place, fallocates it and there is no</div><div class='add'>+#change in the file content seen by the application.</div><div class='add'>+TEST touch $M0/file3</div><div class='add'>+</div><div class='add'>+gfid_file3=$(get_gfid_string $M0/file3)</div><div class='add'>+</div><div class='add'>+TEST dd if=$M0/tmp of=$M0/file3 bs=1 seek=9437184 count=26 conv=notrunc</div><div class='add'>+TEST ! stat $B0/$V0*/.shard/$gfid_file3.1</div><div class='add'>+TEST   stat $B0/$V0*/.shard/$gfid_file3.2</div><div class='add'>+md5sum_file3=$(md5sum $M0/file3 | awk '{print $1}')</div><div class='add'>+EXPECT "1048602" echo `find $B0 -name $gfid_file3.2 | xargs stat -c %s`</div><div class='add'>+</div><div class='add'>+TEST $(dirname $0)/shard-fallocate $H0 $V0 "0" "5242880" "1048576" /file3 `gluster --print-logdir`/glfs-$V0.log</div><div class='add'>+EXPECT "$md5sum_file3" echo `md5sum $M0/file3 | awk '{print $1}'`</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+TEST $CLI volume stop $V0</div><div class='add'>+TEST $CLI volume delete $V0</div><div class='add'>+rm -f $(dirname $0)/shard-fallocate</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/bugs/snapshot/bug-1045333.t b/tests/bugs/snapshot/bug-1045333.t<br/>new file mode 100755<br/>index 00000000000..6c0b995b5b0<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/snapshot/bug-1045333.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/snapshot/bug-1045333.t</a></div><div class='hunk'>@@ -0,0 +1,44 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../snapshot.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+TEST verify_lvm_version;</div><div class='add'>+TEST glusterd;</div><div class='add'>+TEST pidof glusterd;</div><div class='add'>+</div><div class='add'>+TEST setup_lvm 1</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 $H0:$L1</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+S1="${V0}-snap1"    #Create snapshot with name contains hyphen(-)</div><div class='add'>+S2="-${V0}-snap2"   #Create snapshot with name starts with hyphen(-)</div><div class='add'>+#Create snapshot with a long name</div><div class='add'>+S3="${V0}_single_gluster_volume_is_accessible_by_multiple_clients_offline_snapshot_is_a_long_name"</div><div class='add'>+</div><div class='add'>+TEST $CLI snapshot create $S1 $V0 no-timestamp</div><div class='add'>+TEST snapshot_exists 0 $S1</div><div class='add'>+</div><div class='add'>+TEST $CLI snapshot create $S2 $V0 no-timestamp</div><div class='add'>+TEST snapshot_exists 0 $S2</div><div class='add'>+</div><div class='add'>+TEST $CLI snapshot create $S3 $V0 no-timestamp</div><div class='add'>+TEST snapshot_exists 0 $S3</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+TEST glusterfs -s $H0 --volfile-id=/snaps/$S1/$V0 $M0</div><div class='add'>+TEST glusterfs -s $H0 --volfile-id=/snaps/$S2/$V0 $M1</div><div class='add'>+TEST glusterfs -s $H0 --volfile-id=/snaps/$S3/$V0 $M2</div><div class='add'>+</div><div class='add'>+#Clean up</div><div class='add'>+#TEST $CLI snapshot delete $S1</div><div class='add'>+#TEST $CLI snapshot delete $S2</div><div class='add'>+#TEST $CLI snapshot delete $S3</div><div class='add'>+</div><div class='add'>+TEST $CLI volume stop $V0 force</div><div class='add'>+#TEST $CLI volume delete $V0</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/snapshot/bug-1049834.t b/tests/bugs/snapshot/bug-1049834.t<br/>new file mode 100755<br/>index 00000000000..29c75cc7f96<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/snapshot/bug-1049834.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/snapshot/bug-1049834.t</a></div><div class='hunk'>@@ -0,0 +1,44 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../cluster.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+. $(dirname $0)/../../snapshot.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+TEST verify_lvm_version</div><div class='add'>+TEST launch_cluster 2</div><div class='add'>+TEST setup_lvm 2</div><div class='add'>+</div><div class='add'>+TEST $CLI_1 peer probe $H2</div><div class='add'>+EXPECT_WITHIN $PROBE_TIMEOUT 1 peer_count</div><div class='add'>+</div><div class='add'>+TEST $CLI_1 volume create $V0 $H1:$L1 $H2:$L2</div><div class='add'>+EXPECT 'Created' volinfo_field $V0 'Status'</div><div class='add'>+</div><div class='add'>+TEST $CLI_1 volume start $V0</div><div class='add'>+EXPECT 'Started' volinfo_field $V0 'Status'</div><div class='add'>+</div><div class='add'>+#Setting the snap-max-hard-limit to 4</div><div class='add'>+TEST $CLI_1 snapshot config $V0 snap-max-hard-limit 4</div><div class='add'>+PID_1=$!</div><div class='add'>+wait $PID_1</div><div class='add'>+</div><div class='add'>+#Creating 3 snapshots on the volume (which is the soft-limit)</div><div class='add'>+TEST create_n_snapshots $V0 3 $V0_snap</div><div class='add'>+TEST snapshot_n_exists $V0 3 $V0_snap</div><div class='add'>+</div><div class='add'>+#Creating the 4th snapshot on the volume and expecting it to be created</div><div class='add'>+# but with the deletion of the oldest snapshot i.e 1st snapshot</div><div class='add'>+TEST  $CLI_1 snapshot create ${V0}_snap4 ${V0} no-timestamp</div><div class='add'>+TEST  snapshot_exists 1 ${V0}_snap4</div><div class='add'>+TEST ! snapshot_exists 1 ${V0}_snap1</div><div class='add'>+TEST $CLI_1 snapshot delete ${V0}_snap4</div><div class='add'>+TEST $CLI_1 snapshot create ${V0}_snap1 ${V0} no-timestamp</div><div class='add'>+TEST snapshot_exists 1 ${V0}_snap1</div><div class='add'>+</div><div class='add'>+#Deleting the 4 snaps</div><div class='add'>+#TEST delete_n_snapshots $V0 4 $V0_snap</div><div class='add'>+#TEST ! snapshot_n_exists $V0 4 $V0_snap</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/snapshot/bug-1064768.t b/tests/bugs/snapshot/bug-1064768.t<br/>new file mode 100644<br/>index 00000000000..53140a0e13e<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/snapshot/bug-1064768.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/snapshot/bug-1064768.t</a></div><div class='hunk'>@@ -0,0 +1,20 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 replica 2 $H0:$B0/brick0 $H0:$B0/brick1</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT 'Started' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+TEST $CLI volume profile $V0 start</div><div class='add'>+TEST $CLI volume profile $V0 info</div><div class='add'>+TEST $CLI volume profile $V0 stop</div><div class='add'>+</div><div class='add'>+TEST $CLI volume status</div><div class='add'>+TEST $CLI volume stop $V0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT 'Stopped' volinfo_field $V0 'Status';</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/snapshot/bug-1087203.t b/tests/bugs/snapshot/bug-1087203.t<br/>new file mode 100644<br/>index 00000000000..035be098576<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/snapshot/bug-1087203.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/snapshot/bug-1087203.t</a></div><div class='hunk'>@@ -0,0 +1,103 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+. $(dirname $0)/../../snapshot.rc</div><div class='add'>+. $(dirname $0)/../../cluster.rc</div><div class='add'>+</div><div class='add'>+function get_volume_info ()</div><div class='add'>+{</div><div class='add'>+        local var=$1</div><div class='add'>+        $CLI_1 volume info $V0 | grep "^$var" | sed 's/.*: //'</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST verify_lvm_version</div><div class='add'>+TEST launch_cluster 2</div><div class='add'>+TEST setup_lvm 2</div><div class='add'>+</div><div class='add'>+TEST $CLI_1 peer probe $H2;</div><div class='add'>+EXPECT_WITHIN $PROBE_TIMEOUT 1 peer_count;</div><div class='add'>+</div><div class='add'>+TEST $CLI_1 volume create $V0 $H1:$L1 $H2:$L2</div><div class='add'>+EXPECT "$V0" get_volume_info 'Volume Name';</div><div class='add'>+EXPECT 'Created' get_volume_info 'Status';</div><div class='add'>+</div><div class='add'>+TEST $CLI_1 volume start $V0</div><div class='add'>+EXPECT 'Started' get_volume_info 'Status';</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+# Setting system limit</div><div class='add'>+TEST $CLI_1 snapshot config snap-max-hard-limit 100</div><div class='add'>+</div><div class='add'>+# Volume limit cannot exceed system limit, as limit is set to 100,</div><div class='add'>+# this should fail.</div><div class='add'>+TEST ! $CLI_1 snapshot config $V0 snap-max-hard-limit 101</div><div class='add'>+</div><div class='add'>+# Following are the invalid cases</div><div class='add'>+TEST ! $CLI_1 snapshot config $V0 snap-max-hard-limit a10</div><div class='add'>+TEST ! $CLI_1 snapshot config snap-max-hard-limit 10a</div><div class='add'>+TEST ! $CLI_1 snapshot config snap-max-hard-limit 10%</div><div class='add'>+TEST ! $CLI_1 snapshot config snap-max-soft-limit 50%1</div><div class='add'>+TEST ! $CLI_1 snapshot config snap-max-soft-limit 0111</div><div class='add'>+TEST ! $CLI_1 snapshot config snap-max-hard-limit OXA</div><div class='add'>+TEST ! $CLI_1 snapshot config snap-max-hard-limit 11.11</div><div class='add'>+TEST ! $CLI_1 snapshot config snap-max-soft-limit 50%</div><div class='add'>+TEST ! $CLI_1 snapshot config snap-max-hard-limit -100</div><div class='add'>+TEST ! $CLI_1 snapshot config snap-max-soft-limit -90</div><div class='add'>+</div><div class='add'>+# Soft limit cannot be assigned to volume</div><div class='add'>+TEST ! $CLI_1 snapshot config $V0 snap-max-soft-limit 10</div><div class='add'>+</div><div class='add'>+# Valid case</div><div class='add'>+TEST $CLI_1 snapshot config snap-max-soft-limit 50</div><div class='add'>+TEST $CLI_1 snapshot config $V0 snap-max-hard-limit 10</div><div class='add'>+</div><div class='add'>+# Validating auto-delete feature</div><div class='add'>+# Make sure auto-delete is disabled by default</div><div class='add'>+EXPECT 'disable' snap_config CLI_1 'auto-delete'</div><div class='add'>+</div><div class='add'>+# Test for invalid value for auto-delete</div><div class='add'>+TEST ! $CLI_1 snapshot config auto-delete test</div><div class='add'>+</div><div class='add'>+TEST $CLI_1 snapshot config snap-max-hard-limit 6</div><div class='add'>+TEST $CLI_1 snapshot config snap-max-soft-limit 50</div><div class='add'>+</div><div class='add'>+# Create 4 snapshots</div><div class='add'>+snap_index=1</div><div class='add'>+snap_count=4</div><div class='add'>+TEST snap_create CLI_1 $V0 $snap_index $snap_count</div><div class='add'>+</div><div class='add'>+# If auto-delete is disabled then oldest snapshot</div><div class='add'>+# should not be deleted automatically.</div><div class='add'>+EXPECT '4' get_snap_count CLI_1;</div><div class='add'>+</div><div class='add'>+TEST snap_delete CLI_1 $snap_index $snap_count;</div><div class='add'>+</div><div class='add'>+# After all those 4 snaps are deleted, There will not be any snaps present</div><div class='add'>+EXPECT '0' get_snap_count CLI_1;</div><div class='add'>+</div><div class='add'>+TEST $CLI_1 snapshot config auto-delete enable</div><div class='add'>+</div><div class='add'>+# auto-delete is already enabled, Hence expect a failure.</div><div class='add'>+TEST ! $CLI_1 snapshot config auto-delete on</div><div class='add'>+</div><div class='add'>+# Testing other boolean values with auto-delete</div><div class='add'>+TEST $CLI_1 snapshot config auto-delete off</div><div class='add'>+EXPECT 'off' snap_config CLI_1 'auto-delete'</div><div class='add'>+</div><div class='add'>+TEST $CLI_1 snapshot config auto-delete true</div><div class='add'>+EXPECT 'true' snap_config CLI_1 'auto-delete'</div><div class='add'>+</div><div class='add'>+# Try to create 4 snaps again, As auto-delete is enabled</div><div class='add'>+# oldest snap should be deleted and snapcount should be 3</div><div class='add'>+</div><div class='add'>+TEST snap_create CLI_1 $V0 $snap_index $snap_count;</div><div class='add'>+EXPECT '3' get_snap_count CLI_1;</div><div class='add'>+</div><div class='add'>+TEST $CLI_1 snapshot config auto-delete disable</div><div class='add'>+EXPECT 'disable' snap_config CLI_1 'auto-delete'</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='head'>diff --git a/tests/bugs/snapshot/bug-1090042.t b/tests/bugs/snapshot/bug-1090042.t<br/>new file mode 100755<br/>index 00000000000..98531a9751e<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/snapshot/bug-1090042.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/snapshot/bug-1090042.t</a></div><div class='hunk'>@@ -0,0 +1,26 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+. $(dirname $0)/../../snapshot.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST init_n_bricks 3;</div><div class='add'>+TEST setup_lvm 3;</div><div class='add'>+TEST glusterd;</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 replica 3 $H0:$L1 $H0:$L2 $H0:$L3;</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+</div><div class='add'>+TEST kill_brick $V0 $H0 $L1;</div><div class='add'>+</div><div class='add'>+#Normal snap create should fail</div><div class='add'>+TEST !  $CLI snapshot create ${V0}_snap1 $V0 no-timestamp;</div><div class='add'>+TEST !  snapshot_exists 0 ${V0}_snap1;</div><div class='add'>+</div><div class='add'>+#With changes introduced in BZ #1184344 force snap create should fail too</div><div class='add'>+TEST  ! $CLI snapshot create ${V0}_snap1 $V0 no-timestamp force;</div><div class='add'>+TEST  ! snapshot_exists 0 ${V0}_snap1;</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/snapshot/bug-1109770.t b/tests/bugs/snapshot/bug-1109770.t<br/>new file mode 100644<br/>index 00000000000..22511995937<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/snapshot/bug-1109770.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/snapshot/bug-1109770.t</a></div><div class='hunk'>@@ -0,0 +1,65 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+. $(dirname $0)/../../snapshot.rc</div><div class='add'>+. $(dirname $0)/../../fileio.rc</div><div class='add'>+. $(dirname $0)/../../nfs.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST init_n_bricks 3;</div><div class='add'>+TEST setup_lvm 3;</div><div class='add'>+</div><div class='add'>+TEST glusterd;</div><div class='add'>+</div><div class='add'>+TEST pidof glusterd;</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 $H0:$L1 $H0:$L2 $H0:$L3;</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+</div><div class='add'>+TEST glusterfs --volfile-server=$H0 --volfile-id=$V0 $M0;</div><div class='add'>+</div><div class='add'>+for i in {1..10} ; do echo "file" &gt; $M0/file$i ; done</div><div class='add'>+</div><div class='add'>+TEST $CLI snapshot create snap1 $V0 no-timestamp;</div><div class='add'>+</div><div class='add'>+for i in {11..20} ; do echo "file" &gt; $M0/file$i ; done</div><div class='add'>+</div><div class='add'>+TEST $CLI snapshot create snap2 $V0 no-timestamp;</div><div class='add'>+</div><div class='add'>+mkdir $M0/dir1;</div><div class='add'>+mkdir $M0/dir2;</div><div class='add'>+</div><div class='add'>+for i in {1..10} ; do echo "foo" &gt; $M0/dir1/foo$i ; done</div><div class='add'>+for i in {1..10} ; do echo "foo" &gt; $M0/dir2/foo$i ; done</div><div class='add'>+</div><div class='add'>+TEST $CLI snapshot create snap3 $V0 no-timestamp;</div><div class='add'>+</div><div class='add'>+for i in {11..20} ; do echo "foo" &gt; $M0/dir1/foo$i ; done</div><div class='add'>+for i in {11..20} ; do echo "foo" &gt; $M0/dir2/foo$i ; done</div><div class='add'>+</div><div class='add'>+TEST $CLI snapshot create snap4 $V0 no-timestamp;</div><div class='add'>+</div><div class='add'>+TEST $CLI volume set $V0 features.uss enable;</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT 'Y' check_if_snapd_exist</div><div class='add'>+</div><div class='add'>+TEST $CLI volume set $V0 features.uss disable;</div><div class='add'>+</div><div class='add'>+SNAPD_PID=$(ps auxww | grep snapd | grep -v grep | awk '{print $2}');</div><div class='add'>+</div><div class='add'>+TEST ! [ $SNAPD_PID -gt 0 ];</div><div class='add'>+</div><div class='add'>+TEST $CLI volume set $V0 features.uss enable;</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT 'Y' check_if_snapd_exist</div><div class='add'>+</div><div class='add'>+TEST $CLI volume stop $V0;</div><div class='add'>+</div><div class='add'>+SNAPD_PID=$(ps auxww | grep snapd | grep -v grep | awk '{print $2}');</div><div class='add'>+</div><div class='add'>+TEST ! [ $SNAPD_PID -gt 0 ];</div><div class='add'>+</div><div class='add'>+cleanup  ;</div><div class='head'>diff --git a/tests/bugs/snapshot/bug-1109889.t b/tests/bugs/snapshot/bug-1109889.t<br/>new file mode 100644<br/>index 00000000000..5fdc7dc9506<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/snapshot/bug-1109889.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/snapshot/bug-1109889.t</a></div><div class='hunk'>@@ -0,0 +1,74 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+. $(dirname $0)/../../snapshot.rc</div><div class='add'>+. $(dirname $0)/../../fileio.rc</div><div class='add'>+. $(dirname $0)/../../nfs.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST init_n_bricks 3;</div><div class='add'>+TEST setup_lvm 3;</div><div class='add'>+</div><div class='add'>+TEST glusterd;</div><div class='add'>+</div><div class='add'>+TEST pidof glusterd;</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 $H0:$L1 $H0:$L2 $H0:$L3;</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+</div><div class='add'>+TEST $GFS --volfile-server=$H0 --volfile-id=$V0 $M0;</div><div class='add'>+</div><div class='add'>+MOUNT_PID=$(get_mount_process_pid $V0 $M0)</div><div class='add'>+</div><div class='add'>+for i in {1..10} ; do echo "file" &gt; $M0/file$i ; done</div><div class='add'>+</div><div class='add'>+TEST $CLI snapshot config activate-on-create enable</div><div class='add'>+</div><div class='add'>+TEST $CLI snapshot create snap1 $V0 no-timestamp;</div><div class='add'>+</div><div class='add'>+for i in {11..20} ; do echo "file" &gt; $M0/file$i ; done</div><div class='add'>+</div><div class='add'>+TEST $CLI snapshot create snap2 $V0 no-timestamp;</div><div class='add'>+</div><div class='add'>+mkdir $M0/dir1;</div><div class='add'>+mkdir $M0/dir2;</div><div class='add'>+</div><div class='add'>+for i in {1..10} ; do echo "foo" &gt; $M0/dir1/foo$i ; done</div><div class='add'>+for i in {1..10} ; do echo "foo" &gt; $M0/dir2/foo$i ; done</div><div class='add'>+</div><div class='add'>+TEST $CLI snapshot create snap3 $V0 no-timestamp;</div><div class='add'>+</div><div class='add'>+for i in {11..20} ; do echo "foo" &gt; $M0/dir1/foo$i ; done</div><div class='add'>+for i in {11..20} ; do echo "foo" &gt; $M0/dir2/foo$i ; done</div><div class='add'>+</div><div class='add'>+TEST $CLI snapshot create snap4 $V0 no-timestamp;</div><div class='add'>+</div><div class='add'>+TEST $CLI volume set $V0 features.uss enable;</div><div class='add'>+</div><div class='add'>+#let snapd get started properly and client connect to snapd</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" snap_client_connected_status $V0</div><div class='add'>+</div><div class='add'>+SNAPD_PID=$(ps auxww | grep snapd | grep -v grep | awk '{print $2}');</div><div class='add'>+</div><div class='add'>+TEST [ $SNAPD_PID -gt 0 ];</div><div class='add'>+</div><div class='add'>+TEST stat $M0/.snaps;</div><div class='add'>+</div><div class='add'>+kill -KILL $SNAPD_PID;</div><div class='add'>+</div><div class='add'>+# let snapd die properly</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "0" snap_client_connected_status $V0</div><div class='add'>+</div><div class='add'>+TEST ! stat $M0/.snaps;</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0 force;</div><div class='add'>+</div><div class='add'>+# let client get the snapd port from glusterd and connect</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" snap_client_connected_status $V0</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "0" STAT $M0/.snaps</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/snapshot/bug-1111041.t b/tests/bugs/snapshot/bug-1111041.t<br/>new file mode 100755<br/>index 00000000000..efda9688d8b<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/snapshot/bug-1111041.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/snapshot/bug-1111041.t</a></div><div class='hunk'>@@ -0,0 +1,40 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+. $(dirname $0)/../../fileio.rc</div><div class='add'>+. $(dirname $0)/../../nfs.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+function is_snapd_running {</div><div class='add'>+         $CLI volume status $1 | grep "Snapshot Daemon" | wc -l;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function snapd_pid {</div><div class='add'>+    $CLI volume status $V0 | grep "Snapshot Daemon" | awk {'print $8'}</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+TEST glusterd;</div><div class='add'>+</div><div class='add'>+TEST pidof glusterd;</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/${V0}0 $H0:$B0/${V0}1</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+</div><div class='add'>+EXPECT "0" is_snapd_running $v0</div><div class='add'>+</div><div class='add'>+TEST $CLI volume set $V0 features.uss enable;</div><div class='add'>+</div><div class='add'>+EXPECT "1" is_snapd_running $V0</div><div class='add'>+</div><div class='add'>+SNAPD_PID=$(snapd_pid);</div><div class='add'>+</div><div class='add'>+TEST [ $SNAPD_PID -gt 0 ]</div><div class='add'>+</div><div class='add'>+kill -9 $SNAPD_PID</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $PROCESS_DOWN_TIMEOUT "^N/A$" snapd_pid</div><div class='add'>+</div><div class='add'>+cleanup  ;</div><div class='head'>diff --git a/tests/bugs/snapshot/bug-1112613.t b/tests/bugs/snapshot/bug-1112613.t<br/>new file mode 100644<br/>index 00000000000..e566de056bc<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/snapshot/bug-1112613.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/snapshot/bug-1112613.t</a></div><div class='hunk'>@@ -0,0 +1,49 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+. $(dirname $0)/../../snapshot.rc</div><div class='add'>+. $(dirname $0)/../../cluster.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+V1="patchy2"</div><div class='add'>+</div><div class='add'>+TEST verify_lvm_version;</div><div class='add'>+TEST launch_cluster 2</div><div class='add'>+TEST setup_lvm 2</div><div class='add'>+</div><div class='add'>+TEST $CLI_1 peer probe $H2</div><div class='add'>+EXPECT_WITHIN $PROBE_TIMEOUT 1 peer_count</div><div class='add'>+</div><div class='add'>+TEST $CLI_1 volume create $V0 $H1:$L1</div><div class='add'>+TEST $CLI_1 volume start $V0</div><div class='add'>+TEST $CLI_1 volume create $V1 $H2:$L2</div><div class='add'>+TEST $CLI_1 volume start $V1</div><div class='add'>+</div><div class='add'>+# Create 3 snapshots for volume $V0</div><div class='add'>+snap_count=3</div><div class='add'>+snap_index=1</div><div class='add'>+TEST snap_create CLI_1 $V0 $snap_index $snap_count;</div><div class='add'>+</div><div class='add'>+# Create 3 snapshots for volume $V1</div><div class='add'>+snap_count=4</div><div class='add'>+snap_index=11</div><div class='add'>+TEST snap_create CLI_1 $V1 $snap_index $snap_count;</div><div class='add'>+</div><div class='add'>+EXPECT '3' get_snap_count CLI_1 $V0;</div><div class='add'>+EXPECT '4' get_snap_count CLI_1 $V1;</div><div class='add'>+EXPECT '7' get_snap_count CLI_1</div><div class='add'>+</div><div class='add'>+TEST $CLI_1 snapshot delete volume $V0</div><div class='add'>+EXPECT '0' get_snap_count CLI_1 $V0;</div><div class='add'>+EXPECT '4' get_snap_count CLI_1 $V1;</div><div class='add'>+EXPECT '4' get_snap_count CLI_1</div><div class='add'>+</div><div class='add'>+TEST $CLI_1 snapshot delete all</div><div class='add'>+EXPECT '0' get_snap_count CLI_1 $V0;</div><div class='add'>+EXPECT '0' get_snap_count CLI_1 $V1;</div><div class='add'>+EXPECT '0' get_snap_count CLI_1</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='head'>diff --git a/tests/bugs/snapshot/bug-1113975.t b/tests/bugs/snapshot/bug-1113975.t<br/>new file mode 100644<br/>index 00000000000..86c1739fb46<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/snapshot/bug-1113975.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/snapshot/bug-1113975.t</a></div><div class='hunk'>@@ -0,0 +1,38 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+. $(dirname $0)/../../snapshot.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST init_n_bricks 3;</div><div class='add'>+TEST setup_lvm 3;</div><div class='add'>+</div><div class='add'>+TEST glusterd;</div><div class='add'>+</div><div class='add'>+TEST pidof glusterd;</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 $H0:$L1 $H0:$L2 $H0:$L3;</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+</div><div class='add'>+TEST glusterfs --volfile-server=$H0 --volfile-id=$V0 $M0;</div><div class='add'>+</div><div class='add'>+for i in {1..10} ; do echo "file" &gt; $M0/file$i ; done</div><div class='add'>+</div><div class='add'>+TEST $CLI snapshot create snap1 $V0 no-timestamp;</div><div class='add'>+</div><div class='add'>+for i in {11..20} ; do echo "file" &gt; $M0/file$i ; done</div><div class='add'>+</div><div class='add'>+TEST $CLI snapshot create snap2 $V0 no-timestamp;</div><div class='add'>+</div><div class='add'>+TEST $CLI volume stop $V0</div><div class='add'>+</div><div class='add'>+TEST $CLI snapshot restore snap1;</div><div class='add'>+</div><div class='add'>+TEST $CLI snapshot restore snap2;</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+cleanup  ;</div><div class='head'>diff --git a/tests/bugs/snapshot/bug-1155042-dont-display-deactivated-snapshots.t b/tests/bugs/snapshot/bug-1155042-dont-display-deactivated-snapshots.t<br/>new file mode 100644<br/>index 00000000000..c5a285eb775<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/snapshot/bug-1155042-dont-display-deactivated-snapshots.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/snapshot/bug-1155042-dont-display-deactivated-snapshots.t</a></div><div class='hunk'>@@ -0,0 +1,36 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+. $(dirname $0)/../../snapshot.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST init_n_bricks 2</div><div class='add'>+TEST setup_lvm 2</div><div class='add'>+TEST glusterd;</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 $H0:$L1 $H0:$L2</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+# enable uss and mount the volume</div><div class='add'>+TEST $CLI volume set $V0 features.uss enable</div><div class='add'>+TEST $GFS --volfile-server=$H0 --volfile-id=$V0 $M0</div><div class='add'>+</div><div class='add'>+# create 10 snapshots and check if all are being reflected</div><div class='add'>+# in the USS world</div><div class='add'>+gluster snapshot config activate-on-create enable</div><div class='add'>+for i in {1..10}; do $CLI snapshot create snap$i $V0 no-timestamp; done</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT 10 uss_count_snap_displayed $M0</div><div class='add'>+</div><div class='add'>+# snapshots should not be displayed after deactivation</div><div class='add'>+for i in {1..10}; do $CLI snapshot deactivate snap$i --mode=script; done</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT 0 uss_count_snap_displayed $M0</div><div class='add'>+</div><div class='add'>+# activate all the snapshots and check if all the activated snapshots</div><div class='add'>+# are displayed again</div><div class='add'>+for i in {1..10}; do $CLI snapshot activate snap$i --mode=script; done</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT 10 uss_count_snap_displayed $M0</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='head'>diff --git a/tests/bugs/snapshot/bug-1157991.t b/tests/bugs/snapshot/bug-1157991.t<br/>new file mode 100755<br/>index 00000000000..f626ef2b705<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/snapshot/bug-1157991.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/snapshot/bug-1157991.t</a></div><div class='hunk'>@@ -0,0 +1,30 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../snapshot.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+TEST verify_lvm_version;</div><div class='add'>+TEST glusterd;</div><div class='add'>+TEST pidof glusterd;</div><div class='add'>+</div><div class='add'>+TEST setup_lvm 1</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 $H0:$L1</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+TEST $CLI snapshot create snap1 $V0 no-timestamp</div><div class='add'>+EXPECT 'Stopped' snapshot_status snap1;</div><div class='add'>+</div><div class='add'>+TEST $CLI snapshot config activate-on-create enable</div><div class='add'>+TEST $CLI snapshot create snap2 $V0 no-timestamp</div><div class='add'>+EXPECT 'Started' snapshot_status snap2;</div><div class='add'>+</div><div class='add'>+#Clean up</div><div class='add'>+TEST $CLI snapshot delete snap1</div><div class='add'>+TEST $CLI snapshot delete snap2</div><div class='add'>+</div><div class='add'>+TEST $CLI volume stop $V0 force</div><div class='add'>+TEST $CLI volume delete $V0</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/snapshot/bug-1162462.t b/tests/bugs/snapshot/bug-1162462.t<br/>new file mode 100755<br/>index 00000000000..5c2e4fe37f0<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/snapshot/bug-1162462.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/snapshot/bug-1162462.t</a></div><div class='hunk'>@@ -0,0 +1,38 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+. $(dirname $0)/../../snapshot.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST init_n_bricks 3;</div><div class='add'>+TEST setup_lvm 3;</div><div class='add'>+TEST glusterd;</div><div class='add'>+TEST pidof glusterd;</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 $H0:$L1 $H0:$L2 $H0:$L3;</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+TEST $CLI volume set $V0 features.uss enable;</div><div class='add'>+TEST $GFS --volfile-server=$H0 --volfile-id=$V0 $M0;</div><div class='add'>+</div><div class='add'>+mkdir $M0/test</div><div class='add'>+echo "file1" &gt; $M0/file1</div><div class='add'>+ln -s $M0/file1 $M0/test/file_symlink</div><div class='add'>+ls -l $M0/ &gt; /dev/null</div><div class='add'>+ls -l $M0/test/ &gt; /dev/null</div><div class='add'>+</div><div class='add'>+TEST $CLI snapshot create snap1 $V0 no-timestamp;</div><div class='add'>+$CLI snapshot activate snap1;</div><div class='add'>+EXPECT 'Started' snapshot_status snap1;</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" snap_client_connected_status $V0</div><div class='add'>+ls $M0/.snaps/snap1/test/ &gt; /dev/null</div><div class='add'>+ls -l $M0/.snaps/snap1/test/ &gt; /dev/null</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" snap_client_connected_status $V0</div><div class='add'>+</div><div class='add'>+TEST $CLI snapshot delete snap1;</div><div class='add'>+TEST $CLI volume stop $V0;</div><div class='add'>+TEST $CLI volume delete $V0;</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/snapshot/bug-1162498.t b/tests/bugs/snapshot/bug-1162498.t<br/>new file mode 100755<br/>index 00000000000..a97e4429ee7<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/snapshot/bug-1162498.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/snapshot/bug-1162498.t</a></div><div class='hunk'>@@ -0,0 +1,56 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+. $(dirname $0)/../../snapshot.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+TEST verify_lvm_version;</div><div class='add'>+TEST glusterd;</div><div class='add'>+TEST pidof glusterd;</div><div class='add'>+</div><div class='add'>+TEST setup_lvm 1</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 $H0:$L1</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+TEST $CLI snapshot config activate-on-create enable</div><div class='add'>+TEST $CLI volume set $V0 features.uss enable</div><div class='add'>+</div><div class='add'>+TEST glusterfs -s $H0 --volfile-id=$V0 $M0</div><div class='add'>+</div><div class='add'>+TEST mkdir $M0/xyz</div><div class='add'>+</div><div class='add'>+TEST $CLI snapshot create snap1 $V0 no-timestamp</div><div class='add'>+TEST $CLI snapshot create snap2 $V0 no-timestamp</div><div class='add'>+</div><div class='add'>+TEST rmdir $M0/xyz</div><div class='add'>+</div><div class='add'>+TEST $CLI snapshot create snap3 $V0 no-timestamp</div><div class='add'>+TEST $CLI snapshot create snap4 $V0 no-timestamp</div><div class='add'>+</div><div class='add'>+TEST mkdir $M0/xyz</div><div class='add'>+TEST ls $M0/xyz/.snaps/</div><div class='add'>+</div><div class='add'>+TEST $CLI volume stop $V0</div><div class='add'>+TEST $CLI snapshot restore snap2</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+TEST glusterfs -s $H0 --volfile-id=$V0 $M0</div><div class='add'>+</div><div class='add'>+#Dir xyz exists in snap1</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "0" STAT $M0/xyz</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "3" count_snaps $M0/xyz</div><div class='add'>+TEST mkdir $M0/abc</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "3" count_snaps $M0/abc</div><div class='add'>+</div><div class='add'>+#Clean up</div><div class='add'>+TEST $CLI snapshot delete snap1</div><div class='add'>+TEST $CLI snapshot delete snap3</div><div class='add'>+TEST $CLI snapshot delete snap4</div><div class='add'>+TEST $CLI volume stop $V0 force</div><div class='add'>+TEST $CLI volume delete $V0</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/snapshot/bug-1166197.t b/tests/bugs/snapshot/bug-1166197.t<br/>new file mode 100755<br/>index 00000000000..b070ae271ba<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/snapshot/bug-1166197.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/snapshot/bug-1166197.t</a></div><div class='hunk'>@@ -0,0 +1,52 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../snapshot.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+. $(dirname $0)/../../nfs.rc</div><div class='add'>+</div><div class='add'>+#G_TESTDEF_TEST_STATUS_CENTOS6=NFS_TEST</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+CURDIR=`pwd`</div><div class='add'>+</div><div class='add'>+TEST verify_lvm_version;</div><div class='add'>+TEST glusterd;</div><div class='add'>+TEST pidof glusterd;</div><div class='add'>+</div><div class='add'>+TEST setup_lvm 1</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 $H0:$L1</div><div class='add'>+TEST $CLI volume set $V0 nfs.disable false</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+TEST $CLI snapshot config activate-on-create enable</div><div class='add'>+TEST $CLI volume set $V0 features.uss enable</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT 'Started' volinfo_field $V0 'Status';</div><div class='add'>+EXPECT_WITHIN $NFS_EXPORT_TIMEOUT "1" is_nfs_export_available;</div><div class='add'>+TEST mount_nfs $H0:/$V0 $N0 nolock</div><div class='add'>+TEST mkdir $N0/testdir</div><div class='add'>+</div><div class='add'>+TEST $CLI snapshot create snap1 $V0 no-timestamp</div><div class='add'>+TEST $CLI snapshot create snap2 $V0 no-timestamp</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "0" STAT $N0/testdir/.snaps</div><div class='add'>+</div><div class='add'>+TEST cd $N0/testdir</div><div class='add'>+TEST cd .snaps</div><div class='add'>+TEST ls</div><div class='add'>+</div><div class='add'>+TEST $CLI snapshot deactivate snap2</div><div class='add'>+TEST ls</div><div class='add'>+</div><div class='add'>+TEST cd $CURDIR</div><div class='add'>+</div><div class='add'>+#Clean up</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" umount_nfs $N0</div><div class='add'>+TEST $CLI snapshot delete snap1</div><div class='add'>+TEST $CLI snapshot delete snap2</div><div class='add'>+TEST $CLI volume stop $V0 force</div><div class='add'>+TEST $CLI volume delete $V0</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='head'>diff --git a/tests/bugs/snapshot/bug-1167580-set-proper-uid-and-gid-during-nfs-access.t b/tests/bugs/snapshot/bug-1167580-set-proper-uid-and-gid-during-nfs-access.t<br/>new file mode 100644<br/>index 00000000000..52a7a790b97<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/snapshot/bug-1167580-set-proper-uid-and-gid-during-nfs-access.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/snapshot/bug-1167580-set-proper-uid-and-gid-during-nfs-access.t</a></div><div class='hunk'>@@ -0,0 +1,205 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../nfs.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+. $(dirname $0)/../../snapshot.rc</div><div class='add'>+</div><div class='add'>+#G_TESTDEF_TEST_STATUS_CENTOS6=NFS_TEST</div><div class='add'>+</div><div class='add'>+# This function returns a value "Y" if user can execute</div><div class='add'>+# the given command. Else it will return "N"</div><div class='add'>+# @arg-1 : Name of the user</div><div class='add'>+# @arg-2 : Path of the file</div><div class='add'>+# @arg-3 : command to be executed</div><div class='add'>+function check_if_permitted () {</div><div class='add'>+        local usr=$1</div><div class='add'>+        local path=$2</div><div class='add'>+        local cmd=$3</div><div class='add'>+        local var</div><div class='add'>+        local ret</div><div class='add'>+        var=$(su - $usr -c "$cmd $path")</div><div class='add'>+        ret=$?</div><div class='add'>+</div><div class='add'>+        if [ "$cmd" == "cat" ]</div><div class='add'>+        then</div><div class='add'>+                if [ "$var" == "Test" ]</div><div class='add'>+                then</div><div class='add'>+                        echo "Y"</div><div class='add'>+                else</div><div class='add'>+                        echo "N"</div><div class='add'>+                fi</div><div class='add'>+        else</div><div class='add'>+                if [ "$ret" == "0" ]</div><div class='add'>+                then</div><div class='add'>+                        echo "Y"</div><div class='add'>+                else</div><div class='add'>+                        echo "N"</div><div class='add'>+                fi</div><div class='add'>+        fi</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+# Create a directory in /tmp to specify which directory to make</div><div class='add'>+# as home directory for user</div><div class='add'>+home_dir=$(mktemp -d)</div><div class='add'>+chmod 777 $home_dir</div><div class='add'>+</div><div class='add'>+function get_new_user() {</div><div class='add'>+        local temp=$(uuidgen | tr -dc 'a-zA-Z' | head -c 8)</div><div class='add'>+        id $temp</div><div class='add'>+        if [ "$?" == "0" ]</div><div class='add'>+        then</div><div class='add'>+                get_new_user</div><div class='add'>+        else</div><div class='add'>+                echo $temp</div><div class='add'>+        fi</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function create_user() {</div><div class='add'>+        local user=$1</div><div class='add'>+        local group=$2</div><div class='add'>+</div><div class='add'>+        if [ "$group" == "" ]</div><div class='add'>+        then</div><div class='add'>+                /usr/sbin/useradd -d $home_dir/$user $user</div><div class='add'>+        else</div><div class='add'>+                /usr/sbin/useradd -d $home_dir/$user -G $group $user</div><div class='add'>+        fi</div><div class='add'>+</div><div class='add'>+        return $?</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST setup_lvm 1</div><div class='add'>+TEST glusterd</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 $H0:$L1</div><div class='add'>+TEST $CLI volume set $V0 nfs.disable false</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+# Mount the volume as both fuse and nfs mount</div><div class='add'>+EXPECT_WITHIN $NFS_EXPORT_TIMEOUT "1" is_nfs_export_available</div><div class='add'>+TEST glusterfs -s $H0 --volfile-id $V0 $M0</div><div class='add'>+TEST mount_nfs $H0:/$V0 $N0 nolock</div><div class='add'>+</div><div class='add'>+# Create 2 user</div><div class='add'>+user1=$(get_new_user)</div><div class='add'>+create_user $user1</div><div class='add'>+user2=$(get_new_user)</div><div class='add'>+create_user $user2</div><div class='add'>+</div><div class='add'>+# create a file for which only user1 has access</div><div class='add'>+echo "Test" &gt; $M0/README</div><div class='add'>+chown $user1 $M0/README</div><div class='add'>+chmod 700 $M0/README</div><div class='add'>+</div><div class='add'>+# enable uss and take a snapshot</div><div class='add'>+TEST $CLI volume set $V0 uss enable</div><div class='add'>+TEST $CLI snapshot config activate-on-create on</div><div class='add'>+TEST $CLI snapshot create snap1 $V0 no-timestamp</div><div class='add'>+</div><div class='add'>+# try to access the file using user1 account.</div><div class='add'>+# It should succeed with both normal mount and snapshot world.</div><div class='add'>+# There is time delay in which snapd might not have got the notification</div><div class='add'>+# from glusterd about snapshot create hence using "EXPECT_WITHIN"</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "Y" check_if_permitted $user1 $M0/README cat</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "Y" check_if_permitted $user1 $N0/README cat</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "Y" check_if_permitted $user1 $M0/.snaps/snap1/README cat</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "Y" check_if_permitted $user1 $N0/.snaps/snap1/README cat</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+# try to access the file using user2 account</div><div class='add'>+# It should fail from both normal mount and snapshot world</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "N" check_if_permitted $user2 $M0/README cat</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "N" check_if_permitted $user2 $N0/README cat</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "N" check_if_permitted $user2 $M0/.snaps/snap1/README cat</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "N" check_if_permitted $user2 $N0/.snaps/snap1/README cat</div><div class='add'>+</div><div class='add'>+# We need to test another scenario where user belonging to one group</div><div class='add'>+# tries to access files from user belonging to another group</div><div class='add'>+# instead of using the already created users and making the test case look complex</div><div class='add'>+# I thought of using two different users.</div><div class='add'>+</div><div class='add'>+# The test case written below does the following things</div><div class='add'>+# 1) Create 2 users (user{3,4}), belonging to 2 different groups (group{3,4})</div><div class='add'>+# 2) Take a snapshot "snap2"</div><div class='add'>+# 3) Create a file for which only users belonging to group3 have</div><div class='add'>+# permission to read</div><div class='add'>+# 4) Test various combinations of Read-Write, Fuse-NFS mount, User{3,4,5}</div><div class='add'>+#    from both normal mount, and USS world.</div><div class='add'>+</div><div class='add'>+echo "Test" &gt; $M0/file3</div><div class='add'>+</div><div class='add'>+chmod 740 $M0/file3</div><div class='add'>+</div><div class='add'>+group3=$(get_new_user)</div><div class='add'>+groupadd $group3</div><div class='add'>+</div><div class='add'>+group4=$(get_new_user)</div><div class='add'>+groupadd $group4</div><div class='add'>+</div><div class='add'>+user3=$(get_new_user)</div><div class='add'>+create_user $user3 $group3</div><div class='add'>+</div><div class='add'>+user4=$(get_new_user)</div><div class='add'>+create_user $user4 $group4</div><div class='add'>+</div><div class='add'>+user5=$(get_new_user)</div><div class='add'>+create_user $user5</div><div class='add'>+</div><div class='add'>+chgrp $group3 $M0/file3</div><div class='add'>+</div><div class='add'>+TEST $CLI snapshot create snap2 $V0 no-timestamp</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "Y" check_if_permitted $user3 $M0/file3 cat</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "Y" check_if_permitted $user3 $M0/.snaps/snap2/file3 cat</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "N" check_if_permitted $user3 $M0/file3 "echo Hello &gt;"</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "N" check_if_permitted $user3 $M0/.snaps/snap2/file3 "echo Hello &gt;"</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "Y" check_if_permitted $user3 $N0/file3 cat</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "Y" check_if_permitted $user3 $N0/.snaps/snap2/file3 cat</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "N" check_if_permitted $user3 $N0/file3 "echo Hello &gt;"</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "N" check_if_permitted $user3 $N0/.snaps/snap2/file3 "echo Hello &gt;"</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "N" check_if_permitted $user4 $M0/file3 cat</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "N" check_if_permitted $user4 $M0/.snaps/snap2/file3 cat</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "N" check_if_permitted $user4 $M0/file3 "echo Hello &gt;"</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "N" check_if_permitted $user4 $M0/.snaps/snap2/file3 "echo Hello &gt;"</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "N" check_if_permitted $user4 $N0/file3 cat</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "N" check_if_permitted $user4 $N0/.snaps/snap2/file3 cat</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "N" check_if_permitted $user4 $N0/file3 "echo Hello &gt;"</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "N" check_if_permitted $user4 $N0/.snaps/snap2/file3 "echo Hello &gt;"</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "N" check_if_permitted $user5 $M0/file3 cat</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "N" check_if_permitted $user5 $M0/.snaps/snap2/file3 cat</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "N" check_if_permitted $user5 $M0/file3 "echo Hello &gt;"</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "N" check_if_permitted $user5 $M0/.snaps/snap2/file3 "echo Hello &gt;"</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "N" check_if_permitted $user5 $N0/file3 cat</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "N" check_if_permitted $user5 $N0/.snaps/snap2/file3 cat</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "N" check_if_permitted $user5 $N0/file3 "echo Hello &gt;"</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "N" check_if_permitted $user5 $N0/.snaps/snap2/file3 "echo Hello &gt;"</div><div class='add'>+</div><div class='add'>+# cleanup</div><div class='add'>+/usr/sbin/userdel -f -r $user1</div><div class='add'>+/usr/sbin/userdel -f -r $user2</div><div class='add'>+/usr/sbin/userdel -f -r $user3</div><div class='add'>+/usr/sbin/userdel -f -r $user4</div><div class='add'>+/usr/sbin/userdel -f -r $user5</div><div class='add'>+</div><div class='add'>+#cleanup all the home directory which is created as part of this test case</div><div class='add'>+if [ -d "$home_dir" ]</div><div class='add'>+then</div><div class='add'>+        rm -rf $home_dir</div><div class='add'>+fi</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+groupdel $group3</div><div class='add'>+groupdel $group4</div><div class='add'>+</div><div class='add'>+TEST $CLI snapshot delete all</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+#G_TESTDEF_TEST_STATUS_NETBSD7=BAD_TEST,BUG=000000</div><div class='add'>+#G_TESTDEF_TEST_STATUS_CENTOS6=BAD_TEST,BUG=000000</div><div class='head'>diff --git a/tests/bugs/snapshot/bug-1168875.t b/tests/bugs/snapshot/bug-1168875.t<br/>new file mode 100644<br/>index 00000000000..9737784fd84<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/snapshot/bug-1168875.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/snapshot/bug-1168875.t</a></div><div class='hunk'>@@ -0,0 +1,96 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+. $(dirname $0)/../../snapshot.rc</div><div class='add'>+. $(dirname $0)/../../fileio.rc</div><div class='add'>+. $(dirname $0)/../../nfs.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+function check_entry_point_exists ()</div><div class='add'>+{</div><div class='add'>+        local entry_point=$1;</div><div class='add'>+        local _path=$2;</div><div class='add'>+</div><div class='add'>+        ls -a $_path | grep $entry_point;</div><div class='add'>+</div><div class='add'>+        if [ $? -eq 0 ]; then</div><div class='add'>+            echo 'Y';</div><div class='add'>+        else</div><div class='add'>+            echo 'N';</div><div class='add'>+        fi</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+TEST init_n_bricks 3;</div><div class='add'>+TEST setup_lvm 3;</div><div class='add'>+</div><div class='add'>+TEST glusterd;</div><div class='add'>+</div><div class='add'>+TEST pidof glusterd;</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 $H0:$L1 $H0:$L2 $H0:$L3;</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+</div><div class='add'>+TEST glusterfs --volfile-server=$H0 --volfile-id=$V0 --xlator-option *-snapview-client.snapdir-entry-path=/dir $M0;</div><div class='add'>+</div><div class='add'>+TEST glusterfs --volfile-server=$H0 --volfile-id=$V0 $N0;</div><div class='add'>+for i in {1..10} ; do echo "file" &gt; $M0/file$i ; done</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+for i in {11..20} ; do echo "file" &gt; $M0/file$i ; done</div><div class='add'>+</div><div class='add'>+mkdir $M0/dir;</div><div class='add'>+</div><div class='add'>+for i in {1..10} ; do echo "file" &gt; $M0/dir/file$i ; done</div><div class='add'>+</div><div class='add'>+mkdir $M0/dir1;</div><div class='add'>+mkdir $M0/dir2;</div><div class='add'>+</div><div class='add'>+for i in {1..10} ; do echo "foo" &gt; $M0/dir1/foo$i ; done</div><div class='add'>+for i in {1..10} ; do echo "foo" &gt; $M0/dir2/foo$i ; done</div><div class='add'>+</div><div class='add'>+for i in {11..20} ; do echo "foo" &gt; $M0/dir1/foo$i ; done</div><div class='add'>+for i in {11..20} ; do echo "foo" &gt; $M0/dir2/foo$i ; done</div><div class='add'>+</div><div class='add'>+TEST $CLI snapshot create snap1 $V0 no-timestamp;</div><div class='add'>+TEST $CLI snapshot activate snap1;</div><div class='add'>+</div><div class='add'>+TEST $CLI volume set $V0 features.uss enable;</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT 'Y' check_if_snapd_exist</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT 'N' check_entry_point_exists .snaps $M0/dir</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT 'N' check_entry_point_exists .snaps $N0/dir</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT 'N' check_entry_point_exists .snaps $M0/dir1</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT 'N' check_entry_point_exists .snaps $N0/dir1</div><div class='add'>+</div><div class='add'>+TEST $CLI volume set $V0 features.show-snapshot-directory enable;</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "0" STAT $M0/dir</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "0" STAT $N0/dir</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "0" STAT $M0/dir1</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "0" STAT $N0/dir1</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT 'Y' check_entry_point_exists ".snaps" $M0/dir</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT 'N' check_entry_point_exists ".snaps" $N0/dir</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT 'N' check_entry_point_exists ".snaps" $M0/dir1</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT 'N' check_entry_point_exists ".snaps" $N0/dir1</div><div class='add'>+</div><div class='add'>+TEST $CLI volume set $V0 features.show-snapshot-directory disable;</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "0" STAT $M0/dir</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "0" STAT $N0/dir</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "0" STAT $M0/dir1</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "0" STAT $N0/dir1</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT 'N' check_entry_point_exists ".snaps" $M0/dir</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT 'N' check_entry_point_exists ".snaps" $N0/dir</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT 'N' check_entry_point_exists ".snaps" $M0/dir1</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT 'N' check_entry_point_exists ".snaps" $N0/dir1</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/snapshot/bug-1178079.t b/tests/bugs/snapshot/bug-1178079.t<br/>new file mode 100644<br/>index 00000000000..a1a6b0b9d49<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/snapshot/bug-1178079.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/snapshot/bug-1178079.t</a></div><div class='hunk'>@@ -0,0 +1,24 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+#Create a volume</div><div class='add'>+TEST glusterd;</div><div class='add'>+TEST pidof glusterd;</div><div class='add'>+TEST $CLI volume info;</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 replica 2 $H0:$B0/${V0}{1..2};</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+</div><div class='add'>+TEST $CLI volume set $V0 features.uss on;</div><div class='add'>+</div><div class='add'>+TEST glusterfs -s $H0 --volfile-id $V0 $M0;</div><div class='add'>+</div><div class='add'>+TEST touch $M0/file;</div><div class='add'>+</div><div class='add'>+TEST getfattr -d -m . -e hex $M0/file;</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/snapshot/bug-1202436-calculate-quota-cksum-during-snap-restore.t b/tests/bugs/snapshot/bug-1202436-calculate-quota-cksum-during-snap-restore.t<br/>new file mode 100644<br/>index 00000000000..addc05917d8<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/snapshot/bug-1202436-calculate-quota-cksum-during-snap-restore.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/snapshot/bug-1202436-calculate-quota-cksum-during-snap-restore.t</a></div><div class='hunk'>@@ -0,0 +1,37 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../cluster.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+. $(dirname $0)/../../snapshot.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST verify_lvm_version</div><div class='add'>+TEST launch_cluster 2</div><div class='add'>+TEST setup_lvm 1</div><div class='add'>+</div><div class='add'>+TEST $CLI_1 volume create $V0 $H1:$L1</div><div class='add'>+EXPECT 'Created' volinfo_field $V0 'Status'</div><div class='add'>+</div><div class='add'>+TEST $CLI_1 volume start $V0</div><div class='add'>+EXPECT 'Started' volinfo_field $V0 'Status'</div><div class='add'>+</div><div class='add'>+# Quota is not working with cluster test framework</div><div class='add'>+# Need to check why, Until then commenting out this</div><div class='add'>+#TEST $CLI_1 volume quota $V0 enable</div><div class='add'>+#EXPECT 'on' volinfo_field $V0 'features.quota'</div><div class='add'>+</div><div class='add'>+TEST $CLI_1 snapshot create ${V0}_snap $V0</div><div class='add'>+EXPECT '1' get_snap_count CLI_1 $V0</div><div class='add'>+</div><div class='add'>+TEST $CLI_1 volume stop $V0</div><div class='add'>+EXPECT 'Stopped' volinfo_field $V0 'Status'</div><div class='add'>+</div><div class='add'>+TEST $CLI_1 snapshot restore $($CLI_1 snapshot list)</div><div class='add'>+EXPECT '0' get_snap_count CLI_1 $V0</div><div class='add'>+</div><div class='add'>+TEST $CLI_1 peer probe $H2</div><div class='add'>+EXPECT_WITHIN $PROBE_TIMEOUT 1 peer_count</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/snapshot/bug-1205592.t b/tests/bugs/snapshot/bug-1205592.t<br/>new file mode 100644<br/>index 00000000000..f7d99345c8d<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/snapshot/bug-1205592.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/snapshot/bug-1205592.t</a></div><div class='hunk'>@@ -0,0 +1,30 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../cluster.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+. $(dirname $0)/../../snapshot.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+TEST verify_lvm_version</div><div class='add'>+TEST launch_cluster 3</div><div class='add'>+TEST setup_lvm 3</div><div class='add'>+</div><div class='add'>+TEST $CLI_1 peer probe $H2</div><div class='add'>+EXPECT_WITHIN $PROBE_TIMEOUT 1 peer_count</div><div class='add'>+</div><div class='add'>+TEST $CLI_1 peer probe $H3</div><div class='add'>+EXPECT_WITHIN $PROBE_TIMEOUT 2 peer_count</div><div class='add'>+</div><div class='add'>+TEST $CLI_1 volume create $V0 $H1:$L1 $H2:$L2 $H3:$L3</div><div class='add'>+EXPECT 'Created' volinfo_field $V0 'Status'</div><div class='add'>+</div><div class='add'>+TEST $CLI_1 volume start $V0</div><div class='add'>+EXPECT 'Started' volinfo_field $V0 'Status'</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+kill_glusterd 3</div><div class='add'>+# If glusterd-quorum is not met then snapshot-create should fail</div><div class='add'>+TEST ! $CLI_1 snapshot create ${V0}_snap1 ${V0} no-timestamp</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/snapshot/bug-1227646.t b/tests/bugs/snapshot/bug-1227646.t<br/>new file mode 100644<br/>index 00000000000..9b73dfdb32f<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/snapshot/bug-1227646.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/snapshot/bug-1227646.t</a></div><div class='hunk'>@@ -0,0 +1,31 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+. $(dirname $0)/../../snapshot.rc</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST init_n_bricks 3;</div><div class='add'>+TEST setup_lvm 3;</div><div class='add'>+</div><div class='add'>+TEST glusterd;</div><div class='add'>+TEST pidof glusterd;</div><div class='add'>+</div><div class='add'>+#TEST $CLI volume create $V0 $H0:$L1 $H0:$L2 $H0:$L3;</div><div class='add'>+TEST $CLI volume create $V0 $H0:$L2 $H0:$L3;</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+</div><div class='add'>+TEST $CLI snapshot create snap1 $V0 no-timestamp;</div><div class='add'>+TEST $CLI volume stop $V0</div><div class='add'>+TEST $CLI snapshot restore snap1;</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+TEST pkill gluster</div><div class='add'>+TEST glusterd</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT 'Started' volinfo_field $V0 'Status'</div><div class='add'>+</div><div class='add'>+TEST $CLI volume stop $V0</div><div class='add'>+</div><div class='add'>+cleanup  ;</div><div class='add'>+</div><div class='head'>diff --git a/tests/bugs/snapshot/bug-1232430.t b/tests/bugs/snapshot/bug-1232430.t<br/>new file mode 100755<br/>index 00000000000..50411b1dbfc<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/snapshot/bug-1232430.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/snapshot/bug-1232430.t</a></div><div class='hunk'>@@ -0,0 +1,22 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../snapshot.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+TEST verify_lvm_version;</div><div class='add'>+TEST glusterd -LDEBUG;</div><div class='add'>+TEST pidof glusterd;</div><div class='add'>+</div><div class='add'>+TEST setup_lvm 1</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 $H0:$L1/brick_dir</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+TEST $CLI snapshot create snap1 $V0 no-timestamp</div><div class='add'>+</div><div class='add'>+TEST $CLI snapshot delete snap1</div><div class='add'>+</div><div class='add'>+TEST $CLI volume stop $V0 force</div><div class='add'>+TEST $CLI volume delete $V0</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/bugs/snapshot/bug-1250387.t b/tests/bugs/snapshot/bug-1250387.t<br/>new file mode 100755<br/>index 00000000000..c9039e37f73<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/snapshot/bug-1250387.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/snapshot/bug-1250387.t</a></div><div class='hunk'>@@ -0,0 +1,26 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+. $(dirname $0)/../../snapshot.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST init_n_bricks 1;</div><div class='add'>+TEST setup_lvm 1;</div><div class='add'>+</div><div class='add'>+TEST glusterd;</div><div class='add'>+</div><div class='add'>+TEST pidof glusterd;</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 $H0:$L1;</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+</div><div class='add'>+TEST glusterfs --volfile-server=$H0 --volfile-id=$V0 $M0;</div><div class='add'>+</div><div class='add'>+TEST $CLI snapshot create snap1 $V0 no-timestamp;</div><div class='add'>+</div><div class='add'>+EXPECT "description" get-cmd-field-xml "snapshot info snap1" "description"</div><div class='add'>+</div><div class='add'>+cleanup  ;</div><div class='head'>diff --git a/tests/bugs/snapshot/bug-1260848.t b/tests/bugs/snapshot/bug-1260848.t<br/>new file mode 100644<br/>index 00000000000..6455d8297b2<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/snapshot/bug-1260848.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/snapshot/bug-1260848.t</a></div><div class='hunk'>@@ -0,0 +1,28 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../nfs.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+#G_TESTDEF_TEST_STATUS_CENTOS6=NFS_TEST</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+## Start and create a volume</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 disperse 6 redundancy 2 $H0:$B0/${V0}{0..5}</div><div class='add'>+TEST $CLI volume set $V0 nfs.disable false</div><div class='add'>+TEST $CLI volume set $V0 uss on</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+## Wait for volume to register with rpc.mountd</div><div class='add'>+EXPECT_WITHIN $NFS_EXPORT_TIMEOUT "1" is_nfs_export_available;</div><div class='add'>+</div><div class='add'>+## Mount NFS</div><div class='add'>+TEST mount_nfs $H0:/$V0 $N0 nolock;</div><div class='add'>+</div><div class='add'>+TEST df -h $N0</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/snapshot/bug-1275616.t b/tests/bugs/snapshot/bug-1275616.t<br/>new file mode 100755<br/>index 00000000000..dcaeae30f90<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/snapshot/bug-1275616.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/snapshot/bug-1275616.t</a></div><div class='hunk'>@@ -0,0 +1,50 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../snapshot.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+TEST verify_lvm_version;</div><div class='add'>+TEST glusterd;</div><div class='add'>+TEST pidof glusterd;</div><div class='add'>+</div><div class='add'>+TEST setup_lvm 1</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 $H0:$L1</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+TEST $CLI snapshot config activate-on-create enable</div><div class='add'>+</div><div class='add'>+TEST $CLI snapshot config $V0 snap-max-hard-limit 100</div><div class='add'>+TEST $CLI snapshot create snap1 $V0 no-timestamp</div><div class='add'>+</div><div class='add'>+TEST $CLI snapshot config $V0 snap-max-hard-limit 150</div><div class='add'>+TEST $CLI snapshot create snap2 $V0 no-timestamp</div><div class='add'>+</div><div class='add'>+TEST $CLI snapshot config $V0 snap-max-hard-limit 200</div><div class='add'>+TEST $CLI snapshot create snap3 $V0 no-timestamp</div><div class='add'>+EXPECT '197' snap_info_volume CLI "Snaps Available" $V0;</div><div class='add'>+</div><div class='add'>+TEST $CLI volume stop $V0</div><div class='add'>+</div><div class='add'>+# Restore the snapshots and verify the snap-max-hard-limit</div><div class='add'>+# and the Snaps Available</div><div class='add'>+TEST $CLI snapshot restore snap1</div><div class='add'>+EXPECT '98' snap_info_volume CLI "Snaps Available" $V0;</div><div class='add'>+EXPECT '100' snap_config_volume CLI 'snap-max-hard-limit' $V0</div><div class='add'>+</div><div class='add'>+TEST $CLI snapshot restore snap2</div><div class='add'>+EXPECT '149' snap_info_volume CLI "Snaps Available" $V0;</div><div class='add'>+EXPECT '150' snap_config_volume CLI 'snap-max-hard-limit' $V0</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "Yes" get_snap_brick_status snap3</div><div class='add'>+</div><div class='add'>+#Take a clone and verify it inherits snapshot's snap-max-hard-limit</div><div class='add'>+TEST $CLI snapshot clone clone1 snap3</div><div class='add'>+</div><div class='add'>+EXPECT '149' snap_info_volume CLI "Snaps Available" $V0;</div><div class='add'>+EXPECT '150' snap_config_volume CLI 'snap-max-hard-limit' $V0</div><div class='add'>+</div><div class='add'>+EXPECT '200' snap_info_volume CLI "Snaps Available" clone1</div><div class='add'>+EXPECT '200' snap_config_volume CLI 'snap-max-hard-limit' clone1</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/snapshot/bug-1279327.t b/tests/bugs/snapshot/bug-1279327.t<br/>new file mode 100644<br/>index 00000000000..4e4be6eeea6<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/snapshot/bug-1279327.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/snapshot/bug-1279327.t</a></div><div class='hunk'>@@ -0,0 +1,29 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../snapshot.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+TEST verify_lvm_version;</div><div class='add'>+TEST glusterd;</div><div class='add'>+TEST pidof glusterd;</div><div class='add'>+</div><div class='add'>+TEST init_n_bricks 3</div><div class='add'>+TEST setup_lvm 3</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 $H0:$L1</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+TEST $CLI volume quota $V0 enable</div><div class='add'>+</div><div class='add'>+TEST $CLI snapshot create snap1 $V0 no-timestamp</div><div class='add'>+TEST $CLI snapshot activate snap1</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "Yes" get_snap_brick_status snap1</div><div class='add'>+</div><div class='add'>+#Take a clone and verify it inherits snapshot's snap-max-hard-limit</div><div class='add'>+TEST $CLI snapshot clone clone1 snap1</div><div class='add'>+TEST $CLI volume start clone1</div><div class='add'>+EXPECT 'Started' volinfo_field clone1 'Status';</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/snapshot/bug-1316437.t b/tests/bugs/snapshot/bug-1316437.t<br/>new file mode 100644<br/>index 00000000000..300c03c97f5<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/snapshot/bug-1316437.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/snapshot/bug-1316437.t</a></div><div class='hunk'>@@ -0,0 +1,29 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+. $(dirname $0)/../../snapshot.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+</div><div class='add'>+# Intentionally not carving lvms for this as we will not be taking</div><div class='add'>+# snapshots in this testcase</div><div class='add'>+TEST $CLI volume create $V0 replica 3 $H0:$B0/${V0}{1,2,3,4,5,6};</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+</div><div class='add'>+TEST $CLI volume set $V0 features.uss enable;</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT 'Y' check_if_snapd_exist</div><div class='add'>+</div><div class='add'>+killall glusterd glusterfsd glusterfs</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $PROCESS_DOWN_TIMEOUT 'N' check_if_snapd_exist</div><div class='add'>+</div><div class='add'>+glusterd</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT 'Y' check_if_snapd_exist</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/snapshot/bug-1322772-real-path-fix-for-snapshot.t b/tests/bugs/snapshot/bug-1322772-real-path-fix-for-snapshot.t<br/>new file mode 100644<br/>index 00000000000..488bd462a01<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/snapshot/bug-1322772-real-path-fix-for-snapshot.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/snapshot/bug-1322772-real-path-fix-for-snapshot.t</a></div><div class='hunk'>@@ -0,0 +1,56 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+. $(dirname $0)/../../snapshot.rc</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TESTS_EXPECTED_IN_LOOP=2</div><div class='add'>+</div><div class='add'>+TEST verify_lvm_version</div><div class='add'>+TEST init_n_bricks 2</div><div class='add'>+TEST setup_lvm 2</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 $H0:$L1</div><div class='add'>+EXPECT 'Created' volinfo_field $V0 'Status'</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V1 $H0:$L2</div><div class='add'>+EXPECT 'Created' volinfo_field $V1 'Status'</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+EXPECT 'Started' volinfo_field $V0 'Status'</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V1</div><div class='add'>+EXPECT 'Started' volinfo_field $V1 'Status'</div><div class='add'>+</div><div class='add'>+TEST $CLI snapshot config activate-on-create enable</div><div class='add'>+TEST $CLI snapshot create ${V0}_snap $V0 no-timestamp</div><div class='add'>+TEST $CLI snapshot create ${V1}_snap $V1 no-timestamp</div><div class='add'>+</div><div class='add'>+# Simulate a node reboot by unmounting the brick, snap_brick and followed by</div><div class='add'>+# deleting the brick. Now once glusterd restarts, it should be able to construct</div><div class='add'>+# and remount the snap brick</div><div class='add'>+snap_bricks=`gluster snap status | grep "Brick Path" | awk -F ":"  '{print $3}'`</div><div class='add'>+</div><div class='add'>+TEST $CLI volume stop $V1</div><div class='add'>+TEST $CLI snapshot restore ${V1}_snap;</div><div class='add'>+</div><div class='add'>+pkill gluster</div><div class='add'>+for snap_brick in $snap_bricks</div><div class='add'>+do</div><div class='add'>+    echo "Unmounting snap brick" $snap_brick</div><div class='add'>+    EXPECT_WITHIN_TEST_IN_LOOP $UMOUNT_TIMEOUT "Y" force_umount $snap_brick</div><div class='add'>+done</div><div class='add'>+</div><div class='add'>+rm -rf $snap_brick</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" brick_up_status $V0 $H0 $L1</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='add'>+</div><div class='head'>diff --git a/tests/bugs/snapshot/bug-1399598-uss-with-ssl.t b/tests/bugs/snapshot/bug-1399598-uss-with-ssl.t<br/>new file mode 100755<br/>index 00000000000..f4e4e6ec4d2<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/snapshot/bug-1399598-uss-with-ssl.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/snapshot/bug-1399598-uss-with-ssl.t</a></div><div class='hunk'>@@ -0,0 +1,108 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+. $(dirname $0)/../../traps.rc</div><div class='add'>+. $(dirname $0)/../../snapshot.rc</div><div class='add'>+. $(dirname $0)/../../ssl.rc</div><div class='add'>+</div><div class='add'>+function file_exists</div><div class='add'>+{</div><div class='add'>+        if [ -f $1 ]; then echo "Y"; else echo "N"; fi</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function volume_online_brick_count</div><div class='add'>+{</div><div class='add'>+        $CLI volume status $V0 | awk '$1 == "Brick" &amp;&amp;  $6 != "N/A" { print $6}' | wc -l;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function total_online_bricks</div><div class='add'>+{</div><div class='add'>+        # This will count snapd, which isn't really a brick, but callers can</div><div class='add'>+        # account for that so it's OK.</div><div class='add'>+        find $GLUSTERD_PIDFILEDIR -name '*.pid' | wc -l</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+# Initialize the test setup</div><div class='add'>+TEST setup_lvm 1;</div><div class='add'>+</div><div class='add'>+TEST create_self_signed_certs</div><div class='add'>+</div><div class='add'>+# Start glusterd</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd;</div><div class='add'>+#EST $CLI volume set all cluster.brick-multiplex on</div><div class='add'>+</div><div class='add'>+# Create and start the volume</div><div class='add'>+TEST $CLI volume create $V0 $H0:$L1/b1;</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" volume_online_brick_count</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" total_online_bricks</div><div class='add'>+</div><div class='add'>+# Mount the volume and create some files</div><div class='add'>+TEST $GFS --volfile-server=$H0 --volfile-id=$V0 $M0;</div><div class='add'>+</div><div class='add'>+TEST touch $M0/file;</div><div class='add'>+</div><div class='add'>+# Enable activate-on-create</div><div class='add'>+TEST $CLI snapshot config activate-on-create enable;</div><div class='add'>+</div><div class='add'>+# Create a snapshot</div><div class='add'>+TEST $CLI snapshot create snap1 $V0 no-timestamp;</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "2" total_online_bricks</div><div class='add'>+</div><div class='add'>+TEST $CLI volume set $V0 features.uss enable;</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "3" total_online_bricks</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT 'Y' check_if_snapd_exist</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "Y" file_exists $M0/file</div><div class='add'>+# Volume set can trigger graph switch therefore chances are we send this</div><div class='add'>+# req to old graph. Old graph will not have .snaps. Therefore we should</div><div class='add'>+# wait for some time.</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "Y" file_exists $M0/.snaps/snap1/file</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+</div><div class='add'>+# Enable management encryption</div><div class='add'>+touch  $GLUSTERD_WORKDIR/secure-access</div><div class='add'>+killall_gluster</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd;</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" volume_online_brick_count</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "3" total_online_bricks</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT 'Y' check_if_snapd_exist</div><div class='add'>+</div><div class='add'>+# Mount the volume</div><div class='add'>+TEST $GFS --volfile-server=$H0 --volfile-id=$V0 $M0;</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "Y" file_exists $M0/file</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "Y" file_exists $M0/.snaps/snap1/file</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+</div><div class='add'>+# Enable I/O encryption</div><div class='add'>+TEST $CLI volume set $V0 client.ssl on</div><div class='add'>+TEST $CLI volume set $V0 server.ssl on</div><div class='add'>+</div><div class='add'>+killall_gluster</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" volume_online_brick_count</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "3" total_online_bricks</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT 'Y' check_if_snapd_exist</div><div class='add'>+</div><div class='add'>+# Mount the volume</div><div class='add'>+TEST $GFS --volfile-server=$H0 --volfile-id=$V0 $M0;</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "Y" file_exists $M0/file</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "Y" file_exists $M0/.snaps/snap1/file</div><div class='add'>+</div><div class='add'>+TEST $CLI snapshot delete all</div><div class='add'>+TEST $CLI volume stop $V0</div><div class='add'>+TEST $CLI volume delete $V0</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/snapshot/bug-1482023-snpashot-issue-with-other-processes-accessing-mounted-path.t b/tests/bugs/snapshot/bug-1482023-snpashot-issue-with-other-processes-accessing-mounted-path.t<br/>new file mode 100644<br/>index 00000000000..04a85db0c1a<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/snapshot/bug-1482023-snpashot-issue-with-other-processes-accessing-mounted-path.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/snapshot/bug-1482023-snpashot-issue-with-other-processes-accessing-mounted-path.t</a></div><div class='hunk'>@@ -0,0 +1,133 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+. $(dirname $0)/../../snapshot.rc</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../cluster.rc</div><div class='add'>+</div><div class='add'>+function create_snapshots() {</div><div class='add'>+        $CLI_1 snapshot create ${V0}_snap ${V0} no-timestamp &amp;</div><div class='add'>+        PID_1=$!</div><div class='add'>+</div><div class='add'>+        $CLI_1 snapshot create ${V1}_snap ${V1} no-timestamp &amp;</div><div class='add'>+        PID_2=$!</div><div class='add'>+</div><div class='add'>+        wait $PID_1 $PID_2</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function activate_snapshots() {</div><div class='add'>+        $CLI_1 snapshot activate ${V0}_snap &amp;</div><div class='add'>+        PID_1=$!</div><div class='add'>+</div><div class='add'>+        $CLI_1 snapshot activate ${V1}_snap &amp;</div><div class='add'>+        PID_2=$!</div><div class='add'>+</div><div class='add'>+        wait $PID_1 $PID_2</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function deactivate_snapshots() {</div><div class='add'>+        $CLI_1 snapshot deactivate ${V0}_snap &amp;</div><div class='add'>+        PID_1=$!</div><div class='add'>+</div><div class='add'>+        $CLI_1 snapshot deactivate ${V1}_snap &amp;</div><div class='add'>+        PID_2=$!</div><div class='add'>+</div><div class='add'>+        wait $PID_1 $PID_2</div><div class='add'>+}</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST verify_lvm_version;</div><div class='add'>+# Create cluster with 3 nodes</div><div class='add'>+TEST launch_cluster 3;</div><div class='add'>+TEST setup_lvm 3</div><div class='add'>+</div><div class='add'>+TEST $CLI_1 peer probe $H2;</div><div class='add'>+TEST $CLI_1 peer probe $H3;</div><div class='add'>+EXPECT_WITHIN $PROBE_TIMEOUT 2 peer_count;</div><div class='add'>+</div><div class='add'>+# Create volumes</div><div class='add'>+TEST $CLI_1 volume create $V0 $H1:$L1</div><div class='add'>+TEST $CLI_2 volume create $V1 $H2:$L2 $H3:$L3</div><div class='add'>+</div><div class='add'>+# Start volumes</div><div class='add'>+TEST $CLI_1 volume start $V0</div><div class='add'>+TEST $CLI_2 volume start $V1</div><div class='add'>+</div><div class='add'>+TEST $CLI_1 snapshot config activate-on-create enable</div><div class='add'>+</div><div class='add'>+# Snapshot Operations</div><div class='add'>+create_snapshots</div><div class='add'>+</div><div class='add'>+EXPECT 'Started' snapshot_status ${V0}_snap;</div><div class='add'>+EXPECT 'Started' snapshot_status ${V1}_snap;</div><div class='add'>+</div><div class='add'>+deactivate_snapshots</div><div class='add'>+</div><div class='add'>+EXPECT 'Stopped' snapshot_status ${V0}_snap;</div><div class='add'>+EXPECT 'Stopped' snapshot_status ${V1}_snap;</div><div class='add'>+</div><div class='add'>+activate_snapshots</div><div class='add'>+</div><div class='add'>+EXPECT 'Started' snapshot_status ${V0}_snap;</div><div class='add'>+EXPECT 'Started' snapshot_status ${V1}_snap;</div><div class='add'>+</div><div class='add'>+# This Function will get snap id form snap info command and will</div><div class='add'>+# check for mount point in system against snap id.</div><div class='add'>+function mounted_snaps</div><div class='add'>+{</div><div class='add'>+        snap_id=`$CLI_1 snap info $1_snap | grep "Snap Volume Name" |</div><div class='add'>+                  awk -F ":" '{print $2}'`</div><div class='add'>+        echo `mount | grep $snap_id | wc -l`</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+EXPECT "1" mounted_snaps ${V0}</div><div class='add'>+EXPECT "2" mounted_snaps ${V1}</div><div class='add'>+</div><div class='add'>+deactivate_snapshots</div><div class='add'>+</div><div class='add'>+EXPECT "0" mounted_snaps ${V0}</div><div class='add'>+EXPECT "0" mounted_snaps ${V1}</div><div class='add'>+</div><div class='add'>+# This part of test is designed to validate that updates are properly being</div><div class='add'>+# handled during handshake.</div><div class='add'>+</div><div class='add'>+activate_snapshots</div><div class='add'>+</div><div class='add'>+EXPECT 'Started' snapshot_status ${V0}_snap;</div><div class='add'>+EXPECT 'Started' snapshot_status ${V1}_snap;</div><div class='add'>+</div><div class='add'>+kill_glusterd 2</div><div class='add'>+</div><div class='add'>+deactivate_snapshots</div><div class='add'>+EXPECT 'Stopped' snapshot_status ${V0}_snap;</div><div class='add'>+EXPECT 'Stopped' snapshot_status ${V1}_snap;</div><div class='add'>+</div><div class='add'>+TEST start_glusterd 2</div><div class='add'>+</div><div class='add'>+# Updates form friend should reflect as snap was deactivated while glusterd</div><div class='add'>+# process was inactive and mount point should also not exist.</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $PROBE_TIMEOUT 2 peer_count;</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "0" mounted_snaps ${V0}</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "0" mounted_snaps ${V1}</div><div class='add'>+</div><div class='add'>+# It might be possible that the import snap synctask is still updating the data,</div><div class='add'>+# we need to allow a buffer time to be on the safer side</div><div class='add'>+sleep 2</div><div class='add'>+</div><div class='add'>+kill_glusterd 2</div><div class='add'>+activate_snapshots</div><div class='add'>+EXPECT 'Started' snapshot_status ${V0}_snap;</div><div class='add'>+EXPECT 'Started' snapshot_status ${V1}_snap;</div><div class='add'>+TEST start_glusterd 2</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $PROBE_TIMEOUT 2 peer_count;</div><div class='add'>+</div><div class='add'>+# Updates form friend should reflect as snap was activated while glusterd</div><div class='add'>+# process was inactive and mount point should exist.</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" mounted_snaps ${V0}</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "2" mounted_snaps ${V1}</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+# run first!</div><div class='add'>+#G_TESTDEF_TEST_STATUS_CENTOS6=BRICK_MUX_BAD_TEST,BUG=1743069</div><div class='head'>diff --git a/tests/bugs/snapshot/bug-1512451-snapshot-creation-failed-after-brick-reset.t b/tests/bugs/snapshot/bug-1512451-snapshot-creation-failed-after-brick-reset.t<br/>new file mode 100644<br/>index 00000000000..53b274e8819<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/snapshot/bug-1512451-snapshot-creation-failed-after-brick-reset.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/snapshot/bug-1512451-snapshot-creation-failed-after-brick-reset.t</a></div><div class='hunk'>@@ -0,0 +1,39 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../cluster.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+. $(dirname $0)/../../snapshot.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+TEST verify_lvm_version</div><div class='add'>+TEST launch_cluster 2</div><div class='add'>+TEST setup_lvm 2</div><div class='add'>+</div><div class='add'>+TEST $CLI_1 peer probe $H2</div><div class='add'>+EXPECT_WITHIN $PROBE_TIMEOUT 1 peer_count</div><div class='add'>+</div><div class='add'>+TEST $CLI_1 volume create $V0 $H1:$L1/B1 $H2:$L2/B1</div><div class='add'>+EXPECT 'Created' volinfo_field $V0 'Status'</div><div class='add'>+</div><div class='add'>+TEST $CLI_1 volume start $V0</div><div class='add'>+EXPECT 'Started' volinfo_field $V0 'Status'</div><div class='add'>+</div><div class='add'>+TEST $CLI_1 snapshot create ${V0}_snap1 ${V0} no-timestamp</div><div class='add'>+TEST snapshot_exists 1 ${V0}_snap1</div><div class='add'>+</div><div class='add'>+TEST $CLI_1 snapshot delete ${V0}_snap1</div><div class='add'>+TEST ! snapshot_exists 1 ${V0}_snap1</div><div class='add'>+</div><div class='add'>+TEST $CLI_1 volume reset-brick $V0 $H1:$L1/B1 start</div><div class='add'>+TEST $CLI_1 volume reset-brick $V0 $H1:$L1/B1 $H1:$L1/B1 commit force</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" cluster_brick_up_status 1 $V0 $H1 $L1/B1</div><div class='add'>+</div><div class='add'>+TEST $CLI_1 snapshot create ${V0}_snap1 ${V0} no-timestamp</div><div class='add'>+TEST snapshot_exists 1 ${V0}_snap1</div><div class='add'>+</div><div class='add'>+TEST $CLI_1 snapshot delete ${V0}_snap1</div><div class='add'>+TEST ! snapshot_exists 1 ${V0}_snap1</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/snapshot/bug-1597662.t b/tests/bugs/snapshot/bug-1597662.t<br/>new file mode 100644<br/>index 00000000000..f582930476a<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/snapshot/bug-1597662.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/snapshot/bug-1597662.t</a></div><div class='hunk'>@@ -0,0 +1,58 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+. $(dirname $0)/../../snapshot.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST init_n_bricks 3;</div><div class='add'>+TEST setup_lvm 3;</div><div class='add'>+TEST glusterd;</div><div class='add'>+TEST pidof glusterd;</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 $H0:$L1 $H0:$L2 $H0:$L3;</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+</div><div class='add'>+snap_path=/var/run/gluster/snaps</div><div class='add'>+</div><div class='add'>+TEST $CLI snapshot create snap1 $V0 no-timestamp;</div><div class='add'>+</div><div class='add'>+$CLI snapshot activate snap1;</div><div class='add'>+</div><div class='add'>+EXPECT 'Started' snapshot_status snap1;</div><div class='add'>+</div><div class='add'>+# This Function will check for entry /var/run/gluster/snaps/&lt;snap-name&gt;</div><div class='add'>+# against snap-name</div><div class='add'>+</div><div class='add'>+function is_snap_path</div><div class='add'>+{</div><div class='add'>+        echo `ls $snap_path | grep snap1 | wc -l`</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+# snap is active so snap_path should exist</div><div class='add'>+EXPECT "1" is_snap_path</div><div class='add'>+</div><div class='add'>+$CLI snapshot deactivate snap1;</div><div class='add'>+EXPECT_WITHIN ${PROCESS_DOWN_TIMEOUT} 'Stopped' snapshot_status snap1</div><div class='add'>+# snap is deactivated so snap_path should not exist</div><div class='add'>+EXPECT "0" is_snap_path</div><div class='add'>+</div><div class='add'>+# activate snap again</div><div class='add'>+$CLI snapshot activate snap1;</div><div class='add'>+EXPECT_WITHIN ${PROCESS_UP_TIMEOUT} 'Started' snapshot_status snap1</div><div class='add'>+</div><div class='add'>+# snap is active so snap_path should exist</div><div class='add'>+EXPECT "1" is_snap_path</div><div class='add'>+</div><div class='add'>+# delete snap now</div><div class='add'>+TEST $CLI snapshot delete snap1;</div><div class='add'>+</div><div class='add'>+# snap is deleted so snap_path should not exist</div><div class='add'>+EXPECT "0" is_snap_path</div><div class='add'>+</div><div class='add'>+TEST $CLI volume stop $V0;</div><div class='add'>+TEST $CLI volume delete $V0;</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='head'>diff --git a/tests/bugs/snapshot/bug-1618004-fix-memory-corruption-in-snap-import.t b/tests/bugs/snapshot/bug-1618004-fix-memory-corruption-in-snap-import.t<br/>new file mode 100644<br/>index 00000000000..a2c004e435e<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/snapshot/bug-1618004-fix-memory-corruption-in-snap-import.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/snapshot/bug-1618004-fix-memory-corruption-in-snap-import.t</a></div><div class='hunk'>@@ -0,0 +1,48 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+. $(dirname $0)/../../snapshot.rc</div><div class='add'>+. $(dirname $0)/../../cluster.rc</div><div class='add'>+</div><div class='add'>+function get_volume_info ()</div><div class='add'>+{</div><div class='add'>+        local var=$1</div><div class='add'>+        $CLI_1 volume info $V0 | grep "^$var" | sed 's/.*: //'</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST verify_lvm_version</div><div class='add'>+TEST launch_cluster 2</div><div class='add'>+TEST setup_lvm 2</div><div class='add'>+</div><div class='add'>+TEST $CLI_1 peer probe $H2;</div><div class='add'>+EXPECT_WITHIN $PROBE_TIMEOUT 1 peer_count;</div><div class='add'>+</div><div class='add'>+TEST $CLI_1 volume create $V0 $H1:$L1 $H2:$L2</div><div class='add'>+EXPECT "$V0" get_volume_info 'Volume Name';</div><div class='add'>+EXPECT 'Created' get_volume_info 'Status';</div><div class='add'>+</div><div class='add'>+TEST $CLI_1 volume start $V0</div><div class='add'>+EXPECT 'Started' get_volume_info 'Status';</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+# Setting system limit</div><div class='add'>+TEST $CLI_1 snapshot config activate-on-create enable</div><div class='add'>+</div><div class='add'>+TEST $CLI_1 snapshot create snap1 $V0 no-timestamp description "test"</div><div class='add'>+TEST kill_glusterd 1</div><div class='add'>+#deactivate snapshot for changing snap version, so that handshake will</div><div class='add'>+#happen when glusterd is restarted</div><div class='add'>+TEST $CLI_2 snapshot deactivate snap1</div><div class='add'>+TEST start_glusterd 1</div><div class='add'>+</div><div class='add'>+#Wait till handshake complete</div><div class='add'>+EXPECT_WITHIN ${PROCESS_UP_TIMEOUT} 'Stopped' snapshot_status snap1</div><div class='add'>+</div><div class='add'>+#Delete the snapshot, without this fix, delete will lead to assertion failure</div><div class='add'>+$CLI_1 snapshot delete all</div><div class='add'>+EXPECT '0' get_snap_count CLI_1;</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='head'>diff --git a/tests/bugs/stripe/bug-1002207.t b/tests/bugs/stripe/bug-1002207.t<br/>new file mode 100644<br/>index 00000000000..c58a6e20ab8<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/stripe/bug-1002207.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/stripe/bug-1002207.t</a></div><div class='hunk'>@@ -0,0 +1,55 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+## Start and create a volume</div><div class='add'>+TEST glusterd;</div><div class='add'>+TEST pidof glusterd;</div><div class='add'>+TEST $CLI volume create $V0 stripe 2 $H0:$B0/${V0}{1,2,3,4,5,6,7,8};</div><div class='add'>+</div><div class='add'>+## Verify volume is is created</div><div class='add'>+EXPECT "$V0" volinfo_field $V0 'Volume Name';</div><div class='add'>+EXPECT 'Created' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+## Start volume and verify</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+EXPECT 'Started' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+TEST glusterfs --attribute-timeout=0 --entry-timeout=0 -s $H0 --volfile-id=$V0 $M0;</div><div class='add'>+TEST dd if=/dev/zero of=$M0/file$i.data bs=1024 count=1024;</div><div class='add'>+</div><div class='add'>+function xattr_query_check()</div><div class='add'>+{</div><div class='add'>+    local path=$1</div><div class='add'>+    local xa_name=$2</div><div class='add'>+</div><div class='add'>+    local ret=$(getfattr -n $xa_name $path 2&gt;&amp;1 | grep -o "$xa_name: No such attribute" | wc -l)</div><div class='add'>+    echo $ret</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function set_xattr()</div><div class='add'>+{</div><div class='add'>+    local path=$1</div><div class='add'>+    local xa_name=$2</div><div class='add'>+    local xa_val=$3</div><div class='add'>+</div><div class='add'>+    setfattr -n $xa_name -v $xa_val $path</div><div class='add'>+    echo $?</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+EXPECT 0 set_xattr $M0/file$i.data "trusted.name" "testofafairlylongxattrstringthatbutnotlongenoughtofailmemoryallocation"</div><div class='add'>+EXPECT 0 xattr_query_check $M0/file$i.data "trusted.name"</div><div class='add'>+</div><div class='add'>+## Finish up</div><div class='add'>+TEST $CLI volume stop $V0;</div><div class='add'>+EXPECT 'Stopped' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+TEST $CLI volume delete $V0;</div><div class='add'>+TEST ! $CLI volume info $V0;</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+#G_TESTDEF_TEST_STATUS_NETBSD7=BAD_TEST,BUG=000000</div><div class='add'>+#G_TESTDEF_TEST_STATUS_CENTOS6=BAD_TEST,BUG=000000</div><div class='head'>diff --git a/tests/bugs/stripe/bug-1111454.t b/tests/bugs/stripe/bug-1111454.t<br/>new file mode 100644<br/>index 00000000000..1509dd7b1a2<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/stripe/bug-1111454.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/stripe/bug-1111454.t</a></div><div class='hunk'>@@ -0,0 +1,20 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+#symlink resolution should succeed</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 stripe 2 $H0:$B0/${V0}{0,1}</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+TEST glusterfs --volfile-id=/$V0 --volfile-server=$H0 $M0 --attribute-timeout=0 --entry-timeout=0</div><div class='add'>+TEST mkdir $M0/dir</div><div class='add'>+TEST touch $M0/dir/file</div><div class='add'>+TEST ln -s file $M0/dir/symlinkfile</div><div class='add'>+TEST ls -lR $M0</div><div class='add'>+cleanup</div><div class='add'>+#G_TESTDEF_TEST_STATUS_NETBSD7=BAD_TEST,BUG=000000</div><div class='add'>+#G_TESTDEF_TEST_STATUS_CENTOS6=BAD_TEST,BUG=000000</div><div class='head'>diff --git a/tests/bugs/trace/bug-797171.t b/tests/bugs/trace/bug-797171.t<br/>new file mode 100755<br/>index 00000000000..b823e477229<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/trace/bug-797171.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/trace/bug-797171.t</a></div><div class='hunk'>@@ -0,0 +1,41 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume info;</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/brick1;</div><div class='add'>+TEST $CLI volume set $V0 debug.trace marker;</div><div class='add'>+TEST $CLI volume set $V0 debug.log-history on</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+</div><div class='add'>+TEST glusterfs --entry-timeout=0 --attribute-timeout=0 -s $H0 --volfile-id $V0 \</div><div class='add'>+$M0;</div><div class='add'>+</div><div class='add'>+touch $M0/{1..22};</div><div class='add'>+rm -f $M0/*;</div><div class='add'>+</div><div class='add'>+pid_file=$(ls $GLUSTERD_PIDFILEDIR/vols/$V0/);</div><div class='add'>+brick_pid=$(cat $GLUSTERD_PIDFILEDIR/vols/$V0/$pid_file);</div><div class='add'>+</div><div class='add'>+mkdir $statedumpdir/statedump_tmp/;</div><div class='add'>+echo "path=$statedumpdir/statedump_tmp" &gt; $statedumpdir/glusterdump.options;</div><div class='add'>+echo "all=yes" &gt;&gt; $statedumpdir/glusterdump.options;</div><div class='add'>+</div><div class='add'>+TEST $CLI volume statedump $V0 history;</div><div class='add'>+</div><div class='add'>+file_name=$(ls $statedumpdir/statedump_tmp);</div><div class='add'>+TEST grep "xlator.debug.trace.history" $statedumpdir/statedump_tmp/$file_name;</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+</div><div class='add'>+rm -rf $statedumpdir/statedump_tmp;</div><div class='add'>+rm -f $statedumpdir/glusterdump.options;</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/transport/bug-873367.t b/tests/bugs/transport/bug-873367.t<br/>new file mode 100755<br/>index 00000000000..8070bc1b83c<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/transport/bug-873367.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/transport/bug-873367.t</a></div><div class='hunk'>@@ -0,0 +1,45 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+SSL_BASE=/etc/ssl</div><div class='add'>+SSL_KEY=$SSL_BASE/glusterfs.key</div><div class='add'>+SSL_CERT=$SSL_BASE/glusterfs.pem</div><div class='add'>+SSL_CA=$SSL_BASE/glusterfs.ca</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+rm -f $SSL_BASE/glusterfs.*</div><div class='add'>+mkdir -p $B0/1</div><div class='add'>+mkdir -p $M0</div><div class='add'>+</div><div class='add'>+TEST openssl genrsa -out $SSL_KEY 2048</div><div class='add'>+TEST openssl req -new -x509 -key $SSL_KEY -subj /CN=Anyone -out $SSL_CERT</div><div class='add'>+ln $SSL_CERT $SSL_CA</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume info;</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/1</div><div class='add'>+TEST $CLI volume set $V0 server.ssl on</div><div class='add'>+TEST $CLI volume set $V0 client.ssl on</div><div class='add'>+TEST $CLI volume set $V0 ssl.certificate-depth 6</div><div class='add'>+TEST $CLI volume set $V0 ssl.cipher-list HIGH</div><div class='add'>+TEST $CLI volume set $V0 auth.ssl-allow Anyone</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+TEST glusterfs --volfile-server=$H0 --volfile-id=$V0 $M0</div><div class='add'>+echo some_data &gt; $M0/data_file</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+</div><div class='add'>+# If the bug is not fixed, the next mount will fail.</div><div class='add'>+</div><div class='add'>+TEST glusterfs --volfile-server=$H0 --volfile-id=$V0 $M0</div><div class='add'>+EXPECT some_data cat $M0/data_file</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+TEST $CLI volume stop $V0</div><div class='add'>+TEST $CLI volume delete $V0</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/unclassified/bug-1034085.t b/tests/bugs/unclassified/bug-1034085.t<br/>new file mode 100644<br/>index 00000000000..aacaa24d642<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/unclassified/bug-1034085.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/unclassified/bug-1034085.t</a></div><div class='hunk'>@@ -0,0 +1,31 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+#Test case: Check the creation of indices/xattrop dir as soon as brick comes up.</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+#Create a volume</div><div class='add'>+TEST glusterd;</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume info;</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 replica 2 $H0:$B0/${V0}-{0,1};</div><div class='add'>+EXPECT 'Created' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+TEST mkdir -p $B0/${V0}-0/.glusterfs/indices/</div><div class='add'>+TEST touch $B0/${V0}-0/.glusterfs/indices/xattrop</div><div class='add'>+</div><div class='add'>+#Volume start should not work when xattrop dir not created</div><div class='add'>+TEST ! $CLI volume start $V0;</div><div class='add'>+</div><div class='add'>+TEST rm $B0/${V0}-0/.glusterfs/indices/xattrop</div><div class='add'>+</div><div class='add'>+#Volume start should work now</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+EXPECT 'Started' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+#Check for the existence of indices/xattrop dir</div><div class='add'>+TEST [ -d $B0/${V0}-0/.glusterfs/indices/xattrop/ ];</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/unclassified/bug-1357397.t b/tests/bugs/unclassified/bug-1357397.t<br/>new file mode 100644<br/>index 00000000000..e2ec6f4d253<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/unclassified/bug-1357397.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/unclassified/bug-1357397.t</a></div><div class='hunk'>@@ -0,0 +1,35 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 replica 2 $H0:$B0/${V0}{1,2}</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+TEST $CLI volume set $V0 features.trash on</div><div class='add'>+TEST $CLI volume set $V0 features.trash-internal-op on</div><div class='add'>+</div><div class='add'>+TEST [ -e $B0/${V0}1/.trashcan ]</div><div class='add'>+</div><div class='add'>+TEST [ -e $B0/${V0}1/.trashcan/internal_op ]</div><div class='add'>+</div><div class='add'>+TEST $CLI volume stop $V0</div><div class='add'>+</div><div class='add'>+rm -rf $B0/${V0}1/.trashcan/internal_op</div><div class='add'>+</div><div class='add'>+TEST [ ! -e $B0/${V0}1/.trashcan/internal_op ]</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+</div><div class='add'>+TEST [ -e $B0/${V0}1/.trashcan/internal_op ]</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='add'>+</div><div class='add'>+#G_TESTDEF_TEST_STATUS_CENTOS6=BAD_TEST,BUG=1385758</div><div class='add'>+#G_TESTDEF_TEST_STATUS_NETBSD7=BAD_TEST,BUG=1385758</div><div class='head'>diff --git a/tests/bugs/unclassified/bug-874498.t b/tests/bugs/unclassified/bug-874498.t<br/>new file mode 100644<br/>index 00000000000..2aa9b168a8a<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/unclassified/bug-874498.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/unclassified/bug-874498.t</a></div><div class='hunk'>@@ -0,0 +1,64 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+. $(dirname $0)/../../afr.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume info;</div><div class='add'>+TEST $CLI volume create $V0 replica 2  $H0:$B0/brick1 $H0:$B0/brick2;</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+TEST glusterfs --volfile-server=$H0 --volfile-id=$V0 $M0;</div><div class='add'>+B0_hiphenated=`echo $B0 | tr '/' '-'`</div><div class='add'>+kill_brick $V0 $H0 $B0/brick1</div><div class='add'>+</div><div class='add'>+echo "GLUSTER FILE SYSTEM" &gt; $M0/FILE1</div><div class='add'>+echo "GLUSTER FILE SYSTEM" &gt; $M0/FILE2</div><div class='add'>+</div><div class='add'>+FILEN=$B0"/brick2"</div><div class='add'>+XATTROP=$FILEN/.glusterfs/indices/xattrop</div><div class='add'>+</div><div class='add'>+function get_gfid()</div><div class='add'>+{</div><div class='add'>+path_of_file=$1</div><div class='add'>+</div><div class='add'>+gfid_value=`getfattr -d -m . $path_of_file -e hex 2&gt;/dev/null |  grep trusted.gfid |  grep -v gfid2path | cut --complement -c -15 | sed 's/\([a-f0-9]\{8\}\)\([a-f0-9]\{4\}\)\([a-f0-9]\{4\}\)\([a-f0-9]\{4\}\)/\1-\2-\3-\4-/'`</div><div class='add'>+</div><div class='add'>+echo $gfid_value</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+GFID_ROOT=`get_gfid $B0/brick2`</div><div class='add'>+GFID_FILE1=`get_gfid $B0/brick2/FILE1`</div><div class='add'>+GFID_FILE2=`get_gfid $B0/brick2/FILE2`</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+count=0</div><div class='add'>+for i in `ls $XATTROP`</div><div class='add'>+do</div><div class='add'>+ if [ "$i" == "$GFID_ROOT" ] || [ "$i" == "$GFID_FILE1" ] || [ "$i" == "$GFID_FILE2" ]</div><div class='add'>+        then</div><div class='add'>+ count=$(( count + 1 ))</div><div class='add'>+ fi</div><div class='add'>+done</div><div class='add'>+</div><div class='add'>+EXPECT "3" echo $count</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "Y" glustershd_up_status</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 1</div><div class='add'>+TEST $CLI volume heal $V0</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+##Expected number of entries are 0 in the .glusterfs/indices/xattrop directory</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT '0' count_sh_entries $FILEN;</div><div class='add'>+</div><div class='add'>+TEST $CLI volume stop $V0;</div><div class='add'>+TEST $CLI volume delete $V0;</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/unclassified/bug-991622.t b/tests/bugs/unclassified/bug-991622.t<br/>new file mode 100644<br/>index 00000000000..17b37a7767d<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/unclassified/bug-991622.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/unclassified/bug-991622.t</a></div><div class='hunk'>@@ -0,0 +1,35 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+. $(dirname $0)/../../fileio.rc</div><div class='add'>+</div><div class='add'>+#This tests that no fd leaks are observed in unlink/rename in open-behind</div><div class='add'>+function leaked_fds {</div><div class='add'>+        ls -l /proc/$(get_brick_pid $V0 $H0 $B0/$V0)/fd | grep deleted</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/$V0</div><div class='add'>+TEST $CLI volume set $V0 open-behind on</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+TEST glusterfs --entry-timeout=0 --attribute-timeout=0 -s $H0 --volfile-id=$V0 $M0 --direct-io-mode=enable</div><div class='add'>+</div><div class='add'>+TEST fd1=`fd_available`</div><div class='add'>+TEST fd_open $fd1 'w' "$M0/testfile1"</div><div class='add'>+TEST fd_write $fd1 "content"</div><div class='add'>+</div><div class='add'>+TEST fd2=`fd_available`</div><div class='add'>+TEST fd_open $fd2 'w' "$M0/testfile2"</div><div class='add'>+TEST fd_write $fd2 "content"</div><div class='add'>+</div><div class='add'>+TEST touch $M0/a</div><div class='add'>+TEST rm $M0/testfile1</div><div class='add'>+TEST mv $M0/a $M0/testfile2</div><div class='add'>+TEST fd_close $fd1</div><div class='add'>+TEST fd_close $fd2</div><div class='add'>+TEST ! leaked_fds</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/upcall/bug-1227204.t b/tests/bugs/upcall/bug-1227204.t<br/>new file mode 100755<br/>index 00000000000..fc393b1837f<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/upcall/bug-1227204.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/upcall/bug-1227204.t</a></div><div class='hunk'>@@ -0,0 +1,29 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+# This regression test tries to ensure that quota limit-usage set work with</div><div class='add'>+# features.cache-invalidation on.</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd;</div><div class='add'>+TEST $CLI volume info;</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 replica 2 $H0:$B0/${V0}{1,2,3,4,5,6};</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+</div><div class='add'>+TEST $CLI volume set $V0 features.cache-invalidation on;</div><div class='add'>+TEST $CLI volume quota $V0 enable;</div><div class='add'>+</div><div class='add'>+TEST glusterfs --volfile-id=$V0 --volfile-server=$H0 $M0;</div><div class='add'>+</div><div class='add'>+TEST mkdir -p $M0/1/2;</div><div class='add'>+TEST $CLI volume quota $V0 limit-usage /1/2 100MB 70%;</div><div class='add'>+</div><div class='add'>+TEST $CLI volume status $V0</div><div class='add'>+TEST $CLI volume stop $V0</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/upcall/bug-1369430.t b/tests/bugs/upcall/bug-1369430.t<br/>new file mode 100755<br/>index 00000000000..f53c17a1495<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/upcall/bug-1369430.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/upcall/bug-1369430.t</a></div><div class='hunk'>@@ -0,0 +1,43 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+## 1. Start glusterd</div><div class='add'>+TEST glusterd;</div><div class='add'>+</div><div class='add'>+## 2. Lets create volume</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/${V0}{1,2,3};</div><div class='add'>+</div><div class='add'>+## 3. Start the volume</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+## 4. Enable the upcall xlator, and increase the md-cache timeout to max</div><div class='add'>+TEST $CLI volume set $V0 features.cache-invalidation on</div><div class='add'>+TEST $CLI volume set $V0 features.cache-invalidation-timeout 600</div><div class='add'>+TEST $CLI volume set $V0 performance.cache-invalidation on</div><div class='add'>+TEST $CLI volume set $V0 performance.md-cache-timeout 600</div><div class='add'>+TEST $CLI volume set $V0 performance.cache-samba-metadata on</div><div class='add'>+</div><div class='add'>+## 8. Create two gluster mounts</div><div class='add'>+TEST glusterfs --volfile-id=/$V0 --volfile-server=$H0 $M0</div><div class='add'>+TEST glusterfs --volfile-id=/$V0 --volfile-server=$H0 $M1</div><div class='add'>+</div><div class='add'>+## 10. Create directory and files from the M0</div><div class='add'>+TEST mkdir $M0/dir1</div><div class='add'>+TEST touch $M0/dir1/file{1..5}</div><div class='add'>+</div><div class='add'>+## 12. Access the files via readdirp, from M1</div><div class='add'>+TEST ls -l $M1/dir1/</div><div class='add'>+</div><div class='add'>+# Change the stat of one of the files from M0 and wait for it to</div><div class='add'>+# invalidate the md-cache of another mount M0</div><div class='add'>+echo "hello" &gt; $M0/dir1/file2</div><div class='add'>+sleep 2;</div><div class='add'>+</div><div class='add'>+## 13. Expct non zero size when stat from M1</div><div class='add'>+EXPECT_NOT "0" stat -c %s $M1/dir1/file2</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/upcall/bug-1394131.t b/tests/bugs/upcall/bug-1394131.t<br/>new file mode 100755<br/>index 00000000000..b371ce4e682<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/upcall/bug-1394131.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/upcall/bug-1394131.t</a></div><div class='hunk'>@@ -0,0 +1,29 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+## 1. Start glusterd</div><div class='add'>+TEST glusterd;</div><div class='add'>+</div><div class='add'>+## 2. Lets create volume</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/${V0}{1,2,3};</div><div class='add'>+</div><div class='add'>+## 3. Enable the upcall xlator, and increase the md-cache timeout to max</div><div class='add'>+TEST $CLI volume set $V0 features.cache-invalidation on</div><div class='add'>+TEST $CLI volume set $V0 features.cache-invalidation-timeout 600</div><div class='add'>+TEST $CLI volume set $V0 indexing on</div><div class='add'>+</div><div class='add'>+## 6. Start the volume</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+## 7. Create two gluster mounts</div><div class='add'>+TEST glusterfs --volfile-id=/$V0 --volfile-server=$H0 $M0</div><div class='add'>+</div><div class='add'>+## 8. Create directory and files from the M0</div><div class='add'>+TEST touch $M0/file1</div><div class='add'>+TEST mv $M0/file1 $M0/file2</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/upcall/bug-1422776.t b/tests/bugs/upcall/bug-1422776.t<br/>new file mode 100755<br/>index 00000000000..cb249ce1cd2<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/upcall/bug-1422776.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/upcall/bug-1422776.t</a></div><div class='hunk'>@@ -0,0 +1,30 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+##  Start glusterd</div><div class='add'>+TEST glusterd;</div><div class='add'>+</div><div class='add'>+##  Lets create volume</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/${V0}{1,2,3};</div><div class='add'>+</div><div class='add'>+##  Enable the upcall xlator, and increase the md-cache timeout to max</div><div class='add'>+TEST $CLI volume set $V0 features.cache-invalidation on</div><div class='add'>+TEST $CLI volume set $V0 features.cache-invalidation-timeout 600</div><div class='add'>+TEST $CLI volume set $V0 indexing on</div><div class='add'>+</div><div class='add'>+##  Start the volume</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+TEST $CLI volume quota $V0 enable</div><div class='add'>+</div><div class='add'>+##  Create two gluster mounts</div><div class='add'>+TEST glusterfs --volfile-id=/$V0 --volfile-server=$H0 $M0</div><div class='add'>+</div><div class='add'>+##  Create directory and files from the M0</div><div class='add'>+TEST touch $M0/file1</div><div class='add'>+TEST mv $M0/file1 $M0/file2</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/upcall/bug-1458127.t b/tests/bugs/upcall/bug-1458127.t<br/>new file mode 100755<br/>index 00000000000..e844f37f1d3<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/upcall/bug-1458127.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/upcall/bug-1458127.t</a></div><div class='hunk'>@@ -0,0 +1,36 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/${V0}{0}</div><div class='add'>+EXPECT 'Created' volinfo_field $V0 'Status'</div><div class='add'>+</div><div class='add'>+TEST $CLI volume set $V0 performance.nl-cache on</div><div class='add'>+TEST $CLI volume set $V0 nl-cache-positive-entry on</div><div class='add'>+TEST $CLI volume set $V0 nl-cache-timeout 2</div><div class='add'>+TEST $CLI volume set $V0 features.cache-invalidation on</div><div class='add'>+TEST $CLI volume set $V0 features.cache-invalidation-timeout 2</div><div class='add'>+TEST $CLI volume set $V0 md-cache-timeout 20</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+EXPECT 'Started' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+TEST glusterfs --volfile-id=/$V0 --volfile-server=$H0 $M0</div><div class='add'>+TEST glusterfs --volfile-id=/$V0 --volfile-server=$H0 $M1</div><div class='add'>+</div><div class='add'>+TEST mkdir $M0/dir</div><div class='add'>+TEST touch $M0/dir/xyz</div><div class='add'>+#Wait until upcall clears the fact that M0 had accessed dir</div><div class='add'>+sleep 4</div><div class='add'>+TEST mv $M0/dir/xyz $M0/dir/xyz1</div><div class='add'>+TEST ! ls $M0/dir/file1</div><div class='add'>+TEST touch $M1/dir/file1</div><div class='add'>+TEST ls $M0/dir/file1</div><div class='add'>+TEST ls $M0/dir/file1</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/upcall/bug-upcall-stat.t b/tests/bugs/upcall/bug-upcall-stat.t<br/>new file mode 100755<br/>index 00000000000..0ba944ec441<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/upcall/bug-upcall-stat.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/upcall/bug-upcall-stat.t</a></div><div class='hunk'>@@ -0,0 +1,39 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+TEST glusterd;</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/${V0}{1};</div><div class='add'>+</div><div class='add'>+TEST $CLI volume set $V0 features.cache-invalidation on</div><div class='add'>+TEST $CLI volume set $V0 features.cache-invalidation-timeout 600</div><div class='add'>+TEST $CLI volume set $V0 performance.cache-invalidation on</div><div class='add'>+TEST $CLI volume set $V0 performance.md-cache-timeout 600</div><div class='add'>+TEST $CLI volume set $V0 performance.cache-samba-metadata on</div><div class='add'>+</div><div class='add'>+#TEST $CLI volume stop $V0</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+## 5. Create two gluster mounts</div><div class='add'>+TEST glusterfs --volfile-id=/$V0 --volfile-server=$H0 $M0</div><div class='add'>+TEST glusterfs --volfile-id=/$V0 --volfile-server=$H0 $M1</div><div class='add'>+</div><div class='add'>+TEST $CLI volume profile $V0 start</div><div class='add'>+</div><div class='add'>+## 8. Create a file</div><div class='add'>+TEST touch $M0/file1</div><div class='add'>+</div><div class='add'>+TEST "setfattr -n user.DOSATTRIB -v "abc" $M0/file1"</div><div class='add'>+TEST "getfattr -n user.DOSATTRIB $M1/file1 | grep -q abc"</div><div class='add'>+TEST "setfattr -n user.DOSATTRIB -v "xyz" $M0/file1"</div><div class='add'>+sleep 2; #There can be a very very small window where the next getxattr</div><div class='add'>+         #reaches md-cache, before the cache-invalidation caused by previous</div><div class='add'>+         #setxattr, reaches md-cache. Hence sleeping for 2 sec.</div><div class='add'>+         #Also it should not be &gt; 600.</div><div class='add'>+TEST "getfattr -n user.DOSATTRIB $M1/file1 | grep -q xyz"</div><div class='add'>+</div><div class='add'>+$CLI volume profile $V0 info | grep -q CI_XATTR</div><div class='add'>+EXPECT '0' echo $?</div><div class='head'>diff --git a/tests/bugs/write-behind/bug-1058663.c b/tests/bugs/write-behind/bug-1058663.c<br/>new file mode 100644<br/>index 00000000000..aedf97d7487<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/write-behind/bug-1058663.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/write-behind/bug-1058663.c</a></div><div class='hunk'>@@ -0,0 +1,123 @@</div><div class='add'>+#include &lt;stdlib.h&gt;</div><div class='add'>+#include &lt;stdio.h&gt;</div><div class='add'>+#include &lt;stdint.h&gt;</div><div class='add'>+#include &lt;fcntl.h&gt;</div><div class='add'>+#include &lt;sys/stat.h&gt;</div><div class='add'>+#include &lt;sys/mman.h&gt;</div><div class='add'>+#include &lt;signal.h&gt;</div><div class='add'>+</div><div class='add'>+#define FILE_SIZE 1048576</div><div class='add'>+</div><div class='add'>+/* number of tests to run */</div><div class='add'>+#define RUN_LOOP 1000</div><div class='add'>+</div><div class='add'>+/* number of SIGBUS before exiting */</div><div class='add'>+#define MAX_SIGBUS 1</div><div class='add'>+static int expect_sigbus;</div><div class='add'>+static int sigbus_received;</div><div class='add'>+</div><div class='add'>+/* test for truncate()/seek()/write()/mmap()</div><div class='add'>+ * There should ne no SIGBUS triggered.</div><div class='add'>+ */</div><div class='add'>+void</div><div class='add'>+seek_write(char *filename)</div><div class='add'>+{</div><div class='add'>+    int fd;</div><div class='add'>+    uint8_t *map;</div><div class='add'>+    int i;</div><div class='add'>+</div><div class='add'>+    fd = open(filename, O_RDWR | O_CREAT | O_TRUNC, 0600);</div><div class='add'>+    lseek(fd, FILE_SIZE - 1, SEEK_SET);</div><div class='add'>+    write(fd, "\xff", 1);</div><div class='add'>+</div><div class='add'>+    map = mmap(NULL, FILE_SIZE, PROT_READ, MAP_PRIVATE, fd, 0);</div><div class='add'>+    for (i = 0; i &lt; (FILE_SIZE - 1); i++) {</div><div class='add'>+        if (map[i] != 0) /* should never be true */</div><div class='add'>+            abort();</div><div class='add'>+    }</div><div class='add'>+    munmap(map, FILE_SIZE);</div><div class='add'>+</div><div class='add'>+    close(fd);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+read_after_eof(char *filename)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+    int fd;</div><div class='add'>+    char *data;</div><div class='add'>+    uint8_t *map;</div><div class='add'>+</div><div class='add'>+    fd = open(filename, O_RDWR | O_CREAT | O_TRUNC, 0600);</div><div class='add'>+    lseek(fd, FILE_SIZE - 1, SEEK_SET);</div><div class='add'>+    write(fd, "\xff", 1);</div><div class='add'>+</div><div class='add'>+    /* trigger verify that reading after EOF fails */</div><div class='add'>+    ret = read(fd, data, FILE_SIZE / 2);</div><div class='add'>+    if (ret != 0)</div><div class='add'>+        return 1;</div><div class='add'>+</div><div class='add'>+    /* map an area of 1 byte after FILE_SIZE */</div><div class='add'>+    map = mmap(NULL, 1, PROT_READ, MAP_PRIVATE, fd, FILE_SIZE);</div><div class='add'>+    /* map[0] is an access after EOF, it should trigger SIGBUS */</div><div class='add'>+    if (map[0] != 0)</div><div class='add'>+        /* it is expected that we exit before we get here */</div><div class='add'>+        if (!sigbus_received)</div><div class='add'>+            return 1;</div><div class='add'>+    munmap(map, FILE_SIZE);</div><div class='add'>+</div><div class='add'>+    close(fd);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* signal handler for SIGBUS */</div><div class='add'>+void</div><div class='add'>+catch_sigbus(int signum)</div><div class='add'>+{</div><div class='add'>+    switch (signum) {</div><div class='add'>+#ifdef __NetBSD__</div><div class='add'>+        /* Depending on architecture, we can get SIGSEGV */</div><div class='add'>+        case SIGSEGV: /* FALLTHROUGH */</div><div class='add'>+#endif</div><div class='add'>+        case SIGBUS:</div><div class='add'>+            sigbus_received++;</div><div class='add'>+            if (!expect_sigbus)</div><div class='add'>+                exit(EXIT_FAILURE);</div><div class='add'>+            if (sigbus_received &gt;= MAX_SIGBUS)</div><div class='add'>+                exit(EXIT_SUCCESS);</div><div class='add'>+            break;</div><div class='add'>+        default:</div><div class='add'>+            printf("Unexpected signal received: %d\n", signum);</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+main(int argc, char **argv)</div><div class='add'>+{</div><div class='add'>+    int i = 0;</div><div class='add'>+</div><div class='add'>+    if (argc == 1) {</div><div class='add'>+        printf("Usage: %s &lt;filename&gt;\n", argv[0]);</div><div class='add'>+        return EXIT_FAILURE;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+#ifdef __NetBSD__</div><div class='add'>+    /* Depending on architecture, we can get SIGSEGV */</div><div class='add'>+    signal(SIGSEGV, catch_sigbus);</div><div class='add'>+#endif</div><div class='add'>+    signal(SIGBUS, catch_sigbus);</div><div class='add'>+</div><div class='add'>+    /* the next test should not trigger SIGBUS */</div><div class='add'>+    expect_sigbus = 0;</div><div class='add'>+    for (i = 0; i &lt; RUN_LOOP; i++) {</div><div class='add'>+        seek_write(argv[1]);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* the next test should trigger SIGBUS */</div><div class='add'>+    expect_sigbus = 1;</div><div class='add'>+    if (read_after_eof(argv[1]))</div><div class='add'>+        return EXIT_FAILURE;</div><div class='add'>+</div><div class='add'>+    return EXIT_SUCCESS;</div><div class='add'>+}</div><div class='head'>diff --git a/tests/bugs/write-behind/bug-1058663.t b/tests/bugs/write-behind/bug-1058663.t<br/>new file mode 100644<br/>index 00000000000..a900a6d7afa<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/write-behind/bug-1058663.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/write-behind/bug-1058663.t</a></div><div class='hunk'>@@ -0,0 +1,28 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+## Start and create a volume</div><div class='add'>+TEST glusterd;</div><div class='add'>+TEST pidof glusterd;</div><div class='add'>+TEST $CLI volume info;</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/$V0;</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+</div><div class='add'>+TEST glusterfs --entry-timeout=0 --attribute-timeout=0 -s $H0 --volfile-id $V0 $M0</div><div class='add'>+</div><div class='add'>+# compile the test program and run it</div><div class='add'>+TEST $CC $(dirname $0)/bug-1058663.c -o $(dirname $0)/bug-1058663;</div><div class='add'>+TEST $(dirname $0)/bug-1058663 $M0/bug-1058663.bin;</div><div class='add'>+TEST rm -f $(dirname $0)/M0/bug-1058663.bin;</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+</div><div class='add'>+TEST $CLI volume stop $V0;</div><div class='add'>+TEST $CLI volume delete $V0;</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/bugs/write-behind/bug-1279730.c b/tests/bugs/write-behind/bug-1279730.c<br/>new file mode 100644<br/>index 00000000000..706ae67b102<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/write-behind/bug-1279730.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/write-behind/bug-1279730.c</a></div><div class='hunk'>@@ -0,0 +1,149 @@</div><div class='add'>+#include &lt;stdio.h&gt;</div><div class='add'>+#include &lt;string.h&gt;</div><div class='add'>+#include &lt;errno.h&gt;</div><div class='add'>+#include &lt;sys/types.h&gt;</div><div class='add'>+#include &lt;sys/stat.h&gt;</div><div class='add'>+#include &lt;fcntl.h&gt;</div><div class='add'>+#include &lt;unistd.h&gt;</div><div class='add'>+#include &lt;assert.h&gt;</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+main(int argc, char *argv[])</div><div class='add'>+{</div><div class='add'>+    int fd = -1, ret = -1, len = 0;</div><div class='add'>+    char *path = NULL,</div><div class='add'>+         buf[128] =</div><div class='add'>+             {</div><div class='add'>+                 0,</div><div class='add'>+             },</div><div class='add'>+         *cmd = NULL;</div><div class='add'>+    struct stat stbuf = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int write_to_child[2] =</div><div class='add'>+        {</div><div class='add'>+            0,</div><div class='add'>+        },</div><div class='add'>+        write_to_parent[2] = {</div><div class='add'>+            0,</div><div class='add'>+        };</div><div class='add'>+</div><div class='add'>+    path = argv[1];</div><div class='add'>+    cmd = argv[2];</div><div class='add'>+</div><div class='add'>+    assert(argc == 3);</div><div class='add'>+</div><div class='add'>+    ret = pipe(write_to_child);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(stderr,</div><div class='add'>+                "creation of write-to-child pipe failed "</div><div class='add'>+                "(%s)\n",</div><div class='add'>+                strerror(errno));</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = pipe(write_to_parent);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(stderr,</div><div class='add'>+                "creation of write-to-parent pipe failed "</div><div class='add'>+                "(%s)\n",</div><div class='add'>+                strerror(errno));</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = fork();</div><div class='add'>+    switch (ret) {</div><div class='add'>+        case 0:</div><div class='add'>+            close(write_to_child[1]);</div><div class='add'>+            close(write_to_parent[0]);</div><div class='add'>+</div><div class='add'>+            /* child, wait for instructions to execute command */</div><div class='add'>+            ret = read(write_to_child[0], buf, 128);</div><div class='add'>+            if (ret &lt; 0) {</div><div class='add'>+                fprintf(stderr, "child: read on pipe failed (%s)\n",</div><div class='add'>+                        strerror(errno));</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            system(cmd);</div><div class='add'>+</div><div class='add'>+            ret = write(write_to_parent[1], "1", 2);</div><div class='add'>+            if (ret &lt; 0) {</div><div class='add'>+                fprintf(stderr, "child: write to pipe failed (%s)\n",</div><div class='add'>+                        strerror(errno));</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+            break;</div><div class='add'>+</div><div class='add'>+        case -1:</div><div class='add'>+            fprintf(stderr, "fork failed (%s)\n", strerror(errno));</div><div class='add'>+            goto out;</div><div class='add'>+</div><div class='add'>+        default:</div><div class='add'>+            close(write_to_parent[1]);</div><div class='add'>+            close(write_to_child[0]);</div><div class='add'>+</div><div class='add'>+            fd = open(path, O_CREAT | O_RDWR | O_APPEND, S_IRWXU);</div><div class='add'>+            if (fd &lt; 0) {</div><div class='add'>+                fprintf(stderr, "open failed (%s)\n", strerror(errno));</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            len = strlen("test-content") + 1;</div><div class='add'>+            ret = write(fd, "test-content", len);</div><div class='add'>+</div><div class='add'>+            if (ret &lt; len) {</div><div class='add'>+                fprintf(stderr, "write failed %d (%s)\n", ret, strerror(errno));</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            ret = pread(fd, buf, 128, 0);</div><div class='add'>+            if ((ret == len) &amp;&amp; (strcmp(buf, "test-content") == 0)) {</div><div class='add'>+                fprintf(stderr,</div><div class='add'>+                        "read should've failed as previous "</div><div class='add'>+                        "write would've failed with EDQUOT, but its "</div><div class='add'>+                        "successful");</div><div class='add'>+                ret = -1;</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            ret = write(write_to_child[1], "1", 2);</div><div class='add'>+            if (ret &lt; 0) {</div><div class='add'>+                fprintf(stderr, "parent: write to pipe failed (%s)\n",</div><div class='add'>+                        strerror(errno));</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            ret = read(write_to_parent[0], buf, 128);</div><div class='add'>+            if (ret &lt; 0) {</div><div class='add'>+                fprintf(stderr, "parent: read from pipe failed (%s)\n",</div><div class='add'>+                        strerror(errno));</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            /* this will force a sync on cached-write and now that quota</div><div class='add'>+               limit is increased, sync will be successful. ignore return</div><div class='add'>+               value as fstat would fail with EDQUOT (picked up from</div><div class='add'>+               cached-write because of previous sync failure.</div><div class='add'>+            */</div><div class='add'>+            fstat(fd, &amp;stbuf);</div><div class='add'>+</div><div class='add'>+            ret = pread(fd, buf, 128, 0);</div><div class='add'>+            if (ret != len) {</div><div class='add'>+                fprintf(stderr,</div><div class='add'>+                        "post cmd read failed %d (data:%s) "</div><div class='add'>+                        "(error:%s)\n",</div><div class='add'>+                        ret, buf, strerror(errno));</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            if (strcmp(buf, "test-content")) {</div><div class='add'>+                fprintf(stderr, "wrong data (%s)\n", buf);</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='head'>diff --git a/tests/bugs/write-behind/bug-1279730.t b/tests/bugs/write-behind/bug-1279730.t<br/>new file mode 100755<br/>index 00000000000..20447c349d5<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/write-behind/bug-1279730.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/write-behind/bug-1279730.t</a></div><div class='hunk'>@@ -0,0 +1,37 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+. $(dirname $0)/../../fileio.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+## Start and create a volume</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd;</div><div class='add'>+TEST $CLI volume info;</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/$V0;</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+TEST $CLI volume quota $V0 enable</div><div class='add'>+TEST $CLI volume quota $V0 limit-usage / 4</div><div class='add'>+TEST $CLI volume quota $V0 hard-timeout 0</div><div class='add'>+TEST $CLI volume quota $V0 soft-timeout 0</div><div class='add'>+</div><div class='add'>+TEST glusterfs --entry-timeout=0 --attribute-timeout=0 -s $H0 --volfile-id $V0 $M0</div><div class='add'>+</div><div class='add'>+# compile the test program and run it</div><div class='add'>+TEST $CC -O0 -g3 $(dirname $0)/bug-1279730.c -o $(dirname $0)/bug-1279730</div><div class='add'>+</div><div class='add'>+TEST $(dirname $0)/bug-1279730 $M0/file "\"$CLI volume quota $V0 limit-usage / 1024\""</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+</div><div class='add'>+TEST $CLI volume stop $V0;</div><div class='add'>+TEST $CLI volume delete $V0;</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+#G_TESTDEF_TEST_STATUS_CENTOS6=BAD_TEST,BUG=1279730</div><div class='add'>+#G_TESTDEF_TEST_STATUS_NETBSD7=BAD_TEST,BUG=1279730</div><div class='add'>+</div><div class='head'>diff --git a/tests/bugs/write-behind/issue-884.c b/tests/bugs/write-behind/issue-884.c<br/>new file mode 100644<br/>index 00000000000..e9c33b351ad<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/write-behind/issue-884.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/write-behind/issue-884.c</a></div><div class='hunk'>@@ -0,0 +1,267 @@</div><div class='add'>+</div><div class='add'>+#define _GNU_SOURCE</div><div class='add'>+</div><div class='add'>+#include &lt;stdlib.h&gt;</div><div class='add'>+#include &lt;stdio.h&gt;</div><div class='add'>+#include &lt;string.h&gt;</div><div class='add'>+#include &lt;time.h&gt;</div><div class='add'>+#include &lt;assert.h&gt;</div><div class='add'>+#include &lt;errno.h&gt;</div><div class='add'>+#include &lt;sys/types.h&gt;</div><div class='add'>+#include &lt;sys/stat.h&gt;</div><div class='add'>+#include &lt;pthread.h&gt;</div><div class='add'>+</div><div class='add'>+#include &lt;glusterfs/api/glfs.h&gt;</div><div class='add'>+</div><div class='add'>+/* Based on a reproducer by Stefan Ring. It seems to be quite sensible to any</div><div class='add'>+ * timing modification, so the code has been maintained as is, only with minor</div><div class='add'>+ * changes. */</div><div class='add'>+</div><div class='add'>+struct glfs *glfs;</div><div class='add'>+</div><div class='add'>+pthread_mutex_t the_mutex = PTHREAD_MUTEX_INITIALIZER;</div><div class='add'>+pthread_cond_t the_cond = PTHREAD_COND_INITIALIZER;</div><div class='add'>+</div><div class='add'>+typedef struct _my_aiocb {</div><div class='add'>+    int64_t size;</div><div class='add'>+    volatile int64_t seq;</div><div class='add'>+    int which;</div><div class='add'>+} my_aiocb;</div><div class='add'>+</div><div class='add'>+typedef struct _worker_data {</div><div class='add'>+    my_aiocb cb;</div><div class='add'>+    struct iovec iov;</div><div class='add'>+    int64_t offset;</div><div class='add'>+} worker_data;</div><div class='add'>+</div><div class='add'>+typedef struct {</div><div class='add'>+    worker_data wdata[2];</div><div class='add'>+</div><div class='add'>+    volatile unsigned busy;</div><div class='add'>+} all_data_t;</div><div class='add'>+</div><div class='add'>+all_data_t all_data;</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+completion_fnc(struct glfs_fd *fd, ssize_t ret, struct glfs_stat *pre,</div><div class='add'>+               struct glfs_stat *post, void *arg)</div><div class='add'>+{</div><div class='add'>+    void *the_thread;</div><div class='add'>+    my_aiocb *cb = (my_aiocb *)arg;</div><div class='add'>+    long seq = cb-&gt;seq;</div><div class='add'>+</div><div class='add'>+    assert(ret == cb-&gt;size);</div><div class='add'>+</div><div class='add'>+    pthread_mutex_lock(&amp;the_mutex);</div><div class='add'>+    pthread_cond_broadcast(&amp;the_cond);</div><div class='add'>+</div><div class='add'>+    all_data.busy &amp;= ~(1 &lt;&lt; cb-&gt;which);</div><div class='add'>+    cb-&gt;seq = -1;</div><div class='add'>+</div><div class='add'>+    the_thread = (void *)pthread_self();</div><div class='add'>+    printf("worker %d is done from thread %p, seq %ld!\n", cb-&gt;which,</div><div class='add'>+           the_thread, seq);</div><div class='add'>+</div><div class='add'>+    pthread_mutex_unlock(&amp;the_mutex);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+init_wdata(worker_data *data, int which)</div><div class='add'>+{</div><div class='add'>+    data-&gt;cb.which = which;</div><div class='add'>+    data-&gt;cb.seq = -1;</div><div class='add'>+</div><div class='add'>+    data-&gt;iov.iov_base = malloc(1024 * 1024);</div><div class='add'>+    memset(data-&gt;iov.iov_base, 6,</div><div class='add'>+           1024 * 1024); /* tail part never overwritten */</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+init()</div><div class='add'>+{</div><div class='add'>+    all_data.busy = 0;</div><div class='add'>+</div><div class='add'>+    init_wdata(&amp;all_data.wdata[0], 0);</div><div class='add'>+    init_wdata(&amp;all_data.wdata[1], 1);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+do_write(struct glfs_fd *fd, int content, int size, int64_t seq,</div><div class='add'>+         worker_data *wdata, const char *name)</div><div class='add'>+{</div><div class='add'>+    int ret;</div><div class='add'>+</div><div class='add'>+    wdata-&gt;cb.size = size;</div><div class='add'>+    wdata-&gt;cb.seq = seq;</div><div class='add'>+</div><div class='add'>+    if (content &gt;= 0)</div><div class='add'>+        memset(wdata-&gt;iov.iov_base, content, size);</div><div class='add'>+    wdata-&gt;iov.iov_len = size;</div><div class='add'>+</div><div class='add'>+    pthread_mutex_lock(&amp;the_mutex);</div><div class='add'>+    printf("(%d) dispatching write \"%s\", offset %lx, len %x, seq %ld\n",</div><div class='add'>+           wdata-&gt;cb.which, name, (long)wdata-&gt;offset, size, (long)seq);</div><div class='add'>+    pthread_mutex_unlock(&amp;the_mutex);</div><div class='add'>+    ret = glfs_pwritev_async(fd, &amp;wdata-&gt;iov, 1, wdata-&gt;offset, 0,</div><div class='add'>+                             completion_fnc, &amp;wdata-&gt;cb);</div><div class='add'>+    assert(ret &gt;= 0);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#define IDLE 0  // both workers must be idle</div><div class='add'>+#define ANY 1   // use any worker, other one may be busy</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+get_worker(int waitfor, int64_t excl_seq)</div><div class='add'>+{</div><div class='add'>+    int which;</div><div class='add'>+</div><div class='add'>+    pthread_mutex_lock(&amp;the_mutex);</div><div class='add'>+</div><div class='add'>+    while (waitfor == IDLE &amp;&amp; (all_data.busy &amp; 3) != 0 ||</div><div class='add'>+           waitfor == ANY &amp;&amp;</div><div class='add'>+               ((all_data.busy &amp; 3) == 3 ||</div><div class='add'>+                excl_seq &gt;= 0 &amp;&amp; (all_data.wdata[0].cb.seq == excl_seq ||</div><div class='add'>+                                  all_data.wdata[1].cb.seq == excl_seq)))</div><div class='add'>+        pthread_cond_wait(&amp;the_cond, &amp;the_mutex);</div><div class='add'>+</div><div class='add'>+    if (!(all_data.busy &amp; 1))</div><div class='add'>+        which = 0;</div><div class='add'>+    else</div><div class='add'>+        which = 1;</div><div class='add'>+</div><div class='add'>+    all_data.busy |= (1 &lt;&lt; which);</div><div class='add'>+</div><div class='add'>+    pthread_mutex_unlock(&amp;the_mutex);</div><div class='add'>+</div><div class='add'>+    return which;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+doit(struct glfs_fd *fd)</div><div class='add'>+{</div><div class='add'>+    int ret;</div><div class='add'>+    int64_t seq = 0;</div><div class='add'>+    int64_t offset = 0;     // position in file, in blocks</div><div class='add'>+    int64_t base = 0x1000;  // where to place the data, in blocks</div><div class='add'>+</div><div class='add'>+    int async_mode = ANY;</div><div class='add'>+</div><div class='add'>+    init();</div><div class='add'>+</div><div class='add'>+    for (;;) {</div><div class='add'>+        int which;</div><div class='add'>+        worker_data *wdata;</div><div class='add'>+</div><div class='add'>+        // for growing to the first offset</div><div class='add'>+        for (;;) {</div><div class='add'>+            int gap = base + 0x42 - offset;</div><div class='add'>+            if (!gap)</div><div class='add'>+                break;</div><div class='add'>+            if (gap &gt; 80)</div><div class='add'>+                gap = 80;</div><div class='add'>+</div><div class='add'>+            which = get_worker(IDLE, -1);</div><div class='add'>+            wdata = &amp;all_data.wdata[which];</div><div class='add'>+</div><div class='add'>+            wdata-&gt;offset = offset &lt;&lt; 9;</div><div class='add'>+            do_write(fd, 0, gap &lt;&lt; 9, seq++, wdata, "gap-filling");</div><div class='add'>+</div><div class='add'>+            offset += gap;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        // 8700</div><div class='add'>+        which = get_worker(IDLE, -1);</div><div class='add'>+        wdata = &amp;all_data.wdata[which];</div><div class='add'>+</div><div class='add'>+        wdata-&gt;offset = (base + 0x42) &lt;&lt; 9;</div><div class='add'>+        do_write(fd, 1, 62 &lt;&lt; 9, seq++, wdata, "!8700");</div><div class='add'>+</div><div class='add'>+        // 8701</div><div class='add'>+        which = get_worker(IDLE, -1);</div><div class='add'>+        wdata = &amp;all_data.wdata[which];</div><div class='add'>+</div><div class='add'>+        wdata-&gt;offset = (base + 0x42) &lt;&lt; 9;</div><div class='add'>+        do_write(fd, 2, 55 &lt;&lt; 9, seq++, wdata, "!8701");</div><div class='add'>+</div><div class='add'>+        // 8702</div><div class='add'>+        which = get_worker(async_mode, -1);</div><div class='add'>+        wdata = &amp;all_data.wdata[which];</div><div class='add'>+</div><div class='add'>+        wdata-&gt;offset = (base + 0x79) &lt;&lt; 9;</div><div class='add'>+        do_write(fd, 3, 54 &lt;&lt; 9, seq++, wdata, "!8702");</div><div class='add'>+</div><div class='add'>+        // 8703</div><div class='add'>+        which = get_worker(async_mode, -1);</div><div class='add'>+        wdata = &amp;all_data.wdata[which];</div><div class='add'>+</div><div class='add'>+        wdata-&gt;offset = (base + 0xaf) &lt;&lt; 9;</div><div class='add'>+        do_write(fd, 4, 81 &lt;&lt; 9, seq++, wdata, "!8703");</div><div class='add'>+</div><div class='add'>+        // 8704</div><div class='add'>+        // this writes both 5s and 6s</div><div class='add'>+        // the range of 5s is the one that overwrites 8703</div><div class='add'>+</div><div class='add'>+        which = get_worker(async_mode, seq - 1);</div><div class='add'>+        wdata = &amp;all_data.wdata[which];</div><div class='add'>+</div><div class='add'>+        memset(wdata-&gt;iov.iov_base, 5, 81 &lt;&lt; 9);</div><div class='add'>+        wdata-&gt;offset = (base + 0xaf) &lt;&lt; 9;</div><div class='add'>+        do_write(fd, -1, 1623 &lt;&lt; 9, seq++, wdata, "!8704");</div><div class='add'>+</div><div class='add'>+        offset = base + 0x706;</div><div class='add'>+        base += 0x1000;</div><div class='add'>+        if (base &gt;= 0x100000)</div><div class='add'>+            break;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    printf("done!\n");</div><div class='add'>+    fflush(stdout);</div><div class='add'>+</div><div class='add'>+    pthread_mutex_lock(&amp;the_mutex);</div><div class='add'>+</div><div class='add'>+    while ((all_data.busy &amp; 3) != 0)</div><div class='add'>+        pthread_cond_wait(&amp;the_cond, &amp;the_mutex);</div><div class='add'>+</div><div class='add'>+    pthread_mutex_unlock(&amp;the_mutex);</div><div class='add'>+</div><div class='add'>+    ret = glfs_close(fd);</div><div class='add'>+    assert(ret &gt;= 0);</div><div class='add'>+    /*</div><div class='add'>+        ret = glfs_fini(glfs);</div><div class='add'>+        assert(ret &gt;= 0);</div><div class='add'>+    */</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+main(int argc, char *argv[])</div><div class='add'>+{</div><div class='add'>+    int ret;</div><div class='add'>+    int open_flags = O_RDWR | O_DIRECT | O_TRUNC;</div><div class='add'>+    struct glfs_fd *fd;</div><div class='add'>+</div><div class='add'>+    glfs = glfs_new(argv[1]);</div><div class='add'>+    if (!glfs) {</div><div class='add'>+        printf("glfs_new!\n");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    ret = glfs_set_volfile_server(glfs, "tcp", "localhost", 24007);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        printf("set_volfile!\n");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    ret = glfs_init(glfs);</div><div class='add'>+    if (ret) {</div><div class='add'>+        printf("init!\n");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    fd = glfs_open(glfs, argv[2], open_flags);</div><div class='add'>+    if (!fd) {</div><div class='add'>+        printf("open!\n");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    srand(time(NULL));</div><div class='add'>+    return doit(fd);</div><div class='add'>+out:</div><div class='add'>+    return 1;</div><div class='add'>+}</div><div class='head'>diff --git a/tests/bugs/write-behind/issue-884.t b/tests/bugs/write-behind/issue-884.t<br/>new file mode 100755<br/>index 00000000000..2bcf7d15265<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/bugs/write-behind/issue-884.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/bugs/write-behind/issue-884.t</a></div><div class='hunk'>@@ -0,0 +1,40 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../../include.rc</div><div class='add'>+. $(dirname $0)/../../volume.rc</div><div class='add'>+</div><div class='add'>+# This test tries to detect a race condition in write-behind. It's based on a</div><div class='add'>+# reproducer written by Stefan Ring that is able to hit it sometimes. On my</div><div class='add'>+# system, it happened around 10% of the runs. This means that if this bug</div><div class='add'>+# appears again, this test will fail once every 10 runs. Most probably this</div><div class='add'>+# failure will be hidden by the automatic test retry of the testing framework.</div><div class='add'>+#</div><div class='add'>+# Please, if this test fails, it needs to be analyzed in detail.</div><div class='add'>+</div><div class='add'>+function run() {</div><div class='add'>+    "${@}" &gt;/dev/null</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/$V0</div><div class='add'>+# This makes it easier to hit the issue</div><div class='add'>+TEST $CLI volume set $V0 client-log-level TRACE</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+TEST $GFS --volfile-server=$H0 --volfile-id=$V0 $M0</div><div class='add'>+</div><div class='add'>+build_tester $(dirname $0)/issue-884.c -lgfapi</div><div class='add'>+</div><div class='add'>+TEST touch $M0/testfile</div><div class='add'>+</div><div class='add'>+# This program generates a file of 535694336 bytes with a fixed pattern</div><div class='add'>+TEST run $(dirname $0)/issue-884 $V0 testfile</div><div class='add'>+</div><div class='add'>+# This is the md5sum of the expected pattern without corruption</div><div class='add'>+EXPECT "ad105f9349345a70fc697632cbb5eec8" echo "$(md5sum $B0/$V0/testfile | awk '{ print $1; }')"</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/changelog.rc b/tests/changelog.rc<br/>new file mode 100644<br/>index 00000000000..ffad2e80632<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/changelog.rc?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/changelog.rc</a></div><div class='hunk'>@@ -0,0 +1,9 @@</div><div class='add'>+</div><div class='add'>+function count_htime_files {</div><div class='add'>+    ls -l $B0/$V0"1"/.glusterfs/changelogs/htime/ | grep HTIME | wc -l</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function count_changelog_files {</div><div class='add'>+    # Where $1 is the brick name passed</div><div class='add'>+    ls -l $1/.glusterfs/changelogs/ | grep CHANGELOG | wc -l</div><div class='add'>+}</div><div class='head'>diff --git a/tests/cleanup.sh b/tests/cleanup.sh<br/>new file mode 100644<br/>index 00000000000..29fd6929fac<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/cleanup.sh?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/cleanup.sh</a></div><div class='hunk'>@@ -0,0 +1,4 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/include.rc</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/cluster.rc b/tests/cluster.rc<br/>new file mode 100644<br/>index 00000000000..34f5b02398f<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/cluster.rc?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/cluster.rc</a></div><div class='hunk'>@@ -0,0 +1,218 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+CLUSTER_PFX="127.1.1"; # ".x" for each glusterd</div><div class='add'>+CLUSTER_COUNT=1; # Just initial definition</div><div class='add'>+</div><div class='add'>+function launch_cluster() {</div><div class='add'>+    local count=$1;</div><div class='add'>+</div><div class='add'>+    CLUSTER_COUNT=$count;</div><div class='add'>+</div><div class='add'>+    define_backends $count;</div><div class='add'>+    define_hosts $count;</div><div class='add'>+    define_glusterds $count $2;</div><div class='add'>+    define_clis $count $3;</div><div class='add'>+</div><div class='add'>+    start_glusterds;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+function define_backends() {</div><div class='add'>+    local b;</div><div class='add'>+</div><div class='add'>+    for i in `seq 1 $count`; do</div><div class='add'>+        eval "B$i=$B0/$i";</div><div class='add'>+    done</div><div class='add'>+</div><div class='add'>+    for i in `seq 1 $count`; do</div><div class='add'>+        b="B$i";</div><div class='add'>+        mkdir -p ${!b}/glusterd;</div><div class='add'>+        mkdir -p ${!b}/run;</div><div class='add'>+    done</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+function define_glusterds() {</div><div class='add'>+    local count=$1;</div><div class='add'>+    local h;</div><div class='add'>+    local b;</div><div class='add'>+    local wopt;</div><div class='add'>+    local bopt;</div><div class='add'>+    local popt;</div><div class='add'>+</div><div class='add'>+    for i in `seq 1 $count`; do</div><div class='add'>+        b="B$i";</div><div class='add'>+        h="H$i";</div><div class='add'>+        wopt="management.working-directory=${!b}/glusterd";</div><div class='add'>+        ropt="management.run-directory=${!b}/run/gluster";</div><div class='add'>+        bopt="management.transport.socket.bind-address=${!h}";</div><div class='add'>+        popt="--pid-file=${!b}/glusterd.pid";</div><div class='add'>+        sopt="management.glusterd-sockfile=${!b}/glusterd/gd.sock"</div><div class='add'>+        #Get the logdir</div><div class='add'>+        logdir=`gluster --print-logdir`</div><div class='add'>+        clopt="management.cluster-test-mode=${logdir}/$i";</div><div class='add'>+        #Fetch the testcases name and prefix the glusterd log with it</div><div class='add'>+        logfile=`echo ${0##*/}`_glusterd$i.log</div><div class='add'>+        lopt="--log-file=$logdir/$i/$logfile"</div><div class='add'>+        if [ "$2" == "-LDEBUG" ]; then</div><div class='add'>+            eval "glusterd_$i='glusterd -LDEBUG --xlator-option $wopt --xlator-option $bopt --xlator-option $ropt --xlator-option $sopt --xlator-option $clopt $lopt $popt'";</div><div class='add'>+            eval "glusterd$i='glusterd -LDEBUG --xlator-option $wopt --xlator-option $bopt --xlator-option $ropt --xlator-option $sopt --xlator-option $clopt $lopt $popt'";</div><div class='add'>+        else</div><div class='add'>+            eval "glusterd_$i='glusterd --xlator-option $wopt --xlator-option $bopt --xlator-option $ropt --xlator-option $sopt --xlator-option $clopt $lopt $popt'";</div><div class='add'>+            eval "glusterd$i='glusterd --xlator-option $wopt --xlator-option $bopt --xlator-option $ropt --xlator-option $sopt --xlator-option $clopt $lopt $popt'";</div><div class='add'>+        fi</div><div class='add'>+    done</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function start_glusterd() {</div><div class='add'>+    local g</div><div class='add'>+    local index=$1</div><div class='add'>+</div><div class='add'>+    g="glusterd_${index}"</div><div class='add'>+    ${!g}</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function start_glusterds() {</div><div class='add'>+    for i in `seq 1 $CLUSTER_COUNT`; do</div><div class='add'>+        start_glusterd $i</div><div class='add'>+    done</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+function kill_glusterd() {</div><div class='add'>+    local index=$1;</div><div class='add'>+    local b;</div><div class='add'>+    local pidfile;</div><div class='add'>+</div><div class='add'>+    b="B$index";</div><div class='add'>+    pidfile="${!b}/glusterd.pid";</div><div class='add'>+</div><div class='add'>+    kill `cat $pidfile`;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function restart_glusterd() {</div><div class='add'>+    local index=$1</div><div class='add'>+    local b</div><div class='add'>+    local pidfile</div><div class='add'>+    local g</div><div class='add'>+</div><div class='add'>+    b="B$index"</div><div class='add'>+    pidfile="${!b}/glusterd.pid"</div><div class='add'>+</div><div class='add'>+    kill `cat $pidfile`</div><div class='add'>+</div><div class='add'>+    g="glusterd_${index}"</div><div class='add'>+    ${!g}</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function kill_node() {</div><div class='add'>+    local index=$1;</div><div class='add'>+    local h;</div><div class='add'>+</div><div class='add'>+    h="H$index";</div><div class='add'>+</div><div class='add'>+    terminate_pids $(ps -ef | grep gluster | grep ${!h} | awk '{print $2}')</div><div class='add'>+    find $B0/$index/glusterd/vols -name '*.pid' | xargs rm -f</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+function define_hosts() {</div><div class='add'>+    local count=$1;</div><div class='add'>+</div><div class='add'>+    for i in `seq 1 $count`; do</div><div class='add'>+        eval "H_$i=${CLUSTER_PFX}.$i"</div><div class='add'>+        eval "H$i=${CLUSTER_PFX}.$i";</div><div class='add'>+        case $OSTYPE in</div><div class='add'>+        NetBSD)</div><div class='add'>+                ifconfig lo0 alias ${CLUSTER_PFX}.$i 2&gt;/dev/null</div><div class='add'>+                ;;</div><div class='add'>+        *)</div><div class='add'>+                ;;</div><div class='add'>+        esac</div><div class='add'>+    done</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+function define_clis() {</div><div class='add'>+    local count=$1;</div><div class='add'>+    local h;</div><div class='add'>+</div><div class='add'>+    for i in `seq 1 $count`; do</div><div class='add'>+        b="B$i";</div><div class='add'>+        #get the logdir</div><div class='add'>+        logdir=`gluster --print-logdir`</div><div class='add'>+        #Fetch the testcases name and prefix the cli log with it</div><div class='add'>+        logfile=`echo ${0##*/}`_cli$i.log</div><div class='add'>+        lopt="--log-file=$logdir/$logfile"</div><div class='add'>+        logfile1=`echo ${0##*/}`_cli_$i.log</div><div class='add'>+        lopt1="--log-file=$logdir/$logfile1"</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+        if [ "$2" == "-NO_FORCE" ]; then</div><div class='add'>+                eval "CLI_$i='$CLI_NO_FORCE --glusterd-sock=${!b}/glusterd/gd.sock $lopt'";</div><div class='add'>+                eval "CLI$i='$CLI_NO_FORCE --glusterd-sock=${!b}/glusterd/gd.sock $lopt1'";</div><div class='add'>+        else</div><div class='add'>+                eval "CLI_$i='$CLI --glusterd-sock=${!b}/glusterd/gd.sock $lopt'";</div><div class='add'>+                eval "CLI$i='$CLI --glusterd-sock=${!b}/glusterd/gd.sock $lopt1'";</div><div class='add'>+        fi</div><div class='add'>+    done</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function peer_count() {</div><div class='add'>+    $CLI_1 peer status | grep 'Peer in Cluster (Connected)' | wc -l</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function attempt_replace_brick {</div><div class='add'>+    local cli_no=$1</div><div class='add'>+    local vol=$2;</div><div class='add'>+    local src_brick=$3;</div><div class='add'>+    local dst_brick=$4;</div><div class='add'>+</div><div class='add'>+    eval \$CLI_$cli_no volume replace-brick $vol $src_brick $dst_brick commit force;</div><div class='add'>+    echo $?</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function cluster_rebalance_status_field {</div><div class='add'>+        #The rebalance status can be up to 3 words, (e.g.:'fix-layout in progress'), hence the awk-print $7 thru $9.</div><div class='add'>+        #But if the status is less than 3 words, it also prints the next field i.e the run_time_in_secs.(e.g.:'completed 3.00').</div><div class='add'>+        #So we trim the numbers out with  `tr`. Finally remove the trailing white spaces with sed. What we get is one of the</div><div class='add'>+        #strings in the 'cli_vol_task_status_str' char array of cli-rpc-ops.c</div><div class='add'>+</div><div class='add'>+        eval  \$CLI_$1 volume rebalance $2 status | awk '{print $7,$8,$9}' |sed -n 3p |tr -d '[^0-9+\.]'|sed 's/ *$//g'</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function cluster_volinfo_field()</div><div class='add'>+{</div><div class='add'>+    local vol=$2;</div><div class='add'>+    local field=$3;</div><div class='add'>+    eval  \$CLI_$1  volume info $vol | grep "^$field: " | sed 's/.*: //';</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function volinfo_field_1()</div><div class='add'>+{</div><div class='add'>+    local vol=$1;</div><div class='add'>+    local field=$2;</div><div class='add'>+</div><div class='add'>+    $CLI_1 volume info $vol | grep "^$field: " | sed 's/.*: //';</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function volinfo_field_2()</div><div class='add'>+{</div><div class='add'>+    local vol=$1;</div><div class='add'>+    local field=$2;</div><div class='add'>+</div><div class='add'>+    $CLI_2 volume info $vol | grep "^$field: " | sed 's/.*: //';</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function cluster_brick_up_status {</div><div class='add'>+        local vol=$2</div><div class='add'>+        local host=$3</div><div class='add'>+        local brick=$4</div><div class='add'>+        eval \$CLI_$1 volume status $vol $host:$brick --xml | sed -ne 's/.*&lt;status&gt;\([01]\)&lt;\/status&gt;/\1/p'</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function cluster_remove_brick_status_completed_field {</div><div class='add'>+        local vol=$1</div><div class='add'>+        local brick_list=$2</div><div class='add'>+        $CLI_1 volume remove-brick $vol $brick_list status | awk '{print $7}' | sed -n 3p</div><div class='add'>+}</div><div class='head'>diff --git a/tests/common-utils.rc b/tests/common-utils.rc<br/>new file mode 100644<br/>index 00000000000..2be4076e8b6<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/common-utils.rc?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/common-utils.rc</a></div><div class='hunk'>@@ -0,0 +1,7 @@</div><div class='add'>+</div><div class='add'>+function run_cmd_as_user {</div><div class='add'>+        local user=$1</div><div class='add'>+        shift</div><div class='add'>+        su -m $user -c "$*" || return 1</div><div class='add'>+    return 0</div><div class='add'>+}</div><div class='head'>diff --git a/tests/configfiles/bad_exports b/tests/configfiles/bad_exports<br/>new file mode 100644<br/>index 00000000000..6fd18d9415a<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/configfiles/bad_exports?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/configfiles/bad_exports</a></div><div class='hunk'>@@ -0,0 +1,9 @@</div><div class='add'>+#$Id$</div><div class='add'>+#/0838586658093758013308385866580937580133083858665809375801330838586658093758013308385866580937580133083858665809375801330838586658093758013308385866580937580133   @test(sec=sys,rw,anonuid=0) 10.35.11.32(sec=sys,rw,anonuid=0)</div><div class='add'>+</div><div class='add'>+/test  @test(sec=sys,rw,anonuid=0) shreyas.facebook.com(sec=sys,rw,anonuid=0) shreyas.s(sec=sys,rw,anonuid=595)</div><div class='add'>+Ã§Ã§Ã§ÃŸÃ¥ÃŸÃ¥Æ’Æ’</div><div class='add'>+/asdf @ObVyg571RJaorkGbgVerI9esrck8yiVD7NVqqJvj2H9DuPH3SzHnYLIXjd4zZjuuh2N0O0bYYQf7VYNrYHoxc1llgRU1iEsQRy2XaWnUlhTHKVEL8tt1TrbZCi8qXyg0l058rTnW4msvU5hW83ESwyOE4bBSz4VsW0sJaVd8Gv4waZqojemLN8AIlAoChVOfP1yhuAP1298ejkaf2fjhdfa4t4effhgadff342fdddgasdg42gahgdmnui24290hfjdjadgdkjhg2nvncms(sec=sys,rw,anonuid=1)</div><div class='add'>+#/vol/root   -sec=sys,rw=@storage.prn1:@storage.ash4:@storage.frc1,anon=0</div><div class='add'>+#/vol/home107    -sec=sys,rw,nosuid,root=@storage.prn1:@storage.ash4:@storage.frc1:@hr.ash3:@hr.prn1:ldap001.prn1.facebook.com:ldap001.frc1.facebook.com</div><div class='add'>+#/vol/home109    -sec=sys,rw,nosuid,root=@storage.prn1:@storage.ash4:@storage.frc1:@hr.ash3:@hr.prn1:ldap001.prn1.facebook.com:ldap001.frc1.facebook.com</div><div class='head'>diff --git a/tests/configfiles/bad_netgroups b/tests/configfiles/bad_netgroups<br/>new file mode 100644<br/>index 00000000000..ea27edfef10<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/configfiles/bad_netgroups?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/configfiles/bad_netgroups</a></div><div class='hunk'>@@ -0,0 +1,5 @@</div><div class='add'>+asdf ng1</div><div class='add'>+ng1 ng2</div><div class='add'>+ng2 (dev1763.prn2.facebook.com,  ,)</div><div class='add'>+</div><div class='add'>+emptyng</div><div class='head'>diff --git a/tests/configfiles/big_exports b/tests/configfiles/big_exports<br/>new file mode 100644<br/>index 00000000000..9ca5d655664<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/configfiles/big_exports?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/configfiles/big_exports</a></div><div class='hunk'>@@ -0,0 +1,10 @@</div><div class='add'>+/75213U8JV58PBY7F0VFGJ080MH3K71 @ZXV3UE7WJSCZSPMPAYUBACCZUOD0XY(sec=sys,rw,anonuid=0) 9PAC2KCTKRIH62CPGAMAUAJGLVQNS3(sec=sys,rw,anonuid=0)</div><div class='add'>+/O4DYT8D6QVS9EKEHTYOPTYL6IWU4DN @KLBH3LB3UN5LWDWPPQEQWEHYVL3K0A(sec=sys,rw,anonuid=0) B37PXMCQMY5IQPDGV08XC7ITYT650V(sec=sys,rw,anonuid=0)</div><div class='add'>+/OFHJLTKZMDAN28Q9IQQQIPFUEZ2YAN @UY3K3B8C05OQ4OTX42VXQKJ2CGJ8QX(sec=sys,rw,anonuid=0) AM0ET70HT6YND7D8RKG446LEOW40EC(sec=sys,rw,anonuid=0)</div><div class='add'>+/3VDZ2JHFQ2JGF2GQGYQH38UPAW6A6T @DEPUVDYZOJFCSQ7KD07NVPAFGEG7YJ(sec=sys,rw,anonuid=0) 5HI538NCEYF7KY7HC1F69UBWFVTIGA(sec=sys,rw,anonuid=0)</div><div class='add'>+/4ZI3ZRJUNQM21ZM8VB891X4ZCUHK7E @7U8TNSZ55AWJAOPAIV67OGPWLGM4JV(sec=sys,rw,anonuid=0) 8698JR9V4KKENE7UGYHV3T4XG9K0NH(sec=sys,rw,anonuid=0)</div><div class='add'>+/A4CSZ2FQ3VYPT9R0HYN3QVQ7TK9IHI @G2Z45H649YZ9WNC3OSU7STCLT3VWT9(sec=sys,rw,anonuid=0) 65CA94Z7JXZ0F0JB5EP95I6FBJT673(sec=sys,rw,anonuid=0)</div><div class='add'>+/G91PI0EX5TUYSX91IAH49M1GEMNKSP @O5IFIYJUENNNK16U0FK0QCDE0DK9G2(sec=sys,rw,anonuid=0) A8AZTTWC7BMTV8YW8XE4R57WUOSUMZ(sec=sys,rw,anonuid=0)</div><div class='add'>+/YCZFA0ALYC284R60E7QXQN7AVSILFO @7OGJV2J1NOII7UOGN12SUNRW3XBWWG(sec=sys,rw,anonuid=0) HDCDTY43SXOAH1TNUKB23MO9DE574W(sec=sys,rw,anonuid=0)</div><div class='add'>+/VBGB57O8R87B9N4E8QPGU6D55DVZE5 @F95KY58VAUOUX30QKIN16U987UU9BE(sec=sys,rw,anonuid=0) WGSH35L15FT2IC0IT9PTCU8SCYW9W4(sec=sys,rw,anonuid=0)</div><div class='add'>+/NTHST2FDSP35BKEEIOQIQX38722AN0 @T9BXSDXF2N5HVOM8P1BN0Q5IQ6RC34(sec=sys,rw,anonuid=0) OLJR1KXJRY14UEZNV1LP7RV68KPIW7(sec=sys,rw,anonuid=0)</div><div class='head'>diff --git a/tests/configfiles/exports b/tests/configfiles/exports<br/>new file mode 100644<br/>index 00000000000..82ba450403e<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/configfiles/exports?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/configfiles/exports</a></div><div class='hunk'>@@ -0,0 +1 @@</div><div class='add'>+/test  @test(sec=sys,rw,anonuid=0)  10.35.11.31(sec=sys,rw,anonuid=0)</div><div class='head'>diff --git a/tests/configfiles/exports-v6 b/tests/configfiles/exports-v6<br/>new file mode 100644<br/>index 00000000000..426b1ef5705<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/configfiles/exports-v6?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/configfiles/exports-v6</a></div><div class='hunk'>@@ -0,0 +1 @@</div><div class='add'>+/test @test(rw,anonuid=0,sec=sys,) 2401:db00:11:1:face:0:3d:0(rw,anonuid=0,sec=sys,)</div><div class='head'>diff --git a/tests/configfiles/exports_bad_opt b/tests/configfiles/exports_bad_opt<br/>new file mode 100644<br/>index 00000000000..70a56890e4c<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/configfiles/exports_bad_opt?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/configfiles/exports_bad_opt</a></div><div class='hunk'>@@ -0,0 +1 @@</div><div class='add'>+/groot  asdf(r) @ngtop(r)</div><div class='head'>diff --git a/tests/configfiles/netgroups b/tests/configfiles/netgroups<br/>new file mode 100644<br/>index 00000000000..f1f5fcdc145<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/configfiles/netgroups?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/configfiles/netgroups</a></div><div class='hunk'>@@ -0,0 +1,4 @@</div><div class='add'>+asdf ng1</div><div class='add'>+ng1 ng2</div><div class='add'>+ng2 (dev1763.prn2.example.com,,)</div><div class='add'>+ng3 (dev-1763.prn-2.example.com,,)</div><div class='head'>diff --git a/tests/dht.rc b/tests/dht.rc<br/>new file mode 100644<br/>index 00000000000..6918ebde04b<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/dht.rc?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/dht.rc</a></div><div class='hunk'>@@ -0,0 +1,174 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+dhthashdebugxattr="dht.file.hashed-subvol."</div><div class='add'>+</div><div class='add'>+function get_layout()</div><div class='add'>+{</div><div class='add'>+        getfattr -n trusted.glusterfs.dht -e hex $1 2&gt;&amp;1 | grep dht | cut -d = -f2</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+## populates $BRICK1 and $BRICK2 with hashed/cached subvolume. These will be</div><div class='add'>+## used by get_cached_brick and get_hashed_brick</div><div class='add'>+</div><div class='add'>+function file_has_linkfile()</div><div class='add'>+{</div><div class='add'>+        k=0</div><div class='add'>+        l=0</div><div class='add'>+        while [ $k -lt $BRICK_COUNT ]</div><div class='add'>+        do</div><div class='add'>+                stat=$(stat $B0/${V0}$k/$1 2&gt;/dev/null)</div><div class='add'>+                if [ $? -eq 0 ]</div><div class='add'>+                then</div><div class='add'>+                        let l++</div><div class='add'>+                        let "BRICK${l}=$k"</div><div class='add'>+</div><div class='add'>+                fi</div><div class='add'>+                let k++</div><div class='add'>+        done</div><div class='add'>+        return $l</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function get_cached_brick()</div><div class='add'>+{</div><div class='add'>+        i=1</div><div class='add'>+        brick=$BRICK1</div><div class='add'>+        while [ $i -lt 3 ]</div><div class='add'>+        do</div><div class='add'>+                test=$(getfattr -n trusted.glusterfs.dht.linkto -e text $B0/${V0}$brick/$1 2&gt;&amp;1)</div><div class='add'>+                if [ $? -eq 1 ]</div><div class='add'>+                then</div><div class='add'>+                        cached=$brick</div><div class='add'>+                        i=$(( $i+3 ))</div><div class='add'>+                fi</div><div class='add'>+                brick=$BRICK1</div><div class='add'>+                let i++</div><div class='add'>+        done</div><div class='add'>+</div><div class='add'>+        return $cached</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function get_hashed_brick()</div><div class='add'>+{</div><div class='add'>+        j=1</div><div class='add'>+        brick=$BRICK1</div><div class='add'>+        while [ $j -lt 3 ]</div><div class='add'>+        do</div><div class='add'>+                test=$(getfattr -n trusted.glusterfs.dht.linkto -e text $B0/${V0}$brick/$1 2&gt;&amp;1)</div><div class='add'>+                if [ $? -eq 0 ]</div><div class='add'>+                then</div><div class='add'>+                        hashed=$brick</div><div class='add'>+                        j=$(( $j+3 ))</div><div class='add'>+                fi</div><div class='add'>+                brick=$BRICK2</div><div class='add'>+                let j++</div><div class='add'>+        done</div><div class='add'>+</div><div class='add'>+        return $hashed</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+function cluster_rebalance_completed()</div><div class='add'>+{</div><div class='add'>+       val=1</div><div class='add'>+</div><div class='add'>+       # Rebalance status will be either "failed" or "completed"</div><div class='add'>+</div><div class='add'>+       test=$($CLI_1 volume rebalance $V0 status | grep "in progress" 2&gt;&amp;1)</div><div class='add'>+       if [ $? -ne 0 ]</div><div class='add'>+       then</div><div class='add'>+               val=0</div><div class='add'>+       fi</div><div class='add'>+</div><div class='add'>+       echo $val</div><div class='add'>+       # Do not *return* the value here.  If it's non-zero, that will cause</div><div class='add'>+       # EXPECT_WITHIN (e.g. in bug-884455.t) to return prematurely, leading to</div><div class='add'>+       # a spurious test failure.  Nothing else checks the return value anyway</div><div class='add'>+       # (they all check the output) so there's no need for it to be non-zero</div><div class='add'>+       # just because grep didn't find what we want.</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function rebalance_completed()</div><div class='add'>+{</div><div class='add'>+       val=1</div><div class='add'>+       test=$($CLI volume rebalance $V0 status | grep localhost | grep "completed" 2&gt;&amp;1)</div><div class='add'>+       if [ $? -eq 0 ]</div><div class='add'>+       then</div><div class='add'>+               val=0</div><div class='add'>+       fi</div><div class='add'>+</div><div class='add'>+       echo $val</div><div class='add'>+       # Do not *return* the value here.  If it's non-zero, that will cause</div><div class='add'>+       # EXPECT_WITHIN (e.g. in bug-884455.t) to return prematurely, leading to</div><div class='add'>+       # a spurious test failure.  Nothing else checks the return value anyway</div><div class='add'>+       # (they all check the output) so there's no need for it to be non-zero</div><div class='add'>+       # just because grep didn't find what we want.</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function remove_brick_completed()</div><div class='add'>+{</div><div class='add'>+       val=1</div><div class='add'>+       test=$(gluster volume remove-brick $V0 $H0:$B0/${V0}2 status | grep localhost | grep "completed" 2&gt;&amp;1)</div><div class='add'>+       if [ $? -eq 0 ]</div><div class='add'>+       then</div><div class='add'>+                val=0</div><div class='add'>+       fi</div><div class='add'>+</div><div class='add'>+       echo $val</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function dht_get_linkto_target()</div><div class='add'>+{</div><div class='add'>+        local path=$1;</div><div class='add'>+        echo $(getfattr -e text --only-values --absolute-names -n trusted.glusterfs.dht.linkto $path)</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function is_dht_linkfile()</div><div class='add'>+{</div><div class='add'>+        local path=$1</div><div class='add'>+        retval=0</div><div class='add'>+        local output=$(stat -c %a $path)</div><div class='add'>+        if [ $output -eq 1000 ]; then</div><div class='add'>+                 retval=1</div><div class='add'>+        fi</div><div class='add'>+</div><div class='add'>+        echo $retval</div><div class='add'>+        return $retval</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+# Given an existing directory on the volume, get the hashed subvol for a file</div><div class='add'>+# in that directory</div><div class='add'>+# Input: filename dirpath_on_mount</div><div class='add'>+</div><div class='add'>+function dht_get_hash_subvol()</div><div class='add'>+{</div><div class='add'>+        local hashed_subvol</div><div class='add'>+        hashed_subvol=$(getfattr --only-values -n "$dhthashdebugxattr$1" $2 2&gt;/dev/null)</div><div class='add'>+        echo $hashed_subvol</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+# Find the first filename that hashes to the same subvol</div><div class='add'>+# as $1</div><div class='add'>+# Input: subvol_name dirpath_on_mount file_pattern</div><div class='add'>+</div><div class='add'>+function dht_first_filename_with_hashsubvol()</div><div class='add'>+{</div><div class='add'>+        local in_subvol=$1</div><div class='add'>+        local in_path=$2</div><div class='add'>+        local in_hash_subvol</div><div class='add'>+        local file_pattern=$3</div><div class='add'>+        local filename</div><div class='add'>+</div><div class='add'>+        for i in {1..50}</div><div class='add'>+        do</div><div class='add'>+               filename="$file_pattern$i"</div><div class='add'>+               in_hash_subvol=$(dht_get_hash_subvol "$filename" "$in_path")</div><div class='add'>+        #       echo $in_hash_subvol</div><div class='add'>+               if [ "$in_subvol" == "$in_hash_subvol" ]; then</div><div class='add'>+                        fn_return_val=$filename</div><div class='add'>+                        return 0</div><div class='add'>+               fi</div><div class='add'>+        done</div><div class='add'>+        return 1</div><div class='add'>+}</div><div class='head'>diff --git a/tests/ec.rc b/tests/ec.rc<br/>new file mode 100644<br/>index 00000000000..f18752fc99a<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/ec.rc?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/ec.rc</a></div><div class='hunk'>@@ -0,0 +1,18 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+function ec_up_status()</div><div class='add'>+{</div><div class='add'>+        local v=$1</div><div class='add'>+        local m=$2</div><div class='add'>+        local ec_id=$3</div><div class='add'>+        grep -E "^up =" $m/.meta/graphs/active/${v}-disperse-${ec_id}/private | cut -f2 -d'='</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function ec_option_value()</div><div class='add'>+{</div><div class='add'>+    local v=$1</div><div class='add'>+    local m=$2</div><div class='add'>+    local ec_id=$3</div><div class='add'>+    local opt=$4</div><div class='add'>+    grep -E "^$opt =" $m/.meta/graphs/active/${v}-disperse-${ec_id}/private | cut -f2 -d'='| awk '{print $1}'</div><div class='add'>+}</div><div class='head'>diff --git a/tests/env.rc.in b/tests/env.rc.in<br/>new file mode 100644<br/>index 00000000000..0478d66aec6<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/env.rc.in?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/env.rc.in</a></div><div class='hunk'>@@ -0,0 +1,42 @@</div><div class='add'>+prefix=@prefix@</div><div class='add'>+exec_prefix=@exec_prefix@</div><div class='add'>+libdir=@libdir@</div><div class='add'>+</div><div class='add'>+PATH=@bindir@:@sbindir@:$PATH</div><div class='add'>+export PATH</div><div class='add'>+</div><div class='add'>+GLUSTERD_PIDFILEDIR=@localstatedir@/run/gluster</div><div class='add'>+export GLUSTERD_PIDFILEDIR</div><div class='add'>+</div><div class='add'>+LD_LIBRARY_PATH=@libdir@:$LD_LIBRARY_PATH</div><div class='add'>+export LD_LIBRARY_PATH</div><div class='add'>+</div><div class='add'>+LIBRARY_PATH=@libdir@:$LIBRARY_PATH</div><div class='add'>+export LIBRARY_PATH</div><div class='add'>+</div><div class='add'>+CPATH=@includedir@:$CPATH</div><div class='add'>+export CPATH</div><div class='add'>+</div><div class='add'>+GLUSTERD_WORKDIR=@GLUSTERD_WORKDIR@</div><div class='add'>+export GLUSTERD_WORKDIR</div><div class='add'>+</div><div class='add'>+PKG_CONFIG_PATH=@pkgconfigdir@:$PKG_CONFIG_PATH</div><div class='add'>+export PKG_CONFIG_PATH</div><div class='add'>+</div><div class='add'>+PYTHONPATH=@BUILD_PYTHON_SITE_PACKAGES@:$PYTHON_PATH</div><div class='add'>+export PYTHONPATH</div><div class='add'>+</div><div class='add'>+PYTHON=@PYTHON@</div><div class='add'>+export PYTHON</div><div class='add'>+</div><div class='add'>+PYTHONPATH=@BUILD_PYTHON_SITE_PACKAGES@:$PYTHON_PATH</div><div class='add'>+export PYTHONPATH</div><div class='add'>+</div><div class='add'>+GLUSTER_CMD_DIR=@sbindir@</div><div class='add'>+export GLUSTER_CMD_DIR</div><div class='add'>+</div><div class='add'>+GLUSTER_LIBEXECDIR=@GLUSTERFS_LIBEXECDIR@</div><div class='add'>+export GLUSTER_LIBEXECDIR</div><div class='add'>+</div><div class='add'>+RUN_NFS_TESTS=@BUILD_GNFS@</div><div class='add'>+export RUN_NFS_TESTS</div><div class='head'>diff --git a/tests/experimental/.gitignore b/tests/experimental/.gitignore<br/>new file mode 100644<br/>index 00000000000..803908720af<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/experimental/.gitignore?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/experimental/.gitignore</a></div><div class='hunk'>@@ -0,0 +1,7 @@</div><div class='add'>+# Initial commit, git needs a file to add a directory</div><div class='add'>+# First tests to appear here, should remove this file</div><div class='add'>+# Directives:</div><div class='add'>+# Ignore everything in this directory</div><div class='add'>+*</div><div class='add'>+# Except this file</div><div class='add'>+!.gitignore</div><div class='head'>diff --git a/tests/fallocate.rc b/tests/fallocate.rc<br/>new file mode 100644<br/>index 00000000000..d117ba9c051<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/fallocate.rc?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/fallocate.rc</a></div><div class='hunk'>@@ -0,0 +1,19 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+# Helper to verify a given fallocate command is supported and skip a test</div><div class='add'>+# otherwise. Older versions of the fallocate utility might not support all modes</div><div class='add'>+# (i.e., discard) and older versions of fuse might not support the associated</div><div class='add'>+# fallocate requests.</div><div class='add'>+</div><div class='add'>+function require_fallocate()</div><div class='add'>+{</div><div class='add'>+        output=`fallocate $* 2&gt;&amp;1`</div><div class='add'>+        ret=$?</div><div class='add'>+        if [ ! $ret -eq 0 ] &amp;&amp; ([[ $output == *unsupported* ]] ||</div><div class='add'>+                                [[ $output == *invalid* ]] ||</div><div class='add'>+                                [[ $output == *"not supported"* ]])</div><div class='add'>+        then</div><div class='add'>+                SKIP_TESTS</div><div class='add'>+                exit</div><div class='add'>+        fi</div><div class='add'>+}</div><div class='head'>diff --git a/tests/fdl.rc b/tests/fdl.rc<br/>new file mode 100644<br/>index 00000000000..df58305b923<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/fdl.rc?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/fdl.rc</a></div><div class='hunk'>@@ -0,0 +1,12 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+log_base=$($CLI --print-logdir)</div><div class='add'>+log_id=${B0}/${V0}-0</div><div class='add'>+log_id=${log_id:1}     # Remove initial slash</div><div class='add'>+log_id=${log_id//\//-} # Replace remaining slashes with dashes</div><div class='add'>+FDL_META_FILE=${log_base}/${log_id}-meta-1.jnl</div><div class='add'>+FDL_DATA_FILE=${log_base}/${log_id}-data-1.jnl</div><div class='add'>+</div><div class='add'>+check_logfile() {</div><div class='add'>+        [ $(gf_logdump $FDL_META_FILE $FDL_DATA_FILE | grep $1 | wc -l) -ge $2 ]</div><div class='add'>+}</div><div class='head'>diff --git a/tests/features/delay-gen.t b/tests/features/delay-gen.t<br/>new file mode 100755<br/>index 00000000000..72e6dbb7697<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/features/delay-gen.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/features/delay-gen.t</a></div><div class='hunk'>@@ -0,0 +1,52 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../include.rc</div><div class='add'>+. $(dirname $0)/../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/${V0}1</div><div class='add'>+</div><div class='add'>+EXPECT "$V0" volinfo_field $V0 'Volume Name'</div><div class='add'>+EXPECT 'Created' volinfo_field $V0 'Status'</div><div class='add'>+</div><div class='add'>+TEST $CLI volume set $V0 delay-gen posix</div><div class='add'>+TEST $CLI volume set $V0 delay-gen.delay-duration 1000000</div><div class='add'>+TEST $CLI volume set $V0 delay-gen.delay-percentage 100</div><div class='add'>+TEST $CLI volume set $V0 delay-gen.enable read,write</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+EXPECT 'Started' volinfo_field $V0 'Status'</div><div class='add'>+</div><div class='add'>+TEST $CLI volume profile $V0 start</div><div class='add'>+## Mount FUSE with caching disabled (read-write)</div><div class='add'>+TEST $GFS -s $H0 --volfile-id $V0 $M0</div><div class='add'>+</div><div class='add'>+TEST dd if=/dev/zero of=$M0/1 count=1 bs=128k oflag=sync</div><div class='add'>+</div><div class='add'>+#Write should take at least a second</div><div class='add'>+write_max_latency=$($CLI volume profile $V0 info | grep WRITE | awk 'BEGIN {max = 0} {if ($6 &gt; max) max=$6;} END {print max}' | cut -d. -f 1 | egrep "[0-9]{7,}")</div><div class='add'>+</div><div class='add'>+#Create should not take a second</div><div class='add'>+create_max_latency=$($CLI volume profile $V0 info | grep CREATE | awk 'BEGIN {max = 0} {if ($6 &gt; max) max=$6;} END {print max}' | cut -d. -f 1 | egrep "[0-9]{7,}")</div><div class='add'>+</div><div class='add'>+TEST [ ! -z $write_max_latency ];</div><div class='add'>+TEST [ -z $create_max_latency ];</div><div class='add'>+</div><div class='add'>+# Not providing a particular fop will make it test everything</div><div class='add'>+TEST $CLI volume reset $V0 delay-gen.enable</div><div class='add'>+TEST $CLI volume set $V0 delay-gen.delay-duration 100</div><div class='add'>+</div><div class='add'>+cp $(dirname ${0})/../basic/gfapi/glfsxmp-coverage.c glfsxmp.c</div><div class='add'>+build_tester ./glfsxmp.c -lgfapi</div><div class='add'>+./glfsxmp $V0 $H0 &gt;/dev/null</div><div class='add'>+cleanup_tester ./glfsxmp</div><div class='add'>+rm ./glfsxmp.c</div><div class='add'>+</div><div class='add'>+$(dirname $0)/../basic/rpc-coverage.sh $M0 &gt;/dev/null</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+#G_TESTDEF_TEST_STATUS_NETBSD7=1501397</div><div class='head'>diff --git a/tests/features/dh1024.pem b/tests/features/dh1024.pem<br/>new file mode 100644<br/>index 00000000000..fe514bd4ee5<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/features/dh1024.pem?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/features/dh1024.pem</a></div><div class='hunk'>@@ -0,0 +1,5 @@</div><div class='add'>+-----BEGIN DH PARAMETERS-----</div><div class='add'>+MIGHAoGBAL2k+efZ6g50PpL41G96IaRw2OTH921yhHMNSXBE/K+R6oTkJFcNJs1N</div><div class='add'>+q+a1Ko2xCBDa5MgvudqWep6PvE06rzEaJPW8ITdu8j3Eo9T1rorJ3CctpE/CaRl2</div><div class='add'>+7v4DNe+Mho6q1MPlG5PfXEZWgbT7tjn/Y6lwD/B2CoMzAx+4DXgbAgEC</div><div class='add'>+-----END DH PARAMETERS-----</div><div class='head'>diff --git a/tests/features/fdl-overflow.t b/tests/features/fdl-overflow.t<br/>new file mode 100644<br/>index 00000000000..34b941d2f2a<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/features/fdl-overflow.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/features/fdl-overflow.t</a></div><div class='hunk'>@@ -0,0 +1,72 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../include.rc</div><div class='add'>+. $(dirname $0)/../volume.rc</div><div class='add'>+. $(dirname $0)/../fdl.rc</div><div class='add'>+</div><div class='add'>+_check_sizes () {</div><div class='add'>+	local n=0</div><div class='add'>+	local sz</div><div class='add'>+	local total_sz=0</div><div class='add'>+</div><div class='add'>+	# We don't care about the sizes of the meta files.  That would be</div><div class='add'>+	# embedding too much of the implementation into the test.</div><div class='add'>+	n=$(ls ${log_base}/${log_id}-meta-*.jnl | wc -l)</div><div class='add'>+	[ $n = 2 ] || return 1</div><div class='add'>+</div><div class='add'>+	# We *do* care about the sizes of the data files, which should exactly</div><div class='add'>+	# reflect the amount of data written via dd.</div><div class='add'>+	n=0</div><div class='add'>+	while read sz name; do</div><div class='add'>+                G_LOG "found journal ${name} size ${sz}MB"</div><div class='add'>+		n=$((n+1))</div><div class='add'>+		total_sz=$((total_sz+sz))</div><div class='add'>+	done &lt; &lt;(du -sm ${log_base}/${log_id}-data-*.jnl)</div><div class='add'>+	[ $n = 2 ] || return 1</div><div class='add'>+	# On our CentOS and NetBSD regression-test systems, but not on my Fedora</div><div class='add'>+	# development system, each file ends up being slightly larger than its</div><div class='add'>+	# data size because of metadata, and 'du' rounds that up to a full extra</div><div class='add'>+	# megabyte.  We'll allow either result, because what we're really</div><div class='add'>+	# looking for is a complete failure to roll over from one file to</div><div class='add'>+	# another at the appropriate size.</div><div class='add'>+	[ $total_sz = 20 -o $total_sz = $((n+20)) ] || return 1</div><div class='add'>+</div><div class='add'>+	return 0</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+check_sizes () {</div><div class='add'>+	set -x</div><div class='add'>+	_check_sizes</div><div class='add'>+	ret=$?</div><div class='add'>+	set +x</div><div class='add'>+	return ret</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+if [ x"$OSTYPE" = x"NetBSD" ]; then</div><div class='add'>+        CREAT_OFLAG="creat,"</div><div class='add'>+else</div><div class='add'>+        CREAT_OFLAG=""</div><div class='add'>+fi</div><div class='add'>+</div><div class='add'>+TEST rm -f ${log_base}/${log_id}-*.log</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+</div><div class='add'>+# Get a simple volume set up and mounted with FDL active.</div><div class='add'>+TEST $CLI volume create $V0 ${H0}:${B0}/${V0}-0</div><div class='add'>+TEST $CLI volume set $V0 changelog.changelog off</div><div class='add'>+TEST $CLI volume set $V0 features.fdl on</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+TEST $GFS -s $H0 --volfile-id $V0 $M0</div><div class='add'>+</div><div class='add'>+# Generate some I/O and unmount/stop so we can see log sizes.</div><div class='add'>+TEST dd if=/dev/zero of=$M0/twentyMB bs=1048576 count=20 \</div><div class='add'>+     oflag=${CREAT_OFLAG}sync</div><div class='add'>+TEST umount $M0</div><div class='add'>+TEST $CLI volume stop $V0</div><div class='add'>+</div><div class='add'>+TEST _check_sizes</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='add'>+#G_TESTDEF_TEST_STATUS_CENTOS6=KNOWN_ISSUE,BUG=1385758</div><div class='add'>+#G_TESTDEF_TEST_STATUS_NETBSD7=KNOWN_ISSUE,BUG=1385758</div><div class='head'>diff --git a/tests/features/fdl.t b/tests/features/fdl.t<br/>new file mode 100644<br/>index 00000000000..5a3c13fc850<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/features/fdl.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/features/fdl.t</a></div><div class='hunk'>@@ -0,0 +1,44 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../include.rc</div><div class='add'>+. $(dirname $0)/../volume.rc</div><div class='add'>+. $(dirname $0)/../fdl.rc</div><div class='add'>+</div><div class='add'>+if [ x"$OSTYPE" = x"NetBSD" ]; then</div><div class='add'>+        CREAT_OFLAG="creat,"</div><div class='add'>+else</div><div class='add'>+        CREAT_OFLAG=""</div><div class='add'>+fi</div><div class='add'>+</div><div class='add'>+TEST rm -f $FDL_META_FILE $FDL_DATA_FILE</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+</div><div class='add'>+# Get a simple volume set up and mounted with FDL active.</div><div class='add'>+TEST $CLI volume create $V0 ${H0}:${B0}/${V0}-0</div><div class='add'>+TEST $CLI volume set $V0 changelog.changelog off</div><div class='add'>+TEST $CLI volume set $V0 features.fdl on</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+TEST $GFS -s $H0 --volfile-id $V0 $M0</div><div class='add'>+</div><div class='add'>+# Generate some I/O and unmount.</div><div class='add'>+TEST mkdir -p $M0/abc/def</div><div class='add'>+TEST dd if=/dev/zero of=$M0/abc/def/ghi bs=128 count=2 \</div><div class='add'>+     oflag=${CREAT_OFLAG}sync</div><div class='add'>+TEST chmod 314 $M0/abc/def/ghi</div><div class='add'>+TEST rm -rf $M0/abc</div><div class='add'>+TEST umount $M0</div><div class='add'>+</div><div class='add'>+# Check that gf_logdump works, and shows the ops we just issued.  There will be</div><div class='add'>+# more SETATTR ops than the one corresponding to our chmod, because some are</div><div class='add'>+# issued internally.  We have to guess a bit about where the log will be.</div><div class='add'>+TEST check_logfile GF_FOP_MKDIR 2</div><div class='add'>+TEST check_logfile GF_FOP_CREATE 1</div><div class='add'>+TEST check_logfile GF_FOP_WRITE 2</div><div class='add'>+TEST check_logfile GF_FOP_SETATTR 1</div><div class='add'>+TEST check_logfile GF_FOP_UNLINK 1</div><div class='add'>+TEST check_logfile GF_FOP_RMDIR 2</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='add'>+#G_TESTDEF_TEST_STATUS_CENTOS6=KNOWN_ISSUE,BUG=1385758</div><div class='add'>+#G_TESTDEF_TEST_STATUS_NETBSD7=KNOWN_ISSUE,BUG=1385758</div><div class='head'>diff --git a/tests/features/flock_interrupt.t b/tests/features/flock_interrupt.t<br/>new file mode 100644<br/>index 00000000000..b8717e30dfb<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/features/flock_interrupt.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/features/flock_interrupt.t</a></div><div class='hunk'>@@ -0,0 +1,32 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../include.rc</div><div class='add'>+. $(dirname $0)/../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+## Start and create a volume</div><div class='add'>+TEST glusterd;</div><div class='add'>+TEST pidof glusterd;</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/${V0}0;</div><div class='add'>+</div><div class='add'>+## Verify volume is is created</div><div class='add'>+EXPECT "$V0" volinfo_field $V0 'Volume Name';</div><div class='add'>+EXPECT 'Created' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+## Start volume and verify</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+EXPECT 'Started' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+TEST $GFS --volfile-id=$V0 --volfile-server=$H0 $M0;</div><div class='add'>+TEST touch $M0/testfile;</div><div class='add'>+</div><div class='add'>+echo &gt; got_lock</div><div class='add'>+flock $M0/testfile sleep 6 &amp; { sleep 0.3; flock -w 2 $M0/testfile true; echo ok &gt; got_lock; } &amp;</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN 4 ok cat got_lock;</div><div class='add'>+</div><div class='add'>+## Finish up</div><div class='add'>+rm -f got_lock;</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/features/fuse-lru-limit.t b/tests/features/fuse-lru-limit.t<br/>new file mode 100644<br/>index 00000000000..dd6be2d5397<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/features/fuse-lru-limit.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/features/fuse-lru-limit.t</a></div><div class='hunk'>@@ -0,0 +1,43 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../include.rc</div><div class='add'>+. $(dirname $0)/../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/${V0}{0,1}</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+TEST glusterfs -s $H0 --volfile-id $V0 $M0</div><div class='add'>+EXPECT_WITHIN ${PROCESS_UP_TIMEOUT} "2" online_brick_count</div><div class='add'>+</div><div class='add'>+EXPECT "1" get_mount_active_size_value $V0 $M0</div><div class='add'>+EXPECT "0" get_mount_lru_size_value $V0 $M0</div><div class='add'>+</div><div class='add'>+mkdir ${M0}/dir-{1..9}</div><div class='add'>+for i in {1..9}; do</div><div class='add'>+    for j in {1..1000}; do</div><div class='add'>+        echo "Test file" &gt; ${M0}/dir-$i/file-$j;</div><div class='add'>+    done;</div><div class='add'>+done</div><div class='add'>+lc=$(get_mount_lru_size_value $V0 ${M0})</div><div class='add'>+# ideally it should be 9000+</div><div class='add'>+TEST [ $lc -ge 9000 ]</div><div class='add'>+</div><div class='add'>+TEST umount $M0</div><div class='add'>+</div><div class='add'>+TEST glusterfs -s $H0 --volfile-id $V0 --lru-limit 1000 $M0</div><div class='add'>+</div><div class='add'>+TEST find $M0</div><div class='add'>+lc=$(get_mount_lru_size_value $V0 ${M0})</div><div class='add'>+# ideally it should be &lt;1000</div><div class='add'>+# Not sure if there are any possibilities of buffer need.</div><div class='add'>+TEST [ $lc -le 1000 ]</div><div class='add'>+</div><div class='add'>+TEST rm -rf $M0/*</div><div class='add'>+</div><div class='add'>+EXPECT "1" get_mount_active_size_value $V0 $M0</div><div class='add'>+EXPECT "0" get_mount_lru_size_value $V0 $M0</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/features/glfs-lease-recall.c b/tests/features/glfs-lease-recall.c<br/>new file mode 100644<br/>index 00000000000..9a60f9beec1<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/features/glfs-lease-recall.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/features/glfs-lease-recall.c</a></div><div class='hunk'>@@ -0,0 +1,372 @@</div><div class='add'>+#include &lt;glusterfs/api/glfs.h&gt;</div><div class='add'>+#include &lt;glusterfs/api/glfs-handles.h&gt;</div><div class='add'>+#include &lt;errno.h&gt;</div><div class='add'>+#include &lt;stdio.h&gt;</div><div class='add'>+#include &lt;stdlib.h&gt;</div><div class='add'>+#include &lt;string.h&gt;</div><div class='add'>+#include &lt;fcntl.h&gt;</div><div class='add'>+#include &lt;sys/stat.h&gt;</div><div class='add'>+</div><div class='add'>+/* Few rules:</div><div class='add'>+ * 1. A client may have multiple lease keys, but a lease key cannot be shared by</div><div class='add'>+ * multiple clients.</div><div class='add'>+ * 2. Lease key can be set before open, or in glfs_lease request. A lease key</div><div class='add'>+ * set like this is valid for the lifetime of the fd, i.e. a fd cannot have</div><div class='add'>+ * multiple lease key. But a lease key can be shared across multiple fds.</div><div class='add'>+ */</div><div class='add'>+glfs_t *client1 = NULL, *client2 = NULL;</div><div class='add'>+glfs_fd_t *fd1 = NULL;</div><div class='add'>+FILE *log_file = NULL;</div><div class='add'>+char lid1[GLFS_LEASE_ID_SIZE] = "lid1-clnt1",</div><div class='add'>+     lid2[GLFS_LEASE_ID_SIZE] = "lid2-clnt2";</div><div class='add'>+char lid3[GLFS_LEASE_ID_SIZE] = "lid3-clnt2", lid4[GLFS_LEASE_ID_SIZE] = {</div><div class='add'>+                                                  0,</div><div class='add'>+};</div><div class='add'>+char *volname = NULL, *glfs_log_file = NULL;</div><div class='add'>+int upcall_recv = 0;</div><div class='add'>+</div><div class='add'>+#define MAX_CLIENTS 4</div><div class='add'>+#define MAX_FDS 4</div><div class='add'>+#define TEST_FILE "/test/lease"</div><div class='add'>+#define SHUD_PASS 0</div><div class='add'>+#define SHUD_FAIL -1</div><div class='add'>+#define NONE 0</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+recall_cbk(struct glfs_lease lease, void *data);</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+set_read_lease(glfs_fd_t *fd, char ld[])</div><div class='add'>+{</div><div class='add'>+    struct glfs_lease lease = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    memset(&amp;lease, 0, sizeof(lease));</div><div class='add'>+    lease.cmd = GLFS_SET_LEASE;</div><div class='add'>+    lease.lease_type = GLFS_RD_LEASE;</div><div class='add'>+    memcpy(&amp;lease.lease_id, ld, GLFS_LEASE_ID_SIZE);</div><div class='add'>+    ret = glfs_lease(fd, &amp;lease, &amp;recall_cbk, fd);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(log_file, "\n    RD_LEASE failed with ret: %d (%s)", ret,</div><div class='add'>+                strerror(errno));</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+    fprintf(log_file, "\n    Took RD_LEASE");</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+set_write_lease(glfs_fd_t *fd, char ld[])</div><div class='add'>+{</div><div class='add'>+    struct glfs_lease lease = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    memset(&amp;lease, 0, sizeof(lease));</div><div class='add'>+    lease.cmd = GLFS_SET_LEASE;</div><div class='add'>+    lease.lease_type = GLFS_RW_LEASE;</div><div class='add'>+    memcpy(&amp;lease.lease_id, ld, GLFS_LEASE_ID_SIZE);</div><div class='add'>+    ret = glfs_lease(fd, &amp;lease, &amp;recall_cbk, NULL);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(log_file, "\n    RW_LEASE failed with ret: %d (%s)", ret,</div><div class='add'>+                strerror(errno));</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+    fprintf(log_file, "\n    Took RW_LEASE");</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+get_lease(glfs_fd_t *fd, char ld[])</div><div class='add'>+{</div><div class='add'>+    struct glfs_lease lease = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    memset(&amp;lease, 0, sizeof(lease));</div><div class='add'>+    lease.cmd = GLFS_GET_LEASE;</div><div class='add'>+    lease.lease_type = -1;</div><div class='add'>+    memcpy(&amp;lease.lease_id, ld, GLFS_LEASE_ID_SIZE);</div><div class='add'>+    ret = glfs_lease(fd, &amp;lease, &amp;recall_cbk, NULL);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(log_file, "\n    GET_LEASE failed with ret: %d (%s)", ret,</div><div class='add'>+                strerror(errno));</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+    if (lease.lease_type == GLFS_RD_LEASE)</div><div class='add'>+        fprintf(log_file, "\n    Esisting Lease: RD_LEASE");</div><div class='add'>+    else if (lease.lease_type == GLFS_RW_LEASE)</div><div class='add'>+        fprintf(log_file, "\n    Esisting Lease: RW_LEASE");</div><div class='add'>+    else if (lease.lease_type == 3)</div><div class='add'>+        fprintf(log_file, "\n    Esisting Lease: RD_LEASE|RW_LEASE");</div><div class='add'>+    else if (lease.lease_type == 0)</div><div class='add'>+        fprintf(log_file, "\n    Esisting Lease: NONE");</div><div class='add'>+    else</div><div class='add'>+        fprintf(log_file, "\n    Existing lease type:%d", lease.lease_type);</div><div class='add'>+    return lease.lease_type;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+unlk_write_lease(glfs_fd_t *fd, char ld[])</div><div class='add'>+{</div><div class='add'>+    struct glfs_lease lease = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    memset(&amp;lease, 0, sizeof(lease));</div><div class='add'>+    lease.cmd = GLFS_UNLK_LEASE;</div><div class='add'>+    lease.lease_type = GLFS_RW_LEASE;</div><div class='add'>+    memcpy(&amp;lease.lease_id, ld, GLFS_LEASE_ID_SIZE);</div><div class='add'>+    ret = glfs_lease(fd, &amp;lease, &amp;recall_cbk, NULL);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(log_file, "\n    Unlock RW_LESAE failed with ret: %d (%s)", ret,</div><div class='add'>+                strerror(errno));</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+    fprintf(log_file, "\n    Unlocked RW_LEASE");</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+unlk_read_lease(glfs_fd_t *fd, char ld[])</div><div class='add'>+{</div><div class='add'>+    struct glfs_lease lease = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    memset(&amp;lease, 0, sizeof(lease));</div><div class='add'>+    lease.cmd = GLFS_UNLK_LEASE;</div><div class='add'>+    lease.lease_type = GLFS_RD_LEASE;</div><div class='add'>+    memcpy(&amp;lease.lease_id, ld, GLFS_LEASE_ID_SIZE);</div><div class='add'>+</div><div class='add'>+    ret = glfs_lease(fd, &amp;lease, &amp;recall_cbk, NULL);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(log_file, "\n    Unlock RD_LEASE failed with ret: %d (%s)", ret,</div><div class='add'>+                strerror(errno));</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+    fprintf(log_file, "\n    Unlocked RD_LEASE");</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+up_async_lease_recall(struct glfs_upcall *up_arg, void *data)</div><div class='add'>+{</div><div class='add'>+    struct glfs_upcall_lease *in_arg = NULL;</div><div class='add'>+    enum glfs_upcall_reason reason = 0;</div><div class='add'>+    struct glfs_object *object = NULL;</div><div class='add'>+    uint64_t flags = 0;</div><div class='add'>+    uint64_t expire = 0;</div><div class='add'>+</div><div class='add'>+    if (!up_arg)</div><div class='add'>+        return;</div><div class='add'>+</div><div class='add'>+    reason = glfs_upcall_get_reason(up_arg);</div><div class='add'>+</div><div class='add'>+    /* Expect 'GLFS_UPCALL_RECALL_LEASE' upcall event. */</div><div class='add'>+</div><div class='add'>+    if (reason == GLFS_UPCALL_RECALL_LEASE) {</div><div class='add'>+        in_arg = glfs_upcall_get_event(up_arg);</div><div class='add'>+</div><div class='add'>+        object = glfs_upcall_lease_get_object(in_arg);</div><div class='add'>+</div><div class='add'>+        fprintf(log_file,</div><div class='add'>+                " upcall event type - %d,"</div><div class='add'>+                " object(%p)\n",</div><div class='add'>+                reason, object);</div><div class='add'>+        upcall_recv = 1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    glfs_free(up_arg);</div><div class='add'>+    return;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+glfs_t *</div><div class='add'>+setup_new_client(char *volname, char *log_fileile)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+    glfs_t *fs = NULL;</div><div class='add'>+    int up_events = GLFS_EVENT_ANY;</div><div class='add'>+</div><div class='add'>+    fs = glfs_new(volname);</div><div class='add'>+    if (!fs) {</div><div class='add'>+        fprintf(log_file, "\nglfs_new: returned NULL (%s)\n", strerror(errno));</div><div class='add'>+        goto error;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = glfs_set_volfile_server(fs, "tcp", "localhost", 24007);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(log_file, "\nglfs_set_volfile_server failed ret:%d (%s)\n", ret,</div><div class='add'>+                strerror(errno));</div><div class='add'>+        goto error;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = glfs_set_logging(fs, log_fileile, 7);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(log_file, "\nglfs_set_logging failed with ret: %d (%s)\n", ret,</div><div class='add'>+                strerror(errno));</div><div class='add'>+        goto error;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = glfs_init(fs);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(log_file, "\nglfs_init failed with ret: %d (%s)\n", ret,</div><div class='add'>+                strerror(errno));</div><div class='add'>+        goto error;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Register Upcalls */</div><div class='add'>+    ret = glfs_upcall_register(fs, up_events, up_async_lease_recall, NULL);</div><div class='add'>+</div><div class='add'>+    /* Check if the return mask contains the event */</div><div class='add'>+    if ((ret &lt; 0) || !(ret &amp; GLFS_EVENT_RECALL_LEASE)) {</div><div class='add'>+        fprintf(stderr,</div><div class='add'>+                "glfs_upcall_register return doesn't contain"</div><div class='add'>+                " upcall event - GLFS_EVENT_RECALL_LEASE\n");</div><div class='add'>+        goto error;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return fs;</div><div class='add'>+error:</div><div class='add'>+    if (fs)</div><div class='add'>+        glfs_fini(fs);</div><div class='add'>+    return NULL;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#define OPEN(client, flags, fd, lease_id)                                      \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        int ret_val = 0;                                                       \</div><div class='add'>+        ret_val = glfs_setfsleaseid(lease_id);                                 \</div><div class='add'>+        if (ret_val) {                                                         \</div><div class='add'>+            fprintf(log_file,                                                  \</div><div class='add'>+                    "\nglfs_setfsleaseid failed with ret: %d (%s)\n", ret,     \</div><div class='add'>+                    strerror(errno));                                          \</div><div class='add'>+            return -1;                                                         \</div><div class='add'>+        }                                                                      \</div><div class='add'>+        fd = glfs_open(client, TEST_FILE, flags);                              \</div><div class='add'>+        if (fd == NULL) {                                                      \</div><div class='add'>+            fprintf(log_file, "\nglfs_open failed with ret: %d (%s)\n", ret,   \</div><div class='add'>+                    strerror(errno));                                          \</div><div class='add'>+            return -1;                                                         \</div><div class='add'>+        }                                                                      \</div><div class='add'>+    } while (0)</div><div class='add'>+</div><div class='add'>+#define VERIFY_RESULT(test_case, ret, value)                                   \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        if (ret != value) {                                                    \</div><div class='add'>+            fprintf(log_file,                                                  \</div><div class='add'>+                    "\n    Testcase %d failed, ret = %d, value=%d\n",          \</div><div class='add'>+                    test_case, ret, value);                                    \</div><div class='add'>+            goto error; /*test unsuccessful*/                                  \</div><div class='add'>+        }                                                                      \</div><div class='add'>+        fprintf(log_file, "\n    Testcase %d Succeeded\n", test_case);         \</div><div class='add'>+    } while (0)</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+recall_cbk(struct glfs_lease lease, void *data)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    char ld[GLFS_LEASE_ID_SIZE] = "";</div><div class='add'>+</div><div class='add'>+    fprintf(log_file, "\nRECALL received on lease_id:(%s)", lease.lease_id);</div><div class='add'>+    memcpy(ld, lease.lease_id, GLFS_LEASE_ID_SIZE);</div><div class='add'>+    ret = unlk_write_lease((glfs_fd_t *)data, ld);</div><div class='add'>+    VERIFY_RESULT(500, ret, SHUD_PASS);</div><div class='add'>+error:</div><div class='add'>+    return;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+testcase_recall_conflict_lease()</div><div class='add'>+{</div><div class='add'>+    struct glfs_object *obj = NULL;</div><div class='add'>+    glfs_fd_t *fd1 = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    struct glfs_lease lease = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    fprintf(log_file,</div><div class='add'>+            "\n Basic test case for conflicting lease causing recall");</div><div class='add'>+</div><div class='add'>+    memset(&amp;lease, 0, sizeof(lease));</div><div class='add'>+    lease.cmd = GLFS_SET_LEASE;</div><div class='add'>+    lease.lease_type = GLFS_RD_LEASE;</div><div class='add'>+    memcpy(&amp;lease.lease_id, lid2, GLFS_LEASE_ID_SIZE);</div><div class='add'>+    /* Open fd on client 1 in RD mode */</div><div class='add'>+    OPEN(client1, O_RDWR, fd1, lid1);</div><div class='add'>+    ret = set_write_lease(fd1, lid1);</div><div class='add'>+    VERIFY_RESULT(1, ret, SHUD_PASS);</div><div class='add'>+</div><div class='add'>+    /* reset counter */</div><div class='add'>+    upcall_recv = 0;</div><div class='add'>+</div><div class='add'>+    obj = glfs_h_lookupat(client2, NULL, TEST_FILE, NULL, 0);</div><div class='add'>+    ret = glfs_h_lease(client2, obj, &amp;lease);</div><div class='add'>+    VERIFY_RESULT(2, ret, SHUD_FAIL);</div><div class='add'>+</div><div class='add'>+    sleep(3);</div><div class='add'>+    /* should recv upcall */</div><div class='add'>+    VERIFY_RESULT(6, !upcall_recv, SHUD_PASS);</div><div class='add'>+</div><div class='add'>+    ret = unlk_write_lease(fd1, lid1);</div><div class='add'>+    VERIFY_RESULT(5, ret, SHUD_PASS);</div><div class='add'>+</div><div class='add'>+    ret = glfs_h_close(obj);</div><div class='add'>+    VERIFY_RESULT(3, ret, SHUD_PASS);</div><div class='add'>+    ret = glfs_close(fd1);</div><div class='add'>+    VERIFY_RESULT(4, ret, SHUD_PASS);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+error:</div><div class='add'>+    return -1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+main(int argc, char *argv[])</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+    int i = 0;</div><div class='add'>+    glfs_fd_t *fd = NULL;</div><div class='add'>+    glfs_fd_t *fd1 = NULL;</div><div class='add'>+    char *topdir = "topdir", *filename = "file1";</div><div class='add'>+    char *buf = NULL;</div><div class='add'>+    int x = 0;</div><div class='add'>+    ssize_t xattr_size = -1;</div><div class='add'>+</div><div class='add'>+    if (argc != 4) {</div><div class='add'>+        fprintf(stderr,</div><div class='add'>+                "Expect following args %s &lt;Vol&gt; &lt;glfs client log file&gt; "</div><div class='add'>+                "&lt;testcase log file&gt;\n",</div><div class='add'>+                argv[0]);</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    log_file = fopen(argv[3], "w");</div><div class='add'>+    if (!log_file)</div><div class='add'>+        goto error;</div><div class='add'>+</div><div class='add'>+    volname = argv[1];</div><div class='add'>+    glfs_log_file = argv[2];</div><div class='add'>+</div><div class='add'>+    /* Setup 2 clients */</div><div class='add'>+    client1 = setup_new_client(volname, glfs_log_file);</div><div class='add'>+    client2 = setup_new_client(volname, glfs_log_file);</div><div class='add'>+</div><div class='add'>+    ret = testcase_recall_conflict_lease();</div><div class='add'>+    VERIFY_RESULT(101, ret, SHUD_PASS);</div><div class='add'>+</div><div class='add'>+    glfs_fini(client1);</div><div class='add'>+    glfs_fini(client2);</div><div class='add'>+</div><div class='add'>+    fclose(log_file);</div><div class='add'>+    return 0;</div><div class='add'>+error:</div><div class='add'>+    return -1;</div><div class='add'>+}</div><div class='head'>diff --git a/tests/features/glfs-lease.c b/tests/features/glfs-lease.c<br/>new file mode 100644<br/>index 00000000000..e82cd875b38<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/features/glfs-lease.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/features/glfs-lease.c</a></div><div class='hunk'>@@ -0,0 +1,717 @@</div><div class='add'>+#include &lt;glusterfs/api/glfs.h&gt;</div><div class='add'>+#include &lt;glusterfs/api/glfs-handles.h&gt;</div><div class='add'>+#include &lt;errno.h&gt;</div><div class='add'>+#include &lt;stdio.h&gt;</div><div class='add'>+#include &lt;stdlib.h&gt;</div><div class='add'>+#include &lt;string.h&gt;</div><div class='add'>+#include &lt;fcntl.h&gt;</div><div class='add'>+#include &lt;sys/stat.h&gt;</div><div class='add'>+</div><div class='add'>+/* Few rules:</div><div class='add'>+ * 1. A client may have multiple lease keys, but a lease key cannot be shared by</div><div class='add'>+ * multiple clients.</div><div class='add'>+ * 2. Lease key can be set before open, or in glfs_lease request. A lease key</div><div class='add'>+ * set like this is valid for the lifetime of the fd, i.e. a fd cannot have</div><div class='add'>+ * multiple lease key. But a lease key can be shared across multiple fds.</div><div class='add'>+ */</div><div class='add'>+glfs_t *client1 = NULL, *client2 = NULL, *client3 = NULL, *client4 = NULL;</div><div class='add'>+glfs_fd_t *fd1 = NULL, *fd2 = NULL, *fd3 = NULL, *fd4 = NULL;</div><div class='add'>+FILE *log_file = NULL;</div><div class='add'>+char lid1[GLFS_LEASE_ID_SIZE] = "lid1-clnt1",</div><div class='add'>+     lid2[GLFS_LEASE_ID_SIZE] = "lid2-clnt2";</div><div class='add'>+char lid3[GLFS_LEASE_ID_SIZE] = "lid3-clnt2", lid4[GLFS_LEASE_ID_SIZE] = {</div><div class='add'>+                                                  0,</div><div class='add'>+};</div><div class='add'>+char *volname = NULL, *glfs_log_file = NULL;</div><div class='add'>+</div><div class='add'>+#define MAX_CLIENTS 4</div><div class='add'>+#define MAX_FDS 4</div><div class='add'>+#define TEST_FILE "/test/lease"</div><div class='add'>+#define SHUD_PASS 0</div><div class='add'>+#define SHUD_FAIL -1</div><div class='add'>+#define NONE 0</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+recall_cbk(struct glfs_lease lease, void *data);</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+set_read_lease(glfs_fd_t *fd, char ld[])</div><div class='add'>+{</div><div class='add'>+    struct glfs_lease lease = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    memset(&amp;lease, 0, sizeof(lease));</div><div class='add'>+    lease.cmd = GLFS_SET_LEASE;</div><div class='add'>+    lease.lease_type = GLFS_RD_LEASE;</div><div class='add'>+    memcpy(&amp;lease.lease_id, ld, GLFS_LEASE_ID_SIZE);</div><div class='add'>+    ret = glfs_lease(fd, &amp;lease, &amp;recall_cbk, fd);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(log_file, "\n    RD_LEASE failed with ret: %d (%s)", ret,</div><div class='add'>+                strerror(errno));</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+    fprintf(log_file, "\n    Took RD_LEASE");</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+set_write_lease(glfs_fd_t *fd, char ld[])</div><div class='add'>+{</div><div class='add'>+    struct glfs_lease lease = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    memset(&amp;lease, 0, sizeof(lease));</div><div class='add'>+    lease.cmd = GLFS_SET_LEASE;</div><div class='add'>+    lease.lease_type = GLFS_RW_LEASE;</div><div class='add'>+    memcpy(&amp;lease.lease_id, ld, GLFS_LEASE_ID_SIZE);</div><div class='add'>+    ret = glfs_lease(fd, &amp;lease, &amp;recall_cbk, NULL);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(log_file, "\n    RW_LEASE failed with ret: %d (%s)", ret,</div><div class='add'>+                strerror(errno));</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+    fprintf(log_file, "\n    Took RW_LEASE");</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+get_lease(glfs_fd_t *fd, char ld[])</div><div class='add'>+{</div><div class='add'>+    struct glfs_lease lease = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    memset(&amp;lease, 0, sizeof(lease));</div><div class='add'>+    lease.cmd = GLFS_GET_LEASE;</div><div class='add'>+    lease.lease_type = -1;</div><div class='add'>+    memcpy(&amp;lease.lease_id, ld, GLFS_LEASE_ID_SIZE);</div><div class='add'>+    ret = glfs_lease(fd, &amp;lease, &amp;recall_cbk, NULL);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(log_file, "\n    GET_LEASE failed with ret: %d (%s)", ret,</div><div class='add'>+                strerror(errno));</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+    if (lease.lease_type == GLFS_RD_LEASE)</div><div class='add'>+        fprintf(log_file, "\n    Esisting Lease: RD_LEASE");</div><div class='add'>+    else if (lease.lease_type == GLFS_RW_LEASE)</div><div class='add'>+        fprintf(log_file, "\n    Esisting Lease: RW_LEASE");</div><div class='add'>+    else if (lease.lease_type == 3)</div><div class='add'>+        fprintf(log_file, "\n    Esisting Lease: RD_LEASE|RW_LEASE");</div><div class='add'>+    else if (lease.lease_type == 0)</div><div class='add'>+        fprintf(log_file, "\n    Esisting Lease: NONE");</div><div class='add'>+    else</div><div class='add'>+        fprintf(log_file, "\n    Existing lease type:%d", lease.lease_type);</div><div class='add'>+    return lease.lease_type;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+unlk_write_lease(glfs_fd_t *fd, char ld[])</div><div class='add'>+{</div><div class='add'>+    struct glfs_lease lease = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    memset(&amp;lease, 0, sizeof(lease));</div><div class='add'>+    lease.cmd = GLFS_UNLK_LEASE;</div><div class='add'>+    lease.lease_type = GLFS_RW_LEASE;</div><div class='add'>+    memcpy(&amp;lease.lease_id, ld, GLFS_LEASE_ID_SIZE);</div><div class='add'>+    ret = glfs_lease(fd, &amp;lease, &amp;recall_cbk, NULL);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(log_file, "\n    Unlock RW_LESAE failed with ret: %d (%s)", ret,</div><div class='add'>+                strerror(errno));</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+    fprintf(log_file, "\n    Unlocked RW_LEASE");</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+unlk_read_lease(glfs_fd_t *fd, char ld[])</div><div class='add'>+{</div><div class='add'>+    struct glfs_lease lease = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    memset(&amp;lease, 0, sizeof(lease));</div><div class='add'>+    lease.cmd = GLFS_UNLK_LEASE;</div><div class='add'>+    lease.lease_type = GLFS_RD_LEASE;</div><div class='add'>+    memcpy(&amp;lease.lease_id, ld, GLFS_LEASE_ID_SIZE);</div><div class='add'>+</div><div class='add'>+    ret = glfs_lease(fd, &amp;lease, &amp;recall_cbk, NULL);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(log_file, "\n    Unlock RD_LEASE failed with ret: %d (%s)", ret,</div><div class='add'>+                strerror(errno));</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+    fprintf(log_file, "\n    Unlocked RD_LEASE");</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+glfs_t *</div><div class='add'>+setup_new_client(char *volname, char *log_fileile)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+    glfs_t *fs = NULL;</div><div class='add'>+</div><div class='add'>+    fs = glfs_new(volname);</div><div class='add'>+    if (!fs) {</div><div class='add'>+        fprintf(log_file, "\nglfs_new: returned NULL (%s)\n", strerror(errno));</div><div class='add'>+        goto error;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = glfs_set_volfile_server(fs, "tcp", "localhost", 24007);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(log_file, "\nglfs_set_volfile_server failed ret:%d (%s)\n", ret,</div><div class='add'>+                strerror(errno));</div><div class='add'>+        goto error;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = glfs_set_logging(fs, log_fileile, 7);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(log_file, "\nglfs_set_logging failed with ret: %d (%s)\n", ret,</div><div class='add'>+                strerror(errno));</div><div class='add'>+        goto error;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = glfs_init(fs);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fprintf(log_file, "\nglfs_init failed with ret: %d (%s)\n", ret,</div><div class='add'>+                strerror(errno));</div><div class='add'>+        goto error;</div><div class='add'>+    }</div><div class='add'>+    return fs;</div><div class='add'>+error:</div><div class='add'>+    return NULL;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#define OPEN(client, flags, fd, lease_id)                                      \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        int ret_val = 0;                                                       \</div><div class='add'>+        ret_val = glfs_setfsleaseid(lease_id);                                 \</div><div class='add'>+        if (ret_val) {                                                         \</div><div class='add'>+            fprintf(log_file,                                                  \</div><div class='add'>+                    "\nglfs_setfsleaseid failed with ret: %d (%s)\n", ret,     \</div><div class='add'>+                    strerror(errno));                                          \</div><div class='add'>+            return -1;                                                         \</div><div class='add'>+        }                                                                      \</div><div class='add'>+        fd = glfs_open(client, TEST_FILE, flags);                              \</div><div class='add'>+        if (fd == NULL) {                                                      \</div><div class='add'>+            fprintf(log_file, "\nglfs_open failed with ret: %d (%s)\n", ret,   \</div><div class='add'>+                    strerror(errno));                                          \</div><div class='add'>+            return -1;                                                         \</div><div class='add'>+        }                                                                      \</div><div class='add'>+    } while (0)</div><div class='add'>+</div><div class='add'>+#define VERIFY_RESULT(test_case, ret, value)                                   \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        if (ret != value) {                                                    \</div><div class='add'>+            fprintf(log_file,                                                  \</div><div class='add'>+                    "\n    Testcase %d failed, ret = %d, value=%d\n",          \</div><div class='add'>+                    test_case, ret, value);                                    \</div><div class='add'>+            goto error; /*test unsuccessful*/                                  \</div><div class='add'>+        }                                                                      \</div><div class='add'>+        fprintf(log_file, "\n    Testcase %d Succeeded\n", test_case);         \</div><div class='add'>+    } while (0)</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+recall_cbk(struct glfs_lease lease, void *data)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    char ld[GLFS_LEASE_ID_SIZE] = "";</div><div class='add'>+</div><div class='add'>+    fprintf(log_file, "\nRECALL received on lease_id:(%s)", lease.lease_id);</div><div class='add'>+    memcpy(ld, lease.lease_id, GLFS_LEASE_ID_SIZE);</div><div class='add'>+    ret = unlk_write_lease((glfs_fd_t *)data, ld);</div><div class='add'>+    VERIFY_RESULT(500, ret, SHUD_PASS);</div><div class='add'>+error:</div><div class='add'>+    return;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+testcase1_rd_lease()</div><div class='add'>+{</div><div class='add'>+    glfs_fd_t *fd1 = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    fprintf(log_file, "\n Basic test case for Read lease:");</div><div class='add'>+    /* Open fd on client 1 in RD mode */</div><div class='add'>+    OPEN(client1, O_RDONLY, fd1, lid1);</div><div class='add'>+    ret = set_write_lease(fd1, lid1);</div><div class='add'>+    VERIFY_RESULT(1, ret, SHUD_FAIL);</div><div class='add'>+</div><div class='add'>+    ret = set_read_lease(fd1, lid1);</div><div class='add'>+    VERIFY_RESULT(2, ret, SHUD_PASS);</div><div class='add'>+</div><div class='add'>+    ret = get_lease(fd1, lid1);</div><div class='add'>+    VERIFY_RESULT(3, ret, GLFS_RD_LEASE);</div><div class='add'>+</div><div class='add'>+    ret = unlk_write_lease(fd1, lid1);</div><div class='add'>+    VERIFY_RESULT(4, ret, SHUD_FAIL);</div><div class='add'>+</div><div class='add'>+    ret = unlk_read_lease(fd1, lid1);</div><div class='add'>+    VERIFY_RESULT(5, ret, SHUD_PASS);</div><div class='add'>+</div><div class='add'>+    ret = get_lease(fd1, lid1);</div><div class='add'>+    VERIFY_RESULT(6, ret, NONE);</div><div class='add'>+</div><div class='add'>+    ret = unlk_read_lease(fd1, lid1);</div><div class='add'>+    VERIFY_RESULT(7, ret, SHUD_PASS);</div><div class='add'>+</div><div class='add'>+    ret = glfs_close(fd1);</div><div class='add'>+    VERIFY_RESULT(8, ret, SHUD_PASS);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+error:</div><div class='add'>+    return -1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+testcase2_wr_lease()</div><div class='add'>+{</div><div class='add'>+    glfs_fd_t *fd1 = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    fprintf(log_file, "\n Basic test case for Write lease:");</div><div class='add'>+    /* Open fd on client 1 in WRonly mode */</div><div class='add'>+    OPEN(client1, O_WRONLY, fd1, lid1);</div><div class='add'>+    ret = set_read_lease(fd1, lid1);</div><div class='add'>+    VERIFY_RESULT(1, ret, SHUD_FAIL);</div><div class='add'>+</div><div class='add'>+    ret = unlk_write_lease(fd1, lid1);</div><div class='add'>+    VERIFY_RESULT(2, ret, SHUD_PASS);</div><div class='add'>+</div><div class='add'>+    ret = set_write_lease(fd1, lid1);</div><div class='add'>+    VERIFY_RESULT(3, ret, SHUD_PASS);</div><div class='add'>+</div><div class='add'>+    ret = get_lease(fd1, lid1);</div><div class='add'>+    VERIFY_RESULT(4, ret, GLFS_RW_LEASE);</div><div class='add'>+</div><div class='add'>+    ret = unlk_write_lease(fd1, lid1);</div><div class='add'>+    VERIFY_RESULT(5, ret, SHUD_PASS);</div><div class='add'>+</div><div class='add'>+    ret = get_lease(fd1, lid1);</div><div class='add'>+    VERIFY_RESULT(6, ret, NONE);</div><div class='add'>+</div><div class='add'>+    ret = unlk_read_lease(fd1, lid1);</div><div class='add'>+    VERIFY_RESULT(7, ret, SHUD_FAIL);</div><div class='add'>+</div><div class='add'>+    ret = glfs_close(fd1);</div><div class='add'>+    VERIFY_RESULT(8, ret, SHUD_PASS);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+error:</div><div class='add'>+    return -1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+testcase3_rd_wr_lease()</div><div class='add'>+{</div><div class='add'>+    glfs_fd_t *fd1 = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    fprintf(log_file, "\n Basic test case for Read Write lease:");</div><div class='add'>+    /* Open fd on client 1 in WRonly mode */</div><div class='add'>+    OPEN(client1, O_RDWR, fd1, lid1);</div><div class='add'>+    ret = set_read_lease(fd1, lid1);</div><div class='add'>+    VERIFY_RESULT(1, ret, SHUD_PASS);</div><div class='add'>+</div><div class='add'>+    ret = set_write_lease(fd1, lid1);</div><div class='add'>+    VERIFY_RESULT(2, ret, SHUD_PASS);</div><div class='add'>+</div><div class='add'>+    ret = get_lease(fd1, lid1);</div><div class='add'>+    VERIFY_RESULT(3, ret, (GLFS_RW_LEASE | GLFS_RD_LEASE));</div><div class='add'>+</div><div class='add'>+    ret = unlk_write_lease(fd1, lid1);</div><div class='add'>+    VERIFY_RESULT(4, ret, SHUD_PASS);</div><div class='add'>+</div><div class='add'>+    ret = get_lease(fd1, lid1);</div><div class='add'>+    VERIFY_RESULT(5, ret, GLFS_RD_LEASE);</div><div class='add'>+</div><div class='add'>+    ret = unlk_read_lease(fd1, lid1);</div><div class='add'>+    VERIFY_RESULT(6, ret, SHUD_PASS);</div><div class='add'>+</div><div class='add'>+    ret = get_lease(fd1, lid1);</div><div class='add'>+    VERIFY_RESULT(7, ret, NONE);</div><div class='add'>+</div><div class='add'>+    ret = glfs_close(fd1);</div><div class='add'>+    VERIFY_RESULT(8, ret, SHUD_PASS);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+error:</div><div class='add'>+    return -1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+testcase4_rd_lease_multi_clnt()</div><div class='add'>+{</div><div class='add'>+    glfs_fd_t *fd1 = NULL;</div><div class='add'>+    glfs_fd_t *fd2 = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    fprintf(log_file, "\n Basic test case for multi client Read lease:");</div><div class='add'>+</div><div class='add'>+    /* Open fd on client 1 in RD mode */</div><div class='add'>+    OPEN(client1, O_RDONLY, fd1, lid1);</div><div class='add'>+</div><div class='add'>+    /* Open fd on client 2 in RW mode */</div><div class='add'>+    OPEN(client2, O_RDONLY, fd2, lid2);</div><div class='add'>+</div><div class='add'>+    ret = set_read_lease(fd1, lid1);</div><div class='add'>+    VERIFY_RESULT(1, ret, SHUD_PASS);</div><div class='add'>+</div><div class='add'>+    ret = set_read_lease(fd2, lid2);</div><div class='add'>+    VERIFY_RESULT(2, ret, SHUD_PASS);</div><div class='add'>+</div><div class='add'>+    ret = get_lease(fd1, lid1);</div><div class='add'>+    VERIFY_RESULT(3, ret, GLFS_RD_LEASE);</div><div class='add'>+</div><div class='add'>+    ret = unlk_read_lease(fd1, lid1);</div><div class='add'>+    VERIFY_RESULT(4, ret, SHUD_PASS);</div><div class='add'>+</div><div class='add'>+    ret = unlk_read_lease(fd2, lid2);</div><div class='add'>+    VERIFY_RESULT(5, ret, SHUD_PASS);</div><div class='add'>+</div><div class='add'>+    ret = get_lease(fd1, lid1);</div><div class='add'>+    VERIFY_RESULT(6, ret, NONE);</div><div class='add'>+</div><div class='add'>+    ret = get_lease(fd2, lid2);</div><div class='add'>+    VERIFY_RESULT(7, ret, NONE);</div><div class='add'>+</div><div class='add'>+    ret = glfs_close(fd1);</div><div class='add'>+    VERIFY_RESULT(8, ret, SHUD_PASS);</div><div class='add'>+</div><div class='add'>+    ret = glfs_close(fd2);</div><div class='add'>+    VERIFY_RESULT(9, ret, SHUD_PASS);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+error:</div><div class='add'>+    return -1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+testcase5_openfd_multi_lid()</div><div class='add'>+{</div><div class='add'>+    glfs_fd_t *fd1 = NULL;</div><div class='add'>+    glfs_fd_t *fd2 = NULL;</div><div class='add'>+    glfs_fd_t *fd3 = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    fprintf(log_file, "\n Basic test case for multi lid openfd check:");</div><div class='add'>+</div><div class='add'>+    /* Open fd on client 1 in RD mode */</div><div class='add'>+    OPEN(client1, O_RDONLY, fd1, lid1);</div><div class='add'>+</div><div class='add'>+    /* Open fd on client 2 in RW mode */</div><div class='add'>+    OPEN(client2, O_RDWR, fd2, lid2);</div><div class='add'>+    OPEN(client2, O_RDWR, fd3, lid2);</div><div class='add'>+</div><div class='add'>+    ret = set_read_lease(fd1, lid1);</div><div class='add'>+    VERIFY_RESULT(</div><div class='add'>+        1, ret,</div><div class='add'>+        SHUD_FAIL); /*As there are other openfds in WR mode from diff lid*/</div><div class='add'>+</div><div class='add'>+    ret = set_write_lease(fd2, lid2);</div><div class='add'>+    VERIFY_RESULT(</div><div class='add'>+        2, ret, SHUD_FAIL); /*As thers is another fd in RD mode from diff lid */</div><div class='add'>+</div><div class='add'>+    ret = glfs_close(fd1);</div><div class='add'>+    VERIFY_RESULT(3, ret, SHUD_PASS);</div><div class='add'>+</div><div class='add'>+    ret = set_write_lease(fd2, lid2);</div><div class='add'>+    VERIFY_RESULT(4, ret, SHUD_PASS);</div><div class='add'>+</div><div class='add'>+    ret = unlk_write_lease(fd2, lid2);</div><div class='add'>+    VERIFY_RESULT(5, ret, SHUD_PASS);</div><div class='add'>+</div><div class='add'>+    ret = glfs_close(fd2);</div><div class='add'>+    VERIFY_RESULT(6, ret, SHUD_PASS);</div><div class='add'>+</div><div class='add'>+    ret = glfs_close(fd3);</div><div class='add'>+    VERIFY_RESULT(7, ret, SHUD_PASS);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+error:</div><div class='add'>+    return -1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+testcase6_openfd_same_lid()</div><div class='add'>+{</div><div class='add'>+    glfs_fd_t *fd1 = NULL;</div><div class='add'>+    glfs_fd_t *fd2 = NULL;</div><div class='add'>+    glfs_fd_t *fd3 = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    fprintf(log_file, "\n Basic test case for same lid openfd check:");</div><div class='add'>+</div><div class='add'>+    /* Open fd on client 2 in RW mode */</div><div class='add'>+    OPEN(client1, O_RDWR, fd1, lid2);</div><div class='add'>+    OPEN(client1, O_RDWR, fd2, lid2);</div><div class='add'>+</div><div class='add'>+    ret = set_write_lease(fd1, lid2);</div><div class='add'>+    VERIFY_RESULT(4, ret, SHUD_PASS);</div><div class='add'>+</div><div class='add'>+    ret = set_write_lease(fd2, lid2);</div><div class='add'>+    VERIFY_RESULT(4, ret, SHUD_PASS);</div><div class='add'>+</div><div class='add'>+    ret = set_read_lease(fd2, lid2);</div><div class='add'>+    VERIFY_RESULT(4, ret, SHUD_PASS);</div><div class='add'>+</div><div class='add'>+    ret = unlk_write_lease(fd1, lid2);</div><div class='add'>+    VERIFY_RESULT(5, ret, SHUD_PASS);</div><div class='add'>+</div><div class='add'>+    ret = unlk_read_lease(fd2, lid2);</div><div class='add'>+    VERIFY_RESULT(5, ret, SHUD_PASS);</div><div class='add'>+</div><div class='add'>+    ret = unlk_write_lease(fd2, lid2);</div><div class='add'>+    VERIFY_RESULT(5, ret, SHUD_PASS);</div><div class='add'>+</div><div class='add'>+    ret = glfs_close(fd1);</div><div class='add'>+    VERIFY_RESULT(6, ret, SHUD_PASS);</div><div class='add'>+</div><div class='add'>+    ret = glfs_close(fd2);</div><div class='add'>+    VERIFY_RESULT(7, ret, SHUD_PASS);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+error:</div><div class='add'>+    return -1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+testcase7_rd_multi_lid()</div><div class='add'>+{</div><div class='add'>+    glfs_fd_t *fd1 = NULL;</div><div class='add'>+    glfs_fd_t *fd2 = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    fprintf(log_file, "\n Basic test case for multi lease id Read lease:");</div><div class='add'>+</div><div class='add'>+    /* Open fd on client 1 in RD mode */</div><div class='add'>+    OPEN(client2, O_RDONLY, fd1, lid2);</div><div class='add'>+</div><div class='add'>+    /* Open fd on client 2 in RD mode */</div><div class='add'>+    OPEN(client2, O_RDONLY, fd2, lid3);</div><div class='add'>+</div><div class='add'>+    ret = set_read_lease(fd1, lid2);</div><div class='add'>+    VERIFY_RESULT(1, ret, SHUD_PASS);</div><div class='add'>+</div><div class='add'>+    ret = set_read_lease(fd2, lid3);</div><div class='add'>+    VERIFY_RESULT(2, ret, SHUD_PASS);</div><div class='add'>+</div><div class='add'>+    ret = get_lease(fd1, lid2);</div><div class='add'>+    VERIFY_RESULT(3, ret, GLFS_RD_LEASE);</div><div class='add'>+</div><div class='add'>+    ret = unlk_read_lease(fd1, lid2);</div><div class='add'>+    VERIFY_RESULT(4, ret, SHUD_PASS);</div><div class='add'>+</div><div class='add'>+    ret = unlk_read_lease(fd2, lid3);</div><div class='add'>+    VERIFY_RESULT(5, ret, SHUD_PASS);</div><div class='add'>+</div><div class='add'>+    ret = get_lease(fd1, lid2);</div><div class='add'>+    VERIFY_RESULT(6, ret, NONE);</div><div class='add'>+</div><div class='add'>+    ret = get_lease(fd2, lid3);</div><div class='add'>+    VERIFY_RESULT(7, ret, NONE);</div><div class='add'>+</div><div class='add'>+    ret = glfs_close(fd1);</div><div class='add'>+    VERIFY_RESULT(8, ret, SHUD_PASS);</div><div class='add'>+</div><div class='add'>+    ret = glfs_close(fd2);</div><div class='add'>+    VERIFY_RESULT(9, ret, SHUD_PASS);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+error:</div><div class='add'>+    return -1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+testcase8_client_disconnect()</div><div class='add'>+{</div><div class='add'>+    glfs_fd_t *fd1 = NULL;</div><div class='add'>+    glfs_fd_t *fd2 = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    fprintf(log_file, "\n Basic test case for client disconnect cleanup");</div><div class='add'>+</div><div class='add'>+    /* Open fd on client 1 in RD mode */</div><div class='add'>+    OPEN(client1, O_RDWR, fd1, lid1);</div><div class='add'>+</div><div class='add'>+    ret = set_read_lease(fd1, lid1);</div><div class='add'>+    VERIFY_RESULT(1, ret, SHUD_PASS);</div><div class='add'>+</div><div class='add'>+    ret = get_lease(fd1, lid1);</div><div class='add'>+    VERIFY_RESULT(2, ret, GLFS_RD_LEASE);</div><div class='add'>+</div><div class='add'>+    ret = set_write_lease(fd1, lid1);</div><div class='add'>+    VERIFY_RESULT(3, ret, SHUD_PASS);</div><div class='add'>+</div><div class='add'>+    ret = get_lease(fd1, lid1);</div><div class='add'>+    VERIFY_RESULT(4, ret, (GLFS_RD_LEASE | GLFS_RW_LEASE));</div><div class='add'>+</div><div class='add'>+    ret = glfs_fini(client1);</div><div class='add'>+    VERIFY_RESULT(5, ret, SHUD_PASS);</div><div class='add'>+</div><div class='add'>+    /* Open fd on client 2 in RD mode */</div><div class='add'>+    OPEN(client2, O_RDONLY, fd2, lid3);</div><div class='add'>+</div><div class='add'>+    ret = get_lease(fd2, lid3);</div><div class='add'>+    VERIFY_RESULT(6, ret, NONE);</div><div class='add'>+</div><div class='add'>+    ret = glfs_close(fd2);</div><div class='add'>+    VERIFY_RESULT(7, ret, SHUD_PASS);</div><div class='add'>+</div><div class='add'>+    client1 = setup_new_client(volname, glfs_log_file);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+error:</div><div class='add'>+    return -1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+testcase9_recall_conflict_lease()</div><div class='add'>+{</div><div class='add'>+    struct glfs_object *obj = NULL;</div><div class='add'>+    glfs_fd_t *fd1 = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    struct glfs_lease lease = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    fprintf(log_file,</div><div class='add'>+            "\n Basic test case for conflicting lease causing recall");</div><div class='add'>+</div><div class='add'>+    memset(&amp;lease, 0, sizeof(lease));</div><div class='add'>+    lease.cmd = GLFS_SET_LEASE;</div><div class='add'>+    lease.lease_type = GLFS_RD_LEASE;</div><div class='add'>+    memcpy(&amp;lease.lease_id, lid2, GLFS_LEASE_ID_SIZE);</div><div class='add'>+    /* Open fd on client 1 in RD mode */</div><div class='add'>+    OPEN(client1, O_RDWR, fd1, lid1);</div><div class='add'>+    ret = set_write_lease(fd1, lid1);</div><div class='add'>+    VERIFY_RESULT(1, ret, SHUD_PASS);</div><div class='add'>+</div><div class='add'>+    obj = glfs_h_lookupat(client2, NULL, TEST_FILE, NULL, 0);</div><div class='add'>+    ret = glfs_h_lease(client2, obj, &amp;lease);</div><div class='add'>+    VERIFY_RESULT(2, ret, SHUD_FAIL);</div><div class='add'>+</div><div class='add'>+    ret = unlk_write_lease(fd1, lid1);</div><div class='add'>+    VERIFY_RESULT(5, ret, SHUD_PASS);</div><div class='add'>+</div><div class='add'>+    sleep(3);</div><div class='add'>+    ret = glfs_h_close(obj);</div><div class='add'>+    VERIFY_RESULT(3, ret, SHUD_PASS);</div><div class='add'>+    ret = glfs_close(fd1);</div><div class='add'>+    VERIFY_RESULT(4, ret, SHUD_PASS);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+error:</div><div class='add'>+    return -1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+testcase10_recall_open_conflict()</div><div class='add'>+{</div><div class='add'>+    glfs_fd_t *fd1 = NULL;</div><div class='add'>+    glfs_fd_t *fd2 = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    fprintf(log_file, "\n Basic test case for conflicting open causing recall");</div><div class='add'>+</div><div class='add'>+    /* Open fd on client 1 in RW mode */</div><div class='add'>+    OPEN(client1, O_RDWR, fd1, lid1);</div><div class='add'>+</div><div class='add'>+    ret = set_write_lease(fd1, lid1);</div><div class='add'>+    VERIFY_RESULT(1, ret, SHUD_PASS);</div><div class='add'>+</div><div class='add'>+    /* Open fd on client 1 in RW mode */</div><div class='add'>+    OPEN(client2, O_RDWR, fd2, lid2);</div><div class='add'>+</div><div class='add'>+    /* TODO: Check for recall cbk functionality */</div><div class='add'>+    ret = glfs_close(fd1);</div><div class='add'>+    VERIFY_RESULT(2, ret, SHUD_PASS);</div><div class='add'>+</div><div class='add'>+    ret = glfs_close(fd2);</div><div class='add'>+    VERIFY_RESULT(3, ret, SHUD_PASS);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+error:</div><div class='add'>+    return -1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+main(int argc, char *argv[])</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+    int i = 0;</div><div class='add'>+    glfs_fd_t *fd = NULL;</div><div class='add'>+    glfs_fd_t *fd1 = NULL;</div><div class='add'>+    char *topdir = "topdir", *filename = "file1";</div><div class='add'>+    char *buf = NULL;</div><div class='add'>+    int x = 0;</div><div class='add'>+    ssize_t xattr_size = -1;</div><div class='add'>+</div><div class='add'>+    if (argc != 4) {</div><div class='add'>+        fprintf(stderr,</div><div class='add'>+                "Expect following args %s &lt;Vol&gt; &lt;glfs client log file&gt; "</div><div class='add'>+                "&lt;testcase log file&gt;\n",</div><div class='add'>+                argv[0]);</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    log_file = fopen(argv[3], "w");</div><div class='add'>+    if (!log_file)</div><div class='add'>+        goto error;</div><div class='add'>+</div><div class='add'>+    volname = argv[1];</div><div class='add'>+    glfs_log_file = argv[2];</div><div class='add'>+</div><div class='add'>+    /* Setup 3 clients */</div><div class='add'>+    client1 = setup_new_client(volname, glfs_log_file);</div><div class='add'>+    client2 = setup_new_client(volname, glfs_log_file);</div><div class='add'>+    client3 = setup_new_client(volname, glfs_log_file);</div><div class='add'>+</div><div class='add'>+    ret = testcase1_rd_lease();</div><div class='add'>+    VERIFY_RESULT(101, ret, SHUD_PASS);</div><div class='add'>+</div><div class='add'>+    ret = testcase2_wr_lease();</div><div class='add'>+    VERIFY_RESULT(102, ret, SHUD_PASS);</div><div class='add'>+</div><div class='add'>+    ret = testcase3_rd_wr_lease();</div><div class='add'>+    VERIFY_RESULT(103, ret, SHUD_PASS);</div><div class='add'>+</div><div class='add'>+    ret = testcase4_rd_lease_multi_clnt();</div><div class='add'>+    VERIFY_RESULT(104, ret, SHUD_PASS);</div><div class='add'>+</div><div class='add'>+    ret = testcase5_openfd_multi_lid();</div><div class='add'>+    VERIFY_RESULT(105, ret, SHUD_PASS);</div><div class='add'>+</div><div class='add'>+    ret = testcase6_openfd_same_lid();</div><div class='add'>+    VERIFY_RESULT(106, ret, SHUD_PASS);</div><div class='add'>+</div><div class='add'>+    ret = testcase7_rd_multi_lid();</div><div class='add'>+    VERIFY_RESULT(107, ret, SHUD_PASS);</div><div class='add'>+</div><div class='add'>+    ret = testcase8_client_disconnect();</div><div class='add'>+    VERIFY_RESULT(108, ret, SHUD_PASS);</div><div class='add'>+</div><div class='add'>+    ret = testcase9_recall_conflict_lease();</div><div class='add'>+    VERIFY_RESULT(109, ret, SHUD_PASS);</div><div class='add'>+</div><div class='add'>+    ret = testcase10_recall_open_conflict();</div><div class='add'>+    VERIFY_RESULT(110, ret, SHUD_PASS);</div><div class='add'>+</div><div class='add'>+    glfs_fini(client1);</div><div class='add'>+    glfs_fini(client2);</div><div class='add'>+    glfs_fini(client3);</div><div class='add'>+</div><div class='add'>+    fclose(log_file);</div><div class='add'>+    return 0;</div><div class='add'>+error:</div><div class='add'>+    return -1;</div><div class='add'>+}</div><div class='head'>diff --git a/tests/features/glfs-lease.t b/tests/features/glfs-lease.t<br/>new file mode 100755<br/>index 00000000000..6ef6da05043<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/features/glfs-lease.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/features/glfs-lease.t</a></div><div class='hunk'>@@ -0,0 +1,31 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+. $(dirname $0)/../include.rc</div><div class='add'>+. $(dirname $0)/../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+## Start and create a volume</div><div class='add'>+TEST glusterd;</div><div class='add'>+TEST pidof glusterd;</div><div class='add'>+TEST $CLI volume info;</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/${V0};</div><div class='add'>+TEST $CLI volume set $V0 leases on</div><div class='add'>+TEST $CLI volume set $V0 open-behind off</div><div class='add'>+TEST $CLI volume set $V0 write-behind on</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+logdir=`gluster --print-logdir`</div><div class='add'>+TEST glusterfs --volfile-id=$V0 --volfile-server=$H0 $M0;</div><div class='add'>+TEST mkdir $M0/test</div><div class='add'>+TEST touch $M0/test/lease</div><div class='add'>+</div><div class='add'>+build_tester $(dirname $0)/glfs-lease.c -lgfapi</div><div class='add'>+build_tester $(dirname $0)/glfs-lease-recall.c -lgfapi</div><div class='add'>+TEST $(dirname $0)/glfs-lease $V0 $logdir/glfs-lease.log $logdir/lease-test.log</div><div class='add'>+TEST $(dirname $0)/glfs-lease-recall $V0 $logdir/glfs-lease-recall.log $logdir/lease-test-recall.log</div><div class='add'>+</div><div class='add'>+TEST $CLI volume set $V0 leases off</div><div class='add'>+</div><div class='add'>+cleanup_tester $(dirname $0)/glfs-lease</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/features/interrupt.t b/tests/features/interrupt.t<br/>new file mode 100644<br/>index 00000000000..067eb1b7486<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/features/interrupt.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/features/interrupt.t</a></div><div class='hunk'>@@ -0,0 +1,71 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+##Copy this file to tests/bugs before running run.sh (cp extras/test/bug-920583.t tests/bugs/)</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../include.rc</div><div class='add'>+. $(dirname $0)/../volume.rc</div><div class='add'>+</div><div class='add'>+TESTS_EXPECTED_IN_LOOP=4</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+logdir=`gluster --print-logdir`</div><div class='add'>+</div><div class='add'>+TEST build_tester $(dirname $0)/open_and_sleep.c</div><div class='add'>+</div><div class='add'>+## Start and create a volume</div><div class='add'>+TEST glusterd;</div><div class='add'>+TEST pidof glusterd;</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 replica 3 $H0:$B0/${V0}{1,2,3,4,5,6,7,8,9};</div><div class='add'>+</div><div class='add'>+## Verify volume is is created</div><div class='add'>+EXPECT "$V0" volinfo_field $V0 'Volume Name';</div><div class='add'>+EXPECT 'Created' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+## Start volume and verify</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+EXPECT 'Started' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+function log-file-name()</div><div class='add'>+{</div><div class='add'>+    logfilename=$M0".log"</div><div class='add'>+    echo ${logfilename:1} | tr / -</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+log_file=$logdir"/"`log-file-name`</div><div class='add'>+</div><div class='add'>+function test_interrupt {</div><div class='add'>+        local handlebool="$1"</div><div class='add'>+        local logpattern="$2"</div><div class='add'>+</div><div class='add'>+        TEST $GFS --volfile-id=$V0 --volfile-server=$H0 --fuse-flush-handle-interrupt=$handlebool --log-level=DEBUG $M0</div><div class='add'>+</div><div class='add'>+        # If the test helper fails (which is considered a setup error, not failure of the test</div><div class='add'>+        # case itself), kill will be invoked without argument, and that will be the actual</div><div class='add'>+        # error which is caught.</div><div class='add'>+        TEST "./$(dirname $0)/open_and_sleep $M0/testfile-$handlebool | { sleep 0.1; xargs -n1 kill -INT; }"</div><div class='add'>+</div><div class='add'>+        TEST "grep -E '$logpattern' $log_file"</div><div class='add'>+        # Basic sanity check, making sure filesystem has not crashed.</div><div class='add'>+        TEST test -f $M0/testfile-$handlebool</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+# Theoretically FLUSH might finish before INTERRUPT is handled,</div><div class='add'>+# in which case we'd get the "no handler found" message instead of</div><div class='add'>+# "interrupt handler triggered" (but it's unlikely).</div><div class='add'>+# If that's observed, the pattern can be changed to</div><div class='add'>+# 'FLUSH.*interrupt handler triggered|[I]NTERRUPT.*no handler found'</div><div class='add'>+# to fix the test.</div><div class='add'>+test_interrupt yes '[F]LUSH.*interrupt handler triggered'</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+test_interrupt no '[I]NTERRUPT.*no handler found'</div><div class='add'>+</div><div class='add'>+## Finish up</div><div class='add'>+TEST $CLI volume stop $V0;</div><div class='add'>+EXPECT 'Stopped' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+TEST $CLI volume delete $V0;</div><div class='add'>+TEST ! $CLI volume info $V0;</div><div class='add'>+</div><div class='add'>+cleanup_tester $(dirname $0)/open_and_sleep;</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/features/ipc.t b/tests/features/ipc.t<br/>new file mode 100755<br/>index 00000000000..5c92287eaa1<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/features/ipc.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/features/ipc.t</a></div><div class='hunk'>@@ -0,0 +1,38 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../include.rc</div><div class='add'>+</div><div class='add'>+#G_TESTDEF_TEST_STATUS_CENTOS6=BAD_TEST,BUG=GH269</div><div class='add'>+#G_TESTDEF_TEST_STATUS_NETBSD7=BAD_TEST,BUG=GH269</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+mkdir -p $B0/1</div><div class='add'>+mkdir -p $M0</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume info;</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/1</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+# Find OS-dependent EOPNOTSUPP value from system headers</div><div class='add'>+EOPNOTSUPP=$( echo '#include &lt;errno.h&gt;\\EOPNOTSUPP\\' | tr '\\' '\n' | \</div><div class='add'>+              cc -E -c - | tail -1 )</div><div class='add'>+</div><div class='add'>+# liglusterfs embbeds its own UUID implementation. The function name</div><div class='add'>+# may be the same as in built(in implementation from libc, but with</div><div class='add'>+# different prototype. In that case, we must make sure python will</div><div class='add'>+# use libglusterfs's version, and dlopen() does not make any guarantee</div><div class='add'>+# on this. By preloading libglusterfs.so before launching python, we</div><div class='add'>+# ensure libglusterfs's UUID functions will be used.</div><div class='add'>+LD_PRELOAD=${prefix}/lib/libglusterfs.so</div><div class='add'>+export LD_PRELOAD</div><div class='add'>+</div><div class='add'>+# This is a pretty lame test.  Basically we just want to make sure that we</div><div class='add'>+# get all the way through the translator stacks on client and server to get a</div><div class='add'>+# simple error (EOPNOTSUPP) instead of a crash, RPC error, etc.</div><div class='add'>+EXPECT ${EOPNOTSUPP}  $PYTHON $(dirname $0)/ipctest.py $H0 $V0</div><div class='add'>+</div><div class='add'>+unset LD_PRELOAD</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/features/ipctest.py b/tests/features/ipctest.py<br/>new file mode 100755<br/>index 00000000000..f6f699cf5c4<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/features/ipctest.py?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/features/ipctest.py</a></div><div class='hunk'>@@ -0,0 +1,28 @@</div><div class='add'>+</div><div class='add'>+from __future__ import print_function</div><div class='add'>+import ctypes</div><div class='add'>+</div><div class='add'>+api = ctypes.CDLL("libgfapi.so", mode=ctypes.RTLD_GLOBAL)</div><div class='add'>+</div><div class='add'>+api.glfs_ipc.argtypes = [ ctypes.c_void_p, ctypes.c_int, ctypes.c_void_p, ctypes.c_void_p ]</div><div class='add'>+api.glfs_ipc.restype = ctypes.c_int</div><div class='add'>+</div><div class='add'>+def do_ipc (host, volume):</div><div class='add'>+	fs = api.glfs_new(volume)</div><div class='add'>+	#api.glfs_set_logging(fs, "/dev/stderr", 7)</div><div class='add'>+	api.glfs_set_volfile_server(fs, "tcp", host, 24007)</div><div class='add'>+</div><div class='add'>+	api.glfs_init(fs)</div><div class='add'>+	ret  = api.glfs_ipc(fs, 1470369258, 0, 0)</div><div class='add'>+	api.glfs_fini(fs)</div><div class='add'>+</div><div class='add'>+	return ret</div><div class='add'>+</div><div class='add'>+if __name__ == "__main__":</div><div class='add'>+	import sys</div><div class='add'>+</div><div class='add'>+	try:</div><div class='add'>+		res = do_ipc(*sys.argv[1:3])</div><div class='add'>+		print(res)</div><div class='add'>+	except:</div><div class='add'>+		print("IPC failed (volume not started?)")</div><div class='head'>diff --git a/tests/features/lock_revocation.t b/tests/features/lock_revocation.t<br/>new file mode 100644<br/>index 00000000000..67bc13159f9<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/features/lock_revocation.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/features/lock_revocation.t</a></div><div class='hunk'>@@ -0,0 +1,54 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+logdir=$(gluster --print-logdir)</div><div class='add'>+BRICK_LOGFILES="$logdir/bricks/d-backends-brick?.log"</div><div class='add'>+rm -f $BRICK_LOGFILES &amp;&gt; /dev/null</div><div class='add'>+</div><div class='add'>+# Test that lock revocation works</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../include.rc</div><div class='add'>+. $(dirname $0)/../volume.rc</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+function deadlock_fop() {</div><div class='add'>+  local MNT=$1</div><div class='add'>+  for i in {1..1000}; do</div><div class='add'>+    dd if=/dev/zero of=$MNT/testfile bs=1k count=10 &amp;&gt; /dev/null</div><div class='add'>+    if grep "MONKEY LOCKING" $BRICK_LOGFILES &amp;&gt; /dev/null; then</div><div class='add'>+      break</div><div class='add'>+    fi</div><div class='add'>+  done</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function monkey_unlock() {</div><div class='add'>+  grep "MONKEY LOCKING" $BRICK_LOGFILES &amp;&gt; /dev/null &amp;&amp; echo SUCCESS</div><div class='add'>+  return 0</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function append_to_file() {</div><div class='add'>+  local FILE_PATH=$1</div><div class='add'>+  echo "hello" &gt;&gt; $FILE_PATH</div><div class='add'>+  return 0</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#Init</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 replica 2 $H0:$B0/brick{0,1}</div><div class='add'>+TEST $CLI volume set $V0 self-heal-daemon off</div><div class='add'>+TEST $CLI volume set $V0 features.locks-monkey-unlocking on</div><div class='add'>+TEST $CLI volume set $V0 features.locks-revocation-secs 2</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+TEST $GFS --volfile-id=$V0 -s $H0 $M0;</div><div class='add'>+TEST $GFS --volfile-id=$V0 -s $H0 $M1;</div><div class='add'>+</div><div class='add'>+# Deadlock writes to a file using monkey unlocking</div><div class='add'>+deadlock_fop $M0 &amp;</div><div class='add'>+EXPECT_WITHIN 60 "SUCCESS" monkey_unlock</div><div class='add'>+</div><div class='add'>+# Sleep &gt; unlock timeout and attempt to write to the file</div><div class='add'>+sleep 3</div><div class='add'>+TEST append_to_file $M1/testfile</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='add'>+#G_TESTDEF_TEST_STATUS_NETBSD7=BAD_TEST,BUG=1369401</div><div class='add'>+#G_TESTDEF_TEST_STATUS_CENTOS6=BAD_TEST,BUG=1448364</div><div class='head'>diff --git a/tests/features/mandatory-lock-forced.c b/tests/features/mandatory-lock-forced.c<br/>new file mode 100644<br/>index 00000000000..4028d6c6eaf<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/features/mandatory-lock-forced.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/features/mandatory-lock-forced.c</a></div><div class='hunk'>@@ -0,0 +1,143 @@</div><div class='add'>+#include &lt;stdio.h&gt;</div><div class='add'>+#include &lt;fcntl.h&gt;</div><div class='add'>+#include &lt;errno.h&gt;</div><div class='add'>+#include &lt;unistd.h&gt;</div><div class='add'>+#include &lt;stdlib.h&gt;</div><div class='add'>+#include &lt;string.h&gt;</div><div class='add'>+#include &lt;sys/wait.h&gt;</div><div class='add'>+</div><div class='add'>+#define LOG_ERR(func, err)                                                     \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        fprintf(stderr, "%s : returned error (%s)\n", func, strerror(err));    \</div><div class='add'>+        exit(err);                                                             \</div><div class='add'>+    } while (0)</div><div class='add'>+</div><div class='add'>+int fd;</div><div class='add'>+struct flock lock;</div><div class='add'>+char *buf = "ten bytes!";</div><div class='add'>+char *fname = "/mnt/glusterfs/0/mand.lock";</div><div class='add'>+int open_flags, child, err, status, blocked = 0;</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+do_child(char *argv[])</div><div class='add'>+{</div><div class='add'>+    /* Initialize file open flags */</div><div class='add'>+    if (strcmp(argv[2], "BLOCK") == 0)</div><div class='add'>+        open_flags = O_RDWR;</div><div class='add'>+    else if (strcmp(argv[2], "TRUNC") == 0)</div><div class='add'>+        open_flags = O_RDWR | O_TRUNC | O_NONBLOCK;</div><div class='add'>+    else if (strcmp(argv[2], "NONE") == 0)</div><div class='add'>+        open_flags = O_RDWR | O_NONBLOCK;</div><div class='add'>+    else</div><div class='add'>+        LOG_ERR("Invalid option:", EINVAL);</div><div class='add'>+</div><div class='add'>+    /* Open the file */</div><div class='add'>+    fd = open(fname, open_flags);</div><div class='add'>+    if (fd == -1)</div><div class='add'>+        LOG_ERR("Child open", errno);</div><div class='add'>+</div><div class='add'>+    /* Perform the file operation*/</div><div class='add'>+    if (strcmp(argv[3], "READ") == 0) {</div><div class='add'>+        buf = NULL;</div><div class='add'>+        err = read(fd, buf, 10);</div><div class='add'>+        if (err == -1)</div><div class='add'>+            LOG_ERR("Child read", errno);</div><div class='add'>+    } else if (strcmp(argv[3], "WRITE") == 0) {</div><div class='add'>+        err = write(fd, buf, 10);</div><div class='add'>+        if (err == -1)</div><div class='add'>+            LOG_ERR("Child write", errno);</div><div class='add'>+    } else if (strcmp(argv[3], "FTRUNCATE") == 0) {</div><div class='add'>+        err = ftruncate(fd, 5);</div><div class='add'>+        if (err)</div><div class='add'>+            LOG_ERR("Child ftruncate", errno);</div><div class='add'>+    } else</div><div class='add'>+        LOG_ERR("Invalid operation:", EINVAL);</div><div class='add'>+</div><div class='add'>+    /* Close child fd */</div><div class='add'>+    err = close(fd);</div><div class='add'>+    if (err)</div><div class='add'>+        LOG_ERR("Child close", errno);</div><div class='add'>+</div><div class='add'>+    /* Exit success */</div><div class='add'>+    exit(0);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+main(int argc, char *argv[])</div><div class='add'>+{</div><div class='add'>+    if (argc &lt; 4) {</div><div class='add'>+        fprintf(stderr,</div><div class='add'>+                "Wrong usage: Use as ./mandatory-lock "</div><div class='add'>+                "&lt;RD_LCK/WR_LCK&gt; &lt;BLOCK/TRUNC/NONE&gt; "</div><div class='add'>+                "&lt;READ/WRITE/FTRUNCATE\n");</div><div class='add'>+        exit(EINVAL);</div><div class='add'>+    }</div><div class='add'>+    /* Create an empty lock file */</div><div class='add'>+    fd = open(fname, O_CREAT | O_RDWR, 0755);</div><div class='add'>+    if (fd == -1)</div><div class='add'>+        LOG_ERR("Parent create", errno);</div><div class='add'>+</div><div class='add'>+    /* Determine the type of lock */</div><div class='add'>+    if (strcmp(argv[1], "RD_LCK") == 0)</div><div class='add'>+        lock.l_type = F_RDLCK;</div><div class='add'>+    else if (strcmp(argv[1], "WR_LCK") == 0)</div><div class='add'>+        lock.l_type = F_WRLCK;</div><div class='add'>+    else</div><div class='add'>+        LOG_ERR("Parent lock type", EINVAL);</div><div class='add'>+</div><div class='add'>+    lock.l_whence = SEEK_SET;</div><div class='add'>+    lock.l_start = 0L;</div><div class='add'>+    lock.l_len = 0L;</div><div class='add'>+</div><div class='add'>+    /* Let parent acquire the initial lock */</div><div class='add'>+    err = fcntl(fd, F_SETLK, &amp;lock);</div><div class='add'>+    if (err)</div><div class='add'>+        LOG_ERR("Parent lock", errno);</div><div class='add'>+</div><div class='add'>+    /* Now fork a child */</div><div class='add'>+    child = fork();</div><div class='add'>+    if (child == 0)</div><div class='add'>+        /* Perform the child operations */</div><div class='add'>+        do_child(argv);</div><div class='add'>+    else {</div><div class='add'>+        /* If blocking mode, then sleep for 2 seconds</div><div class='add'>+         * and wait for the child */</div><div class='add'>+        if (strcmp(argv[2], "NONE") != 0) {</div><div class='add'>+            sleep(2);</div><div class='add'>+            if (waitpid(child, &amp;status, WNOHANG) == 0)</div><div class='add'>+                blocked = 1;</div><div class='add'>+            /* Release the parent lock so that the</div><div class='add'>+             * child can terminate */</div><div class='add'>+            lock.l_type = F_UNLCK;</div><div class='add'>+            err = fcntl(fd, F_SETLK, &amp;lock);</div><div class='add'>+            if (err)</div><div class='add'>+                LOG_ERR("Parent unlock", errno);</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        /* Wait for child to finish */</div><div class='add'>+        waitpid(child, &amp;status, 0);</div><div class='add'>+</div><div class='add'>+        /* Close the parent fd */</div><div class='add'>+        err = close(fd);</div><div class='add'>+        if (err)</div><div class='add'>+            LOG_ERR("Parent close", errno);</div><div class='add'>+</div><div class='add'>+        /* Remove the lock file*/</div><div class='add'>+        err = unlink(fname);</div><div class='add'>+        if (err)</div><div class='add'>+            LOG_ERR("Parent unlink", errno);</div><div class='add'>+</div><div class='add'>+        /* If not blocked, exit with child exit status*/</div><div class='add'>+        errno = WEXITSTATUS(status);</div><div class='add'>+</div><div class='add'>+        /* If blocked, exit with corresponding</div><div class='add'>+         * error code */</div><div class='add'>+        if (blocked)</div><div class='add'>+            errno = EWOULDBLOCK;</div><div class='add'>+</div><div class='add'>+        if (errno != 0)</div><div class='add'>+            printf("%s\n", strerror(errno));</div><div class='add'>+</div><div class='add'>+        exit(errno);</div><div class='add'>+    }</div><div class='add'>+}</div><div class='head'>diff --git a/tests/features/mandatory-lock-forced.t b/tests/features/mandatory-lock-forced.t<br/>new file mode 100644<br/>index 00000000000..563669c6774<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/features/mandatory-lock-forced.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/features/mandatory-lock-forced.t</a></div><div class='hunk'>@@ -0,0 +1,80 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../include.rc</div><div class='add'>+. $(dirname $0)/../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+# Start glusterd [1]</div><div class='add'>+TEST glusterd</div><div class='add'>+</div><div class='add'>+# Create and verify the volume information [2-4]</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/${V0}{1,2};</div><div class='add'>+EXPECT "$V0" volinfo_field $V0 'Volume Name';</div><div class='add'>+EXPECT 'Created' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+# Turn off the performance translators [5-9]</div><div class='add'>+TEST $CLI volume set $V0 performance.open-behind off</div><div class='add'>+TEST $CLI volume set $V0 performance.write-behind off</div><div class='add'>+TEST $CLI volume set $V0 performance.quick-read off</div><div class='add'>+TEST $CLI volume set $V0 performance.io-cache off</div><div class='add'>+TEST $CLI volume set $V0 performance.read-ahead off</div><div class='add'>+</div><div class='add'>+# Start and mount the volume [10-11]</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+TEST $GFS --volfile-id=/$V0 --volfile-server=$H0 $M0</div><div class='add'>+</div><div class='add'>+build_tester $(dirname $0)/mandatory-lock-forced.c -o $(dirname $0)/mandatory-lock</div><div class='add'>+</div><div class='add'>+# Various read/write tests without enabling mandatory-locking [12-18]</div><div class='add'>+$(dirname $0)/mandatory-lock RD_LCK NONE READ</div><div class='add'>+TEST [ $? -eq 0 ]</div><div class='add'>+</div><div class='add'>+$(dirname $0)/mandatory-lock RD_LCK NONE WRITE</div><div class='add'>+TEST [ $? -eq 0 ]</div><div class='add'>+</div><div class='add'>+$(dirname $0)/mandatory-lock WR_LCK NONE READ</div><div class='add'>+TEST [ $? -eq 0 ]</div><div class='add'>+</div><div class='add'>+$(dirname $0)/mandatory-lock WR_LCK NONE WRITE</div><div class='add'>+TEST [ $? -eq 0 ]</div><div class='add'>+</div><div class='add'>+# Specifies O_TRUNC during open</div><div class='add'>+$(dirname $0)/mandatory-lock RD_LCK TRUNC READ</div><div class='add'>+TEST [ $? -eq 0 ]</div><div class='add'>+</div><div class='add'>+$(dirname $0)/mandatory-lock RD_LCK NONE FTRUNCATE</div><div class='add'>+TEST [ $? -eq 0 ]</div><div class='add'>+</div><div class='add'>+$(dirname $0)/mandatory-lock RD_LCK BLOCK WRITE</div><div class='add'>+TEST [ $? -eq 0 ]</div><div class='add'>+</div><div class='add'>+# Enable mandatory-locking [19]</div><div class='add'>+TEST $CLI volume set $V0 mandatory-locking forced</div><div class='add'>+</div><div class='add'>+# Restart the volume to take the change into effect [20-23]</div><div class='add'>+TEST umount $M0</div><div class='add'>+TEST $CLI volume stop $V0</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+TEST $GFS --volfile-id=/$V0 --volfile-server=$H0 $M0</div><div class='add'>+</div><div class='add'>+# Repeat the above tests with mandatory-locking [24-30]</div><div class='add'>+$(dirname $0)/mandatory-lock RD_LCK NONE READ</div><div class='add'>+TEST [ $? -eq 0 ]</div><div class='add'>+</div><div class='add'>+EXPECT "Resource temporarily unavailable" $(dirname $0)/mandatory-lock RD_LCK NONE WRITE</div><div class='add'>+</div><div class='add'>+EXPECT "Resource temporarily unavailable" $(dirname $0)/mandatory-lock WR_LCK NONE READ</div><div class='add'>+</div><div class='add'>+EXPECT "Resource temporarily unavailable" $(dirname $0)/mandatory-lock WR_LCK NONE WRITE</div><div class='add'>+</div><div class='add'>+EXPECT "Resource temporarily unavailable" $(dirname $0)/mandatory-lock RD_LCK TRUNC READ</div><div class='add'>+</div><div class='add'>+EXPECT "Resource temporarily unavailable" $(dirname $0)/mandatory-lock RD_LCK NONE FTRUNCATE</div><div class='add'>+</div><div class='add'>+EXPECT "Resource temporarily unavailable" $(dirname $0)/mandatory-lock RD_LCK BLOCK WRITE</div><div class='add'>+</div><div class='add'>+rm -rf $(dirname $0)/mandatory-lock</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='add'>+</div><div class='add'>+#G_TESTDEF_TEST_STATUS_NETBSD7=KNOWN_ISSUE,BUG=1326464</div><div class='head'>diff --git a/tests/features/nuke.t b/tests/features/nuke.t<br/>new file mode 100755<br/>index 00000000000..f1f5f9f90ab<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/features/nuke.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/features/nuke.t</a></div><div class='hunk'>@@ -0,0 +1,41 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../include.rc</div><div class='add'>+</div><div class='add'>+create_files () {</div><div class='add'>+	mkdir $1</div><div class='add'>+	for i in $(seq 0 99); do</div><div class='add'>+		mkdir $1/dir$i</div><div class='add'>+		for j in $(seq 0 99); do</div><div class='add'>+			touch $1/dir$i/file$j</div><div class='add'>+		done</div><div class='add'>+	done</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+count_files () {</div><div class='add'>+	ls $1 | wc -l</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+LANDFILL=$B0/${V0}1/.glusterfs/landfill</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/${V0}{1,2}</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+TEST $GFS -s $H0 --volfile-id $V0 $M0</div><div class='add'>+</div><div class='add'>+TEST create_files $M0/foo</div><div class='add'>+TEST [ $(count_files $LANDFILL) = "0" ]</div><div class='add'>+</div><div class='add'>+# This should immediately send the whole directory to the landfill.</div><div class='add'>+TEST setfattr -n glusterfs.dht.nuke -v trinity $M0/foo</div><div class='add'>+</div><div class='add'>+# Make sure the directory's not visible on the mountpoint, and is visible in</div><div class='add'>+# the brick's landfill.</div><div class='add'>+TEST ! ls $M0/foo</div><div class='add'>+TEST [ $(count_files $LANDFILL) = "1" ]</div><div class='add'>+</div><div class='add'>+# Make sure the janitor thread cleans it up in a timely fashion.</div><div class='add'>+EXPECT_WITHIN 60 "0" count_files $LANDFILL</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/features/open_and_sleep.c b/tests/features/open_and_sleep.c<br/>new file mode 100644<br/>index 00000000000..7d0e22a2503<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/features/open_and_sleep.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/features/open_and_sleep.c</a></div><div class='hunk'>@@ -0,0 +1,27 @@</div><div class='add'>+#include &lt;unistd.h&gt;</div><div class='add'>+#include &lt;stdio.h&gt;</div><div class='add'>+#include &lt;fcntl.h&gt;</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+main(int argc, char **argv)</div><div class='add'>+{</div><div class='add'>+    pid_t pid;</div><div class='add'>+    int fd;</div><div class='add'>+</div><div class='add'>+    if (argc &gt;= 2) {</div><div class='add'>+        fd = open(argv[1], O_RDWR | O_CREAT, 0644);</div><div class='add'>+        if (fd == -1) {</div><div class='add'>+            fprintf(stderr, "cannot open/create %s\n", argv[1]);</div><div class='add'>+            return 1;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    pid = getpid();</div><div class='add'>+    printf("%d\n", pid);</div><div class='add'>+    fflush(stdout);</div><div class='add'>+</div><div class='add'>+    for (;;)</div><div class='add'>+        sleep(1);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='head'>diff --git a/tests/features/openssl.cnf.in b/tests/features/openssl.cnf.in<br/>new file mode 100644<br/>index 00000000000..1fce34b11b9<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/features/openssl.cnf.in?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/features/openssl.cnf.in</a></div><div class='hunk'>@@ -0,0 +1,41 @@</div><div class='add'>+[ req ]</div><div class='add'>+distinguished_name	= req_distinguished_name</div><div class='add'>+x509_extensions		= v3_ca </div><div class='add'>+[ req_distinguished_name ]</div><div class='add'>+commonName		= Common Name</div><div class='add'>+commonName_max		= 64</div><div class='add'>+[ v3_ca ]</div><div class='add'>+subjectKeyIdentifier	= hash</div><div class='add'>+authorityKeyIdentifier	= keyid:always,issuer:always</div><div class='add'>+basicConstraints	= CA:true</div><div class='add'>+[ ca ]</div><div class='add'>+default_ca		= CA_default</div><div class='add'>+[ CA_default ]</div><div class='add'>+dir			= @TMPDIR@</div><div class='add'>+certs			= $dir/certs</div><div class='add'>+crl_dir			= $dir/crl</div><div class='add'>+database		= $dir/index.txt</div><div class='add'>+unique_subjecta		= no  </div><div class='add'>+new_certs_dir		= $dir/newcerts</div><div class='add'>+certificate		= $dir/ca.crt</div><div class='add'>+serial			= $dir/serial </div><div class='add'>+crl			= $dir/crl.pem </div><div class='add'>+private_key		= $dir/self.key</div><div class='add'>+x509_extensions		= usr_cert</div><div class='add'>+name_opt 		= ca_default</div><div class='add'>+cert_opt 		= ca_default</div><div class='add'>+default_days		= 365</div><div class='add'>+default_crl_days	= 30</div><div class='add'>+crl_extensions		= crl_ext</div><div class='add'>+default_md		= sha256</div><div class='add'>+preserve		= no</div><div class='add'>+policy			= policy_test</div><div class='add'>+[ policy_test ]</div><div class='add'>+commonName		= supplied</div><div class='add'>+[ usr_cert ]</div><div class='add'>+basicConstraints	= CA:FALSE</div><div class='add'>+subjectKeyIdentifier	= hash</div><div class='add'>+authorityKeyIdentifier	= keyid,issuer:always</div><div class='add'>+crlDistributionPoints	= URI:file://@TMPDIR@/crl.pem</div><div class='add'>+[ crl_ext ]</div><div class='add'>+authorityKeyIdentifier	= keyid:always,issuer:always</div><div class='head'>diff --git a/tests/features/readdir-ahead.t b/tests/features/readdir-ahead.t<br/>new file mode 100755<br/>index 00000000000..75223df61bf<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/features/readdir-ahead.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/features/readdir-ahead.t</a></div><div class='hunk'>@@ -0,0 +1,45 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+#</div><div class='add'>+# Test basic readdir-ahead functionality. Verify that readdir-ahead can be</div><div class='add'>+# enabled, create a set of files and run some ls tests.</div><div class='add'>+#</div><div class='add'>+###</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../include.rc</div><div class='add'>+. $(dirname $0)/../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/$V0</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+TEST $CLI volume set $V0 readdir-ahead on</div><div class='add'>+</div><div class='add'>+TEST $GFS --volfile-id=$V0 --volfile-server=$H0 $M0</div><div class='add'>+</div><div class='add'>+TEST mkdir $M0/test</div><div class='add'>+for i in $(seq 0 99)</div><div class='add'>+do</div><div class='add'>+        touch $M0/test/$i</div><div class='add'>+done</div><div class='add'>+</div><div class='add'>+count=`ls -1 $M0/test | wc -l`</div><div class='add'>+TEST [ $count -eq 100 ]</div><div class='add'>+</div><div class='add'>+count=`ls -1 $M0/test | wc -l`</div><div class='add'>+TEST [ $count -eq 100 ]</div><div class='add'>+</div><div class='add'>+TEST rm -rf $M0/test/*</div><div class='add'>+</div><div class='add'>+count=`ls -1 $M0/test | wc -l`</div><div class='add'>+TEST [ $count -eq 0 ]</div><div class='add'>+</div><div class='add'>+TEST rmdir $M0/test</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0;</div><div class='add'>+TEST $CLI volume stop $V0</div><div class='add'>+TEST $CLI volume delete $V0</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/features/recon.t b/tests/features/recon.t<br/>new file mode 100644<br/>index 00000000000..82ef6fd755d<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/features/recon.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/features/recon.t</a></div><div class='hunk'>@@ -0,0 +1,59 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../traps.rc</div><div class='add'>+. $(dirname $0)/../include.rc</div><div class='add'>+. $(dirname $0)/../volume.rc</div><div class='add'>+. $(dirname $0)/../fdl.rc</div><div class='add'>+</div><div class='add'>+tmpdir=$(mktemp -d -t ${0##*/}.XXXXXX)</div><div class='add'>+push_trapfunc "rm -rf $tmpdir"</div><div class='add'>+</div><div class='add'>+write_file () {</div><div class='add'>+	echo "peekaboo" &gt; $1</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+TEST rm -f $FDL_META_FILE $FDL_DATA_FILE</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+</div><div class='add'>+# Get a simple volume set up and mounted with FDL active.</div><div class='add'>+TEST $CLI volume create $V0 ${H0}:${B0}/${V0}-0</div><div class='add'>+TEST $CLI volume set $V0 features.fdl on</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+TEST $GFS -s $H0 --volfile-id $V0 $M0</div><div class='add'>+</div><div class='add'>+# Generate some I/O and then copy off the journal files for later.</div><div class='add'>+TEST mkdir -p $M0/abc/def</div><div class='add'>+TEST write_file $M0/abc/def/ghi</div><div class='add'>+#EST chmod 314 $M0/abc/def/ghi</div><div class='add'>+cp ${FDL_META_FILE} ${FDL_DATA_FILE} ${tmpdir}</div><div class='add'>+</div><div class='add'>+# Get back to an empty state and unmount.</div><div class='add'>+TEST rm -rf $M0/abc</div><div class='add'>+TEST umount $M0</div><div class='add'>+</div><div class='add'>+# Make sure we really are in an empty state.  Otherwise the tests below could</div><div class='add'>+# pass just because we never cleaned up in the first place.</div><div class='add'>+TEST [ ! -d ${B0}/${V0}-0/abc ]</div><div class='add'>+</div><div class='add'>+# Create a stub volfile.</div><div class='add'>+vol_file=${GLUSTERD_WORKDIR}/vols/${V0}/${V0}.${H0}.${log_id}.vol</div><div class='add'>+vol_id_line=$(grep volume-id ${vol_file})</div><div class='add'>+cat &gt; ${tmpdir}/recon.vol &lt;&lt; EOF</div><div class='add'>+volume recon-posix</div><div class='add'>+    type storage/posix</div><div class='add'>+    option directory ${B0}/${V0}-0</div><div class='add'>+${vol_id_line}</div><div class='add'>+end-volume</div><div class='add'>+EOF</div><div class='add'>+</div><div class='add'>+TEST gf_recon ${tmpdir}/recon.vol ${tmpdir}/$(basename ${FDL_META_FILE}) \</div><div class='add'>+				  ${tmpdir}/$(basename ${FDL_DATA_FILE})</div><div class='add'>+</div><div class='add'>+TEST [ -d ${B0}/${V0}-0/abc/def ]</div><div class='add'>+EXPECT "peekaboo" cat ${B0}/${V0}-0/abc/def/ghi</div><div class='add'>+# TBD: test permissions, xattrs</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='add'>+#G_TESTDEF_TEST_STATUS_CENTOS6=KNOWN_ISSUE,BUG=1385758</div><div class='add'>+#G_TESTDEF_TEST_STATUS_NETBSD7=KNOWN_ISSUE,BUG=1385758</div><div class='head'>diff --git a/tests/features/ssl-authz.t b/tests/features/ssl-authz.t<br/>new file mode 100755<br/>index 00000000000..497083e5a3a<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/features/ssl-authz.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/features/ssl-authz.t</a></div><div class='hunk'>@@ -0,0 +1,121 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../include.rc</div><div class='add'>+. $(dirname $0)/../volume.rc</div><div class='add'>+</div><div class='add'>+ping_file () {</div><div class='add'>+        echo hello &gt; $1 2&gt; /dev/null</div><div class='add'>+}</div><div class='add'>+for d in /etc/ssl /etc/openssl /usr/local/etc/openssl ; do</div><div class='add'>+        if test -d $d ; then</div><div class='add'>+                SSL_BASE=$d</div><div class='add'>+                break</div><div class='add'>+        fi</div><div class='add'>+done</div><div class='add'>+SSL_KEY=$SSL_BASE/glusterfs.key</div><div class='add'>+SSL_CERT=$SSL_BASE/glusterfs.pem</div><div class='add'>+SSL_CA=$SSL_BASE/glusterfs.ca</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+rm -f $SSL_BASE/glusterfs.*</div><div class='add'>+mkdir -p $B0/1</div><div class='add'>+mkdir -p $M0</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume info;</div><div class='add'>+</div><div class='add'>+TEST $CLI v set all cluster.brick-multiplex on</div><div class='add'>+# Construct a cipher list that excludes CBC because of POODLE.</div><div class='add'>+# http://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2014-3566</div><div class='add'>+#</div><div class='add'>+# Since this is a bit opaque, here's what it does:</div><div class='add'>+#	(1) Get the ciphers matching a normal cipher-list spec</div><div class='add'>+#	(2) Delete any colon-separated entries containing "CBC"</div><div class='add'>+#	(3) Collapse adjacent colons from deleted entries</div><div class='add'>+#	(4) Remove colons at the beginning or end</div><div class='add'>+function valid_ciphers {</div><div class='add'>+	openssl ciphers 'HIGH:!SSLv2' | sed	\</div><div class='add'>+		-e '/[^:]*CBC[^:]*/s///g'	\</div><div class='add'>+		-e '/::*/s//:/g'		\</div><div class='add'>+		-e '/^:/s///'			\</div><div class='add'>+		-e '/:$/s///'</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+TEST openssl genrsa -out $SSL_KEY 2048</div><div class='add'>+TEST openssl req -new -x509 -key $SSL_KEY -subj /CN=Anyone -out $SSL_CERT</div><div class='add'>+ln $SSL_CERT $SSL_CA</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 replica 3 $H0:$B0/{1,2,3} force</div><div class='add'>+TEST $CLI volume set $V0 server.ssl on</div><div class='add'>+TEST $CLI volume set $V0 client.ssl on</div><div class='add'>+TEST $CLI volume set $V0 ssl.cipher-list $(valid_ciphers)</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "3" online_brick_count</div><div class='add'>+</div><div class='add'>+# This mount should SUCCEED because ssl-allow=* by default.  This effectively</div><div class='add'>+# disables SSL authorization, though authentication and encryption might still</div><div class='add'>+# be enabled.</div><div class='add'>+TEST glusterfs --volfile-server=$H0 --volfile-id=$V0 $M0</div><div class='add'>+TEST ping_file $M0/before</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+</div><div class='add'>+glusterfsd_pid=`pgrep glusterfsd`</div><div class='add'>+TEST [ $glusterfsd_pid != 0 ]</div><div class='add'>+start=`pmap -x $glusterfsd_pid | grep total | awk -F " " '{print $4}'`</div><div class='add'>+echo "Memory consumption for glusterfsd process"</div><div class='add'>+for i in $(seq 1 100); do</div><div class='add'>+        gluster v heal $V0 info &gt;/dev/null</div><div class='add'>+done</div><div class='add'>+#Wait to cleanup memory</div><div class='add'>+sleep 10</div><div class='add'>+end=`pmap -x $glusterfsd_pid | grep total | awk -F " " '{print $4}'`</div><div class='add'>+diff=$((end-start))</div><div class='add'>+</div><div class='add'>+# If memory consumption is more than 15M some leak in SSL code path</div><div class='add'>+</div><div class='add'>+TEST [ $diff -lt 15000 ]</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+# Set ssl-allow to a wildcard that includes our identity.</div><div class='add'>+TEST $CLI volume stop $V0</div><div class='add'>+TEST $CLI volume set $V0 auth.ssl-allow Any*</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "3" online_brick_count</div><div class='add'>+</div><div class='add'>+# This mount should SUCCEED because we match the wildcard.</div><div class='add'>+TEST glusterfs --volfile-server=$H0 --volfile-id=$V0 $M0</div><div class='add'>+TEST ping_file $M0/before</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+</div><div class='add'>+# Set ssl-allow to include the identity we've created.</div><div class='add'>+TEST $CLI volume stop $V0</div><div class='add'>+TEST $CLI volume set $V0 auth.ssl-allow Anyone</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+# This mount should SUCCEED because this specific identity is allowed.</div><div class='add'>+TEST glusterfs --volfile-server=$H0 --volfile-id=$V0 $M0</div><div class='add'>+TEST ping_file $M0/before</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+</div><div class='add'>+# Change the authorized user name.  Note that servers don't pick up changes</div><div class='add'>+# automagically like clients do, so we have to stop/start ourselves.</div><div class='add'>+TEST $CLI volume stop $V0</div><div class='add'>+TEST $CLI volume set $V0 auth.ssl-allow NotYou</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+# This mount should FAIL because the identity given by our certificate does not</div><div class='add'>+# match the allowed user.  In other words, authentication works (they know who</div><div class='add'>+# we are) but authorization doesn't (we're not the right person).</div><div class='add'>+TEST $GFS --volfile-server=$H0 --volfile-id=$V0 $M0</div><div class='add'>+</div><div class='add'>+# Looks like /*/bin/glusterfs isn't returning error status correctly (again).</div><div class='add'>+# We may get an unusable mount where ping will fail, or no mount at all,</div><div class='add'>+# where ping will write to the mount point instead of the mounted filesystem.</div><div class='add'>+# In order to avoid spurious failures, create a file by ping and check it</div><div class='add'>+# is absent from the brick.</div><div class='add'>+ping_file $M0/after</div><div class='add'>+TEST test -f $B0/1/before</div><div class='add'>+TEST ! test -f $B0/1/after</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/features/ssl-ciphers.t b/tests/features/ssl-ciphers.t<br/>new file mode 100644<br/>index 00000000000..b70fe360e02<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/features/ssl-ciphers.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/features/ssl-ciphers.t</a></div><div class='hunk'>@@ -0,0 +1,244 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../include.rc</div><div class='add'>+. $(dirname $0)/../volume.rc</div><div class='add'>+</div><div class='add'>+brick_port() {</div><div class='add'>+        $CLI --xml volume status $1 | sed -n '/.*&lt;port&gt;\([0-9]*\).*/s//\1/p'</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+wait_mount() {</div><div class='add'>+	i=1</div><div class='add'>+	while [ $i -lt $CONFIG_UPDATE_TIMEOUT ] ; do</div><div class='add'>+		sleep 1</div><div class='add'>+		i=$(( $i + 1 ))</div><div class='add'>+		mounted=`mount|awk -v m=$1 '</div><div class='add'>+				BEGIN {r = "N";}</div><div class='add'>+				($3 == m) {r = "Y"; exit;}</div><div class='add'>+				END {print r;}</div><div class='add'>+		'`</div><div class='add'>+		if [ "x${mounted}" = "xY" ] ; then</div><div class='add'>+			ls $M0 2&gt;/dev/null || continue</div><div class='add'>+			break;</div><div class='add'>+		fi</div><div class='add'>+	done</div><div class='add'>+</div><div class='add'>+	if [ "x${mounted}" = "xY" ] ; then</div><div class='add'>+		ls $M0 2&gt;/dev/null || mounted="N"</div><div class='add'>+	fi</div><div class='add'>+</div><div class='add'>+	echo $mounted</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+openssl_connect() {</div><div class='add'>+	ssl_opt="-verify 3 -verify_return_error -CAfile $SSL_CA"</div><div class='add'>+	ssl_opt="$ssl_opt -crl_check_all -CApath $TMPDIR"</div><div class='add'>+        cmd="echo "" | openssl s_client $ssl_opt $@ 2&gt;/dev/null"</div><div class='add'>+        CIPHER=$(eval $cmd | awk -F "Cipher is" '{print $2}' | tr -d '[:space:]' | awk -F " " '{print $1}')</div><div class='add'>+	if [ "x${CIPHER}" = "x" -o "x${CIPHER}" = "x0000" -o "x${CIPHER}" = "x(NONE)" ] ; then</div><div class='add'>+		echo "N"</div><div class='add'>+	else</div><div class='add'>+		echo "Y"</div><div class='add'>+	fi</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#Validate the cipher to pass EXPECT test case before call openssl_connect</div><div class='add'>+check_cipher() {</div><div class='add'>+       cmd="echo "" | openssl s_client $@ 2&gt; /dev/null"</div><div class='add'>+       cipher=$(eval $cmd |awk -F "Cipher is" '{print $2}' | tr -d '[:space:]' | awk -F " " '{print $1}')</div><div class='add'>+       if [ "x${cipher}" = "x" -o "x${cipher}" = "x0000" -o "x${cipher}" = "x(NONE)" ] ; then</div><div class='add'>+                echo "N"</div><div class='add'>+        else</div><div class='add'>+                echo "Y"</div><div class='add'>+       fi</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+mkdir -p $B0</div><div class='add'>+mkdir -p $M0</div><div class='add'>+</div><div class='add'>+TMPDIR=`mktemp -d /tmp/${0##*/}.XXXXXX`</div><div class='add'>+TEST test -d $TMPDIR</div><div class='add'>+</div><div class='add'>+SSL_KEY=$TMPDIR/self.key</div><div class='add'>+SSL_CSR=$TMPDIR/self.csr</div><div class='add'>+SSL_CERT=$TMPDIR/self.crt</div><div class='add'>+SSL_CA=$TMPDIR/ca.crt</div><div class='add'>+SSL_CFG=$TMPDIR/openssl.cnf</div><div class='add'>+SSL_CRL=$TMPDIR/crl.pem</div><div class='add'>+</div><div class='add'>+sed "s|@TMPDIR@|${TMPDIR}|" `pwd`/`dirname $0`/openssl.cnf.in &gt; $SSL_CFG</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume info;</div><div class='add'>+</div><div class='add'>+TEST openssl genrsa -out $SSL_KEY 2048 2&gt;/dev/null</div><div class='add'>+TEST openssl req -config $SSL_CFG -new -key $SSL_KEY -x509 \</div><div class='add'>+                  -subj /CN=CA -out $SSL_CA</div><div class='add'>+TEST openssl req -config $SSL_CFG -new -key $SSL_KEY \</div><div class='add'>+                  -subj /CN=$H0 -out $SSL_CSR</div><div class='add'>+</div><div class='add'>+echo "01" &gt; $TMPDIR/serial</div><div class='add'>+TEST touch $TMPDIR/index.txt $TMPDIR/index.txx.attr</div><div class='add'>+TEST mkdir -p $TMPDIR/certs $TMPDIR/newcerts $TMPDIR/crl</div><div class='add'>+TEST openssl ca -batch -config $SSL_CFG -in $SSL_CSR -out $SSL_CERT 2&gt;&amp;1</div><div class='add'>+</div><div class='add'>+touch $SSL_CRL</div><div class='add'>+CRLHASH=`openssl x509 -hash -fingerprint -noout -in $SSL_CA|sed -n '1s/$/.r0/p'`</div><div class='add'>+ln -sf $SSL_CRL $TMPDIR/$CRLHASH</div><div class='add'>+TEST openssl ca -config $SSL_CFG -gencrl -out $SSL_CRL 2&gt;&amp;1</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/1</div><div class='add'>+TEST $CLI volume set $V0 server.ssl on</div><div class='add'>+TEST $CLI volume set $V0 client.ssl on</div><div class='add'>+TEST $CLI volume set $V0 ssl.private-key $SSL_KEY</div><div class='add'>+TEST $CLI volume set $V0 ssl.own-cert $SSL_CERT</div><div class='add'>+TEST $CLI volume set $V0 ssl.ca-list $SSL_CA</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" online_brick_count</div><div class='add'>+</div><div class='add'>+BRICK_PORT=`brick_port $V0`</div><div class='add'>+</div><div class='add'>+# Test we can connect</div><div class='add'>+EXPECT "Y" openssl_connect -connect $H0:$BRICK_PORT</div><div class='add'>+</div><div class='add'>+# Test SSLv2 protocol fails</div><div class='add'>+EXPECT "N" openssl_connect -ssl2 -connect $H0:$BRICK_PORT</div><div class='add'>+</div><div class='add'>+# Test SSLv3 protocol fails</div><div class='add'>+EXPECT "N" openssl_connect -ssl3 -connect $H0:$BRICK_PORT</div><div class='add'>+</div><div class='add'>+# Test TLSv1 protocol based on openssl version</div><div class='add'>+cmd="openssl version"</div><div class='add'>+ver=$(eval $cmd | awk -F " " '{print $2}' | grep "^1.1")</div><div class='add'>+if [ "x${ver}" = "x" ]; then</div><div class='add'>+    supp="N"</div><div class='add'>+else</div><div class='add'>+    supp="Y"</div><div class='add'>+fi</div><div class='add'>+EXPECT "${supp}" openssl_connect -tls1 -connect $H0:$BRICK_PORT</div><div class='add'>+</div><div class='add'>+# Test a HIGH CBC cipher</div><div class='add'>+cph=`check_cipher -cipher AES256-SHA -connect $H0:$BRICK_PORT`</div><div class='add'>+EXPECT "$cph" openssl_connect -cipher AES256-SHA -connect $H0:$BRICK_PORT</div><div class='add'>+</div><div class='add'>+# Test EECDH</div><div class='add'>+cph=`check_cipher -cipher EECDH -connect $H0:$BRICK_PORT`</div><div class='add'>+EXPECT "$cph" openssl_connect -cipher EECDH -connect $H0:$BRICK_PORT</div><div class='add'>+</div><div class='add'>+# test MD5 fails</div><div class='add'>+cph=`check_cipher -cipher DES-CBC3-MD5 -connect $H0:$BRICK_PORT`</div><div class='add'>+EXPECT "$cph" openssl_connect -cipher DES-CBC3-MD5 -connect $H0:$BRICK_PORT</div><div class='add'>+</div><div class='add'>+# test RC4 fails</div><div class='add'>+cph=`check_cipher -cipher RC4-SHA -connect $H0:$BRICK_PORT`</div><div class='add'>+EXPECT "$cph" openssl_connect -cipher RC4-SHA -connect $H0:$BRICK_PORT</div><div class='add'>+</div><div class='add'>+# test eNULL fails</div><div class='add'>+cph=`check_cipher -cipher NULL-SHA256 -connect $H0:$BRICK_PORT`</div><div class='add'>+EXPECT "$cph" openssl_connect -cipher NULL-SHA256 -connect $H0:$BRICK_PORT</div><div class='add'>+</div><div class='add'>+# test SHA2</div><div class='add'>+cph=`check_cipher -cipher AES256-SHA256 -connect $H0:$BRICK_PORT`</div><div class='add'>+EXPECT "$cph" openssl_connect -cipher AES256-SHA256 -connect $H0:$BRICK_PORT</div><div class='add'>+</div><div class='add'>+# test GCM</div><div class='add'>+cph=`check_cipher -cipher AES256-GCM-SHA384 -connect $H0:$BRICK_PORT`</div><div class='add'>+EXPECT "$cph" openssl_connect -cipher AES256-GCM-SHA384 -connect $H0:$BRICK_PORT</div><div class='add'>+</div><div class='add'>+# Test DH fails without DH params</div><div class='add'>+cph=`check_cipher -cipher EDH -connect $H0:$BRICK_PORT`</div><div class='add'>+EXPECT "$cph" openssl_connect -cipher EDH -connect $H0:$BRICK_PORT</div><div class='add'>+</div><div class='add'>+# Test DH with DH params</div><div class='add'>+TEST $CLI volume set $V0 ssl.dh-param `pwd`/`dirname $0`/dh1024.pem</div><div class='add'>+EXPECT "`pwd`/`dirname $0`/dh1024.pem" volume_option $V0 ssl.dh-param</div><div class='add'>+TEST $CLI volume stop $V0</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" online_brick_count</div><div class='add'>+BRICK_PORT=`brick_port $V0`</div><div class='add'>+EXPECT "Y" openssl_connect -cipher EDH -connect $H0:$BRICK_PORT</div><div class='add'>+</div><div class='add'>+# Test the cipher-list option</div><div class='add'>+TEST $CLI volume set $V0 ssl.cipher-list AES256-SHA</div><div class='add'>+EXPECT AES256-SHA volume_option $V0 ssl.cipher-list</div><div class='add'>+TEST $CLI volume stop $V0</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" online_brick_count</div><div class='add'>+BRICK_PORT=`brick_port $V0`</div><div class='add'>+cph=`check_cipher -cipher AES256-SHA -connect $H0:$BRICK_PORT`</div><div class='add'>+EXPECT "$cph" openssl_connect -cipher AES256-SHA -connect $H0:$BRICK_PORT</div><div class='add'>+cph=`check_cipher -cipher AES128-SHA -connect $H0:$BRICK_PORT`</div><div class='add'>+EXPECT "$cph" openssl_connect -cipher AES128-SHA -connect $H0:$BRICK_PORT</div><div class='add'>+</div><div class='add'>+# Test the ec-curve option</div><div class='add'>+TEST $CLI volume set $V0 ssl.cipher-list EECDH:EDH:!TLSv1</div><div class='add'>+EXPECT EECDH:EDH:!TLSv1 volume_option $V0 ssl.cipher-list</div><div class='add'>+TEST $CLI volume stop $V0</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" online_brick_count</div><div class='add'>+BRICK_PORT=`brick_port $V0`</div><div class='add'>+cph=`check_cipher -cipher AES256-SHA -connect $H0:$BRICK_PORT`</div><div class='add'>+EXPECT "$cph" openssl_connect -cipher AES256-SHA -connect $H0:$BRICK_PORT</div><div class='add'>+cph=`check_cipher -cipher EECDH -connect $H0:$BRICK_PORT`</div><div class='add'>+EXPECT "$cph" openssl_connect -cipher EECDH -connect $H0:$BRICK_PORT</div><div class='add'>+</div><div class='add'>+TEST $CLI volume set $V0 ssl.ec-curve invalid</div><div class='add'>+EXPECT invalid volume_option $V0 ssl.ec-curve</div><div class='add'>+TEST $CLI volume stop $V0</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" online_brick_count</div><div class='add'>+BRICK_PORT=`brick_port $V0`</div><div class='add'>+cph=`check_cipher -cipher EECDH -connect $H0:$BRICK_PORT`</div><div class='add'>+EXPECT "$cph" openssl_connect -cipher EECDH -connect $H0:$BRICK_PORT</div><div class='add'>+</div><div class='add'>+TEST $CLI volume set $V0 ssl.ec-curve secp521r1</div><div class='add'>+EXPECT secp521r1 volume_option $V0 ssl.ec-curve</div><div class='add'>+TEST $CLI volume stop $V0</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" online_brick_count</div><div class='add'>+BRICK_PORT=`brick_port $V0`</div><div class='add'>+EXPECT "Y" openssl_connect -cipher EECDH -connect $H0:$BRICK_PORT</div><div class='add'>+</div><div class='add'>+# test revocation</div><div class='add'>+TEST $CLI volume set $V0 ssl.crl-path $TMPDIR</div><div class='add'>+EXPECT $TMPDIR volume_option $V0 ssl.crl-path</div><div class='add'>+$GFS --volfile-id=$V0 --volfile-server=$H0 $M0</div><div class='add'>+EXPECT "Y" wait_mount $M0</div><div class='add'>+TEST_FILE=`mktemp $M0/${0##*/}.XXXXXX`</div><div class='add'>+TEST test -f $TEST_FILE</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+</div><div class='add'>+TEST openssl ca -batch -config $SSL_CFG -revoke $SSL_CERT 2&gt;&amp;1</div><div class='add'>+TEST openssl ca -config $SSL_CFG -gencrl -out $SSL_CRL 2&gt;&amp;1</div><div class='add'>+</div><div class='add'>+# Failed once revoked</div><div class='add'>+# Although client fails to mount without restarting the server after crl-path</div><div class='add'>+# is set when no actual crl file is found on the client, it would also fail</div><div class='add'>+# when server is restarted for the same reason. Since the socket initialization</div><div class='add'>+# code is the same for client and server, the crl verification flags need to</div><div class='add'>+# be turned off for the client to avoid SSL searching for CRLs in the</div><div class='add'>+# ssl.crl-path. If no CRL files are found in the ssl.crl-path, SSL fails the</div><div class='add'>+# connect() attempt on the client.</div><div class='add'>+TEST $CLI volume stop $V0</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+$GFS --volfile-id=$V0 --volfile-server=$H0 $M0</div><div class='add'>+EXPECT "N" wait_mount $M0</div><div class='add'>+TEST ! test -f $TEST_FILE</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+</div><div class='add'>+# Succeed with CRL disabled</div><div class='add'>+TEST $CLI volume stop $V0</div><div class='add'>+TEST $CLI volume set $V0 ssl.crl-path NULL</div><div class='add'>+EXPECT NULL volume_option $V0 ssl.crl-path</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+$GFS --volfile-id=$V0 --volfile-server=$H0 $M0</div><div class='add'>+EXPECT "Y" wait_mount $M0</div><div class='add'>+TEST test -f $TEST_FILE</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+</div><div class='add'>+rm -rf $TMPDIR</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/features/subdir-mount.t b/tests/features/subdir-mount.t<br/>new file mode 100644<br/>index 00000000000..a02bd6befc4<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/features/subdir-mount.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/features/subdir-mount.t</a></div><div class='hunk'>@@ -0,0 +1,121 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../include.rc</div><div class='add'>+. $(dirname $0)/../nfs.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+## Start and create a volume</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume info;</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 replica 2 $H0:$B0/${V0}{1,2,3,4};</div><div class='add'>+</div><div class='add'>+## Start volume and verify</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+</div><div class='add'>+## Mount FUSE with caching disabled (read-write)</div><div class='add'>+TEST $GFS -s $H0 --volfile-id $V0 --volume-name ${V0}-dht $M0;</div><div class='add'>+</div><div class='add'>+TEST ! stat $M0/subdir1;</div><div class='add'>+TEST mkdir $M0/subdir1;</div><div class='add'>+TEST ! stat $M0/subdir2;</div><div class='add'>+TEST mkdir $M0/subdir2;</div><div class='add'>+TEST ! stat $M0/subdir1/subdir1.1;</div><div class='add'>+TEST mkdir $M0/subdir1/subdir1.1;</div><div class='add'>+TEST ! stat $M0/subdir1/subdir1.1/subdir1.2;</div><div class='add'>+TEST mkdir $M0/subdir1/subdir1.1/subdir1.2;</div><div class='add'>+</div><div class='add'>+# mount volume/subdir1</div><div class='add'>+TEST $GFS --subdir-mount /subdir1 -s $H0 --volfile-id $V0 --volume-name ${V0}-dht $M1;</div><div class='add'>+</div><div class='add'>+TEST touch $M0/topfile;</div><div class='add'>+TEST ! stat $M1/topfile;</div><div class='add'>+</div><div class='add'>+TEST touch $M1/subdir1_file;</div><div class='add'>+TEST ! stat $M0/subdir1_file;</div><div class='add'>+TEST stat $M0/subdir1/subdir1_file;</div><div class='add'>+</div><div class='add'>+# mount volume/subdir2</div><div class='add'>+TEST $GFS --subdir-mount /subdir2 -s $H0 --volfile-id $V0 $M2;</div><div class='add'>+</div><div class='add'>+TEST ! stat $M2/topfile;</div><div class='add'>+</div><div class='add'>+TEST touch $M2/subdir2_file;</div><div class='add'>+TEST ! stat $M0/subdir2_file;</div><div class='add'>+TEST ! stat $M1/subdir2_file;</div><div class='add'>+TEST stat $M0/subdir2/subdir2_file;</div><div class='add'>+</div><div class='add'>+# umount $M1 / $M2</div><div class='add'>+TEST umount $M1</div><div class='add'>+TEST umount $M2</div><div class='add'>+</div><div class='add'>+# mount non-existing subdir ; this works with mount.glusterfs,</div><div class='add'>+# but with glusterfs, the script doesn't returns error.</div><div class='add'>+#TEST ! $GFS --subdir-mount subdir_not_there -s $H0 --volfile-id $V0 $M1;</div><div class='add'>+</div><div class='add'>+# mount subdir with depth</div><div class='add'>+TEST $GFS --subdir-mount /subdir1/subdir1.1/subdir1.2 -s $H0 --volfile-id $V0 $M2;</div><div class='add'>+TEST ! stat $M2/topfile;</div><div class='add'>+TEST touch $M2/subdir1.2_file;</div><div class='add'>+TEST ! stat $M0/subdir1.2_file;</div><div class='add'>+TEST stat $M0/subdir1/subdir1.1/subdir1.2/subdir1.2_file;</div><div class='add'>+</div><div class='add'>+TEST umount $M2</div><div class='add'>+</div><div class='add'>+# Lets validate the options # Not having '*' in here as there was some</div><div class='add'>+# problem with option validation with this</div><div class='add'>+TEST $CLI volume set $V0 auth.allow 192.168.1.1</div><div class='add'>+</div><div class='add'>+TEST $CLI volume set $V0 auth.allow "192.168.1.1,10.10.\*.\*,::1"</div><div class='add'>+</div><div class='add'>+TEST $CLI volume set $V0 auth.allow "/subdir1\(1.2.3.4\),/\(192.168.10.2\|192.168.11.1\),/subdir2\(1.2.3.4\)"</div><div class='add'>+</div><div class='add'>+# directories should be absolute</div><div class='add'>+TEST ! $CLI volume set $V0 auth.allow "subdir2\(1.2.3.4\)"</div><div class='add'>+</div><div class='add'>+# support subdir inside subdir</div><div class='add'>+TEST $CLI volume set $V0 auth.allow '/subdir1/subdir1.1/subdir1.2/\(1.2.3.4\|::1\),/\(192.168.10.1\|192.168.11.1\),/subdir2\(1.2.3.4\)'</div><div class='add'>+</div><div class='add'>+TEST $CLI volume stop $V0</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+</div><div class='add'>+TEST $GFS --subdir-mount /subdir1/subdir1.1/subdir1.2 -s $H0 --volfile-id $V0 $M2</div><div class='add'>+TEST stat $M2</div><div class='add'>+</div><div class='add'>+initcnt=`grep -i create-subdir-mounts /var/log/glusterfs/glusterd.log  | wc -l`</div><div class='add'>+# mount shouldn't fail even after add-brick</div><div class='add'>+TEST $CLI volume add-brick $V0 replica 2 $H0:$B0/${V0}{5,6};</div><div class='add'>+</div><div class='add'>+# Wait to execute create-subdir-mounts.sh script by glusterd</div><div class='add'>+newcnt=`grep -i create-subdir-mounts /var/log/glusterfs/glusterd.log  | wc -l`</div><div class='add'>+while [ $newcnt -eq $initcnt ]</div><div class='add'>+do</div><div class='add'>+   newcnt=`grep -i create-subdir-mounts /var/log/glusterfs/glusterd.log  | wc -l`</div><div class='add'>+   sleep 1</div><div class='add'>+done</div><div class='add'>+</div><div class='add'>+# Existing mount should still be active</div><div class='add'>+mount_inode=$(stat --format "%i" "$M2")</div><div class='add'>+TEST test "$mount_inode" == "1"</div><div class='add'>+</div><div class='add'>+TEST umount $M2</div><div class='add'>+</div><div class='add'>+# Now the exported subdirs should be automatically healed due to</div><div class='add'>+# hook scripts. Check if the mount is successful.</div><div class='add'>+TEST $GFS --subdir-mount /subdir2 -s $H0 --volfile-id $V0 $M2</div><div class='add'>+mount_inode=$(stat --format "%i" "$M2")</div><div class='add'>+TEST test "$mount_inode" == "1"</div><div class='add'>+</div><div class='add'>+TEST umount $M0</div><div class='add'>+TEST umount $M2</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+TEST $CLI volume stop $V0;</div><div class='add'>+TEST $CLI volume delete $V0;</div><div class='add'>+TEST ! $CLI volume info $V0;</div><div class='add'>+</div><div class='add'>+## This should clean the mountpoints</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/features/trash.t b/tests/features/trash.t<br/>new file mode 100755<br/>index 00000000000..da5b50bc85a<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/features/trash.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/features/trash.t</a></div><div class='hunk'>@@ -0,0 +1,247 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../include.rc</div><div class='add'>+. $(dirname $0)/../volume.rc</div><div class='add'>+. $(dirname $0)/../dht.rc</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='add'>+</div><div class='add'>+test_mount() {</div><div class='add'>+        volume=$1</div><div class='add'>+        mount=$2</div><div class='add'>+        test_dir=$3</div><div class='add'>+        RETVAL=0</div><div class='add'>+        glusterfs -s $H0 --volfile-id $volume $mount --attribute-timeout=0</div><div class='add'>+</div><div class='add'>+        if [ "x$test_dir" = "x" ] ; then return $RETVAL; fi</div><div class='add'>+</div><div class='add'>+        timeout=0</div><div class='add'>+        while [ $timeout -lt $PROCESS_UP_TIMEOUT ] ; do</div><div class='add'>+                timeout=$(( $timeout + 1 ))</div><div class='add'>+                test -d $test_dir</div><div class='add'>+                RETVAL=$?</div><div class='add'>+                if [ $RETVAL -eq 0 ] ; then break ; fi</div><div class='add'>+                sleep 1</div><div class='add'>+        done</div><div class='add'>+</div><div class='add'>+        return $RETVAL</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+start_vol() {</div><div class='add'>+        volume=$1</div><div class='add'>+        mount=$2</div><div class='add'>+        test_dir=$3</div><div class='add'>+        $CLI volume start $volume</div><div class='add'>+        test_mount $volume $mount $test_dir</div><div class='add'>+        RETVAL=$?</div><div class='add'>+        return $RETVAL</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+create_files() {</div><div class='add'>+        echo 'Hi' &gt; $1</div><div class='add'>+        echo 'Hai' &gt; $2</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+file_exists () {</div><div class='add'>+        vol=$1</div><div class='add'>+        shift</div><div class='add'>+        for file in `ls $B0/${vol}1/$@ 2&gt; /dev/null` ; do</div><div class='add'>+                test -e ${file} &amp;&amp; return 0</div><div class='add'>+        done</div><div class='add'>+        for file in `ls $B0/${vol}2/$@ 2&gt; /dev/null` ; do</div><div class='add'>+                test -e ${file} &amp;&amp; return 0</div><div class='add'>+        done</div><div class='add'>+</div><div class='add'>+        return 1</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+unlink_op() {</div><div class='add'>+</div><div class='add'>+        rm -f $M0/$1</div><div class='add'>+        ls $M0/.trashcan/1/2/3 &amp;&gt; /dev/null</div><div class='add'>+        sleep 2</div><div class='add'>+</div><div class='add'>+        test ! -e $M0/$1</div><div class='add'>+        wildcard_exists $M0/.trashcan/$1*</div><div class='add'>+</div><div class='add'>+        # remove from trashcan</div><div class='add'>+        rm -f $M0/.trashcan/$1*</div><div class='add'>+        wildcard_not_exists $M0/.trashcan/$1*</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+truncate_op() {</div><div class='add'>+        truncate -s 2 $M0/$1</div><div class='add'>+        ls $M0/.trashcan/1/2/3 &amp;&gt; /dev/null</div><div class='add'>+        sleep 2</div><div class='add'>+</div><div class='add'>+        test -e $M0/$1</div><div class='add'>+        test $(ls -l $M0/$1 | awk '{print $5}') -eq 2 &amp;&gt; /dev/null</div><div class='add'>+        wildcard_exists $M0/.trashcan/$1*</div><div class='add'>+        test $(ls -l $M0/.trashcan/$1*|awk '{print $5}') -eq $2 &amp;&gt; /dev/null</div><div class='add'>+</div><div class='add'>+        # truncate from trashcan</div><div class='add'>+        truncate -s 1 $M0/.trashcan/$1*</div><div class='add'>+        test $(ls $M0/.trashcan/$1* | wc -l) -eq 1</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+wildcard_exists() {</div><div class='add'>+        test -e $1</div><div class='add'>+        if [ $? -eq 0 ]; then echo "Y"; else echo "N"; fi</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+wildcard_not_exists() {</div><div class='add'>+        test ! -e $1</div><div class='add'>+        if [ $? -eq 0 ]; then echo "Y"; else echo "N"; fi</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+# testing glusterd</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume info</div><div class='add'>+</div><div class='add'>+# creating distributed volume</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/${V0}{1,2}</div><div class='add'>+</div><div class='add'>+# checking volume status</div><div class='add'>+EXPECT "$V0" volinfo_field $V0 'Volume Name'</div><div class='add'>+EXPECT 'Created' volinfo_field $V0 'Status'</div><div class='add'>+EXPECT '2' brick_count $V0</div><div class='add'>+</div><div class='add'>+# test without enabling trash translator</div><div class='add'>+TEST start_vol $V0 $M0</div><div class='add'>+</div><div class='add'>+# test on enabling trash translator</div><div class='add'>+TEST $CLI volume set $V0 features.trash on</div><div class='add'>+EXPECT 'on' volinfo_field $V0 'features.trash'</div><div class='add'>+</div><div class='add'>+# files directly under mount point</div><div class='add'>+create_files $M0/file1 $M0/file2</div><div class='add'>+TEST file_exists $V0 file1 file2</div><div class='add'>+</div><div class='add'>+# perform unlink</div><div class='add'>+TEST unlink_op file1</div><div class='add'>+</div><div class='add'>+# perform truncate</div><div class='add'>+TEST truncate_op file2 4</div><div class='add'>+</div><div class='add'>+# create files directory hierarchy and check</div><div class='add'>+mkdir -p $M0/1/2/3</div><div class='add'>+create_files $M0/1/2/3/foo1 $M0/1/2/3/foo2</div><div class='add'>+TEST file_exists $V0 1/2/3/foo1 1/2/3/foo2</div><div class='add'>+</div><div class='add'>+# perform unlink</div><div class='add'>+TEST unlink_op 1/2/3/foo1</div><div class='add'>+</div><div class='add'>+# perform truncate</div><div class='add'>+TEST truncate_op 1/2/3/foo2 4</div><div class='add'>+</div><div class='add'>+# create a directory for eliminate pattern</div><div class='add'>+mkdir $M0/a</div><div class='add'>+</div><div class='add'>+# set the eliminate pattern</div><div class='add'>+TEST $CLI volume set $V0 features.trash-eliminate-path /a</div><div class='add'>+EXPECT '/a' volinfo_field $V0 'features.trash-eliminate-path'</div><div class='add'>+</div><div class='add'>+# create two files and check</div><div class='add'>+create_files $M0/a/test1 $M0/a/test2</div><div class='add'>+TEST file_exists $V0 a/test1 a/test2</div><div class='add'>+</div><div class='add'>+# remove from eliminate pattern</div><div class='add'>+rm -f $M0/a/test1</div><div class='add'>+EXPECT "Y" wildcard_not_exists $M0/.trashcan/a/test1*</div><div class='add'>+</div><div class='add'>+# truncate from eliminate path</div><div class='add'>+truncate -s 2 $M0/a/test2</div><div class='add'>+TEST [ -e $M0/a/test2 ]</div><div class='add'>+TEST [ `ls -l $M0/a/test2 | awk '{print $5}'` -eq 2 ]</div><div class='add'>+EXPECT "Y" wildcard_not_exists $M0/.trashcan/a/test2*</div><div class='add'>+</div><div class='add'>+# set internal op on</div><div class='add'>+TEST $CLI volume set $V0 features.trash-internal-op on</div><div class='add'>+EXPECT 'on' volinfo_field $V0 'features.trash-internal-op'</div><div class='add'>+</div><div class='add'>+# again create two files and check</div><div class='add'>+create_files $M0/inop1 $M0/inop2</div><div class='add'>+TEST file_exists $V0 inop1 inop2</div><div class='add'>+</div><div class='add'>+# perform unlink</div><div class='add'>+TEST unlink_op inop1</div><div class='add'>+</div><div class='add'>+# perform truncate</div><div class='add'>+TEST truncate_op inop2 4</div><div class='add'>+</div><div class='add'>+# remove one brick and restart the volume</div><div class='add'>+TEST $CLI volume remove-brick $V0 $H0:$B0/${V0}2 force</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+TEST $CLI volume stop $V0</div><div class='add'>+TEST start_vol $V0 $M0 $M0/.trashcan</div><div class='add'>+</div><div class='add'>+# again create two files and check</div><div class='add'>+create_files $M0/rebal1 $M0/rebal2</div><div class='add'>+TEST file_exists $V0 rebal1 rebal2</div><div class='add'>+</div><div class='add'>+# add one brick</div><div class='add'>+TEST $CLI volume add-brick $V0 $H0:$B0/${V0}3</div><div class='add'>+TEST [ -d $B0/${V0}3 ]</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+# perform rebalance</div><div class='add'>+TEST $CLI volume rebalance $V0 start force</div><div class='add'>+EXPECT_WITHIN $REBALANCE_TIMEOUT "0" rebalance_completed</div><div class='add'>+</div><div class='add'>+#Find out which file was migrated to the new brick</div><div class='add'>+file_name=$(ls $B0/${V0}3/rebal*| xargs basename)</div><div class='add'>+</div><div class='add'>+# check whether rebalance was succesful</div><div class='add'>+EXPECT "Y" wildcard_exists $B0/${V0}3/$file_name*</div><div class='add'>+EXPECT "Y" wildcard_exists $B0/${V0}1/.trashcan/internal_op/$file_name*</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+</div><div class='add'>+# force required in case rebalance is not over</div><div class='add'>+TEST $CLI volume stop $V0 force</div><div class='add'>+</div><div class='add'>+# create a replicated volume</div><div class='add'>+TEST $CLI volume create $V1 replica 2 $H0:$B0/${V1}{1,2}</div><div class='add'>+</div><div class='add'>+# checking volume status</div><div class='add'>+EXPECT "$V1" volinfo_field $V1 'Volume Name'</div><div class='add'>+EXPECT 'Replicate' volinfo_field $V1 'Type'</div><div class='add'>+EXPECT 'Created' volinfo_field $V1 'Status'</div><div class='add'>+EXPECT '2' brick_count $V1</div><div class='add'>+</div><div class='add'>+# enable trash with options and start the replicate volume by disabling automatic self-heal</div><div class='add'>+TEST $CLI volume set $V1 features.trash on</div><div class='add'>+TEST $CLI volume set $V1 features.trash-internal-op on</div><div class='add'>+EXPECT 'on' volinfo_field $V1 'features.trash'</div><div class='add'>+EXPECT 'on' volinfo_field $V1 'features.trash-internal-op'</div><div class='add'>+TEST start_vol $V1 $M1 $M1/.trashcan</div><div class='add'>+</div><div class='add'>+# mount and check for trash directory</div><div class='add'>+TEST [ -d $M1/.trashcan/internal_op ]</div><div class='add'>+</div><div class='add'>+# create a file and check</div><div class='add'>+touch $M1/self</div><div class='add'>+TEST [ -e $B0/${V1}1/self -a -e $B0/${V1}2/self ]</div><div class='add'>+</div><div class='add'>+# kill one brick and delete the file from mount point</div><div class='add'>+kill_brick $V1 $H0 $B0/${V1}1</div><div class='add'>+EXPECT_WITHIN ${PROCESS_UP_TIMEOUT} "1" online_brick_count</div><div class='add'>+rm -f $M1/self</div><div class='add'>+EXPECT "Y" wildcard_exists $B0/${V1}2/.trashcan/self*</div><div class='add'>+</div><div class='add'>+# check renaming of trash directory through cli</div><div class='add'>+TEST $CLI volume set $V0 trash-dir abc</div><div class='add'>+TEST start_vol $V0 $M0 $M0/abc</div><div class='add'>+TEST [ -e $M0/abc -a ! -e $M0/.trashcan ]</div><div class='add'>+EXPECT "Y" wildcard_exists $B0/${V0}1/abc/internal_op/rebal*</div><div class='add'>+</div><div class='add'>+# ensure that rename and delete operation on trash directory fails</div><div class='add'>+rm -rf $M0/abc/internal_op</div><div class='add'>+TEST [ -e $M0/abc/internal_op ]</div><div class='add'>+rm -rf $M0/abc/</div><div class='add'>+TEST [ -e $M0/abc ]</div><div class='add'>+mv $M0/abc $M0/trash</div><div class='add'>+TEST [ -e $M0/abc ]</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/features/unhashed-auto.t b/tests/features/unhashed-auto.t<br/>new file mode 100755<br/>index 00000000000..0a6bbfbb07d<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/features/unhashed-auto.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/features/unhashed-auto.t</a></div><div class='hunk'>@@ -0,0 +1,125 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../include.rc</div><div class='add'>+. $(dirname $0)/../volume.rc</div><div class='add'>+. $(dirname $0)/../dht.rc</div><div class='add'>+</div><div class='add'>+NFILES=100</div><div class='add'>+</div><div class='add'>+touch_files () {</div><div class='add'>+	for i in $(seq 1 $NFILES); do</div><div class='add'>+		touch $(printf $M0/dir/file%02d $i)</div><div class='add'>+	done</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+count_files () {</div><div class='add'>+	found=0</div><div class='add'>+	for i in $(seq 1 $NFILES); do</div><div class='add'>+		if [ -f $(printf $M0/dir/file%02d $i) ]; then</div><div class='add'>+			found=$((found+1))</div><div class='add'>+		fi</div><div class='add'>+	done</div><div class='add'>+	echo "found $found files" &gt; /dev/tty</div><div class='add'>+	echo $found</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+wait_for_rebalance () {</div><div class='add'>+	while true; do</div><div class='add'>+		tmp=$(rebalance_completed)</div><div class='add'>+		if [ $tmp -eq 1 ]; then</div><div class='add'>+			sleep 1</div><div class='add'>+		else</div><div class='add'>+			break</div><div class='add'>+		fi</div><div class='add'>+	done</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+get_xattr () {</div><div class='add'>+	cmd="getfattr --absolute-names --only-values -n trusted.glusterfs.dht"</div><div class='add'>+	$cmd $1 | od -tx1 -An | tr -d ' '</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+get_xattr_hash () {</div><div class='add'>+        cmd="getfattr --absolute-names --only-values -n trusted.glusterfs.dht"</div><div class='add'>+        $cmd $1 | od -tx1 -An | awk '{printf("%s%s%s%s\n", $1, $2, $3, $4);}'</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume info</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/${V0}{1,2}</div><div class='add'>+EXPECT "$V0" volinfo_field $V0 'Volume Name'</div><div class='add'>+EXPECT 'Created' volinfo_field $V0 'Status'</div><div class='add'>+</div><div class='add'>+TEST $CLI volume set $V0 cluster.lookup-optimize ON</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+EXPECT 'Started' volinfo_field $V0 'Status'</div><div class='add'>+</div><div class='add'>+# Create some files for later tests.</div><div class='add'>+TEST $GFS -s $H0 --volfile-id $V0 $M0</div><div class='add'>+TEST mkdir $M0/dir</div><div class='add'>+TEST touch_files</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+</div><div class='add'>+# Add a brick and do the fix-layout part of rebalance to update directory layouts</div><div class='add'>+# (including their directory commit hashes).</div><div class='add'>+TEST $CLI volume add-brick $V0 $H0:$B0/${V0}3</div><div class='add'>+EXPECT '3' brick_count $V0</div><div class='add'>+TEST $CLI volume rebalance $V0 fix-layout start</div><div class='add'>+TEST wait_for_rebalance</div><div class='add'>+</div><div class='add'>+# Now for the sneaky part.  *Undo* the part of rebalance that updated the volume</div><div class='add'>+# commit hash, forcing a false match between that and the directory commit hashes.</div><div class='add'>+TEST setfattr -x trusted.glusterfs.dht.commithash $B0/${V0}1</div><div class='add'>+TEST setfattr -x trusted.glusterfs.dht.commithash $B0/${V0}2</div><div class='add'>+TEST setfattr -x trusted.glusterfs.dht.commithash $B0/${V0}3</div><div class='add'>+</div><div class='add'>+# Mount and check that we do *not* see all of the files.  This indicates that we</div><div class='add'>+# correctly skipped the broadcast lookup that would have found them.</div><div class='add'>+TEST $GFS -s $H0 --volfile-id $V0 $M0</div><div class='add'>+TEST [ $(count_files) -ne 100 ]</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+</div><div class='add'>+# Do the fix-layout again to generate a new volume commit hash.</div><div class='add'>+TEST $CLI volume rebalance $V0 fix-layout start</div><div class='add'>+TEST wait_for_rebalance</div><div class='add'>+</div><div class='add'>+# Mount and check that we *do* see all of the files.  This indicates that we saw</div><div class='add'>+# the mismatch and did the broadcast lookup this time.</div><div class='add'>+TEST $GFS -s $H0 --volfile-id $V0 $M0</div><div class='add'>+TEST [ $(count_files) -eq 100 ]</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+</div><div class='add'>+# Do a *full* rebalance and verify that the directory commit hash changed.</div><div class='add'>+old_val=$(get_xattr $B0/${V0}1/dir)</div><div class='add'>+TEST $CLI volume rebalance $V0 start</div><div class='add'>+TEST wait_for_rebalance</div><div class='add'>+new_val=$(get_xattr $B0/${V0}1/dir)</div><div class='add'>+TEST [ ! x"$old_val" = x"$new_val" ]</div><div class='add'>+</div><div class='add'>+# Force an anomoly on an existing layout and heal it</div><div class='add'>+## The healed layout should not carry a commit-hash (or should carry 1 in the</div><div class='add'>+## commit-hash)</div><div class='add'>+TEST setfattr -x trusted.glusterfs.dht $B0/${V0}1/dir</div><div class='add'>+TEST $GFS -s $H0 --volfile-id $V0 $M0</div><div class='add'>+TEST [ -d $M0/dir ]</div><div class='add'>+new_hash=$(get_xattr_hash $B0/${V0}1/dir)</div><div class='add'>+TEST [ x"$new_hash" = x"00000001" ]</div><div class='add'>+new_hash=$(get_xattr_hash $B0/${V0}2/dir)</div><div class='add'>+TEST [ x"$new_hash" = x"00000001" ]</div><div class='add'>+</div><div class='add'>+# Unset the option and check that newly created directories get 1 in the</div><div class='add'>+# disk layout</div><div class='add'>+TEST $CLI volume set $V0 cluster.lookup-optimize off</div><div class='add'>+TEST mkdir $M0/dir1</div><div class='add'>+new_hash=$(get_xattr_hash $B0/${V0}1/dir1)</div><div class='add'>+TEST [ x"$new_hash" = x"00000001" ]</div><div class='add'>+new_hash=$(get_xattr_hash $B0/${V0}2/dir1)</div><div class='add'>+TEST [ x"$new_hash" = x"00000001" ]</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/features/weighted-rebalance.t b/tests/features/weighted-rebalance.t<br/>new file mode 100755<br/>index 00000000000..0d730406fd0<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/features/weighted-rebalance.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/features/weighted-rebalance.t</a></div><div class='hunk'>@@ -0,0 +1,78 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../include.rc</div><div class='add'>+. $(dirname $0)/../volume.rc</div><div class='add'>+. $(dirname $0)/../dht.rc</div><div class='add'>+</div><div class='add'>+NFILES=1000</div><div class='add'>+</div><div class='add'>+touch_files () {</div><div class='add'>+        for i in $(seq 1 $NFILES); do</div><div class='add'>+                touch $(printf $M0/dir/file%02d $i) 2&gt; /dev/null</div><div class='add'>+        done</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+count_files () {</div><div class='add'>+        found=0</div><div class='add'>+        for i in $(seq 1 $NFILES); do</div><div class='add'>+                if [ -f $(printf $1/dir/file%02d $i) ]; then</div><div class='add'>+                        found=$((found+1))</div><div class='add'>+                fi</div><div class='add'>+        done</div><div class='add'>+        echo $found</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+get_xattr () {</div><div class='add'>+        cmd="getfattr --absolute-names --only-values -n trusted.glusterfs.dht"</div><div class='add'>+        $cmd $1 | od -tx1 -An | tr -d ' '</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume info</div><div class='add'>+</div><div class='add'>+TEST mkdir ${B0}/${V0}{1,2}</div><div class='add'>+</div><div class='add'>+TEST truncate -s $((40*1024*1024)) ${B0}/disk1</div><div class='add'>+TEST MKFS_LOOP -i 512 ${B0}/disk1</div><div class='add'>+TEST MOUNT_LOOP ${B0}/disk1 ${B0}/${V0}1</div><div class='add'>+</div><div class='add'>+TEST truncate -s $((80*1024*1024)) ${B0}/disk2</div><div class='add'>+TEST MKFS_LOOP -i 512 ${B0}/disk2</div><div class='add'>+TEST MOUNT_LOOP ${B0}/disk2 ${B0}/${V0}2</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/${V0}{1,2}</div><div class='add'>+EXPECT "$V0" volinfo_field $V0 'Volume Name'</div><div class='add'>+EXPECT 'Created' volinfo_field $V0 'Status'</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+EXPECT 'Started' volinfo_field $V0 'Status'</div><div class='add'>+</div><div class='add'>+# Create some files for later tests.</div><div class='add'>+TEST $GFS -s $H0 --volfile-id $V0 $M0</div><div class='add'>+TEST mkdir $M0/dir</div><div class='add'>+TEST touch_files</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0</div><div class='add'>+</div><div class='add'>+# Check that the larger brick got more of the files.</div><div class='add'>+nfiles=$(count_files ${B0}/${V0}2)</div><div class='add'>+#echo $nfiles $(get_xattr ${B0}/${V0}1) $(get_xattr ${B0}/${V0}2) 3&gt;&amp;2 2&gt;&amp;1 1&gt;&amp;3 3&gt;&amp;-</div><div class='add'>+TEST [ $nfiles -ge 580 ]</div><div class='add'>+</div><div class='add'>+# Turn off the size-weighted rebalance.</div><div class='add'>+TEST $CLI volume set $V0 cluster.weighted-rebalance off</div><div class='add'>+</div><div class='add'>+# Rebalance again and check that the distribution is even again.</div><div class='add'>+TEST $CLI volume rebalance $V0 start force</div><div class='add'>+EXPECT_WITHIN $REBALANCE_TIMEOUT "0" rebalance_completed</div><div class='add'>+nfiles=$(count_files ${B0}/${V0}2)</div><div class='add'>+#echo $nfiles $(get_xattr ${B0}/${V0}1) $(get_xattr ${B0}/${V0}2) 3&gt;&amp;2 2&gt;&amp;1 1&gt;&amp;3 3&gt;&amp;-</div><div class='add'>+TEST [ $nfiles -le 580 ]</div><div class='add'>+</div><div class='add'>+$CLI volume stop $V0</div><div class='add'>+UMOUNT_LOOP ${B0}/${V0}{1,2}</div><div class='add'>+rm -f ${B0}/disk{1,2}</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/features/worm.t b/tests/features/worm.t<br/>new file mode 100755<br/>index 00000000000..40b08cdee02<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/features/worm.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/features/worm.t</a></div><div class='hunk'>@@ -0,0 +1,117 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../include.rc</div><div class='add'>+. $(dirname $0)/../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/${V0}1</div><div class='add'>+</div><div class='add'>+EXPECT "$V0" volinfo_field $V0 'Volume Name'</div><div class='add'>+EXPECT 'Created' volinfo_field $V0 'Status'</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+EXPECT 'Started' volinfo_field $V0 'Status'</div><div class='add'>+</div><div class='add'>+## Mount FUSE with caching disabled (read-write)</div><div class='add'>+TEST $GFS -s $H0 --volfile-id $V0 $M0</div><div class='add'>+</div><div class='add'>+## Tests for the volume level WORM</div><div class='add'>+TEST `echo "File 1" &gt; $M0/file1`</div><div class='add'>+TEST touch $M0/file2</div><div class='add'>+</div><div class='add'>+## Enable the volume level WORM</div><div class='add'>+TEST $CLI volume set $V0 features.worm 1</div><div class='add'>+TEST ! mv $M0/file1 $M0/file11</div><div class='add'>+TEST `echo "block" &gt; $M0/file2`</div><div class='add'>+</div><div class='add'>+## Disable the volume level WORM and delete the legacy files</div><div class='add'>+TEST $CLI volume set $V0 features.worm 0</div><div class='add'>+TEST rm -f $M0/*</div><div class='add'>+</div><div class='add'>+## Enable file level WORM</div><div class='add'>+TEST $CLI volume set $V0 features.worm-file-level 1</div><div class='add'>+TEST $CLI volume set $V0 features.default-retention-period 10</div><div class='add'>+TEST $CLI volume set $V0 features.auto-commit-period 5</div><div class='add'>+</div><div class='add'>+## Tests for manual transition to WORM/Retained state</div><div class='add'>+TEST `echo "worm 1" &gt; $M0/file1`</div><div class='add'>+TEST chmod 0444 $M0/file1</div><div class='add'>+sleep 5</div><div class='add'>+TEST `echo "line 1" &gt; $M0/file1`</div><div class='add'>+TEST ! mv $M0/file1 $M0/file2</div><div class='add'>+sleep 10</div><div class='add'>+TEST ! link $M0/file1 $M0/file2</div><div class='add'>+sleep 5</div><div class='add'>+TEST rm -f $M0/file1</div><div class='add'>+</div><div class='add'>+## Test for mv over WORM/Reatined state</div><div class='add'>+TEST `echo "worm 1" &gt; $M0/file1`</div><div class='add'>+TEST chmod 0444 $M0/file1</div><div class='add'>+TEST `echo "worm 2" &gt; $M0/file2`</div><div class='add'>+TEST ! mv $M0/file2 $M0/file1</div><div class='add'>+TEST rm -f $M0/file2</div><div class='add'>+sleep 10</div><div class='add'>+TEST rm -f $M0/file1</div><div class='add'>+</div><div class='add'>+## Test for state transition over write.</div><div class='add'>+TEST `echo "worm 1" &gt; $M0/file3`</div><div class='add'>+sleep 5</div><div class='add'>+TEST `echo "worm 2" &gt;&gt; $M0/file3`</div><div class='add'>+EXPECT 'worm 1' cat $M0/file3</div><div class='add'>+TEST ! rm -f $M0/file3</div><div class='add'>+</div><div class='add'>+## Test for checking if Worm files are undeletable after setting worm-files-deletable as 0.</div><div class='add'>+TEST $CLI volume set $V0 features.worm-files-deletable 0</div><div class='add'>+TEST `echo "worm 1" &gt; $M0/file4`</div><div class='add'>+TEST chmod 0444 $M0/file4</div><div class='add'>+sleep 10</div><div class='add'>+TEST `echo "worm 1" &gt;&gt; $M0/file4`</div><div class='add'>+TEST ! rm -f $M0/file4</div><div class='add'>+</div><div class='add'>+## Test for state transition if auto-commit-period is 0</div><div class='add'>+TEST $CLI volume set $V0 features.auto-commit-period 0</div><div class='add'>+TEST `echo "worm 1" &gt; $M0/file5`</div><div class='add'>+EXPECT '3/10/0' echo $(getfattr -e text --absolute-names --only-value -n "trusted.reten_state" $B0/${V0}1/file5)</div><div class='add'>+EXPECT 'worm 1' cat $M0/file5</div><div class='add'>+TEST ! rm -f $M0/file5</div><div class='add'>+TEST $CLI volume set $V0 features.auto-commit-period 5</div><div class='add'>+</div><div class='add'>+## Test for checking if retention-period is updated on increasing the access time of a WORM-RETAINED file.</div><div class='add'>+TEST $CLI volume set $V0 features.worm-files-deletable 1</div><div class='add'>+TEST `echo "worm 1" &gt;&gt; $M0/file1`</div><div class='add'>+initial_timestamp=$(date +%s)</div><div class='add'>+current_time_seconds=$(date +%S | sed 's/^0*//' );</div><div class='add'>+TEST chmod 0444 $M0/file1</div><div class='add'>+EXPECT '3/10/5' echo $(getfattr -e text --absolute-names --only-value -n "trusted.reten_state" $B0/${V0}1/file1)</div><div class='add'>+changed_timestamp=$(date +%Y%m%d%H%M --date '60 seconds');</div><div class='add'>+seconds_diff=`expr 60 - $((current_time_seconds))`</div><div class='add'>+TEST `touch -a -t "${changed_timestamp}" $M0/file1`</div><div class='add'>+EXPECT "3/$seconds_diff/5" echo $(getfattr -e text --absolute-names --only-value -n "trusted.reten_state" $B0/${V0}1/file1)</div><div class='add'>+sleep $seconds_diff</div><div class='add'>+TEST `echo "worm 2" &gt;&gt; $M0/file1`</div><div class='add'>+EXPECT  "$initial_timestamp" echo $(stat --printf %X $M0/file1)</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+## Test for checking if retention-period is updated on decreasing the access time of a WORM-RETAINED file</div><div class='add'>+TEST $CLI volume set $V0 features.default-retention-period 120</div><div class='add'>+initial_timestamp=$(date +%s)</div><div class='add'>+current_time_seconds=$(date +%S | sed 's/^0*//' );</div><div class='add'>+TEST chmod 0444 $M0/file1</div><div class='add'>+EXPECT '3/120/5' echo $(getfattr -e text --absolute-names --only-value -n "trusted.reten_state" $B0/${V0}1/file1)</div><div class='add'>+changed_timestamp=$(date +%Y%m%d%H%M --date '60 seconds');</div><div class='add'>+seconds_diff=`expr 60 - $((current_time_seconds))`</div><div class='add'>+TEST `touch -a -t "${changed_timestamp}" $M0/file1`</div><div class='add'>+EXPECT "3/$seconds_diff/5" echo $(getfattr -e text --absolute-names --only-value -n "trusted.reten_state" $B0/${V0}1/file1)</div><div class='add'>+sleep $seconds_diff</div><div class='add'>+TEST `echo "worm 4" &gt;&gt; $M0/file1`</div><div class='add'>+EXPECT  "$initial_timestamp" echo $(stat --printf %X $M0/file1)</div><div class='add'>+TEST rm -f $M0/file1</div><div class='add'>+</div><div class='add'>+TEST $CLI volume stop $V0</div><div class='add'>+EXPECT 'Stopped' volinfo_field $V0 'Status'</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/features/worm_sh.t b/tests/features/worm_sh.t<br/>new file mode 100644<br/>index 00000000000..da7afc084b2<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/features/worm_sh.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/features/worm_sh.t</a></div><div class='hunk'>@@ -0,0 +1,75 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+. $(dirname $0)/../include.rc</div><div class='add'>+. $(dirname $0)/../volume.rc</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 replica 2 $H0:$B0/${V0}{0,1}</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+TEST $CLI volume set $V0 cluster.data-self-heal off</div><div class='add'>+TEST $CLI volume set $V0 cluster.metadata-self-heal off</div><div class='add'>+TEST $CLI volume set $V0 cluster.entry-self-heal off</div><div class='add'>+</div><div class='add'>+TEST $CLI volume set $V0 self-heal-daemon off</div><div class='add'>+TEST $GFS --volfile-id=$V0 --volfile-server=$H0 $M0;</div><div class='add'>+</div><div class='add'>+## Enable file level WORM</div><div class='add'>+TEST $CLI volume set $V0 features.worm-file-level 1</div><div class='add'>+TEST $CLI volume set $V0 features.default-retention-period 100</div><div class='add'>+TEST $CLI volume set $V0 features.auto-commit-period 5</div><div class='add'>+</div><div class='add'>+## Tests for manual transition to WORM/Retained state</div><div class='add'>+TEST `echo "worm1" &gt; $M0/file1`</div><div class='add'>+TEST chmod 0444 $M0/file1</div><div class='add'>+sleep 5</div><div class='add'>+TEST `echo "worm2" &gt; $M0/file2`</div><div class='add'>+TEST chmod 0444 $M0/file2</div><div class='add'>+sleep 5</div><div class='add'>+TEST `echo "worm3" &gt; $M0/file3`</div><div class='add'>+TEST chmod 0444 $M0/file3</div><div class='add'>+sleep 5</div><div class='add'>+</div><div class='add'>+## Stopp one of the bricks</div><div class='add'>+TEST kill_brick $V0 $H0 $B0/${V0}1</div><div class='add'>+</div><div class='add'>+## Manipulate the WORMed-Files</div><div class='add'>+TEST $CLI volume set $V0 features.worm-file-level 0</div><div class='add'>+sleep 5</div><div class='add'>+</div><div class='add'>+TEST chmod 0777 $M0/file1</div><div class='add'>+TEST `echo "test" &gt;&gt; $M0/file1`</div><div class='add'>+TEST `echo "test" &gt;&gt; $M0/file3`</div><div class='add'>+TEST `rm -rf $M0/file2`</div><div class='add'>+</div><div class='add'>+## Metadata changes</div><div class='add'>+TEST setfattr -n user.test -v qwerty $M0/file3</div><div class='add'>+sleep 5</div><div class='add'>+</div><div class='add'>+## Enable file level WORM again</div><div class='add'>+TEST $CLI volume set $V0 features.worm-file-level 1</div><div class='add'>+</div><div class='add'>+## Restart volume and trigger self-heal</div><div class='add'>+TEST $CLI volume stop $V0 force</div><div class='add'>+TEST $CLI volume start $V0 force</div><div class='add'>+TEST $CLI volume set $V0 self-heal-daemon on</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "Y" glustershd_up_status</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 1</div><div class='add'>+TEST $CLI volume heal $V0</div><div class='add'>+</div><div class='add'>+# Wait for heal to complete</div><div class='add'>+EXPECT_WITHIN $HEAL_TIMEOUT "0" get_pending_heal_count $V0</div><div class='add'>+</div><div class='add'>+# Check if entry-heal has happened</div><div class='add'>+TEST diff &lt;(ls $B0/${V0}0 | sort) &lt;(ls $B0/${V0}1 | sort)</div><div class='add'>+</div><div class='add'>+# Test if data was healed</div><div class='add'>+TEST diff $B0/${V0}0/file1 $B0/${V0}1/file1</div><div class='add'>+TEST diff $B0/${V0}0/file3 $B0/${V0}1/file3</div><div class='add'>+</div><div class='add'>+# Test if metadata was healed and exists on both the bricks</div><div class='add'>+EXPECT "qwerty" get_text_xattr user.test $B0/${V0}1/file3</div><div class='add'>+EXPECT "qwerty" get_text_xattr user.test $B0/${V0}0/file3</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/fileio.rc b/tests/fileio.rc<br/>new file mode 100644<br/>index 00000000000..ec0767832e8<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/fileio.rc?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/fileio.rc</a></div><div class='hunk'>@@ -0,0 +1,61 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+function fd_available() {</div><div class='add'>+         for i in {1..65536}; do</div><div class='add'>+             if [ ! -e /proc/$$/fd/$i ]; then</div><div class='add'>+                 echo $i;</div><div class='add'>+                 return 0;</div><div class='add'>+             fi</div><div class='add'>+         done</div><div class='add'>+</div><div class='add'>+         return 1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function fd_open() {</div><div class='add'>+         local fd=$1;</div><div class='add'>+         local mode=$2</div><div class='add'>+         local path=$3;</div><div class='add'>+</div><div class='add'>+         case $mode in</div><div class='add'>+             r)</div><div class='add'>+                 eval "exec $fd&lt;$path";;</div><div class='add'>+             w)</div><div class='add'>+                 eval "exec $fd&gt;$path";;</div><div class='add'>+             rw)</div><div class='add'>+                 eval "exec $fd&lt;&gt;$path";;</div><div class='add'>+             *)</div><div class='add'>+                 false;;</div><div class='add'>+         esac</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+function fd_cat() {</div><div class='add'>+         local fd=$1;</div><div class='add'>+</div><div class='add'>+         eval "cat &lt;&amp;$fd";</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+function fd_write() {</div><div class='add'>+         local fd=$1;</div><div class='add'>+         shift;</div><div class='add'>+         local msg="$@";</div><div class='add'>+</div><div class='add'>+         eval "echo $@ &gt;&amp;$fd";</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+function fd_close() {</div><div class='add'>+         local fd=$1;</div><div class='add'>+</div><div class='add'>+         eval "exec $fd&gt;&amp;-";</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+function fd_based_example() {</div><div class='add'>+    TEST fd=`fd_available`;</div><div class='add'>+    TEST fd_open $fd "rw" $M0/filename;</div><div class='add'>+    TEST fd_cat $fd; # print existing stuff</div><div class='add'>+    TEST fd_write $fd "new stuff"; # append</div><div class='add'>+    TEST fd_close $fd;</div><div class='add'>+}</div><div class='head'>diff --git a/tests/geo-rep.rc b/tests/geo-rep.rc<br/>new file mode 100644<br/>index 00000000000..9ba4262730e<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/geo-rep.rc?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/geo-rep.rc</a></div><div class='hunk'>@@ -0,0 +1,495 @@</div><div class='add'>+GEO_REP_TIMEOUT=120</div><div class='add'>+CHECK_MOUNT_TIMEOUT=50</div><div class='add'>+#check for mount point</div><div class='add'>+function check_mounted () {</div><div class='add'>+  df | grep $1 | wc -l</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function check_status_num_rows()</div><div class='add'>+{</div><div class='add'>+    local search_key=$1</div><div class='add'>+    $GEOREP_CLI $master $slave status | grep -F "$search_key" | wc -l</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function check_fanout_status_num_rows()</div><div class='add'>+{</div><div class='add'>+    local search_key=$1</div><div class='add'>+    $GEOREP_CLI $master status | grep -F "$search_key" | wc -l</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function check_fanout_status_detail_num_rows()</div><div class='add'>+{</div><div class='add'>+    local search_key=$1</div><div class='add'>+    $GEOREP_CLI $master status detail | grep -F "$search_key" | wc -l</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function check_all_status_num_rows()</div><div class='add'>+{</div><div class='add'>+    local search_key=$1</div><div class='add'>+    $GEOREP_CLI status | grep -F "$search_key" | wc -l</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function check_all_status_detail_num_rows()</div><div class='add'>+{</div><div class='add'>+    local search_key=$1</div><div class='add'>+    $GEOREP_CLI status detail | grep -F "$search_key" | wc -l</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function verify_checkpoint_met()</div><div class='add'>+{</div><div class='add'>+    local master=$1</div><div class='add'>+    local slave=$2</div><div class='add'>+    $GEOREP_CLI $master $slave status detail| grep -F "Yes" | wc -l</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function check_keys_distributed()</div><div class='add'>+{</div><div class='add'>+    local search_key=$(cat /var/lib/glusterd/geo-replication/master_slave_common_secret.pem.pub)</div><div class='add'>+    grep -F "$search_key" ~/.ssh/authorized_keys &gt; /dev/null</div><div class='add'>+    echo $?</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function check_common_secret_file()</div><div class='add'>+{</div><div class='add'>+    stat /var/lib/glusterd/geo-replication/master_slave_common_secret.pem.pub</div><div class='add'>+    echo $?</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function create_rename_symlink_case()</div><div class='add'>+{</div><div class='add'>+    mkdir ${mastermnt}/MUL_REN_SYMLINK</div><div class='add'>+    cd ${mastermnt}/MUL_REN_SYMLINK</div><div class='add'>+    mkdir sym_dir1</div><div class='add'>+    ln -s "sym_dir1" sym1</div><div class='add'>+    mv sym1 sym2</div><div class='add'>+    mv sym2 sym3</div><div class='add'>+    mv sym3 sym4</div><div class='add'>+    cd -</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function create_data()</div><div class='add'>+{</div><div class='add'>+    prefix=$1</div><div class='add'>+</div><div class='add'>+    # GF_FOP_MKNOD</div><div class='add'>+    # GF_FOP_MKDIR</div><div class='add'>+    # GF_FOP_UNLINK</div><div class='add'>+    # GF_FOP_RMDIR</div><div class='add'>+    # GF_FOP_SYMLINK</div><div class='add'>+    # GF_FOP_RENAME</div><div class='add'>+    # GF_FOP_LINK</div><div class='add'>+    # GF_FOP_SETXATTR</div><div class='add'>+    # GF_FOP_REMOVEXATTR</div><div class='add'>+    # GF_FOP_CREATE</div><div class='add'>+    # GF_FOP_SETATTR</div><div class='add'>+</div><div class='add'>+    # Regular file + data</div><div class='add'>+    echo "HelloWorld!" &gt; ${master_mnt}/${prefix}_f1</div><div class='add'>+    touch ${master_mnt}/${prefix}_f2</div><div class='add'>+    touch ${master_mnt}/${prefix}_f3</div><div class='add'>+</div><div class='add'>+    # non-ascii filename test</div><div class='add'>+    echo "Hello non-ascii" &gt; ${master_mnt}/${prefix}_f1_à²¸à²‚à²¤à²¸</div><div class='add'>+    touch ${master_mnt}/${prefix}_f2_à²¸à²‚à²¤à²¸</div><div class='add'>+    touch ${master_mnt}/${prefix}_f3_à²¸à²‚à²¤à²¸</div><div class='add'>+</div><div class='add'>+    # dir</div><div class='add'>+    mkdir ${master_mnt}/${prefix}_d1</div><div class='add'>+    mkdir ${master_mnt}/${prefix}_d2</div><div class='add'>+    mkdir ${master_mnt}/${prefix}_d3</div><div class='add'>+</div><div class='add'>+    # non-ascii dir and filename test</div><div class='add'>+    mkdir ${master_mnt}/${prefix}_d1_à²¨à²¨à³à²¨</div><div class='add'>+    mkdir ${master_mnt}/${prefix}_d2_à²¸à²‚à²¤à²¸</div><div class='add'>+    mkdir ${master_mnt}/${prefix}_d3_à²¸à²‚à²¤à²¸</div><div class='add'>+    echo "Hello non-ascii" &gt;  ${master_mnt}/${prefix}_d1_à²¨à²¨à³à²¨/à²¸à²‚à²¤à²¸</div><div class='add'>+</div><div class='add'>+    # Hardlink + non-ascii name</div><div class='add'>+    ln ${master_mnt}/${prefix}_f1 ${master_mnt}/${prefix}_hl1</div><div class='add'>+    ln ${master_mnt}/${prefix}_f1 ${master_mnt}/${prefix}_hl1_à²¸à²‚à²¤à²¸</div><div class='add'>+</div><div class='add'>+    # Symlink</div><div class='add'>+    cd ${master_mnt}</div><div class='add'>+    ln -s ${prefix}_f1 ${prefix}_sl1</div><div class='add'>+    ln -s ${prefix}_f1 ${prefix}_sl1_à²¸à²‚à²¤à²¸</div><div class='add'>+    cd -</div><div class='add'>+</div><div class='add'>+    # UNLINK</div><div class='add'>+    rm ${master_mnt}/${prefix}_f2</div><div class='add'>+    rm ${master_mnt}/${prefix}_f2_à²¸à²‚à²¤à²¸</div><div class='add'>+</div><div class='add'>+    # RMDIR</div><div class='add'>+    rmdir ${master_mnt}/${prefix}_d2</div><div class='add'>+    rmdir ${master_mnt}/${prefix}_d2_à²¸à²‚à²¤à²¸</div><div class='add'>+</div><div class='add'>+    # Rename - File</div><div class='add'>+    mv ${master_mnt}/${prefix}_f3 ${master_mnt}/${prefix}_f4</div><div class='add'>+    mv ${master_mnt}/${prefix}_f3_à²¸à²‚à²¤à²¸  ${master_mnt}/${prefix}_f4_à²¸à²‚à²¤à²¸</div><div class='add'>+</div><div class='add'>+    # Rename - Dir</div><div class='add'>+    mv ${master_mnt}/${prefix}_d3 ${master_mnt}/${prefix}_d4</div><div class='add'>+    mv ${master_mnt}/${prefix}_d3_à²¸à²‚à²¤à²¸  ${master_mnt}/${prefix}_d4_à²¸à²‚à²¤à²¸</div><div class='add'>+</div><div class='add'>+    # chown</div><div class='add'>+    touch ${master_mnt}/${prefix}_chown_f1</div><div class='add'>+    chown 1000:1000 ${master_mnt}/${prefix}_chown_f1</div><div class='add'>+    touch ${master_mnt}/${prefix}_chown_f1_à²¸à²‚à²¤à²¸</div><div class='add'>+    chown 1000:1000 ${master_mnt}/${prefix}_chown_f1_à²¸à²‚à²¤à²¸</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function create_data_hang()</div><div class='add'>+{</div><div class='add'>+    prefix=$1</div><div class='add'>+    mkdir ${master_mnt}/${prefix}</div><div class='add'>+    cd ${master_mnt}/${prefix}</div><div class='add'>+    # ~1k files is required with 1 sync-job and hang happens if</div><div class='add'>+    # stderr buffer of tar/ssh executed with Popen is full (i.e., 64k).</div><div class='add'>+    # 64k is hit when ~800 files were  not found while syncing data</div><div class='add'>+    # from master. So around 1k files is required to hit the condition.</div><div class='add'>+    for i in {1..1000}</div><div class='add'>+    do</div><div class='add'>+        echo "test data" &gt; file$i</div><div class='add'>+        mv -f file$i file</div><div class='add'>+    done</div><div class='add'>+    cd -</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function chown_file_ok()</div><div class='add'>+{</div><div class='add'>+    local file_owner=$(stat --format "%u:%g" "$1")</div><div class='add'>+    if test "X$file_owner" != "X1000:1000"; then echo 1; else echo 0; fi</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function regular_file_ok()</div><div class='add'>+{</div><div class='add'>+    local file_type=$(stat --format "%F" "$1")</div><div class='add'>+    if test "X$file_type" != "Xregular file"; then echo 1; else echo 0; fi</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function directory_ok()</div><div class='add'>+{</div><div class='add'>+    file_type=$(stat --format "%F" "$1")</div><div class='add'>+    if test "X$file_type" != "Xdirectory"; then echo 1; else echo 0; fi</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function unlink_ok()</div><div class='add'>+{</div><div class='add'>+    stat "$1" &gt; /dev/null 2&gt;&amp;1</div><div class='add'>+    rc=$?</div><div class='add'>+    echo $rc</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function hardlink_file_ok()</div><div class='add'>+{</div><div class='add'>+    orig_file=$1</div><div class='add'>+    link_file=$2</div><div class='add'>+</div><div class='add'>+    orig_inode=$(stat --format "%i" "$orig_file")</div><div class='add'>+    rc=$?</div><div class='add'>+    if test $rc != 0; then</div><div class='add'>+        echo $rc</div><div class='add'>+    else</div><div class='add'>+        link_inode=$(stat --format "%i" "$link_file")</div><div class='add'>+        rc=$?</div><div class='add'>+        if test $rc != 0; then</div><div class='add'>+            echo $rc</div><div class='add'>+        else</div><div class='add'>+            if test $orig_inode != $link_inode; then</div><div class='add'>+                echo 1</div><div class='add'>+            else</div><div class='add'>+                echo 0</div><div class='add'>+            fi</div><div class='add'>+        fi</div><div class='add'>+    fi</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function data_ok()</div><div class='add'>+{</div><div class='add'>+    path=$1</div><div class='add'>+    data1="$2"</div><div class='add'>+    data2=$(cat $path)</div><div class='add'>+    echo "data1:$data1"</div><div class='add'>+    echo "data2:$data2"</div><div class='add'>+    if test "X$data1" != "X$data2"; then</div><div class='add'>+        echo 1</div><div class='add'>+    else</div><div class='add'>+        echo 0</div><div class='add'>+    fi</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function arequal_checksum()</div><div class='add'>+{</div><div class='add'>+    master=$1</div><div class='add'>+    slave=$2</div><div class='add'>+    ret=$(diff &lt;(arequal-checksum -p $master) &lt;(arequal-checksum -p $slave) | wc -l)</div><div class='add'>+    echo x$ret</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function symlink_ok()</div><div class='add'>+{</div><div class='add'>+    local orig_file_name=$1</div><div class='add'>+    local symlink_file=$2</div><div class='add'>+</div><div class='add'>+    local file_type=$(stat --format "%F" "$symlink_file")</div><div class='add'>+    if test "X$file_type" != "Xsymbolic link"; then</div><div class='add'>+        echo 1</div><div class='add'>+    else</div><div class='add'>+        local fname=$(readlink $symlink_file)</div><div class='add'>+        if test "X$fname" != "X$orig_file_name"; then</div><div class='add'>+            echo 2</div><div class='add'>+        else</div><div class='add'>+            echo 0</div><div class='add'>+        fi</div><div class='add'>+    fi</div><div class='add'>+</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function rename_file_ok()</div><div class='add'>+{</div><div class='add'>+    old_name=$1</div><div class='add'>+    new_name=$2</div><div class='add'>+</div><div class='add'>+    if [ -f $old_name ]; then</div><div class='add'>+        echo 1</div><div class='add'>+    elif [ ! -f $new_name ]; then</div><div class='add'>+        echo 2</div><div class='add'>+    else</div><div class='add'>+        echo 0</div><div class='add'>+    fi</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function rename_dir_ok()</div><div class='add'>+{</div><div class='add'>+    old_name=$1</div><div class='add'>+    new_name=$2</div><div class='add'>+</div><div class='add'>+    if [ -d $old_name ]; then</div><div class='add'>+        echo 1</div><div class='add'>+    elif [ ! -d $new_name ]; then</div><div class='add'>+        echo 2</div><div class='add'>+    else</div><div class='add'>+        echo 0</div><div class='add'>+    fi</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function create_georep_session()</div><div class='add'>+{</div><div class='add'>+    $CLI system:: execute gsec_create</div><div class='add'>+    rc=$?</div><div class='add'>+    if test $rc != 0; then</div><div class='add'>+        echo $rc</div><div class='add'>+    else</div><div class='add'>+        $CLI volume geo-rep $master $slave create push-pem</div><div class='add'>+        rc=$?</div><div class='add'>+        if test $rc != 0; then</div><div class='add'>+            echo $rc</div><div class='add'>+        else</div><div class='add'>+            echo 0</div><div class='add'>+        fi</div><div class='add'>+    fi</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+# logrotate_simulate should be called (rotate_count + 1) times to cause</div><div class='add'>+# an unlink and a gfid re-allocation.</div><div class='add'>+# remember to keep the file name and rotate_count the same across the</div><div class='add'>+# calls</div><div class='add'>+function logrotate_simulate()</div><div class='add'>+{</div><div class='add'>+    file_name=$1</div><div class='add'>+    declare -i rotate_count=$2</div><div class='add'>+</div><div class='add'>+    while [ $rotate_count -ge 0 ]; do</div><div class='add'>+        source_file="$file_name.$((rotate_count))"</div><div class='add'>+        if [ $rotate_count -eq 0 ]; then</div><div class='add'>+            source_file="$file_name"</div><div class='add'>+        fi</div><div class='add'>+        if [ -f "${source_file}" ]; then</div><div class='add'>+                mv "${source_file}" "$file_name.$((rotate_count+1))"</div><div class='add'>+        fi</div><div class='add'>+        ((rotate_count--))</div><div class='add'>+    done</div><div class='add'>+</div><div class='add'>+    # logrotate causes gfid to be rellocated to a new file created</div><div class='add'>+    # after an unlink and a blind rename later causes georep session</div><div class='add'>+    # to go Faulty</div><div class='add'>+    # this should not happen if source basename on slave is tested</div><div class='add'>+    # to be linked with its own gfid as on master, before invoking</div><div class='add'>+    # the rename syscall</div><div class='add'>+    touch $file_name</div><div class='add'>+    rotate_count=$2</div><div class='add'>+    unlink_file_name="$file_name.$((rotate_count+1))"</div><div class='add'>+    unlink $unlink_file_name 2&gt;/dev/null</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function create_rename()</div><div class='add'>+{</div><div class='add'>+    file_name=$1</div><div class='add'>+    echo $file_name &gt; $file_name</div><div class='add'>+    mv $file_name $file_name.bak</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function create_rename_ok()</div><div class='add'>+{</div><div class='add'>+    file_name=$1</div><div class='add'>+    # after a log replay, we don't expect the original file</div><div class='add'>+    # to be recreated i.e. a dangling entry without a corresponding</div><div class='add'>+    # back-end gfid link should not exist on the slave</div><div class='add'>+    if [ -f "$file_name" ]; then</div><div class='add'>+        echo 1</div><div class='add'>+    else</div><div class='add'>+        echo 0</div><div class='add'>+    fi</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function hardlink_rename()</div><div class='add'>+{</div><div class='add'>+    file_name=$1</div><div class='add'>+    echo $file_name &gt; $file_name</div><div class='add'>+    ln $file_name $file_name.hl</div><div class='add'>+    mv $file_name.hl $file_name.hl1</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function hardlink_rename_ok()</div><div class='add'>+{</div><div class='add'>+    file_name=$1</div><div class='add'>+    # the hardlink file should not exist on the slave after renaming</div><div class='add'>+    # to one of its links on changelog reprocessing</div><div class='add'>+    if [ ! -f "$file_name" ]; then</div><div class='add'>+        echo 1</div><div class='add'>+    elif [ ! -f "$file_name.hl1" ]; then</div><div class='add'>+        echo 2</div><div class='add'>+    elif [ -f "$file_name.hl" ]; then</div><div class='add'>+        echo 3</div><div class='add'>+    else</div><div class='add'>+        echo 0</div><div class='add'>+    fi</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function create_symlink_rename_mkdir_data()</div><div class='add'>+{</div><div class='add'>+    mkdir ${master_mnt}/symlink_test1</div><div class='add'>+    touch ${master_mnt}/symlink_test1/file1</div><div class='add'>+    ln -s "./file1" ${master_mnt}/symlink_test1/sym_link</div><div class='add'>+    mv ${master_mnt}/symlink_test1/sym_link ${master_mnt}/symlink_test1/rn_sym_link</div><div class='add'>+    mkdir ${master_mnt}/symlink_test1/sym_link</div><div class='add'>+}</div><div class='add'>+function verify_symlink_rename_mkdir_data()</div><div class='add'>+{</div><div class='add'>+    sym_dir=$1</div><div class='add'>+    if [ ! -f $sym_dir/file1 ]; then</div><div class='add'>+        echo 1</div><div class='add'>+    elif [ ! -h $sym_dir/rn_sym_link ]; then</div><div class='add'>+        echo 2</div><div class='add'>+    elif [ ! -d $sym_dir/sym_link ]; then</div><div class='add'>+        echo 3</div><div class='add'>+    else</div><div class='add'>+        echo 0</div><div class='add'>+    fi</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function create_rsnapshot_data()</div><div class='add'>+{</div><div class='add'>+    rm -rf /tmp/rsnapshot_symlinkbug</div><div class='add'>+    mkdir /tmp/rsnapshot_symlinkbug</div><div class='add'>+    ln -f -s /does/not/exist /tmp/rsnapshot_symlinkbug/a_symlink</div><div class='add'>+    rsync -a /tmp/rsnapshot_symlinkbug ${master_mnt}/</div><div class='add'>+    cp -al ${master_mnt}/rsnapshot_symlinkbug ${master_mnt}/rsnapshot_symlinkbug.0</div><div class='add'>+    ln -f -s /does/not/exist2 /tmp/rsnapshot_symlinkbug/a_symlink</div><div class='add'>+    rsync -a /tmp/rsnapshot_symlinkbug ${master_mnt}/</div><div class='add'>+    cp -al ${master_mnt}/rsnapshot_symlinkbug ${master_mnt}/rsnapshot_symlinkbug.1</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function verify_rsnapshot_data()</div><div class='add'>+{</div><div class='add'>+    dir="$1/rsnapshot_symlinkbug"</div><div class='add'>+    dir0="$1/rsnapshot_symlinkbug.0"</div><div class='add'>+    dir1="$1/rsnapshot_symlinkbug.1"</div><div class='add'>+    if [ ! -d "$dir" ]; then</div><div class='add'>+        echo 1</div><div class='add'>+    elif [ ! -h $dir/a_symlink ]; then</div><div class='add'>+        echo 2</div><div class='add'>+    elif test "X$(readlink $dir/a_symlink)" != "X/does/not/exist2"; then</div><div class='add'>+        echo 3</div><div class='add'>+    elif [ ! -h $dir0/a_symlink ]; then</div><div class='add'>+        echo 4</div><div class='add'>+    elif test "X$(readlink $dir0/a_symlink)" != "X/does/not/exist"; then</div><div class='add'>+        echo 5</div><div class='add'>+    elif [ ! -h $dir1/a_symlink ]; then</div><div class='add'>+        echo 6</div><div class='add'>+    elif test "X$(readlink $dir1/a_symlink)" != "X/does/not/exist2"; then</div><div class='add'>+        echo 7</div><div class='add'>+    else</div><div class='add'>+        echo 0</div><div class='add'>+    fi</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function create_hardlink_rename_data()</div><div class='add'>+{</div><div class='add'>+    dir=${master_mnt}/hardlink_rename_issue</div><div class='add'>+    mkdir $dir</div><div class='add'>+    echo "test_data" &gt; $dir/f1</div><div class='add'>+    ln $dir/f1 $dir/f2</div><div class='add'>+    mv $dir/f2 $dir/f3</div><div class='add'>+    unlink $dir/f1</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function verify_hardlink_rename_data()</div><div class='add'>+{</div><div class='add'>+    dir=$1/hardlink_rename_issue</div><div class='add'>+    if [ ! -d $dir ]; then</div><div class='add'>+        echo 1</div><div class='add'>+    elif [ -f $dir/f1 ]; then</div><div class='add'>+        echo 2</div><div class='add'>+    elif [ -f $dir/f2 ]; then</div><div class='add'>+        echo 3</div><div class='add'>+    elif [ ! -f $dir/f3 ]; then</div><div class='add'>+        echo 4</div><div class='add'>+    elif test "Xtest_data" != "X$(cat $dir/f3)"; then</div><div class='add'>+        echo 5</div><div class='add'>+    else</div><div class='add'>+        echo 0</div><div class='add'>+    fi</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function check_slave_read_only()</div><div class='add'>+{</div><div class='add'>+    volum=$1</div><div class='add'>+    gluster volume info $1 | grep 'features.read-only: on'</div><div class='add'>+    echo $?</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function create_rename_with_existing_destination()</div><div class='add'>+{</div><div class='add'>+    dir=$1/rename_with_existing_destination</div><div class='add'>+    mkdir $dir</div><div class='add'>+    for i in {1..5}</div><div class='add'>+    do</div><div class='add'>+        echo "Data_set$i" &gt; $dir/data_set$i</div><div class='add'>+        mv $dir/data_set$i $dir/data_set -f</div><div class='add'>+    done</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function verify_rename_with_existing_destination()</div><div class='add'>+{</div><div class='add'>+    dir=$1/rename_with_existing_destination</div><div class='add'>+</div><div class='add'>+    if [ ! -d $dir ]; then</div><div class='add'>+        echo 1</div><div class='add'>+    elif [ ! -f $dir/data_set ]; then</div><div class='add'>+        echo 2</div><div class='add'>+    elif [ -f $dir/data_set1 ]; then</div><div class='add'>+        echo 3</div><div class='add'>+    elif [ -f $dir/data_set2 ]; then</div><div class='add'>+        echo 4</div><div class='add'>+    elif [ -f $dir/data_set3 ]; then</div><div class='add'>+        echo 5</div><div class='add'>+    elif [ -f $dir/data_set4 ]; then</div><div class='add'>+        echo 6</div><div class='add'>+    elif [ -f $dir/data_set5 ]; then</div><div class='add'>+        echo 7</div><div class='add'>+    elif test "XData_set5" != "X$(cat $dir/data_set)"; then</div><div class='add'>+        echo 8</div><div class='add'>+    else</div><div class='add'>+        echo 0</div><div class='add'>+    fi</div><div class='add'>+}</div><div class='head'>diff --git a/tests/gfid2path/block-mount-access.t b/tests/gfid2path/block-mount-access.t<br/>new file mode 100644<br/>index 00000000000..b1726ad9604<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/gfid2path/block-mount-access.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/gfid2path/block-mount-access.t</a></div><div class='hunk'>@@ -0,0 +1,51 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../include.rc</div><div class='add'>+. $(dirname $0)/../volume.rc</div><div class='add'>+. $(dirname $0)/../afr.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+</div><div class='add'>+## Create a 2*2 volume</div><div class='add'>+TEST $CLI volume create $V0 replica 2 $H0:$B0/${V0}{0,1}</div><div class='add'>+EXPECT "$V0" volinfo_field $V0 'Volume Name';</div><div class='add'>+EXPECT 'Created' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+## Start the volume</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "Y" glustershd_up_status</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 1</div><div class='add'>+TEST $GFS --volfile-id=$V0 --volfile-server=$H0 $M0;</div><div class='add'>+</div><div class='add'>+## Mount the volume</div><div class='add'>+TEST $GFS --volfile-server=$H0 --volfile-id=$V0 $M0;</div><div class='add'>+</div><div class='add'>+#CREATE</div><div class='add'>+fname=$M0/file1</div><div class='add'>+touch $fname;</div><div class='add'>+backpath=$B0/${V0}1/file1</div><div class='add'>+</div><div class='add'>+pgfid="00000000-0000-0000-0000-000000000001"</div><div class='add'>+</div><div class='add'>+#Check for the presence of xattr</div><div class='add'>+key="trusted.gfid2path"</div><div class='add'>+gfid2path_xattr=$(getfattr -h -d -m. $backpath 2&gt;/dev/null | grep -a $key | cut -f1 -d'=')</div><div class='add'>+</div><div class='add'>+#Check getxattr</div><div class='add'>+TEST ! getfattr -h -n $gfid2path_xattr $M0/file1</div><div class='add'>+</div><div class='add'>+#Check listgetxattr</div><div class='add'>+EXPECT_NOT $gfid2path_xattr get_xattr_key $key $M0/file1</div><div class='add'>+</div><div class='add'>+#Check removexattr</div><div class='add'>+TEST ! setfattr -h -x $gfid2path_xattr $M0/file1</div><div class='add'>+</div><div class='add'>+#Check setxattr</div><div class='add'>+TEST ! setfattr -h -n "trusted.gfid2path.d16e15bafe6e4257" -v "$pgfid/file2" $M0/file1</div><div class='add'>+</div><div class='add'>+#Cleanup</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/gfid2path/get-gfid-to-path.t b/tests/gfid2path/get-gfid-to-path.t<br/>new file mode 100644<br/>index 00000000000..dea95f4c9f8<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/gfid2path/get-gfid-to-path.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/gfid2path/get-gfid-to-path.t</a></div><div class='hunk'>@@ -0,0 +1,72 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../include.rc</div><div class='add'>+. $(dirname $0)/../volume.rc</div><div class='add'>+. $(dirname $0)/../afr.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+</div><div class='add'>+## Create a 1*2 volume</div><div class='add'>+TEST $CLI volume create $V0 replica 2 $H0:$B0/${V0}{0,1}</div><div class='add'>+EXPECT "$V0" volinfo_field $V0 'Volume Name';</div><div class='add'>+EXPECT 'Created' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+## Start the volume</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "Y" glustershd_up_status</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 0</div><div class='add'>+EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" afr_child_up_status_in_shd $V0 1</div><div class='add'>+</div><div class='add'>+## Mount the volume</div><div class='add'>+TEST $GFS --volfile-server=$H0 --aux-gfid-mount --volfile-id=$V0 $M0;</div><div class='add'>+</div><div class='add'>+root_gfid="00000000-0000-0000-0000-000000000001"</div><div class='add'>+</div><div class='add'>+#Check for ROOT</div><div class='add'>+EXPECT "/" get_gfid2path $M0/.gfid/$root_gfid</div><div class='add'>+</div><div class='add'>+#CREATE</div><div class='add'>+fname=$M0/file1</div><div class='add'>+touch $fname;</div><div class='add'>+</div><div class='add'>+#Get gfid of file1</div><div class='add'>+gfid=$(getfattr -h --only-values -n glusterfs.gfid.string $M0/file1)</div><div class='add'>+</div><div class='add'>+#Get path from virt xattr</div><div class='add'>+EXPECT "/file1" get_gfid2path $M0/.gfid/$gfid</div><div class='add'>+</div><div class='add'>+#Create hardlink and get path</div><div class='add'>+ln $fname $M0/hl_file1</div><div class='add'>+EXPECT "/file1" get_gfid2path $M0/.gfid/$gfid</div><div class='add'>+EXPECT "/hl_file1" get_gfid2path $M0/.gfid/$gfid</div><div class='add'>+</div><div class='add'>+#Rename and get path</div><div class='add'>+mv $fname $M0/rn_file1</div><div class='add'>+EXPECT "/hl_file1" get_gfid2path $M0/.gfid/$gfid</div><div class='add'>+EXPECT "/rn_file1" get_gfid2path $M0/.gfid/$gfid</div><div class='add'>+</div><div class='add'>+#Create symlink and get path</div><div class='add'>+ln -s $fname $M0/sym_file1</div><div class='add'>+gfid=$(getfattr -h --only-values -n glusterfs.gfid.string $M0/sym_file1)</div><div class='add'>+EXPECT "/sym_file1" get_gfid2path $M0/.gfid/$gfid</div><div class='add'>+</div><div class='add'>+#Create dir and get path</div><div class='add'>+mkdir -p $M0/dir1/dir2</div><div class='add'>+gfid=$(getfattr -h --only-values -n glusterfs.gfid.string $M0/dir1/dir2)</div><div class='add'>+EXPECT "/dir1/dir2" get_gfid2path $M0/.gfid/$gfid</div><div class='add'>+</div><div class='add'>+#Create file under dir2 and get path</div><div class='add'>+touch $M0/dir1/dir2/file1</div><div class='add'>+gfid=$(getfattr -h --only-values -n glusterfs.gfid.string $M0/dir1/dir2/file1)</div><div class='add'>+EXPECT "/dir1/dir2/file1" get_gfid2path $M0/.gfid/$gfid</div><div class='add'>+</div><div class='add'>+#Create hardlink under dir2 and get path</div><div class='add'>+ln $M0/dir1/dir2/file1 $M0/dir1/hl_file1</div><div class='add'>+gfid=$(getfattr -h --only-values -n glusterfs.gfid.string $M0/dir1/dir2/file1)</div><div class='add'>+EXPECT "/dir1/dir2/file1" get_gfid2path $M0/.gfid/$gfid</div><div class='add'>+EXPECT "/dir1/hl_file1" get_gfid2path $M0/.gfid/$gfid</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/gfid2path/gfid2path_fuse.t b/tests/gfid2path/gfid2path_fuse.t<br/>new file mode 100644<br/>index 00000000000..d0fe1fc16ae<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/gfid2path/gfid2path_fuse.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/gfid2path/gfid2path_fuse.t</a></div><div class='hunk'>@@ -0,0 +1,166 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../include.rc</div><div class='add'>+. $(dirname $0)/../volume.rc</div><div class='add'>+</div><div class='add'>+CLI_SETGFID2PATH="gluster-setgfid2path";</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+XXHSUM_SOURCE="$(dirname $0)/../../contrib/xxhash/xxhsum.c $(dirname $0)/../../contrib/xxhash/xxhash.c"</div><div class='add'>+XXHSUM_EXEC=$(dirname $0)/xxhsum</div><div class='add'>+</div><div class='add'>+## Build xxhsum C source</div><div class='add'>+build_tester $XXHSUM_SOURCE -o $XXHSUM_EXEC -I$(dirname $0)/../../contrib/xxhash</div><div class='add'>+TEST [ -e $XXHSUM_EXEC ]</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+</div><div class='add'>+## Create a single brick volume (B=1)</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/${V0}1;</div><div class='add'>+EXPECT "$V0" volinfo_field $V0 'Volume Name';</div><div class='add'>+EXPECT 'Created' volinfo_field $V0 'Status';</div><div class='add'>+EXPECT '1' brick_count $V0</div><div class='add'>+</div><div class='add'>+## Start the volume</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+EXPECT 'Started' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+## Mount the volume</div><div class='add'>+TEST $GFS --volfile-server=$H0 --volfile-id=$V0 $M0;</div><div class='add'>+</div><div class='add'>+## disable gfid2path</div><div class='add'>+TEST $CLI volume set $V0 gfid2path disable</div><div class='add'>+</div><div class='add'>+pgfid="00000000-0000-0000-0000-000000000001"</div><div class='add'>+xxh64_file=$B0/${V0}1/xxh64_file</div><div class='add'>+</div><div class='add'>+# Create a file before enabling gfid2path</div><div class='add'>+fname=$M0/before_file1</div><div class='add'>+touch $fname;</div><div class='add'>+backpath=$B0/${V0}1/before_file1</div><div class='add'>+</div><div class='add'>+# Set gfid2path xattr</div><div class='add'>+TEST $CLI_SETGFID2PATH $backpath</div><div class='add'>+</div><div class='add'>+#Check for the presence of xattr</div><div class='add'>+pgfid_bname=$pgfid/before_file1</div><div class='add'>+echo -n $pgfid_bname &gt; $xxh64_file</div><div class='add'>+xxh64sum=$(($XXHSUM_EXEC $xxh64_file) 2&gt;/dev/null | awk '{print $1}')</div><div class='add'>+key="trusted.gfid2path.$xxh64sum"</div><div class='add'>+EXPECT $pgfid_bname get_text_xattr $key $backpath</div><div class='add'>+</div><div class='add'>+## enable gfid2path</div><div class='add'>+TEST $CLI volume set $V0 gfid2path enable</div><div class='add'>+</div><div class='add'>+#CREATE</div><div class='add'>+fname=$M0/file1</div><div class='add'>+touch $fname;</div><div class='add'>+backpath=$B0/${V0}1/file1</div><div class='add'>+</div><div class='add'>+#Check for the presence of xattr</div><div class='add'>+pgfid_bname=$pgfid/file1</div><div class='add'>+echo -n $pgfid_bname &gt; $xxh64_file</div><div class='add'>+xxh64sum=$(($XXHSUM_EXEC $xxh64_file) 2&gt;/dev/null | awk '{print $1}')</div><div class='add'>+key="trusted.gfid2path.$xxh64sum"</div><div class='add'>+EXPECT $pgfid_bname get_text_xattr $key $backpath</div><div class='add'>+</div><div class='add'>+#MKNOD</div><div class='add'>+fname=$M0/mknod_file1</div><div class='add'>+mknod $fname p;</div><div class='add'>+backpath=$B0/${V0}1/mknod_file1</div><div class='add'>+</div><div class='add'>+#Check for the presence of xattr</div><div class='add'>+pgfid_bname=$pgfid/mknod_file1</div><div class='add'>+echo -n $pgfid_bname &gt; $xxh64_file</div><div class='add'>+xxh64sum=$(($XXHSUM_EXEC $xxh64_file) 2&gt;/dev/null | awk '{print $1}')</div><div class='add'>+key="trusted.gfid2path.$xxh64sum"</div><div class='add'>+EXPECT $pgfid_bname get_text_xattr $key $backpath</div><div class='add'>+</div><div class='add'>+#LINK</div><div class='add'>+fname1=$M0/file1</div><div class='add'>+fname2=$M0/hl_file1</div><div class='add'>+ln $fname1 $fname2</div><div class='add'>+backpath1=$B0/${V0}1/file1</div><div class='add'>+backpath2=$B0/${V0}1/hl_file1</div><div class='add'>+</div><div class='add'>+#Check for the presence of two xattrs</div><div class='add'>+pgfid_bname=$pgfid/file1</div><div class='add'>+echo -n $pgfid_bname &gt; $xxh64_file</div><div class='add'>+xxh64sum=$(($XXHSUM_EXEC $xxh64_file) 2&gt;/dev/null | awk '{print $1}')</div><div class='add'>+key="trusted.gfid2path.$xxh64sum"</div><div class='add'>+EXPECT $pgfid_bname get_text_xattr $key $backpath1</div><div class='add'>+</div><div class='add'>+pgfid_bname=$pgfid/hl_file1</div><div class='add'>+echo -n $pgfid_bname &gt; $xxh64_file</div><div class='add'>+xxh64sum=$(($XXHSUM_EXEC $xxh64_file) 2&gt;/dev/null | awk '{print $1}')</div><div class='add'>+key="trusted.gfid2path.$xxh64sum"</div><div class='add'>+EXPECT $pgfid_bname get_text_xattr $key $backpath2</div><div class='add'>+</div><div class='add'>+#RENAME</div><div class='add'>+fname1=$M0/file1</div><div class='add'>+fname2=$M0/rn_file1</div><div class='add'>+mv $fname1 $fname2</div><div class='add'>+backpath=$B0/${V0}1/rn_file1</div><div class='add'>+</div><div class='add'>+#Check for the presence of new xattr</div><div class='add'>+pgfid_bname=$pgfid/file1</div><div class='add'>+echo -n $pgfid_bname &gt; $xxh64_file</div><div class='add'>+xxh64sum=$(($XXHSUM_EXEC $xxh64_file) 2&gt;/dev/null | awk '{print $1}')</div><div class='add'>+key="trusted.gfid2path.$xxh64sum"</div><div class='add'>+EXPECT_NOT $pgfid_bname get_text_xattr $key $backpath</div><div class='add'>+</div><div class='add'>+pgfid_bname=$pgfid/rn_file1</div><div class='add'>+echo -n $pgfid_bname &gt; $xxh64_file</div><div class='add'>+xxh64sum=$(($XXHSUM_EXEC $xxh64_file) 2&gt;/dev/null | awk '{print $1}')</div><div class='add'>+key="trusted.gfid2path.$xxh64sum"</div><div class='add'>+EXPECT $pgfid_bname get_text_xattr $key $backpath</div><div class='add'>+</div><div class='add'>+#UNLINK</div><div class='add'>+fname1=$M0/hl_file1</div><div class='add'>+rm -f $fname1</div><div class='add'>+fname2=$M0/rn_file1</div><div class='add'>+backpath=$B0/${V0}1/rn_file1</div><div class='add'>+</div><div class='add'>+#Check removal of xattr</div><div class='add'>+pgfid_bname=$pgfid/hl_file1</div><div class='add'>+echo -n $pgfid_bname &gt; $xxh64_file</div><div class='add'>+xxh64sum=$(($XXHSUM_EXEC $xxh64_file) 2&gt;/dev/null | awk '{print $1}')</div><div class='add'>+key="trusted.gfid2path.$xxh64sum"</div><div class='add'>+EXPECT_NOT $pgfid_bname get_text_xattr $key $backpath</div><div class='add'>+</div><div class='add'>+pgfid_bname=$pgfid/rn_file1</div><div class='add'>+echo -n $pgfid_bname &gt; $xxh64_file</div><div class='add'>+xxh64sum=$(($XXHSUM_EXEC $xxh64_file) 2&gt;/dev/null | awk '{print $1}')</div><div class='add'>+key="trusted.gfid2path.$xxh64sum"</div><div class='add'>+EXPECT $pgfid_bname get_text_xattr $key $backpath</div><div class='add'>+</div><div class='add'>+#SYMLINK</div><div class='add'>+fname=rn_file1</div><div class='add'>+sym_fname=$M0/sym_file1</div><div class='add'>+ln -s $fname $sym_fname</div><div class='add'>+backpath=$B0/${V0}1/sym_file1</div><div class='add'>+</div><div class='add'>+#Check for the presence of xattr</div><div class='add'>+pgfid_bname=$pgfid/sym_file1</div><div class='add'>+echo -n $pgfid_bname &gt; $xxh64_file</div><div class='add'>+xxh64sum=$(($XXHSUM_EXEC $xxh64_file) 2&gt;/dev/null | awk '{print $1}')</div><div class='add'>+key="trusted.gfid2path.$xxh64sum"</div><div class='add'>+EXPECT $pgfid_bname get_text_xattr $key $backpath</div><div class='add'>+</div><div class='add'>+#FINAL UNLINK</div><div class='add'>+fname=$M0/rn_file1</div><div class='add'>+sym_fname=$M0/sym_file1</div><div class='add'>+mknod_fname=$M0/mknod_file1</div><div class='add'>+</div><div class='add'>+rm -f $fname</div><div class='add'>+rm -f $sym_fname</div><div class='add'>+rm -f $mknod_fname</div><div class='add'>+TEST ! stat $fname</div><div class='add'>+TEST ! stat $sym_fname</div><div class='add'>+TEST ! stat $mknod_fname</div><div class='add'>+</div><div class='add'>+#Cleanups</div><div class='add'>+rm -f $STUB_EXEC</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/gfid2path/gfid2path_nfs.t b/tests/gfid2path/gfid2path_nfs.t<br/>new file mode 100644<br/>index 00000000000..d1ea7df2f4d<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/gfid2path/gfid2path_nfs.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/gfid2path/gfid2path_nfs.t</a></div><div class='hunk'>@@ -0,0 +1,152 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../include.rc</div><div class='add'>+. $(dirname $0)/../volume.rc</div><div class='add'>+. $(dirname $0)/../nfs.rc</div><div class='add'>+</div><div class='add'>+#G_TESTDEF_TEST_STATUS_CENTOS6=NFS_TEST</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+XXHSUM_SOURCE="$(dirname $0)/../../contrib/xxhash/xxhsum.c $(dirname $0)/../../contrib/xxhash/xxhash.c"</div><div class='add'>+XXHSUM_EXEC=$(dirname $0)/xxhsum</div><div class='add'>+</div><div class='add'>+## Build xxhsum C source</div><div class='add'>+build_tester $XXHSUM_SOURCE -o $XXHSUM_EXEC -I$(dirname $0)/../../contrib/xxhash</div><div class='add'>+TEST [ -e $XXHSUM_EXEC ]</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+</div><div class='add'>+## Create a single brick volume (B=1)</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/${V0}1;</div><div class='add'>+EXPECT "$V0" volinfo_field $V0 'Volume Name';</div><div class='add'>+EXPECT 'Created' volinfo_field $V0 'Status';</div><div class='add'>+EXPECT '1' brick_count $V0</div><div class='add'>+</div><div class='add'>+TEST $CLI volume set $V0 nfs.disable false</div><div class='add'>+</div><div class='add'>+## Start the volume</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+EXPECT 'Started' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+## Wait for volume to register with rpc.mountd</div><div class='add'>+EXPECT_WITHIN $NFS_EXPORT_TIMEOUT "1" is_nfs_export_available</div><div class='add'>+</div><div class='add'>+## Mount the volume</div><div class='add'>+TEST mount_nfs $H0:/$V0 $N0 nolock;</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+pgfid="00000000-0000-0000-0000-000000000001"</div><div class='add'>+xxh64_file=$B0/${V0}1/xxh64_file</div><div class='add'>+</div><div class='add'>+#CREATE</div><div class='add'>+fname=$N0/file1</div><div class='add'>+touch $fname;</div><div class='add'>+backpath=$B0/${V0}1/file1</div><div class='add'>+</div><div class='add'>+#Check for the presence of xattr</div><div class='add'>+pgfid_bname=$pgfid/file1</div><div class='add'>+echo -n $pgfid_bname &gt; $xxh64_file</div><div class='add'>+xxh64sum=$(($XXHSUM_EXEC $xxh64_file) 2&gt;/dev/null | awk '{print $1}')</div><div class='add'>+key="trusted.gfid2path.$xxh64sum"</div><div class='add'>+EXPECT $pgfid_bname get_text_xattr $key $backpath</div><div class='add'>+</div><div class='add'>+#MKNOD</div><div class='add'>+fname=$N0/mknod_file1</div><div class='add'>+mknod $fname p;</div><div class='add'>+backpath=$B0/${V0}1/mknod_file1</div><div class='add'>+</div><div class='add'>+#Check for the presence of xattr</div><div class='add'>+pgfid_bname=$pgfid/mknod_file1</div><div class='add'>+echo -n $pgfid_bname &gt; $xxh64_file</div><div class='add'>+xxh64sum=$(($XXHSUM_EXEC $xxh64_file) 2&gt;/dev/null | awk '{print $1}')</div><div class='add'>+key="trusted.gfid2path.$xxh64sum"</div><div class='add'>+EXPECT $pgfid_bname get_text_xattr $key $backpath</div><div class='add'>+</div><div class='add'>+#LINK</div><div class='add'>+fname1=$N0/file1</div><div class='add'>+fname2=$N0/hl_file1</div><div class='add'>+ln $fname1 $fname2</div><div class='add'>+backpath1=$B0/${V0}1/file1</div><div class='add'>+backpath2=$B0/${V0}1/hl_file1</div><div class='add'>+</div><div class='add'>+#Check for the presence of two xattrs</div><div class='add'>+pgfid_bname=$pgfid/file1</div><div class='add'>+echo -n $pgfid_bname &gt; $xxh64_file</div><div class='add'>+xxh64sum=$(($XXHSUM_EXEC $xxh64_file) 2&gt;/dev/null | awk '{print $1}')</div><div class='add'>+key="trusted.gfid2path.$xxh64sum"</div><div class='add'>+EXPECT $pgfid_bname get_text_xattr $key $backpath1</div><div class='add'>+</div><div class='add'>+pgfid_bname=$pgfid/hl_file1</div><div class='add'>+echo -n $pgfid_bname &gt; $xxh64_file</div><div class='add'>+xxh64sum=$(($XXHSUM_EXEC $xxh64_file) 2&gt;/dev/null | awk '{print $1}')</div><div class='add'>+key="trusted.gfid2path.$xxh64sum"</div><div class='add'>+EXPECT $pgfid_bname get_text_xattr $key $backpath2</div><div class='add'>+</div><div class='add'>+#RENAME</div><div class='add'>+fname1=$N0/file1</div><div class='add'>+fname2=$N0/rn_file1</div><div class='add'>+mv $fname1 $fname2</div><div class='add'>+backpath=$B0/${V0}1/rn_file1</div><div class='add'>+</div><div class='add'>+#Check for the presence of new xattr</div><div class='add'>+pgfid_bname=$pgfid/file1</div><div class='add'>+echo -n $pgfid_bname &gt; $xxh64_file</div><div class='add'>+xxh64sum=$(($XXHSUM_EXEC $xxh64_file) 2&gt;/dev/null | awk '{print $1}')</div><div class='add'>+key="trusted.gfid2path.$xxh64sum"</div><div class='add'>+EXPECT_NOT $pgfid_bname get_text_xattr $key $backpath</div><div class='add'>+</div><div class='add'>+pgfid_bname=$pgfid/rn_file1</div><div class='add'>+echo -n $pgfid_bname &gt; $xxh64_file</div><div class='add'>+xxh64sum=$(($XXHSUM_EXEC $xxh64_file) 2&gt;/dev/null | awk '{print $1}')</div><div class='add'>+key="trusted.gfid2path.$xxh64sum"</div><div class='add'>+EXPECT $pgfid_bname get_text_xattr $key $backpath</div><div class='add'>+</div><div class='add'>+#UNLINK</div><div class='add'>+fname1=$N0/hl_file1</div><div class='add'>+rm -f $fname1</div><div class='add'>+fname2=$N0/rn_file1</div><div class='add'>+backpath=$B0/${V0}1/rn_file1</div><div class='add'>+</div><div class='add'>+#Check removal of xattr</div><div class='add'>+pgfid_bname=$pgfid/hl_file1</div><div class='add'>+echo -n $pgfid_bname &gt; $xxh64_file</div><div class='add'>+xxh64sum=$(($XXHSUM_EXEC $xxh64_file) 2&gt;/dev/null | awk '{print $1}')</div><div class='add'>+key="trusted.gfid2path.$xxh64sum"</div><div class='add'>+EXPECT_NOT $pgfid_bname get_text_xattr $key $backpath</div><div class='add'>+</div><div class='add'>+pgfid_bname=$pgfid/rn_file1</div><div class='add'>+echo -n $pgfid_bname &gt; $xxh64_file</div><div class='add'>+xxh64sum=$(($XXHSUM_EXEC $xxh64_file) 2&gt;/dev/null | awk '{print $1}')</div><div class='add'>+key="trusted.gfid2path.$xxh64sum"</div><div class='add'>+EXPECT $pgfid_bname get_text_xattr $key $backpath</div><div class='add'>+</div><div class='add'>+#SYMLINK</div><div class='add'>+fname=rn_file1</div><div class='add'>+sym_fname=$N0/sym_file1</div><div class='add'>+ln -s $fname $sym_fname</div><div class='add'>+backpath=$B0/${V0}1/sym_file1</div><div class='add'>+</div><div class='add'>+#Check for the presence of xattr</div><div class='add'>+pgfid_bname=$pgfid/sym_file1</div><div class='add'>+echo -n $pgfid_bname &gt; $xxh64_file</div><div class='add'>+xxh64sum=$(($XXHSUM_EXEC $xxh64_file) 2&gt;/dev/null | awk '{print $1}')</div><div class='add'>+key="trusted.gfid2path.$xxh64sum"</div><div class='add'>+EXPECT $pgfid_bname get_text_xattr $key $backpath</div><div class='add'>+</div><div class='add'>+#FINAL UNLINK</div><div class='add'>+fname=$N0/rn_file1</div><div class='add'>+sym_fname=$N0/sym_file1</div><div class='add'>+mknod_fname=$N0/mknod_file1</div><div class='add'>+</div><div class='add'>+rm -f $fname</div><div class='add'>+rm -f $sym_fname</div><div class='add'>+rm -f $mknod_fname</div><div class='add'>+TEST ! stat $fname</div><div class='add'>+TEST ! stat $sym_fname</div><div class='add'>+TEST ! stat $mknod_fname</div><div class='add'>+</div><div class='add'>+#Cleanups</div><div class='add'>+rm -f $STUB_EXEC</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/glusterfind/glusterfind-basic.t b/tests/glusterfind/glusterfind-basic.t<br/>new file mode 100644<br/>index 00000000000..ccb33fb1fc8<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/glusterfind/glusterfind-basic.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/glusterfind/glusterfind-basic.t</a></div><div class='hunk'>@@ -0,0 +1,84 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../include.rc</div><div class='add'>+. $(dirname $0)/../volume.rc</div><div class='add'>+. $(dirname $0)/../env.rc</div><div class='add'>+</div><div class='add'>+SCRIPT_TIMEOUT=300</div><div class='add'>+</div><div class='add'>+##Cleanup and start glusterd</div><div class='add'>+cleanup;</div><div class='add'>+TEST glusterd;</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+</div><div class='add'>+##create .keys</div><div class='add'>+mkdir -p /var/lib/glusterd/glusterfind/.keys</div><div class='add'>+</div><div class='add'>+#create_and_start test_volume</div><div class='add'>+TEST $CLI volume create test-vol $H0:$B0/b1 $H0:$B0/b2 $H0:$B0/b3</div><div class='add'>+TEST gluster volume start test-vol</div><div class='add'>+</div><div class='add'>+##Mount test-vol</div><div class='add'>+TEST glusterfs -s $H0 --volfile-id test-vol $M0</div><div class='add'>+</div><div class='add'>+TEST timestamp1=$(date +'%s')</div><div class='add'>+</div><div class='add'>+##Create files and dirs inside the mount point</div><div class='add'>+TEST mkdir -p $M0/dir1</div><div class='add'>+TEST touch $M0/file1</div><div class='add'>+</div><div class='add'>+##Glusterfind Create</div><div class='add'>+TEST glusterfind create sess_vol1 test-vol --force</div><div class='add'>+</div><div class='add'>+##################################################################################</div><div class='add'>+#Incremental crawl</div><div class='add'>+##################################################################################</div><div class='add'>+##Glusterfind Pre</div><div class='add'>+TEST glusterfind pre sess_vol1 test-vol output_file.txt</div><div class='add'>+</div><div class='add'>+#Glusterfind Post</div><div class='add'>+TEST glusterfind post sess_vol1 test-vol</div><div class='add'>+</div><div class='add'>+##Glusterfind List</div><div class='add'>+EXPECT '1' echo $(glusterfind list | grep sess_vol1 | wc -l)</div><div class='add'>+</div><div class='add'>+TEST timestamp2=$(date +'%s')</div><div class='add'>+</div><div class='add'>+##Glusterfind Query</div><div class='add'>+TEST glusterfind query test-vol --since-time $timestamp1 --end-time $timestamp2 output_file.txt</div><div class='add'>+</div><div class='add'>+#################################################################################</div><div class='add'>+#Full Crawl</div><div class='add'>+#################################################################################</div><div class='add'>+##Glusterfind Pre</div><div class='add'>+TEST glusterfind pre sess_vol1 test-vol output_file.txt --full --regenerate-outfile</div><div class='add'>+EXPECT '1' echo $(grep 'NEW dir1' output_file.txt | wc -l)</div><div class='add'>+EXPECT '1' echo $(grep 'NEW file1' output_file.txt | wc -l)</div><div class='add'>+</div><div class='add'>+##Glusterfind Query commands</div><div class='add'>+TEST glusterfind query test-vol --full output_file.txt</div><div class='add'>+EXPECT '1' echo $(grep 'NEW dir1' output_file.txt | wc -l)</div><div class='add'>+EXPECT '1' echo $(grep 'NEW file1' output_file.txt | wc -l)</div><div class='add'>+</div><div class='add'>+##using tag, full crawl</div><div class='add'>+TEST glusterfind query test-vol --full --tag-for-full-find NEW output_file.txt</div><div class='add'>+EXPECT '1' echo $(grep 'NEW dir1' output_file.txt | wc -l)</div><div class='add'>+EXPECT '1' echo $(grep 'NEW file1' output_file.txt | wc -l)</div><div class='add'>+</div><div class='add'>+##using -field-separator option, full crawl</div><div class='add'>+glusterfind query test-vol --full output_file.txt --field-separator "=="</div><div class='add'>+EXPECT '1' echo $(grep 'NEW==dir1' output_file.txt | wc -l)</div><div class='add'>+EXPECT '1' echo $(grep 'NEW==file1' output_file.txt | wc -l)</div><div class='add'>+</div><div class='add'>+##Adding or Replacing a Brick from an Existing Glusterfind Session</div><div class='add'>+TEST gluster volume add-brick test-vol $H0:$B0/b4 force</div><div class='add'>+</div><div class='add'>+##To make existing session work after brick add</div><div class='add'>+TEST glusterfind create sess_vol test-vol --force</div><div class='add'>+EXPECT '1' echo $(glusterfind list | grep sess_vol1 | wc -l)</div><div class='add'>+</div><div class='add'>+##glusterfind delete</div><div class='add'>+TEST glusterfind delete sess_vol test-vol</div><div class='add'>+</div><div class='add'>+rm -rf output_file.txt</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/include.rc b/tests/include.rc<br/>new file mode 100644<br/>index 00000000000..0dc7d830449<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/include.rc?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/include.rc</a></div><div class='hunk'>@@ -0,0 +1,1350 @@</div><div class='add'>+</div><div class='add'>+checkpoint_time="$(date +%s%N)"</div><div class='add'>+</div><div class='add'>+M0=${M0:=/mnt/glusterfs/0};   # 0th mount point for FUSE</div><div class='add'>+M1=${M1:=/mnt/glusterfs/1};   # 1st mount point for FUSE</div><div class='add'>+M2=${M2:=/mnt/glusterfs/2};   # 2nd mount point for FUSE</div><div class='add'>+M3=${M3:=/mnt/glusterfs/3};   # 3rd mount point for FUSE</div><div class='add'>+N0=${N0:=/mnt/nfs/0};         # 0th mount point for NFS</div><div class='add'>+N1=${N1:=/mnt/nfs/1};         # 1st mount point for NFS</div><div class='add'>+V0=${V0:=patchy};             # volume name to use in tests</div><div class='add'>+V1=${V1:=patchy1};            # volume name to use in tests</div><div class='add'>+GMV0=${GMV0:=master};	      # master volume name to use in geo-rep tests</div><div class='add'>+GSV0=${GSV0:=slave};	      # slave volume name to use in geo-rep tests</div><div class='add'>+GSV1=${GSV1:=slave1};	      # slave volume name to use in geo-rep tests</div><div class='add'>+B0=${B0:=/d/backends};        # top level of brick directories</div><div class='add'>+WORKDIRS="$B0 $M0 $M1 $M2 $M3 $N0 $N1"</div><div class='add'>+</div><div class='add'>+ROOT_GFID="00000000-0000-0000-0000-000000000001"</div><div class='add'>+DOT_SHARD_GFID="be318638-e8a0-4c6d-977d-7a937aa84806"</div><div class='add'>+</div><div class='add'>+META_VOL=${META_VOL:=gluster_shared_storage}; # shared gluster storage volume used by snapshot scheduler, nfs ganesha and geo-rep.</div><div class='add'>+META_MNT=${META_MNT:=/var/run/gluster/shared_storage}; # Mount point of shared gluster volume.</div><div class='add'>+</div><div class='add'>+CC=cc</div><div class='add'>+OSTYPE=$(uname -s)</div><div class='add'>+</div><div class='add'>+env_dir=$(dirname $0)</div><div class='add'>+while true; do</div><div class='add'>+        ENV_RC=${env_dir}/env.rc</div><div class='add'>+        if [ -f ${ENV_RC} ]; then</div><div class='add'>+                break</div><div class='add'>+        fi</div><div class='add'>+        new_dir=$(dirname $env_dir)</div><div class='add'>+        if [ x"$new_dir" = x"$old_dir" ]; then</div><div class='add'>+                ENV_RC="/not/found"</div><div class='add'>+                break</div><div class='add'>+        fi</div><div class='add'>+        old_dir=$env_dir</div><div class='add'>+        env_dir=$new_dir</div><div class='add'>+done</div><div class='add'>+</div><div class='add'>+if [ ! -f $ENV_RC ]; then</div><div class='add'>+   echo "Aborting." | tee /dev/stderr</div><div class='add'>+   echo | tee /dev/stderr</div><div class='add'>+   echo "env.rc not found" | tee /dev/stderr</div><div class='add'>+   echo | tee /dev/stderr</div><div class='add'>+   echo "Please correct the problem and try again." | tee /dev/stderr</div><div class='add'>+   echo | tee /dev/stderr</div><div class='add'>+   exit 1</div><div class='add'>+fi</div><div class='add'>+. $ENV_RC</div><div class='add'>+</div><div class='add'>+H0=${H0:=`hostname`}; # hostname</div><div class='add'>+MOUNT_TYPE_FUSE="fuse.glusterfs"</div><div class='add'>+GREP_MOUNT_OPT_RO="grep (ro"</div><div class='add'>+GREP_MOUNT_OPT_RW="grep (rw"</div><div class='add'>+UMOUNT_F="umount -f"</div><div class='add'>+</div><div class='add'>+PATH=$PATH:${PWD}/tests/utils</div><div class='add'>+</div><div class='add'>+case $OSTYPE in</div><div class='add'>+Linux)</div><div class='add'>+  H0=${H0:=`hostname --fqdn`}; # hostname</div><div class='add'>+  ;;</div><div class='add'>+NetBSD)</div><div class='add'>+  MOUNT_TYPE_FUSE="puffs|perfuse|fuse.glusterfs"</div><div class='add'>+  GREP_MOUNT_OPT_RO="grep (read-only"</div><div class='add'>+  GREP_MOUNT_OPT_RW="grep -v (read-only"</div><div class='add'>+  UMOUNT_F="umount -f -R"</div><div class='add'>+  ;;</div><div class='add'>+*)</div><div class='add'>+  ;;</div><div class='add'>+esac</div><div class='add'>+</div><div class='add'>+DEBUG=${DEBUG:=0}             # turn on debugging?</div><div class='add'>+</div><div class='add'>+PROCESS_DOWN_TIMEOUT=5</div><div class='add'>+PROCESS_UP_TIMEOUT=45</div><div class='add'>+NFS_EXPORT_TIMEOUT=20</div><div class='add'>+CHILD_UP_TIMEOUT=20</div><div class='add'>+PROBE_TIMEOUT=60</div><div class='add'>+PEER_SYNC_TIMEOUT=20</div><div class='add'>+REBALANCE_TIMEOUT=600</div><div class='add'>+REOPEN_TIMEOUT=20</div><div class='add'>+HEAL_TIMEOUT=80</div><div class='add'>+IO_HEAL_TIMEOUT=120</div><div class='add'>+MARKER_UPDATE_TIMEOUT=20</div><div class='add'>+JANITOR_TIMEOUT=60</div><div class='add'>+UMOUNT_TIMEOUT=5</div><div class='add'>+CONFIG_UPDATE_TIMEOUT=5</div><div class='add'>+AUTH_REFRESH_INTERVAL=10</div><div class='add'>+GRAPH_SWITCH_TIMEOUT=10</div><div class='add'>+UNLINK_TIMEOUT=5</div><div class='add'>+MDC_TIMEOUT=5</div><div class='add'>+IO_WAIT_TIMEOUT=5</div><div class='add'>+DISK_FAIL_TIMEOUT=80</div><div class='add'>+</div><div class='add'>+LOGDIR=$(gluster --print-logdir)</div><div class='add'>+</div><div class='add'>+statedumpdir=`gluster --print-statedumpdir`; # Default directory for statedump</div><div class='add'>+</div><div class='add'>+CLI="gluster --mode=script --wignore";</div><div class='add'>+CLI_NO_FORCE="gluster --mode=script";</div><div class='add'>+</div><div class='add'>+# CLI_IGNORE_PARTITION makes sure that the warning related to bricks being on</div><div class='add'>+# root partition is ignored while running the command in a "no force" mode</div><div class='add'>+CLI_IGNORE_PARTITION="gluster --mode=script --wignore-partition"</div><div class='add'>+</div><div class='add'>+function wait_delay() {</div><div class='add'>+        local delay="$1"</div><div class='add'>+        local interval="$2"</div><div class='add'>+        shift 2</div><div class='add'>+        local deadline="$(($(date +%s%N) + ${delay}000000000))"</div><div class='add'>+</div><div class='add'>+        $*</div><div class='add'>+        while [[ $? -ne 0 ]]; do</div><div class='add'>+                if [[ $(date +%s%N) -ge ${deadline} ]]; then</div><div class='add'>+                        return 1</div><div class='add'>+                fi</div><div class='add'>+                sleep ${interval}</div><div class='add'>+                $*</div><div class='add'>+        done</div><div class='add'>+</div><div class='add'>+        return 0</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+_GFS () {</div><div class='add'>+	glusterfs "$@"</div><div class='add'>+	local mount_ret=$?</div><div class='add'>+	if [ $mount_ret != 0 ]; then</div><div class='add'>+		return $mount_ret</div><div class='add'>+	fi</div><div class='add'>+	local mount_point=${!#}</div><div class='add'>+	local i=0</div><div class='add'>+	while true; do</div><div class='add'>+		touch $mount_point/xy_zzy 2&gt; /dev/null &amp;&amp; break</div><div class='add'>+		i=$((i+1))</div><div class='add'>+		[ $i -lt 100 ] || break</div><div class='add'>+		sleep 0.1</div><div class='add'>+	done</div><div class='add'>+	rm -f $mount_point/xy_zzy</div><div class='add'>+	return $mount_ret</div><div class='add'>+}</div><div class='add'>+GFS="_GFS --attribute-timeout=0 --entry-timeout=0";</div><div class='add'>+</div><div class='add'>+mkdir -p $WORKDIRS</div><div class='add'>+</div><div class='add'>+case $OSTYPE in</div><div class='add'>+FreeBSD | Darwin)</div><div class='add'>+wc () {</div><div class='add'>+   if test "x$1" = "x-l"; then</div><div class='add'>+      awk '{ lines++ } END {print lines}'</div><div class='add'>+   fi</div><div class='add'>+   if test "x$1" = "x-w"; then</div><div class='add'>+      awk '{ words += NF } END {print words}' }</div><div class='add'>+   fi</div><div class='add'>+   if test "x$1" = "x-c"; then</div><div class='add'>+      awk '{ chars += length($0) + 1 } END {print chars}'</div><div class='add'>+   fi</div><div class='add'>+   if test "x$1" = "x-m"; then</div><div class='add'>+      awk '{ chars += length($0) + 1 } END {print chars}'</div><div class='add'>+   fi</div><div class='add'>+}</div><div class='add'>+;;</div><div class='add'>+NetBSD)</div><div class='add'>+wc() {</div><div class='add'>+    /usr/bin/wc $@ | sed 's/^ *\([0-9]*\).*$/\1/g'</div><div class='add'>+}</div><div class='add'>+;;</div><div class='add'>+esac</div><div class='add'>+</div><div class='add'>+testcnt=`egrep '^[[:space:]]*(EXPECT|EXPECT_NOT|TEST|EXPECT_WITHIN|EXPECT_KEYWORD)[[:space:]]' $0 | wc -l`</div><div class='add'>+expect_tests=`egrep '^[[:space:]]*TESTS_EXPECTED_IN_LOOP[[:space:]]*' $0`</div><div class='add'>+</div><div class='add'>+x_ifs=$IFS</div><div class='add'>+IFS=$'\n'</div><div class='add'>+for line in $expect_tests; do</div><div class='add'>+        expect_tests=`echo $line | cut -f 2 -d =`</div><div class='add'>+        testcnt=`expr $testcnt + $expect_tests`</div><div class='add'>+done</div><div class='add'>+IFS=$x_ifs</div><div class='add'>+</div><div class='add'>+echo "1..`echo $testcnt`"</div><div class='add'>+</div><div class='add'>+t=1</div><div class='add'>+</div><div class='add'>+function dbg()</div><div class='add'>+{</div><div class='add'>+        [ "x$DEBUG" = "x0" ] || echo "$*" &gt;&amp;2;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function G_LOG()</div><div class='add'>+{</div><div class='add'>+     local g_log_logdir;</div><div class='add'>+     g_log_logdir=`$CLI --print-logdir`</div><div class='add'>+     test -d $g_log_logdir</div><div class='add'>+     if [ $? != 0 ]; then</div><div class='add'>+        return</div><div class='add'>+     fi</div><div class='add'>+     local g_log_string;</div><div class='add'>+     g_log_string="++++++++++ G_LOG:$0: TEST: $@ ++++++++++"</div><div class='add'>+     g_log_string="`date -u +["%F %T.%6N"]`:$g_log_string"</div><div class='add'>+     local g_log_filename</div><div class='add'>+     for  g_log_filename in `find $g_log_logdir/ -type f -name \*.log`;</div><div class='add'>+        do</div><div class='add'>+                echo "$g_log_string" &gt;&gt; "$g_log_filename"</div><div class='add'>+        done</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function test_header()</div><div class='add'>+{</div><div class='add'>+        dbg "=========================";</div><div class='add'>+        dbg "TEST $t (line $TESTLINE): $*";</div><div class='add'>+        saved_cmd="$*"</div><div class='add'>+        start_time="$(date +%s%N)"</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+function test_footer()</div><div class='add'>+{</div><div class='add'>+        RET=$?</div><div class='add'>+        local lineno=$1</div><div class='add'>+        local err=$2</div><div class='add'>+        local end_time</div><div class='add'>+        local elapsed1</div><div class='add'>+        local elapsed2</div><div class='add'>+</div><div class='add'>+        end_time="$(date +%s%N)"</div><div class='add'>+        elapsed1="$(((start_time - checkpoint_time) / 1000000))"</div><div class='add'>+        elapsed2="$(((end_time - start_time) / 1000000))"</div><div class='add'>+        checkpoint_time="$end_time"</div><div class='add'>+        if [ $RET -eq 0 ]; then</div><div class='add'>+                printf "ok %3d [%7d/%7d] &lt;%4d&gt; '%s'\n" "$t" "$elapsed1" "$elapsed2" "$lineno" "$saved_cmd";</div><div class='add'>+        else</div><div class='add'>+                printf "not ok %3d [%7d/%7d] &lt;%4d&gt; '%s' -&gt; '%s'\n" "$t" "$elapsed1" "$elapsed2" "$lineno" "$saved_cmd" "$err"</div><div class='add'>+                if [ "$EXIT_EARLY" = "1" ]; then</div><div class='add'>+			cleanup</div><div class='add'>+                        exit $RET</div><div class='add'>+                fi</div><div class='add'>+        fi</div><div class='add'>+</div><div class='add'>+        dbg "RESULT $t: $RET";</div><div class='add'>+</div><div class='add'>+        t=`expr $t + 1`;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function test_expect_footer()</div><div class='add'>+{</div><div class='add'>+        local lineno=$1</div><div class='add'>+        local e=$2</div><div class='add'>+        local a=$3</div><div class='add'>+        local err=""</div><div class='add'>+</div><div class='add'>+        if ! [[ "$a" =~ $e ]]; then</div><div class='add'>+                err="Got \"$a\" instead of \"$e\""</div><div class='add'>+        fi</div><div class='add'>+        [[ "$a" =~ $e ]];</div><div class='add'>+</div><div class='add'>+        test_footer "$lineno" "$err";</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function _EXPECT()</div><div class='add'>+{</div><div class='add'>+        TESTLINE=$1;</div><div class='add'>+        shift;</div><div class='add'>+        local a=""</div><div class='add'>+</div><div class='add'>+        G_LOG $TESTLINE "$@";</div><div class='add'>+        test_header "$@";</div><div class='add'>+</div><div class='add'>+        e="$1";</div><div class='add'>+        shift;</div><div class='add'>+        a=$("$@" | tail -1)</div><div class='add'>+</div><div class='add'>+        if [ "x$e" = "x" ] ; then</div><div class='add'>+                test_expect_footer "$TESTLINE" "x$e" "x$a";</div><div class='add'>+        else</div><div class='add'>+                test_expect_footer "$TESTLINE" "$e" "$a";</div><div class='add'>+        fi</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function test_expect_not_footer()</div><div class='add'>+{</div><div class='add'>+        local lineno=$1</div><div class='add'>+        local e=$2</div><div class='add'>+        local a=$3</div><div class='add'>+        local err=""</div><div class='add'>+</div><div class='add'>+        if [[ "$a" =~ $e ]]; then</div><div class='add'>+                err="Got \"$a\" when not expecting it"</div><div class='add'>+        fi</div><div class='add'>+</div><div class='add'>+        ! [[ "$a" =~ $e ]];</div><div class='add'>+        test_footer "$lineno" "$err";</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function _EXPECT_NOT()</div><div class='add'>+{</div><div class='add'>+        TESTLINE=$1;</div><div class='add'>+        shift;</div><div class='add'>+        local a=""</div><div class='add'>+</div><div class='add'>+        G_LOG $TESTLINE "$@";</div><div class='add'>+        test_header "$@";</div><div class='add'>+</div><div class='add'>+        e="$1";</div><div class='add'>+        shift;</div><div class='add'>+        a=$("$@" | tail -1)</div><div class='add'>+</div><div class='add'>+        if [ "x$e" = "x" ] ; then</div><div class='add'>+               test_expect_not_footer "$TESTLINE" "x$e" "x$a";</div><div class='add'>+        else</div><div class='add'>+               test_expect_not_footer "$TESTLINE" "$e" "$a";</div><div class='add'>+        fi</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function _EXPECT_KEYWORD()</div><div class='add'>+{</div><div class='add'>+        TESTLINE=$1;</div><div class='add'>+        shift;</div><div class='add'>+        G_LOG $TESTLINE "$@";</div><div class='add'>+        test_header "$@";</div><div class='add'>+</div><div class='add'>+        e="$1";</div><div class='add'>+        shift;</div><div class='add'>+        "$@" | tail -1 | grep -q "$e"</div><div class='add'>+</div><div class='add'>+        test_footer "$TESTLINE";</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function _TEST()</div><div class='add'>+{</div><div class='add'>+        TESTLINE=$1;</div><div class='add'>+        shift;</div><div class='add'>+        local redirect=""</div><div class='add'>+</div><div class='add'>+        G_LOG $TESTLINE "$@";</div><div class='add'>+        test_header "$@";</div><div class='add'>+</div><div class='add'>+        if [ "$1" = "!" ]; then</div><div class='add'>+                redirect="2&gt;&amp;1"</div><div class='add'>+        fi</div><div class='add'>+</div><div class='add'>+        eval "$@" &gt;/dev/null $redirect</div><div class='add'>+</div><div class='add'>+        test_footer "$TESTLINE";</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#This function should be used carefully.</div><div class='add'>+#The expected regex, given to this function, should be</div><div class='add'>+#used within ^ and $ to match exactly with the output of</div><div class='add'>+#command.</div><div class='add'>+function _EXPECT_WITHIN()</div><div class='add'>+{</div><div class='add'>+        TESTLINE=$1</div><div class='add'>+        shift;</div><div class='add'>+</div><div class='add'>+        local timeout=$1</div><div class='add'>+        shift;</div><div class='add'>+</div><div class='add'>+        G_LOG $TESTLINE "$@";</div><div class='add'>+        test_header "$@"</div><div class='add'>+</div><div class='add'>+        e=$1;</div><div class='add'>+        a="";</div><div class='add'>+        shift;</div><div class='add'>+</div><div class='add'>+        local endtime="$(( ${timeout}000000000 + $(date +%s%N) ))"</div><div class='add'>+</div><div class='add'>+        # We *want* this to be globally visible.</div><div class='add'>+        EW_RETRIES=0</div><div class='add'>+</div><div class='add'>+        while [[ "$(date +%s%N)" &lt; "$endtime" ]]; do</div><div class='add'>+                a=$("$@" | tail -1 ; exit ${PIPESTATUS[0]})</div><div class='add'>+                ## Check command success</div><div class='add'>+                if [ $? -ne 0 ]; then</div><div class='add'>+                        break;</div><div class='add'>+                fi</div><div class='add'>+                ## Check match success</div><div class='add'>+                if [[ "$a" =~ $e ]]; then</div><div class='add'>+                        break;</div><div class='add'>+                fi</div><div class='add'>+                sleep 0.25;</div><div class='add'>+                EW_RETRIES=$((EW_RETRIES+1))</div><div class='add'>+        done</div><div class='add'>+</div><div class='add'>+        if [ "x$e" = "x" ] ; then</div><div class='add'>+               test_expect_footer "$TESTLINE" "x$e" "x$a";</div><div class='add'>+        else</div><div class='add'>+               test_expect_footer "$TESTLINE" "$e" "$a";</div><div class='add'>+        fi</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+function SKIP_TESTS()</div><div class='add'>+{</div><div class='add'>+        dbg "Skipping tests $t-$testcnt";</div><div class='add'>+        while [ $t -le $testcnt ]; do</div><div class='add'>+                true ; test_footer;</div><div class='add'>+        done</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+function _TEST_IN_LOOP()</div><div class='add'>+{</div><div class='add'>+        testcnt=`expr $testcnt + 1`;</div><div class='add'>+        _TEST $@</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function _EXPECT_WITHIN_TEST_IN_LOOP()</div><div class='add'>+{</div><div class='add'>+        testcnt=`expr $testcnt + 1`;</div><div class='add'>+        _EXPECT_WITHIN $@</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+which killall &gt; /dev/null || {</div><div class='add'>+  killall() {</div><div class='add'>+    pkill $@</div><div class='add'>+  }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+which pidof &gt; /dev/null || {</div><div class='add'>+  pidof() {</div><div class='add'>+    $PYTHON pidof.py $@</div><div class='add'>+  }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+stat -c %s /dev/null &gt; /dev/null 2&gt;&amp;1 || {</div><div class='add'>+  stat() {</div><div class='add'>+    local format=""</div><div class='add'>+    local f=""</div><div class='add'>+</div><div class='add'>+    if [ "x$1" = "x-c" ] ; then</div><div class='add'>+      oformat=$2</div><div class='add'>+      shift</div><div class='add'>+      shift</div><div class='add'>+      files=$@</div><div class='add'>+    else</div><div class='add'>+      files=$@</div><div class='add'>+    fi</div><div class='add'>+</div><div class='add'>+    for f in $files ; do</div><div class='add'>+        format=$oformat</div><div class='add'>+</div><div class='add'>+      # %t/%T should return 0 for non devices.</div><div class='add'>+      case "${format}" in</div><div class='add'>+      *%t*|*%T*)</div><div class='add'>+        `which stat` -f '%HT' $f | grep -q 'Device$' || \</div><div class='add'>+           format=`echo "${format}" | sed 's/%t/0/g; s/%T/0/g;'`</div><div class='add'>+        ;;</div><div class='add'>+      *)</div><div class='add'>+        ;;</div><div class='add'>+      esac</div><div class='add'>+</div><div class='add'>+      if [ "x${format}" = "x" ] ; then</div><div class='add'>+        `which stat` $f</div><div class='add'>+      else</div><div class='add'>+         cmd=""</div><div class='add'>+         case $format in</div><div class='add'>+         *%u*) cmd="${cmd} s/%u/`$( which stat ) -f %u $f`/g;" ;&amp;</div><div class='add'>+         *%g*) cmd="${cmd} s/%g/`$( which stat ) -f %g $f`/g;" ;&amp;</div><div class='add'>+         *%a*) cmd="${cmd} s/%a/`$( which stat ) -f %p $f |</div><div class='add'>+                    sed 's/^..//; s/^0//'`/g;" ;&amp;</div><div class='add'>+         *%A*) cmd="${cmd} s/%A/`ls -ld $f|awk '{print $1}'`/g;" ;&amp;</div><div class='add'>+         *%s*) cmd="${cmd} s/%s/`$( which stat ) -f %z $f`/g;" ;&amp;</div><div class='add'>+         *%h*) cmd="${cmd} s/%h/`$( which stat ) -f %l $f`/g;" ;&amp;</div><div class='add'>+         *%F*) cmd="${cmd} s/%F/`$( which stat ) -f %HT $f | sed '</div><div class='add'>+            s/Directory/directory/;</div><div class='add'>+            s/Fifo File/fifo/;</div><div class='add'>+            s/Symbolic Link/symbolic link/;</div><div class='add'>+            s/Regular File/regular file/;</div><div class='add'>+            s/Block Device/block special file/;</div><div class='add'>+            s/Character Device/character special file/;</div><div class='add'>+           ' | sed \"$(</div><div class='add'>+             test -s $f || echo 's/regular file/regular empty file/g'</div><div class='add'>+            )\"`/g;" ;&amp;</div><div class='add'>+         *%n*) cmd="${cmd} s|%n|`$( which stat ) -f %N $f`|g;" ;&amp;</div><div class='add'>+         *%Y*) cmd="${cmd} s/%Y/`$( which stat ) -f %m $f`/g;" ;&amp;</div><div class='add'>+         *%X*) cmd="${cmd} s/%X/`$( which stat ) -f %a $f`/g;" ;&amp;</div><div class='add'>+         *%Z*) cmd="${cmd} s/%Z/`$( which stat ) -f %c $f`/g;" ;&amp;</div><div class='add'>+         *%.Z*) cmd="${cmd} s/%.Z/`$( which stat ) -f %.9Fc $f`/g;" ;&amp;</div><div class='add'>+         *%b*) cmd="${cmd} s/%b/`$( which stat ) -f %b $f`/g;" ;&amp;</div><div class='add'>+         *%B*) cmd="${cmd} s/%B/512/g;" ;&amp;</div><div class='add'>+         *%t*) cmd="${cmd} s/%t/`$( which stat ) -f %XHr $f`/g;" ;&amp;</div><div class='add'>+         *%T*) cmd="${cmd} s/%T/`$( which stat ) -f %XLr $f`/g;" ;&amp;</div><div class='add'>+         esac</div><div class='add'>+</div><div class='add'>+         `which stat` -f "`echo $format|sed \"$cmd\"`" $f</div><div class='add'>+      fi</div><div class='add'>+    done</div><div class='add'>+  }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function signal_pids() {</div><div class='add'>+        local sig="$1"</div><div class='add'>+        shift</div><div class='add'>+        local pids=($*)</div><div class='add'>+</div><div class='add'>+        if [[ ${#pids[@]} -gt 0 ]]; then</div><div class='add'>+                kill -${sig} ${pids[@]} 2&gt;/dev/null || true</div><div class='add'>+        fi</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function check_pids() {</div><div class='add'>+        local pids=($*)</div><div class='add'>+        local tmp=()</div><div class='add'>+        local pid</div><div class='add'>+</div><div class='add'>+        for pid in "${pids[@]}"; do</div><div class='add'>+                kill -0 "${pid}" 2&gt;/dev/null &amp;&amp; tmp+=(${pid})</div><div class='add'>+        done</div><div class='add'>+</div><div class='add'>+        echo "${tmp[@]}"</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function pids_alive() {</div><div class='add'>+        local pids=($*)</div><div class='add'>+</div><div class='add'>+        if [[ "$(check_pids ${pids[@]})" != "" ]]; then</div><div class='add'>+                return 1;</div><div class='add'>+        fi</div><div class='add'>+</div><div class='add'>+        return 0</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function terminate_pids() {</div><div class='add'>+        local pids=($*)</div><div class='add'>+</div><div class='add'>+        signal_pids TERM ${pids[@]}</div><div class='add'>+        wait_delay ${PROCESS_DOWN_TIMEOUT} 0.1 pids_alive ${pids[@]}</div><div class='add'>+        if [[ $? -ne 0 ]]; then</div><div class='add'>+                pids=($(check_pids ${pids[@]}))</div><div class='add'>+                signal_pids KILL ${pids[@]}</div><div class='add'>+                wait_delay 1 0.1 pids_alive ${pids[@]}</div><div class='add'>+                if [[ $? -ne 0 ]]; then</div><div class='add'>+                        return 2</div><div class='add'>+                fi</div><div class='add'>+</div><div class='add'>+                return 1</div><div class='add'>+        fi</div><div class='add'>+</div><div class='add'>+        return 0</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function process_pids() {</div><div class='add'>+        local proc</div><div class='add'>+        local pids=()</div><div class='add'>+</div><div class='add'>+        for proc in $*; do</div><div class='add'>+                pids+=($(pgrep ${proc}))</div><div class='add'>+        done</div><div class='add'>+</div><div class='add'>+        echo "${pids[@]}"</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+## Lock files should get automatically removed once "usradd" or "groupadd"</div><div class='add'>+## command finishes. But sometimes we encounter situations (bugs) where</div><div class='add'>+## some of these files may not get properly unlocked after the execution of</div><div class='add'>+## the command. In that case, when we execute useradd next time, it may show</div><div class='add'>+## the error â€œcannot lock /etc/passwordâ€ or â€œunable to lock group fileâ€.</div><div class='add'>+## So, to avoid any such errors, check for any lock files under /etc.</div><div class='add'>+## and remove those.</div><div class='add'>+</div><div class='add'>+function remove_lock_files()</div><div class='add'>+{</div><div class='add'>+        if [ ! -f /etc/passwd.lock ];</div><div class='add'>+        then</div><div class='add'>+                rm -rf /etc/passwd.lock;</div><div class='add'>+        fi</div><div class='add'>+</div><div class='add'>+        if [ ! -f /etc/group.lock ];</div><div class='add'>+        then</div><div class='add'>+                rm -rf /etc/group.lock;</div><div class='add'>+        fi</div><div class='add'>+</div><div class='add'>+        if [ ! -f /etc/shadow.lock ];</div><div class='add'>+        then</div><div class='add'>+                rm -rf /etc/shadow.lock;</div><div class='add'>+        fi</div><div class='add'>+</div><div class='add'>+        if [ ! -f /etc/gshadow.lock ];</div><div class='add'>+        then</div><div class='add'>+                rm -rf /etc/gshadow.lock;</div><div class='add'>+        fi</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+function cleanup()</div><div class='add'>+{</div><div class='add'>+        local end_time</div><div class='add'>+</div><div class='add'>+        # Prepare flags for umount</div><div class='add'>+        case `uname -s` in</div><div class='add'>+        Linux)</div><div class='add'>+                flag="-l"</div><div class='add'>+                ;;</div><div class='add'>+        NetBSD)</div><div class='add'>+                flag="-f -R"</div><div class='add'>+                ;;</div><div class='add'>+        FreeBSD|Darwin)</div><div class='add'>+                flag="-f"</div><div class='add'>+                ;;</div><div class='add'>+        *)</div><div class='add'>+                flag=""</div><div class='add'>+                ;;</div><div class='add'>+        esac</div><div class='add'>+</div><div class='add'>+        # Clean up lock files.</div><div class='add'>+        remove_lock_files</div><div class='add'>+</div><div class='add'>+        # Clean up all client mounts</div><div class='add'>+        for m in `mount | grep fuse.glusterfs | awk '{print $3}'`; do</div><div class='add'>+                umount $flag $m</div><div class='add'>+        done</div><div class='add'>+</div><div class='add'>+        # Unmount all well known mount points</div><div class='add'>+        umount $flag $M0 2&gt;/dev/null || umount -f $M0 2&gt;/dev/null || true;</div><div class='add'>+        umount $flag $M1 2&gt;/dev/null || umount -f $M1 2&gt;/dev/null || true;</div><div class='add'>+        umount $flag $M2 2&gt;/dev/null || umount -f $M2 2&gt;/dev/null || true;</div><div class='add'>+        umount $flag $N0 2&gt;/dev/null || umount -f $N0 2&gt;/dev/null || true;</div><div class='add'>+        umount $flag $N1 2&gt;/dev/null || umount -f $N1 2&gt;/dev/null || true;</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+        # unmount all stale mounts from /tmp, This is a temporary work around</div><div class='add'>+        # till the stale mount in /tmp is found.</div><div class='add'>+        umount $flag /tmp/mnt* 2&gt;/dev/null</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+        # Send SIGTERM to all gluster processes and rpc.statd that are still running</div><div class='add'>+        terminate_pids $(process_pids glusterfs glusterfsd glusterd rpc.statd)</div><div class='add'>+</div><div class='add'>+        test x"$OSTYPE" = x"NetBSD" &amp;&amp; pkill -9 perfused || true</div><div class='add'>+</div><div class='add'>+        # unregister nfs and related services from portmapper/rpcbind</div><div class='add'>+        ## nfs</div><div class='add'>+        rpcinfo -d 100003 3 2&gt;/dev/null || true;</div><div class='add'>+        ## mountd</div><div class='add'>+        rpcinfo -d 100005 1 2&gt;/dev/null || true;</div><div class='add'>+        rpcinfo -d 100005 3 2&gt;/dev/null || true;</div><div class='add'>+        ## nlockmgr</div><div class='add'>+        rpcinfo -d 100021 1 2&gt;/dev/null || true;</div><div class='add'>+        rpcinfo -d 100021 4 2&gt;/dev/null || true;</div><div class='add'>+        ## nfs_acl</div><div class='add'>+        rpcinfo -d 100227 3 2&gt;/dev/null || true;</div><div class='add'>+</div><div class='add'>+        # unmount brick filesystems after killing daemons</div><div class='add'>+        MOUNTPOINTS=`mount | grep "$B0/" | awk '{print $3}'`</div><div class='add'>+        for m in $MOUNTPOINTS;</div><div class='add'>+        do</div><div class='add'>+                umount $flag $m</div><div class='add'>+        done</div><div class='add'>+</div><div class='add'>+        # Cleanup lvm</div><div class='add'>+        type cleanup_lvm &amp;&gt;/dev/null &amp;&amp; cleanup_lvm || true;</div><div class='add'>+</div><div class='add'>+        # Destroy loop devices</div><div class='add'>+        # TODO: This should be a function DESTROY_LOOP</div><div class='add'>+        case `uname -s` in</div><div class='add'>+        Linux)</div><div class='add'>+                LOOPDEVICES=`losetup -a | grep "$B0/" | \</div><div class='add'>+                             awk '{print $1}' | tr -d :`</div><div class='add'>+                for l in $LOOPDEVICES;</div><div class='add'>+                do</div><div class='add'>+                        losetup -d $l</div><div class='add'>+                done</div><div class='add'>+                ;;</div><div class='add'>+        NetBSD)</div><div class='add'>+                # cleanup loopback device with unmounted backing store</div><div class='add'>+                for vnd in /dev/vnd* ; do</div><div class='add'>+                        vnconfig -l ${vnd} 2&gt;&amp;1 | \</div><div class='add'>+                            grep -q 'Bad file descriptor' &amp;&amp; vnconfig -u ${vnd}</div><div class='add'>+                done</div><div class='add'>+</div><div class='add'>+                vnd=`vnconfig -l | \</div><div class='add'>+                     awk '!/not in use/{printf("%s%s:%d ", $1, $2, $5);}'`</div><div class='add'>+                for l in ${vnd} ; do</div><div class='add'>+                        dev=${l%%:*}</div><div class='add'>+                        tmp=${l#*:}</div><div class='add'>+                        fs=${tmp%%:*}</div><div class='add'>+                        inode=${tmp#*:}</div><div class='add'>+                        file=`find -x ${fs} -inum ${inode} -print -exit`</div><div class='add'>+                        echo ${file} | grep "$B0/" &amp;&amp; \</div><div class='add'>+                            LOOPDEVICES="${LOOPDEVICES} $dev"</div><div class='add'>+                done</div><div class='add'>+                for l in $LOOPDEVICES;</div><div class='add'>+                do</div><div class='add'>+                        vnconfig -u $l</div><div class='add'>+                done</div><div class='add'>+                ;;</div><div class='add'>+        *)</div><div class='add'>+                echo "`uname -s` loopback device supportmissing"</div><div class='add'>+                ;;</div><div class='add'>+        esac</div><div class='add'>+</div><div class='add'>+        # remove contents of "GLUSTERD_WORKDIR" except hooks and groups</div><div class='add'>+        # directories.</div><div class='add'>+        if [ -n $GLUSTERD_WORKDIR ]</div><div class='add'>+        then</div><div class='add'>+                find  $GLUSTERD_WORKDIR/* -maxdepth 0 -name 'hooks' -prune \</div><div class='add'>+                -o -name 'groups' -prune -o -exec rm -rf '{}' ';'</div><div class='add'>+        else</div><div class='add'>+                echo "GLUSTERD_WORKDIR is not set"</div><div class='add'>+        fi</div><div class='add'>+</div><div class='add'>+        # Complete cleanup time</div><div class='add'>+        rm -rf "$B0/*" "/etc/glusterd/*";</div><div class='add'>+        rm -rf $WORKDIRS</div><div class='add'>+        find $GLUSTERD_PIDFILEDIR -name "*.pid" | xargs rm -rf</div><div class='add'>+        leftover=""</div><div class='add'>+        for d in $WORKDIRS ; do</div><div class='add'>+                if test -d $d ; then</div><div class='add'>+                       leftover="$leftover $d"</div><div class='add'>+                fi</div><div class='add'>+        done</div><div class='add'>+        if [ "x$leftover" != "x" ] ; then</div><div class='add'>+                echo "Aborting."</div><div class='add'>+                echo</div><div class='add'>+                echo "$d could not be deleted, here are the left over items"</div><div class='add'>+                for d in $leftover; do</div><div class='add'>+                        find $d -exec ls -ld {} \;</div><div class='add'>+                done</div><div class='add'>+                echo</div><div class='add'>+                echo "Please correct the problem and try again."</div><div class='add'>+                echo</div><div class='add'>+                return 1;</div><div class='add'>+        fi &gt;&amp;2</div><div class='add'>+</div><div class='add'>+        mkdir -p $WORKDIRS</div><div class='add'>+	# This is usually the last thing a test script calls, so our return</div><div class='add'>+	# value becomes their exit value.  While it's not great for the mkdir</div><div class='add'>+	# above to fail, promoting that into a failure of the whole test (and</div><div class='add'>+	# thus of an entire regression-test run) seems a bit excessive.  Make</div><div class='add'>+	# sure we return good status anyway.</div><div class='add'>+</div><div class='add'>+        return 0</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function force_terminate () {</div><div class='add'>+        local ret=$?;</div><div class='add'>+        &gt;&amp;2 echo -e "\nreceived external"\</div><div class='add'>+                        "signal --`kill -l $ret`--, calling 'cleanup' ...\n";</div><div class='add'>+        cleanup;</div><div class='add'>+        exit $ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+trap force_terminate INT TERM HUP</div><div class='add'>+</div><div class='add'>+function volinfo_field()</div><div class='add'>+{</div><div class='add'>+    local vol=$1;</div><div class='add'>+    local field=$2;</div><div class='add'>+</div><div class='add'>+    $CLI volume info $vol | grep "^$field: " | sed 's/.*: //';</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function cleanup_tester ()</div><div class='add'>+{</div><div class='add'>+    local exe=$1</div><div class='add'>+    rm -f $exe</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function build_tester ()</div><div class='add'>+{</div><div class='add'>+    local cfile=$1</div><div class='add'>+    local fname=$(basename "$cfile")</div><div class='add'>+    local ext="${fname##*.}"</div><div class='add'>+    local execname="${fname%.*}"</div><div class='add'>+    shift</div><div class='add'>+    local cflags=$*</div><div class='add'>+    if [ `echo $cflags | grep -c "lgfapi" ` -gt 0 ]</div><div class='add'>+    then</div><div class='add'>+       cflags="$cflags $(pkg-config glusterfs-api --cflags-only-I --libs-only-L)"</div><div class='add'>+    fi</div><div class='add'>+    $CC -g -o $(dirname $cfile)/$execname $cfile $cflags</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function process_leak_count ()</div><div class='add'>+{</div><div class='add'>+    local pid=$1;</div><div class='add'>+    return $(ls -lh /proc/$pid/fd | grep "(deleted)"| wc -l)</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+which truncate &gt; /dev/null || {</div><div class='add'>+  truncate() {</div><div class='add'>+    local nocreate=0</div><div class='add'>+    local ioblocks=0</div><div class='add'>+    local fileref=""</div><div class='add'>+    local newsize=""</div><div class='add'>+</div><div class='add'>+    args=`getopt xor:s: $*`</div><div class='add'>+    if [ $? -ne 0 ]; then</div><div class='add'>+      echo 'Usage: truncate [-co](-r file | -s size) file ...'</div><div class='add'>+      exit 2</div><div class='add'>+    fi</div><div class='add'>+    set -- $args</div><div class='add'>+    while [ $# -gt 0 ]; do</div><div class='add'>+      case "$1" in</div><div class='add'>+      -c)</div><div class='add'>+        nocreate=1;</div><div class='add'>+        ;;</div><div class='add'>+      -o)</div><div class='add'>+        ioblocks=1;</div><div class='add'>+        echo "Unimplemented -o option"</div><div class='add'>+        exit 2</div><div class='add'>+        ;;</div><div class='add'>+      -r)</div><div class='add'>+        fileref=$2;</div><div class='add'>+        shift;</div><div class='add'>+        ;;</div><div class='add'>+      -s)</div><div class='add'>+        newsize=$2;</div><div class='add'>+        shift;</div><div class='add'>+        ;;</div><div class='add'>+      --)</div><div class='add'>+        shift;</div><div class='add'>+        break;</div><div class='add'>+        ;;</div><div class='add'>+      *)</div><div class='add'>+        echo 'Usage: truncate [-co](-r file | -s size) file ...'</div><div class='add'>+        exit 2;</div><div class='add'>+        ;;</div><div class='add'>+      esac</div><div class='add'>+      shift</div><div class='add'>+    done</div><div class='add'>+</div><div class='add'>+    if [ "x$newsize" = "x" -a "x$fileref" = "x" ] ; then</div><div class='add'>+      echo 'Usage: truncate [-co](-r file | -s size) file ...'</div><div class='add'>+      exit 2;</div><div class='add'>+    fi</div><div class='add'>+</div><div class='add'>+    if [ "x$newsize" != "x" -a "x$fileref" != "x" ] ; then</div><div class='add'>+      echo 'Usage: truncate [-co](-r file | -s size) file ...'</div><div class='add'>+      exit 2;</div><div class='add'>+    fi</div><div class='add'>+</div><div class='add'>+    if [ "x$newsize" != "x" ] ; then</div><div class='add'>+      echo $newsize | grep -q '^[-_&lt;&gt;%/]' &amp;&amp; {</div><div class='add'>+        echo "Unimplemented prefix in ${newsize}"</div><div class='add'>+        exit 2;</div><div class='add'>+      }</div><div class='add'>+</div><div class='add'>+      echo $newsize | egrep -q '[TPEZY]B?$' &amp;&amp; {</div><div class='add'>+        echo "Unit not implemented for ${newsize}"</div><div class='add'>+        exit 2;</div><div class='add'>+      }</div><div class='add'>+</div><div class='add'>+      case $newsize in</div><div class='add'>+      *KB)</div><div class='add'>+        newsize=$(( ${newsize/KB/} * 1000 ))</div><div class='add'>+        ;;</div><div class='add'>+      *K)</div><div class='add'>+        newsize=$(( ${newsize/K/} * 1024 ))</div><div class='add'>+        ;;</div><div class='add'>+      *MB)</div><div class='add'>+        newsize=$(( ${newsize/MB/} * 1000 * 1000 ))</div><div class='add'>+        ;;</div><div class='add'>+      *M)</div><div class='add'>+        newsize=$(( ${newsize/M/} * 1024 * 1024 ))</div><div class='add'>+        ;;</div><div class='add'>+      *GB)</div><div class='add'>+        newsize=$(( ${newsize/GB/} * 1000 * 1000 * 1000 ))</div><div class='add'>+        ;;</div><div class='add'>+      *G)</div><div class='add'>+        newsize=$(( ${newsize/G/} * 1024 * 1024 * 1024 ))</div><div class='add'>+        ;;</div><div class='add'>+      esac</div><div class='add'>+</div><div class='add'>+    fi</div><div class='add'>+</div><div class='add'>+    if [ "x$fileref" != "x" ] ; then</div><div class='add'>+       if [ ! -f $fileref ] ; then</div><div class='add'>+         echo "File does not exists: ${fileref}"</div><div class='add'>+         exit 2;</div><div class='add'>+       fi</div><div class='add'>+       newsize=`ls -l ${fileref}|awk '{print $5}'`</div><div class='add'>+    fi</div><div class='add'>+</div><div class='add'>+    if [ $# -eq 0 ]; then</div><div class='add'>+      echo 'Usage: truncate [-co](-r file | -s size) file ...'</div><div class='add'>+      exit 2;</div><div class='add'>+    fi</div><div class='add'>+</div><div class='add'>+    for f in $* ; do</div><div class='add'>+      if [ "x$nocreate" = "x1" -a ! -f $f ] ; then</div><div class='add'>+        continue;</div><div class='add'>+      fi</div><div class='add'>+</div><div class='add'>+      dd bs=1 seek=$newsize if=/dev/null of=$f msgfmt=quiet</div><div class='add'>+    done</div><div class='add'>+  }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+which md5sum &gt; /dev/null || {</div><div class='add'>+  md5sum() {</div><div class='add'>+    for f in $* ; do</div><div class='add'>+      md5 $f | awk -F'[() ]' '{printf("%s  %s\n", $6, $3)}'</div><div class='add'>+    done</div><div class='add'>+  }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+which setfattr &gt; /dev/null || {</div><div class='add'>+  setfattr() {</div><div class='add'>+    $PYTHON setfattr.py $@</div><div class='add'>+  }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+which getfattr &gt; /dev/null || {</div><div class='add'>+  getfattr() {</div><div class='add'>+    $PYTHON getfattr.py $@</div><div class='add'>+  }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+which sha1sum &gt; /dev/null || {</div><div class='add'>+  sha1sum() {</div><div class='add'>+  case $OSTYPE in</div><div class='add'>+  Darwin)</div><div class='add'>+    for f in $* ; do</div><div class='add'>+      openssl sha1 $f | awk -F'[() ]' '{printf("%s %s\n", $4, $2)}'</div><div class='add'>+    done</div><div class='add'>+    ;;</div><div class='add'>+  NetBSD | FreeBSD)</div><div class='add'>+    for f in $* ; do</div><div class='add'>+      sha1 $f | awk -F'[() ]' '{printf("%s  %s\n", $6, $3)}'</div><div class='add'>+    done</div><div class='add'>+    ;;</div><div class='add'>+  esac</div><div class='add'>+  }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+userdel --help 2&gt;/dev/null | grep -q -- '--force' || {</div><div class='add'>+  userdel() {</div><div class='add'>+    if [ "x$1" = "x--force" ]; then</div><div class='add'>+      user=$2</div><div class='add'>+    else</div><div class='add'>+      user=$1</div><div class='add'>+    fi</div><div class='add'>+    eval "$( which userdel ) $user"</div><div class='add'>+  }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+useradd --help 2&gt;/dev/null | grep -q -- '--no-create-home' || {</div><div class='add'>+  useradd() {</div><div class='add'>+    # Just remove -M (do not create home) which is the default</div><div class='add'>+    # other options are identical</div><div class='add'>+    args=`echo $*|sed 's/-M//'`</div><div class='add'>+    eval "$( which useradd ) $args"</div><div class='add'>+  }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+userdel --help 2&gt;/dev/null | grep -q -- '--force' || {</div><div class='add'>+  userdel() {</div><div class='add'>+    if [ "x$1" = "x--force" ]; then</div><div class='add'>+      user=$2</div><div class='add'>+    else</div><div class='add'>+      user=$1</div><div class='add'>+    fi</div><div class='add'>+    eval "$( which userdel ) $user"</div><div class='add'>+  }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+useradd --help 2&gt;/dev/null | grep -q -- '--no-create-home' || {</div><div class='add'>+  useradd() {</div><div class='add'>+    # Just remove -M (do not create home) which is the default</div><div class='add'>+    # other options are identical</div><div class='add'>+    args=`echo $*|sed 's/-M//'`</div><div class='add'>+    eval "$( which useradd ) $args"</div><div class='add'>+  }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+DBG_TEST () {</div><div class='add'>+        read -p "execute \"$*\"? " x;</div><div class='add'>+        case $x in</div><div class='add'>+        'y')</div><div class='add'>+                _TEST "$@"</div><div class='add'>+                ;;</div><div class='add'>+        'q')</div><div class='add'>+                exit 0</div><div class='add'>+                ;;</div><div class='add'>+        *)</div><div class='add'>+                echo "skipping"</div><div class='add'>+                ;;</div><div class='add'>+        esac</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+alias EXPECT='_EXPECT $LINENO'</div><div class='add'>+alias EXPECT_NOT='_EXPECT_NOT $LINENO'</div><div class='add'>+if [ -n "$GF_INTERACTIVE" ]; then</div><div class='add'>+	alias TEST='DBG_TEST $LINENO'</div><div class='add'>+else</div><div class='add'>+	alias TEST='_TEST $LINENO'</div><div class='add'>+fi</div><div class='add'>+alias EXPECT_WITHIN='_EXPECT_WITHIN $LINENO'</div><div class='add'>+alias EXPECT_KEYWORD='_EXPECT_KEYWORD $LINENO'</div><div class='add'>+alias TEST_IN_LOOP='_TEST_IN_LOOP $LINENO'</div><div class='add'>+alias EXPECT_WITHIN_TEST_IN_LOOP='_EXPECT_WITHIN_TEST_IN_LOOP $LINENO'</div><div class='add'>+shopt -s expand_aliases</div><div class='add'>+</div><div class='add'>+if [ x"$OSTYPE" = x"Linux" ]; then</div><div class='add'>+        alias dd="dd status=none"</div><div class='add'>+elif [ x"$OSTYPE" = x"NetBSD" ]; then</div><div class='add'>+        alias dd="dd msgfmt=quiet"</div><div class='add'>+fi</div><div class='add'>+# MacOS doesn't seem to support either option.  Doing nothing at all is</div><div class='add'>+# probably the safest option there and on anything we don't recognize, but</div><div class='add'>+# if you want to reduce the noise level and know the correct option for</div><div class='add'>+# your favorite platform please feel free to add it here.</div><div class='add'>+</div><div class='add'>+function SETUP_LOOP ()</div><div class='add'>+{</div><div class='add'>+  if [ $# != 1 ] ; then</div><div class='add'>+    echo "SETUP_LOOP usage" &gt;&amp;2</div><div class='add'>+    return 1;</div><div class='add'>+  fi</div><div class='add'>+</div><div class='add'>+  backend=$1</div><div class='add'>+</div><div class='add'>+  case ${OSTYPE} in</div><div class='add'>+  Linux)</div><div class='add'>+    losetup --find --show ${backend}</div><div class='add'>+    ;;</div><div class='add'>+  NetBSD)</div><div class='add'>+    vnd=`vnconfig -l|awk -F: '/not in use/{print $1; exit}'`</div><div class='add'>+    if [ "x${vnd}" = "x" ] ; then</div><div class='add'>+      echo "no more vnd" &gt;&amp;2</div><div class='add'>+      return 1;</div><div class='add'>+    fi</div><div class='add'>+    vnconfig ${vnd} ${backend}</div><div class='add'>+    echo ${vnd}</div><div class='add'>+    ;;</div><div class='add'>+  *)</div><div class='add'>+    echo "Please define SETUP_LOOP for ${OSTYPE} in include.rc" &gt;&amp;2</div><div class='add'>+    return 1;</div><div class='add'>+    ;;</div><div class='add'>+  esac</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function MKFS_LOOP ()</div><div class='add'>+{</div><div class='add'>+  args=`getopt i: $*`</div><div class='add'>+  if [ $? -ne 0 ] ; then</div><div class='add'>+    echo "MKFS_LOOP usage" &gt;&amp;2</div><div class='add'>+    return 1;</div><div class='add'>+  fi</div><div class='add'>+  set -- ${args}</div><div class='add'>+</div><div class='add'>+  isize=""</div><div class='add'>+  while test $# -gt 0; do</div><div class='add'>+    case "$1" in</div><div class='add'>+    -i)         isize=$2; shift ;;</div><div class='add'>+    --)         shift; break ;;</div><div class='add'>+    esac</div><div class='add'>+    shift</div><div class='add'>+  done</div><div class='add'>+</div><div class='add'>+  dev=$1</div><div class='add'>+</div><div class='add'>+  case ${OSTYPE} in</div><div class='add'>+  Linux)</div><div class='add'>+    test "x${isize}" != "x" &amp;&amp; isize="-i size=${isize}"</div><div class='add'>+    mkfs.xfs  -f ${isize} ${dev}</div><div class='add'>+    ;;</div><div class='add'>+  NetBSD)</div><div class='add'>+    test "x${isize}" != "x" &amp;&amp; isize="-i ${isize}"</div><div class='add'>+</div><div class='add'>+    echo ${dev} | grep -q '^vnd'</div><div class='add'>+    if [ $? -ne 0 ] ; then</div><div class='add'>+      vnd=`vnconfig -l|awk -F: '/not in use/{print $1; exit}'`</div><div class='add'>+      if [ "x${vnd}" = "x" ] ; then</div><div class='add'>+        echo "no more vnd" &gt;&amp;2</div><div class='add'>+        return 1;</div><div class='add'>+      fi</div><div class='add'>+      vnconfig ${vnd} ${dev}</div><div class='add'>+    else</div><div class='add'>+      vnd=${dev}</div><div class='add'>+    fi</div><div class='add'>+    newfs ${isize} /dev/r${vnd}a</div><div class='add'>+    ;;</div><div class='add'>+  *)</div><div class='add'>+    echo "Please define MKFS_LOOP for ${OSTYPE} in include.rc" &gt;&amp;2</div><div class='add'>+    return 1;</div><div class='add'>+    ;;</div><div class='add'>+  esac</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+# usage: log_newer timestamp "string"</div><div class='add'>+# search in glusterfs logs for "string" logged after timestamp seconds</div><div class='add'>+# since the Epoch (usually obtained by date +%s)</div><div class='add'>+log_newer()</div><div class='add'>+{</div><div class='add'>+        ts=$1</div><div class='add'>+        msg=$2</div><div class='add'>+        logdir=`$CLI --print-logdir`</div><div class='add'>+</div><div class='add'>+        local x_ifs=$IFS</div><div class='add'>+        IFS="["</div><div class='add'>+        for date in `grep -hr "$msg" $logdir | grep -v "G_LOG" | awk -F '[\]]' '{print $1}'` ; do</div><div class='add'>+                if [ `date -d "$date" +%s` -gt $ts ] ; then</div><div class='add'>+                        IFS=$x_ifs</div><div class='add'>+                        return 0;</div><div class='add'>+                fi</div><div class='add'>+        done 2&gt;/dev/null</div><div class='add'>+        IFS=$x_ifs</div><div class='add'>+        return 1</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function MOUNT_LOOP ()</div><div class='add'>+{</div><div class='add'>+  if [ $# != 2 ] ; then</div><div class='add'>+    echo "MOUNT_LOOP usage" &gt;&amp;2</div><div class='add'>+    return 1;</div><div class='add'>+  fi</div><div class='add'>+</div><div class='add'>+  dev=$1</div><div class='add'>+  target=$2</div><div class='add'>+</div><div class='add'>+  case ${OSTYPE} in</div><div class='add'>+  Linux)</div><div class='add'>+    echo ${dev} | grep -q '^/dev/loop'</div><div class='add'>+    if [ $? -eq 0 ] ; then</div><div class='add'>+      mount -t xfs  ${dev} ${target}</div><div class='add'>+    else</div><div class='add'>+      mount -o loop  ${dev} ${target}</div><div class='add'>+    fi</div><div class='add'>+    ;;</div><div class='add'>+  NetBSD)</div><div class='add'>+    echo ${dev} | grep -q '^vnd'</div><div class='add'>+    if [ $? -ne 0 ] ; then</div><div class='add'>+      ino=`/usr/bin/stat -f %i ${dev}`</div><div class='add'>+      dev=`vnconfig -l | awk -v ino=${ino} -F'[: ]*' '($5 == ino) {print $1}'`</div><div class='add'>+    fi</div><div class='add'>+</div><div class='add'>+    mount /dev/${dev}a ${target} &gt;&amp;2</div><div class='add'>+    if [ $? -ne 0 ] ; then</div><div class='add'>+      echo "failed to mount  /dev/${dev}a on  ${target}" &gt;&amp;2</div><div class='add'>+      return 1;</div><div class='add'>+    fi</div><div class='add'>+</div><div class='add'>+    mkdir -p ${target}/.attribute/system  ${target}/.attribute/user</div><div class='add'>+    mount -u -o extattr ${target} &gt;&amp;2</div><div class='add'>+</div><div class='add'>+    ;;</div><div class='add'>+  *)</div><div class='add'>+    echo "Please define MOUNT_LOOP for ${OSTYPE} in include.rc" &gt;&amp;2</div><div class='add'>+    return 1;</div><div class='add'>+    ;;</div><div class='add'>+  esac</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function UMOUNT_LOOP ()</div><div class='add'>+{</div><div class='add'>+  case ${OSTYPE} in</div><div class='add'>+  Linux)</div><div class='add'>+    force_umount $*</div><div class='add'>+    ;;</div><div class='add'>+  NetBSD)</div><div class='add'>+    for target in $* ; do</div><div class='add'>+      dev=`mount | awk -v target=${target} '($3 == target) {print $1}'`</div><div class='add'>+      force_umount ${target}</div><div class='add'>+      echo ${dev} | grep -q '^/dev/vnd'</div><div class='add'>+      if [ $? -eq 0 ] ; then</div><div class='add'>+        dev=`echo ${dev} | sed 's|^/dev/||; s|a$||'`</div><div class='add'>+        vnconfig -u ${dev}</div><div class='add'>+      else</div><div class='add'>+        ino=`/usr/bin/stat -f %i ${dev}`</div><div class='add'>+        dev=`vnconfig -l | awk -v ino=${ino} -F'[: ]*' '($5 == ino) {print $1}'`</div><div class='add'>+        if [ "x${dev}" != "x" ] ; then</div><div class='add'>+          vnconfig -u ${dev}</div><div class='add'>+        fi</div><div class='add'>+      fi</div><div class='add'>+    done</div><div class='add'>+    ;;</div><div class='add'>+  *)</div><div class='add'>+    echo "Please define UMOUNT_LOOP for ${OSTYPE} in include.rc" &gt;&amp;2</div><div class='add'>+    return 1;</div><div class='add'>+    ;;</div><div class='add'>+  esac</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function SETUP_LOOP ()</div><div class='add'>+{</div><div class='add'>+  if [ $# != 1 ] ; then</div><div class='add'>+    echo "SETUP_LOOP usage" &gt;&amp;2</div><div class='add'>+    return 1;</div><div class='add'>+  fi</div><div class='add'>+</div><div class='add'>+  backend=$1</div><div class='add'>+</div><div class='add'>+  case ${OSTYPE} in</div><div class='add'>+  Linux)</div><div class='add'>+    losetup --find --show ${backend}</div><div class='add'>+    ;;</div><div class='add'>+  NetBSD)</div><div class='add'>+    vnd=`vnconfig -l|awk -F: '/not in use/{print $1; exit}'`</div><div class='add'>+    if [ "x${vnd}" = "x" ] ; then</div><div class='add'>+      echo "no more vnd" &gt;&amp;2</div><div class='add'>+      return 1;</div><div class='add'>+    fi</div><div class='add'>+    vnconfig ${vnd} ${backend}</div><div class='add'>+    echo ${vnd}</div><div class='add'>+    ;;</div><div class='add'>+  *)</div><div class='add'>+    echo "Please define SETUP_LOOP for ${OSTYPE} in include.rc" &gt;&amp;2</div><div class='add'>+    return 1;</div><div class='add'>+    ;;</div><div class='add'>+  esac</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function MKFS_LOOP ()</div><div class='add'>+{</div><div class='add'>+  args=`getopt i: $*`</div><div class='add'>+  if [ $? -ne 0 ] ; then</div><div class='add'>+    echo "MKFS_LOOP usage" &gt;&amp;2</div><div class='add'>+    return 1;</div><div class='add'>+  fi</div><div class='add'>+  set -- ${args}</div><div class='add'>+</div><div class='add'>+  isize=""</div><div class='add'>+  while test $# -gt 0; do</div><div class='add'>+    case "$1" in</div><div class='add'>+    -i)         isize=$2; shift ;;</div><div class='add'>+    --)         shift; break ;;</div><div class='add'>+    esac</div><div class='add'>+    shift</div><div class='add'>+  done</div><div class='add'>+</div><div class='add'>+  dev=$1</div><div class='add'>+</div><div class='add'>+  case ${OSTYPE} in</div><div class='add'>+  Linux)</div><div class='add'>+    test "x${isize}" != "x" &amp;&amp; isize="-i size=${isize}"</div><div class='add'>+    mkfs.xfs  -f ${isize} ${dev}</div><div class='add'>+    ;;</div><div class='add'>+  NetBSD)</div><div class='add'>+    test "x${isize}" != "x" &amp;&amp; isize="-i ${isize}"</div><div class='add'>+</div><div class='add'>+    echo ${dev} | grep -q '^vnd'</div><div class='add'>+    if [ $? -ne 0 ] ; then</div><div class='add'>+      vnd=`vnconfig -l|awk -F: '/not in use/{print $1; exit}'`</div><div class='add'>+      if [ "x${vnd}" = "x" ] ; then</div><div class='add'>+        echo "no more vnd" &gt;&amp;2</div><div class='add'>+        return 1;</div><div class='add'>+      fi</div><div class='add'>+      vnconfig ${vnd} ${dev}</div><div class='add'>+    else</div><div class='add'>+      vnd=${dev}</div><div class='add'>+    fi</div><div class='add'>+    newfs ${isize} /dev/r${vnd}a</div><div class='add'>+    ;;</div><div class='add'>+  *)</div><div class='add'>+    echo "Please define MKFS_LOOP for ${OSTYPE} in include.rc" &gt;&amp;2</div><div class='add'>+    return 1;</div><div class='add'>+    ;;</div><div class='add'>+  esac</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function MOUNT_LOOP ()</div><div class='add'>+{</div><div class='add'>+  if [ $# != 2 ] ; then</div><div class='add'>+    echo "MOUNT_LOOP usage" &gt;&amp;2</div><div class='add'>+    return 1;</div><div class='add'>+  fi</div><div class='add'>+</div><div class='add'>+  dev=$1</div><div class='add'>+  target=$2</div><div class='add'>+</div><div class='add'>+  case ${OSTYPE} in</div><div class='add'>+  Linux)</div><div class='add'>+    echo ${dev} | grep -q '^/dev/loop'</div><div class='add'>+    if [ $? -eq 0 ] ; then</div><div class='add'>+      mount -t xfs  ${dev} ${target}</div><div class='add'>+    else</div><div class='add'>+      mount -o loop  ${dev} ${target}</div><div class='add'>+    fi</div><div class='add'>+    ;;</div><div class='add'>+  NetBSD)</div><div class='add'>+    echo ${dev} | grep -q '^vnd'</div><div class='add'>+    if [ $? -ne 0 ] ; then</div><div class='add'>+      ino=`/usr/bin/stat -f %i ${dev}`</div><div class='add'>+      dev=`vnconfig -l | awk -v ino=${ino} -F'[: ]*' '($5 == ino) {print $1}'`</div><div class='add'>+    fi</div><div class='add'>+</div><div class='add'>+    mount /dev/${dev}a ${target} &gt;&amp;2</div><div class='add'>+    if [ $? -ne 0 ] ; then</div><div class='add'>+      echo "failed to mount  /dev/${dev}a on  ${target}" &gt;&amp;2</div><div class='add'>+      return 1;</div><div class='add'>+    fi</div><div class='add'>+</div><div class='add'>+    mkdir -p ${target}/.attribute/system  ${target}/.attribute/user</div><div class='add'>+    mount -u -o extattr ${target} &gt;&amp;2</div><div class='add'>+</div><div class='add'>+    ;;</div><div class='add'>+  *)</div><div class='add'>+    echo "Please define MOUNT_LOOP for ${OSTYPE} in include.rc" &gt;&amp;2</div><div class='add'>+    return 1;</div><div class='add'>+    ;;</div><div class='add'>+  esac</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function UMOUNT_LOOP ()</div><div class='add'>+{</div><div class='add'>+  case ${OSTYPE} in</div><div class='add'>+  Linux)</div><div class='add'>+    force_umount $*</div><div class='add'>+    ;;</div><div class='add'>+  NetBSD)</div><div class='add'>+    for target in $* ; do</div><div class='add'>+      dev=`mount | awk -v target=${target} '($3 == target) {print $1}'`</div><div class='add'>+      force_umount ${target}</div><div class='add'>+      echo ${dev} | grep -q '^/dev/vnd'</div><div class='add'>+      if [ $? -eq 0 ] ; then</div><div class='add'>+        dev=`echo ${dev} | sed 's|^/dev/||; s|a$||'`</div><div class='add'>+        vnconfig -u ${dev}</div><div class='add'>+      else</div><div class='add'>+        ino=`/usr/bin/stat -f %i ${dev}`</div><div class='add'>+        dev=`vnconfig -l | awk -v ino=${ino} -F'[: ]*' '($5 == ino) {print $1}'`</div><div class='add'>+        if [ "x${dev}" != "x" ] ; then</div><div class='add'>+          vnconfig -u ${dev}</div><div class='add'>+        fi</div><div class='add'>+      fi</div><div class='add'>+    done</div><div class='add'>+    ;;</div><div class='add'>+  *)</div><div class='add'>+    echo "Please define UMOUNT_LOOP for ${OSTYPE} in include.rc" &gt;&amp;2</div><div class='add'>+    return 1;</div><div class='add'>+    ;;</div><div class='add'>+  esac</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function STAT()</div><div class='add'>+{</div><div class='add'>+        stat $1</div><div class='add'>+        echo $?</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function STAT_INO()</div><div class='add'>+{</div><div class='add'>+        local ino=$(stat -c '%i' $1)</div><div class='add'>+        if [ $? -eq 0 ]; then</div><div class='add'>+                echo $ino</div><div class='add'>+        else</div><div class='add'>+                echo 0</div><div class='add'>+        fi</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function get_md5_sum()</div><div class='add'>+{</div><div class='add'>+    local file=$1;</div><div class='add'>+    md5_sum=$(md5sum $file | awk '{print $1}');</div><div class='add'>+    echo $md5_sum</div><div class='add'>+}</div><div class='head'>diff --git a/tests/line-coverage/afr-heal-info.t b/tests/line-coverage/afr-heal-info.t<br/>new file mode 100644<br/>index 00000000000..182665917c4<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/line-coverage/afr-heal-info.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/line-coverage/afr-heal-info.t</a></div><div class='hunk'>@@ -0,0 +1,43 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+#Test that parallel heal-info command execution doesn't result in spurious</div><div class='add'>+#entries with locking-scheme granular</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../include.rc</div><div class='add'>+. $(dirname $0)/../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+function write_and_del_file {</div><div class='add'>+        dd of=$M0/a.txt if=/dev/zero bs=1024k count=100</div><div class='add'>+        rm -f $M0/b.txt</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume create $V0 replica 2 $H0:$B0/brick{0,1}</div><div class='add'>+TEST $CLI volume set $V0 locking-scheme granular</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+TEST $GFS --volfile-id=$V0 --volfile-server=$H0 $M0;</div><div class='add'>+TEST touch $M0/a.txt $M0/b.txt</div><div class='add'>+write_and_del_file &amp;</div><div class='add'>+touch $B0/f1 $B0/f2</div><div class='add'>+</div><div class='add'>+# All above is similar to basic/afr/heal-info.t</div><div class='add'>+</div><div class='add'>+TEST $CLI volume heal $V0 enable</div><div class='add'>+TEST $CLI volume heal $V0 info --xml</div><div class='add'>+TEST $CLI volume heal $V0 info summary</div><div class='add'>+TEST $CLI volume heal $V0 info summary --xml</div><div class='add'>+TEST $CLI volume heal $V0 info split-brain</div><div class='add'>+TEST $CLI volume heal $V0 info split-brain --xml</div><div class='add'>+</div><div class='add'>+TEST $CLI volume heal $V0 statistics heal-count</div><div class='add'>+</div><div class='add'>+# It may fail as the file is not in splitbrain</div><div class='add'>+$CLI volume heal $V0 split-brain latest-mtime /a.txt</div><div class='add'>+</div><div class='add'>+TEST $CLI volume heal $V0 disable</div><div class='add'>+</div><div class='add'>+TEST $CLI volume stop $V0</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/line-coverage/arbiter-coverage.t b/tests/line-coverage/arbiter-coverage.t<br/>new file mode 100755<br/>index 00000000000..82b470141b5<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/line-coverage/arbiter-coverage.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/line-coverage/arbiter-coverage.t</a></div><div class='hunk'>@@ -0,0 +1,32 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../include.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+## Start and create a volume</div><div class='add'>+TEST glusterd;</div><div class='add'>+TEST pidof glusterd;</div><div class='add'>+TEST $CLI volume info;</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 replica 2 arbiter 1 $H0:$B0/${V0}{1,2,3,4,5,6};</div><div class='add'>+</div><div class='add'>+## Start volume and verify</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+</div><div class='add'>+TEST $GFS -s $H0 --volfile-id $V0 $M1;</div><div class='add'>+</div><div class='add'>+cp $(dirname ${0})/../basic/gfapi/glfsxmp-coverage.c glfsxmp.c</div><div class='add'>+build_tester ./glfsxmp.c -lgfapi</div><div class='add'>+$(dirname $0)/../basic/rpc-coverage.sh $M1 &gt;/dev/null</div><div class='add'>+./glfsxmp $V0 $H0 &gt;/dev/null</div><div class='add'>+</div><div class='add'>+TEST cleanup_tester ./glfsxmp</div><div class='add'>+TEST rm ./glfsxmp.c</div><div class='add'>+</div><div class='add'>+## Finish up</div><div class='add'>+TEST $CLI volume stop $V0;</div><div class='add'>+</div><div class='add'>+TEST $CLI volume delete $V0;</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/line-coverage/cli-peer-and-volume-operations.t b/tests/line-coverage/cli-peer-and-volume-operations.t<br/>new file mode 100644<br/>index 00000000000..0cf8dbe81f9<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/line-coverage/cli-peer-and-volume-operations.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/line-coverage/cli-peer-and-volume-operations.t</a></div><div class='hunk'>@@ -0,0 +1,135 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../include.rc</div><div class='add'>+. $(dirname $0)/../cluster.rc</div><div class='add'>+. $(dirname $0)/../volume.rc</div><div class='add'>+</div><div class='add'>+function peer_count {</div><div class='add'>+eval \$CLI_$1 peer status | grep 'Peer in Cluster (Connected)' | wc -l</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='add'>+</div><div class='add'>+TEST launch_cluster 3</div><div class='add'>+</div><div class='add'>+TEST $CLI_1 system uuid reset</div><div class='add'>+</div><div class='add'>+## basic peer commands</div><div class='add'>+TEST $CLI_1 peer probe $H2</div><div class='add'>+EXPECT_WITHIN $PROBE_TIMEOUT 1 peer_count 1</div><div class='add'>+EXPECT_WITHIN $PROBE_TIMEOUT 1 peer_count 2</div><div class='add'>+</div><div class='add'>+#probe a unreachable node</div><div class='add'>+TEST kill_glusterd 3</div><div class='add'>+TEST ! $CLI_1 peer probe $H3</div><div class='add'>+</div><div class='add'>+#detach a node which is not a part of cluster</div><div class='add'>+TEST ! $CLI_1 peer detach $H3</div><div class='add'>+TEST ! $CLI_1 peer detach $H3 force</div><div class='add'>+</div><div class='add'>+TEST start_glusterd 3</div><div class='add'>+TEST $CLI_1 peer probe $H3</div><div class='add'>+EXPECT_WITHIN $PROBE_TIMEOUT 2 peer_count 1</div><div class='add'>+EXPECT_WITHIN $PROBE_TIMEOUT 2 peer_count 2</div><div class='add'>+EXPECT_WITHIN $PROBE_TIMEOUT 2 peer_count 3</div><div class='add'>+</div><div class='add'>+# probe a node which is already part of cluster</div><div class='add'>+TEST $CLI_1 peer probe $H3</div><div class='add'>+</div><div class='add'>+#probe an invalid address</div><div class='add'>+TEST ! $CLI_1 peer probe 1024.1024.1024.1024</div><div class='add'>+</div><div class='add'>+TEST $CLI_1 pool list</div><div class='add'>+</div><div class='add'>+TEST $CLI_1 --help</div><div class='add'>+TEST $CLI_1 --version</div><div class='add'>+TEST $CLI_1 --print-logdir</div><div class='add'>+TEST $CLI_1 --print-statedumpdir</div><div class='add'>+</div><div class='add'>+# try unrecognised command</div><div class='add'>+TEST ! $CLI_1 volume</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+</div><div class='add'>+## all help commands</div><div class='add'>+TEST $CLI_1 global help</div><div class='add'>+TEST $CLI_1 help</div><div class='add'>+</div><div class='add'>+TEST $CLI_1 peer help</div><div class='add'>+TEST $CLI_1 volume help</div><div class='add'>+TEST $CLI_1 volume bitrot help</div><div class='add'>+TEST $CLI_1 volume quota help</div><div class='add'>+TEST $CLI_1 snapshot help</div><div class='add'>+</div><div class='add'>+## volume operations</div><div class='add'>+TEST $CLI_1 volume create $V0 $H1:$B1/$V0 $H2:$B2/$V0 $H3:$B3/$V0</div><div class='add'>+# create a volume with already existing volume name</div><div class='add'>+TEST ! $CLI_1 volume create $V0 $H1:$B1/$V1 $H2:$B2/$V1</div><div class='add'>+TEST $CLI_1 volume start $V0</div><div class='add'>+EXPECT 'Started' cluster_volinfo_field 1 $V0 'Status';</div><div class='add'>+</div><div class='add'>+# Mount the volume and create files</div><div class='add'>+TEST glusterfs -s $H1 --volfile-id $V0 $M1</div><div class='add'>+TEST touch $M1/file{1..100}</div><div class='add'>+</div><div class='add'>+#fails because $V0 is not shd compatible</div><div class='add'>+TEST ! $CLI_1 volume status $V0 shd</div><div class='add'>+</div><div class='add'>+#test explicitly provided options</div><div class='add'>+TEST $CLI_1 --timeout=120 --log-level=INFO volume status</div><div class='add'>+</div><div class='add'>+#changing timezone to a different one, to check localtime logging feature</div><div class='add'>+TEST export TZ='Asia/Kolkata'</div><div class='add'>+TEST restart_glusterd 1</div><div class='add'>+</div><div class='add'>+#localtime logging enable</div><div class='add'>+TEST $CLI_1 volume set all cluster.localtime-logging enable</div><div class='add'>+EXPECT '1' logging_time_check $LOGDIR</div><div class='add'>+</div><div class='add'>+#localtime logging disable</div><div class='add'>+TEST $CLI_1 volume set all cluster.localtime-logging disable</div><div class='add'>+EXPECT '0' logging_time_check $LOGDIR</div><div class='add'>+</div><div class='add'>+#changing timezone back to original timezone</div><div class='add'>+TEST export TZ='UTC'</div><div class='add'>+</div><div class='add'>+#negative tests for volume options</div><div class='add'>+#'set' option to enable quota/inode-quota is now depreciated</div><div class='add'>+TEST ! $CLI_1 volume set $V0 quota enable</div><div class='add'>+TEST ! $CLI_1 volume set $V0 inode-quota enable</div><div class='add'>+</div><div class='add'>+#invalid transport type 'rcp'</div><div class='add'>+TEST ! $CLI_1 volume set $V0 config.transport rcp</div><div class='add'>+</div><div class='add'>+#'op-version' option is not valid for a single volume</div><div class='add'>+TEST ! $CLI_1 volume set $V0 cluster.op-version 72000</div><div class='add'>+</div><div class='add'>+#'op-version' option can't be used with any other option</div><div class='add'>+TEST ! $CLI_1 volume set all cluster.localtime-logging disable cluster.op-version 72000</div><div class='add'>+</div><div class='add'>+#invalid format of 'op-version'</div><div class='add'>+TEST ! $CLI_1 volume set all cluster.op-version 72-000</div><div class='add'>+</div><div class='add'>+#provided 'op-version' value is greater than max allowed op-version</div><div class='add'>+op_version=$($CLI_1 volume get all cluster.max-op-version | awk 'NR==3 {print$2}')</div><div class='add'>+op_version=$((op_version+1000))  #this can be any number greater than 0</div><div class='add'>+TEST ! $CLI_1 volume set all cluster.op-version $op_version</div><div class='add'>+</div><div class='add'>+#provided 'op-verison' value cannot be less than the current cluster op-version value</div><div class='add'>+TEST ! $CLI_1 volume set all cluster.op-version 00000</div><div class='add'>+</div><div class='add'>+# system commnds</div><div class='add'>+TEST $CLI_1 system help</div><div class='add'>+TEST $CLI_1 system uuid get</div><div class='add'>+TEST $CLI_1 system getspec $V0</div><div class='add'>+TEST $CLI_1 system getwd</div><div class='add'>+TEST $CLI_1 system fsm log</div><div class='add'>+</div><div class='add'>+# Both these may fail, but it covers xdr functions and some</div><div class='add'>+# more code in cli/glusterd</div><div class='add'>+$CLI_1 system:: mount test local:/$V0</div><div class='add'>+$CLI_1 system:: umount $M0 lazy</div><div class='add'>+$CLI_1 system:: copy file options</div><div class='add'>+$CLI_1 system:: portmap brick2port $H0:$B0/brick</div><div class='add'>+$CLI_1 system:: uuid reset</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/line-coverage/cli-volume-top-profile-coverage.t b/tests/line-coverage/cli-volume-top-profile-coverage.t<br/>new file mode 100644<br/>index 00000000000..35713c26faa<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/line-coverage/cli-volume-top-profile-coverage.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/line-coverage/cli-volume-top-profile-coverage.t</a></div><div class='hunk'>@@ -0,0 +1,62 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../include.rc</div><div class='add'>+. $(dirname $0)/../cluster.rc</div><div class='add'>+. $(dirname $0)/../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='add'>+</div><div class='add'>+# Creating cluster</div><div class='add'>+TEST launch_cluster 3</div><div class='add'>+</div><div class='add'>+# Probing peers</div><div class='add'>+TEST $CLI_1 peer probe $H2</div><div class='add'>+TEST $CLI_1 peer probe $H3</div><div class='add'>+EXPECT_WITHIN $PROBE_TIMEOUT 2 peer_count 3</div><div class='add'>+</div><div class='add'>+# Creating a volume and starting it.</div><div class='add'>+TEST $CLI_1 volume create $V0 replica 3 $H1:$B1/$V0 $H2:$B2/$V0 $H3:$B3/$V0</div><div class='add'>+TEST $CLI_1 volume start $V0</div><div class='add'>+EXPECT 'Started' cluster_volinfo_field 1 $V0 'Status';</div><div class='add'>+</div><div class='add'>+TEST glusterfs -s $H1 --volfile-id $V0 $M1</div><div class='add'>+TEST touch $M1/file{1..100}</div><div class='add'>+</div><div class='add'>+# Testing volume top command with and without xml output</div><div class='add'>+function test_volume_top_cmds () {</div><div class='add'>+    local ret=0</div><div class='add'>+    declare -a top_cmds=("read" "open" "write" "opendir" "readdir")</div><div class='add'>+    for cmd in ${top_cmds[@]}; do</div><div class='add'>+        $CLI_1 volume top $V0 $cmd</div><div class='add'>+        (( ret += $? ))</div><div class='add'>+        $CLI_1 volume top $V0 clear</div><div class='add'>+        (( ret += $? ))</div><div class='add'>+        $CLI_1 volume top $V0 $cmd --xml</div><div class='add'>+        (( ret += $? ))</div><div class='add'>+        $CLI_1 volume top $V0 $cmd brick $H1:$B1/$V0</div><div class='add'>+        (( ret += $? ))</div><div class='add'>+        $CLI_1 volume top $V0 clear brick $H1:$B1/$V0</div><div class='add'>+        (( ret += $? ))</div><div class='add'>+        $CLI_1 volume top $V0 $cmd brick $H1:$B1/$V0 --xml</div><div class='add'>+        (( ret += $? ))</div><div class='add'>+    done</div><div class='add'>+    return $ret</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+# Testing volume profile command with and without xml</div><div class='add'>+function test_volume_profile_cmds () {</div><div class='add'>+    local ret=0</div><div class='add'>+    declare -a profile_cmds=("start" "info" "info peek" "info cumulative" "info clear" "info incremental peek" "stop")</div><div class='add'>+    for cmd in "${profile_cmds[@]}"; do</div><div class='add'>+        $CLI_1 volume profile $V0 $cmd</div><div class='add'>+        (( ret += $? ))</div><div class='add'>+        $CLI_1 volume profile $V0 $cmd --xml</div><div class='add'>+        (( ret += $? ))</div><div class='add'>+    done</div><div class='add'>+    return $ret</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+TEST test_volume_top_cmds;</div><div class='add'>+TEST test_volume_profile_cmds;</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/line-coverage/errorgen-coverage.t b/tests/line-coverage/errorgen-coverage.t<br/>new file mode 100755<br/>index 00000000000..f4622428d79<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/line-coverage/errorgen-coverage.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/line-coverage/errorgen-coverage.t</a></div><div class='hunk'>@@ -0,0 +1,42 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../include.rc</div><div class='add'>+</div><div class='add'>+# Because I have added 10 iterations of rpc-coverage and glfsxmp for errorgen</div><div class='add'>+SCRIPT_TIMEOUT=600</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+## Start and create a volume</div><div class='add'>+TEST glusterd;</div><div class='add'>+TEST pidof glusterd;</div><div class='add'>+TEST $CLI volume info;</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 replica 3 $H0:$B0/${V0}{1,2,3,4,5,6};</div><div class='add'>+</div><div class='add'>+TEST $CLI volume set $V0 error-gen posix;</div><div class='add'>+TEST $CLI volume set $V0 debug.error-failure 3%;</div><div class='add'>+</div><div class='add'>+## Start volume and verify</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+</div><div class='add'>+TEST $GFS -s $H0 --volfile-id $V0 $M1;</div><div class='add'>+</div><div class='add'>+cp $(dirname ${0})/../basic/gfapi/glfsxmp-coverage.c glfsxmp.c</div><div class='add'>+build_tester ./glfsxmp.c -lgfapi</div><div class='add'>+for i in $(seq 1 10); do</div><div class='add'>+    # as there is error-gen, there can be errors, so no</div><div class='add'>+    # need to test for success of below two commands</div><div class='add'>+    $(dirname $0)/../basic/rpc-coverage.sh $M1 &gt;/dev/null</div><div class='add'>+    ./glfsxmp $V0 $H0 &gt;/dev/null</div><div class='add'>+done</div><div class='add'>+</div><div class='add'>+TEST cleanup_tester ./glfsxmp</div><div class='add'>+TEST rm ./glfsxmp.c</div><div class='add'>+</div><div class='add'>+## Finish up</div><div class='add'>+TEST $CLI volume stop $V0;</div><div class='add'>+</div><div class='add'>+TEST $CLI volume delete $V0;</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/line-coverage/log-and-brick-ops-negative-case.t b/tests/line-coverage/log-and-brick-ops-negative-case.t<br/>new file mode 100644<br/>index 00000000000..d86cb452282<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/line-coverage/log-and-brick-ops-negative-case.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/line-coverage/log-and-brick-ops-negative-case.t</a></div><div class='hunk'>@@ -0,0 +1,82 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../include.rc</div><div class='add'>+. $(dirname $0)/../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+</div><div class='add'>+#create volumes</div><div class='add'>+TEST $CLI volume create ${V0}_1 $H0:$B0/v{1..2}</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create ${V0}_2 replica 3 arbiter 1 $H0:$B0/v{3..5}</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create ${V0}_3 disperse 3 redundancy 1 $H0:$B0/v{6..8}</div><div class='add'>+TEST $CLI volume start ${V0}_3</div><div class='add'>+EXPECT 'Started' volinfo_field ${V0}_3 'Status'</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create ${V0}_4 replica 3 $H0:$B0/v{9..14}</div><div class='add'>+TEST $CLI volume start ${V0}_4</div><div class='add'>+EXPECT 'Started' volinfo_field ${V0}_4 'Status'</div><div class='add'>+</div><div class='add'>+#log rotate option</div><div class='add'>+#provided volume does not exist</div><div class='add'>+TEST ! $CLI volume log ${V0}_5 rotate</div><div class='add'>+</div><div class='add'>+#volume must be started before using log rotate option</div><div class='add'>+TEST ! $CLI volume log ${V0}_1 rotate</div><div class='add'>+TEST $CLI volume start ${V0}_1</div><div class='add'>+EXPECT 'Started' volinfo_field ${V0}_1 'Status'</div><div class='add'>+</div><div class='add'>+#incorrect brick provided for the volume</div><div class='add'>+TEST ! $CLI volume log ${V0}_1 rotate $H0:$B0/v15</div><div class='add'>+</div><div class='add'>+#add-brick operations</div><div class='add'>+#volume must be in started to state to increase replica count</div><div class='add'>+TEST ! $CLI volume add-brick ${V0}_2 replica 4 $H0:$B0/v15</div><div class='add'>+TEST $CLI volume start ${V0}_2</div><div class='add'>+EXPECT 'Started' volinfo_field ${V0}_2 'Status'</div><div class='add'>+</div><div class='add'>+#incorrect number of bricks for a replica 4 volume</div><div class='add'>+TEST ! $CLI volume add-brick ${V0}_1 replica 4 $H0:$B0/v15</div><div class='add'>+</div><div class='add'>+#replica count provided is less than the current replica count</div><div class='add'>+TEST ! $CLI volume add-brick ${V0}_2 replica 2 $H0:$B0/v15</div><div class='add'>+</div><div class='add'>+#dispersed to replicated dispersed not possible</div><div class='add'>+TEST ! $CLI volume add-brick ${V0}_3 replica 2 $H0:$B0/v15</div><div class='add'>+</div><div class='add'>+#remove-brick operations</div><div class='add'>+#replica count option provided for dispersed vol</div><div class='add'>+TEST ! $CLI volume remove-brick ${V0}_3 replica 2 $H0:$B0/v8 start</div><div class='add'>+</div><div class='add'>+#given replica count is greater than the current replica count</div><div class='add'>+TEST ! $CLI volume remove-brick ${V0}_2 replica 4 $H0:$B0/v5 start</div><div class='add'>+</div><div class='add'>+#number of bricks to be removed, must be a multiple of replica count</div><div class='add'>+TEST ! $CLI volume remove-brick ${V0}_2 replica 3 $H0:$B0/v{3..4} start</div><div class='add'>+</div><div class='add'>+#less number of bricks given to reduce the replica count</div><div class='add'>+TEST ! $CLI volume remove-brick ${V0}_2 replica 1 $H0:$B0/v3 start</div><div class='add'>+</div><div class='add'>+#bricks should be from different subvol</div><div class='add'>+TEST ! $CLI volume remove-brick ${V0}_4 replica 2 $H0:$B0/v{13..14} start</div><div class='add'>+</div><div class='add'>+#arbiter must be removed to reduce replica count</div><div class='add'>+TEST ! $CLI volume remove-brick ${V0}_2 replica 1 $H0:$B0/v{3..4} start</div><div class='add'>+</div><div class='add'>+#removal of bricks is not allowed without reducing the replica count explicitly</div><div class='add'>+TEST ! $CLI volume remove-brick ${V0}_2 replica 3 $H0:$B0/v{3..5} start</div><div class='add'>+</div><div class='add'>+#incorrect brick for given vol</div><div class='add'>+TEST ! $CLI volume  remove-brick ${V0}_1 $H0:$B0/v15 start</div><div class='add'>+</div><div class='add'>+#removing all the bricks are not allowed</div><div class='add'>+TEST ! $CLI volume remove-brick ${V0}_1 $H0:$B0/v{1..2} start</div><div class='add'>+</div><div class='add'>+#volume must not be stopped state while removing bricks</div><div class='add'>+TEST $CLI volume stop ${V0}_1</div><div class='add'>+TEST ! $CLI volume remove-brick ${V0}_1 $H0:$B0/v1 start</div><div class='add'>+</div><div class='add'>+cleanup
\ No newline at end of file</div><div class='head'>diff --git a/tests/line-coverage/meta-max-coverage.t b/tests/line-coverage/meta-max-coverage.t<br/>new file mode 100755<br/>index 00000000000..1cc07610aa7<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/line-coverage/meta-max-coverage.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/line-coverage/meta-max-coverage.t</a></div><div class='hunk'>@@ -0,0 +1,33 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../include.rc</div><div class='add'>+. $(dirname $0)/../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume info;</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/${V0}</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+</div><div class='add'>+## Mount FUSE</div><div class='add'>+TEST $GFS -s $H0 --volfile-id $V0 $M1</div><div class='add'>+</div><div class='add'>+TEST stat $M1/.meta/</div><div class='add'>+</div><div class='add'>+# expect failures in rpc-coverage.sh execution.</div><div class='add'>+res=$($(dirname $0)/../basic/rpc-coverage.sh $M1/.meta)</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+# Expect errors here, hence no need to 'check for success'</div><div class='add'>+for file in $(find $M1/.meta type f -print); do</div><div class='add'>+    cat $file &gt;/dev/null</div><div class='add'>+    echo 1&gt;$file</div><div class='add'>+    echo hello&gt;$file</div><div class='add'>+done</div><div class='add'>+</div><div class='add'>+TEST umount $M1</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/line-coverage/namespace-linecoverage.t b/tests/line-coverage/namespace-linecoverage.t<br/>new file mode 100644<br/>index 00000000000..8de6a0f279b<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/line-coverage/namespace-linecoverage.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/line-coverage/namespace-linecoverage.t</a></div><div class='hunk'>@@ -0,0 +1,39 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../include.rc</div><div class='add'>+. $(dirname $0)/../volume.rc</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST $CLI volume create $V0 replica 3 $H0:$B0/${V0}{0,1,2,3,4,5,6,7,8}</div><div class='add'>+TEST $CLI volume set $V0 performance.stat-prefetch off</div><div class='add'>+TEST $CLI volume set $V0 cluster.read-subvolume-index 0</div><div class='add'>+TEST $CLI volume set $V0 features.tag-namespaces on</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+TEST $CLI volume set $V0 storage.build-pgfid on</div><div class='add'>+</div><div class='add'>+sleep 2</div><div class='add'>+</div><div class='add'>+## Mount FUSE</div><div class='add'>+TEST $GFS -s $H0 --volfile-id $V0 $M1;</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+mkdir -p $M1/namespace</div><div class='add'>+</div><div class='add'>+# subvol_1 = bar, subvol_2 = foo, subvol_3 = hey</div><div class='add'>+# Test create, write (tagged by loc, fd respectively).</div><div class='add'>+touch $M1/namespace/{bar,foo,hey}</div><div class='add'>+</div><div class='add'>+open $M1/namespace/hey</div><div class='add'>+</div><div class='add'>+## TODO: best way to increase coverage is to have a gfapi program</div><div class='add'>+## which covers maximum fops</div><div class='add'>+TEST $(dirname $0)/../basic/rpc-coverage.sh $M1</div><div class='add'>+</div><div class='add'>+TEST cp $(dirname ${0})/../basic/gfapi/glfsxmp-coverage.c glfsxmp.c</div><div class='add'>+TEST build_tester ./glfsxmp.c -lgfapi</div><div class='add'>+TEST ./glfsxmp $V0 $H0</div><div class='add'>+TEST cleanup_tester ./glfsxmp</div><div class='add'>+TEST rm ./glfsxmp.c</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/line-coverage/old-protocol.t b/tests/line-coverage/old-protocol.t<br/>new file mode 100755<br/>index 00000000000..5676e5636db<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/line-coverage/old-protocol.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/line-coverage/old-protocol.t</a></div><div class='hunk'>@@ -0,0 +1,37 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../include.rc</div><div class='add'>+. $(dirname $0)/../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume info;</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 replica 3  $H0:$B0/${V0}{1,2,3,4,5,6};</div><div class='add'>+</div><div class='add'>+EXPECT "$V0" volinfo_field $V0 'Volume Name';</div><div class='add'>+EXPECT 'Created' volinfo_field $V0 'Status';</div><div class='add'>+EXPECT '6' brick_count $V0</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+EXPECT 'Started' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+file="/var/lib/glusterd/vols/$V0/trusted-$V0.tcp-fuse.vol"</div><div class='add'>+sed -i -e 's$send-gids true$send-gids true\n    option testing.old-protocol true$g' $file</div><div class='add'>+</div><div class='add'>+## Mount FUSE</div><div class='add'>+TEST $GFS -s $H0 --volfile-id $V0 $M1;</div><div class='add'>+</div><div class='add'>+## TODO: best way to increase coverage is to have a gfapi program</div><div class='add'>+## which covers maximum fops</div><div class='add'>+TEST $(dirname $0)/../basic/rpc-coverage.sh $M1</div><div class='add'>+</div><div class='add'>+TEST cp $(dirname ${0})/../basic/gfapi/glfsxmp-coverage.c glfsxmp.c</div><div class='add'>+TEST build_tester ./glfsxmp.c -lgfapi</div><div class='add'>+TEST ./glfsxmp $V0 $H0</div><div class='add'>+TEST cleanup_tester ./glfsxmp</div><div class='add'>+TEST rm ./glfsxmp.c</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/line-coverage/quiesce-coverage.t b/tests/line-coverage/quiesce-coverage.t<br/>new file mode 100755<br/>index 00000000000..ca29343451e<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/line-coverage/quiesce-coverage.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/line-coverage/quiesce-coverage.t</a></div><div class='hunk'>@@ -0,0 +1,44 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../include.rc</div><div class='add'>+. $(dirname $0)/../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume info;</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 replica 3  $H0:$B0/${V0}{1,2,3,4,5,6};</div><div class='add'>+</div><div class='add'>+EXPECT "$V0" volinfo_field $V0 'Volume Name';</div><div class='add'>+EXPECT 'Created' volinfo_field $V0 'Status';</div><div class='add'>+EXPECT '6' brick_count $V0</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+EXPECT 'Started' volinfo_field $V0 'Status';</div><div class='add'>+</div><div class='add'>+file="/var/lib/glusterd/vols/$V0/trusted-$V0.tcp-fuse.vol"</div><div class='add'>+</div><div class='add'>+cat &gt;&gt; ${file} &lt;&lt;EOF</div><div class='add'>+</div><div class='add'>+volume quiesce</div><div class='add'>+  type features/quiesce</div><div class='add'>+  subvolumes ${V0}</div><div class='add'>+end-volume</div><div class='add'>+EOF</div><div class='add'>+</div><div class='add'>+## Mount FUSE</div><div class='add'>+TEST $GFS -s $H0 --volfile-id $V0 $M1;</div><div class='add'>+</div><div class='add'>+## TODO: best way to increase coverage is to have a gfapi program</div><div class='add'>+## which covers maximum fops</div><div class='add'>+TEST $(dirname $0)/../basic/rpc-coverage.sh $M1</div><div class='add'>+</div><div class='add'>+TEST cp $(dirname ${0})/../basic/gfapi/glfsxmp-coverage.c glfsxmp.c</div><div class='add'>+TEST build_tester ./glfsxmp.c -lgfapi</div><div class='add'>+TEST ./glfsxmp $V0 $H0</div><div class='add'>+TEST cleanup_tester ./glfsxmp</div><div class='add'>+TEST rm ./glfsxmp.c</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/line-coverage/shard-coverage.t b/tests/line-coverage/shard-coverage.t<br/>new file mode 100644<br/>index 00000000000..1797999c146<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/line-coverage/shard-coverage.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/line-coverage/shard-coverage.t</a></div><div class='hunk'>@@ -0,0 +1,33 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../include.rc</div><div class='add'>+. $(dirname $0)/../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/brick</div><div class='add'>+TEST $CLI volume set $V0 features.shard on</div><div class='add'>+EXPECT 'Created' volinfo_field $V0 'Status'</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0</div><div class='add'>+EXPECT 'Started' volinfo_field $V0 'Status'</div><div class='add'>+</div><div class='add'>+# It is good to copy the file locally and build it, so the scope remains</div><div class='add'>+# inside tests directory.</div><div class='add'>+TEST cp $(dirname ${0})/../basic/gfapi/glfsxmp-coverage.c glfsxmp.c</div><div class='add'>+TEST build_tester ./glfsxmp.c -lgfapi</div><div class='add'>+TEST ./glfsxmp $V0 $H0</div><div class='add'>+TEST cleanup_tester ./glfsxmp</div><div class='add'>+TEST rm ./glfsxmp.c</div><div class='add'>+</div><div class='add'>+TEST $GFS -s $H0 --volfile-id $V0 $M1;</div><div class='add'>+</div><div class='add'>+TEST $(dirname $0)/../basic/rpc-coverage.sh $M1</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+TEST $CLI volume stop $V0</div><div class='add'>+TEST $CLI volume delete $V0</div><div class='add'>+</div><div class='add'>+cleanup</div><div class='head'>diff --git a/tests/line-coverage/some-features-in-libglusterfs.t b/tests/line-coverage/some-features-in-libglusterfs.t<br/>new file mode 100644<br/>index 00000000000..5719c4e039c<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/line-coverage/some-features-in-libglusterfs.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/line-coverage/some-features-in-libglusterfs.t</a></div><div class='hunk'>@@ -0,0 +1,67 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../include.rc</div><div class='add'>+. $(dirname $0)/../volume.rc</div><div class='add'>+</div><div class='add'>+function grep_string {</div><div class='add'>+    local f=$1</div><div class='add'>+    local string=$2</div><div class='add'>+    # The output of test script also shows up in log. Ignore them.</div><div class='add'>+    echo $(grep ${string} ${f} | grep -v "++++++" | wc -l)</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume info;</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/${V0}</div><div class='add'>+TEST $CLI volume set $V0 client-log-level TRACE</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+</div><div class='add'>+log_file="$(gluster --print-logdir)/gluster.log"</div><div class='add'>+## Mount FUSE</div><div class='add'>+TEST $GFS -s $H0 --log-file $log_file --volfile-id $V0 $M1</div><div class='add'>+</div><div class='add'>+## Cover 'monitoring.c' here</div><div class='add'>+pgrep 'glusterfs' | xargs kill -USR2</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN 2 1 grep_string $log_file 'sig:USR2'</div><div class='add'>+</div><div class='add'>+## Also cover statedump</div><div class='add'>+pgrep 'glusterfs' | xargs kill -USR1</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN 2 1 grep_string $log_file 'sig:USR1'</div><div class='add'>+</div><div class='add'>+## Also cover SIGHUP</div><div class='add'>+pgrep 'glusterfs' | xargs kill -HUP</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN 2 1 grep_string $log_file 'sig:HUP'</div><div class='add'>+</div><div class='add'>+## Also cover SIGTERM</div><div class='add'>+pgrep 'glusterfs' | xargs kill -TERM</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN 2 1 grep_string $log_file 'cleanup_and_exit'</div><div class='add'>+</div><div class='add'>+# Previous call should make umount of the process.</div><div class='add'>+# force_umount $M1</div><div class='add'>+</div><div class='add'>+# TODO: below section is commented out, mainly as our regression treats the test</div><div class='add'>+# as failure because sending ABRT signal will cause the process to dump core.</div><div class='add'>+# Our regression treats the test as failure, if there is a core.</div><div class='add'>+# FIXME: figure out a way to run this test, because this part of the code gets</div><div class='add'>+# executed only when there is coredump, and it is critical for debugging, to</div><div class='add'>+# keep it working always.</div><div class='add'>+</div><div class='add'>+# # Restart client</div><div class='add'>+# TEST $GFS -s $H0 --log-file $log_file --volfile-id $V0 $M1</div><div class='add'>+#</div><div class='add'>+# ## Also cover SIGABRT</div><div class='add'>+# pgrep 'glusterfs ' | xargs kill -ABRT</div><div class='add'>+#</div><div class='add'>+# TEST [ 1 -eq $(grep 'pending frames' $log_file | wc -l) ]</div><div class='add'>+</div><div class='add'>+TEST rm $log_file</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/line-coverage/volfile-with-all-graph-syntax.t b/tests/line-coverage/volfile-with-all-graph-syntax.t<br/>new file mode 100644<br/>index 00000000000..b137432cceb<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/line-coverage/volfile-with-all-graph-syntax.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/line-coverage/volfile-with-all-graph-syntax.t</a></div><div class='hunk'>@@ -0,0 +1,73 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../include.rc</div><div class='add'>+. $(dirname $0)/../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST mkdir -p $B0/test</div><div class='add'>+cat &gt; $B0/test.vol &lt;&lt;EOF</div><div class='add'>+volume test</div><div class='add'>+  type storage/posix</div><div class='add'>+  option directory $B0/test</div><div class='add'>+  option multiple-line-string "I am</div><div class='add'>+ testing a feature of volfile graph.l"</div><div class='add'>+  option single-line-string "this is running on $H0"</div><div class='add'>+  option option-with-back-tick `date +%Y%M%d`</div><div class='add'>+end-volume</div><div class='add'>+EOF</div><div class='add'>+</div><div class='add'>+# This should succeed, but it will have some unknown options, which is OK.</div><div class='add'>+TEST glusterfs -f $B0/test.vol $M0;</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0;</div><div class='add'>+</div><div class='add'>+# This should not succeed</div><div class='add'>+cat &gt; $B0/test.vol &lt;&lt;EOF</div><div class='add'>+volume test</div><div class='add'>+  type storage/posix</div><div class='add'>+EOF</div><div class='add'>+TEST ! glusterfs -f $B0/test.vol $M0;</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+# This should not succeed</div><div class='add'>+cat &gt; $B0/test.vol &lt;&lt;EOF</div><div class='add'>+  type storage/posix</div><div class='add'>+end-volume</div><div class='add'>+EOF</div><div class='add'>+TEST ! glusterfs -f $B0/test.vol $M0;</div><div class='add'>+</div><div class='add'>+# This should not succeed</div><div class='add'>+cat &gt; $B0/test.vol &lt;&lt;EOF</div><div class='add'>+volume test</div><div class='add'>+end-volume</div><div class='add'>+EOF</div><div class='add'>+TEST ! glusterfs -f $B0/test.vol $M0;</div><div class='add'>+</div><div class='add'>+# This should not succeed</div><div class='add'>+cat &gt; $B0/test.vol &lt;&lt;EOF</div><div class='add'>+volume test</div><div class='add'>+  option test and test</div><div class='add'>+end-volume</div><div class='add'>+EOF</div><div class='add'>+TEST ! glusterfs -f $B0/test.vol $M0;</div><div class='add'>+</div><div class='add'>+# This should not succeed</div><div class='add'>+cat &gt; $B0/test.vol &lt;&lt;EOF</div><div class='add'>+volume test</div><div class='add'>+  subvolumes</div><div class='add'>+end-volume</div><div class='add'>+EOF</div><div class='add'>+TEST ! glusterfs -f $B0/test.vol $M0;</div><div class='add'>+</div><div class='add'>+# This should not succeed</div><div class='add'>+cat &gt; $B0/test.vol &lt;&lt;EOF</div><div class='add'>+volume test</div><div class='add'>+  type storage/posix</div><div class='add'>+  new-option key value</div><div class='add'>+  option directory $B0/test</div><div class='add'>+end-volume</div><div class='add'>+EOF</div><div class='add'>+TEST ! glusterfs -f $B0/test.vol $M0;</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/nfs.rc b/tests/nfs.rc<br/>new file mode 100644<br/>index 00000000000..2140f311c33<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/nfs.rc?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/nfs.rc</a></div><div class='hunk'>@@ -0,0 +1,70 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+# Due to portmap registration NFS takes some time to</div><div class='add'>+# export all volumes. Therefore tests should start only</div><div class='add'>+# after exports are visible by showmount command. This</div><div class='add'>+# routine will check if showmount shows the exports or not</div><div class='add'>+#</div><div class='add'>+function is_nfs_export_available ()</div><div class='add'>+{</div><div class='add'>+        local vol=$1</div><div class='add'>+</div><div class='add'>+        if [ "$vol" == "" ]; then</div><div class='add'>+                vol=$V0</div><div class='add'>+        fi</div><div class='add'>+</div><div class='add'>+        exp=$(showmount -e localhost 2&gt; /dev/null | grep $vol | wc -l)</div><div class='add'>+        echo "$exp"</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function mount_nfs ()</div><div class='add'>+{</div><div class='add'>+        local e=$1</div><div class='add'>+        local m=$2</div><div class='add'>+        local opt=$3</div><div class='add'>+        if [ ! -z "$opt" ]; then opt=",$opt"; fi</div><div class='add'>+        opt="soft,intr,vers=3$opt"</div><div class='add'>+</div><div class='add'>+        nopt=""</div><div class='add'>+        for o in ${opt//,/ }; do</div><div class='add'>+                case $OSTYPE in</div><div class='add'>+                NetBSD)</div><div class='add'>+                        test "x${nopt}" = "x" &amp;&amp; nopt="tcp,-R=2,"</div><div class='add'>+</div><div class='add'>+                        case $o in</div><div class='add'>+                        nolock|noac|actimeo=*|mountproto=udp)</div><div class='add'>+                                continue</div><div class='add'>+                                ;;</div><div class='add'>+                        proto=tcp)</div><div class='add'>+                                o="tcp"</div><div class='add'>+                                ;;</div><div class='add'>+                        vers=3)</div><div class='add'>+                                o="nfsv3"</div><div class='add'>+                                ;;</div><div class='add'>+                        retry=*)</div><div class='add'>+                                o=${o/retry=/-R}</div><div class='add'>+                                ;;</div><div class='add'>+                        timeo=*)</div><div class='add'>+                                o=${o/timeo=/-t}</div><div class='add'>+                                ;;</div><div class='add'>+                        retrans=*)</div><div class='add'>+                                o=${o/retrans=/-x}</div><div class='add'>+                                ;;</div><div class='add'>+                        *)</div><div class='add'>+                                ;;</div><div class='add'>+                        esac</div><div class='add'>+                        ;;</div><div class='add'>+                *)</div><div class='add'>+                        ;;</div><div class='add'>+                esac</div><div class='add'>+                if [ ! -z "$nopt" ]; then nopt="${nopt},"; fi</div><div class='add'>+                nopt="${nopt}$o"</div><div class='add'>+        done</div><div class='add'>+</div><div class='add'>+        mount -t nfs -o $nopt $e $m</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function umount_nfs {</div><div class='add'>+        ${UMOUNT_F} $1</div><div class='add'>+        if [ $? -eq 0 ]; then echo "Y"; else echo "N"; fi</div><div class='add'>+}</div><div class='head'>diff --git a/tests/performance/open-behind.t b/tests/performance/open-behind.t<br/>new file mode 100755<br/>index 00000000000..002a98a8352<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/performance/open-behind.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/performance/open-behind.t</a></div><div class='hunk'>@@ -0,0 +1,75 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../include.rc</div><div class='add'>+. $(dirname $0)/../volume.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume info 2&gt;/dev/null;</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/${V0}{1,2};</div><div class='add'>+TEST $CLI volume set $V0 performance.flush-behind off;</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+</div><div class='add'>+## Mount FUSE</div><div class='add'>+TEST $GFS -s $H0 --volfile-id $V0 $M0;</div><div class='add'>+</div><div class='add'>+TEST $GFS -s $H0 --volfile-id $V0 $M1;</div><div class='add'>+</div><div class='add'>+D0="hello-this-is-a-test-message0";</div><div class='add'>+F0="test-file0";</div><div class='add'>+</div><div class='add'>+function write_to()</div><div class='add'>+{</div><div class='add'>+    local file="$1";</div><div class='add'>+    local data="$2";</div><div class='add'>+</div><div class='add'>+    echo "$data" &gt; "$file";</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+TEST write_to "$M0/$F0" "$D0";</div><div class='add'>+EXPECT "$D0" cat $M1/$F0;</div><div class='add'>+</div><div class='add'>+# open-behind delays open and uses anonymous fds for fops like</div><div class='add'>+# fstat and readv. So after creating the file, if volume is restarted</div><div class='add'>+# then later when the file is read, because of the use of anonymous fds</div><div class='add'>+# volume top open will show number of files opened as 0.</div><div class='add'>+TEST $CLI volume stop $V0;</div><div class='add'>+sleep 1;</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "^1$" client_connected_status_meta $M0 ${V0}-client-0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "^1$" client_connected_status_meta $M0 ${V0}-client-1</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "^1$" client_connected_status_meta $M1 ${V0}-client-0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "^1$" client_connected_status_meta $M1 ${V0}-client-1</div><div class='add'>+</div><div class='add'>+cat $M1/$F0 &gt;/dev/null;</div><div class='add'>+</div><div class='add'>+string=$(gluster volume top $V0 open | grep -w "$F0");</div><div class='add'>+</div><div class='add'>+EXPECT "" echo $string;</div><div class='add'>+</div><div class='add'>+TEST $CLI volume set $V0 performance.open-behind off;</div><div class='add'>+</div><div class='add'>+EXPECT_WITHIN $GRAPH_SWITCH_TIMEOUT "2" num_graphs $M0;</div><div class='add'>+EXPECT_WITHIN $GRAPH_SWITCH_TIMEOUT "2" num_graphs $M1;</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "^1$" client_connected_status_meta $M0 ${V0}-client-0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "^1$" client_connected_status_meta $M0 ${V0}-client-1</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "^1$" client_connected_status_meta $M1 ${V0}-client-0</div><div class='add'>+EXPECT_WITHIN $PROCESS_UP_TIMEOUT "^1$" client_connected_status_meta $M1 ${V0}-client-1</div><div class='add'>+</div><div class='add'>+D1="hello-this-is-a-test-message1";</div><div class='add'>+F1="test-file1";</div><div class='add'>+</div><div class='add'>+TEST write_to "$M0/$F1" "$D1";</div><div class='add'>+EXPECT "$D1" cat $M1/$F1;</div><div class='add'>+</div><div class='add'>+EXPECT "$D0" cat $M1/$F0;</div><div class='add'>+</div><div class='add'>+$CLI volume top $V0 open | grep -w "$F0" &gt;/dev/null 2&gt;&amp;1</div><div class='add'>+TEST [ $? -eq 0 ];</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/performance/quick-read.t b/tests/performance/quick-read.t<br/>new file mode 100644<br/>index 00000000000..26ec175df0d<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/performance/quick-read.t?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/performance/quick-read.t</a></div><div class='hunk'>@@ -0,0 +1,55 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+. $(dirname $0)/../include.rc</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='add'>+</div><div class='add'>+TEST glusterd</div><div class='add'>+TEST pidof glusterd</div><div class='add'>+TEST $CLI volume info;</div><div class='add'>+</div><div class='add'>+TEST $CLI volume create $V0 $H0:$B0/${V0}{1,2};</div><div class='add'>+</div><div class='add'>+TEST $CLI volume start $V0;</div><div class='add'>+</div><div class='add'>+## Mount FUSE</div><div class='add'>+TEST $GFS -s $H0 --volfile-id $V0 $M0;</div><div class='add'>+</div><div class='add'>+TEST $GFS -s $H0 --volfile-id $V0 $M1;</div><div class='add'>+</div><div class='add'>+D0="hello-this-is-a-test-message0";</div><div class='add'>+F0="test-file0";</div><div class='add'>+</div><div class='add'>+function write_to()</div><div class='add'>+{</div><div class='add'>+    local file="$1";</div><div class='add'>+    local data="$2";</div><div class='add'>+</div><div class='add'>+    echo "$data" &gt; "$file";</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+TEST write_to "$M0/$F0" "$D0";</div><div class='add'>+EXPECT "$D0" cat $M1/$F0;</div><div class='add'>+EXPECT "$D0" cat $M0/$F0;</div><div class='add'>+EXPECT "$D0" cat $M1/$F0;</div><div class='add'>+EXPECT "$D0" cat $M0/$F0;</div><div class='add'>+</div><div class='add'>+sleep 1;</div><div class='add'>+</div><div class='add'>+EXPECT "$D0" cat $M1/$F0;</div><div class='add'>+EXPECT "$D0" cat $M0/$F0;</div><div class='add'>+EXPECT "$D0" cat $M1/$F0;</div><div class='add'>+EXPECT "$D0" cat $M0/$F0;</div><div class='add'>+</div><div class='add'>+TEST $CLI volume set $V0 performance.quick-read off;</div><div class='add'>+</div><div class='add'>+D1="hello-this-is-a-test-message1";</div><div class='add'>+F1="test-file1";</div><div class='add'>+</div><div class='add'>+TEST write_to "$M0/$F1" "$D1";</div><div class='add'>+EXPECT "$D1" cat $M0/$F1;</div><div class='add'>+</div><div class='add'>+EXPECT "$D0" cat $M1/$F0;</div><div class='add'>+</div><div class='add'>+cleanup;</div><div class='head'>diff --git a/tests/snapshot.rc b/tests/snapshot.rc<br/>new file mode 100644<br/>index 00000000000..f6da514f826<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/snapshot.rc?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/snapshot.rc</a></div><div class='hunk'>@@ -0,0 +1,484 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+LVM_DEFINED=0</div><div class='add'>+LVM_PREFIX="patchy_snap"</div><div class='add'>+LVM_COUNT=0</div><div class='add'>+VHD_SIZE="300M"</div><div class='add'>+</div><div class='add'>+#This function will init B# bricks</div><div class='add'>+#This is used when launch_cluster is</div><div class='add'>+#not called to init B#. Call it before</div><div class='add'>+#setup_lvm</div><div class='add'>+function init_n_bricks() {</div><div class='add'>+    local count=$1</div><div class='add'>+    for i in `seq 1 $count`; do</div><div class='add'>+        eval "B$i=/d/backends/$i"</div><div class='add'>+    done</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+count_snaps () {</div><div class='add'>+    ls $1/.snaps | wc -l</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function init_lvm() {</div><div class='add'>+    if [ "$1" == "" ]; then</div><div class='add'>+        echo "Error: Invalid argument supplied"</div><div class='add'>+        return 1</div><div class='add'>+    fi</div><div class='add'>+    LVM_COUNT=$1</div><div class='add'>+</div><div class='add'>+    if [ "$2" != "" ]; then</div><div class='add'>+        VHD_SIZE=$2</div><div class='add'>+    fi</div><div class='add'>+</div><div class='add'>+    local b</div><div class='add'>+    local i</div><div class='add'>+</div><div class='add'>+    if [ "$B1" = "" ]; then</div><div class='add'>+        B1=$B0</div><div class='add'>+    fi</div><div class='add'>+</div><div class='add'>+    for i in `seq 1 $LVM_COUNT`; do</div><div class='add'>+        b="B$i"</div><div class='add'>+        if [ "${!b}" = "" ]; then</div><div class='add'>+            echo "Error: $b not defined."</div><div class='add'>+            echo "Please run launch_cluster with atleast $LVM_COUNT nodes"</div><div class='add'>+            return 1</div><div class='add'>+        fi</div><div class='add'>+</div><div class='add'>+        eval "L$i=${!b}/${LVM_PREFIX}_mnt"</div><div class='add'>+        l="L$i"</div><div class='add'>+        mkdir -p ${!l}</div><div class='add'>+        if [ $? -ne 0 ]; then</div><div class='add'>+            echo "Error: failed to create dir ${!l}"</div><div class='add'>+            return 1</div><div class='add'>+        fi</div><div class='add'>+</div><div class='add'>+        eval "VG$i=${LVM_PREFIX}_vg_${i}"</div><div class='add'>+    done</div><div class='add'>+</div><div class='add'>+    LVM_DEFINED=1</div><div class='add'>+    return 0</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function verify_lvm_version() {</div><div class='add'>+    if `/sbin/lvcreate --help | grep -q thin`; then</div><div class='add'>+        return 0;</div><div class='add'>+    fi</div><div class='add'>+    return 1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function setup_lvm() {</div><div class='add'>+    init_lvm $@ || return 1</div><div class='add'>+    _setup_lvm</div><div class='add'>+    return 0</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function cleanup_lvm() {</div><div class='add'>+    pkill gluster</div><div class='add'>+    sleep 2</div><div class='add'>+</div><div class='add'>+    if [ "$LVM_DEFINED" = "1" ]; then</div><div class='add'>+        _cleanup_lvm &gt;/dev/null 2&gt;&amp;1</div><div class='add'>+    fi</div><div class='add'>+</div><div class='add'>+    _cleanup_lvm_again &gt;/dev/null 2&gt;&amp;1</div><div class='add'>+    # TODO Delete cleanup has open bug</div><div class='add'>+    # once fixed delete this</div><div class='add'>+    mount | grep "run/gluster/snaps" | awk '{print $3}' | xargs umount 2&gt; /dev/null</div><div class='add'>+    mount | grep "patchy_snap" | awk '{print $3}' | xargs umount 2&gt; /dev/null</div><div class='add'>+    \rm -rf /var/run/gluster/snaps/*</div><div class='add'>+    lvscan | grep "/dev/patchy_snap" | awk '{print $2}'| xargs lvremove -f 2&gt; /dev/null</div><div class='add'>+    vgs | grep patchy_snap | awk '{print $1}' | xargs vgremove -f 2&gt;/dev/null</div><div class='add'>+    \rm -rf /dev/patchy*</div><div class='add'>+    return 0</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+# Find out how this file was sourced, source traps.rc the same way, and use</div><div class='add'>+# push_trapfunc to make sure cleanup_lvm gets called before we exit.</div><div class='add'>+. $(dirname ${BASH_SOURCE[0]})/traps.rc</div><div class='add'>+push_trapfunc cleanup_lvm</div><div class='add'>+</div><div class='add'>+########################################################</div><div class='add'>+# Private Functions</div><div class='add'>+########################################################</div><div class='add'>+function _setup_lvm() {</div><div class='add'>+    local count=$LVM_COUNT</div><div class='add'>+    local b</div><div class='add'>+    local i</div><div class='add'>+</div><div class='add'>+    for i in `seq 1 $count`; do</div><div class='add'>+        b="B$i"</div><div class='add'>+</div><div class='add'>+        _create_vhd ${!b} $i</div><div class='add'>+        _create_lv ${!b} $i</div><div class='add'>+        _mount_lv $i</div><div class='add'>+    done</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function _cleanup_lvm() {</div><div class='add'>+    local count=$LVM_COUNT</div><div class='add'>+    local b</div><div class='add'>+    local i</div><div class='add'>+</div><div class='add'>+    for i in `seq 1 $count`; do</div><div class='add'>+        b="B$i"</div><div class='add'>+        _umount_lv $i</div><div class='add'>+        _remove_lv $i</div><div class='add'>+        _remove_vhd ${!b}</div><div class='add'>+    done</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function _cleanup_lvm_again() {</div><div class='add'>+    local file</div><div class='add'>+</div><div class='add'>+    mount | grep $LVM_PREFIX | awk '{print $3}' | xargs -r ${UMOUNT_F}</div><div class='add'>+</div><div class='add'>+    /sbin/vgs | grep $LVM_PREFIX | awk '{print $1}' | xargs -r vgremove -f</div><div class='add'>+</div><div class='add'>+    find $B0 -name "${LVM_PREFIX}_loop" | xargs -r losetup -d</div><div class='add'>+</div><div class='add'>+    find $B0 -name "${LVM_PREFIX}*" | xargs -r rm -rf</div><div class='add'>+</div><div class='add'>+    find /run/gluster/snaps -name "*${LVM_PREFIX}*" | xargs -r rm -rf</div><div class='add'>+</div><div class='add'>+    for file in `ls /run/gluster/snaps`; do</div><div class='add'>+        find /run/gluster/snaps/$file -mmin -2 | xargs -r rm -rf</div><div class='add'>+    done</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+########################################################</div><div class='add'>+########################################################</div><div class='add'>+function _create_vhd() {</div><div class='add'>+    local dir=$1</div><div class='add'>+    local num=$2</div><div class='add'>+    local loop_num=`expr $2 + 8`</div><div class='add'>+</div><div class='add'>+    fallocate -l${VHD_SIZE} $dir/${LVM_PREFIX}_vhd</div><div class='add'>+    mknod -m660 $dir/${LVM_PREFIX}_loop b 7 $loop_num</div><div class='add'>+    /sbin/losetup $dir/${LVM_PREFIX}_loop $dir/${LVM_PREFIX}_vhd</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function _create_lv() {</div><div class='add'>+    local dir=$1</div><div class='add'>+    local num=$2</div><div class='add'>+    local vg="VG$num"</div><div class='add'>+    local thinpoolsize="200M"</div><div class='add'>+    local virtualsize="150M"</div><div class='add'>+</div><div class='add'>+    /sbin/pvcreate $dir/${LVM_PREFIX}_loop</div><div class='add'>+    /sbin/vgcreate ${!vg} $dir/${LVM_PREFIX}_loop</div><div class='add'>+</div><div class='add'>+    /sbin/lvcreate -L ${thinpoolsize} -T /dev/${!vg}/thinpool</div><div class='add'>+    /sbin/lvcreate -V ${virtualsize} -T /dev/${!vg}/thinpool -n brick_lvm</div><div class='add'>+</div><div class='add'>+    mkfs.xfs -f /dev/${!vg}/brick_lvm</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function _mount_lv() {</div><div class='add'>+    local num=$1</div><div class='add'>+    local vg="VG$num"</div><div class='add'>+    local l="L$num"</div><div class='add'>+</div><div class='add'>+    mount -t xfs -o nouuid /dev/${!vg}/brick_lvm ${!l}</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function _umount_lv() {</div><div class='add'>+    local num=$1</div><div class='add'>+    local l="L$num"</div><div class='add'>+</div><div class='add'>+    ${UMOUNT_F} ${!l} 2&gt;/dev/null || true</div><div class='add'>+    rmdir ${!l} 2&gt;/dev/null || true</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function _remove_lv() {</div><div class='add'>+    local num=$1</div><div class='add'>+    local vg="VG$num"</div><div class='add'>+</div><div class='add'>+    vgremove -f ${!vg}</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function _remove_vhd() {</div><div class='add'>+    local dir=$1</div><div class='add'>+</div><div class='add'>+    losetup -d $dir/${LVM_PREFIX}_loop</div><div class='add'>+    rm -f $dir/${LVM_PREFIX}_loop</div><div class='add'>+    rm -f $dir/${LVM_PREFIX}_vhd</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+########################################################</div><div class='add'>+# Utility Functions</div><div class='add'>+########################################################</div><div class='add'>+function snapshot_exists() {</div><div class='add'>+        local clitype=$1</div><div class='add'>+        local snapname=$2</div><div class='add'>+        local cli=$CLI</div><div class='add'>+        if [ "$clitype" == "1" ]; then</div><div class='add'>+                cli=$CLI_1;</div><div class='add'>+        fi</div><div class='add'>+        if [ "$clitype" == "2" ]; then</div><div class='add'>+                cli=$CLI_2;</div><div class='add'>+        fi</div><div class='add'>+        $cli snapshot list | egrep -q "^$snapname\$"</div><div class='add'>+        return $?</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#Create N number of snaps in a given volume</div><div class='add'>+#Arg1 : &lt;Volume Name&gt;</div><div class='add'>+#Arg2 : &lt;Count of snaps to be created&gt;</div><div class='add'>+#Arg3 : &lt;Snap Name Pattern&gt;</div><div class='add'>+#Return: Returns 0 if all snaps are created ,</div><div class='add'>+#        if not will return exit code of last failed</div><div class='add'>+#        snap create command.</div><div class='add'>+function create_n_snapshots() {</div><div class='add'>+        local cli=$1</div><div class='add'>+        local vol=$1</div><div class='add'>+        local snap_count=$2</div><div class='add'>+        local snap_name=$3</div><div class='add'>+        local ret=0</div><div class='add'>+        for i in `seq 1 $snap_count`; do</div><div class='add'>+                $CLI_1 snapshot create $snap_name$i ${vol} no-timestamp &amp;</div><div class='add'>+                PID_1=$!</div><div class='add'>+                wait $PID_1</div><div class='add'>+                ret=$?</div><div class='add'>+                if [ "$ret" != "0" ]; then</div><div class='add'>+                        break</div><div class='add'>+                fi</div><div class='add'>+         done</div><div class='add'>+         return $ret</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+#Delete N number of snaps in a given volume</div><div class='add'>+#Arg1 : &lt;Volume Name&gt;</div><div class='add'>+#Arg2 : &lt;Count of snaps to be deleted&gt;</div><div class='add'>+#Arg3 : &lt;Snap Name Pattern&gt;</div><div class='add'>+#Return: Returns 0 if all snaps are Delete,</div><div class='add'>+#        if not will return exit code of last failed</div><div class='add'>+#        snap delete command.</div><div class='add'>+function delete_n_snapshots() {</div><div class='add'>+        local vol=$1</div><div class='add'>+        local snap_count=$2</div><div class='add'>+        local snap_name=$3</div><div class='add'>+        local ret=0</div><div class='add'>+        for i in `seq 1 $snap_count`; do</div><div class='add'>+                $CLI_1 snapshot delete $snap_name$i &amp;</div><div class='add'>+                PID_1=$!</div><div class='add'>+                wait $PID_1</div><div class='add'>+                temp=$?</div><div class='add'>+                if [ "$temp" != "0" ]; then</div><div class='add'>+                        ret=$temp</div><div class='add'>+                fi</div><div class='add'>+         done</div><div class='add'>+         return $ret</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#Check for the existance of N number of snaps in a given volume</div><div class='add'>+#Arg1 : &lt;Volume Name&gt;</div><div class='add'>+#Arg2 : &lt;Count of snaps to be checked&gt;</div><div class='add'>+#Arg3 : &lt;Snap Name Pattern&gt;</div><div class='add'>+#Return: Returns 0 if all snaps exists,</div><div class='add'>+#        if not will return exit code of last failed</div><div class='add'>+#        snapshot_exists().</div><div class='add'>+function snapshot_n_exists() {</div><div class='add'>+        local vol=$1</div><div class='add'>+        local snap_count=$2</div><div class='add'>+        local snap_name=$3</div><div class='add'>+        local ret=0</div><div class='add'>+        for i in `seq 1 $snap_count`; do</div><div class='add'>+                snapshot_exists 1 $snap_name$i</div><div class='add'>+                ret=$?</div><div class='add'>+                if [ "$ret" != "0" ]; then</div><div class='add'>+                        break</div><div class='add'>+                fi</div><div class='add'>+         done</div><div class='add'>+         return $ret</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#Check for the status of snapshot for a volume</div><div class='add'>+#Arg1 : &lt;Snap Name&gt;</div><div class='add'>+function snapshot_status()</div><div class='add'>+{</div><div class='add'>+    local snap=$1;</div><div class='add'>+    local cli=$CLI_1;</div><div class='add'>+    if [ "$cli" = "" ]; then</div><div class='add'>+        cli=$CLI</div><div class='add'>+    fi</div><div class='add'>+</div><div class='add'>+    #TODO: Right now just fetches the status of the single snap volume.</div><div class='add'>+    #When snapshot will have multiple snap volumes, should have a</div><div class='add'>+    #cummulative logic for status</div><div class='add'>+    $cli snapshot info $snap | grep "Status" | sed 's/.*: //';</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+#Check the different status of a particular snapshot</div><div class='add'>+#Arg1 : &lt;Snap name&gt;</div><div class='add'>+#Arg2 : &lt;Filed in status&gt;</div><div class='add'>+#Arg3 : &lt;Expected value&gt;</div><div class='add'>+function snapshot_snap_status()</div><div class='add'>+{</div><div class='add'>+</div><div class='add'>+    local snap=$1;</div><div class='add'>+    local cli=$CLI_1;</div><div class='add'>+    local field=$2;</div><div class='add'>+    local expected=$3;</div><div class='add'>+    if [ "$cli" = "" ]; then</div><div class='add'>+        cli=$CLI</div><div class='add'>+    fi</div><div class='add'>+    for i in $($cli snapshot status $snap | grep "$field" | \</div><div class='add'>+               cut -d ':' -f2 | awk '{print $1}') ;</div><div class='add'>+    do</div><div class='add'>+           if [ "$i" != "$expected" ]; then</div><div class='add'>+                echo "Failed"</div><div class='add'>+                return 1;</div><div class='add'>+           fi;</div><div class='add'>+    done;</div><div class='add'>+echo "Success"</div><div class='add'>+return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+# TODO: Cleanup code duplication</div><div class='add'>+function volinfo_field()</div><div class='add'>+{</div><div class='add'>+    local vol=$1;</div><div class='add'>+    local field=$2;</div><div class='add'>+</div><div class='add'>+    $CLI_1 volume info $vol | grep "^$field: " | sed 's/.*: //';</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+function volume_exists() {</div><div class='add'>+        $CLI_1 volume info $1 &gt; /dev/null 2&gt;&amp;1</div><div class='add'>+        if [ $? -eq 0 ]; then</div><div class='add'>+                echo "Y"</div><div class='add'>+        else</div><div class='add'>+                echo "N"</div><div class='add'>+        fi</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+# arg-1 : From which node the command should be trigerred</div><div class='add'>+#         Ex : $CLI_1, $CLI_2, etc.</div><div class='add'>+# arg-2 : Volume name</div><div class='add'>+# arg-3 : Starting index for the snapname "snap$i"</div><div class='add'>+# arg-4 : Number of snapshots to be taken</div><div class='add'>+function snap_create()</div><div class='add'>+{</div><div class='add'>+        eval local cli_index=\$$1</div><div class='add'>+        local volname=$2</div><div class='add'>+        local i=$3</div><div class='add'>+        local limit=$[$i + $4]</div><div class='add'>+</div><div class='add'>+        while [ $i -lt $limit ]</div><div class='add'>+        do</div><div class='add'>+                $cli_index snapshot create snap$i $volname no-timestamp</div><div class='add'>+                i=$[$i+1]</div><div class='add'>+        done</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+# arg-1 : From which node the command should be trigerred</div><div class='add'>+#         Ex : $CLI_1. $CLI_2, etc.</div><div class='add'>+# arg-2 : Volume name.</div><div class='add'>+function get_snap_count()</div><div class='add'>+{</div><div class='add'>+        eval local cli_index=\$$1</div><div class='add'>+        local volname=$2</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+        if [ -z "$2" ]</div><div class='add'>+        then</div><div class='add'>+                $cli_index snapshot list | grep -v "No snapshots present"\</div><div class='add'>+                                         | wc -l</div><div class='add'>+        else</div><div class='add'>+                $cli_index snapshot list $volname\</div><div class='add'>+                                         | grep -v "No snapshots present"\</div><div class='add'>+                                         | wc -l</div><div class='add'>+        fi</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+# arg-1 : From which node the command should be trigerred</div><div class='add'>+#         Ex : $CLI_1, $CLI_2, etc.</div><div class='add'>+# arg-2 : Starting index for the snapname "snap$i"</div><div class='add'>+# arg-3 : Number of snapshots to be deleted.</div><div class='add'>+function snap_delete()</div><div class='add'>+{</div><div class='add'>+        eval local cli_index=\$$1</div><div class='add'>+        local i=$2</div><div class='add'>+        local limit=$[$i + $3]</div><div class='add'>+</div><div class='add'>+        while [ $i -lt $limit ]</div><div class='add'>+        do</div><div class='add'>+                $cli_index snapshot delete snap$i</div><div class='add'>+                i=$[$i+1]</div><div class='add'>+        done</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+# arg-1 : From which node the command should be triggered</div><div class='add'>+#         Ex : $CLI_1, $CLI_2, etc.</div><div class='add'>+# arg-2 : key value</div><div class='add'>+function snap_config()</div><div class='add'>+{</div><div class='add'>+        eval local cli_index=\$$1</div><div class='add'>+        local var=$2</div><div class='add'>+        $cli_index snapshot config | grep "^$var" | sed 's/.*: //'</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function check_if_snapd_exist() {</div><div class='add'>+        local pid</div><div class='add'>+        pid=$(ps aux | grep "snapd" | grep -v grep | awk '{print $2}')</div><div class='add'>+        if [ -n "$pid" ]; then echo "Y"; else echo "N"; fi</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+# returns number of snapshot being displayed in ".snaps" directory</div><div class='add'>+function uss_count_snap_displayed() {</div><div class='add'>+        local path=$1</div><div class='add'>+        ls $path/.snaps | wc -l</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function snap_info_volume()</div><div class='add'>+{</div><div class='add'>+        eval local cli_index=\$$1</div><div class='add'>+        local var=$2</div><div class='add'>+        local vol=$3</div><div class='add'>+        $cli_index snapshot info volume $vol | grep "^$var" | sed 's/.*: //'</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function snap_config_volume()</div><div class='add'>+{</div><div class='add'>+        eval local cli_index=\$$1</div><div class='add'>+        local var=$2</div><div class='add'>+        local vol=$3</div><div class='add'>+        $cli_index snapshot config $vol| grep "^$var" | sed 's/.*: //'</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#return specific fields of xml output</div><div class='add'>+function get-cmd-field-xml()</div><div class='add'>+{</div><div class='add'>+        local cli=$CLI_1;</div><div class='add'>+        if [ "$cli" = "" ]; then</div><div class='add'>+            cli=$CLI</div><div class='add'>+        fi</div><div class='add'>+</div><div class='add'>+        COMMAND=$1</div><div class='add'>+        PATTERN=$2</div><div class='add'>+</div><div class='add'>+        $cli $COMMAND --xml | xmllint --format - | grep $PATTERN</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function get_snap_brick_status()</div><div class='add'>+{</div><div class='add'>+    local snap=$1;</div><div class='add'>+</div><div class='add'>+    $CLI snapshot status $snap | grep "Brick Running" | sed 's/.*: //';</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+case $OSTYPE in</div><div class='add'>+NetBSD)</div><div class='add'>+        echo "Skip test on LVM which is not available on NetBSD" &gt;&amp;2</div><div class='add'>+        SKIP_TESTS</div><div class='add'>+        exit 0</div><div class='add'>+        ;;</div><div class='add'>+*)</div><div class='add'>+        ;;</div><div class='add'>+esac</div><div class='head'>diff --git a/tests/ssl.rc b/tests/ssl.rc<br/>new file mode 100644<br/>index 00000000000..b1ccc4c8d38<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/ssl.rc?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/ssl.rc</a></div><div class='hunk'>@@ -0,0 +1,35 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+for d in /etc/ssl /etc/openssl /usr/local/etc/openssl ; do</div><div class='add'>+        if test -d $d ; then</div><div class='add'>+                SSL_BASE=$d</div><div class='add'>+                break</div><div class='add'>+        fi</div><div class='add'>+done</div><div class='add'>+</div><div class='add'>+if [ ! -d "$SSL_BASE" ]; then</div><div class='add'>+        echo "Skip test! SSL certificate path missing in the system" &gt;&amp;2</div><div class='add'>+        SKIP_TESTS</div><div class='add'>+        exit 0</div><div class='add'>+fi</div><div class='add'>+</div><div class='add'>+SSL_KEY=$SSL_BASE/glusterfs.key</div><div class='add'>+SSL_CERT=$SSL_BASE/glusterfs.pem</div><div class='add'>+SSL_CA=$SSL_BASE/glusterfs.ca</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+# Create self-signed certificates</div><div class='add'>+function create_self_signed_certs (){</div><div class='add'>+        openssl genrsa -out $SSL_KEY 2048</div><div class='add'>+        openssl req -new -x509 -key $SSL_KEY -subj /CN=Anyone -out $SSL_CERT</div><div class='add'>+        ln $SSL_CERT $SSL_CA</div><div class='add'>+        return $?</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function cleanup_certs () {</div><div class='add'>+        rm -f $SSL_BASE/glusterfs.*</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+push_trapfunc cleanup_certs</div><div class='add'>+</div><div class='add'>+cleanup_certs</div><div class='head'>diff --git a/tests/thin-arbiter.rc b/tests/thin-arbiter.rc<br/>new file mode 100644<br/>index 00000000000..e26d91b1907<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/thin-arbiter.rc?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/thin-arbiter.rc</a></div><div class='hunk'>@@ -0,0 +1,613 @@</div><div class='add'>+declare -A PORTMAP</div><div class='add'>+PORTCURR=49152</div><div class='add'>+function ta_create_ta_and_volfile()</div><div class='add'>+{</div><div class='add'>+        local b=$B0/$1</div><div class='add'>+        mkdir -p $b/.glusterfs/indices</div><div class='add'>+cat &gt; $B0/ta.vol &lt;&lt;EOF</div><div class='add'>+volume ta-posix</div><div class='add'>+    type storage/posix</div><div class='add'>+    option directory $b</div><div class='add'>+end-volume</div><div class='add'>+</div><div class='add'>+volume ta-thin-arbiter</div><div class='add'>+    type features/thin-arbiter</div><div class='add'>+    subvolumes ta-posix</div><div class='add'>+end-volume</div><div class='add'>+</div><div class='add'>+volume ta-locks</div><div class='add'>+    type features/locks</div><div class='add'>+    option notify-contention yes</div><div class='add'>+    subvolumes ta-thin-arbiter</div><div class='add'>+end-volume</div><div class='add'>+</div><div class='add'>+volume ta-upcall</div><div class='add'>+    type features/upcall</div><div class='add'>+    option cache-invalidation off</div><div class='add'>+    subvolumes ta-locks</div><div class='add'>+end-volume</div><div class='add'>+</div><div class='add'>+volume ta-io-threads</div><div class='add'>+    type performance/io-threads</div><div class='add'>+    subvolumes ta-upcall</div><div class='add'>+end-volume</div><div class='add'>+</div><div class='add'>+volume ta-index</div><div class='add'>+    type features/index</div><div class='add'>+    option xattrop-pending-watchlist trusted.afr.ta-</div><div class='add'>+    option xattrop-dirty-watchlist trusted.afr.dirty</div><div class='add'>+    option index-base $b/.glusterfs/indices</div><div class='add'>+    subvolumes ta-io-threads</div><div class='add'>+end-volume</div><div class='add'>+</div><div class='add'>+volume ta-io-stats</div><div class='add'>+    type debug/io-stats</div><div class='add'>+    option count-fop-hits off</div><div class='add'>+    option latency-measurement off</div><div class='add'>+    option log-level WARNING</div><div class='add'>+    option unique-id $b</div><div class='add'>+    subvolumes ta-index</div><div class='add'>+end-volume</div><div class='add'>+</div><div class='add'>+volume ta-server</div><div class='add'>+    type protocol/server</div><div class='add'>+    option transport.listen-backlog 10</div><div class='add'>+    option transport.socket.keepalive-count 9</div><div class='add'>+    option transport.socket.keepalive-interval 2</div><div class='add'>+    option transport.socket.keepalive-time 20</div><div class='add'>+    option transport.tcp-user-timeout 0</div><div class='add'>+    option transport.socket.keepalive 1</div><div class='add'>+    option auth.addr.$b.allow *</div><div class='add'>+    option auth-path $b</div><div class='add'>+    option transport.address-family inet</div><div class='add'>+    option transport-type tcp</div><div class='add'>+    subvolumes ta-io-stats</div><div class='add'>+end-volume</div><div class='add'>+EOF</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function ta_create_brick_and_volfile()</div><div class='add'>+{</div><div class='add'>+        local b=$B0/$1</div><div class='add'>+        mkdir -p $b/.glusterfs/indices</div><div class='add'>+cat &gt; $B0/${1}.vol &lt;&lt;EOF</div><div class='add'>+volume ${V0}-posix</div><div class='add'>+    type storage/posix</div><div class='add'>+    option directory $b</div><div class='add'>+end-volume</div><div class='add'>+</div><div class='add'>+volume ${V0}-locks</div><div class='add'>+    type features/locks</div><div class='add'>+    subvolumes ${V0}-posix</div><div class='add'>+end-volume</div><div class='add'>+</div><div class='add'>+volume ${V0}-leases</div><div class='add'>+    type features/leases</div><div class='add'>+    option leases off</div><div class='add'>+    subvolumes ${V0}-locks</div><div class='add'>+end-volume</div><div class='add'>+</div><div class='add'>+volume ${V0}-upcall</div><div class='add'>+    type features/upcall</div><div class='add'>+    option cache-invalidation off</div><div class='add'>+    subvolumes ${V0}-leases</div><div class='add'>+end-volume</div><div class='add'>+</div><div class='add'>+volume ${V0}-io-threads</div><div class='add'>+    type performance/io-threads</div><div class='add'>+    subvolumes ${V0}-upcall</div><div class='add'>+end-volume</div><div class='add'>+</div><div class='add'>+volume ${V0}-index</div><div class='add'>+    type features/index</div><div class='add'>+    option xattrop-pending-watchlist trusted.afr.${V0}-</div><div class='add'>+    option xattrop-dirty-watchlist trusted.afr.dirty</div><div class='add'>+    option index-base $b/.glusterfs/indices</div><div class='add'>+    subvolumes ${V0}-io-threads</div><div class='add'>+end-volume</div><div class='add'>+</div><div class='add'>+volume $b</div><div class='add'>+    type debug/io-stats</div><div class='add'>+    option count-fop-hits off</div><div class='add'>+    option latency-measurement off</div><div class='add'>+    option log-level INFO</div><div class='add'>+    option unique-id $b</div><div class='add'>+    subvolumes ${V0}-index</div><div class='add'>+end-volume</div><div class='add'>+</div><div class='add'>+volume ${V0}-server</div><div class='add'>+    type protocol/server</div><div class='add'>+    option transport.listen-backlog 1024</div><div class='add'>+    option transport.socket.keepalive-count 9</div><div class='add'>+    option transport.socket.keepalive-interval 2</div><div class='add'>+    option transport.socket.keepalive-time 20</div><div class='add'>+    option transport.tcp-user-timeout 0</div><div class='add'>+    option transport.socket.keepalive 1</div><div class='add'>+    option auth.addr.$b.allow *</div><div class='add'>+    option auth-path $b</div><div class='add'>+    option auth.login.459d48e8-2a92-4f11-89f2-077b29f6f86d.password a0ad63dd-8314-4f97-9160-1b93e3cb1f0b</div><div class='add'>+    option auth.login.$b.allow 459d48e8-2a92-4f11-89f2-077b29f6f86d</div><div class='add'>+    option transport.address-family inet</div><div class='add'>+    option transport-type tcp</div><div class='add'>+    subvolumes $b</div><div class='add'>+end-volume</div><div class='add'>+EOF</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function ta_set_port_by_name()</div><div class='add'>+{</div><div class='add'>+        if [ -z ${PORTMAP[$1]} ]</div><div class='add'>+        then</div><div class='add'>+                PORTMAP[$1]=$PORTCURR</div><div class='add'>+                PORTCURR=$((PORTCURR+1))</div><div class='add'>+        fi</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function ta_start_brick_process()</div><div class='add'>+{</div><div class='add'>+        ta_set_port_by_name $1</div><div class='add'>+        local p=${PORTMAP[$1]}</div><div class='add'>+        if glusterfs -p $B0/${1}.pid --volfile=$B0/${1}.vol -l $(gluster --print-logdir)/${1}.log --xlator-option ${V0}-server.listen-port=$p</div><div class='add'>+        then</div><div class='add'>+                cat $B0/${1}.pid</div><div class='add'>+        else</div><div class='add'>+                echo ""</div><div class='add'>+                return 1</div><div class='add'>+        fi</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function ta_start_ta_process()</div><div class='add'>+{</div><div class='add'>+        ta_set_port_by_name $1</div><div class='add'>+        local p=${PORTMAP[$1]}</div><div class='add'>+        if glusterfs -p $B0/${1}.pid --volfile=$B0/${1}.vol -l $(gluster --print-logdir)/${1}.log --xlator-option ta-server.listen-port=$p</div><div class='add'>+        then</div><div class='add'>+                cat $B0/${1}.pid</div><div class='add'>+        else</div><div class='add'>+                echo ""</div><div class='add'>+                return 1</div><div class='add'>+        fi</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function ta_start_mount_process()</div><div class='add'>+{</div><div class='add'>+        mkdir -p $1</div><div class='add'>+        identifier=$(echo $1 | tr / .)</div><div class='add'>+        if glusterfs --entry-timeout=0 --attribute-timeout=0 -p $B0/${identifier}.pid --volfile=$B0/mount.vol $1</div><div class='add'>+        then</div><div class='add'>+                cat $B0/$identifier.pid</div><div class='add'>+        else</div><div class='add'>+                echo ""</div><div class='add'>+                return 1</div><div class='add'>+        fi</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function ta_get_mount_pid()</div><div class='add'>+{</div><div class='add'>+    local mount_path=$1</div><div class='add'>+    identifier=$(echo $mount_path | tr / .)</div><div class='add'>+    cat $B0/${identifier}.pid</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function ta_create_mount_volfile()</div><div class='add'>+{</div><div class='add'>+        local b0=$B0/$1</div><div class='add'>+        local b1=$B0/$2</div><div class='add'>+        local ta=$B0/$3</div><div class='add'>+        local b0_port=${PORTMAP[$1]}</div><div class='add'>+        local b1_port=${PORTMAP[$2]}</div><div class='add'>+        local ta_port=${PORTMAP[$3]}</div><div class='add'>+cat &gt; $B0/mount.vol &lt;&lt;EOF</div><div class='add'>+volume ${V0}-client-0</div><div class='add'>+     type protocol/client</div><div class='add'>+     option remote-host $H0</div><div class='add'>+     option client-bind-insecure off</div><div class='add'>+     option transport.socket.keepalive-interval 2</div><div class='add'>+     option transport.socket.keepalive-time 20</div><div class='add'>+     option transport.socket.ssl-enabled off</div><div class='add'>+     option remote-subvolume $b0</div><div class='add'>+     option transport.tcp-user-timeout 0</div><div class='add'>+     option transport.socket.keepalive-count 9</div><div class='add'>+     option transport-type tcp</div><div class='add'>+     option ping-timeout 42</div><div class='add'>+     option send-gids on</div><div class='add'>+     option remote-port $b0_port</div><div class='add'>+     option password a0ad63dd-8314-4f97-9160-1b93e3cb1f0b</div><div class='add'>+     option username 459d48e8-2a92-4f11-89f2-077b29f6f86d</div><div class='add'>+end-volume</div><div class='add'>+</div><div class='add'>+volume ${V0}-client-1</div><div class='add'>+     type protocol/client</div><div class='add'>+     option remote-host $H0</div><div class='add'>+     option client-bind-insecure off</div><div class='add'>+     option transport.socket.keepalive-interval 2</div><div class='add'>+     option transport.socket.keepalive-time 20</div><div class='add'>+     option transport.socket.ssl-enabled off</div><div class='add'>+     option remote-subvolume $b1</div><div class='add'>+     option transport.tcp-user-timeout 0</div><div class='add'>+     option transport.socket.keepalive-count 9</div><div class='add'>+     option transport-type tcp</div><div class='add'>+     option ping-timeout 42</div><div class='add'>+     option send-gids on</div><div class='add'>+     option remote-port $b1_port</div><div class='add'>+     option password a0ad63dd-8314-4f97-9160-1b93e3cb1f0b</div><div class='add'>+     option username 459d48e8-2a92-4f11-89f2-077b29f6f86d</div><div class='add'>+end-volume</div><div class='add'>+</div><div class='add'>+volume ${V0}-thin-arbiter-client</div><div class='add'>+     type protocol/client</div><div class='add'>+     option client-bind-insecure off</div><div class='add'>+     option transport.socket.ssl-enabled off</div><div class='add'>+     option remote-subvolume $ta</div><div class='add'>+     option ping-timeout 42</div><div class='add'>+     option remote-host $H0</div><div class='add'>+     option send-gids on</div><div class='add'>+     option transport.socket.keepalive-interval 2</div><div class='add'>+     option remote-port $ta_port</div><div class='add'>+     option transport-type tcp</div><div class='add'>+     option transport.tcp-user-timeout 0</div><div class='add'>+     option transport.socket.keepalive-time 20</div><div class='add'>+     option transport.socket.keepalive-count 9</div><div class='add'>+end-volume</div><div class='add'>+</div><div class='add'>+volume ${V0}-replicate-0</div><div class='add'>+     type cluster/replicate</div><div class='add'>+     option afr-dirty-xattr trusted.afr.dirty</div><div class='add'>+     option iam-self-heal-daemon off</div><div class='add'>+     option afr-pending-xattr ${V0}-client-0,${V0}-client-1,${V0}-ta-2</div><div class='add'>+     option thin-arbiter $H0:$ta</div><div class='add'>+     subvolumes ${V0}-client-0 ${V0}-client-1 ${V0}-thin-arbiter-client</div><div class='add'>+end-volume</div><div class='add'>+</div><div class='add'>+volume ${V0}-distribute</div><div class='add'>+     type cluster/distribute</div><div class='add'>+     option rebal-throttle normal</div><div class='add'>+     option force-migration off</div><div class='add'>+     option lookup-optimize on</div><div class='add'>+     option weighted-rebalance on</div><div class='add'>+     option write-freq-threshold 0</div><div class='add'>+     option assert-no-child-down off</div><div class='add'>+     option lock-migration off</div><div class='add'>+     option lookup-unhashed on</div><div class='add'>+     option randomize-hash-range-by-gfid off</div><div class='add'>+     option unhashed-sticky-bit off</div><div class='add'>+     option use-readdirp on</div><div class='add'>+     option readdir-optimize off</div><div class='add'>+     option xattr-name trusted.glusterfs.dht</div><div class='add'>+     option read-freq-threshold 0</div><div class='add'>+     option min-free-disk 10%</div><div class='add'>+     option min-free-inodes 5%</div><div class='add'>+     option rebalance-stats off</div><div class='add'>+     subvolumes ${V0}-replicate-0</div><div class='add'>+end-volume</div><div class='add'>+</div><div class='add'>+volume ${V0}-write-behind</div><div class='add'>+     type performance/write-behind</div><div class='add'>+     option strict-O_DIRECT off</div><div class='add'>+     option strict-write-ordering off</div><div class='add'>+     option resync-failed-syncs-after-fsync off</div><div class='add'>+     option aggregate-size 128KB</div><div class='add'>+     option flush-behind on</div><div class='add'>+     option cache-size 1MB</div><div class='add'>+     option trickling-writes on</div><div class='add'>+     subvolumes ${V0}-distribute</div><div class='add'>+end-volume</div><div class='add'>+</div><div class='add'>+volume ${V0}-read-ahead</div><div class='add'>+     type performance/read-ahead</div><div class='add'>+     option force-atime-update false</div><div class='add'>+     option page-count 4</div><div class='add'>+     option page-size 131072</div><div class='add'>+     option pass-through false</div><div class='add'>+     subvolumes ${V0}-write-behind</div><div class='add'>+end-volume</div><div class='add'>+</div><div class='add'>+volume ${V0}-readdir-ahead</div><div class='add'>+     type performance/readdir-ahead</div><div class='add'>+     option rda-low-wmark 4096</div><div class='add'>+     option rda-high-wmark 128KB</div><div class='add'>+     option rda-cache-limit 10MB</div><div class='add'>+     option parallel-readdir off</div><div class='add'>+     option pass-through false</div><div class='add'>+     option rda-request-size 131072</div><div class='add'>+     subvolumes ${V0}-read-ahead</div><div class='add'>+end-volume</div><div class='add'>+</div><div class='add'>+volume ${V0}-io-cache</div><div class='add'>+     type performance/io-cache</div><div class='add'>+     option cache-timeout 1</div><div class='add'>+     option cache-size 32MB</div><div class='add'>+     option min-file-size 0</div><div class='add'>+     option max-file-size 0</div><div class='add'>+     option pass-through false</div><div class='add'>+     subvolumes ${V0}-readdir-ahead</div><div class='add'>+end-volume</div><div class='add'>+</div><div class='add'>+volume ${V0}-quick-read</div><div class='add'>+     type performance/quick-read</div><div class='add'>+     option cache-invalidation false</div><div class='add'>+     option ctime-invalidation false</div><div class='add'>+     option cache-size 128MB</div><div class='add'>+     option cache-timeout 1</div><div class='add'>+     option max-file-size 64KB</div><div class='add'>+     subvolumes ${V0}-io-cache</div><div class='add'>+end-volume</div><div class='add'>+</div><div class='add'>+volume ${V0}-open-behind</div><div class='add'>+     type performance/open-behind</div><div class='add'>+     option use-anonymous-fd yes</div><div class='add'>+     option lazy-open yes</div><div class='add'>+     option read-after-open no</div><div class='add'>+     option pass-through false</div><div class='add'>+     subvolumes ${V0}-quick-read</div><div class='add'>+end-volume</div><div class='add'>+</div><div class='add'>+volume ${V0}-md-cache</div><div class='add'>+     type performance/md-cache</div><div class='add'>+     option pass-through false</div><div class='add'>+     option cache-capability-xattrs true</div><div class='add'>+     option cache-posix-acl false</div><div class='add'>+     option cache-swift-metadata true</div><div class='add'>+     option cache-samba-metadata false</div><div class='add'>+     option md-cache-timeout 1</div><div class='add'>+     option force-readdirp true</div><div class='add'>+     option cache-invalidation false</div><div class='add'>+     option md-cache-statfs off</div><div class='add'>+     option cache-selinux false</div><div class='add'>+     option cache-ima-xattrs true</div><div class='add'>+     subvolumes ${V0}-open-behind</div><div class='add'>+end-volume</div><div class='add'>+</div><div class='add'>+volume ${V0}-io-threads</div><div class='add'>+     type performance/io-threads</div><div class='add'>+     option normal-prio-threads 16</div><div class='add'>+     option enable-least-priority on</div><div class='add'>+     option idle-time 120</div><div class='add'>+     option cleanup-disconnected-reqs off</div><div class='add'>+     option pass-through false</div><div class='add'>+     option thread-count 16</div><div class='add'>+     option high-prio-threads 16</div><div class='add'>+     option low-prio-threads 16</div><div class='add'>+     option least-prio-threads 1</div><div class='add'>+     subvolumes ${V0}-md-cache</div><div class='add'>+end-volume</div><div class='add'>+</div><div class='add'>+volume ${V0}</div><div class='add'>+     type debug/io-stats</div><div class='add'>+     option client-logger gluster-log</div><div class='add'>+     option client-log-buf-size 5</div><div class='add'>+     option latency-measurement off</div><div class='add'>+     option client-log-level INFO</div><div class='add'>+     option brick-log-level INFO</div><div class='add'>+     option count-fop-hits off</div><div class='add'>+     option sys-log-level CRITICAL</div><div class='add'>+     option brick-log-format with-msg-id</div><div class='add'>+     option brick-log-buf-size 5</div><div class='add'>+     option dump-fd-stats off</div><div class='add'>+     option ios-dump-interval 0</div><div class='add'>+     option ios-dump-format json</div><div class='add'>+     option client-log-format with-msg-id</div><div class='add'>+     option log-buf-size 5</div><div class='add'>+     option log-flush-timeout 120</div><div class='add'>+     option client-log-flush-timeout 120</div><div class='add'>+     option ios-sample-interval 0</div><div class='add'>+     option ios-sample-buf-size 65535</div><div class='add'>+     option brick-logger gluster-log</div><div class='add'>+     option ios-dnscache-ttl-sec 86400</div><div class='add'>+     option brick-log-flush-timeout 120</div><div class='add'>+     option unique-id /no/such/path</div><div class='add'>+     subvolumes ${V0}-io-threads</div><div class='add'>+end-volume</div><div class='add'>+EOF</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function ta_kill_brick()</div><div class='add'>+{</div><div class='add'>+        local p=$(cat $B0/${1}.pid)</div><div class='add'>+        echo &gt; $B0/${1}.pid</div><div class='add'>+        kill -9 $p</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function ta_get_pid_by_brick_name()</div><div class='add'>+{</div><div class='add'>+        cat $B0/${1}.pid</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function ta_up_status()</div><div class='add'>+{</div><div class='add'>+        local v=$1</div><div class='add'>+        local m=$2</div><div class='add'>+        local replica_id=$3</div><div class='add'>+        grep -E "^up = " $m/.meta/graphs/active/${v}-replicate-${replica_id}/private | cut -f2 -d'='</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function ta_create_shd_volfile()</div><div class='add'>+{</div><div class='add'>+        local b0=$B0/$1</div><div class='add'>+        local b1=$B0/$2</div><div class='add'>+        local ta=$B0/$3</div><div class='add'>+        local b0_port=${PORTMAP[$1]}</div><div class='add'>+        local b1_port=${PORTMAP[$2]}</div><div class='add'>+        local ta_port=${PORTMAP[$3]}</div><div class='add'>+cat &gt; $B0/glustershd.vol &lt;&lt;EOF</div><div class='add'>+volume ${V0}-replicate-0-client-0</div><div class='add'>+    type protocol/client</div><div class='add'>+    option send-gids on</div><div class='add'>+    option transport.socket.keepalive-interval 2</div><div class='add'>+    option remote-host $H0</div><div class='add'>+    option remote-subvolume $b0</div><div class='add'>+    option ping-timeout 42</div><div class='add'>+    option client-bind-insecure off</div><div class='add'>+    option transport.socket.own-thread off</div><div class='add'>+    option frame-timeout 1800</div><div class='add'>+    option non-blocking-io off</div><div class='add'>+    option transport.socket.keepalive 1</div><div class='add'>+    option transport.socket.keepalive-count 9</div><div class='add'>+    option transport.tcp-user-timeout 0</div><div class='add'>+    option transport.socket.nodelay 1</div><div class='add'>+    option transport.socket.keepalive-time 20</div><div class='add'>+    option transport.socket.read-fail-log off</div><div class='add'>+    option transport-type tcp</div><div class='add'>+    option filter-O_DIRECT disable</div><div class='add'>+    option event-threads 2</div><div class='add'>+    option transport.listen-backlog 1024</div><div class='add'>+    option transport.socket.ssl-enabled off</div><div class='add'>+    option password a0ad63dd-8314-4f97-9160-1b93e3cb1f0b</div><div class='add'>+    option username 459d48e8-2a92-4f11-89f2-077b29f6f86d</div><div class='add'>+    option remote-port $b0_port</div><div class='add'>+end-volume</div><div class='add'>+</div><div class='add'>+volume ${V0}-replicate-0-client-1</div><div class='add'>+    type protocol/client</div><div class='add'>+    option remote-host $H0</div><div class='add'>+    option transport.socket.keepalive-time 20</div><div class='add'>+    option transport.socket.keepalive-count 9</div><div class='add'>+    option transport.socket.own-thread off</div><div class='add'>+    option transport.socket.ssl-enabled off</div><div class='add'>+    option transport-type tcp</div><div class='add'>+    option remote-subvolume $b1</div><div class='add'>+    option event-threads 2</div><div class='add'>+    option transport.tcp-user-timeout 0</div><div class='add'>+    option transport.socket.keepalive 1</div><div class='add'>+    option transport.socket.nodelay 1</div><div class='add'>+    option transport.socket.read-fail-log off</div><div class='add'>+    option frame-timeout 1800</div><div class='add'>+    option ping-timeout 42</div><div class='add'>+    option client-bind-insecure off</div><div class='add'>+    option filter-O_DIRECT disable</div><div class='add'>+    option send-gids on</div><div class='add'>+    option non-blocking-io off</div><div class='add'>+    option transport.listen-backlog 1024</div><div class='add'>+    option transport.socket.keepalive-interval 2</div><div class='add'>+    option password a0ad63dd-8314-4f97-9160-1b93e3cb1f0b</div><div class='add'>+    option username 459d48e8-2a92-4f11-89f2-077b29f6f86d</div><div class='add'>+    option remote-port $b1_port</div><div class='add'>+end-volume</div><div class='add'>+</div><div class='add'>+volume ${V0}-replicate-0-thin-arbiter-client</div><div class='add'>+    type protocol/client</div><div class='add'>+    option frame-timeout 1800</div><div class='add'>+    option event-threads 2</div><div class='add'>+    option transport.listen-backlog 1024</div><div class='add'>+    option transport.socket.nodelay 1</div><div class='add'>+    option transport.socket.keepalive-count 9</div><div class='add'>+    option transport.socket.ssl-enabled off</div><div class='add'>+    option transport-type tcp</div><div class='add'>+    option remote-subvolume $ta</div><div class='add'>+    option filter-O_DIRECT disable</div><div class='add'>+    option non-blocking-io off</div><div class='add'>+    option transport.socket.keepalive-interval 2</div><div class='add'>+    option transport.socket.read-fail-log off</div><div class='add'>+    option remote-host $H0</div><div class='add'>+    option send-gids on</div><div class='add'>+    option transport.tcp-user-timeout 0</div><div class='add'>+    option transport.socket.keepalive-time 20</div><div class='add'>+    option ping-timeout 42</div><div class='add'>+    option client-bind-insecure off</div><div class='add'>+    option transport.socket.keepalive 1</div><div class='add'>+    option transport.socket.own-thread off</div><div class='add'>+    option remote-port $ta_port</div><div class='add'>+end-volume</div><div class='add'>+</div><div class='add'>+volume ${V0}-replicate-0</div><div class='add'>+    type cluster/replicate</div><div class='add'>+    option background-self-heal-count 8</div><div class='add'>+    option metadata-self-heal on</div><div class='add'>+    option data-change-log on</div><div class='add'>+    option entrylk-trace off</div><div class='add'>+    option iam-self-heal-daemon yes</div><div class='add'>+    option afr-dirty-xattr trusted.afr.dirty</div><div class='add'>+    option heal-timeout 10</div><div class='add'>+    option read-hash-mode 1</div><div class='add'>+    option metadata-splitbrain-forced-heal off</div><div class='add'>+    option thin-arbiter $H0:$ta</div><div class='add'>+    option shd-max-threads 1</div><div class='add'>+    option afr-pending-xattr ${V0}-client-0,${V0}-client-1,${V0}-ta-2</div><div class='add'>+    option halo-max-latency 5</div><div class='add'>+    option halo-max-replicas 99999</div><div class='add'>+    option entry-change-log on</div><div class='add'>+    option halo-nfsd-max-latency 5</div><div class='add'>+    option inodelk-trace off</div><div class='add'>+    option pre-op-compat on</div><div class='add'>+    option eager-lock on</div><div class='add'>+    option self-heal-readdir-size 1KB</div><div class='add'>+    option ensure-durability on</div><div class='add'>+    option locking-scheme full</div><div class='add'>+    option halo-enabled False</div><div class='add'>+    option heal-wait-queue-length 128</div><div class='add'>+    option entry-self-heal on</div><div class='add'>+    option self-heal-daemon on</div><div class='add'>+    option quorum-reads no</div><div class='add'>+    option shd-wait-qlength 1024</div><div class='add'>+    option choose-local true</div><div class='add'>+    option halo-min-replicas 2</div><div class='add'>+    option data-self-heal on</div><div class='add'>+    option metadata-change-log on</div><div class='add'>+    option consistent-metadata no</div><div class='add'>+    option full-lock yes</div><div class='add'>+    option use-compound-fops no</div><div class='add'>+    option halo-shd-max-latency 99999</div><div class='add'>+    option quorum-type none</div><div class='add'>+    option favorite-child-policy none</div><div class='add'>+    option read-subvolume-index -1</div><div class='add'>+    option optimistic-change-log on</div><div class='add'>+    option iam-nfs-daemon off</div><div class='add'>+    option post-op-delay-secs 1</div><div class='add'>+    option granular-entry-heal no</div><div class='add'>+    option consistent-io no</div><div class='add'>+    option data-self-heal-window-size 1</div><div class='add'>+    subvolumes ${V0}-replicate-0-client-0 ${V0}-replicate-0-client-1 ${V0}-replicate-0-thin-arbiter-client</div><div class='add'>+end-volume</div><div class='add'>+</div><div class='add'>+volume glustershd</div><div class='add'>+    type debug/io-stats</div><div class='add'>+    option log-buf-size 5</div><div class='add'>+    option ios-dump-format json</div><div class='add'>+    option latency-measurement off</div><div class='add'>+    option sys-log-level CRITICAL</div><div class='add'>+    option brick-log-level INFO</div><div class='add'>+    option client-logger gluster-log</div><div class='add'>+    option client-log-format with-msg-id</div><div class='add'>+    option brick-log-format with-msg-id</div><div class='add'>+    option client-log-buf-size 5</div><div class='add'>+    option log-flush-timeout 120</div><div class='add'>+    option ios-dump-interval 0</div><div class='add'>+    option ios-sample-interval 0</div><div class='add'>+    option ios-dnscache-ttl-sec 86400</div><div class='add'>+    option count-fop-hits off</div><div class='add'>+    option client-log-level INFO</div><div class='add'>+    option brick-logger gluster-log</div><div class='add'>+    option brick-log-buf-size 5</div><div class='add'>+    option ios-sample-buf-size 65535</div><div class='add'>+    option client-log-flush-timeout 120</div><div class='add'>+    option brick-log-flush-timeout 120</div><div class='add'>+    option unique-id /no/such/path</div><div class='add'>+    option dump-fd-stats off</div><div class='add'>+    subvolumes ${V0}-replicate-0</div><div class='add'>+end-volume</div><div class='add'>+EOF</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function ta_start_shd_process()</div><div class='add'>+{</div><div class='add'>+        if glusterfs -p $B0/${1}.pid --volfile=$B0/${1}.vol -l $(gluster --print-logdir)/${1}.log --process-name=glustershd</div><div class='add'>+        then</div><div class='add'>+                cat $B0/${1}.pid</div><div class='add'>+        else</div><div class='add'>+                echo ""</div><div class='add'>+                return 1</div><div class='add'>+        fi</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function ta_mount_child_up_status()</div><div class='add'>+{</div><div class='add'>+        local mount_path=$1</div><div class='add'>+        #brick_id is (brick-num in volume info - 1)</div><div class='add'>+        local vol=$2</div><div class='add'>+        local brick_id=$3</div><div class='add'>+        local pid=$(ta_get_mount_pid $mount_path)</div><div class='add'>+        local fpath=$(generate_statedump $pid)</div><div class='add'>+        up=$(grep -a -B1 trusted.afr.$vol-client-$brick_id $fpath | head -1 | cut -f2 -d'=')</div><div class='add'>+        rm -f $fpath</div><div class='add'>+        echo "$up"</div><div class='add'>+}</div><div class='head'>diff --git a/tests/traps.rc b/tests/traps.rc<br/>new file mode 100644<br/>index 00000000000..f011960c97e<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/traps.rc?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/traps.rc</a></div><div class='hunk'>@@ -0,0 +1,22 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+</div><div class='add'>+# Make sure this only gets included/executed once.  Unfortunately, bash doesn't</div><div class='add'>+# usually distinguish between values that are unset and values that are null.</div><div class='add'>+# To work around that, we declare TRAPFUNCS to be a one-element array right at</div><div class='add'>+# the start, but that one element is : which is defined to do nothing.</div><div class='add'>+</div><div class='add'>+if [ ${#TRAPFUNCS[@]} = 0 ]; then</div><div class='add'>+        TRAPFUNCS=(:)</div><div class='add'>+</div><div class='add'>+        push_trapfunc () {</div><div class='add'>+                TRAPFUNCS[${#TRAPFUNCS[@]}]="$@"</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        execute_trapfuncs () {</div><div class='add'>+                for i in "${TRAPFUNCS[@]}"; do</div><div class='add'>+                        $i</div><div class='add'>+                done</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        trap execute_trapfuncs EXIT</div><div class='add'>+fi</div><div class='head'>diff --git a/tests/utils/arequal-checksum.c b/tests/utils/arequal-checksum.c<br/>new file mode 100644<br/>index 00000000000..b51a054162b<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/utils/arequal-checksum.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/utils/arequal-checksum.c</a></div><div class='hunk'>@@ -0,0 +1,633 @@</div><div class='add'>+/*</div><div class='add'>+  Copyright (c) 2012 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#ifndef _GNU_SOURCE</div><div class='add'>+#define _GNU_SOURCE</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#define _XOPEN_SOURCE 500</div><div class='add'>+</div><div class='add'>+#include &lt;ftw.h&gt;</div><div class='add'>+#include &lt;stdio.h&gt;</div><div class='add'>+#include &lt;stdlib.h&gt;</div><div class='add'>+#include &lt;sys/types.h&gt;</div><div class='add'>+#include &lt;sys/stat.h&gt;</div><div class='add'>+#include &lt;unistd.h&gt;</div><div class='add'>+#include &lt;errno.h&gt;</div><div class='add'>+#include &lt;string.h&gt;</div><div class='add'>+#include &lt;dirent.h&gt;</div><div class='add'>+#include &lt;stdlib.h&gt;</div><div class='add'>+#include &lt;libgen.h&gt;</div><div class='add'>+#include &lt;stdint.h&gt;</div><div class='add'>+#include &lt;dirent.h&gt;</div><div class='add'>+#include &lt;argp.h&gt;</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+ * FTW_ACTIONRETVAL is a GNU libc extension. It is used here to skip</div><div class='add'>+ * hierarchies. On other systems we will still walk the tree, ignoring</div><div class='add'>+ * entries.</div><div class='add'>+ */</div><div class='add'>+#ifndef FTW_ACTIONRETVAL</div><div class='add'>+#define FTW_ACTIONRETVAL 0</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+int debug = 0;</div><div class='add'>+</div><div class='add'>+typedef struct {</div><div class='add'>+    char test_directory[4096];</div><div class='add'>+    char **ignored_directory;</div><div class='add'>+    unsigned int directories_ignored;</div><div class='add'>+} arequal_config_t;</div><div class='add'>+</div><div class='add'>+static arequal_config_t arequal_config;</div><div class='add'>+</div><div class='add'>+static error_t</div><div class='add'>+arequal_parse_opts(int key, char *arg, struct argp_state *_state);</div><div class='add'>+</div><div class='add'>+static struct argp_option arequal_options[] = {</div><div class='add'>+    {"ignore", 'i', "IGNORED", 0, "entry in the given path to be ignored"},</div><div class='add'>+    {"path", 'p', "PATH", 0, "path where arequal has to be run"},</div><div class='add'>+    {0, 0, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+#define DBG(fmt...)                                                            \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        if (debug) {                                                           \</div><div class='add'>+            fprintf(stderr, "D ");                                             \</div><div class='add'>+            fprintf(stderr, fmt);                                              \</div><div class='add'>+        }                                                                      \</div><div class='add'>+    } while (0)</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+add_to_list(char *arg);</div><div class='add'>+void</div><div class='add'>+get_absolute_path(char directory[], char *arg);</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+roof(int a, int b)</div><div class='add'>+{</div><div class='add'>+    return ((((a) + (b)-1) / ((b) ? (b) : 1)) * (b));</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+add_to_list(char *arg)</div><div class='add'>+{</div><div class='add'>+    char *string = NULL;</div><div class='add'>+    int index = 0;</div><div class='add'>+</div><div class='add'>+    index = arequal_config.directories_ignored - 1;</div><div class='add'>+    string = strdup(arg);</div><div class='add'>+</div><div class='add'>+    if (!arequal_config.ignored_directory) {</div><div class='add'>+        arequal_config.ignored_directory = calloc(1, sizeof(char *));</div><div class='add'>+    } else</div><div class='add'>+        arequal_config.ignored_directory = realloc(</div><div class='add'>+            arequal_config.ignored_directory, sizeof(char *) * (index + 1));</div><div class='add'>+</div><div class='add'>+    arequal_config.ignored_directory[index] = string;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static error_t</div><div class='add'>+arequal_parse_opts(int key, char *arg, struct argp_state *_state)</div><div class='add'>+{</div><div class='add'>+    switch (key) {</div><div class='add'>+        case 'i': {</div><div class='add'>+            arequal_config.directories_ignored++;</div><div class='add'>+            add_to_list(arg);</div><div class='add'>+        } break;</div><div class='add'>+        case 'p': {</div><div class='add'>+            if (arg[0] == '/')</div><div class='add'>+                strcpy(arequal_config.test_directory, arg);</div><div class='add'>+            else</div><div class='add'>+                get_absolute_path(arequal_config.test_directory, arg);</div><div class='add'>+</div><div class='add'>+            if (arequal_config</div><div class='add'>+                    .test_directory[strlen(arequal_config.test_directory) -</div><div class='add'>+                                    1] == '/')</div><div class='add'>+                arequal_config</div><div class='add'>+                    .test_directory[strlen(arequal_config.test_directory) - 1] =</div><div class='add'>+                    '\0';</div><div class='add'>+        } break;</div><div class='add'>+</div><div class='add'>+        case ARGP_KEY_NO_ARGS:</div><div class='add'>+            break;</div><div class='add'>+        case ARGP_KEY_ARG:</div><div class='add'>+            break;</div><div class='add'>+        case ARGP_KEY_END:</div><div class='add'>+            if (_state-&gt;argc == 1) {</div><div class='add'>+                argp_usage(_state);</div><div class='add'>+            }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+get_absolute_path(char directory[], char *arg)</div><div class='add'>+{</div><div class='add'>+    char cwd[4096] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    if (getcwd(cwd, sizeof(cwd)) == NULL)</div><div class='add'>+        printf("some error in getting cwd\n");</div><div class='add'>+</div><div class='add'>+    if (strcmp(arg, ".") != 0) {</div><div class='add'>+        if (cwd[strlen(cwd)] != '/')</div><div class='add'>+            cwd[strlen(cwd)] = '/';</div><div class='add'>+        strcat(cwd, arg);</div><div class='add'>+    }</div><div class='add'>+    strcpy(directory, cwd);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static struct argp argp = {</div><div class='add'>+    arequal_options, arequal_parse_opts, "",</div><div class='add'>+    "arequal - Tool which calculates the checksum of all the entries"</div><div class='add'>+    "present in a given directory"};</div><div class='add'>+</div><div class='add'>+/* All this runs in single thread, hence using 'global' variables */</div><div class='add'>+</div><div class='add'>+unsigned long long avg_uid_file = 0;</div><div class='add'>+unsigned long long avg_uid_dir = 0;</div><div class='add'>+unsigned long long avg_uid_symlink = 0;</div><div class='add'>+unsigned long long avg_uid_other = 0;</div><div class='add'>+</div><div class='add'>+unsigned long long avg_gid_file = 0;</div><div class='add'>+unsigned long long avg_gid_dir = 0;</div><div class='add'>+unsigned long long avg_gid_symlink = 0;</div><div class='add'>+unsigned long long avg_gid_other = 0;</div><div class='add'>+</div><div class='add'>+unsigned long long avg_mode_file = 0;</div><div class='add'>+unsigned long long avg_mode_dir = 0;</div><div class='add'>+unsigned long long avg_mode_symlink = 0;</div><div class='add'>+unsigned long long avg_mode_other = 0;</div><div class='add'>+</div><div class='add'>+unsigned long long global_ctime_checksum = 0;</div><div class='add'>+</div><div class='add'>+unsigned long long count_dir = 0;</div><div class='add'>+unsigned long long count_file = 0;</div><div class='add'>+unsigned long long count_symlink = 0;</div><div class='add'>+unsigned long long count_other = 0;</div><div class='add'>+</div><div class='add'>+unsigned long long checksum_file1 = 0;</div><div class='add'>+unsigned long long checksum_file2 = 0;</div><div class='add'>+unsigned long long checksum_dir = 0;</div><div class='add'>+unsigned long long checksum_symlink = 0;</div><div class='add'>+unsigned long long checksum_other = 0;</div><div class='add'>+</div><div class='add'>+unsigned long long</div><div class='add'>+checksum_path(const char *path)</div><div class='add'>+{</div><div class='add'>+    unsigned long long csum = 0;</div><div class='add'>+    unsigned long long *nums = 0;</div><div class='add'>+    int len = 0;</div><div class='add'>+    int cnt = 0;</div><div class='add'>+</div><div class='add'>+    len = roof(strlen(path), sizeof(csum));</div><div class='add'>+    cnt = len / sizeof(csum);</div><div class='add'>+</div><div class='add'>+    nums = __builtin_alloca(len);</div><div class='add'>+    memset(nums, 0, len);</div><div class='add'>+    strcpy((char *)nums, path);</div><div class='add'>+</div><div class='add'>+    while (cnt) {</div><div class='add'>+        csum ^= *nums;</div><div class='add'>+        nums++;</div><div class='add'>+        cnt--;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return csum;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+checksum_md5(const char *path, const struct stat *sb)</div><div class='add'>+{</div><div class='add'>+    uint64_t this_data_checksum = 0;</div><div class='add'>+    FILE *filep = NULL;</div><div class='add'>+    char *cmd = NULL;</div><div class='add'>+    char strvalue[17] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int len = 0;</div><div class='add'>+    const char *pos = NULL;</div><div class='add'>+    char *cpos = NULL;</div><div class='add'>+</div><div class='add'>+    /* Have to escape single-quotes in filename.</div><div class='add'>+     * First, calculate the size of the buffer I'll need.</div><div class='add'>+     */</div><div class='add'>+    for (pos = path; *pos; pos++) {</div><div class='add'>+        if (*pos == '\'')</div><div class='add'>+            len += 4;</div><div class='add'>+        else</div><div class='add'>+            len += 1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    cmd = malloc(sizeof(char) * (len + 20));</div><div class='add'>+    cmd[0] = '\0';</div><div class='add'>+</div><div class='add'>+    /* Now, build the command with single quotes escaped. */</div><div class='add'>+</div><div class='add'>+    cpos = cmd;</div><div class='add'>+#if defined(linux)</div><div class='add'>+    strcpy(cpos, "md5sum '");</div><div class='add'>+    cpos += 8;</div><div class='add'>+#elif defined(__NetBSD__)</div><div class='add'>+    strcpy(cpos, "md5 -n '");</div><div class='add'>+    cpos += 8;</div><div class='add'>+#elif defined(__FreeBSD__) || defined(__APPLE__)</div><div class='add'>+    strcpy(cpos, "md5 -q '");</div><div class='add'>+    cpos += 8;</div><div class='add'>+#else</div><div class='add'>+#error "Please add system-specific md5 command"</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+    /* Add the file path, with every single quotes replaced with this sequence:</div><div class='add'>+     * '\''</div><div class='add'>+     */</div><div class='add'>+</div><div class='add'>+    for (pos = path; *pos; pos++) {</div><div class='add'>+        if (*pos == '\'') {</div><div class='add'>+            strcpy(cpos, "'\\''");</div><div class='add'>+            cpos += 4;</div><div class='add'>+        } else {</div><div class='add'>+            *cpos = *pos;</div><div class='add'>+            cpos++;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Add on the trailing single-quote and null-terminate. */</div><div class='add'>+    strcpy(cpos, "'");</div><div class='add'>+</div><div class='add'>+    filep = popen(cmd, "r");</div><div class='add'>+    if (!filep) {</div><div class='add'>+        perror(path);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (fread(strvalue, sizeof(char), 16, filep) != 16) {</div><div class='add'>+        fprintf(stderr, "%s: short read\n", path);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    this_data_checksum = strtoull(strvalue, NULL, 16);</div><div class='add'>+    if (-1 == this_data_checksum) {</div><div class='add'>+        fprintf(stderr, "%s: %s\n", strvalue, strerror(errno));</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    checksum_file1 ^= this_data_checksum;</div><div class='add'>+</div><div class='add'>+    if (fread(strvalue, sizeof(char), 16, filep) != 16) {</div><div class='add'>+        fprintf(stderr, "%s: short read\n", path);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    this_data_checksum = strtoull(strvalue, NULL, 16);</div><div class='add'>+    if (-1 == this_data_checksum) {</div><div class='add'>+        fprintf(stderr, "%s: %s\n", strvalue, strerror(errno));</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    checksum_file2 ^= this_data_checksum;</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+out:</div><div class='add'>+    if (filep)</div><div class='add'>+        pclose(filep);</div><div class='add'>+</div><div class='add'>+    if (cmd)</div><div class='add'>+        free(cmd);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+checksum_filenames(const char *path, const struct stat *sb)</div><div class='add'>+{</div><div class='add'>+    DIR *dirp = NULL;</div><div class='add'>+    struct dirent *entry = NULL;</div><div class='add'>+    unsigned long long csum = 0;</div><div class='add'>+    int i = 0;</div><div class='add'>+    int found = 0;</div><div class='add'>+</div><div class='add'>+    dirp = opendir(path);</div><div class='add'>+    if (!dirp) {</div><div class='add'>+        perror(path);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    errno = 0;</div><div class='add'>+    while ((entry = readdir(dirp))) {</div><div class='add'>+        /* do not calculate the checksum of the entries which user has</div><div class='add'>+           told to ignore and proceed to other siblings.*/</div><div class='add'>+        if (arequal_config.ignored_directory) {</div><div class='add'>+            for (i = 0; i &lt; arequal_config.directories_ignored; i++) {</div><div class='add'>+                if ((strcmp(entry-&gt;d_name,</div><div class='add'>+                            arequal_config.ignored_directory[i]) == 0)) {</div><div class='add'>+                    found = 1;</div><div class='add'>+                    DBG("ignoring the entry %s\n", entry-&gt;d_name);</div><div class='add'>+                    break;</div><div class='add'>+                }</div><div class='add'>+            }</div><div class='add'>+            if (found == 1) {</div><div class='add'>+                found = 0;</div><div class='add'>+                continue;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+        csum = checksum_path(entry-&gt;d_name);</div><div class='add'>+        checksum_dir ^= csum;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (errno) {</div><div class='add'>+        perror(path);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (dirp)</div><div class='add'>+        closedir(dirp);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+process_file(const char *path, const struct stat *sb)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    count_file++;</div><div class='add'>+</div><div class='add'>+    avg_uid_file ^= sb-&gt;st_uid;</div><div class='add'>+    avg_gid_file ^= sb-&gt;st_gid;</div><div class='add'>+    avg_mode_file ^= sb-&gt;st_mode;</div><div class='add'>+</div><div class='add'>+    ret = checksum_md5(path, sb);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+process_dir(const char *path, const struct stat *sb)</div><div class='add'>+{</div><div class='add'>+    unsigned long long csum = 0;</div><div class='add'>+</div><div class='add'>+    count_dir++;</div><div class='add'>+</div><div class='add'>+    avg_uid_dir ^= sb-&gt;st_uid;</div><div class='add'>+    avg_gid_dir ^= sb-&gt;st_gid;</div><div class='add'>+    avg_mode_dir ^= sb-&gt;st_mode;</div><div class='add'>+</div><div class='add'>+    csum = checksum_filenames(path, sb);</div><div class='add'>+</div><div class='add'>+    checksum_dir ^= csum;</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+process_symlink(const char *path, const struct stat *sb)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+    char buf[4096] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    unsigned long long csum = 0;</div><div class='add'>+</div><div class='add'>+    count_symlink++;</div><div class='add'>+</div><div class='add'>+    avg_uid_symlink ^= sb-&gt;st_uid;</div><div class='add'>+    avg_gid_symlink ^= sb-&gt;st_gid;</div><div class='add'>+    avg_mode_symlink ^= sb-&gt;st_mode;</div><div class='add'>+</div><div class='add'>+    ret = readlink(path, buf, 4096);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        perror(path);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    DBG("readlink (%s) =&gt; %s\n", path, buf);</div><div class='add'>+</div><div class='add'>+    csum = checksum_path(buf);</div><div class='add'>+</div><div class='add'>+    DBG("checksum_path (%s) =&gt; %llx\n", buf, csum);</div><div class='add'>+</div><div class='add'>+    checksum_symlink ^= csum;</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+process_other(const char *path, const struct stat *sb)</div><div class='add'>+{</div><div class='add'>+    count_other++;</div><div class='add'>+</div><div class='add'>+    avg_uid_other ^= sb-&gt;st_uid;</div><div class='add'>+    avg_gid_other ^= sb-&gt;st_gid;</div><div class='add'>+    avg_mode_other ^= sb-&gt;st_mode;</div><div class='add'>+</div><div class='add'>+    checksum_other ^= sb-&gt;st_rdev;</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+ignore_entry(const char *bname, const char *dname)</div><div class='add'>+{</div><div class='add'>+    int i;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; arequal_config.directories_ignored; i++) {</div><div class='add'>+        if (strcmp(bname, arequal_config.ignored_directory[i]) == 0 &amp;&amp;</div><div class='add'>+            strncmp(arequal_config.test_directory, dname,</div><div class='add'>+                    strlen(arequal_config.test_directory)) == 0)</div><div class='add'>+            return 1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+process_entry(const char *path, const struct stat *sb, int typeflag,</div><div class='add'>+              struct FTW *ftwbuf)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+    char *name = NULL;</div><div class='add'>+    char *bname = NULL;</div><div class='add'>+    char *dname = NULL;</div><div class='add'>+    int i = 0;</div><div class='add'>+</div><div class='add'>+    /* The if condition below helps in ignoring some directories in</div><div class='add'>+       the given path. If the name of the entry is one of the directory</div><div class='add'>+       names that the user told to ignore, then that directory will not</div><div class='add'>+       be processed and will return FTW_SKIP_SUBTREE to nftw which will</div><div class='add'>+       not crawl this directory and move on to other siblings.</div><div class='add'>+       Note that for nftw to recognize FTW_SKIP_TREE, FTW_ACTIONRETVAL</div><div class='add'>+       should be passed as an argument to nftw.</div><div class='add'>+</div><div class='add'>+       This mainly helps in calculating the checksum of network filesystems</div><div class='add'>+       (client-server), where the server might have some hidden directories</div><div class='add'>+       for managing the filesystem. So to calculate the sanity of filesystem</div><div class='add'>+       one has to get the checksum of the client and then the export directory</div><div class='add'>+       of server by telling arequal to ignore some of the directories which</div><div class='add'>+       are not part of the namespace.</div><div class='add'>+    */</div><div class='add'>+</div><div class='add'>+    if (arequal_config.ignored_directory) {</div><div class='add'>+#ifndef FTW_SKIP_SUBTREE</div><div class='add'>+        char *cp;</div><div class='add'>+</div><div class='add'>+        name = strdup(path);</div><div class='add'>+        dname = dirname(name);</div><div class='add'>+</div><div class='add'>+        for (cp = strtok(name, "/"); cp; cp = strtok(NULL, "/")) {</div><div class='add'>+            if (ignore_entry(cp, dname)) {</div><div class='add'>+                DBG("ignoring %s\n", path);</div><div class='add'>+                if (name)</div><div class='add'>+                    free(name);</div><div class='add'>+                return 0;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+#else  /* FTW_SKIP_SUBTREE */</div><div class='add'>+        name = strdup(path);</div><div class='add'>+</div><div class='add'>+        name[strlen(name)] = '\0';</div><div class='add'>+</div><div class='add'>+        bname = strrchr(name, '/');</div><div class='add'>+        if (bname)</div><div class='add'>+            bname++;</div><div class='add'>+</div><div class='add'>+        dname = dirname(name);</div><div class='add'>+        if (ignore_entry(bname, dname)) {</div><div class='add'>+            DBG("ignoring %s\n", bname);</div><div class='add'>+            ret = FTW_SKIP_SUBTREE;</div><div class='add'>+            if (name)</div><div class='add'>+                free(name);</div><div class='add'>+            return ret;</div><div class='add'>+        }</div><div class='add'>+#endif /* FTW_SKIP_SUBTREE */</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    DBG("processing entry %s\n", path);</div><div class='add'>+</div><div class='add'>+    switch ((S_IFMT &amp; sb-&gt;st_mode)) {</div><div class='add'>+        case S_IFDIR:</div><div class='add'>+            ret = process_dir(path, sb);</div><div class='add'>+            break;</div><div class='add'>+        case S_IFREG:</div><div class='add'>+            ret = process_file(path, sb);</div><div class='add'>+            break;</div><div class='add'>+        case S_IFLNK:</div><div class='add'>+            ret = process_symlink(path, sb);</div><div class='add'>+            break;</div><div class='add'>+        default:</div><div class='add'>+            ret = process_other(path, sb);</div><div class='add'>+            break;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (name)</div><div class='add'>+        free(name);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+display_counts(FILE *fp)</div><div class='add'>+{</div><div class='add'>+    fprintf(fp, "\n");</div><div class='add'>+    fprintf(fp, "Entry counts\n");</div><div class='add'>+    fprintf(fp, "Regular files   : %lld\n", count_file);</div><div class='add'>+    fprintf(fp, "Directories     : %lld\n", count_dir);</div><div class='add'>+    fprintf(fp, "Symbolic links  : %lld\n", count_symlink);</div><div class='add'>+    fprintf(fp, "Other           : %lld\n", count_other);</div><div class='add'>+    fprintf(fp, "Total           : %lld\n",</div><div class='add'>+            (count_file + count_dir + count_symlink + count_other));</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+display_checksums(FILE *fp)</div><div class='add'>+{</div><div class='add'>+    fprintf(fp, "\n");</div><div class='add'>+    fprintf(fp, "Checksums\n");</div><div class='add'>+    fprintf(fp, "Regular files   : %llx%llx\n", checksum_file1, checksum_file2);</div><div class='add'>+    fprintf(fp, "Directories     : %llx\n", checksum_dir);</div><div class='add'>+    fprintf(fp, "Symbolic links  : %llx\n", checksum_symlink);</div><div class='add'>+    fprintf(fp, "Other           : %llx\n", checksum_other);</div><div class='add'>+    fprintf(fp, "Total           : %llx\n",</div><div class='add'>+            (checksum_file1 ^ checksum_file2 ^ checksum_dir ^ checksum_symlink ^</div><div class='add'>+             checksum_other));</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+display_metadata(FILE *fp)</div><div class='add'>+{</div><div class='add'>+    fprintf(fp, "\n");</div><div class='add'>+    fprintf(fp, "Metadata checksums\n");</div><div class='add'>+    fprintf(fp, "Regular files   : %llx\n",</div><div class='add'>+            (avg_uid_file + 13) * (avg_gid_file + 11) * (avg_mode_file + 7));</div><div class='add'>+    fprintf(fp, "Directories     : %llx\n",</div><div class='add'>+            (avg_uid_dir + 13) * (avg_gid_dir + 11) * (avg_mode_dir + 7));</div><div class='add'>+    fprintf(fp, "Symbolic links  : %llx\n",</div><div class='add'>+            (avg_uid_symlink + 13) * (avg_gid_symlink + 11) *</div><div class='add'>+                (avg_mode_symlink + 7));</div><div class='add'>+    fprintf(fp, "Other           : %llx\n",</div><div class='add'>+            (avg_uid_other + 13) * (avg_gid_other + 11) * (avg_mode_other + 7));</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+display_stats(FILE *fp)</div><div class='add'>+{</div><div class='add'>+    display_counts(fp);</div><div class='add'>+</div><div class='add'>+    display_metadata(fp);</div><div class='add'>+</div><div class='add'>+    display_checksums(fp);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+main(int argc, char *argv[])</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+    int i = 0;</div><div class='add'>+</div><div class='add'>+    ret = argp_parse(&amp;argp, argc, argv, 0, 0, NULL);</div><div class='add'>+    if (ret != 0) {</div><div class='add'>+        fprintf(stderr, "parsing arguments failed\n");</div><div class='add'>+        return -2;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Use FTW_ACTIONRETVAL to take decision on what to do depending upon */</div><div class='add'>+    /* the return value of the callback function */</div><div class='add'>+    /* (process_entry in this case) */</div><div class='add'>+    ret = nftw(arequal_config.test_directory, process_entry, 30,</div><div class='add'>+               FTW_ACTIONRETVAL | FTW_PHYS | FTW_MOUNT);</div><div class='add'>+    if (ret != 0) {</div><div class='add'>+        fprintf(stderr, "ftw (%s) returned %d (%s), terminating\n", argv[1],</div><div class='add'>+                ret, strerror(errno));</div><div class='add'>+        return 1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    display_stats(stdout);</div><div class='add'>+</div><div class='add'>+    if (arequal_config.ignored_directory) {</div><div class='add'>+        for (i = 0; i &lt; arequal_config.directories_ignored; i++) {</div><div class='add'>+            if (arequal_config.ignored_directory[i])</div><div class='add'>+                free(arequal_config.ignored_directory[i]);</div><div class='add'>+        }</div><div class='add'>+        free(arequal_config.ignored_directory);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='head'>diff --git a/tests/utils/changelog/changelog.h b/tests/utils/changelog/changelog.h<br/>new file mode 100644<br/>index 00000000000..1502b689eb4<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/utils/changelog/changelog.h?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/utils/changelog/changelog.h</a></div><div class='hunk'>@@ -0,0 +1,125 @@</div><div class='add'>+/*</div><div class='add'>+   Copyright (c) 2013 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+   This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+   This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+   General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+   later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+   cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#ifndef _GF_CHANGELOG_H</div><div class='add'>+#define _GF_CHANGELOG_H</div><div class='add'>+</div><div class='add'>+struct gf_brick_spec;</div><div class='add'>+</div><div class='add'>+/**</div><div class='add'>+ * Max bit shiter for event selection</div><div class='add'>+ */</div><div class='add'>+#define CHANGELOG_EV_SELECTION_RANGE 5</div><div class='add'>+</div><div class='add'>+#define CHANGELOG_OP_TYPE_JOURNAL (1 &lt;&lt; 0)</div><div class='add'>+#define CHANGELOG_OP_TYPE_OPEN (1 &lt;&lt; 1)</div><div class='add'>+#define CHANGELOG_OP_TYPE_CREATE (1 &lt;&lt; 2)</div><div class='add'>+#define CHANGELOG_OP_TYPE_RELEASE (1 &lt;&lt; 3)</div><div class='add'>+#define CHANGELOG_OP_TYPE_BR_RELEASE                                           \</div><div class='add'>+    (1 &lt;&lt; 4) /* logical release (last close()),                                \</div><div class='add'>+                sent by bitrot stub */</div><div class='add'>+#define CHANGELOG_OP_TYPE_MAX (1 &lt;&lt; CHANGELOG_EV_SELECTION_RANGE)</div><div class='add'>+</div><div class='add'>+struct ev_open {</div><div class='add'>+    unsigned char gfid[16];</div><div class='add'>+    int32_t flags;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct ev_creat {</div><div class='add'>+    unsigned char gfid[16];</div><div class='add'>+    int32_t flags;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct ev_release {</div><div class='add'>+    unsigned char gfid[16];</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct ev_release_br {</div><div class='add'>+    unsigned long version;</div><div class='add'>+    unsigned char gfid[16];</div><div class='add'>+    int32_t sign_info;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct ev_changelog {</div><div class='add'>+    char path[PATH_MAX];</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+typedef struct changelog_event {</div><div class='add'>+    unsigned int ev_type;</div><div class='add'>+</div><div class='add'>+    union {</div><div class='add'>+        struct ev_open open;</div><div class='add'>+        struct ev_creat create;</div><div class='add'>+        struct ev_release release;</div><div class='add'>+        struct ev_changelog journal;</div><div class='add'>+        struct ev_release_br releasebr;</div><div class='add'>+    } u;</div><div class='add'>+} changelog_event_t;</div><div class='add'>+</div><div class='add'>+#define CHANGELOG_EV_SIZE (sizeof(changelog_event_t))</div><div class='add'>+</div><div class='add'>+/**</div><div class='add'>+ * event callback, connected &amp; disconnection defs</div><div class='add'>+ */</div><div class='add'>+typedef void(CALLBACK)(void *, char *, void *, changelog_event_t *);</div><div class='add'>+typedef void *(INIT)(void *, struct gf_brick_spec *);</div><div class='add'>+typedef void(FINI)(void *, char *, void *);</div><div class='add'>+typedef void(CONNECT)(void *, char *, void *);</div><div class='add'>+typedef void(DISCONNECT)(void *, char *, void *);</div><div class='add'>+</div><div class='add'>+struct gf_brick_spec {</div><div class='add'>+    char *brick_path;</div><div class='add'>+    unsigned int filter;</div><div class='add'>+</div><div class='add'>+    INIT *init;</div><div class='add'>+    FINI *fini;</div><div class='add'>+    CALLBACK *callback;</div><div class='add'>+    CONNECT *connected;</div><div class='add'>+    DISCONNECT *disconnected;</div><div class='add'>+</div><div class='add'>+    void *ptr;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+/* API set */</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+gf_changelog_register(char *brick_path, char *scratch_dir, char *log_file,</div><div class='add'>+                      int log_levl, int max_reconnects);</div><div class='add'>+ssize_t</div><div class='add'>+gf_changelog_scan();</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+gf_changelog_start_fresh();</div><div class='add'>+</div><div class='add'>+ssize_t</div><div class='add'>+gf_changelog_next_change(char *bufptr, size_t maxlen);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+gf_changelog_done(char *file);</div><div class='add'>+</div><div class='add'>+/* newer flexible API */</div><div class='add'>+int</div><div class='add'>+gf_changelog_init(void *xl);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+gf_changelog_register_generic(struct gf_brick_spec *bricks, int count,</div><div class='add'>+                              int ordered, char *logfile, int lvl, void *xl);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+gf_history_changelog(char *changelog_dir, unsigned long start,</div><div class='add'>+                     unsigned long end, int n_parallel,</div><div class='add'>+                     unsigned long *actual_end);</div><div class='add'>+int</div><div class='add'>+gf_history_changelog_scan();</div><div class='add'>+ssize_t</div><div class='add'>+gf_history_changelog_next_change(char *bufptr, size_t maxlen);</div><div class='add'>+int</div><div class='add'>+gf_history_changelog_done(char *file);</div><div class='add'>+#endif</div><div class='head'>diff --git a/tests/utils/changelog/get-history.c b/tests/utils/changelog/get-history.c<br/>new file mode 100644<br/>index 00000000000..9963ab76958<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/utils/changelog/get-history.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/utils/changelog/get-history.c</a></div><div class='hunk'>@@ -0,0 +1,71 @@</div><div class='add'>+/*</div><div class='add'>+   Copyright (c) 2013 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+   This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+   This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+   General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+   later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+   cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+/**</div><div class='add'>+ * get set of new changes every 10 seconds (just print the file names)</div><div class='add'>+ *</div><div class='add'>+ * Compile it using:</div><div class='add'>+ *  gcc -o gethistory `pkg-config --cflags libgfchangelog` get-history.c \</div><div class='add'>+ *  `pkg-config --libs libgfchangelog`</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+#include &lt;stdio.h&gt;</div><div class='add'>+#include &lt;stdlib.h&gt;</div><div class='add'>+#include &lt;unistd.h&gt;</div><div class='add'>+#include &lt;sys/un.h&gt;</div><div class='add'>+#include &lt;limits.h&gt;</div><div class='add'>+#include &lt;sys/socket.h&gt;</div><div class='add'>+#include &lt;sys/types.h&gt;</div><div class='add'>+</div><div class='add'>+#include "changelog.h"</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+main(int argc, char **argv)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+    unsigned long end_ts = 0;</div><div class='add'>+    int start = 0;</div><div class='add'>+    int end = 0;</div><div class='add'>+</div><div class='add'>+    ret = gf_changelog_init(NULL);</div><div class='add'>+    if (ret) {</div><div class='add'>+        printf("-1");</div><div class='add'>+        fflush(stdout);</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = gf_changelog_register("/d/backends/patchy0", "/tmp/scratch_v1",</div><div class='add'>+                                "/var/log/glusterfs/changes.log", 9, 5);</div><div class='add'>+    if (ret) {</div><div class='add'>+        printf("-2");</div><div class='add'>+        fflush(stdout);</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    start = atoi(argv[1]);</div><div class='add'>+    end = atoi(argv[2]);</div><div class='add'>+</div><div class='add'>+    ret = gf_history_changelog("/d/backends/patchy0/.glusterfs/changelogs",</div><div class='add'>+                               start, end, 3, &amp;end_ts);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        printf("-3");</div><div class='add'>+        fflush(stdout);</div><div class='add'>+        return -1;</div><div class='add'>+    } else if (ret == 1) {</div><div class='add'>+        printf("1");</div><div class='add'>+        fflush(stdout);</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    printf("0");</div><div class='add'>+    fflush(stdout);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='head'>diff --git a/tests/utils/changelog/test-changelog-api.c b/tests/utils/changelog/test-changelog-api.c<br/>new file mode 100644<br/>index 00000000000..f4eb066b630<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/utils/changelog/test-changelog-api.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/utils/changelog/test-changelog-api.c</a></div><div class='hunk'>@@ -0,0 +1,98 @@</div><div class='add'>+/*</div><div class='add'>+   Copyright (c) 2019 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+   This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+   This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+   General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+   later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+   cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+/**</div><div class='add'>+ * get set of new changes every 5 seconds (just print the file names)</div><div class='add'>+ *</div><div class='add'>+ * Compile it using:</div><div class='add'>+ *  gcc -o getchanges `pkg-config --cflags libgfchangelog` get-changes.c \</div><div class='add'>+ *  `pkg-config --libs libgfchangelog`</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+#include &lt;stdio.h&gt;</div><div class='add'>+#include &lt;stdlib.h&gt;</div><div class='add'>+#include &lt;unistd.h&gt;</div><div class='add'>+#include &lt;sys/un.h&gt;</div><div class='add'>+#include &lt;limits.h&gt;</div><div class='add'>+#include &lt;sys/socket.h&gt;</div><div class='add'>+#include &lt;sys/types.h&gt;</div><div class='add'>+#include &lt;errno.h&gt;</div><div class='add'>+</div><div class='add'>+#include "changelog.h"</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+main(int argc, char **argv)</div><div class='add'>+{</div><div class='add'>+    int i = 0;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    ssize_t nr_changes = 0;</div><div class='add'>+    ssize_t changes = 0;</div><div class='add'>+    char fbuf[PATH_MAX] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    ret = gf_changelog_init(NULL);</div><div class='add'>+    if (ret) {</div><div class='add'>+        printf("-1");</div><div class='add'>+        fflush(stdout);</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* get changes for brick "/d/backends/patchy0" */</div><div class='add'>+    ret = gf_changelog_register("/d/backends/patchy0", "/tmp/scratch_v1",</div><div class='add'>+                                "/var/log/glusterfs/changes.log", 9, 5);</div><div class='add'>+    if (ret) {</div><div class='add'>+        printf("-2");</div><div class='add'>+        fflush(stdout);</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    while (1) {</div><div class='add'>+        i = 0;</div><div class='add'>+        nr_changes = gf_changelog_scan();</div><div class='add'>+        if (nr_changes &lt; 0) {</div><div class='add'>+            printf("-4");</div><div class='add'>+            fflush(stdout);</div><div class='add'>+            return -1;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        if (nr_changes == 0)</div><div class='add'>+            goto next;</div><div class='add'>+</div><div class='add'>+        while ((changes = gf_changelog_next_change(fbuf, PATH_MAX)) &gt; 0) {</div><div class='add'>+            /* process changelog */</div><div class='add'>+            /* ... */</div><div class='add'>+            /* ... */</div><div class='add'>+            /* ... */</div><div class='add'>+            /* done processing */</div><div class='add'>+</div><div class='add'>+            ret = gf_changelog_done(fbuf);</div><div class='add'>+            if (ret) {</div><div class='add'>+                printf("-5");</div><div class='add'>+                fflush(stdout);</div><div class='add'>+                return -1;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        if (changes == -1) {</div><div class='add'>+            printf("-6");</div><div class='add'>+            fflush(stdout);</div><div class='add'>+            return -1;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+    next:</div><div class='add'>+        sleep(2);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    printf("0");</div><div class='add'>+    fflush(stdout);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='head'>diff --git a/tests/utils/changelog/test-history-api.c b/tests/utils/changelog/test-history-api.c<br/>new file mode 100644<br/>index 00000000000..d78e387df10<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/utils/changelog/test-history-api.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/utils/changelog/test-history-api.c</a></div><div class='hunk'>@@ -0,0 +1,111 @@</div><div class='add'>+/*</div><div class='add'>+   Copyright (c) 2013 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+   This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+   This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+   General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+   later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+   cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+/**</div><div class='add'>+ * get set of new changes every 10 seconds (just print the file names)</div><div class='add'>+ *</div><div class='add'>+ * Compile it using:</div><div class='add'>+ *  gcc -o gethistory `pkg-config --cflags libgfchangelog` get-history.c \</div><div class='add'>+ *  `pkg-config --libs libgfchangelog`</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+#include &lt;stdio.h&gt;</div><div class='add'>+#include &lt;stdlib.h&gt;</div><div class='add'>+#include &lt;unistd.h&gt;</div><div class='add'>+#include &lt;sys/un.h&gt;</div><div class='add'>+#include &lt;limits.h&gt;</div><div class='add'>+#include &lt;sys/socket.h&gt;</div><div class='add'>+#include &lt;sys/types.h&gt;</div><div class='add'>+</div><div class='add'>+#include "changelog.h"</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+main(int argc, char **argv)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+    int i = 0;</div><div class='add'>+    unsigned long end_ts = 0;</div><div class='add'>+    ssize_t nr_changes = 0;</div><div class='add'>+    ssize_t changes = 0;</div><div class='add'>+    int start = 0;</div><div class='add'>+    int end = 0;</div><div class='add'>+    char fbuf[PATH_MAX] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    ret = gf_changelog_init(NULL);</div><div class='add'>+    if (ret) {</div><div class='add'>+        printf("-1");</div><div class='add'>+        fflush(stdout);</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = gf_changelog_register("/d/backends/patchy0", "/tmp/scratch_v1",</div><div class='add'>+                                "/var/log/glusterfs/changes.log", 9, 5);</div><div class='add'>+    if (ret) {</div><div class='add'>+        printf("-2");</div><div class='add'>+        fflush(stdout);</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    start = atoi(argv[1]);</div><div class='add'>+    end = atoi(argv[2]);</div><div class='add'>+</div><div class='add'>+    ret = gf_history_changelog("/d/backends/patchy0/.glusterfs/changelogs",</div><div class='add'>+                               start, end, 3, &amp;end_ts);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        printf("-3");</div><div class='add'>+        fflush(stdout);</div><div class='add'>+        return -1;</div><div class='add'>+    } else if (ret == 1) {</div><div class='add'>+        printf("1");</div><div class='add'>+        fflush(stdout);</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    while (1) {</div><div class='add'>+        nr_changes = gf_history_changelog_scan();</div><div class='add'>+        if (nr_changes &lt; 0) {</div><div class='add'>+            printf("-4");</div><div class='add'>+            fflush(stdout);</div><div class='add'>+            return -1;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        if (nr_changes == 0) {</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        while ((changes = gf_history_changelog_next_change(fbuf, PATH_MAX)) &gt;</div><div class='add'>+               0) {</div><div class='add'>+            /* process changelog */</div><div class='add'>+            /* ... */</div><div class='add'>+            /* ... */</div><div class='add'>+            /* ... */</div><div class='add'>+            /* done processing */</div><div class='add'>+</div><div class='add'>+            ret = gf_history_changelog_done(fbuf);</div><div class='add'>+            if (ret) {</div><div class='add'>+                printf("-5");</div><div class='add'>+                fflush(stdout);</div><div class='add'>+                return -1;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+        if (changes == -1) {</div><div class='add'>+            printf("-6");</div><div class='add'>+            fflush(stdout);</div><div class='add'>+            return -1;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    printf("0");</div><div class='add'>+    fflush(stdout);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='head'>diff --git a/tests/utils/changelogparser.py b/tests/utils/changelogparser.py<br/>new file mode 100644<br/>index 00000000000..3b8f81d1bad<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/utils/changelogparser.py?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/utils/changelogparser.py</a></div><div class='hunk'>@@ -0,0 +1,236 @@</div><div class='add'>+# -*- coding: utf-8 -*-</div><div class='add'>+"""</div><div class='add'>+Why?</div><div class='add'>+</div><div class='add'>+Converts this</div><div class='add'>+</div><div class='add'>+GlusterFS Changelog | version: v1.1 | encoding : 2</div><div class='add'>+E0b99ef11-4b79-4cd0-9730-b5a0e8c4a8c0^@4^@16877^@0^@0^@00000000-0000-0000-0000-</div><div class='add'>+000000000001/dir1^@Ec5250af6-720e-4bfe-b938-827614304f39^@23^@33188^@0^@0^@0b99</div><div class='add'>+ef11-4b79-4cd0-9730-b5a0e8c4a8c0/hello.txt^@Dc5250af6-720e-4bfe-b938-827614304f</div><div class='add'>+39^@Dc5250af6-720e-4bfe-b938-827614304f39^@</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+to human readable :)</div><div class='add'>+</div><div class='add'>+E 0b99ef11-4b79-4cd0-9730-b5a0e8c4a8c0 MKDIR 16877 0 000000000-0000-0000-0000</div><div class='add'>+  -000000000001/dir1</div><div class='add'>+E c5250af6-720e-4bfe-b938-827614304f39 CREATE 33188 0 0 0b99ef11-4b79-4cd0-9730</div><div class='add'>+  -b5a0e8c4a8c0/hello.txt</div><div class='add'>+D c5250af6-720e-4bfe-b938-827614304f39</div><div class='add'>+D c5250af6-720e-4bfe-b938-827614304f39</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+"""</div><div class='add'>+import sys</div><div class='add'>+import codecs</div><div class='add'>+</div><div class='add'>+ENTRY = 'E'</div><div class='add'>+META = 'M'</div><div class='add'>+DATA = 'D'</div><div class='add'>+SEP = "\x00"</div><div class='add'>+</div><div class='add'>+GF_FOP = [</div><div class='add'>+    "NULL", "STAT", "READLINK", "MKNOD", "MKDIR", "UNLINK",</div><div class='add'>+    "RMDIR", "SYMLINK", "RENAME", "LINK", "TRUNCATE", "OPEN",</div><div class='add'>+    "READ", "WRITE", "STATFS", "FLUSH", "FSYNC", "SETXATTR",</div><div class='add'>+    "GETXATTR", "REMOVEXATTR", "OPENDIR", "FSYNCDIR", "ACCESS",</div><div class='add'>+    "CREATE", "FTRUNCATE", "FSTAT", "LK", "LOOKUP", "READDIR",</div><div class='add'>+    "INODELK", "FINODELK", "ENTRYLK", "FENTRYLK", "XATTROP",</div><div class='add'>+    "FXATTROP", "FSETXATTR", "FGETXATTR", "RCHECKSUM", "SETATTR",</div><div class='add'>+    "FSETATTR", "READDIRP", "GETSPEC", "FORGET", "RELEASE",</div><div class='add'>+    "RELEASEDIR", "FREMOVEXATTR", "FALLOCATE", "DISCARD", "ZEROFILL"]</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+class NumTokens_V11(object):</div><div class='add'>+    E = 7</div><div class='add'>+    M = 3</div><div class='add'>+    D = 2</div><div class='add'>+    NULL = 3</div><div class='add'>+    MKNOD = 7</div><div class='add'>+    MKDIR = 7</div><div class='add'>+    UNLINK = 4</div><div class='add'>+    RMDIR = 4</div><div class='add'>+    SYMLINK = 4</div><div class='add'>+    RENAME = 5</div><div class='add'>+    LINK = 4</div><div class='add'>+    SETXATTR = 3</div><div class='add'>+    REMOVEXATTR = 3</div><div class='add'>+    CREATE = 7</div><div class='add'>+    SETATTR = 3</div><div class='add'>+    FTRUNCATE = 3</div><div class='add'>+    FXATTROP = 3</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+class NumTokens_V12(NumTokens_V11):</div><div class='add'>+    UNLINK = 5</div><div class='add'>+    RMDIR = 5</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+class Version:</div><div class='add'>+    V11 = "v1.1"</div><div class='add'>+    V12 = "v1.2"</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+class Record(object):</div><div class='add'>+    def __init__(self, **kwargs):</div><div class='add'>+        self.ts = kwargs.get("ts", None)</div><div class='add'>+        self.fop_type = kwargs.get("fop_type", None)</div><div class='add'>+        self.gfid = kwargs.get("gfid", None)</div><div class='add'>+        self.path = kwargs.get("path", None)</div><div class='add'>+        self.fop = kwargs.get("fop", None)</div><div class='add'>+        self.path1 = kwargs.get("path1", None)</div><div class='add'>+        self.path2 = kwargs.get("path2", None)</div><div class='add'>+        self.mode = kwargs.get("mode", None)</div><div class='add'>+        self.uid = kwargs.get("uid", None)</div><div class='add'>+        self.gid = kwargs.get("gid", None)</div><div class='add'>+</div><div class='add'>+    def create_mknod_mkdir(self, **kwargs):</div><div class='add'>+        self.path = kwargs.get("path", None)</div><div class='add'>+        self.fop = kwargs.get("fop", None)</div><div class='add'>+        self.mode = kwargs.get("mode", None)</div><div class='add'>+        self.uid = kwargs.get("uid", None)</div><div class='add'>+        self.gid = kwargs.get("gid", None)</div><div class='add'>+</div><div class='add'>+    def metadata(self, **kwargs):</div><div class='add'>+        self.fop = kwargs.get("fop", None)</div><div class='add'>+</div><div class='add'>+    def rename(self, **kwargs):</div><div class='add'>+        self.fop = kwargs.get("fop", None)</div><div class='add'>+        self.path1 = kwargs.get("path1", None)</div><div class='add'>+        self.path2 = kwargs.get("path2", None)</div><div class='add'>+</div><div class='add'>+    def link_symlink_unlink_rmdir(self, **kwargs):</div><div class='add'>+        self.path = kwargs.get("path", None)</div><div class='add'>+        self.fop = kwargs.get("fop", None)</div><div class='add'>+</div><div class='add'>+    def __unicode__(self):</div><div class='add'>+        if self.fop_type == "D":</div><div class='add'>+            return u"{ts} {fop_type} {gfid}".format(**self.__dict__)</div><div class='add'>+        elif self.fop_type == "M":</div><div class='add'>+            return u"{ts} {fop_type} {gfid} {fop}".format(**self.__dict__)</div><div class='add'>+        elif self.fop_type == "E":</div><div class='add'>+            if self.fop in ["CREATE", "MKNOD", "MKDIR"]:</div><div class='add'>+                return (u"{ts} {fop_type} {gfid} {fop} "</div><div class='add'>+                        u"{path} {mode} {uid} {gid}".format(**self.__dict__))</div><div class='add'>+            elif self.fop == "RENAME":</div><div class='add'>+                return (u"{ts} {fop_type} {gfid} {fop} "</div><div class='add'>+                        u"{path1} {path2}".format(**self.__dict__))</div><div class='add'>+            elif self.fop in ["LINK", "SYMLINK", "UNLINK", "RMDIR"]:</div><div class='add'>+                return (u"{ts} {fop_type} {gfid} {fop} "</div><div class='add'>+                        u"{path}".format(**self.__dict__))</div><div class='add'>+            else:</div><div class='add'>+                return repr(self.__dict__)</div><div class='add'>+        else:</div><div class='add'>+            return repr(self.__dict__)</div><div class='add'>+</div><div class='add'>+    def __str__(self):</div><div class='add'>+        if sys.version_info &gt;= (3,):</div><div class='add'>+            return self.__unicode__()</div><div class='add'>+        else:</div><div class='add'>+            return unicode(self).encode('utf-8')</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def get_num_tokens(data, tokens, version=Version.V11):</div><div class='add'>+    if version == Version.V11:</div><div class='add'>+        cls_numtokens = NumTokens_V11</div><div class='add'>+    elif version == Version.V12:</div><div class='add'>+        cls_numtokens = NumTokens_V12</div><div class='add'>+    else:</div><div class='add'>+        sys.stderr.write("Unknown Changelog Version\n")</div><div class='add'>+        sys.exit(1)</div><div class='add'>+</div><div class='add'>+    if data[tokens[0]] in [ENTRY, META]:</div><div class='add'>+        if len(tokens) &gt;= 3:</div><div class='add'>+            return getattr(cls_numtokens, GF_FOP[int(data[tokens[2]])])</div><div class='add'>+        else:</div><div class='add'>+            return None</div><div class='add'>+    else:</div><div class='add'>+        return getattr(cls_numtokens, data[tokens[0]])</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def process_record(data, tokens, changelog_ts, callback):</div><div class='add'>+    if data[tokens[0]] in [ENTRY, META]:</div><div class='add'>+        try:</div><div class='add'>+            tokens[2] = GF_FOP[int(data[tokens[2]])]</div><div class='add'>+        except ValueError:</div><div class='add'>+            tokens[2] = "NULL"</div><div class='add'>+</div><div class='add'>+    if not changelog_ts:</div><div class='add'>+        ts1 = int(changelog_ts)</div><div class='add'>+    else:</div><div class='add'>+        ts1=""</div><div class='add'>+    record = Record(ts=ts1, fop_type=data[tokens[0]],</div><div class='add'>+                    gfid=data[tokens[1]])</div><div class='add'>+    if data[tokens[0]] == META:</div><div class='add'>+        record.metadata(fop=tokens[2])</div><div class='add'>+    elif data[tokens[0]] == ENTRY:</div><div class='add'>+        if tokens[2] in ["CREATE", "MKNOD", "MKDIR"]:</div><div class='add'>+            record.create_mknod_mkdir(fop=tokens[2],</div><div class='add'>+                                      path=data[tokens[6]],</div><div class='add'>+                                      mode=int(data[tokens[3]]),</div><div class='add'>+                                      uid=int(data[tokens[4]]),</div><div class='add'>+                                      gid=int(data[tokens[5]]))</div><div class='add'>+        elif tokens[2] == "RENAME":</div><div class='add'>+            record.rename(fop=tokens[2],</div><div class='add'>+                          path1=data[tokens[3]],</div><div class='add'>+                          path2=data[tokens[4]])</div><div class='add'>+        if tokens[2] in ["LINK", "SYMLINK", "UNLINK", "RMDIR"]:</div><div class='add'>+            record.link_symlink_unlink_rmdir(fop=tokens[2],</div><div class='add'>+                                             path=data[tokens[3]])</div><div class='add'>+    callback(record)</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def default_callback(record):</div><div class='add'>+    sys.stdout.write(u"{0}\n".format(record))</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def parse(filename, callback=default_callback):</div><div class='add'>+    data = None</div><div class='add'>+    tokens = []</div><div class='add'>+    changelog_ts = filename.rsplit(".")[-1]</div><div class='add'>+    with codecs.open(filename, mode="rb", encoding="utf-8") as f:</div><div class='add'>+        # GlusterFS Changelog | version: v1.1 | encoding : 2</div><div class='add'>+        header = f.readline()</div><div class='add'>+        version = header.split()[4]</div><div class='add'>+</div><div class='add'>+        data = f.readline()</div><div class='add'>+</div><div class='add'>+        slice_start = 0</div><div class='add'>+        in_record = False</div><div class='add'>+</div><div class='add'>+        prev_char = ""</div><div class='add'>+        next_char = ""</div><div class='add'>+        for i, c in enumerate(data):</div><div class='add'>+            next_char = ""</div><div class='add'>+            if len(data) &gt;= (i + 2):</div><div class='add'>+                next_char = data[i+1]</div><div class='add'>+</div><div class='add'>+            if not in_record and c in [ENTRY, META, DATA]:</div><div class='add'>+                tokens.append(slice(slice_start, i+1))</div><div class='add'>+                slice_start = i+1</div><div class='add'>+                in_record = True</div><div class='add'>+                continue</div><div class='add'>+</div><div class='add'>+            if c == SEP and ((prev_char != SEP and next_char == SEP) or</div><div class='add'>+                             (prev_char == SEP and next_char != SEP) or</div><div class='add'>+                             (prev_char != SEP and next_char != SEP)):</div><div class='add'>+                tokens.append(slice(slice_start, i))</div><div class='add'>+                slice_start = i+1</div><div class='add'>+</div><div class='add'>+                num_tokens = get_num_tokens(data, tokens, version)</div><div class='add'>+</div><div class='add'>+                if num_tokens == len(tokens):</div><div class='add'>+                    process_record(data, tokens, changelog_ts, callback)</div><div class='add'>+                    in_record = False</div><div class='add'>+                    tokens = []</div><div class='add'>+</div><div class='add'>+            prev_char = c</div><div class='add'>+</div><div class='add'>+        # process last record</div><div class='add'>+        if slice_start &lt; (len(data) - 1):</div><div class='add'>+            tokens.append(slice(slice_start, len(data)))</div><div class='add'>+            process_record(data, tokens, changelog_ts, callback)</div><div class='add'>+            tokens = []</div><div class='add'>+</div><div class='add'>+parse(sys.argv[1])</div><div class='head'>diff --git a/tests/utils/create-files.py b/tests/utils/create-files.py<br/>new file mode 100755<br/>index 00000000000..04736e9c73b<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/utils/create-files.py?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/utils/create-files.py</a></div><div class='hunk'>@@ -0,0 +1,593 @@</div><div class='add'>+</div><div class='add'>+# This script was developed by Vijaykumar Koppad (vkoppad@redhat.com)</div><div class='add'>+# The latest version of this script can found at</div><div class='add'>+# http://github.com/vijaykumar-koppad/crefi</div><div class='add'>+</div><div class='add'>+from __future__ import with_statement</div><div class='add'>+import os</div><div class='add'>+import re</div><div class='add'>+import sys</div><div class='add'>+import time</div><div class='add'>+import errno</div><div class='add'>+import xattr</div><div class='add'>+import string</div><div class='add'>+import random</div><div class='add'>+import logging</div><div class='add'>+import tarfile</div><div class='add'>+import argparse</div><div class='add'>+</div><div class='add'>+datsiz = 0</div><div class='add'>+timr = 0</div><div class='add'>+</div><div class='add'>+def get_ascii_upper_alpha_digits():</div><div class='add'>+    if sys.version_info &gt; (3,0):</div><div class='add'>+        return string.ascii_uppercase+string.digits</div><div class='add'>+    else:</div><div class='add'>+        return string.uppercase+string.digits</div><div class='add'>+</div><div class='add'>+def setLogger(filename):</div><div class='add'>+    global logger</div><div class='add'>+    logger = logging.getLogger(filename)</div><div class='add'>+    logger.setLevel(logging.DEBUG)</div><div class='add'>+    return</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def setupLogger(filename):</div><div class='add'>+    logger = logging.getLogger(filename)</div><div class='add'>+    logger.setLevel(logging.DEBUG)</div><div class='add'>+    formatter = logging.Formatter('%(asctime)s - %(message)s')</div><div class='add'>+    ch = logging.StreamHandler()</div><div class='add'>+    ch.setLevel(logging.INFO)</div><div class='add'>+    ch.setFormatter(formatter)</div><div class='add'>+    logger.addHandler(ch)</div><div class='add'>+    return logger</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def os_rd(src, size):</div><div class='add'>+    global datsiz</div><div class='add'>+    fd = os.open(src, os.O_RDONLY)</div><div class='add'>+    data = os.read(fd, size)</div><div class='add'>+    os.close(fd)</div><div class='add'>+    datsiz = datsiz + size</div><div class='add'>+    return data</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def os_wr(dest, data):</div><div class='add'>+    global timr</div><div class='add'>+    st = time.time()</div><div class='add'>+    fd = os.open(dest, os.O_WRONLY | os.O_CREAT | os.O_EXCL, 0o644)</div><div class='add'>+    os.write(fd, data)</div><div class='add'>+    os.close(fd)</div><div class='add'>+    ed = time.time()</div><div class='add'>+    timr = timr+(ed-st)</div><div class='add'>+    return</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def create_sparse_file(fil, size, mins, maxs, rand):</div><div class='add'>+    if rand:</div><div class='add'>+        size = random.randint(mins, maxs)</div><div class='add'>+    else:</div><div class='add'>+        size = size</div><div class='add'>+    data = os_rd("/dev/zero", size)</div><div class='add'>+    os_wr(fil, data)</div><div class='add'>+    return</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def create_binary_file(fil, size, mins, maxs, rand):</div><div class='add'>+    if rand:</div><div class='add'>+        size = random.randint(mins, maxs)</div><div class='add'>+    else:</div><div class='add'>+        size = size</div><div class='add'>+    data = os_rd("/dev/urandom", size)</div><div class='add'>+    os_wr(fil, data)</div><div class='add'>+    return</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def create_txt_file(fil, size, mins, maxs, rand):</div><div class='add'>+    if rand:</div><div class='add'>+        size = random.randint(mins, maxs)</div><div class='add'>+    if size &lt; 500*1024:</div><div class='add'>+        data = os_rd("/etc/services", size)</div><div class='add'>+        os_wr(fil, data)</div><div class='add'>+    else:</div><div class='add'>+        data = os_rd("/etc/services", 512*1024)</div><div class='add'>+        file_size = 0</div><div class='add'>+        fd = os.open(fil, os.O_WRONLY | os.O_CREAT | os.O_EXCL, 0o644)</div><div class='add'>+        while file_size &lt; size:</div><div class='add'>+            os.write(fd, data)</div><div class='add'>+            file_size += 500*1024</div><div class='add'>+        os.close(fd)</div><div class='add'>+    return</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def create_tar_file(fil, size, mins, maxs, rand):</div><div class='add'>+    if rand:</div><div class='add'>+        size = random.randint(mins, maxs)</div><div class='add'>+    else:</div><div class='add'>+        size = size</div><div class='add'>+    data = os_rd("/dev/urandom", size)</div><div class='add'>+    os_wr(fil, data)</div><div class='add'>+    tar = tarfile.open(fil+".tar.gz",  "w:gz")</div><div class='add'>+    tar.add(fil)</div><div class='add'>+    tar.close()</div><div class='add'>+    os.unlink(fil)</div><div class='add'>+    return</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def get_filename(flen):</div><div class='add'>+    size = flen</div><div class='add'>+    char = get_ascii_upper_alpha_digits()</div><div class='add'>+    st = ''.join(random.choice(char) for i in range(size))</div><div class='add'>+    ti = str((hex(int(str(time.time()).split('.')[0])))[2:])</div><div class='add'>+    return ti+"%%"+st</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def text_files(files, file_count, inter, size, mins, maxs, rand,</div><div class='add'>+               flen, randname, dir_path):</div><div class='add'>+    global datsiz, timr</div><div class='add'>+    for k in range(files):</div><div class='add'>+        if not file_count % inter:</div><div class='add'>+            logger.info("Total files created -- "+str(file_count))</div><div class='add'>+        if not randname:</div><div class='add'>+            fil = dir_path+"/"+"file"+str(k)</div><div class='add'>+        else:</div><div class='add'>+            fil = dir_path+"/"+get_filename(flen)</div><div class='add'>+        create_txt_file(fil, size, mins, maxs, rand)</div><div class='add'>+        file_count += 1</div><div class='add'>+    return file_count</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def sparse_files(files, file_count, inter, size, mins, maxs,</div><div class='add'>+                 rand, flen, randname, dir_path):</div><div class='add'>+    for k in range(files):</div><div class='add'>+        if not file_count % inter:</div><div class='add'>+            logger.info("Total files created -- "+str(file_count))</div><div class='add'>+        if not randname:</div><div class='add'>+            fil = dir_path+"/"+"file"+str(k)</div><div class='add'>+        else:</div><div class='add'>+            fil = dir_path+"/"+get_filename(flen)</div><div class='add'>+        create_sparse_file(fil, size, mins, maxs, rand)</div><div class='add'>+        file_count += 1</div><div class='add'>+    return file_count</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def binary_files(files, file_count, inter, size, mins, maxs,</div><div class='add'>+                 rand, flen, randname, dir_path):</div><div class='add'>+    for k in range(files):</div><div class='add'>+        if not file_count % inter:</div><div class='add'>+            logger.info("Total files created -- "+str(file_count))</div><div class='add'>+        if not randname:</div><div class='add'>+            fil = dir_path+"/"+"file"+str(k)</div><div class='add'>+        else:</div><div class='add'>+            fil = dir_path+"/"+get_filename(flen)</div><div class='add'>+        create_binary_file(fil, size, mins, maxs, rand)</div><div class='add'>+        file_count += 1</div><div class='add'>+    return file_count</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def tar_files(files, file_count, inter, size, mins, maxs,</div><div class='add'>+              rand, flen, randname, dir_path):</div><div class='add'>+    for k in range(files):</div><div class='add'>+        if not file_count % inter:</div><div class='add'>+            logger.info("Total files created -- "+str(file_count))</div><div class='add'>+        if not randname:</div><div class='add'>+            fil = dir_path+"/"+"file"+str(k)</div><div class='add'>+        else:</div><div class='add'>+            fil = dir_path+"/"+get_filename(flen)</div><div class='add'>+        create_tar_file(fil, size, mins, maxs, rand)</div><div class='add'>+        file_count += 1</div><div class='add'>+    return file_count</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def setxattr_files(files, randname, dir_path):</div><div class='add'>+    char = get_ascii_upper_alpha_digits()</div><div class='add'>+    if not randname:</div><div class='add'>+        for k in range(files):</div><div class='add'>+            v = ''.join(random.choice(char) for i in range(10))</div><div class='add'>+            n = "user."+v</div><div class='add'>+            xattr.setxattr(dir_path+"/"+"file"+str(k), n, v)</div><div class='add'>+    else:</div><div class='add'>+        dirs = os.listdir(dir_path+"/")</div><div class='add'>+        for fil in dirs:</div><div class='add'>+            v = ''.join(random.choice(char) for i in range(10))</div><div class='add'>+            n = "user."+v</div><div class='add'>+            xattr.setxattr(dir_path+"/"+fil, n, v)</div><div class='add'>+    return</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def rename_files(files, flen, randname, dir_path):</div><div class='add'>+    if not randname:</div><div class='add'>+        for k in range(files):</div><div class='add'>+            os.rename(dir_path + "/" + "file" + str(k),</div><div class='add'>+                      dir_path + "/" + "file" + str(files+k))</div><div class='add'>+    else:</div><div class='add'>+        dirs = os.listdir(dir_path)</div><div class='add'>+        for fil in dirs:</div><div class='add'>+            if not os.path.isdir(fil):</div><div class='add'>+                newfil = get_filename(flen)</div><div class='add'>+                os.rename(dir_path + "/" + fil,</div><div class='add'>+                          dir_path + "/" + newfil)</div><div class='add'>+    return</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def truncate_files(files, mins, maxs, randname, dir_path):</div><div class='add'>+    if not randname:</div><div class='add'>+        for k in range(files):</div><div class='add'>+            byts = random.randint(mins, maxs)</div><div class='add'>+            fd = os.open(dir_path + "/" + "file" + str(k), os.O_WRONLY)</div><div class='add'>+            os.ftruncate(fd, byts)</div><div class='add'>+            os.close(fd)</div><div class='add'>+    else:</div><div class='add'>+        dirs = os.listdir(dir_path)</div><div class='add'>+        for fil in dirs:</div><div class='add'>+            if not os.path.isdir(dir_path+"/"+fil):</div><div class='add'>+                byts = random.randint(mins, maxs)</div><div class='add'>+                fd = os.open(dir_path+"/"+fil, os.O_WRONLY)</div><div class='add'>+                os.ftruncate(fd, byts)</div><div class='add'>+                os.close(fd)</div><div class='add'>+    return</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def chmod_files(files, flen, randname, dir_path):</div><div class='add'>+    if not randname:</div><div class='add'>+        for k in range(files):</div><div class='add'>+            mod = random.randint(0, 511)</div><div class='add'>+            os.chmod(dir_path+"/"+"file"+str(k), mod)</div><div class='add'>+    else:</div><div class='add'>+        dirs = os.listdir(dir_path)</div><div class='add'>+        for fil in dirs:</div><div class='add'>+            mod = random.randint(0, 511)</div><div class='add'>+            os.chmod(dir_path+"/"+fil, mod)</div><div class='add'>+    return</div><div class='add'>+</div><div class='add'>+def random_og(path):</div><div class='add'>+    u = random.randint(1025, 65536)</div><div class='add'>+    g = -1</div><div class='add'>+    os.chown(path, u, g)</div><div class='add'>+</div><div class='add'>+def chown_files(files, flen, randname, dir_path):</div><div class='add'>+    if not randname:</div><div class='add'>+        for k in range(files):</div><div class='add'>+            random_og(dir_path+"/"+"file"+str(k))</div><div class='add'>+    else:</div><div class='add'>+        dirs = os.listdir(dir_path)</div><div class='add'>+        for fil in dirs:</div><div class='add'>+            random_og(dir_path+"/"+fil)</div><div class='add'>+    return</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def chgrp_files(files, flen, randname, dir_path):</div><div class='add'>+    if not randname:</div><div class='add'>+        for k in range(files):</div><div class='add'>+            random_og(dir_path+"/"+"file"+str(k))</div><div class='add'>+    else:</div><div class='add'>+        dirs = os.listdir(dir_path)</div><div class='add'>+        for fil in dirs:</div><div class='add'>+            random_og(dir_path+"/"+fil)</div><div class='add'>+    return</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def symlink_files(files, flen, randname, dir_path):</div><div class='add'>+    try:</div><div class='add'>+        os.makedirs(dir_path+"/"+"symlink_to_files")</div><div class='add'>+    except OSError as ex:</div><div class='add'>+        if ex.errno is not errno.EEXIST:</div><div class='add'>+            raise</div><div class='add'>+    if not randname:</div><div class='add'>+        for k in range(files):</div><div class='add'>+            src_file = "file"+str(k)</div><div class='add'>+            os.symlink(dir_path+"/"+src_file,</div><div class='add'>+                       dir_path+"/"+"symlink_to_files/file"+str(k)+"_sym")</div><div class='add'>+    else:</div><div class='add'>+        dirs = os.listdir(dir_path)</div><div class='add'>+        for fil in dirs:</div><div class='add'>+            newfil = get_filename(flen)</div><div class='add'>+            os.symlink(dir_path+"/"+fil,</div><div class='add'>+                       dir_path+"/"+"symlink_to_files/"+newfil)</div><div class='add'>+    return</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def hardlink_files(files, flen, randname, dir_path):</div><div class='add'>+    try:</div><div class='add'>+        os.makedirs(dir_path+"/"+"hardlink_to_files")</div><div class='add'>+    except OSError as ex:</div><div class='add'>+        if ex.errno is not errno.EEXIST:</div><div class='add'>+            raise</div><div class='add'>+    if not randname:</div><div class='add'>+        for k in range(files):</div><div class='add'>+            src_file = "file"+str(k)</div><div class='add'>+            os.link(dir_path+"/"+src_file,</div><div class='add'>+                    dir_path+"/"+"hardlink_to_files/file"+str(k)+"_hard")</div><div class='add'>+    else:</div><div class='add'>+        dirs = os.listdir(dir_path)</div><div class='add'>+        for fil in dirs:</div><div class='add'>+            if not os.path.isdir(dir_path+"/"+fil):</div><div class='add'>+                newfil = get_filename(flen)</div><div class='add'>+                os.link(dir_path+"/"+fil,</div><div class='add'>+                        dir_path+"/"+"hardlink_to_files/"+newfil)</div><div class='add'>+    return</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def human2bytes(size):</div><div class='add'>+    size_short = {</div><div class='add'>+        1024: ['K', 'KB', 'KiB', 'k', 'kB', 'kiB'],</div><div class='add'>+        1024*1024: ['M', 'MB', 'MiB'],</div><div class='add'>+        1024*1024*1024: ['G', 'GB', 'GiB']</div><div class='add'>+    }</div><div class='add'>+    num = re.search('(\d+)', size).group()</div><div class='add'>+    ext = size[len(num):]</div><div class='add'>+    num = int(num)</div><div class='add'>+    if ext == '':</div><div class='add'>+        return num</div><div class='add'>+    for value, keys in size_short.items():</div><div class='add'>+        if ext in keys:</div><div class='add'>+            size = num*value</div><div class='add'>+            return size</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def bytes2human(byts):</div><div class='add'>+    abbr = {</div><div class='add'>+        1 &lt;&lt; 30: "GB",</div><div class='add'>+        1 &lt;&lt; 20: "MB",</div><div class='add'>+        1 &lt;&lt; 10: "KB",</div><div class='add'>+        1: "bytes"</div><div class='add'>+    }</div><div class='add'>+    if byts == 1:</div><div class='add'>+        return '1 bytes'</div><div class='add'>+    for factor, suffix in abbr.items():</div><div class='add'>+        if byts &gt;= factor:</div><div class='add'>+            break</div><div class='add'>+    return "%.3f %s" % (byts / factor, suffix)</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def multipledir(mnt_pnt, brdth, depth, files, fop, file_type="text",</div><div class='add'>+                inter="1000", size="100K", mins="10K", maxs="500K",</div><div class='add'>+                rand=False, l=10, randname=False):</div><div class='add'>+    files_count = 1</div><div class='add'>+    size = human2bytes(size)</div><div class='add'>+    maxs = human2bytes(maxs)</div><div class='add'>+    mins = human2bytes(mins)</div><div class='add'>+    for i in range(brdth):</div><div class='add'>+        dir_path = mnt_pnt</div><div class='add'>+        for j in range(depth):</div><div class='add'>+            dir_path = dir_path+"/"+"level"+str(j)+str(i)</div><div class='add'>+            try:</div><div class='add'>+                os.makedirs(dir_path)</div><div class='add'>+            except OSError as ex:</div><div class='add'>+                if ex.errno is not errno.EEXIST:</div><div class='add'>+                    raise</div><div class='add'>+</div><div class='add'>+            if fop == "create":</div><div class='add'>+                logger.info("Entering the directory level"+str(j)+str(i))</div><div class='add'>+                if file_type == "text":</div><div class='add'>+                    files_count = text_files(files, files_count, inter, size,</div><div class='add'>+                                             mins, maxs, rand, l, randname,</div><div class='add'>+                                             dir_path)</div><div class='add'>+                elif file_type == "sparse":</div><div class='add'>+                    files_count = sparse_files(files, files_count, inter, size,</div><div class='add'>+                                               mins, maxs, rand, l, randname,</div><div class='add'>+                                               dir_path)</div><div class='add'>+                elif file_type == "binary":</div><div class='add'>+                    files_count = binary_files(files, files_count, inter, size,</div><div class='add'>+                                               mins, maxs, rand, l, randname,</div><div class='add'>+                                               dir_path)</div><div class='add'>+                elif file_type == "tar":</div><div class='add'>+                    files_count = tar_files(files, files_count, inter, size,</div><div class='add'>+                                            mins, maxs, rand, l, randname,</div><div class='add'>+                                            dir_path)</div><div class='add'>+                else:</div><div class='add'>+                    logger.error("Not a valid file type")</div><div class='add'>+                    sys.exit(1)</div><div class='add'>+</div><div class='add'>+            elif fop == "rename":</div><div class='add'>+                logger.info("Started renaming files for the files 0 to " +</div><div class='add'>+                            str(files)+" in the directory level"+str(j) +</div><div class='add'>+                            str(i)+" ...")</div><div class='add'>+                rename_files(files, l, randname, dir_path)</div><div class='add'>+                logger.info("Finished renaming files for the files 0 to " +</div><div class='add'>+                            str(files)+" in the directory level"+str(j)+str(i))</div><div class='add'>+</div><div class='add'>+            elif fop == "chmod":</div><div class='add'>+                logger.info("Started changing permission of files for the " +</div><div class='add'>+                            "files 0 to "+str(files)+" in the directory level"</div><div class='add'>+                            + str(j)+str(i)+" ...")</div><div class='add'>+                chmod_files(files, l, randname, dir_path)</div><div class='add'>+                logger.info("Finished changing permission of files for " +</div><div class='add'>+                            "the files 0 to "+str(files) +</div><div class='add'>+                            " in the directory level"+str(j)+str(i))</div><div class='add'>+</div><div class='add'>+            elif fop == "chown":</div><div class='add'>+                logger.info("Started changing ownership of files for the " +</div><div class='add'>+                            "files 0 to " + str(files) +</div><div class='add'>+                            " in the directory level"+str(j)+str(i)+" ...")</div><div class='add'>+                chown_files(files, l, randname, dir_path)</div><div class='add'>+                logger.info("Finished changing ownership of files for " +</div><div class='add'>+                            "the files 0 to "+str(files) +</div><div class='add'>+                            " in the directory level"+str(j)+str(i))</div><div class='add'>+</div><div class='add'>+            elif fop == "chgrp":</div><div class='add'>+                logger.info("Started changing group ownership of files for " +</div><div class='add'>+                            "the files 0 to " + str(files) +</div><div class='add'>+                            " in the directory level"+str(j)+str(i)+" ...")</div><div class='add'>+                chgrp_files(files, l, randname, dir_path)</div><div class='add'>+                logger.info("Finished changing group ownership of files for " +</div><div class='add'>+                            "the files 0 to "+str(files) +</div><div class='add'>+                            " in the directory level"+str(j)+str(i))</div><div class='add'>+</div><div class='add'>+            elif fop == "symlink":</div><div class='add'>+                logger.info("Started creating symlink to the files 0 to " +</div><div class='add'>+                            str(files)+" in the directory level" +</div><div class='add'>+                            str(j)+str(i)+"...")</div><div class='add'>+                symlink_files(files, l, randname, dir_path)</div><div class='add'>+                logger.info("Finished creating symlink to the files 0 to " +</div><div class='add'>+                            str(files) + " in the directory level" +</div><div class='add'>+                            str(j)+str(i))</div><div class='add'>+</div><div class='add'>+            elif fop == "hardlink":</div><div class='add'>+                logger.info("Started creating hardlink to the files 0 to " +</div><div class='add'>+                            str(files)+" in the directory level" +</div><div class='add'>+                            str(j)+str(i)+"...")</div><div class='add'>+                hardlink_files(files, l, randname, dir_path)</div><div class='add'>+                logger.info("Finished creating hardlink to the files 0 to " +</div><div class='add'>+                            str(files) + " in the directory level" +</div><div class='add'>+                            str(j)+str(i))</div><div class='add'>+</div><div class='add'>+            elif fop == "truncate":</div><div class='add'>+                logger.info("Started truncating the files 0 to " +</div><div class='add'>+                            str(files)+" in the directory level" +</div><div class='add'>+                            str(j)+str(i)+"...")</div><div class='add'>+                truncate_files(files, mins, maxs, randname, dir_path)</div><div class='add'>+                logger.info("Finished truncating the files 0 to " +</div><div class='add'>+                            str(files)+" in the directory level" +</div><div class='add'>+                            str(j)+str(i))</div><div class='add'>+</div><div class='add'>+            elif fop == "setxattr":</div><div class='add'>+                logger.info("Started setxattr to the files 0 to " +</div><div class='add'>+                            str(files)+" in the directory level" +</div><div class='add'>+                            str(j)+str(i)+"...")</div><div class='add'>+                setxattr_files(files, randname, dir_path)</div><div class='add'>+                logger.info("Finished setxattr to the files 0 to " +</div><div class='add'>+                            str(files)+" in the directory level" +</div><div class='add'>+                            str(j)+str(i))</div><div class='add'>+</div><div class='add'>+    if fop == "create":</div><div class='add'>+        thrpt = datsiz / timr</div><div class='add'>+        logger.info("finished creating files with throughput ---- " +</div><div class='add'>+                    bytes2human(thrpt)+"ps")</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def singledir(mnt_pnt, files, fop, file_type="text", inter="1000", size="100K",</div><div class='add'>+              mins="10K", maxs="500K", rand=False, l=10, randname=False):</div><div class='add'>+</div><div class='add'>+    files_count = 1</div><div class='add'>+    size = human2bytes(size)</div><div class='add'>+    maxs = human2bytes(maxs)</div><div class='add'>+    mins = human2bytes(mins)</div><div class='add'>+    if fop == "create":</div><div class='add'>+        if file_type == "text":</div><div class='add'>+            files_count = text_files(files, files_count, inter, size, mins,</div><div class='add'>+                                     maxs, rand, l, randname, mnt_pnt)</div><div class='add'>+        elif file_type == "sparse":</div><div class='add'>+            files_count = sparse_files(files, files_count, inter, size, mins,</div><div class='add'>+                                       maxs, rand, l, randname, mnt_pnt)</div><div class='add'>+        elif file_type == "binary":</div><div class='add'>+            files_count = binary_files(files, files_count, inter, size, mins,</div><div class='add'>+                                       maxs, rand, l, randname, mnt_pnt)</div><div class='add'>+        elif file_type == "tar":</div><div class='add'>+            files_count = tar_files(files, files_count, inter, size, mins,</div><div class='add'>+                                    maxs, rand, l, randname, mnt_pnt)</div><div class='add'>+        else:</div><div class='add'>+            logger.info("Not a valid file type")</div><div class='add'>+            sys.exit(1)</div><div class='add'>+        thrpt = datsiz / timr</div><div class='add'>+        logger.info("finished creating files with avg throughput ---- " +</div><div class='add'>+                    bytes2human(thrpt)+"ps")</div><div class='add'>+</div><div class='add'>+    elif fop == "rename":</div><div class='add'>+        logger.info("Started renaming files for the files 0 to " +</div><div class='add'>+                    str(files) + "...")</div><div class='add'>+        rename_files(files, l, randname, mnt_pnt)</div><div class='add'>+        logger.info("Finished renaming files for the files 0 to "+str(files))</div><div class='add'>+</div><div class='add'>+    elif fop == "chmod":</div><div class='add'>+        logger.info("Started changing permission for the files 0 to " +</div><div class='add'>+                    str(files)+" ...")</div><div class='add'>+        chmod_files(files, l, randname, mnt_pnt)</div><div class='add'>+        logger.info("Finished changing permission files for the files 0 to " +</div><div class='add'>+                    str(files))</div><div class='add'>+</div><div class='add'>+    elif fop == "chown":</div><div class='add'>+        logger.info("Started changing ownership for the files 0 to " +</div><div class='add'>+                    str(files)+"...")</div><div class='add'>+        chown_files(files, l, randname, mnt_pnt)</div><div class='add'>+        logger.info("Finished changing ownership for the files 0 to " +</div><div class='add'>+                    str(files))</div><div class='add'>+</div><div class='add'>+    elif fop == "chgrp":</div><div class='add'>+        logger.info("Started changing group ownership for the files 0 to " +</div><div class='add'>+                    str(files)+"...")</div><div class='add'>+        chgrp_files(files, l, randname, mnt_pnt)</div><div class='add'>+        logger.info("Finished changing group ownership for the files 0 to " +</div><div class='add'>+                    str(files))</div><div class='add'>+</div><div class='add'>+    elif fop == "symlink":</div><div class='add'>+        logger.info("Started creating symlink to the files 0 to " +</div><div class='add'>+                    str(files)+"...")</div><div class='add'>+        symlink_files(files, l, randname, mnt_pnt)</div><div class='add'>+        logger.info("Finished creating symlink to the files 0 to " +</div><div class='add'>+                    str(files))</div><div class='add'>+</div><div class='add'>+    elif fop == "hardlink":</div><div class='add'>+        logger.info("Started creating hardlink to the files 0 to " +</div><div class='add'>+                    str(files)+"...")</div><div class='add'>+        hardlink_files(files, l, randname, mnt_pnt)</div><div class='add'>+        logger.info("Finished creating hardlink to the files 0 to " +</div><div class='add'>+                    str(files))</div><div class='add'>+</div><div class='add'>+    elif fop == "truncate":</div><div class='add'>+        logger.info("Started truncating the files 0 to " + str(files)+"...")</div><div class='add'>+        truncate_files(files, mins, maxs, randname, mnt_pnt)</div><div class='add'>+        logger.info("Finished truncating the files 0 to " + str(files))</div><div class='add'>+</div><div class='add'>+    elif fop == "setxattr":</div><div class='add'>+        logger.info("Started setxattr to the files 0 to " + str(files)+"...")</div><div class='add'>+        setxattr_files(files, randname, mnt_pnt)</div><div class='add'>+        logger.info("Finished setxattr to the files 0 to " + str(files))</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+if __name__ == '__main__':</div><div class='add'>+    usage = "usage: %prog [option] &lt;MNT_PT&gt;"</div><div class='add'>+    parser = argparse.ArgumentParser(formatter_class=argparse.</div><div class='add'>+                                     ArgumentDefaultsHelpFormatter)</div><div class='add'>+    parser.add_argument("-n", dest="files", type=int, default=100,</div><div class='add'>+                        help="number of files in each level ")</div><div class='add'>+    parser.add_argument("--size", action="store", default="100k",</div><div class='add'>+                        help="size of the files to be used ")</div><div class='add'>+    parser.add_argument("--random",  action="store_true", default=False,</div><div class='add'>+                        help="random size of the file between --min and --max")</div><div class='add'>+    parser.add_argument("--max", action="store", default="500K",</div><div class='add'>+                        help="maximum size of the files, if random is True")</div><div class='add'>+    parser.add_argument("--min", action="store", default="10K",</div><div class='add'>+                        help="minimum size of the files, if random is True")</div><div class='add'>+    parser.add_argument("--single", action="store_true", dest="dir",</div><div class='add'>+                        default=True, help="create files in single directory")</div><div class='add'>+    parser.add_argument("--multi", action="store_false", dest="dir",</div><div class='add'>+                        help="create files in multiple directories")</div><div class='add'>+    parser.add_argument("-b", dest="brdth", type=int, default=5,</div><div class='add'>+                        help="number of directories in one level(works " +</div><div class='add'>+                        "with --multi) ")</div><div class='add'>+    parser.add_argument("-d", dest="depth", type=int, default=5,</div><div class='add'>+                        help="number of levels of directories  (works " +</div><div class='add'>+                        "with --multi) ")</div><div class='add'>+    parser.add_argument("-l", dest="flen", type=int, default=10,</div><div class='add'>+                        help="number of bytes for filename ( Used only when " +</div><div class='add'>+                        "randname is enabled) ")</div><div class='add'>+    parser.add_argument("-t", action="store", dest="file_type",</div><div class='add'>+                        default="text", choices=["text", "sparse", "binary",</div><div class='add'>+                                                 "tar"],</div><div class='add'>+                        help="type of the file to be created ()")</div><div class='add'>+    parser.add_argument("-I", dest="inter", type=int, default=100,</div><div class='add'>+                        help="print number files created of interval")</div><div class='add'>+    parser.add_argument("--fop", action="store", dest="fop", default="create",</div><div class='add'>+                        choices=["create", "rename", "chmod", "chown", "chgrp",</div><div class='add'>+                                 "symlink", "hardlink", "truncate",</div><div class='add'>+                                 "setxattr"],</div><div class='add'>+                        help="fop to be performed on the files")</div><div class='add'>+    parser.add_argument("-R", dest="randname", action="store_false",</div><div class='add'>+                        default=True, help="To disable random file name " +</div><div class='add'>+                        "(default: Enabled)")</div><div class='add'>+    parser.add_argument("mntpnt", help="Mount point")</div><div class='add'>+</div><div class='add'>+    args = parser.parse_args()</div><div class='add'>+    logger = setupLogger("testlost")</div><div class='add'>+    args.mntpnt = os.path.abspath(args.mntpnt)</div><div class='add'>+</div><div class='add'>+    if args.dir:</div><div class='add'>+        singledir(args.mntpnt, args.files, args.fop, args.file_type,</div><div class='add'>+                  args.inter, args.size, args.min, args.max,</div><div class='add'>+                  args.random, args.flen, args.randname)</div><div class='add'>+    else:</div><div class='add'>+        multipledir(args.mntpnt, args.brdth, args.depth, args.files,</div><div class='add'>+                    args.fop, args.file_type, args.inter, args.size,</div><div class='add'>+                    args.min, args.max, args.random, args.flen,</div><div class='add'>+                    args.randname)</div><div class='head'>diff --git a/tests/utils/get-mdata-xattr.c b/tests/utils/get-mdata-xattr.c<br/>new file mode 100644<br/>index 00000000000..e9f54717263<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/utils/get-mdata-xattr.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/utils/get-mdata-xattr.c</a></div><div class='hunk'>@@ -0,0 +1,152 @@</div><div class='add'>+/*</div><div class='add'>+   Copyright (c) 2019 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+   This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+   This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+   General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+   later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+   cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#include &lt;stdlib.h&gt;</div><div class='add'>+#include &lt;endian.h&gt;</div><div class='add'>+#include &lt;stdio.h&gt;</div><div class='add'>+#include &lt;time.h&gt;</div><div class='add'>+#include &lt;string.h&gt;</div><div class='add'>+#include &lt;inttypes.h&gt;</div><div class='add'>+#include &lt;sys/types.h&gt;</div><div class='add'>+#include &lt;sys/xattr.h&gt;</div><div class='add'>+#include &lt;errno.h&gt;</div><div class='add'>+</div><div class='add'>+typedef struct gf_timespec_disk {</div><div class='add'>+    uint64_t tv_sec;</div><div class='add'>+    uint64_t tv_nsec;</div><div class='add'>+} gf_timespec_disk_t;</div><div class='add'>+</div><div class='add'>+/* posix_mdata_t on disk structure */</div><div class='add'>+typedef struct __attribute__((__packed__)) posix_mdata_disk {</div><div class='add'>+    /* version of structure, bumped up if any new member is added */</div><div class='add'>+    uint8_t version;</div><div class='add'>+    /* flags indicates valid fields in the structure */</div><div class='add'>+    uint64_t flags;</div><div class='add'>+    gf_timespec_disk_t ctime;</div><div class='add'>+    gf_timespec_disk_t mtime;</div><div class='add'>+    gf_timespec_disk_t atime;</div><div class='add'>+} posix_mdata_disk_t;</div><div class='add'>+</div><div class='add'>+/* In memory representation posix metadata xattr */</div><div class='add'>+typedef struct {</div><div class='add'>+    /* version of structure, bumped up if any new member is added */</div><div class='add'>+    uint8_t version;</div><div class='add'>+    /* flags indicates valid fields in the structure */</div><div class='add'>+    uint64_t flags;</div><div class='add'>+    struct timespec ctime;</div><div class='add'>+    struct timespec mtime;</div><div class='add'>+    struct timespec atime;</div><div class='add'>+} posix_mdata_t;</div><div class='add'>+</div><div class='add'>+#define GF_XATTR_MDATA_KEY "trusted.glusterfs.mdata"</div><div class='add'>+</div><div class='add'>+/* posix_mdata_from_disk converts posix_mdata_disk_t into host byte order</div><div class='add'>+ */</div><div class='add'>+static inline void</div><div class='add'>+posix_mdata_from_disk(posix_mdata_t *out, posix_mdata_disk_t *in)</div><div class='add'>+{</div><div class='add'>+    out-&gt;version = in-&gt;version;</div><div class='add'>+    out-&gt;flags = be64toh(in-&gt;flags);</div><div class='add'>+</div><div class='add'>+    out-&gt;ctime.tv_sec = be64toh(in-&gt;ctime.tv_sec);</div><div class='add'>+    out-&gt;ctime.tv_nsec = be64toh(in-&gt;ctime.tv_nsec);</div><div class='add'>+</div><div class='add'>+    out-&gt;mtime.tv_sec = be64toh(in-&gt;mtime.tv_sec);</div><div class='add'>+    out-&gt;mtime.tv_nsec = be64toh(in-&gt;mtime.tv_nsec);</div><div class='add'>+</div><div class='add'>+    out-&gt;atime.tv_sec = be64toh(in-&gt;atime.tv_sec);</div><div class='add'>+    out-&gt;atime.tv_nsec = be64toh(in-&gt;atime.tv_nsec);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* posix_fetch_mdata_xattr fetches the posix_mdata_t from disk */</div><div class='add'>+static int</div><div class='add'>+posix_fetch_mdata_xattr(const char *real_path, posix_mdata_t *metadata)</div><div class='add'>+{</div><div class='add'>+    size_t size = -1;</div><div class='add'>+    char *value = NULL;</div><div class='add'>+    char gfid_str[64] = {0};</div><div class='add'>+</div><div class='add'>+    char *key = GF_XATTR_MDATA_KEY;</div><div class='add'>+</div><div class='add'>+    if (!metadata || !real_path) {</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Get size */</div><div class='add'>+    size = lgetxattr(real_path, key, NULL, 0);</div><div class='add'>+    if (size == -1) {</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    value = calloc(size + 1, sizeof(char));</div><div class='add'>+    if (!value) {</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Get xattr value */</div><div class='add'>+    size = lgetxattr(real_path, key, value, size);</div><div class='add'>+    if (size == -1) {</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+    posix_mdata_from_disk(metadata, (posix_mdata_disk_t *)value);</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (value)</div><div class='add'>+        free(value);</div><div class='add'>+    return 0;</div><div class='add'>+err:</div><div class='add'>+    if (value)</div><div class='add'>+        free(value);</div><div class='add'>+    return -1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+main(int argc, char *argv[])</div><div class='add'>+{</div><div class='add'>+    posix_mdata_t metadata;</div><div class='add'>+    uint64_t result;</div><div class='add'>+</div><div class='add'>+    if (argc != 3) {</div><div class='add'>+        /*</div><div class='add'>+        Usage: get_mdata_xattr -c|-m|-a &lt;file-name&gt;</div><div class='add'>+                       where -c --&gt; ctime</div><div class='add'>+                             -m --&gt; mtime</div><div class='add'>+                             -a --&gt; atime</div><div class='add'>+        */</div><div class='add'>+        printf("-1");</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (posix_fetch_mdata_xattr(argv[2], &amp;metadata)) {</div><div class='add'>+        printf("-1");</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    switch (argv[1][1]) {</div><div class='add'>+        case 'c':</div><div class='add'>+            result = metadata.ctime.tv_sec;</div><div class='add'>+            break;</div><div class='add'>+        case 'm':</div><div class='add'>+            result = metadata.mtime.tv_sec;</div><div class='add'>+            break;</div><div class='add'>+        case 'a':</div><div class='add'>+            result = metadata.atime.tv_sec;</div><div class='add'>+            break;</div><div class='add'>+        default:</div><div class='add'>+            printf("-1");</div><div class='add'>+            goto err;</div><div class='add'>+    }</div><div class='add'>+    printf("%" PRIu64, result);</div><div class='add'>+    fflush(stdout);</div><div class='add'>+    return 0;</div><div class='add'>+err:</div><div class='add'>+    fflush(stdout);</div><div class='add'>+    return -1;</div><div class='add'>+}</div><div class='head'>diff --git a/tests/utils/getfattr.py b/tests/utils/getfattr.py<br/>new file mode 100755<br/>index 00000000000..3eb40e1c887<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/utils/getfattr.py?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/utils/getfattr.py</a></div><div class='hunk'>@@ -0,0 +1,133 @@</div><div class='add'>+</div><div class='add'>+from __future__ import print_function</div><div class='add'>+import os</div><div class='add'>+import sys</div><div class='add'>+from optparse import OptionParser</div><div class='add'>+</div><div class='add'>+import xattr</div><div class='add'>+</div><div class='add'>+def handle_textencoding(attr):</div><div class='add'>+    ### required for Python's handling of NULL strings.</div><div class='add'>+    attr_null_replace = (attr.encode('hex').decode('hex')).replace('\x00',</div><div class='add'>+                                                                   '\\000')</div><div class='add'>+    return attr_null_replace</div><div class='add'>+</div><div class='add'>+def getfattr(path, option):</div><div class='add'>+    attr = xattr.getxattr(path, option.name)</div><div class='add'>+    encoded_attr = attr</div><div class='add'>+</div><div class='add'>+    if option.encoding == "text":</div><div class='add'>+        ## special case handle it.</div><div class='add'>+        encoded_attr = handle_textencoding(attr)</div><div class='add'>+    else:</div><div class='add'>+        encoded_attr = attr.encode(option.encoding)</div><div class='add'>+</div><div class='add'>+    if option.onlyvalues:</div><div class='add'>+        print (encoded_attr)</div><div class='add'>+        return</div><div class='add'>+</div><div class='add'>+    print_getfattr (path, option, encoded_attr)</div><div class='add'>+    return</div><div class='add'>+</div><div class='add'>+def print_getfattr (path, option, encoded_attr=None):</div><div class='add'>+    if encoded_attr:</div><div class='add'>+        if option.encoding == "hex":</div><div class='add'>+            print(("%s=0x%s" % (option.name, encoded_attr)))</div><div class='add'>+        elif option.encoding == "base64":</div><div class='add'>+            print(("%s=0s%s" % (option.name, encoded_attr)))</div><div class='add'>+        else:</div><div class='add'>+            print(("%s=\"%s\"" % (option.name, encoded_attr)))</div><div class='add'>+    else:</div><div class='add'>+        print(option.name)</div><div class='add'>+</div><div class='add'>+    return</div><div class='add'>+</div><div class='add'>+def print_header (path, absnames):</div><div class='add'>+    if absnames:</div><div class='add'>+        print(("# file: %s" % path))</div><div class='add'>+    else:</div><div class='add'>+        print ("getfattr: Removing leading '/' from absolute path names")</div><div class='add'>+        print(("# file: %s" % path[1:]))</div><div class='add'>+</div><div class='add'>+if __name__ == '__main__':</div><div class='add'>+    usage = "usage: %prog [-n name|-d] [-e en] [-m pattern] path...."</div><div class='add'>+    parser = OptionParser(usage=usage)</div><div class='add'>+    parser.add_option("-n", action="store", dest="name", type="string",</div><div class='add'>+                      help="Dump the value of the named extended attribute"</div><div class='add'>+                      " extended attribute.")</div><div class='add'>+    parser.add_option("-d", action="store_true", dest="dump",</div><div class='add'>+                      help="Dump the values of all extended attributes"</div><div class='add'>+                      " associated with pathname.")</div><div class='add'>+    parser.add_option("-e", action="store", dest="encoding", type="string",</div><div class='add'>+                      default="base64",</div><div class='add'>+                      help="Encode values after retrieving"</div><div class='add'>+                      " them. Valid values of [en] are `text`, `hex`,"</div><div class='add'>+                      " and `base64`. Values encoded as text strings are"</div><div class='add'>+                      " enclosed in double quotes (\"), while strings"</div><div class='add'>+                      " encoded as hexadecimal and base64 are prefixed with"</div><div class='add'>+                      " 0x and 0s, respectively.")</div><div class='add'>+    parser.add_option("-m", action="store", dest="pattern", type="string",</div><div class='add'>+                      help="Only include attributes with names matching the"</div><div class='add'>+                      " regular expression pattern. The default value for"</div><div class='add'>+                      " pattern is \"^user\\.\", which includes all the"</div><div class='add'>+                      " attributes in the user namespace. Specify \"-\" for"</div><div class='add'>+                      " including all attributes. Refer to attr(5) for a more"</div><div class='add'>+                      " detailed discussion of namespaces.")</div><div class='add'>+    parser.add_option("--absolute-names", action="store_true", dest="absnames",</div><div class='add'>+                      help="Do not strip leading slash characters ('/')."</div><div class='add'>+                      " The default behaviour is to strip leading slash characters.")</div><div class='add'>+    parser.add_option("--only-values", action="store_true", dest="onlyvalues",</div><div class='add'>+                      help="Dump out the raw extended attribute value(s)"</div><div class='add'>+                      " without encoding them.")</div><div class='add'>+</div><div class='add'>+    (option, args) = parser.parse_args()</div><div class='add'>+    if not args:</div><div class='add'>+        print ("Usage: getfattr [-hRLP] [-n name|-d] [-e en] [-m pattern]"</div><div class='add'>+               " path...")</div><div class='add'>+        print ("Try `getfattr --help' for more information.")</div><div class='add'>+        sys.exit(1)</div><div class='add'>+</div><div class='add'>+    if option.dump and option.name:</div><div class='add'>+        print ("-d and -n are mutually exclusive...")</div><div class='add'>+        sys.exit(1)</div><div class='add'>+</div><div class='add'>+    if option.pattern and option.name:</div><div class='add'>+        print ("-m and -n are mutually exclusive...")</div><div class='add'>+        sys.exit(1)</div><div class='add'>+</div><div class='add'>+    if option.encoding:</div><div class='add'>+        if (not (option.encoding.strip() == "hex" or</div><div class='add'>+                 option.encoding.strip() == "base64" or</div><div class='add'>+                 option.encoding.strip() == "text")):</div><div class='add'>+            print(("unrecognized encoding parameter... %s, please use"</div><div class='add'>+                   " `text`, `base64` or `hex`" % option.encoding))</div><div class='add'>+            sys.exit(1)</div><div class='add'>+</div><div class='add'>+    args[0] = os.path.abspath(args[0])</div><div class='add'>+</div><div class='add'>+    if option.name:</div><div class='add'>+        print_header(args[0], option.absnames)</div><div class='add'>+        try:</div><div class='add'>+            getfattr(args[0], option)</div><div class='add'>+        except KeyError as err:</div><div class='add'>+            print(("Invalid key %s" % err))</div><div class='add'>+            sys.exit(1)</div><div class='add'>+        except IOError as err:</div><div class='add'>+            print (err)</div><div class='add'>+            sys.exit(1)</div><div class='add'>+</div><div class='add'>+    if option.pattern:</div><div class='add'>+        print_header(args[0], option.absnames)</div><div class='add'>+        try:</div><div class='add'>+            xattrs = xattr.listxattr(args[0])</div><div class='add'>+            for attr in xattrs:</div><div class='add'>+                if option.dump:</div><div class='add'>+                    option.name = attr.encode('utf-8')</div><div class='add'>+                    getfattr(args[0], option)</div><div class='add'>+                else:</div><div class='add'>+                    option.name = attr.encode('utf-8')</div><div class='add'>+                    print_getfattr(args[0], option, None)</div><div class='add'>+</div><div class='add'>+        except IOError as err:</div><div class='add'>+            print (err)</div><div class='add'>+            sys.exit(1)</div><div class='head'>diff --git a/tests/utils/gfid-access.py b/tests/utils/gfid-access.py<br/>new file mode 100755<br/>index 00000000000..c35c1223df6<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/utils/gfid-access.py?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/utils/gfid-access.py</a></div><div class='hunk'>@@ -0,0 +1,124 @@</div><div class='add'>+#</div><div class='add'>+# Copyright (c) 2011-2014 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+# This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+# This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+# General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+# later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+# cases as published by the Free Software Foundation.</div><div class='add'>+#</div><div class='add'>+</div><div class='add'>+from __future__ import print_function</div><div class='add'>+import os</div><div class='add'>+import sys</div><div class='add'>+import stat</div><div class='add'>+import time</div><div class='add'>+import struct</div><div class='add'>+import random</div><div class='add'>+import libcxattr</div><div class='add'>+</div><div class='add'>+from errno import EEXIST</div><div class='add'>+</div><div class='add'>+Xattr = libcxattr.Xattr()</div><div class='add'>+</div><div class='add'>+def umask():</div><div class='add'>+    return os.umask(0)</div><div class='add'>+</div><div class='add'>+def _fmt_mknod(l):</div><div class='add'>+    return "!II%dsI%dsIII" % (37, l+1)</div><div class='add'>+</div><div class='add'>+def _fmt_mkdir(l):</div><div class='add'>+    return "!II%dsI%dsII" % (37, l+1)</div><div class='add'>+</div><div class='add'>+def _fmt_symlink(l1, l2):</div><div class='add'>+    return "!II%dsI%ds%ds" % (37, l1+1, l2+1)</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+if sys.version_info &gt; (3,):</div><div class='add'>+    def entry_pack_reg(gf, bn, mo, uid, gid):</div><div class='add'>+        bn_encoded = bn.encode()</div><div class='add'>+        blen = len(bn_encoded)</div><div class='add'>+        return struct.pack(_fmt_mknod(blen),</div><div class='add'>+                           uid, gid, gf.encode(), mo, bn_encoded,</div><div class='add'>+                           stat.S_IMODE(mo), 0, umask())</div><div class='add'>+</div><div class='add'>+    # mkdir</div><div class='add'>+    def entry_pack_dir(gf, bn, mo, uid, gid):</div><div class='add'>+        bn_encoded = bn.encode()</div><div class='add'>+        blen = len(bn_encoded)</div><div class='add'>+        return struct.pack(_fmt_mkdir(blen),</div><div class='add'>+                           uid, gid, gf.encode(), mo, bn_encoded,</div><div class='add'>+                           stat.S_IMODE(mo), umask())</div><div class='add'>+    # symlink</div><div class='add'>+    def entry_pack_symlink(gf, bn, lnk, st):</div><div class='add'>+        bn_encoded = bn.encode()</div><div class='add'>+        blen = len(bn_encoded)</div><div class='add'>+        lnk_encoded = lnk.encode()</div><div class='add'>+        llen = len(lnk_encoded)</div><div class='add'>+        return struct.pack(_fmt_symlink(blen, llen),</div><div class='add'>+                           st['uid'], st['gid'],</div><div class='add'>+                           gf.encode(), st['mode'], bn_encoded,</div><div class='add'>+                           lnk_encoded)</div><div class='add'>+</div><div class='add'>+else:</div><div class='add'>+    def entry_pack_reg(gf, bn, mo, uid, gid):</div><div class='add'>+        blen = len(bn)</div><div class='add'>+        return struct.pack(_fmt_mknod(blen),</div><div class='add'>+                           uid, gid, gf, mo, bn,</div><div class='add'>+                           stat.S_IMODE(mo), 0, umask())</div><div class='add'>+</div><div class='add'>+    def entry_pack_dir(gf, bn, mo, uid, gid):</div><div class='add'>+        blen = len(bn)</div><div class='add'>+        return struct.pack(_fmt_mkdir(blen),</div><div class='add'>+                           uid, gid, gf, mo, bn,</div><div class='add'>+                           stat.S_IMODE(mo), umask())</div><div class='add'>+</div><div class='add'>+    def entry_pack_symlink(gf, bn, lnk, mo, uid, gid):</div><div class='add'>+        blen = len(bn)</div><div class='add'>+        llen = len(lnk)</div><div class='add'>+        return struct.pack(_fmt_symlink(blen, llen),</div><div class='add'>+                           uid, gid, gf, mo, bn, lnk)</div><div class='add'>+</div><div class='add'>+if __name__ == '__main__':</div><div class='add'>+    if len(sys.argv) &lt; 9:</div><div class='add'>+        print(("USAGE: %s &lt;mount&gt; &lt;pargfid|ROOT&gt; &lt;filename&gt; &lt;GFID&gt; &lt;file type&gt;"</div><div class='add'>+              " &lt;uid&gt; &lt;gid&gt; &lt;file permission(octal str)&gt;" % (sys.argv[0])))</div><div class='add'>+        sys.exit(-1) # nothing to do</div><div class='add'>+    mtpt       = sys.argv[1]</div><div class='add'>+    pargfid    = sys.argv[2]</div><div class='add'>+    fname      = sys.argv[3]</div><div class='add'>+    randomgfid = sys.argv[4]</div><div class='add'>+    ftype      = sys.argv[5]</div><div class='add'>+    uid        = int(sys.argv[6])</div><div class='add'>+    gid        = int(sys.argv[7])</div><div class='add'>+    perm       = int(sys.argv[8], 8)</div><div class='add'>+</div><div class='add'>+    os.chdir(mtpt)</div><div class='add'>+    if pargfid == 'ROOT':</div><div class='add'>+        pargfid = '.gfid/00000000-0000-0000-0000-000000000001'</div><div class='add'>+    else:</div><div class='add'>+        pargfid = '.gfid/' + pargfid</div><div class='add'>+</div><div class='add'>+    blob = None</div><div class='add'>+</div><div class='add'>+    # entry op: use non-zero uid/gid (to catch gfid-access xlator bugs)</div><div class='add'>+    if ftype == 'file':</div><div class='add'>+        mode = stat.S_IFREG | perm</div><div class='add'>+        blob = entry_pack_reg(randomgfid, fname, mode, uid, gid)</div><div class='add'>+    elif ftype =='dir':</div><div class='add'>+        mode = stat.S_IFDIR | perm</div><div class='add'>+        blob = entry_pack_dir(randomgfid, fname, mode, uid, gid)</div><div class='add'>+    else: # not yet...</div><div class='add'>+        sys.exit(-1)</div><div class='add'>+</div><div class='add'>+    if blob == None:</div><div class='add'>+        sys.exit(-1)</div><div class='add'>+    try:</div><div class='add'>+        Xattr.lsetxattr(pargfid, 'glusterfs.gfid.newfile', blob)</div><div class='add'>+    except OSError:</div><div class='add'>+        ex = sys.exc_info()[1]</div><div class='add'>+        if not ex.errno in [EEXIST]:</div><div class='add'>+            raise</div><div class='add'>+            sys.exit(-1)</div><div class='add'>+    print("File creation OK")</div><div class='add'>+    sys.exit(0)</div><div class='head'>diff --git a/tests/utils/libcxattr.py b/tests/utils/libcxattr.py<br/>new file mode 100644<br/>index 00000000000..3f3ed1fffbb<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/utils/libcxattr.py?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/utils/libcxattr.py</a></div><div class='hunk'>@@ -0,0 +1,108 @@</div><div class='add'>+#</div><div class='add'>+# Copyright (c) 2011-2014 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+# This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+# This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+# General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+# later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+# cases as published by the Free Software Foundation.</div><div class='add'>+#</div><div class='add'>+</div><div class='add'>+import os</div><div class='add'>+import sys</div><div class='add'>+from ctypes import CDLL, c_int</div><div class='add'>+from py2py3 import bytearray_to_str, gr_create_string_buffer</div><div class='add'>+from py2py3 import gr_query_xattr, gr_lsetxattr, gr_lremovexattr</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+class Xattr(object):</div><div class='add'>+</div><div class='add'>+    """singleton that wraps the extended attributes system</div><div class='add'>+       interface for python using ctypes</div><div class='add'>+</div><div class='add'>+       Just implement it to the degree we need it, in particular</div><div class='add'>+       - we need just the l*xattr variants, ie. we never want symlinks to be</div><div class='add'>+         followed</div><div class='add'>+       - don't need size discovery for getxattr, as we always know the exact</div><div class='add'>+         sizes we expect</div><div class='add'>+    """</div><div class='add'>+</div><div class='add'>+    if sys.hexversion &gt;= 0x02060000:</div><div class='add'>+        from ctypes import DEFAULT_MODE</div><div class='add'>+        libc = CDLL("libc.so.6", DEFAULT_MODE, None, True)</div><div class='add'>+    else:</div><div class='add'>+        libc = CDLL("libc.so.6")</div><div class='add'>+</div><div class='add'>+    @classmethod</div><div class='add'>+    def geterrno(cls):</div><div class='add'>+        if sys.hexversion &gt;= 0x02060000:</div><div class='add'>+            from ctypes import get_errno</div><div class='add'>+            return get_errno()</div><div class='add'>+        # breaks on NetBSD</div><div class='add'>+        return c_int.in_dll(cls.libc, 'errno').value</div><div class='add'>+</div><div class='add'>+    @classmethod</div><div class='add'>+    def raise_oserr(cls):</div><div class='add'>+        errn = cls.geterrno()</div><div class='add'>+        raise OSError(errn, os.strerror(errn))</div><div class='add'>+</div><div class='add'>+    @classmethod</div><div class='add'>+    def _query_xattr(cls, path, siz, syscall, *a):</div><div class='add'>+        if siz:</div><div class='add'>+            buf = gr_create_string_buffer(siz)</div><div class='add'>+        else:</div><div class='add'>+            buf = None</div><div class='add'>+        ret = getattr(cls.libc, syscall)(*((path,) + a + (buf, siz)))</div><div class='add'>+        if ret == -1:</div><div class='add'>+            cls.raise_oserr()</div><div class='add'>+        if siz:</div><div class='add'>+            # py2 and py3 compatibility. Convert bytes array</div><div class='add'>+            # to string</div><div class='add'>+            result = bytearray_to_str(buf.raw)</div><div class='add'>+            return result[:ret]</div><div class='add'>+        else:</div><div class='add'>+            return ret</div><div class='add'>+</div><div class='add'>+    @classmethod</div><div class='add'>+    def lgetxattr(cls, path, attr, siz=0):</div><div class='add'>+        return gr_query_xattr(cls, path, siz, 'lgetxattr', attr)</div><div class='add'>+</div><div class='add'>+    @classmethod</div><div class='add'>+    def lgetxattr_buf(cls, path, attr):</div><div class='add'>+        """lgetxattr variant with size discovery"""</div><div class='add'>+        size = cls.lgetxattr(path, attr)</div><div class='add'>+        if size == -1:</div><div class='add'>+            cls.raise_oserr()</div><div class='add'>+        if size == 0:</div><div class='add'>+            return ''</div><div class='add'>+        return cls.lgetxattr(path, attr, size)</div><div class='add'>+</div><div class='add'>+    @classmethod</div><div class='add'>+    def llistxattr(cls, path, siz=0):</div><div class='add'>+        ret = gr_query_xattr(cls, path, siz, 'llistxattr')</div><div class='add'>+        if isinstance(ret, str):</div><div class='add'>+            ret = ret.strip('\0')</div><div class='add'>+            ret = ret.split('\0') if ret else []</div><div class='add'>+        return ret</div><div class='add'>+</div><div class='add'>+    @classmethod</div><div class='add'>+    def lsetxattr(cls, path, attr, val):</div><div class='add'>+        ret = gr_lsetxattr(cls, path, attr, val)</div><div class='add'>+        if ret == -1:</div><div class='add'>+            cls.raise_oserr()</div><div class='add'>+</div><div class='add'>+    @classmethod</div><div class='add'>+    def lremovexattr(cls, path, attr):</div><div class='add'>+        ret = gr_lremovexattr(cls, path, attr)</div><div class='add'>+        if ret == -1:</div><div class='add'>+            cls.raise_oserr()</div><div class='add'>+</div><div class='add'>+    @classmethod</div><div class='add'>+    def llistxattr_buf(cls, path):</div><div class='add'>+        """listxattr variant with size discovery"""</div><div class='add'>+        size = cls.llistxattr(path)</div><div class='add'>+        if size == -1:</div><div class='add'>+            cls.raise_oserr()</div><div class='add'>+        if size == 0:</div><div class='add'>+            return []</div><div class='add'>+        return cls.llistxattr(path, size)</div><div class='head'>diff --git a/tests/utils/pidof.py b/tests/utils/pidof.py<br/>new file mode 100755<br/>index 00000000000..4b7071c0a48<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/utils/pidof.py?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/utils/pidof.py</a></div><div class='hunk'>@@ -0,0 +1,45 @@</div><div class='add'>+</div><div class='add'>+from __future__ import print_function</div><div class='add'>+import sys</div><div class='add'>+</div><div class='add'>+try:</div><div class='add'>+    import psutil</div><div class='add'>+except ImportError:</div><div class='add'>+    print("Please install psutil --&gt; pip install psutil")</div><div class='add'>+    sys.exit(1)</div><div class='add'>+</div><div class='add'>+def pmap_find(p, name):</div><div class='add'>+    for m in p.memory_maps(grouped=True):</div><div class='add'>+        if m.path.endswith("%s.so" % name):</div><div class='add'>+            return True</div><div class='add'>+        continue</div><div class='add'>+    return False</div><div class='add'>+</div><div class='add'>+def pidof(processname):</div><div class='add'>+    for p in psutil.process_iter():</div><div class='add'>+        if p.pid == 0:</div><div class='add'>+            continue</div><div class='add'>+        if "gluster" in processname:</div><div class='add'>+            if processname == "glusterd" and pmap_find(p, "glusterd"):</div><div class='add'>+                print((p.pid))</div><div class='add'>+            if processname == "glusterfs" and pmap_find(p, "client"):</div><div class='add'>+                print((p.pid))</div><div class='add'>+            if processname == "glusterfsd" and pmap_find(p, "posix-acl"):</div><div class='add'>+                print((p.pid))</div><div class='add'>+            continue</div><div class='add'>+        if processname.strip() == p.name():</div><div class='add'>+            print((p.pid))</div><div class='add'>+</div><div class='add'>+def main(argv):</div><div class='add'>+    if len(argv) &lt; 2:</div><div class='add'>+        sys.stderr.write("Usage: %s &lt;processname&gt;\n" % (argv[0],))</div><div class='add'>+        return 1</div><div class='add'>+    try:</div><div class='add'>+        pidof(argv[1])</div><div class='add'>+    except Exception as err:</div><div class='add'>+        print(err)</div><div class='add'>+        sys.stderr.write("Please be root - %s\n" % err);</div><div class='add'>+        sys.exit(1)</div><div class='add'>+</div><div class='add'>+if __name__ == "__main__":</div><div class='add'>+    main(sys.argv)</div><div class='head'>diff --git a/tests/utils/py2py3.py b/tests/utils/py2py3.py<br/>new file mode 100644<br/>index 00000000000..63aca10fd26<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/utils/py2py3.py?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/utils/py2py3.py</a></div><div class='hunk'>@@ -0,0 +1,186 @@</div><div class='add'>+#</div><div class='add'>+# Copyright (c) 2018 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+# This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+# This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+# General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+# later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+# cases as published by the Free Software Foundation.</div><div class='add'>+#</div><div class='add'>+</div><div class='add'>+# All python2/python3 compatibility routines</div><div class='add'>+</div><div class='add'>+import sys</div><div class='add'>+import os</div><div class='add'>+import stat</div><div class='add'>+import struct</div><div class='add'>+from ctypes import create_string_buffer</div><div class='add'>+</div><div class='add'>+def umask():</div><div class='add'>+    return os.umask(0)</div><div class='add'>+</div><div class='add'>+if sys.version_info &gt;= (3,):</div><div class='add'>+    def pipe():</div><div class='add'>+        (r, w) = os.pipe()</div><div class='add'>+        os.set_inheritable(r, True)</div><div class='add'>+        os.set_inheritable(w, True)</div><div class='add'>+        return (r, w)</div><div class='add'>+</div><div class='add'>+    # Raw conversion of bytearray to string. Used in the cases where</div><div class='add'>+    # buffer is created by create_string_buffer which is a 8-bit char</div><div class='add'>+    # array and passed to syscalls to fetch results. Using encode/decode</div><div class='add'>+    # doesn't work as it converts to string altering the size.</div><div class='add'>+    def bytearray_to_str(byte_arr):</div><div class='add'>+        return ''.join([chr(b) for b in byte_arr])</div><div class='add'>+</div><div class='add'>+    # Raw conversion of string to bytes. This is required to convert</div><div class='add'>+    # back the string into bytearray(c char array) to use in struc</div><div class='add'>+    # pack/unpacking. Again encode/decode can't be used as it</div><div class='add'>+    # converts it alters size.</div><div class='add'>+    def str_to_bytearray(string):</div><div class='add'>+        return bytes([ord(c) for c in string])</div><div class='add'>+</div><div class='add'>+    def gr_create_string_buffer(size):</div><div class='add'>+        return create_string_buffer(b'\0', size)</div><div class='add'>+</div><div class='add'>+    def gr_query_xattr(cls, path, size, syscall, attr=None):</div><div class='add'>+        if attr:</div><div class='add'>+            return cls._query_xattr(path.encode(), size, syscall,</div><div class='add'>+                                    attr.encode())</div><div class='add'>+        else:</div><div class='add'>+            return cls._query_xattr(path.encode(), size, syscall)</div><div class='add'>+</div><div class='add'>+    def gr_lsetxattr(cls, path, attr, val):</div><div class='add'>+        return cls.libc.lsetxattr(path.encode(), attr.encode(), val,</div><div class='add'>+                                  len(val), 0)</div><div class='add'>+</div><div class='add'>+    def gr_lremovexattr(cls, path, attr):</div><div class='add'>+        return cls.libc.lremovexattr(path.encode(), attr.encode())</div><div class='add'>+</div><div class='add'>+    def gr_cl_register(cls, brick, path, log_file, log_level, retries):</div><div class='add'>+        return cls._get_api('gf_changelog_register')(brick.encode(),</div><div class='add'>+                                                     path.encode(),</div><div class='add'>+                                                     log_file.encode(),</div><div class='add'>+                                                     log_level, retries)</div><div class='add'>+</div><div class='add'>+    def gr_cl_done(cls, clfile):</div><div class='add'>+        return cls._get_api('gf_changelog_done')(clfile.encode())</div><div class='add'>+</div><div class='add'>+    def gr_cl_history_changelog(cls, changelog_path, start, end, num_parallel,</div><div class='add'>+                                actual_end):</div><div class='add'>+        return cls._get_api('gf_history_changelog')(changelog_path.encode(),</div><div class='add'>+                                                    start, end, num_parallel,</div><div class='add'>+                                                    actual_end)</div><div class='add'>+</div><div class='add'>+    def gr_cl_history_done(cls, clfile):</div><div class='add'>+        return cls._get_api('gf_history_changelog_done')(clfile.encode())</div><div class='add'>+</div><div class='add'>+    # regular file</div><div class='add'>+</div><div class='add'>+    def entry_pack_reg(cls, gf, bn, mo, uid, gid):</div><div class='add'>+        bn_encoded = bn.encode()</div><div class='add'>+        blen = len(bn_encoded)</div><div class='add'>+        return struct.pack(cls._fmt_mknod(blen),</div><div class='add'>+                           uid, gid, gf.encode(), mo, bn_encoded,</div><div class='add'>+                           stat.S_IMODE(mo), 0, umask())</div><div class='add'>+</div><div class='add'>+    def entry_pack_reg_stat(cls, gf, bn, st):</div><div class='add'>+        bn_encoded = bn.encode()</div><div class='add'>+        blen = len(bn_encoded)</div><div class='add'>+        mo = st['mode']</div><div class='add'>+        return struct.pack(cls._fmt_mknod(blen),</div><div class='add'>+                           st['uid'], st['gid'],</div><div class='add'>+                           gf.encode(), mo, bn_encoded,</div><div class='add'>+                           stat.S_IMODE(mo), 0, umask())</div><div class='add'>+    # mkdir</div><div class='add'>+</div><div class='add'>+    def entry_pack_mkdir(cls, gf, bn, mo, uid, gid):</div><div class='add'>+        bn_encoded = bn.encode()</div><div class='add'>+        blen = len(bn_encoded)</div><div class='add'>+        return struct.pack(cls._fmt_mkdir(blen),</div><div class='add'>+                           uid, gid, gf.encode(), mo, bn_encoded,</div><div class='add'>+                           stat.S_IMODE(mo), umask())</div><div class='add'>+    # symlink</div><div class='add'>+</div><div class='add'>+    def entry_pack_symlink(cls, gf, bn, lnk, st):</div><div class='add'>+        bn_encoded = bn.encode()</div><div class='add'>+        blen = len(bn_encoded)</div><div class='add'>+        lnk_encoded = lnk.encode()</div><div class='add'>+        llen = len(lnk_encoded)</div><div class='add'>+        return struct.pack(cls._fmt_symlink(blen, llen),</div><div class='add'>+                           st['uid'], st['gid'],</div><div class='add'>+                           gf.encode(), st['mode'], bn_encoded,</div><div class='add'>+                           lnk_encoded)</div><div class='add'>+else:</div><div class='add'>+    def pipe():</div><div class='add'>+        (r, w) = os.pipe()</div><div class='add'>+        return (r, w)</div><div class='add'>+</div><div class='add'>+    # Raw conversion of bytearray to string</div><div class='add'>+    def bytearray_to_str(byte_arr):</div><div class='add'>+        return byte_arr</div><div class='add'>+</div><div class='add'>+    # Raw conversion of string to bytearray</div><div class='add'>+    def str_to_bytearray(string):</div><div class='add'>+        return string</div><div class='add'>+</div><div class='add'>+    def gr_create_string_buffer(size):</div><div class='add'>+        return create_string_buffer('\0', size)</div><div class='add'>+</div><div class='add'>+    def gr_query_xattr(cls, path, size, syscall, attr=None):</div><div class='add'>+        if attr:</div><div class='add'>+            return cls._query_xattr(path, size, syscall, attr)</div><div class='add'>+        else:</div><div class='add'>+            return cls._query_xattr(path, size, syscall)</div><div class='add'>+</div><div class='add'>+    def gr_lsetxattr(cls, path, attr, val):</div><div class='add'>+        return cls.libc.lsetxattr(path, attr, val, len(val), 0)</div><div class='add'>+</div><div class='add'>+    def gr_lremovexattr(cls, path, attr):</div><div class='add'>+        return cls.libc.lremovexattr(path, attr)</div><div class='add'>+</div><div class='add'>+    def gr_cl_register(cls, brick, path, log_file, log_level, retries):</div><div class='add'>+        return cls._get_api('gf_changelog_register')(brick, path, log_file,</div><div class='add'>+                                                     log_level, retries)</div><div class='add'>+</div><div class='add'>+    def gr_cl_done(cls, clfile):</div><div class='add'>+        return cls._get_api('gf_changelog_done')(clfile)</div><div class='add'>+</div><div class='add'>+    def gr_cl_history_changelog(cls, changelog_path, start, end, num_parallel,</div><div class='add'>+                                actual_end):</div><div class='add'>+        return cls._get_api('gf_history_changelog')(changelog_path, start, end,</div><div class='add'>+                                                    num_parallel, actual_end)</div><div class='add'>+</div><div class='add'>+    def gr_cl_history_done(cls, clfile):</div><div class='add'>+        return cls._get_api('gf_history_changelog_done')(clfile)</div><div class='add'>+</div><div class='add'>+    # regular file</div><div class='add'>+</div><div class='add'>+    def entry_pack_reg(cls, gf, bn, mo, uid, gid):</div><div class='add'>+        blen = len(bn)</div><div class='add'>+        return struct.pack(cls._fmt_mknod(blen),</div><div class='add'>+                           uid, gid, gf, mo, bn,</div><div class='add'>+                           stat.S_IMODE(mo), 0, umask())</div><div class='add'>+</div><div class='add'>+    def entry_pack_reg_stat(cls, gf, bn, st):</div><div class='add'>+        blen = len(bn)</div><div class='add'>+        mo = st['mode']</div><div class='add'>+        return struct.pack(cls._fmt_mknod(blen),</div><div class='add'>+                           st['uid'], st['gid'],</div><div class='add'>+                           gf, mo, bn,</div><div class='add'>+                           stat.S_IMODE(mo), 0, umask())</div><div class='add'>+    # mkdir</div><div class='add'>+</div><div class='add'>+    def entry_pack_mkdir(cls, gf, bn, mo, uid, gid):</div><div class='add'>+        blen = len(bn)</div><div class='add'>+        return struct.pack(cls._fmt_mkdir(blen),</div><div class='add'>+                           uid, gid, gf, mo, bn,</div><div class='add'>+                           stat.S_IMODE(mo), umask())</div><div class='add'>+    # symlink</div><div class='add'>+</div><div class='add'>+    def entry_pack_symlink(cls, gf, bn, lnk, st):</div><div class='add'>+        blen = len(bn)</div><div class='add'>+        llen = len(lnk)</div><div class='add'>+        return struct.pack(cls._fmt_symlink(blen, llen),</div><div class='add'>+                           st['uid'], st['gid'],</div><div class='add'>+                           gf, st['mode'], bn, lnk)</div><div class='head'>diff --git a/tests/utils/setfattr.py b/tests/utils/setfattr.py<br/>new file mode 100755<br/>index 00000000000..8b7b6abacc0<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/utils/setfattr.py?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/utils/setfattr.py</a></div><div class='hunk'>@@ -0,0 +1,77 @@</div><div class='add'>+</div><div class='add'>+import os</div><div class='add'>+import sys</div><div class='add'>+from optparse import OptionParser</div><div class='add'>+</div><div class='add'>+import xattr</div><div class='add'>+</div><div class='add'>+def convert(string):</div><div class='add'>+    tmp_string = string</div><div class='add'>+    if (string[0] == '0' and</div><div class='add'>+        (string[1] == 's' or</div><div class='add'>+         string[1] == 'S')):</div><div class='add'>+        tmp_string = string.strip('%s%s' %</div><div class='add'>+                                  (string[0],</div><div class='add'>+                                   string[1]))</div><div class='add'>+        return tmp_string.decode('base64')</div><div class='add'>+</div><div class='add'>+    if (string[0] == '0' and</div><div class='add'>+        (string[1] == 'x' or</div><div class='add'>+         string[1] == 'X')):</div><div class='add'>+        tmp_string = string.split('%s%s' %</div><div class='add'>+                                  (string[0],</div><div class='add'>+                                   string[1]))</div><div class='add'>+        return tmp_string[1].decode('hex')</div><div class='add'>+</div><div class='add'>+    return tmp_string</div><div class='add'>+</div><div class='add'>+if __name__ == '__main__':</div><div class='add'>+    usage = "usage: %prog [-n name] [-v value] [-x name]"</div><div class='add'>+    parser = OptionParser(usage=usage)</div><div class='add'>+    parser.add_option("-n", action="store", dest="name", type="string",</div><div class='add'>+                      help="Specifies the name of the extended attribute to set.")</div><div class='add'>+    parser.add_option("-v", action="store", dest="value", type="string",</div><div class='add'>+                      help="Specifies the new value of the extended attribute."</div><div class='add'>+                      " There are three methods available for encoding the value."</div><div class='add'>+                      " If the given string is enclosed in double quotes, the"</div><div class='add'>+                      " inner string is treated as text. In that case,"</div><div class='add'>+                      " backslashes and double quotes have special meanings"</div><div class='add'>+                      " and need to be escaped by a preceding backslash. Any"</div><div class='add'>+                      " control characters can be encoded as a backslash"</div><div class='add'>+                      " followed by three digits as its ASCII code in octal."</div><div class='add'>+                      " If the given string begins with 0x or 0X, it expresses"</div><div class='add'>+                      " a hexadecimal number. If the given string begins with"</div><div class='add'>+                      " 0s or 0S, base64 encoding is expected.")</div><div class='add'>+    parser.add_option("-x", action="store", dest="xname", type="string",</div><div class='add'>+                      help="Remove the named extended attribute entirely.")</div><div class='add'>+</div><div class='add'>+    (option, args) = parser.parse_args()</div><div class='add'>+    if not args:</div><div class='add'>+        print ("Usage: setfattr {-n name} [-v value] file...")</div><div class='add'>+        print ("       setfattr {-x name} file...")</div><div class='add'>+        print ("Try `setfattr --help' for more information.")</div><div class='add'>+        sys.exit(1)</div><div class='add'>+</div><div class='add'>+    if option.name and option.xname:</div><div class='add'>+        print ("-n and -x are mutually exclusive...")</div><div class='add'>+        sys.exit(1)</div><div class='add'>+</div><div class='add'>+    if option.name:</div><div class='add'>+        if option.value is None:</div><div class='add'>+            print ("-n option requires -v value...")</div><div class='add'>+</div><div class='add'>+    args[0] = os.path.abspath(args[0])</div><div class='add'>+</div><div class='add'>+    if option.name and option.value:</div><div class='add'>+        try:</div><div class='add'>+            xattr.setxattr(args[0], option.name, convert(option.value))</div><div class='add'>+        except Exception as err:</div><div class='add'>+            print (err)</div><div class='add'>+            sys.exit(1)</div><div class='add'>+</div><div class='add'>+    if option.xname:</div><div class='add'>+        try:</div><div class='add'>+            xattr.removexattr(args[0], option.xname)</div><div class='add'>+        except Exception as err:</div><div class='add'>+            print (err)</div><div class='add'>+            sys.exit(1)</div><div class='head'>diff --git a/tests/utils/testn.sh b/tests/utils/testn.sh<br/>new file mode 100755<br/>index 00000000000..079351d8529<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/utils/testn.sh?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/utils/testn.sh</a></div><div class='hunk'>@@ -0,0 +1,16 @@</div><div class='add'>+#!/bin/bash</div><div class='add'>+#</div><div class='add'>+# Use this script to identify the command and line-number of test-cases.</div><div class='add'>+#</div><div class='add'>+</div><div class='add'>+if [ -z "${1}" -a -z "${2}" ]</div><div class='add'>+then</div><div class='add'>+        echo "Usage: ${0} path/to/test/case.t testnumber"</div><div class='add'>+        exit 1</div><div class='add'>+elif [ -z "${2}" ]</div><div class='add'>+then</div><div class='add'>+        echo "ERROR: The second parameter to ${0} should be a number."</div><div class='add'>+        exit 2</div><div class='add'>+fi</div><div class='add'>+</div><div class='add'>+awk '{print FNR " " $0}' ${1} | egrep '^[[:digit:]]+[[:space:]]*(EXPECT|TEST|EXPECT_WITHIN|EXPECT_KEYWORD)' | sed -n ${2}p</div><div class='head'>diff --git a/tests/vagrant/vagrant-template-centos6/Vagrantfile b/tests/vagrant/vagrant-template-centos6/Vagrantfile<br/>new file mode 100644<br/>index 00000000000..b276f90768d<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/vagrant/vagrant-template-centos6/Vagrantfile?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/vagrant/vagrant-template-centos6/Vagrantfile</a></div><div class='hunk'>@@ -0,0 +1,55 @@</div><div class='add'>+# -*- mode: ruby -*-</div><div class='add'>+# vi: set ft=ruby :</div><div class='add'>+</div><div class='add'>+Vagrant.configure("2") do |config|</div><div class='add'>+    config.vm.define "vagrant-testVM" do |testvm|</div><div class='add'>+      testvm.vm.box = "raghavendra-talur/gluster-dev-centos6"</div><div class='add'>+      testvm.vm.hostname = "vagrant-testVM"</div><div class='add'>+      #testvm.ssh.insert_key = false</div><div class='add'>+      testvm.vm.synced_folder ".", "/vagrant", disabled: true</div><div class='add'>+</div><div class='add'>+        host = RbConfig::CONFIG['host_os']</div><div class='add'>+        # Give VM 1/4 system memory &amp; access to all cpu cores on the host</div><div class='add'>+        if host =~ /darwin/</div><div class='add'>+          cpus = `sysctl -n hw.ncpu`.to_i</div><div class='add'>+          # sysctl returns Bytes and we need to convert to MB</div><div class='add'>+          mem = `sysctl -n hw.memsize`.to_i / 1024 / 1024 / 4</div><div class='add'>+        elsif host =~ /linux/</div><div class='add'>+          cpus = `nproc`.to_i</div><div class='add'>+          # meminfo shows KB and we need to convert to MB</div><div class='add'>+          mem = `grep 'MemTotal' /proc/meminfo | sed -e 's/MemTotal://' -e 's/ kB//'`.to_i / 1024 / 4</div><div class='add'>+        else # sorry Windows folks, I can't help you</div><div class='add'>+          cpus = 2</div><div class='add'>+          mem = 1024</div><div class='add'>+        end</div><div class='add'>+</div><div class='add'>+      # Define basic config for VM, memory, cpu, storage pool</div><div class='add'>+      testvm.vm.provider "libvirt" do |lv|</div><div class='add'>+        lv.storage_pool_name = "default"</div><div class='add'>+        lv.memory = mem</div><div class='add'>+        lv.cpus = cpus</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+        # We need a brick partition, lets have a 5G disk for that.</div><div class='add'>+        # If you need more bricks, just add more letters to the</div><div class='add'>+        # string below.</div><div class='add'>+        "b".split("").each do |i|</div><div class='add'>+          lv.storage :file,</div><div class='add'>+          #:path           =&gt; "",</div><div class='add'>+          #:allow_existing =&gt; "",</div><div class='add'>+          :device         =&gt; "vd#{i}",</div><div class='add'>+          :size           =&gt; "5G",</div><div class='add'>+          :type           =&gt; "qcow2",</div><div class='add'>+          :bus            =&gt; "virtio",</div><div class='add'>+          :cache          =&gt; "default"</div><div class='add'>+        end</div><div class='add'>+      end</div><div class='add'>+</div><div class='add'>+      # Let's provision</div><div class='add'>+      testvm.vm.provision "ansible", run: "always" do |setup|</div><div class='add'>+        setup.verbose = "v"</div><div class='add'>+        setup.playbook = "setup.yml"</div><div class='add'>+      end</div><div class='add'>+</div><div class='add'>+    end</div><div class='add'>+end</div><div class='head'>diff --git a/tests/vagrant/vagrant-template-centos6/roles/daemon-services/tasks/main.yml b/tests/vagrant/vagrant-template-centos6/roles/daemon-services/tasks/main.yml<br/>new file mode 100644<br/>index 00000000000..0e4c83244cc<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/vagrant/vagrant-template-centos6/roles/daemon-services/tasks/main.yml?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/vagrant/vagrant-template-centos6/roles/daemon-services/tasks/main.yml</a></div><div class='hunk'>@@ -0,0 +1,3 @@</div><div class='add'>+---</div><div class='add'>+- name: stop and disable kernel nfs</div><div class='add'>+  service: name=nfs state=stopped enabled=no</div><div class='head'>diff --git a/tests/vagrant/vagrant-template-centos6/roles/fix-localhost/tasks/main.yml b/tests/vagrant/vagrant-template-centos6/roles/fix-localhost/tasks/main.yml<br/>new file mode 100644<br/>index 00000000000..84dd252b65b<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/vagrant/vagrant-template-centos6/roles/fix-localhost/tasks/main.yml?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/vagrant/vagrant-template-centos6/roles/fix-localhost/tasks/main.yml</a></div><div class='hunk'>@@ -0,0 +1,6 @@</div><div class='add'>+---</div><div class='add'>+- name: remove IPv6 address for localhost</div><div class='add'>+  shell: sed -i '/::1/s/localhost //' /etc/hosts</div><div class='add'>+</div><div class='add'>+- name: add IPv4 address for localhost</div><div class='add'>+  shell: sed -i '/127.0.0.1/s/$/ localhost/' /etc/hosts</div><div class='head'>diff --git a/tests/vagrant/vagrant-template-centos6/roles/install-pkgs/tasks/main.yml b/tests/vagrant/vagrant-template-centos6/roles/install-pkgs/tasks/main.yml<br/>new file mode 100644<br/>index 00000000000..bf3eff077b4<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/vagrant/vagrant-template-centos6/roles/install-pkgs/tasks/main.yml?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/vagrant/vagrant-template-centos6/roles/install-pkgs/tasks/main.yml</a></div><div class='hunk'>@@ -0,0 +1,92 @@</div><div class='add'>+---</div><div class='add'>+- name: install deltarpm</div><div class='add'>+  yum:  name=deltarpm state=present</div><div class='add'>+</div><div class='add'>+- name: remove samba3</div><div class='add'>+  shell:  yum -y remove samba*</div><div class='add'>+</div><div class='add'>+- name: update system</div><div class='add'>+  shell: yum -y update</div><div class='add'>+</div><div class='add'>+- name: install epel repo</div><div class='add'>+  yum: name=http://download.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm state=present</div><div class='add'>+</div><div class='add'>+- name: install other packages</div><div class='add'>+  yum:  name={{ item }} state=present</div><div class='add'>+  with_items:</div><div class='add'>+    - attr</div><div class='add'>+    - autoconf</div><div class='add'>+    - automake</div><div class='add'>+    - bc</div><div class='add'>+    - bison</div><div class='add'>+      #- libcmocka-devel</div><div class='add'>+    - dbench</div><div class='add'>+    - dos2unix</div><div class='add'>+    - e2fsprogs</div><div class='add'>+    - findutils</div><div class='add'>+    - flex</div><div class='add'>+    - fuse-devel</div><div class='add'>+    - fuse-libs</div><div class='add'>+    - gcc</div><div class='add'>+    - gdb</div><div class='add'>+    - git</div><div class='add'>+    - glib2-devel</div><div class='add'>+      #- hostname</div><div class='add'>+    - libacl-devel</div><div class='add'>+    - libaio-devel</div><div class='add'>+    - libattr-devel</div><div class='add'>+    - libibverbs-devel</div><div class='add'>+    - librdmacm-devel</div><div class='add'>+    - libselinux-python</div><div class='add'>+    - libsemanage-python</div><div class='add'>+    - libtool</div><div class='add'>+    - libxml2-devel</div><div class='add'>+    - lvm2-devel</div><div class='add'>+    - make</div><div class='add'>+      #- man-db</div><div class='add'>+    - mock</div><div class='add'>+    - net-tools</div><div class='add'>+      #- nfs-ganesha-gluster</div><div class='add'>+    - nfs-utils</div><div class='add'>+    - openssh-server</div><div class='add'>+    - openssl-devel</div><div class='add'>+    - perl-Test-Harness</div><div class='add'>+    - pkgconfig</div><div class='add'>+      #- procps-ng</div><div class='add'>+    - psmisc</div><div class='add'>+    - python-devel</div><div class='add'>+    - python-eventlet</div><div class='add'>+    - python-netifaces</div><div class='add'>+    - python-paste-deploy</div><div class='add'>+    - python-setuptools</div><div class='add'>+    - python-simplejson</div><div class='add'>+    - python-sphinx</div><div class='add'>+    - python-webob</div><div class='add'>+    - pyxattr</div><div class='add'>+    - readline-devel</div><div class='add'>+    - rpm-build</div><div class='add'>+    - screen</div><div class='add'>+    - strace</div><div class='add'>+    - supervisor</div><div class='add'>+    - systemtap-sdt-devel</div><div class='add'>+    - sqlite-devel</div><div class='add'>+    - samba4*</div><div class='add'>+    - userspace-rcu-devel</div><div class='add'>+    - vim</div><div class='add'>+    - wget</div><div class='add'>+    - which</div><div class='add'>+    - xfsprogs</div><div class='add'>+    - yajl-devel</div><div class='add'>+</div><div class='add'>+- name: install dev help packages, not required by Gluster</div><div class='add'>+  yum:  name={{ item }} state=present</div><div class='add'>+  with_items:</div><div class='add'>+    - cgdb</div><div class='add'>+    - clang</div><div class='add'>+    - lsof</div><div class='add'>+    - perf</div><div class='add'>+    - sysstat</div><div class='add'>+    - systemtap</div><div class='add'>+    - systemtap-runtime</div><div class='add'>+    - tcpdump</div><div class='add'>+    - valgrind</div><div class='head'>diff --git a/tests/vagrant/vagrant-template-centos6/roles/iptables/tasks/main.yml b/tests/vagrant/vagrant-template-centos6/roles/iptables/tasks/main.yml<br/>new file mode 100644<br/>index 00000000000..768cb0e8668<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/vagrant/vagrant-template-centos6/roles/iptables/tasks/main.yml?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/vagrant/vagrant-template-centos6/roles/iptables/tasks/main.yml</a></div><div class='hunk'>@@ -0,0 +1,3 @@</div><div class='add'>+---</div><div class='add'>+- name: disable iptables, need to add specific rules later</div><div class='add'>+  shell: iptables -F</div><div class='head'>diff --git a/tests/vagrant/vagrant-template-centos6/roles/mock-user/tasks/main.yml b/tests/vagrant/vagrant-template-centos6/roles/mock-user/tasks/main.yml<br/>new file mode 100644<br/>index 00000000000..c8e1209937e<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/vagrant/vagrant-template-centos6/roles/mock-user/tasks/main.yml?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/vagrant/vagrant-template-centos6/roles/mock-user/tasks/main.yml</a></div><div class='hunk'>@@ -0,0 +1,3 @@</div><div class='add'>+---</div><div class='add'>+- name: Add mock user; required for rpm.t</div><div class='add'>+  user: name=mock group=mock</div><div class='head'>diff --git a/tests/vagrant/vagrant-template-centos6/roles/prepare-brick/tasks/main.yml b/tests/vagrant/vagrant-template-centos6/roles/prepare-brick/tasks/main.yml<br/>new file mode 100644<br/>index 00000000000..6b3f6b8d3ea<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/vagrant/vagrant-template-centos6/roles/prepare-brick/tasks/main.yml?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/vagrant/vagrant-template-centos6/roles/prepare-brick/tasks/main.yml</a></div><div class='hunk'>@@ -0,0 +1,6 @@</div><div class='add'>+---</div><div class='add'>+- name: Format backend</div><div class='add'>+  filesystem: fstype=xfs dev=/dev/vdb</div><div class='add'>+</div><div class='add'>+- name: Add entry to fstab and mount</div><div class='add'>+  mount: name=/d src=/dev/vdb fstype=xfs state=mounted</div><div class='head'>diff --git a/tests/vagrant/vagrant-template-centos6/roles/remove-gluster-pkgs/tasks/main.yml b/tests/vagrant/vagrant-template-centos6/roles/remove-gluster-pkgs/tasks/main.yml<br/>new file mode 100644<br/>index 00000000000..c91efa9ba7c<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/vagrant/vagrant-template-centos6/roles/remove-gluster-pkgs/tasks/main.yml?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/vagrant/vagrant-template-centos6/roles/remove-gluster-pkgs/tasks/main.yml</a></div><div class='hunk'>@@ -0,0 +1,4 @@</div><div class='add'>+---</div><div class='add'>+- name: Erase gluster packages, keep dependencies; we will source install</div><div class='add'>+  shell: rpm -ev --nodeps `rpm -qa | grep ^gluster`</div><div class='add'>+  ignore_errors: True</div><div class='head'>diff --git a/tests/vagrant/vagrant-template-centos6/setup.yml b/tests/vagrant/vagrant-template-centos6/setup.yml<br/>new file mode 100644<br/>index 00000000000..520f1cdb019<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/vagrant/vagrant-template-centos6/setup.yml?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/vagrant/vagrant-template-centos6/setup.yml</a></div><div class='hunk'>@@ -0,0 +1,15 @@</div><div class='add'>+---</div><div class='add'>+- hosts: all</div><div class='add'>+  sudo: true</div><div class='add'>+  roles:</div><div class='add'>+    #Installing packages invoke dnf and metadata download takes a long time.</div><div class='add'>+    #The box used in Vagrantfile has all the packages installed.</div><div class='add'>+    #Refer to main.yml file in install-pkgs role to get list of packages.</div><div class='add'>+    #install-pkgs role is hence disabled by default.</div><div class='add'>+    #- install-pkgs</div><div class='add'>+    - remove-gluster-pkgs</div><div class='add'>+    - prepare-brick</div><div class='add'>+    - mock-user</div><div class='add'>+    - iptables</div><div class='add'>+    - fix-localhost</div><div class='add'>+    - daemon-services</div><div class='head'>diff --git a/tests/vagrant/vagrant-template-fedora/Vagrantfile b/tests/vagrant/vagrant-template-fedora/Vagrantfile<br/>new file mode 100644<br/>index 00000000000..df806c7aaee<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/vagrant/vagrant-template-fedora/Vagrantfile?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/vagrant/vagrant-template-fedora/Vagrantfile</a></div><div class='hunk'>@@ -0,0 +1,56 @@</div><div class='add'>+# -*- mode: ruby -*-</div><div class='add'>+# vi: set ft=ruby :</div><div class='add'>+</div><div class='add'>+Vagrant.configure("2") do |config|</div><div class='add'>+    config.vm.define "vagrant-testVM" do |testvm|</div><div class='add'>+      testvm.vm.box = "gluster-dev-fedora"</div><div class='add'>+      testvm.vm.box_url = "http://download.gluster.org/pub/gluster/glusterfs/vagrant/gluster-dev-fedora/boxes/gluster-dev-fedora.json"</div><div class='add'>+      testvm.vm.hostname = "vagrant-testVM"</div><div class='add'>+      #testvm.ssh.insert_key = false</div><div class='add'>+      testvm.vm.synced_folder ".", "/vagrant", disabled: true</div><div class='add'>+</div><div class='add'>+        host = RbConfig::CONFIG['host_os']</div><div class='add'>+        # Give VM 1/4 system memory &amp; access to all cpu cores on the host</div><div class='add'>+        if host =~ /darwin/</div><div class='add'>+          cpus = `sysctl -n hw.ncpu`.to_i</div><div class='add'>+          # sysctl returns Bytes and we need to convert to MB</div><div class='add'>+          mem = `sysctl -n hw.memsize`.to_i / 1024 / 1024 / 4</div><div class='add'>+        elsif host =~ /linux/</div><div class='add'>+          cpus = `nproc`.to_i</div><div class='add'>+          # meminfo shows KB and we need to convert to MB</div><div class='add'>+          mem = `grep 'MemTotal' /proc/meminfo | sed -e 's/MemTotal://' -e 's/ kB//'`.to_i / 1024 / 4</div><div class='add'>+        else # sorry Windows folks, I can't help you</div><div class='add'>+          cpus = 2</div><div class='add'>+          mem = 1024</div><div class='add'>+        end</div><div class='add'>+</div><div class='add'>+      # Define basic config for VM, memory, cpu, storage pool</div><div class='add'>+      testvm.vm.provider "libvirt" do |lv|</div><div class='add'>+        lv.storage_pool_name = "default"</div><div class='add'>+        lv.memory = mem</div><div class='add'>+        lv.cpus = cpus</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+        # We need a brick partition, lets have a 5G disk for that.</div><div class='add'>+        # If you need more bricks, just add more letters to the</div><div class='add'>+        # string below.</div><div class='add'>+        "b".split("").each do |i|</div><div class='add'>+          lv.storage :file,</div><div class='add'>+          #:path           =&gt; "",</div><div class='add'>+          #:allow_existing =&gt; "",</div><div class='add'>+          :device         =&gt; "vd#{i}",</div><div class='add'>+          :size           =&gt; "5G",</div><div class='add'>+          :type           =&gt; "qcow2",</div><div class='add'>+          :bus            =&gt; "virtio",</div><div class='add'>+          :cache          =&gt; "default"</div><div class='add'>+        end</div><div class='add'>+      end</div><div class='add'>+</div><div class='add'>+      # Let's provision</div><div class='add'>+      testvm.vm.provision "ansible", run: "always" do |setup|</div><div class='add'>+        setup.verbose = "v"</div><div class='add'>+        setup.playbook = "setup.yml"</div><div class='add'>+      end</div><div class='add'>+</div><div class='add'>+    end</div><div class='add'>+end</div><div class='head'>diff --git a/tests/vagrant/vagrant-template-fedora/roles/daemon-services/tasks/main.yml b/tests/vagrant/vagrant-template-fedora/roles/daemon-services/tasks/main.yml<br/>new file mode 100644<br/>index 00000000000..98d077b1f2e<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/vagrant/vagrant-template-fedora/roles/daemon-services/tasks/main.yml?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/vagrant/vagrant-template-fedora/roles/daemon-services/tasks/main.yml</a></div><div class='hunk'>@@ -0,0 +1,3 @@</div><div class='add'>+---</div><div class='add'>+- name: stop and disable kernel nfs</div><div class='add'>+  service: name=nfs-server state=stopped enabled=no</div><div class='head'>diff --git a/tests/vagrant/vagrant-template-fedora/roles/fix-localhost/tasks/main.yml b/tests/vagrant/vagrant-template-fedora/roles/fix-localhost/tasks/main.yml<br/>new file mode 100644<br/>index 00000000000..84dd252b65b<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/vagrant/vagrant-template-fedora/roles/fix-localhost/tasks/main.yml?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/vagrant/vagrant-template-fedora/roles/fix-localhost/tasks/main.yml</a></div><div class='hunk'>@@ -0,0 +1,6 @@</div><div class='add'>+---</div><div class='add'>+- name: remove IPv6 address for localhost</div><div class='add'>+  shell: sed -i '/::1/s/localhost //' /etc/hosts</div><div class='add'>+</div><div class='add'>+- name: add IPv4 address for localhost</div><div class='add'>+  shell: sed -i '/127.0.0.1/s/$/ localhost/' /etc/hosts</div><div class='head'>diff --git a/tests/vagrant/vagrant-template-fedora/roles/install-pkgs/tasks/main.yml b/tests/vagrant/vagrant-template-fedora/roles/install-pkgs/tasks/main.yml<br/>new file mode 100644<br/>index 00000000000..2512034cdd7<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/vagrant/vagrant-template-fedora/roles/install-pkgs/tasks/main.yml?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/vagrant/vagrant-template-fedora/roles/install-pkgs/tasks/main.yml</a></div><div class='hunk'>@@ -0,0 +1,85 @@</div><div class='add'>+---</div><div class='add'>+- name: install deltarpm</div><div class='add'>+  dnf:  name=deltarpm state=present</div><div class='add'>+</div><div class='add'>+- name: update system</div><div class='add'>+  shell: dnf  update -y</div><div class='add'>+</div><div class='add'>+- name: install other packages</div><div class='add'>+  dnf:  name={{ item }} state=present</div><div class='add'>+  with_items:</div><div class='add'>+    - attr</div><div class='add'>+    - autoconf</div><div class='add'>+    - automake</div><div class='add'>+    - bc</div><div class='add'>+    - bison</div><div class='add'>+    - libcmocka-devel</div><div class='add'>+    - cifs-utils</div><div class='add'>+    - dbench</div><div class='add'>+    - dos2unix</div><div class='add'>+    - e2fsprogs</div><div class='add'>+    - findutils</div><div class='add'>+    - flex</div><div class='add'>+    - fuse-devel</div><div class='add'>+    - fuse-libs</div><div class='add'>+    - gcc</div><div class='add'>+    - gdb</div><div class='add'>+    - git</div><div class='add'>+    - glib2-devel</div><div class='add'>+    - hostname</div><div class='add'>+    - libacl-devel</div><div class='add'>+    - libaio-devel</div><div class='add'>+    - libattr-devel</div><div class='add'>+    - libibverbs-devel</div><div class='add'>+    - librdmacm-devel</div><div class='add'>+    - libtool</div><div class='add'>+    - libxml2-devel</div><div class='add'>+    - lvm2-devel</div><div class='add'>+    - make</div><div class='add'>+    - man-db</div><div class='add'>+    - mock</div><div class='add'>+    - net-tools</div><div class='add'>+    - nfs-ganesha-gluster</div><div class='add'>+    - nfs-utils</div><div class='add'>+    - openssh-server</div><div class='add'>+    - openssl-devel</div><div class='add'>+    - perl-Test-Harness</div><div class='add'>+    - pkgconfig</div><div class='add'>+    - procps-ng</div><div class='add'>+    - psmisc</div><div class='add'>+    - python-devel</div><div class='add'>+    - python-eventlet</div><div class='add'>+    - python-netifaces</div><div class='add'>+    - python-paste-deploy</div><div class='add'>+    - python-setuptools</div><div class='add'>+    - python-simplejson</div><div class='add'>+    - python-sphinx</div><div class='add'>+    - python-webob</div><div class='add'>+    - pyxattr</div><div class='add'>+    - readline-devel</div><div class='add'>+    - rpm-build</div><div class='add'>+    - screen</div><div class='add'>+    - strace</div><div class='add'>+    - supervisor</div><div class='add'>+    - systemtap-sdt-devel</div><div class='add'>+    - sqlite-devel</div><div class='add'>+    - samba*</div><div class='add'>+    - userspace-rcu-devel</div><div class='add'>+    - vim</div><div class='add'>+    - wget</div><div class='add'>+    - which</div><div class='add'>+    - xfsprogs</div><div class='add'>+    - yajl-devel</div><div class='add'>+</div><div class='add'>+- name: install dev help packages, not required by Gluster</div><div class='add'>+  dnf:  name={{ item }} state=present</div><div class='add'>+  with_items:</div><div class='add'>+    - cgdb</div><div class='add'>+    - clang</div><div class='add'>+    - lsof</div><div class='add'>+    - perf</div><div class='add'>+    - sysstat</div><div class='add'>+    - systemtap</div><div class='add'>+    - systemtap-runtime</div><div class='add'>+    - tcpdump</div><div class='add'>+    - valgrind</div><div class='head'>diff --git a/tests/vagrant/vagrant-template-fedora/roles/iptables/tasks/main.yml b/tests/vagrant/vagrant-template-fedora/roles/iptables/tasks/main.yml<br/>new file mode 100644<br/>index 00000000000..768cb0e8668<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/vagrant/vagrant-template-fedora/roles/iptables/tasks/main.yml?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/vagrant/vagrant-template-fedora/roles/iptables/tasks/main.yml</a></div><div class='hunk'>@@ -0,0 +1,3 @@</div><div class='add'>+---</div><div class='add'>+- name: disable iptables, need to add specific rules later</div><div class='add'>+  shell: iptables -F</div><div class='head'>diff --git a/tests/vagrant/vagrant-template-fedora/roles/mock-user/tasks/main.yml b/tests/vagrant/vagrant-template-fedora/roles/mock-user/tasks/main.yml<br/>new file mode 100644<br/>index 00000000000..c8e1209937e<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/vagrant/vagrant-template-fedora/roles/mock-user/tasks/main.yml?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/vagrant/vagrant-template-fedora/roles/mock-user/tasks/main.yml</a></div><div class='hunk'>@@ -0,0 +1,3 @@</div><div class='add'>+---</div><div class='add'>+- name: Add mock user; required for rpm.t</div><div class='add'>+  user: name=mock group=mock</div><div class='head'>diff --git a/tests/vagrant/vagrant-template-fedora/roles/prepare-brick/tasks/main.yml b/tests/vagrant/vagrant-template-fedora/roles/prepare-brick/tasks/main.yml<br/>new file mode 100644<br/>index 00000000000..6b3f6b8d3ea<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/vagrant/vagrant-template-fedora/roles/prepare-brick/tasks/main.yml?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/vagrant/vagrant-template-fedora/roles/prepare-brick/tasks/main.yml</a></div><div class='hunk'>@@ -0,0 +1,6 @@</div><div class='add'>+---</div><div class='add'>+- name: Format backend</div><div class='add'>+  filesystem: fstype=xfs dev=/dev/vdb</div><div class='add'>+</div><div class='add'>+- name: Add entry to fstab and mount</div><div class='add'>+  mount: name=/d src=/dev/vdb fstype=xfs state=mounted</div><div class='head'>diff --git a/tests/vagrant/vagrant-template-fedora/roles/remove-gluster-pkgs/tasks/main.yml b/tests/vagrant/vagrant-template-fedora/roles/remove-gluster-pkgs/tasks/main.yml<br/>new file mode 100644<br/>index 00000000000..c91efa9ba7c<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/vagrant/vagrant-template-fedora/roles/remove-gluster-pkgs/tasks/main.yml?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/vagrant/vagrant-template-fedora/roles/remove-gluster-pkgs/tasks/main.yml</a></div><div class='hunk'>@@ -0,0 +1,4 @@</div><div class='add'>+---</div><div class='add'>+- name: Erase gluster packages, keep dependencies; we will source install</div><div class='add'>+  shell: rpm -ev --nodeps `rpm -qa | grep ^gluster`</div><div class='add'>+  ignore_errors: True</div><div class='head'>diff --git a/tests/vagrant/vagrant-template-fedora/roles/selinux/tasks/main.yml b/tests/vagrant/vagrant-template-fedora/roles/selinux/tasks/main.yml<br/>new file mode 100644<br/>index 00000000000..c9ba9618428<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/vagrant/vagrant-template-fedora/roles/selinux/tasks/main.yml?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/vagrant/vagrant-template-fedora/roles/selinux/tasks/main.yml</a></div><div class='hunk'>@@ -0,0 +1,3 @@</div><div class='add'>+---</div><div class='add'>+- name: Allow gfapi in Samba to bind to other ports than well known smb ports</div><div class='add'>+  seboolean: name=samba_load_libgfapi state=yes persistent=yes</div><div class='head'>diff --git a/tests/vagrant/vagrant-template-fedora/setup.yml b/tests/vagrant/vagrant-template-fedora/setup.yml<br/>new file mode 100644<br/>index 00000000000..fc42a8157f3<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/vagrant/vagrant-template-fedora/setup.yml?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/vagrant/vagrant-template-fedora/setup.yml</a></div><div class='hunk'>@@ -0,0 +1,16 @@</div><div class='add'>+---</div><div class='add'>+- hosts: all</div><div class='add'>+  sudo: true</div><div class='add'>+  roles:</div><div class='add'>+    #Installing packages invoke dnf and metadata download takes a long time.</div><div class='add'>+    #The box used in Vagrantfile has all the packages installed.</div><div class='add'>+    #Refer to main.yml file in install-pkgs role to get list of packages.</div><div class='add'>+    #install-pkgs role is hence disabled by default.</div><div class='add'>+    #- install-pkgs</div><div class='add'>+    - remove-gluster-pkgs</div><div class='add'>+    - prepare-brick</div><div class='add'>+    - mock-user</div><div class='add'>+    - selinux</div><div class='add'>+    - iptables</div><div class='add'>+    - fix-localhost</div><div class='add'>+    - daemon-services</div><div class='head'>diff --git a/tests/volume.rc b/tests/volume.rc<br/>new file mode 100644<br/>index 00000000000..b38848c0e52<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tests/volume.rc?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tests/volume.rc</a></div><div class='hunk'>@@ -0,0 +1,1002 @@</div><div class='add'>+function volinfo_field()</div><div class='add'>+{</div><div class='add'>+    local vol=$1;</div><div class='add'>+    local field=$2;</div><div class='add'>+</div><div class='add'>+    $CLI volume info $vol | grep "^$field: " | sed 's/.*: //';</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function volume_get_field()</div><div class='add'>+{</div><div class='add'>+    local vol=$1</div><div class='add'>+    local field=$2</div><div class='add'>+    $CLI volume get $vol $field | tail -1 | awk '{print $2}'</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+function brick_count()</div><div class='add'>+{</div><div class='add'>+    local vol=$1;</div><div class='add'>+</div><div class='add'>+    $CLI volume info $vol | egrep "^Brick[0-9]+: " | wc -l;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function check_brick_status() {</div><div class='add'>+       cmd="gluster --xml volume status"</div><div class='add'>+       local daemon=$1</div><div class='add'>+</div><div class='add'>+       if [[ -z $daemon ]]</div><div class='add'>+        then</div><div class='add'>+                echo `$cmd | grep '&lt;status&gt;1' | wc -l`</div><div class='add'>+       else</div><div class='add'>+                echo `$cmd | grep -A 5 ${daemon} | grep '&lt;status&gt;1' | wc -l`</div><div class='add'>+       fi</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function online_brick_count ()</div><div class='add'>+{</div><div class='add'>+       local v1=0</div><div class='add'>+       local v2=0</div><div class='add'>+       local v3=0</div><div class='add'>+       local v4=0</div><div class='add'>+       local v5=0</div><div class='add'>+       local tot=0</div><div class='add'>+</div><div class='add'>+       #First count total Number of bricks and then subtract daemon status</div><div class='add'>+       v1=`check_brick_status`</div><div class='add'>+       v2=`check_brick_status "Self-heal"`</div><div class='add'>+       v3=`check_brick_status "Quota"`</div><div class='add'>+       v4=`check_brick_status "Snapshot"`</div><div class='add'>+       v5=`check_brick_status "Tier"`</div><div class='add'>+       v6=`check_brick_status "Scrubber"`</div><div class='add'>+       v7=`check_brick_status "Bitrot"`</div><div class='add'>+</div><div class='add'>+       tot=$((v1-v2-v3-v4-v5-v6-v7))</div><div class='add'>+       echo $tot</div><div class='add'>+</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+function brick_up_status {</div><div class='add'>+        local vol=$1</div><div class='add'>+        local host=$2</div><div class='add'>+        local brick=$3</div><div class='add'>+        $CLI volume status $vol $host:$brick --xml | sed -ne 's/.*&lt;status&gt;\([01]\)&lt;\/status&gt;/\1/p'</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function volume_option()</div><div class='add'>+{</div><div class='add'>+        local vol=$1</div><div class='add'>+        local key=$2</div><div class='add'>+        $CLI volume info $vol | egrep "^$key: " | cut -f2 -d' ';</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function rebalance_status_field {</div><div class='add'>+        $CLI volume rebalance $1 status | awk '{print $7}' | sed -n 3p</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function fix-layout_status_field {</div><div class='add'>+        #The fix-layout status can be up to 3 words, (ex:'fix-layout in progress'), hence the awk-print $2 thru $4.</div><div class='add'>+        #But if the status is less than 3 words, it also prints the next field i.e the run_time_in_secs.(ex:'completed 3.00').</div><div class='add'>+        #So we trim the numbers out with  `tr`. Finally remove the trailing white spaces with sed. What we get is one of the</div><div class='add'>+        #strings in the 'cli_vol_task_status_str' char array of cli-rpc-ops.c</div><div class='add'>+</div><div class='add'>+        $CLI volume rebalance $1 status | awk '{print $2,$3,$4}' |sed -n 3p |tr -d '[^0-9+\.]'|sed 's/ *$//g'</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function remove_brick_status_completed_field {</div><div class='add'>+        local vol=$1</div><div class='add'>+        local brick_list=$2</div><div class='add'>+        $CLI volume remove-brick $vol $brick_list status | awk '{print $7}' | sed -n 3p</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function get_mount_process_pid {</div><div class='add'>+        local vol=$1</div><div class='add'>+        local mnt=$2</div><div class='add'>+        ps auxww | grep glusterfs | grep -E "volfile-id[ =]/?$vol .*$mnt" | awk '{print $2}' | head -1</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function get_nfs_pid ()</div><div class='add'>+{</div><div class='add'>+        ps auxww | grep "volfile-id\ gluster\/nfs" | awk '{print $2}' | head -1</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function read_nfs_pidfile ()</div><div class='add'>+{</div><div class='add'>+        echo `cat $GLUSTERD_PIDFILEDIR/nfs/nfs.pid`</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function cleanup_statedump {</div><div class='add'>+       pid=$1</div><div class='add'>+       rm -f $statedumpdir/*$pid.dump.*</div><div class='add'>+       #.vimrc friendly comment */</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function wait_statedump_ready {</div><div class='add'>+        local maxtime="${1}000000000"</div><div class='add'>+        local pid="$2"</div><div class='add'>+        local deadline="$(($(date +%s%N) + maxtime))"</div><div class='add'>+        local fname</div><div class='add'>+</div><div class='add'>+        while [[ "$(date +%s%N)" &lt; "$deadline" ]]; do</div><div class='add'>+                fname="$statedumpdir/$(ls $statedumpdir | grep -E "\.$pid\.dump\.")"</div><div class='add'>+                if [[ -f "$fname" ]]; then</div><div class='add'>+                        grep "^DUMP-END-TIME" "$fname" &gt;/dev/null</div><div class='add'>+                        if [[ $? -eq 0 ]]; then</div><div class='add'>+                                echo $fname</div><div class='add'>+                                return</div><div class='add'>+                        fi</div><div class='add'>+                fi</div><div class='add'>+                sleep 0.1</div><div class='add'>+        done</div><div class='add'>+</div><div class='add'>+        echo "nostatedump"</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function generate_statedump {</div><div class='add'>+        pid=$1</div><div class='add'>+        #remove old stale statedumps</div><div class='add'>+        cleanup_statedump $pid</div><div class='add'>+        kill -USR1 $pid</div><div class='add'>+        wait_statedump_ready 3 $pid</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function generate_mount_statedump {</div><div class='add'>+        local vol=$1</div><div class='add'>+        local mnt=$2</div><div class='add'>+        generate_statedump $(get_mount_process_pid $vol $mnt)</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function cleanup_mount_statedump {</div><div class='add'>+        local vol=$1</div><div class='add'>+        cleanup_statedump $(get_mount_process_pid $vol)</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function snap_client_connected_status {</div><div class='add'>+         local vol=$1</div><div class='add'>+         local fpath=$(generate_mount_statedump $vol)</div><div class='add'>+         up=$(grep -a -A1 xlator.protocol.client.$vol-snapd-client.priv $fpath | tail -1 | cut -f 2 -d'=')</div><div class='add'>+         rm -f $fpath</div><div class='add'>+         echo "$up"</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function _jbrc_child_up_status {</div><div class='add'>+        local vol=$1</div><div class='add'>+        #brick_id is (brick-num in volume info - 1)</div><div class='add'>+        local brick_id=$2</div><div class='add'>+        local gen_state_dump=$3</div><div class='add'>+        local fpath=$($gen_state_dump $vol)</div><div class='add'>+        up=$(grep -a -B1 child_$brick_id=$vol-client-$brick_id $fpath | head -1 | cut -f2 -d'=')</div><div class='add'>+        rm -f $fpath</div><div class='add'>+        echo "$up"</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function jbrc_child_up_status {</div><div class='add'>+        local vol=$1</div><div class='add'>+        #brick_id is (brick-num in volume info - 1)</div><div class='add'>+        local brick_id=$2</div><div class='add'>+        _jbrc_child_up_status $vol $brick_id generate_mount_statedump</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function _afr_child_up_status {</div><div class='add'>+        local vol=$1</div><div class='add'>+        #brick_id is (brick-num in volume info - 1)</div><div class='add'>+        local brick_id=$2</div><div class='add'>+        local gen_state_dump=$3</div><div class='add'>+        local fpath=$($gen_state_dump $vol)</div><div class='add'>+        up=$(grep -a -B1 trusted.afr.$vol-client-$brick_id $fpath | head -1 | cut -f2 -d'=')</div><div class='add'>+        rm -f $fpath</div><div class='add'>+        echo "$up"</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function afr_child_up_status_meta {</div><div class='add'>+        local mnt=$1</div><div class='add'>+        local repl=$2</div><div class='add'>+        local child=$3</div><div class='add'>+        grep -E "^child_up\[$child\]" $mnt/.meta/graphs/active/$repl/private | awk '{print $3}'</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function client_connected_status_meta {</div><div class='add'>+        local mnt=$1</div><div class='add'>+        local client=$2</div><div class='add'>+        grep "connected" $mnt/.meta/graphs/active/$client/private | awk '{print $3}'</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function afr_child_up_status {</div><div class='add'>+        local vol=$1</div><div class='add'>+        #brick_id is (brick-num in volume info - 1)</div><div class='add'>+        local brick_id=$2</div><div class='add'>+        _afr_child_up_status $vol $brick_id generate_mount_statedump</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function ec_get_info {</div><div class='add'>+        local vol=$1</div><div class='add'>+        local dist_id=$2</div><div class='add'>+        local key=$3</div><div class='add'>+        local fpath=$4</div><div class='add'>+        local value=$(sed -n "/^\[cluster\/disperse\.$vol-disperse-$dist_id\]/,/^\[/{s/^$key=\(.*\)/\1/p;}" $fpath | head -1)</div><div class='add'>+        rm -f $fpath</div><div class='add'>+        echo "$value"</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function ec_child_up_status {</div><div class='add'>+        local vol=$1</div><div class='add'>+        local dist_id=$2</div><div class='add'>+        local brick_id=$(($3 + 1))</div><div class='add'>+        local mnt=$4</div><div class='add'>+        local mask=$(ec_get_info $vol $dist_id "childs_up_mask" $(generate_mount_statedump $vol $mnt))</div><div class='add'>+        echo "${mask: -$brick_id:1}"</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function ec_child_up_count {</div><div class='add'>+        local vol=$1</div><div class='add'>+        local dist_id=$2</div><div class='add'>+        local mnt=$3</div><div class='add'>+        ec_get_info $vol $dist_id "childs_up" $(generate_mount_statedump $vol $mnt)</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function ec_child_up_status_shd {</div><div class='add'>+        local vol=$1</div><div class='add'>+        local dist_id=$2</div><div class='add'>+        local brick_id=$(($3 + 1))</div><div class='add'>+        local mask=$(ec_get_info $vol $dist_id "childs_up_mask" $(generate_shd_statedump $vol))</div><div class='add'>+        echo "${mask: -$brick_id:1}"</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function ec_child_up_count_shd {</div><div class='add'>+        local vol=$1</div><div class='add'>+        local dist_id=$2</div><div class='add'>+        ec_get_info $vol $dist_id "childs_up" $(generate_shd_statedump $vol)</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function get_shd_process_pid {</div><div class='add'>+        local vol=$1</div><div class='add'>+        ps auxww | grep "process-name\ glustershd" | awk '{print $2}' | head -1</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function generate_shd_statedump {</div><div class='add'>+        local vol=$1</div><div class='add'>+        generate_statedump $(get_shd_process_pid $vol)</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function generate_nfs_statedump {</div><div class='add'>+        generate_statedump $(get_nfs_pid)</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function generate_brick_statedump {</div><div class='add'>+        local vol=$1</div><div class='add'>+        local host=$2</div><div class='add'>+        local brick=$3</div><div class='add'>+        generate_statedump $(get_brick_pid $vol $host $brick)</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function afr_child_up_status_in_shd {</div><div class='add'>+        local vol=$1</div><div class='add'>+        #brick_id is (brick-num in volume info - 1)</div><div class='add'>+        local brick_id=$2</div><div class='add'>+        _afr_child_up_status $vol $brick_id generate_shd_statedump</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function afr_child_up_status_in_nfs {</div><div class='add'>+        local vol=$1</div><div class='add'>+        #brick_id is (brick-num in volume info - 1)</div><div class='add'>+        local brick_id=$2</div><div class='add'>+        _afr_child_up_status $vol $brick_id generate_nfs_statedump</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function nfs_up_status {</div><div class='add'>+        gluster volume status | grep "NFS Server" | awk '{print $7}'</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function glustershd_up_status {</div><div class='add'>+        gluster volume status | grep "Self-heal Daemon" | awk '{print $7}'</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function quotad_up_status {</div><div class='add'>+        gluster volume status | grep "Quota Daemon" | awk '{print $7}'</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function get_glusterd_pid {</div><div class='add'>+        pgrep '^glusterd$' | head -1</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function get_brick_pidfile {</div><div class='add'>+        local vol=$1</div><div class='add'>+        local host=$2</div><div class='add'>+        local brick=$3</div><div class='add'>+        local brick_hiphenated=$(echo $brick | tr '/' '-')</div><div class='add'>+        echo $GLUSTERD_PIDFILEDIR/vols/$vol/${host}${brick_hiphenated}.pid</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function get_brick_pid {</div><div class='add'>+	cat $(get_brick_pidfile $*)</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function kill_brick {</div><div class='add'>+        local vol=$1</div><div class='add'>+        local host=$2</div><div class='add'>+        local brick=$3</div><div class='add'>+</div><div class='add'>+	local pidfile=$(get_brick_pidfile $vol $host $brick)</div><div class='add'>+	local cmdline="/proc/$(cat $pidfile)/cmdline"</div><div class='add'>+	local socket=$(cat $cmdline | tr '\0' '\n' | grep '\.socket$')</div><div class='add'>+</div><div class='add'>+	gf_attach -d $socket $brick</div><div class='add'>+</div><div class='add'>+        local deadline="$(($(date +%s%N) + ${PROCESS_UP_TIMEOUT}000000000))"</div><div class='add'>+        while [[ "$(date +%s%N)" &lt; "$deadline" ]]; do</div><div class='add'>+                if [[ "$(brick_up_status $vol $host $brick)" == "0" ]]; then</div><div class='add'>+                        break</div><div class='add'>+                fi</div><div class='add'>+        done</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function check_option_help_presence {</div><div class='add'>+        local option=$1</div><div class='add'>+        $CLI volume set help | grep "^Option:" | grep -w $option</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function afr_get_changelog_xattr {</div><div class='add'>+        local file=$1</div><div class='add'>+        local xkey=$2</div><div class='add'>+        local xval=$(getfattr -n $xkey -e hex $file 2&gt;/dev/null | grep "$xkey" | cut -f2 -d'=')</div><div class='add'>+        if [ -z $xval ]; then</div><div class='add'>+                xval="0x000000000000000000000000"</div><div class='add'>+        fi</div><div class='add'>+        echo $xval</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function get_pending_heal_count {</div><div class='add'>+        local vol=$1</div><div class='add'>+        gluster volume heal $vol info | grep "Number of entries" | awk '{ sum+=$4} END {print sum}'</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function afr_get_split_brain_count {</div><div class='add'>+        local vol=$1</div><div class='add'>+        gluster volume heal $vol info split-brain | grep "Number of entries in split-brain" | awk '{ sum+=$6} END {print sum}'</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function afr_get_index_path {</div><div class='add'>+        local brick_path=$1</div><div class='add'>+        echo "$brick_path/.glusterfs/indices/xattrop"</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function afr_get_num_indices_in_brick {</div><div class='add'>+        local brick_path=$1</div><div class='add'>+        echo $(ls $(afr_get_index_path $brick_path) | grep -v xattrop | wc -l)</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function gf_get_gfid_xattr {</div><div class='add'>+        file=$1</div><div class='add'>+        getfattr -n trusted.gfid -e hex $file 2&gt;/dev/null | grep "trusted.gfid" | cut -f2 -d'='</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function gf_gfid_xattr_to_str {</div><div class='add'>+        xval=$1</div><div class='add'>+        echo "${xval:2:8}-${xval:10:4}-${xval:14:4}-${xval:18:4}-${xval:22:12}"</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function get_text_xattr {</div><div class='add'>+        local key=$1</div><div class='add'>+        local path=$2</div><div class='add'>+        getfattr -h -d -m. -e text $path 2&gt;/dev/null | grep -a $key | cut -f2 -d'='</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function get_gfid2path {</div><div class='add'>+        local path=$1</div><div class='add'>+        getfattr -h --only-values -n glusterfs.gfidtopath $path 2&gt;/dev/null</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function get_mdata {</div><div class='add'>+        local path=$1</div><div class='add'>+        getfattr -h -e hex -n trusted.glusterfs.mdata $path 2&gt;/dev/null | grep "trusted.glusterfs.mdata" | cut -f2 -d'='</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function get_mdata_count {</div><div class='add'>+    getfattr -d -m . -e hex $@ 2&gt;/dev/null | grep mdata | wc -l</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function get_mdata_uniq_count {</div><div class='add'>+    getfattr -d -m . -e hex $@ 2&gt;/dev/null | grep mdata | uniq | wc -l</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function get_xattr_key {</div><div class='add'>+        local key=$1</div><div class='add'>+        local path=$2</div><div class='add'>+        getfattr -h -d -m. -e text $path 2&gt;/dev/null | grep -a $key | cut -f1 -d'='</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function gf_check_file_opened_in_brick {</div><div class='add'>+        vol=$1</div><div class='add'>+        host=$2</div><div class='add'>+        brick=$3</div><div class='add'>+        realpath=$4</div><div class='add'>+        ls -l /proc/$(get_brick_pid $vol $host $brick)/fd | grep "${realpath}$" 2&gt;&amp;1 &gt; /dev/null</div><div class='add'>+        if [ $? -eq 0 ]; then</div><div class='add'>+                echo "Y"</div><div class='add'>+        else</div><div class='add'>+                echo "N"</div><div class='add'>+        fi</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function gf_get_gfid_backend_file_path {</div><div class='add'>+        brickpath=$1</div><div class='add'>+        filepath_in_brick=$2</div><div class='add'>+        gfid=$(gf_get_gfid_xattr "$brickpath/$filepath_in_brick")</div><div class='add'>+        gfidstr=$(gf_gfid_xattr_to_str $gfid)</div><div class='add'>+        echo "$brickpath/.glusterfs/${gfidstr:0:2}/${gfidstr:2:2}/$gfidstr"</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function gf_rm_file_and_gfid_link {</div><div class='add'>+        brickpath=$1</div><div class='add'>+        filepath_in_brick=$2</div><div class='add'>+        rm -f $(gf_get_gfid_backend_file_path $brickpath $filepath_in_brick)</div><div class='add'>+        rm -f "$brickpath/$filepath_in_brick"</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+function gd_is_replace_brick_completed {</div><div class='add'>+        local host=$1</div><div class='add'>+        local vol=$2</div><div class='add'>+        local src_brick=$3</div><div class='add'>+        local dst_brick=$4</div><div class='add'>+        $CLI volume replace-brick $vol $src_brick $dst_brick status | grep -i "Migration complete"</div><div class='add'>+        if [ $? -eq 0 ]; then</div><div class='add'>+                echo "Y"</div><div class='add'>+        else</div><div class='add'>+                echo "N"</div><div class='add'>+        fi</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function dht_get_layout {</div><div class='add'>+        local my_xa=trusted.glusterfs.dht</div><div class='add'>+        getfattr -d -e hex -n $my_xa $1 2&gt; /dev/null | grep "$my_xa=" | cut -d= -f2</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function afr_get_specific_changelog_xattr ()</div><div class='add'>+{</div><div class='add'>+        local path=$1</div><div class='add'>+        local key=$2</div><div class='add'>+        local type=$3</div><div class='add'>+        local specific_changelog=""</div><div class='add'>+</div><div class='add'>+        changelog_xattr=$(afr_get_changelog_xattr "$path" "$key")</div><div class='add'>+        if [ "$type" == "data" ]; then</div><div class='add'>+                specific_changelog=${changelog_xattr:2:8}</div><div class='add'>+        elif [ "$type" == "metadata" ]; then</div><div class='add'>+                specific_changelog=${changelog_xattr:10:8}</div><div class='add'>+        elif [ "$type" == "entry" ]; then</div><div class='add'>+                specific_changelog=${changelog_xattr:18:8}</div><div class='add'>+        else</div><div class='add'>+                specific_changlog="error"</div><div class='add'>+        fi</div><div class='add'>+</div><div class='add'>+        echo $specific_changelog</div><div class='add'>+}</div><div class='add'>+##</div><div class='add'>+ # query pathinfo xattr and extract POSIX pathname(s)</div><div class='add'>+ ##</div><div class='add'>+function get_backend_paths {</div><div class='add'>+       local path=$1</div><div class='add'>+</div><div class='add'>+       getfattr -m . -n trusted.glusterfs.pathinfo $path | tr ' ' '\n' | sed -n 's/&lt;POSIX.*:.*:\(.*\)&gt;.*/\1/p'</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#Gets the xattr value in hex, also removed 0x in front of the value</div><div class='add'>+function get_hex_xattr {</div><div class='add'>+        local key=$1</div><div class='add'>+        local path=$2</div><div class='add'>+        getfattr -d -m. -e hex $2 2&gt;/dev/null | grep $1 | cut -f2 -d'=' | cut -f2 -d'x'</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function cumulative_stat_count {</div><div class='add'>+    echo "$1" | grep "Cumulative Stats:" | wc -l</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function incremental_stat_count {</div><div class='add'>+    echo "$1" | grep "Interval$2Stats:" | wc -l</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function cleared_stat_count {</div><div class='add'>+    echo "$1" | grep "Cleared stats." | wc -l</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function data_read_count {</div><div class='add'>+    echo "$1" | grep "Data Read:$2bytes" | wc -l</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function data_written_count {</div><div class='add'>+    echo "$1" | grep "Data Written:$2bytes" | wc -l</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function has_holes {</div><div class='add'>+        if [ $((`stat -c '%b*%B-%s' $1`)) -lt 0 ];</div><div class='add'>+        then</div><div class='add'>+                echo "1"</div><div class='add'>+        else</div><div class='add'>+                echo "0"</div><div class='add'>+        fi</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function do_volume_operations() {</div><div class='add'>+        local operation=$1</div><div class='add'>+        local count=$2</div><div class='add'>+        local force=$3</div><div class='add'>+</div><div class='add'>+        local pids=()</div><div class='add'>+        local cli</div><div class='add'>+        local v</div><div class='add'>+</div><div class='add'>+         for i in `seq 1 $count`; do</div><div class='add'>+                cli="CLI_$i"</div><div class='add'>+                v="V`expr $i - 1`"</div><div class='add'>+                ${!cli} volume $operation ${!v} $force &amp;</div><div class='add'>+                pids[$i]=$!</div><div class='add'>+        done</div><div class='add'>+</div><div class='add'>+        for i in `seq 1 $count`; do</div><div class='add'>+                wait ${pids[$i]}</div><div class='add'>+        done</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function start_volumes() {</div><div class='add'>+        do_volume_operations start $1</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function stop_volumes() {</div><div class='add'>+        do_volume_operations stop $1</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function start_force_volumes() {</div><div class='add'>+        do_volume_operations start $1 force</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function stop_force_volumes() {</div><div class='add'>+        do_volume_operations stop $1 force</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function delete_volumes() {</div><div class='add'>+        do_volume_operations delete $1</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function volume_exists() {</div><div class='add'>+        $CLI volume info $1 &gt; /dev/null 2&gt;&amp;1</div><div class='add'>+	if [ $? -eq 0 ]; then</div><div class='add'>+		echo "Y"</div><div class='add'>+	else</div><div class='add'>+		echo "N"</div><div class='add'>+	fi</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function killall_gluster() {</div><div class='add'>+        terminate_pids $(process_pids gluster)</div><div class='add'>+        find $GLUSTERD_PIDFILEDIR -name '*.pid' | xargs rm -f</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function afr_get_index_count {</div><div class='add'>+        local brick=$1</div><div class='add'>+        ls $1/.glusterfs/indices/xattrop | grep -v xattrop | wc -l</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function landfill_entry_count {</div><div class='add'>+        local brick=$1</div><div class='add'>+        ls $brick/.glusterfs/landfill | wc -l</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function path_exists {</div><div class='add'>+        stat $1</div><div class='add'>+        if [ $? -eq 0 ]; then echo "Y"; else echo "N"; fi</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function path_size {</div><div class='add'>+        local size=$(stat -c %s $1)</div><div class='add'>+        if [ $? -eq 0 ]; then echo $size; else echo ""; fi</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function force_umount {</div><div class='add'>+        ${UMOUNT_F} $*</div><div class='add'>+        if [ $? -eq 0 ]; then echo "Y"; else echo "N"; fi</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function assign_gfid {</div><div class='add'>+        local gfid=$1</div><div class='add'>+        local file=$2</div><div class='add'>+        setfattr -n trusted.gfid -v $1 $2</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function get_random_gfid {</div><div class='add'>+        echo "0x"$(uuidgen | awk -F '-' 'BEGIN {OFS=""} {print $1,$2,$3,$4,$5}')</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function volgen_volume_exists {</div><div class='add'>+        local volfile="$1"</div><div class='add'>+        local xl_vol="$2"</div><div class='add'>+        local xl_type="$3"</div><div class='add'>+        local xl_feature="$4"</div><div class='add'>+        xl=$(sed -e "/./{H;\$!d;}" -e "x;/volume $xl_vol/!d;/type $xl_type\/$xl_feature/!d" $volfile)</div><div class='add'>+        if [ -z "$xl" ];</div><div class='add'>+        then</div><div class='add'>+                echo "N"</div><div class='add'>+        else</div><div class='add'>+                echo "Y"</div><div class='add'>+        fi</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function volgen_volume_option {</div><div class='add'>+        local volfile="$1"</div><div class='add'>+        local xl_vol="$2"</div><div class='add'>+        local xl_type="$3"</div><div class='add'>+        local xl_feature="$4"</div><div class='add'>+        local xl_option="$5"</div><div class='add'>+        sed -e "/./{H;\$!d;}" -e "x;/volume $xl_vol/!d;/type $xl_type\/$xl_feature/!d;/option $xl_option/!d" $volfile | grep " $xl_option " | awk '{print $3}'</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function mount_get_option_value {</div><div class='add'>+        local m=$1</div><div class='add'>+        local subvol=$2</div><div class='add'>+        local key=$3</div><div class='add'>+</div><div class='add'>+        grep -w "$3" $m/.meta/graphs/active/$subvol/private | awk '{print $3}'</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function get_volume_mark {</div><div class='add'>+        getfattr -n trusted.glusterfs.volume-mark -ehex $1 | sed -n 's/^trusted.glusterfs.volume-mark=0x//p' | cut -b5-36 | sed 's/\([a-f0-9]\{8\}\)\([a-f0-9]\{4\}\)\([a-f0-9]\{4\}\)\([a-f0-9]\{4\}\)/\1-\2-\3-\4-/'</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+# setup geo-rep in a single a node.</div><div class='add'>+</div><div class='add'>+function setup_georep {</div><div class='add'>+</div><div class='add'>+    $CLI volume create $GMV0 replica 2  $H0:$B0/${GMV0}{1,2,3,4};</div><div class='add'>+</div><div class='add'>+    $CLI volume start $GMV0</div><div class='add'>+</div><div class='add'>+    $CLI volume create $GSV0 replica 2  $H0:$B0/${GSV0}{1,2,3,4};</div><div class='add'>+</div><div class='add'>+    $CLI volume start $GSV0</div><div class='add'>+</div><div class='add'>+    $CLI system:: execute gsec_create</div><div class='add'>+</div><div class='add'>+    $CLI volume geo-rep $GMV0 $H0::$GSV0 create push-pem</div><div class='add'>+</div><div class='add'>+    $CLI volume geo-rep $GMV0 $H0::$GSV0 start</div><div class='add'>+</div><div class='add'>+    sleep 80 # after start geo-rep takes a minute to get stable</div><div class='add'>+</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+# stop and delete geo-rep session</div><div class='add'>+</div><div class='add'>+function cleanup_georep {</div><div class='add'>+</div><div class='add'>+    $CLI volume geo-rep $GMV0 $H0::$GSV0 stop</div><div class='add'>+</div><div class='add'>+    $CLI volume geo-rep $GMV0 $H0::$GSV0 delete</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function num_graphs</div><div class='add'>+{</div><div class='add'>+    local mountpoint=$1</div><div class='add'>+    echo `ls $mountpoint/.meta/graphs/ | grep -v active | wc -l`</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function get_aux()</div><div class='add'>+{</div><div class='add'>+##Check if a auxiliary mount is there</div><div class='add'>+local aux_suffix=$1</div><div class='add'>+local rundir=$(gluster --print-statedumpdir)</div><div class='add'>+local pidfile="${rundir}/${V0}$aux_suffix.pid"</div><div class='add'>+if [ -f $pidfile ];</div><div class='add'>+then</div><div class='add'>+        local pid=$(cat ${rundir}/${V0}.pid)</div><div class='add'>+        pidof glusterfs 2&gt;&amp;1 | grep -w $pid &gt; /dev/null</div><div class='add'>+</div><div class='add'>+        if [ $? -eq 0 ]</div><div class='add'>+        then</div><div class='add'>+                echo "0"</div><div class='add'>+        else</div><div class='add'>+                echo "1"</div><div class='add'>+        fi</div><div class='add'>+else</div><div class='add'>+        echo "1"</div><div class='add'>+fi</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function get_list_aux()</div><div class='add'>+{</div><div class='add'>+# check for quota list aux mount</div><div class='add'>+	get_aux "_quota_list"</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function get_limit_aux()</div><div class='add'>+{</div><div class='add'>+# check for quota list aux mount</div><div class='add'>+	get_aux "_quota_limit"</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function check_for_xattr {</div><div class='add'>+        local xattr=$1</div><div class='add'>+        local filepath=$2</div><div class='add'>+        getfattr -n $xattr $filepath 2&gt;/dev/null | grep "$xattr" | cut -f1 -d'='</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function get_bitd_count {</div><div class='add'>+        ps auxww | grep glusterfs | grep bitd.pid | grep -v grep | wc -l</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function get_scrubd_count {</div><div class='add'>+        ps auxww | grep glusterfs | grep scrub.pid | grep -v grep | wc -l</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function get_quarantine_count {</div><div class='add'>+        ls -l "$1/.glusterfs/quarantine" | wc -l</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function get_quotad_count {</div><div class='add'>+        ps auxww | grep glusterfs | grep quotad.pid | grep -v grep | wc -l</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function get_nfs_count {</div><div class='add'>+        ps auxww | grep glusterfs | grep nfs.pid | grep -v grep | wc -l</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function get_snapd_count {</div><div class='add'>+        ps auxww | grep glusterfs | grep snapd.pid | grep -v grep | wc -l</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function drop_cache() {</div><div class='add'>+	case $OSTYPE in</div><div class='add'>+	Linux)</div><div class='add'>+		echo 3 &gt; /proc/sys/vm/drop_caches</div><div class='add'>+		;;</div><div class='add'>+	*)</div><div class='add'>+		# fail but flush caches</div><div class='add'>+		( cd $1 &amp;&amp; umount $1 2&gt;/dev/null )</div><div class='add'>+		;;</div><div class='add'>+	esac</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function quota_list_field () {</div><div class='add'>+        local QUOTA_PATH=$1</div><div class='add'>+        local FIELD=$2</div><div class='add'>+        local awk_arg="{print \$$FIELD}"</div><div class='add'>+</div><div class='add'>+        $CLI volume quota $V0 list $QUOTA_PATH | grep $QUOTA_PATH | awk "$awk_arg"</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function quota_object_list_field () {</div><div class='add'>+        local QUOTA_PATH=$1</div><div class='add'>+        local FIELD=$2</div><div class='add'>+        local awk_arg="{print \$$FIELD}"</div><div class='add'>+</div><div class='add'>+        $CLI volume quota $V0 list-objects $QUOTA_PATH | grep $QUOTA_PATH | awk "$awk_arg"</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function quotausage()</div><div class='add'>+{</div><div class='add'>+        quota_list_field $1 4</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function quota_hard_limit()</div><div class='add'>+{</div><div class='add'>+        quota_list_field $1 2</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function quota_soft_limit()</div><div class='add'>+{</div><div class='add'>+        quota_list_field $1 3</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function quota_sl_exceeded()</div><div class='add'>+{</div><div class='add'>+        quota_list_field $1 6</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function quota_hl_exceeded()</div><div class='add'>+{</div><div class='add'>+        quota_list_field $1 7</div><div class='add'>+</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function quota_object_hard_limit()</div><div class='add'>+{</div><div class='add'>+        quota_object_list_field $1 2</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function scrub_status()</div><div class='add'>+{</div><div class='add'>+        local vol=$1;</div><div class='add'>+        local field=$2;</div><div class='add'>+</div><div class='add'>+        $CLI volume bitrot $vol scrub status | grep "^$field: " | sed 's/.*: //';</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function get_gfid_string {</div><div class='add'>+        local path=$1;</div><div class='add'>+        getfattr -n glusterfs.gfid.string $1 2&gt;/dev/null \</div><div class='add'>+                    | grep glusterfs.gfid.string | cut -d '"' -f 2</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function file_all_zeroes {</div><div class='add'>+        &lt; $1 tr -d '\0' | read -n 1 || echo 1</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function get_hard_link_count {</div><div class='add'>+        local path=$1;</div><div class='add'>+        stat -c %h $path</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function count_sh_entries()</div><div class='add'>+{</div><div class='add'>+    ls $1/.glusterfs/indices/xattrop | grep -v "xattrop-" | wc -l</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function check_brick_multiplex() {</div><div class='add'>+        cnt="$(ls /var/log/glusterfs/bricks|wc -l)"</div><div class='add'>+        local ret=$($CLI volume info|grep "cluster.brick-multiplex"|cut -d" " -f2)</div><div class='add'>+        local bcnt="$(brick_count)"</div><div class='add'>+</div><div class='add'>+        if [ $bcnt -ne 1 ]; then</div><div class='add'>+           if [ "$ret" = "on" ] || [ $cnt -eq 1 ]; then</div><div class='add'>+              echo "Y"</div><div class='add'>+           else</div><div class='add'>+              echo "N"</div><div class='add'>+           fi</div><div class='add'>+        else</div><div class='add'>+           echo "N"</div><div class='add'>+        fi</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function get_fd_count {</div><div class='add'>+        local vol=$1</div><div class='add'>+        local host=$2</div><div class='add'>+        local brick=$3</div><div class='add'>+        local fname=$4</div><div class='add'>+        local val="$(check_brick_multiplex)"</div><div class='add'>+        local gfid_str=$(gf_gfid_xattr_to_str $(gf_get_gfid_xattr $brick/$fname))</div><div class='add'>+        local statedump=$(generate_brick_statedump $vol $host $brick)</div><div class='add'>+        if [ $val == "N" ]; then</div><div class='add'>+            count=$(grep "gfid=$gfid_str" $statedump -A2 | grep fd-count | cut -f2 -d'=' | tail -1)</div><div class='add'>+        else</div><div class='add'>+            count=$(grep "${brick}.active.1" -A3 $statedump | grep "gfid=$gfid_str" -A2 | grep fd-count | cut -f2 -d'=' | tail -1)</div><div class='add'>+        fi</div><div class='add'>+# If no information is found for a given gfid, it means it has not been</div><div class='add'>+# accessed, so it doesn't have any open fd. In this case we return 0.</div><div class='add'>+        count="${count:-0}"</div><div class='add'>+        rm -f $statedump</div><div class='add'>+        echo $count</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+function get_active_fd_count {</div><div class='add'>+        local vol=$1</div><div class='add'>+        local host=$2</div><div class='add'>+        local brick=$3</div><div class='add'>+        local fname=$4</div><div class='add'>+        local val="$(check_brick_multiplex)"</div><div class='add'>+        local gfid_str=$(gf_gfid_xattr_to_str $(gf_get_gfid_xattr $brick/$fname))</div><div class='add'>+        local statedump=$(generate_brick_statedump $vol $host $brick)</div><div class='add'>+        if [ $val == "N" ]; then</div><div class='add'>+            count=$(grep "gfid=$gfid_str" $statedump -A2 | grep fd-count | cut -f2 -d'=' | tail -1)</div><div class='add'>+        else</div><div class='add'>+            count=$(grep "${brick}.active.1" -A3 $statedump | grep "gfid=$gfid_str" -A2 | grep fd-count | cut -f2 -d'=' | tail -1)</div><div class='add'>+        fi</div><div class='add'>+        rm -f $statedump</div><div class='add'>+        echo $count</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function get_mount_active_size_value {</div><div class='add'>+        local vol=$1</div><div class='add'>+        local mount=$2</div><div class='add'>+        local statedump=$(generate_mount_statedump $vol $mount)</div><div class='add'>+        local val=$(grep "active_size" $statedump | cut -f2 -d'=' | tail -1)</div><div class='add'>+        rm -f $statedump</div><div class='add'>+        echo $val</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function get_mount_lru_size_value {</div><div class='add'>+        local vol=$1</div><div class='add'>+        local mount=$2</div><div class='add'>+        local statedump=$(generate_mount_statedump $vol $mount)</div><div class='add'>+        local val=$(grep "lru_size" $statedump | cut -f2 -d'=' | tail -1)</div><div class='add'>+        rm -f $statedump</div><div class='add'>+        echo $val</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function check_changelog_op {</div><div class='add'>+        local clog_path=$1</div><div class='add'>+        local op=$2</div><div class='add'>+</div><div class='add'>+        $PYTHON $(dirname $0)/../../utils/changelogparser.py ${clog_path}/CHANGELOG | grep "$op" | wc -l</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function processed_changelogs {</div><div class='add'>+        local processed_dir=$1</div><div class='add'>+        count=$(ls -l $processed_dir | grep CHANGELOG | wc -l)</div><div class='add'>+        if [ $count -gt 0 ];</div><div class='add'>+        then</div><div class='add'>+            echo "Y"</div><div class='add'>+        else</div><div class='add'>+            echo "N"</div><div class='add'>+        fi</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function volgen_check_ancestry {</div><div class='add'>+        #Returns Y if ancestor_xl is an ancestor of $child_xl according to the volfile</div><div class='add'>+        local volfile="$1"</div><div class='add'>+</div><div class='add'>+        local child_xl_type="$2"</div><div class='add'>+        local child_xl="$3"</div><div class='add'>+</div><div class='add'>+        local ancestor_xl_type="$4"</div><div class='add'>+        local ancestor_xl="$5"</div><div class='add'>+</div><div class='add'>+        child_linenum=$(awk '/type $child_xl_type\/$child_xl/ {print FNR}' $volfile)</div><div class='add'>+        ancestor_linenum=$(awk '/type $ancestor_xl_type\/$ancestor_xl/ {print FNR}' $volfile)</div><div class='add'>+</div><div class='add'>+        if [ $child_linenum -lt $ancestor_linenum ];</div><div class='add'>+        then</div><div class='add'>+                echo "Y"</div><div class='add'>+        else</div><div class='add'>+                echo "N"</div><div class='add'>+        fi</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function get_shd_mux_pid {</div><div class='add'>+   local volume=$1</div><div class='add'>+   pid=`$CLI volume status $volume shd | awk '/Self-heal/{print $8}'`</div><div class='add'>+   echo $pid</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function shd_count {</div><div class='add'>+   ps aux | grep "glustershd" | grep -v grep | wc -l</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function number_healer_threads_shd {</div><div class='add'>+   local pid=$(get_shd_mux_pid $1)</div><div class='add'>+   pstack $pid | grep $2 | wc -l</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function get_mtime {</div><div class='add'>+    local time=$(get-mdata-xattr -m $1)</div><div class='add'>+    if [ $time == "-1" ];</div><div class='add'>+    then</div><div class='add'>+        echo $(stat -c %Y $1)</div><div class='add'>+    else</div><div class='add'>+        echo $time</div><div class='add'>+    fi</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function get_ctime {</div><div class='add'>+    local time=$(get-mdata-xattr -c $1)</div><div class='add'>+    if [ $time == "-1" ];</div><div class='add'>+    then</div><div class='add'>+        echo $(stat -c %Z $1)</div><div class='add'>+    else</div><div class='add'>+        echo $time</div><div class='add'>+    fi</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function get_atime {</div><div class='add'>+    local time=$(get-mdata-xattr -a $1)</div><div class='add'>+    if [ $time == "-1" ];</div><div class='add'>+    then</div><div class='add'>+        echo $(stat -c %X $1)</div><div class='add'>+    else</div><div class='add'>+        echo $time</div><div class='add'>+    fi</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function get-xml()</div><div class='add'>+{</div><div class='add'>+        $CLI $1 --xml | xmllint --format - | grep $2 | sed 's/\(&lt;"$2"&gt;\|&lt;\/"$2"&gt;\)//g'</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+function logging_time_check()</div><div class='add'>+{</div><div class='add'>+    local logdir=$1</div><div class='add'>+    local logfile=`echo ${0##*/}`_glusterd1.log</div><div class='add'>+</div><div class='add'>+    cat $logdir/1/$logfile | tail -n 2 | head -n 1 | grep $(date +%H:%M) | wc -l</div><div class='add'>+}</div><div class='head'>diff --git a/tools/Makefile.am b/tools/Makefile.am<br/>new file mode 100644<br/>index 00000000000..5808a3728cd<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tools/Makefile.am?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tools/Makefile.am</a></div><div class='hunk'>@@ -0,0 +1,3 @@</div><div class='add'>+SUBDIRS = gfind_missing_files glusterfind setgfid2path</div><div class='add'>+</div><div class='add'>+CLEANFILES =</div><div class='head'>diff --git a/tools/gfind_missing_files/Makefile.am b/tools/gfind_missing_files/Makefile.am<br/>new file mode 100644<br/>index 00000000000..181fe7091f3<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tools/gfind_missing_files/Makefile.am?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tools/gfind_missing_files/Makefile.am</a></div><div class='hunk'>@@ -0,0 +1,32 @@</div><div class='add'>+gfindmissingfilesdir = $(GLUSTERFS_LIBEXECDIR)/gfind_missing_files</div><div class='add'>+</div><div class='add'>+if WITH_SERVER</div><div class='add'>+gfindmissingfiles_SCRIPTS = gfind_missing_files.sh gfid_to_path.sh \</div><div class='add'>+	gfid_to_path.py</div><div class='add'>+endif</div><div class='add'>+</div><div class='add'>+EXTRA_DIST = gfind_missing_files.sh gfid_to_path.sh \</div><div class='add'>+	gfid_to_path.py</div><div class='add'>+</div><div class='add'>+if WITH_SERVER</div><div class='add'>+gfindmissingfiles_PROGRAMS = gcrawler</div><div class='add'>+endif</div><div class='add'>+</div><div class='add'>+gcrawler_SOURCES = gcrawler.c</div><div class='add'>+gcrawler_LDADD = $(top_builddir)/libglusterfs/src/libglusterfs.la</div><div class='add'>+gcrawler_LDFLAGS = $(GF_LDFLAGS)</div><div class='add'>+</div><div class='add'>+AM_CPPFLAGS = $(GF_CPPFLAGS) -I$(top_srcdir)/libglusterfs/src</div><div class='add'>+</div><div class='add'>+AM_CFLAGS = -Wall $(GF_CFLAGS)</div><div class='add'>+</div><div class='add'>+if WITH_SERVER</div><div class='add'>+uninstall-local:</div><div class='add'>+	rm -f $(DESTDIR)$(sbindir)/gfind_missing_files</div><div class='add'>+</div><div class='add'>+install-data-local:</div><div class='add'>+	rm -f $(DESTDIR)$(sbindir)/gfind_missing_files</div><div class='add'>+	ln -s $(GLUSTERFS_LIBEXECDIR)/gfind_missing_files/gfind_missing_files.sh $(DESTDIR)$(sbindir)/gfind_missing_files</div><div class='add'>+endif</div><div class='add'>+</div><div class='add'>+CLEANFILES =</div><div class='head'>diff --git a/tools/gfind_missing_files/gcrawler.c b/tools/gfind_missing_files/gcrawler.c<br/>new file mode 100644<br/>index 00000000000..4acbe92bc8f<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tools/gfind_missing_files/gcrawler.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tools/gfind_missing_files/gcrawler.c</a></div><div class='hunk'>@@ -0,0 +1,581 @@</div><div class='add'>+/*</div><div class='add'>+  Copyright (c) 2015 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#include &lt;stdio.h&gt;</div><div class='add'>+#include &lt;errno.h&gt;</div><div class='add'>+#include &lt;sys/stat.h&gt;</div><div class='add'>+#include &lt;unistd.h&gt;</div><div class='add'>+#include &lt;stdlib.h&gt;</div><div class='add'>+#include &lt;string.h&gt;</div><div class='add'>+#include &lt;dirent.h&gt;</div><div class='add'>+#include &lt;assert.h&gt;</div><div class='add'>+#include &lt;glusterfs/locking.h&gt;</div><div class='add'>+</div><div class='add'>+#include &lt;glusterfs/compat.h&gt;</div><div class='add'>+#include &lt;glusterfs/list.h&gt;</div><div class='add'>+#include &lt;glusterfs/syscall.h&gt;</div><div class='add'>+</div><div class='add'>+#define THREAD_MAX 32</div><div class='add'>+#define BUMP(name) INC(name, 1)</div><div class='add'>+#define DEFAULT_WORKERS 4</div><div class='add'>+</div><div class='add'>+#define NEW(x)                                                                 \</div><div class='add'>+    {                                                                          \</div><div class='add'>+        x = calloc(1, sizeof(typeof(*x)));                                     \</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+#define err(x...) fprintf(stderr, x)</div><div class='add'>+#define out(x...) fprintf(stdout, x)</div><div class='add'>+#define dbg(x...)                                                              \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        if (debug)                                                             \</div><div class='add'>+            fprintf(stdout, x);                                                \</div><div class='add'>+    } while (0)</div><div class='add'>+#define tout(x...)                                                             \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        out("[%ld] ", pthread_self());                                         \</div><div class='add'>+        out(x);                                                                \</div><div class='add'>+    } while (0)</div><div class='add'>+#define terr(x...)                                                             \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        err("[%ld] ", pthread_self());                                         \</div><div class='add'>+        err(x);                                                                \</div><div class='add'>+    } while (0)</div><div class='add'>+#define tdbg(x...)                                                             \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        dbg("[%ld] ", pthread_self());                                         \</div><div class='add'>+        dbg(x);                                                                \</div><div class='add'>+    } while (0)</div><div class='add'>+</div><div class='add'>+int debug = 0;</div><div class='add'>+const char *slavemnt = NULL;</div><div class='add'>+int workers = 0;</div><div class='add'>+</div><div class='add'>+struct stats {</div><div class='add'>+    unsigned long long int cnt_skipped_gfids;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+pthread_spinlock_t stats_lock;</div><div class='add'>+</div><div class='add'>+struct stats stats_total;</div><div class='add'>+int stats = 0;</div><div class='add'>+</div><div class='add'>+#define INC(name, val)                                                         \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        if (!stats)                                                            \</div><div class='add'>+            break;                                                             \</div><div class='add'>+        pthread_spin_lock(&amp;stats_lock);                                        \</div><div class='add'>+        {                                                                      \</div><div class='add'>+            stats_total.cnt_##name += val;                                     \</div><div class='add'>+        }                                                                      \</div><div class='add'>+        pthread_spin_unlock(&amp;stats_lock);                                      \</div><div class='add'>+    } while (0)</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+stats_dump()</div><div class='add'>+{</div><div class='add'>+    if (!stats)</div><div class='add'>+        return;</div><div class='add'>+</div><div class='add'>+    out("-------------------------------------------\n");</div><div class='add'>+    out("Skipped_Files : %10lld\n", stats_total.cnt_skipped_gfids);</div><div class='add'>+    out("-------------------------------------------\n");</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+struct dirjob {</div><div class='add'>+    struct list_head list;</div><div class='add'>+</div><div class='add'>+    char *dirname;</div><div class='add'>+</div><div class='add'>+    struct dirjob *parent;</div><div class='add'>+    int ret;    /* final status of this subtree */</div><div class='add'>+    int refcnt; /* how many dirjobs have this as parent */</div><div class='add'>+</div><div class='add'>+    pthread_spinlock_t lock;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct xwork {</div><div class='add'>+    pthread_t cthreads[THREAD_MAX]; /* crawler threads */</div><div class='add'>+    int count;</div><div class='add'>+    int idle;</div><div class='add'>+    int stop;</div><div class='add'>+</div><div class='add'>+    struct dirjob crawl;</div><div class='add'>+</div><div class='add'>+    struct dirjob *rootjob; /* to verify completion in xwork_fini() */</div><div class='add'>+</div><div class='add'>+    pthread_mutex_t mutex;</div><div class='add'>+    pthread_cond_t cond;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct dirjob *</div><div class='add'>+dirjob_ref(struct dirjob *job)</div><div class='add'>+{</div><div class='add'>+    pthread_spin_lock(&amp;job-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        job-&gt;refcnt++;</div><div class='add'>+    }</div><div class='add'>+    pthread_spin_unlock(&amp;job-&gt;lock);</div><div class='add'>+</div><div class='add'>+    return job;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+dirjob_free(struct dirjob *job)</div><div class='add'>+{</div><div class='add'>+    assert(list_empty(&amp;job-&gt;list));</div><div class='add'>+</div><div class='add'>+    pthread_spin_destroy(&amp;job-&gt;lock);</div><div class='add'>+    free(job-&gt;dirname);</div><div class='add'>+    free(job);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+dirjob_ret(struct dirjob *job, int err)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+    int refcnt = 0;</div><div class='add'>+    struct dirjob *parent = NULL;</div><div class='add'>+</div><div class='add'>+    pthread_spin_lock(&amp;job-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        refcnt = --job-&gt;refcnt;</div><div class='add'>+        job-&gt;ret = (job-&gt;ret || err);</div><div class='add'>+    }</div><div class='add'>+    pthread_spin_unlock(&amp;job-&gt;lock);</div><div class='add'>+</div><div class='add'>+    if (refcnt == 0) {</div><div class='add'>+        ret = job-&gt;ret;</div><div class='add'>+</div><div class='add'>+        if (ret)</div><div class='add'>+            terr("Failed: %s (%d)\n", job-&gt;dirname, ret);</div><div class='add'>+        else</div><div class='add'>+            tdbg("Finished: %s\n", job-&gt;dirname);</div><div class='add'>+</div><div class='add'>+        parent = job-&gt;parent;</div><div class='add'>+        if (parent)</div><div class='add'>+            dirjob_ret(parent, ret);</div><div class='add'>+</div><div class='add'>+        dirjob_free(job);</div><div class='add'>+        job = NULL;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+struct dirjob *</div><div class='add'>+dirjob_new(const char *dir, struct dirjob *parent)</div><div class='add'>+{</div><div class='add'>+    struct dirjob *job = NULL;</div><div class='add'>+</div><div class='add'>+    NEW(job);</div><div class='add'>+    if (!job)</div><div class='add'>+        return NULL;</div><div class='add'>+</div><div class='add'>+    job-&gt;dirname = strdup(dir);</div><div class='add'>+    if (!job-&gt;dirname) {</div><div class='add'>+        free(job);</div><div class='add'>+        return NULL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    INIT_LIST_HEAD(&amp;job-&gt;list);</div><div class='add'>+    pthread_spin_init(&amp;job-&gt;lock, PTHREAD_PROCESS_PRIVATE);</div><div class='add'>+    job-&gt;ret = 0;</div><div class='add'>+</div><div class='add'>+    if (parent)</div><div class='add'>+        job-&gt;parent = dirjob_ref(parent);</div><div class='add'>+</div><div class='add'>+    job-&gt;refcnt = 1;</div><div class='add'>+</div><div class='add'>+    return job;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+xwork_addcrawl(struct xwork *xwork, struct dirjob *job)</div><div class='add'>+{</div><div class='add'>+    pthread_mutex_lock(&amp;xwork-&gt;mutex);</div><div class='add'>+    {</div><div class='add'>+        list_add_tail(&amp;job-&gt;list, &amp;xwork-&gt;crawl.list);</div><div class='add'>+        pthread_cond_broadcast(&amp;xwork-&gt;cond);</div><div class='add'>+    }</div><div class='add'>+    pthread_mutex_unlock(&amp;xwork-&gt;mutex);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+xwork_add(struct xwork *xwork, const char *dir, struct dirjob *parent)</div><div class='add'>+{</div><div class='add'>+    struct dirjob *job = NULL;</div><div class='add'>+</div><div class='add'>+    job = dirjob_new(dir, parent);</div><div class='add'>+    if (!job)</div><div class='add'>+        return -1;</div><div class='add'>+</div><div class='add'>+    xwork_addcrawl(xwork, job);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+struct dirjob *</div><div class='add'>+xwork_pick(struct xwork *xwork, int block)</div><div class='add'>+{</div><div class='add'>+    struct dirjob *job = NULL;</div><div class='add'>+    struct list_head *head = NULL;</div><div class='add'>+</div><div class='add'>+    head = &amp;xwork-&gt;crawl.list;</div><div class='add'>+</div><div class='add'>+    pthread_mutex_lock(&amp;xwork-&gt;mutex);</div><div class='add'>+    {</div><div class='add'>+        for (;;) {</div><div class='add'>+            if (xwork-&gt;stop)</div><div class='add'>+                break;</div><div class='add'>+</div><div class='add'>+            if (!list_empty(head)) {</div><div class='add'>+                job = list_entry(head-&gt;next, typeof(*job), list);</div><div class='add'>+                list_del_init(&amp;job-&gt;list);</div><div class='add'>+                break;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            if (((xwork-&gt;count * 2) == xwork-&gt;idle) &amp;&amp;</div><div class='add'>+                list_empty(&amp;xwork-&gt;crawl.list)) {</div><div class='add'>+                /* no outstanding jobs, and no</div><div class='add'>+                   active workers</div><div class='add'>+                */</div><div class='add'>+                tdbg("Jobless. Terminating\n");</div><div class='add'>+                xwork-&gt;stop = 1;</div><div class='add'>+                pthread_cond_broadcast(&amp;xwork-&gt;cond);</div><div class='add'>+                break;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            if (!block)</div><div class='add'>+                break;</div><div class='add'>+</div><div class='add'>+            xwork-&gt;idle++;</div><div class='add'>+            pthread_cond_wait(&amp;xwork-&gt;cond, &amp;xwork-&gt;mutex);</div><div class='add'>+            xwork-&gt;idle--;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    pthread_mutex_unlock(&amp;xwork-&gt;mutex);</div><div class='add'>+</div><div class='add'>+    return job;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+skip_name(const char *dirname, const char *name)</div><div class='add'>+{</div><div class='add'>+    if (strcmp(name, ".") == 0)</div><div class='add'>+        return 1;</div><div class='add'>+</div><div class='add'>+    if (strcmp(name, "..") == 0)</div><div class='add'>+        return 1;</div><div class='add'>+</div><div class='add'>+    if (strcmp(name, "changelogs") == 0)</div><div class='add'>+        return 1;</div><div class='add'>+</div><div class='add'>+    if (strcmp(name, "health_check") == 0)</div><div class='add'>+        return 1;</div><div class='add'>+</div><div class='add'>+    if (strcmp(name, "indices") == 0)</div><div class='add'>+        return 1;</div><div class='add'>+</div><div class='add'>+    if (strcmp(name, "landfill") == 0)</div><div class='add'>+        return 1;</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+skip_stat(struct dirjob *job, const char *name)</div><div class='add'>+{</div><div class='add'>+    if (job == NULL)</div><div class='add'>+        return 0;</div><div class='add'>+</div><div class='add'>+    if (strcmp(job-&gt;dirname, ".glusterfs") == 0) {</div><div class='add'>+        tdbg(</div><div class='add'>+            "Directly adding directories under .glusterfs "</div><div class='add'>+            "to global list: %s\n",</div><div class='add'>+            name);</div><div class='add'>+        return 1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (job-&gt;parent != NULL) {</div><div class='add'>+        if (strcmp(job-&gt;parent-&gt;dirname, ".glusterfs") == 0) {</div><div class='add'>+            tdbg(</div><div class='add'>+                "Directly adding directories under .glusterfs/XX "</div><div class='add'>+                "to global list: %s\n",</div><div class='add'>+                name);</div><div class='add'>+            return 1;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+xworker_do_crawl(struct xwork *xwork, struct dirjob *job)</div><div class='add'>+{</div><div class='add'>+    DIR *dirp = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int boff;</div><div class='add'>+    int plen;</div><div class='add'>+    char *path = NULL;</div><div class='add'>+    struct dirjob *cjob = NULL;</div><div class='add'>+    struct stat statbuf = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    struct dirent *entry;</div><div class='add'>+    struct dirent scratch[2] = {</div><div class='add'>+        {</div><div class='add'>+            0,</div><div class='add'>+        },</div><div class='add'>+    };</div><div class='add'>+    char gfid_path[PATH_MAX] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    plen = strlen(job-&gt;dirname) + 256 + 2;</div><div class='add'>+    path = alloca(plen);</div><div class='add'>+</div><div class='add'>+    tdbg("Entering: %s\n", job-&gt;dirname);</div><div class='add'>+</div><div class='add'>+    dirp = sys_opendir(job-&gt;dirname);</div><div class='add'>+    if (!dirp) {</div><div class='add'>+        terr("opendir failed on %s (%s)\n", job-&gt;dirname, strerror(errno));</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    boff = sprintf(path, "%s/", job-&gt;dirname);</div><div class='add'>+</div><div class='add'>+    for (;;) {</div><div class='add'>+        errno = 0;</div><div class='add'>+        entry = sys_readdir(dirp, scratch);</div><div class='add'>+        if (!entry || errno != 0) {</div><div class='add'>+            if (errno != 0) {</div><div class='add'>+                err("readdir(%s): %s\n", job-&gt;dirname, strerror(errno));</div><div class='add'>+                ret = errno;</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+            break;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        if (entry-&gt;d_ino == 0)</div><div class='add'>+            continue;</div><div class='add'>+</div><div class='add'>+        if (skip_name(job-&gt;dirname, entry-&gt;d_name))</div><div class='add'>+            continue;</div><div class='add'>+</div><div class='add'>+        /* It is sure that, children and grandchildren of .glusterfs</div><div class='add'>+         * are directories, just add them to global queue.</div><div class='add'>+         */</div><div class='add'>+        if (skip_stat(job, entry-&gt;d_name)) {</div><div class='add'>+            strncpy(path + boff, entry-&gt;d_name, (plen - boff));</div><div class='add'>+            cjob = dirjob_new(path, job);</div><div class='add'>+            if (!cjob) {</div><div class='add'>+                err("dirjob_new(%s): %s\n", path, strerror(errno));</div><div class='add'>+                ret = -1;</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+            xwork_addcrawl(xwork, cjob);</div><div class='add'>+            continue;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        (void)snprintf(gfid_path, sizeof(gfid_path), "%s/.gfid/%s", slavemnt,</div><div class='add'>+                       entry-&gt;d_name);</div><div class='add'>+        ret = sys_lstat(gfid_path, &amp;statbuf);</div><div class='add'>+</div><div class='add'>+        if (ret &amp;&amp; errno == ENOENT) {</div><div class='add'>+            out("%s\n", entry-&gt;d_name);</div><div class='add'>+            BUMP(skipped_gfids);</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        if (ret &amp;&amp; errno != ENOENT) {</div><div class='add'>+            err("stat on slave failed(%s): %s\n", gfid_path, strerror(errno));</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+out:</div><div class='add'>+    if (dirp)</div><div class='add'>+        (void)sys_closedir(dirp);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void *</div><div class='add'>+xworker_crawl(void *data)</div><div class='add'>+{</div><div class='add'>+    struct xwork *xwork = data;</div><div class='add'>+    struct dirjob *job = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    while ((job = xwork_pick(xwork, 0))) {</div><div class='add'>+        ret = xworker_do_crawl(xwork, job);</div><div class='add'>+        dirjob_ret(job, ret);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return NULL;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+xwork_fini(struct xwork *xwork, int stop)</div><div class='add'>+{</div><div class='add'>+    int i = 0;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    void *tret = 0;</div><div class='add'>+</div><div class='add'>+    pthread_mutex_lock(&amp;xwork-&gt;mutex);</div><div class='add'>+    {</div><div class='add'>+        xwork-&gt;stop = (xwork-&gt;stop || stop);</div><div class='add'>+        pthread_cond_broadcast(&amp;xwork-&gt;cond);</div><div class='add'>+    }</div><div class='add'>+    pthread_mutex_unlock(&amp;xwork-&gt;mutex);</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; xwork-&gt;count; i++) {</div><div class='add'>+        pthread_join(xwork-&gt;cthreads[i], &amp;tret);</div><div class='add'>+        tdbg("CThread id %ld returned %p\n", xwork-&gt;cthreads[i], tret);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (debug) {</div><div class='add'>+        assert(xwork-&gt;rootjob-&gt;refcnt == 1);</div><div class='add'>+        dirjob_ret(xwork-&gt;rootjob, 0);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (stats)</div><div class='add'>+        pthread_spin_destroy(&amp;stats_lock);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+xwork_init(struct xwork *xwork, int count)</div><div class='add'>+{</div><div class='add'>+    int i = 0;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    struct dirjob *rootjob = NULL;</div><div class='add'>+</div><div class='add'>+    if (stats)</div><div class='add'>+        pthread_spin_init(&amp;stats_lock, PTHREAD_PROCESS_PRIVATE);</div><div class='add'>+</div><div class='add'>+    pthread_mutex_init(&amp;xwork-&gt;mutex, NULL);</div><div class='add'>+    pthread_cond_init(&amp;xwork-&gt;cond, NULL);</div><div class='add'>+</div><div class='add'>+    INIT_LIST_HEAD(&amp;xwork-&gt;crawl.list);</div><div class='add'>+</div><div class='add'>+    rootjob = dirjob_new(".glusterfs", NULL);</div><div class='add'>+    if (debug)</div><div class='add'>+        xwork-&gt;rootjob = dirjob_ref(rootjob);</div><div class='add'>+</div><div class='add'>+    xwork_addcrawl(xwork, rootjob);</div><div class='add'>+</div><div class='add'>+    xwork-&gt;count = count;</div><div class='add'>+    for (i = 0; i &lt; count; i++) {</div><div class='add'>+        ret = pthread_create(&amp;xwork-&gt;cthreads[i], NULL, xworker_crawl, xwork);</div><div class='add'>+        if (ret)</div><div class='add'>+            break;</div><div class='add'>+        tdbg("Spawned crawler %d thread %ld\n", i, xwork-&gt;cthreads[i]);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+xfind(const char *basedir)</div><div class='add'>+{</div><div class='add'>+    struct xwork xwork;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    char *cwd = NULL;</div><div class='add'>+</div><div class='add'>+    ret = chdir(basedir);</div><div class='add'>+    if (ret) {</div><div class='add'>+        err("%s: %s\n", basedir, strerror(errno));</div><div class='add'>+        return ret;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    cwd = getcwd(0, 0);</div><div class='add'>+    if (!cwd) {</div><div class='add'>+        err("getcwd(): %s\n", strerror(errno));</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    tdbg("Working directory: %s\n", cwd);</div><div class='add'>+    free(cwd);</div><div class='add'>+</div><div class='add'>+    memset(&amp;xwork, 0, sizeof(xwork));</div><div class='add'>+</div><div class='add'>+    ret = xwork_init(&amp;xwork, workers);</div><div class='add'>+    if (ret == 0)</div><div class='add'>+        xworker_crawl(&amp;xwork);</div><div class='add'>+</div><div class='add'>+    ret = xwork_fini(&amp;xwork, ret);</div><div class='add'>+    stats_dump();</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static char *</div><div class='add'>+parse_and_validate_args(int argc, char *argv[])</div><div class='add'>+{</div><div class='add'>+    char *basedir = NULL;</div><div class='add'>+    struct stat d = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int ret = -1;</div><div class='add'>+#ifndef __FreeBSD__</div><div class='add'>+    unsigned char volume_id[16];</div><div class='add'>+#endif /* __FreeBSD__ */</div><div class='add'>+    char *slv_mnt = NULL;</div><div class='add'>+</div><div class='add'>+    if (argc != 4) {</div><div class='add'>+        err("Usage: %s &lt;DIR&gt; &lt;SLAVE-VOL-MOUNT&gt; &lt;CRAWL-THREAD-COUNT&gt;\n",</div><div class='add'>+            argv[0]);</div><div class='add'>+        return NULL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    basedir = argv[1];</div><div class='add'>+    ret = sys_lstat(basedir, &amp;d);</div><div class='add'>+    if (ret) {</div><div class='add'>+        err("%s: %s\n", basedir, strerror(errno));</div><div class='add'>+        return NULL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+#ifndef __FreeBSD__</div><div class='add'>+    ret = sys_lgetxattr(basedir, "trusted.glusterfs.volume-id", volume_id, 16);</div><div class='add'>+    if (ret != 16) {</div><div class='add'>+        err("%s:Not a valid brick path.\n", basedir);</div><div class='add'>+        return NULL;</div><div class='add'>+    }</div><div class='add'>+#endif /* __FreeBSD__ */</div><div class='add'>+</div><div class='add'>+    slv_mnt = argv[2];</div><div class='add'>+    ret = sys_lstat(slv_mnt, &amp;d);</div><div class='add'>+    if (ret) {</div><div class='add'>+        err("%s: %s\n", slv_mnt, strerror(errno));</div><div class='add'>+        return NULL;</div><div class='add'>+    }</div><div class='add'>+    slavemnt = argv[2];</div><div class='add'>+</div><div class='add'>+    workers = atoi(argv[3]);</div><div class='add'>+    if (workers &lt;= 0)</div><div class='add'>+        workers = DEFAULT_WORKERS;</div><div class='add'>+</div><div class='add'>+    return basedir;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+main(int argc, char *argv[])</div><div class='add'>+{</div><div class='add'>+    char *basedir = NULL;</div><div class='add'>+</div><div class='add'>+    basedir = parse_and_validate_args(argc, argv);</div><div class='add'>+    if (!basedir)</div><div class='add'>+        return 1;</div><div class='add'>+</div><div class='add'>+    xfind(basedir);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='head'>diff --git a/tools/gfind_missing_files/gfid_to_path.py b/tools/gfind_missing_files/gfid_to_path.py<br/>new file mode 100644<br/>index 00000000000..01e08a9494a<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tools/gfind_missing_files/gfid_to_path.py?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tools/gfind_missing_files/gfid_to_path.py</a></div><div class='hunk'>@@ -0,0 +1,162 @@</div><div class='add'>+#!/usr/bin/python3</div><div class='add'>+</div><div class='add'>+# Copyright (c) 2015 Red Hat, Inc. &lt;http://www.redhat.com/&gt;</div><div class='add'>+# This file is part of GlusterFS.</div><div class='add'>+#</div><div class='add'>+# This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+# General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+# later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+# cases as published by the Free Software Foundation.</div><div class='add'>+</div><div class='add'>+import sys</div><div class='add'>+import os</div><div class='add'>+import xattr</div><div class='add'>+import uuid</div><div class='add'>+import re</div><div class='add'>+import errno</div><div class='add'>+</div><div class='add'>+CHANGELOG_SEARCH_MAX_TRY = 31</div><div class='add'>+DEC_CTIME_START = 5</div><div class='add'>+ROOT_GFID = "00000000-0000-0000-0000-000000000001"</div><div class='add'>+MAX_NUM_CHANGELOGS_TRY = 2</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def output_not_found(gfid):</div><div class='add'>+    # Write GFID to stderr</div><div class='add'>+    sys.stderr.write("%s\n" % gfid)</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def output_success(path):</div><div class='add'>+    # Write converted Path to Stdout</div><div class='add'>+    sys.stdout.write("%s\n" % path)</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def full_dir_path(gfid):</div><div class='add'>+    out_path = ""</div><div class='add'>+    while True:</div><div class='add'>+        path = os.path.join(".glusterfs", gfid[0:2], gfid[2:4], gfid)</div><div class='add'>+        path_readlink = os.readlink(path)</div><div class='add'>+        pgfid = os.path.dirname(path_readlink)</div><div class='add'>+        out_path = os.path.join(os.path.basename(path_readlink), out_path)</div><div class='add'>+        if pgfid == "../../00/00/%s" % ROOT_GFID:</div><div class='add'>+            out_path = os.path.join("./", out_path)</div><div class='add'>+            break</div><div class='add'>+        gfid = os.path.basename(pgfid)</div><div class='add'>+    return out_path</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def find_path_from_changelog(fd, gfid):</div><div class='add'>+    """</div><div class='add'>+    In given Changelog File, finds using following pattern</div><div class='add'>+    &lt;T&gt;&lt;GFID&gt;\x00&lt;TYPE&gt;\x00&lt;MODE&gt;\x00&lt;UID&gt;\x00&lt;GID&gt;\x00&lt;PARGFID&gt;/&lt;BASENAME&gt;</div><div class='add'>+    Pattern search finds PARGFID and BASENAME, Convert PARGFID to Path</div><div class='add'>+    Using readlink and add basename to form Full path.</div><div class='add'>+    """</div><div class='add'>+    content = fd.read()</div><div class='add'>+</div><div class='add'>+    pattern = "E%s" % gfid</div><div class='add'>+    pattern += "\x00(3|23)\x00\d+\x00\d+\x00\d+\x00([^\x00]+)/([^\x00]+)"</div><div class='add'>+    pat = re.compile(pattern)</div><div class='add'>+    match = pat.search(content)</div><div class='add'>+</div><div class='add'>+    if match:</div><div class='add'>+        pgfid = match.group(2)</div><div class='add'>+        basename = match.group(3)</div><div class='add'>+        if pgfid == ROOT_GFID:</div><div class='add'>+            return os.path.join("./", basename)</div><div class='add'>+        else:</div><div class='add'>+            full_path_parent = full_dir_path(pgfid)</div><div class='add'>+            if full_path_parent:</div><div class='add'>+                return os.path.join(full_path_parent, basename)</div><div class='add'>+</div><div class='add'>+    return None</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def gfid_to_path(gfid):</div><div class='add'>+    """</div><div class='add'>+    Try readlink, if it is directory it succeeds.</div><div class='add'>+    Get ctime of the GFID file, Decrement by 5 sec</div><div class='add'>+    Search for Changelog filename, Since Changelog file generated</div><div class='add'>+    every 15 sec, Search and get immediate next Changelog after the file</div><div class='add'>+    Creation. Get the Path by searching in Changelog file.</div><div class='add'>+    Get the resultant file's GFID and Compare with the input, If these</div><div class='add'>+    GFIDs are different then Some thing is changed(May be Rename)</div><div class='add'>+    """</div><div class='add'>+    gfid = gfid.strip()</div><div class='add'>+    gpath = os.path.join(".glusterfs", gfid[0:2], gfid[2:4], gfid)</div><div class='add'>+    try:</div><div class='add'>+        output_success(full_dir_path(gfid))</div><div class='add'>+        return</div><div class='add'>+    except OSError:</div><div class='add'>+        # Not an SymLink</div><div class='add'>+        pass</div><div class='add'>+</div><div class='add'>+    try:</div><div class='add'>+        ctime = int(os.stat(gpath).st_ctime)</div><div class='add'>+        ctime -= DEC_CTIME_START</div><div class='add'>+    except (OSError, IOError):</div><div class='add'>+        output_not_found(gfid)</div><div class='add'>+        return</div><div class='add'>+</div><div class='add'>+    path = None</div><div class='add'>+    found_changelog = False</div><div class='add'>+    changelog_parse_try = 0</div><div class='add'>+    for i in range(CHANGELOG_SEARCH_MAX_TRY):</div><div class='add'>+        cl = os.path.join(".glusterfs/changelogs", "CHANGELOG.%s" % ctime)</div><div class='add'>+</div><div class='add'>+        try:</div><div class='add'>+            with open(cl, "rb") as f:</div><div class='add'>+                changelog_parse_try += 1</div><div class='add'>+                found_changelog = True</div><div class='add'>+                path = find_path_from_changelog(f, gfid)</div><div class='add'>+                if not path and changelog_parse_try &lt; MAX_NUM_CHANGELOGS_TRY:</div><div class='add'>+                    ctime += 1</div><div class='add'>+                    continue</div><div class='add'>+            break</div><div class='add'>+        except (IOError, OSError) as e:</div><div class='add'>+            if e.errno == errno.ENOENT:</div><div class='add'>+                ctime += 1</div><div class='add'>+            else:</div><div class='add'>+                break</div><div class='add'>+</div><div class='add'>+    if not found_changelog:</div><div class='add'>+        output_not_found(gfid)</div><div class='add'>+        return</div><div class='add'>+</div><div class='add'>+    if not path:</div><div class='add'>+        output_not_found(gfid)</div><div class='add'>+        return</div><div class='add'>+    gfid1 = str(uuid.UUID(bytes=xattr.get(path, "trusted.gfid")))</div><div class='add'>+    if gfid != gfid1:</div><div class='add'>+        output_not_found(gfid)</div><div class='add'>+        return</div><div class='add'>+</div><div class='add'>+    output_success(path)</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def main():</div><div class='add'>+    num_arguments = 3</div><div class='add'>+    if not sys.stdin.isatty():</div><div class='add'>+        num_arguments = 2</div><div class='add'>+</div><div class='add'>+    if len(sys.argv) != num_arguments:</div><div class='add'>+        sys.stderr.write("Invalid arguments\nUsage: "</div><div class='add'>+                         "%s &lt;BRICK_PATH&gt; &lt;GFID_FILE&gt;\n" % sys.argv[0])</div><div class='add'>+        sys.exit(1)</div><div class='add'>+</div><div class='add'>+    path = sys.argv[1]</div><div class='add'>+</div><div class='add'>+    if sys.stdin.isatty():</div><div class='add'>+        gfid_list = os.path.abspath(sys.argv[2])</div><div class='add'>+        os.chdir(path)</div><div class='add'>+        with open(gfid_list) as f:</div><div class='add'>+            for gfid in f:</div><div class='add'>+                gfid_to_path(gfid)</div><div class='add'>+    else:</div><div class='add'>+        os.chdir(path)</div><div class='add'>+        for gfid in sys.stdin:</div><div class='add'>+            gfid_to_path(gfid)</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+if __name__ == "__main__":</div><div class='add'>+    main()</div><div class='head'>diff --git a/tools/gfind_missing_files/gfid_to_path.sh b/tools/gfind_missing_files/gfid_to_path.sh<br/>new file mode 100644<br/>index 00000000000..ebe817ac2f3<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tools/gfind_missing_files/gfid_to_path.sh?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tools/gfind_missing_files/gfid_to_path.sh</a></div><div class='hunk'>@@ -0,0 +1,43 @@</div><div class='add'>+#!/bin/sh</div><div class='add'>+</div><div class='add'>+## Copyright (c) 2015 Red Hat, Inc. &lt;http://www.redhat.com/&gt;</div><div class='add'>+## This file is part of GlusterFS.</div><div class='add'>+##</div><div class='add'>+## This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+## General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+## later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+## cases as published by the Free Software Foundation.</div><div class='add'>+</div><div class='add'>+E_BADARGS=65</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+gfid_to_path ()</div><div class='add'>+{</div><div class='add'>+    brick_dir=$1;</div><div class='add'>+    gfid_file=$(readlink -e $2);</div><div class='add'>+</div><div class='add'>+    current_dir=$(pwd);</div><div class='add'>+    cd $brick_dir;</div><div class='add'>+</div><div class='add'>+    while read gfid</div><div class='add'>+    do</div><div class='add'>+        to_search=`echo .glusterfs/${gfid:0:2}"/"${gfid:2:2}"/"$gfid`;</div><div class='add'>+        find . -samefile $to_search | grep -v $to_search;</div><div class='add'>+    done &lt; $gfid_file;</div><div class='add'>+</div><div class='add'>+    cd $current_dir;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+main ()</div><div class='add'>+{</div><div class='add'>+    if [ $# -ne 2 ]</div><div class='add'>+    then</div><div class='add'>+        echo "Usage: `basename $0` BRICK_DIR GFID_FILE";</div><div class='add'>+        exit $E_BADARGS;</div><div class='add'>+    fi</div><div class='add'>+</div><div class='add'>+    gfid_to_path $1 $2;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+main "$@";</div><div class='head'>diff --git a/tools/gfind_missing_files/gfind_missing_files.sh b/tools/gfind_missing_files/gfind_missing_files.sh<br/>new file mode 100644<br/>index 00000000000..e7aaa0b5dd4<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tools/gfind_missing_files/gfind_missing_files.sh?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tools/gfind_missing_files/gfind_missing_files.sh</a></div><div class='hunk'>@@ -0,0 +1,119 @@</div><div class='add'>+#!/bin/sh</div><div class='add'>+</div><div class='add'>+##  Copyright (c) 2015 Red Hat, Inc. &lt;http://www.redhat.com/&gt;</div><div class='add'>+##  This file is part of GlusterFS.</div><div class='add'>+##</div><div class='add'>+##  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+##  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+##  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+##  cases as published by the Free Software Foundation.</div><div class='add'>+</div><div class='add'>+BRICKPATH=    #Brick path of gluster volume</div><div class='add'>+SLAVEHOST=    #Slave hostname</div><div class='add'>+SLAVEVOL=     #Slave volume</div><div class='add'>+SLAVEMNT=     #Slave gluster volume mount point</div><div class='add'>+WORKERS=4     #Default number of worker threads</div><div class='add'>+</div><div class='add'>+out()</div><div class='add'>+{</div><div class='add'>+    echo "$@";</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+fatal()</div><div class='add'>+{</div><div class='add'>+    out FATAL "$@";</div><div class='add'>+    exit 1</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+ping_host ()</div><div class='add'>+{</div><div class='add'>+    ### Use bash internal socket support</div><div class='add'>+    {</div><div class='add'>+        exec 400&lt;&gt;/dev/tcp/$1/$2</div><div class='add'>+        if [ $? -ne '0' ]; then</div><div class='add'>+            return 1;</div><div class='add'>+        else</div><div class='add'>+            exec 400&gt;&amp;-</div><div class='add'>+            return 0;</div><div class='add'>+        fi</div><div class='add'>+    } 1&gt;&amp;2 2&gt;/dev/null</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+mount_slave()</div><div class='add'>+{</div><div class='add'>+    local i; # inode number</div><div class='add'>+    SSH_PORT=22</div><div class='add'>+</div><div class='add'>+    SLAVEMNT=`mktemp -d`</div><div class='add'>+    [ "x$SLAVEMNT" = "x" ] &amp;&amp; fatal "Could not mktemp directory";</div><div class='add'>+    [ -d "$SLAVEMNT" ] || fatal "$SLAVEMNT not a directory";</div><div class='add'>+</div><div class='add'>+    ping_host ${SLAVEHOST} $SSH_PORT</div><div class='add'>+    if [ $? -ne 0 ]; then</div><div class='add'>+        echo "$SLAVEHOST not reachable.";</div><div class='add'>+        exit 1;</div><div class='add'>+    fi;</div><div class='add'>+</div><div class='add'>+    glusterfs --volfile-id=$SLAVEVOL --aux-gfid-mount --volfile-server=$SLAVEHOST $SLAVEMNT;</div><div class='add'>+    i=$(stat -c '%i' $SLAVEMNT);</div><div class='add'>+    [ "x$i" = "x1" ] || fatal "Could not mount volume $2 on $SLAVEMNT Please check host and volume exists";</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+parse_cli()</div><div class='add'>+{</div><div class='add'>+    if [ "$#" -ne 4 ]; then</div><div class='add'>+        echo "Usage: gfind_missing_files &lt;brick-path&gt; &lt;slave-host&gt; &lt;slave-vol&gt; &lt;OUTFILE&gt;"</div><div class='add'>+        exit 1</div><div class='add'>+    else</div><div class='add'>+        BRICKPATH=$1;</div><div class='add'>+        SLAVEHOST=$2;</div><div class='add'>+        SLAVEVOL=$3;</div><div class='add'>+        OUTFILE=$4;</div><div class='add'>+</div><div class='add'>+        mount_slave;</div><div class='add'>+        echo "Slave volume is mounted at ${SLAVEMNT}"</div><div class='add'>+        echo</div><div class='add'>+    fi</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+main()</div><div class='add'>+{</div><div class='add'>+    parse_cli "$@";</div><div class='add'>+</div><div class='add'>+    echo "Calling crawler...";</div><div class='add'>+    path=$(readlink -e $0)</div><div class='add'>+    $(dirname $path)/gcrawler ${BRICKPATH} ${SLAVEMNT} ${WORKERS} &gt; ${OUTFILE}</div><div class='add'>+</div><div class='add'>+    #Clean up the mount</div><div class='add'>+    umount $SLAVEMNT;</div><div class='add'>+    rmdir $SLAVEMNT;</div><div class='add'>+</div><div class='add'>+    echo "Crawl Complete."</div><div class='add'>+    num_files_missing=$(wc -l ${OUTFILE} | awk '{print $1}')</div><div class='add'>+    if [ $num_files_missing -eq 0 ]</div><div class='add'>+    then</div><div class='add'>+        echo "Total Missing File Count : 0"</div><div class='add'>+        exit 0;</div><div class='add'>+    fi</div><div class='add'>+</div><div class='add'>+    echo "gfids of skipped files are available in the file ${OUTFILE}"</div><div class='add'>+    echo</div><div class='add'>+    echo "Starting gfid to path conversion"</div><div class='add'>+</div><div class='add'>+    #Call python script to convert gfids to full pathname</div><div class='add'>+    INFILE=$(readlink -e ${OUTFILE})</div><div class='add'>+    python $(dirname $path)/gfid_to_path.py ${BRICKPATH} ${INFILE} 1&gt; ${OUTFILE}_pathnames 2&gt; ${OUTFILE}_gfids</div><div class='add'>+    echo "Path names of skipped files are available in the file ${OUTFILE}_pathnames"</div><div class='add'>+</div><div class='add'>+    gfid_to_path_failures=$(wc -l ${OUTFILE}_gfids | awk '{print $1}')</div><div class='add'>+    if [ $gfid_to_path_failures -gt 0 ]</div><div class='add'>+    then</div><div class='add'>+       echo "WARNING: Unable to convert some GFIDs to Paths, GFIDs logged to ${OUTFILE}_gfids"</div><div class='add'>+       echo "Use $(dirname $path)/gfid_to_path.sh &lt;brick-path&gt; ${OUTFILE}_gfids to convert those GFIDs to Path"</div><div class='add'>+    fi</div><div class='add'>+</div><div class='add'>+    #Output</div><div class='add'>+    echo "Total Missing File Count : $(wc -l ${OUTFILE} | awk '{print $1}')"</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+main "$@";</div><div class='head'>diff --git a/tools/glusterfind/Makefile.am b/tools/glusterfind/Makefile.am<br/>new file mode 100644<br/>index 00000000000..f17dbdb228e<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tools/glusterfind/Makefile.am?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tools/glusterfind/Makefile.am</a></div><div class='hunk'>@@ -0,0 +1,24 @@</div><div class='add'>+SUBDIRS = src</div><div class='add'>+</div><div class='add'>+EXTRA_DIST = S57glusterfind-delete-post.py glusterfind</div><div class='add'>+</div><div class='add'>+if WITH_SERVER</div><div class='add'>+bin_SCRIPTS = glusterfind</div><div class='add'>+endif</div><div class='add'>+</div><div class='add'>+CLEANFILES = $(bin_SCRIPTS)</div><div class='add'>+</div><div class='add'>+if WITH_SERVER</div><div class='add'>+deletehookscriptsdir = $(GLUSTERFS_LIBEXECDIR)/glusterfind/</div><div class='add'>+deletehookscripts_SCRIPTS = S57glusterfind-delete-post.py</div><div class='add'>+</div><div class='add'>+uninstall-local:</div><div class='add'>+	rm -f $(DESTDIR)$(GLUSTERD_WORKDIR)/hooks/1/delete/post/S57glusterfind-delete-post</div><div class='add'>+</div><div class='add'>+install-data-local:</div><div class='add'>+	$(mkdir_p) $(DESTDIR)$(GLUSTERD_WORKDIR)/glusterfind/.keys</div><div class='add'>+	$(mkdir_p) $(DESTDIR)$(GLUSTERD_WORKDIR)/hooks/1/delete/post/</div><div class='add'>+	rm -f $(DESTDIR)$(GLUSTERD_WORKDIR)/hooks/1/delete/post/S57glusterfind-delete-post</div><div class='add'>+	ln -s $(GLUSTERFS_LIBEXECDIR)/glusterfind/S57glusterfind-delete-post.py \</div><div class='add'>+		$(DESTDIR)$(GLUSTERD_WORKDIR)/hooks/1/delete/post/S57glusterfind-delete-post</div><div class='add'>+endif</div><div class='head'>diff --git a/tools/glusterfind/S57glusterfind-delete-post.py b/tools/glusterfind/S57glusterfind-delete-post.py<br/>new file mode 100755<br/>index 00000000000..5beece220f0<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tools/glusterfind/S57glusterfind-delete-post.py?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tools/glusterfind/S57glusterfind-delete-post.py</a></div><div class='hunk'>@@ -0,0 +1,69 @@</div><div class='add'>+#!/usr/bin/python3</div><div class='add'>+import os</div><div class='add'>+import shutil</div><div class='add'>+from errno import ENOENT</div><div class='add'>+from subprocess import Popen, PIPE</div><div class='add'>+from argparse import ArgumentParser</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+DEFAULT_GLUSTERD_WORKDIR = "/var/lib/glusterd"</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def handle_rm_error(func, path, exc_info):</div><div class='add'>+    if exc_info[1].errno == ENOENT:</div><div class='add'>+        return</div><div class='add'>+</div><div class='add'>+    raise exc_info[1]</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def get_glusterd_workdir():</div><div class='add'>+    p = Popen(["gluster", "system::", "getwd"],</div><div class='add'>+              stdout=PIPE, stderr=PIPE, universal_newlines=True)</div><div class='add'>+</div><div class='add'>+    out, _ = p.communicate()</div><div class='add'>+</div><div class='add'>+    if p.returncode == 0:</div><div class='add'>+        return out.strip()</div><div class='add'>+    else:</div><div class='add'>+        return DEFAULT_GLUSTERD_WORKDIR</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def get_args():</div><div class='add'>+    parser = ArgumentParser(description="Volume delete post hook script")</div><div class='add'>+    parser.add_argument("--volname")</div><div class='add'>+    return parser.parse_args()</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def main():</div><div class='add'>+    args = get_args()</div><div class='add'>+    glusterfind_dir = os.path.join(get_glusterd_workdir(), "glusterfind")</div><div class='add'>+</div><div class='add'>+    # Check all session directories, if any directory found for</div><div class='add'>+    # the deleted volume, cleanup all the session directories</div><div class='add'>+    try:</div><div class='add'>+        ls_glusterfind_dir = os.listdir(glusterfind_dir)</div><div class='add'>+    except OSError:</div><div class='add'>+        ls_glusterfind_dir = []</div><div class='add'>+</div><div class='add'>+    for session in ls_glusterfind_dir:</div><div class='add'>+        # don't blow away the keys directory</div><div class='add'>+        if session == ".keys":</div><div class='add'>+            continue</div><div class='add'>+</div><div class='add'>+        # Possible session directory</div><div class='add'>+        volume_session_path = os.path.join(glusterfind_dir,</div><div class='add'>+                                           session,</div><div class='add'>+                                           args.volname)</div><div class='add'>+        if os.path.exists(volume_session_path):</div><div class='add'>+            shutil.rmtree(volume_session_path, onerror=handle_rm_error)</div><div class='add'>+</div><div class='add'>+        # Try to Remove directory, if any other dir exists for different</div><div class='add'>+        # volume, then rmdir will fail with ENOTEMPTY which is fine</div><div class='add'>+        try:</div><div class='add'>+            os.rmdir(os.path.join(glusterfind_dir, session))</div><div class='add'>+        except (OSError, IOError):</div><div class='add'>+            pass</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+if __name__ == "__main__":</div><div class='add'>+    main()</div><div class='head'>diff --git a/tools/glusterfind/glusterfind.in b/tools/glusterfind/glusterfind.in<br/>new file mode 100644<br/>index 00000000000..ca154b625dd<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tools/glusterfind/glusterfind.in?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tools/glusterfind/glusterfind.in</a></div><div class='hunk'>@@ -0,0 +1,18 @@</div><div class='add'>+#!/usr/bin/python3</div><div class='add'>+</div><div class='add'>+# Copyright (c) 2015 Red Hat, Inc. &lt;http://www.redhat.com/&gt;</div><div class='add'>+# This file is part of GlusterFS.</div><div class='add'>+#</div><div class='add'>+# This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+# General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+# later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+# cases as published by the Free Software Foundation.</div><div class='add'>+</div><div class='add'>+import sys</div><div class='add'>+sys.path.insert(1, '@GLUSTERFS_LIBEXECDIR@/')</div><div class='add'>+sys.path.insert(1, '@GLUSTERFS_LIBEXECDIR@/glusterfind')</div><div class='add'>+</div><div class='add'>+from glusterfind.main import main</div><div class='add'>+</div><div class='add'>+if __name__ == "__main__":</div><div class='add'>+    main()</div><div class='head'>diff --git a/tools/glusterfind/src/Makefile.am b/tools/glusterfind/src/Makefile.am<br/>new file mode 100644<br/>index 00000000000..43b6141b01c<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tools/glusterfind/src/Makefile.am?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tools/glusterfind/src/Makefile.am</a></div><div class='hunk'>@@ -0,0 +1,16 @@</div><div class='add'>+glusterfinddir = $(GLUSTERFS_LIBEXECDIR)/glusterfind</div><div class='add'>+</div><div class='add'>+if WITH_SERVER</div><div class='add'>+glusterfind_PYTHON = conf.py utils.py __init__.py \</div><div class='add'>+	main.py libgfchangelog.py changelogdata.py gfind_py2py3.py</div><div class='add'>+</div><div class='add'>+glusterfind_SCRIPTS = changelog.py nodeagent.py \</div><div class='add'>+	brickfind.py</div><div class='add'>+</div><div class='add'>+glusterfind_DATA = tool.conf</div><div class='add'>+endif</div><div class='add'>+</div><div class='add'>+EXTRA_DIST = changelog.py nodeagent.py brickfind.py \</div><div class='add'>+	tool.conf changelogdata.py</div><div class='add'>+</div><div class='add'>+CLEANFILES =</div><div class='head'>diff --git a/tools/glusterfind/src/__init__.py b/tools/glusterfind/src/__init__.py<br/>new file mode 100644<br/>index 00000000000..1753698b5fa<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tools/glusterfind/src/__init__.py?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tools/glusterfind/src/__init__.py</a></div><div class='hunk'>@@ -0,0 +1,9 @@</div><div class='add'>+# -*- coding: utf-8 -*-</div><div class='add'>+</div><div class='add'>+# Copyright (c) 2015 Red Hat, Inc. &lt;http://www.redhat.com/&gt;</div><div class='add'>+# This file is part of GlusterFS.</div><div class='add'>+#</div><div class='add'>+# This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+# General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+# later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+# cases as published by the Free Software Foundation.</div><div class='head'>diff --git a/tools/glusterfind/src/brickfind.py b/tools/glusterfind/src/brickfind.py<br/>new file mode 100644<br/>index 00000000000..73b6350188d<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tools/glusterfind/src/brickfind.py?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tools/glusterfind/src/brickfind.py</a></div><div class='hunk'>@@ -0,0 +1,118 @@</div><div class='add'>+#!/usr/bin/python3</div><div class='add'>+# -*- coding: utf-8 -*-</div><div class='add'>+</div><div class='add'>+# Copyright (c) 2015 Red Hat, Inc. &lt;http://www.redhat.com/&gt;</div><div class='add'>+# This file is part of GlusterFS.</div><div class='add'>+#</div><div class='add'>+# This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+# General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+# later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+# cases as published by the Free Software Foundation.</div><div class='add'>+</div><div class='add'>+import os</div><div class='add'>+import sys</div><div class='add'>+import logging</div><div class='add'>+from argparse import ArgumentParser, RawDescriptionHelpFormatter</div><div class='add'>+try:</div><div class='add'>+    import urllib.parse as urllib</div><div class='add'>+except ImportError:</div><div class='add'>+    import urllib</div><div class='add'>+import time</div><div class='add'>+</div><div class='add'>+from utils import mkdirp, setup_logger, create_file, output_write, find</div><div class='add'>+import conf</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+PROG_DESCRIPTION = """</div><div class='add'>+Changelog Crawler</div><div class='add'>+"""</div><div class='add'>+</div><div class='add'>+logger = logging.getLogger()</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def brickfind_crawl(brick, args):</div><div class='add'>+    if brick.endswith("/"):</div><div class='add'>+        brick = brick[0:len(brick)-1]</div><div class='add'>+</div><div class='add'>+    working_dir = os.path.dirname(args.outfile)</div><div class='add'>+    mkdirp(working_dir, exit_on_err=True, logger=logger)</div><div class='add'>+    create_file(args.outfile, exit_on_err=True, logger=logger)</div><div class='add'>+</div><div class='add'>+    with open(args.outfile, "a+") as fout:</div><div class='add'>+        brick_path_len = len(brick)</div><div class='add'>+</div><div class='add'>+        def output_callback(path, filter_result, is_dir):</div><div class='add'>+            path = path.strip()</div><div class='add'>+            path = path[brick_path_len+1:]</div><div class='add'>+</div><div class='add'>+            if args.type == "both":</div><div class='add'>+                output_write(fout, path, args.output_prefix,</div><div class='add'>+                             encode=(not args.no_encode), tag=args.tag,</div><div class='add'>+                             field_separator=args.field_separator)</div><div class='add'>+            else:</div><div class='add'>+                if (is_dir and args.type == "d") or (</div><div class='add'>+                    (not is_dir) and args.type == "f"):</div><div class='add'>+                    output_write(fout, path, args.output_prefix,</div><div class='add'>+                    encode=(not args.no_encode), tag=args.tag,</div><div class='add'>+                    field_separator=args.field_separator)</div><div class='add'>+</div><div class='add'>+        ignore_dirs = [os.path.join(brick, dirname)</div><div class='add'>+                       for dirname in</div><div class='add'>+                       conf.get_opt("brick_ignore_dirs").split(",")]</div><div class='add'>+</div><div class='add'>+        find(brick, callback_func=output_callback,</div><div class='add'>+             ignore_dirs=ignore_dirs)</div><div class='add'>+</div><div class='add'>+        fout.flush()</div><div class='add'>+        os.fsync(fout.fileno())</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def _get_args():</div><div class='add'>+    parser = ArgumentParser(formatter_class=RawDescriptionHelpFormatter,</div><div class='add'>+                            description=PROG_DESCRIPTION)</div><div class='add'>+</div><div class='add'>+    parser.add_argument("session", help="Session Name")</div><div class='add'>+    parser.add_argument("volume", help="Volume Name")</div><div class='add'>+    parser.add_argument("node", help="Node Name")</div><div class='add'>+    parser.add_argument("brick", help="Brick Name")</div><div class='add'>+    parser.add_argument("outfile", help="Output File")</div><div class='add'>+    parser.add_argument("tag", help="Tag to prefix file name with")</div><div class='add'>+    parser.add_argument("--only-query", help="Only query, No session update",</div><div class='add'>+                        action="store_true")</div><div class='add'>+    parser.add_argument("--debug", help="Debug", action="store_true")</div><div class='add'>+    parser.add_argument("--no-encode",</div><div class='add'>+                        help="Do not encode path in outfile",</div><div class='add'>+                        action="store_true")</div><div class='add'>+    parser.add_argument("--output-prefix", help="File prefix in output",</div><div class='add'>+                        default=".")</div><div class='add'>+    parser.add_argument('--type', help="type: f, f-files only"</div><div class='add'>+                        " d, d-directories only, by default = both",</div><div class='add'>+                        default='both')</div><div class='add'>+    parser.add_argument("--field-separator", help="Field separator",</div><div class='add'>+                        default=" ")</div><div class='add'>+</div><div class='add'>+    return parser.parse_args()</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+if __name__ == "__main__":</div><div class='add'>+    args = _get_args()</div><div class='add'>+    session_dir = os.path.join(conf.get_opt("session_dir"), args.session)</div><div class='add'>+    status_file = os.path.join(session_dir, args.volume,</div><div class='add'>+                     "%s.status" % urllib.quote_plus(args.brick))</div><div class='add'>+    status_file_pre = status_file + ".pre"</div><div class='add'>+    mkdirp(os.path.join(session_dir, args.volume), exit_on_err=True,</div><div class='add'>+           logger=logger)</div><div class='add'>+    mkdirp(os.path.join(conf.get_opt("log_dir"), args.session, args.volume),</div><div class='add'>+           exit_on_err=True)</div><div class='add'>+    log_file = os.path.join(conf.get_opt("log_dir"),</div><div class='add'>+                            args.session,</div><div class='add'>+                            args.volume,</div><div class='add'>+                            "brickfind.log")</div><div class='add'>+    setup_logger(logger, log_file, args.debug)</div><div class='add'>+</div><div class='add'>+    time_to_update = int(time.time())</div><div class='add'>+    brickfind_crawl(args.brick, args)</div><div class='add'>+    if not args.only_query:</div><div class='add'>+        with open(status_file_pre, "w") as f:</div><div class='add'>+            f.write(str(time_to_update))</div><div class='add'>+    sys.exit(0)</div><div class='head'>diff --git a/tools/glusterfind/src/changelog.py b/tools/glusterfind/src/changelog.py<br/>new file mode 100644<br/>index 00000000000..a5e9ea4288f<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tools/glusterfind/src/changelog.py?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tools/glusterfind/src/changelog.py</a></div><div class='hunk'>@@ -0,0 +1,469 @@</div><div class='add'>+#!/usr/bin/python3</div><div class='add'>+# -*- coding: utf-8 -*-</div><div class='add'>+</div><div class='add'>+# Copyright (c) 2015 Red Hat, Inc. &lt;http://www.redhat.com/&gt;</div><div class='add'>+# This file is part of GlusterFS.</div><div class='add'>+#</div><div class='add'>+# This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+# General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+# later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+# cases as published by the Free Software Foundation.</div><div class='add'>+</div><div class='add'>+import os</div><div class='add'>+import sys</div><div class='add'>+import time</div><div class='add'>+import xattr</div><div class='add'>+import logging</div><div class='add'>+from gfind_py2py3 import bytearray_to_str</div><div class='add'>+from argparse import ArgumentParser, RawDescriptionHelpFormatter</div><div class='add'>+import hashlib</div><div class='add'>+try:</div><div class='add'>+    import urllib.parse as urllib</div><div class='add'>+except ImportError:</div><div class='add'>+    import urllib</div><div class='add'>+import codecs</div><div class='add'>+</div><div class='add'>+import libgfchangelog</div><div class='add'>+from utils import mkdirp, symlink_gfid_to_path</div><div class='add'>+from utils import fail, setup_logger, find</div><div class='add'>+from utils import get_changelog_rollover_time</div><div class='add'>+from utils import output_path_prepare</div><div class='add'>+from changelogdata import ChangelogData</div><div class='add'>+import conf</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+CHANGELOG_LOG_LEVEL = 9</div><div class='add'>+CHANGELOG_CONN_RETRIES = 5</div><div class='add'>+CHANGELOGAPI_NUM_WORKERS = 3</div><div class='add'>+PROG_DESCRIPTION = """</div><div class='add'>+Changelog Crawler</div><div class='add'>+"""</div><div class='add'>+history_turns = 0</div><div class='add'>+history_turn_time = 0</div><div class='add'>+</div><div class='add'>+logger = logging.getLogger()</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def pgfid_to_path(brick, changelog_data):</div><div class='add'>+    """</div><div class='add'>+    For all the pgfids in table, converts into path using recursive</div><div class='add'>+    readlink.</div><div class='add'>+    """</div><div class='add'>+    # pgfid1 to path1 in case of CREATE/MKNOD/MKDIR/LINK/SYMLINK</div><div class='add'>+    for row in changelog_data.gfidpath_get_distinct("pgfid1", {"path1": ""}):</div><div class='add'>+        # In case of Data/Metadata only, pgfid1 will not be there</div><div class='add'>+        if row[0] == "":</div><div class='add'>+            continue</div><div class='add'>+</div><div class='add'>+        try:</div><div class='add'>+            path = symlink_gfid_to_path(brick, row[0])</div><div class='add'>+            path = output_path_prepare(path, args)</div><div class='add'>+            changelog_data.gfidpath_set_path1(path, row[0])</div><div class='add'>+        except (IOError, OSError) as e:</div><div class='add'>+            logger.warn("Error converting to path: %s" % e)</div><div class='add'>+            continue</div><div class='add'>+</div><div class='add'>+    # pgfid2 to path2 in case of RENAME</div><div class='add'>+    for row in changelog_data.gfidpath_get_distinct("pgfid2",</div><div class='add'>+                                                    {"type": "RENAME",</div><div class='add'>+                                                     "path2": ""}):</div><div class='add'>+        # Only in case of Rename pgfid2 exists</div><div class='add'>+        if row[0] == "":</div><div class='add'>+            continue</div><div class='add'>+</div><div class='add'>+        try:</div><div class='add'>+            path = symlink_gfid_to_path(brick, row[0])</div><div class='add'>+            path = output_path_prepare(path, args)</div><div class='add'>+            changelog_data.gfidpath_set_path2(path, row[0])</div><div class='add'>+        except (IOError, OSError) as e:</div><div class='add'>+            logger.warn("Error converting to path: %s" % e)</div><div class='add'>+            continue</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def populate_pgfid_and_inodegfid(brick, changelog_data):</div><div class='add'>+    """</div><div class='add'>+    For all the DATA/METADATA modifications GFID,</div><div class='add'>+    If symlink, directly convert to Path using Readlink.</div><div class='add'>+    If not symlink, try to get PGFIDs via xattr query and populate it</div><div class='add'>+    to pgfid table, collect inodes in inodegfid table</div><div class='add'>+    """</div><div class='add'>+    for row in changelog_data.gfidpath_get({"path1": "", "type": "MODIFY"}):</div><div class='add'>+        gfid = row[3].strip()</div><div class='add'>+        p = os.path.join(brick, ".glusterfs", gfid[0:2], gfid[2:4], gfid)</div><div class='add'>+        if os.path.islink(p):</div><div class='add'>+            # It is a Directory if GFID backend path is symlink</div><div class='add'>+            try:</div><div class='add'>+                path = symlink_gfid_to_path(brick, gfid)</div><div class='add'>+                path = output_path_prepare(path, args)</div><div class='add'>+                changelog_data.gfidpath_update({"path1": path},</div><div class='add'>+                                               {"gfid": gfid})</div><div class='add'>+            except (IOError, OSError) as e:</div><div class='add'>+                logger.warn("Error converting to path: %s" % e)</div><div class='add'>+                continue</div><div class='add'>+        else:</div><div class='add'>+            try:</div><div class='add'>+                # INODE and GFID to inodegfid table</div><div class='add'>+                changelog_data.inodegfid_add(os.stat(p).st_ino, gfid)</div><div class='add'>+                file_xattrs = xattr.list(p)</div><div class='add'>+                for x in file_xattrs:</div><div class='add'>+                    x_str = bytearray_to_str(x)</div><div class='add'>+                    if x_str.startswith("trusted.pgfid."):</div><div class='add'>+                        # PGFID in pgfid table</div><div class='add'>+                        changelog_data.pgfid_add(x_str.split(".")[-1])</div><div class='add'>+            except (IOError, OSError):</div><div class='add'>+                # All OS Errors ignored, since failures will be logged</div><div class='add'>+                # in End. All GFIDs present in gfidpath table</div><div class='add'>+                continue</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def enum_hard_links_using_gfid2path(brick, gfid, args):</div><div class='add'>+    hardlinks = []</div><div class='add'>+    p = os.path.join(brick, ".glusterfs", gfid[0:2], gfid[2:4], gfid)</div><div class='add'>+    if not os.path.isdir(p):</div><div class='add'>+        # we have a symlink or a normal file</div><div class='add'>+        try:</div><div class='add'>+            file_xattrs = xattr.list(p)</div><div class='add'>+            for x in file_xattrs:</div><div class='add'>+                x_str = bytearray_to_str(x)</div><div class='add'>+                if x_str.startswith("trusted.gfid2path."):</div><div class='add'>+                    # get the value for the xattr i.e. &lt;PGFID&gt;/&lt;BN&gt;</div><div class='add'>+                    v = xattr.getxattr(p, x_str)</div><div class='add'>+                    v_str = bytearray_to_str(v)</div><div class='add'>+                    pgfid, bn = v_str.split(os.sep)</div><div class='add'>+                    try:</div><div class='add'>+                        path = symlink_gfid_to_path(brick, pgfid)</div><div class='add'>+                        fullpath = os.path.join(path, bn)</div><div class='add'>+                        fullpath = output_path_prepare(fullpath, args)</div><div class='add'>+                        hardlinks.append(fullpath)</div><div class='add'>+                    except (IOError, OSError) as e:</div><div class='add'>+                        logger.warn("Error converting to path: %s" % e)</div><div class='add'>+                        continue</div><div class='add'>+        except (IOError, OSError):</div><div class='add'>+            pass</div><div class='add'>+    return hardlinks</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def gfid_to_all_paths_using_gfid2path(brick, changelog_data, args):</div><div class='add'>+    path = ""</div><div class='add'>+    for row in changelog_data.gfidpath_get({"path1": "", "type": "MODIFY"}):</div><div class='add'>+        gfid = row[3].strip()</div><div class='add'>+        logger.debug("Processing gfid %s" % gfid)</div><div class='add'>+        hardlinks = enum_hard_links_using_gfid2path(brick, gfid, args)</div><div class='add'>+</div><div class='add'>+        path = ",".join(hardlinks)</div><div class='add'>+</div><div class='add'>+        changelog_data.gfidpath_update({"path1": path}, {"gfid": gfid})</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def gfid_to_path_using_pgfid(brick, changelog_data, args):</div><div class='add'>+    """</div><div class='add'>+    For all the pgfids collected, Converts to Path and</div><div class='add'>+    does readdir on those directories and looks up inodegfid</div><div class='add'>+    table for matching inode number.</div><div class='add'>+    """</div><div class='add'>+    populate_pgfid_and_inodegfid(brick, changelog_data)</div><div class='add'>+</div><div class='add'>+    # If no GFIDs needs conversion to Path</div><div class='add'>+    if not changelog_data.inodegfid_exists({"converted": 0}):</div><div class='add'>+        return</div><div class='add'>+</div><div class='add'>+    def inode_filter(path):</div><div class='add'>+        # Looks in inodegfid table, if exists returns</div><div class='add'>+        # inode number else None</div><div class='add'>+        try:</div><div class='add'>+            st = os.lstat(path)</div><div class='add'>+        except (OSError, IOError):</div><div class='add'>+            st = None</div><div class='add'>+</div><div class='add'>+        if st and changelog_data.inodegfid_exists({"inode": st.st_ino}):</div><div class='add'>+            return st.st_ino</div><div class='add'>+</div><div class='add'>+        return None</div><div class='add'>+</div><div class='add'>+    # Length of brick path, to remove from output path</div><div class='add'>+    brick_path_len = len(brick)</div><div class='add'>+</div><div class='add'>+    def output_callback(path, inode):</div><div class='add'>+        # For each path found, encodes it and updates path1</div><div class='add'>+        # Also updates converted flag in inodegfid table as 1</div><div class='add'>+        path = path.strip()</div><div class='add'>+        path = path[brick_path_len+1:]</div><div class='add'>+</div><div class='add'>+        path = output_path_prepare(path, args)</div><div class='add'>+</div><div class='add'>+        changelog_data.append_path1(path, inode)</div><div class='add'>+        changelog_data.inodegfid_update({"converted": 1}, {"inode": inode})</div><div class='add'>+</div><div class='add'>+    ignore_dirs = [os.path.join(brick, dirname)</div><div class='add'>+                   for dirname in</div><div class='add'>+                   conf.get_opt("brick_ignore_dirs").split(",")]</div><div class='add'>+</div><div class='add'>+    for row in changelog_data.pgfid_get():</div><div class='add'>+        try:</div><div class='add'>+            path = symlink_gfid_to_path(brick, row[0])</div><div class='add'>+            find(os.path.join(brick, path),</div><div class='add'>+                 callback_func=output_callback,</div><div class='add'>+                 filter_func=inode_filter,</div><div class='add'>+                 ignore_dirs=ignore_dirs,</div><div class='add'>+                 subdirs_crawl=False)</div><div class='add'>+        except (IOError, OSError) as e:</div><div class='add'>+            logger.warn("Error converting to path: %s" % e)</div><div class='add'>+            continue</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def gfid_to_path_using_batchfind(brick, changelog_data):</div><div class='add'>+    # If all the GFIDs converted using gfid_to_path_using_pgfid</div><div class='add'>+    if not changelog_data.inodegfid_exists({"converted": 0}):</div><div class='add'>+        return</div><div class='add'>+</div><div class='add'>+    def inode_filter(path):</div><div class='add'>+        # Looks in inodegfid table, if exists returns</div><div class='add'>+        # inode number else None</div><div class='add'>+        try:</div><div class='add'>+            st = os.lstat(path)</div><div class='add'>+        except (OSError, IOError):</div><div class='add'>+            st = None</div><div class='add'>+</div><div class='add'>+        if st and changelog_data.inodegfid_exists({"inode": st.st_ino}):</div><div class='add'>+            return st.st_ino</div><div class='add'>+</div><div class='add'>+        return None</div><div class='add'>+</div><div class='add'>+    # Length of brick path, to remove from output path</div><div class='add'>+    brick_path_len = len(brick)</div><div class='add'>+</div><div class='add'>+    def output_callback(path, inode):</div><div class='add'>+        # For each path found, encodes it and updates path1</div><div class='add'>+        # Also updates converted flag in inodegfid table as 1</div><div class='add'>+        path = path.strip()</div><div class='add'>+        path = path[brick_path_len+1:]</div><div class='add'>+        path = output_path_prepare(path, args)</div><div class='add'>+</div><div class='add'>+        changelog_data.append_path1(path, inode)</div><div class='add'>+</div><div class='add'>+    ignore_dirs = [os.path.join(brick, dirname)</div><div class='add'>+                   for dirname in</div><div class='add'>+                   conf.get_opt("brick_ignore_dirs").split(",")]</div><div class='add'>+</div><div class='add'>+    # Full Namespace Crawl</div><div class='add'>+    find(brick, callback_func=output_callback,</div><div class='add'>+         filter_func=inode_filter,</div><div class='add'>+         ignore_dirs=ignore_dirs)</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def parse_changelog_to_db(changelog_data, filename, args):</div><div class='add'>+    """</div><div class='add'>+    Parses a Changelog file and populates data in gfidpath table</div><div class='add'>+    """</div><div class='add'>+    with codecs.open(filename, encoding="utf-8") as f:</div><div class='add'>+        changelogfile = os.path.basename(filename)</div><div class='add'>+        for line in f:</div><div class='add'>+            data = line.strip().split(" ")</div><div class='add'>+            if data[0] == "E" and data[2] in ["CREATE", "MKNOD", "MKDIR"]:</div><div class='add'>+                # CREATE/MKDIR/MKNOD</div><div class='add'>+                changelog_data.when_create_mknod_mkdir(changelogfile, data)</div><div class='add'>+            elif data[0] in ["D", "M"]:</div><div class='add'>+                # DATA/META</div><div class='add'>+                if not args.only_namespace_changes:</div><div class='add'>+                    changelog_data.when_data_meta(changelogfile, data)</div><div class='add'>+            elif data[0] == "E" and data[2] in ["LINK", "SYMLINK"]:</div><div class='add'>+                # LINK/SYMLINK</div><div class='add'>+                changelog_data.when_link_symlink(changelogfile, data)</div><div class='add'>+            elif data[0] == "E" and data[2] == "RENAME":</div><div class='add'>+                # RENAME</div><div class='add'>+                changelog_data.when_rename(changelogfile, data)</div><div class='add'>+            elif data[0] == "E" and data[2] in ["UNLINK", "RMDIR"]:</div><div class='add'>+                # UNLINK/RMDIR</div><div class='add'>+                changelog_data.when_unlink_rmdir(changelogfile, data)</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def get_changes(brick, hash_dir, log_file, start, end, args):</div><div class='add'>+    """</div><div class='add'>+    Makes use of libgfchangelog's history API to get changelogs</div><div class='add'>+    containing changes from start and end time. Further collects</div><div class='add'>+    the modified gfids from the changelogs and writes the list</div><div class='add'>+    of gfid to 'gfid_list' file.</div><div class='add'>+    """</div><div class='add'>+    session_dir = os.path.join(conf.get_opt("session_dir"),</div><div class='add'>+                               args.session)</div><div class='add'>+    status_file = os.path.join(session_dir, args.volume,</div><div class='add'>+                     "%s.status" % urllib.quote_plus(args.brick))</div><div class='add'>+</div><div class='add'>+    # Get previous session</div><div class='add'>+    try:</div><div class='add'>+        with open(status_file) as f:</div><div class='add'>+            start = int(f.read().strip())</div><div class='add'>+    except (ValueError, OSError, IOError):</div><div class='add'>+        start = args.start</div><div class='add'>+</div><div class='add'>+    try:</div><div class='add'>+        libgfchangelog.cl_init()</div><div class='add'>+        libgfchangelog.cl_register(brick, hash_dir, log_file,</div><div class='add'>+                                   CHANGELOG_LOG_LEVEL, CHANGELOG_CONN_RETRIES)</div><div class='add'>+    except libgfchangelog.ChangelogException as e:</div><div class='add'>+        fail("%s Changelog register failed: %s" % (brick, e), logger=logger)</div><div class='add'>+</div><div class='add'>+    # Output files to record GFIDs and GFID to Path failure GFIDs</div><div class='add'>+    changelog_data = ChangelogData(args.outfile, args)</div><div class='add'>+</div><div class='add'>+    # Changelogs path(Hard coded to BRICK/.glusterfs/changelogs</div><div class='add'>+    cl_path = os.path.join(brick, ".glusterfs/changelogs")</div><div class='add'>+</div><div class='add'>+    # Fail if History fails for requested Start and End</div><div class='add'>+    try:</div><div class='add'>+        actual_end = libgfchangelog.cl_history_changelog(</div><div class='add'>+            cl_path, start, end, CHANGELOGAPI_NUM_WORKERS)</div><div class='add'>+    except libgfchangelog.ChangelogException as e:</div><div class='add'>+        fail("%s: %s Historical Changelogs not available: %s" %</div><div class='add'>+             (args.node, brick, e), logger=logger)</div><div class='add'>+</div><div class='add'>+    logger.info("[1/4] Starting changelog parsing ...")</div><div class='add'>+    try:</div><div class='add'>+        # scan followed by getchanges till scan returns zero.</div><div class='add'>+        # history_scan() is blocking call, till it gets the number</div><div class='add'>+        # of changelogs to process. Returns zero when no changelogs</div><div class='add'>+        # to be processed. returns positive value as number of changelogs</div><div class='add'>+        # to be processed, which will be fetched using</div><div class='add'>+        # history_getchanges()</div><div class='add'>+        changes = []</div><div class='add'>+        while libgfchangelog.cl_history_scan() &gt; 0:</div><div class='add'>+            changes = libgfchangelog.cl_history_getchanges()</div><div class='add'>+</div><div class='add'>+            for change in changes:</div><div class='add'>+                # Ignore if last processed changelog comes</div><div class='add'>+                # again in list</div><div class='add'>+                if change.endswith(".%s" % start):</div><div class='add'>+                    continue</div><div class='add'>+                try:</div><div class='add'>+                    parse_changelog_to_db(changelog_data, change, args)</div><div class='add'>+                    libgfchangelog.cl_history_done(change)</div><div class='add'>+                except IOError as e:</div><div class='add'>+                    logger.warn("Error parsing changelog file %s: %s" %</div><div class='add'>+                                (change, e))</div><div class='add'>+</div><div class='add'>+            changelog_data.commit()</div><div class='add'>+    except libgfchangelog.ChangelogException as e:</div><div class='add'>+        fail("%s Error during Changelog Crawl: %s" % (brick, e),</div><div class='add'>+             logger=logger)</div><div class='add'>+</div><div class='add'>+    logger.info("[1/4] Finished changelog parsing.")</div><div class='add'>+</div><div class='add'>+    # Convert all pgfid available from Changelogs</div><div class='add'>+    logger.info("[2/4] Starting 'pgfid to path' conversions ...")</div><div class='add'>+    pgfid_to_path(brick, changelog_data)</div><div class='add'>+    changelog_data.commit()</div><div class='add'>+    logger.info("[2/4] Finished 'pgfid to path' conversions.")</div><div class='add'>+</div><div class='add'>+    # Convert all gfids recorded for data and metadata to all hardlink paths</div><div class='add'>+    logger.info("[3/4] Starting 'gfid2path' conversions ...")</div><div class='add'>+    gfid_to_all_paths_using_gfid2path(brick, changelog_data, args)</div><div class='add'>+    changelog_data.commit()</div><div class='add'>+    logger.info("[3/4] Finished 'gfid2path' conversions.")</div><div class='add'>+</div><div class='add'>+    # If some GFIDs fail to get converted from previous step,</div><div class='add'>+    # convert using find</div><div class='add'>+    logger.info("[4/4] Starting 'gfid to path using batchfind' "</div><div class='add'>+                "conversions ...")</div><div class='add'>+    gfid_to_path_using_batchfind(brick, changelog_data)</div><div class='add'>+    changelog_data.commit()</div><div class='add'>+    logger.info("[4/4] Finished 'gfid to path using batchfind' conversions.")</div><div class='add'>+</div><div class='add'>+    return actual_end</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def changelog_crawl(brick, start, end, args):</div><div class='add'>+    """</div><div class='add'>+    Init function, prepares working dir and calls Changelog query</div><div class='add'>+    """</div><div class='add'>+    if brick.endswith("/"):</div><div class='add'>+        brick = brick[0:len(brick)-1]</div><div class='add'>+</div><div class='add'>+    # WORKING_DIR/BRICKHASH/OUTFILE</div><div class='add'>+    working_dir = os.path.dirname(args.outfile)</div><div class='add'>+    brickhash = hashlib.sha1(brick.encode())</div><div class='add'>+    brickhash = str(brickhash.hexdigest())</div><div class='add'>+    working_dir = os.path.join(working_dir, brickhash)</div><div class='add'>+</div><div class='add'>+    mkdirp(working_dir, exit_on_err=True, logger=logger)</div><div class='add'>+</div><div class='add'>+    log_file = os.path.join(conf.get_opt("log_dir"),</div><div class='add'>+                            args.session,</div><div class='add'>+                            args.volume,</div><div class='add'>+                            "changelog.%s.log" % brickhash)</div><div class='add'>+</div><div class='add'>+    logger.info("%s Started Changelog Crawl. Start: %s, End: %s"</div><div class='add'>+                % (brick, start, end))</div><div class='add'>+    return get_changes(brick, working_dir, log_file, start, end, args)</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def _get_args():</div><div class='add'>+    parser = ArgumentParser(formatter_class=RawDescriptionHelpFormatter,</div><div class='add'>+                            description=PROG_DESCRIPTION)</div><div class='add'>+</div><div class='add'>+    parser.add_argument("session", help="Session Name")</div><div class='add'>+    parser.add_argument("volume", help="Volume Name")</div><div class='add'>+    parser.add_argument("node", help="Node Name")</div><div class='add'>+    parser.add_argument("brick", help="Brick Name")</div><div class='add'>+    parser.add_argument("outfile", help="Output File")</div><div class='add'>+    parser.add_argument("start", help="Start Time", type=int)</div><div class='add'>+    parser.add_argument("end", help="End Time", type=int)</div><div class='add'>+    parser.add_argument("--only-query", help="Query mode only (no session)",</div><div class='add'>+                        action="store_true")</div><div class='add'>+    parser.add_argument("--debug", help="Debug", action="store_true")</div><div class='add'>+    parser.add_argument("--no-encode",</div><div class='add'>+                        help="Do not encode path in outfile",</div><div class='add'>+                        action="store_true")</div><div class='add'>+    parser.add_argument("--output-prefix", help="File prefix in output",</div><div class='add'>+                        default=".")</div><div class='add'>+    parser.add_argument("--type",default="both")</div><div class='add'>+    parser.add_argument("-N", "--only-namespace-changes",</div><div class='add'>+                        help="List only namespace changes",</div><div class='add'>+                        action="store_true")</div><div class='add'>+</div><div class='add'>+    return parser.parse_args()</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+if __name__ == "__main__":</div><div class='add'>+    args = _get_args()</div><div class='add'>+    mkdirp(os.path.join(conf.get_opt("log_dir"), args.session, args.volume),</div><div class='add'>+           exit_on_err=True)</div><div class='add'>+    log_file = os.path.join(conf.get_opt("log_dir"),</div><div class='add'>+                            args.session,</div><div class='add'>+                            args.volume,</div><div class='add'>+                            "changelog.log")</div><div class='add'>+    setup_logger(logger, log_file, args.debug)</div><div class='add'>+</div><div class='add'>+    session_dir = os.path.join(conf.get_opt("session_dir"), args.session)</div><div class='add'>+    status_file = os.path.join(session_dir, args.volume,</div><div class='add'>+                     "%s.status" % urllib.quote_plus(args.brick))</div><div class='add'>+    status_file_pre = status_file + ".pre"</div><div class='add'>+    mkdirp(os.path.join(session_dir, args.volume), exit_on_err=True,</div><div class='add'>+           logger=logger)</div><div class='add'>+</div><div class='add'>+    end = -1</div><div class='add'>+    if args.only_query:</div><div class='add'>+        start = args.start</div><div class='add'>+        end = args.end</div><div class='add'>+    else:</div><div class='add'>+        try:</div><div class='add'>+            with open(status_file) as f:</div><div class='add'>+                start = int(f.read().strip())</div><div class='add'>+        except (ValueError, OSError, IOError):</div><div class='add'>+            start = args.start</div><div class='add'>+</div><div class='add'>+    # end time is optional; so a -1 may be sent to use the default method of</div><div class='add'>+    # identifying the end time</div><div class='add'>+    if end == -1:</div><div class='add'>+        end = int(time.time()) - get_changelog_rollover_time(args.volume)</div><div class='add'>+</div><div class='add'>+    logger.info("%s Started Changelog Crawl - Start: %s End: %s" % (args.brick,</div><div class='add'>+                                                                    start,</div><div class='add'>+                                                                    end))</div><div class='add'>+    actual_end = changelog_crawl(args.brick, start, end, args)</div><div class='add'>+    if not args.only_query:</div><div class='add'>+        with open(status_file_pre, "w") as f:</div><div class='add'>+            f.write(str(actual_end))</div><div class='add'>+</div><div class='add'>+    logger.info("%s Finished Changelog Crawl - End: %s" % (args.brick,</div><div class='add'>+                                                           actual_end))</div><div class='add'>+    sys.exit(0)</div><div class='head'>diff --git a/tools/glusterfind/src/changelogdata.py b/tools/glusterfind/src/changelogdata.py<br/>new file mode 100644<br/>index 00000000000..641593cf4b1<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tools/glusterfind/src/changelogdata.py?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tools/glusterfind/src/changelogdata.py</a></div><div class='hunk'>@@ -0,0 +1,440 @@</div><div class='add'>+# -*- coding: utf-8 -*-</div><div class='add'>+</div><div class='add'>+# Copyright (c) 2015 Red Hat, Inc. &lt;http://www.redhat.com/&gt;</div><div class='add'>+# This file is part of GlusterFS.</div><div class='add'>+#</div><div class='add'>+# This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+# General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+# later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+# cases as published by the Free Software Foundation.</div><div class='add'>+</div><div class='add'>+import sqlite3</div><div class='add'>+import os</div><div class='add'>+</div><div class='add'>+from utils import RecordType, unquote_plus_space_newline</div><div class='add'>+from utils import output_path_prepare</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+class OutputMerger(object):</div><div class='add'>+    """</div><div class='add'>+    Class to merge the output files collected from</div><div class='add'>+    different nodes</div><div class='add'>+    """</div><div class='add'>+    def __init__(self, db_path, all_dbs):</div><div class='add'>+        self.conn = sqlite3.connect(db_path)</div><div class='add'>+        self.cursor = self.conn.cursor()</div><div class='add'>+        self.cursor_reader = self.conn.cursor()</div><div class='add'>+        query = "DROP TABLE IF EXISTS finallist"</div><div class='add'>+        self.cursor.execute(query)</div><div class='add'>+</div><div class='add'>+        query = """</div><div class='add'>+        CREATE TABLE finallist(</div><div class='add'>+          id     INTEGER PRIMARY KEY AUTOINCREMENT,</div><div class='add'>+          ts     VARCHAR,</div><div class='add'>+          type   VARCHAR,</div><div class='add'>+          gfid   VARCHAR,</div><div class='add'>+          path1  VARCHAR,</div><div class='add'>+          path2  VARCHAR,</div><div class='add'>+          UNIQUE (type, path1, path2) ON CONFLICT IGNORE</div><div class='add'>+        )</div><div class='add'>+        """</div><div class='add'>+        self.cursor.execute(query)</div><div class='add'>+</div><div class='add'>+        # If node database exists, read each db and insert into</div><div class='add'>+        # final table. Ignore if combination of TYPE PATH1 PATH2</div><div class='add'>+        # already exists</div><div class='add'>+        for node_db in all_dbs:</div><div class='add'>+            if os.path.exists(node_db):</div><div class='add'>+                conn = sqlite3.connect(node_db)</div><div class='add'>+                cursor = conn.cursor()</div><div class='add'>+                query = """</div><div class='add'>+                SELECT   ts, type, gfid, path1, path2</div><div class='add'>+                FROM     gfidpath</div><div class='add'>+                WHERE    path1 != ''</div><div class='add'>+                ORDER BY id ASC</div><div class='add'>+                """</div><div class='add'>+                for row in cursor.execute(query):</div><div class='add'>+                    self.add_if_not_exists(row[0], row[1], row[2],</div><div class='add'>+                                           row[3], row[4])</div><div class='add'>+</div><div class='add'>+        self.conn.commit()</div><div class='add'>+</div><div class='add'>+    def add_if_not_exists(self, ts, ty, gfid, path1, path2=""):</div><div class='add'>+        # Adds record to finallist only if not exists</div><div class='add'>+        query = """</div><div class='add'>+        INSERT INTO finallist(ts, type, gfid, path1, path2)</div><div class='add'>+        VALUES(?, ?, ?, ?, ?)</div><div class='add'>+        """</div><div class='add'>+        self.cursor.execute(query, (ts, ty, gfid, path1, path2))</div><div class='add'>+</div><div class='add'>+    def get(self):</div><div class='add'>+        query = """SELECT type, path1, path2 FROM finallist</div><div class='add'>+        ORDER BY ts ASC, id ASC"""</div><div class='add'>+        return self.cursor_reader.execute(query)</div><div class='add'>+</div><div class='add'>+    def get_failures(self):</div><div class='add'>+        query = """</div><div class='add'>+        SELECT   gfid</div><div class='add'>+        FROM     finallist</div><div class='add'>+        WHERE path1 = '' OR (path2 = '' AND type = 'RENAME')</div><div class='add'>+        """</div><div class='add'>+        return self.cursor_reader.execute(query)</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+class ChangelogData(object):</div><div class='add'>+    def __init__(self, dbpath, args):</div><div class='add'>+        self.conn = sqlite3.connect(dbpath)</div><div class='add'>+        self.cursor = self.conn.cursor()</div><div class='add'>+        self.cursor_reader = self.conn.cursor()</div><div class='add'>+        self._create_table_gfidpath()</div><div class='add'>+        self._create_table_pgfid()</div><div class='add'>+        self._create_table_inodegfid()</div><div class='add'>+        self.args = args</div><div class='add'>+        self.path_sep = "/"</div><div class='add'>+</div><div class='add'>+    def _create_table_gfidpath(self):</div><div class='add'>+        drop_table = "DROP TABLE IF EXISTS gfidpath"</div><div class='add'>+        self.cursor.execute(drop_table)</div><div class='add'>+</div><div class='add'>+        create_table = """</div><div class='add'>+        CREATE TABLE gfidpath(</div><div class='add'>+            id     INTEGER PRIMARY KEY AUTOINCREMENT,</div><div class='add'>+            ts     VARCHAR,</div><div class='add'>+            type   VARCHAR,</div><div class='add'>+            gfid   VARCHAR(40),</div><div class='add'>+            pgfid1 VARCHAR(40) DEFAULT '',</div><div class='add'>+            bn1    VARCHAR(500) DEFAULT '',</div><div class='add'>+            pgfid2 VARCHAR(40) DEFAULT '',</div><div class='add'>+            bn2    VARCHAR(500) DEFAULT '',</div><div class='add'>+            path1  VARCHAR DEFAULT '',</div><div class='add'>+            path2  VARCHAR DEFAULT ''</div><div class='add'>+        )</div><div class='add'>+        """</div><div class='add'>+        self.cursor.execute(create_table)</div><div class='add'>+</div><div class='add'>+        create_index = """</div><div class='add'>+        CREATE INDEX gfid_index ON gfidpath(gfid);</div><div class='add'>+        """</div><div class='add'>+        self.cursor.execute(create_index)</div><div class='add'>+</div><div class='add'>+    def _create_table_inodegfid(self):</div><div class='add'>+        drop_table = "DROP TABLE IF EXISTS inodegfid"</div><div class='add'>+        self.cursor.execute(drop_table)</div><div class='add'>+</div><div class='add'>+        create_table = """</div><div class='add'>+        CREATE TABLE inodegfid(</div><div class='add'>+            inode     INTEGER PRIMARY KEY,</div><div class='add'>+            gfid      VARCHAR(40),</div><div class='add'>+            converted INTEGER DEFAULT 0,</div><div class='add'>+            UNIQUE    (inode, gfid) ON CONFLICT IGNORE</div><div class='add'>+        )</div><div class='add'>+        """</div><div class='add'>+        self.cursor.execute(create_table)</div><div class='add'>+</div><div class='add'>+    def _create_table_pgfid(self):</div><div class='add'>+        drop_table = "DROP TABLE IF EXISTS pgfid"</div><div class='add'>+        self.cursor.execute(drop_table)</div><div class='add'>+</div><div class='add'>+        create_table = """</div><div class='add'>+        CREATE TABLE pgfid(</div><div class='add'>+            pgfid  VARCHAR(40) PRIMARY KEY,</div><div class='add'>+            UNIQUE (pgfid) ON CONFLICT IGNORE</div><div class='add'>+        )</div><div class='add'>+        """</div><div class='add'>+        self.cursor.execute(create_table)</div><div class='add'>+</div><div class='add'>+    def _get(self, tablename, filters):</div><div class='add'>+        # SELECT * FROM &lt;TABLENAME&gt; WHERE &lt;CONDITION&gt;</div><div class='add'>+        params = []</div><div class='add'>+        query = "SELECT * FROM %s WHERE 1=1" % tablename</div><div class='add'>+</div><div class='add'>+        for key, value in filters.items():</div><div class='add'>+            query += " AND %s = ?" % key</div><div class='add'>+            params.append(value)</div><div class='add'>+</div><div class='add'>+        return self.cursor_reader.execute(query, params)</div><div class='add'>+</div><div class='add'>+    def _get_distinct(self, tablename, distinct_field, filters):</div><div class='add'>+        # SELECT DISTINCT &lt;COL&gt; FROM &lt;TABLENAME&gt; WHERE &lt;CONDITION&gt;</div><div class='add'>+        params = []</div><div class='add'>+        query = "SELECT DISTINCT %s FROM %s WHERE 1=1" % (distinct_field,</div><div class='add'>+                                                          tablename)</div><div class='add'>+</div><div class='add'>+        for key, value in filters.items():</div><div class='add'>+            query += " AND %s = ?" % key</div><div class='add'>+            params.append(value)</div><div class='add'>+</div><div class='add'>+        return self.cursor_reader.execute(query, params)</div><div class='add'>+</div><div class='add'>+    def _delete(self, tablename, filters):</div><div class='add'>+        # DELETE FROM &lt;TABLENAME&gt; WHERE &lt;CONDITIONS&gt;</div><div class='add'>+        query = "DELETE FROM %s WHERE 1=1" % tablename</div><div class='add'>+        params = []</div><div class='add'>+</div><div class='add'>+        for key, value in filters.items():</div><div class='add'>+            query += " AND %s = ?" % key</div><div class='add'>+            params.append(value)</div><div class='add'>+</div><div class='add'>+        self.cursor.execute(query, params)</div><div class='add'>+</div><div class='add'>+    def _add(self, tablename, data):</div><div class='add'>+        # INSERT INTO &lt;TABLENAME&gt;(&lt;col1&gt;, &lt;col2&gt;..) VALUES(?,?..)</div><div class='add'>+        query = "INSERT INTO %s(" % tablename</div><div class='add'>+        fields = []</div><div class='add'>+        params = []</div><div class='add'>+        for key, value in data.items():</div><div class='add'>+            fields.append(key)</div><div class='add'>+            params.append(value)</div><div class='add'>+</div><div class='add'>+        values_substitute = len(fields)*["?"]</div><div class='add'>+        query += "%s) VALUES(%s)" % (",".join(fields),</div><div class='add'>+                                     ",".join(values_substitute))</div><div class='add'>+        self.cursor.execute(query, params)</div><div class='add'>+</div><div class='add'>+    def _update(self, tablename, data, filters):</div><div class='add'>+        # UPDATE &lt;TABLENAME&gt; SET col1 = ?,.. WHERE col1=? AND ..</div><div class='add'>+        params = []</div><div class='add'>+        update_fields = []</div><div class='add'>+        for key, value in data.items():</div><div class='add'>+            update_fields.append("%s = ?" % key)</div><div class='add'>+            params.append(value)</div><div class='add'>+</div><div class='add'>+        query = "UPDATE %s SET %s WHERE 1 = 1" % (tablename,</div><div class='add'>+                                                  ", ".join(update_fields))</div><div class='add'>+</div><div class='add'>+        for key, value in filters.items():</div><div class='add'>+            query += " AND %s = ?" % key</div><div class='add'>+            params.append(value)</div><div class='add'>+</div><div class='add'>+        self.cursor.execute(query, params)</div><div class='add'>+</div><div class='add'>+    def _exists(self, tablename, filters):</div><div class='add'>+        if not filters:</div><div class='add'>+            return False</div><div class='add'>+</div><div class='add'>+        query = "SELECT COUNT(1) FROM %s WHERE 1=1" % tablename</div><div class='add'>+        params = []</div><div class='add'>+</div><div class='add'>+        for key, value in filters.items():</div><div class='add'>+            query += " AND %s = ?" % key</div><div class='add'>+            params.append(value)</div><div class='add'>+</div><div class='add'>+        self.cursor.execute(query, params)</div><div class='add'>+        row = self.cursor.fetchone()</div><div class='add'>+        return True if row[0] &gt; 0 else False</div><div class='add'>+</div><div class='add'>+    def gfidpath_add(self, changelogfile, ty, gfid, pgfid1="", bn1="",</div><div class='add'>+                     pgfid2="", bn2="", path1="", path2=""):</div><div class='add'>+        self._add("gfidpath", {</div><div class='add'>+            "ts": changelogfile.split(".")[-1],</div><div class='add'>+            "type": ty,</div><div class='add'>+            "gfid": gfid,</div><div class='add'>+            "pgfid1": pgfid1,</div><div class='add'>+            "bn1": bn1,</div><div class='add'>+            "pgfid2": pgfid2,</div><div class='add'>+            "bn2": bn2,</div><div class='add'>+            "path1": path1,</div><div class='add'>+            "path2": path2</div><div class='add'>+        })</div><div class='add'>+</div><div class='add'>+    def gfidpath_update(self, data, filters):</div><div class='add'>+        self._update("gfidpath", data, filters)</div><div class='add'>+</div><div class='add'>+    def gfidpath_delete(self, filters):</div><div class='add'>+        self._delete("gfidpath", filters)</div><div class='add'>+</div><div class='add'>+    def gfidpath_exists(self, filters):</div><div class='add'>+        return self._exists("gfidpath", filters)</div><div class='add'>+</div><div class='add'>+    def gfidpath_get(self, filters={}):</div><div class='add'>+        return self._get("gfidpath", filters)</div><div class='add'>+</div><div class='add'>+    def gfidpath_get_distinct(self, distinct_field, filters={}):</div><div class='add'>+        return self._get_distinct("gfidpath", distinct_field, filters)</div><div class='add'>+</div><div class='add'>+    def pgfid_add(self, pgfid):</div><div class='add'>+        self._add("pgfid", {</div><div class='add'>+            "pgfid": pgfid</div><div class='add'>+        })</div><div class='add'>+</div><div class='add'>+    def pgfid_update(self, data, filters):</div><div class='add'>+        self._update("pgfid", data, filters)</div><div class='add'>+</div><div class='add'>+    def pgfid_get(self, filters={}):</div><div class='add'>+        return self._get("pgfid", filters)</div><div class='add'>+</div><div class='add'>+    def pgfid_get_distinct(self, distinct_field, filters={}):</div><div class='add'>+        return self._get_distinct("pgfid", distinct_field, filters)</div><div class='add'>+</div><div class='add'>+    def pgfid_exists(self, filters):</div><div class='add'>+        return self._exists("pgfid", filters)</div><div class='add'>+</div><div class='add'>+    def inodegfid_add(self, inode, gfid, converted=0):</div><div class='add'>+        self._add("inodegfid", {</div><div class='add'>+            "inode": inode,</div><div class='add'>+            "gfid": gfid,</div><div class='add'>+            "converted": converted</div><div class='add'>+        })</div><div class='add'>+</div><div class='add'>+    def inodegfid_update(self, data, filters):</div><div class='add'>+        self._update("inodegfid", data, filters)</div><div class='add'>+</div><div class='add'>+    def inodegfid_get(self, filters={}):</div><div class='add'>+        return self._get("inodegfid", filters)</div><div class='add'>+</div><div class='add'>+    def inodegfid_get_distinct(self, distinct_field, filters={}):</div><div class='add'>+        return self._get_distinct("inodegfid", distinct_field, filters)</div><div class='add'>+</div><div class='add'>+    def inodegfid_exists(self, filters):</div><div class='add'>+        return self._exists("inodegfid", filters)</div><div class='add'>+</div><div class='add'>+    def append_path1(self, path, inode):</div><div class='add'>+        # || is for concatenate in SQL</div><div class='add'>+        query = """UPDATE gfidpath SET path1 = path1 || ',' || ?</div><div class='add'>+        WHERE gfid IN (SELECT gfid FROM inodegfid WHERE inode = ?)"""</div><div class='add'>+        self.cursor.execute(query, (path, inode))</div><div class='add'>+</div><div class='add'>+    def gfidpath_set_path1(self, path1, pgfid1):</div><div class='add'>+        # || is for concatenate in SQL</div><div class='add'>+        if path1 == "":</div><div class='add'>+            update_str1 = "? || bn1"</div><div class='add'>+            update_str2 = "? || bn2"</div><div class='add'>+        else:</div><div class='add'>+            update_str1 = "? || '{0}' || bn1".format(self.path_sep)</div><div class='add'>+            update_str2 = "? || '{0}' || bn2".format(self.path_sep)</div><div class='add'>+</div><div class='add'>+        query = """UPDATE gfidpath SET path1 = %s</div><div class='add'>+        WHERE pgfid1 = ?""" % update_str1</div><div class='add'>+        self.cursor.execute(query, (path1, pgfid1))</div><div class='add'>+</div><div class='add'>+        # Set Path2 if pgfid1 and pgfid2 are same</div><div class='add'>+        query = """UPDATE gfidpath SET path2 = %s</div><div class='add'>+        WHERE pgfid2 = ?""" % update_str2</div><div class='add'>+        self.cursor.execute(query, (path1, pgfid1))</div><div class='add'>+</div><div class='add'>+    def gfidpath_set_path2(self, path2, pgfid2):</div><div class='add'>+        # || is for concatenate in SQL</div><div class='add'>+        if path2 == "":</div><div class='add'>+            update_str = "? || bn2"</div><div class='add'>+        else:</div><div class='add'>+            update_str = "? || '{0}' || bn2".format(self.path_sep)</div><div class='add'>+</div><div class='add'>+        query = """UPDATE gfidpath SET path2 = %s</div><div class='add'>+        WHERE pgfid2 = ?""" % update_str</div><div class='add'>+        self.cursor.execute(query, (path2, pgfid2))</div><div class='add'>+</div><div class='add'>+    def when_create_mknod_mkdir(self, changelogfile, data):</div><div class='add'>+        # E &lt;GFID&gt; &lt;MKNOD|CREATE|MKDIR&gt; &lt;MODE&gt; &lt;USER&gt; &lt;GRP&gt; &lt;PGFID&gt;/&lt;BNAME&gt;</div><div class='add'>+        # Add the Entry to DB</div><div class='add'>+        pgfid1, bn1 = data[6].split("/", 1)</div><div class='add'>+</div><div class='add'>+        if self.args.no_encode:</div><div class='add'>+            bn1 = unquote_plus_space_newline(bn1).strip()</div><div class='add'>+</div><div class='add'>+        self.gfidpath_add(changelogfile, RecordType.NEW, data[1], pgfid1, bn1)</div><div class='add'>+</div><div class='add'>+    def when_rename(self, changelogfile, data):</div><div class='add'>+        # E &lt;GFID&gt; RENAME &lt;OLD_PGFID&gt;/&lt;BNAME&gt; &lt;PGFID&gt;/&lt;BNAME&gt;</div><div class='add'>+        pgfid1, bn1 = data[3].split("/", 1)</div><div class='add'>+        pgfid2, bn2 = data[4].split("/", 1)</div><div class='add'>+</div><div class='add'>+        if self.args.no_encode:</div><div class='add'>+            bn1 = unquote_plus_space_newline(bn1).strip()</div><div class='add'>+            bn2 = unquote_plus_space_newline(bn2).strip()</div><div class='add'>+</div><div class='add'>+        if self.gfidpath_exists({"gfid": data[1], "type": "NEW",</div><div class='add'>+                                 "pgfid1": pgfid1, "bn1": bn1}):</div><div class='add'>+            # If &lt;OLD_PGFID&gt;/&lt;BNAME&gt; is same as CREATE, Update</div><div class='add'>+            # &lt;NEW_PGFID&gt;/&lt;BNAME&gt; in NEW.</div><div class='add'>+            self.gfidpath_update({"pgfid1": pgfid2, "bn1": bn2},</div><div class='add'>+                                 {"gfid": data[1], "type": "NEW",</div><div class='add'>+                                  "pgfid1": pgfid1, "bn1": bn1})</div><div class='add'>+        elif self.gfidpath_exists({"gfid": data[1], "type": "RENAME",</div><div class='add'>+                                   "pgfid2": pgfid1, "bn2": bn1}):</div><div class='add'>+            # If we are renaming file back to original name then just</div><div class='add'>+            # delete the entry since it will effectively be a no-op</div><div class='add'>+            if self.gfidpath_exists({"gfid": data[1], "type": "RENAME",</div><div class='add'>+                                     "pgfid2": pgfid1, "bn2": bn1,</div><div class='add'>+                                     "pgfid1": pgfid2, "bn1": bn2}):</div><div class='add'>+                self.gfidpath_delete({"gfid": data[1], "type": "RENAME",</div><div class='add'>+                                      "pgfid2": pgfid1, "bn2": bn1})</div><div class='add'>+            else:</div><div class='add'>+                # If &lt;OLD_PGFID&gt;/&lt;BNAME&gt; is same as &lt;PGFID2&gt;/&lt;BN2&gt;</div><div class='add'>+                # (may be previous RENAME)</div><div class='add'>+                # then UPDATE &lt;NEW_PGFID&gt;/&lt;BNAME&gt; as &lt;PGFID2&gt;/&lt;BN2&gt;</div><div class='add'>+                self.gfidpath_update({"pgfid2": pgfid2, "bn2": bn2},</div><div class='add'>+                                     {"gfid": data[1], "type": "RENAME",</div><div class='add'>+                                      "pgfid2": pgfid1, "bn2": bn1})</div><div class='add'>+        else:</div><div class='add'>+            # Else insert as RENAME</div><div class='add'>+            self.gfidpath_add(changelogfile, RecordType.RENAME, data[1],</div><div class='add'>+                              pgfid1, bn1, pgfid2, bn2)</div><div class='add'>+</div><div class='add'>+        if self.gfidpath_exists({"gfid": data[1], "type": "MODIFY"}):</div><div class='add'>+            # If MODIFY exists already for that GFID, remove it and insert</div><div class='add'>+            # again so that MODIFY entry comes after RENAME entry</div><div class='add'>+            # Output will have MODIFY &lt;NEWNAME&gt;</div><div class='add'>+            self.gfidpath_delete({"gfid": data[1], "type": "MODIFY"})</div><div class='add'>+            self.gfidpath_add(changelogfile, RecordType.MODIFY, data[1])</div><div class='add'>+</div><div class='add'>+    def when_link_symlink(self, changelogfile, data):</div><div class='add'>+        # E &lt;GFID&gt; &lt;LINK|SYMLINK&gt; &lt;PGFID&gt;/&lt;BASENAME&gt;</div><div class='add'>+        # Add as New record in Db as Type NEW</div><div class='add'>+        pgfid1, bn1 = data[3].split("/", 1)</div><div class='add'>+        if self.args.no_encode:</div><div class='add'>+            bn1 = unquote_plus_space_newline(bn1).strip()</div><div class='add'>+</div><div class='add'>+        self.gfidpath_add(changelogfile, RecordType.NEW, data[1], pgfid1, bn1)</div><div class='add'>+</div><div class='add'>+    def when_data_meta(self, changelogfile, data):</div><div class='add'>+        # If GFID row exists, Ignore else Add to Db</div><div class='add'>+        if not self.gfidpath_exists({"gfid": data[1], "type": "NEW"}) and \</div><div class='add'>+           not self.gfidpath_exists({"gfid": data[1], "type": "MODIFY"}):</div><div class='add'>+            self.gfidpath_add(changelogfile, RecordType.MODIFY, data[1])</div><div class='add'>+</div><div class='add'>+    def when_unlink_rmdir(self, changelogfile, data):</div><div class='add'>+        # E &lt;GFID&gt; &lt;UNLINK|RMDIR&gt; &lt;PGFID&gt;/&lt;BASENAME&gt;</div><div class='add'>+        pgfid1, bn1 = data[3].split("/", 1)</div><div class='add'>+</div><div class='add'>+        if self.args.no_encode:</div><div class='add'>+            bn1 = unquote_plus_space_newline(bn1).strip()</div><div class='add'>+</div><div class='add'>+        deleted_path = data[4] if len(data) == 5 else ""</div><div class='add'>+        if deleted_path != "":</div><div class='add'>+            deleted_path = unquote_plus_space_newline(deleted_path)</div><div class='add'>+            deleted_path = output_path_prepare(deleted_path, self.args)</div><div class='add'>+</div><div class='add'>+        if self.gfidpath_exists({"gfid": data[1], "type": "NEW",</div><div class='add'>+                                 "pgfid1": pgfid1, "bn1": bn1}):</div><div class='add'>+            # If path exists in table as NEW with same GFID</div><div class='add'>+            # Delete that row</div><div class='add'>+            self.gfidpath_delete({"gfid": data[1], "type": "NEW",</div><div class='add'>+                                  "pgfid1": pgfid1, "bn1": bn1})</div><div class='add'>+        else:</div><div class='add'>+            # Else Record as DELETE</div><div class='add'>+            self.gfidpath_add(changelogfile, RecordType.DELETE, data[1],</div><div class='add'>+                              pgfid1, bn1, path1=deleted_path)</div><div class='add'>+</div><div class='add'>+        # Update path1 as deleted_path if pgfid1 and bn1 is same as deleted</div><div class='add'>+        self.gfidpath_update({"path1": deleted_path}, {"gfid": data[1],</div><div class='add'>+                                                       "pgfid1": pgfid1,</div><div class='add'>+                                                       "bn1": bn1})</div><div class='add'>+</div><div class='add'>+        # Update path2 as deleted_path if pgfid2 and bn2 is same as deleted</div><div class='add'>+        self.gfidpath_update({"path2": deleted_path}, {</div><div class='add'>+            "type": RecordType.RENAME,</div><div class='add'>+            "gfid": data[1],</div><div class='add'>+            "pgfid2": pgfid1,</div><div class='add'>+            "bn2": bn1})</div><div class='add'>+</div><div class='add'>+        # If deleted directory is parent for somebody</div><div class='add'>+        query1 = """UPDATE gfidpath SET path1 = ? || '{0}' || bn1</div><div class='add'>+        WHERE pgfid1 = ? AND path1 != ''""".format(self.path_sep)</div><div class='add'>+        self.cursor.execute(query1, (deleted_path, data[1]))</div><div class='add'>+</div><div class='add'>+        query1 = """UPDATE gfidpath SET path2 = ? || '{0}' || bn1</div><div class='add'>+        WHERE pgfid2 = ? AND path2 != ''""".format(self.path_sep)</div><div class='add'>+        self.cursor.execute(query1, (deleted_path, data[1]))</div><div class='add'>+</div><div class='add'>+    def commit(self):</div><div class='add'>+        self.conn.commit()</div><div class='head'>diff --git a/tools/glusterfind/src/conf.py b/tools/glusterfind/src/conf.py<br/>new file mode 100644<br/>index 00000000000..3849ba5dd1f<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tools/glusterfind/src/conf.py?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tools/glusterfind/src/conf.py</a></div><div class='hunk'>@@ -0,0 +1,31 @@</div><div class='add'>+# -*- coding: utf-8 -*-</div><div class='add'>+</div><div class='add'>+# Copyright (c) 2015 Red Hat, Inc. &lt;http://www.redhat.com/&gt;</div><div class='add'>+# This file is part of GlusterFS.</div><div class='add'>+#</div><div class='add'>+# This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+# General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+# later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+# cases as published by the Free Software Foundation.</div><div class='add'>+</div><div class='add'>+import os</div><div class='add'>+try:</div><div class='add'>+    from ConfigParser import ConfigParser</div><div class='add'>+except ImportError:</div><div class='add'>+    from configparser import ConfigParser</div><div class='add'>+</div><div class='add'>+config = ConfigParser()</div><div class='add'>+config.read(os.path.join(os.path.dirname(os.path.abspath(__file__)),</div><div class='add'>+                         "tool.conf"))</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def list_change_detectors():</div><div class='add'>+    return dict(config.items("change_detectors")).keys()</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def get_opt(opt):</div><div class='add'>+    return config.get("vars", opt)</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def get_change_detector(opt):</div><div class='add'>+    return config.get("change_detectors", opt)</div><div class='head'>diff --git a/tools/glusterfind/src/gfind_py2py3.py b/tools/glusterfind/src/gfind_py2py3.py<br/>new file mode 100644<br/>index 00000000000..87324fbf350<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tools/glusterfind/src/gfind_py2py3.py?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tools/glusterfind/src/gfind_py2py3.py</a></div><div class='hunk'>@@ -0,0 +1,88 @@</div><div class='add'>+#</div><div class='add'>+# Copyright (c) 2018 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+# This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+# This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+# General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+# later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+# cases as published by the Free Software Foundation.</div><div class='add'>+#</div><div class='add'>+</div><div class='add'>+# All python2/python3 compatibility routines</div><div class='add'>+</div><div class='add'>+import os</div><div class='add'>+import sys</div><div class='add'>+from ctypes import create_string_buffer</div><div class='add'>+</div><div class='add'>+if sys.version_info &gt;= (3,):</div><div class='add'>+</div><div class='add'>+    # Raw conversion of bytearray to string. Used in the cases where</div><div class='add'>+    # buffer is created by create_string_buffer which is a 8-bit char</div><div class='add'>+    # array and passed to syscalls to fetch results. Using encode/decode</div><div class='add'>+    # doesn't work as it converts to string altering the size.</div><div class='add'>+    # def bytearray_to_str(byte_arr):</div><div class='add'>+    def bytearray_to_str(byte_arr):</div><div class='add'>+        return ''.join([chr(b) for b in byte_arr])</div><div class='add'>+</div><div class='add'>+    def gf_create_string_buffer(size):</div><div class='add'>+        return create_string_buffer(b'\0', size)</div><div class='add'>+</div><div class='add'>+    def gfind_history_changelog(libgfc, changelog_path, start, end, num_parallel,</div><div class='add'>+                                actual_end):</div><div class='add'>+        return libgfc.gf_history_changelog(changelog_path.encode(), start, end, num_parallel,</div><div class='add'>+                       actual_end)</div><div class='add'>+</div><div class='add'>+    def gfind_changelog_register(libgfc, brick, path, log_file, log_level,</div><div class='add'>+                                 retries):</div><div class='add'>+        return libgfc.gf_changelog_register(brick.encode(), path.encode(), log_file.encode(),</div><div class='add'>+                       log_level, retries)</div><div class='add'>+</div><div class='add'>+    def gfind_history_changelog_done(libgfc, clfile):</div><div class='add'>+        return libgfc.gf_history_changelog_done(clfile.encode())</div><div class='add'>+</div><div class='add'>+    def gfind_write_row(f, row, field_separator, p_rep, row_2_rep):</div><div class='add'>+        f.write(u"{0}{1}{2}{3}{4}\n".format(row,</div><div class='add'>+                                            field_separator,</div><div class='add'>+                                            p_rep,</div><div class='add'>+                                            field_separator,</div><div class='add'>+                                            row_2_rep))</div><div class='add'>+</div><div class='add'>+    def gfind_write(f, row, field_separator, p_rep):</div><div class='add'>+        f.write(u"{0}{1}{2}\n".format(row,</div><div class='add'>+                                      field_separator,</div><div class='add'>+                                      p_rep))</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+else:</div><div class='add'>+</div><div class='add'>+    # Raw conversion of bytearray to string</div><div class='add'>+    def bytearray_to_str(byte_arr):</div><div class='add'>+        return byte_arr</div><div class='add'>+</div><div class='add'>+    def gf_create_string_buffer(size):</div><div class='add'>+        return create_string_buffer('\0', size)</div><div class='add'>+</div><div class='add'>+    def gfind_history_changelog(libgfc, changelog_path, start, end, num_parallel,</div><div class='add'>+                                actual_end):</div><div class='add'>+        return libgfc.gf_history_changelog(changelog_path, start, end,</div><div class='add'>+                                                    num_parallel, actual_end)</div><div class='add'>+</div><div class='add'>+    def gfind_changelog_register(libgfc, brick, path, log_file, log_level,</div><div class='add'>+                                 retries):</div><div class='add'>+        return libgfc.gf_changelog_register(brick, path, log_file,</div><div class='add'>+                                                     log_level, retries)</div><div class='add'>+</div><div class='add'>+    def gfind_history_changelog_done(libgfc, clfile):</div><div class='add'>+        return libgfc.gf_history_changelog_done(clfile)</div><div class='add'>+</div><div class='add'>+    def gfind_write_row(f, row, field_separator, p_rep, row_2_rep):</div><div class='add'>+        f.write(u"{0}{1}{2}{3}{4}\n".format(row,</div><div class='add'>+                                            field_separator,</div><div class='add'>+                                            p_rep,</div><div class='add'>+                                            field_separator,</div><div class='add'>+                                            row_2_rep).encode())</div><div class='add'>+</div><div class='add'>+    def gfind_write(f, row, field_separator, p_rep):</div><div class='add'>+        f.write(u"{0}{1}{2}\n".format(row,</div><div class='add'>+                                      field_separator,</div><div class='add'>+                                      p_rep).encode())</div><div class='head'>diff --git a/tools/glusterfind/src/libgfchangelog.py b/tools/glusterfind/src/libgfchangelog.py<br/>new file mode 100644<br/>index 00000000000..513bb101e93<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tools/glusterfind/src/libgfchangelog.py?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tools/glusterfind/src/libgfchangelog.py</a></div><div class='hunk'>@@ -0,0 +1,92 @@</div><div class='add'>+# -*- coding: utf-8 -*-</div><div class='add'>+</div><div class='add'>+# Copyright (c) 2015 Red Hat, Inc. &lt;http://www.redhat.com/&gt;</div><div class='add'>+# This file is part of GlusterFS.</div><div class='add'>+#</div><div class='add'>+# This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+# General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+# later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+# cases as published by the Free Software Foundation.</div><div class='add'>+</div><div class='add'>+import os</div><div class='add'>+from ctypes import CDLL, RTLD_GLOBAL, get_errno, create_string_buffer, c_ulong, byref</div><div class='add'>+from ctypes.util import find_library</div><div class='add'>+from gfind_py2py3 import bytearray_to_str, gf_create_string_buffer</div><div class='add'>+from gfind_py2py3 import gfind_history_changelog, gfind_changelog_register</div><div class='add'>+from gfind_py2py3 import gfind_history_changelog_done</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+class ChangelogException(OSError):</div><div class='add'>+    pass</div><div class='add'>+</div><div class='add'>+libgfc = CDLL(find_library("gfchangelog"), mode=RTLD_GLOBAL, use_errno=True)</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def raise_oserr(prefix=None):</div><div class='add'>+    errn = get_errno()</div><div class='add'>+    prefix_or_empty = prefix + ": " if prefix else ""</div><div class='add'>+    raise ChangelogException(errn, prefix_or_empty + os.strerror(errn))</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def cl_init():</div><div class='add'>+    ret = libgfc.gf_changelog_init(None)</div><div class='add'>+    if ret == -1:</div><div class='add'>+        raise_oserr(prefix="gf_changelog_init")</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def cl_register(brick, path, log_file, log_level, retries=0):</div><div class='add'>+    ret = gfind_changelog_register(libgfc, brick, path, log_file,log_level, retries)</div><div class='add'>+    if ret == -1:</div><div class='add'>+        raise_oserr(prefix="gf_changelog_register")</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def cl_history_scan():</div><div class='add'>+    ret = libgfc.gf_history_changelog_scan()</div><div class='add'>+    if ret == -1:</div><div class='add'>+        raise_oserr(prefix="gf_history_changelog_scan")</div><div class='add'>+</div><div class='add'>+    return ret</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def cl_history_changelog(changelog_path, start, end, num_parallel):</div><div class='add'>+    actual_end = c_ulong()</div><div class='add'>+    ret = gfind_history_changelog(libgfc,changelog_path, start, end,</div><div class='add'>+                                      num_parallel,</div><div class='add'>+                                      byref(actual_end))</div><div class='add'>+    if ret == -1:</div><div class='add'>+        raise_oserr(prefix="gf_history_changelog")</div><div class='add'>+</div><div class='add'>+    return actual_end.value</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def cl_history_startfresh():</div><div class='add'>+    ret = libgfc.gf_history_changelog_start_fresh()</div><div class='add'>+    if ret == -1:</div><div class='add'>+        raise_oserr(prefix="gf_history_changelog_start_fresh")</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def cl_history_getchanges():</div><div class='add'>+    """ remove hardcoding for path name length """</div><div class='add'>+    def clsort(f):</div><div class='add'>+        return f.split('.')[-1]</div><div class='add'>+</div><div class='add'>+    changes = []</div><div class='add'>+    buf = gf_create_string_buffer(4096)</div><div class='add'>+</div><div class='add'>+    while True:</div><div class='add'>+        ret = libgfc.gf_history_changelog_next_change(buf, 4096)</div><div class='add'>+        if ret in (0, -1):</div><div class='add'>+            break</div><div class='add'>+        # py2 and py3 compatibility</div><div class='add'>+        result = bytearray_to_str(buf.raw[:ret - 1])</div><div class='add'>+        changes.append(result)</div><div class='add'>+    if ret == -1:</div><div class='add'>+        raise_oserr(prefix="gf_history_changelog_next_change")</div><div class='add'>+</div><div class='add'>+    return sorted(changes, key=clsort)</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def cl_history_done(clfile):</div><div class='add'>+    ret = gfind_history_changelog_done(libgfc, clfile)</div><div class='add'>+    if ret == -1:</div><div class='add'>+        raise_oserr(prefix="gf_history_changelog_done")</div><div class='head'>diff --git a/tools/glusterfind/src/main.py b/tools/glusterfind/src/main.py<br/>new file mode 100644<br/>index 00000000000..4b5466d0114<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tools/glusterfind/src/main.py?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tools/glusterfind/src/main.py</a></div><div class='hunk'>@@ -0,0 +1,921 @@</div><div class='add'>+#!/usr/bin/python3</div><div class='add'>+# -*- coding: utf-8 -*-</div><div class='add'>+</div><div class='add'>+# Copyright (c) 2015 Red Hat, Inc. &lt;http://www.redhat.com/&gt;</div><div class='add'>+# This file is part of GlusterFS.</div><div class='add'>+#</div><div class='add'>+# This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+# General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+# later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+# cases as published by the Free Software Foundation.</div><div class='add'>+</div><div class='add'>+import sys</div><div class='add'>+from errno import ENOENT, ENOTEMPTY</div><div class='add'>+import time</div><div class='add'>+from multiprocessing import Process</div><div class='add'>+import os</div><div class='add'>+import xml.etree.cElementTree as etree</div><div class='add'>+from argparse import ArgumentParser, RawDescriptionHelpFormatter, Action</div><div class='add'>+from gfind_py2py3 import gfind_write_row, gfind_write</div><div class='add'>+import logging</div><div class='add'>+import shutil</div><div class='add'>+import tempfile</div><div class='add'>+import signal</div><div class='add'>+from datetime import datetime</div><div class='add'>+import codecs</div><div class='add'>+import re</div><div class='add'>+</div><div class='add'>+from utils import execute, is_host_local, mkdirp, fail</div><div class='add'>+from utils import setup_logger, human_time, handle_rm_error</div><div class='add'>+from utils import get_changelog_rollover_time, cache_output, create_file</div><div class='add'>+import conf</div><div class='add'>+from changelogdata import OutputMerger</div><div class='add'>+</div><div class='add'>+PROG_DESCRIPTION = """</div><div class='add'>+GlusterFS Incremental API</div><div class='add'>+"""</div><div class='add'>+ParseError = etree.ParseError if hasattr(etree, 'ParseError') else SyntaxError</div><div class='add'>+</div><div class='add'>+logger = logging.getLogger()</div><div class='add'>+vol_statusStr = ""</div><div class='add'>+gtmpfilename = None</div><div class='add'>+g_pid_nodefile_map = {}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+class StoreAbsPath(Action):</div><div class='add'>+    def __init__(self, option_strings, dest, nargs=None, **kwargs):</div><div class='add'>+        super(StoreAbsPath, self).__init__(option_strings, dest, **kwargs)</div><div class='add'>+</div><div class='add'>+    def __call__(self, parser, namespace, values, option_string=None):</div><div class='add'>+        setattr(namespace, self.dest, os.path.abspath(values))</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def get_pem_key_path(session, volume):</div><div class='add'>+    return os.path.join(conf.get_opt("session_dir"),</div><div class='add'>+                        session,</div><div class='add'>+                        volume,</div><div class='add'>+                        "%s_%s_secret.pem" % (session, volume))</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def node_cmd(host, host_uuid, task, cmd, args, opts):</div><div class='add'>+    """</div><div class='add'>+    Runs command via ssh if host is not local</div><div class='add'>+    """</div><div class='add'>+    try:</div><div class='add'>+        localdir = is_host_local(host_uuid)</div><div class='add'>+</div><div class='add'>+        # this is so to avoid deleting the ssh keys on local node which</div><div class='add'>+        # otherwise cause ssh password prompts on the console (race conditions)</div><div class='add'>+        # mode_delete() should be cleaning up the session tree</div><div class='add'>+        if localdir and task == "delete":</div><div class='add'>+            return</div><div class='add'>+</div><div class='add'>+        pem_key_path = get_pem_key_path(args.session, args.volume)</div><div class='add'>+</div><div class='add'>+        if not localdir:</div><div class='add'>+            # prefix with ssh command if not local node</div><div class='add'>+            cmd = ["ssh",</div><div class='add'>+                   "-oNumberOfPasswordPrompts=0",</div><div class='add'>+                   "-oStrictHostKeyChecking=no",</div><div class='add'>+                   # We force TTY allocation (-t -t) so that Ctrl+C is handed</div><div class='add'>+                   # through; see:</div><div class='add'>+                   #   https://bugzilla.redhat.com/show_bug.cgi?id=1382236</div><div class='add'>+                   # Note that this turns stderr of the remote `cmd`</div><div class='add'>+                   # into stdout locally.</div><div class='add'>+                   "-t",</div><div class='add'>+                   "-t",</div><div class='add'>+                   "-i", pem_key_path,</div><div class='add'>+                   "root@%s" % host] + cmd</div><div class='add'>+</div><div class='add'>+        (returncode, err, out) = execute(cmd, logger=logger)</div><div class='add'>+        if returncode != 0:</div><div class='add'>+            # Because the `-t -t` above turns the remote stderr into</div><div class='add'>+            # local stdout, we need to log both stderr and stdout</div><div class='add'>+            # here to print all error messages.</div><div class='add'>+            fail("%s - %s failed; stdout (including remote stderr):\n"</div><div class='add'>+                 "%s\n"</div><div class='add'>+                 "stderr:\n"</div><div class='add'>+                 "%s" % (host, task, out, err),</div><div class='add'>+                 returncode,</div><div class='add'>+                 logger=logger)</div><div class='add'>+</div><div class='add'>+        if opts.get("copy_outfile", False) and not localdir:</div><div class='add'>+            cmd_copy = ["scp",</div><div class='add'>+                        "-oNumberOfPasswordPrompts=0",</div><div class='add'>+                        "-oStrictHostKeyChecking=no",</div><div class='add'>+                        "-i", pem_key_path,</div><div class='add'>+                        "root@%s:/%s" % (host, opts.get("node_outfile")),</div><div class='add'>+                        os.path.dirname(opts.get("node_outfile"))]</div><div class='add'>+            execute(cmd_copy, exit_msg="%s - Copy command failed" % host,</div><div class='add'>+                    logger=logger)</div><div class='add'>+    except KeyboardInterrupt:</div><div class='add'>+        sys.exit(2)</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def run_cmd_nodes(task, args, **kwargs):</div><div class='add'>+    global g_pid_nodefile_map</div><div class='add'>+    nodes = get_nodes(args.volume)</div><div class='add'>+    pool = []</div><div class='add'>+    for num, node in enumerate(nodes):</div><div class='add'>+        host, brick = node[1].split(":")</div><div class='add'>+        host_uuid = node[0]</div><div class='add'>+        cmd = []</div><div class='add'>+        opts = {}</div><div class='add'>+</div><div class='add'>+        # tmpfilename is valid only for tasks: pre, query and cleanup</div><div class='add'>+        tmpfilename = kwargs.get("tmpfilename", "BADNAME")</div><div class='add'>+</div><div class='add'>+        node_outfile = os.path.join(conf.get_opt("working_dir"),</div><div class='add'>+                                    args.session, args.volume,</div><div class='add'>+                                    tmpfilename,</div><div class='add'>+                                    "tmp_output_%s" % num)</div><div class='add'>+</div><div class='add'>+        if task == "pre":</div><div class='add'>+            if vol_statusStr != "Started":</div><div class='add'>+                fail("Volume %s is not online" % args.volume,</div><div class='add'>+                     logger=logger)</div><div class='add'>+</div><div class='add'>+            # If Full backup is requested or start time is zero, use brickfind</div><div class='add'>+            change_detector = conf.get_change_detector("changelog")</div><div class='add'>+            tag = None</div><div class='add'>+            if args.full:</div><div class='add'>+                change_detector = conf.get_change_detector("brickfind")</div><div class='add'>+                tag = args.tag_for_full_find.strip()</div><div class='add'>+                if tag == "":</div><div class='add'>+                    tag = '""' if not is_host_local(host_uuid) else ""</div><div class='add'>+</div><div class='add'>+            # remote file will be copied into this directory</div><div class='add'>+            mkdirp(os.path.dirname(node_outfile),</div><div class='add'>+                   exit_on_err=True, logger=logger)</div><div class='add'>+</div><div class='add'>+            FS = args.field_separator</div><div class='add'>+            if not is_host_local(host_uuid):</div><div class='add'>+                FS = "'" + FS + "'"</div><div class='add'>+</div><div class='add'>+            cmd = [change_detector,</div><div class='add'>+                   args.session,</div><div class='add'>+                   args.volume,</div><div class='add'>+                   host,</div><div class='add'>+                   brick,</div><div class='add'>+                   node_outfile] + \</div><div class='add'>+                ([str(kwargs.get("start")), str(kwargs.get("end"))]</div><div class='add'>+                    if not args.full else []) + \</div><div class='add'>+                ([tag] if tag is not None else []) + \</div><div class='add'>+                ["--output-prefix", args.output_prefix] + \</div><div class='add'>+                (["--debug"] if args.debug else []) + \</div><div class='add'>+                (["--no-encode"] if args.no_encode else []) + \</div><div class='add'>+                (["--only-namespace-changes"] if args.only_namespace_changes</div><div class='add'>+                 else []) + \</div><div class='add'>+                (["--type", args.type]) + \</div><div class='add'>+                (["--field-separator", FS] if args.full else [])</div><div class='add'>+</div><div class='add'>+            opts["node_outfile"] = node_outfile</div><div class='add'>+            opts["copy_outfile"] = True</div><div class='add'>+        elif task == "query":</div><div class='add'>+            # If Full backup is requested or start time is zero, use brickfind</div><div class='add'>+            tag = None</div><div class='add'>+            change_detector = conf.get_change_detector("changelog")</div><div class='add'>+            if args.full:</div><div class='add'>+                change_detector = conf.get_change_detector("brickfind")</div><div class='add'>+                tag = args.tag_for_full_find.strip()</div><div class='add'>+                if tag == "":</div><div class='add'>+                    tag = '""' if not is_host_local(host_uuid) else ""</div><div class='add'>+</div><div class='add'>+            # remote file will be copied into this directory</div><div class='add'>+            mkdirp(os.path.dirname(node_outfile),</div><div class='add'>+                   exit_on_err=True, logger=logger)</div><div class='add'>+</div><div class='add'>+            FS = args.field_separator</div><div class='add'>+            if not is_host_local(host_uuid):</div><div class='add'>+                FS = "'" + FS + "'"</div><div class='add'>+</div><div class='add'>+            cmd = [change_detector,</div><div class='add'>+                   args.session,</div><div class='add'>+                   args.volume,</div><div class='add'>+                   host,</div><div class='add'>+                   brick,</div><div class='add'>+                   node_outfile] + \</div><div class='add'>+                ([str(kwargs.get("start")), str(kwargs.get("end"))]</div><div class='add'>+                    if not args.full else []) + \</div><div class='add'>+                ([tag] if tag is not None else []) + \</div><div class='add'>+                ["--only-query"] + \</div><div class='add'>+                ["--output-prefix", args.output_prefix] + \</div><div class='add'>+                (["--debug"] if args.debug else []) + \</div><div class='add'>+                (["--no-encode"] if args.no_encode else []) + \</div><div class='add'>+                (["--only-namespace-changes"]</div><div class='add'>+                    if args.only_namespace_changes else []) + \</div><div class='add'>+                (["--type", args.type]) + \</div><div class='add'>+                (["--field-separator", FS] if args.full else [])</div><div class='add'>+</div><div class='add'>+            opts["node_outfile"] = node_outfile</div><div class='add'>+            opts["copy_outfile"] = True</div><div class='add'>+        elif task == "cleanup":</div><div class='add'>+            # After pre/query run, cleanup the working directory and other</div><div class='add'>+            # temp files. Remove the directory to which node_outfile has</div><div class='add'>+            # been copied in main node</div><div class='add'>+            try:</div><div class='add'>+                os.remove(node_outfile)</div><div class='add'>+            except (OSError, IOError):</div><div class='add'>+                logger.warn("Failed to cleanup temporary file %s" %</div><div class='add'>+                            node_outfile)</div><div class='add'>+                pass</div><div class='add'>+</div><div class='add'>+            cmd = [conf.get_opt("nodeagent"),</div><div class='add'>+                   "cleanup",</div><div class='add'>+                   args.session,</div><div class='add'>+                   args.volume,</div><div class='add'>+                   os.path.dirname(node_outfile)] + \</div><div class='add'>+                (["--debug"] if args.debug else [])</div><div class='add'>+        elif task == "create":</div><div class='add'>+            if vol_statusStr != "Started":</div><div class='add'>+                fail("Volume %s is not online" % args.volume,</div><div class='add'>+                     logger=logger)</div><div class='add'>+</div><div class='add'>+            # When glusterfind create, create session directory in</div><div class='add'>+            # each brick nodes</div><div class='add'>+            cmd = [conf.get_opt("nodeagent"),</div><div class='add'>+                   "create",</div><div class='add'>+                   args.session,</div><div class='add'>+                   args.volume,</div><div class='add'>+                   brick,</div><div class='add'>+                   kwargs.get("time_to_update")] + \</div><div class='add'>+                (["--debug"] if args.debug else []) + \</div><div class='add'>+                (["--reset-session-time"] if args.reset_session_time</div><div class='add'>+                 else [])</div><div class='add'>+        elif task == "post":</div><div class='add'>+            # Rename pre status file to actual status file in each node</div><div class='add'>+            cmd = [conf.get_opt("nodeagent"),</div><div class='add'>+                   "post",</div><div class='add'>+                   args.session,</div><div class='add'>+                   args.volume,</div><div class='add'>+                   brick] + \</div><div class='add'>+                (["--debug"] if args.debug else [])</div><div class='add'>+        elif task == "delete":</div><div class='add'>+            # When glusterfind delete, cleanup all the session files/dirs</div><div class='add'>+            # from each node.</div><div class='add'>+            cmd = [conf.get_opt("nodeagent"),</div><div class='add'>+                   "delete",</div><div class='add'>+                   args.session,</div><div class='add'>+                   args.volume] + \</div><div class='add'>+                (["--debug"] if args.debug else [])</div><div class='add'>+</div><div class='add'>+        if cmd:</div><div class='add'>+            p = Process(target=node_cmd,</div><div class='add'>+                        args=(host, host_uuid, task, cmd, args, opts))</div><div class='add'>+            p.start()</div><div class='add'>+            pool.append(p)</div><div class='add'>+            g_pid_nodefile_map[p.pid] = node_outfile</div><div class='add'>+</div><div class='add'>+    for num, p in enumerate(pool):</div><div class='add'>+        p.join()</div><div class='add'>+        if p.exitcode != 0:</div><div class='add'>+            logger.warn("Command %s failed in %s" % (task, nodes[num][1]))</div><div class='add'>+            if task in ["create", "delete"]:</div><div class='add'>+                fail("Command %s failed in %s" % (task, nodes[num][1]))</div><div class='add'>+            elif task == "pre" or task == "query":</div><div class='add'>+                if args.disable_partial:</div><div class='add'>+                    sys.exit(1)</div><div class='add'>+                else:</div><div class='add'>+                    del g_pid_nodefile_map[p.pid]</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+@cache_output</div><div class='add'>+def get_nodes(volume):</div><div class='add'>+    """</div><div class='add'>+    Get the gluster volume info xml output and parse to get</div><div class='add'>+    the brick details.</div><div class='add'>+    """</div><div class='add'>+    global vol_statusStr</div><div class='add'>+</div><div class='add'>+    cmd = ["gluster", 'volume', 'info', volume, "--xml"]</div><div class='add'>+    _, data, _ = execute(cmd,</div><div class='add'>+                         exit_msg="Failed to Run Gluster Volume Info",</div><div class='add'>+                         logger=logger)</div><div class='add'>+    tree = etree.fromstring(data)</div><div class='add'>+</div><div class='add'>+    # Test to check if volume has been deleted after session creation</div><div class='add'>+    count_el = tree.find('volInfo/volumes/count')</div><div class='add'>+    if int(count_el.text) == 0:</div><div class='add'>+        fail("Unable to get volume details", logger=logger)</div><div class='add'>+</div><div class='add'>+    # this status is used in caller: run_cmd_nodes</div><div class='add'>+    vol_statusStr = tree.find('volInfo/volumes/volume/statusStr').text</div><div class='add'>+    vol_typeStr = tree.find('volInfo/volumes/volume/typeStr').text</div><div class='add'>+</div><div class='add'>+    nodes = []</div><div class='add'>+    volume_el = tree.find('volInfo/volumes/volume')</div><div class='add'>+    try:</div><div class='add'>+        brick_elems = []</div><div class='add'>+        if vol_typeStr == "Tier":</div><div class='add'>+            brick_elems.append('bricks/hotBricks/brick')</div><div class='add'>+            brick_elems.append('bricks/coldBricks/brick')</div><div class='add'>+        else:</div><div class='add'>+            brick_elems.append('bricks/brick')</div><div class='add'>+</div><div class='add'>+        for elem in brick_elems:</div><div class='add'>+            for b in volume_el.findall(elem):</div><div class='add'>+                nodes.append((b.find('hostUuid').text,</div><div class='add'>+                              b.find('name').text))</div><div class='add'>+    except (ParseError, AttributeError, ValueError) as e:</div><div class='add'>+        fail("Failed to parse Volume Info: %s" % e, logger=logger)</div><div class='add'>+</div><div class='add'>+    return nodes</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def _get_args():</div><div class='add'>+    parser = ArgumentParser(formatter_class=RawDescriptionHelpFormatter,</div><div class='add'>+                            description=PROG_DESCRIPTION)</div><div class='add'>+    subparsers = parser.add_subparsers(dest="mode")</div><div class='add'>+    subparsers.required = True</div><div class='add'>+</div><div class='add'>+    # create &lt;SESSION&gt; &lt;VOLUME&gt; [--debug] [--force]</div><div class='add'>+    parser_create = subparsers.add_parser('create')</div><div class='add'>+    parser_create.add_argument("session", help="Session Name")</div><div class='add'>+    parser_create.add_argument("volume", help="Volume Name")</div><div class='add'>+    parser_create.add_argument("--debug", help="Debug", action="store_true")</div><div class='add'>+    parser_create.add_argument("--force", help="Force option to recreate "</div><div class='add'>+                               "the session", action="store_true")</div><div class='add'>+    parser_create.add_argument("--reset-session-time",</div><div class='add'>+                               help="Reset Session Time to Current Time",</div><div class='add'>+                               action="store_true")</div><div class='add'>+</div><div class='add'>+    # delete &lt;SESSION&gt; &lt;VOLUME&gt; [--debug]</div><div class='add'>+    parser_delete = subparsers.add_parser('delete')</div><div class='add'>+    parser_delete.add_argument("session", help="Session Name")</div><div class='add'>+    parser_delete.add_argument("volume", help="Volume Name")</div><div class='add'>+    parser_delete.add_argument("--debug", help="Debug", action="store_true")</div><div class='add'>+</div><div class='add'>+    # list [--session &lt;SESSION&gt;] [--volume &lt;VOLUME&gt;]</div><div class='add'>+    parser_list = subparsers.add_parser('list')</div><div class='add'>+    parser_list.add_argument("--session", help="Session Name", default="")</div><div class='add'>+    parser_list.add_argument("--volume", help="Volume Name", default="")</div><div class='add'>+    parser_list.add_argument("--debug", help="Debug", action="store_true")</div><div class='add'>+</div><div class='add'>+    # pre &lt;SESSION&gt; &lt;VOLUME&gt; &lt;OUTFILE&gt;</div><div class='add'>+    #     [--output-prefix &lt;OUTPUT_PREFIX&gt;] [--full]</div><div class='add'>+    parser_pre = subparsers.add_parser('pre')</div><div class='add'>+    parser_pre.add_argument("session", help="Session Name")</div><div class='add'>+    parser_pre.add_argument("volume", help="Volume Name")</div><div class='add'>+    parser_pre.add_argument("outfile", help="Output File", action=StoreAbsPath)</div><div class='add'>+    parser_pre.add_argument("--debug", help="Debug", action="store_true")</div><div class='add'>+    parser_pre.add_argument("--no-encode",</div><div class='add'>+                            help="Do not encode path in output file",</div><div class='add'>+                            action="store_true")</div><div class='add'>+    parser_pre.add_argument("--full", help="Full find", action="store_true")</div><div class='add'>+    parser_pre.add_argument("--disable-partial", help="Disable Partial find, "</div><div class='add'>+                            "Fail when one node fails", action="store_true")</div><div class='add'>+    parser_pre.add_argument("--output-prefix", help="File prefix in output",</div><div class='add'>+                            default=".")</div><div class='add'>+    parser_pre.add_argument("--regenerate-outfile",</div><div class='add'>+                            help="Regenerate outfile, discard the outfile "</div><div class='add'>+                            "generated from last pre command",</div><div class='add'>+                            action="store_true")</div><div class='add'>+    parser_pre.add_argument("-N", "--only-namespace-changes",</div><div class='add'>+                            help="List only namespace changes",</div><div class='add'>+                            action="store_true")</div><div class='add'>+    parser_pre.add_argument("--tag-for-full-find",</div><div class='add'>+                            help="Tag prefix for file names emitted during"</div><div class='add'>+                            " a full find operation; default: \"NEW\"",</div><div class='add'>+                            default="NEW")</div><div class='add'>+    parser_pre.add_argument('--type', help="type: f, f-files only"</div><div class='add'>+                            " d, d-directories only, by default = both",</div><div class='add'>+                            default='both', choices=["f", "d", "both"])</div><div class='add'>+    parser_pre.add_argument("--field-separator", help="Field separator string",</div><div class='add'>+                            default=" ")</div><div class='add'>+</div><div class='add'>+    # query &lt;VOLUME&gt; &lt;OUTFILE&gt; --since-time &lt;SINCE_TIME&gt;</div><div class='add'>+    #       [--output-prefix &lt;OUTPUT_PREFIX&gt;] [--full]</div><div class='add'>+    parser_query = subparsers.add_parser('query')</div><div class='add'>+    parser_query.add_argument("volume", help="Volume Name")</div><div class='add'>+    parser_query.add_argument("outfile", help="Output File",</div><div class='add'>+                              action=StoreAbsPath)</div><div class='add'>+    parser_query.add_argument("--since-time", help="UNIX epoch time since "</div><div class='add'>+                              "which listing is required", type=int)</div><div class='add'>+    parser_query.add_argument("--end-time", help="UNIX epoch time up to "</div><div class='add'>+                              "which listing is required", type=int)</div><div class='add'>+    parser_query.add_argument("--no-encode",</div><div class='add'>+                              help="Do not encode path in output file",</div><div class='add'>+                              action="store_true")</div><div class='add'>+    parser_query.add_argument("--full", help="Full find", action="store_true")</div><div class='add'>+    parser_query.add_argument("--debug", help="Debug", action="store_true")</div><div class='add'>+    parser_query.add_argument("--disable-partial", help="Disable Partial find,"</div><div class='add'>+                              " Fail when one node fails", action="store_true")</div><div class='add'>+    parser_query.add_argument("--output-prefix", help="File prefix in output",</div><div class='add'>+                              default=".")</div><div class='add'>+    parser_query.add_argument("-N", "--only-namespace-changes",</div><div class='add'>+                              help="List only namespace changes",</div><div class='add'>+                              action="store_true")</div><div class='add'>+    parser_query.add_argument("--tag-for-full-find",</div><div class='add'>+                              help="Tag prefix for file names emitted during"</div><div class='add'>+                              " a full find operation; default: \"NEW\"",</div><div class='add'>+                              default="NEW")</div><div class='add'>+    parser_query.add_argument('--type', help="type: f, f-files only"</div><div class='add'>+                              " d, d-directories only, by default = both",</div><div class='add'>+                              default='both', choices=["f", "d", "both"])</div><div class='add'>+    parser_query.add_argument("--field-separator",</div><div class='add'>+                              help="Field separator string",</div><div class='add'>+                              default=" ")</div><div class='add'>+</div><div class='add'>+    # post &lt;SESSION&gt; &lt;VOLUME&gt;</div><div class='add'>+    parser_post = subparsers.add_parser('post')</div><div class='add'>+    parser_post.add_argument("session", help="Session Name")</div><div class='add'>+    parser_post.add_argument("volume", help="Volume Name")</div><div class='add'>+    parser_post.add_argument("--debug", help="Debug", action="store_true")</div><div class='add'>+</div><div class='add'>+    return parser.parse_args()</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def ssh_setup(args):</div><div class='add'>+    pem_key_path = get_pem_key_path(args.session, args.volume)</div><div class='add'>+</div><div class='add'>+    if not os.path.exists(pem_key_path):</div><div class='add'>+        # Generate ssh-key</div><div class='add'>+        cmd = ["ssh-keygen",</div><div class='add'>+               "-N",</div><div class='add'>+               "",</div><div class='add'>+               "-f",</div><div class='add'>+               pem_key_path]</div><div class='add'>+        execute(cmd,</div><div class='add'>+                exit_msg="Unable to generate ssh key %s"</div><div class='add'>+                % pem_key_path,</div><div class='add'>+                logger=logger)</div><div class='add'>+</div><div class='add'>+        logger.info("Ssh key generated %s" % pem_key_path)</div><div class='add'>+</div><div class='add'>+    try:</div><div class='add'>+        shutil.copyfile(pem_key_path + ".pub",</div><div class='add'>+                        os.path.join(conf.get_opt("session_dir"),</div><div class='add'>+                                     ".keys",</div><div class='add'>+                                     "%s_%s_secret.pem.pub" % (args.session,</div><div class='add'>+                                                               args.volume)))</div><div class='add'>+    except (IOError, OSError) as e:</div><div class='add'>+        fail("Failed to copy public key to %s: %s"</div><div class='add'>+             % (os.path.join(conf.get_opt("session_dir"), ".keys"), e),</div><div class='add'>+             logger=logger)</div><div class='add'>+</div><div class='add'>+    # Copy pub file to all nodes</div><div class='add'>+    cmd = ["gluster",</div><div class='add'>+           "system::",</div><div class='add'>+           "copy",</div><div class='add'>+           "file",</div><div class='add'>+           "/glusterfind/.keys/%s.pub" % os.path.basename(pem_key_path)]</div><div class='add'>+</div><div class='add'>+    execute(cmd, exit_msg="Failed to distribute ssh keys", logger=logger)</div><div class='add'>+</div><div class='add'>+    logger.info("Distributed ssh key to all nodes of Volume")</div><div class='add'>+</div><div class='add'>+    # Add to authorized_keys file in each node</div><div class='add'>+    cmd = ["gluster",</div><div class='add'>+           "system::",</div><div class='add'>+           "execute",</div><div class='add'>+           "add_secret_pub",</div><div class='add'>+           "root",</div><div class='add'>+           "/glusterfind/.keys/%s.pub" % os.path.basename(pem_key_path)]</div><div class='add'>+    execute(cmd,</div><div class='add'>+            exit_msg="Failed to add ssh keys to authorized_keys file",</div><div class='add'>+            logger=logger)</div><div class='add'>+</div><div class='add'>+    logger.info("Ssh key added to authorized_keys of Volume nodes")</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def enable_volume_options(args):</div><div class='add'>+    execute(["gluster", "volume", "set",</div><div class='add'>+             args.volume, "build-pgfid", "on"],</div><div class='add'>+            exit_msg="Failed to set volume option build-pgfid on",</div><div class='add'>+            logger=logger)</div><div class='add'>+    logger.info("Volume option set %s, build-pgfid on" % args.volume)</div><div class='add'>+</div><div class='add'>+    execute(["gluster", "volume", "set",</div><div class='add'>+             args.volume, "changelog.changelog", "on"],</div><div class='add'>+            exit_msg="Failed to set volume option "</div><div class='add'>+            "changelog.changelog on", logger=logger)</div><div class='add'>+    logger.info("Volume option set %s, changelog.changelog on"</div><div class='add'>+                % args.volume)</div><div class='add'>+</div><div class='add'>+    execute(["gluster", "volume", "set",</div><div class='add'>+             args.volume, "changelog.capture-del-path", "on"],</div><div class='add'>+            exit_msg="Failed to set volume option "</div><div class='add'>+            "changelog.capture-del-path on", logger=logger)</div><div class='add'>+    logger.info("Volume option set %s, changelog.capture-del-path on"</div><div class='add'>+                % args.volume)</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def write_output(outfile, outfilemerger, field_separator):</div><div class='add'>+    with codecs.open(outfile, "a", encoding="utf-8") as f:</div><div class='add'>+        for row in outfilemerger.get():</div><div class='add'>+            # Multiple paths in case of Hardlinks</div><div class='add'>+            paths = row[1].split(",")</div><div class='add'>+            row_2_rep = None</div><div class='add'>+            for p in paths:</div><div class='add'>+                if p == "":</div><div class='add'>+                    continue</div><div class='add'>+                p_rep = p.replace("//", "/")</div><div class='add'>+                if not row_2_rep:</div><div class='add'>+                    row_2_rep = row[2].replace("//", "/")</div><div class='add'>+                if p_rep == row_2_rep:</div><div class='add'>+                    continue</div><div class='add'>+</div><div class='add'>+                if row_2_rep and row_2_rep != "":</div><div class='add'>+                    gfind_write_row(f, row[0], field_separator, p_rep, row_2_rep)</div><div class='add'>+</div><div class='add'>+                else:</div><div class='add'>+                    gfind_write(f, row[0], field_separator, p_rep)</div><div class='add'>+</div><div class='add'>+def validate_volume(volume):</div><div class='add'>+    cmd = ["gluster", 'volume', 'info', volume, "--xml"]</div><div class='add'>+    _, data, _ = execute(cmd,</div><div class='add'>+                         exit_msg="Failed to Run Gluster Volume Info",</div><div class='add'>+                         logger=logger)</div><div class='add'>+    try:</div><div class='add'>+        tree = etree.fromstring(data)</div><div class='add'>+        statusStr = tree.find('volInfo/volumes/volume/statusStr').text</div><div class='add'>+    except (ParseError, AttributeError) as e:</div><div class='add'>+        fail("Invalid Volume: Check the Volume name! %s" % e)</div><div class='add'>+    if statusStr != "Started":</div><div class='add'>+        fail("Volume %s is not online" % volume)</div><div class='add'>+</div><div class='add'>+# The rules for a valid session name.</div><div class='add'>+SESSION_NAME_RULES = {</div><div class='add'>+    'min_length': 2,</div><div class='add'>+    'max_length': 256,  # same as maximum volume length</div><div class='add'>+    # Specifies all alphanumeric characters, underscore, hyphen.</div><div class='add'>+    'valid_chars': r'0-9a-zA-Z_-',</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+# checks valid session name, fail otherwise</div><div class='add'>+def validate_session_name(session):</div><div class='add'>+    # Check for minimum length</div><div class='add'>+    if len(session) &lt; SESSION_NAME_RULES['min_length']:</div><div class='add'>+        fail('session_name must be at least ' +</div><div class='add'>+                 str(SESSION_NAME_RULES['min_length']) + ' characters long.')</div><div class='add'>+    # Check for maximum length</div><div class='add'>+    if len(session) &gt; SESSION_NAME_RULES['max_length']:</div><div class='add'>+        fail('session_name must not exceed ' +</div><div class='add'>+                 str(SESSION_NAME_RULES['max_length']) + ' characters length.')</div><div class='add'>+</div><div class='add'>+    # Matches strings composed entirely of characters specified within</div><div class='add'>+    if not re.match(r'^[' + SESSION_NAME_RULES['valid_chars'] +</div><div class='add'>+                        ']+$', session):</div><div class='add'>+        fail('Session name can only contain these characters: ' +</div><div class='add'>+                         SESSION_NAME_RULES['valid_chars'])</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def mode_create(session_dir, args):</div><div class='add'>+    validate_session_name(args.session)</div><div class='add'>+</div><div class='add'>+    logger.debug("Init is called - Session: %s, Volume: %s"</div><div class='add'>+                 % (args.session, args.volume))</div><div class='add'>+    mkdirp(session_dir, exit_on_err=True, logger=logger)</div><div class='add'>+    mkdirp(os.path.join(session_dir, args.volume), exit_on_err=True,</div><div class='add'>+           logger=logger)</div><div class='add'>+    status_file = os.path.join(session_dir, args.volume, "status")</div><div class='add'>+</div><div class='add'>+    if os.path.exists(status_file) and not args.force:</div><div class='add'>+        fail("Session %s already created" % args.session, logger=logger)</div><div class='add'>+</div><div class='add'>+    if not os.path.exists(status_file) or args.force:</div><div class='add'>+        ssh_setup(args)</div><div class='add'>+        enable_volume_options(args)</div><div class='add'>+</div><div class='add'>+    # Add Rollover time to current time to make sure changelogs</div><div class='add'>+    # will be available if we use this time as start time</div><div class='add'>+    time_to_update = int(time.time()) + get_changelog_rollover_time(</div><div class='add'>+        args.volume)</div><div class='add'>+</div><div class='add'>+    run_cmd_nodes("create", args, time_to_update=str(time_to_update))</div><div class='add'>+</div><div class='add'>+    if not os.path.exists(status_file) or args.reset_session_time:</div><div class='add'>+        with open(status_file, "w") as f:</div><div class='add'>+            f.write(str(time_to_update))</div><div class='add'>+</div><div class='add'>+    sys.stdout.write("Session %s created with volume %s\n" %</div><div class='add'>+                     (args.session, args.volume))</div><div class='add'>+</div><div class='add'>+    sys.exit(0)</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def mode_query(session_dir, args):</div><div class='add'>+    global gtmpfilename</div><div class='add'>+    global g_pid_nodefile_map</div><div class='add'>+</div><div class='add'>+    # Verify volume status</div><div class='add'>+    cmd = ["gluster", 'volume', 'info', args.volume, "--xml"]</div><div class='add'>+    _, data, _ = execute(cmd,</div><div class='add'>+                         exit_msg="Failed to Run Gluster Volume Info",</div><div class='add'>+                         logger=logger)</div><div class='add'>+    try:</div><div class='add'>+        tree = etree.fromstring(data)</div><div class='add'>+        statusStr = tree.find('volInfo/volumes/volume/statusStr').text</div><div class='add'>+    except (ParseError, AttributeError) as e:</div><div class='add'>+        fail("Invalid Volume: %s" % e, logger=logger)</div><div class='add'>+</div><div class='add'>+    if statusStr != "Started":</div><div class='add'>+        fail("Volume %s is not online" % args.volume, logger=logger)</div><div class='add'>+</div><div class='add'>+    mkdirp(session_dir, exit_on_err=True, logger=logger)</div><div class='add'>+    mkdirp(os.path.join(session_dir, args.volume), exit_on_err=True,</div><div class='add'>+           logger=logger)</div><div class='add'>+    mkdirp(os.path.dirname(args.outfile), exit_on_err=True, logger=logger)</div><div class='add'>+</div><div class='add'>+    # Configure cluster for pasword-less SSH</div><div class='add'>+    ssh_setup(args)</div><div class='add'>+</div><div class='add'>+    # Enable volume options for changelog capture</div><div class='add'>+    enable_volume_options(args)</div><div class='add'>+</div><div class='add'>+    # Test options</div><div class='add'>+    if not args.full and args.type in ["f", "d"]:</div><div class='add'>+        fail("--type can only be used with --full")</div><div class='add'>+    if not args.since_time and not args.end_time and not args.full:</div><div class='add'>+        fail("Please specify either {--since-time and optionally --end-time} "</div><div class='add'>+             "or --full", logger=logger)</div><div class='add'>+</div><div class='add'>+    if args.since_time and args.end_time and args.full:</div><div class='add'>+        fail("Please specify either {--since-time and optionally --end-time} "</div><div class='add'>+             "or --full, but not both",</div><div class='add'>+             logger=logger)</div><div class='add'>+</div><div class='add'>+    if args.end_time and not args.since_time:</div><div class='add'>+        fail("Please specify --since-time as well", logger=logger)</div><div class='add'>+</div><div class='add'>+    # Start query command processing</div><div class='add'>+    start = -1</div><div class='add'>+    end = -1</div><div class='add'>+    if args.since_time:</div><div class='add'>+        start = args.since_time</div><div class='add'>+        if args.end_time:</div><div class='add'>+            end = args.end_time</div><div class='add'>+    else:</div><div class='add'>+        start = 0  # --full option is handled separately</div><div class='add'>+</div><div class='add'>+    logger.debug("Query is called - Session: %s, Volume: %s, "</div><div class='add'>+                 "Start time: %s, End time: %s"</div><div class='add'>+                 % ("default", args.volume, start, end))</div><div class='add'>+</div><div class='add'>+    prefix = datetime.now().strftime("%Y%m%d-%H%M%S-%f-")</div><div class='add'>+    gtmpfilename = prefix + next(tempfile._get_candidate_names())</div><div class='add'>+</div><div class='add'>+    run_cmd_nodes("query", args, start=start, end=end,</div><div class='add'>+                  tmpfilename=gtmpfilename)</div><div class='add'>+</div><div class='add'>+    # Merger</div><div class='add'>+    if args.full:</div><div class='add'>+        if len(g_pid_nodefile_map) &gt; 0:</div><div class='add'>+            cmd = ["sort", "-u"] + list(g_pid_nodefile_map.values()) + \</div><div class='add'>+                  ["-o", args.outfile]</div><div class='add'>+            execute(cmd,</div><div class='add'>+                    exit_msg="Failed to merge output files "</div><div class='add'>+                    "collected from nodes", logger=logger)</div><div class='add'>+        else:</div><div class='add'>+            fail("Failed to collect any output files from peers. "</div><div class='add'>+                 "Looks like all bricks are offline.", logger=logger)</div><div class='add'>+    else:</div><div class='add'>+        # Read each Changelogs db and generate finaldb</div><div class='add'>+        create_file(args.outfile, exit_on_err=True, logger=logger)</div><div class='add'>+        outfilemerger = OutputMerger(args.outfile + ".db",</div><div class='add'>+                                     list(g_pid_nodefile_map.values()))</div><div class='add'>+        write_output(args.outfile, outfilemerger, args.field_separator)</div><div class='add'>+</div><div class='add'>+    try:</div><div class='add'>+        os.remove(args.outfile + ".db")</div><div class='add'>+    except (IOError, OSError):</div><div class='add'>+        pass</div><div class='add'>+</div><div class='add'>+    run_cmd_nodes("cleanup", args, tmpfilename=gtmpfilename)</div><div class='add'>+</div><div class='add'>+    sys.stdout.write("Generated output file %s\n" % args.outfile)</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def mode_pre(session_dir, args):</div><div class='add'>+    global gtmpfilename</div><div class='add'>+    global g_pid_nodefile_map</div><div class='add'>+</div><div class='add'>+    """</div><div class='add'>+    Read from Session file and write to session.pre file</div><div class='add'>+    """</div><div class='add'>+    endtime_to_update = int(time.time()) - get_changelog_rollover_time(</div><div class='add'>+        args.volume)</div><div class='add'>+    status_file = os.path.join(session_dir, args.volume, "status")</div><div class='add'>+    status_file_pre = status_file + ".pre"</div><div class='add'>+</div><div class='add'>+    mkdirp(os.path.dirname(args.outfile), exit_on_err=True, logger=logger)</div><div class='add'>+</div><div class='add'>+    if not args.full and args.type in ["f", "d"]:</div><div class='add'>+        fail("--type can only be used with --full")</div><div class='add'>+</div><div class='add'>+    # If Pre status file exists and running pre command again</div><div class='add'>+    if os.path.exists(status_file_pre) and not args.regenerate_outfile:</div><div class='add'>+        fail("Post command is not run after last pre, "</div><div class='add'>+             "use --regenerate-outfile")</div><div class='add'>+</div><div class='add'>+    start = 0</div><div class='add'>+    try:</div><div class='add'>+        with open(status_file) as f:</div><div class='add'>+            start = int(f.read().strip())</div><div class='add'>+    except ValueError:</div><div class='add'>+        pass</div><div class='add'>+    except (OSError, IOError) as e:</div><div class='add'>+        fail("Error Opening Session file %s: %s"</div><div class='add'>+             % (status_file, e), logger=logger)</div><div class='add'>+</div><div class='add'>+    logger.debug("Pre is called - Session: %s, Volume: %s, "</div><div class='add'>+                 "Start time: %s, End time: %s"</div><div class='add'>+                 % (args.session, args.volume, start, endtime_to_update))</div><div class='add'>+</div><div class='add'>+    prefix = datetime.now().strftime("%Y%m%d-%H%M%S-%f-")</div><div class='add'>+    gtmpfilename = prefix + next(tempfile._get_candidate_names())</div><div class='add'>+</div><div class='add'>+    run_cmd_nodes("pre", args, start=start, end=-1, tmpfilename=gtmpfilename)</div><div class='add'>+</div><div class='add'>+    # Merger</div><div class='add'>+    if args.full:</div><div class='add'>+        if len(g_pid_nodefile_map) &gt; 0:</div><div class='add'>+            cmd = ["sort", "-u"] + list(g_pid_nodefile_map.values()) + \</div><div class='add'>+                  ["-o", args.outfile]</div><div class='add'>+            execute(cmd,</div><div class='add'>+                    exit_msg="Failed to merge output files "</div><div class='add'>+                    "collected from nodes", logger=logger)</div><div class='add'>+        else:</div><div class='add'>+            fail("Failed to collect any output files from peers. "</div><div class='add'>+                 "Looks like all bricks are offline.", logger=logger)</div><div class='add'>+    else:</div><div class='add'>+        # Read each Changelogs db and generate finaldb</div><div class='add'>+        create_file(args.outfile, exit_on_err=True, logger=logger)</div><div class='add'>+        outfilemerger = OutputMerger(args.outfile + ".db",</div><div class='add'>+                                     list(g_pid_nodefile_map.values()))</div><div class='add'>+        write_output(args.outfile, outfilemerger, args.field_separator)</div><div class='add'>+</div><div class='add'>+    try:</div><div class='add'>+        os.remove(args.outfile + ".db")</div><div class='add'>+    except (IOError, OSError):</div><div class='add'>+        pass</div><div class='add'>+</div><div class='add'>+    run_cmd_nodes("cleanup", args, tmpfilename=gtmpfilename)</div><div class='add'>+</div><div class='add'>+    with open(status_file_pre, "w") as f:</div><div class='add'>+        f.write(str(endtime_to_update))</div><div class='add'>+</div><div class='add'>+    sys.stdout.write("Generated output file %s\n" % args.outfile)</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def mode_post(session_dir, args):</div><div class='add'>+    """</div><div class='add'>+    If pre session file exists, overwrite session file</div><div class='add'>+    If pre session file does not exists, return ERROR</div><div class='add'>+    """</div><div class='add'>+    status_file = os.path.join(session_dir, args.volume, "status")</div><div class='add'>+    logger.debug("Post is called - Session: %s, Volume: %s"</div><div class='add'>+                 % (args.session, args.volume))</div><div class='add'>+    status_file_pre = status_file + ".pre"</div><div class='add'>+</div><div class='add'>+    if os.path.exists(status_file_pre):</div><div class='add'>+        run_cmd_nodes("post", args)</div><div class='add'>+        os.rename(status_file_pre, status_file)</div><div class='add'>+        sys.stdout.write("Session %s with volume %s updated\n" %</div><div class='add'>+                         (args.session, args.volume))</div><div class='add'>+        sys.exit(0)</div><div class='add'>+    else:</div><div class='add'>+        fail("Pre script is not run", logger=logger)</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def mode_delete(session_dir, args):</div><div class='add'>+    run_cmd_nodes("delete", args)</div><div class='add'>+    shutil.rmtree(os.path.join(session_dir, args.volume),</div><div class='add'>+                  onerror=handle_rm_error)</div><div class='add'>+    sys.stdout.write("Session %s with volume %s deleted\n" %</div><div class='add'>+                     (args.session, args.volume))</div><div class='add'>+</div><div class='add'>+    # If the session contains only this volume, then cleanup the</div><div class='add'>+    # session directory. If a session contains multiple volumes</div><div class='add'>+    # then os.rmdir will fail with ENOTEMPTY</div><div class='add'>+    try:</div><div class='add'>+        os.rmdir(session_dir)</div><div class='add'>+    except OSError as e:</div><div class='add'>+        if not e.errno == ENOTEMPTY:</div><div class='add'>+            logger.warn("Failed to delete session directory: %s" % e)</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def mode_list(session_dir, args):</div><div class='add'>+    """</div><div class='add'>+    List available sessions to stdout, if session name is set</div><div class='add'>+    only list that session.</div><div class='add'>+    """</div><div class='add'>+    if args.session:</div><div class='add'>+        if not os.path.exists(os.path.join(session_dir, args.session)):</div><div class='add'>+            fail("Invalid Session", logger=logger)</div><div class='add'>+        sessions = [args.session]</div><div class='add'>+    else:</div><div class='add'>+        sessions = []</div><div class='add'>+        for d in os.listdir(session_dir):</div><div class='add'>+            if d != ".keys":</div><div class='add'>+                sessions.append(d)</div><div class='add'>+</div><div class='add'>+    output = []</div><div class='add'>+    for session in sessions:</div><div class='add'>+        # Session Volume Last Processed</div><div class='add'>+        volnames = os.listdir(os.path.join(session_dir, session))</div><div class='add'>+</div><div class='add'>+        for volname in volnames:</div><div class='add'>+            if args.volume and args.volume != volname:</div><div class='add'>+                continue</div><div class='add'>+</div><div class='add'>+            status_file = os.path.join(session_dir, session, volname, "status")</div><div class='add'>+            last_processed = None</div><div class='add'>+            try:</div><div class='add'>+                with open(status_file) as f:</div><div class='add'>+                    last_processed = f.read().strip()</div><div class='add'>+            except (OSError, IOError) as e:</div><div class='add'>+                if e.errno == ENOENT:</div><div class='add'>+                    continue</div><div class='add'>+                else:</div><div class='add'>+                    raise</div><div class='add'>+            output.append((session, volname, last_processed))</div><div class='add'>+</div><div class='add'>+    if output:</div><div class='add'>+        sys.stdout.write("%s %s %s\n" % ("SESSION".ljust(25),</div><div class='add'>+                                         "VOLUME".ljust(25),</div><div class='add'>+                                         "SESSION TIME".ljust(25)))</div><div class='add'>+        sys.stdout.write("-"*75)</div><div class='add'>+        sys.stdout.write("\n")</div><div class='add'>+    for session, volname, last_processed in output:</div><div class='add'>+        sess_time = 'Session Corrupted'</div><div class='add'>+        if last_processed:</div><div class='add'>+            try:</div><div class='add'>+                sess_time = human_time(last_processed)</div><div class='add'>+            except TypeError:</div><div class='add'>+                sess_time = 'Session Corrupted'</div><div class='add'>+        sys.stdout.write("%s %s %s\n" % (session.ljust(25),</div><div class='add'>+                                         volname.ljust(25),</div><div class='add'>+                                         sess_time.ljust(25)))</div><div class='add'>+</div><div class='add'>+    if not output:</div><div class='add'>+        if args.session or args.volume:</div><div class='add'>+            fail("Invalid Session", logger=logger)</div><div class='add'>+        else:</div><div class='add'>+            sys.stdout.write("No sessions found.\n")</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def main():</div><div class='add'>+    global gtmpfilename</div><div class='add'>+</div><div class='add'>+    args = None</div><div class='add'>+</div><div class='add'>+    try:</div><div class='add'>+        args = _get_args()</div><div class='add'>+        mkdirp(conf.get_opt("session_dir"), exit_on_err=True)</div><div class='add'>+</div><div class='add'>+        # force the default session name if mode is "query"</div><div class='add'>+        if args.mode == "query":</div><div class='add'>+            args.session = "default"</div><div class='add'>+</div><div class='add'>+        if args.mode == "list":</div><div class='add'>+            session_dir = conf.get_opt("session_dir")</div><div class='add'>+        else:</div><div class='add'>+            session_dir = os.path.join(conf.get_opt("session_dir"),</div><div class='add'>+                                       args.session)</div><div class='add'>+</div><div class='add'>+        if not os.path.exists(session_dir) and \</div><div class='add'>+                args.mode not in ["create", "list", "query"]:</div><div class='add'>+            fail("Invalid session %s" % args.session)</div><div class='add'>+</div><div class='add'>+        # volume involved, validate the volume first</div><div class='add'>+        if args.mode not in ["list"]:</div><div class='add'>+            validate_volume(args.volume)</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+        # "default" is a system defined session name</div><div class='add'>+        if args.mode in ["create", "post", "pre", "delete"] and \</div><div class='add'>+                args.session == "default":</div><div class='add'>+            fail("Invalid session %s" % args.session)</div><div class='add'>+</div><div class='add'>+        vol_dir = os.path.join(session_dir, args.volume)</div><div class='add'>+        if not os.path.exists(vol_dir) and args.mode not in \</div><div class='add'>+                ["create", "list", "query"]:</div><div class='add'>+            fail("Session %s not created with volume %s" %</div><div class='add'>+                 (args.session, args.volume))</div><div class='add'>+</div><div class='add'>+        mkdirp(os.path.join(conf.get_opt("log_dir"),</div><div class='add'>+                            args.session,</div><div class='add'>+                            args.volume),</div><div class='add'>+               exit_on_err=True)</div><div class='add'>+        log_file = os.path.join(conf.get_opt("log_dir"),</div><div class='add'>+                                args.session,</div><div class='add'>+                                args.volume,</div><div class='add'>+                                "cli.log")</div><div class='add'>+        setup_logger(logger, log_file, args.debug)</div><div class='add'>+</div><div class='add'>+        # globals() will have all the functions already defined.</div><div class='add'>+        # mode_&lt;args.mode&gt; will be the function name to be called</div><div class='add'>+        globals()["mode_" + args.mode](session_dir, args)</div><div class='add'>+    except KeyboardInterrupt:</div><div class='add'>+        if args is not None:</div><div class='add'>+            if args.mode == "pre" or args.mode == "query":</div><div class='add'>+                # cleanup session</div><div class='add'>+                if gtmpfilename is not None:</div><div class='add'>+                    # no more interrupts until we clean up</div><div class='add'>+                    signal.signal(signal.SIGINT, signal.SIG_IGN)</div><div class='add'>+                    run_cmd_nodes("cleanup", args, tmpfilename=gtmpfilename)</div><div class='add'>+</div><div class='add'>+        # Interrupted, exit with non zero error code</div><div class='add'>+        sys.exit(2)</div><div class='head'>diff --git a/tools/glusterfind/src/nodeagent.py b/tools/glusterfind/src/nodeagent.py<br/>new file mode 100644<br/>index 00000000000..679daa6fa76<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tools/glusterfind/src/nodeagent.py?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tools/glusterfind/src/nodeagent.py</a></div><div class='hunk'>@@ -0,0 +1,139 @@</div><div class='add'>+#!/usr/bin/python3</div><div class='add'>+# -*- coding: utf-8 -*-</div><div class='add'>+</div><div class='add'>+# Copyright (c) 2015 Red Hat, Inc. &lt;http://www.redhat.com/&gt;</div><div class='add'>+# This file is part of GlusterFS.</div><div class='add'>+#</div><div class='add'>+# This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+# General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+# later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+# cases as published by the Free Software Foundation.</div><div class='add'>+</div><div class='add'>+import shutil</div><div class='add'>+import sys</div><div class='add'>+import os</div><div class='add'>+import logging</div><div class='add'>+from argparse import ArgumentParser, RawDescriptionHelpFormatter</div><div class='add'>+try:</div><div class='add'>+    import urllib.parse as urllib</div><div class='add'>+except ImportError:</div><div class='add'>+    import urllib</div><div class='add'>+from errno import ENOTEMPTY</div><div class='add'>+</div><div class='add'>+from utils import setup_logger, mkdirp, handle_rm_error</div><div class='add'>+import conf</div><div class='add'>+</div><div class='add'>+logger = logging.getLogger()</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def mode_cleanup(args):</div><div class='add'>+    working_dir = os.path.join(conf.get_opt("working_dir"),</div><div class='add'>+                               args.session,</div><div class='add'>+                               args.volume,</div><div class='add'>+                               args.tmpfilename)</div><div class='add'>+</div><div class='add'>+    mkdirp(os.path.join(conf.get_opt("log_dir"), args.session, args.volume),</div><div class='add'>+           exit_on_err=True)</div><div class='add'>+    log_file = os.path.join(conf.get_opt("log_dir"),</div><div class='add'>+                            args.session,</div><div class='add'>+                            args.volume,</div><div class='add'>+                            "changelog.log")</div><div class='add'>+</div><div class='add'>+    setup_logger(logger, log_file)</div><div class='add'>+</div><div class='add'>+    try:</div><div class='add'>+        shutil.rmtree(working_dir, onerror=handle_rm_error)</div><div class='add'>+    except (OSError, IOError) as e:</div><div class='add'>+        logger.error("Failed to delete working directory: %s" % e)</div><div class='add'>+        sys.exit(1)</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def mode_create(args):</div><div class='add'>+    session_dir = os.path.join(conf.get_opt("session_dir"),</div><div class='add'>+                               args.session)</div><div class='add'>+    status_file = os.path.join(session_dir, args.volume,</div><div class='add'>+                     "%s.status" % urllib.quote_plus(args.brick))</div><div class='add'>+</div><div class='add'>+    mkdirp(os.path.join(session_dir, args.volume), exit_on_err=True,</div><div class='add'>+           logger=logger)</div><div class='add'>+</div><div class='add'>+    if not os.path.exists(status_file) or args.reset_session_time:</div><div class='add'>+        with open(status_file, "w") as f:</div><div class='add'>+            f.write(args.time_to_update)</div><div class='add'>+</div><div class='add'>+    sys.exit(0)</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def mode_post(args):</div><div class='add'>+    session_dir = os.path.join(conf.get_opt("session_dir"), args.session)</div><div class='add'>+    status_file = os.path.join(session_dir, args.volume,</div><div class='add'>+                     "%s.status" % urllib.quote_plus(args.brick))</div><div class='add'>+</div><div class='add'>+    mkdirp(os.path.join(session_dir, args.volume), exit_on_err=True,</div><div class='add'>+           logger=logger)</div><div class='add'>+    status_file_pre = status_file + ".pre"</div><div class='add'>+</div><div class='add'>+    if os.path.exists(status_file_pre):</div><div class='add'>+        os.rename(status_file_pre, status_file)</div><div class='add'>+        sys.exit(0)</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def mode_delete(args):</div><div class='add'>+    session_dir = os.path.join(conf.get_opt("session_dir"),</div><div class='add'>+                               args.session)</div><div class='add'>+    shutil.rmtree(os.path.join(session_dir, args.volume),</div><div class='add'>+                  onerror=handle_rm_error)</div><div class='add'>+</div><div class='add'>+    # If the session contains only this volume, then cleanup the</div><div class='add'>+    # session directory. If a session contains multiple volumes</div><div class='add'>+    # then os.rmdir will fail with ENOTEMPTY</div><div class='add'>+    try:</div><div class='add'>+        os.rmdir(session_dir)</div><div class='add'>+    except OSError as e:</div><div class='add'>+        if not e.errno == ENOTEMPTY:</div><div class='add'>+            logger.warn("Failed to delete session directory: %s" % e)</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def _get_args():</div><div class='add'>+    parser = ArgumentParser(formatter_class=RawDescriptionHelpFormatter,</div><div class='add'>+                            description="Node Agent")</div><div class='add'>+    subparsers = parser.add_subparsers(dest="mode")</div><div class='add'>+</div><div class='add'>+    parser_cleanup = subparsers.add_parser('cleanup')</div><div class='add'>+    parser_cleanup.add_argument("session", help="Session Name")</div><div class='add'>+    parser_cleanup.add_argument("volume", help="Volume Name")</div><div class='add'>+    parser_cleanup.add_argument("tmpfilename", help="Temporary File Name")</div><div class='add'>+    parser_cleanup.add_argument("--debug", help="Debug", action="store_true")</div><div class='add'>+</div><div class='add'>+    parser_session_create = subparsers.add_parser('create')</div><div class='add'>+    parser_session_create.add_argument("session", help="Session Name")</div><div class='add'>+    parser_session_create.add_argument("volume", help="Volume Name")</div><div class='add'>+    parser_session_create.add_argument("brick", help="Brick Path")</div><div class='add'>+    parser_session_create.add_argument("time_to_update", help="Time to Update")</div><div class='add'>+    parser_session_create.add_argument("--reset-session-time",</div><div class='add'>+                                       help="Reset Session Time",</div><div class='add'>+                                       action="store_true")</div><div class='add'>+    parser_session_create.add_argument("--debug", help="Debug",</div><div class='add'>+                                       action="store_true")</div><div class='add'>+</div><div class='add'>+    parser_post = subparsers.add_parser('post')</div><div class='add'>+    parser_post.add_argument("session", help="Session Name")</div><div class='add'>+    parser_post.add_argument("volume", help="Volume Name")</div><div class='add'>+    parser_post.add_argument("brick", help="Brick Path")</div><div class='add'>+    parser_post.add_argument("--debug", help="Debug",</div><div class='add'>+                             action="store_true")</div><div class='add'>+</div><div class='add'>+    parser_delete = subparsers.add_parser('delete')</div><div class='add'>+    parser_delete.add_argument("session", help="Session Name")</div><div class='add'>+    parser_delete.add_argument("volume", help="Volume Name")</div><div class='add'>+    parser_delete.add_argument("--debug", help="Debug",</div><div class='add'>+                               action="store_true")</div><div class='add'>+    return parser.parse_args()</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+if __name__ == "__main__":</div><div class='add'>+    args = _get_args()</div><div class='add'>+</div><div class='add'>+    # globals() will have all the functions already defined.</div><div class='add'>+    # mode_&lt;args.mode&gt; will be the function name to be called</div><div class='add'>+    globals()["mode_" + args.mode](args)</div><div class='head'>diff --git a/tools/glusterfind/src/tool.conf.in b/tools/glusterfind/src/tool.conf.in<br/>new file mode 100644<br/>index 00000000000..a80f4a784c0<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tools/glusterfind/src/tool.conf.in?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tools/glusterfind/src/tool.conf.in</a></div><div class='hunk'>@@ -0,0 +1,10 @@</div><div class='add'>+[vars]</div><div class='add'>+session_dir=@GLUSTERD_WORKDIR@/glusterfind/</div><div class='add'>+working_dir=@GLUSTERFSD_MISCDIR@/glusterfind/</div><div class='add'>+log_dir=/var/log/glusterfs/glusterfind/</div><div class='add'>+nodeagent=@GLUSTERFS_LIBEXECDIR@/glusterfind/nodeagent.py</div><div class='add'>+brick_ignore_dirs=.glusterfs,.trashcan</div><div class='add'>+</div><div class='add'>+[change_detectors]</div><div class='add'>+changelog=@GLUSTERFS_LIBEXECDIR@/glusterfind/changelog.py</div><div class='add'>+brickfind=@GLUSTERFS_LIBEXECDIR@/glusterfind/brickfind.py
\ No newline at end of file</div><div class='head'>diff --git a/tools/glusterfind/src/utils.py b/tools/glusterfind/src/utils.py<br/>new file mode 100644<br/>index 00000000000..906ebd8f252<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tools/glusterfind/src/utils.py?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tools/glusterfind/src/utils.py</a></div><div class='hunk'>@@ -0,0 +1,267 @@</div><div class='add'>+# -*- coding: utf-8 -*-</div><div class='add'>+</div><div class='add'>+# Copyright (c) 2015 Red Hat, Inc. &lt;http://www.redhat.com/&gt;</div><div class='add'>+# This file is part of GlusterFS.</div><div class='add'>+#</div><div class='add'>+# This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+# General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+# later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+# cases as published by the Free Software Foundation.</div><div class='add'>+</div><div class='add'>+import sys</div><div class='add'>+from subprocess import PIPE, Popen</div><div class='add'>+from errno import EEXIST, ENOENT</div><div class='add'>+import xml.etree.cElementTree as etree</div><div class='add'>+import logging</div><div class='add'>+import os</div><div class='add'>+from datetime import datetime</div><div class='add'>+</div><div class='add'>+ROOT_GFID = "00000000-0000-0000-0000-000000000001"</div><div class='add'>+DEFAULT_CHANGELOG_INTERVAL = 15</div><div class='add'>+SPACE_ESCAPE_CHAR = "%20"</div><div class='add'>+NEWLINE_ESCAPE_CHAR = "%0A"</div><div class='add'>+PERCENTAGE_ESCAPE_CHAR = "%25"</div><div class='add'>+</div><div class='add'>+ParseError = etree.ParseError if hasattr(etree, 'ParseError') else SyntaxError</div><div class='add'>+cache_data = {}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+class RecordType(object):</div><div class='add'>+    NEW = "NEW"</div><div class='add'>+    MODIFY = "MODIFY"</div><div class='add'>+    RENAME = "RENAME"</div><div class='add'>+    DELETE = "DELETE"</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def cache_output(func):</div><div class='add'>+    def wrapper(*args, **kwargs):</div><div class='add'>+        global cache_data</div><div class='add'>+        if cache_data.get(func.__name__, None) is None:</div><div class='add'>+            cache_data[func.__name__] = func(*args, **kwargs)</div><div class='add'>+</div><div class='add'>+        return cache_data[func.__name__]</div><div class='add'>+    return wrapper</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def handle_rm_error(func, path, exc_info):</div><div class='add'>+    if exc_info[1].errno == ENOENT:</div><div class='add'>+        return</div><div class='add'>+</div><div class='add'>+    raise exc_info[1]</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def find(path, callback_func=lambda x: True, filter_func=lambda x: True,</div><div class='add'>+         ignore_dirs=[], subdirs_crawl=True):</div><div class='add'>+    if path in ignore_dirs:</div><div class='add'>+        return</div><div class='add'>+</div><div class='add'>+    # Capture filter_func output and pass it to callback function</div><div class='add'>+    filter_result = filter_func(path)</div><div class='add'>+    if filter_result is not None:</div><div class='add'>+        callback_func(path, filter_result, os.path.isdir(path))</div><div class='add'>+</div><div class='add'>+    for p in os.listdir(path):</div><div class='add'>+        full_path = os.path.join(path, p)</div><div class='add'>+</div><div class='add'>+        is_dir = os.path.isdir(full_path)</div><div class='add'>+        if is_dir:</div><div class='add'>+            if subdirs_crawl:</div><div class='add'>+                find(full_path, callback_func, filter_func, ignore_dirs)</div><div class='add'>+            else:</div><div class='add'>+                filter_result = filter_func(full_path)</div><div class='add'>+                if filter_result is not None:</div><div class='add'>+                    callback_func(full_path, filter_result)</div><div class='add'>+        else:</div><div class='add'>+            filter_result = filter_func(full_path)</div><div class='add'>+            if filter_result is not None:</div><div class='add'>+                callback_func(full_path, filter_result, is_dir)</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def output_write(f, path, prefix=".", encode=False, tag="",</div><div class='add'>+                 field_separator=" "):</div><div class='add'>+    if path == "":</div><div class='add'>+        return</div><div class='add'>+</div><div class='add'>+    if prefix != ".":</div><div class='add'>+        path = os.path.join(prefix, path)</div><div class='add'>+</div><div class='add'>+    if encode:</div><div class='add'>+        path = quote_plus_space_newline(path)</div><div class='add'>+</div><div class='add'>+    # set the field separator</div><div class='add'>+    FS = "" if tag == "" else field_separator</div><div class='add'>+</div><div class='add'>+    f.write("%s%s%s\n" % (tag.strip(), FS, path))</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def human_time(ts):</div><div class='add'>+    return datetime.fromtimestamp(float(ts)).strftime("%Y-%m-%d %H:%M:%S")</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def setup_logger(logger, path, debug=False):</div><div class='add'>+    if debug:</div><div class='add'>+        logger.setLevel(logging.DEBUG)</div><div class='add'>+    else:</div><div class='add'>+        logger.setLevel(logging.INFO)</div><div class='add'>+</div><div class='add'>+    # create the logging file handler</div><div class='add'>+    fh = logging.FileHandler(path)</div><div class='add'>+</div><div class='add'>+    formatter = logging.Formatter("[%(asctime)s] %(levelname)s "</div><div class='add'>+                                  "[%(module)s - %(lineno)s:%(funcName)s] "</div><div class='add'>+                                  "- %(message)s")</div><div class='add'>+</div><div class='add'>+    fh.setFormatter(formatter)</div><div class='add'>+</div><div class='add'>+    # add handler to logger object</div><div class='add'>+    logger.addHandler(fh)</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def create_file(path, exit_on_err=False, logger=None):</div><div class='add'>+    """</div><div class='add'>+    If file exists overwrite. Print error to stderr and exit</div><div class='add'>+    if exit_on_err is set, else raise the exception. Consumer</div><div class='add'>+    should handle the exception.</div><div class='add'>+    """</div><div class='add'>+    try:</div><div class='add'>+        open(path, 'w').close()</div><div class='add'>+    except (OSError, IOError) as e:</div><div class='add'>+        if exit_on_err:</div><div class='add'>+            fail("Failed to create file %s: %s" % (path, e), logger=logger)</div><div class='add'>+        else:</div><div class='add'>+            raise</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def mkdirp(path, exit_on_err=False, logger=None):</div><div class='add'>+    """</div><div class='add'>+    Try creating required directory structure</div><div class='add'>+    ignore EEXIST and raise exception for rest of the errors.</div><div class='add'>+    Print error in stderr and exit if exit_on_err is set, else</div><div class='add'>+    raise exception.</div><div class='add'>+    """</div><div class='add'>+    try:</div><div class='add'>+        os.makedirs(path)</div><div class='add'>+    except (OSError, IOError) as e:</div><div class='add'>+        if e.errno == EEXIST and os.path.isdir(path):</div><div class='add'>+            pass</div><div class='add'>+        else:</div><div class='add'>+            if exit_on_err:</div><div class='add'>+                fail("Fail to create dir %s: %s" % (path, e), logger=logger)</div><div class='add'>+            else:</div><div class='add'>+                raise</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def fail(msg, code=1, logger=None):</div><div class='add'>+    """</div><div class='add'>+    Write error to stderr and exit</div><div class='add'>+    """</div><div class='add'>+    if logger:</div><div class='add'>+        logger.error(msg)</div><div class='add'>+    sys.stderr.write("%s\n" % msg)</div><div class='add'>+    sys.exit(code)</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def execute(cmd, exit_msg=None, logger=None):</div><div class='add'>+    """</div><div class='add'>+    If failure_msg is not None then return returncode, out and error.</div><div class='add'>+    If failure msg is set, write to stderr and exit.</div><div class='add'>+    """</div><div class='add'>+    p = Popen(cmd, stdin=PIPE, stdout=PIPE, stderr=PIPE, close_fds=True)</div><div class='add'>+</div><div class='add'>+    (out, err) = p.communicate()</div><div class='add'>+    if p.returncode != 0 and exit_msg is not None:</div><div class='add'>+        fail("%s: %s" % (exit_msg, err), p.returncode, logger=logger)</div><div class='add'>+</div><div class='add'>+    return (p.returncode, out, err)</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def symlink_gfid_to_path(brick, gfid):</div><div class='add'>+    """</div><div class='add'>+    Each directories are symlinked to file named GFID</div><div class='add'>+    in .glusterfs directory of brick backend. Using readlink</div><div class='add'>+    we get PARGFID/basename of dir. readlink recursively till</div><div class='add'>+    we get PARGFID as ROOT_GFID.</div><div class='add'>+    """</div><div class='add'>+    if gfid == ROOT_GFID:</div><div class='add'>+        return ""</div><div class='add'>+</div><div class='add'>+    out_path = ""</div><div class='add'>+    while True:</div><div class='add'>+        path = os.path.join(brick, ".glusterfs", gfid[0:2], gfid[2:4], gfid)</div><div class='add'>+        path_readlink = os.readlink(path)</div><div class='add'>+        pgfid = os.path.dirname(path_readlink)</div><div class='add'>+        out_path = os.path.join(os.path.basename(path_readlink), out_path)</div><div class='add'>+        if pgfid == "../../00/00/%s" % ROOT_GFID:</div><div class='add'>+            break</div><div class='add'>+        gfid = os.path.basename(pgfid)</div><div class='add'>+    return out_path</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+@cache_output</div><div class='add'>+def get_my_uuid():</div><div class='add'>+    cmd = ["gluster", "system::", "uuid", "get", "--xml"]</div><div class='add'>+    rc, out, err = execute(cmd)</div><div class='add'>+</div><div class='add'>+    if rc != 0:</div><div class='add'>+        return None</div><div class='add'>+</div><div class='add'>+    tree = etree.fromstring(out)</div><div class='add'>+    uuid_el = tree.find("uuidGenerate/uuid")</div><div class='add'>+    return uuid_el.text</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def is_host_local(host_uuid):</div><div class='add'>+    # Get UUID only if it is not done previously</div><div class='add'>+    # else Cache the UUID value</div><div class='add'>+    my_uuid = get_my_uuid()</div><div class='add'>+    if my_uuid == host_uuid:</div><div class='add'>+        return True</div><div class='add'>+</div><div class='add'>+    return False</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def get_changelog_rollover_time(volumename):</div><div class='add'>+    cmd = ["gluster", "volume", "get", volumename,</div><div class='add'>+           "changelog.rollover-time", "--xml"]</div><div class='add'>+    rc, out, err = execute(cmd)</div><div class='add'>+</div><div class='add'>+    if rc != 0:</div><div class='add'>+        return DEFAULT_CHANGELOG_INTERVAL</div><div class='add'>+</div><div class='add'>+    try:</div><div class='add'>+        tree = etree.fromstring(out)</div><div class='add'>+        val = tree.find('volGetopts/Opt/Value').text</div><div class='add'>+        if val is not None:</div><div class='add'>+            # Filter the value by split, as it may be 'X (DEFAULT)'</div><div class='add'>+            # and we only need 'X'</div><div class='add'>+            return int(val.split(' ', 1)[0])</div><div class='add'>+    except ParseError:</div><div class='add'>+        return DEFAULT_CHANGELOG_INTERVAL</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def output_path_prepare(path, args):</div><div class='add'>+    """</div><div class='add'>+    If Prefix is set, joins to Path, removes ending slash</div><div class='add'>+    and encodes it.</div><div class='add'>+    """</div><div class='add'>+    if args.output_prefix != ".":</div><div class='add'>+        path = os.path.join(args.output_prefix, path)</div><div class='add'>+        if path.endswith("/"):</div><div class='add'>+            path = path[0:len(path)-1]</div><div class='add'>+</div><div class='add'>+    if args.no_encode:</div><div class='add'>+        return path</div><div class='add'>+    else:</div><div class='add'>+        return quote_plus_space_newline(path)</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def unquote_plus_space_newline(s):</div><div class='add'>+    return s.replace(SPACE_ESCAPE_CHAR, " ")\</div><div class='add'>+            .replace(NEWLINE_ESCAPE_CHAR, "\n")\</div><div class='add'>+            .replace(PERCENTAGE_ESCAPE_CHAR, "%")</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+def quote_plus_space_newline(s):</div><div class='add'>+    return s.replace("%", PERCENTAGE_ESCAPE_CHAR)\</div><div class='add'>+            .replace(" ", SPACE_ESCAPE_CHAR)\</div><div class='add'>+            .replace("\n", NEWLINE_ESCAPE_CHAR)</div><div class='head'>diff --git a/tools/setgfid2path/Makefile.am b/tools/setgfid2path/Makefile.am<br/>new file mode 100644<br/>index 00000000000..c14787a80ce<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tools/setgfid2path/Makefile.am?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tools/setgfid2path/Makefile.am</a></div><div class='hunk'>@@ -0,0 +1,5 @@</div><div class='add'>+SUBDIRS = src</div><div class='add'>+</div><div class='add'>+EXTRA_DIST = gluster-setgfid2path.8</div><div class='add'>+</div><div class='add'>+man8_MANS = gluster-setgfid2path.8</div><div class='head'>diff --git a/tools/setgfid2path/gluster-setgfid2path.8 b/tools/setgfid2path/gluster-setgfid2path.8<br/>new file mode 100644<br/>index 00000000000..2e228ca8514<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tools/setgfid2path/gluster-setgfid2path.8?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tools/setgfid2path/gluster-setgfid2path.8</a></div><div class='hunk'>@@ -0,0 +1,54 @@</div><div class='add'>+</div><div class='add'>+.\"  Copyright (c) 2017 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+.\"  This file is part of GlusterFS.</div><div class='add'>+.\"</div><div class='add'>+.\"  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+.\"  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+.\"  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+.\"  cases as published by the Free Software Foundation.</div><div class='add'>+.\"</div><div class='add'>+.\"</div><div class='add'>+.TH gluster-setgfid2path 8 "Command line utility to set GFID to Path Xattrs"</div><div class='add'>+.SH NAME</div><div class='add'>+gluster-setgfid2path - Gluster tool to set GFID to Path xattrs</div><div class='add'>+.SH SYNOPSIS</div><div class='add'>+.B gluster-setgfid2path</div><div class='add'>+.IR file</div><div class='add'>+.SH DESCRIPTION</div><div class='add'>+New feature introduced with Gluster release 3.12, to find full path from GFID.</div><div class='add'>+This feature can be enabled using Volume set command \fBgluster volume set</div><div class='add'>+&lt;VOLUME&gt; storage.gfid2path enable\fR</div><div class='add'>+.PP</div><div class='add'>+Once \fBgfid2path\fR feature is enabled, it starts recording the necessary</div><div class='add'>+xattrs required for the feature. But it will not add xattrs for the already</div><div class='add'>+existing files. This tool provides facility to update the gfid2path xattrs for</div><div class='add'>+the given file path.</div><div class='add'>+</div><div class='add'>+.SH EXAMPLES</div><div class='add'>+To add xattrs of a single file,</div><div class='add'>+.PP</div><div class='add'>+.nf</div><div class='add'>+.RS</div><div class='add'>+gluster-setgfid2path /bricks/b1/hello.txt</div><div class='add'>+.RE</div><div class='add'>+.fi</div><div class='add'>+.PP</div><div class='add'>+To set xattr for all the existing files, run the below script on each bricks.</div><div class='add'>+.PP</div><div class='add'>+.nf</div><div class='add'>+.RS</div><div class='add'>+BRICK=/bricks/b1</div><div class='add'>+find $BRICK -type d \\( -path "${BRICK}/.trashcan" -o -path \\</div><div class='add'>+    "${BRICK}/.glusterfs" \\) -prune -o -type f \\</div><div class='add'>+    -exec gluster-setgfid2path {} \\;</div><div class='add'>+.RE</div><div class='add'>+.fi</div><div class='add'>+.PP</div><div class='add'>+.SH SEE ALSO</div><div class='add'>+.nf</div><div class='add'>+\fBgluster\fR(8)</div><div class='add'>+\fR</div><div class='add'>+.fi</div><div class='add'>+.SH COPYRIGHT</div><div class='add'>+.nf</div><div class='add'>+Copyright(c) 2017   Red Hat, Inc.   &lt;http://www.redhat.com&gt;</div><div class='head'>diff --git a/tools/setgfid2path/src/Makefile.am b/tools/setgfid2path/src/Makefile.am<br/>new file mode 100644<br/>index 00000000000..7316d117070<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tools/setgfid2path/src/Makefile.am?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tools/setgfid2path/src/Makefile.am</a></div><div class='hunk'>@@ -0,0 +1,16 @@</div><div class='add'>+gluster_setgfid2pathdir = $(sbindir)</div><div class='add'>+</div><div class='add'>+if WITH_SERVER</div><div class='add'>+gluster_setgfid2path_PROGRAMS = gluster-setgfid2path</div><div class='add'>+endif</div><div class='add'>+</div><div class='add'>+gluster_setgfid2path_SOURCES = main.c</div><div class='add'>+</div><div class='add'>+gluster_setgfid2path_LDADD = $(top_builddir)/libglusterfs/src/libglusterfs.la</div><div class='add'>+</div><div class='add'>+gluster_setgfid2path_LDFLAGS = $(GF_LDFLAGS)</div><div class='add'>+</div><div class='add'>+AM_CPPFLAGS = $(GF_CPPFLAGS) -I$(top_srcdir)/libglusterfs/src \</div><div class='add'>+	-I$(top_builddir)/rpc/xdr/src</div><div class='add'>+</div><div class='add'>+AM_CFLAGS = -Wall $(GF_CFLAGS)</div><div class='head'>diff --git a/tools/setgfid2path/src/main.c b/tools/setgfid2path/src/main.c<br/>new file mode 100644<br/>index 00000000000..4320a7b2481<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/tools/setgfid2path/src/main.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>tools/setgfid2path/src/main.c</a></div><div class='hunk'>@@ -0,0 +1,130 @@</div><div class='add'>+/*</div><div class='add'>+   Copyright (c) 2017 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+   This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+   This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+   General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+   later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+   cases as published by the Free Software Foundation.</div><div class='add'>+   */</div><div class='add'>+#include &lt;stdio.h&gt;</div><div class='add'>+#include &lt;libgen.h&gt;</div><div class='add'>+</div><div class='add'>+#include &lt;glusterfs/common-utils.h&gt;</div><div class='add'>+#include &lt;glusterfs/syscall.h&gt;</div><div class='add'>+</div><div class='add'>+#define MAX_GFID2PATH_LINK_SUP 500</div><div class='add'>+#define GFID_SIZE 16</div><div class='add'>+#define GFID_XATTR_KEY "trusted.gfid"</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+main(int argc, char **argv)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+    struct stat st;</div><div class='add'>+    char *dname = NULL;</div><div class='add'>+    char *bname = NULL;</div><div class='add'>+    ssize_t ret_size = 0;</div><div class='add'>+    uuid_t pgfid_raw = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    char pgfid[36 + 1] = "";</div><div class='add'>+    char xxh64[GF_XXH64_DIGEST_LENGTH * 2 + 1] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    char pgfid_bname[1024] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    char *key = NULL;</div><div class='add'>+    char *val = NULL;</div><div class='add'>+    size_t key_size = 0;</div><div class='add'>+    size_t val_size = 0;</div><div class='add'>+    const char *file_path = NULL;</div><div class='add'>+    char *file_path1 = NULL;</div><div class='add'>+    char *file_path2 = NULL;</div><div class='add'>+</div><div class='add'>+    if (argc != 2) {</div><div class='add'>+        fprintf(stderr, "Usage: setgfid2path &lt;file-path&gt;\n");</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = sys_lstat(argv[1], &amp;st);</div><div class='add'>+    if (ret != 0) {</div><div class='add'>+        fprintf(stderr, "Invalid File Path\n");</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (st.st_nlink &gt;= MAX_GFID2PATH_LINK_SUP) {</div><div class='add'>+        fprintf(stderr,</div><div class='add'>+                "Number of Hardlink support exceeded. "</div><div class='add'>+                "max=%d\n",</div><div class='add'>+                MAX_GFID2PATH_LINK_SUP);</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    file_path = argv[1];</div><div class='add'>+    file_path1 = strdup(file_path);</div><div class='add'>+    file_path2 = strdup(file_path);</div><div class='add'>+</div><div class='add'>+    dname = dirname(file_path1);</div><div class='add'>+    bname = basename(file_path2);</div><div class='add'>+</div><div class='add'>+    /* Get GFID of Parent directory */</div><div class='add'>+    ret_size = sys_lgetxattr(dname, GFID_XATTR_KEY, pgfid_raw, GFID_SIZE);</div><div class='add'>+    if (ret_size != GFID_SIZE) {</div><div class='add'>+        fprintf(stderr, "Failed to get GFID of parent directory. dir=%s\n",</div><div class='add'>+                dname);</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Convert to UUID format */</div><div class='add'>+    if (uuid_utoa_r(pgfid_raw, pgfid) == NULL) {</div><div class='add'>+        fprintf(stderr,</div><div class='add'>+                "Failed to format GFID of parent directory. "</div><div class='add'>+                "dir=%s GFID=%s\n",</div><div class='add'>+                dname, pgfid_raw);</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Find xxhash for PGFID/BaseName */</div><div class='add'>+    snprintf(pgfid_bname, sizeof(pgfid_bname), "%s/%s", pgfid, bname);</div><div class='add'>+    gf_xxh64_wrapper((unsigned char *)pgfid_bname, strlen(pgfid_bname),</div><div class='add'>+                     GF_XXHSUM64_DEFAULT_SEED, xxh64);</div><div class='add'>+</div><div class='add'>+    key_size = SLEN(GFID2PATH_XATTR_KEY_PREFIX) + GF_XXH64_DIGEST_LENGTH * 2 +</div><div class='add'>+               1;</div><div class='add'>+    key = alloca(key_size);</div><div class='add'>+    snprintf(key, key_size, GFID2PATH_XATTR_KEY_PREFIX "%s", xxh64);</div><div class='add'>+</div><div class='add'>+    val_size = UUID_CANONICAL_FORM_LEN + NAME_MAX + 2;</div><div class='add'>+    val = alloca(val_size);</div><div class='add'>+    snprintf(val, val_size, "%s/%s", pgfid, bname);</div><div class='add'>+</div><div class='add'>+    /* Set the Xattr, ignore if same key xattr already exists */</div><div class='add'>+    ret = sys_lsetxattr(file_path, key, val, strlen(val), XATTR_CREATE);</div><div class='add'>+    if (ret == -1) {</div><div class='add'>+        if (errno == EEXIST) {</div><div class='add'>+            printf("Xattr already exists, ignoring..\n");</div><div class='add'>+            ret = 0;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        fprintf(stderr, "Failed to set gfid2path xattr. errno=%d\n error=%s",</div><div class='add'>+                errno, strerror(errno));</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    printf("Success. file=%s key=%s value=%s\n", file_path, key, val);</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (file_path1 != NULL)</div><div class='add'>+        free(file_path1);</div><div class='add'>+</div><div class='add'>+    if (file_path2 != NULL)</div><div class='add'>+        free(file_path2);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='head'>diff --git a/xlators/Makefile.am b/xlators/Makefile.am<br/>index 4c94f5e44c1..ef20cbb64fa 100644<br/>--- a/<a href='/cgit/glusterfs.git/tree/xlators/Makefile.am?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/Makefile.am</a><br/>+++ b/<a href='/cgit/glusterfs.git/tree/xlators/Makefile.am?id=d1d7a6f35c816822fab51c820e25023863c239c1'>xlators/Makefile.am</a></div><div class='hunk'>@@ -1,3 +1,13 @@</div><div class='del'>-SUBDIRS = cluster storage protocol performance debug features encryption mount nfs mgmt</div><div class='add'>+if BUILD_GNFS</div><div class='add'>+  GNFS_DIR = nfs</div><div class='add'>+endif</div><div class='add'>+</div><div class='add'>+DIST_SUBDIRS = cluster storage protocol performance debug features \</div><div class='add'>+          mount nfs mgmt system playground meta</div><div class='add'>+</div><div class='add'>+SUBDIRS = cluster storage protocol performance debug features \</div><div class='add'>+          mount ${GNFS_DIR} mgmt system playground meta</div><div class='add'>+</div><div class='add'>+EXTRA_DIST = xlator.sym</div><div class='ctx'> </div><div class='ctx'> CLEANFILES =</div><div class='head'>diff --git a/xlators/bindings/Makefile.am b/xlators/bindings/Makefile.am<br/>deleted file mode 100644<br/>index f7766580257..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/xlators/bindings/Makefile.am?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/bindings/Makefile.am</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1 +0,0 @@</div><div class='del'>-SUBDIRS = $(BINDINGS_SUBDIRS)</div><div class='head'>diff --git a/xlators/bindings/python/src/Makefile.am b/xlators/bindings/python/src/Makefile.am<br/>deleted file mode 100644<br/>index c0b9141c667..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/xlators/bindings/python/src/Makefile.am?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/bindings/python/src/Makefile.am</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,19 +0,0 @@</div><div class='del'>-</div><div class='del'>-xlator_PROGRAMS = python.so</div><div class='del'>-</div><div class='del'>-xlatordir = $(libdir)/glusterfs/$(PACKAGE_VERSION)/xlator/bindings</div><div class='del'>-</div><div class='del'>-python_PYTHON = gluster.py glustertypes.py glusterstack.py</div><div class='del'>-</div><div class='del'>-pythondir = $(xlatordir)/python</div><div class='del'>-</div><div class='del'>-python_so_SOURCES = python.c</div><div class='del'>-</div><div class='del'>-AM_CFLAGS = -fPIC -D_FILE_OFFSET_BITS=64 -D_GNU_SOURCE -Wall \</div><div class='del'>-	-I$(top_srcdir)/libglusterfs/src -shared -nostartfiles \</div><div class='del'>-	$(PYTHON_CPPLAGS) -DGLUSTER_PYTHON_PATH=\"$(pythondir)\"</div><div class='del'>-</div><div class='del'>-AM_LDFLAGS = $(PYTHON_LDFLAGS)</div><div class='del'>-</div><div class='del'>-CLEANFILES = </div><div class='del'>-</div><div class='head'>diff --git a/xlators/bindings/python/src/gluster.py b/xlators/bindings/python/src/gluster.py<br/>deleted file mode 100644<br/>index ee0eb131011..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/xlators/bindings/python/src/gluster.py?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/bindings/python/src/gluster.py</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,47 +0,0 @@</div><div class='del'>-#   Copyright (c) 2007 Chris AtLee &lt;chris@atlee.ca&gt;</div><div class='del'>-#   This file is part of GlusterFS.</div><div class='del'>-#</div><div class='del'>-#   GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-#   it under the terms of the GNU General Public License as published</div><div class='del'>-#   by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-#   or (at your option) any later version.</div><div class='del'>-#</div><div class='del'>-#   GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-#   WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-#   General Public License for more details.</div><div class='del'>-#</div><div class='del'>-#   You should have received a copy of the GNU General Public License</div><div class='del'>-#   along with this program.  If not, see</div><div class='del'>-#   &lt;http://www.gnu.org/licenses/&gt;.</div><div class='del'>-from ctypes import *</div><div class='del'>-from glustertypes import *</div><div class='del'>-from glusterstack import *</div><div class='del'>-import sys</div><div class='del'>-import inspect</div><div class='del'>-</div><div class='del'>-libglusterfs = CDLL("libglusterfs.so")</div><div class='del'>-_gf_log = libglusterfs._gf_log</div><div class='del'>-_gf_log.restype = c_int32</div><div class='del'>-_gf_log.argtypes = [c_char_p, c_char_p, c_char_p, c_int32, c_int, c_char_p]</div><div class='del'>-</div><div class='del'>-gf_log_loglevel = c_int.in_dll(libglusterfs, "gf_log_loglevel")</div><div class='del'>-</div><div class='del'>-GF_LOG_NONE = 0</div><div class='del'>-GF_LOG_CRITICAL = 1</div><div class='del'>-GF_LOG_ERROR = 2</div><div class='del'>-GF_LOG_WARNING = 3</div><div class='del'>-GF_LOG_DEBUG = 4</div><div class='del'>-</div><div class='del'>-def gf_log(module, level, fmt, *params):</div><div class='del'>-    if level &lt;= gf_log_loglevel:</div><div class='del'>-        frame = sys._getframe(1)</div><div class='del'>-        _gf_log(module, frame.f_code.co_filename, frame.f_code.co_name,</div><div class='del'>-                frame.f_lineno, level, fmt, *params)</div><div class='del'>-</div><div class='del'>-class ComplexTranslator(object):</div><div class='del'>-    def __init__(self, xlator):</div><div class='del'>-        self.xlator = xlator_t.from_address(xlator)</div><div class='del'>-</div><div class='del'>-    def __getattr__(self, item):</div><div class='del'>-        return getattr(self.xlator, item)</div><div class='head'>diff --git a/xlators/bindings/python/src/glusterstack.py b/xlators/bindings/python/src/glusterstack.py<br/>deleted file mode 100644<br/>index ba24c81652e..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/xlators/bindings/python/src/glusterstack.py?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/bindings/python/src/glusterstack.py</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,55 +0,0 @@</div><div class='del'>-#   Copyright (c) 2007 Chris AtLee &lt;chris@atlee.ca&gt;</div><div class='del'>-#   This file is part of GlusterFS.</div><div class='del'>-#</div><div class='del'>-#   GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-#   it under the terms of the GNU General Public License as published</div><div class='del'>-#   by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-#   or (at your option) any later version.</div><div class='del'>-#</div><div class='del'>-#   GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-#   WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-#   General Public License for more details.</div><div class='del'>-#</div><div class='del'>-#   You should have received a copy of the GNU General Public License</div><div class='del'>-#   along with this program.  If not, see</div><div class='del'>-#   &lt;http://www.gnu.org/licenses/&gt;.</div><div class='del'>-from ctypes import *</div><div class='del'>-from glustertypes import *</div><div class='del'>-</div><div class='del'>-libc = CDLL("libc.so.6")</div><div class='del'>-calloc = libc.calloc</div><div class='del'>-calloc.argtypes = [c_int, c_int]</div><div class='del'>-calloc.restype = c_void_p</div><div class='del'>-</div><div class='del'>-# TODO: Can these be done in C somehow?</div><div class='del'>-def stack_wind(frame, rfn, obj, fn, *params):</div><div class='del'>-    """Frame is a frame object"""</div><div class='del'>-    _new = cast(calloc(1, sizeof(call_frame_t)), POINTER(call_frame_t))</div><div class='del'>-    _new[0].root = frame.root</div><div class='del'>-    _new[0].next = frame.root[0].frames.next</div><div class='del'>-    _new[0].prev = pointer(frame.root[0].frames)</div><div class='del'>-    if frame.root[0].frames.next:</div><div class='del'>-        frame.root[0].frames.next[0].prev = _new</div><div class='del'>-    frame.root[0].frames.next = _new</div><div class='del'>-    _new[0].this = obj</div><div class='del'>-    # TODO: Type checking like tmp_cbk?</div><div class='del'>-    _new[0].ret = rfn</div><div class='del'>-    _new[0].parent = pointer(frame)</div><div class='del'>-    _new[0].cookie = cast(_new, c_void_p)</div><div class='del'>-    # TODO: Initialize lock</div><div class='del'>-    #_new.lock.init()</div><div class='del'>-    frame.ref_count += 1</div><div class='del'>-    fn(_new, obj, *params)</div><div class='del'>-</div><div class='del'>-def stack_unwind(frame, *params):</div><div class='del'>-    """Frame is a frame object"""</div><div class='del'>-    fn = frame[0].ret</div><div class='del'>-    parent = frame[0].parent[0]</div><div class='del'>-    parent.ref_count -= 1</div><div class='del'>-</div><div class='del'>-    op_ret = params[0]</div><div class='del'>-    op_err = params[1]</div><div class='del'>-    params = params[2:]</div><div class='del'>-    fn(parent, call_frame_t.from_address(frame[0].cookie), parent.this,</div><div class='del'>-            op_ret, op_err, *params)</div><div class='head'>diff --git a/xlators/bindings/python/src/glustertypes.py b/xlators/bindings/python/src/glustertypes.py<br/>deleted file mode 100644<br/>index e9069d07c72..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/xlators/bindings/python/src/glustertypes.py?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/bindings/python/src/glustertypes.py</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,167 +0,0 @@</div><div class='del'>-#   Copyright (c) 2007 Chris AtLee &lt;chris@atlee.ca&gt;</div><div class='del'>-#   This file is part of GlusterFS.</div><div class='del'>-#</div><div class='del'>-#   GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-#   it under the terms of the GNU General Public License as published</div><div class='del'>-#   by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-#   or (at your option) any later version.</div><div class='del'>-#</div><div class='del'>-#   GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-#   WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-#   General Public License for more details.</div><div class='del'>-#</div><div class='del'>-#   You should have received a copy of the GNU General Public License</div><div class='del'>-#   along with this program.  If not, see</div><div class='del'>-#   &lt;http://www.gnu.org/licenses/&gt;.</div><div class='del'>-from ctypes import *</div><div class='del'>-import collections</div><div class='del'>-</div><div class='del'>-#</div><div class='del'>-# Forward declaration of some gluster types</div><div class='del'>-#</div><div class='del'>-class call_frame_t(Structure):</div><div class='del'>-    pass</div><div class='del'>-</div><div class='del'>-class call_ctx_t(Structure):</div><div class='del'>-    pass</div><div class='del'>-</div><div class='del'>-class call_pool_t(Structure):</div><div class='del'>-    pass</div><div class='del'>-</div><div class='del'>-class xlator_t(Structure):</div><div class='del'>-    def _getFirstChild(self):</div><div class='del'>-        return self.children[0].xlator</div><div class='del'>-    firstChild = property(_getFirstChild)</div><div class='del'>-</div><div class='del'>-class xlator_list_t(Structure):</div><div class='del'>-    pass</div><div class='del'>-</div><div class='del'>-class xlator_fops(Structure):</div><div class='del'>-    pass</div><div class='del'>-</div><div class='del'>-class xlator_mops(Structure):</div><div class='del'>-    pass</div><div class='del'>-</div><div class='del'>-class glusterfs_ctx_t(Structure):</div><div class='del'>-    pass</div><div class='del'>-</div><div class='del'>-class list_head(Structure):</div><div class='del'>-    pass</div><div class='del'>-</div><div class='del'>-class dict_t(Structure):</div><div class='del'>-    pass</div><div class='del'>-</div><div class='del'>-class inode_table_t(Structure):</div><div class='del'>-    pass</div><div class='del'>-</div><div class='del'>-class fd_t(Structure):</div><div class='del'>-    pass</div><div class='del'>-</div><div class='del'>-class iovec(Structure):</div><div class='del'>-    _fields_ = [</div><div class='del'>-            ("iov_base", c_void_p),</div><div class='del'>-            ("iov_len", c_size_t),</div><div class='del'>-            ]</div><div class='del'>-</div><div class='del'>-    def __init__(self, s):</div><div class='del'>-        self.iov_base = cast(c_char_p(s), c_void_p)</div><div class='del'>-        self.iov_len = len(s)</div><div class='del'>-</div><div class='del'>-    def getBytes(self):</div><div class='del'>-        return string_at(self.iov_base, self.iov_len)</div><div class='del'>-</div><div class='del'>-# This is a pthread_spinlock_t</div><div class='del'>-# TODO: what happens to volatile-ness?</div><div class='del'>-gf_lock_t = c_int</div><div class='del'>-</div><div class='del'>-uid_t = c_uint32</div><div class='del'>-gid_t = c_uint32</div><div class='del'>-pid_t = c_int32</div><div class='del'>-</div><div class='del'>-off_t = c_int64</div><div class='del'>-</div><div class='del'>-#</div><div class='del'>-# Function pointer types</div><div class='del'>-#</div><div class='del'>-ret_fn_t = CFUNCTYPE(c_int32, POINTER(call_frame_t), POINTER(call_frame_t),</div><div class='del'>-                              POINTER(xlator_t), c_int32, c_int32)</div><div class='del'>-</div><div class='del'>-fini_fn_t = CFUNCTYPE(None, POINTER(xlator_t))</div><div class='del'>-init_fn_t = CFUNCTYPE(c_int32, POINTER(xlator_t))</div><div class='del'>-event_notify_fn_t = CFUNCTYPE(c_int32, POINTER(xlator_t), c_int32, c_void_p)</div><div class='del'>-</div><div class='del'>-list_head._fields_ = [</div><div class='del'>-        ("next", POINTER(list_head)),</div><div class='del'>-        ("prev", POINTER(list_head)),</div><div class='del'>-        ]</div><div class='del'>-</div><div class='del'>-call_frame_t._fields_ = [</div><div class='del'>-        ("root", POINTER(call_ctx_t)),</div><div class='del'>-        ("parent", POINTER(call_frame_t)),</div><div class='del'>-        ("next", POINTER(call_frame_t)),</div><div class='del'>-        ("prev", POINTER(call_frame_t)),</div><div class='del'>-        ("local", c_void_p),</div><div class='del'>-        ("this", POINTER(xlator_t)),</div><div class='del'>-        ("ret", ret_fn_t),</div><div class='del'>-        ("ref_count", c_int32),</div><div class='del'>-        ("lock", gf_lock_t),</div><div class='del'>-        ("cookie", c_void_p),</div><div class='del'>-        ("op", c_int32),</div><div class='del'>-        ("type", c_int8),</div><div class='del'>-        ]</div><div class='del'>-</div><div class='del'>-call_ctx_t._fields_ = [</div><div class='del'>-        ("all_frames", list_head),</div><div class='del'>-        ("trans", c_void_p),</div><div class='del'>-        ("pool", call_pool_t),</div><div class='del'>-        ("unique", c_uint64),</div><div class='del'>-        ("state", c_void_p),</div><div class='del'>-        ("uid", uid_t),</div><div class='del'>-        ("gid", gid_t),</div><div class='del'>-        ("pid", pid_t),</div><div class='del'>-        ("frames", call_frame_t),</div><div class='del'>-        ("req_refs", POINTER(dict_t)),</div><div class='del'>-        ("rsp_refs", POINTER(dict_t)),</div><div class='del'>-        ]</div><div class='del'>-</div><div class='del'>-xlator_t._fields_ = [</div><div class='del'>-        ("name", c_char_p),</div><div class='del'>-        ("type", c_char_p),</div><div class='del'>-        ("next", POINTER(xlator_t)),</div><div class='del'>-        ("prev", POINTER(xlator_t)),</div><div class='del'>-        ("parent", POINTER(xlator_t)),</div><div class='del'>-        ("children", POINTER(xlator_list_t)),</div><div class='del'>-        ("fops", POINTER(xlator_fops)),</div><div class='del'>-        ("mops", POINTER(xlator_mops)),</div><div class='del'>-        ("fini", fini_fn_t),</div><div class='del'>-        ("init", init_fn_t),</div><div class='del'>-        ("notify", event_notify_fn_t),</div><div class='del'>-        ("options", POINTER(dict_t)),</div><div class='del'>-        ("ctx", POINTER(glusterfs_ctx_t)),</div><div class='del'>-        ("itable", POINTER(inode_table_t)),</div><div class='del'>-        ("ready", c_char),</div><div class='del'>-        ("private", c_void_p),</div><div class='del'>-        ]</div><div class='del'>-</div><div class='del'>-xlator_list_t._fields_ = [</div><div class='del'>-        ("xlator", POINTER(xlator_t)),</div><div class='del'>-        ("next", POINTER(xlator_list_t)),</div><div class='del'>-        ]</div><div class='del'>-</div><div class='del'>-fop_functions = collections.defaultdict(lambda: c_void_p)</div><div class='del'>-fop_function_names = ['lookup', 'forget', 'stat', 'fstat', 'chmod', 'fchmod',</div><div class='del'>-        'chown', 'fchown', 'truncate', 'ftruncate', 'utimens', 'access',</div><div class='del'>-        'readlink', 'mknod', 'mkdir', 'unlink', 'rmdir', 'symlink',</div><div class='del'>-        'rename', 'link', 'create', 'open', 'readv', 'writev', 'flush',</div><div class='del'>-        'close', 'fsync', 'opendir', 'readdir', 'closedir', 'fsyncdir',</div><div class='del'>-        'statfs', 'setxattr', 'getxattr', 'removexattr', 'lk', 'writedir',</div><div class='del'>-        # TODO: Call backs?</div><div class='del'>-        ]</div><div class='del'>-</div><div class='del'>-fop_writev_t = CFUNCTYPE(c_int32, POINTER(call_frame_t), POINTER(xlator_t),</div><div class='del'>-                                  POINTER(fd_t), POINTER(iovec), c_int32,</div><div class='del'>-                                  off_t)</div><div class='del'>-</div><div class='del'>-fop_functions['writev'] = fop_writev_t</div><div class='del'>-xlator_fops._fields_ = [(f, fop_functions[f]) for f in fop_function_names]</div><div class='head'>diff --git a/xlators/bindings/python/src/python.c b/xlators/bindings/python/src/python.c<br/>deleted file mode 100644<br/>index c11323cda4f..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/xlators/bindings/python/src/python.c?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/bindings/python/src/python.c</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,232 +0,0 @@</div><div class='del'>-/*</div><div class='del'>-   Copyright (c) 2007-2009 Chris AtLee &lt;chris@atlee.ca&gt;</div><div class='del'>-   This file is part of GlusterFS.</div><div class='del'>-</div><div class='del'>-   GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-   it under the terms of the GNU General Public License as published</div><div class='del'>-   by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-   or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-   GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-   WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-   General Public License for more details.</div><div class='del'>-</div><div class='del'>-   You should have received a copy of the GNU General Public License</div><div class='del'>-   along with this program.  If not, see</div><div class='del'>-   &lt;http://www.gnu.org/licenses/&gt;.</div><div class='del'>-*/</div><div class='del'>-</div><div class='del'>-#include &lt;Python.h&gt;</div><div class='del'>-</div><div class='del'>-#ifndef _CONFIG_H</div><div class='del'>-#define _CONFIG_H</div><div class='del'>-#include "config.h"</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-#include "glusterfs.h"</div><div class='del'>-#include "xlator.h"</div><div class='del'>-#include "logging.h"</div><div class='del'>-#include "defaults.h"</div><div class='del'>-</div><div class='del'>-typedef struct</div><div class='del'>-{</div><div class='del'>-    char        *scriptname;</div><div class='del'>-    PyObject    *pXlator;</div><div class='del'>-    PyObject    *pScriptModule;</div><div class='del'>-    PyObject    *pGlusterModule;</div><div class='del'>-    PyThreadState *pInterp;</div><div class='del'>-</div><div class='del'>-    PyObject    *pFrameType, *pVectorType, *pFdType;</div><div class='del'>-} python_private_t;</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-python_writev (call_frame_t *frame,</div><div class='del'>-              xlator_t *this,</div><div class='del'>-              fd_t *fd,</div><div class='del'>-              struct iovec *vector,</div><div class='del'>-              int32_t count, </div><div class='del'>-              off_t offset)</div><div class='del'>-{</div><div class='del'>-  python_private_t *priv = (python_private_t *)this-&gt;private;</div><div class='del'>-  gf_log("python", GF_LOG_DEBUG, "In writev");</div><div class='del'>-  if (PyObject_HasAttrString(priv-&gt;pXlator, "writev"))</div><div class='del'>-  {</div><div class='del'>-</div><div class='del'>-      PyObject *retval = PyObject_CallMethod(priv-&gt;pXlator, "writev",</div><div class='del'>-              "O O O i l",</div><div class='del'>-              PyObject_CallMethod(priv-&gt;pFrameType, "from_address", "O&amp;", PyLong_FromVoidPtr, frame),</div><div class='del'>-              PyObject_CallMethod(priv-&gt;pFdType, "from_address", "O&amp;", PyLong_FromVoidPtr, fd),</div><div class='del'>-              PyObject_CallMethod(priv-&gt;pVectorType, "from_address", "O&amp;", PyLong_FromVoidPtr, vector),</div><div class='del'>-              count,</div><div class='del'>-              offset);</div><div class='del'>-      if (PyErr_Occurred())</div><div class='del'>-      {</div><div class='del'>-          PyErr_Print();</div><div class='del'>-      }</div><div class='del'>-      Py_XDECREF(retval);</div><div class='del'>-  }</div><div class='del'>-  else</div><div class='del'>-  {</div><div class='del'>-      return default_writev(frame, this, fd, vector, count, offset);</div><div class='del'>-  }</div><div class='del'>-  return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-struct xlator_fops fops = {</div><div class='del'>-    .writev       = python_writev</div><div class='del'>-};</div><div class='del'>-</div><div class='del'>-static PyObject *</div><div class='del'>-AnonModule_FromFile (const char* fname)</div><div class='del'>-{</div><div class='del'>-    // Get the builtins</div><div class='del'>-    PyThreadState* pThread = PyThreadState_Get();</div><div class='del'>-    PyObject *pBuiltins = pThread-&gt;interp-&gt;builtins;</div><div class='del'>-</div><div class='del'>-    if (PyErr_Occurred())</div><div class='del'>-    {</div><div class='del'>-        PyErr_Print();</div><div class='del'>-        return NULL;</div><div class='del'>-    }</div><div class='del'>-</div><div class='del'>-    // Create a new dictionary for running code in</div><div class='del'>-    PyObject *pModuleDict = PyDict_New();</div><div class='del'>-    PyDict_SetItemString(pModuleDict, "__builtins__", pBuiltins);</div><div class='del'>-    Py_INCREF(pBuiltins);</div><div class='del'>-</div><div class='del'>-    // Run the file in the new context</div><div class='del'>-    FILE* fp = fopen(fname, "r");</div><div class='del'>-    PyRun_File(fp, fname, Py_file_input, pModuleDict, pModuleDict);</div><div class='del'>-    fclose(fp);</div><div class='del'>-    if (PyErr_Occurred())</div><div class='del'>-    {</div><div class='del'>-        PyErr_Print();</div><div class='del'>-        Py_DECREF(pModuleDict);</div><div class='del'>-        Py_DECREF(pBuiltins);</div><div class='del'>-        return NULL;</div><div class='del'>-    }</div><div class='del'>-</div><div class='del'>-    // Create an object to hold the new context</div><div class='del'>-    PyRun_String("class ModuleWrapper(object):\n\tpass\n", Py_single_input, pModuleDict, pModuleDict);</div><div class='del'>-    if (PyErr_Occurred())</div><div class='del'>-    {</div><div class='del'>-        PyErr_Print();</div><div class='del'>-        Py_DECREF(pModuleDict);</div><div class='del'>-        Py_DECREF(pBuiltins);</div><div class='del'>-        return NULL;</div><div class='del'>-    }</div><div class='del'>-    PyObject *pModule = PyRun_String("ModuleWrapper()", Py_eval_input, pModuleDict, pModuleDict);</div><div class='del'>-    if (PyErr_Occurred())</div><div class='del'>-    {</div><div class='del'>-        PyErr_Print();</div><div class='del'>-        Py_DECREF(pModuleDict);</div><div class='del'>-        Py_DECREF(pBuiltins);</div><div class='del'>-        Py_XDECREF(pModule);</div><div class='del'>-        return NULL;</div><div class='del'>-    }</div><div class='del'>-</div><div class='del'>-    // Set the new context's dictionary to the one we used to run the code</div><div class='del'>-    // inside</div><div class='del'>-    PyObject_SetAttrString(pModule, "__dict__", pModuleDict);</div><div class='del'>-    if (PyErr_Occurred())</div><div class='del'>-    {</div><div class='del'>-        PyErr_Print();</div><div class='del'>-        Py_DECREF(pModuleDict);</div><div class='del'>-        Py_DECREF(pBuiltins);</div><div class='del'>-        Py_DECREF(pModule);</div><div class='del'>-        return NULL;</div><div class='del'>-    }</div><div class='del'>-</div><div class='del'>-    return pModule;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-init (xlator_t *this)</div><div class='del'>-{</div><div class='del'>-  // This is ok to call more than once per process</div><div class='del'>-  Py_InitializeEx(0);</div><div class='del'>-</div><div class='del'>-  if (!this-&gt;children) {</div><div class='del'>-    gf_log ("python", GF_LOG_ERROR, </div><div class='del'>-            "FATAL: python should have exactly one child");</div><div class='del'>-    return -1;</div><div class='del'>-  }</div><div class='del'>-</div><div class='del'>-  python_private_t *priv = CALLOC (sizeof (python_private_t), 1);</div><div class='del'>-  ERR_ABORT (priv);</div><div class='del'>-</div><div class='del'>-  data_t *scriptname = dict_get (this-&gt;options, "scriptname");</div><div class='del'>-  if (scriptname) {</div><div class='del'>-      priv-&gt;scriptname = data_to_str(scriptname);</div><div class='del'>-  } else {</div><div class='del'>-      gf_log("python", GF_LOG_ERROR,</div><div class='del'>-              "FATAL: python requires the scriptname parameter");</div><div class='del'>-      return -1;</div><div class='del'>-  }</div><div class='del'>-</div><div class='del'>-  priv-&gt;pInterp = Py_NewInterpreter();</div><div class='del'>-    </div><div class='del'>-  // Adjust python's path</div><div class='del'>-  PyObject *syspath = PySys_GetObject("path");</div><div class='del'>-  PyObject *path = PyString_FromString(GLUSTER_PYTHON_PATH);</div><div class='del'>-  PyList_Append(syspath, path);</div><div class='del'>-  Py_DECREF(path);</div><div class='del'>-</div><div class='del'>-  gf_log("python", GF_LOG_DEBUG,</div><div class='del'>-          "Loading gluster module");</div><div class='del'>-</div><div class='del'>-  priv-&gt;pGlusterModule = PyImport_ImportModule("gluster");</div><div class='del'>-  if (PyErr_Occurred())</div><div class='del'>-  {</div><div class='del'>-      PyErr_Print();</div><div class='del'>-      return -1;</div><div class='del'>-  }</div><div class='del'>-</div><div class='del'>-  priv-&gt;pFrameType = PyObject_GetAttrString(priv-&gt;pGlusterModule, "call_frame_t");</div><div class='del'>-  priv-&gt;pFdType = PyObject_GetAttrString(priv-&gt;pGlusterModule, "fd_t");</div><div class='del'>-  priv-&gt;pVectorType = PyObject_GetAttrString(priv-&gt;pGlusterModule, "iovec");</div><div class='del'>-</div><div class='del'>-  gf_log("python", GF_LOG_DEBUG, "Loading script...%s", priv-&gt;scriptname);</div><div class='del'>-  </div><div class='del'>-  priv-&gt;pScriptModule = AnonModule_FromFile(priv-&gt;scriptname);</div><div class='del'>-  if (!priv-&gt;pScriptModule || PyErr_Occurred())</div><div class='del'>-  {</div><div class='del'>-      gf_log("python", GF_LOG_ERROR, "Error loading %s", priv-&gt;scriptname);</div><div class='del'>-      PyErr_Print();</div><div class='del'>-      return -1;</div><div class='del'>-  }</div><div class='del'>-</div><div class='del'>-  if (!PyObject_HasAttrString(priv-&gt;pScriptModule, "xlator"))</div><div class='del'>-  {</div><div class='del'>-      gf_log("python", GF_LOG_ERROR, "%s does not have a xlator attribute", priv-&gt;scriptname);</div><div class='del'>-      return -1;</div><div class='del'>-  }</div><div class='del'>-  gf_log("python", GF_LOG_DEBUG, "Instantiating translator");</div><div class='del'>-  priv-&gt;pXlator = PyObject_CallMethod(priv-&gt;pScriptModule, "xlator", "O&amp;",</div><div class='del'>-          PyLong_FromVoidPtr, this);</div><div class='del'>-  if (PyErr_Occurred() || !priv-&gt;pXlator)</div><div class='del'>-  {</div><div class='del'>-      PyErr_Print();</div><div class='del'>-      return -1;</div><div class='del'>-  }</div><div class='del'>-</div><div class='del'>-  this-&gt;private = priv;</div><div class='del'>-</div><div class='del'>-  gf_log ("python", GF_LOG_DEBUG, "python xlator loaded");</div><div class='del'>-  return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-void </div><div class='del'>-fini (xlator_t *this)</div><div class='del'>-{</div><div class='del'>-  python_private_t *priv = (python_private_t*)(this-&gt;private);</div><div class='del'>-  Py_DECREF(priv-&gt;pXlator);</div><div class='del'>-  Py_DECREF(priv-&gt;pScriptModule);</div><div class='del'>-  Py_DECREF(priv-&gt;pGlusterModule);</div><div class='del'>-  Py_DECREF(priv-&gt;pFrameType);</div><div class='del'>-  Py_DECREF(priv-&gt;pFdType);</div><div class='del'>-  Py_DECREF(priv-&gt;pVectorType);</div><div class='del'>-  Py_EndInterpreter(priv-&gt;pInterp);</div><div class='del'>-  return;</div><div class='del'>-}</div><div class='head'>diff --git a/xlators/bindings/python/src/testxlator.py b/xlators/bindings/python/src/testxlator.py<br/>deleted file mode 100644<br/>index 507455c856a..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/xlators/bindings/python/src/testxlator.py?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/bindings/python/src/testxlator.py</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,56 +0,0 @@</div><div class='del'>-#   Copyright (c) 2007 Chris AtLee &lt;chris@atlee.ca&gt;</div><div class='del'>-#   This file is part of GlusterFS.</div><div class='del'>-#</div><div class='del'>-#   GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-#   it under the terms of the GNU General Public License as published</div><div class='del'>-#   by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-#   or (at your option) any later version.</div><div class='del'>-#</div><div class='del'>-#   GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-#   WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-#   General Public License for more details.</div><div class='del'>-#</div><div class='del'>-#   You should have received a copy of the GNU General Public License</div><div class='del'>-#   along with this program.  If not, see</div><div class='del'>-#   &lt;http://www.gnu.org/licenses/&gt;.</div><div class='del'>-</div><div class='del'>-"""</div><div class='del'>-This is a test translator written in python.</div><div class='del'>-</div><div class='del'>-Important things to note:</div><div class='del'>-    This file must be import-able from glusterfsd.  This probably means</div><div class='del'>-    setting PYTHONPATH to where this file is located.</div><div class='del'>-</div><div class='del'>-    This file must have a top-level xlator class object that will be</div><div class='del'>-    used to instantiate individual translators.</div><div class='del'>-"""</div><div class='del'>-from gluster import *</div><div class='del'>-</div><div class='del'>-class MyXlator(ComplexTranslator):</div><div class='del'>-    name = "MyXlator"</div><div class='del'>-    def writev_cbk(self, frame, cookie, op_ret, op_errno, buf):</div><div class='del'>-        stack_unwind(frame, op_ret, op_errno, buf)</div><div class='del'>-        return 0</div><div class='del'>-</div><div class='del'>-    def writev(self, frame, fd, vector, count, offset):</div><div class='del'>-        gf_log(self.name, GF_LOG_WARNING, "writev %i bytes", vector.iov_len)</div><div class='del'>-        # TODO: Use cookie to pass this to writev_cbk</div><div class='del'>-        old_count = vector.iov_len</div><div class='del'>-</div><div class='del'>-        data = vector.getBytes().encode("zlib")</div><div class='del'>-</div><div class='del'>-        vector = iovec(data)</div><div class='del'>-        gf_log(self.name, GF_LOG_WARNING, "writev %i bytes", vector.iov_len)</div><div class='del'>-</div><div class='del'>-        @ret_fn_t</div><div class='del'>-        def rfn(frame, prev, this, op_ret, op_errno, *params):</div><div class='del'>-            if len(params) == 0:</div><div class='del'>-                params = [0]</div><div class='del'>-            return self.writev_cbk(frame, prev, old_count, op_errno, *params)</div><div class='del'>-</div><div class='del'>-        stack_wind(frame, rfn, self.firstChild,</div><div class='del'>-                self.firstChild[0].fops[0].writev, fd, vector, count, offset)</div><div class='del'>-        return 0</div><div class='del'>-</div><div class='del'>-xlator = MyXlator</div><div class='head'>diff --git a/xlators/cluster/Makefile.am b/xlators/cluster/Makefile.am<br/>index 0990822a7d3..8e067d5ab58 100644<br/>--- a/<a href='/cgit/glusterfs.git/tree/xlators/cluster/Makefile.am?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/cluster/Makefile.am</a><br/>+++ b/<a href='/cgit/glusterfs.git/tree/xlators/cluster/Makefile.am?id=d1d7a6f35c816822fab51c820e25023863c239c1'>xlators/cluster/Makefile.am</a></div><div class='hunk'>@@ -1,3 +1,3 @@</div><div class='del'>-SUBDIRS = stripe afr dht</div><div class='add'>+SUBDIRS = afr dht ec</div><div class='ctx'> </div><div class='ctx'> CLEANFILES = </div><div class='head'>diff --git a/xlators/cluster/afr/src/Makefile.am b/xlators/cluster/afr/src/Makefile.am<br/>index 4e4b4c75260..610819b28fc 100644<br/>--- a/<a href='/cgit/glusterfs.git/tree/xlators/cluster/afr/src/Makefile.am?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/cluster/afr/src/Makefile.am</a><br/>+++ b/<a href='/cgit/glusterfs.git/tree/xlators/cluster/afr/src/Makefile.am?id=d1d7a6f35c816822fab51c820e25023863c239c1'>xlators/cluster/afr/src/Makefile.am</a></div><div class='hunk'>@@ -1,26 +1,35 @@</div><div class='del'>-xlator_LTLIBRARIES = afr.la pump.la</div><div class='add'>+xlator_LTLIBRARIES = afr.la</div><div class='ctx'> xlatordir = $(libdir)/glusterfs/$(PACKAGE_VERSION)/xlator/cluster</div><div class='ctx'> </div><div class='del'>-afr_common_source = afr-dir-read.c afr-dir-write.c afr-inode-read.c afr-inode-write.c afr-open.c afr-transaction.c afr-self-heal-data.c afr-self-heal-common.c afr-self-heal-metadata.c afr-self-heal-entry.c afr-self-heal-algorithm.c afr-lk-common.c</div><div class='add'>+afr_common_source = afr-dir-read.c afr-dir-write.c afr-inode-read.c \</div><div class='add'>+	afr-inode-write.c afr-open.c afr-transaction.c afr-lk-common.c \</div><div class='add'>+	afr-read-txn.c \</div><div class='add'>+	$(top_builddir)/xlators/lib/src/libxlator.c</div><div class='ctx'> </div><div class='del'>-afr_la_LDFLAGS = -module -avoidversion</div><div class='del'>-afr_la_SOURCES = $(afr_common_source) afr.c</div><div class='add'>+AFR_SELFHEAL_SOURCES = afr-self-heal-common.c afr-self-heal-data.c \</div><div class='add'>+	afr-self-heal-entry.c afr-self-heal-metadata.c afr-self-heald.c \</div><div class='add'>+	afr-self-heal-name.c</div><div class='add'>+</div><div class='add'>+afr_la_LDFLAGS = -module $(GF_XLATOR_DEFAULT_LDFLAGS)</div><div class='add'>+afr_la_SOURCES = $(afr_common_source) $(AFR_SELFHEAL_SOURCES) afr.c</div><div class='ctx'> afr_la_LIBADD = $(top_builddir)/libglusterfs/src/libglusterfs.la</div><div class='ctx'> </div><div class='del'>-pump_la_LDFLAGS = -module -avoidversion</div><div class='del'>-pump_la_SOURCES =  $(afr_common_source) pump.c</div><div class='del'>-pump_la_LIBADD = $(top_builddir)/libglusterfs/src/libglusterfs.la</div><div class='add'>+noinst_HEADERS = afr.h afr-transaction.h afr-inode-write.h afr-inode-read.h \</div><div class='add'>+	afr-dir-read.h afr-dir-write.h afr-self-heal.h afr-mem-types.h \</div><div class='add'>+	afr-common.c afr-self-heald.h \</div><div class='add'>+	$(top_builddir)/xlators/lib/src/libxlator.h afr-messages.h</div><div class='ctx'> </div><div class='del'>-noinst_HEADERS = afr.h afr-transaction.h afr-inode-write.h afr-inode-read.h afr-dir-read.h afr-dir-write.h afr-self-heal.h afr-self-heal-common.h afr-self-heal-algorithm.h pump.h afr-mem-types.h afr-common.c</div><div class='add'>+AM_CPPFLAGS = $(GF_CPPFLAGS) \</div><div class='add'>+	-I$(top_srcdir)/libglusterfs/src -I$(top_srcdir)/xlators/lib/src \</div><div class='add'>+	-I$(top_srcdir)/rpc/rpc-lib/src \</div><div class='add'>+	-I$(top_srcdir)/rpc/xdr/src -I$(top_builddir)/rpc/xdr/src</div><div class='ctx'> </div><div class='del'>-AM_CFLAGS = -fPIC -D_FILE_OFFSET_BITS=64 -D_GNU_SOURCE -Wall -D$(GF_HOST_OS) \</div><div class='del'>-	    -I$(top_srcdir)/libglusterfs/src -I$(top_srcdir)/contrib/md5 -shared -nostartfiles $(GF_CFLAGS)</div><div class='add'>+AM_CFLAGS = -Wall $(GF_CFLAGS)</div><div class='ctx'> </div><div class='ctx'> CLEANFILES =</div><div class='ctx'> </div><div class='ctx'> uninstall-local:</div><div class='ctx'> 	rm -f $(DESTDIR)$(xlatordir)/replicate.so</div><div class='del'>-	rm -f $(DESTDIR)$(xlatordir)/pump.so</div><div class='ctx'> </div><div class='ctx'> install-data-hook:</div><div class='ctx'> 	ln -sf afr.so $(DESTDIR)$(xlatordir)/replicate.so</div><div class='head'>diff --git a/xlators/cluster/afr/src/afr-common.c b/xlators/cluster/afr/src/afr-common.c<br/>index cb01f0b9c32..032ab5c8001 100644<br/>--- a/<a href='/cgit/glusterfs.git/tree/xlators/cluster/afr/src/afr-common.c?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/cluster/afr/src/afr-common.c</a><br/>+++ b/<a href='/cgit/glusterfs.git/tree/xlators/cluster/afr/src/afr-common.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>xlators/cluster/afr/src/afr-common.c</a></div><div class='hunk'>@@ -1,20 +1,11 @@</div><div class='ctx'> /*</div><div class='del'>-   Copyright (c) 2007-2009 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='del'>-   This file is part of GlusterFS.</div><div class='del'>-</div><div class='del'>-   GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-   it under the terms of the GNU General Public License as published</div><div class='del'>-   by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-   or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-   GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-   WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-   General Public License for more details.</div><div class='del'>-</div><div class='del'>-   You should have received a copy of the GNU General Public License</div><div class='del'>-   along with this program.  If not, see</div><div class='del'>-   &lt;http://www.gnu.org/licenses/&gt;.</div><div class='add'>+  Copyright (c) 2008-2012 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='ctx'> */</div><div class='ctx'> </div><div class='ctx'> #include &lt;libgen.h&gt;</div><div class='hunk'>@@ -24,28 +15,20 @@</div><div class='ctx'> #include &lt;stdlib.h&gt;</div><div class='ctx'> #include &lt;signal.h&gt;</div><div class='ctx'> </div><div class='del'>-#ifndef _CONFIG_H</div><div class='del'>-#define _CONFIG_H</div><div class='del'>-#include "config.h"</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-#include "glusterfs.h"</div><div class='add'>+#include &lt;glusterfs/glusterfs.h&gt;</div><div class='ctx'> #include "afr.h"</div><div class='del'>-#include "dict.h"</div><div class='del'>-#include "xlator.h"</div><div class='del'>-#include "hashfn.h"</div><div class='del'>-#include "logging.h"</div><div class='del'>-#include "stack.h"</div><div class='del'>-#include "list.h"</div><div class='del'>-#include "call-stub.h"</div><div class='del'>-#include "defaults.h"</div><div class='del'>-#include "common-utils.h"</div><div class='del'>-#include "compat-errno.h"</div><div class='del'>-#include "compat.h"</div><div class='del'>-#include "byte-order.h"</div><div class='del'>-#include "statedump.h"</div><div class='del'>-</div><div class='del'>-#include "fd.h"</div><div class='add'>+#include &lt;glusterfs/dict.h&gt;</div><div class='add'>+#include &lt;glusterfs/hashfn.h&gt;</div><div class='add'>+#include &lt;glusterfs/list.h&gt;</div><div class='add'>+#include &lt;glusterfs/call-stub.h&gt;</div><div class='add'>+#include &lt;glusterfs/defaults.h&gt;</div><div class='add'>+#include &lt;glusterfs/common-utils.h&gt;</div><div class='add'>+#include &lt;glusterfs/compat-errno.h&gt;</div><div class='add'>+#include &lt;glusterfs/compat.h&gt;</div><div class='add'>+#include &lt;glusterfs/byte-order.h&gt;</div><div class='add'>+#include &lt;glusterfs/statedump.h&gt;</div><div class='add'>+#include &lt;glusterfs/events.h&gt;</div><div class='add'>+#include &lt;glusterfs/upcall-utils.h&gt;</div><div class='ctx'> </div><div class='ctx'> #include "afr-inode-read.h"</div><div class='ctx'> #include "afr-inode-write.h"</div><div class='hunk'>@@ -53,2618 +36,7843 @@</div><div class='ctx'> #include "afr-dir-write.h"</div><div class='ctx'> #include "afr-transaction.h"</div><div class='ctx'> #include "afr-self-heal.h"</div><div class='del'>-#include "afr-self-heal-common.h"</div><div class='del'>-#include "pump.h"</div><div class='del'>-</div><div class='del'>-#define AFR_ICTX_OPENDIR_DONE_MASK     0x0000000200000000ULL</div><div class='del'>-#define AFR_ICTX_SPLIT_BRAIN_MASK      0x0000000100000000ULL</div><div class='del'>-#define AFR_ICTX_READ_CHILD_MASK       0x00000000FFFFFFFFULL</div><div class='add'>+#include "afr-self-heald.h"</div><div class='add'>+#include "afr-messages.h"</div><div class='ctx'> </div><div class='ctx'> int32_t</div><div class='del'>-afr_set_dict_gfid (dict_t *dict, uuid_t gfid)</div><div class='add'>+afr_quorum_errno(afr_private_t *priv)</div><div class='ctx'> {</div><div class='del'>-        int ret = 0;</div><div class='del'>-</div><div class='del'>-        GF_ASSERT (gfid);</div><div class='add'>+    return ENOTCONN;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        ret = dict_set_static_bin (dict, "gfid-req", gfid, 16);</div><div class='del'>-        if (ret)</div><div class='del'>-                gf_log (THIS-&gt;name, GF_LOG_DEBUG, "gfid set failed");</div><div class='add'>+gf_boolean_t</div><div class='add'>+afr_is_private_directory(afr_private_t *priv, uuid_t pargfid, const char *name,</div><div class='add'>+                         pid_t pid)</div><div class='add'>+{</div><div class='add'>+    if (!__is_root_gfid(pargfid)) {</div><div class='add'>+        return _gf_false;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (strcmp(name, GF_REPLICATE_TRASH_DIR) == 0) {</div><div class='add'>+        /*For backward compatibility /.landfill is private*/</div><div class='add'>+        return _gf_true;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (pid == GF_CLIENT_PID_GSYNCD) {</div><div class='add'>+        /*geo-rep needs to create/sync private directory on slave because</div><div class='add'>+         * it appears in changelog*/</div><div class='add'>+        return _gf_false;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (pid == GF_CLIENT_PID_GLFS_HEAL || pid == GF_CLIENT_PID_SELF_HEALD) {</div><div class='add'>+        if (strcmp(name, priv-&gt;anon_inode_name) == 0) {</div><div class='add'>+            /* anonymous-inode dir is private*/</div><div class='add'>+            return _gf_true;</div><div class='add'>+        }</div><div class='add'>+    } else {</div><div class='add'>+        if (strncmp(name, AFR_ANON_DIR_PREFIX, strlen(AFR_ANON_DIR_PREFIX)) ==</div><div class='add'>+            0) {</div><div class='add'>+            /* anonymous-inode dir prefix is private for geo-rep to work*/</div><div class='add'>+            return _gf_true;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        return ret;</div><div class='add'>+    return _gf_false;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-uint64_t</div><div class='del'>-afr_is_split_brain (xlator_t *this, inode_t *inode)</div><div class='add'>+void</div><div class='add'>+afr_fill_success_replies(afr_local_t *local, afr_private_t *priv,</div><div class='add'>+                         unsigned char *replies)</div><div class='ctx'> {</div><div class='del'>-        int ret = 0;</div><div class='add'>+    int i = 0;</div><div class='ctx'> </div><div class='del'>-        uint64_t ctx         = 0;</div><div class='del'>-        uint64_t split_brain = 0;</div><div class='add'>+    for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+        if (local-&gt;replies[i].valid &amp;&amp; local-&gt;replies[i].op_ret == 0) {</div><div class='add'>+            replies[i] = 1;</div><div class='add'>+        } else {</div><div class='add'>+            replies[i] = 0;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        VALIDATE_OR_GOTO (inode, out);</div><div class='add'>+int</div><div class='add'>+afr_fav_child_reset_sink_xattrs(void *opaque);</div><div class='ctx'> </div><div class='del'>-        LOCK (&amp;inode-&gt;lock);</div><div class='del'>-        {</div><div class='del'>-                ret = __inode_ctx_get (inode, this, &amp;ctx);</div><div class='add'>+int</div><div class='add'>+afr_fav_child_reset_sink_xattrs_cbk(int ret, call_frame_t *frame, void *opaque);</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+afr_discover_done(call_frame_t *frame, xlator_t *this);</div><div class='ctx'> </div><div class='del'>-                if (ret &lt; 0)</div><div class='del'>-                        goto unlock;</div><div class='add'>+int</div><div class='add'>+afr_dom_lock_acquire_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                         int op_ret, int op_errno, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    afr_local_t *local = frame-&gt;local;</div><div class='add'>+    afr_private_t *priv = this-&gt;private;</div><div class='add'>+    int i = (long)cookie;</div><div class='add'>+</div><div class='add'>+    local-&gt;cont.lk.dom_lock_op_ret[i] = op_ret;</div><div class='add'>+    local-&gt;cont.lk.dom_lock_op_errno[i] = op_errno;</div><div class='add'>+    if (op_ret &lt; 0) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_ERROR, op_errno, AFR_MSG_LK_HEAL_DOM,</div><div class='add'>+               "%s: Failed to acquire %s on %s",</div><div class='add'>+               uuid_utoa(local-&gt;fd-&gt;inode-&gt;gfid), AFR_LK_HEAL_DOM,</div><div class='add'>+               priv-&gt;children[i]-&gt;name);</div><div class='add'>+    } else {</div><div class='add'>+        local-&gt;cont.lk.dom_locked_nodes[i] = 1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    syncbarrier_wake(&amp;local-&gt;barrier);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-                split_brain = ctx &amp; AFR_ICTX_SPLIT_BRAIN_MASK;</div><div class='add'>+int</div><div class='add'>+afr_dom_lock_acquire(call_frame_t *frame)</div><div class='add'>+{</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    struct gf_flock flock = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int i = 0;</div><div class='add'>+</div><div class='add'>+    priv = frame-&gt;this-&gt;private;</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    local-&gt;cont.lk.dom_locked_nodes = GF_CALLOC(</div><div class='add'>+        priv-&gt;child_count, sizeof(*local-&gt;cont.lk.locked_nodes),</div><div class='add'>+        gf_afr_mt_char);</div><div class='add'>+    if (!local-&gt;cont.lk.dom_locked_nodes) {</div><div class='add'>+        return -ENOMEM;</div><div class='add'>+    }</div><div class='add'>+    local-&gt;cont.lk.dom_lock_op_ret = GF_CALLOC(</div><div class='add'>+        priv-&gt;child_count, sizeof(*local-&gt;cont.lk.dom_lock_op_ret),</div><div class='add'>+        gf_afr_mt_int32_t);</div><div class='add'>+    if (!local-&gt;cont.lk.dom_lock_op_ret) {</div><div class='add'>+        return -ENOMEM; /* CALLOC'd members are freed in afr_local_cleanup. */</div><div class='add'>+    }</div><div class='add'>+    local-&gt;cont.lk.dom_lock_op_errno = GF_CALLOC(</div><div class='add'>+        priv-&gt;child_count, sizeof(*local-&gt;cont.lk.dom_lock_op_errno),</div><div class='add'>+        gf_afr_mt_int32_t);</div><div class='add'>+    if (!local-&gt;cont.lk.dom_lock_op_errno) {</div><div class='add'>+        return -ENOMEM; /* CALLOC'd members are freed in afr_local_cleanup. */</div><div class='add'>+    }</div><div class='add'>+    flock.l_type = F_WRLCK;</div><div class='add'>+</div><div class='add'>+    AFR_ONALL(frame, afr_dom_lock_acquire_cbk, finodelk, AFR_LK_HEAL_DOM,</div><div class='add'>+              local-&gt;fd, F_SETLK, &amp;flock, NULL);</div><div class='add'>+</div><div class='add'>+    if (!afr_has_quorum(local-&gt;cont.lk.dom_locked_nodes, frame-&gt;this, NULL))</div><div class='add'>+        goto blocking_lock;</div><div class='add'>+</div><div class='add'>+    /*If any of the bricks returned EAGAIN, we still need blocking locks.*/</div><div class='add'>+    if (AFR_COUNT(local-&gt;cont.lk.dom_locked_nodes, priv-&gt;child_count) !=</div><div class='add'>+        priv-&gt;child_count) {</div><div class='add'>+        for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+            if (local-&gt;cont.lk.dom_lock_op_ret[i] == -1 &amp;&amp;</div><div class='add'>+                local-&gt;cont.lk.dom_lock_op_errno[i] == EAGAIN)</div><div class='add'>+                goto blocking_lock;</div><div class='ctx'>         }</div><div class='del'>-unlock:</div><div class='del'>-        UNLOCK (&amp;inode-&gt;lock);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-out:</div><div class='del'>-        return split_brain;</div><div class='add'>+    return 0;</div><div class='add'>+</div><div class='add'>+blocking_lock:</div><div class='add'>+    afr_dom_lock_release(frame);</div><div class='add'>+    AFR_ONALL(frame, afr_dom_lock_acquire_cbk, finodelk, AFR_LK_HEAL_DOM,</div><div class='add'>+              local-&gt;fd, F_SETLKW, &amp;flock, NULL);</div><div class='add'>+    if (!afr_has_quorum(local-&gt;cont.lk.dom_locked_nodes, frame-&gt;this, NULL)) {</div><div class='add'>+        afr_dom_lock_release(frame);</div><div class='add'>+        return -afr_quorum_errno(priv);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+int</div><div class='add'>+afr_dom_lock_release_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                         int op_ret, int op_errno, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    afr_local_t *local = frame-&gt;local;</div><div class='add'>+    afr_private_t *priv = this-&gt;private;</div><div class='add'>+    int i = (long)cookie;</div><div class='add'>+</div><div class='add'>+    if (op_ret &lt; 0) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_ERROR, op_errno, AFR_MSG_LK_HEAL_DOM,</div><div class='add'>+               "%s: Failed to release %s on %s", local-&gt;loc.path,</div><div class='add'>+               AFR_LK_HEAL_DOM, priv-&gt;children[i]-&gt;name);</div><div class='add'>+    }</div><div class='add'>+    local-&gt;cont.lk.dom_locked_nodes[i] = 0;</div><div class='add'>+</div><div class='add'>+    syncbarrier_wake(&amp;local-&gt;barrier);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> void</div><div class='del'>-afr_set_split_brain (xlator_t *this, inode_t *inode, gf_boolean_t set)</div><div class='add'>+afr_dom_lock_release(call_frame_t *frame)</div><div class='ctx'> {</div><div class='del'>-        uint64_t ctx = 0;</div><div class='del'>-        int      ret = 0;</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    unsigned char *locked_on = NULL;</div><div class='add'>+    struct gf_flock flock = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    priv = frame-&gt;this-&gt;private;</div><div class='add'>+    locked_on = local-&gt;cont.lk.dom_locked_nodes;</div><div class='add'>+    if (AFR_COUNT(locked_on, priv-&gt;child_count) == 0)</div><div class='add'>+        return;</div><div class='add'>+    flock.l_type = F_UNLCK;</div><div class='ctx'> </div><div class='del'>-        VALIDATE_OR_GOTO (inode, out);</div><div class='add'>+    AFR_ONLIST(locked_on, frame, afr_dom_lock_release_cbk, finodelk,</div><div class='add'>+               AFR_LK_HEAL_DOM, local-&gt;fd, F_SETLK, &amp;flock, NULL);</div><div class='ctx'> </div><div class='del'>-        LOCK (&amp;inode-&gt;lock);</div><div class='del'>-        {</div><div class='del'>-                ret = __inode_ctx_get (inode, this, &amp;ctx);</div><div class='add'>+    return;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-                if (ret &lt; 0) {</div><div class='del'>-                        ctx = 0;</div><div class='del'>-                }</div><div class='add'>+static void</div><div class='add'>+afr_lk_heal_info_cleanup(afr_lk_heal_info_t *info)</div><div class='add'>+{</div><div class='add'>+    if (!info)</div><div class='add'>+        return;</div><div class='add'>+    if (info-&gt;xdata_req)</div><div class='add'>+        dict_unref(info-&gt;xdata_req);</div><div class='add'>+    if (info-&gt;fd)</div><div class='add'>+        fd_unref(info-&gt;fd);</div><div class='add'>+    GF_FREE(info-&gt;locked_nodes);</div><div class='add'>+    GF_FREE(info-&gt;child_up_event_gen);</div><div class='add'>+    GF_FREE(info-&gt;child_down_event_gen);</div><div class='add'>+    GF_FREE(info);</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-                if (set) {</div><div class='del'>-			ctx = (~AFR_ICTX_SPLIT_BRAIN_MASK &amp; ctx)</div><div class='del'>-                                | (0xFFFFFFFFFFFFFFFFULL &amp; AFR_ICTX_SPLIT_BRAIN_MASK);</div><div class='del'>-		} else {</div><div class='del'>-			ctx = (~AFR_ICTX_SPLIT_BRAIN_MASK &amp; ctx);</div><div class='del'>-		}</div><div class='del'>-                __inode_ctx_put (inode, this, ctx);</div><div class='add'>+static int</div><div class='add'>+afr_add_lock_to_saved_locks(call_frame_t *frame, xlator_t *this)</div><div class='add'>+{</div><div class='add'>+    afr_private_t *priv = this-&gt;private;</div><div class='add'>+    afr_local_t *local = frame-&gt;local;</div><div class='add'>+    afr_lk_heal_info_t *info = NULL;</div><div class='add'>+    afr_fd_ctx_t *fd_ctx = NULL;</div><div class='add'>+    int ret = -ENOMEM;</div><div class='add'>+</div><div class='add'>+    info = GF_CALLOC(sizeof(*info), 1, gf_afr_mt_lk_heal_info_t);</div><div class='add'>+    if (!info) {</div><div class='add'>+        goto cleanup;</div><div class='add'>+    }</div><div class='add'>+    INIT_LIST_HEAD(&amp;info-&gt;pos);</div><div class='add'>+    info-&gt;fd = fd_ref(local-&gt;fd);</div><div class='add'>+    info-&gt;cmd = local-&gt;cont.lk.cmd;</div><div class='add'>+    info-&gt;pid = frame-&gt;root-&gt;pid;</div><div class='add'>+    info-&gt;flock = local-&gt;cont.lk.user_flock;</div><div class='add'>+    info-&gt;xdata_req = dict_copy_with_ref(local-&gt;xdata_req, NULL);</div><div class='add'>+    if (!info-&gt;xdata_req) {</div><div class='add'>+        goto cleanup;</div><div class='add'>+    }</div><div class='add'>+    info-&gt;lk_owner = frame-&gt;root-&gt;lk_owner;</div><div class='add'>+    info-&gt;locked_nodes = GF_MALLOC(</div><div class='add'>+        sizeof(*info-&gt;locked_nodes) * priv-&gt;child_count, gf_afr_mt_char);</div><div class='add'>+    if (!info-&gt;locked_nodes) {</div><div class='add'>+        goto cleanup;</div><div class='add'>+    }</div><div class='add'>+    memcpy(info-&gt;locked_nodes, local-&gt;cont.lk.locked_nodes,</div><div class='add'>+           sizeof(*info-&gt;locked_nodes) * priv-&gt;child_count);</div><div class='add'>+    info-&gt;child_up_event_gen = GF_CALLOC(sizeof(*info-&gt;child_up_event_gen),</div><div class='add'>+                                         priv-&gt;child_count, gf_afr_mt_int32_t);</div><div class='add'>+    if (!info-&gt;child_up_event_gen) {</div><div class='add'>+        goto cleanup;</div><div class='add'>+    }</div><div class='add'>+    info-&gt;child_down_event_gen = GF_CALLOC(sizeof(*info-&gt;child_down_event_gen),</div><div class='add'>+                                           priv-&gt;child_count,</div><div class='add'>+                                           gf_afr_mt_int32_t);</div><div class='add'>+    if (!info-&gt;child_down_event_gen) {</div><div class='add'>+        goto cleanup;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;local-&gt;fd-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        fd_ctx = __afr_fd_ctx_get(local-&gt;fd, this);</div><div class='add'>+        if (fd_ctx)</div><div class='add'>+            fd_ctx-&gt;lk_heal_info = info;</div><div class='add'>+    }</div><div class='add'>+    UNLOCK(&amp;local-&gt;fd-&gt;lock);</div><div class='add'>+    if (!fd_ctx) {</div><div class='add'>+        goto cleanup;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;priv-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        list_add_tail(&amp;info-&gt;pos, &amp;priv-&gt;saved_locks);</div><div class='add'>+    }</div><div class='add'>+    UNLOCK(&amp;priv-&gt;lock);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+cleanup:</div><div class='add'>+    gf_msg(this-&gt;name, GF_LOG_ERROR, -ret, AFR_MSG_LK_HEAL_DOM,</div><div class='add'>+           "%s: Failed to add lock to healq",</div><div class='add'>+           uuid_utoa(local-&gt;fd-&gt;inode-&gt;gfid));</div><div class='add'>+    if (info) {</div><div class='add'>+        afr_lk_heal_info_cleanup(info);</div><div class='add'>+        if (fd_ctx) {</div><div class='add'>+            LOCK(&amp;local-&gt;fd-&gt;lock);</div><div class='add'>+            {</div><div class='add'>+                fd_ctx-&gt;lk_heal_info = NULL;</div><div class='add'>+            }</div><div class='add'>+            UNLOCK(&amp;local-&gt;fd-&gt;lock);</div><div class='ctx'>         }</div><div class='del'>-        UNLOCK (&amp;inode-&gt;lock);</div><div class='add'>+    }</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+afr_remove_lock_from_saved_locks(afr_local_t *local, xlator_t *this)</div><div class='add'>+{</div><div class='add'>+    afr_private_t *priv = this-&gt;private;</div><div class='add'>+    struct gf_flock flock = local-&gt;cont.lk.user_flock;</div><div class='add'>+    afr_lk_heal_info_t *info = NULL;</div><div class='add'>+    afr_fd_ctx_t *fd_ctx = NULL;</div><div class='add'>+    int ret = -EINVAL;</div><div class='add'>+</div><div class='add'>+    fd_ctx = afr_fd_ctx_get(local-&gt;fd, this);</div><div class='add'>+    if (!fd_ctx || !fd_ctx-&gt;lk_heal_info) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    info = fd_ctx-&gt;lk_heal_info;</div><div class='add'>+    if ((info-&gt;flock.l_start != flock.l_start) ||</div><div class='add'>+        (info-&gt;flock.l_whence != flock.l_whence) ||</div><div class='add'>+        (info-&gt;flock.l_len != flock.l_len)) {</div><div class='add'>+        /*TODO: Compare lkowners too.*/</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;priv-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        list_del(&amp;fd_ctx-&gt;lk_heal_info-&gt;pos);</div><div class='add'>+    }</div><div class='add'>+    UNLOCK(&amp;priv-&gt;lock);</div><div class='add'>+</div><div class='add'>+    afr_lk_heal_info_cleanup(info);</div><div class='add'>+    fd_ctx-&gt;lk_heal_info = NULL;</div><div class='add'>+    ret = 0;</div><div class='ctx'> out:</div><div class='del'>-        return;</div><div class='add'>+    if (ret)</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_ERROR, -ret, AFR_MSG_LK_HEAL_DOM,</div><div class='add'>+               "%s: Failed to remove lock from healq",</div><div class='add'>+               uuid_utoa(local-&gt;fd-&gt;inode-&gt;gfid));</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+int</div><div class='add'>+afr_lock_heal_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                  int32_t op_ret, int32_t op_errno, struct gf_flock *lock,</div><div class='add'>+                  dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    afr_local_t *local = frame-&gt;local;</div><div class='add'>+    int i = (long)cookie;</div><div class='add'>+</div><div class='add'>+    local-&gt;replies[i].valid = 1;</div><div class='add'>+    local-&gt;replies[i].op_ret = op_ret;</div><div class='add'>+    local-&gt;replies[i].op_errno = op_errno;</div><div class='add'>+    if (op_ret != 0) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_ERROR, op_errno, AFR_MSG_LK_HEAL_DOM,</div><div class='add'>+               "Failed to heal lock on child %d for %s", i,</div><div class='add'>+               uuid_utoa(local-&gt;fd-&gt;inode-&gt;gfid));</div><div class='add'>+    }</div><div class='add'>+    syncbarrier_wake(&amp;local-&gt;barrier);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-uint64_t</div><div class='del'>-afr_is_opendir_done (xlator_t *this, inode_t *inode)</div><div class='add'>+int</div><div class='add'>+afr_getlk_cbk(call_frame_t *frame, void *cookie, xlator_t *this, int32_t op_ret,</div><div class='add'>+              int32_t op_errno, struct gf_flock *lock, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-        int ret = 0;</div><div class='add'>+    afr_local_t *local = frame-&gt;local;</div><div class='add'>+    int i = (long)cookie;</div><div class='add'>+</div><div class='add'>+    local-&gt;replies[i].valid = 1;</div><div class='add'>+    local-&gt;replies[i].op_ret = op_ret;</div><div class='add'>+    local-&gt;replies[i].op_errno = op_errno;</div><div class='add'>+    if (op_ret != 0) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_ERROR, op_errno, AFR_MSG_LK_HEAL_DOM,</div><div class='add'>+               "Failed getlk for %s", uuid_utoa(local-&gt;fd-&gt;inode-&gt;gfid));</div><div class='add'>+    } else {</div><div class='add'>+        local-&gt;cont.lk.getlk_rsp[i] = *lock;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    syncbarrier_wake(&amp;local-&gt;barrier);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        uint64_t ctx          = 0;</div><div class='del'>-        uint64_t opendir_done = 0;</div><div class='add'>+static gf_boolean_t</div><div class='add'>+afr_does_lk_owner_match(call_frame_t *frame, afr_private_t *priv,</div><div class='add'>+                        afr_lk_heal_info_t *info)</div><div class='add'>+{</div><div class='add'>+    int i = 0;</div><div class='add'>+    afr_local_t *local = frame-&gt;local;</div><div class='add'>+    struct gf_flock flock = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    gf_boolean_t ret = _gf_true;</div><div class='add'>+    char *wind_on = alloca0(priv-&gt;child_count);</div><div class='add'>+    unsigned char *success_replies = alloca0(priv-&gt;child_count);</div><div class='add'>+    local-&gt;cont.lk.getlk_rsp = GF_CALLOC(sizeof(*local-&gt;cont.lk.getlk_rsp),</div><div class='add'>+                                         priv-&gt;child_count, gf_afr_mt_gf_lock);</div><div class='add'>+</div><div class='add'>+    flock = info-&gt;flock;</div><div class='add'>+    for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+        if (info-&gt;locked_nodes[i])</div><div class='add'>+            wind_on[i] = 1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    AFR_ONLIST(wind_on, frame, afr_getlk_cbk, lk, info-&gt;fd, F_GETLK, &amp;flock,</div><div class='add'>+               info-&gt;xdata_req);</div><div class='add'>+</div><div class='add'>+    afr_fill_success_replies(local, priv, success_replies);</div><div class='add'>+    if (AFR_COUNT(success_replies, priv-&gt;child_count) == 0) {</div><div class='add'>+        ret = _gf_false;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+        if (!local-&gt;replies[i].valid || local-&gt;replies[i].op_ret != 0)</div><div class='add'>+            continue;</div><div class='add'>+        if (local-&gt;cont.lk.getlk_rsp[i].l_type == F_UNLCK)</div><div class='add'>+            continue;</div><div class='add'>+        /*TODO: Do we really need to compare lkowner if F_UNLCK is true?*/</div><div class='add'>+        if (!is_same_lkowner(&amp;local-&gt;cont.lk.getlk_rsp[i].l_owner,</div><div class='add'>+                             &amp;info-&gt;lk_owner)) {</div><div class='add'>+            ret = _gf_false;</div><div class='add'>+            break;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+out:</div><div class='add'>+    afr_local_replies_wipe(local, priv);</div><div class='add'>+    GF_FREE(local-&gt;cont.lk.getlk_rsp);</div><div class='add'>+    local-&gt;cont.lk.getlk_rsp = NULL;</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        VALIDATE_OR_GOTO (inode, out);</div><div class='add'>+static void</div><div class='add'>+afr_mark_fd_bad(fd_t *fd, xlator_t *this)</div><div class='add'>+{</div><div class='add'>+    afr_fd_ctx_t *fd_ctx = NULL;</div><div class='ctx'> </div><div class='del'>-        LOCK (&amp;inode-&gt;lock);</div><div class='del'>-        {</div><div class='del'>-                ret = __inode_ctx_get (inode, this, &amp;ctx);</div><div class='add'>+    if (!fd)</div><div class='add'>+        return;</div><div class='add'>+    LOCK(&amp;fd-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        fd_ctx = __afr_fd_ctx_get(fd, this);</div><div class='add'>+        if (fd_ctx) {</div><div class='add'>+            fd_ctx-&gt;is_fd_bad = _gf_true;</div><div class='add'>+            fd_ctx-&gt;lk_heal_info = NULL;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    UNLOCK(&amp;fd-&gt;lock);</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-                if (ret &lt; 0)</div><div class='del'>-                        goto unlock;</div><div class='add'>+static void</div><div class='add'>+afr_add_lock_to_lkhealq(afr_private_t *priv, afr_lk_heal_info_t *info)</div><div class='add'>+{</div><div class='add'>+    LOCK(&amp;priv-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        list_del(&amp;info-&gt;pos);</div><div class='add'>+        list_add_tail(&amp;info-&gt;pos, &amp;priv-&gt;lk_healq);</div><div class='add'>+    }</div><div class='add'>+    UNLOCK(&amp;priv-&gt;lock);</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-                opendir_done = ctx &amp; AFR_ICTX_OPENDIR_DONE_MASK;</div><div class='add'>+static void</div><div class='add'>+afr_lock_heal_do(call_frame_t *frame, afr_private_t *priv,</div><div class='add'>+                 afr_lk_heal_info_t *info)</div><div class='add'>+{</div><div class='add'>+    int i = 0;</div><div class='add'>+    int op_errno = 0;</div><div class='add'>+    int32_t *current_event_gen = NULL;</div><div class='add'>+    afr_local_t *local = frame-&gt;local;</div><div class='add'>+    xlator_t *this = frame-&gt;this;</div><div class='add'>+    char *wind_on = alloca0(priv-&gt;child_count);</div><div class='add'>+    gf_boolean_t retry = _gf_true;</div><div class='add'>+</div><div class='add'>+    frame-&gt;root-&gt;pid = info-&gt;pid;</div><div class='add'>+    lk_owner_copy(&amp;frame-&gt;root-&gt;lk_owner, &amp;info-&gt;lk_owner);</div><div class='add'>+</div><div class='add'>+    op_errno = -afr_dom_lock_acquire(frame);</div><div class='add'>+    if ((op_errno != 0)) {</div><div class='add'>+        goto release;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (!afr_does_lk_owner_match(frame, priv, info)) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_WARNING, 0, AFR_MSG_LK_HEAL_DOM,</div><div class='add'>+               "Ignoring lock heal for %s since lk-onwers mismatch. "</div><div class='add'>+               "Lock possibly pre-empted by another client.",</div><div class='add'>+               uuid_utoa(info-&gt;fd-&gt;inode-&gt;gfid));</div><div class='add'>+        goto release;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+        if (info-&gt;locked_nodes[i])</div><div class='add'>+            continue;</div><div class='add'>+        wind_on[i] = 1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    current_event_gen = alloca(priv-&gt;child_count);</div><div class='add'>+    memcpy(current_event_gen, info-&gt;child_up_event_gen,</div><div class='add'>+           priv-&gt;child_count * sizeof *current_event_gen);</div><div class='add'>+    AFR_ONLIST(wind_on, frame, afr_lock_heal_cbk, lk, info-&gt;fd, info-&gt;cmd,</div><div class='add'>+               &amp;info-&gt;flock, info-&gt;xdata_req);</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;priv-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+            if (!wind_on[i])</div><div class='add'>+                continue;</div><div class='add'>+            if ((!local-&gt;replies[i].valid) || (local-&gt;replies[i].op_ret != 0)) {</div><div class='add'>+                continue;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            if ((current_event_gen[i] == info-&gt;child_up_event_gen[i]) &amp;&amp;</div><div class='add'>+                (current_event_gen[i] &gt; info-&gt;child_down_event_gen[i])) {</div><div class='add'>+                info-&gt;locked_nodes[i] = 1;</div><div class='add'>+                retry = _gf_false;</div><div class='add'>+                list_del_init(&amp;info-&gt;pos);</div><div class='add'>+                list_add_tail(&amp;info-&gt;pos, &amp;priv-&gt;saved_locks);</div><div class='add'>+            } else {</div><div class='add'>+                /*We received subsequent child up/down events while heal was in</div><div class='add'>+                 * progress; don't mark child as healed. Attempt again on the</div><div class='add'>+                 * new child up*/</div><div class='add'>+                gf_msg(this-&gt;name, GF_LOG_ERROR, 0, AFR_MSG_LK_HEAL_DOM,</div><div class='add'>+                       "Event gen mismatch: skipped healing lock on child %d "</div><div class='add'>+                       "for %s.",</div><div class='add'>+                       i, uuid_utoa(info-&gt;fd-&gt;inode-&gt;gfid));</div><div class='add'>+            }</div><div class='ctx'>         }</div><div class='del'>-unlock:</div><div class='del'>-        UNLOCK (&amp;inode-&gt;lock);</div><div class='add'>+    }</div><div class='add'>+    UNLOCK(&amp;priv-&gt;lock);</div><div class='add'>+</div><div class='add'>+release:</div><div class='add'>+    afr_dom_lock_release(frame);</div><div class='add'>+    if (retry)</div><div class='add'>+        afr_add_lock_to_lkhealq(priv, info);</div><div class='add'>+    return;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-out:</div><div class='del'>-        return opendir_done;</div><div class='add'>+static int</div><div class='add'>+afr_lock_heal_done(int ret, call_frame_t *frame, void *opaque)</div><div class='add'>+{</div><div class='add'>+    STACK_DESTROY(frame-&gt;root);</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+static int</div><div class='add'>+afr_lock_heal(void *opaque)</div><div class='add'>+{</div><div class='add'>+    call_frame_t *frame = (call_frame_t *)opaque;</div><div class='add'>+    call_frame_t *iter_frame = NULL;</div><div class='add'>+    xlator_t *this = frame-&gt;this;</div><div class='add'>+    afr_private_t *priv = this-&gt;private;</div><div class='add'>+    afr_lk_heal_info_t *info = NULL;</div><div class='add'>+    afr_lk_heal_info_t *tmp = NULL;</div><div class='add'>+    struct list_head healq = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    iter_frame = afr_copy_frame(frame);</div><div class='add'>+    if (!iter_frame) {</div><div class='add'>+        return ENOMEM;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    INIT_LIST_HEAD(&amp;healq);</div><div class='add'>+    LOCK(&amp;priv-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        list_splice_init(&amp;priv-&gt;lk_healq, &amp;healq);</div><div class='add'>+    }</div><div class='add'>+    UNLOCK(&amp;priv-&gt;lock);</div><div class='add'>+</div><div class='add'>+    list_for_each_entry_safe(info, tmp, &amp;healq, pos)</div><div class='add'>+    {</div><div class='add'>+        GF_ASSERT((AFR_COUNT(info-&gt;locked_nodes, priv-&gt;child_count) &lt;</div><div class='add'>+                   priv-&gt;child_count));</div><div class='add'>+        ((afr_local_t *)(iter_frame-&gt;local))-&gt;fd = fd_ref(info-&gt;fd);</div><div class='add'>+        afr_lock_heal_do(iter_frame, priv, info);</div><div class='add'>+        AFR_STACK_RESET(iter_frame);</div><div class='add'>+        if (iter_frame-&gt;local == NULL) {</div><div class='add'>+            ret = ENOTCONN;</div><div class='add'>+            gf_msg(frame-&gt;this-&gt;name, GF_LOG_ERROR, ENOTCONN,</div><div class='add'>+                   AFR_MSG_LK_HEAL_DOM,</div><div class='add'>+                   "Aborting processing of lk_healq."</div><div class='add'>+                   "Healing will be reattempted on next child up for locks "</div><div class='add'>+                   "that are still in quorum.");</div><div class='add'>+            LOCK(&amp;priv-&gt;lock);</div><div class='add'>+            {</div><div class='add'>+                list_add_tail(&amp;healq, &amp;priv-&gt;lk_healq);</div><div class='add'>+            }</div><div class='add'>+            UNLOCK(&amp;priv-&gt;lock);</div><div class='add'>+            break;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-void</div><div class='del'>-afr_set_opendir_done (xlator_t *this, inode_t *inode)</div><div class='add'>+    AFR_STACK_DESTROY(iter_frame);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+__afr_lock_heal_synctask(xlator_t *this, afr_private_t *priv, int child)</div><div class='ctx'> {</div><div class='del'>-        uint64_t ctx = 0;</div><div class='del'>-        int      ret = 0;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    call_frame_t *frame = NULL;</div><div class='add'>+    afr_lk_heal_info_t *info = NULL;</div><div class='add'>+    afr_lk_heal_info_t *tmp = NULL;</div><div class='ctx'> </div><div class='del'>-        VALIDATE_OR_GOTO (inode, out);</div><div class='add'>+    if (priv-&gt;shd.iamshd)</div><div class='add'>+        return 0;</div><div class='ctx'> </div><div class='del'>-        LOCK (&amp;inode-&gt;lock);</div><div class='del'>-        {</div><div class='del'>-                ret = __inode_ctx_get (inode, this, &amp;ctx);</div><div class='add'>+    list_for_each_entry_safe(info, tmp, &amp;priv-&gt;saved_locks, pos)</div><div class='add'>+    {</div><div class='add'>+        info-&gt;child_up_event_gen[child] = priv-&gt;event_generation;</div><div class='add'>+        list_del_init(&amp;info-&gt;pos);</div><div class='add'>+        list_add_tail(&amp;info-&gt;pos, &amp;priv-&gt;lk_healq);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-                if (ret &lt; 0) {</div><div class='del'>-                        ctx = 0;</div><div class='del'>-                }</div><div class='add'>+    frame = create_frame(this, this-&gt;ctx-&gt;pool);</div><div class='add'>+    if (!frame)</div><div class='add'>+        return -1;</div><div class='ctx'> </div><div class='del'>-                ctx = (~AFR_ICTX_OPENDIR_DONE_MASK &amp; ctx)</div><div class='del'>-                        | (0xFFFFFFFFFFFFFFFFULL &amp; AFR_ICTX_OPENDIR_DONE_MASK);</div><div class='add'>+    ret = synctask_new(this-&gt;ctx-&gt;env, afr_lock_heal, afr_lock_heal_done, frame,</div><div class='add'>+                       frame);</div><div class='add'>+    if (ret)</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_ERROR, ENOMEM, AFR_MSG_LK_HEAL_DOM,</div><div class='add'>+               "Failed to launch lock heal synctask");</div><div class='ctx'> </div><div class='del'>-                __inode_ctx_put (inode, this, ctx);</div><div class='del'>-        }</div><div class='del'>-        UNLOCK (&amp;inode-&gt;lock);</div><div class='del'>-out:</div><div class='del'>-        return;</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='del'>-uint64_t</div><div class='del'>-afr_read_child (xlator_t *this, inode_t *inode)</div><div class='add'>+static int</div><div class='add'>+__afr_mark_pending_lk_heal(xlator_t *this, afr_private_t *priv, int child)</div><div class='ctx'> {</div><div class='del'>-        int ret = 0;</div><div class='del'>-</div><div class='del'>-        uint64_t ctx         = 0;</div><div class='del'>-        uint64_t read_child  = 0;</div><div class='add'>+    afr_lk_heal_info_t *info = NULL;</div><div class='add'>+    afr_lk_heal_info_t *tmp = NULL;</div><div class='ctx'> </div><div class='del'>-        VALIDATE_OR_GOTO (inode, out);</div><div class='add'>+    if (priv-&gt;shd.iamshd)</div><div class='add'>+        return 0;</div><div class='add'>+    list_for_each_entry_safe(info, tmp, &amp;priv-&gt;saved_locks, pos)</div><div class='add'>+    {</div><div class='add'>+        info-&gt;child_down_event_gen[child] = priv-&gt;event_generation;</div><div class='add'>+        if (info-&gt;locked_nodes[child] == 1)</div><div class='add'>+            info-&gt;locked_nodes[child] = 0;</div><div class='add'>+        if (!afr_has_quorum(info-&gt;locked_nodes, this, NULL)) {</div><div class='add'>+            /* Since the lock was lost on quorum no. of nodes, we should</div><div class='add'>+             * not attempt to heal it anymore. Some other client could have</div><div class='add'>+             * acquired the lock, modified data and released it and this</div><div class='add'>+             * client wouldn't know about it if we heal it.*/</div><div class='add'>+            afr_mark_fd_bad(info-&gt;fd, this);</div><div class='add'>+            list_del(&amp;info-&gt;pos);</div><div class='add'>+            afr_lk_heal_info_cleanup(info);</div><div class='add'>+            /* We're not winding an unlock on the node where the lock is still</div><div class='add'>+             * present because when fencing logic switches over to the new</div><div class='add'>+             * client (since we marked the fd bad), it should preempt any</div><div class='add'>+             * existing lock. */</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        LOCK (&amp;inode-&gt;lock);</div><div class='del'>-        {</div><div class='del'>-                ret = __inode_ctx_get (inode, this, &amp;ctx);</div><div class='add'>+gf_boolean_t</div><div class='add'>+afr_is_consistent_io_possible(afr_local_t *local, afr_private_t *priv,</div><div class='add'>+                              int32_t *op_errno)</div><div class='add'>+{</div><div class='add'>+    if (priv-&gt;consistent_io &amp;&amp; local-&gt;call_count != priv-&gt;child_count) {</div><div class='add'>+        gf_msg(THIS-&gt;name, GF_LOG_INFO, 0, AFR_MSG_SUBVOLS_DOWN,</div><div class='add'>+               "All subvolumes are not up");</div><div class='add'>+        if (op_errno)</div><div class='add'>+            *op_errno = ENOTCONN;</div><div class='add'>+        return _gf_false;</div><div class='add'>+    }</div><div class='add'>+    return _gf_true;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-                if (ret &lt; 0)</div><div class='del'>-                        goto unlock;</div><div class='add'>+gf_boolean_t</div><div class='add'>+afr_is_lock_mode_mandatory(dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+    uint32_t lk_mode = GF_LK_ADVISORY;</div><div class='ctx'> </div><div class='del'>-                read_child = ctx &amp; AFR_ICTX_READ_CHILD_MASK;</div><div class='del'>-        }</div><div class='del'>-unlock:</div><div class='del'>-        UNLOCK (&amp;inode-&gt;lock);</div><div class='add'>+    ret = dict_get_uint32(xdata, GF_LOCK_MODE, &amp;lk_mode);</div><div class='add'>+    if (!ret &amp;&amp; lk_mode == GF_LK_MANDATORY)</div><div class='add'>+        return _gf_true;</div><div class='ctx'> </div><div class='del'>-out:</div><div class='del'>-        return read_child;</div><div class='add'>+    return _gf_false;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+call_frame_t *</div><div class='add'>+afr_copy_frame(call_frame_t *base)</div><div class='add'>+{</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    call_frame_t *frame = NULL;</div><div class='add'>+    int op_errno = 0;</div><div class='add'>+</div><div class='add'>+    frame = copy_frame(base);</div><div class='add'>+    if (!frame)</div><div class='add'>+        return NULL;</div><div class='add'>+    local = AFR_FRAME_INIT(frame, op_errno);</div><div class='add'>+    if (!local) {</div><div class='add'>+        AFR_STACK_DESTROY(frame);</div><div class='add'>+        return NULL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return frame;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-void</div><div class='del'>-afr_set_read_child (xlator_t *this, inode_t *inode, int32_t read_child)</div><div class='add'>+/* Check if an entry or inode could be undergoing a transaction. */</div><div class='add'>+gf_boolean_t</div><div class='add'>+afr_is_possibly_under_txn(afr_transaction_type type, afr_local_t *local,</div><div class='add'>+                          xlator_t *this)</div><div class='ctx'> {</div><div class='del'>-        uint64_t ctx = 0;</div><div class='del'>-        int      ret = 0;</div><div class='add'>+    int i = 0;</div><div class='add'>+    int tmp = 0;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    GF_UNUSED char *key = NULL;</div><div class='add'>+    int keylen = 0;</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    if (type == AFR_ENTRY_TRANSACTION) {</div><div class='add'>+        key = GLUSTERFS_PARENT_ENTRYLK;</div><div class='add'>+        keylen = SLEN(GLUSTERFS_PARENT_ENTRYLK);</div><div class='add'>+    } else if (type == AFR_DATA_TRANSACTION) {</div><div class='add'>+        /*FIXME: Use GLUSTERFS_INODELK_DOM_COUNT etc. once</div><div class='add'>+         * pl_inodelk_xattr_fill supports separate keys for different</div><div class='add'>+         * domains.*/</div><div class='add'>+        key = GLUSTERFS_INODELK_COUNT;</div><div class='add'>+        keylen = SLEN(GLUSTERFS_INODELK_COUNT);</div><div class='add'>+    }</div><div class='add'>+    for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+        if (!local-&gt;replies[i].xdata)</div><div class='add'>+            continue;</div><div class='add'>+        if (dict_get_int32n(local-&gt;replies[i].xdata, key, keylen, &amp;tmp) == 0)</div><div class='add'>+            if (tmp)</div><div class='add'>+                return _gf_true;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return _gf_false;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        VALIDATE_OR_GOTO (inode, out);</div><div class='add'>+static void</div><div class='add'>+afr_inode_ctx_destroy(afr_inode_ctx_t *ctx)</div><div class='add'>+{</div><div class='add'>+    int i = 0;</div><div class='ctx'> </div><div class='del'>-        LOCK (&amp;inode-&gt;lock);</div><div class='del'>-        {</div><div class='del'>-                ret = __inode_ctx_get (inode, this, &amp;ctx);</div><div class='add'>+    if (!ctx)</div><div class='add'>+        return;</div><div class='ctx'> </div><div class='del'>-                if (ret &lt; 0) {</div><div class='del'>-                        ctx = 0;</div><div class='del'>-                }</div><div class='add'>+    for (i = 0; i &lt; AFR_NUM_CHANGE_LOGS; i++) {</div><div class='add'>+        GF_FREE(ctx-&gt;pre_op_done[i]);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-                ctx = (~AFR_ICTX_READ_CHILD_MASK &amp; ctx)</div><div class='del'>-                        | (AFR_ICTX_READ_CHILD_MASK &amp; read_child);</div><div class='add'>+    GF_FREE(ctx);</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-                __inode_ctx_put (inode, this, ctx);</div><div class='add'>+int</div><div class='add'>+__afr_inode_ctx_get(xlator_t *this, inode_t *inode, afr_inode_ctx_t **ctx)</div><div class='add'>+{</div><div class='add'>+    uint64_t ctx_int = 0;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int i = -1;</div><div class='add'>+    int num_locks = -1;</div><div class='add'>+    afr_inode_ctx_t *ictx = NULL;</div><div class='add'>+    afr_lock_t *lock = NULL;</div><div class='add'>+    afr_private_t *priv = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    ret = __inode_ctx_get(inode, this, &amp;ctx_int);</div><div class='add'>+    if (ret == 0) {</div><div class='add'>+        *ctx = (afr_inode_ctx_t *)(uintptr_t)ctx_int;</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ictx = GF_CALLOC(1, sizeof(afr_inode_ctx_t), gf_afr_mt_inode_ctx_t);</div><div class='add'>+    if (!ictx)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; AFR_NUM_CHANGE_LOGS; i++) {</div><div class='add'>+        ictx-&gt;pre_op_done[i] = GF_CALLOC(sizeof *ictx-&gt;pre_op_done[i],</div><div class='add'>+                                         priv-&gt;child_count, gf_afr_mt_int32_t);</div><div class='add'>+        if (!ictx-&gt;pre_op_done[i]) {</div><div class='add'>+            ret = -ENOMEM;</div><div class='add'>+            goto out;</div><div class='ctx'>         }</div><div class='del'>-        UNLOCK (&amp;inode-&gt;lock);</div><div class='del'>-</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    num_locks = sizeof(ictx-&gt;lock) / sizeof(afr_lock_t);</div><div class='add'>+    for (i = 0; i &lt; num_locks; i++) {</div><div class='add'>+        lock = &amp;ictx-&gt;lock[i];</div><div class='add'>+        INIT_LIST_HEAD(&amp;lock-&gt;post_op);</div><div class='add'>+        INIT_LIST_HEAD(&amp;lock-&gt;frozen);</div><div class='add'>+        INIT_LIST_HEAD(&amp;lock-&gt;waiting);</div><div class='add'>+        INIT_LIST_HEAD(&amp;lock-&gt;owners);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ctx_int = (uint64_t)(uintptr_t)ictx;</div><div class='add'>+    ret = __inode_ctx_set(inode, this, &amp;ctx_int);</div><div class='add'>+    if (ret) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ictx-&gt;spb_choice = -1;</div><div class='add'>+    ictx-&gt;read_subvol = 0;</div><div class='add'>+    ictx-&gt;write_subvol = 0;</div><div class='add'>+    ictx-&gt;lock_count = 0;</div><div class='add'>+    ret = 0;</div><div class='add'>+    *ctx = ictx;</div><div class='ctx'> out:</div><div class='del'>-        return;</div><div class='add'>+    if (ret) {</div><div class='add'>+        afr_inode_ctx_destroy(ictx);</div><div class='add'>+    }</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='del'>-/**</div><div class='del'>- * afr_local_cleanup - cleanup everything in frame-&gt;local</div><div class='add'>+/*</div><div class='add'>+ * INODE CTX 64-bit VALUE FORMAT FOR SMALL (&lt;= 16) SUBVOL COUNTS:</div><div class='add'>+ *</div><div class='add'>+ * |&lt;----------   64bit   ------------&gt;|</div><div class='add'>+ *  63           32 31    16 15       0</div><div class='add'>+ * |   EVENT_GEN   |  DATA  | METADATA |</div><div class='add'>+ *</div><div class='add'>+ *</div><div class='add'>+ *  METADATA (bit-0 .. bit-15): bitmap representing subvolumes from which</div><div class='add'>+ *                              metadata can be attempted to be read.</div><div class='add'>+ *</div><div class='add'>+ *                              bit-0 =&gt; priv-&gt;subvolumes[0]</div><div class='add'>+ *                              bit-1 =&gt; priv-&gt;subvolumes[1]</div><div class='add'>+ *                              ... etc. till bit-15</div><div class='add'>+ *</div><div class='add'>+ *  DATA (bit-16 .. bit-31): bitmap representing subvolumes from which data</div><div class='add'>+ *                           can be attempted to be read.</div><div class='add'>+ *</div><div class='add'>+ *                           bit-16 =&gt; priv-&gt;subvolumes[0]</div><div class='add'>+ *                           bit-17 =&gt; priv-&gt;subvolumes[1]</div><div class='add'>+ *                           ... etc. till bit-31</div><div class='add'>+ *</div><div class='add'>+ *  EVENT_GEN (bit-32 .. bit-63): event generation (i.e priv-&gt;event_generation)</div><div class='add'>+ *                                when DATA and METADATA was last updated.</div><div class='add'>+ *</div><div class='add'>+ *                                If EVENT_GEN is &lt; priv-&gt;event_generation,</div><div class='add'>+ *                                or is 0, it means afr_inode_refresh() needs</div><div class='add'>+ *                                to be called to recalculate the bitmaps.</div><div class='ctx'>  */</div><div class='ctx'> </div><div class='del'>-void</div><div class='del'>-afr_local_sh_cleanup (afr_local_t *local, xlator_t *this)</div><div class='add'>+int</div><div class='add'>+__afr_set_in_flight_sb_status(xlator_t *this, afr_local_t *local,</div><div class='add'>+                              inode_t *inode)</div><div class='ctx'> {</div><div class='del'>-	afr_self_heal_t *sh = NULL;</div><div class='del'>-	afr_private_t   *priv = NULL;</div><div class='del'>-	int              i = 0;</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-	sh = &amp;local-&gt;self_heal;</div><div class='del'>-	priv = this-&gt;private;</div><div class='del'>-</div><div class='del'>-	if (sh-&gt;buf)</div><div class='del'>-		GF_FREE (sh-&gt;buf);</div><div class='del'>-</div><div class='del'>-	if (sh-&gt;xattr) {</div><div class='del'>-		for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='del'>-			if (sh-&gt;xattr[i]) {</div><div class='del'>-				dict_unref (sh-&gt;xattr[i]);</div><div class='del'>-				sh-&gt;xattr[i] = NULL;</div><div class='del'>-			}</div><div class='del'>-		}</div><div class='del'>-		GF_FREE (sh-&gt;xattr);</div><div class='del'>-	}</div><div class='add'>+    int i = 0;</div><div class='add'>+    int txn_type = 0;</div><div class='add'>+    int count = 0;</div><div class='add'>+    int index = -1;</div><div class='add'>+    uint16_t datamap_old = 0;</div><div class='add'>+    uint16_t metadatamap_old = 0;</div><div class='add'>+    uint16_t datamap = 0;</div><div class='add'>+    uint16_t metadatamap = 0;</div><div class='add'>+    uint16_t tmp_map = 0;</div><div class='add'>+    uint16_t mask = 0;</div><div class='add'>+    uint32_t event = 0;</div><div class='add'>+    uint64_t val = 0;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+    txn_type = local-&gt;transaction.type;</div><div class='add'>+</div><div class='add'>+    if (txn_type == AFR_DATA_TRANSACTION)</div><div class='add'>+        val = local-&gt;inode_ctx-&gt;write_subvol;</div><div class='add'>+    else</div><div class='add'>+        val = local-&gt;inode_ctx-&gt;read_subvol;</div><div class='add'>+</div><div class='add'>+    metadatamap_old = metadatamap = (val &amp; 0x000000000000ffff);</div><div class='add'>+    datamap_old = datamap = (val &amp; 0x00000000ffff0000) &gt;&gt; 16;</div><div class='add'>+    event = (val &amp; 0xffffffff00000000) &gt;&gt; 32;</div><div class='add'>+</div><div class='add'>+    if (txn_type == AFR_DATA_TRANSACTION)</div><div class='add'>+        tmp_map = datamap;</div><div class='add'>+    else if (txn_type == AFR_METADATA_TRANSACTION)</div><div class='add'>+        tmp_map = metadatamap;</div><div class='add'>+</div><div class='add'>+    count = gf_bits_count(tmp_map);</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+        if (!local-&gt;transaction.failed_subvols[i])</div><div class='add'>+            continue;</div><div class='add'>+</div><div class='add'>+        mask = 1 &lt;&lt; i;</div><div class='add'>+        if (txn_type == AFR_METADATA_TRANSACTION)</div><div class='add'>+            metadatamap &amp;= ~mask;</div><div class='add'>+        else if (txn_type == AFR_DATA_TRANSACTION)</div><div class='add'>+            datamap &amp;= ~mask;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    switch (txn_type) {</div><div class='add'>+        case AFR_METADATA_TRANSACTION:</div><div class='add'>+            if ((metadatamap_old != 0) &amp;&amp; (metadatamap == 0) &amp;&amp; (count == 1)) {</div><div class='add'>+                index = gf_bits_index(tmp_map);</div><div class='add'>+                local-&gt;transaction.in_flight_sb_errno = local-&gt;replies[index]</div><div class='add'>+                                                            .op_errno;</div><div class='add'>+                local-&gt;transaction.in_flight_sb = _gf_true;</div><div class='add'>+                metadatamap |= (1 &lt;&lt; index);</div><div class='add'>+            }</div><div class='add'>+            if (metadatamap_old != metadatamap) {</div><div class='add'>+                __afr_inode_need_refresh_set(inode, this);</div><div class='add'>+            }</div><div class='add'>+            break;</div><div class='add'>+</div><div class='add'>+        case AFR_DATA_TRANSACTION:</div><div class='add'>+            if ((datamap_old != 0) &amp;&amp; (datamap == 0) &amp;&amp; (count == 1)) {</div><div class='add'>+                index = gf_bits_index(tmp_map);</div><div class='add'>+                local-&gt;transaction.in_flight_sb_errno = local-&gt;replies[index]</div><div class='add'>+                                                            .op_errno;</div><div class='add'>+                local-&gt;transaction.in_flight_sb = _gf_true;</div><div class='add'>+                datamap |= (1 &lt;&lt; index);</div><div class='add'>+            }</div><div class='add'>+            if (datamap_old != datamap)</div><div class='add'>+                __afr_inode_need_refresh_set(inode, this);</div><div class='add'>+            break;</div><div class='add'>+</div><div class='add'>+        default:</div><div class='add'>+            break;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    val = ((uint64_t)metadatamap) | (((uint64_t)datamap) &lt;&lt; 16) |</div><div class='add'>+          (((uint64_t)event) &lt;&lt; 32);</div><div class='add'>+</div><div class='add'>+    if (txn_type == AFR_DATA_TRANSACTION)</div><div class='add'>+        local-&gt;inode_ctx-&gt;write_subvol = val;</div><div class='add'>+    local-&gt;inode_ctx-&gt;read_subvol = val;</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	if (sh-&gt;child_errno)</div><div class='del'>-		GF_FREE (sh-&gt;child_errno);</div><div class='add'>+gf_boolean_t</div><div class='add'>+afr_is_symmetric_error(call_frame_t *frame, xlator_t *this)</div><div class='add'>+{</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    int op_errno = 0;</div><div class='add'>+    int i_errno = 0;</div><div class='add'>+    gf_boolean_t matching_errors = _gf_true;</div><div class='add'>+    int i = 0;</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+        if (!local-&gt;replies[i].valid)</div><div class='add'>+            continue;</div><div class='add'>+        if (local-&gt;replies[i].op_ret != -1) {</div><div class='add'>+            /* Operation succeeded on at least one subvol,</div><div class='add'>+               so it is not a failed-everywhere situation.</div><div class='add'>+            */</div><div class='add'>+            matching_errors = _gf_false;</div><div class='add'>+            break;</div><div class='add'>+        }</div><div class='add'>+        i_errno = local-&gt;replies[i].op_errno;</div><div class='add'>+</div><div class='add'>+        if (i_errno == ENOTCONN) {</div><div class='add'>+            /* ENOTCONN is not a symmetric error. We do not</div><div class='add'>+               know if the operation was performed on the</div><div class='add'>+               backend or not.</div><div class='add'>+            */</div><div class='add'>+            matching_errors = _gf_false;</div><div class='add'>+            break;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-	if (sh-&gt;pending_matrix) {</div><div class='del'>-		for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='del'>-			GF_FREE (sh-&gt;pending_matrix[i]);</div><div class='del'>-		}</div><div class='del'>-		GF_FREE (sh-&gt;pending_matrix);</div><div class='del'>-	}</div><div class='add'>+        if (!op_errno) {</div><div class='add'>+            op_errno = i_errno;</div><div class='add'>+        } else if (op_errno != i_errno) {</div><div class='add'>+            /* Mismatching op_errno's */</div><div class='add'>+            matching_errors = _gf_false;</div><div class='add'>+            break;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	if (sh-&gt;delta_matrix) {</div><div class='del'>-		for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='del'>-			GF_FREE (sh-&gt;delta_matrix[i]);</div><div class='del'>-		}</div><div class='del'>-		GF_FREE (sh-&gt;delta_matrix);</div><div class='del'>-	}</div><div class='add'>+    return matching_errors;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	if (sh-&gt;sources)</div><div class='del'>-		GF_FREE (sh-&gt;sources);</div><div class='add'>+int</div><div class='add'>+afr_set_in_flight_sb_status(xlator_t *this, call_frame_t *frame, inode_t *inode)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='ctx'> </div><div class='del'>-	if (sh-&gt;success)</div><div class='del'>-		GF_FREE (sh-&gt;success);</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+    local = frame-&gt;local;</div><div class='ctx'> </div><div class='del'>-	if (sh-&gt;locked_nodes)</div><div class='del'>-		GF_FREE (sh-&gt;locked_nodes);</div><div class='add'>+    /* If this transaction saw no failures, then exit. */</div><div class='add'>+    if (AFR_COUNT(local-&gt;transaction.failed_subvols, priv-&gt;child_count) == 0)</div><div class='add'>+        return 0;</div><div class='ctx'> </div><div class='del'>-	if (sh-&gt;healing_fd &amp;&amp; !sh-&gt;healing_fd_opened) {</div><div class='del'>-		fd_unref (sh-&gt;healing_fd);</div><div class='del'>-		sh-&gt;healing_fd = NULL;</div><div class='del'>-	}</div><div class='add'>+    if (afr_is_symmetric_error(frame, this))</div><div class='add'>+        return 0;</div><div class='ctx'> </div><div class='del'>-        if (sh-&gt;linkname)</div><div class='del'>-                GF_FREE ((char *)sh-&gt;linkname);</div><div class='add'>+    LOCK(&amp;inode-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        ret = __afr_set_in_flight_sb_status(this, local, inode);</div><div class='add'>+    }</div><div class='add'>+    UNLOCK(&amp;inode-&gt;lock);</div><div class='ctx'> </div><div class='del'>-	loc_wipe (&amp;sh-&gt;parent_loc);</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='del'>-void</div><div class='del'>-afr_local_transaction_cleanup (afr_local_t *local, xlator_t *this)</div><div class='add'>+int</div><div class='add'>+__afr_inode_read_subvol_get_small(inode_t *inode, xlator_t *this,</div><div class='add'>+                                  unsigned char *data, unsigned char *metadata,</div><div class='add'>+                                  int *event_p)</div><div class='ctx'> {</div><div class='del'>-        int             i = 0;</div><div class='del'>-        afr_private_t * priv = NULL;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    uint16_t datamap = 0;</div><div class='add'>+    uint16_t metadatamap = 0;</div><div class='add'>+    uint32_t event = 0;</div><div class='add'>+    uint64_t val = 0;</div><div class='add'>+    int i = 0;</div><div class='add'>+    afr_inode_ctx_t *ctx = NULL;</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    ret = __afr_inode_ctx_get(this, inode, &amp;ctx);</div><div class='add'>+    if (ret &lt; 0)</div><div class='add'>+        return ret;</div><div class='ctx'> </div><div class='del'>-        priv = this-&gt;private;</div><div class='add'>+    val = ctx-&gt;read_subvol;</div><div class='ctx'> </div><div class='del'>-        for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='del'>-                if (local-&gt;pending &amp;&amp; local-&gt;pending[i])</div><div class='del'>-                        GF_FREE (local-&gt;pending[i]);</div><div class='del'>-        }</div><div class='add'>+    metadatamap = (val &amp; 0x000000000000ffff);</div><div class='add'>+    datamap = (val &amp; 0x00000000ffff0000) &gt;&gt; 16;</div><div class='add'>+    event = (val &amp; 0xffffffff00000000) &gt;&gt; 32;</div><div class='ctx'> </div><div class='del'>-        GF_FREE (local-&gt;pending);</div><div class='add'>+    for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+        if (metadata)</div><div class='add'>+            metadata[i] = (metadatamap &gt;&gt; i) &amp; 1;</div><div class='add'>+        if (data)</div><div class='add'>+            data[i] = (datamap &gt;&gt; i) &amp; 1;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        if (local-&gt;internal_lock.locked_nodes)</div><div class='del'>-                GF_FREE (local-&gt;internal_lock.locked_nodes);</div><div class='add'>+    if (event_p)</div><div class='add'>+        *event_p = event;</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        if (local-&gt;internal_lock.inode_locked_nodes)</div><div class='del'>-                GF_FREE (local-&gt;internal_lock.inode_locked_nodes);</div><div class='add'>+int</div><div class='add'>+__afr_inode_read_subvol_set_small(inode_t *inode, xlator_t *this,</div><div class='add'>+                                  unsigned char *data, unsigned char *metadata,</div><div class='add'>+                                  int event)</div><div class='add'>+{</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    uint16_t datamap = 0;</div><div class='add'>+    uint16_t metadatamap = 0;</div><div class='add'>+    uint64_t val = 0;</div><div class='add'>+    int i = 0;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    afr_inode_ctx_t *ctx = NULL;</div><div class='ctx'> </div><div class='del'>-        if (local-&gt;internal_lock.entry_locked_nodes)</div><div class='del'>-                GF_FREE (local-&gt;internal_lock.entry_locked_nodes);</div><div class='add'>+    priv = this-&gt;private;</div><div class='ctx'> </div><div class='del'>-        if (local-&gt;internal_lock.lower_locked_nodes)</div><div class='del'>-                GF_FREE (local-&gt;internal_lock.lower_locked_nodes);</div><div class='add'>+    ret = __afr_inode_ctx_get(this, inode, &amp;ctx);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='ctx'> </div><div class='add'>+    for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+        if (data[i])</div><div class='add'>+            datamap |= (1 &lt;&lt; i);</div><div class='add'>+        if (metadata[i])</div><div class='add'>+            metadatamap |= (1 &lt;&lt; i);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	GF_FREE (local-&gt;transaction.child_errno);</div><div class='del'>-	GF_FREE (local-&gt;child_errno);</div><div class='add'>+    val = ((uint64_t)metadatamap) | (((uint64_t)datamap) &lt;&lt; 16) |</div><div class='add'>+          (((uint64_t)event) &lt;&lt; 32);</div><div class='ctx'> </div><div class='del'>-	GF_FREE (local-&gt;transaction.basename);</div><div class='del'>-	GF_FREE (local-&gt;transaction.new_basename);</div><div class='add'>+    ctx-&gt;read_subvol = val;</div><div class='ctx'> </div><div class='del'>-	loc_wipe (&amp;local-&gt;transaction.parent_loc);</div><div class='del'>-	loc_wipe (&amp;local-&gt;transaction.new_parent_loc);</div><div class='add'>+    ret = 0;</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='del'>-void</div><div class='del'>-afr_local_cleanup (afr_local_t *local, xlator_t *this)</div><div class='add'>+int</div><div class='add'>+__afr_inode_read_subvol_get(inode_t *inode, xlator_t *this, unsigned char *data,</div><div class='add'>+                            unsigned char *metadata, int *event_p)</div><div class='ctx'> {</div><div class='del'>-        int i;</div><div class='del'>-        afr_private_t * priv = NULL;</div><div class='del'>-</div><div class='del'>-	if (!local)</div><div class='del'>-		return;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    int ret = -1;</div><div class='ctx'> </div><div class='del'>-	afr_local_sh_cleanup (local, this);</div><div class='add'>+    priv = this-&gt;private;</div><div class='ctx'> </div><div class='del'>-        afr_local_transaction_cleanup (local, this);</div><div class='add'>+    if (priv-&gt;child_count &lt;= 16)</div><div class='add'>+        ret = __afr_inode_read_subvol_get_small(inode, this, data, metadata,</div><div class='add'>+                                                event_p);</div><div class='add'>+    else</div><div class='add'>+        /* TBD: allocate structure with array and read from it */</div><div class='add'>+        ret = -1;</div><div class='ctx'> </div><div class='del'>-        priv = this-&gt;private;</div><div class='del'>-</div><div class='del'>-	loc_wipe (&amp;local-&gt;loc);</div><div class='del'>-	loc_wipe (&amp;local-&gt;newloc);</div><div class='del'>-</div><div class='del'>-	if (local-&gt;fd)</div><div class='del'>-		fd_unref (local-&gt;fd);</div><div class='del'>-</div><div class='del'>-	if (local-&gt;xattr_req)</div><div class='del'>-		dict_unref (local-&gt;xattr_req);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	GF_FREE (local-&gt;child_up);</div><div class='add'>+int</div><div class='add'>+__afr_inode_split_brain_choice_get(inode_t *inode, xlator_t *this,</div><div class='add'>+                                   int *spb_choice)</div><div class='add'>+{</div><div class='add'>+    afr_inode_ctx_t *ctx = NULL;</div><div class='add'>+    int ret = -1;</div><div class='ctx'> </div><div class='del'>-	{ /* lookup */</div><div class='del'>-                if (local-&gt;cont.lookup.xattrs) {</div><div class='del'>-                        for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='del'>-                                if (local-&gt;cont.lookup.xattrs[i]) {</div><div class='del'>-                                        dict_unref (local-&gt;cont.lookup.xattrs[i]);</div><div class='del'>-                                        local-&gt;cont.lookup.xattrs[i] = NULL;</div><div class='del'>-                                }</div><div class='del'>-                        }</div><div class='del'>-                        GF_FREE (local-&gt;cont.lookup.xattrs);</div><div class='del'>-                        local-&gt;cont.lookup.xattrs = NULL;</div><div class='del'>-                }</div><div class='add'>+    ret = __afr_inode_ctx_get(this, inode, &amp;ctx);</div><div class='add'>+    if (ret &lt; 0)</div><div class='add'>+        return ret;</div><div class='ctx'> </div><div class='del'>-		if (local-&gt;cont.lookup.xattr) {</div><div class='del'>-                        dict_unref (local-&gt;cont.lookup.xattr);</div><div class='del'>-                }</div><div class='add'>+    *spb_choice = ctx-&gt;spb_choice;</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-                if (local-&gt;cont.lookup.inode) {</div><div class='del'>-                        inode_unref (local-&gt;cont.lookup.inode);</div><div class='del'>-                }</div><div class='del'>-	}</div><div class='add'>+int</div><div class='add'>+__afr_inode_read_subvol_set(inode_t *inode, xlator_t *this, unsigned char *data,</div><div class='add'>+                            unsigned char *metadata, int event)</div><div class='add'>+{</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    int ret = -1;</div><div class='ctx'> </div><div class='del'>-	{ /* getxattr */</div><div class='del'>-		if (local-&gt;cont.getxattr.name)</div><div class='del'>-			GF_FREE (local-&gt;cont.getxattr.name);</div><div class='del'>-	}</div><div class='add'>+    priv = this-&gt;private;</div><div class='ctx'> </div><div class='del'>-	{ /* lk */</div><div class='del'>-		if (local-&gt;cont.lk.locked_nodes)</div><div class='del'>-			GF_FREE (local-&gt;cont.lk.locked_nodes);</div><div class='del'>-	}</div><div class='add'>+    if (priv-&gt;child_count &lt;= 16)</div><div class='add'>+        ret = __afr_inode_read_subvol_set_small(inode, this, data, metadata,</div><div class='add'>+                                                event);</div><div class='add'>+    else</div><div class='add'>+        ret = -1;</div><div class='ctx'> </div><div class='del'>-	{ /* create */</div><div class='del'>-		if (local-&gt;cont.create.fd)</div><div class='del'>-			fd_unref (local-&gt;cont.create.fd);</div><div class='del'>-                if (local-&gt;cont.create.params)</div><div class='del'>-                        dict_unref (local-&gt;cont.create.params);</div><div class='del'>-	}</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	{ /* mknod */</div><div class='del'>-                if (local-&gt;cont.mknod.params)</div><div class='del'>-                        dict_unref (local-&gt;cont.mknod.params);</div><div class='del'>-	}</div><div class='add'>+int</div><div class='add'>+__afr_inode_split_brain_choice_set(inode_t *inode, xlator_t *this,</div><div class='add'>+                                   int spb_choice)</div><div class='add'>+{</div><div class='add'>+    afr_inode_ctx_t *ctx = NULL;</div><div class='add'>+    int ret = -1;</div><div class='ctx'> </div><div class='del'>-	{ /* mkdir */</div><div class='del'>-                if (local-&gt;cont.mkdir.params)</div><div class='del'>-                        dict_unref (local-&gt;cont.mkdir.params);</div><div class='del'>-	}</div><div class='add'>+    ret = __afr_inode_ctx_get(this, inode, &amp;ctx);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='ctx'> </div><div class='del'>-	{ /* symlink */</div><div class='del'>-                if (local-&gt;cont.symlink.params)</div><div class='del'>-                        dict_unref (local-&gt;cont.symlink.params);</div><div class='del'>-	}</div><div class='add'>+    ctx-&gt;spb_choice = spb_choice;</div><div class='ctx'> </div><div class='del'>-	{ /* writev */</div><div class='del'>-		GF_FREE (local-&gt;cont.writev.vector);</div><div class='del'>-	}</div><div class='add'>+    ret = 0;</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	{ /* setxattr */</div><div class='del'>-		if (local-&gt;cont.setxattr.dict)</div><div class='del'>-			dict_unref (local-&gt;cont.setxattr.dict);</div><div class='del'>-	}</div><div class='add'>+int</div><div class='add'>+afr_inode_read_subvol_get(inode_t *inode, xlator_t *this, unsigned char *data,</div><div class='add'>+                          unsigned char *metadata, int *event_p)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='ctx'> </div><div class='del'>-	{ /* removexattr */</div><div class='del'>-		GF_FREE (local-&gt;cont.removexattr.name);</div><div class='del'>-	}</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, inode, out);</div><div class='ctx'> </div><div class='del'>-	{ /* symlink */</div><div class='del'>-		GF_FREE (local-&gt;cont.symlink.linkpath);</div><div class='del'>-	}</div><div class='add'>+    LOCK(&amp;inode-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        ret = __afr_inode_read_subvol_get(inode, this, data, metadata, event_p);</div><div class='add'>+    }</div><div class='add'>+    UNLOCK(&amp;inode-&gt;lock);</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        { /* opendir */</div><div class='del'>-                if (local-&gt;cont.opendir.checksum)</div><div class='del'>-                        GF_FREE (local-&gt;cont.opendir.checksum);</div><div class='add'>+int</div><div class='add'>+afr_inode_get_readable(call_frame_t *frame, inode_t *inode, xlator_t *this,</div><div class='add'>+                       unsigned char *readable, int *event_p, int type)</div><div class='add'>+{</div><div class='add'>+    afr_private_t *priv = this-&gt;private;</div><div class='add'>+    afr_local_t *local = frame-&gt;local;</div><div class='add'>+    unsigned char *data = alloca0(priv-&gt;child_count);</div><div class='add'>+    unsigned char *metadata = alloca0(priv-&gt;child_count);</div><div class='add'>+    int data_count = 0;</div><div class='add'>+    int metadata_count = 0;</div><div class='add'>+    int event_generation = 0;</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    ret = afr_inode_read_subvol_get(inode, this, data, metadata,</div><div class='add'>+                                    &amp;event_generation);</div><div class='add'>+    if (ret == -1)</div><div class='add'>+        return -EIO;</div><div class='add'>+</div><div class='add'>+    data_count = AFR_COUNT(data, priv-&gt;child_count);</div><div class='add'>+    metadata_count = AFR_COUNT(metadata, priv-&gt;child_count);</div><div class='add'>+</div><div class='add'>+    if (inode-&gt;ia_type == IA_IFDIR) {</div><div class='add'>+        /* For directories, allow even if it is in data split-brain. */</div><div class='add'>+        if (type == AFR_METADATA_TRANSACTION || local-&gt;op == GF_FOP_STAT ||</div><div class='add'>+            local-&gt;op == GF_FOP_FSTAT) {</div><div class='add'>+            if (!metadata_count)</div><div class='add'>+                return -EIO;</div><div class='add'>+        }</div><div class='add'>+    } else {</div><div class='add'>+        /* For files, abort in case of data/metadata split-brain. */</div><div class='add'>+        if (!data_count || !metadata_count) {</div><div class='add'>+            return -EIO;</div><div class='ctx'>         }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (type == AFR_METADATA_TRANSACTION &amp;&amp; readable)</div><div class='add'>+        memcpy(readable, metadata, priv-&gt;child_count * sizeof *metadata);</div><div class='add'>+    if (type == AFR_DATA_TRANSACTION &amp;&amp; readable) {</div><div class='add'>+        if (!data_count)</div><div class='add'>+            memcpy(readable, local-&gt;child_up,</div><div class='add'>+                   priv-&gt;child_count * sizeof *readable);</div><div class='add'>+        else</div><div class='add'>+            memcpy(readable, data, priv-&gt;child_count * sizeof *data);</div><div class='add'>+    }</div><div class='add'>+    if (event_p)</div><div class='add'>+        *event_p = event_generation;</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+static int</div><div class='add'>+afr_inode_split_brain_choice_get(inode_t *inode, xlator_t *this,</div><div class='add'>+                                 int *spb_choice)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, inode, out);</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;inode-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        ret = __afr_inode_split_brain_choice_get(inode, this, spb_choice);</div><div class='add'>+    }</div><div class='add'>+    UNLOCK(&amp;inode-&gt;lock);</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='add'>+/*</div><div class='add'>+ * frame is used to get the favourite policy. Since</div><div class='add'>+ * afr_inode_split_brain_choice_get was called with afr_open, it is possible to</div><div class='add'>+ * have a frame with out local-&gt;replies. So in that case, frame is passed as</div><div class='add'>+ * null, hence this function will handle the frame NULL case.</div><div class='add'>+ */</div><div class='ctx'> int</div><div class='del'>-afr_frame_return (call_frame_t *frame)</div><div class='add'>+afr_split_brain_read_subvol_get(inode_t *inode, xlator_t *this,</div><div class='add'>+                                call_frame_t *frame, int *spb_subvol)</div><div class='ctx'> {</div><div class='del'>-	afr_local_t *local = NULL;</div><div class='del'>-	int          call_count = 0;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='ctx'> </div><div class='del'>-	local = frame-&gt;local;</div><div class='add'>+    GF_VALIDATE_OR_GOTO("afr", this, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, this-&gt;private, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, inode, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, spb_subvol, out);</div><div class='ctx'> </div><div class='del'>-	LOCK (&amp;frame-&gt;lock);</div><div class='del'>-	{</div><div class='del'>-		call_count = --local-&gt;call_count;</div><div class='del'>-	}</div><div class='del'>-	UNLOCK (&amp;frame-&gt;lock);</div><div class='add'>+    priv = this-&gt;private;</div><div class='ctx'> </div><div class='del'>-	return call_count;</div><div class='add'>+    ret = afr_inode_split_brain_choice_get(inode, this, spb_subvol);</div><div class='add'>+    if (*spb_subvol &lt; 0 &amp;&amp; priv-&gt;fav_child_policy &amp;&amp; frame &amp;&amp; frame-&gt;local) {</div><div class='add'>+        local = frame-&gt;local;</div><div class='add'>+        *spb_subvol = afr_sh_get_fav_by_policy(this, local-&gt;replies, inode,</div><div class='add'>+                                               NULL);</div><div class='add'>+        if (*spb_subvol &gt;= 0) {</div><div class='add'>+            ret = 0;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='add'>+int</div><div class='add'>+afr_inode_read_subvol_set(inode_t *inode, xlator_t *this, unsigned char *data,</div><div class='add'>+                          unsigned char *metadata, int event)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='ctx'> </div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, inode, out);</div><div class='ctx'> </div><div class='del'>-/**</div><div class='del'>- * up_children_count - return the number of children that are up</div><div class='del'>- */</div><div class='add'>+    LOCK(&amp;inode-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        ret = __afr_inode_read_subvol_set(inode, this, data, metadata, event);</div><div class='add'>+    }</div><div class='add'>+    UNLOCK(&amp;inode-&gt;lock);</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-afr_up_children_count (int child_count, unsigned char *child_up)</div><div class='add'>+afr_inode_split_brain_choice_set(inode_t *inode, xlator_t *this, int spb_choice)</div><div class='ctx'> {</div><div class='del'>-	int i   = 0;</div><div class='del'>-	int ret = 0;</div><div class='add'>+    int ret = -1;</div><div class='ctx'> </div><div class='del'>-	for (i = 0; i &lt; child_count; i++)</div><div class='del'>-		if (child_up[i])</div><div class='del'>-			ret++;</div><div class='del'>-	return ret;</div><div class='del'>-}</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, inode, out);</div><div class='ctx'> </div><div class='add'>+    LOCK(&amp;inode-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        ret = __afr_inode_split_brain_choice_set(inode, this, spb_choice);</div><div class='add'>+    }</div><div class='add'>+    UNLOCK(&amp;inode-&gt;lock);</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-ino64_t</div><div class='del'>-afr_itransform (ino64_t ino, int child_count, int child_index)</div><div class='add'>+/* The caller of this should perform afr_inode_refresh, if this function</div><div class='add'>+ * returns _gf_true</div><div class='add'>+ */</div><div class='add'>+gf_boolean_t</div><div class='add'>+afr_is_inode_refresh_reqd(inode_t *inode, xlator_t *this, int event_gen1,</div><div class='add'>+                          int event_gen2)</div><div class='ctx'> {</div><div class='del'>-	ino64_t scaled_ino = -1;</div><div class='add'>+    gf_boolean_t need_refresh = _gf_false;</div><div class='add'>+    afr_inode_ctx_t *ctx = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, inode, out);</div><div class='ctx'> </div><div class='del'>-	if (ino == ((uint64_t) -1)) {</div><div class='del'>-		scaled_ino = ((uint64_t) -1);</div><div class='del'>-		goto out;</div><div class='del'>-	}</div><div class='add'>+    LOCK(&amp;inode-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        ret = __afr_inode_ctx_get(this, inode, &amp;ctx);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto unlock;</div><div class='ctx'> </div><div class='del'>-	scaled_ino = (ino * child_count) + child_index;</div><div class='add'>+        need_refresh = ctx-&gt;need_refresh;</div><div class='add'>+        /* Hoping that the caller will do inode_refresh followed by</div><div class='add'>+         * this, hence setting the need_refresh to false */</div><div class='add'>+        ctx-&gt;need_refresh = _gf_false;</div><div class='add'>+    }</div><div class='add'>+unlock:</div><div class='add'>+    UNLOCK(&amp;inode-&gt;lock);</div><div class='ctx'> </div><div class='add'>+    if (event_gen1 != event_gen2)</div><div class='add'>+        need_refresh = _gf_true;</div><div class='ctx'> out:</div><div class='del'>-	return scaled_ino;</div><div class='add'>+    return need_refresh;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-afr_deitransform_orig (ino64_t ino, int child_count)</div><div class='add'>+__afr_inode_need_refresh_set(inode_t *inode, xlator_t *this)</div><div class='ctx'> {</div><div class='del'>-	int index = -1;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    afr_inode_ctx_t *ctx = NULL;</div><div class='ctx'> </div><div class='del'>-	index = ino % child_count;</div><div class='add'>+    ret = __afr_inode_ctx_get(this, inode, &amp;ctx);</div><div class='add'>+    if (ret == 0) {</div><div class='add'>+        ctx-&gt;need_refresh = _gf_true;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	return index;</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-afr_deitransform (ino64_t ino, int child_count)</div><div class='add'>+afr_inode_need_refresh_set(inode_t *inode, xlator_t *this)</div><div class='ctx'> {</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, inode, out);</div><div class='ctx'> </div><div class='add'>+    LOCK(&amp;inode-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        ret = __afr_inode_need_refresh_set(inode, this);</div><div class='add'>+    }</div><div class='add'>+    UNLOCK(&amp;inode-&gt;lock);</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-afr_self_heal_lookup_unwind (call_frame_t *frame, xlator_t *this)</div><div class='add'>+afr_spb_choice_timeout_cancel(xlator_t *this, inode_t *inode)</div><div class='ctx'> {</div><div class='del'>-	afr_local_t *local = NULL;</div><div class='add'>+    afr_inode_ctx_t *ctx = NULL;</div><div class='add'>+    int ret = -1;</div><div class='ctx'> </div><div class='del'>-	local = frame-&gt;local;</div><div class='add'>+    if (!inode)</div><div class='add'>+        return ret;</div><div class='ctx'> </div><div class='del'>-	if (local-&gt;govinda_gOvinda) {</div><div class='del'>-                afr_set_split_brain (this, local-&gt;cont.lookup.inode, _gf_true);</div><div class='del'>-	}</div><div class='add'>+    LOCK(&amp;inode-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        ret = __afr_inode_ctx_get(this, inode, &amp;ctx);</div><div class='add'>+        if (ret &lt; 0 || !ctx) {</div><div class='add'>+            UNLOCK(&amp;inode-&gt;lock);</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_WARNING, 0,</div><div class='add'>+                   AFR_MSG_SPLIT_BRAIN_CHOICE_ERROR,</div><div class='add'>+                   "Failed to cancel split-brain choice timer.");</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+        ctx-&gt;spb_choice = -1;</div><div class='add'>+        if (ctx-&gt;timer) {</div><div class='add'>+            gf_timer_call_cancel(this-&gt;ctx, ctx-&gt;timer);</div><div class='add'>+            ctx-&gt;timer = NULL;</div><div class='add'>+        }</div><div class='add'>+        ret = 0;</div><div class='add'>+    }</div><div class='add'>+    UNLOCK(&amp;inode-&gt;lock);</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	AFR_STACK_UNWIND (lookup, frame, local-&gt;op_ret, local-&gt;op_errno,</div><div class='del'>-			  local-&gt;cont.lookup.inode,</div><div class='del'>-			  &amp;local-&gt;cont.lookup.buf,</div><div class='del'>-			  local-&gt;cont.lookup.xattr,</div><div class='del'>-                          &amp;local-&gt;cont.lookup.postparent);</div><div class='add'>+void</div><div class='add'>+afr_set_split_brain_choice_cbk(void *data)</div><div class='add'>+{</div><div class='add'>+    inode_t *inode = data;</div><div class='add'>+    xlator_t *this = THIS;</div><div class='ctx'> </div><div class='del'>-	return 0;</div><div class='add'>+    afr_spb_choice_timeout_cancel(this, inode);</div><div class='add'>+    inode_invalidate(inode);</div><div class='add'>+    inode_unref(inode);</div><div class='add'>+    return;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+int</div><div class='add'>+afr_set_split_brain_choice(int ret, call_frame_t *frame, void *opaque)</div><div class='add'>+{</div><div class='add'>+    int op_errno = ENOMEM;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    afr_inode_ctx_t *ctx = NULL;</div><div class='add'>+    inode_t *inode = NULL;</div><div class='add'>+    loc_t *loc = NULL;</div><div class='add'>+    xlator_t *this = NULL;</div><div class='add'>+    afr_spbc_timeout_t *data = opaque;</div><div class='add'>+    struct timespec delta = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    gf_boolean_t timer_set = _gf_false;</div><div class='add'>+    gf_boolean_t timer_cancelled = _gf_false;</div><div class='add'>+    gf_boolean_t timer_reset = _gf_false;</div><div class='add'>+    int old_spb_choice = -1;</div><div class='add'>+</div><div class='add'>+    frame = data-&gt;frame;</div><div class='add'>+    loc = data-&gt;loc;</div><div class='add'>+    this = frame-&gt;this;</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    if (ret) {</div><div class='add'>+        op_errno = -ret;</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    delta.tv_sec = priv-&gt;spb_choice_timeout;</div><div class='add'>+    delta.tv_nsec = 0;</div><div class='add'>+</div><div class='add'>+    if (!loc-&gt;inode) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        op_errno = EINVAL;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (!(data-&gt;d_spb || data-&gt;m_spb)) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_WARNING, 0, AFR_MSG_SPLIT_BRAIN_CHOICE_ERROR,</div><div class='add'>+               "Cannot set "</div><div class='add'>+               "replica.split-brain-choice on %s. File is"</div><div class='add'>+               " not in data/metadata split-brain.",</div><div class='add'>+               uuid_utoa(loc-&gt;gfid));</div><div class='add'>+        ret = -1;</div><div class='add'>+        op_errno = EINVAL;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /*</div><div class='add'>+     * we're ref'ing the inode before LOCK like it is done elsewhere in the</div><div class='add'>+     * code. If we ref after LOCK, coverity complains of possible deadlocks.</div><div class='add'>+     */</div><div class='add'>+    inode = inode_ref(loc-&gt;inode);</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;inode-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        ret = __afr_inode_ctx_get(this, inode, &amp;ctx);</div><div class='add'>+        if (ret) {</div><div class='add'>+            UNLOCK(&amp;inode-&gt;lock);</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, 0,</div><div class='add'>+                   AFR_MSG_SPLIT_BRAIN_CHOICE_ERROR,</div><div class='add'>+                   "Failed to get inode_ctx for %s", loc-&gt;name);</div><div class='add'>+            goto post_unlock;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-static void</div><div class='del'>-afr_lookup_collect_xattr (afr_local_t *local, xlator_t *this,</div><div class='del'>-                          int child_index, dict_t *xattr)</div><div class='add'>+        old_spb_choice = ctx-&gt;spb_choice;</div><div class='add'>+        ctx-&gt;spb_choice = data-&gt;spb_child_index;</div><div class='add'>+</div><div class='add'>+        /* Possible changes in spb-choice :</div><div class='add'>+         *         valid to -1    : cancel timer and unref</div><div class='add'>+         *         valid to valid : cancel timer and inject new one</div><div class='add'>+         *         -1    to -1    : unref and do not do anything</div><div class='add'>+         *         -1 to valid    : inject timer</div><div class='add'>+         */</div><div class='add'>+</div><div class='add'>+        /* ctx-&gt;timer is NULL iff previous value of</div><div class='add'>+         * ctx-&gt;spb_choice is -1</div><div class='add'>+         */</div><div class='add'>+        if (ctx-&gt;timer) {</div><div class='add'>+            if (ctx-&gt;spb_choice == -1) {</div><div class='add'>+                if (!gf_timer_call_cancel(this-&gt;ctx, ctx-&gt;timer)) {</div><div class='add'>+                    ctx-&gt;timer = NULL;</div><div class='add'>+                    timer_cancelled = _gf_true;</div><div class='add'>+                }</div><div class='add'>+                /* If timer cancel failed here it means that the</div><div class='add'>+                 *  previous cbk will be executed which will set</div><div class='add'>+                 *  spb_choice to -1. So we can consider the</div><div class='add'>+                 *  'valid to -1' case to be a success</div><div class='add'>+                 *  (i.e. ret = 0) and goto unlock.</div><div class='add'>+                 */</div><div class='add'>+                goto unlock;</div><div class='add'>+            }</div><div class='add'>+            goto reset_timer;</div><div class='add'>+        } else {</div><div class='add'>+            if (ctx-&gt;spb_choice == -1)</div><div class='add'>+                goto unlock;</div><div class='add'>+            goto set_timer;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+    reset_timer:</div><div class='add'>+        ret = gf_timer_call_cancel(this-&gt;ctx, ctx-&gt;timer);</div><div class='add'>+        if (ret != 0) {</div><div class='add'>+            /* We need to bail out now instead of launching a new</div><div class='add'>+             * timer. Otherwise the cbk of the previous timer event</div><div class='add'>+             * will cancel the new ctx-&gt;timer.</div><div class='add'>+             */</div><div class='add'>+            ctx-&gt;spb_choice = old_spb_choice;</div><div class='add'>+            ret = -1;</div><div class='add'>+            op_errno = EAGAIN;</div><div class='add'>+            goto unlock;</div><div class='add'>+        }</div><div class='add'>+        ctx-&gt;timer = NULL;</div><div class='add'>+        timer_reset = _gf_true;</div><div class='add'>+</div><div class='add'>+    set_timer:</div><div class='add'>+        ctx-&gt;timer = gf_timer_call_after(this-&gt;ctx, delta,</div><div class='add'>+                                         afr_set_split_brain_choice_cbk, inode);</div><div class='add'>+        if (!ctx-&gt;timer) {</div><div class='add'>+            ctx-&gt;spb_choice = old_spb_choice;</div><div class='add'>+            ret = -1;</div><div class='add'>+            op_errno = ENOMEM;</div><div class='add'>+        }</div><div class='add'>+        if (!timer_reset &amp;&amp; ctx-&gt;timer)</div><div class='add'>+            timer_set = _gf_true;</div><div class='add'>+        if (timer_reset &amp;&amp; !ctx-&gt;timer)</div><div class='add'>+            timer_cancelled = _gf_true;</div><div class='add'>+    }</div><div class='add'>+unlock:</div><div class='add'>+    UNLOCK(&amp;inode-&gt;lock);</div><div class='add'>+post_unlock:</div><div class='add'>+    if (!timer_set)</div><div class='add'>+        inode_unref(inode);</div><div class='add'>+    if (timer_cancelled)</div><div class='add'>+        inode_unref(inode);</div><div class='add'>+    /*</div><div class='add'>+     * We need to invalidate the inode to prevent the kernel from serving</div><div class='add'>+     * reads from an older cached value despite a change in spb_choice to</div><div class='add'>+     * a new value.</div><div class='add'>+     */</div><div class='add'>+    inode_invalidate(inode);</div><div class='add'>+out:</div><div class='add'>+    GF_FREE(data);</div><div class='add'>+    AFR_STACK_UNWIND(setxattr, frame, ret, op_errno, NULL);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+afr_accused_fill(xlator_t *this, dict_t *xdata, unsigned char *accused,</div><div class='add'>+                 afr_transaction_type type)</div><div class='ctx'> {</div><div class='del'>-	uint32_t        open_fd_count = 0;</div><div class='del'>-        uint32_t        inodelk_count = 0;</div><div class='del'>-        uint32_t        entrylk_count = 0;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    int i = 0;</div><div class='add'>+    int idx = afr_index_for_transaction_type(type);</div><div class='add'>+    void *pending_raw = NULL;</div><div class='add'>+    int pending[3];</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+        ret = dict_get_ptr(xdata, priv-&gt;pending_key[i], &amp;pending_raw);</div><div class='add'>+        if (ret) /* no pending flags */</div><div class='add'>+            continue;</div><div class='add'>+        memcpy(pending, pending_raw, sizeof(pending));</div><div class='add'>+</div><div class='add'>+        if (ntoh32(pending[idx]))</div><div class='add'>+            accused[i] = 1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        int ret = 0;</div><div class='add'>+int</div><div class='add'>+afr_accuse_smallfiles(xlator_t *this, struct afr_reply *replies,</div><div class='add'>+                      unsigned char *data_accused)</div><div class='add'>+{</div><div class='add'>+    int i = 0;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    uint64_t maxsize = 0;</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+        if (replies[i].valid &amp;&amp; replies[i].xdata &amp;&amp;</div><div class='add'>+            dict_get_sizen(replies[i].xdata, GLUSTERFS_BAD_INODE))</div><div class='add'>+            continue;</div><div class='add'>+        if (data_accused[i])</div><div class='add'>+            continue;</div><div class='add'>+        if (replies[i].poststat.ia_size &gt; maxsize)</div><div class='add'>+            maxsize = replies[i].poststat.ia_size;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+        if (data_accused[i])</div><div class='add'>+            continue;</div><div class='add'>+        if (AFR_IS_ARBITER_BRICK(priv, i))</div><div class='add'>+            continue;</div><div class='add'>+        if (replies[i].poststat.ia_size &lt; maxsize)</div><div class='add'>+            data_accused[i] = 1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        if (afr_sh_has_metadata_pending (xattr, child_index, this)) {</div><div class='del'>-                local-&gt;self_heal.need_metadata_self_heal = _gf_true;</div><div class='del'>-                gf_log(this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-                       "metadata self-heal is pending for %s.",</div><div class='del'>-                       local-&gt;loc.path);</div><div class='add'>+int</div><div class='add'>+afr_readables_fill(call_frame_t *frame, xlator_t *this, inode_t *inode,</div><div class='add'>+                   unsigned char *data_accused, unsigned char *metadata_accused,</div><div class='add'>+                   unsigned char *data_readable,</div><div class='add'>+                   unsigned char *metadata_readable, struct afr_reply *replies)</div><div class='add'>+{</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    dict_t *xdata = NULL;</div><div class='add'>+    int i = 0;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    ia_type_t ia_type = IA_INVAL;</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+        data_readable[i] = 1;</div><div class='add'>+        metadata_readable[i] = 1;</div><div class='add'>+    }</div><div class='add'>+    if (AFR_IS_ARBITER_BRICK(priv, ARBITER_BRICK_INDEX)) {</div><div class='add'>+        data_readable[ARBITER_BRICK_INDEX] = 0;</div><div class='add'>+        metadata_readable[ARBITER_BRICK_INDEX] = 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+        if (replies) { /* Lookup */</div><div class='add'>+            if (!replies[i].valid || replies[i].op_ret == -1 ||</div><div class='add'>+                (replies[i].xdata &amp;&amp;</div><div class='add'>+                 dict_get_sizen(replies[i].xdata, GLUSTERFS_BAD_INODE))) {</div><div class='add'>+                data_readable[i] = 0;</div><div class='add'>+                metadata_readable[i] = 0;</div><div class='add'>+                continue;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            xdata = replies[i].xdata;</div><div class='add'>+            ia_type = replies[i].poststat.ia_type;</div><div class='add'>+        } else { /* pre-op xattrop */</div><div class='add'>+            xdata = local-&gt;transaction.changelog_xdata[i];</div><div class='add'>+            ia_type = inode-&gt;ia_type;</div><div class='ctx'>         }</div><div class='ctx'> </div><div class='del'>-        if (afr_sh_has_entry_pending (xattr, child_index, this)) {</div><div class='del'>-                local-&gt;self_heal.need_entry_self_heal = _gf_true;</div><div class='del'>-                gf_log(this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-                       "entry self-heal is pending for %s.", local-&gt;loc.path);</div><div class='add'>+        if (!xdata)</div><div class='add'>+            continue; /* mkdir_cbk sends NULL xdata_rsp. */</div><div class='add'>+        afr_accused_fill(this, xdata, data_accused,</div><div class='add'>+                         (ia_type == IA_IFDIR) ? AFR_ENTRY_TRANSACTION</div><div class='add'>+                                               : AFR_DATA_TRANSACTION);</div><div class='add'>+</div><div class='add'>+        afr_accused_fill(this, xdata, metadata_accused,</div><div class='add'>+                         AFR_METADATA_TRANSACTION);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (replies &amp;&amp; ia_type != IA_INVAL &amp;&amp; ia_type != IA_IFDIR &amp;&amp;</div><div class='add'>+        /* We want to accuse small files only when we know for</div><div class='add'>+         * sure that there is no IO happening. Otherwise, the</div><div class='add'>+         * ia_sizes obtained in post-refresh replies may</div><div class='add'>+         * mismatch due to a race between inode-refresh and</div><div class='add'>+         * ongoing writes, causing spurious heal launches*/</div><div class='add'>+        !afr_is_possibly_under_txn(AFR_DATA_TRANSACTION, local, this)) {</div><div class='add'>+        afr_accuse_smallfiles(this, replies, data_accused);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+        if (data_accused[i]) {</div><div class='add'>+            data_readable[i] = 0;</div><div class='add'>+            ret = 1;</div><div class='ctx'>         }</div><div class='add'>+        if (metadata_accused[i]) {</div><div class='add'>+            metadata_readable[i] = 0;</div><div class='add'>+            ret = 1;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        if (afr_sh_has_data_pending (xattr, child_index, this)) {</div><div class='del'>-                local-&gt;self_heal.need_data_self_heal = _gf_true;</div><div class='del'>-                gf_log(this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-                       "data self-heal is pending for %s.", local-&gt;loc.path);</div><div class='add'>+int</div><div class='add'>+afr_replies_interpret(call_frame_t *frame, xlator_t *this, inode_t *inode,</div><div class='add'>+                      gf_boolean_t *start_heal)</div><div class='add'>+{</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    struct afr_reply *replies = NULL;</div><div class='add'>+    int event_generation = 0;</div><div class='add'>+    int i = 0;</div><div class='add'>+    unsigned char *data_accused = NULL;</div><div class='add'>+    unsigned char *metadata_accused = NULL;</div><div class='add'>+    unsigned char *data_readable = NULL;</div><div class='add'>+    unsigned char *metadata_readable = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+    replies = local-&gt;replies;</div><div class='add'>+    event_generation = local-&gt;event_generation;</div><div class='add'>+</div><div class='add'>+    data_accused = alloca0(priv-&gt;child_count);</div><div class='add'>+    data_readable = alloca0(priv-&gt;child_count);</div><div class='add'>+    metadata_accused = alloca0(priv-&gt;child_count);</div><div class='add'>+    metadata_readable = alloca0(priv-&gt;child_count);</div><div class='add'>+</div><div class='add'>+    ret = afr_readables_fill(frame, this, inode, data_accused, metadata_accused,</div><div class='add'>+                             data_readable, metadata_readable, replies);</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+        if (start_heal &amp;&amp; priv-&gt;child_up[i] &amp;&amp;</div><div class='add'>+            (data_accused[i] || metadata_accused[i])) {</div><div class='add'>+            *start_heal = _gf_true;</div><div class='add'>+            break;</div><div class='ctx'>         }</div><div class='add'>+    }</div><div class='add'>+    afr_inode_read_subvol_set(inode, this, data_readable, metadata_readable,</div><div class='add'>+                              event_generation);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        ret = dict_get_uint32 (xattr, GLUSTERFS_OPEN_FD_COUNT,</div><div class='del'>-                               &amp;open_fd_count);</div><div class='del'>-        if (ret == 0)</div><div class='del'>-                local-&gt;open_fd_count += open_fd_count;</div><div class='add'>+int</div><div class='add'>+afr_refresh_selfheal_done(int ret, call_frame_t *heal, void *opaque)</div><div class='add'>+{</div><div class='add'>+    if (heal)</div><div class='add'>+        AFR_STACK_DESTROY(heal);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        ret = dict_get_uint32 (xattr, GLUSTERFS_INODELK_COUNT,</div><div class='del'>-                               &amp;inodelk_count);</div><div class='del'>-        if (ret == 0)</div><div class='del'>-                local-&gt;inodelk_count += inodelk_count;</div><div class='add'>+int</div><div class='add'>+afr_inode_refresh_err(call_frame_t *frame, xlator_t *this)</div><div class='add'>+{</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    int i = 0;</div><div class='add'>+    int err = 0;</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+        if (local-&gt;replies[i].valid &amp;&amp; !local-&gt;replies[i].op_ret) {</div><div class='add'>+            err = 0;</div><div class='add'>+            goto ret;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        ret = dict_get_uint32 (xattr, GLUSTERFS_ENTRYLK_COUNT,</div><div class='del'>-                               &amp;entrylk_count);</div><div class='del'>-        if (ret == 0)</div><div class='del'>-                local-&gt;entrylk_count += entrylk_count;</div><div class='add'>+    err = afr_final_errno(local, priv);</div><div class='add'>+ret:</div><div class='add'>+    return err;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='del'>-static void</div><div class='del'>-afr_lookup_self_heal_check (xlator_t *this, afr_local_t *local,</div><div class='del'>-                            struct iatt *buf, struct iatt *lookup_buf)</div><div class='add'>+gf_boolean_t</div><div class='add'>+afr_selfheal_enabled(const xlator_t *this)</div><div class='ctx'> {</div><div class='del'>-        if (FILETYPE_DIFFERS (buf, lookup_buf)) {</div><div class='del'>-                /* mismatching filetypes with same name</div><div class='del'>-                */</div><div class='add'>+    const afr_private_t *priv = this-&gt;private;</div><div class='ctx'> </div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_NORMAL,</div><div class='del'>-                        "filetype differs for %s ", local-&gt;loc.path);</div><div class='add'>+    return priv-&gt;data_self_heal || priv-&gt;metadata_self_heal ||</div><div class='add'>+           priv-&gt;entry_self_heal;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-                local-&gt;govinda_gOvinda = 1;</div><div class='add'>+int</div><div class='add'>+afr_txn_refresh_done(call_frame_t *frame, xlator_t *this, int err)</div><div class='add'>+{</div><div class='add'>+    call_frame_t *heal_frame = NULL;</div><div class='add'>+    afr_local_t *heal_local = NULL;</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    inode_t *inode = NULL;</div><div class='add'>+    int event_generation = 0;</div><div class='add'>+    int read_subvol = -1;</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    inode = local-&gt;inode;</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    if (err)</div><div class='add'>+        goto refresh_done;</div><div class='add'>+</div><div class='add'>+    if (local-&gt;op == GF_FOP_LOOKUP)</div><div class='add'>+        goto refresh_done;</div><div class='add'>+</div><div class='add'>+    ret = afr_inode_get_readable(frame, inode, this, local-&gt;readable,</div><div class='add'>+                                 &amp;event_generation, local-&gt;transaction.type);</div><div class='add'>+</div><div class='add'>+    if (ret == -EIO) {</div><div class='add'>+        /* No readable subvolume even after refresh ==&gt; splitbrain.*/</div><div class='add'>+        if (!priv-&gt;fav_child_policy) {</div><div class='add'>+            err = EIO;</div><div class='add'>+            goto refresh_done;</div><div class='add'>+        }</div><div class='add'>+        read_subvol = afr_sh_get_fav_by_policy(this, local-&gt;replies, inode,</div><div class='add'>+                                               NULL);</div><div class='add'>+        if (read_subvol == -1) {</div><div class='add'>+            err = EIO;</div><div class='add'>+            goto refresh_done;</div><div class='ctx'>         }</div><div class='ctx'> </div><div class='del'>-        if (PERMISSION_DIFFERS (buf, lookup_buf)) {</div><div class='del'>-                /* mismatching permissions */</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_NORMAL,</div><div class='del'>-                        "permissions differ for %s ", local-&gt;loc.path);</div><div class='del'>-                local-&gt;self_heal.need_metadata_self_heal = _gf_true;</div><div class='add'>+        heal_frame = afr_frame_create(this, NULL);</div><div class='add'>+        if (!heal_frame) {</div><div class='add'>+            err = EIO;</div><div class='add'>+            goto refresh_done;</div><div class='add'>+        }</div><div class='add'>+        heal_local = heal_frame-&gt;local;</div><div class='add'>+        heal_local-&gt;xdata_req = dict_new();</div><div class='add'>+        if (!heal_local-&gt;xdata_req) {</div><div class='add'>+            err = EIO;</div><div class='add'>+            AFR_STACK_DESTROY(heal_frame);</div><div class='add'>+            goto refresh_done;</div><div class='ctx'>         }</div><div class='add'>+        heal_local-&gt;heal_frame = frame;</div><div class='add'>+        ret = synctask_new(this-&gt;ctx-&gt;env, afr_fav_child_reset_sink_xattrs,</div><div class='add'>+                           afr_fav_child_reset_sink_xattrs_cbk, heal_frame,</div><div class='add'>+                           heal_frame);</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        if (OWNERSHIP_DIFFERS (buf, lookup_buf)) {</div><div class='del'>-                /* mismatching permissions */</div><div class='del'>-                local-&gt;self_heal.need_metadata_self_heal = _gf_true;</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_NORMAL,</div><div class='del'>-                        "ownership differs for %s ", local-&gt;loc.path);</div><div class='add'>+refresh_done:</div><div class='add'>+    afr_local_replies_wipe(local, this-&gt;private);</div><div class='add'>+    local-&gt;refreshfn(frame, this, err);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+afr_inode_refresh_done(call_frame_t *frame, xlator_t *this, int error)</div><div class='add'>+{</div><div class='add'>+    call_frame_t *heal_frame = NULL;</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    gf_boolean_t start_heal = _gf_false;</div><div class='add'>+    afr_local_t *heal_local = NULL;</div><div class='add'>+    unsigned char *success_replies = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    if (error != 0) {</div><div class='add'>+        goto refresh_done;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+    success_replies = alloca0(priv-&gt;child_count);</div><div class='add'>+    afr_fill_success_replies(local, priv, success_replies);</div><div class='add'>+</div><div class='add'>+    if (priv-&gt;thin_arbiter_count &amp;&amp; local-&gt;is_read_txn &amp;&amp;</div><div class='add'>+        AFR_COUNT(success_replies, priv-&gt;child_count) != priv-&gt;child_count) {</div><div class='add'>+        /* We need to query the good bricks and/or thin-arbiter.*/</div><div class='add'>+        if (success_replies[0]) {</div><div class='add'>+            local-&gt;read_txn_query_child = AFR_CHILD_ZERO;</div><div class='add'>+        } else if (success_replies[1]) {</div><div class='add'>+            local-&gt;read_txn_query_child = AFR_CHILD_ONE;</div><div class='add'>+        }</div><div class='add'>+        error = EINVAL;</div><div class='add'>+        goto refresh_done;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (!afr_has_quorum(success_replies, this, frame)) {</div><div class='add'>+        error = afr_final_errno(frame-&gt;local, this-&gt;private);</div><div class='add'>+        if (!error)</div><div class='add'>+            error = afr_quorum_errno(priv);</div><div class='add'>+        goto refresh_done;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = afr_replies_interpret(frame, this, local-&gt;refreshinode, &amp;start_heal);</div><div class='add'>+</div><div class='add'>+    if (ret &amp;&amp; afr_selfheal_enabled(this) &amp;&amp; start_heal) {</div><div class='add'>+        heal_frame = afr_frame_create(this, NULL);</div><div class='add'>+        if (!heal_frame)</div><div class='add'>+            goto refresh_done;</div><div class='add'>+        heal_local = heal_frame-&gt;local;</div><div class='add'>+        heal_local-&gt;refreshinode = inode_ref(local-&gt;refreshinode);</div><div class='add'>+        heal_local-&gt;heal_frame = heal_frame;</div><div class='add'>+        if (!afr_throttled_selfheal(heal_frame, this)) {</div><div class='add'>+            AFR_STACK_DESTROY(heal_frame);</div><div class='add'>+            goto refresh_done;</div><div class='ctx'>         }</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        if (SIZE_DIFFERS (buf, lookup_buf)</div><div class='del'>-            &amp;&amp; IA_ISREG (buf-&gt;ia_type)) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_NORMAL,</div><div class='del'>-                        "size differs for %s ", local-&gt;loc.path);</div><div class='del'>-                local-&gt;self_heal.need_data_self_heal = _gf_true;</div><div class='add'>+refresh_done:</div><div class='add'>+    afr_txn_refresh_done(frame, this, error);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+afr_inode_refresh_subvol_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                             int op_ret, int op_errno, struct iatt *buf,</div><div class='add'>+                             dict_t *xdata, struct iatt *par)</div><div class='add'>+{</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    int call_child = (long)cookie;</div><div class='add'>+    int8_t need_heal = 1;</div><div class='add'>+    int call_count = 0;</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    local-&gt;replies[call_child].valid = 1;</div><div class='add'>+    local-&gt;replies[call_child].op_ret = op_ret;</div><div class='add'>+    local-&gt;replies[call_child].op_errno = op_errno;</div><div class='add'>+    if (op_ret != -1) {</div><div class='add'>+        local-&gt;replies[call_child].poststat = *buf;</div><div class='add'>+        if (par)</div><div class='add'>+            local-&gt;replies[call_child].postparent = *par;</div><div class='add'>+        if (xdata)</div><div class='add'>+            local-&gt;replies[call_child].xdata = dict_ref(xdata);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (xdata) {</div><div class='add'>+        ret = dict_get_int8(xdata, "link-count", &amp;need_heal);</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_msg_debug(this-&gt;name, -ret, "Unable to get link count");</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    local-&gt;replies[call_child].need_heal = need_heal;</div><div class='add'>+    call_count = afr_frame_return(frame);</div><div class='add'>+    if (call_count == 0) {</div><div class='add'>+        afr_set_need_heal(this, local);</div><div class='add'>+        ret = afr_inode_refresh_err(frame, this);</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_msg_debug(this-&gt;name, ret, "afr_inode_refresh_err failed");</div><div class='ctx'>         }</div><div class='add'>+        afr_inode_refresh_done(frame, this, ret);</div><div class='add'>+    }</div><div class='add'>+}</div><div class='ctx'> </div><div class='add'>+int</div><div class='add'>+afr_inode_refresh_subvol_with_lookup_cbk(call_frame_t *frame, void *cookie,</div><div class='add'>+                                         xlator_t *this, int op_ret,</div><div class='add'>+                                         int op_errno, inode_t *inode,</div><div class='add'>+                                         struct iatt *buf, dict_t *xdata,</div><div class='add'>+                                         struct iatt *par)</div><div class='add'>+{</div><div class='add'>+    afr_inode_refresh_subvol_cbk(frame, cookie, this, op_ret, op_errno, buf,</div><div class='add'>+                                 xdata, par);</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+int</div><div class='add'>+afr_inode_refresh_subvol_with_lookup(call_frame_t *frame, xlator_t *this, int i,</div><div class='add'>+                                     inode_t *inode, uuid_t gfid, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    loc_t loc = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    loc.inode = inode;</div><div class='add'>+    if (gf_uuid_is_null(inode-&gt;gfid) &amp;&amp; gfid) {</div><div class='add'>+        /* To handle setattr/setxattr on yet to be linked inode from</div><div class='add'>+         * dht */</div><div class='add'>+        gf_uuid_copy(loc.gfid, gfid);</div><div class='add'>+    } else {</div><div class='add'>+        gf_uuid_copy(loc.gfid, inode-&gt;gfid);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    STACK_WIND_COOKIE(frame, afr_inode_refresh_subvol_with_lookup_cbk,</div><div class='add'>+                      (void *)(long)i, priv-&gt;children[i],</div><div class='add'>+                      priv-&gt;children[i]-&gt;fops-&gt;lookup, &amp;loc, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-static void</div><div class='del'>-afr_lookup_done (call_frame_t *frame, xlator_t *this, struct iatt *lookup_buf)</div><div class='add'>+int</div><div class='add'>+afr_inode_refresh_subvol_with_fstat_cbk(call_frame_t *frame, void *cookie,</div><div class='add'>+                                        xlator_t *this, int32_t op_ret,</div><div class='add'>+                                        int32_t op_errno, struct iatt *buf,</div><div class='add'>+                                        dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-        int  unwind = 1;</div><div class='del'>-        int  source = -1;</div><div class='del'>-        int  up_count = 0;</div><div class='del'>-        char sh_type_str[256] = {0,};</div><div class='add'>+    afr_inode_refresh_subvol_cbk(frame, cookie, this, op_ret, op_errno, buf,</div><div class='add'>+                                 xdata, NULL);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        afr_private_t *priv  = NULL;</div><div class='del'>-        afr_local_t   *local = NULL;</div><div class='add'>+int</div><div class='add'>+afr_inode_refresh_subvol_with_fstat(call_frame_t *frame, xlator_t *this, int i,</div><div class='add'>+                                    dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='ctx'> </div><div class='del'>-        priv  = this-&gt;private;</div><div class='del'>-        local = frame-&gt;local;</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+    local = frame-&gt;local;</div><div class='ctx'> </div><div class='del'>-        local-&gt;cont.lookup.postparent.ia_ino  = local-&gt;cont.lookup.parent_ino;</div><div class='add'>+    STACK_WIND_COOKIE(frame, afr_inode_refresh_subvol_with_fstat_cbk,</div><div class='add'>+                      (void *)(long)i, priv-&gt;children[i],</div><div class='add'>+                      priv-&gt;children[i]-&gt;fops-&gt;fstat, local-&gt;fd, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        if (local-&gt;cont.lookup.ino) {</div><div class='del'>-                local-&gt;cont.lookup.buf.ia_ino = local-&gt;cont.lookup.ino;</div><div class='del'>-                local-&gt;cont.lookup.buf.ia_gen = local-&gt;cont.lookup.gen;</div><div class='add'>+int</div><div class='add'>+afr_inode_refresh_do(call_frame_t *frame, xlator_t *this)</div><div class='add'>+{</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    int call_count = 0;</div><div class='add'>+    int i = 0;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    dict_t *xdata = NULL;</div><div class='add'>+    afr_fd_ctx_t *fd_ctx = NULL;</div><div class='add'>+    unsigned char *wind_subvols = NULL;</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    wind_subvols = alloca0(priv-&gt;child_count);</div><div class='add'>+</div><div class='add'>+    afr_local_replies_wipe(local, priv);</div><div class='add'>+</div><div class='add'>+    if (local-&gt;fd) {</div><div class='add'>+        fd_ctx = afr_fd_ctx_get(local-&gt;fd, this);</div><div class='add'>+        if (!fd_ctx) {</div><div class='add'>+            afr_inode_refresh_done(frame, this, EINVAL);</div><div class='add'>+            return 0;</div><div class='ctx'>         }</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        up_count = afr_up_children_count (priv-&gt;child_count, priv-&gt;child_up);</div><div class='del'>-        if (up_count == 1) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-                        "Only 1 child up - do not attempt to detect self heal");</div><div class='del'>-                goto unwind;</div><div class='del'>-        }</div><div class='add'>+    xdata = dict_new();</div><div class='add'>+    if (!xdata) {</div><div class='add'>+        afr_inode_refresh_done(frame, this, ENOMEM);</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        if (local-&gt;op_ret == 0) {</div><div class='del'>-                /* KLUDGE: assuming DHT will not itransform in</div><div class='del'>-                   revalidate */</div><div class='del'>-                if (local-&gt;cont.lookup.inode-&gt;ino) {</div><div class='del'>-                        local-&gt;cont.lookup.buf.ia_ino =</div><div class='del'>-                                local-&gt;cont.lookup.inode-&gt;ino;</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='add'>+    ret = afr_xattr_req_prepare(this, xdata);</div><div class='add'>+    if (ret != 0) {</div><div class='add'>+        dict_unref(xdata);</div><div class='add'>+        afr_inode_refresh_done(frame, this, -ret);</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        if (local-&gt;success_count &amp;&amp; local-&gt;enoent_count) {</div><div class='del'>-                local-&gt;self_heal.need_metadata_self_heal = _gf_true;</div><div class='del'>-                local-&gt;self_heal.need_data_self_heal     = _gf_true;</div><div class='del'>-                local-&gt;self_heal.need_entry_self_heal    = _gf_true;</div><div class='del'>-                gf_log(this-&gt;name, GF_LOG_NORMAL,</div><div class='del'>-                       "entries are missing in lookup of %s.",</div><div class='del'>-                       local-&gt;loc.path);</div><div class='del'>-        }</div><div class='add'>+    ret = dict_set_sizen_str_sizen(xdata, "link-count", GF_XATTROP_INDEX_COUNT);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_msg_debug(this-&gt;name, -ret, "Unable to set link-count in dict ");</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        if (local-&gt;success_count) {</div><div class='del'>-                /* check for split-brain case in previous lookup */</div><div class='del'>-                if (afr_is_split_brain (this,</div><div class='del'>-                                        local-&gt;cont.lookup.inode)) {</div><div class='del'>-                        local-&gt;self_heal.need_data_self_heal = _gf_true;</div><div class='del'>-                        gf_log(this-&gt;name, GF_LOG_NORMAL,</div><div class='del'>-                               "split brain detected during lookup of "</div><div class='del'>-                               "%s.", local-&gt;loc.path);</div><div class='del'>-                }</div><div class='add'>+    ret = dict_set_str_sizen(xdata, GLUSTERFS_INODELK_DOM_COUNT, this-&gt;name);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_msg_debug(this-&gt;name, -ret,</div><div class='add'>+                     "Unable to set inodelk-dom-count in dict ");</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (local-&gt;fd) {</div><div class='add'>+        for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+            if (local-&gt;child_up[i] &amp;&amp; fd_ctx-&gt;opened_on[i] == AFR_FD_OPENED)</div><div class='add'>+                wind_subvols[i] = 1;</div><div class='ctx'>         }</div><div class='add'>+    } else {</div><div class='add'>+        memcpy(wind_subvols, local-&gt;child_up,</div><div class='add'>+               sizeof(*local-&gt;child_up) * priv-&gt;child_count);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    local-&gt;call_count = AFR_COUNT(wind_subvols, priv-&gt;child_count);</div><div class='add'>+</div><div class='add'>+    call_count = local-&gt;call_count;</div><div class='add'>+    if (!call_count) {</div><div class='add'>+        dict_unref(xdata);</div><div class='add'>+        if (local-&gt;fd &amp;&amp; AFR_COUNT(local-&gt;child_up, priv-&gt;child_count))</div><div class='add'>+            afr_inode_refresh_done(frame, this, EBADFD);</div><div class='add'>+        else</div><div class='add'>+            afr_inode_refresh_done(frame, this, ENOTCONN);</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='add'>+    for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+        if (!wind_subvols[i])</div><div class='add'>+            continue;</div><div class='ctx'> </div><div class='del'>-        if ((local-&gt;self_heal.need_metadata_self_heal</div><div class='del'>-             || local-&gt;self_heal.need_data_self_heal</div><div class='del'>-             || local-&gt;self_heal.need_entry_self_heal)</div><div class='del'>-            &amp;&amp; ((!local-&gt;cont.lookup.is_revalidate)</div><div class='del'>-                || (local-&gt;op_ret != -1))) {</div><div class='add'>+        if (local-&gt;fd)</div><div class='add'>+            afr_inode_refresh_subvol_with_fstat(frame, this, i, xdata);</div><div class='add'>+        else</div><div class='add'>+            afr_inode_refresh_subvol_with_lookup(</div><div class='add'>+                frame, this, i, local-&gt;refreshinode, local-&gt;refreshgfid, xdata);</div><div class='ctx'> </div><div class='del'>-                if (local-&gt;open_fd_count</div><div class='del'>-                    || local-&gt;inodelk_count</div><div class='del'>-                    || local-&gt;entrylk_count) {</div><div class='add'>+        if (!--call_count)</div><div class='add'>+            break;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-                        /* Someone else is doing self-heal on this file.</div><div class='del'>-                           So just make a best effort to set the read-subvolume</div><div class='del'>-                           and return */</div><div class='add'>+    dict_unref(xdata);</div><div class='ctx'> </div><div class='del'>-                        if (IA_ISREG (local-&gt;cont.lookup.inode-&gt;ia_type)) {</div><div class='del'>-                                source = afr_self_heal_get_source (this, local, local-&gt;cont.lookup.xattrs);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-                                if (source &gt;= 0) {</div><div class='del'>-                                        afr_set_read_child (this,</div><div class='del'>-                                                            local-&gt;cont.lookup.inode,</div><div class='del'>-                                                            source);</div><div class='del'>-                                }</div><div class='del'>-                        }</div><div class='del'>-                } else {</div><div class='del'>-                        if (!local-&gt;cont.lookup.inode-&gt;ia_type) {</div><div class='del'>-                                /* fix for RT #602 */</div><div class='del'>-                                local-&gt;cont.lookup.inode-&gt;ia_type =</div><div class='del'>-                                        lookup_buf-&gt;ia_type;</div><div class='del'>-                        }</div><div class='add'>+int</div><div class='add'>+afr_inode_refresh(call_frame_t *frame, xlator_t *this, inode_t *inode,</div><div class='add'>+                  uuid_t gfid, afr_inode_refresh_cbk_t refreshfn)</div><div class='add'>+{</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='ctx'> </div><div class='del'>-                        local-&gt;self_heal.background = _gf_true;</div><div class='del'>-                        local-&gt;self_heal.type       = local-&gt;cont.lookup.buf.ia_type;</div><div class='del'>-                        local-&gt;self_heal.unwind     = afr_self_heal_lookup_unwind;</div><div class='add'>+    local = frame-&gt;local;</div><div class='ctx'> </div><div class='del'>-                        unwind = 0;</div><div class='add'>+    local-&gt;refreshfn = refreshfn;</div><div class='ctx'> </div><div class='del'>-                        afr_self_heal_type_str_get(&amp;local-&gt;self_heal,</div><div class='del'>-                                                   sh_type_str,</div><div class='del'>-                                                   sizeof(sh_type_str));</div><div class='add'>+    if (local-&gt;refreshinode) {</div><div class='add'>+        inode_unref(local-&gt;refreshinode);</div><div class='add'>+        local-&gt;refreshinode = NULL;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_NORMAL, "background %s "</div><div class='del'>-                                "self-heal triggered. path: %s",</div><div class='del'>-                                sh_type_str, local-&gt;loc.path);</div><div class='add'>+    local-&gt;refreshinode = inode_ref(inode);</div><div class='ctx'> </div><div class='del'>-                        afr_self_heal (frame, this);</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='add'>+    if (gfid)</div><div class='add'>+        gf_uuid_copy(local-&gt;refreshgfid, gfid);</div><div class='add'>+    else</div><div class='add'>+        gf_uuid_clear(local-&gt;refreshgfid);</div><div class='ctx'> </div><div class='del'>-unwind:</div><div class='del'>-        if (unwind) {</div><div class='del'>-                AFR_STACK_UNWIND (lookup, frame, local-&gt;op_ret,</div><div class='del'>-                                  local-&gt;op_errno,</div><div class='del'>-                                  local-&gt;cont.lookup.inode,</div><div class='del'>-                                  &amp;local-&gt;cont.lookup.buf,</div><div class='del'>-                                  local-&gt;cont.lookup.xattr,</div><div class='del'>-                                  &amp;local-&gt;cont.lookup.postparent);</div><div class='del'>-        }</div><div class='add'>+    afr_inode_refresh_do(frame, this);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+int</div><div class='add'>+afr_xattr_req_prepare(xlator_t *this, dict_t *xattr_req)</div><div class='add'>+{</div><div class='add'>+    int i = 0;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    int ret = 0;</div><div class='ctx'> </div><div class='del'>-/*</div><div class='del'>- * During a lookup, some errors are more "important" than</div><div class='del'>- * others in that they must be given higher priority while</div><div class='del'>- * returning to the user.</div><div class='del'>- *</div><div class='del'>- * The hierarchy is ESTALE &gt; ENOENT &gt; others</div><div class='del'>- *</div><div class='del'>- */</div><div class='add'>+    priv = this-&gt;private;</div><div class='ctx'> </div><div class='del'>-static gf_boolean_t</div><div class='del'>-__error_more_important (int32_t old_errno, int32_t new_errno)</div><div class='add'>+    for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+        ret = dict_set_uint64(xattr_req, priv-&gt;pending_key[i],</div><div class='add'>+                              AFR_NUM_CHANGE_LOGS * sizeof(int));</div><div class='add'>+        if (ret &lt; 0)</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_WARNING, -ret, AFR_MSG_DICT_SET_FAILED,</div><div class='add'>+                   "Unable to set dict value for %s", priv-&gt;pending_key[i]);</div><div class='add'>+        /* 3 = data+metadata+entry */</div><div class='add'>+    }</div><div class='add'>+    ret = dict_set_uint64(xattr_req, AFR_DIRTY,</div><div class='add'>+                          AFR_NUM_CHANGE_LOGS * sizeof(int));</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_msg_debug(this-&gt;name, -ret,</div><div class='add'>+                     "failed to set dirty "</div><div class='add'>+                     "query flag");</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_set_int32_sizen(xattr_req, "list-xattr", 1);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_msg_debug(this-&gt;name, -ret, "Unable to set list-xattr in dict ");</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+afr_lookup_xattr_req_prepare(afr_local_t *local, xlator_t *this,</div><div class='add'>+                             dict_t *xattr_req, loc_t *loc)</div><div class='ctx'> {</div><div class='del'>-        gf_boolean_t ret = _gf_true;</div><div class='add'>+    int ret = -ENOMEM;</div><div class='add'>+</div><div class='add'>+    if (!local-&gt;xattr_req)</div><div class='add'>+        local-&gt;xattr_req = dict_new();</div><div class='add'>+</div><div class='add'>+    if (!local-&gt;xattr_req)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    if (xattr_req &amp;&amp; (xattr_req != local-&gt;xattr_req))</div><div class='add'>+        dict_copy(xattr_req, local-&gt;xattr_req);</div><div class='add'>+</div><div class='add'>+    ret = afr_xattr_req_prepare(this, local-&gt;xattr_req);</div><div class='add'>+</div><div class='add'>+    ret = dict_set_uint64(local-&gt;xattr_req, GLUSTERFS_INODELK_COUNT, 0);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_WARNING, -ret, AFR_MSG_DICT_SET_FAILED,</div><div class='add'>+               "%s: Unable to set dict value for %s", loc-&gt;path,</div><div class='add'>+               GLUSTERFS_INODELK_COUNT);</div><div class='add'>+    }</div><div class='add'>+    ret = dict_set_uint64(local-&gt;xattr_req, GLUSTERFS_ENTRYLK_COUNT, 0);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_WARNING, -ret, AFR_MSG_DICT_SET_FAILED,</div><div class='add'>+               "%s: Unable to set dict value for %s", loc-&gt;path,</div><div class='add'>+               GLUSTERFS_ENTRYLK_COUNT);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_set_uint32(local-&gt;xattr_req, GLUSTERFS_PARENT_ENTRYLK, 0);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_WARNING, -ret, AFR_MSG_DICT_SET_FAILED,</div><div class='add'>+               "%s: Unable to set dict value for %s", loc-&gt;path,</div><div class='add'>+               GLUSTERFS_PARENT_ENTRYLK);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_set_sizen_str_sizen(local-&gt;xattr_req, "link-count",</div><div class='add'>+                                   GF_XATTROP_INDEX_COUNT);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_msg_debug(this-&gt;name, -ret, "Unable to set link-count in dict ");</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        /* Nothing should ever overwrite ESTALE */</div><div class='del'>-        if (old_errno == ESTALE)</div><div class='del'>-                ret = _gf_false;</div><div class='add'>+int</div><div class='add'>+afr_least_pending_reads_child(afr_private_t *priv, unsigned char *readable)</div><div class='add'>+{</div><div class='add'>+    int i = 0;</div><div class='add'>+    int child = -1;</div><div class='add'>+    int64_t read_iter = -1;</div><div class='add'>+    int64_t pending_read = -1;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+        if (AFR_IS_ARBITER_BRICK(priv, i) || !readable[i])</div><div class='add'>+            continue;</div><div class='add'>+        read_iter = GF_ATOMIC_GET(priv-&gt;pending_reads[i]);</div><div class='add'>+        if (child == -1 || read_iter &lt; pending_read) {</div><div class='add'>+            pending_read = read_iter;</div><div class='add'>+            child = i;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        /* Nothing should overwrite ENOENT, except ESTALE */</div><div class='del'>-        else if ((old_errno == ENOENT) &amp;&amp; (new_errno != ESTALE))</div><div class='del'>-                ret = _gf_false;</div><div class='add'>+    return child;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        return ret;</div><div class='add'>+static int32_t</div><div class='add'>+afr_least_latency_child(afr_private_t *priv, unsigned char *readable)</div><div class='add'>+{</div><div class='add'>+    int32_t i = 0;</div><div class='add'>+    int child = -1;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+        if (AFR_IS_ARBITER_BRICK(priv, i) || !readable[i] ||</div><div class='add'>+            priv-&gt;child_latency[i] &lt; 0)</div><div class='add'>+            continue;</div><div class='add'>+</div><div class='add'>+        if (child == -1 ||</div><div class='add'>+            priv-&gt;child_latency[i] &lt; priv-&gt;child_latency[child]) {</div><div class='add'>+            child = i;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    return child;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+static int32_t</div><div class='add'>+afr_least_latency_times_pending_reads_child(afr_private_t *priv,</div><div class='add'>+                                            unsigned char *readable)</div><div class='add'>+{</div><div class='add'>+    int32_t i = 0;</div><div class='add'>+    int child = -1;</div><div class='add'>+    int64_t pending_read = 0;</div><div class='add'>+    int64_t latency = -1;</div><div class='add'>+    int64_t least_latency = -1;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+        if (AFR_IS_ARBITER_BRICK(priv, i) || !readable[i] ||</div><div class='add'>+            priv-&gt;child_latency[i] &lt; 0)</div><div class='add'>+            continue;</div><div class='add'>+</div><div class='add'>+        pending_read = GF_ATOMIC_GET(priv-&gt;pending_reads[i]);</div><div class='add'>+        latency = (pending_read + 1) * priv-&gt;child_latency[i];</div><div class='add'>+</div><div class='add'>+        if (child == -1 || latency &lt; least_latency) {</div><div class='add'>+            least_latency = latency;</div><div class='add'>+            child = i;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    return child;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-afr_fresh_lookup_cbk (call_frame_t *frame, void *cookie,</div><div class='del'>-                      xlator_t *this,  int32_t op_ret,	int32_t op_errno,</div><div class='del'>-                      inode_t *inode,	struct iatt *buf, dict_t *xattr,</div><div class='del'>-                      struct iatt *postparent)</div><div class='add'>+afr_hash_child(afr_read_subvol_args_t *args, afr_private_t *priv,</div><div class='add'>+               unsigned char *readable)</div><div class='ctx'> {</div><div class='del'>-	afr_local_t *   local = NULL;</div><div class='del'>-	afr_private_t * priv  = NULL;</div><div class='del'>-	struct iatt *   lookup_buf = NULL;</div><div class='add'>+    uuid_t gfid_copy = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    pid_t pid;</div><div class='add'>+    int child = -1;</div><div class='add'>+</div><div class='add'>+    switch (priv-&gt;hash_mode) {</div><div class='add'>+        case AFR_READ_POLICY_FIRST_UP:</div><div class='add'>+            break;</div><div class='add'>+        case AFR_READ_POLICY_GFID_HASH:</div><div class='add'>+            gf_uuid_copy(gfid_copy, args-&gt;gfid);</div><div class='add'>+            child = SuperFastHash((char *)gfid_copy, sizeof(gfid_copy)) %</div><div class='add'>+                    priv-&gt;child_count;</div><div class='add'>+            break;</div><div class='add'>+        case AFR_READ_POLICY_GFID_PID_HASH:</div><div class='add'>+            if (args-&gt;ia_type != IA_IFDIR) {</div><div class='add'>+                /*</div><div class='add'>+                 * Why getpid?  Because it's one of the cheapest calls</div><div class='add'>+                 * available - faster than gethostname etc. - and</div><div class='add'>+                 * returns a constant-length value that's sure to be</div><div class='add'>+                 * shorter than a UUID. It's still very unlikely to be</div><div class='add'>+                 * the same across clients, so it still provides good</div><div class='add'>+                 * mixing.  We're not trying for perfection here. All we</div><div class='add'>+                 * need is a low probability that multiple clients</div><div class='add'>+                 * won't converge on the same subvolume.</div><div class='add'>+                 */</div><div class='add'>+                gf_uuid_copy(gfid_copy, args-&gt;gfid);</div><div class='add'>+                pid = getpid();</div><div class='add'>+                *(pid_t *)gfid_copy ^= pid;</div><div class='add'>+            }</div><div class='add'>+            child = SuperFastHash((char *)gfid_copy, sizeof(gfid_copy)) %</div><div class='add'>+                    priv-&gt;child_count;</div><div class='add'>+            break;</div><div class='add'>+        case AFR_READ_POLICY_LESS_LOAD:</div><div class='add'>+            child = afr_least_pending_reads_child(priv, readable);</div><div class='add'>+            break;</div><div class='add'>+        case AFR_READ_POLICY_LEAST_LATENCY:</div><div class='add'>+            child = afr_least_latency_child(priv, readable);</div><div class='add'>+            break;</div><div class='add'>+        case AFR_READ_POLICY_LOAD_LATENCY_HYBRID:</div><div class='add'>+            child = afr_least_latency_times_pending_reads_child(priv, readable);</div><div class='add'>+            break;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return child;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	int             call_count      = -1;</div><div class='del'>-	int             child_index     = -1;</div><div class='del'>-        int             first_up_child  = -1;</div><div class='add'>+int</div><div class='add'>+afr_read_subvol_select_by_policy(inode_t *inode, xlator_t *this,</div><div class='add'>+                                 unsigned char *readable,</div><div class='add'>+                                 afr_read_subvol_args_t *args)</div><div class='add'>+{</div><div class='add'>+    int i = 0;</div><div class='add'>+    int read_subvol = -1;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    afr_read_subvol_args_t local_args = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    /* first preference - explicitly specified or local subvolume */</div><div class='add'>+    if (priv-&gt;read_child &gt;= 0 &amp;&amp; readable[priv-&gt;read_child])</div><div class='add'>+        return priv-&gt;read_child;</div><div class='add'>+</div><div class='add'>+    if (inode_is_linked(inode)) {</div><div class='add'>+        gf_uuid_copy(local_args.gfid, inode-&gt;gfid);</div><div class='add'>+        local_args.ia_type = inode-&gt;ia_type;</div><div class='add'>+    } else if (args) {</div><div class='add'>+        local_args = *args;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* second preference - use hashed mode */</div><div class='add'>+    read_subvol = afr_hash_child(&amp;local_args, priv, readable);</div><div class='add'>+    if (read_subvol &gt;= 0 &amp;&amp; readable[read_subvol])</div><div class='add'>+        return read_subvol;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+        if (readable[i])</div><div class='add'>+            return i;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* no readable subvolumes, either split brain or all subvols down */</div><div class='add'>+</div><div class='add'>+    return -1;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	child_index = (long) cookie;</div><div class='del'>-	priv = this-&gt;private;</div><div class='add'>+int</div><div class='add'>+afr_inode_read_subvol_type_get(inode_t *inode, xlator_t *this,</div><div class='add'>+                               unsigned char *readable, int *event_p, int type)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='ctx'> </div><div class='del'>-	LOCK (&amp;frame-&gt;lock);</div><div class='del'>-	{</div><div class='del'>-		local = frame-&gt;local;</div><div class='add'>+    if (type == AFR_METADATA_TRANSACTION)</div><div class='add'>+        ret = afr_inode_read_subvol_get(inode, this, 0, readable, event_p);</div><div class='add'>+    else</div><div class='add'>+        ret = afr_inode_read_subvol_get(inode, this, readable, 0, event_p);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-                lookup_buf = &amp;local-&gt;cont.lookup.buf;</div><div class='add'>+void</div><div class='add'>+afr_readables_intersect_get(inode_t *inode, xlator_t *this, int *event,</div><div class='add'>+                            unsigned char *intersection)</div><div class='add'>+{</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    unsigned char *data_readable = NULL;</div><div class='add'>+    unsigned char *metadata_readable = NULL;</div><div class='add'>+    unsigned char *intersect = NULL;</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+    data_readable = alloca0(priv-&gt;child_count);</div><div class='add'>+    metadata_readable = alloca0(priv-&gt;child_count);</div><div class='add'>+    intersect = alloca0(priv-&gt;child_count);</div><div class='add'>+</div><div class='add'>+    afr_inode_read_subvol_get(inode, this, data_readable, metadata_readable,</div><div class='add'>+                              event);</div><div class='add'>+</div><div class='add'>+    AFR_INTERSECT(intersect, data_readable, metadata_readable,</div><div class='add'>+                  priv-&gt;child_count);</div><div class='add'>+    if (intersection)</div><div class='add'>+        memcpy(intersection, intersect,</div><div class='add'>+               sizeof(*intersection) * priv-&gt;child_count);</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-		if (op_ret == -1) {</div><div class='del'>-			if (op_errno == ENOENT)</div><div class='del'>-				local-&gt;enoent_count++;</div><div class='add'>+int</div><div class='add'>+afr_read_subvol_get(inode_t *inode, xlator_t *this, int *subvol_p,</div><div class='add'>+                    unsigned char *readables, int *event_p,</div><div class='add'>+                    afr_transaction_type type, afr_read_subvol_args_t *args)</div><div class='add'>+{</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    unsigned char *readable = NULL;</div><div class='add'>+    unsigned char *intersection = NULL;</div><div class='add'>+    int subvol = -1;</div><div class='add'>+    int event = 0;</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    readable = alloca0(priv-&gt;child_count);</div><div class='add'>+    intersection = alloca0(priv-&gt;child_count);</div><div class='add'>+</div><div class='add'>+    afr_inode_read_subvol_type_get(inode, this, readable, &amp;event, type);</div><div class='add'>+</div><div class='add'>+    afr_readables_intersect_get(inode, this, &amp;event, intersection);</div><div class='add'>+</div><div class='add'>+    if (AFR_COUNT(intersection, priv-&gt;child_count) &gt; 0)</div><div class='add'>+        subvol = afr_read_subvol_select_by_policy(inode, this, intersection,</div><div class='add'>+                                                  args);</div><div class='add'>+    else</div><div class='add'>+        subvol = afr_read_subvol_select_by_policy(inode, this, readable, args);</div><div class='add'>+    if (subvol_p)</div><div class='add'>+        *subvol_p = subvol;</div><div class='add'>+    if (event_p)</div><div class='add'>+        *event_p = event;</div><div class='add'>+    if (readables)</div><div class='add'>+        memcpy(readables, readable, sizeof(*readables) * priv-&gt;child_count);</div><div class='add'>+    return subvol;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-                        if (__error_more_important (local-&gt;op_errno, op_errno))</div><div class='del'>-                                local-&gt;op_errno = op_errno;</div><div class='add'>+void</div><div class='add'>+afr_local_transaction_cleanup(afr_local_t *local, xlator_t *this)</div><div class='add'>+{</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    int i = 0;</div><div class='ctx'> </div><div class='del'>-                        if (local-&gt;op_errno == ESTALE) {</div><div class='del'>-                                local-&gt;op_ret = -1;</div><div class='del'>-                        }</div><div class='add'>+    priv = this-&gt;private;</div><div class='ctx'> </div><div class='del'>-                        goto unlock;</div><div class='del'>-		}</div><div class='add'>+    afr_matrix_cleanup(local-&gt;pending, priv-&gt;child_count);</div><div class='ctx'> </div><div class='del'>-                afr_lookup_collect_xattr (local, this, child_index, xattr);</div><div class='add'>+    GF_FREE(local-&gt;internal_lock.lower_locked_nodes);</div><div class='ctx'> </div><div class='del'>-                first_up_child = afr_first_up_child (priv);</div><div class='add'>+    afr_lockees_cleanup(&amp;local-&gt;internal_lock);</div><div class='ctx'> </div><div class='del'>-                if (child_index == first_up_child) {</div><div class='del'>-                        local-&gt;cont.lookup.ino =</div><div class='del'>-                                afr_itransform (buf-&gt;ia_ino,</div><div class='del'>-                                                priv-&gt;child_count,</div><div class='del'>-                                                first_up_child);</div><div class='del'>-                        local-&gt;cont.lookup.gen = buf-&gt;ia_gen;</div><div class='del'>-                }</div><div class='add'>+    GF_FREE(local-&gt;transaction.pre_op);</div><div class='ctx'> </div><div class='del'>-		if (local-&gt;success_count == 0) {</div><div class='del'>-                        if (local-&gt;op_errno != ESTALE)</div><div class='del'>-                                local-&gt;op_ret = op_ret;</div><div class='del'>-</div><div class='del'>-			local-&gt;cont.lookup.inode               = inode_ref (inode);</div><div class='del'>-			local-&gt;cont.lookup.xattr               = dict_ref (xattr);</div><div class='del'>-			local-&gt;cont.lookup.xattrs[child_index] = dict_ref (xattr);</div><div class='del'>-                        local-&gt;cont.lookup.postparent          = *postparent;</div><div class='del'>-</div><div class='del'>-                        if (priv-&gt;first_lookup &amp;&amp; inode-&gt;ino == 1) {</div><div class='del'>-                                gf_log (this-&gt;name, GF_LOG_TRACE,</div><div class='del'>-                                        "added root inode");</div><div class='del'>-                                priv-&gt;root_inode = inode_ref (inode);</div><div class='del'>-                                priv-&gt;first_lookup = 0;</div><div class='del'>-                        }</div><div class='del'>-</div><div class='del'>-                        *lookup_buf = *buf;</div><div class='del'>-</div><div class='del'>-                        lookup_buf-&gt;ia_ino = afr_itransform (buf-&gt;ia_ino,</div><div class='del'>-                                                             priv-&gt;child_count,</div><div class='del'>-                                                             child_index);</div><div class='del'>-                        if (priv-&gt;read_child &gt;= 0) {</div><div class='del'>-                                afr_set_read_child (this,</div><div class='del'>-                                                    local-&gt;cont.lookup.inode,</div><div class='del'>-                                                    priv-&gt;read_child);</div><div class='del'>-                        } else {</div><div class='del'>-                                afr_set_read_child (this,</div><div class='del'>-                                                    local-&gt;cont.lookup.inode,</div><div class='del'>-                                                    child_index);</div><div class='del'>-                        }</div><div class='del'>-</div><div class='del'>-		} else {</div><div class='del'>-                        afr_lookup_self_heal_check (this, local, buf, lookup_buf);</div><div class='del'>-</div><div class='del'>-                        if (child_index == local-&gt;read_child_index) {</div><div class='del'>-                                /*</div><div class='del'>-                                   lookup has succeeded on the read child.</div><div class='del'>-                                   So use its inode number</div><div class='del'>-                                */</div><div class='del'>-                                if (local-&gt;cont.lookup.xattr)</div><div class='del'>-                                        dict_unref (local-&gt;cont.lookup.xattr);</div><div class='del'>-</div><div class='del'>-                                local-&gt;cont.lookup.xattr = dict_ref (xattr);</div><div class='del'>-                                local-&gt;cont.lookup.xattrs[child_index] = dict_ref (xattr);</div><div class='del'>-                                local-&gt;cont.lookup.postparent          = *postparent;</div><div class='del'>-</div><div class='del'>-                                *lookup_buf = *buf;</div><div class='del'>-</div><div class='del'>-                                if (priv-&gt;read_child &gt;= 0) {</div><div class='del'>-                                        afr_set_read_child (this,</div><div class='del'>-                                                            local-&gt;cont.lookup.inode,</div><div class='del'>-                                                            priv-&gt;read_child);</div><div class='del'>-                                } else {</div><div class='del'>-                                        afr_set_read_child (this,</div><div class='del'>-                                                            local-&gt;cont.lookup.inode,</div><div class='del'>-                                                            local-&gt;read_child_index);</div><div class='del'>-                                }</div><div class='del'>-                        }</div><div class='del'>-</div><div class='del'>-		}</div><div class='del'>-</div><div class='del'>-		local-&gt;success_count++;</div><div class='del'>-	}</div><div class='del'>-unlock:</div><div class='del'>-	UNLOCK (&amp;frame-&gt;lock);</div><div class='add'>+    GF_FREE(local-&gt;transaction.pre_op_sources);</div><div class='add'>+    if (local-&gt;transaction.changelog_xdata) {</div><div class='add'>+        for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+            if (!local-&gt;transaction.changelog_xdata[i])</div><div class='add'>+                continue;</div><div class='add'>+            dict_unref(local-&gt;transaction.changelog_xdata[i]);</div><div class='add'>+        }</div><div class='add'>+        GF_FREE(local-&gt;transaction.changelog_xdata);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	call_count = afr_frame_return (frame);</div><div class='add'>+    GF_FREE(local-&gt;transaction.failed_subvols);</div><div class='ctx'> </div><div class='del'>-	if (call_count == 0) {</div><div class='del'>-                afr_lookup_done (frame, this, lookup_buf);</div><div class='del'>-	}</div><div class='add'>+    GF_FREE(local-&gt;transaction.basename);</div><div class='add'>+    GF_FREE(local-&gt;transaction.new_basename);</div><div class='ctx'> </div><div class='del'>-	return 0;</div><div class='add'>+    loc_wipe(&amp;local-&gt;transaction.parent_loc);</div><div class='add'>+    loc_wipe(&amp;local-&gt;transaction.new_parent_loc);</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-afr_revalidate_lookup_cbk (call_frame_t *frame, void *cookie,</div><div class='del'>-                           xlator_t *this, int32_t op_ret, int32_t op_errno,</div><div class='del'>-                           inode_t *inode, struct iatt *buf, dict_t *xattr,</div><div class='del'>-                           struct iatt *postparent)</div><div class='add'>+void</div><div class='add'>+afr_reply_wipe(struct afr_reply *reply)</div><div class='ctx'> {</div><div class='del'>-	afr_local_t *   local = NULL;</div><div class='del'>-	afr_private_t * priv  = NULL;</div><div class='del'>-	struct iatt *   lookup_buf = NULL;</div><div class='add'>+    if (reply-&gt;xdata) {</div><div class='add'>+        dict_unref(reply-&gt;xdata);</div><div class='add'>+        reply-&gt;xdata = NULL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (reply-&gt;xattr) {</div><div class='add'>+        dict_unref(reply-&gt;xattr);</div><div class='add'>+        reply-&gt;xattr = NULL;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	int             call_count      = -1;</div><div class='del'>-	int             child_index     = -1;</div><div class='del'>-        int             first_up_child  = -1;</div><div class='add'>+void</div><div class='add'>+afr_replies_wipe(struct afr_reply *replies, int count)</div><div class='add'>+{</div><div class='add'>+    int i = 0;</div><div class='ctx'> </div><div class='del'>-	child_index = (long) cookie;</div><div class='del'>-	priv = this-&gt;private;</div><div class='add'>+    for (i = 0; i &lt; count; i++) {</div><div class='add'>+        afr_reply_wipe(&amp;replies[i]);</div><div class='add'>+    }</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	LOCK (&amp;frame-&gt;lock);</div><div class='del'>-	{</div><div class='del'>-		local = frame-&gt;local;</div><div class='add'>+void</div><div class='add'>+afr_local_replies_wipe(afr_local_t *local, afr_private_t *priv)</div><div class='add'>+{</div><div class='add'>+    if (!local-&gt;replies)</div><div class='add'>+        return;</div><div class='ctx'> </div><div class='del'>-		lookup_buf = &amp;local-&gt;cont.lookup.buf;</div><div class='add'>+    afr_replies_wipe(local-&gt;replies, priv-&gt;child_count);</div><div class='ctx'> </div><div class='del'>-		if (op_ret == -1) {</div><div class='del'>-			if (op_errno == ENOENT)</div><div class='del'>-				local-&gt;enoent_count++;</div><div class='add'>+    memset(local-&gt;replies, 0, sizeof(*local-&gt;replies) * priv-&gt;child_count);</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-                        if (__error_more_important (local-&gt;op_errno, op_errno))</div><div class='del'>-                            local-&gt;op_errno = op_errno;</div><div class='add'>+static gf_boolean_t</div><div class='add'>+afr_fop_lock_is_unlock(call_frame_t *frame)</div><div class='add'>+{</div><div class='add'>+    afr_local_t *local = frame-&gt;local;</div><div class='add'>+    switch (local-&gt;op) {</div><div class='add'>+        case GF_FOP_INODELK:</div><div class='add'>+        case GF_FOP_FINODELK:</div><div class='add'>+            if ((F_UNLCK == local-&gt;cont.inodelk.in_flock.l_type) &amp;&amp;</div><div class='add'>+                (local-&gt;cont.inodelk.in_cmd == F_SETLKW ||</div><div class='add'>+                 local-&gt;cont.inodelk.in_cmd == F_SETLK))</div><div class='add'>+                return _gf_true;</div><div class='add'>+            break;</div><div class='add'>+        case GF_FOP_ENTRYLK:</div><div class='add'>+        case GF_FOP_FENTRYLK:</div><div class='add'>+            if (ENTRYLK_UNLOCK == local-&gt;cont.entrylk.in_cmd)</div><div class='add'>+                return _gf_true;</div><div class='add'>+            break;</div><div class='add'>+        default:</div><div class='add'>+            return _gf_false;</div><div class='add'>+    }</div><div class='add'>+    return _gf_false;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-                            if (local-&gt;op_errno == ESTALE) {</div><div class='del'>-                                    local-&gt;op_ret = -1;</div><div class='del'>-                            }</div><div class='add'>+static gf_boolean_t</div><div class='add'>+afr_lk_is_unlock(int32_t cmd, struct gf_flock *flock)</div><div class='add'>+{</div><div class='add'>+    switch (cmd) {</div><div class='add'>+        case F_RESLK_UNLCK:</div><div class='add'>+            return _gf_true;</div><div class='add'>+            break;</div><div class='ctx'> </div><div class='del'>-                            goto unlock;</div><div class='del'>-                }</div><div class='add'>+#if F_SETLKW != F_SETLKW64</div><div class='add'>+        case F_SETLKW64:</div><div class='add'>+#endif</div><div class='add'>+        case F_SETLKW:</div><div class='ctx'> </div><div class='del'>-                afr_lookup_collect_xattr (local, this, child_index, xattr);</div><div class='add'>+#if F_SETLK != F_SETLK64</div><div class='add'>+        case F_SETLK64:</div><div class='add'>+#endif</div><div class='add'>+        case F_SETLK:</div><div class='add'>+            if (F_UNLCK == flock-&gt;l_type)</div><div class='add'>+                return _gf_true;</div><div class='add'>+            break;</div><div class='add'>+        default:</div><div class='add'>+            return _gf_false;</div><div class='add'>+    }</div><div class='add'>+    return _gf_false;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-                first_up_child = afr_first_up_child (priv);</div><div class='add'>+void</div><div class='add'>+afr_handle_inconsistent_fop(call_frame_t *frame, int32_t *op_ret,</div><div class='add'>+                            int32_t *op_errno)</div><div class='add'>+{</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='ctx'> </div><div class='del'>-                if (child_index == first_up_child) {</div><div class='del'>-                        local-&gt;cont.lookup.ino =</div><div class='del'>-                                afr_itransform (buf-&gt;ia_ino,</div><div class='del'>-                                                priv-&gt;child_count,</div><div class='del'>-                                                first_up_child);</div><div class='del'>-                        local-&gt;cont.lookup.gen = buf-&gt;ia_gen;</div><div class='del'>-                }</div><div class='add'>+    if (!frame || !frame-&gt;this || !frame-&gt;local || !frame-&gt;this-&gt;private)</div><div class='add'>+        return;</div><div class='ctx'> </div><div class='del'>-		/* in case of revalidate, we need to send stat of the</div><div class='del'>-		 * child whose stat was sent during the first lookup.</div><div class='del'>-		 * (so that time stamp does not vary with revalidate.</div><div class='del'>-		 * in case it is down, stat of the fist success will</div><div class='del'>-		 * be replied */</div><div class='del'>-</div><div class='del'>-		/* inode number should be preserved across revalidates */</div><div class='del'>-</div><div class='del'>-		if (local-&gt;success_count == 0) {</div><div class='del'>-                        if (local-&gt;op_errno != ESTALE)</div><div class='del'>-                                local-&gt;op_ret = op_ret;</div><div class='del'>-</div><div class='del'>-			local-&gt;cont.lookup.inode               = inode_ref (inode);</div><div class='del'>-			local-&gt;cont.lookup.xattr               = dict_ref (xattr);</div><div class='del'>-			local-&gt;cont.lookup.xattrs[child_index] = dict_ref (xattr);</div><div class='del'>-                        local-&gt;cont.lookup.postparent          = *postparent;</div><div class='del'>-</div><div class='del'>-			*lookup_buf = *buf;</div><div class='del'>-</div><div class='del'>-                        lookup_buf-&gt;ia_ino = afr_itransform (buf-&gt;ia_ino,</div><div class='del'>-                                                             priv-&gt;child_count,</div><div class='del'>-                                                             child_index);</div><div class='del'>-</div><div class='del'>-                        if (priv-&gt;read_child &gt;= 0) {</div><div class='del'>-                                afr_set_read_child (this,</div><div class='del'>-                                                    local-&gt;cont.lookup.inode,</div><div class='del'>-                                                    priv-&gt;read_child);</div><div class='del'>-                        } else {</div><div class='del'>-                                afr_set_read_child (this,</div><div class='del'>-                                                    local-&gt;cont.lookup.inode,</div><div class='del'>-                                                    child_index);</div><div class='del'>-                        }</div><div class='del'>-</div><div class='del'>-		} else {</div><div class='del'>-                        afr_lookup_self_heal_check (this, local, buf, lookup_buf);</div><div class='del'>-</div><div class='del'>-                        if (child_index == local-&gt;read_child_index) {</div><div class='del'>-</div><div class='del'>-                                /*</div><div class='del'>-                                   lookup has succeeded on the read child.</div><div class='del'>-                                   So use its inode number</div><div class='del'>-                                */</div><div class='del'>-</div><div class='del'>-                                if (local-&gt;cont.lookup.xattr)</div><div class='del'>-                                        dict_unref (local-&gt;cont.lookup.xattr);</div><div class='del'>-</div><div class='del'>-                                local-&gt;cont.lookup.xattr               = dict_ref (xattr);</div><div class='del'>-                                local-&gt;cont.lookup.xattrs[child_index] = dict_ref (xattr);</div><div class='del'>-                                local-&gt;cont.lookup.postparent          = *postparent;</div><div class='del'>-</div><div class='del'>-                                *lookup_buf = *buf;</div><div class='del'>-</div><div class='del'>-                                if (priv-&gt;read_child &gt;= 0) {</div><div class='del'>-                                        afr_set_read_child (this,</div><div class='del'>-                                                            local-&gt;cont.lookup.inode,</div><div class='del'>-                                                            priv-&gt;read_child);</div><div class='del'>-                                } else {</div><div class='del'>-                                        afr_set_read_child (this,</div><div class='del'>-                                                            local-&gt;cont.lookup.inode,</div><div class='del'>-                                                            local-&gt;read_child_index);</div><div class='del'>-                                }</div><div class='del'>-                        }</div><div class='del'>-</div><div class='del'>-		}</div><div class='del'>-</div><div class='del'>-		local-&gt;success_count++;</div><div class='del'>-	}</div><div class='del'>-unlock:</div><div class='del'>-	UNLOCK (&amp;frame-&gt;lock);</div><div class='add'>+    if (*op_ret &lt; 0)</div><div class='add'>+        return;</div><div class='ctx'> </div><div class='del'>-	call_count = afr_frame_return (frame);</div><div class='add'>+    /* Failing inodelk/entrylk/lk here is not a good idea because we</div><div class='add'>+     * need to cleanup the locks on the other bricks if we choose to fail</div><div class='add'>+     * the fop here. The brick may go down just after unwind happens as well</div><div class='add'>+     * so anyways the fop will fail when the next fop is sent so leaving</div><div class='add'>+     * it like this for now.*/</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    switch (local-&gt;op) {</div><div class='add'>+        case GF_FOP_LOOKUP:</div><div class='add'>+        case GF_FOP_INODELK:</div><div class='add'>+        case GF_FOP_FINODELK:</div><div class='add'>+        case GF_FOP_ENTRYLK:</div><div class='add'>+        case GF_FOP_FENTRYLK:</div><div class='add'>+        case GF_FOP_LK:</div><div class='add'>+            return;</div><div class='add'>+        default:</div><div class='add'>+            break;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    priv = frame-&gt;this-&gt;private;</div><div class='add'>+    if (!priv-&gt;consistent_io)</div><div class='add'>+        return;</div><div class='ctx'> </div><div class='del'>-	if (call_count == 0) {</div><div class='del'>-                afr_lookup_done (frame, this, lookup_buf);</div><div class='del'>-	}</div><div class='add'>+    if (local-&gt;event_generation &amp;&amp;</div><div class='add'>+        (local-&gt;event_generation != priv-&gt;event_generation))</div><div class='add'>+        goto inconsistent;</div><div class='ctx'> </div><div class='del'>-	return 0;</div><div class='add'>+    return;</div><div class='add'>+inconsistent:</div><div class='add'>+    *op_ret = -1;</div><div class='add'>+    *op_errno = ENOTCONN;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-afr_lookup (call_frame_t *frame, xlator_t *this,</div><div class='del'>-	    loc_t *loc, dict_t *xattr_req)</div><div class='add'>+void</div><div class='add'>+afr_local_cleanup(afr_local_t *local, xlator_t *this)</div><div class='ctx'> {</div><div class='del'>-	afr_private_t *priv = NULL;</div><div class='del'>-	afr_local_t   *local = NULL;</div><div class='del'>-	int            ret = -1;</div><div class='del'>-	int            i = 0;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='ctx'> </div><div class='del'>-        fop_lookup_cbk_t callback;</div><div class='add'>+    if (!local)</div><div class='add'>+        return;</div><div class='ctx'> </div><div class='del'>-        int call_count = 0;</div><div class='add'>+    syncbarrier_destroy(&amp;local-&gt;barrier);</div><div class='ctx'> </div><div class='del'>-        uint64_t       ctx;</div><div class='add'>+    afr_local_transaction_cleanup(local, this);</div><div class='ctx'> </div><div class='del'>-	int32_t        op_errno = 0;</div><div class='add'>+    priv = this-&gt;private;</div><div class='ctx'> </div><div class='del'>-	priv = this-&gt;private;</div><div class='add'>+    loc_wipe(&amp;local-&gt;loc);</div><div class='add'>+    loc_wipe(&amp;local-&gt;newloc);</div><div class='ctx'> </div><div class='del'>-	ALLOC_OR_GOTO (local, afr_local_t, out);</div><div class='add'>+    if (local-&gt;fd)</div><div class='add'>+        fd_unref(local-&gt;fd);</div><div class='ctx'> </div><div class='del'>-	local-&gt;op_ret = -1;</div><div class='add'>+    if (local-&gt;xattr_req)</div><div class='add'>+        dict_unref(local-&gt;xattr_req);</div><div class='ctx'> </div><div class='del'>-	frame-&gt;local = local;</div><div class='add'>+    if (local-&gt;xattr_rsp)</div><div class='add'>+        dict_unref(local-&gt;xattr_rsp);</div><div class='ctx'> </div><div class='del'>-        if (!strcmp (loc-&gt;path, "/" GF_REPLICATE_TRASH_DIR)) {</div><div class='del'>-                op_errno = ENOENT;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='add'>+    if (local-&gt;dict)</div><div class='add'>+        dict_unref(local-&gt;dict);</div><div class='ctx'> </div><div class='del'>-	loc_copy (&amp;local-&gt;loc, loc);</div><div class='add'>+    afr_local_replies_wipe(local, priv);</div><div class='add'>+    GF_FREE(local-&gt;replies);</div><div class='ctx'> </div><div class='del'>-        ret = inode_ctx_get (loc-&gt;inode, this, &amp;ctx);</div><div class='del'>-        if (ret == 0) {</div><div class='del'>-                /* lookup is a revalidate */</div><div class='add'>+    GF_FREE(local-&gt;child_up);</div><div class='ctx'> </div><div class='del'>-                callback = afr_revalidate_lookup_cbk;</div><div class='add'>+    GF_FREE(local-&gt;read_attempted);</div><div class='add'>+</div><div class='add'>+    GF_FREE(local-&gt;readable);</div><div class='add'>+    GF_FREE(local-&gt;readable2);</div><div class='add'>+</div><div class='add'>+    if (local-&gt;inode)</div><div class='add'>+        inode_unref(local-&gt;inode);</div><div class='ctx'> </div><div class='del'>-                local-&gt;cont.lookup.is_revalidate = _gf_true;</div><div class='del'>-                local-&gt;read_child_index          = afr_read_child (this,</div><div class='del'>-                                                                   loc-&gt;inode);</div><div class='del'>-        } else {</div><div class='del'>-                callback = afr_fresh_lookup_cbk;</div><div class='add'>+    if (local-&gt;parent)</div><div class='add'>+        inode_unref(local-&gt;parent);</div><div class='add'>+</div><div class='add'>+    if (local-&gt;parent2)</div><div class='add'>+        inode_unref(local-&gt;parent2);</div><div class='add'>+</div><div class='add'>+    if (local-&gt;refreshinode)</div><div class='add'>+        inode_unref(local-&gt;refreshinode);</div><div class='add'>+</div><div class='add'>+    { /* getxattr */</div><div class='add'>+        GF_FREE(local-&gt;cont.getxattr.name);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    { /* lk */</div><div class='add'>+        GF_FREE(local-&gt;cont.lk.locked_nodes);</div><div class='add'>+        GF_FREE(local-&gt;cont.lk.dom_locked_nodes);</div><div class='add'>+        GF_FREE(local-&gt;cont.lk.dom_lock_op_ret);</div><div class='add'>+        GF_FREE(local-&gt;cont.lk.dom_lock_op_errno);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    { /* create */</div><div class='add'>+        if (local-&gt;cont.create.fd)</div><div class='add'>+            fd_unref(local-&gt;cont.create.fd);</div><div class='add'>+        if (local-&gt;cont.create.params)</div><div class='add'>+            dict_unref(local-&gt;cont.create.params);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    { /* mknod */</div><div class='add'>+        if (local-&gt;cont.mknod.params)</div><div class='add'>+            dict_unref(local-&gt;cont.mknod.params);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    { /* mkdir */</div><div class='add'>+        if (local-&gt;cont.mkdir.params)</div><div class='add'>+            dict_unref(local-&gt;cont.mkdir.params);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    { /* symlink */</div><div class='add'>+        if (local-&gt;cont.symlink.params)</div><div class='add'>+            dict_unref(local-&gt;cont.symlink.params);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    { /* writev */</div><div class='add'>+        GF_FREE(local-&gt;cont.writev.vector);</div><div class='add'>+        if (local-&gt;cont.writev.iobref)</div><div class='add'>+            iobref_unref(local-&gt;cont.writev.iobref);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    { /* setxattr */</div><div class='add'>+        if (local-&gt;cont.setxattr.dict)</div><div class='add'>+            dict_unref(local-&gt;cont.setxattr.dict);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    { /* fsetxattr */</div><div class='add'>+        if (local-&gt;cont.fsetxattr.dict)</div><div class='add'>+            dict_unref(local-&gt;cont.fsetxattr.dict);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    { /* removexattr */</div><div class='add'>+        GF_FREE(local-&gt;cont.removexattr.name);</div><div class='add'>+    }</div><div class='add'>+    { /* xattrop */</div><div class='add'>+        if (local-&gt;cont.xattrop.xattr)</div><div class='add'>+            dict_unref(local-&gt;cont.xattrop.xattr);</div><div class='add'>+    }</div><div class='add'>+    { /* symlink */</div><div class='add'>+        GF_FREE(local-&gt;cont.symlink.linkpath);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    { /* opendir */</div><div class='add'>+        GF_FREE(local-&gt;cont.opendir.checksum);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    { /* open */</div><div class='add'>+        if (local-&gt;cont.open.fd)</div><div class='add'>+            fd_unref(local-&gt;cont.open.fd);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    { /* readdirp */</div><div class='add'>+        if (local-&gt;cont.readdir.dict)</div><div class='add'>+            dict_unref(local-&gt;cont.readdir.dict);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    { /* inodelk */</div><div class='add'>+        GF_FREE(local-&gt;cont.inodelk.volume);</div><div class='add'>+        if (local-&gt;cont.inodelk.xdata)</div><div class='add'>+            dict_unref(local-&gt;cont.inodelk.xdata);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    { /* entrylk */</div><div class='add'>+        GF_FREE(local-&gt;cont.entrylk.volume);</div><div class='add'>+        GF_FREE(local-&gt;cont.entrylk.basename);</div><div class='add'>+        if (local-&gt;cont.entrylk.xdata)</div><div class='add'>+            dict_unref(local-&gt;cont.entrylk.xdata);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (local-&gt;xdata_req)</div><div class='add'>+        dict_unref(local-&gt;xdata_req);</div><div class='add'>+</div><div class='add'>+    if (local-&gt;xdata_rsp)</div><div class='add'>+        dict_unref(local-&gt;xdata_rsp);</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-                LOCK (&amp;priv-&gt;read_child_lock);</div><div class='del'>-                {</div><div class='del'>-                        local-&gt;read_child_index = (++priv-&gt;read_child_rr)</div><div class='del'>-                                % (priv-&gt;child_count);</div><div class='del'>-                }</div><div class='del'>-                UNLOCK (&amp;priv-&gt;read_child_lock);</div><div class='del'>-        }</div><div class='add'>+int</div><div class='add'>+afr_frame_return(call_frame_t *frame)</div><div class='add'>+{</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    int call_count = 0;</div><div class='ctx'> </div><div class='del'>-        if (loc-&gt;parent)</div><div class='del'>-                local-&gt;cont.lookup.parent_ino = loc-&gt;parent-&gt;ino;</div><div class='add'>+    local = frame-&gt;local;</div><div class='ctx'> </div><div class='del'>-	local-&gt;child_up = memdup (priv-&gt;child_up, priv-&gt;child_count);</div><div class='add'>+    LOCK(&amp;frame-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        call_count = --local-&gt;call_count;</div><div class='add'>+    }</div><div class='add'>+    UNLOCK(&amp;frame-&gt;lock);</div><div class='ctx'> </div><div class='del'>-        local-&gt;cont.lookup.xattrs = GF_CALLOC (priv-&gt;child_count,</div><div class='del'>-                                    sizeof (*local-&gt;cont.lookup.xattr),</div><div class='del'>-                                    gf_afr_mt_dict_t);</div><div class='add'>+    return call_count;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	local-&gt;call_count = afr_up_children_count (priv-&gt;child_count,</div><div class='del'>-                                                   local-&gt;child_up);</div><div class='del'>-        call_count = local-&gt;call_count;</div><div class='add'>+static char *afr_ignore_xattrs[] = {GF_SELINUX_XATTR_KEY, QUOTA_SIZE_KEY, NULL};</div><div class='ctx'> </div><div class='del'>-        if (local-&gt;call_count == 0) {</div><div class='del'>-                ret      = -1;</div><div class='del'>-                op_errno = ENOTCONN;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='add'>+gf_boolean_t</div><div class='add'>+afr_is_xattr_ignorable(char *key)</div><div class='add'>+{</div><div class='add'>+    int i = 0;</div><div class='add'>+</div><div class='add'>+    if (!strncmp(key, AFR_XATTR_PREFIX, SLEN(AFR_XATTR_PREFIX)))</div><div class='add'>+        return _gf_true;</div><div class='add'>+    for (i = 0; afr_ignore_xattrs[i]; i++) {</div><div class='add'>+        if (!strcmp(key, afr_ignore_xattrs[i]))</div><div class='add'>+            return _gf_true;</div><div class='add'>+    }</div><div class='add'>+    return _gf_false;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	/* By default assume ENOTCONN. On success it will be set to 0. */</div><div class='del'>-	local-&gt;op_errno = ENOTCONN;</div><div class='add'>+static gf_boolean_t</div><div class='add'>+afr_xattr_match_needed(dict_t *this, char *key1, data_t *value1, void *data)</div><div class='add'>+{</div><div class='add'>+    /* Ignore all non-disk (i.e. virtual) xattrs right away. */</div><div class='add'>+    if (!gf_is_valid_xattr_namespace(key1))</div><div class='add'>+        return _gf_false;</div><div class='ctx'> </div><div class='del'>-	if (xattr_req == NULL)</div><div class='del'>-		local-&gt;xattr_req = dict_new ();</div><div class='del'>-	else</div><div class='del'>-		local-&gt;xattr_req = dict_ref (xattr_req);</div><div class='add'>+    /* Ignore on-disk xattrs that AFR doesn't need to heal. */</div><div class='add'>+    if (!afr_is_xattr_ignorable(key1))</div><div class='add'>+        return _gf_true;</div><div class='ctx'> </div><div class='del'>-        for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='del'>-		ret = dict_set_uint64 (local-&gt;xattr_req, priv-&gt;pending_key[i],</div><div class='del'>-				       3 * sizeof(int32_t));</div><div class='del'>-                if (ret &lt; 0)</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_WARNING,</div><div class='del'>-                                "Unable to set dict value.");</div><div class='del'>-                /* 3 = data+metadata+entry */</div><div class='del'>-        }</div><div class='add'>+    return _gf_false;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	ret = dict_set_uint64 (local-&gt;xattr_req, GLUSTERFS_OPEN_FD_COUNT, 0);</div><div class='del'>-        if (ret &lt; 0) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_WARNING,</div><div class='del'>-                        "Unable to set dict value.");</div><div class='del'>-        }</div><div class='add'>+gf_boolean_t</div><div class='add'>+afr_xattrs_are_equal(dict_t *dict1, dict_t *dict2)</div><div class='add'>+{</div><div class='add'>+    return are_dicts_equal(dict1, dict2, afr_xattr_match_needed, NULL);</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        ret = dict_set_uint64 (local-&gt;xattr_req, GLUSTERFS_INODELK_COUNT, 0);</div><div class='del'>-        if (ret &lt; 0) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_WARNING,</div><div class='del'>-                        "Unable to set dict value.");</div><div class='del'>-        }</div><div class='add'>+static int</div><div class='add'>+afr_get_parent_read_subvol(xlator_t *this, inode_t *parent,</div><div class='add'>+                           struct afr_reply *replies, unsigned char *readable)</div><div class='add'>+{</div><div class='add'>+    int i = 0;</div><div class='add'>+    int par_read_subvol = -1;</div><div class='add'>+    int par_read_subvol_iter = -1;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='ctx'> </div><div class='del'>-        ret = dict_set_uint64 (local-&gt;xattr_req, GLUSTERFS_ENTRYLK_COUNT, 0);</div><div class='del'>-        if (ret &lt; 0) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_WARNING,</div><div class='del'>-                        "Unable to set dict value.");</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-	for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='del'>-                if (local-&gt;child_up[i]) {</div><div class='del'>-                        STACK_WIND_COOKIE (frame, callback, (void *) (long) i,</div><div class='del'>-                                           priv-&gt;children[i],</div><div class='del'>-                                           priv-&gt;children[i]-&gt;fops-&gt;lookup,</div><div class='del'>-                                           loc, local-&gt;xattr_req);</div><div class='del'>-                        if (!--call_count)</div><div class='del'>-                                break;</div><div class='del'>-                }</div><div class='del'>-	}</div><div class='add'>+    priv = this-&gt;private;</div><div class='ctx'> </div><div class='del'>-	ret = 0;</div><div class='del'>-out:</div><div class='del'>-	if (ret == -1)</div><div class='del'>-		AFR_STACK_UNWIND (lookup, frame, -1, op_errno,</div><div class='del'>-                                  NULL, NULL, NULL, NULL);</div><div class='add'>+    if (parent)</div><div class='add'>+        par_read_subvol = afr_data_subvol_get(parent, this, NULL, NULL, NULL,</div><div class='add'>+                                              NULL);</div><div class='ctx'> </div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='add'>+    for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+        if (!replies[i].valid)</div><div class='add'>+            continue;</div><div class='add'>+</div><div class='add'>+        if (replies[i].op_ret &lt; 0)</div><div class='add'>+            continue;</div><div class='ctx'> </div><div class='add'>+        if (par_read_subvol_iter == -1) {</div><div class='add'>+            par_read_subvol_iter = i;</div><div class='add'>+            continue;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-/* {{{ open */</div><div class='add'>+        if ((par_read_subvol_iter != par_read_subvol) &amp;&amp; readable[i])</div><div class='add'>+            par_read_subvol_iter = i;</div><div class='add'>+</div><div class='add'>+        if (i == par_read_subvol)</div><div class='add'>+            par_read_subvol_iter = i;</div><div class='add'>+    }</div><div class='add'>+    /* At the end of the for-loop, the only reason why @par_read_subvol_iter</div><div class='add'>+     * could be -1 is when this LOOKUP has failed on all sub-volumes.</div><div class='add'>+     * So it is okay to send an arbitrary subvolume (0 in this case)</div><div class='add'>+     * as parent read subvol.</div><div class='add'>+     */</div><div class='add'>+    if (par_read_subvol_iter == -1)</div><div class='add'>+        par_read_subvol_iter = 0;</div><div class='add'>+</div><div class='add'>+    return par_read_subvol_iter;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-afr_fd_ctx_set (xlator_t *this, fd_t *fd)</div><div class='add'>+afr_read_subvol_decide(inode_t *inode, xlator_t *this,</div><div class='add'>+                       afr_read_subvol_args_t *args, unsigned char *readable)</div><div class='ctx'> {</div><div class='del'>-        afr_private_t * priv = NULL;</div><div class='add'>+    int event = 0;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    unsigned char *intersection = NULL;</div><div class='ctx'> </div><div class='del'>-        int ret    = 0;</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+    intersection = alloca0(priv-&gt;child_count);</div><div class='ctx'> </div><div class='del'>-        uint64_t       ctx;</div><div class='del'>-        afr_fd_ctx_t * fd_ctx = NULL;</div><div class='add'>+    afr_readables_intersect_get(inode, this, &amp;event, intersection);</div><div class='ctx'> </div><div class='del'>-        VALIDATE_OR_GOTO (this-&gt;private, out);</div><div class='del'>-        VALIDATE_OR_GOTO (fd, out);</div><div class='add'>+    if (AFR_COUNT(intersection, priv-&gt;child_count) &lt;= 0) {</div><div class='add'>+        /* TODO: If we have one brick with valid data_readable and</div><div class='add'>+         * another with metadata_readable, try to send an iatt with</div><div class='add'>+         * valid bits from both.*/</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        priv = this-&gt;private;</div><div class='add'>+    memcpy(readable, intersection, sizeof(*readable) * priv-&gt;child_count);</div><div class='ctx'> </div><div class='del'>-        LOCK (&amp;fd-&gt;lock);</div><div class='del'>-        {</div><div class='del'>-                ret = __fd_ctx_get (fd, this, &amp;ctx);</div><div class='add'>+    return afr_read_subvol_select_by_policy(inode, this, intersection, args);</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-                if (ret == 0)</div><div class='del'>-                        goto unlock;</div><div class='add'>+static inline int</div><div class='add'>+afr_first_up_child(call_frame_t *frame, xlator_t *this)</div><div class='add'>+{</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    int i = 0;</div><div class='ctx'> </div><div class='del'>-                fd_ctx = GF_CALLOC (1, sizeof (afr_fd_ctx_t),</div><div class='del'>-                                    gf_afr_mt_afr_fd_ctx_t);</div><div class='del'>-                if (!fd_ctx) {</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-                                "Out of memory");</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    priv = this-&gt;private;</div><div class='ctx'> </div><div class='del'>-                        ret = -ENOMEM;</div><div class='del'>-                        goto unlock;</div><div class='del'>-                }</div><div class='add'>+    for (i = 0; i &lt; priv-&gt;child_count; i++)</div><div class='add'>+        if (local-&gt;replies[i].valid &amp;&amp; local-&gt;replies[i].op_ret == 0)</div><div class='add'>+            return i;</div><div class='add'>+    return -1;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-                fd_ctx-&gt;pre_op_done = GF_CALLOC (sizeof (*fd_ctx-&gt;pre_op_done),</div><div class='del'>-                                                 priv-&gt;child_count,</div><div class='del'>-                                                 gf_afr_mt_char);</div><div class='del'>-                if (!fd_ctx-&gt;pre_op_done) {</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-                                "Out of memory");</div><div class='del'>-                        ret = -ENOMEM;</div><div class='del'>-                        goto unlock;</div><div class='del'>-                }</div><div class='add'>+static void</div><div class='add'>+afr_attempt_readsubvol_set(call_frame_t *frame, xlator_t *this,</div><div class='add'>+                           unsigned char *success_replies,</div><div class='add'>+                           unsigned char *data_readable, int *read_subvol)</div><div class='add'>+{</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    int spb_subvol = -1;</div><div class='add'>+    int child_count = -1;</div><div class='ctx'> </div><div class='del'>-                fd_ctx-&gt;opened_on = GF_CALLOC (sizeof (*fd_ctx-&gt;opened_on),</div><div class='del'>-                                               priv-&gt;child_count,</div><div class='del'>-                                               gf_afr_mt_char);</div><div class='del'>-                if (!fd_ctx-&gt;opened_on) {</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-                                "Out of memory");</div><div class='del'>-                        ret = -ENOMEM;</div><div class='del'>-                        goto unlock;</div><div class='del'>-                }</div><div class='add'>+    if (*read_subvol != -1)</div><div class='add'>+        return;</div><div class='ctx'> </div><div class='del'>-                fd_ctx-&gt;child_failed = GF_CALLOC (</div><div class='del'>-                                         sizeof (*fd_ctx-&gt;child_failed),</div><div class='del'>-                                         priv-&gt;child_count,</div><div class='del'>-                                         gf_afr_mt_char);</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    child_count = priv-&gt;child_count;</div><div class='add'>+</div><div class='add'>+    afr_split_brain_read_subvol_get(local-&gt;inode, this, frame, &amp;spb_subvol);</div><div class='add'>+    if ((spb_subvol &gt;= 0) &amp;&amp;</div><div class='add'>+        (AFR_COUNT(success_replies, child_count) == child_count)) {</div><div class='add'>+        *read_subvol = spb_subvol;</div><div class='add'>+    } else if (!priv-&gt;quorum_count ||</div><div class='add'>+               frame-&gt;root-&gt;pid == GF_CLIENT_PID_GLFS_HEAL) {</div><div class='add'>+        *read_subvol = afr_first_up_child(frame, this);</div><div class='add'>+    } else if (priv-&gt;quorum_count &amp;&amp;</div><div class='add'>+               afr_has_quorum(data_readable, this, NULL)) {</div><div class='add'>+        /* read_subvol is guaranteed to be valid if we hit this path. */</div><div class='add'>+        *read_subvol = afr_first_up_child(frame, this);</div><div class='add'>+    } else {</div><div class='add'>+        /* If quorum is enabled and we do not have a</div><div class='add'>+           readable yet, it means all good copies are down.</div><div class='add'>+        */</div><div class='add'>+        local-&gt;op_ret = -1;</div><div class='add'>+        local-&gt;op_errno = ENOTCONN;</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_WARNING, 0, AFR_MSG_READ_SUBVOL_ERROR,</div><div class='add'>+               "no read "</div><div class='add'>+               "subvols for %s",</div><div class='add'>+               local-&gt;loc.path);</div><div class='add'>+    }</div><div class='add'>+    if (*read_subvol &gt;= 0)</div><div class='add'>+        dict_del_sizen(local-&gt;replies[*read_subvol].xdata, GF_CONTENT_KEY);</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-                if (!fd_ctx-&gt;child_failed) {</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-                                "Out of memory");</div><div class='add'>+static void</div><div class='add'>+afr_lookup_done(call_frame_t *frame, xlator_t *this)</div><div class='add'>+{</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    int i = -1;</div><div class='add'>+    int op_errno = 0;</div><div class='add'>+    int read_subvol = 0;</div><div class='add'>+    int par_read_subvol = 0;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    unsigned char *readable = NULL;</div><div class='add'>+    unsigned char *success_replies = NULL;</div><div class='add'>+    int event = 0;</div><div class='add'>+    struct afr_reply *replies = NULL;</div><div class='add'>+    uuid_t read_gfid = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    gf_boolean_t locked_entry = _gf_false;</div><div class='add'>+    gf_boolean_t in_flight_create = _gf_false;</div><div class='add'>+    gf_boolean_t can_interpret = _gf_true;</div><div class='add'>+    inode_t *parent = NULL;</div><div class='add'>+    ia_type_t ia_type = IA_INVAL;</div><div class='add'>+    afr_read_subvol_args_t args = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    char *gfid_heal_msg = NULL;</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    replies = local-&gt;replies;</div><div class='add'>+    parent = local-&gt;loc.parent;</div><div class='add'>+</div><div class='add'>+    locked_entry = afr_is_possibly_under_txn(AFR_ENTRY_TRANSACTION, local,</div><div class='add'>+                                             this);</div><div class='add'>+</div><div class='add'>+    readable = alloca0(priv-&gt;child_count);</div><div class='add'>+    success_replies = alloca0(priv-&gt;child_count);</div><div class='add'>+</div><div class='add'>+    afr_inode_read_subvol_get(parent, this, readable, NULL, &amp;event);</div><div class='add'>+    par_read_subvol = afr_get_parent_read_subvol(this, parent, replies,</div><div class='add'>+                                                 readable);</div><div class='add'>+</div><div class='add'>+    /* First, check if we have a gfid-change from somewhere,</div><div class='add'>+       If so, propagate that so that a fresh lookup can be</div><div class='add'>+       issued</div><div class='add'>+    */</div><div class='add'>+    if (local-&gt;cont.lookup.needs_fresh_lookup) {</div><div class='add'>+        local-&gt;op_ret = -1;</div><div class='add'>+        local-&gt;op_errno = ESTALE;</div><div class='add'>+        goto error;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    op_errno = afr_final_errno(frame-&gt;local, this-&gt;private);</div><div class='add'>+    local-&gt;op_errno = op_errno;</div><div class='add'>+</div><div class='add'>+    read_subvol = -1;</div><div class='add'>+    afr_fill_success_replies(local, priv, success_replies);</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+        if (!replies[i].valid)</div><div class='add'>+            continue;</div><div class='add'>+</div><div class='add'>+        if (replies[i].op_ret == -1) {</div><div class='add'>+            if (locked_entry &amp;&amp; replies[i].op_errno == ENOENT) {</div><div class='add'>+                in_flight_create = _gf_true;</div><div class='add'>+            }</div><div class='add'>+            continue;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-                        ret = -ENOMEM;</div><div class='del'>-                        goto unlock;</div><div class='del'>-                }</div><div class='add'>+        if (read_subvol == -1 || !readable[read_subvol]) {</div><div class='add'>+            read_subvol = i;</div><div class='add'>+            gf_uuid_copy(read_gfid, replies[i].poststat.ia_gfid);</div><div class='add'>+            ia_type = replies[i].poststat.ia_type;</div><div class='add'>+            local-&gt;op_ret = 0;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (in_flight_create &amp;&amp; !afr_has_quorum(success_replies, this, NULL)) {</div><div class='add'>+        local-&gt;op_ret = -1;</div><div class='add'>+        local-&gt;op_errno = ENOENT;</div><div class='add'>+        goto error;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (read_subvol == -1)</div><div class='add'>+        goto error;</div><div class='add'>+    /* We now have a read_subvol, which is readable[] (if there</div><div class='add'>+       were any). Next we look for GFID mismatches. We don't</div><div class='add'>+       consider a GFID mismatch as an error if read_subvol is</div><div class='add'>+       readable[] but the mismatching GFID subvol is not.</div><div class='add'>+    */</div><div class='add'>+    for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+        if (!replies[i].valid || replies[i].op_ret == -1) {</div><div class='add'>+            continue;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-                fd_ctx-&gt;up_count   = priv-&gt;up_count;</div><div class='del'>-                fd_ctx-&gt;down_count = priv-&gt;down_count;</div><div class='add'>+        if (!gf_uuid_compare(replies[i].poststat.ia_gfid, read_gfid))</div><div class='add'>+            continue;</div><div class='add'>+</div><div class='add'>+        can_interpret = _gf_false;</div><div class='add'>+</div><div class='add'>+        if (locked_entry)</div><div class='add'>+            continue;</div><div class='add'>+</div><div class='add'>+        /* Now GFIDs mismatch. It's OK as long as this subvol</div><div class='add'>+           is not readable[] but read_subvol is */</div><div class='add'>+        if (readable[read_subvol] &amp;&amp; !readable[i])</div><div class='add'>+            continue;</div><div class='add'>+</div><div class='add'>+        /* If we were called from glfsheal and there is still a gfid</div><div class='add'>+         * mismatch, succeed the lookup and let glfsheal print the</div><div class='add'>+         * response via gfid-heal-msg.*/</div><div class='add'>+        if (!dict_get_str_sizen(local-&gt;xattr_req, "gfid-heal-msg",</div><div class='add'>+                                &amp;gfid_heal_msg))</div><div class='add'>+            goto cant_interpret;</div><div class='add'>+</div><div class='add'>+        /* LOG ERROR */</div><div class='add'>+        local-&gt;op_ret = -1;</div><div class='add'>+        local-&gt;op_errno = EIO;</div><div class='add'>+        goto error;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Forth, for the finalized GFID, pick the best subvolume</div><div class='add'>+       to return stats from.</div><div class='add'>+    */</div><div class='add'>+    read_subvol = -1;</div><div class='add'>+    memset(readable, 0, sizeof(*readable) * priv-&gt;child_count);</div><div class='add'>+    if (can_interpret) {</div><div class='add'>+        if (!afr_has_quorum(success_replies, this, NULL))</div><div class='add'>+            goto cant_interpret;</div><div class='add'>+        /* It is safe to call afr_replies_interpret() because we have</div><div class='add'>+           a response from all the UP subvolumes and all of them resolved</div><div class='add'>+           to the same GFID</div><div class='add'>+        */</div><div class='add'>+        gf_uuid_copy(args.gfid, read_gfid);</div><div class='add'>+        args.ia_type = ia_type;</div><div class='add'>+        ret = afr_replies_interpret(frame, this, local-&gt;inode, NULL);</div><div class='add'>+        read_subvol = afr_read_subvol_decide(local-&gt;inode, this, &amp;args,</div><div class='add'>+                                             readable);</div><div class='add'>+        if (read_subvol == -1)</div><div class='add'>+            goto cant_interpret;</div><div class='add'>+        if (ret) {</div><div class='add'>+            afr_inode_need_refresh_set(local-&gt;inode, this);</div><div class='add'>+            dict_del_sizen(local-&gt;replies[read_subvol].xdata, GF_CONTENT_KEY);</div><div class='add'>+        }</div><div class='add'>+    } else {</div><div class='add'>+    cant_interpret:</div><div class='add'>+        afr_attempt_readsubvol_set(frame, this, success_replies, readable,</div><div class='add'>+                                   &amp;read_subvol);</div><div class='add'>+        if (read_subvol == -1) {</div><div class='add'>+            goto error;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    afr_handle_quota_size(frame, this);</div><div class='add'>+</div><div class='add'>+    afr_set_need_heal(this, local);</div><div class='add'>+    if (AFR_IS_ARBITER_BRICK(priv, read_subvol) &amp;&amp; local-&gt;op_ret == 0) {</div><div class='add'>+        local-&gt;op_ret = -1;</div><div class='add'>+        local-&gt;op_errno = ENOTCONN;</div><div class='add'>+        gf_msg_debug(this-&gt;name, 0,</div><div class='add'>+                     "Arbiter cannot be a read subvol "</div><div class='add'>+                     "for %s",</div><div class='add'>+                     local-&gt;loc.path);</div><div class='add'>+        goto error;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_get_str_sizen(local-&gt;xattr_req, "gfid-heal-msg", &amp;gfid_heal_msg);</div><div class='add'>+    if (!ret) {</div><div class='add'>+        ret = dict_set_str_sizen(local-&gt;replies[read_subvol].xdata,</div><div class='add'>+                                 "gfid-heal-msg", gfid_heal_msg);</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, 0, AFR_MSG_DICT_SET_FAILED,</div><div class='add'>+                   "Error setting gfid-heal-msg dict");</div><div class='add'>+            local-&gt;op_ret = -1;</div><div class='add'>+            local-&gt;op_errno = ENOMEM;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-                ret = __fd_ctx_set (fd, this, (uint64_t)(long) fd_ctx);</div><div class='add'>+    AFR_STACK_UNWIND(lookup, frame, local-&gt;op_ret, local-&gt;op_errno,</div><div class='add'>+                     local-&gt;inode, &amp;local-&gt;replies[read_subvol].poststat,</div><div class='add'>+                     local-&gt;replies[read_subvol].xdata,</div><div class='add'>+                     &amp;local-&gt;replies[par_read_subvol].postparent);</div><div class='add'>+    return;</div><div class='ctx'> </div><div class='del'>-                INIT_LIST_HEAD (&amp;fd_ctx-&gt;entries);</div><div class='del'>-        }</div><div class='del'>-unlock:</div><div class='del'>-        UNLOCK (&amp;fd-&gt;lock);</div><div class='del'>-out:</div><div class='del'>-        return ret;</div><div class='add'>+error:</div><div class='add'>+    AFR_STACK_UNWIND(lookup, frame, local-&gt;op_ret, local-&gt;op_errno, NULL, NULL,</div><div class='add'>+                     NULL, NULL);</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-/* {{{ flush */</div><div class='add'>+/*</div><div class='add'>+ * During a lookup, some errors are more "important" than</div><div class='add'>+ * others in that they must be given higher priority while</div><div class='add'>+ * returning to the user.</div><div class='add'>+ *</div><div class='add'>+ * The hierarchy is ENODATA &gt; ENOENT &gt; ESTALE &gt; ENOSPC others</div><div class='add'>+ */</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-afr_flush_unwind (call_frame_t *frame, xlator_t *this)</div><div class='add'>+afr_higher_errno(int32_t old_errno, int32_t new_errno)</div><div class='ctx'> {</div><div class='del'>-	afr_local_t *   local = NULL;</div><div class='del'>-	call_frame_t   *main_frame = NULL;</div><div class='add'>+    if (old_errno == ENODATA || new_errno == ENODATA)</div><div class='add'>+        return ENODATA;</div><div class='add'>+    if (old_errno == ENOENT || new_errno == ENOENT)</div><div class='add'>+        return ENOENT;</div><div class='add'>+    if (old_errno == ESTALE || new_errno == ESTALE)</div><div class='add'>+        return ESTALE;</div><div class='add'>+    if (old_errno == ENOSPC || new_errno == ENOSPC)</div><div class='add'>+        return ENOSPC;</div><div class='add'>+</div><div class='add'>+    return new_errno;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	local = frame-&gt;local;</div><div class='add'>+int</div><div class='add'>+afr_final_errno(afr_local_t *local, afr_private_t *priv)</div><div class='add'>+{</div><div class='add'>+    int i = 0;</div><div class='add'>+    int op_errno = 0;</div><div class='add'>+    int tmp_errno = 0;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+        if (!local-&gt;replies[i].valid)</div><div class='add'>+            continue;</div><div class='add'>+        if (local-&gt;replies[i].op_ret &gt;= 0)</div><div class='add'>+            continue;</div><div class='add'>+        tmp_errno = local-&gt;replies[i].op_errno;</div><div class='add'>+        op_errno = afr_higher_errno(op_errno, tmp_errno);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return op_errno;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	LOCK (&amp;frame-&gt;lock);</div><div class='del'>-	{</div><div class='del'>-		if (local-&gt;transaction.main_frame)</div><div class='del'>-			main_frame = local-&gt;transaction.main_frame;</div><div class='del'>-		local-&gt;transaction.main_frame = NULL;</div><div class='del'>-	}</div><div class='del'>-	UNLOCK (&amp;frame-&gt;lock);</div><div class='add'>+static int32_t</div><div class='add'>+afr_local_discovery_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                        int32_t op_ret, int32_t op_errno, dict_t *dict,</div><div class='add'>+                        dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+    char *pathinfo = NULL;</div><div class='add'>+    gf_boolean_t is_local = _gf_false;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    int32_t child_index = -1;</div><div class='add'>+</div><div class='add'>+    if (op_ret != 0) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+    child_index = (int32_t)(long)cookie;</div><div class='add'>+</div><div class='add'>+    ret = dict_get_str_sizen(dict, GF_XATTR_PATHINFO_KEY, &amp;pathinfo);</div><div class='add'>+    if (ret != 0) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = glusterfs_is_local_pathinfo(pathinfo, &amp;is_local);</div><div class='add'>+    if (ret) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /*</div><div class='add'>+     * Note that one local subvolume will override another here.  The only</div><div class='add'>+     * way to avoid that would be to retain extra information about whether</div><div class='add'>+     * the previous read_child is local, and it's just not worth it.  Even</div><div class='add'>+     * the slowest local subvolume is far preferable to a remote one.</div><div class='add'>+     */</div><div class='add'>+    if (is_local) {</div><div class='add'>+        priv-&gt;local[child_index] = 1;</div><div class='add'>+        /* Don't set arbiter as read child. */</div><div class='add'>+        if (AFR_IS_ARBITER_BRICK(priv, child_index))</div><div class='add'>+            goto out;</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_INFO, 0, AFR_MSG_LOCAL_CHILD,</div><div class='add'>+               "selecting local read_child %s",</div><div class='add'>+               priv-&gt;children[child_index]-&gt;name);</div><div class='add'>+</div><div class='add'>+        priv-&gt;read_child = child_index;</div><div class='add'>+    }</div><div class='add'>+out:</div><div class='add'>+    STACK_DESTROY(frame-&gt;root);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	if (main_frame) {</div><div class='del'>-		AFR_STACK_UNWIND (flush, main_frame,</div><div class='del'>-                                  local-&gt;op_ret, local-&gt;op_errno);</div><div class='del'>-	}</div><div class='add'>+static void</div><div class='add'>+afr_attempt_local_discovery(xlator_t *this, int32_t child_index)</div><div class='add'>+{</div><div class='add'>+    call_frame_t *newframe = NULL;</div><div class='add'>+    loc_t tmploc = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    afr_private_t *priv = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    newframe = create_frame(this, this-&gt;ctx-&gt;pool);</div><div class='add'>+    if (!newframe) {</div><div class='add'>+        return;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	return 0;</div><div class='add'>+    tmploc.gfid[sizeof(tmploc.gfid) - 1] = 1;</div><div class='add'>+    STACK_WIND_COOKIE(newframe, afr_local_discovery_cbk,</div><div class='add'>+                      (void *)(long)child_index, priv-&gt;children[child_index],</div><div class='add'>+                      priv-&gt;children[child_index]-&gt;fops-&gt;getxattr, &amp;tmploc,</div><div class='add'>+                      GF_XATTR_PATHINFO_KEY, NULL);</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-afr_flush_wind_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-		      int32_t op_ret, int32_t op_errno)</div><div class='add'>+afr_lookup_sh_metadata_wrap(void *opaque)</div><div class='ctx'> {</div><div class='del'>-        afr_local_t *   local = NULL;</div><div class='del'>-	afr_private_t * priv  = NULL;</div><div class='del'>-</div><div class='del'>-	int call_count  = -1;</div><div class='del'>-	int child_index = (long) cookie;</div><div class='del'>-	int need_unwind = 0;</div><div class='add'>+    call_frame_t *frame = opaque;</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    xlator_t *this = NULL;</div><div class='add'>+    inode_t *inode = NULL;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    struct afr_reply *replies = NULL;</div><div class='add'>+    int i = 0, first = -1;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    dict_t *dict = NULL;</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    this = frame-&gt;this;</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+    replies = local-&gt;replies;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+        if (!replies[i].valid || replies[i].op_ret == -1)</div><div class='add'>+            continue;</div><div class='add'>+        first = i;</div><div class='add'>+        break;</div><div class='add'>+    }</div><div class='add'>+    if (first == -1)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    if (afr_selfheal_metadata_by_stbuf(this, &amp;replies[first].poststat))</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    afr_local_replies_wipe(local, this-&gt;private);</div><div class='add'>+</div><div class='add'>+    dict = dict_new();</div><div class='add'>+    if (!dict)</div><div class='add'>+        goto out;</div><div class='add'>+    if (local-&gt;xattr_req) {</div><div class='add'>+        dict_copy(local-&gt;xattr_req, dict);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_set_sizen_str_sizen(dict, "link-count", GF_XATTROP_INDEX_COUNT);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_msg_debug(this-&gt;name, -ret, "Unable to set link-count in dict ");</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (loc_is_nameless(&amp;local-&gt;loc)) {</div><div class='add'>+        ret = afr_selfheal_unlocked_discover_on(frame, local-&gt;inode,</div><div class='add'>+                                                local-&gt;loc.gfid, local-&gt;replies,</div><div class='add'>+                                                local-&gt;child_up, dict);</div><div class='add'>+    } else {</div><div class='add'>+        inode = afr_selfheal_unlocked_lookup_on(frame, local-&gt;loc.parent,</div><div class='add'>+                                                local-&gt;loc.name, local-&gt;replies,</div><div class='add'>+                                                local-&gt;child_up, dict);</div><div class='add'>+    }</div><div class='add'>+    if (inode)</div><div class='add'>+        inode_unref(inode);</div><div class='add'>+out:</div><div class='add'>+    if (loc_is_nameless(&amp;local-&gt;loc))</div><div class='add'>+        afr_discover_done(frame, this);</div><div class='add'>+    else</div><div class='add'>+        afr_lookup_done(frame, this);</div><div class='ctx'> </div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-	priv  = this-&gt;private;</div><div class='add'>+    if (dict)</div><div class='add'>+        dict_unref(dict);</div><div class='ctx'> </div><div class='del'>-	LOCK (&amp;frame-&gt;lock);</div><div class='del'>-	{</div><div class='del'>-		if (afr_fop_failed (op_ret, op_errno))</div><div class='del'>-			afr_transaction_fop_failed (frame, this, child_index);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-		if (op_ret != -1) {</div><div class='del'>-			if (local-&gt;success_count == 0) {</div><div class='del'>-				local-&gt;op_ret = op_ret;</div><div class='del'>-			}</div><div class='del'>-			local-&gt;success_count++;</div><div class='add'>+gf_boolean_t</div><div class='add'>+afr_is_pending_set(xlator_t *this, dict_t *xdata, int type)</div><div class='add'>+{</div><div class='add'>+    int idx = -1;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    void *pending_raw = NULL;</div><div class='add'>+    int *pending_int = NULL;</div><div class='add'>+    int i = 0;</div><div class='ctx'> </div><div class='del'>-			if (local-&gt;success_count == priv-&gt;wait_count) {</div><div class='del'>-				need_unwind = 1;</div><div class='del'>-			}</div><div class='del'>-		}</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+    idx = afr_index_for_transaction_type(type);</div><div class='ctx'> </div><div class='del'>-		local-&gt;op_errno = op_errno;</div><div class='del'>-	}</div><div class='del'>-	UNLOCK (&amp;frame-&gt;lock);</div><div class='add'>+    if (dict_get_ptr(xdata, AFR_DIRTY, &amp;pending_raw) == 0) {</div><div class='add'>+        if (pending_raw) {</div><div class='add'>+            pending_int = pending_raw;</div><div class='ctx'> </div><div class='del'>-	if (need_unwind)</div><div class='del'>-		afr_flush_unwind (frame, this);</div><div class='add'>+            if (ntoh32(pending_int[idx]))</div><div class='add'>+                return _gf_true;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	call_count = afr_frame_return (frame);</div><div class='add'>+    for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+        if (dict_get_ptr(xdata, priv-&gt;pending_key[i], &amp;pending_raw))</div><div class='add'>+            continue;</div><div class='add'>+        if (!pending_raw)</div><div class='add'>+            continue;</div><div class='add'>+        pending_int = pending_raw;</div><div class='ctx'> </div><div class='del'>-	if (call_count == 0) {</div><div class='del'>-		local-&gt;transaction.resume (frame, this);</div><div class='del'>-	}</div><div class='add'>+        if (ntoh32(pending_int[idx]))</div><div class='add'>+            return _gf_true;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	return 0;</div><div class='add'>+    return _gf_false;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-afr_flush_wind (call_frame_t *frame, xlator_t *this)</div><div class='add'>+static gf_boolean_t</div><div class='add'>+afr_can_start_metadata_self_heal(call_frame_t *frame, xlator_t *this)</div><div class='ctx'> {</div><div class='del'>-	afr_local_t *local = NULL;</div><div class='del'>-	afr_private_t *priv = NULL;</div><div class='del'>-</div><div class='del'>-	int i = 0;</div><div class='del'>-	int call_count = -1;</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    struct afr_reply *replies = NULL;</div><div class='add'>+    int i = 0, first = -1;</div><div class='add'>+    gf_boolean_t start = _gf_false;</div><div class='add'>+    struct iatt stbuf = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    replies = local-&gt;replies;</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    if (!priv-&gt;metadata_self_heal)</div><div class='add'>+        return _gf_false;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+        if (!replies[i].valid || replies[i].op_ret == -1)</div><div class='add'>+            continue;</div><div class='add'>+        if (first == -1) {</div><div class='add'>+            first = i;</div><div class='add'>+            stbuf = replies[i].poststat;</div><div class='add'>+            continue;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-	priv = this-&gt;private;</div><div class='add'>+        if (afr_is_pending_set(this, replies[i].xdata,</div><div class='add'>+                               AFR_METADATA_TRANSACTION)) {</div><div class='add'>+            /* Let shd do the heal so that lookup is not blocked</div><div class='add'>+             * on getting metadata lock/doing the heal */</div><div class='add'>+            start = _gf_false;</div><div class='add'>+            break;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-	call_count = afr_up_children_count (priv-&gt;child_count, local-&gt;child_up);</div><div class='add'>+        if (gf_uuid_compare(stbuf.ia_gfid, replies[i].poststat.ia_gfid)) {</div><div class='add'>+            start = _gf_false;</div><div class='add'>+            break;</div><div class='add'>+        }</div><div class='add'>+        if (!IA_EQUAL(stbuf, replies[i].poststat, type)) {</div><div class='add'>+            start = _gf_false;</div><div class='add'>+            break;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-	if (call_count == 0) {</div><div class='del'>-		local-&gt;transaction.resume (frame, this);</div><div class='del'>-		return 0;</div><div class='del'>-	}</div><div class='add'>+        /*Check if iattrs need heal*/</div><div class='add'>+        if ((!IA_EQUAL(stbuf, replies[i].poststat, uid)) ||</div><div class='add'>+            (!IA_EQUAL(stbuf, replies[i].poststat, gid)) ||</div><div class='add'>+            (!IA_EQUAL(stbuf, replies[i].poststat, prot))) {</div><div class='add'>+            start = _gf_true;</div><div class='add'>+            continue;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-	local-&gt;call_count = call_count;</div><div class='add'>+        /*Check if xattrs need heal*/</div><div class='add'>+        if (!afr_xattrs_are_equal(replies[first].xdata, replies[i].xdata))</div><div class='add'>+            start = _gf_true;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='del'>-		if (local-&gt;child_up[i]) {</div><div class='del'>-			STACK_WIND_COOKIE (frame, afr_flush_wind_cbk,</div><div class='del'>-					   (void *) (long) i,</div><div class='del'>-					   priv-&gt;children[i],</div><div class='del'>-					   priv-&gt;children[i]-&gt;fops-&gt;flush,</div><div class='del'>-					   local-&gt;fd);</div><div class='add'>+    return start;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-			if (!--call_count)</div><div class='del'>-				break;</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='add'>+int</div><div class='add'>+afr_lookup_metadata_heal_check(call_frame_t *frame, xlator_t *this)</div><div class='ctx'> </div><div class='del'>-	return 0;</div><div class='add'>+{</div><div class='add'>+    call_frame_t *heal = NULL;</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    if (!afr_can_start_metadata_self_heal(frame, this))</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    heal = afr_frame_create(this, &amp;ret);</div><div class='add'>+    if (!heal) {</div><div class='add'>+        ret = -ret;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = synctask_new(this-&gt;ctx-&gt;env, afr_lookup_sh_metadata_wrap,</div><div class='add'>+                       afr_refresh_selfheal_done, heal, frame);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+    return ret;</div><div class='add'>+out:</div><div class='add'>+    if (loc_is_nameless(&amp;local-&gt;loc))</div><div class='add'>+        afr_discover_done(frame, this);</div><div class='add'>+    else</div><div class='add'>+        afr_lookup_done(frame, this);</div><div class='add'>+    if (heal)</div><div class='add'>+        AFR_STACK_DESTROY(heal);</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-afr_flush_done (call_frame_t *frame, xlator_t *this)</div><div class='add'>+afr_lookup_selfheal_wrap(void *opaque)</div><div class='ctx'> {</div><div class='del'>-	afr_local_t *local = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    call_frame_t *frame = opaque;</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    xlator_t *this = NULL;</div><div class='add'>+    inode_t *inode = NULL;</div><div class='add'>+    uuid_t pargfid = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    this = frame-&gt;this;</div><div class='add'>+    loc_pargfid(&amp;local-&gt;loc, pargfid);</div><div class='add'>+</div><div class='add'>+    ret = afr_selfheal_name(frame-&gt;this, pargfid, local-&gt;loc.name,</div><div class='add'>+                            &amp;local-&gt;cont.lookup.gfid_req, local-&gt;xattr_req);</div><div class='add'>+    if (ret == -EIO)</div><div class='add'>+        goto unwind;</div><div class='add'>+</div><div class='add'>+    afr_local_replies_wipe(local, this-&gt;private);</div><div class='add'>+</div><div class='add'>+    inode = afr_selfheal_unlocked_lookup_on(frame, local-&gt;loc.parent,</div><div class='add'>+                                            local-&gt;loc.name, local-&gt;replies,</div><div class='add'>+                                            local-&gt;child_up, local-&gt;xattr_req);</div><div class='add'>+    if (inode)</div><div class='add'>+        inode_unref(inode);</div><div class='add'>+</div><div class='add'>+    afr_lookup_metadata_heal_check(frame, this);</div><div class='add'>+    return 0;</div><div class='ctx'> </div><div class='del'>-	local = frame-&gt;local;</div><div class='add'>+unwind:</div><div class='add'>+    AFR_STACK_UNWIND(lookup, frame, -1, EIO, NULL, NULL, NULL, NULL);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	local-&gt;transaction.unwind (frame, this);</div><div class='add'>+int</div><div class='add'>+afr_lookup_entry_heal(call_frame_t *frame, xlator_t *this)</div><div class='add'>+{</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    call_frame_t *heal = NULL;</div><div class='add'>+    int i = 0, first = -1;</div><div class='add'>+    gf_boolean_t name_state_mismatch = _gf_false;</div><div class='add'>+    struct afr_reply *replies = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    unsigned char *par_readables = NULL;</div><div class='add'>+    unsigned char *success = NULL;</div><div class='add'>+    int32_t op_errno = 0;</div><div class='add'>+    uuid_t gfid = {0};</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    replies = local-&gt;replies;</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+    par_readables = alloca0(priv-&gt;child_count);</div><div class='add'>+    success = alloca0(priv-&gt;child_count);</div><div class='add'>+</div><div class='add'>+    ret = afr_inode_read_subvol_get(local-&gt;loc.parent, this, par_readables,</div><div class='add'>+                                    NULL, NULL);</div><div class='add'>+    if (ret &lt; 0 || AFR_COUNT(par_readables, priv-&gt;child_count) == 0) {</div><div class='add'>+        /* In this case set par_readables to all 1 so that name_heal</div><div class='add'>+         * need checks at the end of this function will flag missing</div><div class='add'>+         * entry when name state mismatches*/</div><div class='add'>+        memset(par_readables, 1, priv-&gt;child_count);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+        if (!replies[i].valid)</div><div class='add'>+            continue;</div><div class='add'>+</div><div class='add'>+        if (replies[i].op_ret == 0) {</div><div class='add'>+            if (gf_uuid_is_null(gfid)) {</div><div class='add'>+                gf_uuid_copy(gfid, replies[i].poststat.ia_gfid);</div><div class='add'>+            }</div><div class='add'>+            success[i] = 1;</div><div class='add'>+        } else {</div><div class='add'>+            if ((replies[i].op_errno != ENOTCONN) &amp;&amp;</div><div class='add'>+                (replies[i].op_errno != ENOENT) &amp;&amp;</div><div class='add'>+                (replies[i].op_errno != ESTALE)) {</div><div class='add'>+                op_errno = replies[i].op_errno;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-        AFR_STACK_DESTROY (frame);</div><div class='add'>+        /*gfid is missing, needs heal*/</div><div class='add'>+        if ((replies[i].op_ret == -1) &amp;&amp; (replies[i].op_errno == ENODATA)) {</div><div class='add'>+            goto name_heal;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='add'>+        if (first == -1) {</div><div class='add'>+            first = i;</div><div class='add'>+            continue;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='add'>+        if (replies[i].op_ret != replies[first].op_ret) {</div><div class='add'>+            name_state_mismatch = _gf_true;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-afr_plain_flush_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-                     int32_t op_ret, int32_t op_errno)</div><div class='add'>+        if (replies[i].op_ret == 0) {</div><div class='add'>+            /* Rename after this lookup may succeed if we don't do</div><div class='add'>+             * a name-heal and the destination may not have pending xattrs</div><div class='add'>+             * to indicate which name is good and which is bad so always do</div><div class='add'>+             * this heal*/</div><div class='add'>+            if (gf_uuid_compare(replies[i].poststat.ia_gfid, gfid)) {</div><div class='add'>+                goto name_heal;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (name_state_mismatch) {</div><div class='add'>+        if (!priv-&gt;quorum_count)</div><div class='add'>+            goto name_heal;</div><div class='add'>+        if (!afr_has_quorum(success, this, NULL))</div><div class='add'>+            goto name_heal;</div><div class='add'>+        if (op_errno)</div><div class='add'>+            goto name_heal;</div><div class='add'>+        for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+            if (!replies[i].valid)</div><div class='add'>+                continue;</div><div class='add'>+            if (par_readables[i] &amp;&amp; replies[i].op_ret &lt; 0 &amp;&amp;</div><div class='add'>+                replies[i].op_errno != ENOTCONN) {</div><div class='add'>+                goto name_heal;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-{</div><div class='del'>-	afr_local_t *local = NULL;</div><div class='add'>+    goto metadata_heal;</div><div class='ctx'> </div><div class='del'>-	int call_count = -1;</div><div class='add'>+name_heal:</div><div class='add'>+    heal = afr_frame_create(this, NULL);</div><div class='add'>+    if (!heal)</div><div class='add'>+        goto metadata_heal;</div><div class='ctx'> </div><div class='del'>-	local = frame-&gt;local;</div><div class='add'>+    ret = synctask_new(this-&gt;ctx-&gt;env, afr_lookup_selfheal_wrap,</div><div class='add'>+                       afr_refresh_selfheal_done, heal, frame);</div><div class='add'>+    if (ret) {</div><div class='add'>+        AFR_STACK_DESTROY(heal);</div><div class='add'>+        goto metadata_heal;</div><div class='add'>+    }</div><div class='add'>+    return ret;</div><div class='ctx'> </div><div class='del'>-	LOCK (&amp;frame-&gt;lock);</div><div class='del'>-	{</div><div class='del'>-		if (op_ret == 0)</div><div class='del'>-			local-&gt;op_ret = 0;</div><div class='add'>+metadata_heal:</div><div class='add'>+    ret = afr_lookup_metadata_heal_check(frame, this);</div><div class='ctx'> </div><div class='del'>-		local-&gt;op_errno = op_errno;</div><div class='del'>-	}</div><div class='del'>-	UNLOCK (&amp;frame-&gt;lock);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	call_count = afr_frame_return (frame);</div><div class='add'>+int</div><div class='add'>+afr_lookup_cbk(call_frame_t *frame, void *cookie, xlator_t *this, int op_ret,</div><div class='add'>+               int op_errno, inode_t *inode, struct iatt *buf, dict_t *xdata,</div><div class='add'>+               struct iatt *postparent)</div><div class='add'>+{</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    int call_count = -1;</div><div class='add'>+    int child_index = -1;</div><div class='add'>+    GF_UNUSED int ret = 0;</div><div class='add'>+    int8_t need_heal = 1;</div><div class='add'>+</div><div class='add'>+    child_index = (long)cookie;</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+</div><div class='add'>+    local-&gt;replies[child_index].valid = 1;</div><div class='add'>+    local-&gt;replies[child_index].op_ret = op_ret;</div><div class='add'>+    local-&gt;replies[child_index].op_errno = op_errno;</div><div class='add'>+    /*</div><div class='add'>+     * On revalidate lookup if the gfid-changed, afr should unwind the fop</div><div class='add'>+     * with ESTALE so that a fresh lookup will be sent by the top xlator.</div><div class='add'>+     * So remember it.</div><div class='add'>+     */</div><div class='add'>+    if (xdata &amp;&amp; dict_get_sizen(xdata, "gfid-changed"))</div><div class='add'>+        local-&gt;cont.lookup.needs_fresh_lookup = _gf_true;</div><div class='add'>+</div><div class='add'>+    if (xdata) {</div><div class='add'>+        ret = dict_get_int8(xdata, "link-count", &amp;need_heal);</div><div class='add'>+        local-&gt;replies[child_index].need_heal = need_heal;</div><div class='add'>+    } else {</div><div class='add'>+        local-&gt;replies[child_index].need_heal = need_heal;</div><div class='add'>+    }</div><div class='add'>+    if (op_ret != -1) {</div><div class='add'>+        local-&gt;replies[child_index].poststat = *buf;</div><div class='add'>+        local-&gt;replies[child_index].postparent = *postparent;</div><div class='add'>+        if (xdata)</div><div class='add'>+            local-&gt;replies[child_index].xdata = dict_ref(xdata);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    call_count = afr_frame_return(frame);</div><div class='add'>+    if (call_count == 0) {</div><div class='add'>+        afr_set_need_heal(this, local);</div><div class='add'>+        afr_lookup_entry_heal(frame, this);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	if (call_count == 0)</div><div class='del'>-		AFR_STACK_UNWIND (flush, frame, local-&gt;op_ret, local-&gt;op_errno);</div><div class='add'>+static void</div><div class='add'>+afr_discover_unwind(call_frame_t *frame, xlator_t *this)</div><div class='add'>+{</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    int read_subvol = -1;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    unsigned char *data_readable = NULL;</div><div class='add'>+    unsigned char *success_replies = NULL;</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    data_readable = alloca0(priv-&gt;child_count);</div><div class='add'>+    success_replies = alloca0(priv-&gt;child_count);</div><div class='add'>+</div><div class='add'>+    afr_fill_success_replies(local, priv, success_replies);</div><div class='add'>+    if (AFR_COUNT(success_replies, priv-&gt;child_count) &gt; 0)</div><div class='add'>+        local-&gt;op_ret = 0;</div><div class='add'>+</div><div class='add'>+    if (local-&gt;op_ret &lt; 0) {</div><div class='add'>+        local-&gt;op_ret = -1;</div><div class='add'>+        local-&gt;op_errno = afr_final_errno(frame-&gt;local, this-&gt;private);</div><div class='add'>+        goto error;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (!afr_has_quorum(success_replies, this, frame))</div><div class='add'>+        goto unwind;</div><div class='add'>+</div><div class='add'>+    ret = afr_replies_interpret(frame, this, local-&gt;inode, NULL);</div><div class='add'>+    if (ret) {</div><div class='add'>+        afr_inode_need_refresh_set(local-&gt;inode, this);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    read_subvol = afr_read_subvol_decide(local-&gt;inode, this, NULL,</div><div class='add'>+                                         data_readable);</div><div class='ctx'> </div><div class='del'>-	return 0;</div><div class='add'>+unwind:</div><div class='add'>+    afr_attempt_readsubvol_set(frame, this, success_replies, data_readable,</div><div class='add'>+                               &amp;read_subvol);</div><div class='add'>+    if (read_subvol == -1)</div><div class='add'>+        goto error;</div><div class='add'>+</div><div class='add'>+    if (AFR_IS_ARBITER_BRICK(priv, read_subvol) &amp;&amp; local-&gt;op_ret == 0) {</div><div class='add'>+        local-&gt;op_ret = -1;</div><div class='add'>+        local-&gt;op_errno = ENOTCONN;</div><div class='add'>+        gf_msg_debug(this-&gt;name, 0,</div><div class='add'>+                     "Arbiter cannot be a read subvol "</div><div class='add'>+                     "for %s",</div><div class='add'>+                     local-&gt;loc.path);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    AFR_STACK_UNWIND(lookup, frame, local-&gt;op_ret, local-&gt;op_errno,</div><div class='add'>+                     local-&gt;inode, &amp;local-&gt;replies[read_subvol].poststat,</div><div class='add'>+                     local-&gt;replies[read_subvol].xdata,</div><div class='add'>+                     &amp;local-&gt;replies[read_subvol].postparent);</div><div class='add'>+    return;</div><div class='add'>+</div><div class='add'>+error:</div><div class='add'>+    AFR_STACK_UNWIND(lookup, frame, local-&gt;op_ret, local-&gt;op_errno, NULL, NULL,</div><div class='add'>+                     NULL, NULL);</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+static int</div><div class='add'>+afr_ta_id_file_check(void *opaque)</div><div class='add'>+{</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    xlator_t *this = NULL;</div><div class='add'>+    loc_t loc = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    struct iatt stbuf = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    dict_t *dict = NULL;</div><div class='add'>+    uuid_t gfid = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    fd_t *fd = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    this = opaque;</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    ret = afr_fill_ta_loc(this, &amp;loc, _gf_false);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_ERROR, -ret, AFR_MSG_THIN_ARB,</div><div class='add'>+               "Failed to populate thin-arbiter loc for: %s.", loc.name);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = syncop_lookup(priv-&gt;children[THIN_ARBITER_BRICK_INDEX], &amp;loc, &amp;stbuf,</div><div class='add'>+                        0, 0, 0);</div><div class='add'>+    if (ret == 0) {</div><div class='add'>+        goto out;</div><div class='add'>+    } else if (ret == -ENOENT) {</div><div class='add'>+        fd = fd_create(loc.inode, getpid());</div><div class='add'>+        if (!fd)</div><div class='add'>+            goto out;</div><div class='add'>+        dict = dict_new();</div><div class='add'>+        if (!dict)</div><div class='add'>+            goto out;</div><div class='add'>+        gf_uuid_generate(gfid);</div><div class='add'>+        ret = dict_set_gfuuid(dict, "gfid-req", gfid, true);</div><div class='add'>+        ret = syncop_create(priv-&gt;children[THIN_ARBITER_BRICK_INDEX], &amp;loc,</div><div class='add'>+                            O_RDWR, 0664, fd, &amp;stbuf, dict, NULL);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (ret == 0) {</div><div class='add'>+        gf_uuid_copy(priv-&gt;ta_gfid, stbuf.ia_gfid);</div><div class='add'>+    } else {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_ERROR, -ret, AFR_MSG_THIN_ARB,</div><div class='add'>+               "Failed to lookup/create thin-arbiter id file.");</div><div class='add'>+    }</div><div class='add'>+    if (dict)</div><div class='add'>+        dict_unref(dict);</div><div class='add'>+    if (fd)</div><div class='add'>+        fd_unref(fd);</div><div class='add'>+    loc_wipe(&amp;loc);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> static int</div><div class='del'>-__no_pre_op_done (xlator_t *this, fd_t *fd)</div><div class='add'>+afr_ta_id_file_check_cbk(int ret, call_frame_t *ta_frame, void *opaque)</div><div class='ctx'> {</div><div class='del'>-        int i      = 0;</div><div class='del'>-        int op_ret = 1;</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        int _ret = 0;</div><div class='del'>-        uint64_t       ctx;</div><div class='del'>-        afr_fd_ctx_t * fd_ctx = NULL;</div><div class='add'>+static void</div><div class='add'>+afr_discover_done(call_frame_t *frame, xlator_t *this)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+    if (!priv-&gt;thin_arbiter_count)</div><div class='add'>+        goto unwind;</div><div class='add'>+    if (!gf_uuid_is_null(priv-&gt;ta_gfid))</div><div class='add'>+        goto unwind;</div><div class='add'>+</div><div class='add'>+    ret = synctask_new(this-&gt;ctx-&gt;env, afr_ta_id_file_check,</div><div class='add'>+                       afr_ta_id_file_check_cbk, NULL, this);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto unwind;</div><div class='add'>+unwind:</div><div class='add'>+    afr_discover_unwind(frame, this);</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        afr_private_t *priv = NULL;</div><div class='add'>+int</div><div class='add'>+afr_discover_cbk(call_frame_t *frame, void *cookie, xlator_t *this, int op_ret,</div><div class='add'>+                 int op_errno, inode_t *inode, struct iatt *buf, dict_t *xdata,</div><div class='add'>+                 struct iatt *postparent)</div><div class='add'>+{</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    int call_count = -1;</div><div class='add'>+    int child_index = -1;</div><div class='add'>+    GF_UNUSED int ret = 0;</div><div class='add'>+    int8_t need_heal = 1;</div><div class='add'>+</div><div class='add'>+    child_index = (long)cookie;</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+</div><div class='add'>+    local-&gt;replies[child_index].valid = 1;</div><div class='add'>+    local-&gt;replies[child_index].op_ret = op_ret;</div><div class='add'>+    local-&gt;replies[child_index].op_errno = op_errno;</div><div class='add'>+    if (op_ret != -1) {</div><div class='add'>+        local-&gt;replies[child_index].poststat = *buf;</div><div class='add'>+        local-&gt;replies[child_index].postparent = *postparent;</div><div class='add'>+        if (xdata)</div><div class='add'>+            local-&gt;replies[child_index].xdata = dict_ref(xdata);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (local-&gt;do_discovery &amp;&amp; (op_ret == 0))</div><div class='add'>+        afr_attempt_local_discovery(this, child_index);</div><div class='add'>+</div><div class='add'>+    if (xdata) {</div><div class='add'>+        ret = dict_get_int8(xdata, "link-count", &amp;need_heal);</div><div class='add'>+        local-&gt;replies[child_index].need_heal = need_heal;</div><div class='add'>+    } else {</div><div class='add'>+        local-&gt;replies[child_index].need_heal = need_heal;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    call_count = afr_frame_return(frame);</div><div class='add'>+    if (call_count == 0) {</div><div class='add'>+        afr_set_need_heal(this, local);</div><div class='add'>+        afr_lookup_metadata_heal_check(frame, this);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        priv = this-&gt;private;</div><div class='add'>+int</div><div class='add'>+afr_discover_do(call_frame_t *frame, xlator_t *this, int err)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+    int i = 0;</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    int call_count = 0;</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    if (err) {</div><div class='add'>+        local-&gt;op_errno = err;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    call_count = local-&gt;call_count = AFR_COUNT(local-&gt;child_up,</div><div class='add'>+                                               priv-&gt;child_count);</div><div class='add'>+</div><div class='add'>+    ret = afr_lookup_xattr_req_prepare(local, this, local-&gt;xattr_req,</div><div class='add'>+                                       &amp;local-&gt;loc);</div><div class='add'>+    if (ret) {</div><div class='add'>+        local-&gt;op_errno = -ret;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+        if (local-&gt;child_up[i]) {</div><div class='add'>+            STACK_WIND_COOKIE(</div><div class='add'>+                frame, afr_discover_cbk, (void *)(long)i, priv-&gt;children[i],</div><div class='add'>+                priv-&gt;children[i]-&gt;fops-&gt;lookup, &amp;local-&gt;loc, local-&gt;xattr_req);</div><div class='add'>+            if (!--call_count)</div><div class='add'>+                break;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        LOCK (&amp;fd-&gt;lock);</div><div class='del'>-        {</div><div class='del'>-                _ret = __fd_ctx_get (fd, this, &amp;ctx);</div><div class='add'>+    return 0;</div><div class='add'>+out:</div><div class='add'>+    AFR_STACK_UNWIND(lookup, frame, -1, local-&gt;op_errno, 0, 0, 0, 0);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-                if (_ret &lt; 0) {</div><div class='del'>-                        goto out;</div><div class='del'>-                }</div><div class='add'>+int</div><div class='add'>+afr_discover(call_frame_t *frame, xlator_t *this, loc_t *loc, dict_t *xattr_req)</div><div class='add'>+{</div><div class='add'>+    int op_errno = ENOMEM;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    int event = 0;</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    local = AFR_FRAME_INIT(frame, op_errno);</div><div class='add'>+    if (!local)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    if (!local-&gt;call_count) {</div><div class='add'>+        op_errno = ENOTCONN;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (__is_root_gfid(loc-&gt;inode-&gt;gfid)) {</div><div class='add'>+        if (!priv-&gt;root_inode)</div><div class='add'>+            priv-&gt;root_inode = inode_ref(loc-&gt;inode);</div><div class='add'>+</div><div class='add'>+        if (priv-&gt;choose_local &amp;&amp; !priv-&gt;did_discovery) {</div><div class='add'>+            /* Logic to detect which subvolumes of AFR are</div><div class='add'>+               local, in order to prefer them for reads</div><div class='add'>+            */</div><div class='add'>+            local-&gt;do_discovery = _gf_true;</div><div class='add'>+            priv-&gt;did_discovery = _gf_true;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-                fd_ctx = (afr_fd_ctx_t *)(long) ctx;</div><div class='add'>+    local-&gt;op = GF_FOP_LOOKUP;</div><div class='ctx'> </div><div class='del'>-                for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='del'>-                        if (fd_ctx-&gt;pre_op_done[i]) {</div><div class='del'>-                                op_ret = 0;</div><div class='del'>-                                break;</div><div class='del'>-                        }</div><div class='del'>-                }</div><div class='add'>+    loc_copy(&amp;local-&gt;loc, loc);</div><div class='add'>+</div><div class='add'>+    local-&gt;inode = inode_ref(loc-&gt;inode);</div><div class='add'>+</div><div class='add'>+    if (xattr_req) {</div><div class='add'>+        /* If xattr_req was null, afr_lookup_xattr_req_prepare() will</div><div class='add'>+           allocate one for us */</div><div class='add'>+        local-&gt;xattr_req = dict_copy_with_ref(xattr_req, NULL);</div><div class='add'>+        if (!local-&gt;xattr_req) {</div><div class='add'>+            op_errno = ENOMEM;</div><div class='add'>+            goto out;</div><div class='ctx'>         }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (gf_uuid_is_null(loc-&gt;inode-&gt;gfid)) {</div><div class='add'>+        afr_discover_do(frame, this, 0);</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    afr_read_subvol_get(loc-&gt;inode, this, NULL, NULL, &amp;event,</div><div class='add'>+                        AFR_DATA_TRANSACTION, NULL);</div><div class='add'>+</div><div class='add'>+    afr_discover_do(frame, this, 0);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='ctx'> out:</div><div class='del'>-        UNLOCK (&amp;fd-&gt;lock);</div><div class='add'>+    AFR_STACK_UNWIND(lookup, frame, -1, op_errno, NULL, NULL, NULL, NULL);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        return op_ret;</div><div class='add'>+int</div><div class='add'>+afr_lookup_do(call_frame_t *frame, xlator_t *this, int err)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+    int i = 0;</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    int call_count = 0;</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    if (err &lt; 0) {</div><div class='add'>+        local-&gt;op_errno = err;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    call_count = local-&gt;call_count = AFR_COUNT(local-&gt;child_up,</div><div class='add'>+                                               priv-&gt;child_count);</div><div class='add'>+</div><div class='add'>+    ret = afr_lookup_xattr_req_prepare(local, this, local-&gt;xattr_req,</div><div class='add'>+                                       &amp;local-&gt;loc);</div><div class='add'>+    if (ret) {</div><div class='add'>+        local-&gt;op_errno = -ret;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+        if (local-&gt;child_up[i]) {</div><div class='add'>+            STACK_WIND_COOKIE(</div><div class='add'>+                frame, afr_lookup_cbk, (void *)(long)i, priv-&gt;children[i],</div><div class='add'>+                priv-&gt;children[i]-&gt;fops-&gt;lookup, &amp;local-&gt;loc, local-&gt;xattr_req);</div><div class='add'>+            if (!--call_count)</div><div class='add'>+                break;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    return 0;</div><div class='add'>+out:</div><div class='add'>+    AFR_STACK_UNWIND(lookup, frame, -1, local-&gt;op_errno, 0, 0, 0, 0);</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+/*</div><div class='add'>+ * afr_lookup()</div><div class='add'>+ *</div><div class='add'>+ * The goal here is to figure out what the element getting looked up is.</div><div class='add'>+ * i.e what is the GFID, inode type and a conservative estimate of the</div><div class='add'>+ * inode attributes are.</div><div class='add'>+ *</div><div class='add'>+ * As we lookup, operations may be underway on the entry name and the</div><div class='add'>+ * inode. In lookup() we are primarily concerned only with the entry</div><div class='add'>+ * operations. If the entry is getting unlinked or renamed, we detect</div><div class='add'>+ * what operation is underway by querying for on-going transactions and</div><div class='add'>+ * pending self-healing on the entry through xdata.</div><div class='add'>+ *</div><div class='add'>+ * If the entry is a file/dir, it may need self-heal and/or in a</div><div class='add'>+ * split-brain condition. Lookup is not the place to worry about these</div><div class='add'>+ * conditions. Outcast marking will naturally handle them in the read</div><div class='add'>+ * paths.</div><div class='add'>+ *</div><div class='add'>+ * Here is a brief goal of what we are trying to achieve:</div><div class='add'>+ *</div><div class='add'>+ * - LOOKUP on all subvolumes concurrently, querying on-going transaction</div><div class='add'>+ *   and pending self-heal info from the servers.</div><div class='add'>+ *</div><div class='add'>+ * - If all servers reply the same inode type and GFID, the overall call</div><div class='add'>+ *   MUST be a success.</div><div class='add'>+ *</div><div class='add'>+ * - If inode types or GFIDs mismatch, and there IS either an on-going</div><div class='add'>+ *   transaction or pending self-heal, inspect what the nature of the</div><div class='add'>+ *   transaction or pending heal is, and select the appropriate subvolume's</div><div class='add'>+ *   reply as the winner.</div><div class='add'>+ *</div><div class='add'>+ * - If inode types or GFIDs mismatch, and there are no on-going transactions</div><div class='add'>+ *   or pending self-heal on the entry name on any of the servers, fail the</div><div class='add'>+ *   lookup with EIO. Something has gone wrong beyond reasonable action.</div><div class='add'>+ */</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-afr_flush (call_frame_t *frame, xlator_t *this, fd_t *fd)</div><div class='add'>+afr_lookup(call_frame_t *frame, xlator_t *this, loc_t *loc, dict_t *xattr_req)</div><div class='ctx'> {</div><div class='del'>-	afr_private_t * priv  = NULL;</div><div class='del'>-	afr_local_t   * local = NULL;</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    int32_t op_errno = 0;</div><div class='add'>+    int event = 0;</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    if (loc_is_nameless(loc)) {</div><div class='add'>+        if (xattr_req)</div><div class='add'>+            dict_del_sizen(xattr_req, "gfid-req");</div><div class='add'>+        afr_discover(frame, this, loc, xattr_req);</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        call_frame_t  * transaction_frame = NULL;</div><div class='add'>+    if (afr_is_private_directory(this-&gt;private, loc-&gt;parent-&gt;gfid, loc-&gt;name,</div><div class='add'>+                                 frame-&gt;root-&gt;pid)) {</div><div class='add'>+        op_errno = EPERM;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	int ret        = -1;</div><div class='add'>+    local = AFR_FRAME_INIT(frame, op_errno);</div><div class='add'>+    if (!local)</div><div class='add'>+        goto out;</div><div class='ctx'> </div><div class='del'>-	int op_ret   = -1;</div><div class='del'>-	int op_errno = 0;</div><div class='add'>+    if (!local-&gt;call_count) {</div><div class='add'>+        op_errno = ENOTCONN;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        int i          = 0;</div><div class='del'>-        int call_count = 0;</div><div class='add'>+    local-&gt;op = GF_FOP_LOOKUP;</div><div class='ctx'> </div><div class='del'>-	VALIDATE_OR_GOTO (frame, out);</div><div class='del'>-	VALIDATE_OR_GOTO (this, out);</div><div class='del'>-	VALIDATE_OR_GOTO (this-&gt;private, out);</div><div class='add'>+    loc_copy(&amp;local-&gt;loc, loc);</div><div class='ctx'> </div><div class='del'>-	priv = this-&gt;private;</div><div class='add'>+    local-&gt;inode = inode_ref(loc-&gt;inode);</div><div class='ctx'> </div><div class='del'>-	ALLOC_OR_GOTO (local, afr_local_t, out);</div><div class='add'>+    if (xattr_req) {</div><div class='add'>+        /* If xattr_req was null, afr_lookup_xattr_req_prepare() will</div><div class='add'>+           allocate one for us */</div><div class='add'>+        local-&gt;xattr_req = dict_copy_with_ref(xattr_req, NULL);</div><div class='add'>+        if (!local-&gt;xattr_req) {</div><div class='add'>+            op_errno = ENOMEM;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+        ret = dict_get_gfuuid(local-&gt;xattr_req, "gfid-req",</div><div class='add'>+                              &amp;local-&gt;cont.lookup.gfid_req);</div><div class='add'>+        if (ret == 0) {</div><div class='add'>+            dict_del_sizen(local-&gt;xattr_req, "gfid-req");</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	ret = AFR_LOCAL_INIT (local, priv);</div><div class='del'>-	if (ret &lt; 0) {</div><div class='del'>-		op_errno = -ret;</div><div class='del'>-		goto out;</div><div class='del'>-	}</div><div class='add'>+    afr_read_subvol_get(loc-&gt;parent, this, NULL, NULL, &amp;event,</div><div class='add'>+                        AFR_DATA_TRANSACTION, NULL);</div><div class='ctx'> </div><div class='del'>-        call_count = afr_up_children_count (priv-&gt;child_count, local-&gt;child_up);</div><div class='add'>+    afr_lookup_do(frame, this, 0);</div><div class='ctx'> </div><div class='del'>-        if (__no_pre_op_done (this, fd)) {</div><div class='del'>-                frame-&gt;local = local;</div><div class='add'>+    return 0;</div><div class='add'>+out:</div><div class='add'>+    AFR_STACK_UNWIND(lookup, frame, -1, op_errno, NULL, NULL, NULL, NULL);</div><div class='ctx'> </div><div class='del'>-                for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='del'>-                        if (local-&gt;child_up[i]) {</div><div class='del'>-                                STACK_WIND_COOKIE (frame, afr_plain_flush_cbk,</div><div class='del'>-                                                   (void *) (long) i,</div><div class='del'>-                                                   priv-&gt;children[i],</div><div class='del'>-                                                   priv-&gt;children[i]-&gt;fops-&gt;flush,</div><div class='del'>-                                                   fd);</div><div class='del'>-                                if (!--call_count)</div><div class='del'>-                                        break;</div><div class='del'>-                        }</div><div class='del'>-                }</div><div class='del'>-        } else {</div><div class='del'>-                transaction_frame = copy_frame (frame);</div><div class='del'>-                if (!transaction_frame) {</div><div class='del'>-                        op_errno = ENOMEM;</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-                                "Out of memory.");</div><div class='del'>-                        goto out;</div><div class='del'>-                }</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-                transaction_frame-&gt;local = local;</div><div class='add'>+void</div><div class='add'>+_afr_cleanup_fd_ctx(xlator_t *this, afr_fd_ctx_t *fd_ctx)</div><div class='add'>+{</div><div class='add'>+    afr_private_t *priv = this-&gt;private;</div><div class='ctx'> </div><div class='del'>-                local-&gt;op = GF_FOP_FLUSH;</div><div class='add'>+    if (fd_ctx-&gt;lk_heal_info) {</div><div class='add'>+        LOCK(&amp;priv-&gt;lock);</div><div class='add'>+        {</div><div class='add'>+            list_del(&amp;fd_ctx-&gt;lk_heal_info-&gt;pos);</div><div class='add'>+        }</div><div class='add'>+        afr_lk_heal_info_cleanup(fd_ctx-&gt;lk_heal_info);</div><div class='add'>+        fd_ctx-&gt;lk_heal_info = NULL;</div><div class='add'>+    }</div><div class='add'>+    GF_FREE(fd_ctx-&gt;opened_on);</div><div class='add'>+    GF_FREE(fd_ctx);</div><div class='add'>+    return;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-                local-&gt;transaction.fop    = afr_flush_wind;</div><div class='del'>-                local-&gt;transaction.done   = afr_flush_done;</div><div class='del'>-                local-&gt;transaction.unwind = afr_flush_unwind;</div><div class='add'>+int</div><div class='add'>+afr_cleanup_fd_ctx(xlator_t *this, fd_t *fd)</div><div class='add'>+{</div><div class='add'>+    uint64_t ctx = 0;</div><div class='add'>+    afr_fd_ctx_t *fd_ctx = NULL;</div><div class='add'>+    int ret = 0;</div><div class='ctx'> </div><div class='del'>-                local-&gt;fd                 = fd_ref (fd);</div><div class='add'>+    ret = fd_ctx_get(fd, this, &amp;ctx);</div><div class='add'>+    if (ret &lt; 0)</div><div class='add'>+        goto out;</div><div class='ctx'> </div><div class='del'>-                local-&gt;transaction.main_frame = frame;</div><div class='del'>-                local-&gt;transaction.start  = 0;</div><div class='del'>-                local-&gt;transaction.len    = 0;</div><div class='add'>+    fd_ctx = (afr_fd_ctx_t *)(long)ctx;</div><div class='ctx'> </div><div class='del'>-                afr_transaction (transaction_frame, this, AFR_FLUSH_TRANSACTION);</div><div class='del'>-        }</div><div class='add'>+    if (fd_ctx) {</div><div class='add'>+        _afr_cleanup_fd_ctx(this, fd_ctx);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	op_ret = 0;</div><div class='ctx'> out:</div><div class='del'>-	if (op_ret == -1) {</div><div class='del'>-                if (transaction_frame)</div><div class='del'>-                        AFR_STACK_DESTROY (transaction_frame);</div><div class='del'>-</div><div class='del'>-		AFR_STACK_UNWIND (flush, frame, op_ret, op_errno);</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-/* }}} */</div><div class='add'>+int</div><div class='add'>+afr_release(xlator_t *this, fd_t *fd)</div><div class='add'>+{</div><div class='add'>+    afr_cleanup_fd_ctx(this, fd);</div><div class='ctx'> </div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-afr_cleanup_fd_ctx (xlator_t *this, fd_t *fd)</div><div class='add'>+afr_fd_ctx_t *</div><div class='add'>+__afr_fd_ctx_get(fd_t *fd, xlator_t *this)</div><div class='ctx'> {</div><div class='del'>-        uint64_t        ctx = 0;</div><div class='del'>-        afr_fd_ctx_t    *fd_ctx = NULL;</div><div class='del'>-        int             ret = 0;</div><div class='add'>+    uint64_t ctx = 0;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    afr_fd_ctx_t *fd_ctx = NULL;</div><div class='ctx'> </div><div class='del'>-        ret = fd_ctx_get (fd, this, &amp;ctx);</div><div class='add'>+    ret = __fd_ctx_get(fd, this, &amp;ctx);</div><div class='ctx'> </div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        ret = __afr_fd_ctx_set(this, fd);</div><div class='ctx'>         if (ret &lt; 0)</div><div class='del'>-                goto out;</div><div class='add'>+            goto out;</div><div class='ctx'> </div><div class='del'>-        fd_ctx = (afr_fd_ctx_t *)(long) ctx;</div><div class='add'>+        ret = __fd_ctx_get(fd, this, &amp;ctx);</div><div class='add'>+        if (ret &lt; 0)</div><div class='add'>+            goto out;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        if (fd_ctx) {</div><div class='del'>-                if (fd_ctx-&gt;child_failed)</div><div class='del'>-                        GF_FREE (fd_ctx-&gt;child_failed);</div><div class='add'>+    fd_ctx = (afr_fd_ctx_t *)(long)ctx;</div><div class='add'>+out:</div><div class='add'>+    return fd_ctx;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-                if (fd_ctx-&gt;pre_op_done)</div><div class='del'>-                        GF_FREE (fd_ctx-&gt;pre_op_done);</div><div class='add'>+afr_fd_ctx_t *</div><div class='add'>+afr_fd_ctx_get(fd_t *fd, xlator_t *this)</div><div class='add'>+{</div><div class='add'>+    afr_fd_ctx_t *fd_ctx = NULL;</div><div class='ctx'> </div><div class='del'>-                if (fd_ctx-&gt;opened_on)</div><div class='del'>-                        GF_FREE (fd_ctx-&gt;opened_on);</div><div class='add'>+    LOCK(&amp;fd-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        fd_ctx = __afr_fd_ctx_get(fd, this);</div><div class='add'>+    }</div><div class='add'>+    UNLOCK(&amp;fd-&gt;lock);</div><div class='ctx'> </div><div class='del'>-                GF_FREE (fd_ctx);</div><div class='del'>-        }</div><div class='add'>+    return fd_ctx;</div><div class='add'>+}</div><div class='ctx'> </div><div class='add'>+int</div><div class='add'>+__afr_fd_ctx_set(xlator_t *this, fd_t *fd)</div><div class='add'>+{</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    uint64_t ctx = 0;</div><div class='add'>+    afr_fd_ctx_t *fd_ctx = NULL;</div><div class='add'>+    int i = 0;</div><div class='add'>+</div><div class='add'>+    VALIDATE_OR_GOTO(this-&gt;private, out);</div><div class='add'>+    VALIDATE_OR_GOTO(fd, out);</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    ret = __fd_ctx_get(fd, this, &amp;ctx);</div><div class='add'>+</div><div class='add'>+    if (ret == 0)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    fd_ctx = GF_CALLOC(1, sizeof(afr_fd_ctx_t), gf_afr_mt_afr_fd_ctx_t);</div><div class='add'>+    if (!fd_ctx) {</div><div class='add'>+        ret = -ENOMEM;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    fd_ctx-&gt;opened_on = GF_CALLOC(sizeof(*fd_ctx-&gt;opened_on), priv-&gt;child_count,</div><div class='add'>+                                  gf_afr_mt_int32_t);</div><div class='add'>+    if (!fd_ctx-&gt;opened_on) {</div><div class='add'>+        ret = -ENOMEM;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+        if (fd_is_anonymous(fd))</div><div class='add'>+            fd_ctx-&gt;opened_on[i] = AFR_FD_OPENED;</div><div class='add'>+        else</div><div class='add'>+            fd_ctx-&gt;opened_on[i] = AFR_FD_NOT_OPENED;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    fd_ctx-&gt;readdir_subvol = -1;</div><div class='add'>+    fd_ctx-&gt;lk_heal_info = NULL;</div><div class='add'>+</div><div class='add'>+    ret = __fd_ctx_set(fd, this, (uint64_t)(long)fd_ctx);</div><div class='add'>+    if (ret)</div><div class='add'>+        gf_msg_debug(this-&gt;name, 0, "failed to set fd ctx (%p)", fd);</div><div class='ctx'> out:</div><div class='del'>-        return 0;</div><div class='add'>+    if (ret &amp;&amp; fd_ctx)</div><div class='add'>+        _afr_cleanup_fd_ctx(this, fd_ctx);</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+/* {{{ flush */</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-afr_release (xlator_t *this, fd_t *fd)</div><div class='add'>+afr_flush_cbk(call_frame_t *frame, void *cookie, xlator_t *this, int32_t op_ret,</div><div class='add'>+              int32_t op_errno, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-        afr_cleanup_fd_ctx (this, fd);</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    int call_count = -1;</div><div class='ctx'> </div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='add'>+    local = frame-&gt;local;</div><div class='ctx'> </div><div class='add'>+    LOCK(&amp;frame-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        if (op_ret != -1) {</div><div class='add'>+            local-&gt;op_ret = op_ret;</div><div class='add'>+            if (!local-&gt;xdata_rsp &amp;&amp; xdata)</div><div class='add'>+                local-&gt;xdata_rsp = dict_ref(xdata);</div><div class='add'>+        } else {</div><div class='add'>+            local-&gt;op_errno = op_errno;</div><div class='add'>+        }</div><div class='add'>+        call_count = --local-&gt;call_count;</div><div class='add'>+    }</div><div class='add'>+    UNLOCK(&amp;frame-&gt;lock);</div><div class='ctx'> </div><div class='del'>-/* {{{ fsync */</div><div class='add'>+    if (call_count == 0)</div><div class='add'>+        AFR_STACK_UNWIND(flush, frame, local-&gt;op_ret, local-&gt;op_errno,</div><div class='add'>+                         local-&gt;xdata_rsp);</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-afr_fsync_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-               int32_t op_ret, int32_t op_errno, struct iatt *prebuf,</div><div class='del'>-               struct iatt *postbuf)</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+afr_flush_wrapper(call_frame_t *frame, xlator_t *this, fd_t *fd, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-	afr_local_t *local = NULL;</div><div class='add'>+    int i = 0;</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    int call_count = -1;</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    call_count = local-&gt;call_count;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+        if (local-&gt;child_up[i]) {</div><div class='add'>+            STACK_WIND_COOKIE(frame, afr_flush_cbk, (void *)(long)i,</div><div class='add'>+                              priv-&gt;children[i], priv-&gt;children[i]-&gt;fops-&gt;flush,</div><div class='add'>+                              local-&gt;fd, xdata);</div><div class='add'>+            if (!--call_count)</div><div class='add'>+                break;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	int call_count = -1;</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        int child_index = (long) cookie;</div><div class='del'>-        int read_child  = 0;</div><div class='add'>+afr_local_t *</div><div class='add'>+afr_wakeup_same_fd_delayed_op(xlator_t *this, afr_lock_t *lock, fd_t *fd)</div><div class='add'>+{</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+</div><div class='add'>+    if (lock-&gt;delay_timer) {</div><div class='add'>+        local = list_entry(lock-&gt;post_op.next, afr_local_t,</div><div class='add'>+                           transaction.owner_list);</div><div class='add'>+        if (fd == local-&gt;fd) {</div><div class='add'>+            if (gf_timer_call_cancel(this-&gt;ctx, lock-&gt;delay_timer)) {</div><div class='add'>+                local = NULL;</div><div class='add'>+            } else {</div><div class='add'>+                lock-&gt;delay_timer = NULL;</div><div class='add'>+            }</div><div class='add'>+        } else {</div><div class='add'>+            local = NULL;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	local = frame-&gt;local;</div><div class='add'>+    return local;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        read_child = afr_read_child (this, local-&gt;fd-&gt;inode);</div><div class='add'>+void</div><div class='add'>+afr_delayed_changelog_wake_resume(xlator_t *this, inode_t *inode,</div><div class='add'>+                                  call_stub_t *stub)</div><div class='add'>+{</div><div class='add'>+    afr_inode_ctx_t *ctx = NULL;</div><div class='add'>+    afr_lock_t *lock = NULL;</div><div class='add'>+    afr_local_t *metadata_local = NULL;</div><div class='add'>+    afr_local_t *data_local = NULL;</div><div class='add'>+    LOCK(&amp;inode-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        (void)__afr_inode_ctx_get(this, inode, &amp;ctx);</div><div class='add'>+        lock = &amp;ctx-&gt;lock[AFR_DATA_TRANSACTION];</div><div class='add'>+        data_local = afr_wakeup_same_fd_delayed_op(this, lock, stub-&gt;args.fd);</div><div class='add'>+        lock = &amp;ctx-&gt;lock[AFR_METADATA_TRANSACTION];</div><div class='add'>+        metadata_local = afr_wakeup_same_fd_delayed_op(this, lock,</div><div class='add'>+                                                       stub-&gt;args.fd);</div><div class='add'>+    }</div><div class='add'>+    UNLOCK(&amp;inode-&gt;lock);</div><div class='add'>+</div><div class='add'>+    if (data_local) {</div><div class='add'>+        data_local-&gt;transaction.resume_stub = stub;</div><div class='add'>+    } else if (metadata_local) {</div><div class='add'>+        metadata_local-&gt;transaction.resume_stub = stub;</div><div class='add'>+    } else {</div><div class='add'>+        call_resume(stub);</div><div class='add'>+    }</div><div class='add'>+    if (data_local) {</div><div class='add'>+        afr_delayed_changelog_wake_up_cbk(data_local);</div><div class='add'>+    }</div><div class='add'>+    if (metadata_local) {</div><div class='add'>+        afr_delayed_changelog_wake_up_cbk(metadata_local);</div><div class='add'>+    }</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	LOCK (&amp;frame-&gt;lock);</div><div class='del'>-	{</div><div class='del'>-                if (child_index == read_child) {</div><div class='del'>-                        local-&gt;read_child_returned = _gf_true;</div><div class='del'>-                }</div><div class='add'>+int</div><div class='add'>+afr_flush(call_frame_t *frame, xlator_t *this, fd_t *fd, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    call_stub_t *stub = NULL;</div><div class='add'>+    int op_errno = ENOMEM;</div><div class='ctx'> </div><div class='del'>-		if (op_ret == 0) {</div><div class='del'>-			local-&gt;op_ret = 0;</div><div class='add'>+    AFR_ERROR_OUT_IF_FDCTX_INVALID(fd, this, op_errno, out);</div><div class='add'>+    local = AFR_FRAME_INIT(frame, op_errno);</div><div class='add'>+    if (!local)</div><div class='add'>+        goto out;</div><div class='ctx'> </div><div class='del'>-			if (local-&gt;success_count == 0) {</div><div class='del'>-				local-&gt;cont.fsync.prebuf  = *prebuf;</div><div class='del'>-				local-&gt;cont.fsync.postbuf = *postbuf;</div><div class='del'>-			}</div><div class='add'>+    local-&gt;op = GF_FOP_FLUSH;</div><div class='add'>+    if (!afr_is_consistent_io_possible(local, this-&gt;private, &amp;op_errno))</div><div class='add'>+        goto out;</div><div class='ctx'> </div><div class='del'>-                        if (child_index == read_child) {</div><div class='del'>-                                local-&gt;cont.fsync.prebuf  = *prebuf;</div><div class='del'>-                                local-&gt;cont.fsync.postbuf = *postbuf;</div><div class='del'>-                        }</div><div class='add'>+    local-&gt;fd = fd_ref(fd);</div><div class='ctx'> </div><div class='del'>-			local-&gt;success_count++;</div><div class='del'>-                }</div><div class='add'>+    stub = fop_flush_stub(frame, afr_flush_wrapper, fd, xdata);</div><div class='add'>+    if (!stub)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    afr_delayed_changelog_wake_resume(this, fd-&gt;inode, stub);</div><div class='ctx'> </div><div class='del'>-		local-&gt;op_errno = op_errno;</div><div class='del'>-	}</div><div class='del'>-	UNLOCK (&amp;frame-&gt;lock);</div><div class='add'>+    return 0;</div><div class='add'>+out:</div><div class='add'>+    AFR_STACK_UNWIND(flush, frame, -1, op_errno, NULL);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	call_count = afr_frame_return (frame);</div><div class='add'>+int</div><div class='add'>+afr_fsyncdir_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                 int32_t op_ret, int32_t op_errno, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    int call_count = -1;</div><div class='ctx'> </div><div class='del'>-	if (call_count == 0) {</div><div class='del'>-                local-&gt;cont.fsync.prebuf.ia_ino  = local-&gt;cont.fsync.ino;</div><div class='del'>-                local-&gt;cont.fsync.postbuf.ia_ino = local-&gt;cont.fsync.ino;</div><div class='add'>+    local = frame-&gt;local;</div><div class='ctx'> </div><div class='del'>-		AFR_STACK_UNWIND (fsync, frame, local-&gt;op_ret, local-&gt;op_errno,</div><div class='del'>-                                  &amp;local-&gt;cont.fsync.prebuf,</div><div class='del'>-                                  &amp;local-&gt;cont.fsync.postbuf);</div><div class='add'>+    LOCK(&amp;frame-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        if (op_ret == 0) {</div><div class='add'>+            local-&gt;op_ret = 0;</div><div class='add'>+            if (!local-&gt;xdata_rsp &amp;&amp; xdata)</div><div class='add'>+                local-&gt;xdata_rsp = dict_ref(xdata);</div><div class='add'>+        } else {</div><div class='add'>+            local-&gt;op_errno = op_errno;</div><div class='ctx'>         }</div><div class='add'>+        call_count = --local-&gt;call_count;</div><div class='add'>+    }</div><div class='add'>+    UNLOCK(&amp;frame-&gt;lock);</div><div class='ctx'> </div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='add'>+    if (call_count == 0)</div><div class='add'>+        AFR_STACK_UNWIND(fsyncdir, frame, local-&gt;op_ret, local-&gt;op_errno,</div><div class='add'>+                         local-&gt;xdata_rsp);</div><div class='ctx'> </div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-afr_fsync (call_frame_t *frame, xlator_t *this, fd_t *fd,</div><div class='del'>-	   int32_t datasync)</div><div class='add'>+afr_fsyncdir(call_frame_t *frame, xlator_t *this, fd_t *fd, int32_t datasync,</div><div class='add'>+             dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-	afr_private_t *priv = NULL;</div><div class='del'>-	afr_local_t *local = NULL;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    int i = 0;</div><div class='add'>+    int32_t call_count = 0;</div><div class='add'>+    int32_t op_errno = ENOMEM;</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    local = AFR_FRAME_INIT(frame, op_errno);</div><div class='add'>+    if (!local)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    local-&gt;op = GF_FOP_FSYNCDIR;</div><div class='add'>+    if (!afr_is_consistent_io_possible(local, priv, &amp;op_errno))</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    call_count = local-&gt;call_count;</div><div class='add'>+    for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+        if (local-&gt;child_up[i]) {</div><div class='add'>+            STACK_WIND(frame, afr_fsyncdir_cbk, priv-&gt;children[i],</div><div class='add'>+                       priv-&gt;children[i]-&gt;fops-&gt;fsyncdir, fd, datasync, xdata);</div><div class='add'>+            if (!--call_count)</div><div class='add'>+                break;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	int ret = -1;</div><div class='add'>+    return 0;</div><div class='add'>+out:</div><div class='add'>+    AFR_STACK_UNWIND(fsyncdir, frame, -1, op_errno, NULL);</div><div class='ctx'> </div><div class='del'>-	int i = 0;</div><div class='del'>-	int32_t call_count = 0;</div><div class='del'>-	int32_t op_ret   = -1;</div><div class='del'>-	int32_t op_errno = 0;</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	VALIDATE_OR_GOTO (frame, out);</div><div class='del'>-	VALIDATE_OR_GOTO (this, out);</div><div class='del'>-	VALIDATE_OR_GOTO (this-&gt;private, out);</div><div class='add'>+/* }}} */</div><div class='ctx'> </div><div class='del'>-	priv = this-&gt;private;</div><div class='add'>+static int</div><div class='add'>+afr_serialized_lock_wind(call_frame_t *frame, xlator_t *this);</div><div class='ctx'> </div><div class='del'>-	ALLOC_OR_GOTO (local, afr_local_t, out);</div><div class='add'>+static gf_boolean_t</div><div class='add'>+afr_is_conflicting_lock_present(int32_t op_ret, int32_t op_errno)</div><div class='add'>+{</div><div class='add'>+    if (op_ret == -1 &amp;&amp; op_errno == EAGAIN)</div><div class='add'>+        return _gf_true;</div><div class='add'>+    return _gf_false;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+afr_fop_lock_unwind(call_frame_t *frame, glusterfs_fop_t op, int32_t op_ret,</div><div class='add'>+                    int32_t op_errno, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    switch (op) {</div><div class='add'>+        case GF_FOP_INODELK:</div><div class='add'>+            AFR_STACK_UNWIND(inodelk, frame, op_ret, op_errno, xdata);</div><div class='add'>+            break;</div><div class='add'>+        case GF_FOP_FINODELK:</div><div class='add'>+            AFR_STACK_UNWIND(finodelk, frame, op_ret, op_errno, xdata);</div><div class='add'>+            break;</div><div class='add'>+        case GF_FOP_ENTRYLK:</div><div class='add'>+            AFR_STACK_UNWIND(entrylk, frame, op_ret, op_errno, xdata);</div><div class='add'>+            break;</div><div class='add'>+        case GF_FOP_FENTRYLK:</div><div class='add'>+            AFR_STACK_UNWIND(fentrylk, frame, op_ret, op_errno, xdata);</div><div class='add'>+            break;</div><div class='add'>+        default:</div><div class='add'>+            break;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+afr_fop_lock_wind(call_frame_t *frame, xlator_t *this, int child_index,</div><div class='add'>+                  int32_t (*lock_cbk)(call_frame_t *, void *, xlator_t *,</div><div class='add'>+                                      int32_t, int32_t, dict_t *))</div><div class='add'>+{</div><div class='add'>+    afr_local_t *local = frame-&gt;local;</div><div class='add'>+    afr_private_t *priv = this-&gt;private;</div><div class='add'>+    int i = child_index;</div><div class='add'>+</div><div class='add'>+    switch (local-&gt;op) {</div><div class='add'>+        case GF_FOP_INODELK:</div><div class='add'>+            STACK_WIND_COOKIE(</div><div class='add'>+                frame, lock_cbk, (void *)(long)i, priv-&gt;children[i],</div><div class='add'>+                priv-&gt;children[i]-&gt;fops-&gt;inodelk,</div><div class='add'>+                (const char *)local-&gt;cont.inodelk.volume, &amp;local-&gt;loc,</div><div class='add'>+                local-&gt;cont.inodelk.cmd, &amp;local-&gt;cont.inodelk.flock,</div><div class='add'>+                local-&gt;cont.inodelk.xdata);</div><div class='add'>+            break;</div><div class='add'>+        case GF_FOP_FINODELK:</div><div class='add'>+            STACK_WIND_COOKIE(</div><div class='add'>+                frame, lock_cbk, (void *)(long)i, priv-&gt;children[i],</div><div class='add'>+                priv-&gt;children[i]-&gt;fops-&gt;finodelk,</div><div class='add'>+                (const char *)local-&gt;cont.inodelk.volume, local-&gt;fd,</div><div class='add'>+                local-&gt;cont.inodelk.cmd, &amp;local-&gt;cont.inodelk.flock,</div><div class='add'>+                local-&gt;cont.inodelk.xdata);</div><div class='add'>+            break;</div><div class='add'>+        case GF_FOP_ENTRYLK:</div><div class='add'>+            STACK_WIND_COOKIE(</div><div class='add'>+                frame, lock_cbk, (void *)(long)i, priv-&gt;children[i],</div><div class='add'>+                priv-&gt;children[i]-&gt;fops-&gt;entrylk, local-&gt;cont.entrylk.volume,</div><div class='add'>+                &amp;local-&gt;loc, local-&gt;cont.entrylk.basename,</div><div class='add'>+                local-&gt;cont.entrylk.cmd, local-&gt;cont.entrylk.type,</div><div class='add'>+                local-&gt;cont.entrylk.xdata);</div><div class='add'>+            break;</div><div class='add'>+        case GF_FOP_FENTRYLK:</div><div class='add'>+            STACK_WIND_COOKIE(</div><div class='add'>+                frame, lock_cbk, (void *)(long)i, priv-&gt;children[i],</div><div class='add'>+                priv-&gt;children[i]-&gt;fops-&gt;fentrylk, local-&gt;cont.entrylk.volume,</div><div class='add'>+                local-&gt;fd, local-&gt;cont.entrylk.basename,</div><div class='add'>+                local-&gt;cont.entrylk.cmd, local-&gt;cont.entrylk.type,</div><div class='add'>+                local-&gt;cont.entrylk.xdata);</div><div class='add'>+            break;</div><div class='add'>+        default:</div><div class='add'>+            break;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	ret = AFR_LOCAL_INIT (local, priv);</div><div class='del'>-	if (ret &lt; 0) {</div><div class='del'>-		op_errno = -ret;</div><div class='del'>-		goto out;</div><div class='del'>-	}</div><div class='add'>+void</div><div class='add'>+afr_fop_lock_proceed(call_frame_t *frame)</div><div class='add'>+{</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='ctx'> </div><div class='del'>-	call_count = local-&gt;call_count;</div><div class='del'>-	frame-&gt;local = local;</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    priv = frame-&gt;this-&gt;private;</div><div class='ctx'> </div><div class='del'>-        local-&gt;fd             = fd_ref (fd);</div><div class='del'>-        local-&gt;cont.fsync.ino = fd-&gt;inode-&gt;ino;</div><div class='add'>+    if (local-&gt;fop_lock_state != AFR_FOP_LOCK_PARALLEL) {</div><div class='add'>+        afr_fop_lock_unwind(frame, local-&gt;op, local-&gt;op_ret, local-&gt;op_errno,</div><div class='add'>+                            local-&gt;xdata_rsp);</div><div class='add'>+        return;</div><div class='add'>+    }</div><div class='add'>+    /* At least one child is up */</div><div class='add'>+    /*</div><div class='add'>+     * Non-blocking locks also need to be serialized.  Otherwise there is</div><div class='add'>+     * a chance that both the mounts which issued same non-blocking inodelk</div><div class='add'>+     * may endup not acquiring the lock on any-brick.</div><div class='add'>+     * Ex: Mount1 and Mount2</div><div class='add'>+     * request for full length lock on file f1.  Mount1 afr may acquire the</div><div class='add'>+     * partial lock on brick-1 and may not acquire the lock on brick-2</div><div class='add'>+     * because Mount2 already got the lock on brick-2, vice versa.  Since</div><div class='add'>+     * both the mounts only got partial locks, afr treats them as failure in</div><div class='add'>+     * gaining the locks and unwinds with EAGAIN errno.</div><div class='add'>+     */</div><div class='add'>+    local-&gt;op_ret = -1;</div><div class='add'>+    local-&gt;op_errno = EUCLEAN;</div><div class='add'>+    local-&gt;fop_lock_state = AFR_FOP_LOCK_SERIAL;</div><div class='add'>+    afr_local_replies_wipe(local, priv);</div><div class='add'>+    if (local-&gt;xdata_rsp)</div><div class='add'>+        dict_unref(local-&gt;xdata_rsp);</div><div class='add'>+    local-&gt;xdata_rsp = NULL;</div><div class='add'>+    switch (local-&gt;op) {</div><div class='add'>+        case GF_FOP_INODELK:</div><div class='add'>+        case GF_FOP_FINODELK:</div><div class='add'>+            local-&gt;cont.inodelk.cmd = local-&gt;cont.inodelk.in_cmd;</div><div class='add'>+            local-&gt;cont.inodelk.flock = local-&gt;cont.inodelk.in_flock;</div><div class='add'>+            if (local-&gt;cont.inodelk.xdata)</div><div class='add'>+                dict_unref(local-&gt;cont.inodelk.xdata);</div><div class='add'>+            local-&gt;cont.inodelk.xdata = NULL;</div><div class='add'>+            if (local-&gt;xdata_req)</div><div class='add'>+                local-&gt;cont.inodelk.xdata = dict_ref(local-&gt;xdata_req);</div><div class='add'>+            break;</div><div class='add'>+        case GF_FOP_ENTRYLK:</div><div class='add'>+        case GF_FOP_FENTRYLK:</div><div class='add'>+            local-&gt;cont.entrylk.cmd = local-&gt;cont.entrylk.in_cmd;</div><div class='add'>+            if (local-&gt;cont.entrylk.xdata)</div><div class='add'>+                dict_unref(local-&gt;cont.entrylk.xdata);</div><div class='add'>+            local-&gt;cont.entrylk.xdata = NULL;</div><div class='add'>+            if (local-&gt;xdata_req)</div><div class='add'>+                local-&gt;cont.entrylk.xdata = dict_ref(local-&gt;xdata_req);</div><div class='add'>+            break;</div><div class='add'>+        default:</div><div class='add'>+            break;</div><div class='add'>+    }</div><div class='add'>+    afr_serialized_lock_wind(frame, frame-&gt;this);</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='del'>-		if (local-&gt;child_up[i]) {</div><div class='del'>-			STACK_WIND_COOKIE (frame, afr_fsync_cbk,</div><div class='del'>-                                           (void *) (long) i,</div><div class='del'>-                                           priv-&gt;children[i],</div><div class='del'>-                                           priv-&gt;children[i]-&gt;fops-&gt;fsync,</div><div class='del'>-                                           fd, datasync);</div><div class='del'>-			if (!--call_count)</div><div class='del'>-				break;</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='add'>+static int32_t</div><div class='add'>+afr_unlock_partial_lock_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                            int32_t op_ret, int32_t op_errno, dict_t *xdata)</div><div class='ctx'> </div><div class='del'>-	op_ret = 0;</div><div class='del'>-out:</div><div class='del'>-	if (op_ret == -1) {</div><div class='del'>-		AFR_STACK_UNWIND (fsync, frame, op_ret, op_errno, NULL, NULL);</div><div class='del'>-	}</div><div class='del'>-	return 0;</div><div class='add'>+{</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    int call_count = -1;</div><div class='add'>+    int child_index = (long)cookie;</div><div class='add'>+    uuid_t gfid = {0};</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    if (op_ret &lt; 0 &amp;&amp; op_errno != ENOTCONN) {</div><div class='add'>+        if (local-&gt;fd)</div><div class='add'>+            gf_uuid_copy(gfid, local-&gt;fd-&gt;inode-&gt;gfid);</div><div class='add'>+        else</div><div class='add'>+            loc_gfid(&amp;local-&gt;loc, gfid);</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_ERROR, op_errno, AFR_MSG_UNLOCK_FAIL,</div><div class='add'>+               "%s: Failed to unlock %s on %s "</div><div class='add'>+               "with lk_owner: %s",</div><div class='add'>+               uuid_utoa(gfid), gf_fop_list[local-&gt;op],</div><div class='add'>+               priv-&gt;children[child_index]-&gt;name,</div><div class='add'>+               lkowner_utoa(&amp;frame-&gt;root-&gt;lk_owner));</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    call_count = afr_frame_return(frame);</div><div class='add'>+    if (call_count == 0)</div><div class='add'>+        afr_fop_lock_proceed(frame);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-/* }}} */</div><div class='add'>+static int32_t</div><div class='add'>+afr_unlock_locks_and_proceed(call_frame_t *frame, xlator_t *this,</div><div class='add'>+                             int call_count)</div><div class='add'>+{</div><div class='add'>+    int i = 0;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+</div><div class='add'>+    if (call_count == 0) {</div><div class='add'>+        afr_fop_lock_proceed(frame);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+    local-&gt;call_count = call_count;</div><div class='add'>+    switch (local-&gt;op) {</div><div class='add'>+        case GF_FOP_INODELK:</div><div class='add'>+        case GF_FOP_FINODELK:</div><div class='add'>+            local-&gt;cont.inodelk.flock.l_type = F_UNLCK;</div><div class='add'>+            local-&gt;cont.inodelk.cmd = F_SETLK;</div><div class='add'>+            if (local-&gt;cont.inodelk.xdata)</div><div class='add'>+                dict_unref(local-&gt;cont.inodelk.xdata);</div><div class='add'>+            local-&gt;cont.inodelk.xdata = NULL;</div><div class='add'>+            break;</div><div class='add'>+        case GF_FOP_ENTRYLK:</div><div class='add'>+        case GF_FOP_FENTRYLK:</div><div class='add'>+            local-&gt;cont.entrylk.cmd = ENTRYLK_UNLOCK;</div><div class='add'>+            if (local-&gt;cont.entrylk.xdata)</div><div class='add'>+                dict_unref(local-&gt;cont.entrylk.xdata);</div><div class='add'>+            local-&gt;cont.entrylk.xdata = NULL;</div><div class='add'>+            break;</div><div class='add'>+        default:</div><div class='add'>+            break;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+        if (!local-&gt;replies[i].valid)</div><div class='add'>+            continue;</div><div class='add'>+</div><div class='add'>+        if (local-&gt;replies[i].op_ret == -1)</div><div class='add'>+            continue;</div><div class='add'>+</div><div class='add'>+        afr_fop_lock_wind(frame, this, i, afr_unlock_partial_lock_cbk);</div><div class='add'>+</div><div class='add'>+        if (!--call_count)</div><div class='add'>+            break;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-/* {{{ fsync */</div><div class='add'>+out:</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int32_t</div><div class='del'>-afr_fsyncdir_cbk (call_frame_t *frame, void *cookie,</div><div class='del'>-		  xlator_t *this, int32_t op_ret, int32_t op_errno)</div><div class='add'>+afr_fop_lock_done(call_frame_t *frame, xlator_t *this)</div><div class='ctx'> {</div><div class='del'>-	afr_local_t *local = NULL;</div><div class='add'>+    int i = 0;</div><div class='add'>+    int lock_count = 0;</div><div class='add'>+    unsigned char *success = NULL;</div><div class='ctx'> </div><div class='del'>-	int call_count = -1;</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='ctx'> </div><div class='del'>-	local = frame-&gt;local;</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+    success = alloca0(priv-&gt;child_count);</div><div class='ctx'> </div><div class='del'>-	LOCK (&amp;frame-&gt;lock);</div><div class='del'>-	{</div><div class='del'>-		if (op_ret == 0)</div><div class='del'>-			local-&gt;op_ret = 0;</div><div class='add'>+    for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+        if (!local-&gt;replies[i].valid)</div><div class='add'>+            continue;</div><div class='ctx'> </div><div class='del'>-		local-&gt;op_errno = op_errno;</div><div class='del'>-	}</div><div class='del'>-	UNLOCK (&amp;frame-&gt;lock);</div><div class='add'>+        if (local-&gt;replies[i].op_ret == 0) {</div><div class='add'>+            lock_count++;</div><div class='add'>+            success[i] = 1;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-	call_count = afr_frame_return (frame);</div><div class='add'>+        if (local-&gt;op_ret == -1 &amp;&amp; local-&gt;op_errno == EAGAIN)</div><div class='add'>+            continue;</div><div class='ctx'> </div><div class='del'>-	if (call_count == 0)</div><div class='del'>-		AFR_STACK_UNWIND (fsyncdir, frame, local-&gt;op_ret,</div><div class='del'>-                                  local-&gt;op_errno);</div><div class='add'>+        if ((local-&gt;replies[i].op_ret == -1) &amp;&amp;</div><div class='add'>+            (local-&gt;replies[i].op_errno == EAGAIN)) {</div><div class='add'>+            local-&gt;op_ret = -1;</div><div class='add'>+            local-&gt;op_errno = EAGAIN;</div><div class='add'>+            continue;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-	return 0;</div><div class='add'>+        if (local-&gt;replies[i].op_ret == 0)</div><div class='add'>+            local-&gt;op_ret = 0;</div><div class='add'>+</div><div class='add'>+        local-&gt;op_errno = local-&gt;replies[i].op_errno;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (afr_fop_lock_is_unlock(frame))</div><div class='add'>+        goto unwind;</div><div class='add'>+</div><div class='add'>+    if (afr_is_conflicting_lock_present(local-&gt;op_ret, local-&gt;op_errno)) {</div><div class='add'>+        afr_unlock_locks_and_proceed(frame, this, lock_count);</div><div class='add'>+    } else if (priv-&gt;quorum_count &amp;&amp; !afr_has_quorum(success, this, NULL)) {</div><div class='add'>+        local-&gt;fop_lock_state = AFR_FOP_LOCK_QUORUM_FAILED;</div><div class='add'>+        local-&gt;op_ret = -1;</div><div class='add'>+        local-&gt;op_errno = afr_final_errno(local, priv);</div><div class='add'>+        if (local-&gt;op_errno == 0)</div><div class='add'>+            local-&gt;op_errno = afr_quorum_errno(priv);</div><div class='add'>+        afr_unlock_locks_and_proceed(frame, this, lock_count);</div><div class='add'>+    } else {</div><div class='add'>+        goto unwind;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+unwind:</div><div class='add'>+    afr_fop_lock_unwind(frame, local-&gt;op, local-&gt;op_ret, local-&gt;op_errno,</div><div class='add'>+                        local-&gt;xdata_rsp);</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-afr_fsyncdir (call_frame_t *frame, xlator_t *this, fd_t *fd,</div><div class='del'>-	      int32_t datasync)</div><div class='add'>+static int</div><div class='add'>+afr_common_lock_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                    int32_t op_ret, int32_t op_errno, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-	afr_private_t *priv = NULL;</div><div class='del'>-	afr_local_t *local = NULL;</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    int child_index = (long)cookie;</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='ctx'> </div><div class='del'>-	int ret = -1;</div><div class='add'>+    local-&gt;replies[child_index].valid = 1;</div><div class='add'>+    local-&gt;replies[child_index].op_ret = op_ret;</div><div class='add'>+    local-&gt;replies[child_index].op_errno = op_errno;</div><div class='add'>+    if (op_ret == 0 &amp;&amp; xdata) {</div><div class='add'>+        local-&gt;replies[child_index].xdata = dict_ref(xdata);</div><div class='add'>+        LOCK(&amp;frame-&gt;lock);</div><div class='add'>+        {</div><div class='add'>+            if (!local-&gt;xdata_rsp)</div><div class='add'>+                local-&gt;xdata_rsp = dict_ref(xdata);</div><div class='add'>+        }</div><div class='add'>+        UNLOCK(&amp;frame-&gt;lock);</div><div class='add'>+    }</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	int i = 0;</div><div class='del'>-	int32_t call_count = 0;</div><div class='del'>-	int32_t op_ret   = -1;</div><div class='del'>-	int32_t op_errno = 0;</div><div class='add'>+static int32_t</div><div class='add'>+afr_serialized_lock_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                        int32_t op_ret, int32_t op_errno, dict_t *xdata)</div><div class='ctx'> </div><div class='del'>-	VALIDATE_OR_GOTO (frame, out);</div><div class='del'>-	VALIDATE_OR_GOTO (this, out);</div><div class='del'>-	VALIDATE_OR_GOTO (this-&gt;private, out);</div><div class='add'>+{</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    int child_index = (long)cookie;</div><div class='add'>+    int next_child = 0;</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    afr_common_lock_cbk(frame, cookie, this, op_ret, op_errno, xdata);</div><div class='add'>+</div><div class='add'>+    for (next_child = child_index + 1; next_child &lt; priv-&gt;child_count;</div><div class='add'>+         next_child++) {</div><div class='add'>+        if (local-&gt;child_up[next_child])</div><div class='add'>+            break;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (afr_is_conflicting_lock_present(op_ret, op_errno) ||</div><div class='add'>+        (next_child == priv-&gt;child_count)) {</div><div class='add'>+        afr_fop_lock_done(frame, this);</div><div class='add'>+    } else {</div><div class='add'>+        afr_fop_lock_wind(frame, this, next_child, afr_serialized_lock_cbk);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	priv = this-&gt;private;</div><div class='add'>+static int</div><div class='add'>+afr_serialized_lock_wind(call_frame_t *frame, xlator_t *this)</div><div class='add'>+{</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    int i = 0;</div><div class='ctx'> </div><div class='del'>-	ALLOC_OR_GOTO (local, afr_local_t, out);</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+    local = frame-&gt;local;</div><div class='ctx'> </div><div class='del'>-	ret = AFR_LOCAL_INIT (local, priv);</div><div class='del'>-	if (ret &lt; 0) {</div><div class='del'>-		op_errno = -ret;</div><div class='del'>-		goto out;</div><div class='del'>-	}</div><div class='add'>+    for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+        if (local-&gt;child_up[i]) {</div><div class='add'>+            afr_fop_lock_wind(frame, this, i, afr_serialized_lock_cbk);</div><div class='add'>+            break;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	call_count = local-&gt;call_count;</div><div class='del'>-	frame-&gt;local = local;</div><div class='add'>+static int32_t</div><div class='add'>+afr_parallel_lock_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                      int32_t op_ret, int32_t op_errno, dict_t *xdata)</div><div class='ctx'> </div><div class='del'>-	for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='del'>-		if (local-&gt;child_up[i]) {</div><div class='del'>-			STACK_WIND (frame, afr_fsyncdir_cbk,</div><div class='del'>-				    priv-&gt;children[i],</div><div class='del'>-				    priv-&gt;children[i]-&gt;fops-&gt;fsyncdir,</div><div class='del'>-				    fd, datasync);</div><div class='del'>-			if (!--call_count)</div><div class='del'>-				break;</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='add'>+{</div><div class='add'>+    int call_count = 0;</div><div class='ctx'> </div><div class='del'>-	op_ret = 0;</div><div class='del'>-out:</div><div class='del'>-	if (op_ret == -1) {</div><div class='del'>-		AFR_STACK_UNWIND (fsyncdir, frame, op_ret, op_errno);</div><div class='del'>-	}</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='add'>+    afr_common_lock_cbk(frame, cookie, this, op_ret, op_errno, xdata);</div><div class='ctx'> </div><div class='del'>-/* }}} */</div><div class='add'>+    call_count = afr_frame_return(frame);</div><div class='add'>+    if (call_count == 0)</div><div class='add'>+        afr_fop_lock_done(frame, this);</div><div class='ctx'> </div><div class='del'>-/* {{{ xattrop */</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-int32_t</div><div class='del'>-afr_xattrop_cbk (call_frame_t *frame, void *cookie,</div><div class='del'>-		 xlator_t *this, int32_t op_ret, int32_t op_errno,</div><div class='del'>-		 dict_t *xattr)</div><div class='add'>+static int</div><div class='add'>+afr_parallel_lock_wind(call_frame_t *frame, xlator_t *this)</div><div class='ctx'> {</div><div class='del'>-	afr_local_t *local = NULL;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    int call_count = 0;</div><div class='add'>+    int i = 0;</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    call_count = local-&gt;call_count;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+        if (!local-&gt;child_up[i])</div><div class='add'>+            continue;</div><div class='add'>+        afr_fop_lock_wind(frame, this, i, afr_parallel_lock_cbk);</div><div class='add'>+        if (!--call_count)</div><div class='add'>+            break;</div><div class='add'>+    }</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	int call_count = -1;</div><div class='add'>+static int</div><div class='add'>+afr_fop_handle_lock(call_frame_t *frame, xlator_t *this)</div><div class='add'>+{</div><div class='add'>+    afr_local_t *local = frame-&gt;local;</div><div class='add'>+    int op_errno = 0;</div><div class='add'>+</div><div class='add'>+    if (!afr_fop_lock_is_unlock(frame)) {</div><div class='add'>+        if (!afr_is_consistent_io_possible(local, this-&gt;private, &amp;op_errno))</div><div class='add'>+            goto out;</div><div class='add'>+</div><div class='add'>+        switch (local-&gt;op) {</div><div class='add'>+            case GF_FOP_INODELK:</div><div class='add'>+            case GF_FOP_FINODELK:</div><div class='add'>+                local-&gt;cont.inodelk.cmd = F_SETLK;</div><div class='add'>+                break;</div><div class='add'>+            case GF_FOP_ENTRYLK:</div><div class='add'>+            case GF_FOP_FENTRYLK:</div><div class='add'>+                local-&gt;cont.entrylk.cmd = ENTRYLK_LOCK_NB;</div><div class='add'>+                break;</div><div class='add'>+            default:</div><div class='add'>+                break;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (local-&gt;xdata_req) {</div><div class='add'>+        switch (local-&gt;op) {</div><div class='add'>+            case GF_FOP_INODELK:</div><div class='add'>+            case GF_FOP_FINODELK:</div><div class='add'>+                local-&gt;cont.inodelk.xdata = dict_ref(local-&gt;xdata_req);</div><div class='add'>+                break;</div><div class='add'>+            case GF_FOP_ENTRYLK:</div><div class='add'>+            case GF_FOP_FENTRYLK:</div><div class='add'>+                local-&gt;cont.entrylk.xdata = dict_ref(local-&gt;xdata_req);</div><div class='add'>+                break;</div><div class='add'>+            default:</div><div class='add'>+                break;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	local = frame-&gt;local;</div><div class='add'>+    local-&gt;fop_lock_state = AFR_FOP_LOCK_PARALLEL;</div><div class='add'>+    afr_parallel_lock_wind(frame, this);</div><div class='add'>+out:</div><div class='add'>+    return -op_errno;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	LOCK (&amp;frame-&gt;lock);</div><div class='del'>-	{</div><div class='del'>-		if (op_ret == 0)</div><div class='del'>-			local-&gt;op_ret = 0;</div><div class='add'>+static int32_t</div><div class='add'>+afr_handle_inodelk(call_frame_t *frame, xlator_t *this, glusterfs_fop_t fop,</div><div class='add'>+                   const char *volume, loc_t *loc, fd_t *fd, int32_t cmd,</div><div class='add'>+                   struct gf_flock *flock, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    int32_t op_errno = ENOMEM;</div><div class='add'>+</div><div class='add'>+    local = AFR_FRAME_INIT(frame, op_errno);</div><div class='add'>+    if (!local)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    local-&gt;op = fop;</div><div class='add'>+    if (loc)</div><div class='add'>+        loc_copy(&amp;local-&gt;loc, loc);</div><div class='add'>+    if (fd &amp;&amp; (flock-&gt;l_type != F_UNLCK)) {</div><div class='add'>+        AFR_ERROR_OUT_IF_FDCTX_INVALID(fd, this, op_errno, out);</div><div class='add'>+        local-&gt;fd = fd_ref(fd);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    local-&gt;cont.inodelk.volume = gf_strdup(volume);</div><div class='add'>+    if (!local-&gt;cont.inodelk.volume) {</div><div class='add'>+        op_errno = ENOMEM;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    local-&gt;cont.inodelk.in_cmd = cmd;</div><div class='add'>+    local-&gt;cont.inodelk.cmd = cmd;</div><div class='add'>+    local-&gt;cont.inodelk.in_flock = *flock;</div><div class='add'>+    local-&gt;cont.inodelk.flock = *flock;</div><div class='add'>+    if (xdata)</div><div class='add'>+        local-&gt;xdata_req = dict_ref(xdata);</div><div class='add'>+</div><div class='add'>+    op_errno = -afr_fop_handle_lock(frame, frame-&gt;this);</div><div class='add'>+    if (op_errno)</div><div class='add'>+        goto out;</div><div class='add'>+    return 0;</div><div class='add'>+out:</div><div class='add'>+    afr_fop_lock_unwind(frame, fop, -1, op_errno, NULL);</div><div class='ctx'> </div><div class='del'>-		local-&gt;op_errno = op_errno;</div><div class='del'>-	}</div><div class='del'>-	UNLOCK (&amp;frame-&gt;lock);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	call_count = afr_frame_return (frame);</div><div class='add'>+int32_t</div><div class='add'>+afr_inodelk(call_frame_t *frame, xlator_t *this, const char *volume, loc_t *loc,</div><div class='add'>+            int32_t cmd, struct gf_flock *flock, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    afr_handle_inodelk(frame, this, GF_FOP_INODELK, volume, loc, NULL, cmd,</div><div class='add'>+                       flock, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	if (call_count == 0)</div><div class='del'>-		AFR_STACK_UNWIND (xattrop, frame, local-&gt;op_ret, local-&gt;op_errno,</div><div class='del'>-                                  xattr);</div><div class='add'>+int32_t</div><div class='add'>+afr_finodelk(call_frame_t *frame, xlator_t *this, const char *volume, fd_t *fd,</div><div class='add'>+             int32_t cmd, struct gf_flock *flock, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    afr_handle_inodelk(frame, this, GF_FOP_FINODELK, volume, NULL, fd, cmd,</div><div class='add'>+                       flock, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	return 0;</div><div class='add'>+static int</div><div class='add'>+afr_handle_entrylk(call_frame_t *frame, xlator_t *this, glusterfs_fop_t fop,</div><div class='add'>+                   const char *volume, loc_t *loc, fd_t *fd,</div><div class='add'>+                   const char *basename, entrylk_cmd cmd, entrylk_type type,</div><div class='add'>+                   dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    int32_t op_errno = ENOMEM;</div><div class='add'>+</div><div class='add'>+    local = AFR_FRAME_INIT(frame, op_errno);</div><div class='add'>+    if (!local)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    local-&gt;op = fop;</div><div class='add'>+    if (loc)</div><div class='add'>+        loc_copy(&amp;local-&gt;loc, loc);</div><div class='add'>+    if (fd &amp;&amp; (cmd != ENTRYLK_UNLOCK)) {</div><div class='add'>+        AFR_ERROR_OUT_IF_FDCTX_INVALID(fd, this, op_errno, out);</div><div class='add'>+        local-&gt;fd = fd_ref(fd);</div><div class='add'>+    }</div><div class='add'>+    local-&gt;cont.entrylk.cmd = cmd;</div><div class='add'>+    local-&gt;cont.entrylk.in_cmd = cmd;</div><div class='add'>+    local-&gt;cont.entrylk.type = type;</div><div class='add'>+    local-&gt;cont.entrylk.volume = gf_strdup(volume);</div><div class='add'>+    local-&gt;cont.entrylk.basename = gf_strdup(basename);</div><div class='add'>+    if (!local-&gt;cont.entrylk.volume || !local-&gt;cont.entrylk.basename) {</div><div class='add'>+        op_errno = ENOMEM;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    if (xdata)</div><div class='add'>+        local-&gt;xdata_req = dict_ref(xdata);</div><div class='add'>+    op_errno = -afr_fop_handle_lock(frame, frame-&gt;this);</div><div class='add'>+    if (op_errno)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+out:</div><div class='add'>+    afr_fop_lock_unwind(frame, fop, -1, op_errno, NULL);</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+int</div><div class='add'>+afr_entrylk(call_frame_t *frame, xlator_t *this, const char *volume, loc_t *loc,</div><div class='add'>+            const char *basename, entrylk_cmd cmd, entrylk_type type,</div><div class='add'>+            dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    afr_handle_entrylk(frame, this, GF_FOP_ENTRYLK, volume, loc, NULL, basename,</div><div class='add'>+                       cmd, type, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-int32_t</div><div class='del'>-afr_xattrop (call_frame_t *frame, xlator_t *this, loc_t *loc,</div><div class='del'>-	     gf_xattrop_flags_t optype, dict_t *xattr)</div><div class='add'>+int</div><div class='add'>+afr_fentrylk(call_frame_t *frame, xlator_t *this, const char *volume, fd_t *fd,</div><div class='add'>+             const char *basename, entrylk_cmd cmd, entrylk_type type,</div><div class='add'>+             dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-	afr_private_t *priv = NULL;</div><div class='del'>-	afr_local_t *local  = NULL;</div><div class='add'>+    afr_handle_entrylk(frame, this, GF_FOP_FENTRYLK, volume, NULL, fd, basename,</div><div class='add'>+                       cmd, type, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	int ret = -1;</div><div class='add'>+int</div><div class='add'>+afr_statfs_cbk(call_frame_t *frame, void *cookie, xlator_t *this, int op_ret,</div><div class='add'>+               int op_errno, struct statvfs *statvfs, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    int call_count = 0;</div><div class='add'>+    struct statvfs *buf = NULL;</div><div class='ctx'> </div><div class='del'>-	int i = 0;</div><div class='del'>-	int32_t call_count = 0;</div><div class='del'>-	int32_t op_ret   = -1;</div><div class='del'>-	int32_t op_errno = 0;</div><div class='add'>+    local = frame-&gt;local;</div><div class='ctx'> </div><div class='del'>-	VALIDATE_OR_GOTO (frame, out);</div><div class='del'>-	VALIDATE_OR_GOTO (this, out);</div><div class='del'>-	VALIDATE_OR_GOTO (this-&gt;private, out);</div><div class='add'>+    LOCK(&amp;frame-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        if (op_ret != 0) {</div><div class='add'>+            local-&gt;op_errno = op_errno;</div><div class='add'>+            goto unlock;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-	priv = this-&gt;private;</div><div class='add'>+        local-&gt;op_ret = op_ret;</div><div class='ctx'> </div><div class='del'>-	ALLOC_OR_GOTO (local, afr_local_t, out);</div><div class='add'>+        buf = &amp;local-&gt;cont.statfs.buf;</div><div class='add'>+        if (local-&gt;cont.statfs.buf_set) {</div><div class='add'>+            if (statvfs-&gt;f_bavail &lt; buf-&gt;f_bavail) {</div><div class='add'>+                *buf = *statvfs;</div><div class='add'>+                if (xdata) {</div><div class='add'>+                    if (local-&gt;xdata_rsp)</div><div class='add'>+                        dict_unref(local-&gt;xdata_rsp);</div><div class='add'>+                    local-&gt;xdata_rsp = dict_ref(xdata);</div><div class='add'>+                }</div><div class='add'>+            }</div><div class='add'>+        } else {</div><div class='add'>+            *buf = *statvfs;</div><div class='add'>+            local-&gt;cont.statfs.buf_set = 1;</div><div class='add'>+            if (xdata)</div><div class='add'>+                local-&gt;xdata_rsp = dict_ref(xdata);</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+unlock:</div><div class='add'>+    call_count = --local-&gt;call_count;</div><div class='add'>+    UNLOCK(&amp;frame-&gt;lock);</div><div class='ctx'> </div><div class='del'>-	ret = AFR_LOCAL_INIT (local, priv);</div><div class='del'>-	if (ret &lt; 0) {</div><div class='del'>-		op_errno = -ret;</div><div class='del'>-		goto out;</div><div class='del'>-	}</div><div class='add'>+    if (call_count == 0)</div><div class='add'>+        AFR_STACK_UNWIND(statfs, frame, local-&gt;op_ret, local-&gt;op_errno,</div><div class='add'>+                         &amp;local-&gt;cont.statfs.buf, local-&gt;xdata_rsp);</div><div class='ctx'> </div><div class='del'>-	call_count = local-&gt;call_count;</div><div class='del'>-	frame-&gt;local = local;</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='del'>-		if (local-&gt;child_up[i]) {</div><div class='del'>-			STACK_WIND (frame, afr_xattrop_cbk,</div><div class='del'>-				    priv-&gt;children[i],</div><div class='del'>-				    priv-&gt;children[i]-&gt;fops-&gt;xattrop,</div><div class='del'>-				    loc, optype, xattr);</div><div class='del'>-			if (!--call_count)</div><div class='del'>-				break;</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='add'>+int</div><div class='add'>+afr_statfs(call_frame_t *frame, xlator_t *this, loc_t *loc, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    int i = 0;</div><div class='add'>+    int call_count = 0;</div><div class='add'>+    int32_t op_errno = ENOMEM;</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    local = AFR_FRAME_INIT(frame, op_errno);</div><div class='add'>+    if (!local)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    local-&gt;op = GF_FOP_STATFS;</div><div class='add'>+    if (!afr_is_consistent_io_possible(local, priv, &amp;op_errno))</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    if (priv-&gt;arbiter_count == 1 &amp;&amp; local-&gt;child_up[ARBITER_BRICK_INDEX])</div><div class='add'>+        local-&gt;call_count--;</div><div class='add'>+    call_count = local-&gt;call_count;</div><div class='add'>+    if (!call_count) {</div><div class='add'>+        op_errno = ENOTCONN;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+        if (local-&gt;child_up[i]) {</div><div class='add'>+            if (AFR_IS_ARBITER_BRICK(priv, i))</div><div class='add'>+                continue;</div><div class='add'>+            STACK_WIND(frame, afr_statfs_cbk, priv-&gt;children[i],</div><div class='add'>+                       priv-&gt;children[i]-&gt;fops-&gt;statfs, loc, xdata);</div><div class='add'>+            if (!--call_count)</div><div class='add'>+                break;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	op_ret = 0;</div><div class='add'>+    return 0;</div><div class='ctx'> out:</div><div class='del'>-	if (op_ret == -1) {</div><div class='del'>-		AFR_STACK_UNWIND (xattrop, frame, op_ret, op_errno, NULL);</div><div class='del'>-	}</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='add'>+    AFR_STACK_UNWIND(statfs, frame, -1, op_errno, NULL, NULL);</div><div class='ctx'> </div><div class='del'>-/* }}} */</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-/* {{{ fxattrop */</div><div class='add'>+int32_t</div><div class='add'>+afr_lk_unlock_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                  int32_t op_ret, int32_t op_errno, struct gf_flock *lock,</div><div class='add'>+                  dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    afr_private_t *priv = this-&gt;private;</div><div class='add'>+    int call_count = -1;</div><div class='add'>+    int child_index = (long)cookie;</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+</div><div class='add'>+    if (op_ret &lt; 0 &amp;&amp; op_errno != ENOTCONN &amp;&amp; op_errno != EBADFD) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_ERROR, op_errno, AFR_MSG_UNLOCK_FAIL,</div><div class='add'>+               "gfid=%s: unlock failed on subvolume %s "</div><div class='add'>+               "with lock owner %s",</div><div class='add'>+               uuid_utoa(local-&gt;fd-&gt;inode-&gt;gfid),</div><div class='add'>+               priv-&gt;children[child_index]-&gt;name,</div><div class='add'>+               lkowner_utoa(&amp;frame-&gt;root-&gt;lk_owner));</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    call_count = afr_frame_return(frame);</div><div class='add'>+    if (call_count == 0) {</div><div class='add'>+        AFR_STACK_UNWIND(lk, frame, local-&gt;op_ret, local-&gt;op_errno, NULL,</div><div class='add'>+                         local-&gt;xdata_rsp);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int32_t</div><div class='del'>-afr_fxattrop_cbk (call_frame_t *frame, void *cookie,</div><div class='del'>-		  xlator_t *this, int32_t op_ret, int32_t op_errno,</div><div class='del'>-		  dict_t *xattr)</div><div class='add'>+afr_lk_unlock(call_frame_t *frame, xlator_t *this)</div><div class='ctx'> {</div><div class='del'>-	afr_local_t *local = NULL;</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    int i = 0;</div><div class='add'>+    int call_count = 0;</div><div class='ctx'> </div><div class='del'>-	int call_count = -1;</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    priv = this-&gt;private;</div><div class='ctx'> </div><div class='del'>-	local = frame-&gt;local;</div><div class='add'>+    call_count = afr_locked_nodes_count(local-&gt;cont.lk.locked_nodes,</div><div class='add'>+                                        priv-&gt;child_count);</div><div class='ctx'> </div><div class='del'>-	LOCK (&amp;frame-&gt;lock);</div><div class='del'>-	{</div><div class='del'>-		if (op_ret == 0)</div><div class='del'>-			local-&gt;op_ret = 0;</div><div class='add'>+    if (call_count == 0) {</div><div class='add'>+        AFR_STACK_UNWIND(lk, frame, local-&gt;op_ret, local-&gt;op_errno, NULL,</div><div class='add'>+                         local-&gt;xdata_rsp);</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-		local-&gt;op_errno = op_errno;</div><div class='del'>-	}</div><div class='del'>-	UNLOCK (&amp;frame-&gt;lock);</div><div class='add'>+    local-&gt;call_count = call_count;</div><div class='ctx'> </div><div class='del'>-	call_count = afr_frame_return (frame);</div><div class='add'>+    local-&gt;cont.lk.user_flock.l_type = F_UNLCK;</div><div class='ctx'> </div><div class='del'>-	if (call_count == 0)</div><div class='del'>-		AFR_STACK_UNWIND (fxattrop, frame, local-&gt;op_ret, local-&gt;op_errno,</div><div class='del'>-                                  xattr);</div><div class='add'>+    for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+        if (local-&gt;cont.lk.locked_nodes[i]) {</div><div class='add'>+            STACK_WIND_COOKIE(frame, afr_lk_unlock_cbk, (void *)(long)i,</div><div class='add'>+                              priv-&gt;children[i], priv-&gt;children[i]-&gt;fops-&gt;lk,</div><div class='add'>+                              local-&gt;fd, F_SETLK, &amp;local-&gt;cont.lk.user_flock,</div><div class='add'>+                              NULL);</div><div class='ctx'> </div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='add'>+            if (!--call_count)</div><div class='add'>+                break;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='ctx'> </div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int32_t</div><div class='del'>-afr_fxattrop (call_frame_t *frame, xlator_t *this, fd_t *fd,</div><div class='del'>-	      gf_xattrop_flags_t optype, dict_t *xattr)</div><div class='add'>+afr_lk_cbk(call_frame_t *frame, void *cookie, xlator_t *this, int32_t op_ret,</div><div class='add'>+           int32_t op_errno, struct gf_flock *lock, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-	afr_private_t *priv = NULL;</div><div class='del'>-	afr_local_t *local  = NULL;</div><div class='del'>-</div><div class='del'>-	int ret = -1;</div><div class='del'>-</div><div class='del'>-	int i = 0;</div><div class='del'>-	int32_t call_count = 0;</div><div class='del'>-	int32_t op_ret   = -1;</div><div class='del'>-	int32_t op_errno = 0;</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    int child_index = -1;</div><div class='ctx'> </div><div class='del'>-	VALIDATE_OR_GOTO (frame, out);</div><div class='del'>-	VALIDATE_OR_GOTO (this, out);</div><div class='del'>-	VALIDATE_OR_GOTO (this-&gt;private, out);</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    priv = this-&gt;private;</div><div class='ctx'> </div><div class='del'>-	priv = this-&gt;private;</div><div class='add'>+    child_index = (long)cookie;</div><div class='ctx'> </div><div class='del'>-	ALLOC_OR_GOTO (local, afr_local_t, out);</div><div class='add'>+    afr_common_lock_cbk(frame, cookie, this, op_ret, op_errno, xdata);</div><div class='add'>+    if (op_ret &lt; 0 &amp;&amp; op_errno == EAGAIN) {</div><div class='add'>+        local-&gt;op_ret = -1;</div><div class='add'>+        local-&gt;op_errno = EAGAIN;</div><div class='ctx'> </div><div class='del'>-	ret = AFR_LOCAL_INIT (local, priv);</div><div class='del'>-	if (ret &lt; 0) {</div><div class='del'>-		op_errno = -ret;</div><div class='del'>-		goto out;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	call_count = local-&gt;call_count;</div><div class='del'>-	frame-&gt;local = local;</div><div class='add'>+        afr_lk_unlock(frame, this);</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (op_ret == 0) {</div><div class='add'>+        local-&gt;op_ret = 0;</div><div class='add'>+        local-&gt;op_errno = 0;</div><div class='add'>+        local-&gt;cont.lk.locked_nodes[child_index] = 1;</div><div class='add'>+        local-&gt;cont.lk.ret_flock = *lock;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    child_index++;</div><div class='add'>+</div><div class='add'>+    if (child_index &lt; priv-&gt;child_count) {</div><div class='add'>+        STACK_WIND_COOKIE(frame, afr_lk_cbk, (void *)(long)child_index,</div><div class='add'>+                          priv-&gt;children[child_index],</div><div class='add'>+                          priv-&gt;children[child_index]-&gt;fops-&gt;lk, local-&gt;fd,</div><div class='add'>+                          local-&gt;cont.lk.cmd, &amp;local-&gt;cont.lk.user_flock,</div><div class='add'>+                          local-&gt;xdata_req);</div><div class='add'>+    } else if (priv-&gt;quorum_count &amp;&amp;</div><div class='add'>+               !afr_has_quorum(local-&gt;cont.lk.locked_nodes, this, NULL)) {</div><div class='add'>+        local-&gt;op_ret = -1;</div><div class='add'>+        local-&gt;op_errno = afr_final_errno(local, priv);</div><div class='add'>+</div><div class='add'>+        afr_lk_unlock(frame, this);</div><div class='add'>+    } else {</div><div class='add'>+        if (local-&gt;op_ret &lt; 0)</div><div class='add'>+            local-&gt;op_errno = afr_final_errno(local, priv);</div><div class='add'>+</div><div class='add'>+        AFR_STACK_UNWIND(lk, frame, local-&gt;op_ret, local-&gt;op_errno,</div><div class='add'>+                         &amp;local-&gt;cont.lk.ret_flock, local-&gt;xdata_rsp);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='del'>-		if (local-&gt;child_up[i]) {</div><div class='del'>-			STACK_WIND (frame, afr_fxattrop_cbk,</div><div class='del'>-				    priv-&gt;children[i],</div><div class='del'>-				    priv-&gt;children[i]-&gt;fops-&gt;fxattrop,</div><div class='del'>-				    fd, optype, xattr);</div><div class='del'>-			if (!--call_count)</div><div class='del'>-				break;</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='add'>+int</div><div class='add'>+afr_lk_transaction_cbk(int ret, call_frame_t *frame, void *opaque)</div><div class='add'>+{</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	op_ret = 0;</div><div class='del'>-out:</div><div class='del'>-	if (op_ret == -1) {</div><div class='del'>-		AFR_STACK_UNWIND (fxattrop, frame, op_ret, op_errno, NULL);</div><div class='del'>-	}</div><div class='del'>-	return 0;</div><div class='add'>+int</div><div class='add'>+afr_lk_txn_wind_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                    int32_t op_ret, int32_t op_errno, struct gf_flock *lock,</div><div class='add'>+                    dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    int child_index = -1;</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    child_index = (long)cookie;</div><div class='add'>+    afr_common_lock_cbk(frame, cookie, this, op_ret, op_errno, xdata);</div><div class='add'>+    if (op_ret == 0) {</div><div class='add'>+        local-&gt;op_ret = 0;</div><div class='add'>+        local-&gt;op_errno = 0;</div><div class='add'>+        local-&gt;cont.lk.locked_nodes[child_index] = 1;</div><div class='add'>+        local-&gt;cont.lk.ret_flock = *lock;</div><div class='add'>+    }</div><div class='add'>+    syncbarrier_wake(&amp;local-&gt;barrier);</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-/* }}} */</div><div class='add'>+int</div><div class='add'>+afr_lk_txn_unlock_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                      int32_t op_ret, int32_t op_errno, struct gf_flock *lock,</div><div class='add'>+                      dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    afr_local_t *local = frame-&gt;local;</div><div class='add'>+    afr_private_t *priv = this-&gt;private;</div><div class='add'>+    int child_index = (long)cookie;</div><div class='add'>+</div><div class='add'>+    if (op_ret &lt; 0 &amp;&amp; op_errno != ENOTCONN &amp;&amp; op_errno != EBADFD) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_ERROR, op_errno, AFR_MSG_UNLOCK_FAIL,</div><div class='add'>+               "gfid=%s: unlock failed on subvolume %s "</div><div class='add'>+               "with lock owner %s",</div><div class='add'>+               uuid_utoa(local-&gt;fd-&gt;inode-&gt;gfid),</div><div class='add'>+               priv-&gt;children[child_index]-&gt;name,</div><div class='add'>+               lkowner_utoa(&amp;frame-&gt;root-&gt;lk_owner));</div><div class='add'>+    }</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+int</div><div class='add'>+afr_lk_transaction(void *opaque)</div><div class='add'>+{</div><div class='add'>+    call_frame_t *frame = NULL;</div><div class='add'>+    xlator_t *this = NULL;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    char *wind_on = NULL;</div><div class='add'>+    int op_errno = 0;</div><div class='add'>+    int i = 0;</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    frame = (call_frame_t *)opaque;</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    this = frame-&gt;this;</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+    wind_on = alloca0(priv-&gt;child_count);</div><div class='add'>+</div><div class='add'>+    if (priv-&gt;arbiter_count || priv-&gt;child_count != 3) {</div><div class='add'>+        op_errno = ENOTSUP;</div><div class='add'>+        gf_msg(frame-&gt;this-&gt;name, GF_LOG_ERROR, op_errno, AFR_MSG_LK_HEAL_DOM,</div><div class='add'>+               "%s: Lock healing supported only for replica 3 volumes.",</div><div class='add'>+               uuid_utoa(local-&gt;fd-&gt;inode-&gt;gfid));</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    op_errno = -afr_dom_lock_acquire(frame);  // Released during</div><div class='add'>+                                              // AFR_STACK_UNWIND</div><div class='add'>+    if (op_errno != 0) {</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+    if (priv-&gt;quorum_count &amp;&amp;</div><div class='add'>+        !afr_has_quorum(local-&gt;cont.lk.dom_locked_nodes, this, NULL)) {</div><div class='add'>+        op_errno = afr_final_errno(local, priv);</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+        if (priv-&gt;child_up[i] &amp;&amp; local-&gt;cont.lk.dom_locked_nodes[i])</div><div class='add'>+            wind_on[i] = 1;</div><div class='add'>+    }</div><div class='add'>+    AFR_ONLIST(wind_on, frame, afr_lk_txn_wind_cbk, lk, local-&gt;fd,</div><div class='add'>+               local-&gt;cont.lk.cmd, &amp;local-&gt;cont.lk.user_flock,</div><div class='add'>+               local-&gt;xdata_req);</div><div class='add'>+</div><div class='add'>+    if (priv-&gt;quorum_count &amp;&amp;</div><div class='add'>+        !afr_has_quorum(local-&gt;cont.lk.locked_nodes, this, NULL)) {</div><div class='add'>+        local-&gt;op_ret = -1;</div><div class='add'>+        local-&gt;op_errno = afr_final_errno(local, priv);</div><div class='add'>+        goto unlock;</div><div class='add'>+    } else {</div><div class='add'>+        if (local-&gt;cont.lk.user_flock.l_type == F_UNLCK)</div><div class='add'>+            ret = afr_remove_lock_from_saved_locks(local, this);</div><div class='add'>+        else</div><div class='add'>+            ret = afr_add_lock_to_saved_locks(frame, this);</div><div class='add'>+        if (ret) {</div><div class='add'>+            local-&gt;op_ret = -1;</div><div class='add'>+            local-&gt;op_errno = -ret;</div><div class='add'>+            goto unlock;</div><div class='add'>+        }</div><div class='add'>+        AFR_STACK_UNWIND(lk, frame, local-&gt;op_ret, local-&gt;op_errno,</div><div class='add'>+                         &amp;local-&gt;cont.lk.ret_flock, local-&gt;xdata_rsp);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='add'>+    return 0;</div><div class='ctx'> </div><div class='del'>-int32_t</div><div class='del'>-afr_inodelk_cbk (call_frame_t *frame, void *cookie,</div><div class='del'>-		 xlator_t *this, int32_t op_ret, int32_t op_errno)</div><div class='add'>+unlock:</div><div class='add'>+    local-&gt;cont.lk.user_flock.l_type = F_UNLCK;</div><div class='add'>+    AFR_ONLIST(local-&gt;cont.lk.locked_nodes, frame, afr_lk_txn_unlock_cbk, lk,</div><div class='add'>+               local-&gt;fd, F_SETLK, &amp;local-&gt;cont.lk.user_flock, NULL);</div><div class='add'>+err:</div><div class='add'>+    AFR_STACK_UNWIND(lk, frame, -1, op_errno, NULL, NULL);</div><div class='add'>+    return -1;</div><div class='add'>+}</div><div class='ctx'> </div><div class='add'>+int</div><div class='add'>+afr_lk(call_frame_t *frame, xlator_t *this, fd_t *fd, int32_t cmd,</div><div class='add'>+       struct gf_flock *flock, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-	afr_local_t *local = NULL;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    int i = 0;</div><div class='add'>+    int32_t op_errno = ENOMEM;</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    local = AFR_FRAME_INIT(frame, op_errno);</div><div class='add'>+    if (!local)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    local-&gt;op = GF_FOP_LK;</div><div class='add'>+    if (!afr_lk_is_unlock(cmd, flock)) {</div><div class='add'>+        AFR_ERROR_OUT_IF_FDCTX_INVALID(fd, this, op_errno, out);</div><div class='add'>+        if (!afr_is_consistent_io_possible(local, priv, &amp;op_errno))</div><div class='add'>+            goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    local-&gt;cont.lk.locked_nodes = GF_CALLOC(</div><div class='add'>+        priv-&gt;child_count, sizeof(*local-&gt;cont.lk.locked_nodes),</div><div class='add'>+        gf_afr_mt_char);</div><div class='add'>+</div><div class='add'>+    if (!local-&gt;cont.lk.locked_nodes) {</div><div class='add'>+        op_errno = ENOMEM;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    local-&gt;fd = fd_ref(fd);</div><div class='add'>+    local-&gt;cont.lk.cmd = cmd;</div><div class='add'>+    local-&gt;cont.lk.user_flock = *flock;</div><div class='add'>+    local-&gt;cont.lk.ret_flock = *flock;</div><div class='add'>+    if (xdata)</div><div class='add'>+        local-&gt;xdata_req = dict_ref(xdata);</div><div class='add'>+</div><div class='add'>+    if (afr_is_lock_mode_mandatory(xdata)) {</div><div class='add'>+        ret = synctask_new(this-&gt;ctx-&gt;env, afr_lk_transaction,</div><div class='add'>+                           afr_lk_transaction_cbk, frame, frame);</div><div class='add'>+        if (ret) {</div><div class='add'>+            op_errno = ENOMEM;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	int call_count = -1;</div><div class='add'>+    STACK_WIND_COOKIE(frame, afr_lk_cbk, (void *)(long)0, priv-&gt;children[i],</div><div class='add'>+                      priv-&gt;children[i]-&gt;fops-&gt;lk, fd, cmd, flock,</div><div class='add'>+                      local-&gt;xdata_req);</div><div class='ctx'> </div><div class='del'>-	local = frame-&gt;local;</div><div class='add'>+    return 0;</div><div class='add'>+out:</div><div class='add'>+    AFR_STACK_UNWIND(lk, frame, -1, op_errno, NULL, NULL);</div><div class='ctx'> </div><div class='del'>-	LOCK (&amp;frame-&gt;lock);</div><div class='del'>-	{</div><div class='del'>-		if (op_ret == 0)</div><div class='del'>-			local-&gt;op_ret = 0;</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-		local-&gt;op_errno = op_errno;</div><div class='del'>-	}</div><div class='del'>-	UNLOCK (&amp;frame-&gt;lock);</div><div class='add'>+int32_t</div><div class='add'>+afr_lease_unlock_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                     int32_t op_ret, int32_t op_errno, struct gf_lease *lease,</div><div class='add'>+                     dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    int call_count = -1;</div><div class='ctx'> </div><div class='del'>-	call_count = afr_frame_return (frame);</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    call_count = afr_frame_return(frame);</div><div class='ctx'> </div><div class='del'>-	if (call_count == 0)</div><div class='del'>-		AFR_STACK_UNWIND (inodelk, frame, local-&gt;op_ret,</div><div class='del'>-                                  local-&gt;op_errno);</div><div class='add'>+    if (call_count == 0)</div><div class='add'>+        AFR_STACK_UNWIND(lease, frame, local-&gt;op_ret, local-&gt;op_errno, lease,</div><div class='add'>+                         xdata);</div><div class='ctx'> </div><div class='del'>-	return 0;</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int32_t</div><div class='del'>-afr_inodelk (call_frame_t *frame, xlator_t *this,</div><div class='del'>-             const char *volume, loc_t *loc, int32_t cmd, struct flock *flock)</div><div class='add'>+afr_lease_unlock(call_frame_t *frame, xlator_t *this)</div><div class='ctx'> {</div><div class='del'>-	afr_private_t *priv = NULL;</div><div class='del'>-	afr_local_t *local  = NULL;</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    int i = 0;</div><div class='add'>+    int call_count = 0;</div><div class='ctx'> </div><div class='del'>-	int ret = -1;</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    priv = this-&gt;private;</div><div class='ctx'> </div><div class='del'>-	int i = 0;</div><div class='del'>-	int32_t call_count = 0;</div><div class='del'>-	int32_t op_ret   = -1;</div><div class='del'>-	int32_t op_errno = 0;</div><div class='add'>+    call_count = afr_locked_nodes_count(local-&gt;cont.lease.locked_nodes,</div><div class='add'>+                                        priv-&gt;child_count);</div><div class='ctx'> </div><div class='del'>-	VALIDATE_OR_GOTO (frame, out);</div><div class='del'>-	VALIDATE_OR_GOTO (this, out);</div><div class='del'>-	VALIDATE_OR_GOTO (this-&gt;private, out);</div><div class='add'>+    if (call_count == 0) {</div><div class='add'>+        AFR_STACK_UNWIND(lease, frame, local-&gt;op_ret, local-&gt;op_errno,</div><div class='add'>+                         &amp;local-&gt;cont.lease.ret_lease, NULL);</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	priv = this-&gt;private;</div><div class='add'>+    local-&gt;call_count = call_count;</div><div class='ctx'> </div><div class='del'>-	ALLOC_OR_GOTO (local, afr_local_t, out);</div><div class='add'>+    local-&gt;cont.lease.user_lease.cmd = GF_UNLK_LEASE;</div><div class='ctx'> </div><div class='del'>-	ret = AFR_LOCAL_INIT (local, priv);</div><div class='del'>-	if (ret &lt; 0) {</div><div class='del'>-		op_errno = -ret;</div><div class='del'>-		goto out;</div><div class='del'>-	}</div><div class='add'>+    for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+        if (local-&gt;cont.lease.locked_nodes[i]) {</div><div class='add'>+            STACK_WIND(frame, afr_lease_unlock_cbk, priv-&gt;children[i],</div><div class='add'>+                       priv-&gt;children[i]-&gt;fops-&gt;lease, &amp;local-&gt;loc,</div><div class='add'>+                       &amp;local-&gt;cont.lease.user_lease, NULL);</div><div class='ctx'> </div><div class='del'>-	call_count = local-&gt;call_count;</div><div class='del'>-	frame-&gt;local = local;</div><div class='add'>+            if (!--call_count)</div><div class='add'>+                break;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='del'>-		if (local-&gt;child_up[i]) {</div><div class='del'>-			STACK_WIND (frame, afr_inodelk_cbk,</div><div class='del'>-				    priv-&gt;children[i],</div><div class='del'>-				    priv-&gt;children[i]-&gt;fops-&gt;inodelk,</div><div class='del'>-				    volume, loc, cmd, flock);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-			if (!--call_count)</div><div class='del'>-				break;</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='add'>+int32_t</div><div class='add'>+afr_lease_cbk(call_frame_t *frame, void *cookie, xlator_t *this, int32_t op_ret,</div><div class='add'>+              int32_t op_errno, struct gf_lease *lease, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    int child_index = -1;</div><div class='ctx'> </div><div class='del'>-	op_ret = 0;</div><div class='del'>-out:</div><div class='del'>-	if (op_ret == -1) {</div><div class='del'>-		AFR_STACK_UNWIND (inodelk, frame, op_ret, op_errno);</div><div class='del'>-	}</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    priv = this-&gt;private;</div><div class='ctx'> </div><div class='add'>+    child_index = (long)cookie;</div><div class='ctx'> </div><div class='del'>-int32_t</div><div class='del'>-afr_finodelk_cbk (call_frame_t *frame, void *cookie,</div><div class='del'>-		  xlator_t *this, int32_t op_ret, int32_t op_errno)</div><div class='add'>+    afr_common_lock_cbk(frame, cookie, this, op_ret, op_errno, xdata);</div><div class='add'>+    if (op_ret &lt; 0 &amp;&amp; op_errno == EAGAIN) {</div><div class='add'>+        local-&gt;op_ret = -1;</div><div class='add'>+        local-&gt;op_errno = EAGAIN;</div><div class='add'>+</div><div class='add'>+        afr_lease_unlock(frame, this);</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (op_ret == 0) {</div><div class='add'>+        local-&gt;op_ret = 0;</div><div class='add'>+        local-&gt;op_errno = 0;</div><div class='add'>+        local-&gt;cont.lease.locked_nodes[child_index] = 1;</div><div class='add'>+        local-&gt;cont.lease.ret_lease = *lease;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    child_index++;</div><div class='add'>+    if (child_index &lt; priv-&gt;child_count) {</div><div class='add'>+        STACK_WIND_COOKIE(frame, afr_lease_cbk, (void *)(long)child_index,</div><div class='add'>+                          priv-&gt;children[child_index],</div><div class='add'>+                          priv-&gt;children[child_index]-&gt;fops-&gt;lease, &amp;local-&gt;loc,</div><div class='add'>+                          &amp;local-&gt;cont.lease.user_lease, xdata);</div><div class='add'>+    } else if (priv-&gt;quorum_count &amp;&amp;</div><div class='add'>+               !afr_has_quorum(local-&gt;cont.lease.locked_nodes, this, NULL)) {</div><div class='add'>+        local-&gt;op_ret = -1;</div><div class='add'>+        local-&gt;op_errno = afr_final_errno(local, priv);</div><div class='add'>+</div><div class='add'>+        afr_lease_unlock(frame, this);</div><div class='add'>+    } else {</div><div class='add'>+        if (local-&gt;op_ret &lt; 0)</div><div class='add'>+            local-&gt;op_errno = afr_final_errno(local, priv);</div><div class='add'>+        AFR_STACK_UNWIND(lease, frame, local-&gt;op_ret, local-&gt;op_errno,</div><div class='add'>+                         &amp;local-&gt;cont.lease.ret_lease, NULL);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='add'>+int</div><div class='add'>+afr_lease(call_frame_t *frame, xlator_t *this, loc_t *loc,</div><div class='add'>+          struct gf_lease *lease, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-	afr_local_t *local = NULL;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    int32_t op_errno = ENOMEM;</div><div class='ctx'> </div><div class='del'>-	int call_count = -1;</div><div class='add'>+    priv = this-&gt;private;</div><div class='ctx'> </div><div class='del'>-	local = frame-&gt;local;</div><div class='add'>+    local = AFR_FRAME_INIT(frame, op_errno);</div><div class='add'>+    if (!local)</div><div class='add'>+        goto out;</div><div class='ctx'> </div><div class='del'>-	LOCK (&amp;frame-&gt;lock);</div><div class='del'>-	{</div><div class='del'>-		if (op_ret == 0)</div><div class='del'>-			local-&gt;op_ret = 0;</div><div class='add'>+    local-&gt;op = GF_FOP_LEASE;</div><div class='add'>+    local-&gt;cont.lease.locked_nodes = GF_CALLOC(</div><div class='add'>+        priv-&gt;child_count, sizeof(*local-&gt;cont.lease.locked_nodes),</div><div class='add'>+        gf_afr_mt_char);</div><div class='ctx'> </div><div class='del'>-		local-&gt;op_errno = op_errno;</div><div class='del'>-	}</div><div class='del'>-	UNLOCK (&amp;frame-&gt;lock);</div><div class='add'>+    if (!local-&gt;cont.lease.locked_nodes) {</div><div class='add'>+        op_errno = ENOMEM;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	call_count = afr_frame_return (frame);</div><div class='add'>+    loc_copy(&amp;local-&gt;loc, loc);</div><div class='add'>+    local-&gt;cont.lease.user_lease = *lease;</div><div class='add'>+    local-&gt;cont.lease.ret_lease = *lease;</div><div class='ctx'> </div><div class='del'>-	if (call_count == 0)</div><div class='del'>-		AFR_STACK_UNWIND (finodelk, frame, local-&gt;op_ret,</div><div class='del'>-                                  local-&gt;op_errno);</div><div class='add'>+    STACK_WIND_COOKIE(frame, afr_lease_cbk, (void *)(long)0, priv-&gt;children[0],</div><div class='add'>+                      priv-&gt;children[0]-&gt;fops-&gt;lease, loc, lease, xdata);</div><div class='ctx'> </div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='add'>+    return 0;</div><div class='add'>+out:</div><div class='add'>+    AFR_STACK_UNWIND(lease, frame, -1, op_errno, NULL, NULL);</div><div class='ctx'> </div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-int32_t</div><div class='del'>-afr_finodelk (call_frame_t *frame, xlator_t *this,</div><div class='del'>-              const char *volume, fd_t *fd, int32_t cmd, struct flock *flock)</div><div class='add'>+int</div><div class='add'>+afr_ipc_cbk(call_frame_t *frame, void *cookie, xlator_t *this, int32_t op_ret,</div><div class='add'>+            int32_t op_errno, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-	afr_private_t *priv = NULL;</div><div class='del'>-	afr_local_t *local  = NULL;</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    int child_index = (long)cookie;</div><div class='add'>+    int call_count = 0;</div><div class='add'>+    gf_boolean_t failed = _gf_false;</div><div class='add'>+    gf_boolean_t succeeded = _gf_false;</div><div class='add'>+    int i = 0;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    local-&gt;replies[child_index].valid = 1;</div><div class='add'>+    local-&gt;replies[child_index].op_ret = op_ret;</div><div class='add'>+    local-&gt;replies[child_index].op_errno = op_errno;</div><div class='add'>+    if (xdata)</div><div class='add'>+        local-&gt;replies[child_index].xdata = dict_ref(xdata);</div><div class='add'>+</div><div class='add'>+    call_count = afr_frame_return(frame);</div><div class='add'>+    if (call_count)</div><div class='add'>+        goto out;</div><div class='add'>+    /* If any of the subvolumes failed with other than ENOTCONN</div><div class='add'>+     * return error else return success unless all the subvolumes</div><div class='add'>+     * failed.</div><div class='add'>+     * TODO: In case of failure, we need to unregister the xattrs</div><div class='add'>+     * from the other subvolumes where it succeeded (once upcall</div><div class='add'>+     * fixes the Bz-1371622)*/</div><div class='add'>+    for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+        if (!local-&gt;replies[i].valid)</div><div class='add'>+            continue;</div><div class='add'>+        if (local-&gt;replies[i].op_ret &lt; 0 &amp;&amp;</div><div class='add'>+            local-&gt;replies[i].op_errno != ENOTCONN) {</div><div class='add'>+            local-&gt;op_ret = local-&gt;replies[i].op_ret;</div><div class='add'>+            local-&gt;op_errno = local-&gt;replies[i].op_errno;</div><div class='add'>+            if (local-&gt;xdata_rsp)</div><div class='add'>+                dict_unref(local-&gt;xdata_rsp);</div><div class='add'>+            local-&gt;xdata_rsp = NULL;</div><div class='add'>+            if (local-&gt;replies[i].xdata) {</div><div class='add'>+                local-&gt;xdata_rsp = dict_ref(local-&gt;replies[i].xdata);</div><div class='add'>+            }</div><div class='add'>+            failed = _gf_true;</div><div class='add'>+            break;</div><div class='add'>+        }</div><div class='add'>+        if (local-&gt;replies[i].op_ret == 0) {</div><div class='add'>+            succeeded = _gf_true;</div><div class='add'>+            local-&gt;op_ret = 0;</div><div class='add'>+            local-&gt;op_errno = 0;</div><div class='add'>+            if (!local-&gt;xdata_rsp &amp;&amp; local-&gt;replies[i].xdata) {</div><div class='add'>+                local-&gt;xdata_rsp = dict_ref(local-&gt;replies[i].xdata);</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	int ret = -1;</div><div class='add'>+    if (!succeeded &amp;&amp; !failed) {</div><div class='add'>+        local-&gt;op_ret = -1;</div><div class='add'>+        local-&gt;op_errno = ENOTCONN;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	int i = 0;</div><div class='del'>-	int32_t call_count = 0;</div><div class='del'>-	int32_t op_ret   = -1;</div><div class='del'>-	int32_t op_errno = 0;</div><div class='add'>+    AFR_STACK_UNWIND(ipc, frame, local-&gt;op_ret, local-&gt;op_errno,</div><div class='add'>+                     local-&gt;xdata_rsp);</div><div class='ctx'> </div><div class='del'>-	VALIDATE_OR_GOTO (frame, out);</div><div class='del'>-	VALIDATE_OR_GOTO (this, out);</div><div class='del'>-	VALIDATE_OR_GOTO (this-&gt;private, out);</div><div class='add'>+out:</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	priv = this-&gt;private;</div><div class='add'>+int</div><div class='add'>+afr_ipc(call_frame_t *frame, xlator_t *this, int32_t op, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    int32_t op_errno = -1;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    int i = 0;</div><div class='add'>+    int call_cnt = -1;</div><div class='ctx'> </div><div class='del'>-	ALLOC_OR_GOTO (local, afr_local_t, out);</div><div class='add'>+    VALIDATE_OR_GOTO(frame, err);</div><div class='add'>+    VALIDATE_OR_GOTO(this, err);</div><div class='ctx'> </div><div class='del'>-	ret = AFR_LOCAL_INIT (local, priv);</div><div class='del'>-	if (ret &lt; 0) {</div><div class='del'>-		op_errno = -ret;</div><div class='del'>-		goto out;</div><div class='del'>-	}</div><div class='add'>+    if (op != GF_IPC_TARGET_UPCALL)</div><div class='add'>+        goto wind_default;</div><div class='ctx'> </div><div class='del'>-	call_count = local-&gt;call_count;</div><div class='del'>-	frame-&gt;local = local;</div><div class='add'>+    VALIDATE_OR_GOTO(this-&gt;private, err);</div><div class='add'>+    priv = this-&gt;private;</div><div class='ctx'> </div><div class='del'>-	for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='del'>-		if (local-&gt;child_up[i]) {</div><div class='del'>-			STACK_WIND (frame, afr_finodelk_cbk,</div><div class='del'>-				    priv-&gt;children[i],</div><div class='del'>-				    priv-&gt;children[i]-&gt;fops-&gt;finodelk,</div><div class='del'>-				    volume, fd, cmd, flock);</div><div class='add'>+    local = AFR_FRAME_INIT(frame, op_errno);</div><div class='add'>+    if (!local)</div><div class='add'>+        goto err;</div><div class='ctx'> </div><div class='del'>-			if (!--call_count)</div><div class='del'>-				break;</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='add'>+    call_cnt = local-&gt;call_count;</div><div class='ctx'> </div><div class='del'>-	op_ret = 0;</div><div class='del'>-out:</div><div class='del'>-	if (op_ret == -1) {</div><div class='del'>-		AFR_STACK_UNWIND (finodelk, frame, op_ret, op_errno);</div><div class='del'>-	}</div><div class='del'>-	return 0;</div><div class='add'>+    if (xdata) {</div><div class='add'>+        for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+            if (dict_set_int8(xdata, priv-&gt;pending_key[i], 0) &lt; 0)</div><div class='add'>+                goto err;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+        if (!local-&gt;child_up[i])</div><div class='add'>+            continue;</div><div class='add'>+</div><div class='add'>+        STACK_WIND_COOKIE(frame, afr_ipc_cbk, (void *)(long)i,</div><div class='add'>+                          priv-&gt;children[i], priv-&gt;children[i]-&gt;fops-&gt;ipc, op,</div><div class='add'>+                          xdata);</div><div class='add'>+        if (!--call_cnt)</div><div class='add'>+            break;</div><div class='add'>+    }</div><div class='add'>+    return 0;</div><div class='add'>+</div><div class='add'>+err:</div><div class='add'>+    if (op_errno == -1)</div><div class='add'>+        op_errno = errno;</div><div class='add'>+    AFR_STACK_UNWIND(ipc, frame, -1, op_errno, NULL);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+</div><div class='add'>+wind_default:</div><div class='add'>+    STACK_WIND(frame, default_ipc_cbk, FIRST_CHILD(this),</div><div class='add'>+               FIRST_CHILD(this)-&gt;fops-&gt;ipc, op, xdata);</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+int</div><div class='add'>+afr_forget(xlator_t *this, inode_t *inode)</div><div class='add'>+{</div><div class='add'>+    uint64_t ctx_int = 0;</div><div class='add'>+    afr_inode_ctx_t *ctx = NULL;</div><div class='ctx'> </div><div class='del'>-int32_t</div><div class='del'>-afr_entrylk_cbk (call_frame_t *frame, void *cookie,</div><div class='del'>-		 xlator_t *this, int32_t op_ret, int32_t op_errno)</div><div class='add'>+    afr_spb_choice_timeout_cancel(this, inode);</div><div class='add'>+    inode_ctx_del(inode, this, &amp;ctx_int);</div><div class='add'>+    if (!ctx_int)</div><div class='add'>+        return 0;</div><div class='ctx'> </div><div class='add'>+    ctx = (afr_inode_ctx_t *)(uintptr_t)ctx_int;</div><div class='add'>+    afr_inode_ctx_destroy(ctx);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+afr_priv_dump(xlator_t *this)</div><div class='ctx'> {</div><div class='del'>-	afr_local_t *local = NULL;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    char key_prefix[GF_DUMP_MAX_BUF_LEN];</div><div class='add'>+    char key[GF_DUMP_MAX_BUF_LEN];</div><div class='add'>+    int i = 0;</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(this);</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(priv);</div><div class='add'>+    snprintf(key_prefix, GF_DUMP_MAX_BUF_LEN, "%s.%s", this-&gt;type, this-&gt;name);</div><div class='add'>+    gf_proc_dump_add_section("%s", key_prefix);</div><div class='add'>+    gf_proc_dump_write("child_count", "%u", priv-&gt;child_count);</div><div class='add'>+    for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+        sprintf(key, "child_up[%d]", i);</div><div class='add'>+        gf_proc_dump_write(key, "%d", priv-&gt;child_up[i]);</div><div class='add'>+        sprintf(key, "pending_key[%d]", i);</div><div class='add'>+        gf_proc_dump_write(key, "%s", priv-&gt;pending_key[i]);</div><div class='add'>+        sprintf(key, "pending_reads[%d]", i);</div><div class='add'>+        gf_proc_dump_write(key, "%" PRId64,</div><div class='add'>+                           GF_ATOMIC_GET(priv-&gt;pending_reads[i]));</div><div class='add'>+        sprintf(key, "child_latency[%d]", i);</div><div class='add'>+        gf_proc_dump_write(key, "%" PRId64, priv-&gt;child_latency[i]);</div><div class='add'>+        sprintf(key, "halo_child_up[%d]", i);</div><div class='add'>+        gf_proc_dump_write(key, "%d", priv-&gt;halo_child_up[i]);</div><div class='add'>+    }</div><div class='add'>+    gf_proc_dump_write("data_self_heal", "%d", priv-&gt;data_self_heal);</div><div class='add'>+    gf_proc_dump_write("metadata_self_heal", "%d", priv-&gt;metadata_self_heal);</div><div class='add'>+    gf_proc_dump_write("entry_self_heal", "%d", priv-&gt;entry_self_heal);</div><div class='add'>+    gf_proc_dump_write("read_child", "%d", priv-&gt;read_child);</div><div class='add'>+    gf_proc_dump_write("wait_count", "%u", priv-&gt;wait_count);</div><div class='add'>+    gf_proc_dump_write("heal-wait-queue-length", "%d", priv-&gt;heal_wait_qlen);</div><div class='add'>+    gf_proc_dump_write("heal-waiters", "%d", priv-&gt;heal_waiters);</div><div class='add'>+    gf_proc_dump_write("background-self-heal-count", "%d",</div><div class='add'>+                       priv-&gt;background_self_heal_count);</div><div class='add'>+    gf_proc_dump_write("healers", "%d", priv-&gt;healers);</div><div class='add'>+    gf_proc_dump_write("read-hash-mode", "%d", priv-&gt;hash_mode);</div><div class='add'>+    gf_proc_dump_write("use-anonymous-inode", "%d", priv-&gt;use_anon_inode);</div><div class='add'>+    if (priv-&gt;quorum_count == AFR_QUORUM_AUTO) {</div><div class='add'>+        gf_proc_dump_write("quorum-type", "auto");</div><div class='add'>+    } else if (priv-&gt;quorum_count == 0) {</div><div class='add'>+        gf_proc_dump_write("quorum-type", "none");</div><div class='add'>+    } else {</div><div class='add'>+        gf_proc_dump_write("quorum-type", "fixed");</div><div class='add'>+        gf_proc_dump_write("quorum-count", "%d", priv-&gt;quorum_count);</div><div class='add'>+    }</div><div class='add'>+    gf_proc_dump_write("up", "%u", afr_has_quorum(priv-&gt;child_up, this, NULL));</div><div class='add'>+    if (priv-&gt;thin_arbiter_count) {</div><div class='add'>+        gf_proc_dump_write("ta_child_up", "%d", priv-&gt;ta_child_up);</div><div class='add'>+        gf_proc_dump_write("ta_bad_child_index", "%d",</div><div class='add'>+                           priv-&gt;ta_bad_child_index);</div><div class='add'>+        gf_proc_dump_write("ta_notify_dom_lock_offset", "%" PRId64,</div><div class='add'>+                           priv-&gt;ta_notify_dom_lock_offset);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/**</div><div class='add'>+ * find_child_index - find the child's index in the array of subvolumes</div><div class='add'>+ * @this: AFR</div><div class='add'>+ * @child: child</div><div class='add'>+ */</div><div class='ctx'> </div><div class='del'>-	int call_count = -1;</div><div class='add'>+static int</div><div class='add'>+afr_find_child_index(xlator_t *this, xlator_t *child)</div><div class='add'>+{</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    int child_count = -1;</div><div class='add'>+    int i = -1;</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+    child_count = priv-&gt;child_count;</div><div class='add'>+    if (priv-&gt;thin_arbiter_count) {</div><div class='add'>+        child_count++;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; child_count; i++) {</div><div class='add'>+        if ((xlator_t *)child == priv-&gt;children[i])</div><div class='add'>+            break;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return i;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	local = frame-&gt;local;</div><div class='add'>+int</div><div class='add'>+__afr_get_up_children_count(afr_private_t *priv)</div><div class='add'>+{</div><div class='add'>+    int up_children = 0;</div><div class='add'>+    int i = 0;</div><div class='ctx'> </div><div class='del'>-	LOCK (&amp;frame-&gt;lock);</div><div class='del'>-	{</div><div class='del'>-		if (op_ret == 0)</div><div class='del'>-			local-&gt;op_ret = 0;</div><div class='add'>+    for (i = 0; i &lt; priv-&gt;child_count; i++)</div><div class='add'>+        if (priv-&gt;child_up[i] == 1)</div><div class='add'>+            up_children++;</div><div class='ctx'> </div><div class='del'>-		local-&gt;op_errno = op_errno;</div><div class='del'>-	}</div><div class='del'>-	UNLOCK (&amp;frame-&gt;lock);</div><div class='add'>+    return up_children;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	call_count = afr_frame_return (frame);</div><div class='add'>+static int</div><div class='add'>+__get_heard_from_all_status(xlator_t *this)</div><div class='add'>+{</div><div class='add'>+    afr_private_t *priv = this-&gt;private;</div><div class='add'>+    int i;</div><div class='ctx'> </div><div class='del'>-	if (call_count == 0)</div><div class='del'>-		AFR_STACK_UNWIND (entrylk, frame, local-&gt;op_ret,</div><div class='del'>-                                  local-&gt;op_errno);</div><div class='add'>+    for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+        if (!priv-&gt;last_event[i]) {</div><div class='add'>+            return 0;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    if (priv-&gt;thin_arbiter_count &amp;&amp; !priv-&gt;ta_child_up) {</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='add'>+    return 1;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	return 0;</div><div class='add'>+glusterfs_event_t</div><div class='add'>+__afr_transform_event_from_state(xlator_t *this)</div><div class='add'>+{</div><div class='add'>+    int i = 0;</div><div class='add'>+    int up_children = 0;</div><div class='add'>+    afr_private_t *priv = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    if (__get_heard_from_all_status(this))</div><div class='add'>+        /* have_heard_from_all. Let afr_notify() do the propagation. */</div><div class='add'>+        return GF_EVENT_MAXVAL;</div><div class='add'>+</div><div class='add'>+    up_children = __afr_get_up_children_count(priv);</div><div class='add'>+    /* Treat the children with pending notification, as having sent a</div><div class='add'>+     * GF_EVENT_CHILD_DOWN. i.e. set the event as GF_EVENT_SOME_DESCENDENT_DOWN,</div><div class='add'>+     * as done in afr_notify() */</div><div class='add'>+    for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+        if (priv-&gt;last_event[i])</div><div class='add'>+            continue;</div><div class='add'>+        priv-&gt;last_event[i] = GF_EVENT_SOME_DESCENDENT_DOWN;</div><div class='add'>+        priv-&gt;child_up[i] = 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (up_children)</div><div class='add'>+        /* We received at least one child up */</div><div class='add'>+        return GF_EVENT_CHILD_UP;</div><div class='add'>+    else</div><div class='add'>+        return GF_EVENT_CHILD_DOWN;</div><div class='add'>+</div><div class='add'>+    return GF_EVENT_MAXVAL;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+static void</div><div class='add'>+afr_notify_cbk(void *data)</div><div class='add'>+{</div><div class='add'>+    xlator_t *this = data;</div><div class='add'>+    afr_private_t *priv = this-&gt;private;</div><div class='add'>+    glusterfs_event_t event = GF_EVENT_MAXVAL;</div><div class='add'>+    gf_boolean_t propagate = _gf_false;</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;priv-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        if (!priv-&gt;timer) {</div><div class='add'>+            /*</div><div class='add'>+             * Either child_up/child_down is already sent to parent.</div><div class='add'>+             * This is a spurious wake up.</div><div class='add'>+             */</div><div class='add'>+            goto unlock;</div><div class='add'>+        }</div><div class='add'>+        priv-&gt;timer = NULL;</div><div class='add'>+        event = __afr_transform_event_from_state(this);</div><div class='add'>+        if (event != GF_EVENT_MAXVAL)</div><div class='add'>+            propagate = _gf_true;</div><div class='add'>+    }</div><div class='add'>+unlock:</div><div class='add'>+    UNLOCK(&amp;priv-&gt;lock);</div><div class='add'>+    if (propagate)</div><div class='add'>+        default_notify(this, event, NULL);</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-int32_t</div><div class='del'>-afr_entrylk (call_frame_t *frame, xlator_t *this,</div><div class='del'>-             const char *volume, loc_t *loc,</div><div class='del'>-	     const char *basename, entrylk_cmd cmd, entrylk_type type)</div><div class='add'>+static void</div><div class='add'>+__afr_launch_notify_timer(xlator_t *this, afr_private_t *priv)</div><div class='ctx'> {</div><div class='del'>-	afr_private_t *priv = NULL;</div><div class='del'>-	afr_local_t *local  = NULL;</div><div class='add'>+    struct timespec delay = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    gf_msg_debug(this-&gt;name, 0, "Initiating child-down timer");</div><div class='add'>+    delay.tv_sec = 10;</div><div class='add'>+    delay.tv_nsec = 0;</div><div class='add'>+    priv-&gt;timer = gf_timer_call_after(this-&gt;ctx, delay, afr_notify_cbk, this);</div><div class='add'>+    if (priv-&gt;timer == NULL) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_ERROR, 0, AFR_MSG_TIMER_CREATE_FAIL,</div><div class='add'>+               "Cannot create timer for delayed initialization");</div><div class='add'>+    }</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	int ret = -1;</div><div class='add'>+static int</div><div class='add'>+find_best_down_child(xlator_t *this)</div><div class='add'>+{</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    int i = -1;</div><div class='add'>+    int32_t best_child = -1;</div><div class='add'>+    int64_t best_latency = INT64_MAX;</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+        if (!priv-&gt;child_up[i] &amp;&amp; priv-&gt;child_latency[i] &gt;= 0 &amp;&amp;</div><div class='add'>+            priv-&gt;child_latency[i] &lt; best_latency) {</div><div class='add'>+            best_child = i;</div><div class='add'>+            best_latency = priv-&gt;child_latency[i];</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    if (best_child &gt;= 0) {</div><div class='add'>+        gf_msg_debug(this-&gt;name, 0,</div><div class='add'>+                     "Found best down child (%d) @ %" PRId64 " ms latency",</div><div class='add'>+                     best_child, best_latency);</div><div class='add'>+    }</div><div class='add'>+    return best_child;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	int i = 0;</div><div class='del'>-	int32_t call_count = 0;</div><div class='del'>-	int32_t op_ret   = -1;</div><div class='del'>-	int32_t op_errno = 0;</div><div class='add'>+int</div><div class='add'>+find_worst_up_child(xlator_t *this)</div><div class='add'>+{</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    int i = -1;</div><div class='add'>+    int32_t worst_child = -1;</div><div class='add'>+    int64_t worst_latency = INT64_MIN;</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+        if (priv-&gt;child_up[i] &amp;&amp; priv-&gt;child_latency[i] &gt;= 0 &amp;&amp;</div><div class='add'>+            priv-&gt;child_latency[i] &gt; worst_latency) {</div><div class='add'>+            worst_child = i;</div><div class='add'>+            worst_latency = priv-&gt;child_latency[i];</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    if (worst_child &gt;= 0) {</div><div class='add'>+        gf_msg_debug(this-&gt;name, 0,</div><div class='add'>+                     "Found worst up child (%d) @ %" PRId64 " ms latency",</div><div class='add'>+                     worst_child, worst_latency);</div><div class='add'>+    }</div><div class='add'>+    return worst_child;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	VALIDATE_OR_GOTO (frame, out);</div><div class='del'>-	VALIDATE_OR_GOTO (this, out);</div><div class='del'>-	VALIDATE_OR_GOTO (this-&gt;private, out);</div><div class='add'>+void</div><div class='add'>+__afr_handle_ping_event(xlator_t *this, xlator_t *child_xlator, const int idx,</div><div class='add'>+                        int64_t halo_max_latency_msec, int32_t *event,</div><div class='add'>+                        int64_t child_latency_msec)</div><div class='add'>+{</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    int up_children = 0;</div><div class='ctx'> </div><div class='del'>-	priv = this-&gt;private;</div><div class='add'>+    priv = this-&gt;private;</div><div class='ctx'> </div><div class='del'>-	ALLOC_OR_GOTO (local, afr_local_t, out);</div><div class='add'>+    priv-&gt;child_latency[idx] = child_latency_msec;</div><div class='add'>+    gf_msg_debug(child_xlator-&gt;name, 0, "Client ping @ %" PRId64 " ms",</div><div class='add'>+                 child_latency_msec);</div><div class='add'>+    if (priv-&gt;shd.iamshd)</div><div class='add'>+        return;</div><div class='ctx'> </div><div class='del'>-	ret = AFR_LOCAL_INIT (local, priv);</div><div class='del'>-	if (ret &lt; 0) {</div><div class='del'>-		op_errno = -ret;</div><div class='del'>-		goto out;</div><div class='del'>-	}</div><div class='add'>+    up_children = __afr_get_up_children_count(priv);</div><div class='ctx'> </div><div class='del'>-	call_count = local-&gt;call_count;</div><div class='del'>-	frame-&gt;local = local;</div><div class='add'>+    if (child_latency_msec &gt; halo_max_latency_msec &amp;&amp;</div><div class='add'>+        priv-&gt;child_up[idx] == 1 &amp;&amp; up_children &gt; priv-&gt;halo_min_replicas) {</div><div class='add'>+        if ((up_children - 1) &lt; priv-&gt;halo_min_replicas) {</div><div class='add'>+            gf_log(child_xlator-&gt;name, GF_LOG_INFO,</div><div class='add'>+                   "Overriding halo threshold, "</div><div class='add'>+                   "min replicas: %d",</div><div class='add'>+                   priv-&gt;halo_min_replicas);</div><div class='add'>+        } else {</div><div class='add'>+            gf_log(child_xlator-&gt;name, GF_LOG_INFO,</div><div class='add'>+                   "Child latency (%" PRId64</div><div class='add'>+                   " ms) "</div><div class='add'>+                   "exceeds halo threshold (%" PRId64</div><div class='add'>+                   "), "</div><div class='add'>+                   "marking child down.",</div><div class='add'>+                   child_latency_msec, halo_max_latency_msec);</div><div class='add'>+            if (priv-&gt;halo_child_up[idx]) {</div><div class='add'>+                *event = GF_EVENT_CHILD_DOWN;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+    } else if (child_latency_msec &lt; halo_max_latency_msec &amp;&amp;</div><div class='add'>+               priv-&gt;child_up[idx] == 0) {</div><div class='add'>+        if (up_children &lt; priv-&gt;halo_max_replicas) {</div><div class='add'>+            gf_log(child_xlator-&gt;name, GF_LOG_INFO,</div><div class='add'>+                   "Child latency (%" PRId64</div><div class='add'>+                   " ms) "</div><div class='add'>+                   "below halo threshold (%" PRId64</div><div class='add'>+                   "), "</div><div class='add'>+                   "marking child up.",</div><div class='add'>+                   child_latency_msec, halo_max_latency_msec);</div><div class='add'>+            if (priv-&gt;halo_child_up[idx]) {</div><div class='add'>+                *event = GF_EVENT_CHILD_UP;</div><div class='add'>+            }</div><div class='add'>+        } else {</div><div class='add'>+            gf_log(child_xlator-&gt;name, GF_LOG_INFO,</div><div class='add'>+                   "Not marking child %d up, "</div><div class='add'>+                   "max replicas (%d) reached.",</div><div class='add'>+                   idx, priv-&gt;halo_max_replicas);</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='del'>-		if (local-&gt;child_up[i]) {</div><div class='del'>-			STACK_WIND (frame, afr_entrylk_cbk,</div><div class='del'>-				    priv-&gt;children[i],</div><div class='del'>-				    priv-&gt;children[i]-&gt;fops-&gt;entrylk,</div><div class='del'>-				    volume, loc, basename, cmd, type);</div><div class='add'>+static int64_t</div><div class='add'>+afr_get_halo_latency(xlator_t *this)</div><div class='add'>+{</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    int64_t halo_max_latency_msec = 0;</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    if (priv-&gt;shd.iamshd) {</div><div class='add'>+        halo_max_latency_msec = priv-&gt;shd.halo_max_latency_msec;</div><div class='add'>+    } else if (priv-&gt;nfsd.iamnfsd) {</div><div class='add'>+        halo_max_latency_msec = priv-&gt;nfsd.halo_max_latency_msec;</div><div class='add'>+    } else {</div><div class='add'>+        halo_max_latency_msec = priv-&gt;halo_max_latency_msec;</div><div class='add'>+    }</div><div class='add'>+    gf_msg_debug(this-&gt;name, 0, "Using halo latency %" PRId64,</div><div class='add'>+                 halo_max_latency_msec);</div><div class='add'>+    return halo_max_latency_msec;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-			if (!--call_count)</div><div class='del'>-				break;</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='add'>+void</div><div class='add'>+__afr_handle_child_up_event(xlator_t *this, xlator_t *child_xlator,</div><div class='add'>+                            const int idx, int64_t child_latency_msec,</div><div class='add'>+                            int32_t *event, int32_t *call_psh,</div><div class='add'>+                            int32_t *up_child)</div><div class='add'>+{</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    int up_children = 0;</div><div class='add'>+    int worst_up_child = -1;</div><div class='add'>+    int64_t halo_max_latency_msec = afr_get_halo_latency(this);</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    /*</div><div class='add'>+     * This only really counts if the child was never up</div><div class='add'>+     * (value = -1) or had been down (value = 0).  See</div><div class='add'>+     * comment at GF_EVENT_CHILD_DOWN for a more detailed</div><div class='add'>+     * explanation.</div><div class='add'>+     */</div><div class='add'>+    if (priv-&gt;child_up[idx] != 1) {</div><div class='add'>+        priv-&gt;event_generation++;</div><div class='add'>+    }</div><div class='add'>+    priv-&gt;child_up[idx] = 1;</div><div class='add'>+</div><div class='add'>+    *call_psh = 1;</div><div class='add'>+    *up_child = idx;</div><div class='add'>+    up_children = __afr_get_up_children_count(priv);</div><div class='add'>+    /*</div><div class='add'>+     * If this is an _actual_ CHILD_UP event, we</div><div class='add'>+     * want to set the child_latency to MAX to indicate</div><div class='add'>+     * the child needs ping data to be available before doing child-up</div><div class='add'>+     */</div><div class='add'>+    if (!priv-&gt;halo_enabled)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    if (child_latency_msec &lt; 0) {</div><div class='add'>+        /*set to INT64_MAX-1 so that it is found for best_down_child*/</div><div class='add'>+        priv-&gt;halo_child_up[idx] = 1;</div><div class='add'>+        if (priv-&gt;child_latency[idx] &lt; 0) {</div><div class='add'>+            priv-&gt;child_latency[idx] = AFR_HALO_MAX_LATENCY;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /*</div><div class='add'>+     * Handle the edge case where we exceed</div><div class='add'>+     * halo_min_replicas and we've got a child which is</div><div class='add'>+     * marked up as it was helping to satisfy the</div><div class='add'>+     * halo_min_replicas even though it's latency exceeds</div><div class='add'>+     * halo_max_latency_msec.</div><div class='add'>+     */</div><div class='add'>+    if (up_children &gt; priv-&gt;halo_min_replicas) {</div><div class='add'>+        worst_up_child = find_worst_up_child(this);</div><div class='add'>+        if (worst_up_child &gt;= 0 &amp;&amp;</div><div class='add'>+            priv-&gt;child_latency[worst_up_child] &gt; halo_max_latency_msec) {</div><div class='add'>+            gf_msg_debug(this-&gt;name, 0,</div><div class='add'>+                         "Marking child %d down, "</div><div class='add'>+                         "doesn't meet halo threshold (%" PRId64</div><div class='add'>+                         "), and &gt; "</div><div class='add'>+                         "halo_min_replicas (%d)",</div><div class='add'>+                         worst_up_child, halo_max_latency_msec,</div><div class='add'>+                         priv-&gt;halo_min_replicas);</div><div class='add'>+            priv-&gt;child_up[worst_up_child] = 0;</div><div class='add'>+            up_children--;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	op_ret = 0;</div><div class='add'>+    if (up_children &gt; priv-&gt;halo_max_replicas &amp;&amp; !priv-&gt;shd.iamshd) {</div><div class='add'>+        worst_up_child = find_worst_up_child(this);</div><div class='add'>+        if (worst_up_child &lt; 0) {</div><div class='add'>+            worst_up_child = idx;</div><div class='add'>+        }</div><div class='add'>+        priv-&gt;child_up[worst_up_child] = 0;</div><div class='add'>+        up_children--;</div><div class='add'>+        gf_msg_debug(this-&gt;name, 0,</div><div class='add'>+                     "Marking child %d down, "</div><div class='add'>+                     "up_children (%d) &gt; halo_max_replicas (%d)",</div><div class='add'>+                     worst_up_child, up_children, priv-&gt;halo_max_replicas);</div><div class='add'>+    }</div><div class='ctx'> out:</div><div class='del'>-	if (op_ret == -1) {</div><div class='del'>-		AFR_STACK_UNWIND (entrylk, frame, op_ret, op_errno);</div><div class='del'>-	}</div><div class='del'>-	return 0;</div><div class='add'>+    if (up_children == 1) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_INFO, 0, AFR_MSG_SUBVOL_UP,</div><div class='add'>+               "Subvolume '%s' came back up; "</div><div class='add'>+               "going online.",</div><div class='add'>+               child_xlator-&gt;name);</div><div class='add'>+        gf_event(EVENT_AFR_SUBVOL_UP, "client-pid=%d; subvol=%s",</div><div class='add'>+                 this-&gt;ctx-&gt;cmd_args.client_pid, this-&gt;name);</div><div class='add'>+    } else {</div><div class='add'>+        *event = GF_EVENT_SOME_DESCENDENT_UP;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    priv-&gt;last_event[idx] = *event;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-afr_fentrylk_cbk (call_frame_t *frame, void *cookie,</div><div class='del'>-		 xlator_t *this, int32_t op_ret, int32_t op_errno)</div><div class='del'>-</div><div class='add'>+void</div><div class='add'>+__afr_handle_child_down_event(xlator_t *this, xlator_t *child_xlator, int idx,</div><div class='add'>+                              int64_t child_latency_msec, int32_t *event,</div><div class='add'>+                              int32_t *call_psh, int32_t *up_child)</div><div class='ctx'> {</div><div class='del'>-	afr_local_t *local = NULL;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    int i = 0;</div><div class='add'>+    int up_children = 0;</div><div class='add'>+    int down_children = 0;</div><div class='add'>+    int best_down_child = -1;</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    /*</div><div class='add'>+     * If a brick is down when we start, we'll get a</div><div class='add'>+     * CHILD_DOWN to indicate its initial state.  There</div><div class='add'>+     * was never a CHILD_UP in this case, so if we</div><div class='add'>+     * increment "down_count" the difference between than</div><div class='add'>+     * and "up_count" will no longer be the number of</div><div class='add'>+     * children that are currently up.  This has serious</div><div class='add'>+     * implications e.g. for quorum enforcement, so we</div><div class='add'>+     * don't increment these values unless the event</div><div class='add'>+     * represents an actual state transition between "up"</div><div class='add'>+     * (value = 1) and anything else.</div><div class='add'>+     */</div><div class='add'>+    if (priv-&gt;child_up[idx] == 1) {</div><div class='add'>+        priv-&gt;event_generation++;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /*</div><div class='add'>+     * If this is an _actual_ CHILD_DOWN event, we</div><div class='add'>+     * want to set the child_latency to &lt; 0 to indicate</div><div class='add'>+     * the child is really disconnected.</div><div class='add'>+     */</div><div class='add'>+    if (child_latency_msec &lt; 0) {</div><div class='add'>+        priv-&gt;child_latency[idx] = child_latency_msec;</div><div class='add'>+        priv-&gt;halo_child_up[idx] = 0;</div><div class='add'>+    }</div><div class='add'>+    priv-&gt;child_up[idx] = 0;</div><div class='add'>+</div><div class='add'>+    up_children = __afr_get_up_children_count(priv);</div><div class='add'>+    /*</div><div class='add'>+     * Handle the edge case where we need to find the</div><div class='add'>+     * next best child (to mark up) as marking this child</div><div class='add'>+     * down would cause us to fall below halo_min_replicas.</div><div class='add'>+     * We will also force the SHD to heal this child _now_</div><div class='add'>+     * as we want it to be up to date if we are going to</div><div class='add'>+     * begin using it synchronously.</div><div class='add'>+     */</div><div class='add'>+    if (priv-&gt;halo_enabled &amp;&amp; up_children &lt; priv-&gt;halo_min_replicas) {</div><div class='add'>+        best_down_child = find_best_down_child(this);</div><div class='add'>+        if (best_down_child &gt;= 0) {</div><div class='add'>+            gf_msg_debug(this-&gt;name, 0,</div><div class='add'>+                         "Swapping out child %d for "</div><div class='add'>+                         "child %d to satisfy halo_min_replicas (%d).",</div><div class='add'>+                         idx, best_down_child, priv-&gt;halo_min_replicas);</div><div class='add'>+            priv-&gt;child_up[best_down_child] = 1;</div><div class='add'>+            *call_psh = 1;</div><div class='add'>+            *up_child = best_down_child;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    for (i = 0; i &lt; priv-&gt;child_count; i++)</div><div class='add'>+        if (priv-&gt;child_up[i] == 0)</div><div class='add'>+            down_children++;</div><div class='add'>+    if (down_children == priv-&gt;child_count) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_ERROR, 0, AFR_MSG_SUBVOLS_DOWN,</div><div class='add'>+               "All subvolumes are down. Going "</div><div class='add'>+               "offline until at least one of them "</div><div class='add'>+               "comes back up.");</div><div class='add'>+        gf_event(EVENT_AFR_SUBVOLS_DOWN, "client-pid=%d; subvol=%s",</div><div class='add'>+                 this-&gt;ctx-&gt;cmd_args.client_pid, this-&gt;name);</div><div class='add'>+    } else {</div><div class='add'>+        *event = GF_EVENT_SOME_DESCENDENT_DOWN;</div><div class='add'>+    }</div><div class='add'>+    priv-&gt;last_event[idx] = *event;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	int call_count = -1;</div><div class='add'>+void</div><div class='add'>+afr_ta_lock_release_synctask(xlator_t *this)</div><div class='add'>+{</div><div class='add'>+    call_frame_t *ta_frame = NULL;</div><div class='add'>+    int ret = 0;</div><div class='ctx'> </div><div class='del'>-	local = frame-&gt;local;</div><div class='add'>+    ta_frame = afr_ta_frame_create(this);</div><div class='add'>+    if (!ta_frame) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_ERROR, ENOMEM, AFR_MSG_THIN_ARB,</div><div class='add'>+               "Failed to create ta_frame");</div><div class='add'>+        return;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = synctask_new(this-&gt;ctx-&gt;env, afr_release_notify_lock_for_ta,</div><div class='add'>+                       afr_ta_lock_release_done, ta_frame, this);</div><div class='add'>+    if (ret) {</div><div class='add'>+        STACK_DESTROY(ta_frame-&gt;root);</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_ERROR, ENOMEM, AFR_MSG_THIN_ARB,</div><div class='add'>+               "Failed to release "</div><div class='add'>+               "AFR_TA_DOM_NOTIFY lock.");</div><div class='add'>+    }</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	LOCK (&amp;frame-&gt;lock);</div><div class='del'>-	{</div><div class='del'>-		if (op_ret == 0)</div><div class='del'>-			local-&gt;op_ret = 0;</div><div class='add'>+static void</div><div class='add'>+afr_handle_inodelk_contention(xlator_t *this, struct gf_upcall *upcall)</div><div class='add'>+{</div><div class='add'>+    struct gf_upcall_inodelk_contention *lc = NULL;</div><div class='add'>+    unsigned int inmem_count = 0;</div><div class='add'>+    unsigned int onwire_count = 0;</div><div class='add'>+    afr_private_t *priv = this-&gt;private;</div><div class='ctx'> </div><div class='del'>-		local-&gt;op_errno = op_errno;</div><div class='del'>-	}</div><div class='del'>-	UNLOCK (&amp;frame-&gt;lock);</div><div class='add'>+    lc = upcall-&gt;data;</div><div class='ctx'> </div><div class='del'>-	call_count = afr_frame_return (frame);</div><div class='add'>+    if (strcmp(lc-&gt;domain, AFR_TA_DOM_NOTIFY) != 0)</div><div class='add'>+        return;</div><div class='ctx'> </div><div class='del'>-	if (call_count == 0)</div><div class='del'>-		AFR_STACK_UNWIND (fentrylk, frame, local-&gt;op_ret,</div><div class='del'>-                                  local-&gt;op_errno);</div><div class='add'>+    if (priv-&gt;shd.iamshd) {</div><div class='add'>+        /* shd should ignore AFR_TA_DOM_NOTIFY release requests. */</div><div class='add'>+        return;</div><div class='add'>+    }</div><div class='add'>+    LOCK(&amp;priv-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        if (priv-&gt;release_ta_notify_dom_lock == _gf_true) {</div><div class='add'>+            /* Ignore multiple release requests from shds.*/</div><div class='add'>+            UNLOCK(&amp;priv-&gt;lock);</div><div class='add'>+            return;</div><div class='add'>+        }</div><div class='add'>+        priv-&gt;release_ta_notify_dom_lock = _gf_true;</div><div class='add'>+        inmem_count = priv-&gt;ta_in_mem_txn_count;</div><div class='add'>+        onwire_count = priv-&gt;ta_on_wire_txn_count;</div><div class='add'>+    }</div><div class='add'>+    UNLOCK(&amp;priv-&gt;lock);</div><div class='add'>+    if (inmem_count || onwire_count)</div><div class='add'>+        /* lock release will happen in txn code path after</div><div class='add'>+         * in-memory or on-wire txns are over.*/</div><div class='add'>+        return;</div><div class='ctx'> </div><div class='del'>-	return 0;</div><div class='add'>+    afr_ta_lock_release_synctask(this);</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+static void</div><div class='add'>+afr_handle_upcall_event(xlator_t *this, struct gf_upcall *upcall)</div><div class='add'>+{</div><div class='add'>+    struct gf_upcall_cache_invalidation *up_ci = NULL;</div><div class='add'>+    afr_private_t *priv = this-&gt;private;</div><div class='add'>+    inode_t *inode = NULL;</div><div class='add'>+    inode_table_t *itable = NULL;</div><div class='add'>+    int i = 0;</div><div class='add'>+</div><div class='add'>+    switch (upcall-&gt;event_type) {</div><div class='add'>+        case GF_UPCALL_INODELK_CONTENTION:</div><div class='add'>+            afr_handle_inodelk_contention(this, upcall);</div><div class='add'>+            break;</div><div class='add'>+        case GF_UPCALL_CACHE_INVALIDATION:</div><div class='add'>+            up_ci = (struct gf_upcall_cache_invalidation *)upcall-&gt;data;</div><div class='add'>+</div><div class='add'>+            /* Since md-cache will be aggressively filtering</div><div class='add'>+             * lookups, the stale read issue will be more</div><div class='add'>+             * pronounced. Hence when a pending xattr is set notify</div><div class='add'>+             * all the md-cache clients to invalidate the existing</div><div class='add'>+             * stat cache and send the lookup next time */</div><div class='add'>+            if (!up_ci-&gt;dict)</div><div class='add'>+                break;</div><div class='add'>+            for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+                if (!dict_get(up_ci-&gt;dict, priv-&gt;pending_key[i]))</div><div class='add'>+                    continue;</div><div class='add'>+                up_ci-&gt;flags |= UP_INVAL_ATTR;</div><div class='add'>+                itable = ((xlator_t *)this-&gt;graph-&gt;top)-&gt;itable;</div><div class='add'>+                /*Internal processes may not have itable for</div><div class='add'>+                 *top xlator*/</div><div class='add'>+                if (itable)</div><div class='add'>+                    inode = inode_find(itable, upcall-&gt;gfid);</div><div class='add'>+                if (inode)</div><div class='add'>+                    afr_inode_need_refresh_set(inode, this);</div><div class='add'>+                break;</div><div class='add'>+            }</div><div class='add'>+            break;</div><div class='add'>+        default:</div><div class='add'>+            break;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int32_t</div><div class='del'>-afr_fentrylk (call_frame_t *frame, xlator_t *this,</div><div class='del'>-              const char *volume, fd_t *fd,</div><div class='del'>-	      const char *basename, entrylk_cmd cmd, entrylk_type type)</div><div class='add'>+afr_notify(xlator_t *this, int32_t event, void *data, void *data2)</div><div class='ctx'> {</div><div class='del'>-	afr_private_t *priv = NULL;</div><div class='del'>-	afr_local_t *local  = NULL;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    xlator_t *child_xlator = NULL;</div><div class='add'>+    int i = -1;</div><div class='add'>+    int propagate = 0;</div><div class='add'>+    int had_heard_from_all = 0;</div><div class='add'>+    int have_heard_from_all = 0;</div><div class='add'>+    int idx = -1;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int call_psh = 0;</div><div class='add'>+    int up_child = -1;</div><div class='add'>+    dict_t *input = NULL;</div><div class='add'>+    dict_t *output = NULL;</div><div class='add'>+    gf_boolean_t had_quorum = _gf_false;</div><div class='add'>+    gf_boolean_t has_quorum = _gf_false;</div><div class='add'>+    int64_t halo_max_latency_msec = 0;</div><div class='add'>+    int64_t child_latency_msec = -1;</div><div class='add'>+</div><div class='add'>+    child_xlator = (xlator_t *)data;</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    if (!priv)</div><div class='add'>+        return 0;</div><div class='ctx'> </div><div class='del'>-	int ret = -1;</div><div class='add'>+    /*</div><div class='add'>+     * We need to reset this in case children come up in "staggered"</div><div class='add'>+     * fashion, so that we discover a late-arriving local subvolume.  Note</div><div class='add'>+     * that we could end up issuing N lookups to the first subvolume, and</div><div class='add'>+     * O(N^2) overall, but N is small for AFR so it shouldn't be an issue.</div><div class='add'>+     */</div><div class='add'>+    priv-&gt;did_discovery = _gf_false;</div><div class='add'>+</div><div class='add'>+    /* parent xlators don't need to know about every child_up, child_down</div><div class='add'>+     * because of afr ha. If all subvolumes go down, child_down has</div><div class='add'>+     * to be triggered. In that state when 1 subvolume comes up child_up</div><div class='add'>+     * needs to be triggered. dht optimizes revalidate lookup by sending</div><div class='add'>+     * it only to one of its subvolumes. When child up/down happens</div><div class='add'>+     * for afr's subvolumes dht should be notified by child_modified. The</div><div class='add'>+     * subsequent revalidate lookup happens on all the dht's subvolumes</div><div class='add'>+     * which triggers afr self-heals if any.</div><div class='add'>+     */</div><div class='add'>+    idx = afr_find_child_index(this, child_xlator);</div><div class='add'>+    if (idx &lt; 0) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_ERROR, 0, AFR_MSG_INVALID_CHILD_UP,</div><div class='add'>+               "Received child_up from invalid subvolume");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    had_quorum = priv-&gt;quorum_count &amp;&amp;</div><div class='add'>+                 afr_has_quorum(priv-&gt;child_up, this, NULL);</div><div class='add'>+    if (event == GF_EVENT_CHILD_PING) {</div><div class='add'>+        child_latency_msec = (int64_t)(uintptr_t)data2;</div><div class='add'>+        if (priv-&gt;halo_enabled) {</div><div class='add'>+            halo_max_latency_msec = afr_get_halo_latency(this);</div><div class='add'>+</div><div class='add'>+            /* Calculates the child latency and sets event</div><div class='add'>+             */</div><div class='add'>+            LOCK(&amp;priv-&gt;lock);</div><div class='add'>+            {</div><div class='add'>+                __afr_handle_ping_event(this, child_xlator, idx,</div><div class='add'>+                                        halo_max_latency_msec, &amp;event,</div><div class='add'>+                                        child_latency_msec);</div><div class='add'>+            }</div><div class='add'>+            UNLOCK(&amp;priv-&gt;lock);</div><div class='add'>+        } else {</div><div class='add'>+            LOCK(&amp;priv-&gt;lock);</div><div class='add'>+            {</div><div class='add'>+                priv-&gt;child_latency[idx] = child_latency_msec;</div><div class='add'>+            }</div><div class='add'>+            UNLOCK(&amp;priv-&gt;lock);</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	int i = 0;</div><div class='del'>-	int32_t call_count = 0;</div><div class='del'>-	int32_t op_ret   = -1;</div><div class='del'>-	int32_t op_errno = 0;</div><div class='add'>+    if (event == GF_EVENT_CHILD_PING) {</div><div class='add'>+        /* This is the only xlator that handles PING, no reason to</div><div class='add'>+         * propagate.</div><div class='add'>+         */</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	VALIDATE_OR_GOTO (frame, out);</div><div class='del'>-	VALIDATE_OR_GOTO (this, out);</div><div class='del'>-	VALIDATE_OR_GOTO (this-&gt;private, out);</div><div class='add'>+    if (event == GF_EVENT_TRANSLATOR_OP) {</div><div class='add'>+        LOCK(&amp;priv-&gt;lock);</div><div class='add'>+        {</div><div class='add'>+            had_heard_from_all = __get_heard_from_all_status(this);</div><div class='add'>+        }</div><div class='add'>+        UNLOCK(&amp;priv-&gt;lock);</div><div class='ctx'> </div><div class='del'>-	priv = this-&gt;private;</div><div class='add'>+        if (!had_heard_from_all) {</div><div class='add'>+            ret = -1;</div><div class='add'>+        } else {</div><div class='add'>+            input = data;</div><div class='add'>+            output = data2;</div><div class='add'>+            ret = afr_xl_op(this, input, output);</div><div class='add'>+        }</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (event == GF_EVENT_UPCALL) {</div><div class='add'>+        afr_handle_upcall_event(this, data);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;priv-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        had_heard_from_all = __get_heard_from_all_status(this);</div><div class='add'>+        switch (event) {</div><div class='add'>+            case GF_EVENT_PARENT_UP:</div><div class='add'>+                __afr_launch_notify_timer(this, priv);</div><div class='add'>+                propagate = 1;</div><div class='add'>+                break;</div><div class='add'>+            case GF_EVENT_CHILD_UP:</div><div class='add'>+                if (priv-&gt;thin_arbiter_count &amp;&amp;</div><div class='add'>+                    (idx == AFR_CHILD_THIN_ARBITER)) {</div><div class='add'>+                    priv-&gt;ta_child_up = 1;</div><div class='add'>+                    priv-&gt;ta_event_gen++;</div><div class='add'>+                    break;</div><div class='add'>+                }</div><div class='add'>+                __afr_handle_child_up_event(this, child_xlator, idx,</div><div class='add'>+                                            child_latency_msec, &amp;event,</div><div class='add'>+                                            &amp;call_psh, &amp;up_child);</div><div class='add'>+                __afr_lock_heal_synctask(this, priv, idx);</div><div class='add'>+                break;</div><div class='add'>+</div><div class='add'>+            case GF_EVENT_CHILD_DOWN:</div><div class='add'>+                if (priv-&gt;thin_arbiter_count &amp;&amp;</div><div class='add'>+                    (idx == AFR_CHILD_THIN_ARBITER)) {</div><div class='add'>+                    priv-&gt;ta_child_up = 0;</div><div class='add'>+                    priv-&gt;ta_event_gen++;</div><div class='add'>+                    afr_ta_locked_priv_invalidate(priv);</div><div class='add'>+                    break;</div><div class='add'>+                }</div><div class='add'>+                __afr_handle_child_down_event(this, child_xlator, idx,</div><div class='add'>+                                              child_latency_msec, &amp;event,</div><div class='add'>+                                              &amp;call_psh, &amp;up_child);</div><div class='add'>+                __afr_mark_pending_lk_heal(this, priv, idx);</div><div class='add'>+                break;</div><div class='add'>+</div><div class='add'>+            case GF_EVENT_CHILD_CONNECTING:</div><div class='add'>+                priv-&gt;last_event[idx] = event;</div><div class='add'>+</div><div class='add'>+                break;</div><div class='add'>+</div><div class='add'>+            case GF_EVENT_SOME_DESCENDENT_DOWN:</div><div class='add'>+                priv-&gt;last_event[idx] = event;</div><div class='add'>+                break;</div><div class='add'>+            default:</div><div class='add'>+                propagate = 1;</div><div class='add'>+                break;</div><div class='add'>+        }</div><div class='add'>+        have_heard_from_all = __get_heard_from_all_status(this);</div><div class='add'>+        if (!had_heard_from_all &amp;&amp; have_heard_from_all) {</div><div class='add'>+            if (priv-&gt;timer) {</div><div class='add'>+                gf_timer_call_cancel(this-&gt;ctx, priv-&gt;timer);</div><div class='add'>+                priv-&gt;timer = NULL;</div><div class='add'>+            }</div><div class='add'>+            /* This is the first event which completes aggregation</div><div class='add'>+               of events from all subvolumes. If at least one subvol</div><div class='add'>+               had come up, propagate CHILD_UP, but only this time</div><div class='add'>+            */</div><div class='add'>+            event = GF_EVENT_CHILD_DOWN;</div><div class='add'>+            for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+                if (priv-&gt;last_event[i] == GF_EVENT_CHILD_UP) {</div><div class='add'>+                    event = GF_EVENT_CHILD_UP;</div><div class='add'>+                    break;</div><div class='add'>+                }</div><div class='ctx'> </div><div class='del'>-	ALLOC_OR_GOTO (local, afr_local_t, out);</div><div class='add'>+                if (priv-&gt;last_event[i] == GF_EVENT_CHILD_CONNECTING) {</div><div class='add'>+                    event = GF_EVENT_CHILD_CONNECTING;</div><div class='add'>+                    /* continue to check other events for CHILD_UP */</div><div class='add'>+                }</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    UNLOCK(&amp;priv-&gt;lock);</div><div class='add'>+</div><div class='add'>+    if (priv-&gt;quorum_count) {</div><div class='add'>+        has_quorum = afr_has_quorum(priv-&gt;child_up, this, NULL);</div><div class='add'>+        if (!had_quorum &amp;&amp; has_quorum) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_INFO, 0, AFR_MSG_QUORUM_MET,</div><div class='add'>+                   "Client-quorum is met");</div><div class='add'>+            gf_event(EVENT_AFR_QUORUM_MET, "client-pid=%d; subvol=%s",</div><div class='add'>+                     this-&gt;ctx-&gt;cmd_args.client_pid, this-&gt;name);</div><div class='add'>+        }</div><div class='add'>+        if (had_quorum &amp;&amp; !has_quorum) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_WARNING, 0, AFR_MSG_QUORUM_FAIL,</div><div class='add'>+                   "Client-quorum is not met");</div><div class='add'>+            gf_event(EVENT_AFR_QUORUM_FAIL, "client-pid=%d; subvol=%s",</div><div class='add'>+                     this-&gt;ctx-&gt;cmd_args.client_pid, this-&gt;name);</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* if all subvols have reported status, no need to hide anything</div><div class='add'>+       or wait for anything else. Just propagate blindly */</div><div class='add'>+    if (have_heard_from_all)</div><div class='add'>+        propagate = 1;</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+    if (propagate)</div><div class='add'>+        ret = default_notify(this, event, data);</div><div class='add'>+</div><div class='add'>+    if ((!had_heard_from_all) || call_psh) {</div><div class='add'>+        /* Launch self-heal on all local subvolumes if:</div><div class='add'>+         * a) We have_heard_from_all for the first time</div><div class='add'>+         * b) Already heard from everyone, but we now got a child-up</div><div class='add'>+         *    event.</div><div class='add'>+         */</div><div class='add'>+        if (have_heard_from_all) {</div><div class='add'>+            afr_selfheal_childup(this, priv);</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	ret = AFR_LOCAL_INIT (local, priv);</div><div class='del'>-	if (ret &lt; 0) {</div><div class='del'>-		op_errno = -ret;</div><div class='del'>-		goto out;</div><div class='del'>-	}</div><div class='add'>+int</div><div class='add'>+afr_local_init(afr_local_t *local, afr_private_t *priv, int32_t *op_errno)</div><div class='add'>+{</div><div class='add'>+    int __ret = -1;</div><div class='add'>+    local-&gt;op_ret = -1;</div><div class='add'>+    local-&gt;op_errno = EUCLEAN;</div><div class='add'>+</div><div class='add'>+    __ret = syncbarrier_init(&amp;local-&gt;barrier);</div><div class='add'>+    if (__ret) {</div><div class='add'>+        if (op_errno)</div><div class='add'>+            *op_errno = __ret;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    local-&gt;child_up = GF_MALLOC(priv-&gt;child_count * sizeof(*local-&gt;child_up),</div><div class='add'>+                                gf_afr_mt_char);</div><div class='add'>+    if (!local-&gt;child_up) {</div><div class='add'>+        if (op_errno)</div><div class='add'>+            *op_errno = ENOMEM;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    memcpy(local-&gt;child_up, priv-&gt;child_up,</div><div class='add'>+           sizeof(*local-&gt;child_up) * priv-&gt;child_count);</div><div class='add'>+    local-&gt;call_count = AFR_COUNT(local-&gt;child_up, priv-&gt;child_count);</div><div class='add'>+    if (local-&gt;call_count == 0) {</div><div class='add'>+        gf_msg(THIS-&gt;name, GF_LOG_INFO, 0, AFR_MSG_SUBVOLS_DOWN,</div><div class='add'>+               "no subvolumes up");</div><div class='add'>+        if (op_errno)</div><div class='add'>+            *op_errno = ENOTCONN;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    local-&gt;event_generation = priv-&gt;event_generation;</div><div class='add'>+</div><div class='add'>+    local-&gt;read_attempted = GF_CALLOC(priv-&gt;child_count, sizeof(char),</div><div class='add'>+                                      gf_afr_mt_char);</div><div class='add'>+    if (!local-&gt;read_attempted) {</div><div class='add'>+        if (op_errno)</div><div class='add'>+            *op_errno = ENOMEM;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    local-&gt;readable = GF_CALLOC(priv-&gt;child_count, sizeof(char),</div><div class='add'>+                                gf_afr_mt_char);</div><div class='add'>+    if (!local-&gt;readable) {</div><div class='add'>+        if (op_errno)</div><div class='add'>+            *op_errno = ENOMEM;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    local-&gt;readable2 = GF_CALLOC(priv-&gt;child_count, sizeof(char),</div><div class='add'>+                                 gf_afr_mt_char);</div><div class='add'>+    if (!local-&gt;readable2) {</div><div class='add'>+        if (op_errno)</div><div class='add'>+            *op_errno = ENOMEM;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    local-&gt;read_subvol = -1;</div><div class='add'>+</div><div class='add'>+    local-&gt;replies = GF_CALLOC(priv-&gt;child_count, sizeof(*local-&gt;replies),</div><div class='add'>+                               gf_afr_mt_reply_t);</div><div class='add'>+    if (!local-&gt;replies) {</div><div class='add'>+        if (op_errno)</div><div class='add'>+            *op_errno = ENOMEM;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    local-&gt;need_full_crawl = _gf_false;</div><div class='add'>+    if (priv-&gt;thin_arbiter_count) {</div><div class='add'>+        local-&gt;ta_child_up = priv-&gt;ta_child_up;</div><div class='add'>+        local-&gt;ta_failed_subvol = AFR_CHILD_UNKNOWN;</div><div class='add'>+        local-&gt;read_txn_query_child = AFR_CHILD_UNKNOWN;</div><div class='add'>+        local-&gt;ta_event_gen = priv-&gt;ta_event_gen;</div><div class='add'>+        local-&gt;fop_state = TA_SUCCESS;</div><div class='add'>+    }</div><div class='add'>+    local-&gt;is_new_entry = _gf_false;</div><div class='add'>+</div><div class='add'>+    INIT_LIST_HEAD(&amp;local-&gt;healer);</div><div class='add'>+    return 0;</div><div class='add'>+out:</div><div class='add'>+    return -1;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	call_count = local-&gt;call_count;</div><div class='del'>-	frame-&gt;local = local;</div><div class='add'>+int</div><div class='add'>+afr_internal_lock_init(afr_internal_lock_t *lk, size_t child_count)</div><div class='add'>+{</div><div class='add'>+    int ret = -ENOMEM;</div><div class='ctx'> </div><div class='del'>-	for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='del'>-		if (local-&gt;child_up[i]) {</div><div class='del'>-			STACK_WIND (frame, afr_fentrylk_cbk,</div><div class='del'>-				    priv-&gt;children[i],</div><div class='del'>-				    priv-&gt;children[i]-&gt;fops-&gt;fentrylk,</div><div class='del'>-				    volume, fd, basename, cmd, type);</div><div class='add'>+    lk-&gt;lower_locked_nodes = GF_CALLOC(sizeof(*lk-&gt;lower_locked_nodes),</div><div class='add'>+                                       child_count, gf_afr_mt_char);</div><div class='add'>+    if (NULL == lk-&gt;lower_locked_nodes)</div><div class='add'>+        goto out;</div><div class='ctx'> </div><div class='del'>-			if (!--call_count)</div><div class='del'>-				break;</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='add'>+    lk-&gt;lock_op_ret = -1;</div><div class='add'>+    lk-&gt;lock_op_errno = EUCLEAN;</div><div class='ctx'> </div><div class='del'>-	op_ret = 0;</div><div class='add'>+    ret = 0;</div><div class='ctx'> out:</div><div class='del'>-	if (op_ret == -1) {</div><div class='del'>-		AFR_STACK_UNWIND (fentrylk, frame, op_ret, op_errno);</div><div class='del'>-	}</div><div class='del'>-	return 0;</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-int32_t</div><div class='del'>-afr_statfs_cbk (call_frame_t *frame, void *cookie,</div><div class='del'>-		xlator_t *this, int32_t op_ret, int32_t op_errno,</div><div class='del'>-		struct statvfs *statvfs)</div><div class='add'>+void</div><div class='add'>+afr_matrix_cleanup(int32_t **matrix, unsigned int m)</div><div class='ctx'> {</div><div class='del'>-	afr_local_t *local = NULL;</div><div class='add'>+    int i = 0;</div><div class='ctx'> </div><div class='del'>-	int call_count = 0;</div><div class='add'>+    if (!matrix)</div><div class='add'>+        goto out;</div><div class='add'>+    for (i = 0; i &lt; m; i++) {</div><div class='add'>+        GF_FREE(matrix[i]);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	LOCK (&amp;frame-&gt;lock);</div><div class='del'>-	{</div><div class='del'>-		local = frame-&gt;local;</div><div class='del'>-</div><div class='del'>-		if (op_ret == 0) {</div><div class='del'>-			local-&gt;op_ret   = op_ret;</div><div class='del'>-</div><div class='del'>-			if (local-&gt;cont.statfs.buf_set) {</div><div class='del'>-				if (statvfs-&gt;f_bavail &lt; local-&gt;cont.statfs.buf.f_bavail)</div><div class='del'>-					local-&gt;cont.statfs.buf = *statvfs;</div><div class='del'>-			} else {</div><div class='del'>-				local-&gt;cont.statfs.buf = *statvfs;</div><div class='del'>-				local-&gt;cont.statfs.buf_set = 1;</div><div class='del'>-			}</div><div class='del'>-		}</div><div class='del'>-</div><div class='del'>-		if (op_ret == -1)</div><div class='del'>-			local-&gt;op_errno = op_errno;</div><div class='add'>+    GF_FREE(matrix);</div><div class='add'>+out:</div><div class='add'>+    return;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	}</div><div class='del'>-	UNLOCK (&amp;frame-&gt;lock);</div><div class='add'>+int32_t **</div><div class='add'>+afr_matrix_create(unsigned int m, unsigned int n)</div><div class='add'>+{</div><div class='add'>+    int32_t **matrix = NULL;</div><div class='add'>+    int i = 0;</div><div class='add'>+</div><div class='add'>+    matrix = GF_CALLOC(sizeof(*matrix), m, gf_afr_mt_int32_t);</div><div class='add'>+    if (!matrix)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; m; i++) {</div><div class='add'>+        matrix[i] = GF_CALLOC(sizeof(*matrix[i]), n, gf_afr_mt_int32_t);</div><div class='add'>+        if (!matrix[i])</div><div class='add'>+            goto out;</div><div class='add'>+    }</div><div class='add'>+    return matrix;</div><div class='add'>+out:</div><div class='add'>+    afr_matrix_cleanup(matrix, m);</div><div class='add'>+    return NULL;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	call_count = afr_frame_return (frame);</div><div class='add'>+int</div><div class='add'>+afr_transaction_local_init(afr_local_t *local, xlator_t *this)</div><div class='add'>+{</div><div class='add'>+    int ret = -ENOMEM;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+    INIT_LIST_HEAD(&amp;local-&gt;transaction.wait_list);</div><div class='add'>+    INIT_LIST_HEAD(&amp;local-&gt;transaction.owner_list);</div><div class='add'>+    INIT_LIST_HEAD(&amp;local-&gt;ta_waitq);</div><div class='add'>+    INIT_LIST_HEAD(&amp;local-&gt;ta_onwireq);</div><div class='add'>+    ret = afr_internal_lock_init(&amp;local-&gt;internal_lock, priv-&gt;child_count);</div><div class='add'>+    if (ret &lt; 0)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    ret = -ENOMEM;</div><div class='add'>+    local-&gt;pre_op_compat = priv-&gt;pre_op_compat;</div><div class='add'>+</div><div class='add'>+    local-&gt;transaction.pre_op = GF_CALLOC(sizeof(*local-&gt;transaction.pre_op),</div><div class='add'>+                                          priv-&gt;child_count, gf_afr_mt_char);</div><div class='add'>+    if (!local-&gt;transaction.pre_op)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    local-&gt;transaction.changelog_xdata = GF_CALLOC(</div><div class='add'>+        sizeof(*local-&gt;transaction.changelog_xdata), priv-&gt;child_count,</div><div class='add'>+        gf_afr_mt_dict_t);</div><div class='add'>+    if (!local-&gt;transaction.changelog_xdata)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    if (priv-&gt;arbiter_count == 1) {</div><div class='add'>+        local-&gt;transaction.pre_op_sources = GF_CALLOC(</div><div class='add'>+            sizeof(*local-&gt;transaction.pre_op_sources), priv-&gt;child_count,</div><div class='add'>+            gf_afr_mt_char);</div><div class='add'>+        if (!local-&gt;transaction.pre_op_sources)</div><div class='add'>+            goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    local-&gt;transaction.failed_subvols = GF_CALLOC(</div><div class='add'>+        sizeof(*local-&gt;transaction.failed_subvols), priv-&gt;child_count,</div><div class='add'>+        gf_afr_mt_char);</div><div class='add'>+    if (!local-&gt;transaction.failed_subvols)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    local-&gt;pending = afr_matrix_create(priv-&gt;child_count, AFR_NUM_CHANGE_LOGS);</div><div class='add'>+    if (!local-&gt;pending)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	if (call_count == 0)</div><div class='del'>-		AFR_STACK_UNWIND (statfs, frame, local-&gt;op_ret, local-&gt;op_errno,</div><div class='del'>-				  &amp;local-&gt;cont.statfs.buf);</div><div class='add'>+void</div><div class='add'>+afr_set_low_priority(call_frame_t *frame)</div><div class='add'>+{</div><div class='add'>+    frame-&gt;root-&gt;pid = LOW_PRIO_PROC_PID;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	return 0;</div><div class='add'>+void</div><div class='add'>+afr_priv_destroy(afr_private_t *priv)</div><div class='add'>+{</div><div class='add'>+    int i = 0;</div><div class='add'>+    int child_count = -1;</div><div class='add'>+</div><div class='add'>+    if (!priv)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    GF_FREE(priv-&gt;sh_domain);</div><div class='add'>+    GF_FREE(priv-&gt;last_event);</div><div class='add'>+</div><div class='add'>+    child_count = priv-&gt;child_count;</div><div class='add'>+    if (priv-&gt;thin_arbiter_count) {</div><div class='add'>+        child_count++;</div><div class='add'>+    }</div><div class='add'>+    if (priv-&gt;pending_key) {</div><div class='add'>+        for (i = 0; i &lt; child_count; i++)</div><div class='add'>+            GF_FREE(priv-&gt;pending_key[i]);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    GF_FREE(priv-&gt;pending_reads);</div><div class='add'>+    GF_FREE(priv-&gt;local);</div><div class='add'>+    GF_FREE(priv-&gt;pending_key);</div><div class='add'>+    GF_FREE(priv-&gt;children);</div><div class='add'>+    GF_FREE(priv-&gt;anon_inode);</div><div class='add'>+    GF_FREE(priv-&gt;child_up);</div><div class='add'>+    GF_FREE(priv-&gt;halo_child_up);</div><div class='add'>+    GF_FREE(priv-&gt;child_latency);</div><div class='add'>+    LOCK_DESTROY(&amp;priv-&gt;lock);</div><div class='add'>+</div><div class='add'>+    GF_FREE(priv);</div><div class='add'>+out:</div><div class='add'>+    return;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+int **</div><div class='add'>+afr_mark_pending_changelog(afr_private_t *priv, unsigned char *pending,</div><div class='add'>+                           dict_t *xattr, ia_type_t iat)</div><div class='add'>+{</div><div class='add'>+    int i = 0;</div><div class='add'>+    int **changelog = NULL;</div><div class='add'>+    int idx = -1;</div><div class='add'>+    int m_idx = 0;</div><div class='add'>+    int d_idx = 0;</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    m_idx = afr_index_for_transaction_type(AFR_METADATA_TRANSACTION);</div><div class='add'>+    d_idx = afr_index_for_transaction_type(AFR_DATA_TRANSACTION);</div><div class='add'>+</div><div class='add'>+    idx = afr_index_from_ia_type(iat);</div><div class='add'>+</div><div class='add'>+    changelog = afr_matrix_create(priv-&gt;child_count, AFR_NUM_CHANGE_LOGS);</div><div class='add'>+    if (!changelog)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+        if (!pending[i])</div><div class='add'>+            continue;</div><div class='add'>+</div><div class='add'>+        changelog[i][m_idx] = hton32(1);</div><div class='add'>+        if (idx != -1)</div><div class='add'>+            changelog[i][idx] = hton32(1);</div><div class='add'>+        /* If the newentry marking is on a newly created directory,</div><div class='add'>+         * then mark it with the full-heal indicator.</div><div class='add'>+         */</div><div class='add'>+        if ((IA_ISDIR(iat)) &amp;&amp; (priv-&gt;esh_granular))</div><div class='add'>+            changelog[i][d_idx] = hton32(1);</div><div class='add'>+    }</div><div class='add'>+    ret = afr_set_pending_dict(priv, xattr, changelog);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        afr_matrix_cleanup(changelog, priv-&gt;child_count);</div><div class='add'>+        return NULL;</div><div class='add'>+    }</div><div class='add'>+out:</div><div class='add'>+    return changelog;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-int32_t</div><div class='del'>-afr_statfs (call_frame_t *frame, xlator_t *this,</div><div class='del'>-	    loc_t *loc)</div><div class='del'>-{</div><div class='del'>-	afr_private_t *  priv        = NULL;</div><div class='del'>-	int              child_count = 0;</div><div class='del'>-	afr_local_t   *  local       = NULL;</div><div class='del'>-	int              i           = 0;</div><div class='del'>-</div><div class='del'>-	int ret = -1;</div><div class='del'>-	int              call_count = 0;</div><div class='del'>-	int32_t          op_ret      = -1;</div><div class='del'>-	int32_t          op_errno    = 0;</div><div class='del'>-</div><div class='del'>-	VALIDATE_OR_GOTO (this, out);</div><div class='del'>-	VALIDATE_OR_GOTO (this-&gt;private, out);</div><div class='del'>-	VALIDATE_OR_GOTO (loc, out);</div><div class='del'>-</div><div class='del'>-	priv = this-&gt;private;</div><div class='del'>-	child_count = priv-&gt;child_count;</div><div class='del'>-</div><div class='del'>-	ALLOC_OR_GOTO (local, afr_local_t, out);</div><div class='del'>-</div><div class='del'>-	ret = AFR_LOCAL_INIT (local, priv);</div><div class='del'>-	if (ret &lt; 0) {</div><div class='del'>-		op_errno = -ret;</div><div class='del'>-		goto out;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	frame-&gt;local = local;</div><div class='del'>-	call_count = local-&gt;call_count;</div><div class='del'>-</div><div class='del'>-	for (i = 0; i &lt; child_count; i++) {</div><div class='del'>-		if (local-&gt;child_up[i]) {</div><div class='del'>-			STACK_WIND (frame, afr_statfs_cbk,</div><div class='del'>-				    priv-&gt;children[i],</div><div class='del'>-				    priv-&gt;children[i]-&gt;fops-&gt;statfs,</div><div class='del'>-				    loc);</div><div class='del'>-			if (!--call_count)</div><div class='del'>-				break;</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	op_ret = 0;</div><div class='add'>+static dict_t *</div><div class='add'>+afr_set_heal_info(char *status)</div><div class='add'>+{</div><div class='add'>+    dict_t *dict = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    dict = dict_new();</div><div class='add'>+    if (!dict) {</div><div class='add'>+        ret = -ENOMEM;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_set_dynstr_sizen(dict, "heal-info", status);</div><div class='add'>+    if (ret)</div><div class='add'>+        gf_msg("", GF_LOG_WARNING, -ret, AFR_MSG_DICT_SET_FAILED,</div><div class='add'>+               "Failed to set heal-info key to "</div><div class='add'>+               "%s",</div><div class='add'>+               status);</div><div class='ctx'> out:</div><div class='del'>-	if (op_ret == -1) {</div><div class='del'>-		AFR_STACK_UNWIND (statfs, frame, op_ret, op_errno, NULL);</div><div class='del'>-	}</div><div class='del'>-	return 0;</div><div class='add'>+    /* Any error other than EINVAL, dict_set_dynstr frees status */</div><div class='add'>+    if (ret == -ENOMEM || ret == -EINVAL) {</div><div class='add'>+        GF_FREE(status);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (ret &amp;&amp; dict) {</div><div class='add'>+        dict_unref(dict);</div><div class='add'>+        dict = NULL;</div><div class='add'>+    }</div><div class='add'>+    return dict;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+static gf_boolean_t</div><div class='add'>+afr_is_dirty_count_non_unary_for_txn(xlator_t *this, struct afr_reply *replies,</div><div class='add'>+                                     afr_transaction_type type)</div><div class='add'>+{</div><div class='add'>+    afr_private_t *priv = this-&gt;private;</div><div class='add'>+    int *dirty = alloca0(priv-&gt;child_count * sizeof(int));</div><div class='add'>+    int i = 0;</div><div class='add'>+</div><div class='add'>+    afr_selfheal_extract_xattr(this, replies, type, dirty, NULL);</div><div class='add'>+    for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+        if (dirty[i] &gt; 1)</div><div class='add'>+            return _gf_true;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-int32_t</div><div class='del'>-afr_lk_unlock_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-		   int32_t op_ret, int32_t op_errno, struct flock *lock)</div><div class='add'>+    return _gf_false;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static gf_boolean_t</div><div class='add'>+afr_is_dirty_count_non_unary(xlator_t *this, struct afr_reply *replies,</div><div class='add'>+                             ia_type_t ia_type)</div><div class='ctx'> {</div><div class='del'>-	afr_local_t * local = NULL;</div><div class='add'>+    gf_boolean_t data_chk = _gf_false;</div><div class='add'>+    gf_boolean_t mdata_chk = _gf_false;</div><div class='add'>+    gf_boolean_t entry_chk = _gf_false;</div><div class='add'>+</div><div class='add'>+    switch (ia_type) {</div><div class='add'>+        case IA_IFDIR:</div><div class='add'>+            mdata_chk = _gf_true;</div><div class='add'>+            entry_chk = _gf_true;</div><div class='add'>+            break;</div><div class='add'>+        case IA_IFREG:</div><div class='add'>+            mdata_chk = _gf_true;</div><div class='add'>+            data_chk = _gf_true;</div><div class='add'>+            break;</div><div class='add'>+        default:</div><div class='add'>+            /*IA_IFBLK, IA_IFCHR, IA_IFLNK, IA_IFIFO, IA_IFSOCK*/</div><div class='add'>+            mdata_chk = _gf_true;</div><div class='add'>+            break;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (data_chk &amp;&amp; afr_is_dirty_count_non_unary_for_txn(</div><div class='add'>+                        this, replies, AFR_DATA_TRANSACTION)) {</div><div class='add'>+        return _gf_true;</div><div class='add'>+    } else if (mdata_chk &amp;&amp; afr_is_dirty_count_non_unary_for_txn(</div><div class='add'>+                                this, replies, AFR_METADATA_TRANSACTION)) {</div><div class='add'>+        return _gf_true;</div><div class='add'>+    } else if (entry_chk &amp;&amp; afr_is_dirty_count_non_unary_for_txn(</div><div class='add'>+                                this, replies, AFR_ENTRY_TRANSACTION)) {</div><div class='add'>+        return _gf_true;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return _gf_false;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	int call_count = -1;</div><div class='add'>+static int</div><div class='add'>+afr_update_heal_status(xlator_t *this, struct afr_reply *replies,</div><div class='add'>+                       ia_type_t ia_type, gf_boolean_t *esh, gf_boolean_t *dsh,</div><div class='add'>+                       gf_boolean_t *msh, unsigned char pending)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    GF_UNUSED int ret1 = 0;</div><div class='add'>+    int i = 0;</div><div class='add'>+    int io_domain_lk_count = 0;</div><div class='add'>+    int shd_domain_lk_count = 0;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    char *key1 = NULL;</div><div class='add'>+    char *key2 = NULL;</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+    key1 = alloca0(strlen(GLUSTERFS_INODELK_DOM_PREFIX) + 2 +</div><div class='add'>+                   strlen(this-&gt;name));</div><div class='add'>+    key2 = alloca0(strlen(GLUSTERFS_INODELK_DOM_PREFIX) + 2 +</div><div class='add'>+                   strlen(priv-&gt;sh_domain));</div><div class='add'>+    sprintf(key1, "%s:%s", GLUSTERFS_INODELK_DOM_PREFIX, this-&gt;name);</div><div class='add'>+    sprintf(key2, "%s:%s", GLUSTERFS_INODELK_DOM_PREFIX, priv-&gt;sh_domain);</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+        if ((replies[i].valid != 1) || (replies[i].op_ret != 0))</div><div class='add'>+            continue;</div><div class='add'>+        if (!io_domain_lk_count) {</div><div class='add'>+            ret1 = dict_get_int32(replies[i].xdata, key1, &amp;io_domain_lk_count);</div><div class='add'>+        }</div><div class='add'>+        if (!shd_domain_lk_count) {</div><div class='add'>+            ret1 = dict_get_int32(replies[i].xdata, key2, &amp;shd_domain_lk_count);</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-	call_count = afr_frame_return (frame);</div><div class='add'>+    if (!pending) {</div><div class='add'>+        if ((afr_is_dirty_count_non_unary(this, replies, ia_type)) ||</div><div class='add'>+            (!io_domain_lk_count)) {</div><div class='add'>+            /* Needs heal. */</div><div class='add'>+            ret = 0;</div><div class='add'>+        } else {</div><div class='add'>+            /* No heal needed. */</div><div class='add'>+            *dsh = *esh = *msh = 0;</div><div class='add'>+        }</div><div class='add'>+    } else {</div><div class='add'>+        if (shd_domain_lk_count) {</div><div class='add'>+            ret = -EAGAIN; /*For 'possibly-healing'. */</div><div class='add'>+        } else {</div><div class='add'>+            ret = 0; /*needs heal. Just set a non -ve value so that it is</div><div class='add'>+                       assumed as the source index.*/</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	if (call_count == 0)</div><div class='del'>-		AFR_STACK_UNWIND (lk, frame, local-&gt;op_ret, local-&gt;op_errno,</div><div class='del'>-				  lock);</div><div class='add'>+/*return EIO, EAGAIN or pending*/</div><div class='add'>+int</div><div class='add'>+afr_lockless_inspect(call_frame_t *frame, xlator_t *this, uuid_t gfid,</div><div class='add'>+                     inode_t **inode, gf_boolean_t *entry_selfheal,</div><div class='add'>+                     gf_boolean_t *data_selfheal,</div><div class='add'>+                     gf_boolean_t *metadata_selfheal, unsigned char *pending)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int i = 0;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    struct afr_reply *replies = NULL;</div><div class='add'>+    gf_boolean_t dsh = _gf_false;</div><div class='add'>+    gf_boolean_t msh = _gf_false;</div><div class='add'>+    gf_boolean_t esh = _gf_false;</div><div class='add'>+    unsigned char *sources = NULL;</div><div class='add'>+    unsigned char *sinks = NULL;</div><div class='add'>+    unsigned char *valid_on = NULL;</div><div class='add'>+    uint64_t *witness = NULL;</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+    replies = alloca0(sizeof(*replies) * priv-&gt;child_count);</div><div class='add'>+    sources = alloca0(sizeof(*sources) * priv-&gt;child_count);</div><div class='add'>+    sinks = alloca0(sizeof(*sinks) * priv-&gt;child_count);</div><div class='add'>+    witness = alloca0(sizeof(*witness) * priv-&gt;child_count);</div><div class='add'>+    valid_on = alloca0(sizeof(*valid_on) * priv-&gt;child_count);</div><div class='add'>+</div><div class='add'>+    ret = afr_selfheal_unlocked_inspect(frame, this, gfid, inode, &amp;dsh, &amp;msh,</div><div class='add'>+                                        &amp;esh, replies);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+    for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+        if (replies[i].valid &amp;&amp; replies[i].op_ret == 0) {</div><div class='add'>+            valid_on[i] = 1;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    if (msh) {</div><div class='add'>+        ret = afr_selfheal_find_direction(frame, this, replies,</div><div class='add'>+                                          AFR_METADATA_TRANSACTION, valid_on,</div><div class='add'>+                                          sources, sinks, witness, pending);</div><div class='add'>+        if (*pending &amp; PFLAG_SBRAIN)</div><div class='add'>+            ret = -EIO;</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+    }</div><div class='add'>+    if (dsh) {</div><div class='add'>+        ret = afr_selfheal_find_direction(frame, this, replies,</div><div class='add'>+                                          AFR_DATA_TRANSACTION, valid_on,</div><div class='add'>+                                          sources, sinks, witness, pending);</div><div class='add'>+        if (*pending &amp; PFLAG_SBRAIN)</div><div class='add'>+            ret = -EIO;</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+    }</div><div class='add'>+    if (esh) {</div><div class='add'>+        ret = afr_selfheal_find_direction(frame, this, replies,</div><div class='add'>+                                          AFR_ENTRY_TRANSACTION, valid_on,</div><div class='add'>+                                          sources, sinks, witness, pending);</div><div class='add'>+        if (*pending &amp; PFLAG_SBRAIN)</div><div class='add'>+            ret = -EIO;</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	return 0;</div><div class='add'>+    ret = afr_update_heal_status(this, replies, (*inode)-&gt;ia_type, &amp;esh, &amp;dsh,</div><div class='add'>+                                 &amp;msh, *pending);</div><div class='add'>+out:</div><div class='add'>+    *data_selfheal = dsh;</div><div class='add'>+    *entry_selfheal = esh;</div><div class='add'>+    *metadata_selfheal = msh;</div><div class='add'>+    if (replies)</div><div class='add'>+        afr_replies_wipe(replies, priv-&gt;child_count);</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+int</div><div class='add'>+afr_get_heal_info(call_frame_t *frame, xlator_t *this, loc_t *loc)</div><div class='add'>+{</div><div class='add'>+    gf_boolean_t data_selfheal = _gf_false;</div><div class='add'>+    gf_boolean_t metadata_selfheal = _gf_false;</div><div class='add'>+    gf_boolean_t entry_selfheal = _gf_false;</div><div class='add'>+    unsigned char pending = 0;</div><div class='add'>+    dict_t *dict = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int op_errno = ENOMEM;</div><div class='add'>+    inode_t *inode = NULL;</div><div class='add'>+    char *substr = NULL;</div><div class='add'>+    char *status = NULL;</div><div class='add'>+    call_frame_t *heal_frame = NULL;</div><div class='add'>+    afr_local_t *heal_local = NULL;</div><div class='add'>+</div><div class='add'>+    /*Use frame with lk-owner set*/</div><div class='add'>+    heal_frame = afr_frame_create(frame-&gt;this, &amp;op_errno);</div><div class='add'>+    if (!heal_frame) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    heal_local = heal_frame-&gt;local;</div><div class='add'>+    heal_frame-&gt;local = frame-&gt;local;</div><div class='add'>+</div><div class='add'>+    ret = afr_lockless_inspect(heal_frame, this, loc-&gt;gfid, &amp;inode,</div><div class='add'>+                               &amp;entry_selfheal, &amp;data_selfheal,</div><div class='add'>+                               &amp;metadata_selfheal, &amp;pending);</div><div class='add'>+</div><div class='add'>+    if (ret == -ENOMEM) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (pending &amp; PFLAG_PENDING) {</div><div class='add'>+        gf_asprintf(&amp;substr, "-pending");</div><div class='add'>+        if (!substr)</div><div class='add'>+            goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (ret == -EIO) {</div><div class='add'>+        ret = gf_asprintf(&amp;status, "split-brain%s", substr ? substr : "");</div><div class='add'>+        if (ret &lt; 0) {</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+        dict = afr_set_heal_info(status);</div><div class='add'>+        if (!dict) {</div><div class='add'>+            ret = -1;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    } else if (ret == -EAGAIN) {</div><div class='add'>+        ret = gf_asprintf(&amp;status, "possibly-healing%s", substr ? substr : "");</div><div class='add'>+        if (ret &lt; 0) {</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+        dict = afr_set_heal_info(status);</div><div class='add'>+        if (!dict) {</div><div class='add'>+            ret = -1;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    } else if (ret &gt;= 0) {</div><div class='add'>+        /* value of ret = source index</div><div class='add'>+         * so ret &gt;= 0 and at least one of the 3 booleans set to</div><div class='add'>+         * true means a source is identified; heal is required.</div><div class='add'>+         */</div><div class='add'>+        if (!data_selfheal &amp;&amp; !entry_selfheal &amp;&amp; !metadata_selfheal) {</div><div class='add'>+            status = gf_strdup("no-heal");</div><div class='add'>+            if (!status) {</div><div class='add'>+                ret = -1;</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+            dict = afr_set_heal_info(status);</div><div class='add'>+            if (!dict) {</div><div class='add'>+                ret = -1;</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+        } else {</div><div class='add'>+            ret = gf_asprintf(&amp;status, "heal%s", substr ? substr : "");</div><div class='add'>+            if (ret &lt; 0) {</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+            dict = afr_set_heal_info(status);</div><div class='add'>+            if (!dict) {</div><div class='add'>+                ret = -1;</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+    } else if (ret &lt; 0) {</div><div class='add'>+        /* Apart from above checked -ve ret values, there are</div><div class='add'>+         * other possible ret values like ENOTCONN</div><div class='add'>+         * (returned when number of valid replies received are</div><div class='add'>+         * less than 2)</div><div class='add'>+         * in which case heal is required when one of the</div><div class='add'>+         * selfheal booleans is set.</div><div class='add'>+         */</div><div class='add'>+        if (data_selfheal || entry_selfheal || metadata_selfheal) {</div><div class='add'>+            ret = gf_asprintf(&amp;status, "heal%s", substr ? substr : "");</div><div class='add'>+            if (ret &lt; 0) {</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+            dict = afr_set_heal_info(status);</div><div class='add'>+            if (!dict) {</div><div class='add'>+                ret = -1;</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+    op_errno = 0;</div><div class='ctx'> </div><div class='del'>-int32_t</div><div class='del'>-afr_lk_unlock (call_frame_t *frame, xlator_t *this)</div><div class='add'>+out:</div><div class='add'>+    if (heal_frame) {</div><div class='add'>+        heal_frame-&gt;local = heal_local;</div><div class='add'>+        AFR_STACK_DESTROY(heal_frame);</div><div class='add'>+    }</div><div class='add'>+    AFR_STACK_UNWIND(getxattr, frame, ret, op_errno, dict, NULL);</div><div class='add'>+    if (dict)</div><div class='add'>+        dict_unref(dict);</div><div class='add'>+    if (inode)</div><div class='add'>+        inode_unref(inode);</div><div class='add'>+    GF_FREE(substr);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+_afr_is_split_brain(call_frame_t *frame, xlator_t *this,</div><div class='add'>+                    struct afr_reply *replies, afr_transaction_type type,</div><div class='add'>+                    gf_boolean_t *spb)</div><div class='ctx'> {</div><div class='del'>-	afr_local_t   * local = NULL;</div><div class='del'>-	afr_private_t * priv  = NULL;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    uint64_t *witness = NULL;</div><div class='add'>+    unsigned char *sources = NULL;</div><div class='add'>+    unsigned char *sinks = NULL;</div><div class='add'>+    int sources_count = 0;</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    sources = alloca0(priv-&gt;child_count);</div><div class='add'>+    sinks = alloca0(priv-&gt;child_count);</div><div class='add'>+    witness = alloca0(priv-&gt;child_count * sizeof(*witness));</div><div class='add'>+</div><div class='add'>+    ret = afr_selfheal_find_direction(frame, this, replies, type,</div><div class='add'>+                                      priv-&gt;child_up, sources, sinks, witness,</div><div class='add'>+                                      NULL);</div><div class='add'>+    if (ret)</div><div class='add'>+        return ret;</div><div class='ctx'> </div><div class='del'>-	int i;</div><div class='del'>-	int call_count = 0;</div><div class='add'>+    sources_count = AFR_COUNT(sources, priv-&gt;child_count);</div><div class='add'>+    if (!sources_count)</div><div class='add'>+        *spb = _gf_true;</div><div class='ctx'> </div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-	priv  = this-&gt;private;</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	call_count = afr_locked_nodes_count (local-&gt;cont.lk.locked_nodes,</div><div class='del'>-					     priv-&gt;child_count);</div><div class='add'>+int</div><div class='add'>+afr_is_split_brain(call_frame_t *frame, xlator_t *this, inode_t *inode,</div><div class='add'>+                   uuid_t gfid, gf_boolean_t *d_spb, gf_boolean_t *m_spb)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    struct afr_reply *replies = NULL;</div><div class='ctx'> </div><div class='del'>-	if (call_count == 0) {</div><div class='del'>-		AFR_STACK_UNWIND (lk, frame, local-&gt;op_ret, local-&gt;op_errno,</div><div class='del'>-                                  &amp;local-&gt;cont.lk.ret_flock);</div><div class='del'>-		return 0;</div><div class='del'>-	}</div><div class='add'>+    priv = this-&gt;private;</div><div class='ctx'> </div><div class='del'>-	local-&gt;call_count = call_count;</div><div class='add'>+    replies = alloca0(sizeof(*replies) * priv-&gt;child_count);</div><div class='ctx'> </div><div class='del'>-        local-&gt;cont.lk.user_flock.l_type = F_UNLCK;</div><div class='add'>+    ret = afr_selfheal_unlocked_discover(frame, inode, gfid, replies);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='ctx'> </div><div class='del'>-	for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='del'>-		if (local-&gt;cont.lk.locked_nodes[i]) {</div><div class='del'>-			STACK_WIND (frame, afr_lk_unlock_cbk,</div><div class='del'>-				    priv-&gt;children[i],</div><div class='del'>-				    priv-&gt;children[i]-&gt;fops-&gt;lk,</div><div class='del'>-				    local-&gt;fd, F_SETLK,</div><div class='del'>-                                    &amp;local-&gt;cont.lk.user_flock);</div><div class='add'>+    if (!afr_can_decide_split_brain_source_sinks(replies, priv-&gt;child_count)) {</div><div class='add'>+        ret = -EAGAIN;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-			if (!--call_count)</div><div class='del'>-				break;</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='add'>+    ret = _afr_is_split_brain(frame, this, replies, AFR_DATA_TRANSACTION,</div><div class='add'>+                              d_spb);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='ctx'> </div><div class='del'>-	return 0;</div><div class='add'>+    ret = _afr_is_split_brain(frame, this, replies, AFR_METADATA_TRANSACTION,</div><div class='add'>+                              m_spb);</div><div class='add'>+out:</div><div class='add'>+    if (replies) {</div><div class='add'>+        afr_replies_wipe(replies, priv-&gt;child_count);</div><div class='add'>+        replies = NULL;</div><div class='add'>+    }</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-afr_lk_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-	    int32_t op_ret, int32_t op_errno, struct flock *lock)</div><div class='add'>+int</div><div class='add'>+afr_get_split_brain_status_cbk(int ret, call_frame_t *frame, void *opaque)</div><div class='ctx'> {</div><div class='del'>-	afr_local_t *local = NULL;</div><div class='del'>-	afr_private_t *priv = NULL;</div><div class='del'>-</div><div class='del'>-	int child_index = -1;</div><div class='add'>+    GF_FREE(opaque);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-	priv  = this-&gt;private;</div><div class='add'>+int</div><div class='add'>+afr_get_split_brain_status(void *opaque)</div><div class='add'>+{</div><div class='add'>+    gf_boolean_t d_spb = _gf_false;</div><div class='add'>+    gf_boolean_t m_spb = _gf_false;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int op_errno = 0;</div><div class='add'>+    int i = 0;</div><div class='add'>+    char *choices = NULL;</div><div class='add'>+    char *status = NULL;</div><div class='add'>+    dict_t *dict = NULL;</div><div class='add'>+    inode_t *inode = NULL;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    xlator_t **children = NULL;</div><div class='add'>+    call_frame_t *frame = NULL;</div><div class='add'>+    xlator_t *this = NULL;</div><div class='add'>+    loc_t *loc = NULL;</div><div class='add'>+    afr_spb_status_t *data = NULL;</div><div class='add'>+</div><div class='add'>+    data = opaque;</div><div class='add'>+    frame = data-&gt;frame;</div><div class='add'>+    this = frame-&gt;this;</div><div class='add'>+    loc = data-&gt;loc;</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+    children = priv-&gt;children;</div><div class='add'>+</div><div class='add'>+    inode = afr_inode_find(this, loc-&gt;gfid);</div><div class='add'>+    if (!inode)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    dict = dict_new();</div><div class='add'>+    if (!dict) {</div><div class='add'>+        op_errno = ENOMEM;</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Calculation for string length :</div><div class='add'>+     * (child_count X length of child-name) + SLEN("    Choices :")</div><div class='add'>+     * child-name consists of :</div><div class='add'>+     * a) 251 = max characters for volname according to GD_VOLUME_NAME_MAX</div><div class='add'>+     * b) strlen("-client-00,") assuming 16 replicas</div><div class='add'>+     */</div><div class='add'>+    choices = alloca0(priv-&gt;child_count * (256 + SLEN("-client-00,")) +</div><div class='add'>+                      SLEN("    Choices:"));</div><div class='add'>+</div><div class='add'>+    ret = afr_is_split_brain(frame, this, inode, loc-&gt;gfid, &amp;d_spb, &amp;m_spb);</div><div class='add'>+    if (ret) {</div><div class='add'>+        op_errno = -ret;</div><div class='add'>+        if (ret == -EAGAIN) {</div><div class='add'>+            ret = dict_set_sizen_str_sizen(dict, GF_AFR_SBRAIN_STATUS,</div><div class='add'>+                                           SBRAIN_HEAL_NO_GO_MSG);</div><div class='add'>+            if (ret) {</div><div class='add'>+                gf_msg(this-&gt;name, GF_LOG_WARNING, -ret,</div><div class='add'>+                       AFR_MSG_DICT_SET_FAILED,</div><div class='add'>+                       "Failed to set GF_AFR_SBRAIN_STATUS in dict");</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	child_index = (long) cookie;</div><div class='add'>+    if (d_spb || m_spb) {</div><div class='add'>+        sprintf(choices, "    Choices:");</div><div class='add'>+        for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+            strcat(choices, children[i]-&gt;name);</div><div class='add'>+            strcat(choices, ",");</div><div class='add'>+        }</div><div class='add'>+        choices[strlen(choices) - 1] = '\0';</div><div class='ctx'> </div><div class='del'>-	if (!child_went_down (op_ret, op_errno) &amp;&amp; (op_ret == -1)) {</div><div class='del'>-		local-&gt;op_ret   = -1;</div><div class='del'>-		local-&gt;op_errno = op_errno;</div><div class='add'>+        ret = gf_asprintf(&amp;status,</div><div class='add'>+                          "data-split-brain:%s    "</div><div class='add'>+                          "metadata-split-brain:%s%s",</div><div class='add'>+                          (d_spb) ? "yes" : "no", (m_spb) ? "yes" : "no",</div><div class='add'>+                          choices);</div><div class='ctx'> </div><div class='del'>-		afr_lk_unlock (frame, this);</div><div class='del'>-		return 0;</div><div class='del'>-	}</div><div class='add'>+        if (-1 == ret) {</div><div class='add'>+            op_errno = ENOMEM;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+        ret = dict_set_dynstr_sizen(dict, GF_AFR_SBRAIN_STATUS, status);</div><div class='add'>+        if (ret) {</div><div class='add'>+            op_errno = -ret;</div><div class='add'>+            ret = -1;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    } else {</div><div class='add'>+        ret = dict_set_sizen_str_sizen(dict, GF_AFR_SBRAIN_STATUS,</div><div class='add'>+                                       SFILE_NOT_UNDER_DATA);</div><div class='add'>+        if (ret) {</div><div class='add'>+            op_errno = -ret;</div><div class='add'>+            ret = -1;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	if (op_ret == 0) {</div><div class='del'>-		local-&gt;op_ret        = 0;</div><div class='del'>-		local-&gt;op_errno      = 0;</div><div class='del'>-		local-&gt;cont.lk.locked_nodes[child_index] = 1;</div><div class='del'>-                local-&gt;cont.lk.ret_flock = *lock;</div><div class='del'>-	}</div><div class='add'>+    ret = 0;</div><div class='add'>+out:</div><div class='add'>+    AFR_STACK_UNWIND(getxattr, frame, ret, op_errno, dict, NULL);</div><div class='add'>+    if (dict)</div><div class='add'>+        dict_unref(dict);</div><div class='add'>+    if (inode)</div><div class='add'>+        inode_unref(inode);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	child_index++;</div><div class='add'>+int32_t</div><div class='add'>+afr_heal_splitbrain_file(call_frame_t *frame, xlator_t *this, loc_t *loc)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+    int op_errno = 0;</div><div class='add'>+    dict_t *dict = NULL;</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    afr_local_t *heal_local = NULL;</div><div class='add'>+    call_frame_t *heal_frame = NULL;</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    dict = dict_new();</div><div class='add'>+    if (!dict) {</div><div class='add'>+        op_errno = ENOMEM;</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    heal_frame = afr_frame_create(this, &amp;op_errno);</div><div class='add'>+    if (!heal_frame) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    heal_local = heal_frame-&gt;local;</div><div class='add'>+    heal_frame-&gt;local = frame-&gt;local;</div><div class='add'>+    /*Initiate heal with heal_frame with lk-owner set so that inodelk/entrylk</div><div class='add'>+     * work correctly*/</div><div class='add'>+    ret = afr_selfheal_do(heal_frame, this, loc-&gt;gfid);</div><div class='add'>+</div><div class='add'>+    if (ret == 1 || ret == 2) {</div><div class='add'>+        ret = dict_set_sizen_str_sizen(dict, "sh-fail-msg",</div><div class='add'>+                                       SFILE_NOT_IN_SPLIT_BRAIN);</div><div class='add'>+        if (ret)</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_WARNING, -ret, AFR_MSG_DICT_SET_FAILED,</div><div class='add'>+                   "Failed to set sh-fail-msg in dict");</div><div class='add'>+        ret = 0;</div><div class='add'>+        goto out;</div><div class='add'>+    } else {</div><div class='add'>+        if (local-&gt;xdata_rsp) {</div><div class='add'>+            /* 'sh-fail-msg' has been set in the dict during self-heal.*/</div><div class='add'>+            dict_copy(local-&gt;xdata_rsp, dict);</div><div class='add'>+            ret = 0;</div><div class='add'>+        } else if (ret &lt; 0) {</div><div class='add'>+            op_errno = -ret;</div><div class='add'>+            ret = -1;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	if (child_index &lt; priv-&gt;child_count) {</div><div class='del'>-		STACK_WIND_COOKIE (frame, afr_lk_cbk, (void *) (long) child_index,</div><div class='del'>-				   priv-&gt;children[child_index],</div><div class='del'>-				   priv-&gt;children[child_index]-&gt;fops-&gt;lk,</div><div class='del'>-				   local-&gt;fd, local-&gt;cont.lk.cmd,</div><div class='del'>-                                   &amp;local-&gt;cont.lk.user_flock);</div><div class='del'>-	} else if (local-&gt;op_ret == -1) {</div><div class='del'>-		/* all nodes have gone down */</div><div class='add'>+out:</div><div class='add'>+    if (heal_frame) {</div><div class='add'>+        heal_frame-&gt;local = heal_local;</div><div class='add'>+        AFR_STACK_DESTROY(heal_frame);</div><div class='add'>+    }</div><div class='add'>+    if (local-&gt;op == GF_FOP_GETXATTR)</div><div class='add'>+        AFR_STACK_UNWIND(getxattr, frame, ret, op_errno, dict, NULL);</div><div class='add'>+    else if (local-&gt;op == GF_FOP_SETXATTR)</div><div class='add'>+        AFR_STACK_UNWIND(setxattr, frame, ret, op_errno, NULL);</div><div class='add'>+    if (dict)</div><div class='add'>+        dict_unref(dict);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-                AFR_STACK_UNWIND (lk, frame, -1, ENOTCONN,</div><div class='del'>-                                  &amp;local-&gt;cont.lk.ret_flock);</div><div class='del'>-	} else {</div><div class='del'>-		/* locking has succeeded on all nodes that are up */</div><div class='add'>+int</div><div class='add'>+afr_get_child_index_from_name(xlator_t *this, char *name)</div><div class='add'>+{</div><div class='add'>+    afr_private_t *priv = this-&gt;private;</div><div class='add'>+    int index = -1;</div><div class='add'>+</div><div class='add'>+    for (index = 0; index &lt; priv-&gt;child_count; index++) {</div><div class='add'>+        if (!strcmp(priv-&gt;children[index]-&gt;name, name))</div><div class='add'>+            goto out;</div><div class='add'>+    }</div><div class='add'>+    index = -1;</div><div class='add'>+out:</div><div class='add'>+    return index;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-		AFR_STACK_UNWIND (lk, frame, local-&gt;op_ret, local-&gt;op_errno,</div><div class='del'>-                                  &amp;local-&gt;cont.lk.ret_flock);</div><div class='del'>-	}</div><div class='add'>+void</div><div class='add'>+afr_priv_need_heal_set(afr_private_t *priv, gf_boolean_t need_heal)</div><div class='add'>+{</div><div class='add'>+    LOCK(&amp;priv-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        priv-&gt;need_heal = need_heal;</div><div class='add'>+    }</div><div class='add'>+    UNLOCK(&amp;priv-&gt;lock);</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	return 0;</div><div class='add'>+void</div><div class='add'>+afr_set_need_heal(xlator_t *this, afr_local_t *local)</div><div class='add'>+{</div><div class='add'>+    int i = 0;</div><div class='add'>+    afr_private_t *priv = this-&gt;private;</div><div class='add'>+    gf_boolean_t need_heal = _gf_false;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+        if (local-&gt;replies[i].valid &amp;&amp; local-&gt;replies[i].need_heal) {</div><div class='add'>+            need_heal = _gf_true;</div><div class='add'>+            break;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    afr_priv_need_heal_set(priv, need_heal);</div><div class='add'>+    return;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+gf_boolean_t</div><div class='add'>+afr_get_need_heal(xlator_t *this)</div><div class='add'>+{</div><div class='add'>+    afr_private_t *priv = this-&gt;private;</div><div class='add'>+    gf_boolean_t need_heal = _gf_true;</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;priv-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        need_heal = priv-&gt;need_heal;</div><div class='add'>+    }</div><div class='add'>+    UNLOCK(&amp;priv-&gt;lock);</div><div class='add'>+    return need_heal;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-afr_lk (call_frame_t *frame, xlator_t *this,</div><div class='del'>-	fd_t *fd, int32_t cmd,</div><div class='del'>-	struct flock *flock)</div><div class='add'>+afr_get_msg_id(char *op_type)</div><div class='ctx'> {</div><div class='del'>-	afr_private_t *priv = NULL;</div><div class='del'>-	afr_local_t *local = NULL;</div><div class='add'>+    if (!strcmp(op_type, GF_AFR_REPLACE_BRICK))</div><div class='add'>+        return AFR_MSG_REPLACE_BRICK_STATUS;</div><div class='add'>+    else if (!strcmp(op_type, GF_AFR_ADD_BRICK))</div><div class='add'>+        return AFR_MSG_ADD_BRICK_STATUS;</div><div class='add'>+    return -1;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	int i = 0;</div><div class='add'>+int</div><div class='add'>+afr_fav_child_reset_sink_xattrs_cbk(int ret, call_frame_t *heal_frame,</div><div class='add'>+                                    void *opaque)</div><div class='add'>+{</div><div class='add'>+    call_frame_t *txn_frame = NULL;</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    afr_local_t *heal_local = NULL;</div><div class='add'>+    xlator_t *this = NULL;</div><div class='ctx'> </div><div class='del'>-	int32_t op_ret   = -1;</div><div class='del'>-	int32_t op_errno = 0;</div><div class='add'>+    heal_local = heal_frame-&gt;local;</div><div class='add'>+    txn_frame = heal_local-&gt;heal_frame;</div><div class='add'>+    local = txn_frame-&gt;local;</div><div class='add'>+    this = txn_frame-&gt;this;</div><div class='ctx'> </div><div class='del'>-	VALIDATE_OR_GOTO (frame, out);</div><div class='del'>-	VALIDATE_OR_GOTO (this, out);</div><div class='del'>-	VALIDATE_OR_GOTO (this-&gt;private, out);</div><div class='add'>+    /* Refresh the inode agan and proceed with the transaction.*/</div><div class='add'>+    afr_inode_refresh(txn_frame, this, local-&gt;inode, NULL, local-&gt;refreshfn);</div><div class='ctx'> </div><div class='del'>-	priv = this-&gt;private;</div><div class='add'>+    AFR_STACK_DESTROY(heal_frame);</div><div class='ctx'> </div><div class='del'>-	ALLOC_OR_GOTO (local, afr_local_t, out);</div><div class='del'>-	AFR_LOCAL_INIT (local, priv);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	frame-&gt;local  = local;</div><div class='add'>+int</div><div class='add'>+afr_fav_child_reset_sink_xattrs(void *opaque)</div><div class='add'>+{</div><div class='add'>+    call_frame_t *heal_frame = NULL;</div><div class='add'>+    call_frame_t *txn_frame = NULL;</div><div class='add'>+    xlator_t *this = NULL;</div><div class='add'>+    gf_boolean_t d_spb = _gf_false;</div><div class='add'>+    gf_boolean_t m_spb = _gf_false;</div><div class='add'>+    afr_local_t *heal_local = NULL;</div><div class='add'>+    afr_local_t *txn_local = NULL;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    inode_t *inode = NULL;</div><div class='add'>+    unsigned char *locked_on = NULL;</div><div class='add'>+    unsigned char *sources = NULL;</div><div class='add'>+    unsigned char *sinks = NULL;</div><div class='add'>+    unsigned char *healed_sinks = NULL;</div><div class='add'>+    unsigned char *undid_pending = NULL;</div><div class='add'>+    struct afr_reply *locked_replies = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    heal_frame = (call_frame_t *)opaque;</div><div class='add'>+    heal_local = heal_frame-&gt;local;</div><div class='add'>+    txn_frame = heal_local-&gt;heal_frame;</div><div class='add'>+    txn_local = txn_frame-&gt;local;</div><div class='add'>+    this = txn_frame-&gt;this;</div><div class='add'>+    inode = txn_local-&gt;inode;</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+    locked_on = alloca0(priv-&gt;child_count);</div><div class='add'>+    sources = alloca0(priv-&gt;child_count);</div><div class='add'>+    sinks = alloca0(priv-&gt;child_count);</div><div class='add'>+    healed_sinks = alloca0(priv-&gt;child_count);</div><div class='add'>+    undid_pending = alloca0(priv-&gt;child_count);</div><div class='add'>+    locked_replies = alloca0(sizeof(*locked_replies) * priv-&gt;child_count);</div><div class='add'>+</div><div class='add'>+    ret = _afr_is_split_brain(txn_frame, this, txn_local-&gt;replies,</div><div class='add'>+                              AFR_DATA_TRANSACTION, &amp;d_spb);</div><div class='add'>+</div><div class='add'>+    ret = _afr_is_split_brain(txn_frame, this, txn_local-&gt;replies,</div><div class='add'>+                              AFR_METADATA_TRANSACTION, &amp;m_spb);</div><div class='add'>+</div><div class='add'>+    /* Take appropriate locks and reset sink xattrs. */</div><div class='add'>+    if (d_spb) {</div><div class='add'>+        ret = afr_selfheal_inodelk(heal_frame, this, inode, this-&gt;name, 0, 0,</div><div class='add'>+                                   locked_on);</div><div class='add'>+        {</div><div class='add'>+            if (ret &lt; priv-&gt;child_count)</div><div class='add'>+                goto data_unlock;</div><div class='add'>+            ret = __afr_selfheal_data_prepare(</div><div class='add'>+                heal_frame, this, inode, locked_on, sources, sinks,</div><div class='add'>+                healed_sinks, undid_pending, locked_replies, NULL);</div><div class='add'>+        }</div><div class='add'>+    data_unlock:</div><div class='add'>+        afr_selfheal_uninodelk(heal_frame, this, inode, this-&gt;name, 0, 0,</div><div class='add'>+                               locked_on);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (m_spb) {</div><div class='add'>+        memset(locked_on, 0, sizeof(*locked_on) * priv-&gt;child_count);</div><div class='add'>+        memset(undid_pending, 0, sizeof(*undid_pending) * priv-&gt;child_count);</div><div class='add'>+        ret = afr_selfheal_inodelk(heal_frame, this, inode, this-&gt;name,</div><div class='add'>+                                   LLONG_MAX - 1, 0, locked_on);</div><div class='add'>+        {</div><div class='add'>+            if (ret &lt; priv-&gt;child_count)</div><div class='add'>+                goto mdata_unlock;</div><div class='add'>+            ret = __afr_selfheal_metadata_prepare(</div><div class='add'>+                heal_frame, this, inode, locked_on, sources, sinks,</div><div class='add'>+                healed_sinks, undid_pending, locked_replies, NULL);</div><div class='add'>+        }</div><div class='add'>+    mdata_unlock:</div><div class='add'>+        afr_selfheal_uninodelk(heal_frame, this, inode, this-&gt;name,</div><div class='add'>+                               LLONG_MAX - 1, 0, locked_on);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	local-&gt;cont.lk.locked_nodes = GF_CALLOC (priv-&gt;child_count,</div><div class='del'>-					      sizeof (*local-&gt;cont.lk.locked_nodes),</div><div class='del'>-                                              gf_afr_mt_char);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	if (!local-&gt;cont.lk.locked_nodes) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_ERROR, "Out of memory");</div><div class='del'>-		op_errno = ENOMEM;</div><div class='del'>-		goto out;</div><div class='del'>-	}</div><div class='add'>+/*</div><div class='add'>+ * Concatenates the xattrs in local-&gt;replies separated by a delimiter.</div><div class='add'>+ */</div><div class='add'>+int</div><div class='add'>+afr_serialize_xattrs_with_delimiter(call_frame_t *frame, xlator_t *this,</div><div class='add'>+                                    char *buf, const char *default_str,</div><div class='add'>+                                    int32_t *serz_len, char delimiter)</div><div class='add'>+{</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    char *xattr = NULL;</div><div class='add'>+    int i = 0;</div><div class='add'>+    int len = 0;</div><div class='add'>+    int keylen = 0;</div><div class='add'>+    size_t str_len = 0;</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+</div><div class='add'>+    keylen = strlen(local-&gt;cont.getxattr.name);</div><div class='add'>+    for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+        if (!local-&gt;replies[i].valid || local-&gt;replies[i].op_ret) {</div><div class='add'>+            str_len = strlen(default_str);</div><div class='add'>+            buf = strncat(buf, default_str, str_len);</div><div class='add'>+            len += str_len;</div><div class='add'>+            buf[len++] = delimiter;</div><div class='add'>+            buf[len] = '\0';</div><div class='add'>+        } else {</div><div class='add'>+            ret = dict_get_strn(local-&gt;replies[i].xattr,</div><div class='add'>+                                local-&gt;cont.getxattr.name, keylen, &amp;xattr);</div><div class='add'>+            if (ret) {</div><div class='add'>+                gf_msg("TEST", GF_LOG_ERROR, -ret, AFR_MSG_DICT_GET_FAILED,</div><div class='add'>+                       "Failed to get the node_uuid of brick "</div><div class='add'>+                       "%d",</div><div class='add'>+                       i);</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+            str_len = strlen(xattr);</div><div class='add'>+            buf = strncat(buf, xattr, str_len);</div><div class='add'>+            len += str_len;</div><div class='add'>+            buf[len++] = delimiter;</div><div class='add'>+            buf[len] = '\0';</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    buf[--len] = '\0'; /*remove the last delimiter*/</div><div class='add'>+    if (serz_len)</div><div class='add'>+        *serz_len = ++len;</div><div class='add'>+    ret = 0;</div><div class='ctx'> </div><div class='del'>-	local-&gt;fd            = fd_ref (fd);</div><div class='del'>-	local-&gt;cont.lk.cmd   = cmd;</div><div class='del'>-        local-&gt;cont.lk.user_flock = *flock;</div><div class='del'>-        local-&gt;cont.lk.ret_flock = *flock;</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	STACK_WIND_COOKIE (frame, afr_lk_cbk, (void *) (long) 0,</div><div class='del'>-			   priv-&gt;children[i],</div><div class='del'>-			   priv-&gt;children[i]-&gt;fops-&gt;lk,</div><div class='del'>-			   fd, cmd, flock);</div><div class='add'>+uint64_t</div><div class='add'>+afr_write_subvol_get(call_frame_t *frame, xlator_t *this)</div><div class='add'>+{</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    uint64_t write_subvol = 0;</div><div class='ctx'> </div><div class='del'>-	op_ret = 0;</div><div class='del'>-out:</div><div class='del'>-	if (op_ret == -1) {</div><div class='del'>-		AFR_STACK_UNWIND (lk, frame, op_ret, op_errno, NULL);</div><div class='del'>-	}</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-afr_priv_dump (xlator_t *this)</div><div class='del'>-{</div><div class='del'>-	afr_private_t *priv = NULL;</div><div class='del'>-        char  key_prefix[GF_DUMP_MAX_BUF_LEN];</div><div class='del'>-        char  key[GF_DUMP_MAX_BUF_LEN];</div><div class='del'>-        int   i = 0;</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-        assert(this);</div><div class='del'>-	priv = this-&gt;private;</div><div class='del'>-</div><div class='del'>-        assert(priv);</div><div class='del'>-        snprintf(key_prefix, GF_DUMP_MAX_BUF_LEN, "%s.%s", this-&gt;type, this-&gt;name);</div><div class='del'>-        gf_proc_dump_add_section(key_prefix);</div><div class='del'>-        gf_proc_dump_build_key(key, key_prefix, "child_count");</div><div class='del'>-        gf_proc_dump_write(key, "%u", priv-&gt;child_count);</div><div class='del'>-        gf_proc_dump_build_key(key, key_prefix, "read_child_rr");</div><div class='del'>-        gf_proc_dump_write(key, "%u", priv-&gt;read_child_rr);</div><div class='del'>-	for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='del'>-                gf_proc_dump_build_key(key, key_prefix, "child_up[%d]", i);</div><div class='del'>-                gf_proc_dump_write(key, "%d", priv-&gt;child_up[i]);</div><div class='del'>-                gf_proc_dump_build_key(key, key_prefix,</div><div class='del'>-                                        "pending_key[%d]", i);</div><div class='del'>-                gf_proc_dump_write(key, "%s", priv-&gt;pending_key[i]);</div><div class='del'>-        }</div><div class='del'>-        gf_proc_dump_build_key(key, key_prefix, "data_self_heal");</div><div class='del'>-        gf_proc_dump_write(key, "%d", priv-&gt;data_self_heal);</div><div class='del'>-        gf_proc_dump_build_key(key, key_prefix, "metadata_self_heal");</div><div class='del'>-        gf_proc_dump_write(key, "%d", priv-&gt;metadata_self_heal);</div><div class='del'>-        gf_proc_dump_build_key(key, key_prefix, "entry_self_heal");</div><div class='del'>-        gf_proc_dump_write(key, "%d", priv-&gt;entry_self_heal);</div><div class='del'>-        gf_proc_dump_build_key(key, key_prefix, "data_change_log");</div><div class='del'>-        gf_proc_dump_write(key, "%d", priv-&gt;data_change_log);</div><div class='del'>-        gf_proc_dump_build_key(key, key_prefix, "metadata_change_log");</div><div class='del'>-        gf_proc_dump_write(key, "%d", priv-&gt;metadata_change_log);</div><div class='del'>-        gf_proc_dump_build_key(key, key_prefix, "entry_change_log");</div><div class='del'>-        gf_proc_dump_write(key, "%d", priv-&gt;entry_change_log);</div><div class='del'>-        gf_proc_dump_build_key(key, key_prefix, "read_child");</div><div class='del'>-        gf_proc_dump_write(key, "%d", priv-&gt;read_child);</div><div class='del'>-        gf_proc_dump_build_key(key, key_prefix, "favorite_child");</div><div class='del'>-        gf_proc_dump_write(key, "%u", priv-&gt;favorite_child);</div><div class='del'>-        gf_proc_dump_build_key(key, key_prefix, "data_lock_server_count");</div><div class='del'>-        gf_proc_dump_write(key, "%u", priv-&gt;data_lock_server_count);</div><div class='del'>-        gf_proc_dump_build_key(key, key_prefix, "metadata_lock_server_count");</div><div class='del'>-        gf_proc_dump_write(key, "%u", priv-&gt;metadata_lock_server_count);</div><div class='del'>-        gf_proc_dump_build_key(key, key_prefix, "entry_lock_server_count");</div><div class='del'>-        gf_proc_dump_write(key, "%u", priv-&gt;entry_lock_server_count);</div><div class='del'>-        gf_proc_dump_build_key(key, key_prefix, "wait_count");</div><div class='del'>-        gf_proc_dump_write(key, "%u", priv-&gt;wait_count);</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    LOCK(&amp;local-&gt;inode-&gt;lock);</div><div class='add'>+    write_subvol = local-&gt;inode_ctx-&gt;write_subvol;</div><div class='add'>+    UNLOCK(&amp;local-&gt;inode-&gt;lock);</div><div class='ctx'> </div><div class='del'>-        return 0;</div><div class='add'>+    return write_subvol;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+int</div><div class='add'>+afr_write_subvol_set(call_frame_t *frame, xlator_t *this)</div><div class='add'>+{</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    unsigned char *data_accused = NULL;</div><div class='add'>+    unsigned char *metadata_accused = NULL;</div><div class='add'>+    unsigned char *data_readable = NULL;</div><div class='add'>+    unsigned char *metadata_readable = NULL;</div><div class='add'>+    uint16_t datamap = 0;</div><div class='add'>+    uint16_t metadatamap = 0;</div><div class='add'>+    uint64_t val = 0;</div><div class='add'>+    int event = 0;</div><div class='add'>+    int i = 0;</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+    data_accused = alloca0(priv-&gt;child_count);</div><div class='add'>+    metadata_accused = alloca0(priv-&gt;child_count);</div><div class='add'>+    data_readable = alloca0(priv-&gt;child_count);</div><div class='add'>+    metadata_readable = alloca0(priv-&gt;child_count);</div><div class='add'>+    event = local-&gt;event_generation;</div><div class='add'>+</div><div class='add'>+    afr_readables_fill(frame, this, local-&gt;inode, data_accused,</div><div class='add'>+                       metadata_accused, data_readable, metadata_readable,</div><div class='add'>+                       NULL);</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+        if (data_readable[i])</div><div class='add'>+            datamap |= (1 &lt;&lt; i);</div><div class='add'>+        if (metadata_readable[i])</div><div class='add'>+            metadatamap |= (1 &lt;&lt; i);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    val = ((uint64_t)metadatamap) | (((uint64_t)datamap) &lt;&lt; 16) |</div><div class='add'>+          (((uint64_t)event) &lt;&lt; 32);</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;local-&gt;inode-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        if (local-&gt;inode_ctx-&gt;write_subvol == 0 &amp;&amp;</div><div class='add'>+            local-&gt;transaction.type == AFR_DATA_TRANSACTION) {</div><div class='add'>+            local-&gt;inode_ctx-&gt;write_subvol = val;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    UNLOCK(&amp;local-&gt;inode-&gt;lock);</div><div class='ctx'> </div><div class='del'>-/**</div><div class='del'>- * find_child_index - find the child's index in the array of subvolumes</div><div class='del'>- * @this: AFR</div><div class='del'>- * @child: child</div><div class='del'>- */</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-static int</div><div class='del'>-find_child_index (xlator_t *this, xlator_t *child)</div><div class='add'>+int</div><div class='add'>+afr_write_subvol_reset(call_frame_t *frame, xlator_t *this)</div><div class='ctx'> {</div><div class='del'>-	afr_private_t *priv = NULL;</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='ctx'> </div><div class='del'>-	int i = -1;</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    LOCK(&amp;local-&gt;inode-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        GF_ASSERT(local-&gt;inode_ctx-&gt;lock_count &gt; 0);</div><div class='add'>+        local-&gt;inode_ctx-&gt;lock_count--;</div><div class='ctx'> </div><div class='del'>-	priv = this-&gt;private;</div><div class='add'>+        if (!local-&gt;inode_ctx-&gt;lock_count)</div><div class='add'>+            local-&gt;inode_ctx-&gt;write_subvol = 0;</div><div class='add'>+    }</div><div class='add'>+    UNLOCK(&amp;local-&gt;inode-&gt;lock);</div><div class='ctx'> </div><div class='del'>-	for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='del'>-		if ((xlator_t *) child == priv-&gt;children[i])</div><div class='del'>-			break;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	return i;</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-int32_t</div><div class='del'>-afr_notify (xlator_t *this, int32_t event,</div><div class='del'>-            void *data, ...)</div><div class='add'>+int</div><div class='add'>+afr_set_inode_local(xlator_t *this, afr_local_t *local, inode_t *inode)</div><div class='ctx'> {</div><div class='del'>-	afr_private_t *     priv     = NULL;</div><div class='del'>-	unsigned char *     child_up = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    local-&gt;inode = inode_ref(inode);</div><div class='add'>+    LOCK(&amp;local-&gt;inode-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        ret = __afr_inode_ctx_get(this, local-&gt;inode, &amp;local-&gt;inode_ctx);</div><div class='add'>+    }</div><div class='add'>+    UNLOCK(&amp;local-&gt;inode-&gt;lock);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        gf_msg_callingfn(</div><div class='add'>+            this-&gt;name, GF_LOG_ERROR, ENOMEM, AFR_MSG_INODE_CTX_GET_FAILED,</div><div class='add'>+            "Error getting inode ctx %s", uuid_utoa(local-&gt;inode-&gt;gfid));</div><div class='add'>+    }</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	int i           = -1;</div><div class='del'>-	int up_children = 0;</div><div class='add'>+gf_boolean_t</div><div class='add'>+afr_ta_is_fop_called_from_synctask(xlator_t *this)</div><div class='add'>+{</div><div class='add'>+    struct synctask *task = NULL;</div><div class='add'>+    gf_lkowner_t tmp_owner = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='ctx'> </div><div class='del'>-	priv = this-&gt;private;</div><div class='add'>+    task = synctask_get();</div><div class='add'>+    if (!task)</div><div class='add'>+        return _gf_false;</div><div class='ctx'> </div><div class='del'>-	if (!priv)</div><div class='del'>-		return 0;</div><div class='add'>+    set_lk_owner_from_ptr(&amp;tmp_owner, (void *)this);</div><div class='ctx'> </div><div class='del'>-	child_up = priv-&gt;child_up;</div><div class='add'>+    if (!is_same_lkowner(&amp;tmp_owner, &amp;task-&gt;frame-&gt;root-&gt;lk_owner))</div><div class='add'>+        return _gf_false;</div><div class='ctx'> </div><div class='del'>-	switch (event) {</div><div class='del'>-	case GF_EVENT_CHILD_UP:</div><div class='del'>-		i = find_child_index (this, data);</div><div class='add'>+    return _gf_true;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-		child_up[i] = 1;</div><div class='add'>+int</div><div class='add'>+afr_ta_post_op_lock(xlator_t *this, loc_t *loc)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+    uuid_t gfid = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    afr_private_t *priv = this-&gt;private;</div><div class='add'>+    gf_boolean_t locked = _gf_false;</div><div class='add'>+    struct gf_flock flock1 = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    struct gf_flock flock2 = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int32_t cmd = 0;</div><div class='add'>+</div><div class='add'>+    /* Clients must take AFR_TA_DOM_NOTIFY lock only when the previous lock</div><div class='add'>+     * has been released in afr_notify due to upcall notification from shd.</div><div class='add'>+     */</div><div class='add'>+    GF_ASSERT(priv-&gt;ta_notify_dom_lock_offset == 0);</div><div class='add'>+</div><div class='add'>+    if (!priv-&gt;shd.iamshd)</div><div class='add'>+        GF_ASSERT(afr_ta_is_fop_called_from_synctask(this));</div><div class='add'>+    flock1.l_type = F_WRLCK;</div><div class='add'>+</div><div class='add'>+    while (!locked) {</div><div class='add'>+        if (priv-&gt;shd.iamshd) {</div><div class='add'>+            cmd = F_SETLKW;</div><div class='add'>+            flock1.l_start = 0;</div><div class='add'>+            flock1.l_len = 0;</div><div class='add'>+        } else {</div><div class='add'>+            cmd = F_SETLK;</div><div class='add'>+            gf_uuid_generate(gfid);</div><div class='add'>+            flock1.l_start = gfid_to_ino(gfid);</div><div class='add'>+            if (flock1.l_start &lt; 0)</div><div class='add'>+                flock1.l_start = -flock1.l_start;</div><div class='add'>+            flock1.l_len = 1;</div><div class='add'>+        }</div><div class='add'>+        ret = syncop_inodelk(priv-&gt;children[THIN_ARBITER_BRICK_INDEX],</div><div class='add'>+                             AFR_TA_DOM_NOTIFY, loc, cmd, &amp;flock1, NULL, NULL);</div><div class='add'>+        if (!ret) {</div><div class='add'>+            locked = _gf_true;</div><div class='add'>+            priv-&gt;ta_notify_dom_lock_offset = flock1.l_start;</div><div class='add'>+        } else if (ret == -EAGAIN) {</div><div class='add'>+            continue;</div><div class='add'>+        } else {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, -ret, AFR_MSG_THIN_ARB,</div><div class='add'>+                   "Failed to get "</div><div class='add'>+                   "AFR_TA_DOM_NOTIFY lock on %s.",</div><div class='add'>+                   loc-&gt;name);</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    flock2.l_type = F_WRLCK;</div><div class='add'>+    flock2.l_start = 0;</div><div class='add'>+    flock2.l_len = 0;</div><div class='add'>+    ret = syncop_inodelk(priv-&gt;children[THIN_ARBITER_BRICK_INDEX],</div><div class='add'>+                         AFR_TA_DOM_MODIFY, loc, F_SETLKW, &amp;flock2, NULL, NULL);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_ERROR, -ret, AFR_MSG_THIN_ARB,</div><div class='add'>+               "Failed to get AFR_TA_DOM_MODIFY lock on %s.", loc-&gt;name);</div><div class='add'>+        flock1.l_type = F_UNLCK;</div><div class='add'>+        ret = syncop_inodelk(priv-&gt;children[THIN_ARBITER_BRICK_INDEX],</div><div class='add'>+                             AFR_TA_DOM_NOTIFY, loc, F_SETLK, &amp;flock1, NULL,</div><div class='add'>+                             NULL);</div><div class='add'>+    }</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-                LOCK (&amp;priv-&gt;lock);</div><div class='del'>-                {</div><div class='del'>-                        priv-&gt;up_count++;</div><div class='del'>-                }</div><div class='del'>-                UNLOCK (&amp;priv-&gt;lock);</div><div class='add'>+int</div><div class='add'>+afr_ta_post_op_unlock(xlator_t *this, loc_t *loc)</div><div class='add'>+{</div><div class='add'>+    afr_private_t *priv = this-&gt;private;</div><div class='add'>+    struct gf_flock flock = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    if (!priv-&gt;shd.iamshd)</div><div class='add'>+        GF_ASSERT(afr_ta_is_fop_called_from_synctask(this));</div><div class='add'>+    flock.l_type = F_UNLCK;</div><div class='add'>+    flock.l_start = 0;</div><div class='add'>+    flock.l_len = 0;</div><div class='add'>+</div><div class='add'>+    ret = syncop_inodelk(priv-&gt;children[THIN_ARBITER_BRICK_INDEX],</div><div class='add'>+                         AFR_TA_DOM_MODIFY, loc, F_SETLK, &amp;flock, NULL, NULL);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_ERROR, -ret, AFR_MSG_THIN_ARB,</div><div class='add'>+               "Failed to unlock AFR_TA_DOM_MODIFY lock.");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (!priv-&gt;shd.iamshd)</div><div class='add'>+        /* Mounts (clients) will not release the AFR_TA_DOM_NOTIFY lock</div><div class='add'>+         * in post-op as they use it as a notification mechanism. When</div><div class='add'>+         * shd sends a lock request on TA during heal, the clients will</div><div class='add'>+         * receive a lock-contention upcall notification upon which they</div><div class='add'>+         * will release the AFR_TA_DOM_NOTIFY lock after completing the</div><div class='add'>+         * in flight I/O.*/</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    ret = syncop_inodelk(priv-&gt;children[THIN_ARBITER_BRICK_INDEX],</div><div class='add'>+                         AFR_TA_DOM_NOTIFY, loc, F_SETLK, &amp;flock, NULL, NULL);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_ERROR, -ret, AFR_MSG_THIN_ARB,</div><div class='add'>+               "Failed to unlock AFR_TA_DOM_NOTIFY lock.");</div><div class='add'>+    }</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-		/*</div><div class='del'>-		   if all the children were down, and one child came up,</div><div class='del'>-		   send notify to parent</div><div class='del'>-		*/</div><div class='add'>+call_frame_t *</div><div class='add'>+afr_ta_frame_create(xlator_t *this)</div><div class='add'>+{</div><div class='add'>+    call_frame_t *frame = NULL;</div><div class='add'>+    void *lk_owner = NULL;</div><div class='add'>+</div><div class='add'>+    frame = create_frame(this, this-&gt;ctx-&gt;pool);</div><div class='add'>+    if (!frame)</div><div class='add'>+        return NULL;</div><div class='add'>+    lk_owner = (void *)this;</div><div class='add'>+    afr_set_lk_owner(frame, this, lk_owner);</div><div class='add'>+    return frame;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-		for (i = 0; i &lt; priv-&gt;child_count; i++)</div><div class='del'>-			if (child_up[i])</div><div class='del'>-				up_children++;</div><div class='add'>+gf_boolean_t</div><div class='add'>+afr_ta_has_quorum(afr_private_t *priv, afr_local_t *local)</div><div class='add'>+{</div><div class='add'>+    int data_count = 0;</div><div class='ctx'> </div><div class='del'>-		if (up_children == 1) {</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_NORMAL,</div><div class='del'>-                                "Subvolume '%s' came back up; "</div><div class='del'>-                                "going online.", ((xlator_t *)data)-&gt;name);</div><div class='add'>+    data_count = AFR_COUNT(local-&gt;child_up, priv-&gt;child_count);</div><div class='add'>+    if (data_count == 2) {</div><div class='add'>+        return _gf_true;</div><div class='add'>+    } else if (data_count == 1 &amp;&amp; local-&gt;ta_child_up) {</div><div class='add'>+        return _gf_true;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-			default_notify (this, event, data);</div><div class='del'>-                }</div><div class='add'>+    return _gf_false;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-		break;</div><div class='add'>+static gf_boolean_t</div><div class='add'>+afr_is_add_replica_mount_lookup_on_root(call_frame_t *frame)</div><div class='add'>+{</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='ctx'> </div><div class='del'>-	case GF_EVENT_CHILD_DOWN:</div><div class='del'>-		i = find_child_index (this, data);</div><div class='add'>+    if (frame-&gt;root-&gt;pid != GF_CLIENT_PID_ADD_REPLICA_MOUNT)</div><div class='add'>+        return _gf_false;</div><div class='ctx'> </div><div class='del'>-		child_up[i] = 0;</div><div class='add'>+    local = frame-&gt;local;</div><div class='ctx'> </div><div class='del'>-                LOCK (&amp;priv-&gt;lock);</div><div class='del'>-                {</div><div class='del'>-                        priv-&gt;down_count++;</div><div class='del'>-                }</div><div class='del'>-                UNLOCK (&amp;priv-&gt;lock);</div><div class='add'>+    if (local-&gt;op != GF_FOP_LOOKUP)</div><div class='add'>+        /* TODO:If the replica count is being increased on a plain distribute</div><div class='add'>+         * volume that was never mounted, we need to allow setxattr on '/' with</div><div class='add'>+         * GF_CLIENT_PID_NO_ROOT_SQUASH to accomodate for DHT layout setting */</div><div class='add'>+        return _gf_false;</div><div class='ctx'> </div><div class='del'>-		/*</div><div class='del'>-		   if all children are down, and this was the last to go down,</div><div class='del'>-		   send notify to parent</div><div class='del'>-		*/</div><div class='add'>+    if (local-&gt;inode == NULL)</div><div class='add'>+        return _gf_false;</div><div class='ctx'> </div><div class='del'>-		for (i = 0; i &lt; priv-&gt;child_count; i++)</div><div class='del'>-			if (child_up[i])</div><div class='del'>-				up_children++;</div><div class='add'>+    if (!__is_root_gfid(local-&gt;inode-&gt;gfid))</div><div class='add'>+        return _gf_false;</div><div class='ctx'> </div><div class='del'>-		if (up_children == 0) {</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-                                "All subvolumes are down. Going offline "</div><div class='del'>-                                "until atleast one of them comes back up.");</div><div class='add'>+    return _gf_true;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-			default_notify (this, event, data);</div><div class='del'>-                }</div><div class='add'>+gf_boolean_t</div><div class='add'>+afr_lookup_has_quorum(call_frame_t *frame, const unsigned int up_children_count)</div><div class='add'>+{</div><div class='add'>+    if (frame &amp;&amp; (up_children_count &gt; 0) &amp;&amp;</div><div class='add'>+        afr_is_add_replica_mount_lookup_on_root(frame))</div><div class='add'>+        return _gf_true;</div><div class='ctx'> </div><div class='del'>-		break;</div><div class='add'>+    return _gf_false;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	default:</div><div class='del'>-		default_notify (this, event, data);</div><div class='del'>-	}</div><div class='add'>+void</div><div class='add'>+afr_handle_replies_quorum(call_frame_t *frame, xlator_t *this)</div><div class='add'>+{</div><div class='add'>+    afr_local_t *local = frame-&gt;local;</div><div class='add'>+    afr_private_t *priv = this-&gt;private;</div><div class='add'>+    unsigned char *success_replies = NULL;</div><div class='add'>+</div><div class='add'>+    success_replies = alloca0(priv-&gt;child_count);</div><div class='add'>+    afr_fill_success_replies(local, priv, success_replies);</div><div class='add'>+</div><div class='add'>+    if (priv-&gt;quorum_count &amp;&amp; !afr_has_quorum(success_replies, this, NULL)) {</div><div class='add'>+        local-&gt;op_errno = afr_final_errno(local, priv);</div><div class='add'>+        if (!local-&gt;op_errno)</div><div class='add'>+            local-&gt;op_errno = afr_quorum_errno(priv);</div><div class='add'>+        local-&gt;op_ret = -1;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	return 0;</div><div class='add'>+gf_boolean_t</div><div class='add'>+afr_ta_dict_contains_pending_xattr(dict_t *dict, afr_private_t *priv, int child)</div><div class='add'>+{</div><div class='add'>+    int *pending = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    int i = 0;</div><div class='add'>+</div><div class='add'>+    ret = dict_get_ptr(dict, priv-&gt;pending_key[child], (void *)&amp;pending);</div><div class='add'>+    if (ret == 0) {</div><div class='add'>+        for (i = 0; i &lt; AFR_NUM_CHANGE_LOGS; i++) {</div><div class='add'>+            /* Not doing a ntoh32(pending) as we just want to check</div><div class='add'>+             * if it is non-zero or not. */</div><div class='add'>+            if (pending[i]) {</div><div class='add'>+                return _gf_true;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='ctx'> </div><div class='add'>+    return _gf_false;</div><div class='ctx'> }</div><div class='head'>diff --git a/xlators/cluster/afr/src/afr-dir-read.c b/xlators/cluster/afr/src/afr-dir-read.c<br/>index 1f29cc006f1..f8bf8340dab 100644<br/>--- a/<a href='/cgit/glusterfs.git/tree/xlators/cluster/afr/src/afr-dir-read.c?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/cluster/afr/src/afr-dir-read.c</a><br/>+++ b/<a href='/cgit/glusterfs.git/tree/xlators/cluster/afr/src/afr-dir-read.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>xlators/cluster/afr/src/afr-dir-read.c</a></div><div class='hunk'>@@ -1,743 +1,346 @@</div><div class='ctx'> /*</div><div class='del'>-   Copyright (c) 2007-2009 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='del'>-   This file is part of GlusterFS.</div><div class='del'>-</div><div class='del'>-   GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-   it under the terms of the GNU General Public License as published</div><div class='del'>-   by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-   or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-   GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-   WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-   General Public License for more details.</div><div class='del'>-</div><div class='del'>-   You should have received a copy of the GNU General Public License</div><div class='del'>-   along with this program.  If not, see</div><div class='del'>-   &lt;http://www.gnu.org/licenses/&gt;.</div><div class='del'>-*/</div><div class='add'>+  Copyright (c) 2008-2012 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='ctx'> </div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='ctx'> </div><div class='ctx'> #include &lt;libgen.h&gt;</div><div class='ctx'> #include &lt;unistd.h&gt;</div><div class='del'>-#include &lt;fnmatch.h&gt;</div><div class='ctx'> #include &lt;sys/time.h&gt;</div><div class='ctx'> #include &lt;stdlib.h&gt;</div><div class='ctx'> #include &lt;signal.h&gt;</div><div class='ctx'> #include &lt;string.h&gt;</div><div class='ctx'> </div><div class='del'>-#ifndef _CONFIG_H</div><div class='del'>-#define _CONFIG_H</div><div class='del'>-#include "config.h"</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-#include "glusterfs.h"</div><div class='del'>-#include "dict.h"</div><div class='del'>-#include "xlator.h"</div><div class='del'>-#include "hashfn.h"</div><div class='del'>-#include "logging.h"</div><div class='del'>-#include "stack.h"</div><div class='del'>-#include "list.h"</div><div class='del'>-#include "call-stub.h"</div><div class='del'>-#include "defaults.h"</div><div class='del'>-#include "common-utils.h"</div><div class='del'>-#include "compat-errno.h"</div><div class='del'>-#include "compat.h"</div><div class='del'>-#include "checksum.h"</div><div class='add'>+#include &lt;glusterfs/glusterfs.h&gt;</div><div class='add'>+#include &lt;glusterfs/dict.h&gt;</div><div class='add'>+#include &lt;glusterfs/list.h&gt;</div><div class='add'>+#include &lt;glusterfs/common-utils.h&gt;</div><div class='add'>+#include &lt;glusterfs/compat-errno.h&gt;</div><div class='add'>+#include &lt;glusterfs/compat.h&gt;</div><div class='ctx'> </div><div class='ctx'> #include "afr.h"</div><div class='del'>-#include "afr-self-heal.h"</div><div class='del'>-#include "afr-self-heal-common.h"</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-afr_examine_dir_sh_unwind (call_frame_t *frame, xlator_t *this)</div><div class='del'>-{</div><div class='del'>-        afr_local_t *local  = NULL;</div><div class='del'>-</div><div class='del'>-        local = frame-&gt;local;</div><div class='del'>-</div><div class='del'>-        afr_set_opendir_done (this, local-&gt;fd-&gt;inode);</div><div class='del'>-</div><div class='del'>-        AFR_STACK_UNWIND (opendir, frame, local-&gt;op_ret,</div><div class='del'>-                          local-&gt;op_errno, local-&gt;fd);</div><div class='del'>-</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-gf_boolean_t</div><div class='del'>-__checksums_differ (uint32_t *checksum, int child_count,</div><div class='del'>-                    unsigned char *child_up)</div><div class='del'>-{</div><div class='del'>-        int ret = _gf_false;</div><div class='del'>-        int i = 0;</div><div class='del'>-</div><div class='del'>-        uint32_t cksum;</div><div class='del'>-</div><div class='del'>-        cksum = checksum[0];</div><div class='del'>-</div><div class='del'>-        for (i = 0; i &lt; child_count; i++) {</div><div class='del'>-                if (!child_up[i])</div><div class='del'>-                        continue;</div><div class='del'>-</div><div class='del'>-                if (cksum != checksum[i]) {</div><div class='del'>-                        ret = _gf_true;</div><div class='del'>-                        break;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                cksum = checksum[i];</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='add'>+#include "afr-transaction.h"</div><div class='ctx'> </div><div class='ctx'> int32_t</div><div class='del'>-afr_examine_dir_readdir_cbk (call_frame_t *frame, void *cookie,</div><div class='del'>-                             xlator_t *this, int32_t op_ret, int32_t op_errno,</div><div class='del'>-                             gf_dirent_t *entries)</div><div class='add'>+afr_opendir_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                int32_t op_ret, int32_t op_errno, fd_t *fd, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-	afr_private_t *    priv  = NULL;</div><div class='del'>-	afr_local_t *      local = NULL;</div><div class='del'>-        afr_self_heal_t *  sh    = NULL;</div><div class='del'>-</div><div class='del'>-        gf_dirent_t * entry = NULL;</div><div class='del'>-        gf_dirent_t * tmp   = NULL;</div><div class='del'>-</div><div class='del'>-        int child_index = 0;</div><div class='del'>-</div><div class='del'>-        uint32_t entry_cksum;</div><div class='del'>-</div><div class='del'>-        int   call_count    = 0;</div><div class='del'>-        off_t last_offset = 0;</div><div class='del'>-        char  sh_type_str[256] = {0,};</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    int call_count = -1;</div><div class='add'>+    int32_t child_index = 0;</div><div class='add'>+    afr_fd_ctx_t *fd_ctx = NULL;</div><div class='ctx'> </div><div class='del'>-        priv  = this-&gt;private;</div><div class='del'>-        local = frame-&gt;local;</div><div class='del'>-        sh    = &amp;local-&gt;self_heal;</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    fd_ctx = local-&gt;fd_ctx;</div><div class='add'>+    child_index = (long)cookie;</div><div class='ctx'> </div><div class='del'>-        child_index = (long) cookie;</div><div class='add'>+    local-&gt;replies[child_index].valid = 1;</div><div class='add'>+    local-&gt;replies[child_index].op_ret = op_ret;</div><div class='add'>+    local-&gt;replies[child_index].op_errno = op_errno;</div><div class='ctx'> </div><div class='add'>+    LOCK(&amp;frame-&gt;lock);</div><div class='add'>+    {</div><div class='ctx'>         if (op_ret == -1) {</div><div class='del'>-                local-&gt;op_ret = -1;</div><div class='del'>-                local-&gt;op_ret = op_errno;</div><div class='del'>-                goto out;</div><div class='add'>+            local-&gt;op_errno = op_errno;</div><div class='add'>+            fd_ctx-&gt;opened_on[child_index] = AFR_FD_NOT_OPENED;</div><div class='add'>+        } else {</div><div class='add'>+            local-&gt;op_ret = op_ret;</div><div class='add'>+            fd_ctx-&gt;opened_on[child_index] = AFR_FD_OPENED;</div><div class='add'>+            if (!local-&gt;xdata_rsp &amp;&amp; xdata)</div><div class='add'>+                local-&gt;xdata_rsp = dict_ref(xdata);</div><div class='ctx'>         }</div><div class='add'>+        call_count = --local-&gt;call_count;</div><div class='add'>+    }</div><div class='add'>+    UNLOCK(&amp;frame-&gt;lock);</div><div class='ctx'> </div><div class='del'>-        if (op_ret == 0)</div><div class='del'>-                goto out;</div><div class='add'>+    if (call_count == 0) {</div><div class='add'>+        afr_handle_replies_quorum(frame, this);</div><div class='add'>+        AFR_STACK_UNWIND(opendir, frame, local-&gt;op_ret, local-&gt;op_errno,</div><div class='add'>+                         local-&gt;fd, NULL);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        list_for_each_entry_safe (entry, tmp, &amp;entries-&gt;list, list) {</div><div class='del'>-                entry_cksum = gf_rsync_weak_checksum (entry-&gt;d_name,</div><div class='del'>-                                                      strlen (entry-&gt;d_name));</div><div class='del'>-                local-&gt;cont.opendir.checksum[child_index] ^= entry_cksum;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        list_for_each_entry (entry, &amp;entries-&gt;list, list) {</div><div class='del'>-                last_offset = entry-&gt;d_off;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        /* read more entries */</div><div class='del'>-</div><div class='del'>-        STACK_WIND_COOKIE (frame, afr_examine_dir_readdir_cbk,</div><div class='del'>-                           (void *) (long) child_index,</div><div class='del'>-                           priv-&gt;children[child_index],</div><div class='del'>-                           priv-&gt;children[child_index]-&gt;fops-&gt;readdir,</div><div class='del'>-                           local-&gt;fd, 131072, last_offset);</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        if ((op_ret == 0) || (op_ret == -1)) {</div><div class='del'>-                call_count = afr_frame_return (frame);</div><div class='del'>-</div><div class='del'>-                if (call_count == 0) {</div><div class='del'>-                        if (__checksums_differ (local-&gt;cont.opendir.checksum,</div><div class='del'>-                                                priv-&gt;child_count,</div><div class='del'>-                                                local-&gt;child_up)) {</div><div class='del'>-</div><div class='del'>-                                sh-&gt;need_entry_self_heal  = _gf_true;</div><div class='del'>-                                sh-&gt;forced_merge          = _gf_true;</div><div class='del'>-                                sh-&gt;type                  = local-&gt;fd-&gt;inode-&gt;ia_type;</div><div class='del'>-                                sh-&gt;background            = _gf_false;</div><div class='del'>-                                sh-&gt;unwind                = afr_examine_dir_sh_unwind;</div><div class='del'>-</div><div class='del'>-                                afr_self_heal_type_str_get(&amp;local-&gt;self_heal,</div><div class='del'>-                                                           sh_type_str,</div><div class='del'>-                                                           sizeof(sh_type_str));</div><div class='del'>-                                gf_log (this-&gt;name, GF_LOG_NORMAL,</div><div class='del'>-                                        "%s self-heal triggered. path: %s, "</div><div class='del'>-                                         "reason: checksums of directory differ,"</div><div class='del'>-                                        " forced merge option set",</div><div class='del'>-                                        sh_type_str, local-&gt;loc.path);</div><div class='del'>-</div><div class='del'>-                                afr_self_heal (frame, this);</div><div class='del'>-                        } else {</div><div class='del'>-                                afr_set_opendir_done (this, local-&gt;fd-&gt;inode);</div><div class='del'>-</div><div class='del'>-                                AFR_STACK_UNWIND (opendir, frame, local-&gt;op_ret,</div><div class='del'>-                                                  local-&gt;op_errno, local-&gt;fd);</div><div class='del'>-                        }</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        return 0;</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-afr_examine_dir (call_frame_t *frame, xlator_t *this)</div><div class='add'>+afr_opendir(call_frame_t *frame, xlator_t *this, loc_t *loc, fd_t *fd,</div><div class='add'>+            dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-        afr_private_t * priv  = NULL;</div><div class='del'>-        afr_local_t *   local = NULL;</div><div class='del'>-</div><div class='del'>-        int i;</div><div class='del'>-        int call_count = 0;</div><div class='del'>-</div><div class='del'>-        local = frame-&gt;local;</div><div class='del'>-        priv  = this-&gt;private;</div><div class='del'>-</div><div class='del'>-        local-&gt;cont.opendir.checksum = GF_CALLOC (priv-&gt;child_count,</div><div class='del'>-                                        sizeof (*local-&gt;cont.opendir.checksum),</div><div class='del'>-                                        gf_afr_mt_int32_t);</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    int i = 0;</div><div class='add'>+    int call_count = -1;</div><div class='add'>+    int32_t op_errno = ENOMEM;</div><div class='add'>+    afr_fd_ctx_t *fd_ctx = NULL;</div><div class='ctx'> </div><div class='del'>-        call_count = afr_up_children_count (priv-&gt;child_count, local-&gt;child_up);</div><div class='add'>+    priv = this-&gt;private;</div><div class='ctx'> </div><div class='del'>-        local-&gt;call_count = call_count;</div><div class='add'>+    local = AFR_FRAME_INIT(frame, op_errno);</div><div class='add'>+    if (!local)</div><div class='add'>+        goto out;</div><div class='ctx'> </div><div class='del'>-        for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='del'>-                if (local-&gt;child_up[i]) {</div><div class='del'>-                        STACK_WIND_COOKIE (frame, afr_examine_dir_readdir_cbk,</div><div class='del'>-                                           (void *) (long) i,</div><div class='del'>-                                           priv-&gt;children[i],</div><div class='del'>-                                           priv-&gt;children[i]-&gt;fops-&gt;readdir,</div><div class='del'>-                                           local-&gt;fd, 131072, 0);</div><div class='add'>+    local-&gt;op = GF_FOP_OPENDIR;</div><div class='ctx'> </div><div class='del'>-                        if (!--call_count)</div><div class='del'>-                                break;</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-afr_opendir_cbk (call_frame_t *frame, void *cookie,</div><div class='del'>-		 xlator_t *this, int32_t op_ret, int32_t op_errno,</div><div class='del'>-		 fd_t *fd)</div><div class='del'>-{</div><div class='del'>-        afr_private_t *priv              = NULL;</div><div class='del'>-	afr_local_t   *local             = NULL;</div><div class='del'>-        int32_t        up_children_count = 0;</div><div class='del'>-</div><div class='del'>-	int call_count = -1;</div><div class='del'>-</div><div class='del'>-        priv  = this-&gt;private;</div><div class='del'>-        local = frame-&gt;local;</div><div class='del'>-</div><div class='del'>-        up_children_count = afr_up_children_count (priv-&gt;child_count,</div><div class='del'>-                                                   local-&gt;child_up);</div><div class='del'>-</div><div class='del'>-	LOCK (&amp;frame-&gt;lock);</div><div class='del'>-	{</div><div class='del'>-		if (op_ret &gt;= 0)</div><div class='del'>-			local-&gt;op_ret = op_ret;</div><div class='del'>-</div><div class='del'>-		local-&gt;op_errno = op_errno;</div><div class='del'>-	}</div><div class='del'>-	UNLOCK (&amp;frame-&gt;lock);</div><div class='del'>-</div><div class='del'>-	call_count = afr_frame_return (frame);</div><div class='del'>-</div><div class='del'>-	if (call_count == 0) {</div><div class='del'>-                if (local-&gt;op_ret == 0) {</div><div class='del'>-                        afr_fd_ctx_set (this, local-&gt;fd);</div><div class='del'>-</div><div class='del'>-                        if (!afr_is_opendir_done (this, local-&gt;fd-&gt;inode) &amp;&amp;</div><div class='del'>-                            up_children_count &gt; 1) {</div><div class='del'>-</div><div class='del'>-                                /*</div><div class='del'>-                                 * This is the first opendir on this inode. We need</div><div class='del'>-                                 * to check if the directory's entries are the same</div><div class='del'>-                                 * on all subvolumes. This is needed in addition</div><div class='del'>-                                 * to regular entry self-heal because the readdir</div><div class='del'>-                                 * call is sent only to the first subvolume, and</div><div class='del'>-                                 * thus files that exist only there will never be healed</div><div class='del'>-                                 * otherwise (assuming changelog shows no anamolies).</div><div class='del'>-                                 */</div><div class='del'>-</div><div class='del'>-                                gf_log (this-&gt;name, GF_LOG_TRACE,</div><div class='del'>-                                        "reading contents of directory %s looking for mismatch",</div><div class='del'>-                                        local-&gt;loc.path);</div><div class='del'>-</div><div class='del'>-                                afr_examine_dir (frame, this);</div><div class='del'>-</div><div class='del'>-                        } else {</div><div class='del'>-                                AFR_STACK_UNWIND (opendir, frame, local-&gt;op_ret,</div><div class='del'>-                                                  local-&gt;op_errno, local-&gt;fd);</div><div class='del'>-                        }</div><div class='del'>-                } else {</div><div class='del'>-                        AFR_STACK_UNWIND (opendir, frame, local-&gt;op_ret,</div><div class='del'>-                                          local-&gt;op_errno, local-&gt;fd);</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int32_t </div><div class='del'>-afr_opendir (call_frame_t *frame, xlator_t *this,</div><div class='del'>-	     loc_t *loc, fd_t *fd)</div><div class='del'>-{</div><div class='del'>-	afr_private_t * priv        = NULL;</div><div class='del'>-	afr_local_t   * local       = NULL;</div><div class='add'>+    if (priv-&gt;quorum_count &amp;&amp; !afr_has_quorum(local-&gt;child_up, this, NULL)) {</div><div class='add'>+        op_errno = afr_quorum_errno(priv);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	int             child_count = 0;</div><div class='del'>-	int             i           = 0;</div><div class='add'>+    if (!afr_is_consistent_io_possible(local, priv, &amp;op_errno))</div><div class='add'>+        goto out;</div><div class='ctx'> </div><div class='del'>-	int ret = -1;</div><div class='del'>-	int call_count = -1;</div><div class='add'>+    fd_ctx = afr_fd_ctx_get(fd, this);</div><div class='add'>+    if (!fd_ctx)</div><div class='add'>+        goto out;</div><div class='ctx'> </div><div class='del'>-	int32_t         op_ret   = -1;</div><div class='del'>-	int32_t         op_errno = 0;</div><div class='add'>+    loc_copy(&amp;local-&gt;loc, loc);</div><div class='ctx'> </div><div class='del'>-	VALIDATE_OR_GOTO (frame, out);</div><div class='del'>-	VALIDATE_OR_GOTO (this, out);</div><div class='del'>-	VALIDATE_OR_GOTO (this-&gt;private, out);</div><div class='add'>+    local-&gt;fd = fd_ref(fd);</div><div class='add'>+    local-&gt;fd_ctx = fd_ctx;</div><div class='ctx'> </div><div class='del'>-	priv = this-&gt;private;</div><div class='add'>+    call_count = local-&gt;call_count;</div><div class='ctx'> </div><div class='del'>-	child_count = priv-&gt;child_count;</div><div class='add'>+    for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+        if (local-&gt;child_up[i]) {</div><div class='add'>+            STACK_WIND_COOKIE(frame, afr_opendir_cbk, (void *)(long)i,</div><div class='add'>+                              priv-&gt;children[i],</div><div class='add'>+                              priv-&gt;children[i]-&gt;fops-&gt;opendir, loc, fd, NULL);</div><div class='ctx'> </div><div class='del'>-	ALLOC_OR_GOTO (local, afr_local_t, out);</div><div class='del'>-	ret = AFR_LOCAL_INIT (local, priv);</div><div class='del'>-	if (ret &lt; 0) {</div><div class='del'>-		op_errno = -ret;</div><div class='del'>-		goto out;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-        loc_copy (&amp;local-&gt;loc, loc);</div><div class='del'>-</div><div class='del'>-	frame-&gt;local = local;</div><div class='del'>-	local-&gt;fd    = fd_ref (fd);</div><div class='del'>-</div><div class='del'>-	call_count = local-&gt;call_count;</div><div class='del'>-	</div><div class='del'>-	for (i = 0; i &lt; child_count; i++) {</div><div class='del'>-		if (local-&gt;child_up[i]) {</div><div class='del'>-			STACK_WIND (frame, afr_opendir_cbk, </div><div class='del'>-				    priv-&gt;children[i],</div><div class='del'>-				    priv-&gt;children[i]-&gt;fops-&gt;opendir,</div><div class='del'>-				    loc, fd);</div><div class='del'>-</div><div class='del'>-			if (!--call_count)</div><div class='del'>-				break;</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	op_ret = 0;</div><div class='del'>-out:</div><div class='del'>-	if (op_ret == -1) {</div><div class='del'>-		AFR_STACK_UNWIND (opendir, frame, op_ret, op_errno, fd);</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-/**</div><div class='del'>- * Common algorithm for directory read calls:</div><div class='del'>- * </div><div class='del'>- * - Try the fop on the first child that is up</div><div class='del'>- * - if we have failed due to ENOTCONN:</div><div class='del'>- *     try the next child</div><div class='del'>- *</div><div class='del'>- * Applicable to: readdir</div><div class='del'>- */</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-struct entry_name {</div><div class='del'>-        char *name;</div><div class='del'>-        struct list_head list;</div><div class='del'>-};</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-static gf_boolean_t</div><div class='del'>-remembered_name (const char *name, struct list_head *entries)</div><div class='del'>-{</div><div class='del'>-        struct entry_name *e;</div><div class='del'>-        gf_boolean_t ret = _gf_false;</div><div class='del'>-</div><div class='del'>-        list_for_each_entry (e, entries, list) {</div><div class='del'>-                if (!strcmp (name, e-&gt;name)) {</div><div class='del'>-                        ret = _gf_true;</div><div class='del'>-                        goto out;</div><div class='del'>-                }</div><div class='add'>+            if (!--call_count)</div><div class='add'>+                break;</div><div class='ctx'>         }</div><div class='add'>+    }</div><div class='ctx'> </div><div class='add'>+    return 0;</div><div class='ctx'> out:</div><div class='del'>-        return ret;</div><div class='add'>+    AFR_STACK_UNWIND(opendir, frame, -1, op_errno, fd, NULL);</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='del'>-static void</div><div class='del'>-afr_remember_entries (gf_dirent_t *entries, fd_t *fd)</div><div class='add'>+static int</div><div class='add'>+afr_validate_read_subvol(inode_t *inode, xlator_t *this, int par_read_subvol)</div><div class='ctx'> {</div><div class='del'>-	struct entry_name *n       = NULL;</div><div class='del'>-	gf_dirent_t *      entry   = NULL;</div><div class='del'>-</div><div class='del'>-	int ret = 0;</div><div class='del'>-</div><div class='del'>-	uint64_t      ctx;</div><div class='del'>-	afr_fd_ctx_t *fd_ctx;</div><div class='del'>-</div><div class='del'>-	ret = fd_ctx_get (fd, THIS, &amp;ctx);</div><div class='del'>-	if (ret &lt; 0) {</div><div class='del'>-		gf_log (THIS-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-			"could not get fd ctx for fd=%p", fd);</div><div class='del'>-		return;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-        fd_ctx = (afr_fd_ctx_t *)(long) ctx;</div><div class='del'>-</div><div class='del'>-	list_for_each_entry (entry, &amp;entries-&gt;list, list) {</div><div class='del'>-		n = GF_CALLOC (1, sizeof (*n), gf_afr_mt_entry_name);</div><div class='del'>-		n-&gt;name = gf_strdup (entry-&gt;d_name);</div><div class='del'>-		INIT_LIST_HEAD (&amp;n-&gt;list);</div><div class='add'>+    int gen = 0;</div><div class='add'>+    int entry_read_subvol = 0;</div><div class='add'>+    unsigned char *data_readable = NULL;</div><div class='add'>+    unsigned char *metadata_readable = NULL;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+    data_readable = alloca0(priv-&gt;child_count);</div><div class='add'>+    metadata_readable = alloca0(priv-&gt;child_count);</div><div class='add'>+</div><div class='add'>+    afr_inode_read_subvol_get(inode, this, data_readable, metadata_readable,</div><div class='add'>+                              &amp;gen);</div><div class='add'>+</div><div class='add'>+    if (gen != priv-&gt;event_generation || !data_readable[par_read_subvol] ||</div><div class='add'>+        !metadata_readable[par_read_subvol])</div><div class='add'>+        return -1;</div><div class='add'>+</div><div class='add'>+    /* Once the control reaches the following statement, it means that the</div><div class='add'>+     * parent's read subvol is perfectly readable. So calling</div><div class='add'>+     * either afr_data_subvol_get() or afr_metadata_subvol_get() would</div><div class='add'>+     * yield the same result. Hence, choosing afr_data_subvol_get() below.</div><div class='add'>+     */</div><div class='add'>+</div><div class='add'>+    if (!priv-&gt;consistent_metadata)</div><div class='add'>+        return 0;</div><div class='ctx'> </div><div class='del'>-		list_add (&amp;n-&gt;list, &amp;fd_ctx-&gt;entries);</div><div class='del'>-	}</div><div class='add'>+    /* For an inode fetched through readdirp which is yet to be linked,</div><div class='add'>+     * inode ctx would not be initialised (yet). So this function returns</div><div class='add'>+     * -1 above due to gen being 0, which is why it is OK to pass NULL for</div><div class='add'>+     *  read_subvol_args here.</div><div class='add'>+     */</div><div class='add'>+    entry_read_subvol = afr_data_subvol_get(inode, this, NULL, NULL, NULL,</div><div class='add'>+                                            NULL);</div><div class='add'>+    if (entry_read_subvol != par_read_subvol)</div><div class='add'>+        return -1;</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='del'>-static off_t</div><div class='del'>-afr_filter_entries (gf_dirent_t *entries, fd_t *fd)</div><div class='add'>+static void</div><div class='add'>+afr_readdir_transform_entries(call_frame_t *frame, gf_dirent_t *subvol_entries,</div><div class='add'>+                              int subvol, gf_dirent_t *entries, fd_t *fd)</div><div class='ctx'> {</div><div class='del'>-	gf_dirent_t *entry, *tmp;</div><div class='del'>-	int ret = 0;</div><div class='del'>-</div><div class='del'>-	uint64_t      ctx;</div><div class='del'>-	afr_fd_ctx_t *fd_ctx;</div><div class='del'>-</div><div class='del'>-	off_t offset = 0;</div><div class='del'>-</div><div class='del'>-	ret = fd_ctx_get (fd, THIS, &amp;ctx);</div><div class='del'>-	if (ret &lt; 0) {</div><div class='del'>-		gf_log (THIS-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-			"could not get fd ctx for fd=%p", fd);</div><div class='del'>-		return -1;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-        fd_ctx = (afr_fd_ctx_t *)(long) ctx;</div><div class='del'>-</div><div class='del'>-	list_for_each_entry_safe (entry, tmp, &amp;entries-&gt;list, list) {</div><div class='del'>-		offset = entry-&gt;d_off;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    gf_dirent_t *entry = NULL;</div><div class='add'>+    gf_dirent_t *tmp = NULL;</div><div class='add'>+    xlator_t *this = NULL;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    gf_boolean_t need_heal = _gf_false;</div><div class='add'>+    gf_boolean_t validate_subvol = _gf_false;</div><div class='add'>+</div><div class='add'>+    this = THIS;</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    need_heal = afr_get_need_heal(this);</div><div class='add'>+    validate_subvol = need_heal | priv-&gt;consistent_metadata;</div><div class='add'>+</div><div class='add'>+    list_for_each_entry_safe(entry, tmp, &amp;subvol_entries-&gt;list, list)</div><div class='add'>+    {</div><div class='add'>+        if (afr_is_private_directory(priv, fd-&gt;inode-&gt;gfid, entry-&gt;d_name,</div><div class='add'>+                                     frame-&gt;root-&gt;pid)) {</div><div class='add'>+            continue;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-		if (remembered_name (entry-&gt;d_name, &amp;fd_ctx-&gt;entries)) {</div><div class='del'>-			list_del (&amp;entry-&gt;list);</div><div class='del'>-			GF_FREE (entry);</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='add'>+        list_del_init(&amp;entry-&gt;list);</div><div class='add'>+        list_add_tail(&amp;entry-&gt;list, &amp;entries-&gt;list);</div><div class='ctx'> </div><div class='del'>-	return offset;</div><div class='del'>-}</div><div class='add'>+        if (!validate_subvol)</div><div class='add'>+            continue;</div><div class='ctx'> </div><div class='del'>-</div><div class='del'>-static void</div><div class='del'>-afr_forget_entries (fd_t *fd)</div><div class='del'>-{</div><div class='del'>-	struct entry_name *entry, *tmp;</div><div class='del'>-	int ret = 0;</div><div class='del'>-</div><div class='del'>-	uint64_t      ctx;</div><div class='del'>-	afr_fd_ctx_t *fd_ctx;</div><div class='del'>-</div><div class='del'>-	ret = fd_ctx_get (fd, THIS, &amp;ctx);</div><div class='del'>-	if (ret &lt; 0) {</div><div class='del'>-		gf_log (THIS-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-			"could not get fd ctx for fd=%p", fd);</div><div class='del'>-		return;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-        fd_ctx = (afr_fd_ctx_t *)(long) ctx;</div><div class='del'>-</div><div class='del'>-	list_for_each_entry_safe (entry, tmp, &amp;fd_ctx-&gt;entries, list) {</div><div class='del'>-		GF_FREE (entry-&gt;name);</div><div class='del'>-		list_del (&amp;entry-&gt;list);</div><div class='del'>-		GF_FREE (entry);</div><div class='del'>-	}</div><div class='add'>+        if (entry-&gt;inode) {</div><div class='add'>+            ret = afr_validate_read_subvol(entry-&gt;inode, this, subvol);</div><div class='add'>+            if (ret == -1) {</div><div class='add'>+                inode_unref(entry-&gt;inode);</div><div class='add'>+                entry-&gt;inode = NULL;</div><div class='add'>+                continue;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int32_t</div><div class='del'>-afr_readdir_cbk (call_frame_t *frame, void *cookie,</div><div class='del'>-		 xlator_t *this, int32_t op_ret, int32_t op_errno,</div><div class='del'>-		 gf_dirent_t *entries)</div><div class='add'>+afr_readdir_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                int32_t op_ret, int32_t op_errno, gf_dirent_t *subvol_entries,</div><div class='add'>+                dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-	afr_private_t * priv     = NULL;</div><div class='del'>-	afr_local_t *   local    = NULL;</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    gf_dirent_t entries;</div><div class='ctx'> </div><div class='del'>-        gf_dirent_t * entry = NULL;</div><div class='del'>-        gf_dirent_t * tmp   = NULL;</div><div class='add'>+    INIT_LIST_HEAD(&amp;entries.list);</div><div class='ctx'> </div><div class='del'>-        int child_index = -1;</div><div class='add'>+    local = frame-&gt;local;</div><div class='ctx'> </div><div class='del'>-	priv     = this-&gt;private;</div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-        child_index = (long) cookie;</div><div class='add'>+    if (op_ret &lt; 0 &amp;&amp; !local-&gt;cont.readdir.offset) {</div><div class='add'>+        /* failover only if this was first readdir, detected</div><div class='add'>+           by offset == 0 */</div><div class='add'>+        local-&gt;op_ret = op_ret;</div><div class='add'>+        local-&gt;op_errno = op_errno;</div><div class='ctx'> </div><div class='del'>-	if (op_ret != -1) {</div><div class='del'>-                list_for_each_entry_safe (entry, tmp, &amp;entries-&gt;list, list) {</div><div class='del'>-                        entry-&gt;d_ino = afr_itransform (entry-&gt;d_ino,</div><div class='del'>-                                                       priv-&gt;child_count,</div><div class='del'>-                                                       child_index);</div><div class='add'>+        afr_read_txn_continue(frame, this, (long)cookie);</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-                        if ((local-&gt;fd-&gt;inode == local-&gt;fd-&gt;inode-&gt;table-&gt;root)</div><div class='del'>-                            &amp;&amp; !strcmp (entry-&gt;d_name, GF_REPLICATE_TRASH_DIR)) {</div><div class='del'>-                                list_del_init (&amp;entry-&gt;list);</div><div class='del'>-                                GF_FREE (entry);</div><div class='del'>-                        }</div><div class='del'>-                }</div><div class='del'>-    	}</div><div class='add'>+    if (op_ret &gt;= 0)</div><div class='add'>+        afr_readdir_transform_entries(frame, subvol_entries, (long)cookie,</div><div class='add'>+                                      &amp;entries, local-&gt;fd);</div><div class='ctx'> </div><div class='del'>-        AFR_STACK_UNWIND (readdir, frame, op_ret, op_errno, entries);</div><div class='add'>+    AFR_STACK_UNWIND(readdir, frame, op_ret, op_errno, &amp;entries, xdata);</div><div class='ctx'> </div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='add'>+    gf_dirent_free(&amp;entries);</div><div class='ctx'> </div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-int32_t</div><div class='del'>-afr_readdirp_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-                  int32_t op_ret, int32_t op_errno, gf_dirent_t *entries)</div><div class='add'>+int</div><div class='add'>+afr_readdir_wind(call_frame_t *frame, xlator_t *this, int subvol)</div><div class='ctx'> {</div><div class='del'>-        afr_private_t * priv     = NULL;</div><div class='del'>-        afr_local_t *   local    = NULL;</div><div class='del'>-        xlator_t **     children = NULL;</div><div class='del'>-        ino_t           inum = 0;</div><div class='del'>-</div><div class='del'>-        int call_child = 0;</div><div class='del'>-        int ret        = 0;</div><div class='del'>-</div><div class='del'>-        gf_dirent_t * entry = NULL;</div><div class='del'>-        gf_dirent_t * tmp   = NULL;</div><div class='del'>-</div><div class='del'>-        int child_index = -1;</div><div class='del'>-</div><div class='del'>-        uint64_t      ctx    = 0;</div><div class='del'>-        afr_fd_ctx_t *fd_ctx = NULL;</div><div class='del'>-</div><div class='del'>-	off_t offset = 0;</div><div class='del'>-</div><div class='del'>-        priv     = this-&gt;private;</div><div class='del'>-        children = priv-&gt;children;</div><div class='del'>-</div><div class='del'>-        local = frame-&gt;local;</div><div class='del'>-</div><div class='del'>-        child_index = (long) cookie;</div><div class='del'>-</div><div class='del'>-	if (priv-&gt;strict_readdir) {</div><div class='del'>-		ret = fd_ctx_get (local-&gt;fd, this, &amp;ctx);</div><div class='del'>-		if (ret &lt; 0) {</div><div class='del'>-			gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-				"could not get fd ctx for fd=%p", local-&gt;fd);</div><div class='del'>-			op_ret   = -1;</div><div class='del'>-			op_errno = -ret;</div><div class='del'>-			goto out;</div><div class='del'>-		}</div><div class='del'>-</div><div class='del'>-		fd_ctx = (afr_fd_ctx_t *)(long) ctx;</div><div class='del'>-</div><div class='del'>-		if (child_went_down (op_ret, op_errno)) {</div><div class='del'>-			if (all_tried (child_index, priv-&gt;child_count)) {</div><div class='del'>-				goto out;</div><div class='del'>-			}</div><div class='del'>-</div><div class='del'>-			call_child = ++child_index;</div><div class='del'>-</div><div class='del'>-			gf_log (this-&gt;name, GF_LOG_TRACE,</div><div class='del'>-				"starting readdir afresh on child %d, offset %"PRId64,</div><div class='del'>-				call_child, (uint64_t) 0);</div><div class='del'>-</div><div class='del'>-			fd_ctx-&gt;failed_over = _gf_true;</div><div class='del'>-</div><div class='del'>-			STACK_WIND_COOKIE (frame, afr_readdirp_cbk,</div><div class='del'>-					   (void *) (long) call_child,</div><div class='del'>-					   children[call_child],</div><div class='del'>-					   children[call_child]-&gt;fops-&gt;readdirp, local-&gt;fd,</div><div class='del'>-					   local-&gt;cont.readdir.size, 0);</div><div class='del'>-			return 0;</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	if (op_ret != -1) {</div><div class='del'>-		list_for_each_entry_safe (entry, tmp, &amp;entries-&gt;list, list) {</div><div class='del'>-			inum = afr_itransform (entry-&gt;d_ino, priv-&gt;child_count,</div><div class='del'>-					       child_index);</div><div class='del'>-			entry-&gt;d_ino = inum;</div><div class='del'>-			inum  = afr_itransform (entry-&gt;d_stat.ia_ino,</div><div class='del'>-						priv-&gt;child_count, child_index);</div><div class='del'>-			entry-&gt;d_stat.ia_ino = inum;</div><div class='del'>-</div><div class='del'>-			if ((local-&gt;fd-&gt;inode == local-&gt;fd-&gt;inode-&gt;table-&gt;root)</div><div class='del'>-			    &amp;&amp; !strcmp (entry-&gt;d_name, GF_REPLICATE_TRASH_DIR)) {</div><div class='del'>-				list_del_init (&amp;entry-&gt;list);</div><div class='del'>-				GF_FREE (entry);</div><div class='del'>-			}</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	if (priv-&gt;strict_readdir) {</div><div class='del'>-		if (fd_ctx-&gt;failed_over) {</div><div class='del'>-			if (list_empty (&amp;entries-&gt;list)) {</div><div class='del'>-				goto out;</div><div class='del'>-			}</div><div class='del'>-</div><div class='del'>-			offset = afr_filter_entries (entries, local-&gt;fd);</div><div class='del'>-</div><div class='del'>-			afr_remember_entries (entries, local-&gt;fd);</div><div class='del'>-</div><div class='del'>-			if (list_empty (&amp;entries-&gt;list)) {</div><div class='del'>-				/* All the entries we got were duplicate. We</div><div class='del'>-				   shouldn't send an empty list now, because</div><div class='del'>-				   that'll make the application stop reading. So</div><div class='del'>-				   try to get more entries */</div><div class='del'>-</div><div class='del'>-				gf_log (this-&gt;name, GF_LOG_TRACE,</div><div class='del'>-					"trying to fetch non-duplicate entries from offset %"PRId64", child %s",</div><div class='del'>-					offset, children[child_index]-&gt;name);</div><div class='del'>-</div><div class='del'>-				STACK_WIND_COOKIE (frame, afr_readdirp_cbk,</div><div class='del'>-						   (void *) (long) child_index,</div><div class='del'>-						   children[child_index],</div><div class='del'>-						   children[child_index]-&gt;fops-&gt;readdirp,</div><div class='del'>-						   local-&gt;fd, local-&gt;cont.readdir.size, offset);</div><div class='del'>-				return 0;</div><div class='del'>-			}</div><div class='del'>-		} else {</div><div class='del'>-			afr_remember_entries (entries, local-&gt;fd);</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        AFR_STACK_UNWIND (readdirp, frame, op_ret, op_errno, entries);</div><div class='del'>-</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    afr_fd_ctx_t *fd_ctx = NULL;</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    fd_ctx = afr_fd_ctx_get(local-&gt;fd, this);</div><div class='add'>+    if (!fd_ctx) {</div><div class='add'>+        local-&gt;op_errno = EINVAL;</div><div class='add'>+        local-&gt;op_ret = -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (subvol == -1 || !fd_ctx) {</div><div class='add'>+        AFR_STACK_UNWIND(readdir, frame, local-&gt;op_ret, local-&gt;op_errno, 0, 0);</div><div class='ctx'>         return 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    fd_ctx-&gt;readdir_subvol = subvol;</div><div class='add'>+</div><div class='add'>+    if (local-&gt;op == GF_FOP_READDIR)</div><div class='add'>+        STACK_WIND_COOKIE(frame, afr_readdir_cbk, (void *)(long)subvol,</div><div class='add'>+                          priv-&gt;children[subvol],</div><div class='add'>+                          priv-&gt;children[subvol]-&gt;fops-&gt;readdir, local-&gt;fd,</div><div class='add'>+                          local-&gt;cont.readdir.size, local-&gt;cont.readdir.offset,</div><div class='add'>+                          local-&gt;xdata_req);</div><div class='add'>+    else</div><div class='add'>+        STACK_WIND_COOKIE(frame, afr_readdir_cbk, (void *)(long)subvol,</div><div class='add'>+                          priv-&gt;children[subvol],</div><div class='add'>+                          priv-&gt;children[subvol]-&gt;fops-&gt;readdirp, local-&gt;fd,</div><div class='add'>+                          local-&gt;cont.readdir.size, local-&gt;cont.readdir.offset,</div><div class='add'>+                          local-&gt;xdata_req);</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-afr_do_readdir (call_frame_t *frame, xlator_t *this,</div><div class='del'>-	        fd_t *fd, size_t size, off_t offset, int whichop)</div><div class='add'>+int</div><div class='add'>+afr_do_readdir(call_frame_t *frame, xlator_t *this, fd_t *fd, size_t size,</div><div class='add'>+               off_t offset, int whichop, dict_t *dict)</div><div class='ctx'> {</div><div class='del'>-	afr_private_t * priv       = NULL;</div><div class='del'>-	xlator_t **     children   = NULL;</div><div class='del'>-	int             call_child = 0;</div><div class='del'>-	afr_local_t     *local     = NULL;</div><div class='del'>-</div><div class='del'>-        uint64_t      ctx;</div><div class='del'>-        afr_fd_ctx_t *fd_ctx;</div><div class='del'>-</div><div class='del'>-	int ret = -1;</div><div class='del'>-</div><div class='del'>-	int32_t op_ret   = -1;</div><div class='del'>-	int32_t op_errno = 0;</div><div class='del'>-</div><div class='del'>-	VALIDATE_OR_GOTO (frame, out);</div><div class='del'>-	VALIDATE_OR_GOTO (this, out);</div><div class='del'>-	VALIDATE_OR_GOTO (this-&gt;private, out);</div><div class='del'>-</div><div class='del'>-	priv     = this-&gt;private;</div><div class='del'>-	children = priv-&gt;children;</div><div class='del'>-</div><div class='del'>-	ALLOC_OR_GOTO (local, afr_local_t, out);</div><div class='del'>-	ret = AFR_LOCAL_INIT (local, priv);</div><div class='del'>-	if (ret &lt; 0) {</div><div class='del'>-		op_errno = -ret;</div><div class='del'>-		goto out;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	frame-&gt;local = local;</div><div class='del'>-</div><div class='del'>-	call_child = afr_first_up_child (priv);</div><div class='del'>-	if (call_child == -1) {</div><div class='del'>-		op_errno = ENOTCONN;</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-			"no child is up");</div><div class='del'>-		goto out;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-        local-&gt;fd                  = fd_ref (fd);</div><div class='del'>-        local-&gt;cont.readdir.size   = size;</div><div class='del'>-</div><div class='del'>-	if (priv-&gt;strict_readdir) {</div><div class='del'>-		ret = fd_ctx_get (fd, this, &amp;ctx);</div><div class='del'>-		if (ret &lt; 0) {</div><div class='del'>-			gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-				"could not get fd ctx for fd=%p", fd);</div><div class='del'>-			op_errno = -ret;</div><div class='del'>-			goto out;</div><div class='del'>-		}</div><div class='del'>-</div><div class='del'>-		fd_ctx = (afr_fd_ctx_t *)(long) ctx;</div><div class='del'>-</div><div class='del'>-		if (fd_ctx-&gt;last_tried != call_child) {</div><div class='del'>-			gf_log (this-&gt;name, GF_LOG_TRACE,</div><div class='del'>-				"first up child has changed from %d to %d, restarting readdir from offset 0",</div><div class='del'>-				fd_ctx-&gt;last_tried, call_child);</div><div class='del'>-</div><div class='del'>-			fd_ctx-&gt;failed_over = _gf_true;</div><div class='del'>-			offset = 0;</div><div class='del'>-		}</div><div class='del'>-</div><div class='del'>-		fd_ctx-&gt;last_tried = call_child;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-        if (whichop == GF_FOP_READDIR)</div><div class='del'>-                STACK_WIND_COOKIE (frame, afr_readdir_cbk,</div><div class='del'>-                                   (void *) (long) call_child,</div><div class='del'>-                                   children[call_child],</div><div class='del'>-                                   children[call_child]-&gt;fops-&gt;readdir, fd,</div><div class='del'>-                                   size, offset);</div><div class='del'>-        else</div><div class='del'>-                STACK_WIND_COOKIE (frame, afr_readdirp_cbk,</div><div class='del'>-                                   (void *) (long) call_child,</div><div class='del'>-                                   children[call_child],</div><div class='del'>-                                   children[call_child]-&gt;fops-&gt;readdirp, fd,</div><div class='del'>-                                   size, offset);</div><div class='del'>-</div><div class='del'>-	op_ret = 0;</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    int32_t op_errno = 0;</div><div class='add'>+    int subvol = -1;</div><div class='add'>+    afr_fd_ctx_t *fd_ctx = NULL;</div><div class='add'>+</div><div class='add'>+    local = AFR_FRAME_INIT(frame, op_errno);</div><div class='add'>+    if (!local)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    fd_ctx = afr_fd_ctx_get(fd, this);</div><div class='add'>+    if (!fd_ctx) {</div><div class='add'>+        op_errno = EINVAL;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    local-&gt;op = whichop;</div><div class='add'>+    local-&gt;fd = fd_ref(fd);</div><div class='add'>+    local-&gt;cont.readdir.size = size;</div><div class='add'>+    local-&gt;cont.readdir.offset = offset;</div><div class='add'>+    local-&gt;xdata_req = (dict) ? dict_ref(dict) : NULL;</div><div class='add'>+</div><div class='add'>+    subvol = fd_ctx-&gt;readdir_subvol;</div><div class='add'>+</div><div class='add'>+    if (offset == 0 || subvol == -1) {</div><div class='add'>+        /* First readdir has option of failing over and selecting</div><div class='add'>+           an appropriate read subvolume */</div><div class='add'>+        afr_read_txn(frame, this, fd-&gt;inode, afr_readdir_wind,</div><div class='add'>+                     AFR_DATA_TRANSACTION);</div><div class='add'>+    } else {</div><div class='add'>+        /* But continued readdirs MUST stick to the same subvolume</div><div class='add'>+           without an option to failover */</div><div class='add'>+        afr_readdir_wind(frame, this, subvol);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='ctx'> out:</div><div class='del'>-	if (op_ret == -1) {</div><div class='del'>-		AFR_STACK_UNWIND (readdir, frame, op_ret, op_errno, NULL);</div><div class='del'>-	}</div><div class='del'>-	return 0;</div><div class='add'>+    AFR_STACK_UNWIND(readdir, frame, -1, op_errno, NULL, NULL);</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int32_t</div><div class='del'>-afr_readdir (call_frame_t *frame, xlator_t *this, fd_t *fd, size_t size,</div><div class='del'>-             off_t offset)</div><div class='add'>+afr_readdir(call_frame_t *frame, xlator_t *this, fd_t *fd, size_t size,</div><div class='add'>+            off_t offset, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-        afr_do_readdir (frame, this, fd, size, offset, GF_FOP_READDIR);</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='add'>+    afr_do_readdir(frame, this, fd, size, offset, GF_FOP_READDIR, xdata);</div><div class='ctx'> </div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int32_t</div><div class='del'>-afr_readdirp (call_frame_t *frame, xlator_t *this, fd_t *fd, size_t size,</div><div class='del'>-              off_t offset)</div><div class='add'>+afr_readdirp(call_frame_t *frame, xlator_t *this, fd_t *fd, size_t size,</div><div class='add'>+             off_t offset, dict_t *dict)</div><div class='ctx'> {</div><div class='del'>-        afr_do_readdir (frame, this, fd, size, offset, GF_FOP_READDIRP);</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='add'>+    afr_do_readdir(frame, this, fd, size, offset, GF_FOP_READDIRP, dict);</div><div class='ctx'> </div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int32_t</div><div class='del'>-afr_releasedir (xlator_t *this, fd_t *fd)</div><div class='add'>+afr_releasedir(xlator_t *this, fd_t *fd)</div><div class='ctx'> {</div><div class='del'>-	afr_forget_entries (fd);</div><div class='del'>-        afr_cleanup_fd_ctx (this, fd);</div><div class='add'>+    afr_cleanup_fd_ctx(this, fd);</div><div class='ctx'> </div><div class='del'>-	return 0;</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='head'>diff --git a/xlators/cluster/afr/src/afr-dir-read.h b/xlators/cluster/afr/src/afr-dir-read.h<br/>index abde2534de9..773e925ec6c 100644<br/>--- a/<a href='/cgit/glusterfs.git/tree/xlators/cluster/afr/src/afr-dir-read.h?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/cluster/afr/src/afr-dir-read.h</a><br/>+++ b/<a href='/cgit/glusterfs.git/tree/xlators/cluster/afr/src/afr-dir-read.h?id=d1d7a6f35c816822fab51c820e25023863c239c1'>xlators/cluster/afr/src/afr-dir-read.h</a></div><div class='hunk'>@@ -1,50 +1,33 @@</div><div class='ctx'> /*</div><div class='del'>-   Copyright (c) 2007-2009 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='del'>-   This file is part of GlusterFS.</div><div class='del'>-</div><div class='del'>-   GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-   it under the terms of the GNU General Public License as published</div><div class='del'>-   by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-   or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-   GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-   WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-   General Public License for more details.</div><div class='del'>-</div><div class='del'>-   You should have received a copy of the GNU General Public License</div><div class='del'>-   along with this program.  If not, see</div><div class='del'>-   &lt;http://www.gnu.org/licenses/&gt;.</div><div class='add'>+  Copyright (c) 2008-2012 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='ctx'> */</div><div class='ctx'> </div><div class='ctx'> #ifndef __DIR_READ_H__</div><div class='ctx'> #define __DIR_READ_H__</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int32_t</div><div class='del'>-afr_opendir (call_frame_t *frame, xlator_t *this,</div><div class='del'>-	     loc_t *loc, fd_t *fd);</div><div class='add'>+afr_opendir(call_frame_t *frame, xlator_t *this, loc_t *loc, fd_t *fd,</div><div class='add'>+            dict_t *xdata);</div><div class='ctx'> </div><div class='ctx'> int32_t</div><div class='del'>-afr_releasedir (xlator_t *this, fd_t *fd);</div><div class='add'>+afr_releasedir(xlator_t *this, fd_t *fd);</div><div class='ctx'> </div><div class='ctx'> int32_t</div><div class='del'>-afr_readdir (call_frame_t *frame, xlator_t *this,</div><div class='del'>-	     fd_t *fd, size_t size, off_t offset);</div><div class='del'>-</div><div class='add'>+afr_readdir(call_frame_t *frame, xlator_t *this, fd_t *fd, size_t size,</div><div class='add'>+            off_t offset, dict_t *xdata);</div><div class='ctx'> </div><div class='ctx'> int32_t</div><div class='del'>-afr_readdirp (call_frame_t *frame, xlator_t *this,</div><div class='del'>-	     fd_t *fd, size_t size, off_t offset);</div><div class='add'>+afr_readdirp(call_frame_t *frame, xlator_t *this, fd_t *fd, size_t size,</div><div class='add'>+             off_t offset, dict_t *dict);</div><div class='ctx'> </div><div class='ctx'> int32_t</div><div class='del'>-afr_getdents (call_frame_t *frame, xlator_t *this,</div><div class='del'>-	      fd_t *fd, size_t size, off_t offset, int32_t flag);</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-afr_checksum (call_frame_t *frame, xlator_t *this,</div><div class='del'>-	      loc_t *loc, int32_t flags);</div><div class='del'>-</div><div class='add'>+afr_checksum(call_frame_t *frame, xlator_t *this, loc_t *loc, int32_t flags,</div><div class='add'>+             dict_t *xdata);</div><div class='ctx'> </div><div class='ctx'> #endif /* __DIR_READ_H__ */</div><div class='head'>diff --git a/xlators/cluster/afr/src/afr-dir-write.c b/xlators/cluster/afr/src/afr-dir-write.c<br/>index 5d5bf40e06a..b7cceb79158 100644<br/>--- a/<a href='/cgit/glusterfs.git/tree/xlators/cluster/afr/src/afr-dir-write.c?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/cluster/afr/src/afr-dir-write.c</a><br/>+++ b/<a href='/cgit/glusterfs.git/tree/xlators/cluster/afr/src/afr-dir-write.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>xlators/cluster/afr/src/afr-dir-write.c</a></div><div class='hunk'>@@ -1,1357 +1,937 @@</div><div class='ctx'> /*</div><div class='del'>-  Copyright (c) 2007-2009 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='add'>+  Copyright (c) 2008-2012 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='ctx'>   This file is part of GlusterFS.</div><div class='ctx'> </div><div class='del'>-  GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-  it under the terms of the GNU General Public License as published</div><div class='del'>-  by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-  or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-  GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-  WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-  General Public License for more details.</div><div class='del'>-</div><div class='del'>-  You should have received a copy of the GNU General Public License</div><div class='del'>-  along with this program.  If not, see</div><div class='del'>-  &lt;http://www.gnu.org/licenses/&gt;.</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='ctx'> */</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> #include &lt;libgen.h&gt;</div><div class='ctx'> #include &lt;unistd.h&gt;</div><div class='del'>-#include &lt;fnmatch.h&gt;</div><div class='ctx'> #include &lt;sys/time.h&gt;</div><div class='ctx'> #include &lt;stdlib.h&gt;</div><div class='ctx'> #include &lt;signal.h&gt;</div><div class='ctx'> </div><div class='del'>-#ifndef _CONFIG_H</div><div class='del'>-#define _CONFIG_H</div><div class='del'>-#include "config.h"</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-#include "glusterfs.h"</div><div class='add'>+#include &lt;glusterfs/glusterfs.h&gt;</div><div class='ctx'> #include "afr.h"</div><div class='del'>-#include "dict.h"</div><div class='del'>-#include "xlator.h"</div><div class='del'>-#include "hashfn.h"</div><div class='del'>-#include "logging.h"</div><div class='del'>-#include "stack.h"</div><div class='del'>-#include "list.h"</div><div class='del'>-#include "call-stub.h"</div><div class='del'>-#include "defaults.h"</div><div class='del'>-#include "common-utils.h"</div><div class='del'>-#include "compat-errno.h"</div><div class='del'>-#include "compat.h"</div><div class='add'>+#include &lt;glusterfs/dict.h&gt;</div><div class='add'>+#include &lt;glusterfs/logging.h&gt;</div><div class='add'>+#include &lt;glusterfs/list.h&gt;</div><div class='add'>+#include &lt;glusterfs/defaults.h&gt;</div><div class='add'>+#include &lt;glusterfs/common-utils.h&gt;</div><div class='add'>+#include &lt;glusterfs/compat-errno.h&gt;</div><div class='add'>+#include &lt;glusterfs/compat.h&gt;</div><div class='add'>+#include &lt;glusterfs/byte-order.h&gt;</div><div class='ctx'> </div><div class='ctx'> #include "afr.h"</div><div class='ctx'> #include "afr-transaction.h"</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> void</div><div class='del'>-afr_build_parent_loc (loc_t *parent, loc_t *child)</div><div class='add'>+afr_mark_entry_pending_changelog(call_frame_t *frame, xlator_t *this);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+afr_build_parent_loc(loc_t *parent, loc_t *child, int32_t *op_errno)</div><div class='ctx'> {</div><div class='del'>-	char *tmp = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    char *child_path = NULL;</div><div class='add'>+</div><div class='add'>+    if (!child-&gt;parent) {</div><div class='add'>+        if (op_errno)</div><div class='add'>+            *op_errno = EINVAL;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    child_path = gf_strdup(child-&gt;path);</div><div class='add'>+    if (!child_path) {</div><div class='add'>+        if (op_errno)</div><div class='add'>+            *op_errno = ENOMEM;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    parent-&gt;path = gf_strdup(dirname(child_path));</div><div class='add'>+    if (!parent-&gt;path) {</div><div class='add'>+        if (op_errno)</div><div class='add'>+            *op_errno = ENOMEM;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    parent-&gt;inode = inode_ref(child-&gt;parent);</div><div class='add'>+    gf_uuid_copy(parent-&gt;gfid, child-&gt;pargfid);</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+out:</div><div class='add'>+    GF_FREE(child_path);</div><div class='ctx'> </div><div class='del'>-	if (!child-&gt;parent) {</div><div class='del'>-		loc_copy (parent, child);</div><div class='del'>-		return;</div><div class='del'>-	}</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	tmp = gf_strdup (child-&gt;path);</div><div class='del'>-	parent-&gt;path   = gf_strdup (dirname (tmp));</div><div class='del'>-	GF_FREE (tmp);</div><div class='add'>+static void</div><div class='add'>+__afr_dir_write_finalize(call_frame_t *frame, xlator_t *this)</div><div class='add'>+{</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    int inode_read_subvol = -1;</div><div class='add'>+    int parent_read_subvol = -1;</div><div class='add'>+    int parent2_read_subvol = -1;</div><div class='add'>+    int i = 0;</div><div class='add'>+    afr_read_subvol_args_t args = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+        if (!local-&gt;replies[i].valid)</div><div class='add'>+            continue;</div><div class='add'>+        if (local-&gt;replies[i].op_ret == -1)</div><div class='add'>+            continue;</div><div class='add'>+        gf_uuid_copy(args.gfid, local-&gt;replies[i].poststat.ia_gfid);</div><div class='add'>+        args.ia_type = local-&gt;replies[i].poststat.ia_type;</div><div class='add'>+        break;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (local-&gt;inode) {</div><div class='add'>+        if (local-&gt;op != GF_FOP_RENAME &amp;&amp; local-&gt;op != GF_FOP_LINK)</div><div class='add'>+            afr_replies_interpret(frame, this, local-&gt;inode, NULL);</div><div class='add'>+</div><div class='add'>+        inode_read_subvol = afr_data_subvol_get(local-&gt;inode, this, NULL, NULL,</div><div class='add'>+                                                NULL, &amp;args);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (local-&gt;parent)</div><div class='add'>+        parent_read_subvol = afr_data_subvol_get(local-&gt;parent, this, NULL,</div><div class='add'>+                                                 local-&gt;readable, NULL, NULL);</div><div class='add'>+</div><div class='add'>+    if (local-&gt;parent2)</div><div class='add'>+        parent2_read_subvol = afr_data_subvol_get(local-&gt;parent2, this, NULL,</div><div class='add'>+                                                  local-&gt;readable2, NULL, NULL);</div><div class='add'>+</div><div class='add'>+    local-&gt;op_ret = -1;</div><div class='add'>+    local-&gt;op_errno = afr_final_errno(local, priv);</div><div class='add'>+    afr_pick_error_xdata(local, priv, local-&gt;parent, local-&gt;readable,</div><div class='add'>+                         local-&gt;parent2, local-&gt;readable2);</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+        if (!local-&gt;replies[i].valid)</div><div class='add'>+            continue;</div><div class='add'>+        if (local-&gt;replies[i].op_ret &lt; 0) {</div><div class='add'>+            if (local-&gt;inode)</div><div class='add'>+                afr_inode_need_refresh_set(local-&gt;inode, this);</div><div class='add'>+            if (local-&gt;parent)</div><div class='add'>+                afr_inode_need_refresh_set(local-&gt;parent, this);</div><div class='add'>+            if (local-&gt;parent2)</div><div class='add'>+                afr_inode_need_refresh_set(local-&gt;parent2, this);</div><div class='add'>+            continue;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-        parent-&gt;name   = strrchr (parent-&gt;path, '/');</div><div class='del'>-	if (parent-&gt;name)</div><div class='del'>-		parent-&gt;name++;</div><div class='add'>+        if (local-&gt;op_ret == -1) {</div><div class='add'>+            local-&gt;op_ret = local-&gt;replies[i].op_ret;</div><div class='add'>+            local-&gt;op_errno = local-&gt;replies[i].op_errno;</div><div class='add'>+</div><div class='add'>+            local-&gt;cont.dir_fop.buf = local-&gt;replies[i].poststat;</div><div class='add'>+            local-&gt;cont.dir_fop.preparent = local-&gt;replies[i].preparent;</div><div class='add'>+            local-&gt;cont.dir_fop.postparent = local-&gt;replies[i].postparent;</div><div class='add'>+            local-&gt;cont.dir_fop.prenewparent = local-&gt;replies[i].preparent2;</div><div class='add'>+            local-&gt;cont.dir_fop.postnewparent = local-&gt;replies[i].postparent2;</div><div class='add'>+            if (local-&gt;xdata_rsp) {</div><div class='add'>+                dict_unref(local-&gt;xdata_rsp);</div><div class='add'>+                local-&gt;xdata_rsp = NULL;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            if (local-&gt;replies[i].xdata)</div><div class='add'>+                local-&gt;xdata_rsp = dict_ref(local-&gt;replies[i].xdata);</div><div class='add'>+            continue;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-	parent-&gt;inode  = inode_ref (child-&gt;parent);</div><div class='del'>-	parent-&gt;parent = inode_parent (parent-&gt;inode, 0, NULL);</div><div class='del'>-	parent-&gt;ino    = parent-&gt;inode-&gt;ino;</div><div class='del'>-}</div><div class='add'>+        if (i == inode_read_subvol) {</div><div class='add'>+            local-&gt;cont.dir_fop.buf = local-&gt;replies[i].poststat;</div><div class='add'>+            if (local-&gt;replies[i].xdata) {</div><div class='add'>+                if (local-&gt;xdata_rsp)</div><div class='add'>+                    dict_unref(local-&gt;xdata_rsp);</div><div class='add'>+                local-&gt;xdata_rsp = dict_ref(local-&gt;replies[i].xdata);</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-/* {{{ create */</div><div class='add'>+        if (i == parent_read_subvol) {</div><div class='add'>+            local-&gt;cont.dir_fop.preparent = local-&gt;replies[i].preparent;</div><div class='add'>+            local-&gt;cont.dir_fop.postparent = local-&gt;replies[i].postparent;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-afr_create_unwind (call_frame_t *frame, xlator_t *this)</div><div class='del'>-{</div><div class='del'>-	call_frame_t *main_frame = NULL;</div><div class='del'>-	afr_local_t  *local = NULL;</div><div class='del'>-        struct iatt  *unwind_buf = NULL;</div><div class='del'>-</div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-</div><div class='del'>-	LOCK (&amp;frame-&gt;lock);</div><div class='del'>-	{</div><div class='del'>-		if (local-&gt;transaction.main_frame) {</div><div class='del'>-			main_frame = local-&gt;transaction.main_frame;</div><div class='del'>-		}</div><div class='del'>-		local-&gt;transaction.main_frame = NULL;</div><div class='del'>-	}</div><div class='del'>-	UNLOCK (&amp;frame-&gt;lock);</div><div class='del'>-</div><div class='del'>-	if (main_frame) {</div><div class='del'>-                if (local-&gt;cont.create.read_child_buf.ia_ino) {</div><div class='del'>-                        unwind_buf = &amp;local-&gt;cont.create.read_child_buf;</div><div class='del'>-                } else {</div><div class='del'>-                        unwind_buf = &amp;local-&gt;cont.create.buf;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                unwind_buf-&gt;ia_ino = local-&gt;cont.create.ino;</div><div class='del'>-                unwind_buf-&gt;ia_gen = local-&gt;cont.create.gen;</div><div class='del'>-</div><div class='del'>-                local-&gt;cont.create.preparent.ia_ino  = local-&gt;cont.create.parent_ino;</div><div class='del'>-                local-&gt;cont.create.postparent.ia_ino = local-&gt;cont.create.parent_ino;</div><div class='del'>-</div><div class='del'>-		AFR_STACK_UNWIND (create, main_frame,</div><div class='del'>-                                  local-&gt;op_ret, local-&gt;op_errno,</div><div class='del'>-				  local-&gt;cont.create.fd,</div><div class='del'>-				  local-&gt;cont.create.inode,</div><div class='del'>-				  unwind_buf, &amp;local-&gt;cont.create.preparent,</div><div class='del'>-                                  &amp;local-&gt;cont.create.postparent);</div><div class='add'>+        if (i == parent2_read_subvol) {</div><div class='add'>+            local-&gt;cont.dir_fop.prenewparent = local-&gt;replies[i].preparent2;</div><div class='add'>+            local-&gt;cont.dir_fop.postnewparent = local-&gt;replies[i].postparent2;</div><div class='ctx'>         }</div><div class='del'>-        </div><div class='del'>-	return 0;</div><div class='add'>+    }</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-afr_create_wind_cbk (call_frame_t *frame, void *cookie, xlator_t *this, </div><div class='del'>-		     int32_t op_ret, int32_t op_errno, </div><div class='del'>-		     fd_t *fd, inode_t *inode, struct iatt *buf,</div><div class='del'>-                     struct iatt *preparent, struct iatt *postparent)</div><div class='add'>+static void</div><div class='add'>+__afr_dir_write_fill(call_frame_t *frame, xlator_t *this, int child_index,</div><div class='add'>+                     int op_ret, int op_errno, struct iatt *poststat,</div><div class='add'>+                     struct iatt *preparent, struct iatt *postparent,</div><div class='add'>+                     struct iatt *preparent2, struct iatt *postparent2,</div><div class='add'>+                     dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-	afr_local_t *   local = NULL;</div><div class='del'>-	afr_private_t * priv  = NULL;</div><div class='del'>-</div><div class='del'>-        uint64_t      ctx;</div><div class='del'>-        afr_fd_ctx_t *fd_ctx;</div><div class='del'>-</div><div class='del'>-        int ret = 0;</div><div class='del'>-</div><div class='del'>-	int call_count = -1;</div><div class='del'>-	int child_index = -1;</div><div class='del'>-</div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-	priv  = this-&gt;private;</div><div class='del'>-</div><div class='del'>-	child_index = (long) cookie;</div><div class='del'>-</div><div class='del'>-	LOCK (&amp;frame-&gt;lock);</div><div class='del'>-	{</div><div class='del'>-		if (afr_fop_failed (op_ret, op_errno))</div><div class='del'>-			afr_transaction_fop_failed (frame, this, child_index);</div><div class='del'>-                </div><div class='del'>-		if (op_ret != -1) {</div><div class='del'>-			local-&gt;op_ret = op_ret;</div><div class='del'>-</div><div class='del'>-                        ret = afr_fd_ctx_set (this, fd);</div><div class='del'>-</div><div class='del'>-                        if (ret &lt; 0) {</div><div class='del'>-                                gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-                                        "could not set ctx on fd=%p", fd);</div><div class='del'>-</div><div class='del'>-                                local-&gt;op_ret   = -1;</div><div class='del'>-                                local-&gt;op_errno = -ret;</div><div class='del'>-                        }</div><div class='del'>-</div><div class='del'>-                        ret = fd_ctx_get (fd, this, &amp;ctx);</div><div class='del'>-</div><div class='del'>-                        if (ret &lt; 0) {</div><div class='del'>-                                gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-                                        "could not get fd ctx for fd=%p", fd);</div><div class='del'>-                                local-&gt;op_ret   = -1;</div><div class='del'>-                                local-&gt;op_errno = -ret;</div><div class='del'>-                        }</div><div class='del'>-</div><div class='del'>-                        fd_ctx = (afr_fd_ctx_t *)(long) ctx;</div><div class='del'>-</div><div class='del'>-                        fd_ctx-&gt;opened_on[child_index] = 1;</div><div class='del'>-                        fd_ctx-&gt;flags                  = local-&gt;cont.create.flags;</div><div class='del'>-</div><div class='del'>-                        if (local-&gt;success_count == 0) {</div><div class='del'>-				local-&gt;cont.create.buf        = *buf;</div><div class='del'>-</div><div class='del'>-                                local-&gt;cont.create.ino =</div><div class='del'>-                                        afr_itransform (buf-&gt;ia_ino,</div><div class='del'>-                                                        priv-&gt;child_count,</div><div class='del'>-                                                        child_index);</div><div class='del'>-                                local-&gt;cont.create.gen = buf-&gt;ia_gen;</div><div class='del'>-</div><div class='del'>-                                if (priv-&gt;read_child &gt;= 0) {</div><div class='del'>-                                        afr_set_read_child (this, inode, </div><div class='del'>-                                                            priv-&gt;read_child);</div><div class='del'>-                                } else {</div><div class='del'>-                                        afr_set_read_child (this, inode, </div><div class='del'>-                                                            local-&gt;read_child_index);</div><div class='del'>-                                }</div><div class='del'>-			}</div><div class='del'>-                        </div><div class='del'>-                        if (child_index == local-&gt;first_up_child) {</div><div class='del'>-                                local-&gt;cont.create.ino =</div><div class='del'>-                                        afr_itransform (buf-&gt;ia_ino,</div><div class='del'>-                                                        priv-&gt;child_count,</div><div class='del'>-                                                        local-&gt;first_up_child);</div><div class='del'>-                                local-&gt;cont.create.gen = buf-&gt;ia_gen;</div><div class='del'>-                        }</div><div class='del'>-                        </div><div class='del'>-                        if (child_index == local-&gt;read_child_index) {</div><div class='del'>-                                local-&gt;cont.create.read_child_buf = *buf;</div><div class='del'>-                                local-&gt;cont.create.preparent      = *preparent;</div><div class='del'>-                                local-&gt;cont.create.postparent     = *postparent;</div><div class='del'>-                        }</div><div class='del'>-</div><div class='del'>-			local-&gt;cont.create.inode = inode;</div><div class='del'>-</div><div class='del'>-			local-&gt;success_count++;</div><div class='del'>-		}</div><div class='del'>-</div><div class='del'>-		local-&gt;op_errno = op_errno;</div><div class='del'>-	}</div><div class='del'>-	UNLOCK (&amp;frame-&gt;lock);</div><div class='del'>-</div><div class='del'>-	call_count = afr_frame_return (frame);</div><div class='del'>-</div><div class='del'>-	if (call_count == 0) {</div><div class='del'>-		local-&gt;transaction.unwind (frame, this);</div><div class='del'>-</div><div class='del'>-		local-&gt;transaction.resume (frame, this);</div><div class='del'>-	}</div><div class='del'>-	</div><div class='del'>-	return 0;</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    afr_fd_ctx_t *fd_ctx = NULL;</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    fd_ctx = local-&gt;fd_ctx;</div><div class='add'>+</div><div class='add'>+    local-&gt;replies[child_index].valid = 1;</div><div class='add'>+    local-&gt;replies[child_index].op_ret = op_ret;</div><div class='add'>+    local-&gt;replies[child_index].op_errno = op_errno;</div><div class='add'>+    if (xdata)</div><div class='add'>+        local-&gt;replies[child_index].xdata = dict_ref(xdata);</div><div class='add'>+</div><div class='add'>+    if (op_ret &gt;= 0) {</div><div class='add'>+        if (poststat)</div><div class='add'>+            local-&gt;replies[child_index].poststat = *poststat;</div><div class='add'>+        if (preparent)</div><div class='add'>+            local-&gt;replies[child_index].preparent = *preparent;</div><div class='add'>+        if (postparent)</div><div class='add'>+            local-&gt;replies[child_index].postparent = *postparent;</div><div class='add'>+        if (preparent2)</div><div class='add'>+            local-&gt;replies[child_index].preparent2 = *preparent2;</div><div class='add'>+        if (postparent2)</div><div class='add'>+            local-&gt;replies[child_index].postparent2 = *postparent2;</div><div class='add'>+        if (fd_ctx)</div><div class='add'>+            fd_ctx-&gt;opened_on[child_index] = AFR_FD_OPENED;</div><div class='add'>+    } else {</div><div class='add'>+        if (op_errno != ENOTEMPTY)</div><div class='add'>+            afr_transaction_fop_failed(frame, this, child_index);</div><div class='add'>+        if (fd_ctx)</div><div class='add'>+            fd_ctx-&gt;opened_on[child_index] = AFR_FD_NOT_OPENED;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-afr_create_wind (call_frame_t *frame, xlator_t *this)</div><div class='add'>+static int</div><div class='add'>+__afr_dir_write_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                    int op_ret, int op_errno, struct iatt *buf,</div><div class='add'>+                    struct iatt *preparent, struct iatt *postparent,</div><div class='add'>+                    struct iatt *preparent2, struct iatt *postparent2,</div><div class='add'>+                    dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-	afr_local_t *local = NULL;</div><div class='del'>-	afr_private_t *priv = NULL;</div><div class='del'>-</div><div class='del'>-	int call_count = -1;</div><div class='del'>-	int i = 0;</div><div class='del'>-</div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-	priv = this-&gt;private;</div><div class='del'>-</div><div class='del'>-	call_count = afr_up_children_count (priv-&gt;child_count, local-&gt;child_up);</div><div class='del'>-</div><div class='del'>-	if (call_count == 0) {</div><div class='del'>-		local-&gt;transaction.resume (frame, this);</div><div class='del'>-		return 0;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	local-&gt;call_count = call_count;</div><div class='del'>-</div><div class='del'>-	for (i = 0; i &lt; priv-&gt;child_count; i++) {				</div><div class='del'>-		if (local-&gt;child_up[i]) {</div><div class='del'>-			STACK_WIND_COOKIE (frame, afr_create_wind_cbk,</div><div class='del'>-					   (void *) (long) i,</div><div class='del'>-					   priv-&gt;children[i], </div><div class='del'>-					   priv-&gt;children[i]-&gt;fops-&gt;create,</div><div class='del'>-					   &amp;local-&gt;loc, </div><div class='del'>-					   local-&gt;cont.create.flags, </div><div class='del'>-					   local-&gt;cont.create.mode, </div><div class='del'>-					   local-&gt;cont.create.fd,</div><div class='del'>-                                           local-&gt;cont.create.params);</div><div class='del'>-			if (!--call_count)</div><div class='del'>-				break;</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='del'>-	</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    int child_index = (long)cookie;</div><div class='add'>+    int call_count = -1;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;frame-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        __afr_dir_write_fill(frame, this, child_index, op_ret, op_errno, buf,</div><div class='add'>+                             preparent, postparent, preparent2, postparent2,</div><div class='add'>+                             xdata);</div><div class='add'>+        call_count = --local-&gt;call_count;</div><div class='add'>+    }</div><div class='add'>+    UNLOCK(&amp;frame-&gt;lock);</div><div class='add'>+</div><div class='add'>+    if (call_count == 0) {</div><div class='add'>+        __afr_dir_write_finalize(frame, this);</div><div class='add'>+</div><div class='add'>+        if (afr_txn_nothing_failed(frame, this)) {</div><div class='add'>+            /*if it did pre-op, it will do post-op changing ctime*/</div><div class='add'>+            if (priv-&gt;consistent_metadata &amp;&amp; afr_needs_changelog_update(local))</div><div class='add'>+                afr_zero_fill_stat(local);</div><div class='add'>+            local-&gt;transaction.unwind(frame, this);</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        afr_mark_entry_pending_changelog(frame, this);</div><div class='ctx'> </div><div class='add'>+        afr_transaction_resume(frame, this);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-afr_create_done (call_frame_t *frame, xlator_t *this)</div><div class='add'>+afr_mark_new_entry_changelog_cbk(call_frame_t *frame, void *cookie,</div><div class='add'>+                                 xlator_t *this, int op_ret, int op_errno,</div><div class='add'>+                                 dict_t *xattr, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-	afr_local_t * local = NULL;</div><div class='add'>+    int call_count = 0;</div><div class='ctx'> </div><div class='del'>-	local = frame-&gt;local;</div><div class='add'>+    call_count = afr_frame_return(frame);</div><div class='ctx'> </div><div class='del'>-	local-&gt;transaction.unwind (frame, this);</div><div class='add'>+    if (call_count == 0)</div><div class='add'>+        AFR_STACK_DESTROY(frame);</div><div class='ctx'> </div><div class='del'>-	AFR_STACK_DESTROY (frame);</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-afr_create (call_frame_t *frame, xlator_t *this,</div><div class='del'>-	    loc_t *loc, int32_t flags, mode_t mode,</div><div class='del'>-            fd_t *fd, dict_t *params)</div><div class='add'>+void</div><div class='add'>+afr_mark_new_entry_changelog(call_frame_t *frame, xlator_t *this)</div><div class='ctx'> {</div><div class='del'>-	afr_private_t * priv  = NULL;</div><div class='del'>-	afr_local_t   * local = NULL;</div><div class='del'>-	call_frame_t  * transaction_frame = NULL;</div><div class='del'>-</div><div class='del'>-	int ret = -1;</div><div class='add'>+    call_frame_t *new_frame = NULL;</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    afr_local_t *new_local = NULL;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    dict_t *xattr = NULL;</div><div class='add'>+    int32_t **changelog = NULL;</div><div class='add'>+    int i = 0;</div><div class='add'>+    int op_errno = ENOMEM;</div><div class='add'>+    unsigned char *pending = NULL;</div><div class='add'>+    int call_count = 0;</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    new_frame = copy_frame(frame);</div><div class='add'>+    if (!new_frame)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    new_local = AFR_FRAME_INIT(new_frame, op_errno);</div><div class='add'>+    if (!new_local)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    xattr = dict_new();</div><div class='add'>+    if (!xattr)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    pending = alloca0(priv-&gt;child_count);</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+        if (local-&gt;transaction.pre_op[i] &amp;&amp;</div><div class='add'>+            !local-&gt;transaction.failed_subvols[i]) {</div><div class='add'>+            call_count++;</div><div class='add'>+            continue;</div><div class='add'>+        }</div><div class='add'>+        pending[i] = 1;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	int op_ret   = -1;</div><div class='del'>-	int op_errno = 0;</div><div class='add'>+    changelog = afr_mark_pending_changelog(priv, pending, xattr,</div><div class='add'>+                                           local-&gt;cont.dir_fop.buf.ia_type);</div><div class='add'>+    if (!changelog)</div><div class='add'>+        goto out;</div><div class='ctx'> </div><div class='del'>-	VALIDATE_OR_GOTO (frame, out);</div><div class='del'>-	VALIDATE_OR_GOTO (this, out);</div><div class='del'>-	VALIDATE_OR_GOTO (this-&gt;private, out);</div><div class='add'>+    new_local-&gt;pending = changelog;</div><div class='add'>+    gf_uuid_copy(new_local-&gt;loc.gfid, local-&gt;cont.dir_fop.buf.ia_gfid);</div><div class='add'>+    new_local-&gt;loc.inode = inode_ref(local-&gt;inode);</div><div class='ctx'> </div><div class='del'>-	priv = this-&gt;private;</div><div class='add'>+    new_local-&gt;call_count = call_count;</div><div class='ctx'> </div><div class='del'>-	transaction_frame = copy_frame (frame);</div><div class='del'>-	if (!transaction_frame) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-			"Out of memory.");</div><div class='del'>-		goto out;</div><div class='del'>-	}</div><div class='add'>+    for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+        if (pending[i])</div><div class='add'>+            continue;</div><div class='ctx'> </div><div class='del'>-	ALLOC_OR_GOTO (local, afr_local_t, out);</div><div class='add'>+        STACK_WIND_COOKIE(new_frame, afr_mark_new_entry_changelog_cbk,</div><div class='add'>+                          (void *)(long)i, priv-&gt;children[i],</div><div class='add'>+                          priv-&gt;children[i]-&gt;fops-&gt;xattrop, &amp;new_local-&gt;loc,</div><div class='add'>+                          GF_XATTROP_ADD_ARRAY, xattr, NULL);</div><div class='add'>+        if (!--call_count)</div><div class='add'>+            break;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	ret = AFR_LOCAL_INIT (local, priv);</div><div class='del'>-	if (ret &lt; 0) {</div><div class='del'>-		op_errno = -ret;</div><div class='del'>-		goto out;</div><div class='del'>-	}</div><div class='add'>+    new_frame = NULL;</div><div class='add'>+out:</div><div class='add'>+    if (new_frame)</div><div class='add'>+        AFR_STACK_DESTROY(new_frame);</div><div class='add'>+    if (xattr)</div><div class='add'>+        dict_unref(xattr);</div><div class='add'>+    return;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	transaction_frame-&gt;local = local;</div><div class='add'>+void</div><div class='add'>+afr_mark_entry_pending_changelog(call_frame_t *frame, xlator_t *this)</div><div class='add'>+{</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    int pre_op_count = 0;</div><div class='add'>+    int failed_count = 0;</div><div class='add'>+    unsigned char *success_replies = NULL;</div><div class='ctx'> </div><div class='del'>-	loc_copy (&amp;local-&gt;loc, loc);</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    priv = this-&gt;private;</div><div class='ctx'> </div><div class='del'>-        LOCK (&amp;priv-&gt;read_child_lock);</div><div class='del'>-        {</div><div class='del'>-                local-&gt;read_child_index = (++priv-&gt;read_child_rr) </div><div class='del'>-                        % (priv-&gt;child_count);</div><div class='del'>-        }</div><div class='del'>-        UNLOCK (&amp;priv-&gt;read_child_lock);</div><div class='add'>+    if (local-&gt;op_ret &lt; 0)</div><div class='add'>+        return;</div><div class='ctx'> </div><div class='del'>-	local-&gt;cont.create.flags = flags;</div><div class='del'>-	local-&gt;cont.create.mode  = mode;</div><div class='del'>-	local-&gt;cont.create.fd    = fd_ref (fd);</div><div class='del'>-        if (params)</div><div class='del'>-                local-&gt;cont.create.params = dict_ref (params);</div><div class='add'>+    if (local-&gt;op != GF_FOP_CREATE &amp;&amp; local-&gt;op != GF_FOP_MKNOD &amp;&amp;</div><div class='add'>+        local-&gt;op != GF_FOP_MKDIR)</div><div class='add'>+        return;</div><div class='ctx'> </div><div class='del'>-        if (loc-&gt;parent)</div><div class='del'>-                local-&gt;cont.create.parent_ino = loc-&gt;parent-&gt;ino;</div><div class='add'>+    pre_op_count = AFR_COUNT(local-&gt;transaction.pre_op, priv-&gt;child_count);</div><div class='add'>+    failed_count = AFR_COUNT(local-&gt;transaction.failed_subvols,</div><div class='add'>+                             priv-&gt;child_count);</div><div class='ctx'> </div><div class='del'>-	local-&gt;transaction.fop    = afr_create_wind;</div><div class='del'>-	local-&gt;transaction.done   = afr_create_done;</div><div class='del'>-	local-&gt;transaction.unwind = afr_create_unwind;</div><div class='add'>+    /* FOP succeeded on all bricks. */</div><div class='add'>+    if (pre_op_count == priv-&gt;child_count &amp;&amp; !failed_count)</div><div class='add'>+        return;</div><div class='ctx'> </div><div class='del'>-	afr_build_parent_loc (&amp;local-&gt;transaction.parent_loc, loc);</div><div class='add'>+    /* FOP did not suceed on quorum no. of bricks. */</div><div class='add'>+    success_replies = alloca0(priv-&gt;child_count);</div><div class='add'>+    afr_fill_success_replies(local, priv, success_replies);</div><div class='add'>+    if (!afr_has_quorum(success_replies, this, NULL))</div><div class='add'>+        return;</div><div class='ctx'> </div><div class='del'>-	local-&gt;transaction.main_frame = frame;</div><div class='del'>-	local-&gt;transaction.basename = AFR_BASENAME (loc-&gt;path);</div><div class='add'>+    if (priv-&gt;thin_arbiter_count) {</div><div class='add'>+        /*Mark new entry using ta file*/</div><div class='add'>+        local-&gt;is_new_entry = _gf_true;</div><div class='add'>+        return;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	afr_transaction (transaction_frame, this, AFR_ENTRY_TRANSACTION);</div><div class='add'>+    afr_mark_new_entry_changelog(frame, this);</div><div class='ctx'> </div><div class='del'>-	op_ret = 0;</div><div class='del'>-out:</div><div class='del'>-	if (op_ret == -1) {</div><div class='del'>-		if (transaction_frame)</div><div class='del'>-			AFR_STACK_DESTROY (transaction_frame);</div><div class='del'>-		AFR_STACK_UNWIND (create, frame, op_ret, op_errno,</div><div class='del'>-                                  NULL, NULL, NULL, NULL, NULL);</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='add'>+    return;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-/* }}} */</div><div class='del'>-</div><div class='del'>-/* {{{ mknod */</div><div class='add'>+/* {{{ create */</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-afr_mknod_unwind (call_frame_t *frame, xlator_t *this)</div><div class='add'>+afr_create_unwind(call_frame_t *frame, xlator_t *this)</div><div class='ctx'> {</div><div class='del'>-	call_frame_t *main_frame = NULL;</div><div class='del'>-	afr_local_t  *local = NULL;</div><div class='del'>-</div><div class='del'>-        struct iatt *unwind_buf = NULL;</div><div class='del'>-</div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-</div><div class='del'>-	LOCK (&amp;frame-&gt;lock);</div><div class='del'>-	{</div><div class='del'>-		if (local-&gt;transaction.main_frame) {</div><div class='del'>-			main_frame = local-&gt;transaction.main_frame;</div><div class='del'>-		}</div><div class='del'>-		local-&gt;transaction.main_frame = NULL;</div><div class='del'>-	}</div><div class='del'>-	UNLOCK (&amp;frame-&gt;lock);</div><div class='del'>-</div><div class='del'>-	if (main_frame) {</div><div class='del'>-                if (local-&gt;cont.mknod.read_child_buf.ia_ino) {</div><div class='del'>-                        unwind_buf = &amp;local-&gt;cont.mknod.read_child_buf;</div><div class='del'>-                } else {</div><div class='del'>-                        unwind_buf = &amp;local-&gt;cont.mknod.buf;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                unwind_buf-&gt;ia_ino = local-&gt;cont.mknod.ino;</div><div class='del'>-                unwind_buf-&gt;ia_gen = local-&gt;cont.mknod.gen;</div><div class='del'>-</div><div class='del'>-                local-&gt;cont.mknod.preparent.ia_ino  = local-&gt;cont.mknod.parent_ino;</div><div class='del'>-                local-&gt;cont.mknod.postparent.ia_ino = local-&gt;cont.mknod.parent_ino;</div><div class='del'>-</div><div class='del'>-		AFR_STACK_UNWIND (mknod, main_frame,</div><div class='del'>-                                  local-&gt;op_ret, local-&gt;op_errno,</div><div class='del'>-				  local-&gt;cont.mknod.inode,</div><div class='del'>-				  unwind_buf, &amp;local-&gt;cont.mknod.preparent,</div><div class='del'>-                                  &amp;local-&gt;cont.mknod.postparent);</div><div class='del'>-        }</div><div class='add'>+    call_frame_t *main_frame = NULL;</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='ctx'> </div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='add'>+    local = frame-&gt;local;</div><div class='ctx'> </div><div class='add'>+    main_frame = afr_transaction_detach_fop_frame(frame);</div><div class='add'>+</div><div class='add'>+    if (!main_frame)</div><div class='add'>+        return 0;</div><div class='add'>+</div><div class='add'>+    AFR_STACK_UNWIND(create, main_frame, local-&gt;op_ret, local-&gt;op_errno,</div><div class='add'>+                     local-&gt;cont.create.fd, local-&gt;inode,</div><div class='add'>+                     &amp;local-&gt;cont.dir_fop.buf, &amp;local-&gt;cont.dir_fop.preparent,</div><div class='add'>+                     &amp;local-&gt;cont.dir_fop.postparent, local-&gt;xdata_rsp);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-afr_mknod_wind_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-                    int32_t op_ret, int32_t op_errno, inode_t *inode,</div><div class='add'>+afr_create_wind_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                    int32_t op_ret, int32_t op_errno, fd_t *fd, inode_t *inode,</div><div class='ctx'>                     struct iatt *buf, struct iatt *preparent,</div><div class='del'>-                    struct iatt *postparent)</div><div class='add'>+                    struct iatt *postparent, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-	afr_local_t *   local = NULL;</div><div class='del'>-	afr_private_t * priv  = NULL;</div><div class='del'>-</div><div class='del'>-	int call_count = -1;</div><div class='del'>-	int child_index = -1;</div><div class='del'>-</div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-	priv = this-&gt;private;</div><div class='del'>-</div><div class='del'>-	child_index = (long) cookie;</div><div class='del'>-</div><div class='del'>-	LOCK (&amp;frame-&gt;lock);</div><div class='del'>-	{</div><div class='del'>-		if (afr_fop_failed (op_ret, op_errno))</div><div class='del'>-			afr_transaction_fop_failed (frame, this, child_index);</div><div class='del'>-		</div><div class='del'>-		if (op_ret != -1) {</div><div class='del'>-			local-&gt;op_ret = op_ret;</div><div class='del'>-</div><div class='del'>-			if (local-&gt;success_count == 0){</div><div class='del'>-				local-&gt;cont.mknod.buf   = *buf;</div><div class='del'>-				local-&gt;cont.mknod.ino   = </div><div class='del'>-					afr_itransform (buf-&gt;ia_ino,</div><div class='del'>-							priv-&gt;child_count,</div><div class='del'>-							child_index);</div><div class='del'>-                                local-&gt;cont.mknod.gen   = buf-&gt;ia_gen;</div><div class='del'>-</div><div class='del'>-                                if (priv-&gt;read_child &gt;= 0) {</div><div class='del'>-                                        afr_set_read_child (this, inode,</div><div class='del'>-                                                            priv-&gt;read_child);</div><div class='del'>-                                } else {</div><div class='del'>-                                        afr_set_read_child (this, inode,</div><div class='del'>-                                                            local-&gt;read_child_index);</div><div class='del'>-                                }</div><div class='del'>-			}</div><div class='del'>-</div><div class='del'>-                        if (child_index == local-&gt;first_up_child) {</div><div class='del'>-                                local-&gt;cont.mknod.ino =</div><div class='del'>-                                        afr_itransform (buf-&gt;ia_ino,</div><div class='del'>-                                                        priv-&gt;child_count,</div><div class='del'>-                                                        local-&gt;first_up_child);</div><div class='del'>-                                local-&gt;cont.mknod.gen = buf-&gt;ia_gen;</div><div class='del'>-                        }</div><div class='del'>-</div><div class='del'>-                        if (child_index == local-&gt;read_child_index) {</div><div class='del'>-                                local-&gt;cont.mknod.read_child_buf = *buf;</div><div class='del'>-                                local-&gt;cont.mknod.preparent      = *preparent;</div><div class='del'>-                                local-&gt;cont.mknod.postparent     = *postparent;</div><div class='del'>-                        }</div><div class='del'>-                        </div><div class='del'>-			local-&gt;cont.mknod.inode = inode;</div><div class='del'>-</div><div class='del'>-			local-&gt;success_count++;</div><div class='del'>-		}</div><div class='del'>-</div><div class='del'>-		local-&gt;op_errno = op_errno;</div><div class='del'>-	}</div><div class='del'>-	UNLOCK (&amp;frame-&gt;lock);</div><div class='del'>-</div><div class='del'>-	call_count = afr_frame_return (frame);</div><div class='del'>-</div><div class='del'>-	if (call_count == 0) {</div><div class='del'>-		local-&gt;transaction.unwind (frame, this);</div><div class='del'>-</div><div class='del'>-		local-&gt;transaction.resume (frame, this);</div><div class='del'>-	}</div><div class='del'>-	</div><div class='del'>-	return 0;</div><div class='add'>+    return __afr_dir_write_cbk(frame, cookie, this, op_ret, op_errno, buf,</div><div class='add'>+                               preparent, postparent, NULL, NULL, xdata);</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-afr_mknod_wind (call_frame_t *frame, xlator_t *this)</div><div class='add'>+int</div><div class='add'>+afr_create_wind(call_frame_t *frame, xlator_t *this, int subvol)</div><div class='ctx'> {</div><div class='del'>-	afr_local_t *local = NULL;</div><div class='del'>-	afr_private_t *priv = NULL;</div><div class='del'>-</div><div class='del'>-	int call_count = -1;</div><div class='del'>-	int i = 0;</div><div class='del'>-</div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-	priv  = this-&gt;private;</div><div class='del'>-</div><div class='del'>-	call_count = afr_up_children_count (priv-&gt;child_count, local-&gt;child_up);</div><div class='del'>-</div><div class='del'>-	if (call_count == 0) {</div><div class='del'>-		local-&gt;transaction.resume (frame, this);</div><div class='del'>-		return 0;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	local-&gt;call_count = call_count;</div><div class='del'>-</div><div class='del'>-	for (i = 0; i &lt; priv-&gt;child_count; i++) {				</div><div class='del'>-		if (local-&gt;child_up[i]) {</div><div class='del'>-			STACK_WIND_COOKIE (frame, afr_mknod_wind_cbk, (void *) (long) i,</div><div class='del'>-					   priv-&gt;children[i], </div><div class='del'>-					   priv-&gt;children[i]-&gt;fops-&gt;mknod,</div><div class='del'>-					   &amp;local-&gt;loc, local-&gt;cont.mknod.mode,</div><div class='del'>-					   local-&gt;cont.mknod.dev,</div><div class='del'>-                                           local-&gt;cont.mknod.params);</div><div class='del'>-			if (!--call_count)</div><div class='del'>-				break;</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='del'>-	</div><div class='del'>-	return 0;</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    STACK_WIND_COOKIE(frame, afr_create_wind_cbk, (void *)(long)subvol,</div><div class='add'>+                      priv-&gt;children[subvol],</div><div class='add'>+                      priv-&gt;children[subvol]-&gt;fops-&gt;create, &amp;local-&gt;loc,</div><div class='add'>+                      local-&gt;cont.create.flags, local-&gt;cont.create.mode,</div><div class='add'>+                      local-&gt;umask, local-&gt;cont.create.fd, local-&gt;xdata_req);</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-afr_mknod_done (call_frame_t *frame, xlator_t *this)</div><div class='add'>+afr_create(call_frame_t *frame, xlator_t *this, loc_t *loc, int32_t flags,</div><div class='add'>+           mode_t mode, mode_t umask, fd_t *fd, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-	afr_local_t * local = NULL;</div><div class='del'>-</div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-</div><div class='del'>-	local-&gt;transaction.unwind (frame, this);</div><div class='del'>-	AFR_STACK_DESTROY (frame);</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    call_frame_t *transaction_frame = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int op_errno = ENOMEM;</div><div class='add'>+</div><div class='add'>+    transaction_frame = copy_frame(frame);</div><div class='add'>+    if (!transaction_frame)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    local = AFR_FRAME_INIT(transaction_frame, op_errno);</div><div class='add'>+    if (!local)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    loc_copy(&amp;local-&gt;loc, loc);</div><div class='add'>+</div><div class='add'>+    local-&gt;fd_ctx = afr_fd_ctx_get(fd, this);</div><div class='add'>+    if (!local-&gt;fd_ctx)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    local-&gt;inode = inode_ref(loc-&gt;inode);</div><div class='add'>+    local-&gt;parent = inode_ref(loc-&gt;parent);</div><div class='add'>+</div><div class='add'>+    local-&gt;op = GF_FOP_CREATE;</div><div class='add'>+    local-&gt;cont.create.flags = flags;</div><div class='add'>+    local-&gt;fd_ctx-&gt;flags = flags;</div><div class='add'>+    local-&gt;cont.create.mode = mode;</div><div class='add'>+    local-&gt;cont.create.fd = fd_ref(fd);</div><div class='add'>+    local-&gt;umask = umask;</div><div class='add'>+</div><div class='add'>+    if (xdata)</div><div class='add'>+        local-&gt;xdata_req = dict_copy_with_ref(xdata, NULL);</div><div class='add'>+    else</div><div class='add'>+        local-&gt;xdata_req = dict_new();</div><div class='add'>+</div><div class='add'>+    if (!local-&gt;xdata_req)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    local-&gt;transaction.wind = afr_create_wind;</div><div class='add'>+    local-&gt;transaction.unwind = afr_create_unwind;</div><div class='add'>+</div><div class='add'>+    ret = afr_build_parent_loc(&amp;local-&gt;transaction.parent_loc, loc, &amp;op_errno);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    local-&gt;transaction.main_frame = frame;</div><div class='add'>+    local-&gt;transaction.basename = AFR_BASENAME(loc-&gt;path);</div><div class='add'>+    ret = afr_transaction(transaction_frame, this, AFR_ENTRY_TRANSACTION);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        op_errno = -ret;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+out:</div><div class='add'>+    if (transaction_frame)</div><div class='add'>+        AFR_STACK_DESTROY(transaction_frame);</div><div class='ctx'> </div><div class='del'>-	return 0;</div><div class='add'>+    AFR_STACK_UNWIND(create, frame, -1, op_errno, NULL, NULL, NULL, NULL, NULL,</div><div class='add'>+                     NULL);</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+/* }}} */</div><div class='add'>+</div><div class='add'>+/* {{{ mknod */</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-afr_mknod (call_frame_t *frame, xlator_t *this,</div><div class='del'>-	   loc_t *loc, mode_t mode, dev_t dev, dict_t *params)</div><div class='add'>+afr_mknod_unwind(call_frame_t *frame, xlator_t *this)</div><div class='ctx'> {</div><div class='del'>-	afr_private_t * priv  = NULL;</div><div class='del'>-	afr_local_t   * local = NULL;</div><div class='del'>-	call_frame_t  * transaction_frame = NULL;</div><div class='del'>-</div><div class='del'>-	int ret = -1;</div><div class='del'>-</div><div class='del'>-	int op_ret   = -1;</div><div class='del'>-	int op_errno = 0;</div><div class='del'>-</div><div class='del'>-	VALIDATE_OR_GOTO (frame, out);</div><div class='del'>-	VALIDATE_OR_GOTO (this, out);</div><div class='del'>-	VALIDATE_OR_GOTO (this-&gt;private, out);</div><div class='del'>-</div><div class='del'>-	priv = this-&gt;private;</div><div class='del'>-</div><div class='del'>-	transaction_frame = copy_frame (frame);</div><div class='del'>-	if (!transaction_frame) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-			"Out of memory.");</div><div class='del'>-		goto out;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	ALLOC_OR_GOTO (local, afr_local_t, out);</div><div class='add'>+    call_frame_t *main_frame = NULL;</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='ctx'> </div><div class='del'>-	ret = AFR_LOCAL_INIT (local, priv);</div><div class='del'>-	if (ret &lt; 0) {</div><div class='del'>-		op_errno = -ret;</div><div class='del'>-		goto out;</div><div class='del'>-	}</div><div class='add'>+    local = frame-&gt;local;</div><div class='ctx'> </div><div class='del'>-	transaction_frame-&gt;local = local;</div><div class='add'>+    main_frame = afr_transaction_detach_fop_frame(frame);</div><div class='add'>+    if (!main_frame)</div><div class='add'>+        return 0;</div><div class='ctx'> </div><div class='del'>-	loc_copy (&amp;local-&gt;loc, loc);</div><div class='del'>-</div><div class='del'>-        LOCK (&amp;priv-&gt;read_child_lock);</div><div class='del'>-        {</div><div class='del'>-                local-&gt;read_child_index = (++priv-&gt;read_child_rr) </div><div class='del'>-                        % (priv-&gt;child_count);</div><div class='del'>-        }</div><div class='del'>-        UNLOCK (&amp;priv-&gt;read_child_lock);</div><div class='del'>-</div><div class='del'>-	local-&gt;cont.mknod.mode  = mode;</div><div class='del'>-	local-&gt;cont.mknod.dev   = dev;</div><div class='del'>-        if (params)</div><div class='del'>-                local-&gt;cont.mknod.params = dict_ref (params);</div><div class='del'>-</div><div class='del'>-        if (loc-&gt;parent)</div><div class='del'>-                local-&gt;cont.mknod.parent_ino = loc-&gt;parent-&gt;ino;</div><div class='del'>-</div><div class='del'>-	local-&gt;transaction.fop    = afr_mknod_wind;</div><div class='del'>-	local-&gt;transaction.done   = afr_mknod_done;</div><div class='del'>-	local-&gt;transaction.unwind = afr_mknod_unwind;</div><div class='del'>-</div><div class='del'>-	afr_build_parent_loc (&amp;local-&gt;transaction.parent_loc, loc);</div><div class='add'>+    AFR_STACK_UNWIND(mknod, main_frame, local-&gt;op_ret, local-&gt;op_errno,</div><div class='add'>+                     local-&gt;inode, &amp;local-&gt;cont.dir_fop.buf,</div><div class='add'>+                     &amp;local-&gt;cont.dir_fop.preparent,</div><div class='add'>+                     &amp;local-&gt;cont.dir_fop.postparent, local-&gt;xdata_rsp);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	local-&gt;transaction.main_frame = frame;</div><div class='del'>-	local-&gt;transaction.basename = AFR_BASENAME (loc-&gt;path);</div><div class='add'>+int</div><div class='add'>+afr_mknod_wind_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                   int32_t op_ret, int32_t op_errno, inode_t *inode,</div><div class='add'>+                   struct iatt *buf, struct iatt *preparent,</div><div class='add'>+                   struct iatt *postparent, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    return __afr_dir_write_cbk(frame, cookie, this, op_ret, op_errno, buf,</div><div class='add'>+                               preparent, postparent, NULL, NULL, xdata);</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	afr_transaction (transaction_frame, this, AFR_ENTRY_TRANSACTION);</div><div class='add'>+int</div><div class='add'>+afr_mknod_wind(call_frame_t *frame, xlator_t *this, int subvol)</div><div class='add'>+{</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    STACK_WIND_COOKIE(frame, afr_mknod_wind_cbk, (void *)(long)subvol,</div><div class='add'>+                      priv-&gt;children[subvol],</div><div class='add'>+                      priv-&gt;children[subvol]-&gt;fops-&gt;mknod, &amp;local-&gt;loc,</div><div class='add'>+                      local-&gt;cont.mknod.mode, local-&gt;cont.mknod.dev,</div><div class='add'>+                      local-&gt;umask, local-&gt;xdata_req);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	op_ret = 0;</div><div class='add'>+int</div><div class='add'>+afr_mknod(call_frame_t *frame, xlator_t *this, loc_t *loc, mode_t mode,</div><div class='add'>+          dev_t dev, mode_t umask, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    call_frame_t *transaction_frame = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int op_errno = ENOMEM;</div><div class='add'>+</div><div class='add'>+    transaction_frame = copy_frame(frame);</div><div class='add'>+    if (!transaction_frame)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    local = AFR_FRAME_INIT(transaction_frame, op_errno);</div><div class='add'>+    if (!local)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    loc_copy(&amp;local-&gt;loc, loc);</div><div class='add'>+    local-&gt;inode = inode_ref(loc-&gt;inode);</div><div class='add'>+    local-&gt;parent = inode_ref(loc-&gt;parent);</div><div class='add'>+</div><div class='add'>+    local-&gt;op = GF_FOP_MKNOD;</div><div class='add'>+    local-&gt;cont.mknod.mode = mode;</div><div class='add'>+    local-&gt;cont.mknod.dev = dev;</div><div class='add'>+    local-&gt;umask = umask;</div><div class='add'>+</div><div class='add'>+    if (xdata)</div><div class='add'>+        local-&gt;xdata_req = dict_copy_with_ref(xdata, NULL);</div><div class='add'>+    else</div><div class='add'>+        local-&gt;xdata_req = dict_new();</div><div class='add'>+</div><div class='add'>+    if (!local-&gt;xdata_req)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    local-&gt;transaction.wind = afr_mknod_wind;</div><div class='add'>+    local-&gt;transaction.unwind = afr_mknod_unwind;</div><div class='add'>+</div><div class='add'>+    ret = afr_build_parent_loc(&amp;local-&gt;transaction.parent_loc, loc, &amp;op_errno);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    local-&gt;transaction.main_frame = frame;</div><div class='add'>+    local-&gt;transaction.basename = AFR_BASENAME(loc-&gt;path);</div><div class='add'>+    ret = afr_transaction(transaction_frame, this, AFR_ENTRY_TRANSACTION);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        op_errno = -ret;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='ctx'> out:</div><div class='del'>-	if (op_ret == -1) {</div><div class='del'>-		if (transaction_frame)</div><div class='del'>-			AFR_STACK_DESTROY (transaction_frame);</div><div class='del'>-		AFR_STACK_UNWIND (mknod, frame, op_ret, op_errno,</div><div class='del'>-                                  NULL, NULL, NULL, NULL);</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='add'>+    if (transaction_frame)</div><div class='add'>+        AFR_STACK_DESTROY(transaction_frame);</div><div class='add'>+</div><div class='add'>+    AFR_STACK_UNWIND(mknod, frame, -1, op_errno, NULL, NULL, NULL, NULL, NULL);</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> /* }}} */</div><div class='ctx'> </div><div class='ctx'> /* {{{ mkdir */</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-afr_mkdir_unwind (call_frame_t *frame, xlator_t *this)</div><div class='add'>+afr_mkdir_unwind(call_frame_t *frame, xlator_t *this)</div><div class='ctx'> {</div><div class='del'>-	call_frame_t *main_frame = NULL;</div><div class='del'>-	afr_local_t  *local = NULL;</div><div class='del'>-</div><div class='del'>-        struct iatt *unwind_buf = NULL;</div><div class='del'>-        </div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-</div><div class='del'>-	LOCK (&amp;frame-&gt;lock);</div><div class='del'>-	{</div><div class='del'>-		if (local-&gt;transaction.main_frame) {</div><div class='del'>-			main_frame = local-&gt;transaction.main_frame;</div><div class='del'>-		}</div><div class='del'>-		local-&gt;transaction.main_frame = NULL;</div><div class='del'>-	}</div><div class='del'>-	UNLOCK (&amp;frame-&gt;lock);</div><div class='del'>-</div><div class='del'>-	if (main_frame) {</div><div class='del'>-                if (local-&gt;cont.mkdir.read_child_buf.ia_ino) {</div><div class='del'>-                        unwind_buf = &amp;local-&gt;cont.mkdir.read_child_buf;</div><div class='del'>-                } else {</div><div class='del'>-                        unwind_buf = &amp;local-&gt;cont.mkdir.buf;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                unwind_buf-&gt;ia_ino = local-&gt;cont.mkdir.ino;</div><div class='del'>-                unwind_buf-&gt;ia_gen = local-&gt;cont.mkdir.gen;</div><div class='del'>-</div><div class='del'>-                local-&gt;cont.mkdir.preparent.ia_ino  = local-&gt;cont.mkdir.parent_ino;</div><div class='del'>-                local-&gt;cont.mkdir.postparent.ia_ino = local-&gt;cont.mkdir.parent_ino;</div><div class='del'>-</div><div class='del'>-		AFR_STACK_UNWIND (mkdir, main_frame,</div><div class='del'>-                                  local-&gt;op_ret, local-&gt;op_errno,</div><div class='del'>-				  local-&gt;cont.mkdir.inode,</div><div class='del'>-				  unwind_buf, &amp;local-&gt;cont.mkdir.preparent,</div><div class='del'>-                        &amp;local-&gt;cont.mkdir.postparent);</div><div class='del'>-        }</div><div class='add'>+    call_frame_t *main_frame = NULL;</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='ctx'> </div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='add'>+    local = frame-&gt;local;</div><div class='ctx'> </div><div class='add'>+    main_frame = afr_transaction_detach_fop_frame(frame);</div><div class='add'>+    if (!main_frame)</div><div class='add'>+        return 0;</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-afr_mkdir_wind_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-                    int32_t op_ret, int32_t op_errno, inode_t *inode,</div><div class='del'>-                    struct iatt *buf, struct iatt *preparent,</div><div class='del'>-                    struct iatt *postparent)</div><div class='del'>-{</div><div class='del'>-	afr_local_t *   local = NULL;</div><div class='del'>-	afr_private_t * priv  = NULL;</div><div class='del'>-</div><div class='del'>-	int call_count = -1;</div><div class='del'>-	int child_index = -1;</div><div class='del'>-</div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-	priv = this-&gt;private;</div><div class='del'>-</div><div class='del'>-	child_index = (long) cookie;</div><div class='del'>-</div><div class='del'>-	LOCK (&amp;frame-&gt;lock);</div><div class='del'>-	{</div><div class='del'>-		if (afr_fop_failed (op_ret, op_errno))</div><div class='del'>-			afr_transaction_fop_failed (frame, this, child_index);</div><div class='del'>-</div><div class='del'>-		if (op_ret != -1) {</div><div class='del'>-			local-&gt;op_ret           = op_ret;</div><div class='del'>-</div><div class='del'>-			if (local-&gt;success_count == 0) {</div><div class='del'>-				local-&gt;cont.mkdir.buf   = *buf;</div><div class='del'>-</div><div class='del'>-                                local-&gt;cont.mkdir.ino =</div><div class='del'>-                                        afr_itransform (buf-&gt;ia_ino,</div><div class='del'>-                                                        priv-&gt;child_count,</div><div class='del'>-                                                        child_index);</div><div class='del'>-                                local-&gt;cont.mkdir.gen = buf-&gt;ia_gen;</div><div class='del'>-</div><div class='del'>-                                if (priv-&gt;read_child &gt;= 0) {</div><div class='del'>-                                        afr_set_read_child (this, inode,</div><div class='del'>-                                                            priv-&gt;read_child);</div><div class='del'>-                                } else {</div><div class='del'>-                                        afr_set_read_child (this, inode,</div><div class='del'>-                                                            local-&gt;read_child_index);</div><div class='del'>-                                }</div><div class='del'>-			}</div><div class='del'>-</div><div class='del'>-                        if (child_index == local-&gt;first_up_child) {</div><div class='del'>-                                local-&gt;cont.mkdir.ino =</div><div class='del'>-                                        afr_itransform (buf-&gt;ia_ino,</div><div class='del'>-                                                        priv-&gt;child_count,</div><div class='del'>-                                                        local-&gt;first_up_child);</div><div class='del'>-                                local-&gt;cont.mkdir.gen = buf-&gt;ia_gen;</div><div class='del'>-                        }</div><div class='del'>-                        </div><div class='del'>-                        if (child_index == local-&gt;read_child_index) {</div><div class='del'>-                                local-&gt;cont.mkdir.read_child_buf = *buf;</div><div class='del'>-                                local-&gt;cont.mkdir.preparent      = *preparent;</div><div class='del'>-                                local-&gt;cont.mkdir.postparent     = *postparent;</div><div class='del'>-                        }</div><div class='del'>-</div><div class='del'>-			local-&gt;cont.mkdir.inode = inode;</div><div class='del'>-</div><div class='del'>-			local-&gt;success_count++;</div><div class='del'>-		}</div><div class='del'>-</div><div class='del'>-		local-&gt;op_errno         = op_errno;</div><div class='del'>-	}</div><div class='del'>-	UNLOCK (&amp;frame-&gt;lock);</div><div class='del'>-</div><div class='del'>-	call_count = afr_frame_return (frame);</div><div class='del'>-</div><div class='del'>-	if (call_count == 0) {</div><div class='del'>-		local-&gt;transaction.unwind (frame, this);</div><div class='del'>-</div><div class='del'>-		local-&gt;transaction.resume (frame, this);</div><div class='del'>-	}</div><div class='del'>-	</div><div class='del'>-	return 0;</div><div class='add'>+    AFR_STACK_UNWIND(mkdir, main_frame, local-&gt;op_ret, local-&gt;op_errno,</div><div class='add'>+                     local-&gt;inode, &amp;local-&gt;cont.dir_fop.buf,</div><div class='add'>+                     &amp;local-&gt;cont.dir_fop.preparent,</div><div class='add'>+                     &amp;local-&gt;cont.dir_fop.postparent, local-&gt;xdata_rsp);</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-afr_mkdir_wind (call_frame_t *frame, xlator_t *this)</div><div class='add'>+afr_mkdir_wind_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                   int32_t op_ret, int32_t op_errno, inode_t *inode,</div><div class='add'>+                   struct iatt *buf, struct iatt *preparent,</div><div class='add'>+                   struct iatt *postparent, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-	afr_local_t *local = NULL;</div><div class='del'>-	afr_private_t *priv = NULL;</div><div class='del'>-	</div><div class='del'>-	int call_count = -1;</div><div class='del'>-	int i = 0;</div><div class='del'>-</div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-	priv  = this-&gt;private;</div><div class='del'>-</div><div class='del'>-	call_count = afr_up_children_count (priv-&gt;child_count, local-&gt;child_up);</div><div class='del'>-</div><div class='del'>-	if (call_count == 0) {</div><div class='del'>-		local-&gt;transaction.resume (frame, this);</div><div class='del'>-		return 0;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	local-&gt;call_count = call_count;</div><div class='del'>-</div><div class='del'>-	for (i = 0; i &lt; priv-&gt;child_count; i++) {				</div><div class='del'>-		if (local-&gt;child_up[i]) {</div><div class='del'>-			STACK_WIND_COOKIE (frame, afr_mkdir_wind_cbk,</div><div class='del'>-					   (void *) (long) i,	</div><div class='del'>-					   priv-&gt;children[i], </div><div class='del'>-					   priv-&gt;children[i]-&gt;fops-&gt;mkdir,</div><div class='del'>-					   &amp;local-&gt;loc, local-&gt;cont.mkdir.mode,</div><div class='del'>-                                           local-&gt;cont.mkdir.params);</div><div class='del'>-			if (!--call_count)</div><div class='del'>-				break;</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='del'>-	</div><div class='del'>-	return 0;</div><div class='add'>+    return __afr_dir_write_cbk(frame, cookie, this, op_ret, op_errno, buf,</div><div class='add'>+                               preparent, postparent, NULL, NULL, xdata);</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-afr_mkdir_done (call_frame_t *frame, xlator_t *this)</div><div class='add'>+afr_mkdir_wind(call_frame_t *frame, xlator_t *this, int subvol)</div><div class='ctx'> {</div><div class='del'>-	afr_local_t * local = NULL;</div><div class='del'>-</div><div class='del'>-	local = frame-&gt;local;</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='ctx'> </div><div class='del'>-	local-&gt;transaction.unwind (frame, this);</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    priv = this-&gt;private;</div><div class='ctx'> </div><div class='del'>-	AFR_STACK_DESTROY (frame);</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='add'>+    STACK_WIND_COOKIE(frame, afr_mkdir_wind_cbk, (void *)(long)subvol,</div><div class='add'>+                      priv-&gt;children[subvol],</div><div class='add'>+                      priv-&gt;children[subvol]-&gt;fops-&gt;mkdir, &amp;local-&gt;loc,</div><div class='add'>+                      local-&gt;cont.mkdir.mode, local-&gt;umask, local-&gt;xdata_req);</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-afr_mkdir (call_frame_t *frame, xlator_t *this,</div><div class='del'>-	   loc_t *loc, mode_t mode, dict_t *params)</div><div class='add'>+afr_mkdir(call_frame_t *frame, xlator_t *this, loc_t *loc, mode_t mode,</div><div class='add'>+          mode_t umask, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-	afr_private_t * priv  = NULL;</div><div class='del'>-	afr_local_t   * local = NULL;</div><div class='del'>-	call_frame_t  * transaction_frame = NULL;</div><div class='del'>-</div><div class='del'>-	int ret = -1;</div><div class='del'>-</div><div class='del'>-	int op_ret   = -1;</div><div class='del'>-	int op_errno = 0;</div><div class='del'>-</div><div class='del'>-	VALIDATE_OR_GOTO (frame, out);</div><div class='del'>-	VALIDATE_OR_GOTO (this, out);</div><div class='del'>-	VALIDATE_OR_GOTO (this-&gt;private, out);</div><div class='del'>-</div><div class='del'>-	priv = this-&gt;private;</div><div class='del'>-</div><div class='del'>-	transaction_frame = copy_frame (frame);</div><div class='del'>-	if (!transaction_frame) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-			"Out of memory.");</div><div class='del'>-		goto out;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	ALLOC_OR_GOTO (local, afr_local_t, out);</div><div class='del'>-</div><div class='del'>-	ret = AFR_LOCAL_INIT (local, priv);</div><div class='del'>-	if (ret &lt; 0) {</div><div class='del'>-		op_errno = -ret;</div><div class='del'>-		goto out;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	transaction_frame-&gt;local = local;</div><div class='del'>-</div><div class='del'>-	loc_copy (&amp;local-&gt;loc, loc);</div><div class='del'>-</div><div class='del'>-        LOCK (&amp;priv-&gt;read_child_lock);</div><div class='del'>-        {</div><div class='del'>-                local-&gt;read_child_index = (++priv-&gt;read_child_rr) </div><div class='del'>-                        % (priv-&gt;child_count);</div><div class='del'>-        }</div><div class='del'>-        UNLOCK (&amp;priv-&gt;read_child_lock);</div><div class='del'>-</div><div class='del'>-	local-&gt;cont.mkdir.mode  = mode;</div><div class='del'>-        if (params)</div><div class='del'>-                local-&gt;cont.mkdir.params = dict_ref (params);</div><div class='del'>-</div><div class='del'>-        if (loc-&gt;parent)</div><div class='del'>-                local-&gt;cont.mkdir.parent_ino = loc-&gt;parent-&gt;ino;</div><div class='del'>-</div><div class='del'>-	local-&gt;transaction.fop    = afr_mkdir_wind;</div><div class='del'>-	local-&gt;transaction.done   = afr_mkdir_done;</div><div class='del'>-	local-&gt;transaction.unwind = afr_mkdir_unwind;</div><div class='del'>-</div><div class='del'>-	afr_build_parent_loc (&amp;local-&gt;transaction.parent_loc, loc);</div><div class='del'>-</div><div class='del'>-	local-&gt;transaction.main_frame = frame;</div><div class='del'>-	local-&gt;transaction.basename = AFR_BASENAME (loc-&gt;path);</div><div class='del'>-</div><div class='del'>-	afr_transaction (transaction_frame, this, AFR_ENTRY_TRANSACTION);</div><div class='del'>-</div><div class='del'>-	op_ret = 0;</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    call_frame_t *transaction_frame = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int op_errno = ENOMEM;</div><div class='add'>+</div><div class='add'>+    transaction_frame = copy_frame(frame);</div><div class='add'>+    if (!transaction_frame)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    local = AFR_FRAME_INIT(transaction_frame, op_errno);</div><div class='add'>+    if (!local)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    loc_copy(&amp;local-&gt;loc, loc);</div><div class='add'>+    local-&gt;inode = inode_ref(loc-&gt;inode);</div><div class='add'>+    local-&gt;parent = inode_ref(loc-&gt;parent);</div><div class='add'>+</div><div class='add'>+    local-&gt;cont.mkdir.mode = mode;</div><div class='add'>+    local-&gt;umask = umask;</div><div class='add'>+</div><div class='add'>+    if (!xdata || !dict_get_sizen(xdata, "gfid-req")) {</div><div class='add'>+        op_errno = EPERM;</div><div class='add'>+        gf_msg_callingfn(this-&gt;name, GF_LOG_WARNING, op_errno,</div><div class='add'>+                         AFR_MSG_GFID_NULL,</div><div class='add'>+                         "mkdir: %s is received "</div><div class='add'>+                         "without gfid-req %p",</div><div class='add'>+                         loc-&gt;path, xdata);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    local-&gt;xdata_req = dict_copy_with_ref(xdata, NULL);</div><div class='add'>+    if (!local-&gt;xdata_req) {</div><div class='add'>+        op_errno = ENOMEM;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    local-&gt;op = GF_FOP_MKDIR;</div><div class='add'>+    local-&gt;transaction.wind = afr_mkdir_wind;</div><div class='add'>+    local-&gt;transaction.unwind = afr_mkdir_unwind;</div><div class='add'>+</div><div class='add'>+    ret = afr_build_parent_loc(&amp;local-&gt;transaction.parent_loc, loc, &amp;op_errno);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    local-&gt;transaction.main_frame = frame;</div><div class='add'>+    local-&gt;transaction.basename = AFR_BASENAME(loc-&gt;path);</div><div class='add'>+    ret = afr_transaction(transaction_frame, this, AFR_ENTRY_TRANSACTION);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        op_errno = -ret;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='ctx'> out:</div><div class='del'>-	if (op_ret == -1) {</div><div class='del'>-		if (transaction_frame)</div><div class='del'>-			AFR_STACK_DESTROY (transaction_frame);</div><div class='del'>-</div><div class='del'>-		AFR_STACK_UNWIND (mkdir, frame, op_ret, op_errno,</div><div class='del'>-                                  NULL, NULL, NULL, NULL);</div><div class='del'>-	}</div><div class='add'>+    if (transaction_frame)</div><div class='add'>+        AFR_STACK_DESTROY(transaction_frame);</div><div class='ctx'> </div><div class='del'>-	return 0;</div><div class='add'>+    AFR_STACK_UNWIND(mkdir, frame, -1, op_errno, NULL, NULL, NULL, NULL, NULL);</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> /* }}} */</div><div class='ctx'> </div><div class='ctx'> /* {{{ link */</div><div class='ctx'> </div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-afr_link_unwind (call_frame_t *frame, xlator_t *this)</div><div class='del'>-{</div><div class='del'>-	call_frame_t *main_frame = NULL;</div><div class='del'>-	afr_local_t  *local = NULL;</div><div class='del'>-</div><div class='del'>-        struct iatt *unwind_buf = NULL;</div><div class='del'>-</div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-</div><div class='del'>-	LOCK (&amp;frame-&gt;lock);</div><div class='del'>-	{</div><div class='del'>-		if (local-&gt;transaction.main_frame) {</div><div class='del'>-			main_frame = local-&gt;transaction.main_frame;</div><div class='del'>-		}</div><div class='del'>-		local-&gt;transaction.main_frame = NULL;</div><div class='del'>-	}</div><div class='del'>-	UNLOCK (&amp;frame-&gt;lock);</div><div class='del'>-</div><div class='del'>-	if (main_frame) {</div><div class='del'>-                if (local-&gt;cont.link.read_child_buf.ia_ino) {</div><div class='del'>-                        unwind_buf = &amp;local-&gt;cont.link.read_child_buf;</div><div class='del'>-                } else {</div><div class='del'>-                        unwind_buf = &amp;local-&gt;cont.link.buf;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-		unwind_buf-&gt;ia_ino = local-&gt;cont.link.ino;</div><div class='del'>-</div><div class='del'>-                local-&gt;cont.link.preparent.ia_ino  = local-&gt;cont.link.parent_ino;</div><div class='del'>-                local-&gt;cont.link.postparent.ia_ino = local-&gt;cont.link.parent_ino;</div><div class='del'>-</div><div class='del'>-		AFR_STACK_UNWIND (link, main_frame,</div><div class='del'>-                                  local-&gt;op_ret, local-&gt;op_errno, </div><div class='del'>-				  local-&gt;cont.link.inode,</div><div class='del'>-				  unwind_buf, &amp;local-&gt;cont.link.preparent,</div><div class='del'>-                                  &amp;local-&gt;cont.link.postparent);</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-afr_link_wind_cbk (call_frame_t *frame, void *cookie, xlator_t *this, </div><div class='del'>-		   int32_t op_ret, int32_t op_errno, inode_t *inode,</div><div class='del'>-                   struct iatt *buf, struct iatt *preparent,</div><div class='del'>-                   struct iatt *postparent)</div><div class='add'>+afr_link_unwind(call_frame_t *frame, xlator_t *this)</div><div class='ctx'> {</div><div class='del'>-	afr_local_t *   local = NULL;</div><div class='del'>-	afr_private_t * priv  = NULL;</div><div class='del'>-</div><div class='del'>-	int call_count = -1;</div><div class='del'>-	int child_index = -1;</div><div class='del'>-</div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-	priv = this-&gt;private;</div><div class='del'>-</div><div class='del'>-	child_index = (long) cookie;</div><div class='del'>-</div><div class='del'>-	LOCK (&amp;frame-&gt;lock);</div><div class='del'>-	{</div><div class='del'>-		if (afr_fop_failed (op_ret, op_errno))</div><div class='del'>-			afr_transaction_fop_failed (frame, this, child_index);</div><div class='del'>-</div><div class='del'>-		if (op_ret != -1) {</div><div class='del'>-			local-&gt;op_ret   = op_ret;</div><div class='del'>-</div><div class='del'>-			if (local-&gt;success_count == 0) {</div><div class='del'>-				local-&gt;cont.link.buf        = *buf;</div><div class='del'>-</div><div class='del'>-                                if (priv-&gt;read_child &gt;= 0) {</div><div class='del'>-                                        afr_set_read_child (this, inode,</div><div class='del'>-                                                            priv-&gt;read_child);</div><div class='del'>-                                } else {</div><div class='del'>-                                        afr_set_read_child (this, inode,</div><div class='del'>-                                                            local-&gt;read_child_index);</div><div class='del'>-                                }</div><div class='del'>-			}</div><div class='del'>-</div><div class='del'>-                        if (child_index == local-&gt;read_child_index) {</div><div class='del'>-                                local-&gt;cont.link.read_child_buf = *buf;</div><div class='del'>-                                local-&gt;cont.link.preparent      = *preparent;</div><div class='del'>-                                local-&gt;cont.link.postparent     = *postparent;</div><div class='del'>-                        }</div><div class='add'>+    call_frame_t *main_frame = NULL;</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='ctx'> </div><div class='del'>-			local-&gt;cont.link.inode    = inode;</div><div class='add'>+    local = frame-&gt;local;</div><div class='ctx'> </div><div class='del'>-			local-&gt;success_count++;</div><div class='del'>-		}</div><div class='add'>+    main_frame = afr_transaction_detach_fop_frame(frame);</div><div class='add'>+    if (!main_frame)</div><div class='add'>+        return 0;</div><div class='ctx'> </div><div class='del'>-		local-&gt;op_errno = op_errno;		</div><div class='del'>-	}</div><div class='del'>-	UNLOCK (&amp;frame-&gt;lock);</div><div class='del'>-</div><div class='del'>-	call_count = afr_frame_return (frame);</div><div class='del'>-</div><div class='del'>-	if (call_count == 0) {</div><div class='del'>-		local-&gt;transaction.unwind (frame, this);</div><div class='del'>-</div><div class='del'>-		local-&gt;transaction.resume (frame, this);</div><div class='del'>-	}</div><div class='del'>-	</div><div class='del'>-	return 0;</div><div class='add'>+    AFR_STACK_UNWIND(link, main_frame, local-&gt;op_ret, local-&gt;op_errno,</div><div class='add'>+                     local-&gt;inode, &amp;local-&gt;cont.dir_fop.buf,</div><div class='add'>+                     &amp;local-&gt;cont.dir_fop.preparent,</div><div class='add'>+                     &amp;local-&gt;cont.dir_fop.postparent, local-&gt;xdata_rsp);</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-afr_link_wind (call_frame_t *frame, xlator_t *this)</div><div class='add'>+afr_link_wind_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                  int32_t op_ret, int32_t op_errno, inode_t *inode,</div><div class='add'>+                  struct iatt *buf, struct iatt *preparent,</div><div class='add'>+                  struct iatt *postparent, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-	afr_local_t *local = NULL;</div><div class='del'>-	afr_private_t *priv = NULL;</div><div class='del'>-</div><div class='del'>-	int call_count = -1;</div><div class='del'>-	int i = 0;</div><div class='del'>-</div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-	priv  = this-&gt;private;</div><div class='del'>-</div><div class='del'>-	call_count = afr_up_children_count (priv-&gt;child_count, local-&gt;child_up);</div><div class='del'>-</div><div class='del'>-	if (call_count == 0) {</div><div class='del'>-		local-&gt;transaction.resume (frame, this);</div><div class='del'>-		return 0;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	local-&gt;call_count = call_count;</div><div class='del'>-</div><div class='del'>-	for (i = 0; i &lt; priv-&gt;child_count; i++) {				</div><div class='del'>-		if (local-&gt;child_up[i]) {</div><div class='del'>-			STACK_WIND_COOKIE (frame, afr_link_wind_cbk, (void *) (long) i,</div><div class='del'>-					   priv-&gt;children[i], </div><div class='del'>-					   priv-&gt;children[i]-&gt;fops-&gt;link,</div><div class='del'>-					   &amp;local-&gt;loc,</div><div class='del'>-					   &amp;local-&gt;newloc);</div><div class='del'>-			</div><div class='del'>-			if (!--call_count)</div><div class='del'>-				break;</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='del'>-	</div><div class='del'>-	return 0;</div><div class='add'>+    return __afr_dir_write_cbk(frame, cookie, this, op_ret, op_errno, buf,</div><div class='add'>+                               preparent, postparent, NULL, NULL, xdata);</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-afr_link_done (call_frame_t *frame, xlator_t *this)</div><div class='add'>+afr_link_wind(call_frame_t *frame, xlator_t *this, int subvol)</div><div class='ctx'> {</div><div class='del'>-	afr_local_t * local = frame-&gt;local;</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='ctx'> </div><div class='del'>-	local-&gt;transaction.unwind (frame, this);</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    priv = this-&gt;private;</div><div class='ctx'> </div><div class='del'>-	AFR_STACK_DESTROY (frame);</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='add'>+    STACK_WIND_COOKIE(frame, afr_link_wind_cbk, (void *)(long)subvol,</div><div class='add'>+                      priv-&gt;children[subvol],</div><div class='add'>+                      priv-&gt;children[subvol]-&gt;fops-&gt;link, &amp;local-&gt;loc,</div><div class='add'>+                      &amp;local-&gt;newloc, local-&gt;xdata_req);</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-afr_link (call_frame_t *frame, xlator_t *this,</div><div class='del'>-	  loc_t *oldloc, loc_t *newloc)</div><div class='add'>+afr_link(call_frame_t *frame, xlator_t *this, loc_t *oldloc, loc_t *newloc,</div><div class='add'>+         dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-	afr_private_t * priv  = NULL;</div><div class='del'>-	afr_local_t   * local = NULL;</div><div class='del'>-	call_frame_t  * transaction_frame = NULL;</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    call_frame_t *transaction_frame = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int op_errno = ENOMEM;</div><div class='ctx'> </div><div class='del'>-	int ret = -1;</div><div class='add'>+    transaction_frame = copy_frame(frame);</div><div class='add'>+    if (!transaction_frame)</div><div class='add'>+        goto out;</div><div class='ctx'> </div><div class='del'>-	int op_ret   = -1;</div><div class='del'>-	int op_errno = 0;</div><div class='add'>+    local = AFR_FRAME_INIT(transaction_frame, op_errno);</div><div class='add'>+    if (!local)</div><div class='add'>+        goto out;</div><div class='ctx'> </div><div class='del'>-	VALIDATE_OR_GOTO (frame, out);</div><div class='del'>-	VALIDATE_OR_GOTO (this, out);</div><div class='del'>-	VALIDATE_OR_GOTO (this-&gt;private, out);</div><div class='add'>+    loc_copy(&amp;local-&gt;loc, oldloc);</div><div class='add'>+    loc_copy(&amp;local-&gt;newloc, newloc);</div><div class='ctx'> </div><div class='del'>-	priv = this-&gt;private;</div><div class='add'>+    local-&gt;inode = inode_ref(oldloc-&gt;inode);</div><div class='add'>+    local-&gt;parent = inode_ref(newloc-&gt;parent);</div><div class='ctx'> </div><div class='del'>-	transaction_frame = copy_frame (frame);</div><div class='del'>-	if (!transaction_frame) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-			"Out of memory.");</div><div class='del'>-		goto out;</div><div class='del'>-	}</div><div class='add'>+    if (xdata)</div><div class='add'>+        local-&gt;xdata_req = dict_copy_with_ref(xdata, NULL);</div><div class='add'>+    else</div><div class='add'>+        local-&gt;xdata_req = dict_new();</div><div class='ctx'> </div><div class='del'>-	ALLOC_OR_GOTO (local, afr_local_t, out);</div><div class='add'>+    if (!local-&gt;xdata_req)</div><div class='add'>+        goto out;</div><div class='ctx'> </div><div class='del'>-	ret = AFR_LOCAL_INIT (local, priv);</div><div class='del'>-	if (ret &lt; 0) {</div><div class='del'>-		op_errno = -ret;</div><div class='del'>-		goto out;</div><div class='del'>-	}</div><div class='add'>+    local-&gt;op = GF_FOP_LINK;</div><div class='ctx'> </div><div class='del'>-	transaction_frame-&gt;local = local;</div><div class='add'>+    local-&gt;transaction.wind = afr_link_wind;</div><div class='add'>+    local-&gt;transaction.unwind = afr_link_unwind;</div><div class='ctx'> </div><div class='del'>-	loc_copy (&amp;local-&gt;loc,    oldloc);</div><div class='del'>-	loc_copy (&amp;local-&gt;newloc, newloc);</div><div class='del'>-</div><div class='del'>-        LOCK (&amp;priv-&gt;read_child_lock);</div><div class='del'>-        {</div><div class='del'>-                local-&gt;read_child_index = (++priv-&gt;read_child_rr) </div><div class='del'>-                        % (priv-&gt;child_count);</div><div class='del'>-        }</div><div class='del'>-        UNLOCK (&amp;priv-&gt;read_child_lock);</div><div class='add'>+    ret = afr_build_parent_loc(&amp;local-&gt;transaction.parent_loc, newloc,</div><div class='add'>+                               &amp;op_errno);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='ctx'> </div><div class='del'>-	local-&gt;cont.link.ino = oldloc-&gt;inode-&gt;ino;</div><div class='add'>+    local-&gt;transaction.main_frame = frame;</div><div class='add'>+    local-&gt;transaction.basename = AFR_BASENAME(newloc-&gt;path);</div><div class='add'>+    ret = afr_transaction(transaction_frame, this, AFR_ENTRY_TRANSACTION);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        op_errno = -ret;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        if (oldloc-&gt;parent)</div><div class='del'>-                local-&gt;cont.link.parent_ino = newloc-&gt;parent-&gt;ino;</div><div class='del'>-</div><div class='del'>-	local-&gt;transaction.fop    = afr_link_wind;</div><div class='del'>-	local-&gt;transaction.done   = afr_link_done;</div><div class='del'>-	local-&gt;transaction.unwind = afr_link_unwind;</div><div class='del'>-</div><div class='del'>-	afr_build_parent_loc (&amp;local-&gt;transaction.parent_loc, oldloc);</div><div class='del'>-</div><div class='del'>-	local-&gt;transaction.main_frame   = frame;</div><div class='del'>-	local-&gt;transaction.basename     = AFR_BASENAME (oldloc-&gt;path);</div><div class='del'>-	local-&gt;transaction.new_basename = AFR_BASENAME (newloc-&gt;path);</div><div class='del'>-</div><div class='del'>-	afr_transaction (transaction_frame, this, AFR_ENTRY_TRANSACTION);</div><div class='del'>-</div><div class='del'>-	op_ret = 0;</div><div class='add'>+    return 0;</div><div class='ctx'> out:</div><div class='del'>-	if (op_ret == -1) {</div><div class='del'>-		if (transaction_frame)</div><div class='del'>-			AFR_STACK_DESTROY (transaction_frame);</div><div class='del'>-		AFR_STACK_UNWIND (link, frame, op_ret, op_errno,</div><div class='del'>-                                  NULL, NULL, NULL, NULL);</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='add'>+    if (transaction_frame)</div><div class='add'>+        AFR_STACK_DESTROY(transaction_frame);</div><div class='add'>+</div><div class='add'>+    AFR_STACK_UNWIND(link, frame, -1, op_errno, NULL, NULL, NULL, NULL, NULL);</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> /* }}} */</div><div class='ctx'> </div><div class='ctx'> /* {{{ symlink */</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-afr_symlink_unwind (call_frame_t *frame, xlator_t *this)</div><div class='add'>+afr_symlink_unwind(call_frame_t *frame, xlator_t *this)</div><div class='ctx'> {</div><div class='del'>-	call_frame_t *main_frame = NULL;</div><div class='del'>-	afr_local_t  *local = NULL;</div><div class='del'>-        </div><div class='del'>-        struct iatt *unwind_buf = NULL;</div><div class='del'>-        </div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-</div><div class='del'>-	LOCK (&amp;frame-&gt;lock);</div><div class='del'>-	{</div><div class='del'>-		if (local-&gt;transaction.main_frame) {</div><div class='del'>-			main_frame = local-&gt;transaction.main_frame;</div><div class='del'>-		}</div><div class='del'>-		local-&gt;transaction.main_frame = NULL;</div><div class='del'>-	}</div><div class='del'>-	UNLOCK (&amp;frame-&gt;lock);</div><div class='del'>-</div><div class='del'>-	if (main_frame) {</div><div class='del'>-                if (local-&gt;cont.symlink.read_child_buf.ia_ino) {</div><div class='del'>-                        unwind_buf = &amp;local-&gt;cont.symlink.read_child_buf;</div><div class='del'>-                } else {</div><div class='del'>-                        unwind_buf = &amp;local-&gt;cont.symlink.buf;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                unwind_buf-&gt;ia_ino = local-&gt;cont.symlink.ino;</div><div class='del'>-                unwind_buf-&gt;ia_gen = local-&gt;cont.symlink.gen;</div><div class='del'>-</div><div class='del'>-                local-&gt;cont.symlink.preparent.ia_ino  = local-&gt;cont.symlink.parent_ino;</div><div class='del'>-                local-&gt;cont.symlink.postparent.ia_ino = local-&gt;cont.symlink.parent_ino;</div><div class='del'>-</div><div class='del'>-		AFR_STACK_UNWIND (symlink, main_frame,</div><div class='del'>-                                  local-&gt;op_ret, local-&gt;op_errno,</div><div class='del'>-				  local-&gt;cont.symlink.inode,</div><div class='del'>-				  unwind_buf, &amp;local-&gt;cont.symlink.preparent,</div><div class='del'>-                                  &amp;local-&gt;cont.symlink.postparent);</div><div class='del'>-        }</div><div class='add'>+    call_frame_t *main_frame = NULL;</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='ctx'> </div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='add'>+    local = frame-&gt;local;</div><div class='ctx'> </div><div class='add'>+    main_frame = afr_transaction_detach_fop_frame(frame);</div><div class='add'>+    if (!main_frame)</div><div class='add'>+        return 0;</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-afr_symlink_wind_cbk (call_frame_t *frame, void *cookie, xlator_t *this, </div><div class='del'>-		      int32_t op_ret, int32_t op_errno, inode_t *inode,</div><div class='del'>-                      struct iatt *buf, struct iatt *preparent,</div><div class='del'>-                      struct iatt *postparent)</div><div class='del'>-{</div><div class='del'>-	afr_local_t *   local = NULL;</div><div class='del'>-	afr_private_t * priv  = NULL;</div><div class='del'>-</div><div class='del'>-	int call_count = -1;</div><div class='del'>-	int child_index = -1;</div><div class='del'>-</div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-	priv = this-&gt;private;</div><div class='del'>-</div><div class='del'>-	child_index = (long) cookie;</div><div class='del'>-</div><div class='del'>-	LOCK (&amp;frame-&gt;lock);</div><div class='del'>-	{</div><div class='del'>-		if (afr_fop_failed (op_ret, op_errno))</div><div class='del'>-			afr_transaction_fop_failed (frame, this, child_index);</div><div class='del'>-		</div><div class='del'>-		if (op_ret != -1) {</div><div class='del'>-			local-&gt;op_ret   = op_ret;</div><div class='del'>-</div><div class='del'>-			if (local-&gt;success_count == 0) {</div><div class='del'>-				local-&gt;cont.symlink.buf        = *buf;</div><div class='del'>-				local-&gt;cont.symlink.ino = </div><div class='del'>-					afr_itransform (buf-&gt;ia_ino, priv-&gt;child_count,</div><div class='del'>-							child_index);</div><div class='del'>-                                local-&gt;cont.symlink.gen = buf-&gt;ia_gen;</div><div class='del'>-</div><div class='del'>-                                if (priv-&gt;read_child &gt;= 0) {</div><div class='del'>-                                        afr_set_read_child (this, inode,</div><div class='del'>-                                                            priv-&gt;read_child);</div><div class='del'>-                                } else {</div><div class='del'>-                                        afr_set_read_child (this, inode,</div><div class='del'>-                                                            local-&gt;read_child_index);</div><div class='del'>-                                }</div><div class='del'>-			}</div><div class='del'>-</div><div class='del'>-                        if (child_index == local-&gt;first_up_child) {</div><div class='del'>-                                local-&gt;cont.symlink.ino =</div><div class='del'>-                                        afr_itransform (buf-&gt;ia_ino,</div><div class='del'>-                                                        priv-&gt;child_count,</div><div class='del'>-                                                        local-&gt;first_up_child);</div><div class='del'>-                                local-&gt;cont.symlink.gen = buf-&gt;ia_gen;</div><div class='del'>-                        }</div><div class='del'>-</div><div class='del'>-                        if (child_index == local-&gt;read_child_index) {</div><div class='del'>-                                local-&gt;cont.symlink.read_child_buf = *buf;</div><div class='del'>-                                local-&gt;cont.symlink.preparent      = *preparent;</div><div class='del'>-                                local-&gt;cont.symlink.postparent     = *postparent;</div><div class='del'>-                        }</div><div class='del'>-</div><div class='del'>-			local-&gt;cont.symlink.inode    = inode;</div><div class='del'>-</div><div class='del'>-			local-&gt;success_count++;</div><div class='del'>-		}</div><div class='del'>-</div><div class='del'>-		local-&gt;op_errno = op_errno;</div><div class='del'>-	}</div><div class='del'>-	UNLOCK (&amp;frame-&gt;lock);</div><div class='del'>-</div><div class='del'>-	call_count = afr_frame_return (frame);</div><div class='del'>-</div><div class='del'>-	if (call_count == 0) {</div><div class='del'>-		local-&gt;transaction.unwind (frame, this);</div><div class='del'>-</div><div class='del'>-		local-&gt;transaction.resume (frame, this);</div><div class='del'>-	}</div><div class='del'>-	</div><div class='del'>-	return 0;</div><div class='add'>+    AFR_STACK_UNWIND(symlink, main_frame, local-&gt;op_ret, local-&gt;op_errno,</div><div class='add'>+                     local-&gt;inode, &amp;local-&gt;cont.dir_fop.buf,</div><div class='add'>+                     &amp;local-&gt;cont.dir_fop.preparent,</div><div class='add'>+                     &amp;local-&gt;cont.dir_fop.postparent, local-&gt;xdata_rsp);</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-afr_symlink_wind (call_frame_t *frame, xlator_t *this)</div><div class='add'>+afr_symlink_wind_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                     int32_t op_ret, int32_t op_errno, inode_t *inode,</div><div class='add'>+                     struct iatt *buf, struct iatt *preparent,</div><div class='add'>+                     struct iatt *postparent, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-	afr_local_t *local = NULL;</div><div class='del'>-	afr_private_t *priv = NULL;</div><div class='del'>-</div><div class='del'>-	int call_count = -1;</div><div class='del'>-	int i = 0;</div><div class='del'>-</div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-	priv = this-&gt;private;</div><div class='del'>-</div><div class='del'>-	call_count = afr_up_children_count (priv-&gt;child_count, local-&gt;child_up);</div><div class='del'>-</div><div class='del'>-	if (call_count == 0) {</div><div class='del'>-		local-&gt;transaction.resume (frame, this);</div><div class='del'>-		return 0;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	local-&gt;call_count = call_count;</div><div class='del'>-</div><div class='del'>-	for (i = 0; i &lt; priv-&gt;child_count; i++) {				</div><div class='del'>-		if (local-&gt;child_up[i]) {</div><div class='del'>-			STACK_WIND_COOKIE (frame, afr_symlink_wind_cbk,</div><div class='del'>-					   (void *) (long) i,	</div><div class='del'>-					   priv-&gt;children[i], </div><div class='del'>-					   priv-&gt;children[i]-&gt;fops-&gt;symlink,</div><div class='del'>-					   local-&gt;cont.symlink.linkpath,</div><div class='del'>-					   &amp;local-&gt;loc,</div><div class='del'>-                                           local-&gt;cont.symlink.params);</div><div class='del'>-</div><div class='del'>-			if (!--call_count)</div><div class='del'>-				break;</div><div class='del'>-</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='del'>-	</div><div class='del'>-	return 0;</div><div class='add'>+    return __afr_dir_write_cbk(frame, cookie, this, op_ret, op_errno, buf,</div><div class='add'>+                               preparent, postparent, NULL, NULL, xdata);</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-afr_symlink_done (call_frame_t *frame, xlator_t *this)</div><div class='add'>+afr_symlink_wind(call_frame_t *frame, xlator_t *this, int subvol)</div><div class='ctx'> {</div><div class='del'>-	afr_local_t * local = frame-&gt;local;</div><div class='del'>-</div><div class='del'>-	local-&gt;transaction.unwind (frame, this);</div><div class='del'>-</div><div class='del'>-	AFR_STACK_DESTROY (frame);</div><div class='del'>-	</div><div class='del'>-	return 0;</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    STACK_WIND_COOKIE(frame, afr_symlink_wind_cbk, (void *)(long)subvol,</div><div class='add'>+                      priv-&gt;children[subvol],</div><div class='add'>+                      priv-&gt;children[subvol]-&gt;fops-&gt;symlink,</div><div class='add'>+                      local-&gt;cont.symlink.linkpath, &amp;local-&gt;loc, local-&gt;umask,</div><div class='add'>+                      local-&gt;xdata_req);</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-afr_symlink (call_frame_t *frame, xlator_t *this,</div><div class='del'>-	     const char *linkpath, loc_t *loc, dict_t *params)</div><div class='add'>+afr_symlink(call_frame_t *frame, xlator_t *this, const char *linkpath,</div><div class='add'>+            loc_t *loc, mode_t umask, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-	afr_private_t * priv  = NULL;</div><div class='del'>-	afr_local_t   * local = NULL;</div><div class='del'>-	call_frame_t  * transaction_frame = NULL;</div><div class='del'>-</div><div class='del'>-	int ret = -1;</div><div class='del'>-</div><div class='del'>-	int op_ret   = -1;</div><div class='del'>-	int op_errno = 0;</div><div class='del'>-</div><div class='del'>-	VALIDATE_OR_GOTO (frame, out);</div><div class='del'>-	VALIDATE_OR_GOTO (this, out);</div><div class='del'>-	VALIDATE_OR_GOTO (this-&gt;private, out);</div><div class='del'>-</div><div class='del'>-	priv = this-&gt;private;</div><div class='del'>-</div><div class='del'>-	transaction_frame = copy_frame (frame);</div><div class='del'>-	if (!transaction_frame) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-			"Out of memory.");</div><div class='del'>-		goto out;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	ALLOC_OR_GOTO (local, afr_local_t, out);</div><div class='del'>-</div><div class='del'>-	ret = AFR_LOCAL_INIT (local, priv);</div><div class='del'>-	if (ret &lt; 0) {</div><div class='del'>-		op_errno = -ret;</div><div class='del'>-		goto out;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	transaction_frame-&gt;local = local;</div><div class='del'>-	</div><div class='del'>-	loc_copy (&amp;local-&gt;loc, loc);</div><div class='del'>-</div><div class='del'>-        LOCK (&amp;priv-&gt;read_child_lock);</div><div class='del'>-        {</div><div class='del'>-                local-&gt;read_child_index = (++priv-&gt;read_child_rr) </div><div class='del'>-                        % (priv-&gt;child_count);</div><div class='del'>-        }</div><div class='del'>-        UNLOCK (&amp;priv-&gt;read_child_lock);</div><div class='del'>-</div><div class='del'>-	local-&gt;cont.symlink.linkpath = gf_strdup (linkpath);</div><div class='del'>-        if (params)</div><div class='del'>-                local-&gt;cont.symlink.params = dict_ref (params);</div><div class='del'>-</div><div class='del'>-        if (loc-&gt;parent)</div><div class='del'>-                local-&gt;cont.symlink.parent_ino = loc-&gt;parent-&gt;ino;</div><div class='del'>-</div><div class='del'>-	local-&gt;transaction.fop    = afr_symlink_wind;</div><div class='del'>-	local-&gt;transaction.done   = afr_symlink_done;</div><div class='del'>-	local-&gt;transaction.unwind = afr_symlink_unwind;</div><div class='del'>-</div><div class='del'>-	afr_build_parent_loc (&amp;local-&gt;transaction.parent_loc, loc);</div><div class='del'>-</div><div class='del'>-	local-&gt;transaction.main_frame   = frame;</div><div class='del'>-	local-&gt;transaction.basename     = AFR_BASENAME (loc-&gt;path);</div><div class='del'>-</div><div class='del'>-	afr_transaction (transaction_frame, this, AFR_ENTRY_TRANSACTION);</div><div class='del'>-</div><div class='del'>-	op_ret = 0;</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    call_frame_t *transaction_frame = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int op_errno = ENOMEM;</div><div class='add'>+</div><div class='add'>+    transaction_frame = copy_frame(frame);</div><div class='add'>+    if (!transaction_frame)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    local = AFR_FRAME_INIT(transaction_frame, op_errno);</div><div class='add'>+    if (!local)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    loc_copy(&amp;local-&gt;loc, loc);</div><div class='add'>+    local-&gt;inode = inode_ref(loc-&gt;inode);</div><div class='add'>+    local-&gt;parent = inode_ref(loc-&gt;parent);</div><div class='add'>+</div><div class='add'>+    local-&gt;cont.symlink.linkpath = gf_strdup(linkpath);</div><div class='add'>+    local-&gt;umask = umask;</div><div class='add'>+</div><div class='add'>+    if (xdata)</div><div class='add'>+        local-&gt;xdata_req = dict_copy_with_ref(xdata, NULL);</div><div class='add'>+    else</div><div class='add'>+        local-&gt;xdata_req = dict_new();</div><div class='add'>+</div><div class='add'>+    if (!local-&gt;xdata_req)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    local-&gt;op = GF_FOP_SYMLINK;</div><div class='add'>+    local-&gt;transaction.wind = afr_symlink_wind;</div><div class='add'>+    local-&gt;transaction.unwind = afr_symlink_unwind;</div><div class='add'>+</div><div class='add'>+    ret = afr_build_parent_loc(&amp;local-&gt;transaction.parent_loc, loc, &amp;op_errno);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    local-&gt;transaction.main_frame = frame;</div><div class='add'>+    local-&gt;transaction.basename = AFR_BASENAME(loc-&gt;path);</div><div class='add'>+    ret = afr_transaction(transaction_frame, this, AFR_ENTRY_TRANSACTION);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        op_errno = -ret;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='ctx'> out:</div><div class='del'>-	if (op_ret == -1) {</div><div class='del'>-		if (transaction_frame)</div><div class='del'>-			AFR_STACK_DESTROY (transaction_frame);</div><div class='del'>-		AFR_STACK_UNWIND (symlink, frame, op_ret, op_errno,</div><div class='del'>-                                  NULL, NULL, NULL, NULL);</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='add'>+    if (transaction_frame)</div><div class='add'>+        AFR_STACK_DESTROY(transaction_frame);</div><div class='add'>+</div><div class='add'>+    AFR_STACK_UNWIND(symlink, frame, -1, op_errno, NULL, NULL, NULL, NULL,</div><div class='add'>+                     NULL);</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> /* }}} */</div><div class='hunk'>@@ -1359,230 +939,118 @@ out:</div><div class='ctx'> /* {{{ rename */</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-afr_rename_unwind (call_frame_t *frame, xlator_t *this)</div><div class='add'>+afr_rename_unwind(call_frame_t *frame, xlator_t *this)</div><div class='ctx'> {</div><div class='del'>-	call_frame_t *main_frame = NULL;</div><div class='del'>-	afr_local_t  *local = NULL;</div><div class='del'>-</div><div class='del'>-        struct iatt *unwind_buf = NULL;</div><div class='del'>-</div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-</div><div class='del'>-	LOCK (&amp;frame-&gt;lock);</div><div class='del'>-	{</div><div class='del'>-		if (local-&gt;transaction.main_frame) {</div><div class='del'>-			main_frame = local-&gt;transaction.main_frame;</div><div class='del'>-		}</div><div class='del'>-		local-&gt;transaction.main_frame = NULL;</div><div class='del'>-	}</div><div class='del'>-	UNLOCK (&amp;frame-&gt;lock);</div><div class='del'>-</div><div class='del'>-	if (main_frame) {</div><div class='del'>-                if (local-&gt;cont.rename.read_child_buf.ia_ino) {</div><div class='del'>-                        unwind_buf = &amp;local-&gt;cont.rename.read_child_buf;</div><div class='del'>-                } else {</div><div class='del'>-                        unwind_buf = &amp;local-&gt;cont.rename.buf;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-		unwind_buf-&gt;ia_ino = local-&gt;cont.rename.ino;</div><div class='del'>-</div><div class='del'>-                local-&gt;cont.rename.preoldparent.ia_ino  = local-&gt;cont.rename.oldparent_ino;</div><div class='del'>-                local-&gt;cont.rename.postoldparent.ia_ino = local-&gt;cont.rename.oldparent_ino;</div><div class='del'>-                local-&gt;cont.rename.prenewparent.ia_ino  = local-&gt;cont.rename.newparent_ino;</div><div class='del'>-                local-&gt;cont.rename.postnewparent.ia_ino = local-&gt;cont.rename.newparent_ino;</div><div class='del'>-</div><div class='del'>-		AFR_STACK_UNWIND (rename, main_frame,</div><div class='del'>-                                  local-&gt;op_ret, local-&gt;op_errno, </div><div class='del'>-				  unwind_buf,</div><div class='del'>-                                  &amp;local-&gt;cont.rename.preoldparent,</div><div class='del'>-                                  &amp;local-&gt;cont.rename.postoldparent,</div><div class='del'>-                                  &amp;local-&gt;cont.rename.prenewparent,</div><div class='del'>-                                  &amp;local-&gt;cont.rename.postnewparent);</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='add'>+    call_frame_t *main_frame = NULL;</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='ctx'> </div><div class='add'>+    local = frame-&gt;local;</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-afr_rename_wind_cbk (call_frame_t *frame, void *cookie, xlator_t *this, </div><div class='del'>-		     int32_t op_ret, int32_t op_errno, struct iatt *buf,</div><div class='del'>-                     struct iatt *preoldparent, struct iatt *postoldparent,</div><div class='del'>-                     struct iatt *prenewparent, struct iatt *postnewparent)</div><div class='del'>-{</div><div class='del'>-	afr_local_t *   local = NULL;</div><div class='del'>-</div><div class='del'>-	int call_count = -1;</div><div class='del'>-	int child_index = -1;</div><div class='del'>-</div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-</div><div class='del'>-	child_index = (long) cookie;</div><div class='del'>-</div><div class='del'>-	LOCK (&amp;frame-&gt;lock);</div><div class='del'>-	{</div><div class='del'>-		if (afr_fop_failed (op_ret, op_errno) &amp;&amp; op_errno != ENOTEMPTY)</div><div class='del'>-			afr_transaction_fop_failed (frame, this, child_index);</div><div class='del'>-</div><div class='del'>-		if (op_ret != -1) {</div><div class='del'>-                        if (local-&gt;success_count == 0) {</div><div class='del'>-                                local-&gt;op_ret = op_ret;</div><div class='del'>-		</div><div class='del'>-                                if (buf) {</div><div class='del'>-                                        local-&gt;cont.rename.buf = *buf;</div><div class='del'>-                                }</div><div class='del'>-</div><div class='del'>-                                local-&gt;success_count++;</div><div class='del'>-                        }</div><div class='del'>-</div><div class='del'>-                        if (child_index == local-&gt;read_child_index) {</div><div class='del'>-                                local-&gt;cont.rename.read_child_buf = *buf;</div><div class='del'>-</div><div class='del'>-                                local-&gt;cont.rename.preoldparent  = *preoldparent;</div><div class='del'>-                                local-&gt;cont.rename.postoldparent = *postoldparent;</div><div class='del'>-                                local-&gt;cont.rename.prenewparent  = *prenewparent;</div><div class='del'>-                                local-&gt;cont.rename.postnewparent = *postnewparent;</div><div class='del'>-                        }</div><div class='del'>-                }</div><div class='add'>+    main_frame = afr_transaction_detach_fop_frame(frame);</div><div class='add'>+    if (!main_frame)</div><div class='add'>+        return 0;</div><div class='ctx'> </div><div class='del'>-		local-&gt;op_errno = op_errno;</div><div class='del'>-	}</div><div class='del'>-	UNLOCK (&amp;frame-&gt;lock);</div><div class='del'>-</div><div class='del'>-	call_count = afr_frame_return (frame);</div><div class='del'>-</div><div class='del'>-	if (call_count == 0) {</div><div class='del'>-		local-&gt;transaction.unwind (frame, this);</div><div class='del'>-		local-&gt;transaction.resume (frame, this);</div><div class='del'>-	}</div><div class='del'>-	</div><div class='del'>-	return 0;</div><div class='add'>+    AFR_STACK_UNWIND(rename, main_frame, local-&gt;op_ret, local-&gt;op_errno,</div><div class='add'>+                     &amp;local-&gt;cont.dir_fop.buf, &amp;local-&gt;cont.dir_fop.preparent,</div><div class='add'>+                     &amp;local-&gt;cont.dir_fop.postparent,</div><div class='add'>+                     &amp;local-&gt;cont.dir_fop.prenewparent,</div><div class='add'>+                     &amp;local-&gt;cont.dir_fop.postnewparent, local-&gt;xdata_rsp);</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-afr_rename_wind (call_frame_t *frame, xlator_t *this)</div><div class='add'>+int</div><div class='add'>+afr_rename_wind_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                    int32_t op_ret, int32_t op_errno, struct iatt *buf,</div><div class='add'>+                    struct iatt *preoldparent, struct iatt *postoldparent,</div><div class='add'>+                    struct iatt *prenewparent, struct iatt *postnewparent,</div><div class='add'>+                    dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-	afr_local_t *local = NULL;</div><div class='del'>-	afr_private_t *priv = NULL;</div><div class='del'>-</div><div class='del'>-	int call_count = -1;</div><div class='del'>-	int i = 0;</div><div class='del'>-</div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-	priv = this-&gt;private;</div><div class='del'>-</div><div class='del'>-	call_count = afr_up_children_count (priv-&gt;child_count, local-&gt;child_up);</div><div class='del'>-</div><div class='del'>-	if (call_count == 0) {</div><div class='del'>-		local-&gt;transaction.resume (frame, this);</div><div class='del'>-		return 0;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	local-&gt;call_count = call_count;</div><div class='del'>-</div><div class='del'>-	for (i = 0; i &lt; priv-&gt;child_count; i++) {				</div><div class='del'>-		if (local-&gt;child_up[i]) {</div><div class='del'>-			STACK_WIND_COOKIE (frame, afr_rename_wind_cbk, </div><div class='del'>-					   (void *) (long) i,	</div><div class='del'>-					   priv-&gt;children[i], </div><div class='del'>-					   priv-&gt;children[i]-&gt;fops-&gt;rename,</div><div class='del'>-					   &amp;local-&gt;loc,</div><div class='del'>-					   &amp;local-&gt;newloc);</div><div class='del'>-			if (!--call_count)</div><div class='del'>-				break;</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='del'>-	</div><div class='del'>-	return 0;</div><div class='add'>+    return __afr_dir_write_cbk(frame, cookie, this, op_ret, op_errno, buf,</div><div class='add'>+                               preoldparent, postoldparent, prenewparent,</div><div class='add'>+                               postnewparent, xdata);</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-afr_rename_done (call_frame_t *frame, xlator_t *this)</div><div class='add'>+afr_rename_wind(call_frame_t *frame, xlator_t *this, int subvol)</div><div class='ctx'> {</div><div class='del'>-	afr_local_t * local = frame-&gt;local;</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='ctx'> </div><div class='del'>-	local-&gt;transaction.unwind (frame, this);</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    priv = this-&gt;private;</div><div class='ctx'> </div><div class='del'>-	AFR_STACK_DESTROY (frame);</div><div class='del'>-	</div><div class='del'>-	return 0;</div><div class='add'>+    STACK_WIND_COOKIE(frame, afr_rename_wind_cbk, (void *)(long)subvol,</div><div class='add'>+                      priv-&gt;children[subvol],</div><div class='add'>+                      priv-&gt;children[subvol]-&gt;fops-&gt;rename, &amp;local-&gt;loc,</div><div class='add'>+                      &amp;local-&gt;newloc, local-&gt;xdata_req);</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-afr_rename (call_frame_t *frame, xlator_t *this,</div><div class='del'>-	    loc_t *oldloc, loc_t *newloc)</div><div class='add'>+afr_rename(call_frame_t *frame, xlator_t *this, loc_t *oldloc, loc_t *newloc,</div><div class='add'>+           dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-	afr_private_t * priv  = NULL;</div><div class='del'>-	afr_local_t   * local = NULL;</div><div class='del'>-	call_frame_t  * transaction_frame = NULL;</div><div class='del'>-</div><div class='del'>-	int ret = -1;</div><div class='del'>-</div><div class='del'>-	int op_ret   = -1;</div><div class='del'>-	int op_errno = 0;</div><div class='del'>-</div><div class='del'>-	VALIDATE_OR_GOTO (frame, out);</div><div class='del'>-	VALIDATE_OR_GOTO (this, out);</div><div class='del'>-	VALIDATE_OR_GOTO (this-&gt;private, out);</div><div class='del'>-</div><div class='del'>-	priv = this-&gt;private;</div><div class='del'>-</div><div class='del'>-	transaction_frame = copy_frame (frame);</div><div class='del'>-	if (!transaction_frame) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-			"Out of memory.");</div><div class='del'>-		goto out;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	ALLOC_OR_GOTO (local, afr_local_t, out);</div><div class='del'>-</div><div class='del'>-	ret = AFR_LOCAL_INIT (local, priv);</div><div class='del'>-	if (ret &lt; 0) {</div><div class='del'>-		op_errno = -ret;</div><div class='del'>-		goto out;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	transaction_frame-&gt;local = local;</div><div class='del'>-</div><div class='del'>-	loc_copy (&amp;local-&gt;loc,    oldloc);</div><div class='del'>-	loc_copy (&amp;local-&gt;newloc, newloc);</div><div class='del'>-</div><div class='del'>-        local-&gt;read_child_index = afr_read_child (this, oldloc-&gt;inode);</div><div class='del'>-</div><div class='del'>-	local-&gt;cont.rename.ino = oldloc-&gt;inode-&gt;ino;</div><div class='del'>-</div><div class='del'>-        if (oldloc-&gt;parent)</div><div class='del'>-                local-&gt;cont.rename.oldparent_ino = oldloc-&gt;parent-&gt;ino;</div><div class='del'>-        if (newloc-&gt;parent)</div><div class='del'>-                local-&gt;cont.rename.newparent_ino = newloc-&gt;parent-&gt;ino;</div><div class='del'>-</div><div class='del'>-	local-&gt;transaction.fop    = afr_rename_wind;</div><div class='del'>-	local-&gt;transaction.done   = afr_rename_done;</div><div class='del'>-	local-&gt;transaction.unwind = afr_rename_unwind;</div><div class='del'>-</div><div class='del'>-	afr_build_parent_loc (&amp;local-&gt;transaction.parent_loc, oldloc);</div><div class='del'>-	afr_build_parent_loc (&amp;local-&gt;transaction.new_parent_loc, newloc);</div><div class='del'>-</div><div class='del'>-	local-&gt;transaction.main_frame   = frame;</div><div class='del'>-	local-&gt;transaction.basename     = AFR_BASENAME (oldloc-&gt;path);</div><div class='del'>-	local-&gt;transaction.new_basename = AFR_BASENAME (newloc-&gt;path);</div><div class='del'>-</div><div class='del'>-	afr_transaction (transaction_frame, this, AFR_ENTRY_RENAME_TRANSACTION);</div><div class='del'>-</div><div class='del'>-	op_ret = 0;</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    call_frame_t *transaction_frame = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int op_errno = ENOMEM;</div><div class='add'>+</div><div class='add'>+    transaction_frame = copy_frame(frame);</div><div class='add'>+    if (!transaction_frame) {</div><div class='add'>+        op_errno = ENOMEM;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    local = AFR_FRAME_INIT(transaction_frame, op_errno);</div><div class='add'>+    if (!local)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    loc_copy(&amp;local-&gt;loc, oldloc);</div><div class='add'>+    loc_copy(&amp;local-&gt;newloc, newloc);</div><div class='add'>+</div><div class='add'>+    local-&gt;inode = inode_ref(oldloc-&gt;inode);</div><div class='add'>+    local-&gt;parent = inode_ref(oldloc-&gt;parent);</div><div class='add'>+    local-&gt;parent2 = inode_ref(newloc-&gt;parent);</div><div class='add'>+</div><div class='add'>+    if (xdata)</div><div class='add'>+        local-&gt;xdata_req = dict_copy_with_ref(xdata, NULL);</div><div class='add'>+    else</div><div class='add'>+        local-&gt;xdata_req = dict_new();</div><div class='add'>+</div><div class='add'>+    if (!local-&gt;xdata_req)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    local-&gt;op = GF_FOP_RENAME;</div><div class='add'>+    local-&gt;transaction.wind = afr_rename_wind;</div><div class='add'>+    local-&gt;transaction.unwind = afr_rename_unwind;</div><div class='add'>+</div><div class='add'>+    ret = afr_build_parent_loc(&amp;local-&gt;transaction.parent_loc, oldloc,</div><div class='add'>+                               &amp;op_errno);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+    ret = afr_build_parent_loc(&amp;local-&gt;transaction.new_parent_loc, newloc,</div><div class='add'>+                               &amp;op_errno);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    local-&gt;transaction.main_frame = frame;</div><div class='add'>+    local-&gt;transaction.basename = AFR_BASENAME(oldloc-&gt;path);</div><div class='add'>+    local-&gt;transaction.new_basename = AFR_BASENAME(newloc-&gt;path);</div><div class='add'>+    ret = afr_transaction(transaction_frame, this,</div><div class='add'>+                          AFR_ENTRY_RENAME_TRANSACTION);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        op_errno = -ret;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='ctx'> out:</div><div class='del'>-	if (op_ret == -1) {</div><div class='del'>-		if (transaction_frame)</div><div class='del'>-			AFR_STACK_DESTROY (transaction_frame);</div><div class='del'>-</div><div class='del'>-		AFR_STACK_UNWIND (rename, frame, op_ret, op_errno,</div><div class='del'>-                                  NULL, NULL, NULL, NULL, NULL);</div><div class='del'>-	}</div><div class='add'>+    if (transaction_frame)</div><div class='add'>+        AFR_STACK_DESTROY(transaction_frame);</div><div class='ctx'> </div><div class='del'>-	return 0;</div><div class='add'>+    AFR_STACK_UNWIND(rename, frame, -1, op_errno, NULL, NULL, NULL, NULL, NULL,</div><div class='add'>+                     NULL);</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> /* }}} */</div><div class='hunk'>@@ -1590,411 +1058,205 @@ out:</div><div class='ctx'> /* {{{ unlink */</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-afr_unlink_unwind (call_frame_t *frame, xlator_t *this)</div><div class='del'>-{</div><div class='del'>-	call_frame_t *main_frame = NULL;</div><div class='del'>-	afr_local_t  *local = NULL;</div><div class='del'>-</div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-</div><div class='del'>-	LOCK (&amp;frame-&gt;lock);</div><div class='del'>-	{</div><div class='del'>-		if (local-&gt;transaction.main_frame) {</div><div class='del'>-			main_frame = local-&gt;transaction.main_frame;</div><div class='del'>-		}</div><div class='del'>-		local-&gt;transaction.main_frame = NULL;</div><div class='del'>-	}</div><div class='del'>-	UNLOCK (&amp;frame-&gt;lock);</div><div class='del'>-</div><div class='del'>-	if (main_frame) {</div><div class='del'>-                local-&gt;cont.unlink.preparent.ia_ino  = local-&gt;cont.unlink.parent_ino;</div><div class='del'>-                local-&gt;cont.unlink.postparent.ia_ino = local-&gt;cont.unlink.parent_ino;</div><div class='del'>-</div><div class='del'>-		AFR_STACK_UNWIND (unlink, main_frame,</div><div class='del'>-                                  local-&gt;op_ret, local-&gt;op_errno,</div><div class='del'>-                                  &amp;local-&gt;cont.unlink.preparent,</div><div class='del'>-                                  &amp;local-&gt;cont.unlink.postparent);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-afr_unlink_wind_cbk (call_frame_t *frame, void *cookie, xlator_t *this, </div><div class='del'>-		     int32_t op_ret, int32_t op_errno, struct iatt *preparent,</div><div class='del'>-                     struct iatt *postparent)</div><div class='add'>+afr_unlink_unwind(call_frame_t *frame, xlator_t *this)</div><div class='ctx'> {</div><div class='del'>-	afr_local_t *   local = NULL;</div><div class='del'>-	afr_private_t * priv  = NULL;</div><div class='del'>-</div><div class='del'>-	int call_count  = -1;</div><div class='del'>-	int child_index = (long) cookie;</div><div class='del'>-</div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-	priv  = this-&gt;private;</div><div class='del'>-</div><div class='del'>-	LOCK (&amp;frame-&gt;lock);</div><div class='del'>-	{</div><div class='del'>-                if (child_index == local-&gt;read_child_index) {</div><div class='del'>-                        local-&gt;read_child_returned = _gf_true;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-		if (afr_fop_failed (op_ret, op_errno))</div><div class='del'>-			afr_transaction_fop_failed (frame, this, child_index);</div><div class='add'>+    call_frame_t *main_frame = NULL;</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='ctx'> </div><div class='del'>-		if (op_ret != -1) {</div><div class='del'>-			if (local-&gt;success_count == 0) {</div><div class='del'>-				local-&gt;op_ret   = op_ret;</div><div class='del'>-                                local-&gt;cont.unlink.preparent  = *preparent;</div><div class='del'>-                                local-&gt;cont.unlink.postparent = *postparent;</div><div class='del'>-			}</div><div class='add'>+    local = frame-&gt;local;</div><div class='ctx'> </div><div class='del'>-                        if (child_index == local-&gt;read_child_index) {</div><div class='del'>-                                local-&gt;cont.unlink.preparent  = *preparent;</div><div class='del'>-                                local-&gt;cont.unlink.postparent = *postparent;</div><div class='del'>-                        }</div><div class='add'>+    main_frame = afr_transaction_detach_fop_frame(frame);</div><div class='add'>+    if (!main_frame)</div><div class='add'>+        return 0;</div><div class='ctx'> </div><div class='del'>-			local-&gt;success_count++;</div><div class='del'>-		}</div><div class='del'>-</div><div class='del'>-		local-&gt;op_errno = op_errno;</div><div class='del'>-	}</div><div class='del'>-	UNLOCK (&amp;frame-&gt;lock);</div><div class='del'>-</div><div class='del'>-	call_count = afr_frame_return (frame);</div><div class='del'>-</div><div class='del'>-	if (call_count == 0) {</div><div class='del'>-		local-&gt;transaction.unwind (frame, this);</div><div class='del'>-</div><div class='del'>-		local-&gt;transaction.resume (frame, this);</div><div class='del'>-	}</div><div class='del'>-	</div><div class='del'>-	return 0;</div><div class='add'>+    AFR_STACK_UNWIND(unlink, main_frame, local-&gt;op_ret, local-&gt;op_errno,</div><div class='add'>+                     &amp;local-&gt;cont.dir_fop.preparent,</div><div class='add'>+                     &amp;local-&gt;cont.dir_fop.postparent, local-&gt;xdata_rsp);</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-afr_unlink_wind (call_frame_t *frame, xlator_t *this)</div><div class='add'>+int</div><div class='add'>+afr_unlink_wind_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                    int32_t op_ret, int32_t op_errno, struct iatt *preparent,</div><div class='add'>+                    struct iatt *postparent, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-	afr_local_t *local = NULL;</div><div class='del'>-	afr_private_t *priv = NULL;</div><div class='del'>-</div><div class='del'>-	int call_count = -1;</div><div class='del'>-	int i = 0;</div><div class='del'>-</div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-	priv  = this-&gt;private;</div><div class='del'>-</div><div class='del'>-	call_count = afr_up_children_count (priv-&gt;child_count, local-&gt;child_up);</div><div class='del'>-</div><div class='del'>-	if (call_count == 0) {</div><div class='del'>-		local-&gt;transaction.resume (frame, this);</div><div class='del'>-		return 0;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	local-&gt;call_count = call_count;</div><div class='del'>-</div><div class='del'>-	for (i = 0; i &lt; priv-&gt;child_count; i++) {				</div><div class='del'>-		if (local-&gt;child_up[i]) {</div><div class='del'>-			STACK_WIND_COOKIE (frame, afr_unlink_wind_cbk,	</div><div class='del'>-					   (void *) (long) i,</div><div class='del'>-					   priv-&gt;children[i], </div><div class='del'>-					   priv-&gt;children[i]-&gt;fops-&gt;unlink,</div><div class='del'>-					   &amp;local-&gt;loc);</div><div class='del'>-			</div><div class='del'>-			if (!--call_count)</div><div class='del'>-				break;</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='del'>-	</div><div class='del'>-	return 0;</div><div class='add'>+    return __afr_dir_write_cbk(frame, cookie, this, op_ret, op_errno, NULL,</div><div class='add'>+                               preparent, postparent, NULL, NULL, xdata);</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-afr_unlink_done (call_frame_t *frame, xlator_t *this)</div><div class='add'>+int</div><div class='add'>+afr_unlink_wind(call_frame_t *frame, xlator_t *this, int subvol)</div><div class='ctx'> {</div><div class='del'>-	afr_local_t * local = frame-&gt;local;</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='ctx'> </div><div class='del'>-	local-&gt;transaction.unwind (frame, this);</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    priv = this-&gt;private;</div><div class='ctx'> </div><div class='del'>-	AFR_STACK_DESTROY (frame);</div><div class='del'>-	</div><div class='del'>-	return 0;</div><div class='add'>+    STACK_WIND_COOKIE(frame, afr_unlink_wind_cbk, (void *)(long)subvol,</div><div class='add'>+                      priv-&gt;children[subvol],</div><div class='add'>+                      priv-&gt;children[subvol]-&gt;fops-&gt;unlink, &amp;local-&gt;loc,</div><div class='add'>+                      local-&gt;xflag, local-&gt;xdata_req);</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-afr_unlink (call_frame_t *frame, xlator_t *this,</div><div class='del'>-	    loc_t *loc)</div><div class='add'>+int</div><div class='add'>+afr_unlink(call_frame_t *frame, xlator_t *this, loc_t *loc, int xflag,</div><div class='add'>+           dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-	afr_private_t * priv  = NULL;</div><div class='del'>-	afr_local_t   * local = NULL;</div><div class='del'>-	call_frame_t  * transaction_frame = NULL;</div><div class='del'>-</div><div class='del'>-	int ret = -1;</div><div class='del'>-</div><div class='del'>-	int op_ret   = -1;</div><div class='del'>-	int op_errno = 0;</div><div class='del'>-</div><div class='del'>-	VALIDATE_OR_GOTO (frame, out);</div><div class='del'>-	VALIDATE_OR_GOTO (this, out);</div><div class='del'>-	VALIDATE_OR_GOTO (this-&gt;private, out);</div><div class='del'>-</div><div class='del'>-	priv = this-&gt;private;</div><div class='del'>-</div><div class='del'>-	transaction_frame = copy_frame (frame);</div><div class='del'>-	if (!transaction_frame) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-			"Out of memory.");</div><div class='del'>-		goto out;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	ALLOC_OR_GOTO (local, afr_local_t, out);</div><div class='del'>-</div><div class='del'>-	ret = AFR_LOCAL_INIT (local, priv);</div><div class='del'>-	if (ret &lt; 0) {</div><div class='del'>-		op_errno = -ret;</div><div class='del'>-		goto out;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	transaction_frame-&gt;local = local;</div><div class='del'>-</div><div class='del'>-	loc_copy (&amp;local-&gt;loc, loc);</div><div class='del'>-</div><div class='del'>-        if (loc-&gt;parent)</div><div class='del'>-                local-&gt;cont.unlink.parent_ino = loc-&gt;parent-&gt;ino;</div><div class='del'>-</div><div class='del'>-	local-&gt;transaction.fop    = afr_unlink_wind;</div><div class='del'>-	local-&gt;transaction.done   = afr_unlink_done;</div><div class='del'>-	local-&gt;transaction.unwind = afr_unlink_unwind;</div><div class='del'>-</div><div class='del'>-	afr_build_parent_loc (&amp;local-&gt;transaction.parent_loc, loc);</div><div class='del'>-</div><div class='del'>-	local-&gt;transaction.main_frame = frame;</div><div class='del'>-	local-&gt;transaction.basename = AFR_BASENAME (loc-&gt;path);</div><div class='del'>-</div><div class='del'>-	afr_transaction (transaction_frame, this, AFR_ENTRY_TRANSACTION);</div><div class='del'>-</div><div class='del'>-	op_ret = 0;</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    call_frame_t *transaction_frame = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int op_errno = ENOMEM;</div><div class='add'>+</div><div class='add'>+    transaction_frame = copy_frame(frame);</div><div class='add'>+    if (!transaction_frame)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    local = AFR_FRAME_INIT(transaction_frame, op_errno);</div><div class='add'>+    if (!local)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    loc_copy(&amp;local-&gt;loc, loc);</div><div class='add'>+    local-&gt;xflag = xflag;</div><div class='add'>+</div><div class='add'>+    local-&gt;inode = inode_ref(loc-&gt;inode);</div><div class='add'>+    local-&gt;parent = inode_ref(loc-&gt;parent);</div><div class='add'>+</div><div class='add'>+    if (xdata)</div><div class='add'>+        local-&gt;xdata_req = dict_copy_with_ref(xdata, NULL);</div><div class='add'>+    else</div><div class='add'>+        local-&gt;xdata_req = dict_new();</div><div class='add'>+</div><div class='add'>+    if (!local-&gt;xdata_req)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    local-&gt;op = GF_FOP_UNLINK;</div><div class='add'>+    local-&gt;transaction.wind = afr_unlink_wind;</div><div class='add'>+    local-&gt;transaction.unwind = afr_unlink_unwind;</div><div class='add'>+</div><div class='add'>+    ret = afr_build_parent_loc(&amp;local-&gt;transaction.parent_loc, loc, &amp;op_errno);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    local-&gt;transaction.main_frame = frame;</div><div class='add'>+    local-&gt;transaction.basename = AFR_BASENAME(loc-&gt;path);</div><div class='add'>+    ret = afr_transaction(transaction_frame, this, AFR_ENTRY_TRANSACTION);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        op_errno = -ret;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='ctx'> out:</div><div class='del'>-	if (op_ret == -1) {</div><div class='del'>-		if (transaction_frame)</div><div class='del'>-			AFR_STACK_DESTROY (transaction_frame);</div><div class='del'>-		AFR_STACK_UNWIND (unlink, frame, op_ret, op_errno,</div><div class='del'>-                                  NULL, NULL);</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='add'>+    if (transaction_frame)</div><div class='add'>+        AFR_STACK_DESTROY(transaction_frame);</div><div class='add'>+</div><div class='add'>+    AFR_STACK_UNWIND(unlink, frame, -1, op_errno, NULL, NULL, NULL);</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> /* }}} */</div><div class='ctx'> </div><div class='ctx'> /* {{{ rmdir */</div><div class='ctx'> </div><div class='del'>-</div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-afr_rmdir_unwind (call_frame_t *frame, xlator_t *this)</div><div class='add'>+afr_rmdir_unwind(call_frame_t *frame, xlator_t *this)</div><div class='ctx'> {</div><div class='del'>-	call_frame_t *main_frame = NULL;</div><div class='del'>-	afr_local_t  *local = NULL;</div><div class='del'>-</div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-</div><div class='del'>-	LOCK (&amp;frame-&gt;lock);</div><div class='del'>-	{</div><div class='del'>-		if (local-&gt;transaction.main_frame) {</div><div class='del'>-			main_frame = local-&gt;transaction.main_frame;</div><div class='del'>-		}</div><div class='del'>-		local-&gt;transaction.main_frame = NULL;</div><div class='del'>-	}</div><div class='del'>-	UNLOCK (&amp;frame-&gt;lock);</div><div class='del'>-</div><div class='del'>-	if (main_frame) {</div><div class='del'>-                local-&gt;cont.rmdir.preparent.ia_ino  = local-&gt;cont.rmdir.parent_ino;</div><div class='del'>-                local-&gt;cont.rmdir.postparent.ia_ino = local-&gt;cont.rmdir.parent_ino;</div><div class='del'>-</div><div class='del'>-		AFR_STACK_UNWIND (rmdir, main_frame,</div><div class='del'>-                                  local-&gt;op_ret, local-&gt;op_errno,</div><div class='del'>-                                  &amp;local-&gt;cont.rmdir.preparent,</div><div class='del'>-                                  &amp;local-&gt;cont.rmdir.postparent);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-afr_rmdir_wind_cbk (call_frame_t *frame, void *cookie, xlator_t *this, </div><div class='del'>-		    int32_t op_ret, int32_t op_errno, struct iatt *preparent,</div><div class='del'>-                    struct iatt *postparent)</div><div class='del'>-{</div><div class='del'>-	afr_local_t *   local = NULL;</div><div class='del'>-	afr_private_t * priv  = NULL;</div><div class='del'>-</div><div class='del'>-	int call_count  = -1;</div><div class='del'>-	int child_index = (long) cookie;</div><div class='del'>-        int read_child  = 0;</div><div class='add'>+    call_frame_t *main_frame = NULL;</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='ctx'> </div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-	priv = this-&gt;private;</div><div class='add'>+    local = frame-&gt;local;</div><div class='ctx'> </div><div class='del'>-	LOCK (&amp;frame-&gt;lock);</div><div class='del'>-	{</div><div class='del'>-                if (child_index == read_child) {</div><div class='del'>-                        local-&gt;read_child_returned = _gf_true;</div><div class='del'>-                }</div><div class='add'>+    main_frame = afr_transaction_detach_fop_frame(frame);</div><div class='add'>+    if (!main_frame)</div><div class='add'>+        return 0;</div><div class='ctx'> </div><div class='del'>-		if (afr_fop_failed (op_ret, op_errno) &amp;&amp; (op_errno != ENOTEMPTY))</div><div class='del'>-			afr_transaction_fop_failed (frame, this, child_index);</div><div class='del'>-</div><div class='del'>-		if (op_ret != -1) {</div><div class='del'>-			if (local-&gt;success_count == 0) {</div><div class='del'>-				local-&gt;op_ret = op_ret;</div><div class='del'>-                                local-&gt;cont.rmdir.preparent  = *preparent;</div><div class='del'>-                                local-&gt;cont.rmdir.postparent = *postparent;</div><div class='del'>-</div><div class='del'>-			}</div><div class='del'>-</div><div class='del'>-                        if (child_index == read_child) {</div><div class='del'>-                                local-&gt;cont.rmdir.preparent  = *preparent;</div><div class='del'>-                                local-&gt;cont.rmdir.postparent = *postparent;</div><div class='del'>-                        }</div><div class='del'>-</div><div class='del'>-			local-&gt;success_count++;</div><div class='del'>-		}</div><div class='del'>-</div><div class='del'>-		local-&gt;op_errno = op_errno;</div><div class='del'>-	}</div><div class='del'>-	UNLOCK (&amp;frame-&gt;lock);</div><div class='del'>-</div><div class='del'>-	call_count = afr_frame_return (frame);</div><div class='del'>-</div><div class='del'>-	if (call_count == 0) {</div><div class='del'>-		local-&gt;transaction.unwind (frame, this);</div><div class='del'>-		local-&gt;transaction.resume (frame, this);</div><div class='del'>-	}</div><div class='del'>-	</div><div class='del'>-	return 0;</div><div class='add'>+    AFR_STACK_UNWIND(rmdir, main_frame, local-&gt;op_ret, local-&gt;op_errno,</div><div class='add'>+                     &amp;local-&gt;cont.dir_fop.preparent,</div><div class='add'>+                     &amp;local-&gt;cont.dir_fop.postparent, local-&gt;xdata_rsp);</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-afr_rmdir_wind (call_frame_t *frame, xlator_t *this)</div><div class='add'>+afr_rmdir_wind_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                   int32_t op_ret, int32_t op_errno, struct iatt *preparent,</div><div class='add'>+                   struct iatt *postparent, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-	afr_local_t *local = NULL;</div><div class='del'>-	afr_private_t *priv = NULL;</div><div class='del'>-</div><div class='del'>-	int call_count = -1;</div><div class='del'>-	int i = 0;</div><div class='del'>-</div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-	priv  = this-&gt;private;</div><div class='del'>-</div><div class='del'>-	call_count = afr_up_children_count (priv-&gt;child_count, local-&gt;child_up);</div><div class='del'>-</div><div class='del'>-	if (call_count == 0) {</div><div class='del'>-		local-&gt;transaction.resume (frame, this);</div><div class='del'>-		return 0;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	local-&gt;call_count = call_count;</div><div class='del'>-</div><div class='del'>-	for (i = 0; i &lt; priv-&gt;child_count; i++) {				</div><div class='del'>-		if (local-&gt;child_up[i]) {</div><div class='del'>-			STACK_WIND_COOKIE (frame, afr_rmdir_wind_cbk,	</div><div class='del'>-					   (void *) (long) i,</div><div class='del'>-					   priv-&gt;children[i], </div><div class='del'>-					   priv-&gt;children[i]-&gt;fops-&gt;rmdir,</div><div class='del'>-					   &amp;local-&gt;loc);</div><div class='del'>-</div><div class='del'>-			if (!--call_count)</div><div class='del'>-				break;</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='del'>-	</div><div class='del'>-	return 0;</div><div class='add'>+    return __afr_dir_write_cbk(frame, cookie, this, op_ret, op_errno, NULL,</div><div class='add'>+                               preparent, postparent, NULL, NULL, xdata);</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-afr_rmdir_done (call_frame_t *frame, xlator_t *this)</div><div class='add'>+afr_rmdir_wind(call_frame_t *frame, xlator_t *this, int subvol)</div><div class='ctx'> {</div><div class='del'>-	afr_local_t * local = frame-&gt;local;</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='ctx'> </div><div class='del'>-	local-&gt;transaction.unwind (frame, this);</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    priv = this-&gt;private;</div><div class='ctx'> </div><div class='del'>-	AFR_STACK_DESTROY (frame);</div><div class='del'>-	</div><div class='del'>-	return 0;</div><div class='add'>+    STACK_WIND_COOKIE(frame, afr_rmdir_wind_cbk, (void *)(long)subvol,</div><div class='add'>+                      priv-&gt;children[subvol],</div><div class='add'>+                      priv-&gt;children[subvol]-&gt;fops-&gt;rmdir, &amp;local-&gt;loc,</div><div class='add'>+                      local-&gt;cont.rmdir.flags, local-&gt;xdata_req);</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-afr_rmdir (call_frame_t *frame, xlator_t *this,</div><div class='del'>-	   loc_t *loc)</div><div class='add'>+afr_rmdir(call_frame_t *frame, xlator_t *this, loc_t *loc, int flags,</div><div class='add'>+          dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-	afr_private_t * priv  = NULL;</div><div class='del'>-	afr_local_t   * local = NULL;</div><div class='del'>-	call_frame_t  * transaction_frame = NULL;</div><div class='del'>-	</div><div class='del'>-	int ret = -1;</div><div class='del'>-</div><div class='del'>-	int op_ret   = -1;</div><div class='del'>-	int op_errno = 0;</div><div class='del'>-</div><div class='del'>-	VALIDATE_OR_GOTO (frame, out);</div><div class='del'>-	VALIDATE_OR_GOTO (this, out);</div><div class='del'>-	VALIDATE_OR_GOTO (this-&gt;private, out);</div><div class='del'>-</div><div class='del'>-	priv = this-&gt;private;</div><div class='del'>-</div><div class='del'>-	transaction_frame = copy_frame (frame);</div><div class='del'>-	if (!transaction_frame) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-			"Out of memory.");</div><div class='del'>-		goto out;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	ALLOC_OR_GOTO (local, afr_local_t, out);</div><div class='del'>-</div><div class='del'>-	ret = AFR_LOCAL_INIT (local, priv);</div><div class='del'>-	if (ret &lt; 0) {</div><div class='del'>-		op_errno = -ret;</div><div class='del'>-		goto out;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	transaction_frame-&gt;local = local;</div><div class='del'>-</div><div class='del'>-	loc_copy (&amp;local-&gt;loc, loc);</div><div class='del'>-</div><div class='del'>-        if (loc-&gt;parent)</div><div class='del'>-                local-&gt;cont.rmdir.parent_ino = loc-&gt;parent-&gt;ino;</div><div class='del'>-</div><div class='del'>-	local-&gt;transaction.fop    = afr_rmdir_wind;</div><div class='del'>-	local-&gt;transaction.done   = afr_rmdir_done;</div><div class='del'>-	local-&gt;transaction.unwind = afr_rmdir_unwind;</div><div class='del'>-</div><div class='del'>-	afr_build_parent_loc (&amp;local-&gt;transaction.parent_loc, loc);</div><div class='del'>-</div><div class='del'>-	local-&gt;transaction.main_frame = frame;</div><div class='del'>-	local-&gt;transaction.basename = AFR_BASENAME (loc-&gt;path);</div><div class='del'>-</div><div class='del'>-	afr_transaction (transaction_frame, this, AFR_ENTRY_TRANSACTION);</div><div class='del'>-</div><div class='del'>-	op_ret = 0;</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    call_frame_t *transaction_frame = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int op_errno = ENOMEM;</div><div class='add'>+</div><div class='add'>+    transaction_frame = copy_frame(frame);</div><div class='add'>+    if (!transaction_frame)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    local = AFR_FRAME_INIT(transaction_frame, op_errno);</div><div class='add'>+    if (!local)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    loc_copy(&amp;local-&gt;loc, loc);</div><div class='add'>+    local-&gt;inode = inode_ref(loc-&gt;inode);</div><div class='add'>+    local-&gt;parent = inode_ref(loc-&gt;parent);</div><div class='add'>+</div><div class='add'>+    local-&gt;cont.rmdir.flags = flags;</div><div class='add'>+</div><div class='add'>+    if (xdata)</div><div class='add'>+        local-&gt;xdata_req = dict_copy_with_ref(xdata, NULL);</div><div class='add'>+    else</div><div class='add'>+        local-&gt;xdata_req = dict_new();</div><div class='add'>+</div><div class='add'>+    if (!local-&gt;xdata_req)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    local-&gt;op = GF_FOP_RMDIR;</div><div class='add'>+    local-&gt;transaction.wind = afr_rmdir_wind;</div><div class='add'>+    local-&gt;transaction.unwind = afr_rmdir_unwind;</div><div class='add'>+</div><div class='add'>+    ret = afr_build_parent_loc(&amp;local-&gt;transaction.parent_loc, loc, &amp;op_errno);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    local-&gt;transaction.main_frame = frame;</div><div class='add'>+    local-&gt;transaction.basename = AFR_BASENAME(loc-&gt;path);</div><div class='add'>+    ret = afr_transaction(transaction_frame, this, AFR_ENTRY_TRANSACTION);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        op_errno = -ret;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='ctx'> out:</div><div class='del'>-	if (op_ret == -1) {</div><div class='del'>-		if (transaction_frame)</div><div class='del'>-			AFR_STACK_DESTROY (transaction_frame);</div><div class='del'>-		AFR_STACK_UNWIND (rmdir, frame, op_ret, op_errno,</div><div class='del'>-                                  NULL, NULL);</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='add'>+    if (transaction_frame)</div><div class='add'>+        AFR_STACK_DESTROY(transaction_frame);</div><div class='add'>+</div><div class='add'>+    AFR_STACK_UNWIND(rmdir, frame, -1, op_errno, NULL, NULL, NULL);</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> /* }}} */</div><div class='del'>-</div><div class='head'>diff --git a/xlators/cluster/afr/src/afr-dir-write.h b/xlators/cluster/afr/src/afr-dir-write.h<br/>index e2ed8c759d0..1d88c3b9b26 100644<br/>--- a/<a href='/cgit/glusterfs.git/tree/xlators/cluster/afr/src/afr-dir-write.h?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/cluster/afr/src/afr-dir-write.h</a><br/>+++ b/<a href='/cgit/glusterfs.git/tree/xlators/cluster/afr/src/afr-dir-write.h?id=d1d7a6f35c816822fab51c820e25023863c239c1'>xlators/cluster/afr/src/afr-dir-write.h</a></div><div class='hunk'>@@ -1,60 +1,46 @@</div><div class='ctx'> /*</div><div class='del'>-   Copyright (c) 2007-2009 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='del'>-   This file is part of GlusterFS.</div><div class='del'>-</div><div class='del'>-   GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-   it under the terms of the GNU General Public License as published</div><div class='del'>-   by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-   or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-   GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-   WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-   General Public License for more details.</div><div class='del'>-</div><div class='del'>-   You should have received a copy of the GNU General Public License</div><div class='del'>-   along with this program.  If not, see</div><div class='del'>-   &lt;http://www.gnu.org/licenses/&gt;.</div><div class='add'>+  Copyright (c) 2008-2012 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='ctx'> */</div><div class='ctx'> </div><div class='ctx'> #ifndef __DIR_WRITE_H__</div><div class='ctx'> #define __DIR_WRITE_H__</div><div class='ctx'> </div><div class='ctx'> int32_t</div><div class='del'>-afr_create (call_frame_t *frame, xlator_t *this,</div><div class='del'>-            loc_t *loc, int32_t flags, mode_t mode,</div><div class='del'>-            fd_t *fd, dict_t *params);</div><div class='add'>+afr_create(call_frame_t *frame, xlator_t *this, loc_t *loc, int32_t flags,</div><div class='add'>+           mode_t mode, mode_t umask, fd_t *fd, dict_t *xdata);</div><div class='ctx'> </div><div class='ctx'> int32_t</div><div class='del'>-afr_mknod (call_frame_t *frame, xlator_t *this,</div><div class='del'>-	   loc_t *loc, mode_t mode, dev_t dev, dict_t *params);</div><div class='add'>+afr_mknod(call_frame_t *frame, xlator_t *this, loc_t *loc, mode_t mode,</div><div class='add'>+          dev_t dev, mode_t umask, dict_t *xdata);</div><div class='ctx'> </div><div class='ctx'> int32_t</div><div class='del'>-afr_mkdir (call_frame_t *frame, xlator_t *this,</div><div class='del'>-	   loc_t *loc, mode_t mode, dict_t *params);</div><div class='add'>+afr_mkdir(call_frame_t *frame, xlator_t *this, loc_t *loc, mode_t mode,</div><div class='add'>+          mode_t umask, dict_t *xdata);</div><div class='ctx'> </div><div class='ctx'> int32_t</div><div class='del'>-afr_unlink (call_frame_t *frame, xlator_t *this,</div><div class='del'>-	    loc_t *loc);</div><div class='add'>+afr_unlink(call_frame_t *frame, xlator_t *this, loc_t *loc, int xflag,</div><div class='add'>+           dict_t *xdata);</div><div class='ctx'> </div><div class='ctx'> int32_t</div><div class='del'>-afr_rmdir (call_frame_t *frame, xlator_t *this,</div><div class='del'>-	   loc_t *loc);</div><div class='add'>+afr_rmdir(call_frame_t *frame, xlator_t *this, loc_t *loc, int flags,</div><div class='add'>+          dict_t *xdata);</div><div class='ctx'> </div><div class='ctx'> int32_t</div><div class='del'>-afr_link (call_frame_t *frame, xlator_t *this,</div><div class='del'>-	  loc_t *oldloc, loc_t *newloc);</div><div class='add'>+afr_link(call_frame_t *frame, xlator_t *this, loc_t *oldloc, loc_t *newloc,</div><div class='add'>+         dict_t *xdata);</div><div class='ctx'> </div><div class='ctx'> int32_t</div><div class='del'>-afr_rename (call_frame_t *frame, xlator_t *this,</div><div class='del'>-	    loc_t *oldloc, loc_t *newloc);</div><div class='add'>+afr_rename(call_frame_t *frame, xlator_t *this, loc_t *oldloc, loc_t *newloc,</div><div class='add'>+           dict_t *xdata);</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-afr_symlink (call_frame_t *frame, xlator_t *this,</div><div class='del'>-	     const char *linkpath, loc_t *oldloc, dict_t *params);</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-afr_setdents (call_frame_t *frame, xlator_t *this,</div><div class='del'>-	      fd_t *fd, int32_t flags, dir_entry_t *entries, int32_t count);</div><div class='add'>+afr_symlink(call_frame_t *frame, xlator_t *this, const char *linkpath,</div><div class='add'>+            loc_t *oldloc, mode_t umask, dict_t *params);</div><div class='ctx'> </div><div class='ctx'> #endif /* __DIR_WRITE_H__ */</div><div class='head'>diff --git a/xlators/cluster/afr/src/afr-inode-read.c b/xlators/cluster/afr/src/afr-inode-read.c<br/>index 74f3d9ddb0e..c5521704de2 100644<br/>--- a/<a href='/cgit/glusterfs.git/tree/xlators/cluster/afr/src/afr-inode-read.c?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/cluster/afr/src/afr-inode-read.c</a><br/>+++ b/<a href='/cgit/glusterfs.git/tree/xlators/cluster/afr/src/afr-inode-read.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>xlators/cluster/afr/src/afr-inode-read.c</a></div><div class='hunk'>@@ -1,22 +1,12 @@</div><div class='ctx'> /*</div><div class='del'>-   Copyright (c) 2007-2009 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='del'>-   This file is part of GlusterFS.</div><div class='del'>-</div><div class='del'>-   GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-   it under the terms of the GNU General Public License as published</div><div class='del'>-   by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-   or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-   GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-   WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-   General Public License for more details.</div><div class='del'>-</div><div class='del'>-   You should have received a copy of the GNU General Public License</div><div class='del'>-   along with this program.  If not, see</div><div class='del'>-   &lt;http://www.gnu.org/licenses/&gt;.</div><div class='del'>-*/</div><div class='add'>+  Copyright (c) 2008-2012 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='ctx'> </div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='ctx'> </div><div class='ctx'> #include &lt;libgen.h&gt;</div><div class='ctx'> #include &lt;unistd.h&gt;</div><div class='hunk'>@@ -25,863 +15,1880 @@</div><div class='ctx'> #include &lt;stdlib.h&gt;</div><div class='ctx'> #include &lt;signal.h&gt;</div><div class='ctx'> </div><div class='del'>-#ifndef _CONFIG_H</div><div class='del'>-#define _CONFIG_H</div><div class='del'>-#include "config.h"</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-#include "glusterfs.h"</div><div class='del'>-#include "afr.h"</div><div class='del'>-#include "dict.h"</div><div class='del'>-#include "xlator.h"</div><div class='del'>-#include "hashfn.h"</div><div class='del'>-#include "logging.h"</div><div class='del'>-#include "stack.h"</div><div class='del'>-#include "list.h"</div><div class='del'>-#include "call-stub.h"</div><div class='del'>-#include "defaults.h"</div><div class='del'>-#include "common-utils.h"</div><div class='del'>-#include "compat-errno.h"</div><div class='del'>-#include "compat.h"</div><div class='del'>-</div><div class='add'>+#include &lt;glusterfs/glusterfs.h&gt;</div><div class='ctx'> #include "afr.h"</div><div class='add'>+#include &lt;glusterfs/dict.h&gt;</div><div class='add'>+#include &lt;glusterfs/logging.h&gt;</div><div class='add'>+#include &lt;glusterfs/list.h&gt;</div><div class='add'>+#include &lt;glusterfs/byte-order.h&gt;</div><div class='add'>+#include &lt;glusterfs/defaults.h&gt;</div><div class='add'>+#include &lt;glusterfs/common-utils.h&gt;</div><div class='add'>+#include &lt;glusterfs/compat-errno.h&gt;</div><div class='add'>+#include &lt;glusterfs/compat.h&gt;</div><div class='add'>+#include &lt;glusterfs/quota-common-utils.h&gt;</div><div class='add'>+</div><div class='add'>+#include "afr-transaction.h"</div><div class='add'>+#include "afr-messages.h"</div><div class='ctx'> </div><div class='del'>-</div><div class='del'>-/**</div><div class='del'>- * Common algorithm for inode read calls:</div><div class='del'>- *</div><div class='del'>- * - Try the fop on the first child that is up</div><div class='del'>- * - if we have failed due to ENOTCONN:</div><div class='del'>- *     try the next child</div><div class='del'>- *</div><div class='del'>- * Applicable to: access, stat, fstat, readlink, getxattr</div><div class='del'>- */</div><div class='add'>+/*</div><div class='add'>+ * Quota size xattrs are not maintained by afr. There is a</div><div class='add'>+ * possibility that they differ even when both the directory changelog xattrs</div><div class='add'>+ * suggest everything is fine. So if there is at least one 'source' check among</div><div class='add'>+ * the sources which has the maximum quota size. Otherwise check among all the</div><div class='add'>+ * available ones for maximum quota size. This way if there is a source and</div><div class='add'>+ * stale copies it always votes for the 'source'.</div><div class='add'>+ * */</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+afr_handle_quota_size(call_frame_t *frame, xlator_t *this)</div><div class='add'>+{</div><div class='add'>+    unsigned char *readable = NULL;</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    struct afr_reply *replies = NULL;</div><div class='add'>+    int i = 0;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    quota_meta_t size = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    quota_meta_t max_size = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int readable_cnt = 0;</div><div class='add'>+    int read_subvol = -1;</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+    replies = local-&gt;replies;</div><div class='add'>+</div><div class='add'>+    readable = alloca0(priv-&gt;child_count);</div><div class='add'>+</div><div class='add'>+    afr_inode_read_subvol_get(local-&gt;inode, this, readable, 0, 0);</div><div class='add'>+</div><div class='add'>+    readable_cnt = AFR_COUNT(readable, priv-&gt;child_count);</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+        if (!replies[i].valid || replies[i].op_ret == -1)</div><div class='add'>+            continue;</div><div class='add'>+        if (readable_cnt &amp;&amp; !readable[i])</div><div class='add'>+            continue;</div><div class='add'>+        if (!replies[i].xdata)</div><div class='add'>+            continue;</div><div class='add'>+        ret = quota_dict_get_meta(replies[i].xdata, QUOTA_SIZE_KEY,</div><div class='add'>+                                  SLEN(QUOTA_SIZE_KEY), &amp;size);</div><div class='add'>+        if (ret == -1)</div><div class='add'>+            continue;</div><div class='add'>+        if (read_subvol == -1)</div><div class='add'>+            read_subvol = i;</div><div class='add'>+        if (size.size &gt; max_size.size ||</div><div class='add'>+            (size.file_count + size.dir_count) &gt;</div><div class='add'>+                (max_size.file_count + max_size.dir_count))</div><div class='add'>+            read_subvol = i;</div><div class='add'>+</div><div class='add'>+        if (size.size &gt; max_size.size)</div><div class='add'>+            max_size.size = size.size;</div><div class='add'>+        if (size.file_count &gt; max_size.file_count)</div><div class='add'>+            max_size.file_count = size.file_count;</div><div class='add'>+        if (size.dir_count &gt; max_size.dir_count)</div><div class='add'>+            max_size.dir_count = size.dir_count;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (max_size.size == 0 &amp;&amp; max_size.file_count == 0 &amp;&amp;</div><div class='add'>+        max_size.dir_count == 0)</div><div class='add'>+        return read_subvol;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+        if (!replies[i].valid || replies[i].op_ret == -1)</div><div class='add'>+            continue;</div><div class='add'>+        if (readable_cnt &amp;&amp; !readable[i])</div><div class='add'>+            continue;</div><div class='add'>+        if (!replies[i].xdata)</div><div class='add'>+            continue;</div><div class='add'>+        quota_dict_set_meta(replies[i].xdata, QUOTA_SIZE_KEY, &amp;max_size,</div><div class='add'>+                            IA_IFDIR);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return read_subvol;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> /* {{{ access */</div><div class='ctx'> </div><div class='del'>-int32_t</div><div class='del'>-afr_access_cbk (call_frame_t *frame, void *cookie,</div><div class='del'>-		xlator_t *this, int32_t op_ret, int32_t op_errno)</div><div class='add'>+int</div><div class='add'>+afr_access_cbk(call_frame_t *frame, void *cookie, xlator_t *this, int op_ret,</div><div class='add'>+               int op_errno, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-	afr_private_t * priv     = NULL;</div><div class='del'>-	afr_local_t *   local    = NULL;</div><div class='del'>-	xlator_t **     children = NULL;</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='ctx'> </div><div class='del'>-	int unwind     = 1;</div><div class='del'>-	int last_tried = -1;</div><div class='del'>-	int this_try = -1;</div><div class='del'>-        int read_child = -1;</div><div class='add'>+    local = frame-&gt;local;</div><div class='ctx'> </div><div class='del'>-	priv     = this-&gt;private;</div><div class='del'>-	children = priv-&gt;children;</div><div class='add'>+    if (op_ret &lt; 0) {</div><div class='add'>+        local-&gt;op_ret = op_ret;</div><div class='add'>+        local-&gt;op_errno = op_errno;</div><div class='ctx'> </div><div class='del'>-	local = frame-&gt;local;</div><div class='add'>+        afr_read_txn_continue(frame, this, (long)cookie);</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        read_child = (long) cookie;</div><div class='add'>+    AFR_STACK_UNWIND(access, frame, op_ret, op_errno, xdata);</div><div class='ctx'> </div><div class='del'>-	if (op_ret == -1) {</div><div class='del'>-        retry:</div><div class='del'>-		last_tried = local-&gt;cont.access.last_tried;</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-		if (all_tried (last_tried, priv-&gt;child_count)) {</div><div class='del'>-			goto out;</div><div class='del'>-		}</div><div class='del'>-		this_try    = ++local-&gt;cont.access.last_tried;</div><div class='add'>+int</div><div class='add'>+afr_access_wind(call_frame_t *frame, xlator_t *this, int subvol)</div><div class='add'>+{</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+</div><div class='add'>+    if (subvol == -1) {</div><div class='add'>+        AFR_STACK_UNWIND(access, frame, local-&gt;op_ret, local-&gt;op_errno, 0);</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    STACK_WIND_COOKIE(frame, afr_access_cbk, (void *)(long)subvol,</div><div class='add'>+                      priv-&gt;children[subvol],</div><div class='add'>+                      priv-&gt;children[subvol]-&gt;fops-&gt;access, &amp;local-&gt;loc,</div><div class='add'>+                      local-&gt;cont.access.mask, local-&gt;xdata_req);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-                if (this_try == read_child) {</div><div class='del'>-                        goto retry;</div><div class='del'>-                }</div><div class='add'>+int</div><div class='add'>+afr_access(call_frame_t *frame, xlator_t *this, loc_t *loc, int mask,</div><div class='add'>+           dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    int op_errno = 0;</div><div class='add'>+</div><div class='add'>+    local = AFR_FRAME_INIT(frame, op_errno);</div><div class='add'>+    if (!local)</div><div class='add'>+        goto out;</div><div class='ctx'> </div><div class='del'>-		unwind = 0;</div><div class='add'>+    local-&gt;op = GF_FOP_ACCESS;</div><div class='add'>+    loc_copy(&amp;local-&gt;loc, loc);</div><div class='add'>+    local-&gt;cont.access.mask = mask;</div><div class='add'>+    if (xdata)</div><div class='add'>+        local-&gt;xdata_req = dict_ref(xdata);</div><div class='ctx'> </div><div class='del'>-		STACK_WIND_COOKIE (frame, afr_access_cbk,</div><div class='del'>-				   (void *) (long) read_child,</div><div class='del'>-				   children[this_try],</div><div class='del'>-				   children[this_try]-&gt;fops-&gt;access,</div><div class='del'>-				   &amp;local-&gt;loc, local-&gt;cont.access.mask);</div><div class='del'>-	}</div><div class='add'>+    afr_read_txn(frame, this, loc-&gt;inode, afr_access_wind,</div><div class='add'>+                 AFR_METADATA_TRANSACTION);</div><div class='ctx'> </div><div class='add'>+    return 0;</div><div class='ctx'> out:</div><div class='del'>-	if (unwind) {</div><div class='del'>-		AFR_STACK_UNWIND (access, frame, op_ret, op_errno);</div><div class='del'>-	}</div><div class='add'>+    AFR_STACK_UNWIND(access, frame, -1, op_errno, NULL);</div><div class='ctx'> </div><div class='del'>-	return 0;</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+/* }}} */</div><div class='ctx'> </div><div class='del'>-int32_t</div><div class='del'>-afr_access (call_frame_t *frame, xlator_t *this,</div><div class='del'>-	    loc_t *loc, int32_t mask)</div><div class='del'>-{</div><div class='del'>-	afr_private_t * priv       = NULL;</div><div class='del'>-	xlator_t **     children   = NULL;</div><div class='del'>-	int             call_child = 0;</div><div class='del'>-	afr_local_t     *local     = NULL;</div><div class='add'>+/* {{{ stat */</div><div class='ctx'> </div><div class='del'>-        int32_t         read_child = -1;</div><div class='add'>+int</div><div class='add'>+afr_stat_cbk(call_frame_t *frame, void *cookie, xlator_t *this, int32_t op_ret,</div><div class='add'>+             int32_t op_errno, struct iatt *buf, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='ctx'> </div><div class='add'>+    local = frame-&gt;local;</div><div class='ctx'> </div><div class='del'>-	int32_t op_ret   = -1;</div><div class='del'>-	int32_t op_errno = 0;</div><div class='add'>+    if (op_ret &lt; 0) {</div><div class='add'>+        local-&gt;op_ret = op_ret;</div><div class='add'>+        local-&gt;op_errno = op_errno;</div><div class='ctx'> </div><div class='del'>-	VALIDATE_OR_GOTO (frame, out);</div><div class='del'>-	VALIDATE_OR_GOTO (this, out);</div><div class='del'>-	VALIDATE_OR_GOTO (this-&gt;private, out);</div><div class='add'>+        afr_read_txn_continue(frame, this, (long)cookie);</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	priv     = this-&gt;private;</div><div class='del'>-	VALIDATE_OR_GOTO (priv-&gt;children, out);</div><div class='add'>+    AFR_STACK_UNWIND(stat, frame, op_ret, op_errno, buf, xdata);</div><div class='ctx'> </div><div class='del'>-	children = priv-&gt;children;</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	ALLOC_OR_GOTO (local, afr_local_t, out);</div><div class='add'>+int</div><div class='add'>+afr_stat_wind(call_frame_t *frame, xlator_t *this, int subvol)</div><div class='add'>+{</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='ctx'> </div><div class='del'>-        read_child = afr_read_child (this, loc-&gt;inode);</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+    local = frame-&gt;local;</div><div class='ctx'> </div><div class='del'>-        if (read_child &gt;= 0) {</div><div class='del'>-                call_child = read_child;</div><div class='add'>+    if (subvol == -1) {</div><div class='add'>+        AFR_STACK_UNWIND(stat, frame, local-&gt;op_ret, local-&gt;op_errno, 0, 0);</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-                local-&gt;cont.access.last_tried = -1;</div><div class='add'>+    STACK_WIND_COOKIE(</div><div class='add'>+        frame, afr_stat_cbk, (void *)(long)subvol, priv-&gt;children[subvol],</div><div class='add'>+        priv-&gt;children[subvol]-&gt;fops-&gt;stat, &amp;local-&gt;loc, local-&gt;xdata_req);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        } else {</div><div class='del'>-                call_child = afr_first_up_child (priv);</div><div class='del'>-                if (call_child == -1) {</div><div class='del'>-                        op_errno = ENOTCONN;</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-                                "no child is up");</div><div class='del'>-                        goto out;</div><div class='del'>-                }</div><div class='add'>+int</div><div class='add'>+afr_stat(call_frame_t *frame, xlator_t *this, loc_t *loc, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    int op_errno = 0;</div><div class='ctx'> </div><div class='del'>-                local-&gt;cont.access.last_tried = call_child;</div><div class='del'>-        }</div><div class='add'>+    local = AFR_FRAME_INIT(frame, op_errno);</div><div class='add'>+    if (!local)</div><div class='add'>+        goto out;</div><div class='ctx'> </div><div class='del'>-	loc_copy (&amp;local-&gt;loc, loc);</div><div class='del'>-	local-&gt;cont.access.mask       = mask;</div><div class='add'>+    local-&gt;op = GF_FOP_STAT;</div><div class='add'>+    loc_copy(&amp;local-&gt;loc, loc);</div><div class='add'>+    if (xdata)</div><div class='add'>+        local-&gt;xdata_req = dict_ref(xdata);</div><div class='ctx'> </div><div class='del'>-	STACK_WIND_COOKIE (frame, afr_access_cbk,</div><div class='del'>-			   (void *) (long) call_child,</div><div class='del'>-			   children[call_child], children[call_child]-&gt;fops-&gt;access,</div><div class='del'>-			   loc, mask);</div><div class='add'>+    afr_read_txn(frame, this, loc-&gt;inode, afr_stat_wind, AFR_DATA_TRANSACTION);</div><div class='ctx'> </div><div class='del'>-	op_ret = 0;</div><div class='add'>+    return 0;</div><div class='ctx'> out:</div><div class='del'>-	if (op_ret == -1) {</div><div class='del'>-		AFR_STACK_UNWIND (access, frame, op_ret, op_errno);</div><div class='del'>-	}</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='add'>+    AFR_STACK_UNWIND(stat, frame, -1, op_errno, NULL, NULL);</div><div class='ctx'> </div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> /* }}} */</div><div class='ctx'> </div><div class='del'>-/* {{{ stat */</div><div class='add'>+/* {{{ fstat */</div><div class='ctx'> </div><div class='del'>-int32_t</div><div class='del'>-afr_stat_cbk (call_frame_t *frame, void *cookie,</div><div class='del'>-	      xlator_t *this, int32_t op_ret, int32_t op_errno,</div><div class='del'>-	      struct iatt *buf)</div><div class='add'>+int</div><div class='add'>+afr_fstat_cbk(call_frame_t *frame, void *cookie, xlator_t *this, int32_t op_ret,</div><div class='add'>+              int32_t op_errno, struct iatt *buf, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-	afr_private_t * priv     = NULL;</div><div class='del'>-	afr_local_t *   local    = NULL;</div><div class='del'>-	xlator_t **     children = NULL;</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='ctx'> </div><div class='del'>-	int unwind     = 1;</div><div class='del'>-	int last_tried = -1;</div><div class='del'>-	int this_try = -1;</div><div class='del'>-	int read_child = -1;</div><div class='add'>+    local = frame-&gt;local;</div><div class='ctx'> </div><div class='del'>-	priv     = this-&gt;private;</div><div class='del'>-	children = priv-&gt;children;</div><div class='add'>+    if (op_ret &lt; 0) {</div><div class='add'>+        local-&gt;op_ret = op_ret;</div><div class='add'>+        local-&gt;op_errno = op_errno;</div><div class='ctx'> </div><div class='del'>-	read_child = (long) cookie;</div><div class='add'>+        afr_read_txn_continue(frame, this, (long)cookie);</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	local = frame-&gt;local;</div><div class='add'>+    AFR_STACK_UNWIND(fstat, frame, op_ret, op_errno, buf, xdata);</div><div class='ctx'> </div><div class='del'>-	if (op_ret == -1) {</div><div class='del'>-	retry:</div><div class='del'>-		last_tried = local-&gt;cont.stat.last_tried;</div><div class='del'>-</div><div class='del'>-		if (all_tried (last_tried, priv-&gt;child_count)) {</div><div class='del'>-			goto out;</div><div class='del'>-		}</div><div class='del'>-		this_try = ++local-&gt;cont.stat.last_tried;</div><div class='del'>-</div><div class='del'>-		if (this_try == read_child) {</div><div class='del'>-			goto retry;</div><div class='del'>-		}</div><div class='del'>-</div><div class='del'>-		unwind = 0;</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-		STACK_WIND_COOKIE (frame, afr_stat_cbk,</div><div class='del'>-				   (void *) (long) read_child,</div><div class='del'>-				   children[this_try],</div><div class='del'>-				   children[this_try]-&gt;fops-&gt;stat,</div><div class='del'>-				   &amp;local-&gt;loc);</div><div class='del'>-	}</div><div class='add'>+int</div><div class='add'>+afr_fstat_wind(call_frame_t *frame, xlator_t *this, int subvol)</div><div class='add'>+{</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='ctx'> </div><div class='del'>-out:</div><div class='del'>-	if (unwind) {</div><div class='del'>-		if (buf)</div><div class='del'>-			buf-&gt;ia_ino = local-&gt;cont.stat.ino;</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+    local = frame-&gt;local;</div><div class='ctx'> </div><div class='del'>-		AFR_STACK_UNWIND (stat, frame, op_ret, op_errno, buf);</div><div class='del'>-	}</div><div class='add'>+    if (subvol == -1) {</div><div class='add'>+        AFR_STACK_UNWIND(fstat, frame, local-&gt;op_ret, local-&gt;op_errno, 0, 0);</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	return 0;</div><div class='add'>+    STACK_WIND_COOKIE(</div><div class='add'>+        frame, afr_fstat_cbk, (void *)(long)subvol, priv-&gt;children[subvol],</div><div class='add'>+        priv-&gt;children[subvol]-&gt;fops-&gt;fstat, local-&gt;fd, local-&gt;xdata_req);</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int32_t</div><div class='del'>-afr_stat (call_frame_t *frame, xlator_t *this,</div><div class='del'>-	  loc_t *loc)</div><div class='add'>+afr_fstat(call_frame_t *frame, xlator_t *this, fd_t *fd, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-	afr_private_t * priv       = NULL;</div><div class='del'>-	afr_local_t   * local      = NULL;</div><div class='del'>-	xlator_t **     children   = NULL;</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    int op_errno = 0;</div><div class='ctx'> </div><div class='del'>-        int32_t         read_child = -1;</div><div class='del'>-	int             call_child = 0;</div><div class='add'>+    AFR_ERROR_OUT_IF_FDCTX_INVALID(fd, this, op_errno, out);</div><div class='add'>+    local = AFR_FRAME_INIT(frame, op_errno);</div><div class='add'>+    if (!local)</div><div class='add'>+        goto out;</div><div class='ctx'> </div><div class='del'>-	int32_t         op_ret     = -1;</div><div class='del'>-	int32_t         op_errno   = 0;</div><div class='add'>+    local-&gt;op = GF_FOP_FSTAT;</div><div class='add'>+    local-&gt;fd = fd_ref(fd);</div><div class='add'>+    if (xdata)</div><div class='add'>+        local-&gt;xdata_req = dict_ref(xdata);</div><div class='ctx'> </div><div class='del'>-	VALIDATE_OR_GOTO (frame, out);</div><div class='del'>-	VALIDATE_OR_GOTO (this, out);</div><div class='del'>-	VALIDATE_OR_GOTO (this-&gt;private, out);</div><div class='add'>+    afr_fix_open(fd, this);</div><div class='ctx'> </div><div class='del'>-	priv     = this-&gt;private;</div><div class='del'>-	VALIDATE_OR_GOTO (priv-&gt;children, out);</div><div class='add'>+    afr_read_txn(frame, this, fd-&gt;inode, afr_fstat_wind, AFR_DATA_TRANSACTION);</div><div class='ctx'> </div><div class='del'>-	children = priv-&gt;children;</div><div class='add'>+    return 0;</div><div class='add'>+out:</div><div class='add'>+    AFR_STACK_UNWIND(fstat, frame, -1, op_errno, NULL, NULL);</div><div class='ctx'> </div><div class='del'>-	ALLOC_OR_GOTO (local, afr_local_t, out);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	frame-&gt;local = local;</div><div class='add'>+/* }}} */</div><div class='ctx'> </div><div class='del'>-        read_child = afr_read_child (this, loc-&gt;inode);</div><div class='add'>+/* {{{ readlink */</div><div class='ctx'> </div><div class='del'>-        if (read_child &gt;= 0) {</div><div class='del'>-                call_child = read_child;</div><div class='add'>+int</div><div class='add'>+afr_readlink_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                 int32_t op_ret, int32_t op_errno, const char *buf,</div><div class='add'>+                 struct iatt *sbuf, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='ctx'> </div><div class='del'>-                local-&gt;cont.stat.last_tried = -1;</div><div class='add'>+    local = frame-&gt;local;</div><div class='ctx'> </div><div class='del'>-        } else {</div><div class='del'>-		call_child = afr_first_up_child (priv);</div><div class='del'>-		if (call_child == -1) {</div><div class='del'>-			op_errno = ENOTCONN;</div><div class='del'>-			gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-				"no child is up");</div><div class='del'>-			goto out;</div><div class='del'>-		}</div><div class='add'>+    if (op_ret &lt; 0) {</div><div class='add'>+        local-&gt;op_ret = -1;</div><div class='add'>+        local-&gt;op_errno = op_errno;</div><div class='ctx'> </div><div class='del'>-		local-&gt;cont.stat.last_tried = call_child;</div><div class='del'>-	}</div><div class='add'>+        afr_read_txn_continue(frame, this, (long)cookie);</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	loc_copy (&amp;local-&gt;loc, loc);</div><div class='add'>+    AFR_STACK_UNWIND(readlink, frame, op_ret, op_errno, buf, sbuf, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	local-&gt;cont.stat.ino = loc-&gt;inode-&gt;ino;</div><div class='add'>+int</div><div class='add'>+afr_readlink_wind(call_frame_t *frame, xlator_t *this, int subvol)</div><div class='add'>+{</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    if (subvol == -1) {</div><div class='add'>+        AFR_STACK_UNWIND(readlink, frame, local-&gt;op_ret, local-&gt;op_errno, 0, 0,</div><div class='add'>+                         0);</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    STACK_WIND_COOKIE(frame, afr_readlink_cbk, (void *)(long)subvol,</div><div class='add'>+                      priv-&gt;children[subvol],</div><div class='add'>+                      priv-&gt;children[subvol]-&gt;fops-&gt;readlink, &amp;local-&gt;loc,</div><div class='add'>+                      local-&gt;cont.readlink.size, local-&gt;xdata_req);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	STACK_WIND_COOKIE (frame, afr_stat_cbk, (void *) (long) call_child,</div><div class='del'>-			   children[call_child],</div><div class='del'>-			   children[call_child]-&gt;fops-&gt;stat,</div><div class='del'>-			   loc);</div><div class='add'>+int</div><div class='add'>+afr_readlink(call_frame_t *frame, xlator_t *this, loc_t *loc, size_t size,</div><div class='add'>+             dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    int32_t op_errno = 0;</div><div class='ctx'> </div><div class='del'>-	op_ret = 0;</div><div class='del'>-out:</div><div class='del'>-	if (op_ret == -1) {</div><div class='del'>-		AFR_STACK_UNWIND (stat, frame, op_ret, op_errno, NULL);</div><div class='del'>-	}</div><div class='add'>+    local = AFR_FRAME_INIT(frame, op_errno);</div><div class='add'>+    if (!local)</div><div class='add'>+        goto out;</div><div class='ctx'> </div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='add'>+    local-&gt;op = GF_FOP_READLINK;</div><div class='add'>+    loc_copy(&amp;local-&gt;loc, loc);</div><div class='add'>+    local-&gt;cont.readlink.size = size;</div><div class='add'>+    if (xdata)</div><div class='add'>+        local-&gt;xdata_req = dict_ref(xdata);</div><div class='ctx'> </div><div class='add'>+    afr_read_txn(frame, this, loc-&gt;inode, afr_readlink_wind,</div><div class='add'>+                 AFR_DATA_TRANSACTION);</div><div class='ctx'> </div><div class='del'>-/* }}} */</div><div class='add'>+    return 0;</div><div class='add'>+out:</div><div class='add'>+    AFR_STACK_UNWIND(readlink, frame, -1, op_errno, 0, 0, 0);</div><div class='ctx'> </div><div class='del'>-/* {{{ fstat */</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-int32_t</div><div class='del'>-afr_fstat_cbk (call_frame_t *frame, void *cookie,</div><div class='del'>-	       xlator_t *this, int32_t op_ret, int32_t op_errno,</div><div class='del'>-	       struct iatt *buf)</div><div class='del'>-{</div><div class='del'>-	afr_private_t * priv     = NULL;</div><div class='del'>-	afr_local_t *   local    = NULL;</div><div class='del'>-	xlator_t **     children = NULL;</div><div class='add'>+/* }}} */</div><div class='ctx'> </div><div class='del'>-	int unwind     = 1;</div><div class='del'>-	int last_tried = -1;</div><div class='del'>-	int this_try = -1;</div><div class='del'>-        int read_child = -1;</div><div class='add'>+/* {{{ getxattr */</div><div class='ctx'> </div><div class='del'>-	priv     = this-&gt;private;</div><div class='del'>-	children = priv-&gt;children;</div><div class='add'>+struct _xattr_key {</div><div class='add'>+    char *key;</div><div class='add'>+    struct list_head list;</div><div class='add'>+};</div><div class='ctx'> </div><div class='del'>-	local = frame-&gt;local;</div><div class='add'>+int</div><div class='add'>+__gather_xattr_keys(dict_t *dict, char *key, data_t *value, void *data)</div><div class='add'>+{</div><div class='add'>+    struct list_head *list = data;</div><div class='add'>+    struct _xattr_key *xkey = NULL;</div><div class='ctx'> </div><div class='del'>-	read_child = (long) cookie;</div><div class='add'>+    if (!strncmp(key, AFR_XATTR_PREFIX, SLEN(AFR_XATTR_PREFIX))) {</div><div class='add'>+        xkey = GF_MALLOC(sizeof(*xkey), gf_afr_mt_xattr_key);</div><div class='add'>+        if (!xkey)</div><div class='add'>+            return -1;</div><div class='ctx'> </div><div class='del'>-	if (op_ret == -1) {</div><div class='del'>-	retry:</div><div class='del'>-		last_tried = local-&gt;cont.fstat.last_tried;</div><div class='add'>+        xkey-&gt;key = key;</div><div class='add'>+        INIT_LIST_HEAD(&amp;xkey-&gt;list);</div><div class='ctx'> </div><div class='del'>-		if (all_tried (last_tried, priv-&gt;child_count)) {</div><div class='del'>-			goto out;</div><div class='del'>-		}</div><div class='del'>-		this_try   = ++local-&gt;cont.fstat.last_tried;</div><div class='add'>+        list_add_tail(&amp;xkey-&gt;list, list);</div><div class='add'>+    }</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-		if (this_try == read_child) {</div><div class='del'>-			goto retry;</div><div class='del'>-		}</div><div class='add'>+void</div><div class='add'>+afr_filter_xattrs(dict_t *dict)</div><div class='add'>+{</div><div class='add'>+    struct list_head keys = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    struct _xattr_key *key = NULL;</div><div class='add'>+    struct _xattr_key *tmp = NULL;</div><div class='ctx'> </div><div class='del'>-		unwind = 0;</div><div class='add'>+    INIT_LIST_HEAD(&amp;keys);</div><div class='ctx'> </div><div class='del'>-		STACK_WIND_COOKIE (frame, afr_fstat_cbk,</div><div class='del'>-				   (void *) (long) read_child,</div><div class='del'>-				   children[this_try],</div><div class='del'>-				   children[this_try]-&gt;fops-&gt;fstat,</div><div class='del'>-				   local-&gt;fd);</div><div class='del'>-	}</div><div class='add'>+    dict_foreach(dict, __gather_xattr_keys, (void *)&amp;keys);</div><div class='ctx'> </div><div class='del'>-out:</div><div class='del'>-	if (unwind) {</div><div class='del'>-		if (buf)</div><div class='del'>-			buf-&gt;ia_ino = local-&gt;cont.fstat.ino;</div><div class='add'>+    list_for_each_entry_safe(key, tmp, &amp;keys, list)</div><div class='add'>+    {</div><div class='add'>+        dict_del(dict, key-&gt;key);</div><div class='ctx'> </div><div class='del'>-		AFR_STACK_UNWIND (fstat, frame, op_ret, op_errno, buf);</div><div class='del'>-	}</div><div class='add'>+        list_del_init(&amp;key-&gt;list);</div><div class='ctx'> </div><div class='del'>-	return 0;</div><div class='add'>+        GF_FREE(key);</div><div class='add'>+    }</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+static gf_boolean_t</div><div class='add'>+afr_getxattr_ignorable_errnos(int32_t op_errno)</div><div class='add'>+{</div><div class='add'>+    if (op_errno == ENODATA || op_errno == ENOTSUP || op_errno == ERANGE ||</div><div class='add'>+        op_errno == ENAMETOOLONG)</div><div class='add'>+        return _gf_true;</div><div class='ctx'> </div><div class='del'>-int32_t</div><div class='del'>-afr_fstat (call_frame_t *frame, xlator_t *this,</div><div class='del'>-	   fd_t *fd)</div><div class='add'>+    return _gf_false;</div><div class='add'>+}</div><div class='add'>+int</div><div class='add'>+afr_getxattr_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                 int32_t op_ret, int32_t op_errno, dict_t *dict, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-	afr_private_t * priv       = NULL;</div><div class='del'>-	afr_local_t   * local      = NULL;</div><div class='del'>-	xlator_t **     children   = NULL;</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='ctx'> </div><div class='del'>-	int             call_child = 0;</div><div class='del'>-        int32_t         read_child = -1;</div><div class='add'>+    local = frame-&gt;local;</div><div class='ctx'> </div><div class='del'>-	int32_t         op_ret     = -1;</div><div class='del'>-	int32_t         op_errno   = 0;</div><div class='add'>+    if (op_ret &lt; 0 &amp;&amp; !afr_getxattr_ignorable_errnos(op_errno)) {</div><div class='add'>+        local-&gt;op_ret = op_ret;</div><div class='add'>+        local-&gt;op_errno = op_errno;</div><div class='ctx'> </div><div class='del'>-	VALIDATE_OR_GOTO (frame, out);</div><div class='del'>-	VALIDATE_OR_GOTO (this, out);</div><div class='del'>-	VALIDATE_OR_GOTO (fd, out);</div><div class='del'>-	VALIDATE_OR_GOTO (this-&gt;private, out);</div><div class='add'>+        afr_read_txn_continue(frame, this, (long)cookie);</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	priv     = this-&gt;private;</div><div class='del'>-	VALIDATE_OR_GOTO (priv-&gt;children, out);</div><div class='add'>+    if (dict)</div><div class='add'>+        afr_filter_xattrs(dict);</div><div class='ctx'> </div><div class='del'>-	children = priv-&gt;children;</div><div class='add'>+    AFR_STACK_UNWIND(getxattr, frame, op_ret, op_errno, dict, xdata);</div><div class='ctx'> </div><div class='del'>-	ALLOC_OR_GOTO (local, afr_local_t, out);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	frame-&gt;local = local;</div><div class='add'>+int</div><div class='add'>+afr_getxattr_wind(call_frame_t *frame, xlator_t *this, int subvol)</div><div class='add'>+{</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    if (subvol == -1) {</div><div class='add'>+        AFR_STACK_UNWIND(getxattr, frame, local-&gt;op_ret, local-&gt;op_errno, NULL,</div><div class='add'>+                         NULL);</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    STACK_WIND_COOKIE(frame, afr_getxattr_cbk, (void *)(long)subvol,</div><div class='add'>+                      priv-&gt;children[subvol],</div><div class='add'>+                      priv-&gt;children[subvol]-&gt;fops-&gt;getxattr, &amp;local-&gt;loc,</div><div class='add'>+                      local-&gt;cont.getxattr.name, local-&gt;xdata_req);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	VALIDATE_OR_GOTO (fd-&gt;inode, out);</div><div class='add'>+int32_t</div><div class='add'>+afr_getxattr_unwind(call_frame_t *frame, int op_ret, int op_errno, dict_t *dict,</div><div class='add'>+                    dict_t *xdata)</div><div class='ctx'> </div><div class='del'>-        read_child = afr_read_child (this, fd-&gt;inode);</div><div class='add'>+{</div><div class='add'>+    AFR_STACK_UNWIND(getxattr, frame, op_ret, op_errno, dict, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        if (read_child &gt;= 0) {</div><div class='del'>-                call_child = read_child;</div><div class='add'>+int32_t</div><div class='add'>+afr_fgetxattr_clrlk_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                        int32_t op_ret, int32_t op_errno, dict_t *dict,</div><div class='add'>+                        dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    xlator_t **children = NULL;</div><div class='add'>+    dict_t *xattr = NULL;</div><div class='add'>+    char *tmp_report = NULL;</div><div class='add'>+    char lk_summary[1024] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int serz_len = 0;</div><div class='add'>+    int32_t callcnt = 0;</div><div class='add'>+    long int cky = 0;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    int keylen = 0;</div><div class='add'>+    int children_keylen = 0;</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+    children = priv-&gt;children;</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    cky = (long)cookie;</div><div class='add'>+    keylen = strlen(local-&gt;cont.getxattr.name);</div><div class='add'>+    children_keylen = strlen(children[cky]-&gt;name);</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;frame-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        callcnt = --local-&gt;call_count;</div><div class='add'>+        if (op_ret == -1)</div><div class='add'>+            local-&gt;replies[cky].op_errno = op_errno;</div><div class='add'>+</div><div class='add'>+        if (!local-&gt;dict)</div><div class='add'>+            local-&gt;dict = dict_new();</div><div class='add'>+        if (local-&gt;dict) {</div><div class='add'>+            ret = dict_get_strn(dict, local-&gt;cont.getxattr.name, keylen,</div><div class='add'>+                                &amp;tmp_report);</div><div class='add'>+            if (ret)</div><div class='add'>+                goto unlock;</div><div class='add'>+            ret = dict_set_dynstrn(local-&gt;dict, children[cky]-&gt;name,</div><div class='add'>+                                   children_keylen, gf_strdup(tmp_report));</div><div class='add'>+            if (ret)</div><div class='add'>+                goto unlock;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+unlock:</div><div class='add'>+    UNLOCK(&amp;frame-&gt;lock);</div><div class='add'>+</div><div class='add'>+    if (!callcnt) {</div><div class='add'>+        xattr = dict_new();</div><div class='add'>+        if (!xattr) {</div><div class='add'>+            op_ret = -1;</div><div class='add'>+            op_errno = ENOMEM;</div><div class='add'>+            goto unwind;</div><div class='add'>+        }</div><div class='add'>+        ret = dict_serialize_value_with_delim(local-&gt;dict, lk_summary,</div><div class='add'>+                                              &amp;serz_len, '\n');</div><div class='add'>+        if (ret) {</div><div class='add'>+            op_ret = -1;</div><div class='add'>+            op_errno = ENOMEM;</div><div class='add'>+            goto unwind;</div><div class='add'>+        }</div><div class='add'>+        if (serz_len == -1)</div><div class='add'>+            snprintf(lk_summary, sizeof(lk_summary), "No locks cleared.");</div><div class='add'>+        ret = dict_set_dynstrn(xattr, local-&gt;cont.getxattr.name, keylen,</div><div class='add'>+                               gf_strdup(lk_summary));</div><div class='add'>+        if (ret) {</div><div class='add'>+            op_ret = -1;</div><div class='add'>+            op_errno = ENOMEM;</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, ENOMEM, AFR_MSG_DICT_SET_FAILED,</div><div class='add'>+                   "Error setting dictionary");</div><div class='add'>+            goto unwind;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-                local-&gt;cont.fstat.last_tried = -1;</div><div class='del'>-        } else {</div><div class='del'>-                call_child = afr_first_up_child (priv);</div><div class='add'>+        op_errno = afr_final_errno(local, priv);</div><div class='ctx'> </div><div class='del'>-                if (call_child == -1) {</div><div class='del'>-                        op_errno = ENOTCONN;</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-				"no child is up");</div><div class='del'>-			goto out;</div><div class='del'>-		}</div><div class='add'>+    unwind:</div><div class='add'>+        AFR_STACK_UNWIND(fgetxattr, frame, op_ret, op_errno, xattr, xdata);</div><div class='add'>+        if (xattr)</div><div class='add'>+            dict_unref(xattr);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-                local-&gt;cont.fstat.last_tried = call_child;</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+afr_getxattr_clrlk_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                       int32_t op_ret, int32_t op_errno, dict_t *dict,</div><div class='add'>+                       dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    xlator_t **children = NULL;</div><div class='add'>+    dict_t *xattr = NULL;</div><div class='add'>+    char *tmp_report = NULL;</div><div class='add'>+    char lk_summary[1024] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int serz_len = 0;</div><div class='add'>+    int32_t callcnt = 0;</div><div class='add'>+    long int cky = 0;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    int keylen = 0;</div><div class='add'>+    int children_keylen = 0;</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+    children = priv-&gt;children;</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    cky = (long)cookie;</div><div class='add'>+</div><div class='add'>+    keylen = strlen(local-&gt;cont.getxattr.name);</div><div class='add'>+    children_keylen = strlen(children[cky]-&gt;name);</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;frame-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        callcnt = --local-&gt;call_count;</div><div class='add'>+        if (op_ret == -1)</div><div class='add'>+            local-&gt;replies[cky].op_errno = op_errno;</div><div class='add'>+</div><div class='add'>+        if (!local-&gt;dict)</div><div class='add'>+            local-&gt;dict = dict_new();</div><div class='add'>+        if (local-&gt;dict) {</div><div class='add'>+            ret = dict_get_strn(dict, local-&gt;cont.getxattr.name, keylen,</div><div class='add'>+                                &amp;tmp_report);</div><div class='add'>+            if (ret)</div><div class='add'>+                goto unlock;</div><div class='add'>+            ret = dict_set_dynstrn(local-&gt;dict, children[cky]-&gt;name,</div><div class='add'>+                                   children_keylen, gf_strdup(tmp_report));</div><div class='add'>+            if (ret)</div><div class='add'>+                goto unlock;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+unlock:</div><div class='add'>+    UNLOCK(&amp;frame-&gt;lock);</div><div class='add'>+</div><div class='add'>+    if (!callcnt) {</div><div class='add'>+        xattr = dict_new();</div><div class='add'>+        if (!xattr) {</div><div class='add'>+            op_ret = -1;</div><div class='add'>+            op_errno = ENOMEM;</div><div class='add'>+            goto unwind;</div><div class='add'>+        }</div><div class='add'>+        ret = dict_serialize_value_with_delim(local-&gt;dict, lk_summary,</div><div class='add'>+                                              &amp;serz_len, '\n');</div><div class='add'>+        if (ret) {</div><div class='add'>+            op_ret = -1;</div><div class='add'>+            op_errno = ENOMEM;</div><div class='add'>+            goto unwind;</div><div class='add'>+        }</div><div class='add'>+        if (serz_len == -1)</div><div class='add'>+            snprintf(lk_summary, sizeof(lk_summary), "No locks cleared.");</div><div class='add'>+        ret = dict_set_dynstrn(xattr, local-&gt;cont.getxattr.name, keylen,</div><div class='add'>+                               gf_strdup(lk_summary));</div><div class='add'>+        if (ret) {</div><div class='add'>+            op_ret = -1;</div><div class='add'>+            op_errno = ENOMEM;</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, ENOMEM, AFR_MSG_DICT_SET_FAILED,</div><div class='add'>+                   "Error setting dictionary");</div><div class='add'>+            goto unwind;</div><div class='ctx'>         }</div><div class='ctx'> </div><div class='del'>-	local-&gt;cont.fstat.ino = fd-&gt;inode-&gt;ino;</div><div class='del'>-	local-&gt;fd = fd_ref (fd);</div><div class='add'>+        op_errno = afr_final_errno(local, priv);</div><div class='ctx'> </div><div class='del'>-	STACK_WIND_COOKIE (frame, afr_fstat_cbk, (void *) (long) call_child,</div><div class='del'>-			   children[call_child],</div><div class='del'>-			   children[call_child]-&gt;fops-&gt;fstat,</div><div class='del'>-			   fd);</div><div class='add'>+    unwind:</div><div class='add'>+        AFR_STACK_UNWIND(getxattr, frame, op_ret, op_errno, xattr, xdata);</div><div class='ctx'> </div><div class='del'>-	op_ret = 0;</div><div class='del'>-out:</div><div class='del'>-	if (op_ret == -1) {</div><div class='del'>-		AFR_STACK_UNWIND (fstat, frame, op_ret, op_errno, NULL);</div><div class='del'>-	}</div><div class='add'>+        if (xattr)</div><div class='add'>+            dict_unref(xattr);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	return 0;</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-/* }}} */</div><div class='del'>-</div><div class='del'>-/* {{{ readlink */</div><div class='add'>+/**</div><div class='add'>+ * node-uuid cbk uses next child querying mechanism</div><div class='add'>+ */</div><div class='add'>+int32_t</div><div class='add'>+afr_getxattr_node_uuid_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                           int32_t op_ret, int32_t op_errno, dict_t *dict,</div><div class='add'>+                           dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    xlator_t **children = NULL;</div><div class='add'>+    int unwind = 1;</div><div class='add'>+    int curr_call_child = 0;</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+    children = priv-&gt;children;</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+</div><div class='add'>+    if (op_ret == -1) { /** query the _next_ child */</div><div class='add'>+</div><div class='add'>+        /**</div><div class='add'>+         * _current_ becomes _next_</div><div class='add'>+         * If done with all children and yet no success; give up !</div><div class='add'>+         */</div><div class='add'>+        curr_call_child = (int)((long)cookie);</div><div class='add'>+        if (++curr_call_child == priv-&gt;child_count)</div><div class='add'>+            goto unwind;</div><div class='add'>+</div><div class='add'>+        gf_msg_debug(this-&gt;name, op_errno,</div><div class='add'>+                     "op_ret (-1): Re-querying afr-child (%d/%d)",</div><div class='add'>+                     curr_call_child, priv-&gt;child_count);</div><div class='add'>+</div><div class='add'>+        unwind = 0;</div><div class='add'>+        STACK_WIND_COOKIE(</div><div class='add'>+            frame, afr_getxattr_node_uuid_cbk, (void *)(long)curr_call_child,</div><div class='add'>+            children[curr_call_child],</div><div class='add'>+            children[curr_call_child]-&gt;fops-&gt;getxattr, &amp;local-&gt;loc,</div><div class='add'>+            local-&gt;cont.getxattr.name, local-&gt;xdata_req);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+unwind:</div><div class='add'>+    if (unwind)</div><div class='add'>+        AFR_STACK_UNWIND(getxattr, frame, op_ret, op_errno, dict, xdata);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='add'>+/**</div><div class='add'>+ * list-node-uuids cbk returns the list of node_uuids for the subvolume.</div><div class='add'>+ */</div><div class='ctx'> int32_t</div><div class='del'>-afr_readlink_cbk (call_frame_t *frame, void *cookie,</div><div class='del'>-		  xlator_t *this, int32_t op_ret, int32_t op_errno,</div><div class='del'>-		  const char *buf, struct iatt *sbuf)</div><div class='add'>+afr_getxattr_list_node_uuids_cbk(call_frame_t *frame, void *cookie,</div><div class='add'>+                                 xlator_t *this, int32_t op_ret,</div><div class='add'>+                                 int32_t op_errno, dict_t *dict, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-	afr_private_t * priv     = NULL;</div><div class='del'>-	afr_local_t *   local    = NULL;</div><div class='del'>-	xlator_t **     children = NULL;</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    int32_t callcnt = 0;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    char *xattr_serz = NULL;</div><div class='add'>+    long cky = 0;</div><div class='add'>+    int32_t tlen = 0;</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+    cky = (long)cookie;</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;frame-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        callcnt = --local-&gt;call_count;</div><div class='add'>+        local-&gt;replies[cky].valid = 1;</div><div class='add'>+        local-&gt;replies[cky].op_ret = op_ret;</div><div class='add'>+        local-&gt;replies[cky].op_errno = op_errno;</div><div class='add'>+</div><div class='add'>+        if (op_ret &lt; 0)</div><div class='add'>+            goto unlock;</div><div class='add'>+</div><div class='add'>+        local-&gt;op_ret = 0;</div><div class='add'>+</div><div class='add'>+        if (!local-&gt;xdata_rsp &amp;&amp; xdata)</div><div class='add'>+            local-&gt;xdata_rsp = dict_ref(xdata);</div><div class='add'>+        local-&gt;replies[cky].xattr = dict_ref(dict);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+unlock:</div><div class='add'>+    UNLOCK(&amp;frame-&gt;lock);</div><div class='add'>+</div><div class='add'>+    if (!callcnt) {</div><div class='add'>+        if (local-&gt;op_ret != 0) {</div><div class='add'>+            /* All bricks gave an error. */</div><div class='add'>+            local-&gt;op_errno = afr_final_errno(local, priv);</div><div class='add'>+            goto unwind;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-	int unwind     = 1;</div><div class='del'>-	int last_tried = -1;</div><div class='del'>-	int this_try = -1;</div><div class='del'>-        int read_child = -1;</div><div class='add'>+        /*Since we store the UUID0_STR as node uuid for down bricks and</div><div class='add'>+         *for non zero op_ret, assigning length to  priv-&gt;child_count</div><div class='add'>+         *number of uuids*/</div><div class='add'>+        local-&gt;cont.getxattr.xattr_len = (SLEN(UUID0_STR) + 2) *</div><div class='add'>+                                         priv-&gt;child_count;</div><div class='add'>+</div><div class='add'>+        if (!local-&gt;dict)</div><div class='add'>+            local-&gt;dict = dict_new();</div><div class='add'>+        if (!local-&gt;dict) {</div><div class='add'>+            local-&gt;op_ret = -1;</div><div class='add'>+            local-&gt;op_errno = ENOMEM;</div><div class='add'>+            goto unwind;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-	priv     = this-&gt;private;</div><div class='del'>-	children = priv-&gt;children;</div><div class='add'>+        xattr_serz = GF_CALLOC(local-&gt;cont.getxattr.xattr_len, sizeof(char),</div><div class='add'>+                               gf_common_mt_char);</div><div class='ctx'> </div><div class='del'>-	local = frame-&gt;local;</div><div class='add'>+        if (!xattr_serz) {</div><div class='add'>+            local-&gt;op_ret = -1;</div><div class='add'>+            local-&gt;op_errno = ENOMEM;</div><div class='add'>+            goto unwind;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-        read_child = (long) cookie;</div><div class='add'>+        ret = afr_serialize_xattrs_with_delimiter(frame, this, xattr_serz,</div><div class='add'>+                                                  UUID0_STR, &amp;tlen, ' ');</div><div class='add'>+        if (ret) {</div><div class='add'>+            local-&gt;op_ret = -1;</div><div class='add'>+            local-&gt;op_errno = ENOMEM;</div><div class='add'>+            GF_FREE(xattr_serz);</div><div class='add'>+            goto unwind;</div><div class='add'>+        }</div><div class='add'>+        ret = dict_set_dynstr_sizen(local-&gt;dict, GF_XATTR_LIST_NODE_UUIDS_KEY,</div><div class='add'>+                                    xattr_serz);</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, -ret, AFR_MSG_DICT_SET_FAILED,</div><div class='add'>+                   "Cannot set node_uuid key in dict");</div><div class='add'>+            local-&gt;op_ret = -1;</div><div class='add'>+            local-&gt;op_errno = ENOMEM;</div><div class='add'>+            if (ret == -EINVAL)</div><div class='add'>+                GF_FREE(xattr_serz);</div><div class='add'>+        } else {</div><div class='add'>+            local-&gt;op_ret = local-&gt;cont.getxattr.xattr_len - 1;</div><div class='add'>+            local-&gt;op_errno = 0;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-	if (op_ret == -1) {</div><div class='del'>-        retry:</div><div class='del'>-		last_tried = local-&gt;cont.readlink.last_tried;</div><div class='add'>+    unwind:</div><div class='add'>+        AFR_STACK_UNWIND(getxattr, frame, local-&gt;op_ret, local-&gt;op_errno,</div><div class='add'>+                         local-&gt;dict, local-&gt;xdata_rsp);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-		if (all_tried (last_tried, priv-&gt;child_count)) {</div><div class='del'>-			goto out;</div><div class='del'>-		}</div><div class='del'>-		this_try = ++local-&gt;cont.readlink.last_tried;</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-                if (this_try == read_child) {</div><div class='del'>-                        goto retry;</div><div class='del'>-                }</div><div class='add'>+int32_t</div><div class='add'>+afr_getxattr_quota_size_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                            int32_t op_ret, int32_t op_errno, dict_t *dict,</div><div class='add'>+                            dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    int idx = (long)cookie;</div><div class='add'>+    int call_count = 0;</div><div class='add'>+    afr_local_t *local = frame-&gt;local;</div><div class='add'>+    int read_subvol = -1;</div><div class='add'>+</div><div class='add'>+    local-&gt;replies[idx].valid = 1;</div><div class='add'>+    local-&gt;replies[idx].op_ret = op_ret;</div><div class='add'>+    local-&gt;replies[idx].op_errno = op_errno;</div><div class='add'>+    if (dict)</div><div class='add'>+        local-&gt;replies[idx].xdata = dict_ref(dict);</div><div class='add'>+    call_count = afr_frame_return(frame);</div><div class='add'>+    if (call_count == 0) {</div><div class='add'>+        local-&gt;inode = inode_ref(local-&gt;loc.inode);</div><div class='add'>+        read_subvol = afr_handle_quota_size(frame, this);</div><div class='add'>+        if (read_subvol != -1) {</div><div class='add'>+            op_ret = local-&gt;replies[read_subvol].op_ret;</div><div class='add'>+            op_errno = local-&gt;replies[read_subvol].op_errno;</div><div class='add'>+            dict = local-&gt;replies[read_subvol].xdata;</div><div class='add'>+        }</div><div class='add'>+        AFR_STACK_UNWIND(getxattr, frame, op_ret, op_errno, dict, xdata);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-		unwind = 0;</div><div class='del'>-		STACK_WIND_COOKIE (frame, afr_readlink_cbk,</div><div class='del'>-				   (void *) (long) read_child,</div><div class='del'>-				   children[this_try],</div><div class='del'>-				   children[this_try]-&gt;fops-&gt;readlink,</div><div class='del'>-				   &amp;local-&gt;loc,</div><div class='del'>-				   local-&gt;cont.readlink.size);</div><div class='del'>-	}</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-out:</div><div class='del'>-	if (unwind) {</div><div class='del'>-                if (sbuf)</div><div class='del'>-                        sbuf-&gt;ia_ino = local-&gt;cont.readlink.ino;</div><div class='add'>+int32_t</div><div class='add'>+afr_getxattr_lockinfo_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                          int32_t op_ret, int32_t op_errno, dict_t *dict,</div><div class='add'>+                          dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    int call_cnt = 0, len = 0;</div><div class='add'>+    char *lockinfo_buf = NULL;</div><div class='add'>+    dict_t *lockinfo = NULL, *newdict = NULL;</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='ctx'> </div><div class='del'>-		AFR_STACK_UNWIND (readlink, frame, op_ret, op_errno, buf, sbuf);</div><div class='del'>-	}</div><div class='add'>+    LOCK(&amp;frame-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        local = frame-&gt;local;</div><div class='ctx'> </div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='add'>+        call_cnt = --local-&gt;call_count;</div><div class='ctx'> </div><div class='add'>+        if ((op_ret &lt; 0) || (!dict &amp;&amp; !xdata)) {</div><div class='add'>+            goto unlock;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-int32_t</div><div class='del'>-afr_readlink (call_frame_t *frame, xlator_t *this,</div><div class='del'>-	      loc_t *loc, size_t size)</div><div class='del'>-{</div><div class='del'>-	afr_private_t * priv       = NULL;</div><div class='del'>-	xlator_t **     children   = NULL;</div><div class='del'>-	int             call_child = 0;</div><div class='del'>-	afr_local_t     *local     = NULL;</div><div class='add'>+        if (xdata) {</div><div class='add'>+            if (!local-&gt;xdata_rsp) {</div><div class='add'>+                local-&gt;xdata_rsp = dict_new();</div><div class='add'>+                if (!local-&gt;xdata_rsp) {</div><div class='add'>+                    local-&gt;op_ret = -1;</div><div class='add'>+                    local-&gt;op_errno = ENOMEM;</div><div class='add'>+                    goto unlock;</div><div class='add'>+                }</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        if (!dict) {</div><div class='add'>+            goto unlock;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        op_ret = dict_get_ptr_and_len(dict, GF_XATTR_LOCKINFO_KEY,</div><div class='add'>+                                      (void **)&amp;lockinfo_buf, &amp;len);</div><div class='ctx'> </div><div class='del'>-        int32_t         read_child = -1;</div><div class='add'>+        if (!lockinfo_buf) {</div><div class='add'>+            goto unlock;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-	int32_t op_ret   = -1;</div><div class='del'>-	int32_t op_errno = 0;</div><div class='add'>+        if (!local-&gt;dict) {</div><div class='add'>+            local-&gt;dict = dict_new();</div><div class='add'>+            if (!local-&gt;dict) {</div><div class='add'>+                local-&gt;op_ret = -1;</div><div class='add'>+                local-&gt;op_errno = ENOMEM;</div><div class='add'>+                goto unlock;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+unlock:</div><div class='add'>+    UNLOCK(&amp;frame-&gt;lock);</div><div class='add'>+</div><div class='add'>+    if (lockinfo_buf != NULL) {</div><div class='add'>+        lockinfo = dict_new();</div><div class='add'>+        if (lockinfo == NULL) {</div><div class='add'>+            local-&gt;op_ret = -1;</div><div class='add'>+            local-&gt;op_errno = ENOMEM;</div><div class='add'>+        } else {</div><div class='add'>+            op_ret = dict_unserialize(lockinfo_buf, len, &amp;lockinfo);</div><div class='ctx'> </div><div class='del'>-	VALIDATE_OR_GOTO (frame, out);</div><div class='del'>-	VALIDATE_OR_GOTO (this, out);</div><div class='del'>-	VALIDATE_OR_GOTO (this-&gt;private, out);</div><div class='add'>+            if (lockinfo &amp;&amp; local-&gt;dict) {</div><div class='add'>+                dict_copy(lockinfo, local-&gt;dict);</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (xdata &amp;&amp; local-&gt;xdata_rsp) {</div><div class='add'>+        dict_copy(xdata, local-&gt;xdata_rsp);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (!call_cnt) {</div><div class='add'>+        newdict = dict_new();</div><div class='add'>+        if (!newdict) {</div><div class='add'>+            local-&gt;op_ret = -1;</div><div class='add'>+            local-&gt;op_errno = ENOMEM;</div><div class='add'>+            goto unwind;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-	priv     = this-&gt;private;</div><div class='del'>-	VALIDATE_OR_GOTO (priv-&gt;children, out);</div><div class='add'>+        op_ret = dict_allocate_and_serialize(</div><div class='add'>+            local-&gt;dict, (char **)&amp;lockinfo_buf, (unsigned int *)&amp;len);</div><div class='add'>+        if (op_ret != 0) {</div><div class='add'>+            local-&gt;op_ret = -1;</div><div class='add'>+            goto unwind;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-	children = priv-&gt;children;</div><div class='add'>+        op_ret = dict_set_dynptr(newdict, GF_XATTR_LOCKINFO_KEY,</div><div class='add'>+                                 (void *)lockinfo_buf, len);</div><div class='add'>+        if (op_ret &lt; 0) {</div><div class='add'>+            local-&gt;op_ret = -1;</div><div class='add'>+            local-&gt;op_errno = -op_ret;</div><div class='add'>+            goto unwind;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-	ALLOC_OR_GOTO (local, afr_local_t, out);</div><div class='add'>+    unwind:</div><div class='add'>+        AFR_STACK_UNWIND(getxattr, frame, op_ret, op_errno, newdict,</div><div class='add'>+                         local-&gt;xdata_rsp);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	frame-&gt;local = local;</div><div class='add'>+    dict_unref(lockinfo);</div><div class='ctx'> </div><div class='del'>-        read_child = afr_read_child (this, loc-&gt;inode);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        if (read_child &gt;= 0) {</div><div class='del'>-                call_child = read_child;</div><div class='add'>+int32_t</div><div class='add'>+afr_fgetxattr_lockinfo_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                           int32_t op_ret, int32_t op_errno, dict_t *dict,</div><div class='add'>+                           dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    int call_cnt = 0, len = 0;</div><div class='add'>+    char *lockinfo_buf = NULL;</div><div class='add'>+    dict_t *lockinfo = NULL, *newdict = NULL;</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='ctx'> </div><div class='del'>-                local-&gt;cont.readlink.last_tried = -1;</div><div class='add'>+    LOCK(&amp;frame-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        local = frame-&gt;local;</div><div class='ctx'> </div><div class='del'>-        } else {</div><div class='del'>-                call_child = afr_first_up_child (priv);</div><div class='add'>+        call_cnt = --local-&gt;call_count;</div><div class='ctx'> </div><div class='del'>-                if (call_child == -1) {</div><div class='del'>-                        op_errno = ENOTCONN;</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-                                "no child is up");</div><div class='del'>-                        goto out;</div><div class='add'>+        if ((op_ret &lt; 0) || (!dict &amp;&amp; !xdata)) {</div><div class='add'>+            goto unlock;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        if (xdata) {</div><div class='add'>+            if (!local-&gt;xdata_rsp) {</div><div class='add'>+                local-&gt;xdata_rsp = dict_new();</div><div class='add'>+                if (!local-&gt;xdata_rsp) {</div><div class='add'>+                    local-&gt;op_ret = -1;</div><div class='add'>+                    local-&gt;op_errno = ENOMEM;</div><div class='add'>+                    goto unlock;</div><div class='ctx'>                 }</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-                local-&gt;cont.readlink.last_tried = call_child;</div><div class='add'>+        if (!dict) {</div><div class='add'>+            goto unlock;</div><div class='ctx'>         }</div><div class='ctx'> </div><div class='del'>-	loc_copy (&amp;local-&gt;loc, loc);</div><div class='add'>+        op_ret = dict_get_ptr_and_len(dict, GF_XATTR_LOCKINFO_KEY,</div><div class='add'>+                                      (void **)&amp;lockinfo_buf, &amp;len);</div><div class='ctx'> </div><div class='del'>-	local-&gt;cont.readlink.size       = size;</div><div class='del'>-        local-&gt;cont.readlink.ino        = loc-&gt;inode-&gt;ino;</div><div class='add'>+        if (!lockinfo_buf) {</div><div class='add'>+            goto unlock;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-	STACK_WIND_COOKIE (frame, afr_readlink_cbk,</div><div class='del'>-			   (void *) (long) call_child,</div><div class='del'>-			   children[call_child], children[call_child]-&gt;fops-&gt;readlink,</div><div class='del'>-			   loc, size);</div><div class='add'>+        if (!local-&gt;dict) {</div><div class='add'>+            local-&gt;dict = dict_new();</div><div class='add'>+            if (!local-&gt;dict) {</div><div class='add'>+                local-&gt;op_ret = -1;</div><div class='add'>+                local-&gt;op_errno = ENOMEM;</div><div class='add'>+                goto unlock;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+unlock:</div><div class='add'>+    UNLOCK(&amp;frame-&gt;lock);</div><div class='add'>+</div><div class='add'>+    if (lockinfo_buf != NULL) {</div><div class='add'>+        lockinfo = dict_new();</div><div class='add'>+        if (lockinfo == NULL) {</div><div class='add'>+            local-&gt;op_ret = -1;</div><div class='add'>+            local-&gt;op_errno = ENOMEM;</div><div class='add'>+        } else {</div><div class='add'>+            op_ret = dict_unserialize(lockinfo_buf, len, &amp;lockinfo);</div><div class='ctx'> </div><div class='del'>-	op_ret = 0;</div><div class='del'>-out:</div><div class='del'>-	if (op_ret == -1) {</div><div class='del'>-		AFR_STACK_UNWIND (readlink, frame, op_ret, op_errno, NULL, NULL);</div><div class='del'>-	}</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='add'>+            if (lockinfo &amp;&amp; local-&gt;dict) {</div><div class='add'>+                dict_copy(lockinfo, local-&gt;dict);</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (xdata &amp;&amp; local-&gt;xdata_rsp) {</div><div class='add'>+        dict_copy(xdata, local-&gt;xdata_rsp);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (!call_cnt) {</div><div class='add'>+        newdict = dict_new();</div><div class='add'>+        if (!newdict) {</div><div class='add'>+            local-&gt;op_ret = -1;</div><div class='add'>+            local-&gt;op_errno = ENOMEM;</div><div class='add'>+            goto unwind;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='add'>+        op_ret = dict_allocate_and_serialize(</div><div class='add'>+            local-&gt;dict, (char **)&amp;lockinfo_buf, (unsigned int *)&amp;len);</div><div class='add'>+        if (op_ret != 0) {</div><div class='add'>+            local-&gt;op_ret = -1;</div><div class='add'>+            goto unwind;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-/* }}} */</div><div class='add'>+        op_ret = dict_set_dynptr(newdict, GF_XATTR_LOCKINFO_KEY,</div><div class='add'>+                                 (void *)lockinfo_buf, len);</div><div class='add'>+        if (op_ret &lt; 0) {</div><div class='add'>+            local-&gt;op_ret = -1;</div><div class='add'>+            local-&gt;op_errno = -op_ret;</div><div class='add'>+            goto unwind;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-/* {{{ getxattr */</div><div class='add'>+    unwind:</div><div class='add'>+        AFR_STACK_UNWIND(fgetxattr, frame, op_ret, op_errno, newdict,</div><div class='add'>+                         local-&gt;xdata_rsp);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-struct _xattr_key {</div><div class='del'>-        char *key;</div><div class='del'>-        struct list_head list;</div><div class='del'>-};</div><div class='add'>+    dict_unref(lockinfo);</div><div class='ctx'> </div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-void</div><div class='del'>-__gather_xattr_keys (dict_t *dict, char *key, data_t *value,</div><div class='del'>-                     void *data)</div><div class='add'>+int32_t</div><div class='add'>+afr_fgetxattr_pathinfo_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                           int32_t op_ret, int32_t op_errno, dict_t *dict,</div><div class='add'>+                           dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-        struct list_head *  list  = data;</div><div class='del'>-        struct _xattr_key * xkey  = NULL;</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    int32_t callcnt = 0;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    char *xattr = NULL;</div><div class='add'>+    char *xattr_serz = NULL;</div><div class='add'>+    int keylen = 0;</div><div class='add'>+    char xattr_cky[1024] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int xattr_cky_len = 0;</div><div class='add'>+    dict_t *nxattr = NULL;</div><div class='add'>+    long cky = 0;</div><div class='add'>+    int32_t padding = 0;</div><div class='add'>+    int32_t tlen = 0;</div><div class='add'>+</div><div class='add'>+    if (!frame || !frame-&gt;local || !this) {</div><div class='add'>+        gf_msg("", GF_LOG_ERROR, 0, AFR_MSG_INVALID_ARG, "possible NULL deref");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    cky = (long)cookie;</div><div class='add'>+    keylen = strlen(local-&gt;cont.getxattr.name);</div><div class='add'>+    xattr_cky_len = snprintf(xattr_cky, sizeof(xattr_cky), "%s-%ld",</div><div class='add'>+                             local-&gt;cont.getxattr.name, cky);</div><div class='add'>+    LOCK(&amp;frame-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        callcnt = --local-&gt;call_count;</div><div class='add'>+</div><div class='add'>+        if (op_ret &lt; 0) {</div><div class='add'>+            local-&gt;op_errno = op_errno;</div><div class='add'>+        } else {</div><div class='add'>+            local-&gt;op_ret = op_ret;</div><div class='add'>+            if (!local-&gt;xdata_rsp &amp;&amp; xdata)</div><div class='add'>+                local-&gt;xdata_rsp = dict_ref(xdata);</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-        if (!strncmp (key, AFR_XATTR_PREFIX,</div><div class='del'>-                      strlen (AFR_XATTR_PREFIX))) {</div><div class='add'>+        if (!dict || (op_ret &lt; 0))</div><div class='add'>+            goto unlock;</div><div class='ctx'> </div><div class='del'>-                xkey = GF_CALLOC (1, sizeof (*xkey), gf_afr_mt_xattr_key);</div><div class='del'>-                if (!xkey)</div><div class='del'>-                        return;</div><div class='add'>+        if (!local-&gt;dict) {</div><div class='add'>+            local-&gt;dict = dict_new();</div><div class='add'>+            if (!local-&gt;dict)</div><div class='add'>+                goto unlock;</div><div class='add'>+        }</div><div class='add'>+        ret = dict_get_strn(dict, local-&gt;cont.getxattr.name, keylen, &amp;xattr);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto unlock;</div><div class='add'>+</div><div class='add'>+        xattr = gf_strdup(xattr);</div><div class='add'>+</div><div class='add'>+        ret = dict_set_dynstrn(local-&gt;dict, xattr_cky, xattr_cky_len, xattr);</div><div class='add'>+        if (ret) {</div><div class='add'>+            UNLOCK(&amp;frame-&gt;lock);</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, -ret, AFR_MSG_DICT_SET_FAILED,</div><div class='add'>+                   "Cannot set xattr cookie key");</div><div class='add'>+            goto post_unlock;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-                xkey-&gt;key = key;</div><div class='del'>-                INIT_LIST_HEAD (&amp;xkey-&gt;list);</div><div class='add'>+        local-&gt;cont.getxattr.xattr_len += strlen(xattr) + 1;</div><div class='add'>+    }</div><div class='add'>+unlock:</div><div class='add'>+    UNLOCK(&amp;frame-&gt;lock);</div><div class='add'>+post_unlock:</div><div class='add'>+    if (!callcnt) {</div><div class='add'>+        if (!local-&gt;cont.getxattr.xattr_len)</div><div class='add'>+            goto unwind;</div><div class='add'>+</div><div class='add'>+        nxattr = dict_new();</div><div class='add'>+        if (!nxattr)</div><div class='add'>+            goto unwind;</div><div class='add'>+</div><div class='add'>+        /* extra bytes for decorations (brackets and &lt;&gt;'s) */</div><div class='add'>+        padding += strlen(this-&gt;name) + SLEN(AFR_PATHINFO_HEADER) + 4;</div><div class='add'>+        local-&gt;cont.getxattr.xattr_len += (padding + 2);</div><div class='add'>+</div><div class='add'>+        xattr_serz = GF_MALLOC(local-&gt;cont.getxattr.xattr_len,</div><div class='add'>+                               gf_common_mt_char);</div><div class='add'>+</div><div class='add'>+        if (!xattr_serz)</div><div class='add'>+            goto unwind;</div><div class='add'>+</div><div class='add'>+        /* the xlator info */</div><div class='add'>+        int xattr_serz_len = sprintf(</div><div class='add'>+            xattr_serz, "(&lt;" AFR_PATHINFO_HEADER "%s&gt; ", this-&gt;name);</div><div class='add'>+</div><div class='add'>+        /* actual series of pathinfo */</div><div class='add'>+        ret = dict_serialize_value_with_delim(</div><div class='add'>+            local-&gt;dict, xattr_serz + xattr_serz_len, &amp;tlen, ' ');</div><div class='add'>+        if (ret) {</div><div class='add'>+            GF_FREE(xattr_serz);</div><div class='add'>+            goto unwind;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-                list_add_tail (&amp;xkey-&gt;list, list);</div><div class='add'>+        /* closing part */</div><div class='add'>+        *(xattr_serz + padding + tlen) = ')';</div><div class='add'>+        *(xattr_serz + padding + tlen + 1) = '\0';</div><div class='add'>+</div><div class='add'>+        ret = dict_set_dynstrn(nxattr, local-&gt;cont.getxattr.name, keylen,</div><div class='add'>+                               xattr_serz);</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, -ret, AFR_MSG_DICT_SET_FAILED,</div><div class='add'>+                   "Cannot set pathinfo key in dict");</div><div class='add'>+            if (ret == -EINVAL)</div><div class='add'>+                GF_FREE(xattr_serz);</div><div class='ctx'>         }</div><div class='del'>-}</div><div class='ctx'> </div><div class='add'>+    unwind:</div><div class='add'>+        AFR_STACK_UNWIND(fgetxattr, frame, local-&gt;op_ret, local-&gt;op_errno,</div><div class='add'>+                         nxattr, local-&gt;xdata_rsp);</div><div class='ctx'> </div><div class='del'>-void</div><div class='del'>-__filter_xattrs (dict_t *dict)</div><div class='del'>-{</div><div class='del'>-        struct list_head keys;</div><div class='add'>+        if (nxattr)</div><div class='add'>+            dict_unref(nxattr);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        struct _xattr_key *key;</div><div class='del'>-        struct _xattr_key *tmp;</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        INIT_LIST_HEAD (&amp;keys);</div><div class='add'>+int32_t</div><div class='add'>+afr_getxattr_pathinfo_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                          int32_t op_ret, int32_t op_errno, dict_t *dict,</div><div class='add'>+                          dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    int32_t callcnt = 0;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    char *xattr = NULL;</div><div class='add'>+    char *xattr_serz = NULL;</div><div class='add'>+    char xattr_cky[1024] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int keylen = 0;</div><div class='add'>+    int xattr_cky_len = 0;</div><div class='add'>+    dict_t *nxattr = NULL;</div><div class='add'>+    long cky = 0;</div><div class='add'>+    int32_t padding = 0;</div><div class='add'>+    int32_t tlen = 0;</div><div class='add'>+</div><div class='add'>+    if (!frame || !frame-&gt;local || !this) {</div><div class='add'>+        gf_msg("", GF_LOG_ERROR, 0, AFR_MSG_INVALID_ARG, "possible NULL deref");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    cky = (long)cookie;</div><div class='add'>+    keylen = strlen(local-&gt;cont.getxattr.name);</div><div class='add'>+    xattr_cky_len = snprintf(xattr_cky, sizeof(xattr_cky), "%s-%ld",</div><div class='add'>+                             local-&gt;cont.getxattr.name, cky);</div><div class='add'>+    LOCK(&amp;frame-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        callcnt = --local-&gt;call_count;</div><div class='add'>+</div><div class='add'>+        if (op_ret &lt; 0) {</div><div class='add'>+            local-&gt;op_errno = op_errno;</div><div class='add'>+        } else {</div><div class='add'>+            local-&gt;op_ret = op_ret;</div><div class='add'>+            if (!local-&gt;xdata_rsp &amp;&amp; xdata)</div><div class='add'>+                local-&gt;xdata_rsp = dict_ref(xdata);</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-        dict_foreach (dict, __gather_xattr_keys,</div><div class='del'>-                      (void *) &amp;keys);</div><div class='add'>+        if (!dict || (op_ret &lt; 0))</div><div class='add'>+            goto unlock;</div><div class='ctx'> </div><div class='del'>-        list_for_each_entry_safe (key, tmp, &amp;keys, list) {</div><div class='del'>-                dict_del (dict, key-&gt;key);</div><div class='add'>+        if (!local-&gt;dict) {</div><div class='add'>+            local-&gt;dict = dict_new();</div><div class='add'>+            if (!local-&gt;dict)</div><div class='add'>+                goto unlock;</div><div class='add'>+        }</div><div class='add'>+        ret = dict_get_strn(dict, local-&gt;cont.getxattr.name, keylen, &amp;xattr);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto unlock;</div><div class='add'>+</div><div class='add'>+        xattr = gf_strdup(xattr);</div><div class='add'>+</div><div class='add'>+        ret = dict_set_dynstrn(local-&gt;dict, xattr_cky, xattr_cky_len, xattr);</div><div class='add'>+        if (ret) {</div><div class='add'>+            UNLOCK(&amp;frame-&gt;lock);</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, -ret, AFR_MSG_DICT_SET_FAILED,</div><div class='add'>+                   "Cannot set xattr cookie key");</div><div class='add'>+            goto post_unlock;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-                list_del_init (&amp;key-&gt;list);</div><div class='add'>+        local-&gt;cont.getxattr.xattr_len += strlen(xattr) + 1;</div><div class='add'>+    }</div><div class='add'>+unlock:</div><div class='add'>+    UNLOCK(&amp;frame-&gt;lock);</div><div class='add'>+post_unlock:</div><div class='add'>+    if (!callcnt) {</div><div class='add'>+        if (!local-&gt;cont.getxattr.xattr_len)</div><div class='add'>+            goto unwind;</div><div class='add'>+</div><div class='add'>+        nxattr = dict_new();</div><div class='add'>+        if (!nxattr)</div><div class='add'>+            goto unwind;</div><div class='add'>+</div><div class='add'>+        /* extra bytes for decorations (brackets and &lt;&gt;'s) */</div><div class='add'>+        padding += strlen(this-&gt;name) + SLEN(AFR_PATHINFO_HEADER) + 4;</div><div class='add'>+        local-&gt;cont.getxattr.xattr_len += (padding + 2);</div><div class='add'>+</div><div class='add'>+        xattr_serz = GF_MALLOC(local-&gt;cont.getxattr.xattr_len,</div><div class='add'>+                               gf_common_mt_char);</div><div class='add'>+</div><div class='add'>+        if (!xattr_serz)</div><div class='add'>+            goto unwind;</div><div class='add'>+</div><div class='add'>+        /* the xlator info */</div><div class='add'>+        int xattr_serz_len = sprintf(</div><div class='add'>+            xattr_serz, "(&lt;" AFR_PATHINFO_HEADER "%s&gt; ", this-&gt;name);</div><div class='add'>+</div><div class='add'>+        /* actual series of pathinfo */</div><div class='add'>+        ret = dict_serialize_value_with_delim(</div><div class='add'>+            local-&gt;dict, xattr_serz + xattr_serz_len, &amp;tlen, ' ');</div><div class='add'>+        if (ret) {</div><div class='add'>+            GF_FREE(xattr_serz);</div><div class='add'>+            goto unwind;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-                GF_FREE (key);</div><div class='add'>+        /* closing part */</div><div class='add'>+        *(xattr_serz + padding + tlen) = ')';</div><div class='add'>+        *(xattr_serz + padding + tlen + 1) = '\0';</div><div class='add'>+</div><div class='add'>+        ret = dict_set_dynstrn(nxattr, local-&gt;cont.getxattr.name, keylen,</div><div class='add'>+                               xattr_serz);</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, -ret, AFR_MSG_DICT_SET_FAILED,</div><div class='add'>+                   "Cannot set pathinfo key in dict");</div><div class='add'>+            if (ret == -EINVAL)</div><div class='add'>+                GF_FREE(xattr_serz);</div><div class='ctx'>         }</div><div class='add'>+</div><div class='add'>+    unwind:</div><div class='add'>+        AFR_STACK_UNWIND(getxattr, frame, local-&gt;op_ret, local-&gt;op_errno,</div><div class='add'>+                         nxattr, local-&gt;xdata_rsp);</div><div class='add'>+</div><div class='add'>+        if (nxattr)</div><div class='add'>+            dict_unref(nxattr);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+static int</div><div class='add'>+afr_aggregate_stime_xattr(dict_t *this, char *key, data_t *value, void *data)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    if (fnmatch(GF_XATTR_STIME_PATTERN, key, FNM_NOESCAPE) == 0)</div><div class='add'>+        ret = gf_get_max_stime(THIS, data, key, value);</div><div class='ctx'> </div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int32_t</div><div class='del'>-afr_getxattr_cbk (call_frame_t *frame, void *cookie,</div><div class='del'>-		  xlator_t *this, int32_t op_ret, int32_t op_errno,</div><div class='del'>-		  dict_t *dict)</div><div class='add'>+afr_common_getxattr_stime_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                              int32_t op_ret, int32_t op_errno, dict_t *dict,</div><div class='add'>+                              dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-	afr_private_t * priv     = NULL;</div><div class='del'>-	afr_local_t *   local    = NULL;</div><div class='del'>-	xlator_t **     children = NULL;</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    int32_t callcnt = 0;</div><div class='ctx'> </div><div class='del'>-	int unwind     = 1;</div><div class='del'>-	int last_tried = -1;</div><div class='del'>-	int this_try = -1;</div><div class='del'>-        int read_child = -1;</div><div class='add'>+    if (!frame || !frame-&gt;local || !this) {</div><div class='add'>+        gf_msg("", GF_LOG_ERROR, 0, AFR_MSG_INVALID_ARG, "possible NULL deref");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	priv     = this-&gt;private;</div><div class='del'>-	children = priv-&gt;children;</div><div class='add'>+    local = frame-&gt;local;</div><div class='ctx'> </div><div class='del'>-	local = frame-&gt;local;</div><div class='add'>+    LOCK(&amp;frame-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        callcnt = --local-&gt;call_count;</div><div class='ctx'> </div><div class='del'>-        read_child = (long) cookie;</div><div class='del'>-</div><div class='del'>-	if (op_ret == -1) {</div><div class='del'>-        retry:</div><div class='del'>-		last_tried = local-&gt;cont.getxattr.last_tried;</div><div class='add'>+        if (!dict || (op_ret &lt; 0)) {</div><div class='add'>+            local-&gt;op_errno = op_errno;</div><div class='add'>+            goto cleanup;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-		if (all_tried (last_tried, priv-&gt;child_count)) {</div><div class='del'>-			goto out;</div><div class='del'>-		}</div><div class='del'>-		this_try = ++local-&gt;cont.getxattr.last_tried;</div><div class='add'>+        if (!local-&gt;dict)</div><div class='add'>+            local-&gt;dict = dict_copy_with_ref(dict, NULL);</div><div class='add'>+        else</div><div class='add'>+            dict_foreach(dict, afr_aggregate_stime_xattr, local-&gt;dict);</div><div class='add'>+        local-&gt;op_ret = 0;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-                if (this_try == read_child) {</div><div class='del'>-                        goto retry;</div><div class='del'>-                }</div><div class='add'>+cleanup:</div><div class='add'>+    UNLOCK(&amp;frame-&gt;lock);</div><div class='ctx'> </div><div class='del'>-		unwind = 0;</div><div class='del'>-		STACK_WIND_COOKIE (frame, afr_getxattr_cbk,</div><div class='del'>-				   (void *) (long) read_child,</div><div class='del'>-				   children[this_try],</div><div class='del'>-				   children[this_try]-&gt;fops-&gt;getxattr,</div><div class='del'>-				   &amp;local-&gt;loc,</div><div class='del'>-				   local-&gt;cont.getxattr.name);</div><div class='del'>-	}</div><div class='add'>+    if (!callcnt) {</div><div class='add'>+        AFR_STACK_UNWIND(getxattr, frame, local-&gt;op_ret, local-&gt;op_errno,</div><div class='add'>+                         local-&gt;dict, xdata);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='ctx'> out:</div><div class='del'>-	if (unwind) {</div><div class='del'>-                if (op_ret &gt;= 0 &amp;&amp; dict)</div><div class='del'>-                        __filter_xattrs (dict);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-		AFR_STACK_UNWIND (getxattr, frame, op_ret, op_errno, dict);</div><div class='del'>-	}</div><div class='add'>+static gf_boolean_t</div><div class='add'>+afr_is_special_xattr(const char *name, fop_getxattr_cbk_t *cbk,</div><div class='add'>+                     gf_boolean_t is_fgetxattr)</div><div class='add'>+{</div><div class='add'>+    gf_boolean_t is_spl = _gf_true;</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(cbk);</div><div class='add'>+    if (!cbk || !name) {</div><div class='add'>+        is_spl = _gf_false;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (!strcmp(name, GF_XATTR_PATHINFO_KEY) ||</div><div class='add'>+        !strcmp(name, GF_XATTR_USER_PATHINFO_KEY)) {</div><div class='add'>+        if (is_fgetxattr) {</div><div class='add'>+            *cbk = afr_fgetxattr_pathinfo_cbk;</div><div class='add'>+        } else {</div><div class='add'>+            *cbk = afr_getxattr_pathinfo_cbk;</div><div class='add'>+        }</div><div class='add'>+    } else if (!strncmp(name, GF_XATTR_CLRLK_CMD, SLEN(GF_XATTR_CLRLK_CMD))) {</div><div class='add'>+        if (is_fgetxattr) {</div><div class='add'>+            *cbk = afr_fgetxattr_clrlk_cbk;</div><div class='add'>+        } else {</div><div class='add'>+            *cbk = afr_getxattr_clrlk_cbk;</div><div class='add'>+        }</div><div class='add'>+    } else if (!strncmp(name, GF_XATTR_LOCKINFO_KEY,</div><div class='add'>+                        SLEN(GF_XATTR_LOCKINFO_KEY))) {</div><div class='add'>+        if (is_fgetxattr) {</div><div class='add'>+            *cbk = afr_fgetxattr_lockinfo_cbk;</div><div class='add'>+        } else {</div><div class='add'>+            *cbk = afr_getxattr_lockinfo_cbk;</div><div class='add'>+        }</div><div class='add'>+    } else if (fnmatch(GF_XATTR_STIME_PATTERN, name, FNM_NOESCAPE) == 0) {</div><div class='add'>+        *cbk = afr_common_getxattr_stime_cbk;</div><div class='add'>+    } else if (strcmp(name, QUOTA_SIZE_KEY) == 0) {</div><div class='add'>+        *cbk = afr_getxattr_quota_size_cbk;</div><div class='add'>+    } else if (!strcmp(name, GF_XATTR_LIST_NODE_UUIDS_KEY)) {</div><div class='add'>+        *cbk = afr_getxattr_list_node_uuids_cbk;</div><div class='add'>+    } else {</div><div class='add'>+        is_spl = _gf_false;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	return 0;</div><div class='add'>+out:</div><div class='add'>+    return is_spl;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-int32_t</div><div class='del'>-afr_getxattr (call_frame_t *frame, xlator_t *this,</div><div class='del'>-	      loc_t *loc, const char *name)</div><div class='add'>+static void</div><div class='add'>+afr_getxattr_all_subvols(xlator_t *this, call_frame_t *frame, const char *name,</div><div class='add'>+                         loc_t *loc, fop_getxattr_cbk_t cbk)</div><div class='ctx'> {</div><div class='del'>-	afr_private_t *   priv       = NULL;</div><div class='del'>-	xlator_t **       children   = NULL;</div><div class='del'>-	int               call_child = 0;</div><div class='del'>-	afr_local_t     * local      = NULL;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    int i = 0;</div><div class='add'>+    int call_count = 0;</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    // local-&gt;call_count set in afr_local_init</div><div class='add'>+    call_count = local-&gt;call_count;</div><div class='add'>+</div><div class='add'>+    if (!strcmp(name, GF_XATTR_LIST_NODE_UUIDS_KEY)) {</div><div class='add'>+        GF_FREE(local-&gt;cont.getxattr.name);</div><div class='add'>+        local-&gt;cont.getxattr.name = gf_strdup(GF_XATTR_NODE_UUID_KEY);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    // If up-children count is 0, afr_local_init would have failed already</div><div class='add'>+    // and the call would have unwound so not handling it here.</div><div class='add'>+    for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+        if (local-&gt;child_up[i]) {</div><div class='add'>+            STACK_WIND_COOKIE(frame, cbk, (void *)(long)i, priv-&gt;children[i],</div><div class='add'>+                              priv-&gt;children[i]-&gt;fops-&gt;getxattr, loc,</div><div class='add'>+                              local-&gt;cont.getxattr.name, NULL);</div><div class='add'>+            if (!--call_count)</div><div class='add'>+                break;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    return;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        int               read_child = -1;</div><div class='add'>+int</div><div class='add'>+afr_marker_populate_args(call_frame_t *frame, int type, int *gauge,</div><div class='add'>+                         xlator_t **subvols)</div><div class='add'>+{</div><div class='add'>+    xlator_t *this = frame-&gt;this;</div><div class='add'>+    afr_private_t *priv = this-&gt;private;</div><div class='ctx'> </div><div class='del'>-	int32_t op_ret   = -1;</div><div class='del'>-	int32_t op_errno = 0;</div><div class='add'>+    memcpy(subvols, priv-&gt;children, sizeof(*subvols) * priv-&gt;child_count);</div><div class='ctx'> </div><div class='add'>+    if (type == MARKER_XTIME_TYPE) {</div><div class='add'>+        /*Don't error out on ENOENT/ENOTCONN */</div><div class='add'>+        gauge[MCNT_NOTFOUND] = 0;</div><div class='add'>+        gauge[MCNT_ENOTCONN] = 0;</div><div class='add'>+    }</div><div class='add'>+    return priv-&gt;child_count;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	VALIDATE_OR_GOTO (frame, out);</div><div class='del'>-	VALIDATE_OR_GOTO (this, out);</div><div class='del'>-	VALIDATE_OR_GOTO (this-&gt;private, out);</div><div class='add'>+static int</div><div class='add'>+afr_handle_heal_xattrs(call_frame_t *frame, xlator_t *this, loc_t *loc,</div><div class='add'>+                       const char *heal_op)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    afr_spb_status_t *data = NULL;</div><div class='add'>+</div><div class='add'>+    if (!strcmp(heal_op, GF_HEAL_INFO)) {</div><div class='add'>+        afr_get_heal_info(frame, this, loc);</div><div class='add'>+        ret = 0;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (!strcmp(heal_op, GF_AFR_HEAL_SBRAIN)) {</div><div class='add'>+        afr_heal_splitbrain_file(frame, this, loc);</div><div class='add'>+        ret = 0;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (!strcmp(heal_op, GF_AFR_SBRAIN_STATUS)) {</div><div class='add'>+        data = GF_CALLOC(1, sizeof(*data), gf_afr_mt_spb_status_t);</div><div class='add'>+        if (!data) {</div><div class='add'>+            ret = 1;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+        data-&gt;frame = frame;</div><div class='add'>+        data-&gt;loc = loc;</div><div class='add'>+        ret = synctask_new(this-&gt;ctx-&gt;env, afr_get_split_brain_status,</div><div class='add'>+                           afr_get_split_brain_status_cbk, NULL, data);</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, 0, AFR_MSG_SPLIT_BRAIN_STATUS,</div><div class='add'>+                   "Failed to create"</div><div class='add'>+                   " synctask. Unable to fetch split-brain status"</div><div class='add'>+                   " for %s.",</div><div class='add'>+                   loc-&gt;name);</div><div class='add'>+            ret = 1;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	priv     = this-&gt;private;</div><div class='del'>-	VALIDATE_OR_GOTO (priv-&gt;children, out);</div><div class='add'>+out:</div><div class='add'>+    if (ret == 1) {</div><div class='add'>+        AFR_STACK_UNWIND(getxattr, frame, -1, ENOMEM, NULL, NULL);</div><div class='add'>+        if (data)</div><div class='add'>+            GF_FREE(data);</div><div class='add'>+        ret = 0;</div><div class='add'>+    }</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	children = priv-&gt;children;</div><div class='add'>+int32_t</div><div class='add'>+afr_getxattr(call_frame_t *frame, xlator_t *this, loc_t *loc, const char *name,</div><div class='add'>+             dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    xlator_t **children = NULL;</div><div class='add'>+    int i = 0;</div><div class='add'>+    int32_t op_errno = 0;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    fop_getxattr_cbk_t cbk = NULL;</div><div class='add'>+</div><div class='add'>+    local = AFR_FRAME_INIT(frame, op_errno);</div><div class='add'>+    if (!local)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    children = priv-&gt;children;</div><div class='add'>+</div><div class='add'>+    loc_copy(&amp;local-&gt;loc, loc);</div><div class='add'>+</div><div class='add'>+    local-&gt;op = GF_FOP_GETXATTR;</div><div class='add'>+</div><div class='add'>+    if (xdata)</div><div class='add'>+        local-&gt;xdata_req = dict_ref(xdata);</div><div class='add'>+</div><div class='add'>+    if (!name)</div><div class='add'>+        goto no_name;</div><div class='add'>+</div><div class='add'>+    local-&gt;cont.getxattr.name = gf_strdup(name);</div><div class='add'>+</div><div class='add'>+    if (!local-&gt;cont.getxattr.name) {</div><div class='add'>+        op_errno = ENOMEM;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (!strncmp(name, AFR_XATTR_PREFIX, SLEN(AFR_XATTR_PREFIX))) {</div><div class='add'>+        op_errno = ENODATA;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (cluster_handle_marker_getxattr(frame, loc, name, priv-&gt;vol_uuid,</div><div class='add'>+                                       afr_getxattr_unwind,</div><div class='add'>+                                       afr_marker_populate_args) == 0)</div><div class='add'>+        return 0;</div><div class='add'>+</div><div class='add'>+    ret = afr_handle_heal_xattrs(frame, this, &amp;local-&gt;loc, name);</div><div class='add'>+    if (ret == 0)</div><div class='add'>+        return 0;</div><div class='add'>+</div><div class='add'>+    /*</div><div class='add'>+     * Heal daemons don't have IO threads ... and as a result they</div><div class='add'>+     * send this getxattr down and eventually crash :(</div><div class='add'>+     */</div><div class='add'>+    op_errno = -1;</div><div class='add'>+    GF_CHECK_XATTR_KEY_AND_GOTO(name, IO_THREADS_QUEUE_SIZE_KEY, op_errno, out);</div><div class='add'>+</div><div class='add'>+    /*</div><div class='add'>+     * Special xattrs which need responses from all subvols</div><div class='add'>+     */</div><div class='add'>+    if (afr_is_special_xattr(name, &amp;cbk, 0)) {</div><div class='add'>+        afr_getxattr_all_subvols(this, frame, name, loc, cbk);</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (XATTR_IS_NODE_UUID(name)) {</div><div class='add'>+        i = 0;</div><div class='add'>+        STACK_WIND_COOKIE(frame, afr_getxattr_node_uuid_cbk, (void *)(long)i,</div><div class='add'>+                          children[i], children[i]-&gt;fops-&gt;getxattr, loc, name,</div><div class='add'>+                          xdata);</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+no_name:</div><div class='add'>+</div><div class='add'>+    afr_read_txn(frame, this, local-&gt;loc.inode, afr_getxattr_wind,</div><div class='add'>+                 AFR_METADATA_TRANSACTION);</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+out:</div><div class='add'>+    if (ret &lt; 0)</div><div class='add'>+        AFR_STACK_UNWIND(getxattr, frame, -1, op_errno, NULL, NULL);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	ALLOC_OR_GOTO (local, afr_local_t, out);</div><div class='del'>-	frame-&gt;local = local;</div><div class='add'>+/* {{{ fgetxattr */</div><div class='ctx'> </div><div class='del'>-        if (name) {</div><div class='del'>-                if (!strncmp (name, AFR_XATTR_PREFIX,</div><div class='del'>-                              strlen (AFR_XATTR_PREFIX))) {</div><div class='add'>+int32_t</div><div class='add'>+afr_fgetxattr_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                  int32_t op_ret, int32_t op_errno, dict_t *dict, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='ctx'> </div><div class='del'>-                        op_errno = ENODATA;</div><div class='del'>-                        goto out;</div><div class='del'>-                }</div><div class='add'>+    local = frame-&gt;local;</div><div class='ctx'> </div><div class='del'>-        }</div><div class='add'>+    if (op_ret &lt; 0) {</div><div class='add'>+        local-&gt;op_ret = -1;</div><div class='add'>+        local-&gt;op_errno = op_errno;</div><div class='ctx'> </div><div class='del'>-        read_child = afr_read_child (this, loc-&gt;inode);</div><div class='add'>+        afr_read_txn_continue(frame, this, (long)cookie);</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        if (read_child &gt;= 0) {</div><div class='del'>-                call_child = read_child;</div><div class='add'>+    if (dict)</div><div class='add'>+        afr_filter_xattrs(dict);</div><div class='ctx'> </div><div class='del'>-                local-&gt;cont.getxattr.last_tried = -1;</div><div class='del'>-        } else {</div><div class='del'>-                call_child = afr_first_up_child (priv);</div><div class='add'>+    AFR_STACK_UNWIND(fgetxattr, frame, op_ret, op_errno, dict, xdata);</div><div class='ctx'> </div><div class='del'>-                if (call_child == -1) {</div><div class='del'>-                        op_errno = ENOTCONN;</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-                                "no child is up");</div><div class='del'>-                        goto out;</div><div class='del'>-                }</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-                local-&gt;cont.getxattr.last_tried = call_child;</div><div class='del'>-        }</div><div class='add'>+int</div><div class='add'>+afr_fgetxattr_wind(call_frame_t *frame, xlator_t *this, int subvol)</div><div class='add'>+{</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    if (subvol == -1) {</div><div class='add'>+        AFR_STACK_UNWIND(fgetxattr, frame, local-&gt;op_ret, local-&gt;op_errno, NULL,</div><div class='add'>+                         NULL);</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    STACK_WIND_COOKIE(frame, afr_fgetxattr_cbk, (void *)(long)subvol,</div><div class='add'>+                      priv-&gt;children[subvol],</div><div class='add'>+                      priv-&gt;children[subvol]-&gt;fops-&gt;fgetxattr, local-&gt;fd,</div><div class='add'>+                      local-&gt;cont.getxattr.name, local-&gt;xdata_req);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	loc_copy (&amp;local-&gt;loc, loc);</div><div class='del'>-	if (name)</div><div class='del'>-	  local-&gt;cont.getxattr.name       = gf_strdup (name);</div><div class='add'>+static void</div><div class='add'>+afr_fgetxattr_all_subvols(xlator_t *this, call_frame_t *frame,</div><div class='add'>+                          fop_fgetxattr_cbk_t cbk)</div><div class='add'>+{</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    int i = 0;</div><div class='add'>+    int call_count = 0;</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    // local-&gt;call_count set in afr_local_init</div><div class='add'>+    call_count = local-&gt;call_count;</div><div class='add'>+</div><div class='add'>+    // If up-children count is 0, afr_local_init would have failed already</div><div class='add'>+    // and the call would have unwound so not handling it here.</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+        if (local-&gt;child_up[i]) {</div><div class='add'>+            STACK_WIND_COOKIE(frame, cbk, (void *)(long)i, priv-&gt;children[i],</div><div class='add'>+                              priv-&gt;children[i]-&gt;fops-&gt;fgetxattr, local-&gt;fd,</div><div class='add'>+                              local-&gt;cont.getxattr.name, NULL);</div><div class='add'>+            if (!--call_count)</div><div class='add'>+                break;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	STACK_WIND_COOKIE (frame, afr_getxattr_cbk,</div><div class='del'>-			   (void *) (long) call_child,</div><div class='del'>-			   children[call_child], children[call_child]-&gt;fops-&gt;getxattr,</div><div class='del'>-			   loc, name);</div><div class='add'>+    return;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	op_ret = 0;</div><div class='add'>+int</div><div class='add'>+afr_fgetxattr(call_frame_t *frame, xlator_t *this, fd_t *fd, const char *name,</div><div class='add'>+              dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    int32_t op_errno = 0;</div><div class='add'>+    fop_fgetxattr_cbk_t cbk = NULL;</div><div class='add'>+</div><div class='add'>+    AFR_ERROR_OUT_IF_FDCTX_INVALID(fd, this, op_errno, out);</div><div class='add'>+    local = AFR_FRAME_INIT(frame, op_errno);</div><div class='add'>+    if (!local)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    local-&gt;op = GF_FOP_FGETXATTR;</div><div class='add'>+    local-&gt;fd = fd_ref(fd);</div><div class='add'>+    if (name) {</div><div class='add'>+        local-&gt;cont.getxattr.name = gf_strdup(name);</div><div class='add'>+        if (!local-&gt;cont.getxattr.name) {</div><div class='add'>+            op_errno = ENOMEM;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    if (xdata)</div><div class='add'>+        local-&gt;xdata_req = dict_ref(xdata);</div><div class='add'>+</div><div class='add'>+    /* pathinfo gets handled only in getxattr(), but we need to handle</div><div class='add'>+     * lockinfo.</div><div class='add'>+     * If we are doing fgetxattr with lockinfo as the key then we</div><div class='add'>+     * collect information from all children.</div><div class='add'>+     */</div><div class='add'>+    if (afr_is_special_xattr(name, &amp;cbk, 1)) {</div><div class='add'>+        afr_fgetxattr_all_subvols(this, frame, cbk);</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    afr_fix_open(fd, this);</div><div class='add'>+</div><div class='add'>+    afr_read_txn(frame, this, fd-&gt;inode, afr_fgetxattr_wind,</div><div class='add'>+                 AFR_METADATA_TRANSACTION);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='ctx'> out:</div><div class='del'>-	if (op_ret == -1) {</div><div class='del'>-		AFR_STACK_UNWIND (getxattr, frame, op_ret, op_errno, NULL);</div><div class='del'>-	}</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='add'>+    AFR_STACK_UNWIND(fgetxattr, frame, -1, op_errno, NULL, NULL);</div><div class='ctx'> </div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> /* }}} */</div><div class='ctx'> </div><div class='ctx'> /* {{{ readv */</div><div class='ctx'> </div><div class='del'>-/**</div><div class='del'>- * read algorithm:</div><div class='del'>- *</div><div class='del'>- * if the user has specified a read subvolume, use it</div><div class='del'>- * otherwise -</div><div class='del'>- *   use the inode number to hash it to one of the subvolumes, and</div><div class='del'>- *   read from there (to balance read load)</div><div class='del'>- *</div><div class='del'>- * if any of the above read's fail, try the children in sequence</div><div class='del'>- * beginning at the beginning</div><div class='del'>- */</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-afr_readv_cbk (call_frame_t *frame, void *cookie,</div><div class='del'>-	       xlator_t *this, int32_t op_ret, int32_t op_errno,</div><div class='del'>-	       struct iovec *vector, int32_t count, struct iatt *buf,</div><div class='del'>-               struct iobref *iobref)</div><div class='add'>+int</div><div class='add'>+afr_readv_cbk(call_frame_t *frame, void *cookie, xlator_t *this, int32_t op_ret,</div><div class='add'>+              int32_t op_errno, struct iovec *vector, int32_t count,</div><div class='add'>+              struct iatt *buf, struct iobref *iobref, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-	afr_private_t * priv     = NULL;</div><div class='del'>-	afr_local_t *   local    = NULL;</div><div class='del'>-	xlator_t **     children = NULL;</div><div class='del'>-</div><div class='del'>-	int unwind     = 1;</div><div class='del'>-	int last_tried = -1;</div><div class='del'>-	int this_try   = -1;</div><div class='del'>-        int read_child = -1;</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='ctx'> </div><div class='del'>-	VALIDATE_OR_GOTO (frame, out);</div><div class='del'>-	VALIDATE_OR_GOTO (this, out);</div><div class='del'>-	VALIDATE_OR_GOTO (this-&gt;private, out);</div><div class='add'>+    local = frame-&gt;local;</div><div class='ctx'> </div><div class='del'>-	priv     = this-&gt;private;</div><div class='del'>-	VALIDATE_OR_GOTO (priv-&gt;children, out);</div><div class='add'>+    if (op_ret &lt; 0) {</div><div class='add'>+        local-&gt;op_ret = -1;</div><div class='add'>+        local-&gt;op_errno = op_errno;</div><div class='ctx'> </div><div class='del'>-	children = priv-&gt;children;</div><div class='add'>+        afr_read_txn_continue(frame, this, (long)cookie);</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	local = frame-&gt;local;</div><div class='add'>+    AFR_STACK_UNWIND(readv, frame, op_ret, op_errno, vector, count, buf, iobref,</div><div class='add'>+                     xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        read_child = (long) cookie;</div><div class='add'>+int</div><div class='add'>+afr_readv_wind(call_frame_t *frame, xlator_t *this, int subvol)</div><div class='add'>+{</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    if (subvol == -1) {</div><div class='add'>+        AFR_STACK_UNWIND(readv, frame, local-&gt;op_ret, local-&gt;op_errno, 0, 0, 0,</div><div class='add'>+                         0, 0);</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    STACK_WIND_COOKIE(</div><div class='add'>+        frame, afr_readv_cbk, (void *)(long)subvol, priv-&gt;children[subvol],</div><div class='add'>+        priv-&gt;children[subvol]-&gt;fops-&gt;readv, local-&gt;fd, local-&gt;cont.readv.size,</div><div class='add'>+        local-&gt;cont.readv.offset, local-&gt;cont.readv.flags, local-&gt;xdata_req);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	if (op_ret == -1) {</div><div class='del'>-	retry:</div><div class='del'>-		last_tried = local-&gt;cont.readv.last_tried;</div><div class='add'>+int</div><div class='add'>+afr_readv(call_frame_t *frame, xlator_t *this, fd_t *fd, size_t size,</div><div class='add'>+          off_t offset, uint32_t flags, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    int32_t op_errno = 0;</div><div class='ctx'> </div><div class='del'>-		if (all_tried (last_tried, priv-&gt;child_count)) {</div><div class='del'>-			goto out;</div><div class='del'>-		}</div><div class='del'>-		this_try = ++local-&gt;cont.readv.last_tried;</div><div class='add'>+    AFR_ERROR_OUT_IF_FDCTX_INVALID(fd, this, op_errno, out);</div><div class='add'>+    local = AFR_FRAME_INIT(frame, op_errno);</div><div class='add'>+    if (!local)</div><div class='add'>+        goto out;</div><div class='ctx'> </div><div class='del'>-		if (this_try == read_child) {</div><div class='del'>-			/*</div><div class='del'>-			   skip the read child since if we are here</div><div class='del'>-			   we must have already tried that child</div><div class='del'>-			*/</div><div class='del'>-			goto retry;</div><div class='del'>-		}</div><div class='add'>+    local-&gt;op = GF_FOP_READ;</div><div class='add'>+    local-&gt;fd = fd_ref(fd);</div><div class='add'>+    local-&gt;cont.readv.size = size;</div><div class='add'>+    local-&gt;cont.readv.offset = offset;</div><div class='add'>+    local-&gt;cont.readv.flags = flags;</div><div class='add'>+    if (xdata)</div><div class='add'>+        local-&gt;xdata_req = dict_ref(xdata);</div><div class='ctx'> </div><div class='del'>-		unwind = 0;</div><div class='add'>+    afr_fix_open(fd, this);</div><div class='ctx'> </div><div class='del'>-		STACK_WIND_COOKIE (frame, afr_readv_cbk,</div><div class='del'>-				   (void *) (long) read_child,</div><div class='del'>-				   children[this_try],</div><div class='del'>-				   children[this_try]-&gt;fops-&gt;readv,</div><div class='del'>-				   local-&gt;fd, local-&gt;cont.readv.size,</div><div class='del'>-				   local-&gt;cont.readv.offset);</div><div class='del'>-	}</div><div class='add'>+    afr_read_txn(frame, this, fd-&gt;inode, afr_readv_wind, AFR_DATA_TRANSACTION);</div><div class='ctx'> </div><div class='add'>+    return 0;</div><div class='ctx'> out:</div><div class='del'>-	if (unwind) {</div><div class='del'>-                if (buf &amp;&amp; local)</div><div class='del'>-                        buf-&gt;ia_ino = local-&gt;cont.readv.ino;</div><div class='del'>-</div><div class='del'>-		AFR_STACK_UNWIND (readv, frame, op_ret, op_errno,</div><div class='del'>-                                  vector, count, buf, iobref);</div><div class='del'>-	}</div><div class='add'>+    AFR_STACK_UNWIND(readv, frame, -1, op_errno, 0, 0, 0, 0, 0);</div><div class='ctx'> </div><div class='del'>-	return 0;</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+/* }}} */</div><div class='ctx'> </div><div class='del'>-int32_t</div><div class='del'>-afr_readv (call_frame_t *frame, xlator_t *this,</div><div class='del'>-	   fd_t *fd, size_t size, off_t offset)</div><div class='add'>+/* {{{ seek */</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+afr_seek_cbk(call_frame_t *frame, void *cookie, xlator_t *this, int32_t op_ret,</div><div class='add'>+             int32_t op_errno, off_t offset, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-	afr_private_t * priv       = NULL;</div><div class='del'>-	afr_local_t   * local      = NULL;</div><div class='del'>-	xlator_t **     children   = NULL;</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='ctx'> </div><div class='del'>-        int32_t         read_child = -1;</div><div class='del'>-	int             call_child = 0;</div><div class='add'>+    local = frame-&gt;local;</div><div class='ctx'> </div><div class='del'>-	int32_t         op_ret     = -1;</div><div class='del'>-	int32_t         op_errno   = 0;</div><div class='add'>+    if (op_ret &lt; 0) {</div><div class='add'>+        local-&gt;op_ret = -1;</div><div class='add'>+        local-&gt;op_errno = op_errno;</div><div class='ctx'> </div><div class='del'>-	VALIDATE_OR_GOTO (frame, out);</div><div class='del'>-	VALIDATE_OR_GOTO (this, out);</div><div class='del'>-	VALIDATE_OR_GOTO (this-&gt;private, out);</div><div class='del'>-	VALIDATE_OR_GOTO (fd, out);</div><div class='add'>+        afr_read_txn_continue(frame, this, (long)cookie);</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	priv     = this-&gt;private;</div><div class='del'>-	children = priv-&gt;children;</div><div class='add'>+    AFR_STACK_UNWIND(seek, frame, op_ret, op_errno, offset, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	ALLOC_OR_GOTO (local, afr_local_t, out);</div><div class='add'>+int</div><div class='add'>+afr_seek_wind(call_frame_t *frame, xlator_t *this, int subvol)</div><div class='add'>+{</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    if (subvol == -1) {</div><div class='add'>+        AFR_STACK_UNWIND(seek, frame, local-&gt;op_ret, local-&gt;op_errno, 0, NULL);</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    STACK_WIND_COOKIE(</div><div class='add'>+        frame, afr_seek_cbk, (void *)(long)subvol, priv-&gt;children[subvol],</div><div class='add'>+        priv-&gt;children[subvol]-&gt;fops-&gt;seek, local-&gt;fd, local-&gt;cont.seek.offset,</div><div class='add'>+        local-&gt;cont.seek.what, local-&gt;xdata_req);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	frame-&gt;local = local;</div><div class='add'>+int</div><div class='add'>+afr_seek(call_frame_t *frame, xlator_t *this, fd_t *fd, off_t offset,</div><div class='add'>+         gf_seek_what_t what, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    int32_t op_errno = 0;</div><div class='ctx'> </div><div class='del'>-        read_child = afr_read_child (this, fd-&gt;inode);</div><div class='add'>+    AFR_ERROR_OUT_IF_FDCTX_INVALID(fd, this, op_errno, out);</div><div class='add'>+    local = AFR_FRAME_INIT(frame, op_errno);</div><div class='add'>+    if (!local)</div><div class='add'>+        goto out;</div><div class='ctx'> </div><div class='del'>-        if (read_child &gt;= 0) {</div><div class='del'>-                call_child = read_child;</div><div class='add'>+    local-&gt;op = GF_FOP_SEEK;</div><div class='add'>+    local-&gt;fd = fd_ref(fd);</div><div class='add'>+    local-&gt;cont.seek.offset = offset;</div><div class='add'>+    local-&gt;cont.seek.what = what;</div><div class='add'>+    if (xdata)</div><div class='add'>+        local-&gt;xdata_req = dict_ref(xdata);</div><div class='ctx'> </div><div class='del'>-		/*</div><div class='del'>-		   if read fails from the read child, we try</div><div class='del'>-		   all children starting with the first one</div><div class='del'>-		*/</div><div class='del'>-                local-&gt;cont.readv.last_tried = -1;</div><div class='add'>+    afr_fix_open(fd, this);</div><div class='ctx'> </div><div class='del'>-        } else {</div><div class='del'>-		call_child = afr_first_up_child (priv);</div><div class='del'>-		if (call_child == -1) {</div><div class='del'>-			op_errno = ENOTCONN;</div><div class='del'>-			gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-				"no child is up");</div><div class='del'>-			goto out;</div><div class='del'>-		}</div><div class='del'>-</div><div class='del'>-		local-&gt;cont.readv.last_tried = call_child;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	local-&gt;fd                    = fd_ref (fd);</div><div class='del'>-</div><div class='del'>-        local-&gt;cont.readv.ino        = fd-&gt;inode-&gt;ino;</div><div class='del'>-	local-&gt;cont.readv.size       = size;</div><div class='del'>-	local-&gt;cont.readv.offset     = offset;</div><div class='del'>-</div><div class='del'>-	STACK_WIND_COOKIE (frame, afr_readv_cbk,</div><div class='del'>-			   (void *) (long) call_child,</div><div class='del'>-			   children[call_child],</div><div class='del'>-			   children[call_child]-&gt;fops-&gt;readv,</div><div class='del'>-			   fd, size, offset);</div><div class='del'>-</div><div class='del'>-	op_ret = 0;</div><div class='add'>+    afr_read_txn(frame, this, fd-&gt;inode, afr_seek_wind, AFR_DATA_TRANSACTION);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='ctx'> out:</div><div class='del'>-	if (op_ret == -1) {</div><div class='del'>-		AFR_STACK_UNWIND (readv, frame, op_ret, op_errno, NULL, 0, NULL,</div><div class='del'>-                                  NULL);</div><div class='del'>-	}</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='add'>+    AFR_STACK_UNWIND(seek, frame, -1, op_errno, 0, NULL);</div><div class='ctx'> </div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> /* }}} */</div><div class='head'>diff --git a/xlators/cluster/afr/src/afr-inode-read.h b/xlators/cluster/afr/src/afr-inode-read.h<br/>index 2b22131db1a..8c982bc7e6f 100644<br/>--- a/<a href='/cgit/glusterfs.git/tree/xlators/cluster/afr/src/afr-inode-read.h?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/cluster/afr/src/afr-inode-read.h</a><br/>+++ b/<a href='/cgit/glusterfs.git/tree/xlators/cluster/afr/src/afr-inode-read.h?id=d1d7a6f35c816822fab51c820e25023863c239c1'>xlators/cluster/afr/src/afr-inode-read.h</a></div><div class='hunk'>@@ -1,47 +1,45 @@</div><div class='ctx'> /*</div><div class='del'>-   Copyright (c) 2007-2009 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='del'>-   This file is part of GlusterFS.</div><div class='del'>-</div><div class='del'>-   GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-   it under the terms of the GNU General Public License as published</div><div class='del'>-   by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-   or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-   GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-   WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-   General Public License for more details.</div><div class='del'>-</div><div class='del'>-   You should have received a copy of the GNU General Public License</div><div class='del'>-   along with this program.  If not, see</div><div class='del'>-   &lt;http://www.gnu.org/licenses/&gt;.</div><div class='add'>+  Copyright (c) 2008-2012 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='ctx'> */</div><div class='ctx'> </div><div class='ctx'> #ifndef __INODE_READ_H__</div><div class='ctx'> #define __INODE_READ_H__</div><div class='ctx'> </div><div class='ctx'> int32_t</div><div class='del'>-afr_access (call_frame_t *frame, xlator_t *this,</div><div class='del'>-	    loc_t *loc, int32_t mask);</div><div class='add'>+afr_access(call_frame_t *frame, xlator_t *this, loc_t *loc, int32_t mask,</div><div class='add'>+           dict_t *xdata);</div><div class='ctx'> </div><div class='ctx'> int32_t</div><div class='del'>-afr_stat (call_frame_t *frame, xlator_t *this,</div><div class='del'>-	  loc_t *loc);</div><div class='add'>+afr_stat(call_frame_t *frame, xlator_t *this, loc_t *loc, dict_t *xdata);</div><div class='ctx'> </div><div class='ctx'> int32_t</div><div class='del'>-afr_fstat (call_frame_t *frame, xlator_t *this,</div><div class='del'>-	   fd_t *fd);</div><div class='add'>+afr_fstat(call_frame_t *frame, xlator_t *this, fd_t *fd, dict_t *xdata);</div><div class='ctx'> </div><div class='ctx'> int32_t</div><div class='del'>-afr_readlink (call_frame_t *frame, xlator_t *this,</div><div class='del'>-	      loc_t *loc, size_t size);</div><div class='add'>+afr_readlink(call_frame_t *frame, xlator_t *this, loc_t *loc, size_t size,</div><div class='add'>+             dict_t *xdata);</div><div class='ctx'> </div><div class='ctx'> int32_t</div><div class='del'>-afr_readv (call_frame_t *frame, xlator_t *this,</div><div class='del'>-	   fd_t *fd, size_t size, off_t offset);</div><div class='add'>+afr_readv(call_frame_t *frame, xlator_t *this, fd_t *fd, size_t size,</div><div class='add'>+          off_t offset, uint32_t flags, dict_t *xdata);</div><div class='ctx'> </div><div class='ctx'> int32_t</div><div class='del'>-afr_getxattr (call_frame_t *frame, xlator_t *this,</div><div class='del'>-	      loc_t *loc, const char *name);</div><div class='add'>+afr_getxattr(call_frame_t *frame, xlator_t *this, loc_t *loc, const char *name,</div><div class='add'>+             dict_t *xdata);</div><div class='ctx'> </div><div class='add'>+int32_t</div><div class='add'>+afr_fgetxattr(call_frame_t *frame, xlator_t *this, fd_t *fd, const char *name,</div><div class='add'>+              dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+afr_seek(call_frame_t *frame, xlator_t *this, fd_t *fd, off_t offset,</div><div class='add'>+         gf_seek_what_t what, dict_t *xdata);</div><div class='add'>+int</div><div class='add'>+afr_handle_quota_size(call_frame_t *frame, xlator_t *this);</div><div class='ctx'> #endif /* __INODE_READ_H__ */</div><div class='head'>diff --git a/xlators/cluster/afr/src/afr-inode-write.c b/xlators/cluster/afr/src/afr-inode-write.c<br/>index 7a908acd7a6..1d6e4f3570a 100644<br/>--- a/<a href='/cgit/glusterfs.git/tree/xlators/cluster/afr/src/afr-inode-write.c?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/cluster/afr/src/afr-inode-write.c</a><br/>+++ b/<a href='/cgit/glusterfs.git/tree/xlators/cluster/afr/src/afr-inode-write.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>xlators/cluster/afr/src/afr-inode-write.c</a></div><div class='hunk'>@@ -1,1599 +1,2565 @@</div><div class='ctx'> /*</div><div class='del'>-   Copyright (c) 2007-2009 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='del'>-   This file is part of GlusterFS.</div><div class='del'>-</div><div class='del'>-   GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-   it under the terms of the GNU General Public License as published</div><div class='del'>-   by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-   or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-   GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-   WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-   General Public License for more details.</div><div class='del'>-</div><div class='del'>-   You should have received a copy of the GNU General Public License</div><div class='del'>-   along with this program.  If not, see</div><div class='del'>-   &lt;http://www.gnu.org/licenses/&gt;.</div><div class='del'>-*/</div><div class='add'>+  Copyright (c) 2008-2012 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='ctx'> </div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='ctx'> </div><div class='del'>-#include &lt;libgen.h&gt;</div><div class='ctx'> #include &lt;unistd.h&gt;</div><div class='del'>-#include &lt;fnmatch.h&gt;</div><div class='ctx'> #include &lt;sys/time.h&gt;</div><div class='ctx'> #include &lt;stdlib.h&gt;</div><div class='ctx'> #include &lt;signal.h&gt;</div><div class='ctx'> </div><div class='del'>-#ifndef _CONFIG_H</div><div class='del'>-#define _CONFIG_H</div><div class='del'>-#include "config.h"</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-#include "glusterfs.h"</div><div class='del'>-#include "afr.h"</div><div class='del'>-#include "dict.h"</div><div class='del'>-#include "xlator.h"</div><div class='del'>-#include "hashfn.h"</div><div class='del'>-#include "logging.h"</div><div class='del'>-#include "stack.h"</div><div class='del'>-#include "list.h"</div><div class='del'>-#include "call-stub.h"</div><div class='del'>-#include "defaults.h"</div><div class='del'>-#include "common-utils.h"</div><div class='del'>-#include "compat-errno.h"</div><div class='del'>-#include "compat.h"</div><div class='del'>-</div><div class='add'>+#include &lt;glusterfs/glusterfs.h&gt;</div><div class='ctx'> #include "afr.h"</div><div class='add'>+#include &lt;glusterfs/dict.h&gt;</div><div class='add'>+#include &lt;glusterfs/logging.h&gt;</div><div class='add'>+#include &lt;glusterfs/defaults.h&gt;</div><div class='add'>+#include &lt;glusterfs/common-utils.h&gt;</div><div class='add'>+#include &lt;glusterfs/compat-errno.h&gt;</div><div class='add'>+#include &lt;glusterfs/compat.h&gt;</div><div class='add'>+#include "protocol-common.h"</div><div class='add'>+#include &lt;glusterfs/byte-order.h&gt;</div><div class='ctx'> #include "afr-transaction.h"</div><div class='add'>+#include "afr-self-heal.h"</div><div class='add'>+#include "afr-messages.h"</div><div class='ctx'> </div><div class='del'>-/* {{{ writev */</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-afr_writev_unwind (call_frame_t *frame, xlator_t *this)</div><div class='add'>+static void</div><div class='add'>+__afr_inode_write_finalize(call_frame_t *frame, xlator_t *this)</div><div class='ctx'> {</div><div class='del'>-	afr_local_t *   local = NULL;</div><div class='del'>-	call_frame_t   *main_frame = NULL;</div><div class='add'>+    int i = 0;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    int read_subvol = 0;</div><div class='add'>+    struct iatt *stbuf = NULL;</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    afr_read_subvol_args_t args = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, local-&gt;inode, out);</div><div class='add'>+</div><div class='add'>+    /*This code needs to stay till DHT sends fops on linked</div><div class='add'>+     * inodes*/</div><div class='add'>+    if (!inode_is_linked(local-&gt;inode)) {</div><div class='add'>+        for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+            if (!local-&gt;replies[i].valid)</div><div class='add'>+                continue;</div><div class='add'>+            if (local-&gt;replies[i].op_ret == -1)</div><div class='add'>+                continue;</div><div class='add'>+            if (!gf_uuid_is_null(local-&gt;replies[i].poststat.ia_gfid)) {</div><div class='add'>+                gf_uuid_copy(args.gfid, local-&gt;replies[i].poststat.ia_gfid);</div><div class='add'>+                args.ia_type = local-&gt;replies[i].poststat.ia_type;</div><div class='add'>+                break;</div><div class='add'>+            } else {</div><div class='add'>+                ret = dict_get_bin(local-&gt;replies[i].xdata,</div><div class='add'>+                                   DHT_IATT_IN_XDATA_KEY, (void **)&amp;stbuf);</div><div class='add'>+                if (ret)</div><div class='add'>+                    continue;</div><div class='add'>+                gf_uuid_copy(args.gfid, stbuf-&gt;ia_gfid);</div><div class='add'>+                args.ia_type = stbuf-&gt;ia_type;</div><div class='add'>+                break;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (local-&gt;transaction.type == AFR_METADATA_TRANSACTION) {</div><div class='add'>+        read_subvol = afr_metadata_subvol_get(local-&gt;inode, this, NULL,</div><div class='add'>+                                              local-&gt;readable, NULL, &amp;args);</div><div class='add'>+    } else {</div><div class='add'>+        read_subvol = afr_data_subvol_get(local-&gt;inode, this, NULL,</div><div class='add'>+                                          local-&gt;readable, NULL, &amp;args);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    local-&gt;op_ret = -1;</div><div class='add'>+    local-&gt;op_errno = afr_final_errno(local, priv);</div><div class='add'>+    afr_pick_error_xdata(local, priv, local-&gt;inode, local-&gt;readable, NULL,</div><div class='add'>+                         NULL);</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+        if (!local-&gt;replies[i].valid)</div><div class='add'>+            continue;</div><div class='add'>+        if (local-&gt;replies[i].op_ret &lt; 0)</div><div class='add'>+            continue;</div><div class='add'>+</div><div class='add'>+        /* Order of checks in the compound conditional</div><div class='add'>+           below is important.</div><div class='add'>+</div><div class='add'>+           - Highest precedence: largest op_ret</div><div class='add'>+           - Next precedence: if all op_rets are equal, read subvol</div><div class='add'>+           - Least precedence: any succeeded subvol</div><div class='add'>+        */</div><div class='add'>+        if ((local-&gt;op_ret &lt; local-&gt;replies[i].op_ret) ||</div><div class='add'>+            ((local-&gt;op_ret == local-&gt;replies[i].op_ret) &amp;&amp;</div><div class='add'>+             (i == read_subvol))) {</div><div class='add'>+            local-&gt;op_ret = local-&gt;replies[i].op_ret;</div><div class='add'>+            local-&gt;op_errno = local-&gt;replies[i].op_errno;</div><div class='add'>+</div><div class='add'>+            local-&gt;cont.inode_wfop.prebuf = local-&gt;replies[i].prestat;</div><div class='add'>+            local-&gt;cont.inode_wfop.postbuf = local-&gt;replies[i].poststat;</div><div class='add'>+</div><div class='add'>+            if (local-&gt;replies[i].xdata) {</div><div class='add'>+                if (local-&gt;xdata_rsp)</div><div class='add'>+                    dict_unref(local-&gt;xdata_rsp);</div><div class='add'>+                local-&gt;xdata_rsp = dict_ref(local-&gt;replies[i].xdata);</div><div class='add'>+            }</div><div class='add'>+            if (local-&gt;replies[i].xattr) {</div><div class='add'>+                if (local-&gt;xattr_rsp)</div><div class='add'>+                    dict_unref(local-&gt;xattr_rsp);</div><div class='add'>+                local-&gt;xattr_rsp = dict_ref(local-&gt;replies[i].xattr);</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	local = frame-&gt;local;</div><div class='add'>+    afr_set_in_flight_sb_status(this, frame, local-&gt;inode);</div><div class='add'>+out:</div><div class='add'>+    return;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+__afr_inode_write_fill(call_frame_t *frame, xlator_t *this, int child_index,</div><div class='add'>+                       int op_ret, int op_errno, struct iatt *prebuf,</div><div class='add'>+                       struct iatt *postbuf, dict_t *xattr, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    local-&gt;replies[child_index].valid = 1;</div><div class='add'>+</div><div class='add'>+    if (AFR_IS_ARBITER_BRICK(priv, child_index) &amp;&amp; op_ret == 1)</div><div class='add'>+        op_ret = iov_length(local-&gt;cont.writev.vector,</div><div class='add'>+                            local-&gt;cont.writev.count);</div><div class='add'>+</div><div class='add'>+    local-&gt;replies[child_index].op_ret = op_ret;</div><div class='add'>+    local-&gt;replies[child_index].op_errno = op_errno;</div><div class='add'>+    if (xdata)</div><div class='add'>+        local-&gt;replies[child_index].xdata = dict_ref(xdata);</div><div class='add'>+</div><div class='add'>+    if (op_ret &gt;= 0) {</div><div class='add'>+        if (prebuf)</div><div class='add'>+            local-&gt;replies[child_index].prestat = *prebuf;</div><div class='add'>+        if (postbuf)</div><div class='add'>+            local-&gt;replies[child_index].poststat = *postbuf;</div><div class='add'>+        if (xattr)</div><div class='add'>+            local-&gt;replies[child_index].xattr = dict_ref(xattr);</div><div class='add'>+    } else {</div><div class='add'>+        afr_transaction_fop_failed(frame, this, child_index);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	LOCK (&amp;frame-&gt;lock);</div><div class='del'>-	{</div><div class='del'>-		if (local-&gt;transaction.main_frame)</div><div class='del'>-			main_frame = local-&gt;transaction.main_frame;</div><div class='del'>-		local-&gt;transaction.main_frame = NULL;</div><div class='del'>-	}</div><div class='del'>-	UNLOCK (&amp;frame-&gt;lock);</div><div class='add'>+static int</div><div class='add'>+__afr_inode_write_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                      int32_t op_ret, int32_t op_errno, struct iatt *prebuf,</div><div class='add'>+                      struct iatt *postbuf, dict_t *xattr, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    int child_index = (long)cookie;</div><div class='add'>+    int call_count = -1;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;frame-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        __afr_inode_write_fill(frame, this, child_index, op_ret, op_errno,</div><div class='add'>+                               prebuf, postbuf, xattr, xdata);</div><div class='add'>+        call_count = --local-&gt;call_count;</div><div class='add'>+    }</div><div class='add'>+    UNLOCK(&amp;frame-&gt;lock);</div><div class='add'>+</div><div class='add'>+    if (call_count == 0) {</div><div class='add'>+        __afr_inode_write_finalize(frame, this);</div><div class='add'>+</div><div class='add'>+        if (afr_txn_nothing_failed(frame, this)) {</div><div class='add'>+            /*if it did pre-op, it will do post-op changing ctime*/</div><div class='add'>+            if (priv-&gt;consistent_metadata &amp;&amp; afr_needs_changelog_update(local))</div><div class='add'>+                afr_zero_fill_stat(local);</div><div class='add'>+            local-&gt;transaction.unwind(frame, this);</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-	if (main_frame) {</div><div class='del'>-                local-&gt;cont.writev.prebuf.ia_ino  = local-&gt;cont.writev.ino;</div><div class='del'>-                local-&gt;cont.writev.postbuf.ia_ino = local-&gt;cont.writev.ino;</div><div class='add'>+        afr_transaction_resume(frame, this);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-		AFR_STACK_UNWIND (writev, main_frame,</div><div class='del'>-                                  local-&gt;op_ret, local-&gt;op_errno,</div><div class='del'>-                                  &amp;local-&gt;cont.writev.prebuf,</div><div class='del'>-                                  &amp;local-&gt;cont.writev.postbuf);</div><div class='del'>-	}</div><div class='del'>-	return 0;</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+/* {{{ writev */</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-afr_writev_wind_cbk (call_frame_t *frame, void *cookie, xlator_t *this, </div><div class='del'>-		     int32_t op_ret, int32_t op_errno, struct iatt *prebuf,</div><div class='del'>-                     struct iatt *postbuf)</div><div class='add'>+void</div><div class='add'>+afr_writev_copy_outvars(call_frame_t *src_frame, call_frame_t *dst_frame)</div><div class='ctx'> {</div><div class='del'>-	afr_local_t *   local = NULL;</div><div class='del'>-</div><div class='del'>-	int child_index = (long) cookie;</div><div class='del'>-	int call_count  = -1;</div><div class='del'>-        int read_child  = 0;</div><div class='add'>+    afr_local_t *src_local = NULL;</div><div class='add'>+    afr_local_t *dst_local = NULL;</div><div class='add'>+</div><div class='add'>+    src_local = src_frame-&gt;local;</div><div class='add'>+    dst_local = dst_frame-&gt;local;</div><div class='add'>+</div><div class='add'>+    dst_local-&gt;op_ret = src_local-&gt;op_ret;</div><div class='add'>+    dst_local-&gt;op_errno = src_local-&gt;op_errno;</div><div class='add'>+    dst_local-&gt;cont.inode_wfop.prebuf = src_local-&gt;cont.inode_wfop.prebuf;</div><div class='add'>+    dst_local-&gt;cont.inode_wfop.postbuf = src_local-&gt;cont.inode_wfop.postbuf;</div><div class='add'>+    if (src_local-&gt;xdata_rsp)</div><div class='add'>+        dst_local-&gt;xdata_rsp = dict_ref(src_local-&gt;xdata_rsp);</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	local = frame-&gt;local;</div><div class='add'>+void</div><div class='add'>+afr_writev_unwind(call_frame_t *frame, xlator_t *this)</div><div class='add'>+{</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    afr_private_t *priv = this-&gt;private;</div><div class='ctx'> </div><div class='del'>-        read_child = afr_read_child (this, local-&gt;fd-&gt;inode);</div><div class='add'>+    local = frame-&gt;local;</div><div class='ctx'> </div><div class='del'>-	LOCK (&amp;frame-&gt;lock);</div><div class='del'>-	{</div><div class='del'>-                if (child_index == read_child) {</div><div class='del'>-                        local-&gt;read_child_returned = _gf_true;</div><div class='del'>-                }</div><div class='add'>+    if (priv-&gt;consistent_metadata)</div><div class='add'>+        afr_zero_fill_stat(local);</div><div class='ctx'> </div><div class='del'>-		if (afr_fop_failed (op_ret, op_errno))</div><div class='del'>-			afr_transaction_fop_failed (frame, this, child_index);</div><div class='add'>+    AFR_STACK_UNWIND(writev, frame, local-&gt;op_ret, local-&gt;op_errno,</div><div class='add'>+                     &amp;local-&gt;cont.inode_wfop.prebuf,</div><div class='add'>+                     &amp;local-&gt;cont.inode_wfop.postbuf, local-&gt;xdata_rsp);</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-		if (op_ret != -1) {</div><div class='del'>-			if (local-&gt;success_count == 0) {</div><div class='del'>-				local-&gt;op_ret              = op_ret;</div><div class='del'>-				local-&gt;cont.writev.prebuf  = *prebuf;</div><div class='del'>-				local-&gt;cont.writev.postbuf = *postbuf;</div><div class='del'>-			}</div><div class='add'>+int</div><div class='add'>+afr_transaction_writev_unwind(call_frame_t *frame, xlator_t *this)</div><div class='add'>+{</div><div class='add'>+    call_frame_t *fop_frame = NULL;</div><div class='ctx'> </div><div class='del'>-                        if (child_index == read_child) {</div><div class='del'>-                                local-&gt;cont.writev.prebuf  = *prebuf;</div><div class='del'>-                                local-&gt;cont.writev.postbuf = *postbuf;</div><div class='del'>-                        }</div><div class='del'>-		}</div><div class='add'>+    fop_frame = afr_transaction_detach_fop_frame(frame);</div><div class='ctx'> </div><div class='del'>-		local-&gt;op_errno = op_errno;</div><div class='del'>-	}</div><div class='del'>-	UNLOCK (&amp;frame-&gt;lock);</div><div class='add'>+    if (fop_frame) {</div><div class='add'>+        afr_writev_copy_outvars(frame, fop_frame);</div><div class='add'>+        afr_writev_unwind(fop_frame, this);</div><div class='add'>+    }</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	call_count = afr_frame_return (frame);</div><div class='add'>+static void</div><div class='add'>+afr_writev_handle_short_writes(call_frame_t *frame, xlator_t *this)</div><div class='add'>+{</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    int i = 0;</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+    /*</div><div class='add'>+     * We already have the best case result of the writev calls staged</div><div class='add'>+     * as the return value. Any writev that returns some value less</div><div class='add'>+     * than the best case is now out of sync, so mark the fop as</div><div class='add'>+     * failed. Note that fops that have returned with errors have</div><div class='add'>+     * already been marked as failed.</div><div class='add'>+     */</div><div class='add'>+    for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+        if ((!local-&gt;replies[i].valid) || (local-&gt;replies[i].op_ret == -1))</div><div class='add'>+            continue;</div><div class='add'>+</div><div class='add'>+        if (local-&gt;replies[i].op_ret &lt; local-&gt;op_ret)</div><div class='add'>+            afr_transaction_fop_failed(frame, this, i);</div><div class='add'>+    }</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	if (call_count == 0) {</div><div class='del'>-		local-&gt;transaction.unwind (frame, this);</div><div class='add'>+void</div><div class='add'>+afr_inode_write_fill(call_frame_t *frame, xlator_t *this, int child_index,</div><div class='add'>+                     int32_t op_ret, int32_t op_errno, struct iatt *prebuf,</div><div class='add'>+                     struct iatt *postbuf, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+    afr_local_t *local = frame-&gt;local;</div><div class='add'>+    uint32_t open_fd_count = 0;</div><div class='add'>+    uint32_t write_is_append = 0;</div><div class='add'>+    int32_t num_inodelks = 0;</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;frame-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        __afr_inode_write_fill(frame, this, child_index, op_ret, op_errno,</div><div class='add'>+                               prebuf, postbuf, NULL, xdata);</div><div class='add'>+        if (op_ret == -1 || !xdata)</div><div class='add'>+            goto unlock;</div><div class='add'>+</div><div class='add'>+        write_is_append = 0;</div><div class='add'>+        ret = dict_get_uint32(xdata, GLUSTERFS_WRITE_IS_APPEND,</div><div class='add'>+                              &amp;write_is_append);</div><div class='add'>+        if (ret || !write_is_append)</div><div class='add'>+            local-&gt;append_write = _gf_false;</div><div class='add'>+</div><div class='add'>+        ret = dict_get_uint32(xdata, GLUSTERFS_ACTIVE_FD_COUNT, &amp;open_fd_count);</div><div class='add'>+        if (ret &lt; 0)</div><div class='add'>+            goto unlock;</div><div class='add'>+        if (open_fd_count &gt; local-&gt;open_fd_count) {</div><div class='add'>+            local-&gt;open_fd_count = open_fd_count;</div><div class='add'>+            local-&gt;update_open_fd_count = _gf_true;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-		local-&gt;transaction.resume (frame, this);</div><div class='del'>-	}</div><div class='del'>-	return 0;</div><div class='add'>+        ret = dict_get_int32_sizen(xdata, GLUSTERFS_INODELK_COUNT,</div><div class='add'>+                                   &amp;num_inodelks);</div><div class='add'>+        if (ret &lt; 0)</div><div class='add'>+            goto unlock;</div><div class='add'>+        if (num_inodelks &gt; local-&gt;num_inodelks) {</div><div class='add'>+            local-&gt;num_inodelks = num_inodelks;</div><div class='add'>+            local-&gt;update_num_inodelks = _gf_true;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+unlock:</div><div class='add'>+    UNLOCK(&amp;frame-&gt;lock);</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+void</div><div class='add'>+afr_process_post_writev(call_frame_t *frame, xlator_t *this)</div><div class='add'>+{</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    afr_lock_t *lock = NULL;</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+</div><div class='add'>+    if (!local-&gt;stable_write &amp;&amp; !local-&gt;append_write)</div><div class='add'>+        /* An appended write removes the necessity to</div><div class='add'>+           fsync() the file. This is because self-heal</div><div class='add'>+           has the logic to check for larger file when</div><div class='add'>+           the xattrs are not reliably pointing at</div><div class='add'>+           a stale file.</div><div class='add'>+        */</div><div class='add'>+        afr_fd_report_unstable_write(this, local);</div><div class='add'>+</div><div class='add'>+    __afr_inode_write_finalize(frame, this);</div><div class='add'>+</div><div class='add'>+    afr_writev_handle_short_writes(frame, this);</div><div class='add'>+</div><div class='add'>+    if (local-&gt;update_open_fd_count)</div><div class='add'>+        local-&gt;inode_ctx-&gt;open_fd_count = local-&gt;open_fd_count;</div><div class='add'>+    if (local-&gt;update_num_inodelks &amp;&amp;</div><div class='add'>+        local-&gt;transaction.type == AFR_DATA_TRANSACTION) {</div><div class='add'>+        lock = &amp;local-&gt;inode_ctx-&gt;lock[local-&gt;transaction.type];</div><div class='add'>+        lock-&gt;num_inodelks = local-&gt;num_inodelks;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-afr_writev_wind (call_frame_t *frame, xlator_t *this)</div><div class='add'>+afr_writev_wind_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                    int32_t op_ret, int32_t op_errno, struct iatt *prebuf,</div><div class='add'>+                    struct iatt *postbuf, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-	afr_local_t *local = NULL;</div><div class='del'>-	afr_private_t *priv = NULL;</div><div class='del'>-	</div><div class='del'>-	int i = 0;</div><div class='del'>-	int call_count = -1;</div><div class='add'>+    call_frame_t *fop_frame = NULL;</div><div class='add'>+    int child_index = (long)cookie;</div><div class='add'>+    int call_count = -1;</div><div class='ctx'> </div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-	priv = this-&gt;private;</div><div class='add'>+    afr_inode_write_fill(frame, this, child_index, op_ret, op_errno, prebuf,</div><div class='add'>+                         postbuf, xdata);</div><div class='ctx'> </div><div class='del'>-	call_count = afr_up_children_count (priv-&gt;child_count, local-&gt;child_up);</div><div class='add'>+    call_count = afr_frame_return(frame);</div><div class='ctx'> </div><div class='del'>-	if (call_count == 0) {</div><div class='del'>-		local-&gt;transaction.resume (frame, this);</div><div class='del'>-		return 0;</div><div class='del'>-	}</div><div class='add'>+    if (call_count == 0) {</div><div class='add'>+        afr_process_post_writev(frame, this);</div><div class='ctx'> </div><div class='del'>-	local-&gt;call_count = call_count;</div><div class='del'>-</div><div class='del'>-	for (i = 0; i &lt; priv-&gt;child_count; i++) {				</div><div class='del'>-		if (local-&gt;child_up[i]) {</div><div class='del'>-			STACK_WIND_COOKIE (frame, afr_writev_wind_cbk, </div><div class='del'>-					   (void *) (long) i,	</div><div class='del'>-					   priv-&gt;children[i], </div><div class='del'>-					   priv-&gt;children[i]-&gt;fops-&gt;writev,</div><div class='del'>-					   local-&gt;fd, </div><div class='del'>-					   local-&gt;cont.writev.vector,</div><div class='del'>-					   local-&gt;cont.writev.count, </div><div class='del'>-					   local-&gt;cont.writev.offset,</div><div class='del'>-                                           local-&gt;cont.writev.iobref);</div><div class='del'>-		</div><div class='del'>-			if (!--call_count)</div><div class='del'>-				break;</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='del'>-	</div><div class='del'>-	return 0;</div><div class='add'>+        if (!afr_txn_nothing_failed(frame, this)) {</div><div class='add'>+            // Don't unwind until post-op is complete</div><div class='add'>+            afr_transaction_resume(frame, this);</div><div class='add'>+        } else {</div><div class='add'>+            /*</div><div class='add'>+             * Generally inode-write fops do transaction.unwind then</div><div class='add'>+             * transaction.resume, but writev needs to make sure that</div><div class='add'>+             * delayed post-op frame is placed in fdctx before unwind</div><div class='add'>+             * happens. This prevents the race of flush doing the</div><div class='add'>+             * changelog wakeup first in fuse thread and then this</div><div class='add'>+             * writev placing its delayed post-op frame in fdctx.</div><div class='add'>+             * This helps flush make sure all the delayed post-ops are</div><div class='add'>+             * completed.</div><div class='add'>+             */</div><div class='add'>+</div><div class='add'>+            fop_frame = afr_transaction_detach_fop_frame(frame);</div><div class='add'>+            afr_writev_copy_outvars(frame, fop_frame);</div><div class='add'>+            afr_transaction_resume(frame, this);</div><div class='add'>+            afr_writev_unwind(fop_frame, this);</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+static int</div><div class='add'>+afr_arbiter_writev_wind(call_frame_t *frame, xlator_t *this, int subvol)</div><div class='add'>+{</div><div class='add'>+    afr_local_t *local = frame-&gt;local;</div><div class='add'>+    afr_private_t *priv = this-&gt;private;</div><div class='add'>+    static char byte = 0xFF;</div><div class='add'>+    static struct iovec vector = {&amp;byte, 1};</div><div class='add'>+    int32_t count = 1;</div><div class='add'>+</div><div class='add'>+    STACK_WIND_COOKIE(</div><div class='add'>+        frame, afr_writev_wind_cbk, (void *)(long)subvol,</div><div class='add'>+        priv-&gt;children[subvol], priv-&gt;children[subvol]-&gt;fops-&gt;writev, local-&gt;fd,</div><div class='add'>+        &amp;vector, count, local-&gt;cont.writev.offset, local-&gt;cont.writev.flags,</div><div class='add'>+        local-&gt;cont.writev.iobref, local-&gt;xdata_req);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-afr_writev_done (call_frame_t *frame, xlator_t *this)</div><div class='add'>+afr_writev_wind(call_frame_t *frame, xlator_t *this, int subvol)</div><div class='ctx'> {</div><div class='del'>-	afr_local_t *local = NULL;</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='ctx'> </div><div class='del'>-	local = frame-&gt;local;</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    priv = this-&gt;private;</div><div class='ctx'> </div><div class='del'>-        iobref_unref (local-&gt;cont.writev.iobref);</div><div class='del'>-	local-&gt;cont.writev.iobref = NULL;</div><div class='del'>-</div><div class='del'>-	local-&gt;transaction.unwind (frame, this);</div><div class='add'>+    if (AFR_IS_ARBITER_BRICK(priv, subvol)) {</div><div class='add'>+        afr_arbiter_writev_wind(frame, this, subvol);</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    STACK_WIND_COOKIE(frame, afr_writev_wind_cbk, (void *)(long)subvol,</div><div class='add'>+                      priv-&gt;children[subvol],</div><div class='add'>+                      priv-&gt;children[subvol]-&gt;fops-&gt;writev, local-&gt;fd,</div><div class='add'>+                      local-&gt;cont.writev.vector, local-&gt;cont.writev.count,</div><div class='add'>+                      local-&gt;cont.writev.offset, local-&gt;cont.writev.flags,</div><div class='add'>+                      local-&gt;cont.writev.iobref, local-&gt;xdata_req);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	AFR_STACK_DESTROY (frame);</div><div class='add'>+int</div><div class='add'>+afr_do_writev(call_frame_t *frame, xlator_t *this)</div><div class='add'>+{</div><div class='add'>+    call_frame_t *transaction_frame = NULL;</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int op_errno = ENOMEM;</div><div class='add'>+</div><div class='add'>+    transaction_frame = copy_frame(frame);</div><div class='add'>+    if (!transaction_frame)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    transaction_frame-&gt;local = local;</div><div class='add'>+    frame-&gt;local = NULL;</div><div class='add'>+</div><div class='add'>+    if (!AFR_FRAME_INIT(frame, op_errno))</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    local-&gt;op = GF_FOP_WRITE;</div><div class='add'>+</div><div class='add'>+    local-&gt;transaction.wind = afr_writev_wind;</div><div class='add'>+    local-&gt;transaction.unwind = afr_transaction_writev_unwind;</div><div class='add'>+</div><div class='add'>+    local-&gt;transaction.main_frame = frame;</div><div class='add'>+</div><div class='add'>+    if (local-&gt;fd-&gt;flags &amp; O_APPEND) {</div><div class='add'>+        /*</div><div class='add'>+         * Backend vfs ignores the 'offset' for append mode fd so</div><div class='add'>+         * locking just the region provided for the writev does not</div><div class='add'>+         * give consistency guarantee. The actual write may happen at a</div><div class='add'>+         * completely different range than the one provided by the</div><div class='add'>+         * offset, len in the fop. So lock the entire file.</div><div class='add'>+         */</div><div class='add'>+        local-&gt;transaction.start = 0;</div><div class='add'>+        local-&gt;transaction.len = 0;</div><div class='add'>+    } else {</div><div class='add'>+        local-&gt;transaction.start = local-&gt;cont.writev.offset;</div><div class='add'>+        local-&gt;transaction.len = iov_length(local-&gt;cont.writev.vector,</div><div class='add'>+                                            local-&gt;cont.writev.count);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = afr_transaction(transaction_frame, this, AFR_DATA_TRANSACTION);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        op_errno = -ret;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+out:</div><div class='add'>+    if (transaction_frame)</div><div class='add'>+        AFR_STACK_DESTROY(transaction_frame);</div><div class='ctx'> </div><div class='del'>-	return 0;</div><div class='add'>+    AFR_STACK_UNWIND(writev, frame, -1, op_errno, NULL, NULL, NULL);</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-afr_do_writev (call_frame_t *frame, xlator_t *this)</div><div class='add'>+afr_writev(call_frame_t *frame, xlator_t *this, fd_t *fd, struct iovec *vector,</div><div class='add'>+           int32_t count, off_t offset, uint32_t flags, struct iobref *iobref,</div><div class='add'>+           dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-        call_frame_t * transaction_frame = NULL;</div><div class='del'>-        afr_local_t *  local             = NULL;</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    int op_errno = ENOMEM;</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    AFR_ERROR_OUT_IF_FDCTX_INVALID(fd, this, op_errno, out);</div><div class='add'>+    local = AFR_FRAME_INIT(frame, op_errno);</div><div class='add'>+    if (!local)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    local-&gt;cont.writev.vector = iov_dup(vector, count);</div><div class='add'>+    if (!local-&gt;cont.writev.vector)</div><div class='add'>+        goto out;</div><div class='add'>+    local-&gt;cont.writev.count = count;</div><div class='add'>+    local-&gt;cont.writev.offset = offset;</div><div class='add'>+    local-&gt;cont.writev.flags = flags;</div><div class='add'>+    local-&gt;cont.writev.iobref = iobref_ref(iobref);</div><div class='add'>+</div><div class='add'>+    if (xdata)</div><div class='add'>+        local-&gt;xdata_req = dict_copy_with_ref(xdata, NULL);</div><div class='add'>+    else</div><div class='add'>+        local-&gt;xdata_req = dict_new();</div><div class='add'>+</div><div class='add'>+    if (!local-&gt;xdata_req)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    local-&gt;fd = fd_ref(fd);</div><div class='add'>+    ret = afr_set_inode_local(this, local, fd-&gt;inode);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    if (dict_set_uint32(local-&gt;xdata_req, GLUSTERFS_ACTIVE_FD_COUNT, 4)) {</div><div class='add'>+        op_errno = ENOMEM;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (dict_set_str_sizen(local-&gt;xdata_req, GLUSTERFS_INODELK_DOM_COUNT,</div><div class='add'>+                           this-&gt;name)) {</div><div class='add'>+        op_errno = ENOMEM;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (dict_set_uint32(local-&gt;xdata_req, GLUSTERFS_WRITE_IS_APPEND, 4)) {</div><div class='add'>+        op_errno = ENOMEM;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Set append_write to be true speculatively. If on any</div><div class='add'>+       server it turns not be true, we unset it in the</div><div class='add'>+       callback.</div><div class='add'>+    */</div><div class='add'>+    local-&gt;append_write = _gf_true;</div><div class='add'>+</div><div class='add'>+    /* detect here, but set it in writev_wind_cbk *after* the unstable</div><div class='add'>+       write is performed</div><div class='add'>+    */</div><div class='add'>+    local-&gt;stable_write = !!((fd-&gt;flags | flags) &amp; (O_SYNC | O_DSYNC));</div><div class='add'>+</div><div class='add'>+    afr_fix_open(fd, this);</div><div class='add'>+</div><div class='add'>+    afr_do_writev(frame, this);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+out:</div><div class='add'>+    AFR_STACK_UNWIND(writev, frame, -1, op_errno, NULL, NULL, NULL);</div><div class='ctx'> </div><div class='del'>-        int op_ret   = -1;</div><div class='del'>-        int op_errno = 0;</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        local = frame-&gt;local;</div><div class='add'>+/* }}} */</div><div class='ctx'> </div><div class='del'>-	transaction_frame = copy_frame (frame);</div><div class='del'>-	if (!transaction_frame) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-			"Out of memory.");</div><div class='del'>-                op_errno = ENOMEM;</div><div class='del'>-		goto out;</div><div class='del'>-	}</div><div class='add'>+/* {{{ truncate */</div><div class='ctx'> </div><div class='del'>-	transaction_frame-&gt;local = local;</div><div class='del'>-        frame-&gt;local = NULL;</div><div class='add'>+int</div><div class='add'>+afr_truncate_unwind(call_frame_t *frame, xlator_t *this)</div><div class='add'>+{</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    call_frame_t *main_frame = NULL;</div><div class='ctx'> </div><div class='del'>-	local-&gt;op = GF_FOP_WRITE;</div><div class='add'>+    local = frame-&gt;local;</div><div class='ctx'> </div><div class='del'>-        local-&gt;success_count      = 0;</div><div class='add'>+    main_frame = afr_transaction_detach_fop_frame(frame);</div><div class='add'>+    if (!main_frame)</div><div class='add'>+        return 0;</div><div class='ctx'> </div><div class='del'>-	local-&gt;transaction.fop    = afr_writev_wind;</div><div class='del'>-	local-&gt;transaction.done   = afr_writev_done;</div><div class='del'>-	local-&gt;transaction.unwind = afr_writev_unwind;</div><div class='add'>+    AFR_STACK_UNWIND(truncate, main_frame, local-&gt;op_ret, local-&gt;op_errno,</div><div class='add'>+                     &amp;local-&gt;cont.inode_wfop.prebuf,</div><div class='add'>+                     &amp;local-&gt;cont.inode_wfop.postbuf, local-&gt;xdata_rsp);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	local-&gt;transaction.main_frame = frame;</div><div class='del'>-	if (local-&gt;fd-&gt;flags &amp; O_APPEND) {</div><div class='del'>-		local-&gt;transaction.start   = 0;</div><div class='del'>-		local-&gt;transaction.len     = 0;</div><div class='del'>-	} else {</div><div class='del'>-		local-&gt;transaction.start   = local-&gt;cont.writev.offset;</div><div class='del'>-		local-&gt;transaction.len     = iov_length (local-&gt;cont.writev.vector,</div><div class='del'>-                                                         local-&gt;cont.writev.count);</div><div class='del'>-	}</div><div class='add'>+int</div><div class='add'>+afr_truncate_wind_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                      int32_t op_ret, int32_t op_errno, struct iatt *prebuf,</div><div class='add'>+                      struct iatt *postbuf, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='ctx'> </div><div class='del'>-	afr_transaction (transaction_frame, this, AFR_DATA_TRANSACTION);</div><div class='add'>+    local = frame-&gt;local;</div><div class='ctx'> </div><div class='del'>-        op_ret = 0;</div><div class='del'>-out:</div><div class='del'>-	if (op_ret == -1) {</div><div class='del'>-		if (transaction_frame)</div><div class='del'>-			AFR_STACK_DESTROY (transaction_frame);</div><div class='del'>-		AFR_STACK_UNWIND (writev, frame, op_ret, op_errno, NULL, NULL);</div><div class='del'>-	}</div><div class='add'>+    if (op_ret == 0 &amp;&amp; prebuf-&gt;ia_size != postbuf-&gt;ia_size)</div><div class='add'>+        local-&gt;stable_write = _gf_false;</div><div class='ctx'> </div><div class='del'>-        return 0;</div><div class='add'>+    return __afr_inode_write_cbk(frame, cookie, this, op_ret, op_errno, prebuf,</div><div class='add'>+                                 postbuf, NULL, xdata);</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-afr_writev (call_frame_t *frame, xlator_t *this, fd_t *fd, </div><div class='del'>-	    struct iovec *vector, int32_t count, off_t offset,</div><div class='del'>-            struct iobref *iobref)</div><div class='add'>+afr_truncate_wind(call_frame_t *frame, xlator_t *this, int subvol)</div><div class='ctx'> {</div><div class='del'>-	afr_private_t * priv  = NULL;</div><div class='del'>-	afr_local_t   * local = NULL;</div><div class='del'>-</div><div class='del'>-	int ret = -1;</div><div class='del'>-</div><div class='del'>-	int op_ret   = -1;</div><div class='del'>-	int op_errno = 0;</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='ctx'> </div><div class='del'>-        uint64_t ctx;</div><div class='del'>-        afr_fd_ctx_t *fd_ctx = NULL;</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    priv = this-&gt;private;</div><div class='ctx'> </div><div class='del'>-	VALIDATE_OR_GOTO (frame, out);</div><div class='del'>-	VALIDATE_OR_GOTO (this, out);</div><div class='del'>-	VALIDATE_OR_GOTO (this-&gt;private, out);</div><div class='add'>+    STACK_WIND_COOKIE(frame, afr_truncate_wind_cbk, (void *)(long)subvol,</div><div class='add'>+                      priv-&gt;children[subvol],</div><div class='add'>+                      priv-&gt;children[subvol]-&gt;fops-&gt;truncate, &amp;local-&gt;loc,</div><div class='add'>+                      local-&gt;cont.truncate.offset, local-&gt;xdata_req);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	priv = this-&gt;private;</div><div class='add'>+int</div><div class='add'>+afr_truncate(call_frame_t *frame, xlator_t *this, loc_t *loc, off_t offset,</div><div class='add'>+             dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    call_frame_t *transaction_frame = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int op_errno = ENOMEM;</div><div class='ctx'> </div><div class='del'>-	ALLOC_OR_GOTO (local, afr_local_t, out);</div><div class='add'>+    transaction_frame = copy_frame(frame);</div><div class='add'>+    if (!transaction_frame)</div><div class='add'>+        goto out;</div><div class='ctx'> </div><div class='del'>-	ret = AFR_LOCAL_INIT (local, priv);</div><div class='del'>-	if (ret &lt; 0) {</div><div class='del'>-		op_errno = -ret;</div><div class='del'>-		goto out;</div><div class='del'>-	}</div><div class='add'>+    local = AFR_FRAME_INIT(transaction_frame, op_errno);</div><div class='add'>+    if (!local)</div><div class='add'>+        goto out;</div><div class='ctx'> </div><div class='del'>-        frame-&gt;local = local;</div><div class='add'>+    local-&gt;cont.truncate.offset = offset;</div><div class='add'>+    if (xdata)</div><div class='add'>+        local-&gt;xdata_req = dict_copy_with_ref(xdata, NULL);</div><div class='add'>+    else</div><div class='add'>+        local-&gt;xdata_req = dict_new();</div><div class='ctx'> </div><div class='del'>-	local-&gt;cont.writev.vector     = iov_dup (vector, count);</div><div class='del'>-	local-&gt;cont.writev.count      = count;</div><div class='del'>-	local-&gt;cont.writev.offset     = offset;</div><div class='del'>-	local-&gt;cont.writev.ino        = fd-&gt;inode-&gt;ino;</div><div class='del'>-        local-&gt;cont.writev.iobref     = iobref_ref (iobref);</div><div class='add'>+    if (!local-&gt;xdata_req)</div><div class='add'>+        goto out;</div><div class='ctx'> </div><div class='del'>-	local-&gt;fd                = fd_ref (fd);</div><div class='add'>+    local-&gt;transaction.wind = afr_truncate_wind;</div><div class='add'>+    local-&gt;transaction.unwind = afr_truncate_unwind;</div><div class='ctx'> </div><div class='del'>-        ret = fd_ctx_get (fd, this, &amp;ctx);</div><div class='del'>-        if (ret &lt; 0) {</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='add'>+    loc_copy(&amp;local-&gt;loc, loc);</div><div class='add'>+    ret = afr_set_inode_local(this, local, loc-&gt;inode);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='ctx'> </div><div class='del'>-        fd_ctx = (afr_fd_ctx_t *)(long) ctx;</div><div class='add'>+    local-&gt;op = GF_FOP_TRUNCATE;</div><div class='ctx'> </div><div class='del'>-        if (fd_ctx-&gt;down_count &lt; priv-&gt;down_count) {</div><div class='del'>-                local-&gt;up_down_flush_cbk = afr_do_writev;</div><div class='del'>-                afr_up_down_flush (frame, this, fd, AFR_CHILD_DOWN_FLUSH);</div><div class='add'>+    local-&gt;transaction.main_frame = frame;</div><div class='add'>+    local-&gt;transaction.start = offset;</div><div class='add'>+    local-&gt;transaction.len = 0;</div><div class='ctx'> </div><div class='del'>-        } else if (fd_ctx-&gt;up_count &lt; priv-&gt;up_count) {</div><div class='del'>-                local-&gt;up_down_flush_cbk = afr_do_writev;</div><div class='del'>-                afr_up_down_flush (frame, this, fd, AFR_CHILD_UP_FLUSH);</div><div class='add'>+    /* Set it true speculatively, will get reset in afr_truncate_wind_cbk</div><div class='add'>+       if truncate was not a NOP */</div><div class='add'>+    local-&gt;stable_write = _gf_true;</div><div class='ctx'> </div><div class='del'>-        } else {</div><div class='del'>-                afr_do_writev (frame, this);</div><div class='del'>-        }</div><div class='add'>+    ret = afr_transaction(transaction_frame, this, AFR_DATA_TRANSACTION);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        op_errno = -ret;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	op_ret = 0;</div><div class='add'>+    return 0;</div><div class='ctx'> out:</div><div class='del'>-	if (op_ret == -1) {</div><div class='del'>-		AFR_STACK_UNWIND (writev, frame, op_ret, op_errno, NULL, NULL);</div><div class='del'>-	}</div><div class='add'>+    if (transaction_frame)</div><div class='add'>+        AFR_STACK_DESTROY(transaction_frame);</div><div class='ctx'> </div><div class='del'>-	return 0;</div><div class='add'>+    AFR_STACK_UNWIND(truncate, frame, -1, op_errno, NULL, NULL, NULL);</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> /* }}} */</div><div class='ctx'> </div><div class='del'>-/* {{{ truncate */</div><div class='add'>+/* {{{ ftruncate */</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-afr_truncate_unwind (call_frame_t *frame, xlator_t *this)</div><div class='add'>+afr_ftruncate_unwind(call_frame_t *frame, xlator_t *this)</div><div class='ctx'> {</div><div class='del'>-	afr_local_t *   local = NULL;</div><div class='del'>-	call_frame_t   *main_frame = NULL;</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    call_frame_t *main_frame = NULL;</div><div class='ctx'> </div><div class='del'>-	local = frame-&gt;local;</div><div class='add'>+    local = frame-&gt;local;</div><div class='ctx'> </div><div class='del'>-	LOCK (&amp;frame-&gt;lock);</div><div class='del'>-	{</div><div class='del'>-		if (local-&gt;transaction.main_frame)</div><div class='del'>-			main_frame = local-&gt;transaction.main_frame;</div><div class='del'>-		local-&gt;transaction.main_frame = NULL;</div><div class='del'>-	}</div><div class='del'>-	UNLOCK (&amp;frame-&gt;lock);</div><div class='add'>+    main_frame = afr_transaction_detach_fop_frame(frame);</div><div class='add'>+    if (!main_frame)</div><div class='add'>+        return 0;</div><div class='ctx'> </div><div class='del'>-	if (main_frame) {</div><div class='del'>-                local-&gt;cont.truncate.prebuf.ia_ino  = local-&gt;cont.truncate.ino;</div><div class='del'>-                local-&gt;cont.truncate.postbuf.ia_ino = local-&gt;cont.truncate.ino;</div><div class='add'>+    AFR_STACK_UNWIND(ftruncate, main_frame, local-&gt;op_ret, local-&gt;op_errno,</div><div class='add'>+                     &amp;local-&gt;cont.inode_wfop.prebuf,</div><div class='add'>+                     &amp;local-&gt;cont.inode_wfop.postbuf, local-&gt;xdata_rsp);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-                AFR_STACK_UNWIND (truncate, main_frame, local-&gt;op_ret,</div><div class='del'>-                                  local-&gt;op_errno,</div><div class='del'>-                                  &amp;local-&gt;cont.truncate.prebuf,</div><div class='del'>-                                  &amp;local-&gt;cont.truncate.postbuf);</div><div class='del'>-        }</div><div class='add'>+int</div><div class='add'>+afr_ftruncate_wind_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                       int32_t op_ret, int32_t op_errno, struct iatt *prebuf,</div><div class='add'>+                       struct iatt *postbuf, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='ctx'> </div><div class='del'>-	return 0;</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+</div><div class='add'>+    if (op_ret == 0 &amp;&amp; prebuf-&gt;ia_size != postbuf-&gt;ia_size)</div><div class='add'>+        local-&gt;stable_write = _gf_false;</div><div class='add'>+</div><div class='add'>+    return __afr_inode_write_cbk(frame, cookie, this, op_ret, op_errno, prebuf,</div><div class='add'>+                                 postbuf, NULL, xdata);</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+int</div><div class='add'>+afr_ftruncate_wind(call_frame_t *frame, xlator_t *this, int subvol)</div><div class='add'>+{</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    STACK_WIND_COOKIE(frame, afr_ftruncate_wind_cbk, (void *)(long)subvol,</div><div class='add'>+                      priv-&gt;children[subvol],</div><div class='add'>+                      priv-&gt;children[subvol]-&gt;fops-&gt;ftruncate, local-&gt;fd,</div><div class='add'>+                      local-&gt;cont.ftruncate.offset, local-&gt;xdata_req);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-afr_truncate_wind_cbk (call_frame_t *frame, void *cookie, xlator_t *this, </div><div class='del'>-		       int32_t op_ret, int32_t op_errno, struct iatt *prebuf,</div><div class='del'>-                       struct iatt *postbuf)</div><div class='add'>+afr_ftruncate(call_frame_t *frame, xlator_t *this, fd_t *fd, off_t offset,</div><div class='add'>+              dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-	afr_local_t *   local = NULL;</div><div class='del'>-	afr_private_t * priv  = NULL;</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    call_frame_t *transaction_frame = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int op_errno = ENOMEM;</div><div class='ctx'> </div><div class='del'>-	int child_index = (long) cookie;</div><div class='del'>-        int read_child  = 0;</div><div class='del'>-	int call_count  = -1;</div><div class='del'>-	int need_unwind = 0;</div><div class='add'>+    AFR_ERROR_OUT_IF_FDCTX_INVALID(fd, this, op_errno, out);</div><div class='add'>+    transaction_frame = copy_frame(frame);</div><div class='add'>+    if (!transaction_frame)</div><div class='add'>+        goto out;</div><div class='ctx'> </div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-	priv  = this-&gt;private;</div><div class='add'>+    local = AFR_FRAME_INIT(transaction_frame, op_errno);</div><div class='add'>+    if (!local)</div><div class='add'>+        goto out;</div><div class='ctx'> </div><div class='del'>-        read_child = afr_read_child (this, local-&gt;loc.inode);</div><div class='add'>+    local-&gt;cont.ftruncate.offset = offset;</div><div class='add'>+    if (xdata)</div><div class='add'>+        local-&gt;xdata_req = dict_copy_with_ref(xdata, NULL);</div><div class='add'>+    else</div><div class='add'>+        local-&gt;xdata_req = dict_new();</div><div class='ctx'> </div><div class='del'>-	LOCK (&amp;frame-&gt;lock);</div><div class='del'>-	{</div><div class='del'>-                if (child_index == read_child) {</div><div class='del'>-                        local-&gt;read_child_returned = _gf_true;</div><div class='del'>-                }</div><div class='add'>+    if (!local-&gt;xdata_req)</div><div class='add'>+        goto out;</div><div class='ctx'> </div><div class='del'>-		if (afr_fop_failed (op_ret, op_errno) &amp;&amp; op_errno != EFBIG)</div><div class='del'>-			afr_transaction_fop_failed (frame, this, child_index);</div><div class='add'>+    local-&gt;fd = fd_ref(fd);</div><div class='add'>+    ret = afr_set_inode_local(this, local, fd-&gt;inode);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='ctx'> </div><div class='del'>-		if (op_ret != -1) {</div><div class='del'>-			if (local-&gt;success_count == 0) {</div><div class='del'>-				local-&gt;op_ret = op_ret;</div><div class='del'>-				local-&gt;cont.truncate.prebuf  = *prebuf;</div><div class='del'>-				local-&gt;cont.truncate.postbuf = *postbuf;</div><div class='del'>-			}</div><div class='add'>+    local-&gt;op = GF_FOP_FTRUNCATE;</div><div class='ctx'> </div><div class='del'>-                        if (child_index == read_child) {</div><div class='del'>-                                local-&gt;cont.truncate.prebuf  = *prebuf;</div><div class='del'>-                                local-&gt;cont.truncate.postbuf = *postbuf;</div><div class='del'>-                        }</div><div class='add'>+    local-&gt;transaction.wind = afr_ftruncate_wind;</div><div class='add'>+    local-&gt;transaction.unwind = afr_ftruncate_unwind;</div><div class='ctx'> </div><div class='del'>-			local-&gt;success_count++;</div><div class='add'>+    local-&gt;transaction.main_frame = frame;</div><div class='ctx'> </div><div class='del'>-			if ((local-&gt;success_count &gt;= priv-&gt;wait_count)</div><div class='del'>-                            &amp;&amp; local-&gt;read_child_returned) {</div><div class='del'>-				need_unwind = 1;</div><div class='del'>-			}</div><div class='del'>-		}</div><div class='del'>-		local-&gt;op_errno = op_errno;</div><div class='del'>-	}</div><div class='del'>-	UNLOCK (&amp;frame-&gt;lock);</div><div class='add'>+    local-&gt;transaction.start = local-&gt;cont.ftruncate.offset;</div><div class='add'>+    local-&gt;transaction.len = 0;</div><div class='ctx'> </div><div class='del'>-	if (need_unwind)</div><div class='del'>-		local-&gt;transaction.unwind (frame, this);</div><div class='add'>+    afr_fix_open(fd, this);</div><div class='ctx'> </div><div class='del'>-	call_count = afr_frame_return (frame);</div><div class='add'>+    /* Set it true speculatively, will get reset in afr_ftruncate_wind_cbk</div><div class='add'>+       if truncate was not a NOP */</div><div class='add'>+    local-&gt;stable_write = _gf_true;</div><div class='ctx'> </div><div class='del'>-	if (call_count == 0) {</div><div class='del'>-		local-&gt;transaction.resume (frame, this);</div><div class='del'>-	}</div><div class='add'>+    ret = afr_transaction(transaction_frame, this, AFR_DATA_TRANSACTION);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        op_errno = -ret;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+out:</div><div class='add'>+    AFR_STACK_UNWIND(ftruncate, frame, -1, op_errno, NULL, NULL, NULL);</div><div class='ctx'> </div><div class='del'>-	return 0;</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+/* }}} */</div><div class='ctx'> </div><div class='del'>-int32_t</div><div class='del'>-afr_truncate_wind (call_frame_t *frame, xlator_t *this)</div><div class='add'>+/* {{{ setattr */</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+afr_setattr_unwind(call_frame_t *frame, xlator_t *this)</div><div class='ctx'> {</div><div class='del'>-	afr_local_t *local = NULL;</div><div class='del'>-	afr_private_t *priv = NULL;</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    call_frame_t *main_frame = NULL;</div><div class='ctx'> </div><div class='del'>-	int call_count = -1;</div><div class='del'>-	int i = 0;</div><div class='add'>+    local = frame-&gt;local;</div><div class='ctx'> </div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-	priv = this-&gt;private;</div><div class='add'>+    main_frame = afr_transaction_detach_fop_frame(frame);</div><div class='add'>+    if (!main_frame)</div><div class='add'>+        return 0;</div><div class='ctx'> </div><div class='del'>-	call_count = afr_up_children_count (priv-&gt;child_count, local-&gt;child_up);</div><div class='add'>+    AFR_STACK_UNWIND(setattr, main_frame, local-&gt;op_ret, local-&gt;op_errno,</div><div class='add'>+                     &amp;local-&gt;cont.inode_wfop.prebuf,</div><div class='add'>+                     &amp;local-&gt;cont.inode_wfop.postbuf, local-&gt;xdata_rsp);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	if (call_count == 0) {</div><div class='del'>-		local-&gt;transaction.resume (frame, this);</div><div class='del'>-		return 0;</div><div class='del'>-	}</div><div class='add'>+int</div><div class='add'>+afr_setattr_wind_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                     int op_ret, int op_errno, struct iatt *preop,</div><div class='add'>+                     struct iatt *postop, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    return __afr_inode_write_cbk(frame, cookie, this, op_ret, op_errno, preop,</div><div class='add'>+                                 postop, NULL, xdata);</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	local-&gt;call_count = call_count;</div><div class='add'>+int</div><div class='add'>+afr_setattr_wind(call_frame_t *frame, xlator_t *this, int subvol)</div><div class='add'>+{</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    STACK_WIND_COOKIE(frame, afr_setattr_wind_cbk, (void *)(long)subvol,</div><div class='add'>+                      priv-&gt;children[subvol],</div><div class='add'>+                      priv-&gt;children[subvol]-&gt;fops-&gt;setattr, &amp;local-&gt;loc,</div><div class='add'>+                      &amp;local-&gt;cont.setattr.in_buf, local-&gt;cont.setattr.valid,</div><div class='add'>+                      local-&gt;xdata_req);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='del'>-		if (local-&gt;child_up[i]) {</div><div class='del'>-			STACK_WIND_COOKIE (frame, afr_truncate_wind_cbk,</div><div class='del'>-					   (void *) (long) i,</div><div class='del'>-					   priv-&gt;children[i],</div><div class='del'>-					   priv-&gt;children[i]-&gt;fops-&gt;truncate,</div><div class='del'>-					   &amp;local-&gt;loc,</div><div class='del'>-					   local-&gt;cont.truncate.offset);</div><div class='add'>+int</div><div class='add'>+afr_setattr(call_frame_t *frame, xlator_t *this, loc_t *loc, struct iatt *buf,</div><div class='add'>+            int32_t valid, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    call_frame_t *transaction_frame = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int op_errno = ENOMEM;</div><div class='add'>+</div><div class='add'>+    transaction_frame = copy_frame(frame);</div><div class='add'>+    if (!transaction_frame)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    local = AFR_FRAME_INIT(transaction_frame, op_errno);</div><div class='add'>+    if (!local)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    local-&gt;cont.setattr.in_buf = *buf;</div><div class='add'>+    local-&gt;cont.setattr.valid = valid;</div><div class='add'>+    if (xdata)</div><div class='add'>+        local-&gt;xdata_req = dict_copy_with_ref(xdata, NULL);</div><div class='add'>+    else</div><div class='add'>+        local-&gt;xdata_req = dict_new();</div><div class='add'>+</div><div class='add'>+    if (!local-&gt;xdata_req)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    local-&gt;transaction.wind = afr_setattr_wind;</div><div class='add'>+    local-&gt;transaction.unwind = afr_setattr_unwind;</div><div class='add'>+</div><div class='add'>+    loc_copy(&amp;local-&gt;loc, loc);</div><div class='add'>+    ret = afr_set_inode_local(this, local, loc-&gt;inode);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    local-&gt;op = GF_FOP_SETATTR;</div><div class='add'>+</div><div class='add'>+    local-&gt;transaction.main_frame = frame;</div><div class='add'>+    local-&gt;transaction.start = LLONG_MAX - 1;</div><div class='add'>+    local-&gt;transaction.len = 0;</div><div class='add'>+</div><div class='add'>+    ret = afr_transaction(transaction_frame, this, AFR_METADATA_TRANSACTION);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        op_errno = -ret;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+out:</div><div class='add'>+    if (transaction_frame)</div><div class='add'>+        AFR_STACK_DESTROY(transaction_frame);</div><div class='ctx'> </div><div class='del'>-			if (!--call_count)</div><div class='del'>-				break;</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='del'>-	</div><div class='del'>-	return 0;</div><div class='add'>+    AFR_STACK_UNWIND(setattr, frame, -1, op_errno, NULL, NULL, NULL);</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+/* {{{ fsetattr */</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-afr_truncate_done (call_frame_t *frame, xlator_t *this)</div><div class='add'>+afr_fsetattr_unwind(call_frame_t *frame, xlator_t *this)</div><div class='ctx'> {</div><div class='del'>-	afr_local_t *local = NULL;</div><div class='del'>-</div><div class='del'>-	local = frame-&gt;local;</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    call_frame_t *main_frame = NULL;</div><div class='ctx'> </div><div class='del'>-	local-&gt;transaction.unwind (frame, this);</div><div class='add'>+    local = frame-&gt;local;</div><div class='ctx'> </div><div class='del'>-	AFR_STACK_DESTROY (frame);</div><div class='add'>+    main_frame = afr_transaction_detach_fop_frame(frame);</div><div class='add'>+    if (!main_frame)</div><div class='add'>+        return 0;</div><div class='ctx'> </div><div class='del'>-	return 0;</div><div class='add'>+    AFR_STACK_UNWIND(fsetattr, main_frame, local-&gt;op_ret, local-&gt;op_errno,</div><div class='add'>+                     &amp;local-&gt;cont.inode_wfop.prebuf,</div><div class='add'>+                     &amp;local-&gt;cont.inode_wfop.postbuf, local-&gt;xdata_rsp);</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-afr_truncate (call_frame_t *frame, xlator_t *this,</div><div class='del'>-	      loc_t *loc, off_t offset)</div><div class='add'>+afr_fsetattr_wind_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                      int32_t op_ret, int32_t op_errno, struct iatt *preop,</div><div class='add'>+                      struct iatt *postop, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-	afr_private_t * priv  = NULL;</div><div class='del'>-	afr_local_t   * local = NULL;</div><div class='del'>-	call_frame_t   *transaction_frame = NULL;</div><div class='del'>-</div><div class='del'>-	int ret = -1;</div><div class='del'>-</div><div class='del'>-	int op_ret   = -1;</div><div class='del'>-	int op_errno = 0;</div><div class='add'>+    return __afr_inode_write_cbk(frame, cookie, this, op_ret, op_errno, preop,</div><div class='add'>+                                 postop, NULL, xdata);</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	VALIDATE_OR_GOTO (frame, out);</div><div class='del'>-	VALIDATE_OR_GOTO (this, out);</div><div class='del'>-	VALIDATE_OR_GOTO (this-&gt;private, out);</div><div class='add'>+int</div><div class='add'>+afr_fsetattr_wind(call_frame_t *frame, xlator_t *this, int subvol)</div><div class='add'>+{</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    STACK_WIND_COOKIE(frame, afr_fsetattr_wind_cbk, (void *)(long)subvol,</div><div class='add'>+                      priv-&gt;children[subvol],</div><div class='add'>+                      priv-&gt;children[subvol]-&gt;fops-&gt;fsetattr, local-&gt;fd,</div><div class='add'>+                      &amp;local-&gt;cont.fsetattr.in_buf, local-&gt;cont.fsetattr.valid,</div><div class='add'>+                      local-&gt;xdata_req);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	priv = this-&gt;private;</div><div class='add'>+int</div><div class='add'>+afr_fsetattr(call_frame_t *frame, xlator_t *this, fd_t *fd, struct iatt *buf,</div><div class='add'>+             int32_t valid, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    call_frame_t *transaction_frame = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int op_errno = ENOMEM;</div><div class='ctx'> </div><div class='del'>-	transaction_frame = copy_frame (frame);</div><div class='del'>-	if (!transaction_frame) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-			"Out of memory.");</div><div class='del'>-		goto out;</div><div class='del'>-	}</div><div class='add'>+    AFR_ERROR_OUT_IF_FDCTX_INVALID(fd, this, op_errno, out);</div><div class='add'>+    transaction_frame = copy_frame(frame);</div><div class='add'>+    if (!transaction_frame)</div><div class='add'>+        goto out;</div><div class='ctx'> </div><div class='del'>-	ALLOC_OR_GOTO (local, afr_local_t, out);</div><div class='add'>+    local = AFR_FRAME_INIT(transaction_frame, op_errno);</div><div class='add'>+    if (!local)</div><div class='add'>+        goto out;</div><div class='ctx'> </div><div class='del'>-	ret = AFR_LOCAL_INIT (local, priv);</div><div class='del'>-	if (ret &lt; 0) {</div><div class='del'>-		op_errno = -ret;</div><div class='del'>-		goto out;</div><div class='del'>-	}</div><div class='add'>+    local-&gt;cont.fsetattr.in_buf = *buf;</div><div class='add'>+    local-&gt;cont.fsetattr.valid = valid;</div><div class='add'>+    if (xdata)</div><div class='add'>+        local-&gt;xdata_req = dict_copy_with_ref(xdata, NULL);</div><div class='add'>+    else</div><div class='add'>+        local-&gt;xdata_req = dict_new();</div><div class='ctx'> </div><div class='del'>-	transaction_frame-&gt;local = local;</div><div class='add'>+    if (!local-&gt;xdata_req)</div><div class='add'>+        goto out;</div><div class='ctx'> </div><div class='del'>-	local-&gt;op_ret = -1;</div><div class='add'>+    local-&gt;transaction.wind = afr_fsetattr_wind;</div><div class='add'>+    local-&gt;transaction.unwind = afr_fsetattr_unwind;</div><div class='ctx'> </div><div class='del'>-	local-&gt;cont.truncate.offset  = offset;</div><div class='del'>-	local-&gt;cont.truncate.ino     = loc-&gt;inode-&gt;ino;</div><div class='add'>+    local-&gt;fd = fd_ref(fd);</div><div class='add'>+    ret = afr_set_inode_local(this, local, fd-&gt;inode);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='ctx'> </div><div class='del'>-	local-&gt;transaction.fop    = afr_truncate_wind;</div><div class='del'>-	local-&gt;transaction.done   = afr_truncate_done;</div><div class='del'>-	local-&gt;transaction.unwind = afr_truncate_unwind;</div><div class='add'>+    local-&gt;op = GF_FOP_FSETATTR;</div><div class='ctx'> </div><div class='del'>-	loc_copy (&amp;local-&gt;loc, loc);</div><div class='add'>+    afr_fix_open(fd, this);</div><div class='ctx'> </div><div class='del'>-	local-&gt;transaction.main_frame = frame;</div><div class='del'>-	local-&gt;transaction.start   = 0;</div><div class='del'>-	local-&gt;transaction.len     = offset;</div><div class='add'>+    local-&gt;transaction.main_frame = frame;</div><div class='add'>+    local-&gt;transaction.start = LLONG_MAX - 1;</div><div class='add'>+    local-&gt;transaction.len = 0;</div><div class='ctx'> </div><div class='del'>-	afr_transaction (transaction_frame, this, AFR_DATA_TRANSACTION);</div><div class='add'>+    ret = afr_transaction(transaction_frame, this, AFR_METADATA_TRANSACTION);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        op_errno = -ret;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	op_ret = 0;</div><div class='add'>+    return 0;</div><div class='ctx'> out:</div><div class='del'>-	if (op_ret == -1) {</div><div class='del'>-		if (transaction_frame)</div><div class='del'>-			AFR_STACK_DESTROY (transaction_frame);</div><div class='del'>-		AFR_STACK_UNWIND (truncate, frame, op_ret, op_errno, NULL, NULL);</div><div class='del'>-	}</div><div class='add'>+    if (transaction_frame)</div><div class='add'>+        AFR_STACK_DESTROY(transaction_frame);</div><div class='ctx'> </div><div class='del'>-	return 0;</div><div class='add'>+    AFR_STACK_UNWIND(fsetattr, frame, -1, op_errno, NULL, NULL, NULL);</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='del'>-/* }}} */</div><div class='del'>-</div><div class='del'>-/* {{{ ftruncate */</div><div class='del'>-</div><div class='add'>+/* {{{ setxattr */</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-afr_ftruncate_unwind (call_frame_t *frame, xlator_t *this)</div><div class='add'>+afr_setxattr_unwind(call_frame_t *frame, xlator_t *this)</div><div class='ctx'> {</div><div class='del'>-	afr_local_t *   local = NULL;</div><div class='del'>-	call_frame_t   *main_frame = NULL;</div><div class='del'>-</div><div class='del'>-	local = frame-&gt;local;</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    call_frame_t *main_frame = NULL;</div><div class='ctx'> </div><div class='del'>-	LOCK (&amp;frame-&gt;lock);</div><div class='del'>-	{</div><div class='del'>-		if (local-&gt;transaction.main_frame)</div><div class='del'>-			main_frame = local-&gt;transaction.main_frame;</div><div class='del'>-		local-&gt;transaction.main_frame = NULL;</div><div class='del'>-	}</div><div class='del'>-	UNLOCK (&amp;frame-&gt;lock);</div><div class='add'>+    local = frame-&gt;local;</div><div class='ctx'> </div><div class='del'>-	if (main_frame) {</div><div class='del'>-                local-&gt;cont.ftruncate.prebuf.ia_ino  = local-&gt;cont.ftruncate.ino;</div><div class='del'>-                local-&gt;cont.ftruncate.postbuf.ia_ino = local-&gt;cont.ftruncate.ino;</div><div class='add'>+    main_frame = afr_transaction_detach_fop_frame(frame);</div><div class='add'>+    if (!main_frame)</div><div class='add'>+        return 0;</div><div class='ctx'> </div><div class='del'>-		AFR_STACK_UNWIND (ftruncate, main_frame, local-&gt;op_ret,</div><div class='del'>-                                  local-&gt;op_errno,</div><div class='del'>-                                  &amp;local-&gt;cont.ftruncate.prebuf,</div><div class='del'>-                                  &amp;local-&gt;cont.ftruncate.postbuf);</div><div class='del'>-	}</div><div class='del'>-	return 0;</div><div class='add'>+    AFR_STACK_UNWIND(setxattr, main_frame, local-&gt;op_ret, local-&gt;op_errno,</div><div class='add'>+                     local-&gt;xdata_rsp);</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+int</div><div class='add'>+afr_setxattr_wind_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                      int32_t op_ret, int32_t op_errno, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    return __afr_inode_write_cbk(frame, cookie, this, op_ret, op_errno, NULL,</div><div class='add'>+                                 NULL, NULL, xdata);</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-afr_ftruncate_wind_cbk (call_frame_t *frame, void *cookie, xlator_t *this, </div><div class='del'>-			int32_t op_ret, int32_t op_errno, struct iatt *prebuf,</div><div class='del'>-                        struct iatt *postbuf)</div><div class='add'>+afr_setxattr_wind(call_frame_t *frame, xlator_t *this, int subvol)</div><div class='ctx'> {</div><div class='del'>-	afr_local_t *   local = NULL;</div><div class='del'>-	afr_private_t * priv  = NULL;</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    STACK_WIND_COOKIE(frame, afr_setxattr_wind_cbk, (void *)(long)subvol,</div><div class='add'>+                      priv-&gt;children[subvol],</div><div class='add'>+                      priv-&gt;children[subvol]-&gt;fops-&gt;setxattr, &amp;local-&gt;loc,</div><div class='add'>+                      local-&gt;cont.setxattr.dict, local-&gt;cont.setxattr.flags,</div><div class='add'>+                      local-&gt;xdata_req);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	int child_index = (long) cookie;</div><div class='del'>-	int call_count  = -1;</div><div class='del'>-	int need_unwind = 0;</div><div class='del'>-        int read_child  = 0;</div><div class='add'>+int</div><div class='add'>+afr_emptyb_set_pending_changelog_cbk(call_frame_t *frame, void *cookie,</div><div class='add'>+                                     xlator_t *this, int op_ret, int op_errno,</div><div class='add'>+                                     dict_t *xattr, dict_t *xdata)</div><div class='ctx'> </div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-	priv  = this-&gt;private;</div><div class='add'>+{</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    int i, ret = 0;</div><div class='add'>+    char *op_type = NULL;</div><div class='ctx'> </div><div class='del'>-        read_child = afr_read_child (this, local-&gt;fd-&gt;inode);</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+    i = (long)cookie;</div><div class='ctx'> </div><div class='del'>-	LOCK (&amp;frame-&gt;lock);</div><div class='del'>-	{</div><div class='del'>-                if (child_index == read_child) {</div><div class='del'>-                        local-&gt;read_child_returned = _gf_true;</div><div class='del'>-                }</div><div class='add'>+    local-&gt;replies[i].valid = 1;</div><div class='add'>+    local-&gt;replies[i].op_ret = op_ret;</div><div class='add'>+    local-&gt;replies[i].op_errno = op_errno;</div><div class='ctx'> </div><div class='del'>-		if (afr_fop_failed (op_ret, op_errno))</div><div class='del'>-			afr_transaction_fop_failed (frame, this, child_index);</div><div class='add'>+    ret = dict_get_str_sizen(local-&gt;xdata_req, "replicate-brick-op", &amp;op_type);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='ctx'> </div><div class='del'>-		if (op_ret != -1) {</div><div class='del'>-			if (local-&gt;success_count == 0) {</div><div class='del'>-				local-&gt;op_ret = op_ret;</div><div class='del'>-				local-&gt;cont.ftruncate.prebuf  = *prebuf;</div><div class='del'>-				local-&gt;cont.ftruncate.postbuf = *postbuf;</div><div class='del'>-			}</div><div class='add'>+    gf_smsg(this-&gt;name, op_ret ? GF_LOG_ERROR : GF_LOG_INFO,</div><div class='add'>+            op_ret ? op_errno : 0, AFR_MSG_SET_PEND_XATTR, "name=%s",</div><div class='add'>+            priv-&gt;children[i]-&gt;name, "op_ret=%s",</div><div class='add'>+            op_ret ? "failed" : "succeeded", NULL);</div><div class='ctx'> </div><div class='del'>-                        if (child_index == read_child) {</div><div class='del'>-                                local-&gt;cont.ftruncate.prebuf  = *prebuf;</div><div class='del'>-                                local-&gt;cont.ftruncate.postbuf = *postbuf;</div><div class='del'>-                        }</div><div class='add'>+out:</div><div class='add'>+    syncbarrier_wake(&amp;local-&gt;barrier);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-			local-&gt;success_count++;</div><div class='add'>+int</div><div class='add'>+afr_emptyb_set_pending_changelog(call_frame_t *frame, xlator_t *this,</div><div class='add'>+                                 unsigned char *locked_nodes)</div><div class='add'>+{</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    int ret = 0, i = 0;</div><div class='ctx'> </div><div class='del'>-			if ((local-&gt;success_count &gt;= priv-&gt;wait_count)</div><div class='del'>-                            &amp;&amp; local-&gt;read_child_returned) {</div><div class='del'>-				need_unwind = 1;</div><div class='del'>-			}</div><div class='del'>-		}</div><div class='del'>-		local-&gt;op_errno = op_errno;</div><div class='del'>-	}</div><div class='del'>-	UNLOCK (&amp;frame-&gt;lock);</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    priv = this-&gt;private;</div><div class='ctx'> </div><div class='del'>-	if (need_unwind)</div><div class='del'>-		local-&gt;transaction.unwind (frame, this);</div><div class='add'>+    AFR_ONLIST(locked_nodes, frame, afr_emptyb_set_pending_changelog_cbk,</div><div class='add'>+               xattrop, &amp;local-&gt;loc, GF_XATTROP_ADD_ARRAY, local-&gt;xattr_req,</div><div class='add'>+               NULL);</div><div class='ctx'> </div><div class='del'>-	call_count = afr_frame_return (frame);</div><div class='add'>+    /* It is sufficient if xattrop was successful on one child */</div><div class='add'>+    for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+        if (!local-&gt;replies[i].valid)</div><div class='add'>+            continue;</div><div class='ctx'> </div><div class='del'>-	if (call_count == 0) {</div><div class='del'>-		local-&gt;transaction.resume (frame, this);</div><div class='del'>-	}</div><div class='del'>-	</div><div class='del'>-	return 0;</div><div class='add'>+        if (local-&gt;replies[i].op_ret == 0) {</div><div class='add'>+            ret = 0;</div><div class='add'>+            goto out;</div><div class='add'>+        } else {</div><div class='add'>+            ret = afr_higher_errno(ret, local-&gt;replies[i].op_errno);</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+out:</div><div class='add'>+    return -ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-afr_ftruncate_wind (call_frame_t *frame, xlator_t *this)</div><div class='add'>+static int</div><div class='add'>+_afr_handle_empty_brick_type(xlator_t *this, call_frame_t *frame, loc_t *loc,</div><div class='add'>+                             int empty_index, afr_transaction_type type,</div><div class='add'>+                             char *op_type, const int op_type_len)</div><div class='ctx'> {</div><div class='del'>-	afr_local_t *local = NULL;</div><div class='del'>-	afr_private_t *priv = NULL;</div><div class='del'>-	</div><div class='del'>-	int call_count = -1;</div><div class='del'>-	int i = 0;</div><div class='del'>-</div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-	priv = this-&gt;private;</div><div class='del'>-</div><div class='del'>-	call_count = afr_up_children_count (priv-&gt;child_count, local-&gt;child_up);</div><div class='del'>-</div><div class='del'>-	if (call_count == 0) {</div><div class='del'>-		local-&gt;transaction.resume (frame, this);</div><div class='del'>-		return 0;</div><div class='del'>-	}</div><div class='add'>+    int count = 0;</div><div class='add'>+    int ret = -ENOMEM;</div><div class='add'>+    int idx = -1;</div><div class='add'>+    int d_idx = -1;</div><div class='add'>+    unsigned char *locked_nodes = NULL;</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+</div><div class='add'>+    locked_nodes = alloca0(priv-&gt;child_count);</div><div class='add'>+</div><div class='add'>+    idx = afr_index_for_transaction_type(type);</div><div class='add'>+    d_idx = afr_index_for_transaction_type(AFR_DATA_TRANSACTION);</div><div class='add'>+</div><div class='add'>+    local-&gt;pending = afr_matrix_create(priv-&gt;child_count, AFR_NUM_CHANGE_LOGS);</div><div class='add'>+    if (!local-&gt;pending)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    local-&gt;pending[empty_index][idx] = hton32(1);</div><div class='add'>+</div><div class='add'>+    if ((priv-&gt;esh_granular) &amp;&amp; (type == AFR_ENTRY_TRANSACTION))</div><div class='add'>+        local-&gt;pending[empty_index][d_idx] = hton32(1);</div><div class='add'>+</div><div class='add'>+    local-&gt;xdata_req = dict_new();</div><div class='add'>+    if (!local-&gt;xdata_req)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    ret = dict_set_nstrn(local-&gt;xdata_req, "replicate-brick-op",</div><div class='add'>+                         SLEN("replicate-brick-op"), op_type, op_type_len);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    local-&gt;xattr_req = dict_new();</div><div class='add'>+    if (!local-&gt;xattr_req)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    ret = afr_set_pending_dict(priv, local-&gt;xattr_req, local-&gt;pending);</div><div class='add'>+    if (ret &lt; 0)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    if (AFR_ENTRY_TRANSACTION == type) {</div><div class='add'>+        count = afr_selfheal_entrylk(frame, this, loc-&gt;inode, this-&gt;name, NULL,</div><div class='add'>+                                     locked_nodes);</div><div class='add'>+    } else {</div><div class='add'>+        count = afr_selfheal_inodelk(frame, this, loc-&gt;inode, this-&gt;name,</div><div class='add'>+                                     LLONG_MAX - 1, 0, locked_nodes);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (!count) {</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_ERROR, EAGAIN, AFR_MSG_REPLACE_BRICK_STATUS,</div><div class='add'>+                NULL);</div><div class='add'>+        ret = -EAGAIN;</div><div class='add'>+        goto unlock;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = afr_emptyb_set_pending_changelog(frame, this, locked_nodes);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto unlock;</div><div class='add'>+    ret = 0;</div><div class='add'>+unlock:</div><div class='add'>+    if (AFR_ENTRY_TRANSACTION == type) {</div><div class='add'>+        afr_selfheal_unentrylk(frame, this, loc-&gt;inode, this-&gt;name, NULL,</div><div class='add'>+                               locked_nodes, NULL);</div><div class='add'>+    } else {</div><div class='add'>+        afr_selfheal_uninodelk(frame, this, loc-&gt;inode, this-&gt;name,</div><div class='add'>+                               LLONG_MAX - 1, 0, locked_nodes);</div><div class='add'>+    }</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	local-&gt;call_count = call_count;</div><div class='add'>+void</div><div class='add'>+afr_brick_args_cleanup(void *opaque)</div><div class='add'>+{</div><div class='add'>+    afr_empty_brick_args_t *data = NULL;</div><div class='ctx'> </div><div class='del'>-	for (i = 0; i &lt; priv-&gt;child_count; i++) {				</div><div class='del'>-		if (local-&gt;child_up[i]) {</div><div class='del'>-			STACK_WIND_COOKIE (frame, afr_ftruncate_wind_cbk,</div><div class='del'>-					   (void *) (long) i,	</div><div class='del'>-					   priv-&gt;children[i], </div><div class='del'>-					   priv-&gt;children[i]-&gt;fops-&gt;ftruncate,</div><div class='del'>-					   local-&gt;fd, local-&gt;cont.ftruncate.offset);</div><div class='add'>+    data = opaque;</div><div class='add'>+    loc_wipe(&amp;data-&gt;loc);</div><div class='add'>+    GF_FREE(data);</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-			if (!--call_count)</div><div class='del'>-				break;</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='del'>-	</div><div class='del'>-	return 0;</div><div class='add'>+int</div><div class='add'>+_afr_handle_empty_brick_cbk(int ret, call_frame_t *frame, void *opaque)</div><div class='add'>+{</div><div class='add'>+    afr_brick_args_cleanup(opaque);</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+int</div><div class='add'>+_afr_handle_empty_brick(void *opaque)</div><div class='add'>+{</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    int empty_index = -1;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int op_errno = ENOMEM;</div><div class='add'>+    call_frame_t *frame = NULL;</div><div class='add'>+    xlator_t *this = NULL;</div><div class='add'>+    char *op_type = NULL;</div><div class='add'>+    int op_type_len = 0;</div><div class='add'>+    afr_empty_brick_args_t *data = NULL;</div><div class='add'>+    call_frame_t *op_frame = NULL;</div><div class='add'>+</div><div class='add'>+    data = opaque;</div><div class='add'>+    frame = data-&gt;frame;</div><div class='add'>+    empty_index = data-&gt;empty_index;</div><div class='add'>+    if (!data-&gt;op_type)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    op_frame = copy_frame(frame);</div><div class='add'>+    if (!op_frame) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        op_errno = ENOMEM;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    op_type = data-&gt;op_type;</div><div class='add'>+    op_type_len = strlen(op_type);</div><div class='add'>+    this = op_frame-&gt;this;</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    afr_set_lk_owner(op_frame, this, op_frame-&gt;root);</div><div class='add'>+    local = AFR_FRAME_INIT(op_frame, op_errno);</div><div class='add'>+    if (!local)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    loc_copy(&amp;local-&gt;loc, &amp;data-&gt;loc);</div><div class='add'>+</div><div class='add'>+    gf_smsg(this-&gt;name, GF_LOG_INFO, 0, AFR_MSG_NEW_BRICK, "name=%s",</div><div class='add'>+            priv-&gt;children[empty_index]-&gt;name, NULL);</div><div class='add'>+</div><div class='add'>+    ret = _afr_handle_empty_brick_type(this, op_frame, &amp;local-&gt;loc, empty_index,</div><div class='add'>+                                       AFR_METADATA_TRANSACTION, op_type,</div><div class='add'>+                                       op_type_len);</div><div class='add'>+    if (ret) {</div><div class='add'>+        op_errno = -ret;</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    dict_unref(local-&gt;xdata_req);</div><div class='add'>+    dict_unref(local-&gt;xattr_req);</div><div class='add'>+    afr_matrix_cleanup(local-&gt;pending, priv-&gt;child_count);</div><div class='add'>+    local-&gt;pending = NULL;</div><div class='add'>+    local-&gt;xattr_req = NULL;</div><div class='add'>+    local-&gt;xdata_req = NULL;</div><div class='add'>+</div><div class='add'>+    ret = _afr_handle_empty_brick_type(this, op_frame, &amp;local-&gt;loc, empty_index,</div><div class='add'>+                                       AFR_ENTRY_TRANSACTION, op_type,</div><div class='add'>+                                       op_type_len);</div><div class='add'>+    if (ret) {</div><div class='add'>+        op_errno = -ret;</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    ret = 0;</div><div class='add'>+out:</div><div class='add'>+    if (op_frame) {</div><div class='add'>+        AFR_STACK_DESTROY(op_frame);</div><div class='add'>+    }</div><div class='add'>+    AFR_STACK_UNWIND(setxattr, frame, ret, op_errno, NULL);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-afr_ftruncate_done (call_frame_t *frame, xlator_t *this)</div><div class='add'>+afr_split_brain_resolve_do(call_frame_t *frame, xlator_t *this, loc_t *loc,</div><div class='add'>+                           char *data)</div><div class='ctx'> {</div><div class='del'>-	afr_local_t *local = NULL;</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int op_errno = EINVAL;</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    local-&gt;xdata_req = dict_new();</div><div class='add'>+</div><div class='add'>+    if (!local-&gt;xdata_req) {</div><div class='add'>+        op_errno = ENOMEM;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_set_int32_sizen(local-&gt;xdata_req, "heal-op",</div><div class='add'>+                               GF_SHD_OP_SBRAIN_HEAL_FROM_BRICK);</div><div class='add'>+    if (ret) {</div><div class='add'>+        op_errno = -ret;</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    ret = dict_set_str_sizen(local-&gt;xdata_req, "child-name", data);</div><div class='add'>+    if (ret) {</div><div class='add'>+        op_errno = -ret;</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    /* set spb choice to -1 whether heal succeeds or not:</div><div class='add'>+     * If heal succeeds : spb-choice should be set to -1 as</div><div class='add'>+     *                    it is no longer valid; file is not</div><div class='add'>+     *                    in split-brain anymore.</div><div class='add'>+     * If heal doesn't succeed:</div><div class='add'>+     *                    spb-choice should be set to -1</div><div class='add'>+     *                    otherwise reads will be served</div><div class='add'>+     *                    from spb-choice which is misleading.</div><div class='add'>+     */</div><div class='add'>+    ret = afr_inode_split_brain_choice_set(loc-&gt;inode, this, -1);</div><div class='add'>+    if (ret)</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_WARNING, 0, AFR_MSG_SPLIT_BRAIN_SET_FAILED,</div><div class='add'>+                NULL);</div><div class='add'>+    afr_heal_splitbrain_file(frame, this, loc);</div><div class='add'>+    ret = 0;</div><div class='add'>+out:</div><div class='add'>+    if (ret &lt; 0)</div><div class='add'>+        AFR_STACK_UNWIND(setxattr, frame, -1, op_errno, NULL);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	local = frame-&gt;local;</div><div class='add'>+int</div><div class='add'>+afr_get_split_brain_child_index(xlator_t *this, void *value, size_t len)</div><div class='add'>+{</div><div class='add'>+    int spb_child_index = -1;</div><div class='add'>+    char *spb_child_str = NULL;</div><div class='ctx'> </div><div class='del'>-	local-&gt;transaction.unwind (frame, this);</div><div class='add'>+    spb_child_str = alloca0(len + 1);</div><div class='add'>+    memcpy(spb_child_str, value, len);</div><div class='ctx'> </div><div class='del'>-	AFR_STACK_DESTROY (frame);</div><div class='add'>+    if (!strcmp(spb_child_str, "none"))</div><div class='add'>+        return -2;</div><div class='ctx'> </div><div class='del'>-	return 0;</div><div class='add'>+    spb_child_index = afr_get_child_index_from_name(this, spb_child_str);</div><div class='add'>+    if (spb_child_index &lt; 0) {</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_ERROR, 0, AFR_MSG_INVALID_SUBVOL,</div><div class='add'>+                "subvol=%s", spb_child_str, NULL);</div><div class='add'>+    }</div><div class='add'>+    return spb_child_index;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+int</div><div class='add'>+afr_can_set_split_brain_choice(void *opaque)</div><div class='add'>+{</div><div class='add'>+    afr_spbc_timeout_t *data = opaque;</div><div class='add'>+    call_frame_t *frame = NULL;</div><div class='add'>+    xlator_t *this = NULL;</div><div class='add'>+    loc_t *loc = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    frame = data-&gt;frame;</div><div class='add'>+    loc = data-&gt;loc;</div><div class='add'>+    this = frame-&gt;this;</div><div class='add'>+</div><div class='add'>+    ret = afr_is_split_brain(frame, this, loc-&gt;inode, loc-&gt;gfid, &amp;data-&gt;d_spb,</div><div class='add'>+                             &amp;data-&gt;m_spb);</div><div class='add'>+</div><div class='add'>+    if (ret)</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_ERROR, 0,</div><div class='add'>+                AFR_MSG_SPLIT_BRAIN_DETERMINE_FAILED, "gfid=%s",</div><div class='add'>+                uuid_utoa(loc-&gt;gfid), NULL);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-afr_do_ftruncate (call_frame_t *frame, xlator_t *this)</div><div class='add'>+afr_handle_split_brain_commands(xlator_t *this, call_frame_t *frame, loc_t *loc,</div><div class='add'>+                                dict_t *dict)</div><div class='ctx'> {</div><div class='del'>-        call_frame_t * transaction_frame = NULL;</div><div class='del'>-        afr_local_t *  local             = NULL;</div><div class='add'>+    void *choice_value = NULL;</div><div class='add'>+    void *resolve_value = NULL;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    afr_spbc_timeout_t *data = NULL;</div><div class='add'>+    int len = 0;</div><div class='add'>+    int spb_child_index = -1;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int op_errno = EINVAL;</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    ret = dict_get_ptr_and_len(dict, GF_AFR_SBRAIN_CHOICE, &amp;choice_value, &amp;len);</div><div class='add'>+    ret = dict_get_ptr_and_len(dict, GF_AFR_SBRAIN_RESOLVE, &amp;resolve_value,</div><div class='add'>+                               &amp;len);</div><div class='add'>+    if (!choice_value &amp;&amp; !resolve_value) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    local = AFR_FRAME_INIT(frame, op_errno);</div><div class='add'>+    if (!local) {</div><div class='add'>+        ret = 1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    local-&gt;op = GF_FOP_SETXATTR;</div><div class='add'>+</div><div class='add'>+    if (choice_value) {</div><div class='add'>+        spb_child_index = afr_get_split_brain_child_index(this, choice_value,</div><div class='add'>+                                                          len);</div><div class='add'>+        if (spb_child_index &lt; 0) {</div><div class='add'>+            /* Case where value was "none" */</div><div class='add'>+            if (spb_child_index == -2)</div><div class='add'>+                spb_child_index = -1;</div><div class='add'>+            else {</div><div class='add'>+                ret = 1;</div><div class='add'>+                op_errno = EINVAL;</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        data = GF_CALLOC(1, sizeof(*data), gf_afr_mt_spbc_timeout_t);</div><div class='add'>+        if (!data) {</div><div class='add'>+            ret = 1;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+        data-&gt;spb_child_index = spb_child_index;</div><div class='add'>+        data-&gt;frame = frame;</div><div class='add'>+        loc_copy(&amp;local-&gt;loc, loc);</div><div class='add'>+        data-&gt;loc = &amp;local-&gt;loc;</div><div class='add'>+        ret = synctask_new(this-&gt;ctx-&gt;env, afr_can_set_split_brain_choice,</div><div class='add'>+                           afr_set_split_brain_choice, NULL, data);</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_smsg(this-&gt;name, GF_LOG_ERROR, 0, AFR_MSG_SPLIT_BRAIN_STATUS,</div><div class='add'>+                    "name=%s", loc-&gt;name, NULL);</div><div class='add'>+            ret = 1;</div><div class='add'>+            op_errno = ENOMEM;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+        ret = 0;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (resolve_value) {</div><div class='add'>+        spb_child_index = afr_get_split_brain_child_index(this, resolve_value,</div><div class='add'>+                                                          len);</div><div class='add'>+        if (spb_child_index &lt; 0) {</div><div class='add'>+            ret = 1;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-        int op_ret   = -1;</div><div class='del'>-        int op_errno = 0;</div><div class='add'>+        afr_split_brain_resolve_do(frame, this, loc,</div><div class='add'>+                                   priv-&gt;children[spb_child_index]-&gt;name);</div><div class='add'>+        ret = 0;</div><div class='add'>+    }</div><div class='add'>+out:</div><div class='add'>+    /* key was correct but value was invalid when ret == 1 */</div><div class='add'>+    if (ret == 1) {</div><div class='add'>+        AFR_STACK_UNWIND(setxattr, frame, -1, op_errno, NULL);</div><div class='add'>+        if (data)</div><div class='add'>+            GF_FREE(data);</div><div class='add'>+        ret = 0;</div><div class='add'>+    }</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        local = frame-&gt;local;</div><div class='add'>+int</div><div class='add'>+afr_handle_spb_choice_timeout(xlator_t *this, call_frame_t *frame, dict_t *dict)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int op_errno = 0;</div><div class='add'>+    uint64_t timeout = 0;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='ctx'> </div><div class='del'>-	transaction_frame = copy_frame (frame);</div><div class='del'>-	if (!transaction_frame) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-			"Out of memory.");</div><div class='del'>-		goto out;</div><div class='del'>-	}</div><div class='add'>+    priv = this-&gt;private;</div><div class='ctx'> </div><div class='del'>-        transaction_frame-&gt;local = local;</div><div class='del'>-        frame-&gt;local = NULL;</div><div class='add'>+    ret = dict_get_uint64(dict, GF_AFR_SPB_CHOICE_TIMEOUT, &amp;timeout);</div><div class='add'>+    if (!ret) {</div><div class='add'>+        priv-&gt;spb_choice_timeout = timeout * 60;</div><div class='add'>+        AFR_STACK_UNWIND(setxattr, frame, ret, op_errno, NULL);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	local-&gt;op = GF_FOP_FTRUNCATE;</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	local-&gt;transaction.fop    = afr_ftruncate_wind;</div><div class='del'>-	local-&gt;transaction.done   = afr_ftruncate_done;</div><div class='del'>-	local-&gt;transaction.unwind = afr_ftruncate_unwind;</div><div class='add'>+int</div><div class='add'>+afr_handle_empty_brick(xlator_t *this, call_frame_t *frame, loc_t *loc,</div><div class='add'>+                       dict_t *dict)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int ab_ret = -1;</div><div class='add'>+    int empty_index = -1;</div><div class='add'>+    int op_errno = EPERM;</div><div class='add'>+    char *empty_brick = NULL;</div><div class='add'>+    char *op_type = NULL;</div><div class='add'>+    afr_empty_brick_args_t *data = NULL;</div><div class='add'>+</div><div class='add'>+    ret = dict_get_str_sizen(dict, GF_AFR_REPLACE_BRICK, &amp;empty_brick);</div><div class='add'>+    if (!ret)</div><div class='add'>+        op_type = GF_AFR_REPLACE_BRICK;</div><div class='add'>+</div><div class='add'>+    ab_ret = dict_get_str_sizen(dict, GF_AFR_ADD_BRICK, &amp;empty_brick);</div><div class='add'>+    if (!ab_ret)</div><div class='add'>+        op_type = GF_AFR_ADD_BRICK;</div><div class='add'>+</div><div class='add'>+    if (ret &amp;&amp; ab_ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    if (frame-&gt;root-&gt;pid != GF_CLIENT_PID_ADD_REPLICA_MOUNT) {</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_ERROR, EPERM, AFR_MSG_INTERNAL_ATTR,</div><div class='add'>+                "op_type=%s", op_type, NULL);</div><div class='add'>+        ret = 1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    empty_index = afr_get_child_index_from_name(this, empty_brick);</div><div class='add'>+</div><div class='add'>+    if (empty_index &lt; 0) {</div><div class='add'>+        /* Didn't belong to this replica pair</div><div class='add'>+         * Just do a no-op</div><div class='add'>+         */</div><div class='add'>+        AFR_STACK_UNWIND(setxattr, frame, 0, 0, NULL);</div><div class='add'>+        return 0;</div><div class='add'>+    } else {</div><div class='add'>+        data = GF_CALLOC(1, sizeof(*data), gf_afr_mt_empty_brick_t);</div><div class='add'>+        if (!data) {</div><div class='add'>+            ret = 1;</div><div class='add'>+            op_errno = ENOMEM;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+        data-&gt;frame = frame;</div><div class='add'>+        loc_copy(&amp;data-&gt;loc, loc);</div><div class='add'>+        data-&gt;empty_index = empty_index;</div><div class='add'>+        data-&gt;op_type = op_type;</div><div class='add'>+        ret = synctask_new(this-&gt;ctx-&gt;env, _afr_handle_empty_brick,</div><div class='add'>+                           _afr_handle_empty_brick_cbk, NULL, data);</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_smsg(this-&gt;name, GF_LOG_ERROR, 0, AFR_MSG_SPLIT_BRAIN_STATUS,</div><div class='add'>+                    NULL);</div><div class='add'>+            ret = 1;</div><div class='add'>+            op_errno = ENOMEM;</div><div class='add'>+            afr_brick_args_cleanup(data);</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    ret = 0;</div><div class='add'>+out:</div><div class='add'>+    if (ret == 1) {</div><div class='add'>+        AFR_STACK_UNWIND(setxattr, frame, -1, op_errno, NULL);</div><div class='add'>+        ret = 0;</div><div class='add'>+    }</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	local-&gt;transaction.main_frame = frame;</div><div class='add'>+static int</div><div class='add'>+afr_handle_special_xattr(xlator_t *this, call_frame_t *frame, loc_t *loc,</div><div class='add'>+                         dict_t *dict)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='ctx'> </div><div class='del'>-	local-&gt;transaction.start   = 0;</div><div class='del'>-	local-&gt;transaction.len     = local-&gt;cont.ftruncate.offset;</div><div class='add'>+    ret = afr_handle_split_brain_commands(this, frame, loc, dict);</div><div class='add'>+    if (ret == 0)</div><div class='add'>+        goto out;</div><div class='ctx'> </div><div class='del'>-	afr_transaction (transaction_frame, this, AFR_DATA_TRANSACTION);</div><div class='add'>+    ret = afr_handle_spb_choice_timeout(this, frame, dict);</div><div class='add'>+    if (ret == 0)</div><div class='add'>+        goto out;</div><div class='ctx'> </div><div class='del'>-        op_ret = 0;</div><div class='add'>+    /* Applicable for replace-brick and add-brick commands */</div><div class='add'>+    ret = afr_handle_empty_brick(this, frame, loc, dict);</div><div class='ctx'> out:</div><div class='del'>-	if (op_ret == -1) {</div><div class='del'>-		if (transaction_frame)</div><div class='del'>-			AFR_STACK_DESTROY (transaction_frame);</div><div class='del'>-		AFR_STACK_UNWIND (ftruncate, frame, op_ret, op_errno, NULL, NULL);</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-        return 0;</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-afr_ftruncate (call_frame_t *frame, xlator_t *this,</div><div class='del'>-	       fd_t *fd, off_t offset)</div><div class='add'>+afr_setxattr(call_frame_t *frame, xlator_t *this, loc_t *loc, dict_t *dict,</div><div class='add'>+             int32_t flags, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-	afr_private_t * priv  = NULL;</div><div class='del'>-	afr_local_t   * local = NULL;</div><div class='del'>-	call_frame_t   *transaction_frame = NULL;</div><div class='del'>-</div><div class='del'>-	int ret = -1;</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    call_frame_t *transaction_frame = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int op_errno = EINVAL;</div><div class='ctx'> </div><div class='del'>-	int op_ret   = -1;</div><div class='del'>-	int op_errno = 0;</div><div class='add'>+    GF_IF_INTERNAL_XATTR_GOTO("trusted.afr.*", dict, op_errno, out);</div><div class='ctx'> </div><div class='del'>-        uint64_t ctx;</div><div class='del'>-        afr_fd_ctx_t *fd_ctx = NULL;</div><div class='add'>+    GF_IF_INTERNAL_XATTR_GOTO("trusted.glusterfs.afr.*", dict, op_errno, out);</div><div class='ctx'> </div><div class='del'>-	VALIDATE_OR_GOTO (frame, out);</div><div class='del'>-	VALIDATE_OR_GOTO (this, out);</div><div class='del'>-	VALIDATE_OR_GOTO (this-&gt;private, out);</div><div class='add'>+    ret = afr_handle_special_xattr(this, frame, loc, dict);</div><div class='add'>+    if (ret == 0)</div><div class='add'>+        return 0;</div><div class='ctx'> </div><div class='del'>-	priv = this-&gt;private;</div><div class='add'>+    transaction_frame = copy_frame(frame);</div><div class='add'>+    if (!transaction_frame)</div><div class='add'>+        goto out;</div><div class='ctx'> </div><div class='del'>-	ALLOC_OR_GOTO (local, afr_local_t, out);</div><div class='add'>+    local = AFR_FRAME_INIT(transaction_frame, op_errno);</div><div class='add'>+    if (!local)</div><div class='add'>+        goto out;</div><div class='ctx'> </div><div class='del'>-	ret = AFR_LOCAL_INIT (local, priv);</div><div class='del'>-	if (ret &lt; 0) {</div><div class='del'>-		op_errno = -ret;</div><div class='del'>-		goto out;</div><div class='del'>-	}</div><div class='add'>+    local-&gt;cont.setxattr.dict = dict_ref(dict);</div><div class='add'>+    local-&gt;cont.setxattr.flags = flags;</div><div class='add'>+    if (xdata)</div><div class='add'>+        local-&gt;xdata_req = dict_copy_with_ref(xdata, NULL);</div><div class='add'>+    else</div><div class='add'>+        local-&gt;xdata_req = dict_new();</div><div class='ctx'> </div><div class='del'>-        frame-&gt;local = local;</div><div class='add'>+    if (!local-&gt;xdata_req)</div><div class='add'>+        goto out;</div><div class='ctx'> </div><div class='del'>-	local-&gt;cont.ftruncate.offset  = offset;</div><div class='del'>-	local-&gt;cont.ftruncate.ino     = fd-&gt;inode-&gt;ino;</div><div class='add'>+    local-&gt;transaction.wind = afr_setxattr_wind;</div><div class='add'>+    local-&gt;transaction.unwind = afr_setxattr_unwind;</div><div class='ctx'> </div><div class='del'>-	local-&gt;fd = fd_ref (fd);</div><div class='add'>+    loc_copy(&amp;local-&gt;loc, loc);</div><div class='add'>+    ret = afr_set_inode_local(this, local, loc-&gt;inode);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='ctx'> </div><div class='del'>-        ret = fd_ctx_get (fd, this, &amp;ctx);</div><div class='del'>-        if (ret &lt; 0) {</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='add'>+    local-&gt;transaction.main_frame = frame;</div><div class='add'>+    local-&gt;transaction.start = LLONG_MAX - 1;</div><div class='add'>+    local-&gt;transaction.len = 0;</div><div class='ctx'> </div><div class='del'>-        fd_ctx = (afr_fd_ctx_t *)(long) ctx;</div><div class='add'>+    local-&gt;op = GF_FOP_SETXATTR;</div><div class='ctx'> </div><div class='del'>-        if (fd_ctx-&gt;down_count &lt; priv-&gt;down_count) {</div><div class='del'>-                local-&gt;up_down_flush_cbk = afr_do_ftruncate;</div><div class='del'>-                afr_up_down_flush (frame, this, fd, AFR_CHILD_DOWN_FLUSH);</div><div class='del'>-        } else {</div><div class='del'>-                afr_do_ftruncate (frame, this);</div><div class='del'>-        }</div><div class='add'>+    ret = afr_transaction(transaction_frame, this, AFR_METADATA_TRANSACTION);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        op_errno = -ret;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	op_ret = 0;</div><div class='add'>+    return 0;</div><div class='ctx'> out:</div><div class='del'>-	if (op_ret == -1) {</div><div class='del'>-		if (transaction_frame)</div><div class='del'>-			AFR_STACK_DESTROY (transaction_frame);</div><div class='del'>-		AFR_STACK_UNWIND (ftruncate, frame, op_ret, op_errno, NULL, NULL);</div><div class='del'>-	}</div><div class='add'>+    if (transaction_frame)</div><div class='add'>+        AFR_STACK_DESTROY(transaction_frame);</div><div class='ctx'> </div><div class='del'>-	return 0;</div><div class='add'>+    AFR_STACK_UNWIND(setxattr, frame, -1, op_errno, NULL);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-/* }}} */</div><div class='del'>-</div><div class='del'>-/* {{{ setattr */</div><div class='add'>+/* {{{ fsetxattr */</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-afr_setattr_unwind (call_frame_t *frame, xlator_t *this)</div><div class='add'>+afr_fsetxattr_unwind(call_frame_t *frame, xlator_t *this)</div><div class='ctx'> {</div><div class='del'>-	afr_local_t *   local = NULL;</div><div class='del'>-	call_frame_t   *main_frame = NULL;</div><div class='del'>-</div><div class='del'>-	local = frame-&gt;local;</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    call_frame_t *main_frame = NULL;</div><div class='ctx'> </div><div class='del'>-	LOCK (&amp;frame-&gt;lock);</div><div class='del'>-	{</div><div class='del'>-		if (local-&gt;transaction.main_frame)</div><div class='del'>-			main_frame = local-&gt;transaction.main_frame;</div><div class='del'>-		local-&gt;transaction.main_frame = NULL;</div><div class='del'>-	}</div><div class='del'>-	UNLOCK (&amp;frame-&gt;lock);</div><div class='add'>+    local = frame-&gt;local;</div><div class='ctx'> </div><div class='del'>-	if (main_frame) {</div><div class='del'>-                local-&gt;cont.setattr.preop_buf.ia_ino  = local-&gt;cont.setattr.ino;</div><div class='del'>-                local-&gt;cont.setattr.postop_buf.ia_ino = local-&gt;cont.setattr.ino;</div><div class='del'>-</div><div class='del'>-                AFR_STACK_UNWIND (setattr, main_frame, local-&gt;op_ret,</div><div class='del'>-                                  local-&gt;op_errno,</div><div class='del'>-                                  &amp;local-&gt;cont.setattr.preop_buf,</div><div class='del'>-                                  &amp;local-&gt;cont.setattr.postop_buf);</div><div class='del'>-        }</div><div class='add'>+    main_frame = afr_transaction_detach_fop_frame(frame);</div><div class='add'>+    if (!main_frame)</div><div class='add'>+        return 0;</div><div class='ctx'> </div><div class='del'>-	return 0;</div><div class='add'>+    AFR_STACK_UNWIND(fsetxattr, main_frame, local-&gt;op_ret, local-&gt;op_errno,</div><div class='add'>+                     local-&gt;xdata_rsp);</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-afr_setattr_wind_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-                      int32_t op_ret, int32_t op_errno,</div><div class='del'>-                      struct iatt *preop, struct iatt *postop)</div><div class='add'>+afr_fsetxattr_wind_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                       int32_t op_ret, int32_t op_errno, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-	afr_local_t *   local = NULL;</div><div class='del'>-	afr_private_t * priv  = NULL;</div><div class='del'>-</div><div class='del'>-	int child_index = (long) cookie;</div><div class='del'>-        int read_child  = 0;</div><div class='del'>-	int call_count  = -1;</div><div class='del'>-	int need_unwind = 0;</div><div class='add'>+    return __afr_inode_write_cbk(frame, cookie, this, op_ret, op_errno, NULL,</div><div class='add'>+                                 NULL, NULL, xdata);</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-	priv  = this-&gt;private;</div><div class='add'>+int</div><div class='add'>+afr_fsetxattr_wind(call_frame_t *frame, xlator_t *this, int subvol)</div><div class='add'>+{</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    STACK_WIND_COOKIE(frame, afr_fsetxattr_wind_cbk, (void *)(long)subvol,</div><div class='add'>+                      priv-&gt;children[subvol],</div><div class='add'>+                      priv-&gt;children[subvol]-&gt;fops-&gt;fsetxattr, local-&gt;fd,</div><div class='add'>+                      local-&gt;cont.fsetxattr.dict, local-&gt;cont.fsetxattr.flags,</div><div class='add'>+                      local-&gt;xdata_req);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        read_child = afr_read_child (this, local-&gt;loc.inode);</div><div class='add'>+int</div><div class='add'>+afr_fsetxattr(call_frame_t *frame, xlator_t *this, fd_t *fd, dict_t *dict,</div><div class='add'>+              int32_t flags, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    call_frame_t *transaction_frame = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int op_errno = ENOMEM;</div><div class='ctx'> </div><div class='del'>-	LOCK (&amp;frame-&gt;lock);</div><div class='del'>-	{</div><div class='del'>-                if (child_index == read_child) {</div><div class='del'>-                        local-&gt;read_child_returned = _gf_true;</div><div class='del'>-                }</div><div class='add'>+    GF_IF_INTERNAL_XATTR_GOTO("trusted.afr.*", dict, op_errno, out);</div><div class='ctx'> </div><div class='del'>-		if (afr_fop_failed (op_ret, op_errno))</div><div class='del'>-			afr_transaction_fop_failed (frame, this, child_index);</div><div class='add'>+    GF_IF_INTERNAL_XATTR_GOTO("trusted.glusterfs.afr.*", dict, op_errno, out);</div><div class='ctx'> </div><div class='del'>-		if (op_ret != -1) {</div><div class='del'>-			if (local-&gt;success_count == 0) {</div><div class='del'>-				local-&gt;op_ret = op_ret;</div><div class='del'>-				local-&gt;cont.setattr.preop_buf  = *preop;</div><div class='del'>-                                local-&gt;cont.setattr.postop_buf = *postop;</div><div class='del'>-			}</div><div class='add'>+    AFR_ERROR_OUT_IF_FDCTX_INVALID(fd, this, op_errno, out);</div><div class='add'>+    transaction_frame = copy_frame(frame);</div><div class='add'>+    if (!transaction_frame)</div><div class='add'>+        goto out;</div><div class='ctx'> </div><div class='del'>-                        if (child_index == read_child) {</div><div class='del'>-                                local-&gt;cont.setattr.preop_buf  = *preop;</div><div class='del'>-                                local-&gt;cont.setattr.postop_buf = *postop;</div><div class='del'>-                        }</div><div class='add'>+    local = AFR_FRAME_INIT(transaction_frame, op_errno);</div><div class='add'>+    if (!local)</div><div class='add'>+        goto out;</div><div class='ctx'> </div><div class='del'>-			local-&gt;success_count++;</div><div class='add'>+    local-&gt;cont.fsetxattr.dict = dict_ref(dict);</div><div class='add'>+    local-&gt;cont.fsetxattr.flags = flags;</div><div class='ctx'> </div><div class='del'>-			if ((local-&gt;success_count &gt;= priv-&gt;wait_count)</div><div class='del'>-                            &amp;&amp; local-&gt;read_child_returned) {</div><div class='del'>-				need_unwind = 1;</div><div class='del'>-			}</div><div class='del'>-		}</div><div class='del'>-		local-&gt;op_errno = op_errno;</div><div class='del'>-	}</div><div class='del'>-	UNLOCK (&amp;frame-&gt;lock);</div><div class='add'>+    if (xdata)</div><div class='add'>+        local-&gt;xdata_req = dict_copy_with_ref(xdata, NULL);</div><div class='add'>+    else</div><div class='add'>+        local-&gt;xdata_req = dict_new();</div><div class='ctx'> </div><div class='del'>-	if (need_unwind)</div><div class='del'>-		local-&gt;transaction.unwind (frame, this);</div><div class='add'>+    if (!local-&gt;xdata_req)</div><div class='add'>+        goto out;</div><div class='ctx'> </div><div class='del'>-	call_count = afr_frame_return (frame);</div><div class='add'>+    local-&gt;transaction.wind = afr_fsetxattr_wind;</div><div class='add'>+    local-&gt;transaction.unwind = afr_fsetxattr_unwind;</div><div class='ctx'> </div><div class='del'>-	if (call_count == 0) {</div><div class='del'>-		local-&gt;transaction.resume (frame, this);</div><div class='del'>-	}</div><div class='add'>+    local-&gt;fd = fd_ref(fd);</div><div class='add'>+    ret = afr_set_inode_local(this, local, fd-&gt;inode);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='ctx'> </div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='add'>+    local-&gt;op = GF_FOP_FSETXATTR;</div><div class='ctx'> </div><div class='add'>+    local-&gt;transaction.main_frame = frame;</div><div class='add'>+    local-&gt;transaction.start = LLONG_MAX - 1;</div><div class='add'>+    local-&gt;transaction.len = 0;</div><div class='ctx'> </div><div class='del'>-int32_t</div><div class='del'>-afr_setattr_wind (call_frame_t *frame, xlator_t *this)</div><div class='del'>-{</div><div class='del'>-	afr_local_t *local = NULL;</div><div class='del'>-	afr_private_t *priv = NULL;</div><div class='add'>+    ret = afr_transaction(transaction_frame, this, AFR_METADATA_TRANSACTION);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        op_errno = -ret;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	int call_count = -1;</div><div class='del'>-	int i = 0;</div><div class='add'>+    return 0;</div><div class='add'>+out:</div><div class='add'>+    if (transaction_frame)</div><div class='add'>+        AFR_STACK_DESTROY(transaction_frame);</div><div class='ctx'> </div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-	priv = this-&gt;private;</div><div class='add'>+    AFR_STACK_UNWIND(fsetxattr, frame, -1, op_errno, NULL);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	call_count = afr_up_children_count (priv-&gt;child_count, local-&gt;child_up);</div><div class='add'>+/* }}} */</div><div class='ctx'> </div><div class='del'>-	if (call_count == 0) {</div><div class='del'>-		local-&gt;transaction.resume (frame, this);</div><div class='del'>-		return 0;</div><div class='del'>-	}</div><div class='add'>+/* {{{ removexattr */</div><div class='ctx'> </div><div class='del'>-	local-&gt;call_count = call_count;</div><div class='add'>+int</div><div class='add'>+afr_removexattr_unwind(call_frame_t *frame, xlator_t *this)</div><div class='add'>+{</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    call_frame_t *main_frame = NULL;</div><div class='ctx'> </div><div class='del'>-	for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='del'>-		if (local-&gt;child_up[i]) {</div><div class='del'>-			STACK_WIND_COOKIE (frame, afr_setattr_wind_cbk,</div><div class='del'>-					   (void *) (long) i,</div><div class='del'>-					   priv-&gt;children[i],</div><div class='del'>-					   priv-&gt;children[i]-&gt;fops-&gt;setattr,</div><div class='del'>-					   &amp;local-&gt;loc,</div><div class='del'>-					   &amp;local-&gt;cont.setattr.in_buf,</div><div class='del'>-                                           local-&gt;cont.setattr.valid);</div><div class='add'>+    local = frame-&gt;local;</div><div class='ctx'> </div><div class='del'>-			if (!--call_count)</div><div class='del'>-				break;</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='add'>+    main_frame = afr_transaction_detach_fop_frame(frame);</div><div class='add'>+    if (!main_frame)</div><div class='add'>+        return 0;</div><div class='ctx'> </div><div class='del'>-	return 0;</div><div class='add'>+    AFR_STACK_UNWIND(removexattr, main_frame, local-&gt;op_ret, local-&gt;op_errno,</div><div class='add'>+                     local-&gt;xdata_rsp);</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-afr_setattr_done (call_frame_t *frame, xlator_t *this)</div><div class='add'>+afr_removexattr_wind_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                         int32_t op_ret, int32_t op_errno, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-	afr_local_t *local = NULL;</div><div class='del'>-</div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-</div><div class='del'>-	local-&gt;transaction.unwind (frame, this);</div><div class='del'>-</div><div class='del'>-	AFR_STACK_DESTROY (frame);</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='add'>+    return __afr_inode_write_cbk(frame, cookie, this, op_ret, op_errno, NULL,</div><div class='add'>+                                 NULL, NULL, xdata);</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-afr_setattr (call_frame_t *frame, xlator_t *this,</div><div class='del'>-             loc_t *loc, struct iatt *buf, int32_t valid)</div><div class='add'>+afr_removexattr_wind(call_frame_t *frame, xlator_t *this, int subvol)</div><div class='ctx'> {</div><div class='del'>-	afr_private_t * priv  = NULL;</div><div class='del'>-	afr_local_t   * local = NULL;</div><div class='del'>-	call_frame_t   *transaction_frame = NULL;</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='ctx'> </div><div class='del'>-	int ret = -1;</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    priv = this-&gt;private;</div><div class='ctx'> </div><div class='del'>-	int op_ret   = -1;</div><div class='del'>-	int op_errno = 0;</div><div class='add'>+    STACK_WIND_COOKIE(frame, afr_removexattr_wind_cbk, (void *)(long)subvol,</div><div class='add'>+                      priv-&gt;children[subvol],</div><div class='add'>+                      priv-&gt;children[subvol]-&gt;fops-&gt;removexattr, &amp;local-&gt;loc,</div><div class='add'>+                      local-&gt;cont.removexattr.name, local-&gt;xdata_req);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	VALIDATE_OR_GOTO (frame, out);</div><div class='del'>-	VALIDATE_OR_GOTO (this, out);</div><div class='del'>-	VALIDATE_OR_GOTO (this-&gt;private, out);</div><div class='add'>+int</div><div class='add'>+afr_removexattr(call_frame_t *frame, xlator_t *this, loc_t *loc,</div><div class='add'>+                const char *name, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    call_frame_t *transaction_frame = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int op_errno = ENOMEM;</div><div class='ctx'> </div><div class='del'>-	priv = this-&gt;private;</div><div class='add'>+    GF_IF_NATIVE_XATTR_GOTO("trusted.afr.*", name, op_errno, out);</div><div class='ctx'> </div><div class='del'>-	transaction_frame = copy_frame (frame);</div><div class='del'>-	if (!transaction_frame) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-			"Out of memory.");</div><div class='del'>-		goto out;</div><div class='del'>-	}</div><div class='add'>+    GF_IF_NATIVE_XATTR_GOTO("trusted.glusterfs.afr.*", name, op_errno, out);</div><div class='ctx'> </div><div class='del'>-	ALLOC_OR_GOTO (local, afr_local_t, out);</div><div class='add'>+    transaction_frame = copy_frame(frame);</div><div class='add'>+    if (!transaction_frame)</div><div class='add'>+        goto out;</div><div class='ctx'> </div><div class='del'>-	ret = AFR_LOCAL_INIT (local, priv);</div><div class='del'>-	if (ret &lt; 0) {</div><div class='del'>-		op_errno = -ret;</div><div class='del'>-		goto out;</div><div class='del'>-	}</div><div class='add'>+    local = AFR_FRAME_INIT(transaction_frame, op_errno);</div><div class='add'>+    if (!local)</div><div class='add'>+        goto out;</div><div class='ctx'> </div><div class='del'>-	transaction_frame-&gt;local = local;</div><div class='add'>+    local-&gt;cont.removexattr.name = gf_strdup(name);</div><div class='ctx'> </div><div class='del'>-	local-&gt;op_ret = -1;</div><div class='add'>+    if (xdata)</div><div class='add'>+        local-&gt;xdata_req = dict_copy_with_ref(xdata, NULL);</div><div class='add'>+    else</div><div class='add'>+        local-&gt;xdata_req = dict_new();</div><div class='ctx'> </div><div class='del'>-	local-&gt;cont.setattr.ino     = loc-&gt;inode-&gt;ino;</div><div class='add'>+    if (!local-&gt;xdata_req)</div><div class='add'>+        goto out;</div><div class='ctx'> </div><div class='del'>-        local-&gt;cont.setattr.in_buf = *buf;</div><div class='del'>-        local-&gt;cont.setattr.valid  = valid;</div><div class='add'>+    local-&gt;transaction.wind = afr_removexattr_wind;</div><div class='add'>+    local-&gt;transaction.unwind = afr_removexattr_unwind;</div><div class='ctx'> </div><div class='del'>-	local-&gt;transaction.fop    = afr_setattr_wind;</div><div class='del'>-	local-&gt;transaction.done   = afr_setattr_done;</div><div class='del'>-	local-&gt;transaction.unwind = afr_setattr_unwind;</div><div class='add'>+    loc_copy(&amp;local-&gt;loc, loc);</div><div class='add'>+    ret = afr_set_inode_local(this, local, loc-&gt;inode);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='ctx'> </div><div class='del'>-	loc_copy (&amp;local-&gt;loc, loc);</div><div class='add'>+    local-&gt;op = GF_FOP_REMOVEXATTR;</div><div class='ctx'> </div><div class='del'>-	local-&gt;transaction.main_frame = frame;</div><div class='del'>-	local-&gt;transaction.start   = LLONG_MAX - 1;</div><div class='del'>-	local-&gt;transaction.len     = 0;</div><div class='add'>+    local-&gt;transaction.main_frame = frame;</div><div class='add'>+    local-&gt;transaction.start = LLONG_MAX - 1;</div><div class='add'>+    local-&gt;transaction.len = 0;</div><div class='ctx'> </div><div class='del'>-	afr_transaction (transaction_frame, this, AFR_METADATA_TRANSACTION);</div><div class='add'>+    ret = afr_transaction(transaction_frame, this, AFR_METADATA_TRANSACTION);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        op_errno = -ret;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	op_ret = 0;</div><div class='add'>+    return 0;</div><div class='ctx'> out:</div><div class='del'>-	if (op_ret == -1) {</div><div class='del'>-		if (transaction_frame)</div><div class='del'>-			AFR_STACK_DESTROY (transaction_frame);</div><div class='del'>-		AFR_STACK_UNWIND (setattr, frame, op_ret, op_errno, NULL, NULL);</div><div class='del'>-	}</div><div class='add'>+    if (transaction_frame)</div><div class='add'>+        AFR_STACK_DESTROY(transaction_frame);</div><div class='ctx'> </div><div class='del'>-	return 0;</div><div class='add'>+    AFR_STACK_UNWIND(removexattr, frame, -1, op_errno, NULL);</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-/* {{{ fsetattr */</div><div class='del'>-</div><div class='add'>+/* ffremovexattr */</div><div class='ctx'> int</div><div class='del'>-afr_fsetattr_unwind (call_frame_t *frame, xlator_t *this)</div><div class='add'>+afr_fremovexattr_unwind(call_frame_t *frame, xlator_t *this)</div><div class='ctx'> {</div><div class='del'>-	afr_local_t *   local = NULL;</div><div class='del'>-	call_frame_t   *main_frame = NULL;</div><div class='del'>-</div><div class='del'>-	local = frame-&gt;local;</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    call_frame_t *main_frame = NULL;</div><div class='ctx'> </div><div class='del'>-	LOCK (&amp;frame-&gt;lock);</div><div class='del'>-	{</div><div class='del'>-		if (local-&gt;transaction.main_frame)</div><div class='del'>-			main_frame = local-&gt;transaction.main_frame;</div><div class='del'>-		local-&gt;transaction.main_frame = NULL;</div><div class='del'>-	}</div><div class='del'>-	UNLOCK (&amp;frame-&gt;lock);</div><div class='add'>+    local = frame-&gt;local;</div><div class='ctx'> </div><div class='del'>-	if (main_frame) {</div><div class='del'>-                local-&gt;cont.fsetattr.preop_buf.ia_ino  =</div><div class='del'>-                        local-&gt;cont.fsetattr.ino;</div><div class='del'>-                local-&gt;cont.fsetattr.postop_buf.ia_ino =</div><div class='del'>-                        local-&gt;cont.fsetattr.ino;</div><div class='del'>-</div><div class='del'>-                AFR_STACK_UNWIND (fsetattr, main_frame, local-&gt;op_ret,</div><div class='del'>-                                  local-&gt;op_errno,</div><div class='del'>-                                  &amp;local-&gt;cont.fsetattr.preop_buf,</div><div class='del'>-                                  &amp;local-&gt;cont.fsetattr.postop_buf);</div><div class='del'>-        }</div><div class='add'>+    main_frame = afr_transaction_detach_fop_frame(frame);</div><div class='add'>+    if (!main_frame)</div><div class='add'>+        return 0;</div><div class='ctx'> </div><div class='del'>-	return 0;</div><div class='add'>+    AFR_STACK_UNWIND(fremovexattr, main_frame, local-&gt;op_ret, local-&gt;op_errno,</div><div class='add'>+                     local-&gt;xdata_rsp);</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-afr_fsetattr_wind_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-                      int32_t op_ret, int32_t op_errno,</div><div class='del'>-                      struct iatt *preop, struct iatt *postop)</div><div class='add'>+afr_fremovexattr_wind_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                          int32_t op_ret, int32_t op_errno, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-	afr_local_t *   local = NULL;</div><div class='del'>-	afr_private_t * priv  = NULL;</div><div class='del'>-</div><div class='del'>-	int child_index = (long) cookie;</div><div class='del'>-        int read_child  = 0;</div><div class='del'>-	int call_count  = -1;</div><div class='del'>-	int need_unwind = 0;</div><div class='del'>-</div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-	priv  = this-&gt;private;</div><div class='del'>-</div><div class='del'>-        read_child = afr_read_child (this, local-&gt;fd-&gt;inode);</div><div class='del'>-</div><div class='del'>-	LOCK (&amp;frame-&gt;lock);</div><div class='del'>-	{</div><div class='del'>-                if (child_index == read_child) {</div><div class='del'>-                        local-&gt;read_child_returned = _gf_true;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-		if (afr_fop_failed (op_ret, op_errno))</div><div class='del'>-			afr_transaction_fop_failed (frame, this, child_index);</div><div class='add'>+    return __afr_inode_write_cbk(frame, cookie, this, op_ret, op_errno, NULL,</div><div class='add'>+                                 NULL, NULL, xdata);</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-		if (op_ret != -1) {</div><div class='del'>-			if (local-&gt;success_count == 0) {</div><div class='del'>-				local-&gt;op_ret = op_ret;</div><div class='del'>-				local-&gt;cont.fsetattr.preop_buf  = *preop;</div><div class='del'>-                                local-&gt;cont.fsetattr.postop_buf = *postop;</div><div class='del'>-			}</div><div class='add'>+int</div><div class='add'>+afr_fremovexattr_wind(call_frame_t *frame, xlator_t *this, int subvol)</div><div class='add'>+{</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='ctx'> </div><div class='del'>-                        if (child_index == read_child) {</div><div class='del'>-                                local-&gt;cont.fsetattr.preop_buf  = *preop;</div><div class='del'>-                                local-&gt;cont.fsetattr.postop_buf = *postop;</div><div class='del'>-                        }</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    priv = this-&gt;private;</div><div class='ctx'> </div><div class='del'>-			local-&gt;success_count++;</div><div class='add'>+    STACK_WIND_COOKIE(frame, afr_fremovexattr_wind_cbk, (void *)(long)subvol,</div><div class='add'>+                      priv-&gt;children[subvol],</div><div class='add'>+                      priv-&gt;children[subvol]-&gt;fops-&gt;fremovexattr, local-&gt;fd,</div><div class='add'>+                      local-&gt;cont.removexattr.name, local-&gt;xdata_req);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-			if ((local-&gt;success_count &gt;= priv-&gt;wait_count)</div><div class='del'>-                            &amp;&amp; local-&gt;read_child_returned) {</div><div class='del'>-				need_unwind = 1;</div><div class='del'>-			}</div><div class='del'>-		}</div><div class='del'>-		local-&gt;op_errno = op_errno;</div><div class='del'>-	}</div><div class='del'>-	UNLOCK (&amp;frame-&gt;lock);</div><div class='add'>+int</div><div class='add'>+afr_fremovexattr(call_frame_t *frame, xlator_t *this, fd_t *fd,</div><div class='add'>+                 const char *name, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    call_frame_t *transaction_frame = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int op_errno = ENOMEM;</div><div class='ctx'> </div><div class='del'>-	if (need_unwind)</div><div class='del'>-		local-&gt;transaction.unwind (frame, this);</div><div class='add'>+    GF_IF_NATIVE_XATTR_GOTO("trusted.afr.*", name, op_errno, out);</div><div class='ctx'> </div><div class='del'>-	call_count = afr_frame_return (frame);</div><div class='add'>+    GF_IF_NATIVE_XATTR_GOTO("trusted.glusterfs.afr.*", name, op_errno, out);</div><div class='ctx'> </div><div class='del'>-	if (call_count == 0) {</div><div class='del'>-		local-&gt;transaction.resume (frame, this);</div><div class='del'>-	}</div><div class='add'>+    AFR_ERROR_OUT_IF_FDCTX_INVALID(fd, this, op_errno, out);</div><div class='add'>+    transaction_frame = copy_frame(frame);</div><div class='add'>+    if (!transaction_frame)</div><div class='add'>+        goto out;</div><div class='ctx'> </div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='add'>+    local = AFR_FRAME_INIT(transaction_frame, op_errno);</div><div class='add'>+    if (!local)</div><div class='add'>+        goto out;</div><div class='ctx'> </div><div class='add'>+    local-&gt;cont.removexattr.name = gf_strdup(name);</div><div class='add'>+    if (xdata)</div><div class='add'>+        local-&gt;xdata_req = dict_copy_with_ref(xdata, NULL);</div><div class='add'>+    else</div><div class='add'>+        local-&gt;xdata_req = dict_new();</div><div class='ctx'> </div><div class='del'>-int32_t</div><div class='del'>-afr_fsetattr_wind (call_frame_t *frame, xlator_t *this)</div><div class='del'>-{</div><div class='del'>-	afr_local_t *local = NULL;</div><div class='del'>-	afr_private_t *priv = NULL;</div><div class='add'>+    if (!local-&gt;xdata_req)</div><div class='add'>+        goto out;</div><div class='ctx'> </div><div class='del'>-	int call_count = -1;</div><div class='del'>-	int i = 0;</div><div class='add'>+    local-&gt;transaction.wind = afr_fremovexattr_wind;</div><div class='add'>+    local-&gt;transaction.unwind = afr_fremovexattr_unwind;</div><div class='ctx'> </div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-	priv = this-&gt;private;</div><div class='add'>+    local-&gt;fd = fd_ref(fd);</div><div class='add'>+    ret = afr_set_inode_local(this, local, fd-&gt;inode);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='ctx'> </div><div class='del'>-	call_count = afr_up_children_count (priv-&gt;child_count, local-&gt;child_up);</div><div class='add'>+    local-&gt;op = GF_FOP_FREMOVEXATTR;</div><div class='ctx'> </div><div class='del'>-	if (call_count == 0) {</div><div class='del'>-		local-&gt;transaction.resume (frame, this);</div><div class='del'>-		return 0;</div><div class='del'>-	}</div><div class='add'>+    local-&gt;transaction.main_frame = frame;</div><div class='add'>+    local-&gt;transaction.start = LLONG_MAX - 1;</div><div class='add'>+    local-&gt;transaction.len = 0;</div><div class='ctx'> </div><div class='del'>-	local-&gt;call_count = call_count;</div><div class='add'>+    ret = afr_transaction(transaction_frame, this, AFR_METADATA_TRANSACTION);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        op_errno = -ret;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='del'>-		if (local-&gt;child_up[i]) {</div><div class='del'>-			STACK_WIND_COOKIE (frame, afr_fsetattr_wind_cbk,</div><div class='del'>-					   (void *) (long) i,</div><div class='del'>-					   priv-&gt;children[i],</div><div class='del'>-					   priv-&gt;children[i]-&gt;fops-&gt;fsetattr,</div><div class='del'>-					   local-&gt;fd,</div><div class='del'>-					   &amp;local-&gt;cont.fsetattr.in_buf,</div><div class='del'>-                                           local-&gt;cont.fsetattr.valid);</div><div class='add'>+    return 0;</div><div class='add'>+out:</div><div class='add'>+    if (transaction_frame)</div><div class='add'>+        AFR_STACK_DESTROY(transaction_frame);</div><div class='ctx'> </div><div class='del'>-			if (!--call_count)</div><div class='del'>-				break;</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='add'>+    AFR_STACK_UNWIND(fremovexattr, frame, -1, op_errno, NULL);</div><div class='ctx'> </div><div class='del'>-	return 0;</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-afr_fsetattr_done (call_frame_t *frame, xlator_t *this)</div><div class='add'>+afr_fallocate_unwind(call_frame_t *frame, xlator_t *this)</div><div class='ctx'> {</div><div class='del'>-	afr_local_t *local = NULL;</div><div class='del'>-</div><div class='del'>-	local = frame-&gt;local;</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    call_frame_t *main_frame = NULL;</div><div class='ctx'> </div><div class='del'>-	local-&gt;transaction.unwind (frame, this);</div><div class='add'>+    local = frame-&gt;local;</div><div class='ctx'> </div><div class='del'>-	AFR_STACK_DESTROY (frame);</div><div class='add'>+    main_frame = afr_transaction_detach_fop_frame(frame);</div><div class='add'>+    if (!main_frame)</div><div class='add'>+        return 0;</div><div class='ctx'> </div><div class='del'>-	return 0;</div><div class='add'>+    AFR_STACK_UNWIND(fallocate, main_frame, local-&gt;op_ret, local-&gt;op_errno,</div><div class='add'>+                     &amp;local-&gt;cont.inode_wfop.prebuf,</div><div class='add'>+                     &amp;local-&gt;cont.inode_wfop.postbuf, local-&gt;xdata_rsp);</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-afr_fsetattr (call_frame_t *frame, xlator_t *this,</div><div class='del'>-              fd_t *fd, struct iatt *buf, int32_t valid)</div><div class='add'>+afr_fallocate_wind_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                       int32_t op_ret, int32_t op_errno, struct iatt *prebuf,</div><div class='add'>+                       struct iatt *postbuf, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-	afr_private_t * priv  = NULL;</div><div class='del'>-	afr_local_t   * local = NULL;</div><div class='del'>-	call_frame_t   *transaction_frame = NULL;</div><div class='del'>-</div><div class='del'>-	int ret = -1;</div><div class='add'>+    return __afr_inode_write_cbk(frame, cookie, this, op_ret, op_errno, prebuf,</div><div class='add'>+                                 postbuf, NULL, xdata);</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	int op_ret   = -1;</div><div class='del'>-	int op_errno = 0;</div><div class='add'>+int</div><div class='add'>+afr_fallocate_wind(call_frame_t *frame, xlator_t *this, int subvol)</div><div class='add'>+{</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    STACK_WIND_COOKIE(frame, afr_fallocate_wind_cbk, (void *)(long)subvol,</div><div class='add'>+                      priv-&gt;children[subvol],</div><div class='add'>+                      priv-&gt;children[subvol]-&gt;fops-&gt;fallocate, local-&gt;fd,</div><div class='add'>+                      local-&gt;cont.fallocate.mode, local-&gt;cont.fallocate.offset,</div><div class='add'>+                      local-&gt;cont.fallocate.len, local-&gt;xdata_req);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	VALIDATE_OR_GOTO (frame, out);</div><div class='del'>-	VALIDATE_OR_GOTO (this, out);</div><div class='del'>-	VALIDATE_OR_GOTO (this-&gt;private, out);</div><div class='add'>+int</div><div class='add'>+afr_fallocate(call_frame_t *frame, xlator_t *this, fd_t *fd, int32_t mode,</div><div class='add'>+              off_t offset, size_t len, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    call_frame_t *transaction_frame = NULL;</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int op_errno = ENOMEM;</div><div class='ctx'> </div><div class='del'>-	priv = this-&gt;private;</div><div class='add'>+    AFR_ERROR_OUT_IF_FDCTX_INVALID(fd, this, op_errno, out);</div><div class='add'>+    transaction_frame = copy_frame(frame);</div><div class='add'>+    if (!transaction_frame)</div><div class='add'>+        goto out;</div><div class='ctx'> </div><div class='del'>-	transaction_frame = copy_frame (frame);</div><div class='del'>-	if (!transaction_frame) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-			"Out of memory.");</div><div class='del'>-		goto out;</div><div class='del'>-	}</div><div class='add'>+    local = AFR_FRAME_INIT(transaction_frame, op_errno);</div><div class='add'>+    if (!local)</div><div class='add'>+        goto out;</div><div class='ctx'> </div><div class='del'>-	ALLOC_OR_GOTO (local, afr_local_t, out);</div><div class='add'>+    local-&gt;cont.fallocate.mode = mode;</div><div class='add'>+    local-&gt;cont.fallocate.offset = offset;</div><div class='add'>+    local-&gt;cont.fallocate.len = len;</div><div class='ctx'> </div><div class='del'>-	ret = AFR_LOCAL_INIT (local, priv);</div><div class='del'>-	if (ret &lt; 0) {</div><div class='del'>-		op_errno = -ret;</div><div class='del'>-		goto out;</div><div class='del'>-	}</div><div class='add'>+    local-&gt;fd = fd_ref(fd);</div><div class='add'>+    ret = afr_set_inode_local(this, local, fd-&gt;inode);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='ctx'> </div><div class='del'>-	transaction_frame-&gt;local = local;</div><div class='add'>+    if (xdata)</div><div class='add'>+        local-&gt;xdata_req = dict_copy_with_ref(xdata, NULL);</div><div class='add'>+    else</div><div class='add'>+        local-&gt;xdata_req = dict_new();</div><div class='ctx'> </div><div class='del'>-	local-&gt;op_ret = -1;</div><div class='add'>+    if (!local-&gt;xdata_req)</div><div class='add'>+        goto out;</div><div class='ctx'> </div><div class='del'>-	local-&gt;cont.fsetattr.ino     = fd-&gt;inode-&gt;ino;</div><div class='add'>+    local-&gt;op = GF_FOP_FALLOCATE;</div><div class='ctx'> </div><div class='del'>-        local-&gt;cont.fsetattr.in_buf = *buf;</div><div class='del'>-        local-&gt;cont.fsetattr.valid  = valid;</div><div class='add'>+    local-&gt;transaction.wind = afr_fallocate_wind;</div><div class='add'>+    local-&gt;transaction.unwind = afr_fallocate_unwind;</div><div class='ctx'> </div><div class='del'>-	local-&gt;transaction.fop    = afr_fsetattr_wind;</div><div class='del'>-	local-&gt;transaction.done   = afr_fsetattr_done;</div><div class='del'>-	local-&gt;transaction.unwind = afr_fsetattr_unwind;</div><div class='add'>+    local-&gt;transaction.main_frame = frame;</div><div class='ctx'> </div><div class='del'>-        local-&gt;fd                 = fd_ref (fd);</div><div class='add'>+    local-&gt;transaction.start = local-&gt;cont.fallocate.offset;</div><div class='add'>+    local-&gt;transaction.len = 0;</div><div class='ctx'> </div><div class='del'>-	local-&gt;transaction.main_frame = frame;</div><div class='del'>-	local-&gt;transaction.start   = LLONG_MAX - 1;</div><div class='del'>-	local-&gt;transaction.len     = 0;</div><div class='add'>+    afr_fix_open(fd, this);</div><div class='ctx'> </div><div class='del'>-	afr_transaction (transaction_frame, this, AFR_METADATA_TRANSACTION);</div><div class='add'>+    ret = afr_transaction(transaction_frame, this, AFR_DATA_TRANSACTION);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        op_errno = -ret;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	op_ret = 0;</div><div class='add'>+    return 0;</div><div class='ctx'> out:</div><div class='del'>-	if (op_ret == -1) {</div><div class='del'>-		if (transaction_frame)</div><div class='del'>-			AFR_STACK_DESTROY (transaction_frame);</div><div class='del'>-		AFR_STACK_UNWIND (fsetattr, frame, op_ret, op_errno, NULL, NULL);</div><div class='del'>-	}</div><div class='add'>+    if (transaction_frame)</div><div class='add'>+        AFR_STACK_DESTROY(transaction_frame);</div><div class='ctx'> </div><div class='del'>-	return 0;</div><div class='add'>+    AFR_STACK_UNWIND(fallocate, frame, -1, op_errno, NULL, NULL, NULL);</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+/* }}} */</div><div class='ctx'> </div><div class='del'>-/* {{{ setxattr */</div><div class='del'>-</div><div class='add'>+/* {{{ discard */</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-afr_setxattr_unwind (call_frame_t *frame, xlator_t *this)</div><div class='add'>+afr_discard_unwind(call_frame_t *frame, xlator_t *this)</div><div class='ctx'> {</div><div class='del'>-	afr_local_t *   local = NULL;</div><div class='del'>-	call_frame_t   *main_frame = NULL;</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    call_frame_t *main_frame = NULL;</div><div class='ctx'> </div><div class='del'>-	local = frame-&gt;local;</div><div class='add'>+    local = frame-&gt;local;</div><div class='ctx'> </div><div class='del'>-	LOCK (&amp;frame-&gt;lock);</div><div class='del'>-	{</div><div class='del'>-		if (local-&gt;transaction.main_frame)</div><div class='del'>-			main_frame = local-&gt;transaction.main_frame;</div><div class='del'>-		local-&gt;transaction.main_frame = NULL;</div><div class='del'>-	}</div><div class='del'>-	UNLOCK (&amp;frame-&gt;lock);</div><div class='add'>+    main_frame = afr_transaction_detach_fop_frame(frame);</div><div class='add'>+    if (!main_frame)</div><div class='add'>+        return 0;</div><div class='ctx'> </div><div class='del'>-	if (main_frame) {</div><div class='del'>-		AFR_STACK_UNWIND (setxattr, main_frame,</div><div class='del'>-                                  local-&gt;op_ret, local-&gt;op_errno)</div><div class='del'>-	}</div><div class='del'>-	return 0;</div><div class='add'>+    AFR_STACK_UNWIND(discard, main_frame, local-&gt;op_ret, local-&gt;op_errno,</div><div class='add'>+                     &amp;local-&gt;cont.inode_wfop.prebuf,</div><div class='add'>+                     &amp;local-&gt;cont.inode_wfop.postbuf, local-&gt;xdata_rsp);</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-afr_setxattr_wind_cbk (call_frame_t *frame, void *cookie, xlator_t *this, </div><div class='del'>-		       int32_t op_ret, int32_t op_errno)</div><div class='add'>+afr_discard_wind_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                     int32_t op_ret, int32_t op_errno, struct iatt *prebuf,</div><div class='add'>+                     struct iatt *postbuf, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-	afr_local_t *   local = NULL;</div><div class='del'>-	afr_private_t * priv  = NULL;</div><div class='del'>-</div><div class='del'>-	int call_count  = -1;</div><div class='del'>-	int need_unwind = 0;</div><div class='add'>+    return __afr_inode_write_cbk(frame, cookie, this, op_ret, op_errno, prebuf,</div><div class='add'>+                                 postbuf, NULL, xdata);</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-	priv = this-&gt;private;</div><div class='add'>+int</div><div class='add'>+afr_discard_wind(call_frame_t *frame, xlator_t *this, int subvol)</div><div class='add'>+{</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    STACK_WIND_COOKIE(frame, afr_discard_wind_cbk, (void *)(long)subvol,</div><div class='add'>+                      priv-&gt;children[subvol],</div><div class='add'>+                      priv-&gt;children[subvol]-&gt;fops-&gt;discard, local-&gt;fd,</div><div class='add'>+                      local-&gt;cont.discard.offset, local-&gt;cont.discard.len,</div><div class='add'>+                      local-&gt;xdata_req);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	LOCK (&amp;frame-&gt;lock);</div><div class='del'>-	{</div><div class='del'>-		if (op_ret != -1) {</div><div class='del'>-			if (local-&gt;success_count == 0) {</div><div class='del'>-				local-&gt;op_ret = op_ret;</div><div class='del'>-			}</div><div class='del'>-			local-&gt;success_count++;</div><div class='add'>+int</div><div class='add'>+afr_discard(call_frame_t *frame, xlator_t *this, fd_t *fd, off_t offset,</div><div class='add'>+            size_t len, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    call_frame_t *transaction_frame = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int op_errno = ENOMEM;</div><div class='ctx'> </div><div class='del'>-			if (local-&gt;success_count == priv-&gt;child_count) {</div><div class='del'>-				need_unwind = 1;</div><div class='del'>-			}</div><div class='del'>-		}</div><div class='add'>+    AFR_ERROR_OUT_IF_FDCTX_INVALID(fd, this, op_errno, out);</div><div class='add'>+    transaction_frame = copy_frame(frame);</div><div class='add'>+    if (!transaction_frame)</div><div class='add'>+        goto out;</div><div class='ctx'> </div><div class='del'>-		local-&gt;op_errno = op_errno;</div><div class='del'>-	}</div><div class='del'>-	UNLOCK (&amp;frame-&gt;lock);</div><div class='add'>+    local = AFR_FRAME_INIT(transaction_frame, op_errno);</div><div class='add'>+    if (!local)</div><div class='add'>+        goto out;</div><div class='ctx'> </div><div class='del'>-	if (need_unwind)</div><div class='del'>-		local-&gt;transaction.unwind (frame, this);</div><div class='add'>+    local-&gt;cont.discard.offset = offset;</div><div class='add'>+    local-&gt;cont.discard.len = len;</div><div class='ctx'> </div><div class='del'>-	call_count = afr_frame_return (frame);</div><div class='add'>+    local-&gt;fd = fd_ref(fd);</div><div class='add'>+    ret = afr_set_inode_local(this, local, fd-&gt;inode);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='ctx'> </div><div class='del'>-	if (call_count == 0) {</div><div class='del'>-		local-&gt;transaction.resume (frame, this);</div><div class='del'>-	}</div><div class='del'>-	</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='add'>+    if (xdata)</div><div class='add'>+        local-&gt;xdata_req = dict_copy_with_ref(xdata, NULL);</div><div class='add'>+    else</div><div class='add'>+        local-&gt;xdata_req = dict_new();</div><div class='ctx'> </div><div class='add'>+    if (!local-&gt;xdata_req)</div><div class='add'>+        goto out;</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-afr_setxattr_wind (call_frame_t *frame, xlator_t *this)</div><div class='del'>-{</div><div class='del'>-	afr_local_t *local = NULL;</div><div class='del'>-	afr_private_t *priv = NULL;</div><div class='add'>+    local-&gt;op = GF_FOP_DISCARD;</div><div class='ctx'> </div><div class='del'>-	int call_count = -1;</div><div class='del'>-	int i = 0;</div><div class='add'>+    local-&gt;transaction.wind = afr_discard_wind;</div><div class='add'>+    local-&gt;transaction.unwind = afr_discard_unwind;</div><div class='ctx'> </div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-	priv = this-&gt;private;</div><div class='add'>+    local-&gt;transaction.main_frame = frame;</div><div class='ctx'> </div><div class='del'>-	call_count = afr_up_children_count (priv-&gt;child_count, local-&gt;child_up);</div><div class='add'>+    local-&gt;transaction.start = local-&gt;cont.discard.offset;</div><div class='add'>+    local-&gt;transaction.len = 0;</div><div class='ctx'> </div><div class='del'>-	if (call_count == 0) {</div><div class='del'>-		local-&gt;transaction.resume (frame, this);</div><div class='del'>-		return 0;</div><div class='del'>-	}</div><div class='add'>+    afr_fix_open(fd, this);</div><div class='ctx'> </div><div class='del'>-	local-&gt;call_count = call_count;</div><div class='add'>+    ret = afr_transaction(transaction_frame, this, AFR_DATA_TRANSACTION);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        op_errno = -ret;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	for (i = 0; i &lt; priv-&gt;child_count; i++) {				</div><div class='del'>-		if (local-&gt;child_up[i]) {</div><div class='del'>-			STACK_WIND_COOKIE (frame, afr_setxattr_wind_cbk,</div><div class='del'>-					   (void *) (long) i,	</div><div class='del'>-					   priv-&gt;children[i], </div><div class='del'>-					   priv-&gt;children[i]-&gt;fops-&gt;setxattr,</div><div class='del'>-					   &amp;local-&gt;loc, </div><div class='del'>-					   local-&gt;cont.setxattr.dict,</div><div class='del'>-					   local-&gt;cont.setxattr.flags); </div><div class='add'>+    return 0;</div><div class='add'>+out:</div><div class='add'>+    if (transaction_frame)</div><div class='add'>+        AFR_STACK_DESTROY(transaction_frame);</div><div class='ctx'> </div><div class='del'>-			if (!--call_count)</div><div class='del'>-				break;</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='del'>-	</div><div class='del'>-	return 0;</div><div class='add'>+    AFR_STACK_UNWIND(discard, frame, -1, op_errno, NULL, NULL, NULL);</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+/* {{{ zerofill */</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-afr_setxattr_done (call_frame_t *frame, xlator_t *this)</div><div class='add'>+afr_zerofill_unwind(call_frame_t *frame, xlator_t *this)</div><div class='ctx'> {</div><div class='del'>-	afr_local_t * local = frame-&gt;local;</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    call_frame_t *main_frame = NULL;</div><div class='ctx'> </div><div class='del'>-	local-&gt;transaction.unwind (frame, this);</div><div class='add'>+    local = frame-&gt;local;</div><div class='ctx'> </div><div class='del'>-	AFR_STACK_DESTROY (frame);</div><div class='add'>+    main_frame = afr_transaction_detach_fop_frame(frame);</div><div class='add'>+    if (!main_frame)</div><div class='add'>+        return 0;</div><div class='ctx'> </div><div class='del'>-	return 0;</div><div class='add'>+    AFR_STACK_UNWIND(discard, main_frame, local-&gt;op_ret, local-&gt;op_errno,</div><div class='add'>+                     &amp;local-&gt;cont.inode_wfop.prebuf,</div><div class='add'>+                     &amp;local-&gt;cont.inode_wfop.postbuf, local-&gt;xdata_rsp);</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-afr_setxattr (call_frame_t *frame, xlator_t *this,</div><div class='del'>-	      loc_t *loc, dict_t *dict, int32_t flags)</div><div class='add'>+afr_zerofill_wind_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                      int32_t op_ret, int32_t op_errno, struct iatt *prebuf,</div><div class='add'>+                      struct iatt *postbuf, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-	afr_private_t * priv  = NULL;</div><div class='del'>-	afr_local_t   * local = NULL;</div><div class='del'>-	call_frame_t   *transaction_frame = NULL;</div><div class='add'>+    return __afr_inode_write_cbk(frame, cookie, this, op_ret, op_errno, prebuf,</div><div class='add'>+                                 postbuf, NULL, xdata);</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	int ret = -1;</div><div class='add'>+int</div><div class='add'>+afr_zerofill_wind(call_frame_t *frame, xlator_t *this, int subvol)</div><div class='add'>+{</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    STACK_WIND_COOKIE(frame, afr_zerofill_wind_cbk, (void *)(long)subvol,</div><div class='add'>+                      priv-&gt;children[subvol],</div><div class='add'>+                      priv-&gt;children[subvol]-&gt;fops-&gt;zerofill, local-&gt;fd,</div><div class='add'>+                      local-&gt;cont.zerofill.offset, local-&gt;cont.zerofill.len,</div><div class='add'>+                      local-&gt;xdata_req);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	int op_ret   = -1;</div><div class='del'>-	int op_errno = 0;</div><div class='add'>+int</div><div class='add'>+afr_zerofill(call_frame_t *frame, xlator_t *this, fd_t *fd, off_t offset,</div><div class='add'>+             size_t len, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    call_frame_t *transaction_frame = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int op_errno = ENOMEM;</div><div class='ctx'> </div><div class='del'>-	VALIDATE_OR_GOTO (frame, out);</div><div class='del'>-	VALIDATE_OR_GOTO (this, out);</div><div class='del'>-	VALIDATE_OR_GOTO (this-&gt;private, out);</div><div class='add'>+    AFR_ERROR_OUT_IF_FDCTX_INVALID(fd, this, op_errno, out);</div><div class='add'>+    transaction_frame = copy_frame(frame);</div><div class='add'>+    if (!transaction_frame)</div><div class='add'>+        goto out;</div><div class='ctx'> </div><div class='del'>-	priv = this-&gt;private;</div><div class='add'>+    local = AFR_FRAME_INIT(transaction_frame, op_errno);</div><div class='add'>+    if (!local)</div><div class='add'>+        goto out;</div><div class='ctx'> </div><div class='del'>-	ALLOC_OR_GOTO (local, afr_local_t, out);</div><div class='add'>+    local-&gt;cont.zerofill.offset = offset;</div><div class='add'>+    local-&gt;cont.zerofill.len = len;</div><div class='ctx'> </div><div class='del'>-	ret = AFR_LOCAL_INIT (local, priv);</div><div class='del'>-	if (ret &lt; 0) {</div><div class='del'>-		op_errno = -ret;</div><div class='del'>-		goto out;</div><div class='del'>-	}</div><div class='add'>+    local-&gt;fd = fd_ref(fd);</div><div class='add'>+    ret = afr_set_inode_local(this, local, fd-&gt;inode);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='ctx'> </div><div class='del'>-	transaction_frame = copy_frame (frame);</div><div class='del'>-	if (!transaction_frame) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-			"Out of memory.");</div><div class='del'>-		goto out;</div><div class='del'>-	}</div><div class='add'>+    if (xdata)</div><div class='add'>+        local-&gt;xdata_req = dict_copy_with_ref(xdata, NULL);</div><div class='add'>+    else</div><div class='add'>+        local-&gt;xdata_req = dict_new();</div><div class='ctx'> </div><div class='del'>-	transaction_frame-&gt;local = local;</div><div class='add'>+    if (!local-&gt;xdata_req)</div><div class='add'>+        goto out;</div><div class='ctx'> </div><div class='del'>-	local-&gt;op_ret = -1;</div><div class='add'>+    local-&gt;op = GF_FOP_ZEROFILL;</div><div class='ctx'> </div><div class='del'>-	local-&gt;cont.setxattr.dict  = dict_ref (dict);</div><div class='del'>-	local-&gt;cont.setxattr.flags = flags;</div><div class='add'>+    local-&gt;transaction.wind = afr_zerofill_wind;</div><div class='add'>+    local-&gt;transaction.unwind = afr_zerofill_unwind;</div><div class='ctx'> </div><div class='del'>-	local-&gt;transaction.fop    = afr_setxattr_wind;</div><div class='del'>-	local-&gt;transaction.done   = afr_setxattr_done;</div><div class='del'>-	local-&gt;transaction.unwind = afr_setxattr_unwind;</div><div class='add'>+    local-&gt;transaction.main_frame = frame;</div><div class='ctx'> </div><div class='del'>-	loc_copy (&amp;local-&gt;loc, loc);</div><div class='add'>+    local-&gt;transaction.start = local-&gt;cont.zerofill.offset;</div><div class='add'>+    local-&gt;transaction.len = len;</div><div class='ctx'> </div><div class='del'>-	local-&gt;transaction.main_frame = frame;</div><div class='del'>-	local-&gt;transaction.start   = LLONG_MAX - 1;</div><div class='del'>-	local-&gt;transaction.len     = 0;</div><div class='add'>+    afr_fix_open(fd, this);</div><div class='ctx'> </div><div class='del'>-	afr_transaction (transaction_frame, this, AFR_METADATA_TRANSACTION);</div><div class='add'>+    ret = afr_transaction(transaction_frame, this, AFR_DATA_TRANSACTION);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        op_errno = -ret;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	op_ret = 0;</div><div class='add'>+    return 0;</div><div class='ctx'> out:</div><div class='del'>-	if (op_ret == -1) {</div><div class='del'>-		if (transaction_frame)</div><div class='del'>-			AFR_STACK_DESTROY (transaction_frame);</div><div class='del'>-		AFR_STACK_UNWIND (setxattr, frame, op_ret, op_errno);</div><div class='del'>-	}</div><div class='add'>+    if (transaction_frame)</div><div class='add'>+        AFR_STACK_DESTROY(transaction_frame);</div><div class='ctx'> </div><div class='del'>-	return 0;</div><div class='add'>+    AFR_STACK_UNWIND(zerofill, frame, -1, op_errno, NULL, NULL, NULL);</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> /* }}} */</div><div class='ctx'> </div><div class='del'>-/* {{{ removexattr */</div><div class='add'>+int32_t</div><div class='add'>+afr_xattrop_wind_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                     int32_t op_ret, int32_t op_errno, dict_t *xattr,</div><div class='add'>+                     dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    return __afr_inode_write_cbk(frame, cookie, this, op_ret, op_errno, NULL,</div><div class='add'>+                                 NULL, xattr, xdata);</div><div class='add'>+}</div><div class='ctx'> </div><div class='add'>+int</div><div class='add'>+afr_xattrop_wind(call_frame_t *frame, xlator_t *this, int subvol)</div><div class='add'>+{</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    STACK_WIND_COOKIE(frame, afr_xattrop_wind_cbk, (void *)(long)subvol,</div><div class='add'>+                      priv-&gt;children[subvol],</div><div class='add'>+                      priv-&gt;children[subvol]-&gt;fops-&gt;xattrop, &amp;local-&gt;loc,</div><div class='add'>+                      local-&gt;cont.xattrop.optype, local-&gt;cont.xattrop.xattr,</div><div class='add'>+                      local-&gt;xdata_req);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-afr_removexattr_unwind (call_frame_t *frame, xlator_t *this)</div><div class='add'>+afr_xattrop_unwind(call_frame_t *frame, xlator_t *this)</div><div class='ctx'> {</div><div class='del'>-	afr_local_t *   local = NULL;</div><div class='del'>-	call_frame_t   *main_frame = NULL;</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    call_frame_t *main_frame = NULL;</div><div class='ctx'> </div><div class='del'>-	local = frame-&gt;local;</div><div class='add'>+    local = frame-&gt;local;</div><div class='ctx'> </div><div class='del'>-	LOCK (&amp;frame-&gt;lock);</div><div class='del'>-	{</div><div class='del'>-		if (local-&gt;transaction.main_frame)</div><div class='del'>-			main_frame = local-&gt;transaction.main_frame;</div><div class='del'>-		local-&gt;transaction.main_frame = NULL;</div><div class='del'>-	}</div><div class='del'>-	UNLOCK (&amp;frame-&gt;lock);</div><div class='add'>+    main_frame = afr_transaction_detach_fop_frame(frame);</div><div class='add'>+    if (!main_frame)</div><div class='add'>+        return 0;</div><div class='ctx'> </div><div class='del'>-	if (main_frame) {</div><div class='del'>-		AFR_STACK_UNWIND (removexattr, main_frame,</div><div class='del'>-                                  local-&gt;op_ret, local-&gt;op_errno)</div><div class='del'>-	}</div><div class='del'>-	return 0;</div><div class='add'>+    AFR_STACK_UNWIND(xattrop, main_frame, local-&gt;op_ret, local-&gt;op_errno,</div><div class='add'>+                     local-&gt;xattr_rsp, local-&gt;xdata_rsp);</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-afr_removexattr_wind_cbk (call_frame_t *frame, void *cookie, xlator_t *this, </div><div class='del'>-			  int32_t op_ret, int32_t op_errno)</div><div class='add'>+int32_t</div><div class='add'>+afr_xattrop(call_frame_t *frame, xlator_t *this, loc_t *loc,</div><div class='add'>+            gf_xattrop_flags_t optype, dict_t *xattr, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-	afr_local_t *   local = NULL;</div><div class='del'>-	afr_private_t * priv  = NULL;</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    call_frame_t *transaction_frame = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int op_errno = ENOMEM;</div><div class='ctx'> </div><div class='del'>-	int call_count  = -1;</div><div class='del'>-	int need_unwind = 0;</div><div class='add'>+    transaction_frame = copy_frame(frame);</div><div class='add'>+    if (!transaction_frame)</div><div class='add'>+        goto out;</div><div class='ctx'> </div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-	priv = this-&gt;private;</div><div class='add'>+    local = AFR_FRAME_INIT(transaction_frame, op_errno);</div><div class='add'>+    if (!local)</div><div class='add'>+        goto out;</div><div class='ctx'> </div><div class='del'>-	LOCK (&amp;frame-&gt;lock);</div><div class='del'>-	{</div><div class='del'>-		if (op_ret != -1) {</div><div class='del'>-			if (local-&gt;success_count == 0) {</div><div class='del'>-				local-&gt;op_ret = op_ret;</div><div class='del'>-			}</div><div class='del'>-			local-&gt;success_count++;</div><div class='add'>+    local-&gt;cont.xattrop.xattr = dict_ref(xattr);</div><div class='add'>+    local-&gt;cont.xattrop.optype = optype;</div><div class='add'>+    if (xdata)</div><div class='add'>+        local-&gt;xdata_req = dict_ref(xdata);</div><div class='ctx'> </div><div class='del'>-			if (local-&gt;success_count == priv-&gt;wait_count) {</div><div class='del'>-				need_unwind = 1;</div><div class='del'>-			}</div><div class='del'>-		}</div><div class='add'>+    local-&gt;transaction.wind = afr_xattrop_wind;</div><div class='add'>+    local-&gt;transaction.unwind = afr_xattrop_unwind;</div><div class='ctx'> </div><div class='del'>-		local-&gt;op_errno = op_errno;</div><div class='del'>-	}</div><div class='del'>-	UNLOCK (&amp;frame-&gt;lock);</div><div class='add'>+    loc_copy(&amp;local-&gt;loc, loc);</div><div class='add'>+    ret = afr_set_inode_local(this, local, loc-&gt;inode);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='ctx'> </div><div class='del'>-	if (need_unwind)</div><div class='del'>-		local-&gt;transaction.unwind (frame, this);</div><div class='add'>+    local-&gt;op = GF_FOP_XATTROP;</div><div class='ctx'> </div><div class='del'>-	call_count = afr_frame_return (frame);</div><div class='add'>+    local-&gt;transaction.main_frame = frame;</div><div class='add'>+    local-&gt;transaction.start = LLONG_MAX - 1;</div><div class='add'>+    local-&gt;transaction.len = 0;</div><div class='ctx'> </div><div class='del'>-	if (call_count == 0) {</div><div class='del'>-		local-&gt;transaction.resume (frame, this);</div><div class='del'>-	}</div><div class='del'>-	</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='add'>+    ret = afr_transaction(transaction_frame, this, AFR_METADATA_TRANSACTION);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        op_errno = -ret;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+out:</div><div class='add'>+    if (transaction_frame)</div><div class='add'>+        AFR_STACK_DESTROY(transaction_frame);</div><div class='ctx'> </div><div class='add'>+    AFR_STACK_UNWIND(xattrop, frame, -1, op_errno, NULL, NULL);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int32_t</div><div class='del'>-afr_removexattr_wind (call_frame_t *frame, xlator_t *this)</div><div class='add'>+afr_fxattrop_wind_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                      int32_t op_ret, int32_t op_errno, dict_t *xattr,</div><div class='add'>+                      dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-	afr_local_t *local = NULL;</div><div class='del'>-	afr_private_t *priv = NULL;</div><div class='add'>+    return __afr_inode_write_cbk(frame, cookie, this, op_ret, op_errno, NULL,</div><div class='add'>+                                 NULL, xattr, xdata);</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	int call_count = -1;</div><div class='del'>-	int i = 0;</div><div class='add'>+int</div><div class='add'>+afr_fxattrop_wind(call_frame_t *frame, xlator_t *this, int subvol)</div><div class='add'>+{</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    STACK_WIND_COOKIE(frame, afr_fxattrop_wind_cbk, (void *)(long)subvol,</div><div class='add'>+                      priv-&gt;children[subvol],</div><div class='add'>+                      priv-&gt;children[subvol]-&gt;fops-&gt;fxattrop, local-&gt;fd,</div><div class='add'>+                      local-&gt;cont.xattrop.optype, local-&gt;cont.xattrop.xattr,</div><div class='add'>+                      local-&gt;xdata_req);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-	priv = this-&gt;private;</div><div class='add'>+int</div><div class='add'>+afr_fxattrop_unwind(call_frame_t *frame, xlator_t *this)</div><div class='add'>+{</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    call_frame_t *main_frame = NULL;</div><div class='ctx'> </div><div class='del'>-	call_count = afr_up_children_count (priv-&gt;child_count, local-&gt;child_up);</div><div class='add'>+    local = frame-&gt;local;</div><div class='ctx'> </div><div class='del'>-	if (call_count == 0) {</div><div class='del'>-		local-&gt;transaction.resume (frame, this);</div><div class='del'>-		return 0;</div><div class='del'>-	}</div><div class='add'>+    main_frame = afr_transaction_detach_fop_frame(frame);</div><div class='add'>+    if (!main_frame)</div><div class='add'>+        return 0;</div><div class='ctx'> </div><div class='del'>-	local-&gt;call_count = call_count;</div><div class='add'>+    AFR_STACK_UNWIND(fxattrop, main_frame, local-&gt;op_ret, local-&gt;op_errno,</div><div class='add'>+                     local-&gt;xattr_rsp, local-&gt;xdata_rsp);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	for (i = 0; i &lt; priv-&gt;child_count; i++) {				</div><div class='del'>-		if (local-&gt;child_up[i]) {</div><div class='del'>-			STACK_WIND_COOKIE (frame, afr_removexattr_wind_cbk, </div><div class='del'>-					   (void *) (long) i,	</div><div class='del'>-					   priv-&gt;children[i], </div><div class='del'>-					   priv-&gt;children[i]-&gt;fops-&gt;removexattr,</div><div class='del'>-					   &amp;local-&gt;loc, </div><div class='del'>-					   local-&gt;cont.removexattr.name);</div><div class='add'>+int32_t</div><div class='add'>+afr_fxattrop(call_frame_t *frame, xlator_t *this, fd_t *fd,</div><div class='add'>+             gf_xattrop_flags_t optype, dict_t *xattr, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    call_frame_t *transaction_frame = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int op_errno = ENOMEM;</div><div class='add'>+</div><div class='add'>+    AFR_ERROR_OUT_IF_FDCTX_INVALID(fd, this, op_errno, out);</div><div class='add'>+    transaction_frame = copy_frame(frame);</div><div class='add'>+    if (!transaction_frame)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    local = AFR_FRAME_INIT(transaction_frame, op_errno);</div><div class='add'>+    if (!local)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    local-&gt;cont.xattrop.xattr = dict_ref(xattr);</div><div class='add'>+    local-&gt;cont.xattrop.optype = optype;</div><div class='add'>+    if (xdata)</div><div class='add'>+        local-&gt;xdata_req = dict_ref(xdata);</div><div class='add'>+</div><div class='add'>+    local-&gt;transaction.wind = afr_fxattrop_wind;</div><div class='add'>+    local-&gt;transaction.unwind = afr_fxattrop_unwind;</div><div class='add'>+</div><div class='add'>+    local-&gt;fd = fd_ref(fd);</div><div class='add'>+    ret = afr_set_inode_local(this, local, fd-&gt;inode);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    local-&gt;op = GF_FOP_FXATTROP;</div><div class='add'>+</div><div class='add'>+    local-&gt;transaction.main_frame = frame;</div><div class='add'>+    local-&gt;transaction.start = LLONG_MAX - 1;</div><div class='add'>+    local-&gt;transaction.len = 0;</div><div class='add'>+</div><div class='add'>+    ret = afr_transaction(transaction_frame, this, AFR_METADATA_TRANSACTION);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        op_errno = -ret;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+out:</div><div class='add'>+    if (transaction_frame)</div><div class='add'>+        AFR_STACK_DESTROY(transaction_frame);</div><div class='ctx'> </div><div class='del'>-			if (!--call_count)</div><div class='del'>-				break;</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='del'>-	</div><div class='del'>-	return 0;</div><div class='add'>+    AFR_STACK_UNWIND(fxattrop, frame, -1, op_errno, NULL, NULL);</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-afr_removexattr_done (call_frame_t *frame, xlator_t *this)</div><div class='add'>+afr_fsync_unwind(call_frame_t *frame, xlator_t *this)</div><div class='ctx'> {</div><div class='del'>-	afr_local_t * local = frame-&gt;local;</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    call_frame_t *main_frame = NULL;</div><div class='ctx'> </div><div class='del'>-	local-&gt;transaction.unwind (frame, this);</div><div class='add'>+    local = frame-&gt;local;</div><div class='ctx'> </div><div class='del'>-	AFR_STACK_DESTROY (frame);</div><div class='del'>-	</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='add'>+    main_frame = afr_transaction_detach_fop_frame(frame);</div><div class='add'>+    if (!main_frame)</div><div class='add'>+        return 0;</div><div class='add'>+</div><div class='add'>+    AFR_STACK_UNWIND(fsync, main_frame, local-&gt;op_ret, local-&gt;op_errno,</div><div class='add'>+                     &amp;local-&gt;cont.inode_wfop.prebuf,</div><div class='add'>+                     &amp;local-&gt;cont.inode_wfop.postbuf, local-&gt;xdata_rsp);</div><div class='ctx'> </div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-afr_removexattr (call_frame_t *frame, xlator_t *this,</div><div class='del'>-		 loc_t *loc, const char *name)</div><div class='add'>+afr_fsync_wind_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                   int32_t op_ret, int32_t op_errno, struct iatt *prebuf,</div><div class='add'>+                   struct iatt *postbuf, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-	afr_private_t * priv  = NULL;</div><div class='del'>-	afr_local_t   * local = NULL;</div><div class='del'>-	call_frame_t   *transaction_frame = NULL;</div><div class='del'>-</div><div class='del'>-	int ret = -1;</div><div class='del'>-</div><div class='del'>-	int op_ret   = -1;</div><div class='del'>-	int op_errno = 0;</div><div class='del'>-</div><div class='del'>-	VALIDATE_OR_GOTO (frame, out);</div><div class='del'>-	VALIDATE_OR_GOTO (this, out);</div><div class='del'>-	VALIDATE_OR_GOTO (this-&gt;private, out);</div><div class='del'>-	VALIDATE_OR_GOTO (loc, out);</div><div class='add'>+    return __afr_inode_write_cbk(frame, cookie, this, op_ret, op_errno, prebuf,</div><div class='add'>+                                 postbuf, NULL, xdata);</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	priv = this-&gt;private;</div><div class='add'>+int</div><div class='add'>+afr_fsync_wind(call_frame_t *frame, xlator_t *this, int subvol)</div><div class='add'>+{</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='ctx'> </div><div class='del'>-	transaction_frame = copy_frame (frame);</div><div class='del'>-	if (!transaction_frame) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-			"Out of memory.");</div><div class='del'>-		goto out;</div><div class='del'>-	}</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    priv = this-&gt;private;</div><div class='ctx'> </div><div class='del'>-	ALLOC_OR_GOTO (local, afr_local_t, out);</div><div class='add'>+    STACK_WIND_COOKIE(frame, afr_fsync_wind_cbk, (void *)(long)subvol,</div><div class='add'>+                      priv-&gt;children[subvol],</div><div class='add'>+                      priv-&gt;children[subvol]-&gt;fops-&gt;fsync, local-&gt;fd,</div><div class='add'>+                      local-&gt;cont.fsync.datasync, local-&gt;xdata_req);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	ret = AFR_LOCAL_INIT (local, priv);</div><div class='del'>-	if (ret &lt; 0) {</div><div class='del'>-		op_errno = -ret;</div><div class='del'>-		goto out;</div><div class='del'>-	}</div><div class='add'>+int</div><div class='add'>+afr_fsync(call_frame_t *frame, xlator_t *this, fd_t *fd, int32_t datasync,</div><div class='add'>+          dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    call_frame_t *transaction_frame = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int32_t op_errno = ENOMEM;</div><div class='add'>+    int8_t last_fsync = 0;</div><div class='add'>+</div><div class='add'>+    AFR_ERROR_OUT_IF_FDCTX_INVALID(fd, this, op_errno, out);</div><div class='add'>+    transaction_frame = copy_frame(frame);</div><div class='add'>+    if (!transaction_frame)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    local = AFR_FRAME_INIT(transaction_frame, op_errno);</div><div class='add'>+    if (!local)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    if (xdata) {</div><div class='add'>+        local-&gt;xdata_req = dict_copy_with_ref(xdata, NULL);</div><div class='add'>+        if (dict_get_int8(xdata, "last-fsync", &amp;last_fsync) == 0) {</div><div class='add'>+            if (last_fsync) {</div><div class='add'>+                local-&gt;transaction.disable_delayed_post_op = _gf_true;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+    } else {</div><div class='add'>+        local-&gt;xdata_req = dict_new();</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	transaction_frame-&gt;local = local;</div><div class='add'>+    if (!local-&gt;xdata_req)</div><div class='add'>+        goto out;</div><div class='ctx'> </div><div class='del'>-	local-&gt;op_ret = -1;</div><div class='add'>+    local-&gt;fd = fd_ref(fd);</div><div class='add'>+    ret = afr_set_inode_local(this, local, fd-&gt;inode);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='ctx'> </div><div class='del'>-	local-&gt;cont.removexattr.name = gf_strdup (name);</div><div class='add'>+    local-&gt;op = GF_FOP_FSYNC;</div><div class='add'>+    local-&gt;cont.fsync.datasync = datasync;</div><div class='ctx'> </div><div class='del'>-	local-&gt;transaction.fop    = afr_removexattr_wind;</div><div class='del'>-	local-&gt;transaction.done   = afr_removexattr_done;</div><div class='del'>-	local-&gt;transaction.unwind = afr_removexattr_unwind;</div><div class='add'>+    if (afr_fd_has_witnessed_unstable_write(this, fd-&gt;inode)) {</div><div class='add'>+        /* don't care. we only wanted to CLEAR the bit */</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	loc_copy (&amp;local-&gt;loc, loc);</div><div class='add'>+    local-&gt;transaction.wind = afr_fsync_wind;</div><div class='add'>+    local-&gt;transaction.unwind = afr_fsync_unwind;</div><div class='ctx'> </div><div class='del'>-	local-&gt;transaction.main_frame = frame;</div><div class='del'>-	local-&gt;transaction.start   = LLONG_MAX - 1;</div><div class='del'>-	local-&gt;transaction.len     = 0;</div><div class='add'>+    local-&gt;transaction.main_frame = frame;</div><div class='ctx'> </div><div class='del'>-	afr_transaction (transaction_frame, this, AFR_METADATA_TRANSACTION);</div><div class='add'>+    ret = afr_transaction(transaction_frame, this, AFR_DATA_TRANSACTION);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        op_errno = -ret;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	op_ret = 0;</div><div class='add'>+    return 0;</div><div class='ctx'> out:</div><div class='del'>-	if (op_ret == -1) {</div><div class='del'>-		if (transaction_frame)</div><div class='del'>-			AFR_STACK_DESTROY (transaction_frame);</div><div class='del'>-		AFR_STACK_UNWIND (removexattr, frame, op_ret, op_errno);</div><div class='del'>-	}</div><div class='add'>+    if (transaction_frame)</div><div class='add'>+        AFR_STACK_DESTROY(transaction_frame);</div><div class='add'>+</div><div class='add'>+    AFR_STACK_UNWIND(fsync, frame, -1, op_errno, NULL, NULL, NULL);</div><div class='ctx'> </div><div class='del'>-	return 0;</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='head'>diff --git a/xlators/cluster/afr/src/afr-inode-write.h b/xlators/cluster/afr/src/afr-inode-write.h<br/>index f0c2fbe0078..a787069b7a1 100644<br/>--- a/<a href='/cgit/glusterfs.git/tree/xlators/cluster/afr/src/afr-inode-write.h?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/cluster/afr/src/afr-inode-write.h</a><br/>+++ b/<a href='/cgit/glusterfs.git/tree/xlators/cluster/afr/src/afr-inode-write.h?id=d1d7a6f35c816822fab51c820e25023863c239c1'>xlators/cluster/afr/src/afr-inode-write.h</a></div><div class='hunk'>@@ -1,72 +1,94 @@</div><div class='ctx'> /*</div><div class='del'>-   Copyright (c) 2007-2009 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='del'>-   This file is part of GlusterFS.</div><div class='del'>-</div><div class='del'>-   GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-   it under the terms of the GNU General Public License as published</div><div class='del'>-   by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-   or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-   GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-   WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-   General Public License for more details.</div><div class='del'>-</div><div class='del'>-   You should have received a copy of the GNU General Public License</div><div class='del'>-   along with this program.  If not, see</div><div class='del'>-   &lt;http://www.gnu.org/licenses/&gt;.</div><div class='add'>+  Copyright (c) 2008-2012 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='ctx'> */</div><div class='ctx'> </div><div class='ctx'> #ifndef __INODE_WRITE_H__</div><div class='ctx'> #define __INODE_WRITE_H__</div><div class='ctx'> </div><div class='ctx'> int32_t</div><div class='del'>-afr_chmod (call_frame_t *frame, xlator_t *this,</div><div class='del'>-	   loc_t *loc, mode_t mode);</div><div class='add'>+afr_chmod(call_frame_t *frame, xlator_t *this, loc_t *loc, mode_t mode,</div><div class='add'>+          dict_t *xdata);</div><div class='ctx'> </div><div class='ctx'> int32_t</div><div class='del'>-afr_chown (call_frame_t *frame, xlator_t *this,</div><div class='del'>-	   loc_t *loc, uid_t uid, gid_t gid);</div><div class='add'>+afr_chown(call_frame_t *frame, xlator_t *this, loc_t *loc, uid_t uid, gid_t gid,</div><div class='add'>+          dict_t *xdata);</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-afr_fchown (call_frame_t *frame, xlator_t *this,</div><div class='del'>-	    fd_t *fd, uid_t uid, gid_t gid);</div><div class='add'>+afr_fchown(call_frame_t *frame, xlator_t *this, fd_t *fd, uid_t uid, gid_t gid,</div><div class='add'>+           dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+afr_fchmod(call_frame_t *frame, xlator_t *this, fd_t *fd, mode_t mode,</div><div class='add'>+           dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+afr_writev(call_frame_t *frame, xlator_t *this, fd_t *fd, struct iovec *vector,</div><div class='add'>+           int32_t count, off_t offset, uint32_t flags, struct iobref *iobref,</div><div class='add'>+           dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+afr_truncate(call_frame_t *frame, xlator_t *this, loc_t *loc, off_t offset,</div><div class='add'>+             dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+afr_ftruncate(call_frame_t *frame, xlator_t *this, fd_t *fd, off_t offset,</div><div class='add'>+              dict_t *xdata);</div><div class='ctx'> </div><div class='ctx'> int32_t</div><div class='del'>-afr_fchmod (call_frame_t *frame, xlator_t *this,</div><div class='del'>-	    fd_t *fd, mode_t mode);</div><div class='add'>+afr_utimens(call_frame_t *frame, xlator_t *this, loc_t *loc,</div><div class='add'>+            struct timespec tv[2], dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+afr_setattr(call_frame_t *frame, xlator_t *this, loc_t *loc, struct iatt *buf,</div><div class='add'>+            int32_t valid, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+afr_fsetattr(call_frame_t *frame, xlator_t *this, fd_t *fd, struct iatt *buf,</div><div class='add'>+             int32_t valid, dict_t *xdata);</div><div class='ctx'> </div><div class='ctx'> int32_t</div><div class='del'>-afr_writev (call_frame_t *frame, xlator_t *this, fd_t *fd, </div><div class='del'>-	    struct iovec *vector, int32_t count, off_t offset,</div><div class='del'>-            struct iobref *iobref);</div><div class='add'>+afr_setxattr(call_frame_t *frame, xlator_t *this, loc_t *loc, dict_t *dict,</div><div class='add'>+             int32_t flags, dict_t *xdata);</div><div class='ctx'> </div><div class='ctx'> int32_t</div><div class='del'>-afr_truncate (call_frame_t *frame, xlator_t *this,</div><div class='del'>-	      loc_t *loc, off_t offset);</div><div class='add'>+afr_fsetxattr(call_frame_t *frame, xlator_t *this, fd_t *fd, dict_t *dict,</div><div class='add'>+              int32_t flags, dict_t *xdata);</div><div class='ctx'> </div><div class='ctx'> int32_t</div><div class='del'>-afr_ftruncate (call_frame_t *frame, xlator_t *this,</div><div class='del'>-	       fd_t *fd, off_t offset);</div><div class='add'>+afr_removexattr(call_frame_t *frame, xlator_t *this, loc_t *loc,</div><div class='add'>+                const char *name, dict_t *xdata);</div><div class='ctx'> </div><div class='ctx'> int32_t</div><div class='del'>-afr_utimens (call_frame_t *frame, xlator_t *this,</div><div class='del'>-	     loc_t *loc, struct timespec tv[2]);</div><div class='add'>+afr_fremovexattr(call_frame_t *frame, xlator_t *this, fd_t *fd,</div><div class='add'>+                 const char *name, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+afr_discard(call_frame_t *frame, xlator_t *this, fd_t *fd, off_t offset,</div><div class='add'>+            size_t len, dict_t *xdata);</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-afr_setattr (call_frame_t *frame, xlator_t *this,</div><div class='del'>-             loc_t *loc, struct iatt *buf, int32_t valid);</div><div class='add'>+afr_fallocate(call_frame_t *frame, xlator_t *this, fd_t *fd, int32_t mode,</div><div class='add'>+              off_t offset, size_t len, dict_t *xdata);</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-afr_fsetattr (call_frame_t *frame, xlator_t *this,</div><div class='del'>-              fd_t *fd, struct iatt *buf, int32_t valid);</div><div class='add'>+afr_zerofill(call_frame_t *frame, xlator_t *this, fd_t *fd, off_t offset,</div><div class='add'>+             off_t len, dict_t *xdata);</div><div class='ctx'> </div><div class='ctx'> int32_t</div><div class='del'>-afr_setxattr (call_frame_t *frame, xlator_t *this,</div><div class='del'>-	      loc_t *loc, dict_t *dict, int32_t flags);</div><div class='add'>+afr_xattrop(call_frame_t *frame, xlator_t *this, loc_t *loc,</div><div class='add'>+            gf_xattrop_flags_t optype, dict_t *xattr, dict_t *xdata);</div><div class='ctx'> </div><div class='ctx'> int32_t</div><div class='del'>-afr_removexattr (call_frame_t *frame, xlator_t *this,</div><div class='del'>-		 loc_t *loc, const char *name);</div><div class='add'>+afr_fxattrop(call_frame_t *frame, xlator_t *this, fd_t *fd,</div><div class='add'>+             gf_xattrop_flags_t optype, dict_t *xattr, dict_t *xdata);</div><div class='ctx'> </div><div class='add'>+int</div><div class='add'>+afr_fsync(call_frame_t *frame, xlator_t *this, fd_t *fd, int32_t datasync,</div><div class='add'>+          dict_t *xdata);</div><div class='ctx'> #endif /* __INODE_WRITE_H__ */</div><div class='head'>diff --git a/xlators/cluster/afr/src/afr-lk-common.c b/xlators/cluster/afr/src/afr-lk-common.c<br/>index 749c6bf9a59..bc8eabe0f43 100644<br/>--- a/<a href='/cgit/glusterfs.git/tree/xlators/cluster/afr/src/afr-lk-common.c?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/cluster/afr/src/afr-lk-common.c</a><br/>+++ b/<a href='/cgit/glusterfs.git/tree/xlators/cluster/afr/src/afr-lk-common.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>xlators/cluster/afr/src/afr-lk-common.c</a></div><div class='hunk'>@@ -1,1684 +1,791 @@</div><div class='ctx'> /*</div><div class='del'>-  Copyright (c) 2007-2009 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='add'>+  Copyright (c) 2008-2012 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='ctx'>   This file is part of GlusterFS.</div><div class='ctx'> </div><div class='del'>-  GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-  it under the terms of the GNU General Public License as published</div><div class='del'>-  by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-  or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-  GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-  WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-  General Public License for more details.</div><div class='del'>-</div><div class='del'>-  You should have received a copy of the GNU General Public License</div><div class='del'>-  along with this program.  If not, see</div><div class='del'>-  &lt;http://www.gnu.org/licenses/&gt;.</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='ctx'> */</div><div class='ctx'> </div><div class='del'>-#include "dict.h"</div><div class='del'>-#include "byte-order.h"</div><div class='del'>-#include "common-utils.h"</div><div class='add'>+#include &lt;glusterfs/dict.h&gt;</div><div class='add'>+#include &lt;glusterfs/byte-order.h&gt;</div><div class='add'>+#include &lt;glusterfs/common-utils.h&gt;</div><div class='ctx'> </div><div class='ctx'> #include "afr.h"</div><div class='ctx'> #include "afr-transaction.h"</div><div class='add'>+#include "afr-messages.h"</div><div class='ctx'> </div><div class='ctx'> #include &lt;signal.h&gt;</div><div class='ctx'> </div><div class='del'>-</div><div class='del'>-#define LOCKED_NO       0x0        /* no lock held */</div><div class='del'>-#define LOCKED_YES      0x1        /* for DATA, METADATA, ENTRY and higher_path */</div><div class='del'>-#define LOCKED_LOWER    0x2        /* for lower path */</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-afr_lock_blocking (call_frame_t *frame, xlator_t *this, int child_index);</div><div class='del'>-</div><div class='del'>-static uint64_t afr_lock_number = 1;</div><div class='del'>-</div><div class='del'>-static uint64_t</div><div class='del'>-get_afr_lock_number ()</div><div class='del'>-{</div><div class='del'>-        return (++afr_lock_number);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-afr_set_lock_number (call_frame_t *frame, xlator_t *this)</div><div class='del'>-{</div><div class='del'>-        afr_local_t         *local    = NULL;</div><div class='del'>-        afr_internal_lock_t *int_lock = NULL;</div><div class='del'>-</div><div class='del'>-        local    = frame-&gt;local;</div><div class='del'>-        int_lock = &amp;local-&gt;internal_lock;</div><div class='del'>-</div><div class='del'>-        int_lock-&gt;lock_number = get_afr_lock_number ();</div><div class='del'>-</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='add'>+#define LOCKED_NO 0x0    /* no lock held */</div><div class='add'>+#define LOCKED_YES 0x1   /* for DATA, METADATA, ENTRY and higher_path */</div><div class='add'>+#define LOCKED_LOWER 0x2 /* for lower path */</div><div class='ctx'> </div><div class='ctx'> void</div><div class='del'>-afr_set_lk_owner (call_frame_t *frame, xlator_t *this)</div><div class='del'>-{</div><div class='del'>-        if (!frame-&gt;root-&gt;lk_owner) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_TRACE,</div><div class='del'>-                        "Setting lk-owner=%llu",</div><div class='del'>-                        (unsigned long long) (unsigned long)frame-&gt;root);</div><div class='del'>-                frame-&gt;root-&gt;lk_owner = (uint64_t) (unsigned long)frame-&gt;root;</div><div class='del'>-        }</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-static int</div><div class='del'>-is_afr_lock_selfheal (afr_local_t *local)</div><div class='del'>-{</div><div class='del'>-        afr_internal_lock_t *int_lock = NULL;</div><div class='del'>-        int                  ret      = -1;</div><div class='del'>-</div><div class='del'>-        int_lock = &amp;local-&gt;internal_lock;</div><div class='del'>-</div><div class='del'>-        switch (int_lock-&gt;selfheal_lk_type) {</div><div class='del'>-        case AFR_DATA_SELF_HEAL_LK:</div><div class='del'>-        case AFR_METADATA_SELF_HEAL_LK:</div><div class='del'>-                ret = 1;</div><div class='del'>-                break;</div><div class='del'>-        case AFR_ENTRY_SELF_HEAL_LK:</div><div class='del'>-                ret = 0;</div><div class='del'>-                break;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        return ret;</div><div class='del'>-</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-internal_lock_count (call_frame_t *frame, xlator_t *this,</div><div class='del'>-                     afr_fd_ctx_t *fd_ctx)</div><div class='add'>+afr_lockee_cleanup(afr_lockee_t *lockee)</div><div class='ctx'> {</div><div class='del'>-        afr_local_t   *local = NULL;</div><div class='del'>-        afr_private_t *priv  = NULL;</div><div class='del'>-</div><div class='del'>-        int32_t call_count = 0;</div><div class='del'>-        int i = 0;</div><div class='add'>+    if (lockee-&gt;fd) {</div><div class='add'>+        fd_unref(lockee-&gt;fd);</div><div class='add'>+        lockee-&gt;fd = NULL;</div><div class='add'>+    } else {</div><div class='add'>+        loc_wipe(&amp;lockee-&gt;loc);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        local = frame-&gt;local;</div><div class='del'>-        priv  = this-&gt;private;</div><div class='add'>+    GF_FREE(lockee-&gt;basename);</div><div class='add'>+    lockee-&gt;basename = NULL;</div><div class='add'>+    GF_FREE(lockee-&gt;locked_nodes);</div><div class='add'>+    lockee-&gt;locked_nodes = NULL;</div><div class='ctx'> </div><div class='del'>-        if (fd_ctx) {</div><div class='del'>-                GF_ASSERT (local-&gt;fd);</div><div class='del'>-                for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='del'>-                        if (local-&gt;child_up[i] &amp;&amp; fd_ctx-&gt;opened_on[i])</div><div class='del'>-                                ++call_count;</div><div class='del'>-                }</div><div class='del'>-        } else {</div><div class='del'>-                for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='del'>-                        if (local-&gt;child_up[i])</div><div class='del'>-                                ++call_count;</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        return call_count;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-static void</div><div class='del'>-afr_print_inodelk (char *str, int size, int cmd,</div><div class='del'>-                   struct flock *flock, uint64_t owner)</div><div class='del'>-{</div><div class='del'>-        char *cmd_str = NULL;</div><div class='del'>-        char *type_str = NULL;</div><div class='del'>-</div><div class='del'>-        switch (cmd) {</div><div class='del'>-#if F_GETLK != F_GETLK64</div><div class='del'>-        case F_GETLK64:</div><div class='del'>-#endif</div><div class='del'>-        case F_GETLK:</div><div class='del'>-                cmd_str = "GETLK";</div><div class='del'>-                break;</div><div class='del'>-</div><div class='del'>-#if F_SETLK != F_SETLK64</div><div class='del'>-        case F_SETLK64:</div><div class='del'>-#endif</div><div class='del'>-        case F_SETLK:</div><div class='del'>-                cmd_str = "SETLK";</div><div class='del'>-                break;</div><div class='del'>-</div><div class='del'>-#if F_SETLKW != F_SETLKW64</div><div class='del'>-        case F_SETLKW64:</div><div class='del'>-#endif</div><div class='del'>-        case F_SETLKW:</div><div class='del'>-                cmd_str = "SETLKW";</div><div class='del'>-                break;</div><div class='del'>-</div><div class='del'>-        default:</div><div class='del'>-                cmd_str = "&lt;null&gt;";</div><div class='del'>-                break;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        switch (flock-&gt;l_type) {</div><div class='del'>-        case F_RDLCK:</div><div class='del'>-                type_str = "READ";</div><div class='del'>-                break;</div><div class='del'>-        case F_WRLCK:</div><div class='del'>-                type_str = "WRITE";</div><div class='del'>-                break;</div><div class='del'>-        case F_UNLCK:</div><div class='del'>-                type_str = "UNLOCK";</div><div class='del'>-                break;</div><div class='del'>-        default:</div><div class='del'>-                type_str = "UNKNOWN";</div><div class='del'>-                break;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        snprintf (str, size, "lock=INODELK, cmd=%s, type=%s, "</div><div class='del'>-                  "start=%llu, len=%llu, pid=%llu, lk-owner=%llu",</div><div class='del'>-                  cmd_str, type_str, (unsigned long long) flock-&gt;l_start,</div><div class='del'>-                  (unsigned long long) flock-&gt;l_len,</div><div class='del'>-                  (unsigned long long) flock-&gt;l_pid,</div><div class='del'>-                  (unsigned long long) owner);</div><div class='del'>-</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-static void</div><div class='del'>-afr_print_lockee (char *str, int size, loc_t *loc, fd_t *fd,</div><div class='del'>-                  int child_index)</div><div class='del'>-{</div><div class='del'>-        snprintf (str, size, "path=%s, fd=%p, child=%d",</div><div class='del'>-                  loc-&gt;path ? loc-&gt;path : "&lt;nul&gt;",</div><div class='del'>-                  fd ? fd : NULL,</div><div class='del'>-                  child_index);</div><div class='add'>+    return;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> void</div><div class='del'>-afr_print_entrylk (char *str, int size, const char *basename,</div><div class='del'>-                   uint64_t owner)</div><div class='add'>+afr_lockees_cleanup(afr_internal_lock_t *int_lock)</div><div class='ctx'> {</div><div class='del'>-        snprintf (str, size, "Basename=%s, lk-owner=%llu",</div><div class='del'>-                  basename ? basename : "&lt;nul&gt;",</div><div class='del'>-                  (unsigned long long)owner);</div><div class='del'>-}</div><div class='add'>+    int i = 0;</div><div class='ctx'> </div><div class='del'>-static void</div><div class='del'>-afr_print_verdict (int op_ret, int op_errno, char *str)</div><div class='del'>-{</div><div class='del'>-        if (op_ret &lt; 0) {</div><div class='del'>-                if (op_errno == EAGAIN)</div><div class='del'>-                        strcpy (str, "EAGAIN");</div><div class='del'>-                else</div><div class='del'>-                        strcpy (str, "FAILED");</div><div class='del'>-        }</div><div class='del'>-        else</div><div class='del'>-                strcpy (str, "GRANTED");</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-static void</div><div class='del'>-afr_set_lock_call_type (afr_lock_call_type_t lock_call_type,</div><div class='del'>-                        char *lock_call_type_str,</div><div class='del'>-                        afr_internal_lock_t *int_lock)</div><div class='del'>-{</div><div class='del'>-        switch (lock_call_type) {</div><div class='del'>-        case AFR_INODELK_TRANSACTION:</div><div class='del'>-                if (int_lock-&gt;transaction_lk_type == AFR_TRANSACTION_LK)</div><div class='del'>-                        strcpy (lock_call_type_str, "AFR_INODELK_TRANSACTION");</div><div class='del'>-                else</div><div class='del'>-                        strcpy (lock_call_type_str, "AFR_INODELK_SELFHEAL");</div><div class='del'>-                break;</div><div class='del'>-        case AFR_INODELK_NB_TRANSACTION:</div><div class='del'>-                if (int_lock-&gt;transaction_lk_type == AFR_TRANSACTION_LK)</div><div class='del'>-                        strcpy (lock_call_type_str, "AFR_INODELK_NB_TRANSACTION");</div><div class='del'>-                else</div><div class='del'>-                        strcpy (lock_call_type_str, "AFR_INODELK_NB_SELFHEAL");</div><div class='del'>-                break;</div><div class='del'>-        case AFR_ENTRYLK_TRANSACTION:</div><div class='del'>-                if (int_lock-&gt;transaction_lk_type == AFR_TRANSACTION_LK)</div><div class='del'>-                        strcpy (lock_call_type_str, "AFR_ENTRYLK_TRANSACTION");</div><div class='del'>-                else</div><div class='del'>-                        strcpy (lock_call_type_str, "AFR_ENTRYLK_SELFHEAL");</div><div class='del'>-                break;</div><div class='del'>-        case AFR_ENTRYLK_NB_TRANSACTION:</div><div class='del'>-                if (int_lock-&gt;transaction_lk_type == AFR_TRANSACTION_LK)</div><div class='del'>-                        strcpy (lock_call_type_str, "AFR_ENTRYLK_NB_TRANSACTION");</div><div class='del'>-                else</div><div class='del'>-                        strcpy (lock_call_type_str, "AFR_ENTRYLK_NB_SELFHEAL");</div><div class='del'>-                break;</div><div class='del'>-        default:</div><div class='del'>-                strcpy (lock_call_type_str, "UNKNOWN");</div><div class='del'>-                break;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-static void</div><div class='del'>-afr_trace_inodelk_out (call_frame_t *frame, afr_lock_call_type_t lock_call_type,</div><div class='del'>-                       afr_lock_op_type_t lk_op_type, struct flock *flock,</div><div class='del'>-                       int op_ret, int op_errno, int32_t child_index)</div><div class='del'>-{</div><div class='del'>-        xlator_t            *this     = NULL;</div><div class='del'>-        afr_internal_lock_t *int_lock = NULL;</div><div class='del'>-        afr_local_t         *local    = NULL;</div><div class='del'>-        afr_private_t       *priv     = NULL;</div><div class='del'>-</div><div class='del'>-        char lockee[256];</div><div class='del'>-        char lock_call_type_str[256];</div><div class='del'>-        char verdict[16];</div><div class='del'>-</div><div class='del'>-        this     = THIS;</div><div class='del'>-        local    = frame-&gt;local;</div><div class='del'>-        int_lock = &amp;local-&gt;internal_lock;</div><div class='del'>-        priv     = this-&gt;private;</div><div class='del'>-</div><div class='del'>-        if (!priv-&gt;inodelk_trace) {</div><div class='del'>-                return;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        afr_print_lockee (lockee, 256, &amp;local-&gt;loc, local-&gt;fd, child_index);</div><div class='del'>-</div><div class='del'>-        afr_set_lock_call_type (lock_call_type, lock_call_type_str, int_lock);</div><div class='del'>-</div><div class='del'>-        afr_print_verdict (op_ret, op_errno, verdict);</div><div class='del'>-</div><div class='del'>-        gf_log (this-&gt;name, GF_LOG_NORMAL,</div><div class='del'>-                "[%s %s] [%s] Lockee={%s} Number={%llu}",</div><div class='del'>-                lock_call_type_str,</div><div class='del'>-                lk_op_type == AFR_LOCK_OP ? "LOCK REPLY" : "UNLOCK REPLY",</div><div class='del'>-                verdict,</div><div class='del'>-                lockee,</div><div class='del'>-                (unsigned long long) int_lock-&gt;lock_number);</div><div class='add'>+    for (i = 0; i &lt; int_lock-&gt;lockee_count; i++) {</div><div class='add'>+        afr_lockee_cleanup(&amp;int_lock-&gt;lockee[i]);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='add'>+    return;</div><div class='ctx'> }</div><div class='del'>-</div><div class='del'>-static void</div><div class='del'>-afr_trace_inodelk_in (call_frame_t *frame, afr_lock_call_type_t lock_call_type,</div><div class='del'>-                      afr_lock_op_type_t lk_op_type, struct flock *flock,</div><div class='del'>-                      int32_t cmd, int32_t child_index)</div><div class='del'>-{</div><div class='del'>-        xlator_t            *this     = NULL;</div><div class='del'>-        afr_local_t         *local    = NULL;</div><div class='del'>-        afr_internal_lock_t *int_lock = NULL;</div><div class='del'>-        afr_private_t       *priv     = NULL;</div><div class='del'>-</div><div class='del'>-        char lock[256];</div><div class='del'>-        char lockee[256];</div><div class='del'>-        char lock_call_type_str[256];</div><div class='del'>-</div><div class='del'>-        this     = THIS;</div><div class='del'>-        local    = frame-&gt;local;</div><div class='del'>-        int_lock = &amp;local-&gt;internal_lock;</div><div class='del'>-        priv     = this-&gt;private;</div><div class='del'>-</div><div class='del'>-        if (!priv-&gt;inodelk_trace) {</div><div class='del'>-                return;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        afr_print_inodelk (lock, 256, cmd, flock, frame-&gt;root-&gt;lk_owner);</div><div class='del'>-        afr_print_lockee (lockee, 256, &amp;local-&gt;loc, local-&gt;fd, child_index);</div><div class='del'>-</div><div class='del'>-        afr_set_lock_call_type (lock_call_type, lock_call_type_str, int_lock);</div><div class='del'>-</div><div class='del'>-        gf_log (this-&gt;name, GF_LOG_NORMAL,</div><div class='del'>-                "[%s %s] Lock={%s} Lockee={%s} Number={%llu}",</div><div class='del'>-                lock_call_type_str,</div><div class='del'>-                lk_op_type == AFR_LOCK_OP ? "LOCK REQUEST" : "UNLOCK REQUEST",</div><div class='del'>-                lock, lockee,</div><div class='del'>-                (unsigned long long) int_lock-&gt;lock_number);</div><div class='del'>-</div><div class='add'>+int</div><div class='add'>+afr_entry_lockee_cmp(const void *l1, const void *l2)</div><div class='add'>+{</div><div class='add'>+    const afr_lockee_t *r1 = l1;</div><div class='add'>+    const afr_lockee_t *r2 = l2;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    uuid_t gfid1 = {0};</div><div class='add'>+    uuid_t gfid2 = {0};</div><div class='add'>+</div><div class='add'>+    loc_gfid((loc_t *)&amp;r1-&gt;loc, gfid1);</div><div class='add'>+    loc_gfid((loc_t *)&amp;r2-&gt;loc, gfid2);</div><div class='add'>+    ret = gf_uuid_compare(gfid1, gfid2);</div><div class='add'>+    /*Entrylks with NULL basename are the 'smallest'*/</div><div class='add'>+    if (ret == 0) {</div><div class='add'>+        if (!r1-&gt;basename)</div><div class='add'>+            return -1;</div><div class='add'>+        if (!r2-&gt;basename)</div><div class='add'>+            return 1;</div><div class='add'>+        ret = strcmp(r1-&gt;basename, r2-&gt;basename);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (ret &lt;= 0)</div><div class='add'>+        return -1;</div><div class='add'>+    else</div><div class='add'>+        return 1;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-static void</div><div class='del'>-afr_trace_entrylk_in (call_frame_t *frame, afr_lock_call_type_t lock_call_type,</div><div class='del'>-                      afr_lock_op_type_t lk_op_type, const char *basename,</div><div class='del'>-                      int32_t child_index)</div><div class='del'>-{</div><div class='del'>-        xlator_t            *this     = NULL;</div><div class='del'>-        afr_local_t         *local    = NULL;</div><div class='del'>-        afr_internal_lock_t *int_lock = NULL;</div><div class='del'>-        afr_private_t       *priv     = NULL;</div><div class='del'>-</div><div class='del'>-        char lock[256];</div><div class='del'>-        char lockee[256];</div><div class='del'>-        char lock_call_type_str[256];</div><div class='del'>-</div><div class='del'>-        this     = THIS;</div><div class='del'>-        local    = frame-&gt;local;</div><div class='del'>-        int_lock = &amp;local-&gt;internal_lock;</div><div class='del'>-        priv     = this-&gt;private;</div><div class='del'>-</div><div class='del'>-        if (!priv-&gt;entrylk_trace) {</div><div class='del'>-                return;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        afr_print_entrylk (lock, 256, basename, frame-&gt;root-&gt;lk_owner);</div><div class='del'>-        afr_print_lockee (lockee, 256, &amp;local-&gt;loc, local-&gt;fd, child_index);</div><div class='del'>-</div><div class='del'>-        afr_set_lock_call_type (lock_call_type, lock_call_type_str, int_lock);</div><div class='del'>-</div><div class='del'>-        gf_log (this-&gt;name, GF_LOG_NORMAL,</div><div class='del'>-                "[%s %s] Lock={%s} Lockee={%s} Number={%llu}",</div><div class='del'>-                lock_call_type_str,</div><div class='del'>-                lk_op_type == AFR_LOCK_OP ? "LOCK REQUEST" : "UNLOCK REQUEST",</div><div class='del'>-                lock, lockee,</div><div class='del'>-                (unsigned long long) int_lock-&gt;lock_number);</div><div class='del'>-}</div><div class='add'>+int</div><div class='add'>+afr_lock_blocking(call_frame_t *frame, xlator_t *this, int child_index);</div><div class='ctx'> </div><div class='del'>-static void</div><div class='del'>-afr_trace_entrylk_out (call_frame_t *frame, afr_lock_call_type_t lock_call_type,</div><div class='del'>-                       afr_lock_op_type_t lk_op_type, const char *basename, int op_ret,</div><div class='del'>-                       int op_errno, int32_t child_index)</div><div class='add'>+void</div><div class='add'>+afr_set_lk_owner(call_frame_t *frame, xlator_t *this, void *lk_owner)</div><div class='ctx'> {</div><div class='del'>-        xlator_t            *this     = NULL;</div><div class='del'>-        afr_internal_lock_t *int_lock = NULL;</div><div class='del'>-        afr_local_t         *local    = NULL;</div><div class='del'>-        afr_private_t       *priv     = NULL;</div><div class='del'>-</div><div class='del'>-        char lock[256];</div><div class='del'>-        char lockee[256];</div><div class='del'>-        char lock_call_type_str[256];</div><div class='del'>-        char verdict[16];</div><div class='del'>-</div><div class='del'>-        this     = THIS;</div><div class='del'>-        local    = frame-&gt;local;</div><div class='del'>-        int_lock = &amp;local-&gt;internal_lock;</div><div class='del'>-        priv     = this-&gt;private;</div><div class='del'>-</div><div class='del'>-        if (!priv-&gt;entrylk_trace) {</div><div class='del'>-                return;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        afr_print_lockee (lockee, 256, &amp;local-&gt;loc, local-&gt;fd, child_index);</div><div class='del'>-</div><div class='del'>-        afr_set_lock_call_type (lock_call_type, lock_call_type_str, int_lock);</div><div class='del'>-</div><div class='del'>-        afr_print_verdict (op_ret, op_errno, verdict);</div><div class='del'>-</div><div class='del'>-        gf_log (this-&gt;name, GF_LOG_NORMAL,</div><div class='del'>-                "[%s %s] [%s] Lock={%s} Lockee={%s} Number={%llu}",</div><div class='del'>-                lock_call_type_str,</div><div class='del'>-                lk_op_type == AFR_LOCK_OP ? "LOCK REPLY" : "UNLOCK REPLY",</div><div class='del'>-                verdict,</div><div class='del'>-                lock, lockee,</div><div class='del'>-                (unsigned long long) int_lock-&gt;lock_number);</div><div class='add'>+    gf_msg_trace(this-&gt;name, 0, "Setting lk-owner=%llu",</div><div class='add'>+                 (unsigned long long)(unsigned long)lk_owner);</div><div class='ctx'> </div><div class='add'>+    set_lk_owner_from_ptr(&amp;frame-&gt;root-&gt;lk_owner, lk_owner);</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-static int</div><div class='del'>-transaction_lk_op (afr_local_t *local)</div><div class='add'>+int32_t</div><div class='add'>+internal_lock_count(call_frame_t *frame, xlator_t *this)</div><div class='ctx'> {</div><div class='del'>-        afr_internal_lock_t *int_lock = NULL;</div><div class='del'>-        int ret = -1;</div><div class='del'>-</div><div class='del'>-        int_lock = &amp;local-&gt;internal_lock;</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    int32_t call_count = 0;</div><div class='add'>+    int i = 0;</div><div class='ctx'> </div><div class='del'>-        if (int_lock-&gt;transaction_lk_type == AFR_TRANSACTION_LK) {</div><div class='del'>-                gf_log (THIS-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-                        "lk op is for a transaction");</div><div class='del'>-                ret = 1;</div><div class='del'>-        }</div><div class='del'>-        else if (int_lock-&gt;transaction_lk_type == AFR_SELFHEAL_LK) {</div><div class='del'>-                gf_log (THIS-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-                        "lk op is for a self heal");</div><div class='del'>-</div><div class='del'>-                ret = 0;</div><div class='del'>-        }</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    priv = this-&gt;private;</div><div class='ctx'> </div><div class='del'>-        if (ret == -1)</div><div class='del'>-                gf_log (THIS-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-                        "lk op is not set");</div><div class='del'>-</div><div class='del'>-        return ret;</div><div class='add'>+    for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+        if (local-&gt;child_up[i])</div><div class='add'>+            ++call_count;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='add'>+    return call_count;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-static int</div><div class='del'>-is_afr_lock_transaction (afr_local_t *local)</div><div class='add'>+int</div><div class='add'>+afr_add_entry_lockee(afr_local_t *local, loc_t *loc, char *basename,</div><div class='add'>+                     int child_count)</div><div class='ctx'> {</div><div class='del'>-        int ret = 0;</div><div class='add'>+    int ret = -ENOMEM;</div><div class='add'>+    afr_internal_lock_t *int_lock = &amp;local-&gt;internal_lock;</div><div class='add'>+    afr_lockee_t *lockee = &amp;int_lock-&gt;lockee[int_lock-&gt;lockee_count];</div><div class='ctx'> </div><div class='del'>-        switch (local-&gt;transaction.type) {</div><div class='del'>-	case AFR_DATA_TRANSACTION:</div><div class='del'>-	case AFR_METADATA_TRANSACTION:</div><div class='del'>-	case AFR_FLUSH_TRANSACTION:</div><div class='del'>-                ret = 1;</div><div class='del'>-                break;</div><div class='add'>+    GF_ASSERT(int_lock-&gt;lockee_count &lt; AFR_LOCKEE_COUNT_MAX);</div><div class='add'>+    loc_copy(&amp;lockee-&gt;loc, loc);</div><div class='add'>+    lockee-&gt;basename = (basename) ? gf_strdup(basename) : NULL;</div><div class='add'>+    if (basename &amp;&amp; !lockee-&gt;basename)</div><div class='add'>+        goto out;</div><div class='ctx'> </div><div class='del'>-        case AFR_ENTRY_RENAME_TRANSACTION:</div><div class='del'>-        case AFR_ENTRY_TRANSACTION:</div><div class='del'>-                ret = 0;</div><div class='del'>-                break;</div><div class='add'>+    lockee-&gt;locked_count = 0;</div><div class='add'>+    lockee-&gt;locked_nodes = GF_CALLOC(child_count, sizeof(*lockee-&gt;locked_nodes),</div><div class='add'>+                                     gf_afr_mt_afr_node_character);</div><div class='ctx'> </div><div class='del'>-        }</div><div class='add'>+    if (!lockee-&gt;locked_nodes)</div><div class='add'>+        goto out;</div><div class='ctx'> </div><div class='del'>-        return ret;</div><div class='add'>+    ret = 0;</div><div class='add'>+    int_lock-&gt;lockee_count++;</div><div class='add'>+out:</div><div class='add'>+    if (ret) {</div><div class='add'>+        afr_lockee_cleanup(lockee);</div><div class='add'>+    }</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-static int</div><div class='del'>-initialize_entrylk_variables (call_frame_t *frame, xlator_t *this)</div><div class='add'>+int</div><div class='add'>+afr_add_inode_lockee(afr_local_t *local, int child_count)</div><div class='ctx'> {</div><div class='del'>-        afr_local_t         *local    = NULL;</div><div class='del'>-        afr_internal_lock_t *int_lock = NULL;</div><div class='del'>-        afr_private_t       *priv     = NULL;</div><div class='del'>-</div><div class='del'>-        int i = 0;</div><div class='add'>+    int ret = -ENOMEM;</div><div class='add'>+    afr_internal_lock_t *int_lock = &amp;local-&gt;internal_lock;</div><div class='add'>+    afr_lockee_t *lockee = &amp;int_lock-&gt;lockee[int_lock-&gt;lockee_count];</div><div class='ctx'> </div><div class='del'>-        priv     = this-&gt;private;</div><div class='del'>-        local    = frame-&gt;local;</div><div class='del'>-        int_lock = &amp;local-&gt;internal_lock;</div><div class='add'>+    if (local-&gt;fd) {</div><div class='add'>+        lockee-&gt;fd = fd_ref(local-&gt;fd);</div><div class='add'>+    } else {</div><div class='add'>+        loc_copy(&amp;lockee-&gt;loc, &amp;local-&gt;loc);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        int_lock-&gt;entrylk_lock_count = 0;</div><div class='del'>-        int_lock-&gt;lock_op_ret        = -1;</div><div class='del'>-        int_lock-&gt;lock_op_errno      = 0;</div><div class='add'>+    lockee-&gt;locked_count = 0;</div><div class='add'>+    lockee-&gt;locked_nodes = GF_CALLOC(child_count, sizeof(*lockee-&gt;locked_nodes),</div><div class='add'>+                                     gf_afr_mt_afr_node_character);</div><div class='ctx'> </div><div class='del'>-        for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='del'>-                int_lock-&gt;entry_locked_nodes[i] = 0;</div><div class='del'>-        }</div><div class='add'>+    if (!lockee-&gt;locked_nodes)</div><div class='add'>+        goto out;</div><div class='ctx'> </div><div class='del'>-        return 0;</div><div class='add'>+    ret = 0;</div><div class='add'>+    int_lock-&gt;lockee_count++;</div><div class='add'>+out:</div><div class='add'>+    if (ret) {</div><div class='add'>+        afr_lockee_cleanup(lockee);</div><div class='add'>+    }</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> static int</div><div class='del'>-initialize_inodelk_variables (call_frame_t *frame, xlator_t *this)</div><div class='add'>+initialize_internal_lock_variables(call_frame_t *frame, xlator_t *this)</div><div class='ctx'> {</div><div class='del'>-        afr_local_t         *local    = NULL;</div><div class='del'>-        afr_internal_lock_t *int_lock = NULL;</div><div class='del'>-        afr_private_t       *priv     = NULL;</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    afr_internal_lock_t *int_lock = NULL;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='ctx'> </div><div class='del'>-        int i = 0;</div><div class='add'>+    int i = 0;</div><div class='ctx'> </div><div class='del'>-        priv     = this-&gt;private;</div><div class='del'>-        local    = frame-&gt;local;</div><div class='del'>-        int_lock = &amp;local-&gt;internal_lock;</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    int_lock = &amp;local-&gt;internal_lock;</div><div class='ctx'> </div><div class='del'>-        int_lock-&gt;inodelk_lock_count = 0;</div><div class='del'>-        int_lock-&gt;lock_op_ret        = -1;</div><div class='del'>-        int_lock-&gt;lock_op_errno      = 0;</div><div class='add'>+    int_lock-&gt;lock_count = 0;</div><div class='add'>+    int_lock-&gt;lock_op_ret = -1;</div><div class='add'>+    int_lock-&gt;lock_op_errno = 0;</div><div class='add'>+    int_lock-&gt;lk_attempted_count = 0;</div><div class='ctx'> </div><div class='del'>-        for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='del'>-                int_lock-&gt;inode_locked_nodes[i] = 0;</div><div class='del'>-        }</div><div class='add'>+    for (i = 0; i &lt; AFR_LOCKEE_COUNT_MAX; i++) {</div><div class='add'>+        if (!int_lock-&gt;lockee[i].locked_nodes)</div><div class='add'>+            break;</div><div class='add'>+        int_lock-&gt;lockee[i].locked_count = 0;</div><div class='add'>+        memset(int_lock-&gt;lockee[i].locked_nodes, 0,</div><div class='add'>+               sizeof(*int_lock-&gt;lockee[i].locked_nodes) * priv-&gt;child_count);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        return 0;</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-loc_t *</div><div class='del'>-lower_path (loc_t *l1, const char *b1, loc_t *l2, const char *b2)</div><div class='add'>+int</div><div class='add'>+afr_lockee_locked_nodes_count(afr_internal_lock_t *int_lock)</div><div class='ctx'> {</div><div class='del'>-	int ret = 0;</div><div class='add'>+    int call_count = 0;</div><div class='add'>+    int i = 0;</div><div class='ctx'> </div><div class='del'>-	ret = strcmp (l1-&gt;path, l2-&gt;path);</div><div class='add'>+    for (i = 0; i &lt; int_lock-&gt;lockee_count; i++)</div><div class='add'>+        call_count += int_lock-&gt;lockee[i].locked_count;</div><div class='ctx'> </div><div class='del'>-	if (ret == 0)</div><div class='del'>-		ret = strcmp (b1, b2);</div><div class='del'>-</div><div class='del'>-	if (ret &lt;= 0)</div><div class='del'>-		return l1;</div><div class='del'>-	else</div><div class='del'>-		return l2;</div><div class='add'>+    return call_count;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-afr_locked_nodes_count (unsigned char *locked_nodes, int child_count)</div><div class='add'>+afr_locked_nodes_count(unsigned char *locked_nodes, int child_count)</div><div class='ctx'> </div><div class='ctx'> {</div><div class='del'>-        int i;</div><div class='del'>-        int call_count = 0;</div><div class='add'>+    int i = 0;</div><div class='add'>+    int call_count = 0;</div><div class='ctx'> </div><div class='del'>-        for (i = 0; i &lt; child_count; i++) {</div><div class='del'>-                if (locked_nodes[i] &amp; LOCKED_YES)</div><div class='del'>-                        call_count++;</div><div class='del'>-        }</div><div class='add'>+    for (i = 0; i &lt; child_count; i++) {</div><div class='add'>+        if (locked_nodes[i] &amp; LOCKED_YES)</div><div class='add'>+            call_count++;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        return call_count;</div><div class='add'>+    return call_count;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-/* FIXME: What if UNLOCK fails */</div><div class='del'>-static int32_t</div><div class='del'>-afr_unlock_common_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-                       int32_t op_ret, int32_t op_errno)</div><div class='del'>-{</div><div class='del'>-	afr_local_t         *local    = NULL;</div><div class='del'>-        afr_internal_lock_t *int_lock = NULL;</div><div class='del'>-	int call_count = 0;</div><div class='del'>-</div><div class='del'>-	local    = frame-&gt;local;</div><div class='del'>-        int_lock = &amp;local-&gt;internal_lock;</div><div class='del'>-</div><div class='del'>-	LOCK (&amp;frame-&gt;lock);</div><div class='del'>-	{</div><div class='del'>-		call_count = --int_lock-&gt;lk_call_count;</div><div class='del'>-	}</div><div class='del'>-	UNLOCK (&amp;frame-&gt;lock);</div><div class='del'>-</div><div class='del'>-	if (call_count == 0) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_TRACE,</div><div class='del'>-                        "All internal locks unlocked");</div><div class='del'>-                int_lock-&gt;lock_cbk (frame, this);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-static int32_t</div><div class='del'>-afr_unlock_inodelk_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-                        int32_t op_ret, int32_t op_errno)</div><div class='add'>+static void</div><div class='add'>+afr_log_locks_failure(call_frame_t *frame, char *where, char *what,</div><div class='add'>+                      int op_errno)</div><div class='ctx'> {</div><div class='del'>-        afr_trace_inodelk_out (frame, AFR_INODELK_TRANSACTION,</div><div class='del'>-                               AFR_UNLOCK_OP, NULL, op_ret,</div><div class='del'>-                               op_errno, (long) cookie);</div><div class='del'>-</div><div class='del'>-        if (op_ret &lt; 0 &amp;&amp; op_errno != ENOTCONN &amp;&amp; op_errno != EBADFD) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_TRACE,</div><div class='del'>-                        "Unlock failed for some reason");</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        afr_unlock_common_cbk (frame, cookie, this, op_ret, op_errno);</div><div class='add'>+    xlator_t *this = frame-&gt;this;</div><div class='add'>+    gf_lkowner_t *lk_owner = &amp;frame-&gt;root-&gt;lk_owner;</div><div class='add'>+    afr_local_t *local = frame-&gt;local;</div><div class='add'>+    const char *fop = NULL;</div><div class='add'>+    char *gfid = NULL;</div><div class='add'>+    const char *name = NULL;</div><div class='ctx'> </div><div class='del'>-        return 0;</div><div class='add'>+    fop = gf_fop_list[local-&gt;op];</div><div class='ctx'> </div><div class='add'>+    switch (local-&gt;transaction.type) {</div><div class='add'>+        case AFR_ENTRY_RENAME_TRANSACTION:</div><div class='add'>+        case AFR_ENTRY_TRANSACTION:</div><div class='add'>+            switch (local-&gt;op) {</div><div class='add'>+                case GF_FOP_LINK:</div><div class='add'>+                    gfid = uuid_utoa(local-&gt;newloc.pargfid);</div><div class='add'>+                    name = local-&gt;newloc.name;</div><div class='add'>+                    break;</div><div class='add'>+                default:</div><div class='add'>+                    gfid = uuid_utoa(local-&gt;loc.pargfid);</div><div class='add'>+                    name = local-&gt;loc.name;</div><div class='add'>+                    break;</div><div class='add'>+            }</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_WARNING, op_errno,</div><div class='add'>+                   AFR_MSG_INTERNAL_LKS_FAILED,</div><div class='add'>+                   "Unable to do entry %s with lk-owner:%s on %s "</div><div class='add'>+                   "while attempting %s on {pgfid:%s, name:%s}.",</div><div class='add'>+                   what, lkowner_utoa(lk_owner), where, fop, gfid, name);</div><div class='add'>+            break;</div><div class='add'>+        case AFR_DATA_TRANSACTION:</div><div class='add'>+        case AFR_METADATA_TRANSACTION:</div><div class='add'>+            gfid = uuid_utoa(local-&gt;inode-&gt;gfid);</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_WARNING, op_errno,</div><div class='add'>+                   AFR_MSG_INTERNAL_LKS_FAILED,</div><div class='add'>+                   "Unable to do inode %s with lk-owner:%s on %s "</div><div class='add'>+                   "while attempting %s on gfid:%s.",</div><div class='add'>+                   what, lkowner_utoa(lk_owner), where, fop, gfid);</div><div class='add'>+            break;</div><div class='add'>+    }</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-static int</div><div class='del'>-afr_unlock_inodelk (call_frame_t *frame, xlator_t *this)</div><div class='add'>+static int32_t</div><div class='add'>+afr_unlock_common_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                      int32_t op_ret, int32_t op_errno, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-        afr_internal_lock_t *int_lock = NULL;</div><div class='del'>-        afr_local_t         *local    = NULL;</div><div class='del'>-        afr_private_t       *priv     = NULL;</div><div class='del'>-</div><div class='del'>-        struct flock flock;</div><div class='del'>-        int call_count = 0;</div><div class='del'>-        int i = 0;</div><div class='del'>-</div><div class='del'>-        local    = frame-&gt;local;</div><div class='del'>-        int_lock = &amp;local-&gt;internal_lock;</div><div class='del'>-        priv     = this-&gt;private;</div><div class='del'>-</div><div class='del'>-        flock.l_start = int_lock-&gt;lk_flock.l_start;</div><div class='del'>-        flock.l_len   = int_lock-&gt;lk_flock.l_len;</div><div class='del'>-        flock.l_type  = F_UNLCK;</div><div class='del'>-</div><div class='del'>-        call_count = afr_locked_nodes_count (int_lock-&gt;inode_locked_nodes,</div><div class='del'>-                                             priv-&gt;child_count);</div><div class='del'>-</div><div class='del'>-        int_lock-&gt;lk_call_count = call_count;</div><div class='del'>-</div><div class='del'>-        if (!call_count) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_TRACE,</div><div class='del'>-                        "No internal locks unlocked");</div><div class='del'>-                int_lock-&gt;lock_cbk (frame, this);</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    afr_internal_lock_t *int_lock = NULL;</div><div class='add'>+    int lockee_num = 0;</div><div class='add'>+    int call_count = 0;</div><div class='add'>+    int child_index = 0;</div><div class='add'>+    int ret = 0;</div><div class='ctx'> </div><div class='del'>-        for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='del'>-                if (int_lock-&gt;inode_locked_nodes[i] &amp; LOCKED_YES) {</div><div class='del'>-                        if (local-&gt;fd) {</div><div class='del'>-                                afr_trace_inodelk_in (frame, AFR_INODELK_TRANSACTION,</div><div class='del'>-                                                      AFR_UNLOCK_OP, &amp;flock, F_SETLK, i);</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    int_lock = &amp;local-&gt;internal_lock;</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+    lockee_num = (int)((long)cookie) / priv-&gt;child_count;</div><div class='add'>+    child_index = (int)((long)cookie) % priv-&gt;child_count;</div><div class='ctx'> </div><div class='del'>-                                STACK_WIND_COOKIE (frame, afr_unlock_inodelk_cbk,</div><div class='del'>-                                                   (void *) (long)i,</div><div class='del'>-                                                   priv-&gt;children[i],</div><div class='del'>-                                                   priv-&gt;children[i]-&gt;fops-&gt;finodelk,</div><div class='del'>-                                                   this-&gt;name, local-&gt;fd,</div><div class='del'>-                                                   F_SETLK, &amp;flock);</div><div class='add'>+    if (op_ret &lt; 0 &amp;&amp; op_errno != ENOTCONN &amp;&amp; op_errno != EBADFD) {</div><div class='add'>+        afr_log_locks_failure(frame, priv-&gt;children[child_index]-&gt;name,</div><div class='add'>+                              "unlock", op_errno);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-                                if (!--call_count)</div><div class='del'>-                                        break;</div><div class='add'>+    int_lock-&gt;lockee[lockee_num].locked_nodes[child_index] &amp;= LOCKED_NO;</div><div class='add'>+    if (local-&gt;transaction.type == AFR_DATA_TRANSACTION &amp;&amp; op_ret != 1)</div><div class='add'>+        ret = afr_write_subvol_reset(frame, this);</div><div class='ctx'> </div><div class='del'>-                        } else {</div><div class='del'>-                                afr_trace_inodelk_in (frame, AFR_INODELK_TRANSACTION,</div><div class='del'>-                                                      AFR_UNLOCK_OP, &amp;flock, F_SETLK, i);</div><div class='add'>+    LOCK(&amp;frame-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        call_count = --int_lock-&gt;lk_call_count;</div><div class='add'>+    }</div><div class='add'>+    UNLOCK(&amp;frame-&gt;lock);</div><div class='ctx'> </div><div class='del'>-                                STACK_WIND_COOKIE (frame, afr_unlock_inodelk_cbk,</div><div class='del'>-                                                   (void *) (long)i,</div><div class='del'>-                                                   priv-&gt;children[i],</div><div class='del'>-                                                   priv-&gt;children[i]-&gt;fops-&gt;inodelk,</div><div class='del'>-                                                   this-&gt;name, &amp;local-&gt;loc,</div><div class='del'>-                                                   F_SETLK, &amp;flock);</div><div class='add'>+    if (call_count == 0) {</div><div class='add'>+        int_lock-&gt;lock_cbk(frame, this);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-                                if (!--call_count)</div><div class='del'>-                                        break;</div><div class='del'>-</div><div class='del'>-                        }</div><div class='del'>-</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        return 0;</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-static int32_t</div><div class='del'>-afr_unlock_entrylk_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-                        int32_t op_ret, int32_t op_errno)</div><div class='del'>-{</div><div class='del'>-        afr_trace_entrylk_out (frame, AFR_ENTRYLK_TRANSACTION,</div><div class='del'>-                              AFR_UNLOCK_OP, NULL, op_ret,</div><div class='del'>-                               op_errno, (long) cookie);</div><div class='del'>-</div><div class='del'>-        afr_unlock_common_cbk (frame, cookie, this, op_ret, op_errno);</div><div class='del'>-</div><div class='del'>-        return 0;</div><div class='add'>+void</div><div class='add'>+afr_internal_lock_wind(call_frame_t *frame,</div><div class='add'>+                       int32_t (*cbk)(call_frame_t *, void *, xlator_t *,</div><div class='add'>+                                      int32_t, int32_t, dict_t *),</div><div class='add'>+                       void *cookie, int child, int lockee_num,</div><div class='add'>+                       gf_boolean_t blocking, gf_boolean_t unlock)</div><div class='add'>+{</div><div class='add'>+    afr_local_t *local = frame-&gt;local;</div><div class='add'>+    xlator_t *this = frame-&gt;this;</div><div class='add'>+    afr_private_t *priv = this-&gt;private;</div><div class='add'>+    afr_internal_lock_t *int_lock = &amp;local-&gt;internal_lock;</div><div class='add'>+    entrylk_cmd cmd = ENTRYLK_LOCK_NB;</div><div class='add'>+    int32_t cmd1 = F_SETLK;</div><div class='add'>+    struct gf_flock flock = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    switch (local-&gt;transaction.type) {</div><div class='add'>+        case AFR_ENTRY_TRANSACTION:</div><div class='add'>+        case AFR_ENTRY_RENAME_TRANSACTION:</div><div class='add'>+            if (unlock) {</div><div class='add'>+                cmd = ENTRYLK_UNLOCK;</div><div class='add'>+            } else if (blocking) { /*Doesn't make sense to have blocking</div><div class='add'>+                                      unlock*/</div><div class='add'>+                cmd = ENTRYLK_LOCK;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            if (local-&gt;fd) {</div><div class='add'>+                STACK_WIND_COOKIE(frame, cbk, cookie, priv-&gt;children[child],</div><div class='add'>+                                  priv-&gt;children[child]-&gt;fops-&gt;fentrylk,</div><div class='add'>+                                  int_lock-&gt;domain,</div><div class='add'>+                                  int_lock-&gt;lockee[lockee_num].fd,</div><div class='add'>+                                  int_lock-&gt;lockee[lockee_num].basename, cmd,</div><div class='add'>+                                  ENTRYLK_WRLCK, NULL);</div><div class='add'>+            } else {</div><div class='add'>+                STACK_WIND_COOKIE(frame, cbk, cookie, priv-&gt;children[child],</div><div class='add'>+                                  priv-&gt;children[child]-&gt;fops-&gt;entrylk,</div><div class='add'>+                                  int_lock-&gt;domain,</div><div class='add'>+                                  &amp;int_lock-&gt;lockee[lockee_num].loc,</div><div class='add'>+                                  int_lock-&gt;lockee[lockee_num].basename, cmd,</div><div class='add'>+                                  ENTRYLK_WRLCK, NULL);</div><div class='add'>+            }</div><div class='add'>+            break;</div><div class='add'>+</div><div class='add'>+        case AFR_DATA_TRANSACTION:</div><div class='add'>+        case AFR_METADATA_TRANSACTION:</div><div class='add'>+            flock = int_lock-&gt;lockee[lockee_num].flock;</div><div class='add'>+            if (unlock) {</div><div class='add'>+                flock.l_type = F_UNLCK;</div><div class='add'>+            } else if (blocking) { /*Doesn't make sense to have blocking</div><div class='add'>+                                      unlock*/</div><div class='add'>+                cmd1 = F_SETLKW;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            if (local-&gt;fd) {</div><div class='add'>+                STACK_WIND_COOKIE(</div><div class='add'>+                    frame, cbk, cookie, priv-&gt;children[child],</div><div class='add'>+                    priv-&gt;children[child]-&gt;fops-&gt;finodelk, int_lock-&gt;domain,</div><div class='add'>+                    int_lock-&gt;lockee[lockee_num].fd, cmd1, &amp;flock, NULL);</div><div class='add'>+            } else {</div><div class='add'>+                STACK_WIND_COOKIE(</div><div class='add'>+                    frame, cbk, cookie, priv-&gt;children[child],</div><div class='add'>+                    priv-&gt;children[child]-&gt;fops-&gt;inodelk, int_lock-&gt;domain,</div><div class='add'>+                    &amp;int_lock-&gt;lockee[lockee_num].loc, cmd1, &amp;flock, NULL);</div><div class='add'>+            }</div><div class='add'>+            break;</div><div class='add'>+    }</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> static int</div><div class='del'>-afr_unlock_entrylk (call_frame_t *frame, xlator_t *this)</div><div class='del'>-{</div><div class='del'>-        afr_internal_lock_t *int_lock = NULL;</div><div class='del'>-        afr_local_t         *local    = NULL;</div><div class='del'>-        afr_private_t       *priv     = NULL;</div><div class='del'>-        const char          *basename = NULL;</div><div class='del'>-        loc_t               *loc      = NULL;</div><div class='del'>-</div><div class='del'>-        int call_count = 0;</div><div class='del'>-        int i = -1;</div><div class='del'>-</div><div class='del'>-        local    = frame-&gt;local;</div><div class='del'>-        int_lock = &amp;local-&gt;internal_lock;</div><div class='del'>-        priv     = this-&gt;private;</div><div class='del'>-</div><div class='del'>-        basename = int_lock-&gt;lk_basename;</div><div class='del'>-        if (int_lock-&gt;lk_loc)</div><div class='del'>-                loc = int_lock-&gt;lk_loc;</div><div class='del'>-</div><div class='del'>-        call_count = afr_locked_nodes_count (int_lock-&gt;entry_locked_nodes,</div><div class='del'>-                                             priv-&gt;child_count);</div><div class='del'>-        int_lock-&gt;lk_call_count = call_count;</div><div class='del'>-</div><div class='del'>-        if (!call_count){</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_TRACE,</div><div class='del'>-                        "No internal locks unlocked");</div><div class='del'>-                int_lock-&gt;lock_cbk (frame, this);</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='del'>-                if (int_lock-&gt;entry_locked_nodes[i] &amp; LOCKED_YES) {</div><div class='del'>-                        afr_trace_entrylk_in (frame, AFR_ENTRYLK_NB_TRANSACTION,</div><div class='del'>-                                              AFR_UNLOCK_OP, basename, i);</div><div class='del'>-</div><div class='del'>-                        STACK_WIND_COOKIE (frame, afr_unlock_entrylk_cbk,</div><div class='del'>-                                           (void *) (long) i,</div><div class='del'>-                                           priv-&gt;children[i],</div><div class='del'>-                                           priv-&gt;children[i]-&gt;fops-&gt;entrylk,</div><div class='del'>-                                           this-&gt;name,</div><div class='del'>-                                           loc, basename,</div><div class='del'>-                                           ENTRYLK_UNLOCK, ENTRYLK_WRLCK);</div><div class='del'>-</div><div class='del'>-                        if (!--call_count)</div><div class='del'>-                                break;</div><div class='del'>-                }</div><div class='add'>+afr_unlock_now(call_frame_t *frame, xlator_t *this)</div><div class='add'>+{</div><div class='add'>+    afr_internal_lock_t *int_lock = NULL;</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    int call_count = 0;</div><div class='add'>+    int child_index = 0;</div><div class='add'>+    int lockee_num = 0;</div><div class='add'>+    int i = -1;</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    int_lock = &amp;local-&gt;internal_lock;</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    call_count = afr_lockee_locked_nodes_count(int_lock);</div><div class='add'>+</div><div class='add'>+    int_lock-&gt;lk_call_count = call_count;</div><div class='add'>+</div><div class='add'>+    if (!call_count) {</div><div class='add'>+        gf_msg_trace(this-&gt;name, 0, "No internal locks unlocked");</div><div class='add'>+        int_lock-&gt;lock_cbk(frame, this);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; int_lock-&gt;lockee_count * priv-&gt;child_count; i++) {</div><div class='add'>+        lockee_num = i / priv-&gt;child_count;</div><div class='add'>+        child_index = i % priv-&gt;child_count;</div><div class='add'>+        if (int_lock-&gt;lockee[lockee_num].locked_nodes[child_index] &amp;</div><div class='add'>+            LOCKED_YES) {</div><div class='add'>+            afr_internal_lock_wind(frame, afr_unlock_common_cbk,</div><div class='add'>+                                   (void *)(long)i, child_index, lockee_num,</div><div class='add'>+                                   _gf_false, _gf_true);</div><div class='add'>+            if (!--call_count)</div><div class='add'>+                break;</div><div class='ctx'>         }</div><div class='add'>+    }</div><div class='ctx'> </div><div class='ctx'> out:</div><div class='del'>-        return 0;</div><div class='del'>-</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> static int32_t</div><div class='del'>-afr_lock_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-	      int32_t op_ret, int32_t op_errno)</div><div class='del'>-{</div><div class='del'>-        afr_internal_lock_t *int_lock = NULL;</div><div class='del'>-	afr_local_t         *local    = NULL;</div><div class='del'>-	afr_private_t       *priv     = NULL;</div><div class='del'>-</div><div class='del'>-	int done = 0;</div><div class='del'>-	int child_index = (long) cookie;</div><div class='del'>-</div><div class='del'>-	local    = frame-&gt;local;</div><div class='del'>-        int_lock = &amp;local-&gt;internal_lock;</div><div class='del'>-	priv     = this-&gt;private;</div><div class='del'>-</div><div class='del'>-	LOCK (&amp;frame-&gt;lock);</div><div class='del'>-	{</div><div class='del'>-		if (op_ret == -1) {</div><div class='del'>-			if (op_errno == ENOSYS) {</div><div class='del'>-				/* return ENOTSUP */</div><div class='del'>-				gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-					"subvolume does not support locking. "</div><div class='del'>-					"please load features/posix-locks xlator on server");</div><div class='del'>-				local-&gt;op_ret = op_ret;</div><div class='del'>-                                int_lock-&gt;lock_op_ret = op_ret;</div><div class='del'>-				done = 1;</div><div class='del'>-			}</div><div class='del'>-</div><div class='del'>-			local-&gt;child_up[child_index] = 0;</div><div class='del'>-			local-&gt;op_errno              = op_errno;</div><div class='del'>-                        int_lock-&gt;lock_op_errno      = op_errno;</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='del'>-	UNLOCK (&amp;frame-&gt;lock);</div><div class='del'>-</div><div class='del'>-        if ((op_ret == -1) &amp;&amp;</div><div class='del'>-            (op_errno == ENOSYS)) {</div><div class='del'>-                afr_unlock (frame, this);</div><div class='del'>-        } else {</div><div class='del'>-                if (op_ret == 0) {</div><div class='del'>-                        int_lock-&gt;locked_nodes[child_index]</div><div class='del'>-                                |= LOCKED_YES;</div><div class='del'>-                        int_lock-&gt;lock_count++;</div><div class='add'>+afr_lock_cbk(call_frame_t *frame, void *cookie, xlator_t *this, int32_t op_ret,</div><div class='add'>+             int32_t op_errno, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    afr_internal_lock_t *int_lock = NULL;</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    int cky = (long)cookie;</div><div class='add'>+    int child_index = 0;</div><div class='add'>+    int lockee_num = 0;</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    int_lock = &amp;local-&gt;internal_lock;</div><div class='add'>+</div><div class='add'>+    child_index = ((int)cky) % priv-&gt;child_count;</div><div class='add'>+    lockee_num = ((int)cky) / priv-&gt;child_count;</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;frame-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        if (op_ret == -1) {</div><div class='add'>+            if (op_errno == ENOSYS) {</div><div class='add'>+                /* return ENOTSUP */</div><div class='add'>+                gf_msg(this-&gt;name, GF_LOG_ERROR, ENOSYS,</div><div class='add'>+                       AFR_MSG_LOCK_XLATOR_NOT_LOADED,</div><div class='add'>+                       "subvolume does not support locking. "</div><div class='add'>+                       "please load features/locks xlator on server");</div><div class='add'>+                local-&gt;op_ret = op_ret;</div><div class='add'>+                int_lock-&gt;lock_op_ret = op_ret;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            local-&gt;op_errno = op_errno;</div><div class='add'>+            int_lock-&gt;lock_op_errno = op_errno;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        int_lock-&gt;lk_attempted_count++;</div><div class='add'>+    }</div><div class='add'>+    UNLOCK(&amp;frame-&gt;lock);</div><div class='add'>+</div><div class='add'>+    if ((op_ret == -1) &amp;&amp; (op_errno == ENOSYS)) {</div><div class='add'>+        afr_unlock_now(frame, this);</div><div class='add'>+    } else {</div><div class='add'>+        if (op_ret == 0) {</div><div class='add'>+            int_lock-&gt;lockee[lockee_num]</div><div class='add'>+                .locked_nodes[child_index] |= LOCKED_YES;</div><div class='add'>+            int_lock-&gt;lockee[lockee_num].locked_count++;</div><div class='add'>+            int_lock-&gt;lock_count++;</div><div class='add'>+            if (local-&gt;transaction.type == AFR_DATA_TRANSACTION) {</div><div class='add'>+                LOCK(&amp;local-&gt;inode-&gt;lock);</div><div class='add'>+                {</div><div class='add'>+                    local-&gt;inode_ctx-&gt;lock_count++;</div><div class='ctx'>                 }</div><div class='del'>-                afr_lock_blocking (frame, this, child_index + 1);</div><div class='add'>+                UNLOCK(&amp;local-&gt;inode-&gt;lock);</div><div class='add'>+            }</div><div class='ctx'>         }</div><div class='add'>+        afr_lock_blocking(frame, this, cky + 1);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-static int32_t</div><div class='del'>-afr_blocking_inodelk_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-                          int32_t op_ret, int32_t op_errno)</div><div class='del'>-{</div><div class='del'>-        afr_trace_inodelk_out (frame, AFR_INODELK_TRANSACTION,</div><div class='del'>-                               AFR_LOCK_OP, NULL, op_ret,</div><div class='del'>-                               op_errno, (long) cookie);</div><div class='del'>-</div><div class='del'>-        afr_lock_cbk (frame, cookie, this, op_ret, op_errno);</div><div class='del'>-        return 0;</div><div class='del'>-</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-static int32_t</div><div class='del'>-afr_lock_lower_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-                    int32_t op_ret, int32_t op_errno)</div><div class='add'>+static gf_boolean_t</div><div class='add'>+_is_lock_wind_needed(afr_local_t *local, int child_index)</div><div class='ctx'> {</div><div class='del'>-        afr_internal_lock_t *int_lock    = NULL;</div><div class='del'>-        afr_private_t       *priv        = NULL;</div><div class='del'>-        afr_local_t         *local       = NULL;</div><div class='del'>-        loc_t               *lower       = NULL;</div><div class='del'>-        loc_t               *higher      = NULL;</div><div class='del'>-        const char          *lower_name  = NULL;</div><div class='del'>-        const char          *higher_name = NULL;</div><div class='del'>-</div><div class='del'>-        int child_index = (long) cookie;</div><div class='del'>-</div><div class='del'>-        priv     = this-&gt;private;</div><div class='del'>-        local    = frame-&gt;local;</div><div class='del'>-        int_lock = &amp;local-&gt;internal_lock;</div><div class='del'>-</div><div class='del'>-        LOCK (&amp;frame-&gt;lock);</div><div class='del'>-        {</div><div class='del'>-                if (op_ret == -1) {</div><div class='del'>-                        if (op_errno == ENOSYS) {</div><div class='del'>-                                /* return ENOTSUP */</div><div class='del'>-</div><div class='del'>-                                gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-                                        "subvolume does not support locking. "</div><div class='del'>-                                        "please load features/posix-locks xlator on server");</div><div class='del'>-</div><div class='del'>-                                local-&gt;op_ret   = op_ret;</div><div class='del'>-                        }</div><div class='del'>-</div><div class='del'>-                        local-&gt;child_up[child_index] = 0;</div><div class='del'>-                        local-&gt;op_errno = op_errno;</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='del'>-        UNLOCK (&amp;frame-&gt;lock);</div><div class='del'>-</div><div class='del'>-        if (op_ret != 0) {</div><div class='del'>-                afr_unlock (frame, this);</div><div class='del'>-                goto out;</div><div class='del'>-        } else {</div><div class='del'>-                int_lock-&gt;lower_locked_nodes[child_index] |= LOCKED_LOWER;</div><div class='del'>-                int_lock-&gt;lock_count++;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        /* The lower path has been locked. Now lock the higher path */</div><div class='del'>-</div><div class='del'>-        lower = lower_path (&amp;local-&gt;transaction.parent_loc,</div><div class='del'>-                            local-&gt;transaction.basename,</div><div class='del'>-                            &amp;local-&gt;transaction.new_parent_loc,</div><div class='del'>-                            local-&gt;transaction.new_basename);</div><div class='del'>-</div><div class='del'>-        lower_name = (lower == &amp;local-&gt;transaction.parent_loc ?</div><div class='del'>-                      local-&gt;transaction.basename :</div><div class='del'>-                      local-&gt;transaction.new_basename);</div><div class='add'>+    if (!local-&gt;child_up[child_index])</div><div class='add'>+        return _gf_false;</div><div class='ctx'> </div><div class='del'>-        higher = (lower == &amp;local-&gt;transaction.parent_loc ?</div><div class='del'>-                  &amp;local-&gt;transaction.new_parent_loc :</div><div class='del'>-                  &amp;local-&gt;transaction.parent_loc);</div><div class='del'>-</div><div class='del'>-        higher_name = (higher == &amp;local-&gt;transaction.parent_loc ?</div><div class='del'>-                       local-&gt;transaction.basename :</div><div class='del'>-                       local-&gt;transaction.new_basename);</div><div class='del'>-</div><div class='del'>-        afr_trace_entrylk_in (frame, AFR_ENTRYLK_TRANSACTION,</div><div class='del'>-                              AFR_LOCK_OP, higher_name, child_index);</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-        STACK_WIND_COOKIE (frame, afr_lock_cbk,</div><div class='del'>-                           (void *) (long) child_index,</div><div class='del'>-                           priv-&gt;children[child_index],</div><div class='del'>-                           priv-&gt;children[child_index]-&gt;fops-&gt;entrylk,</div><div class='del'>-                           this-&gt;name, higher, higher_name,</div><div class='del'>-                           ENTRYLK_LOCK, ENTRYLK_WRLCK);</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        return 0;</div><div class='add'>+    return _gf_true;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-static int32_t</div><div class='del'>-afr_blocking_entrylk_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-                          int32_t op_ret, int32_t op_errno)</div><div class='add'>+static gf_boolean_t</div><div class='add'>+is_blocking_locks_count_sufficient(call_frame_t *frame, xlator_t *this)</div><div class='ctx'> {</div><div class='del'>-        afr_trace_entrylk_out (frame, AFR_ENTRYLK_TRANSACTION,</div><div class='del'>-                               AFR_LOCK_OP, NULL, op_ret,</div><div class='del'>-                               op_errno, (long)cookie);</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    afr_internal_lock_t *int_lock = NULL;</div><div class='add'>+    int child = 0;</div><div class='add'>+    int nlockee = 0;</div><div class='add'>+    int lockee_count = 0;</div><div class='add'>+    gf_boolean_t ret = _gf_true;</div><div class='ctx'> </div><div class='del'>-        afr_lock_cbk (frame, cookie, this, op_ret, op_errno);</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+    int_lock = &amp;local-&gt;internal_lock;</div><div class='add'>+    lockee_count = int_lock-&gt;lockee_count;</div><div class='ctx'> </div><div class='del'>-static int</div><div class='del'>-afr_copy_locked_nodes (call_frame_t *frame, xlator_t *this)</div><div class='del'>-{</div><div class='del'>-        afr_internal_lock_t *int_lock = NULL;</div><div class='del'>-        afr_local_t         *local    = NULL;</div><div class='del'>-        afr_private_t       *priv     = NULL;</div><div class='del'>-</div><div class='del'>-        priv     = this-&gt;private;</div><div class='del'>-        local    = frame-&gt;local;</div><div class='del'>-        int_lock = &amp;local-&gt;internal_lock;</div><div class='del'>-</div><div class='del'>-        switch (local-&gt;transaction.type) {</div><div class='del'>-	case AFR_DATA_TRANSACTION:</div><div class='del'>-	case AFR_METADATA_TRANSACTION:</div><div class='del'>-	case AFR_FLUSH_TRANSACTION:</div><div class='del'>-                memcpy (int_lock-&gt;inode_locked_nodes,</div><div class='del'>-                        int_lock-&gt;locked_nodes,</div><div class='del'>-                        priv-&gt;child_count);</div><div class='del'>-                int_lock-&gt;inodelk_lock_count = int_lock-&gt;lock_count;</div><div class='del'>-                break;</div><div class='del'>-</div><div class='del'>-        case AFR_ENTRY_RENAME_TRANSACTION:</div><div class='del'>-        case AFR_ENTRY_TRANSACTION:</div><div class='del'>-                memcpy (int_lock-&gt;entry_locked_nodes,</div><div class='del'>-                        int_lock-&gt;locked_nodes,</div><div class='del'>-                        priv-&gt;child_count);</div><div class='del'>-                int_lock-&gt;entrylk_lock_count = int_lock-&gt;lock_count;</div><div class='del'>-                break;</div><div class='add'>+    if (int_lock-&gt;lock_count == 0) {</div><div class='add'>+        afr_log_locks_failure(frame, "any subvolume", "lock",</div><div class='add'>+                              int_lock-&gt;lock_op_errno);</div><div class='add'>+        return _gf_false;</div><div class='add'>+    }</div><div class='add'>+    /* For FOPS that take multiple sets of locks (mkdir, rename),</div><div class='add'>+     * there must be at least one brick on which the locks from</div><div class='add'>+     * all lock sets were successful. */</div><div class='add'>+    for (child = 0; child &lt; priv-&gt;child_count; child++) {</div><div class='add'>+        ret = _gf_true;</div><div class='add'>+        for (nlockee = 0; nlockee &lt; lockee_count; nlockee++) {</div><div class='add'>+            if (!(int_lock-&gt;lockee[nlockee].locked_nodes[child] &amp; LOCKED_YES))</div><div class='add'>+                ret = _gf_false;</div><div class='ctx'>         }</div><div class='add'>+        if (ret)</div><div class='add'>+            return ret;</div><div class='add'>+    }</div><div class='add'>+    if (!ret)</div><div class='add'>+        afr_log_locks_failure(frame, "all", "lock", int_lock-&gt;lock_op_errno);</div><div class='ctx'> </div><div class='del'>-        return 0;</div><div class='del'>-</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-afr_lock_blocking (call_frame_t *frame, xlator_t *this, int child_index)</div><div class='add'>+afr_lock_blocking(call_frame_t *frame, xlator_t *this, int cookie)</div><div class='ctx'> {</div><div class='del'>-        afr_internal_lock_t *int_lock    = NULL;</div><div class='del'>-        afr_local_t         *local       = NULL;</div><div class='del'>-	afr_private_t       *priv        = NULL;</div><div class='del'>-        afr_fd_ctx_t        *fd_ctx      = NULL;</div><div class='del'>-	loc_t               *lower       = NULL;</div><div class='del'>-	loc_t               *higher      = NULL;</div><div class='del'>-	const char          *lower_name  = NULL;</div><div class='del'>-	const char          *higher_name = NULL;</div><div class='del'>-</div><div class='del'>-	struct flock flock;</div><div class='del'>-        uint64_t ctx;</div><div class='del'>-        int ret = 0;</div><div class='del'>-</div><div class='del'>-	local    = frame-&gt;local;</div><div class='del'>-        int_lock = &amp;local-&gt;internal_lock;</div><div class='del'>-	priv     = this-&gt;private;</div><div class='add'>+    afr_internal_lock_t *int_lock = NULL;</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    uint64_t ctx = 0;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    int child_index = 0;</div><div class='add'>+    int lockee_num = 0;</div><div class='ctx'> </div><div class='del'>-	flock.l_start = int_lock-&gt;lk_flock.l_start;</div><div class='del'>-	flock.l_len   = int_lock-&gt;lk_flock.l_len;</div><div class='del'>-	flock.l_type  = int_lock-&gt;lk_flock.l_type;</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    int_lock = &amp;local-&gt;internal_lock;</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+    child_index = cookie % priv-&gt;child_count;</div><div class='add'>+    lockee_num = cookie / priv-&gt;child_count;</div><div class='ctx'> </div><div class='del'>-        if (local-&gt;fd) {</div><div class='del'>-                ret = fd_ctx_get (local-&gt;fd, this, &amp;ctx);</div><div class='add'>+    if (local-&gt;fd) {</div><div class='add'>+        ret = fd_ctx_get(local-&gt;fd, this, &amp;ctx);</div><div class='ctx'> </div><div class='del'>-                if (ret &lt; 0) {</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-                                "unable to get fd ctx for fd=%p",</div><div class='del'>-                                local-&gt;fd);</div><div class='add'>+        if (ret &lt; 0) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_INFO, 0, AFR_MSG_FD_CTX_GET_FAILED,</div><div class='add'>+                   "unable to get fd ctx for fd=%p", local-&gt;fd);</div><div class='ctx'> </div><div class='del'>-                        local-&gt;op_ret           = -1;</div><div class='del'>-                        int_lock-&gt;lock_op_ret   = -1;</div><div class='del'>-                        local-&gt;op_errno         = EINVAL;</div><div class='del'>-                        int_lock-&gt;lock_op_errno = EINVAL;</div><div class='add'>+            local-&gt;op_ret = -1;</div><div class='add'>+            int_lock-&gt;lock_op_ret = -1;</div><div class='ctx'> </div><div class='del'>-                        afr_copy_locked_nodes (frame, this);</div><div class='add'>+            afr_unlock_now(frame, this);</div><div class='ctx'> </div><div class='del'>-                        afr_unlock (frame, this);</div><div class='del'>-</div><div class='del'>-                        return 0;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                fd_ctx = (afr_fd_ctx_t *)(long) ctx;</div><div class='add'>+            return 0;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-                /* skip over children that or down</div><div class='del'>-                   or don't have the fd open */</div><div class='add'>+    if (int_lock-&gt;lk_expected_count == int_lock-&gt;lk_attempted_count) {</div><div class='add'>+        if (!is_blocking_locks_count_sufficient(frame, this)) {</div><div class='add'>+            local-&gt;op_ret = -1;</div><div class='add'>+            int_lock-&gt;lock_op_ret = -1;</div><div class='ctx'> </div><div class='del'>-                while ((child_index &lt; priv-&gt;child_count)</div><div class='del'>-                       &amp;&amp; (!local-&gt;child_up[child_index]</div><div class='del'>-                           || !fd_ctx-&gt;opened_on[child_index]))</div><div class='add'>+            afr_unlock_now(frame, this);</div><div class='ctx'> </div><div class='del'>-                        child_index++;</div><div class='del'>-        } else {</div><div class='del'>-                /* skip over children that are down */</div><div class='del'>-                while ((child_index &lt; priv-&gt;child_count)</div><div class='del'>-                       &amp;&amp; !local-&gt;child_up[child_index])</div><div class='del'>-                        child_index++;</div><div class='add'>+            return 0;</div><div class='ctx'>         }</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	if ((child_index == priv-&gt;child_count) &amp;&amp;</div><div class='del'>-	    int_lock-&gt;lock_count == 0) {</div><div class='del'>-</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-			"unable to lock on even one child");</div><div class='add'>+    if (int_lock-&gt;lk_expected_count == int_lock-&gt;lk_attempted_count) {</div><div class='add'>+        /* we're done locking */</div><div class='ctx'> </div><div class='del'>-		local-&gt;op_ret           = -1;</div><div class='del'>-                int_lock-&gt;lock_op_ret   = -1;</div><div class='del'>-		local-&gt;op_errno         = EAGAIN;</div><div class='del'>-                int_lock-&gt;lock_op_errno = EAGAIN;</div><div class='add'>+        gf_msg_debug(this-&gt;name, 0, "we're done locking");</div><div class='ctx'> </div><div class='del'>-                afr_copy_locked_nodes (frame, this);</div><div class='add'>+        int_lock-&gt;lock_op_ret = 0;</div><div class='add'>+        int_lock-&gt;lock_cbk(frame, this);</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-                afr_unlock(frame, this);</div><div class='del'>-</div><div class='del'>-		return 0;</div><div class='del'>-</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	if ((child_index == priv-&gt;child_count)</div><div class='del'>-	    || (int_lock-&gt;lock_count ==</div><div class='del'>-		afr_up_children_count (priv-&gt;child_count,</div><div class='del'>-                                       local-&gt;child_up))) {</div><div class='del'>-</div><div class='del'>-		/* we're done locking */</div><div class='del'>-</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-                        "we're done locking");</div><div class='del'>-</div><div class='del'>-                afr_copy_locked_nodes (frame, this);</div><div class='del'>-</div><div class='del'>-                int_lock-&gt;lock_op_ret = 0;</div><div class='del'>-                int_lock-&gt;lock_cbk (frame, this);</div><div class='del'>-		return 0;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	switch (local-&gt;transaction.type) {</div><div class='del'>-	case AFR_DATA_TRANSACTION:</div><div class='del'>-	case AFR_METADATA_TRANSACTION:</div><div class='del'>-	case AFR_FLUSH_TRANSACTION:</div><div class='del'>-</div><div class='del'>-		if (local-&gt;fd) {</div><div class='del'>-                        afr_trace_inodelk_in (frame, AFR_INODELK_TRANSACTION,</div><div class='del'>-                                              AFR_LOCK_OP, &amp;flock, F_SETLKW,</div><div class='del'>-                                              child_index);</div><div class='del'>-</div><div class='del'>-			STACK_WIND_COOKIE (frame, afr_blocking_inodelk_cbk,</div><div class='del'>-					   (void *) (long) child_index,</div><div class='del'>-					   priv-&gt;children[child_index],</div><div class='del'>-					   priv-&gt;children[child_index]-&gt;fops-&gt;finodelk,</div><div class='del'>-					   this-&gt;name, local-&gt;fd,</div><div class='del'>-                                           F_SETLKW, &amp;flock);</div><div class='del'>-</div><div class='del'>-		} else {</div><div class='del'>-                        afr_trace_inodelk_in (frame, AFR_INODELK_TRANSACTION,</div><div class='del'>-                                              AFR_LOCK_OP, &amp;flock, F_SETLKW,</div><div class='del'>-                                              child_index);</div><div class='del'>-</div><div class='del'>-			STACK_WIND_COOKIE (frame, afr_blocking_inodelk_cbk,</div><div class='del'>-					   (void *) (long) child_index,</div><div class='del'>-					   priv-&gt;children[child_index],</div><div class='del'>-					   priv-&gt;children[child_index]-&gt;fops-&gt;inodelk,</div><div class='del'>-					   this-&gt;name, &amp;local-&gt;loc,</div><div class='del'>-                                           F_SETLKW, &amp;flock);</div><div class='del'>-		}</div><div class='del'>-</div><div class='del'>-		break;</div><div class='del'>-</div><div class='del'>-	case AFR_ENTRY_RENAME_TRANSACTION:</div><div class='del'>-	{</div><div class='del'>-		lower = lower_path (&amp;local-&gt;transaction.parent_loc,</div><div class='del'>-				    local-&gt;transaction.basename,</div><div class='del'>-				    &amp;local-&gt;transaction.new_parent_loc,</div><div class='del'>-				    local-&gt;transaction.new_basename);</div><div class='del'>-</div><div class='del'>-		lower_name = (lower == &amp;local-&gt;transaction.parent_loc ?</div><div class='del'>-			      local-&gt;transaction.basename :</div><div class='del'>-			      local-&gt;transaction.new_basename);</div><div class='del'>-</div><div class='del'>-		higher = (lower == &amp;local-&gt;transaction.parent_loc ?</div><div class='del'>-			  &amp;local-&gt;transaction.new_parent_loc :</div><div class='del'>-			  &amp;local-&gt;transaction.parent_loc);</div><div class='del'>-</div><div class='del'>-		higher_name = (higher == &amp;local-&gt;transaction.parent_loc ?</div><div class='del'>-			       local-&gt;transaction.basename :</div><div class='del'>-			       local-&gt;transaction.new_basename);</div><div class='del'>-</div><div class='del'>-                afr_trace_entrylk_in (frame, AFR_ENTRYLK_TRANSACTION,</div><div class='del'>-                                      AFR_LOCK_OP, lower_name, child_index);</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-		STACK_WIND_COOKIE (frame, afr_lock_lower_cbk,</div><div class='del'>-				   (void *) (long) child_index,</div><div class='del'>-				   priv-&gt;children[child_index],</div><div class='del'>-				   priv-&gt;children[child_index]-&gt;fops-&gt;entrylk,</div><div class='del'>-				   this-&gt;name, lower, lower_name,</div><div class='del'>-				   ENTRYLK_LOCK, ENTRYLK_WRLCK);</div><div class='del'>-</div><div class='del'>-		break;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	case AFR_ENTRY_TRANSACTION:</div><div class='del'>-		if (local-&gt;fd) {</div><div class='del'>-                        afr_trace_entrylk_in (frame, AFR_ENTRYLK_TRANSACTION,</div><div class='del'>-                                              AFR_LOCK_OP, local-&gt;transaction.basename,</div><div class='del'>-                                              child_index);</div><div class='del'>-</div><div class='del'>-			STACK_WIND_COOKIE (frame, afr_blocking_entrylk_cbk,</div><div class='del'>-					   (void *) (long) child_index,</div><div class='del'>-					   priv-&gt;children[child_index],</div><div class='del'>-					   priv-&gt;children[child_index]-&gt;fops-&gt;fentrylk,</div><div class='del'>-					   this-&gt;name, local-&gt;fd,</div><div class='del'>-					   local-&gt;transaction.basename,</div><div class='del'>-					   ENTRYLK_LOCK, ENTRYLK_WRLCK);</div><div class='del'>-		} else {</div><div class='del'>-                        afr_trace_entrylk_in (frame, AFR_ENTRYLK_TRANSACTION,</div><div class='del'>-                                              AFR_LOCK_OP, local-&gt;transaction.basename,</div><div class='del'>-                                              child_index);</div><div class='del'>-</div><div class='del'>-			STACK_WIND_COOKIE (frame, afr_blocking_entrylk_cbk,</div><div class='del'>-					   (void *) (long) child_index,</div><div class='del'>-					   priv-&gt;children[child_index],</div><div class='del'>-					   priv-&gt;children[child_index]-&gt;fops-&gt;entrylk,</div><div class='del'>-					   this-&gt;name,</div><div class='del'>-                                           &amp;local-&gt;transaction.parent_loc,</div><div class='del'>-					   local-&gt;transaction.basename,</div><div class='del'>-					   ENTRYLK_LOCK, ENTRYLK_WRLCK);</div><div class='del'>-		}</div><div class='del'>-</div><div class='del'>-		break;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='add'>+    if (!_is_lock_wind_needed(local, child_index)) {</div><div class='add'>+        afr_lock_blocking(frame, this, cookie + 1);</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='add'>+    afr_internal_lock_wind(frame, afr_lock_cbk, (void *)(long)cookie,</div><div class='add'>+                           child_index, lockee_num, _gf_true, _gf_false);</div><div class='ctx'> </div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> int32_t</div><div class='del'>-afr_blocking_lock (call_frame_t *frame, xlator_t *this)</div><div class='add'>+afr_blocking_lock(call_frame_t *frame, xlator_t *this)</div><div class='ctx'> {</div><div class='del'>-        afr_internal_lock_t *int_lock = NULL;</div><div class='del'>-        afr_local_t         *local    = NULL;</div><div class='del'>-        afr_private_t       *priv     = NULL;</div><div class='del'>-</div><div class='del'>-        priv     = this-&gt;private;</div><div class='del'>-        local    = frame-&gt;local;</div><div class='del'>-        int_lock = &amp;local-&gt;internal_lock;</div><div class='del'>-</div><div class='del'>-        switch (local-&gt;transaction.type) {</div><div class='del'>-	case AFR_DATA_TRANSACTION:</div><div class='del'>-	case AFR_METADATA_TRANSACTION:</div><div class='del'>-	case AFR_FLUSH_TRANSACTION:</div><div class='del'>-                initialize_inodelk_variables (frame, this);</div><div class='del'>-                break;</div><div class='add'>+    afr_internal_lock_t *int_lock = NULL;</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    int up_count = 0;</div><div class='ctx'> </div><div class='del'>-        case AFR_ENTRY_RENAME_TRANSACTION:</div><div class='del'>-        case AFR_ENTRY_TRANSACTION:</div><div class='del'>-                initialize_entrylk_variables (frame, this);</div><div class='del'>-                break;</div><div class='del'>-        }</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    int_lock = &amp;local-&gt;internal_lock;</div><div class='ctx'> </div><div class='del'>-        afr_lock_blocking (frame, this, 0);</div><div class='add'>+    up_count = AFR_COUNT(local-&gt;child_up, priv-&gt;child_count);</div><div class='add'>+    int_lock-&gt;lk_call_count = int_lock-&gt;lk_expected_count =</div><div class='add'>+        (int_lock-&gt;lockee_count * up_count);</div><div class='add'>+    initialize_internal_lock_variables(frame, this);</div><div class='ctx'> </div><div class='del'>-        return 0;</div><div class='add'>+    afr_lock_blocking(frame, this, 0);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> static int32_t</div><div class='del'>-afr_nonblocking_entrylk_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-                             int32_t op_ret, int32_t op_errno)</div><div class='add'>+afr_nb_internal_lock_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                         int32_t op_ret, int32_t op_errno, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-        afr_internal_lock_t *int_lock = NULL;</div><div class='del'>-	afr_local_t         *local    = NULL;</div><div class='del'>-	afr_private_t       *priv     = NULL;</div><div class='add'>+    afr_internal_lock_t *int_lock = NULL;</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    int call_count = 0;</div><div class='add'>+    int child_index = 0;</div><div class='add'>+    int lockee_num = 0;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='ctx'> </div><div class='del'>-        int call_count          = 0;</div><div class='del'>-	int child_index         = (long) cookie;</div><div class='add'>+    priv = this-&gt;private;</div><div class='ctx'> </div><div class='del'>-	local    = frame-&gt;local;</div><div class='del'>-        int_lock = &amp;local-&gt;internal_lock;</div><div class='del'>-	priv     = this-&gt;private;</div><div class='add'>+    child_index = ((long)cookie) % priv-&gt;child_count;</div><div class='add'>+    lockee_num = ((long)cookie) / priv-&gt;child_count;</div><div class='ctx'> </div><div class='del'>-        afr_trace_entrylk_out (frame, AFR_ENTRYLK_TRANSACTION,</div><div class='del'>-                               AFR_LOCK_OP, NULL, op_ret,</div><div class='del'>-                               op_errno, (long) cookie);</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    int_lock = &amp;local-&gt;internal_lock;</div><div class='ctx'> </div><div class='del'>-        LOCK (&amp;frame-&gt;lock);</div><div class='add'>+    if (op_ret == 0 &amp;&amp; local-&gt;transaction.type == AFR_DATA_TRANSACTION) {</div><div class='add'>+        LOCK(&amp;local-&gt;inode-&gt;lock);</div><div class='ctx'>         {</div><div class='del'>-                call_count = --int_lock-&gt;lk_call_count;</div><div class='del'>-        }</div><div class='del'>-        UNLOCK (&amp;frame-&gt;lock);</div><div class='del'>-</div><div class='del'>-        if (op_ret &lt; 0 ) {</div><div class='del'>-			if (op_errno == ENOSYS) {</div><div class='del'>-				/* return ENOTSUP */</div><div class='del'>-				gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-					"subvolume does not support locking. "</div><div class='del'>-					"please load features/posix-locks xlator on server");</div><div class='del'>-				local-&gt;op_ret         = op_ret;</div><div class='del'>-                                int_lock-&gt;lock_op_ret = op_ret;</div><div class='del'>-</div><div class='del'>-                                local-&gt;child_up[child_index] = 0;</div><div class='del'>-                                int_lock-&gt;lock_op_errno      = op_errno;</div><div class='del'>-                                local-&gt;op_errno              = op_errno;</div><div class='del'>-                        }</div><div class='del'>-        } else if (op_ret == 0) {</div><div class='del'>-                        int_lock-&gt;entry_locked_nodes[child_index]</div><div class='del'>-                                |= LOCKED_YES;</div><div class='del'>-                        int_lock-&gt;entrylk_lock_count++;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (call_count == 0) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_TRACE,</div><div class='del'>-                        "Last locking reply received");</div><div class='del'>-                /* all locks successfull. Proceed to call FOP */</div><div class='del'>-                if (int_lock-&gt;entrylk_lock_count ==</div><div class='del'>-                    afr_up_children_count (priv-&gt;child_count, local-&gt;child_up)) {</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_TRACE,</div><div class='del'>-                                "All servers locked. Calling the cbk");</div><div class='del'>-                        int_lock-&gt;lock_op_ret = 0;</div><div class='del'>-                        int_lock-&gt;lock_cbk (frame, this);</div><div class='del'>-                }</div><div class='del'>-                /* Not all locks were successfull. Unlock and try locking</div><div class='del'>-                   again, this time with serially blocking locks */</div><div class='del'>-                else {</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_TRACE,</div><div class='del'>-                                "%d servers locked. Trying again with blocking calls",</div><div class='del'>-                                int_lock-&gt;lock_count);</div><div class='del'>-</div><div class='del'>-                        afr_unlock(frame, this);</div><div class='del'>-                }</div><div class='add'>+            local-&gt;inode_ctx-&gt;lock_count++;</div><div class='ctx'>         }</div><div class='add'>+        UNLOCK(&amp;local-&gt;inode-&gt;lock);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-afr_nonblocking_entrylk (call_frame_t *frame, xlator_t *this)</div><div class='del'>-{</div><div class='del'>-        afr_internal_lock_t *int_lock = NULL;</div><div class='del'>-        afr_local_t         *local    = NULL;</div><div class='del'>-        afr_private_t       *priv     = NULL;</div><div class='del'>-        afr_fd_ctx_t        *fd_ctx   = NULL;</div><div class='del'>-        const char          *basename = NULL;</div><div class='del'>-        loc_t               *loc      = NULL;</div><div class='del'>-</div><div class='del'>-        int32_t call_count = 0;</div><div class='del'>-        int i = 0;</div><div class='del'>-        uint64_t  ctx;</div><div class='del'>-        int ret = 0;</div><div class='del'>-</div><div class='del'>-        local    = frame-&gt;local;</div><div class='del'>-        int_lock = &amp;local-&gt;internal_lock;</div><div class='del'>-        priv     = this-&gt;private;</div><div class='del'>-</div><div class='del'>-        initialize_entrylk_variables (frame, this);</div><div class='del'>-</div><div class='del'>-        basename = int_lock-&gt;lk_basename;</div><div class='del'>-        if (int_lock-&gt;lk_loc)</div><div class='del'>-                loc = int_lock-&gt;lk_loc;</div><div class='del'>-</div><div class='del'>-        if (local-&gt;fd) {</div><div class='del'>-                ret = fd_ctx_get (local-&gt;fd, this, &amp;ctx);</div><div class='del'>-</div><div class='del'>-                if (ret &lt; 0) {</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-                                "unable to get fd ctx for fd=%p",</div><div class='del'>-                                local-&gt;fd);</div><div class='del'>-</div><div class='del'>-                        local-&gt;op_ret           = -1;</div><div class='del'>-                        int_lock-&gt;lock_op_ret   = -1;</div><div class='del'>-                        local-&gt;op_errno         = EINVAL;</div><div class='del'>-                        int_lock-&gt;lock_op_errno = EINVAL;</div><div class='del'>-</div><div class='del'>-                        return -1;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                fd_ctx = (afr_fd_ctx_t *)(long) ctx;</div><div class='del'>-</div><div class='del'>-                call_count = internal_lock_count (frame, this, fd_ctx);</div><div class='del'>-                int_lock-&gt;lk_call_count = call_count;</div><div class='del'>-</div><div class='del'>-                /* Send non-blocking entrylk calls only on up children</div><div class='del'>-                   and where the fd has been opened */</div><div class='del'>-                for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='del'>-                        if (local-&gt;child_up[i] &amp;&amp; fd_ctx-&gt;opened_on[i]) {</div><div class='del'>-                                afr_trace_entrylk_in (frame, AFR_ENTRYLK_NB_TRANSACTION,</div><div class='del'>-                                                      AFR_LOCK_OP, basename, i);</div><div class='del'>-</div><div class='del'>-                                STACK_WIND_COOKIE (frame, afr_nonblocking_entrylk_cbk,</div><div class='del'>-                                                   (void *) (long) i,</div><div class='del'>-                                                   priv-&gt;children[i],</div><div class='del'>-                                                   priv-&gt;children[i]-&gt;fops-&gt;fentrylk,</div><div class='del'>-                                                   this-&gt;name, local-&gt;fd,</div><div class='del'>-                                                   basename,</div><div class='del'>-                                                   ENTRYLK_LOCK_NB, ENTRYLK_WRLCK);</div><div class='del'>-                        }</div><div class='del'>-                }</div><div class='del'>-        } else {</div><div class='del'>-                GF_ASSERT (loc);</div><div class='del'>-</div><div class='del'>-                call_count = internal_lock_count (frame, this, NULL);</div><div class='del'>-                int_lock-&gt;lk_call_count = call_count;</div><div class='del'>-</div><div class='del'>-                for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='del'>-                        if (local-&gt;child_up[i]) {</div><div class='del'>-                                afr_trace_entrylk_in (frame, AFR_ENTRYLK_NB_TRANSACTION,</div><div class='del'>-                                                      AFR_LOCK_OP, basename, i);</div><div class='del'>-</div><div class='del'>-                                STACK_WIND_COOKIE (frame, afr_nonblocking_entrylk_cbk,</div><div class='del'>-                                                   (void *) (long) i,</div><div class='del'>-                                                   priv-&gt;children[i],</div><div class='del'>-                                                   priv-&gt;children[i]-&gt;fops-&gt;entrylk,</div><div class='del'>-                                                   this-&gt;name, loc, basename,</div><div class='del'>-                                                   ENTRYLK_LOCK, ENTRYLK_WRLCK);</div><div class='del'>-</div><div class='del'>-                                if (!--call_count)</div><div class='del'>-                                        break;</div><div class='del'>-</div><div class='del'>-                        }</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-afr_nonblocking_inodelk_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-                             int32_t op_ret, int32_t op_errno)</div><div class='del'>-{</div><div class='del'>-        afr_internal_lock_t *int_lock = NULL;</div><div class='del'>-	afr_local_t         *local    = NULL;</div><div class='del'>-	afr_private_t       *priv     = NULL;</div><div class='del'>-</div><div class='del'>-        int call_count  = 0;</div><div class='del'>-	int child_index = (long) cookie;</div><div class='del'>-</div><div class='del'>-	local    = frame-&gt;local;</div><div class='del'>-        int_lock = &amp;local-&gt;internal_lock;</div><div class='del'>-	priv     = this-&gt;private;</div><div class='del'>-</div><div class='del'>-        afr_trace_inodelk_out (frame, AFR_INODELK_NB_TRANSACTION,</div><div class='del'>-                               AFR_LOCK_OP, NULL, op_ret,</div><div class='del'>-                               op_errno, (long) cookie);</div><div class='del'>-</div><div class='del'>-        LOCK (&amp;frame-&gt;lock);</div><div class='del'>-        {</div><div class='del'>-                call_count = --int_lock-&gt;lk_call_count;</div><div class='del'>-        }</div><div class='del'>-        UNLOCK (&amp;frame-&gt;lock);</div><div class='del'>-</div><div class='del'>-        if (op_ret &lt; 0 ) {</div><div class='del'>-			if (op_errno == ENOSYS) {</div><div class='del'>-				/* return ENOTSUP */</div><div class='del'>-				gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-					"subvolume does not support locking. "</div><div class='del'>-					"please load features/posix-locks xlator on server");</div><div class='del'>-				local-&gt;op_ret                = op_ret;</div><div class='del'>-                                int_lock-&gt;lock_op_ret        = op_ret;</div><div class='del'>-                                local-&gt;child_up[child_index] = 0;</div><div class='del'>-                                int_lock-&gt;lock_op_errno      = op_errno;</div><div class='del'>-                                local-&gt;op_errno              = op_errno;</div><div class='del'>-                        }</div><div class='add'>+    LOCK(&amp;frame-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        if (op_ret &lt; 0) {</div><div class='add'>+            if (op_errno == ENOSYS) {</div><div class='add'>+                /* return ENOTSUP */</div><div class='add'>+                gf_msg(this-&gt;name, GF_LOG_ERROR, ENOSYS,</div><div class='add'>+                       AFR_MSG_LOCK_XLATOR_NOT_LOADED,</div><div class='add'>+                       "subvolume does not support "</div><div class='add'>+                       "locking. please load features/locks"</div><div class='add'>+                       " xlator on server");</div><div class='add'>+                local-&gt;op_ret = op_ret;</div><div class='add'>+                int_lock-&gt;lock_op_ret = op_ret;</div><div class='add'>+</div><div class='add'>+                int_lock-&gt;lock_op_errno = op_errno;</div><div class='add'>+                local-&gt;op_errno = op_errno;</div><div class='add'>+            }</div><div class='ctx'>         } else if (op_ret == 0) {</div><div class='del'>-                        int_lock-&gt;inode_locked_nodes[child_index]</div><div class='del'>-                                |= LOCKED_YES;</div><div class='del'>-                        int_lock-&gt;inodelk_lock_count++;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (call_count == 0) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_TRACE,</div><div class='del'>-                        "Last inode locking reply received");</div><div class='del'>-                /* all locks successfull. Proceed to call FOP */</div><div class='del'>-                if (int_lock-&gt;inodelk_lock_count ==</div><div class='del'>-                    afr_up_children_count (priv-&gt;child_count, local-&gt;child_up)) {</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_TRACE,</div><div class='del'>-                                "All servers locked. Calling the cbk");</div><div class='del'>-                        int_lock-&gt;lock_op_ret = 0;</div><div class='del'>-                        int_lock-&gt;lock_cbk (frame, this);</div><div class='del'>-                }</div><div class='del'>-                /* Not all locks were successfull. Unlock and try locking</div><div class='del'>-                   again, this time with serially blocking locks */</div><div class='del'>-                else {</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_TRACE,</div><div class='del'>-                                "%d servers locked. Trying again with blocking calls",</div><div class='del'>-                                int_lock-&gt;lock_count);</div><div class='del'>-</div><div class='del'>-                        afr_unlock(frame, this);</div><div class='del'>-                }</div><div class='add'>+            int_lock-&gt;lockee[lockee_num]</div><div class='add'>+                .locked_nodes[child_index] |= LOCKED_YES;</div><div class='add'>+            int_lock-&gt;lockee[lockee_num].locked_count++;</div><div class='add'>+            int_lock-&gt;lock_count++;</div><div class='ctx'>         }</div><div class='ctx'> </div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-afr_nonblocking_inodelk (call_frame_t *frame, xlator_t *this)</div><div class='del'>-{</div><div class='del'>-        afr_internal_lock_t *int_lock = NULL;</div><div class='del'>-        afr_local_t         *local    = NULL;</div><div class='del'>-        afr_private_t       *priv     = NULL;</div><div class='del'>-        afr_fd_ctx_t        *fd_ctx   = NULL;</div><div class='del'>-</div><div class='del'>-        int32_t  call_count = 0;</div><div class='del'>-        uint64_t ctx        = 0;</div><div class='del'>-        int      i          = 0;</div><div class='del'>-        int      ret        = 0;</div><div class='del'>-        struct flock flock;</div><div class='del'>-</div><div class='del'>-        local    = frame-&gt;local;</div><div class='del'>-        int_lock = &amp;local-&gt;internal_lock;</div><div class='del'>-        priv     = this-&gt;private;</div><div class='del'>-</div><div class='del'>-	flock.l_start = int_lock-&gt;lk_flock.l_start;</div><div class='del'>-	flock.l_len   = int_lock-&gt;lk_flock.l_len;</div><div class='del'>-	flock.l_type  = int_lock-&gt;lk_flock.l_type;</div><div class='del'>-</div><div class='del'>-        initialize_inodelk_variables (frame, this);</div><div class='del'>-</div><div class='del'>-        if (local-&gt;fd) {</div><div class='del'>-                ret = fd_ctx_get (local-&gt;fd, this, &amp;ctx);</div><div class='del'>-</div><div class='del'>-                if (ret &lt; 0) {</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-                                "unable to get fd ctx for fd=%p",</div><div class='del'>-                                local-&gt;fd);</div><div class='del'>-</div><div class='del'>-                        local-&gt;op_ret           = -1;</div><div class='del'>-                        int_lock-&gt;lock_op_ret   = -1;</div><div class='del'>-                        local-&gt;op_errno         = EINVAL;</div><div class='del'>-                        int_lock-&gt;lock_op_errno = EINVAL;</div><div class='del'>-</div><div class='del'>-                        ret = -1;</div><div class='del'>-                        goto out;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                fd_ctx = (afr_fd_ctx_t *)(long) ctx;</div><div class='del'>-</div><div class='del'>-                call_count = internal_lock_count (frame, this, fd_ctx);</div><div class='del'>-                int_lock-&gt;lk_call_count = call_count;</div><div class='del'>-</div><div class='del'>-                /* Send non-blocking inodelk calls only on up children</div><div class='del'>-                   and where the fd has been opened */</div><div class='del'>-                for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='del'>-                        if (local-&gt;child_up[i] &amp;&amp; fd_ctx-&gt;opened_on[i]) {</div><div class='del'>-                                afr_trace_inodelk_in (frame, AFR_INODELK_NB_TRANSACTION,</div><div class='del'>-                                                      AFR_LOCK_OP, &amp;flock, F_SETLK, i);</div><div class='del'>-</div><div class='del'>-                                STACK_WIND_COOKIE (frame, afr_nonblocking_inodelk_cbk,</div><div class='del'>-                                                   (void *) (long) i,</div><div class='del'>-                                                   priv-&gt;children[i],</div><div class='del'>-                                                   priv-&gt;children[i]-&gt;fops-&gt;finodelk,</div><div class='del'>-                                                   this-&gt;name, local-&gt;fd,</div><div class='del'>-                                                   F_SETLK, &amp;flock);</div><div class='del'>-</div><div class='del'>-                                if (!--call_count)</div><div class='del'>-                                        break;</div><div class='del'>-</div><div class='del'>-                        }</div><div class='del'>-</div><div class='del'>-                }</div><div class='del'>-        } else {</div><div class='del'>-                call_count = internal_lock_count (frame, this, NULL);</div><div class='del'>-                int_lock-&gt;lk_call_count = call_count;</div><div class='del'>-</div><div class='del'>-                for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='del'>-                        if (local-&gt;child_up[i]) {</div><div class='del'>-                                afr_trace_inodelk_in (frame, AFR_INODELK_NB_TRANSACTION,</div><div class='del'>-                                                      AFR_LOCK_OP, &amp;flock, F_SETLK, i);</div><div class='del'>-</div><div class='del'>-                                STACK_WIND_COOKIE (frame, afr_nonblocking_inodelk_cbk,</div><div class='del'>-                                                   (void *) (long) i,</div><div class='del'>-                                                   priv-&gt;children[i],</div><div class='del'>-                                                   priv-&gt;children[i]-&gt;fops-&gt;inodelk,</div><div class='del'>-                                                   this-&gt;name, &amp;local-&gt;loc,</div><div class='del'>-                                                   F_SETLK, &amp;flock);</div><div class='del'>-</div><div class='del'>-                                if (!--call_count)</div><div class='del'>-                                        break;</div><div class='del'>-</div><div class='del'>-                        }</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-static int</div><div class='del'>-__is_lower_locked (call_frame_t *frame, xlator_t *this)</div><div class='del'>-{</div><div class='del'>-        afr_internal_lock_t *int_lock = NULL;</div><div class='del'>-        afr_private_t       *priv     = NULL;</div><div class='del'>-        afr_local_t         *local    = NULL;</div><div class='del'>-</div><div class='del'>-        int count = 0;</div><div class='del'>-        int i     = 0;</div><div class='del'>-</div><div class='del'>-        local    = frame-&gt;local;</div><div class='del'>-        int_lock = &amp;local-&gt;internal_lock;</div><div class='del'>-        priv     = this-&gt;private;</div><div class='add'>+        call_count = --int_lock-&gt;lk_call_count;</div><div class='add'>+    }</div><div class='add'>+    UNLOCK(&amp;frame-&gt;lock);</div><div class='ctx'> </div><div class='del'>-        for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='del'>-                if (int_lock-&gt;lower_locked_nodes[i] &amp; LOCKED_LOWER)</div><div class='del'>-                        count++;</div><div class='add'>+    if (call_count == 0) {</div><div class='add'>+        gf_msg_trace(this-&gt;name, 0, "Last locking reply received");</div><div class='add'>+        /* all locks successful. Proceed to call FOP */</div><div class='add'>+        if (int_lock-&gt;lock_count == int_lock-&gt;lk_expected_count) {</div><div class='add'>+            gf_msg_trace(this-&gt;name, 0, "All servers locked. Calling the cbk");</div><div class='add'>+            int_lock-&gt;lock_op_ret = 0;</div><div class='add'>+            int_lock-&gt;lock_cbk(frame, this);</div><div class='ctx'>         }</div><div class='add'>+        /* Not all locks were successful. Unlock and try locking</div><div class='add'>+           again, this time with serially blocking locks */</div><div class='add'>+        else {</div><div class='add'>+            gf_msg_trace(this-&gt;name, 0,</div><div class='add'>+                         "%d servers locked. Trying again "</div><div class='add'>+                         "with blocking calls",</div><div class='add'>+                         int_lock-&gt;lock_count);</div><div class='ctx'> </div><div class='del'>-        return count;</div><div class='del'>-</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-static int</div><div class='del'>-__is_higher_locked (call_frame_t *frame, xlator_t *this)</div><div class='del'>-{</div><div class='del'>-        afr_internal_lock_t *int_lock = NULL;</div><div class='del'>-        afr_private_t       *priv     = NULL;</div><div class='del'>-        afr_local_t         *local    = NULL;</div><div class='del'>-</div><div class='del'>-        int count = 0;</div><div class='del'>-        int i = 0;</div><div class='del'>-</div><div class='del'>-        local    = frame-&gt;local;</div><div class='del'>-        int_lock = &amp;local-&gt;internal_lock;</div><div class='del'>-        priv     = this-&gt;private;</div><div class='del'>-</div><div class='del'>-        for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='del'>-                if (int_lock-&gt;locked_nodes[i] &amp; LOCKED_YES)</div><div class='del'>-                        count++;</div><div class='add'>+            afr_unlock_now(frame, this);</div><div class='ctx'>         }</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        return count;</div><div class='del'>-</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-static int</div><div class='del'>-afr_unlock_lower_entrylk (call_frame_t *frame, xlator_t *this)</div><div class='del'>-{</div><div class='del'>-        afr_internal_lock_t *int_lock = NULL;</div><div class='del'>-        afr_local_t         *local    = NULL;</div><div class='del'>-        afr_private_t       *priv     = NULL;</div><div class='del'>-        const char          *basename = NULL;</div><div class='del'>-        loc_t               *loc      = NULL;</div><div class='del'>-</div><div class='del'>-        int call_count = 0;</div><div class='del'>-        int i = -1;</div><div class='del'>-</div><div class='del'>-        local = frame-&gt;local;</div><div class='del'>-        int_lock = &amp;local-&gt;internal_lock;</div><div class='del'>-        priv  = this-&gt;private;</div><div class='del'>-</div><div class='del'>-        basename = int_lock-&gt;lk_basename;</div><div class='del'>-        if (int_lock-&gt;lk_loc)</div><div class='del'>-                loc = int_lock-&gt;lk_loc;</div><div class='del'>-</div><div class='del'>-        call_count = __is_lower_locked (frame, this);</div><div class='del'>-        int_lock-&gt;lk_call_count = call_count;</div><div class='del'>-</div><div class='del'>-        if (!call_count){</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_TRACE,</div><div class='del'>-                        "No internal locks unlocked");</div><div class='del'>-                int_lock-&gt;lock_cbk (frame, this);</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='del'>-                if (int_lock-&gt;lower_locked_nodes[i] &amp; LOCKED_LOWER) {</div><div class='del'>-                        afr_trace_entrylk_in (frame, AFR_ENTRYLK_NB_TRANSACTION,</div><div class='del'>-                                              AFR_UNLOCK_OP, basename, i);</div><div class='del'>-</div><div class='del'>-                        STACK_WIND_COOKIE (frame, afr_unlock_entrylk_cbk,</div><div class='del'>-                                           (void *) (long) i,</div><div class='del'>-                                           priv-&gt;children[i],</div><div class='del'>-                                           priv-&gt;children[i]-&gt;fops-&gt;entrylk,</div><div class='del'>-                                           this-&gt;name,</div><div class='del'>-                                           loc, basename,</div><div class='del'>-                                           ENTRYLK_UNLOCK, ENTRYLK_WRLCK);</div><div class='del'>-</div><div class='del'>-                        if (!--call_count)</div><div class='del'>-                                break;</div><div class='del'>-</div><div class='del'>-                }</div><div class='add'>+int</div><div class='add'>+afr_lock_nonblocking(call_frame_t *frame, xlator_t *this)</div><div class='add'>+{</div><div class='add'>+    afr_internal_lock_t *int_lock = NULL;</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    afr_fd_ctx_t *fd_ctx = NULL;</div><div class='add'>+    int child = 0;</div><div class='add'>+    int lockee_num = 0;</div><div class='add'>+    int32_t call_count = 0;</div><div class='add'>+    int i = 0;</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    int_lock = &amp;local-&gt;internal_lock;</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    initialize_internal_lock_variables(frame, this);</div><div class='add'>+</div><div class='add'>+    if (local-&gt;fd) {</div><div class='add'>+        fd_ctx = afr_fd_ctx_get(local-&gt;fd, this);</div><div class='add'>+        if (!fd_ctx) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_INFO, 0, AFR_MSG_FD_CTX_GET_FAILED,</div><div class='add'>+                   "unable to get fd ctx for fd=%p", local-&gt;fd);</div><div class='add'>+</div><div class='add'>+            local-&gt;op_ret = -1;</div><div class='add'>+            int_lock-&gt;lock_op_ret = -1;</div><div class='add'>+            local-&gt;op_errno = EINVAL;</div><div class='add'>+            int_lock-&gt;lock_op_errno = EINVAL;</div><div class='add'>+</div><div class='add'>+            afr_unlock_now(frame, this);</div><div class='add'>+            ret = -1;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    call_count = int_lock-&gt;lockee_count * internal_lock_count(frame, this);</div><div class='add'>+    int_lock-&gt;lk_call_count = call_count;</div><div class='add'>+    int_lock-&gt;lk_expected_count = call_count;</div><div class='add'>+</div><div class='add'>+    if (!call_count) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_INFO, 0, AFR_MSG_INFO_COMMON,</div><div class='add'>+               "fd not open on any subvolumes. aborting.");</div><div class='add'>+        afr_unlock_now(frame, this);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Send non-blocking lock calls only on up children</div><div class='add'>+       and where the fd has been opened */</div><div class='add'>+    for (i = 0; i &lt; int_lock-&gt;lockee_count * priv-&gt;child_count; i++) {</div><div class='add'>+        child = i % priv-&gt;child_count;</div><div class='add'>+        lockee_num = i / priv-&gt;child_count;</div><div class='add'>+        if (local-&gt;child_up[child]) {</div><div class='add'>+            afr_internal_lock_wind(frame, afr_nb_internal_lock_cbk,</div><div class='add'>+                                   (void *)(long)i, child, lockee_num,</div><div class='add'>+                                   _gf_false, _gf_false);</div><div class='add'>+            if (!--call_count)</div><div class='add'>+                break;</div><div class='ctx'>         }</div><div class='del'>-</div><div class='add'>+    }</div><div class='ctx'> out:</div><div class='del'>-        return 0;</div><div class='del'>-</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-static int</div><div class='del'>-afr_post_unlock_higher_cbk (call_frame_t *frame, xlator_t *this)</div><div class='del'>-{</div><div class='del'>-        afr_local_t *local = NULL;</div><div class='del'>-</div><div class='del'>-        local = frame-&gt;local;</div><div class='del'>-</div><div class='del'>-        local-&gt;transaction.done (frame, this);</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-static int</div><div class='del'>-afr_post_unlock_lower_cbk (call_frame_t *frame, xlator_t *this)</div><div class='del'>-{</div><div class='del'>-        afr_internal_lock_t *int_lock    = NULL;</div><div class='del'>-        afr_local_t         *local       = NULL;</div><div class='del'>-	loc_t               *lower       = NULL;</div><div class='del'>-	loc_t               *higher      = NULL;</div><div class='del'>-	const char          *lower_name  = NULL;</div><div class='del'>-	const char          *higher_name = NULL;</div><div class='del'>-</div><div class='del'>-        local    = frame-&gt;local;</div><div class='del'>-        int_lock = &amp;local-&gt;internal_lock;</div><div class='del'>-</div><div class='del'>-        lower = lower_path (&amp;local-&gt;transaction.parent_loc,</div><div class='del'>-                            local-&gt;transaction.basename,</div><div class='del'>-                            &amp;local-&gt;transaction.new_parent_loc,</div><div class='del'>-                            local-&gt;transaction.new_basename);</div><div class='del'>-</div><div class='del'>-        lower_name = (lower == &amp;local-&gt;transaction.parent_loc ?</div><div class='del'>-                      local-&gt;transaction.basename :</div><div class='del'>-                      local-&gt;transaction.new_basename);</div><div class='del'>-</div><div class='del'>-        higher = (lower == &amp;local-&gt;transaction.parent_loc ?</div><div class='del'>-                  &amp;local-&gt;transaction.new_parent_loc :</div><div class='del'>-                  &amp;local-&gt;transaction.parent_loc);</div><div class='del'>-</div><div class='del'>-        higher_name = (higher == &amp;local-&gt;transaction.parent_loc ?</div><div class='del'>-                       local-&gt;transaction.basename :</div><div class='del'>-                       local-&gt;transaction.new_basename);</div><div class='del'>-</div><div class='del'>-        if (__is_higher_locked (frame, this)) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-                        "unlocking higher");</div><div class='del'>-                int_lock-&gt;lk_basename = higher_name;</div><div class='del'>-                int_lock-&gt;lk_loc      = higher;</div><div class='del'>-                int_lock-&gt;lock_cbk    = afr_post_unlock_higher_cbk;</div><div class='del'>-</div><div class='del'>-                afr_unlock_entrylk (frame, this);</div><div class='del'>-        } else</div><div class='del'>-                local-&gt;transaction.done (frame, this);</div><div class='del'>-</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-static int</div><div class='del'>-afr_rename_unlock (call_frame_t *frame, xlator_t *this)</div><div class='del'>-{</div><div class='del'>-        afr_internal_lock_t *int_lock    = NULL;</div><div class='del'>-        afr_local_t         *local       = NULL;</div><div class='del'>-	loc_t               *lower       = NULL;</div><div class='del'>-	loc_t               *higher      = NULL;</div><div class='del'>-	const char          *lower_name  = NULL;</div><div class='del'>-	const char          *higher_name = NULL;</div><div class='del'>-</div><div class='del'>-        local    = frame-&gt;local;</div><div class='del'>-        int_lock = &amp;local-&gt;internal_lock;</div><div class='del'>-</div><div class='del'>-        lower = lower_path (&amp;local-&gt;transaction.parent_loc,</div><div class='del'>-                            local-&gt;transaction.basename,</div><div class='del'>-                            &amp;local-&gt;transaction.new_parent_loc,</div><div class='del'>-                            local-&gt;transaction.new_basename);</div><div class='del'>-</div><div class='del'>-        lower_name = (lower == &amp;local-&gt;transaction.parent_loc ?</div><div class='del'>-                      local-&gt;transaction.basename :</div><div class='del'>-                      local-&gt;transaction.new_basename);</div><div class='del'>-</div><div class='del'>-        higher = (lower == &amp;local-&gt;transaction.parent_loc ?</div><div class='del'>-                  &amp;local-&gt;transaction.new_parent_loc :</div><div class='del'>-                  &amp;local-&gt;transaction.parent_loc);</div><div class='del'>-</div><div class='del'>-        higher_name = (higher == &amp;local-&gt;transaction.parent_loc ?</div><div class='del'>-                       local-&gt;transaction.basename :</div><div class='del'>-                       local-&gt;transaction.new_basename);</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-        if (__is_lower_locked (frame, this)) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-                        "unlocking lower");</div><div class='del'>-                int_lock-&gt;lk_basename = lower_name;</div><div class='del'>-                int_lock-&gt;lk_loc      = lower;</div><div class='del'>-                int_lock-&gt;lock_cbk    = afr_post_unlock_lower_cbk;</div><div class='del'>-</div><div class='del'>-                afr_unlock_lower_entrylk (frame, this);</div><div class='del'>-        } else</div><div class='del'>-                afr_post_unlock_lower_cbk (frame, this);</div><div class='del'>-</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-static int</div><div class='del'>-afr_rename_transaction (call_frame_t *frame, xlator_t *this)</div><div class='del'>-{</div><div class='del'>-        afr_local_t *local = NULL;</div><div class='del'>-</div><div class='del'>-        local = frame-&gt;local;</div><div class='del'>-</div><div class='del'>-        return (local-&gt;transaction.type ==</div><div class='del'>-                AFR_ENTRY_RENAME_TRANSACTION);</div><div class='del'>-</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> int32_t</div><div class='del'>-afr_unlock (call_frame_t *frame, xlator_t *this)</div><div class='del'>-{</div><div class='del'>-        afr_local_t *local = NULL;</div><div class='del'>-</div><div class='del'>-        local = frame-&gt;local;</div><div class='del'>-</div><div class='del'>-        if (transaction_lk_op (local)) {</div><div class='del'>-                if (is_afr_lock_transaction (local))</div><div class='del'>-                        afr_unlock_inodelk (frame, this);</div><div class='del'>-                else</div><div class='del'>-                        if (!afr_rename_transaction (frame, this))</div><div class='del'>-                                afr_unlock_entrylk (frame, this);</div><div class='del'>-                        else</div><div class='del'>-                                afr_rename_unlock (frame, this);</div><div class='del'>-        } else {</div><div class='del'>-                if (is_afr_lock_selfheal (local))</div><div class='del'>-                        afr_unlock_inodelk (frame, this);</div><div class='del'>-                else</div><div class='del'>-                        afr_unlock_entrylk (frame, this);</div><div class='del'>-        }</div><div class='del'>-</div><div class='add'>+afr_unlock(call_frame_t *frame, xlator_t *this)</div><div class='add'>+{</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    afr_lock_t *lock = NULL;</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+</div><div class='add'>+    if (!local-&gt;transaction.eager_lock_on)</div><div class='add'>+        goto out;</div><div class='add'>+    lock = &amp;local-&gt;inode_ctx-&gt;lock[local-&gt;transaction.type];</div><div class='add'>+    LOCK(&amp;local-&gt;inode-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        list_del_init(&amp;local-&gt;transaction.owner_list);</div><div class='add'>+        if (list_empty(&amp;lock-&gt;owners) &amp;&amp; list_empty(&amp;lock-&gt;post_op)) {</div><div class='add'>+            local-&gt;transaction.do_eager_unlock = _gf_true;</div><div class='add'>+            /*TODO: Need to get metadata use on_disk and inherit/uninherit</div><div class='add'>+             *GF_ASSERT (!local-&gt;inode_ctx-&gt;on_disk[local-&gt;transaction.type]);</div><div class='add'>+             *GF_ASSERT (!local-&gt;inode_ctx-&gt;inherited[local-&gt;transaction.type]);</div><div class='add'>+             */</div><div class='add'>+            GF_ASSERT(lock-&gt;release);</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    UNLOCK(&amp;local-&gt;inode-&gt;lock);</div><div class='add'>+    if (!local-&gt;transaction.do_eager_unlock) {</div><div class='add'>+        local-&gt;internal_lock.lock_cbk(frame, this);</div><div class='ctx'>         return 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    afr_unlock_now(frame, this);</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='head'>diff --git a/xlators/cluster/afr/src/afr-mem-types.h b/xlators/cluster/afr/src/afr-mem-types.h<br/>index 3720d85e61b..816065fb57a 100644<br/>--- a/<a href='/cgit/glusterfs.git/tree/xlators/cluster/afr/src/afr-mem-types.h?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/cluster/afr/src/afr-mem-types.h</a><br/>+++ b/<a href='/cgit/glusterfs.git/tree/xlators/cluster/afr/src/afr-mem-types.h?id=d1d7a6f35c816822fab51c820e25023863c239c1'>xlators/cluster/afr/src/afr-mem-types.h</a></div><div class='hunk'>@@ -1,47 +1,38 @@</div><div class='ctx'> /*</div><div class='del'>-   Copyright (c) 2008-2009 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='del'>-   This file is part of GlusterFS.</div><div class='add'>+  Copyright (c) 2008-2012 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='ctx'> </div><div class='del'>-   GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-   it under the terms of the GNU General Public License as published</div><div class='del'>-   by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-   or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-   GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-   WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-   General Public License for more details.</div><div class='del'>-</div><div class='del'>-   You should have received a copy of the GNU General Public License</div><div class='del'>-   along with this program.  If not, see</div><div class='del'>-   &lt;http://www.gnu.org/licenses/&gt;.</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='ctx'> */</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> #ifndef __AFR_MEM_TYPES_H__</div><div class='ctx'> #define __AFR_MEM_TYPES_H__</div><div class='ctx'> </div><div class='del'>-#include "mem-types.h"</div><div class='add'>+#include &lt;glusterfs/mem-types.h&gt;</div><div class='ctx'> </div><div class='ctx'> enum gf_afr_mem_types_ {</div><div class='del'>-        gf_afr_mt_iovec  = gf_common_mt_end + 1,</div><div class='del'>-        gf_afr_mt_afr_fd_ctx_t,</div><div class='del'>-        gf_afr_mt_afr_local_t,</div><div class='del'>-        gf_afr_mt_afr_private_t,</div><div class='del'>-        gf_afr_mt_int32_t,</div><div class='del'>-        gf_afr_mt_char,</div><div class='del'>-        gf_afr_mt_xattr_key,</div><div class='del'>-        gf_afr_mt_dict_t,</div><div class='del'>-        gf_afr_mt_xlator_t,</div><div class='del'>-        gf_afr_mt_stat,</div><div class='del'>-        gf_afr_mt_int,</div><div class='del'>-        gf_afr_mt_afr_node_character,</div><div class='del'>-        gf_afr_mt_sh_diff_loop_state,</div><div class='del'>-        gf_afr_mt_uint8_t,</div><div class='del'>-        gf_afr_mt_loc_t,</div><div class='del'>-        gf_afr_mt_entry_name,</div><div class='del'>-        gf_afr_mt_pump_priv,</div><div class='del'>-        gf_afr_mt_end</div><div class='add'>+    gf_afr_mt_afr_fd_ctx_t = gf_common_mt_end + 1,</div><div class='add'>+    gf_afr_mt_afr_private_t,</div><div class='add'>+    gf_afr_mt_int32_t,</div><div class='add'>+    gf_afr_mt_char,</div><div class='add'>+    gf_afr_mt_xattr_key,</div><div class='add'>+    gf_afr_mt_dict_t,</div><div class='add'>+    gf_afr_mt_xlator_t,</div><div class='add'>+    gf_afr_mt_afr_node_character,</div><div class='add'>+    gf_afr_mt_inode_ctx_t,</div><div class='add'>+    gf_afr_mt_shd_event_t,</div><div class='add'>+    gf_afr_mt_reply_t,</div><div class='add'>+    gf_afr_mt_subvol_healer_t,</div><div class='add'>+    gf_afr_mt_spbc_timeout_t,</div><div class='add'>+    gf_afr_mt_spb_status_t,</div><div class='add'>+    gf_afr_mt_empty_brick_t,</div><div class='add'>+    gf_afr_mt_child_latency_t,</div><div class='add'>+    gf_afr_mt_atomic_t,</div><div class='add'>+    gf_afr_mt_lk_heal_info_t,</div><div class='add'>+    gf_afr_mt_gf_lock,</div><div class='add'>+    gf_afr_mt_end</div><div class='ctx'> };</div><div class='ctx'> #endif</div><div class='del'>-</div><div class='head'>diff --git a/xlators/cluster/afr/src/afr-messages.h b/xlators/cluster/afr/src/afr-messages.h<br/>new file mode 100644<br/>index 00000000000..e73fd997765<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/xlators/cluster/afr/src/afr-messages.h?id=d1d7a6f35c816822fab51c820e25023863c239c1'>xlators/cluster/afr/src/afr-messages.h</a></div><div class='hunk'>@@ -0,0 +1,167 @@</div><div class='add'>+/*</div><div class='add'>+ Copyright (c) 2015 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+ This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+ This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+ General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+ later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+ cases as published by the Free Software Foundation.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+#ifndef _AFR_MESSAGES_H_</div><div class='add'>+#define _AFR_MESSAGES_H_</div><div class='add'>+</div><div class='add'>+#include &lt;glusterfs/glfs-message-id.h&gt;</div><div class='add'>+</div><div class='add'>+/* To add new message IDs, append new identifiers at the end of the list.</div><div class='add'>+ *</div><div class='add'>+ * Never remove a message ID. If it's not used anymore, you can rename it or</div><div class='add'>+ * leave it as it is, but not delete it. This is to prevent reutilization of</div><div class='add'>+ * IDs by other messages.</div><div class='add'>+ *</div><div class='add'>+ * The component name must match one of the entries defined in</div><div class='add'>+ * glfs-message-id.h.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+GLFS_MSGID(</div><div class='add'>+    AFR, AFR_MSG_QUORUM_FAIL, AFR_MSG_QUORUM_MET, AFR_MSG_QUORUM_OVERRIDE,</div><div class='add'>+    AFR_MSG_INVALID_CHILD_UP, AFR_MSG_SUBVOL_UP, AFR_MSG_SUBVOLS_DOWN,</div><div class='add'>+    AFR_MSG_ENTRY_UNLOCK_FAIL, AFR_MSG_SPLIT_BRAIN, AFR_MSG_OPEN_FAIL,</div><div class='add'>+    AFR_MSG_UNLOCK_FAIL, AFR_MSG_REPLACE_BRICK_STATUS, AFR_MSG_GFID_NULL,</div><div class='add'>+    AFR_MSG_FD_CREATE_FAILED, AFR_MSG_DICT_SET_FAILED,</div><div class='add'>+    AFR_MSG_EXPUNGING_FILE_OR_DIR, AFR_MSG_MIGRATION_IN_PROGRESS,</div><div class='add'>+    AFR_MSG_CHILD_MISCONFIGURED, AFR_MSG_VOL_MISCONFIGURED,</div><div class='add'>+    AFR_MSG_INTERNAL_LKS_FAILED, AFR_MSG_INVALID_FD, AFR_MSG_LOCK_INFO,</div><div class='add'>+    AFR_MSG_LOCK_XLATOR_NOT_LOADED, AFR_MSG_FD_CTX_GET_FAILED,</div><div class='add'>+    AFR_MSG_INVALID_SUBVOL, AFR_MSG_PUMP_XLATOR_ERROR, AFR_MSG_SELF_HEAL_INFO,</div><div class='add'>+    AFR_MSG_READ_SUBVOL_ERROR, AFR_MSG_DICT_GET_FAILED, AFR_MSG_INFO_COMMON,</div><div class='add'>+    AFR_MSG_SPLIT_BRAIN_CHOICE_ERROR, AFR_MSG_LOCAL_CHILD, AFR_MSG_INVALID_DATA,</div><div class='add'>+    AFR_MSG_INVALID_ARG, AFR_MSG_INDEX_DIR_GET_FAILED, AFR_MSG_FSYNC_FAILED,</div><div class='add'>+    AFR_MSG_FAVORITE_CHILD, AFR_MSG_SELF_HEAL_FAILED,</div><div class='add'>+    AFR_MSG_SPLIT_BRAIN_STATUS, AFR_MSG_ADD_BRICK_STATUS, AFR_MSG_NO_CHANGELOG,</div><div class='add'>+    AFR_MSG_TIMER_CREATE_FAIL, AFR_MSG_SBRAIN_FAV_CHILD_POLICY,</div><div class='add'>+    AFR_MSG_INODE_CTX_GET_FAILED, AFR_MSG_THIN_ARB,</div><div class='add'>+    AFR_MSG_THIN_ARB_XATTROP_FAILED, AFR_MSG_THIN_ARB_LOC_POP_FAILED,</div><div class='add'>+    AFR_MSG_GET_PEND_VAL, AFR_MSG_THIN_ARB_SKIP_SHD, AFR_MSG_UNKNOWN_SET,</div><div class='add'>+    AFR_MSG_NO_XL_ID, AFR_MSG_SELF_HEAL_INFO_START,</div><div class='add'>+    AFR_MSG_SELF_HEAL_INFO_FINISH, AFR_MSG_INCRE_COUNT,</div><div class='add'>+    AFR_MSG_ADD_TO_OUTPUT_FAILED, AFR_MSG_SET_TIME_FAILED,</div><div class='add'>+    AFR_MSG_GFID_MISMATCH_DETECTED, AFR_MSG_GFID_HEAL_MSG,</div><div class='add'>+    AFR_MSG_THIN_ARB_LOOKUP_FAILED, AFR_MSG_DICT_CREATE_FAILED,</div><div class='add'>+    AFR_MSG_NO_MAJORITY_TO_RESOLVE, AFR_MSG_TYPE_MISMATCH,</div><div class='add'>+    AFR_MSG_SIZE_POLICY_NOT_APPLICABLE, AFR_MSG_NO_CHILD_SELECTED,</div><div class='add'>+    AFR_MSG_INVALID_CHILD, AFR_MSG_RESOLVE_CONFLICTING_DATA,</div><div class='add'>+    SERROR_GETTING_SRC_BRICK, SNO_DIFF_IN_MTIME, SNO_BIGGER_FILE,</div><div class='add'>+    SALL_BRICKS_UP_TO_RESOLVE, AFR_MSG_UNLOCK_FAILED, AFR_MSG_POST_OP_FAILED,</div><div class='add'>+    AFR_MSG_TA_FRAME_CREATE_FAILED, AFR_MSG_SET_KEY_XATTROP_FAILED,</div><div class='add'>+    AFR_MSG_BLOCKING_ENTRYLKS_FAILED, AFR_MSG_FOP_FAILED,</div><div class='add'>+    AFR_MSG_CLEAN_UP_FAILED, AFR_MSG_UNABLE_TO_FETCH, AFR_MSG_XATTR_SET_FAILED,</div><div class='add'>+    AFR_MSG_SPLIT_BRAIN_REPLICA, AFR_MSG_INODE_CTX_FAILED,</div><div class='add'>+    AFR_MSG_LOOKUP_FAILED, AFR_MSG_ALL_SUBVOLS_DOWN,</div><div class='add'>+    AFR_MSG_RELEASE_LOCK_FAILED, AFR_MSG_CLEAR_TIME_SPLIT_BRAIN,</div><div class='add'>+    AFR_MSG_READ_FAILED, AFR_MSG_LAUNCH_FAILED, AFR_MSG_READ_SUBVOL_NOT_UP,</div><div class='add'>+    AFR_MSG_LK_HEAL_DOM, AFR_MSG_NEW_BRICK, AFR_MSG_SPLIT_BRAIN_SET_FAILED,</div><div class='add'>+    AFR_MSG_SPLIT_BRAIN_DETERMINE_FAILED, AFR_MSG_HEALER_SPAWN_FAILED,</div><div class='add'>+    AFR_MSG_ADD_CRAWL_EVENT_FAILED, AFR_MSG_NULL_DEREF, AFR_MSG_SET_PEND_XATTR,</div><div class='add'>+    AFR_MSG_INTERNAL_ATTR);</div><div class='add'>+</div><div class='add'>+#define AFR_MSG_DICT_GET_FAILED_STR "Dict get failed"</div><div class='add'>+#define AFR_MSG_DICT_SET_FAILED_STR "Dict set failed"</div><div class='add'>+#define AFR_MSG_HEALER_SPAWN_FAILED_STR "Healer spawn failed"</div><div class='add'>+#define AFR_MSG_ADD_CRAWL_EVENT_FAILED_STR "Adding crawl event failed"</div><div class='add'>+#define AFR_MSG_INVALID_ARG_STR "Invalid argument"</div><div class='add'>+#define AFR_MSG_INDEX_DIR_GET_FAILED_STR "unable to get index-dir on "</div><div class='add'>+#define AFR_MSG_THIN_ARB_LOOKUP_FAILED_STR "Failed lookup on file"</div><div class='add'>+#define AFR_MSG_DICT_CREATE_FAILED_STR "Failed to create dict."</div><div class='add'>+#define AFR_MSG_THIN_ARB_XATTROP_FAILED_STR "Xattrop failed."</div><div class='add'>+#define AFR_MSG_THIN_ARB_LOC_POP_FAILED_STR                                    \</div><div class='add'>+    "Failed to populate loc for thin-arbiter"</div><div class='add'>+#define AFR_MSG_GET_PEND_VAL_STR "Error getting value of pending"</div><div class='add'>+#define AFR_MSG_THIN_ARB_SKIP_SHD_STR "I am not the god shd. skipping."</div><div class='add'>+#define AFR_MSG_UNKNOWN_SET_STR "Unknown set"</div><div class='add'>+#define AFR_MSG_NO_XL_ID_STR "xl does not have id"</div><div class='add'>+#define AFR_MSG_SELF_HEAL_INFO_START_STR "starting full sweep on"</div><div class='add'>+#define AFR_MSG_SELF_HEAL_INFO_FINISH_STR "finished full sweep on"</div><div class='add'>+#define AFR_MSG_INCRE_COUNT_STR "Could not increment the counter."</div><div class='add'>+#define AFR_MSG_ADD_TO_OUTPUT_FAILED_STR "Could not add to output"</div><div class='add'>+#define AFR_MSG_SET_TIME_FAILED_STR "Could not set time"</div><div class='add'>+#define AFR_MSG_GFID_HEAL_MSG_STR "Error setting gfid-heal-msg dict"</div><div class='add'>+#define AFR_MSG_NO_MAJORITY_TO_RESOLVE_STR                                     \</div><div class='add'>+    "No majority to resolve gfid split brain"</div><div class='add'>+#define AFR_MSG_GFID_MISMATCH_DETECTED_STR "Gfid mismatch dectected"</div><div class='add'>+#define AFR_MSG_SELF_HEAL_INFO_STR "performing selfheal"</div><div class='add'>+#define AFR_MSG_TYPE_MISMATCH_STR "TYPE mismatch"</div><div class='add'>+#define AFR_MSG_SIZE_POLICY_NOT_APPLICABLE_STR                                 \</div><div class='add'>+    "Size policy is not applicable to directories."</div><div class='add'>+#define AFR_MSG_NO_CHILD_SELECTED_STR                                          \</div><div class='add'>+    "No child selected by favorite-child policy"</div><div class='add'>+#define AFR_MSG_INVALID_CHILD_STR "Invalid child"</div><div class='add'>+#define AFR_MSG_RESOLVE_CONFLICTING_DATA_STR                                   \</div><div class='add'>+    "selected as authentic to resolve conflicting data"</div><div class='add'>+#define SERROR_GETTING_SRC_BRICK_STR "Error getting the source brick"</div><div class='add'>+#define SNO_DIFF_IN_MTIME_STR "No difference in mtime"</div><div class='add'>+#define SNO_BIGGER_FILE_STR "No bigger file"</div><div class='add'>+#define SALL_BRICKS_UP_TO_RESOLVE_STR                                          \</div><div class='add'>+    "All the bricks should be up to resolve the gfid split brain"</div><div class='add'>+#define AFR_MSG_UNLOCK_FAILED_STR "Failed to unlock"</div><div class='add'>+#define AFR_MSG_POST_OP_FAILED_STR "Post-op on thin-arbiter failed"</div><div class='add'>+#define AFR_MSG_TA_FRAME_CREATE_FAILED_STR "Failed to create ta_frame"</div><div class='add'>+#define AFR_MSG_SET_KEY_XATTROP_FAILED_STR "Could not set key during xattrop"</div><div class='add'>+#define AFR_MSG_BLOCKING_ENTRYLKS_FAILED_STR "Blocking entrylks failed"</div><div class='add'>+#define AFR_MSG_FSYNC_FAILED_STR "fsync failed"</div><div class='add'>+#define AFR_MSG_QUORUM_FAIL_STR "quorum is not met"</div><div class='add'>+#define AFR_MSG_FOP_FAILED_STR "Failing Fop"</div><div class='add'>+#define AFR_MSG_INVALID_SUBVOL_STR "not a subvolume"</div><div class='add'>+#define AFR_MSG_VOL_MISCONFIGURED_STR "Volume is dangling"</div><div class='add'>+#define AFR_MSG_CHILD_MISCONFIGURED_STR                                        \</div><div class='add'>+    "replicate translator needs more than one subvolume defined"</div><div class='add'>+#define AFR_MSG_CLEAN_UP_FAILED_STR "Failed to clean up healer threads"</div><div class='add'>+#define AFR_MSG_QUORUM_OVERRIDE_STR "overriding quorum-count"</div><div class='add'>+#define AFR_MSG_UNABLE_TO_FETCH_STR                                            \</div><div class='add'>+    "Unable to fetch afr-pending-xattr option from volfile. Falling back to "  \</div><div class='add'>+    "using client translator names"</div><div class='add'>+#define AFR_MSG_NULL_DEREF_STR "possible NULL deref"</div><div class='add'>+#define AFR_MSG_XATTR_SET_FAILED_STR "Cannot set xattr cookie key"</div><div class='add'>+#define AFR_MSG_SPLIT_BRAIN_STATUS_STR "Failed to create synctask"</div><div class='add'>+#define AFR_MSG_SUBVOLS_DOWN_STR "All subvolumes are not up"</div><div class='add'>+#define AFR_MSG_SPLIT_BRAIN_CHOICE_ERROR_STR                                   \</div><div class='add'>+    "Failed to cancel split-brain choice"</div><div class='add'>+#define AFR_MSG_SPLIT_BRAIN_REPLICA_STR                                        \</div><div class='add'>+    "Cannot set replica. File is not in data/metadata split-brain"</div><div class='add'>+#define AFR_MSG_INODE_CTX_FAILED_STR "Failed to get inode_ctx"</div><div class='add'>+#define AFR_MSG_READ_SUBVOL_ERROR_STR "no read subvols"</div><div class='add'>+#define AFR_MSG_LOCAL_CHILD_STR "selecting local read-child"</div><div class='add'>+#define AFR_MSG_LOOKUP_FAILED_STR "Failed to lookup/create thin-arbiter id file"</div><div class='add'>+#define AFR_MSG_TIMER_CREATE_FAIL_STR                                          \</div><div class='add'>+    "Cannot create timer for delayed initialization"</div><div class='add'>+#define AFR_MSG_SUBVOL_UP_STR "Subvolume came back up; going online"</div><div class='add'>+#define AFR_MSG_ALL_SUBVOLS_DOWN_STR                                           \</div><div class='add'>+    "All subvolumes are down. Going offline until atleast one of them is up"</div><div class='add'>+#define AFR_MSG_RELEASE_LOCK_FAILED_STR "Failed to release lock"</div><div class='add'>+#define AFR_MSG_INVALID_CHILD_UP_STR "Received child_up from invalid subvolume"</div><div class='add'>+#define AFR_MSG_QUORUM_MET_STR "Client-quorum is met"</div><div class='add'>+#define AFR_MSG_EXPUNGING_FILE_OR_DIR_STR "expunging file or dir"</div><div class='add'>+#define AFR_MSG_SELF_HEAL_FAILED_STR "Invalid"</div><div class='add'>+#define AFR_MSG_SPLIT_BRAIN_STR "Skipping conservative mergeon the file"</div><div class='add'>+#define AFR_MSG_CLEAR_TIME_SPLIT_BRAIN_STR "clear time split brain"</div><div class='add'>+#define AFR_MSG_READ_FAILED_STR "Failing read since good brick is down"</div><div class='add'>+#define AFR_MSG_LAUNCH_FAILED_STR "Failed to launch synctask"</div><div class='add'>+#define AFR_MSG_READ_SUBVOL_NOT_UP_STR                                         \</div><div class='add'>+    "read subvolume in this generation is not up"</div><div class='add'>+#define AFR_MSG_INTERNAL_LKS_FAILED_STR                                        \</div><div class='add'>+    "Unable to work with lk-owner while attempting fop"</div><div class='add'>+#define AFR_MSG_LOCK_XLATOR_NOT_LOADED_STR                                     \</div><div class='add'>+    "subvolume does not support locking. please load features/locks xlator "   \</div><div class='add'>+    "on server."</div><div class='add'>+#define AFR_MSG_FD_CTX_GET_FAILED_STR "unable to get fd ctx"</div><div class='add'>+#define AFR_MSG_INFO_COMMON_STR "fd not open on any subvolumes, aborting."</div><div class='add'>+#define AFR_MSG_REPLACE_BRICK_STATUS_STR "Couldn't acquire lock on any child."</div><div class='add'>+#define AFR_MSG_NEW_BRICK_STR "New brick"</div><div class='add'>+#define AFR_MSG_SPLIT_BRAIN_SET_FAILED_STR                                     \</div><div class='add'>+    "Failed to set split-brain choice to -1"</div><div class='add'>+#define AFR_MSG_SPLIT_BRAIN_DETERMINE_FAILED_STR                               \</div><div class='add'>+    "Failed to determine split-brain. Aborting split-brain-choice set"</div><div class='add'>+#define AFR_MSG_OPEN_FAIL_STR "Failed to open subvolume"</div><div class='add'>+#define AFR_MSG_SET_PEND_XATTR_STR "Set of pending xattr"</div><div class='add'>+#define AFR_MSG_INTERNAL_ATTR_STR "is an internal extended attribute"</div><div class='add'>+#endif /* !_AFR_MESSAGES_H_ */</div><div class='head'>diff --git a/xlators/cluster/afr/src/afr-open.c b/xlators/cluster/afr/src/afr-open.c<br/>index dc830f7d59d..64856042b65 100644<br/>--- a/<a href='/cgit/glusterfs.git/tree/xlators/cluster/afr/src/afr-open.c?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/cluster/afr/src/afr-open.c</a><br/>+++ b/<a href='/cgit/glusterfs.git/tree/xlators/cluster/afr/src/afr-open.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>xlators/cluster/afr/src/afr-open.c</a></div><div class='hunk'>@@ -1,490 +1,353 @@</div><div class='ctx'> /*</div><div class='del'>-   Copyright (c) 2007-2009 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='del'>-   This file is part of GlusterFS.</div><div class='del'>-</div><div class='del'>-   GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-   it under the terms of the GNU General Public License as published</div><div class='del'>-   by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-   or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-   GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-   WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-   General Public License for more details.</div><div class='del'>-</div><div class='del'>-   You should have received a copy of the GNU General Public License</div><div class='del'>-   along with this program.  If not, see</div><div class='del'>-   &lt;http://www.gnu.org/licenses/&gt;.</div><div class='add'>+  Copyright (c) 2008-2012 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='ctx'> */</div><div class='ctx'> </div><div class='del'>-#include &lt;libgen.h&gt;</div><div class='ctx'> #include &lt;unistd.h&gt;</div><div class='del'>-#include &lt;fnmatch.h&gt;</div><div class='ctx'> #include &lt;sys/time.h&gt;</div><div class='ctx'> #include &lt;stdlib.h&gt;</div><div class='ctx'> #include &lt;signal.h&gt;</div><div class='ctx'> </div><div class='del'>-#ifndef _CONFIG_H</div><div class='del'>-#define _CONFIG_H</div><div class='del'>-#include "config.h"</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-#include "glusterfs.h"</div><div class='add'>+#include &lt;glusterfs/glusterfs.h&gt;</div><div class='ctx'> #include "afr.h"</div><div class='del'>-#include "dict.h"</div><div class='del'>-#include "xlator.h"</div><div class='del'>-#include "hashfn.h"</div><div class='del'>-#include "logging.h"</div><div class='del'>-#include "stack.h"</div><div class='del'>-#include "list.h"</div><div class='del'>-#include "call-stub.h"</div><div class='del'>-#include "defaults.h"</div><div class='del'>-#include "common-utils.h"</div><div class='del'>-#include "compat-errno.h"</div><div class='del'>-#include "compat.h"</div><div class='del'>-#include "byte-order.h"</div><div class='del'>-#include "statedump.h"</div><div class='del'>-</div><div class='del'>-#include "fd.h"</div><div class='del'>-</div><div class='del'>-#include "afr-inode-read.h"</div><div class='del'>-#include "afr-inode-write.h"</div><div class='del'>-#include "afr-dir-read.h"</div><div class='del'>-#include "afr-dir-write.h"</div><div class='del'>-#include "afr-transaction.h"</div><div class='del'>-#include "afr-self-heal.h"</div><div class='del'>-#include "afr-self-heal-common.h"</div><div class='add'>+#include &lt;glusterfs/dict.h&gt;</div><div class='add'>+#include &lt;glusterfs/logging.h&gt;</div><div class='add'>+#include &lt;glusterfs/defaults.h&gt;</div><div class='add'>+#include &lt;glusterfs/common-utils.h&gt;</div><div class='add'>+#include &lt;glusterfs/compat-errno.h&gt;</div><div class='add'>+#include &lt;glusterfs/compat.h&gt;</div><div class='add'>+#include &lt;glusterfs/byte-order.h&gt;</div><div class='add'>+#include &lt;glusterfs/statedump.h&gt;</div><div class='ctx'> </div><div class='add'>+#include "afr-transaction.h"</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-afr_open_ftruncate_cbk (call_frame_t *frame, void *cookie, xlator_t *this, </div><div class='del'>-			int32_t op_ret, int32_t op_errno, struct iatt *prebuf,</div><div class='del'>-                        struct iatt *postbuf)</div><div class='add'>+gf_boolean_t</div><div class='add'>+afr_is_fd_fixable(fd_t *fd)</div><div class='ctx'> {</div><div class='del'>-	afr_local_t * local = frame-&gt;local;</div><div class='del'>-</div><div class='del'>-	AFR_STACK_UNWIND (open, frame, local-&gt;op_ret, local-&gt;op_errno,</div><div class='del'>-			  local-&gt;fd);</div><div class='del'>-	return 0;</div><div class='add'>+    if (!fd || !fd-&gt;inode)</div><div class='add'>+        return _gf_false;</div><div class='add'>+    else if (fd_is_anonymous(fd))</div><div class='add'>+        return _gf_false;</div><div class='add'>+    else if (gf_uuid_is_null(fd-&gt;inode-&gt;gfid))</div><div class='add'>+        return _gf_false;</div><div class='add'>+</div><div class='add'>+    return _gf_true;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-afr_open_cbk (call_frame_t *frame, void *cookie,</div><div class='del'>-	      xlator_t *this, int32_t op_ret, int32_t op_errno,</div><div class='del'>-	      fd_t *fd)</div><div class='add'>+afr_open_ftruncate_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                       int32_t op_ret, int32_t op_errno, struct iatt *prebuf,</div><div class='add'>+                       struct iatt *postbuf, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-	afr_local_t *  local = NULL;</div><div class='del'>-</div><div class='del'>-        int child_index = (long) cookie;</div><div class='del'>-</div><div class='del'>-        uint64_t      ctx;</div><div class='del'>-        afr_fd_ctx_t *fd_ctx;</div><div class='del'>-</div><div class='del'>-        int ret = 0;</div><div class='del'>-</div><div class='del'>-	int call_count = -1;</div><div class='del'>-</div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-</div><div class='del'>-	LOCK (&amp;frame-&gt;lock);</div><div class='del'>-	{</div><div class='del'>-		if (op_ret == -1) {</div><div class='del'>-			local-&gt;op_errno = op_errno;</div><div class='del'>-		}</div><div class='del'>-</div><div class='del'>-		if (op_ret &gt;= 0) {</div><div class='del'>-			local-&gt;op_ret = op_ret;</div><div class='del'>-                        local-&gt;success_count++;</div><div class='del'>-</div><div class='del'>-                        ret = afr_fd_ctx_set (this, fd);</div><div class='add'>+    afr_local_t *local = frame-&gt;local;</div><div class='ctx'> </div><div class='del'>-                        if (ret &lt; 0) {</div><div class='del'>-                                gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-                                        "could not set fd ctx for fd=%p",</div><div class='del'>-                                        fd);</div><div class='del'>-</div><div class='del'>-                                local-&gt;op_ret   = -1;</div><div class='del'>-                                local-&gt;op_errno = -ret;</div><div class='del'>-                        }</div><div class='del'>-</div><div class='del'>-                        ret = fd_ctx_get (fd, this, &amp;ctx);</div><div class='del'>-</div><div class='del'>-                        if (ret &lt; 0) {</div><div class='del'>-                                gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-                                        "could not get fd ctx for fd=%p", fd);</div><div class='del'>-                                local-&gt;op_ret   = -1;</div><div class='del'>-                                local-&gt;op_errno = -ret;</div><div class='del'>-                        }</div><div class='del'>-</div><div class='del'>-                        fd_ctx = (afr_fd_ctx_t *)(long) ctx;</div><div class='del'>-</div><div class='del'>-                        fd_ctx-&gt;opened_on[child_index] = 1;</div><div class='del'>-                        fd_ctx-&gt;flags                  = local-&gt;cont.open.flags;</div><div class='del'>-                        fd_ctx-&gt;wbflags                = local-&gt;cont.open.wbflags;</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='del'>-	UNLOCK (&amp;frame-&gt;lock);</div><div class='del'>-</div><div class='del'>-	call_count = afr_frame_return (frame);</div><div class='del'>-</div><div class='del'>-	if (call_count == 0) {</div><div class='del'>-		if ((local-&gt;cont.open.flags &amp; O_TRUNC)</div><div class='del'>-		    &amp;&amp; (local-&gt;op_ret &gt;= 0)) {</div><div class='del'>-			STACK_WIND (frame, afr_open_ftruncate_cbk,</div><div class='del'>-				    this, this-&gt;fops-&gt;ftruncate,</div><div class='del'>-				    fd, 0);</div><div class='del'>-		} else {</div><div class='del'>-                        AFR_STACK_UNWIND (open, frame, local-&gt;op_ret,</div><div class='del'>-                                          local-&gt;op_errno, local-&gt;fd);</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='add'>+    AFR_STACK_UNWIND(open, frame, local-&gt;op_ret, local-&gt;op_errno,</div><div class='add'>+                     local-&gt;cont.open.fd, xdata);</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-afr_open (call_frame_t *frame, xlator_t *this, loc_t *loc, int32_t flags,</div><div class='del'>-          fd_t *fd, int32_t wbflags)</div><div class='add'>+afr_open_cbk(call_frame_t *frame, void *cookie, xlator_t *this, int32_t op_ret,</div><div class='add'>+             int32_t op_errno, fd_t *fd, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-	afr_private_t * priv  = NULL;</div><div class='del'>-	afr_local_t *   local = NULL;</div><div class='del'>-</div><div class='del'>-	int     i = 0;</div><div class='del'>-	int   ret = -1;</div><div class='del'>-</div><div class='del'>-	int32_t call_count = 0;	</div><div class='del'>-	int32_t op_ret   = -1;</div><div class='del'>-	int32_t op_errno = 0;</div><div class='del'>-	int32_t wind_flags = flags &amp; (~O_TRUNC);</div><div class='del'>-</div><div class='del'>-	VALIDATE_OR_GOTO (frame, out);</div><div class='del'>-	VALIDATE_OR_GOTO (this, out);</div><div class='del'>-	VALIDATE_OR_GOTO (this-&gt;private, out);</div><div class='del'>-	VALIDATE_OR_GOTO (loc, out);</div><div class='del'>-</div><div class='del'>-	priv = this-&gt;private;</div><div class='del'>-</div><div class='del'>-        if (afr_is_split_brain (this, loc-&gt;inode)) {</div><div class='del'>-		/* self-heal failed */</div><div class='del'>-		op_errno = EIO;</div><div class='del'>-		goto out;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	ALLOC_OR_GOTO (local, afr_local_t, out);</div><div class='del'>-</div><div class='del'>-	ret = AFR_LOCAL_INIT (local, priv);</div><div class='del'>-	if (ret &lt; 0) {</div><div class='del'>-		op_errno = -ret;</div><div class='del'>-		goto out;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	frame-&gt;local = local;</div><div class='del'>-	call_count   = local-&gt;call_count;</div><div class='del'>-</div><div class='del'>-        loc_copy (&amp;local-&gt;loc, loc);</div><div class='del'>-</div><div class='del'>-	local-&gt;cont.open.flags   = flags;</div><div class='del'>-        local-&gt;cont.open.wbflags = wbflags;</div><div class='del'>-</div><div class='del'>-	local-&gt;fd = fd_ref (fd);</div><div class='del'>-</div><div class='del'>-	for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='del'>-		if (local-&gt;child_up[i]) {</div><div class='del'>-			STACK_WIND_COOKIE (frame, afr_open_cbk, (void *) (long) i,</div><div class='del'>-					   priv-&gt;children[i],</div><div class='del'>-					   priv-&gt;children[i]-&gt;fops-&gt;open,</div><div class='del'>-					   loc, wind_flags, fd, wbflags);</div><div class='del'>-</div><div class='del'>-			if (!--call_count)</div><div class='del'>-				break;</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	op_ret = 0;</div><div class='del'>-out:</div><div class='del'>-	if (op_ret == -1) {</div><div class='del'>-		AFR_STACK_UNWIND (open, frame, op_ret, op_errno, fd);</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-afr_up_down_flush_open_cbk (call_frame_t *frame, void *cookie,</div><div class='del'>-                            xlator_t *this, int32_t op_ret, int32_t op_errno,</div><div class='del'>-                            fd_t *fd)</div><div class='del'>-{</div><div class='del'>-        afr_internal_lock_t *int_lock = NULL;</div><div class='del'>-        afr_local_t         *local    = NULL;</div><div class='del'>-        afr_private_t       *priv     = NULL;</div><div class='del'>-</div><div class='del'>-        int ret = 0;</div><div class='del'>-</div><div class='del'>-        uint64_t      ctx;</div><div class='del'>-        afr_fd_ctx_t *fd_ctx;</div><div class='del'>-</div><div class='del'>-        int call_count  = 0;</div><div class='del'>-        int child_index = (long) cookie;</div><div class='del'>-</div><div class='del'>-        priv     = this-&gt;private;</div><div class='del'>-        local    = frame-&gt;local;</div><div class='del'>-        int_lock = &amp;local-&gt;internal_lock;</div><div class='del'>-</div><div class='del'>-        LOCK (&amp;frame-&gt;lock);</div><div class='del'>-        {</div><div class='del'>-                if (op_ret &gt;= 0) {</div><div class='del'>-                        ret = fd_ctx_get (fd, this, &amp;ctx);</div><div class='del'>-</div><div class='del'>-                        if (ret &lt; 0) {</div><div class='del'>-                                goto out;</div><div class='del'>-                        }</div><div class='del'>-</div><div class='del'>-                        fd_ctx = (afr_fd_ctx_t *)(long) ctx;</div><div class='del'>-</div><div class='del'>-                        fd_ctx-&gt;opened_on[child_index] = 1;</div><div class='del'>-</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_TRACE,</div><div class='del'>-                                "fd for %s opened successfully on subvolume %s",</div><div class='del'>-                                local-&gt;loc.path, priv-&gt;children[child_index]-&gt;name);</div><div class='del'>-                }</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    int call_count = -1;</div><div class='add'>+    int child_index = (long)cookie;</div><div class='add'>+    afr_fd_ctx_t *fd_ctx = NULL;</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    fd_ctx = local-&gt;fd_ctx;</div><div class='add'>+</div><div class='add'>+    local-&gt;replies[child_index].valid = 1;</div><div class='add'>+    local-&gt;replies[child_index].op_ret = op_ret;</div><div class='add'>+    local-&gt;replies[child_index].op_errno = op_errno;</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;frame-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        if (op_ret == -1) {</div><div class='add'>+            local-&gt;op_errno = op_errno;</div><div class='add'>+            fd_ctx-&gt;opened_on[child_index] = AFR_FD_NOT_OPENED;</div><div class='add'>+        } else {</div><div class='add'>+            local-&gt;op_ret = op_ret;</div><div class='add'>+            fd_ctx-&gt;opened_on[child_index] = AFR_FD_OPENED;</div><div class='add'>+            if (!local-&gt;xdata_rsp &amp;&amp; xdata)</div><div class='add'>+                local-&gt;xdata_rsp = dict_ref(xdata);</div><div class='ctx'>         }</div><div class='del'>-out:</div><div class='del'>-        UNLOCK (&amp;frame-&gt;lock);</div><div class='del'>-</div><div class='del'>-        call_count = afr_frame_return (frame);</div><div class='del'>-</div><div class='del'>-        if (call_count == 0) {</div><div class='del'>-                int_lock-&gt;lock_cbk = local-&gt;transaction.done;</div><div class='del'>-                local-&gt;transaction.post_post_op (frame, this);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-static int</div><div class='del'>-__unopened_count (int child_count, unsigned char *opened_on, unsigned char *child_up)</div><div class='del'>-{</div><div class='del'>-        int i;</div><div class='del'>-        int count = 0;</div><div class='del'>-</div><div class='del'>-        for (i = 0; i &lt; child_count; i++) {</div><div class='del'>-                if (!opened_on[i] &amp;&amp; child_up[i])</div><div class='del'>-                        count++;</div><div class='add'>+        call_count = --local-&gt;call_count;</div><div class='add'>+    }</div><div class='add'>+    UNLOCK(&amp;frame-&gt;lock);</div><div class='add'>+</div><div class='add'>+    if (call_count == 0) {</div><div class='add'>+        afr_handle_replies_quorum(frame, this);</div><div class='add'>+        if (local-&gt;op_ret == -1) {</div><div class='add'>+            AFR_STACK_UNWIND(open, frame, local-&gt;op_ret, local-&gt;op_errno, NULL,</div><div class='add'>+                             NULL);</div><div class='add'>+        } else if (fd_ctx-&gt;flags &amp; O_TRUNC) {</div><div class='add'>+            STACK_WIND(frame, afr_open_ftruncate_cbk, this,</div><div class='add'>+                       this-&gt;fops-&gt;ftruncate, fd, 0, NULL);</div><div class='add'>+        } else {</div><div class='add'>+            AFR_STACK_UNWIND(open, frame, local-&gt;op_ret, local-&gt;op_errno,</div><div class='add'>+                             local-&gt;cont.open.fd, local-&gt;xdata_rsp);</div><div class='ctx'>         }</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        return count;</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-afr_up_down_flush_sh_unwind (call_frame_t *frame, xlator_t *this)</div><div class='add'>+afr_open_continue(call_frame_t *frame, xlator_t *this, int err)</div><div class='ctx'> {</div><div class='del'>-        afr_local_t *local  = NULL;</div><div class='del'>-        afr_private_t *priv = NULL;</div><div class='del'>-</div><div class='del'>-        uint64_t      ctx;</div><div class='del'>-        afr_fd_ctx_t *fd_ctx;</div><div class='del'>-</div><div class='del'>-        int abandon = 0;</div><div class='del'>-        int ret = 0;</div><div class='del'>-        int i;</div><div class='del'>-        int call_count = 0;</div><div class='del'>-</div><div class='del'>-        priv  = this-&gt;private;</div><div class='del'>-        local = frame-&gt;local;</div><div class='del'>-</div><div class='del'>-        /*</div><div class='del'>-         * Some subvolumes might have come up on which we never</div><div class='del'>-         * opened this fd in the first place. Re-open fd's on those</div><div class='del'>-         * subvolumes now.</div><div class='del'>-         */</div><div class='del'>-</div><div class='del'>-        ret = fd_ctx_get (local-&gt;fd, this, &amp;ctx);</div><div class='del'>-</div><div class='del'>-        if (ret &lt; 0) {</div><div class='del'>-                abandon = 1;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    int call_count = 0;</div><div class='add'>+    int i = 0;</div><div class='ctx'> </div><div class='del'>-        fd_ctx = (afr_fd_ctx_t *)(long) ctx;</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    priv = this-&gt;private;</div><div class='ctx'> </div><div class='del'>-        call_count = __unopened_count (priv-&gt;child_count, fd_ctx-&gt;opened_on,</div><div class='del'>-                                       local-&gt;child_up);</div><div class='del'>-</div><div class='del'>-        if (call_count == 0) {</div><div class='del'>-                abandon = 1;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        local-&gt;call_count = call_count;</div><div class='add'>+    if (err) {</div><div class='add'>+        AFR_STACK_UNWIND(open, frame, -1, err, NULL, NULL);</div><div class='add'>+    } else {</div><div class='add'>+        local-&gt;call_count = AFR_COUNT(local-&gt;child_up, priv-&gt;child_count);</div><div class='add'>+        call_count = local-&gt;call_count;</div><div class='ctx'> </div><div class='ctx'>         for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='del'>-                if (!fd_ctx-&gt;opened_on[i] &amp;&amp; local-&gt;child_up[i]) {</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_TRACE,</div><div class='del'>-                                "opening fd for %s on subvolume %s",</div><div class='del'>-                                local-&gt;loc.path, priv-&gt;children[i]-&gt;name);</div><div class='del'>-</div><div class='del'>-                        STACK_WIND_COOKIE (frame, afr_up_down_flush_open_cbk,</div><div class='del'>-                                           (void *)(long) i,</div><div class='del'>-                                           priv-&gt;children[i],</div><div class='del'>-                                           priv-&gt;children[i]-&gt;fops-&gt;open,</div><div class='del'>-                                           &amp;local-&gt;loc, fd_ctx-&gt;flags, local-&gt;fd,</div><div class='del'>-                                           fd_ctx-&gt;wbflags);</div><div class='del'>-</div><div class='del'>-                        if (!--call_count)</div><div class='del'>-                                break;</div><div class='del'>-                }</div><div class='add'>+            if (local-&gt;child_up[i]) {</div><div class='add'>+                STACK_WIND_COOKIE(frame, afr_open_cbk, (void *)(long)i,</div><div class='add'>+                                  priv-&gt;children[i],</div><div class='add'>+                                  priv-&gt;children[i]-&gt;fops-&gt;open, &amp;local-&gt;loc,</div><div class='add'>+                                  (local-&gt;cont.open.flags &amp; ~O_TRUNC),</div><div class='add'>+                                  local-&gt;cont.open.fd, local-&gt;xdata_req);</div><div class='add'>+                if (!--call_count)</div><div class='add'>+                    break;</div><div class='add'>+            }</div><div class='ctx'>         }</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        if (abandon)</div><div class='del'>-                local-&gt;transaction.post_post_op (frame, this);</div><div class='del'>-</div><div class='del'>-        return 0;</div><div class='add'>+    }</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-afr_up_down_flush_post_post_op (call_frame_t *frame, xlator_t *this)</div><div class='add'>+afr_open(call_frame_t *frame, xlator_t *this, loc_t *loc, int32_t flags,</div><div class='add'>+         fd_t *fd, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-        afr_local_t     *local  = NULL;</div><div class='del'>-        afr_self_heal_t *sh = NULL;</div><div class='del'>-        char            sh_type_str[256] = {0,};</div><div class='del'>-</div><div class='del'>-        local = frame-&gt;local;</div><div class='del'>-        sh    = &amp;local-&gt;self_heal;</div><div class='del'>-</div><div class='del'>-        inode_path (local-&gt;fd-&gt;inode, NULL, (char **)&amp;local-&gt;loc.path);</div><div class='del'>-        local-&gt;loc.name   = strrchr (local-&gt;loc.path, '/');</div><div class='del'>-        local-&gt;loc.inode  = inode_ref (local-&gt;fd-&gt;inode);</div><div class='del'>-        local-&gt;loc.parent = inode_parent (local-&gt;fd-&gt;inode, 0, NULL);</div><div class='del'>-</div><div class='del'>-        /* forcibly trigger missing-entries self-heal */</div><div class='del'>-</div><div class='del'>-        local-&gt;success_count    = 1;</div><div class='del'>-        local-&gt;enoent_count     = 1;</div><div class='del'>-</div><div class='del'>-        sh-&gt;data_lock_held      = _gf_true;</div><div class='del'>-        sh-&gt;need_data_self_heal = _gf_true;</div><div class='del'>-        sh-&gt;type                = local-&gt;fd-&gt;inode-&gt;ia_type;</div><div class='del'>-        sh-&gt;background          = _gf_false;</div><div class='del'>-        sh-&gt;unwind              = afr_up_down_flush_sh_unwind;</div><div class='del'>-</div><div class='del'>-        afr_self_heal_type_str_get(&amp;local-&gt;self_heal,</div><div class='del'>-                                   sh_type_str,</div><div class='del'>-                                   sizeof(sh_type_str));</div><div class='del'>-        gf_log (this-&gt;name, GF_LOG_NORMAL, "%s self-heal triggered. "</div><div class='del'>-                "path: %s, reason: Replicate up down flush, data lock is held",</div><div class='del'>-                sh_type_str, local-&gt;loc.path);</div><div class='del'>-</div><div class='del'>-        afr_self_heal (frame, this);</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    int spb_subvol = 0;</div><div class='add'>+    int event_generation = 0;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    int32_t op_errno = 0;</div><div class='add'>+    afr_fd_ctx_t *fd_ctx = NULL;</div><div class='add'>+</div><div class='add'>+    // We can't let truncation to happen outside transaction.</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    local = AFR_FRAME_INIT(frame, op_errno);</div><div class='add'>+    if (!local)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    local-&gt;op = GF_FOP_OPEN;</div><div class='add'>+    fd_ctx = afr_fd_ctx_get(fd, this);</div><div class='add'>+    if (!fd_ctx) {</div><div class='add'>+        op_errno = ENOMEM;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (priv-&gt;quorum_count &amp;&amp; !afr_has_quorum(local-&gt;child_up, this, NULL)) {</div><div class='add'>+        op_errno = afr_quorum_errno(priv);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (!afr_is_consistent_io_possible(local, priv, &amp;op_errno))</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    local-&gt;inode = inode_ref(loc-&gt;inode);</div><div class='add'>+    loc_copy(&amp;local-&gt;loc, loc);</div><div class='add'>+    local-&gt;fd_ctx = fd_ctx;</div><div class='add'>+    fd_ctx-&gt;flags = flags;</div><div class='add'>+    if (xdata)</div><div class='add'>+        local-&gt;xdata_req = dict_ref(xdata);</div><div class='add'>+</div><div class='add'>+    local-&gt;cont.open.flags = flags;</div><div class='add'>+    local-&gt;cont.open.fd = fd_ref(fd);</div><div class='add'>+</div><div class='add'>+    ret = afr_inode_get_readable(frame, local-&gt;inode, this, NULL,</div><div class='add'>+                                 &amp;event_generation, AFR_DATA_TRANSACTION);</div><div class='add'>+    if ((ret &lt; 0) &amp;&amp;</div><div class='add'>+        (afr_split_brain_read_subvol_get(local-&gt;inode, this, NULL,</div><div class='add'>+                                         &amp;spb_subvol) == 0) &amp;&amp;</div><div class='add'>+        spb_subvol &lt; 0) {</div><div class='add'>+        afr_inode_refresh(frame, this, local-&gt;inode, local-&gt;inode-&gt;gfid,</div><div class='add'>+                          afr_open_continue);</div><div class='add'>+    } else {</div><div class='add'>+        afr_open_continue(frame, this, 0);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+out:</div><div class='add'>+    AFR_STACK_UNWIND(open, frame, -1, op_errno, fd, NULL);</div><div class='ctx'> </div><div class='del'>-        return 0;</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-afr_up_down_flush_wind (call_frame_t *frame, xlator_t *this)</div><div class='add'>+afr_openfd_fix_open_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                        int32_t op_ret, int32_t op_errno, fd_t *fd,</div><div class='add'>+                        dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-	afr_local_t *local = NULL;</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    afr_fd_ctx_t *fd_ctx = NULL;</div><div class='add'>+    int call_count = 0;</div><div class='add'>+    int child_index = (long)cookie;</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+</div><div class='add'>+    if (op_ret &gt;= 0) {</div><div class='add'>+        gf_msg_debug(this-&gt;name, 0,</div><div class='add'>+                     "fd for %s opened "</div><div class='add'>+                     "successfully on subvolume %s",</div><div class='add'>+                     local-&gt;loc.path, priv-&gt;children[child_index]-&gt;name);</div><div class='add'>+    } else {</div><div class='add'>+        gf_smsg(this-&gt;name, fop_log_level(GF_FOP_OPEN, op_errno), op_errno,</div><div class='add'>+                AFR_MSG_OPEN_FAIL, "path=%s", local-&gt;loc.path, "subvolume=%s",</div><div class='add'>+                priv-&gt;children[child_index]-&gt;name, NULL);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    fd_ctx = local-&gt;fd_ctx;</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;local-&gt;fd-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        if (op_ret &gt;= 0) {</div><div class='add'>+            fd_ctx-&gt;opened_on[child_index] = AFR_FD_OPENED;</div><div class='add'>+        } else {</div><div class='add'>+            fd_ctx-&gt;opened_on[child_index] = AFR_FD_NOT_OPENED;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    UNLOCK(&amp;local-&gt;fd-&gt;lock);</div><div class='ctx'> </div><div class='del'>-	local = frame-&gt;local;</div><div class='add'>+    call_count = afr_frame_return(frame);</div><div class='add'>+    if (call_count == 0)</div><div class='add'>+        AFR_STACK_DESTROY(frame);</div><div class='ctx'> </div><div class='del'>-        local-&gt;transaction.resume (frame, this);</div><div class='del'>-	return 0;</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-afr_up_down_flush_done (call_frame_t *frame, xlator_t *this)</div><div class='add'>+static int</div><div class='add'>+afr_fd_ctx_need_open(fd_t *fd, xlator_t *this, unsigned char *need_open)</div><div class='ctx'> {</div><div class='del'>-        afr_private_t *priv = NULL;</div><div class='del'>-	afr_local_t *local  = NULL;</div><div class='del'>-</div><div class='del'>-        uint64_t       ctx;</div><div class='del'>-        afr_fd_ctx_t * fd_ctx = NULL;</div><div class='add'>+    afr_fd_ctx_t *fd_ctx = NULL;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    int i = 0;</div><div class='add'>+    int count = 0;</div><div class='ctx'> </div><div class='del'>-        int _ret = -1;</div><div class='del'>-        int i    = 0;</div><div class='add'>+    priv = this-&gt;private;</div><div class='ctx'> </div><div class='del'>-        priv  = this-&gt;private;</div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-</div><div class='del'>-        LOCK (&amp;local-&gt;fd-&gt;lock);</div><div class='del'>-        {</div><div class='del'>-                _ret = __fd_ctx_get (local-&gt;fd, this, &amp;ctx);</div><div class='del'>-</div><div class='del'>-                if (_ret &lt; 0) {</div><div class='del'>-                        goto out;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                fd_ctx = (afr_fd_ctx_t *)(long) ctx;</div><div class='del'>-</div><div class='del'>-                fd_ctx-&gt;down_count = priv-&gt;down_count;</div><div class='del'>-                fd_ctx-&gt;up_count   = priv-&gt;up_count;</div><div class='add'>+    fd_ctx = afr_fd_ctx_get(fd, this);</div><div class='add'>+    if (!fd_ctx)</div><div class='add'>+        return 0;</div><div class='ctx'> </div><div class='del'>-                for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='del'>-                        if (local-&gt;child_up[i])</div><div class='del'>-                                fd_ctx-&gt;pre_op_done[i] = 0;</div><div class='del'>-                }</div><div class='add'>+    LOCK(&amp;fd-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+            if (fd_ctx-&gt;opened_on[i] == AFR_FD_NOT_OPENED &amp;&amp;</div><div class='add'>+                priv-&gt;child_up[i]) {</div><div class='add'>+                fd_ctx-&gt;opened_on[i] = AFR_FD_OPENING;</div><div class='add'>+                need_open[i] = 1;</div><div class='add'>+                count++;</div><div class='add'>+            } else {</div><div class='add'>+                need_open[i] = 0;</div><div class='add'>+            }</div><div class='ctx'>         }</div><div class='del'>-out:</div><div class='del'>-        UNLOCK (&amp;local-&gt;fd-&gt;lock);</div><div class='add'>+    }</div><div class='add'>+    UNLOCK(&amp;fd-&gt;lock);</div><div class='ctx'> </div><div class='del'>-        afr_local_transaction_cleanup (local, this);</div><div class='del'>-</div><div class='del'>-        gf_log (this-&gt;name, GF_LOG_TRACE,</div><div class='del'>-                "The up/down flush is over");</div><div class='del'>-</div><div class='del'>-        fd_unref (local-&gt;fd);</div><div class='del'>-        local-&gt;up_down_flush_cbk (frame, this);</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='add'>+    return count;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-afr_up_down_flush (call_frame_t *frame, xlator_t *this, fd_t *fd,</div><div class='del'>-                   afr_flush_type type)</div><div class='add'>+void</div><div class='add'>+afr_fix_open(fd_t *fd, xlator_t *this)</div><div class='ctx'> {</div><div class='del'>-	afr_local_t   * local = NULL;</div><div class='del'>-</div><div class='del'>-	VALIDATE_OR_GOTO (frame, out);</div><div class='del'>-	VALIDATE_OR_GOTO (this, out);</div><div class='del'>-	VALIDATE_OR_GOTO (this-&gt;private, out);</div><div class='del'>-</div><div class='del'>-        local = frame-&gt;local;</div><div class='del'>-</div><div class='del'>-        local-&gt;op = GF_FOP_FLUSH;</div><div class='del'>-</div><div class='del'>-        local-&gt;fd = fd_ref (fd);</div><div class='del'>-</div><div class='del'>-        local-&gt;transaction.fop          = afr_up_down_flush_wind;</div><div class='del'>-        local-&gt;transaction.done         = afr_up_down_flush_done;</div><div class='del'>-</div><div class='del'>-        switch (type) {</div><div class='del'>-        case AFR_CHILD_UP_FLUSH:</div><div class='del'>-                local-&gt;transaction.post_post_op = afr_up_down_flush_post_post_op;</div><div class='del'>-                break;</div><div class='del'>-</div><div class='del'>-        case AFR_CHILD_DOWN_FLUSH:</div><div class='del'>-                local-&gt;transaction.post_post_op = NULL;</div><div class='del'>-                break;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    int i = 0;</div><div class='add'>+    call_frame_t *frame = NULL;</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int32_t op_errno = 0;</div><div class='add'>+    afr_fd_ctx_t *fd_ctx = NULL;</div><div class='add'>+    unsigned char *need_open = NULL;</div><div class='add'>+    int call_count = 0;</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    if (!afr_is_fd_fixable(fd))</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    fd_ctx = afr_fd_ctx_get(fd, this);</div><div class='add'>+    if (!fd_ctx)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    need_open = alloca0(priv-&gt;child_count);</div><div class='add'>+</div><div class='add'>+    call_count = afr_fd_ctx_need_open(fd, this, need_open);</div><div class='add'>+    if (!call_count)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    frame = create_frame(this, this-&gt;ctx-&gt;pool);</div><div class='add'>+    if (!frame)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    local = AFR_FRAME_INIT(frame, op_errno);</div><div class='add'>+    if (!local)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    local-&gt;loc.inode = inode_ref(fd-&gt;inode);</div><div class='add'>+    ret = loc_path(&amp;local-&gt;loc, NULL);</div><div class='add'>+    if (ret &lt; 0)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    local-&gt;fd = fd_ref(fd);</div><div class='add'>+    local-&gt;fd_ctx = fd_ctx;</div><div class='add'>+</div><div class='add'>+    local-&gt;call_count = call_count;</div><div class='add'>+</div><div class='add'>+    gf_msg_debug(this-&gt;name, 0, "need open count: %d", call_count);</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+        if (!need_open[i])</div><div class='add'>+            continue;</div><div class='add'>+</div><div class='add'>+        if (IA_IFDIR == fd-&gt;inode-&gt;ia_type) {</div><div class='add'>+            gf_msg_debug(this-&gt;name, 0, "opening fd for dir %s on subvolume %s",</div><div class='add'>+                         local-&gt;loc.path, priv-&gt;children[i]-&gt;name);</div><div class='add'>+</div><div class='add'>+            STACK_WIND_COOKIE(frame, afr_openfd_fix_open_cbk, (void *)(long)i,</div><div class='add'>+                              priv-&gt;children[i],</div><div class='add'>+                              priv-&gt;children[i]-&gt;fops-&gt;opendir, &amp;local-&gt;loc,</div><div class='add'>+                              local-&gt;fd, NULL);</div><div class='add'>+        } else {</div><div class='add'>+            gf_msg_debug(this-&gt;name, 0,</div><div class='add'>+                         "opening fd for file %s on subvolume %s",</div><div class='add'>+                         local-&gt;loc.path, priv-&gt;children[i]-&gt;name);</div><div class='add'>+</div><div class='add'>+            STACK_WIND_COOKIE(frame, afr_openfd_fix_open_cbk, (void *)(long)i,</div><div class='add'>+                              priv-&gt;children[i], priv-&gt;children[i]-&gt;fops-&gt;open,</div><div class='add'>+                              &amp;local-&gt;loc, fd_ctx-&gt;flags &amp; (~O_TRUNC),</div><div class='add'>+                              local-&gt;fd, NULL);</div><div class='ctx'>         }</div><div class='ctx'> </div><div class='del'>-        local-&gt;transaction.start  = 0;</div><div class='del'>-        local-&gt;transaction.len    = 0;</div><div class='del'>-</div><div class='del'>-        gf_log (this-&gt;name, GF_LOG_TRACE,</div><div class='del'>-                "doing up/down flush on fd=%p",</div><div class='del'>-                fd);</div><div class='del'>-</div><div class='del'>-        afr_transaction (frame, this, AFR_FLUSH_TRANSACTION);</div><div class='add'>+        if (!--call_count)</div><div class='add'>+            break;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='add'>+    return;</div><div class='ctx'> out:</div><div class='del'>-	return 0;</div><div class='add'>+    if (frame)</div><div class='add'>+        AFR_STACK_DESTROY(frame);</div><div class='ctx'> }</div><div class='head'>diff --git a/xlators/cluster/afr/src/afr-read-txn.c b/xlators/cluster/afr/src/afr-read-txn.c<br/>new file mode 100644<br/>index 00000000000..6fc2c75145c<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/xlators/cluster/afr/src/afr-read-txn.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>xlators/cluster/afr/src/afr-read-txn.c</a></div><div class='hunk'>@@ -0,0 +1,494 @@</div><div class='add'>+/*</div><div class='add'>+  Copyright (c) 2013 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#include "afr.h"</div><div class='add'>+#include "afr-transaction.h"</div><div class='add'>+#include "afr-messages.h"</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+afr_pending_read_increment(afr_private_t *priv, int child_index)</div><div class='add'>+{</div><div class='add'>+    if (child_index &lt; 0 || child_index &gt; priv-&gt;child_count)</div><div class='add'>+        return;</div><div class='add'>+</div><div class='add'>+    GF_ATOMIC_INC(priv-&gt;pending_reads[child_index]);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+afr_pending_read_decrement(afr_private_t *priv, int child_index)</div><div class='add'>+{</div><div class='add'>+    if (child_index &lt; 0 || child_index &gt; priv-&gt;child_count)</div><div class='add'>+        return;</div><div class='add'>+</div><div class='add'>+    GF_ATOMIC_DEC(priv-&gt;pending_reads[child_index]);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+afr_read_txn_wind(call_frame_t *frame, xlator_t *this, int subvol)</div><div class='add'>+{</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    afr_pending_read_decrement(priv, local-&gt;read_subvol);</div><div class='add'>+    local-&gt;read_subvol = subvol;</div><div class='add'>+    afr_pending_read_increment(priv, subvol);</div><div class='add'>+    local-&gt;readfn(frame, this, subvol);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+afr_read_txn_next_subvol(call_frame_t *frame, xlator_t *this)</div><div class='add'>+{</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    int i = 0;</div><div class='add'>+    int subvol = -1;</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+        if (!local-&gt;readable[i]) {</div><div class='add'>+            /* don't even bother trying here.</div><div class='add'>+               just mark as attempted and move on. */</div><div class='add'>+            local-&gt;read_attempted[i] = 1;</div><div class='add'>+            continue;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        if (!local-&gt;read_attempted[i]) {</div><div class='add'>+            subvol = i;</div><div class='add'>+            break;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* If no more subvols were available for reading, we leave</div><div class='add'>+       @subvol as -1, which is an indication we have run out of</div><div class='add'>+       readable subvols. */</div><div class='add'>+    if (subvol != -1)</div><div class='add'>+        local-&gt;read_attempted[subvol] = 1;</div><div class='add'>+    afr_read_txn_wind(frame, this, subvol);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+afr_ta_read_txn_done(int ret, call_frame_t *ta_frame, void *opaque)</div><div class='add'>+{</div><div class='add'>+    STACK_DESTROY(ta_frame-&gt;root);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+afr_ta_read_txn(void *opaque)</div><div class='add'>+{</div><div class='add'>+    call_frame_t *frame = NULL;</div><div class='add'>+    xlator_t *this = NULL;</div><div class='add'>+    int read_subvol = -1;</div><div class='add'>+    int query_child = AFR_CHILD_UNKNOWN;</div><div class='add'>+    int possible_bad_child = AFR_CHILD_UNKNOWN;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    int op_errno = ENOMEM;</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    struct gf_flock flock = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    dict_t *xdata_req = NULL;</div><div class='add'>+    dict_t *xdata_rsp = NULL;</div><div class='add'>+    int **pending = NULL;</div><div class='add'>+    loc_t loc = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    frame = (call_frame_t *)opaque;</div><div class='add'>+    this = frame-&gt;this;</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+    query_child = local-&gt;read_txn_query_child;</div><div class='add'>+</div><div class='add'>+    if (query_child == AFR_CHILD_ZERO) {</div><div class='add'>+        possible_bad_child = AFR_CHILD_ONE;</div><div class='add'>+    } else if (query_child == AFR_CHILD_ONE) {</div><div class='add'>+        possible_bad_child = AFR_CHILD_ZERO;</div><div class='add'>+    } else {</div><div class='add'>+        /*read_txn_query_child is AFR_CHILD_UNKNOWN*/</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Ask the query_child to see if it blames the possibly bad one. */</div><div class='add'>+    xdata_req = dict_new();</div><div class='add'>+    if (!xdata_req)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    pending = afr_matrix_create(priv-&gt;child_count, AFR_NUM_CHANGE_LOGS);</div><div class='add'>+    if (!pending)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    ret = afr_set_pending_dict(priv, xdata_req, pending);</div><div class='add'>+    if (ret &lt; 0)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    if (local-&gt;fd) {</div><div class='add'>+        ret = syncop_fxattrop(priv-&gt;children[query_child], local-&gt;fd,</div><div class='add'>+                              GF_XATTROP_ADD_ARRAY, xdata_req, NULL, &amp;xdata_rsp,</div><div class='add'>+                              NULL);</div><div class='add'>+    } else {</div><div class='add'>+        ret = syncop_xattrop(priv-&gt;children[query_child], &amp;local-&gt;loc,</div><div class='add'>+                             GF_XATTROP_ADD_ARRAY, xdata_req, NULL, &amp;xdata_rsp,</div><div class='add'>+                             NULL);</div><div class='add'>+    }</div><div class='add'>+    if (ret || !xdata_rsp) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_ERROR, -ret, AFR_MSG_THIN_ARB,</div><div class='add'>+               "Failed xattrop for gfid %s on %s",</div><div class='add'>+               uuid_utoa(local-&gt;inode-&gt;gfid),</div><div class='add'>+               priv-&gt;children[query_child]-&gt;name);</div><div class='add'>+        op_errno = -ret;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (afr_ta_dict_contains_pending_xattr(xdata_rsp, priv,</div><div class='add'>+                                           possible_bad_child)) {</div><div class='add'>+        read_subvol = query_child;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    dict_unref(xdata_rsp);</div><div class='add'>+    xdata_rsp = NULL;</div><div class='add'>+</div><div class='add'>+    /* It doesn't. So query thin-arbiter to see if it blames any data brick. */</div><div class='add'>+    ret = afr_fill_ta_loc(this, &amp;loc, _gf_true);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_ERROR, -ret, AFR_MSG_THIN_ARB,</div><div class='add'>+               "Failed to populate thin-arbiter loc for: %s.", loc.name);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    flock.l_type = F_WRLCK; /*start and length are already zero. */</div><div class='add'>+    ret = syncop_inodelk(priv-&gt;children[THIN_ARBITER_BRICK_INDEX],</div><div class='add'>+                         AFR_TA_DOM_MODIFY, &amp;loc, F_SETLKW, &amp;flock, NULL, NULL);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_ERROR, -ret, AFR_MSG_THIN_ARB,</div><div class='add'>+               "gfid:%s: Failed to get AFR_TA_DOM_MODIFY lock on %s.",</div><div class='add'>+               uuid_utoa(local-&gt;inode-&gt;gfid),</div><div class='add'>+               priv-&gt;pending_key[THIN_ARBITER_BRICK_INDEX]);</div><div class='add'>+        op_errno = -ret;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = syncop_xattrop(priv-&gt;children[THIN_ARBITER_BRICK_INDEX], &amp;loc,</div><div class='add'>+                         GF_XATTROP_ADD_ARRAY, xdata_req, NULL, &amp;xdata_rsp,</div><div class='add'>+                         NULL);</div><div class='add'>+    if (ret || !xdata_rsp) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_ERROR, -ret, AFR_MSG_THIN_ARB,</div><div class='add'>+               "gfid:%s: Failed xattrop on %s.", uuid_utoa(local-&gt;inode-&gt;gfid),</div><div class='add'>+               priv-&gt;pending_key[THIN_ARBITER_BRICK_INDEX]);</div><div class='add'>+        op_errno = -ret;</div><div class='add'>+        goto unlock;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (!afr_ta_dict_contains_pending_xattr(xdata_rsp, priv, query_child)) {</div><div class='add'>+        read_subvol = query_child;</div><div class='add'>+    } else {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_ERROR, EIO, AFR_MSG_THIN_ARB,</div><div class='add'>+               "Failing read for gfid %s since good brick %s is down",</div><div class='add'>+               uuid_utoa(local-&gt;inode-&gt;gfid),</div><div class='add'>+               priv-&gt;children[possible_bad_child]-&gt;name);</div><div class='add'>+        op_errno = EIO;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+unlock:</div><div class='add'>+    flock.l_type = F_UNLCK;</div><div class='add'>+    ret = syncop_inodelk(priv-&gt;children[THIN_ARBITER_BRICK_INDEX],</div><div class='add'>+                         AFR_TA_DOM_MODIFY, &amp;loc, F_SETLK, &amp;flock, NULL, NULL);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_ERROR, -ret, AFR_MSG_THIN_ARB,</div><div class='add'>+               "gfid:%s: Failed to unlock AFR_TA_DOM_MODIFY lock on "</div><div class='add'>+               "%s.",</div><div class='add'>+               uuid_utoa(local-&gt;inode-&gt;gfid),</div><div class='add'>+               priv-&gt;pending_key[THIN_ARBITER_BRICK_INDEX]);</div><div class='add'>+    }</div><div class='add'>+out:</div><div class='add'>+    if (xdata_req)</div><div class='add'>+        dict_unref(xdata_req);</div><div class='add'>+    if (xdata_rsp)</div><div class='add'>+        dict_unref(xdata_rsp);</div><div class='add'>+    if (pending)</div><div class='add'>+        afr_matrix_cleanup(pending, priv-&gt;child_count);</div><div class='add'>+    loc_wipe(&amp;loc);</div><div class='add'>+</div><div class='add'>+    if (read_subvol == -1) {</div><div class='add'>+        local-&gt;op_ret = -1;</div><div class='add'>+        local-&gt;op_errno = op_errno;</div><div class='add'>+    }</div><div class='add'>+    afr_read_txn_wind(frame, this, read_subvol);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+afr_ta_read_txn_synctask(call_frame_t *frame, xlator_t *this)</div><div class='add'>+{</div><div class='add'>+    call_frame_t *ta_frame = NULL;</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    ta_frame = afr_ta_frame_create(this);</div><div class='add'>+    if (!ta_frame) {</div><div class='add'>+        local-&gt;op_ret = -1;</div><div class='add'>+        local-&gt;op_errno = ENOMEM;</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_ERROR, ENOMEM, AFR_MSG_THIN_ARB,</div><div class='add'>+               "Failed to create ta_frame");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    ret = synctask_new(this-&gt;ctx-&gt;env, afr_ta_read_txn, afr_ta_read_txn_done,</div><div class='add'>+                       ta_frame, frame);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_ERROR, ENOMEM, AFR_MSG_THIN_ARB,</div><div class='add'>+               "Failed to launch "</div><div class='add'>+               "afr_ta_read_txn synctask for gfid %s.",</div><div class='add'>+               uuid_utoa(local-&gt;inode-&gt;gfid));</div><div class='add'>+        local-&gt;op_ret = -1;</div><div class='add'>+        local-&gt;op_errno = ENOMEM;</div><div class='add'>+        STACK_DESTROY(ta_frame-&gt;root);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    return;</div><div class='add'>+out:</div><div class='add'>+    afr_read_txn_wind(frame, this, -1);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+afr_read_txn_refresh_done(call_frame_t *frame, xlator_t *this, int err)</div><div class='add'>+{</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    int read_subvol = -1;</div><div class='add'>+    inode_t *inode = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int spb_subvol = -1;</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    inode = local-&gt;inode;</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    if (err) {</div><div class='add'>+        if (!priv-&gt;thin_arbiter_count)</div><div class='add'>+            goto readfn;</div><div class='add'>+        if (err != EINVAL)</div><div class='add'>+            goto readfn;</div><div class='add'>+        /* We need to query the good bricks and/or thin-arbiter.*/</div><div class='add'>+        afr_ta_read_txn_synctask(frame, this);</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    read_subvol = afr_read_subvol_select_by_policy(inode, this, local-&gt;readable,</div><div class='add'>+                                                   NULL);</div><div class='add'>+    if (read_subvol == -1) {</div><div class='add'>+        err = EIO;</div><div class='add'>+        goto readfn;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (local-&gt;read_attempted[read_subvol]) {</div><div class='add'>+        afr_read_txn_next_subvol(frame, this);</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    local-&gt;read_attempted[read_subvol] = 1;</div><div class='add'>+readfn:</div><div class='add'>+    if (read_subvol == -1) {</div><div class='add'>+        ret = afr_split_brain_read_subvol_get(inode, this, frame, &amp;spb_subvol);</div><div class='add'>+        if ((ret == 0) &amp;&amp; spb_subvol &gt;= 0)</div><div class='add'>+            read_subvol = spb_subvol;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (read_subvol == -1) {</div><div class='add'>+        AFR_SET_ERROR_AND_CHECK_SPLIT_BRAIN(-1, err);</div><div class='add'>+    }</div><div class='add'>+    afr_read_txn_wind(frame, this, read_subvol);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+afr_read_txn_continue(call_frame_t *frame, xlator_t *this, int subvol)</div><div class='add'>+{</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+</div><div class='add'>+    if (!local-&gt;refreshed) {</div><div class='add'>+        local-&gt;refreshed = _gf_true;</div><div class='add'>+        afr_inode_refresh(frame, this, local-&gt;inode, NULL,</div><div class='add'>+                          afr_read_txn_refresh_done);</div><div class='add'>+    } else {</div><div class='add'>+        afr_read_txn_next_subvol(frame, this);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* afr_read_txn_wipe:</div><div class='add'>+</div><div class='add'>+   clean internal variables in @local in order to make</div><div class='add'>+   it possible to call afr_read_txn() multiple times from</div><div class='add'>+   the same frame</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+afr_read_txn_wipe(call_frame_t *frame, xlator_t *this)</div><div class='add'>+{</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    int i = 0;</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    local-&gt;readfn = NULL;</div><div class='add'>+</div><div class='add'>+    if (local-&gt;inode)</div><div class='add'>+        inode_unref(local-&gt;inode);</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+        local-&gt;read_attempted[i] = 0;</div><div class='add'>+        local-&gt;readable[i] = 0;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+  afr_read_txn:</div><div class='add'>+</div><div class='add'>+  This is the read transaction function. The way it works:</div><div class='add'>+</div><div class='add'>+  - Determine read-subvolume from inode ctx.</div><div class='add'>+</div><div class='add'>+  - If read-subvolume's generation was stale, refresh ctx once by</div><div class='add'>+    calling afr_inode_refresh()</div><div class='add'>+</div><div class='add'>+    Else make an attempt to read on read-subvolume.</div><div class='add'>+</div><div class='add'>+  - If attempted read on read-subvolume fails, refresh ctx once</div><div class='add'>+    by calling afr_inode_refresh()</div><div class='add'>+</div><div class='add'>+  - After ctx refresh, query read-subvolume freshly and attempt</div><div class='add'>+    read once.</div><div class='add'>+</div><div class='add'>+  - If read fails, try every other readable[] subvolume before</div><div class='add'>+    finally giving up. readable[] elements are set by afr_inode_refresh()</div><div class='add'>+    based on dirty and pending flags.</div><div class='add'>+</div><div class='add'>+  - If file is in split brain in the backend, generation will be</div><div class='add'>+    kept 0 by afr_inode_refresh() and readable[] will be set 0 for</div><div class='add'>+    all elements. Therefore reads always fail.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+afr_read_txn(call_frame_t *frame, xlator_t *this, inode_t *inode,</div><div class='add'>+             afr_read_txn_wind_t readfn, afr_transaction_type type)</div><div class='add'>+{</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    unsigned char *data = NULL;</div><div class='add'>+    unsigned char *metadata = NULL;</div><div class='add'>+    int read_subvol = -1;</div><div class='add'>+    int event_generation = 0;</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    data = alloca0(priv-&gt;child_count);</div><div class='add'>+    metadata = alloca0(priv-&gt;child_count);</div><div class='add'>+</div><div class='add'>+    afr_read_txn_wipe(frame, this);</div><div class='add'>+</div><div class='add'>+    local-&gt;readfn = readfn;</div><div class='add'>+    local-&gt;inode = inode_ref(inode);</div><div class='add'>+    local-&gt;is_read_txn = _gf_true;</div><div class='add'>+    local-&gt;transaction.type = type;</div><div class='add'>+</div><div class='add'>+    if (priv-&gt;quorum_count &amp;&amp; !afr_has_quorum(local-&gt;child_up, this, NULL)) {</div><div class='add'>+        local-&gt;op_ret = -1;</div><div class='add'>+        local-&gt;op_errno = afr_quorum_errno(priv);</div><div class='add'>+        goto read;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (!afr_is_consistent_io_possible(local, priv, &amp;local-&gt;op_errno)) {</div><div class='add'>+        local-&gt;op_ret = -1;</div><div class='add'>+        goto read;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (priv-&gt;thin_arbiter_count &amp;&amp; !afr_ta_has_quorum(priv, local)) {</div><div class='add'>+        local-&gt;op_ret = -1;</div><div class='add'>+        local-&gt;op_errno = -afr_quorum_errno(priv);</div><div class='add'>+        goto read;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (priv-&gt;thin_arbiter_count &amp;&amp;</div><div class='add'>+        AFR_COUNT(local-&gt;child_up, priv-&gt;child_count) != priv-&gt;child_count) {</div><div class='add'>+        if (local-&gt;child_up[0]) {</div><div class='add'>+            local-&gt;read_txn_query_child = AFR_CHILD_ZERO;</div><div class='add'>+        } else if (local-&gt;child_up[1]) {</div><div class='add'>+            local-&gt;read_txn_query_child = AFR_CHILD_ONE;</div><div class='add'>+        }</div><div class='add'>+        afr_ta_read_txn_synctask(frame, this);</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = afr_inode_read_subvol_get(inode, this, data, metadata,</div><div class='add'>+                                    &amp;event_generation);</div><div class='add'>+    if (ret == -1)</div><div class='add'>+        /* very first transaction on this inode */</div><div class='add'>+        goto refresh;</div><div class='add'>+    AFR_INTERSECT(local-&gt;readable, data, metadata, priv-&gt;child_count);</div><div class='add'>+</div><div class='add'>+    gf_msg_debug(this-&gt;name, 0,</div><div class='add'>+                 "%s: generation now vs cached: %d, "</div><div class='add'>+                 "%d",</div><div class='add'>+                 uuid_utoa(inode-&gt;gfid), local-&gt;event_generation,</div><div class='add'>+                 event_generation);</div><div class='add'>+    if (afr_is_inode_refresh_reqd(inode, this, local-&gt;event_generation,</div><div class='add'>+                                  event_generation))</div><div class='add'>+        /* servers have disconnected / reconnected, and possibly</div><div class='add'>+           rebooted, very likely changing the state of freshness</div><div class='add'>+           of copies */</div><div class='add'>+        goto refresh;</div><div class='add'>+</div><div class='add'>+    read_subvol = afr_read_subvol_select_by_policy(inode, this, local-&gt;readable,</div><div class='add'>+                                                   NULL);</div><div class='add'>+</div><div class='add'>+    if (read_subvol &lt; 0 || read_subvol &gt; priv-&gt;child_count) {</div><div class='add'>+        gf_msg_debug(this-&gt;name, 0,</div><div class='add'>+                     "Unreadable subvolume %d found "</div><div class='add'>+                     "with event generation %d for gfid %s.",</div><div class='add'>+                     read_subvol, event_generation, uuid_utoa(inode-&gt;gfid));</div><div class='add'>+        goto refresh;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (!local-&gt;child_up[read_subvol]) {</div><div class='add'>+        /* should never happen, just in case */</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_WARNING, 0, AFR_MSG_READ_SUBVOL_ERROR,</div><div class='add'>+               "subvolume %d is the "</div><div class='add'>+               "read subvolume in this generation, but is not up",</div><div class='add'>+               read_subvol);</div><div class='add'>+        goto refresh;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    local-&gt;read_attempted[read_subvol] = 1;</div><div class='add'>+</div><div class='add'>+read:</div><div class='add'>+    afr_read_txn_wind(frame, this, read_subvol);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+</div><div class='add'>+refresh:</div><div class='add'>+    afr_inode_refresh(frame, this, inode, NULL, afr_read_txn_refresh_done);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='head'>diff --git a/xlators/cluster/afr/src/afr-self-heal-algorithm.c b/xlators/cluster/afr/src/afr-self-heal-algorithm.c<br/>deleted file mode 100644<br/>index 51f5fd3df5b..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/xlators/cluster/afr/src/afr-self-heal-algorithm.c?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/cluster/afr/src/afr-self-heal-algorithm.c</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,1079 +0,0 @@</div><div class='del'>-/*</div><div class='del'>-   Copyright (c) 2009 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='del'>-   This file is part of GlusterFS.</div><div class='del'>-</div><div class='del'>-   GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-   it under the terms of the GNU General Public License as published</div><div class='del'>-   by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-   or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-   GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-   WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-   General Public License for more details.</div><div class='del'>-</div><div class='del'>-   You should have received a copy of the GNU General Public License</div><div class='del'>-   along with this program.  If not, see</div><div class='del'>-   &lt;http://www.gnu.org/licenses/&gt;.</div><div class='del'>-*/</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-#include "glusterfs.h"</div><div class='del'>-#include "afr.h"</div><div class='del'>-#include "xlator.h"</div><div class='del'>-#include "dict.h"</div><div class='del'>-#include "xlator.h"</div><div class='del'>-#include "hashfn.h"</div><div class='del'>-#include "logging.h"</div><div class='del'>-#include "stack.h"</div><div class='del'>-#include "list.h"</div><div class='del'>-#include "call-stub.h"</div><div class='del'>-#include "defaults.h"</div><div class='del'>-#include "common-utils.h"</div><div class='del'>-#include "compat-errno.h"</div><div class='del'>-#include "compat.h"</div><div class='del'>-#include "byte-order.h"</div><div class='del'>-#include "md5.h"</div><div class='del'>-</div><div class='del'>-#include "afr-transaction.h"</div><div class='del'>-#include "afr-self-heal.h"</div><div class='del'>-#include "afr-self-heal-common.h"</div><div class='del'>-#include "afr-self-heal-algorithm.h"</div><div class='del'>-</div><div class='del'>-/*</div><div class='del'>-  This file contains the various self-heal algorithms</div><div class='del'>-*/</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-/*</div><div class='del'>-  The "full" algorithm. Copies the entire file from</div><div class='del'>-  source to sinks.</div><div class='del'>-*/</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-static void</div><div class='del'>-sh_full_private_cleanup (call_frame_t *frame, xlator_t *this)</div><div class='del'>-{</div><div class='del'>-        afr_private_t *             priv    = NULL;</div><div class='del'>-        afr_local_t *               local   = NULL;</div><div class='del'>-        afr_self_heal_t *           sh      = NULL;</div><div class='del'>-        afr_sh_algo_full_private_t *sh_priv = NULL;</div><div class='del'>-</div><div class='del'>-        priv  = this-&gt;private;</div><div class='del'>-        local = frame-&gt;local;</div><div class='del'>-        sh    = &amp;local-&gt;self_heal;</div><div class='del'>-</div><div class='del'>-        sh_priv = sh-&gt;private;</div><div class='del'>-</div><div class='del'>-        if (sh_priv)</div><div class='del'>-                GF_FREE (sh_priv);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-static int</div><div class='del'>-sh_full_loop_driver (call_frame_t *frame, xlator_t *this);</div><div class='del'>-</div><div class='del'>-static int</div><div class='del'>-sh_full_loop_return (call_frame_t *rw_frame, xlator_t *this, off_t offset)</div><div class='del'>-{</div><div class='del'>-        afr_private_t *             priv       = NULL;</div><div class='del'>-        afr_local_t *               rw_local   = NULL;</div><div class='del'>-        afr_self_heal_t *           rw_sh      = NULL;</div><div class='del'>-</div><div class='del'>-        call_frame_t *sh_frame              = NULL;</div><div class='del'>-	afr_local_t * sh_local              = NULL;</div><div class='del'>-	afr_self_heal_t *sh                 = NULL;</div><div class='del'>-        afr_sh_algo_full_private_t *sh_priv = NULL;</div><div class='del'>-</div><div class='del'>-        priv  = this-&gt;private;</div><div class='del'>-</div><div class='del'>-        rw_local = rw_frame-&gt;local;</div><div class='del'>-        rw_sh    = &amp;rw_local-&gt;self_heal;</div><div class='del'>-</div><div class='del'>-        sh_frame = rw_sh-&gt;sh_frame;</div><div class='del'>-        sh_local = sh_frame-&gt;local;</div><div class='del'>-        sh       = &amp;sh_local-&gt;self_heal;</div><div class='del'>-        sh_priv  = sh-&gt;private;</div><div class='del'>-</div><div class='del'>-        LOCK (&amp;sh_priv-&gt;lock);</div><div class='del'>-        {</div><div class='del'>-                sh_priv-&gt;loops_running--;</div><div class='del'>-        }</div><div class='del'>-        UNLOCK (&amp;sh_priv-&gt;lock);</div><div class='del'>-</div><div class='del'>-        gf_log (this-&gt;name, GF_LOG_TRACE,</div><div class='del'>-                "loop for offset %"PRId64" returned", offset);</div><div class='del'>-</div><div class='del'>-        AFR_STACK_DESTROY (rw_frame);</div><div class='del'>-</div><div class='del'>-        sh_full_loop_driver (sh_frame, this);</div><div class='del'>-</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-static int</div><div class='del'>-sh_full_write_cbk (call_frame_t *rw_frame, void *cookie, xlator_t *this,</div><div class='del'>-                   int32_t op_ret, int32_t op_errno, struct iatt *prebuf,</div><div class='del'>-                   struct iatt *postbuf)</div><div class='del'>-{</div><div class='del'>-	afr_private_t * priv    = NULL;</div><div class='del'>-	afr_local_t * rw_local  = NULL;</div><div class='del'>-	afr_self_heal_t *rw_sh  = NULL;</div><div class='del'>-</div><div class='del'>-        call_frame_t *sh_frame  = NULL;</div><div class='del'>-	afr_local_t * sh_local  = NULL;</div><div class='del'>-	afr_self_heal_t *sh     = NULL;</div><div class='del'>-</div><div class='del'>-	int child_index = (long) cookie;</div><div class='del'>-	int call_count = 0;</div><div class='del'>-</div><div class='del'>-	priv = this-&gt;private;</div><div class='del'>-</div><div class='del'>-	rw_local = rw_frame-&gt;local;</div><div class='del'>-	rw_sh    = &amp;rw_local-&gt;self_heal;</div><div class='del'>-</div><div class='del'>-        sh_frame = rw_sh-&gt;sh_frame;</div><div class='del'>-        sh_local = sh_frame-&gt;local;</div><div class='del'>-        sh       = &amp;sh_local-&gt;self_heal;</div><div class='del'>-</div><div class='del'>-	gf_log (this-&gt;name, GF_LOG_TRACE,</div><div class='del'>-		"wrote %d bytes of data from %s to child %d, offset %"PRId64"",</div><div class='del'>-		op_ret, sh_local-&gt;loc.path, child_index,</div><div class='del'>-                rw_sh-&gt;offset - op_ret);</div><div class='del'>-</div><div class='del'>-	LOCK (&amp;sh_frame-&gt;lock);</div><div class='del'>-	{</div><div class='del'>-		if (op_ret == -1) {</div><div class='del'>-			gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-				"write to %s failed on subvolume %s (%s)",</div><div class='del'>-				sh_local-&gt;loc.path,</div><div class='del'>-				priv-&gt;children[child_index]-&gt;name,</div><div class='del'>-				strerror (op_errno));</div><div class='del'>-</div><div class='del'>-			sh-&gt;op_failed = 1;</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='del'>-	UNLOCK (&amp;sh_frame-&gt;lock);</div><div class='del'>-</div><div class='del'>-	call_count = afr_frame_return (rw_frame);</div><div class='del'>-</div><div class='del'>-	if (call_count == 0) {</div><div class='del'>-		sh_full_loop_return (rw_frame, this, rw_sh-&gt;offset - op_ret);</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-static int</div><div class='del'>-sh_full_read_cbk (call_frame_t *rw_frame, void *cookie,</div><div class='del'>-                  xlator_t *this, int32_t op_ret, int32_t op_errno,</div><div class='del'>-                  struct iovec *vector, int32_t count, struct iatt *buf,</div><div class='del'>-                  struct iobref *iobref)</div><div class='del'>-{</div><div class='del'>-	afr_private_t * priv    = NULL;</div><div class='del'>-	afr_local_t * rw_local  = NULL;</div><div class='del'>-	afr_self_heal_t *rw_sh  = NULL;</div><div class='del'>-</div><div class='del'>-        call_frame_t *sh_frame  = NULL;</div><div class='del'>-	afr_local_t * sh_local  = NULL;</div><div class='del'>-	afr_self_heal_t *sh     = NULL;</div><div class='del'>-</div><div class='del'>-	int i = 0;</div><div class='del'>-	int call_count = 0;</div><div class='del'>-</div><div class='del'>-	off_t offset = (long) cookie;</div><div class='del'>-</div><div class='del'>-	priv = this-&gt;private;</div><div class='del'>-	rw_local = rw_frame-&gt;local;</div><div class='del'>-	rw_sh    = &amp;rw_local-&gt;self_heal;</div><div class='del'>-</div><div class='del'>-        sh_frame = rw_sh-&gt;sh_frame;</div><div class='del'>-        sh_local = sh_frame-&gt;local;</div><div class='del'>-        sh       = &amp;sh_local-&gt;self_heal;</div><div class='del'>-</div><div class='del'>-	call_count = sh-&gt;active_sinks;</div><div class='del'>-</div><div class='del'>-        rw_local-&gt;call_count = call_count;</div><div class='del'>-</div><div class='del'>-	gf_log (this-&gt;name, GF_LOG_TRACE,</div><div class='del'>-		"read %d bytes of data from %s, offset %"PRId64"",</div><div class='del'>-		op_ret, sh_local-&gt;loc.path, offset);</div><div class='del'>-</div><div class='del'>-	if (op_ret &lt;= 0) {</div><div class='del'>-                sh-&gt;op_failed = 1;</div><div class='del'>-</div><div class='del'>-                sh_full_loop_return (rw_frame, this, offset);</div><div class='del'>-		return 0;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	rw_sh-&gt;offset += op_ret;</div><div class='del'>-</div><div class='del'>-	if (sh-&gt;file_has_holes) {</div><div class='del'>-		if (iov_0filled (vector, count) == 0) {</div><div class='del'>-			/* the iter function depends on the</div><div class='del'>-			   sh-&gt;offset already being updated</div><div class='del'>-			   above</div><div class='del'>-			*/</div><div class='del'>-</div><div class='del'>-                        sh_full_loop_return (rw_frame, this, offset);</div><div class='del'>-			goto out;</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='del'>-		if (sh-&gt;sources[i] || !sh_local-&gt;child_up[i])</div><div class='del'>-			continue;</div><div class='del'>-</div><div class='del'>-		/* this is a sink, so write to it */</div><div class='del'>-</div><div class='del'>-		STACK_WIND_COOKIE (rw_frame, sh_full_write_cbk,</div><div class='del'>-				   (void *) (long) i,</div><div class='del'>-				   priv-&gt;children[i],</div><div class='del'>-				   priv-&gt;children[i]-&gt;fops-&gt;writev,</div><div class='del'>-				   sh-&gt;healing_fd, vector, count, offset,</div><div class='del'>-                                   iobref);</div><div class='del'>-</div><div class='del'>-		if (!--call_count)</div><div class='del'>-			break;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-static int</div><div class='del'>-sh_full_read_write (call_frame_t *frame, xlator_t *this, off_t offset)</div><div class='del'>-{</div><div class='del'>-	afr_private_t * priv    = NULL;</div><div class='del'>-	afr_local_t * local     = NULL;</div><div class='del'>-	afr_local_t * rw_local  = NULL;</div><div class='del'>-	afr_self_heal_t *rw_sh  = NULL;</div><div class='del'>-	afr_self_heal_t *sh     = NULL;</div><div class='del'>-</div><div class='del'>-        call_frame_t *rw_frame = NULL;</div><div class='del'>-</div><div class='del'>-        int32_t op_errno = 0;</div><div class='del'>-</div><div class='del'>-	priv  = this-&gt;private;</div><div class='del'>-        local = frame-&gt;local;</div><div class='del'>-        sh    = &amp;local-&gt;self_heal;</div><div class='del'>-</div><div class='del'>-        rw_frame = copy_frame (frame);</div><div class='del'>-        if (!rw_frame)</div><div class='del'>-                goto out;</div><div class='del'>-</div><div class='del'>-        ALLOC_OR_GOTO (rw_local, afr_local_t, out);</div><div class='del'>-</div><div class='del'>-        rw_frame-&gt;local = rw_local;</div><div class='del'>-	rw_sh           = &amp;rw_local-&gt;self_heal;</div><div class='del'>-</div><div class='del'>-        rw_sh-&gt;offset       = sh-&gt;offset;</div><div class='del'>-        rw_sh-&gt;sh_frame     = frame;</div><div class='del'>-</div><div class='del'>-	STACK_WIND_COOKIE (rw_frame, sh_full_read_cbk,</div><div class='del'>-			   (void *) (long) offset,</div><div class='del'>-			   priv-&gt;children[sh-&gt;source],</div><div class='del'>-			   priv-&gt;children[sh-&gt;source]-&gt;fops-&gt;readv,</div><div class='del'>-			   sh-&gt;healing_fd, sh-&gt;block_size,</div><div class='del'>-			   offset);</div><div class='del'>-        return 0;</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        sh-&gt;op_failed = 1;</div><div class='del'>-</div><div class='del'>-        sh_full_loop_driver (frame, this);</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-static int</div><div class='del'>-sh_full_loop_driver (call_frame_t *frame, xlator_t *this)</div><div class='del'>-{</div><div class='del'>-	afr_private_t * priv = NULL;</div><div class='del'>-	afr_local_t * local  = NULL;</div><div class='del'>-	afr_self_heal_t *sh  = NULL;</div><div class='del'>-        afr_sh_algo_full_private_t *sh_priv = NULL;</div><div class='del'>-</div><div class='del'>-        int   loop    = 0;</div><div class='del'>-        int   recurse = 0;</div><div class='del'>-</div><div class='del'>-        off_t offset  = 0;</div><div class='del'>-</div><div class='del'>-	priv    = this-&gt;private;</div><div class='del'>-	local   = frame-&gt;local;</div><div class='del'>-	sh      = &amp;local-&gt;self_heal;</div><div class='del'>-        sh_priv = sh-&gt;private;</div><div class='del'>-</div><div class='del'>-	if (sh-&gt;op_failed) {</div><div class='del'>-                if (sh_priv-&gt;loops_running == 0) {</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_TRACE,</div><div class='del'>-                                "full self-heal aborting on %s",</div><div class='del'>-                                local-&gt;loc.path);</div><div class='del'>-</div><div class='del'>-                        sh_full_private_cleanup (frame, this);</div><div class='del'>-                        local-&gt;self_heal.algo_abort_cbk (frame, this);</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-		goto out;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	if (sh_priv-&gt;offset &gt;= sh-&gt;file_size) {</div><div class='del'>-                if (sh_priv-&gt;loops_running == 0) {</div><div class='del'>-</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_TRACE,</div><div class='del'>-                                "full self-heal completed on %s",</div><div class='del'>-                                local-&gt;loc.path);</div><div class='del'>-</div><div class='del'>-                        sh_full_private_cleanup (frame, this);</div><div class='del'>-                        local-&gt;self_heal.algo_completion_cbk (frame, this);</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-		goto out;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-spawn:</div><div class='del'>-        loop    = 0;</div><div class='del'>-        recurse = 0;</div><div class='del'>-</div><div class='del'>-        LOCK (&amp;sh_priv-&gt;lock);</div><div class='del'>-        {</div><div class='del'>-                if ((sh_priv-&gt;loops_running &lt; priv-&gt;data_self_heal_window_size)</div><div class='del'>-                    &amp;&amp; (sh_priv-&gt;offset &lt; sh-&gt;file_size)) {</div><div class='del'>-</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_TRACE,</div><div class='del'>-                                "spawning a loop for offset %"PRId64,</div><div class='del'>-                                sh_priv-&gt;offset);</div><div class='del'>-</div><div class='del'>-                        offset           = sh_priv-&gt;offset;</div><div class='del'>-                        sh_priv-&gt;offset += sh-&gt;block_size;</div><div class='del'>-</div><div class='del'>-                        sh_priv-&gt;loops_running++;</div><div class='del'>-</div><div class='del'>-                        loop = 1;</div><div class='del'>-</div><div class='del'>-                        if (sh_priv-&gt;offset &lt; sh-&gt;file_size)</div><div class='del'>-                                recurse = 1;</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='del'>-        UNLOCK (&amp;sh_priv-&gt;lock);</div><div class='del'>-</div><div class='del'>-        if (loop) {</div><div class='del'>-                sh_full_read_write (frame, this, offset);</div><div class='del'>-                if (recurse)</div><div class='del'>-                        goto spawn;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-afr_sh_algo_full (call_frame_t *frame, xlator_t *this)</div><div class='del'>-{</div><div class='del'>-        afr_private_t *             priv    = NULL;</div><div class='del'>-        afr_local_t *               local   = NULL;</div><div class='del'>-        afr_self_heal_t *           sh      = NULL;</div><div class='del'>-        afr_sh_algo_full_private_t *sh_priv = NULL;</div><div class='del'>-</div><div class='del'>-        priv  = this-&gt;private;</div><div class='del'>-        local = frame-&gt;local;</div><div class='del'>-        sh    = &amp;local-&gt;self_heal;</div><div class='del'>-</div><div class='del'>-        sh_priv = GF_CALLOC (1, sizeof (*sh_priv),</div><div class='del'>-                             gf_afr_mt_afr_private_t);</div><div class='del'>-</div><div class='del'>-        LOCK_INIT (&amp;sh_priv-&gt;lock);</div><div class='del'>-</div><div class='del'>-        sh-&gt;private = sh_priv;</div><div class='del'>-</div><div class='del'>-        local-&gt;call_count = 0;</div><div class='del'>-</div><div class='del'>-        sh_full_loop_driver (frame, this);</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-/*</div><div class='del'>- * The "diff" algorithm. Copies only those blocks whose checksums</div><div class='del'>- * don't match with those of source.</div><div class='del'>- */</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-static void</div><div class='del'>-sh_diff_private_cleanup (call_frame_t *frame, xlator_t *this)</div><div class='del'>-{</div><div class='del'>-        afr_private_t *             priv    = NULL;</div><div class='del'>-        afr_local_t *               local   = NULL;</div><div class='del'>-        afr_self_heal_t *           sh      = NULL;</div><div class='del'>-        afr_sh_algo_diff_private_t *sh_priv = NULL;</div><div class='del'>-</div><div class='del'>-        int i;</div><div class='del'>-</div><div class='del'>-        priv  = this-&gt;private;</div><div class='del'>-        local = frame-&gt;local;</div><div class='del'>-        sh    = &amp;local-&gt;self_heal;</div><div class='del'>-</div><div class='del'>-        sh_priv = sh-&gt;private;</div><div class='del'>-</div><div class='del'>-        for (i = 0; i &lt; priv-&gt;data_self_heal_window_size; i++) {</div><div class='del'>-                if (sh_priv-&gt;loops[i]) {</div><div class='del'>-                        if (sh_priv-&gt;loops[i]-&gt;write_needed)</div><div class='del'>-                                GF_FREE (sh_priv-&gt;loops[i]-&gt;write_needed);</div><div class='del'>-</div><div class='del'>-                        if (sh_priv-&gt;loops[i]-&gt;checksum)</div><div class='del'>-                                GF_FREE (sh_priv-&gt;loops[i]-&gt;checksum);</div><div class='del'>-</div><div class='del'>-                        GF_FREE (sh_priv-&gt;loops[i]);</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (sh_priv) {</div><div class='del'>-                if (sh_priv-&gt;loops)</div><div class='del'>-                        GF_FREE (sh_priv-&gt;loops);</div><div class='del'>-</div><div class='del'>-                GF_FREE (sh_priv);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-static uint32_t</div><div class='del'>-__make_cookie (int loop_index, int child_index)</div><div class='del'>-{</div><div class='del'>-        uint32_t ret = (loop_index &lt;&lt; 16) | child_index;</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-static int</div><div class='del'>-__loop_index (uint32_t cookie)</div><div class='del'>-{</div><div class='del'>-        return (cookie &amp; 0xFFFF0000) &gt;&gt; 16;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-static int</div><div class='del'>-__child_index (uint32_t cookie)</div><div class='del'>-{</div><div class='del'>-        return (cookie &amp; 0x0000FFFF);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-static void</div><div class='del'>-sh_diff_loop_state_reset (struct sh_diff_loop_state *loop_state, int child_count)</div><div class='del'>-{</div><div class='del'>-        loop_state-&gt;active = _gf_false;</div><div class='del'>-//        loop_state-&gt;offset = 0;</div><div class='del'>-</div><div class='del'>-        memset (loop_state-&gt;write_needed,</div><div class='del'>-                0, sizeof (*loop_state-&gt;write_needed) * child_count);</div><div class='del'>-</div><div class='del'>-        memset (loop_state-&gt;checksum,</div><div class='del'>-                0, MD5_DIGEST_LEN * child_count);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-static int</div><div class='del'>-sh_diff_number_of_writes_needed (unsigned char *write_needed, int child_count)</div><div class='del'>-{</div><div class='del'>-        int writes = 0;</div><div class='del'>-        int i;</div><div class='del'>-</div><div class='del'>-        for (i = 0; i &lt; child_count; i++) {</div><div class='del'>-                if (write_needed[i])</div><div class='del'>-                        writes++;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        return writes;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-static int</div><div class='del'>-sh_diff_loop_driver (call_frame_t *frame, xlator_t *this);</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-static int</div><div class='del'>-sh_diff_loop_return (call_frame_t *rw_frame, xlator_t *this,</div><div class='del'>-                     struct sh_diff_loop_state *loop_state)</div><div class='del'>-{</div><div class='del'>-        afr_private_t *             priv       = NULL;</div><div class='del'>-        afr_local_t *               rw_local   = NULL;</div><div class='del'>-        afr_self_heal_t *           rw_sh      = NULL;</div><div class='del'>-</div><div class='del'>-        call_frame_t *sh_frame              = NULL;</div><div class='del'>-	afr_local_t * sh_local              = NULL;</div><div class='del'>-	afr_self_heal_t *sh                 = NULL;</div><div class='del'>-        afr_sh_algo_diff_private_t *sh_priv = NULL;</div><div class='del'>-</div><div class='del'>-        priv  = this-&gt;private;</div><div class='del'>-</div><div class='del'>-        rw_local = rw_frame-&gt;local;</div><div class='del'>-        rw_sh    = &amp;rw_local-&gt;self_heal;</div><div class='del'>-</div><div class='del'>-        sh_frame = rw_sh-&gt;sh_frame;</div><div class='del'>-        sh_local = sh_frame-&gt;local;</div><div class='del'>-        sh       = &amp;sh_local-&gt;self_heal;</div><div class='del'>-        sh_priv  = sh-&gt;private;</div><div class='del'>-</div><div class='del'>-        gf_log (this-&gt;name, GF_LOG_TRACE,</div><div class='del'>-                "loop for offset %"PRId64" returned", loop_state-&gt;offset);</div><div class='del'>-</div><div class='del'>-        LOCK (&amp;sh_priv-&gt;lock);</div><div class='del'>-        {</div><div class='del'>-                sh_priv-&gt;loops_running--;</div><div class='del'>-                sh_diff_loop_state_reset (loop_state, priv-&gt;child_count);</div><div class='del'>-        }</div><div class='del'>-        UNLOCK (&amp;sh_priv-&gt;lock);</div><div class='del'>-</div><div class='del'>-        AFR_STACK_DESTROY (rw_frame);</div><div class='del'>-</div><div class='del'>-        sh_diff_loop_driver (sh_frame, this);</div><div class='del'>-</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-static int</div><div class='del'>-sh_diff_write_cbk (call_frame_t *rw_frame, void *cookie, xlator_t *this,</div><div class='del'>-                   int32_t op_ret, int32_t op_errno, struct iatt *buf,</div><div class='del'>-                   struct iatt *postbuf)</div><div class='del'>-{</div><div class='del'>-	afr_private_t *   priv     = NULL;</div><div class='del'>-	afr_local_t *     rw_local = NULL;</div><div class='del'>-	afr_self_heal_t * rw_sh    = NULL;</div><div class='del'>-</div><div class='del'>-        call_frame_t *sh_frame  = NULL;</div><div class='del'>-	afr_local_t * sh_local  = NULL;</div><div class='del'>-	afr_self_heal_t *sh     = NULL;</div><div class='del'>-</div><div class='del'>-        afr_sh_algo_diff_private_t *sh_priv;</div><div class='del'>-        struct sh_diff_loop_state *loop_state;</div><div class='del'>-</div><div class='del'>-	int call_count  = 0;</div><div class='del'>-        int child_index = 0;</div><div class='del'>-        int loop_index  = 0;</div><div class='del'>-</div><div class='del'>-	priv     = this-&gt;private;</div><div class='del'>-	rw_local = rw_frame-&gt;local;</div><div class='del'>-	rw_sh    = &amp;rw_local-&gt;self_heal;</div><div class='del'>-</div><div class='del'>-        sh_frame = rw_sh-&gt;sh_frame;</div><div class='del'>-        sh_local = sh_frame-&gt;local;</div><div class='del'>-        sh       = &amp;sh_local-&gt;self_heal;</div><div class='del'>-        sh_priv  = sh-&gt;private;</div><div class='del'>-</div><div class='del'>-        child_index = __child_index ((uint32_t) (long) cookie);</div><div class='del'>-        loop_index  = __loop_index ((uint32_t) (long) cookie);</div><div class='del'>-        loop_state  = sh_priv-&gt;loops[loop_index];</div><div class='del'>-</div><div class='del'>-	gf_log (this-&gt;name, GF_LOG_TRACE,</div><div class='del'>-		"wrote %d bytes of data from %s to child %d, offset %"PRId64"",</div><div class='del'>-		op_ret, sh_local-&gt;loc.path, child_index,</div><div class='del'>-                loop_state-&gt;offset);</div><div class='del'>-</div><div class='del'>-	LOCK (&amp;sh_frame-&gt;lock);</div><div class='del'>-	{</div><div class='del'>-		if (op_ret == -1) {</div><div class='del'>-			gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-				"write to %s failed on subvolume %s (%s)",</div><div class='del'>-				sh_local-&gt;loc.path,</div><div class='del'>-				priv-&gt;children[child_index]-&gt;name,</div><div class='del'>-				strerror (op_errno));</div><div class='del'>-</div><div class='del'>-			sh-&gt;op_failed = 1;</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='del'>-	UNLOCK (&amp;sh_frame-&gt;lock);</div><div class='del'>-</div><div class='del'>-	call_count = afr_frame_return (rw_frame);</div><div class='del'>-</div><div class='del'>-	if (call_count == 0) {</div><div class='del'>-		sh_diff_loop_return (rw_frame, this, loop_state);</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-static int</div><div class='del'>-sh_diff_read_cbk (call_frame_t *rw_frame, void *cookie,</div><div class='del'>-                  xlator_t *this, int32_t op_ret, int32_t op_errno,</div><div class='del'>-                  struct iovec *vector, int32_t count, struct iatt *buf,</div><div class='del'>-                  struct iobref *iobref)</div><div class='del'>-{</div><div class='del'>-	afr_private_t *   priv     = NULL;</div><div class='del'>-	afr_local_t *     rw_local = NULL;</div><div class='del'>-	afr_self_heal_t * rw_sh    = NULL;</div><div class='del'>-</div><div class='del'>-        afr_sh_algo_diff_private_t * sh_priv = NULL;</div><div class='del'>-</div><div class='del'>-        call_frame_t *sh_frame  = NULL;</div><div class='del'>-	afr_local_t * sh_local  = NULL;</div><div class='del'>-	afr_self_heal_t *sh     = NULL;</div><div class='del'>-</div><div class='del'>-        int loop_index;</div><div class='del'>-        struct sh_diff_loop_state *loop_state;</div><div class='del'>-</div><div class='del'>-        uint32_t wcookie;</div><div class='del'>-</div><div class='del'>-	int i = 0;</div><div class='del'>-	int call_count = 0;</div><div class='del'>-</div><div class='del'>-	priv     = this-&gt;private;</div><div class='del'>-	rw_local = rw_frame-&gt;local;</div><div class='del'>-	rw_sh    = &amp;rw_local-&gt;self_heal;</div><div class='del'>-</div><div class='del'>-        sh_frame = rw_sh-&gt;sh_frame;</div><div class='del'>-        sh_local = sh_frame-&gt;local;</div><div class='del'>-        sh       = &amp;sh_local-&gt;self_heal;</div><div class='del'>-        sh_priv  = sh-&gt;private;</div><div class='del'>-</div><div class='del'>-        loop_index = __loop_index ((uint32_t) (long) cookie);</div><div class='del'>-        loop_state = sh_priv-&gt;loops[loop_index];</div><div class='del'>-</div><div class='del'>-	call_count = sh_diff_number_of_writes_needed (loop_state-&gt;write_needed,</div><div class='del'>-                                                      priv-&gt;child_count);</div><div class='del'>-</div><div class='del'>-	rw_local-&gt;call_count = call_count;</div><div class='del'>-</div><div class='del'>-	gf_log (this-&gt;name, GF_LOG_TRACE,</div><div class='del'>-		"read %d bytes of data from %s, offset %"PRId64"",</div><div class='del'>-		op_ret, sh_local-&gt;loc.path, sh-&gt;offset);</div><div class='del'>-</div><div class='del'>-	if ((op_ret &lt;= 0) ||</div><div class='del'>-            (call_count == 0)) {</div><div class='del'>-                sh_diff_loop_return (rw_frame, this, loop_state);</div><div class='del'>-</div><div class='del'>-		return 0;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	if (sh-&gt;file_has_holes) {</div><div class='del'>-		if (iov_0filled (vector, count) == 0) {</div><div class='del'>-</div><div class='del'>-                        sh_diff_loop_return (rw_frame, this, loop_state);</div><div class='del'>-			goto out;</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='del'>-                if (loop_state-&gt;write_needed[i]) {</div><div class='del'>-                        wcookie = __make_cookie (loop_index, i);</div><div class='del'>-</div><div class='del'>-                        STACK_WIND_COOKIE (rw_frame, sh_diff_write_cbk,</div><div class='del'>-                                           (void *) (long) wcookie,</div><div class='del'>-                                           priv-&gt;children[i],</div><div class='del'>-                                           priv-&gt;children[i]-&gt;fops-&gt;writev,</div><div class='del'>-                                           sh-&gt;healing_fd, vector, count,</div><div class='del'>-                                           loop_state-&gt;offset, iobref);</div><div class='del'>-</div><div class='del'>-                        if (!--call_count)</div><div class='del'>-                                break;</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-static int</div><div class='del'>-sh_diff_read (call_frame_t *rw_frame, xlator_t *this,</div><div class='del'>-              int loop_index)</div><div class='del'>-{</div><div class='del'>-	afr_private_t *   priv     = NULL;</div><div class='del'>-	afr_local_t *     rw_local = NULL;</div><div class='del'>-	afr_self_heal_t * rw_sh    = NULL;</div><div class='del'>-</div><div class='del'>-        afr_sh_algo_diff_private_t * sh_priv = NULL;</div><div class='del'>-        struct sh_diff_loop_state *loop_state;</div><div class='del'>-</div><div class='del'>-        call_frame_t *sh_frame  = NULL;</div><div class='del'>-	afr_local_t * sh_local  = NULL;</div><div class='del'>-	afr_self_heal_t *sh     = NULL;</div><div class='del'>-</div><div class='del'>-        uint32_t cookie;</div><div class='del'>-</div><div class='del'>-	priv     = this-&gt;private;</div><div class='del'>-	rw_local = rw_frame-&gt;local;</div><div class='del'>-	rw_sh    = &amp;rw_local-&gt;self_heal;</div><div class='del'>-</div><div class='del'>-        sh_frame = rw_sh-&gt;sh_frame;</div><div class='del'>-        sh_local = sh_frame-&gt;local;</div><div class='del'>-        sh       = &amp;sh_local-&gt;self_heal;</div><div class='del'>-        sh_priv  = sh-&gt;private;</div><div class='del'>-</div><div class='del'>-        loop_state = sh_priv-&gt;loops[loop_index];</div><div class='del'>-</div><div class='del'>-        cookie = __make_cookie (loop_index, sh-&gt;source);</div><div class='del'>-</div><div class='del'>-	STACK_WIND_COOKIE (rw_frame, sh_diff_read_cbk,</div><div class='del'>-			   (void *) (long) cookie,</div><div class='del'>-			   priv-&gt;children[sh-&gt;source],</div><div class='del'>-			   priv-&gt;children[sh-&gt;source]-&gt;fops-&gt;readv,</div><div class='del'>-			   sh-&gt;healing_fd, sh_priv-&gt;block_size,</div><div class='del'>-			   loop_state-&gt;offset);</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-static int</div><div class='del'>-sh_diff_checksum_cbk (call_frame_t *rw_frame, void *cookie, xlator_t *this,</div><div class='del'>-                      int32_t op_ret, int32_t op_errno,</div><div class='del'>-                      uint32_t weak_checksum, uint8_t *strong_checksum)</div><div class='del'>-{</div><div class='del'>-	afr_private_t * priv    = NULL;</div><div class='del'>-	afr_local_t * rw_local  = NULL;</div><div class='del'>-	afr_self_heal_t *rw_sh  = NULL;</div><div class='del'>-</div><div class='del'>-        call_frame_t *sh_frame  = NULL;</div><div class='del'>-	afr_local_t * sh_local  = NULL;</div><div class='del'>-	afr_self_heal_t *sh     = NULL;</div><div class='del'>-</div><div class='del'>-        afr_sh_algo_diff_private_t * sh_priv = NULL;</div><div class='del'>-</div><div class='del'>-        int loop_index = 0;</div><div class='del'>-        int child_index = 0;</div><div class='del'>-        struct sh_diff_loop_state *loop_state;</div><div class='del'>-</div><div class='del'>-        int call_count   = 0;</div><div class='del'>-        int i            = 0;</div><div class='del'>-        int write_needed = 0;</div><div class='del'>-</div><div class='del'>-	priv  = this-&gt;private;</div><div class='del'>-</div><div class='del'>-	rw_local = rw_frame-&gt;local;</div><div class='del'>-	rw_sh    = &amp;rw_local-&gt;self_heal;</div><div class='del'>-</div><div class='del'>-        sh_frame = rw_sh-&gt;sh_frame;</div><div class='del'>-        sh_local = sh_frame-&gt;local;</div><div class='del'>-        sh       = &amp;sh_local-&gt;self_heal;</div><div class='del'>-</div><div class='del'>-        sh_priv = sh-&gt;private;</div><div class='del'>-</div><div class='del'>-        child_index = __child_index ((uint32_t) (long) cookie);</div><div class='del'>-        loop_index  = __loop_index ((uint32_t) (long) cookie);</div><div class='del'>-</div><div class='del'>-        loop_state  = sh_priv-&gt;loops[loop_index];</div><div class='del'>-</div><div class='del'>-        if (op_ret &lt; 0) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-                        "checksum on %s failed on subvolume %s (%s)",</div><div class='del'>-                        sh_local-&gt;loc.path, priv-&gt;children[child_index]-&gt;name,</div><div class='del'>-                        strerror (op_errno));</div><div class='del'>-</div><div class='del'>-                sh-&gt;op_failed = 1;</div><div class='del'>-        } else {</div><div class='del'>-                memcpy (loop_state-&gt;checksum + child_index * MD5_DIGEST_LEN,</div><div class='del'>-                        strong_checksum,</div><div class='del'>-                        MD5_DIGEST_LEN);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        call_count = afr_frame_return (rw_frame);</div><div class='del'>-</div><div class='del'>-        if (call_count == 0) {</div><div class='del'>-                for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='del'>-                        if (sh-&gt;sources[i] || !sh_local-&gt;child_up[i])</div><div class='del'>-                                continue;</div><div class='del'>-</div><div class='del'>-                        if (memcmp (loop_state-&gt;checksum + (i * MD5_DIGEST_LEN),</div><div class='del'>-                                    loop_state-&gt;checksum + (sh-&gt;source * MD5_DIGEST_LEN),</div><div class='del'>-                                    MD5_DIGEST_LEN)) {</div><div class='del'>-                                /*</div><div class='del'>-                                   Checksums differ, so this block</div><div class='del'>-                                   must be written to this sink</div><div class='del'>-                                */</div><div class='del'>-</div><div class='del'>-                                gf_log (this-&gt;name, GF_LOG_TRACE,</div><div class='del'>-                                        "checksum on subvolume %s at offset %"</div><div class='del'>-                                        PRId64" differs from that on source",</div><div class='del'>-                                        priv-&gt;children[i]-&gt;name, loop_state-&gt;offset);</div><div class='del'>-</div><div class='del'>-                                write_needed = loop_state-&gt;write_needed[i] = 1;</div><div class='del'>-                        }</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                LOCK (&amp;sh_priv-&gt;lock);</div><div class='del'>-                {</div><div class='del'>-                        sh_priv-&gt;total_blocks++;</div><div class='del'>-                        if (write_needed)</div><div class='del'>-                                sh_priv-&gt;diff_blocks++;</div><div class='del'>-                }</div><div class='del'>-                UNLOCK (&amp;sh_priv-&gt;lock);</div><div class='del'>-</div><div class='del'>-                if (write_needed &amp;&amp; !sh-&gt;op_failed) {</div><div class='del'>-                        sh_diff_read (rw_frame, this, loop_index);</div><div class='del'>-                } else {</div><div class='del'>-                        sh-&gt;offset += sh_priv-&gt;block_size;</div><div class='del'>-</div><div class='del'>-                        sh_diff_loop_return (rw_frame, this, loop_state);</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-static int</div><div class='del'>-sh_diff_find_unused_loop (afr_sh_algo_diff_private_t *sh_priv, int max)</div><div class='del'>-{</div><div class='del'>-        int i;</div><div class='del'>-</div><div class='del'>-        LOCK (&amp;sh_priv-&gt;lock);</div><div class='del'>-        {</div><div class='del'>-                for (i = 0; i &lt; max; i++) {</div><div class='del'>-                        if (sh_priv-&gt;loops[i]-&gt;active == _gf_false) {</div><div class='del'>-                                sh_priv-&gt;loops[i]-&gt;active = _gf_true;</div><div class='del'>-                                break;</div><div class='del'>-                        }</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='del'>-        UNLOCK (&amp;sh_priv-&gt;lock);</div><div class='del'>-</div><div class='del'>-        if (i == max) {</div><div class='del'>-                gf_log ("[sh-diff]", GF_LOG_ERROR,</div><div class='del'>-                        "no free loops found! This shouldn't happen. Please"</div><div class='del'>-                        " report this to gluster-devel@nongnu.org");</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        return i;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-static int</div><div class='del'>-sh_diff_checksum (call_frame_t *frame, xlator_t *this, off_t offset)</div><div class='del'>-{</div><div class='del'>-	afr_private_t *   priv     = NULL;</div><div class='del'>-	afr_local_t *     local    = NULL;</div><div class='del'>-	afr_local_t *     rw_local = NULL;</div><div class='del'>-	afr_self_heal_t * sh       = NULL;</div><div class='del'>-	afr_self_heal_t * rw_sh    = NULL;</div><div class='del'>-</div><div class='del'>-        afr_sh_algo_diff_private_t * sh_priv = NULL;</div><div class='del'>-</div><div class='del'>-        call_frame_t *rw_frame = NULL;</div><div class='del'>-</div><div class='del'>-        uint32_t cookie;</div><div class='del'>-        int loop_index = 0;</div><div class='del'>-        struct sh_diff_loop_state *loop_state = NULL;</div><div class='del'>-</div><div class='del'>-        int32_t op_errno = 0;</div><div class='del'>-</div><div class='del'>-        int call_count = 0;</div><div class='del'>-        int i          = 0;</div><div class='del'>-</div><div class='del'>-	priv    = this-&gt;private;</div><div class='del'>-	local   = frame-&gt;local;</div><div class='del'>-	sh      = &amp;local-&gt;self_heal;</div><div class='del'>-</div><div class='del'>-        sh_priv = sh-&gt;private;</div><div class='del'>-</div><div class='del'>-        rw_frame = copy_frame (frame);</div><div class='del'>-        if (!rw_frame)</div><div class='del'>-                goto out;</div><div class='del'>-</div><div class='del'>-        ALLOC_OR_GOTO (rw_local, afr_local_t, out);</div><div class='del'>-</div><div class='del'>-        rw_frame-&gt;local = rw_local;</div><div class='del'>-	rw_sh           = &amp;rw_local-&gt;self_heal;</div><div class='del'>-</div><div class='del'>-        rw_sh-&gt;offset       = sh-&gt;offset;</div><div class='del'>-        rw_sh-&gt;sh_frame     = frame;</div><div class='del'>-</div><div class='del'>-        call_count = sh-&gt;active_sinks + 1;  /* sinks and source */</div><div class='del'>-</div><div class='del'>-        rw_local-&gt;call_count = call_count;</div><div class='del'>-</div><div class='del'>-        loop_index = sh_diff_find_unused_loop (sh_priv, priv-&gt;data_self_heal_window_size);</div><div class='del'>-</div><div class='del'>-        loop_state = sh_priv-&gt;loops[loop_index];</div><div class='del'>-        loop_state-&gt;offset       = offset;</div><div class='del'>-</div><div class='del'>-        /* we need to send both the loop index and child index,</div><div class='del'>-           so squeeze them both into a 32-bit number */</div><div class='del'>-</div><div class='del'>-        cookie = __make_cookie (loop_index, sh-&gt;source);</div><div class='del'>-</div><div class='del'>-        STACK_WIND_COOKIE (rw_frame, sh_diff_checksum_cbk,</div><div class='del'>-                           (void *) (long) cookie,</div><div class='del'>-                           priv-&gt;children[sh-&gt;source],</div><div class='del'>-                           priv-&gt;children[sh-&gt;source]-&gt;fops-&gt;rchecksum,</div><div class='del'>-                           sh-&gt;healing_fd,</div><div class='del'>-                           offset, sh_priv-&gt;block_size);</div><div class='del'>-</div><div class='del'>-        for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='del'>-                if (sh-&gt;sources[i] || !local-&gt;child_up[i])</div><div class='del'>-                        continue;</div><div class='del'>-</div><div class='del'>-                cookie = __make_cookie (loop_index, i);</div><div class='del'>-</div><div class='del'>-                STACK_WIND_COOKIE (rw_frame, sh_diff_checksum_cbk,</div><div class='del'>-                                   (void *) (long) cookie,</div><div class='del'>-                                   priv-&gt;children[i],</div><div class='del'>-                                   priv-&gt;children[i]-&gt;fops-&gt;rchecksum,</div><div class='del'>-                                   sh-&gt;healing_fd,</div><div class='del'>-                                   offset, sh_priv-&gt;block_size);</div><div class='del'>-</div><div class='del'>-                if (!--call_count)</div><div class='del'>-                        break;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        return 0;</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        sh-&gt;op_failed = 1;</div><div class='del'>-</div><div class='del'>-        sh_diff_loop_driver (frame, this);</div><div class='del'>-</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-static int</div><div class='del'>-sh_diff_loop_driver (call_frame_t *frame, xlator_t *this)</div><div class='del'>-{</div><div class='del'>-	afr_private_t *   priv  = NULL;</div><div class='del'>-	afr_local_t *     local = NULL;</div><div class='del'>-	afr_self_heal_t * sh    = NULL;</div><div class='del'>-        afr_sh_algo_diff_private_t *sh_priv = NULL;</div><div class='del'>-</div><div class='del'>-        int   loop    = 0;</div><div class='del'>-        int   recurse = 0;</div><div class='del'>-</div><div class='del'>-        off_t offset = 0;</div><div class='del'>-        char  sh_type_str[256] = {0,};</div><div class='del'>- </div><div class='del'>-	priv    = this-&gt;private;</div><div class='del'>-	local   = frame-&gt;local;</div><div class='del'>-	sh      = &amp;local-&gt;self_heal;</div><div class='del'>-        sh_priv = sh-&gt;private;</div><div class='del'>-</div><div class='del'>-        afr_self_heal_type_str_get(sh, sh_type_str, sizeof(sh_type_str));</div><div class='del'>-</div><div class='del'>-	if (sh-&gt;op_failed) {</div><div class='del'>-                if (sh_priv-&gt;loops_running == 0) {</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-                                "diff %s self-heal aborting on %s",</div><div class='del'>-                                sh_type_str, local-&gt;loc.path);</div><div class='del'>-</div><div class='del'>-                        sh_diff_private_cleanup (frame, this);</div><div class='del'>-                        local-&gt;self_heal.algo_abort_cbk (frame, this);</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-		goto out;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	if (sh_priv-&gt;offset &gt;= sh-&gt;file_size) {</div><div class='del'>-                if (sh_priv-&gt;loops_running == 0) {</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_TRACE,</div><div class='del'>-                                "diff %s self-heal completed on %s",</div><div class='del'>-                                sh_type_str, local-&gt;loc.path);</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_NORMAL,</div><div class='del'>-                                "diff %s self-heal on %s: %d blocks of %d were different (%.2f%%)",</div><div class='del'>-                                sh_type_str, local-&gt;loc.path,</div><div class='del'>-                                sh_priv-&gt;diff_blocks, sh_priv-&gt;total_blocks,</div><div class='del'>-                                ((sh_priv-&gt;diff_blocks * 1.0)/sh_priv-&gt;total_blocks) * 100);</div><div class='del'>-</div><div class='del'>-                        sh_diff_private_cleanup (frame, this);</div><div class='del'>-                        local-&gt;self_heal.algo_completion_cbk (frame, this);</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-		goto out;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-spawn:</div><div class='del'>-        loop    = 0;</div><div class='del'>-        recurse = 0;</div><div class='del'>-</div><div class='del'>-        LOCK (&amp;sh_priv-&gt;lock);</div><div class='del'>-        {</div><div class='del'>-                if ((sh_priv-&gt;loops_running &lt; priv-&gt;data_self_heal_window_size)</div><div class='del'>-                    &amp;&amp; (sh_priv-&gt;offset &lt; sh-&gt;file_size)) {</div><div class='del'>-</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_TRACE,</div><div class='del'>-                                "spawning a loop for offset %"PRId64,</div><div class='del'>-                                sh_priv-&gt;offset);</div><div class='del'>-</div><div class='del'>-                        offset           = sh_priv-&gt;offset;</div><div class='del'>-                        sh_priv-&gt;offset += sh_priv-&gt;block_size;</div><div class='del'>-</div><div class='del'>-                        sh_priv-&gt;loops_running++;</div><div class='del'>-</div><div class='del'>-                        loop = 1;</div><div class='del'>-</div><div class='del'>-                        if (sh_priv-&gt;offset &lt; sh-&gt;file_size)</div><div class='del'>-                                recurse = 1;</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='del'>-        UNLOCK (&amp;sh_priv-&gt;lock);</div><div class='del'>-</div><div class='del'>-        if (loop) {</div><div class='del'>-                sh_diff_checksum (frame, this, offset);</div><div class='del'>-                if (recurse)</div><div class='del'>-                    goto spawn;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-afr_sh_algo_diff (call_frame_t *frame, xlator_t *this)</div><div class='del'>-{</div><div class='del'>-        afr_private_t *             priv    = NULL;</div><div class='del'>-        afr_local_t *               local   = NULL;</div><div class='del'>-        afr_self_heal_t *           sh      = NULL;</div><div class='del'>-        afr_sh_algo_diff_private_t *sh_priv = NULL;</div><div class='del'>-</div><div class='del'>-        int i;</div><div class='del'>-</div><div class='del'>-        priv  = this-&gt;private;</div><div class='del'>-        local = frame-&gt;local;</div><div class='del'>-        sh    = &amp;local-&gt;self_heal;</div><div class='del'>-</div><div class='del'>-        sh_priv = GF_CALLOC (1, sizeof (*sh_priv),</div><div class='del'>-                             gf_afr_mt_afr_private_t);</div><div class='del'>-</div><div class='del'>-        sh_priv-&gt;block_size = this-&gt;ctx-&gt;page_size;</div><div class='del'>-</div><div class='del'>-        sh-&gt;private = sh_priv;</div><div class='del'>-</div><div class='del'>-        LOCK_INIT (&amp;sh_priv-&gt;lock);</div><div class='del'>-</div><div class='del'>-        local-&gt;call_count = 0;</div><div class='del'>-</div><div class='del'>-        sh_priv-&gt;loops = GF_CALLOC (priv-&gt;data_self_heal_window_size,</div><div class='del'>-                                    sizeof (*sh_priv-&gt;loops),</div><div class='del'>-                                    gf_afr_mt_sh_diff_loop_state);</div><div class='del'>-</div><div class='del'>-        for (i = 0; i &lt; priv-&gt;data_self_heal_window_size; i++) {</div><div class='del'>-                sh_priv-&gt;loops[i]               = GF_CALLOC (1, sizeof (*sh_priv-&gt;loops[i]),</div><div class='del'>-                                                             gf_afr_mt_sh_diff_loop_state);</div><div class='del'>-</div><div class='del'>-                sh_priv-&gt;loops[i]-&gt;checksum     = GF_CALLOC (priv-&gt;child_count,</div><div class='del'>-                                                             MD5_DIGEST_LEN, gf_afr_mt_uint8_t);</div><div class='del'>-                sh_priv-&gt;loops[i]-&gt;write_needed = GF_CALLOC (priv-&gt;child_count,</div><div class='del'>-                                                             sizeof (*sh_priv-&gt;loops[i]-&gt;write_needed),</div><div class='del'>-                                                             gf_afr_mt_char);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        sh_diff_loop_driver (frame, this);</div><div class='del'>-</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-struct afr_sh_algorithm afr_self_heal_algorithms[] = {</div><div class='del'>-        {.name = "full",  .fn = afr_sh_algo_full},</div><div class='del'>-        {.name = "diff",  .fn = afr_sh_algo_diff},</div><div class='del'>-        {0, 0},</div><div class='del'>-};</div><div class='head'>diff --git a/xlators/cluster/afr/src/afr-self-heal-algorithm.h b/xlators/cluster/afr/src/afr-self-heal-algorithm.h<br/>deleted file mode 100644<br/>index 0bdae3aa77f..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/xlators/cluster/afr/src/afr-self-heal-algorithm.h?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/cluster/afr/src/afr-self-heal-algorithm.h</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,60 +0,0 @@</div><div class='del'>-/*</div><div class='del'>-   Copyright (c) 2009 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='del'>-   This file is part of GlusterFS.</div><div class='del'>-</div><div class='del'>-   GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-   it under the terms of the GNU General Public License as published</div><div class='del'>-   by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-   or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-   GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-   WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-   General Public License for more details.</div><div class='del'>-</div><div class='del'>-   You should have received a copy of the GNU General Public License</div><div class='del'>-   along with this program.  If not, see</div><div class='del'>-   &lt;http://www.gnu.org/licenses/&gt;.</div><div class='del'>-*/</div><div class='del'>-</div><div class='del'>-#ifndef __AFR_SELF_HEAL_ALGORITHM_H__</div><div class='del'>-#define __AFR_SELF_HEAL_ALGORITHM_H__</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-typedef int (*afr_sh_algo_fn) (call_frame_t *frame,</div><div class='del'>-                               xlator_t *this);</div><div class='del'>-</div><div class='del'>-struct afr_sh_algorithm {</div><div class='del'>-        const char *name;</div><div class='del'>-        afr_sh_algo_fn fn;</div><div class='del'>-};</div><div class='del'>-</div><div class='del'>-extern struct afr_sh_algorithm afr_self_heal_algorithms[3];</div><div class='del'>-</div><div class='del'>-typedef struct {</div><div class='del'>-        gf_lock_t lock;</div><div class='del'>-        unsigned int loops_running;</div><div class='del'>-        off_t offset;</div><div class='del'>-} afr_sh_algo_full_private_t;</div><div class='del'>-</div><div class='del'>-struct sh_diff_loop_state {</div><div class='del'>-        off_t   offset;</div><div class='del'>-        unsigned char *write_needed;</div><div class='del'>-        uint8_t *checksum;</div><div class='del'>-        gf_boolean_t active;</div><div class='del'>-};</div><div class='del'>-</div><div class='del'>-typedef struct {</div><div class='del'>-        size_t block_size;</div><div class='del'>-</div><div class='del'>-        gf_lock_t lock;</div><div class='del'>-        unsigned int loops_running;</div><div class='del'>-        off_t offset;</div><div class='del'>-</div><div class='del'>-        int32_t total_blocks;</div><div class='del'>-        int32_t diff_blocks;</div><div class='del'>-</div><div class='del'>-        struct sh_diff_loop_state **loops;</div><div class='del'>-} afr_sh_algo_diff_private_t;</div><div class='del'>-</div><div class='del'>-#endif /* __AFR_SELF_HEAL_ALGORITHM_H__ */</div><div class='head'>diff --git a/xlators/cluster/afr/src/afr-self-heal-common.c b/xlators/cluster/afr/src/afr-self-heal-common.c<br/>index 19ad4a849d3..a580a1584cc 100644<br/>--- a/<a href='/cgit/glusterfs.git/tree/xlators/cluster/afr/src/afr-self-heal-common.c?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/cluster/afr/src/afr-self-heal-common.c</a><br/>+++ b/<a href='/cgit/glusterfs.git/tree/xlators/cluster/afr/src/afr-self-heal-common.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>xlators/cluster/afr/src/afr-self-heal-common.c</a></div><div class='hunk'>@@ -1,1714 +1,2934 @@</div><div class='ctx'> /*</div><div class='del'>-  Copyright (c) 2008-2009 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='add'>+  Copyright (c) 2013 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='ctx'>   This file is part of GlusterFS.</div><div class='ctx'> </div><div class='del'>-  GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-  it under the terms of the GNU General Public License as published</div><div class='del'>-  by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-  or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-  GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-  WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-  General Public License for more details.</div><div class='del'>-</div><div class='del'>-  You should have received a copy of the GNU General Public License</div><div class='del'>-  along with this program.  If not, see</div><div class='del'>-  &lt;http://www.gnu.org/licenses/&gt;.</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='ctx'> */</div><div class='ctx'> </div><div class='del'>-#include "glusterfs.h"</div><div class='del'>-#include "xlator.h"</div><div class='del'>-#include "byte-order.h"</div><div class='del'>-</div><div class='ctx'> #include "afr.h"</div><div class='del'>-#include "afr-transaction.h"</div><div class='del'>-#include "afr-self-heal-common.h"</div><div class='ctx'> #include "afr-self-heal.h"</div><div class='del'>-#include "pump.h"</div><div class='add'>+#include &lt;glusterfs/byte-order.h&gt;</div><div class='add'>+#include "protocol-common.h"</div><div class='add'>+#include "afr-messages.h"</div><div class='add'>+#include &lt;glusterfs/events.h&gt;</div><div class='ctx'> </div><div class='del'>-/**</div><div class='del'>- * select_source - select a source and return it</div><div class='del'>- */</div><div class='add'>+void</div><div class='add'>+afr_heal_synctask(xlator_t *this, afr_local_t *local);</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-afr_sh_select_source (int sources[], int child_count)</div><div class='add'>+afr_lookup_and_heal_gfid(xlator_t *this, inode_t *parent, const char *name,</div><div class='add'>+                         inode_t *inode, struct afr_reply *replies, int source,</div><div class='add'>+                         unsigned char *sources, void *gfid, int *gfid_idx)</div><div class='ctx'> {</div><div class='del'>-	int i;</div><div class='del'>-	for (i = 0; i &lt; child_count; i++)</div><div class='del'>-		if (sources[i])</div><div class='del'>-			return i;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    call_frame_t *frame = NULL;</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    unsigned char *wind_on = NULL;</div><div class='add'>+    ia_type_t ia_type = IA_INVAL;</div><div class='add'>+    dict_t *xdata = NULL;</div><div class='add'>+    loc_t loc = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int ret = 0;</div><div class='add'>+    int i = 0;</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+    wind_on = alloca0(priv-&gt;child_count);</div><div class='add'>+    if (source &gt;= 0 &amp;&amp; replies[source].valid &amp;&amp; replies[source].op_ret == 0)</div><div class='add'>+        ia_type = replies[source].poststat.ia_type;</div><div class='add'>+</div><div class='add'>+    if (ia_type != IA_INVAL)</div><div class='add'>+        goto heal;</div><div class='add'>+</div><div class='add'>+    /* If ia_type is still invalid, it means either</div><div class='add'>+     * (a)'source' was -1, i.e. parent dir pending xattrs are in split-brain</div><div class='add'>+     * (or) (b) The parent dir pending xattrs are all zeroes (i.e. all bricks</div><div class='add'>+     * are sources) and the 'source' we selected earlier might be the one where</div><div class='add'>+     * the file is not actually present.</div><div class='add'>+     *</div><div class='add'>+     * In both cases, let us pick a brick with a successful reply and use its</div><div class='add'>+     * ia_type.</div><div class='add'>+     * */</div><div class='add'>+    for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+        if (source == -1) {</div><div class='add'>+            /* case (a) above. */</div><div class='add'>+            if (replies[i].valid &amp;&amp; replies[i].op_ret == 0 &amp;&amp;</div><div class='add'>+                replies[i].poststat.ia_type != IA_INVAL) {</div><div class='add'>+                ia_type = replies[i].poststat.ia_type;</div><div class='add'>+                break;</div><div class='add'>+            }</div><div class='add'>+        } else {</div><div class='add'>+            /* case (b) above. */</div><div class='add'>+            if (i == source)</div><div class='add'>+                continue;</div><div class='add'>+            if (sources[i] &amp;&amp; replies[i].valid &amp;&amp; replies[i].op_ret == 0 &amp;&amp;</div><div class='add'>+                replies[i].poststat.ia_type != IA_INVAL) {</div><div class='add'>+                ia_type = replies[i].poststat.ia_type;</div><div class='add'>+                break;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	return -1;</div><div class='del'>-}</div><div class='add'>+heal:</div><div class='add'>+    /* gfid heal on those subvolumes that do not have gfid associated</div><div class='add'>+     * with the inode and update those replies.</div><div class='add'>+     */</div><div class='add'>+    for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+        if (!replies[i].valid || replies[i].op_ret != 0)</div><div class='add'>+            continue;</div><div class='ctx'> </div><div class='add'>+        if (gf_uuid_is_null(gfid) &amp;&amp;</div><div class='add'>+            !gf_uuid_is_null(replies[i].poststat.ia_gfid) &amp;&amp;</div><div class='add'>+            replies[i].poststat.ia_type == ia_type)</div><div class='add'>+            gfid = replies[i].poststat.ia_gfid;</div><div class='ctx'> </div><div class='del'>-/**</div><div class='del'>- * sink_count - return number of sinks in sources array</div><div class='del'>- */</div><div class='add'>+        if (!gf_uuid_is_null(replies[i].poststat.ia_gfid) ||</div><div class='add'>+            replies[i].poststat.ia_type != ia_type)</div><div class='add'>+            continue;</div><div class='add'>+</div><div class='add'>+        wind_on[i] = 1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (AFR_COUNT(wind_on, priv-&gt;child_count) == 0)</div><div class='add'>+        return 0;</div><div class='add'>+</div><div class='add'>+    xdata = dict_new();</div><div class='add'>+    if (!xdata) {</div><div class='add'>+        ret = -ENOMEM;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_set_gfuuid(xdata, "gfid-req", gfid, true);</div><div class='add'>+    if (ret) {</div><div class='add'>+        ret = -ENOMEM;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    frame = afr_frame_create(this, &amp;ret);</div><div class='add'>+    if (!frame) {</div><div class='add'>+        ret = -ret;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    loc.parent = inode_ref(parent);</div><div class='add'>+    gf_uuid_copy(loc.pargfid, parent-&gt;gfid);</div><div class='add'>+    loc.name = name;</div><div class='add'>+    loc.inode = inode_ref(inode);</div><div class='add'>+</div><div class='add'>+    AFR_ONLIST(wind_on, frame, afr_selfheal_discover_cbk, lookup, &amp;loc, xdata);</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+        if (!wind_on[i])</div><div class='add'>+            continue;</div><div class='add'>+        afr_reply_wipe(&amp;replies[i]);</div><div class='add'>+        afr_reply_copy(&amp;replies[i], &amp;local-&gt;replies[i]);</div><div class='add'>+    }</div><div class='add'>+    if (gfid_idx &amp;&amp; (*gfid_idx == -1)) {</div><div class='add'>+        /*Pick a brick where the gifd heal was successful.*/</div><div class='add'>+        for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+            if (!wind_on[i])</div><div class='add'>+                continue;</div><div class='add'>+            if (replies[i].valid &amp;&amp; replies[i].op_ret == 0 &amp;&amp;</div><div class='add'>+                !gf_uuid_is_null(replies[i].poststat.ia_gfid)) {</div><div class='add'>+                *gfid_idx = i;</div><div class='add'>+                break;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+out:</div><div class='add'>+    if (gfid_idx &amp;&amp; (*gfid_idx == -1) &amp;&amp; (ret == 0) &amp;&amp; local) {</div><div class='add'>+        ret = -afr_final_errno(local, priv);</div><div class='add'>+    }</div><div class='add'>+    loc_wipe(&amp;loc);</div><div class='add'>+    if (frame)</div><div class='add'>+        AFR_STACK_DESTROY(frame);</div><div class='add'>+    if (xdata)</div><div class='add'>+        dict_unref(xdata);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-afr_sh_sink_count (int sources[], int child_count)</div><div class='add'>+afr_gfid_sbrain_source_from_src_brick(xlator_t *this, struct afr_reply *replies,</div><div class='add'>+                                      char *src_brick)</div><div class='ctx'> {</div><div class='del'>-	int i;</div><div class='del'>-	int sinks = 0;</div><div class='del'>-	for (i = 0; i &lt; child_count; i++)</div><div class='del'>-		if (!sources[i])</div><div class='del'>-			sinks++;</div><div class='del'>-	return sinks;</div><div class='add'>+    int i = 0;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+    for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+        if (!replies[i].valid || replies[i].op_ret == -1)</div><div class='add'>+            continue;</div><div class='add'>+        if (strcmp(priv-&gt;children[i]-&gt;name, src_brick) == 0)</div><div class='add'>+            return i;</div><div class='add'>+    }</div><div class='add'>+    return -1;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-afr_sh_source_count (int sources[], int child_count)</div><div class='add'>+afr_selfheal_gfid_mismatch_by_majority(struct afr_reply *replies,</div><div class='add'>+                                       int child_count)</div><div class='ctx'> {</div><div class='del'>-	int i;</div><div class='del'>-	int nsource = 0;</div><div class='add'>+    int j = 0;</div><div class='add'>+    int i = 0;</div><div class='add'>+    int votes;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; child_count; i++) {</div><div class='add'>+        if (!replies[i].valid || replies[i].op_ret == -1)</div><div class='add'>+            continue;</div><div class='add'>+</div><div class='add'>+        votes = 1;</div><div class='add'>+        for (j = i + 1; j &lt; child_count; j++) {</div><div class='add'>+            if ((!gf_uuid_compare(replies[i].poststat.ia_gfid,</div><div class='add'>+                                  replies[j].poststat.ia_gfid)))</div><div class='add'>+                votes++;</div><div class='add'>+            if (votes &gt; child_count / 2)</div><div class='add'>+                return i;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	for (i = 0; i &lt; child_count; i++)</div><div class='del'>-		if (sources[i])</div><div class='del'>-			nsource++;</div><div class='del'>-	return nsource;</div><div class='add'>+    return -1;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+int</div><div class='add'>+afr_gfid_sbrain_source_from_bigger_file(struct afr_reply *replies,</div><div class='add'>+                                        int child_count)</div><div class='add'>+{</div><div class='add'>+    int i = 0;</div><div class='add'>+    int src = -1;</div><div class='add'>+    uint64_t size = 0;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; child_count; i++) {</div><div class='add'>+        if (!replies[i].valid || replies[i].op_ret == -1)</div><div class='add'>+            continue;</div><div class='add'>+        if (size &lt; replies[i].poststat.ia_size) {</div><div class='add'>+            src = i;</div><div class='add'>+            size = replies[i].poststat.ia_size;</div><div class='add'>+        } else if (replies[i].poststat.ia_size == size) {</div><div class='add'>+            src = -1;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    return src;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+afr_gfid_sbrain_source_from_latest_mtime(struct afr_reply *replies,</div><div class='add'>+                                         int child_count)</div><div class='add'>+{</div><div class='add'>+    int i = 0;</div><div class='add'>+    int src = -1;</div><div class='add'>+    uint32_t mtime = 0;</div><div class='add'>+    uint32_t mtime_nsec = 0;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; child_count; i++) {</div><div class='add'>+        if (!replies[i].valid || replies[i].op_ret != 0)</div><div class='add'>+            continue;</div><div class='add'>+        if ((mtime &lt; replies[i].poststat.ia_mtime) ||</div><div class='add'>+            ((mtime == replies[i].poststat.ia_mtime) &amp;&amp;</div><div class='add'>+             (mtime_nsec &lt; replies[i].poststat.ia_mtime_nsec))) {</div><div class='add'>+            src = i;</div><div class='add'>+            mtime = replies[i].poststat.ia_mtime;</div><div class='add'>+            mtime_nsec = replies[i].poststat.ia_mtime_nsec;</div><div class='add'>+        } else if ((mtime == replies[i].poststat.ia_mtime) &amp;&amp;</div><div class='add'>+                   (mtime_nsec == replies[i].poststat.ia_mtime_nsec)) {</div><div class='add'>+            src = -1;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    return src;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-afr_sh_supress_errenous_children (int sources[], int child_errno[],</div><div class='del'>-				  int child_count)</div><div class='add'>+afr_gfid_split_brain_source(xlator_t *this, struct afr_reply *replies,</div><div class='add'>+                            inode_t *inode, uuid_t pargfid, const char *bname,</div><div class='add'>+                            int src_idx, int child_idx,</div><div class='add'>+                            unsigned char *locked_on, int *src, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-	int i = 0;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    char g1[64] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    char g2[64] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int up_count = 0;</div><div class='add'>+    int heal_op = -1;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    char *src_brick = NULL;</div><div class='add'>+</div><div class='add'>+    *src = -1;</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+    up_count = AFR_COUNT(locked_on, priv-&gt;child_count);</div><div class='add'>+    if (up_count != priv-&gt;child_count) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_ERROR, 0, AFR_MSG_SPLIT_BRAIN,</div><div class='add'>+               "All the bricks should be up to resolve the gfid split "</div><div class='add'>+               "barin");</div><div class='add'>+        if (xdata) {</div><div class='add'>+            ret = dict_set_sizen_str_sizen(xdata, "gfid-heal-msg",</div><div class='add'>+                                           SALL_BRICKS_UP_TO_RESOLVE);</div><div class='add'>+            if (ret)</div><div class='add'>+                gf_msg(this-&gt;name, GF_LOG_ERROR, 0, AFR_MSG_DICT_SET_FAILED,</div><div class='add'>+                       "Error setting"</div><div class='add'>+                       " gfid-heal-msg dict");</div><div class='add'>+        }</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	for (i = 0; i &lt; child_count; i++) {</div><div class='del'>-		if (child_errno[i] &amp;&amp; sources[i]) {</div><div class='del'>-			sources[i] = 0;</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='add'>+    if (xdata) {</div><div class='add'>+        ret = dict_get_int32_sizen(xdata, "heal-op", &amp;heal_op);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto fav_child;</div><div class='add'>+    } else {</div><div class='add'>+        goto fav_child;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    switch (heal_op) {</div><div class='add'>+        case GF_SHD_OP_SBRAIN_HEAL_FROM_BIGGER_FILE:</div><div class='add'>+            *src = afr_gfid_sbrain_source_from_bigger_file(replies,</div><div class='add'>+                                                           priv-&gt;child_count);</div><div class='add'>+            if (*src == -1) {</div><div class='add'>+                gf_msg(this-&gt;name, GF_LOG_ERROR, 0, AFR_MSG_SPLIT_BRAIN,</div><div class='add'>+                       SNO_BIGGER_FILE);</div><div class='add'>+                if (xdata) {</div><div class='add'>+                    ret = dict_set_sizen_str_sizen(xdata, "gfid-heal-msg",</div><div class='add'>+                                                   SNO_BIGGER_FILE);</div><div class='add'>+                    if (ret)</div><div class='add'>+                        gf_msg(this-&gt;name, GF_LOG_ERROR, 0,</div><div class='add'>+                               AFR_MSG_DICT_SET_FAILED,</div><div class='add'>+                               "Error"</div><div class='add'>+                               " setting gfid-heal-msg dict");</div><div class='add'>+                }</div><div class='add'>+            }</div><div class='add'>+            break;</div><div class='add'>+</div><div class='add'>+        case GF_SHD_OP_SBRAIN_HEAL_FROM_LATEST_MTIME:</div><div class='add'>+            *src = afr_gfid_sbrain_source_from_latest_mtime(replies,</div><div class='add'>+                                                            priv-&gt;child_count);</div><div class='add'>+            if (*src == -1) {</div><div class='add'>+                gf_msg(this-&gt;name, GF_LOG_ERROR, 0, AFR_MSG_SPLIT_BRAIN,</div><div class='add'>+                       SNO_DIFF_IN_MTIME);</div><div class='add'>+                if (xdata) {</div><div class='add'>+                    ret = dict_set_sizen_str_sizen(xdata, "gfid-heal-msg",</div><div class='add'>+                                                   SNO_DIFF_IN_MTIME);</div><div class='add'>+                    if (ret)</div><div class='add'>+                        gf_msg(this-&gt;name, GF_LOG_ERROR, 0,</div><div class='add'>+                               AFR_MSG_DICT_SET_FAILED,</div><div class='add'>+                               "Error"</div><div class='add'>+                               "setting gfid-heal-msg dict");</div><div class='add'>+                }</div><div class='add'>+            }</div><div class='add'>+            break;</div><div class='add'>+</div><div class='add'>+        case GF_SHD_OP_SBRAIN_HEAL_FROM_BRICK:</div><div class='add'>+            ret = dict_get_str_sizen(xdata, "child-name", &amp;src_brick);</div><div class='add'>+            if (ret) {</div><div class='add'>+                gf_msg(this-&gt;name, GF_LOG_ERROR, 0, AFR_MSG_SPLIT_BRAIN,</div><div class='add'>+                       "Error getting the source "</div><div class='add'>+                       "brick");</div><div class='add'>+                break;</div><div class='add'>+            }</div><div class='add'>+            *src = afr_gfid_sbrain_source_from_src_brick(this, replies,</div><div class='add'>+                                                         src_brick);</div><div class='add'>+            if (*src == -1) {</div><div class='add'>+                gf_msg(this-&gt;name, GF_LOG_ERROR, 0, AFR_MSG_SPLIT_BRAIN,</div><div class='add'>+                       SERROR_GETTING_SRC_BRICK);</div><div class='add'>+                if (xdata) {</div><div class='add'>+                    ret = dict_set_sizen_str_sizen(xdata, "gfid-heal-msg",</div><div class='add'>+                                                   SERROR_GETTING_SRC_BRICK);</div><div class='add'>+                    if (ret)</div><div class='add'>+                        gf_msg(this-&gt;name, GF_LOG_ERROR, 0,</div><div class='add'>+                               AFR_MSG_DICT_SET_FAILED,</div><div class='add'>+                               "Error"</div><div class='add'>+                               " setting gfid-heal-msg dict");</div><div class='add'>+                }</div><div class='add'>+            }</div><div class='add'>+            break;</div><div class='add'>+</div><div class='add'>+        default:</div><div class='add'>+            break;</div><div class='add'>+    }</div><div class='add'>+    goto out;</div><div class='add'>+</div><div class='add'>+fav_child:</div><div class='add'>+    switch (priv-&gt;fav_child_policy) {</div><div class='add'>+        case AFR_FAV_CHILD_BY_SIZE:</div><div class='add'>+            *src = afr_sh_fav_by_size(this, replies, inode);</div><div class='add'>+            break;</div><div class='add'>+        case AFR_FAV_CHILD_BY_MTIME:</div><div class='add'>+            *src = afr_sh_fav_by_mtime(this, replies, inode);</div><div class='add'>+            break;</div><div class='add'>+        case AFR_FAV_CHILD_BY_CTIME:</div><div class='add'>+            *src = afr_sh_fav_by_ctime(this, replies, inode);</div><div class='add'>+            break;</div><div class='add'>+        case AFR_FAV_CHILD_BY_MAJORITY:</div><div class='add'>+            if (priv-&gt;child_count != 2)</div><div class='add'>+                *src = afr_selfheal_gfid_mismatch_by_majority(</div><div class='add'>+                    replies, priv-&gt;child_count);</div><div class='add'>+            else</div><div class='add'>+                *src = -1;</div><div class='add'>+</div><div class='add'>+            if (*src == -1) {</div><div class='add'>+                gf_msg(this-&gt;name, GF_LOG_ERROR, 0, AFR_MSG_SPLIT_BRAIN,</div><div class='add'>+                       "No majority to resolve "</div><div class='add'>+                       "gfid split brain");</div><div class='add'>+            }</div><div class='add'>+            break;</div><div class='add'>+        default:</div><div class='add'>+            break;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	return 0;</div><div class='add'>+out:</div><div class='add'>+    if (*src == -1) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_ERROR, 0, AFR_MSG_SPLIT_BRAIN,</div><div class='add'>+               "Gfid mismatch detected for &lt;gfid:%s&gt;/%s&gt;, %s on %s and"</div><div class='add'>+               " %s on %s.",</div><div class='add'>+               uuid_utoa(pargfid), bname,</div><div class='add'>+               uuid_utoa_r(replies[child_idx].poststat.ia_gfid, g1),</div><div class='add'>+               priv-&gt;children[child_idx]-&gt;name,</div><div class='add'>+               uuid_utoa_r(replies[src_idx].poststat.ia_gfid, g2),</div><div class='add'>+               priv-&gt;children[src_idx]-&gt;name);</div><div class='add'>+        gf_event(EVENT_AFR_SPLIT_BRAIN,</div><div class='add'>+                 "client-pid=%d;"</div><div class='add'>+                 "subvol=%s;type=gfid;file="</div><div class='add'>+                 "&lt;gfid:%s&gt;/%s&gt;;count=2;child-%d=%s;gfid-%d=%s;"</div><div class='add'>+                 "child-%d=%s;gfid-%d=%s",</div><div class='add'>+                 this-&gt;ctx-&gt;cmd_args.client_pid, this-&gt;name, uuid_utoa(pargfid),</div><div class='add'>+                 bname, child_idx, priv-&gt;children[child_idx]-&gt;name, child_idx,</div><div class='add'>+                 uuid_utoa_r(replies[child_idx].poststat.ia_gfid, g1), src_idx,</div><div class='add'>+                 priv-&gt;children[src_idx]-&gt;name, src_idx,</div><div class='add'>+                 uuid_utoa_r(replies[src_idx].poststat.ia_gfid, g2));</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='del'>-void</div><div class='del'>-afr_sh_print_pending_matrix (int32_t *pending_matrix[], xlator_t *this)</div><div class='add'>+int</div><div class='add'>+afr_selfheal_post_op_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                         int op_ret, int op_errno, dict_t *xattr, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-	afr_private_t * priv = this-&gt;private;</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='ctx'> </div><div class='del'>-	char *buf = NULL;</div><div class='del'>-	char *ptr = NULL;</div><div class='add'>+    local = frame-&gt;local;</div><div class='ctx'> </div><div class='del'>-	int i, j;</div><div class='add'>+    local-&gt;op_ret = op_ret;</div><div class='add'>+    local-&gt;op_errno = op_errno;</div><div class='add'>+    syncbarrier_wake(&amp;local-&gt;barrier);</div><div class='ctx'> </div><div class='del'>-        /* 10 digits per entry + 1 space + '[' and ']' */</div><div class='del'>-	buf = GF_MALLOC (priv-&gt;child_count * 11 + 8, gf_afr_mt_char);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='del'>-		ptr = buf;</div><div class='del'>-		ptr += sprintf (ptr, "[ ");</div><div class='del'>-		for (j = 0; j &lt; priv-&gt;child_count; j++) {</div><div class='del'>-			ptr += sprintf (ptr, "%d ", pending_matrix[i][j]);</div><div class='del'>-		}</div><div class='del'>-		sprintf (ptr, "]");</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_TRACE,</div><div class='del'>-			"pending_matrix: %s", buf);</div><div class='del'>-	}</div><div class='add'>+int</div><div class='add'>+afr_selfheal_post_op(call_frame_t *frame, xlator_t *this, inode_t *inode,</div><div class='add'>+                     int subvol, dict_t *xattr, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    loc_t loc = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int ret = 0;</div><div class='ctx'> </div><div class='del'>-	GF_FREE (buf);</div><div class='del'>-}</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+    local = frame-&gt;local;</div><div class='ctx'> </div><div class='add'>+    loc.inode = inode_ref(inode);</div><div class='add'>+    gf_uuid_copy(loc.gfid, inode-&gt;gfid);</div><div class='ctx'> </div><div class='del'>-void</div><div class='del'>-afr_sh_build_pending_matrix (afr_private_t *priv,</div><div class='del'>-                             int32_t *pending_matrix[], dict_t *xattr[],</div><div class='del'>-			     int child_count, afr_transaction_type type)</div><div class='del'>-{</div><div class='del'>-	int i, j, k;</div><div class='del'>-</div><div class='del'>-	/* Indexable by result of afr_index_for_transaction_type(): 0 -- 2. */</div><div class='del'>-	int32_t pending[3];</div><div class='del'>-	void *pending_raw = NULL;</div><div class='del'>-	int ret = -1;</div><div class='del'>-</div><div class='del'>-        unsigned char *ignorant_subvols = NULL;</div><div class='del'>-</div><div class='del'>-        ignorant_subvols = GF_CALLOC (sizeof (*ignorant_subvols), child_count,</div><div class='del'>-                                      gf_afr_mt_char);</div><div class='del'>-</div><div class='del'>-	/* start clean */</div><div class='del'>-	for (i = 0; i &lt; child_count; i++) {</div><div class='del'>-		for (j = 0; j &lt; child_count; j++) {</div><div class='del'>-			pending_matrix[i][j] = 0;</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	for (i = 0; i &lt; child_count; i++) {</div><div class='del'>-		pending_raw = NULL;</div><div class='del'>-</div><div class='del'>-                for (j = 0; j &lt; child_count; j++) {</div><div class='del'>-                        ret = dict_get_ptr (xattr[i], priv-&gt;pending_key[j],</div><div class='del'>-                                            &amp;pending_raw);</div><div class='del'>-                        </div><div class='del'>-                        if (ret != 0) {</div><div class='del'>-                                /*</div><div class='del'>-                                 * There is no xattr present. This means this</div><div class='del'>-                                 * subvolume should be considered an 'ignorant'</div><div class='del'>-                                 * subvolume.</div><div class='del'>-                                 */</div><div class='del'>-</div><div class='del'>-                                ignorant_subvols[i] = 1;</div><div class='del'>-                                continue;</div><div class='del'>-                        }</div><div class='del'>-</div><div class='del'>-			memcpy (pending, pending_raw, sizeof(pending));</div><div class='del'>-                        k = afr_index_for_transaction_type (type);</div><div class='del'>-                        </div><div class='del'>-                        pending_matrix[i][j] = ntoh32 (pending[k]);</div><div class='del'>-                }</div><div class='del'>-	}</div><div class='add'>+    local-&gt;op_ret = 0;</div><div class='ctx'> </div><div class='del'>-        /*</div><div class='del'>-         * Make all non-ignorant subvols point towards the ignorant</div><div class='del'>-         * subvolumes.</div><div class='del'>-         */</div><div class='add'>+    STACK_WIND(frame, afr_selfheal_post_op_cbk, priv-&gt;children[subvol],</div><div class='add'>+               priv-&gt;children[subvol]-&gt;fops-&gt;xattrop, &amp;loc,</div><div class='add'>+               GF_XATTROP_ADD_ARRAY, xattr, xdata);</div><div class='ctx'> </div><div class='del'>-        for (i = 0; i &lt; child_count; i++) {</div><div class='del'>-                if (ignorant_subvols[i]) {</div><div class='del'>-                        for (j = 0; j &lt; child_count; j++) {</div><div class='del'>-                                if (!ignorant_subvols[j])</div><div class='del'>-                                        pending_matrix[j][i] += 1;</div><div class='del'>-                        }</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='add'>+    syncbarrier_wait(&amp;local-&gt;barrier, 1);</div><div class='add'>+    if (local-&gt;op_ret &lt; 0)</div><div class='add'>+        ret = -local-&gt;op_errno;</div><div class='ctx'> </div><div class='del'>-        GF_FREE (ignorant_subvols);</div><div class='add'>+    loc_wipe(&amp;loc);</div><div class='add'>+    local-&gt;op_ret = 0;</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+int</div><div class='add'>+afr_check_stale_error(struct afr_reply *replies, afr_private_t *priv)</div><div class='add'>+{</div><div class='add'>+    int i = 0;</div><div class='add'>+    int op_errno = 0;</div><div class='add'>+    int tmp_errno = 0;</div><div class='add'>+    int stale_count = 0;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+        tmp_errno = replies[i].op_errno;</div><div class='add'>+        if (tmp_errno == ENOENT || tmp_errno == ESTALE) {</div><div class='add'>+            op_errno = afr_higher_errno(op_errno, tmp_errno);</div><div class='add'>+            stale_count++;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    if (stale_count != priv-&gt;child_count)</div><div class='add'>+        return -ENOTCONN;</div><div class='add'>+    else</div><div class='add'>+        return -op_errno;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-/**</div><div class='del'>- * mark_sources: Mark all 'source' nodes and return number of source</div><div class='del'>- * nodes found</div><div class='del'>- *</div><div class='del'>- * A node (a row in the pending matrix) belongs to one of</div><div class='del'>- * three categories:</div><div class='del'>- *</div><div class='del'>- * M is the pending matrix.</div><div class='del'>- *</div><div class='del'>- * 'innocent' - M[i] is all zeroes</div><div class='del'>- * 'fool'     - M[i] has i'th element = 1 (self-reference)</div><div class='del'>- * 'wise'     - M[i] has i'th element = 0, others are 1 or 0.</div><div class='del'>- *</div><div class='del'>- * All 'innocent' nodes are sinks. If all nodes are innocent, no self-heal is</div><div class='del'>- * needed.</div><div class='del'>- *</div><div class='del'>- * A 'wise' node can be a source. If two 'wise' nodes conflict, it is </div><div class='del'>- * a split-brain. If one wise node refers to the other but the other doesn't</div><div class='del'>- * refer back, the referrer is a source.</div><div class='del'>- *</div><div class='del'>- * All fools are sinks, unless there are no 'wise' nodes. In that case,</div><div class='del'>- * one of the fools is made a source.</div><div class='del'>- */</div><div class='add'>+int</div><div class='add'>+afr_sh_generic_fop_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                       int op_ret, int op_errno, struct iatt *pre,</div><div class='add'>+                       struct iatt *post, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    int i = (long)cookie;</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='ctx'> </div><div class='del'>-typedef enum {</div><div class='del'>-        AFR_NODE_INNOCENT,</div><div class='del'>-        AFR_NODE_FOOL,</div><div class='del'>-        AFR_NODE_WISE</div><div class='del'>-} afr_node_type;</div><div class='add'>+    local = frame-&gt;local;</div><div class='ctx'> </div><div class='del'>-typedef struct {</div><div class='del'>-        afr_node_type type;</div><div class='del'>-        int           wisdom;</div><div class='del'>-} afr_node_character;</div><div class='add'>+    local-&gt;replies[i].valid = 1;</div><div class='add'>+    local-&gt;replies[i].op_ret = op_ret;</div><div class='add'>+    local-&gt;replies[i].op_errno = op_errno;</div><div class='add'>+    if (pre)</div><div class='add'>+        local-&gt;replies[i].prestat = *pre;</div><div class='add'>+    if (post)</div><div class='add'>+        local-&gt;replies[i].poststat = *post;</div><div class='add'>+    if (xdata)</div><div class='add'>+        local-&gt;replies[i].xdata = dict_ref(xdata);</div><div class='ctx'> </div><div class='add'>+    syncbarrier_wake(&amp;local-&gt;barrier);</div><div class='ctx'> </div><div class='del'>-static int</div><div class='del'>-afr_sh_is_innocent (int32_t *array, int child_count)</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+afr_selfheal_restore_time(call_frame_t *frame, xlator_t *this, inode_t *inode,</div><div class='add'>+                          int source, unsigned char *healed_sinks,</div><div class='add'>+                          struct afr_reply *replies)</div><div class='ctx'> {</div><div class='del'>-        int i   = 0;</div><div class='del'>-        int ret = 1;   /* innocent until proven guilty */</div><div class='add'>+    loc_t loc = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='ctx'> </div><div class='del'>-        for (i = 0; i &lt; child_count; i++) {</div><div class='del'>-                if (array[i]) {</div><div class='del'>-                        ret = 0;</div><div class='del'>-                        break;</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='add'>+    loc.inode = inode_ref(inode);</div><div class='add'>+    gf_uuid_copy(loc.gfid, inode-&gt;gfid);</div><div class='ctx'> </div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='add'>+    AFR_ONLIST(healed_sinks, frame, afr_sh_generic_fop_cbk, setattr, &amp;loc,</div><div class='add'>+               &amp;replies[source].poststat,</div><div class='add'>+               (GF_SET_ATTR_ATIME | GF_SET_ATTR_MTIME | GF_SET_ATTR_CTIME),</div><div class='add'>+               NULL);</div><div class='ctx'> </div><div class='add'>+    loc_wipe(&amp;loc);</div><div class='ctx'> </div><div class='del'>-static int</div><div class='del'>-afr_sh_is_fool (int32_t *array, int i, int child_count)</div><div class='del'>-{</div><div class='del'>-        return array[i];   /* fool if accuses itself */</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='del'>-static int</div><div class='del'>-afr_sh_is_wise (int32_t *array, int i, int child_count)</div><div class='add'>+dict_t *</div><div class='add'>+afr_selfheal_output_xattr(xlator_t *this, gf_boolean_t is_full_crawl,</div><div class='add'>+                          afr_transaction_type type, int *output_dirty,</div><div class='add'>+                          int **output_matrix, int subvol,</div><div class='add'>+                          int **full_heal_mtx_out)</div><div class='ctx'> {</div><div class='del'>-        return !array[i];  /* wise if does not accuse itself */</div><div class='del'>-}</div><div class='add'>+    int j = 0;</div><div class='add'>+    int idx = 0;</div><div class='add'>+    int d_idx = 0;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    int *raw = 0;</div><div class='add'>+    dict_t *xattr = NULL;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+    idx = afr_index_for_transaction_type(type);</div><div class='add'>+    d_idx = afr_index_for_transaction_type(AFR_DATA_TRANSACTION);</div><div class='add'>+</div><div class='add'>+    xattr = dict_new();</div><div class='add'>+    if (!xattr)</div><div class='add'>+        return NULL;</div><div class='add'>+</div><div class='add'>+    /* clear dirty */</div><div class='add'>+    raw = GF_CALLOC(sizeof(int), AFR_NUM_CHANGE_LOGS, gf_afr_mt_int32_t);</div><div class='add'>+    if (!raw)</div><div class='add'>+        goto err;</div><div class='add'>+</div><div class='add'>+    raw[idx] = hton32(output_dirty[subvol]);</div><div class='add'>+    ret = dict_set_bin(xattr, AFR_DIRTY, raw,</div><div class='add'>+                       sizeof(int) * AFR_NUM_CHANGE_LOGS);</div><div class='add'>+    if (ret) {</div><div class='add'>+        GF_FREE(raw);</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* clear/set pending */</div><div class='add'>+    for (j = 0; j &lt; priv-&gt;child_count; j++) {</div><div class='add'>+        raw = GF_CALLOC(sizeof(int), AFR_NUM_CHANGE_LOGS, gf_afr_mt_int32_t);</div><div class='add'>+        if (!raw)</div><div class='add'>+            goto err;</div><div class='add'>+</div><div class='add'>+        raw[idx] = hton32(output_matrix[subvol][j]);</div><div class='add'>+        if (is_full_crawl)</div><div class='add'>+            raw[d_idx] = hton32(full_heal_mtx_out[subvol][j]);</div><div class='add'>+</div><div class='add'>+        ret = dict_set_bin(xattr, priv-&gt;pending_key[j], raw,</div><div class='add'>+                           sizeof(int) * AFR_NUM_CHANGE_LOGS);</div><div class='add'>+        if (ret) {</div><div class='add'>+            GF_FREE(raw);</div><div class='add'>+            goto err;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='ctx'> </div><div class='add'>+    return xattr;</div><div class='add'>+err:</div><div class='add'>+    if (xattr)</div><div class='add'>+        dict_unref(xattr);</div><div class='add'>+    return NULL;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-static int</div><div class='del'>-afr_sh_all_nodes_innocent (afr_node_character *characters, </div><div class='del'>-                           int child_count)</div><div class='add'>+int</div><div class='add'>+afr_selfheal_undo_pending(call_frame_t *frame, xlator_t *this, inode_t *inode,</div><div class='add'>+                          unsigned char *sources, unsigned char *sinks,</div><div class='add'>+                          unsigned char *healed_sinks,</div><div class='add'>+                          unsigned char *undid_pending,</div><div class='add'>+                          afr_transaction_type type, struct afr_reply *replies,</div><div class='add'>+                          unsigned char *locked_on)</div><div class='ctx'> {</div><div class='del'>-        int i   = 0;</div><div class='del'>-        int ret = 1;</div><div class='del'>-</div><div class='del'>-        for (i = 0; i &lt; child_count; i++) {</div><div class='del'>-                if (characters[i].type != AFR_NODE_INNOCENT) {</div><div class='del'>-                        ret = 0;</div><div class='del'>-                        break;</div><div class='del'>-                }</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    int i = 0;</div><div class='add'>+    int j = 0;</div><div class='add'>+    unsigned char *pending = NULL;</div><div class='add'>+    int *input_dirty = NULL;</div><div class='add'>+    int **input_matrix = NULL;</div><div class='add'>+    int **full_heal_mtx_in = NULL;</div><div class='add'>+    int **full_heal_mtx_out = NULL;</div><div class='add'>+    int *output_dirty = NULL;</div><div class='add'>+    int **output_matrix = NULL;</div><div class='add'>+    dict_t *xattr = NULL;</div><div class='add'>+    dict_t *xdata = NULL;</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+</div><div class='add'>+    pending = alloca0(priv-&gt;child_count);</div><div class='add'>+</div><div class='add'>+    input_dirty = alloca0(priv-&gt;child_count * sizeof(int));</div><div class='add'>+    input_matrix = ALLOC_MATRIX(priv-&gt;child_count, int);</div><div class='add'>+    full_heal_mtx_in = ALLOC_MATRIX(priv-&gt;child_count, int);</div><div class='add'>+    full_heal_mtx_out = ALLOC_MATRIX(priv-&gt;child_count, int);</div><div class='add'>+    output_dirty = alloca0(priv-&gt;child_count * sizeof(int));</div><div class='add'>+    output_matrix = ALLOC_MATRIX(priv-&gt;child_count, int);</div><div class='add'>+</div><div class='add'>+    xdata = dict_new();</div><div class='add'>+    if (!xdata)</div><div class='add'>+        return -1;</div><div class='add'>+</div><div class='add'>+    afr_selfheal_extract_xattr(this, replies, type, input_dirty, input_matrix);</div><div class='add'>+</div><div class='add'>+    if (local-&gt;need_full_crawl)</div><div class='add'>+        afr_selfheal_extract_xattr(this, replies, AFR_DATA_TRANSACTION, NULL,</div><div class='add'>+                                   full_heal_mtx_in);</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; priv-&gt;child_count; i++)</div><div class='add'>+        if (sinks[i] &amp;&amp; !healed_sinks[i])</div><div class='add'>+            pending[i] = 1;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+        for (j = 0; j &lt; priv-&gt;child_count; j++) {</div><div class='add'>+            if (pending[j]) {</div><div class='add'>+                output_matrix[i][j] = 1;</div><div class='add'>+                if (type == AFR_ENTRY_TRANSACTION)</div><div class='add'>+                    full_heal_mtx_out[i][j] = 1;</div><div class='add'>+            } else if (locked_on[j]) {</div><div class='add'>+                output_matrix[i][j] = -input_matrix[i][j];</div><div class='add'>+                if (type == AFR_ENTRY_TRANSACTION)</div><div class='add'>+                    full_heal_mtx_out[i][j] = -full_heal_mtx_in[i][j];</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+        if (!pending[i])</div><div class='add'>+            output_dirty[i] = -input_dirty[i];</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+        if (!locked_on[i])</div><div class='add'>+            /* perform post-op only on subvols we had locked</div><div class='add'>+               and inspected on.</div><div class='add'>+            */</div><div class='add'>+            continue;</div><div class='add'>+        if (undid_pending[i])</div><div class='add'>+            /* We already unset the pending xattrs in</div><div class='add'>+             * _afr_fav_child_reset_sink_xattrs(). */</div><div class='add'>+            continue;</div><div class='add'>+</div><div class='add'>+        xattr = afr_selfheal_output_xattr(this, local-&gt;need_full_crawl, type,</div><div class='add'>+                                          output_dirty, output_matrix, i,</div><div class='add'>+                                          full_heal_mtx_out);</div><div class='add'>+        if (!xattr) {</div><div class='add'>+            continue;</div><div class='ctx'>         }</div><div class='ctx'> </div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='add'>+        if ((type == AFR_ENTRY_TRANSACTION) &amp;&amp; (priv-&gt;esh_granular)) {</div><div class='add'>+            if (xdata &amp;&amp; dict_set_int8(xdata, GF_XATTROP_PURGE_INDEX, 1))</div><div class='add'>+                gf_msg(this-&gt;name, GF_LOG_WARNING, 0, AFR_MSG_DICT_SET_FAILED,</div><div class='add'>+                       "Failed to set"</div><div class='add'>+                       " dict value for %s",</div><div class='add'>+                       GF_XATTROP_PURGE_INDEX);</div><div class='add'>+        }</div><div class='ctx'> </div><div class='add'>+        afr_selfheal_post_op(frame, this, inode, i, xattr, xdata);</div><div class='add'>+        dict_unref(xattr);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-static int</div><div class='del'>-afr_sh_wise_nodes_exist (afr_node_character *characters, int child_count)</div><div class='del'>-{</div><div class='del'>-        int i   = 0;</div><div class='del'>-        int ret = 0;</div><div class='add'>+    if (xdata)</div><div class='add'>+        dict_unref(xdata);</div><div class='ctx'> </div><div class='del'>-        for (i = 0; i &lt; child_count; i++) {</div><div class='del'>-                if (characters[i].type == AFR_NODE_WISE) {</div><div class='del'>-                        ret = 1;</div><div class='del'>-                        break;</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        return ret;</div><div class='add'>+void</div><div class='add'>+afr_reply_copy(struct afr_reply *dst, struct afr_reply *src)</div><div class='add'>+{</div><div class='add'>+    dict_t *xdata = NULL;</div><div class='add'>+</div><div class='add'>+    dst-&gt;valid = src-&gt;valid;</div><div class='add'>+    dst-&gt;op_ret = src-&gt;op_ret;</div><div class='add'>+    dst-&gt;op_errno = src-&gt;op_errno;</div><div class='add'>+    dst-&gt;prestat = src-&gt;prestat;</div><div class='add'>+    dst-&gt;poststat = src-&gt;poststat;</div><div class='add'>+    dst-&gt;preparent = src-&gt;preparent;</div><div class='add'>+    dst-&gt;postparent = src-&gt;postparent;</div><div class='add'>+    dst-&gt;preparent2 = src-&gt;preparent2;</div><div class='add'>+    dst-&gt;postparent2 = src-&gt;postparent2;</div><div class='add'>+    if (src-&gt;xdata)</div><div class='add'>+        xdata = dict_ref(src-&gt;xdata);</div><div class='add'>+    else</div><div class='add'>+        xdata = NULL;</div><div class='add'>+    if (dst-&gt;xdata)</div><div class='add'>+        dict_unref(dst-&gt;xdata);</div><div class='add'>+    dst-&gt;xdata = xdata;</div><div class='add'>+    if (xdata &amp;&amp; dict_get_str_boolean(xdata, "fips-mode-rchecksum",</div><div class='add'>+                                      _gf_false) == _gf_true) {</div><div class='add'>+        memcpy(dst-&gt;checksum, src-&gt;checksum, SHA256_DIGEST_LENGTH);</div><div class='add'>+    } else {</div><div class='add'>+        memcpy(dst-&gt;checksum, src-&gt;checksum, MD5_DIGEST_LENGTH);</div><div class='add'>+    }</div><div class='add'>+    dst-&gt;fips_mode_rchecksum = src-&gt;fips_mode_rchecksum;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+void</div><div class='add'>+afr_replies_copy(struct afr_reply *dst, struct afr_reply *src, int count)</div><div class='add'>+{</div><div class='add'>+    int i = 0;</div><div class='ctx'> </div><div class='del'>-/*</div><div class='del'>- * The 'wisdom' of a wise node is 0 if any other wise node accuses it.</div><div class='del'>- * It is 1 if no other wise node accuses it. </div><div class='del'>- * Only wise nodes with wisdom 1 are sources.</div><div class='del'>- *</div><div class='del'>- * If no nodes with wisdom 1 exist, a split-brain has occured.</div><div class='del'>- */</div><div class='add'>+    if (dst == src)</div><div class='add'>+        return;</div><div class='ctx'> </div><div class='del'>-static void</div><div class='del'>-afr_sh_compute_wisdom (int32_t *pending_matrix[],</div><div class='del'>-                       afr_node_character characters[], int child_count)</div><div class='del'>-{</div><div class='del'>-        int i = 0;</div><div class='del'>-        int j = 0;</div><div class='del'>-</div><div class='del'>-        for (i = 0; i &lt; child_count; i++) {</div><div class='del'>-                if (characters[i].type == AFR_NODE_WISE) {</div><div class='del'>-                        characters[i].wisdom = 1;</div><div class='del'>-</div><div class='del'>-                        for (j = 0; j &lt; child_count; j++) {</div><div class='del'>-                                if ((characters[j].type == AFR_NODE_WISE)</div><div class='del'>-                                    &amp;&amp; pending_matrix[j][i]) {</div><div class='del'>-                                        </div><div class='del'>-                                        characters[i].wisdom = 0;</div><div class='del'>-                                }</div><div class='del'>-                        }</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='add'>+    for (i = 0; i &lt; count; i++) {</div><div class='add'>+        afr_reply_copy(&amp;dst[i], &amp;src[i]);</div><div class='add'>+    }</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='del'>-static int</div><div class='del'>-afr_sh_wise_nodes_conflict (afr_node_character *characters, </div><div class='del'>-                            int child_count)</div><div class='add'>+int</div><div class='add'>+afr_selfheal_fill_dirty(xlator_t *this, int *dirty, int subvol, int idx,</div><div class='add'>+                        dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-        int i   = 0;</div><div class='del'>-        int ret = 1;</div><div class='add'>+    void *pending_raw = NULL;</div><div class='add'>+    int pending[3] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='ctx'> </div><div class='del'>-        for (i = 0; i &lt; child_count; i++) {</div><div class='del'>-                if ((characters[i].type == AFR_NODE_WISE)</div><div class='del'>-                    &amp;&amp; characters[i].wisdom == 1) {</div><div class='add'>+    if (!dirty)</div><div class='add'>+        return 0;</div><div class='ctx'> </div><div class='del'>-                        /* There is atleast one bona-fide wise node */</div><div class='del'>-                        ret = 0;</div><div class='del'>-                        break;</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='add'>+    if (dict_get_ptr(xdata, AFR_DIRTY, &amp;pending_raw))</div><div class='add'>+        return -1;</div><div class='ctx'> </div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='add'>+    if (!pending_raw)</div><div class='add'>+        return -1;</div><div class='ctx'> </div><div class='add'>+    memcpy(pending, pending_raw, sizeof(pending));</div><div class='ctx'> </div><div class='del'>-static int</div><div class='del'>-afr_sh_mark_wisest_as_sources (int sources[], </div><div class='del'>-                               afr_node_character *characters, </div><div class='del'>-                               int child_count)</div><div class='del'>-{</div><div class='del'>-        int nsources = 0;</div><div class='del'>-        </div><div class='del'>-        int i = 0;</div><div class='del'>-</div><div class='del'>-        for (i = 0; i &lt; child_count; i++) {</div><div class='del'>-                if (characters[i].wisdom == 1) {</div><div class='del'>-                        sources[i] = 1;</div><div class='del'>-                        nsources++;</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='add'>+    dirty[subvol] = ntoh32(pending[idx]);</div><div class='ctx'> </div><div class='del'>-        return nsources;</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='del'>-static int</div><div class='del'>-afr_sh_mark_if_size_differs (afr_self_heal_t *sh, int child_count)</div><div class='add'>+int</div><div class='add'>+afr_selfheal_fill_matrix(xlator_t *this, int **matrix, int subvol, int idx,</div><div class='add'>+                         dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-        int32_t ** pending_matrix;</div><div class='del'>-        int i, j;</div><div class='add'>+    int i = 0;</div><div class='add'>+    void *pending_raw = NULL;</div><div class='add'>+    int pending[3] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='ctx'> </div><div class='del'>-        int size_differs = 0;</div><div class='add'>+    priv = this-&gt;private;</div><div class='ctx'> </div><div class='del'>-        pending_matrix = sh-&gt;pending_matrix;</div><div class='add'>+    if (!matrix)</div><div class='add'>+        return 0;</div><div class='ctx'> </div><div class='del'>-        for (i = 0; i &lt; child_count; i++) {</div><div class='del'>-                for (j = 0; j &lt; child_count; j++) {</div><div class='del'>-                        if (!sh-&gt;buf)</div><div class='del'>-                                break;</div><div class='add'>+    for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+        if (dict_get_ptr(xdata, priv-&gt;pending_key[i], &amp;pending_raw))</div><div class='add'>+            continue;</div><div class='ctx'> </div><div class='del'>-                        if (SIZE_DIFFERS (&amp;sh-&gt;buf[i], &amp;sh-&gt;buf[j])</div><div class='del'>-                            &amp;&amp; (pending_matrix[i][j] == 0)</div><div class='del'>-                            &amp;&amp; (pending_matrix[j][i] == 0)) {</div><div class='add'>+        if (!pending_raw)</div><div class='add'>+            continue;</div><div class='ctx'> </div><div class='del'>-                                pending_matrix[i][j] = 1;</div><div class='del'>-                                pending_matrix[j][i] = 1;</div><div class='add'>+        memcpy(pending, pending_raw, sizeof(pending));</div><div class='ctx'> </div><div class='del'>-                                size_differs = 1;</div><div class='del'>-                        }</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='add'>+        matrix[subvol][i] = ntoh32(pending[idx]);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        return size_differs;</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-        </div><div class='del'>-static int</div><div class='del'>-afr_sh_mark_biggest_fool_as_source (afr_self_heal_t *sh,</div><div class='del'>-                                    afr_node_character *characters, </div><div class='del'>-                                    int child_count)</div><div class='add'>+int</div><div class='add'>+afr_selfheal_extract_xattr(xlator_t *this, struct afr_reply *replies,</div><div class='add'>+                           afr_transaction_type type, int *dirty, int **matrix)</div><div class='ctx'> {</div><div class='del'>-        int i = 0;</div><div class='del'>-        int biggest = 0;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    int i = 0;</div><div class='add'>+    dict_t *xdata = NULL;</div><div class='add'>+    int idx = -1;</div><div class='ctx'> </div><div class='del'>-        for (i = 0; i &lt; child_count; i++) {</div><div class='del'>-                if (characters[i].type == AFR_NODE_FOOL) {</div><div class='del'>-                        biggest = i;</div><div class='del'>-                        break;</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='add'>+    idx = afr_index_for_transaction_type(type);</div><div class='ctx'> </div><div class='del'>-        for (i = 0; i &lt; child_count; i++) {</div><div class='del'>-                if (characters[i].type != AFR_NODE_FOOL)</div><div class='del'>-                        continue;</div><div class='add'>+    priv = this-&gt;private;</div><div class='ctx'> </div><div class='del'>-                if (!sh-&gt;buf)</div><div class='del'>-                        break;</div><div class='add'>+    for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+        if (!replies[i].valid || replies[i].op_ret != 0)</div><div class='add'>+            continue;</div><div class='ctx'> </div><div class='del'>-                if (SIZE_GREATER (&amp;sh-&gt;buf[i], &amp;sh-&gt;buf[biggest])) {</div><div class='del'>-                        biggest = i;</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='add'>+        if (!replies[i].xdata)</div><div class='add'>+            continue;</div><div class='ctx'> </div><div class='del'>-        sh-&gt;sources[biggest] = 1;</div><div class='add'>+        xdata = replies[i].xdata;</div><div class='ctx'> </div><div class='del'>-        return 1;</div><div class='del'>-}</div><div class='add'>+        afr_selfheal_fill_dirty(this, dirty, i, idx, xdata);</div><div class='add'>+        afr_selfheal_fill_matrix(this, matrix, i, idx, xdata);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-static int</div><div class='del'>-afr_sh_mark_biggest_as_source (afr_self_heal_t *sh, int child_count)</div><div class='add'>+/*</div><div class='add'>+ * If by chance there are multiple sources with differing sizes, select</div><div class='add'>+ * the largest file as the source.</div><div class='add'>+ *</div><div class='add'>+ * This can happen if data was directly modified in the backend or for snapshots</div><div class='add'>+ */</div><div class='add'>+void</div><div class='add'>+afr_mark_largest_file_as_source(xlator_t *this, unsigned char *sources,</div><div class='add'>+                                struct afr_reply *replies)</div><div class='ctx'> {</div><div class='del'>-        int biggest = 0;</div><div class='del'>-        int i;</div><div class='del'>-</div><div class='del'>-        for (i = 0; i &lt; child_count; i++) {</div><div class='del'>-                if (!sh-&gt;buf)</div><div class='del'>-                        break;</div><div class='add'>+    int i = 0;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    uint64_t size = 0;</div><div class='add'>+</div><div class='add'>+    /* Find source with biggest file size */</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+    for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+        if (!sources[i])</div><div class='add'>+            continue;</div><div class='add'>+        if (!replies[i].valid || replies[i].op_ret != 0) {</div><div class='add'>+            sources[i] = 0;</div><div class='add'>+            continue;</div><div class='add'>+        }</div><div class='add'>+        if (size &lt;= replies[i].poststat.ia_size) {</div><div class='add'>+            size = replies[i].poststat.ia_size;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Mark sources with less size as not source */</div><div class='add'>+    for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+        if (!sources[i])</div><div class='add'>+            continue;</div><div class='add'>+        if (size &gt; replies[i].poststat.ia_size)</div><div class='add'>+            sources[i] = 0;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-                if (SIZE_GREATER (&amp;sh-&gt;buf[i], &amp;sh-&gt;buf[biggest])) {</div><div class='del'>-                        biggest = i;</div><div class='del'>-                }</div><div class='add'>+void</div><div class='add'>+afr_mark_latest_mtime_file_as_source(xlator_t *this, unsigned char *sources,</div><div class='add'>+                                     struct afr_reply *replies)</div><div class='add'>+{</div><div class='add'>+    int i = 0;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    uint32_t mtime = 0;</div><div class='add'>+    uint32_t mtime_nsec = 0;</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+    for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+        if (!sources[i])</div><div class='add'>+            continue;</div><div class='add'>+        if (!replies[i].valid || replies[i].op_ret != 0) {</div><div class='add'>+            sources[i] = 0;</div><div class='add'>+            continue;</div><div class='add'>+        }</div><div class='add'>+        if ((mtime &lt; replies[i].poststat.ia_mtime) ||</div><div class='add'>+            ((mtime == replies[i].poststat.ia_mtime) &amp;&amp;</div><div class='add'>+             (mtime_nsec &lt; replies[i].poststat.ia_mtime_nsec))) {</div><div class='add'>+            mtime = replies[i].poststat.ia_mtime;</div><div class='add'>+            mtime_nsec = replies[i].poststat.ia_mtime_nsec;</div><div class='ctx'>         }</div><div class='add'>+    }</div><div class='add'>+    for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+        if (!sources[i])</div><div class='add'>+            continue;</div><div class='add'>+        if ((mtime &gt; replies[i].poststat.ia_mtime) ||</div><div class='add'>+            ((mtime == replies[i].poststat.ia_mtime) &amp;&amp;</div><div class='add'>+             (mtime_nsec &gt; replies[i].poststat.ia_mtime_nsec))) {</div><div class='add'>+            sources[i] = 0;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+afr_mark_active_sinks(xlator_t *this, unsigned char *sources,</div><div class='add'>+                      unsigned char *locked_on, unsigned char *sinks)</div><div class='add'>+{</div><div class='add'>+    int i = 0;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='ctx'> </div><div class='del'>-        sh-&gt;sources[biggest] = 1;</div><div class='add'>+    priv = this-&gt;private;</div><div class='ctx'> </div><div class='del'>-        return 1;</div><div class='add'>+    for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+        if (!sources[i] &amp;&amp; locked_on[i])</div><div class='add'>+            sinks[i] = 1;</div><div class='add'>+        else</div><div class='add'>+            sinks[i] = 0;</div><div class='add'>+    }</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+gf_boolean_t</div><div class='add'>+afr_dict_contains_heal_op(call_frame_t *frame)</div><div class='add'>+{</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    dict_t *xdata_req = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    int heal_op = -1;</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    xdata_req = local-&gt;xdata_req;</div><div class='add'>+    ret = dict_get_int32_sizen(xdata_req, "heal-op", &amp;heal_op);</div><div class='add'>+    if (ret)</div><div class='add'>+        return _gf_false;</div><div class='add'>+    if (local-&gt;xdata_rsp == NULL) {</div><div class='add'>+        local-&gt;xdata_rsp = dict_new();</div><div class='add'>+        if (!local-&gt;xdata_rsp)</div><div class='add'>+            return _gf_true;</div><div class='add'>+    }</div><div class='add'>+    ret = dict_set_sizen_str_sizen(local-&gt;xdata_rsp, "sh-fail-msg",</div><div class='add'>+                                   SFILE_NOT_IN_SPLIT_BRAIN);</div><div class='add'>+</div><div class='add'>+    return _gf_true;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-static int</div><div class='del'>-afr_sh_mark_loweia_uid_as_source (afr_self_heal_t *sh, int child_count)</div><div class='add'>+gf_boolean_t</div><div class='add'>+afr_can_decide_split_brain_source_sinks(struct afr_reply *replies,</div><div class='add'>+                                        int child_count)</div><div class='ctx'> {</div><div class='del'>-        uid_t smallest = 0;</div><div class='del'>-        int i;</div><div class='add'>+    int i = 0;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; child_count; i++)</div><div class='add'>+        if (replies[i].valid != 1 || replies[i].op_ret != 0)</div><div class='add'>+            return _gf_false;</div><div class='add'>+</div><div class='add'>+    return _gf_true;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        for (i = 0; i &lt; child_count; i++) {</div><div class='del'>-                if (!sh-&gt;buf)</div><div class='del'>-                        break;</div><div class='add'>+int</div><div class='add'>+afr_mark_split_brain_source_sinks_by_heal_op(</div><div class='add'>+    call_frame_t *frame, xlator_t *this, unsigned char *sources,</div><div class='add'>+    unsigned char *sinks, unsigned char *healed_sinks, unsigned char *locked_on,</div><div class='add'>+    struct afr_reply *replies, afr_transaction_type type, int heal_op)</div><div class='add'>+{</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    dict_t *xdata_req = NULL;</div><div class='add'>+    dict_t *xdata_rsp = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    int i = 0;</div><div class='add'>+    char *name = NULL;</div><div class='add'>+    int source = -1;</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+    xdata_req = local-&gt;xdata_req;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+        if (locked_on[i])</div><div class='add'>+            if (sources[i] || !sinks[i] || !healed_sinks[i]) {</div><div class='add'>+                ret = -1;</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+    }</div><div class='add'>+    if (local-&gt;xdata_rsp == NULL) {</div><div class='add'>+        local-&gt;xdata_rsp = dict_new();</div><div class='add'>+        if (!local-&gt;xdata_rsp) {</div><div class='add'>+            ret = -1;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    xdata_rsp = local-&gt;xdata_rsp;</div><div class='add'>+</div><div class='add'>+    if (!afr_can_decide_split_brain_source_sinks(replies, priv-&gt;child_count)) {</div><div class='add'>+        ret = dict_set_sizen_str_sizen(xdata_rsp, "sh-fail-msg",</div><div class='add'>+                                       SBRAIN_HEAL_NO_GO_MSG);</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; priv-&gt;child_count; i++)</div><div class='add'>+        if (locked_on[i])</div><div class='add'>+            sources[i] = 1;</div><div class='add'>+    switch (heal_op) {</div><div class='add'>+        case GF_SHD_OP_SBRAIN_HEAL_FROM_BIGGER_FILE:</div><div class='add'>+            if (type == AFR_METADATA_TRANSACTION) {</div><div class='add'>+                ret = dict_set_sizen_str_sizen(xdata_rsp, "sh-fail-msg",</div><div class='add'>+                                               SUSE_SOURCE_BRICK_TO_HEAL);</div><div class='add'>+                if (!ret)</div><div class='add'>+                    ret = -1;</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+            afr_mark_largest_file_as_source(this, sources, replies);</div><div class='add'>+            if (AFR_COUNT(sources, priv-&gt;child_count) != 1) {</div><div class='add'>+                ret = dict_set_sizen_str_sizen(xdata_rsp, "sh-fail-msg",</div><div class='add'>+                                               SNO_BIGGER_FILE);</div><div class='add'>+                if (!ret)</div><div class='add'>+                    ret = -1;</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+            break;</div><div class='add'>+        case GF_SHD_OP_SBRAIN_HEAL_FROM_LATEST_MTIME:</div><div class='add'>+            if (type == AFR_METADATA_TRANSACTION) {</div><div class='add'>+                ret = dict_set_sizen_str_sizen(xdata_rsp, "sh-fail-msg",</div><div class='add'>+                                               SUSE_SOURCE_BRICK_TO_HEAL);</div><div class='add'>+                if (!ret)</div><div class='add'>+                    ret = -1;</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+            afr_mark_latest_mtime_file_as_source(this, sources, replies);</div><div class='add'>+            if (AFR_COUNT(sources, priv-&gt;child_count) != 1) {</div><div class='add'>+                ret = dict_set_sizen_str_sizen(xdata_rsp, "sh-fail-msg",</div><div class='add'>+                                               SNO_DIFF_IN_MTIME);</div><div class='add'>+                if (!ret)</div><div class='add'>+                    ret = -1;</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+            break;</div><div class='add'>+        case GF_SHD_OP_SBRAIN_HEAL_FROM_BRICK:</div><div class='add'>+            ret = dict_get_str_sizen(xdata_req, "child-name", &amp;name);</div><div class='add'>+            if (ret)</div><div class='add'>+                goto out;</div><div class='add'>+            source = afr_get_child_index_from_name(this, name);</div><div class='add'>+            if (source &lt; 0) {</div><div class='add'>+                ret = dict_set_sizen_str_sizen(xdata_rsp, "sh-fail-msg",</div><div class='add'>+                                               SINVALID_BRICK_NAME);</div><div class='add'>+                if (!ret)</div><div class='add'>+                    ret = -1;</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+            if (locked_on[source] != 1) {</div><div class='add'>+                ret = dict_set_sizen_str_sizen(xdata_rsp, "sh-fail-msg",</div><div class='add'>+                                               SBRICK_IS_NOT_UP);</div><div class='add'>+                if (!ret)</div><div class='add'>+                    ret = -1;</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+            memset(sources, 0, sizeof(*sources) * priv-&gt;child_count);</div><div class='add'>+            sources[source] = 1;</div><div class='add'>+            break;</div><div class='add'>+        default:</div><div class='add'>+            ret = -1;</div><div class='add'>+            goto out;</div><div class='add'>+    }</div><div class='add'>+    for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+        if (sources[i]) {</div><div class='add'>+            source = i;</div><div class='add'>+            break;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    sinks[source] = 0;</div><div class='add'>+    healed_sinks[source] = 0;</div><div class='add'>+    ret = source;</div><div class='add'>+out:</div><div class='add'>+    if (ret &lt; 0)</div><div class='add'>+        memset(sources, 0, sizeof(*sources) * priv-&gt;child_count);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-                if (sh-&gt;buf[i].ia_uid &lt; sh-&gt;buf[smallest].ia_uid) {</div><div class='del'>-                        smallest = i;</div><div class='add'>+int</div><div class='add'>+afr_sh_fav_by_majority(xlator_t *this, struct afr_reply *replies,</div><div class='add'>+                       inode_t *inode)</div><div class='add'>+{</div><div class='add'>+    afr_private_t *priv;</div><div class='add'>+    int vote_count = -1;</div><div class='add'>+    int fav_child = -1;</div><div class='add'>+    int i = 0;</div><div class='add'>+    int k = 0;</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+        if (replies[i].valid == 1) {</div><div class='add'>+            gf_msg_debug(this-&gt;name, 0,</div><div class='add'>+                         "Child:%s mtime_sec = %" PRId64 ", size = %" PRIu64</div><div class='add'>+                         " for gfid %s",</div><div class='add'>+                         priv-&gt;children[i]-&gt;name, replies[i].poststat.ia_mtime,</div><div class='add'>+                         replies[i].poststat.ia_size, uuid_utoa(inode-&gt;gfid));</div><div class='add'>+            vote_count = 0;</div><div class='add'>+            for (k = 0; k &lt; priv-&gt;child_count; k++) {</div><div class='add'>+                if ((replies[k].poststat.ia_mtime ==</div><div class='add'>+                     replies[i].poststat.ia_mtime) &amp;&amp;</div><div class='add'>+                    (replies[k].poststat.ia_size ==</div><div class='add'>+                     replies[i].poststat.ia_size)) {</div><div class='add'>+                    vote_count++;</div><div class='ctx'>                 }</div><div class='add'>+            }</div><div class='add'>+            if (vote_count &gt; priv-&gt;child_count / 2) {</div><div class='add'>+                fav_child = i;</div><div class='add'>+                break;</div><div class='add'>+            }</div><div class='ctx'>         }</div><div class='add'>+    }</div><div class='add'>+    return fav_child;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        sh-&gt;sources[smallest] = 1;</div><div class='add'>+/*</div><div class='add'>+ * afr_sh_fav_by_mtime: Choose favorite child by mtime.</div><div class='add'>+ */</div><div class='add'>+int</div><div class='add'>+afr_sh_fav_by_mtime(xlator_t *this, struct afr_reply *replies, inode_t *inode)</div><div class='add'>+{</div><div class='add'>+    afr_private_t *priv;</div><div class='add'>+    int fav_child = -1;</div><div class='add'>+    int i = 0;</div><div class='add'>+    uint32_t cmp_mtime = 0;</div><div class='add'>+    uint32_t cmp_mtime_nsec = 0;</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+        if (replies[i].valid == 1) {</div><div class='add'>+            gf_msg_debug(this-&gt;name, 0,</div><div class='add'>+                         "Child:%s mtime = %" PRId64</div><div class='add'>+                         ", mtime_nsec = %d for "</div><div class='add'>+                         "gfid %s",</div><div class='add'>+                         priv-&gt;children[i]-&gt;name, replies[i].poststat.ia_mtime,</div><div class='add'>+                         replies[i].poststat.ia_mtime_nsec,</div><div class='add'>+                         uuid_utoa(inode-&gt;gfid));</div><div class='add'>+            if (replies[i].poststat.ia_mtime &gt; cmp_mtime) {</div><div class='add'>+                cmp_mtime = replies[i].poststat.ia_mtime;</div><div class='add'>+                cmp_mtime_nsec = replies[i].poststat.ia_mtime_nsec;</div><div class='add'>+                fav_child = i;</div><div class='add'>+            } else if ((replies[i].poststat.ia_mtime == cmp_mtime) &amp;&amp;</div><div class='add'>+                       (replies[i].poststat.ia_mtime_nsec &gt; cmp_mtime_nsec)) {</div><div class='add'>+                cmp_mtime = replies[i].poststat.ia_mtime;</div><div class='add'>+                cmp_mtime_nsec = replies[i].poststat.ia_mtime_nsec;</div><div class='add'>+                fav_child = i;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    return fav_child;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        return 1;</div><div class='add'>+/*</div><div class='add'>+ * afr_sh_fav_by_ctime: Choose favorite child by ctime.</div><div class='add'>+ */</div><div class='add'>+int</div><div class='add'>+afr_sh_fav_by_ctime(xlator_t *this, struct afr_reply *replies, inode_t *inode)</div><div class='add'>+{</div><div class='add'>+    afr_private_t *priv;</div><div class='add'>+    int fav_child = -1;</div><div class='add'>+    int i = 0;</div><div class='add'>+    uint32_t cmp_ctime = 0;</div><div class='add'>+    uint32_t cmp_ctime_nsec = 0;</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+        if (replies[i].valid == 1) {</div><div class='add'>+            gf_msg_debug(this-&gt;name, 0,</div><div class='add'>+                         "Child:%s ctime = %" PRId64</div><div class='add'>+                         ", ctime_nsec = %d for "</div><div class='add'>+                         "gfid %s",</div><div class='add'>+                         priv-&gt;children[i]-&gt;name, replies[i].poststat.ia_ctime,</div><div class='add'>+                         replies[i].poststat.ia_ctime_nsec,</div><div class='add'>+                         uuid_utoa(inode-&gt;gfid));</div><div class='add'>+            if (replies[i].poststat.ia_ctime &gt; cmp_ctime) {</div><div class='add'>+                cmp_ctime = replies[i].poststat.ia_ctime;</div><div class='add'>+                cmp_ctime_nsec = replies[i].poststat.ia_ctime_nsec;</div><div class='add'>+                fav_child = i;</div><div class='add'>+            } else if ((replies[i].poststat.ia_ctime == cmp_ctime) &amp;&amp;</div><div class='add'>+                       (replies[i].poststat.ia_ctime_nsec &gt; cmp_ctime_nsec)) {</div><div class='add'>+                cmp_ctime = replies[i].poststat.ia_ctime;</div><div class='add'>+                cmp_ctime_nsec = replies[i].poststat.ia_ctime_nsec;</div><div class='add'>+                fav_child = i;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    return fav_child;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+/*</div><div class='add'>+ * afr_sh_fav_by_size: Choose favorite child by size</div><div class='add'>+ * when not all files are of zero size.</div><div class='add'>+ */</div><div class='add'>+int</div><div class='add'>+afr_sh_fav_by_size(xlator_t *this, struct afr_reply *replies, inode_t *inode)</div><div class='add'>+{</div><div class='add'>+    afr_private_t *priv;</div><div class='add'>+    int fav_child = -1;</div><div class='add'>+    int i = 0;</div><div class='add'>+    uint64_t cmp_sz = 0;</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+    for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+        if (!replies[i].valid) {</div><div class='add'>+            continue;</div><div class='add'>+        }</div><div class='add'>+        gf_msg_debug(this-&gt;name, 0,</div><div class='add'>+                     "Child:%s file size = %" PRIu64 " for gfid %s",</div><div class='add'>+                     priv-&gt;children[i]-&gt;name, replies[i].poststat.ia_size,</div><div class='add'>+                     uuid_utoa(inode-&gt;gfid));</div><div class='add'>+        if (replies[i].poststat.ia_type == IA_IFDIR) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, 0, AFR_MSG_SBRAIN_FAV_CHILD_POLICY,</div><div class='add'>+                   "Cannot perform selfheal on %s. "</div><div class='add'>+                   "Size policy is not applicable to directories.",</div><div class='add'>+                   uuid_utoa(inode-&gt;gfid));</div><div class='add'>+            break;</div><div class='add'>+        }</div><div class='add'>+        if (replies[i].poststat.ia_size &gt; cmp_sz) {</div><div class='add'>+            cmp_sz = replies[i].poststat.ia_size;</div><div class='add'>+            fav_child = i;</div><div class='add'>+        } else if (replies[i].poststat.ia_size == cmp_sz) {</div><div class='add'>+            fav_child = -1;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    if (fav_child == -1) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_ERROR, 0, AFR_MSG_SPLIT_BRAIN,</div><div class='add'>+               "No bigger file");</div><div class='add'>+    }</div><div class='add'>+    return fav_child;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-afr_sh_mark_sources (afr_self_heal_t *sh, int child_count,</div><div class='del'>-                     afr_self_heal_type type)</div><div class='add'>+afr_sh_get_fav_by_policy(xlator_t *this, struct afr_reply *replies,</div><div class='add'>+                         inode_t *inode, char **policy_str)</div><div class='ctx'> {</div><div class='del'>-	int i = 0;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    int fav_child = -1;</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+    if (!afr_can_decide_split_brain_source_sinks(replies, priv-&gt;child_count)) {</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    switch (priv-&gt;fav_child_policy) {</div><div class='add'>+        case AFR_FAV_CHILD_BY_SIZE:</div><div class='add'>+            fav_child = afr_sh_fav_by_size(this, replies, inode);</div><div class='add'>+            if (policy_str &amp;&amp; fav_child &gt;= 0) {</div><div class='add'>+                *policy_str = "SIZE";</div><div class='add'>+            }</div><div class='add'>+            break;</div><div class='add'>+        case AFR_FAV_CHILD_BY_CTIME:</div><div class='add'>+            fav_child = afr_sh_fav_by_ctime(this, replies, inode);</div><div class='add'>+            if (policy_str &amp;&amp; fav_child &gt;= 0) {</div><div class='add'>+                *policy_str = "CTIME";</div><div class='add'>+            }</div><div class='add'>+            break;</div><div class='add'>+        case AFR_FAV_CHILD_BY_MTIME:</div><div class='add'>+            fav_child = afr_sh_fav_by_mtime(this, replies, inode);</div><div class='add'>+            if (policy_str &amp;&amp; fav_child &gt;= 0) {</div><div class='add'>+                *policy_str = "MTIME";</div><div class='add'>+            }</div><div class='add'>+            break;</div><div class='add'>+        case AFR_FAV_CHILD_BY_MAJORITY:</div><div class='add'>+            fav_child = afr_sh_fav_by_majority(this, replies, inode);</div><div class='add'>+            if (policy_str &amp;&amp; fav_child &gt;= 0) {</div><div class='add'>+                *policy_str = "MAJORITY";</div><div class='add'>+            }</div><div class='add'>+            break;</div><div class='add'>+        case AFR_FAV_CHILD_NONE:</div><div class='add'>+        default:</div><div class='add'>+            break;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return fav_child;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        int32_t ** pending_matrix;</div><div class='del'>-        int *      sources;</div><div class='add'>+int</div><div class='add'>+afr_mark_split_brain_source_sinks_by_policy(</div><div class='add'>+    call_frame_t *frame, xlator_t *this, inode_t *inode, unsigned char *sources,</div><div class='add'>+    unsigned char *sinks, unsigned char *healed_sinks, unsigned char *locked_on,</div><div class='add'>+    struct afr_reply *replies, afr_transaction_type type)</div><div class='add'>+{</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    int fav_child = -1;</div><div class='add'>+    char mtime_str[256];</div><div class='add'>+    char ctime_str[256];</div><div class='add'>+    char *policy_str = NULL;</div><div class='add'>+    struct tm *tm_ptr;</div><div class='add'>+    time_t time;</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    fav_child = afr_sh_get_fav_by_policy(this, replies, inode, &amp;policy_str);</div><div class='add'>+    if (fav_child == -1) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_ERROR, 0, AFR_MSG_SBRAIN_FAV_CHILD_POLICY,</div><div class='add'>+               "No child selected by favorite-child policy.");</div><div class='add'>+    } else if (fav_child &gt; priv-&gt;child_count - 1) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_ERROR, 0, AFR_MSG_SBRAIN_FAV_CHILD_POLICY,</div><div class='add'>+               "Invalid child (%d) "</div><div class='add'>+               "selected by policy %s.",</div><div class='add'>+               fav_child, policy_str);</div><div class='add'>+    } else if (fav_child &gt;= 0) {</div><div class='add'>+        time = replies[fav_child].poststat.ia_mtime;</div><div class='add'>+        tm_ptr = localtime(&amp;time);</div><div class='add'>+        strftime(mtime_str, sizeof(mtime_str), "%Y-%m-%d %H:%M:%S", tm_ptr);</div><div class='add'>+        time = replies[fav_child].poststat.ia_ctime;</div><div class='add'>+        tm_ptr = localtime(&amp;time);</div><div class='add'>+        strftime(ctime_str, sizeof(ctime_str), "%Y-%m-%d %H:%M:%S", tm_ptr);</div><div class='add'>+</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_WARNING, 0, AFR_MSG_SBRAIN_FAV_CHILD_POLICY,</div><div class='add'>+               "Source %s selected as authentic to resolve conflicting data "</div><div class='add'>+               "in file (gfid:%s) by %s (%" PRIu64</div><div class='add'>+               " bytes @ %s mtime, %s "</div><div class='add'>+               "ctime).",</div><div class='add'>+               priv-&gt;children[fav_child]-&gt;name, uuid_utoa(inode-&gt;gfid),</div><div class='add'>+               policy_str, replies[fav_child].poststat.ia_size, mtime_str,</div><div class='add'>+               ctime_str);</div><div class='add'>+</div><div class='add'>+        sources[fav_child] = 1;</div><div class='add'>+        sinks[fav_child] = 0;</div><div class='add'>+        healed_sinks[fav_child] = 0;</div><div class='add'>+    }</div><div class='add'>+    return fav_child;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        int size_differs = 0;</div><div class='add'>+gf_boolean_t</div><div class='add'>+afr_is_file_empty_on_all_children(afr_private_t *priv,</div><div class='add'>+                                  struct afr_reply *replies)</div><div class='add'>+{</div><div class='add'>+    int i = 0;</div><div class='ctx'> </div><div class='del'>-        pending_matrix = sh-&gt;pending_matrix;</div><div class='del'>-        sources        = sh-&gt;sources;</div><div class='add'>+    for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+        if ((!replies[i].valid) || (replies[i].op_ret != 0) ||</div><div class='add'>+            (replies[i].poststat.ia_size != 0))</div><div class='add'>+            return _gf_false;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	int nsources = 0;</div><div class='add'>+    return _gf_true;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        /* stores the 'characters' (innocent, fool, wise) of the nodes */</div><div class='del'>-        afr_node_character *</div><div class='del'>-                characters = GF_CALLOC (sizeof (afr_node_character), </div><div class='del'>-                                        child_count,</div><div class='del'>-                                        gf_afr_mt_afr_node_character) ;</div><div class='add'>+int</div><div class='add'>+afr_mark_source_sinks_if_file_empty(xlator_t *this, unsigned char *sources,</div><div class='add'>+                                    unsigned char *sinks,</div><div class='add'>+                                    unsigned char *healed_sinks,</div><div class='add'>+                                    unsigned char *locked_on,</div><div class='add'>+                                    struct afr_reply *replies,</div><div class='add'>+                                    afr_transaction_type type)</div><div class='add'>+{</div><div class='add'>+    int source = -1;</div><div class='add'>+    int i = 0;</div><div class='add'>+    afr_private_t *priv = this-&gt;private;</div><div class='add'>+    struct iatt stbuf = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    if ((AFR_COUNT(locked_on, priv-&gt;child_count) &lt; priv-&gt;child_count) ||</div><div class='add'>+        (afr_success_count(replies, priv-&gt;child_count) &lt; priv-&gt;child_count))</div><div class='add'>+        return -1;</div><div class='add'>+</div><div class='add'>+    if (type == AFR_DATA_TRANSACTION) {</div><div class='add'>+        if (!afr_is_file_empty_on_all_children(priv, replies))</div><div class='add'>+            return -1;</div><div class='add'>+        goto mark;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /*For AFR_METADATA_TRANSACTION, metadata must be same on all bricks.*/</div><div class='add'>+    stbuf = replies[0].poststat;</div><div class='add'>+    for (i = 1; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+        if ((!IA_EQUAL(stbuf, replies[i].poststat, type)) ||</div><div class='add'>+            (!IA_EQUAL(stbuf, replies[i].poststat, uid)) ||</div><div class='add'>+            (!IA_EQUAL(stbuf, replies[i].poststat, gid)) ||</div><div class='add'>+            (!IA_EQUAL(stbuf, replies[i].poststat, prot)))</div><div class='add'>+            return -1;</div><div class='add'>+    }</div><div class='add'>+    for (i = 1; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+        if (!afr_xattrs_are_equal(replies[0].xdata, replies[i].xdata))</div><div class='add'>+            return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+mark:</div><div class='add'>+    /* data/metadata is same on all bricks. Pick one of them as source. Rest</div><div class='add'>+     * are sinks.*/</div><div class='add'>+    for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+        if (source == -1) {</div><div class='add'>+            source = i;</div><div class='add'>+            sources[i] = 1;</div><div class='add'>+            sinks[i] = 0;</div><div class='add'>+            healed_sinks[i] = 0;</div><div class='add'>+            continue;</div><div class='add'>+        }</div><div class='add'>+        sources[i] = 0;</div><div class='add'>+        sinks[i] = 1;</div><div class='add'>+        healed_sinks[i] = 1;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	/* start clean */</div><div class='del'>-	for (i = 0; i &lt; child_count; i++) {</div><div class='del'>-		sources[i] = 0;</div><div class='del'>-	}</div><div class='del'>-        </div><div class='del'>-        for (i = 0; i &lt; child_count; i++) {</div><div class='del'>-                if (afr_sh_is_innocent (pending_matrix[i], child_count)) {</div><div class='del'>-                        characters[i].type = AFR_NODE_INNOCENT;</div><div class='add'>+    return source;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-                } else if (afr_sh_is_fool (pending_matrix[i], i, child_count)) {</div><div class='del'>-                        characters[i].type = AFR_NODE_FOOL;</div><div class='add'>+/* Return a source depending on the type of heal_op, and set sources[source],</div><div class='add'>+ * sinks[source] and healed_sinks[source] to 1, 0 and 0 respectively. Do so</div><div class='add'>+ * only if the following condition is met:</div><div class='add'>+ * âˆ€i((i âˆˆ locked_on[] âˆ§ i=1)==&gt;(sources[i]=0 âˆ§ sinks[i]=1 âˆ§ healed_sinks[i]=1))</div><div class='add'>+ * i.e. for each locked node, sources[node] is 0; healed_sinks[node] and</div><div class='add'>+ * sinks[node] are 1. This should be the case if the file is in split-brain.</div><div class='add'>+ */</div><div class='add'>+int</div><div class='add'>+afr_mark_split_brain_source_sinks(</div><div class='add'>+    call_frame_t *frame, xlator_t *this, inode_t *inode, unsigned char *sources,</div><div class='add'>+    unsigned char *sinks, unsigned char *healed_sinks, unsigned char *locked_on,</div><div class='add'>+    struct afr_reply *replies, afr_transaction_type type)</div><div class='add'>+{</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    dict_t *xdata_req = NULL;</div><div class='add'>+    int heal_op = -1;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int source = -1;</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+    xdata_req = local-&gt;xdata_req;</div><div class='add'>+</div><div class='add'>+    source = afr_mark_source_sinks_if_file_empty(</div><div class='add'>+        this, sources, sinks, healed_sinks, locked_on, replies, type);</div><div class='add'>+    if (source &gt;= 0)</div><div class='add'>+        return source;</div><div class='add'>+</div><div class='add'>+    ret = dict_get_int32_sizen(xdata_req, "heal-op", &amp;heal_op);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto autoheal;</div><div class='add'>+</div><div class='add'>+    source = afr_mark_split_brain_source_sinks_by_heal_op(</div><div class='add'>+        frame, this, sources, sinks, healed_sinks, locked_on, replies, type,</div><div class='add'>+        heal_op);</div><div class='add'>+    return source;</div><div class='add'>+</div><div class='add'>+autoheal:</div><div class='add'>+    /* Automatically heal if fav_child_policy is set. */</div><div class='add'>+    if (priv-&gt;fav_child_policy != AFR_FAV_CHILD_NONE) {</div><div class='add'>+        source = afr_mark_split_brain_source_sinks_by_policy(</div><div class='add'>+            frame, this, inode, sources, sinks, healed_sinks, locked_on,</div><div class='add'>+            replies, type);</div><div class='add'>+        if (source != -1) {</div><div class='add'>+            ret = dict_set_int32_sizen(xdata_req, "fav-child-policy", 1);</div><div class='add'>+            if (ret)</div><div class='add'>+                return -1;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-                } else if (afr_sh_is_wise (pending_matrix[i], i, child_count)) {</div><div class='del'>-                        characters[i].type = AFR_NODE_WISE;</div><div class='add'>+    return source;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-                } else {</div><div class='del'>-                        gf_log ("[module:replicate]", GF_LOG_ERROR,</div><div class='del'>-                                "Could not determine the state of subvolume %d!"</div><div class='del'>-                                " (This message should never appear."</div><div class='del'>-                                " Please file a bug report to "</div><div class='del'>-                                "&lt;gluster-devel@nongnu.org&gt;.)", i);</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='add'>+int</div><div class='add'>+_afr_fav_child_reset_sink_xattrs(call_frame_t *frame, xlator_t *this,</div><div class='add'>+                                 inode_t *inode, int source,</div><div class='add'>+                                 unsigned char *healed_sinks,</div><div class='add'>+                                 unsigned char *undid_pending,</div><div class='add'>+                                 afr_transaction_type type,</div><div class='add'>+                                 unsigned char *locked_on,</div><div class='add'>+                                 struct afr_reply *replies)</div><div class='add'>+{</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    int *input_dirty = NULL;</div><div class='add'>+    int **input_matrix = NULL;</div><div class='add'>+    int *output_dirty = NULL;</div><div class='add'>+    int **output_matrix = NULL;</div><div class='add'>+    dict_t *xattr = NULL;</div><div class='add'>+    dict_t *xdata = NULL;</div><div class='add'>+    int i = 0;</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+</div><div class='add'>+    if (!dict_get_sizen(local-&gt;xdata_req, "fav-child-policy"))</div><div class='add'>+        return 0;</div><div class='ctx'> </div><div class='del'>-        if (type == AFR_SELF_HEAL_DATA) {</div><div class='del'>-                size_differs = afr_sh_mark_if_size_differs (sh, child_count);</div><div class='del'>-        }</div><div class='add'>+    xdata = dict_new();</div><div class='add'>+    if (!xdata)</div><div class='add'>+        return -1;</div><div class='ctx'> </div><div class='del'>-        if ((type == AFR_SELF_HEAL_METADATA)</div><div class='del'>-            &amp;&amp; afr_sh_all_nodes_innocent (characters, child_count)) {</div><div class='add'>+    input_dirty = alloca0(priv-&gt;child_count * sizeof(int));</div><div class='add'>+    input_matrix = ALLOC_MATRIX(priv-&gt;child_count, int);</div><div class='add'>+    output_dirty = alloca0(priv-&gt;child_count * sizeof(int));</div><div class='add'>+    output_matrix = ALLOC_MATRIX(priv-&gt;child_count, int);</div><div class='ctx'> </div><div class='del'>-                nsources = afr_sh_mark_loweia_uid_as_source (sh, child_count);</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='add'>+    afr_selfheal_extract_xattr(this, replies, type, input_dirty, input_matrix);</div><div class='ctx'> </div><div class='del'>-        if (afr_sh_all_nodes_innocent (characters, child_count)) {</div><div class='del'>-                if (size_differs) {</div><div class='del'>-                        nsources = afr_sh_mark_biggest_as_source (sh,</div><div class='del'>-                                                                  child_count);</div><div class='del'>-                }</div><div class='add'>+    for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+        if (i == source || !healed_sinks[i])</div><div class='add'>+            continue;</div><div class='add'>+        output_dirty[i] = -input_dirty[i];</div><div class='add'>+        output_matrix[i][source] = -input_matrix[i][source];</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        } else if (afr_sh_wise_nodes_exist (characters, child_count)) {</div><div class='del'>-                afr_sh_compute_wisdom (pending_matrix, characters, child_count);</div><div class='add'>+    for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+        if (!healed_sinks[i] || !locked_on[i])</div><div class='add'>+            continue;</div><div class='add'>+        xattr = afr_selfheal_output_xattr(this, _gf_false, type, output_dirty,</div><div class='add'>+                                          output_matrix, i, NULL);</div><div class='ctx'> </div><div class='del'>-                if (afr_sh_wise_nodes_conflict (characters, child_count)) {</div><div class='del'>-                        /* split-brain */</div><div class='add'>+        afr_selfheal_post_op(frame, this, inode, i, xattr, xdata);</div><div class='ctx'> </div><div class='del'>-                        nsources = -1;</div><div class='del'>-                        goto out;</div><div class='add'>+        undid_pending[i] = 1;</div><div class='add'>+        dict_unref(xattr);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-                } else {</div><div class='del'>-                        nsources = afr_sh_mark_wisest_as_sources (sources, </div><div class='del'>-                                                                  characters,</div><div class='del'>-                                                                  child_count);</div><div class='del'>-                }</div><div class='del'>-        } else {</div><div class='del'>-                nsources = afr_sh_mark_biggest_fool_as_source (sh, characters,</div><div class='del'>-                                                               child_count);</div><div class='del'>-        }</div><div class='add'>+    if (xdata)</div><div class='add'>+        dict_unref(xdata);</div><div class='ctx'> </div><div class='del'>-out:</div><div class='del'>-        GF_FREE (characters);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	return nsources;</div><div class='add'>+gf_boolean_t</div><div class='add'>+afr_does_witness_exist(xlator_t *this, uint64_t *witness)</div><div class='add'>+{</div><div class='add'>+    int i = 0;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+        if (witness[i])</div><div class='add'>+            return _gf_true;</div><div class='add'>+    }</div><div class='add'>+    return _gf_false;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+unsigned int</div><div class='add'>+afr_get_quorum_count(afr_private_t *priv)</div><div class='add'>+{</div><div class='add'>+    if (priv-&gt;quorum_count == AFR_QUORUM_AUTO) {</div><div class='add'>+        return priv-&gt;child_count / 2 + 1;</div><div class='add'>+    } else {</div><div class='add'>+        return priv-&gt;quorum_count;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> void</div><div class='del'>-afr_sh_pending_to_delta (afr_private_t *priv, dict_t **xattr,</div><div class='del'>-                         int32_t *delta_matrix[], int success[],</div><div class='del'>-                         int child_count, afr_transaction_type type)</div><div class='del'>-{</div><div class='del'>-	int i = 0;</div><div class='del'>-	int j = 0;</div><div class='del'>-        int k = 0;</div><div class='del'>-</div><div class='del'>-	/* Indexable by result of afr_index_for_transaction_type(): 0 -- 2. */</div><div class='del'>-	int32_t   pending[3];</div><div class='del'>-	void    * pending_raw = NULL;</div><div class='del'>-        int       ret         = 0;</div><div class='del'>-</div><div class='del'>-	/* start clean */</div><div class='del'>-	for (i = 0; i &lt; child_count; i++) {</div><div class='del'>-		for (j = 0; j &lt; child_count; j++) {</div><div class='del'>-			delta_matrix[i][j] = 0;</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	for (i = 0; i &lt; child_count; i++) {</div><div class='del'>-                pending_raw = NULL;</div><div class='del'>-</div><div class='del'>-                for (j = 0; j &lt; child_count; j++) {</div><div class='del'>-                        ret = dict_get_ptr (xattr[i], priv-&gt;pending_key[j],</div><div class='del'>-                                            &amp;pending_raw);</div><div class='del'>-                        if (ret &lt; 0)</div><div class='del'>-                                gf_log ("afr_sh_pending_to_delta",</div><div class='del'>-                                        GF_LOG_WARNING,</div><div class='del'>-                                        "Unable to get dict value.");</div><div class='del'>-</div><div class='del'>-                        if (!success[j])</div><div class='del'>-                                continue;</div><div class='del'>-</div><div class='del'>-                        k = afr_index_for_transaction_type (type);</div><div class='del'>-</div><div class='del'>-                        if (pending_raw) {</div><div class='del'>-				memcpy (pending, pending_raw, sizeof(pending));</div><div class='del'>-                                delta_matrix[i][j] = -(ntoh32 (pending[k]));</div><div class='del'>-                        } else {</div><div class='del'>-                                delta_matrix[i][j]  = 0;</div><div class='del'>-                        }</div><div class='add'>+afr_selfheal_post_op_failure_accounting(afr_private_t *priv, char *accused,</div><div class='add'>+                                        unsigned char *sources,</div><div class='add'>+                                        unsigned char *locked_on)</div><div class='add'>+{</div><div class='add'>+    int i = 0;</div><div class='add'>+    unsigned int quorum_count = 0;</div><div class='ctx'> </div><div class='del'>-                }</div><div class='del'>-	}</div><div class='add'>+    if (AFR_COUNT(sources, priv-&gt;child_count) != 0)</div><div class='add'>+        return;</div><div class='add'>+</div><div class='add'>+    quorum_count = afr_get_quorum_count(priv);</div><div class='add'>+    for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+        if ((accused[i] &lt; quorum_count) &amp;&amp; locked_on[i]) {</div><div class='add'>+            sources[i] = 1;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    return;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+/*</div><div class='add'>+ * This function determines if a self-heal is required for a given inode,</div><div class='add'>+ * and if needed, in what direction.</div><div class='add'>+ *</div><div class='add'>+ * locked_on[] is the array representing servers which have been locked and</div><div class='add'>+ * from which xattrs have been fetched for analysis.</div><div class='add'>+ *</div><div class='add'>+ * The output of the function is by filling the arrays sources[] and sinks[].</div><div class='add'>+ *</div><div class='add'>+ * sources[i] is set if i'th server is an eligible source for a selfheal.</div><div class='add'>+ *</div><div class='add'>+ * sinks[i] is set if i'th server needs to be healed.</div><div class='add'>+ *</div><div class='add'>+ * if sources[0..N] are all set, there is no need for a selfheal.</div><div class='add'>+ *</div><div class='add'>+ * if sinks[0..N] are all set, the inode is in split brain.</div><div class='add'>+ *</div><div class='add'>+ */</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-afr_sh_delta_to_xattr (afr_private_t *priv,</div><div class='del'>-                       int32_t *delta_matrix[], dict_t *xattr[],</div><div class='del'>-		       int child_count, afr_transaction_type type)</div><div class='add'>+afr_selfheal_find_direction(call_frame_t *frame, xlator_t *this,</div><div class='add'>+                            struct afr_reply *replies,</div><div class='add'>+                            afr_transaction_type type, unsigned char *locked_on,</div><div class='add'>+                            unsigned char *sources, unsigned char *sinks,</div><div class='add'>+                            uint64_t *witness, unsigned char *pflag)</div><div class='ctx'> {</div><div class='del'>-	int i = 0;</div><div class='del'>-	int j = 0;</div><div class='del'>-        int k = 0;</div><div class='del'>-</div><div class='del'>-	int ret = 0;</div><div class='del'>-</div><div class='del'>-	int32_t *pending = 0;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    int i = 0;</div><div class='add'>+    int j = 0;</div><div class='add'>+    int *dirty = NULL;         /* Denotes if dirty xattr is set */</div><div class='add'>+    int **matrix = NULL;       /* Changelog matrix */</div><div class='add'>+    char *accused = NULL;      /* Accused others without any self-accusal */</div><div class='add'>+    char *pending = NULL;      /* Have pending operations on others */</div><div class='add'>+    char *self_accused = NULL; /* Accused itself */</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    dirty = alloca0(priv-&gt;child_count * sizeof(int));</div><div class='add'>+    accused = alloca0(priv-&gt;child_count);</div><div class='add'>+    pending = alloca0(priv-&gt;child_count);</div><div class='add'>+    self_accused = alloca0(priv-&gt;child_count);</div><div class='add'>+    matrix = ALLOC_MATRIX(priv-&gt;child_count, int);</div><div class='add'>+    memset(witness, 0, sizeof(*witness) * priv-&gt;child_count);</div><div class='add'>+</div><div class='add'>+    /* First construct the pending matrix for further analysis */</div><div class='add'>+    afr_selfheal_extract_xattr(this, replies, type, dirty, matrix);</div><div class='add'>+</div><div class='add'>+    if (pflag) {</div><div class='add'>+        for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+            for (j = 0; j &lt; priv-&gt;child_count; j++)</div><div class='add'>+                if (matrix[i][j])</div><div class='add'>+                    *pflag |= PFLAG_PENDING;</div><div class='add'>+            if (*pflag)</div><div class='add'>+                break;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (afr_success_count(replies, priv-&gt;child_count) &lt; priv-&gt;child_count) {</div><div class='add'>+        /* Treat this just like locks not being acquired */</div><div class='add'>+        return -ENOTCONN;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* short list all self-accused */</div><div class='add'>+    for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+        if (matrix[i][i])</div><div class='add'>+            self_accused[i] = 1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Next short list all accused to exclude them from being sources */</div><div class='add'>+    /* Self-accused can't accuse others as they are FOOLs */</div><div class='add'>+    for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+        for (j = 0; j &lt; priv-&gt;child_count; j++) {</div><div class='add'>+            if (matrix[i][j]) {</div><div class='add'>+                if (!self_accused[i])</div><div class='add'>+                    accused[j] += 1;</div><div class='add'>+                if (i != j)</div><div class='add'>+                    pending[i] += 1;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	for (i = 0; i &lt; child_count; i++) {</div><div class='del'>-		if (!xattr[i])</div><div class='del'>-			continue;</div><div class='add'>+    /* Short list all non-accused as sources */</div><div class='add'>+    for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+        if (!accused[i] &amp;&amp; locked_on[i])</div><div class='add'>+            sources[i] = 1;</div><div class='add'>+        else</div><div class='add'>+            sources[i] = 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Everyone accused by non-self-accused sources are sinks */</div><div class='add'>+    memset(sinks, 0, priv-&gt;child_count);</div><div class='add'>+    for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+        if (!sources[i])</div><div class='add'>+            continue;</div><div class='add'>+        if (self_accused[i])</div><div class='add'>+            continue;</div><div class='add'>+        for (j = 0; j &lt; priv-&gt;child_count; j++) {</div><div class='add'>+            if (matrix[i][j])</div><div class='add'>+                sinks[j] = 1;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* For breaking ties provide with number of fops they witnessed */</div><div class='add'>+</div><div class='add'>+    /*</div><div class='add'>+     * count the pending fops witnessed from itself to others when it is</div><div class='add'>+     * self-accused</div><div class='add'>+     */</div><div class='add'>+    for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+        if (!self_accused[i])</div><div class='add'>+            continue;</div><div class='add'>+        for (j = 0; j &lt; priv-&gt;child_count; j++) {</div><div class='add'>+            if (i == j)</div><div class='add'>+                continue;</div><div class='add'>+            witness[i] += matrix[i][j];</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-		for (j = 0; j &lt; child_count; j++) {</div><div class='del'>-                        pending = GF_CALLOC (sizeof (int32_t), 3,</div><div class='del'>-                                             gf_afr_mt_int32_t);</div><div class='del'>-                        /* 3 = data+metadata+entry */</div><div class='add'>+    if (type == AFR_DATA_TRANSACTION || type == AFR_METADATA_TRANSACTION)</div><div class='add'>+        afr_selfheal_post_op_failure_accounting(priv, accused, sources,</div><div class='add'>+                                                locked_on);</div><div class='ctx'> </div><div class='del'>-                        k = afr_index_for_transaction_type (type);</div><div class='add'>+    /* If no sources, all locked nodes are sinks - split brain */</div><div class='add'>+    if (AFR_COUNT(sources, priv-&gt;child_count) == 0) {</div><div class='add'>+        for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+            if (locked_on[i])</div><div class='add'>+                sinks[i] = 1;</div><div class='add'>+        }</div><div class='add'>+        if (pflag)</div><div class='add'>+            *pflag |= PFLAG_SBRAIN;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* One more class of witness similar to dirty in v2 is where no pending</div><div class='add'>+     * exists but we have self-accusing markers. This can happen in afr-v1</div><div class='add'>+     * if the brick crashes just after doing xattrop on self but</div><div class='add'>+     * before xattrop on the other xattrs on the brick in pre-op. */</div><div class='add'>+    if (AFR_COUNT(pending, priv-&gt;child_count) == 0) {</div><div class='add'>+        for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+            if (self_accused[i])</div><div class='add'>+                witness[i] += matrix[i][i];</div><div class='add'>+        }</div><div class='add'>+    } else {</div><div class='add'>+        /* In afr-v1 if a file is self-accused and has pending</div><div class='add'>+         * operations on others then it is similar to 'dirty' in afr-v2.</div><div class='add'>+         * Consider such cases as witness.</div><div class='add'>+         */</div><div class='add'>+        for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+            if (self_accused[i] &amp;&amp; pending[i])</div><div class='add'>+                witness[i] += matrix[i][i];</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-			pending[k] = hton32 (delta_matrix[i][j]);</div><div class='add'>+    /* count the number of dirty fops witnessed */</div><div class='add'>+    for (i = 0; i &lt; priv-&gt;child_count; i++)</div><div class='add'>+        witness[i] += dirty[i];</div><div class='ctx'> </div><div class='del'>-                        ret = dict_set_bin (xattr[i], priv-&gt;pending_key[j],</div><div class='del'>-                                            pending,</div><div class='del'>-                                            3 * sizeof (int32_t));</div><div class='del'>-                        if (ret &lt; 0)</div><div class='del'>-                                gf_log ("afr_sh_delta_to_xattr",</div><div class='del'>-                                        GF_LOG_WARNING,</div><div class='del'>-                                        "Unable to set dict value.");</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='del'>-	return 0;</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+void</div><div class='add'>+afr_log_selfheal(uuid_t gfid, xlator_t *this, int ret, char *type, int source,</div><div class='add'>+                 unsigned char *sources, unsigned char *healed_sinks)</div><div class='add'>+{</div><div class='add'>+    char *status = NULL;</div><div class='add'>+    char *sinks_str = NULL;</div><div class='add'>+    char *p = NULL;</div><div class='add'>+    char *sources_str = NULL;</div><div class='add'>+    char *q = NULL;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    gf_loglevel_t loglevel = GF_LOG_NONE;</div><div class='add'>+    int i = 0;</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+    sinks_str = alloca0(priv-&gt;child_count * 8);</div><div class='add'>+    p = sinks_str;</div><div class='add'>+    sources_str = alloca0(priv-&gt;child_count * 8);</div><div class='add'>+    q = sources_str;</div><div class='add'>+    for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+        if (healed_sinks[i])</div><div class='add'>+            p += sprintf(p, "%d ", i);</div><div class='add'>+        if (sources[i]) {</div><div class='add'>+            if (source == i) {</div><div class='add'>+                q += sprintf(q, "[%d] ", i);</div><div class='add'>+            } else {</div><div class='add'>+                q += sprintf(q, "%d ", i);</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        status = "Failed";</div><div class='add'>+        loglevel = GF_LOG_DEBUG;</div><div class='add'>+    } else {</div><div class='add'>+        status = "Completed";</div><div class='add'>+        loglevel = GF_LOG_INFO;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    gf_msg(this-&gt;name, loglevel, 0, AFR_MSG_SELF_HEAL_INFO,</div><div class='add'>+           "%s %s selfheal on %s. "</div><div class='add'>+           "sources=%s sinks=%s",</div><div class='add'>+           status, type, uuid_utoa(gfid), sources_str, sinks_str);</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-afr_sh_has_metadata_pending (dict_t *xattr, int child_count, xlator_t *this)</div><div class='add'>+afr_selfheal_discover_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                          int op_ret, int op_errno, inode_t *inode,</div><div class='add'>+                          struct iatt *buf, dict_t *xdata, struct iatt *parbuf)</div><div class='ctx'> {</div><div class='del'>-	afr_private_t *priv = NULL;</div><div class='del'>-	/* Indexable by result of afr_index_for_transaction_type(): 0 -- 2. */</div><div class='del'>-	int32_t       pending[3];</div><div class='del'>-	void          *pending_raw = NULL;</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    int i = -1;</div><div class='add'>+    GF_UNUSED int ret = -1;</div><div class='add'>+    int8_t need_heal = 1;</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    i = (long)cookie;</div><div class='add'>+</div><div class='add'>+    local-&gt;replies[i].valid = 1;</div><div class='add'>+    local-&gt;replies[i].op_ret = op_ret;</div><div class='add'>+    local-&gt;replies[i].op_errno = op_errno;</div><div class='add'>+    if (buf)</div><div class='add'>+        local-&gt;replies[i].poststat = *buf;</div><div class='add'>+    if (parbuf)</div><div class='add'>+        local-&gt;replies[i].postparent = *parbuf;</div><div class='add'>+    if (xdata) {</div><div class='add'>+        local-&gt;replies[i].xdata = dict_ref(xdata);</div><div class='add'>+        ret = dict_get_int8(xdata, "link-count", &amp;need_heal);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    local-&gt;replies[i].need_heal = need_heal;</div><div class='add'>+    syncbarrier_wake(&amp;local-&gt;barrier);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	int           ret = -1;</div><div class='del'>-	int            i  = 0;</div><div class='del'>-        int            j  = 0;</div><div class='add'>+inode_t *</div><div class='add'>+afr_selfheal_unlocked_lookup_on(call_frame_t *frame, inode_t *parent,</div><div class='add'>+                                const char *name, struct afr_reply *replies,</div><div class='add'>+                                unsigned char *lookup_on, dict_t *xattr)</div><div class='add'>+{</div><div class='add'>+    loc_t loc = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    dict_t *xattr_req = NULL;</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    inode_t *inode = NULL;</div><div class='ctx'> </div><div class='del'>-	priv = this-&gt;private;</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    priv = frame-&gt;this-&gt;private;</div><div class='ctx'> </div><div class='del'>-        for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='del'>-                ret = dict_get_ptr (xattr, priv-&gt;pending_key[i],</div><div class='del'>-                                    &amp;pending_raw);</div><div class='add'>+    xattr_req = dict_new();</div><div class='add'>+    if (!xattr_req)</div><div class='add'>+        return NULL;</div><div class='ctx'> </div><div class='del'>-                if (ret != 0)</div><div class='del'>-                        return 0;</div><div class='add'>+    if (xattr)</div><div class='add'>+        dict_copy(xattr, xattr_req);</div><div class='ctx'> </div><div class='del'>-		memcpy (pending, pending_raw, sizeof(pending));</div><div class='del'>-                j = afr_index_for_transaction_type (AFR_METADATA_TRANSACTION);</div><div class='add'>+    if (afr_xattr_req_prepare(frame-&gt;this, xattr_req) != 0) {</div><div class='add'>+        dict_unref(xattr_req);</div><div class='add'>+        return NULL;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-                if (pending[j])</div><div class='del'>-                        return 1;</div><div class='del'>-        }</div><div class='add'>+    inode = inode_new(parent-&gt;table);</div><div class='add'>+    if (!inode) {</div><div class='add'>+        dict_unref(xattr_req);</div><div class='add'>+        return NULL;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='add'>+    loc.parent = inode_ref(parent);</div><div class='add'>+    gf_uuid_copy(loc.pargfid, parent-&gt;gfid);</div><div class='add'>+    loc.name = name;</div><div class='add'>+    loc.inode = inode_ref(inode);</div><div class='ctx'> </div><div class='add'>+    AFR_ONLIST(lookup_on, frame, afr_selfheal_discover_cbk, lookup, &amp;loc,</div><div class='add'>+               xattr_req);</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-afr_sh_has_data_pending (dict_t *xattr, int child_count, xlator_t *this)</div><div class='del'>-{</div><div class='del'>-	afr_private_t *priv = NULL;</div><div class='del'>-	/* Indexable by result of afr_index_for_transaction_type(): 0 -- 2. */</div><div class='del'>-	int32_t       pending[3];</div><div class='del'>-	void          *pending_raw = NULL;</div><div class='add'>+    afr_replies_copy(replies, local-&gt;replies, priv-&gt;child_count);</div><div class='ctx'> </div><div class='del'>-	int           ret = -1;</div><div class='del'>-	int            i  = 0;</div><div class='del'>-        int            j  = 0;</div><div class='add'>+    loc_wipe(&amp;loc);</div><div class='add'>+    dict_unref(xattr_req);</div><div class='ctx'> </div><div class='del'>-	priv = this-&gt;private;</div><div class='add'>+    return inode;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='del'>-                ret = dict_get_ptr (xattr, priv-&gt;pending_key[i],</div><div class='del'>-                                    &amp;pending_raw);</div><div class='add'>+static int</div><div class='add'>+afr_set_multi_dom_lock_count_request(xlator_t *this, dict_t *dict)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    char *key1 = NULL;</div><div class='add'>+    char *key2 = NULL;</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+    key1 = alloca0(strlen(GLUSTERFS_INODELK_DOM_PREFIX) + 2 +</div><div class='add'>+                   strlen(this-&gt;name));</div><div class='add'>+    key2 = alloca0(strlen(GLUSTERFS_INODELK_DOM_PREFIX) + 2 +</div><div class='add'>+                   strlen(priv-&gt;sh_domain));</div><div class='add'>+</div><div class='add'>+    ret = dict_set_uint32(dict, GLUSTERFS_MULTIPLE_DOM_LK_CNT_REQUESTS, 1);</div><div class='add'>+    if (ret)</div><div class='add'>+        return ret;</div><div class='ctx'> </div><div class='del'>-                if (ret != 0)</div><div class='del'>-                        return 0;</div><div class='del'>-                </div><div class='del'>-		memcpy (pending, pending_raw, sizeof(pending));</div><div class='del'>-                j = afr_index_for_transaction_type (AFR_DATA_TRANSACTION);</div><div class='add'>+    sprintf(key1, "%s:%s", GLUSTERFS_INODELK_DOM_PREFIX, this-&gt;name);</div><div class='add'>+    ret = dict_set_uint32(dict, key1, 1);</div><div class='add'>+    if (ret)</div><div class='add'>+        return ret;</div><div class='ctx'> </div><div class='del'>-                if (pending[j])</div><div class='del'>-                        return 1;</div><div class='del'>-        }</div><div class='add'>+    sprintf(key2, "%s:%s", GLUSTERFS_INODELK_DOM_PREFIX, priv-&gt;sh_domain);</div><div class='add'>+    ret = dict_set_uint32(dict, key2, 1);</div><div class='add'>+    if (ret)</div><div class='add'>+        return ret;</div><div class='ctx'> </div><div class='del'>-	return 0;</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-afr_sh_has_entry_pending (dict_t *xattr, int child_count, xlator_t *this)</div><div class='add'>+afr_selfheal_unlocked_discover_on(call_frame_t *frame, inode_t *inode,</div><div class='add'>+                                  uuid_t gfid, struct afr_reply *replies,</div><div class='add'>+                                  unsigned char *discover_on, dict_t *dict)</div><div class='ctx'> {</div><div class='del'>-        afr_private_t *priv = NULL;</div><div class='del'>-	/* Indexable by result of afr_index_for_transaction_type(): 0 -- 2. */</div><div class='del'>-	int32_t       pending[3];</div><div class='del'>-	void          *pending_raw = NULL;</div><div class='add'>+    loc_t loc = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    dict_t *xattr_req = NULL;</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='ctx'> </div><div class='del'>-	int           ret = -1;</div><div class='del'>-	int            i  = 0;</div><div class='del'>-        int            j  = 0;</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    priv = frame-&gt;this-&gt;private;</div><div class='ctx'> </div><div class='del'>-	priv = this-&gt;private;</div><div class='add'>+    xattr_req = dict_new();</div><div class='add'>+    if (!xattr_req)</div><div class='add'>+        return -ENOMEM;</div><div class='add'>+    if (dict)</div><div class='add'>+        dict_copy(dict, xattr_req);</div><div class='ctx'> </div><div class='del'>-        for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='del'>-                ret = dict_get_ptr (xattr, priv-&gt;pending_key[i],</div><div class='del'>-                                    &amp;pending_raw);</div><div class='add'>+    if (afr_xattr_req_prepare(frame-&gt;this, xattr_req) != 0) {</div><div class='add'>+        dict_unref(xattr_req);</div><div class='add'>+        return -ENOMEM;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-                if (ret != 0)</div><div class='del'>-                        return 0;</div><div class='del'>-                </div><div class='del'>-		memcpy (pending, pending_raw, sizeof(pending));</div><div class='del'>-                j = afr_index_for_transaction_type (AFR_ENTRY_TRANSACTION);</div><div class='add'>+    if (afr_set_multi_dom_lock_count_request(frame-&gt;this, xattr_req)) {</div><div class='add'>+        dict_unref(xattr_req);</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-                if (pending[j])</div><div class='del'>-                        return 1;</div><div class='del'>-        }</div><div class='add'>+    loc.inode = inode_ref(inode);</div><div class='add'>+    gf_uuid_copy(loc.gfid, gfid);</div><div class='ctx'> </div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='add'>+    AFR_ONLIST(discover_on, frame, afr_selfheal_discover_cbk, lookup, &amp;loc,</div><div class='add'>+               xattr_req);</div><div class='ctx'> </div><div class='add'>+    afr_replies_copy(replies, local-&gt;replies, priv-&gt;child_count);</div><div class='ctx'> </div><div class='del'>-/**</div><div class='del'>- * is_matrix_zero - return true if pending matrix is all zeroes</div><div class='del'>- */</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-afr_sh_is_matrix_zero (int32_t *pending_matrix[], int child_count)</div><div class='del'>-{</div><div class='del'>-	int i, j;</div><div class='add'>+    loc_wipe(&amp;loc);</div><div class='add'>+    dict_unref(xattr_req);</div><div class='ctx'> </div><div class='del'>-	for (i = 0; i &lt; child_count; i++) </div><div class='del'>-		for (j = 0; j &lt; child_count; j++) </div><div class='del'>-			if (pending_matrix[i][j]) </div><div class='del'>-				return 0;</div><div class='del'>-	return 1;</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-afr_sh_missing_entries_done (call_frame_t *frame, xlator_t *this)</div><div class='add'>+afr_selfheal_unlocked_discover(call_frame_t *frame, inode_t *inode, uuid_t gfid,</div><div class='add'>+                               struct afr_reply *replies)</div><div class='ctx'> {</div><div class='del'>-	afr_local_t     *local = NULL;</div><div class='del'>-	afr_self_heal_t *sh = NULL;</div><div class='del'>-	afr_private_t   *priv = NULL;</div><div class='del'>-	int              i = 0;</div><div class='del'>-</div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-	sh = &amp;local-&gt;self_heal;</div><div class='del'>-	priv = this-&gt;private;</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    dict_t *dict = NULL;</div><div class='ctx'> </div><div class='del'>-//	memset (sh-&gt;child_errno, 0, sizeof (int) * priv-&gt;child_count);</div><div class='del'>-	memset (sh-&gt;buf, 0, sizeof (struct iatt) * priv-&gt;child_count);</div><div class='add'>+    local = frame-&gt;local;</div><div class='ctx'> </div><div class='del'>-        for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='del'>-                sh-&gt;locked_nodes[i] = 0;</div><div class='del'>-        }</div><div class='add'>+    if (local-&gt;xattr_req)</div><div class='add'>+        dict = local-&gt;xattr_req;</div><div class='ctx'> </div><div class='del'>-	for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='del'>-		if (sh-&gt;xattr[i])</div><div class='del'>-			dict_unref (sh-&gt;xattr[i]);</div><div class='del'>-		sh-&gt;xattr[i] = NULL;</div><div class='del'>-	}</div><div class='add'>+    return afr_selfheal_unlocked_discover_on(frame, inode, gfid, replies,</div><div class='add'>+                                             local-&gt;child_up, dict);</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	if (local-&gt;govinda_gOvinda) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_TRACE,</div><div class='del'>-			"aborting selfheal of %s",</div><div class='del'>-			local-&gt;loc.path);</div><div class='del'>-		sh-&gt;completion_cbk (frame, this);</div><div class='del'>-	} else {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_TRACE,</div><div class='del'>-			"proceeding to metadata check on %s",</div><div class='del'>-			local-&gt;loc.path);</div><div class='del'>-		afr_self_heal_metadata (frame, this);</div><div class='del'>-	}</div><div class='add'>+unsigned int</div><div class='add'>+afr_success_count(struct afr_reply *replies, unsigned int count)</div><div class='add'>+{</div><div class='add'>+    int i = 0;</div><div class='add'>+    unsigned int success = 0;</div><div class='ctx'> </div><div class='del'>-	return 0;</div><div class='add'>+    for (i = 0; i &lt; count; i++)</div><div class='add'>+        if (replies[i].valid &amp;&amp; replies[i].op_ret == 0)</div><div class='add'>+            success++;</div><div class='add'>+    return success;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-sh_missing_entries_unlck_cbk (call_frame_t *frame, void *cookie,</div><div class='del'>-			      xlator_t *this,</div><div class='del'>-			      int32_t op_ret, int32_t op_errno)</div><div class='add'>+afr_selfheal_lock_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                      int op_ret, int op_errno, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-	afr_local_t     *local = NULL;</div><div class='del'>-	int              call_count = 0;</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    int i = 0;</div><div class='ctx'> </div><div class='del'>-	local = frame-&gt;local;</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    i = (long)cookie;</div><div class='ctx'> </div><div class='del'>-	LOCK (&amp;frame-&gt;lock);</div><div class='del'>-	{</div><div class='del'>-	}</div><div class='del'>-	UNLOCK (&amp;frame-&gt;lock);</div><div class='add'>+    local-&gt;replies[i].valid = 1;</div><div class='add'>+    local-&gt;replies[i].op_ret = op_ret;</div><div class='add'>+    local-&gt;replies[i].op_errno = op_errno;</div><div class='ctx'> </div><div class='del'>-	call_count = afr_frame_return (frame);</div><div class='add'>+    syncbarrier_wake(&amp;local-&gt;barrier);</div><div class='ctx'> </div><div class='del'>-	if (call_count == 0) {</div><div class='del'>-		afr_sh_missing_entries_done (frame, this);</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+int</div><div class='add'>+afr_locked_fill(call_frame_t *frame, xlator_t *this, unsigned char *locked_on)</div><div class='add'>+{</div><div class='add'>+    int i = 0;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    int count = 0;</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+        if (local-&gt;replies[i].valid &amp;&amp; local-&gt;replies[i].op_ret == 0) {</div><div class='add'>+            locked_on[i] = 1;</div><div class='add'>+            count++;</div><div class='add'>+        } else {</div><div class='add'>+            locked_on[i] = 0;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-static int</div><div class='del'>-sh_missing_entries_finish (call_frame_t *frame, xlator_t *this)</div><div class='add'>+    return count;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+afr_selfheal_tryinodelk(call_frame_t *frame, xlator_t *this, inode_t *inode,</div><div class='add'>+                        char *dom, off_t off, size_t size,</div><div class='add'>+                        unsigned char *locked_on)</div><div class='ctx'> {</div><div class='del'>-	afr_private_t      *priv = NULL;</div><div class='del'>-	afr_local_t        *local = NULL;</div><div class='del'>-	int                 i = 0;</div><div class='del'>-	int                 call_count = 0;</div><div class='del'>-	afr_self_heal_t    *sh = NULL;</div><div class='add'>+    loc_t loc = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    struct gf_flock flock = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='ctx'> </div><div class='add'>+    loc.inode = inode_ref(inode);</div><div class='add'>+    gf_uuid_copy(loc.gfid, inode-&gt;gfid);</div><div class='ctx'> </div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-	sh = &amp;local-&gt;self_heal;</div><div class='del'>-	priv = this-&gt;private;</div><div class='add'>+    flock.l_type = F_WRLCK;</div><div class='add'>+    flock.l_start = off;</div><div class='add'>+    flock.l_len = size;</div><div class='ctx'> </div><div class='del'>-        for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='del'>-                if (sh-&gt;locked_nodes[i])</div><div class='del'>-                        call_count++;</div><div class='del'>-        }</div><div class='add'>+    AFR_ONALL(frame, afr_selfheal_lock_cbk, inodelk, dom, &amp;loc, F_SETLK, &amp;flock,</div><div class='add'>+              NULL);</div><div class='ctx'> </div><div class='del'>-        if (call_count == 0) {</div><div class='del'>-                afr_sh_missing_entries_done (frame, this);</div><div class='del'>-                return 0;</div><div class='del'>-        }</div><div class='add'>+    loc_wipe(&amp;loc);</div><div class='ctx'> </div><div class='del'>-	local-&gt;call_count = call_count;</div><div class='add'>+    return afr_locked_fill(frame, this, locked_on);</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='del'>-		if (sh-&gt;locked_nodes[i]) {</div><div class='del'>-			gf_log (this-&gt;name, GF_LOG_TRACE,</div><div class='del'>-				"unlocking %"PRId64"/%s on subvolume %s",</div><div class='del'>-				sh-&gt;parent_loc.inode-&gt;ino, local-&gt;loc.name,</div><div class='del'>-				priv-&gt;children[i]-&gt;name);</div><div class='add'>+int</div><div class='add'>+afr_selfheal_inodelk(call_frame_t *frame, xlator_t *this, inode_t *inode,</div><div class='add'>+                     char *dom, off_t off, size_t size,</div><div class='add'>+                     unsigned char *locked_on)</div><div class='add'>+{</div><div class='add'>+    loc_t loc = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    struct gf_flock flock = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    int i = 0;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+</div><div class='add'>+    loc.inode = inode_ref(inode);</div><div class='add'>+    gf_uuid_copy(loc.gfid, inode-&gt;gfid);</div><div class='add'>+</div><div class='add'>+    flock.l_type = F_WRLCK;</div><div class='add'>+    flock.l_start = off;</div><div class='add'>+    flock.l_len = size;</div><div class='add'>+</div><div class='add'>+    AFR_ONALL(frame, afr_selfheal_lock_cbk, inodelk, dom, &amp;loc, F_SETLK, &amp;flock,</div><div class='add'>+              NULL);</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+        if (local-&gt;replies[i].op_ret == -1 &amp;&amp;</div><div class='add'>+            local-&gt;replies[i].op_errno == EAGAIN) {</div><div class='add'>+            afr_locked_fill(frame, this, locked_on);</div><div class='add'>+            afr_selfheal_uninodelk(frame, this, inode, dom, off, size,</div><div class='add'>+                                   locked_on);</div><div class='add'>+</div><div class='add'>+            AFR_SEQ(frame, afr_selfheal_lock_cbk, inodelk, dom, &amp;loc, F_SETLKW,</div><div class='add'>+                    &amp;flock, NULL);</div><div class='add'>+            break;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-			STACK_WIND (frame, sh_missing_entries_unlck_cbk,</div><div class='del'>-				    priv-&gt;children[i],</div><div class='del'>-				    priv-&gt;children[i]-&gt;fops-&gt;entrylk,</div><div class='del'>-                                    this-&gt;name,</div><div class='del'>-				    &amp;sh-&gt;parent_loc, local-&gt;loc.name,</div><div class='del'>-				    ENTRYLK_UNLOCK, ENTRYLK_WRLCK);</div><div class='add'>+    loc_wipe(&amp;loc);</div><div class='ctx'> </div><div class='del'>-			if (!--call_count)</div><div class='del'>-				break;</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='del'>-	return 0;</div><div class='add'>+    return afr_locked_fill(frame, this, locked_on);</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+static void</div><div class='add'>+afr_get_lock_and_eagain_counts(afr_private_t *priv, struct afr_reply *replies,</div><div class='add'>+                               int *lock_count, int *eagain_count)</div><div class='add'>+{</div><div class='add'>+    int i = 0;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+        if (!replies[i].valid)</div><div class='add'>+            continue;</div><div class='add'>+        if (replies[i].op_ret == 0) {</div><div class='add'>+            (*lock_count)++;</div><div class='add'>+        } else if (replies[i].op_ret == -1 &amp;&amp; replies[i].op_errno == EAGAIN) {</div><div class='add'>+            (*eagain_count)++;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-static int</div><div class='del'>-sh_destroy_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-		int32_t op_ret, int op_errno,</div><div class='del'>-                struct iatt *preop, struct iatt *postop)</div><div class='add'>+/*Do blocking locks if number of locks acquired is majority and there were some</div><div class='add'>+ * EAGAINs. Useful for odd-way replication*/</div><div class='add'>+int</div><div class='add'>+afr_selfheal_tie_breaker_inodelk(call_frame_t *frame, xlator_t *this,</div><div class='add'>+                                 inode_t *inode, char *dom, off_t off,</div><div class='add'>+                                 size_t size, unsigned char *locked_on)</div><div class='ctx'> {</div><div class='del'>-        afr_local_t *local = NULL;</div><div class='add'>+    loc_t loc = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    struct gf_flock flock = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    int lock_count = 0;</div><div class='add'>+    int eagain_count = 0;</div><div class='ctx'> </div><div class='del'>-        loc_t *parent_loc = cookie;</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+    local = frame-&gt;local;</div><div class='ctx'> </div><div class='del'>-        int call_count = 0;</div><div class='add'>+    loc.inode = inode_ref(inode);</div><div class='add'>+    gf_uuid_copy(loc.gfid, inode-&gt;gfid);</div><div class='ctx'> </div><div class='del'>-        local = frame-&gt;local;</div><div class='add'>+    flock.l_type = F_WRLCK;</div><div class='add'>+    flock.l_start = off;</div><div class='add'>+    flock.l_len = size;</div><div class='ctx'> </div><div class='del'>-        if (op_ret == -1) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-                        "setattr on %s failed: %s",</div><div class='del'>-                        local-&gt;loc.path, strerror (op_errno));</div><div class='del'>-        }</div><div class='add'>+    AFR_ONALL(frame, afr_selfheal_lock_cbk, inodelk, dom, &amp;loc, F_SETLK, &amp;flock,</div><div class='add'>+              NULL);</div><div class='ctx'> </div><div class='del'>-        if (parent_loc) {</div><div class='del'>-                loc_wipe (parent_loc);</div><div class='del'>-                GF_FREE (parent_loc);</div><div class='del'>-        }</div><div class='add'>+    afr_get_lock_and_eagain_counts(priv, local-&gt;replies, &amp;lock_count,</div><div class='add'>+                                   &amp;eagain_count);</div><div class='ctx'> </div><div class='del'>-        call_count = afr_frame_return (frame);</div><div class='del'>-        </div><div class='del'>-        if (call_count == 0) {</div><div class='del'>-                STACK_DESTROY (frame-&gt;root);</div><div class='del'>-        }</div><div class='del'>-        </div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='add'>+    if (lock_count &gt; priv-&gt;child_count / 2 &amp;&amp; eagain_count) {</div><div class='add'>+        afr_locked_fill(frame, this, locked_on);</div><div class='add'>+        afr_selfheal_uninodelk(frame, this, inode, dom, off, size, locked_on);</div><div class='ctx'> </div><div class='add'>+        AFR_SEQ(frame, afr_selfheal_lock_cbk, inodelk, dom, &amp;loc, F_SETLKW,</div><div class='add'>+                &amp;flock, NULL);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-static int</div><div class='del'>-sh_missing_entries_newentry_cbk (call_frame_t *frame, void *cookie,</div><div class='del'>-				 xlator_t *this,</div><div class='del'>-				 int32_t op_ret, int32_t op_errno,</div><div class='del'>-				 inode_t *inode, struct iatt *buf,</div><div class='del'>-                                 struct iatt *preparent,</div><div class='del'>-                                 struct iatt *postparent)</div><div class='del'>-{</div><div class='del'>-	afr_local_t     *local = NULL;</div><div class='del'>-	afr_self_heal_t *sh = NULL;</div><div class='del'>-	afr_private_t   *priv = NULL;</div><div class='del'>-	call_frame_t    *setattr_frame = NULL;</div><div class='del'>-	int              call_count = 0;</div><div class='del'>-	int              child_index = 0;</div><div class='del'>-</div><div class='del'>-        loc_t *parent_loc = NULL;</div><div class='del'>-</div><div class='del'>-	struct iatt     stbuf;</div><div class='del'>-        int32_t valid;</div><div class='del'>-</div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-	sh    = &amp;local-&gt;self_heal;</div><div class='del'>-	priv  = this-&gt;private;</div><div class='del'>-</div><div class='del'>-	child_index = (long) cookie;</div><div class='del'>-</div><div class='del'>-	stbuf.ia_atime = sh-&gt;buf[sh-&gt;source].ia_atime;</div><div class='del'>-	stbuf.ia_atime_nsec = sh-&gt;buf[sh-&gt;source].ia_atime_nsec;</div><div class='del'>-	stbuf.ia_mtime = sh-&gt;buf[sh-&gt;source].ia_mtime;</div><div class='del'>-	stbuf.ia_mtime_nsec = sh-&gt;buf[sh-&gt;source].ia_mtime_nsec;</div><div class='del'>-</div><div class='del'>-        stbuf.ia_uid = sh-&gt;buf[sh-&gt;source].ia_uid;</div><div class='del'>-        stbuf.ia_gid = sh-&gt;buf[sh-&gt;source].ia_gid;</div><div class='del'>-        </div><div class='del'>-        valid = GF_SET_ATTR_UID   | GF_SET_ATTR_GID |</div><div class='del'>-                GF_SET_ATTR_ATIME | GF_SET_ATTR_MTIME;</div><div class='del'>-        </div><div class='del'>-	if (op_ret == 0) {</div><div class='del'>-		setattr_frame = copy_frame (frame);</div><div class='del'>-                </div><div class='del'>-                setattr_frame-&gt;local = GF_CALLOC (1, sizeof (afr_local_t),</div><div class='del'>-                                                  gf_afr_mt_afr_local_t);</div><div class='del'>-</div><div class='del'>-                ((afr_local_t *)setattr_frame-&gt;local)-&gt;call_count = 2;</div><div class='del'>-</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_TRACE,</div><div class='del'>-			"setattr (%s) on subvolume %s",</div><div class='del'>-			local-&gt;loc.path, priv-&gt;children[child_index]-&gt;name);</div><div class='del'>-</div><div class='del'>-		STACK_WIND_COOKIE (setattr_frame, sh_destroy_cbk,</div><div class='del'>-                                   (void *) (long) 0,</div><div class='del'>-                                   priv-&gt;children[child_index],</div><div class='del'>-                                   priv-&gt;children[child_index]-&gt;fops-&gt;setattr,</div><div class='del'>-                                   &amp;local-&gt;loc, &amp;stbuf, valid);</div><div class='del'>-</div><div class='del'>-                valid      = GF_SET_ATTR_ATIME | GF_SET_ATTR_MTIME;</div><div class='del'>-                parent_loc = GF_CALLOC (1, sizeof (*parent_loc), </div><div class='del'>-                                        gf_afr_mt_loc_t);</div><div class='del'>-                afr_build_parent_loc (parent_loc, &amp;local-&gt;loc);</div><div class='del'>-</div><div class='del'>-                STACK_WIND_COOKIE (setattr_frame, sh_destroy_cbk,</div><div class='del'>-                                   (void *) (long) parent_loc,</div><div class='del'>-                                   priv-&gt;children[child_index],</div><div class='del'>-                                   priv-&gt;children[child_index]-&gt;fops-&gt;setattr,</div><div class='del'>-                                   parent_loc, &amp;sh-&gt;parentbuf, valid);</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	call_count = afr_frame_return (frame);</div><div class='del'>-</div><div class='del'>-	if (call_count == 0) {</div><div class='del'>-		sh_missing_entries_finish (frame, this);</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='add'>+    loc_wipe(&amp;loc);</div><div class='add'>+</div><div class='add'>+    return afr_locked_fill(frame, this, locked_on);</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+int</div><div class='add'>+afr_selfheal_uninodelk(call_frame_t *frame, xlator_t *this, inode_t *inode,</div><div class='add'>+                       char *dom, off_t off, size_t size,</div><div class='add'>+                       const unsigned char *locked_on)</div><div class='add'>+{</div><div class='add'>+    loc_t loc = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    struct gf_flock flock = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='ctx'> </div><div class='del'>-static int</div><div class='del'>-sh_missing_entries_mknod (call_frame_t *frame, xlator_t *this)</div><div class='del'>-{</div><div class='del'>-	afr_local_t     *local = NULL;</div><div class='del'>-	afr_self_heal_t *sh = NULL;</div><div class='del'>-	afr_private_t   *priv = NULL;</div><div class='del'>-	int              i = 0;</div><div class='del'>-        int              ret = 0;</div><div class='del'>-	int              enoent_count = 0;</div><div class='del'>-	int              call_count = 0;</div><div class='del'>-	mode_t           st_mode = 0;</div><div class='del'>-	dev_t            ia_dev = 0;</div><div class='del'>-        dict_t          *dict = NULL;</div><div class='del'>-</div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-	sh = &amp;local-&gt;self_heal;</div><div class='del'>-	priv = this-&gt;private;</div><div class='del'>-</div><div class='del'>-	for (i = 0; i &lt; priv-&gt;child_count; i++)</div><div class='del'>-		if (sh-&gt;child_errno[i] == ENOENT)</div><div class='del'>-			enoent_count++;</div><div class='del'>-</div><div class='del'>-	call_count = enoent_count;</div><div class='del'>-	local-&gt;call_count = call_count;</div><div class='del'>-</div><div class='del'>-	st_mode = st_mode_from_ia (sh-&gt;buf[sh-&gt;source].ia_prot,</div><div class='del'>-                                   sh-&gt;buf[sh-&gt;source].ia_type);</div><div class='del'>-	ia_dev  = sh-&gt;buf[sh-&gt;source].ia_dev;</div><div class='del'>-</div><div class='del'>-	gf_log (this-&gt;name, GF_LOG_TRACE,</div><div class='del'>-		"mknod %s mode 0%o on %d subvolumes",</div><div class='del'>-		local-&gt;loc.path, st_mode, enoent_count);</div><div class='del'>-</div><div class='del'>-        dict = dict_new ();</div><div class='del'>-        if (!dict)</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_ERROR, "out of memory");</div><div class='del'>-</div><div class='del'>-        ret = afr_set_dict_gfid (dict, sh-&gt;buf[sh-&gt;source].ia_gfid);</div><div class='del'>-        if (ret)</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_DEBUG, "gfid set failed");</div><div class='add'>+    loc.inode = inode_ref(inode);</div><div class='add'>+    gf_uuid_copy(loc.gfid, inode-&gt;gfid);</div><div class='ctx'> </div><div class='del'>-	for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='del'>-		if (sh-&gt;child_errno[i] == ENOENT) {</div><div class='del'>-			STACK_WIND_COOKIE (frame,</div><div class='del'>-					   sh_missing_entries_newentry_cbk,</div><div class='del'>-					   (void *) (long) i,</div><div class='del'>-					   priv-&gt;children[i],</div><div class='del'>-					   priv-&gt;children[i]-&gt;fops-&gt;mknod,</div><div class='del'>-					   &amp;local-&gt;loc, st_mode, ia_dev, dict);</div><div class='del'>-			if (!--call_count)</div><div class='del'>-				break;</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='add'>+    flock.l_type = F_UNLCK;</div><div class='add'>+    flock.l_start = off;</div><div class='add'>+    flock.l_len = size;</div><div class='ctx'> </div><div class='del'>-        if (dict)</div><div class='del'>-                dict_unref (dict);</div><div class='add'>+    AFR_ONLIST(locked_on, frame, afr_selfheal_lock_cbk, inodelk, dom, &amp;loc,</div><div class='add'>+               F_SETLK, &amp;flock, NULL);</div><div class='ctx'> </div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='add'>+    loc_wipe(&amp;loc);</div><div class='ctx'> </div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-static int</div><div class='del'>-sh_missing_entries_mkdir (call_frame_t *frame, xlator_t *this)</div><div class='del'>-{</div><div class='del'>-	afr_local_t     *local = NULL;</div><div class='del'>-	afr_self_heal_t *sh = NULL;</div><div class='del'>-	afr_private_t   *priv = NULL;</div><div class='del'>-        dict_t          *dict = NULL;</div><div class='del'>-	int              i = 0;</div><div class='del'>-        int              ret = 0;</div><div class='del'>-	int              enoent_count = 0;</div><div class='del'>-	int              call_count = 0;</div><div class='del'>-	mode_t           st_mode = 0;</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-	sh = &amp;local-&gt;self_heal;</div><div class='del'>-	priv = this-&gt;private;</div><div class='del'>-</div><div class='del'>-	for (i = 0; i &lt; priv-&gt;child_count; i++)</div><div class='del'>-		if (sh-&gt;child_errno[i] == ENOENT)</div><div class='del'>-			enoent_count++;</div><div class='del'>-</div><div class='del'>-	call_count = enoent_count;</div><div class='del'>-	local-&gt;call_count = call_count;</div><div class='del'>-</div><div class='del'>-	st_mode = st_mode_from_ia (sh-&gt;buf[sh-&gt;source].ia_prot,</div><div class='del'>-                                   sh-&gt;buf[sh-&gt;source].ia_type);</div><div class='del'>-</div><div class='del'>-        dict = dict_new ();</div><div class='del'>-        if (!dict) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-                        "Out of memory");</div><div class='del'>-                sh_missing_entries_finish (frame, this);</div><div class='del'>-                return 0;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        ret = afr_set_dict_gfid (dict, sh-&gt;buf[sh-&gt;source].ia_gfid);</div><div class='del'>-        if (ret)</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-                        "inode gfid set failed");</div><div class='add'>+int</div><div class='add'>+afr_selfheal_tryentrylk(call_frame_t *frame, xlator_t *this, inode_t *inode,</div><div class='add'>+                        char *dom, const char *name, unsigned char *locked_on)</div><div class='add'>+{</div><div class='add'>+    loc_t loc = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='ctx'> </div><div class='add'>+    loc.inode = inode_ref(inode);</div><div class='add'>+    gf_uuid_copy(loc.gfid, inode-&gt;gfid);</div><div class='ctx'> </div><div class='del'>-	gf_log (this-&gt;name, GF_LOG_TRACE,</div><div class='del'>-		"mkdir %s mode 0%o on %d subvolumes",</div><div class='del'>-		local-&gt;loc.path, st_mode, enoent_count);</div><div class='add'>+    AFR_ONALL(frame, afr_selfheal_lock_cbk, entrylk, dom, &amp;loc, name,</div><div class='add'>+              ENTRYLK_LOCK_NB, ENTRYLK_WRLCK, NULL);</div><div class='ctx'> </div><div class='del'>-	for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='del'>-		if (sh-&gt;child_errno[i] == ENOENT) {</div><div class='del'>-                        if (!strcmp (local-&gt;loc.path, "/")) {</div><div class='del'>-                                /* We shouldn't try to create "/" */</div><div class='add'>+    loc_wipe(&amp;loc);</div><div class='ctx'> </div><div class='del'>-                                sh_missing_entries_finish (frame, this);</div><div class='add'>+    return afr_locked_fill(frame, this, locked_on);</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-                                return 0;</div><div class='del'>-                        } else {</div><div class='del'>-                                STACK_WIND_COOKIE (frame,</div><div class='del'>-                                                   sh_missing_entries_newentry_cbk,</div><div class='del'>-                                                   (void *) (long) i,</div><div class='del'>-                                                   priv-&gt;children[i],</div><div class='del'>-                                                   priv-&gt;children[i]-&gt;fops-&gt;mkdir,</div><div class='del'>-                                                   &amp;local-&gt;loc, st_mode, dict);</div><div class='del'>-                                if (!--call_count)</div><div class='del'>-                                        break;</div><div class='del'>-                        }</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='add'>+int</div><div class='add'>+afr_selfheal_entrylk(call_frame_t *frame, xlator_t *this, inode_t *inode,</div><div class='add'>+                     char *dom, const char *name, unsigned char *locked_on)</div><div class='add'>+{</div><div class='add'>+    loc_t loc = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    int i = 0;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+</div><div class='add'>+    loc.inode = inode_ref(inode);</div><div class='add'>+    gf_uuid_copy(loc.gfid, inode-&gt;gfid);</div><div class='add'>+</div><div class='add'>+    AFR_ONALL(frame, afr_selfheal_lock_cbk, entrylk, dom, &amp;loc, name,</div><div class='add'>+              ENTRYLK_LOCK_NB, ENTRYLK_WRLCK, NULL);</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+        if (local-&gt;replies[i].op_ret == -1 &amp;&amp;</div><div class='add'>+            local-&gt;replies[i].op_errno == EAGAIN) {</div><div class='add'>+            afr_locked_fill(frame, this, locked_on);</div><div class='add'>+            afr_selfheal_unentrylk(frame, this, inode, dom, name, locked_on,</div><div class='add'>+                                   NULL);</div><div class='add'>+</div><div class='add'>+            AFR_SEQ(frame, afr_selfheal_lock_cbk, entrylk, dom, &amp;loc, name,</div><div class='add'>+                    ENTRYLK_LOCK, ENTRYLK_WRLCK, NULL);</div><div class='add'>+            break;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        if (dict)</div><div class='del'>-                dict_unref (dict);</div><div class='add'>+    loc_wipe(&amp;loc);</div><div class='ctx'> </div><div class='del'>-	return 0;</div><div class='add'>+    return afr_locked_fill(frame, this, locked_on);</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+int</div><div class='add'>+afr_selfheal_tie_breaker_entrylk(call_frame_t *frame, xlator_t *this,</div><div class='add'>+                                 inode_t *inode, char *dom, const char *name,</div><div class='add'>+                                 unsigned char *locked_on)</div><div class='add'>+{</div><div class='add'>+    loc_t loc = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    int lock_count = 0;</div><div class='add'>+    int eagain_count = 0;</div><div class='ctx'> </div><div class='del'>-static int</div><div class='del'>-sh_missing_entries_symlink (call_frame_t *frame, xlator_t *this,</div><div class='del'>-			    const char *link, struct iatt *buf)</div><div class='del'>-{</div><div class='del'>-	afr_local_t     *local = NULL;</div><div class='del'>-	afr_self_heal_t *sh = NULL;</div><div class='del'>-	afr_private_t   *priv = NULL;</div><div class='del'>-        dict_t          *dict = NULL;</div><div class='del'>-	int              i = 0;</div><div class='del'>-        int              ret = 0;</div><div class='del'>-	int              enoent_count = 0;</div><div class='del'>-	int              call_count = 0;</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-	sh = &amp;local-&gt;self_heal;</div><div class='del'>-	priv = this-&gt;private;</div><div class='del'>-</div><div class='del'>-	for (i = 0; i &lt; priv-&gt;child_count; i++)</div><div class='del'>-		if (sh-&gt;child_errno[i] == ENOENT)</div><div class='del'>-			enoent_count++;</div><div class='del'>-</div><div class='del'>-	call_count = enoent_count;</div><div class='del'>-	local-&gt;call_count = call_count;</div><div class='del'>-</div><div class='del'>-        dict = dict_new ();</div><div class='del'>-        if (!dict) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-                        "Out of memory");</div><div class='del'>-                sh_missing_entries_finish (frame, this);</div><div class='del'>-                return 0;</div><div class='del'>-        }</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+    local = frame-&gt;local;</div><div class='ctx'> </div><div class='del'>-        ret = afr_set_dict_gfid (dict, buf-&gt;ia_gfid);</div><div class='del'>-        if (ret)</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-                        "dict gfid set failed");</div><div class='add'>+    loc.inode = inode_ref(inode);</div><div class='add'>+    gf_uuid_copy(loc.gfid, inode-&gt;gfid);</div><div class='ctx'> </div><div class='del'>-	gf_log (this-&gt;name, GF_LOG_TRACE,</div><div class='del'>-		"symlink %s -&gt; %s on %d subvolumes",</div><div class='del'>-		local-&gt;loc.path, link, enoent_count);</div><div class='add'>+    AFR_ONALL(frame, afr_selfheal_lock_cbk, entrylk, dom, &amp;loc, name,</div><div class='add'>+              ENTRYLK_LOCK_NB, ENTRYLK_WRLCK, NULL);</div><div class='ctx'> </div><div class='del'>-	for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='del'>-		if (sh-&gt;child_errno[i] == ENOENT) {</div><div class='del'>-			STACK_WIND_COOKIE (frame,</div><div class='del'>-					   sh_missing_entries_newentry_cbk,</div><div class='del'>-					   (void *) (long) i,</div><div class='del'>-					   priv-&gt;children[i],</div><div class='del'>-					   priv-&gt;children[i]-&gt;fops-&gt;symlink,</div><div class='del'>-					   link, &amp;local-&gt;loc, dict);</div><div class='del'>-			if (!--call_count)</div><div class='del'>-				break;</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='add'>+    afr_get_lock_and_eagain_counts(priv, local-&gt;replies, &amp;lock_count,</div><div class='add'>+                                   &amp;eagain_count);</div><div class='ctx'> </div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='add'>+    if (lock_count &gt; priv-&gt;child_count / 2 &amp;&amp; eagain_count) {</div><div class='add'>+        afr_locked_fill(frame, this, locked_on);</div><div class='add'>+        afr_selfheal_unentrylk(frame, this, inode, dom, name, locked_on, NULL);</div><div class='ctx'> </div><div class='add'>+        AFR_SEQ(frame, afr_selfheal_lock_cbk, entrylk, dom, &amp;loc, name,</div><div class='add'>+                ENTRYLK_LOCK, ENTRYLK_WRLCK, NULL);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-static int</div><div class='del'>-sh_missing_entries_readlink_cbk (call_frame_t *frame, void *cookie,</div><div class='del'>-				 xlator_t *this,</div><div class='del'>-				 int32_t op_ret, int32_t op_errno,</div><div class='del'>-				 const char *link, struct iatt *sbuf)</div><div class='del'>-{</div><div class='del'>-	if (op_ret &gt; 0)</div><div class='del'>-		sh_missing_entries_symlink (frame, this, link, sbuf);</div><div class='del'>-	else</div><div class='del'>-		sh_missing_entries_finish (frame, this);</div><div class='add'>+    loc_wipe(&amp;loc);</div><div class='ctx'> </div><div class='del'>-	return 0;</div><div class='add'>+    return afr_locked_fill(frame, this, locked_on);</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='del'>-static int</div><div class='del'>-sh_missing_entries_readlink (call_frame_t *frame, xlator_t *this)</div><div class='add'>+int</div><div class='add'>+afr_selfheal_unentrylk(call_frame_t *frame, xlator_t *this, inode_t *inode,</div><div class='add'>+                       char *dom, const char *name, unsigned char *locked_on,</div><div class='add'>+                       dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-	afr_local_t     *local = NULL;</div><div class='del'>-	afr_self_heal_t *sh = NULL;</div><div class='del'>-	afr_private_t   *priv = NULL;</div><div class='add'>+    loc_t loc = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='ctx'> </div><div class='add'>+    loc.inode = inode_ref(inode);</div><div class='add'>+    gf_uuid_copy(loc.gfid, inode-&gt;gfid);</div><div class='ctx'> </div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-	sh = &amp;local-&gt;self_heal;</div><div class='del'>-	priv = this-&gt;private;</div><div class='add'>+    AFR_ONLIST(locked_on, frame, afr_selfheal_lock_cbk, entrylk, dom, &amp;loc,</div><div class='add'>+               name, ENTRYLK_UNLOCK, ENTRYLK_WRLCK, xdata);</div><div class='ctx'> </div><div class='del'>-	STACK_WIND (frame, sh_missing_entries_readlink_cbk,</div><div class='del'>-		    priv-&gt;children[sh-&gt;source],</div><div class='del'>-		    priv-&gt;children[sh-&gt;source]-&gt;fops-&gt;readlink,</div><div class='del'>-		    &amp;local-&gt;loc, 4096);</div><div class='add'>+    loc_wipe(&amp;loc);</div><div class='ctx'> </div><div class='del'>-	return 0;</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='del'>-static int</div><div class='del'>-sh_missing_entries_create (call_frame_t *frame, xlator_t *this)</div><div class='del'>-{</div><div class='del'>-	afr_local_t     *local = NULL;</div><div class='del'>-	afr_self_heal_t *sh = NULL;</div><div class='del'>-	int              type = 0;</div><div class='del'>-	int              i = 0;</div><div class='del'>-	afr_private_t   *priv = NULL;</div><div class='del'>-	int              enoent_count = 0;</div><div class='del'>-	int              govinda_gOvinda = 0;</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-	sh = &amp;local-&gt;self_heal;</div><div class='del'>-	priv = this-&gt;private;</div><div class='del'>-</div><div class='del'>-	for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='del'>-                if (!local-&gt;child_up[i])</div><div class='del'>-                        continue;</div><div class='del'>-</div><div class='del'>-		if (sh-&gt;child_errno[i]) {</div><div class='del'>-			if (sh-&gt;child_errno[i] == ENOENT)</div><div class='del'>-				enoent_count++;</div><div class='del'>-		} else {</div><div class='del'>-			if (type) {</div><div class='del'>-				if (type != sh-&gt;buf[i].ia_type) {</div><div class='del'>-                                        gf_log (this-&gt;name, GF_LOG_TRACE,</div><div class='del'>-                                                "file %s is govinda!",</div><div class='del'>-                                                local-&gt;loc.path);</div><div class='del'>-</div><div class='del'>-					govinda_gOvinda = 1;</div><div class='del'>-                                }</div><div class='del'>-			} else {</div><div class='del'>-				sh-&gt;source = i;</div><div class='del'>-				type = sh-&gt;buf[i].ia_type;</div><div class='del'>-			}</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	if (govinda_gOvinda) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-			"conflicting filetypes exist for path %s. returning.",</div><div class='del'>-			local-&gt;loc.path);</div><div class='del'>-</div><div class='del'>-		local-&gt;govinda_gOvinda = 1;</div><div class='del'>-		sh_missing_entries_finish (frame, this);</div><div class='del'>-		return 0;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	if (!type) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-			"no source found for %s. all nodes down?. returning.",</div><div class='del'>-			local-&gt;loc.path);</div><div class='del'>-		/* subvolumes down and/or file does not exist */</div><div class='del'>-		sh_missing_entries_finish (frame, this);</div><div class='del'>-		return 0;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	if (enoent_count == 0) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-			"no missing files - %s. proceeding to metadata check",</div><div class='del'>-			local-&gt;loc.path);</div><div class='del'>-		/* proceed to next step - metadata self-heal */</div><div class='del'>-		sh_missing_entries_finish (frame, this);</div><div class='del'>-		return 0;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	switch (type) {</div><div class='del'>-	case IA_IFSOCK:</div><div class='del'>-	case IA_IFREG:</div><div class='del'>-	case IA_IFBLK:</div><div class='del'>-	case IA_IFCHR:</div><div class='del'>-	case IA_IFIFO:</div><div class='del'>-		sh_missing_entries_mknod (frame, this);</div><div class='del'>-		break;</div><div class='del'>-	case IA_IFLNK:</div><div class='del'>-		sh_missing_entries_readlink (frame, this);</div><div class='del'>-		break;</div><div class='del'>-	case IA_IFDIR:</div><div class='del'>-		sh_missing_entries_mkdir (frame, this);</div><div class='del'>-		break;</div><div class='del'>-	default:</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-			"unknown file type: 0%o", type);</div><div class='del'>-		local-&gt;govinda_gOvinda = 1;</div><div class='del'>-		sh_missing_entries_finish (frame, this);</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='add'>+gf_boolean_t</div><div class='add'>+afr_is_data_set(xlator_t *this, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    return afr_is_pending_set(this, xdata, AFR_DATA_TRANSACTION);</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='del'>-static int</div><div class='del'>-sh_missing_entries_lookup_cbk (call_frame_t *frame, void *cookie,</div><div class='del'>-			       xlator_t *this,</div><div class='del'>-			       int32_t op_ret, int32_t op_errno,</div><div class='del'>-                               inode_t *inode, struct iatt *buf, dict_t *xattr,</div><div class='del'>-                               struct iatt *postparent)</div><div class='add'>+gf_boolean_t</div><div class='add'>+afr_is_metadata_set(xlator_t *this, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-	int              child_index = 0;</div><div class='del'>-	afr_local_t     *local = NULL;</div><div class='del'>-	int              call_count = 0;</div><div class='del'>-	afr_private_t   *priv = NULL;</div><div class='del'>-</div><div class='add'>+    return afr_is_pending_set(this, xdata, AFR_METADATA_TRANSACTION);</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-	priv = this-&gt;private;</div><div class='add'>+gf_boolean_t</div><div class='add'>+afr_is_entry_set(xlator_t *this, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    return afr_is_pending_set(this, xdata, AFR_ENTRY_TRANSACTION);</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	child_index = (long) cookie;</div><div class='add'>+/*</div><div class='add'>+ * This function inspects the looked up replies (in an unlocked manner)</div><div class='add'>+ * and decides whether a locked verification and possible healing is</div><div class='add'>+ * required or not. It updates the three booleans for each type</div><div class='add'>+ * of healing. If the boolean flag gets set to FALSE, then we are sure</div><div class='add'>+ * no healing is required. If the boolean flag gets set to TRUE then</div><div class='add'>+ * we have to proceed with locked reinspection.</div><div class='add'>+ */</div><div class='ctx'> </div><div class='del'>-	LOCK (&amp;frame-&gt;lock);</div><div class='del'>-	{</div><div class='del'>-		if (op_ret == 0) {</div><div class='del'>-			gf_log (this-&gt;name, GF_LOG_TRACE,</div><div class='del'>-				"path %s on subvolume %s is of mode 0%o",</div><div class='del'>-				local-&gt;loc.path,</div><div class='del'>-				priv-&gt;children[child_index]-&gt;name,</div><div class='del'>-				buf-&gt;ia_type);</div><div class='add'>+int</div><div class='add'>+afr_selfheal_unlocked_inspect(call_frame_t *frame, xlator_t *this, uuid_t gfid,</div><div class='add'>+                              inode_t **link_inode, gf_boolean_t *data_selfheal,</div><div class='add'>+                              gf_boolean_t *metadata_selfheal,</div><div class='add'>+                              gf_boolean_t *entry_selfheal,</div><div class='add'>+                              struct afr_reply *replies_dst)</div><div class='add'>+{</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    inode_t *inode = NULL;</div><div class='add'>+    int i = 0;</div><div class='add'>+    int valid_cnt = 0;</div><div class='add'>+    struct iatt first = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int first_idx = 0;</div><div class='add'>+    struct afr_reply *replies = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    inode = afr_inode_find(this, gfid);</div><div class='add'>+    if (!inode)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    replies = alloca0(sizeof(*replies) * priv-&gt;child_count);</div><div class='add'>+</div><div class='add'>+    ret = afr_selfheal_unlocked_discover(frame, inode, gfid, replies);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+        if (!replies[i].valid)</div><div class='add'>+            continue;</div><div class='add'>+        if (replies[i].op_ret == -1)</div><div class='add'>+            continue;</div><div class='add'>+</div><div class='add'>+        /* The data segment of the changelog can be non-zero to indicate</div><div class='add'>+         * the directory needs a full heal. So the check below ensures</div><div class='add'>+         * it's not a directory before setting the data_selfheal boolean.</div><div class='add'>+         */</div><div class='add'>+        if (data_selfheal &amp;&amp; !IA_ISDIR(replies[i].poststat.ia_type) &amp;&amp;</div><div class='add'>+            afr_is_data_set(this, replies[i].xdata))</div><div class='add'>+            *data_selfheal = _gf_true;</div><div class='ctx'> </div><div class='del'>-			local-&gt;self_heal.buf[child_index] = *buf;</div><div class='del'>-                        local-&gt;self_heal.parentbuf        = *postparent;</div><div class='del'>-		} else {</div><div class='del'>-			gf_log (this-&gt;name, GF_LOG_TRACE,</div><div class='del'>-				"path %s on subvolume %s =&gt; -1 (%s)",</div><div class='del'>-				local-&gt;loc.path,</div><div class='del'>-				priv-&gt;children[child_index]-&gt;name,</div><div class='del'>-				strerror (op_errno));</div><div class='add'>+        if (metadata_selfheal &amp;&amp; afr_is_metadata_set(this, replies[i].xdata))</div><div class='add'>+            *metadata_selfheal = _gf_true;</div><div class='ctx'> </div><div class='del'>-			local-&gt;self_heal.child_errno[child_index] = op_errno;</div><div class='del'>-		}</div><div class='add'>+        if (entry_selfheal &amp;&amp; afr_is_entry_set(this, replies[i].xdata))</div><div class='add'>+            *entry_selfheal = _gf_true;</div><div class='ctx'> </div><div class='del'>-	}</div><div class='del'>-	UNLOCK (&amp;frame-&gt;lock);</div><div class='add'>+        valid_cnt++;</div><div class='add'>+        if (valid_cnt == 1) {</div><div class='add'>+            first = replies[i].poststat;</div><div class='add'>+            first_idx = i;</div><div class='add'>+            continue;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-	call_count = afr_frame_return (frame);</div><div class='add'>+        if (!IA_EQUAL(first, replies[i].poststat, type)) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, 0, AFR_MSG_SPLIT_BRAIN,</div><div class='add'>+                   "TYPE mismatch %d vs %d on %s for gfid:%s",</div><div class='add'>+                   (int)first.ia_type, (int)replies[i].poststat.ia_type,</div><div class='add'>+                   priv-&gt;children[i]-&gt;name,</div><div class='add'>+                   uuid_utoa(replies[i].poststat.ia_gfid));</div><div class='add'>+            gf_event(EVENT_AFR_SPLIT_BRAIN,</div><div class='add'>+                     "client-pid=%d;"</div><div class='add'>+                     "subvol=%s;"</div><div class='add'>+                     "type=file;gfid=%s;"</div><div class='add'>+                     "ia_type-%d=%s;ia_type-%d=%s",</div><div class='add'>+                     this-&gt;ctx-&gt;cmd_args.client_pid, this-&gt;name,</div><div class='add'>+                     uuid_utoa(replies[i].poststat.ia_gfid), first_idx,</div><div class='add'>+                     gf_inode_type_to_str(first.ia_type), i,</div><div class='add'>+                     gf_inode_type_to_str(replies[i].poststat.ia_type));</div><div class='add'>+            ret = -EIO;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-	if (call_count == 0) {</div><div class='del'>-		sh_missing_entries_create (frame, this);</div><div class='del'>-	}</div><div class='add'>+        if (!IA_EQUAL(first, replies[i].poststat, uid)) {</div><div class='add'>+            gf_msg_debug(this-&gt;name, 0,</div><div class='add'>+                         "UID mismatch "</div><div class='add'>+                         "%d vs %d on %s for gfid:%s",</div><div class='add'>+                         (int)first.ia_uid, (int)replies[i].poststat.ia_uid,</div><div class='add'>+                         priv-&gt;children[i]-&gt;name,</div><div class='add'>+                         uuid_utoa(replies[i].poststat.ia_gfid));</div><div class='ctx'> </div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='add'>+            if (metadata_selfheal)</div><div class='add'>+                *metadata_selfheal = _gf_true;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='add'>+        if (!IA_EQUAL(first, replies[i].poststat, gid)) {</div><div class='add'>+            gf_msg_debug(this-&gt;name, 0,</div><div class='add'>+                         "GID mismatch "</div><div class='add'>+                         "%d vs %d on %s for gfid:%s",</div><div class='add'>+                         (int)first.ia_uid, (int)replies[i].poststat.ia_uid,</div><div class='add'>+                         priv-&gt;children[i]-&gt;name,</div><div class='add'>+                         uuid_utoa(replies[i].poststat.ia_gfid));</div><div class='ctx'> </div><div class='del'>-static int</div><div class='del'>-sh_missing_entries_lookup (call_frame_t *frame, xlator_t *this)</div><div class='del'>-{</div><div class='del'>-	afr_local_t    *local = NULL;</div><div class='del'>-	int             i = 0;</div><div class='del'>-	int             call_count = 0;</div><div class='del'>-	afr_private_t  *priv = NULL;</div><div class='del'>-	dict_t         *xattr_req = NULL;</div><div class='del'>-	int             ret = -1;</div><div class='add'>+            if (metadata_selfheal)</div><div class='add'>+                *metadata_selfheal = _gf_true;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-	priv  = this-&gt;private;</div><div class='add'>+        if (!IA_EQUAL(first, replies[i].poststat, prot)) {</div><div class='add'>+            gf_msg_debug(this-&gt;name, 0,</div><div class='add'>+                         "MODE mismatch "</div><div class='add'>+                         "%d vs %d on %s for gfid:%s",</div><div class='add'>+                         (int)st_mode_from_ia(first.ia_prot, 0),</div><div class='add'>+                         (int)st_mode_from_ia(replies[i].poststat.ia_prot, 0),</div><div class='add'>+                         priv-&gt;children[i]-&gt;name,</div><div class='add'>+                         uuid_utoa(replies[i].poststat.ia_gfid));</div><div class='add'>+</div><div class='add'>+            if (metadata_selfheal)</div><div class='add'>+                *metadata_selfheal = _gf_true;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-	call_count = afr_up_children_count (priv-&gt;child_count,</div><div class='del'>-                                            local-&gt;child_up);</div><div class='add'>+        if (IA_ISREG(first.ia_type) &amp;&amp;</div><div class='add'>+            !IA_EQUAL(first, replies[i].poststat, size)) {</div><div class='add'>+            gf_msg_debug(this-&gt;name, 0,</div><div class='add'>+                         "SIZE mismatch "</div><div class='add'>+                         "%lld vs %lld on %s for gfid:%s",</div><div class='add'>+                         (long long)first.ia_size,</div><div class='add'>+                         (long long)replies[i].poststat.ia_size,</div><div class='add'>+                         priv-&gt;children[i]-&gt;name,</div><div class='add'>+                         uuid_utoa(replies[i].poststat.ia_gfid));</div><div class='add'>+</div><div class='add'>+            if (data_selfheal)</div><div class='add'>+                *data_selfheal = _gf_true;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	local-&gt;call_count = call_count;</div><div class='add'>+    if (valid_cnt &gt; 0 &amp;&amp; link_inode) {</div><div class='add'>+        *link_inode = inode_link(inode, NULL, NULL, &amp;first);</div><div class='add'>+        if (!*link_inode) {</div><div class='add'>+            ret = -EINVAL;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    } else if (valid_cnt &lt; 2) {</div><div class='add'>+        ret = afr_check_stale_error(replies, priv);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	xattr_req = dict_new();</div><div class='add'>+    ret = 0;</div><div class='add'>+out:</div><div class='add'>+    if (replies &amp;&amp; replies_dst)</div><div class='add'>+        afr_replies_copy(replies_dst, replies, priv-&gt;child_count);</div><div class='add'>+    if (inode)</div><div class='add'>+        inode_unref(inode);</div><div class='add'>+    if (replies)</div><div class='add'>+        afr_replies_wipe(replies, priv-&gt;child_count);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	if (xattr_req) {</div><div class='del'>-                for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='del'>-                        ret = dict_set_uint64 (xattr_req,</div><div class='del'>-                                               priv-&gt;pending_key[i],</div><div class='del'>-                                               3 * sizeof(int32_t));</div><div class='del'>-                        if (ret &lt; 0)</div><div class='del'>-                                gf_log (this-&gt;name, GF_LOG_WARNING,</div><div class='del'>-                                        "Unable to set dict value.");</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='add'>+inode_t *</div><div class='add'>+afr_inode_find(xlator_t *this, uuid_t gfid)</div><div class='add'>+{</div><div class='add'>+    inode_table_t *table = NULL;</div><div class='add'>+    inode_t *inode = NULL;</div><div class='ctx'> </div><div class='del'>-	for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='del'>-		if (local-&gt;child_up[i]) {</div><div class='del'>-			gf_log (this-&gt;name, GF_LOG_TRACE,</div><div class='del'>-				"looking up %s on subvolume %s",</div><div class='del'>-				local-&gt;loc.path, priv-&gt;children[i]-&gt;name);</div><div class='add'>+    table = this-&gt;itable;</div><div class='add'>+    if (!table)</div><div class='add'>+        return NULL;</div><div class='ctx'> </div><div class='del'>-			STACK_WIND_COOKIE (frame,</div><div class='del'>-					   sh_missing_entries_lookup_cbk,</div><div class='del'>-					   (void *) (long) i,</div><div class='del'>-					   priv-&gt;children[i],</div><div class='del'>-					   priv-&gt;children[i]-&gt;fops-&gt;lookup,</div><div class='del'>-					   &amp;local-&gt;loc, xattr_req);</div><div class='add'>+    inode = inode_find(table, gfid);</div><div class='add'>+    if (inode)</div><div class='add'>+        return inode;</div><div class='ctx'> </div><div class='del'>-			if (!--call_count)</div><div class='del'>-				break;</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='add'>+    inode = inode_new(table);</div><div class='add'>+    if (!inode)</div><div class='add'>+        return NULL;</div><div class='ctx'> </div><div class='del'>-	if (xattr_req)</div><div class='del'>-		dict_unref (xattr_req);</div><div class='add'>+    gf_uuid_copy(inode-&gt;gfid, gfid);</div><div class='ctx'> </div><div class='del'>-	return 0;</div><div class='add'>+    return inode;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+call_frame_t *</div><div class='add'>+afr_frame_create(xlator_t *this, int32_t *op_errno)</div><div class='add'>+{</div><div class='add'>+    call_frame_t *frame = NULL;</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    pid_t pid = GF_CLIENT_PID_SELF_HEALD;</div><div class='ctx'> </div><div class='add'>+    frame = create_frame(this, this-&gt;ctx-&gt;pool);</div><div class='add'>+    if (!frame) {</div><div class='add'>+        if (op_errno)</div><div class='add'>+            *op_errno = ENOMEM;</div><div class='add'>+        return NULL;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-afr_sh_post_nonblocking_entrylk_cbk (call_frame_t *frame, xlator_t *this)</div><div class='del'>-{</div><div class='del'>-        afr_internal_lock_t *int_lock = NULL;</div><div class='del'>-        afr_local_t         *local    = NULL;</div><div class='add'>+    local = AFR_FRAME_INIT(frame, (*op_errno));</div><div class='add'>+    if (!local) {</div><div class='add'>+        STACK_DESTROY(frame-&gt;root);</div><div class='add'>+        return NULL;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        local    = frame-&gt;local;</div><div class='del'>-        int_lock = &amp;local-&gt;internal_lock;</div><div class='add'>+    syncopctx_setfspid(&amp;pid);</div><div class='ctx'> </div><div class='del'>-        if (int_lock-&gt;lock_op_ret &lt; 0) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-                        "Non blocking entrylks failed.");</div><div class='del'>-                afr_sh_missing_entries_done (frame, this);</div><div class='del'>-        } else {</div><div class='add'>+    frame-&gt;root-&gt;pid = pid;</div><div class='ctx'> </div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-                        "Non blocking entrylks done. Proceeding to FOP");</div><div class='del'>-                sh_missing_entries_lookup (frame, this);</div><div class='del'>-        }</div><div class='add'>+    afr_set_lk_owner(frame, this, frame-&gt;root);</div><div class='ctx'> </div><div class='del'>-        return 0;</div><div class='add'>+    return frame;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-static int</div><div class='del'>-afr_sh_entrylk (call_frame_t *frame, xlator_t *this)</div><div class='add'>+int</div><div class='add'>+afr_selfheal_newentry_mark(call_frame_t *frame, xlator_t *this, inode_t *inode,</div><div class='add'>+                           int source, struct afr_reply *replies,</div><div class='add'>+                           unsigned char *sources, unsigned char *newentry)</div><div class='ctx'> {</div><div class='del'>-        afr_internal_lock_t *int_lock = NULL;</div><div class='del'>-        afr_local_t         *local    = NULL;</div><div class='del'>-        afr_self_heal_t     *sh       = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    int i = 0;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    dict_t *xattr = NULL;</div><div class='add'>+    int **changelog = NULL;</div><div class='ctx'> </div><div class='del'>-        local    = frame-&gt;local;</div><div class='del'>-        int_lock = &amp;local-&gt;internal_lock;</div><div class='del'>-        sh       = &amp;local-&gt;self_heal;</div><div class='add'>+    priv = this-&gt;private;</div><div class='ctx'> </div><div class='del'>-        int_lock-&gt;transaction_lk_type = AFR_SELFHEAL_LK;</div><div class='del'>-        int_lock-&gt;selfheal_lk_type    = AFR_ENTRY_SELF_HEAL_LK;</div><div class='add'>+    gf_uuid_copy(inode-&gt;gfid, replies[source].poststat.ia_gfid);</div><div class='ctx'> </div><div class='del'>-        afr_set_lock_number (frame, this);</div><div class='add'>+    xattr = dict_new();</div><div class='add'>+    if (!xattr)</div><div class='add'>+        return -ENOMEM;</div><div class='ctx'> </div><div class='del'>-        int_lock-&gt;lk_basename = local-&gt;loc.name;</div><div class='del'>-        int_lock-&gt;lk_loc      = &amp;sh-&gt;parent_loc;</div><div class='del'>-        int_lock-&gt;lock_cbk    = afr_sh_post_nonblocking_entrylk_cbk;</div><div class='add'>+    changelog = afr_mark_pending_changelog(priv, newentry, xattr,</div><div class='add'>+                                           replies[source].poststat.ia_type);</div><div class='ctx'> </div><div class='del'>-        afr_nonblocking_entrylk (frame, this);</div><div class='add'>+    if (!changelog) {</div><div class='add'>+        ret = -ENOMEM;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        return 0;</div><div class='add'>+    for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+        if (!sources[i])</div><div class='add'>+            continue;</div><div class='add'>+        ret |= afr_selfheal_post_op(frame, this, inode, i, xattr, NULL);</div><div class='add'>+    }</div><div class='add'>+out:</div><div class='add'>+    if (changelog)</div><div class='add'>+        afr_matrix_cleanup(changelog, priv-&gt;child_count);</div><div class='add'>+    if (xattr)</div><div class='add'>+        dict_unref(xattr);</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-static int</div><div class='del'>-afr_self_heal_missing_entries (call_frame_t *frame, xlator_t *this)</div><div class='add'>+int</div><div class='add'>+afr_selfheal_do(call_frame_t *frame, xlator_t *this, uuid_t gfid)</div><div class='ctx'> {</div><div class='del'>-        afr_internal_lock_t *int_lock = NULL;</div><div class='del'>-	afr_local_t         *local    = NULL;</div><div class='del'>-	afr_self_heal_t     *sh       = NULL;</div><div class='del'>-	afr_private_t       *priv     = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int entry_ret = 1;</div><div class='add'>+    int metadata_ret = 1;</div><div class='add'>+    int data_ret = 1;</div><div class='add'>+    int or_ret = 0;</div><div class='add'>+    inode_t *inode = NULL;</div><div class='add'>+    fd_t *fd = NULL;</div><div class='add'>+    gf_boolean_t data_selfheal = _gf_false;</div><div class='add'>+    gf_boolean_t metadata_selfheal = _gf_false;</div><div class='add'>+    gf_boolean_t entry_selfheal = _gf_false;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    ret = afr_selfheal_unlocked_inspect(frame, this, gfid, &amp;inode,</div><div class='add'>+                                        &amp;data_selfheal, &amp;metadata_selfheal,</div><div class='add'>+                                        &amp;entry_selfheal, NULL);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    if (!(data_selfheal || metadata_selfheal || entry_selfheal)) {</div><div class='add'>+        ret = 2;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (inode-&gt;ia_type == IA_IFREG) {</div><div class='add'>+        ret = afr_selfheal_data_open(this, inode, &amp;fd);</div><div class='add'>+        if (!fd) {</div><div class='add'>+            ret = -EIO;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (data_selfheal &amp;&amp; priv-&gt;data_self_heal)</div><div class='add'>+        data_ret = afr_selfheal_data(frame, this, fd);</div><div class='add'>+</div><div class='add'>+    if (metadata_selfheal &amp;&amp; priv-&gt;metadata_self_heal)</div><div class='add'>+        metadata_ret = afr_selfheal_metadata(frame, this, inode);</div><div class='ctx'> </div><div class='del'>-	local    = frame-&gt;local;</div><div class='del'>-        int_lock = &amp;local-&gt;internal_lock;</div><div class='del'>-	sh       = &amp;local-&gt;self_heal;</div><div class='del'>-	priv     = this-&gt;private;</div><div class='add'>+    if (entry_selfheal &amp;&amp; priv-&gt;entry_self_heal)</div><div class='add'>+        entry_ret = afr_selfheal_entry(frame, this, inode);</div><div class='ctx'> </div><div class='del'>-	gf_log (this-&gt;name, GF_LOG_TRACE,</div><div class='del'>-		"attempting to recreate missing entries for path=%s",</div><div class='del'>-		local-&gt;loc.path);</div><div class='add'>+    or_ret = (data_ret | metadata_ret | entry_ret);</div><div class='ctx'> </div><div class='del'>-	afr_build_parent_loc (&amp;sh-&gt;parent_loc, &amp;local-&gt;loc);</div><div class='add'>+    if (data_ret == -EIO || metadata_ret == -EIO || entry_ret == -EIO)</div><div class='add'>+        ret = -EIO;</div><div class='add'>+    else if (data_ret == 1 &amp;&amp; metadata_ret == 1 &amp;&amp; entry_ret == 1)</div><div class='add'>+        ret = 1;</div><div class='add'>+    else if (or_ret &lt; 0)</div><div class='add'>+        ret = or_ret;</div><div class='add'>+    else</div><div class='add'>+        ret = 0;</div><div class='ctx'> </div><div class='del'>-        afr_sh_entrylk (frame, this);</div><div class='del'>-	return 0;</div><div class='add'>+out:</div><div class='add'>+    if (inode)</div><div class='add'>+        inode_unref(inode);</div><div class='add'>+    if (fd)</div><div class='add'>+        fd_unref(fd);</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='add'>+/*</div><div class='add'>+ * This is the entry point for healing a given GFID. The return values for this</div><div class='add'>+ * function are as follows:</div><div class='add'>+ * '0' if the self-heal is successful</div><div class='add'>+ * '1' if the afr-xattrs are non-zero (due to on-going IO) and no heal is needed</div><div class='add'>+ * '2' if the afr-xattrs are all-zero and no heal is needed</div><div class='add'>+ * $errno if the heal on the gfid failed.</div><div class='add'>+ */</div><div class='ctx'> </div><div class='del'>-afr_local_t *afr_local_copy (afr_local_t *l, xlator_t *this)</div><div class='add'>+int</div><div class='add'>+afr_selfheal(xlator_t *this, uuid_t gfid)</div><div class='ctx'> {</div><div class='del'>-        afr_private_t *priv = NULL;</div><div class='del'>-        afr_local_t   *lc     = NULL;</div><div class='del'>-        afr_self_heal_t *sh = NULL;</div><div class='del'>-        afr_self_heal_t *shc = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    call_frame_t *frame = NULL;</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='ctx'> </div><div class='add'>+    frame = afr_frame_create(this, NULL);</div><div class='add'>+    if (!frame)</div><div class='add'>+        return ret;</div><div class='ctx'> </div><div class='del'>-        priv = this-&gt;private;</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    local-&gt;xdata_req = dict_new();</div><div class='ctx'> </div><div class='del'>-        sh = &amp;l-&gt;self_heal;</div><div class='add'>+    ret = afr_selfheal_do(frame, this, gfid);</div><div class='ctx'> </div><div class='del'>-        lc = GF_CALLOC (1, sizeof (afr_local_t),</div><div class='del'>-                        gf_afr_mt_afr_local_t);</div><div class='add'>+    if (frame)</div><div class='add'>+        AFR_STACK_DESTROY(frame);</div><div class='ctx'> </div><div class='del'>-        shc = &amp;lc-&gt;self_heal;</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        shc-&gt;unwind = sh-&gt;unwind;</div><div class='del'>-        shc-&gt;need_data_self_heal = sh-&gt;need_data_self_heal;</div><div class='del'>-        shc-&gt;need_metadata_self_heal = sh-&gt;need_metadata_self_heal;</div><div class='del'>-        shc-&gt;need_entry_self_heal = sh-&gt;need_entry_self_heal;</div><div class='del'>-        shc-&gt;forced_merge = sh-&gt;forced_merge;</div><div class='del'>-        shc-&gt;healing_fd_opened = sh-&gt;healing_fd_opened;</div><div class='del'>-        shc-&gt;data_lock_held = sh-&gt;data_lock_held;</div><div class='del'>-        if (sh-&gt;healing_fd &amp;&amp; !sh-&gt;healing_fd_opened)</div><div class='del'>-                shc-&gt;healing_fd = fd_ref (sh-&gt;healing_fd);</div><div class='del'>-        else</div><div class='del'>-                shc-&gt;healing_fd = sh-&gt;healing_fd;</div><div class='del'>-        shc-&gt;background = sh-&gt;background;</div><div class='del'>-        shc-&gt;type = sh-&gt;type;</div><div class='del'>-</div><div class='del'>-        if (l-&gt;loc.path)</div><div class='del'>-                loc_copy (&amp;lc-&gt;loc, &amp;l-&gt;loc);</div><div class='del'>-</div><div class='del'>-        lc-&gt;child_up  = memdup (l-&gt;child_up, priv-&gt;child_count);</div><div class='del'>-        if (l-&gt;xattr_req)</div><div class='del'>-                lc-&gt;xattr_req = dict_ref (l-&gt;xattr_req);</div><div class='del'>-</div><div class='del'>-        if (l-&gt;cont.lookup.inode)</div><div class='del'>-                lc-&gt;cont.lookup.inode = inode_ref (l-&gt;cont.lookup.inode);</div><div class='del'>-        if (l-&gt;cont.lookup.xattr)</div><div class='del'>-                lc-&gt;cont.lookup.xattr = dict_ref (l-&gt;cont.lookup.xattr);</div><div class='del'>-        if (l-&gt;internal_lock.inode_locked_nodes)</div><div class='del'>-                lc-&gt;internal_lock.inode_locked_nodes =</div><div class='del'>-                        memdup (l-&gt;internal_lock.inode_locked_nodes,</div><div class='del'>-                                priv-&gt;child_count);</div><div class='del'>-        else</div><div class='del'>-                lc-&gt;internal_lock.inode_locked_nodes =</div><div class='del'>-                        GF_CALLOC (sizeof (*l-&gt;internal_lock.inode_locked_nodes),</div><div class='del'>-                                   priv-&gt;child_count,</div><div class='del'>-                                   gf_afr_mt_char);</div><div class='del'>-        if (l-&gt;internal_lock.entry_locked_nodes)</div><div class='del'>-                lc-&gt;internal_lock.entry_locked_nodes =</div><div class='del'>-                        memdup (l-&gt;internal_lock.entry_locked_nodes,</div><div class='del'>-                                priv-&gt;child_count);</div><div class='del'>-        else</div><div class='del'>-                lc-&gt;internal_lock.entry_locked_nodes =</div><div class='del'>-                        GF_CALLOC (sizeof (*l-&gt;internal_lock.entry_locked_nodes),</div><div class='del'>-                                   priv-&gt;child_count,</div><div class='del'>-                                   gf_afr_mt_char);</div><div class='del'>-        if (l-&gt;internal_lock.locked_nodes)</div><div class='del'>-                lc-&gt;internal_lock.locked_nodes =</div><div class='del'>-                        memdup (l-&gt;internal_lock.locked_nodes,</div><div class='del'>-                                priv-&gt;child_count);</div><div class='del'>-        else</div><div class='del'>-                lc-&gt;internal_lock.locked_nodes =</div><div class='del'>-                        GF_CALLOC (sizeof (*l-&gt;internal_lock.locked_nodes),</div><div class='del'>-                                   priv-&gt;child_count,</div><div class='del'>-                                   gf_afr_mt_char);</div><div class='add'>+afr_local_t *</div><div class='add'>+__afr_dequeue_heals(afr_private_t *priv)</div><div class='add'>+{</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+</div><div class='add'>+    if (list_empty(&amp;priv-&gt;heal_waiting))</div><div class='add'>+        goto none;</div><div class='add'>+    if ((priv-&gt;background_self_heal_count &gt; 0) &amp;&amp;</div><div class='add'>+        (priv-&gt;healers &gt;= priv-&gt;background_self_heal_count))</div><div class='add'>+        goto none;</div><div class='add'>+</div><div class='add'>+    local = list_entry(priv-&gt;heal_waiting.next, afr_local_t, healer);</div><div class='add'>+    priv-&gt;heal_waiters--;</div><div class='add'>+    GF_ASSERT(priv-&gt;heal_waiters &gt;= 0);</div><div class='add'>+    list_del_init(&amp;local-&gt;healer);</div><div class='add'>+    list_add(&amp;local-&gt;healer, &amp;priv-&gt;healing);</div><div class='add'>+    priv-&gt;healers++;</div><div class='add'>+    return local;</div><div class='add'>+none:</div><div class='add'>+    gf_msg_debug(THIS-&gt;name, 0,</div><div class='add'>+                 "Nothing dequeued. "</div><div class='add'>+                 "Num healers: %d, Num Waiters: %d",</div><div class='add'>+                 priv-&gt;healers, priv-&gt;heal_waiters);</div><div class='add'>+    return NULL;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        lc-&gt;internal_lock.inodelk_lock_count =</div><div class='del'>-                l-&gt;internal_lock.inodelk_lock_count;</div><div class='del'>-        lc-&gt;internal_lock.entrylk_lock_count =</div><div class='del'>-                l-&gt;internal_lock.entrylk_lock_count;</div><div class='add'>+int</div><div class='add'>+afr_refresh_selfheal_wrap(void *opaque)</div><div class='add'>+{</div><div class='add'>+    call_frame_t *heal_frame = opaque;</div><div class='add'>+    afr_local_t *local = heal_frame-&gt;local;</div><div class='add'>+    int ret = 0;</div><div class='ctx'> </div><div class='del'>-        return lc;</div><div class='add'>+    ret = afr_selfheal(heal_frame-&gt;this, local-&gt;refreshinode-&gt;gfid);</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-afr_self_heal_completion_cbk (call_frame_t *bgsh_frame, xlator_t *this)</div><div class='del'>-{</div><div class='del'>-        afr_private_t *   priv  = NULL;</div><div class='del'>-	afr_local_t *     local = NULL;</div><div class='del'>-        afr_self_heal_t * sh    = NULL;</div><div class='del'>-        char              sh_type_str[256] = {0,};</div><div class='del'>-</div><div class='del'>-        priv  = this-&gt;private;</div><div class='del'>-	local = bgsh_frame-&gt;local;</div><div class='del'>-        sh    = &amp;local-&gt;self_heal;</div><div class='del'>-</div><div class='del'>-	if (local-&gt;govinda_gOvinda) {</div><div class='del'>-                afr_set_split_brain (this, local-&gt;cont.lookup.inode, _gf_true);</div><div class='del'>-	} else {</div><div class='del'>-                afr_set_split_brain (this, local-&gt;cont.lookup.inode, _gf_false);</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-        afr_self_heal_type_str_get(sh, sh_type_str,</div><div class='del'>-                                   sizeof(sh_type_str));</div><div class='del'>-        gf_log (this-&gt;name, GF_LOG_NORMAL,</div><div class='del'>-                "background %s self-heal completed on %s", sh_type_str,</div><div class='del'>-                local-&gt;loc.path);</div><div class='del'>-</div><div class='del'>-        if (!sh-&gt;unwound) {</div><div class='del'>-                sh-&gt;unwind (sh-&gt;orig_frame, this);</div><div class='del'>-        }</div><div class='add'>+afr_refresh_heal_done(int ret, call_frame_t *frame, void *opaque)</div><div class='add'>+{</div><div class='add'>+    call_frame_t *heal_frame = opaque;</div><div class='add'>+    xlator_t *this = heal_frame-&gt;this;</div><div class='add'>+    afr_private_t *priv = this-&gt;private;</div><div class='add'>+    afr_local_t *local = heal_frame-&gt;local;</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;priv-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        list_del_init(&amp;local-&gt;healer);</div><div class='add'>+        priv-&gt;healers--;</div><div class='add'>+        GF_ASSERT(priv-&gt;healers &gt;= 0);</div><div class='add'>+        local = __afr_dequeue_heals(priv);</div><div class='add'>+    }</div><div class='add'>+    UNLOCK(&amp;priv-&gt;lock);</div><div class='add'>+</div><div class='add'>+    AFR_STACK_DESTROY(heal_frame);</div><div class='add'>+</div><div class='add'>+    if (local)</div><div class='add'>+        afr_heal_synctask(this, local);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        if (sh-&gt;background) {</div><div class='del'>-                LOCK (&amp;priv-&gt;lock);</div><div class='del'>-                {</div><div class='del'>-                        priv-&gt;background_self_heals_started--;</div><div class='del'>-                }</div><div class='del'>-                UNLOCK (&amp;priv-&gt;lock);</div><div class='add'>+void</div><div class='add'>+afr_heal_synctask(xlator_t *this, afr_local_t *local)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+    call_frame_t *heal_frame = NULL;</div><div class='add'>+</div><div class='add'>+    heal_frame = local-&gt;heal_frame;</div><div class='add'>+    ret = synctask_new(this-&gt;ctx-&gt;env, afr_refresh_selfheal_wrap,</div><div class='add'>+                       afr_refresh_heal_done, heal_frame, heal_frame);</div><div class='add'>+    if (ret &lt; 0)</div><div class='add'>+        /* Heal not launched. Will be queued when the next inode</div><div class='add'>+         * refresh happens and shd hasn't healed it yet. */</div><div class='add'>+        afr_refresh_heal_done(ret, heal_frame, heal_frame);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+gf_boolean_t</div><div class='add'>+afr_throttled_selfheal(call_frame_t *frame, xlator_t *this)</div><div class='add'>+{</div><div class='add'>+    gf_boolean_t can_heal = _gf_true;</div><div class='add'>+    afr_private_t *priv = this-&gt;private;</div><div class='add'>+    afr_local_t *local = frame-&gt;local;</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;priv-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        if ((priv-&gt;background_self_heal_count &gt; 0) &amp;&amp;</div><div class='add'>+            (priv-&gt;heal_wait_qlen + priv-&gt;background_self_heal_count) &gt;</div><div class='add'>+                (priv-&gt;heal_waiters + priv-&gt;healers)) {</div><div class='add'>+            list_add_tail(&amp;local-&gt;healer, &amp;priv-&gt;heal_waiting);</div><div class='add'>+            priv-&gt;heal_waiters++;</div><div class='add'>+            local = __afr_dequeue_heals(priv);</div><div class='add'>+        } else {</div><div class='add'>+            can_heal = _gf_false;</div><div class='ctx'>         }</div><div class='add'>+    }</div><div class='add'>+    UNLOCK(&amp;priv-&gt;lock);</div><div class='ctx'> </div><div class='del'>-        AFR_STACK_DESTROY (bgsh_frame);</div><div class='add'>+    if (can_heal) {</div><div class='add'>+        if (local)</div><div class='add'>+            afr_heal_synctask(this, local);</div><div class='add'>+        else</div><div class='add'>+            gf_msg_debug(this-&gt;name, 0,</div><div class='add'>+                         "Max number of heals are "</div><div class='add'>+                         "pending, background self-heal rejected.");</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	return 0;</div><div class='add'>+    return can_heal;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-afr_self_heal (call_frame_t *frame, xlator_t *this)</div><div class='add'>+afr_choose_source_by_policy(afr_private_t *priv, unsigned char *sources,</div><div class='add'>+                            afr_transaction_type type)</div><div class='ctx'> {</div><div class='del'>-	afr_local_t     *local = NULL;</div><div class='del'>-	afr_self_heal_t *sh = NULL;</div><div class='del'>-	afr_private_t   *priv = NULL;</div><div class='del'>-	int              i = 0;</div><div class='del'>-</div><div class='del'>-        call_frame_t *sh_frame = NULL;</div><div class='del'>-        afr_local_t  *sh_local = NULL;</div><div class='add'>+    int source = -1;</div><div class='add'>+    int i = 0;</div><div class='ctx'> </div><div class='add'>+    /* Give preference to local child to save on bandwidth */</div><div class='add'>+    for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+        if (priv-&gt;local[i] &amp;&amp; sources[i]) {</div><div class='add'>+            if ((type == AFR_DATA_TRANSACTION) &amp;&amp; AFR_IS_ARBITER_BRICK(priv, i))</div><div class='add'>+                continue;</div><div class='ctx'> </div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-	priv  = this-&gt;private;</div><div class='del'>-</div><div class='del'>-        afr_set_lk_owner (frame, this);</div><div class='del'>-</div><div class='del'>-        if (local-&gt;self_heal.background) {</div><div class='del'>-                LOCK (&amp;priv-&gt;lock);</div><div class='del'>-                {</div><div class='del'>-                        if (priv-&gt;background_self_heals_started</div><div class='del'>-                            &gt; priv-&gt;background_self_heal_count) {</div><div class='del'>-</div><div class='del'>-                                local-&gt;self_heal.background = _gf_false;</div><div class='add'>+            source = i;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-                        } else {</div><div class='del'>-                                priv-&gt;background_self_heals_started++;</div><div class='del'>-                        }</div><div class='del'>-                }</div><div class='del'>-                UNLOCK (&amp;priv-&gt;lock);</div><div class='add'>+    for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+        if (sources[i]) {</div><div class='add'>+            source = i;</div><div class='add'>+            goto out;</div><div class='ctx'>         }</div><div class='add'>+    }</div><div class='add'>+out:</div><div class='add'>+    return source;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        gf_log (this-&gt;name, GF_LOG_TRACE,</div><div class='del'>-                "performing self heal on %s (metadata=%d data=%d entry=%d)",</div><div class='del'>-                local-&gt;loc.path,</div><div class='del'>-                local-&gt;self_heal.need_metadata_self_heal,</div><div class='del'>-                local-&gt;self_heal.need_data_self_heal,</div><div class='del'>-                local-&gt;self_heal.need_entry_self_heal);</div><div class='del'>-</div><div class='del'>-        sh_frame        = copy_frame (frame);</div><div class='del'>-        sh_local        = afr_local_copy (local, this);</div><div class='del'>-        sh_frame-&gt;local = sh_local;</div><div class='del'>-        sh              = &amp;sh_local-&gt;self_heal;</div><div class='del'>-</div><div class='del'>-        sh-&gt;orig_frame  = frame;</div><div class='del'>-</div><div class='del'>-        sh-&gt;completion_cbk = afr_self_heal_completion_cbk;</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-	sh-&gt;buf = GF_CALLOC (priv-&gt;child_count, sizeof (struct stat),</div><div class='del'>-                             gf_afr_mt_stat);</div><div class='del'>-	sh-&gt;child_errno = GF_CALLOC (priv-&gt;child_count, sizeof (int),</div><div class='del'>-                                     gf_afr_mt_int);</div><div class='del'>-	sh-&gt;success = GF_CALLOC (priv-&gt;child_count, sizeof (int),</div><div class='del'>-                                gf_afr_mt_int);</div><div class='del'>-	sh-&gt;xattr = GF_CALLOC (priv-&gt;child_count, sizeof (dict_t *),</div><div class='del'>-                                gf_afr_mt_dict_t);</div><div class='del'>-	sh-&gt;sources = GF_CALLOC (sizeof (*sh-&gt;sources), priv-&gt;child_count,</div><div class='del'>-                                gf_afr_mt_int);</div><div class='del'>-	sh-&gt;locked_nodes = GF_CALLOC (sizeof (*sh-&gt;locked_nodes), </div><div class='del'>-                                      priv-&gt;child_count,</div><div class='del'>-                                      gf_afr_mt_int);</div><div class='del'>-</div><div class='del'>-	sh-&gt;pending_matrix = GF_CALLOC (sizeof (int32_t *), priv-&gt;child_count,</div><div class='del'>-                                        gf_afr_mt_int32_t);</div><div class='del'>-</div><div class='del'>-	for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='del'>-		sh-&gt;pending_matrix[i] = GF_CALLOC (sizeof (int32_t),</div><div class='del'>-					  	   priv-&gt;child_count,</div><div class='del'>-                                                   gf_afr_mt_int32_t);</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	sh-&gt;delta_matrix = GF_CALLOC (sizeof (int32_t *), priv-&gt;child_count,</div><div class='del'>-                                      gf_afr_mt_int32_t);</div><div class='del'>-	for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='del'>-		sh-&gt;delta_matrix[i] = GF_CALLOC (sizeof (int32_t),</div><div class='del'>-					         priv-&gt;child_count,</div><div class='del'>-                                                 gf_afr_mt_int32_t);</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	if (local-&gt;success_count &amp;&amp; local-&gt;enoent_count) {</div><div class='del'>-		afr_self_heal_missing_entries (sh_frame, this);</div><div class='del'>-	} else {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_TRACE,</div><div class='del'>-			"proceeding to metadata check on %s",</div><div class='del'>-			local-&gt;loc.path);</div><div class='del'>-</div><div class='del'>-		afr_sh_missing_entries_done (sh_frame, this);</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='add'>+static int</div><div class='add'>+afr_anon_inode_mkdir_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                         int32_t op_ret, int32_t op_errno, inode_t *inode,</div><div class='add'>+                         struct iatt *buf, struct iatt *preparent,</div><div class='add'>+                         struct iatt *postparent, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    afr_local_t *local = frame-&gt;local;</div><div class='add'>+    int i = (long)cookie;</div><div class='add'>+</div><div class='add'>+    local-&gt;replies[i].valid = 1;</div><div class='add'>+    local-&gt;replies[i].op_ret = op_ret;</div><div class='add'>+    local-&gt;replies[i].op_errno = op_errno;</div><div class='add'>+    if (op_ret == 0) {</div><div class='add'>+        local-&gt;op_ret = 0;</div><div class='add'>+        local-&gt;replies[i].poststat = *buf;</div><div class='add'>+        local-&gt;replies[i].preparent = *preparent;</div><div class='add'>+        local-&gt;replies[i].postparent = *postparent;</div><div class='add'>+    }</div><div class='add'>+    if (xdata) {</div><div class='add'>+        local-&gt;replies[i].xdata = dict_ref(xdata);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    syncbarrier_wake(&amp;local-&gt;barrier);</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-void</div><div class='del'>-afr_self_heal_type_str_get (afr_self_heal_t *self_heal_p, char *str,</div><div class='del'>-                            size_t size)</div><div class='add'>+int</div><div class='add'>+afr_anon_inode_create(xlator_t *this, int child, inode_t **linked_inode)</div><div class='ctx'> {</div><div class='del'>-        assert(str &amp;&amp; (size &gt; 0));</div><div class='add'>+    call_frame_t *frame = NULL;</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    afr_private_t *priv = this-&gt;private;</div><div class='add'>+    unsigned char *mkdir_on = alloca0(priv-&gt;child_count);</div><div class='add'>+    unsigned char *lookup_on = alloca0(priv-&gt;child_count);</div><div class='add'>+    loc_t loc = {0};</div><div class='add'>+    int32_t op_errno = 0;</div><div class='add'>+    int32_t child_op_errno = 0;</div><div class='add'>+    struct iatt iatt = {0};</div><div class='add'>+    dict_t *xdata = NULL;</div><div class='add'>+    uuid_t anon_inode_gfid = {0};</div><div class='add'>+    int mkdir_count = 0;</div><div class='add'>+    int i = 0;</div><div class='add'>+</div><div class='add'>+    /*Try to mkdir everywhere and return success if the dir exists on 'child'</div><div class='add'>+     */</div><div class='add'>+</div><div class='add'>+    if (!priv-&gt;use_anon_inode) {</div><div class='add'>+        op_errno = EINVAL;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    frame = afr_frame_create(this, &amp;op_errno);</div><div class='add'>+    if (op_errno) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    if (!local-&gt;child_up[child]) {</div><div class='add'>+        /*Other bricks may need mkdir so don't error out yet*/</div><div class='add'>+        child_op_errno = ENOTCONN;</div><div class='add'>+    }</div><div class='add'>+    gf_uuid_parse(priv-&gt;anon_gfid_str, anon_inode_gfid);</div><div class='add'>+    for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+        if (!local-&gt;child_up[i])</div><div class='add'>+            continue;</div><div class='add'>+</div><div class='add'>+        if (priv-&gt;anon_inode[i]) {</div><div class='add'>+            mkdir_on[i] = 0;</div><div class='add'>+        } else {</div><div class='add'>+            mkdir_on[i] = 1;</div><div class='add'>+            mkdir_count++;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        if (self_heal_p-&gt;need_metadata_self_heal) {</div><div class='del'>-                snprintf(str, size, " meta-data");</div><div class='add'>+    if (mkdir_count == 0) {</div><div class='add'>+        *linked_inode = inode_find(this-&gt;itable, anon_inode_gfid);</div><div class='add'>+        if (*linked_inode) {</div><div class='add'>+            op_errno = 0;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    loc.parent = inode_ref(this-&gt;itable-&gt;root);</div><div class='add'>+    loc.name = priv-&gt;anon_inode_name;</div><div class='add'>+    loc.inode = inode_new(this-&gt;itable);</div><div class='add'>+    if (!loc.inode) {</div><div class='add'>+        op_errno = ENOMEM;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    xdata = dict_new();</div><div class='add'>+    if (!xdata) {</div><div class='add'>+        op_errno = ENOMEM;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    op_errno = -dict_set_gfuuid(xdata, "gfid-req", anon_inode_gfid, _gf_true);</div><div class='add'>+    if (op_errno) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (mkdir_count == 0) {</div><div class='add'>+        memcpy(lookup_on, local-&gt;child_up, priv-&gt;child_count);</div><div class='add'>+        goto lookup;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    AFR_ONLIST(mkdir_on, frame, afr_anon_inode_mkdir_cbk, mkdir, &amp;loc, 0755, 0,</div><div class='add'>+               xdata);</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+        if (!mkdir_on[i]) {</div><div class='add'>+            continue;</div><div class='ctx'>         }</div><div class='ctx'> </div><div class='del'>-        if (self_heal_p-&gt;need_data_self_heal) {</div><div class='del'>-                snprintf(str + strlen(str), size - strlen(str),</div><div class='del'>-                         " data");</div><div class='add'>+        if (local-&gt;replies[i].op_ret == 0) {</div><div class='add'>+            priv-&gt;anon_inode[i] = 1;</div><div class='add'>+            iatt = local-&gt;replies[i].poststat;</div><div class='add'>+        } else if (local-&gt;replies[i].op_ret &lt; 0 &amp;&amp;</div><div class='add'>+                   local-&gt;replies[i].op_errno == EEXIST) {</div><div class='add'>+            lookup_on[i] = 1;</div><div class='add'>+        } else if (i == child) {</div><div class='add'>+            child_op_errno = local-&gt;replies[i].op_errno;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (AFR_COUNT(lookup_on, priv-&gt;child_count) == 0) {</div><div class='add'>+        goto link;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+lookup:</div><div class='add'>+    AFR_ONLIST(lookup_on, frame, afr_selfheal_discover_cbk, lookup, &amp;loc,</div><div class='add'>+               xdata);</div><div class='add'>+    for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+        if (!lookup_on[i]) {</div><div class='add'>+            continue;</div><div class='ctx'>         }</div><div class='ctx'> </div><div class='del'>-        if (self_heal_p-&gt;need_entry_self_heal) {</div><div class='del'>-                snprintf(str + strlen(str), size - strlen(str),</div><div class='del'>-                         " entry");</div><div class='add'>+        if (local-&gt;replies[i].op_ret == 0) {</div><div class='add'>+            if (gf_uuid_compare(anon_inode_gfid,</div><div class='add'>+                                local-&gt;replies[i].poststat.ia_gfid) == 0) {</div><div class='add'>+                priv-&gt;anon_inode[i] = 1;</div><div class='add'>+                iatt = local-&gt;replies[i].poststat;</div><div class='add'>+            } else {</div><div class='add'>+                if (i == child)</div><div class='add'>+                    child_op_errno = EINVAL;</div><div class='add'>+                gf_msg(this-&gt;name, GF_LOG_ERROR, 0, AFR_MSG_INVALID_DATA,</div><div class='add'>+                       "%s has gfid: %s", priv-&gt;anon_inode_name,</div><div class='add'>+                       uuid_utoa(local-&gt;replies[i].poststat.ia_gfid));</div><div class='add'>+            }</div><div class='add'>+        } else if (i == child) {</div><div class='add'>+            child_op_errno = local-&gt;replies[i].op_errno;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+link:</div><div class='add'>+    if (!gf_uuid_is_null(iatt.ia_gfid)) {</div><div class='add'>+        *linked_inode = inode_link(loc.inode, loc.parent, loc.name, &amp;iatt);</div><div class='add'>+        if (*linked_inode) {</div><div class='add'>+            op_errno = 0;</div><div class='add'>+            inode_lookup(*linked_inode);</div><div class='add'>+        } else {</div><div class='add'>+            op_errno = ENOMEM;</div><div class='ctx'>         }</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (xdata)</div><div class='add'>+        dict_unref(xdata);</div><div class='add'>+    loc_wipe(&amp;loc);</div><div class='add'>+    /*child_op_errno takes precedence*/</div><div class='add'>+    if (child_op_errno == 0) {</div><div class='add'>+        child_op_errno = op_errno;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (child_op_errno &amp;&amp; *linked_inode) {</div><div class='add'>+        inode_unref(*linked_inode);</div><div class='add'>+        *linked_inode = NULL;</div><div class='add'>+    }</div><div class='add'>+    if (frame)</div><div class='add'>+        AFR_STACK_DESTROY(frame);</div><div class='add'>+    return -child_op_errno;</div><div class='ctx'> }</div><div class='head'>diff --git a/xlators/cluster/afr/src/afr-self-heal-common.h b/xlators/cluster/afr/src/afr-self-heal-common.h<br/>deleted file mode 100644<br/>index 31f02f3f9e4..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/xlators/cluster/afr/src/afr-self-heal-common.h?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/cluster/afr/src/afr-self-heal-common.h</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,73 +0,0 @@</div><div class='del'>-/*</div><div class='del'>-  Copyright (c) 2008-2009 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='del'>-  This file is part of GlusterFS.</div><div class='del'>-</div><div class='del'>-  GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-  it under the terms of the GNU General Public License as published</div><div class='del'>-  by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-  or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-  GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-  WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-  General Public License for more details.</div><div class='del'>-</div><div class='del'>-  You should have received a copy of the GNU General Public License</div><div class='del'>-  along with this program.  If not, see</div><div class='del'>-  &lt;http://www.gnu.org/licenses/&gt;.</div><div class='del'>-*/</div><div class='del'>-</div><div class='del'>-#ifndef __AFR_SELF_HEAL_COMMON_H__</div><div class='del'>-#define __AFR_SELF_HEAL_COMMON_H__</div><div class='del'>-</div><div class='del'>-#define FILE_HAS_HOLES(buf) (((buf)-&gt;ia_size) &gt; ((buf)-&gt;ia_blocks * 512))</div><div class='del'>-</div><div class='del'>-typedef enum {</div><div class='del'>-        AFR_SELF_HEAL_ENTRY,</div><div class='del'>-        AFR_SELF_HEAL_METADATA,</div><div class='del'>-        AFR_SELF_HEAL_DATA,</div><div class='del'>-} afr_self_heal_type;</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-afr_sh_select_source (int sources[], int child_count);</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-afr_sh_sink_count (int sources[], int child_count);</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-afr_sh_source_count (int sources[], int child_count);</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-afr_sh_supress_errenous_children (int sources[], int child_errno[],</div><div class='del'>-				  int child_count);</div><div class='del'>-</div><div class='del'>-void</div><div class='del'>-afr_sh_print_pending_matrix (int32_t *pending_matrix[], xlator_t *this);</div><div class='del'>-</div><div class='del'>-void</div><div class='del'>-afr_sh_build_pending_matrix (afr_private_t *priv,</div><div class='del'>-                             int32_t *pending_matrix[], dict_t *xattr[],</div><div class='del'>-			     int child_count, afr_transaction_type type);</div><div class='del'>-</div><div class='del'>-void</div><div class='del'>-afr_sh_pending_to_delta (afr_private_t *priv, dict_t **xattr,</div><div class='del'>-                         int32_t *delta_matrix[], int success[],</div><div class='del'>-                         int child_count, afr_transaction_type type);</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-afr_sh_mark_sources (afr_self_heal_t *sh, int child_count,</div><div class='del'>-                     afr_self_heal_type type);</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-afr_sh_delta_to_xattr (afr_private_t *priv,</div><div class='del'>-                       int32_t *delta_matrix[], dict_t *xattr[],</div><div class='del'>-		       int child_count, afr_transaction_type type);</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-afr_sh_is_matrix_zero (int32_t *pending_matrix[], int child_count);</div><div class='del'>-</div><div class='del'>-void</div><div class='del'>-afr_self_heal_type_str_get (afr_self_heal_t *self_heal_p, char *str,</div><div class='del'>-                            size_t size);</div><div class='del'>-</div><div class='del'>-#endif /* __AFR_SELF_HEAL_COMMON_H__ */</div><div class='head'>diff --git a/xlators/cluster/afr/src/afr-self-heal-data.c b/xlators/cluster/afr/src/afr-self-heal-data.c<br/>index 0398d21b1bb..37bcc2b3f9e 100644<br/>--- a/<a href='/cgit/glusterfs.git/tree/xlators/cluster/afr/src/afr-self-heal-data.c?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/cluster/afr/src/afr-self-heal-data.c</a><br/>+++ b/<a href='/cgit/glusterfs.git/tree/xlators/cluster/afr/src/afr-self-heal-data.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>xlators/cluster/afr/src/afr-self-heal-data.c</a></div><div class='hunk'>@@ -1,1113 +1,891 @@</div><div class='ctx'> /*</div><div class='del'>-   Copyright (c) 2008-2009 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='del'>-   This file is part of GlusterFS.</div><div class='del'>-</div><div class='del'>-   GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-   it under the terms of the GNU General Public License as published</div><div class='del'>-   by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-   or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-   GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-   WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-   General Public License for more details.</div><div class='del'>-</div><div class='del'>-   You should have received a copy of the GNU General Public License</div><div class='del'>-   along with this program.  If not, see</div><div class='del'>-   &lt;http://www.gnu.org/licenses/&gt;.</div><div class='del'>-*/</div><div class='del'>-</div><div class='del'>-#include &lt;libgen.h&gt;</div><div class='del'>-#include &lt;unistd.h&gt;</div><div class='del'>-#include &lt;fnmatch.h&gt;</div><div class='del'>-#include &lt;sys/time.h&gt;</div><div class='del'>-#include &lt;stdlib.h&gt;</div><div class='del'>-#include &lt;signal.h&gt;</div><div class='add'>+  Copyright (c) 2013 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='ctx'> </div><div class='del'>-#ifndef _CONFIG_H</div><div class='del'>-#define _CONFIG_H</div><div class='del'>-#include "config.h"</div><div class='del'>-#endif</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='ctx'> </div><div class='del'>-#include "glusterfs.h"</div><div class='ctx'> #include "afr.h"</div><div class='del'>-#include "dict.h"</div><div class='del'>-#include "xlator.h"</div><div class='del'>-#include "hashfn.h"</div><div class='del'>-#include "logging.h"</div><div class='del'>-#include "stack.h"</div><div class='del'>-#include "list.h"</div><div class='del'>-#include "call-stub.h"</div><div class='del'>-#include "defaults.h"</div><div class='del'>-#include "common-utils.h"</div><div class='del'>-#include "compat-errno.h"</div><div class='del'>-#include "compat.h"</div><div class='del'>-#include "byte-order.h"</div><div class='del'>-</div><div class='del'>-#include "afr-transaction.h"</div><div class='ctx'> #include "afr-self-heal.h"</div><div class='del'>-#include "afr-self-heal-common.h"</div><div class='del'>-#include "afr-self-heal-algorithm.h"</div><div class='del'>-</div><div class='add'>+#include &lt;glusterfs/byte-order.h&gt;</div><div class='add'>+#include "protocol-common.h"</div><div class='add'>+#include "afr-messages.h"</div><div class='add'>+#include &lt;glusterfs/events.h&gt;</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-afr_sh_data_done (call_frame_t *frame, xlator_t *this)</div><div class='add'>+#define HAS_HOLES(i) ((i-&gt;ia_blocks * 512) &lt; (i-&gt;ia_size))</div><div class='add'>+static int</div><div class='add'>+__checksum_cbk(call_frame_t *frame, void *cookie, xlator_t *this, int op_ret,</div><div class='add'>+               int op_errno, uint32_t weak, uint8_t *strong, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-	afr_local_t     *local = NULL;</div><div class='del'>-	afr_self_heal_t *sh = NULL;</div><div class='del'>-	afr_private_t   *priv = NULL;</div><div class='del'>-</div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-	sh = &amp;local-&gt;self_heal;</div><div class='del'>-	priv = this-&gt;private;</div><div class='del'>-</div><div class='del'>-	/* </div><div class='del'>-	   TODO: cleanup sh-&gt;* </div><div class='del'>-	 */</div><div class='del'>-</div><div class='del'>-        if (sh-&gt;healing_fd &amp;&amp; !sh-&gt;healing_fd_opened) {</div><div class='del'>-                /* unref only if we created the fd ourselves */</div><div class='del'>-</div><div class='del'>-		fd_unref (sh-&gt;healing_fd);</div><div class='del'>-		sh-&gt;healing_fd = NULL;</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    struct afr_reply *replies = NULL;</div><div class='add'>+    int i = (long)cookie;</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    replies = local-&gt;replies;</div><div class='add'>+</div><div class='add'>+    replies[i].valid = 1;</div><div class='add'>+    replies[i].op_ret = op_ret;</div><div class='add'>+    replies[i].op_errno = op_errno;</div><div class='add'>+    if (xdata) {</div><div class='add'>+        replies[i].buf_has_zeroes = dict_get_str_boolean(</div><div class='add'>+            xdata, "buf-has-zeroes", _gf_false);</div><div class='add'>+        replies[i].fips_mode_rchecksum = dict_get_str_boolean(</div><div class='add'>+            xdata, "fips-mode-rchecksum", _gf_false);</div><div class='add'>+    }</div><div class='add'>+    if (strong) {</div><div class='add'>+        if (replies[i].fips_mode_rchecksum) {</div><div class='add'>+            memcpy(local-&gt;replies[i].checksum, strong, SHA256_DIGEST_LENGTH);</div><div class='add'>+        } else {</div><div class='add'>+            memcpy(local-&gt;replies[i].checksum, strong, MD5_DIGEST_LENGTH);</div><div class='ctx'>         }</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-/*         for (i = 0; i &lt; priv-&gt;child_count; i++) */</div><div class='del'>-/*                 sh-&gt;locked_nodes[i] = 0; */</div><div class='del'>-</div><div class='del'>-	gf_log (this-&gt;name, GF_LOG_TRACE,</div><div class='del'>-		"self heal of %s completed",</div><div class='del'>-		local-&gt;loc.path);</div><div class='del'>-</div><div class='del'>-	sh-&gt;completion_cbk (frame, this);</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='add'>+    syncbarrier_wake(&amp;local-&gt;barrier);</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-afr_sh_data_flush_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-		       int32_t op_ret, int32_t op_errno)</div><div class='add'>+static gf_boolean_t</div><div class='add'>+__afr_can_skip_data_block_heal(call_frame_t *frame, xlator_t *this, fd_t *fd,</div><div class='add'>+                               int source, unsigned char *healed_sinks,</div><div class='add'>+                               off_t offset, size_t size, struct iatt *poststat)</div><div class='ctx'> {</div><div class='del'>-	afr_local_t     *local = NULL;</div><div class='del'>-	afr_private_t   *priv  = NULL;</div><div class='del'>-	int              call_count = 0;</div><div class='del'>-</div><div class='del'>-        int child_index = (long) cookie;</div><div class='del'>-</div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-	priv = this-&gt;private;</div><div class='del'>-</div><div class='del'>-	LOCK (&amp;frame-&gt;lock);</div><div class='del'>-	{</div><div class='del'>-                if (op_ret == -1) {</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-                                "flush or setattr failed on %s on subvolume %s: %s",</div><div class='del'>-                                local-&gt;loc.path, priv-&gt;children[child_index]-&gt;name,</div><div class='del'>-                                strerror (op_errno));</div><div class='del'>-                }</div><div class='del'>-	}</div><div class='del'>-	UNLOCK (&amp;frame-&gt;lock);</div><div class='del'>-</div><div class='del'>-	call_count = afr_frame_return (frame);</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    unsigned char *wind_subvols = NULL;</div><div class='add'>+    gf_boolean_t checksum_match = _gf_true;</div><div class='add'>+    struct afr_reply *replies = NULL;</div><div class='add'>+    dict_t *xdata = NULL;</div><div class='add'>+    int i = 0;</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    replies = local-&gt;replies;</div><div class='add'>+</div><div class='add'>+    xdata = dict_new();</div><div class='add'>+    if (!xdata)</div><div class='add'>+        goto out;</div><div class='add'>+    if (dict_set_int32_sizen(xdata, "check-zero-filled", 1)) {</div><div class='add'>+        dict_unref(xdata);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    wind_subvols = alloca0(priv-&gt;child_count);</div><div class='add'>+    for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+        if (i == source || healed_sinks[i])</div><div class='add'>+            wind_subvols[i] = 1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    AFR_ONLIST(wind_subvols, frame, __checksum_cbk, rchecksum, fd, offset, size,</div><div class='add'>+               xdata);</div><div class='add'>+    if (xdata)</div><div class='add'>+        dict_unref(xdata);</div><div class='add'>+</div><div class='add'>+    if (!replies[source].valid || replies[source].op_ret != 0)</div><div class='add'>+        return _gf_false;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+        if (i == source)</div><div class='add'>+            continue;</div><div class='add'>+        if (replies[i].valid) {</div><div class='add'>+            if (memcmp(replies[source].checksum, replies[i].checksum,</div><div class='add'>+                       replies[source].fips_mode_rchecksum</div><div class='add'>+                           ? SHA256_DIGEST_LENGTH</div><div class='add'>+                           : MD5_DIGEST_LENGTH)) {</div><div class='add'>+                checksum_match = _gf_false;</div><div class='add'>+                break;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	if (call_count == 0) {</div><div class='del'>-		afr_sh_data_done (frame, this);</div><div class='del'>-	}</div><div class='add'>+    if (checksum_match) {</div><div class='add'>+        if (HAS_HOLES(poststat))</div><div class='add'>+            return _gf_true;</div><div class='ctx'> </div><div class='del'>-	return 0;</div><div class='add'>+        /* For non-sparse files, we might be better off writing the</div><div class='add'>+         * zeroes to sinks to avoid mismatch of disk-usage in bricks. */</div><div class='add'>+        if (local-&gt;replies[source].buf_has_zeroes)</div><div class='add'>+            return _gf_false;</div><div class='add'>+        else</div><div class='add'>+            return _gf_true;</div><div class='add'>+    }</div><div class='add'>+out:</div><div class='add'>+    return _gf_false;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-afr_sh_data_setattr_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-                        int32_t op_ret, int32_t op_errno, struct iatt *statpre, struct iatt *statpost)</div><div class='add'>+static gf_boolean_t</div><div class='add'>+__afr_is_sink_zero_filled(xlator_t *this, fd_t *fd, size_t size, off_t offset,</div><div class='add'>+                          int sink)</div><div class='ctx'> {</div><div class='del'>-        afr_sh_data_flush_cbk (frame, cookie, this, op_ret, op_errno);</div><div class='del'>-</div><div class='del'>-        return 0;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    struct iobref *iobref = NULL;</div><div class='add'>+    struct iovec *iovec = NULL;</div><div class='add'>+    int count = 0;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    gf_boolean_t zero_filled = _gf_false;</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+    ret = syncop_readv(priv-&gt;children[sink], fd, size, offset, 0, &amp;iovec,</div><div class='add'>+                       &amp;count, &amp;iobref, NULL, NULL, NULL);</div><div class='add'>+    if (ret &lt; 0)</div><div class='add'>+        goto out;</div><div class='add'>+    ret = iov_0filled(iovec, count);</div><div class='add'>+    if (!ret)</div><div class='add'>+        zero_filled = _gf_true;</div><div class='add'>+out:</div><div class='add'>+    if (iovec)</div><div class='add'>+        GF_FREE(iovec);</div><div class='add'>+    if (iobref)</div><div class='add'>+        iobref_unref(iobref);</div><div class='add'>+    return zero_filled;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-afr_sh_data_close (call_frame_t *frame, xlator_t *this)</div><div class='add'>+static int</div><div class='add'>+__afr_selfheal_data_read_write(call_frame_t *frame, xlator_t *this, fd_t *fd,</div><div class='add'>+                               int source, unsigned char *healed_sinks,</div><div class='add'>+                               off_t offset, size_t size,</div><div class='add'>+                               struct afr_reply *replies, int type)</div><div class='ctx'> {</div><div class='del'>-	afr_local_t     *local = NULL;</div><div class='del'>-	afr_private_t   *priv  = NULL;</div><div class='del'>-	afr_self_heal_t *sh    = NULL;</div><div class='del'>-</div><div class='del'>-	int  i            = 0;</div><div class='del'>-	int  call_count   = 0;</div><div class='del'>-        int  source       = 0;</div><div class='del'>-        int32_t valid     = 0;</div><div class='del'>-</div><div class='del'>-        struct iatt stbuf = {0,};</div><div class='del'>-</div><div class='del'>-        local = frame-&gt;local;</div><div class='del'>-        sh    = &amp;local-&gt;self_heal;</div><div class='del'>-        priv  = this-&gt;private;</div><div class='del'>-</div><div class='del'>-        source       = sh-&gt;source;</div><div class='del'>-</div><div class='del'>-        valid |= (GF_SET_ATTR_ATIME | GF_SET_ATTR_MTIME);</div><div class='del'>-</div><div class='del'>-	stbuf.ia_atime = sh-&gt;buf[source].ia_atime;</div><div class='del'>-	stbuf.ia_atime_nsec = sh-&gt;buf[source].ia_atime_nsec;</div><div class='del'>-	stbuf.ia_mtime = sh-&gt;buf[source].ia_mtime;</div><div class='del'>-	stbuf.ia_mtime_nsec = sh-&gt;buf[source].ia_mtime_nsec;</div><div class='del'>-</div><div class='del'>-        if (sh-&gt;healing_fd_opened) {</div><div class='del'>-                /* not our job to close the fd */</div><div class='add'>+    struct iovec *iovec = NULL;</div><div class='add'>+    int count = 0;</div><div class='add'>+    struct iobref *iobref = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    int i = 0;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    ret = syncop_readv(priv-&gt;children[source], fd, size, offset, 0, &amp;iovec,</div><div class='add'>+                       &amp;count, &amp;iobref, NULL, NULL, NULL);</div><div class='add'>+    if (ret &lt;= 0)</div><div class='add'>+        return ret;</div><div class='ctx'> </div><div class='del'>-                afr_sh_data_done (frame, this);</div><div class='del'>-                return 0;</div><div class='add'>+    for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+        if (!healed_sinks[i])</div><div class='add'>+            continue;</div><div class='add'>+</div><div class='add'>+            /*</div><div class='add'>+             * TODO: Use fiemap() and discard() to heal holes</div><div class='add'>+             * in the future.</div><div class='add'>+             *</div><div class='add'>+             * For now,</div><div class='add'>+             *</div><div class='add'>+             * - if the source had any holes at all,</div><div class='add'>+             * AND</div><div class='add'>+             * - if we are writing past the original file size</div><div class='add'>+             *   of the sink</div><div class='add'>+             * AND</div><div class='add'>+             * - is NOT the last block of the source file. if</div><div class='add'>+             *   the block contains EOF, it has to be written</div><div class='add'>+             *   in order to set the file size even if the</div><div class='add'>+             *   last block is 0-filled.</div><div class='add'>+             * AND</div><div class='add'>+             * - if the read buffer is filled with only 0's</div><div class='add'>+             *</div><div class='add'>+             * then, skip writing to this source. We don't depend</div><div class='add'>+             * on the write to happen to update the size as we</div><div class='add'>+             * have performed an ftruncate() upfront anyways.</div><div class='add'>+             */</div><div class='add'>+#define is_last_block(o, b, s) ((s &gt;= o) &amp;&amp; (s &lt;= (o + b)))</div><div class='add'>+        if (HAS_HOLES((&amp;replies[source].poststat)) &amp;&amp;</div><div class='add'>+            offset &gt;= replies[i].poststat.ia_size &amp;&amp;</div><div class='add'>+            !is_last_block(offset, size, replies[source].poststat.ia_size) &amp;&amp;</div><div class='add'>+            (iov_0filled(iovec, count) == 0))</div><div class='add'>+            continue;</div><div class='add'>+</div><div class='add'>+        /* Avoid filling up sparse regions of the sink with 0-filled</div><div class='add'>+         * writes.*/</div><div class='add'>+        if (type == AFR_SELFHEAL_DATA_FULL &amp;&amp;</div><div class='add'>+            HAS_HOLES((&amp;replies[source].poststat)) &amp;&amp;</div><div class='add'>+            ((offset + size) &lt;= replies[i].poststat.ia_size) &amp;&amp;</div><div class='add'>+            (iov_0filled(iovec, count) == 0) &amp;&amp;</div><div class='add'>+            __afr_is_sink_zero_filled(this, fd, size, offset, i)) {</div><div class='add'>+            continue;</div><div class='ctx'>         }</div><div class='ctx'> </div><div class='del'>-	if (!sh-&gt;healing_fd) {</div><div class='del'>-		afr_sh_data_done (frame, this);</div><div class='del'>-		return 0;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	call_count        = (sh-&gt;active_sinks + 1) * 2;</div><div class='del'>-	local-&gt;call_count = call_count;</div><div class='del'>-</div><div class='del'>-	/* closed source */</div><div class='del'>-	gf_log (this-&gt;name, GF_LOG_TRACE,</div><div class='del'>-		"closing fd of %s on %s",</div><div class='del'>-		local-&gt;loc.path, priv-&gt;children[sh-&gt;source]-&gt;name);</div><div class='del'>-</div><div class='del'>-	STACK_WIND_COOKIE (frame, afr_sh_data_flush_cbk,</div><div class='del'>-			   (void *) (long) sh-&gt;source,</div><div class='del'>-			   priv-&gt;children[sh-&gt;source],</div><div class='del'>-			   priv-&gt;children[sh-&gt;source]-&gt;fops-&gt;flush,</div><div class='del'>-			   sh-&gt;healing_fd);</div><div class='del'>-	call_count--;</div><div class='del'>-</div><div class='del'>-        STACK_WIND_COOKIE (frame, afr_sh_data_setattr_cbk,</div><div class='del'>-                           (void *) (long) sh-&gt;source,</div><div class='del'>-                           priv-&gt;children[sh-&gt;source],</div><div class='del'>-                           priv-&gt;children[sh-&gt;source]-&gt;fops-&gt;setattr,</div><div class='del'>-                           &amp;local-&gt;loc, &amp;stbuf, valid);</div><div class='del'>-</div><div class='del'>-        call_count--;</div><div class='del'>-</div><div class='del'>-        if (call_count == 0)</div><div class='del'>-                return 0;</div><div class='del'>-</div><div class='del'>-	for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='del'>-		if (sh-&gt;sources[i] || !local-&gt;child_up[i])</div><div class='del'>-			continue;</div><div class='del'>-</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_TRACE,</div><div class='del'>-			"closing fd of %s on %s",</div><div class='del'>-			local-&gt;loc.path, priv-&gt;children[i]-&gt;name);</div><div class='del'>-</div><div class='del'>-		STACK_WIND_COOKIE (frame, afr_sh_data_flush_cbk,</div><div class='del'>-				   (void *) (long) i,</div><div class='del'>-				   priv-&gt;children[i],</div><div class='del'>-				   priv-&gt;children[i]-&gt;fops-&gt;flush,</div><div class='del'>-				   sh-&gt;healing_fd);</div><div class='del'>-</div><div class='del'>-                call_count--;</div><div class='del'>-</div><div class='del'>-                STACK_WIND_COOKIE (frame, afr_sh_data_setattr_cbk,</div><div class='del'>-				   (void *) (long) i,</div><div class='del'>-				   priv-&gt;children[i],</div><div class='del'>-				   priv-&gt;children[i]-&gt;fops-&gt;setattr,</div><div class='del'>-				   &amp;local-&gt;loc, &amp;stbuf, valid);</div><div class='del'>-</div><div class='del'>-		if (!--call_count)</div><div class='del'>-			break;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='add'>+        ret = syncop_writev(priv-&gt;children[i], fd, iovec, count, offset, iobref,</div><div class='add'>+                            0, NULL, NULL, NULL, NULL);</div><div class='add'>+        if (ret != iov_length(iovec, count)) {</div><div class='add'>+            /* write() failed on this sink. unset the corresponding</div><div class='add'>+               member in sinks[] (which is healed_sinks[] in the</div><div class='add'>+               caller) so that this server does NOT get considered</div><div class='add'>+               as successfully healed.</div><div class='add'>+            */</div><div class='add'>+            healed_sinks[i] = 0;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    if (iovec)</div><div class='add'>+        GF_FREE(iovec);</div><div class='add'>+    if (iobref)</div><div class='add'>+        iobref_unref(iobref);</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-afr_sh_data_unlck_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-		       int32_t op_ret, int32_t op_errno)</div><div class='del'>-{</div><div class='del'>-	afr_local_t * local = NULL;</div><div class='del'>-	int           call_count = 0;</div><div class='del'>-	int           child_index = (long) cookie;</div><div class='del'>-</div><div class='del'>-	</div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-</div><div class='del'>-	LOCK (&amp;frame-&gt;lock);</div><div class='del'>-	{</div><div class='del'>-		if (op_ret == -1) {</div><div class='del'>-			gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-				"locking inode of %s on child %d failed: %s",</div><div class='del'>-				local-&gt;loc.path, child_index,</div><div class='del'>-				strerror (op_errno));</div><div class='del'>-		} else {</div><div class='del'>-			gf_log (this-&gt;name, GF_LOG_TRACE,</div><div class='del'>-				"inode of %s on child %d locked",</div><div class='del'>-				local-&gt;loc.path, child_index);</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='del'>-	UNLOCK (&amp;frame-&gt;lock);</div><div class='del'>-</div><div class='del'>-	call_count = afr_frame_return (frame);</div><div class='del'>-</div><div class='del'>-	if (call_count == 0) {</div><div class='del'>-		afr_sh_data_close (frame, this);</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-afr_sh_data_unlock (call_frame_t *frame, xlator_t *this)</div><div class='add'>+static gf_boolean_t</div><div class='add'>+afr_source_sinks_locked(xlator_t *this, unsigned char *locked_on, int source,</div><div class='add'>+                        unsigned char *healed_sinks)</div><div class='ctx'> {</div><div class='del'>-        afr_local_t         *local    = NULL;</div><div class='del'>-        afr_internal_lock_t *int_lock = NULL;</div><div class='del'>-	afr_self_heal_t     *sh       = NULL;</div><div class='add'>+    afr_private_t *priv = this-&gt;private;</div><div class='add'>+    int i = 0;</div><div class='ctx'> </div><div class='del'>-        local    = frame-&gt;local;</div><div class='del'>-        int_lock = &amp;local-&gt;internal_lock;</div><div class='del'>-	sh       = &amp;local-&gt;self_heal;</div><div class='add'>+    if (!locked_on[source])</div><div class='add'>+        return _gf_false;</div><div class='ctx'> </div><div class='del'>-        GF_ASSERT (!sh-&gt;data_lock_held);</div><div class='add'>+    for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+        if (healed_sinks[i] &amp;&amp; locked_on[i])</div><div class='add'>+            return _gf_true;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        int_lock-&gt;lock_cbk = afr_sh_data_close;</div><div class='del'>-        afr_unlock (frame, this);</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='add'>+    return _gf_false;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-afr_sh_data_finish (call_frame_t *frame, xlator_t *this)</div><div class='add'>+static int</div><div class='add'>+afr_selfheal_data_block(call_frame_t *frame, xlator_t *this, fd_t *fd,</div><div class='add'>+                        int source, unsigned char *healed_sinks, off_t offset,</div><div class='add'>+                        size_t size, int type, struct afr_reply *replies)</div><div class='ctx'> {</div><div class='del'>-	afr_local_t   *local = NULL;</div><div class='del'>-	afr_self_heal_t *sh = NULL;</div><div class='del'>-</div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-	sh = &amp;local-&gt;self_heal;</div><div class='del'>-</div><div class='del'>-	gf_log (this-&gt;name, GF_LOG_TRACE,</div><div class='del'>-		"finishing data selfheal of %s", local-&gt;loc.path);</div><div class='add'>+    int ret = -1;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    unsigned char *data_lock = NULL;</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+    data_lock = alloca0(priv-&gt;child_count);</div><div class='add'>+</div><div class='add'>+    ret = afr_selfheal_inodelk(frame, this, fd-&gt;inode, this-&gt;name, offset, size,</div><div class='add'>+                               data_lock);</div><div class='add'>+    {</div><div class='add'>+        if (!afr_source_sinks_locked(this, data_lock, source, healed_sinks)) {</div><div class='add'>+            ret = -ENOTCONN;</div><div class='add'>+            goto unlock;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-        if (!sh-&gt;data_lock_held)</div><div class='del'>-                afr_sh_data_unlock (frame, this);</div><div class='del'>-        else</div><div class='del'>-                afr_sh_data_close (frame, this);</div><div class='add'>+        if (type == AFR_SELFHEAL_DATA_DIFF &amp;&amp;</div><div class='add'>+            __afr_can_skip_data_block_heal(frame, this, fd, source,</div><div class='add'>+                                           healed_sinks, offset, size,</div><div class='add'>+                                           &amp;replies[source].poststat)) {</div><div class='add'>+            ret = 0;</div><div class='add'>+            goto unlock;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-	return 0;</div><div class='add'>+        ret = __afr_selfheal_data_read_write(</div><div class='add'>+            frame, this, fd, source, healed_sinks, offset, size, replies, type);</div><div class='add'>+    }</div><div class='add'>+unlock:</div><div class='add'>+    afr_selfheal_uninodelk(frame, this, fd-&gt;inode, this-&gt;name, offset, size,</div><div class='add'>+                           data_lock);</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-afr_sh_data_erase_pending_cbk (call_frame_t *frame, void *cookie,</div><div class='del'>-			       xlator_t *this, int32_t op_ret,</div><div class='del'>-			       int32_t op_errno, dict_t *xattr)</div><div class='add'>+static int</div><div class='add'>+afr_selfheal_data_fsync(call_frame_t *frame, xlator_t *this, fd_t *fd,</div><div class='add'>+                        unsigned char *healed_sinks)</div><div class='ctx'> {</div><div class='del'>-	int             call_count = 0;</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    int i = 0;</div><div class='ctx'> </div><div class='del'>-	call_count = afr_frame_return (frame);</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    priv = this-&gt;private;</div><div class='ctx'> </div><div class='del'>-	if (call_count == 0)</div><div class='del'>-		afr_sh_data_finish (frame, this);</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='add'>+    if (!priv-&gt;ensure_durability)</div><div class='add'>+        return 0;</div><div class='ctx'> </div><div class='add'>+    AFR_ONLIST(healed_sinks, frame, afr_sh_generic_fop_cbk, fsync, fd, 0, NULL);</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-afr_sh_data_erase_pending (call_frame_t *frame, xlator_t *this)</div><div class='del'>-{</div><div class='del'>-	afr_local_t     *local = NULL;</div><div class='del'>-	afr_self_heal_t *sh = NULL;</div><div class='del'>-	afr_private_t   *priv = NULL;</div><div class='del'>-	int              call_count = 0;</div><div class='del'>-	int              i = 0;</div><div class='del'>-	dict_t          **erase_xattr = NULL;</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-	sh = &amp;local-&gt;self_heal;</div><div class='del'>-	priv = this-&gt;private;</div><div class='del'>-</div><div class='del'>-	afr_sh_pending_to_delta (priv, sh-&gt;xattr, sh-&gt;delta_matrix, sh-&gt;success,</div><div class='del'>-                                 priv-&gt;child_count, AFR_DATA_TRANSACTION);</div><div class='del'>-</div><div class='del'>-	erase_xattr = GF_CALLOC (sizeof (*erase_xattr), priv-&gt;child_count,</div><div class='del'>-                              gf_afr_mt_dict_t);</div><div class='del'>-</div><div class='del'>-	for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='del'>-		if (sh-&gt;xattr[i]) {</div><div class='del'>-			call_count++;</div><div class='del'>-</div><div class='del'>-			erase_xattr[i] = get_new_dict();</div><div class='del'>-			dict_ref (erase_xattr[i]);</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	afr_sh_delta_to_xattr (priv, sh-&gt;delta_matrix, erase_xattr,</div><div class='del'>-			       priv-&gt;child_count, AFR_DATA_TRANSACTION);</div><div class='del'>-</div><div class='del'>-	local-&gt;call_count = call_count;</div><div class='del'>-	for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='del'>-		if (!erase_xattr[i])</div><div class='del'>-			continue;</div><div class='del'>-</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_TRACE,</div><div class='del'>-			"erasing pending flags from %s on %s",</div><div class='del'>-			local-&gt;loc.path, priv-&gt;children[i]-&gt;name);</div><div class='del'>-</div><div class='del'>-		STACK_WIND_COOKIE (frame, afr_sh_data_erase_pending_cbk,</div><div class='del'>-				   (void *) (long) i,</div><div class='del'>-				   priv-&gt;children[i],</div><div class='del'>-				   priv-&gt;children[i]-&gt;fops-&gt;fxattrop,</div><div class='del'>-				   sh-&gt;healing_fd,</div><div class='del'>-				   GF_XATTROP_ADD_ARRAY, erase_xattr[i]);</div><div class='del'>-		if (!--call_count)</div><div class='del'>-			break;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='del'>-		if (erase_xattr[i]) {</div><div class='del'>-			dict_unref (erase_xattr[i]);</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='del'>-	GF_FREE (erase_xattr);</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='add'>+    for (i = 0; i &lt; priv-&gt;child_count; i++)</div><div class='add'>+        if (healed_sinks[i] &amp;&amp; local-&gt;replies[i].op_ret != 0)</div><div class='add'>+            /* fsync() failed. Do NOT consider this server</div><div class='add'>+               as successfully healed. Mark it so.</div><div class='add'>+            */</div><div class='add'>+            healed_sinks[i] = 0;</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-afr_sh_data_trim_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-		      int32_t op_ret, int32_t op_errno, struct iatt *prebuf,</div><div class='del'>-                      struct iatt *postbuf)</div><div class='add'>+static int</div><div class='add'>+afr_data_self_heal_type_get(afr_private_t *priv, unsigned char *healed_sinks,</div><div class='add'>+                            int source, struct afr_reply *replies)</div><div class='ctx'> {</div><div class='del'>-	afr_private_t * priv = NULL;</div><div class='del'>-	afr_local_t * local  = NULL;</div><div class='del'>-	int              call_count = 0;</div><div class='del'>-	int              child_index = 0;</div><div class='del'>-</div><div class='del'>-	priv = this-&gt;private;</div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-</div><div class='del'>-	child_index = (long) cookie;</div><div class='del'>-</div><div class='del'>-	LOCK (&amp;frame-&gt;lock);</div><div class='del'>-	{</div><div class='del'>-		if (op_ret == -1)</div><div class='del'>-			gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-				"ftruncate of %s on subvolume %s failed (%s)",</div><div class='del'>-				local-&gt;loc.path,</div><div class='del'>-				priv-&gt;children[child_index]-&gt;name,</div><div class='del'>-				strerror (op_errno));</div><div class='del'>-		else</div><div class='del'>-			gf_log (this-&gt;name, GF_LOG_TRACE,</div><div class='del'>-				"ftruncate of %s on subvolume %s completed",</div><div class='del'>-				local-&gt;loc.path,</div><div class='del'>-				priv-&gt;children[child_index]-&gt;name);</div><div class='del'>-	}</div><div class='del'>-	UNLOCK (&amp;frame-&gt;lock);</div><div class='del'>-</div><div class='del'>-	call_count = afr_frame_return (frame);</div><div class='del'>-</div><div class='del'>-	if (call_count == 0) {</div><div class='del'>-		afr_sh_data_erase_pending (frame, this);</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='add'>+    int type = AFR_SELFHEAL_DATA_FULL;</div><div class='add'>+    int i = 0;</div><div class='add'>+</div><div class='add'>+    if (priv-&gt;data_self_heal_algorithm == AFR_SELFHEAL_DATA_DYNAMIC) {</div><div class='add'>+        type = AFR_SELFHEAL_DATA_FULL;</div><div class='add'>+        for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+            if (!healed_sinks[i] &amp;&amp; i != source)</div><div class='add'>+                continue;</div><div class='add'>+            if (replies[i].poststat.ia_size) {</div><div class='add'>+                type = AFR_SELFHEAL_DATA_DIFF;</div><div class='add'>+                break;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+    } else {</div><div class='add'>+        type = priv-&gt;data_self_heal_algorithm;</div><div class='add'>+    }</div><div class='add'>+    return type;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-afr_sh_data_trim_sinks (call_frame_t *frame, xlator_t *this)</div><div class='add'>+static int</div><div class='add'>+afr_selfheal_data_do(call_frame_t *frame, xlator_t *this, fd_t *fd, int source,</div><div class='add'>+                     unsigned char *healed_sinks, struct afr_reply *replies)</div><div class='ctx'> {</div><div class='del'>-	afr_private_t * priv = NULL;</div><div class='del'>-	afr_local_t * local  = NULL;</div><div class='del'>-	afr_self_heal_t *sh  = NULL;</div><div class='del'>-	int             *sources = NULL;</div><div class='del'>-	int              call_count = 0;</div><div class='del'>-	int              i = 0;</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-	priv = this-&gt;private;</div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-	sh = &amp;local-&gt;self_heal;</div><div class='del'>-</div><div class='del'>-	sources = sh-&gt;sources;</div><div class='del'>-	call_count = sh-&gt;active_sinks;</div><div class='del'>-</div><div class='del'>-	local-&gt;call_count = call_count;</div><div class='del'>-</div><div class='del'>-	for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='del'>-		if (sources[i] || !local-&gt;child_up[i])</div><div class='del'>-			continue;</div><div class='del'>-</div><div class='del'>-		STACK_WIND_COOKIE (frame, afr_sh_data_trim_cbk,</div><div class='del'>-				   (void *) (long) i,</div><div class='del'>-				   priv-&gt;children[i], </div><div class='del'>-				   priv-&gt;children[i]-&gt;fops-&gt;ftruncate,</div><div class='del'>-				   sh-&gt;healing_fd, sh-&gt;file_size); </div><div class='del'>-</div><div class='del'>-		if (!--call_count)</div><div class='del'>-			break;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    off_t off = 0;</div><div class='add'>+    size_t block = 0;</div><div class='add'>+    int type = AFR_SELFHEAL_DATA_FULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    call_frame_t *iter_frame = NULL;</div><div class='add'>+    unsigned char arbiter_sink_status = 0;</div><div class='add'>+</div><div class='add'>+    gf_msg(this-&gt;name, GF_LOG_INFO, 0, AFR_MSG_SELF_HEAL_INFO,</div><div class='add'>+           "performing data selfheal on %s", uuid_utoa(fd-&gt;inode-&gt;gfid));</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+    if (priv-&gt;arbiter_count) {</div><div class='add'>+        arbiter_sink_status = healed_sinks[ARBITER_BRICK_INDEX];</div><div class='add'>+        healed_sinks[ARBITER_BRICK_INDEX] = 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    block = 128 * 1024 * priv-&gt;data_self_heal_window_size;</div><div class='add'>+</div><div class='add'>+    type = afr_data_self_heal_type_get(priv, healed_sinks, source, replies);</div><div class='add'>+</div><div class='add'>+    iter_frame = afr_copy_frame(frame);</div><div class='add'>+    if (!iter_frame) {</div><div class='add'>+        ret = -ENOMEM;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    for (off = 0; off &lt; replies[source].poststat.ia_size; off += block) {</div><div class='add'>+        if (AFR_COUNT(healed_sinks, priv-&gt;child_count) == 0) {</div><div class='add'>+            ret = -ENOTCONN;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='add'>+        ret = afr_selfheal_data_block(iter_frame, this, fd, source,</div><div class='add'>+                                      healed_sinks, off, block, type, replies);</div><div class='add'>+        if (ret &lt; 0)</div><div class='add'>+            goto out;</div><div class='ctx'> </div><div class='del'>-static struct afr_sh_algorithm *</div><div class='del'>-sh_algo_from_name (xlator_t *this, char *name)</div><div class='del'>-{</div><div class='del'>-        int i = 0;</div><div class='add'>+        AFR_STACK_RESET(iter_frame);</div><div class='add'>+        if (iter_frame-&gt;local == NULL) {</div><div class='add'>+            ret = -ENOTCONN;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        while (afr_self_heal_algorithms[i].name) {</div><div class='del'>-                if (!strcmp (name, afr_self_heal_algorithms[i].name)) {</div><div class='del'>-                        return &amp;afr_self_heal_algorithms[i];</div><div class='del'>-                }</div><div class='add'>+    ret = afr_selfheal_data_fsync(frame, this, fd, healed_sinks);</div><div class='ctx'> </div><div class='del'>-                i++;</div><div class='del'>-        }</div><div class='add'>+out:</div><div class='add'>+    if (arbiter_sink_status)</div><div class='add'>+        healed_sinks[ARBITER_BRICK_INDEX] = arbiter_sink_status;</div><div class='ctx'> </div><div class='del'>-        return NULL;</div><div class='add'>+    if (iter_frame)</div><div class='add'>+        AFR_STACK_DESTROY(iter_frame);</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> static int</div><div class='del'>-sh_zero_byte_files_exist (afr_self_heal_t *sh, int child_count)</div><div class='add'>+__afr_selfheal_truncate_sinks(call_frame_t *frame, xlator_t *this, fd_t *fd,</div><div class='add'>+                              unsigned char *healed_sinks, uint64_t size)</div><div class='ctx'> {</div><div class='del'>-        int i;</div><div class='del'>-        int ret = 0;</div><div class='del'>-</div><div class='del'>-        for (i = 0; i &lt; child_count; i++) {</div><div class='del'>-                if (sh-&gt;buf[i].ia_size == 0) {</div><div class='del'>-                        ret = 1;</div><div class='del'>-                        break;</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        return ret;</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    int i = 0;</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    /* This will send truncate on the arbiter brick as well if it is marked as</div><div class='add'>+     * sink. If changelog is enabled on the volume it captures truncate as a</div><div class='add'>+     * data transactions on the arbiter brick. This will help geo-rep to</div><div class='add'>+     * properly sync the data from master to slave if arbiter is the ACTIVE</div><div class='add'>+     * brick during syncing and which had got some entries healed for data as</div><div class='add'>+     * part of self heal.</div><div class='add'>+     */</div><div class='add'>+    AFR_ONLIST(healed_sinks, frame, afr_sh_generic_fop_cbk, ftruncate, fd, size,</div><div class='add'>+               NULL);</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; priv-&gt;child_count; i++)</div><div class='add'>+        if (healed_sinks[i] &amp;&amp; local-&gt;replies[i].op_ret == -1)</div><div class='add'>+            /* truncate() failed. Do NOT consider this server</div><div class='add'>+               as successfully healed. Mark it so.</div><div class='add'>+            */</div><div class='add'>+            healed_sinks[i] = 0;</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='del'>-struct afr_sh_algorithm *</div><div class='del'>-afr_sh_data_pick_algo (call_frame_t *frame, xlator_t *this)</div><div class='add'>+gf_boolean_t</div><div class='add'>+afr_has_source_witnesses(xlator_t *this, unsigned char *sources,</div><div class='add'>+                         uint64_t *witness)</div><div class='ctx'> {</div><div class='del'>-        afr_private_t *           priv  = NULL;</div><div class='del'>-        struct afr_sh_algorithm * algo  = NULL;</div><div class='del'>-        afr_local_t *             local = NULL;</div><div class='del'>-        afr_self_heal_t *         sh    = NULL;</div><div class='del'>-</div><div class='del'>-        priv  = this-&gt;private;</div><div class='del'>-        local = frame-&gt;local;</div><div class='del'>-        sh    = &amp;local-&gt;self_heal;</div><div class='del'>-        algo  = sh_algo_from_name (this, priv-&gt;data_self_heal_algorithm);</div><div class='del'>-</div><div class='del'>-        if (algo == NULL) {</div><div class='del'>-                /* option not set, so fall back on heuristics */</div><div class='del'>-</div><div class='del'>-                if ((local-&gt;enoent_count != 0)</div><div class='del'>-                    || sh_zero_byte_files_exist (sh, priv-&gt;child_count)</div><div class='del'>-                    || (sh-&gt;file_size &lt;= (priv-&gt;data_self_heal_window_size * this-&gt;ctx-&gt;page_size))) {</div><div class='del'>-</div><div class='del'>-                        /*</div><div class='del'>-                         * If the file does not exist on one of the subvolumes,</div><div class='del'>-                         * or a zero-byte file exists (created by entry self-heal)</div><div class='del'>-                         * the entire content has to be copied anyway, so there</div><div class='del'>-                         * is no benefit from using the "diff" algorithm.</div><div class='del'>-                         *</div><div class='del'>-                         * If the file size is about the same as page size,</div><div class='del'>-                         * the entire file can be read and written with a few</div><div class='del'>-                         * (pipelined) STACK_WINDs, which will be faster</div><div class='del'>-                         * than "diff" which has to read checksums and then</div><div class='del'>-                         * read and write.</div><div class='del'>-                         */</div><div class='del'>-</div><div class='del'>-                        algo = sh_algo_from_name (this, "full");</div><div class='del'>-</div><div class='del'>-                } else {</div><div class='del'>-                        algo = sh_algo_from_name (this, "diff");</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        return algo;</div><div class='del'>-}</div><div class='add'>+    int i = 0;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='ctx'> </div><div class='add'>+    priv = this-&gt;private;</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-afr_sh_data_sync_prepare (call_frame_t *frame, xlator_t *this)</div><div class='del'>-{</div><div class='del'>-	afr_local_t     *local = NULL;</div><div class='del'>-	afr_self_heal_t *sh = NULL;</div><div class='del'>-	afr_private_t   *priv = NULL;</div><div class='del'>-	int              active_sinks = 0;</div><div class='del'>-	int              source = 0;</div><div class='del'>-	int              i = 0;</div><div class='del'>-</div><div class='del'>-        struct afr_sh_algorithm *sh_algo = NULL;</div><div class='del'>-</div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-	sh = &amp;local-&gt;self_heal;</div><div class='del'>-	priv = this-&gt;private;</div><div class='del'>-</div><div class='del'>-	source = sh-&gt;source;</div><div class='del'>-</div><div class='del'>-	for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='del'>-		if (sh-&gt;sources[i] == 0 &amp;&amp; local-&gt;child_up[i] == 1) {</div><div class='del'>-			active_sinks++;</div><div class='del'>-			sh-&gt;success[i] = 1;</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='del'>-	sh-&gt;success[source] = 1;</div><div class='del'>-</div><div class='del'>-	if (active_sinks == 0) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_TRACE,</div><div class='del'>-			"no active sinks for performing self-heal on file %s",</div><div class='del'>-			local-&gt;loc.path);</div><div class='del'>-		afr_sh_data_finish (frame, this);</div><div class='del'>-		return 0;</div><div class='del'>-	}</div><div class='del'>-	sh-&gt;active_sinks = active_sinks;</div><div class='del'>-</div><div class='del'>-	gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-		"self-healing file %s from subvolume %s to %d other",</div><div class='del'>-		local-&gt;loc.path, priv-&gt;children[source]-&gt;name, active_sinks);</div><div class='del'>-</div><div class='del'>-        sh-&gt;algo_completion_cbk = afr_sh_data_trim_sinks;</div><div class='del'>-        sh-&gt;algo_abort_cbk      = afr_sh_data_finish;</div><div class='del'>-</div><div class='del'>-        sh_algo = afr_sh_data_pick_algo (frame, this);</div><div class='del'>-</div><div class='del'>-        sh_algo-&gt;fn (frame, this);</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='add'>+    for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+        if (sources[i] &amp;&amp; witness[i])</div><div class='add'>+            return _gf_true;</div><div class='add'>+    }</div><div class='add'>+    return _gf_false;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-afr_sh_data_fix (call_frame_t *frame, xlator_t *this)</div><div class='add'>+static gf_boolean_t</div><div class='add'>+afr_does_size_mismatch(xlator_t *this, unsigned char *sources,</div><div class='add'>+                       struct afr_reply *replies)</div><div class='ctx'> {</div><div class='del'>-	afr_local_t     *local      = NULL;</div><div class='del'>-        afr_local_t *    orig_local = NULL;</div><div class='add'>+    int i = 0;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    struct iatt *min = NULL;</div><div class='add'>+    struct iatt *max = NULL;</div><div class='ctx'> </div><div class='del'>-	afr_self_heal_t *sh = NULL;</div><div class='del'>-	afr_private_t   *priv = NULL;</div><div class='del'>-	int              nsources = 0;</div><div class='del'>-	int              source = 0;</div><div class='del'>-	int              i = 0;</div><div class='add'>+    priv = this-&gt;private;</div><div class='ctx'> </div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-	sh = &amp;local-&gt;self_heal;</div><div class='del'>-	priv = this-&gt;private;</div><div class='add'>+    for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+        if (!replies[i].valid)</div><div class='add'>+            continue;</div><div class='ctx'> </div><div class='del'>-	afr_sh_build_pending_matrix (priv, sh-&gt;pending_matrix, sh-&gt;xattr, </div><div class='del'>-				     priv-&gt;child_count, AFR_DATA_TRANSACTION);</div><div class='add'>+        if (replies[i].op_ret &lt; 0)</div><div class='add'>+            continue;</div><div class='ctx'> </div><div class='del'>-	afr_sh_print_pending_matrix (sh-&gt;pending_matrix, this);</div><div class='add'>+        if (!sources[i])</div><div class='add'>+            continue;</div><div class='ctx'> </div><div class='del'>-	nsources = afr_sh_mark_sources (sh, priv-&gt;child_count,</div><div class='del'>-                                        AFR_SELF_HEAL_DATA);</div><div class='add'>+        if (AFR_IS_ARBITER_BRICK(priv, i) &amp;&amp; (replies[i].poststat.ia_size == 0))</div><div class='add'>+            continue;</div><div class='ctx'> </div><div class='del'>-	afr_sh_supress_errenous_children (sh-&gt;sources, sh-&gt;child_errno,</div><div class='del'>-					  priv-&gt;child_count);</div><div class='add'>+        if (!min)</div><div class='add'>+            min = &amp;replies[i].poststat;</div><div class='ctx'> </div><div class='del'>-        if (nsources == 0) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_TRACE,</div><div class='del'>-                        "No self-heal needed for %s",</div><div class='del'>-                        local-&gt;loc.path);</div><div class='add'>+        if (!max)</div><div class='add'>+            max = &amp;replies[i].poststat;</div><div class='ctx'> </div><div class='del'>-                afr_sh_data_finish (frame, this);</div><div class='del'>-                return 0;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-	if ((nsources == -1)</div><div class='del'>-	    &amp;&amp; (priv-&gt;favorite_child != -1)</div><div class='del'>-	    &amp;&amp; (sh-&gt;child_errno[priv-&gt;favorite_child] == 0)) {</div><div class='del'>-</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-			"Picking favorite child %s as authentic source to resolve conflicting data of %s",</div><div class='del'>-			priv-&gt;children[priv-&gt;favorite_child]-&gt;name,</div><div class='del'>-			local-&gt;loc.path);</div><div class='del'>-</div><div class='del'>-		sh-&gt;sources[priv-&gt;favorite_child] = 1;</div><div class='del'>-</div><div class='del'>-		nsources = afr_sh_source_count (sh-&gt;sources,</div><div class='del'>-						priv-&gt;child_count);</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	if (nsources == -1) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-			"Unable to self-heal contents of '%s' (possible split-brain). "</div><div class='del'>-                        "Please delete the file from all but the preferred "</div><div class='del'>-                        "subvolume.", local-&gt;loc.path);</div><div class='del'>-</div><div class='del'>-		local-&gt;govinda_gOvinda = 1;</div><div class='del'>-</div><div class='del'>-		afr_sh_data_finish (frame, this);</div><div class='del'>-		return 0;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	source = afr_sh_select_source (sh-&gt;sources, priv-&gt;child_count);</div><div class='del'>-        </div><div class='del'>-        if (source == -1) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-                        "No active sources found.");</div><div class='del'>-</div><div class='del'>-                afr_sh_data_finish (frame, this);</div><div class='del'>-                return 0;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-	sh-&gt;source     = source;</div><div class='del'>-	sh-&gt;block_size = 65536;</div><div class='del'>-	sh-&gt;file_size  = sh-&gt;buf[source].ia_size;</div><div class='del'>-</div><div class='del'>-	if (FILE_HAS_HOLES (&amp;sh-&gt;buf[source]))</div><div class='del'>-		sh-&gt;file_has_holes = 1;</div><div class='del'>-</div><div class='del'>-        orig_local = sh-&gt;orig_frame-&gt;local;</div><div class='del'>-        orig_local-&gt;cont.lookup.buf.ia_size = sh-&gt;buf[source].ia_size;</div><div class='add'>+        if (min-&gt;ia_size &gt; replies[i].poststat.ia_size)</div><div class='add'>+            min = &amp;replies[i].poststat;</div><div class='ctx'> </div><div class='del'>-	/* detect changes not visible through pending flags -- JIC */</div><div class='del'>-	for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='del'>-		if (i == source || sh-&gt;child_errno[i])</div><div class='del'>-			continue;</div><div class='add'>+        if (max-&gt;ia_size &lt; replies[i].poststat.ia_size)</div><div class='add'>+            max = &amp;replies[i].poststat;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-		if (SIZE_DIFFERS (&amp;sh-&gt;buf[i], &amp;sh-&gt;buf[source]))</div><div class='del'>-			sh-&gt;sources[i] = 0;</div><div class='del'>-	}</div><div class='add'>+    if (min &amp;&amp; max) {</div><div class='add'>+        if (min-&gt;ia_size != max-&gt;ia_size)</div><div class='add'>+            return _gf_true;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        afr_set_read_child (this, local-&gt;loc.inode, sh-&gt;source);</div><div class='del'>-</div><div class='del'>-	/*</div><div class='del'>-	   quick-read might have read the file, so send xattr from</div><div class='del'>-	   the source subvolume (http://bugs.gluster.com/cgi-bin/bugzilla3/show_bug.cgi?id=815)</div><div class='del'>-	*/</div><div class='del'>-</div><div class='del'>-	dict_unref (orig_local-&gt;cont.lookup.xattr);</div><div class='del'>-        if (orig_local-&gt;cont.lookup.xattrs)</div><div class='del'>-                orig_local-&gt;cont.lookup.xattr = dict_ref (orig_local-&gt;cont.lookup.xattrs[sh-&gt;source]);</div><div class='del'>-</div><div class='del'>-        if (sh-&gt;background) {</div><div class='del'>-                sh-&gt;unwind (sh-&gt;orig_frame, this);</div><div class='del'>-                sh-&gt;unwound = _gf_true;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-	afr_sh_data_sync_prepare (frame, this);</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='add'>+    return _gf_false;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-afr_self_heal_get_source (xlator_t *this, afr_local_t *local, dict_t **xattr)</div><div class='add'>+static void</div><div class='add'>+afr_mark_biggest_witness_as_source(xlator_t *this, unsigned char *sources,</div><div class='add'>+                                   uint64_t *witness)</div><div class='ctx'> {</div><div class='del'>-	afr_self_heal_t *sh   = NULL;</div><div class='del'>-	afr_private_t   *priv = NULL;</div><div class='del'>-</div><div class='del'>-	int              source = 0;</div><div class='del'>-	int              i = 0;</div><div class='del'>-</div><div class='del'>-	sh   = &amp;local-&gt;self_heal;</div><div class='del'>-	priv = this-&gt;private;</div><div class='del'>-</div><div class='del'>-	sh-&gt;pending_matrix = GF_CALLOC (sizeof (int32_t *), priv-&gt;child_count,</div><div class='del'>-                                        gf_afr_mt_int32_t);</div><div class='del'>-	for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='del'>-		sh-&gt;pending_matrix[i] = GF_CALLOC (sizeof (int32_t),</div><div class='del'>-						priv-&gt;child_count,</div><div class='del'>-                                                gf_afr_mt_int32_t);</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	sh-&gt;sources = GF_CALLOC (priv-&gt;child_count, sizeof (*sh-&gt;sources),</div><div class='del'>-                                 gf_afr_mt_int32_t);</div><div class='del'>-</div><div class='del'>-	afr_sh_build_pending_matrix (priv, sh-&gt;pending_matrix, xattr,</div><div class='del'>-				     priv-&gt;child_count, AFR_DATA_TRANSACTION);</div><div class='del'>-</div><div class='del'>-	(void)afr_sh_mark_sources (sh, priv-&gt;child_count, AFR_SELF_HEAL_DATA);</div><div class='del'>-</div><div class='del'>-	source = afr_sh_select_source (sh-&gt;sources, priv-&gt;child_count);</div><div class='del'>-</div><div class='del'>-	return source;</div><div class='add'>+    int i = 0;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    uint64_t biggest_witness = 0;</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+    /* Find source with biggest witness count */</div><div class='add'>+    for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+        if (!sources[i])</div><div class='add'>+            continue;</div><div class='add'>+        if (biggest_witness &lt; witness[i])</div><div class='add'>+            biggest_witness = witness[i];</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Mark files with less witness count as not source */</div><div class='add'>+    for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+        if (!sources[i])</div><div class='add'>+            continue;</div><div class='add'>+        if (witness[i] &lt; biggest_witness)</div><div class='add'>+            sources[i] = 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-afr_sh_data_fstat_cbk (call_frame_t *frame, void *cookie,</div><div class='del'>-                       xlator_t *this, int32_t op_ret, int32_t op_errno,</div><div class='del'>-                       struct iatt *buf)</div><div class='add'>+/* This is a tie breaker function. Only one source be assigned here */</div><div class='add'>+static void</div><div class='add'>+afr_mark_newest_file_as_source(xlator_t *this, unsigned char *sources,</div><div class='add'>+                               struct afr_reply *replies)</div><div class='ctx'> {</div><div class='del'>-	afr_private_t   *priv  = NULL;</div><div class='del'>-	afr_local_t     *local = NULL;</div><div class='del'>-	afr_self_heal_t *sh = NULL;</div><div class='del'>-</div><div class='del'>-	int call_count  = -1;</div><div class='del'>-	int child_index = (long) cookie;</div><div class='del'>-</div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-	sh = &amp;local-&gt;self_heal;</div><div class='del'>-	priv = this-&gt;private;</div><div class='del'>-</div><div class='del'>-	LOCK (&amp;frame-&gt;lock);</div><div class='del'>-	{</div><div class='del'>-		if (op_ret != -1) {</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_TRACE,</div><div class='del'>-                                "fstat of %s on %s succeeded",</div><div class='del'>-                                local-&gt;loc.path,</div><div class='del'>-                                priv-&gt;children[child_index]-&gt;name);</div><div class='del'>-</div><div class='del'>-			sh-&gt;buf[child_index] = *buf;</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='del'>-	UNLOCK (&amp;frame-&gt;lock);</div><div class='del'>-</div><div class='del'>-	call_count = afr_frame_return (frame);</div><div class='del'>-</div><div class='del'>-	if (call_count == 0) {</div><div class='del'>-		afr_sh_data_fix (frame, this);</div><div class='del'>-	}</div><div class='add'>+    int i = 0;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    int source = -1;</div><div class='add'>+    uint32_t max_ctime = 0;</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+    /* Find source with latest ctime */</div><div class='add'>+    for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+        if (!sources[i])</div><div class='add'>+            continue;</div><div class='add'>+</div><div class='add'>+        if (max_ctime &lt;= replies[i].poststat.ia_ctime) {</div><div class='add'>+            source = i;</div><div class='add'>+            max_ctime = replies[i].poststat.ia_ctime;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	return 0;</div><div class='add'>+    /* Only mark one of the files as source to break ties */</div><div class='add'>+    memset(sources, 0, sizeof(*sources) * priv-&gt;child_count);</div><div class='add'>+    sources[source] = 1;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-afr_sh_data_fstat (call_frame_t *frame, xlator_t *this)</div><div class='add'>+static int</div><div class='add'>+__afr_selfheal_data_finalize_source(</div><div class='add'>+    call_frame_t *frame, xlator_t *this, inode_t *inode, unsigned char *sources,</div><div class='add'>+    unsigned char *sinks, unsigned char *healed_sinks, unsigned char *locked_on,</div><div class='add'>+    unsigned char *undid_pending, struct afr_reply *replies, uint64_t *witness)</div><div class='ctx'> {</div><div class='del'>-	afr_self_heal_t *sh    = NULL; </div><div class='del'>-	afr_local_t     *local = NULL;</div><div class='del'>-	afr_private_t   *priv  = NULL;</div><div class='del'>-</div><div class='del'>-	int call_count = 0;</div><div class='del'>-	int i = 0;</div><div class='del'>-</div><div class='del'>-	priv  = this-&gt;private;</div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-	sh    = &amp;local-&gt;self_heal;</div><div class='del'>-</div><div class='del'>-	call_count = afr_up_children_count (priv-&gt;child_count,</div><div class='del'>-                                            local-&gt;child_up);</div><div class='del'>-</div><div class='del'>-	local-&gt;call_count = call_count;</div><div class='del'>-</div><div class='del'>-	for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='del'>-		if (local-&gt;child_up[i]) {</div><div class='del'>-			STACK_WIND_COOKIE (frame, afr_sh_data_fstat_cbk,</div><div class='del'>-					   (void *) (long) i,</div><div class='del'>-					   priv-&gt;children[i], </div><div class='del'>-					   priv-&gt;children[i]-&gt;fops-&gt;fstat,</div><div class='del'>-					   sh-&gt;healing_fd);</div><div class='del'>-</div><div class='del'>-			if (!--call_count)</div><div class='del'>-				break;</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    int source = -1;</div><div class='add'>+    int sources_count = 0;</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    sources_count = AFR_COUNT(sources, priv-&gt;child_count);</div><div class='add'>+</div><div class='add'>+    if ((AFR_CMP(locked_on, healed_sinks, priv-&gt;child_count) == 0) ||</div><div class='add'>+        !sources_count) {</div><div class='add'>+        /* split brain */</div><div class='add'>+        source = afr_mark_split_brain_source_sinks(</div><div class='add'>+            frame, this, inode, sources, sinks, healed_sinks, locked_on,</div><div class='add'>+            replies, AFR_DATA_TRANSACTION);</div><div class='add'>+        if (source &lt; 0) {</div><div class='add'>+            gf_event(EVENT_AFR_SPLIT_BRAIN,</div><div class='add'>+                     "client-pid=%d;"</div><div class='add'>+                     "subvol=%s;type=data;"</div><div class='add'>+                     "file=%s",</div><div class='add'>+                     this-&gt;ctx-&gt;cmd_args.client_pid, this-&gt;name,</div><div class='add'>+                     uuid_utoa(inode-&gt;gfid));</div><div class='add'>+            return -EIO;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-	return 0;</div><div class='add'>+        _afr_fav_child_reset_sink_xattrs(</div><div class='add'>+            frame, this, inode, source, healed_sinks, undid_pending,</div><div class='add'>+            AFR_DATA_TRANSACTION, locked_on, replies);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* No split brain at this point. If we were called from</div><div class='add'>+     * afr_heal_splitbrain_file(), abort.*/</div><div class='add'>+    if (afr_dict_contains_heal_op(frame))</div><div class='add'>+        return -EIO;</div><div class='add'>+</div><div class='add'>+    /* If there are no witnesses/size-mismatches on sources we are done*/</div><div class='add'>+    if (!afr_does_size_mismatch(this, sources, replies) &amp;&amp;</div><div class='add'>+        !afr_has_source_witnesses(this, sources, witness))</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    afr_mark_largest_file_as_source(this, sources, replies);</div><div class='add'>+    afr_mark_biggest_witness_as_source(this, sources, witness);</div><div class='add'>+    afr_mark_newest_file_as_source(this, sources, replies);</div><div class='add'>+    if (priv-&gt;arbiter_count)</div><div class='add'>+        /* Choose non-arbiter brick as source for empty files. */</div><div class='add'>+        afr_mark_source_sinks_if_file_empty(this, sources, sinks, healed_sinks,</div><div class='add'>+                                            locked_on, replies,</div><div class='add'>+                                            AFR_DATA_TRANSACTION);</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    afr_mark_active_sinks(this, sources, locked_on, healed_sinks);</div><div class='add'>+    source = afr_choose_source_by_policy(priv, sources, AFR_DATA_TRANSACTION);</div><div class='add'>+</div><div class='add'>+    return source;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='add'>+/*</div><div class='add'>+ * __afr_selfheal_data_prepare:</div><div class='add'>+ *</div><div class='add'>+ * This function inspects the on-disk xattrs and determines which subvols</div><div class='add'>+ * are sources and sinks.</div><div class='add'>+ *</div><div class='add'>+ * The return value is the index of the subvolume to be used as the source</div><div class='add'>+ * for self-healing, or -1 if no healing is necessary/split brain.</div><div class='add'>+ */</div><div class='ctx'> int</div><div class='del'>-afr_sh_data_fxattrop_cbk (call_frame_t *frame, void *cookie,</div><div class='del'>-                          xlator_t *this, int32_t op_ret, int32_t op_errno,</div><div class='del'>-                          dict_t *xattr)</div><div class='add'>+__afr_selfheal_data_prepare(call_frame_t *frame, xlator_t *this, inode_t *inode,</div><div class='add'>+                            unsigned char *locked_on, unsigned char *sources,</div><div class='add'>+                            unsigned char *sinks, unsigned char *healed_sinks,</div><div class='add'>+                            unsigned char *undid_pending,</div><div class='add'>+                            struct afr_reply *replies, unsigned char *pflag)</div><div class='ctx'> {</div><div class='del'>-	afr_private_t   *priv  = NULL;</div><div class='del'>-	afr_local_t     *local = NULL;</div><div class='del'>-	afr_self_heal_t *sh = NULL;</div><div class='del'>-</div><div class='del'>-	int call_count  = -1;</div><div class='del'>-	int child_index = (long) cookie;</div><div class='del'>-</div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-	sh = &amp;local-&gt;self_heal;</div><div class='del'>-	priv = this-&gt;private;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int source = -1;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    uint64_t *witness = NULL;</div><div class='ctx'> </div><div class='del'>-	LOCK (&amp;frame-&gt;lock);</div><div class='del'>-	{</div><div class='del'>-		if (op_ret != -1) {</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_TRACE,</div><div class='del'>-                                "fxattrop of %s on %s succeeded",</div><div class='del'>-                                local-&gt;loc.path,</div><div class='del'>-                                priv-&gt;children[child_index]-&gt;name);</div><div class='add'>+    priv = this-&gt;private;</div><div class='ctx'> </div><div class='del'>-			sh-&gt;xattr[child_index] = dict_ref (xattr);</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='del'>-	UNLOCK (&amp;frame-&gt;lock);</div><div class='add'>+    ret = afr_selfheal_unlocked_discover(frame, inode, inode-&gt;gfid, replies);</div><div class='ctx'> </div><div class='del'>-	call_count = afr_frame_return (frame);</div><div class='add'>+    if (ret)</div><div class='add'>+        return ret;</div><div class='ctx'> </div><div class='del'>-	if (call_count == 0) {</div><div class='del'>-		afr_sh_data_fstat (frame, this);</div><div class='del'>-	}</div><div class='add'>+    witness = alloca0(priv-&gt;child_count * sizeof(*witness));</div><div class='add'>+    ret = afr_selfheal_find_direction(frame, this, replies,</div><div class='add'>+                                      AFR_DATA_TRANSACTION, locked_on, sources,</div><div class='add'>+                                      sinks, witness, pflag);</div><div class='add'>+    if (ret)</div><div class='add'>+        return ret;</div><div class='ctx'> </div><div class='del'>-	return 0;</div><div class='add'>+    /* Initialize the healed_sinks[] array optimistically to</div><div class='add'>+       the intersection of to-be-healed (i.e sinks[]) and</div><div class='add'>+       the list of servers which are up (i.e locked_on[]).</div><div class='add'>+       As we encounter failures in the healing process, we</div><div class='add'>+       will unmark the respective servers in the healed_sinks[]</div><div class='add'>+       array.</div><div class='add'>+    */</div><div class='add'>+    AFR_INTERSECT(healed_sinks, sinks, locked_on, priv-&gt;child_count);</div><div class='add'>+</div><div class='add'>+    source = __afr_selfheal_data_finalize_source(</div><div class='add'>+        frame, this, inode, sources, sinks, healed_sinks, locked_on,</div><div class='add'>+        undid_pending, replies, witness);</div><div class='add'>+    if (source &lt; 0)</div><div class='add'>+        return -EIO;</div><div class='add'>+</div><div class='add'>+    return source;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-afr_sh_data_fxattrop (call_frame_t *frame, xlator_t *this)</div><div class='add'>+static int</div><div class='add'>+__afr_selfheal_data(call_frame_t *frame, xlator_t *this, fd_t *fd,</div><div class='add'>+                    unsigned char *locked_on)</div><div class='ctx'> {</div><div class='del'>-	afr_self_heal_t *sh    = NULL;</div><div class='del'>-	afr_local_t     *local = NULL;</div><div class='del'>-	afr_private_t   *priv  = NULL;</div><div class='del'>-	dict_t          *xattr_req = NULL;</div><div class='del'>-</div><div class='del'>-        int32_t zero_pending[3] = {0, 0, 0};</div><div class='del'>-</div><div class='del'>-	int call_count = 0;</div><div class='del'>-	int i = 0;</div><div class='del'>-	int ret = 0;</div><div class='del'>-</div><div class='del'>-	priv  = this-&gt;private;</div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-	sh    = &amp;local-&gt;self_heal;</div><div class='del'>-</div><div class='del'>-	call_count = afr_up_children_count (priv-&gt;child_count,</div><div class='del'>-                                            local-&gt;child_up);</div><div class='del'>-</div><div class='del'>-	local-&gt;call_count = call_count;</div><div class='del'>-</div><div class='del'>-	xattr_req = dict_new();</div><div class='del'>-	if (xattr_req) {</div><div class='del'>-                for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='del'>-                        ret = dict_set_static_bin (xattr_req, priv-&gt;pending_key[i],</div><div class='del'>-                                                   zero_pending, 3 * sizeof(int32_t));</div><div class='del'>-                        if (ret &lt; 0)</div><div class='del'>-				gf_log (this-&gt;name, GF_LOG_WARNING,</div><div class='del'>-					"Unable to set dict value");</div><div class='del'>-                }</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    unsigned char *sources = NULL;</div><div class='add'>+    unsigned char *sinks = NULL;</div><div class='add'>+    unsigned char *data_lock = NULL;</div><div class='add'>+    unsigned char *healed_sinks = NULL;</div><div class='add'>+    unsigned char *undid_pending = NULL;</div><div class='add'>+    struct afr_reply *locked_replies = NULL;</div><div class='add'>+    int source = -1;</div><div class='add'>+    gf_boolean_t did_sh = _gf_true;</div><div class='add'>+    gf_boolean_t is_arbiter_the_only_sink = _gf_false;</div><div class='add'>+    gf_boolean_t empty_file = _gf_false;</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    sources = alloca0(priv-&gt;child_count);</div><div class='add'>+    sinks = alloca0(priv-&gt;child_count);</div><div class='add'>+    healed_sinks = alloca0(priv-&gt;child_count);</div><div class='add'>+    data_lock = alloca0(priv-&gt;child_count);</div><div class='add'>+    undid_pending = alloca0(priv-&gt;child_count);</div><div class='add'>+</div><div class='add'>+    locked_replies = alloca0(sizeof(*locked_replies) * priv-&gt;child_count);</div><div class='add'>+</div><div class='add'>+    ret = afr_selfheal_inodelk(frame, this, fd-&gt;inode, this-&gt;name, 0, 0,</div><div class='add'>+                               data_lock);</div><div class='add'>+    {</div><div class='add'>+        if (ret &lt; priv-&gt;child_count) {</div><div class='add'>+            gf_msg_debug(this-&gt;name, 0,</div><div class='add'>+                         "%s: Skipping "</div><div class='add'>+                         "self-heal as only %d number "</div><div class='add'>+                         "of subvolumes "</div><div class='add'>+                         "could be locked",</div><div class='add'>+                         uuid_utoa(fd-&gt;inode-&gt;gfid), ret);</div><div class='add'>+            ret = -ENOTCONN;</div><div class='add'>+            goto unlock;</div><div class='ctx'>         }</div><div class='ctx'> </div><div class='del'>-	for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='del'>-		if (local-&gt;child_up[i]) {</div><div class='del'>-			STACK_WIND_COOKIE (frame, afr_sh_data_fxattrop_cbk,</div><div class='del'>-					   (void *) (long) i,</div><div class='del'>-					   priv-&gt;children[i],</div><div class='del'>-					   priv-&gt;children[i]-&gt;fops-&gt;fxattrop,</div><div class='del'>-					   sh-&gt;healing_fd, GF_XATTROP_ADD_ARRAY,</div><div class='del'>-                                           xattr_req);</div><div class='del'>-</div><div class='del'>-			if (!--call_count)</div><div class='del'>-				break;</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	if (xattr_req)</div><div class='del'>-		dict_unref (xattr_req);</div><div class='add'>+        ret = __afr_selfheal_data_prepare(frame, this, fd-&gt;inode, data_lock,</div><div class='add'>+                                          sources, sinks, healed_sinks,</div><div class='add'>+                                          undid_pending, locked_replies, NULL);</div><div class='add'>+        if (ret &lt; 0)</div><div class='add'>+            goto unlock;</div><div class='ctx'> </div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-afr_sh_data_lock_rec (call_frame_t *frame, xlator_t *this);</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-afr_sh_data_post_nonblocking_inodelk_cbk (call_frame_t *frame, xlator_t *this)</div><div class='del'>-{</div><div class='del'>-        afr_internal_lock_t *int_lock = NULL;</div><div class='del'>-        afr_local_t         *local    = NULL;</div><div class='add'>+        if (AFR_COUNT(healed_sinks, priv-&gt;child_count) == 0) {</div><div class='add'>+            did_sh = _gf_false;</div><div class='add'>+            goto unlock;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-        local    = frame-&gt;local;</div><div class='del'>-        int_lock = &amp;local-&gt;internal_lock;</div><div class='add'>+        source = ret;</div><div class='ctx'> </div><div class='del'>-        if (int_lock-&gt;lock_op_ret &lt; 0) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-                        "Non Blocking inodelks failed.");</div><div class='del'>-                afr_sh_data_done (frame, this);</div><div class='del'>-        } else {</div><div class='add'>+        if (AFR_IS_ARBITER_BRICK(priv, source)) {</div><div class='add'>+            empty_file = afr_is_file_empty_on_all_children(priv,</div><div class='add'>+                                                           locked_replies);</div><div class='add'>+            if (empty_file)</div><div class='add'>+                goto restore_time;</div><div class='ctx'> </div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-                        "Non Blocking inodelks done. Proceeding to FOP");</div><div class='del'>-                afr_sh_data_fxattrop (frame, this);</div><div class='add'>+            did_sh = _gf_false;</div><div class='add'>+            goto unlock;</div><div class='ctx'>         }</div><div class='ctx'> </div><div class='del'>-        return 0;</div><div class='add'>+        ret = __afr_selfheal_truncate_sinks(</div><div class='add'>+            frame, this, fd, healed_sinks,</div><div class='add'>+            locked_replies[source].poststat.ia_size);</div><div class='add'>+        if (ret &lt; 0)</div><div class='add'>+            goto unlock;</div><div class='add'>+</div><div class='add'>+        if (priv-&gt;arbiter_count &amp;&amp;</div><div class='add'>+            AFR_COUNT(healed_sinks, priv-&gt;child_count) == 1 &amp;&amp;</div><div class='add'>+            healed_sinks[ARBITER_BRICK_INDEX]) {</div><div class='add'>+            is_arbiter_the_only_sink = _gf_true;</div><div class='add'>+            goto restore_time;</div><div class='add'>+        }</div><div class='add'>+        ret = 0;</div><div class='add'>+    }</div><div class='add'>+unlock:</div><div class='add'>+    afr_selfheal_uninodelk(frame, this, fd-&gt;inode, this-&gt;name, 0, 0, data_lock);</div><div class='add'>+    if (ret &lt; 0)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    if (!did_sh)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    ret = afr_selfheal_data_do(frame, this, fd, source, healed_sinks,</div><div class='add'>+                               locked_replies);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+restore_time:</div><div class='add'>+    afr_selfheal_restore_time(frame, this, fd-&gt;inode, source, healed_sinks,</div><div class='add'>+                              locked_replies);</div><div class='add'>+</div><div class='add'>+    if (!is_arbiter_the_only_sink &amp;&amp; !empty_file) {</div><div class='add'>+        ret = afr_selfheal_inodelk(frame, this, fd-&gt;inode, this-&gt;name, 0, 0,</div><div class='add'>+                                   data_lock);</div><div class='add'>+        if (ret &lt; priv-&gt;child_count) {</div><div class='add'>+            ret = -ENOTCONN;</div><div class='add'>+            did_sh = _gf_false;</div><div class='add'>+            goto skip_undo_pending;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    ret = afr_selfheal_undo_pending(</div><div class='add'>+        frame, this, fd-&gt;inode, sources, sinks, healed_sinks, undid_pending,</div><div class='add'>+        AFR_DATA_TRANSACTION, locked_replies, data_lock);</div><div class='add'>+skip_undo_pending:</div><div class='add'>+    afr_selfheal_uninodelk(frame, this, fd-&gt;inode, this-&gt;name, 0, 0, data_lock);</div><div class='add'>+out:</div><div class='add'>+</div><div class='add'>+    if (did_sh)</div><div class='add'>+        afr_log_selfheal(fd-&gt;inode-&gt;gfid, this, ret, "data", source, sources,</div><div class='add'>+                         healed_sinks);</div><div class='add'>+    else</div><div class='add'>+        ret = 1;</div><div class='add'>+</div><div class='add'>+    if (locked_replies)</div><div class='add'>+        afr_replies_wipe(locked_replies, priv-&gt;child_count);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-afr_sh_data_lock_rec (call_frame_t *frame, xlator_t *this)</div><div class='add'>+afr_selfheal_data_open_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                           int32_t op_ret, int32_t op_errno, fd_t *fd,</div><div class='add'>+                           dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-        afr_internal_lock_t *int_lock = NULL;</div><div class='del'>-        afr_local_t         *local    = NULL;</div><div class='del'>-        afr_self_heal_t     *sh       = NULL;</div><div class='del'>-</div><div class='del'>-        local    = frame-&gt;local;</div><div class='del'>-        int_lock = &amp;local-&gt;internal_lock;</div><div class='del'>-        sh       = &amp;local-&gt;self_heal;</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    int i = (long)cookie;</div><div class='ctx'> </div><div class='del'>-        int_lock-&gt;transaction_lk_type = AFR_SELFHEAL_LK;</div><div class='del'>-        int_lock-&gt;selfheal_lk_type    = AFR_DATA_SELF_HEAL_LK;</div><div class='add'>+    local = frame-&gt;local;</div><div class='ctx'> </div><div class='del'>-        afr_set_lock_number (frame, this);</div><div class='add'>+    local-&gt;replies[i].valid = 1;</div><div class='add'>+    local-&gt;replies[i].op_ret = op_ret;</div><div class='add'>+    local-&gt;replies[i].op_errno = op_errno;</div><div class='ctx'> </div><div class='del'>-        int_lock-&gt;lk_flock.l_start = 0;</div><div class='del'>-        int_lock-&gt;lk_flock.l_len   = 0;</div><div class='del'>-        int_lock-&gt;lk_flock.l_type  = F_WRLCK;</div><div class='del'>-        int_lock-&gt;lock_cbk         = afr_sh_data_post_nonblocking_inodelk_cbk;</div><div class='add'>+    syncbarrier_wake(&amp;local-&gt;barrier);</div><div class='ctx'> </div><div class='del'>-        afr_nonblocking_inodelk (frame, this);</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-afr_sh_data_lock (call_frame_t *frame, xlator_t *this)</div><div class='add'>+afr_selfheal_data_open(xlator_t *this, inode_t *inode, fd_t **fd)</div><div class='ctx'> {</div><div class='del'>-	afr_local_t *   local = NULL;</div><div class='del'>-	afr_private_t * priv  = NULL;</div><div class='del'>-	afr_self_heal_t * sh  = NULL;</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-	sh    = &amp;local-&gt;self_heal;</div><div class='del'>-	priv  = this-&gt;private;</div><div class='del'>-</div><div class='del'>-        if (sh-&gt;data_lock_held) {</div><div class='del'>-                /* caller has held the lock already,</div><div class='del'>-                   so skip locking */</div><div class='del'>-</div><div class='del'>-                afr_sh_data_fxattrop (frame, this);</div><div class='del'>-                return 0;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    fd_t *fd_tmp = NULL;</div><div class='add'>+    loc_t loc = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    call_frame_t *frame = NULL;</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    int i = 0;</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    fd_tmp = fd_create(inode, 0);</div><div class='add'>+    if (!fd_tmp)</div><div class='add'>+        return -ENOMEM;</div><div class='add'>+</div><div class='add'>+    loc.inode = inode_ref(inode);</div><div class='add'>+    gf_uuid_copy(loc.gfid, inode-&gt;gfid);</div><div class='add'>+</div><div class='add'>+    frame = afr_frame_create(this, &amp;ret);</div><div class='add'>+    if (!frame) {</div><div class='add'>+        ret = -ret;</div><div class='add'>+        fd_unref(fd_tmp);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+</div><div class='add'>+    AFR_ONLIST(local-&gt;child_up, frame, afr_selfheal_data_open_cbk, open, &amp;loc,</div><div class='add'>+               O_RDWR | O_LARGEFILE, fd_tmp, NULL);</div><div class='add'>+</div><div class='add'>+    ret = -ENOTCONN;</div><div class='add'>+    for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+        if (!local-&gt;replies[i].valid)</div><div class='add'>+            continue;</div><div class='add'>+</div><div class='add'>+        if (local-&gt;replies[i].op_ret &lt; 0) {</div><div class='add'>+            ret = -local-&gt;replies[i].op_errno;</div><div class='add'>+            continue;</div><div class='ctx'>         }</div><div class='ctx'> </div><div class='del'>-        return afr_sh_data_lock_rec (frame, this);</div><div class='add'>+        ret = 0;</div><div class='add'>+        break;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        fd_unref(fd_tmp);</div><div class='add'>+        goto out;</div><div class='add'>+    } else {</div><div class='add'>+        fd_bind(fd_tmp);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    *fd = fd_tmp;</div><div class='add'>+out:</div><div class='add'>+    loc_wipe(&amp;loc);</div><div class='add'>+    if (frame)</div><div class='add'>+        AFR_STACK_DESTROY(frame);</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-afr_sh_data_open_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-		      int32_t op_ret, int32_t op_errno, fd_t *fd)</div><div class='del'>-{</div><div class='del'>-	afr_local_t     *local = NULL;</div><div class='del'>-	afr_self_heal_t *sh = NULL;</div><div class='del'>-	afr_private_t   *priv = NULL;</div><div class='del'>-	int              call_count = 0;</div><div class='del'>-	int              child_index = 0;</div><div class='del'>-</div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-	sh = &amp;local-&gt;self_heal;</div><div class='del'>-	priv = this-&gt;private;</div><div class='del'>-</div><div class='del'>-	child_index = (long) cookie;</div><div class='del'>-</div><div class='del'>-	/* TODO: some of the open's might fail.</div><div class='del'>-	   In that case, modify cleanup fn to send flush on those </div><div class='del'>-	   fd's which are already open */</div><div class='del'>-</div><div class='del'>-	LOCK (&amp;frame-&gt;lock);</div><div class='del'>-	{</div><div class='del'>-		if (op_ret == -1) {</div><div class='del'>-			gf_log (this-&gt;name, GF_LOG_TRACE,</div><div class='del'>-				"open of %s failed on child %s (%s)",</div><div class='del'>-				local-&gt;loc.path,</div><div class='del'>-				priv-&gt;children[child_index]-&gt;name,</div><div class='del'>-				strerror (op_errno));</div><div class='del'>-			sh-&gt;op_failed = 1;</div><div class='del'>-		}</div><div class='del'>-</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_TRACE,</div><div class='del'>-                        "open of %s succeeded on child %s",</div><div class='del'>-                        local-&gt;loc.path,</div><div class='del'>-                        priv-&gt;children[child_index]-&gt;name);</div><div class='del'>-	}</div><div class='del'>-	UNLOCK (&amp;frame-&gt;lock);</div><div class='del'>-</div><div class='del'>-	call_count = afr_frame_return (frame);</div><div class='del'>-</div><div class='del'>-	if (call_count == 0) {</div><div class='del'>-		if (sh-&gt;op_failed) {</div><div class='del'>-			afr_sh_data_finish (frame, this);</div><div class='del'>-			return 0;</div><div class='del'>-		}</div><div class='del'>-</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_TRACE,</div><div class='del'>-			"fd for %s opened, commencing sync",</div><div class='del'>-			local-&gt;loc.path);</div><div class='del'>-</div><div class='del'>-                afr_sh_data_lock (frame, this);</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-afr_sh_data_open (call_frame_t *frame, xlator_t *this)</div><div class='add'>+afr_selfheal_data(call_frame_t *frame, xlator_t *this, fd_t *fd)</div><div class='ctx'> {</div><div class='del'>-	int i = 0;</div><div class='del'>-	int call_count = 0;</div><div class='del'>-</div><div class='del'>-	fd_t *fd = NULL;</div><div class='del'>-</div><div class='del'>-	afr_local_t *   local = NULL;</div><div class='del'>-	afr_private_t * priv  = NULL;</div><div class='del'>-	afr_self_heal_t *sh = NULL;</div><div class='del'>-</div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-	sh = &amp;local-&gt;self_heal;</div><div class='del'>-	priv = this-&gt;private;</div><div class='del'>-</div><div class='del'>-        if (sh-&gt;healing_fd_opened) {</div><div class='del'>-                /* caller has opened the fd for us already, so skip open */</div><div class='del'>-</div><div class='del'>-                afr_sh_data_lock (frame, this);</div><div class='del'>-                return 0;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    unsigned char *locked_on = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    inode_t *inode = fd-&gt;inode;</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    locked_on = alloca0(priv-&gt;child_count);</div><div class='add'>+</div><div class='add'>+    ret = afr_selfheal_tie_breaker_inodelk(frame, this, inode, priv-&gt;sh_domain,</div><div class='add'>+                                           0, 0, locked_on);</div><div class='add'>+    {</div><div class='add'>+        if (ret &lt; priv-&gt;child_count) {</div><div class='add'>+            gf_msg_debug(this-&gt;name, 0,</div><div class='add'>+                         "%s: Skipping "</div><div class='add'>+                         "self-heal as only %d number of "</div><div class='add'>+                         "subvolumes could be locked",</div><div class='add'>+                         uuid_utoa(fd-&gt;inode-&gt;gfid), ret);</div><div class='add'>+            /* Either less than two subvols available, or another</div><div class='add'>+               selfheal (from another server) is in progress. Skip</div><div class='add'>+               for now in any case there isn't anything to do.</div><div class='add'>+            */</div><div class='add'>+            ret = -ENOTCONN;</div><div class='add'>+            goto unlock;</div><div class='ctx'>         }</div><div class='ctx'> </div><div class='del'>-	call_count = afr_up_children_count (priv-&gt;child_count, local-&gt;child_up);</div><div class='del'>-	local-&gt;call_count = call_count;</div><div class='del'>-</div><div class='del'>-	fd = fd_create (local-&gt;loc.inode, frame-&gt;root-&gt;pid);</div><div class='del'>-	sh-&gt;healing_fd = fd;</div><div class='add'>+        ret = __afr_selfheal_data(frame, this, fd, locked_on);</div><div class='add'>+    }</div><div class='add'>+unlock:</div><div class='add'>+    afr_selfheal_uninodelk(frame, this, inode, priv-&gt;sh_domain, 0, 0,</div><div class='add'>+                           locked_on);</div><div class='ctx'> </div><div class='del'>-	/* open sinks */</div><div class='del'>-	for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='del'>-		if(!local-&gt;child_up[i])</div><div class='del'>-			continue;</div><div class='del'>-</div><div class='del'>-		STACK_WIND_COOKIE (frame, afr_sh_data_open_cbk,</div><div class='del'>-				   (void *) (long) i,</div><div class='del'>-				   priv-&gt;children[i], </div><div class='del'>-				   priv-&gt;children[i]-&gt;fops-&gt;open,</div><div class='del'>-				   &amp;local-&gt;loc, </div><div class='del'>-				   O_RDWR|O_LARGEFILE, fd, 0); </div><div class='del'>-</div><div class='del'>-		if (!--call_count)</div><div class='del'>-			break;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-afr_self_heal_data (call_frame_t *frame, xlator_t *this)</div><div class='del'>-{</div><div class='del'>-	afr_local_t   *local = NULL;</div><div class='del'>-	afr_self_heal_t *sh = NULL;</div><div class='del'>-	afr_private_t *priv = this-&gt;private;</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-	sh = &amp;local-&gt;self_heal;</div><div class='del'>-</div><div class='del'>-	if (sh-&gt;need_data_self_heal &amp;&amp; priv-&gt;data_self_heal) {</div><div class='del'>-		afr_sh_data_open (frame, this);</div><div class='del'>-	} else {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_TRACE,</div><div class='del'>-			"not doing data self heal on %s",</div><div class='del'>-			local-&gt;loc.path);</div><div class='del'>-		afr_sh_data_done (frame, this);</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='head'>diff --git a/xlators/cluster/afr/src/afr-self-heal-entry.c b/xlators/cluster/afr/src/afr-self-heal-entry.c<br/>index dcb4f0cd1ca..64893f441e3 100644<br/>--- a/<a href='/cgit/glusterfs.git/tree/xlators/cluster/afr/src/afr-self-heal-entry.c?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/cluster/afr/src/afr-self-heal-entry.c</a><br/>+++ b/<a href='/cgit/glusterfs.git/tree/xlators/cluster/afr/src/afr-self-heal-entry.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>xlators/cluster/afr/src/afr-self-heal-entry.c</a></div><div class='hunk'>@@ -1,2456 +1,1276 @@</div><div class='ctx'> /*</div><div class='del'>-  Copyright (c) 2008-2009 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='add'>+  Copyright (c) 2013 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='ctx'>   This file is part of GlusterFS.</div><div class='ctx'> </div><div class='del'>-  GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-  it under the terms of the GNU General Public License as published</div><div class='del'>-  by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-  or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-  GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-  WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-  General Public License for more details.</div><div class='del'>-</div><div class='del'>-  You should have received a copy of the GNU General Public License</div><div class='del'>-  along with this program.  If not, see</div><div class='del'>-  &lt;http://www.gnu.org/licenses/&gt;.</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='ctx'> */</div><div class='ctx'> </div><div class='del'>-#include &lt;libgen.h&gt;</div><div class='del'>-#include &lt;unistd.h&gt;</div><div class='del'>-#include &lt;fnmatch.h&gt;</div><div class='del'>-#include &lt;sys/time.h&gt;</div><div class='del'>-#include &lt;stdlib.h&gt;</div><div class='del'>-#include &lt;signal.h&gt;</div><div class='del'>-</div><div class='del'>-#ifndef _CONFIG_H</div><div class='del'>-#define _CONFIG_H</div><div class='del'>-#include "config.h"</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-#include "glusterfs.h"</div><div class='del'>-#include "inode.h"</div><div class='ctx'> #include "afr.h"</div><div class='del'>-#include "dict.h"</div><div class='del'>-#include "xlator.h"</div><div class='del'>-#include "hashfn.h"</div><div class='del'>-#include "logging.h"</div><div class='del'>-#include "stack.h"</div><div class='del'>-#include "list.h"</div><div class='del'>-#include "call-stub.h"</div><div class='del'>-#include "defaults.h"</div><div class='del'>-#include "common-utils.h"</div><div class='del'>-#include "compat-errno.h"</div><div class='del'>-#include "compat.h"</div><div class='del'>-#include "byte-order.h"</div><div class='del'>-</div><div class='del'>-#include "afr-transaction.h"</div><div class='ctx'> #include "afr-self-heal.h"</div><div class='del'>-#include "afr-self-heal-common.h"</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-afr_sh_post_nonblocking_entrylk_cbk (call_frame_t *frame, xlator_t *this);</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-afr_sh_entry_done (call_frame_t *frame, xlator_t *this)</div><div class='del'>-{</div><div class='del'>-	afr_local_t     *local = NULL;</div><div class='del'>-	afr_self_heal_t *sh = NULL;</div><div class='del'>-	afr_private_t   *priv = NULL;</div><div class='del'>-</div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-	sh = &amp;local-&gt;self_heal;</div><div class='del'>-	priv = this-&gt;private;</div><div class='del'>-</div><div class='del'>-	/* </div><div class='del'>-	   TODO: cleanup sh-&gt;* </div><div class='del'>-	*/</div><div class='del'>-</div><div class='del'>-        if (sh-&gt;healing_fd)</div><div class='del'>-                fd_unref (sh-&gt;healing_fd);</div><div class='del'>-        sh-&gt;healing_fd = NULL;</div><div class='del'>-</div><div class='del'>-/*         for (i = 0; i &lt; priv-&gt;child_count; i++) { */</div><div class='del'>-/*                 sh-&gt;locked_nodes[i] = 0; */</div><div class='del'>-/*         } */</div><div class='del'>-</div><div class='del'>-	gf_log (this-&gt;name, GF_LOG_TRACE,</div><div class='del'>-		"self heal of %s completed",</div><div class='del'>-		local-&gt;loc.path);</div><div class='del'>-</div><div class='del'>-	sh-&gt;completion_cbk (frame, this);</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-afr_sh_entry_unlock (call_frame_t *frame, xlator_t *this)</div><div class='del'>-{</div><div class='del'>-        afr_local_t         *local    = NULL;</div><div class='del'>-        afr_internal_lock_t *int_lock = NULL;</div><div class='del'>-</div><div class='del'>-        local    = frame-&gt;local;</div><div class='del'>-        int_lock = &amp;local-&gt;internal_lock;</div><div class='del'>-</div><div class='del'>-        int_lock-&gt;lock_cbk = afr_sh_entry_done;</div><div class='del'>-        afr_unlock (frame, this);</div><div class='del'>-</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='add'>+#include &lt;glusterfs/byte-order.h&gt;</div><div class='add'>+#include "afr-transaction.h"</div><div class='add'>+#include "afr-messages.h"</div><div class='add'>+#include &lt;glusterfs/syncop-utils.h&gt;</div><div class='add'>+#include &lt;glusterfs/events.h&gt;</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-afr_sh_entry_finish (call_frame_t *frame, xlator_t *this)</div><div class='add'>+afr_selfheal_entry_anon_inode(xlator_t *this, inode_t *dir, const char *name,</div><div class='add'>+                              inode_t *inode, int child,</div><div class='add'>+                              struct afr_reply *replies,</div><div class='add'>+                              gf_boolean_t *anon_inode)</div><div class='ctx'> {</div><div class='del'>-	afr_local_t   *local = NULL;</div><div class='del'>-</div><div class='del'>-	local = frame-&gt;local;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    xlator_t *subvol = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    int i = 0;</div><div class='add'>+    char g[64] = {0};</div><div class='add'>+    unsigned char *lookup_success = NULL;</div><div class='add'>+    call_frame_t *frame = NULL;</div><div class='add'>+    loc_t loc2 = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    loc_t loc = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+    subvol = priv-&gt;children[child];</div><div class='add'>+    lookup_success = alloca0(priv-&gt;child_count);</div><div class='add'>+    uuid_utoa_r(replies[child].poststat.ia_gfid, g);</div><div class='add'>+    loc.inode = inode_new(inode-&gt;table);</div><div class='add'>+    if (!loc.inode) {</div><div class='add'>+        ret = -ENOMEM;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (replies[child].poststat.ia_type == IA_IFDIR) {</div><div class='add'>+        /* This directory may have sub-directory hierarchy which may need to</div><div class='add'>+         * be preserved for subsequent heals. So unconditionally move the</div><div class='add'>+         * directory to anonymous-inode directory*/</div><div class='add'>+        *anon_inode = _gf_true;</div><div class='add'>+        goto anon_inode;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    frame = afr_frame_create(this, &amp;ret);</div><div class='add'>+    if (!frame) {</div><div class='add'>+        ret = -ret;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    gf_uuid_copy(loc.gfid, replies[child].poststat.ia_gfid);</div><div class='add'>+    AFR_ONLIST(local-&gt;child_up, frame, afr_selfheal_discover_cbk, lookup, &amp;loc,</div><div class='add'>+               NULL);</div><div class='add'>+    for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+        if (local-&gt;replies[i].op_ret == 0) {</div><div class='add'>+            lookup_success[i] = 1;</div><div class='add'>+        } else if (local-&gt;replies[i].op_errno != ENOENT &amp;&amp;</div><div class='add'>+                   local-&gt;replies[i].op_errno != ESTALE) {</div><div class='add'>+            ret = -local-&gt;replies[i].op_errno;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	gf_log (this-&gt;name, GF_LOG_TRACE,</div><div class='del'>-		"finishing entry selfheal of %s", local-&gt;loc.path);</div><div class='add'>+    if (priv-&gt;quorum_count) {</div><div class='add'>+        if (afr_has_quorum(lookup_success, this, NULL)) {</div><div class='add'>+            *anon_inode = _gf_true;</div><div class='add'>+        }</div><div class='add'>+    } else if (AFR_COUNT(lookup_success, priv-&gt;child_count) &gt; 1) {</div><div class='add'>+        *anon_inode = _gf_true;</div><div class='add'>+    } else if (ret) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+anon_inode:</div><div class='add'>+    if (!*anon_inode) {</div><div class='add'>+        ret = 0;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    loc.parent = inode_ref(dir);</div><div class='add'>+    gf_uuid_copy(loc.pargfid, dir-&gt;gfid);</div><div class='add'>+    loc.name = name;</div><div class='add'>+</div><div class='add'>+    ret = afr_anon_inode_create(this, child, &amp;loc2.parent);</div><div class='add'>+    if (ret &lt; 0)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    loc2.name = g;</div><div class='add'>+    ret = syncop_rename(subvol, &amp;loc, &amp;loc2, NULL, NULL);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_WARNING, -ret, AFR_MSG_EXPUNGING_FILE_OR_DIR,</div><div class='add'>+               "Rename to %s dir %s/%s (%s) on %s failed",</div><div class='add'>+               priv-&gt;anon_inode_name, uuid_utoa(dir-&gt;gfid), name, g,</div><div class='add'>+               subvol-&gt;name);</div><div class='add'>+    } else {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_WARNING, 0, AFR_MSG_EXPUNGING_FILE_OR_DIR,</div><div class='add'>+               "Rename to %s dir %s/%s (%s) on %s successful",</div><div class='add'>+               priv-&gt;anon_inode_name, uuid_utoa(dir-&gt;gfid), name, g,</div><div class='add'>+               subvol-&gt;name);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	afr_sh_entry_unlock (frame, this);</div><div class='add'>+out:</div><div class='add'>+    loc_wipe(&amp;loc);</div><div class='add'>+    loc_wipe(&amp;loc2);</div><div class='add'>+    if (frame) {</div><div class='add'>+        AFR_STACK_DESTROY(frame);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	return 0;</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-afr_sh_entry_erase_pending_cbk (call_frame_t *frame, void *cookie,</div><div class='del'>-				xlator_t *this, int32_t op_ret,</div><div class='del'>-				int32_t op_errno, dict_t *xattr)</div><div class='add'>+afr_selfheal_entry_delete(xlator_t *this, inode_t *dir, const char *name,</div><div class='add'>+                          inode_t *inode, int child, struct afr_reply *replies)</div><div class='ctx'> {</div><div class='del'>-	int             call_count = 0;</div><div class='add'>+    char g[64] = {0};</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    xlator_t *subvol = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    loc_t loc = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    gf_boolean_t anon_inode = _gf_false;</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+    subvol = priv-&gt;children[child];</div><div class='add'>+</div><div class='add'>+    if ((!replies[child].valid) || (replies[child].op_ret &lt; 0)) {</div><div class='add'>+        /*Nothing to do*/</div><div class='add'>+        ret = 0;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (priv-&gt;use_anon_inode) {</div><div class='add'>+        ret = afr_selfheal_entry_anon_inode(this, dir, name, inode, child,</div><div class='add'>+                                            replies, &amp;anon_inode);</div><div class='add'>+        if (ret &lt; 0 || anon_inode)</div><div class='add'>+            goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    loc.parent = inode_ref(dir);</div><div class='add'>+    loc.inode = inode_new(inode-&gt;table);</div><div class='add'>+    if (!loc.inode) {</div><div class='add'>+        ret = -ENOMEM;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    loc.name = name;</div><div class='add'>+    switch (replies[child].poststat.ia_type) {</div><div class='add'>+        case IA_IFDIR:</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_WARNING, 0, AFR_MSG_EXPUNGING_FILE_OR_DIR,</div><div class='add'>+                   "expunging dir %s/%s (%s) on %s", uuid_utoa(dir-&gt;gfid), name,</div><div class='add'>+                   uuid_utoa_r(replies[child].poststat.ia_gfid, g),</div><div class='add'>+                   subvol-&gt;name);</div><div class='add'>+            ret = syncop_rmdir(subvol, &amp;loc, 1, NULL, NULL);</div><div class='add'>+            break;</div><div class='add'>+        default:</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_WARNING, 0, AFR_MSG_EXPUNGING_FILE_OR_DIR,</div><div class='add'>+                   "expunging file %s/%s (%s) on %s", uuid_utoa(dir-&gt;gfid),</div><div class='add'>+                   name, uuid_utoa_r(replies[child].poststat.ia_gfid, g),</div><div class='add'>+                   subvol-&gt;name);</div><div class='add'>+            ret = syncop_unlink(subvol, &amp;loc, NULL, NULL);</div><div class='add'>+            break;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	call_count = afr_frame_return (frame);</div><div class='del'>-</div><div class='del'>-	if (call_count == 0)</div><div class='del'>-		afr_sh_entry_finish (frame, this);</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='add'>+out:</div><div class='add'>+    loc_wipe(&amp;loc);</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-afr_sh_entry_erase_pending (call_frame_t *frame, xlator_t *this)</div><div class='add'>+afr_selfheal_recreate_entry(call_frame_t *frame, int dst, int source,</div><div class='add'>+                            unsigned char *sources, inode_t *dir,</div><div class='add'>+                            const char *name, inode_t *inode,</div><div class='add'>+                            struct afr_reply *replies)</div><div class='ctx'> {</div><div class='del'>-	afr_local_t     *local = NULL;</div><div class='del'>-	afr_self_heal_t *sh = NULL;</div><div class='del'>-	afr_private_t   *priv = NULL;</div><div class='del'>-	int              call_count = 0;</div><div class='del'>-	int              i = 0;</div><div class='del'>-	dict_t          **erase_xattr = NULL;</div><div class='del'>-        int              need_unwind = 0;</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-	sh = &amp;local-&gt;self_heal;</div><div class='del'>-	priv = this-&gt;private;</div><div class='del'>-</div><div class='del'>-	afr_sh_pending_to_delta (priv, sh-&gt;xattr, sh-&gt;delta_matrix, sh-&gt;success,</div><div class='del'>-                                 priv-&gt;child_count, AFR_ENTRY_TRANSACTION);</div><div class='del'>-</div><div class='del'>-	erase_xattr = GF_CALLOC (sizeof (*erase_xattr), priv-&gt;child_count,</div><div class='del'>-                                 gf_afr_mt_dict_t);</div><div class='del'>-</div><div class='del'>-	for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='del'>-		if (sh-&gt;xattr[i]) {</div><div class='del'>-			call_count++;</div><div class='del'>-</div><div class='del'>-			erase_xattr[i] = get_new_dict();</div><div class='del'>-			dict_ref (erase_xattr[i]);</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-        if (call_count == 0)</div><div class='del'>-                need_unwind = 1;</div><div class='del'>-</div><div class='del'>-	afr_sh_delta_to_xattr (priv, sh-&gt;delta_matrix, erase_xattr,</div><div class='del'>-			       priv-&gt;child_count, AFR_ENTRY_TRANSACTION);</div><div class='del'>-</div><div class='del'>-	local-&gt;call_count = call_count;</div><div class='del'>-	for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='del'>-		if (!erase_xattr[i])</div><div class='del'>-			continue;</div><div class='del'>-</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_TRACE,</div><div class='del'>-			"erasing pending flags from %s on %s",</div><div class='del'>-			local-&gt;loc.path, priv-&gt;children[i]-&gt;name);</div><div class='del'>-</div><div class='del'>-		STACK_WIND_COOKIE (frame, afr_sh_entry_erase_pending_cbk,</div><div class='del'>-				   (void *) (long) i,</div><div class='del'>-				   priv-&gt;children[i],</div><div class='del'>-				   priv-&gt;children[i]-&gt;fops-&gt;xattrop,</div><div class='del'>-				   &amp;local-&gt;loc,</div><div class='del'>-				   GF_XATTROP_ADD_ARRAY, erase_xattr[i]);</div><div class='del'>-		if (!--call_count)</div><div class='del'>-			break;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='del'>-		if (erase_xattr[i]) {</div><div class='del'>-			dict_unref (erase_xattr[i]);</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='del'>-	GF_FREE (erase_xattr);</div><div class='del'>-</div><div class='del'>-        if (need_unwind)</div><div class='del'>-                afr_sh_entry_finish (frame, this);</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='add'>+    int ret = 0;</div><div class='add'>+    loc_t loc = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    loc_t srcloc = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    loc_t anonloc = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    xlator_t *this = frame-&gt;this;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    dict_t *xdata = NULL;</div><div class='add'>+    struct iatt *iatt = NULL;</div><div class='add'>+    char *linkname = NULL;</div><div class='add'>+    mode_t mode = 0;</div><div class='add'>+    struct iatt newent = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    unsigned char *newentry = NULL;</div><div class='add'>+    char iatt_uuid_str[64] = {0};</div><div class='add'>+    char dir_uuid_str[64] = {0};</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+    iatt = &amp;replies[source].poststat;</div><div class='add'>+    uuid_utoa_r(iatt-&gt;ia_gfid, iatt_uuid_str);</div><div class='add'>+    if (iatt-&gt;ia_type == IA_INVAL || gf_uuid_is_null(iatt-&gt;ia_gfid)) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_ERROR, 0, AFR_MSG_SELF_HEAL_FAILED,</div><div class='add'>+               "Invalid ia_type (%d) or gfid(%s). source brick=%d, "</div><div class='add'>+               "pargfid=%s, name=%s",</div><div class='add'>+               iatt-&gt;ia_type, iatt_uuid_str, source,</div><div class='add'>+               uuid_utoa_r(dir-&gt;gfid, dir_uuid_str), name);</div><div class='add'>+        ret = -EINVAL;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    xdata = dict_new();</div><div class='add'>+    if (!xdata)</div><div class='add'>+        return -ENOMEM;</div><div class='add'>+    newentry = alloca0(priv-&gt;child_count);</div><div class='add'>+    loc.parent = inode_ref(dir);</div><div class='add'>+    gf_uuid_copy(loc.pargfid, dir-&gt;gfid);</div><div class='add'>+    loc.name = name;</div><div class='add'>+    loc.inode = inode_ref(inode);</div><div class='add'>+</div><div class='add'>+    ret = afr_selfheal_entry_delete(this, dir, name, inode, dst, replies);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    ret = dict_set_gfuuid(xdata, "gfid-req", replies[source].poststat.ia_gfid,</div><div class='add'>+                          true);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    srcloc.inode = inode_ref(inode);</div><div class='add'>+    gf_uuid_copy(srcloc.gfid, iatt-&gt;ia_gfid);</div><div class='add'>+    ret = syncop_lookup(priv-&gt;children[dst], &amp;srcloc, 0, 0, 0, 0);</div><div class='add'>+    if (ret == -ENOENT || ret == -ESTALE) {</div><div class='add'>+        newentry[dst] = 1;</div><div class='add'>+        ret = afr_selfheal_newentry_mark(frame, this, inode, source, replies,</div><div class='add'>+                                         sources, newentry);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+    } else if (ret == 0 &amp;&amp; iatt-&gt;ia_type == IA_IFDIR &amp;&amp; priv-&gt;use_anon_inode) {</div><div class='add'>+        // Try rename from hidden directory</div><div class='add'>+        ret = afr_anon_inode_create(this, dst, &amp;anonloc.parent);</div><div class='add'>+        if (ret &lt; 0)</div><div class='add'>+            goto out;</div><div class='add'>+        anonloc.inode = inode_ref(inode);</div><div class='add'>+        anonloc.name = iatt_uuid_str;</div><div class='add'>+        ret = syncop_rename(priv-&gt;children[dst], &amp;anonloc, &amp;loc, NULL, NULL);</div><div class='add'>+        if (ret == -ENOENT || ret == -ESTALE)</div><div class='add'>+            ret = -1; /*This sets 'mismatch' to true*/</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    mode = st_mode_from_ia(iatt-&gt;ia_prot, iatt-&gt;ia_type);</div><div class='add'>+</div><div class='add'>+    switch (iatt-&gt;ia_type) {</div><div class='add'>+        case IA_IFDIR:</div><div class='add'>+            ret = syncop_mkdir(priv-&gt;children[dst], &amp;loc, mode, 0, xdata, NULL);</div><div class='add'>+            break;</div><div class='add'>+        case IA_IFLNK:</div><div class='add'>+            if (!newentry[dst]) {</div><div class='add'>+                ret = syncop_link(priv-&gt;children[dst], &amp;srcloc, &amp;loc, &amp;newent,</div><div class='add'>+                                  NULL, NULL);</div><div class='add'>+            } else {</div><div class='add'>+                ret = syncop_readlink(priv-&gt;children[source], &amp;srcloc,</div><div class='add'>+                                      &amp;linkname, 4096, NULL, NULL);</div><div class='add'>+                if (ret &lt;= 0)</div><div class='add'>+                    goto out;</div><div class='add'>+                ret = syncop_symlink(priv-&gt;children[dst], &amp;loc, linkname, NULL,</div><div class='add'>+                                     xdata, NULL);</div><div class='add'>+            }</div><div class='add'>+            break;</div><div class='add'>+        default:</div><div class='add'>+            ret = dict_set_int32_sizen(xdata, GLUSTERFS_INTERNAL_FOP_KEY, 1);</div><div class='add'>+            if (ret)</div><div class='add'>+                goto out;</div><div class='add'>+            ret = syncop_mknod(</div><div class='add'>+                priv-&gt;children[dst], &amp;loc, mode,</div><div class='add'>+                makedev(ia_major(iatt-&gt;ia_rdev), ia_minor(iatt-&gt;ia_rdev)),</div><div class='add'>+                &amp;newent, xdata, NULL);</div><div class='add'>+            break;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-static int</div><div class='del'>-next_active_source (call_frame_t *frame, xlator_t *this,</div><div class='del'>-		    int current_active_source)</div><div class='del'>-{</div><div class='del'>-	afr_private_t   *priv = NULL;</div><div class='del'>-	afr_local_t     *local  = NULL;</div><div class='del'>-	afr_self_heal_t *sh  = NULL;</div><div class='del'>-	int              source = -1;</div><div class='del'>-	int              next_active_source = -1;</div><div class='del'>-	int              i = 0;</div><div class='del'>-</div><div class='del'>-	priv = this-&gt;private;</div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-	sh = &amp;local-&gt;self_heal;</div><div class='del'>-</div><div class='del'>-	source = sh-&gt;source;</div><div class='del'>-</div><div class='del'>-	if (source != -1) {</div><div class='del'>-		if (current_active_source != source)</div><div class='del'>-			next_active_source = source;</div><div class='del'>-		goto out;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	/*</div><div class='del'>-	  the next active sink becomes the source for the</div><div class='del'>-	  'conservative decision' of merging all entries</div><div class='del'>-	*/</div><div class='del'>-</div><div class='del'>-	for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='del'>-		if ((sh-&gt;sources[i] == 0)</div><div class='del'>-		    &amp;&amp; (local-&gt;child_up[i] == 1)</div><div class='del'>-		    &amp;&amp; (i &gt; current_active_source)) {</div><div class='del'>-</div><div class='del'>-			next_active_source = i;</div><div class='del'>-			break;</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='ctx'> out:</div><div class='del'>-	return next_active_source;</div><div class='add'>+    if (xdata)</div><div class='add'>+        dict_unref(xdata);</div><div class='add'>+    GF_FREE(linkname);</div><div class='add'>+    loc_wipe(&amp;loc);</div><div class='add'>+    loc_wipe(&amp;srcloc);</div><div class='add'>+    loc_wipe(&amp;anonloc);</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='del'>-</div><div class='ctx'> static int</div><div class='del'>-next_active_sink (call_frame_t *frame, xlator_t *this,</div><div class='del'>-		  int current_active_sink)</div><div class='add'>+__afr_selfheal_heal_dirent(call_frame_t *frame, xlator_t *this, fd_t *fd,</div><div class='add'>+                           char *name, inode_t *inode, int source,</div><div class='add'>+                           unsigned char *sources, unsigned char *healed_sinks,</div><div class='add'>+                           unsigned char *locked_on, struct afr_reply *replies)</div><div class='ctx'> {</div><div class='del'>-	afr_private_t   *priv = NULL;</div><div class='del'>-	afr_local_t     *local  = NULL;</div><div class='del'>-	afr_self_heal_t *sh  = NULL;</div><div class='del'>-	int              next_active_sink = -1;</div><div class='del'>-	int              i = 0;</div><div class='del'>-</div><div class='del'>-	priv = this-&gt;private;</div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-	sh = &amp;local-&gt;self_heal;</div><div class='del'>-</div><div class='del'>-	/*</div><div class='del'>-	  the next active sink becomes the source for the</div><div class='del'>-	  'conservative decision' of merging all entries</div><div class='del'>-	*/</div><div class='del'>-</div><div class='del'>-	for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='del'>-		if ((sh-&gt;sources[i] == 0)</div><div class='del'>-		    &amp;&amp; (local-&gt;child_up[i] == 1)</div><div class='del'>-		    &amp;&amp; (i &gt; current_active_sink)) {</div><div class='del'>-</div><div class='del'>-			next_active_sink = i;</div><div class='del'>-			break;</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	return next_active_sink;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-build_child_loc (xlator_t *this, loc_t *child, loc_t *parent, char *name)</div><div class='del'>-{</div><div class='del'>-	int   ret = -1;</div><div class='del'>-</div><div class='del'>-	if (!child) {</div><div class='del'>-		goto out;</div><div class='del'>-	}</div><div class='add'>+    int ret = 0;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    int i = 0;</div><div class='ctx'> </div><div class='del'>-	if (strcmp (parent-&gt;path, "/") == 0)</div><div class='del'>-		ret = gf_asprintf ((char **)&amp;child-&gt;path, "/%s", name);</div><div class='del'>-	else</div><div class='del'>-		ret = gf_asprintf ((char **)&amp;child-&gt;path, "%s/%s", parent-&gt;path, </div><div class='del'>-                                name);</div><div class='add'>+    priv = this-&gt;private;</div><div class='ctx'> </div><div class='del'>-        if (-1 == ret) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-                        "asprintf failed while setting child path");</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-	if (!child-&gt;path) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-			"Out of memory.");</div><div class='del'>-		goto out;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	child-&gt;name = strrchr (child-&gt;path, '/');</div><div class='del'>-	if (child-&gt;name)</div><div class='del'>-		child-&gt;name++;</div><div class='del'>-</div><div class='del'>-	child-&gt;parent = inode_ref (parent-&gt;inode);</div><div class='del'>-	child-&gt;inode = inode_new (parent-&gt;inode-&gt;table);</div><div class='del'>-</div><div class='del'>-	if (!child-&gt;inode) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-			"Out of memory.");</div><div class='del'>-		goto out;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	ret = 0;</div><div class='del'>-out:</div><div class='del'>-	if (ret == -1)</div><div class='del'>-		loc_wipe (child);</div><div class='del'>-</div><div class='del'>-	return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-afr_sh_entry_expunge_all (call_frame_t *frame, xlator_t *this);</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-afr_sh_entry_expunge_subvol (call_frame_t *frame, xlator_t *this,</div><div class='del'>-			     int active_src);</div><div class='add'>+    if (!replies[source].valid)</div><div class='add'>+        return -EIO;</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-afr_sh_entry_expunge_entry_done (call_frame_t *frame, xlator_t *this,</div><div class='del'>-				 int active_src)</div><div class='del'>-{</div><div class='del'>-	int              call_count = 0;</div><div class='del'>-</div><div class='del'>-	call_count = afr_frame_return (frame);</div><div class='del'>-</div><div class='del'>-	if (call_count == 0)</div><div class='del'>-		afr_sh_entry_expunge_subvol (frame, this, active_src);</div><div class='add'>+    /* Skip healing this entry if the last lookup on it failed for reasons</div><div class='add'>+     * other than ENOENT.</div><div class='add'>+     */</div><div class='add'>+    if ((replies[source].op_ret &lt; 0) &amp;&amp; (replies[source].op_errno != ENOENT))</div><div class='add'>+        return -replies[source].op_errno;</div><div class='ctx'> </div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='add'>+    if (replies[source].op_ret == 0) {</div><div class='add'>+        ret = afr_lookup_and_heal_gfid(this, fd-&gt;inode, name, inode, replies,</div><div class='add'>+                                       source, sources,</div><div class='add'>+                                       &amp;replies[source].poststat.ia_gfid, NULL);</div><div class='add'>+        if (ret)</div><div class='add'>+            return ret;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+        if (!healed_sinks[i])</div><div class='add'>+            continue;</div><div class='add'>+        if (replies[source].op_ret == -1 &amp;&amp;</div><div class='add'>+            replies[source].op_errno == ENOENT) {</div><div class='add'>+            ret = afr_selfheal_entry_delete(this, fd-&gt;inode, name, inode, i,</div><div class='add'>+                                            replies);</div><div class='add'>+        } else {</div><div class='add'>+            if (!gf_uuid_compare(replies[i].poststat.ia_gfid,</div><div class='add'>+                                 replies[source].poststat.ia_gfid))</div><div class='add'>+                continue;</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-afr_sh_entry_expunge_parent_setattr_cbk (call_frame_t *expunge_frame,</div><div class='del'>-                                         void *cookie, xlator_t *this,</div><div class='del'>-                                         int32_t op_ret, int32_t op_errno,</div><div class='del'>-                                         struct iatt *preop, struct iatt *postop)</div><div class='del'>-{</div><div class='del'>-	afr_private_t   *priv          = NULL;</div><div class='del'>-	afr_local_t     *expunge_local = NULL;</div><div class='del'>-	afr_self_heal_t *expunge_sh    = NULL;</div><div class='del'>-        call_frame_t    *frame         = NULL;</div><div class='del'>-</div><div class='del'>-        int active_src = (long) cookie;</div><div class='del'>-</div><div class='del'>-        priv          = this-&gt;private;</div><div class='del'>-        expunge_local = expunge_frame-&gt;local;</div><div class='del'>-	expunge_sh    = &amp;expunge_local-&gt;self_heal;</div><div class='del'>-	frame         = expunge_sh-&gt;sh_frame;</div><div class='del'>-</div><div class='del'>-        if (op_ret != 0) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-                        "setattr on parent directory of %s on subvolume %s failed: %s",</div><div class='del'>-                        expunge_local-&gt;loc.path,</div><div class='del'>-                        priv-&gt;children[active_src]-&gt;name, strerror (op_errno));</div><div class='add'>+            ret = afr_selfheal_recreate_entry(frame, i, source, sources,</div><div class='add'>+                                              fd-&gt;inode, name, inode, replies);</div><div class='ctx'>         }</div><div class='add'>+        if (ret &lt; 0)</div><div class='add'>+            break;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	AFR_STACK_DESTROY (expunge_frame);</div><div class='del'>-	afr_sh_entry_expunge_entry_done (frame, this, active_src);</div><div class='del'>-</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-afr_sh_entry_expunge_rename_cbk (call_frame_t *expunge_frame, void *cookie,</div><div class='del'>-				 xlator_t *this,</div><div class='del'>-				 int32_t op_ret, int32_t op_errno,</div><div class='del'>-                                 struct iatt *buf,</div><div class='del'>-                                 struct iatt *preoldparent,</div><div class='del'>-                                 struct iatt *postoldparent,</div><div class='del'>-                                 struct iatt *prenewparent,</div><div class='del'>-                                 struct iatt *postnewparent)</div><div class='del'>-{</div><div class='del'>-	afr_private_t   *priv = NULL;</div><div class='del'>-	afr_local_t     *expunge_local = NULL;</div><div class='del'>-	afr_self_heal_t *expunge_sh = NULL;</div><div class='del'>-	int              active_src = 0;</div><div class='del'>-	call_frame_t    *frame = NULL;</div><div class='del'>-</div><div class='del'>-        int32_t valid = 0;</div><div class='del'>-</div><div class='del'>-	priv = this-&gt;private;</div><div class='del'>-	expunge_local = expunge_frame-&gt;local;</div><div class='del'>-	expunge_sh = &amp;expunge_local-&gt;self_heal;</div><div class='del'>-	frame = expunge_sh-&gt;sh_frame;</div><div class='del'>-</div><div class='del'>-	active_src = (long) cookie;</div><div class='del'>-</div><div class='del'>-	if (op_ret == 0) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-			"removed %s on %s",</div><div class='del'>-			expunge_local-&gt;loc.path,</div><div class='del'>-			priv-&gt;children[active_src]-&gt;name);</div><div class='del'>-	} else {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-			"removing %s on %s failed (%s)",</div><div class='del'>-			expunge_local-&gt;loc.path,</div><div class='del'>-			priv-&gt;children[active_src]-&gt;name,</div><div class='del'>-			strerror (op_errno));</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-        valid = GF_SET_ATTR_ATIME | GF_SET_ATTR_MTIME;</div><div class='del'>-        afr_build_parent_loc (&amp;expunge_sh-&gt;parent_loc, &amp;expunge_local-&gt;loc);</div><div class='del'>-</div><div class='del'>-        STACK_WIND_COOKIE (expunge_frame, afr_sh_entry_expunge_parent_setattr_cbk,</div><div class='del'>-                           (void *) (long) active_src,</div><div class='del'>-                           priv-&gt;children[active_src],</div><div class='del'>-                           priv-&gt;children[active_src]-&gt;fops-&gt;setattr,</div><div class='del'>-                           &amp;expunge_sh-&gt;parent_loc,</div><div class='del'>-                           &amp;expunge_sh-&gt;parentbuf,</div><div class='del'>-                           valid);</div><div class='del'>-</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-static void</div><div class='del'>-init_trash_loc (loc_t *trash_loc, inode_table_t *table)</div><div class='del'>-{</div><div class='del'>-        trash_loc-&gt;path   = gf_strdup ("/" GF_REPLICATE_TRASH_DIR);</div><div class='del'>-        trash_loc-&gt;name   = GF_REPLICATE_TRASH_DIR;</div><div class='del'>-        trash_loc-&gt;parent = table-&gt;root;</div><div class='del'>-        trash_loc-&gt;inode  = inode_new (table);</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='del'>-char *</div><div class='del'>-make_trash_path (const char *path)</div><div class='add'>+static int</div><div class='add'>+afr_selfheal_detect_gfid_and_type_mismatch(xlator_t *this,</div><div class='add'>+                                           struct afr_reply *replies,</div><div class='add'>+                                           inode_t *inode, uuid_t pargfid,</div><div class='add'>+                                           char *bname, int src_idx,</div><div class='add'>+                                           unsigned char *locked_on, int *src)</div><div class='ctx'> {</div><div class='del'>-        char *c  = NULL;</div><div class='del'>-        char *tp = NULL;</div><div class='add'>+    int i = 0;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    void *gfid = NULL;</div><div class='add'>+    ia_type_t ia_type = IA_INVAL;</div><div class='ctx'> </div><div class='del'>-        tp = GF_CALLOC (strlen ("/" GF_REPLICATE_TRASH_DIR) + strlen (path) + 1, sizeof (char),</div><div class='del'>-                        gf_afr_mt_char);</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+    gfid = &amp;replies[src_idx].poststat.ia_gfid;</div><div class='add'>+    ia_type = replies[src_idx].poststat.ia_type;</div><div class='ctx'> </div><div class='del'>-        strcpy (tp, GF_REPLICATE_TRASH_DIR);</div><div class='del'>-        strcat (tp, path);</div><div class='add'>+    for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+        if (i == src_idx)</div><div class='add'>+            continue;</div><div class='ctx'> </div><div class='del'>-        c = strchr (tp, '/') + 1;</div><div class='del'>-        while (*c++)</div><div class='del'>-                if (*c == '/')</div><div class='del'>-                        *c = '-';</div><div class='add'>+        if (!replies[i].valid)</div><div class='add'>+            continue;</div><div class='ctx'> </div><div class='del'>-        return tp;</div><div class='del'>-}</div><div class='add'>+        if (replies[i].op_ret != 0)</div><div class='add'>+            continue;</div><div class='ctx'> </div><div class='add'>+        if (gf_uuid_is_null(replies[i].poststat.ia_gfid))</div><div class='add'>+            continue;</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-afr_sh_entry_expunge_rename (call_frame_t *expunge_frame, xlator_t *this,</div><div class='del'>-                             int active_src, inode_t *trash_inode)</div><div class='del'>-{</div><div class='del'>-	afr_private_t   *priv = NULL;</div><div class='del'>-	afr_local_t     *expunge_local = NULL;</div><div class='add'>+        if (replies[i].poststat.ia_type == IA_INVAL)</div><div class='add'>+            continue;</div><div class='ctx'> </div><div class='del'>-        loc_t rename_loc;</div><div class='del'>-</div><div class='del'>-	priv          = this-&gt;private;</div><div class='del'>-	expunge_local = expunge_frame-&gt;local;</div><div class='del'>-</div><div class='del'>-        rename_loc.inode = inode_ref (expunge_local-&gt;loc.inode);</div><div class='del'>-        rename_loc.path  = make_trash_path (expunge_local-&gt;loc.path);</div><div class='del'>-        rename_loc.name  = strrchr (rename_loc.path, '/') + 1;</div><div class='del'>-        rename_loc.parent = trash_inode;</div><div class='del'>-</div><div class='del'>-	gf_log (this-&gt;name, GF_LOG_TRACE,</div><div class='del'>-		"moving file/directory %s on %s to %s",</div><div class='del'>-		expunge_local-&gt;loc.path, priv-&gt;children[active_src]-&gt;name,</div><div class='del'>-                rename_loc.path);</div><div class='add'>+        if (ia_type == IA_INVAL || gf_uuid_is_null(gfid)) {</div><div class='add'>+            src_idx = i;</div><div class='add'>+            ia_type = replies[src_idx].poststat.ia_type;</div><div class='add'>+            gfid = &amp;replies[src_idx].poststat.ia_gfid;</div><div class='add'>+            continue;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-	STACK_WIND_COOKIE (expunge_frame, afr_sh_entry_expunge_rename_cbk,</div><div class='del'>-			   (void *) (long) active_src,</div><div class='del'>-			   priv-&gt;children[active_src],</div><div class='del'>-			   priv-&gt;children[active_src]-&gt;fops-&gt;rename,</div><div class='del'>-			   &amp;expunge_local-&gt;loc, &amp;rename_loc);</div><div class='add'>+        if (gf_uuid_compare(gfid, replies[i].poststat.ia_gfid) &amp;&amp;</div><div class='add'>+            (ia_type == replies[i].poststat.ia_type)) {</div><div class='add'>+            ret = afr_gfid_split_brain_source(this, replies, inode, pargfid,</div><div class='add'>+                                              bname, src_idx, i, locked_on, src,</div><div class='add'>+                                              NULL);</div><div class='add'>+            if (ret)</div><div class='add'>+                gf_msg(this-&gt;name, GF_LOG_ERROR, 0, AFR_MSG_SPLIT_BRAIN,</div><div class='add'>+                       "Skipping conservative merge on the "</div><div class='add'>+                       "file.");</div><div class='add'>+            return ret;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-        loc_wipe (&amp;rename_loc);</div><div class='add'>+        if (ia_type != replies[i].poststat.ia_type) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, 0, AFR_MSG_SPLIT_BRAIN,</div><div class='add'>+                   "Type mismatch detected "</div><div class='add'>+                   "for &lt;gfid:%s&gt;/%s&gt;, %s on %s and %s on %s. "</div><div class='add'>+                   "Skipping conservative merge on the file.",</div><div class='add'>+                   uuid_utoa(pargfid), bname,</div><div class='add'>+                   gf_inode_type_to_str(replies[i].poststat.ia_type),</div><div class='add'>+                   priv-&gt;children[i]-&gt;name,</div><div class='add'>+                   gf_inode_type_to_str(replies[src_idx].poststat.ia_type),</div><div class='add'>+                   priv-&gt;children[src_idx]-&gt;name);</div><div class='add'>+            gf_event(EVENT_AFR_SPLIT_BRAIN,</div><div class='add'>+                     "client-pid=%d;"</div><div class='add'>+                     "subvol=%s;type=file;"</div><div class='add'>+                     "file=&lt;gfid:%s&gt;/%s&gt;;count=2;child-%d=%s;type-"</div><div class='add'>+                     "%d=%s;child-%d=%s;type-%d=%s",</div><div class='add'>+                     this-&gt;ctx-&gt;cmd_args.client_pid, this-&gt;name,</div><div class='add'>+                     uuid_utoa(pargfid), bname, i, priv-&gt;children[i]-&gt;name, i,</div><div class='add'>+                     gf_inode_type_to_str(replies[i].poststat.ia_type), src_idx,</div><div class='add'>+                     priv-&gt;children[src_idx]-&gt;name, src_idx,</div><div class='add'>+                     gf_inode_type_to_str(replies[src_idx].poststat.ia_type));</div><div class='add'>+            return -1;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	return 0;</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-afr_sh_entry_expunge_mkdir_cbk (call_frame_t *expunge_frame, void *cookie, xlator_t *this,</div><div class='del'>-                                int32_t op_ret, int32_t op_errno, inode_t *inode,</div><div class='del'>-                                struct iatt *buf, struct iatt *preparent,</div><div class='del'>-                                struct iatt *postparent)</div><div class='add'>+static int</div><div class='add'>+__afr_selfheal_merge_dirent(call_frame_t *frame, xlator_t *this, fd_t *fd,</div><div class='add'>+                            char *name, inode_t *inode, unsigned char *sources,</div><div class='add'>+                            unsigned char *healed_sinks,</div><div class='add'>+                            unsigned char *locked_on, struct afr_reply *replies)</div><div class='ctx'> {</div><div class='del'>-        afr_private_t *priv            = NULL;</div><div class='del'>-        afr_local_t     *expunge_local = NULL;</div><div class='del'>-	afr_self_heal_t *expunge_sh    = NULL;</div><div class='del'>-        call_frame_t    *frame         = NULL;</div><div class='del'>-</div><div class='del'>-        int active_src = (long) cookie;</div><div class='del'>-</div><div class='del'>-        inode_t *trash_inode = NULL;</div><div class='del'>-</div><div class='del'>-        priv          = this-&gt;private;</div><div class='del'>-        expunge_local = expunge_frame-&gt;local;</div><div class='del'>-	expunge_sh    = &amp;expunge_local-&gt;self_heal;</div><div class='del'>-	frame         = expunge_sh-&gt;sh_frame;</div><div class='del'>-</div><div class='del'>-        if (op_ret != 0) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-                        "mkdir of /" GF_REPLICATE_TRASH_DIR " failed on %s",</div><div class='del'>-                        priv-&gt;children[active_src]-&gt;name);</div><div class='del'>-</div><div class='del'>-                goto out;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    int i = 0;</div><div class='add'>+    int source = -1;</div><div class='add'>+    int src = -1;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+        if (replies[i].valid &amp;&amp; replies[i].op_ret == 0) {</div><div class='add'>+            source = i;</div><div class='add'>+            break;</div><div class='ctx'>         }</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        /* mkdir successful */</div><div class='del'>-</div><div class='del'>-        trash_inode = inode_link (inode, expunge_local-&gt;loc.inode-&gt;table-&gt;root,</div><div class='del'>-                                  GF_REPLICATE_TRASH_DIR, buf);</div><div class='del'>-</div><div class='del'>-        afr_sh_entry_expunge_rename (expunge_frame, this, active_src,</div><div class='del'>-                                     trash_inode);</div><div class='add'>+    if (source == -1) {</div><div class='add'>+        /* entry got deleted in the mean time? */</div><div class='ctx'>         return 0;</div><div class='del'>-out:</div><div class='del'>-        AFR_STACK_DESTROY (expunge_frame);</div><div class='del'>-        afr_sh_entry_expunge_entry_done (frame, this, active_src);</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-afr_sh_entry_expunge_lookup_trash_cbk (call_frame_t *expunge_frame, void *cookie,</div><div class='del'>-                                       xlator_t *this,</div><div class='del'>-                                       int32_t op_ret, int32_t op_errno,</div><div class='del'>-                                       inode_t *inode, struct iatt *buf,</div><div class='del'>-                                       dict_t *xattr, struct iatt *postparent)</div><div class='del'>-{</div><div class='del'>-        afr_private_t *priv            = NULL;</div><div class='del'>-        afr_local_t     *expunge_local = NULL;</div><div class='del'>-	afr_self_heal_t *expunge_sh    = NULL;</div><div class='del'>-        call_frame_t    *frame         = NULL;</div><div class='del'>-        dict_t          *dict          = NULL;</div><div class='del'>-</div><div class='del'>-        int active_src = (long) cookie;</div><div class='del'>-        int ret = 0;</div><div class='del'>-</div><div class='del'>-        inode_t *trash_inode;</div><div class='del'>-        loc_t    trash_loc;</div><div class='del'>-</div><div class='del'>-        priv          = this-&gt;private;</div><div class='del'>-        expunge_local = expunge_frame-&gt;local;</div><div class='del'>-	expunge_sh    = &amp;expunge_local-&gt;self_heal;</div><div class='del'>-	frame         = expunge_sh-&gt;sh_frame;</div><div class='del'>-</div><div class='del'>-        if ((op_ret != 0) &amp;&amp; (op_errno == ENOENT)) {</div><div class='del'>-                init_trash_loc (&amp;trash_loc, expunge_local-&gt;loc.inode-&gt;table);</div><div class='del'>-</div><div class='del'>-                dict = dict_new ();</div><div class='del'>-                if (!dict) {</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-                                "Out of memory");</div><div class='del'>-                        goto out;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                ret = afr_set_dict_gfid (dict, buf-&gt;ia_gfid);</div><div class='del'>-                if (ret)</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_DEBUG, "gfid set failed");</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_TRACE,</div><div class='del'>-                        "creating directory " GF_REPLICATE_TRASH_DIR " on subvolume %s",</div><div class='del'>-                        priv-&gt;children[active_src]-&gt;name);</div><div class='del'>-</div><div class='del'>-                STACK_WIND_COOKIE (expunge_frame, afr_sh_entry_expunge_mkdir_cbk,</div><div class='del'>-                                   (void *) (long) active_src,</div><div class='del'>-                                   priv-&gt;children[active_src],</div><div class='del'>-                                   priv-&gt;children[active_src]-&gt;fops-&gt;mkdir,</div><div class='del'>-                                   &amp;trash_loc, 0777, dict);</div><div class='del'>-</div><div class='del'>-                loc_wipe (&amp;trash_loc);</div><div class='del'>-                if (dict)</div><div class='del'>-                        dict_unref (dict);</div><div class='del'>-                return 0;</div><div class='add'>+    /* Set all the sources as 1, otheriwse newentry_mark won't be set */</div><div class='add'>+    for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+        if (replies[i].valid &amp;&amp; replies[i].op_ret == 0) {</div><div class='add'>+            sources[i] = 1;</div><div class='ctx'>         }</div><div class='del'>-</div><div class='del'>-        if (op_ret != 0) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-                        "lookup of /" GF_REPLICATE_TRASH_DIR " failed on %s",</div><div class='del'>-                        priv-&gt;children[active_src]-&gt;name);</div><div class='del'>-                goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = afr_lookup_and_heal_gfid(this, fd-&gt;inode, name, inode, replies,</div><div class='add'>+                                   source, sources,</div><div class='add'>+                                   &amp;replies[source].poststat.ia_gfid, NULL);</div><div class='add'>+    if (ret)</div><div class='add'>+        return ret;</div><div class='add'>+</div><div class='add'>+    /* In case of type mismatch / unable to resolve gfid mismatch on the</div><div class='add'>+     * entry, return -1.*/</div><div class='add'>+    ret = afr_selfheal_detect_gfid_and_type_mismatch(</div><div class='add'>+        this, replies, inode, fd-&gt;inode-&gt;gfid, name, source, locked_on, &amp;src);</div><div class='add'>+</div><div class='add'>+    if (ret &lt; 0)</div><div class='add'>+        return ret;</div><div class='add'>+    if (src != -1) {</div><div class='add'>+        source = src;</div><div class='add'>+        for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+            if (i != src &amp;&amp; replies[i].valid &amp;&amp;</div><div class='add'>+                gf_uuid_compare(replies[src].poststat.ia_gfid,</div><div class='add'>+                                replies[i].poststat.ia_gfid)) {</div><div class='add'>+                sources[i] = 0;</div><div class='add'>+            }</div><div class='ctx'>         }</div><div class='del'>-</div><div class='del'>-        /* lookup successful */</div><div class='del'>-</div><div class='del'>-        trash_inode = inode_link (inode, expunge_local-&gt;loc.inode-&gt;table-&gt;root,</div><div class='del'>-                                  GF_REPLICATE_TRASH_DIR, buf);</div><div class='del'>-</div><div class='del'>-        afr_sh_entry_expunge_rename (expunge_frame, this, active_src,</div><div class='del'>-                                     trash_inode);</div><div class='del'>-        return 0;</div><div class='del'>-out:</div><div class='del'>-        AFR_STACK_DESTROY (expunge_frame);</div><div class='del'>-        afr_sh_entry_expunge_entry_done (frame, this, active_src);</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-afr_sh_entry_expunge_lookup_trash (call_frame_t *expunge_frame, xlator_t *this,</div><div class='del'>-                                   int active_src)</div><div class='del'>-{</div><div class='del'>-	afr_private_t   *priv = NULL;</div><div class='del'>-	afr_local_t     *expunge_local = NULL;</div><div class='del'>-</div><div class='del'>-        inode_t *root  = NULL;</div><div class='del'>-        inode_t *trash = NULL;</div><div class='del'>-        loc_t trash_loc;</div><div class='del'>-</div><div class='del'>-	priv          = this-&gt;private;</div><div class='del'>-	expunge_local = expunge_frame-&gt;local;</div><div class='del'>-</div><div class='del'>-        root = expunge_local-&gt;loc.inode-&gt;table-&gt;root;</div><div class='del'>-</div><div class='del'>-        trash = inode_grep (root-&gt;table, root, GF_REPLICATE_TRASH_DIR);</div><div class='del'>-</div><div class='del'>-        if (trash) {</div><div class='del'>-                /* inode is in cache, so no need to mkdir */</div><div class='del'>-</div><div class='del'>-                afr_sh_entry_expunge_rename (expunge_frame, this, active_src,</div><div class='del'>-                                             trash);</div><div class='del'>-                return 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+        if (i == source || !healed_sinks[i])</div><div class='add'>+            continue;</div><div class='add'>+</div><div class='add'>+        if (src != -1) {</div><div class='add'>+            if (!gf_uuid_compare(replies[src].poststat.ia_gfid,</div><div class='add'>+                                 replies[i].poststat.ia_gfid))</div><div class='add'>+                continue;</div><div class='add'>+        } else if (replies[i].op_errno != ENOENT) {</div><div class='add'>+            continue;</div><div class='ctx'>         }</div><div class='ctx'> </div><div class='del'>-        /* Not in cache, so look it up */</div><div class='del'>-</div><div class='del'>-        init_trash_loc (&amp;trash_loc, expunge_local-&gt;loc.inode-&gt;table);</div><div class='del'>-</div><div class='del'>-	gf_log (this-&gt;name, GF_LOG_TRACE,</div><div class='del'>-		"looking up /" GF_REPLICATE_TRASH_DIR " on %s",</div><div class='del'>-                priv-&gt;children[active_src]-&gt;name);</div><div class='del'>-</div><div class='del'>-	STACK_WIND_COOKIE (expunge_frame, afr_sh_entry_expunge_lookup_trash_cbk,</div><div class='del'>-			   (void *) (long) active_src,</div><div class='del'>-			   priv-&gt;children[active_src],</div><div class='del'>-			   priv-&gt;children[active_src]-&gt;fops-&gt;lookup,</div><div class='del'>-			   &amp;trash_loc, NULL);</div><div class='del'>-</div><div class='del'>-        loc_wipe (&amp;trash_loc);</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-afr_sh_entry_expunge_remove (call_frame_t *expunge_frame, xlator_t *this,</div><div class='del'>-			     int active_src, struct iatt *buf)</div><div class='del'>-{</div><div class='del'>-	afr_private_t   *priv = NULL;</div><div class='del'>-	afr_local_t     *expunge_local = NULL;</div><div class='del'>-	afr_self_heal_t *expunge_sh = NULL;</div><div class='del'>-	int              source = 0;</div><div class='del'>-	call_frame_t    *frame = NULL;</div><div class='del'>-	int              type = 0;</div><div class='del'>-</div><div class='del'>-	priv = this-&gt;private;</div><div class='del'>-	expunge_local = expunge_frame-&gt;local;</div><div class='del'>-	expunge_sh = &amp;expunge_local-&gt;self_heal;</div><div class='del'>-	frame = expunge_sh-&gt;sh_frame;</div><div class='del'>-	source = expunge_sh-&gt;source;</div><div class='del'>-</div><div class='del'>-	type = buf-&gt;ia_type;</div><div class='del'>-</div><div class='del'>-	switch (type) {</div><div class='del'>-	case IA_IFSOCK:</div><div class='del'>-	case IA_IFREG:</div><div class='del'>-	case IA_IFBLK:</div><div class='del'>-	case IA_IFCHR:</div><div class='del'>-	case IA_IFIFO:</div><div class='del'>-	case IA_IFLNK:</div><div class='del'>-	case IA_IFDIR:</div><div class='del'>-		afr_sh_entry_expunge_lookup_trash (expunge_frame, this, active_src);</div><div class='del'>-		break;</div><div class='del'>-	default:</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-			"%s has unknown file type on %s: 0%o",</div><div class='del'>-			expunge_local-&gt;loc.path,</div><div class='del'>-			priv-&gt;children[source]-&gt;name, type);</div><div class='del'>-		goto out;</div><div class='del'>-		break;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>-out:</div><div class='del'>-	AFR_STACK_DESTROY (expunge_frame);</div><div class='del'>-	afr_sh_entry_expunge_entry_done (frame, this, active_src);</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-afr_sh_entry_expunge_lookup_cbk (call_frame_t *expunge_frame, void *cookie,</div><div class='del'>-				xlator_t *this,</div><div class='del'>-				int32_t op_ret,	int32_t op_errno,</div><div class='del'>-                                inode_t *inode, struct iatt *buf, dict_t *x,</div><div class='del'>-                                struct iatt *postparent)</div><div class='del'>-{</div><div class='del'>-	afr_private_t   *priv = NULL;</div><div class='del'>-	afr_local_t     *expunge_local = NULL;</div><div class='del'>-	afr_self_heal_t *expunge_sh = NULL;</div><div class='del'>-	call_frame_t    *frame = NULL;</div><div class='del'>-	int              active_src = 0;</div><div class='del'>-</div><div class='del'>-	priv = this-&gt;private;</div><div class='del'>-	expunge_local = expunge_frame-&gt;local;</div><div class='del'>-	expunge_sh = &amp;expunge_local-&gt;self_heal;</div><div class='del'>-	frame = expunge_sh-&gt;sh_frame;</div><div class='del'>-	active_src = (long) cookie;</div><div class='del'>-</div><div class='del'>-	if (op_ret == -1) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_TRACE,</div><div class='del'>-			"lookup of %s on %s failed (%s)",</div><div class='del'>-			expunge_local-&gt;loc.path,</div><div class='del'>-			priv-&gt;children[active_src]-&gt;name,</div><div class='del'>-			strerror (op_errno));</div><div class='del'>-		goto out;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	afr_sh_entry_expunge_remove (expunge_frame, this, active_src, buf);</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>-out:</div><div class='del'>-	AFR_STACK_DESTROY (expunge_frame);</div><div class='del'>-	afr_sh_entry_expunge_entry_done (frame, this, active_src);</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-afr_sh_entry_expunge_purge (call_frame_t *expunge_frame, xlator_t *this,</div><div class='del'>-			    int active_src)</div><div class='del'>-{</div><div class='del'>-	afr_private_t   *priv = NULL;</div><div class='del'>-	afr_local_t     *expunge_local = NULL;</div><div class='del'>-</div><div class='del'>-	priv = this-&gt;private;</div><div class='del'>-	expunge_local = expunge_frame-&gt;local;</div><div class='del'>-</div><div class='del'>-	gf_log (this-&gt;name, GF_LOG_TRACE,</div><div class='del'>-		"looking up %s on %s",</div><div class='del'>-		expunge_local-&gt;loc.path, priv-&gt;children[active_src]-&gt;name);</div><div class='del'>-	</div><div class='del'>-	STACK_WIND_COOKIE (expunge_frame, afr_sh_entry_expunge_lookup_cbk,</div><div class='del'>-			   (void *) (long) active_src,</div><div class='del'>-			   priv-&gt;children[active_src],</div><div class='del'>-			   priv-&gt;children[active_src]-&gt;fops-&gt;lookup,</div><div class='del'>-			   &amp;expunge_local-&gt;loc, 0);</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='add'>+        ret |= afr_selfheal_recreate_entry(frame, i, source, sources, fd-&gt;inode,</div><div class='add'>+                                           name, inode, replies);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-afr_sh_entry_expunge_entry_cbk (call_frame_t *expunge_frame, void *cookie,</div><div class='del'>-				xlator_t *this,</div><div class='del'>-				int32_t op_ret,	int32_t op_errno,</div><div class='del'>-                                inode_t *inode, struct iatt *buf, dict_t *x,</div><div class='del'>-                                struct iatt *postparent)</div><div class='del'>-{</div><div class='del'>-	afr_private_t   *priv = NULL;</div><div class='del'>-	afr_local_t     *expunge_local = NULL;</div><div class='del'>-	afr_self_heal_t *expunge_sh = NULL;</div><div class='del'>-	int              source = 0;</div><div class='del'>-	call_frame_t    *frame = NULL;</div><div class='del'>-	int              active_src = 0;</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-	priv = this-&gt;private;</div><div class='del'>-	expunge_local = expunge_frame-&gt;local;</div><div class='del'>-	expunge_sh = &amp;expunge_local-&gt;self_heal;</div><div class='del'>-	frame = expunge_sh-&gt;sh_frame;</div><div class='del'>-	active_src = expunge_sh-&gt;active_source;</div><div class='del'>-	source = (long) cookie;</div><div class='del'>-</div><div class='del'>-	if (op_ret == -1 &amp;&amp; op_errno == ENOENT &amp;&amp; postparent) {</div><div class='del'>-</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_TRACE,</div><div class='del'>-			"missing entry %s on %s",</div><div class='del'>-			expunge_local-&gt;loc.path,</div><div class='del'>-			priv-&gt;children[source]-&gt;name);</div><div class='del'>-</div><div class='del'>-                expunge_sh-&gt;parentbuf = *postparent;</div><div class='del'>-</div><div class='del'>-		afr_sh_entry_expunge_purge (expunge_frame, this, active_src);</div><div class='del'>-</div><div class='del'>-		return 0;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	if (op_ret == 0) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_TRACE,</div><div class='del'>-			"%s exists under %s",</div><div class='del'>-			expunge_local-&gt;loc.path,</div><div class='del'>-			priv-&gt;children[source]-&gt;name);</div><div class='del'>-	} else {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_TRACE,</div><div class='del'>-			"looking up %s under %s failed (%s)",</div><div class='del'>-			expunge_local-&gt;loc.path,</div><div class='del'>-			priv-&gt;children[source]-&gt;name,</div><div class='del'>-			strerror (op_errno));</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	AFR_STACK_DESTROY (expunge_frame);</div><div class='del'>-	afr_sh_entry_expunge_entry_done (frame, this, active_src);</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-afr_sh_entry_expunge_entry (call_frame_t *frame, xlator_t *this,</div><div class='del'>-			    char *name)</div><div class='del'>-{</div><div class='del'>-	afr_private_t   *priv = NULL;</div><div class='del'>-	afr_local_t     *local  = NULL;</div><div class='del'>-	afr_self_heal_t *sh  = NULL;</div><div class='del'>-	int              ret = -1;</div><div class='del'>-	call_frame_t    *expunge_frame = NULL;</div><div class='del'>-	afr_local_t     *expunge_local = NULL;</div><div class='del'>-	afr_self_heal_t *expunge_sh = NULL;</div><div class='del'>-	int              active_src = 0;</div><div class='del'>-	int              source = 0;</div><div class='del'>-	int              op_errno = 0;</div><div class='del'>-</div><div class='del'>-	priv = this-&gt;private;</div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-	sh = &amp;local-&gt;self_heal;</div><div class='del'>-</div><div class='del'>-	active_src = sh-&gt;active_source;</div><div class='del'>-	source = sh-&gt;source;</div><div class='del'>-</div><div class='del'>-	if ((strcmp (name, ".") == 0)</div><div class='del'>-	    || (strcmp (name, "..") == 0)</div><div class='del'>-            || ((strcmp (local-&gt;loc.path, "/") == 0)</div><div class='del'>-                &amp;&amp; (strcmp (name, GF_REPLICATE_TRASH_DIR) == 0))) {</div><div class='del'>-</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_TRACE,</div><div class='del'>-			"skipping inspection of %s under %s",</div><div class='del'>-			name, local-&gt;loc.path);</div><div class='del'>-		goto out;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	gf_log (this-&gt;name, GF_LOG_TRACE,</div><div class='del'>-		"inspecting existance of %s under %s",</div><div class='del'>-		name, local-&gt;loc.path);</div><div class='del'>-</div><div class='del'>-	expunge_frame = copy_frame (frame);</div><div class='del'>-	if (!expunge_frame) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-			"Out of memory.");</div><div class='del'>-		goto out;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	ALLOC_OR_GOTO (expunge_local, afr_local_t, out);</div><div class='del'>-</div><div class='del'>-	expunge_frame-&gt;local = expunge_local;</div><div class='del'>-	expunge_sh = &amp;expunge_local-&gt;self_heal;</div><div class='del'>-	expunge_sh-&gt;sh_frame = frame;</div><div class='del'>-	expunge_sh-&gt;active_source = active_src;</div><div class='del'>-</div><div class='del'>-	ret = build_child_loc (this, &amp;expunge_local-&gt;loc, &amp;local-&gt;loc, name);</div><div class='del'>-	if (ret != 0) {</div><div class='del'>-		goto out;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	gf_log (this-&gt;name, GF_LOG_TRACE,</div><div class='del'>-		"looking up %s on %s", expunge_local-&gt;loc.path,</div><div class='del'>-		priv-&gt;children[source]-&gt;name);</div><div class='del'>-</div><div class='del'>-	STACK_WIND_COOKIE (expunge_frame,</div><div class='del'>-			   afr_sh_entry_expunge_entry_cbk,</div><div class='del'>-			   (void *) (long) source,</div><div class='del'>-			   priv-&gt;children[source],</div><div class='del'>-			   priv-&gt;children[source]-&gt;fops-&gt;lookup,</div><div class='del'>-			   &amp;expunge_local-&gt;loc, 0);</div><div class='del'>-</div><div class='del'>-	ret = 0;</div><div class='del'>-out:</div><div class='del'>-	if (ret == -1)</div><div class='del'>-		afr_sh_entry_expunge_entry_done (frame, this, active_src);</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-afr_sh_entry_expunge_readdir_cbk (call_frame_t *frame, void *cookie,</div><div class='del'>-				  xlator_t *this,</div><div class='del'>-				  int32_t op_ret, int32_t op_errno,</div><div class='del'>-				  gf_dirent_t *entries)</div><div class='add'>+static int</div><div class='add'>+__afr_selfheal_entry_dirent(call_frame_t *frame, xlator_t *this, fd_t *fd,</div><div class='add'>+                            char *name, inode_t *inode, int source,</div><div class='add'>+                            unsigned char *sources, unsigned char *healed_sinks,</div><div class='add'>+                            unsigned char *locked_on, struct afr_reply *replies)</div><div class='ctx'> {</div><div class='del'>-	afr_private_t   *priv = NULL;</div><div class='del'>-	afr_local_t     *local  = NULL;</div><div class='del'>-	afr_self_heal_t *sh  = NULL;</div><div class='del'>-	gf_dirent_t     *entry = NULL;</div><div class='del'>-	off_t            last_offset = 0;</div><div class='del'>-	int              active_src = 0;</div><div class='del'>-	int              entry_count = 0;</div><div class='del'>-</div><div class='del'>-	priv = this-&gt;private;</div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-	sh = &amp;local-&gt;self_heal;</div><div class='del'>-</div><div class='del'>-	active_src = sh-&gt;active_source;</div><div class='del'>-</div><div class='del'>-	if (op_ret &lt;= 0) {</div><div class='del'>-		if (op_ret &lt; 0) {</div><div class='del'>-			gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-				"readdir of %s on subvolume %s failed (%s)",</div><div class='del'>-				local-&gt;loc.path,</div><div class='del'>-				priv-&gt;children[active_src]-&gt;name,</div><div class='del'>-				strerror (op_errno));</div><div class='del'>-		} else {</div><div class='del'>-			gf_log (this-&gt;name, GF_LOG_TRACE,</div><div class='del'>-				"readdir of %s on subvolume %s complete",</div><div class='del'>-				local-&gt;loc.path,</div><div class='del'>-				priv-&gt;children[active_src]-&gt;name);</div><div class='del'>-		}</div><div class='del'>-</div><div class='del'>-		afr_sh_entry_expunge_all (frame, this);</div><div class='del'>-		return 0;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	list_for_each_entry (entry, &amp;entries-&gt;list, list) {</div><div class='del'>-		last_offset = entry-&gt;d_off;</div><div class='del'>-                entry_count++;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	gf_log (this-&gt;name, GF_LOG_TRACE,</div><div class='del'>-		"readdir'ed %d entries from %s",</div><div class='del'>-		entry_count, priv-&gt;children[active_src]-&gt;name);</div><div class='del'>-</div><div class='del'>-	sh-&gt;offset = last_offset;</div><div class='del'>-	local-&gt;call_count = entry_count;</div><div class='del'>-</div><div class='del'>-	list_for_each_entry (entry, &amp;entries-&gt;list, list) {</div><div class='del'>-                afr_sh_entry_expunge_entry (frame, this, entry-&gt;d_name);</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    if (source &lt; 0)</div><div class='add'>+        ret = __afr_selfheal_merge_dirent(frame, this, fd, name, inode, sources,</div><div class='add'>+                                          healed_sinks, locked_on, replies);</div><div class='add'>+    else</div><div class='add'>+        ret = __afr_selfheal_heal_dirent(frame, this, fd, name, inode, source,</div><div class='add'>+                                         sources, healed_sinks, locked_on,</div><div class='add'>+                                         replies);</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-afr_sh_entry_expunge_subvol (call_frame_t *frame, xlator_t *this,</div><div class='del'>-			     int active_src)</div><div class='add'>+static gf_boolean_t</div><div class='add'>+is_full_heal_marker_present(xlator_t *this, dict_t *xdata, int idx)</div><div class='ctx'> {</div><div class='del'>-	afr_private_t   *priv = NULL;</div><div class='del'>-	afr_local_t     *local  = NULL;</div><div class='del'>-	afr_self_heal_t *sh  = NULL;</div><div class='del'>-</div><div class='del'>-	priv = this-&gt;private;</div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-	sh = &amp;local-&gt;self_heal;</div><div class='del'>-</div><div class='del'>-	STACK_WIND (frame, afr_sh_entry_expunge_readdir_cbk,</div><div class='del'>-		    priv-&gt;children[active_src],</div><div class='del'>-		    priv-&gt;children[active_src]-&gt;fops-&gt;readdir,</div><div class='del'>-		    sh-&gt;healing_fd, sh-&gt;block_size, sh-&gt;offset);</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='add'>+    int i = 0;</div><div class='add'>+    int pending[3] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    void *pending_raw = NULL;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    if (!xdata)</div><div class='add'>+        return _gf_false;</div><div class='add'>+</div><div class='add'>+    /* Iterate over each of the priv-&gt;pending_keys[] elements and then</div><div class='add'>+     * see if any of them have data segment non-zero. If they do, return</div><div class='add'>+     * true. Else return false.</div><div class='add'>+     */</div><div class='add'>+    for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+        if (dict_get_ptr(xdata, priv-&gt;pending_key[i], &amp;pending_raw))</div><div class='add'>+            continue;</div><div class='add'>+</div><div class='add'>+        if (!pending_raw)</div><div class='add'>+            continue;</div><div class='add'>+</div><div class='add'>+        memcpy(pending, pending_raw, sizeof(pending));</div><div class='add'>+        if (ntoh32(pending[idx]))</div><div class='add'>+            return _gf_true;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return _gf_false;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-afr_sh_entry_expunge_all (call_frame_t *frame, xlator_t *this)</div><div class='add'>+static gf_boolean_t</div><div class='add'>+afr_need_full_heal(xlator_t *this, struct afr_reply *replies, int source,</div><div class='add'>+                   unsigned char *healed_sinks, afr_transaction_type type)</div><div class='ctx'> {</div><div class='del'>-	afr_private_t   *priv = NULL;</div><div class='del'>-	afr_local_t     *local  = NULL;</div><div class='del'>-	afr_self_heal_t *sh  = NULL;</div><div class='del'>-	int              active_src = -1;</div><div class='add'>+    int i = 0;</div><div class='add'>+    int idx = 0;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='ctx'> </div><div class='del'>-	priv = this-&gt;private;</div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-	sh = &amp;local-&gt;self_heal;</div><div class='add'>+    priv = this-&gt;private;</div><div class='ctx'> </div><div class='del'>-	sh-&gt;offset = 0;</div><div class='add'>+    if (!priv-&gt;esh_granular)</div><div class='add'>+        return _gf_true;</div><div class='ctx'> </div><div class='del'>-	if (sh-&gt;source == -1) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_TRACE,</div><div class='del'>-			"no active sources for %s to expunge entries",</div><div class='del'>-			local-&gt;loc.path);</div><div class='del'>-		goto out;</div><div class='del'>-	}</div><div class='add'>+    if (type != AFR_ENTRY_TRANSACTION)</div><div class='add'>+        return _gf_true;</div><div class='ctx'> </div><div class='del'>-	active_src = next_active_sink (frame, this, sh-&gt;active_source);</div><div class='del'>-	sh-&gt;active_source = active_src;</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+    idx = afr_index_for_transaction_type(AFR_DATA_TRANSACTION);</div><div class='ctx'> </div><div class='del'>-	if (sh-&gt;op_failed) {</div><div class='del'>-		goto out;</div><div class='del'>-	}</div><div class='add'>+    /* If there is a clear source, check whether the full-heal-indicator</div><div class='add'>+     * is present in its xdata. Otherwise, we need to examine all the</div><div class='add'>+     * participating bricks and then figure if *even* one of them has a</div><div class='add'>+     * full-heal-indicator.</div><div class='add'>+     */</div><div class='ctx'> </div><div class='del'>-	if (active_src == -1) {</div><div class='del'>-		/* completed creating missing files on all subvolumes */</div><div class='del'>-		goto out;</div><div class='del'>-	}</div><div class='add'>+    if (source != -1) {</div><div class='add'>+        if (is_full_heal_marker_present(this, replies[source].xdata, idx))</div><div class='add'>+            return _gf_true;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	gf_log (this-&gt;name, GF_LOG_TRACE,</div><div class='del'>-		"expunging entries of %s on %s to other sinks",</div><div class='del'>-		local-&gt;loc.path, priv-&gt;children[active_src]-&gt;name);</div><div class='add'>+    /* else ..*/</div><div class='ctx'> </div><div class='del'>-	afr_sh_entry_expunge_subvol (frame, this, active_src);</div><div class='add'>+    for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+        if (!healed_sinks[i])</div><div class='add'>+            continue;</div><div class='ctx'> </div><div class='del'>-	return 0;</div><div class='del'>-out:</div><div class='del'>-	afr_sh_entry_erase_pending (frame, this);</div><div class='del'>-	return 0;</div><div class='add'>+        if (is_full_heal_marker_present(this, replies[i].xdata, idx))</div><div class='add'>+            return _gf_true;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='add'>+    return _gf_false;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-afr_sh_entry_impunge_all (call_frame_t *frame, xlator_t *this);</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-afr_sh_entry_impunge_subvol (call_frame_t *frame, xlator_t *this,</div><div class='del'>-			     int active_src);</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-afr_sh_entry_impunge_entry_done (call_frame_t *frame, xlator_t *this,</div><div class='del'>-				 int active_src)</div><div class='add'>+static int</div><div class='add'>+__afr_selfheal_entry_finalize_source(xlator_t *this, unsigned char *sources,</div><div class='add'>+                                     unsigned char *healed_sinks,</div><div class='add'>+                                     unsigned char *locked_on,</div><div class='add'>+                                     struct afr_reply *replies,</div><div class='add'>+                                     uint64_t *witness)</div><div class='ctx'> {</div><div class='del'>-	int              call_count = 0;</div><div class='del'>-</div><div class='del'>-	call_count = afr_frame_return (frame);</div><div class='del'>-</div><div class='del'>-	if (call_count == 0)</div><div class='del'>-		afr_sh_entry_impunge_subvol (frame, this, active_src);</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    int source = -1;</div><div class='add'>+    int sources_count = 0;</div><div class='add'>+    int i = 0;</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    sources_count = AFR_COUNT(sources, priv-&gt;child_count);</div><div class='add'>+</div><div class='add'>+    if ((AFR_CMP(locked_on, healed_sinks, priv-&gt;child_count) == 0) ||</div><div class='add'>+        !sources_count || afr_does_witness_exist(this, witness)) {</div><div class='add'>+        memset(sources, 0, sizeof(*sources) * priv-&gt;child_count);</div><div class='add'>+        afr_mark_active_sinks(this, sources, locked_on, healed_sinks);</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    source = afr_choose_source_by_policy(priv, sources, AFR_ENTRY_TRANSACTION);</div><div class='add'>+</div><div class='add'>+    /*If the selected source does not blame any other brick, then mark</div><div class='add'>+     * everything as sink to trigger conservative merge.</div><div class='add'>+     */</div><div class='add'>+    if (source != -1 &amp;&amp; !AFR_COUNT(healed_sinks, priv-&gt;child_count)) {</div><div class='add'>+        for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+            if (locked_on[i]) {</div><div class='add'>+                sources[i] = 0;</div><div class='add'>+                healed_sinks[i] = 1;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	return 0;</div><div class='add'>+    return source;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-afr_sh_entry_impunge_setattr_cbk (call_frame_t *impunge_frame, void *cookie,</div><div class='del'>-				  xlator_t *this,</div><div class='del'>-                                  int32_t op_ret, int32_t op_errno,</div><div class='del'>-                                  struct iatt *preop, struct iatt *postop)</div><div class='add'>+__afr_selfheal_entry_prepare(call_frame_t *frame, xlator_t *this,</div><div class='add'>+                             inode_t *inode, unsigned char *locked_on,</div><div class='add'>+                             unsigned char *sources, unsigned char *sinks,</div><div class='add'>+                             unsigned char *healed_sinks,</div><div class='add'>+                             struct afr_reply *replies, int *source_p,</div><div class='add'>+                             unsigned char *pflag)</div><div class='ctx'> {</div><div class='del'>-	int              call_count = 0;</div><div class='del'>-	afr_private_t   *priv = NULL;</div><div class='del'>-	afr_local_t     *impunge_local = NULL;</div><div class='del'>-	afr_local_t     *local = NULL;</div><div class='del'>-	afr_self_heal_t *sh = NULL;</div><div class='del'>-	afr_self_heal_t *impunge_sh = NULL;</div><div class='del'>-	call_frame_t    *frame = NULL;</div><div class='del'>-	int              active_src = 0;</div><div class='del'>-	int              child_index = 0;</div><div class='del'>-</div><div class='del'>-	priv = this-&gt;private;</div><div class='del'>-	impunge_local = impunge_frame-&gt;local;</div><div class='del'>-	impunge_sh = &amp;impunge_local-&gt;self_heal;</div><div class='del'>-	frame = impunge_sh-&gt;sh_frame;</div><div class='del'>-        local = frame-&gt;local;</div><div class='del'>-        sh    = &amp;local-&gt;self_heal;</div><div class='del'>-        active_src = sh-&gt;active_source;</div><div class='del'>-	child_index = (long) cookie;</div><div class='del'>-</div><div class='del'>-	if (op_ret == 0) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_TRACE,</div><div class='del'>-			"setattr done for %s on %s",</div><div class='del'>-			impunge_local-&gt;loc.path,</div><div class='del'>-			priv-&gt;children[child_index]-&gt;name);</div><div class='del'>-	} else {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-			"setattr (%s) on %s failed (%s)",</div><div class='del'>-			impunge_local-&gt;loc.path,</div><div class='del'>-			priv-&gt;children[child_index]-&gt;name,</div><div class='del'>-			strerror (op_errno));</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	LOCK (&amp;impunge_frame-&gt;lock);</div><div class='del'>-	{</div><div class='del'>-		call_count = --impunge_local-&gt;call_count;</div><div class='del'>-	}</div><div class='del'>-	UNLOCK (&amp;impunge_frame-&gt;lock);</div><div class='del'>-</div><div class='del'>-	if (call_count == 0) {</div><div class='del'>-		AFR_STACK_DESTROY (impunge_frame);</div><div class='del'>-		afr_sh_entry_impunge_entry_done (frame, this, active_src);</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int source = -1;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    uint64_t *witness = NULL;</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    ret = afr_selfheal_unlocked_discover(frame, inode, inode-&gt;gfid, replies);</div><div class='add'>+    if (ret)</div><div class='add'>+        return ret;</div><div class='add'>+</div><div class='add'>+    witness = alloca0(sizeof(*witness) * priv-&gt;child_count);</div><div class='add'>+    ret = afr_selfheal_find_direction(frame, this, replies,</div><div class='add'>+                                      AFR_ENTRY_TRANSACTION, locked_on, sources,</div><div class='add'>+                                      sinks, witness, pflag);</div><div class='add'>+    if (ret)</div><div class='add'>+        return ret;</div><div class='add'>+</div><div class='add'>+    /* Initialize the healed_sinks[] array optimistically to</div><div class='add'>+       the intersection of to-be-healed (i.e sinks[]) and</div><div class='add'>+       the list of servers which are up (i.e locked_on[]).</div><div class='add'>+</div><div class='add'>+       As we encounter failures in the healing process, we</div><div class='add'>+       will unmark the respective servers in the healed_sinks[]</div><div class='add'>+       array.</div><div class='add'>+    */</div><div class='add'>+    AFR_INTERSECT(healed_sinks, sinks, locked_on, priv-&gt;child_count);</div><div class='add'>+</div><div class='add'>+    source = __afr_selfheal_entry_finalize_source(this, sources, healed_sinks,</div><div class='add'>+                                                  locked_on, replies, witness);</div><div class='add'>+</div><div class='add'>+    if (source &lt; 0) {</div><div class='add'>+        /* If source is &lt; 0 (typically split-brain), we perform a</div><div class='add'>+           conservative merge of entries rather than erroring out */</div><div class='add'>+    }</div><div class='add'>+    *source_p = source;</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-afr_sh_entry_impunge_xattrop_cbk (call_frame_t *impunge_frame, void *cookie,</div><div class='del'>-                                  xlator_t *this,</div><div class='del'>-                                  int32_t op_ret, int32_t op_errno,</div><div class='del'>-                                  dict_t *xattr)</div><div class='add'>+static int</div><div class='add'>+afr_selfheal_entry_dirent(call_frame_t *frame, xlator_t *this, fd_t *fd,</div><div class='add'>+                          char *name, inode_t *parent_idx_inode,</div><div class='add'>+                          xlator_t *subvol, gf_boolean_t full_crawl)</div><div class='ctx'> {</div><div class='del'>-	afr_private_t   *priv = NULL;</div><div class='del'>-	afr_local_t     *impunge_local = NULL;</div><div class='del'>-	afr_self_heal_t *impunge_sh = NULL;</div><div class='del'>-	int              child_index = 0;</div><div class='del'>-</div><div class='del'>-        struct iatt stbuf;</div><div class='del'>-        int32_t     valid = 0;</div><div class='del'>-</div><div class='del'>-	priv          = this-&gt;private;</div><div class='del'>-	impunge_local = impunge_frame-&gt;local;</div><div class='del'>-	impunge_sh    = &amp;impunge_local-&gt;self_heal;</div><div class='del'>-</div><div class='del'>-	child_index = (long) cookie;</div><div class='del'>-</div><div class='del'>-	gf_log (this-&gt;name, GF_LOG_TRACE,</div><div class='del'>-		"setting ownership of %s on %s to %d/%d",</div><div class='del'>-		impunge_local-&gt;loc.path,</div><div class='del'>-		priv-&gt;children[child_index]-&gt;name,</div><div class='del'>-		impunge_local-&gt;cont.lookup.buf.ia_uid,</div><div class='del'>-		impunge_local-&gt;cont.lookup.buf.ia_gid);</div><div class='del'>-</div><div class='del'>-	stbuf.ia_atime = impunge_local-&gt;cont.lookup.buf.ia_atime;</div><div class='del'>-	stbuf.ia_atime_nsec = impunge_local-&gt;cont.lookup.buf.ia_atime_nsec;</div><div class='del'>-	stbuf.ia_mtime = impunge_local-&gt;cont.lookup.buf.ia_mtime;</div><div class='del'>-	stbuf.ia_mtime_nsec = impunge_local-&gt;cont.lookup.buf.ia_mtime_nsec;</div><div class='del'>-</div><div class='del'>-        stbuf.ia_uid = impunge_local-&gt;cont.lookup.buf.ia_uid;</div><div class='del'>-        stbuf.ia_gid = impunge_local-&gt;cont.lookup.buf.ia_gid;</div><div class='del'>-</div><div class='del'>-        valid = GF_SET_ATTR_UID   | GF_SET_ATTR_GID |</div><div class='del'>-                GF_SET_ATTR_ATIME | GF_SET_ATTR_MTIME;</div><div class='del'>-</div><div class='del'>-	STACK_WIND_COOKIE (impunge_frame, afr_sh_entry_impunge_setattr_cbk,</div><div class='del'>-			   (void *) (long) child_index,</div><div class='del'>-			   priv-&gt;children[child_index],</div><div class='del'>-			   priv-&gt;children[child_index]-&gt;fops-&gt;setattr,</div><div class='del'>-			   &amp;impunge_local-&gt;loc,</div><div class='del'>-                           &amp;stbuf, valid);</div><div class='add'>+    int ret = 0;</div><div class='add'>+    int source = -1;</div><div class='add'>+    unsigned char *locked_on = NULL;</div><div class='add'>+    unsigned char *sources = NULL;</div><div class='add'>+    unsigned char *sinks = NULL;</div><div class='add'>+    unsigned char *healed_sinks = NULL;</div><div class='add'>+    inode_t *inode = NULL;</div><div class='add'>+    struct afr_reply *replies = NULL;</div><div class='add'>+    struct afr_reply *par_replies = NULL;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    dict_t *xattr = NULL;</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    if (afr_is_private_directory(priv, fd-&gt;inode-&gt;gfid, name,</div><div class='add'>+                                 GF_CLIENT_PID_SELF_HEALD)) {</div><div class='ctx'>         return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-afr_sh_entry_impunge_parent_setattr_cbk (call_frame_t *setattr_frame,</div><div class='del'>-                                         void *cookie, xlator_t *this,</div><div class='del'>-                                         int32_t op_ret, int32_t op_errno,</div><div class='del'>-                                         struct iatt *preop, struct iatt *postop)</div><div class='del'>-{</div><div class='del'>-        loc_t *parent_loc = cookie;</div><div class='del'>-</div><div class='del'>-        if (op_ret != 0) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-                        "setattr on parent directory failed: %s",</div><div class='del'>-                        strerror (op_errno));</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    xattr = dict_new();</div><div class='add'>+    if (!xattr)</div><div class='add'>+        return -ENOMEM;</div><div class='add'>+    ret = dict_set_int32_sizen(xattr, GF_GFIDLESS_LOOKUP, 1);</div><div class='add'>+    if (ret) {</div><div class='add'>+        dict_unref(xattr);</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    sources = alloca0(priv-&gt;child_count);</div><div class='add'>+    sinks = alloca0(priv-&gt;child_count);</div><div class='add'>+    healed_sinks = alloca0(priv-&gt;child_count);</div><div class='add'>+    locked_on = alloca0(priv-&gt;child_count);</div><div class='add'>+</div><div class='add'>+    replies = alloca0(priv-&gt;child_count * sizeof(*replies));</div><div class='add'>+    par_replies = alloca0(priv-&gt;child_count * sizeof(*par_replies));</div><div class='add'>+</div><div class='add'>+    ret = afr_selfheal_entrylk(frame, this, fd-&gt;inode, this-&gt;name, NULL,</div><div class='add'>+                               locked_on);</div><div class='add'>+    {</div><div class='add'>+        if (ret &lt; priv-&gt;child_count) {</div><div class='add'>+            gf_msg_debug(this-&gt;name, 0,</div><div class='add'>+                         "%s: Skipping "</div><div class='add'>+                         "entry self-heal as only %d sub-volumes "</div><div class='add'>+                         " could be locked in %s domain",</div><div class='add'>+                         uuid_utoa(fd-&gt;inode-&gt;gfid), ret, this-&gt;name);</div><div class='add'>+            ret = -ENOTCONN;</div><div class='add'>+            goto unlock;</div><div class='ctx'>         }</div><div class='ctx'> </div><div class='del'>-        loc_wipe (parent_loc);</div><div class='del'>-</div><div class='del'>-        GF_FREE (parent_loc);</div><div class='del'>-</div><div class='del'>-        AFR_STACK_DESTROY (setattr_frame);</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-afr_sh_entry_impunge_newfile_cbk (call_frame_t *impunge_frame, void *cookie,</div><div class='del'>-				  xlator_t *this,</div><div class='del'>-				  int32_t op_ret, int32_t op_errno,</div><div class='del'>-                                  inode_t *inode, struct iatt *stbuf,</div><div class='del'>-                                  struct iatt *preparent,</div><div class='del'>-                                  struct iatt *postparent)</div><div class='del'>-{</div><div class='del'>-	int              call_count = 0;</div><div class='del'>-	afr_private_t   *priv = NULL;</div><div class='del'>-	afr_local_t     *impunge_local = NULL;</div><div class='del'>-	afr_self_heal_t *impunge_sh = NULL;</div><div class='del'>-	call_frame_t    *frame = NULL;</div><div class='del'>-	int              active_src = 0;</div><div class='del'>-	int              child_index = 0;</div><div class='del'>-        int              pending_array[3] = {0, };</div><div class='del'>-        dict_t          *xattr = NULL;</div><div class='del'>-        int              ret = 0;</div><div class='del'>-        int              idx = 0;</div><div class='del'>-        afr_local_t     *local = NULL;</div><div class='del'>-        afr_self_heal_t *sh = NULL;</div><div class='del'>-</div><div class='del'>-        call_frame_t *setattr_frame = NULL;</div><div class='del'>-        int32_t valid = 0;</div><div class='del'>-        loc_t *parent_loc = NULL;</div><div class='del'>-        struct iatt parentbuf;</div><div class='del'>-</div><div class='del'>-	priv = this-&gt;private;</div><div class='del'>-	impunge_local = impunge_frame-&gt;local;</div><div class='del'>-	impunge_sh = &amp;impunge_local-&gt;self_heal;</div><div class='del'>-	frame = impunge_sh-&gt;sh_frame;</div><div class='del'>-        local = frame-&gt;local;</div><div class='del'>-        sh    = &amp;local-&gt;self_heal;</div><div class='del'>-        active_src = sh-&gt;active_source;</div><div class='del'>-</div><div class='del'>-	child_index = (long) cookie;</div><div class='del'>-</div><div class='del'>-	if (op_ret == -1) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-			"creation of %s on %s failed (%s)",</div><div class='del'>-			impunge_local-&gt;loc.path,</div><div class='del'>-			priv-&gt;children[child_index]-&gt;name,</div><div class='del'>-			strerror (op_errno));</div><div class='del'>-		goto out;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	inode-&gt;ia_type = stbuf-&gt;ia_type;</div><div class='del'>-</div><div class='del'>-        xattr = get_new_dict ();</div><div class='del'>-        dict_ref (xattr);</div><div class='del'>-</div><div class='del'>-        idx = afr_index_for_transaction_type (AFR_METADATA_TRANSACTION);</div><div class='del'>-        pending_array[idx] = hton32 (1);</div><div class='del'>-        if (IA_ISDIR (stbuf-&gt;ia_type))</div><div class='del'>-                idx = afr_index_for_transaction_type (AFR_ENTRY_TRANSACTION);</div><div class='del'>-        else</div><div class='del'>-                idx = afr_index_for_transaction_type (AFR_DATA_TRANSACTION);</div><div class='del'>-        pending_array[idx] = hton32 (1);</div><div class='del'>-</div><div class='del'>-        ret = dict_set_static_bin (xattr, priv-&gt;pending_key[child_index],</div><div class='del'>-                                   pending_array, sizeof (pending_array));</div><div class='add'>+        ret = __afr_selfheal_entry_prepare(frame, this, fd-&gt;inode, locked_on,</div><div class='add'>+                                           sources, sinks, healed_sinks,</div><div class='add'>+                                           par_replies, &amp;source, NULL);</div><div class='ctx'>         if (ret &lt; 0)</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_WARNING,</div><div class='del'>-                        "Unable to set dict value.");</div><div class='del'>-</div><div class='del'>-        valid         = GF_SET_ATTR_ATIME | GF_SET_ATTR_MTIME;</div><div class='del'>-        parentbuf     = impunge_sh-&gt;parentbuf;</div><div class='del'>-        setattr_frame = copy_frame (impunge_frame);</div><div class='del'>-</div><div class='del'>-        parent_loc = GF_CALLOC (1, sizeof (*parent_loc),</div><div class='del'>-                                gf_afr_mt_loc_t);</div><div class='del'>-        afr_build_parent_loc (parent_loc, &amp;impunge_local-&gt;loc);</div><div class='del'>-</div><div class='del'>-	STACK_WIND_COOKIE (impunge_frame, afr_sh_entry_impunge_xattrop_cbk,</div><div class='del'>-			   (void *) (long) child_index,</div><div class='del'>-			   priv-&gt;children[active_src],</div><div class='del'>-			   priv-&gt;children[active_src]-&gt;fops-&gt;xattrop,</div><div class='del'>-			   &amp;impunge_local-&gt;loc, GF_XATTROP_ADD_ARRAY, xattr);</div><div class='del'>-</div><div class='del'>-        STACK_WIND_COOKIE (setattr_frame, afr_sh_entry_impunge_parent_setattr_cbk,</div><div class='del'>-                           (void *) (long) parent_loc,</div><div class='del'>-                           priv-&gt;children[child_index],</div><div class='del'>-                           priv-&gt;children[child_index]-&gt;fops-&gt;setattr,</div><div class='del'>-                           parent_loc, &amp;parentbuf, valid);</div><div class='del'>-</div><div class='del'>-        dict_unref (xattr);</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='add'>+            goto unlock;</div><div class='ctx'> </div><div class='del'>-out:</div><div class='del'>-	LOCK (&amp;impunge_frame-&gt;lock);</div><div class='del'>-	{</div><div class='del'>-		call_count = --impunge_local-&gt;call_count;</div><div class='del'>-	}</div><div class='del'>-	UNLOCK (&amp;impunge_frame-&gt;lock);</div><div class='del'>-</div><div class='del'>-	if (call_count == 0) {</div><div class='del'>-		AFR_STACK_DESTROY (impunge_frame);</div><div class='del'>-		afr_sh_entry_impunge_entry_done (frame, this, active_src);</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-afr_sh_entry_impunge_mknod (call_frame_t *impunge_frame, xlator_t *this,</div><div class='del'>-			    int child_index, struct iatt *stbuf)</div><div class='del'>-{</div><div class='del'>-	afr_private_t   *priv = NULL;</div><div class='del'>-	afr_local_t     *impunge_local = NULL;</div><div class='del'>-        dict_t          *dict = NULL;</div><div class='del'>-</div><div class='del'>-        int ret = 0;</div><div class='del'>-</div><div class='del'>-	priv = this-&gt;private;</div><div class='del'>-	impunge_local = impunge_frame-&gt;local;</div><div class='del'>-</div><div class='del'>-	gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-		"creating missing file %s on %s",</div><div class='del'>-		impunge_local-&gt;loc.path,</div><div class='del'>-		priv-&gt;children[child_index]-&gt;name);</div><div class='del'>-</div><div class='del'>-        dict = dict_new ();</div><div class='del'>-        if (!dict)</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_ERROR, "Out of memory");</div><div class='del'>-</div><div class='del'>-        ret = afr_set_dict_gfid (dict, stbuf-&gt;ia_gfid);</div><div class='del'>-        if (ret)</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_DEBUG, "gfid set failed");</div><div class='del'>-</div><div class='del'>-	STACK_WIND_COOKIE (impunge_frame, afr_sh_entry_impunge_newfile_cbk,</div><div class='del'>-			   (void *) (long) child_index,</div><div class='del'>-			   priv-&gt;children[child_index],</div><div class='del'>-			   priv-&gt;children[child_index]-&gt;fops-&gt;mknod,</div><div class='del'>-			   &amp;impunge_local-&gt;loc,</div><div class='del'>-			   st_mode_from_ia (stbuf-&gt;ia_prot, stbuf-&gt;ia_type),</div><div class='del'>-                           stbuf-&gt;ia_rdev, dict);</div><div class='del'>-</div><div class='del'>-        if (dict)</div><div class='del'>-                dict_unref (dict);</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-afr_sh_entry_impunge_mkdir (call_frame_t *impunge_frame, xlator_t *this,</div><div class='del'>-			    int child_index, struct iatt *stbuf)</div><div class='del'>-{</div><div class='del'>-	afr_private_t   *priv = NULL;</div><div class='del'>-	afr_local_t     *impunge_local = NULL;</div><div class='del'>-        dict_t          *dict = NULL;</div><div class='del'>-</div><div class='del'>-        int ret = 0;</div><div class='del'>-</div><div class='del'>-	priv = this-&gt;private;</div><div class='del'>-	impunge_local = impunge_frame-&gt;local;</div><div class='del'>-</div><div class='del'>-        dict = dict_new ();</div><div class='del'>-        if (!dict) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-                        "Out of memory");</div><div class='del'>-                return 0;</div><div class='add'>+        inode = afr_selfheal_unlocked_lookup_on(frame, fd-&gt;inode, name, replies,</div><div class='add'>+                                                locked_on, xattr);</div><div class='add'>+        if (!inode) {</div><div class='add'>+            ret = -ENOMEM;</div><div class='add'>+            goto unlock;</div><div class='ctx'>         }</div><div class='ctx'> </div><div class='del'>-        ret = afr_set_dict_gfid (dict, stbuf-&gt;ia_gfid);</div><div class='del'>-        if (ret)</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_DEBUG, "gfid set failed");</div><div class='del'>-</div><div class='del'>-	gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-		"creating missing directory %s on %s",</div><div class='del'>-		impunge_local-&gt;loc.path,</div><div class='del'>-		priv-&gt;children[child_index]-&gt;name);</div><div class='del'>-</div><div class='del'>-	STACK_WIND_COOKIE (impunge_frame, afr_sh_entry_impunge_newfile_cbk,</div><div class='del'>-			   (void *) (long) child_index,</div><div class='del'>-			   priv-&gt;children[child_index],</div><div class='del'>-			   priv-&gt;children[child_index]-&gt;fops-&gt;mkdir,</div><div class='del'>-			   &amp;impunge_local-&gt;loc,</div><div class='del'>-                           st_mode_from_ia (stbuf-&gt;ia_prot, stbuf-&gt;ia_type),</div><div class='del'>-                           dict);</div><div class='del'>-</div><div class='del'>-        if (dict)</div><div class='del'>-                dict_unref (dict);</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-afr_sh_entry_impunge_symlink (call_frame_t *impunge_frame, xlator_t *this,</div><div class='del'>-			      int child_index, const char *linkname)</div><div class='del'>-{</div><div class='del'>-	afr_private_t   *priv          = NULL;</div><div class='del'>-	afr_local_t     *impunge_local = NULL;</div><div class='del'>-        dict_t          *dict          = NULL;</div><div class='del'>-        struct iatt     *buf           = NULL;</div><div class='del'>-</div><div class='del'>-        int ret = 0;</div><div class='del'>-</div><div class='del'>-	priv = this-&gt;private;</div><div class='del'>-	impunge_local = impunge_frame-&gt;local;</div><div class='del'>-</div><div class='del'>-        buf = &amp;impunge_local-&gt;cont.symlink.buf;</div><div class='del'>-</div><div class='del'>-        dict = dict_new ();</div><div class='del'>-        if (!dict) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-                        "Out of memory");</div><div class='del'>-                afr_sh_entry_impunge_entry_done (impunge_frame, this, 0);</div><div class='add'>+        ret = __afr_selfheal_entry_dirent(frame, this, fd, name, inode, source,</div><div class='add'>+                                          sources, healed_sinks, locked_on,</div><div class='add'>+                                          replies);</div><div class='add'>+</div><div class='add'>+        if ((ret == 0) &amp;&amp; (priv-&gt;esh_granular) &amp;&amp; parent_idx_inode) {</div><div class='add'>+            ret = afr_shd_entry_purge(subvol, parent_idx_inode, name,</div><div class='add'>+                                      inode-&gt;ia_type);</div><div class='add'>+            /* Why is ret force-set to 0? We do not care about</div><div class='add'>+             * index purge failing for full heal as it is quite</div><div class='add'>+             * possible during replace-brick that not all files</div><div class='add'>+             * and directories have their name indices present in</div><div class='add'>+             * entry-changes/.</div><div class='add'>+             */</div><div class='add'>+            ret = 0;</div><div class='ctx'>         }</div><div class='del'>-</div><div class='del'>-        ret = afr_set_dict_gfid (dict, buf-&gt;ia_gfid);</div><div class='del'>-        if (ret)</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-                        "dict set gfid failed");</div><div class='del'>-</div><div class='del'>-	gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-		"creating missing symlink %s -&gt; %s on %s",</div><div class='del'>-		impunge_local-&gt;loc.path, linkname,</div><div class='del'>-		priv-&gt;children[child_index]-&gt;name);</div><div class='del'>-</div><div class='del'>-	STACK_WIND_COOKIE (impunge_frame, afr_sh_entry_impunge_newfile_cbk,</div><div class='del'>-			   (void *) (long) child_index,</div><div class='del'>-			   priv-&gt;children[child_index],</div><div class='del'>-			   priv-&gt;children[child_index]-&gt;fops-&gt;symlink,</div><div class='del'>-			   linkname, &amp;impunge_local-&gt;loc, dict);</div><div class='del'>-</div><div class='del'>-        if (dict)</div><div class='del'>-                dict_unref (dict);</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+unlock:</div><div class='add'>+    afr_selfheal_unentrylk(frame, this, fd-&gt;inode, this-&gt;name, NULL, locked_on,</div><div class='add'>+                           NULL);</div><div class='add'>+    if (inode)</div><div class='add'>+        inode_unref(inode);</div><div class='add'>+    if (replies)</div><div class='add'>+        afr_replies_wipe(replies, priv-&gt;child_count);</div><div class='add'>+    if (par_replies)</div><div class='add'>+        afr_replies_wipe(par_replies, priv-&gt;child_count);</div><div class='add'>+    if (xattr)</div><div class='add'>+        dict_unref(xattr);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-afr_sh_entry_impunge_symlink_unlink_cbk (call_frame_t *impunge_frame,</div><div class='del'>-                                         void *cookie, xlator_t *this,</div><div class='del'>-                                         int32_t op_ret, int32_t op_errno,</div><div class='del'>-                                         struct iatt *preparent,</div><div class='del'>-                                         struct iatt *postparent)</div><div class='add'>+static inode_t *</div><div class='add'>+afr_shd_entry_changes_index_inode(xlator_t *this, xlator_t *subvol,</div><div class='add'>+                                  uuid_t pargfid)</div><div class='ctx'> {</div><div class='del'>-        afr_private_t   *priv = NULL;</div><div class='del'>-	afr_local_t     *impunge_local = NULL;</div><div class='del'>-	afr_self_heal_t *impunge_sh = NULL;</div><div class='del'>-	int              child_index = -1;</div><div class='del'>-	call_frame_t    *frame = NULL;</div><div class='del'>-	int              call_count = -1;</div><div class='del'>-	int              active_src = -1;</div><div class='del'>-</div><div class='del'>-	priv          = this-&gt;private;</div><div class='del'>-	impunge_local = impunge_frame-&gt;local;</div><div class='del'>-	impunge_sh    = &amp;impunge_local-&gt;self_heal;</div><div class='del'>-	frame         = impunge_sh-&gt;sh_frame;</div><div class='del'>-	active_src    = impunge_sh-&gt;active_source;</div><div class='del'>-</div><div class='del'>-	child_index = (long) cookie;</div><div class='del'>-</div><div class='del'>-	if (op_ret == -1) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-			"unlink of %s on %s failed (%s)",</div><div class='del'>-			impunge_local-&gt;loc.path,</div><div class='del'>-			priv-&gt;children[child_index]-&gt;name,</div><div class='del'>-			strerror (op_errno));</div><div class='del'>-		goto out;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-        afr_sh_entry_impunge_symlink (impunge_frame, this, child_index,</div><div class='del'>-                                      impunge_sh-&gt;linkname);</div><div class='add'>+    int ret = -1;</div><div class='add'>+    void *index_gfid = NULL;</div><div class='add'>+    loc_t rootloc = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    loc_t loc = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    dict_t *xattr = NULL;</div><div class='add'>+    inode_t *inode = NULL;</div><div class='add'>+    struct iatt iatt = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    rootloc.inode = inode_ref(this-&gt;itable-&gt;root);</div><div class='add'>+    gf_uuid_copy(rootloc.gfid, rootloc.inode-&gt;gfid);</div><div class='add'>+</div><div class='add'>+    ret = syncop_getxattr(subvol, &amp;rootloc, &amp;xattr,</div><div class='add'>+                          GF_XATTROP_ENTRY_CHANGES_GFID, NULL, NULL);</div><div class='add'>+    if (ret || !xattr) {</div><div class='add'>+        errno = -ret;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_get_ptr(xattr, GF_XATTROP_ENTRY_CHANGES_GFID, &amp;index_gfid);</div><div class='add'>+    if (ret) {</div><div class='add'>+        errno = EINVAL;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    loc.inode = inode_new(this-&gt;itable);</div><div class='add'>+    if (!loc.inode) {</div><div class='add'>+        errno = ENOMEM;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    gf_uuid_copy(loc.pargfid, index_gfid);</div><div class='add'>+    loc.name = gf_strdup(uuid_utoa(pargfid));</div><div class='add'>+</div><div class='add'>+    ret = syncop_lookup(subvol, &amp;loc, &amp;iatt, NULL, NULL, NULL);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        errno = -ret;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    inode = inode_link(loc.inode, NULL, NULL, &amp;iatt);</div><div class='ctx'> </div><div class='del'>-        return 0;</div><div class='ctx'> out:</div><div class='del'>-	LOCK (&amp;impunge_frame-&gt;lock);</div><div class='del'>-	{</div><div class='del'>-		call_count = --impunge_local-&gt;call_count;</div><div class='del'>-	}</div><div class='del'>-	UNLOCK (&amp;impunge_frame-&gt;lock);</div><div class='del'>-</div><div class='del'>-	if (call_count == 0) {</div><div class='del'>-		AFR_STACK_DESTROY (impunge_frame);</div><div class='del'>-		afr_sh_entry_impunge_entry_done (frame, this, active_src);</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-afr_sh_entry_impunge_symlink_unlink (call_frame_t *impunge_frame, xlator_t *this,</div><div class='del'>-                                     int child_index)</div><div class='del'>-{</div><div class='del'>-	afr_private_t   *priv          = NULL;</div><div class='del'>-	afr_local_t     *impunge_local = NULL;</div><div class='del'>-</div><div class='del'>-	priv          = this-&gt;private;</div><div class='del'>-	impunge_local = impunge_frame-&gt;local;</div><div class='del'>-</div><div class='del'>-	gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-		"unlinking symlink %s with wrong target on %s",</div><div class='del'>-		impunge_local-&gt;loc.path,</div><div class='del'>-		priv-&gt;children[child_index]-&gt;name);</div><div class='del'>-</div><div class='del'>-        STACK_WIND_COOKIE (impunge_frame, afr_sh_entry_impunge_symlink_unlink_cbk,</div><div class='del'>-                           (void *) (long) child_index,</div><div class='del'>-                           priv-&gt;children[child_index],</div><div class='del'>-                           priv-&gt;children[child_index]-&gt;fops-&gt;unlink,</div><div class='del'>-                           &amp;impunge_local-&gt;loc);</div><div class='add'>+    if (xattr)</div><div class='add'>+        dict_unref(xattr);</div><div class='add'>+    loc_wipe(&amp;rootloc);</div><div class='add'>+    GF_FREE((char *)loc.name);</div><div class='add'>+    loc_wipe(&amp;loc);</div><div class='ctx'> </div><div class='del'>-        return 0;</div><div class='add'>+    return inode;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-afr_sh_entry_impunge_readlink_sink_cbk (call_frame_t *impunge_frame, void *cookie,</div><div class='del'>-                                        xlator_t *this,</div><div class='del'>-                                        int32_t op_ret, int32_t op_errno,</div><div class='del'>-                                        const char *linkname, struct iatt *sbuf)</div><div class='add'>+static int</div><div class='add'>+afr_selfheal_entry_do_subvol(call_frame_t *frame, xlator_t *this, fd_t *fd,</div><div class='add'>+                             int child)</div><div class='ctx'> {</div><div class='del'>-        afr_private_t   *priv = NULL;</div><div class='del'>-	afr_local_t     *impunge_local = NULL;</div><div class='del'>-	afr_self_heal_t *impunge_sh = NULL;</div><div class='del'>-	int              child_index = -1;</div><div class='del'>-	call_frame_t    *frame = NULL;</div><div class='del'>-	int              call_count = -1;</div><div class='del'>-	int              active_src = -1;</div><div class='del'>-</div><div class='del'>-	priv          = this-&gt;private;</div><div class='del'>-	impunge_local = impunge_frame-&gt;local;</div><div class='del'>-	impunge_sh    = &amp;impunge_local-&gt;self_heal;</div><div class='del'>-	frame         = impunge_sh-&gt;sh_frame;</div><div class='del'>-	active_src    = impunge_sh-&gt;active_source;</div><div class='del'>-</div><div class='del'>-	child_index = (long) cookie;</div><div class='del'>-</div><div class='del'>-	if ((op_ret == -1) &amp;&amp; (op_errno != ENOENT)) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-			"readlink of %s on %s failed (%s)",</div><div class='del'>-			impunge_local-&gt;loc.path,</div><div class='del'>-			priv-&gt;children[active_src]-&gt;name,</div><div class='del'>-			strerror (op_errno));</div><div class='del'>-		goto out;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-        /* symlink doesn't exist on the sink */</div><div class='del'>-</div><div class='del'>-        if ((op_ret == -1) &amp;&amp; (op_errno == ENOENT)) {</div><div class='del'>-                afr_sh_entry_impunge_symlink (impunge_frame, this,</div><div class='del'>-                                              child_index, impunge_sh-&gt;linkname);</div><div class='del'>-                return 0;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-        /* symlink exists on the sink, so check if targets match */</div><div class='del'>-</div><div class='del'>-        if (strcmp (linkname, impunge_sh-&gt;linkname) == 0) {</div><div class='del'>-                /* targets match, nothing to do */</div><div class='del'>-</div><div class='del'>-                goto out;</div><div class='del'>-        } else {</div><div class='del'>-                /*</div><div class='del'>-                 * Hah! Sneaky wolf in sheep's clothing!</div><div class='del'>-                 */</div><div class='del'>-                afr_sh_entry_impunge_symlink_unlink (impunge_frame, this,</div><div class='del'>-                                                     child_index);</div><div class='del'>-                return 0;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    gf_dirent_t entries;</div><div class='add'>+    gf_dirent_t *entry = NULL;</div><div class='add'>+    off_t offset = 0;</div><div class='add'>+    call_frame_t *iter_frame = NULL;</div><div class='add'>+    xlator_t *subvol = NULL;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    gf_boolean_t mismatch = _gf_false;</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    loc_t loc = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+    subvol = priv-&gt;children[child];</div><div class='add'>+</div><div class='add'>+    INIT_LIST_HEAD(&amp;entries.list);</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+</div><div class='add'>+    iter_frame = afr_copy_frame(frame);</div><div class='add'>+    if (!iter_frame)</div><div class='add'>+        return -ENOMEM;</div><div class='add'>+</div><div class='add'>+    loc.inode = afr_shd_entry_changes_index_inode(this, subvol,</div><div class='add'>+                                                  fd-&gt;inode-&gt;gfid);</div><div class='add'>+</div><div class='add'>+    while ((ret = syncop_readdir(subvol, fd, 131072, offset, &amp;entries, NULL,</div><div class='add'>+                                 NULL))) {</div><div class='add'>+        if (ret &gt; 0)</div><div class='add'>+            ret = 0;</div><div class='add'>+        list_for_each_entry(entry, &amp;entries.list, list)</div><div class='add'>+        {</div><div class='add'>+            offset = entry-&gt;d_off;</div><div class='add'>+</div><div class='add'>+            if (!strcmp(entry-&gt;d_name, ".") || !strcmp(entry-&gt;d_name, ".."))</div><div class='add'>+                continue;</div><div class='add'>+</div><div class='add'>+            ret = afr_selfheal_entry_dirent(iter_frame, this, fd, entry-&gt;d_name,</div><div class='add'>+                                            loc.inode, subvol,</div><div class='add'>+                                            local-&gt;need_full_crawl);</div><div class='add'>+            AFR_STACK_RESET(iter_frame);</div><div class='add'>+            if (iter_frame-&gt;local == NULL) {</div><div class='add'>+                ret = -ENOTCONN;</div><div class='add'>+                break;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            if (ret == -1) {</div><div class='add'>+                /* gfid or type mismatch. */</div><div class='add'>+                mismatch = _gf_true;</div><div class='add'>+                ret = 0;</div><div class='add'>+            }</div><div class='add'>+            if (ret)</div><div class='add'>+                break;</div><div class='ctx'>         }</div><div class='ctx'> </div><div class='del'>-out:</div><div class='del'>-	LOCK (&amp;impunge_frame-&gt;lock);</div><div class='del'>-	{</div><div class='del'>-		call_count = --impunge_local-&gt;call_count;</div><div class='del'>-	}</div><div class='del'>-	UNLOCK (&amp;impunge_frame-&gt;lock);</div><div class='del'>-</div><div class='del'>-	if (call_count == 0) {</div><div class='del'>-		AFR_STACK_DESTROY (impunge_frame);</div><div class='del'>-		afr_sh_entry_impunge_entry_done (frame, this, active_src);</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-afr_sh_entry_impunge_readlink_sink (call_frame_t *impunge_frame, xlator_t *this,</div><div class='del'>-                                    int child_index)</div><div class='del'>-{</div><div class='del'>-	afr_private_t   *priv = NULL;</div><div class='del'>-	afr_local_t     *impunge_local = NULL;</div><div class='del'>-</div><div class='del'>-	priv = this-&gt;private;</div><div class='del'>-	impunge_local = impunge_frame-&gt;local;</div><div class='del'>-</div><div class='del'>-	gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-		"checking symlink target of %s on %s",</div><div class='del'>-		impunge_local-&gt;loc.path, priv-&gt;children[child_index]-&gt;name);</div><div class='del'>-</div><div class='del'>-	STACK_WIND_COOKIE (impunge_frame, afr_sh_entry_impunge_readlink_sink_cbk,</div><div class='del'>-			   (void *) (long) child_index,</div><div class='del'>-			   priv-&gt;children[child_index],</div><div class='del'>-			   priv-&gt;children[child_index]-&gt;fops-&gt;readlink,</div><div class='del'>-			   &amp;impunge_local-&gt;loc, 4096);</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-afr_sh_entry_impunge_readlink_cbk (call_frame_t *impunge_frame, void *cookie,</div><div class='del'>-				   xlator_t *this,</div><div class='del'>-				   int32_t op_ret, int32_t op_errno,</div><div class='del'>-				   const char *linkname, struct iatt *sbuf)</div><div class='del'>-{</div><div class='del'>-	afr_private_t   *priv = NULL;</div><div class='del'>-	afr_local_t     *impunge_local = NULL;</div><div class='del'>-	afr_self_heal_t *impunge_sh = NULL;</div><div class='del'>-	int              child_index = -1;</div><div class='del'>-	call_frame_t    *frame = NULL;</div><div class='del'>-	int              call_count = -1;</div><div class='del'>-	int              active_src = -1;</div><div class='del'>-</div><div class='del'>-	priv = this-&gt;private;</div><div class='del'>-	impunge_local = impunge_frame-&gt;local;</div><div class='del'>-	impunge_sh = &amp;impunge_local-&gt;self_heal;</div><div class='del'>-	frame = impunge_sh-&gt;sh_frame;</div><div class='del'>-	active_src = impunge_sh-&gt;active_source;</div><div class='del'>-</div><div class='del'>-	child_index = (long) cookie;</div><div class='del'>-</div><div class='del'>-	if (op_ret == -1) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-			"readlink of %s on %s failed (%s)",</div><div class='del'>-			impunge_local-&gt;loc.path,</div><div class='del'>-			priv-&gt;children[active_src]-&gt;name,</div><div class='del'>-			strerror (op_errno));</div><div class='del'>-		goto out;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-        impunge_sh-&gt;linkname = gf_strdup (linkname);</div><div class='del'>-	afr_sh_entry_impunge_readlink_sink (impunge_frame, this, child_index);</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-	LOCK (&amp;impunge_frame-&gt;lock);</div><div class='del'>-	{</div><div class='del'>-		call_count = --impunge_local-&gt;call_count;</div><div class='del'>-	}</div><div class='del'>-	UNLOCK (&amp;impunge_frame-&gt;lock);</div><div class='del'>-</div><div class='del'>-	if (call_count == 0) {</div><div class='del'>-		AFR_STACK_DESTROY (impunge_frame);</div><div class='del'>-		afr_sh_entry_impunge_entry_done (frame, this, active_src);</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='add'>+        gf_dirent_free(&amp;entries);</div><div class='add'>+        if (ret)</div><div class='add'>+            break;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='add'>+    loc_wipe(&amp;loc);</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-afr_sh_entry_impunge_readlink (call_frame_t *impunge_frame, xlator_t *this,</div><div class='del'>-			       int child_index, struct iatt *stbuf)</div><div class='del'>-{</div><div class='del'>-	afr_private_t   *priv = NULL;</div><div class='del'>-	afr_local_t     *impunge_local = NULL;</div><div class='del'>-	afr_self_heal_t *impunge_sh = NULL;</div><div class='del'>-	int              active_src = -1;</div><div class='del'>-</div><div class='del'>-	priv = this-&gt;private;</div><div class='del'>-	impunge_local = impunge_frame-&gt;local;</div><div class='del'>-	impunge_sh = &amp;impunge_local-&gt;self_heal;</div><div class='del'>-	active_src = impunge_sh-&gt;active_source;</div><div class='del'>-        impunge_local-&gt;cont.symlink.buf = *stbuf;</div><div class='del'>-</div><div class='del'>-	STACK_WIND_COOKIE (impunge_frame, afr_sh_entry_impunge_readlink_cbk,</div><div class='del'>-			   (void *) (long) child_index,</div><div class='del'>-			   priv-&gt;children[active_src],</div><div class='del'>-			   priv-&gt;children[active_src]-&gt;fops-&gt;readlink,</div><div class='del'>-			   &amp;impunge_local-&gt;loc, 4096);</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='add'>+    AFR_STACK_DESTROY(iter_frame);</div><div class='add'>+    if (mismatch == _gf_true)</div><div class='add'>+        /* undo pending will be skipped */</div><div class='add'>+        ret = -1;</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-afr_sh_entry_impunge_recreate_lookup_cbk (call_frame_t *impunge_frame,</div><div class='del'>-					  void *cookie, xlator_t *this,</div><div class='del'>-					  int32_t op_ret, int32_t op_errno,</div><div class='del'>-					  inode_t *inode, struct iatt *buf,</div><div class='del'>-					  dict_t *xattr,struct iatt *postparent)</div><div class='add'>+static int</div><div class='add'>+afr_selfheal_entry_granular_dirent(xlator_t *subvol, gf_dirent_t *entry,</div><div class='add'>+                                   loc_t *parent, void *data)</div><div class='ctx'> {</div><div class='del'>-	afr_private_t   *priv = NULL;</div><div class='del'>-	afr_local_t     *impunge_local = NULL;</div><div class='del'>-	afr_self_heal_t *impunge_sh = NULL;</div><div class='del'>-	int              active_src = 0;</div><div class='del'>-	int              type = 0;</div><div class='del'>-	int              child_index = 0;</div><div class='del'>-	call_frame_t    *frame = NULL;</div><div class='del'>-	int              call_count = 0;</div><div class='del'>-</div><div class='del'>-	priv = this-&gt;private;</div><div class='del'>-	impunge_local = impunge_frame-&gt;local;</div><div class='del'>-	impunge_sh = &amp;impunge_local-&gt;self_heal;</div><div class='del'>-	frame = impunge_sh-&gt;sh_frame;</div><div class='del'>-</div><div class='del'>-	child_index = (long) cookie;</div><div class='del'>-</div><div class='del'>-	active_src = impunge_sh-&gt;active_source;</div><div class='del'>-</div><div class='del'>-	if (op_ret != 0) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_TRACE,</div><div class='del'>-			"looking up %s on %s (for %s) failed (%s)",</div><div class='del'>-			impunge_local-&gt;loc.path,</div><div class='del'>-			priv-&gt;children[active_src]-&gt;name,</div><div class='del'>-			priv-&gt;children[child_index]-&gt;name,</div><div class='del'>-			strerror (op_errno));</div><div class='del'>-		goto out;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-        impunge_sh-&gt;parentbuf = *postparent;</div><div class='del'>-</div><div class='del'>-	impunge_local-&gt;cont.lookup.buf = *buf;</div><div class='del'>-	type = buf-&gt;ia_type;</div><div class='del'>-</div><div class='del'>-	switch (type) {</div><div class='del'>-	case IA_IFSOCK:</div><div class='del'>-	case IA_IFREG:</div><div class='del'>-	case IA_IFBLK:</div><div class='del'>-	case IA_IFCHR:</div><div class='del'>-	case IA_IFIFO:</div><div class='del'>-		afr_sh_entry_impunge_mknod (impunge_frame, this,</div><div class='del'>-					    child_index, buf);</div><div class='del'>-		break;</div><div class='del'>-	case IA_IFLNK:</div><div class='del'>-		afr_sh_entry_impunge_readlink (impunge_frame, this,</div><div class='del'>-					       child_index, buf);</div><div class='del'>-		break;</div><div class='del'>-	case IA_IFDIR:</div><div class='del'>-		afr_sh_entry_impunge_mkdir (impunge_frame, this,</div><div class='del'>-					    child_index, buf);</div><div class='del'>-		break;</div><div class='del'>-	default:</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-			"%s has unknown file type on %s: 0%o",</div><div class='del'>-			impunge_local-&gt;loc.path,</div><div class='del'>-			priv-&gt;children[active_src]-&gt;name, type);</div><div class='del'>-		goto out;</div><div class='del'>-		break;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    loc_t loc = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    struct iatt iatt = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    afr_granular_esh_args_t *args = data;</div><div class='add'>+</div><div class='add'>+    /* Look up the actual inode associated with entry. If the lookup returns</div><div class='add'>+     * ESTALE or ENOENT, then it means we have a stale index. Remove it.</div><div class='add'>+     * This is analogous to the check in afr_shd_index_heal() except that</div><div class='add'>+     * here it is achieved through LOOKUP and in afr_shd_index_heal() through</div><div class='add'>+     * a GETXATTR.</div><div class='add'>+     */</div><div class='add'>+</div><div class='add'>+    loc.inode = inode_new(args-&gt;xl-&gt;itable);</div><div class='add'>+    loc.parent = inode_ref(args-&gt;heal_fd-&gt;inode);</div><div class='add'>+    gf_uuid_copy(loc.pargfid, loc.parent-&gt;gfid);</div><div class='add'>+    loc.name = entry-&gt;d_name;</div><div class='add'>+</div><div class='add'>+    ret = syncop_lookup(args-&gt;xl, &amp;loc, &amp;iatt, NULL, NULL, NULL);</div><div class='add'>+    if ((ret == -ENOENT) || (ret == -ESTALE)) {</div><div class='add'>+        /* The name indices under the pgfid index dir are guaranteed</div><div class='add'>+         * to be regular files. Hence the hardcoding.</div><div class='add'>+         */</div><div class='add'>+        afr_shd_entry_purge(subvol, parent-&gt;inode, entry-&gt;d_name, IA_IFREG);</div><div class='add'>+        ret = 0;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    /* TBD: afr_shd_zero_xattrop? */</div><div class='add'>+</div><div class='add'>+    ret = afr_selfheal_entry_dirent(args-&gt;frame, args-&gt;xl, args-&gt;heal_fd,</div><div class='add'>+                                    entry-&gt;d_name, parent-&gt;inode, subvol,</div><div class='add'>+                                    _gf_false);</div><div class='add'>+    AFR_STACK_RESET(args-&gt;frame);</div><div class='add'>+    if (args-&gt;frame-&gt;local == NULL)</div><div class='add'>+        ret = -ENOTCONN;</div><div class='add'>+</div><div class='add'>+    if (ret == -1)</div><div class='add'>+        args-&gt;mismatch = _gf_true;</div><div class='ctx'> </div><div class='ctx'> out:</div><div class='del'>-	LOCK (&amp;impunge_frame-&gt;lock);</div><div class='del'>-	{</div><div class='del'>-		call_count = --impunge_local-&gt;call_count;</div><div class='del'>-	}</div><div class='del'>-	UNLOCK (&amp;impunge_frame-&gt;lock);</div><div class='del'>-</div><div class='del'>-	if (call_count == 0) {</div><div class='del'>-		AFR_STACK_DESTROY (impunge_frame);</div><div class='del'>-		afr_sh_entry_impunge_entry_done (frame, this, active_src);</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='add'>+    loc_wipe(&amp;loc);</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-afr_sh_entry_impunge_recreate (call_frame_t *impunge_frame, xlator_t *this,</div><div class='del'>-			       int child_index)</div><div class='add'>+static int</div><div class='add'>+afr_selfheal_entry_granular(call_frame_t *frame, xlator_t *this, fd_t *fd,</div><div class='add'>+                            int subvol_idx, gf_boolean_t is_src)</div><div class='ctx'> {</div><div class='del'>-	afr_private_t   *priv = NULL;</div><div class='del'>-	afr_local_t     *impunge_local = NULL;</div><div class='del'>-	afr_self_heal_t *impunge_sh = NULL;</div><div class='del'>-	int              active_src = 0;</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-	priv = this-&gt;private;</div><div class='del'>-	impunge_local = impunge_frame-&gt;local;</div><div class='del'>-	impunge_sh = &amp;impunge_local-&gt;self_heal;</div><div class='del'>-</div><div class='del'>-	active_src = impunge_sh-&gt;active_source;</div><div class='del'>-</div><div class='del'>-	STACK_WIND_COOKIE (impunge_frame,</div><div class='del'>-			   afr_sh_entry_impunge_recreate_lookup_cbk,</div><div class='del'>-			   (void *) (long) child_index,</div><div class='del'>-			   priv-&gt;children[active_src],</div><div class='del'>-			   priv-&gt;children[active_src]-&gt;fops-&gt;lookup,</div><div class='del'>-			   &amp;impunge_local-&gt;loc, 0);</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='add'>+    int ret = 0;</div><div class='add'>+    loc_t loc = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    xlator_t *subvol = NULL;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    afr_granular_esh_args_t args = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+    subvol = priv-&gt;children[subvol_idx];</div><div class='add'>+</div><div class='add'>+    args.frame = afr_copy_frame(frame);</div><div class='add'>+    if (!args.frame)</div><div class='add'>+        goto out;</div><div class='add'>+    args.xl = this;</div><div class='add'>+    /* args.heal_fd represents the fd associated with the original directory</div><div class='add'>+     * on which entry heal is being attempted.</div><div class='add'>+     */</div><div class='add'>+    args.heal_fd = fd;</div><div class='add'>+</div><div class='add'>+    /* @subvol here represents the subvolume of AFR where</div><div class='add'>+     * indices/entry-changes/&lt;pargfid&gt; will be processed</div><div class='add'>+     */</div><div class='add'>+    loc.inode = afr_shd_entry_changes_index_inode(this, subvol,</div><div class='add'>+                                                  fd-&gt;inode-&gt;gfid);</div><div class='add'>+    if (!loc.inode) {</div><div class='add'>+        /* If granular heal failed on the sink (as it might sometimes</div><div class='add'>+         * because it is the src that would mostly contain the granular</div><div class='add'>+         * changelogs and the sink's entry-changes would be empty),</div><div class='add'>+         * do not treat heal as failure.</div><div class='add'>+         */</div><div class='add'>+        if (is_src)</div><div class='add'>+            ret = -errno;</div><div class='add'>+        else</div><div class='add'>+            ret = 0;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-afr_sh_entry_impunge_entry_cbk (call_frame_t *impunge_frame, void *cookie,</div><div class='del'>-				xlator_t *this,</div><div class='del'>-				int32_t op_ret,	int32_t op_errno,</div><div class='del'>-                                inode_t *inode, struct iatt *buf, dict_t *x,</div><div class='del'>-                                struct iatt *postparent)</div><div class='del'>-{</div><div class='del'>-	afr_private_t   *priv = NULL;</div><div class='del'>-	afr_local_t     *impunge_local = NULL;</div><div class='del'>-	afr_self_heal_t *impunge_sh = NULL;</div><div class='del'>-	int              call_count = 0;</div><div class='del'>-	int              child_index = 0;</div><div class='del'>-	call_frame_t    *frame = NULL;</div><div class='del'>-	int              active_src = 0;</div><div class='del'>-</div><div class='del'>-	priv = this-&gt;private;</div><div class='del'>-	impunge_local = impunge_frame-&gt;local;</div><div class='del'>-	impunge_sh = &amp;impunge_local-&gt;self_heal;</div><div class='del'>-	frame = impunge_sh-&gt;sh_frame;</div><div class='del'>-	child_index = (long) cookie;</div><div class='del'>-	active_src = impunge_sh-&gt;active_source;</div><div class='del'>-</div><div class='del'>-	if ((op_ret == -1 &amp;&amp; op_errno == ENOENT)</div><div class='del'>-            || (IA_ISLNK (impunge_sh-&gt;impunging_entry_mode))) {</div><div class='del'>-</div><div class='del'>-                /*</div><div class='del'>-                 * A symlink's target might have changed, so</div><div class='del'>-                 * always go down the recreate path for them.</div><div class='del'>-                 */</div><div class='del'>-</div><div class='del'>-		/* decrease call_count in recreate-callback */</div><div class='del'>-</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_TRACE,</div><div class='del'>-			"missing entry %s on %s",</div><div class='del'>-			impunge_local-&gt;loc.path,</div><div class='del'>-			priv-&gt;children[child_index]-&gt;name);</div><div class='del'>-</div><div class='del'>-		afr_sh_entry_impunge_recreate (impunge_frame, this,</div><div class='del'>-					       child_index);</div><div class='del'>-		return 0;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	if (op_ret == 0) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_TRACE,</div><div class='del'>-			"%s exists under %s",</div><div class='del'>-			impunge_local-&gt;loc.path,</div><div class='del'>-			priv-&gt;children[child_index]-&gt;name);</div><div class='del'>-</div><div class='del'>-                impunge_sh-&gt;parentbuf = *postparent;</div><div class='del'>-	} else {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_TRACE,</div><div class='del'>-			"looking up %s under %s failed (%s)",</div><div class='del'>-			impunge_local-&gt;loc.path,</div><div class='del'>-			priv-&gt;children[child_index]-&gt;name,</div><div class='del'>-			strerror (op_errno));</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	LOCK (&amp;impunge_frame-&gt;lock);</div><div class='del'>-	{</div><div class='del'>-		call_count = --impunge_local-&gt;call_count;</div><div class='del'>-	}</div><div class='del'>-	UNLOCK (&amp;impunge_frame-&gt;lock);</div><div class='del'>-</div><div class='del'>-	if (call_count == 0) {</div><div class='del'>-		AFR_STACK_DESTROY (impunge_frame);</div><div class='del'>-		afr_sh_entry_impunge_entry_done (frame, this, active_src);</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='add'>+    ret = syncop_dir_scan(subvol, &amp;loc, GF_CLIENT_PID_SELF_HEALD, &amp;args,</div><div class='add'>+                          afr_selfheal_entry_granular_dirent);</div><div class='ctx'> </div><div class='add'>+    loc_wipe(&amp;loc);</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-afr_sh_entry_impunge_entry (call_frame_t *frame, xlator_t *this,</div><div class='del'>-			    gf_dirent_t *entry)</div><div class='del'>-{</div><div class='del'>-	afr_private_t   *priv = NULL;</div><div class='del'>-	afr_local_t     *local  = NULL;</div><div class='del'>-	afr_self_heal_t *sh  = NULL;</div><div class='del'>-	int              ret = -1;</div><div class='del'>-	call_frame_t    *impunge_frame = NULL;</div><div class='del'>-	afr_local_t     *impunge_local = NULL;</div><div class='del'>-	afr_self_heal_t *impunge_sh = NULL;</div><div class='del'>-	int              active_src = 0;</div><div class='del'>-	int              i = 0;</div><div class='del'>-	int              call_count = 0;</div><div class='del'>-	int              op_errno = 0;</div><div class='del'>-</div><div class='del'>-	priv = this-&gt;private;</div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-	sh = &amp;local-&gt;self_heal;</div><div class='del'>-</div><div class='del'>-	active_src = sh-&gt;active_source;</div><div class='del'>-</div><div class='del'>-	if ((strcmp (entry-&gt;d_name, ".") == 0)</div><div class='del'>-	    || (strcmp (entry-&gt;d_name, "..") == 0)</div><div class='del'>-            || ((strcmp (local-&gt;loc.path, "/") == 0)</div><div class='del'>-                &amp;&amp; (strcmp (entry-&gt;d_name, GF_REPLICATE_TRASH_DIR) == 0))) {</div><div class='del'>-</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_TRACE,</div><div class='del'>-			"skipping inspection of %s under %s",</div><div class='del'>-			entry-&gt;d_name, local-&gt;loc.path);</div><div class='del'>-		goto out;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	gf_log (this-&gt;name, GF_LOG_TRACE,</div><div class='del'>-		"inspecting existance of %s under %s",</div><div class='del'>-		entry-&gt;d_name, local-&gt;loc.path);</div><div class='del'>-</div><div class='del'>-	impunge_frame = copy_frame (frame);</div><div class='del'>-	if (!impunge_frame) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-			"Out of memory.");</div><div class='del'>-		goto out;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	ALLOC_OR_GOTO (impunge_local, afr_local_t, out);</div><div class='del'>-</div><div class='del'>-	impunge_frame-&gt;local = impunge_local;</div><div class='del'>-	impunge_sh = &amp;impunge_local-&gt;self_heal;</div><div class='del'>-	impunge_sh-&gt;sh_frame = frame;</div><div class='del'>-	impunge_sh-&gt;active_source = active_src;</div><div class='del'>-</div><div class='del'>-        impunge_sh-&gt;impunging_entry_mode =</div><div class='del'>-                st_mode_from_ia (entry-&gt;d_stat.ia_prot, entry-&gt;d_stat.ia_type);</div><div class='del'>-</div><div class='del'>-	ret = build_child_loc (this, &amp;impunge_local-&gt;loc, &amp;local-&gt;loc, entry-&gt;d_name);</div><div class='del'>-	if (ret != 0) {</div><div class='del'>-		goto out;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='del'>-		if (i == active_src)</div><div class='del'>-			continue;</div><div class='del'>-		if (local-&gt;child_up[i] == 0)</div><div class='del'>-			continue;</div><div class='del'>-		if (sh-&gt;sources[i] == 1)</div><div class='del'>-			continue;</div><div class='del'>-		call_count++;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	impunge_local-&gt;call_count = call_count;</div><div class='del'>-</div><div class='del'>-	for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='del'>-		if (i == active_src)</div><div class='del'>-			continue;</div><div class='del'>-		if (local-&gt;child_up[i] == 0)</div><div class='del'>-			continue;</div><div class='del'>-		if (sh-&gt;sources[i] == 1)</div><div class='del'>-			continue;</div><div class='del'>-</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_TRACE,</div><div class='del'>-			"looking up %s on %s", impunge_local-&gt;loc.path,</div><div class='del'>-			priv-&gt;children[i]-&gt;name);</div><div class='del'>-</div><div class='del'>-		STACK_WIND_COOKIE (impunge_frame,</div><div class='del'>-				   afr_sh_entry_impunge_entry_cbk,</div><div class='del'>-				   (void *) (long) i,</div><div class='del'>-				   priv-&gt;children[i],</div><div class='del'>-				   priv-&gt;children[i]-&gt;fops-&gt;lookup,</div><div class='del'>-				   &amp;impunge_local-&gt;loc, 0);</div><div class='del'>-</div><div class='del'>-		if (!--call_count)</div><div class='del'>-			break;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	ret = 0;</div><div class='add'>+    if (args.mismatch == _gf_true)</div><div class='add'>+        ret = -1;</div><div class='ctx'> out:</div><div class='del'>-	if (ret == -1)</div><div class='del'>-		afr_sh_entry_impunge_entry_done (frame, this, active_src);</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='add'>+    if (args.frame)</div><div class='add'>+        AFR_STACK_DESTROY(args.frame);</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-afr_sh_entry_impunge_readdir_cbk (call_frame_t *frame, void *cookie,</div><div class='del'>-				  xlator_t *this,</div><div class='del'>-				  int32_t op_ret, int32_t op_errno,</div><div class='del'>-				  gf_dirent_t *entries)</div><div class='del'>-{</div><div class='del'>-	afr_private_t   *priv = NULL;</div><div class='del'>-	afr_local_t     *local  = NULL;</div><div class='del'>-	afr_self_heal_t *sh  = NULL;</div><div class='del'>-	gf_dirent_t     *entry = NULL;</div><div class='del'>-	off_t            last_offset = 0;</div><div class='del'>-	int              active_src = 0;</div><div class='del'>-	int              entry_count = 0;</div><div class='del'>-</div><div class='del'>-	priv = this-&gt;private;</div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-	sh = &amp;local-&gt;self_heal;</div><div class='del'>-</div><div class='del'>-	active_src = sh-&gt;active_source;</div><div class='del'>-</div><div class='del'>-	if (op_ret &lt;= 0) {</div><div class='del'>-		if (op_ret &lt; 0) {</div><div class='del'>-			gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-				"readdir of %s on subvolume %s failed (%s)",</div><div class='del'>-				local-&gt;loc.path,</div><div class='del'>-				priv-&gt;children[active_src]-&gt;name,</div><div class='del'>-				strerror (op_errno));</div><div class='del'>-		} else {</div><div class='del'>-			gf_log (this-&gt;name, GF_LOG_TRACE,</div><div class='del'>-				"readdir of %s on subvolume %s complete",</div><div class='del'>-				local-&gt;loc.path,</div><div class='del'>-				priv-&gt;children[active_src]-&gt;name);</div><div class='del'>-		}</div><div class='del'>-</div><div class='del'>-		afr_sh_entry_impunge_all (frame, this);</div><div class='del'>-		return 0;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	list_for_each_entry (entry, &amp;entries-&gt;list, list) {</div><div class='del'>-		last_offset = entry-&gt;d_off;</div><div class='del'>-                entry_count++;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	gf_log (this-&gt;name, GF_LOG_TRACE,</div><div class='del'>-		"readdir'ed %d entries from %s",</div><div class='del'>-		entry_count, priv-&gt;children[active_src]-&gt;name);</div><div class='del'>-</div><div class='del'>-	sh-&gt;offset = last_offset;</div><div class='del'>-	local-&gt;call_count = entry_count;</div><div class='del'>-</div><div class='del'>-	list_for_each_entry (entry, &amp;entries-&gt;list, list) {</div><div class='del'>-                afr_sh_entry_impunge_entry (frame, this, entry);</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-				  </div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-afr_sh_entry_impunge_subvol (call_frame_t *frame, xlator_t *this,</div><div class='del'>-			     int active_src)</div><div class='del'>-{</div><div class='del'>-	afr_private_t   *priv = NULL;</div><div class='del'>-	afr_local_t     *local  = NULL;</div><div class='del'>-	afr_self_heal_t *sh  = NULL;</div><div class='del'>-</div><div class='del'>-	priv = this-&gt;private;</div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-	sh = &amp;local-&gt;self_heal;</div><div class='del'>-</div><div class='del'>-	STACK_WIND (frame, afr_sh_entry_impunge_readdir_cbk,</div><div class='del'>-		    priv-&gt;children[active_src],</div><div class='del'>-		    priv-&gt;children[active_src]-&gt;fops-&gt;readdirp,</div><div class='del'>-		    sh-&gt;healing_fd, sh-&gt;block_size, sh-&gt;offset);</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-afr_sh_entry_impunge_all (call_frame_t *frame, xlator_t *this)</div><div class='del'>-{</div><div class='del'>-	afr_private_t   *priv = NULL;</div><div class='del'>-	afr_local_t     *local  = NULL;</div><div class='del'>-	afr_self_heal_t *sh  = NULL;</div><div class='del'>-	int              active_src = -1;</div><div class='del'>-</div><div class='del'>-	priv = this-&gt;private;</div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-	sh = &amp;local-&gt;self_heal;</div><div class='del'>-</div><div class='del'>-	sh-&gt;offset = 0;</div><div class='del'>-</div><div class='del'>-	active_src = next_active_source (frame, this, sh-&gt;active_source);</div><div class='del'>-	sh-&gt;active_source = active_src;</div><div class='del'>-</div><div class='del'>-	if (sh-&gt;op_failed) {</div><div class='del'>-		afr_sh_entry_finish (frame, this);</div><div class='del'>-		return 0;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	if (active_src == -1) {</div><div class='del'>-		/* completed creating missing files on all subvolumes */</div><div class='del'>-		afr_sh_entry_expunge_all (frame, this);</div><div class='del'>-		return 0;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	gf_log (this-&gt;name, GF_LOG_TRACE,</div><div class='del'>-		"impunging entries of %s on %s to other sinks",</div><div class='del'>-		local-&gt;loc.path, priv-&gt;children[active_src]-&gt;name);</div><div class='del'>-</div><div class='del'>-	afr_sh_entry_impunge_subvol (frame, this, active_src);</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-afr_sh_entry_opendir_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-			  int32_t op_ret, int32_t op_errno, fd_t *fd)</div><div class='del'>-{</div><div class='del'>-	afr_local_t     *local = NULL;</div><div class='del'>-	afr_self_heal_t *sh = NULL;</div><div class='del'>-	afr_private_t   *priv = NULL;</div><div class='del'>-	int              call_count = 0;</div><div class='del'>-	int              child_index = 0;</div><div class='del'>-</div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-	sh = &amp;local-&gt;self_heal;</div><div class='del'>-	priv = this-&gt;private;</div><div class='del'>-</div><div class='del'>-	child_index = (long) cookie;</div><div class='del'>-</div><div class='del'>-	/* TODO: some of the open's might fail.</div><div class='del'>-	   In that case, modify cleanup fn to send flush on those </div><div class='del'>-	   fd's which are already open */</div><div class='del'>-</div><div class='del'>-	LOCK (&amp;frame-&gt;lock);</div><div class='del'>-	{</div><div class='del'>-		if (op_ret == -1) {</div><div class='del'>-			gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-				"opendir of %s failed on child %s (%s)",</div><div class='del'>-				local-&gt;loc.path,</div><div class='del'>-				priv-&gt;children[child_index]-&gt;name,</div><div class='del'>-				strerror (op_errno));</div><div class='del'>-			sh-&gt;op_failed = 1;</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='del'>-	UNLOCK (&amp;frame-&gt;lock);</div><div class='del'>-</div><div class='del'>-	call_count = afr_frame_return (frame);</div><div class='del'>-</div><div class='del'>-	if (call_count == 0) {</div><div class='del'>-		if (sh-&gt;op_failed) {</div><div class='del'>-			afr_sh_entry_finish (frame, this);</div><div class='del'>-			return 0;</div><div class='del'>-		}</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_TRACE,</div><div class='del'>-			"fd for %s opened, commencing sync",</div><div class='del'>-			local-&gt;loc.path);</div><div class='del'>-</div><div class='del'>-		sh-&gt;active_source = -1;</div><div class='del'>-		afr_sh_entry_impunge_all (frame, this);</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-afr_sh_entry_open (call_frame_t *frame, xlator_t *this)</div><div class='del'>-{</div><div class='del'>-	int i = 0;				</div><div class='del'>-	int call_count = 0;		     </div><div class='del'>-</div><div class='del'>-	int source = -1;</div><div class='del'>-	int *sources = NULL;</div><div class='del'>-</div><div class='del'>-	fd_t *fd = NULL;</div><div class='del'>-</div><div class='del'>-	afr_local_t *   local = NULL;</div><div class='del'>-	afr_private_t * priv  = NULL;</div><div class='del'>-	afr_self_heal_t *sh = NULL;</div><div class='del'>-</div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-	sh = &amp;local-&gt;self_heal;</div><div class='del'>-	priv = this-&gt;private;</div><div class='del'>-</div><div class='del'>-	source  = local-&gt;self_heal.source;</div><div class='del'>-	sources = local-&gt;self_heal.sources;</div><div class='del'>-</div><div class='del'>-	sh-&gt;block_size = 131072;</div><div class='del'>-	sh-&gt;offset = 0;</div><div class='del'>-</div><div class='del'>-	call_count = sh-&gt;active_sinks;</div><div class='del'>-	if (source != -1)</div><div class='del'>-		call_count++;</div><div class='del'>-</div><div class='del'>-	local-&gt;call_count = call_count;</div><div class='del'>-</div><div class='del'>-	fd = fd_create (local-&gt;loc.inode, frame-&gt;root-&gt;pid);</div><div class='del'>-	sh-&gt;healing_fd = fd;</div><div class='del'>-</div><div class='del'>-	if (source != -1) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_TRACE,</div><div class='del'>-			"opening directory %s on subvolume %s (source)",</div><div class='del'>-			local-&gt;loc.path, priv-&gt;children[source]-&gt;name);</div><div class='del'>-</div><div class='del'>-		/* open source */</div><div class='del'>-		STACK_WIND_COOKIE (frame, afr_sh_entry_opendir_cbk,</div><div class='del'>-				   (void *) (long) source,</div><div class='del'>-				   priv-&gt;children[source],</div><div class='del'>-				   priv-&gt;children[source]-&gt;fops-&gt;opendir,</div><div class='del'>-				   &amp;local-&gt;loc, fd);</div><div class='del'>-		call_count--;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	/* open sinks */</div><div class='del'>-	for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='del'>-		if (sources[i] || !local-&gt;child_up[i])</div><div class='del'>-			continue;</div><div class='del'>-</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_TRACE,</div><div class='del'>-			"opening directory %s on subvolume %s (sink)",</div><div class='del'>-			local-&gt;loc.path, priv-&gt;children[i]-&gt;name);</div><div class='del'>-</div><div class='del'>-		STACK_WIND_COOKIE (frame, afr_sh_entry_opendir_cbk,</div><div class='del'>-				   (void *) (long) i,</div><div class='del'>-				   priv-&gt;children[i], </div><div class='del'>-				   priv-&gt;children[i]-&gt;fops-&gt;opendir,</div><div class='del'>-				   &amp;local-&gt;loc, fd);</div><div class='del'>-</div><div class='del'>-		if (!--call_count)</div><div class='del'>-			break;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-afr_sh_entry_sync_prepare (call_frame_t *frame, xlator_t *this)</div><div class='del'>-{</div><div class='del'>-	afr_local_t     *local = NULL;</div><div class='del'>-	afr_self_heal_t *sh = NULL;</div><div class='del'>-	afr_private_t   *priv = NULL;</div><div class='del'>-	int              active_sinks = 0;</div><div class='del'>-	int              source = 0;</div><div class='del'>-	int              i = 0;</div><div class='del'>-</div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-	sh = &amp;local-&gt;self_heal;</div><div class='del'>-	priv = this-&gt;private;</div><div class='del'>-</div><div class='del'>-	source = sh-&gt;source;</div><div class='del'>-</div><div class='del'>-	for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='del'>-		if (sh-&gt;sources[i] == 0 &amp;&amp; local-&gt;child_up[i] == 1) {</div><div class='del'>-			active_sinks++;</div><div class='del'>-			sh-&gt;success[i] = 1;</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='del'>-	if (source != -1)</div><div class='del'>-		sh-&gt;success[source] = 1;</div><div class='del'>-</div><div class='del'>-	if (active_sinks == 0) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_TRACE,</div><div class='del'>-			"no active sinks for self-heal on dir %s",</div><div class='del'>-			local-&gt;loc.path);</div><div class='del'>-		afr_sh_entry_finish (frame, this);</div><div class='del'>-		return 0;</div><div class='del'>-	}</div><div class='del'>-	if (source == -1 &amp;&amp; active_sinks &lt; 2) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_TRACE,</div><div class='del'>-			"cannot sync with 0 sources and 1 sink on dir %s",</div><div class='del'>-			local-&gt;loc.path);</div><div class='del'>-		afr_sh_entry_finish (frame, this);</div><div class='del'>-		return 0;</div><div class='del'>-	}</div><div class='del'>-	sh-&gt;active_sinks = active_sinks;</div><div class='del'>-</div><div class='del'>-	if (source != -1)</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-			"self-healing directory %s from subvolume %s to "</div><div class='del'>-                        "%d other",</div><div class='del'>-			local-&gt;loc.path, priv-&gt;children[source]-&gt;name,</div><div class='del'>-			active_sinks);</div><div class='del'>-	else</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-			"no active sources for %s found. "</div><div class='del'>-			"merging all entries as a conservative decision",</div><div class='del'>-			local-&gt;loc.path);</div><div class='del'>-</div><div class='del'>-	afr_sh_entry_open (frame, this);</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-afr_sh_entry_fix (call_frame_t *frame, xlator_t *this)</div><div class='add'>+static int</div><div class='add'>+afr_selfheal_entry_do(call_frame_t *frame, xlator_t *this, fd_t *fd, int source,</div><div class='add'>+                      unsigned char *sources, unsigned char *healed_sinks)</div><div class='ctx'> {</div><div class='del'>-	afr_local_t     *local = NULL;</div><div class='del'>-	afr_self_heal_t *sh = NULL;</div><div class='del'>-	afr_private_t   *priv = NULL;</div><div class='del'>-	int              source = 0;</div><div class='del'>-</div><div class='del'>-        int nsources = 0;</div><div class='del'>-</div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-	sh = &amp;local-&gt;self_heal;</div><div class='del'>-	priv = this-&gt;private;</div><div class='del'>-</div><div class='del'>-        if (sh-&gt;forced_merge) {</div><div class='del'>-                sh-&gt;source = -1;</div><div class='del'>-                goto heal;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-	afr_sh_build_pending_matrix (priv, sh-&gt;pending_matrix, sh-&gt;xattr, </div><div class='del'>-				     priv-&gt;child_count, AFR_ENTRY_TRANSACTION);</div><div class='del'>-</div><div class='del'>-	afr_sh_print_pending_matrix (sh-&gt;pending_matrix, this);</div><div class='del'>-</div><div class='del'>-	nsources = afr_sh_mark_sources (sh, priv-&gt;child_count,</div><div class='del'>-                                        AFR_SELF_HEAL_ENTRY);</div><div class='del'>-</div><div class='del'>-        if (nsources == 0) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_TRACE,</div><div class='del'>-                        "No self-heal needed for %s",</div><div class='del'>-                        local-&gt;loc.path);</div><div class='add'>+    int i = 0;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    gf_boolean_t mismatch = _gf_false;</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+</div><div class='add'>+    gf_msg(this-&gt;name, GF_LOG_INFO, 0, AFR_MSG_SELF_HEAL_INFO,</div><div class='add'>+           "performing entry selfheal on %s", uuid_utoa(fd-&gt;inode-&gt;gfid));</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+        /* Expunge */</div><div class='add'>+        if (!healed_sinks[i])</div><div class='add'>+            continue;</div><div class='add'>+</div><div class='add'>+        if (!local-&gt;need_full_crawl)</div><div class='add'>+            /* Why call afr_selfheal_entry_granular() on a "healed sink",</div><div class='add'>+             * given that it is the source that contains the granular</div><div class='add'>+             * indices?</div><div class='add'>+             * If the index for this directory is non-existent or empty on</div><div class='add'>+             * this subvol (=&gt; clear sink), then it will return early</div><div class='add'>+             * without failure status.</div><div class='add'>+             * If the index is non-empty and it is yet a 'healed sink', then</div><div class='add'>+             * it is due to a split-brain in which case we anyway need to</div><div class='add'>+             * crawl the indices/entry-changes/pargfid directory.</div><div class='add'>+             */</div><div class='add'>+            ret = afr_selfheal_entry_granular(frame, this, fd, i, _gf_false);</div><div class='add'>+        else</div><div class='add'>+            ret = afr_selfheal_entry_do_subvol(frame, this, fd, i);</div><div class='ctx'> </div><div class='del'>-                afr_sh_entry_finish (frame, this);</div><div class='del'>-                return 0;</div><div class='add'>+        if (ret == -1) {</div><div class='add'>+            /* gfid or type mismatch. */</div><div class='add'>+            mismatch = _gf_true;</div><div class='add'>+            ret = 0;</div><div class='ctx'>         }</div><div class='add'>+        if (ret)</div><div class='add'>+            break;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	afr_sh_supress_errenous_children (sh-&gt;sources, sh-&gt;child_errno,</div><div class='del'>-					  priv-&gt;child_count);</div><div class='del'>-</div><div class='del'>-	source = afr_sh_select_source (sh-&gt;sources, priv-&gt;child_count);</div><div class='del'>-</div><div class='del'>-        sh-&gt;source = source;</div><div class='del'>-</div><div class='del'>-heal:</div><div class='del'>-	afr_sh_entry_sync_prepare (frame, this);</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-afr_sh_entry_lookup_cbk (call_frame_t *frame, void *cookie,</div><div class='del'>-			 xlator_t *this, int32_t op_ret, int32_t op_errno,</div><div class='del'>-                         inode_t *inode, struct iatt *buf, dict_t *xattr,</div><div class='del'>-                         struct iatt *postparent)</div><div class='del'>-{</div><div class='del'>-	afr_local_t     *local = NULL;</div><div class='del'>-	afr_self_heal_t *sh = NULL;</div><div class='del'>-</div><div class='del'>-	int call_count  = -1;</div><div class='del'>-	int child_index = (long) cookie;</div><div class='del'>-</div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-	sh = &amp;local-&gt;self_heal;</div><div class='del'>-</div><div class='del'>-	LOCK (&amp;frame-&gt;lock);</div><div class='del'>-	{</div><div class='del'>-		if (op_ret != -1) {</div><div class='del'>-			sh-&gt;xattr[child_index] = dict_ref (xattr);</div><div class='del'>-			sh-&gt;buf[child_index] = *buf;</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='del'>-	UNLOCK (&amp;frame-&gt;lock);</div><div class='del'>-</div><div class='del'>-	call_count = afr_frame_return (frame);</div><div class='del'>-</div><div class='del'>-	if (call_count == 0) {</div><div class='del'>-		afr_sh_entry_fix (frame, this);</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='add'>+    if (!ret &amp;&amp; source != -1) {</div><div class='add'>+        /* Impunge */</div><div class='add'>+        if (local-&gt;need_full_crawl)</div><div class='add'>+            ret = afr_selfheal_entry_do_subvol(frame, this, fd, source);</div><div class='add'>+        else</div><div class='add'>+            ret = afr_selfheal_entry_granular(frame, this, fd, source,</div><div class='add'>+                                              _gf_true);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (mismatch == _gf_true)</div><div class='add'>+        /* undo pending will be skipped */</div><div class='add'>+        ret = -1;</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-afr_sh_entry_lookup (call_frame_t *frame, xlator_t *this)</div><div class='add'>+static int</div><div class='add'>+__afr_selfheal_entry(call_frame_t *frame, xlator_t *this, fd_t *fd,</div><div class='add'>+                     unsigned char *locked_on)</div><div class='ctx'> {</div><div class='del'>-	afr_local_t    *  local = NULL;</div><div class='del'>-	afr_private_t  *  priv  = NULL;</div><div class='del'>-	dict_t         *xattr_req = NULL;</div><div class='del'>-	int ret = 0;</div><div class='del'>-	int call_count = 0;</div><div class='del'>-	int i = 0;</div><div class='del'>-</div><div class='del'>-	priv  = this-&gt;private;</div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-</div><div class='del'>-	call_count = afr_up_children_count (priv-&gt;child_count,</div><div class='del'>-                                            local-&gt;child_up);</div><div class='del'>-</div><div class='del'>-	local-&gt;call_count = call_count;</div><div class='del'>-</div><div class='del'>-	xattr_req = dict_new();</div><div class='del'>-	if (xattr_req) {</div><div class='del'>-                for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='del'>-                        ret = dict_set_uint64 (xattr_req,</div><div class='del'>-                                               priv-&gt;pending_key[i],</div><div class='del'>-                                               3 * sizeof(int32_t));</div><div class='del'>-                        if (ret &lt; 0)</div><div class='del'>-                                gf_log (this-&gt;name, GF_LOG_WARNING,</div><div class='del'>-                                        "Unable to set dict value.");</div><div class='del'>-                }</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int source = -1;</div><div class='add'>+    unsigned char *sources = NULL;</div><div class='add'>+    unsigned char *sinks = NULL;</div><div class='add'>+    unsigned char *data_lock = NULL;</div><div class='add'>+    unsigned char *postop_lock = NULL;</div><div class='add'>+    unsigned char *healed_sinks = NULL;</div><div class='add'>+    unsigned char *undid_pending = NULL;</div><div class='add'>+    struct afr_reply *locked_replies = NULL;</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    gf_boolean_t did_sh = _gf_true;</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+</div><div class='add'>+    sources = alloca0(priv-&gt;child_count);</div><div class='add'>+    sinks = alloca0(priv-&gt;child_count);</div><div class='add'>+    healed_sinks = alloca0(priv-&gt;child_count);</div><div class='add'>+    undid_pending = alloca0(priv-&gt;child_count);</div><div class='add'>+    data_lock = alloca0(priv-&gt;child_count);</div><div class='add'>+    postop_lock = alloca0(priv-&gt;child_count);</div><div class='add'>+</div><div class='add'>+    locked_replies = alloca0(sizeof(*locked_replies) * priv-&gt;child_count);</div><div class='add'>+</div><div class='add'>+    ret = afr_selfheal_entrylk(frame, this, fd-&gt;inode, this-&gt;name, NULL,</div><div class='add'>+                               data_lock);</div><div class='add'>+    {</div><div class='add'>+        if (ret &lt; priv-&gt;child_count) {</div><div class='add'>+            gf_msg_debug(this-&gt;name, 0,</div><div class='add'>+                         "%s: Skipping "</div><div class='add'>+                         "entry self-heal as only %d sub-volumes could "</div><div class='add'>+                         "be locked in %s domain",</div><div class='add'>+                         uuid_utoa(fd-&gt;inode-&gt;gfid), ret, this-&gt;name);</div><div class='add'>+            ret = -ENOTCONN;</div><div class='add'>+            goto unlock;</div><div class='ctx'>         }</div><div class='ctx'> </div><div class='del'>-	for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='del'>-		if (local-&gt;child_up[i]) {</div><div class='del'>-			STACK_WIND_COOKIE (frame,</div><div class='del'>-					   afr_sh_entry_lookup_cbk,</div><div class='del'>-					   (void *) (long) i,</div><div class='del'>-					   priv-&gt;children[i],</div><div class='del'>-					   priv-&gt;children[i]-&gt;fops-&gt;lookup,</div><div class='del'>-					   &amp;local-&gt;loc, xattr_req);</div><div class='del'>-			if (!--call_count)</div><div class='del'>-				break;</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	if (xattr_req)</div><div class='del'>-		dict_unref (xattr_req);</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-afr_sh_post_nonblocking_entry_cbk (call_frame_t *frame, xlator_t *this)</div><div class='del'>-{</div><div class='del'>-        afr_internal_lock_t *int_lock = NULL;</div><div class='del'>-        afr_local_t         *local    = NULL;</div><div class='del'>-</div><div class='del'>-        local    = frame-&gt;local;</div><div class='del'>-        int_lock = &amp;local-&gt;internal_lock;</div><div class='del'>-</div><div class='del'>-        if (int_lock-&gt;lock_op_ret &lt; 0) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-                        "Non Blocking entrylks failed.");</div><div class='del'>-                afr_sh_entry_done (frame, this);</div><div class='del'>-        } else {</div><div class='add'>+        ret = __afr_selfheal_entry_prepare(frame, this, fd-&gt;inode, data_lock,</div><div class='add'>+                                           sources, sinks, healed_sinks,</div><div class='add'>+                                           locked_replies, &amp;source, NULL);</div><div class='add'>+        if (AFR_COUNT(healed_sinks, priv-&gt;child_count) == 0) {</div><div class='add'>+            did_sh = _gf_false;</div><div class='add'>+            goto unlock;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-                        "Non Blocking entrylks done. Proceeding to FOP");</div><div class='del'>-                afr_sh_entry_lookup(frame, this);</div><div class='add'>+        local-&gt;need_full_crawl = afr_need_full_heal(</div><div class='add'>+            this, locked_replies, source, healed_sinks, AFR_ENTRY_TRANSACTION);</div><div class='add'>+    }</div><div class='add'>+unlock:</div><div class='add'>+    afr_selfheal_unentrylk(frame, this, fd-&gt;inode, this-&gt;name, NULL, data_lock,</div><div class='add'>+                           NULL);</div><div class='add'>+    if (ret &lt; 0)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    if (!did_sh)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    ret = afr_selfheal_entry_do(frame, this, fd, source, sources, healed_sinks);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    /* Take entrylks in xlator domain before doing post-op (undo-pending) in</div><div class='add'>+     * entry self-heal. This is to prevent a parallel name self-heal on</div><div class='add'>+     * an entry under @fd-&gt;inode from reading pending xattrs while it is</div><div class='add'>+     * being modified by SHD after entry sh below, given that</div><div class='add'>+     * name self-heal takes locks ONLY in xlator domain and is free to read</div><div class='add'>+     * pending changelog in the absence of the following locking.</div><div class='add'>+     */</div><div class='add'>+    ret = afr_selfheal_entrylk(frame, this, fd-&gt;inode, this-&gt;name, NULL,</div><div class='add'>+                               postop_lock);</div><div class='add'>+    {</div><div class='add'>+        if (AFR_CMP(data_lock, postop_lock, priv-&gt;child_count) != 0) {</div><div class='add'>+            gf_msg_debug(this-&gt;name, 0,</div><div class='add'>+                         "%s: Skipping "</div><div class='add'>+                         "post-op after entry self-heal as %d "</div><div class='add'>+                         "sub-volumes, as opposed to %d, "</div><div class='add'>+                         "could be locked in %s domain",</div><div class='add'>+                         uuid_utoa(fd-&gt;inode-&gt;gfid), ret,</div><div class='add'>+                         AFR_COUNT(data_lock, priv-&gt;child_count), this-&gt;name);</div><div class='add'>+            ret = -ENOTCONN;</div><div class='add'>+            goto postop_unlock;</div><div class='ctx'>         }</div><div class='ctx'> </div><div class='del'>-        return 0;</div><div class='add'>+        afr_selfheal_restore_time(frame, this, fd-&gt;inode, source, healed_sinks,</div><div class='add'>+                                  locked_replies);</div><div class='add'>+        ret = afr_selfheal_undo_pending(</div><div class='add'>+            frame, this, fd-&gt;inode, sources, sinks, healed_sinks, undid_pending,</div><div class='add'>+            AFR_ENTRY_TRANSACTION, locked_replies, postop_lock);</div><div class='add'>+    }</div><div class='add'>+postop_unlock:</div><div class='add'>+    afr_selfheal_unentrylk(frame, this, fd-&gt;inode, this-&gt;name, NULL,</div><div class='add'>+                           postop_lock, NULL);</div><div class='add'>+out:</div><div class='add'>+    if (did_sh)</div><div class='add'>+        afr_log_selfheal(fd-&gt;inode-&gt;gfid, this, ret, "entry", source, sources,</div><div class='add'>+                         healed_sinks);</div><div class='add'>+    else</div><div class='add'>+        ret = 1;</div><div class='add'>+</div><div class='add'>+    if (locked_replies)</div><div class='add'>+        afr_replies_wipe(locked_replies, priv-&gt;child_count);</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-afr_sh_entry_lock (call_frame_t *frame, xlator_t *this)</div><div class='add'>+static fd_t *</div><div class='add'>+afr_selfheal_data_opendir(xlator_t *this, inode_t *inode)</div><div class='ctx'> {</div><div class='del'>-        afr_internal_lock_t *int_lock = NULL;</div><div class='del'>-        afr_local_t         *local    = NULL;</div><div class='del'>-</div><div class='del'>-        local    = frame-&gt;local;</div><div class='del'>-        int_lock = &amp;local-&gt;internal_lock;</div><div class='del'>-</div><div class='del'>-        int_lock-&gt;transaction_lk_type = AFR_SELFHEAL_LK;</div><div class='del'>-        int_lock-&gt;selfheal_lk_type    = AFR_ENTRY_SELF_HEAL_LK;</div><div class='del'>-</div><div class='del'>-        afr_set_lock_number (frame, this);</div><div class='del'>-</div><div class='del'>-        int_lock-&gt;lk_basename = NULL;</div><div class='del'>-        int_lock-&gt;lk_loc      = &amp;local-&gt;loc;</div><div class='del'>-        int_lock-&gt;lock_cbk    = afr_sh_post_nonblocking_entry_cbk;</div><div class='del'>-</div><div class='del'>-        afr_nonblocking_entrylk (frame, this);</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='add'>+    loc_t loc = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int ret = 0;</div><div class='add'>+    fd_t *fd = NULL;</div><div class='add'>+</div><div class='add'>+    fd = fd_create(inode, 0);</div><div class='add'>+    if (!fd)</div><div class='add'>+        return NULL;</div><div class='add'>+</div><div class='add'>+    loc.inode = inode_ref(inode);</div><div class='add'>+    gf_uuid_copy(loc.gfid, inode-&gt;gfid);</div><div class='add'>+</div><div class='add'>+    ret = syncop_opendir(this, &amp;loc, fd, NULL, NULL);</div><div class='add'>+    if (ret) {</div><div class='add'>+        fd_unref(fd);</div><div class='add'>+        fd = NULL;</div><div class='add'>+    } else {</div><div class='add'>+        fd_bind(fd);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    loc_wipe(&amp;loc);</div><div class='add'>+    return fd;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-afr_self_heal_entry (call_frame_t *frame, xlator_t *this)</div><div class='add'>+afr_selfheal_entry(call_frame_t *frame, xlator_t *this, inode_t *inode)</div><div class='ctx'> {</div><div class='del'>-	afr_local_t   *local = NULL;</div><div class='del'>-	afr_private_t   *priv = NULL;</div><div class='del'>-</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    unsigned char *locked_on = NULL;</div><div class='add'>+    fd_t *fd = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    fd = afr_selfheal_data_opendir(this, inode);</div><div class='add'>+    if (!fd)</div><div class='add'>+        return -EIO;</div><div class='add'>+</div><div class='add'>+    locked_on = alloca0(priv-&gt;child_count);</div><div class='add'>+</div><div class='add'>+    ret = afr_selfheal_tie_breaker_entrylk(frame, this, inode, priv-&gt;sh_domain,</div><div class='add'>+                                           NULL, locked_on);</div><div class='add'>+    {</div><div class='add'>+        if (ret &lt; priv-&gt;child_count) {</div><div class='add'>+            gf_msg_debug(this-&gt;name, 0,</div><div class='add'>+                         "%s: Skipping "</div><div class='add'>+                         "entry self-heal as only %d sub-volumes could "</div><div class='add'>+                         "be locked in %s domain",</div><div class='add'>+                         uuid_utoa(fd-&gt;inode-&gt;gfid), ret, priv-&gt;sh_domain);</div><div class='add'>+            /* Either less than two subvols available, or another</div><div class='add'>+               selfheal (from another server) is in progress. Skip</div><div class='add'>+               for now in any case there isn't anything to do.</div><div class='add'>+            */</div><div class='add'>+            ret = -ENOTCONN;</div><div class='add'>+            goto unlock;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-	priv = this-&gt;private;</div><div class='del'>-	local = frame-&gt;local;</div><div class='add'>+        ret = __afr_selfheal_entry(frame, this, fd, locked_on);</div><div class='add'>+    }</div><div class='add'>+unlock:</div><div class='add'>+    afr_selfheal_unentrylk(frame, this, inode, priv-&gt;sh_domain, NULL, locked_on,</div><div class='add'>+                           NULL);</div><div class='ctx'> </div><div class='del'>-	if (local-&gt;self_heal.need_entry_self_heal &amp;&amp; priv-&gt;entry_self_heal) {</div><div class='del'>-		afr_sh_entry_lock (frame, this);</div><div class='del'>-	} else {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_TRACE,</div><div class='del'>-			"proceeding to completion on %s",</div><div class='del'>-			local-&gt;loc.path);</div><div class='del'>-		afr_sh_entry_done (frame, this);</div><div class='del'>-	}</div><div class='add'>+    if (fd)</div><div class='add'>+        fd_unref(fd);</div><div class='ctx'> </div><div class='del'>-	return 0;</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='del'>-</div><div class='head'>diff --git a/xlators/cluster/afr/src/afr-self-heal-metadata.c b/xlators/cluster/afr/src/afr-self-heal-metadata.c<br/>index 7087c57eb6c..03f43bad16e 100644<br/>--- a/<a href='/cgit/glusterfs.git/tree/xlators/cluster/afr/src/afr-self-heal-metadata.c?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/cluster/afr/src/afr-self-heal-metadata.c</a><br/>+++ b/<a href='/cgit/glusterfs.git/tree/xlators/cluster/afr/src/afr-self-heal-metadata.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>xlators/cluster/afr/src/afr-self-heal-metadata.c</a></div><div class='hunk'>@@ -1,731 +1,546 @@</div><div class='ctx'> /*</div><div class='del'>-   Copyright (c) 2008-2009 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='del'>-   This file is part of GlusterFS.</div><div class='del'>-</div><div class='del'>-   GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-   it under the terms of the GNU General Public License as published</div><div class='del'>-   by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-   or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-   GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-   WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-   General Public License for more details.</div><div class='del'>-</div><div class='del'>-   You should have received a copy of the GNU General Public License</div><div class='del'>-   along with this program.  If not, see</div><div class='del'>-   &lt;http://www.gnu.org/licenses/&gt;.</div><div class='del'>-*/</div><div class='del'>-</div><div class='del'>-#include &lt;libgen.h&gt;</div><div class='del'>-#include &lt;unistd.h&gt;</div><div class='del'>-#include &lt;fnmatch.h&gt;</div><div class='del'>-#include &lt;sys/time.h&gt;</div><div class='del'>-#include &lt;stdlib.h&gt;</div><div class='del'>-#include &lt;signal.h&gt;</div><div class='add'>+  Copyright (c) 2013 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='ctx'> </div><div class='del'>-#ifndef _CONFIG_H</div><div class='del'>-#define _CONFIG_H</div><div class='del'>-#include "config.h"</div><div class='del'>-#endif</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='ctx'> </div><div class='del'>-#include "glusterfs.h"</div><div class='ctx'> #include "afr.h"</div><div class='del'>-#include "dict.h"</div><div class='del'>-#include "xlator.h"</div><div class='del'>-#include "hashfn.h"</div><div class='del'>-#include "logging.h"</div><div class='del'>-#include "stack.h"</div><div class='del'>-#include "list.h"</div><div class='del'>-#include "call-stub.h"</div><div class='del'>-#include "defaults.h"</div><div class='del'>-#include "common-utils.h"</div><div class='del'>-#include "compat-errno.h"</div><div class='del'>-#include "compat.h"</div><div class='del'>-#include "byte-order.h"</div><div class='del'>-</div><div class='del'>-#include "afr-transaction.h"</div><div class='ctx'> #include "afr-self-heal.h"</div><div class='del'>-#include "afr-self-heal-common.h"</div><div class='add'>+#include &lt;glusterfs/byte-order.h&gt;</div><div class='add'>+#include "protocol-common.h"</div><div class='add'>+#include &lt;glusterfs/events.h&gt;</div><div class='ctx'> </div><div class='add'>+#define AFR_HEAL_ATTR (GF_SET_ATTR_UID | GF_SET_ATTR_GID | GF_SET_ATTR_MODE)</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-afr_sh_metadata_done (call_frame_t *frame, xlator_t *this)</div><div class='add'>+static gf_boolean_t</div><div class='add'>+_afr_ignorable_key_match(dict_t *d, char *k, data_t *val, void *mdata)</div><div class='ctx'> {</div><div class='del'>-	afr_local_t     *local = NULL;</div><div class='del'>-	afr_self_heal_t *sh = NULL;</div><div class='del'>-	afr_private_t   *priv = NULL;</div><div class='del'>-	int              i = 0;</div><div class='del'>-</div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-	sh = &amp;local-&gt;self_heal;</div><div class='del'>-	priv = this-&gt;private;</div><div class='del'>-</div><div class='del'>-//	memset (sh-&gt;child_errno, 0, sizeof (int) * priv-&gt;child_count);</div><div class='del'>-	memset (sh-&gt;buf, 0, sizeof (struct stat) * priv-&gt;child_count);</div><div class='del'>-	memset (sh-&gt;success, 0, sizeof (int) * priv-&gt;child_count);</div><div class='del'>-</div><div class='del'>-/*         for (i = 0; i &lt; priv-&gt;child_count; i++) { */</div><div class='del'>-/*                 sh-&gt;locked_nodes[i] = 1; */</div><div class='del'>-/*         } */</div><div class='del'>-</div><div class='del'>-	for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='del'>-		if (sh-&gt;xattr[i])</div><div class='del'>-			dict_unref (sh-&gt;xattr[i]);</div><div class='del'>-		sh-&gt;xattr[i] = NULL;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	if (local-&gt;govinda_gOvinda) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-			"aborting selfheal of %s",</div><div class='del'>-			local-&gt;loc.path);</div><div class='del'>-		sh-&gt;completion_cbk (frame, this);</div><div class='del'>-	} else {</div><div class='del'>-		if (IA_ISREG (sh-&gt;type)) {</div><div class='del'>-			gf_log (this-&gt;name, GF_LOG_TRACE,</div><div class='del'>-				"proceeding to data check on %s",</div><div class='del'>-				local-&gt;loc.path);</div><div class='del'>-			afr_self_heal_data (frame, this);</div><div class='del'>-			return 0;</div><div class='del'>-		}</div><div class='del'>-</div><div class='del'>-		if (IA_ISDIR (sh-&gt;type)) {</div><div class='del'>-			gf_log (this-&gt;name, GF_LOG_TRACE,</div><div class='del'>-				"proceeding to entry check on %s",</div><div class='del'>-				local-&gt;loc.path);</div><div class='del'>-			afr_self_heal_entry (frame, this);</div><div class='del'>-			return 0;</div><div class='del'>-		}</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-			"completed self heal of %s",</div><div class='del'>-			local-&gt;loc.path);</div><div class='del'>-</div><div class='del'>-		sh-&gt;completion_cbk (frame, this);</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='add'>+    return afr_is_xattr_ignorable(k);</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-afr_sh_metadata_unlck_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-			   int32_t op_ret, int32_t op_errno)</div><div class='add'>+void</div><div class='add'>+afr_delete_ignorable_xattrs(dict_t *xattr)</div><div class='ctx'> {</div><div class='del'>-	int               call_count = 0;</div><div class='del'>-</div><div class='del'>-	call_count = afr_frame_return (frame);</div><div class='del'>-</div><div class='del'>-	if (call_count == 0)</div><div class='del'>-		afr_sh_metadata_done (frame, this);</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='add'>+    dict_foreach_match(xattr, _afr_ignorable_key_match, NULL,</div><div class='add'>+                       dict_remove_foreach_fn, NULL);</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-afr_sh_inode_unlock (call_frame_t *frame, xlator_t *this)</div><div class='add'>+__afr_selfheal_metadata_do(call_frame_t *frame, xlator_t *this, inode_t *inode,</div><div class='add'>+                           int source, unsigned char *healed_sinks,</div><div class='add'>+                           struct afr_reply *locked_replies)</div><div class='ctx'> {</div><div class='del'>-        afr_internal_lock_t *int_lock = NULL;</div><div class='del'>-        afr_local_t         *local    = NULL;</div><div class='del'>-</div><div class='del'>-        local    = frame-&gt;local;</div><div class='del'>-        int_lock = &amp;local-&gt;internal_lock;</div><div class='del'>-</div><div class='del'>-        int_lock-&gt;lock_cbk = afr_sh_metadata_done;</div><div class='del'>-        afr_unlock (frame, this);</div><div class='del'>-</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-afr_sh_metadata_finish (call_frame_t *frame, xlator_t *this)</div><div class='del'>-{</div><div class='del'>-        afr_sh_inode_unlock (frame, this);</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-afr_sh_metadata_erase_pending_cbk (call_frame_t *frame, void *cookie,</div><div class='del'>-				   xlator_t *this, int32_t op_ret,</div><div class='del'>-				   int32_t op_errno, dict_t *xattr)</div><div class='del'>-{</div><div class='del'>-	afr_local_t     *local = NULL;</div><div class='del'>-	int             call_count = 0;</div><div class='del'>-</div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-</div><div class='del'>-	LOCK (&amp;frame-&gt;lock);</div><div class='del'>-	{</div><div class='del'>-	}</div><div class='del'>-	UNLOCK (&amp;frame-&gt;lock);</div><div class='del'>-</div><div class='del'>-	call_count = afr_frame_return (frame);</div><div class='add'>+    int ret = -1;</div><div class='add'>+    loc_t loc = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    dict_t *xattr = NULL;</div><div class='add'>+    dict_t *old_xattr = NULL;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    int i = 0;</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    loc.inode = inode_ref(inode);</div><div class='add'>+    gf_uuid_copy(loc.gfid, inode-&gt;gfid);</div><div class='add'>+</div><div class='add'>+    gf_msg(this-&gt;name, GF_LOG_INFO, 0, AFR_MSG_SELF_HEAL_INFO,</div><div class='add'>+           "performing metadata selfheal on %s", uuid_utoa(inode-&gt;gfid));</div><div class='add'>+</div><div class='add'>+    ret = syncop_getxattr(priv-&gt;children[source], &amp;loc, &amp;xattr, NULL, NULL,</div><div class='add'>+                          NULL);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        ret = -EIO;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    afr_delete_ignorable_xattrs(xattr);</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+        if (old_xattr) {</div><div class='add'>+            dict_unref(old_xattr);</div><div class='add'>+            old_xattr = NULL;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-	if (call_count == 0)</div><div class='del'>-		afr_sh_metadata_finish (frame, this);</div><div class='add'>+        if (!healed_sinks[i])</div><div class='add'>+            continue;</div><div class='add'>+</div><div class='add'>+        ret = syncop_setattr(priv-&gt;children[i], &amp;loc,</div><div class='add'>+                             &amp;locked_replies[source].poststat, AFR_HEAL_ATTR,</div><div class='add'>+                             NULL, NULL, NULL, NULL);</div><div class='add'>+        if (ret)</div><div class='add'>+            healed_sinks[i] = 0;</div><div class='add'>+</div><div class='add'>+        ret = syncop_getxattr(priv-&gt;children[i], &amp;loc, &amp;old_xattr, 0, NULL,</div><div class='add'>+                              NULL);</div><div class='add'>+        if (old_xattr) {</div><div class='add'>+            afr_delete_ignorable_xattrs(old_xattr);</div><div class='add'>+            ret = syncop_removexattr(priv-&gt;children[i], &amp;loc, "", old_xattr,</div><div class='add'>+                                     NULL);</div><div class='add'>+            if (ret)</div><div class='add'>+                healed_sinks[i] = 0;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='add'>+        ret = syncop_setxattr(priv-&gt;children[i], &amp;loc, xattr, 0, NULL, NULL);</div><div class='add'>+        if (ret)</div><div class='add'>+            healed_sinks[i] = 0;</div><div class='add'>+    }</div><div class='add'>+    ret = 0;</div><div class='ctx'> </div><div class='add'>+out:</div><div class='add'>+    loc_wipe(&amp;loc);</div><div class='add'>+    if (xattr)</div><div class='add'>+        dict_unref(xattr);</div><div class='add'>+    if (old_xattr)</div><div class='add'>+        dict_unref(old_xattr);</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-afr_sh_metadata_erase_pending (call_frame_t *frame, xlator_t *this)</div><div class='del'>-{</div><div class='del'>-	afr_local_t     *local = NULL;</div><div class='del'>-	afr_self_heal_t *sh = NULL;</div><div class='del'>-	afr_private_t   *priv = NULL;</div><div class='del'>-	int              call_count = 0;</div><div class='del'>-	int              i = 0;</div><div class='del'>-	dict_t          **erase_xattr = NULL;</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-	sh = &amp;local-&gt;self_heal;</div><div class='del'>-	priv = this-&gt;private;</div><div class='del'>-</div><div class='del'>-	afr_sh_pending_to_delta (priv, sh-&gt;xattr, sh-&gt;delta_matrix, </div><div class='del'>-                                 sh-&gt;success, priv-&gt;child_count,</div><div class='del'>-                                 AFR_METADATA_TRANSACTION);</div><div class='del'>-</div><div class='del'>-	erase_xattr = GF_CALLOC (sizeof (*erase_xattr), priv-&gt;child_count,</div><div class='del'>-                                 gf_afr_mt_dict_t);</div><div class='del'>-</div><div class='del'>-	for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='del'>-		if (sh-&gt;xattr[i]) {</div><div class='del'>-			call_count++;</div><div class='del'>-</div><div class='del'>-			erase_xattr[i] = get_new_dict();</div><div class='del'>-			dict_ref (erase_xattr[i]);</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	afr_sh_delta_to_xattr (priv, sh-&gt;delta_matrix, erase_xattr,</div><div class='del'>-			       priv-&gt;child_count, AFR_METADATA_TRANSACTION);</div><div class='del'>-</div><div class='del'>-	local-&gt;call_count = call_count;</div><div class='del'>-</div><div class='del'>-	if (call_count == 0) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_WARNING,</div><div class='del'>-			"metadata of %s not healed on any subvolume",</div><div class='del'>-			local-&gt;loc.path);</div><div class='del'>-</div><div class='del'>-		afr_sh_metadata_finish (frame, this);</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='del'>-		if (!erase_xattr[i])</div><div class='del'>-			continue;</div><div class='del'>-</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_TRACE,</div><div class='del'>-			"erasing pending flags from %s on %s",</div><div class='del'>-			local-&gt;loc.path, priv-&gt;children[i]-&gt;name);</div><div class='del'>-</div><div class='del'>-		STACK_WIND_COOKIE (frame, afr_sh_metadata_erase_pending_cbk,</div><div class='del'>-				   (void *) (long) i,</div><div class='del'>-				   priv-&gt;children[i],</div><div class='del'>-				   priv-&gt;children[i]-&gt;fops-&gt;xattrop,</div><div class='del'>-				   &amp;local-&gt;loc,</div><div class='del'>-				   GF_XATTROP_ADD_ARRAY, erase_xattr[i]);</div><div class='del'>-		if (!--call_count)</div><div class='del'>-			break;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='del'>-		if (erase_xattr[i]) {</div><div class='del'>-			dict_unref (erase_xattr[i]);</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='del'>-	GF_FREE (erase_xattr);</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-afr_sh_metadata_sync_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-			  int32_t op_ret, int32_t op_errno)</div><div class='add'>+static uint64_t</div><div class='add'>+mtime_ns(struct iatt *ia)</div><div class='ctx'> {</div><div class='del'>-	afr_local_t     *local = NULL;</div><div class='del'>-	afr_self_heal_t *sh = NULL;</div><div class='del'>-	afr_private_t   *priv = NULL;</div><div class='del'>-	int              call_count = 0;</div><div class='del'>-	int              child_index = 0;</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-	sh = &amp;local-&gt;self_heal;</div><div class='del'>-	priv = this-&gt;private;</div><div class='del'>-</div><div class='del'>-	child_index = (long) cookie;</div><div class='del'>-</div><div class='del'>-	LOCK (&amp;frame-&gt;lock);</div><div class='del'>-	{</div><div class='del'>-		if (op_ret == -1) {</div><div class='del'>-			gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-				"setting attributes failed for %s on %s (%s)",</div><div class='del'>-				local-&gt;loc.path,</div><div class='del'>-				priv-&gt;children[child_index]-&gt;name,</div><div class='del'>-				strerror (op_errno));</div><div class='del'>-</div><div class='del'>-			sh-&gt;success[child_index] = 0;</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='del'>-	UNLOCK (&amp;frame-&gt;lock);</div><div class='add'>+    uint64_t ret;</div><div class='ctx'> </div><div class='del'>-	call_count = afr_frame_return (frame);</div><div class='add'>+    ret = (((uint64_t)(ia-&gt;ia_mtime)) * 1000000000) +</div><div class='add'>+          (uint64_t)(ia-&gt;ia_mtime_nsec);</div><div class='ctx'> </div><div class='del'>-	if (call_count == 0)</div><div class='del'>-		afr_sh_metadata_erase_pending (frame, this);</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-afr_sh_metadata_setattr_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-                             int32_t op_ret, int32_t op_errno,</div><div class='del'>-                             struct iatt *preop, struct iatt *postop)</div><div class='add'>+/*</div><div class='add'>+ * When directory content is modified, [mc]time is updated. On</div><div class='add'>+ * Linux, the filesystem does it, while at least on NetBSD, the</div><div class='add'>+ * kernel file-system independent code does it. This means that</div><div class='add'>+ * when entries are added while bricks are down, the kernel sends</div><div class='add'>+ * a SETATTR [mc]time which will cause metadata split brain for</div><div class='add'>+ * the directory. In this case, clear the split brain by finding</div><div class='add'>+ * the source with the most recent modification date.</div><div class='add'>+ */</div><div class='add'>+static int</div><div class='add'>+afr_dirtime_splitbrain_source(call_frame_t *frame, xlator_t *this,</div><div class='add'>+                              struct afr_reply *replies,</div><div class='add'>+                              unsigned char *locked_on)</div><div class='ctx'> {</div><div class='del'>-	afr_sh_metadata_sync_cbk (frame, cookie, this, op_ret, op_errno);</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    int source = -1;</div><div class='add'>+    struct iatt source_ia;</div><div class='add'>+    struct iatt child_ia;</div><div class='add'>+    uint64_t mtime = 0;</div><div class='add'>+    int i;</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+        if (!locked_on[i])</div><div class='add'>+            continue;</div><div class='add'>+</div><div class='add'>+        if (!replies[i].valid)</div><div class='add'>+            continue;</div><div class='add'>+</div><div class='add'>+        if (replies[i].op_ret != 0)</div><div class='add'>+            continue;</div><div class='add'>+</div><div class='add'>+        if (mtime_ns(&amp;replies[i].poststat) &lt;= mtime)</div><div class='add'>+            continue;</div><div class='add'>+</div><div class='add'>+        mtime = mtime_ns(&amp;replies[i].poststat);</div><div class='add'>+        source = i;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (source == -1)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    source_ia = replies[source].poststat;</div><div class='add'>+    if (source_ia.ia_type != IA_IFDIR)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+        if (i == source)</div><div class='add'>+            continue;</div><div class='add'>+</div><div class='add'>+        if (!replies[i].valid)</div><div class='add'>+            continue;</div><div class='add'>+</div><div class='add'>+        if (replies[i].op_ret != 0)</div><div class='add'>+            continue;</div><div class='add'>+</div><div class='add'>+        child_ia = replies[i].poststat;</div><div class='add'>+</div><div class='add'>+        if (!IA_EQUAL(source_ia, child_ia, gfid) ||</div><div class='add'>+            !IA_EQUAL(source_ia, child_ia, type) ||</div><div class='add'>+            !IA_EQUAL(source_ia, child_ia, prot) ||</div><div class='add'>+            !IA_EQUAL(source_ia, child_ia, uid) ||</div><div class='add'>+            !IA_EQUAL(source_ia, child_ia, gid) ||</div><div class='add'>+            !afr_xattrs_are_equal(replies[source].xdata, replies[i].xdata))</div><div class='add'>+            goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /*</div><div class='add'>+     * Metadata split brain is just about [amc]time</div><div class='add'>+     * We return our source.</div><div class='add'>+     */</div><div class='add'>+    ret = source;</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-afr_sh_metadata_xattr_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-			   int32_t op_ret, int32_t op_errno)</div><div class='add'>+static int</div><div class='add'>+__afr_selfheal_metadata_mark_pending_xattrs(call_frame_t *frame, xlator_t *this,</div><div class='add'>+                                            inode_t *inode,</div><div class='add'>+                                            struct afr_reply *replies,</div><div class='add'>+                                            unsigned char *sources)</div><div class='ctx'> {</div><div class='del'>-	afr_sh_metadata_sync_cbk (frame, cookie, this, op_ret, op_errno);</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='add'>+    int ret = 0;</div><div class='add'>+    int i = 0;</div><div class='add'>+    int m_idx = 0;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    int raw[AFR_NUM_CHANGE_LOGS] = {0};</div><div class='add'>+    dict_t *xattr = NULL;</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+    m_idx = afr_index_for_transaction_type(AFR_METADATA_TRANSACTION);</div><div class='add'>+    raw[m_idx] = 1;</div><div class='add'>+</div><div class='add'>+    xattr = dict_new();</div><div class='add'>+    if (!xattr)</div><div class='add'>+        return -ENOMEM;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+        if (sources[i])</div><div class='add'>+            continue;</div><div class='add'>+        ret = dict_set_static_bin(xattr, priv-&gt;pending_key[i], raw,</div><div class='add'>+                                  sizeof(int) * AFR_NUM_CHANGE_LOGS);</div><div class='add'>+        if (ret) {</div><div class='add'>+            ret = -1;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+        if (!sources[i])</div><div class='add'>+            continue;</div><div class='add'>+        ret = afr_selfheal_post_op(frame, this, inode, i, xattr, NULL);</div><div class='add'>+        if (ret &lt; 0) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_INFO, -ret, AFR_MSG_SELF_HEAL_INFO,</div><div class='add'>+                   "Failed to set pending metadata xattr on child %d for %s", i,</div><div class='add'>+                   uuid_utoa(inode-&gt;gfid));</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='ctx'> </div><div class='add'>+    afr_replies_wipe(replies, priv-&gt;child_count);</div><div class='add'>+    ret = afr_selfheal_unlocked_discover(frame, inode, inode-&gt;gfid, replies);</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-afr_sh_metadata_sync (call_frame_t *frame, xlator_t *this, dict_t *xattr)</div><div class='del'>-{</div><div class='del'>-	afr_local_t     *local = NULL;</div><div class='del'>-	afr_self_heal_t *sh = NULL;</div><div class='del'>-	afr_private_t   *priv = NULL;</div><div class='del'>-	int              source = 0;</div><div class='del'>-	int              active_sinks = 0;</div><div class='del'>-	int              call_count = 0;</div><div class='del'>-	int              i = 0;</div><div class='del'>-</div><div class='del'>-        struct iatt      stbuf;</div><div class='del'>-        int32_t          valid = 0;</div><div class='del'>-</div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-	sh = &amp;local-&gt;self_heal;</div><div class='del'>-	priv = this-&gt;private;</div><div class='del'>-</div><div class='del'>-	source = sh-&gt;source;</div><div class='del'>-	active_sinks = sh-&gt;active_sinks;</div><div class='del'>-</div><div class='del'>-	/*</div><div class='del'>-	 * 2 calls per sink - setattr, setxattr</div><div class='del'>-	 */</div><div class='del'>-	if (xattr)</div><div class='del'>-		call_count = active_sinks * 2;</div><div class='del'>-	else</div><div class='del'>-		call_count = active_sinks;</div><div class='del'>-</div><div class='del'>-	local-&gt;call_count = call_count;</div><div class='del'>-</div><div class='del'>-	stbuf.ia_atime = sh-&gt;buf[source].ia_atime;</div><div class='del'>-	stbuf.ia_atime_nsec = sh-&gt;buf[source].ia_atime_nsec;</div><div class='del'>-	stbuf.ia_mtime = sh-&gt;buf[source].ia_mtime;</div><div class='del'>-	stbuf.ia_mtime_nsec = sh-&gt;buf[source].ia_mtime_nsec;</div><div class='del'>-</div><div class='del'>-        stbuf.ia_uid = sh-&gt;buf[source].ia_uid;</div><div class='del'>-        stbuf.ia_gid = sh-&gt;buf[source].ia_gid;</div><div class='del'>-</div><div class='del'>-        stbuf.ia_type = sh-&gt;buf[source].ia_type;</div><div class='del'>-        stbuf.ia_prot = sh-&gt;buf[source].ia_prot;</div><div class='del'>-        </div><div class='del'>-        valid = GF_SET_ATTR_MODE  | </div><div class='del'>-                GF_SET_ATTR_UID   | GF_SET_ATTR_GID |</div><div class='del'>-                GF_SET_ATTR_ATIME | GF_SET_ATTR_MTIME;</div><div class='del'>-</div><div class='del'>-	for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='del'>-		if (call_count == 0) {</div><div class='del'>-			break;</div><div class='del'>-		}</div><div class='del'>-		if (sh-&gt;sources[i] || !local-&gt;child_up[i])</div><div class='del'>-			continue;</div><div class='del'>-</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-			"self-healing metadata of %s from %s to %s",</div><div class='del'>-			local-&gt;loc.path, priv-&gt;children[source]-&gt;name,</div><div class='del'>-			priv-&gt;children[i]-&gt;name);</div><div class='del'>-</div><div class='del'>-		STACK_WIND_COOKIE (frame, afr_sh_metadata_setattr_cbk,</div><div class='del'>-				   (void *) (long) i,</div><div class='del'>-				   priv-&gt;children[i],</div><div class='del'>-				   priv-&gt;children[i]-&gt;fops-&gt;setattr,</div><div class='del'>-				   &amp;local-&gt;loc, &amp;stbuf, valid);</div><div class='del'>-</div><div class='del'>-		call_count--;</div><div class='del'>-</div><div class='del'>-		if (!xattr)</div><div class='del'>-			continue;</div><div class='del'>-</div><div class='del'>-		STACK_WIND_COOKIE (frame, afr_sh_metadata_xattr_cbk,</div><div class='del'>-				   (void *) (long) i,</div><div class='del'>-				   priv-&gt;children[i],</div><div class='del'>-				   priv-&gt;children[i]-&gt;fops-&gt;setxattr,</div><div class='del'>-				   &amp;local-&gt;loc, xattr, 0);</div><div class='del'>-		call_count--;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='add'>+out:</div><div class='add'>+    if (xattr)</div><div class='add'>+        dict_unref(xattr);</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-afr_sh_metadata_getxattr_cbk (call_frame_t *frame, void *cookie,</div><div class='del'>-			      xlator_t *this,</div><div class='del'>-			      int32_t op_ret, int32_t op_errno, dict_t *xattr)</div><div class='add'>+/*</div><div class='add'>+ * Look for mismatching uid/gid or mode or user xattrs even if</div><div class='add'>+ * AFR xattrs don't say so, and pick one arbitrarily as winner. */</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+__afr_selfheal_metadata_finalize_source(call_frame_t *frame, xlator_t *this,</div><div class='add'>+                                        inode_t *inode, unsigned char *sources,</div><div class='add'>+                                        unsigned char *sinks,</div><div class='add'>+                                        unsigned char *healed_sinks,</div><div class='add'>+                                        unsigned char *undid_pending,</div><div class='add'>+                                        unsigned char *locked_on,</div><div class='add'>+                                        struct afr_reply *replies)</div><div class='ctx'> {</div><div class='del'>-	afr_local_t     *local = NULL;</div><div class='del'>-	afr_self_heal_t *sh = NULL;</div><div class='del'>-	afr_private_t   *priv = NULL;</div><div class='del'>-	int              source = 0;</div><div class='del'>-</div><div class='del'>-        int i;</div><div class='del'>-</div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-	sh = &amp;local-&gt;self_heal;</div><div class='del'>-	priv = this-&gt;private;</div><div class='del'>-</div><div class='del'>-	source = sh-&gt;source;</div><div class='del'>-</div><div class='del'>-	if (op_ret == -1) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-			"getxattr of %s failed on subvolume %s (%s). proceeding without xattr",</div><div class='del'>-			local-&gt;loc.path, priv-&gt;children[source]-&gt;name,</div><div class='del'>-			strerror (op_errno));</div><div class='del'>-</div><div class='del'>-		afr_sh_metadata_sync (frame, this, NULL);</div><div class='del'>-	} else {</div><div class='del'>-                for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='del'>-                        dict_del (xattr, priv-&gt;pending_key[i]);</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-		afr_sh_metadata_sync (frame, this, xattr);</div><div class='del'>-	}</div><div class='add'>+    int i = 0;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    struct iatt srcstat = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int source = -1;</div><div class='add'>+    int sources_count = 0;</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    sources_count = AFR_COUNT(sources, priv-&gt;child_count);</div><div class='add'>+</div><div class='add'>+    if ((AFR_CMP(locked_on, healed_sinks, priv-&gt;child_count) == 0) ||</div><div class='add'>+        !sources_count) {</div><div class='add'>+        source = afr_mark_split_brain_source_sinks(</div><div class='add'>+            frame, this, inode, sources, sinks, healed_sinks, locked_on,</div><div class='add'>+            replies, AFR_METADATA_TRANSACTION);</div><div class='add'>+        if (source &gt;= 0) {</div><div class='add'>+            _afr_fav_child_reset_sink_xattrs(</div><div class='add'>+                frame, this, inode, source, healed_sinks, undid_pending,</div><div class='add'>+                AFR_METADATA_TRANSACTION, locked_on, replies);</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='add'>+        /* If this is a directory mtime/ctime only split brain</div><div class='add'>+           use the most recent */</div><div class='add'>+        source = afr_dirtime_splitbrain_source(frame, this, replies, locked_on);</div><div class='add'>+        if (source != -1) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_INFO, 0, AFR_MSG_SPLIT_BRAIN,</div><div class='add'>+                   "clear time "</div><div class='add'>+                   "split brain on %s",</div><div class='add'>+                   uuid_utoa(replies[source].poststat.ia_gfid));</div><div class='add'>+            sources[source] = 1;</div><div class='add'>+            healed_sinks[source] = 0;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='add'>+        if (!priv-&gt;metadata_splitbrain_forced_heal) {</div><div class='add'>+            gf_event(EVENT_AFR_SPLIT_BRAIN,</div><div class='add'>+                     "client-pid=%d;"</div><div class='add'>+                     "subvol=%s;"</div><div class='add'>+                     "type=metadata;file=%s",</div><div class='add'>+                     this-&gt;ctx-&gt;cmd_args.client_pid, this-&gt;name,</div><div class='add'>+                     uuid_utoa(inode-&gt;gfid));</div><div class='add'>+            return -EIO;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-afr_sh_metadata_sync_prepare (call_frame_t *frame, xlator_t *this)</div><div class='del'>-{</div><div class='del'>-	afr_local_t     *local = NULL;</div><div class='del'>-	afr_self_heal_t *sh = NULL;</div><div class='del'>-	afr_private_t   *priv = NULL;</div><div class='del'>-	int              active_sinks = 0;</div><div class='del'>-	int              source = 0;</div><div class='del'>-	int              i = 0;</div><div class='del'>-</div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-	sh = &amp;local-&gt;self_heal;</div><div class='del'>-	priv = this-&gt;private;</div><div class='del'>-</div><div class='del'>-	source = sh-&gt;source;</div><div class='del'>-</div><div class='del'>-	for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='del'>-		if (sh-&gt;sources[i] == 0 &amp;&amp; local-&gt;child_up[i] == 1) {</div><div class='del'>-			active_sinks++;</div><div class='del'>-			sh-&gt;success[i] = 1;</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='del'>-	sh-&gt;success[source] = 1;</div><div class='del'>-</div><div class='del'>-	if (active_sinks == 0) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-			"no active sinks for performing self-heal on file %s",</div><div class='del'>-			local-&gt;loc.path);</div><div class='del'>-		afr_sh_metadata_finish (frame, this);</div><div class='del'>-		return 0;</div><div class='del'>-	}</div><div class='del'>-	sh-&gt;active_sinks = active_sinks;</div><div class='del'>-</div><div class='del'>-	gf_log (this-&gt;name, GF_LOG_TRACE,</div><div class='del'>-		"syncing metadata of %s from subvolume %s to %d active sinks",</div><div class='del'>-		local-&gt;loc.path, priv-&gt;children[source]-&gt;name, active_sinks);</div><div class='del'>-</div><div class='del'>-	STACK_WIND (frame, afr_sh_metadata_getxattr_cbk,</div><div class='del'>-		    priv-&gt;children[source],</div><div class='del'>-		    priv-&gt;children[source]-&gt;fops-&gt;getxattr,</div><div class='del'>-		    &amp;local-&gt;loc, NULL);</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='add'>+        /* Metadata split brain, select one subvol</div><div class='add'>+           arbitrarily */</div><div class='add'>+        for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+            if (locked_on[i] &amp;&amp; healed_sinks[i]) {</div><div class='add'>+                sources[i] = 1;</div><div class='add'>+                healed_sinks[i] = 0;</div><div class='add'>+                break;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* No split brain at this point. If we were called from</div><div class='add'>+     * afr_heal_splitbrain_file(), abort.*/</div><div class='add'>+    if (afr_dict_contains_heal_op(frame))</div><div class='add'>+        return -EIO;</div><div class='add'>+</div><div class='add'>+    source = afr_choose_source_by_policy(priv, sources,</div><div class='add'>+                                         AFR_METADATA_TRANSACTION);</div><div class='add'>+    srcstat = replies[source].poststat;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+        if (!sources[i] || i == source)</div><div class='add'>+            continue;</div><div class='add'>+        if (!IA_EQUAL(srcstat, replies[i].poststat, type) ||</div><div class='add'>+            !IA_EQUAL(srcstat, replies[i].poststat, uid) ||</div><div class='add'>+            !IA_EQUAL(srcstat, replies[i].poststat, gid) ||</div><div class='add'>+            !IA_EQUAL(srcstat, replies[i].poststat, prot)) {</div><div class='add'>+            gf_msg_debug(this-&gt;name, 0,</div><div class='add'>+                         "%s: iatt mismatch "</div><div class='add'>+                         "for source(%d) vs (%d)",</div><div class='add'>+                         uuid_utoa(replies[source].poststat.ia_gfid), source,</div><div class='add'>+                         i);</div><div class='add'>+            sources[i] = 0;</div><div class='add'>+            healed_sinks[i] = 1;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+        if (!sources[i] || i == source)</div><div class='add'>+            continue;</div><div class='add'>+        if (!afr_xattrs_are_equal(replies[source].xdata, replies[i].xdata)) {</div><div class='add'>+            gf_msg_debug(this-&gt;name, 0,</div><div class='add'>+                         "%s: xattr mismatch "</div><div class='add'>+                         "for source(%d) vs (%d)",</div><div class='add'>+                         uuid_utoa(replies[source].poststat.ia_gfid), source,</div><div class='add'>+                         i);</div><div class='add'>+            sources[i] = 0;</div><div class='add'>+            healed_sinks[i] = 1;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    if ((sources_count == priv-&gt;child_count) &amp;&amp; (source &gt; -1) &amp;&amp;</div><div class='add'>+        (AFR_COUNT(healed_sinks, priv-&gt;child_count) != 0)) {</div><div class='add'>+        ret = __afr_selfheal_metadata_mark_pending_xattrs(frame, this, inode,</div><div class='add'>+                                                          replies, sources);</div><div class='add'>+        if (ret &lt; 0)</div><div class='add'>+            return ret;</div><div class='add'>+    }</div><div class='add'>+out:</div><div class='add'>+    afr_mark_active_sinks(this, sources, locked_on, healed_sinks);</div><div class='add'>+    return source;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-afr_sh_metadata_fix (call_frame_t *frame, xlator_t *this)</div><div class='add'>+__afr_selfheal_metadata_prepare(call_frame_t *frame, xlator_t *this,</div><div class='add'>+                                inode_t *inode, unsigned char *locked_on,</div><div class='add'>+                                unsigned char *sources, unsigned char *sinks,</div><div class='add'>+                                unsigned char *healed_sinks,</div><div class='add'>+                                unsigned char *undid_pending,</div><div class='add'>+                                struct afr_reply *replies, unsigned char *pflag)</div><div class='ctx'> {</div><div class='del'>-	afr_local_t     *local = NULL;</div><div class='del'>-	afr_self_heal_t *sh = NULL;</div><div class='del'>-	afr_private_t   *priv = NULL;</div><div class='del'>-	int              nsources = 0;</div><div class='del'>-	int              source = 0;</div><div class='del'>-	int              i = 0;</div><div class='del'>-</div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-	sh = &amp;local-&gt;self_heal;</div><div class='del'>-	priv = this-&gt;private;</div><div class='del'>-</div><div class='del'>-	afr_sh_build_pending_matrix (priv, sh-&gt;pending_matrix, sh-&gt;xattr, </div><div class='del'>-				     priv-&gt;child_count, </div><div class='del'>-                                     AFR_METADATA_TRANSACTION);</div><div class='del'>-</div><div class='del'>-	afr_sh_print_pending_matrix (sh-&gt;pending_matrix, this);</div><div class='del'>-</div><div class='del'>-	nsources = afr_sh_mark_sources (sh, priv-&gt;child_count,</div><div class='del'>-                                        AFR_SELF_HEAL_METADATA);</div><div class='del'>-</div><div class='del'>-	afr_sh_supress_errenous_children (sh-&gt;sources, sh-&gt;child_errno,</div><div class='del'>-					  priv-&gt;child_count);</div><div class='del'>-</div><div class='del'>-        if (nsources == 0) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_TRACE,</div><div class='del'>-                        "No self-heal needed for %s",</div><div class='del'>-                        local-&gt;loc.path);</div><div class='del'>-</div><div class='del'>-                afr_sh_metadata_finish (frame, this);</div><div class='del'>-                return 0;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int source = -1;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    int i = 0;</div><div class='add'>+    uint64_t *witness = NULL;</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    ret = afr_selfheal_unlocked_discover(frame, inode, inode-&gt;gfid, replies);</div><div class='add'>+    if (ret)</div><div class='add'>+        return ret;</div><div class='add'>+</div><div class='add'>+    witness = alloca0(sizeof(*witness) * priv-&gt;child_count);</div><div class='add'>+    ret = afr_selfheal_find_direction(frame, this, replies,</div><div class='add'>+                                      AFR_METADATA_TRANSACTION, locked_on,</div><div class='add'>+                                      sources, sinks, witness, pflag);</div><div class='add'>+    if (ret)</div><div class='add'>+        return ret;</div><div class='add'>+</div><div class='add'>+    /* Initialize the healed_sinks[] array optimistically to</div><div class='add'>+       the intersection of to-be-healed (i.e sinks[]) and</div><div class='add'>+       the list of servers which are up (i.e locked_on[]).</div><div class='add'>+</div><div class='add'>+       As we encounter failures in the healing process, we</div><div class='add'>+       will unmark the respective servers in the healed_sinks[]</div><div class='add'>+       array.</div><div class='add'>+    */</div><div class='add'>+    AFR_INTERSECT(healed_sinks, sinks, locked_on, priv-&gt;child_count);</div><div class='add'>+</div><div class='add'>+    /* If any source has witness, pick first</div><div class='add'>+     * witness source and make everybody else sinks */</div><div class='add'>+    for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+        if (sources[i] &amp;&amp; witness[i]) {</div><div class='add'>+            source = i;</div><div class='add'>+            break;</div><div class='ctx'>         }</div><div class='del'>-</div><div class='del'>-	if ((nsources == -1)</div><div class='del'>-	    &amp;&amp; (priv-&gt;favorite_child != -1)</div><div class='del'>-	    &amp;&amp; (sh-&gt;child_errno[priv-&gt;favorite_child] == 0)) {</div><div class='del'>-</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_WARNING,</div><div class='del'>-			"Picking favorite child %s as authentic source to resolve conflicting metadata of %s",</div><div class='del'>-			priv-&gt;children[priv-&gt;favorite_child]-&gt;name,</div><div class='del'>-			local-&gt;loc.path);</div><div class='del'>-</div><div class='del'>-		sh-&gt;sources[priv-&gt;favorite_child] = 1;</div><div class='del'>-</div><div class='del'>-		nsources = afr_sh_source_count (sh-&gt;sources,</div><div class='del'>-						priv-&gt;child_count);</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	if (nsources == -1) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-			"Unable to self-heal permissions/ownership of '%s' "</div><div class='del'>-                        "(possible split-brain). Please fix the file on "</div><div class='del'>-                        "all backend volumes", local-&gt;loc.path);</div><div class='del'>-</div><div class='del'>-		local-&gt;govinda_gOvinda = 1;</div><div class='del'>-</div><div class='del'>-		afr_sh_metadata_finish (frame, this);</div><div class='del'>-		return 0;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	source = afr_sh_select_source (sh-&gt;sources, priv-&gt;child_count);</div><div class='del'>-</div><div class='del'>-        if (source == -1) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-                        "No active sources found.");</div><div class='del'>-</div><div class='del'>-                afr_sh_metadata_finish (frame, this);</div><div class='del'>-                return 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (source != -1) {</div><div class='add'>+        for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+            if (i != source &amp;&amp; sources[i]) {</div><div class='add'>+                sources[i] = 0;</div><div class='add'>+                healed_sinks[i] = 1;</div><div class='add'>+            }</div><div class='ctx'>         }</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	sh-&gt;source = source;</div><div class='del'>-</div><div class='del'>-	/* detect changes not visible through pending flags -- JIC */</div><div class='del'>-	for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='del'>-		if (i == source || sh-&gt;child_errno[i])</div><div class='del'>-			continue;</div><div class='add'>+    source = __afr_selfheal_metadata_finalize_source(</div><div class='add'>+        frame, this, inode, sources, sinks, healed_sinks, undid_pending,</div><div class='add'>+        locked_on, replies);</div><div class='ctx'> </div><div class='del'>-		if (PERMISSION_DIFFERS (&amp;sh-&gt;buf[i], &amp;sh-&gt;buf[source]))</div><div class='del'>-			sh-&gt;sources[i] = 0;</div><div class='add'>+    if (source &lt; 0)</div><div class='add'>+        return -EIO;</div><div class='ctx'> </div><div class='del'>-		if (OWNERSHIP_DIFFERS (&amp;sh-&gt;buf[i], &amp;sh-&gt;buf[source]))</div><div class='del'>-			sh-&gt;sources[i] = 0;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	afr_sh_metadata_sync_prepare (frame, this);</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-afr_sh_metadata_lookup_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-			    int32_t op_ret, int32_t op_errno,</div><div class='del'>-                            inode_t *inode, struct iatt *buf, dict_t *xattr,</div><div class='del'>-                            struct iatt *postparent)</div><div class='del'>-{</div><div class='del'>-	afr_local_t     *local = NULL;</div><div class='del'>-	afr_self_heal_t *sh = NULL;</div><div class='del'>-	afr_private_t   *priv = NULL;</div><div class='del'>-	int              call_count = 0;</div><div class='del'>-	int              child_index = 0;</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-	sh = &amp;local-&gt;self_heal;</div><div class='del'>-	priv = this-&gt;private;</div><div class='del'>-</div><div class='del'>-	child_index = (long) cookie;</div><div class='del'>-</div><div class='del'>-	LOCK (&amp;frame-&gt;lock);</div><div class='del'>-	{</div><div class='del'>-		if (op_ret == 0) {</div><div class='del'>-			gf_log (this-&gt;name, GF_LOG_TRACE,</div><div class='del'>-				"path %s on subvolume %s is of mode 0%o",</div><div class='del'>-				local-&gt;loc.path,</div><div class='del'>-				priv-&gt;children[child_index]-&gt;name,</div><div class='del'>-				buf-&gt;ia_type);</div><div class='del'>-</div><div class='del'>-			sh-&gt;buf[child_index] = *buf;</div><div class='del'>-			if (xattr)</div><div class='del'>-				sh-&gt;xattr[child_index] = dict_ref (xattr);</div><div class='del'>-		} else {</div><div class='del'>-			gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-				"path %s on subvolume %s =&gt; -1 (%s)",</div><div class='del'>-				local-&gt;loc.path,</div><div class='del'>-				priv-&gt;children[child_index]-&gt;name,</div><div class='del'>-				strerror (op_errno));</div><div class='del'>-</div><div class='del'>-			sh-&gt;child_errno[child_index] = op_errno;</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='del'>-	UNLOCK (&amp;frame-&gt;lock);</div><div class='del'>-</div><div class='del'>-	call_count = afr_frame_return (frame);</div><div class='del'>-</div><div class='del'>-	if (call_count == 0)</div><div class='del'>-		afr_sh_metadata_fix (frame, this);</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='add'>+    return source;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-afr_sh_metadata_lookup (call_frame_t *frame, xlator_t *this)</div><div class='add'>+afr_selfheal_metadata(call_frame_t *frame, xlator_t *this, inode_t *inode)</div><div class='ctx'> {</div><div class='del'>-	afr_local_t     *local = NULL;</div><div class='del'>-	afr_private_t   *priv = NULL;</div><div class='del'>-	int              i = 0;</div><div class='del'>-	int              call_count = 0;</div><div class='del'>-	dict_t          *xattr_req = NULL;</div><div class='del'>-	int              ret = 0;</div><div class='del'>-</div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-	priv = this-&gt;private;</div><div class='del'>-</div><div class='del'>-	call_count = afr_up_children_count (priv-&gt;child_count,</div><div class='del'>-                                            local-&gt;child_up);</div><div class='del'>-	local-&gt;call_count = call_count;</div><div class='del'>-</div><div class='del'>-	xattr_req = dict_new();</div><div class='del'>-</div><div class='del'>-	if (xattr_req) {</div><div class='del'>-                for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='del'>-                        ret = dict_set_uint64 (xattr_req,</div><div class='del'>-                                               priv-&gt;pending_key[i],</div><div class='del'>-                                               3 * sizeof(int32_t));</div><div class='del'>-                        if (ret &lt; 0)</div><div class='del'>-                                gf_log (this-&gt;name, GF_LOG_WARNING,</div><div class='del'>-                                        "Unable to set dict value.");</div><div class='del'>-                }</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    unsigned char *sources = NULL;</div><div class='add'>+    unsigned char *sinks = NULL;</div><div class='add'>+    unsigned char *data_lock = NULL;</div><div class='add'>+    unsigned char *healed_sinks = NULL;</div><div class='add'>+    unsigned char *undid_pending = NULL;</div><div class='add'>+    struct afr_reply *locked_replies = NULL;</div><div class='add'>+    gf_boolean_t did_sh = _gf_true;</div><div class='add'>+    int source = -1;</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    sources = alloca0(priv-&gt;child_count);</div><div class='add'>+    sinks = alloca0(priv-&gt;child_count);</div><div class='add'>+    healed_sinks = alloca0(priv-&gt;child_count);</div><div class='add'>+    undid_pending = alloca0(priv-&gt;child_count);</div><div class='add'>+    data_lock = alloca0(priv-&gt;child_count);</div><div class='add'>+</div><div class='add'>+    locked_replies = alloca0(sizeof(*locked_replies) * priv-&gt;child_count);</div><div class='add'>+</div><div class='add'>+    ret = afr_selfheal_inodelk(frame, this, inode, this-&gt;name, LLONG_MAX - 1, 0,</div><div class='add'>+                               data_lock);</div><div class='add'>+    {</div><div class='add'>+        if (ret &lt; priv-&gt;child_count) {</div><div class='add'>+            ret = -ENOTCONN;</div><div class='add'>+            goto unlock;</div><div class='ctx'>         }</div><div class='ctx'> </div><div class='del'>-	for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='del'>-		if (local-&gt;child_up[i]) {</div><div class='del'>-			gf_log (this-&gt;name, GF_LOG_TRACE,</div><div class='del'>-				"looking up %s on %s",</div><div class='del'>-				local-&gt;loc.path, priv-&gt;children[i]-&gt;name);</div><div class='del'>-</div><div class='del'>-			STACK_WIND_COOKIE (frame, afr_sh_metadata_lookup_cbk,</div><div class='del'>-					   (void *) (long) i,</div><div class='del'>-					   priv-&gt;children[i],</div><div class='del'>-					   priv-&gt;children[i]-&gt;fops-&gt;lookup,</div><div class='del'>-					   &amp;local-&gt;loc, xattr_req);</div><div class='del'>-			if (!--call_count)</div><div class='del'>-				break;</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='del'>-	</div><div class='del'>-	if (xattr_req)</div><div class='del'>-		dict_unref (xattr_req);</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-afr_sh_post_nonblocking_inodelk_cbk (call_frame_t *frame, xlator_t *this)</div><div class='del'>-{</div><div class='del'>-        afr_internal_lock_t *int_lock = NULL;</div><div class='del'>-        afr_local_t         *local    = NULL;</div><div class='add'>+        ret = __afr_selfheal_metadata_prepare(</div><div class='add'>+            frame, this, inode, data_lock, sources, sinks, healed_sinks,</div><div class='add'>+            undid_pending, locked_replies, NULL);</div><div class='add'>+        if (ret &lt; 0)</div><div class='add'>+            goto unlock;</div><div class='ctx'> </div><div class='del'>-        local    = frame-&gt;local;</div><div class='del'>-        int_lock = &amp;local-&gt;internal_lock;</div><div class='add'>+        source = ret;</div><div class='ctx'> </div><div class='del'>-        if (int_lock-&gt;lock_op_ret &lt; 0) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-                        "Non Blocking inodelks failed.");</div><div class='del'>-                afr_sh_metadata_done (frame, this);</div><div class='del'>-        } else {</div><div class='del'>-</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-                        "Non Blocking inodelks done. Proceeding to FOP");</div><div class='del'>-                afr_sh_metadata_lookup (frame, this);</div><div class='add'>+        if (AFR_COUNT(healed_sinks, priv-&gt;child_count) == 0) {</div><div class='add'>+            did_sh = _gf_false;</div><div class='add'>+            goto unlock;</div><div class='ctx'>         }</div><div class='ctx'> </div><div class='del'>-        return 0;</div><div class='add'>+        ret = __afr_selfheal_metadata_do(frame, this, inode, source,</div><div class='add'>+                                         healed_sinks, locked_replies);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto unlock;</div><div class='add'>+</div><div class='add'>+        afr_selfheal_restore_time(frame, this, inode, source, healed_sinks,</div><div class='add'>+                                  locked_replies);</div><div class='add'>+</div><div class='add'>+        ret = afr_selfheal_undo_pending(</div><div class='add'>+            frame, this, inode, sources, sinks, healed_sinks, undid_pending,</div><div class='add'>+            AFR_METADATA_TRANSACTION, locked_replies, data_lock);</div><div class='add'>+    }</div><div class='add'>+unlock:</div><div class='add'>+    afr_selfheal_uninodelk(frame, this, inode, this-&gt;name, LLONG_MAX - 1, 0,</div><div class='add'>+                           data_lock);</div><div class='add'>+</div><div class='add'>+    if (did_sh)</div><div class='add'>+        afr_log_selfheal(inode-&gt;gfid, this, ret, "metadata", source, sources,</div><div class='add'>+                         healed_sinks);</div><div class='add'>+    else</div><div class='add'>+        ret = 1;</div><div class='add'>+</div><div class='add'>+    if (locked_replies)</div><div class='add'>+        afr_replies_wipe(locked_replies, priv-&gt;child_count);</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-afr_sh_metadata_lock (call_frame_t *frame, xlator_t *this)</div><div class='add'>+afr_selfheal_metadata_by_stbuf(xlator_t *this, struct iatt *stbuf)</div><div class='ctx'> {</div><div class='del'>-        afr_internal_lock_t *int_lock = NULL;</div><div class='del'>-        afr_local_t         *local    = NULL;</div><div class='del'>-</div><div class='del'>-        local    = frame-&gt;local;</div><div class='del'>-        int_lock = &amp;local-&gt;internal_lock;</div><div class='del'>-</div><div class='del'>-        int_lock-&gt;transaction_lk_type = AFR_SELFHEAL_LK;</div><div class='del'>-        int_lock-&gt;selfheal_lk_type    = AFR_METADATA_SELF_HEAL_LK;</div><div class='del'>-</div><div class='del'>-        afr_set_lock_number (frame, this);</div><div class='del'>-</div><div class='del'>-        int_lock-&gt;lk_flock.l_start = 0;</div><div class='del'>-        int_lock-&gt;lk_flock.l_len   = 0;</div><div class='del'>-        int_lock-&gt;lk_flock.l_type  = F_WRLCK;</div><div class='del'>-        int_lock-&gt;lock_cbk         = afr_sh_post_nonblocking_inodelk_cbk;</div><div class='del'>-</div><div class='del'>-        afr_nonblocking_inodelk (frame, this);</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-afr_self_heal_metadata (call_frame_t *frame, xlator_t *this)</div><div class='del'>-{</div><div class='del'>-	afr_local_t   *local = NULL;</div><div class='del'>-	afr_private_t *priv = this-&gt;private;</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-</div><div class='del'>-	if (local-&gt;self_heal.need_metadata_self_heal &amp;&amp; priv-&gt;metadata_self_heal) {</div><div class='del'>-		afr_sh_metadata_lock (frame, this);</div><div class='del'>-	} else {</div><div class='del'>-		afr_sh_metadata_done (frame, this);</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='add'>+    inode_t *inode = NULL;</div><div class='add'>+    inode_t *link_inode = NULL;</div><div class='add'>+    call_frame_t *frame = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    if (gf_uuid_is_null(stbuf-&gt;ia_gfid)) {</div><div class='add'>+        ret = -EINVAL;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    inode = inode_new(this-&gt;itable);</div><div class='add'>+    if (!inode) {</div><div class='add'>+        ret = -ENOMEM;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    link_inode = inode_link(inode, NULL, NULL, stbuf);</div><div class='add'>+    if (!link_inode) {</div><div class='add'>+        ret = -ENOMEM;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    frame = afr_frame_create(this, &amp;ret);</div><div class='add'>+    if (!frame) {</div><div class='add'>+        ret = -ret;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = afr_selfheal_metadata(frame, this, link_inode);</div><div class='add'>+out:</div><div class='add'>+    if (inode)</div><div class='add'>+        inode_unref(inode);</div><div class='add'>+    if (link_inode)</div><div class='add'>+        inode_unref(link_inode);</div><div class='add'>+    if (frame)</div><div class='add'>+        AFR_STACK_DESTROY(frame);</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='del'>-</div><div class='head'>diff --git a/xlators/cluster/afr/src/afr-self-heal-name.c b/xlators/cluster/afr/src/afr-self-heal-name.c<br/>new file mode 100644<br/>index 00000000000..834aac86d48<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/xlators/cluster/afr/src/afr-self-heal-name.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>xlators/cluster/afr/src/afr-self-heal-name.c</a></div><div class='hunk'>@@ -0,0 +1,616 @@</div><div class='add'>+/*</div><div class='add'>+  Copyright (c) 2013 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#include &lt;glusterfs/events.h&gt;</div><div class='add'>+#include "afr.h"</div><div class='add'>+#include "afr-self-heal.h"</div><div class='add'>+#include "afr-messages.h"</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+__afr_selfheal_assign_gfid(xlator_t *this, inode_t *parent, uuid_t pargfid,</div><div class='add'>+                           const char *bname, inode_t *inode,</div><div class='add'>+                           struct afr_reply *replies, void *gfid,</div><div class='add'>+                           unsigned char *locked_on, int source,</div><div class='add'>+                           unsigned char *sources, gf_boolean_t is_gfid_absent,</div><div class='add'>+                           int *gfid_idx)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+    int up_count = 0;</div><div class='add'>+    int locked_count = 0;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    gf_uuid_copy(parent-&gt;gfid, pargfid);</div><div class='add'>+</div><div class='add'>+    if (is_gfid_absent) {</div><div class='add'>+        /* Ensure all children of AFR are up before performing gfid heal, to</div><div class='add'>+         * guard against the possibility of gfid split brain. */</div><div class='add'>+</div><div class='add'>+        up_count = AFR_COUNT(priv-&gt;child_up, priv-&gt;child_count);</div><div class='add'>+        if (up_count != priv-&gt;child_count) {</div><div class='add'>+            ret = -EIO;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        locked_count = AFR_COUNT(locked_on, priv-&gt;child_count);</div><div class='add'>+        if (locked_count != priv-&gt;child_count) {</div><div class='add'>+            ret = -EIO;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = afr_lookup_and_heal_gfid(this, parent, bname, inode, replies, source,</div><div class='add'>+                                   sources, gfid, gfid_idx);</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+__afr_selfheal_name_impunge(call_frame_t *frame, xlator_t *this,</div><div class='add'>+                            inode_t *parent, uuid_t pargfid, const char *bname,</div><div class='add'>+                            inode_t *inode, struct afr_reply *replies,</div><div class='add'>+                            int gfid_idx)</div><div class='add'>+{</div><div class='add'>+    int i = 0;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    unsigned char *sources = NULL;</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    sources = alloca0(priv-&gt;child_count);</div><div class='add'>+</div><div class='add'>+    gf_uuid_copy(parent-&gt;gfid, pargfid);</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+        if (!replies[i].valid || replies[i].op_ret != 0)</div><div class='add'>+            continue;</div><div class='add'>+</div><div class='add'>+        if (gf_uuid_compare(replies[i].poststat.ia_gfid,</div><div class='add'>+                            replies[gfid_idx].poststat.ia_gfid) == 0) {</div><div class='add'>+            sources[i] = 1;</div><div class='add'>+            continue;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+        if (sources[i])</div><div class='add'>+            continue;</div><div class='add'>+</div><div class='add'>+        ret |= afr_selfheal_recreate_entry(frame, i, gfid_idx, sources, parent,</div><div class='add'>+                                           bname, inode, replies);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+__afr_selfheal_name_expunge(xlator_t *this, inode_t *parent, uuid_t pargfid,</div><div class='add'>+                            const char *bname, inode_t *inode,</div><div class='add'>+                            struct afr_reply *replies)</div><div class='add'>+{</div><div class='add'>+    int i = 0;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+        if (!replies[i].valid)</div><div class='add'>+            continue;</div><div class='add'>+</div><div class='add'>+        if (replies[i].op_ret)</div><div class='add'>+            continue;</div><div class='add'>+</div><div class='add'>+        ret |= afr_selfheal_entry_delete(this, parent, bname, inode, i,</div><div class='add'>+                                         replies);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static gf_boolean_t</div><div class='add'>+afr_selfheal_name_need_heal_check(xlator_t *this, struct afr_reply *replies)</div><div class='add'>+{</div><div class='add'>+    int i = 0;</div><div class='add'>+    int first_idx = -1;</div><div class='add'>+    gf_boolean_t need_heal = _gf_false;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+        if (!replies[i].valid)</div><div class='add'>+            continue;</div><div class='add'>+</div><div class='add'>+        if ((replies[i].op_ret == -1) &amp;&amp; (replies[i].op_errno == ENODATA))</div><div class='add'>+            need_heal = _gf_true;</div><div class='add'>+</div><div class='add'>+        if (first_idx == -1) {</div><div class='add'>+            first_idx = i;</div><div class='add'>+            continue;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        if (replies[i].op_ret != replies[first_idx].op_ret)</div><div class='add'>+            need_heal = _gf_true;</div><div class='add'>+</div><div class='add'>+        if (gf_uuid_compare(replies[i].poststat.ia_gfid,</div><div class='add'>+                            replies[first_idx].poststat.ia_gfid))</div><div class='add'>+            need_heal = _gf_true;</div><div class='add'>+</div><div class='add'>+        if ((replies[i].op_ret == 0) &amp;&amp;</div><div class='add'>+            (gf_uuid_is_null(replies[i].poststat.ia_gfid)))</div><div class='add'>+            need_heal = _gf_true;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return need_heal;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+afr_selfheal_name_type_mismatch_check(xlator_t *this, struct afr_reply *replies,</div><div class='add'>+                                      int source, unsigned char *sources,</div><div class='add'>+                                      uuid_t pargfid, const char *bname)</div><div class='add'>+{</div><div class='add'>+    int i = 0;</div><div class='add'>+    int type_idx = -1;</div><div class='add'>+    ia_type_t inode_type = IA_INVAL;</div><div class='add'>+    ia_type_t inode_type1 = IA_INVAL;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+        if (!replies[i].valid || replies[i].op_ret != 0)</div><div class='add'>+            continue;</div><div class='add'>+</div><div class='add'>+        if (replies[i].poststat.ia_type == IA_INVAL)</div><div class='add'>+            continue;</div><div class='add'>+</div><div class='add'>+        if (inode_type == IA_INVAL) {</div><div class='add'>+            inode_type = replies[i].poststat.ia_type;</div><div class='add'>+            type_idx = i;</div><div class='add'>+            continue;</div><div class='add'>+        }</div><div class='add'>+        inode_type1 = replies[i].poststat.ia_type;</div><div class='add'>+        if (sources[i] || source == -1) {</div><div class='add'>+            if ((sources[type_idx] || source == -1) &amp;&amp;</div><div class='add'>+                (inode_type != inode_type1)) {</div><div class='add'>+                gf_msg(this-&gt;name, GF_LOG_WARNING, 0, AFR_MSG_SPLIT_BRAIN,</div><div class='add'>+                       "Type mismatch for &lt;gfid:%s&gt;/%s: "</div><div class='add'>+                       "%s on %s and %s on %s",</div><div class='add'>+                       uuid_utoa(pargfid), bname,</div><div class='add'>+                       gf_inode_type_to_str(inode_type1),</div><div class='add'>+                       priv-&gt;children[i]-&gt;name,</div><div class='add'>+                       gf_inode_type_to_str(inode_type),</div><div class='add'>+                       priv-&gt;children[type_idx]-&gt;name);</div><div class='add'>+                gf_event(EVENT_AFR_SPLIT_BRAIN,</div><div class='add'>+                         "client-pid=%d;"</div><div class='add'>+                         "subvol=%s;type=file;"</div><div class='add'>+                         "file=&lt;gfid:%s&gt;/%s;count=2;"</div><div class='add'>+                         "child-%d=%s;type-%d=%s;child-%d=%s;"</div><div class='add'>+                         "type-%d=%s",</div><div class='add'>+                         this-&gt;ctx-&gt;cmd_args.client_pid, this-&gt;name,</div><div class='add'>+                         uuid_utoa(pargfid), bname, i, priv-&gt;children[i]-&gt;name,</div><div class='add'>+                         i, gf_inode_type_to_str(inode_type1), type_idx,</div><div class='add'>+                         priv-&gt;children[type_idx]-&gt;name, type_idx,</div><div class='add'>+                         gf_inode_type_to_str(inode_type));</div><div class='add'>+                return -EIO;</div><div class='add'>+            }</div><div class='add'>+            inode_type = replies[i].poststat.ia_type;</div><div class='add'>+            type_idx = i;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+afr_selfheal_name_gfid_mismatch_check(xlator_t *this, struct afr_reply *replies,</div><div class='add'>+                                      int source, unsigned char *sources,</div><div class='add'>+                                      int *gfid_idx, uuid_t pargfid,</div><div class='add'>+                                      const char *bname, inode_t *inode,</div><div class='add'>+                                      unsigned char *locked_on, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    int i = 0;</div><div class='add'>+    int gfid_idx_iter = -1;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    void *gfid = NULL;</div><div class='add'>+    void *gfid1 = NULL;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+        if (!replies[i].valid || replies[i].op_ret != 0)</div><div class='add'>+            continue;</div><div class='add'>+</div><div class='add'>+        if (gf_uuid_is_null(replies[i].poststat.ia_gfid))</div><div class='add'>+            continue;</div><div class='add'>+</div><div class='add'>+        if (!gfid) {</div><div class='add'>+            gfid = &amp;replies[i].poststat.ia_gfid;</div><div class='add'>+            gfid_idx_iter = i;</div><div class='add'>+            continue;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        gfid1 = &amp;replies[i].poststat.ia_gfid;</div><div class='add'>+        if (sources[i] || source == -1) {</div><div class='add'>+            if ((sources[gfid_idx_iter] || source == -1) &amp;&amp;</div><div class='add'>+                gf_uuid_compare(gfid, gfid1)) {</div><div class='add'>+                ret = afr_gfid_split_brain_source(this, replies, inode, pargfid,</div><div class='add'>+                                                  bname, gfid_idx_iter, i,</div><div class='add'>+                                                  locked_on, gfid_idx, xdata);</div><div class='add'>+                if (!ret &amp;&amp; *gfid_idx &gt;= 0) {</div><div class='add'>+                    ret = dict_set_sizen_str_sizen(xdata, "gfid-heal-msg",</div><div class='add'>+                                                   "GFID split-brain resolved");</div><div class='add'>+                    if (ret)</div><div class='add'>+                        gf_msg(this-&gt;name, GF_LOG_ERROR, 0,</div><div class='add'>+                               AFR_MSG_DICT_SET_FAILED,</div><div class='add'>+                               "Error setting gfid-"</div><div class='add'>+                               "heal-msg dict");</div><div class='add'>+                }</div><div class='add'>+                return ret;</div><div class='add'>+            }</div><div class='add'>+            gfid = &amp;replies[i].poststat.ia_gfid;</div><div class='add'>+            gfid_idx_iter = i;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    *gfid_idx = gfid_idx_iter;</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static gf_boolean_t</div><div class='add'>+afr_selfheal_name_source_empty_check(xlator_t *this, struct afr_reply *replies,</div><div class='add'>+                                     unsigned char *sources, int source)</div><div class='add'>+{</div><div class='add'>+    int i = 0;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    gf_boolean_t source_is_empty = _gf_true;</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    if (source == -1) {</div><div class='add'>+        source_is_empty = _gf_false;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+        if (!sources[i])</div><div class='add'>+            continue;</div><div class='add'>+</div><div class='add'>+        if (replies[i].op_ret == -1 &amp;&amp; replies[i].op_errno == ENOENT)</div><div class='add'>+            continue;</div><div class='add'>+</div><div class='add'>+        source_is_empty = _gf_false;</div><div class='add'>+        break;</div><div class='add'>+    }</div><div class='add'>+out:</div><div class='add'>+    return source_is_empty;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+__afr_selfheal_name_do(call_frame_t *frame, xlator_t *this, inode_t *parent,</div><div class='add'>+                       uuid_t pargfid, const char *bname, inode_t *inode,</div><div class='add'>+                       unsigned char *sources, unsigned char *sinks,</div><div class='add'>+                       unsigned char *healed_sinks, int source,</div><div class='add'>+                       unsigned char *locked_on, struct afr_reply *replies,</div><div class='add'>+                       void *gfid_req, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    int gfid_idx = -1;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    void *gfid = NULL;</div><div class='add'>+    gf_boolean_t source_is_empty = _gf_true;</div><div class='add'>+    gf_boolean_t need_heal = _gf_false;</div><div class='add'>+    gf_boolean_t is_gfid_absent = _gf_false;</div><div class='add'>+</div><div class='add'>+    need_heal = afr_selfheal_name_need_heal_check(this, replies);</div><div class='add'>+    if (!need_heal)</div><div class='add'>+        return 0;</div><div class='add'>+</div><div class='add'>+    source_is_empty = afr_selfheal_name_source_empty_check(this, replies,</div><div class='add'>+                                                           sources, source);</div><div class='add'>+    if (source_is_empty) {</div><div class='add'>+        ret = __afr_selfheal_name_expunge(this, parent, pargfid, bname, inode,</div><div class='add'>+                                          replies);</div><div class='add'>+        if (ret == -EIO)</div><div class='add'>+            ret = -1;</div><div class='add'>+        return ret;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = afr_selfheal_name_type_mismatch_check(this, replies, source, sources,</div><div class='add'>+                                                pargfid, bname);</div><div class='add'>+    if (ret)</div><div class='add'>+        return ret;</div><div class='add'>+</div><div class='add'>+    ret = afr_selfheal_name_gfid_mismatch_check(this, replies, source, sources,</div><div class='add'>+                                                &amp;gfid_idx, pargfid, bname,</div><div class='add'>+                                                inode, locked_on, xdata);</div><div class='add'>+    if (ret)</div><div class='add'>+        return ret;</div><div class='add'>+</div><div class='add'>+    if (gfid_idx == -1) {</div><div class='add'>+        if (!gfid_req || gf_uuid_is_null(gfid_req))</div><div class='add'>+            return -1;</div><div class='add'>+        gfid = gfid_req;</div><div class='add'>+    } else {</div><div class='add'>+        gfid = &amp;replies[gfid_idx].poststat.ia_gfid;</div><div class='add'>+        if (source == -1)</div><div class='add'>+            /* Either entry split-brain or dirty xattrs are present on parent.*/</div><div class='add'>+            source = gfid_idx;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    is_gfid_absent = (gfid_idx == -1) ? _gf_true : _gf_false;</div><div class='add'>+    ret = __afr_selfheal_assign_gfid(this, parent, pargfid, bname, inode,</div><div class='add'>+                                     replies, gfid, locked_on, source, sources,</div><div class='add'>+                                     is_gfid_absent, &amp;gfid_idx);</div><div class='add'>+    if (ret || (gfid_idx &lt; 0))</div><div class='add'>+        return ret;</div><div class='add'>+</div><div class='add'>+    ret = __afr_selfheal_name_impunge(frame, this, parent, pargfid, bname,</div><div class='add'>+                                      inode, replies, gfid_idx);</div><div class='add'>+    if (ret == -EIO)</div><div class='add'>+        ret = -1;</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+__afr_selfheal_name_finalize_source(xlator_t *this, unsigned char *sources,</div><div class='add'>+                                    unsigned char *healed_sinks,</div><div class='add'>+                                    unsigned char *locked_on, uint64_t *witness)</div><div class='add'>+{</div><div class='add'>+    int i = 0;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    int source = -1;</div><div class='add'>+    int sources_count = 0;</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    sources_count = AFR_COUNT(sources, priv-&gt;child_count);</div><div class='add'>+</div><div class='add'>+    if ((AFR_CMP(locked_on, healed_sinks, priv-&gt;child_count) == 0) ||</div><div class='add'>+        !sources_count || afr_does_witness_exist(this, witness)) {</div><div class='add'>+        memset(sources, 0, sizeof(*sources) * priv-&gt;child_count);</div><div class='add'>+        afr_mark_active_sinks(this, sources, locked_on, healed_sinks);</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+        if (sources[i]) {</div><div class='add'>+            source = i;</div><div class='add'>+            break;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return source;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+__afr_selfheal_name_prepare(call_frame_t *frame, xlator_t *this,</div><div class='add'>+                            inode_t *parent, uuid_t pargfid,</div><div class='add'>+                            unsigned char *locked_on, unsigned char *sources,</div><div class='add'>+                            unsigned char *sinks, unsigned char *healed_sinks,</div><div class='add'>+                            int *source_p)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int source = -1;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    struct afr_reply *replies = NULL;</div><div class='add'>+    uint64_t *witness = NULL;</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    replies = alloca0(priv-&gt;child_count * sizeof(*replies));</div><div class='add'>+</div><div class='add'>+    ret = afr_selfheal_unlocked_discover(frame, parent, pargfid, replies);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    witness = alloca0(sizeof(*witness) * priv-&gt;child_count);</div><div class='add'>+    ret = afr_selfheal_find_direction(frame, this, replies,</div><div class='add'>+                                      AFR_ENTRY_TRANSACTION, locked_on, sources,</div><div class='add'>+                                      sinks, witness, NULL);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    /* Initialize the healed_sinks[] array optimistically to</div><div class='add'>+       the intersection of to-be-healed (i.e sinks[]) and</div><div class='add'>+       the list of servers which are up (i.e locked_on[]).</div><div class='add'>+</div><div class='add'>+       As we encounter failures in the healing process, we</div><div class='add'>+       will unmark the respective servers in the healed_sinks[]</div><div class='add'>+       array.</div><div class='add'>+    */</div><div class='add'>+    AFR_INTERSECT(healed_sinks, sinks, locked_on, priv-&gt;child_count);</div><div class='add'>+</div><div class='add'>+    source = __afr_selfheal_name_finalize_source(this, sources, healed_sinks,</div><div class='add'>+                                                 locked_on, witness);</div><div class='add'>+    if (source &lt; 0) {</div><div class='add'>+        /* If source is &lt; 0 (typically split-brain), we perform a</div><div class='add'>+           conservative merge of entries rather than erroring out */</div><div class='add'>+    }</div><div class='add'>+    *source_p = source;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (replies)</div><div class='add'>+        afr_replies_wipe(replies, priv-&gt;child_count);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+afr_selfheal_name_do(call_frame_t *frame, xlator_t *this, inode_t *parent,</div><div class='add'>+                     uuid_t pargfid, const char *bname, void *gfid_req,</div><div class='add'>+                     dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    unsigned char *sources = NULL;</div><div class='add'>+    unsigned char *sinks = NULL;</div><div class='add'>+    unsigned char *healed_sinks = NULL;</div><div class='add'>+    unsigned char *locked_on = NULL;</div><div class='add'>+    int source = -1;</div><div class='add'>+    struct afr_reply *replies = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    inode_t *inode = NULL;</div><div class='add'>+    dict_t *xattr = NULL;</div><div class='add'>+</div><div class='add'>+    xattr = dict_new();</div><div class='add'>+    if (!xattr)</div><div class='add'>+        return -ENOMEM;</div><div class='add'>+</div><div class='add'>+    ret = dict_set_int32_sizen(xattr, GF_GFIDLESS_LOOKUP, 1);</div><div class='add'>+    if (ret) {</div><div class='add'>+        dict_unref(xattr);</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    locked_on = alloca0(priv-&gt;child_count);</div><div class='add'>+    sources = alloca0(priv-&gt;child_count);</div><div class='add'>+    sinks = alloca0(priv-&gt;child_count);</div><div class='add'>+    healed_sinks = alloca0(priv-&gt;child_count);</div><div class='add'>+</div><div class='add'>+    replies = alloca0(priv-&gt;child_count * sizeof(*replies));</div><div class='add'>+</div><div class='add'>+    ret = afr_selfheal_entrylk(frame, this, parent, this-&gt;name, bname,</div><div class='add'>+                               locked_on);</div><div class='add'>+    {</div><div class='add'>+        if (ret &lt; priv-&gt;child_count) {</div><div class='add'>+            ret = -ENOTCONN;</div><div class='add'>+            goto unlock;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        ret = __afr_selfheal_name_prepare(frame, this, parent, pargfid,</div><div class='add'>+                                          locked_on, sources, sinks,</div><div class='add'>+                                          healed_sinks, &amp;source);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto unlock;</div><div class='add'>+</div><div class='add'>+        inode = afr_selfheal_unlocked_lookup_on(frame, parent, bname, replies,</div><div class='add'>+                                                locked_on, xattr);</div><div class='add'>+        if (!inode) {</div><div class='add'>+            ret = -ENOMEM;</div><div class='add'>+            goto unlock;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        ret = __afr_selfheal_name_do(frame, this, parent, pargfid, bname, inode,</div><div class='add'>+                                     sources, sinks, healed_sinks, source,</div><div class='add'>+                                     locked_on, replies, gfid_req, xdata);</div><div class='add'>+    }</div><div class='add'>+unlock:</div><div class='add'>+    afr_selfheal_unentrylk(frame, this, parent, this-&gt;name, bname, locked_on,</div><div class='add'>+                           NULL);</div><div class='add'>+    if (inode)</div><div class='add'>+        inode_unref(inode);</div><div class='add'>+</div><div class='add'>+    if (replies)</div><div class='add'>+        afr_replies_wipe(replies, priv-&gt;child_count);</div><div class='add'>+    if (xattr)</div><div class='add'>+        dict_unref(xattr);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+afr_selfheal_name_unlocked_inspect(call_frame_t *frame, xlator_t *this,</div><div class='add'>+                                   inode_t *parent, uuid_t pargfid,</div><div class='add'>+                                   const char *bname, gf_boolean_t *need_heal)</div><div class='add'>+{</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    int i = 0;</div><div class='add'>+    struct afr_reply *replies = NULL;</div><div class='add'>+    inode_t *inode = NULL;</div><div class='add'>+    int first_idx = -1;</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+</div><div class='add'>+    replies = alloca0(sizeof(*replies) * priv-&gt;child_count);</div><div class='add'>+</div><div class='add'>+    inode = afr_selfheal_unlocked_lookup_on(frame, parent, bname, replies,</div><div class='add'>+                                            local-&gt;child_up, NULL);</div><div class='add'>+    if (!inode)</div><div class='add'>+        return -ENOMEM;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+        if (!replies[i].valid)</div><div class='add'>+            continue;</div><div class='add'>+</div><div class='add'>+        if ((replies[i].op_ret == -1) &amp;&amp; (replies[i].op_errno == ENODATA)) {</div><div class='add'>+            *need_heal = _gf_true;</div><div class='add'>+            break;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        if (first_idx == -1) {</div><div class='add'>+            first_idx = i;</div><div class='add'>+            continue;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        if (replies[i].op_ret != replies[first_idx].op_ret) {</div><div class='add'>+            *need_heal = _gf_true;</div><div class='add'>+            break;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        if (gf_uuid_compare(replies[i].poststat.ia_gfid,</div><div class='add'>+                            replies[first_idx].poststat.ia_gfid)) {</div><div class='add'>+            *need_heal = _gf_true;</div><div class='add'>+            break;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (inode)</div><div class='add'>+        inode_unref(inode);</div><div class='add'>+    if (replies)</div><div class='add'>+        afr_replies_wipe(replies, priv-&gt;child_count);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+afr_selfheal_name(xlator_t *this, uuid_t pargfid, const char *bname,</div><div class='add'>+                  void *gfid_req, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    inode_t *parent = NULL;</div><div class='add'>+    call_frame_t *frame = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    gf_boolean_t need_heal = _gf_false;</div><div class='add'>+</div><div class='add'>+    parent = afr_inode_find(this, pargfid);</div><div class='add'>+    if (!parent)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    frame = afr_frame_create(this, NULL);</div><div class='add'>+    if (!frame)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    ret = afr_selfheal_name_unlocked_inspect(frame, this, parent, pargfid,</div><div class='add'>+                                             bname, &amp;need_heal);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    if (need_heal) {</div><div class='add'>+        ret = afr_selfheal_name_do(frame, this, parent, pargfid, bname,</div><div class='add'>+                                   gfid_req, xdata);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+out:</div><div class='add'>+    if (parent)</div><div class='add'>+        inode_unref(parent);</div><div class='add'>+    if (frame)</div><div class='add'>+        AFR_STACK_DESTROY(frame);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='head'>diff --git a/xlators/cluster/afr/src/afr-self-heal.h b/xlators/cluster/afr/src/afr-self-heal.h<br/>index c43473a4332..48e6dbcfb18 100644<br/>--- a/<a href='/cgit/glusterfs.git/tree/xlators/cluster/afr/src/afr-self-heal.h?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/cluster/afr/src/afr-self-heal.h</a><br/>+++ b/<a href='/cgit/glusterfs.git/tree/xlators/cluster/afr/src/afr-self-heal.h?id=d1d7a6f35c816822fab51c820e25023863c239c1'>xlators/cluster/afr/src/afr-self-heal.h</a></div><div class='hunk'>@@ -1,54 +1,377 @@</div><div class='ctx'> /*</div><div class='del'>-   Copyright (c) 2008-2009 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='del'>-   This file is part of GlusterFS.</div><div class='del'>-</div><div class='del'>-   GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-   it under the terms of the GNU General Public License as published</div><div class='del'>-   by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-   or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-   GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-   WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-   General Public License for more details.</div><div class='del'>-</div><div class='del'>-   You should have received a copy of the GNU General Public License</div><div class='del'>-   along with this program.  If not, see</div><div class='del'>-   &lt;http://www.gnu.org/licenses/&gt;.</div><div class='add'>+  Copyright (c) 2013 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='ctx'> */</div><div class='ctx'> </div><div class='del'>-#ifndef __AFR_SELF_HEAL_H__</div><div class='del'>-#define __AFR_SELF_HEAL_H__</div><div class='add'>+#ifndef _AFR_SELFHEAL_H</div><div class='add'>+#define _AFR_SELFHEAL_H</div><div class='add'>+</div><div class='add'>+/* Perform fop on all UP subvolumes and wait for all callbacks to return */</div><div class='add'>+</div><div class='add'>+#define AFR_ONALL(frame, rfn, fop, args...)                                    \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        afr_local_t *__local = frame-&gt;local;                                   \</div><div class='add'>+        afr_private_t *__priv = frame-&gt;this-&gt;private;                          \</div><div class='add'>+        int __i = 0, __count = 0;                                              \</div><div class='add'>+        unsigned char *__child_up = alloca(__priv-&gt;child_count);               \</div><div class='add'>+                                                                               \</div><div class='add'>+        memcpy(__child_up, __priv-&gt;child_up,                                   \</div><div class='add'>+               sizeof(*__child_up) * __priv-&gt;child_count);                     \</div><div class='add'>+        __count = AFR_COUNT(__child_up, __priv-&gt;child_count);                  \</div><div class='add'>+                                                                               \</div><div class='add'>+        __local-&gt;barrier.waitfor = __count;                                    \</div><div class='add'>+        afr_local_replies_wipe(__local, __priv);                               \</div><div class='add'>+                                                                               \</div><div class='add'>+        for (__i = 0; __i &lt; __priv-&gt;child_count; __i++) {                      \</div><div class='add'>+            if (!__child_up[__i])                                              \</div><div class='add'>+                continue;                                                      \</div><div class='add'>+            STACK_WIND_COOKIE(frame, rfn, (void *)(long)__i,                   \</div><div class='add'>+                              __priv-&gt;children[__i],                           \</div><div class='add'>+                              __priv-&gt;children[__i]-&gt;fops-&gt;fop, args);         \</div><div class='add'>+        }                                                                      \</div><div class='add'>+        syncbarrier_wait(&amp;__local-&gt;barrier, __count);                          \</div><div class='add'>+    } while (0)</div><div class='add'>+</div><div class='add'>+/* Perform fop on all subvolumes represented by list[] array and wait</div><div class='add'>+   for all callbacks to return */</div><div class='add'>+</div><div class='add'>+#define AFR_ONLIST(list, frame, rfn, fop, args...)                             \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        afr_local_t *__local = frame-&gt;local;                                   \</div><div class='add'>+        afr_private_t *__priv = frame-&gt;this-&gt;private;                          \</div><div class='add'>+        int __i = 0;                                                           \</div><div class='add'>+        int __count = 0;                                                       \</div><div class='add'>+        unsigned char *__list = alloca(__priv-&gt;child_count);                   \</div><div class='add'>+                                                                               \</div><div class='add'>+        memcpy(__list, list, sizeof(*__list) * __priv-&gt;child_count);           \</div><div class='add'>+        __count = AFR_COUNT(__list, __priv-&gt;child_count);                      \</div><div class='add'>+        __local-&gt;barrier.waitfor = __count;                                    \</div><div class='add'>+        afr_local_replies_wipe(__local, __priv);                               \</div><div class='add'>+                                                                               \</div><div class='add'>+        for (__i = 0; __i &lt; __priv-&gt;child_count; __i++) {                      \</div><div class='add'>+            if (!__list[__i])                                                  \</div><div class='add'>+                continue;                                                      \</div><div class='add'>+            STACK_WIND_COOKIE(frame, rfn, (void *)(long)__i,                   \</div><div class='add'>+                              __priv-&gt;children[__i],                           \</div><div class='add'>+                              __priv-&gt;children[__i]-&gt;fops-&gt;fop, args);         \</div><div class='add'>+        }                                                                      \</div><div class='add'>+        syncbarrier_wait(&amp;__local-&gt;barrier, __count);                          \</div><div class='add'>+    } while (0)</div><div class='add'>+</div><div class='add'>+#define AFR_SEQ(frame, rfn, fop, args...)                                      \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        afr_local_t *__local = frame-&gt;local;                                   \</div><div class='add'>+        afr_private_t *__priv = frame-&gt;this-&gt;private;                          \</div><div class='add'>+        int __i = 0;                                                           \</div><div class='add'>+                                                                               \</div><div class='add'>+        afr_local_replies_wipe(__local, __priv);                               \</div><div class='add'>+                                                                               \</div><div class='add'>+        for (__i = 0; __i &lt; __priv-&gt;child_count; __i++) {                      \</div><div class='add'>+            if (!__priv-&gt;child_up[__i])                                        \</div><div class='add'>+                continue;                                                      \</div><div class='add'>+            STACK_WIND_COOKIE(frame, rfn, (void *)(long)__i,                   \</div><div class='add'>+                              __priv-&gt;children[__i],                           \</div><div class='add'>+                              __priv-&gt;children[__i]-&gt;fops-&gt;fop, args);         \</div><div class='add'>+            syncbarrier_wait(&amp;__local-&gt;barrier, 1);                            \</div><div class='add'>+        }                                                                      \</div><div class='add'>+    } while (0)</div><div class='add'>+</div><div class='add'>+#define ALLOC_MATRIX(n, type)                                                  \</div><div class='add'>+    ({                                                                         \</div><div class='add'>+        int __i;                                                               \</div><div class='add'>+        type **__ptr = alloca(n * sizeof(type *));                             \</div><div class='add'>+                                                                               \</div><div class='add'>+        for (__i = 0; __i &lt; n; __i++)                                          \</div><div class='add'>+            __ptr[__i] = alloca0(n * sizeof(type));                            \</div><div class='add'>+        __ptr;                                                                 \</div><div class='add'>+    })</div><div class='add'>+</div><div class='add'>+#define IA_EQUAL(f, s, field)                                                  \</div><div class='add'>+    (memcmp(&amp;(f.ia_##field), &amp;(s.ia_##field), sizeof(s.ia_##field)) == 0)</div><div class='add'>+</div><div class='add'>+#define SBRAIN_HEAL_NO_GO_MSG                                                  \</div><div class='add'>+    "Failed to obtain replies from all bricks of "                             \</div><div class='add'>+    "the replica (are they up?). Cannot resolve split-brain."</div><div class='add'>+#define SFILE_NOT_IN_SPLIT_BRAIN "File not in split-brain"</div><div class='add'>+#define SNO_BIGGER_FILE "No bigger file"</div><div class='add'>+#define SNO_DIFF_IN_MTIME "No difference in mtime"</div><div class='add'>+#define SUSE_SOURCE_BRICK_TO_HEAL                                              \</div><div class='add'>+    "Use source-brick option to heal metadata"                                 \</div><div class='add'>+    " split-brain"</div><div class='add'>+#define SINVALID_BRICK_NAME "Invalid brick name"</div><div class='add'>+#define SBRICK_IS_NOT_UP "Brick is not up"</div><div class='add'>+#define SBRICK_NOT_CONNECTED "Brick is not connected"</div><div class='add'>+#define SLESS_THAN2_BRICKS_in_REP "&lt; 2 bricks in replica are up"</div><div class='add'>+#define SBRICK_IS_REMOTE "Brick is remote"</div><div class='add'>+#define SSTARTED_SELF_HEAL "Started self-heal"</div><div class='add'>+#define SOP_NOT_SUPPORTED "Operation Not Supported"</div><div class='add'>+#define SFILE_NOT_UNDER_DATA                                                   \</div><div class='add'>+    "The file is not under data or metadata "                                  \</div><div class='add'>+    "split-brain"</div><div class='add'>+#define SFILE_NOT_IN_SPLIT_BRAIN "File not in split-brain"</div><div class='add'>+#define SALL_BRICKS_UP_TO_RESOLVE                                              \</div><div class='add'>+    "All the bricks should be up to resolve the"                               \</div><div class='add'>+    " gfid split brain"</div><div class='add'>+#define SERROR_GETTING_SRC_BRICK "Error getting the source brick"</div><div class='add'>+int</div><div class='add'>+afr_selfheal(xlator_t *this, uuid_t gfid);</div><div class='add'>+</div><div class='add'>+gf_boolean_t</div><div class='add'>+afr_throttled_selfheal(call_frame_t *frame, xlator_t *this);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+afr_selfheal_name(xlator_t *this, uuid_t gfid, const char *name, void *gfid_req,</div><div class='add'>+                  dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+afr_selfheal_data(call_frame_t *frame, xlator_t *this, fd_t *fd);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+afr_selfheal_metadata(call_frame_t *frame, xlator_t *this, inode_t *inode);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+afr_selfheal_entry(call_frame_t *frame, xlator_t *this, inode_t *inode);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+afr_lookup_and_heal_gfid(xlator_t *this, inode_t *parent, const char *name,</div><div class='add'>+                         inode_t *inode, struct afr_reply *replies, int source,</div><div class='add'>+                         unsigned char *sources, void *gfid, int *gfid_idx);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+afr_selfheal_inodelk(call_frame_t *frame, xlator_t *this, inode_t *inode,</div><div class='add'>+                     char *dom, off_t off, size_t size,</div><div class='add'>+                     unsigned char *locked_on);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+afr_selfheal_tryinodelk(call_frame_t *frame, xlator_t *this, inode_t *inode,</div><div class='add'>+                        char *dom, off_t off, size_t size,</div><div class='add'>+                        unsigned char *locked_on);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+afr_selfheal_tie_breaker_inodelk(call_frame_t *frame, xlator_t *this,</div><div class='add'>+                                 inode_t *inode, char *dom, off_t off,</div><div class='add'>+                                 size_t size, unsigned char *locked_on);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+afr_selfheal_uninodelk(call_frame_t *frame, xlator_t *this, inode_t *inode,</div><div class='add'>+                       char *dom, off_t off, size_t size,</div><div class='add'>+                       const unsigned char *locked_on);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+afr_selfheal_entrylk(call_frame_t *frame, xlator_t *this, inode_t *inode,</div><div class='add'>+                     char *dom, const char *name, unsigned char *locked_on);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+afr_selfheal_tryentrylk(call_frame_t *frame, xlator_t *this, inode_t *inode,</div><div class='add'>+                        char *dom, const char *name, unsigned char *locked_on);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+afr_selfheal_tie_breaker_entrylk(call_frame_t *frame, xlator_t *this,</div><div class='add'>+                                 inode_t *inode, char *dom, const char *name,</div><div class='add'>+                                 unsigned char *locked_on);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+afr_selfheal_unentrylk(call_frame_t *frame, xlator_t *this, inode_t *inode,</div><div class='add'>+                       char *dom, const char *name, unsigned char *locked_on,</div><div class='add'>+                       dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+afr_selfheal_unlocked_discover(call_frame_t *frame, inode_t *inode, uuid_t gfid,</div><div class='add'>+                               struct afr_reply *replies);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+afr_selfheal_unlocked_discover_on(call_frame_t *frame, inode_t *inode,</div><div class='add'>+                                  uuid_t gfid, struct afr_reply *replies,</div><div class='add'>+                                  unsigned char *discover_on, dict_t *dict);</div><div class='add'>+inode_t *</div><div class='add'>+afr_selfheal_unlocked_lookup_on(call_frame_t *frame, inode_t *parent,</div><div class='add'>+                                const char *name, struct afr_reply *replies,</div><div class='add'>+                                unsigned char *lookup_on, dict_t *xattr);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+afr_selfheal_find_direction(call_frame_t *frame, xlator_t *this,</div><div class='add'>+                            struct afr_reply *replies,</div><div class='add'>+                            afr_transaction_type type, unsigned char *locked_on,</div><div class='add'>+                            unsigned char *sources, unsigned char *sinks,</div><div class='add'>+                            uint64_t *witness, unsigned char *flag);</div><div class='add'>+int</div><div class='add'>+afr_selfheal_fill_matrix(xlator_t *this, int **matrix, int subvol, int idx,</div><div class='add'>+                         dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+afr_selfheal_extract_xattr(xlator_t *this, struct afr_reply *replies,</div><div class='add'>+                           afr_transaction_type type, int *dirty, int **matrix);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+afr_sh_generic_fop_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                       int op_ret, int op_errno, struct iatt *pre,</div><div class='add'>+                       struct iatt *post, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+afr_selfheal_restore_time(call_frame_t *frame, xlator_t *this, inode_t *inode,</div><div class='add'>+                          int source, unsigned char *healed_sinks,</div><div class='add'>+                          struct afr_reply *replies);</div><div class='add'>+int</div><div class='add'>+afr_selfheal_undo_pending(call_frame_t *frame, xlator_t *this, inode_t *inode,</div><div class='add'>+                          unsigned char *sources, unsigned char *sinks,</div><div class='add'>+                          unsigned char *healed_sinks,</div><div class='add'>+                          unsigned char *undid_pending,</div><div class='add'>+                          afr_transaction_type type, struct afr_reply *replies,</div><div class='add'>+                          unsigned char *locked_on);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+afr_selfheal_recreate_entry(call_frame_t *frame, int dst, int source,</div><div class='add'>+                            unsigned char *sources, inode_t *dir,</div><div class='add'>+                            const char *name, inode_t *inode,</div><div class='add'>+                            struct afr_reply *replies);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+afr_selfheal_post_op(call_frame_t *frame, xlator_t *this, inode_t *inode,</div><div class='add'>+                     int subvol, dict_t *xattr, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+call_frame_t *</div><div class='add'>+afr_frame_create(xlator_t *this, int32_t *op_errno);</div><div class='add'>+</div><div class='add'>+inode_t *</div><div class='add'>+afr_inode_find(xlator_t *this, uuid_t gfid);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+afr_selfheal_discover_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                          int op_ret, int op_errno, inode_t *inode,</div><div class='add'>+                          struct iatt *buf, dict_t *xdata, struct iatt *parbuf);</div><div class='add'>+void</div><div class='add'>+afr_reply_copy(struct afr_reply *dst, struct afr_reply *src);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+afr_replies_copy(struct afr_reply *dst, struct afr_reply *src, int count);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+afr_selfheal_newentry_mark(call_frame_t *frame, xlator_t *this, inode_t *inode,</div><div class='add'>+                           int source, struct afr_reply *replies,</div><div class='add'>+                           unsigned char *sources, unsigned char *newentry);</div><div class='add'>+</div><div class='add'>+unsigned int</div><div class='add'>+afr_success_count(struct afr_reply *replies, unsigned int count);</div><div class='ctx'> </div><div class='del'>-#include &lt;sys/stat.h&gt;</div><div class='add'>+void</div><div class='add'>+afr_log_selfheal(uuid_t gfid, xlator_t *this, int ret, char *type, int source,</div><div class='add'>+                 unsigned char *sources, unsigned char *healed_sinks);</div><div class='ctx'> </div><div class='del'>-#define FILETYPE_DIFFERS(buf1,buf2) ((buf1)-&gt;ia_type != (buf2)-&gt;ia_type)</div><div class='del'>-#define PERMISSION_DIFFERS(buf1,buf2) (st_mode_from_ia ((buf1)-&gt;ia_prot, (buf1)-&gt;ia_type) != st_mode_from_ia ((buf2)-&gt;ia_prot, (buf2)-&gt;ia_type))</div><div class='del'>-#define OWNERSHIP_DIFFERS(buf1,buf2) (((buf1)-&gt;ia_uid != (buf2)-&gt;ia_uid) || ((buf1)-&gt;ia_gid != (buf2)-&gt;ia_gid))</div><div class='del'>-#define SIZE_DIFFERS(buf1,buf2) ((buf1)-&gt;ia_size != (buf2)-&gt;ia_size)</div><div class='add'>+void</div><div class='add'>+afr_mark_largest_file_as_source(xlator_t *this, unsigned char *sources,</div><div class='add'>+                                struct afr_reply *replies);</div><div class='add'>+void</div><div class='add'>+afr_mark_active_sinks(xlator_t *this, unsigned char *sources,</div><div class='add'>+                      unsigned char *locked_on, unsigned char *sinks);</div><div class='ctx'> </div><div class='del'>-#define SIZE_GREATER(buf1,buf2) ((buf1)-&gt;ia_size &gt; (buf2)-&gt;ia_size)</div><div class='add'>+gf_boolean_t</div><div class='add'>+afr_dict_contains_heal_op(call_frame_t *frame);</div><div class='ctx'> </div><div class='add'>+gf_boolean_t</div><div class='add'>+afr_can_decide_split_brain_source_sinks(struct afr_reply *replies,</div><div class='add'>+                                        int child_count);</div><div class='ctx'> int</div><div class='del'>-afr_sh_has_metadata_pending (dict_t *xattr, int child_count, xlator_t *this);</div><div class='add'>+afr_mark_split_brain_source_sinks(</div><div class='add'>+    call_frame_t *frame, xlator_t *this, inode_t *inode, unsigned char *sources,</div><div class='add'>+    unsigned char *sinks, unsigned char *healed_sinks, unsigned char *locked_on,</div><div class='add'>+    struct afr_reply *replies, afr_transaction_type type);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+afr_sh_get_fav_by_policy(xlator_t *this, struct afr_reply *replies,</div><div class='add'>+                         inode_t *inode, char **policy_str);</div><div class='add'>+</div><div class='ctx'> int</div><div class='del'>-afr_sh_has_entry_pending (dict_t *xattr, int child_count, xlator_t *this);</div><div class='add'>+_afr_fav_child_reset_sink_xattrs(call_frame_t *frame, xlator_t *this,</div><div class='add'>+                                 inode_t *inode, int source,</div><div class='add'>+                                 unsigned char *healed_sinks,</div><div class='add'>+                                 unsigned char *undid_pending,</div><div class='add'>+                                 afr_transaction_type type,</div><div class='add'>+                                 unsigned char *locked_on,</div><div class='add'>+                                 struct afr_reply *replies);</div><div class='add'>+</div><div class='ctx'> int</div><div class='del'>-afr_sh_has_data_pending (dict_t *xattr, int child_count, xlator_t *this);</div><div class='add'>+afr_get_child_index_from_name(xlator_t *this, char *name);</div><div class='add'>+</div><div class='add'>+gf_boolean_t</div><div class='add'>+afr_does_witness_exist(xlator_t *this, uint64_t *witness);</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-afr_self_heal_entry (call_frame_t *frame, xlator_t *this);</div><div class='add'>+__afr_selfheal_data_prepare(call_frame_t *frame, xlator_t *this, inode_t *inode,</div><div class='add'>+                            unsigned char *locked_on, unsigned char *sources,</div><div class='add'>+                            unsigned char *sinks, unsigned char *healed_sinks,</div><div class='add'>+                            unsigned char *undid_pending,</div><div class='add'>+                            struct afr_reply *replies, unsigned char *flag);</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-afr_self_heal_data (call_frame_t *frame, xlator_t *this);</div><div class='add'>+__afr_selfheal_metadata_prepare(call_frame_t *frame, xlator_t *this,</div><div class='add'>+                                inode_t *inode, unsigned char *locked_on,</div><div class='add'>+                                unsigned char *sources, unsigned char *sinks,</div><div class='add'>+                                unsigned char *healed_sinks,</div><div class='add'>+                                unsigned char *undid_pending,</div><div class='add'>+                                struct afr_reply *replies, unsigned char *flag);</div><div class='add'>+int</div><div class='add'>+__afr_selfheal_entry_prepare(call_frame_t *frame, xlator_t *this,</div><div class='add'>+                             inode_t *inode, unsigned char *locked_on,</div><div class='add'>+                             unsigned char *sources, unsigned char *sinks,</div><div class='add'>+                             unsigned char *healed_sinks,</div><div class='add'>+                             struct afr_reply *replies, int *source_p,</div><div class='add'>+                             unsigned char *flag);</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-afr_self_heal_metadata (call_frame_t *frame, xlator_t *this);</div><div class='add'>+afr_selfheal_unlocked_inspect(call_frame_t *frame, xlator_t *this, uuid_t gfid,</div><div class='add'>+                              inode_t **link_inode, gf_boolean_t *data_selfheal,</div><div class='add'>+                              gf_boolean_t *metadata_selfheal,</div><div class='add'>+                              gf_boolean_t *entry_selfheal,</div><div class='add'>+                              struct afr_reply *replies);</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-afr_self_heal_get_source (xlator_t *this, afr_local_t *local, dict_t **xattr);</div><div class='add'>+afr_selfheal_do(call_frame_t *frame, xlator_t *this, uuid_t gfid);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+afr_selfheal_lock_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                      int op_ret, int op_errno, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+afr_locked_fill(call_frame_t *frame, xlator_t *this, unsigned char *locked_on);</div><div class='add'>+int</div><div class='add'>+afr_choose_source_by_policy(afr_private_t *priv, unsigned char *sources,</div><div class='add'>+                            afr_transaction_type type);</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-afr_self_heal (call_frame_t *frame, xlator_t *this);</div><div class='add'>+afr_selfheal_metadata_by_stbuf(xlator_t *this, struct iatt *stbuf);</div><div class='ctx'> </div><div class='del'>-#endif /* __AFR_SELF_HEAL_H__ */</div><div class='add'>+int</div><div class='add'>+afr_sh_fav_by_size(xlator_t *this, struct afr_reply *replies, inode_t *inode);</div><div class='add'>+int</div><div class='add'>+afr_sh_fav_by_mtime(xlator_t *this, struct afr_reply *replies, inode_t *inode);</div><div class='add'>+int</div><div class='add'>+afr_sh_fav_by_ctime(xlator_t *this, struct afr_reply *replies, inode_t *inode);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+afr_gfid_split_brain_source(xlator_t *this, struct afr_reply *replies,</div><div class='add'>+                            inode_t *inode, uuid_t pargfid, const char *bname,</div><div class='add'>+                            int src_idx, int child_idx,</div><div class='add'>+                            unsigned char *locked_on, int *src, dict_t *xdata);</div><div class='add'>+int</div><div class='add'>+afr_mark_source_sinks_if_file_empty(xlator_t *this, unsigned char *sources,</div><div class='add'>+                                    unsigned char *sinks,</div><div class='add'>+                                    unsigned char *healed_sinks,</div><div class='add'>+                                    unsigned char *locked_on,</div><div class='add'>+                                    struct afr_reply *replies,</div><div class='add'>+                                    afr_transaction_type type);</div><div class='add'>+</div><div class='add'>+gf_boolean_t</div><div class='add'>+afr_is_file_empty_on_all_children(afr_private_t *priv,</div><div class='add'>+                                  struct afr_reply *replies);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+afr_selfheal_entry_delete(xlator_t *this, inode_t *dir, const char *name,</div><div class='add'>+                          inode_t *inode, int child, struct afr_reply *replies);</div><div class='add'>+int</div><div class='add'>+afr_anon_inode_create(xlator_t *this, int child, inode_t **linked_inode);</div><div class='add'>+#endif /* !_AFR_SELFHEAL_H */</div><div class='head'>diff --git a/xlators/cluster/afr/src/afr-self-heald.c b/xlators/cluster/afr/src/afr-self-heald.c<br/>new file mode 100644<br/>index 00000000000..109fd4b7421<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/xlators/cluster/afr/src/afr-self-heald.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>xlators/cluster/afr/src/afr-self-heald.c</a></div><div class='hunk'>@@ -0,0 +1,1716 @@</div><div class='add'>+/*</div><div class='add'>+  Copyright (c) 2013 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#include "afr.h"</div><div class='add'>+#include "afr-self-heal.h"</div><div class='add'>+#include "afr-self-heald.h"</div><div class='add'>+#include "protocol-common.h"</div><div class='add'>+#include &lt;glusterfs/syncop-utils.h&gt;</div><div class='add'>+#include "afr-messages.h"</div><div class='add'>+#include &lt;glusterfs/byte-order.h&gt;</div><div class='add'>+</div><div class='add'>+#define AFR_EH_SPLIT_BRAIN_LIMIT 1024</div><div class='add'>+#define AFR_STATISTICS_HISTORY_SIZE 50</div><div class='add'>+</div><div class='add'>+#define ASSERT_LOCAL(this, healer)                                             \</div><div class='add'>+    if (!afr_shd_is_subvol_local(this, healer-&gt;subvol)) {                      \</div><div class='add'>+        healer-&gt;local = _gf_false;                                             \</div><div class='add'>+        if (safe_break(healer)) {                                              \</div><div class='add'>+            break;                                                             \</div><div class='add'>+        } else {                                                               \</div><div class='add'>+            continue;                                                          \</div><div class='add'>+        }                                                                      \</div><div class='add'>+    } else {                                                                   \</div><div class='add'>+        healer-&gt;local = _gf_true;                                              \</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+#define NTH_INDEX_HEALER(this, n)                                              \</div><div class='add'>+    &amp;((((afr_private_t *)this-&gt;private))-&gt;shd.index_healers[n])</div><div class='add'>+#define NTH_FULL_HEALER(this, n)                                               \</div><div class='add'>+    &amp;((((afr_private_t *)this-&gt;private))-&gt;shd.full_healers[n])</div><div class='add'>+</div><div class='add'>+char *</div><div class='add'>+afr_subvol_name(xlator_t *this, int subvol)</div><div class='add'>+{</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+    if (subvol &lt; 0 || subvol &gt; priv-&gt;child_count)</div><div class='add'>+        return NULL;</div><div class='add'>+</div><div class='add'>+    return priv-&gt;children[subvol]-&gt;name;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+afr_destroy_crawl_event_data(void *data)</div><div class='add'>+{</div><div class='add'>+    return;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+afr_destroy_shd_event_data(void *data)</div><div class='add'>+{</div><div class='add'>+    shd_event_t *shd_event = data;</div><div class='add'>+</div><div class='add'>+    if (!shd_event)</div><div class='add'>+        return;</div><div class='add'>+    GF_FREE(shd_event-&gt;path);</div><div class='add'>+</div><div class='add'>+    return;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+gf_boolean_t</div><div class='add'>+afr_shd_is_subvol_local(xlator_t *this, int subvol)</div><div class='add'>+{</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    gf_boolean_t is_local = _gf_false;</div><div class='add'>+    loc_t loc = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    loc.inode = this-&gt;itable-&gt;root;</div><div class='add'>+    gf_uuid_copy(loc.gfid, loc.inode-&gt;gfid);</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+    syncop_is_subvol_local(priv-&gt;children[subvol], &amp;loc, &amp;is_local);</div><div class='add'>+    return is_local;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+__afr_shd_healer_wait(struct subvol_healer *healer)</div><div class='add'>+{</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    struct timespec wait_till = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    priv = healer-&gt;this-&gt;private;</div><div class='add'>+</div><div class='add'>+disabled_loop:</div><div class='add'>+    wait_till.tv_sec = gf_time() + priv-&gt;shd.timeout;</div><div class='add'>+</div><div class='add'>+    while (!healer-&gt;rerun) {</div><div class='add'>+        ret = pthread_cond_timedwait(&amp;healer-&gt;cond, &amp;healer-&gt;mutex, &amp;wait_till);</div><div class='add'>+        if (ret == ETIMEDOUT)</div><div class='add'>+            break;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = healer-&gt;rerun;</div><div class='add'>+    healer-&gt;rerun = 0;</div><div class='add'>+</div><div class='add'>+    if (!priv-&gt;shd.enabled)</div><div class='add'>+        goto disabled_loop;</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+afr_shd_healer_wait(struct subvol_healer *healer)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    pthread_mutex_lock(&amp;healer-&gt;mutex);</div><div class='add'>+    {</div><div class='add'>+        ret = __afr_shd_healer_wait(healer);</div><div class='add'>+    }</div><div class='add'>+    pthread_mutex_unlock(&amp;healer-&gt;mutex);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+gf_boolean_t</div><div class='add'>+safe_break(struct subvol_healer *healer)</div><div class='add'>+{</div><div class='add'>+    gf_boolean_t ret = _gf_false;</div><div class='add'>+</div><div class='add'>+    pthread_mutex_lock(&amp;healer-&gt;mutex);</div><div class='add'>+    {</div><div class='add'>+        if (healer-&gt;rerun)</div><div class='add'>+            goto unlock;</div><div class='add'>+</div><div class='add'>+        healer-&gt;running = _gf_false;</div><div class='add'>+        ret = _gf_true;</div><div class='add'>+    }</div><div class='add'>+unlock:</div><div class='add'>+    pthread_mutex_unlock(&amp;healer-&gt;mutex);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+inode_t *</div><div class='add'>+afr_shd_inode_find(xlator_t *this, xlator_t *subvol, uuid_t gfid)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+    uint64_t val = IA_INVAL;</div><div class='add'>+    dict_t *xdata = NULL;</div><div class='add'>+    dict_t *rsp_dict = NULL;</div><div class='add'>+    inode_t *inode = NULL;</div><div class='add'>+</div><div class='add'>+    xdata = dict_new();</div><div class='add'>+    if (!xdata)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    ret = dict_set_int8(xdata, GF_INDEX_IA_TYPE_GET_REQ, 1);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    ret = syncop_inode_find(this, subvol, gfid, &amp;inode, xdata, &amp;rsp_dict);</div><div class='add'>+    if (ret &lt; 0)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    if (rsp_dict) {</div><div class='add'>+        ret = dict_get_uint64(rsp_dict, GF_INDEX_IA_TYPE_GET_RSP, &amp;val);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+    }</div><div class='add'>+    ret = inode_ctx_set2(inode, subvol, 0, &amp;val);</div><div class='add'>+out:</div><div class='add'>+    if (ret &amp;&amp; inode) {</div><div class='add'>+        inode_unref(inode);</div><div class='add'>+        inode = NULL;</div><div class='add'>+    }</div><div class='add'>+    if (xdata)</div><div class='add'>+        dict_unref(xdata);</div><div class='add'>+    if (rsp_dict)</div><div class='add'>+        dict_unref(rsp_dict);</div><div class='add'>+    return inode;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+inode_t *</div><div class='add'>+afr_shd_index_inode(xlator_t *this, xlator_t *subvol, char *vgfid)</div><div class='add'>+{</div><div class='add'>+    loc_t rootloc = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    inode_t *inode = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    dict_t *xattr = NULL;</div><div class='add'>+    void *index_gfid = NULL;</div><div class='add'>+</div><div class='add'>+    rootloc.inode = inode_ref(this-&gt;itable-&gt;root);</div><div class='add'>+    gf_uuid_copy(rootloc.gfid, rootloc.inode-&gt;gfid);</div><div class='add'>+</div><div class='add'>+    ret = syncop_getxattr(subvol, &amp;rootloc, &amp;xattr, vgfid, NULL, NULL);</div><div class='add'>+    if (ret || !xattr) {</div><div class='add'>+        errno = -ret;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_get_ptr(xattr, vgfid, &amp;index_gfid);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    gf_msg_debug(this-&gt;name, 0, "%s dir gfid for %s: %s", vgfid, subvol-&gt;name,</div><div class='add'>+                 uuid_utoa(index_gfid));</div><div class='add'>+</div><div class='add'>+    inode = afr_shd_inode_find(this, subvol, index_gfid);</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    loc_wipe(&amp;rootloc);</div><div class='add'>+</div><div class='add'>+    if (xattr)</div><div class='add'>+        dict_unref(xattr);</div><div class='add'>+</div><div class='add'>+    return inode;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+afr_shd_entry_purge(xlator_t *subvol, inode_t *inode, char *name,</div><div class='add'>+                    ia_type_t type)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+    loc_t loc = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    loc.parent = inode_ref(inode);</div><div class='add'>+    loc.name = name;</div><div class='add'>+</div><div class='add'>+    if (IA_ISDIR(type))</div><div class='add'>+        ret = syncop_rmdir(subvol, &amp;loc, 1, NULL, NULL);</div><div class='add'>+    else</div><div class='add'>+        ret = syncop_unlink(subvol, &amp;loc, NULL, NULL);</div><div class='add'>+</div><div class='add'>+    loc_wipe(&amp;loc);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+afr_shd_zero_xattrop(xlator_t *this, uuid_t gfid)</div><div class='add'>+{</div><div class='add'>+    call_frame_t *frame = NULL;</div><div class='add'>+    inode_t *inode = NULL;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    dict_t *xattr = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    int i = 0;</div><div class='add'>+    int raw[AFR_NUM_CHANGE_LOGS] = {0};</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+    frame = afr_frame_create(this, NULL);</div><div class='add'>+    if (!frame)</div><div class='add'>+        goto out;</div><div class='add'>+    inode = afr_inode_find(this, gfid);</div><div class='add'>+    if (!inode)</div><div class='add'>+        goto out;</div><div class='add'>+    xattr = dict_new();</div><div class='add'>+    if (!xattr)</div><div class='add'>+        goto out;</div><div class='add'>+    ret = dict_set_static_bin(xattr, AFR_DIRTY, raw,</div><div class='add'>+                              sizeof(int) * AFR_NUM_CHANGE_LOGS);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+    for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+        ret = dict_set_static_bin(xattr, priv-&gt;pending_key[i], raw,</div><div class='add'>+                                  sizeof(int) * AFR_NUM_CHANGE_LOGS);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /*Send xattrop to all bricks. Doing a lookup to see if bricks are up or</div><div class='add'>+     * has valid repies for this gfid seems a bit of an overkill.*/</div><div class='add'>+    for (i = 0; i &lt; priv-&gt;child_count; i++)</div><div class='add'>+        afr_selfheal_post_op(frame, this, inode, i, xattr, NULL);</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (frame)</div><div class='add'>+        AFR_STACK_DESTROY(frame);</div><div class='add'>+    if (inode)</div><div class='add'>+        inode_unref(inode);</div><div class='add'>+    if (xattr)</div><div class='add'>+        dict_unref(xattr);</div><div class='add'>+    return;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+afr_shd_selfheal_name(struct subvol_healer *healer, int child, uuid_t parent,</div><div class='add'>+                      const char *bname)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    ret = afr_selfheal_name(THIS, parent, bname, NULL, NULL);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+afr_shd_selfheal(struct subvol_healer *healer, int child, uuid_t gfid)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+    eh_t *eh = NULL;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    afr_self_heald_t *shd = NULL;</div><div class='add'>+    shd_event_t *shd_event = NULL;</div><div class='add'>+    char *path = NULL;</div><div class='add'>+    xlator_t *subvol = NULL;</div><div class='add'>+    xlator_t *this = NULL;</div><div class='add'>+    crawl_event_t *crawl_event = NULL;</div><div class='add'>+</div><div class='add'>+    this = healer-&gt;this;</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+    shd = &amp;priv-&gt;shd;</div><div class='add'>+    crawl_event = &amp;healer-&gt;crawl_event;</div><div class='add'>+</div><div class='add'>+    subvol = priv-&gt;children[child];</div><div class='add'>+</div><div class='add'>+    // If this fails with ENOENT/ESTALE index is stale</div><div class='add'>+    ret = syncop_gfid_to_path(this-&gt;itable, subvol, gfid, &amp;path);</div><div class='add'>+    if (ret &lt; 0)</div><div class='add'>+        return ret;</div><div class='add'>+</div><div class='add'>+    ret = afr_selfheal(this, gfid);</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;priv-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        if (ret == -EIO) {</div><div class='add'>+            eh = shd-&gt;split_brain;</div><div class='add'>+            crawl_event-&gt;split_brain_count++;</div><div class='add'>+        } else if (ret &lt; 0) {</div><div class='add'>+            crawl_event-&gt;heal_failed_count++;</div><div class='add'>+        } else if (ret == 0) {</div><div class='add'>+            crawl_event-&gt;healed_count++;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    UNLOCK(&amp;priv-&gt;lock);</div><div class='add'>+</div><div class='add'>+    if (eh) {</div><div class='add'>+        shd_event = GF_CALLOC(1, sizeof(*shd_event), gf_afr_mt_shd_event_t);</div><div class='add'>+        if (!shd_event)</div><div class='add'>+            goto out;</div><div class='add'>+</div><div class='add'>+        shd_event-&gt;child = child;</div><div class='add'>+        shd_event-&gt;path = path;</div><div class='add'>+</div><div class='add'>+        if (eh_save_history(eh, shd_event) &lt; 0)</div><div class='add'>+            goto out;</div><div class='add'>+</div><div class='add'>+        shd_event = NULL;</div><div class='add'>+        path = NULL;</div><div class='add'>+    }</div><div class='add'>+out:</div><div class='add'>+    GF_FREE(shd_event);</div><div class='add'>+    GF_FREE(path);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+afr_shd_sweep_prepare(struct subvol_healer *healer)</div><div class='add'>+{</div><div class='add'>+    crawl_event_t *event = NULL;</div><div class='add'>+</div><div class='add'>+    event = &amp;healer-&gt;crawl_event;</div><div class='add'>+</div><div class='add'>+    event-&gt;healed_count = 0;</div><div class='add'>+    event-&gt;split_brain_count = 0;</div><div class='add'>+    event-&gt;heal_failed_count = 0;</div><div class='add'>+</div><div class='add'>+    event-&gt;start_time = gf_time();</div><div class='add'>+    event-&gt;end_time = 0;</div><div class='add'>+    _mask_cancellation();</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+afr_shd_sweep_done(struct subvol_healer *healer)</div><div class='add'>+{</div><div class='add'>+    crawl_event_t *event = NULL;</div><div class='add'>+    crawl_event_t *history = NULL;</div><div class='add'>+    afr_self_heald_t *shd = NULL;</div><div class='add'>+</div><div class='add'>+    event = &amp;healer-&gt;crawl_event;</div><div class='add'>+    shd = &amp;(((afr_private_t *)healer-&gt;this-&gt;private)-&gt;shd);</div><div class='add'>+</div><div class='add'>+    event-&gt;end_time = gf_time();</div><div class='add'>+    history = gf_memdup(event, sizeof(*event));</div><div class='add'>+    event-&gt;start_time = 0;</div><div class='add'>+</div><div class='add'>+    if (!history)</div><div class='add'>+        return;</div><div class='add'>+</div><div class='add'>+    if (eh_save_history(shd-&gt;statistics[healer-&gt;subvol], history) &lt; 0)</div><div class='add'>+        GF_FREE(history);</div><div class='add'>+    _unmask_cancellation();</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+afr_shd_index_heal(xlator_t *subvol, gf_dirent_t *entry, loc_t *parent,</div><div class='add'>+                   void *data)</div><div class='add'>+{</div><div class='add'>+    struct subvol_healer *healer = data;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    uuid_t gfid = {0};</div><div class='add'>+    int ret = 0;</div><div class='add'>+    uint64_t val = IA_INVAL;</div><div class='add'>+</div><div class='add'>+    priv = healer-&gt;this-&gt;private;</div><div class='add'>+    if (!priv-&gt;shd.enabled)</div><div class='add'>+        return -EBUSY;</div><div class='add'>+</div><div class='add'>+    gf_msg_debug(healer-&gt;this-&gt;name, 0, "got entry: %s from %s", entry-&gt;d_name,</div><div class='add'>+                 priv-&gt;children[healer-&gt;subvol]-&gt;name);</div><div class='add'>+</div><div class='add'>+    ret = gf_uuid_parse(entry-&gt;d_name, gfid);</div><div class='add'>+    if (ret)</div><div class='add'>+        return 0;</div><div class='add'>+</div><div class='add'>+    inode_ctx_get2(parent-&gt;inode, subvol, NULL, &amp;val);</div><div class='add'>+</div><div class='add'>+    ret = afr_shd_selfheal(healer, healer-&gt;subvol, gfid);</div><div class='add'>+</div><div class='add'>+    if (ret == -ENOENT || ret == -ESTALE)</div><div class='add'>+        afr_shd_entry_purge(subvol, parent-&gt;inode, entry-&gt;d_name, val);</div><div class='add'>+</div><div class='add'>+    if (ret == 2)</div><div class='add'>+        /* If bricks crashed in pre-op after creating indices/xattrop</div><div class='add'>+         * link but before setting afr changelogs, we end up with stale</div><div class='add'>+         * xattrop links but zero changelogs. Remove such entries by</div><div class='add'>+         * sending a post-op with zero changelogs.</div><div class='add'>+         */</div><div class='add'>+        afr_shd_zero_xattrop(healer-&gt;this, gfid);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+afr_shd_index_sweep(struct subvol_healer *healer, char *vgfid)</div><div class='add'>+{</div><div class='add'>+    loc_t loc = {0};</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    xlator_t *subvol = NULL;</div><div class='add'>+    dict_t *xdata = NULL;</div><div class='add'>+    call_frame_t *frame = NULL;</div><div class='add'>+</div><div class='add'>+    priv = healer-&gt;this-&gt;private;</div><div class='add'>+    subvol = priv-&gt;children[healer-&gt;subvol];</div><div class='add'>+</div><div class='add'>+    frame = afr_frame_create(healer-&gt;this, &amp;ret);</div><div class='add'>+    if (!frame) {</div><div class='add'>+        ret = -ret;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    loc.inode = afr_shd_index_inode(healer-&gt;this, subvol, vgfid);</div><div class='add'>+    if (!loc.inode) {</div><div class='add'>+        gf_msg(healer-&gt;this-&gt;name, GF_LOG_WARNING, 0,</div><div class='add'>+               AFR_MSG_INDEX_DIR_GET_FAILED, "unable to get index-dir on %s",</div><div class='add'>+               subvol-&gt;name);</div><div class='add'>+        ret = -errno;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    xdata = dict_new();</div><div class='add'>+    if (!xdata || dict_set_int32_sizen(xdata, "get-gfid-type", 1)) {</div><div class='add'>+        ret = -ENOMEM;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = syncop_mt_dir_scan(frame, subvol, &amp;loc, GF_CLIENT_PID_SELF_HEALD,</div><div class='add'>+                             healer, afr_shd_index_heal, xdata,</div><div class='add'>+                             priv-&gt;shd.max_threads, priv-&gt;shd.wait_qlength);</div><div class='add'>+</div><div class='add'>+    if (ret == 0)</div><div class='add'>+        ret = healer-&gt;crawl_event.healed_count;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    loc_wipe(&amp;loc);</div><div class='add'>+</div><div class='add'>+    if (xdata)</div><div class='add'>+        dict_unref(xdata);</div><div class='add'>+    if (frame)</div><div class='add'>+        AFR_STACK_DESTROY(frame);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+afr_shd_index_sweep_all(struct subvol_healer *healer)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+    int count = 0;</div><div class='add'>+</div><div class='add'>+    ret = afr_shd_index_sweep(healer, GF_XATTROP_INDEX_GFID);</div><div class='add'>+    if (ret &lt; 0)</div><div class='add'>+        goto out;</div><div class='add'>+    count = ret;</div><div class='add'>+</div><div class='add'>+    ret = afr_shd_index_sweep(healer, GF_XATTROP_DIRTY_GFID);</div><div class='add'>+    if (ret &lt; 0)</div><div class='add'>+        goto out;</div><div class='add'>+    count += ret;</div><div class='add'>+</div><div class='add'>+    ret = afr_shd_index_sweep(healer, GF_XATTROP_ENTRY_CHANGES_GFID);</div><div class='add'>+    if (ret &lt; 0)</div><div class='add'>+        goto out;</div><div class='add'>+    count += ret;</div><div class='add'>+out:</div><div class='add'>+    if (ret &lt; 0)</div><div class='add'>+        return ret;</div><div class='add'>+    else</div><div class='add'>+        return count;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+afr_shd_full_heal(xlator_t *subvol, gf_dirent_t *entry, loc_t *parent,</div><div class='add'>+                  void *data)</div><div class='add'>+{</div><div class='add'>+    struct subvol_healer *healer = data;</div><div class='add'>+    xlator_t *this = healer-&gt;this;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    if (this-&gt;cleanup_starting) {</div><div class='add'>+        return -ENOTCONN;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (!priv-&gt;shd.enabled)</div><div class='add'>+        return -EBUSY;</div><div class='add'>+</div><div class='add'>+    afr_shd_selfheal_name(healer, healer-&gt;subvol, parent-&gt;inode-&gt;gfid,</div><div class='add'>+                          entry-&gt;d_name);</div><div class='add'>+</div><div class='add'>+    afr_shd_selfheal(healer, healer-&gt;subvol, entry-&gt;d_stat.ia_gfid);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+afr_shd_full_sweep(struct subvol_healer *healer, inode_t *inode)</div><div class='add'>+{</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    loc_t loc = {0};</div><div class='add'>+</div><div class='add'>+    priv = healer-&gt;this-&gt;private;</div><div class='add'>+    loc.inode = inode;</div><div class='add'>+    return syncop_ftw(priv-&gt;children[healer-&gt;subvol], &amp;loc,</div><div class='add'>+                      GF_CLIENT_PID_SELF_HEALD, healer, afr_shd_full_heal);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+afr_shd_fill_ta_loc(xlator_t *this, loc_t *loc)</div><div class='add'>+{</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    struct iatt stbuf = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+    loc-&gt;parent = inode_ref(this-&gt;itable-&gt;root);</div><div class='add'>+    gf_uuid_copy(loc-&gt;pargfid, loc-&gt;parent-&gt;gfid);</div><div class='add'>+    loc-&gt;name = priv-&gt;pending_key[THIN_ARBITER_BRICK_INDEX];</div><div class='add'>+    loc-&gt;inode = inode_new(loc-&gt;parent-&gt;table);</div><div class='add'>+    GF_CHECK_ALLOC(loc-&gt;inode, ret, out);</div><div class='add'>+</div><div class='add'>+    if (!gf_uuid_is_null(priv-&gt;ta_gfid))</div><div class='add'>+        goto assign_gfid;</div><div class='add'>+</div><div class='add'>+    ret = syncop_lookup(priv-&gt;children[THIN_ARBITER_BRICK_INDEX], loc, &amp;stbuf,</div><div class='add'>+                        0, 0, 0);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_ERROR, -ret, AFR_MSG_THIN_ARB,</div><div class='add'>+               "Failed lookup on file %s.", loc-&gt;name);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    gf_uuid_copy(priv-&gt;ta_gfid, stbuf.ia_gfid);</div><div class='add'>+</div><div class='add'>+assign_gfid:</div><div class='add'>+    gf_uuid_copy(loc-&gt;gfid, priv-&gt;ta_gfid);</div><div class='add'>+    ret = 0;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (ret)</div><div class='add'>+        loc_wipe(loc);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+_afr_shd_ta_get_xattrs(xlator_t *this, loc_t *loc, dict_t **xdata)</div><div class='add'>+{</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    dict_t *xattr = NULL;</div><div class='add'>+    int raw[AFR_NUM_CHANGE_LOGS] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int i = 0;</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    xattr = dict_new();</div><div class='add'>+    if (!xattr) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_ERROR, ENOMEM, AFR_MSG_DICT_GET_FAILED,</div><div class='add'>+               "Failed to create dict.");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+        ret = dict_set_static_bin(xattr, priv-&gt;pending_key[i], &amp;raw,</div><div class='add'>+                                  AFR_NUM_CHANGE_LOGS * sizeof(int));</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = syncop_xattrop(priv-&gt;children[THIN_ARBITER_BRICK_INDEX], loc,</div><div class='add'>+                         GF_XATTROP_ADD_ARRAY, xattr, NULL, xdata, NULL);</div><div class='add'>+    if (ret || !(*xdata)) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_ERROR, -ret, AFR_MSG_THIN_ARB,</div><div class='add'>+               "Xattrop failed on %s.", loc-&gt;name);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (xattr)</div><div class='add'>+        dict_unref(xattr);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+afr_shd_ta_get_xattrs(xlator_t *this, loc_t *loc, struct subvol_healer *healer,</div><div class='add'>+                      dict_t **xdata)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    loc_wipe(loc);</div><div class='add'>+    if (afr_shd_fill_ta_loc(this, loc)) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_ERROR, -ret, AFR_MSG_THIN_ARB,</div><div class='add'>+               "Failed to populate thin-arbiter loc for: %s.", loc-&gt;name);</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = afr_ta_post_op_lock(this, loc);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    ret = _afr_shd_ta_get_xattrs(this, loc, xdata);</div><div class='add'>+    if (ret) {</div><div class='add'>+        if (*xdata) {</div><div class='add'>+            dict_unref(*xdata);</div><div class='add'>+            *xdata = NULL;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    afr_ta_post_op_unlock(this, loc);</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (ret)</div><div class='add'>+        healer-&gt;rerun = 1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+afr_shd_ta_unset_xattrs(xlator_t *this, loc_t *loc, dict_t **xdata, int healer)</div><div class='add'>+{</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    dict_t *xattr = NULL;</div><div class='add'>+    gf_boolean_t need_xattrop = _gf_false;</div><div class='add'>+    void *pending_raw = NULL;</div><div class='add'>+    int *raw = NULL;</div><div class='add'>+    int pending[AFR_NUM_CHANGE_LOGS] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int i = 0;</div><div class='add'>+    int j = 0;</div><div class='add'>+    int val = 0;</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    xattr = dict_new();</div><div class='add'>+    if (!xattr) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+        raw = GF_CALLOC(AFR_NUM_CHANGE_LOGS, sizeof(int), gf_afr_mt_int32_t);</div><div class='add'>+        if (!raw) {</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        ret = dict_get_ptr(*xdata, priv-&gt;pending_key[i], &amp;pending_raw);</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, -ret, AFR_MSG_DICT_GET_FAILED,</div><div class='add'>+                   "Error getting value "</div><div class='add'>+                   "of pending key %s",</div><div class='add'>+                   priv-&gt;pending_key[i]);</div><div class='add'>+            GF_FREE(raw);</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        memcpy(pending, pending_raw, sizeof(pending));</div><div class='add'>+        for (j = 0; j &lt; AFR_NUM_CHANGE_LOGS; j++) {</div><div class='add'>+            val = ntoh32(pending[j]);</div><div class='add'>+            if (val) {</div><div class='add'>+                if (i == healer) {</div><div class='add'>+                    gf_msg(this-&gt;name, GF_LOG_INFO, 0, AFR_MSG_THIN_ARB,</div><div class='add'>+                           "I am "</div><div class='add'>+                           "not the good shd. Skipping. "</div><div class='add'>+                           "SHD = %d.",</div><div class='add'>+                           healer);</div><div class='add'>+                    ret = 0;</div><div class='add'>+                    GF_FREE(raw);</div><div class='add'>+                    goto out;</div><div class='add'>+                }</div><div class='add'>+                need_xattrop = _gf_true;</div><div class='add'>+                raw[j] = hton32(-val);</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        ret = dict_set_bin(xattr, priv-&gt;pending_key[i], raw,</div><div class='add'>+                           AFR_NUM_CHANGE_LOGS * sizeof(int));</div><div class='add'>+        if (ret) {</div><div class='add'>+            GF_FREE(raw);</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        if (need_xattrop)</div><div class='add'>+            break;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (!need_xattrop) {</div><div class='add'>+        ret = 0;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = syncop_xattrop(priv-&gt;children[THIN_ARBITER_BRICK_INDEX], loc,</div><div class='add'>+                         GF_XATTROP_ADD_ARRAY, xattr, NULL, NULL, NULL);</div><div class='add'>+    if (ret)</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_ERROR, -ret, AFR_MSG_THIN_ARB,</div><div class='add'>+               "Xattrop failed.");</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (xattr)</div><div class='add'>+        dict_unref(xattr);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+afr_shd_ta_check_and_unset_xattrs(xlator_t *this, loc_t *loc,</div><div class='add'>+                                  struct subvol_healer *healer,</div><div class='add'>+                                  dict_t *pre_crawl_xdata)</div><div class='add'>+{</div><div class='add'>+    int ret_lock = 0;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    dict_t *post_crawl_xdata = NULL;</div><div class='add'>+</div><div class='add'>+    ret_lock = afr_ta_post_op_lock(this, loc);</div><div class='add'>+    if (ret_lock)</div><div class='add'>+        goto unref;</div><div class='add'>+</div><div class='add'>+    ret = _afr_shd_ta_get_xattrs(this, loc, &amp;post_crawl_xdata);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto unref;</div><div class='add'>+</div><div class='add'>+    if (!are_dicts_equal(pre_crawl_xdata, post_crawl_xdata, NULL, NULL)) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto unref;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = afr_shd_ta_unset_xattrs(this, loc, &amp;post_crawl_xdata, healer-&gt;subvol);</div><div class='add'>+</div><div class='add'>+unref:</div><div class='add'>+    if (post_crawl_xdata) {</div><div class='add'>+        dict_unref(post_crawl_xdata);</div><div class='add'>+        post_crawl_xdata = NULL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (ret || ret_lock)</div><div class='add'>+        healer-&gt;rerun = 1;</div><div class='add'>+</div><div class='add'>+    if (!ret_lock)</div><div class='add'>+        afr_ta_post_op_unlock(this, loc);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+gf_boolean_t</div><div class='add'>+afr_bricks_available_for_heal(afr_private_t *priv)</div><div class='add'>+{</div><div class='add'>+    int up_children = 0;</div><div class='add'>+</div><div class='add'>+    up_children = __afr_get_up_children_count(priv);</div><div class='add'>+    if (up_children &lt; 2) {</div><div class='add'>+        return _gf_false;</div><div class='add'>+    }</div><div class='add'>+    return _gf_true;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static gf_boolean_t</div><div class='add'>+afr_shd_ta_needs_heal(xlator_t *this, struct subvol_healer *healer)</div><div class='add'>+{</div><div class='add'>+    dict_t *xdata = NULL;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    loc_t loc = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int i = 0;</div><div class='add'>+    gf_boolean_t need_heal = _gf_false;</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    ret = afr_shd_fill_ta_loc(this, &amp;loc);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_ERROR, -ret, AFR_MSG_THIN_ARB,</div><div class='add'>+               "Failed to populate thin-arbiter loc for: %s.", loc.name);</div><div class='add'>+        healer-&gt;rerun = 1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (_afr_shd_ta_get_xattrs(this, &amp;loc, &amp;xdata)) {</div><div class='add'>+        healer-&gt;rerun = 1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+        if (afr_ta_dict_contains_pending_xattr(xdata, priv, i)) {</div><div class='add'>+            need_heal = _gf_true;</div><div class='add'>+            break;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (xdata)</div><div class='add'>+        dict_unref(xdata);</div><div class='add'>+    loc_wipe(&amp;loc);</div><div class='add'>+</div><div class='add'>+    return need_heal;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+afr_shd_anon_inode_cleaner(xlator_t *subvol, gf_dirent_t *entry, loc_t *parent,</div><div class='add'>+                           void *data)</div><div class='add'>+{</div><div class='add'>+    struct subvol_healer *healer = data;</div><div class='add'>+    afr_private_t *priv = healer-&gt;this-&gt;private;</div><div class='add'>+    call_frame_t *frame = NULL;</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    loc_t loc = {0};</div><div class='add'>+    int count = 0;</div><div class='add'>+    int i = 0;</div><div class='add'>+    int op_errno = 0;</div><div class='add'>+    struct iatt *iatt = NULL;</div><div class='add'>+    gf_boolean_t multiple_links = _gf_false;</div><div class='add'>+    unsigned char *gfid_present = alloca0(priv-&gt;child_count);</div><div class='add'>+    unsigned char *entry_present = alloca0(priv-&gt;child_count);</div><div class='add'>+    char *type = "file";</div><div class='add'>+</div><div class='add'>+    frame = afr_frame_create(healer-&gt;this, &amp;ret);</div><div class='add'>+    if (!frame) {</div><div class='add'>+        ret = -ret;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    if (AFR_COUNT(local-&gt;child_up, priv-&gt;child_count) != priv-&gt;child_count) {</div><div class='add'>+        gf_msg_debug(healer-&gt;this-&gt;name, 0,</div><div class='add'>+                     "Not all bricks are up. Skipping "</div><div class='add'>+                     "cleanup of %s on %s",</div><div class='add'>+                     entry-&gt;d_name, subvol-&gt;name);</div><div class='add'>+        ret = 0;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    loc.inode = inode_new(parent-&gt;inode-&gt;table);</div><div class='add'>+    if (!loc.inode) {</div><div class='add'>+        ret = -ENOMEM;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    ret = gf_uuid_parse(entry-&gt;d_name, loc.gfid);</div><div class='add'>+    if (ret) {</div><div class='add'>+        ret = 0;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    AFR_ONLIST(local-&gt;child_up, frame, afr_selfheal_discover_cbk, lookup, &amp;loc,</div><div class='add'>+               NULL);</div><div class='add'>+    for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+        if (local-&gt;replies[i].op_ret == 0) {</div><div class='add'>+            count++;</div><div class='add'>+            gfid_present[i] = 1;</div><div class='add'>+            iatt = &amp;local-&gt;replies[i].poststat;</div><div class='add'>+            if (iatt-&gt;ia_type == IA_IFDIR) {</div><div class='add'>+                type = "dir";</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            if (i == healer-&gt;subvol) {</div><div class='add'>+                if (local-&gt;replies[i].poststat.ia_nlink &gt; 1) {</div><div class='add'>+                    multiple_links = _gf_true;</div><div class='add'>+                }</div><div class='add'>+            }</div><div class='add'>+        } else if (local-&gt;replies[i].op_errno != ENOENT &amp;&amp;</div><div class='add'>+                   local-&gt;replies[i].op_errno != ESTALE) {</div><div class='add'>+            /*We don't have complete view. Skip the entry*/</div><div class='add'>+            gf_msg_debug(healer-&gt;this-&gt;name, local-&gt;replies[i].op_errno,</div><div class='add'>+                         "Skipping cleanup of %s on %s", entry-&gt;d_name,</div><div class='add'>+                         subvol-&gt;name);</div><div class='add'>+            ret = 0;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /*Inode is deleted from subvol*/</div><div class='add'>+    if (count == 1 || (iatt-&gt;ia_type != IA_IFDIR &amp;&amp; multiple_links)) {</div><div class='add'>+        gf_msg(healer-&gt;this-&gt;name, GF_LOG_WARNING, 0,</div><div class='add'>+               AFR_MSG_EXPUNGING_FILE_OR_DIR, "expunging %s %s/%s on %s", type,</div><div class='add'>+               priv-&gt;anon_inode_name, entry-&gt;d_name, subvol-&gt;name);</div><div class='add'>+        ret = afr_shd_entry_purge(subvol, parent-&gt;inode, entry-&gt;d_name,</div><div class='add'>+                                  iatt-&gt;ia_type);</div><div class='add'>+        if (ret == -ENOENT || ret == -ESTALE)</div><div class='add'>+            ret = 0;</div><div class='add'>+    } else if (count &gt; 1) {</div><div class='add'>+        loc_wipe(&amp;loc);</div><div class='add'>+        loc.parent = inode_ref(parent-&gt;inode);</div><div class='add'>+        loc.name = entry-&gt;d_name;</div><div class='add'>+        loc.inode = inode_new(parent-&gt;inode-&gt;table);</div><div class='add'>+        if (!loc.inode) {</div><div class='add'>+            ret = -ENOMEM;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+        AFR_ONLIST(local-&gt;child_up, frame, afr_selfheal_discover_cbk, lookup,</div><div class='add'>+                   &amp;loc, NULL);</div><div class='add'>+        count = 0;</div><div class='add'>+        for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+            if (local-&gt;replies[i].op_ret == 0) {</div><div class='add'>+                count++;</div><div class='add'>+                entry_present[i] = 1;</div><div class='add'>+                iatt = &amp;local-&gt;replies[i].poststat;</div><div class='add'>+            } else if (local-&gt;replies[i].op_errno != ENOENT &amp;&amp;</div><div class='add'>+                       local-&gt;replies[i].op_errno != ESTALE) {</div><div class='add'>+                /*We don't have complete view. Skip the entry*/</div><div class='add'>+                gf_msg_debug(healer-&gt;this-&gt;name, local-&gt;replies[i].op_errno,</div><div class='add'>+                             "Skipping cleanup of %s on %s", entry-&gt;d_name,</div><div class='add'>+                             subvol-&gt;name);</div><div class='add'>+                ret = 0;</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+        for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+            if (gfid_present[i] &amp;&amp; !entry_present[i]) {</div><div class='add'>+                /*Entry is not anonymous on at least one subvol*/</div><div class='add'>+                gf_msg_debug(healer-&gt;this-&gt;name, 0,</div><div class='add'>+                             "Valid entry present on %s "</div><div class='add'>+                             "Skipping cleanup of %s on %s",</div><div class='add'>+                             priv-&gt;children[i]-&gt;name, entry-&gt;d_name,</div><div class='add'>+                             subvol-&gt;name);</div><div class='add'>+                ret = 0;</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        gf_msg(healer-&gt;this-&gt;name, GF_LOG_WARNING, 0,</div><div class='add'>+               AFR_MSG_EXPUNGING_FILE_OR_DIR,</div><div class='add'>+               "expunging %s %s/%s on all subvols", type, priv-&gt;anon_inode_name,</div><div class='add'>+               entry-&gt;d_name);</div><div class='add'>+        ret = 0;</div><div class='add'>+        for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+            op_errno = -afr_shd_entry_purge(priv-&gt;children[i], loc.parent,</div><div class='add'>+                                            entry-&gt;d_name, iatt-&gt;ia_type);</div><div class='add'>+            if (op_errno != ENOENT &amp;&amp; op_errno != ESTALE) {</div><div class='add'>+                ret |= -op_errno;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (frame)</div><div class='add'>+        AFR_STACK_DESTROY(frame);</div><div class='add'>+    loc_wipe(&amp;loc);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+afr_cleanup_anon_inode_dir(struct subvol_healer *healer)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+    call_frame_t *frame = NULL;</div><div class='add'>+    afr_private_t *priv = healer-&gt;this-&gt;private;</div><div class='add'>+    loc_t loc = {0};</div><div class='add'>+</div><div class='add'>+    ret = afr_anon_inode_create(healer-&gt;this, healer-&gt;subvol, &amp;loc.inode);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    frame = afr_frame_create(healer-&gt;this, &amp;ret);</div><div class='add'>+    if (!frame) {</div><div class='add'>+        ret = -ret;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = syncop_mt_dir_scan(frame, priv-&gt;children[healer-&gt;subvol], &amp;loc,</div><div class='add'>+                             GF_CLIENT_PID_SELF_HEALD, healer,</div><div class='add'>+                             afr_shd_anon_inode_cleaner, NULL,</div><div class='add'>+                             priv-&gt;shd.max_threads, priv-&gt;shd.wait_qlength);</div><div class='add'>+out:</div><div class='add'>+    if (frame)</div><div class='add'>+        AFR_STACK_DESTROY(frame);</div><div class='add'>+    loc_wipe(&amp;loc);</div><div class='add'>+    return;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void *</div><div class='add'>+afr_shd_index_healer(void *data)</div><div class='add'>+{</div><div class='add'>+    struct subvol_healer *healer = NULL;</div><div class='add'>+    xlator_t *this = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    dict_t *pre_crawl_xdata = NULL;</div><div class='add'>+    loc_t loc = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    healer = data;</div><div class='add'>+    THIS = this = healer-&gt;this;</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    for (;;) {</div><div class='add'>+        afr_shd_healer_wait(healer);</div><div class='add'>+</div><div class='add'>+        if (!afr_bricks_available_for_heal(priv))</div><div class='add'>+            continue;</div><div class='add'>+</div><div class='add'>+        ASSERT_LOCAL(this, healer);</div><div class='add'>+        priv-&gt;local[healer-&gt;subvol] = healer-&gt;local;</div><div class='add'>+</div><div class='add'>+        if (priv-&gt;thin_arbiter_count) {</div><div class='add'>+            if (afr_shd_ta_needs_heal(this, healer))</div><div class='add'>+                afr_shd_ta_get_xattrs(this, &amp;loc, healer, &amp;pre_crawl_xdata);</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        do {</div><div class='add'>+            gf_msg_debug(this-&gt;name, 0, "starting index sweep on subvol %s",</div><div class='add'>+                         afr_subvol_name(this, healer-&gt;subvol));</div><div class='add'>+</div><div class='add'>+            afr_shd_sweep_prepare(healer);</div><div class='add'>+</div><div class='add'>+            ret = afr_shd_index_sweep_all(healer);</div><div class='add'>+</div><div class='add'>+            afr_shd_sweep_done(healer);</div><div class='add'>+            /*</div><div class='add'>+              As long as at least one gfid was</div><div class='add'>+              healed, keep retrying. We may have</div><div class='add'>+              just healed a directory and thereby</div><div class='add'>+              created entries for other gfids which</div><div class='add'>+              could not be healed thus far.</div><div class='add'>+            */</div><div class='add'>+</div><div class='add'>+            gf_msg_debug(this-&gt;name, 0, "finished index sweep on subvol %s",</div><div class='add'>+                         afr_subvol_name(this, healer-&gt;subvol));</div><div class='add'>+            /*</div><div class='add'>+              Give a pause before retrying to avoid a busy loop</div><div class='add'>+              in case the only entry in index is because of</div><div class='add'>+              an ongoing I/O.</div><div class='add'>+            */</div><div class='add'>+            sleep(1);</div><div class='add'>+        } while (ret &gt; 0);</div><div class='add'>+</div><div class='add'>+        if (ret == 0) {</div><div class='add'>+            afr_cleanup_anon_inode_dir(healer);</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        if (ret == 0 &amp;&amp; pre_crawl_xdata &amp;&amp;</div><div class='add'>+            !healer-&gt;crawl_event.heal_failed_count) {</div><div class='add'>+            afr_shd_ta_check_and_unset_xattrs(this, &amp;loc, healer,</div><div class='add'>+                                              pre_crawl_xdata);</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        if (pre_crawl_xdata) {</div><div class='add'>+            dict_unref(pre_crawl_xdata);</div><div class='add'>+            pre_crawl_xdata = NULL;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return NULL;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void *</div><div class='add'>+afr_shd_full_healer(void *data)</div><div class='add'>+{</div><div class='add'>+    struct subvol_healer *healer = NULL;</div><div class='add'>+    xlator_t *this = NULL;</div><div class='add'>+    int run = 0;</div><div class='add'>+</div><div class='add'>+    healer = data;</div><div class='add'>+    THIS = this = healer-&gt;this;</div><div class='add'>+</div><div class='add'>+    for (;;) {</div><div class='add'>+        pthread_mutex_lock(&amp;healer-&gt;mutex);</div><div class='add'>+        {</div><div class='add'>+            run = __afr_shd_healer_wait(healer);</div><div class='add'>+            if (!run)</div><div class='add'>+                healer-&gt;running = _gf_false;</div><div class='add'>+        }</div><div class='add'>+        pthread_mutex_unlock(&amp;healer-&gt;mutex);</div><div class='add'>+</div><div class='add'>+        if (!run)</div><div class='add'>+            break;</div><div class='add'>+</div><div class='add'>+        ASSERT_LOCAL(this, healer);</div><div class='add'>+</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_INFO, 0, AFR_MSG_SELF_HEAL_INFO,</div><div class='add'>+               "starting full sweep on subvol %s",</div><div class='add'>+               afr_subvol_name(this, healer-&gt;subvol));</div><div class='add'>+</div><div class='add'>+        afr_shd_sweep_prepare(healer);</div><div class='add'>+</div><div class='add'>+        afr_shd_full_sweep(healer, this-&gt;itable-&gt;root);</div><div class='add'>+</div><div class='add'>+        afr_shd_sweep_done(healer);</div><div class='add'>+</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_INFO, 0, AFR_MSG_SELF_HEAL_INFO,</div><div class='add'>+               "finished full sweep on subvol %s",</div><div class='add'>+               afr_subvol_name(this, healer-&gt;subvol));</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return NULL;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+afr_shd_healer_init(xlator_t *this, struct subvol_healer *healer)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    ret = pthread_mutex_init(&amp;healer-&gt;mutex, NULL);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    ret = pthread_cond_init(&amp;healer-&gt;cond, NULL);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    healer-&gt;this = this;</div><div class='add'>+    healer-&gt;running = _gf_false;</div><div class='add'>+    healer-&gt;rerun = _gf_false;</div><div class='add'>+    healer-&gt;local = _gf_false;</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+afr_shd_healer_spawn(xlator_t *this, struct subvol_healer *healer,</div><div class='add'>+                     void *(threadfn)(void *))</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    pthread_mutex_lock(&amp;healer-&gt;mutex);</div><div class='add'>+    {</div><div class='add'>+        if (healer-&gt;running) {</div><div class='add'>+            pthread_cond_signal(&amp;healer-&gt;cond);</div><div class='add'>+        } else {</div><div class='add'>+            ret = gf_thread_create(&amp;healer-&gt;thread, NULL, threadfn, healer,</div><div class='add'>+                                   "shdheal");</div><div class='add'>+            if (ret)</div><div class='add'>+                goto unlock;</div><div class='add'>+            healer-&gt;running = 1;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        healer-&gt;rerun = 1;</div><div class='add'>+    }</div><div class='add'>+unlock:</div><div class='add'>+    pthread_mutex_unlock(&amp;healer-&gt;mutex);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+afr_shd_full_healer_spawn(xlator_t *this, int subvol)</div><div class='add'>+{</div><div class='add'>+    return afr_shd_healer_spawn(this, NTH_FULL_HEALER(this, subvol),</div><div class='add'>+                                afr_shd_full_healer);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+afr_shd_index_healer_spawn(xlator_t *this, int subvol)</div><div class='add'>+{</div><div class='add'>+    return afr_shd_healer_spawn(this, NTH_INDEX_HEALER(this, subvol),</div><div class='add'>+                                afr_shd_index_healer);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+afr_shd_dict_add_crawl_event(xlator_t *this, dict_t *output,</div><div class='add'>+                             crawl_event_t *crawl_event)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+    uint64_t count = 0;</div><div class='add'>+    char key[128] = {0};</div><div class='add'>+    int keylen = 0;</div><div class='add'>+    char suffix[64] = {0};</div><div class='add'>+    int xl_id = 0;</div><div class='add'>+    uint64_t healed_count = 0;</div><div class='add'>+    uint64_t split_brain_count = 0;</div><div class='add'>+    uint64_t heal_failed_count = 0;</div><div class='add'>+    char *start_time_str = 0;</div><div class='add'>+    char *end_time_str = NULL;</div><div class='add'>+    char *crawl_type = NULL;</div><div class='add'>+    int progress = -1;</div><div class='add'>+    int child = -1;</div><div class='add'>+</div><div class='add'>+    child = crawl_event-&gt;child;</div><div class='add'>+    healed_count = crawl_event-&gt;healed_count;</div><div class='add'>+    split_brain_count = crawl_event-&gt;split_brain_count;</div><div class='add'>+    heal_failed_count = crawl_event-&gt;heal_failed_count;</div><div class='add'>+    crawl_type = crawl_event-&gt;crawl_type;</div><div class='add'>+</div><div class='add'>+    if (!crawl_event-&gt;start_time)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    start_time_str = gf_strdup(ctime(&amp;crawl_event-&gt;start_time));</div><div class='add'>+</div><div class='add'>+    if (crawl_event-&gt;end_time)</div><div class='add'>+        end_time_str = gf_strdup(ctime(&amp;crawl_event-&gt;end_time));</div><div class='add'>+</div><div class='add'>+    ret = dict_get_int32(output, this-&gt;name, &amp;xl_id);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_ERROR, -ret, AFR_MSG_DICT_GET_FAILED,</div><div class='add'>+               "xl does not have id");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    snprintf(key, sizeof(key), "statistics-%d-%d-count", xl_id, child);</div><div class='add'>+    ret = dict_get_uint64(output, key, &amp;count);</div><div class='add'>+</div><div class='add'>+    snprintf(suffix, sizeof(suffix), "%d-%d-%" PRIu64, xl_id, child, count);</div><div class='add'>+    snprintf(key, sizeof(key), "statistics_healed_cnt-%s", suffix);</div><div class='add'>+    ret = dict_set_uint64(output, key, healed_count);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_ERROR, -ret, AFR_MSG_DICT_SET_FAILED,</div><div class='add'>+               "Could not add statistics_healed_count to output");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    snprintf(key, sizeof(key), "statistics_sb_cnt-%s", suffix);</div><div class='add'>+    ret = dict_set_uint64(output, key, split_brain_count);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_ERROR, -ret, AFR_MSG_DICT_SET_FAILED,</div><div class='add'>+               "Could not add statistics_split_brain_count to output");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    keylen = snprintf(key, sizeof(key), "statistics_crawl_type-%s", suffix);</div><div class='add'>+    ret = dict_set_strn(output, key, keylen, crawl_type);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_ERROR, -ret, AFR_MSG_DICT_SET_FAILED,</div><div class='add'>+               "Could not add statistics_crawl_type to output");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    snprintf(key, sizeof(key), "statistics_heal_failed_cnt-%s", suffix);</div><div class='add'>+    ret = dict_set_uint64(output, key, heal_failed_count);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_ERROR, -ret, AFR_MSG_DICT_SET_FAILED,</div><div class='add'>+               "Could not add statistics_healed_failed_count to output");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    keylen = snprintf(key, sizeof(key), "statistics_strt_time-%s", suffix);</div><div class='add'>+    ret = dict_set_dynstrn(output, key, keylen, start_time_str);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_ERROR, -ret, AFR_MSG_DICT_SET_FAILED,</div><div class='add'>+               "Could not add statistics_crawl_start_time to output");</div><div class='add'>+        goto out;</div><div class='add'>+    } else {</div><div class='add'>+        start_time_str = NULL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (!end_time_str)</div><div class='add'>+        progress = 1;</div><div class='add'>+    else</div><div class='add'>+        progress = 0;</div><div class='add'>+</div><div class='add'>+    keylen = snprintf(key, sizeof(key), "statistics_end_time-%s", suffix);</div><div class='add'>+    if (!end_time_str)</div><div class='add'>+        end_time_str = gf_strdup("Could not determine the end time");</div><div class='add'>+    ret = dict_set_dynstrn(output, key, keylen, end_time_str);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_ERROR, -ret, AFR_MSG_DICT_SET_FAILED,</div><div class='add'>+               "Could not add statistics_crawl_end_time to output");</div><div class='add'>+        goto out;</div><div class='add'>+    } else {</div><div class='add'>+        end_time_str = NULL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    keylen = snprintf(key, sizeof(key), "statistics_inprogress-%s", suffix);</div><div class='add'>+</div><div class='add'>+    ret = dict_set_int32n(output, key, keylen, progress);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_ERROR, -ret, AFR_MSG_DICT_SET_FAILED,</div><div class='add'>+               "Could not add statistics_inprogress to output");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    snprintf(key, sizeof(key), "statistics-%d-%d-count", xl_id, child);</div><div class='add'>+    ret = dict_set_uint64(output, key, count + 1);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_ERROR, -ret, AFR_MSG_DICT_SET_FAILED,</div><div class='add'>+               "Could not increment the counter.");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+out:</div><div class='add'>+    GF_FREE(start_time_str);</div><div class='add'>+    GF_FREE(end_time_str);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+afr_shd_dict_add_path(xlator_t *this, dict_t *output, int child, char *path,</div><div class='add'>+                      struct timeval *tv)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    uint64_t count = 0;</div><div class='add'>+    char key[64] = {0};</div><div class='add'>+    int keylen = 0;</div><div class='add'>+    char xl_id_child_str[32] = {0};</div><div class='add'>+    int xl_id = 0;</div><div class='add'>+</div><div class='add'>+    ret = dict_get_int32(output, this-&gt;name, &amp;xl_id);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_ERROR, -ret, AFR_MSG_DICT_GET_FAILED,</div><div class='add'>+               "xl does not have id");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    snprintf(xl_id_child_str, sizeof(xl_id_child_str), "%d-%d", xl_id, child);</div><div class='add'>+    snprintf(key, sizeof(key), "%s-count", xl_id_child_str);</div><div class='add'>+    ret = dict_get_uint64(output, key, &amp;count);</div><div class='add'>+</div><div class='add'>+    keylen = snprintf(key, sizeof(key), "%s-%" PRIu64, xl_id_child_str, count);</div><div class='add'>+    ret = dict_set_dynstrn(output, key, keylen, path);</div><div class='add'>+</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_ERROR, -ret, AFR_MSG_DICT_SET_FAILED,</div><div class='add'>+               "%s: Could not add to output", path);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (tv) {</div><div class='add'>+        snprintf(key, sizeof(key), "%s-%" PRIu64 "-time", xl_id_child_str,</div><div class='add'>+                 count);</div><div class='add'>+        ret = dict_set_uint32(output, key, tv-&gt;tv_sec);</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, -ret, AFR_MSG_DICT_SET_FAILED,</div><div class='add'>+                   "%s: Could not set time", path);</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    snprintf(key, sizeof(key), "%s-count", xl_id_child_str);</div><div class='add'>+</div><div class='add'>+    ret = dict_set_uint64(output, key, count + 1);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_ERROR, -ret, AFR_MSG_DICT_SET_FAILED,</div><div class='add'>+               "Could not increment count");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+afr_add_shd_event(circular_buffer_t *cb, void *data)</div><div class='add'>+{</div><div class='add'>+    dict_t *output = NULL;</div><div class='add'>+    xlator_t *this = THIS;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    afr_self_heald_t *shd = NULL;</div><div class='add'>+    shd_event_t *shd_event = NULL;</div><div class='add'>+    char *path = NULL;</div><div class='add'>+</div><div class='add'>+    output = data;</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+    shd = &amp;priv-&gt;shd;</div><div class='add'>+    shd_event = cb-&gt;data;</div><div class='add'>+</div><div class='add'>+    if (!shd-&gt;index_healers[shd_event-&gt;child].local)</div><div class='add'>+        return 0;</div><div class='add'>+</div><div class='add'>+    path = gf_strdup(shd_event-&gt;path);</div><div class='add'>+    if (!path)</div><div class='add'>+        return -ENOMEM;</div><div class='add'>+</div><div class='add'>+    afr_shd_dict_add_path(this, output, shd_event-&gt;child, path, &amp;cb-&gt;tv);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+afr_add_crawl_event(circular_buffer_t *cb, void *data)</div><div class='add'>+{</div><div class='add'>+    dict_t *output = NULL;</div><div class='add'>+    xlator_t *this = THIS;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    afr_self_heald_t *shd = NULL;</div><div class='add'>+    crawl_event_t *crawl_event = NULL;</div><div class='add'>+</div><div class='add'>+    output = data;</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+    shd = &amp;priv-&gt;shd;</div><div class='add'>+    crawl_event = cb-&gt;data;</div><div class='add'>+</div><div class='add'>+    if (!shd-&gt;index_healers[crawl_event-&gt;child].local)</div><div class='add'>+        return 0;</div><div class='add'>+</div><div class='add'>+    afr_shd_dict_add_crawl_event(this, output, crawl_event);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+afr_selfheal_daemon_init(xlator_t *this)</div><div class='add'>+{</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    afr_self_heald_t *shd = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int i = 0;</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+    shd = &amp;priv-&gt;shd;</div><div class='add'>+</div><div class='add'>+    shd-&gt;index_healers = GF_CALLOC(sizeof(*shd-&gt;index_healers),</div><div class='add'>+                                   priv-&gt;child_count,</div><div class='add'>+                                   gf_afr_mt_subvol_healer_t);</div><div class='add'>+    if (!shd-&gt;index_healers)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+        shd-&gt;index_healers[i].subvol = i;</div><div class='add'>+        ret = afr_shd_healer_init(this, &amp;shd-&gt;index_healers[i]);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    shd-&gt;full_healers = GF_CALLOC(sizeof(*shd-&gt;full_healers), priv-&gt;child_count,</div><div class='add'>+                                  gf_afr_mt_subvol_healer_t);</div><div class='add'>+    if (!shd-&gt;full_healers)</div><div class='add'>+        goto out;</div><div class='add'>+    for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+        shd-&gt;full_healers[i].subvol = i;</div><div class='add'>+        ret = afr_shd_healer_init(this, &amp;shd-&gt;full_healers[i]);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    shd-&gt;split_brain = eh_new(AFR_EH_SPLIT_BRAIN_LIMIT, _gf_false,</div><div class='add'>+                              afr_destroy_shd_event_data);</div><div class='add'>+    if (!shd-&gt;split_brain)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    shd-&gt;statistics = GF_CALLOC(sizeof(eh_t *), priv-&gt;child_count,</div><div class='add'>+                                gf_common_mt_eh_t);</div><div class='add'>+    if (!shd-&gt;statistics)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+        shd-&gt;statistics[i] = eh_new(AFR_STATISTICS_HISTORY_SIZE, _gf_false,</div><div class='add'>+                                    afr_destroy_crawl_event_data);</div><div class='add'>+        if (!shd-&gt;statistics[i])</div><div class='add'>+            goto out;</div><div class='add'>+        shd-&gt;full_healers[i].crawl_event.child = i;</div><div class='add'>+        shd-&gt;full_healers[i].crawl_event.crawl_type = "FULL";</div><div class='add'>+        shd-&gt;index_healers[i].crawl_event.child = i;</div><div class='add'>+        shd-&gt;index_healers[i].crawl_event.crawl_type = "INDEX";</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+afr_selfheal_childup(xlator_t *this, afr_private_t *priv)</div><div class='add'>+{</div><div class='add'>+    int subvol = 0;</div><div class='add'>+</div><div class='add'>+    if (!priv-&gt;shd.iamshd)</div><div class='add'>+        return;</div><div class='add'>+    for (subvol = 0; subvol &lt; priv-&gt;child_count; subvol++)</div><div class='add'>+        if (priv-&gt;child_up[subvol])</div><div class='add'>+            afr_shd_index_healer_spawn(this, subvol);</div><div class='add'>+</div><div class='add'>+    return;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+afr_shd_get_index_count(xlator_t *this, int i, uint64_t *count)</div><div class='add'>+{</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    xlator_t *subvol = NULL;</div><div class='add'>+    loc_t rootloc = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    dict_t *xattr = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+    subvol = priv-&gt;children[i];</div><div class='add'>+</div><div class='add'>+    rootloc.inode = inode_ref(this-&gt;itable-&gt;root);</div><div class='add'>+    gf_uuid_copy(rootloc.gfid, rootloc.inode-&gt;gfid);</div><div class='add'>+</div><div class='add'>+    ret = syncop_getxattr(subvol, &amp;rootloc, &amp;xattr, GF_XATTROP_INDEX_COUNT,</div><div class='add'>+                          NULL, NULL);</div><div class='add'>+    if (ret &lt; 0)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    ret = dict_get_uint64(xattr, GF_XATTROP_INDEX_COUNT, count);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (xattr)</div><div class='add'>+        dict_unref(xattr);</div><div class='add'>+    loc_wipe(&amp;rootloc);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+afr_xl_op(xlator_t *this, dict_t *input, dict_t *output)</div><div class='add'>+{</div><div class='add'>+    gf_xl_afr_op_t op = GF_SHD_OP_INVALID;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    int xl_id = 0;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    afr_self_heald_t *shd = NULL;</div><div class='add'>+    struct subvol_healer *healer = NULL;</div><div class='add'>+    int i = 0;</div><div class='add'>+    char key[64];</div><div class='add'>+    int keylen = 0;</div><div class='add'>+    int this_name_len = 0;</div><div class='add'>+    int op_ret = 0;</div><div class='add'>+    uint64_t cnt = 0;</div><div class='add'>+</div><div class='add'>+#define AFR_SET_DICT_AND_LOG(name, output, key, keylen, dict_str,              \</div><div class='add'>+                             dict_str_len)                                     \</div><div class='add'>+    {                                                                          \</div><div class='add'>+        int ret;                                                               \</div><div class='add'>+                                                                               \</div><div class='add'>+        ret = dict_set_nstrn(output, key, keylen, dict_str, dict_str_len);     \</div><div class='add'>+        if (ret) {                                                             \</div><div class='add'>+            gf_smsg(name, GF_LOG_ERROR, -ret, AFR_MSG_DICT_SET_FAILED,         \</div><div class='add'>+                    "key=%s", key, "value=%s", dict_str, NULL);                \</div><div class='add'>+        }                                                                      \</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+    shd = &amp;priv-&gt;shd;</div><div class='add'>+</div><div class='add'>+    ret = dict_get_int32_sizen(input, "xl-op", (int32_t *)&amp;op);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_ERROR, -ret, AFR_MSG_DICT_GET_FAILED,</div><div class='add'>+                "key=xl-op", NULL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    this_name_len = strlen(this-&gt;name);</div><div class='add'>+    ret = dict_get_int32n(input, this-&gt;name, this_name_len, &amp;xl_id);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_ERROR, -ret, AFR_MSG_DICT_GET_FAILED,</div><div class='add'>+                "key=%s", this-&gt;name, NULL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    ret = dict_set_int32n(output, this-&gt;name, this_name_len, xl_id);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_ERROR, -ret, AFR_MSG_DICT_SET_FAILED,</div><div class='add'>+                "key=%s", this-&gt;name, NULL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    switch (op) {</div><div class='add'>+        case GF_SHD_OP_HEAL_INDEX:</div><div class='add'>+            op_ret = 0;</div><div class='add'>+</div><div class='add'>+            for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+                healer = &amp;shd-&gt;index_healers[i];</div><div class='add'>+                keylen = snprintf(key, sizeof(key), "%d-%d-status", xl_id, i);</div><div class='add'>+</div><div class='add'>+                if (!priv-&gt;child_up[i]) {</div><div class='add'>+                    AFR_SET_DICT_AND_LOG(this-&gt;name, output, key, keylen,</div><div class='add'>+                                         SBRICK_NOT_CONNECTED,</div><div class='add'>+                                         SLEN(SBRICK_NOT_CONNECTED));</div><div class='add'>+                    op_ret = -1;</div><div class='add'>+                } else if (AFR_COUNT(priv-&gt;child_up, priv-&gt;child_count) &lt; 2) {</div><div class='add'>+                    AFR_SET_DICT_AND_LOG(this-&gt;name, output, key, keylen,</div><div class='add'>+                                         SLESS_THAN2_BRICKS_in_REP,</div><div class='add'>+                                         SLEN(SLESS_THAN2_BRICKS_in_REP));</div><div class='add'>+                    op_ret = -1;</div><div class='add'>+                } else if (!afr_shd_is_subvol_local(this, healer-&gt;subvol)) {</div><div class='add'>+                    AFR_SET_DICT_AND_LOG(this-&gt;name, output, key, keylen,</div><div class='add'>+                                         SBRICK_IS_REMOTE,</div><div class='add'>+                                         SLEN(SBRICK_IS_REMOTE));</div><div class='add'>+                } else {</div><div class='add'>+                    AFR_SET_DICT_AND_LOG(this-&gt;name, output, key, keylen,</div><div class='add'>+                                         SSTARTED_SELF_HEAL,</div><div class='add'>+                                         SLEN(SSTARTED_SELF_HEAL));</div><div class='add'>+</div><div class='add'>+                    ret = afr_shd_index_healer_spawn(this, i);</div><div class='add'>+</div><div class='add'>+                    if (ret) {</div><div class='add'>+                        gf_smsg(this-&gt;name, GF_LOG_ERROR, -ret,</div><div class='add'>+                                AFR_MSG_HEALER_SPAWN_FAILED, NULL);</div><div class='add'>+                    }</div><div class='add'>+                }</div><div class='add'>+            }</div><div class='add'>+            break;</div><div class='add'>+        case GF_SHD_OP_HEAL_FULL:</div><div class='add'>+            op_ret = -1;</div><div class='add'>+</div><div class='add'>+            for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+                healer = &amp;shd-&gt;full_healers[i];</div><div class='add'>+                keylen = snprintf(key, sizeof(key), "%d-%d-status", xl_id, i);</div><div class='add'>+</div><div class='add'>+                if (!priv-&gt;child_up[i]) {</div><div class='add'>+                    AFR_SET_DICT_AND_LOG(this-&gt;name, output, key, keylen,</div><div class='add'>+                                         SBRICK_NOT_CONNECTED,</div><div class='add'>+                                         SLEN(SBRICK_NOT_CONNECTED));</div><div class='add'>+                } else if (AFR_COUNT(priv-&gt;child_up, priv-&gt;child_count) &lt; 2) {</div><div class='add'>+                    AFR_SET_DICT_AND_LOG(this-&gt;name, output, key, keylen,</div><div class='add'>+                                         SLESS_THAN2_BRICKS_in_REP,</div><div class='add'>+                                         SLEN(SLESS_THAN2_BRICKS_in_REP));</div><div class='add'>+                } else if (!afr_shd_is_subvol_local(this, healer-&gt;subvol)) {</div><div class='add'>+                    AFR_SET_DICT_AND_LOG(this-&gt;name, output, key, keylen,</div><div class='add'>+                                         SBRICK_IS_REMOTE,</div><div class='add'>+                                         SLEN(SBRICK_IS_REMOTE));</div><div class='add'>+                } else {</div><div class='add'>+                    AFR_SET_DICT_AND_LOG(this-&gt;name, output, key, keylen,</div><div class='add'>+                                         SSTARTED_SELF_HEAL,</div><div class='add'>+                                         SLEN(SSTARTED_SELF_HEAL));</div><div class='add'>+</div><div class='add'>+                    ret = afr_shd_full_healer_spawn(this, i);</div><div class='add'>+</div><div class='add'>+                    if (ret) {</div><div class='add'>+                        gf_smsg(this-&gt;name, GF_LOG_ERROR, -ret,</div><div class='add'>+                                AFR_MSG_HEALER_SPAWN_FAILED, NULL);</div><div class='add'>+                    }</div><div class='add'>+                    op_ret = 0;</div><div class='add'>+                }</div><div class='add'>+            }</div><div class='add'>+            break;</div><div class='add'>+        case GF_SHD_OP_INDEX_SUMMARY:</div><div class='add'>+            /* this case has been handled in glfs-heal.c */</div><div class='add'>+            break;</div><div class='add'>+        case GF_SHD_OP_SPLIT_BRAIN_FILES:</div><div class='add'>+            eh_dump(shd-&gt;split_brain, output, afr_add_shd_event);</div><div class='add'>+            break;</div><div class='add'>+        case GF_SHD_OP_STATISTICS:</div><div class='add'>+            for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+                eh_dump(shd-&gt;statistics[i], output, afr_add_crawl_event);</div><div class='add'>+                ret = afr_shd_dict_add_crawl_event(</div><div class='add'>+                    this, output, &amp;shd-&gt;index_healers[i].crawl_event);</div><div class='add'>+                if (ret) {</div><div class='add'>+                    gf_smsg(this-&gt;name, GF_LOG_ERROR, -ret,</div><div class='add'>+                            AFR_MSG_ADD_CRAWL_EVENT_FAILED, NULL);</div><div class='add'>+                }</div><div class='add'>+</div><div class='add'>+                ret = afr_shd_dict_add_crawl_event(</div><div class='add'>+                    this, output, &amp;shd-&gt;full_healers[i].crawl_event);</div><div class='add'>+                if (ret) {</div><div class='add'>+                    gf_smsg(this-&gt;name, GF_LOG_ERROR, -ret,</div><div class='add'>+                            AFR_MSG_ADD_CRAWL_EVENT_FAILED, NULL);</div><div class='add'>+                }</div><div class='add'>+            }</div><div class='add'>+            break;</div><div class='add'>+        case GF_SHD_OP_STATISTICS_HEAL_COUNT:</div><div class='add'>+        case GF_SHD_OP_STATISTICS_HEAL_COUNT_PER_REPLICA:</div><div class='add'>+            op_ret = -1;</div><div class='add'>+</div><div class='add'>+            for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+                if (!priv-&gt;child_up[i]) {</div><div class='add'>+                    keylen = snprintf(key, sizeof(key), "%d-%d-status", xl_id,</div><div class='add'>+                                      i);</div><div class='add'>+                    AFR_SET_DICT_AND_LOG(this-&gt;name, output, key, keylen,</div><div class='add'>+                                         SBRICK_NOT_CONNECTED,</div><div class='add'>+                                         SLEN(SBRICK_NOT_CONNECTED));</div><div class='add'>+                } else {</div><div class='add'>+                    snprintf(key, sizeof(key), "%d-%d-hardlinks", xl_id, i);</div><div class='add'>+                    ret = afr_shd_get_index_count(this, i, &amp;cnt);</div><div class='add'>+                    if (ret == 0) {</div><div class='add'>+                        ret = dict_set_uint64(output, key, cnt);</div><div class='add'>+                    }</div><div class='add'>+                    if (ret) {</div><div class='add'>+                        gf_smsg(this-&gt;name, GF_LOG_ERROR, -ret,</div><div class='add'>+                                AFR_MSG_DICT_SET_FAILED, NULL);</div><div class='add'>+                    }</div><div class='add'>+                    op_ret = 0;</div><div class='add'>+                }</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            break;</div><div class='add'>+</div><div class='add'>+        default:</div><div class='add'>+            gf_smsg(this-&gt;name, GF_LOG_ERROR, 0, AFR_MSG_INVALID_ARG, "op=%d",</div><div class='add'>+                    op, NULL);</div><div class='add'>+            break;</div><div class='add'>+    }</div><div class='add'>+out:</div><div class='add'>+    dict_deln(output, this-&gt;name, this_name_len);</div><div class='add'>+    return op_ret;</div><div class='add'>+</div><div class='add'>+#undef AFR_SET_DICT_AND_LOG</div><div class='add'>+}</div><div class='head'>diff --git a/xlators/cluster/afr/src/afr-self-heald.h b/xlators/cluster/afr/src/afr-self-heald.h<br/>new file mode 100644<br/>index 00000000000..18db728ea7b<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/xlators/cluster/afr/src/afr-self-heald.h?id=d1d7a6f35c816822fab51c820e25023863c239c1'>xlators/cluster/afr/src/afr-self-heald.h</a></div><div class='hunk'>@@ -0,0 +1,75 @@</div><div class='add'>+/*</div><div class='add'>+  Copyright (c) 2013 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#ifndef _AFR_SELF_HEALD_H</div><div class='add'>+#define _AFR_SELF_HEALD_H</div><div class='add'>+</div><div class='add'>+#include &lt;pthread.h&gt;</div><div class='add'>+</div><div class='add'>+typedef struct {</div><div class='add'>+    char *path;</div><div class='add'>+    int child;</div><div class='add'>+} shd_event_t;</div><div class='add'>+</div><div class='add'>+typedef struct {</div><div class='add'>+    uint64_t healed_count;</div><div class='add'>+    uint64_t split_brain_count;</div><div class='add'>+    uint64_t heal_failed_count;</div><div class='add'>+</div><div class='add'>+    /* If start_time is 0, it means crawler is not in progress</div><div class='add'>+       and stats are not valid */</div><div class='add'>+    time_t start_time;</div><div class='add'>+    /* If start_time is NOT 0 and end_time is 0, it means</div><div class='add'>+       cralwer is in progress */</div><div class='add'>+    time_t end_time;</div><div class='add'>+    char *crawl_type;</div><div class='add'>+    int child;</div><div class='add'>+} crawl_event_t;</div><div class='add'>+</div><div class='add'>+struct subvol_healer {</div><div class='add'>+    xlator_t *this;</div><div class='add'>+    crawl_event_t crawl_event;</div><div class='add'>+    pthread_mutex_t mutex;</div><div class='add'>+    pthread_cond_t cond;</div><div class='add'>+    pthread_t thread;</div><div class='add'>+    int subvol;</div><div class='add'>+    gf_boolean_t local;</div><div class='add'>+    gf_boolean_t running;</div><div class='add'>+    gf_boolean_t rerun;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+typedef struct {</div><div class='add'>+    struct subvol_healer *index_healers;</div><div class='add'>+    struct subvol_healer *full_healers;</div><div class='add'>+</div><div class='add'>+    eh_t *split_brain;</div><div class='add'>+    eh_t **statistics;</div><div class='add'>+    int timeout;</div><div class='add'>+    uint32_t max_threads;</div><div class='add'>+    uint32_t wait_qlength;</div><div class='add'>+    uint32_t halo_max_latency_msec;</div><div class='add'>+    gf_boolean_t iamshd;</div><div class='add'>+    gf_boolean_t enabled;</div><div class='add'>+} afr_self_heald_t;</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+afr_selfheal_daemon_init(xlator_t *this);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+afr_xl_op(xlator_t *this, dict_t *input, dict_t *output);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+afr_shd_gfid_to_path(xlator_t *this, xlator_t *subvol, uuid_t gfid,</div><div class='add'>+                     char **path_p);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+afr_shd_entry_purge(xlator_t *subvol, inode_t *inode, char *name,</div><div class='add'>+                    ia_type_t type);</div><div class='add'>+#endif /* !_AFR_SELF_HEALD_H */</div><div class='head'>diff --git a/xlators/cluster/afr/src/afr-transaction.c b/xlators/cluster/afr/src/afr-transaction.c<br/>index a382c12a876..a51f79b1f43 100644<br/>--- a/<a href='/cgit/glusterfs.git/tree/xlators/cluster/afr/src/afr-transaction.c?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/cluster/afr/src/afr-transaction.c</a><br/>+++ b/<a href='/cgit/glusterfs.git/tree/xlators/cluster/afr/src/afr-transaction.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>xlators/cluster/afr/src/afr-transaction.c</a></div><div class='hunk'>@@ -1,1184 +1,2927 @@</div><div class='ctx'> /*</div><div class='del'>-  Copyright (c) 2007-2009 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='add'>+  Copyright (c) 2008-2012 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='ctx'>   This file is part of GlusterFS.</div><div class='ctx'> </div><div class='del'>-  GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-  it under the terms of the GNU General Public License as published</div><div class='del'>-  by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-  or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-  GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-  WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-  General Public License for more details.</div><div class='del'>-</div><div class='del'>-  You should have received a copy of the GNU General Public License</div><div class='del'>-  along with this program.  If not, see</div><div class='del'>-  &lt;http://www.gnu.org/licenses/&gt;.</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='ctx'> */</div><div class='ctx'> </div><div class='del'>-#include "dict.h"</div><div class='del'>-#include "byte-order.h"</div><div class='del'>-#include "common-utils.h"</div><div class='add'>+#include &lt;glusterfs/dict.h&gt;</div><div class='add'>+#include &lt;glusterfs/byte-order.h&gt;</div><div class='add'>+#include &lt;glusterfs/common-utils.h&gt;</div><div class='add'>+#include &lt;glusterfs/timer.h&gt;</div><div class='ctx'> </div><div class='ctx'> #include "afr.h"</div><div class='ctx'> #include "afr-transaction.h"</div><div class='add'>+#include "afr-self-heal.h"</div><div class='add'>+#include "afr-messages.h"</div><div class='ctx'> </div><div class='ctx'> #include &lt;signal.h&gt;</div><div class='ctx'> </div><div class='add'>+typedef enum {</div><div class='add'>+    AFR_TRANSACTION_PRE_OP,</div><div class='add'>+    AFR_TRANSACTION_POST_OP,</div><div class='add'>+} afr_xattrop_type_t;</div><div class='ctx'> </div><div class='del'>-#define LOCKED_NO       0x0        /* no lock held */</div><div class='del'>-#define LOCKED_YES      0x1        /* for DATA, METADATA, ENTRY and higher_path</div><div class='del'>-                                      of RENAME */</div><div class='del'>-#define LOCKED_LOWER    0x2        /* for lower_path of RENAME */</div><div class='add'>+static void</div><div class='add'>+afr_lock_resume_shared(struct list_head *list);</div><div class='ctx'> </div><div class='add'>+static void</div><div class='add'>+afr_post_op_handle_success(call_frame_t *frame, xlator_t *this);</div><div class='ctx'> </div><div class='ctx'> static void</div><div class='del'>-afr_pid_save (call_frame_t *frame)</div><div class='del'>-{</div><div class='del'>-        afr_local_t * local = NULL;</div><div class='add'>+afr_post_op_handle_failure(call_frame_t *frame, xlator_t *this, int op_errno);</div><div class='ctx'> </div><div class='del'>-        local = frame-&gt;local;</div><div class='add'>+void</div><div class='add'>+__afr_transaction_wake_shared(afr_local_t *local, struct list_head *shared);</div><div class='ctx'> </div><div class='del'>-        local-&gt;saved_pid = frame-&gt;root-&gt;pid;</div><div class='del'>-}</div><div class='add'>+void</div><div class='add'>+afr_changelog_post_op_do(call_frame_t *frame, xlator_t *this);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+afr_changelog_post_op_safe(call_frame_t *frame, xlator_t *this);</div><div class='add'>+</div><div class='add'>+gf_boolean_t</div><div class='add'>+afr_changelog_pre_op_uninherit(call_frame_t *frame, xlator_t *this);</div><div class='ctx'> </div><div class='add'>+gf_boolean_t</div><div class='add'>+afr_changelog_pre_op_update(call_frame_t *frame, xlator_t *this);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+afr_changelog_call_count(afr_transaction_type type,</div><div class='add'>+                         unsigned char *pre_op_subvols,</div><div class='add'>+                         unsigned char *failed_subvols,</div><div class='add'>+                         unsigned int child_count);</div><div class='add'>+int</div><div class='add'>+afr_changelog_do(call_frame_t *frame, xlator_t *this, dict_t *xattr,</div><div class='add'>+                 afr_changelog_resume_t changelog_resume,</div><div class='add'>+                 afr_xattrop_type_t op);</div><div class='ctx'> </div><div class='ctx'> static void</div><div class='del'>-afr_pid_restore (call_frame_t *frame)</div><div class='del'>-{</div><div class='del'>-        afr_local_t * local = NULL;</div><div class='add'>+afr_ta_decide_post_op_state(call_frame_t *frame, xlator_t *this);</div><div class='ctx'> </div><div class='del'>-        local = frame-&gt;local;</div><div class='add'>+static int</div><div class='add'>+afr_ta_post_op_do(void *opaque);</div><div class='ctx'> </div><div class='del'>-        frame-&gt;root-&gt;pid = local-&gt;saved_pid;</div><div class='del'>-}</div><div class='add'>+static int</div><div class='add'>+afr_ta_post_op_synctask(xlator_t *this, afr_local_t *local);</div><div class='ctx'> </div><div class='add'>+static int</div><div class='add'>+afr_changelog_post_op_done(call_frame_t *frame, xlator_t *this);</div><div class='ctx'> </div><div class='ctx'> static void</div><div class='del'>-__mark_all_pending (int32_t *pending[], int child_count,</div><div class='del'>-                    afr_transaction_type type)</div><div class='del'>-{	</div><div class='del'>-	int i;</div><div class='del'>-        int j;</div><div class='del'>-</div><div class='del'>-        for (i = 0; i &lt; child_count; i++) {</div><div class='del'>-                j = afr_index_for_transaction_type (type);</div><div class='del'>-		pending[i][j] = hton32 (1);</div><div class='del'>-        }</div><div class='del'>-}</div><div class='add'>+afr_changelog_post_op_fail(call_frame_t *frame, xlator_t *this, int op_errno);</div><div class='ctx'> </div><div class='add'>+void</div><div class='add'>+afr_ta_locked_priv_invalidate(afr_private_t *priv)</div><div class='add'>+{</div><div class='add'>+    priv-&gt;ta_bad_child_index = AFR_CHILD_UNKNOWN;</div><div class='add'>+    priv-&gt;release_ta_notify_dom_lock = _gf_false;</div><div class='add'>+    priv-&gt;ta_notify_dom_lock_offset = 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> static void</div><div class='del'>-__mark_child_dead (int32_t *pending[], int child_count, int child,</div><div class='del'>-                   afr_transaction_type type)</div><div class='add'>+afr_ta_process_waitq(xlator_t *this)</div><div class='add'>+{</div><div class='add'>+    afr_local_t *entry = NULL;</div><div class='add'>+    afr_private_t *priv = this-&gt;private;</div><div class='add'>+    struct list_head waitq = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    INIT_LIST_HEAD(&amp;waitq);</div><div class='add'>+    LOCK(&amp;priv-&gt;lock);</div><div class='add'>+    list_splice_init(&amp;priv-&gt;ta_waitq, &amp;waitq);</div><div class='add'>+    UNLOCK(&amp;priv-&gt;lock);</div><div class='add'>+    list_for_each_entry(entry, &amp;waitq, ta_waitq)</div><div class='add'>+    {</div><div class='add'>+        afr_ta_decide_post_op_state(entry-&gt;transaction.frame, this);</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+afr_ta_lock_release_done(int ret, call_frame_t *ta_frame, void *opaque)</div><div class='ctx'> {</div><div class='del'>-        int j;</div><div class='add'>+    afr_ta_process_waitq(ta_frame-&gt;this);</div><div class='add'>+    STACK_DESTROY(ta_frame-&gt;root);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        j = afr_index_for_transaction_type (type);</div><div class='del'>-        </div><div class='del'>-	pending[child][j] = 0;</div><div class='add'>+int</div><div class='add'>+afr_release_notify_lock_for_ta(void *opaque)</div><div class='add'>+{</div><div class='add'>+    xlator_t *this = NULL;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    loc_t loc = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    struct gf_flock flock = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    this = (xlator_t *)opaque;</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+    ret = afr_fill_ta_loc(this, &amp;loc, _gf_true);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_ERROR, -ret, AFR_MSG_THIN_ARB,</div><div class='add'>+               "Failed to populate loc for thin-arbiter.");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    flock.l_type = F_UNLCK;</div><div class='add'>+    flock.l_start = priv-&gt;ta_notify_dom_lock_offset;</div><div class='add'>+    flock.l_len = 1;</div><div class='add'>+    ret = syncop_inodelk(priv-&gt;children[THIN_ARBITER_BRICK_INDEX],</div><div class='add'>+                         AFR_TA_DOM_NOTIFY, &amp;loc, F_SETLK, &amp;flock, NULL, NULL);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_ERROR, -ret, AFR_MSG_THIN_ARB,</div><div class='add'>+               "Failed to unlock AFR_TA_DOM_NOTIFY lock.");</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;priv-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        afr_ta_locked_priv_invalidate(priv);</div><div class='add'>+    }</div><div class='add'>+    UNLOCK(&amp;priv-&gt;lock);</div><div class='add'>+out:</div><div class='add'>+    loc_wipe(&amp;loc);</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+void</div><div class='add'>+afr_zero_fill_stat(afr_local_t *local)</div><div class='add'>+{</div><div class='add'>+    if (!local)</div><div class='add'>+        return;</div><div class='add'>+    if (local-&gt;transaction.type == AFR_DATA_TRANSACTION ||</div><div class='add'>+        local-&gt;transaction.type == AFR_METADATA_TRANSACTION) {</div><div class='add'>+        gf_zero_fill_stat(&amp;local-&gt;cont.inode_wfop.prebuf);</div><div class='add'>+        gf_zero_fill_stat(&amp;local-&gt;cont.inode_wfop.postbuf);</div><div class='add'>+    } else if (local-&gt;transaction.type == AFR_ENTRY_TRANSACTION ||</div><div class='add'>+               local-&gt;transaction.type == AFR_ENTRY_RENAME_TRANSACTION) {</div><div class='add'>+        gf_zero_fill_stat(&amp;local-&gt;cont.dir_fop.buf);</div><div class='add'>+        gf_zero_fill_stat(&amp;local-&gt;cont.dir_fop.preparent);</div><div class='add'>+        gf_zero_fill_stat(&amp;local-&gt;cont.dir_fop.postparent);</div><div class='add'>+        if (local-&gt;transaction.type == AFR_ENTRY_TRANSACTION)</div><div class='add'>+            return;</div><div class='add'>+        gf_zero_fill_stat(&amp;local-&gt;cont.dir_fop.prenewparent);</div><div class='add'>+        gf_zero_fill_stat(&amp;local-&gt;cont.dir_fop.postnewparent);</div><div class='add'>+    }</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-static void</div><div class='del'>-__mark_fop_failed_on_fd (fd_t *fd, xlator_t *this,</div><div class='del'>-                         int child_index)</div><div class='add'>+/* In case of errors afr needs to choose which xdata from lower xlators it needs</div><div class='add'>+ * to unwind with. The way it is done is by checking if there are</div><div class='add'>+ * any good subvols which failed. Give preference to errnos other than</div><div class='add'>+ * ENOTCONN even if the child is source */</div><div class='add'>+void</div><div class='add'>+afr_pick_error_xdata(afr_local_t *local, afr_private_t *priv, inode_t *inode1,</div><div class='add'>+                     unsigned char *readable1, inode_t *inode2,</div><div class='add'>+                     unsigned char *readable2)</div><div class='ctx'> {</div><div class='del'>-        uint64_t       ctx;</div><div class='del'>-        afr_fd_ctx_t * fd_ctx = NULL;</div><div class='add'>+    int s = -1; /*selection*/</div><div class='add'>+    int i = 0;</div><div class='add'>+    unsigned char *readable = NULL;</div><div class='add'>+</div><div class='add'>+    if (local-&gt;xdata_rsp) {</div><div class='add'>+        dict_unref(local-&gt;xdata_rsp);</div><div class='add'>+        local-&gt;xdata_rsp = NULL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    readable = alloca0(priv-&gt;child_count * sizeof(*readable));</div><div class='add'>+    if (inode2 &amp;&amp; readable2) { /*rename fop*/</div><div class='add'>+        AFR_INTERSECT(readable, readable1, readable2, priv-&gt;child_count);</div><div class='add'>+    } else {</div><div class='add'>+        memcpy(readable, readable1, sizeof(*readable) * priv-&gt;child_count);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+        if (!local-&gt;replies[i].valid)</div><div class='add'>+            continue;</div><div class='add'>+</div><div class='add'>+        if (local-&gt;replies[i].op_ret &gt;= 0)</div><div class='add'>+            continue;</div><div class='add'>+</div><div class='add'>+        if (local-&gt;replies[i].op_errno == ENOTCONN)</div><div class='add'>+            continue;</div><div class='add'>+</div><div class='add'>+        /*Order is important in the following condition*/</div><div class='add'>+        if ((s &lt; 0) || (!readable[s] &amp;&amp; readable[i]))</div><div class='add'>+            s = i;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (s != -1 &amp;&amp; local-&gt;replies[s].xdata) {</div><div class='add'>+        local-&gt;xdata_rsp = dict_ref(local-&gt;replies[s].xdata);</div><div class='add'>+    } else if (s == -1) {</div><div class='add'>+        for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+            if (!local-&gt;replies[i].valid)</div><div class='add'>+                continue;</div><div class='ctx'> </div><div class='del'>-        int ret = 0;</div><div class='add'>+            if (local-&gt;replies[i].op_ret &gt;= 0)</div><div class='add'>+                continue;</div><div class='ctx'> </div><div class='del'>-        ret = fd_ctx_get (fd, this, &amp;ctx);</div><div class='add'>+            if (!local-&gt;replies[i].xdata)</div><div class='add'>+                continue;</div><div class='add'>+            local-&gt;xdata_rsp = dict_ref(local-&gt;replies[i].xdata);</div><div class='add'>+            break;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        if (ret &lt; 0)</div><div class='del'>-                goto out;</div><div class='add'>+gf_boolean_t</div><div class='add'>+afr_needs_changelog_update(afr_local_t *local)</div><div class='add'>+{</div><div class='add'>+    if (local-&gt;transaction.type == AFR_DATA_TRANSACTION)</div><div class='add'>+        return _gf_true;</div><div class='add'>+    if (!local-&gt;optimistic_change_log)</div><div class='add'>+        return _gf_true;</div><div class='add'>+    return _gf_false;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        fd_ctx = (afr_fd_ctx_t *)(long) ctx;</div><div class='add'>+gf_boolean_t</div><div class='add'>+afr_changelog_has_quorum(afr_local_t *local, xlator_t *this)</div><div class='add'>+{</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    int i = 0;</div><div class='add'>+    unsigned char *success_children = NULL;</div><div class='ctx'> </div><div class='del'>-        fd_ctx-&gt;child_failed[child_index] = 1;</div><div class='del'>-out:</div><div class='del'>-        return;</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+    success_children = alloca0(priv-&gt;child_count);</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+        if (!local-&gt;transaction.failed_subvols[i]) {</div><div class='add'>+            success_children[i] = 1;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (afr_has_quorum(success_children, this, NULL)) {</div><div class='add'>+        return _gf_true;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return _gf_false;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+gf_boolean_t</div><div class='add'>+afr_is_write_subvol_valid(call_frame_t *frame, xlator_t *this)</div><div class='add'>+{</div><div class='add'>+    int i = 0;</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    uint64_t write_subvol = 0;</div><div class='add'>+    unsigned char *writable = NULL;</div><div class='add'>+    uint16_t datamap = 0;</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+    writable = alloca0(priv-&gt;child_count);</div><div class='add'>+</div><div class='add'>+    write_subvol = afr_write_subvol_get(frame, this);</div><div class='add'>+    datamap = (write_subvol &amp; 0x00000000ffff0000) &gt;&gt; 16;</div><div class='add'>+    for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+        if (datamap &amp; (1 &lt;&lt; i))</div><div class='add'>+            writable[i] = 1;</div><div class='add'>+</div><div class='add'>+        if (writable[i] &amp;&amp; !local-&gt;transaction.failed_subvols[i])</div><div class='add'>+            return _gf_true;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return _gf_false;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-static void</div><div class='del'>-__mark_failed_children (int32_t *pending[], int child_count, </div><div class='del'>-                        xlator_t *this, fd_t *fd, afr_transaction_type type)</div><div class='add'>+int</div><div class='add'>+afr_transaction_fop(call_frame_t *frame, xlator_t *this)</div><div class='ctx'> {</div><div class='del'>-        uint64_t       ctx;</div><div class='del'>-        afr_fd_ctx_t * fd_ctx = NULL;</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    int call_count = -1;</div><div class='add'>+    unsigned char *failed_subvols = NULL;</div><div class='add'>+    int i = 0;</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    failed_subvols = local-&gt;transaction.failed_subvols;</div><div class='add'>+    call_count = priv-&gt;child_count -</div><div class='add'>+                 AFR_COUNT(failed_subvols, priv-&gt;child_count);</div><div class='add'>+    /* Fail if pre-op did not succeed on quorum no. of bricks. */</div><div class='add'>+    if (!afr_changelog_has_quorum(local, this) || !call_count) {</div><div class='add'>+        local-&gt;op_ret = -1;</div><div class='add'>+        /* local-&gt;op_errno is already captured in changelog cbk. */</div><div class='add'>+        afr_transaction_resume(frame, this);</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Fail if at least one writeable brick isn't up.*/</div><div class='add'>+    if (local-&gt;transaction.type == AFR_DATA_TRANSACTION &amp;&amp;</div><div class='add'>+        !afr_is_write_subvol_valid(frame, this)) {</div><div class='add'>+        local-&gt;op_ret = -1;</div><div class='add'>+        local-&gt;op_errno = EIO;</div><div class='add'>+        afr_transaction_resume(frame, this);</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        int ret = 0;</div><div class='del'>-        int i   = 0;</div><div class='del'>-        int j   = 0;</div><div class='add'>+    local-&gt;call_count = call_count;</div><div class='add'>+    for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+        if (local-&gt;transaction.pre_op[i] &amp;&amp; !failed_subvols[i]) {</div><div class='add'>+            local-&gt;transaction.wind(frame, this, i);</div><div class='ctx'> </div><div class='del'>-        ret = fd_ctx_get (fd, this, &amp;ctx);</div><div class='add'>+            if (!--call_count)</div><div class='add'>+                break;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        if (ret &lt; 0)</div><div class='del'>-                goto out;</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        fd_ctx = (afr_fd_ctx_t *)(long) ctx;</div><div class='add'>+int</div><div class='add'>+afr_transaction_done(call_frame_t *frame, xlator_t *this)</div><div class='add'>+{</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    gf_boolean_t unwind = _gf_false;</div><div class='add'>+    afr_lock_t *lock = NULL;</div><div class='add'>+    afr_local_t *lock_local = NULL;</div><div class='ctx'> </div><div class='del'>-        for (i = 0; i &lt; child_count; i++) {</div><div class='del'>-                j = afr_index_for_transaction_type (type);</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+    local = frame-&gt;local;</div><div class='ctx'> </div><div class='del'>-                if (fd_ctx-&gt;child_failed[i])</div><div class='del'>-                        pending[i][j] = 0;</div><div class='add'>+    if (priv-&gt;consistent_metadata) {</div><div class='add'>+        LOCK(&amp;frame-&gt;lock);</div><div class='add'>+        {</div><div class='add'>+            unwind = (local-&gt;transaction.main_frame != NULL);</div><div class='ctx'>         }</div><div class='del'>-        </div><div class='del'>-out:</div><div class='del'>-        return;</div><div class='add'>+        UNLOCK(&amp;frame-&gt;lock);</div><div class='add'>+        if (unwind) /*It definitely did post-op*/</div><div class='add'>+            afr_zero_fill_stat(local);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (local-&gt;transaction.do_eager_unlock) {</div><div class='add'>+        lock = &amp;local-&gt;inode_ctx-&gt;lock[local-&gt;transaction.type];</div><div class='add'>+        LOCK(&amp;local-&gt;inode-&gt;lock);</div><div class='add'>+        {</div><div class='add'>+            lock-&gt;acquired = _gf_false;</div><div class='add'>+            lock-&gt;release = _gf_false;</div><div class='add'>+            list_splice_init(&amp;lock-&gt;frozen, &amp;lock-&gt;waiting);</div><div class='add'>+            if (list_empty(&amp;lock-&gt;waiting))</div><div class='add'>+                goto unlock;</div><div class='add'>+            lock_local = list_entry(lock-&gt;waiting.next, afr_local_t,</div><div class='add'>+                                    transaction.wait_list);</div><div class='add'>+            list_del_init(&amp;lock_local-&gt;transaction.wait_list);</div><div class='add'>+            list_add(&amp;lock_local-&gt;transaction.owner_list, &amp;lock-&gt;owners);</div><div class='add'>+        }</div><div class='add'>+    unlock:</div><div class='add'>+        UNLOCK(&amp;local-&gt;inode-&gt;lock);</div><div class='add'>+    }</div><div class='add'>+    if (lock_local) {</div><div class='add'>+        afr_lock(lock_local-&gt;transaction.frame,</div><div class='add'>+                 lock_local-&gt;transaction.frame-&gt;this);</div><div class='add'>+    }</div><div class='add'>+    local-&gt;transaction.unwind(frame, this);</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(list_empty(&amp;local-&gt;transaction.owner_list));</div><div class='add'>+    GF_ASSERT(list_empty(&amp;local-&gt;transaction.wait_list));</div><div class='add'>+    AFR_STACK_DESTROY(frame);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+static void</div><div class='add'>+afr_lock_fail_shared(afr_local_t *local, struct list_head *list)</div><div class='add'>+{</div><div class='add'>+    afr_local_t *each = NULL;</div><div class='add'>+</div><div class='add'>+    while (!list_empty(list)) {</div><div class='add'>+        each = list_entry(list-&gt;next, afr_local_t, transaction.wait_list);</div><div class='add'>+        list_del_init(&amp;each-&gt;transaction.wait_list);</div><div class='add'>+        each-&gt;op_ret = -1;</div><div class='add'>+        each-&gt;op_errno = local-&gt;op_errno;</div><div class='add'>+        afr_transaction_done(each-&gt;transaction.frame,</div><div class='add'>+                             each-&gt;transaction.frame-&gt;this);</div><div class='add'>+    }</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> static void</div><div class='del'>-__mark_pre_op_done_on_fd (call_frame_t *frame, xlator_t *this, int child_index)</div><div class='add'>+afr_handle_lock_acquire_failure(afr_local_t *local)</div><div class='ctx'> {</div><div class='del'>-        afr_local_t *local = NULL;</div><div class='add'>+    struct list_head shared;</div><div class='add'>+    afr_lock_t *lock = NULL;</div><div class='ctx'> </div><div class='del'>-        uint64_t       ctx;</div><div class='del'>-        afr_fd_ctx_t * fd_ctx = NULL;</div><div class='del'>-        int ret = 0;</div><div class='add'>+    if (!local-&gt;transaction.eager_lock_on)</div><div class='add'>+        goto out;</div><div class='ctx'> </div><div class='del'>-        local = frame-&gt;local;</div><div class='add'>+    lock = &amp;local-&gt;inode_ctx-&gt;lock[local-&gt;transaction.type];</div><div class='ctx'> </div><div class='del'>-        ret = fd_ctx_get (local-&gt;fd, this, &amp;ctx);</div><div class='add'>+    INIT_LIST_HEAD(&amp;shared);</div><div class='add'>+    LOCK(&amp;local-&gt;inode-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        lock-&gt;release = _gf_true;</div><div class='add'>+        list_splice_init(&amp;lock-&gt;waiting, &amp;shared);</div><div class='add'>+    }</div><div class='add'>+    UNLOCK(&amp;local-&gt;inode-&gt;lock);</div><div class='ctx'> </div><div class='del'>-        if (ret &lt; 0)</div><div class='del'>-                goto out;</div><div class='add'>+    afr_lock_fail_shared(local, &amp;shared);</div><div class='add'>+    local-&gt;transaction.do_eager_unlock = _gf_true;</div><div class='add'>+out:</div><div class='add'>+    local-&gt;internal_lock.lock_cbk = afr_transaction_done;</div><div class='add'>+    afr_unlock(local-&gt;transaction.frame, local-&gt;transaction.frame-&gt;this);</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        fd_ctx = (afr_fd_ctx_t *)(long) ctx;</div><div class='add'>+call_frame_t *</div><div class='add'>+afr_transaction_detach_fop_frame(call_frame_t *frame)</div><div class='add'>+{</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    call_frame_t *fop_frame = NULL;</div><div class='ctx'> </div><div class='del'>-        if ((local-&gt;op == GF_FOP_WRITE)</div><div class='del'>-            || (local-&gt;op == GF_FOP_FTRUNCATE)) {</div><div class='del'>-                fd_ctx-&gt;pre_op_done[child_index] = 1;</div><div class='del'>-        }</div><div class='add'>+    local = frame-&gt;local;</div><div class='ctx'> </div><div class='del'>-out:</div><div class='del'>-        return;</div><div class='del'>-}</div><div class='add'>+    afr_handle_inconsistent_fop(frame, &amp;local-&gt;op_ret, &amp;local-&gt;op_errno);</div><div class='add'>+    LOCK(&amp;frame-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        fop_frame = local-&gt;transaction.main_frame;</div><div class='add'>+        local-&gt;transaction.main_frame = NULL;</div><div class='add'>+    }</div><div class='add'>+    UNLOCK(&amp;frame-&gt;lock);</div><div class='ctx'> </div><div class='add'>+    return fop_frame;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> static void</div><div class='del'>-__mark_down_children (int32_t *pending[], int child_count, </div><div class='del'>-                      unsigned char *child_up, afr_transaction_type type)</div><div class='add'>+afr_save_lk_owner(call_frame_t *frame)</div><div class='ctx'> {</div><div class='del'>-	int i;</div><div class='del'>-	int j;</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='ctx'> </div><div class='del'>-	for (i = 0; i &lt; child_count; i++) {</div><div class='del'>-                j = afr_index_for_transaction_type (type);</div><div class='add'>+    local = frame-&gt;local;</div><div class='ctx'> </div><div class='del'>-		if (!child_up[i])</div><div class='del'>-			pending[i][j] = 0;</div><div class='del'>-        }</div><div class='add'>+    local-&gt;saved_lk_owner = frame-&gt;root-&gt;lk_owner;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> static void</div><div class='del'>-__mark_all_success (int32_t *pending[], int child_count,</div><div class='del'>-                    afr_transaction_type type)</div><div class='add'>+afr_restore_lk_owner(call_frame_t *frame)</div><div class='ctx'> {</div><div class='del'>-	int i;</div><div class='del'>-        int j;</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='ctx'> </div><div class='del'>-	for (i = 0; i &lt; child_count; i++) {</div><div class='del'>-                j = afr_index_for_transaction_type (type);</div><div class='del'>-		pending[i][j] = hton32 (-1);</div><div class='del'>-        }</div><div class='del'>-}</div><div class='add'>+    local = frame-&gt;local;</div><div class='ctx'> </div><div class='add'>+    frame-&gt;root-&gt;lk_owner = local-&gt;saved_lk_owner;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-static int</div><div class='del'>-__is_first_write_on_fd (xlator_t *this, fd_t *fd)</div><div class='add'>+void</div><div class='add'>+__mark_all_success(call_frame_t *frame, xlator_t *this)</div><div class='ctx'> {</div><div class='del'>-        int op_ret     = 0;</div><div class='del'>-        int _ret       = -1;</div><div class='del'>-        int i          = 0;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    int i;</div><div class='ctx'> </div><div class='del'>-        uint64_t       ctx;</div><div class='del'>-        afr_fd_ctx_t * fd_ctx = NULL;</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    priv = this-&gt;private;</div><div class='ctx'> </div><div class='del'>-        afr_private_t *priv = NULL;</div><div class='add'>+    for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+        local-&gt;transaction.failed_subvols[i] = 0;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        priv = this-&gt;private;</div><div class='add'>+void</div><div class='add'>+afr_compute_pre_op_sources(call_frame_t *frame, xlator_t *this)</div><div class='add'>+{</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    afr_transaction_type type = -1;</div><div class='add'>+    dict_t *xdata = NULL;</div><div class='add'>+    int **matrix = NULL;</div><div class='add'>+    int idx = -1;</div><div class='add'>+    int i = 0;</div><div class='add'>+    int j = 0;</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    type = local-&gt;transaction.type;</div><div class='add'>+    idx = afr_index_for_transaction_type(type);</div><div class='add'>+    matrix = ALLOC_MATRIX(priv-&gt;child_count, int);</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+        if (!local-&gt;transaction.changelog_xdata[i])</div><div class='add'>+            continue;</div><div class='add'>+        xdata = local-&gt;transaction.changelog_xdata[i];</div><div class='add'>+        afr_selfheal_fill_matrix(this, matrix, i, idx, xdata);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    memset(local-&gt;transaction.pre_op_sources, 1, priv-&gt;child_count);</div><div class='add'>+</div><div class='add'>+    /*If lock or pre-op failed on a brick, it is not a source. */</div><div class='add'>+    for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+        if (local-&gt;transaction.failed_subvols[i])</div><div class='add'>+            local-&gt;transaction.pre_op_sources[i] = 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* If brick is blamed by others, it is not a source. */</div><div class='add'>+    for (i = 0; i &lt; priv-&gt;child_count; i++)</div><div class='add'>+        for (j = 0; j &lt; priv-&gt;child_count; j++)</div><div class='add'>+            if (matrix[i][j] != 0)</div><div class='add'>+                local-&gt;transaction.pre_op_sources[j] = 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+afr_txn_arbitrate_fop(call_frame_t *frame, xlator_t *this)</div><div class='add'>+{</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    int pre_op_sources_count = 0;</div><div class='add'>+    int i = 0;</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+</div><div class='add'>+    afr_compute_pre_op_sources(frame, this);</div><div class='add'>+    pre_op_sources_count = AFR_COUNT(local-&gt;transaction.pre_op_sources,</div><div class='add'>+                                     priv-&gt;child_count);</div><div class='add'>+</div><div class='add'>+    /* If arbiter is the only source, do not proceed. */</div><div class='add'>+    if (pre_op_sources_count &lt; 2 &amp;&amp;</div><div class='add'>+        local-&gt;transaction.pre_op_sources[ARBITER_BRICK_INDEX]) {</div><div class='add'>+        local-&gt;op_ret = -1;</div><div class='add'>+        local-&gt;op_errno = ENOTCONN;</div><div class='add'>+        for (i = 0; i &lt; priv-&gt;child_count; i++)</div><div class='add'>+            local-&gt;transaction.failed_subvols[i] = 1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    afr_transaction_fop(frame, this);</div><div class='add'>+</div><div class='add'>+    return;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        LOCK (&amp;fd-&gt;lock);</div><div class='add'>+int</div><div class='add'>+afr_transaction_perform_fop(call_frame_t *frame, xlator_t *this)</div><div class='add'>+{</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    int i = 0;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    int failure_count = 0;</div><div class='add'>+    struct list_head shared;</div><div class='add'>+    afr_lock_t *lock = NULL;</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    INIT_LIST_HEAD(&amp;shared);</div><div class='add'>+    if (local-&gt;transaction.type == AFR_DATA_TRANSACTION &amp;&amp;</div><div class='add'>+        !local-&gt;transaction.inherited) {</div><div class='add'>+        ret = afr_write_subvol_set(frame, this);</div><div class='add'>+        if (ret) {</div><div class='add'>+            /*act as if operation failed on all subvols*/</div><div class='add'>+            local-&gt;op_ret = -1;</div><div class='add'>+            local-&gt;op_errno = -ret;</div><div class='add'>+            for (i = 0; i &lt; priv-&gt;child_count; i++)</div><div class='add'>+                local-&gt;transaction.failed_subvols[i] = 1;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (local-&gt;pre_op_compat)</div><div class='add'>+        /* old mode, pre-op was done as afr_changelog_do()</div><div class='add'>+           just now, before OP */</div><div class='add'>+        afr_changelog_pre_op_update(frame, this);</div><div class='add'>+</div><div class='add'>+    if (!local-&gt;transaction.eager_lock_on || local-&gt;transaction.inherited)</div><div class='add'>+        goto fop;</div><div class='add'>+    failure_count = AFR_COUNT(local-&gt;transaction.failed_subvols,</div><div class='add'>+                              priv-&gt;child_count);</div><div class='add'>+    if (failure_count == priv-&gt;child_count) {</div><div class='add'>+        afr_handle_lock_acquire_failure(local);</div><div class='add'>+        return 0;</div><div class='add'>+    } else {</div><div class='add'>+        lock = &amp;local-&gt;inode_ctx-&gt;lock[local-&gt;transaction.type];</div><div class='add'>+        LOCK(&amp;local-&gt;inode-&gt;lock);</div><div class='ctx'>         {</div><div class='del'>-                _ret = __fd_ctx_get (fd, this, &amp;ctx);</div><div class='del'>-                </div><div class='del'>-                if (_ret &lt; 0) {</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-                                "could not get fd ctx on fd=%p",</div><div class='del'>-                                fd);</div><div class='del'>-                        goto out;</div><div class='del'>-                }</div><div class='add'>+            lock-&gt;acquired = _gf_true;</div><div class='add'>+            __afr_transaction_wake_shared(local, &amp;shared);</div><div class='add'>+        }</div><div class='add'>+        UNLOCK(&amp;local-&gt;inode-&gt;lock);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+fop:</div><div class='add'>+    /*  Perform fops with the lk-owner from top xlator.</div><div class='add'>+     *  Eg: lk-owner of posix-lk and flush should be same,</div><div class='add'>+     *  flush cant clear the  posix-lks without that lk-owner.</div><div class='add'>+     */</div><div class='add'>+    afr_save_lk_owner(frame);</div><div class='add'>+    frame-&gt;root-&gt;lk_owner = local-&gt;transaction.main_frame-&gt;root-&gt;lk_owner;</div><div class='add'>+</div><div class='add'>+    if (priv-&gt;arbiter_count == 1) {</div><div class='add'>+        afr_txn_arbitrate_fop(frame, this);</div><div class='add'>+    } else {</div><div class='add'>+        afr_transaction_fop(frame, this);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    afr_lock_resume_shared(&amp;shared);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-                fd_ctx = (afr_fd_ctx_t *)(long) ctx;</div><div class='add'>+int</div><div class='add'>+afr_set_pending_dict(afr_private_t *priv, dict_t *xattr, int **pending)</div><div class='add'>+{</div><div class='add'>+    int i = 0;</div><div class='add'>+    int ret = 0;</div><div class='ctx'> </div><div class='del'>-                op_ret = 1;</div><div class='del'>-                for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='del'>-                        if (fd_ctx-&gt;pre_op_done[i] == 0)</div><div class='del'>-                                continue;</div><div class='add'>+    for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+        ret = dict_set_static_bin(xattr, priv-&gt;pending_key[i], pending[i],</div><div class='add'>+                                  AFR_NUM_CHANGE_LOGS * sizeof(int));</div><div class='add'>+        /* 3 = data+metadata+entry */</div><div class='ctx'> </div><div class='del'>-                        op_ret = 0;</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='del'>-out:</div><div class='del'>-        UNLOCK (&amp;fd-&gt;lock);</div><div class='add'>+        if (ret)</div><div class='add'>+            break;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        return op_ret;</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='del'>-static int</div><div class='del'>-__if_fd_pre_op_done (xlator_t *this, fd_t *fd, int child_index)</div><div class='add'>+static void</div><div class='add'>+afr_ta_dom_lock_check_and_release(afr_ta_fop_state_t fop_state, xlator_t *this)</div><div class='ctx'> {</div><div class='del'>-        int op_ret = 0;</div><div class='del'>-        int _ret   = -1;</div><div class='del'>-</div><div class='del'>-        uint64_t       ctx;</div><div class='del'>-        afr_fd_ctx_t * fd_ctx = NULL;</div><div class='del'>-</div><div class='del'>-        LOCK (&amp;fd-&gt;lock);</div><div class='del'>-        {</div><div class='del'>-                _ret = __fd_ctx_get (fd, this, &amp;ctx);</div><div class='add'>+    afr_private_t *priv = this-&gt;private;</div><div class='add'>+    unsigned int inmem_count = 0;</div><div class='add'>+    unsigned int onwire_count = 0;</div><div class='add'>+    gf_boolean_t release = _gf_false;</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;priv-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        /*Once we get notify lock release upcall notification,</div><div class='add'>+         if any of the fop state counters are non-zero, we will</div><div class='add'>+         not release the lock.</div><div class='add'>+         */</div><div class='add'>+        onwire_count = priv-&gt;ta_on_wire_txn_count;</div><div class='add'>+        inmem_count = priv-&gt;ta_in_mem_txn_count;</div><div class='add'>+        switch (fop_state) {</div><div class='add'>+            case TA_GET_INFO_FROM_TA_FILE:</div><div class='add'>+                onwire_count = --priv-&gt;ta_on_wire_txn_count;</div><div class='add'>+                break;</div><div class='add'>+            case TA_INFO_IN_MEMORY_SUCCESS:</div><div class='add'>+            case TA_INFO_IN_MEMORY_FAILED:</div><div class='add'>+                inmem_count = --priv-&gt;ta_in_mem_txn_count;</div><div class='add'>+                break;</div><div class='add'>+            case TA_WAIT_FOR_NOTIFY_LOCK_REL:</div><div class='add'>+                GF_ASSERT(0);</div><div class='add'>+                break;</div><div class='add'>+            case TA_SUCCESS:</div><div class='add'>+                break;</div><div class='add'>+        }</div><div class='add'>+        release = priv-&gt;release_ta_notify_dom_lock;</div><div class='add'>+    }</div><div class='add'>+    UNLOCK(&amp;priv-&gt;lock);</div><div class='ctx'> </div><div class='del'>-                if (_ret &lt; 0) {</div><div class='del'>-                        goto out;</div><div class='del'>-                }</div><div class='add'>+    if (inmem_count != 0 || release == _gf_false || onwire_count != 0)</div><div class='add'>+        return;</div><div class='ctx'> </div><div class='del'>-                fd_ctx = (afr_fd_ctx_t *)(long) ctx;</div><div class='add'>+    afr_ta_lock_release_synctask(this);</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-                if (fd_ctx-&gt;pre_op_done[child_index]) {</div><div class='del'>-                        op_ret = 1;</div><div class='del'>-                }</div><div class='del'>-                fd_ctx-&gt;pre_op_done[child_index] = 0;</div><div class='add'>+static void</div><div class='add'>+afr_ta_process_onwireq(afr_ta_fop_state_t fop_state, xlator_t *this)</div><div class='add'>+{</div><div class='add'>+    afr_private_t *priv = this-&gt;private;</div><div class='add'>+    afr_local_t *entry = NULL;</div><div class='add'>+    int bad_child = AFR_CHILD_UNKNOWN;</div><div class='add'>+</div><div class='add'>+    struct list_head onwireq = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    INIT_LIST_HEAD(&amp;onwireq);</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;priv-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        bad_child = priv-&gt;ta_bad_child_index;</div><div class='add'>+        if (bad_child == AFR_CHILD_UNKNOWN) {</div><div class='add'>+            /*The previous on-wire ta_post_op was a failure. Just dequeue</div><div class='add'>+             *one element to wind on-wire again. */</div><div class='add'>+            entry = list_entry(priv-&gt;ta_onwireq.next, afr_local_t, ta_onwireq);</div><div class='add'>+            list_del_init(&amp;entry-&gt;ta_onwireq);</div><div class='add'>+        } else {</div><div class='add'>+            /* Prepare to process all fops based on bad_child_index. */</div><div class='add'>+            list_splice_init(&amp;priv-&gt;ta_onwireq, &amp;onwireq);</div><div class='ctx'>         }</div><div class='del'>-out:</div><div class='del'>-        UNLOCK (&amp;fd-&gt;lock);</div><div class='add'>+    }</div><div class='add'>+    UNLOCK(&amp;priv-&gt;lock);</div><div class='ctx'> </div><div class='del'>-        return op_ret;</div><div class='add'>+    if (entry) {</div><div class='add'>+        afr_ta_post_op_synctask(this, entry);</div><div class='add'>+        return;</div><div class='add'>+    } else {</div><div class='add'>+        while (!list_empty(&amp;onwireq)) {</div><div class='add'>+            entry = list_entry(onwireq.next, afr_local_t, ta_onwireq);</div><div class='add'>+            list_del_init(&amp;entry-&gt;ta_onwireq);</div><div class='add'>+            if (entry-&gt;ta_failed_subvol == bad_child) {</div><div class='add'>+                afr_post_op_handle_success(entry-&gt;transaction.frame, this);</div><div class='add'>+            } else {</div><div class='add'>+                afr_post_op_handle_failure(entry-&gt;transaction.frame, this, EIO);</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='del'>-static int</div><div class='del'>-afr_pre_op_done_count (xlator_t *this, fd_t *fd, unsigned char *child_up)</div><div class='add'>+int</div><div class='add'>+afr_changelog_post_op_done(call_frame_t *frame, xlator_t *this)</div><div class='ctx'> {</div><div class='del'>-        int i = 0;</div><div class='del'>-        int count = 0;</div><div class='del'>-</div><div class='del'>-        int _ret = 0;</div><div class='del'>-        uint64_t       ctx;</div><div class='del'>-        afr_fd_ctx_t * fd_ctx = NULL;</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    afr_internal_lock_t *int_lock = NULL;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+    int_lock = &amp;local-&gt;internal_lock;</div><div class='add'>+</div><div class='add'>+    if (priv-&gt;thin_arbiter_count) {</div><div class='add'>+        /*fop should not come here with TA_WAIT_FOR_NOTIFY_LOCK_REL state */</div><div class='add'>+        afr_ta_dom_lock_check_and_release(local-&gt;fop_state, this);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Fail the FOP if post-op did not succeed on quorum no. of bricks. */</div><div class='add'>+    if (!afr_changelog_has_quorum(local, this)) {</div><div class='add'>+        local-&gt;op_ret = -1;</div><div class='add'>+        /*local-&gt;op_errno is already captured in changelog cbk*/</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (local-&gt;transaction.resume_stub) {</div><div class='add'>+        call_resume(local-&gt;transaction.resume_stub);</div><div class='add'>+        local-&gt;transaction.resume_stub = NULL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    int_lock-&gt;lock_cbk = afr_transaction_done;</div><div class='add'>+    afr_unlock(frame, this);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        afr_private_t *priv = NULL;</div><div class='add'>+static void</div><div class='add'>+afr_changelog_post_op_fail(call_frame_t *frame, xlator_t *this, int op_errno)</div><div class='add'>+{</div><div class='add'>+    afr_local_t *local = frame-&gt;local;</div><div class='add'>+    local-&gt;op_ret = -1;</div><div class='add'>+    local-&gt;op_errno = op_errno;</div><div class='ctx'> </div><div class='del'>-        priv = this-&gt;private;</div><div class='add'>+    gf_msg(this-&gt;name, GF_LOG_ERROR, op_errno, AFR_MSG_THIN_ARB,</div><div class='add'>+           "Failing %s for gfid %s. Fop state is:%d", gf_fop_list[local-&gt;op],</div><div class='add'>+           uuid_utoa(local-&gt;inode-&gt;gfid), local-&gt;fop_state);</div><div class='ctx'> </div><div class='del'>-        LOCK (&amp;fd-&gt;lock);</div><div class='del'>-        {</div><div class='del'>-                _ret = __fd_ctx_get (fd, this, &amp;ctx);</div><div class='add'>+    afr_changelog_post_op_done(frame, this);</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-                if (_ret &lt; 0) {</div><div class='del'>-                        goto out;</div><div class='del'>-                }</div><div class='add'>+unsigned char *</div><div class='add'>+afr_locked_nodes_get(afr_transaction_type type, afr_internal_lock_t *int_lock)</div><div class='add'>+{</div><div class='add'>+    /*Because same set of subvols participate in all lockee</div><div class='add'>+     * entities*/</div><div class='add'>+    return int_lock-&gt;lockee[0].locked_nodes;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-                fd_ctx = (afr_fd_ctx_t *)(long) ctx;</div><div class='add'>+int</div><div class='add'>+afr_changelog_call_count(afr_transaction_type type,</div><div class='add'>+                         unsigned char *pre_op_subvols,</div><div class='add'>+                         unsigned char *failed_subvols,</div><div class='add'>+                         unsigned int child_count)</div><div class='add'>+{</div><div class='add'>+    int i = 0;</div><div class='add'>+    int call_count = 0;</div><div class='ctx'> </div><div class='del'>-                for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='del'>-                        if (fd_ctx-&gt;pre_op_done[i] &amp;&amp; child_up[i]) {</div><div class='del'>-                                count++;</div><div class='del'>-                        }</div><div class='del'>-                }</div><div class='add'>+    for (i = 0; i &lt; child_count; i++) {</div><div class='add'>+        if (pre_op_subvols[i] &amp;&amp; !failed_subvols[i]) {</div><div class='add'>+            call_count++;</div><div class='ctx'>         }</div><div class='del'>-out:</div><div class='del'>-        UNLOCK (&amp;fd-&gt;lock);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (type == AFR_ENTRY_RENAME_TRANSACTION)</div><div class='add'>+        call_count *= 2;</div><div class='ctx'> </div><div class='del'>-        return count;</div><div class='add'>+    return call_count;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+gf_boolean_t</div><div class='add'>+afr_txn_nothing_failed(call_frame_t *frame, xlator_t *this)</div><div class='add'>+{</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    int i = 0;</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    if (priv-&gt;thin_arbiter_count) {</div><div class='add'>+        /* We need to perform post-op even if 1 data brick was down</div><div class='add'>+         * before the txn started.*/</div><div class='add'>+        if (AFR_COUNT(local-&gt;transaction.failed_subvols, priv-&gt;child_count))</div><div class='add'>+            return _gf_false;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+        if (local-&gt;transaction.pre_op[i] &amp;&amp;</div><div class='add'>+            local-&gt;transaction.failed_subvols[i])</div><div class='add'>+            return _gf_false;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return _gf_true;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-static int</div><div class='del'>-__changelog_enabled (afr_private_t *priv, afr_transaction_type type)</div><div class='add'>+void</div><div class='add'>+afr_handle_symmetric_errors(call_frame_t *frame, xlator_t *this)</div><div class='ctx'> {</div><div class='del'>-	int ret = 0;</div><div class='add'>+    if (afr_is_symmetric_error(frame, this))</div><div class='add'>+        __mark_all_success(frame, this);</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	switch (type) {</div><div class='del'>-	case AFR_DATA_TRANSACTION:</div><div class='del'>-		if (priv-&gt;data_change_log)</div><div class='del'>-			ret = 1;</div><div class='del'>-		</div><div class='del'>-		break;</div><div class='add'>+gf_boolean_t</div><div class='add'>+afr_has_quorum(unsigned char *subvols, xlator_t *this, call_frame_t *frame)</div><div class='add'>+{</div><div class='add'>+    unsigned int quorum_count = 0;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    unsigned int up_children_count = 0;</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+    up_children_count = AFR_COUNT(subvols, priv-&gt;child_count);</div><div class='add'>+</div><div class='add'>+    if (afr_lookup_has_quorum(frame, up_children_count))</div><div class='add'>+        return _gf_true;</div><div class='add'>+</div><div class='add'>+    if (priv-&gt;quorum_count == AFR_QUORUM_AUTO) {</div><div class='add'>+        /*</div><div class='add'>+         * Special case for auto-quorum with an even number of nodes.</div><div class='add'>+         *</div><div class='add'>+         * A replica set with even count N can only handle the same</div><div class='add'>+         * number of failures as odd N-1 before losing "vanilla"</div><div class='add'>+         * quorum, and the probability of more simultaneous failures is</div><div class='add'>+         * actually higher.  For example, with a 1% chance of failure</div><div class='add'>+         * we'd have a 0.03% chance of two simultaneous failures with</div><div class='add'>+         * N=3 but a 0.06% chance with N=4.  However, the special case</div><div class='add'>+         * is necessary for N=2 because there's no real quorum in that</div><div class='add'>+         * case (i.e. can't normally survive *any* failures).  In that</div><div class='add'>+         * case, we treat the first node as a tie-breaker, allowing</div><div class='add'>+         * quorum to be retained in some cases while still honoring the</div><div class='add'>+         * all-important constraint that there can not simultaneously</div><div class='add'>+         * be two partitioned sets of nodes each believing they have</div><div class='add'>+         * quorum.  Of two equally sized sets, the one without that</div><div class='add'>+         * first node will lose.</div><div class='add'>+         *</div><div class='add'>+         * It turns out that the special case is beneficial for higher</div><div class='add'>+         * values of N as well.  Continuing the example above, the</div><div class='add'>+         * probability of losing quorum with N=4 and this type of</div><div class='add'>+         * quorum is (very) slightly lower than with N=3 and vanilla</div><div class='add'>+         * quorum.  The difference becomes even more pronounced with</div><div class='add'>+         * higher N.  Therefore, even though such replica counts are</div><div class='add'>+         * unlikely to be seen in practice, we might as well use the</div><div class='add'>+         * "special" quorum then as well.</div><div class='add'>+         */</div><div class='add'>+        if ((up_children_count * 2) == priv-&gt;child_count) {</div><div class='add'>+            return subvols[0];</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	case AFR_METADATA_TRANSACTION:</div><div class='del'>-		if (priv-&gt;metadata_change_log)</div><div class='del'>-			ret = 1;</div><div class='add'>+    if (priv-&gt;quorum_count == AFR_QUORUM_AUTO) {</div><div class='add'>+        quorum_count = priv-&gt;child_count / 2 + 1;</div><div class='add'>+    } else {</div><div class='add'>+        quorum_count = priv-&gt;quorum_count;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-		break;</div><div class='add'>+    if (up_children_count &gt;= quorum_count)</div><div class='add'>+        return _gf_true;</div><div class='ctx'> </div><div class='del'>-	case AFR_ENTRY_TRANSACTION:</div><div class='del'>-	case AFR_ENTRY_RENAME_TRANSACTION:</div><div class='del'>-		if (priv-&gt;entry_change_log)</div><div class='del'>-			ret = 1;</div><div class='add'>+    return _gf_false;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-		break;</div><div class='del'>-		</div><div class='del'>-	case AFR_FLUSH_TRANSACTION:</div><div class='del'>-		ret = 1;</div><div class='del'>-	}</div><div class='add'>+static gf_boolean_t</div><div class='add'>+afr_has_fop_quorum(call_frame_t *frame)</div><div class='add'>+{</div><div class='add'>+    xlator_t *this = frame-&gt;this;</div><div class='add'>+    afr_local_t *local = frame-&gt;local;</div><div class='add'>+    unsigned char *locked_nodes = NULL;</div><div class='ctx'> </div><div class='del'>-	return ret;</div><div class='add'>+    locked_nodes = afr_locked_nodes_get(local-&gt;transaction.type,</div><div class='add'>+                                        &amp;local-&gt;internal_lock);</div><div class='add'>+    return afr_has_quorum(locked_nodes, this, NULL);</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='del'>-static int</div><div class='del'>-__changelog_needed_pre_op (call_frame_t *frame, xlator_t *this)</div><div class='add'>+static gf_boolean_t</div><div class='add'>+afr_has_fop_cbk_quorum(call_frame_t *frame)</div><div class='ctx'> {</div><div class='del'>-	afr_private_t * priv  = NULL;</div><div class='del'>-	afr_local_t   * local = NULL;</div><div class='del'>-	fd_t *          fd    = NULL;</div><div class='del'>-</div><div class='del'>-	int op_ret   = 0;</div><div class='add'>+    afr_local_t *local = frame-&gt;local;</div><div class='add'>+    xlator_t *this = frame-&gt;this;</div><div class='add'>+    afr_private_t *priv = this-&gt;private;</div><div class='add'>+    unsigned char *success = alloca0(priv-&gt;child_count);</div><div class='add'>+    int i = 0;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+        if (local-&gt;transaction.pre_op[i])</div><div class='add'>+            if (!local-&gt;transaction.failed_subvols[i])</div><div class='add'>+                success[i] = 1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return afr_has_quorum(success, this, NULL);</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	priv  = this-&gt;private;</div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-	</div><div class='del'>-	if (__changelog_enabled (priv, local-&gt;transaction.type)) {</div><div class='del'>-		switch (local-&gt;op) {</div><div class='add'>+gf_boolean_t</div><div class='add'>+afr_need_dirty_marking(call_frame_t *frame, xlator_t *this)</div><div class='add'>+{</div><div class='add'>+    afr_private_t *priv = this-&gt;private;</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    gf_boolean_t need_dirty = _gf_false;</div><div class='ctx'> </div><div class='del'>-		case GF_FOP_WRITE:</div><div class='del'>-		case GF_FOP_FTRUNCATE:</div><div class='del'>-			/* </div><div class='del'>-			   if it's a data transaction, we write the changelog</div><div class='del'>-			   only on the first write on an fd </div><div class='del'>-			*/</div><div class='del'>-			</div><div class='del'>-			fd = local-&gt;fd;</div><div class='del'>-			if (!fd || __is_first_write_on_fd (this, fd))</div><div class='del'>-				op_ret = 1;</div><div class='add'>+    local = frame-&gt;local;</div><div class='ctx'> </div><div class='del'>-			break;</div><div class='add'>+    if (!priv-&gt;quorum_count || !local-&gt;optimistic_change_log)</div><div class='add'>+        return _gf_false;</div><div class='ctx'> </div><div class='del'>-		case GF_FOP_FLUSH:</div><div class='del'>-			/* only do post-op on flush() */</div><div class='add'>+    if (local-&gt;transaction.type == AFR_DATA_TRANSACTION ||</div><div class='add'>+        local-&gt;transaction.type == AFR_METADATA_TRANSACTION)</div><div class='add'>+        return _gf_false;</div><div class='ctx'> </div><div class='del'>-			op_ret = 0;</div><div class='del'>-			break;</div><div class='add'>+    if (AFR_COUNT(local-&gt;transaction.failed_subvols, priv-&gt;child_count) ==</div><div class='add'>+        priv-&gt;child_count)</div><div class='add'>+        return _gf_false;</div><div class='ctx'> </div><div class='del'>-		default:</div><div class='del'>-			op_ret = 1;</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='add'>+    if (!afr_has_fop_cbk_quorum(frame))</div><div class='add'>+        need_dirty = _gf_true;</div><div class='ctx'> </div><div class='del'>-	return op_ret;</div><div class='add'>+    return need_dirty;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='del'>-static int</div><div class='del'>-__changelog_needed_post_op (call_frame_t *frame, xlator_t *this)</div><div class='add'>+void</div><div class='add'>+afr_handle_quorum(call_frame_t *frame, xlator_t *this)</div><div class='ctx'> {</div><div class='del'>-	afr_private_t * priv  = NULL;</div><div class='del'>-	afr_local_t   * local = NULL;</div><div class='del'>-</div><div class='del'>-	int op_ret = 0;</div><div class='del'>-	afr_transaction_type type = -1;</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    int i = 0;</div><div class='add'>+    const char *file = NULL;</div><div class='add'>+    uuid_t gfid = {0};</div><div class='ctx'> </div><div class='del'>-	priv  = this-&gt;private;</div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-	type  = local-&gt;transaction.type;</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    priv = frame-&gt;this-&gt;private;</div><div class='ctx'> </div><div class='del'>-	if (__changelog_enabled (priv, type)) {</div><div class='del'>-                switch (local-&gt;op) {</div><div class='del'>-</div><div class='del'>-                case GF_FOP_WRITE:</div><div class='del'>-                case GF_FOP_FTRUNCATE:</div><div class='del'>-                        op_ret = 0;</div><div class='del'>-                        break;</div><div class='add'>+    if (priv-&gt;quorum_count == 0)</div><div class='add'>+        return;</div><div class='ctx'> </div><div class='del'>-                case GF_FOP_FLUSH:</div><div class='del'>-                        op_ret = 1;</div><div class='del'>-                        break;</div><div class='add'>+    /* If the fop already failed return right away to preserve errno */</div><div class='add'>+    if (local-&gt;op_ret == -1)</div><div class='add'>+        return;</div><div class='ctx'> </div><div class='del'>-                default:</div><div class='del'>-                        op_ret = 1;</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='add'>+    /*</div><div class='add'>+     * Network split may happen just after the fops are unwound, so check</div><div class='add'>+     * if the fop succeeded in a way it still follows quorum. If it doesn't,</div><div class='add'>+     * mark the fop as failure, mark the changelogs so it reflects that</div><div class='add'>+     * failure.</div><div class='add'>+     *</div><div class='add'>+     * Scenario:</div><div class='add'>+     * There are 3 mounts on 3 machines(node1, node2, node3) all writing to</div><div class='add'>+     * single file. Network split happened in a way that node1 can't see</div><div class='add'>+     * node2, node3. Node2, node3 both of them can't see node1. Now at the</div><div class='add'>+     * time of sending write all the bricks are up. Just after write fop is</div><div class='add'>+     * wound on node1, network split happens. Node1 thinks write fop failed</div><div class='add'>+     * on node2, node3 so marks pending changelog for those 2 extended</div><div class='add'>+     * attributes on node1. Node2, node3 thinks writes failed on node1 so</div><div class='add'>+     * they mark pending changelog for node1. When the network is stable</div><div class='add'>+     * again the file already is in split-brain. These checks prevent</div><div class='add'>+     * marking pending changelog on other subvolumes if the fop doesn't</div><div class='add'>+     * succeed in a way it is still following quorum. So with this fix what</div><div class='add'>+     * is happening is, node1 will have all pending changelog(FOOL) because</div><div class='add'>+     * the write succeeded only on node1 but failed on node2, node3 so</div><div class='add'>+     * instead of marking pending changelogs on node2, node3 it just treats</div><div class='add'>+     * the fop as failure and goes into DIRTY state. Where as node2, node3</div><div class='add'>+     * say they are sources and have pending changelog to node1 so there is</div><div class='add'>+     * no split-brain with the fix. The problem is eliminated completely.</div><div class='add'>+     */</div><div class='add'>+</div><div class='add'>+    if (afr_has_fop_cbk_quorum(frame))</div><div class='add'>+        return;</div><div class='ctx'> </div><div class='del'>-	return op_ret;</div><div class='add'>+    if (afr_need_dirty_marking(frame, this))</div><div class='add'>+        goto set_response;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+        if (local-&gt;transaction.pre_op[i])</div><div class='add'>+            afr_transaction_fop_failed(frame, frame-&gt;this, i);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+set_response:</div><div class='add'>+    local-&gt;op_ret = -1;</div><div class='add'>+    local-&gt;op_errno = afr_final_errno(local, priv);</div><div class='add'>+    if (local-&gt;op_errno == 0)</div><div class='add'>+        local-&gt;op_errno = afr_quorum_errno(priv);</div><div class='add'>+</div><div class='add'>+    if (local-&gt;fd) {</div><div class='add'>+        gf_uuid_copy(gfid, local-&gt;fd-&gt;inode-&gt;gfid);</div><div class='add'>+        file = uuid_utoa(gfid);</div><div class='add'>+    } else {</div><div class='add'>+        loc_path(&amp;local-&gt;loc, local-&gt;loc.name);</div><div class='add'>+        file = local-&gt;loc.path;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    gf_msg(frame-&gt;this-&gt;name, GF_LOG_WARNING, local-&gt;op_errno,</div><div class='add'>+           AFR_MSG_QUORUM_FAIL, "%s: Failing %s as quorum is not met", file,</div><div class='add'>+           gf_fop_list[local-&gt;op]);</div><div class='add'>+</div><div class='add'>+    switch (local-&gt;transaction.type) {</div><div class='add'>+        case AFR_ENTRY_TRANSACTION:</div><div class='add'>+        case AFR_ENTRY_RENAME_TRANSACTION:</div><div class='add'>+            afr_pick_error_xdata(local, priv, local-&gt;parent, local-&gt;readable,</div><div class='add'>+                                 local-&gt;parent2, local-&gt;readable2);</div><div class='add'>+            break;</div><div class='add'>+        default:</div><div class='add'>+            afr_pick_error_xdata(local, priv, local-&gt;inode, local-&gt;readable,</div><div class='add'>+                                 NULL, NULL);</div><div class='add'>+            break;</div><div class='add'>+    }</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+int</div><div class='add'>+afr_fill_ta_loc(xlator_t *this, loc_t *loc, gf_boolean_t is_gfid_based_fop)</div><div class='add'>+{</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+    loc-&gt;parent = inode_ref(priv-&gt;root_inode);</div><div class='add'>+    gf_uuid_copy(loc-&gt;pargfid, loc-&gt;parent-&gt;gfid);</div><div class='add'>+    loc-&gt;name = priv-&gt;pending_key[THIN_ARBITER_BRICK_INDEX];</div><div class='add'>+    if (is_gfid_based_fop &amp;&amp; gf_uuid_is_null(priv-&gt;ta_gfid)) {</div><div class='add'>+        /* Except afr_ta_id_file_check() which is path based, all other gluster</div><div class='add'>+         * FOPS need gfid.*/</div><div class='add'>+        return -EINVAL;</div><div class='add'>+    }</div><div class='add'>+    gf_uuid_copy(loc-&gt;gfid, priv-&gt;ta_gfid);</div><div class='add'>+    loc-&gt;inode = inode_new(loc-&gt;parent-&gt;table);</div><div class='add'>+    if (!loc-&gt;inode) {</div><div class='add'>+        loc_wipe(loc);</div><div class='add'>+        return -ENOMEM;</div><div class='add'>+    }</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> static int</div><div class='del'>-afr_set_pending_dict (afr_private_t *priv, dict_t *xattr, int32_t **pending)</div><div class='add'>+afr_ta_post_op_done(int ret, call_frame_t *frame, void *opaque)</div><div class='ctx'> {</div><div class='del'>-        int i;</div><div class='del'>-        int ret = 0;</div><div class='add'>+    xlator_t *this = NULL;</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    call_frame_t *txn_frame = NULL;</div><div class='add'>+    afr_ta_fop_state_t fop_state;</div><div class='add'>+</div><div class='add'>+    local = (afr_local_t *)opaque;</div><div class='add'>+    fop_state = local-&gt;fop_state;</div><div class='add'>+    txn_frame = local-&gt;transaction.frame;</div><div class='add'>+    this = frame-&gt;this;</div><div class='add'>+</div><div class='add'>+    if (ret == 0) {</div><div class='add'>+        /*Mark pending xattrs on the up data brick.*/</div><div class='add'>+        afr_post_op_handle_success(txn_frame, this);</div><div class='add'>+    } else {</div><div class='add'>+        afr_post_op_handle_failure(txn_frame, this, -ret);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    STACK_DESTROY(frame-&gt;root);</div><div class='add'>+    afr_ta_process_onwireq(fop_state, this);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='add'>+int **</div><div class='add'>+afr_set_changelog_xattr(afr_private_t *priv, unsigned char *pending,</div><div class='add'>+                        dict_t *xattr, afr_local_t *local)</div><div class='add'>+{</div><div class='add'>+    int **changelog = NULL;</div><div class='add'>+    int idx = 0;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    int i;</div><div class='add'>+</div><div class='add'>+    if (local-&gt;is_new_entry == _gf_true) {</div><div class='add'>+        changelog = afr_mark_pending_changelog(priv, pending, xattr,</div><div class='add'>+                                               local-&gt;cont.dir_fop.buf.ia_type);</div><div class='add'>+    } else {</div><div class='add'>+        idx = afr_index_for_transaction_type(local-&gt;transaction.type);</div><div class='add'>+        changelog = afr_matrix_create(priv-&gt;child_count, AFR_NUM_CHANGE_LOGS);</div><div class='add'>+        if (!changelog) {</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='ctx'>         for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='del'>-                ret = dict_set_static_bin (xattr, priv-&gt;pending_key[i],</div><div class='del'>-                                           pending[i], 3 * sizeof (int32_t));</div><div class='del'>-                /* 3 = data+metadata+entry */</div><div class='del'>-                </div><div class='del'>-                if (ret &lt; 0)</div><div class='del'>-                        goto out;</div><div class='add'>+            if (local-&gt;transaction.failed_subvols[i])</div><div class='add'>+                changelog[i][idx] = hton32(1);</div><div class='add'>+        }</div><div class='add'>+        ret = afr_set_pending_dict(priv, xattr, changelog);</div><div class='add'>+        if (ret &lt; 0) {</div><div class='add'>+            afr_matrix_cleanup(changelog, priv-&gt;child_count);</div><div class='add'>+            return NULL;</div><div class='ctx'>         }</div><div class='add'>+    }</div><div class='ctx'> </div><div class='ctx'> out:</div><div class='del'>-        return ret;</div><div class='add'>+    return changelog;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+static void</div><div class='add'>+afr_ta_locked_xattrop_validate(afr_private_t *priv, afr_local_t *local,</div><div class='add'>+                               gf_boolean_t *valid)</div><div class='add'>+{</div><div class='add'>+    if (priv-&gt;ta_event_gen &gt; local-&gt;ta_event_gen) {</div><div class='add'>+        /* We can't trust the ta's response anymore.*/</div><div class='add'>+        afr_ta_locked_priv_invalidate(priv);</div><div class='add'>+        *valid = _gf_false;</div><div class='add'>+        return;</div><div class='add'>+    }</div><div class='add'>+    return;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-afr_lock_server_count (afr_private_t *priv, afr_transaction_type type)</div><div class='add'>+static int</div><div class='add'>+afr_ta_post_op_do(void *opaque)</div><div class='ctx'> {</div><div class='del'>-	int ret = 0;</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    xlator_t *this = NULL;</div><div class='add'>+    dict_t *xattr = NULL;</div><div class='add'>+    unsigned char *pending = NULL;</div><div class='add'>+    int **changelog = NULL;</div><div class='add'>+    int failed_subvol = -1;</div><div class='add'>+    int success_subvol = -1;</div><div class='add'>+    loc_t loc = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int i = 0;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    gf_boolean_t valid = _gf_true;</div><div class='add'>+</div><div class='add'>+    local = (afr_local_t *)opaque;</div><div class='add'>+    this = local-&gt;transaction.frame-&gt;this;</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    ret = afr_fill_ta_loc(this, &amp;loc, _gf_true);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_ERROR, -ret, AFR_MSG_THIN_ARB,</div><div class='add'>+               "Failed to populate loc for thin-arbiter.");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    xattr = dict_new();</div><div class='add'>+    if (!xattr) {</div><div class='add'>+        ret = -ENOMEM;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    pending = alloca0(priv-&gt;child_count);</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+        if (local-&gt;transaction.failed_subvols[i]) {</div><div class='add'>+            pending[i] = 1;</div><div class='add'>+            failed_subvol = i;</div><div class='add'>+        } else {</div><div class='add'>+            success_subvol = i;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    changelog = afr_set_changelog_xattr(priv, pending, xattr, local);</div><div class='add'>+</div><div class='add'>+    if (!changelog) {</div><div class='add'>+        ret = -ENOMEM;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = afr_ta_post_op_lock(this, &amp;loc);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    ret = syncop_xattrop(priv-&gt;children[THIN_ARBITER_BRICK_INDEX], &amp;loc,</div><div class='add'>+                         GF_XATTROP_ADD_ARRAY, xattr, NULL, NULL, NULL);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_ERROR, -ret, AFR_MSG_THIN_ARB,</div><div class='add'>+               "Post-op on thin-arbiter id file %s failed for gfid %s.",</div><div class='add'>+               priv-&gt;pending_key[THIN_ARBITER_BRICK_INDEX],</div><div class='add'>+               uuid_utoa(local-&gt;inode-&gt;gfid));</div><div class='add'>+    }</div><div class='add'>+    LOCK(&amp;priv-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        if (ret == 0) {</div><div class='add'>+            priv-&gt;ta_bad_child_index = failed_subvol;</div><div class='add'>+        } else if (ret == -EINVAL) {</div><div class='add'>+            priv-&gt;ta_bad_child_index = success_subvol;</div><div class='add'>+            ret = -EIO; /* TA failed the fop. Return EIO to application. */</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-	switch (type) {</div><div class='del'>-	case AFR_FLUSH_TRANSACTION:</div><div class='del'>-	case AFR_DATA_TRANSACTION:</div><div class='del'>-		ret = priv-&gt;child_count;</div><div class='del'>-		break;</div><div class='add'>+        afr_ta_locked_xattrop_validate(priv, local, &amp;valid);</div><div class='add'>+    }</div><div class='add'>+    UNLOCK(&amp;priv-&gt;lock);</div><div class='add'>+    if (valid == _gf_false) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_ERROR, EIO, AFR_MSG_THIN_ARB,</div><div class='add'>+               "Post-op on thin-arbiter id file %s for gfid %s invalidated due "</div><div class='add'>+               "to event-gen mismatch.",</div><div class='add'>+               priv-&gt;pending_key[THIN_ARBITER_BRICK_INDEX],</div><div class='add'>+               uuid_utoa(local-&gt;inode-&gt;gfid));</div><div class='add'>+        ret = -EIO;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    afr_ta_post_op_unlock(this, &amp;loc);</div><div class='add'>+out:</div><div class='add'>+    if (xattr)</div><div class='add'>+        dict_unref(xattr);</div><div class='ctx'> </div><div class='del'>-	case AFR_METADATA_TRANSACTION:</div><div class='del'>-		ret = priv-&gt;child_count;</div><div class='del'>-		break;</div><div class='add'>+    if (changelog)</div><div class='add'>+        afr_matrix_cleanup(changelog, priv-&gt;child_count);</div><div class='ctx'> </div><div class='del'>-	case AFR_ENTRY_TRANSACTION:</div><div class='del'>-	case AFR_ENTRY_RENAME_TRANSACTION:</div><div class='del'>-		ret = priv-&gt;child_count;</div><div class='del'>-		break;</div><div class='del'>-	}</div><div class='add'>+    loc_wipe(&amp;loc);</div><div class='ctx'> </div><div class='del'>-	return ret;</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-/* {{{ pending */</div><div class='add'>+static int</div><div class='add'>+afr_ta_post_op_synctask(xlator_t *this, afr_local_t *local)</div><div class='add'>+{</div><div class='add'>+    call_frame_t *ta_frame = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    ta_frame = afr_ta_frame_create(this);</div><div class='add'>+    if (!ta_frame) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_ERROR, ENOMEM, AFR_MSG_THIN_ARB,</div><div class='add'>+               "Failed to create ta_frame");</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+    ret = synctask_new(this-&gt;ctx-&gt;env, afr_ta_post_op_do, afr_ta_post_op_done,</div><div class='add'>+                       ta_frame, local);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_ERROR, ENOMEM, AFR_MSG_THIN_ARB,</div><div class='add'>+               "Failed to launch post-op on thin arbiter for gfid %s",</div><div class='add'>+               uuid_utoa(local-&gt;inode-&gt;gfid));</div><div class='add'>+        STACK_DESTROY(ta_frame-&gt;root);</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+err:</div><div class='add'>+    afr_changelog_post_op_fail(local-&gt;transaction.frame, this, ENOMEM);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-int32_t</div><div class='del'>-afr_changelog_post_op_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-			   int32_t op_ret, int32_t op_errno, dict_t *xattr)</div><div class='add'>+static void</div><div class='add'>+afr_ta_set_fop_state(afr_private_t *priv, afr_local_t *local,</div><div class='add'>+                     int *on_wire_count)</div><div class='ctx'> {</div><div class='del'>-        afr_internal_lock_t *int_lock = NULL;</div><div class='del'>-	afr_private_t       *priv     = NULL;</div><div class='del'>-	afr_local_t         *local    = NULL;</div><div class='add'>+    LOCK(&amp;priv-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        if (priv-&gt;release_ta_notify_dom_lock == _gf_true) {</div><div class='add'>+            /* Put the fop in waitq until notify dom lock is released.*/</div><div class='add'>+            local-&gt;fop_state = TA_WAIT_FOR_NOTIFY_LOCK_REL;</div><div class='add'>+            list_add_tail(&amp;local-&gt;ta_waitq, &amp;priv-&gt;ta_waitq);</div><div class='add'>+        } else if (priv-&gt;ta_bad_child_index == AFR_CHILD_UNKNOWN) {</div><div class='add'>+            /* Post-op on thin-arbiter to decide success/failure. */</div><div class='add'>+            local-&gt;fop_state = TA_GET_INFO_FROM_TA_FILE;</div><div class='add'>+            *on_wire_count = ++priv-&gt;ta_on_wire_txn_count;</div><div class='add'>+            if (*on_wire_count &gt; 1) {</div><div class='add'>+                /*Avoid sending multiple on-wire post-ops on TA*/</div><div class='add'>+                list_add_tail(&amp;local-&gt;ta_onwireq, &amp;priv-&gt;ta_onwireq);</div><div class='add'>+            }</div><div class='add'>+        } else if (local-&gt;ta_failed_subvol == priv-&gt;ta_bad_child_index) {</div><div class='add'>+            /* Post-op on TA not needed as the fop failed on the in-memory bad</div><div class='add'>+             * brick. Just mark pending xattrs on the good data brick.*/</div><div class='add'>+            local-&gt;fop_state = TA_INFO_IN_MEMORY_SUCCESS;</div><div class='add'>+            priv-&gt;ta_in_mem_txn_count++;</div><div class='add'>+        } else {</div><div class='add'>+            /* Post-op on TA not needed as the fop succeeded only on the</div><div class='add'>+             * in-memory bad data brick and not the good one. Fail the fop.*/</div><div class='add'>+            local-&gt;fop_state = TA_INFO_IN_MEMORY_FAILED;</div><div class='add'>+            priv-&gt;ta_in_mem_txn_count++;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    UNLOCK(&amp;priv-&gt;lock);</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	int call_count = -1;</div><div class='add'>+static void</div><div class='add'>+afr_ta_fill_failed_subvol(afr_private_t *priv, afr_local_t *local)</div><div class='add'>+{</div><div class='add'>+    int i = 0;</div><div class='ctx'> </div><div class='del'>-        int (*post_post_op) (call_frame_t *, xlator_t *);</div><div class='add'>+    for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+        if (local-&gt;transaction.failed_subvols[i]) {</div><div class='add'>+            local-&gt;ta_failed_subvol = i;</div><div class='add'>+            break;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	priv     = this-&gt;private;</div><div class='del'>-	local    = frame-&gt;local;</div><div class='del'>-        int_lock = &amp;local-&gt;internal_lock;</div><div class='add'>+static void</div><div class='add'>+afr_post_op_handle_success(call_frame_t *frame, xlator_t *this)</div><div class='add'>+{</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='ctx'> </div><div class='del'>-	LOCK (&amp;frame-&gt;lock);</div><div class='del'>-	{</div><div class='del'>-		call_count = --local-&gt;call_count;</div><div class='del'>-	}</div><div class='del'>-	UNLOCK (&amp;frame-&gt;lock);</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    if (local-&gt;is_new_entry == _gf_true) {</div><div class='add'>+        afr_mark_new_entry_changelog(frame, this);</div><div class='add'>+    }</div><div class='add'>+    afr_changelog_post_op_do(frame, this);</div><div class='ctx'> </div><div class='del'>-	if (call_count == 0) {</div><div class='del'>-                if (local-&gt;transaction.post_post_op) {</div><div class='del'>-                        post_post_op = local-&gt;transaction.post_post_op;</div><div class='add'>+    return;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-                        if (afr_lock_server_count (priv, local-&gt;transaction.type) == 0) {</div><div class='del'>-                                local-&gt;transaction.post_post_op = local-&gt;transaction.done;</div><div class='del'>-                        } else {</div><div class='del'>-                                int_lock-&gt;lock_cbk = local-&gt;transaction.done;</div><div class='del'>-                                local-&gt;transaction.post_post_op = afr_unlock;</div><div class='del'>-                        }</div><div class='add'>+static void</div><div class='add'>+afr_post_op_handle_failure(call_frame_t *frame, xlator_t *this, int op_errno)</div><div class='add'>+{</div><div class='add'>+    afr_changelog_post_op_fail(frame, this, op_errno);</div><div class='ctx'> </div><div class='del'>-                        post_post_op (frame, this);</div><div class='del'>-                } else {</div><div class='del'>-                        if (afr_lock_server_count (priv, local-&gt;transaction.type) == 0) {</div><div class='del'>-                                local-&gt;transaction.done (frame, this);</div><div class='del'>-                        } else {</div><div class='del'>-                                int_lock-&gt;lock_cbk = local-&gt;transaction.done;</div><div class='del'>-                                afr_unlock (frame, this);</div><div class='del'>-                        }</div><div class='del'>-                }</div><div class='del'>-	}</div><div class='add'>+    return;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	return 0;	</div><div class='add'>+static void</div><div class='add'>+afr_ta_decide_post_op_state(call_frame_t *frame, xlator_t *this)</div><div class='add'>+{</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    int on_wire_count = 0;</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+</div><div class='add'>+    afr_ta_set_fop_state(priv, local, &amp;on_wire_count);</div><div class='add'>+</div><div class='add'>+    switch (local-&gt;fop_state) {</div><div class='add'>+        case TA_GET_INFO_FROM_TA_FILE:</div><div class='add'>+            if (on_wire_count == 1)</div><div class='add'>+                afr_ta_post_op_synctask(this, local);</div><div class='add'>+            /*else, fop is queued in ta_onwireq.*/</div><div class='add'>+            break;</div><div class='add'>+        case TA_WAIT_FOR_NOTIFY_LOCK_REL:</div><div class='add'>+            /*Post releasing the notify lock, we will act on this queue*/</div><div class='add'>+            break;</div><div class='add'>+        case TA_INFO_IN_MEMORY_SUCCESS:</div><div class='add'>+            afr_post_op_handle_success(frame, this);</div><div class='add'>+            break;</div><div class='add'>+        case TA_INFO_IN_MEMORY_FAILED:</div><div class='add'>+            afr_post_op_handle_failure(frame, this, EIO);</div><div class='add'>+            break;</div><div class='add'>+        default:</div><div class='add'>+            break;</div><div class='add'>+    }</div><div class='add'>+    return;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+static void</div><div class='add'>+afr_handle_failure_using_thin_arbiter(call_frame_t *frame, xlator_t *this)</div><div class='add'>+{</div><div class='add'>+    afr_private_t *priv = this-&gt;private;</div><div class='add'>+    afr_local_t *local = frame-&gt;local;</div><div class='add'>+</div><div class='add'>+    afr_ta_fill_failed_subvol(priv, local);</div><div class='add'>+    gf_msg_debug(this-&gt;name, 0,</div><div class='add'>+                 "Fop failed on data brick (%s) for gfid=%s. "</div><div class='add'>+                 "ta info needed to decide fop result.",</div><div class='add'>+                 priv-&gt;children[local-&gt;ta_failed_subvol]-&gt;name,</div><div class='add'>+                 uuid_utoa(local-&gt;inode-&gt;gfid));</div><div class='add'>+    afr_ta_decide_post_op_state(frame, this);</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-int </div><div class='del'>-afr_changelog_post_op (call_frame_t *frame, xlator_t *this)</div><div class='add'>+void</div><div class='add'>+afr_changelog_post_op_do(call_frame_t *frame, xlator_t *this)</div><div class='ctx'> {</div><div class='del'>-	afr_private_t * priv = this-&gt;private;</div><div class='del'>-        afr_internal_lock_t *int_lock = NULL;</div><div class='del'>-	int ret        = 0;</div><div class='del'>-	int i          = 0;				</div><div class='del'>-	int call_count = 0;</div><div class='del'>-	</div><div class='del'>-	afr_local_t *  local = NULL;	</div><div class='del'>-	dict_t        **xattr = NULL;</div><div class='add'>+    afr_private_t *priv = this-&gt;private;</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    dict_t *xattr = NULL;</div><div class='add'>+    int i = 0;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    int idx = 0;</div><div class='add'>+    int nothing_failed = 1;</div><div class='add'>+    gf_boolean_t need_undirty = _gf_false;</div><div class='add'>+</div><div class='add'>+    afr_handle_quorum(frame, this);</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    idx = afr_index_for_transaction_type(local-&gt;transaction.type);</div><div class='add'>+</div><div class='add'>+    xattr = dict_new();</div><div class='add'>+    if (!xattr) {</div><div class='add'>+        afr_changelog_post_op_fail(frame, this, ENOMEM);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    nothing_failed = afr_txn_nothing_failed(frame, this);</div><div class='add'>+</div><div class='add'>+    if (afr_changelog_pre_op_uninherit(frame, this))</div><div class='add'>+        need_undirty = _gf_false;</div><div class='add'>+    else</div><div class='add'>+        need_undirty = _gf_true;</div><div class='add'>+</div><div class='add'>+    if (local-&gt;op_ret &lt; 0 &amp;&amp; !nothing_failed) {</div><div class='add'>+        if (afr_need_dirty_marking(frame, this)) {</div><div class='add'>+            local-&gt;dirty[idx] = hton32(1);</div><div class='add'>+            goto set_dirty;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-	local    = frame-&gt;local;</div><div class='del'>-        int_lock = &amp;local-&gt;internal_lock;</div><div class='add'>+        afr_changelog_post_op_done(frame, this);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (nothing_failed &amp;&amp; !need_undirty) {</div><div class='add'>+        afr_changelog_post_op_done(frame, this);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (local-&gt;transaction.in_flight_sb) {</div><div class='add'>+        afr_changelog_post_op_fail(frame, this,</div><div class='add'>+                                   local-&gt;transaction.in_flight_sb_errno);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+        if (local-&gt;transaction.failed_subvols[i])</div><div class='add'>+            local-&gt;pending[i][idx] = hton32(1);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = afr_set_pending_dict(priv, xattr, local-&gt;pending);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        afr_changelog_post_op_fail(frame, this, ENOMEM);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (need_undirty)</div><div class='add'>+        local-&gt;dirty[idx] = hton32(-1);</div><div class='add'>+    else</div><div class='add'>+        local-&gt;dirty[idx] = hton32(0);</div><div class='add'>+</div><div class='add'>+set_dirty:</div><div class='add'>+    ret = dict_set_static_bin(xattr, AFR_DIRTY, local-&gt;dirty,</div><div class='add'>+                              sizeof(int) * AFR_NUM_CHANGE_LOGS);</div><div class='add'>+    if (ret) {</div><div class='add'>+        afr_changelog_post_op_fail(frame, this, ENOMEM);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    afr_changelog_do(frame, this, xattr, afr_changelog_post_op_done,</div><div class='add'>+                     AFR_TRANSACTION_POST_OP);</div><div class='add'>+out:</div><div class='add'>+    if (xattr)</div><div class='add'>+        dict_unref(xattr);</div><div class='add'>+</div><div class='add'>+    return;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	__mark_down_children (local-&gt;pending, priv-&gt;child_count, </div><div class='del'>-                              local-&gt;child_up, local-&gt;transaction.type);</div><div class='del'>-        </div><div class='del'>-        if (local-&gt;op == GF_FOP_FLUSH) {</div><div class='del'>-                __mark_failed_children (local-&gt;pending, priv-&gt;child_count,</div><div class='del'>-                                        this, local-&gt;fd,</div><div class='del'>-                                        local-&gt;transaction.type);</div><div class='add'>+static int</div><div class='add'>+afr_changelog_post_op_now(call_frame_t *frame, xlator_t *this)</div><div class='add'>+{</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    int failed_count = 0;</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+</div><div class='add'>+    if (priv-&gt;thin_arbiter_count) {</div><div class='add'>+        failed_count = AFR_COUNT(local-&gt;transaction.failed_subvols,</div><div class='add'>+                                 priv-&gt;child_count);</div><div class='add'>+        if (failed_count == 1) {</div><div class='add'>+            afr_handle_failure_using_thin_arbiter(frame, this);</div><div class='add'>+            return 0;</div><div class='add'>+        } else {</div><div class='add'>+            /* Txn either succeeded or failed on both data bricks. Let</div><div class='add'>+             * post_op_do handle it as the case might be. */</div><div class='ctx'>         }</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        xattr = alloca (priv-&gt;child_count * sizeof (*xattr));</div><div class='del'>-        memset (xattr, 0, (priv-&gt;child_count * sizeof (*xattr)));</div><div class='del'>-	for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='del'>-                xattr[i] = get_new_dict ();</div><div class='del'>-                dict_ref (xattr[i]);</div><div class='add'>+    afr_changelog_post_op_do(frame, this);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+gf_boolean_t</div><div class='add'>+afr_changelog_pre_op_uninherit(call_frame_t *frame, xlator_t *this)</div><div class='add'>+{</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    afr_inode_ctx_t *ctx = NULL;</div><div class='add'>+    int i = 0;</div><div class='add'>+    gf_boolean_t ret = _gf_false;</div><div class='add'>+    int type = 0;</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+    ctx = local-&gt;inode_ctx;</div><div class='add'>+</div><div class='add'>+    type = afr_index_for_transaction_type(local-&gt;transaction.type);</div><div class='add'>+    if (type != AFR_DATA_TRANSACTION)</div><div class='add'>+        return !local-&gt;transaction.dirtied;</div><div class='add'>+</div><div class='add'>+    if (local-&gt;transaction.no_uninherit)</div><div class='add'>+        return _gf_false;</div><div class='add'>+</div><div class='add'>+    /* This function must be idempotent. So check if we</div><div class='add'>+       were called before and return the same answer again.</div><div class='add'>+</div><div class='add'>+       It is important to keep this function idempotent for</div><div class='add'>+       the call in afr_changelog_post_op_safe() to not have</div><div class='add'>+       side effects on the call from afr_changelog_post_op_now()</div><div class='add'>+    */</div><div class='add'>+    if (local-&gt;transaction.uninherit_done)</div><div class='add'>+        return local-&gt;transaction.uninherit_value;</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;local-&gt;inode-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+            if (local-&gt;transaction.pre_op[i] != ctx-&gt;pre_op_done[type][i]) {</div><div class='add'>+                ret = !local-&gt;transaction.dirtied;</div><div class='add'>+                goto unlock;</div><div class='add'>+            }</div><div class='ctx'>         }</div><div class='ctx'> </div><div class='del'>-        if (local-&gt;op == GF_FOP_FLUSH) {</div><div class='del'>-                call_count = afr_pre_op_done_count (this, local-&gt;fd, local-&gt;child_up);</div><div class='add'>+        if (ctx-&gt;inherited[type]) {</div><div class='add'>+            ret = _gf_true;</div><div class='add'>+            ctx-&gt;inherited[type]--;</div><div class='add'>+        } else if (ctx-&gt;on_disk[type]) {</div><div class='add'>+            ret = _gf_false;</div><div class='add'>+            ctx-&gt;on_disk[type]--;</div><div class='ctx'>         } else {</div><div class='del'>-                call_count = afr_up_children_count (priv-&gt;child_count, local-&gt;child_up); </div><div class='add'>+            /* ASSERT */</div><div class='add'>+            ret = _gf_false;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-                if (local-&gt;transaction.type == AFR_ENTRY_RENAME_TRANSACTION) {</div><div class='del'>-                        call_count *= 2;</div><div class='del'>-                }</div><div class='add'>+        if (!ctx-&gt;inherited[type] &amp;&amp; !ctx-&gt;on_disk[type]) {</div><div class='add'>+            for (i = 0; i &lt; priv-&gt;child_count; i++)</div><div class='add'>+                ctx-&gt;pre_op_done[type][i] = 0;</div><div class='ctx'>         }</div><div class='add'>+    }</div><div class='add'>+unlock:</div><div class='add'>+    UNLOCK(&amp;local-&gt;inode-&gt;lock);</div><div class='ctx'> </div><div class='del'>-	local-&gt;call_count = call_count;		</div><div class='add'>+    local-&gt;transaction.uninherit_done = _gf_true;</div><div class='add'>+    local-&gt;transaction.uninherit_value = ret;</div><div class='ctx'> </div><div class='del'>-	if (call_count == 0) {</div><div class='del'>-		/* no child is up */</div><div class='del'>-                for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='del'>-                        dict_unref (xattr[i]);</div><div class='del'>-                }</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-                int_lock-&gt;lock_cbk = local-&gt;transaction.done;</div><div class='del'>-		afr_unlock (frame, this);</div><div class='del'>-		return 0;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='del'>-		if (local-&gt;child_up[i]) {</div><div class='del'>-                        ret = afr_set_pending_dict (priv, xattr[i], </div><div class='del'>-                                                    local-&gt;pending);</div><div class='del'>-</div><div class='del'>-			if (ret &lt; 0)</div><div class='del'>-				gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-					"failed to set pending entry");</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-			switch (local-&gt;transaction.type) {</div><div class='del'>-			case AFR_DATA_TRANSACTION:</div><div class='del'>-			case AFR_METADATA_TRANSACTION:</div><div class='del'>-			{</div><div class='del'>-				if (local-&gt;fd)</div><div class='del'>-					STACK_WIND (frame, afr_changelog_post_op_cbk,</div><div class='del'>-						    priv-&gt;children[i],</div><div class='del'>-						    priv-&gt;children[i]-&gt;fops-&gt;fxattrop,</div><div class='del'>-						    local-&gt;fd,</div><div class='del'>-						    GF_XATTROP_ADD_ARRAY, xattr[i]);</div><div class='del'>-				else</div><div class='del'>-					STACK_WIND (frame, afr_changelog_post_op_cbk,</div><div class='del'>-						    priv-&gt;children[i],</div><div class='del'>-						    priv-&gt;children[i]-&gt;fops-&gt;xattrop,</div><div class='del'>-						    &amp;local-&gt;loc,</div><div class='del'>-						    GF_XATTROP_ADD_ARRAY, xattr[i]);</div><div class='del'>-                                call_count--;</div><div class='del'>-			}</div><div class='del'>-			break;</div><div class='del'>-</div><div class='del'>-			case AFR_FLUSH_TRANSACTION:</div><div class='del'>-			{</div><div class='del'>-				if (__if_fd_pre_op_done (this, local-&gt;fd, i)) {</div><div class='del'>-					STACK_WIND (frame, afr_changelog_post_op_cbk,</div><div class='del'>-						    priv-&gt;children[i], </div><div class='del'>-						    priv-&gt;children[i]-&gt;fops-&gt;fxattrop,</div><div class='del'>-						    local-&gt;fd,</div><div class='del'>-						    GF_XATTROP_ADD_ARRAY, xattr[i]);</div><div class='del'>-                                        call_count--;</div><div class='del'>-                                }</div><div class='del'>-			}</div><div class='del'>-			break;</div><div class='del'>-</div><div class='del'>-			case AFR_ENTRY_RENAME_TRANSACTION:</div><div class='del'>-			{</div><div class='del'>-				STACK_WIND_COOKIE (frame, afr_changelog_post_op_cbk,</div><div class='del'>-						   (void *) (long) i,</div><div class='del'>-						   priv-&gt;children[i],</div><div class='del'>-						   priv-&gt;children[i]-&gt;fops-&gt;xattrop,</div><div class='del'>-						   &amp;local-&gt;transaction.new_parent_loc,</div><div class='del'>-						   GF_XATTROP_ADD_ARRAY, xattr[i]);</div><div class='del'>-				</div><div class='del'>-				call_count--;</div><div class='del'>-			}</div><div class='del'>-</div><div class='del'>-			/* </div><div class='del'>-			   set it again because previous stack_wind</div><div class='del'>-			   might have already returned (think of case</div><div class='del'>-			   where subvolume is posix) and would have</div><div class='del'>-			   used the dict as placeholder for return</div><div class='del'>-			   value</div><div class='del'>-			*/</div><div class='del'>-                        </div><div class='del'>-			ret = afr_set_pending_dict (priv, xattr[i], </div><div class='del'>-                                                    local-&gt;pending);</div><div class='del'>-</div><div class='del'>-			if (ret &lt; 0)</div><div class='del'>-				gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-					"failed to set pending entry");</div><div class='del'>-</div><div class='del'>-			/* fall through */</div><div class='del'>-</div><div class='del'>-			case AFR_ENTRY_TRANSACTION:</div><div class='del'>-			{</div><div class='del'>-				if (local-&gt;fd)</div><div class='del'>-					STACK_WIND (frame, afr_changelog_post_op_cbk,</div><div class='del'>-						    priv-&gt;children[i], </div><div class='del'>-						    priv-&gt;children[i]-&gt;fops-&gt;fxattrop,</div><div class='del'>-						    local-&gt;fd, </div><div class='del'>-						    GF_XATTROP_ADD_ARRAY, xattr[i]);</div><div class='del'>-				else </div><div class='del'>-					STACK_WIND (frame, afr_changelog_post_op_cbk,</div><div class='del'>-						    priv-&gt;children[i], </div><div class='del'>-						    priv-&gt;children[i]-&gt;fops-&gt;xattrop,</div><div class='del'>-						    &amp;local-&gt;transaction.parent_loc, </div><div class='del'>-						    GF_XATTROP_ADD_ARRAY, xattr[i]);</div><div class='del'>-                                call_count--;</div><div class='del'>-			}</div><div class='del'>-			break;</div><div class='del'>-			}</div><div class='del'>-</div><div class='del'>-			if (!call_count)</div><div class='del'>-				break;</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='add'>+gf_boolean_t</div><div class='add'>+afr_changelog_pre_op_inherit(call_frame_t *frame, xlator_t *this)</div><div class='add'>+{</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    int i = 0;</div><div class='add'>+    gf_boolean_t ret = _gf_false;</div><div class='add'>+    int type = 0;</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    if (local-&gt;transaction.type != AFR_DATA_TRANSACTION)</div><div class='add'>+        return _gf_false;</div><div class='add'>+</div><div class='add'>+    type = afr_index_for_transaction_type(local-&gt;transaction.type);</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;local-&gt;inode-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        if (!local-&gt;inode_ctx-&gt;on_disk[type]) {</div><div class='add'>+            /* nothing to inherit yet */</div><div class='add'>+            ret = _gf_false;</div><div class='add'>+            goto unlock;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='ctx'>         for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='del'>-                dict_unref (xattr[i]);</div><div class='add'>+            if (local-&gt;transaction.pre_op[i] !=</div><div class='add'>+                local-&gt;inode_ctx-&gt;pre_op_done[type][i]) {</div><div class='add'>+                /* either inherit exactly, or don't */</div><div class='add'>+                ret = _gf_false;</div><div class='add'>+                goto unlock;</div><div class='add'>+            }</div><div class='ctx'>         }</div><div class='ctx'> </div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='add'>+        local-&gt;inode_ctx-&gt;inherited[type]++;</div><div class='add'>+</div><div class='add'>+        ret = _gf_true;</div><div class='add'>+</div><div class='add'>+        local-&gt;transaction.inherited = _gf_true;</div><div class='add'>+    }</div><div class='add'>+unlock:</div><div class='add'>+    UNLOCK(&amp;local-&gt;inode-&gt;lock);</div><div class='ctx'> </div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-int32_t</div><div class='del'>-afr_changelog_pre_op_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-			      int32_t op_ret, int32_t op_errno, dict_t *xattr)</div><div class='add'>+gf_boolean_t</div><div class='add'>+afr_changelog_pre_op_update(call_frame_t *frame, xlator_t *this)</div><div class='ctx'> {</div><div class='del'>-	afr_local_t *   local = NULL;</div><div class='del'>-	afr_private_t * priv  = this-&gt;private;</div><div class='del'>-	loc_t       *   loc   = NULL;</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    int i = 0;</div><div class='add'>+    gf_boolean_t ret = _gf_false;</div><div class='add'>+    int type = 0;</div><div class='ctx'> </div><div class='del'>-	int call_count  = -1;</div><div class='del'>-	int child_index = (long) cookie;</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    priv = this-&gt;private;</div><div class='ctx'> </div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-	loc   = &amp;local-&gt;loc;</div><div class='add'>+    if (local-&gt;transaction.type == AFR_ENTRY_TRANSACTION ||</div><div class='add'>+        local-&gt;transaction.type == AFR_ENTRY_RENAME_TRANSACTION)</div><div class='add'>+        return _gf_false;</div><div class='ctx'> </div><div class='del'>-	LOCK (&amp;frame-&gt;lock);</div><div class='del'>-	{</div><div class='del'>-                if (op_ret == 0) {</div><div class='del'>-                        __mark_pre_op_done_on_fd (frame, this, child_index);</div><div class='del'>-                }</div><div class='add'>+    if (local-&gt;transaction.inherited)</div><div class='add'>+        /* was already inherited in afr_changelog_pre_op */</div><div class='add'>+        return _gf_false;</div><div class='add'>+</div><div class='add'>+    if (!local-&gt;transaction.dirtied)</div><div class='add'>+        return _gf_false;</div><div class='add'>+</div><div class='add'>+    if (!afr_txn_nothing_failed(frame, this))</div><div class='add'>+        return _gf_false;</div><div class='ctx'> </div><div class='del'>-		if (op_ret == -1) {</div><div class='del'>-			local-&gt;child_up[child_index] = 0;</div><div class='del'>-			</div><div class='del'>-			if (op_errno == ENOTSUP) {</div><div class='del'>-				gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-					"xattrop not supported by %s",</div><div class='del'>-					priv-&gt;children[child_index]-&gt;name);</div><div class='del'>-				local-&gt;op_ret = -1;</div><div class='del'>-                                </div><div class='del'>-			} else if (!child_went_down (op_ret, op_errno)) {</div><div class='del'>-				gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-					"xattrop failed on child %s: %s",</div><div class='del'>-					priv-&gt;children[child_index]-&gt;name, </div><div class='del'>-					strerror (op_errno));</div><div class='del'>-			}</div><div class='del'>-			local-&gt;op_errno = op_errno;</div><div class='del'>-		}</div><div class='del'>-</div><div class='del'>-		call_count = --local-&gt;call_count;</div><div class='del'>-	}</div><div class='del'>-	UNLOCK (&amp;frame-&gt;lock);</div><div class='del'>-</div><div class='del'>-	if (call_count == 0) {</div><div class='del'>-		if ((local-&gt;op_ret == -1) &amp;&amp; </div><div class='del'>-		    (local-&gt;op_errno == ENOTSUP)) {</div><div class='del'>-			local-&gt;transaction.resume (frame, this);</div><div class='del'>-		} else {</div><div class='del'>-                        __mark_all_success (local-&gt;pending, priv-&gt;child_count,</div><div class='del'>-                                            local-&gt;transaction.type);</div><div class='del'>-</div><div class='del'>-                        afr_pid_restore (frame);</div><div class='del'>-</div><div class='del'>-			local-&gt;transaction.fop (frame, this);</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	return 0;	</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int </div><div class='del'>-afr_changelog_pre_op (call_frame_t *frame, xlator_t *this)</div><div class='del'>-{</div><div class='del'>-	afr_private_t * priv = this-&gt;private;</div><div class='del'>-	int i = 0;				</div><div class='del'>-	int ret = 0;</div><div class='del'>-	int call_count = 0;		     </div><div class='del'>-	dict_t **xattr = NULL;</div><div class='del'>-</div><div class='del'>-	afr_local_t *local = NULL;</div><div class='del'>-</div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-        </div><div class='del'>-        xattr = alloca (priv-&gt;child_count * sizeof (*xattr));</div><div class='del'>-        memset (xattr, 0, (priv-&gt;child_count * sizeof (*xattr)));</div><div class='del'>-</div><div class='del'>-	for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='del'>-                xattr[i] = get_new_dict ();</div><div class='del'>-                dict_ref (xattr[i]);</div><div class='add'>+    type = afr_index_for_transaction_type(local-&gt;transaction.type);</div><div class='add'>+</div><div class='add'>+    ret = _gf_false;</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;local-&gt;inode-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        if (!local-&gt;inode_ctx-&gt;on_disk[type]) {</div><div class='add'>+            for (i = 0; i &lt; priv-&gt;child_count; i++)</div><div class='add'>+                local-&gt;inode_ctx-&gt;pre_op_done[type][i] =</div><div class='add'>+                    (!local-&gt;transaction.failed_subvols[i]);</div><div class='add'>+        } else {</div><div class='add'>+            for (i = 0; i &lt; priv-&gt;child_count; i++)</div><div class='add'>+                if (local-&gt;inode_ctx-&gt;pre_op_done[type][i] !=</div><div class='add'>+                    (!local-&gt;transaction.failed_subvols[i])) {</div><div class='add'>+                    local-&gt;transaction.no_uninherit = 1;</div><div class='add'>+                    goto unlock;</div><div class='add'>+                }</div><div class='ctx'>         }</div><div class='add'>+        local-&gt;inode_ctx-&gt;on_disk[type]++;</div><div class='add'>+</div><div class='add'>+        ret = _gf_true;</div><div class='add'>+    }</div><div class='add'>+unlock:</div><div class='add'>+    UNLOCK(&amp;local-&gt;inode-&gt;lock);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+afr_changelog_cbk(call_frame_t *frame, void *cookie, xlator_t *this, int op_ret,</div><div class='add'>+                  int op_errno, dict_t *xattr, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    int call_count = -1;</div><div class='add'>+    int child_index = -1;</div><div class='ctx'> </div><div class='del'>-	call_count = afr_up_children_count (priv-&gt;child_count, </div><div class='del'>-					    local-&gt;child_up); </div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    child_index = (long)cookie;</div><div class='ctx'> </div><div class='del'>-	if (local-&gt;transaction.type == AFR_ENTRY_RENAME_TRANSACTION) {</div><div class='del'>-		call_count *= 2;</div><div class='del'>-	}</div><div class='add'>+    if (op_ret == -1) {</div><div class='add'>+        local-&gt;op_errno = op_errno;</div><div class='add'>+        afr_transaction_fop_failed(frame, this, child_index);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	if (call_count == 0) {</div><div class='del'>-		/* no child is up */</div><div class='add'>+    if (xattr)</div><div class='add'>+        local-&gt;transaction.changelog_xdata[child_index] = dict_ref(xattr);</div><div class='add'>+</div><div class='add'>+    call_count = afr_frame_return(frame);</div><div class='add'>+</div><div class='add'>+    if (call_count == 0) {</div><div class='add'>+        local-&gt;transaction.changelog_resume(frame, this);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+afr_changelog_populate_xdata(call_frame_t *frame, afr_xattrop_type_t op,</div><div class='add'>+                             dict_t **xdata, dict_t **newloc_xdata)</div><div class='add'>+{</div><div class='add'>+    int i = 0;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    char *key = NULL;</div><div class='add'>+    int keylen = 0;</div><div class='add'>+    const char *name = NULL;</div><div class='add'>+    dict_t *xdata1 = NULL;</div><div class='add'>+    dict_t *xdata2 = NULL;</div><div class='add'>+    xlator_t *this = NULL;</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    gf_boolean_t need_entry_key_set = _gf_true;</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    this = THIS;</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    if (local-&gt;transaction.type == AFR_DATA_TRANSACTION ||</div><div class='add'>+        local-&gt;transaction.type == AFR_METADATA_TRANSACTION)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    if (!priv-&gt;esh_granular)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    xdata1 = dict_new();</div><div class='add'>+    if (!xdata1)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    name = local-&gt;loc.name;</div><div class='add'>+    if (local-&gt;op == GF_FOP_LINK)</div><div class='add'>+        name = local-&gt;newloc.name;</div><div class='add'>+</div><div class='add'>+    switch (op) {</div><div class='add'>+        case AFR_TRANSACTION_PRE_OP:</div><div class='add'>+            key = GF_XATTROP_ENTRY_IN_KEY;</div><div class='add'>+            break;</div><div class='add'>+        case AFR_TRANSACTION_POST_OP:</div><div class='add'>+            if (afr_txn_nothing_failed(frame, this)) {</div><div class='add'>+                key = GF_XATTROP_ENTRY_OUT_KEY;</div><div class='ctx'>                 for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='del'>-                        dict_unref (xattr[i]);</div><div class='add'>+                    if (!local-&gt;transaction.failed_subvols[i])</div><div class='add'>+                        continue;</div><div class='add'>+                    need_entry_key_set = _gf_false;</div><div class='add'>+                    break;</div><div class='ctx'>                 }</div><div class='add'>+                /* If the transaction itself did not fail and there</div><div class='add'>+                 * are no failed subvolumes, check whether the fop</div><div class='add'>+                 * failed due to a symmetric error. If it did, do</div><div class='add'>+                 * not set the ENTRY_OUT xattr which would end up</div><div class='add'>+                 * deleting a name index which was created possibly by</div><div class='add'>+                 * an earlier entry txn that may have failed on some</div><div class='add'>+                 * of the sub-volumes.</div><div class='add'>+                 */</div><div class='add'>+                if (local-&gt;op_ret)</div><div class='add'>+                    need_entry_key_set = _gf_false;</div><div class='add'>+            } else {</div><div class='add'>+                key = GF_XATTROP_ENTRY_IN_KEY;</div><div class='add'>+            }</div><div class='add'>+            break;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (need_entry_key_set) {</div><div class='add'>+        keylen = strlen(key);</div><div class='add'>+        ret = dict_set_strn(xdata1, key, keylen, (char *)name);</div><div class='add'>+        if (ret)</div><div class='add'>+            gf_msg(THIS-&gt;name, GF_LOG_ERROR, 0, AFR_MSG_DICT_SET_FAILED,</div><div class='add'>+                   "%s/%s: Could not set %s key during xattrop",</div><div class='add'>+                   uuid_utoa(local-&gt;loc.pargfid), local-&gt;loc.name, key);</div><div class='add'>+        if (local-&gt;transaction.type == AFR_ENTRY_RENAME_TRANSACTION) {</div><div class='add'>+            xdata2 = dict_new();</div><div class='add'>+            if (!xdata2)</div><div class='add'>+                goto out;</div><div class='ctx'> </div><div class='del'>-                local-&gt;internal_lock.lock_cbk =</div><div class='del'>-                        local-&gt;transaction.done;</div><div class='del'>-		afr_unlock (frame, this);</div><div class='del'>-		return 0;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	local-&gt;call_count = call_count;		</div><div class='del'>-</div><div class='del'>-	__mark_all_pending (local-&gt;pending, priv-&gt;child_count,</div><div class='del'>-                            local-&gt;transaction.type);</div><div class='del'>-</div><div class='del'>-	for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='del'>-		if (local-&gt;child_up[i]) {</div><div class='del'>-			ret = afr_set_pending_dict (priv, xattr[i], </div><div class='del'>-                                                    local-&gt;pending);</div><div class='del'>-</div><div class='del'>-			if (ret &lt; 0)</div><div class='del'>-				gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-					"failed to set pending entry");</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-			switch (local-&gt;transaction.type) {</div><div class='del'>-			case AFR_DATA_TRANSACTION:</div><div class='del'>-			case AFR_METADATA_TRANSACTION:</div><div class='del'>-			case AFR_FLUSH_TRANSACTION:</div><div class='del'>-			{</div><div class='del'>-				if (local-&gt;fd)</div><div class='del'>-					STACK_WIND_COOKIE (frame, </div><div class='del'>-							   afr_changelog_pre_op_cbk,</div><div class='del'>-							   (void *) (long) i,</div><div class='del'>-							   priv-&gt;children[i], </div><div class='del'>-							   priv-&gt;children[i]-&gt;fops-&gt;fxattrop,</div><div class='del'>-							   local-&gt;fd,</div><div class='del'>-							   GF_XATTROP_ADD_ARRAY, xattr[i]);</div><div class='del'>-				else</div><div class='del'>-					STACK_WIND_COOKIE (frame, </div><div class='del'>-							   afr_changelog_pre_op_cbk,</div><div class='del'>-							   (void *) (long) i,</div><div class='del'>-							   priv-&gt;children[i], </div><div class='del'>-							   priv-&gt;children[i]-&gt;fops-&gt;xattrop,</div><div class='del'>-							   &amp;(local-&gt;loc), </div><div class='del'>-							   GF_XATTROP_ADD_ARRAY, xattr[i]);</div><div class='del'>-			}</div><div class='del'>-			break;</div><div class='del'>-				</div><div class='del'>-			case AFR_ENTRY_RENAME_TRANSACTION: </div><div class='del'>-			{</div><div class='del'>-				STACK_WIND_COOKIE (frame, </div><div class='del'>-						   afr_changelog_pre_op_cbk,</div><div class='del'>-						   (void *) (long) i,</div><div class='del'>-						   priv-&gt;children[i], </div><div class='del'>-						   priv-&gt;children[i]-&gt;fops-&gt;xattrop,</div><div class='del'>-						   &amp;local-&gt;transaction.new_parent_loc, </div><div class='del'>-						   GF_XATTROP_ADD_ARRAY, xattr[i]);</div><div class='del'>-</div><div class='del'>-				call_count--;</div><div class='del'>-			}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-			/* </div><div class='del'>-			   set it again because previous stack_wind</div><div class='del'>-			   might have already returned (think of case</div><div class='del'>-			   where subvolume is posix) and would have</div><div class='del'>-			   used the dict as placeholder for return</div><div class='del'>-			   value</div><div class='del'>-			*/</div><div class='del'>-</div><div class='del'>-			ret = afr_set_pending_dict (priv, xattr[i], </div><div class='del'>-                                                    local-&gt;pending);</div><div class='del'>-</div><div class='del'>-			if (ret &lt; 0)</div><div class='del'>-				gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-					"failed to set pending entry");</div><div class='del'>-</div><div class='del'>-			/* fall through */</div><div class='del'>-				</div><div class='del'>-			case AFR_ENTRY_TRANSACTION:</div><div class='del'>-			{</div><div class='del'>-				if (local-&gt;fd)</div><div class='del'>-					STACK_WIND_COOKIE (frame, </div><div class='del'>-							   afr_changelog_pre_op_cbk,</div><div class='del'>-							   (void *) (long) i,</div><div class='del'>-							   priv-&gt;children[i], </div><div class='del'>-							   priv-&gt;children[i]-&gt;fops-&gt;fxattrop,</div><div class='del'>-							   local-&gt;fd, </div><div class='del'>-							   GF_XATTROP_ADD_ARRAY, xattr[i]);</div><div class='del'>-				else</div><div class='del'>-					STACK_WIND_COOKIE (frame, </div><div class='del'>-							   afr_changelog_pre_op_cbk,</div><div class='del'>-							   (void *) (long) i,</div><div class='del'>-							   priv-&gt;children[i], </div><div class='del'>-							   priv-&gt;children[i]-&gt;fops-&gt;xattrop,</div><div class='del'>-							   &amp;local-&gt;transaction.parent_loc, </div><div class='del'>-							   GF_XATTROP_ADD_ARRAY, xattr[i]);</div><div class='del'>-			}</div><div class='del'>-</div><div class='del'>-			break;</div><div class='del'>-			}</div><div class='del'>-</div><div class='del'>-			if (!--call_count)</div><div class='del'>-				break;</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='del'>-        </div><div class='del'>-        for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='del'>-                dict_unref (xattr[i]);</div><div class='add'>+            ret = dict_set_strn(xdata2, key, keylen,</div><div class='add'>+                                (char *)local-&gt;newloc.name);</div><div class='add'>+            if (ret)</div><div class='add'>+                gf_msg(THIS-&gt;name, GF_LOG_ERROR, 0, AFR_MSG_DICT_SET_FAILED,</div><div class='add'>+                       "%s/%s: Could not set %s key during "</div><div class='add'>+                       "xattrop",</div><div class='add'>+                       uuid_utoa(local-&gt;newloc.pargfid), local-&gt;newloc.name,</div><div class='add'>+                       key);</div><div class='ctx'>         }</div><div class='del'>-        </div><div class='del'>-	return 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    *xdata = xdata1;</div><div class='add'>+    *newloc_xdata = xdata2;</div><div class='add'>+    xdata1 = xdata2 = NULL;</div><div class='add'>+out:</div><div class='add'>+    if (xdata1)</div><div class='add'>+        dict_unref(xdata1);</div><div class='add'>+    return;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-afr_post_blocking_inodelk_cbk (call_frame_t *frame, xlator_t *this)</div><div class='add'>+afr_changelog_prepare(xlator_t *this, call_frame_t *frame, int *call_count,</div><div class='add'>+                      afr_changelog_resume_t changelog_resume,</div><div class='add'>+                      afr_xattrop_type_t op, dict_t **xdata,</div><div class='add'>+                      dict_t **newloc_xdata)</div><div class='ctx'> {</div><div class='del'>-        afr_internal_lock_t *int_lock = NULL;</div><div class='del'>-        afr_local_t         *local    = NULL;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='ctx'> </div><div class='del'>-        local    = frame-&gt;local;</div><div class='del'>-        int_lock = &amp;local-&gt;internal_lock;</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    priv = this-&gt;private;</div><div class='ctx'> </div><div class='del'>-        if (int_lock-&gt;lock_op_ret &lt; 0) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-                        "Blocking inodelks failed.");</div><div class='del'>-		local-&gt;transaction.done (frame, this);</div><div class='del'>-        } else {</div><div class='add'>+    *call_count = afr_changelog_call_count(</div><div class='add'>+        local-&gt;transaction.type, local-&gt;transaction.pre_op,</div><div class='add'>+        local-&gt;transaction.failed_subvols, priv-&gt;child_count);</div><div class='add'>+</div><div class='add'>+    if (*call_count == 0) {</div><div class='add'>+        changelog_resume(frame, this);</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-                        "Blocking inodelks done. Proceeding to FOP");</div><div class='del'>-                afr_internal_lock_finish (frame, this);</div><div class='add'>+    afr_changelog_populate_xdata(frame, op, xdata, newloc_xdata);</div><div class='add'>+    local-&gt;call_count = *call_count;</div><div class='add'>+</div><div class='add'>+    local-&gt;transaction.changelog_resume = changelog_resume;</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+afr_changelog_do(call_frame_t *frame, xlator_t *this, dict_t *xattr,</div><div class='add'>+                 afr_changelog_resume_t changelog_resume, afr_xattrop_type_t op)</div><div class='add'>+{</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    dict_t *xdata = NULL;</div><div class='add'>+    dict_t *newloc_xdata = NULL;</div><div class='add'>+    int i = 0;</div><div class='add'>+    int call_count = 0;</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+        if (local-&gt;transaction.changelog_xdata[i]) {</div><div class='add'>+            dict_unref(local-&gt;transaction.changelog_xdata[i]);</div><div class='add'>+            local-&gt;transaction.changelog_xdata[i] = NULL;</div><div class='ctx'>         }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = afr_changelog_prepare(this, frame, &amp;call_count, changelog_resume, op,</div><div class='add'>+                                &amp;xdata, &amp;newloc_xdata);</div><div class='ctx'> </div><div class='add'>+    if (ret)</div><div class='ctx'>         return 0;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+        if (!local-&gt;transaction.pre_op[i] ||</div><div class='add'>+            local-&gt;transaction.failed_subvols[i])</div><div class='add'>+            continue;</div><div class='add'>+</div><div class='add'>+        switch (local-&gt;transaction.type) {</div><div class='add'>+            case AFR_DATA_TRANSACTION:</div><div class='add'>+            case AFR_METADATA_TRANSACTION:</div><div class='add'>+                if (!local-&gt;fd) {</div><div class='add'>+                    STACK_WIND_COOKIE(</div><div class='add'>+                        frame, afr_changelog_cbk, (void *)(long)i,</div><div class='add'>+                        priv-&gt;children[i], priv-&gt;children[i]-&gt;fops-&gt;xattrop,</div><div class='add'>+                        &amp;local-&gt;loc, GF_XATTROP_ADD_ARRAY, xattr, xdata);</div><div class='add'>+                } else {</div><div class='add'>+                    STACK_WIND_COOKIE(</div><div class='add'>+                        frame, afr_changelog_cbk, (void *)(long)i,</div><div class='add'>+                        priv-&gt;children[i], priv-&gt;children[i]-&gt;fops-&gt;fxattrop,</div><div class='add'>+                        local-&gt;fd, GF_XATTROP_ADD_ARRAY, xattr, xdata);</div><div class='add'>+                }</div><div class='add'>+                break;</div><div class='add'>+            case AFR_ENTRY_RENAME_TRANSACTION:</div><div class='add'>+</div><div class='add'>+                STACK_WIND_COOKIE(frame, afr_changelog_cbk, (void *)(long)i,</div><div class='add'>+                                  priv-&gt;children[i],</div><div class='add'>+                                  priv-&gt;children[i]-&gt;fops-&gt;xattrop,</div><div class='add'>+                                  &amp;local-&gt;transaction.new_parent_loc,</div><div class='add'>+                                  GF_XATTROP_ADD_ARRAY, xattr, newloc_xdata);</div><div class='add'>+                call_count--;</div><div class='add'>+</div><div class='add'>+                /* fall through */</div><div class='add'>+</div><div class='add'>+            case AFR_ENTRY_TRANSACTION:</div><div class='add'>+                if (local-&gt;fd)</div><div class='add'>+                    STACK_WIND_COOKIE(</div><div class='add'>+                        frame, afr_changelog_cbk, (void *)(long)i,</div><div class='add'>+                        priv-&gt;children[i], priv-&gt;children[i]-&gt;fops-&gt;fxattrop,</div><div class='add'>+                        local-&gt;fd, GF_XATTROP_ADD_ARRAY, xattr, xdata);</div><div class='add'>+                else</div><div class='add'>+                    STACK_WIND_COOKIE(frame, afr_changelog_cbk, (void *)(long)i,</div><div class='add'>+                                      priv-&gt;children[i],</div><div class='add'>+                                      priv-&gt;children[i]-&gt;fops-&gt;xattrop,</div><div class='add'>+                                      &amp;local-&gt;transaction.parent_loc,</div><div class='add'>+                                      GF_XATTROP_ADD_ARRAY, xattr, xdata);</div><div class='add'>+                break;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        if (!--call_count)</div><div class='add'>+            break;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (xdata)</div><div class='add'>+        dict_unref(xdata);</div><div class='add'>+    if (newloc_xdata)</div><div class='add'>+        dict_unref(newloc_xdata);</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-afr_post_nonblocking_inodelk_cbk (call_frame_t *frame, xlator_t *this)</div><div class='add'>+static void</div><div class='add'>+afr_init_optimistic_changelog_for_txn(xlator_t *this, afr_local_t *local)</div><div class='ctx'> {</div><div class='del'>-        afr_internal_lock_t *int_lock = NULL;</div><div class='del'>-        afr_local_t         *local    = NULL;</div><div class='add'>+    int locked_count = 0;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='ctx'> </div><div class='del'>-        local    = frame-&gt;local;</div><div class='del'>-        int_lock = &amp;local-&gt;internal_lock;</div><div class='add'>+    priv = this-&gt;private;</div><div class='ctx'> </div><div class='del'>-        /* Initiate blocking locks if non-blocking has failed */</div><div class='del'>-        if (int_lock-&gt;lock_op_ret &lt; 0) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-                        "Non blocking inodelks failed. Proceeding to blocking");</div><div class='del'>-                int_lock-&gt;lock_cbk = afr_post_blocking_inodelk_cbk;</div><div class='del'>-                afr_blocking_lock (frame, this);</div><div class='del'>-        } else {</div><div class='add'>+    locked_count = AFR_COUNT(local-&gt;transaction.pre_op, priv-&gt;child_count);</div><div class='add'>+    if (priv-&gt;optimistic_change_log &amp;&amp; locked_count == priv-&gt;child_count)</div><div class='add'>+        local-&gt;optimistic_change_log = 1;</div><div class='ctx'> </div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-                        "Non blocking inodelks done. Proceeding to FOP");</div><div class='del'>-                afr_internal_lock_finish (frame, this);</div><div class='add'>+    return;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+afr_changelog_pre_op(call_frame_t *frame, xlator_t *this)</div><div class='add'>+{</div><div class='add'>+    afr_private_t *priv = this-&gt;private;</div><div class='add'>+    int i = 0;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    int call_count = 0;</div><div class='add'>+    int op_errno = 0;</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    afr_internal_lock_t *int_lock = NULL;</div><div class='add'>+    unsigned char *locked_nodes = NULL;</div><div class='add'>+    int idx = -1;</div><div class='add'>+    gf_boolean_t pre_nop = _gf_true;</div><div class='add'>+    dict_t *xdata_req = NULL;</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    int_lock = &amp;local-&gt;internal_lock;</div><div class='add'>+    idx = afr_index_for_transaction_type(local-&gt;transaction.type);</div><div class='add'>+</div><div class='add'>+    locked_nodes = afr_locked_nodes_get(local-&gt;transaction.type, int_lock);</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+        if (locked_nodes[i]) {</div><div class='add'>+            local-&gt;transaction.pre_op[i] = 1;</div><div class='add'>+            call_count++;</div><div class='add'>+        } else {</div><div class='add'>+            local-&gt;transaction.failed_subvols[i] = 1;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    afr_init_optimistic_changelog_for_txn(this, local);</div><div class='add'>+</div><div class='add'>+    if (afr_changelog_pre_op_inherit(frame, this))</div><div class='add'>+        goto next;</div><div class='add'>+</div><div class='add'>+    /* This condition should not be met with present code, as</div><div class='add'>+     * transaction.done will be called if locks are not acquired on even a</div><div class='add'>+     * single node.</div><div class='add'>+     */</div><div class='add'>+    if (call_count == 0) {</div><div class='add'>+        op_errno = ENOTCONN;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Check if the fop can be performed on at least</div><div class='add'>+     * quorum number of nodes.</div><div class='add'>+     */</div><div class='add'>+    if (priv-&gt;quorum_count &amp;&amp; !afr_has_fop_quorum(frame)) {</div><div class='add'>+        op_errno = int_lock-&gt;lock_op_errno;</div><div class='add'>+        if (op_errno == 0)</div><div class='add'>+            op_errno = afr_quorum_errno(priv);</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    xdata_req = dict_new();</div><div class='add'>+    if (!xdata_req) {</div><div class='add'>+        op_errno = ENOMEM;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (call_count &lt; priv-&gt;child_count)</div><div class='add'>+        pre_nop = _gf_false;</div><div class='add'>+</div><div class='add'>+    /* Set an all-zero pending changelog so that in the cbk, we can get the</div><div class='add'>+     * current on-disk values. In a replica 3 volume with arbiter enabled,</div><div class='add'>+     * these values are needed to arrive at a go/ no-go of the fop phase to</div><div class='add'>+     * avoid ending up in split-brain.*/</div><div class='add'>+</div><div class='add'>+    ret = afr_set_pending_dict(priv, xdata_req, local-&gt;pending);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        op_errno = ENOMEM;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (afr_needs_changelog_update(local)) {</div><div class='add'>+        local-&gt;dirty[idx] = hton32(1);</div><div class='add'>+</div><div class='add'>+        ret = dict_set_static_bin(xdata_req, AFR_DIRTY, local-&gt;dirty,</div><div class='add'>+                                  sizeof(int) * AFR_NUM_CHANGE_LOGS);</div><div class='add'>+        if (ret) {</div><div class='add'>+            op_errno = ENOMEM;</div><div class='add'>+            goto err;</div><div class='ctx'>         }</div><div class='ctx'> </div><div class='del'>-        return 0;</div><div class='add'>+        pre_nop = _gf_false;</div><div class='add'>+        local-&gt;transaction.dirtied = 1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (pre_nop)</div><div class='add'>+        goto next;</div><div class='add'>+</div><div class='add'>+    if (!local-&gt;pre_op_compat) {</div><div class='add'>+        dict_copy(xdata_req, local-&gt;xdata_req);</div><div class='add'>+        goto next;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    afr_changelog_do(frame, this, xdata_req, afr_transaction_perform_fop,</div><div class='add'>+                     AFR_TRANSACTION_PRE_OP);</div><div class='add'>+</div><div class='add'>+    if (xdata_req)</div><div class='add'>+        dict_unref(xdata_req);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+next:</div><div class='add'>+    afr_transaction_perform_fop(frame, this);</div><div class='add'>+</div><div class='add'>+    if (xdata_req)</div><div class='add'>+        dict_unref(xdata_req);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+err:</div><div class='add'>+    local-&gt;internal_lock.lock_cbk = afr_transaction_done;</div><div class='add'>+    local-&gt;op_ret = -1;</div><div class='add'>+    local-&gt;op_errno = op_errno;</div><div class='add'>+</div><div class='add'>+    afr_handle_lock_acquire_failure(local);</div><div class='add'>+</div><div class='add'>+    if (xdata_req)</div><div class='add'>+        dict_unref(xdata_req);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-afr_post_blocking_entrylk_cbk (call_frame_t *frame, xlator_t *this)</div><div class='add'>+afr_post_nonblocking_lock_cbk(call_frame_t *frame, xlator_t *this)</div><div class='ctx'> {</div><div class='del'>-        afr_internal_lock_t *int_lock = NULL;</div><div class='del'>-        afr_local_t         *local    = NULL;</div><div class='add'>+    afr_internal_lock_t *int_lock = NULL;</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    int_lock = &amp;local-&gt;internal_lock;</div><div class='add'>+</div><div class='add'>+    /* Initiate blocking locks if non-blocking has failed */</div><div class='add'>+    if (int_lock-&gt;lock_op_ret &lt; 0) {</div><div class='add'>+        gf_msg_debug(this-&gt;name, 0,</div><div class='add'>+                     "Non blocking locks failed. Proceeding to blocking");</div><div class='add'>+        int_lock-&gt;lock_cbk = afr_internal_lock_finish;</div><div class='add'>+        afr_blocking_lock(frame, this);</div><div class='add'>+    } else {</div><div class='add'>+        gf_msg_debug(this-&gt;name, 0,</div><div class='add'>+                     "Non blocking locks done. Proceeding to FOP");</div><div class='add'>+</div><div class='add'>+        afr_internal_lock_finish(frame, this);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        local    = frame-&gt;local;</div><div class='del'>-        int_lock = &amp;local-&gt;internal_lock;</div><div class='add'>+int</div><div class='add'>+afr_post_blocking_rename_cbk(call_frame_t *frame, xlator_t *this)</div><div class='add'>+{</div><div class='add'>+    afr_internal_lock_t *int_lock = NULL;</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='ctx'> </div><div class='del'>-        if (int_lock-&gt;lock_op_ret &lt; 0) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-                        "Blocking entrylks failed.");</div><div class='del'>-		local-&gt;transaction.done (frame, this);</div><div class='del'>-        } else {</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    int_lock = &amp;local-&gt;internal_lock;</div><div class='ctx'> </div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-                        "Blocking entrylks done. Proceeding to FOP");</div><div class='del'>-                afr_internal_lock_finish (frame, this);</div><div class='del'>-        }</div><div class='add'>+    if (int_lock-&gt;lock_op_ret &lt; 0) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_INFO, 0, AFR_MSG_INTERNAL_LKS_FAILED,</div><div class='add'>+               "Blocking entrylks failed.");</div><div class='ctx'> </div><div class='del'>-        return 0;</div><div class='add'>+        afr_transaction_done(frame, this);</div><div class='add'>+    } else {</div><div class='add'>+        gf_msg_debug(this-&gt;name, 0,</div><div class='add'>+                     "Blocking entrylks done. Proceeding to FOP");</div><div class='add'>+</div><div class='add'>+        afr_internal_lock_finish(frame, this);</div><div class='add'>+    }</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-afr_post_nonblocking_entrylk_cbk (call_frame_t *frame, xlator_t *this)</div><div class='add'>+afr_post_lower_unlock_cbk(call_frame_t *frame, xlator_t *this)</div><div class='ctx'> {</div><div class='del'>-        afr_internal_lock_t *int_lock = NULL;</div><div class='del'>-        afr_local_t         *local    = NULL;</div><div class='add'>+    afr_internal_lock_t *int_lock = NULL;</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='ctx'> </div><div class='del'>-        local = frame-&gt;local;</div><div class='del'>-        int_lock = &amp;local-&gt;internal_lock;</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    int_lock = &amp;local-&gt;internal_lock;</div><div class='ctx'> </div><div class='del'>-        /* Initiate blocking locks if non-blocking has failed */</div><div class='del'>-        if (int_lock-&gt;lock_op_ret &lt; 0) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-                        "Non blocking entrylks failed. Proceeding to blocking");</div><div class='del'>-                int_lock-&gt;lock_cbk = afr_post_blocking_entrylk_cbk;</div><div class='del'>-                afr_blocking_lock (frame, this);</div><div class='del'>-        } else {</div><div class='add'>+    GF_ASSERT(!int_lock-&gt;higher_locked);</div><div class='ctx'> </div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-                        "Non blocking entrylks done. Proceeding to FOP");</div><div class='del'>-                afr_internal_lock_finish (frame, this);</div><div class='del'>-        }</div><div class='add'>+    int_lock-&gt;lock_cbk = afr_post_blocking_rename_cbk;</div><div class='add'>+    afr_blocking_lock(frame, this);</div><div class='ctx'> </div><div class='del'>-        return 0;</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-afr_post_blocking_rename_cbk (call_frame_t *frame, xlator_t *this)</div><div class='add'>+afr_set_transaction_flock(xlator_t *this, afr_local_t *local,</div><div class='add'>+                          afr_lockee_t *lockee)</div><div class='ctx'> {</div><div class='del'>-        afr_internal_lock_t *int_lock = NULL;</div><div class='del'>-        afr_local_t         *local    = NULL;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    struct gf_flock *flock = NULL;</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+    flock = &amp;lockee-&gt;flock;</div><div class='add'>+</div><div class='add'>+    if ((priv-&gt;arbiter_count || local-&gt;transaction.eager_lock_on ||</div><div class='add'>+         priv-&gt;full_lock) &amp;&amp;</div><div class='add'>+        local-&gt;transaction.type == AFR_DATA_TRANSACTION) {</div><div class='add'>+        /*Lock entire file to avoid network split brains.*/</div><div class='add'>+        flock-&gt;l_len = 0;</div><div class='add'>+        flock-&gt;l_start = 0;</div><div class='add'>+    } else {</div><div class='add'>+        flock-&gt;l_len = local-&gt;transaction.len;</div><div class='add'>+        flock-&gt;l_start = local-&gt;transaction.start;</div><div class='add'>+    }</div><div class='add'>+    flock-&gt;l_type = F_WRLCK;</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        local    = frame-&gt;local;</div><div class='del'>-        int_lock = &amp;local-&gt;internal_lock;</div><div class='add'>+int</div><div class='add'>+afr_lock(call_frame_t *frame, xlator_t *this)</div><div class='add'>+{</div><div class='add'>+    afr_internal_lock_t *int_lock = NULL;</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    int i = 0;</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    int_lock = &amp;local-&gt;internal_lock;</div><div class='add'>+</div><div class='add'>+    int_lock-&gt;lock_cbk = afr_post_nonblocking_lock_cbk;</div><div class='add'>+    int_lock-&gt;domain = this-&gt;name;</div><div class='add'>+</div><div class='add'>+    switch (local-&gt;transaction.type) {</div><div class='add'>+        case AFR_DATA_TRANSACTION:</div><div class='add'>+        case AFR_METADATA_TRANSACTION:</div><div class='add'>+            for (i = 0; i &lt; int_lock-&gt;lockee_count; i++) {</div><div class='add'>+                afr_set_transaction_flock(this, local, &amp;int_lock-&gt;lockee[i]);</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            break;</div><div class='add'>+</div><div class='add'>+        case AFR_ENTRY_TRANSACTION:</div><div class='add'>+            int_lock-&gt;lk_basename = local-&gt;transaction.basename;</div><div class='add'>+            if (local-&gt;transaction.parent_loc.path)</div><div class='add'>+                int_lock-&gt;lk_loc = &amp;local-&gt;transaction.parent_loc;</div><div class='add'>+            else</div><div class='add'>+                GF_ASSERT(local-&gt;fd);</div><div class='add'>+            break;</div><div class='add'>+        case AFR_ENTRY_RENAME_TRANSACTION:</div><div class='add'>+            break;</div><div class='add'>+    }</div><div class='add'>+    afr_lock_nonblocking(frame, this);</div><div class='ctx'> </div><div class='del'>-        if (int_lock-&gt;lock_op_ret &lt; 0) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-                        "Blocking entrylks failed.");</div><div class='del'>-		local-&gt;transaction.done (frame, this);</div><div class='del'>-        } else {</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static gf_boolean_t</div><div class='add'>+afr_locals_overlap(afr_local_t *local1, afr_local_t *local2)</div><div class='add'>+{</div><div class='add'>+    uint64_t start1 = local1-&gt;transaction.start;</div><div class='add'>+    uint64_t start2 = local2-&gt;transaction.start;</div><div class='add'>+    uint64_t end1 = 0;</div><div class='add'>+    uint64_t end2 = 0;</div><div class='add'>+</div><div class='add'>+    if (local1-&gt;transaction.len)</div><div class='add'>+        end1 = start1 + local1-&gt;transaction.len - 1;</div><div class='add'>+    else</div><div class='add'>+        end1 = ULLONG_MAX;</div><div class='add'>+</div><div class='add'>+    if (local2-&gt;transaction.len)</div><div class='add'>+        end2 = start2 + local2-&gt;transaction.len - 1;</div><div class='add'>+    else</div><div class='add'>+        end2 = ULLONG_MAX;</div><div class='add'>+</div><div class='add'>+    return ((end1 &gt;= start2) &amp;&amp; (end2 &gt;= start1));</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-                        "Blocking entrylks done. Proceeding to FOP");</div><div class='del'>-                afr_internal_lock_finish (frame, this);</div><div class='add'>+gf_boolean_t</div><div class='add'>+afr_has_lock_conflict(afr_local_t *local, gf_boolean_t waitlist_check)</div><div class='add'>+{</div><div class='add'>+    afr_local_t *each = NULL;</div><div class='add'>+    afr_lock_t *lock = NULL;</div><div class='add'>+</div><div class='add'>+    lock = &amp;local-&gt;inode_ctx-&gt;lock[local-&gt;transaction.type];</div><div class='add'>+    /*</div><div class='add'>+     * Once full file lock is acquired in eager-lock phase, overlapping</div><div class='add'>+     * writes do not compete for inode-locks, instead are transferred to the</div><div class='add'>+     * next writes. Because of this overlapping writes are not ordered.</div><div class='add'>+     * This can cause inconsistencies in replication.</div><div class='add'>+     * Example:</div><div class='add'>+     * Two overlapping writes w1, w2 are sent in parallel on same fd</div><div class='add'>+     * in two threads t1, t2.</div><div class='add'>+     * Both threads can execute afr_writev_wind in the following manner.</div><div class='add'>+     * t1 winds w1 on brick-0</div><div class='add'>+     * t2 winds w2 on brick-0</div><div class='add'>+     * t2 winds w2 on brick-1</div><div class='add'>+     * t1 winds w1 on brick-1</div><div class='add'>+     *</div><div class='add'>+     * This check makes sure the locks are not transferred for</div><div class='add'>+     * overlapping writes.</div><div class='add'>+     */</div><div class='add'>+    list_for_each_entry(each, &amp;lock-&gt;owners, transaction.owner_list)</div><div class='add'>+    {</div><div class='add'>+        if (afr_locals_overlap(each, local)) {</div><div class='add'>+            return _gf_true;</div><div class='ctx'>         }</div><div class='del'>-        return 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (!waitlist_check)</div><div class='add'>+        return _gf_false;</div><div class='add'>+    list_for_each_entry(each, &amp;lock-&gt;waiting, transaction.wait_list)</div><div class='add'>+    {</div><div class='add'>+        if (afr_locals_overlap(each, local)) {</div><div class='add'>+            return _gf_true;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    return _gf_false;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-int afr_post_lower_unlock_cbk (call_frame_t *frame, xlator_t *this)</div><div class='add'>+/* }}} */</div><div class='add'>+static void</div><div class='add'>+afr_copy_inodelk_vars(afr_internal_lock_t *dst, afr_internal_lock_t *src,</div><div class='add'>+                      xlator_t *this, int lockee_num)</div><div class='ctx'> {</div><div class='del'>-        afr_internal_lock_t *int_lock = NULL;</div><div class='del'>-        afr_local_t         *local    = NULL;</div><div class='add'>+    afr_private_t *priv = this-&gt;private;</div><div class='add'>+    afr_lockee_t *sl = &amp;src-&gt;lockee[lockee_num];</div><div class='add'>+    afr_lockee_t *dl = &amp;dst-&gt;lockee[lockee_num];</div><div class='add'>+</div><div class='add'>+    dst-&gt;domain = src-&gt;domain;</div><div class='add'>+    dl-&gt;flock.l_len = sl-&gt;flock.l_len;</div><div class='add'>+    dl-&gt;flock.l_start = sl-&gt;flock.l_start;</div><div class='add'>+    dl-&gt;flock.l_type = sl-&gt;flock.l_type;</div><div class='add'>+    dl-&gt;locked_count = sl-&gt;locked_count;</div><div class='add'>+    memcpy(dl-&gt;locked_nodes, sl-&gt;locked_nodes,</div><div class='add'>+           priv-&gt;child_count * sizeof(*dl-&gt;locked_nodes));</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        local    = frame-&gt;local;</div><div class='del'>-        int_lock = &amp;local-&gt;internal_lock;</div><div class='add'>+void</div><div class='add'>+__afr_transaction_wake_shared(afr_local_t *local, struct list_head *shared)</div><div class='add'>+{</div><div class='add'>+    gf_boolean_t conflict = _gf_false;</div><div class='add'>+    afr_local_t *each = NULL;</div><div class='add'>+    afr_lock_t *lock = &amp;local-&gt;inode_ctx-&gt;lock[local-&gt;transaction.type];</div><div class='add'>+</div><div class='add'>+    while (!conflict) {</div><div class='add'>+        if (list_empty(&amp;lock-&gt;waiting))</div><div class='add'>+            return;</div><div class='add'>+        each = list_entry(lock-&gt;waiting.next, afr_local_t,</div><div class='add'>+                          transaction.wait_list);</div><div class='add'>+        if (afr_has_lock_conflict(each, _gf_false)) {</div><div class='add'>+            conflict = _gf_true;</div><div class='add'>+        }</div><div class='add'>+        if (conflict &amp;&amp; !list_empty(&amp;lock-&gt;owners))</div><div class='add'>+            return;</div><div class='add'>+        afr_copy_inodelk_vars(&amp;each-&gt;internal_lock, &amp;local-&gt;internal_lock,</div><div class='add'>+                              each-&gt;transaction.frame-&gt;this, 0);</div><div class='add'>+        list_move_tail(&amp;each-&gt;transaction.wait_list, shared);</div><div class='add'>+        list_add_tail(&amp;each-&gt;transaction.owner_list, &amp;lock-&gt;owners);</div><div class='add'>+    }</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        GF_ASSERT (!int_lock-&gt;higher_locked);</div><div class='add'>+static void</div><div class='add'>+afr_lock_resume_shared(struct list_head *list)</div><div class='add'>+{</div><div class='add'>+    afr_local_t *each = NULL;</div><div class='add'>+</div><div class='add'>+    while (!list_empty(list)) {</div><div class='add'>+        each = list_entry(list-&gt;next, afr_local_t, transaction.wait_list);</div><div class='add'>+        list_del_init(&amp;each-&gt;transaction.wait_list);</div><div class='add'>+        afr_changelog_pre_op(each-&gt;transaction.frame,</div><div class='add'>+                             each-&gt;transaction.frame-&gt;this);</div><div class='add'>+    }</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        int_lock-&gt;lock_cbk = afr_post_blocking_rename_cbk;</div><div class='del'>-        afr_blocking_lock (frame, this);</div><div class='add'>+int</div><div class='add'>+afr_internal_lock_finish(call_frame_t *frame, xlator_t *this)</div><div class='add'>+{</div><div class='add'>+    afr_local_t *local = frame-&gt;local;</div><div class='add'>+    afr_lock_t *lock = NULL;</div><div class='add'>+</div><div class='add'>+    local-&gt;internal_lock.lock_cbk = NULL;</div><div class='add'>+    if (!local-&gt;transaction.eager_lock_on) {</div><div class='add'>+        if (local-&gt;internal_lock.lock_op_ret &lt; 0) {</div><div class='add'>+            afr_transaction_done(frame, this);</div><div class='add'>+            return 0;</div><div class='add'>+        }</div><div class='add'>+        afr_changelog_pre_op(frame, this);</div><div class='add'>+    } else {</div><div class='add'>+        lock = &amp;local-&gt;inode_ctx-&gt;lock[local-&gt;transaction.type];</div><div class='add'>+        if (local-&gt;internal_lock.lock_op_ret &lt; 0) {</div><div class='add'>+            afr_handle_lock_acquire_failure(local);</div><div class='add'>+        } else {</div><div class='add'>+            lock-&gt;event_generation = local-&gt;event_generation;</div><div class='add'>+            afr_changelog_pre_op(frame, this);</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        return 0;</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-afr_set_transaction_flock (afr_local_t *local)</div><div class='add'>+gf_boolean_t</div><div class='add'>+afr_are_conflicting_ops_waiting(afr_local_t *local, xlator_t *this)</div><div class='ctx'> {</div><div class='del'>-        afr_internal_lock_t *int_lock = NULL;</div><div class='add'>+    afr_lock_t *lock = NULL;</div><div class='add'>+    lock = &amp;local-&gt;inode_ctx-&gt;lock[local-&gt;transaction.type];</div><div class='add'>+</div><div class='add'>+    /* Lets say mount1 has eager-lock(full-lock) and after the eager-lock</div><div class='add'>+     * is taken mount2 opened the same file, it won't be able to</div><div class='add'>+     * perform any {meta,}data operations until mount1 releases eager-lock.</div><div class='add'>+     * To avoid such scenario do not enable eager-lock for this transaction</div><div class='add'>+     * if open-fd-count is &gt; 1 for metadata transactions and if num-inodelks &gt; 1</div><div class='add'>+     * for data transactions</div><div class='add'>+     */</div><div class='add'>+</div><div class='add'>+    if (local-&gt;transaction.type == AFR_METADATA_TRANSACTION) {</div><div class='add'>+        if (local-&gt;inode_ctx-&gt;open_fd_count &gt; 1) {</div><div class='add'>+            return _gf_true;</div><div class='add'>+        }</div><div class='add'>+    } else if (local-&gt;transaction.type == AFR_DATA_TRANSACTION) {</div><div class='add'>+        if (lock-&gt;num_inodelks &gt; 1) {</div><div class='add'>+            return _gf_true;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        int_lock = &amp;local-&gt;internal_lock;</div><div class='add'>+    return _gf_false;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        int_lock-&gt;lk_flock.l_len   = local-&gt;transaction.len;</div><div class='del'>-        int_lock-&gt;lk_flock.l_start = local-&gt;transaction.start;</div><div class='del'>-        int_lock-&gt;lk_flock.l_type  = F_WRLCK;</div><div class='add'>+gf_boolean_t</div><div class='add'>+afr_is_delayed_changelog_post_op_needed(call_frame_t *frame, xlator_t *this,</div><div class='add'>+                                        int delay)</div><div class='add'>+{</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    afr_lock_t *lock = NULL;</div><div class='add'>+    gf_boolean_t res = _gf_false;</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    lock = &amp;local-&gt;inode_ctx-&gt;lock[local-&gt;transaction.type];</div><div class='add'>+</div><div class='add'>+    if (!afr_txn_nothing_failed(frame, this)) {</div><div class='add'>+        lock-&gt;release = _gf_true;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (afr_are_conflicting_ops_waiting(local, this)) {</div><div class='add'>+        lock-&gt;release = _gf_true;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (!list_empty(&amp;lock-&gt;owners))</div><div class='add'>+        goto out;</div><div class='add'>+    else</div><div class='add'>+        GF_ASSERT(list_empty(&amp;lock-&gt;waiting));</div><div class='add'>+</div><div class='add'>+    if (lock-&gt;release) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (!delay) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (local-&gt;transaction.disable_delayed_post_op) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if ((local-&gt;op != GF_FOP_WRITE) &amp;&amp; (local-&gt;op != GF_FOP_FXATTROP) &amp;&amp;</div><div class='add'>+        (local-&gt;op != GF_FOP_FSYNC)) {</div><div class='add'>+        /*Only allow writes/fsyncs but shard does [f]xattrops on writes, so</div><div class='add'>+         * they are fine too*/</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    res = _gf_true;</div><div class='add'>+out:</div><div class='add'>+    return res;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        return 0;</div><div class='add'>+void</div><div class='add'>+afr_delayed_changelog_wake_up_cbk(void *data)</div><div class='add'>+{</div><div class='add'>+    afr_lock_t *lock = NULL;</div><div class='add'>+    afr_local_t *local = data;</div><div class='add'>+    afr_local_t *timer_local = NULL;</div><div class='add'>+    struct list_head shared;</div><div class='add'>+</div><div class='add'>+    INIT_LIST_HEAD(&amp;shared);</div><div class='add'>+    lock = &amp;local-&gt;inode_ctx-&gt;lock[local-&gt;transaction.type];</div><div class='add'>+    LOCK(&amp;local-&gt;inode-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        timer_local = list_entry(lock-&gt;post_op.next, afr_local_t,</div><div class='add'>+                                 transaction.owner_list);</div><div class='add'>+        if (list_empty(&amp;lock-&gt;owners) &amp;&amp; (local == timer_local)) {</div><div class='add'>+            GF_ASSERT(list_empty(&amp;lock-&gt;waiting));</div><div class='add'>+            /*Last owner*/</div><div class='add'>+            lock-&gt;release = _gf_true;</div><div class='add'>+            lock-&gt;delay_timer = NULL;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    UNLOCK(&amp;local-&gt;inode-&gt;lock);</div><div class='add'>+    afr_changelog_post_op_now(local-&gt;transaction.frame,</div><div class='add'>+                              local-&gt;transaction.frame-&gt;this);</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+/* SET operation */</div><div class='ctx'> int</div><div class='del'>-afr_lock_rec (call_frame_t *frame, xlator_t *this)</div><div class='add'>+afr_fd_report_unstable_write(xlator_t *this, afr_local_t *local)</div><div class='ctx'> {</div><div class='del'>-        afr_internal_lock_t *int_lock = NULL;</div><div class='del'>-        afr_local_t         *local    = NULL;</div><div class='add'>+    LOCK(&amp;local-&gt;inode-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        local-&gt;inode_ctx-&gt;witnessed_unstable_write = _gf_true;</div><div class='add'>+    }</div><div class='add'>+    UNLOCK(&amp;local-&gt;inode-&gt;lock);</div><div class='ctx'> </div><div class='del'>-        local    = frame-&gt;local;</div><div class='del'>-        int_lock = &amp;local-&gt;internal_lock;</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        int_lock-&gt;transaction_lk_type = AFR_TRANSACTION_LK;</div><div class='add'>+/* TEST and CLEAR operation */</div><div class='add'>+gf_boolean_t</div><div class='add'>+afr_fd_has_witnessed_unstable_write(xlator_t *this, inode_t *inode)</div><div class='add'>+{</div><div class='add'>+    afr_inode_ctx_t *ctx = NULL;</div><div class='add'>+    gf_boolean_t witness = _gf_false;</div><div class='ctx'> </div><div class='del'>-	switch (local-&gt;transaction.type) {</div><div class='del'>-	case AFR_DATA_TRANSACTION:</div><div class='del'>-	case AFR_METADATA_TRANSACTION:</div><div class='del'>-	case AFR_FLUSH_TRANSACTION:</div><div class='del'>-                afr_set_transaction_flock (local);</div><div class='add'>+    LOCK(&amp;inode-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        (void)__afr_inode_ctx_get(this, inode, &amp;ctx);</div><div class='ctx'> </div><div class='del'>-                int_lock-&gt;lock_cbk = afr_post_nonblocking_inodelk_cbk;</div><div class='add'>+        if (ctx-&gt;witnessed_unstable_write) {</div><div class='add'>+            witness = _gf_true;</div><div class='add'>+            ctx-&gt;witnessed_unstable_write = _gf_false;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    UNLOCK(&amp;inode-&gt;lock);</div><div class='ctx'> </div><div class='del'>-                afr_nonblocking_inodelk (frame, this);</div><div class='del'>-		break;</div><div class='add'>+    return witness;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        case AFR_ENTRY_RENAME_TRANSACTION:</div><div class='add'>+int</div><div class='add'>+afr_changelog_fsync_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                        int op_ret, int op_errno, struct iatt *pre,</div><div class='add'>+                        struct iatt *post, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    int child_index = (long)cookie;</div><div class='add'>+    int call_count = -1;</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='ctx'> </div><div class='del'>-                int_lock-&gt;lock_cbk = afr_post_blocking_rename_cbk;</div><div class='del'>-                afr_blocking_lock (frame, this);</div><div class='del'>-                break;</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+    local = frame-&gt;local;</div><div class='ctx'> </div><div class='del'>-	case AFR_ENTRY_TRANSACTION:</div><div class='del'>-                int_lock-&gt;lk_basename = local-&gt;transaction.basename;</div><div class='del'>-                if (&amp;local-&gt;transaction.parent_loc)</div><div class='del'>-                        int_lock-&gt;lk_loc = &amp;local-&gt;transaction.parent_loc;</div><div class='del'>-                else</div><div class='del'>-                        GF_ASSERT (local-&gt;fd);</div><div class='add'>+    if (op_ret != 0) {</div><div class='add'>+        /* Failure of fsync() is as good as failure of previous</div><div class='add'>+           write(). So treat it like one.</div><div class='add'>+        */</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_WARNING, op_errno, AFR_MSG_FSYNC_FAILED,</div><div class='add'>+               "fsync(%s) failed on subvolume %s. Transaction was %s",</div><div class='add'>+               uuid_utoa(local-&gt;fd-&gt;inode-&gt;gfid),</div><div class='add'>+               priv-&gt;children[child_index]-&gt;name, gf_fop_list[local-&gt;op]);</div><div class='ctx'> </div><div class='del'>-                int_lock-&gt;lock_cbk = afr_post_nonblocking_entrylk_cbk;</div><div class='del'>-                afr_nonblocking_entrylk (frame, this);</div><div class='del'>-                break;</div><div class='del'>-        }</div><div class='add'>+        afr_transaction_fop_failed(frame, this, child_index);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='add'>+    call_count = afr_frame_return(frame);</div><div class='ctx'> </div><div class='add'>+    if (call_count == 0)</div><div class='add'>+        afr_changelog_post_op_now(frame, this);</div><div class='ctx'> </div><div class='del'>-int32_t</div><div class='del'>-afr_lock (call_frame_t *frame, xlator_t *this)</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+afr_changelog_fsync(call_frame_t *frame, xlator_t *this)</div><div class='ctx'> {</div><div class='del'>-        afr_pid_save (frame);</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    int i = 0;</div><div class='add'>+    int call_count = 0;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    dict_t *xdata = NULL;</div><div class='add'>+    GF_UNUSED int ret = -1;</div><div class='ctx'> </div><div class='del'>-        frame-&gt;root-&gt;pid = (long) frame-&gt;root;</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    priv = this-&gt;private;</div><div class='ctx'> </div><div class='del'>-        afr_set_lk_owner (frame, this);</div><div class='add'>+    call_count = AFR_COUNT(local-&gt;transaction.pre_op, priv-&gt;child_count);</div><div class='ctx'> </div><div class='del'>-        afr_set_lock_number (frame, this);</div><div class='add'>+    if (!call_count) {</div><div class='add'>+        /* will go straight to unlock */</div><div class='add'>+        afr_changelog_post_op_now(frame, this);</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	return afr_lock_rec (frame, this);</div><div class='del'>-}</div><div class='add'>+    local-&gt;call_count = call_count;</div><div class='ctx'> </div><div class='add'>+    xdata = dict_new();</div><div class='add'>+    if (xdata) {</div><div class='add'>+        ret = dict_set_int32_sizen(xdata, "batch-fsync", 1);</div><div class='add'>+        ret = dict_set_str(xdata, GLUSTERFS_INTERNAL_FOP_KEY, "yes");</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-/* }}} */</div><div class='add'>+    for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+        if (!local-&gt;transaction.pre_op[i])</div><div class='add'>+            continue;</div><div class='add'>+</div><div class='add'>+        STACK_WIND_COOKIE(frame, afr_changelog_fsync_cbk, (void *)(long)i,</div><div class='add'>+                          priv-&gt;children[i], priv-&gt;children[i]-&gt;fops-&gt;fsync,</div><div class='add'>+                          local-&gt;fd, 1, xdata);</div><div class='add'>+        if (!--call_count)</div><div class='add'>+            break;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (xdata)</div><div class='add'>+        dict_unref(xdata);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-afr_internal_lock_finish (call_frame_t *frame, xlator_t *this)</div><div class='add'>+afr_changelog_post_op_safe(call_frame_t *frame, xlator_t *this)</div><div class='ctx'> {</div><div class='del'>-        afr_local_t   *local = NULL;</div><div class='del'>-        afr_private_t *priv  = NULL;</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='ctx'> </div><div class='del'>-        priv  = this-&gt;private;</div><div class='del'>-        local = frame-&gt;local;</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    priv = this-&gt;private;</div><div class='ctx'> </div><div class='del'>-        if (__changelog_needed_pre_op (frame, this)) {</div><div class='del'>-                afr_changelog_pre_op (frame, this);</div><div class='del'>-        } else {</div><div class='del'>-                __mark_all_success (local-&gt;pending, priv-&gt;child_count,</div><div class='del'>-                                            local-&gt;transaction.type);</div><div class='add'>+    if (!local-&gt;fd || local-&gt;transaction.type != AFR_DATA_TRANSACTION) {</div><div class='add'>+        afr_changelog_post_op_now(frame, this);</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (afr_changelog_pre_op_uninherit(frame, this) &amp;&amp;</div><div class='add'>+        afr_txn_nothing_failed(frame, this)) {</div><div class='add'>+        /* just detected that this post-op is about to</div><div class='add'>+           be optimized away as a new write() has</div><div class='add'>+           already piggybacked on this frame's changelog.</div><div class='add'>+           */</div><div class='add'>+        afr_changelog_post_op_now(frame, this);</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Calling afr_changelog_post_op_now() now will result in</div><div class='add'>+       issuing -&gt;[f]xattrop().</div><div class='add'>+</div><div class='add'>+       Performing a hard POST-OP (-&gt;[f]xattrop() FOP) is a more</div><div class='add'>+       responsible operation that what it might appear on the surface.</div><div class='add'>+</div><div class='add'>+       The changelog of a file (in the xattr of the file on the server)</div><div class='add'>+       stores information (pending count) about the state of the file</div><div class='add'>+       on the OTHER server. This changelog is blindly trusted, and must</div><div class='add'>+       therefore be updated in such a way it remains trustworthy. This</div><div class='add'>+       implies that decrementing the pending count (essentially "clearing</div><div class='add'>+       the dirty flag") must be done STRICTLY after we are sure that the</div><div class='add'>+       operation on the other server has reached stable storage.</div><div class='add'>+</div><div class='add'>+       While the backend filesystem on that server will eventually flush</div><div class='add'>+       it to stable storage, we (being in userspace) have no mechanism</div><div class='add'>+       to get notified when the write became "stable".</div><div class='add'>+</div><div class='add'>+       This means we need take matter into our own hands and issue an</div><div class='add'>+       fsync() EVEN IF THE APPLICATION WAS PERFORMING UNSTABLE WRITES,</div><div class='add'>+       and get an acknowledgement for it. And we need to wait for the</div><div class='add'>+       fsync() acknowledgement before initiating the hard POST-OP.</div><div class='add'>+</div><div class='add'>+       However if the FD itself was opened in O_SYNC or O_DSYNC then</div><div class='add'>+       we are already guaranteed that the writes were made stable as</div><div class='add'>+       part of the FOP itself. The same holds true for NFS stable</div><div class='add'>+       writes which happen on an anonymous FD with O_DSYNC or O_SYNC</div><div class='add'>+       flag set in the writev() @flags param. For all other write types,</div><div class='add'>+       mark a flag in the fdctx whenever an unstable write is witnessed.</div><div class='add'>+       */</div><div class='add'>+</div><div class='add'>+    if (!afr_fd_has_witnessed_unstable_write(this, local-&gt;inode)) {</div><div class='add'>+        afr_changelog_post_op_now(frame, this);</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Check whether users want durability and perform fsync/post-op</div><div class='add'>+     * accordingly.</div><div class='add'>+     */</div><div class='add'>+    if (priv-&gt;ensure_durability) {</div><div class='add'>+        /* Time to fsync() */</div><div class='add'>+        afr_changelog_fsync(frame, this);</div><div class='add'>+    } else {</div><div class='add'>+        afr_changelog_post_op_now(frame, this);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-                afr_pid_restore (frame);</div><div class='add'>+void</div><div class='add'>+afr_changelog_post_op(call_frame_t *frame, xlator_t *this)</div><div class='add'>+{</div><div class='add'>+    struct timespec delta = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    afr_local_t *local = frame-&gt;local;</div><div class='add'>+    afr_lock_t *lock = NULL;</div><div class='add'>+    gf_boolean_t post_op = _gf_true;</div><div class='add'>+    struct list_head shared;</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+    delta.tv_sec = priv-&gt;post_op_delay_secs;</div><div class='add'>+    delta.tv_nsec = 0;</div><div class='add'>+</div><div class='add'>+    INIT_LIST_HEAD(&amp;shared);</div><div class='add'>+    if (!local-&gt;transaction.eager_lock_on)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    lock = &amp;local-&gt;inode_ctx-&gt;lock[local-&gt;transaction.type];</div><div class='add'>+    LOCK(&amp;local-&gt;inode-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        list_del_init(&amp;local-&gt;transaction.owner_list);</div><div class='add'>+        list_add(&amp;local-&gt;transaction.owner_list, &amp;lock-&gt;post_op);</div><div class='add'>+        __afr_transaction_wake_shared(local, &amp;shared);</div><div class='add'>+</div><div class='add'>+        if (!afr_is_delayed_changelog_post_op_needed(frame, this,</div><div class='add'>+                                                     delta.tv_sec)) {</div><div class='add'>+            if (list_empty(&amp;lock-&gt;owners))</div><div class='add'>+                lock-&gt;release = _gf_true;</div><div class='add'>+            goto unlock;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-                local-&gt;transaction.fop (frame, this);</div><div class='add'>+        GF_ASSERT(lock-&gt;delay_timer == NULL);</div><div class='add'>+        lock-&gt;delay_timer = gf_timer_call_after(</div><div class='add'>+            this-&gt;ctx, delta, afr_delayed_changelog_wake_up_cbk, local);</div><div class='add'>+        if (!lock-&gt;delay_timer) {</div><div class='add'>+            lock-&gt;release = _gf_true;</div><div class='add'>+        } else {</div><div class='add'>+            post_op = _gf_false;</div><div class='ctx'>         }</div><div class='add'>+    }</div><div class='add'>+unlock:</div><div class='add'>+    UNLOCK(&amp;local-&gt;inode-&gt;lock);</div><div class='ctx'> </div><div class='del'>-        return 0;</div><div class='add'>+    if (!list_empty(&amp;shared)) {</div><div class='add'>+        afr_lock_resume_shared(&amp;shared);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (post_op) {</div><div class='add'>+        if (!local-&gt;transaction.eager_lock_on || lock-&gt;release) {</div><div class='add'>+            afr_changelog_post_op_safe(frame, this);</div><div class='add'>+        } else {</div><div class='add'>+            afr_changelog_post_op_now(frame, this);</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-int32_t</div><div class='del'>-afr_transaction_resume (call_frame_t *frame, xlator_t *this)</div><div class='add'>+int</div><div class='add'>+afr_transaction_resume(call_frame_t *frame, xlator_t *this)</div><div class='ctx'> {</div><div class='del'>-        afr_internal_lock_t *int_lock = NULL;</div><div class='del'>-	afr_local_t         *local    = NULL;</div><div class='del'>-	afr_private_t       *priv     = NULL;</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='ctx'> </div><div class='del'>-	local    = frame-&gt;local;</div><div class='del'>-        int_lock = &amp;local-&gt;internal_lock;</div><div class='del'>-	priv     = this-&gt;private;</div><div class='add'>+    local = frame-&gt;local;</div><div class='ctx'> </div><div class='del'>-	if (__changelog_needed_post_op (frame, this)) {</div><div class='del'>-		afr_changelog_post_op (frame, this);</div><div class='del'>-	} else {</div><div class='del'>-		if (afr_lock_server_count (priv, local-&gt;transaction.type) == 0) {</div><div class='del'>-			local-&gt;transaction.done (frame, this);</div><div class='del'>-		} else {</div><div class='del'>-                        int_lock-&gt;lock_cbk = local-&gt;transaction.done;</div><div class='del'>-			afr_unlock (frame, this);</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='add'>+    afr_restore_lk_owner(frame);</div><div class='ctx'> </div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='add'>+    afr_handle_symmetric_errors(frame, this);</div><div class='ctx'> </div><div class='add'>+    if (!local-&gt;pre_op_compat)</div><div class='add'>+        /* new mode, pre-op was done along</div><div class='add'>+           with OP */</div><div class='add'>+        afr_changelog_pre_op_update(frame, this);</div><div class='add'>+</div><div class='add'>+    afr_changelog_post_op(frame, this);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> /**</div><div class='ctx'>  * afr_transaction_fop_failed - inform that an fop failed</div><div class='ctx'>  */</div><div class='ctx'> </div><div class='ctx'> void</div><div class='del'>-afr_transaction_fop_failed (call_frame_t *frame, xlator_t *this, int child_index)</div><div class='add'>+afr_transaction_fop_failed(call_frame_t *frame, xlator_t *this, int child_index)</div><div class='ctx'> {</div><div class='del'>-	afr_local_t *   local = NULL;</div><div class='del'>-	afr_private_t * priv  = NULL;</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='ctx'> </div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-	priv  = this-&gt;private;</div><div class='add'>+    local = frame-&gt;local;</div><div class='ctx'> </div><div class='del'>-        switch (local-&gt;op) {</div><div class='del'>-        case GF_FOP_WRITE:</div><div class='del'>-                __mark_fop_failed_on_fd (local-&gt;fd, this, child_index);</div><div class='del'>-                break;</div><div class='del'>-        default:</div><div class='del'>-                __mark_child_dead (local-&gt;pending, priv-&gt;child_count,</div><div class='del'>-                                   child_index, local-&gt;transaction.type);</div><div class='del'>-                break;</div><div class='del'>-        }</div><div class='add'>+    local-&gt;transaction.failed_subvols[child_index] = 1;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-afr_transaction (call_frame_t *frame, xlator_t *this, afr_transaction_type type)</div><div class='add'>+static gf_boolean_t</div><div class='add'>+__need_previous_lock_unlocked(afr_local_t *local)</div><div class='ctx'> {</div><div class='del'>-	afr_local_t *   local = NULL;</div><div class='del'>-	afr_private_t * priv  = NULL;</div><div class='del'>-</div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-	priv  = this-&gt;private;</div><div class='add'>+    afr_lock_t *lock = NULL;</div><div class='add'>+</div><div class='add'>+    lock = &amp;local-&gt;inode_ctx-&gt;lock[local-&gt;transaction.type];</div><div class='add'>+    if (!lock-&gt;acquired)</div><div class='add'>+        return _gf_false;</div><div class='add'>+    if (lock-&gt;acquired &amp;&amp; lock-&gt;event_generation != local-&gt;event_generation)</div><div class='add'>+        return _gf_true;</div><div class='add'>+    return _gf_false;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	afr_transaction_local_init (local, priv);</div><div class='add'>+void</div><div class='add'>+__afr_eager_lock_handle(afr_local_t *local, gf_boolean_t *take_lock,</div><div class='add'>+                        gf_boolean_t *do_pre_op, afr_local_t **timer_local)</div><div class='add'>+{</div><div class='add'>+    afr_lock_t *lock = NULL;</div><div class='add'>+    afr_local_t *owner_local = NULL;</div><div class='add'>+    xlator_t *this = local-&gt;transaction.frame-&gt;this;</div><div class='add'>+</div><div class='add'>+    local-&gt;transaction.eager_lock_on = _gf_true;</div><div class='add'>+    afr_set_lk_owner(local-&gt;transaction.frame, this, local-&gt;inode);</div><div class='add'>+</div><div class='add'>+    lock = &amp;local-&gt;inode_ctx-&gt;lock[local-&gt;transaction.type];</div><div class='add'>+    if (__need_previous_lock_unlocked(local)) {</div><div class='add'>+        if (!list_empty(&amp;lock-&gt;owners)) {</div><div class='add'>+            lock-&gt;release = _gf_true;</div><div class='add'>+        } else if (lock-&gt;delay_timer) {</div><div class='add'>+            lock-&gt;release = _gf_true;</div><div class='add'>+            if (gf_timer_call_cancel(this-&gt;ctx, lock-&gt;delay_timer)) {</div><div class='add'>+                /* It will be put in frozen list</div><div class='add'>+                 * in the code flow below*/</div><div class='add'>+            } else {</div><div class='add'>+                *timer_local = list_entry(lock-&gt;post_op.next, afr_local_t,</div><div class='add'>+                                          transaction.owner_list);</div><div class='add'>+                lock-&gt;delay_timer = NULL;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (lock-&gt;release) {</div><div class='add'>+        list_add_tail(&amp;local-&gt;transaction.wait_list, &amp;lock-&gt;frozen);</div><div class='add'>+        *take_lock = _gf_false;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (lock-&gt;delay_timer) {</div><div class='add'>+        *take_lock = _gf_false;</div><div class='add'>+        if (gf_timer_call_cancel(this-&gt;ctx, lock-&gt;delay_timer)) {</div><div class='add'>+            list_add_tail(&amp;local-&gt;transaction.wait_list, &amp;lock-&gt;frozen);</div><div class='add'>+        } else {</div><div class='add'>+            *timer_local = list_entry(lock-&gt;post_op.next, afr_local_t,</div><div class='add'>+                                      transaction.owner_list);</div><div class='add'>+            afr_copy_inodelk_vars(&amp;local-&gt;internal_lock,</div><div class='add'>+                                  &amp;(*timer_local)-&gt;internal_lock, this, 0);</div><div class='add'>+            lock-&gt;delay_timer = NULL;</div><div class='add'>+            *do_pre_op = _gf_true;</div><div class='add'>+            list_add_tail(&amp;local-&gt;transaction.owner_list, &amp;lock-&gt;owners);</div><div class='add'>+        }</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (!list_empty(&amp;lock-&gt;owners)) {</div><div class='add'>+        if (!lock-&gt;acquired || afr_has_lock_conflict(local, _gf_true)) {</div><div class='add'>+            list_add_tail(&amp;local-&gt;transaction.wait_list, &amp;lock-&gt;waiting);</div><div class='add'>+            *take_lock = _gf_false;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+        owner_local = list_entry(lock-&gt;owners.next, afr_local_t,</div><div class='add'>+                                 transaction.owner_list);</div><div class='add'>+        afr_copy_inodelk_vars(&amp;local-&gt;internal_lock,</div><div class='add'>+                              &amp;owner_local-&gt;internal_lock, this, 0);</div><div class='add'>+        *take_lock = _gf_false;</div><div class='add'>+        *do_pre_op = _gf_true;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (lock-&gt;acquired)</div><div class='add'>+        GF_ASSERT(!(*take_lock));</div><div class='add'>+    list_add_tail(&amp;local-&gt;transaction.owner_list, &amp;lock-&gt;owners);</div><div class='add'>+out:</div><div class='add'>+    return;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	local-&gt;transaction.resume = afr_transaction_resume;</div><div class='del'>-	local-&gt;transaction.type   = type;</div><div class='add'>+void</div><div class='add'>+afr_transaction_start(afr_local_t *local, xlator_t *this)</div><div class='add'>+{</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    gf_boolean_t take_lock = _gf_true;</div><div class='add'>+    gf_boolean_t do_pre_op = _gf_false;</div><div class='add'>+    afr_local_t *timer_local = NULL;</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    if (local-&gt;transaction.type != AFR_DATA_TRANSACTION &amp;&amp;</div><div class='add'>+        local-&gt;transaction.type != AFR_METADATA_TRANSACTION)</div><div class='add'>+        goto lock_phase;</div><div class='add'>+</div><div class='add'>+    if (!priv-&gt;eager_lock)</div><div class='add'>+        goto lock_phase;</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;local-&gt;inode-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        __afr_eager_lock_handle(local, &amp;take_lock, &amp;do_pre_op, &amp;timer_local);</div><div class='add'>+    }</div><div class='add'>+    UNLOCK(&amp;local-&gt;inode-&gt;lock);</div><div class='add'>+lock_phase:</div><div class='add'>+    if (!local-&gt;transaction.eager_lock_on) {</div><div class='add'>+        afr_set_lk_owner(local-&gt;transaction.frame, this,</div><div class='add'>+                         local-&gt;transaction.frame-&gt;root);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (take_lock) {</div><div class='add'>+        afr_lock(local-&gt;transaction.frame, this);</div><div class='add'>+    } else if (do_pre_op) {</div><div class='add'>+        afr_changelog_pre_op(local-&gt;transaction.frame, this);</div><div class='add'>+    }</div><div class='add'>+    /*Always call delayed_changelog_wake_up_cbk after calling pre-op above</div><div class='add'>+     * so that any inheriting can happen*/</div><div class='add'>+    if (timer_local)</div><div class='add'>+        afr_delayed_changelog_wake_up_cbk(timer_local);</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	if (afr_lock_server_count (priv, local-&gt;transaction.type) == 0) {</div><div class='del'>-		if (__changelog_needed_pre_op (frame, this)) {</div><div class='del'>-			afr_changelog_pre_op (frame, this);</div><div class='del'>-		} else {</div><div class='del'>-                        __mark_all_success (local-&gt;pending, priv-&gt;child_count,</div><div class='del'>-                                            local-&gt;transaction.type);</div><div class='add'>+int</div><div class='add'>+afr_write_txn_refresh_done(call_frame_t *frame, xlator_t *this, int err)</div><div class='add'>+{</div><div class='add'>+    afr_local_t *local = frame-&gt;local;</div><div class='add'>+</div><div class='add'>+    if (err) {</div><div class='add'>+        AFR_SET_ERROR_AND_CHECK_SPLIT_BRAIN(-1, err);</div><div class='add'>+        goto fail;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    afr_transaction_start(local, this);</div><div class='add'>+    return 0;</div><div class='add'>+fail:</div><div class='add'>+    local-&gt;transaction.unwind(frame, this);</div><div class='add'>+    AFR_STACK_DESTROY(frame);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-                        afr_pid_restore (frame);</div><div class='add'>+int</div><div class='add'>+afr_transaction_lockee_init(call_frame_t *frame)</div><div class='add'>+{</div><div class='add'>+    afr_local_t *local = frame-&gt;local;</div><div class='add'>+    afr_internal_lock_t *int_lock = &amp;local-&gt;internal_lock;</div><div class='add'>+    afr_private_t *priv = frame-&gt;this-&gt;private;</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    switch (local-&gt;transaction.type) {</div><div class='add'>+        case AFR_DATA_TRANSACTION:</div><div class='add'>+        case AFR_METADATA_TRANSACTION:</div><div class='add'>+            ret = afr_add_inode_lockee(local, priv-&gt;child_count);</div><div class='add'>+            break;</div><div class='add'>+</div><div class='add'>+        case AFR_ENTRY_TRANSACTION:</div><div class='add'>+        case AFR_ENTRY_RENAME_TRANSACTION:</div><div class='add'>+            ret = afr_add_entry_lockee(local, &amp;local-&gt;transaction.parent_loc,</div><div class='add'>+                                       local-&gt;transaction.basename,</div><div class='add'>+                                       priv-&gt;child_count);</div><div class='add'>+            if (ret) {</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+            if (local-&gt;op == GF_FOP_RENAME) {</div><div class='add'>+                ret = afr_add_entry_lockee(</div><div class='add'>+                    local, &amp;local-&gt;transaction.new_parent_loc,</div><div class='add'>+                    local-&gt;transaction.new_basename, priv-&gt;child_count);</div><div class='add'>+                if (ret) {</div><div class='add'>+                    goto out;</div><div class='add'>+                }</div><div class='ctx'> </div><div class='del'>-			local-&gt;transaction.fop (frame, this);</div><div class='del'>-		}</div><div class='del'>-	} else {</div><div class='del'>-		afr_lock (frame, this);</div><div class='del'>-	}</div><div class='add'>+                if (local-&gt;newloc.inode &amp;&amp;</div><div class='add'>+                    IA_ISDIR(local-&gt;newloc.inode-&gt;ia_type)) {</div><div class='add'>+                    ret = afr_add_entry_lockee(local, &amp;local-&gt;newloc, NULL,</div><div class='add'>+                                               priv-&gt;child_count);</div><div class='add'>+                    if (ret) {</div><div class='add'>+                        goto out;</div><div class='add'>+                    }</div><div class='add'>+                }</div><div class='add'>+            } else if (local-&gt;op == GF_FOP_RMDIR) {</div><div class='add'>+                ret = afr_add_entry_lockee(local, &amp;local-&gt;loc, NULL,</div><div class='add'>+                                           priv-&gt;child_count);</div><div class='add'>+                if (ret) {</div><div class='add'>+                    goto out;</div><div class='add'>+                }</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            if (int_lock-&gt;lockee_count &gt; 1) {</div><div class='add'>+                qsort(int_lock-&gt;lockee, int_lock-&gt;lockee_count,</div><div class='add'>+                      sizeof(*int_lock-&gt;lockee), afr_entry_lockee_cmp);</div><div class='add'>+            }</div><div class='add'>+            break;</div><div class='add'>+    }</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	return 0;</div><div class='add'>+int</div><div class='add'>+afr_transaction(call_frame_t *frame, xlator_t *this, afr_transaction_type type)</div><div class='add'>+{</div><div class='add'>+    afr_local_t *local = NULL;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int event_generation = 0;</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+    local-&gt;transaction.frame = frame;</div><div class='add'>+</div><div class='add'>+    local-&gt;transaction.type = type;</div><div class='add'>+</div><div class='add'>+    if (priv-&gt;quorum_count &amp;&amp; !afr_has_quorum(local-&gt;child_up, this, NULL)) {</div><div class='add'>+        ret = -afr_quorum_errno(priv);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (!afr_is_consistent_io_possible(local, priv, &amp;ret)) {</div><div class='add'>+        ret = -ret; /*op_errno to ret conversion*/</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (priv-&gt;thin_arbiter_count &amp;&amp; !afr_ta_has_quorum(priv, local)) {</div><div class='add'>+        ret = -afr_quorum_errno(priv);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = afr_transaction_local_init(local, this);</div><div class='add'>+    if (ret &lt; 0)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    ret = afr_transaction_lockee_init(frame);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    if (type != AFR_METADATA_TRANSACTION) {</div><div class='add'>+        goto txn_start;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = afr_inode_get_readable(frame, local-&gt;inode, this, local-&gt;readable,</div><div class='add'>+                                 &amp;event_generation, type);</div><div class='add'>+    if (ret &lt; 0 ||</div><div class='add'>+        afr_is_inode_refresh_reqd(local-&gt;inode, this, priv-&gt;event_generation,</div><div class='add'>+                                  event_generation)) {</div><div class='add'>+        afr_inode_refresh(frame, this, local-&gt;inode, local-&gt;loc.gfid,</div><div class='add'>+                          afr_write_txn_refresh_done);</div><div class='add'>+        ret = 0;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+txn_start:</div><div class='add'>+    ret = 0;</div><div class='add'>+    afr_transaction_start(local, this);</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='head'>diff --git a/xlators/cluster/afr/src/afr-transaction.h b/xlators/cluster/afr/src/afr-transaction.h<br/>index 0d3d4443e30..beefa26f4a6 100644<br/>--- a/<a href='/cgit/glusterfs.git/tree/xlators/cluster/afr/src/afr-transaction.h?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/cluster/afr/src/afr-transaction.h</a><br/>+++ b/<a href='/cgit/glusterfs.git/tree/xlators/cluster/afr/src/afr-transaction.h?id=d1d7a6f35c816822fab51c820e25023863c239c1'>xlators/cluster/afr/src/afr-transaction.h</a></div><div class='hunk'>@@ -1,33 +1,75 @@</div><div class='ctx'> /*</div><div class='del'>-   Copyright (c) 2007-2009 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='del'>-   This file is part of GlusterFS.</div><div class='del'>-</div><div class='del'>-   GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-   it under the terms of the GNU General Public License as published</div><div class='del'>-   by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-   or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-   GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-   WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-   General Public License for more details.</div><div class='del'>-</div><div class='del'>-   You should have received a copy of the GNU General Public License</div><div class='del'>-   along with this program.  If not, see</div><div class='del'>-   &lt;http://www.gnu.org/licenses/&gt;.</div><div class='add'>+  Copyright (c) 2008-2012 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='ctx'> */</div><div class='ctx'> </div><div class='ctx'> #ifndef __TRANSACTION_H__</div><div class='ctx'> #define __TRANSACTION_H__</div><div class='ctx'> </div><div class='add'>+#include "afr.h"</div><div class='add'>+</div><div class='ctx'> void</div><div class='del'>-afr_transaction_fop_failed (call_frame_t *frame, xlator_t *this,</div><div class='del'>-			    int child_index);</div><div class='add'>+afr_transaction_fop_failed(call_frame_t *frame, xlator_t *this,</div><div class='add'>+                           int child_index);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+afr_transaction(call_frame_t *frame, xlator_t *this, afr_transaction_type type);</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-afr_lock_server_count (afr_private_t *priv, afr_transaction_type type);</div><div class='add'>+afr_set_pending_dict(afr_private_t *priv, dict_t *xattr, int32_t **pending);</div><div class='ctx'> </div><div class='del'>-int32_t</div><div class='del'>-afr_transaction (call_frame_t *frame, xlator_t *this, afr_transaction_type type);</div><div class='add'>+void</div><div class='add'>+afr_delayed_changelog_wake_up(xlator_t *this, fd_t *fd);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+__mark_all_success(call_frame_t *frame, xlator_t *this);</div><div class='add'>+</div><div class='add'>+gf_boolean_t</div><div class='add'>+afr_txn_nothing_failed(call_frame_t *frame, xlator_t *this);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+afr_read_txn(call_frame_t *frame, xlator_t *this, inode_t *inode,</div><div class='add'>+             afr_read_txn_wind_t readfn, afr_transaction_type type);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+afr_read_txn_continue(call_frame_t *frame, xlator_t *this, int subvol);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+afr_pending_read_increment(afr_private_t *priv, int child_index);</div><div class='ctx'> </div><div class='add'>+void</div><div class='add'>+afr_pending_read_decrement(afr_private_t *priv, int child_index);</div><div class='add'>+</div><div class='add'>+call_frame_t *</div><div class='add'>+afr_transaction_detach_fop_frame(call_frame_t *frame);</div><div class='add'>+gf_boolean_t</div><div class='add'>+afr_has_quorum(unsigned char *subvols, xlator_t *this, call_frame_t *frame);</div><div class='add'>+gf_boolean_t</div><div class='add'>+afr_needs_changelog_update(afr_local_t *local);</div><div class='add'>+void</div><div class='add'>+afr_zero_fill_stat(afr_local_t *local);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+afr_pick_error_xdata(afr_local_t *local, afr_private_t *priv, inode_t *inode1,</div><div class='add'>+                     unsigned char *readable1, inode_t *inode2,</div><div class='add'>+                     unsigned char *readable2);</div><div class='add'>+int</div><div class='add'>+afr_transaction_resume(call_frame_t *frame, xlator_t *this);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+afr_lock(call_frame_t *frame, xlator_t *this);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+afr_delayed_changelog_wake_up_cbk(void *data);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+afr_release_notify_lock_for_ta(void *opaque);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+afr_ta_lock_release_done(int ret, call_frame_t *ta_frame, void *opaque);</div><div class='ctx'> #endif /* __TRANSACTION_H__ */</div><div class='head'>diff --git a/xlators/cluster/afr/src/afr.c b/xlators/cluster/afr/src/afr.c<br/>index e1154f9d154..df7366f0a65 100644<br/>--- a/<a href='/cgit/glusterfs.git/tree/xlators/cluster/afr/src/afr.c?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/cluster/afr/src/afr.c</a><br/>+++ b/<a href='/cgit/glusterfs.git/tree/xlators/cluster/afr/src/afr.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>xlators/cluster/afr/src/afr.c</a></div><div class='hunk'>@@ -1,20 +1,11 @@</div><div class='ctx'> /*</div><div class='del'>-   Copyright (c) 2007-2009 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='del'>-   This file is part of GlusterFS.</div><div class='del'>-</div><div class='del'>-   GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-   it under the terms of the GNU General Public License as published</div><div class='del'>-   by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-   or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-   GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-   WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-   General Public License for more details.</div><div class='del'>-</div><div class='del'>-   You should have received a copy of the GNU General Public License</div><div class='del'>-   along with this program.  If not, see</div><div class='del'>-   &lt;http://www.gnu.org/licenses/&gt;.</div><div class='add'>+  Copyright (c) 2008-2012 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='ctx'> */</div><div class='ctx'> </div><div class='ctx'> #include &lt;libgen.h&gt;</div><div class='hunk'>@@ -24,522 +15,1330 @@</div><div class='ctx'> #include &lt;stdlib.h&gt;</div><div class='ctx'> #include &lt;signal.h&gt;</div><div class='ctx'> </div><div class='del'>-#ifndef _CONFIG_H</div><div class='del'>-#define _CONFIG_H</div><div class='del'>-#include "config.h"</div><div class='del'>-#endif</div><div class='ctx'> #include "afr-common.c"</div><div class='add'>+#include "afr-messages.h"</div><div class='add'>+</div><div class='add'>+struct volume_options options[];</div><div class='add'>+</div><div class='add'>+static char *afr_favorite_child_policies[AFR_FAV_CHILD_POLICY_MAX + 1] = {</div><div class='add'>+    [AFR_FAV_CHILD_NONE] = "none",</div><div class='add'>+    [AFR_FAV_CHILD_BY_SIZE] = "size",</div><div class='add'>+    [AFR_FAV_CHILD_BY_CTIME] = "ctime",</div><div class='add'>+    [AFR_FAV_CHILD_BY_MTIME] = "mtime",</div><div class='add'>+    [AFR_FAV_CHILD_BY_MAJORITY] = "majority",</div><div class='add'>+    [AFR_FAV_CHILD_POLICY_MAX] = NULL,</div><div class='add'>+};</div><div class='ctx'> </div><div class='ctx'> int32_t</div><div class='del'>-notify (xlator_t *this, int32_t event,</div><div class='del'>-	void *data, ...)</div><div class='add'>+notify(xlator_t *this, int32_t event, void *data, ...)</div><div class='ctx'> {</div><div class='del'>-        int ret = -1;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    va_list ap;</div><div class='add'>+    void *data2 = NULL;</div><div class='ctx'> </div><div class='del'>-        ret = afr_notify (this, event, data);</div><div class='add'>+    va_start(ap, data);</div><div class='add'>+    data2 = va_arg(ap, dict_t *);</div><div class='add'>+    va_end(ap);</div><div class='add'>+    ret = afr_notify(this, event, data, data2);</div><div class='ctx'> </div><div class='del'>-        return ret;</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> int32_t</div><div class='del'>-mem_acct_init (xlator_t *this)</div><div class='add'>+mem_acct_init(xlator_t *this)</div><div class='ctx'> {</div><div class='del'>-        int     ret = -1;</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    if (!this)</div><div class='add'>+        return ret;</div><div class='ctx'> </div><div class='del'>-        if (!this)</div><div class='del'>-                return ret;</div><div class='add'>+    ret = xlator_mem_acct_init(this, gf_afr_mt_end + 1);</div><div class='ctx'> </div><div class='del'>-        ret = xlator_mem_acct_init (this, gf_afr_mt_end + 1);</div><div class='add'>+    if (ret != 0) {</div><div class='add'>+        return ret;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        if (ret != 0) {</div><div class='del'>-                gf_log(this-&gt;name, GF_LOG_ERROR, "Memory accounting init"</div><div class='del'>-                                "failed");</div><div class='del'>-                return ret;</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+xlator_subvolume_index(xlator_t *this, xlator_t *subvol)</div><div class='add'>+{</div><div class='add'>+    int index = -1;</div><div class='add'>+    int i = 0;</div><div class='add'>+    xlator_list_t *list = NULL;</div><div class='add'>+</div><div class='add'>+    list = this-&gt;children;</div><div class='add'>+</div><div class='add'>+    while (list) {</div><div class='add'>+        if (subvol == list-&gt;xlator ||</div><div class='add'>+            strcmp(subvol-&gt;name, list-&gt;xlator-&gt;name) == 0) {</div><div class='add'>+            index = i;</div><div class='add'>+            break;</div><div class='ctx'>         }</div><div class='add'>+        list = list-&gt;next;</div><div class='add'>+        i++;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        return ret;</div><div class='add'>+    return index;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+static void</div><div class='add'>+fix_quorum_options(xlator_t *this, afr_private_t *priv, char *qtype,</div><div class='add'>+                   dict_t *options)</div><div class='add'>+{</div><div class='add'>+    if (dict_get_sizen(options, "quorum-type") == NULL) {</div><div class='add'>+        /* If user doesn't configure anything enable auto-quorum if the</div><div class='add'>+         * replica has more than two subvolumes */</div><div class='add'>+        if (priv-&gt;child_count &gt; 2)</div><div class='add'>+            qtype = "auto";</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (priv-&gt;quorum_count &amp;&amp; strcmp(qtype, "fixed")) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_WARNING, 0, AFR_MSG_QUORUM_OVERRIDE,</div><div class='add'>+               "quorum-type %s overriding quorum-count %u", qtype,</div><div class='add'>+               priv-&gt;quorum_count);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (!strcmp(qtype, "none")) {</div><div class='add'>+        priv-&gt;quorum_count = 0;</div><div class='add'>+    } else if (!strcmp(qtype, "auto")) {</div><div class='add'>+        priv-&gt;quorum_count = AFR_QUORUM_AUTO;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-static const char *favorite_child_warning_str = "You have specified subvolume '%s' "</div><div class='del'>-	"as the 'favorite child'. This means that if a discrepancy in the content "</div><div class='del'>-	"or attributes (ownership, permission, etc.) of a file is detected among "</div><div class='del'>-	"the subvolumes, the file on '%s' will be considered the definitive "</div><div class='del'>-	"version and its contents will OVERWRITE the contents of the file on other "</div><div class='del'>-	"subvolumes. All versions of the file except that on '%s' "</div><div class='del'>-	"WILL BE LOST.";</div><div class='del'>-</div><div class='del'>-static const char *no_lock_servers_warning_str = "You have set lock-server-count = 0. "</div><div class='del'>-	"This means correctness is NO LONGER GUARANTEED in all cases. If two or more "</div><div class='del'>-	"applications write to the same region of a file, there is a possibility that "</div><div class='del'>-	"its copies will be INCONSISTENT. Set it to a value greater than 0 unless you "</div><div class='del'>-	"are ABSOLUTELY SURE of what you are doing and WILL NOT HOLD GlusterFS "</div><div class='del'>-	"RESPONSIBLE for inconsistent data. If you are in doubt, set it to a value "</div><div class='del'>-	"greater than 0.";</div><div class='del'>-</div><div class='del'>-int32_t </div><div class='del'>-init (xlator_t *this)</div><div class='add'>+int</div><div class='add'>+afr_set_favorite_child_policy(afr_private_t *priv, char *policy)</div><div class='ctx'> {</div><div class='del'>-	afr_private_t * priv        = NULL;</div><div class='del'>-	int             child_count = 0;</div><div class='del'>-	xlator_list_t * trav        = NULL;</div><div class='del'>-	int             i           = 0;</div><div class='del'>-	int             ret         = -1;</div><div class='del'>-	int             op_errno    = 0;</div><div class='del'>-</div><div class='del'>-	char * read_subvol     = NULL;</div><div class='del'>-	char * fav_child       = NULL;</div><div class='del'>-	char * self_heal       = NULL;</div><div class='del'>-        char * algo            = NULL;</div><div class='del'>-	char * change_log      = NULL;</div><div class='del'>-	char * strict_readdir  = NULL;</div><div class='del'>-        char * inodelk_trace   = NULL;</div><div class='del'>-        char * entrylk_trace   = NULL;</div><div class='del'>-</div><div class='del'>-        int32_t background_count  = 0;</div><div class='del'>-	int32_t lock_server_count = 1;</div><div class='del'>-        int32_t window_size       = 0;</div><div class='del'>-</div><div class='del'>-	int    fav_ret       = -1;</div><div class='del'>-	int    read_ret      = -1;</div><div class='del'>-	int    dict_ret      = -1;</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-	if (!this-&gt;children) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-			"replicate translator needs more than one "</div><div class='del'>-                        "subvolume defined.");</div><div class='del'>-		return -1;</div><div class='del'>-	}</div><div class='del'>-  </div><div class='del'>-	if (!this-&gt;parents) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_WARNING,</div><div class='del'>-			"Volume is dangling.");</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-	ALLOC_OR_GOTO (this-&gt;private, afr_private_t, out);</div><div class='del'>-</div><div class='del'>-	priv = this-&gt;private;</div><div class='del'>-</div><div class='del'>-	read_ret = dict_get_str (this-&gt;options, "read-subvolume", &amp;read_subvol);</div><div class='del'>-	priv-&gt;read_child = -1;</div><div class='del'>-</div><div class='del'>-	fav_ret = dict_get_str (this-&gt;options, "favorite-child", &amp;fav_child);</div><div class='del'>-	priv-&gt;favorite_child = -1;</div><div class='del'>-</div><div class='del'>-        priv-&gt;background_self_heal_count = 16;</div><div class='del'>-</div><div class='del'>-	dict_ret = dict_get_int32 (this-&gt;options, "background-self-heal-count",</div><div class='del'>-				   &amp;background_count);</div><div class='del'>-	if (dict_ret == 0) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-			"Setting background self-heal count to %d",</div><div class='del'>-			background_count);</div><div class='del'>-</div><div class='del'>-		priv-&gt;background_self_heal_count = background_count;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	/* Default values */</div><div class='del'>-</div><div class='del'>-	priv-&gt;data_self_heal     = 1;</div><div class='del'>-	priv-&gt;metadata_self_heal = 1;</div><div class='del'>-	priv-&gt;entry_self_heal    = 1;</div><div class='del'>-</div><div class='del'>-	dict_ret = dict_get_str (this-&gt;options, "data-self-heal", &amp;self_heal);</div><div class='del'>-	if (dict_ret == 0) {</div><div class='del'>-		ret = gf_string2boolean (self_heal, &amp;priv-&gt;data_self_heal);</div><div class='del'>-		if (ret &lt; 0) {</div><div class='del'>-			gf_log (this-&gt;name, GF_LOG_WARNING,</div><div class='del'>-				"Invalid 'option data-self-heal %s'. "</div><div class='del'>-				"Defaulting to data-self-heal as 'on'",</div><div class='del'>-				self_heal);</div><div class='del'>-			priv-&gt;data_self_heal = 1;</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-        priv-&gt;data_self_heal_algorithm = "";</div><div class='del'>-</div><div class='del'>-        dict_ret = dict_get_str (this-&gt;options, "data-self-heal-algorithm",</div><div class='del'>-                                 &amp;algo);</div><div class='del'>-        if (dict_ret == 0) {</div><div class='del'>-                priv-&gt;data_self_heal_algorithm = gf_strdup (algo);</div><div class='del'>-        }</div><div class='add'>+    int index = -1;</div><div class='ctx'> </div><div class='add'>+    index = gf_get_index_by_elem(afr_favorite_child_policies, policy);</div><div class='add'>+    if (index &lt; 0 || index &gt;= AFR_FAV_CHILD_POLICY_MAX)</div><div class='add'>+        return -1;</div><div class='ctx'> </div><div class='del'>-        priv-&gt;data_self_heal_window_size = 16;</div><div class='del'>-</div><div class='del'>-	dict_ret = dict_get_int32 (this-&gt;options, "data-self-heal-window-size",</div><div class='del'>-				   &amp;window_size);</div><div class='del'>-	if (dict_ret == 0) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-			"Setting data self-heal window size to %d",</div><div class='del'>-			window_size);</div><div class='del'>-</div><div class='del'>-		priv-&gt;data_self_heal_window_size = window_size;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	dict_ret = dict_get_str (this-&gt;options, "metadata-self-heal",</div><div class='del'>-				 &amp;self_heal);</div><div class='del'>-	if (dict_ret == 0) {</div><div class='del'>-		ret = gf_string2boolean (self_heal, &amp;priv-&gt;metadata_self_heal);</div><div class='del'>-		if (ret &lt; 0) {</div><div class='del'>-			gf_log (this-&gt;name, GF_LOG_WARNING,</div><div class='del'>-				"Invalid 'option metadata-self-heal %s'. "</div><div class='del'>-				"Defaulting to metadata-self-heal as 'on'.", </div><div class='del'>-				self_heal);</div><div class='del'>-			priv-&gt;metadata_self_heal = 1;</div><div class='del'>-		} </div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	dict_ret = dict_get_str (this-&gt;options, "entry-self-heal", &amp;self_heal);</div><div class='del'>-	if (dict_ret == 0) {</div><div class='del'>-		ret = gf_string2boolean (self_heal, &amp;priv-&gt;entry_self_heal);</div><div class='del'>-		if (ret &lt; 0) {</div><div class='del'>-			gf_log (this-&gt;name, GF_LOG_WARNING,</div><div class='del'>-				"Invalid 'option entry-self-heal %s'. "</div><div class='del'>-				"Defaulting to entry-self-heal as 'on'.", </div><div class='del'>-				self_heal);</div><div class='del'>-			priv-&gt;entry_self_heal = 1;</div><div class='del'>-		} </div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	/* Change log options */</div><div class='del'>-</div><div class='del'>-	priv-&gt;data_change_log     = 1;</div><div class='del'>-	priv-&gt;metadata_change_log = 1;</div><div class='del'>-	priv-&gt;entry_change_log    = 1;</div><div class='del'>-</div><div class='del'>-	dict_ret = dict_get_str (this-&gt;options, "data-change-log",</div><div class='del'>-				 &amp;change_log);</div><div class='del'>-	if (dict_ret == 0) {</div><div class='del'>-		ret = gf_string2boolean (change_log, &amp;priv-&gt;data_change_log);</div><div class='del'>-		if (ret &lt; 0) {</div><div class='del'>-			gf_log (this-&gt;name, GF_LOG_WARNING,</div><div class='del'>-				"Invalid 'option data-change-log %s'. "</div><div class='del'>-				"Defaulting to data-change-log as 'on'.", </div><div class='del'>-				change_log);</div><div class='del'>-			priv-&gt;data_change_log = 1;</div><div class='del'>-		} </div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	dict_ret = dict_get_str (this-&gt;options, "metadata-change-log",</div><div class='del'>-				 &amp;change_log);</div><div class='del'>-	if (dict_ret == 0) {</div><div class='del'>-		ret = gf_string2boolean (change_log,</div><div class='del'>-					 &amp;priv-&gt;metadata_change_log);</div><div class='del'>-		if (ret &lt; 0) {</div><div class='del'>-			gf_log (this-&gt;name, GF_LOG_WARNING,</div><div class='del'>-				"Invalid 'option metadata-change-log %s'. "</div><div class='del'>-				"Defaulting to metadata-change-log as 'off'.",</div><div class='del'>-				change_log);</div><div class='del'>-			priv-&gt;metadata_change_log = 0;</div><div class='del'>-		} </div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	dict_ret = dict_get_str (this-&gt;options, "entry-change-log",</div><div class='del'>-				 &amp;change_log);</div><div class='del'>-	if (dict_ret == 0) {</div><div class='del'>-		ret = gf_string2boolean (change_log, &amp;priv-&gt;entry_change_log);</div><div class='del'>-		if (ret &lt; 0) {</div><div class='del'>-			gf_log (this-&gt;name, GF_LOG_WARNING,</div><div class='del'>-				"Invalid 'option entry-change-log %s'. "</div><div class='del'>-				"Defaulting to entry-change-log as 'on'.", </div><div class='del'>-				change_log);</div><div class='del'>-			priv-&gt;entry_change_log = 1;</div><div class='del'>-		} </div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	/* Locking options */</div><div class='del'>-</div><div class='del'>-        priv-&gt;inodelk_trace = 0;</div><div class='del'>-        priv-&gt;entrylk_trace = 0;</div><div class='del'>-</div><div class='del'>-	dict_ret = dict_get_str (this-&gt;options, "inodelk-trace",</div><div class='del'>-				 &amp;inodelk_trace);</div><div class='del'>-	if (dict_ret == 0) {</div><div class='del'>-		ret = gf_string2boolean (inodelk_trace, &amp;priv-&gt;inodelk_trace);</div><div class='del'>-		if (ret &lt; 0) {</div><div class='del'>-			gf_log (this-&gt;name, GF_LOG_WARNING,</div><div class='del'>-				"Invalid 'option inodelk-trace %s' ",</div><div class='del'>-                                inodelk_trace);</div><div class='del'>-</div><div class='del'>-			priv-&gt;inodelk_trace = 0;</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-	dict_ret = dict_get_str (this-&gt;options, "entrylk-trace",</div><div class='del'>-				 &amp;entrylk_trace);</div><div class='del'>-	if (dict_ret == 0) {</div><div class='del'>-		ret = gf_string2boolean (entrylk_trace, &amp;priv-&gt;entrylk_trace);</div><div class='del'>-		if (ret &lt; 0) {</div><div class='del'>-			gf_log (this-&gt;name, GF_LOG_WARNING,</div><div class='del'>-				"Invalid 'option entrylk-trace %s' ",</div><div class='del'>-                                inodelk_trace);</div><div class='del'>-</div><div class='del'>-			priv-&gt;entrylk_trace = 0;</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-	priv-&gt;data_lock_server_count = 1;</div><div class='del'>-	priv-&gt;metadata_lock_server_count = 0;</div><div class='del'>-	priv-&gt;entry_lock_server_count = 1;</div><div class='del'>-</div><div class='del'>-	dict_ret = dict_get_int32 (this-&gt;options, "data-lock-server-count", </div><div class='del'>-				   &amp;lock_server_count);</div><div class='del'>-	if (dict_ret == 0) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-			"Setting data lock server count to %d.",</div><div class='del'>-			lock_server_count);</div><div class='del'>-</div><div class='del'>-		if (lock_server_count == 0) </div><div class='del'>-			gf_log (this-&gt;name, GF_LOG_WARNING, "%s",</div><div class='del'>-                                no_lock_servers_warning_str);</div><div class='del'>-</div><div class='del'>-		priv-&gt;data_lock_server_count = lock_server_count;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-	dict_ret = dict_get_int32 (this-&gt;options,</div><div class='del'>-				   "metadata-lock-server-count", </div><div class='del'>-				   &amp;lock_server_count);</div><div class='del'>-	if (dict_ret == 0) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-			"Setting metadata lock server count to %d.",</div><div class='del'>-			lock_server_count);</div><div class='del'>-		priv-&gt;metadata_lock_server_count = lock_server_count;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-	dict_ret = dict_get_int32 (this-&gt;options, "entry-lock-server-count", </div><div class='del'>-				   &amp;lock_server_count);</div><div class='del'>-	if (dict_ret == 0) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-			"Setting entry lock server count to %d.",</div><div class='del'>-			lock_server_count);</div><div class='del'>-</div><div class='del'>-		priv-&gt;entry_lock_server_count = lock_server_count;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	priv-&gt;strict_readdir = _gf_false;</div><div class='del'>-</div><div class='del'>-	dict_ret = dict_get_str (this-&gt;options, "strict-readdir",</div><div class='del'>-				 &amp;strict_readdir);</div><div class='del'>-	if (dict_ret == 0) {</div><div class='del'>-		ret = gf_string2boolean (strict_readdir, &amp;priv-&gt;strict_readdir);</div><div class='del'>-		if (ret &lt; 0) {</div><div class='del'>-			gf_log (this-&gt;name, GF_LOG_WARNING,</div><div class='del'>-				"Invalid 'option strict-readdir %s'. "</div><div class='del'>-				"Defaulting to strict-readdir as 'off'.",</div><div class='del'>-				strict_readdir);</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	trav = this-&gt;children;</div><div class='del'>-	while (trav) {</div><div class='del'>-		if (!read_ret &amp;&amp; !strcmp (read_subvol, trav-&gt;xlator-&gt;name)) {</div><div class='del'>-			gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-				"Subvolume '%s' specified as read child.",</div><div class='del'>-				trav-&gt;xlator-&gt;name);</div><div class='del'>-</div><div class='del'>-			priv-&gt;read_child = child_count;</div><div class='del'>-		}</div><div class='del'>-</div><div class='del'>-		if (fav_ret == 0 &amp;&amp; !strcmp (fav_child, trav-&gt;xlator-&gt;name)) {</div><div class='del'>-			gf_log (this-&gt;name, GF_LOG_WARNING,</div><div class='del'>-				favorite_child_warning_str, trav-&gt;xlator-&gt;name,</div><div class='del'>-				trav-&gt;xlator-&gt;name, trav-&gt;xlator-&gt;name);</div><div class='del'>-			priv-&gt;favorite_child = child_count;</div><div class='del'>-		}</div><div class='del'>-</div><div class='del'>-		child_count++;</div><div class='del'>-		trav = trav-&gt;next;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	priv-&gt;wait_count = 1;</div><div class='del'>-</div><div class='del'>-	priv-&gt;child_count = child_count;</div><div class='del'>-</div><div class='del'>-	LOCK_INIT (&amp;priv-&gt;lock);</div><div class='del'>-        LOCK_INIT (&amp;priv-&gt;read_child_lock);</div><div class='del'>-</div><div class='del'>-	priv-&gt;child_up = GF_CALLOC (sizeof (unsigned char), child_count,</div><div class='del'>-                                    gf_afr_mt_char);</div><div class='del'>-	if (!priv-&gt;child_up) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_ERROR,	</div><div class='del'>-			"Out of memory.");		</div><div class='del'>-		ret = -ENOMEM;</div><div class='del'>-		goto out;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	priv-&gt;children = GF_CALLOC (sizeof (xlator_t *), child_count,</div><div class='del'>-                                    gf_afr_mt_xlator_t);</div><div class='del'>-	if (!priv-&gt;children) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_ERROR,	</div><div class='del'>-			"Out of memory.");		</div><div class='del'>-		ret = -ENOMEM;</div><div class='del'>-		goto out;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-        priv-&gt;pending_key = GF_CALLOC (sizeof (*priv-&gt;pending_key), </div><div class='del'>-                                        child_count,</div><div class='del'>-                                        gf_afr_mt_char);</div><div class='del'>-        if (!priv-&gt;pending_key) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-                        "Out of memory.");</div><div class='add'>+    priv-&gt;fav_child_policy = index;</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+set_data_self_heal_algorithm(afr_private_t *priv, char *algo)</div><div class='add'>+{</div><div class='add'>+    if (!algo) {</div><div class='add'>+        priv-&gt;data_self_heal_algorithm = AFR_SELFHEAL_DATA_DYNAMIC;</div><div class='add'>+    } else if (strcmp(algo, "full") == 0) {</div><div class='add'>+        priv-&gt;data_self_heal_algorithm = AFR_SELFHEAL_DATA_FULL;</div><div class='add'>+    } else if (strcmp(algo, "diff") == 0) {</div><div class='add'>+        priv-&gt;data_self_heal_algorithm = AFR_SELFHEAL_DATA_DIFF;</div><div class='add'>+    } else {</div><div class='add'>+        priv-&gt;data_self_heal_algorithm = AFR_SELFHEAL_DATA_DYNAMIC;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+afr_handle_anon_inode_options(afr_private_t *priv, dict_t *options)</div><div class='add'>+{</div><div class='add'>+    char *volfile_id_str = NULL;</div><div class='add'>+    uuid_t anon_inode_gfid = {0};</div><div class='add'>+</div><div class='add'>+    /*If volume id is not present don't enable anything*/</div><div class='add'>+    if (dict_get_str(options, "volume-id", &amp;volfile_id_str))</div><div class='add'>+        return;</div><div class='add'>+    GF_ASSERT(strlen(AFR_ANON_DIR_PREFIX) + strlen(volfile_id_str) &lt;= NAME_MAX);</div><div class='add'>+    /*anon_inode_name is not supposed to change once assigned*/</div><div class='add'>+    if (!priv-&gt;anon_inode_name[0]) {</div><div class='add'>+        snprintf(priv-&gt;anon_inode_name, sizeof(priv-&gt;anon_inode_name), "%s-%s",</div><div class='add'>+                 AFR_ANON_DIR_PREFIX, volfile_id_str);</div><div class='add'>+        gf_uuid_parse(volfile_id_str, anon_inode_gfid);</div><div class='add'>+        /*Flip a bit to make sure volfile-id and anon-gfid are not same*/</div><div class='add'>+        anon_inode_gfid[0] ^= 1;</div><div class='add'>+        uuid_utoa_r(anon_inode_gfid, priv-&gt;anon_gfid_str);</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+reconfigure(xlator_t *this, dict_t *options)</div><div class='add'>+{</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    xlator_t *read_subvol = NULL;</div><div class='add'>+    int read_subvol_index = -1;</div><div class='add'>+    int timeout_old = 0;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int index = -1;</div><div class='add'>+    char *qtype = NULL;</div><div class='add'>+    char *fav_child_policy = NULL;</div><div class='add'>+    char *data_self_heal = NULL;</div><div class='add'>+    char *data_self_heal_algorithm = NULL;</div><div class='add'>+    char *locking_scheme = NULL;</div><div class='add'>+    gf_boolean_t consistent_io = _gf_false;</div><div class='add'>+    gf_boolean_t choose_local_old = _gf_false;</div><div class='add'>+    gf_boolean_t enabled_old = _gf_false;</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    GF_OPTION_RECONF("metadata-splitbrain-forced-heal",</div><div class='add'>+                     priv-&gt;metadata_splitbrain_forced_heal, options, bool, out);</div><div class='add'>+</div><div class='add'>+    GF_OPTION_RECONF("background-self-heal-count",</div><div class='add'>+                     priv-&gt;background_self_heal_count, options, uint32, out);</div><div class='add'>+</div><div class='add'>+    GF_OPTION_RECONF("heal-wait-queue-length", priv-&gt;heal_wait_qlen, options,</div><div class='add'>+                     uint32, out);</div><div class='add'>+</div><div class='add'>+    GF_OPTION_RECONF("metadata-self-heal", priv-&gt;metadata_self_heal, options,</div><div class='add'>+                     bool, out);</div><div class='add'>+</div><div class='add'>+    GF_OPTION_RECONF("data-self-heal", data_self_heal, options, str, out);</div><div class='add'>+    if (gf_string2boolean(data_self_heal, &amp;priv-&gt;data_self_heal) == -1)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    GF_OPTION_RECONF("entry-self-heal", priv-&gt;entry_self_heal, options, bool,</div><div class='add'>+                     out);</div><div class='add'>+</div><div class='add'>+    GF_OPTION_RECONF("data-self-heal-window-size",</div><div class='add'>+                     priv-&gt;data_self_heal_window_size, options, uint32, out);</div><div class='add'>+</div><div class='add'>+    GF_OPTION_RECONF("data-self-heal-algorithm", data_self_heal_algorithm,</div><div class='add'>+                     options, str, out);</div><div class='add'>+    set_data_self_heal_algorithm(priv, data_self_heal_algorithm);</div><div class='add'>+</div><div class='add'>+    GF_OPTION_RECONF("halo-enabled", priv-&gt;halo_enabled, options, bool, out);</div><div class='add'>+</div><div class='add'>+    GF_OPTION_RECONF("halo-shd-max-latency", priv-&gt;shd.halo_max_latency_msec,</div><div class='add'>+                     options, uint32, out);</div><div class='add'>+</div><div class='add'>+    GF_OPTION_RECONF("halo-nfsd-max-latency", priv-&gt;nfsd.halo_max_latency_msec,</div><div class='add'>+                     options, uint32, out);</div><div class='add'>+</div><div class='add'>+    GF_OPTION_RECONF("halo-max-latency", priv-&gt;halo_max_latency_msec, options,</div><div class='add'>+                     uint32, out);</div><div class='add'>+</div><div class='add'>+    GF_OPTION_RECONF("halo-max-replicas", priv-&gt;halo_max_replicas, options,</div><div class='add'>+                     uint32, out);</div><div class='add'>+</div><div class='add'>+    GF_OPTION_RECONF("halo-min-replicas", priv-&gt;halo_min_replicas, options,</div><div class='add'>+                     uint32, out);</div><div class='add'>+</div><div class='add'>+    GF_OPTION_RECONF("read-subvolume", read_subvol, options, xlator, out);</div><div class='add'>+</div><div class='add'>+    choose_local_old = priv-&gt;choose_local;</div><div class='add'>+    GF_OPTION_RECONF("choose-local", priv-&gt;choose_local, options, bool, out);</div><div class='add'>+</div><div class='add'>+    if (choose_local_old != priv-&gt;choose_local) {</div><div class='add'>+        priv-&gt;read_child = -1;</div><div class='add'>+        if (choose_local_old == _gf_false)</div><div class='add'>+            priv-&gt;did_discovery = _gf_false;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    GF_OPTION_RECONF("read-hash-mode", priv-&gt;hash_mode, options, uint32, out);</div><div class='add'>+</div><div class='add'>+    if (read_subvol) {</div><div class='add'>+        index = xlator_subvolume_index(this, read_subvol);</div><div class='add'>+        if (index == -1) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, 0, AFR_MSG_INVALID_SUBVOL,</div><div class='add'>+                   "%s not a subvolume", read_subvol-&gt;name);</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+        priv-&gt;read_child = index;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    GF_OPTION_RECONF("read-subvolume-index", read_subvol_index, options, int32,</div><div class='add'>+                     out);</div><div class='add'>+</div><div class='add'>+    if (read_subvol_index &gt; -1) {</div><div class='add'>+        index = read_subvol_index;</div><div class='add'>+        if (index &gt;= priv-&gt;child_count) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, 0, AFR_MSG_INVALID_SUBVOL,</div><div class='add'>+                   "%d not a subvolume-index", index);</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+        priv-&gt;read_child = index;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    GF_OPTION_RECONF("pre-op-compat", priv-&gt;pre_op_compat, options, bool, out);</div><div class='add'>+    GF_OPTION_RECONF("locking-scheme", locking_scheme, options, str, out);</div><div class='add'>+    priv-&gt;granular_locks = (strcmp(locking_scheme, "granular") == 0);</div><div class='add'>+    GF_OPTION_RECONF("full-lock", priv-&gt;full_lock, options, bool, out);</div><div class='add'>+    GF_OPTION_RECONF("granular-entry-heal", priv-&gt;esh_granular, options, bool,</div><div class='add'>+                     out);</div><div class='add'>+</div><div class='add'>+    GF_OPTION_RECONF("eager-lock", priv-&gt;eager_lock, options, bool, out);</div><div class='add'>+    GF_OPTION_RECONF("optimistic-change-log", priv-&gt;optimistic_change_log,</div><div class='add'>+                     options, bool, out);</div><div class='add'>+    GF_OPTION_RECONF("quorum-type", qtype, options, str, out);</div><div class='add'>+    GF_OPTION_RECONF("quorum-count", priv-&gt;quorum_count, options, uint32, out);</div><div class='add'>+    fix_quorum_options(this, priv, qtype, options);</div><div class='add'>+    if (priv-&gt;quorum_count &amp;&amp; !afr_has_quorum(priv-&gt;child_up, this, NULL))</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_WARNING, 0, AFR_MSG_QUORUM_FAIL,</div><div class='add'>+               "Client-quorum is not met");</div><div class='add'>+</div><div class='add'>+    GF_OPTION_RECONF("post-op-delay-secs", priv-&gt;post_op_delay_secs, options,</div><div class='add'>+                     uint32, out);</div><div class='add'>+</div><div class='add'>+    GF_OPTION_RECONF(AFR_SH_READDIR_SIZE_KEY, priv-&gt;sh_readdir_size, options,</div><div class='add'>+                     size_uint64, out);</div><div class='add'>+    /* Reset this so we re-discover in case the topology changed.  */</div><div class='add'>+    GF_OPTION_RECONF("ensure-durability", priv-&gt;ensure_durability, options,</div><div class='add'>+                     bool, out);</div><div class='add'>+</div><div class='add'>+    enabled_old = priv-&gt;shd.enabled;</div><div class='add'>+    GF_OPTION_RECONF("self-heal-daemon", priv-&gt;shd.enabled, options, bool, out);</div><div class='add'>+</div><div class='add'>+    GF_OPTION_RECONF("iam-self-heal-daemon", priv-&gt;shd.iamshd, options, bool,</div><div class='add'>+                     out);</div><div class='add'>+</div><div class='add'>+    timeout_old = priv-&gt;shd.timeout;</div><div class='add'>+    GF_OPTION_RECONF("heal-timeout", priv-&gt;shd.timeout, options, int32, out);</div><div class='add'>+</div><div class='add'>+    GF_OPTION_RECONF("consistent-metadata", priv-&gt;consistent_metadata, options,</div><div class='add'>+                     bool, out);</div><div class='add'>+</div><div class='add'>+    GF_OPTION_RECONF("shd-max-threads", priv-&gt;shd.max_threads, options, uint32,</div><div class='add'>+                     out);</div><div class='add'>+</div><div class='add'>+    GF_OPTION_RECONF("shd-wait-qlength", priv-&gt;shd.wait_qlength, options,</div><div class='add'>+                     uint32, out);</div><div class='add'>+</div><div class='add'>+    GF_OPTION_RECONF("favorite-child-policy", fav_child_policy, options, str,</div><div class='add'>+                     out);</div><div class='add'>+    if (afr_set_favorite_child_policy(priv, fav_child_policy) == -1)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    priv-&gt;did_discovery = _gf_false;</div><div class='add'>+</div><div class='add'>+    GF_OPTION_RECONF("consistent-io", consistent_io, options, bool, out);</div><div class='add'>+    if (priv-&gt;quorum_count != 0)</div><div class='add'>+        consistent_io = _gf_false;</div><div class='add'>+    priv-&gt;consistent_io = consistent_io;</div><div class='add'>+</div><div class='add'>+    afr_handle_anon_inode_options(priv, options);</div><div class='add'>+</div><div class='add'>+    GF_OPTION_RECONF("use-anonymous-inode", priv-&gt;use_anon_inode, options, bool,</div><div class='add'>+                     out);</div><div class='add'>+    if (priv-&gt;shd.enabled) {</div><div class='add'>+        if ((priv-&gt;shd.enabled != enabled_old) ||</div><div class='add'>+            (timeout_old != priv-&gt;shd.timeout))</div><div class='add'>+            afr_selfheal_childup(this, priv);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+afr_pending_xattrs_init(afr_private_t *priv, xlator_t *this)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int i = 0;</div><div class='add'>+    char *ptr = NULL;</div><div class='add'>+    char *ptr1 = NULL;</div><div class='add'>+    char *xattrs_list = NULL;</div><div class='add'>+    xlator_list_t *trav = NULL;</div><div class='add'>+    int child_count = -1;</div><div class='add'>+</div><div class='add'>+    trav = this-&gt;children;</div><div class='add'>+    child_count = priv-&gt;child_count;</div><div class='add'>+    if (priv-&gt;thin_arbiter_count) {</div><div class='add'>+        /* priv-&gt;pending_key[THIN_ARBITER_BRICK_INDEX] is used as the</div><div class='add'>+         * name of the thin arbiter file for persistence across add/</div><div class='add'>+         * removal of DHT subvols.*/</div><div class='add'>+        child_count++;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    GF_OPTION_INIT("afr-pending-xattr", xattrs_list, str, out);</div><div class='add'>+    priv-&gt;pending_key = GF_CALLOC(sizeof(*priv-&gt;pending_key), child_count,</div><div class='add'>+                                  gf_afr_mt_char);</div><div class='add'>+    if (!priv-&gt;pending_key) {</div><div class='add'>+        ret = -ENOMEM;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    if (!xattrs_list) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_WARNING, 0, AFR_MSG_NO_CHANGELOG,</div><div class='add'>+               "Unable to fetch afr-pending-xattr option from volfile."</div><div class='add'>+               " Falling back to using client translator names. ");</div><div class='add'>+</div><div class='add'>+        while (i &lt; child_count) {</div><div class='add'>+            ret = gf_asprintf(&amp;priv-&gt;pending_key[i], "%s.%s", AFR_XATTR_PREFIX,</div><div class='add'>+                              trav-&gt;xlator-&gt;name);</div><div class='add'>+            if (ret == -1) {</div><div class='ctx'>                 ret = -ENOMEM;</div><div class='ctx'>                 goto out;</div><div class='add'>+            }</div><div class='add'>+            trav = trav-&gt;next;</div><div class='add'>+            i++;</div><div class='ctx'>         }</div><div class='add'>+        ret = 0;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ptr = ptr1 = gf_strdup(xattrs_list);</div><div class='add'>+    if (!ptr) {</div><div class='add'>+        ret = -ENOMEM;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    for (i = 0, ptr = strtok(ptr, ","); ptr; ptr = strtok(NULL, ",")) {</div><div class='add'>+        ret = gf_asprintf(&amp;priv-&gt;pending_key[i], "%s.%s", AFR_XATTR_PREFIX,</div><div class='add'>+                          ptr);</div><div class='add'>+        if (ret == -1) {</div><div class='add'>+            ret = -ENOMEM;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+        i++;</div><div class='add'>+    }</div><div class='add'>+    ret = 0;</div><div class='ctx'> </div><div class='del'>-	trav = this-&gt;children;</div><div class='del'>-	i = 0;</div><div class='del'>-	while (i &lt; child_count) {</div><div class='del'>-		priv-&gt;children[i] = trav-&gt;xlator;</div><div class='del'>-</div><div class='del'>-                ret = gf_asprintf (&amp;priv-&gt;pending_key[i], "%s.%s", </div><div class='del'>-                                   AFR_XATTR_PREFIX,</div><div class='del'>-                                   trav-&gt;xlator-&gt;name);</div><div class='del'>-                if (-1 == ret) {</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_ERROR, </div><div class='del'>-                                "asprintf failed to set pending key");</div><div class='del'>-                        ret = -ENOMEM;</div><div class='del'>-                        goto out;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-		trav = trav-&gt;next;</div><div class='del'>-		i++;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-        LOCK_INIT (&amp;priv-&gt;root_inode_lk);</div><div class='del'>-        priv-&gt;first_lookup = 1;</div><div class='del'>-        priv-&gt;root_inode = NULL;</div><div class='del'>-</div><div class='del'>-	ret = 0;</div><div class='ctx'> out:</div><div class='del'>-	return ret;</div><div class='add'>+    GF_FREE(ptr1);</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+void</div><div class='add'>+afr_ta_init(afr_private_t *priv)</div><div class='add'>+{</div><div class='add'>+    priv-&gt;thin_arbiter_count = 1;</div><div class='add'>+    priv-&gt;child_count--;</div><div class='add'>+    priv-&gt;ta_child_up = 0;</div><div class='add'>+    priv-&gt;ta_bad_child_index = AFR_CHILD_UNKNOWN;</div><div class='add'>+    priv-&gt;ta_notify_dom_lock_offset = 0;</div><div class='add'>+    priv-&gt;ta_in_mem_txn_count = 0;</div><div class='add'>+    priv-&gt;ta_on_wire_txn_count = 0;</div><div class='add'>+    priv-&gt;release_ta_notify_dom_lock = _gf_false;</div><div class='add'>+    INIT_LIST_HEAD(&amp;priv-&gt;ta_waitq);</div><div class='add'>+    INIT_LIST_HEAD(&amp;priv-&gt;ta_onwireq);</div><div class='add'>+    gf_uuid_clear(priv-&gt;ta_gfid);</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-fini (xlator_t *this)</div><div class='add'>+int32_t</div><div class='add'>+init(xlator_t *this)</div><div class='ctx'> {</div><div class='del'>-	return 0;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    int child_count = 0;</div><div class='add'>+    xlator_list_t *trav = NULL;</div><div class='add'>+    int i = 0;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    GF_UNUSED int op_errno = 0;</div><div class='add'>+    xlator_t *read_subvol = NULL;</div><div class='add'>+    int read_subvol_index = -1;</div><div class='add'>+    char *qtype = NULL;</div><div class='add'>+    char *fav_child_policy = NULL;</div><div class='add'>+    char *thin_arbiter = NULL;</div><div class='add'>+    char *data_self_heal = NULL;</div><div class='add'>+    char *locking_scheme = NULL;</div><div class='add'>+    char *data_self_heal_algorithm = NULL;</div><div class='add'>+</div><div class='add'>+    if (!this-&gt;children) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_ERROR, 0, AFR_MSG_CHILD_MISCONFIGURED,</div><div class='add'>+               "replicate translator needs more than one "</div><div class='add'>+               "subvolume defined.");</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (!this-&gt;parents) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_WARNING, 0, AFR_MSG_VOL_MISCONFIGURED,</div><div class='add'>+               "Volume is dangling.");</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    this-&gt;private = GF_CALLOC(1, sizeof(afr_private_t),</div><div class='add'>+                              gf_afr_mt_afr_private_t);</div><div class='add'>+    if (!this-&gt;private)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+    INIT_LIST_HEAD(&amp;priv-&gt;saved_locks);</div><div class='add'>+    INIT_LIST_HEAD(&amp;priv-&gt;lk_healq);</div><div class='add'>+    LOCK_INIT(&amp;priv-&gt;lock);</div><div class='add'>+</div><div class='add'>+    child_count = xlator_subvolume_count(this);</div><div class='add'>+</div><div class='add'>+    priv-&gt;child_count = child_count;</div><div class='add'>+</div><div class='add'>+    priv-&gt;read_child = -1;</div><div class='add'>+</div><div class='add'>+    GF_OPTION_INIT("arbiter-count", priv-&gt;arbiter_count, uint32, out);</div><div class='add'>+    GF_OPTION_INIT("thin-arbiter", thin_arbiter, str, out);</div><div class='add'>+    if (thin_arbiter &amp;&amp; strlen(thin_arbiter) &gt; 0) {</div><div class='add'>+        afr_ta_init(priv);</div><div class='add'>+    }</div><div class='add'>+    INIT_LIST_HEAD(&amp;priv-&gt;healing);</div><div class='add'>+    INIT_LIST_HEAD(&amp;priv-&gt;heal_waiting);</div><div class='add'>+</div><div class='add'>+    priv-&gt;spb_choice_timeout = AFR_DEFAULT_SPB_CHOICE_TIMEOUT;</div><div class='add'>+</div><div class='add'>+    GF_OPTION_INIT("afr-dirty-xattr", priv-&gt;afr_dirty, str, out);</div><div class='add'>+</div><div class='add'>+    GF_OPTION_INIT("metadata-splitbrain-forced-heal",</div><div class='add'>+                   priv-&gt;metadata_splitbrain_forced_heal, bool, out);</div><div class='add'>+</div><div class='add'>+    GF_OPTION_INIT("read-subvolume", read_subvol, xlator, out);</div><div class='add'>+    if (read_subvol) {</div><div class='add'>+        priv-&gt;read_child = xlator_subvolume_index(this, read_subvol);</div><div class='add'>+        if (priv-&gt;read_child == -1) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, 0, AFR_MSG_INVALID_SUBVOL,</div><div class='add'>+                   "%s not a subvolume", read_subvol-&gt;name);</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    GF_OPTION_INIT("read-subvolume-index", read_subvol_index, int32, out);</div><div class='add'>+    if (read_subvol_index &gt; -1) {</div><div class='add'>+        if (read_subvol_index &gt;= priv-&gt;child_count) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, 0, AFR_MSG_INVALID_SUBVOL,</div><div class='add'>+                   "%d not a subvolume-index", read_subvol_index);</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+        priv-&gt;read_child = read_subvol_index;</div><div class='add'>+    }</div><div class='add'>+    GF_OPTION_INIT("choose-local", priv-&gt;choose_local, bool, out);</div><div class='add'>+</div><div class='add'>+    priv-&gt;pending_reads = GF_CALLOC(sizeof(*priv-&gt;pending_reads),</div><div class='add'>+                                    priv-&gt;child_count, gf_afr_mt_atomic_t);</div><div class='add'>+</div><div class='add'>+    GF_OPTION_INIT("read-hash-mode", priv-&gt;hash_mode, uint32, out);</div><div class='add'>+</div><div class='add'>+    priv-&gt;favorite_child = -1;</div><div class='add'>+</div><div class='add'>+    GF_OPTION_INIT("favorite-child-policy", fav_child_policy, str, out);</div><div class='add'>+    if (afr_set_favorite_child_policy(priv, fav_child_policy) == -1)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    GF_OPTION_INIT("shd-max-threads", priv-&gt;shd.max_threads, uint32, out);</div><div class='add'>+</div><div class='add'>+    GF_OPTION_INIT("shd-wait-qlength", priv-&gt;shd.wait_qlength, uint32, out);</div><div class='add'>+</div><div class='add'>+    GF_OPTION_INIT("background-self-heal-count",</div><div class='add'>+                   priv-&gt;background_self_heal_count, uint32, out);</div><div class='add'>+</div><div class='add'>+    GF_OPTION_INIT("heal-wait-queue-length", priv-&gt;heal_wait_qlen, uint32, out);</div><div class='add'>+</div><div class='add'>+    GF_OPTION_INIT("data-self-heal", data_self_heal, str, out);</div><div class='add'>+    if (gf_string2boolean(data_self_heal, &amp;priv-&gt;data_self_heal) == -1)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    GF_OPTION_INIT("data-self-heal-algorithm", data_self_heal_algorithm, str,</div><div class='add'>+                   out);</div><div class='add'>+    set_data_self_heal_algorithm(priv, data_self_heal_algorithm);</div><div class='add'>+</div><div class='add'>+    GF_OPTION_INIT("data-self-heal-window-size",</div><div class='add'>+                   priv-&gt;data_self_heal_window_size, uint32, out);</div><div class='add'>+</div><div class='add'>+    GF_OPTION_INIT("metadata-self-heal", priv-&gt;metadata_self_heal, bool, out);</div><div class='add'>+</div><div class='add'>+    GF_OPTION_INIT("entry-self-heal", priv-&gt;entry_self_heal, bool, out);</div><div class='add'>+</div><div class='add'>+    GF_OPTION_INIT("halo-shd-max-latency", priv-&gt;shd.halo_max_latency_msec,</div><div class='add'>+                   uint32, out);</div><div class='add'>+</div><div class='add'>+    GF_OPTION_INIT("halo-max-latency", priv-&gt;halo_max_latency_msec, uint32,</div><div class='add'>+                   out);</div><div class='add'>+    GF_OPTION_INIT("halo-max-replicas", priv-&gt;halo_max_replicas, uint32, out);</div><div class='add'>+    GF_OPTION_INIT("halo-min-replicas", priv-&gt;halo_min_replicas, uint32, out);</div><div class='add'>+</div><div class='add'>+    GF_OPTION_INIT("halo-enabled", priv-&gt;halo_enabled, bool, out);</div><div class='add'>+</div><div class='add'>+    GF_OPTION_INIT("halo-nfsd-max-latency", priv-&gt;nfsd.halo_max_latency_msec,</div><div class='add'>+                   uint32, out);</div><div class='add'>+</div><div class='add'>+    GF_OPTION_INIT("iam-nfs-daemon", priv-&gt;nfsd.iamnfsd, bool, out);</div><div class='add'>+</div><div class='add'>+    GF_OPTION_INIT("optimistic-change-log", priv-&gt;optimistic_change_log, bool,</div><div class='add'>+                   out);</div><div class='add'>+</div><div class='add'>+    GF_OPTION_INIT("pre-op-compat", priv-&gt;pre_op_compat, bool, out);</div><div class='add'>+    GF_OPTION_INIT("locking-scheme", locking_scheme, str, out);</div><div class='add'>+    priv-&gt;granular_locks = (strcmp(locking_scheme, "granular") == 0);</div><div class='add'>+    GF_OPTION_INIT("full-lock", priv-&gt;full_lock, bool, out);</div><div class='add'>+    GF_OPTION_INIT("granular-entry-heal", priv-&gt;esh_granular, bool, out);</div><div class='add'>+</div><div class='add'>+    GF_OPTION_INIT("eager-lock", priv-&gt;eager_lock, bool, out);</div><div class='add'>+    GF_OPTION_INIT("quorum-type", qtype, str, out);</div><div class='add'>+    GF_OPTION_INIT("quorum-count", priv-&gt;quorum_count, uint32, out);</div><div class='add'>+    GF_OPTION_INIT(AFR_SH_READDIR_SIZE_KEY, priv-&gt;sh_readdir_size, size_uint64,</div><div class='add'>+                   out);</div><div class='add'>+    fix_quorum_options(this, priv, qtype, this-&gt;options);</div><div class='add'>+</div><div class='add'>+    GF_OPTION_INIT("post-op-delay-secs", priv-&gt;post_op_delay_secs, uint32, out);</div><div class='add'>+    GF_OPTION_INIT("ensure-durability", priv-&gt;ensure_durability, bool, out);</div><div class='add'>+</div><div class='add'>+    GF_OPTION_INIT("self-heal-daemon", priv-&gt;shd.enabled, bool, out);</div><div class='add'>+</div><div class='add'>+    GF_OPTION_INIT("iam-self-heal-daemon", priv-&gt;shd.iamshd, bool, out);</div><div class='add'>+    GF_OPTION_INIT("heal-timeout", priv-&gt;shd.timeout, int32, out);</div><div class='add'>+</div><div class='add'>+    GF_OPTION_INIT("consistent-metadata", priv-&gt;consistent_metadata, bool, out);</div><div class='add'>+    GF_OPTION_INIT("consistent-io", priv-&gt;consistent_io, bool, out);</div><div class='add'>+    afr_handle_anon_inode_options(priv, this-&gt;options);</div><div class='add'>+</div><div class='add'>+    GF_OPTION_INIT("use-anonymous-inode", priv-&gt;use_anon_inode, bool, out);</div><div class='add'>+    if (priv-&gt;quorum_count != 0)</div><div class='add'>+        priv-&gt;consistent_io = _gf_false;</div><div class='add'>+</div><div class='add'>+    priv-&gt;wait_count = 1;</div><div class='add'>+</div><div class='add'>+    priv-&gt;local = GF_CALLOC(sizeof(unsigned char), child_count, gf_afr_mt_char);</div><div class='add'>+    if (!priv-&gt;local) {</div><div class='add'>+        ret = -ENOMEM;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    priv-&gt;anon_inode = GF_CALLOC(sizeof(unsigned char), child_count,</div><div class='add'>+                                 gf_afr_mt_char);</div><div class='add'>+</div><div class='add'>+    priv-&gt;child_up = GF_CALLOC(sizeof(unsigned char), child_count,</div><div class='add'>+                               gf_afr_mt_char);</div><div class='add'>+</div><div class='add'>+    priv-&gt;child_latency = GF_MALLOC(sizeof(*priv-&gt;child_latency) * child_count,</div><div class='add'>+                                    gf_afr_mt_child_latency_t);</div><div class='add'>+    priv-&gt;halo_child_up = GF_CALLOC(sizeof(unsigned char), child_count,</div><div class='add'>+                                    gf_afr_mt_char);</div><div class='add'>+</div><div class='add'>+    if (!priv-&gt;child_up || !priv-&gt;child_latency || !priv-&gt;halo_child_up ||</div><div class='add'>+        !priv-&gt;anon_inode) {</div><div class='add'>+        ret = -ENOMEM;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    /*Initialize to -ve ping timeout so that they are not considered</div><div class='add'>+     * in child-up events until ping-event comes*/</div><div class='add'>+    for (i = 0; i &lt; child_count; i++)</div><div class='add'>+        priv-&gt;child_latency[i] = -1;</div><div class='add'>+</div><div class='add'>+    priv-&gt;children = GF_CALLOC(sizeof(xlator_t *), child_count,</div><div class='add'>+                               gf_afr_mt_xlator_t);</div><div class='add'>+    if (!priv-&gt;children) {</div><div class='add'>+        ret = -ENOMEM;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = afr_pending_xattrs_init(priv, this);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    trav = this-&gt;children;</div><div class='add'>+    i = 0;</div><div class='add'>+    while (i &lt; child_count) {</div><div class='add'>+        priv-&gt;children[i] = trav-&gt;xlator;</div><div class='add'>+        trav = trav-&gt;next;</div><div class='add'>+        i++;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = gf_asprintf(&amp;priv-&gt;sh_domain, AFR_SH_DATA_DOMAIN_FMT, this-&gt;name);</div><div class='add'>+    if (-1 == ret) {</div><div class='add'>+        ret = -ENOMEM;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    priv-&gt;last_event = GF_CALLOC(child_count, sizeof(*priv-&gt;last_event),</div><div class='add'>+                                 gf_afr_mt_int32_t);</div><div class='add'>+    if (!priv-&gt;last_event) {</div><div class='add'>+        ret = -ENOMEM;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    this-&gt;itable = inode_table_new(SHD_INODE_LRU_LIMIT, this);</div><div class='add'>+    if (!this-&gt;itable) {</div><div class='add'>+        ret = -ENOMEM;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (priv-&gt;shd.iamshd) {</div><div class='add'>+        ret = afr_selfheal_daemon_init(this);</div><div class='add'>+        if (ret) {</div><div class='add'>+            ret = -ENOMEM;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* keep more local here as we may need them for self-heal etc */</div><div class='add'>+    this-&gt;local_pool = mem_pool_new(afr_local_t, 512);</div><div class='add'>+    if (!this-&gt;local_pool) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    priv-&gt;root_inode = NULL;</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+void</div><div class='add'>+afr_destroy_healer_object(xlator_t *this, struct subvol_healer *healer)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    if (!healer)</div><div class='add'>+        return;</div><div class='add'>+</div><div class='add'>+    if (healer-&gt;running) {</div><div class='add'>+        /*</div><div class='add'>+         * If there are any resources to cleanup, We need</div><div class='add'>+         * to do that gracefully using pthread_cleanup_push</div><div class='add'>+         */</div><div class='add'>+        ret = gf_thread_cleanup_xint(healer-&gt;thread);</div><div class='add'>+        if (ret)</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_WARNING, 0, AFR_MSG_SELF_HEAL_FAILED,</div><div class='add'>+                   "Failed to clean up healer threads.");</div><div class='add'>+        healer-&gt;thread = 0;</div><div class='add'>+    }</div><div class='add'>+    pthread_cond_destroy(&amp;healer-&gt;cond);</div><div class='add'>+    pthread_mutex_destroy(&amp;healer-&gt;mutex);</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+void</div><div class='add'>+afr_selfheal_daemon_fini(xlator_t *this)</div><div class='add'>+{</div><div class='add'>+    struct subvol_healer *healer = NULL;</div><div class='add'>+    afr_self_heald_t *shd = NULL;</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+    int i = 0;</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+    if (!priv)</div><div class='add'>+        return;</div><div class='add'>+</div><div class='add'>+    shd = &amp;priv-&gt;shd;</div><div class='add'>+    if (!shd-&gt;iamshd)</div><div class='add'>+        return;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+        healer = &amp;shd-&gt;index_healers[i];</div><div class='add'>+        afr_destroy_healer_object(this, healer);</div><div class='add'>+</div><div class='add'>+        healer = &amp;shd-&gt;full_healers[i];</div><div class='add'>+        afr_destroy_healer_object(this, healer);</div><div class='add'>+</div><div class='add'>+        if (shd-&gt;statistics[i])</div><div class='add'>+            eh_destroy(shd-&gt;statistics[i]);</div><div class='add'>+    }</div><div class='add'>+    GF_FREE(shd-&gt;index_healers);</div><div class='add'>+    GF_FREE(shd-&gt;full_healers);</div><div class='add'>+    GF_FREE(shd-&gt;statistics);</div><div class='add'>+    if (shd-&gt;split_brain)</div><div class='add'>+        eh_destroy(shd-&gt;split_brain);</div><div class='add'>+}</div><div class='add'>+void</div><div class='add'>+fini(xlator_t *this)</div><div class='add'>+{</div><div class='add'>+    afr_private_t *priv = NULL;</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    afr_selfheal_daemon_fini(this);</div><div class='add'>+    GF_ASSERT(list_empty(&amp;priv-&gt;saved_locks));</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;priv-&gt;lock);</div><div class='add'>+    if (priv-&gt;timer != NULL) {</div><div class='add'>+        gf_timer_call_cancel(this-&gt;ctx, priv-&gt;timer);</div><div class='add'>+        priv-&gt;timer = NULL;</div><div class='add'>+    }</div><div class='add'>+    UNLOCK(&amp;priv-&gt;lock);</div><div class='add'>+</div><div class='add'>+    if (this-&gt;local_pool != NULL) {</div><div class='add'>+        mem_pool_destroy(this-&gt;local_pool);</div><div class='add'>+        this-&gt;local_pool = NULL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    this-&gt;private = NULL;</div><div class='add'>+    afr_priv_destroy(priv);</div><div class='add'>+    if (this-&gt;itable) {</div><div class='add'>+        inode_table_destroy(this-&gt;itable);</div><div class='add'>+        this-&gt;itable = NULL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> struct xlator_fops fops = {</div><div class='del'>-	.lookup      = afr_lookup,</div><div class='del'>-	.open        = afr_open,</div><div class='del'>-	.lk          = afr_lk,</div><div class='del'>-	.flush       = afr_flush,</div><div class='del'>-	.statfs      = afr_statfs,</div><div class='del'>-	.fsync       = afr_fsync,</div><div class='del'>-	.fsyncdir    = afr_fsyncdir,</div><div class='del'>-	.xattrop     = afr_xattrop,</div><div class='del'>-	.fxattrop    = afr_fxattrop,</div><div class='del'>-	.inodelk     = afr_inodelk,</div><div class='del'>-	.finodelk    = afr_finodelk,</div><div class='del'>-	.entrylk     = afr_entrylk,</div><div class='del'>-	.fentrylk    = afr_fentrylk,</div><div class='del'>-</div><div class='del'>-	/* inode read */</div><div class='del'>-	.access      = afr_access,</div><div class='del'>-	.stat        = afr_stat,</div><div class='del'>-	.fstat       = afr_fstat,</div><div class='del'>-	.readlink    = afr_readlink,</div><div class='del'>-	.getxattr    = afr_getxattr,</div><div class='del'>-	.readv       = afr_readv,</div><div class='del'>-</div><div class='del'>-	/* inode write */</div><div class='del'>-	.writev      = afr_writev,</div><div class='del'>-	.truncate    = afr_truncate,</div><div class='del'>-	.ftruncate   = afr_ftruncate,</div><div class='del'>-	.setxattr    = afr_setxattr,</div><div class='del'>-        .setattr     = afr_setattr,</div><div class='del'>-	.fsetattr    = afr_fsetattr,</div><div class='del'>-	.removexattr = afr_removexattr,</div><div class='del'>-</div><div class='del'>-	/* dir read */</div><div class='del'>-	.opendir     = afr_opendir,</div><div class='del'>-	.readdir     = afr_readdir,</div><div class='del'>-	.readdirp    = afr_readdirp,</div><div class='del'>-</div><div class='del'>-	/* dir write */</div><div class='del'>-	.create      = afr_create,</div><div class='del'>-	.mknod       = afr_mknod,</div><div class='del'>-	.mkdir       = afr_mkdir,</div><div class='del'>-	.unlink      = afr_unlink,</div><div class='del'>-	.rmdir       = afr_rmdir,</div><div class='del'>-	.link        = afr_link,</div><div class='del'>-	.symlink     = afr_symlink,</div><div class='del'>-	.rename      = afr_rename,</div><div class='add'>+    .lookup = afr_lookup,</div><div class='add'>+    .lk = afr_lk,</div><div class='add'>+    .flush = afr_flush,</div><div class='add'>+    .statfs = afr_statfs,</div><div class='add'>+    .fsyncdir = afr_fsyncdir,</div><div class='add'>+    .inodelk = afr_inodelk,</div><div class='add'>+    .finodelk = afr_finodelk,</div><div class='add'>+    .entrylk = afr_entrylk,</div><div class='add'>+    .fentrylk = afr_fentrylk,</div><div class='add'>+    .ipc = afr_ipc,</div><div class='add'>+    .lease = afr_lease,</div><div class='add'>+</div><div class='add'>+    /* inode read */</div><div class='add'>+    .access = afr_access,</div><div class='add'>+    .stat = afr_stat,</div><div class='add'>+    .fstat = afr_fstat,</div><div class='add'>+    .readlink = afr_readlink,</div><div class='add'>+    .getxattr = afr_getxattr,</div><div class='add'>+    .fgetxattr = afr_fgetxattr,</div><div class='add'>+    .readv = afr_readv,</div><div class='add'>+    .seek = afr_seek,</div><div class='add'>+</div><div class='add'>+    /* inode write */</div><div class='add'>+    .writev = afr_writev,</div><div class='add'>+    .truncate = afr_truncate,</div><div class='add'>+    .ftruncate = afr_ftruncate,</div><div class='add'>+    .setxattr = afr_setxattr,</div><div class='add'>+    .fsetxattr = afr_fsetxattr,</div><div class='add'>+    .setattr = afr_setattr,</div><div class='add'>+    .fsetattr = afr_fsetattr,</div><div class='add'>+    .removexattr = afr_removexattr,</div><div class='add'>+    .fremovexattr = afr_fremovexattr,</div><div class='add'>+    .fallocate = afr_fallocate,</div><div class='add'>+    .discard = afr_discard,</div><div class='add'>+    .zerofill = afr_zerofill,</div><div class='add'>+    .xattrop = afr_xattrop,</div><div class='add'>+    .fxattrop = afr_fxattrop,</div><div class='add'>+    .fsync = afr_fsync,</div><div class='add'>+</div><div class='add'>+    /*inode open*/</div><div class='add'>+    .opendir = afr_opendir,</div><div class='add'>+    .open = afr_open,</div><div class='add'>+</div><div class='add'>+    /* dir read */</div><div class='add'>+    .readdir = afr_readdir,</div><div class='add'>+    .readdirp = afr_readdirp,</div><div class='add'>+</div><div class='add'>+    /* dir write */</div><div class='add'>+    .create = afr_create,</div><div class='add'>+    .mknod = afr_mknod,</div><div class='add'>+    .mkdir = afr_mkdir,</div><div class='add'>+    .unlink = afr_unlink,</div><div class='add'>+    .rmdir = afr_rmdir,</div><div class='add'>+    .link = afr_link,</div><div class='add'>+    .symlink = afr_symlink,</div><div class='add'>+    .rename = afr_rename,</div><div class='ctx'> };</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> struct xlator_dumpops dumpops = {</div><div class='del'>-        .priv       = afr_priv_dump,</div><div class='add'>+    .priv = afr_priv_dump,</div><div class='ctx'> };</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> struct xlator_cbks cbks = {</div><div class='del'>-	.release     = afr_release,</div><div class='del'>-	.releasedir  = afr_releasedir,</div><div class='add'>+    .release = afr_release,</div><div class='add'>+    .releasedir = afr_releasedir,</div><div class='add'>+    .forget = afr_forget,</div><div class='ctx'> };</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> struct volume_options options[] = {</div><div class='del'>-	{ .key  = {"read-subvolume" }, </div><div class='del'>-	  .type = GF_OPTION_TYPE_XLATOR</div><div class='del'>-	},</div><div class='del'>-	{ .key  = {"favorite-child"}, </div><div class='del'>-	  .type = GF_OPTION_TYPE_XLATOR</div><div class='del'>-	},</div><div class='del'>-        { .key  = {"background-self-heal-count"},</div><div class='del'>-          .type = GF_OPTION_TYPE_INT,</div><div class='del'>-          .min  = 0</div><div class='del'>-        },</div><div class='del'>-	{ .key  = {"data-self-heal"},  </div><div class='del'>-	  .type = GF_OPTION_TYPE_BOOL </div><div class='del'>-	},</div><div class='del'>-        { .key  = {"data-self-heal-algorithm"},</div><div class='del'>-          .type = GF_OPTION_TYPE_STR</div><div class='del'>-        },</div><div class='del'>-        { .key  = {"data-self-heal-window-size"},</div><div class='del'>-          .type = GF_OPTION_TYPE_INT,</div><div class='del'>-          .min  = 1,</div><div class='del'>-          .max  = 1024</div><div class='del'>-        },</div><div class='del'>-	{ .key  = {"metadata-self-heal"},  </div><div class='del'>-	  .type = GF_OPTION_TYPE_BOOL</div><div class='del'>-	},</div><div class='del'>-	{ .key  = {"entry-self-heal"},  </div><div class='del'>-	  .type = GF_OPTION_TYPE_BOOL </div><div class='del'>-	},</div><div class='del'>-	{ .key  = {"data-change-log"},  </div><div class='del'>-	  .type = GF_OPTION_TYPE_BOOL </div><div class='del'>-	},</div><div class='del'>-	{ .key  = {"metadata-change-log"},  </div><div class='del'>-	  .type = GF_OPTION_TYPE_BOOL</div><div class='del'>-	},</div><div class='del'>-	{ .key  = {"entry-change-log"},  </div><div class='del'>-	  .type = GF_OPTION_TYPE_BOOL</div><div class='del'>-	},</div><div class='del'>-	{ .key  = {"data-lock-server-count"},  </div><div class='del'>-	  .type = GF_OPTION_TYPE_INT, </div><div class='del'>-	  .min  = 0</div><div class='del'>-	},</div><div class='del'>-	{ .key  = {"metadata-lock-server-count"},  </div><div class='del'>-	  .type = GF_OPTION_TYPE_INT, </div><div class='del'>-	  .min  = 0</div><div class='del'>-	},</div><div class='del'>-	{ .key  = {"entry-lock-server-count"},  </div><div class='del'>-	  .type = GF_OPTION_TYPE_INT,</div><div class='del'>-	  .min  = 0</div><div class='del'>-	},</div><div class='del'>-	{ .key  = {"strict-readdir"},</div><div class='del'>-	  .type = GF_OPTION_TYPE_BOOL,</div><div class='del'>-	},</div><div class='del'>-	{ .key  = {NULL} },</div><div class='add'>+    {.key = {"read-subvolume"},</div><div class='add'>+     .type = GF_OPTION_TYPE_XLATOR,</div><div class='add'>+     .op_version = {1},</div><div class='add'>+     .flags = OPT_FLAG_CLIENT_OPT | OPT_FLAG_SETTABLE | OPT_FLAG_DOC,</div><div class='add'>+     .tags = {"replicate"},</div><div class='add'>+     .description = "inode-read fops happen only on one of the bricks in "</div><div class='add'>+                    "replicate. Afr will prefer the one specified using "</div><div class='add'>+                    "this option if it is not stale. Option value must be "</div><div class='add'>+                    "one of the xlator names of the children. "</div><div class='add'>+                    "Ex: &lt;volname&gt;-client-0 till "</div><div class='add'>+                    "&lt;volname&gt;-client-&lt;number-of-bricks - 1&gt;"},</div><div class='add'>+    {.key = {"read-subvolume-index"},</div><div class='add'>+     .type = GF_OPTION_TYPE_INT,</div><div class='add'>+     .default_value = "-1",</div><div class='add'>+     .op_version = {2},</div><div class='add'>+     .flags = OPT_FLAG_CLIENT_OPT | OPT_FLAG_SETTABLE | OPT_FLAG_DOC,</div><div class='add'>+     .tags = {"replicate"},</div><div class='add'>+     .description = "inode-read fops happen only on one of the bricks in "</div><div class='add'>+                    "replicate. AFR will prefer the one specified using "</div><div class='add'>+                    "this option if it is not stale. allowed options"</div><div class='add'>+                    " include -1 till replica-count - 1"},</div><div class='add'>+    {.key = {"read-hash-mode"},</div><div class='add'>+     .type = GF_OPTION_TYPE_INT,</div><div class='add'>+     .min = 0,</div><div class='add'>+     .max = 5,</div><div class='add'>+     .default_value = "1",</div><div class='add'>+     .op_version = {2},</div><div class='add'>+     .flags = OPT_FLAG_CLIENT_OPT | OPT_FLAG_SETTABLE | OPT_FLAG_DOC,</div><div class='add'>+     .tags = {"replicate"},</div><div class='add'>+     .description =</div><div class='add'>+         "inode-read fops happen only on one of the bricks in "</div><div class='add'>+         "replicate. AFR will prefer the one computed using "</div><div class='add'>+         "the method specified using this option.\n"</div><div class='add'>+         "0 = first readable child of AFR, starting from 1st child.\n"</div><div class='add'>+         "1 = hash by GFID of file (all clients use "</div><div class='add'>+         "same subvolume).\n"</div><div class='add'>+         "2 = hash by GFID of file and client PID.\n"</div><div class='add'>+         "3 = brick having the least outstanding read requests.\n"</div><div class='add'>+         "4 = brick having the least network ping latency.\n"</div><div class='add'>+         "5 = Hybrid mode between 3 and 4, ie least value among "</div><div class='add'>+         "network-latency multiplied by outstanding-read-requests."},</div><div class='add'>+    {</div><div class='add'>+        .key = {"choose-local"},</div><div class='add'>+        .type = GF_OPTION_TYPE_BOOL,</div><div class='add'>+        .default_value = "true",</div><div class='add'>+        .op_version = {2},</div><div class='add'>+        .flags = OPT_FLAG_CLIENT_OPT | OPT_FLAG_SETTABLE | OPT_FLAG_DOC,</div><div class='add'>+        .tags = {"replicate"},</div><div class='add'>+        .description = "Choose a local subvolume (i.e. Brick) to read from"</div><div class='add'>+                       " if read-subvolume is not explicitly set.",</div><div class='add'>+    },</div><div class='add'>+    {.key = {"background-self-heal-count"},</div><div class='add'>+     .type = GF_OPTION_TYPE_INT,</div><div class='add'>+     .min = 0,</div><div class='add'>+     .max = 256,</div><div class='add'>+     .default_value = "8",</div><div class='add'>+     .validate = GF_OPT_VALIDATE_MIN,</div><div class='add'>+     .op_version = {1},</div><div class='add'>+     .flags = OPT_FLAG_CLIENT_OPT | OPT_FLAG_SETTABLE | OPT_FLAG_DOC,</div><div class='add'>+     .tags = {"replicate"},</div><div class='add'>+     .description = "This specifies the number of per client self-heal "</div><div class='add'>+                    "jobs that can perform parallel heals in the "</div><div class='add'>+                    "background."},</div><div class='add'>+    {.key = {"halo-shd-max-latency"},</div><div class='add'>+     .type = GF_OPTION_TYPE_INT,</div><div class='add'>+     .min = 1,</div><div class='add'>+     .max = 99999,</div><div class='add'>+     .default_value = "99999",</div><div class='add'>+     .op_version = {GD_OP_VERSION_3_11_0},</div><div class='add'>+     .flags = OPT_FLAG_CLIENT_OPT | OPT_FLAG_SETTABLE | OPT_FLAG_DOC,</div><div class='add'>+     .tags = {"replicate", "halo"},</div><div class='add'>+     .description = "Maximum latency for shd halo replication in msec."},</div><div class='add'>+    {.key = {"halo-enabled"},</div><div class='add'>+     .type = GF_OPTION_TYPE_BOOL,</div><div class='add'>+     .default_value = "False",</div><div class='add'>+     .op_version = {GD_OP_VERSION_3_11_0},</div><div class='add'>+     .flags = OPT_FLAG_CLIENT_OPT | OPT_FLAG_SETTABLE | OPT_FLAG_DOC,</div><div class='add'>+     .tags = {"replicate", "halo"},</div><div class='add'>+     .description = "Enable Halo (geo) replication mode."},</div><div class='add'>+    {.key = {"halo-nfsd-max-latency"},</div><div class='add'>+     .type = GF_OPTION_TYPE_INT,</div><div class='add'>+     .min = 1,</div><div class='add'>+     .max = 99999,</div><div class='add'>+     .default_value = "5",</div><div class='add'>+     .op_version = {GD_OP_VERSION_3_11_0},</div><div class='add'>+     .flags = OPT_FLAG_CLIENT_OPT | OPT_FLAG_SETTABLE | OPT_FLAG_DOC,</div><div class='add'>+     .tags = {"replicate", "halo"},</div><div class='add'>+     .description = "Maximum latency for nfsd halo replication in msec."},</div><div class='add'>+    {.key = {"halo-max-latency"},</div><div class='add'>+     .type = GF_OPTION_TYPE_INT,</div><div class='add'>+     .min = 1,</div><div class='add'>+     .max = AFR_HALO_MAX_LATENCY,</div><div class='add'>+     .default_value = "5",</div><div class='add'>+     .op_version = {GD_OP_VERSION_3_11_0},</div><div class='add'>+     .flags = OPT_FLAG_CLIENT_OPT | OPT_FLAG_SETTABLE | OPT_FLAG_DOC,</div><div class='add'>+     .tags = {"replicate", "halo"},</div><div class='add'>+     .description = "Maximum latency for halo replication in msec."},</div><div class='add'>+    {.key = {"halo-max-replicas"},</div><div class='add'>+     .type = GF_OPTION_TYPE_INT,</div><div class='add'>+     .min = 1,</div><div class='add'>+     .max = 99999,</div><div class='add'>+     .default_value = "99999",</div><div class='add'>+     .op_version = {GD_OP_VERSION_3_11_0},</div><div class='add'>+     .flags = OPT_FLAG_CLIENT_OPT | OPT_FLAG_SETTABLE | OPT_FLAG_DOC,</div><div class='add'>+     .tags = {"replicate", "halo"},</div><div class='add'>+     .description = "The maximum number of halo replicas; replicas"</div><div class='add'>+                    " beyond this value will be written asynchronously"</div><div class='add'>+                    "via the SHD."},</div><div class='add'>+    {.key = {"halo-min-replicas"},</div><div class='add'>+     .type = GF_OPTION_TYPE_INT,</div><div class='add'>+     .min = 1,</div><div class='add'>+     .max = 99999,</div><div class='add'>+     .default_value = "2",</div><div class='add'>+     .op_version = {GD_OP_VERSION_3_11_0},</div><div class='add'>+     .flags = OPT_FLAG_CLIENT_OPT | OPT_FLAG_SETTABLE | OPT_FLAG_DOC,</div><div class='add'>+     .tags = {"replicate", "halo"},</div><div class='add'>+     .description = "The minimmum number of halo replicas, before adding "</div><div class='add'>+                    "out of region replicas."},</div><div class='add'>+    {.key = {"heal-wait-queue-length"},</div><div class='add'>+     .type = GF_OPTION_TYPE_INT,</div><div class='add'>+     .min = 0,</div><div class='add'>+     .max = 10000, /*Around 100MB with sizeof(afr_local_t)= 10496 bytes*/</div><div class='add'>+     .default_value = "128",</div><div class='add'>+     .validate = GF_OPT_VALIDATE_MIN,</div><div class='add'>+     .op_version = {GD_OP_VERSION_3_7_10},</div><div class='add'>+     .flags = OPT_FLAG_CLIENT_OPT | OPT_FLAG_SETTABLE | OPT_FLAG_DOC,</div><div class='add'>+     .tags = {"replicate"},</div><div class='add'>+     .description = "This specifies the number of heals that can be queued"</div><div class='add'>+                    " for the parallel background self heal jobs."},</div><div class='add'>+    {.key = {"data-self-heal"},</div><div class='add'>+     .type = GF_OPTION_TYPE_STR,</div><div class='add'>+     .value = {"1", "on", "yes", "true", "enable", "0", "off", "no", "false",</div><div class='add'>+               "disable", "open"},</div><div class='add'>+     .default_value = "off",</div><div class='add'>+     .op_version = {1},</div><div class='add'>+     .flags = OPT_FLAG_CLIENT_OPT | OPT_FLAG_SETTABLE | OPT_FLAG_DOC,</div><div class='add'>+     .tags = {"replicate"},</div><div class='add'>+     .description = "Using this option we can enable/disable data "</div><div class='add'>+                    "self-heal on the file. \"open\" means data "</div><div class='add'>+                    "self-heal action will only be triggered by file "</div><div class='add'>+                    "open operations."},</div><div class='add'>+    {.key = {"data-self-heal-algorithm"},</div><div class='add'>+     .type = GF_OPTION_TYPE_STR,</div><div class='add'>+     .op_version = {1},</div><div class='add'>+     .flags = OPT_FLAG_CLIENT_OPT | OPT_FLAG_SETTABLE | OPT_FLAG_DOC,</div><div class='add'>+     .tags = {"replicate"},</div><div class='add'>+     .description = "Select between \"full\", \"diff\". The "</div><div class='add'>+                    "\"full\" algorithm copies the entire file from "</div><div class='add'>+                    "source to sink. The \"diff\" algorithm copies to "</div><div class='add'>+                    "sink only those blocks whose checksums don't match "</div><div class='add'>+                    "with those of source. If no option is configured "</div><div class='add'>+                    "the option is chosen dynamically as follows: "</div><div class='add'>+                    "If the file does not exist on one of the sinks "</div><div class='add'>+                    "or empty file exists or if the source file size is "</div><div class='add'>+                    "about the same as page size the entire file will "</div><div class='add'>+                    "be read and written i.e \"full\" algo, "</div><div class='add'>+                    "otherwise \"diff\" algo is chosen.",</div><div class='add'>+     .value = {"diff", "full"}},</div><div class='add'>+    {.key = {"data-self-heal-window-size"},</div><div class='add'>+     .type = GF_OPTION_TYPE_INT,</div><div class='add'>+     .min = 1,</div><div class='add'>+     .max = 1024,</div><div class='add'>+     .default_value = "1",</div><div class='add'>+     .op_version = {1},</div><div class='add'>+     .flags = OPT_FLAG_CLIENT_OPT | OPT_FLAG_SETTABLE | OPT_FLAG_DOC,</div><div class='add'>+     .tags = {"replicate"},</div><div class='add'>+     .description = "Maximum number blocks per file for which self-heal "</div><div class='add'>+                    "process would be applied simultaneously."},</div><div class='add'>+    {.key = {"metadata-self-heal"},</div><div class='add'>+     .type = GF_OPTION_TYPE_BOOL,</div><div class='add'>+     .default_value = "off",</div><div class='add'>+     .op_version = {1},</div><div class='add'>+     .flags = OPT_FLAG_CLIENT_OPT | OPT_FLAG_SETTABLE | OPT_FLAG_DOC,</div><div class='add'>+     .tags = {"replicate"},</div><div class='add'>+     /*.validate_fn = validate_replica*/</div><div class='add'>+     .description = "Using this option we can enable/disable metadata "</div><div class='add'>+                    "i.e. Permissions, ownerships, xattrs self-heal on "</div><div class='add'>+                    "the file/directory."},</div><div class='add'>+    {.key = {"entry-self-heal"},</div><div class='add'>+     .type = GF_OPTION_TYPE_BOOL,</div><div class='add'>+     .default_value = "off",</div><div class='add'>+     .op_version = {1},</div><div class='add'>+     .flags = OPT_FLAG_CLIENT_OPT | OPT_FLAG_SETTABLE | OPT_FLAG_DOC,</div><div class='add'>+     .tags = {"replicate"},</div><div class='add'>+     /*.validate_fn = validate_replica*/</div><div class='add'>+     .description = "Using this option we can enable/disable entry "</div><div class='add'>+                    "self-heal on the directory."},</div><div class='add'>+    {.key = {"data-change-log"},</div><div class='add'>+     .type = GF_OPTION_TYPE_BOOL,</div><div class='add'>+     .default_value = "on",</div><div class='add'>+     .op_version = {1},</div><div class='add'>+     .flags = OPT_FLAG_CLIENT_OPT | OPT_FLAG_SETTABLE | OPT_FLAG_DOC,</div><div class='add'>+     .tags = {"replicate"},</div><div class='add'>+     .description = "This option exists only for backward compatibility "</div><div class='add'>+                    "and configuring it doesn't have any effect"},</div><div class='add'>+    {.key = {"metadata-change-log"},</div><div class='add'>+     .type = GF_OPTION_TYPE_BOOL,</div><div class='add'>+     .default_value = "on",</div><div class='add'>+     .op_version = {1},</div><div class='add'>+     .flags = OPT_FLAG_CLIENT_OPT | OPT_FLAG_SETTABLE | OPT_FLAG_DOC,</div><div class='add'>+     .tags = {"replicate"},</div><div class='add'>+     .description = "This option exists only for backward compatibility "</div><div class='add'>+                    "and configuring it doesn't have any effect"},</div><div class='add'>+    {.key = {"entry-change-log"},</div><div class='add'>+     .type = GF_OPTION_TYPE_BOOL,</div><div class='add'>+     .default_value = "on",</div><div class='add'>+     .op_version = {1},</div><div class='add'>+     .flags = OPT_FLAG_CLIENT_OPT | OPT_FLAG_SETTABLE | OPT_FLAG_DOC,</div><div class='add'>+     .tags = {"replicate"},</div><div class='add'>+     .description = "This option exists only for backward compatibility "</div><div class='add'>+                    "and configuring it doesn't have any effect"},</div><div class='add'>+    {.key = {"optimistic-change-log"},</div><div class='add'>+     .type = GF_OPTION_TYPE_BOOL,</div><div class='add'>+     .default_value = "on",</div><div class='add'>+     .description = "Entry/Metadata fops will not perform "</div><div class='add'>+                    "pre fop changelog operations in afr transaction "</div><div class='add'>+                    "if this option is enabled."},</div><div class='add'>+    {.key = {"inodelk-trace"},</div><div class='add'>+     .type = GF_OPTION_TYPE_BOOL,</div><div class='add'>+     .default_value = "off",</div><div class='add'>+     .description = "Enabling this option logs inode lock/unlocks"},</div><div class='add'>+    {.key = {"entrylk-trace"},</div><div class='add'>+     .type = GF_OPTION_TYPE_BOOL,</div><div class='add'>+     .default_value = "off",</div><div class='add'>+     .description = "Enabling this option logs entry lock/unlocks"},</div><div class='add'>+    {.key = {"pre-op-compat"},</div><div class='add'>+     .type = GF_OPTION_TYPE_BOOL,</div><div class='add'>+     .default_value = "on",</div><div class='add'>+     .description = "Use separate pre-op xattrop() FOP rather than "</div><div class='add'>+                    "overloading xdata of the OP"},</div><div class='add'>+    {.key = {"eager-lock"},</div><div class='add'>+     .type = GF_OPTION_TYPE_BOOL,</div><div class='add'>+     .default_value = "on",</div><div class='add'>+     .op_version = {1},</div><div class='add'>+     .flags = OPT_FLAG_CLIENT_OPT | OPT_FLAG_SETTABLE | OPT_FLAG_DOC,</div><div class='add'>+     .tags = {"replicate"},</div><div class='add'>+     .description =</div><div class='add'>+         "Enable/Disable eager lock for replica volume. "</div><div class='add'>+         "Lock phase of a transaction has two sub-phases. "</div><div class='add'>+         "First is an attempt to acquire locks in parallel by "</div><div class='add'>+         "broadcasting non-blocking lock requests. If lock "</div><div class='add'>+         "acquisition fails on any server, then the held locks "</div><div class='add'>+         "are unlocked and we revert to a blocking locks mode "</div><div class='add'>+         "sequentially on one server after another.  If this "</div><div class='add'>+         "option is enabled the initial broadcasting lock "</div><div class='add'>+         "request attempts to acquire a full lock on the entire file. "</div><div class='add'>+         "If this fails, we revert back to the sequential "</div><div class='add'>+         "\"regional\" blocking locks as before. In the case "</div><div class='add'>+         "where such an \"eager\" lock is granted in the "</div><div class='add'>+         "non-blocking phase, it gives rise to an opportunity "</div><div class='add'>+         "for optimization. i.e, if the next write transaction "</div><div class='add'>+         "on the same FD arrives before the unlock phase of "</div><div class='add'>+         "the first transaction, it \"takes over\" the full "</div><div class='add'>+         "file lock. Similarly if yet another data transaction "</div><div class='add'>+         "arrives before the unlock phase of the \"optimized\" "</div><div class='add'>+         "transaction, that in turn \"takes over\" the lock as "</div><div class='add'>+         "well. The actual unlock now happens at the end of "</div><div class='add'>+         "the last \"optimized\" transaction."</div><div class='add'>+</div><div class='add'>+    },</div><div class='add'>+    {.key = {"self-heal-daemon"},</div><div class='add'>+     .type = GF_OPTION_TYPE_BOOL,</div><div class='add'>+     .default_value = "on",</div><div class='add'>+     .op_version = {1},</div><div class='add'>+     .flags = OPT_FLAG_CLIENT_OPT | OPT_FLAG_SETTABLE,</div><div class='add'>+     .tags = {"replicate"},</div><div class='add'>+     /*.validate_fn   = validate_replica_heal_enable_disable*/</div><div class='add'>+     .description = "This option applies to only self-heal-daemon. "</div><div class='add'>+                    "Index directory crawl and automatic healing of files "</div><div class='add'>+                    "will not be performed if this option is turned off."},</div><div class='add'>+    {.key = {"iam-self-heal-daemon"},</div><div class='add'>+     .type = GF_OPTION_TYPE_BOOL,</div><div class='add'>+     .default_value = "off",</div><div class='add'>+     .description = "This option differentiates if the replicate "</div><div class='add'>+                    "translator is running as part of self-heal-daemon "</div><div class='add'>+                    "or not."},</div><div class='add'>+    {.key = {"iam-nfs-daemon"},</div><div class='add'>+     .type = GF_OPTION_TYPE_BOOL,</div><div class='add'>+     .default_value = "off",</div><div class='add'>+     .description = "This option differentiates if the replicate "</div><div class='add'>+                    "translator is running as part of an NFS daemon "</div><div class='add'>+                    "or not."},</div><div class='add'>+    {</div><div class='add'>+        .key = {"quorum-type"},</div><div class='add'>+        .type = GF_OPTION_TYPE_STR,</div><div class='add'>+        .value = {"none", "auto", "fixed"},</div><div class='add'>+        .default_value = "none",</div><div class='add'>+        .op_version = {1},</div><div class='add'>+        .flags = OPT_FLAG_CLIENT_OPT | OPT_FLAG_SETTABLE | OPT_FLAG_DOC,</div><div class='add'>+        .tags = {"replicate"},</div><div class='add'>+        /*.option = quorum-type*/</div><div class='add'>+        .description = "If value is \"fixed\" only allow writes if "</div><div class='add'>+                       "quorum-count bricks are present.  If value is "</div><div class='add'>+                       "\"auto\" only allow writes if more than half of "</div><div class='add'>+                       "bricks, or exactly half including the first, are "</div><div class='add'>+                       "present.",</div><div class='add'>+    },</div><div class='add'>+    {</div><div class='add'>+        .key = {"quorum-count"},</div><div class='add'>+        .type = GF_OPTION_TYPE_INT,</div><div class='add'>+        .min = 1,</div><div class='add'>+        .max = INT_MAX,</div><div class='add'>+        .default_value = 0,</div><div class='add'>+        .op_version = {1},</div><div class='add'>+        .flags = OPT_FLAG_CLIENT_OPT | OPT_FLAG_SETTABLE | OPT_FLAG_DOC,</div><div class='add'>+        .tags = {"replicate"},</div><div class='add'>+        /*.option = quorum-count*/</div><div class='add'>+        /*.validate_fn = validate_quorum_count*/</div><div class='add'>+        .description = "If quorum-type is \"fixed\" only allow writes if "</div><div class='add'>+                       "this many bricks are present.  Other quorum types "</div><div class='add'>+                       "will OVERWRITE this value.",</div><div class='add'>+    },</div><div class='add'>+    {</div><div class='add'>+        .key = {"quorum-reads"},</div><div class='add'>+        .type = GF_OPTION_TYPE_BOOL,</div><div class='add'>+        .default_value = "no",</div><div class='add'>+        .op_version = {GD_OP_VERSION_3_7_0},</div><div class='add'>+        .flags = OPT_FLAG_CLIENT_OPT | OPT_FLAG_SETTABLE | OPT_FLAG_DOC,</div><div class='add'>+        .tags = {"replicate"},</div><div class='add'>+        .description = "This option has been removed. Reads are not allowed "</div><div class='add'>+                       "if quorum is not met.",</div><div class='add'>+    },</div><div class='add'>+    {</div><div class='add'>+        .key = {"node-uuid"},</div><div class='add'>+        .type = GF_OPTION_TYPE_STR,</div><div class='add'>+        .description = "Local glusterd uuid string, used in starting "</div><div class='add'>+                       "self-heal-daemon so that it can crawl only on "</div><div class='add'>+                       "local index directories.",</div><div class='add'>+    },</div><div class='add'>+    {</div><div class='add'>+        .key = {"post-op-delay-secs"},</div><div class='add'>+        .type = GF_OPTION_TYPE_INT,</div><div class='add'>+        .min = 0,</div><div class='add'>+        .max = INT_MAX,</div><div class='add'>+        .default_value = "1",</div><div class='add'>+        .op_version = {2},</div><div class='add'>+        .flags = OPT_FLAG_CLIENT_OPT | OPT_FLAG_SETTABLE | OPT_FLAG_DOC,</div><div class='add'>+        .tags = {"replicate"},</div><div class='add'>+        .description = "Time interval induced artificially before "</div><div class='add'>+                       "post-operation phase of the transaction to "</div><div class='add'>+                       "enhance overlap of adjacent write operations.",</div><div class='add'>+    },</div><div class='add'>+    {</div><div class='add'>+        .key = {AFR_SH_READDIR_SIZE_KEY},</div><div class='add'>+        .type = GF_OPTION_TYPE_SIZET,</div><div class='add'>+        .description = "readdirp size for performing entry self-heal",</div><div class='add'>+        .min = 1024,</div><div class='add'>+        .max = 131072,</div><div class='add'>+        .op_version = {2},</div><div class='add'>+        .flags = OPT_FLAG_CLIENT_OPT | OPT_FLAG_SETTABLE,</div><div class='add'>+        .tags = {"replicate"},</div><div class='add'>+        .default_value = "1KB",</div><div class='add'>+    },</div><div class='add'>+    {</div><div class='add'>+        .key = {"ensure-durability"},</div><div class='add'>+        .type = GF_OPTION_TYPE_BOOL,</div><div class='add'>+        .op_version = {3},</div><div class='add'>+        .flags = OPT_FLAG_CLIENT_OPT | OPT_FLAG_SETTABLE | OPT_FLAG_DOC,</div><div class='add'>+        .tags = {"replicate"},</div><div class='add'>+        .description = "Afr performs fsyncs for transactions if this "</div><div class='add'>+                       "option is on to make sure the changelogs/data is "</div><div class='add'>+                       "written to the disk",</div><div class='add'>+        .default_value = "on",</div><div class='add'>+    },</div><div class='add'>+    {</div><div class='add'>+        .key = {"afr-dirty-xattr"},</div><div class='add'>+        .type = GF_OPTION_TYPE_STR,</div><div class='add'>+        .default_value = AFR_DIRTY_DEFAULT,</div><div class='add'>+    },</div><div class='add'>+    {.key = {"afr-pending-xattr"},</div><div class='add'>+     .type = GF_OPTION_TYPE_STR,</div><div class='add'>+     .description = "Comma separated list of xattrs that are used to  "</div><div class='add'>+                    "capture information on pending heals."},</div><div class='add'>+    {</div><div class='add'>+        .key = {"metadata-splitbrain-forced-heal"},</div><div class='add'>+        .type = GF_OPTION_TYPE_BOOL,</div><div class='add'>+        .default_value = "off",</div><div class='add'>+    },</div><div class='add'>+    {.key = {"heal-timeout"},</div><div class='add'>+     .type = GF_OPTION_TYPE_INT,</div><div class='add'>+     .min = 5,</div><div class='add'>+     .max = INT_MAX,</div><div class='add'>+     .default_value = "600",</div><div class='add'>+     .op_version = {2},</div><div class='add'>+     .flags = OPT_FLAG_CLIENT_OPT | OPT_FLAG_SETTABLE | OPT_FLAG_DOC,</div><div class='add'>+     .tags = {"replicate"},</div><div class='add'>+     .description = "time interval for checking the need to self-heal "</div><div class='add'>+                    "in self-heal-daemon"},</div><div class='add'>+    {</div><div class='add'>+        .key = {"consistent-metadata"},</div><div class='add'>+        .type = GF_OPTION_TYPE_BOOL,</div><div class='add'>+        .default_value = "no",</div><div class='add'>+        .op_version = {GD_OP_VERSION_3_7_0},</div><div class='add'>+        .flags = OPT_FLAG_CLIENT_OPT | OPT_FLAG_SETTABLE | OPT_FLAG_DOC,</div><div class='add'>+        .tags = {"replicate"},</div><div class='add'>+        .description = "If this option is enabled, readdirp will force "</div><div class='add'>+                       "lookups on those entries read whose read child is "</div><div class='add'>+                       "not the same as that of the parent. This will "</div><div class='add'>+                       "guarantee that all read operations on a file serve "</div><div class='add'>+                       "attributes from the same subvol as long as it holds "</div><div class='add'>+                       " a good copy of the file/dir.",</div><div class='add'>+    },</div><div class='add'>+    {.key = {"arbiter-count"},</div><div class='add'>+     .type = GF_OPTION_TYPE_INT,</div><div class='add'>+     .description = "subset of child_count. Has to be 0 or 1."},</div><div class='add'>+    {</div><div class='add'>+        .key = {"thin-arbiter"},</div><div class='add'>+        .type = GF_OPTION_TYPE_STR,</div><div class='add'>+        .op_version = {GD_OP_VERSION_4_1_0},</div><div class='add'>+        .flags = OPT_FLAG_SETTABLE,</div><div class='add'>+        .tags = {"replicate"},</div><div class='add'>+        .description = "contains host:path of thin abriter brick",</div><div class='add'>+    },</div><div class='add'>+    {.key = {"shd-max-threads"},</div><div class='add'>+     .type = GF_OPTION_TYPE_INT,</div><div class='add'>+     .min = 1,</div><div class='add'>+     .max = 64,</div><div class='add'>+     .default_value = "1",</div><div class='add'>+     .op_version = {GD_OP_VERSION_3_7_12},</div><div class='add'>+     .flags = OPT_FLAG_CLIENT_OPT | OPT_FLAG_SETTABLE | OPT_FLAG_DOC,</div><div class='add'>+     .tags = {"replicate"},</div><div class='add'>+     .description = "Maximum number of parallel heals SHD can do per "</div><div class='add'>+                    "local brick. This can substantially lower heal times"</div><div class='add'>+                    ", but can also crush your bricks if you don't have "</div><div class='add'>+                    "the storage hardware to support this."},</div><div class='add'>+    {</div><div class='add'>+        .key = {"shd-wait-qlength"},</div><div class='add'>+        .type = GF_OPTION_TYPE_INT,</div><div class='add'>+        .min = 1,</div><div class='add'>+        .max = 655536,</div><div class='add'>+        .default_value = "1024",</div><div class='add'>+        .op_version = {GD_OP_VERSION_3_7_12},</div><div class='add'>+        .flags = OPT_FLAG_CLIENT_OPT | OPT_FLAG_SETTABLE | OPT_FLAG_DOC,</div><div class='add'>+        .tags = {"replicate"},</div><div class='add'>+        .description = "This option can be used to control number of heals"</div><div class='add'>+                       " that can wait in SHD per subvolume",</div><div class='add'>+    },</div><div class='add'>+    {</div><div class='add'>+        .key = {"locking-scheme"},</div><div class='add'>+        .type = GF_OPTION_TYPE_STR,</div><div class='add'>+        .value = {"full", "granular"},</div><div class='add'>+        .default_value = "full",</div><div class='add'>+        .op_version = {GD_OP_VERSION_3_7_12},</div><div class='add'>+        .flags = OPT_FLAG_CLIENT_OPT | OPT_FLAG_SETTABLE | OPT_FLAG_DOC,</div><div class='add'>+        .tags = {"replicate"},</div><div class='add'>+        .description = "If this option is set to granular, self-heal will "</div><div class='add'>+                       "stop being compatible with afr-v1, which helps afr "</div><div class='add'>+                       "be more granular while self-healing",</div><div class='add'>+    },</div><div class='add'>+    {.key = {"full-lock"},</div><div class='add'>+     .type = GF_OPTION_TYPE_BOOL,</div><div class='add'>+     .default_value = "yes",</div><div class='add'>+     .op_version = {GD_OP_VERSION_3_13_2},</div><div class='add'>+     .flags = OPT_FLAG_CLIENT_OPT | OPT_FLAG_SETTABLE,</div><div class='add'>+     .tags = {"replicate"},</div><div class='add'>+     .description = "If this option is disabled, then the IOs will take "</div><div class='add'>+                    "range locks same as versions till 3.13.1."},</div><div class='add'>+    {</div><div class='add'>+        .key = {"granular-entry-heal"},</div><div class='add'>+        .type = GF_OPTION_TYPE_BOOL,</div><div class='add'>+        .default_value = "no",</div><div class='add'>+        .op_version = {GD_OP_VERSION_3_8_0},</div><div class='add'>+        .flags = OPT_FLAG_CLIENT_OPT | OPT_FLAG_SETTABLE | OPT_FLAG_DOC,</div><div class='add'>+        .tags = {"replicate"},</div><div class='add'>+        .description = "If this option is enabled, self-heal will resort to "</div><div class='add'>+                       "granular way of recording changelogs and doing entry "</div><div class='add'>+                       "self-heal.",</div><div class='add'>+    },</div><div class='add'>+    {</div><div class='add'>+        .key = {"favorite-child-policy"},</div><div class='add'>+        .type = GF_OPTION_TYPE_STR,</div><div class='add'>+        .value = {"none", "size", "ctime", "mtime", "majority"},</div><div class='add'>+        .default_value = "none",</div><div class='add'>+        .op_version = {GD_OP_VERSION_3_7_12},</div><div class='add'>+        .flags = OPT_FLAG_CLIENT_OPT | OPT_FLAG_SETTABLE | OPT_FLAG_DOC,</div><div class='add'>+        .tags = {"replicate"},</div><div class='add'>+        .description = "This option can be used to automatically resolve "</div><div class='add'>+                       "split-brains using various policies without user "</div><div class='add'>+                       "intervention. \"size\" picks the file with the "</div><div class='add'>+                       "biggest size as the source. \"ctime\" and \"mtime\" "</div><div class='add'>+                       "pick the file with the latest ctime and mtime "</div><div class='add'>+                       "respectively as the source. \"majority\" picks a file"</div><div class='add'>+                       " with identical mtime and size in more than half the "</div><div class='add'>+                       "number of bricks in the replica.",</div><div class='add'>+    },</div><div class='add'>+    {</div><div class='add'>+        .key = {"consistent-io"},</div><div class='add'>+        .type = GF_OPTION_TYPE_BOOL,</div><div class='add'>+        .default_value = "no",</div><div class='add'>+        .description = "If this option is enabled, i/o will fail even if "</div><div class='add'>+                       "one of the bricks is down in the replicas",</div><div class='add'>+    },</div><div class='add'>+    {.key = {"use-compound-fops"},</div><div class='add'>+     .type = GF_OPTION_TYPE_BOOL,</div><div class='add'>+     .default_value = "no",</div><div class='add'>+     .op_version = {GD_OP_VERSION_3_8_4},</div><div class='add'>+     .flags = OPT_FLAG_CLIENT_OPT | OPT_FLAG_SETTABLE | OPT_FLAG_DOC,</div><div class='add'>+     .tags = {"replicate"},</div><div class='add'>+     .description = "This option exists only for backward compatibility "</div><div class='add'>+                    "and configuring it doesn't have any effect"},</div><div class='add'>+    {.key = {"use-anonymous-inode"},</div><div class='add'>+     .type = GF_OPTION_TYPE_BOOL,</div><div class='add'>+     .default_value = "no",</div><div class='add'>+     .op_version = {GD_OP_VERSION_8_0},</div><div class='add'>+     .flags = OPT_FLAG_CLIENT_OPT | OPT_FLAG_SETTABLE,</div><div class='add'>+     .tags = {"replicate"},</div><div class='add'>+     .description = "Setting this option heals directory renames efficiently"},</div><div class='add'>+</div><div class='add'>+    {.key = {NULL}},</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+xlator_api_t xlator_api = {</div><div class='add'>+    .init = init,</div><div class='add'>+    .fini = fini,</div><div class='add'>+    .notify = notify,</div><div class='add'>+    .reconfigure = reconfigure,</div><div class='add'>+    .mem_acct_init = mem_acct_init,</div><div class='add'>+    .op_version = {1}, /* Present from the initial version */</div><div class='add'>+    .dumpops = &amp;dumpops,</div><div class='add'>+    .fops = &amp;fops,</div><div class='add'>+    .cbks = &amp;cbks,</div><div class='add'>+    .options = options,</div><div class='add'>+    .identifier = "replicate",</div><div class='add'>+    .category = GF_MAINTAINED,</div><div class='ctx'> };</div><div class='head'>diff --git a/xlators/cluster/afr/src/afr.h b/xlators/cluster/afr/src/afr.h<br/>index 7ce4b0cea65..d62f9a9caf2 100644<br/>--- a/<a href='/cgit/glusterfs.git/tree/xlators/cluster/afr/src/afr.h?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/cluster/afr/src/afr.h</a><br/>+++ b/<a href='/cgit/glusterfs.git/tree/xlators/cluster/afr/src/afr.h?id=d1d7a6f35c816822fab51c820e25023863c239c1'>xlators/cluster/afr/src/afr.h</a></div><div class='hunk'>@@ -1,902 +1,1423 @@</div><div class='ctx'> /*</div><div class='del'>-   Copyright (c) 2008-2009 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='del'>-   This file is part of GlusterFS.</div><div class='del'>-</div><div class='del'>-   GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-   it under the terms of the GNU General Public License as published</div><div class='del'>-   by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-   or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-   GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-   WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-   General Public License for more details.</div><div class='del'>-</div><div class='del'>-   You should have received a copy of the GNU General Public License</div><div class='del'>-   along with this program.  If not, see</div><div class='del'>-   &lt;http://www.gnu.org/licenses/&gt;.</div><div class='del'>-*/</div><div class='add'>+  Copyright (c) 2008-2012 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='ctx'> </div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='ctx'> </div><div class='ctx'> #ifndef __AFR_H__</div><div class='ctx'> #define __AFR_H__</div><div class='ctx'> </div><div class='del'>-#ifndef _CONFIG_H</div><div class='del'>-#define _CONFIG_H</div><div class='del'>-#include "config.h"</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-#include "call-stub.h"</div><div class='del'>-#include "compat-errno.h"</div><div class='add'>+#include &lt;glusterfs/call-stub.h&gt;</div><div class='add'>+#include &lt;glusterfs/compat-errno.h&gt;</div><div class='ctx'> #include "afr-mem-types.h"</div><div class='ctx'> </div><div class='del'>-#define AFR_XATTR_PREFIX "trusted.afr"</div><div class='add'>+#include "libxlator.h"</div><div class='add'>+#include &lt;glusterfs/timer.h&gt;</div><div class='add'>+#include &lt;glusterfs/syncop.h&gt;</div><div class='add'>+</div><div class='add'>+#include "afr-self-heald.h"</div><div class='add'>+#include "afr-messages.h"</div><div class='add'>+</div><div class='add'>+#define SHD_INODE_LRU_LIMIT 1</div><div class='add'>+#define AFR_PATHINFO_HEADER "REPLICATE:"</div><div class='add'>+#define AFR_SH_READDIR_SIZE_KEY "self-heal-readdir-size"</div><div class='add'>+#define AFR_SH_DATA_DOMAIN_FMT "%s:self-heal"</div><div class='add'>+#define AFR_DIRTY_DEFAULT AFR_XATTR_PREFIX ".dirty"</div><div class='add'>+#define AFR_DIRTY (((afr_private_t *)(THIS-&gt;private))-&gt;afr_dirty)</div><div class='add'>+</div><div class='add'>+#define AFR_LOCKEE_COUNT_MAX 3</div><div class='add'>+#define AFR_DOM_COUNT_MAX 3</div><div class='add'>+#define AFR_NUM_CHANGE_LOGS 3              /*data + metadata + entry*/</div><div class='add'>+#define AFR_DEFAULT_SPB_CHOICE_TIMEOUT 300 /*in seconds*/</div><div class='add'>+</div><div class='add'>+#define ARBITER_BRICK_INDEX 2</div><div class='add'>+#define THIN_ARBITER_BRICK_INDEX 2</div><div class='add'>+#define AFR_TA_DOM_NOTIFY "afr.ta.dom-notify"</div><div class='add'>+#define AFR_TA_DOM_MODIFY "afr.ta.dom-modify"</div><div class='add'>+</div><div class='add'>+#define AFR_LK_HEAL_DOM "afr.lock-heal.domain"</div><div class='add'>+</div><div class='add'>+#define AFR_HALO_MAX_LATENCY 99999</div><div class='add'>+#define AFR_ANON_DIR_PREFIX ".glusterfs-anonymous-inode"</div><div class='add'>+</div><div class='add'>+#define PFLAG_PENDING (1 &lt;&lt; 0)</div><div class='add'>+#define PFLAG_SBRAIN (1 &lt;&lt; 1)</div><div class='add'>+</div><div class='add'>+typedef int (*afr_lock_cbk_t)(call_frame_t *frame, xlator_t *this);</div><div class='add'>+</div><div class='add'>+typedef int (*afr_read_txn_wind_t)(call_frame_t *frame, xlator_t *this,</div><div class='add'>+                                   int subvol);</div><div class='add'>+</div><div class='add'>+typedef int (*afr_inode_refresh_cbk_t)(call_frame_t *frame, xlator_t *this,</div><div class='add'>+                                       int err);</div><div class='add'>+</div><div class='add'>+typedef int (*afr_changelog_resume_t)(call_frame_t *frame, xlator_t *this);</div><div class='add'>+</div><div class='add'>+#define AFR_COUNT(array, max)                                                  \</div><div class='add'>+    ({                                                                         \</div><div class='add'>+        int __i;                                                               \</div><div class='add'>+        int __res = 0;                                                         \</div><div class='add'>+        for (__i = 0; __i &lt; max; __i++)                                        \</div><div class='add'>+            if (array[__i])                                                    \</div><div class='add'>+                __res++;                                                       \</div><div class='add'>+        __res;                                                                 \</div><div class='add'>+    })</div><div class='add'>+#define AFR_INTERSECT(dst, src1, src2, max)                                    \</div><div class='add'>+    ({                                                                         \</div><div class='add'>+        int __i;                                                               \</div><div class='add'>+        for (__i = 0; __i &lt; max; __i++)                                        \</div><div class='add'>+            dst[__i] = src1[__i] &amp;&amp; src2[__i];                                 \</div><div class='add'>+    })</div><div class='add'>+#define AFR_CMP(a1, a2, len)                                                   \</div><div class='add'>+    ({                                                                         \</div><div class='add'>+        int __cmp = 0;                                                         \</div><div class='add'>+        int __i;                                                               \</div><div class='add'>+        for (__i = 0; __i &lt; len; __i++)                                        \</div><div class='add'>+            if (a1[__i] != a2[__i]) {                                          \</div><div class='add'>+                __cmp = 1;                                                     \</div><div class='add'>+                break;                                                         \</div><div class='add'>+            }                                                                  \</div><div class='add'>+        __cmp;                                                                 \</div><div class='add'>+    })</div><div class='add'>+#define AFR_IS_ARBITER_BRICK(priv, index)                                      \</div><div class='add'>+    ((priv-&gt;arbiter_count == 1) &amp;&amp; (index == ARBITER_BRICK_INDEX))</div><div class='add'>+</div><div class='add'>+#define AFR_SET_ERROR_AND_CHECK_SPLIT_BRAIN(ret, errnum)                       \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        local-&gt;op_ret = ret;                                                   \</div><div class='add'>+        local-&gt;op_errno = errnum;                                              \</div><div class='add'>+        if (local-&gt;op_errno == EIO)                                            \</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, local-&gt;op_errno,                  \</div><div class='add'>+                   AFR_MSG_SPLIT_BRAIN,                                        \</div><div class='add'>+                   "Failing %s on gfid %s: "                                   \</div><div class='add'>+                   "split-brain observed.",                                    \</div><div class='add'>+                   gf_fop_list[local-&gt;op], uuid_utoa(local-&gt;inode-&gt;gfid));     \</div><div class='add'>+    } while (0)</div><div class='add'>+</div><div class='add'>+#define AFR_ERROR_OUT_IF_FDCTX_INVALID(__fd, __this, __error, __label)         \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        afr_fd_ctx_t *__fd_ctx = NULL;                                         \</div><div class='add'>+        __fd_ctx = afr_fd_ctx_get(__fd, __this);                               \</div><div class='add'>+        if (__fd_ctx &amp;&amp; __fd_ctx-&gt;is_fd_bad) {                                 \</div><div class='add'>+            __error = EBADF;                                                   \</div><div class='add'>+            goto __label;                                                      \</div><div class='add'>+        }                                                                      \</div><div class='add'>+    } while (0)</div><div class='ctx'> </div><div class='del'>-struct _pump_private;</div><div class='add'>+typedef enum {</div><div class='add'>+    AFR_READ_POLICY_FIRST_UP,</div><div class='add'>+    AFR_READ_POLICY_GFID_HASH,</div><div class='add'>+    AFR_READ_POLICY_GFID_PID_HASH,</div><div class='add'>+    AFR_READ_POLICY_LESS_LOAD,</div><div class='add'>+    AFR_READ_POLICY_LEAST_LATENCY,</div><div class='add'>+    AFR_READ_POLICY_LOAD_LATENCY_HYBRID,</div><div class='add'>+} afr_read_hash_mode_t;</div><div class='ctx'> </div><div class='del'>-typedef struct _afr_private {</div><div class='del'>-	gf_lock_t lock;               /* to guard access to child_count, etc */</div><div class='del'>-	unsigned int child_count;     /* total number of children   */</div><div class='add'>+typedef enum {</div><div class='add'>+    AFR_FAV_CHILD_NONE,</div><div class='add'>+    AFR_FAV_CHILD_BY_SIZE,</div><div class='add'>+    AFR_FAV_CHILD_BY_CTIME,</div><div class='add'>+    AFR_FAV_CHILD_BY_MTIME,</div><div class='add'>+    AFR_FAV_CHILD_BY_MAJORITY,</div><div class='add'>+    AFR_FAV_CHILD_POLICY_MAX,</div><div class='add'>+} afr_favorite_child_policy;</div><div class='ctx'> </div><div class='del'>-        unsigned int read_child_rr;   /* round-robin index of the read_child */</div><div class='del'>-        gf_lock_t read_child_lock;    /* lock to protect above */</div><div class='del'>-        </div><div class='del'>-	xlator_t **children;</div><div class='add'>+typedef enum {</div><div class='add'>+    AFR_SELFHEAL_DATA_FULL = 0,</div><div class='add'>+    AFR_SELFHEAL_DATA_DIFF,</div><div class='add'>+    AFR_SELFHEAL_DATA_DYNAMIC,</div><div class='add'>+} afr_data_self_heal_type_t;</div><div class='ctx'> </div><div class='del'>-        gf_lock_t root_inode_lk;</div><div class='del'>-        int first_lookup;</div><div class='del'>-        inode_t *root_inode;</div><div class='add'>+typedef enum {</div><div class='add'>+    AFR_CHILD_UNKNOWN = -1,</div><div class='add'>+    AFR_CHILD_ZERO,</div><div class='add'>+    AFR_CHILD_ONE,</div><div class='add'>+    AFR_CHILD_THIN_ARBITER,</div><div class='add'>+} afr_child_index;</div><div class='ctx'> </div><div class='del'>-	unsigned char *child_up;</div><div class='add'>+typedef enum {</div><div class='add'>+    TA_WAIT_FOR_NOTIFY_LOCK_REL, /*FOP came after notify domain lock upcall</div><div class='add'>+                                   notification and waiting for its release.*/</div><div class='add'>+    TA_GET_INFO_FROM_TA_FILE,    /*FOP needs post-op on ta file to get</div><div class='add'>+                                  *info about which brick is bad.*/</div><div class='add'>+    TA_INFO_IN_MEMORY_SUCCESS,   /*Bad brick info is in memory and fop failed</div><div class='add'>+                                  *on BAD brick - Success*/</div><div class='add'>+    TA_INFO_IN_MEMORY_FAILED,    /*Bad brick info is in memory and fop failed</div><div class='add'>+                                  *on GOOD brick - Failed*/</div><div class='add'>+    TA_SUCCESS,                  /*FOP succeeded on both data bricks.*/</div><div class='add'>+} afr_ta_fop_state_t;</div><div class='add'>+</div><div class='add'>+struct afr_nfsd {</div><div class='add'>+    uint32_t halo_max_latency_msec;</div><div class='add'>+    gf_boolean_t iamnfsd;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+typedef struct _afr_lk_heal_info {</div><div class='add'>+    fd_t *fd;</div><div class='add'>+    int32_t cmd;</div><div class='add'>+    struct gf_flock flock;</div><div class='add'>+    dict_t *xdata_req;</div><div class='add'>+    unsigned char *locked_nodes;</div><div class='add'>+    struct list_head pos;</div><div class='add'>+    gf_lkowner_t lk_owner;</div><div class='add'>+    pid_t pid;</div><div class='add'>+    int32_t *child_up_event_gen;</div><div class='add'>+    int32_t *child_down_event_gen;</div><div class='add'>+} afr_lk_heal_info_t;</div><div class='ctx'> </div><div class='del'>-        char **pending_key;</div><div class='add'>+typedef struct _afr_private {</div><div class='add'>+    gf_lock_t lock;             /* to guard access to child_count, etc */</div><div class='add'>+    unsigned int child_count;   /* total number of children   */</div><div class='add'>+    unsigned int arbiter_count; /*subset of child_count.</div><div class='add'>+                                  Has to be 0 or 1.*/</div><div class='add'>+</div><div class='add'>+    xlator_t **children;</div><div class='add'>+</div><div class='add'>+    inode_t *root_inode;</div><div class='add'>+</div><div class='add'>+    int favorite_child; /* subvolume to be preferred in resolving</div><div class='add'>+                                    split-brain cases */</div><div class='add'>+    /* For thin-arbiter. */</div><div class='add'>+    uuid_t ta_gfid;</div><div class='add'>+    unsigned int thin_arbiter_count; /* 0 or 1 at the moment.*/</div><div class='add'>+    int ta_bad_child_index;</div><div class='add'>+    int ta_event_gen;</div><div class='add'>+    unsigned int ta_in_mem_txn_count;</div><div class='add'>+    unsigned int ta_on_wire_txn_count;</div><div class='add'>+    struct list_head ta_waitq;</div><div class='add'>+    struct list_head ta_onwireq;</div><div class='add'>+</div><div class='add'>+    unsigned char *anon_inode;</div><div class='add'>+    unsigned char *child_up;</div><div class='add'>+    unsigned char *halo_child_up;</div><div class='add'>+    int64_t *child_latency;</div><div class='add'>+    unsigned char *local;</div><div class='add'>+</div><div class='add'>+    char **pending_key;</div><div class='add'>+</div><div class='add'>+    afr_data_self_heal_type_t data_self_heal_algorithm;</div><div class='add'>+    unsigned int data_self_heal_window_size; /* max number of pipelined</div><div class='add'>+                                                read/writes */</div><div class='add'>+</div><div class='add'>+    struct list_head heal_waiting; /*queue for files that need heal*/</div><div class='add'>+    uint32_t heal_wait_qlen; /*configurable queue length for heal_waiting*/</div><div class='add'>+    int32_t heal_waiters;    /* No. of elements currently in wait queue.*/</div><div class='add'>+</div><div class='add'>+    struct list_head healing;            /* queue for files that are undergoing</div><div class='add'>+                                            background heal*/</div><div class='add'>+    uint32_t background_self_heal_count; /*configurable queue length for</div><div class='add'>+                                           healing queue*/</div><div class='add'>+    int32_t healers; /* No. of elements currently undergoing background</div><div class='add'>+                      heal*/</div><div class='add'>+</div><div class='add'>+    gf_boolean_t release_ta_notify_dom_lock;</div><div class='add'>+</div><div class='add'>+    gf_boolean_t metadata_self_heal; /* on/off */</div><div class='add'>+    gf_boolean_t entry_self_heal;    /* on/off */</div><div class='add'>+</div><div class='add'>+    gf_boolean_t metadata_splitbrain_forced_heal; /* on/off */</div><div class='add'>+    int read_child;                               /* read-subvolume */</div><div class='add'>+    gf_atomic_t *pending_reads; /*No. of pending read cbks per child.*/</div><div class='add'>+</div><div class='add'>+    gf_timer_t *timer; /* launched when parent up is received */</div><div class='add'>+</div><div class='add'>+    unsigned int wait_count; /* # of servers to wait for success */</div><div class='add'>+</div><div class='add'>+    unsigned char ta_child_up;</div><div class='add'>+    gf_boolean_t optimistic_change_log;</div><div class='add'>+    gf_boolean_t eager_lock;</div><div class='add'>+    gf_boolean_t pre_op_compat; /* on/off */</div><div class='add'>+    uint32_t post_op_delay_secs;</div><div class='add'>+    unsigned int quorum_count;</div><div class='add'>+</div><div class='add'>+    off_t ta_notify_dom_lock_offset;</div><div class='add'>+    afr_favorite_child_policy fav_child_policy; /*Policy to use for automatic</div><div class='add'>+                                              resolution of split-brains.*/</div><div class='add'>+    afr_read_hash_mode_t hash_mode; /* for when read_child is not set */</div><div class='add'>+</div><div class='add'>+    int32_t *last_event;</div><div class='add'>+</div><div class='add'>+    /* @event_generation: Keeps count of number of events received which can</div><div class='add'>+       potentially impact consistency decisions. The events are CHILD_UP</div><div class='add'>+       and CHILD_DOWN, when we have to recalculate the freshness/staleness</div><div class='add'>+       of copies to detect if changes had happened while the other server</div><div class='add'>+       was down. CHILD_DOWN and CHILD_UP can also be received on network</div><div class='add'>+       disconnect/reconnects and not necessarily server going down/up.</div><div class='add'>+       Recalculating freshness/staleness on network events is equally</div><div class='add'>+       important as we might have had a network split brain.</div><div class='add'>+    */</div><div class='add'>+    uint32_t event_generation;</div><div class='add'>+    char vol_uuid[UUID_SIZE + 1];</div><div class='add'>+</div><div class='add'>+    gf_boolean_t choose_local;</div><div class='add'>+    gf_boolean_t did_discovery;</div><div class='add'>+    gf_boolean_t ensure_durability;</div><div class='add'>+    gf_boolean_t halo_enabled;</div><div class='add'>+    gf_boolean_t consistent_metadata;</div><div class='add'>+    gf_boolean_t need_heal;</div><div class='add'>+    gf_boolean_t granular_locks;</div><div class='add'>+    uint64_t sh_readdir_size;</div><div class='add'>+    char *sh_domain;</div><div class='add'>+    char *afr_dirty;</div><div class='add'>+</div><div class='add'>+    uint64_t spb_choice_timeout;</div><div class='add'>+</div><div class='add'>+    afr_self_heald_t shd;</div><div class='add'>+    struct afr_nfsd nfsd;</div><div class='add'>+</div><div class='add'>+    uint32_t halo_max_latency_msec;</div><div class='add'>+    uint32_t halo_max_replicas;</div><div class='add'>+    uint32_t halo_min_replicas;</div><div class='add'>+</div><div class='add'>+    gf_boolean_t full_lock;</div><div class='add'>+    gf_boolean_t esh_granular;</div><div class='add'>+    gf_boolean_t consistent_io;</div><div class='add'>+    gf_boolean_t data_self_heal; /* on/off */</div><div class='add'>+    gf_boolean_t use_anon_inode;</div><div class='add'>+</div><div class='add'>+    /*For lock healing.*/</div><div class='add'>+    struct list_head saved_locks;</div><div class='add'>+    struct list_head lk_healq;</div><div class='add'>+</div><div class='add'>+    /*For anon-inode handling */</div><div class='add'>+    char anon_inode_name[NAME_MAX + 1];</div><div class='add'>+    char anon_gfid_str[UUID_SIZE + 1];</div><div class='add'>+} afr_private_t;</div><div class='ctx'> </div><div class='del'>-	gf_boolean_t data_self_heal;              /* on/off */</div><div class='del'>-        char *       data_self_heal_algorithm;    /* name of algorithm */</div><div class='del'>-        unsigned int data_self_heal_window_size;  /* max number of pipelined</div><div class='del'>-                                                     read/writes */</div><div class='add'>+typedef enum {</div><div class='add'>+    AFR_DATA_TRANSACTION,         /* truncate, write, ... */</div><div class='add'>+    AFR_METADATA_TRANSACTION,     /* chmod, chown, ... */</div><div class='add'>+    AFR_ENTRY_TRANSACTION,        /* create, rmdir, ... */</div><div class='add'>+    AFR_ENTRY_RENAME_TRANSACTION, /* rename */</div><div class='add'>+} afr_transaction_type;</div><div class='ctx'> </div><div class='del'>-        unsigned int background_self_heal_count;</div><div class='del'>-        unsigned int background_self_heals_started;</div><div class='del'>-	gf_boolean_t metadata_self_heal;   /* on/off */</div><div class='del'>-	gf_boolean_t entry_self_heal;      /* on/off */</div><div class='add'>+/*</div><div class='add'>+  xattr format: trusted.afr.volume = [x y z]</div><div class='add'>+  x - data pending</div><div class='add'>+  y - metadata pending</div><div class='add'>+  z - entry pending</div><div class='add'>+*/</div><div class='ctx'> </div><div class='del'>-	gf_boolean_t data_change_log;       /* on/off */</div><div class='del'>-	gf_boolean_t metadata_change_log;   /* on/off */</div><div class='del'>-	gf_boolean_t entry_change_log;      /* on/off */</div><div class='add'>+static inline int</div><div class='add'>+afr_index_for_transaction_type(afr_transaction_type type)</div><div class='add'>+{</div><div class='add'>+    switch (type) {</div><div class='add'>+        case AFR_DATA_TRANSACTION:</div><div class='add'>+            return 0;</div><div class='ctx'> </div><div class='del'>-	int read_child;               /* read-subvolume */</div><div class='del'>-	unsigned int favorite_child;  /* subvolume to be preferred in resolving</div><div class='del'>-					 split-brain cases */</div><div class='add'>+        case AFR_METADATA_TRANSACTION:</div><div class='add'>+            return 1;</div><div class='ctx'> </div><div class='del'>-	unsigned int data_lock_server_count;</div><div class='del'>-	unsigned int metadata_lock_server_count;</div><div class='del'>-	unsigned int entry_lock_server_count;</div><div class='add'>+        case AFR_ENTRY_TRANSACTION:</div><div class='add'>+        case AFR_ENTRY_RENAME_TRANSACTION:</div><div class='add'>+            return 2;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	gf_boolean_t inodelk_trace;</div><div class='del'>-	gf_boolean_t entrylk_trace;</div><div class='add'>+    return -1; /* make gcc happy */</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	gf_boolean_t strict_readdir;</div><div class='add'>+static inline int</div><div class='add'>+afr_index_from_ia_type(ia_type_t type)</div><div class='add'>+{</div><div class='add'>+    switch (type) {</div><div class='add'>+        case IA_IFDIR:</div><div class='add'>+            return afr_index_for_transaction_type(AFR_ENTRY_TRANSACTION);</div><div class='add'>+        case IA_IFREG:</div><div class='add'>+            return afr_index_for_transaction_type(AFR_DATA_TRANSACTION);</div><div class='add'>+        default:</div><div class='add'>+            return -1;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	unsigned int wait_count;      /* # of servers to wait for success */</div><div class='add'>+typedef struct {</div><div class='add'>+    struct gf_flock flock;</div><div class='add'>+    loc_t loc;</div><div class='add'>+    fd_t *fd;</div><div class='add'>+    char *basename;</div><div class='add'>+    unsigned char *locked_nodes;</div><div class='add'>+    int locked_count;</div><div class='ctx'> </div><div class='del'>-        uint64_t up_count;      /* number of CHILD_UPs we have seen */</div><div class='del'>-        uint64_t down_count;    /* number of CHILD_DOWNs we have seen */</div><div class='add'>+} afr_lockee_t;</div><div class='ctx'> </div><div class='del'>-	struct _pump_private *pump_private; /* Set if we are loaded as pump */</div><div class='del'>-} afr_private_t;</div><div class='add'>+int</div><div class='add'>+afr_entry_lockee_cmp(const void *l1, const void *l2);</div><div class='ctx'> </div><div class='ctx'> typedef struct {</div><div class='del'>-        /* External interface: These are variables (some optional) that</div><div class='del'>-           are set by whoever has triggered self-heal */</div><div class='add'>+    loc_t *lk_loc;</div><div class='ctx'> </div><div class='del'>-        gf_boolean_t need_data_self_heal;</div><div class='del'>-        gf_boolean_t need_metadata_self_heal;</div><div class='del'>-        gf_boolean_t need_entry_self_heal;</div><div class='add'>+    afr_lockee_t lockee[AFR_LOCKEE_COUNT_MAX];</div><div class='ctx'> </div><div class='del'>-        gf_boolean_t forced_merge;        /* Is this a self-heal triggered to</div><div class='del'>-                                             forcibly merge the directories? */</div><div class='add'>+    const char *lk_basename;</div><div class='add'>+    const char *lower_basename;</div><div class='add'>+    const char *higher_basename;</div><div class='ctx'> </div><div class='del'>-        gf_boolean_t healing_fd_opened;   /* true if caller has already</div><div class='del'>-                                             opened fd */</div><div class='add'>+    unsigned char *lower_locked_nodes;</div><div class='ctx'> </div><div class='del'>-        gf_boolean_t data_lock_held;      /* true if caller has already</div><div class='del'>-                                             acquired 0-0 lock */</div><div class='add'>+    afr_lock_cbk_t lock_cbk;</div><div class='ctx'> </div><div class='del'>-	fd_t *healing_fd;                 /* set if callers has opened fd */</div><div class='add'>+    int lockee_count;</div><div class='ctx'> </div><div class='del'>-        gf_boolean_t background;          /* do self-heal in background</div><div class='del'>-                                             if possible */</div><div class='add'>+    int32_t lk_call_count;</div><div class='add'>+    int32_t lk_expected_count;</div><div class='add'>+    int32_t lk_attempted_count;</div><div class='ctx'> </div><div class='del'>-        ia_type_t type;                   /* st_mode of the entry we're doing</div><div class='del'>-                                             self-heal on */</div><div class='add'>+    int32_t lock_op_ret;</div><div class='add'>+    int32_t lock_op_errno;</div><div class='add'>+    char *domain; /* Domain on which inode/entry lock/unlock in progress.*/</div><div class='add'>+    int32_t lock_count;</div><div class='add'>+    char lower_locked;</div><div class='add'>+    char higher_locked;</div><div class='add'>+} afr_internal_lock_t;</div><div class='ctx'> </div><div class='del'>-        /* Function to call to unwind. If self-heal is being done in the</div><div class='del'>-           background, this function will be called as soon as possible. */</div><div class='add'>+struct afr_reply {</div><div class='add'>+    int valid;</div><div class='add'>+    int32_t op_ret;</div><div class='add'>+    dict_t *xattr; /*For xattrop*/</div><div class='add'>+    dict_t *xdata;</div><div class='add'>+    struct iatt poststat;</div><div class='add'>+    struct iatt postparent;</div><div class='add'>+    struct iatt prestat;</div><div class='add'>+    struct iatt preparent;</div><div class='add'>+    struct iatt preparent2;</div><div class='add'>+    struct iatt postparent2;</div><div class='add'>+    int32_t op_errno;</div><div class='add'>+    /* For rchecksum */</div><div class='add'>+    uint8_t checksum[SHA256_DIGEST_LENGTH];</div><div class='add'>+    gf_boolean_t buf_has_zeroes;</div><div class='add'>+    gf_boolean_t fips_mode_rchecksum;</div><div class='add'>+    /* For lookup */</div><div class='add'>+    int8_t need_heal;</div><div class='add'>+};</div><div class='ctx'> </div><div class='del'>-        int (*unwind) (call_frame_t *frame, xlator_t *this);</div><div class='add'>+typedef enum {</div><div class='add'>+    AFR_FD_NOT_OPENED,</div><div class='add'>+    AFR_FD_OPENED,</div><div class='add'>+    AFR_FD_OPENING</div><div class='add'>+} afr_fd_open_status_t;</div><div class='ctx'> </div><div class='del'>-        /* End of external interface members */</div><div class='add'>+typedef struct {</div><div class='add'>+    afr_fd_open_status_t *opened_on; /* which subvolumes the fd is open on */</div><div class='add'>+    int flags;</div><div class='add'>+</div><div class='add'>+    /* the subvolume on which the latest sequence of readdirs (starting</div><div class='add'>+       at offset 0) has begun. Till the next readdir request with 0 offset</div><div class='add'>+       arrives, we continue to read off this subvol.</div><div class='add'>+    */</div><div class='add'>+    int readdir_subvol;</div><div class='add'>+    /* lock-healing related members. */</div><div class='add'>+    gf_boolean_t is_fd_bad;</div><div class='add'>+    afr_lk_heal_info_t *lk_heal_info;</div><div class='ctx'> </div><div class='add'>+} afr_fd_ctx_t;</div><div class='ctx'> </div><div class='del'>-	/* array of stat's, one for each child */</div><div class='del'>-	struct iatt *buf;</div><div class='del'>-        struct iatt parentbuf;</div><div class='add'>+typedef enum {</div><div class='add'>+    AFR_FOP_LOCK_PARALLEL,</div><div class='add'>+    AFR_FOP_LOCK_SERIAL,</div><div class='add'>+    AFR_FOP_LOCK_QUORUM_FAILED,</div><div class='add'>+} afr_fop_lock_state_t;</div><div class='add'>+</div><div class='add'>+typedef struct _afr_inode_lock_t {</div><div class='add'>+    /* @num_inodelks:</div><div class='add'>+       Number of inodelks queried from the server, as queried through</div><div class='add'>+       xdata in FOPs. Currently, used to decide if eager-locking must be</div><div class='add'>+       temporarily disabled.</div><div class='add'>+    */</div><div class='add'>+    int32_t num_inodelks;</div><div class='add'>+    unsigned int event_generation;</div><div class='add'>+    gf_timer_t *delay_timer;</div><div class='add'>+    struct list_head owners;  /*Transactions that are performing fop*/</div><div class='add'>+    struct list_head post_op; /*Transactions that are done with the fop</div><div class='add'>+                               *So can not conflict with the fops*/</div><div class='add'>+    struct list_head waiting; /*Transaction that are waiting for</div><div class='add'>+                               *conflicting transactions to complete*/</div><div class='add'>+    struct list_head frozen;  /*Transactions that need to go as part of</div><div class='add'>+                               * next batch of eager-lock*/</div><div class='add'>+    gf_boolean_t release;</div><div class='add'>+    gf_boolean_t acquired;</div><div class='add'>+} afr_lock_t;</div><div class='add'>+</div><div class='add'>+typedef struct _afr_inode_ctx {</div><div class='add'>+    uint64_t read_subvol;</div><div class='add'>+    uint64_t write_subvol;</div><div class='add'>+    int lock_count;</div><div class='add'>+    int spb_choice;</div><div class='add'>+    gf_timer_t *timer;</div><div class='add'>+    unsigned int *pre_op_done[AFR_NUM_CHANGE_LOGS];</div><div class='add'>+    int inherited[AFR_NUM_CHANGE_LOGS];</div><div class='add'>+    int on_disk[AFR_NUM_CHANGE_LOGS];</div><div class='add'>+    /*Only 2 types of transactions support eager-locks now. DATA/METADATA*/</div><div class='add'>+    afr_lock_t lock[2];</div><div class='add'>+</div><div class='add'>+    /* @open_fd_count:</div><div class='add'>+       Number of open FDs queried from the server, as queried through</div><div class='add'>+       xdata in FOPs. Currently, used to decide if eager-locking must be</div><div class='add'>+       temporarily disabled.</div><div class='add'>+    */</div><div class='add'>+    uint32_t open_fd_count;</div><div class='add'>+    gf_boolean_t need_refresh;</div><div class='add'>+</div><div class='add'>+    /* set if any write on this fd was a non stable write</div><div class='add'>+       (i.e, without O_SYNC or O_DSYNC)</div><div class='add'>+    */</div><div class='add'>+    gf_boolean_t witnessed_unstable_write;</div><div class='add'>+} afr_inode_ctx_t;</div><div class='ctx'> </div><div class='del'>-	/* array of xattr's, one for each child */</div><div class='del'>-	dict_t **xattr;</div><div class='add'>+typedef struct _afr_local {</div><div class='add'>+    glusterfs_fop_t op;</div><div class='add'>+    unsigned int call_count;</div><div class='ctx'> </div><div class='del'>-	/* array of errno's, one for each child */</div><div class='del'>-	int *child_errno;</div><div class='add'>+    /* @event_generation: copy of priv-&gt;event_generation taken at the</div><div class='add'>+       time of starting the transaction. The copy is made so that we</div><div class='add'>+       have a stable value through the various phases of the transaction.</div><div class='add'>+    */</div><div class='add'>+    unsigned int event_generation;</div><div class='ctx'> </div><div class='del'>-	int32_t **pending_matrix;</div><div class='del'>-	int32_t **delta_matrix;</div><div class='add'>+    uint32_t open_fd_count;</div><div class='add'>+    int32_t num_inodelks;</div><div class='ctx'> </div><div class='del'>-	int *sources;</div><div class='del'>-	int source;</div><div class='del'>-	int active_source;</div><div class='del'>-	int active_sinks;</div><div class='del'>-	int *success;</div><div class='del'>-	unsigned char *locked_nodes;</div><div class='del'>-        int lock_count;</div><div class='add'>+    int32_t op_ret;</div><div class='add'>+    int32_t op_errno;</div><div class='ctx'> </div><div class='del'>-        mode_t impunging_entry_mode;</div><div class='del'>-        const char *linkname;</div><div class='add'>+    int dirty[AFR_NUM_CHANGE_LOGS];</div><div class='ctx'> </div><div class='del'>-	int   op_failed;</div><div class='add'>+    int32_t **pending;</div><div class='ctx'> </div><div class='del'>-	int   file_has_holes;</div><div class='del'>-	blksize_t block_size;</div><div class='del'>-	off_t file_size;</div><div class='del'>-	off_t offset;</div><div class='add'>+    loc_t loc;</div><div class='add'>+    loc_t newloc;</div><div class='ctx'> </div><div class='del'>-	loc_t parent_loc;</div><div class='add'>+    fd_t *fd;</div><div class='add'>+    afr_fd_ctx_t *fd_ctx;</div><div class='ctx'> </div><div class='del'>-        call_frame_t *orig_frame;</div><div class='del'>-        gf_boolean_t unwound;</div><div class='add'>+    /* @child_up: copy of priv-&gt;child_up taken at the time of transaction</div><div class='add'>+       start. The copy is taken so that we have a stable child_up array</div><div class='add'>+       through the phases of the transaction as priv-&gt;child_up[i] can keep</div><div class='add'>+       changing through time.</div><div class='add'>+    */</div><div class='add'>+    unsigned char *child_up;</div><div class='ctx'> </div><div class='del'>-        /* private data for the particular self-heal algorithm */</div><div class='del'>-        void *private;</div><div class='add'>+    /* @read_attempted:</div><div class='add'>+       array of flags representing subvolumes where read operations of</div><div class='add'>+       the read transaction have already been attempted. The array is</div><div class='add'>+       first pre-filled with down subvolumes, and as reads are performed</div><div class='add'>+       on other subvolumes, those are set as well. This way if the read</div><div class='add'>+       operation fails we do not retry on that subvolume again.</div><div class='add'>+    */</div><div class='add'>+    unsigned char *read_attempted;</div><div class='ctx'> </div><div class='del'>-        int (*flush_self_heal_cbk) (call_frame_t *frame, xlator_t *this);</div><div class='add'>+    /* @readfn:</div><div class='ctx'> </div><div class='del'>-	int (*completion_cbk) (call_frame_t *frame, xlator_t *this);</div><div class='del'>-        int (*algo_completion_cbk) (call_frame_t *frame, xlator_t *this);</div><div class='del'>-        int (*algo_abort_cbk) (call_frame_t *frame, xlator_t *this);</div><div class='add'>+       pointer to function which will perform the read operation on a given</div><div class='add'>+       subvolume. Used in read transactions.</div><div class='add'>+    */</div><div class='ctx'> </div><div class='del'>-	call_frame_t *sh_frame;</div><div class='del'>-} afr_self_heal_t;</div><div class='add'>+    afr_read_txn_wind_t readfn;</div><div class='ctx'> </div><div class='add'>+    /* @inode:</div><div class='ctx'> </div><div class='del'>-typedef enum {</div><div class='del'>-	AFR_DATA_TRANSACTION,          /* truncate, write, ... */</div><div class='del'>-	AFR_METADATA_TRANSACTION,      /* chmod, chown, ... */</div><div class='del'>-	AFR_ENTRY_TRANSACTION,         /* create, rmdir, ... */</div><div class='del'>-	AFR_ENTRY_RENAME_TRANSACTION,  /* rename */</div><div class='del'>-	AFR_FLUSH_TRANSACTION,         /* flush */</div><div class='del'>-} afr_transaction_type;</div><div class='add'>+       the inode on which the read txn is performed on. ref'ed and copied</div><div class='add'>+       from either fd-&gt;inode or loc.inode</div><div class='add'>+    */</div><div class='ctx'> </div><div class='del'>-typedef enum {</div><div class='del'>-        AFR_TRANSACTION_LK,</div><div class='del'>-        AFR_SELFHEAL_LK,</div><div class='del'>-} transaction_lk_type_t;</div><div class='add'>+    inode_t *inode;</div><div class='ctx'> </div><div class='del'>-typedef enum {</div><div class='del'>-        AFR_LOCK_OP,</div><div class='del'>-        AFR_UNLOCK_OP,</div><div class='del'>-} afr_lock_op_type_t;</div><div class='add'>+    /* @parent[2]:</div><div class='ctx'> </div><div class='del'>-typedef enum {</div><div class='del'>-        AFR_DATA_SELF_HEAL_LK,</div><div class='del'>-        AFR_METADATA_SELF_HEAL_LK,</div><div class='del'>-        AFR_ENTRY_SELF_HEAL_LK,</div><div class='del'>-}selfheal_lk_type_t;</div><div class='add'>+       parent inode[s] on which directory transactions are performed.</div><div class='add'>+    */</div><div class='ctx'> </div><div class='del'>-typedef enum {</div><div class='del'>-        AFR_INODELK_TRANSACTION,</div><div class='del'>-        AFR_INODELK_NB_TRANSACTION,</div><div class='del'>-        AFR_ENTRYLK_TRANSACTION,</div><div class='del'>-        AFR_ENTRYLK_NB_TRANSACTION,</div><div class='del'>-        AFR_INODELK_SELFHEAL,</div><div class='del'>-        AFR_INODELK_NB_SELFHEAL,</div><div class='del'>-        AFR_ENTRYLK_SELFHEAL,</div><div class='del'>-        AFR_ENTRYLK_NB_SELFHEAL,</div><div class='del'>-} afr_lock_call_type_t;</div><div class='add'>+    inode_t *parent;</div><div class='add'>+    inode_t *parent2;</div><div class='ctx'> </div><div class='del'>-/*</div><div class='del'>-  xattr format: trusted.afr.volume = [x y z]</div><div class='del'>-  x - data pending</div><div class='del'>-  y - metadata pending</div><div class='del'>-  z - entry pending</div><div class='del'>-*/</div><div class='add'>+    /* @readable:</div><div class='ctx'> </div><div class='del'>-static inline int</div><div class='del'>-afr_index_for_transaction_type (afr_transaction_type type)</div><div class='del'>-{</div><div class='del'>-        switch (type) {</div><div class='del'>-                </div><div class='del'>-        case AFR_DATA_TRANSACTION:</div><div class='del'>-        case AFR_FLUSH_TRANSACTION:</div><div class='del'>-                return 0;</div><div class='add'>+       array of flags representing servers from which a read can be</div><div class='add'>+       performed. This is the output of afr_inode_refresh()</div><div class='add'>+    */</div><div class='add'>+    unsigned char *readable;</div><div class='add'>+    unsigned char *readable2; /*For rename transaction*/</div><div class='ctx'> </div><div class='del'>-        case AFR_METADATA_TRANSACTION:</div><div class='del'>-                return 1;</div><div class='add'>+    afr_inode_refresh_cbk_t refreshfn;</div><div class='ctx'> </div><div class='del'>-        case AFR_ENTRY_TRANSACTION:</div><div class='del'>-        case AFR_ENTRY_RENAME_TRANSACTION:</div><div class='del'>-                return 2;</div><div class='del'>-        }</div><div class='add'>+    /* @refreshinode:</div><div class='ctx'> </div><div class='del'>-        return -1;  /* make gcc happy */</div><div class='del'>-}</div><div class='add'>+       Inode currently getting refreshed.</div><div class='add'>+    */</div><div class='add'>+    inode_t *refreshinode;</div><div class='ctx'> </div><div class='add'>+    dict_t *xattr_req;</div><div class='ctx'> </div><div class='del'>-typedef enum {</div><div class='del'>-        AFR_CHILD_UP_FLUSH,</div><div class='del'>-        AFR_CHILD_DOWN_FLUSH,</div><div class='del'>-} afr_flush_type;</div><div class='add'>+    dict_t *dict;</div><div class='ctx'> </div><div class='del'>-typedef struct {</div><div class='del'>-        loc_t *lk_loc;</div><div class='del'>-        struct flock lk_flock;</div><div class='add'>+    int read_subvol; /* Current read subvolume */</div><div class='ctx'> </div><div class='del'>-        const char *lk_basename;</div><div class='del'>-        const char *lower_basename;</div><div class='del'>-        const char *higher_basename;</div><div class='del'>-        char lower_locked;</div><div class='del'>-        char higher_locked;</div><div class='add'>+    int optimistic_change_log;</div><div class='ctx'> </div><div class='del'>-        unsigned char *locked_nodes;</div><div class='del'>-        unsigned char *lower_locked_nodes;</div><div class='del'>-        unsigned char *inode_locked_nodes;</div><div class='del'>-        unsigned char *entry_locked_nodes;</div><div class='add'>+    afr_internal_lock_t internal_lock;</div><div class='ctx'> </div><div class='del'>-        selfheal_lk_type_t selfheal_lk_type;</div><div class='del'>-        transaction_lk_type_t transaction_lk_type;</div><div class='add'>+    /*To handle setattr/setxattr on yet to be linked inode from dht*/</div><div class='add'>+    uuid_t refreshgfid;</div><div class='ctx'> </div><div class='del'>-        int32_t lock_count;</div><div class='del'>-        int32_t inodelk_lock_count;</div><div class='del'>-        int32_t entrylk_lock_count;</div><div class='add'>+    /* @refreshed:</div><div class='ctx'> </div><div class='del'>-        uint64_t lock_number;</div><div class='del'>-        int32_t lk_call_count;</div><div class='add'>+       the inode was "refreshed" (i.e, pending xattrs from all subvols</div><div class='add'>+       freshly inspected and inode ctx updated accordingly) as part of</div><div class='add'>+       this transaction already.</div><div class='add'>+    */</div><div class='add'>+    gf_boolean_t refreshed;</div><div class='ctx'> </div><div class='del'>-        int32_t lock_op_ret;</div><div class='del'>-        int32_t lock_op_errno;</div><div class='add'>+    gf_boolean_t update_num_inodelks;</div><div class='add'>+    gf_boolean_t update_open_fd_count;</div><div class='ctx'> </div><div class='del'>-        int (*lock_cbk) (call_frame_t *, xlator_t *);</div><div class='add'>+    /*</div><div class='add'>+      @pre_op_compat:</div><div class='ctx'> </div><div class='del'>-} afr_internal_lock_t;</div><div class='add'>+      compatibility mode of pre-op. send a separate pre-op and</div><div class='add'>+      op operations as part of transaction, rather than combining</div><div class='add'>+    */</div><div class='ctx'> </div><div class='del'>-typedef struct _afr_local {</div><div class='del'>-	unsigned int call_count;</div><div class='del'>-	unsigned int success_count;</div><div class='del'>-	unsigned int enoent_count;</div><div class='add'>+    gf_boolean_t pre_op_compat;</div><div class='ctx'> </div><div class='add'>+    /* Is the current writev() going to perform a stable write?</div><div class='add'>+       i.e, is fd-&gt;flags or @flags writev param have O_SYNC or</div><div class='add'>+       O_DSYNC?</div><div class='add'>+    */</div><div class='add'>+    gf_boolean_t stable_write;</div><div class='add'>+</div><div class='add'>+    /* This write appended to the file. Nnot necessarily O_APPEND,</div><div class='add'>+       just means the offset of write was at the end of file.</div><div class='add'>+    */</div><div class='add'>+    gf_boolean_t append_write;</div><div class='add'>+</div><div class='add'>+    /*</div><div class='add'>+      This struct contains the arguments for the "continuation"</div><div class='add'>+      (scheme-like) of fops</div><div class='add'>+    */</div><div class='add'>+</div><div class='add'>+    struct {</div><div class='add'>+        struct {</div><div class='add'>+            struct statvfs buf;</div><div class='add'>+            unsigned char buf_set;</div><div class='add'>+        } statfs;</div><div class='add'>+</div><div class='add'>+        struct {</div><div class='add'>+            fd_t *fd;</div><div class='add'>+            int32_t flags;</div><div class='add'>+        } open;</div><div class='add'>+</div><div class='add'>+        struct {</div><div class='add'>+            struct gf_flock user_flock;</div><div class='add'>+            struct gf_flock ret_flock;</div><div class='add'>+            unsigned char *locked_nodes;</div><div class='add'>+            int32_t cmd;</div><div class='add'>+            /*For lock healing only.*/</div><div class='add'>+            unsigned char *dom_locked_nodes;</div><div class='add'>+            int32_t *dom_lock_op_ret;</div><div class='add'>+            int32_t *dom_lock_op_errno;</div><div class='add'>+            struct gf_flock *getlk_rsp;</div><div class='add'>+        } lk;</div><div class='add'>+</div><div class='add'>+        /* inode read */</div><div class='add'>+</div><div class='add'>+        struct {</div><div class='add'>+            int32_t mask;</div><div class='add'>+            int last_index; /* index of the child we tried previously */</div><div class='add'>+        } access;</div><div class='add'>+</div><div class='add'>+        struct {</div><div class='add'>+            int last_index;</div><div class='add'>+        } stat;</div><div class='add'>+</div><div class='add'>+        struct {</div><div class='add'>+            int last_index;</div><div class='add'>+        } fstat;</div><div class='add'>+</div><div class='add'>+        struct {</div><div class='add'>+            size_t size;</div><div class='add'>+            int last_index;</div><div class='add'>+        } readlink;</div><div class='add'>+</div><div class='add'>+        struct {</div><div class='add'>+            char *name;</div><div class='add'>+            long xattr_len;</div><div class='add'>+            int last_index;</div><div class='add'>+        } getxattr;</div><div class='add'>+</div><div class='add'>+        struct {</div><div class='add'>+            size_t size;</div><div class='add'>+            off_t offset;</div><div class='add'>+            int last_index;</div><div class='add'>+            uint32_t flags;</div><div class='add'>+        } readv;</div><div class='add'>+</div><div class='add'>+        /* dir read */</div><div class='add'>+</div><div class='add'>+        struct {</div><div class='add'>+            uint32_t *checksum;</div><div class='add'>+            int success_count;</div><div class='add'>+            int32_t op_ret;</div><div class='add'>+            int32_t op_errno;</div><div class='add'>+        } opendir;</div><div class='add'>+</div><div class='add'>+        struct {</div><div class='add'>+            int32_t op_ret;</div><div class='add'>+            int32_t op_errno;</div><div class='add'>+            size_t size;</div><div class='add'>+            off_t offset;</div><div class='add'>+            dict_t *dict;</div><div class='add'>+            int last_index;</div><div class='add'>+            gf_boolean_t failed;</div><div class='add'>+        } readdir;</div><div class='add'>+        /* inode write */</div><div class='add'>+</div><div class='add'>+        struct {</div><div class='add'>+            struct iatt prebuf;</div><div class='add'>+            struct iatt postbuf;</div><div class='add'>+        } inode_wfop;  // common structure for all inode-write-fops</div><div class='add'>+</div><div class='add'>+        struct {</div><div class='add'>+            struct iovec *vector;</div><div class='add'>+            struct iobref *iobref;</div><div class='add'>+            off_t offset;</div><div class='add'>+            int32_t op_ret;</div><div class='add'>+            int32_t count;</div><div class='add'>+            uint32_t flags;</div><div class='add'>+        } writev;</div><div class='add'>+</div><div class='add'>+        struct {</div><div class='add'>+            off_t offset;</div><div class='add'>+        } truncate;</div><div class='add'>+</div><div class='add'>+        struct {</div><div class='add'>+            off_t offset;</div><div class='add'>+        } ftruncate;</div><div class='add'>+</div><div class='add'>+        struct {</div><div class='add'>+            struct iatt in_buf;</div><div class='add'>+            int32_t valid;</div><div class='add'>+        } setattr;</div><div class='add'>+</div><div class='add'>+        struct {</div><div class='add'>+            struct iatt in_buf;</div><div class='add'>+            int32_t valid;</div><div class='add'>+        } fsetattr;</div><div class='add'>+</div><div class='add'>+        struct {</div><div class='add'>+            dict_t *dict;</div><div class='add'>+            int32_t flags;</div><div class='add'>+        } setxattr;</div><div class='add'>+</div><div class='add'>+        struct {</div><div class='add'>+            dict_t *dict;</div><div class='add'>+            int32_t flags;</div><div class='add'>+        } fsetxattr;</div><div class='add'>+</div><div class='add'>+        struct {</div><div class='add'>+            char *name;</div><div class='add'>+        } removexattr;</div><div class='add'>+</div><div class='add'>+        struct {</div><div class='add'>+            dict_t *xattr;</div><div class='add'>+            gf_xattrop_flags_t optype;</div><div class='add'>+        } xattrop;</div><div class='add'>+</div><div class='add'>+        /* dir write */</div><div class='add'>+</div><div class='add'>+        struct {</div><div class='add'>+            inode_t *inode;</div><div class='add'>+            struct iatt buf;</div><div class='add'>+            struct iatt preparent;</div><div class='add'>+            struct iatt postparent;</div><div class='add'>+            struct iatt prenewparent;</div><div class='add'>+            struct iatt postnewparent;</div><div class='add'>+        } dir_fop;  // common structure for all dir fops</div><div class='add'>+</div><div class='add'>+        struct {</div><div class='add'>+            fd_t *fd;</div><div class='add'>+            dict_t *params;</div><div class='add'>+            int32_t flags;</div><div class='add'>+            mode_t mode;</div><div class='add'>+        } create;</div><div class='add'>+</div><div class='add'>+        struct {</div><div class='add'>+            dict_t *params;</div><div class='add'>+            dev_t dev;</div><div class='add'>+            mode_t mode;</div><div class='add'>+        } mknod;</div><div class='add'>+</div><div class='add'>+        struct {</div><div class='add'>+            dict_t *params;</div><div class='add'>+            int32_t mode;</div><div class='add'>+        } mkdir;</div><div class='add'>+</div><div class='add'>+        struct {</div><div class='add'>+            dict_t *params;</div><div class='add'>+            char *linkpath;</div><div class='add'>+        } symlink;</div><div class='add'>+</div><div class='add'>+        struct {</div><div class='add'>+            off_t offset;</div><div class='add'>+            size_t len;</div><div class='add'>+            int32_t mode;</div><div class='add'>+        } fallocate;</div><div class='add'>+</div><div class='add'>+        struct {</div><div class='add'>+            off_t offset;</div><div class='add'>+            size_t len;</div><div class='add'>+        } discard;</div><div class='add'>+</div><div class='add'>+        struct {</div><div class='add'>+            off_t offset;</div><div class='add'>+            off_t len;</div><div class='add'>+            struct iatt prebuf;</div><div class='add'>+            struct iatt postbuf;</div><div class='add'>+        } zerofill;</div><div class='add'>+</div><div class='add'>+        struct {</div><div class='add'>+            char *volume;</div><div class='add'>+            int32_t cmd;</div><div class='add'>+            int32_t in_cmd;</div><div class='add'>+            struct gf_flock in_flock;</div><div class='add'>+            struct gf_flock flock;</div><div class='add'>+            void *xdata;</div><div class='add'>+        } inodelk;</div><div class='add'>+</div><div class='add'>+        struct {</div><div class='add'>+            char *volume;</div><div class='add'>+            char *basename;</div><div class='add'>+            void *xdata;</div><div class='add'>+            entrylk_cmd in_cmd;</div><div class='add'>+            entrylk_cmd cmd;</div><div class='add'>+            entrylk_type type;</div><div class='add'>+        } entrylk;</div><div class='add'>+</div><div class='add'>+        struct {</div><div class='add'>+            off_t offset;</div><div class='add'>+            gf_seek_what_t what;</div><div class='add'>+        } seek;</div><div class='add'>+</div><div class='add'>+        struct {</div><div class='add'>+            struct gf_lease user_lease;</div><div class='add'>+            struct gf_lease ret_lease;</div><div class='add'>+            unsigned char *locked_nodes;</div><div class='add'>+        } lease;</div><div class='add'>+</div><div class='add'>+        struct {</div><div class='add'>+            int flags;</div><div class='add'>+        } rmdir;</div><div class='add'>+</div><div class='add'>+        struct {</div><div class='add'>+            int32_t datasync;</div><div class='add'>+        } fsync;</div><div class='add'>+</div><div class='add'>+        struct {</div><div class='add'>+            uuid_t gfid_req;</div><div class='add'>+            gf_boolean_t needs_fresh_lookup;</div><div class='add'>+        } lookup;</div><div class='add'>+</div><div class='add'>+    } cont;</div><div class='add'>+</div><div class='add'>+    struct {</div><div class='add'>+        char *basename;</div><div class='add'>+        char *new_basename;</div><div class='add'>+</div><div class='add'>+        loc_t parent_loc;</div><div class='add'>+        loc_t new_parent_loc;</div><div class='add'>+</div><div class='add'>+        /* stub to resume on destruction</div><div class='add'>+           of the transaction frame */</div><div class='add'>+        call_stub_t *resume_stub;</div><div class='add'>+</div><div class='add'>+        struct list_head owner_list;</div><div class='add'>+        struct list_head wait_list;</div><div class='add'>+</div><div class='add'>+        unsigned char *pre_op;</div><div class='add'>+</div><div class='add'>+        /* Changelog xattr dict for [f]xattrop*/</div><div class='add'>+        dict_t **changelog_xdata;</div><div class='add'>+        unsigned char *pre_op_sources;</div><div class='add'>+</div><div class='add'>+        /* @failed_subvols: subvolumes on which a pre-op or a</div><div class='add'>+            FOP failed. */</div><div class='add'>+        unsigned char *failed_subvols;</div><div class='add'>+</div><div class='add'>+        call_frame_t *main_frame; /*Fop frame*/</div><div class='add'>+        call_frame_t *frame;      /*Transaction frame*/</div><div class='add'>+</div><div class='add'>+        int (*wind)(call_frame_t *frame, xlator_t *this, int subvol);</div><div class='add'>+</div><div class='add'>+        int (*unwind)(call_frame_t *frame, xlator_t *this);</div><div class='add'>+</div><div class='add'>+        off_t start, len;</div><div class='add'>+</div><div class='add'>+        afr_transaction_type type;</div><div class='add'>+</div><div class='add'>+        int32_t in_flight_sb_errno; /* This is where the cause of the</div><div class='add'>+                                       failure on the last good copy of</div><div class='add'>+                                       the file is stored.</div><div class='add'>+                                       */</div><div class='add'>+</div><div class='add'>+        /* @changelog_resume: function to be called after changlogging</div><div class='add'>+           (either pre-op or post-op) is done</div><div class='add'>+        */</div><div class='add'>+        afr_changelog_resume_t changelog_resume;</div><div class='add'>+</div><div class='add'>+        gf_boolean_t eager_lock_on;</div><div class='add'>+        gf_boolean_t do_eager_unlock;</div><div class='add'>+</div><div class='add'>+        /* @dirtied: flag which indicates whether we set dirty flag</div><div class='add'>+           in the OP. Typically true when we are performing operation</div><div class='add'>+           on more than one subvol and optimistic changelog is disabled</div><div class='add'>+</div><div class='add'>+           A 'true' value set in @dirtied flag means an 'undirtying'</div><div class='add'>+           has to be done in POST-OP phase.</div><div class='add'>+        */</div><div class='add'>+        gf_boolean_t dirtied;</div><div class='add'>+</div><div class='add'>+        /* @inherited: flag which indicates that the dirty flags</div><div class='add'>+           of the previous transaction were inherited</div><div class='add'>+        */</div><div class='add'>+        gf_boolean_t inherited;</div><div class='add'>+</div><div class='add'>+        /*</div><div class='add'>+          @no_uninherit: flag which indicates that a pre_op_uninherit()</div><div class='add'>+          must _not_ be attempted (and returned as failure) always. This</div><div class='add'>+          flag is set when a hard pre-op is performed, but not accounted</div><div class='add'>+          for it in fd_ctx-&gt;on_disk[]. Such transactions are "isolated"</div><div class='add'>+          from the pre-op piggybacking entirely and therefore uninherit</div><div class='add'>+          must not be attempted.</div><div class='add'>+        */</div><div class='add'>+        gf_boolean_t no_uninherit;</div><div class='add'>+</div><div class='add'>+        gf_boolean_t in_flight_sb; /* Indicator for occurrence of</div><div class='add'>+                                      split-brain while in the middle of</div><div class='add'>+                                      a txn. */</div><div class='add'>+</div><div class='add'>+        /* @uninherit_done:</div><div class='add'>+           @uninherit_value:</div><div class='add'>+</div><div class='add'>+           The above pair variables make pre_op_uninherit() idempotent.</div><div class='add'>+           Both are FALSE initially. The first call to pre_op_uninherit</div><div class='add'>+           sets @uninherit_done to TRUE and the return value to</div><div class='add'>+           @uninherit_value. Further calls will check for @uninherit_done</div><div class='add'>+           to be TRUE and if so will simply return @uninherit_value.</div><div class='add'>+        */</div><div class='add'>+        gf_boolean_t uninherit_done;</div><div class='add'>+        gf_boolean_t uninherit_value;</div><div class='add'>+</div><div class='add'>+        gf_boolean_t disable_delayed_post_op;</div><div class='add'>+    } transaction;</div><div class='add'>+</div><div class='add'>+    syncbarrier_t barrier;</div><div class='ctx'> </div><div class='del'>-	unsigned int govinda_gOvinda;</div><div class='add'>+    /* extra data for fops */</div><div class='add'>+    dict_t *xdata_req;</div><div class='add'>+    dict_t *xdata_rsp;</div><div class='ctx'> </div><div class='del'>-	unsigned int read_child_index;</div><div class='del'>-        unsigned char read_child_returned;</div><div class='del'>-        unsigned int first_up_child;</div><div class='add'>+    dict_t *xattr_rsp; /*for [f]xattrop*/</div><div class='add'>+</div><div class='add'>+    mode_t umask;</div><div class='add'>+    int xflag;</div><div class='add'>+    struct afr_reply *replies;</div><div class='add'>+</div><div class='add'>+    /* For  client side background heals. */</div><div class='add'>+    struct list_head healer;</div><div class='add'>+    call_frame_t *heal_frame;</div><div class='add'>+</div><div class='add'>+    afr_inode_ctx_t *inode_ctx;</div><div class='add'>+</div><div class='add'>+    /*For thin-arbiter transactions.*/</div><div class='add'>+    int ta_failed_subvol;</div><div class='add'>+    int ta_event_gen;</div><div class='add'>+    struct list_head ta_waitq;</div><div class='add'>+    struct list_head ta_onwireq;</div><div class='add'>+    afr_ta_fop_state_t fop_state;</div><div class='add'>+    afr_fop_lock_state_t fop_lock_state;</div><div class='add'>+    gf_lkowner_t saved_lk_owner;</div><div class='add'>+    unsigned char read_txn_query_child;</div><div class='add'>+    unsigned char ta_child_up;</div><div class='add'>+    gf_boolean_t do_discovery;</div><div class='add'>+    gf_boolean_t need_full_crawl;</div><div class='add'>+    gf_boolean_t is_read_txn;</div><div class='add'>+    gf_boolean_t is_new_entry;</div><div class='add'>+} afr_local_t;</div><div class='ctx'> </div><div class='del'>-        pid_t saved_pid;</div><div class='add'>+typedef struct afr_spbc_timeout {</div><div class='add'>+    call_frame_t *frame;</div><div class='add'>+    loc_t *loc;</div><div class='add'>+    int spb_child_index;</div><div class='add'>+    gf_boolean_t d_spb;</div><div class='add'>+    gf_boolean_t m_spb;</div><div class='add'>+} afr_spbc_timeout_t;</div><div class='add'>+</div><div class='add'>+typedef struct afr_spb_status {</div><div class='add'>+    call_frame_t *frame;</div><div class='add'>+    loc_t *loc;</div><div class='add'>+} afr_spb_status_t;</div><div class='add'>+</div><div class='add'>+typedef struct afr_empty_brick_args {</div><div class='add'>+    call_frame_t *frame;</div><div class='add'>+    char *op_type;</div><div class='add'>+    loc_t loc;</div><div class='add'>+    int empty_index;</div><div class='add'>+} afr_empty_brick_args_t;</div><div class='add'>+</div><div class='add'>+typedef struct afr_read_subvol_args {</div><div class='add'>+    ia_type_t ia_type;</div><div class='add'>+    uuid_t gfid;</div><div class='add'>+} afr_read_subvol_args_t;</div><div class='add'>+</div><div class='add'>+typedef struct afr_granular_esh_args {</div><div class='add'>+    fd_t *heal_fd;</div><div class='add'>+    xlator_t *xl;</div><div class='add'>+    call_frame_t *frame;</div><div class='add'>+    gf_boolean_t mismatch; /* flag to represent occurrence of type/gfid</div><div class='add'>+                              mismatch */</div><div class='add'>+} afr_granular_esh_args_t;</div><div class='ctx'> </div><div class='del'>-	int32_t op_ret;</div><div class='del'>-	int32_t op_errno;</div><div class='add'>+int</div><div class='add'>+afr_inode_get_readable(call_frame_t *frame, inode_t *inode, xlator_t *this,</div><div class='add'>+                       unsigned char *readable, int *event_p, int type);</div><div class='add'>+int</div><div class='add'>+afr_inode_read_subvol_get(inode_t *inode, xlator_t *this,</div><div class='add'>+                          unsigned char *data_subvols,</div><div class='add'>+                          unsigned char *metadata_subvols,</div><div class='add'>+                          int *event_generation);</div><div class='add'>+int</div><div class='add'>+__afr_inode_read_subvol_get(inode_t *inode, xlator_t *this,</div><div class='add'>+                            unsigned char *data_subvols,</div><div class='add'>+                            unsigned char *metadata_subvols,</div><div class='add'>+                            int *event_generation);</div><div class='ctx'> </div><div class='del'>-	int32_t **pending;</div><div class='add'>+int</div><div class='add'>+__afr_inode_read_subvol_set(inode_t *inode, xlator_t *this,</div><div class='add'>+                            unsigned char *data_subvols,</div><div class='add'>+                            unsigned char *metadata_subvol,</div><div class='add'>+                            int event_generation);</div><div class='add'>+int</div><div class='add'>+afr_inode_read_subvol_set(inode_t *inode, xlator_t *this,</div><div class='add'>+                          unsigned char *data_subvols,</div><div class='add'>+                          unsigned char *metadata_subvols,</div><div class='add'>+                          int event_generation);</div><div class='ctx'> </div><div class='del'>-	loc_t loc;</div><div class='del'>-	loc_t newloc;</div><div class='add'>+int</div><div class='add'>+__afr_inode_need_refresh_set(inode_t *inode, xlator_t *this);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+afr_inode_need_refresh_set(inode_t *inode, xlator_t *this);</div><div class='ctx'> </div><div class='del'>-	fd_t *fd;</div><div class='add'>+int</div><div class='add'>+afr_read_subvol_select_by_policy(inode_t *inode, xlator_t *this,</div><div class='add'>+                                 unsigned char *readable,</div><div class='add'>+                                 afr_read_subvol_args_t *args);</div><div class='ctx'> </div><div class='del'>-	glusterfs_fop_t fop;</div><div class='add'>+int</div><div class='add'>+afr_inode_read_subvol_type_get(inode_t *inode, xlator_t *this,</div><div class='add'>+                               unsigned char *readable, int *event_p, int type);</div><div class='add'>+int</div><div class='add'>+afr_read_subvol_get(inode_t *inode, xlator_t *this, int *subvol_p,</div><div class='add'>+                    unsigned char *readables, int *event_p,</div><div class='add'>+                    afr_transaction_type type, afr_read_subvol_args_t *args);</div><div class='ctx'> </div><div class='del'>-	unsigned char *child_up; </div><div class='add'>+#define afr_data_subvol_get(i, t, s, r, e, a)                                  \</div><div class='add'>+    afr_read_subvol_get(i, t, s, r, e, AFR_DATA_TRANSACTION, a)</div><div class='ctx'> </div><div class='del'>-	int32_t *child_errno;</div><div class='del'>-	</div><div class='del'>-	dict_t  *xattr_req;</div><div class='del'>-	int      open_fd_count;</div><div class='del'>-</div><div class='del'>-	int32_t  inodelk_count;</div><div class='del'>-	int32_t  entrylk_count;</div><div class='add'>+#define afr_metadata_subvol_get(i, t, s, r, e, a)                              \</div><div class='add'>+    afr_read_subvol_get(i, t, s, r, e, AFR_METADATA_TRANSACTION, a)</div><div class='ctx'> </div><div class='del'>-        afr_internal_lock_t internal_lock;</div><div class='add'>+int</div><div class='add'>+afr_inode_refresh(call_frame_t *frame, xlator_t *this, inode_t *inode,</div><div class='add'>+                  uuid_t gfid, afr_inode_refresh_cbk_t cbk);</div><div class='ctx'> </div><div class='del'>-        dict_t  *dict;</div><div class='add'>+int32_t</div><div class='add'>+afr_notify(xlator_t *this, int32_t event, void *data, void *data2);</div><div class='ctx'> </div><div class='del'>-        int (*up_down_flush_cbk) (call_frame_t *, xlator_t *);</div><div class='add'>+int</div><div class='add'>+xattr_is_equal(dict_t *this, char *key1, data_t *value1, void *data);</div><div class='ctx'> </div><div class='del'>-	/* </div><div class='del'>-	   This struct contains the arguments for the "continuation"</div><div class='del'>-	   (scheme-like) of fops</div><div class='del'>-	*/</div><div class='add'>+int</div><div class='add'>+afr_add_entry_lockee(afr_local_t *local, loc_t *loc, char *basename,</div><div class='add'>+                     int child_count);</div><div class='ctx'> </div><div class='del'>-	int   op;</div><div class='del'>-	struct {</div><div class='del'>-		struct {</div><div class='del'>-			unsigned char buf_set;</div><div class='del'>-			struct statvfs buf;</div><div class='del'>-		} statfs;</div><div class='add'>+int</div><div class='add'>+afr_add_inode_lockee(afr_local_t *local, int child_count);</div><div class='ctx'> </div><div class='del'>-		struct {</div><div class='del'>-			inode_t *inode;</div><div class='del'>-			struct iatt buf;</div><div class='del'>-                        struct iatt read_child_buf;</div><div class='del'>-                        struct iatt postparent;</div><div class='del'>-                        ino_t ino;</div><div class='del'>-                        uint64_t gen;</div><div class='del'>-                        ino_t parent_ino;</div><div class='del'>-			dict_t *xattr;</div><div class='del'>-			dict_t **xattrs;</div><div class='del'>-                        gf_boolean_t is_revalidate;</div><div class='del'>-		} lookup;</div><div class='add'>+void</div><div class='add'>+afr_lockees_cleanup(afr_internal_lock_t *int_lock);</div><div class='ctx'> </div><div class='del'>-		struct {</div><div class='del'>-			int32_t flags;</div><div class='del'>-                        int32_t wbflags;</div><div class='del'>-		} open;</div><div class='del'>-</div><div class='del'>-		struct {</div><div class='del'>-			int32_t cmd;</div><div class='del'>-                        struct flock user_flock;</div><div class='del'>-                        struct flock ret_flock;</div><div class='del'>-			unsigned char *locked_nodes;</div><div class='del'>-		} lk;</div><div class='del'>-</div><div class='del'>-		/* inode read */</div><div class='del'>-</div><div class='del'>-		struct {</div><div class='del'>-			int32_t mask;</div><div class='del'>-			int last_tried;  /* index of the child we tried previously */</div><div class='del'>-		} access;</div><div class='del'>-</div><div class='del'>-		struct {</div><div class='del'>-			int last_tried;</div><div class='del'>-			ino_t ino;</div><div class='del'>-		} stat;</div><div class='del'>-</div><div class='del'>-		struct {</div><div class='del'>-			int last_tried;</div><div class='del'>-			ino_t ino;</div><div class='del'>-		} fstat;</div><div class='del'>-</div><div class='del'>-		struct {</div><div class='del'>-			size_t size;</div><div class='del'>-			int last_tried;</div><div class='del'>-                        ino_t ino;</div><div class='del'>-		} readlink;</div><div class='del'>-</div><div class='del'>-		struct {</div><div class='del'>-			char *name;</div><div class='del'>-			int last_tried;</div><div class='del'>-		} getxattr;</div><div class='del'>-</div><div class='del'>-		struct {</div><div class='del'>-                        ino_t ino;</div><div class='del'>-			size_t size;</div><div class='del'>-			off_t offset;</div><div class='del'>-			int last_tried;</div><div class='del'>-		} readv;</div><div class='del'>-</div><div class='del'>-		/* dir read */</div><div class='del'>-</div><div class='del'>-		struct {</div><div class='del'>-			int success_count;</div><div class='del'>-			int32_t op_ret;</div><div class='del'>-			int32_t op_errno;</div><div class='del'>-</div><div class='del'>-                        uint32_t *checksum;</div><div class='del'>-		} opendir;</div><div class='del'>-</div><div class='del'>-		struct {</div><div class='del'>-			int32_t op_ret;</div><div class='del'>-			int32_t op_errno;</div><div class='del'>-			size_t size;</div><div class='del'>-			off_t offset;</div><div class='del'>-</div><div class='del'>-                        gf_boolean_t failed;</div><div class='del'>-			int last_tried;</div><div class='del'>-		} readdir;</div><div class='del'>-</div><div class='del'>-		struct {</div><div class='del'>-			int32_t op_ret;</div><div class='del'>-			int32_t op_errno;</div><div class='del'>-</div><div class='del'>-			size_t size;</div><div class='del'>-			off_t offset;</div><div class='del'>-			int32_t flag;</div><div class='del'>-</div><div class='del'>-			int last_tried;</div><div class='del'>-		} getdents;</div><div class='del'>-</div><div class='del'>-		/* inode write */</div><div class='del'>-</div><div class='del'>-		struct {</div><div class='del'>-			ino_t ino;</div><div class='del'>-			struct iatt prebuf;</div><div class='del'>-			struct iatt postbuf;</div><div class='del'>-</div><div class='del'>-			int32_t op_ret;</div><div class='del'>-</div><div class='del'>-			struct iovec *vector;</div><div class='del'>-			struct iobref *iobref;</div><div class='del'>-			int32_t count;</div><div class='del'>-			off_t offset;</div><div class='del'>-		} writev;</div><div class='del'>-</div><div class='del'>-                struct {</div><div class='del'>-                        ino_t ino;</div><div class='del'>-                        struct iatt prebuf;</div><div class='del'>-                        struct iatt postbuf;</div><div class='del'>-                } fsync;</div><div class='del'>-</div><div class='del'>-		struct {</div><div class='del'>-			ino_t ino;</div><div class='del'>-			off_t offset;</div><div class='del'>-			struct iatt prebuf;</div><div class='del'>-                        struct iatt postbuf;</div><div class='del'>-		} truncate;</div><div class='del'>-</div><div class='del'>-		struct {</div><div class='del'>-			ino_t ino;</div><div class='del'>-			off_t offset;</div><div class='del'>-			struct iatt prebuf;</div><div class='del'>-                        struct iatt postbuf;</div><div class='del'>-		} ftruncate;</div><div class='del'>-</div><div class='del'>-		struct {</div><div class='del'>-			ino_t ino;</div><div class='del'>-			struct iatt in_buf;</div><div class='del'>-                        int32_t valid;</div><div class='del'>-                        struct iatt preop_buf;</div><div class='del'>-                        struct iatt postop_buf;</div><div class='del'>-		} setattr;</div><div class='del'>-</div><div class='del'>-		struct {</div><div class='del'>-			ino_t ino;</div><div class='del'>-			struct iatt in_buf;</div><div class='del'>-                        int32_t valid;</div><div class='del'>-                        struct iatt preop_buf;</div><div class='del'>-                        struct iatt postop_buf;</div><div class='del'>-		} fsetattr;</div><div class='del'>-</div><div class='del'>-		struct {</div><div class='del'>-			dict_t *dict;</div><div class='del'>-			int32_t flags;</div><div class='del'>-		} setxattr;</div><div class='del'>-</div><div class='del'>-		struct {</div><div class='del'>-			char *name;</div><div class='del'>-		} removexattr;</div><div class='del'>-</div><div class='del'>-		/* dir write */</div><div class='del'>-		</div><div class='del'>-		struct {</div><div class='del'>-			ino_t ino;</div><div class='del'>-                        uint64_t gen;</div><div class='del'>-                        ino_t parent_ino;</div><div class='del'>-			fd_t *fd;</div><div class='del'>-                        dict_t *params;</div><div class='del'>-			int32_t flags;</div><div class='del'>-			mode_t mode;</div><div class='del'>-			inode_t *inode;</div><div class='del'>-			struct iatt buf;</div><div class='del'>-                        struct iatt preparent;</div><div class='del'>-                        struct iatt postparent;</div><div class='del'>-                        struct iatt read_child_buf;</div><div class='del'>-		} create;</div><div class='del'>-</div><div class='del'>-		struct {</div><div class='del'>-			ino_t ino;</div><div class='del'>-                        uint64_t gen;</div><div class='del'>-                        ino_t parent_ino;</div><div class='del'>-			dev_t dev;</div><div class='del'>-			mode_t mode;</div><div class='del'>-                        dict_t *params;</div><div class='del'>-			inode_t *inode;</div><div class='del'>-			struct iatt buf;</div><div class='del'>-                        struct iatt preparent;</div><div class='del'>-                        struct iatt postparent;</div><div class='del'>-                        struct iatt read_child_buf;</div><div class='del'>-		} mknod;</div><div class='del'>-</div><div class='del'>-		struct {</div><div class='del'>-			ino_t ino;</div><div class='del'>-                        uint64_t gen;</div><div class='del'>-                        ino_t parent_ino;</div><div class='del'>-			int32_t mode;</div><div class='del'>-                        dict_t *params;</div><div class='del'>-			inode_t *inode;</div><div class='del'>-			struct iatt buf;</div><div class='del'>-                        struct iatt read_child_buf;</div><div class='del'>-                        struct iatt preparent;</div><div class='del'>-                        struct iatt postparent;</div><div class='del'>-		} mkdir;</div><div class='del'>-</div><div class='del'>-		struct {</div><div class='del'>-                        ino_t parent_ino;</div><div class='del'>-			int32_t op_ret;</div><div class='del'>-			int32_t op_errno;</div><div class='del'>-                        struct iatt preparent;</div><div class='del'>-                        struct iatt postparent;</div><div class='del'>-		} unlink;</div><div class='del'>-</div><div class='del'>-		struct {</div><div class='del'>-                        ino_t parent_ino;</div><div class='del'>-			int32_t op_ret;</div><div class='del'>-			int32_t op_errno;</div><div class='del'>-                        struct iatt preparent;</div><div class='del'>-                        struct iatt postparent;</div><div class='del'>-		} rmdir;</div><div class='del'>-</div><div class='del'>-		struct {</div><div class='del'>-                        ino_t oldparent_ino;</div><div class='del'>-                        ino_t newparent_ino;</div><div class='del'>-			ino_t ino;</div><div class='del'>-			struct iatt buf;</div><div class='del'>-                        struct iatt read_child_buf;</div><div class='del'>-                        struct iatt preoldparent;</div><div class='del'>-                        struct iatt prenewparent;</div><div class='del'>-                        struct iatt postoldparent;</div><div class='del'>-                        struct iatt postnewparent;</div><div class='del'>-		} rename;</div><div class='del'>-</div><div class='del'>-		struct {</div><div class='del'>-			ino_t ino;</div><div class='del'>-                        uint64_t gen;</div><div class='del'>-                        ino_t parent_ino;</div><div class='del'>-			inode_t *inode;</div><div class='del'>-			struct iatt buf;</div><div class='del'>-                        struct iatt read_child_buf;</div><div class='del'>-                        struct iatt preparent;</div><div class='del'>-                        struct iatt postparent;</div><div class='del'>-		} link;</div><div class='del'>-</div><div class='del'>-		struct {</div><div class='del'>-			ino_t ino;</div><div class='del'>-                        uint64_t gen;</div><div class='del'>-                        ino_t parent_ino;</div><div class='del'>-			inode_t *inode;</div><div class='del'>-                        dict_t *params;</div><div class='del'>-			struct iatt buf;</div><div class='del'>-                        struct iatt read_child_buf;</div><div class='del'>-			char *linkpath;</div><div class='del'>-                        struct iatt preparent;</div><div class='del'>-                        struct iatt postparent;</div><div class='del'>-		} symlink;</div><div class='del'>-</div><div class='del'>-		struct {</div><div class='del'>-			int32_t flags;</div><div class='del'>-			dir_entry_t *entries;</div><div class='del'>-			int32_t count;</div><div class='del'>-		} setdents;</div><div class='del'>-	} cont;</div><div class='del'>-	</div><div class='del'>-	struct {</div><div class='del'>-		off_t start, len;</div><div class='del'>-</div><div class='del'>-		char *basename;</div><div class='del'>-		char *new_basename;</div><div class='del'>-</div><div class='del'>-		loc_t parent_loc;</div><div class='del'>-		loc_t new_parent_loc;</div><div class='del'>-</div><div class='del'>-		afr_transaction_type type;</div><div class='del'>-</div><div class='del'>-		int success_count;</div><div class='del'>-		int erase_pending;</div><div class='del'>-		int failure_count;</div><div class='del'>-</div><div class='del'>-		int last_tried;</div><div class='del'>-		int32_t *child_errno;</div><div class='del'>-</div><div class='del'>-		call_frame_t *main_frame;</div><div class='del'>-</div><div class='del'>-		int (*fop) (call_frame_t *frame, xlator_t *this);</div><div class='del'>-</div><div class='del'>-		int (*done) (call_frame_t *frame, xlator_t *this);</div><div class='del'>-</div><div class='del'>-		int (*resume) (call_frame_t *frame, xlator_t *this);</div><div class='del'>-</div><div class='del'>-		int (*unwind) (call_frame_t *frame, xlator_t *this);</div><div class='del'>-</div><div class='del'>-                /* post-op hook */</div><div class='del'>-                int (*post_post_op) (call_frame_t *frame, xlator_t *this);</div><div class='del'>-	} transaction;</div><div class='del'>-</div><div class='del'>-	afr_self_heal_t self_heal;</div><div class='del'>-} afr_local_t;</div><div class='add'>+int</div><div class='add'>+afr_attempt_lock_recovery(xlator_t *this, int32_t child_index);</div><div class='ctx'> </div><div class='add'>+int</div><div class='add'>+afr_mark_locked_nodes(xlator_t *this, fd_t *fd, unsigned char *locked_nodes);</div><div class='ctx'> </div><div class='del'>-typedef struct {</div><div class='del'>-        unsigned char *pre_op_done;</div><div class='del'>-        unsigned char *opened_on;     /* which subvolumes the fd is open on */</div><div class='del'>-        unsigned char *child_failed;</div><div class='del'>-        int flags;</div><div class='del'>-        int32_t wbflags;</div><div class='del'>-        uint64_t up_count;   /* number of CHILD_UPs this fd has seen */</div><div class='del'>-        uint64_t down_count; /* number of CHILD_DOWNs this fd has seen */</div><div class='del'>-</div><div class='del'>-        int32_t last_tried;</div><div class='del'>-        gf_boolean_t failed_over;</div><div class='del'>-        struct list_head entries; /* needed for readdir failover */</div><div class='del'>-} afr_fd_ctx_t;</div><div class='add'>+void</div><div class='add'>+afr_set_lk_owner(call_frame_t *frame, xlator_t *this, void *lk_owner);</div><div class='ctx'> </div><div class='add'>+int</div><div class='add'>+afr_set_lock_number(call_frame_t *frame, xlator_t *this);</div><div class='ctx'> </div><div class='del'>-/* try alloc and if it fails, goto label */</div><div class='del'>-#define ALLOC_OR_GOTO(var, type, label) do {                     \</div><div class='del'>-		var = GF_CALLOC (sizeof (type), 1,               \</div><div class='del'>-                                 gf_afr_mt_##type);              \</div><div class='del'>-		if (!var) {                                      \</div><div class='del'>-			gf_log (this-&gt;name, GF_LOG_ERROR,        \</div><div class='del'>-				"out of memory :(");             \</div><div class='del'>-			op_errno = ENOMEM;                       \</div><div class='del'>-			goto label;                              \</div><div class='del'>-		}                                                \</div><div class='del'>-	} while (0);</div><div class='add'>+int32_t</div><div class='add'>+afr_unlock(call_frame_t *frame, xlator_t *this);</div><div class='ctx'> </div><div class='add'>+int</div><div class='add'>+afr_lock_nonblocking(call_frame_t *frame, xlator_t *this);</div><div class='ctx'> </div><div class='del'>-/* did a call fail due to a child failing? */</div><div class='del'>-#define child_went_down(op_ret, op_errno) (((op_ret) &lt; 0) &amp;&amp;	      \</div><div class='del'>-					   ((op_errno == ENOTCONN) || \</div><div class='del'>-					    (op_errno == EBADFD)))</div><div class='add'>+int</div><div class='add'>+afr_blocking_lock(call_frame_t *frame, xlator_t *this);</div><div class='ctx'> </div><div class='del'>-#define afr_fop_failed(op_ret, op_errno) ((op_ret) == -1)</div><div class='add'>+int</div><div class='add'>+afr_internal_lock_finish(call_frame_t *frame, xlator_t *this);</div><div class='ctx'> </div><div class='del'>-/* have we tried all children? */</div><div class='del'>-#define all_tried(i, count)  ((i) == (count) - 1)</div><div class='add'>+int</div><div class='add'>+__afr_fd_ctx_set(xlator_t *this, fd_t *fd);</div><div class='ctx'> </div><div class='del'>-int32_t</div><div class='del'>-afr_set_dict_gfid (dict_t *dict, uuid_t gfid);</div><div class='add'>+afr_fd_ctx_t *</div><div class='add'>+afr_fd_ctx_get(fd_t *fd, xlator_t *this);</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-pump_command_reply (call_frame_t *frame, xlator_t *this);</div><div class='add'>+afr_build_parent_loc(loc_t *parent, loc_t *child, int32_t *op_errno);</div><div class='ctx'> </div><div class='del'>-int32_t</div><div class='del'>-afr_notify (xlator_t *this, int32_t event,</div><div class='del'>-            void *data, ...);</div><div class='add'>+int</div><div class='add'>+afr_locked_nodes_count(unsigned char *locked_nodes, int child_count);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+afr_replies_interpret(call_frame_t *frame, xlator_t *this, inode_t *inode,</div><div class='add'>+                      gf_boolean_t *start_heal);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+afr_local_replies_wipe(afr_local_t *local, afr_private_t *priv);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+afr_local_cleanup(afr_local_t *local, xlator_t *this);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+afr_frame_return(call_frame_t *frame);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+afr_open(call_frame_t *frame, xlator_t *this, loc_t *loc, int32_t flags,</div><div class='add'>+         fd_t *fd, dict_t *xdata);</div><div class='ctx'> </div><div class='ctx'> void</div><div class='del'>-afr_set_lk_owner (call_frame_t *frame, xlator_t *this);</div><div class='add'>+afr_local_transaction_cleanup(afr_local_t *local, xlator_t *this);</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-afr_set_lock_number (call_frame_t *frame, xlator_t *this);</div><div class='add'>+afr_cleanup_fd_ctx(xlator_t *this, fd_t *fd);</div><div class='add'>+</div><div class='add'>+#define AFR_STACK_UNWIND(fop, frame, op_ret, op_errno, params...)              \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        afr_local_t *__local = NULL;                                           \</div><div class='add'>+        xlator_t *__this = NULL;                                               \</div><div class='add'>+        int32_t __op_ret = 0;                                                  \</div><div class='add'>+        int32_t __op_errno = 0;                                                \</div><div class='add'>+                                                                               \</div><div class='add'>+        __op_ret = op_ret;                                                     \</div><div class='add'>+        __op_errno = op_errno;                                                 \</div><div class='add'>+        if (frame) {                                                           \</div><div class='add'>+            __local = frame-&gt;local;                                            \</div><div class='add'>+            __this = frame-&gt;this;                                              \</div><div class='add'>+            afr_handle_inconsistent_fop(frame, &amp;__op_ret, &amp;__op_errno);        \</div><div class='add'>+            if (__local &amp;&amp; __local-&gt;is_read_txn)                               \</div><div class='add'>+                afr_pending_read_decrement(__this-&gt;private,                    \</div><div class='add'>+                                           __local-&gt;read_subvol);              \</div><div class='add'>+            if (__local &amp;&amp; __local-&gt;xdata_req &amp;&amp;                               \</div><div class='add'>+                afr_is_lock_mode_mandatory(__local-&gt;xdata_req))                \</div><div class='add'>+                afr_dom_lock_release(frame);                                   \</div><div class='add'>+            frame-&gt;local = NULL;                                               \</div><div class='add'>+        }                                                                      \</div><div class='add'>+                                                                               \</div><div class='add'>+        STACK_UNWIND_STRICT(fop, frame, __op_ret, __op_errno, params);         \</div><div class='add'>+        if (__local) {                                                         \</div><div class='add'>+            afr_local_cleanup(__local, __this);                                \</div><div class='add'>+            mem_put(__local);                                                  \</div><div class='add'>+        }                                                                      \</div><div class='add'>+    } while (0)</div><div class='add'>+</div><div class='add'>+#define AFR_STACK_DESTROY(frame)                                               \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        afr_local_t *__local = NULL;                                           \</div><div class='add'>+        xlator_t *__this = NULL;                                               \</div><div class='add'>+        __local = frame-&gt;local;                                                \</div><div class='add'>+        __this = frame-&gt;this;                                                  \</div><div class='add'>+        frame-&gt;local = NULL;                                                   \</div><div class='add'>+        STACK_DESTROY(frame-&gt;root);                                            \</div><div class='add'>+        if (__local) {                                                         \</div><div class='add'>+            afr_local_cleanup(__local, __this);                                \</div><div class='add'>+            mem_put(__local);                                                  \</div><div class='add'>+        }                                                                      \</div><div class='add'>+    } while (0);</div><div class='add'>+</div><div class='add'>+#define AFR_FRAME_INIT(frame, op_errno)                                        \</div><div class='add'>+    ({                                                                         \</div><div class='add'>+        frame-&gt;local = mem_get0(THIS-&gt;local_pool);                             \</div><div class='add'>+        if (afr_local_init(frame-&gt;local, frame-&gt;this-&gt;private, &amp;op_errno)) {   \</div><div class='add'>+            afr_local_cleanup(frame-&gt;local, frame-&gt;this);                      \</div><div class='add'>+            mem_put(frame-&gt;local);                                             \</div><div class='add'>+            frame-&gt;local = NULL;                                               \</div><div class='add'>+        };                                                                     \</div><div class='add'>+        frame-&gt;local;                                                          \</div><div class='add'>+    })</div><div class='add'>+</div><div class='add'>+#define AFR_STACK_RESET(frame)                                                 \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        afr_local_t *__local = NULL;                                           \</div><div class='add'>+        xlator_t *__this = NULL;                                               \</div><div class='add'>+        __local = frame-&gt;local;                                                \</div><div class='add'>+        __this = frame-&gt;this;                                                  \</div><div class='add'>+        frame-&gt;local = NULL;                                                   \</div><div class='add'>+        int __opr;                                                             \</div><div class='add'>+        STACK_RESET(frame-&gt;root);                                              \</div><div class='add'>+        if (__local) {                                                         \</div><div class='add'>+            afr_local_cleanup(__local, __this);                                \</div><div class='add'>+            mem_put(__local);                                                  \</div><div class='add'>+        }                                                                      \</div><div class='add'>+        AFR_FRAME_INIT(frame, __opr);                                          \</div><div class='add'>+    } while (0)</div><div class='add'>+</div><div class='add'>+/* allocate and return a string that is the basename of argument */</div><div class='add'>+static inline char *</div><div class='add'>+AFR_BASENAME(const char *str)</div><div class='add'>+{</div><div class='add'>+    char *__tmp_str = NULL;</div><div class='add'>+    char *__basename_str = NULL;</div><div class='add'>+    __tmp_str = gf_strdup(str);</div><div class='add'>+    __basename_str = gf_strdup(basename(__tmp_str));</div><div class='add'>+    GF_FREE(__tmp_str);</div><div class='add'>+    return __basename_str;</div><div class='add'>+}</div><div class='ctx'> </div><div class='add'>+call_frame_t *</div><div class='add'>+afr_copy_frame(call_frame_t *base);</div><div class='ctx'> </div><div class='del'>-loc_t *</div><div class='del'>-lower_path (loc_t *l1, const char *b1, loc_t *l2, const char *b2);</div><div class='add'>+int</div><div class='add'>+afr_transaction_local_init(afr_local_t *local, xlator_t *this);</div><div class='ctx'> </div><div class='ctx'> int32_t</div><div class='del'>-afr_unlock (call_frame_t *frame, xlator_t *this);</div><div class='add'>+afr_marker_getxattr(call_frame_t *frame, xlator_t *this, loc_t *loc,</div><div class='add'>+                    const char *name, afr_local_t *local, afr_private_t *priv);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+afr_local_init(afr_local_t *local, afr_private_t *priv, int32_t *op_errno);</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-afr_nonblocking_entrylk (call_frame_t *frame, xlator_t *this);</div><div class='add'>+afr_internal_lock_init(afr_internal_lock_t *lk, size_t child_count);</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-afr_nonblocking_inodelk (call_frame_t *frame, xlator_t *this);</div><div class='add'>+afr_higher_errno(int32_t old_errno, int32_t new_errno);</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-afr_blocking_lock (call_frame_t *frame, xlator_t *this);</div><div class='add'>+afr_final_errno(afr_local_t *local, afr_private_t *priv);</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-afr_internal_lock_finish (call_frame_t *frame, xlator_t *this);</div><div class='add'>+afr_xattr_req_prepare(xlator_t *this, dict_t *xattr_req);</div><div class='ctx'> </div><div class='add'>+void</div><div class='add'>+afr_fix_open(fd_t *fd, xlator_t *this);</div><div class='ctx'> </div><div class='del'>-int pump_start (call_frame_t *frame, xlator_t *this);</div><div class='add'>+afr_fd_ctx_t *</div><div class='add'>+afr_fd_ctx_get(fd_t *fd, xlator_t *this);</div><div class='ctx'> </div><div class='add'>+void</div><div class='add'>+afr_set_low_priority(call_frame_t *frame);</div><div class='ctx'> int</div><div class='del'>-afr_fd_ctx_set (xlator_t *this, fd_t *fd);</div><div class='add'>+afr_child_fd_ctx_set(xlator_t *this, fd_t *fd, int32_t child, int flags);</div><div class='ctx'> </div><div class='del'>-uint64_t</div><div class='del'>-afr_read_child (xlator_t *this, inode_t *inode);</div><div class='add'>+void</div><div class='add'>+afr_matrix_cleanup(int32_t **pending, unsigned int m);</div><div class='add'>+</div><div class='add'>+int32_t **</div><div class='add'>+afr_matrix_create(unsigned int m, unsigned int n);</div><div class='add'>+</div><div class='add'>+int **</div><div class='add'>+afr_mark_pending_changelog(afr_private_t *priv, unsigned char *pending,</div><div class='add'>+                           dict_t *xattr, ia_type_t iat);</div><div class='ctx'> </div><div class='ctx'> void</div><div class='del'>-afr_set_read_child (xlator_t *this, inode_t *inode, int32_t read_child);</div><div class='add'>+afr_filter_xattrs(dict_t *xattr);</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+ * Special value indicating we should use the "auto" quorum method instead of</div><div class='add'>+ * a fixed value (including zero to turn off quorum enforcement).</div><div class='add'>+ */</div><div class='add'>+#define AFR_QUORUM_AUTO INT_MAX</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+afr_fd_report_unstable_write(xlator_t *this, afr_local_t *local);</div><div class='add'>+</div><div class='add'>+gf_boolean_t</div><div class='add'>+afr_fd_has_witnessed_unstable_write(xlator_t *this, inode_t *inode);</div><div class='ctx'> </div><div class='ctx'> void</div><div class='del'>-afr_build_parent_loc (loc_t *parent, loc_t *child);</div><div class='add'>+afr_reply_wipe(struct afr_reply *reply);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+afr_replies_wipe(struct afr_reply *replies, int count);</div><div class='add'>+</div><div class='add'>+gf_boolean_t</div><div class='add'>+afr_xattrs_are_equal(dict_t *dict1, dict_t *dict2);</div><div class='add'>+</div><div class='add'>+gf_boolean_t</div><div class='add'>+afr_is_xattr_ignorable(char *key);</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-afr_up_children_count (int child_count, unsigned char *child_up);</div><div class='add'>+afr_get_heal_info(call_frame_t *frame, xlator_t *this, loc_t *loc);</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-afr_locked_nodes_count (unsigned char *locked_nodes, int child_count);</div><div class='add'>+afr_heal_splitbrain_file(call_frame_t *frame, xlator_t *this, loc_t *loc);</div><div class='ctx'> </div><div class='del'>-ino64_t</div><div class='del'>-afr_itransform (ino64_t ino, int child_count, int child_index);</div><div class='add'>+int</div><div class='add'>+afr_get_split_brain_status(void *opaque);</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-afr_deitransform (ino64_t ino, int child_count);</div><div class='add'>+afr_get_split_brain_status_cbk(int ret, call_frame_t *frame, void *opaque);</div><div class='ctx'> </div><div class='del'>-void</div><div class='del'>-afr_local_cleanup (afr_local_t *local, xlator_t *this);</div><div class='add'>+int</div><div class='add'>+afr_inode_split_brain_choice_set(inode_t *inode, xlator_t *this,</div><div class='add'>+                                 int spb_choice);</div><div class='add'>+int</div><div class='add'>+afr_split_brain_read_subvol_get(inode_t *inode, xlator_t *this,</div><div class='add'>+                                call_frame_t *frame, int *spb_subvol);</div><div class='add'>+int</div><div class='add'>+afr_get_child_index_from_name(xlator_t *this, char *name);</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-afr_frame_return (call_frame_t *frame);</div><div class='add'>+afr_is_split_brain(call_frame_t *frame, xlator_t *this, inode_t *inode,</div><div class='add'>+                   uuid_t gfid, gf_boolean_t *d_spb, gf_boolean_t *m_spb);</div><div class='add'>+int</div><div class='add'>+afr_spb_choice_timeout_cancel(xlator_t *this, inode_t *inode);</div><div class='ctx'> </div><div class='del'>-uint64_t</div><div class='del'>-afr_is_split_brain (xlator_t *this, inode_t *inode);</div><div class='add'>+int</div><div class='add'>+afr_set_split_brain_choice(int ret, call_frame_t *frame, void *opaque);</div><div class='add'>+</div><div class='add'>+gf_boolean_t</div><div class='add'>+afr_get_need_heal(xlator_t *this);</div><div class='ctx'> </div><div class='ctx'> void</div><div class='del'>-afr_set_split_brain (xlator_t *this, inode_t *inode, gf_boolean_t set);</div><div class='add'>+afr_set_need_heal(xlator_t *this, afr_local_t *local);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+afr_selfheal_data_open(xlator_t *this, inode_t *inode, fd_t **fd);</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-afr_open (call_frame_t *frame, xlator_t *this, loc_t *loc, int32_t flags,</div><div class='del'>-          fd_t *fd, int32_t wbflags);</div><div class='add'>+afr_get_msg_id(char *op_type);</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-afr_up_down_flush (call_frame_t *frame, xlator_t *this, fd_t *fd, afr_flush_type type);</div><div class='add'>+afr_set_in_flight_sb_status(xlator_t *this, call_frame_t *frame,</div><div class='add'>+                            inode_t *inode);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+afr_quorum_errno(afr_private_t *priv);</div><div class='ctx'> </div><div class='add'>+gf_boolean_t</div><div class='add'>+afr_is_consistent_io_possible(afr_local_t *local, afr_private_t *priv,</div><div class='add'>+                              int32_t *op_errno);</div><div class='ctx'> void</div><div class='del'>-afr_set_opendir_done (xlator_t *this, inode_t *inode);</div><div class='add'>+afr_handle_inconsistent_fop(call_frame_t *frame, int32_t *op_ret,</div><div class='add'>+                            int32_t *op_errno);</div><div class='ctx'> </div><div class='del'>-uint64_t</div><div class='del'>-afr_is_opendir_done (xlator_t *this, inode_t *inode);</div><div class='add'>+void</div><div class='add'>+afr_inode_write_fill(call_frame_t *frame, xlator_t *this, int child_index,</div><div class='add'>+                     int32_t op_ret, int32_t op_errno, struct iatt *prebuf,</div><div class='add'>+                     struct iatt *postbuf, dict_t *xdata);</div><div class='add'>+void</div><div class='add'>+afr_process_post_writev(call_frame_t *frame, xlator_t *this);</div><div class='ctx'> </div><div class='ctx'> void</div><div class='del'>-afr_local_transaction_cleanup (afr_local_t *local, xlator_t *this);</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-afr_cleanup_fd_ctx (xlator_t *this, fd_t *fd);</div><div class='del'>-</div><div class='del'>-#define AFR_STACK_UNWIND(fop, frame, params ...)        \</div><div class='del'>-	do {						\</div><div class='del'>-		afr_local_t *__local = NULL;		\</div><div class='del'>-		xlator_t    *__this = NULL;		\</div><div class='del'>-                if (frame) {                            \</div><div class='del'>-                        __local = frame-&gt;local;		\</div><div class='del'>-                        __this = frame-&gt;this;           \</div><div class='del'>-                        frame-&gt;local = NULL;            \</div><div class='del'>-                }                                               \</div><div class='del'>-		STACK_UNWIND_STRICT (fop, frame, params);       \</div><div class='del'>-		afr_local_cleanup (__local, __this);            \</div><div class='del'>-		GF_FREE (__local);				\</div><div class='del'>-        } while (0);</div><div class='del'>-</div><div class='del'>-#define AFR_STACK_DESTROY(frame)			\</div><div class='del'>-	do {						\</div><div class='del'>-		afr_local_t *__local = NULL;		\</div><div class='del'>-		xlator_t    *__this = NULL;		\</div><div class='del'>-		__local = frame-&gt;local;			\</div><div class='del'>-		__this = frame-&gt;this;			\</div><div class='del'>-		frame-&gt;local = NULL;                    \</div><div class='del'>-		STACK_DESTROY (frame-&gt;root);		\</div><div class='del'>-		afr_local_cleanup (__local, __this);	\</div><div class='del'>-		GF_FREE (__local);			\</div><div class='del'>-        } while (0);</div><div class='add'>+afr_writev_unwind(call_frame_t *frame, xlator_t *this);</div><div class='ctx'> </div><div class='del'>-/* allocate and return a string that is the basename of argument */</div><div class='del'>-static inline char * </div><div class='del'>-AFR_BASENAME (const char *str)						</div><div class='del'>-{</div><div class='del'>-	char *__tmp_str = NULL;				</div><div class='del'>-	char *__basename_str = NULL;			</div><div class='del'>-	__tmp_str = gf_strdup (str);			</div><div class='del'>-	__basename_str = gf_strdup (basename (__tmp_str));	</div><div class='del'>-	GF_FREE (__tmp_str);</div><div class='del'>-	return __basename_str;</div><div class='del'>-}</div><div class='add'>+void</div><div class='add'>+afr_writev_copy_outvars(call_frame_t *src_frame, call_frame_t *dst_frame);</div><div class='ctx'> </div><div class='del'>-/* initialize local_t */</div><div class='del'>-static inline int</div><div class='del'>-AFR_LOCAL_INIT (afr_local_t *local, afr_private_t *priv)</div><div class='del'>-{</div><div class='del'>-	local-&gt;child_up = GF_CALLOC (sizeof (*local-&gt;child_up),</div><div class='del'>-			       	     priv-&gt;child_count,</div><div class='del'>-                                     gf_afr_mt_char);</div><div class='del'>-	if (!local-&gt;child_up) {</div><div class='del'>-		return -ENOMEM;</div><div class='del'>-	}</div><div class='add'>+void</div><div class='add'>+afr_update_uninodelk(afr_local_t *local, afr_internal_lock_t *int_lock,</div><div class='add'>+                     int32_t child_index);</div><div class='add'>+afr_fd_ctx_t *</div><div class='add'>+__afr_fd_ctx_get(fd_t *fd, xlator_t *this);</div><div class='ctx'> </div><div class='del'>-	memcpy (local-&gt;child_up, priv-&gt;child_up, </div><div class='del'>-		sizeof (*local-&gt;child_up) * priv-&gt;child_count);</div><div class='add'>+gf_boolean_t</div><div class='add'>+afr_is_inode_refresh_reqd(inode_t *inode, xlator_t *this, int event_gen1,</div><div class='add'>+                          int event_gen2);</div><div class='ctx'> </div><div class='add'>+int</div><div class='add'>+afr_serialize_xattrs_with_delimiter(call_frame_t *frame, xlator_t *this,</div><div class='add'>+                                    char *buf, const char *default_str,</div><div class='add'>+                                    int32_t *serz_len, char delimiter);</div><div class='add'>+gf_boolean_t</div><div class='add'>+afr_is_symmetric_error(call_frame_t *frame, xlator_t *this);</div><div class='ctx'> </div><div class='del'>-	local-&gt;call_count = afr_up_children_count (priv-&gt;child_count, local-&gt;child_up);</div><div class='del'>-	if (local-&gt;call_count == 0)</div><div class='del'>-		return -ENOTCONN;</div><div class='add'>+int</div><div class='add'>+__afr_inode_ctx_get(xlator_t *this, inode_t *inode, afr_inode_ctx_t **ctx);</div><div class='ctx'> </div><div class='del'>-	local-&gt;transaction.erase_pending = 1;</div><div class='add'>+uint64_t</div><div class='add'>+afr_write_subvol_get(call_frame_t *frame, xlator_t *this);</div><div class='ctx'> </div><div class='del'>-	local-&gt;op_ret = -1;</div><div class='del'>-	local-&gt;op_errno = EUCLEAN;</div><div class='add'>+int</div><div class='add'>+afr_write_subvol_set(call_frame_t *frame, xlator_t *this);</div><div class='ctx'> </div><div class='del'>-        local-&gt;internal_lock.lock_op_ret   = -1;</div><div class='del'>-        local-&gt;internal_lock.lock_op_errno = EUCLEAN;</div><div class='add'>+int</div><div class='add'>+afr_write_subvol_reset(call_frame_t *frame, xlator_t *this);</div><div class='ctx'> </div><div class='add'>+int</div><div class='add'>+afr_set_inode_local(xlator_t *this, afr_local_t *local, inode_t *inode);</div><div class='ctx'> </div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='add'>+int</div><div class='add'>+afr_fill_ta_loc(xlator_t *this, loc_t *loc, gf_boolean_t is_gfid_based_fop);</div><div class='ctx'> </div><div class='add'>+int</div><div class='add'>+afr_ta_post_op_lock(xlator_t *this, loc_t *loc);</div><div class='ctx'> </div><div class='del'>-/**</div><div class='del'>- * first_up_child - return the index of the first child that is up</div><div class='del'>- */</div><div class='add'>+int</div><div class='add'>+afr_ta_post_op_unlock(xlator_t *this, loc_t *loc);</div><div class='ctx'> </div><div class='del'>-static inline int</div><div class='del'>-afr_first_up_child (afr_private_t *priv)</div><div class='del'>-{</div><div class='del'>-	xlator_t ** children = NULL;</div><div class='del'>-	int         ret      = -1;</div><div class='del'>-	int         i        = 0;</div><div class='del'>-</div><div class='del'>-	LOCK (&amp;priv-&gt;lock);</div><div class='del'>-	{</div><div class='del'>-		children = priv-&gt;children;</div><div class='del'>-		for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='del'>-			if (priv-&gt;child_up[i]) {</div><div class='del'>-				ret = i;</div><div class='del'>-				break;</div><div class='del'>-			}</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='del'>-	UNLOCK (&amp;priv-&gt;lock);</div><div class='del'>-</div><div class='del'>-	return ret;</div><div class='del'>-}</div><div class='add'>+gf_boolean_t</div><div class='add'>+afr_is_pending_set(xlator_t *this, dict_t *xdata, int type);</div><div class='ctx'> </div><div class='add'>+int</div><div class='add'>+__afr_get_up_children_count(afr_private_t *priv);</div><div class='ctx'> </div><div class='del'>-static inline int</div><div class='del'>-afr_transaction_local_init (afr_local_t *local, afr_private_t *priv)</div><div class='del'>-{</div><div class='del'>-        int i;</div><div class='del'>-</div><div class='del'>-        local-&gt;first_up_child = afr_first_up_child (priv);</div><div class='del'>-</div><div class='del'>-	local-&gt;child_errno = GF_CALLOC (sizeof (*local-&gt;child_errno),</div><div class='del'>-				        priv-&gt;child_count,</div><div class='del'>-                                        gf_afr_mt_int32_t);</div><div class='del'>-	if (!local-&gt;child_errno) {</div><div class='del'>-		return -ENOMEM;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	local-&gt;pending = GF_CALLOC (sizeof (*local-&gt;pending),</div><div class='del'>-                                    priv-&gt;child_count,</div><div class='del'>-                                    gf_afr_mt_int32_t);</div><div class='del'>-</div><div class='del'>-	if (!local-&gt;pending) {</div><div class='del'>-		return -ENOMEM;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-        for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='del'>-                local-&gt;pending[i] = GF_CALLOC (sizeof (*local-&gt;pending[i]),</div><div class='del'>-                                               3, /* data + metadata + entry */</div><div class='del'>-                                               gf_afr_mt_int32_t);</div><div class='del'>-                if (!local-&gt;pending[i])</div><div class='del'>-                        return -ENOMEM;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-	local-&gt;internal_lock.inode_locked_nodes =</div><div class='del'>-                GF_CALLOC (sizeof (*local-&gt;internal_lock.inode_locked_nodes),</div><div class='del'>-                           priv-&gt;child_count,</div><div class='del'>-                           gf_afr_mt_char);</div><div class='del'>-</div><div class='del'>-	local-&gt;internal_lock.entry_locked_nodes =</div><div class='del'>-                GF_CALLOC (sizeof (*local-&gt;internal_lock.entry_locked_nodes),</div><div class='del'>-                           priv-&gt;child_count,</div><div class='del'>-                           gf_afr_mt_char);</div><div class='del'>-</div><div class='del'>-	local-&gt;internal_lock.locked_nodes =</div><div class='del'>-                GF_CALLOC (sizeof (*local-&gt;internal_lock.locked_nodes),</div><div class='del'>-                           priv-&gt;child_count,</div><div class='del'>-                           gf_afr_mt_char);</div><div class='del'>-</div><div class='del'>-	local-&gt;internal_lock.lower_locked_nodes</div><div class='del'>-                = GF_CALLOC (sizeof (*local-&gt;internal_lock.lower_locked_nodes),</div><div class='del'>-                             priv-&gt;child_count,</div><div class='del'>-                             gf_afr_mt_char);</div><div class='del'>-</div><div class='del'>-	local-&gt;transaction.child_errno = GF_CALLOC (sizeof (*local-&gt;transaction.child_errno),</div><div class='del'>-					            priv-&gt;child_count,</div><div class='del'>-                                                    gf_afr_mt_int32_t);</div><div class='del'>-</div><div class='del'>-        local-&gt;internal_lock.transaction_lk_type = AFR_TRANSACTION_LK;</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='add'>+call_frame_t *</div><div class='add'>+afr_ta_frame_create(xlator_t *this);</div><div class='add'>+</div><div class='add'>+gf_boolean_t</div><div class='add'>+afr_ta_has_quorum(afr_private_t *priv, afr_local_t *local);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+afr_ta_lock_release_synctask(xlator_t *this);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+afr_ta_locked_priv_invalidate(afr_private_t *priv);</div><div class='add'>+</div><div class='add'>+gf_boolean_t</div><div class='add'>+afr_lookup_has_quorum(call_frame_t *frame,</div><div class='add'>+                      const unsigned int up_children_count);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+afr_mark_new_entry_changelog(call_frame_t *frame, xlator_t *this);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+afr_handle_replies_quorum(call_frame_t *frame, xlator_t *this);</div><div class='add'>+</div><div class='add'>+gf_boolean_t</div><div class='add'>+afr_ta_dict_contains_pending_xattr(dict_t *dict, afr_private_t *priv,</div><div class='add'>+                                   int child);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+afr_selfheal_childup(xlator_t *this, afr_private_t *priv);</div><div class='add'>+</div><div class='add'>+gf_boolean_t</div><div class='add'>+afr_is_lock_mode_mandatory(dict_t *xdata);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+afr_dom_lock_release(call_frame_t *frame);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+afr_fill_success_replies(afr_local_t *local, afr_private_t *priv,</div><div class='add'>+                         unsigned char *replies);</div><div class='ctx'> </div><div class='add'>+gf_boolean_t</div><div class='add'>+afr_is_private_directory(afr_private_t *priv, uuid_t pargfid, const char *name,</div><div class='add'>+                         pid_t pid);</div><div class='ctx'> #endif /* __AFR_H__ */</div><div class='head'>diff --git a/xlators/cluster/afr/src/pump.c b/xlators/cluster/afr/src/pump.c<br/>deleted file mode 100644<br/>index 977de07dcd9..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/xlators/cluster/afr/src/pump.c?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/cluster/afr/src/pump.c</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,1867 +0,0 @@</div><div class='del'>-/*</div><div class='del'>-   Copyright (c) 2007-2009 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='del'>-   This file is part of GlusterFS.</div><div class='del'>-</div><div class='del'>-   GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-   it under the terms of the GNU General Public License as published</div><div class='del'>-   by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-   or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-   GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-   WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-   General Public License for more details.</div><div class='del'>-</div><div class='del'>-   You should have received a copy of the GNU General Public License</div><div class='del'>-   along with this program.  If not, see</div><div class='del'>-   &lt;http://www.gnu.org/licenses/&gt;.</div><div class='del'>-*/</div><div class='del'>-</div><div class='del'>-#include &lt;unistd.h&gt;</div><div class='del'>-#include &lt;sys/time.h&gt;</div><div class='del'>-#include &lt;stdlib.h&gt;</div><div class='del'>-</div><div class='del'>-#ifndef _CONFIG_H</div><div class='del'>-#define _CONFIG_H</div><div class='del'>-#include "config.h"</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-#include "afr-common.c"</div><div class='del'>-</div><div class='del'>-static int</div><div class='del'>-pump_mark_start_pending (xlator_t *this)</div><div class='del'>-{</div><div class='del'>-        afr_private_t  *priv      = NULL;</div><div class='del'>-        pump_private_t *pump_priv = NULL;</div><div class='del'>-</div><div class='del'>-        priv      = this-&gt;private;</div><div class='del'>-        pump_priv = priv-&gt;pump_private;</div><div class='del'>-</div><div class='del'>-        pump_priv-&gt;pump_start_pending = 1;</div><div class='del'>-</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-static int</div><div class='del'>-is_pump_start_pending (xlator_t *this)</div><div class='del'>-{</div><div class='del'>-        afr_private_t  *priv      = NULL;</div><div class='del'>-        pump_private_t *pump_priv = NULL;</div><div class='del'>-</div><div class='del'>-        priv      = this-&gt;private;</div><div class='del'>-        pump_priv = priv-&gt;pump_private;</div><div class='del'>-</div><div class='del'>-        return (pump_priv-&gt;pump_start_pending);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-static int</div><div class='del'>-pump_remove_start_pending (xlator_t *this)</div><div class='del'>-{</div><div class='del'>-        afr_private_t  *priv      = NULL;</div><div class='del'>-        pump_private_t *pump_priv = NULL;</div><div class='del'>-</div><div class='del'>-        priv      = this-&gt;private;</div><div class='del'>-        pump_priv = priv-&gt;pump_private;</div><div class='del'>-</div><div class='del'>-        pump_priv-&gt;pump_start_pending = 0;</div><div class='del'>-</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-static pump_state_t</div><div class='del'>-pump_get_state ()</div><div class='del'>-{</div><div class='del'>-        xlator_t *this = NULL;</div><div class='del'>-        afr_private_t *priv = NULL;</div><div class='del'>-        pump_private_t *pump_priv = NULL;</div><div class='del'>-</div><div class='del'>-        pump_state_t ret;</div><div class='del'>-</div><div class='del'>-        this = THIS;</div><div class='del'>-        priv = this-&gt;private;</div><div class='del'>-        pump_priv = priv-&gt;pump_private;</div><div class='del'>-</div><div class='del'>-        LOCK (&amp;pump_priv-&gt;pump_state_lock);</div><div class='del'>-        {</div><div class='del'>-                ret = pump_priv-&gt;pump_state;</div><div class='del'>-        }</div><div class='del'>-        UNLOCK (&amp;pump_priv-&gt;pump_state_lock);</div><div class='del'>-</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-pump_change_state (xlator_t *this, pump_state_t state)</div><div class='del'>-{</div><div class='del'>-        afr_private_t *priv = NULL;</div><div class='del'>-        pump_private_t *pump_priv = NULL;</div><div class='del'>-</div><div class='del'>-        pump_state_t state_old;</div><div class='del'>-        pump_state_t state_new;</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-        priv = this-&gt;private;</div><div class='del'>-        pump_priv = priv-&gt;pump_private;</div><div class='del'>-</div><div class='del'>-        GF_ASSERT (pump_priv);</div><div class='del'>-</div><div class='del'>-        LOCK (&amp;pump_priv-&gt;pump_state_lock);</div><div class='del'>-        {</div><div class='del'>-                state_old = pump_priv-&gt;pump_state;</div><div class='del'>-                state_new = state;</div><div class='del'>-</div><div class='del'>-                pump_priv-&gt;pump_state = state;</div><div class='del'>-</div><div class='del'>-        }</div><div class='del'>-        UNLOCK (&amp;pump_priv-&gt;pump_state_lock);</div><div class='del'>-</div><div class='del'>-        gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-                "Pump changing state from %d to %d",</div><div class='del'>-                state_old,</div><div class='del'>-                state_new);</div><div class='del'>-</div><div class='del'>-        return  0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-static int</div><div class='del'>-pump_set_resume_path (xlator_t *this, const char *path)</div><div class='del'>-{</div><div class='del'>-        int ret = 0;</div><div class='del'>-</div><div class='del'>-        afr_private_t *priv = NULL;</div><div class='del'>-        pump_private_t *pump_priv = NULL;</div><div class='del'>-</div><div class='del'>-        priv = this-&gt;private;</div><div class='del'>-        pump_priv = priv-&gt;pump_private;</div><div class='del'>-</div><div class='del'>-        assert (pump_priv);</div><div class='del'>-</div><div class='del'>-        LOCK (&amp;pump_priv-&gt;resume_path_lock);</div><div class='del'>-        {</div><div class='del'>-                pump_priv-&gt;resume_path = strdup (path);</div><div class='del'>-                if (!pump_priv-&gt;resume_path)</div><div class='del'>-                        ret = -1;</div><div class='del'>-        }</div><div class='del'>-        UNLOCK (&amp;pump_priv-&gt;resume_path_lock);</div><div class='del'>-</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-static void</div><div class='del'>-build_child_loc (loc_t *parent, loc_t *child, char *path, char *name)</div><div class='del'>-{</div><div class='del'>-        child-&gt;path = path;</div><div class='del'>-        child-&gt;name = name;</div><div class='del'>-</div><div class='del'>-        child-&gt;parent = inode_ref (parent-&gt;inode);</div><div class='del'>-        child-&gt;inode = inode_new (parent-&gt;inode-&gt;table);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-static char *</div><div class='del'>-build_file_path (loc_t *loc, gf_dirent_t *entry)</div><div class='del'>-{</div><div class='del'>-        xlator_t *this = NULL;</div><div class='del'>-        char *file_path = NULL;</div><div class='del'>-        int pathlen = 0;</div><div class='del'>-        int total_size = 0;</div><div class='del'>-</div><div class='del'>-        this = THIS;</div><div class='del'>-</div><div class='del'>-        pathlen = STRLEN_0 (loc-&gt;path);</div><div class='del'>-</div><div class='del'>-        if (IS_ROOT_PATH (loc-&gt;path)) {</div><div class='del'>-                total_size = pathlen + entry-&gt;d_len;</div><div class='del'>-                file_path = GF_CALLOC (1, total_size, gf_afr_mt_char);</div><div class='del'>-                if (!file_path) {</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-                                "Out of memory");</div><div class='del'>-                        return NULL;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_TRACE,</div><div class='del'>-                        "constructing file path of size=%d"</div><div class='del'>-                        "pathlen=%d, d_len=%d",</div><div class='del'>-                        total_size, pathlen,</div><div class='del'>-                        entry-&gt;d_len);</div><div class='del'>-</div><div class='del'>-                snprintf(file_path, total_size, "%s%s", loc-&gt;path, entry-&gt;d_name);</div><div class='del'>-</div><div class='del'>-        } else {</div><div class='del'>-                total_size = pathlen + entry-&gt;d_len + 1; /* for the extra '/' in the path */</div><div class='del'>-                file_path = GF_CALLOC (1, total_size + 1, gf_afr_mt_char);</div><div class='del'>-                if (!file_path) {</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-                                "Out of memory");</div><div class='del'>-                        return NULL;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_TRACE,</div><div class='del'>-                        "constructing file path of size=%d"</div><div class='del'>-                        "pathlen=%d, d_len=%d",</div><div class='del'>-                        total_size, pathlen,</div><div class='del'>-                        entry-&gt;d_len);</div><div class='del'>-</div><div class='del'>-                snprintf(file_path, total_size, "%s/%s", loc-&gt;path, entry-&gt;d_name);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        gf_log (this-&gt;name, GF_LOG_TRACE,</div><div class='del'>-                "path=%s and d_name=%s", loc-&gt;path, entry-&gt;d_name);</div><div class='del'>-        gf_log (this-&gt;name, GF_LOG_TRACE,</div><div class='del'>-                "constructed file_path=%s of size=%d", file_path, total_size);</div><div class='del'>-</div><div class='del'>-        return file_path;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-static int</div><div class='del'>-pump_save_path (xlator_t *this, const char *path)</div><div class='del'>-{</div><div class='del'>-        afr_private_t *priv = NULL;</div><div class='del'>-        pump_private_t *pump_priv = NULL;</div><div class='del'>-        pump_state_t state;</div><div class='del'>-        dict_t *dict = NULL;</div><div class='del'>-        loc_t  loc;</div><div class='del'>-        int dict_ret = 0;</div><div class='del'>-        int ret = -1;</div><div class='del'>-</div><div class='del'>-        state = pump_get_state ();</div><div class='del'>-        if (state == PUMP_STATE_RESUME)</div><div class='del'>-                return 0;</div><div class='del'>-</div><div class='del'>-        priv = this-&gt;private;</div><div class='del'>-        pump_priv = priv-&gt;pump_private;</div><div class='del'>-</div><div class='del'>-        assert (priv-&gt;root_inode);</div><div class='del'>-</div><div class='del'>-        build_root_loc (priv-&gt;root_inode, &amp;loc);</div><div class='del'>-</div><div class='del'>-        dict = dict_new ();</div><div class='del'>-        dict_ret = dict_set_str (dict, PUMP_PATH, (char *)path);</div><div class='del'>-</div><div class='del'>-        ret = syncop_setxattr (PUMP_SOURCE_CHILD (this), &amp;loc, dict, 0);</div><div class='del'>-</div><div class='del'>-        if (ret &lt; 0) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-                        "setxattr failed - could not save path=%s", path);</div><div class='del'>-        } else {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-                        "setxattr succeeded - saved path=%s", path);</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-                        "Saving path for status info");</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        dict_unref (dict);</div><div class='del'>-</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-static int</div><div class='del'>-pump_check_and_update_status (xlator_t *this)</div><div class='del'>-{</div><div class='del'>-        pump_state_t state;</div><div class='del'>-        int ret = -1;</div><div class='del'>-</div><div class='del'>-        state = pump_get_state ();</div><div class='del'>-</div><div class='del'>-        switch (state) {</div><div class='del'>-</div><div class='del'>-        case PUMP_STATE_RESUME:</div><div class='del'>-        case PUMP_STATE_RUNNING:</div><div class='del'>-        {</div><div class='del'>-                ret = 0;</div><div class='del'>-                break;</div><div class='del'>-        }</div><div class='del'>-        case PUMP_STATE_PAUSE:</div><div class='del'>-        {</div><div class='del'>-                ret = -1;</div><div class='del'>-                break;</div><div class='del'>-        }</div><div class='del'>-        case PUMP_STATE_ABORT:</div><div class='del'>-        {</div><div class='del'>-                pump_save_path (this, "/");</div><div class='del'>-                ret = -1;</div><div class='del'>-                break;</div><div class='del'>-        }</div><div class='del'>-        default:</div><div class='del'>-        {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-                        "Unknown pump state");</div><div class='del'>-                ret = -1;</div><div class='del'>-                break;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-static const char *</div><div class='del'>-pump_get_resume_path (xlator_t *this)</div><div class='del'>-{</div><div class='del'>-        afr_private_t *priv = NULL;</div><div class='del'>-        pump_private_t *pump_priv = NULL;</div><div class='del'>-</div><div class='del'>-        const char *resume_path = NULL;</div><div class='del'>-</div><div class='del'>-        priv = this-&gt;private;</div><div class='del'>-        pump_priv = priv-&gt;pump_private;</div><div class='del'>-</div><div class='del'>-        resume_path = pump_priv-&gt;resume_path;</div><div class='del'>-</div><div class='del'>-        return resume_path;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-static int</div><div class='del'>-pump_update_resume_state (xlator_t *this, const char *path)</div><div class='del'>-{</div><div class='del'>-        afr_private_t *priv = NULL;</div><div class='del'>-        pump_private_t *pump_priv = NULL;</div><div class='del'>-</div><div class='del'>-        pump_state_t state;</div><div class='del'>-        const char *resume_path = NULL;</div><div class='del'>-</div><div class='del'>-        priv = this-&gt;private;</div><div class='del'>-        pump_priv = priv-&gt;pump_private;</div><div class='del'>-</div><div class='del'>-        state = pump_get_state ();</div><div class='del'>-</div><div class='del'>-        if (state == PUMP_STATE_RESUME) {</div><div class='del'>-                resume_path = pump_get_resume_path (this);</div><div class='del'>-                if (strcmp (resume_path, "/") == 0) {</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-                                "Reached the resume path (/). Proceeding to change state"</div><div class='del'>-                                " to running");</div><div class='del'>-                        pump_change_state (this, PUMP_STATE_RUNNING);</div><div class='del'>-                } else if (strcmp (resume_path, path) == 0) {</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-                                "Reached the resume path. Proceeding to change state"</div><div class='del'>-                                " to running");</div><div class='del'>-                        pump_change_state (this, PUMP_STATE_RUNNING);</div><div class='del'>-                } else {</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-                                "Not yet hit the resume path:res-path=%s,path=%s",</div><div class='del'>-                                resume_path, path);</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-static gf_boolean_t</div><div class='del'>-is_pump_traversal_allowed (xlator_t *this, const char *path)</div><div class='del'>-{</div><div class='del'>-        afr_private_t *priv = NULL;</div><div class='del'>-        pump_private_t *pump_priv = NULL;</div><div class='del'>-</div><div class='del'>-        pump_state_t state;</div><div class='del'>-        const char *resume_path = NULL;</div><div class='del'>-        gf_boolean_t ret = _gf_true;</div><div class='del'>-</div><div class='del'>-        priv = this-&gt;private;</div><div class='del'>-        pump_priv = priv-&gt;pump_private;</div><div class='del'>-</div><div class='del'>-        state = pump_get_state ();</div><div class='del'>-</div><div class='del'>-        if (state == PUMP_STATE_RESUME) {</div><div class='del'>-                resume_path = pump_get_resume_path (this);</div><div class='del'>-                if (strstr (resume_path, path)) {</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-                                "On the right path to resumption path");</div><div class='del'>-                        ret = _gf_true;</div><div class='del'>-                } else {</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-                                "Not the right path to resuming=&gt; ignoring traverse");</div><div class='del'>-                        ret = _gf_false;</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-static int</div><div class='del'>-pump_save_file_stats (xlator_t *this, const char *path)</div><div class='del'>-{</div><div class='del'>-        afr_private_t  *priv        = NULL;</div><div class='del'>-        pump_private_t *pump_priv   = NULL;</div><div class='del'>-</div><div class='del'>-        priv      = this-&gt;private;</div><div class='del'>-        pump_priv = priv-&gt;pump_private;</div><div class='del'>-</div><div class='del'>-        LOCK (&amp;pump_priv-&gt;resume_path_lock);</div><div class='del'>-        {</div><div class='del'>-                pump_priv-&gt;number_files_pumped++;</div><div class='del'>-</div><div class='del'>-                strncpy (pump_priv-&gt;current_file, path,</div><div class='del'>-                         PATH_MAX);</div><div class='del'>-        }</div><div class='del'>-        UNLOCK (&amp;pump_priv-&gt;resume_path_lock);</div><div class='del'>-</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-static int</div><div class='del'>-gf_pump_traverse_directory (loc_t *loc)</div><div class='del'>-{</div><div class='del'>-        xlator_t *this = NULL;</div><div class='del'>-        afr_private_t *priv = NULL;</div><div class='del'>-        fd_t     *fd   = NULL;</div><div class='del'>-</div><div class='del'>-        off_t       offset   = 0;</div><div class='del'>-        loc_t       entry_loc;</div><div class='del'>-        gf_dirent_t *entry = NULL;</div><div class='del'>-        gf_dirent_t *tmp = NULL;</div><div class='del'>-        gf_dirent_t entries;</div><div class='del'>-</div><div class='del'>-	struct iatt iatt, parent;</div><div class='del'>-	dict_t *xattr_rsp;</div><div class='del'>-</div><div class='del'>-        int source = 0;</div><div class='del'>-</div><div class='del'>-        char *file_path = NULL;</div><div class='del'>-        int ret = 0;</div><div class='del'>-</div><div class='del'>-        INIT_LIST_HEAD (&amp;entries.list);</div><div class='del'>-        this = THIS;</div><div class='del'>-        priv = this-&gt;private;</div><div class='del'>-</div><div class='del'>-        assert (loc-&gt;inode);</div><div class='del'>-</div><div class='del'>-	fd = fd_create (loc-&gt;inode, PUMP_PID);</div><div class='del'>-        if (!fd) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-                        "Failed to create fd for %s", loc-&gt;path);</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        ret = syncop_opendir (priv-&gt;children[source], loc, fd);</div><div class='del'>-        if (ret &lt; 0) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-                        "opendir failed on %s", loc-&gt;path);</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        gf_log (this-&gt;name, GF_LOG_TRACE,</div><div class='del'>-                "pump opendir on %s returned=%d",</div><div class='del'>-                loc-&gt;path, ret);</div><div class='del'>-</div><div class='del'>-        while (syncop_readdirp (priv-&gt;children[source], fd, 131072, offset, &amp;entries)) {</div><div class='del'>-</div><div class='del'>-                if (list_empty (&amp;entries.list)) {</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_TRACE,</div><div class='del'>-                                "no more entries in directory");</div><div class='del'>-                        goto out;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                list_for_each_entry_safe (entry, tmp, &amp;entries.list, list) {</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-                                "found readdir entry=%s", entry-&gt;d_name);</div><div class='del'>-</div><div class='del'>-                        file_path = build_file_path (loc, entry);</div><div class='del'>-                        if (!file_path) {</div><div class='del'>-                                gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-                                        "file path construction failed");</div><div class='del'>-                                goto out;</div><div class='del'>-                        }</div><div class='del'>-</div><div class='del'>-                        build_child_loc (loc, &amp;entry_loc, file_path, entry-&gt;d_name);</div><div class='del'>-</div><div class='del'>-                        ret = syncop_lookup (this, &amp;entry_loc, NULL,</div><div class='del'>-                                             &amp;iatt, &amp;xattr_rsp, &amp;parent);</div><div class='del'>-</div><div class='del'>-                        entry_loc.ino = iatt.ia_ino;</div><div class='del'>-                        entry_loc.inode-&gt;ino = iatt.ia_ino;</div><div class='del'>-                        memcpy (entry_loc.inode-&gt;gfid, iatt.ia_gfid, 16);</div><div class='del'>-</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-                                "lookup %s =&gt; %"PRId64,</div><div class='del'>-                                entry_loc.path,</div><div class='del'>-                                iatt.ia_ino);</div><div class='del'>-</div><div class='del'>-                        ret = syncop_lookup (this, &amp;entry_loc, NULL,</div><div class='del'>-                                             &amp;iatt, &amp;xattr_rsp, &amp;parent);</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-                                "second lookup ret=%d: %s =&gt; %"PRId64,</div><div class='del'>-                                ret,</div><div class='del'>-                                entry_loc.path,</div><div class='del'>-                                iatt.ia_ino);</div><div class='del'>-</div><div class='del'>-                        pump_update_resume_state (this, entry_loc.path);</div><div class='del'>-</div><div class='del'>-                        if (!IS_ENTRY_CWD(entry-&gt;d_name) &amp;&amp;</div><div class='del'>-                            !IS_ENTRY_PARENT (entry-&gt;d_name)) {</div><div class='del'>-                                pump_save_path (this, entry_loc.path);</div><div class='del'>-                                pump_save_file_stats (this, entry_loc.path);</div><div class='del'>-                        }</div><div class='del'>-</div><div class='del'>-                        ret = pump_check_and_update_status (this);</div><div class='del'>-                        if (ret &lt; 0) {</div><div class='del'>-                                gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-                                        "Pump beginning to exit out");</div><div class='del'>-                                goto out;</div><div class='del'>-                        }</div><div class='del'>-</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_TRACE,</div><div class='del'>-                                "type of file=%d, IFDIR=%d",</div><div class='del'>-                                iatt.ia_type, IA_IFDIR);</div><div class='del'>-</div><div class='del'>-                        if (IA_ISDIR (iatt.ia_type) &amp;&amp; !IS_ENTRY_CWD(entry-&gt;d_name) &amp;&amp;</div><div class='del'>-                            !IS_ENTRY_PARENT (entry-&gt;d_name)) {</div><div class='del'>-                                if (is_pump_traversal_allowed (this, entry_loc.path)) {</div><div class='del'>-                                        gf_log (this-&gt;name, GF_LOG_TRACE,</div><div class='del'>-                                                "entering dir=%s",</div><div class='del'>-                                                entry-&gt;d_name);</div><div class='del'>-                                        gf_pump_traverse_directory (&amp;entry_loc);</div><div class='del'>-                                }</div><div class='del'>-                        }</div><div class='del'>-</div><div class='del'>-                        offset = entry-&gt;d_off;</div><div class='del'>-                        loc_wipe (&amp;entry_loc);</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                gf_dirent_free (&amp;entries);</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_TRACE,</div><div class='del'>-                        "offset incremented to %d",</div><div class='del'>-                        (int32_t ) offset);</div><div class='del'>-</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        return 0;</div><div class='del'>-</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-void</div><div class='del'>-build_root_loc (inode_t *inode, loc_t *loc)</div><div class='del'>-{</div><div class='del'>-        loc-&gt;path = "/";</div><div class='del'>-        loc-&gt;name = "";</div><div class='del'>-        loc-&gt;inode = inode;</div><div class='del'>-        loc-&gt;ino = 1;</div><div class='del'>-        loc-&gt;inode-&gt;ino = 1;</div><div class='del'>-        memset (loc-&gt;inode-&gt;gfid, 0, 16);</div><div class='del'>-        loc-&gt;inode-&gt;gfid[15] = 1;</div><div class='del'>-</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-static int</div><div class='del'>-pump_update_resume_path (xlator_t *this)</div><div class='del'>-{</div><div class='del'>-        afr_private_t *priv = NULL;</div><div class='del'>-        pump_private_t *pump_priv = NULL;</div><div class='del'>-</div><div class='del'>-        const char *resume_path = NULL;</div><div class='del'>-</div><div class='del'>-        priv = this-&gt;private;</div><div class='del'>-        pump_priv = priv-&gt;pump_private;</div><div class='del'>-</div><div class='del'>-        resume_path = pump_get_resume_path (this);</div><div class='del'>-</div><div class='del'>-        if (resume_path) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-                        "Found a path to resume from: %s",</div><div class='del'>-                        resume_path);</div><div class='del'>-</div><div class='del'>-        }else {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-                        "Did not find a path=&gt; setting to '/'");</div><div class='del'>-                pump_set_resume_path (this, "/");</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        pump_change_state (this, PUMP_STATE_RESUME);</div><div class='del'>-</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-static int</div><div class='del'>-pump_complete_migration (xlator_t *this)</div><div class='del'>-{</div><div class='del'>-        afr_private_t *priv = NULL;</div><div class='del'>-        pump_private_t *pump_priv = NULL;</div><div class='del'>-        dict_t *dict = NULL;</div><div class='del'>-        pump_state_t state;</div><div class='del'>-        loc_t  loc;</div><div class='del'>-        int dict_ret = 0;</div><div class='del'>-        int ret = -1;</div><div class='del'>-</div><div class='del'>-        priv = this-&gt;private;</div><div class='del'>-        pump_priv = priv-&gt;pump_private;</div><div class='del'>-</div><div class='del'>-        assert (priv-&gt;root_inode);</div><div class='del'>-</div><div class='del'>-        build_root_loc (priv-&gt;root_inode, &amp;loc);</div><div class='del'>-</div><div class='del'>-        dict = dict_new ();</div><div class='del'>-</div><div class='del'>-        state = pump_get_state ();</div><div class='del'>-        if (state == PUMP_STATE_RUNNING) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-                        "Pump finished pumping");</div><div class='del'>-</div><div class='del'>-                pump_priv-&gt;pump_finished = _gf_true;</div><div class='del'>-</div><div class='del'>-                dict_ret = dict_set_str (dict, PUMP_SOURCE_COMPLETE, "jargon");</div><div class='del'>-</div><div class='del'>-                ret = syncop_setxattr (PUMP_SOURCE_CHILD (this), &amp;loc, dict, 0);</div><div class='del'>-                if (ret &lt; 0) {</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-                                "setxattr failed - while  notifying source complete");</div><div class='del'>-                }</div><div class='del'>-                dict_ret = dict_set_str (dict, PUMP_SINK_COMPLETE, "jargon");</div><div class='del'>-</div><div class='del'>-                ret = syncop_setxattr (PUMP_SINK_CHILD (this), &amp;loc, dict, 0);</div><div class='del'>-                if (ret &lt; 0) {</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-                                "setxattr failed - while notifying sink complete");</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-static int</div><div class='del'>-pump_task (void *data)</div><div class='del'>-{</div><div class='del'>-	xlator_t *this = NULL;</div><div class='del'>-        afr_private_t *priv = NULL;</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-        loc_t loc;</div><div class='del'>-	struct iatt iatt, parent;</div><div class='del'>-	dict_t *xattr_rsp;</div><div class='del'>-</div><div class='del'>-        int ret = -1;</div><div class='del'>-</div><div class='del'>-        this = THIS;</div><div class='del'>-        priv = this-&gt;private;</div><div class='del'>-</div><div class='del'>-        assert (priv-&gt;root_inode);</div><div class='del'>-</div><div class='del'>-        build_root_loc (priv-&gt;root_inode, &amp;loc);</div><div class='del'>-</div><div class='del'>-        ret = syncop_lookup (this, &amp;loc, NULL,</div><div class='del'>-                             &amp;iatt, &amp;xattr_rsp, &amp;parent);</div><div class='del'>-</div><div class='del'>-        gf_log (this-&gt;name, GF_LOG_TRACE,</div><div class='del'>-                "lookup: ino=%"PRId64", path=%s",</div><div class='del'>-                loc.ino,</div><div class='del'>-                loc.path);</div><div class='del'>-</div><div class='del'>-        ret = pump_check_and_update_status (this);</div><div class='del'>-        if (ret &lt; 0) {</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        pump_update_resume_path (this);</div><div class='del'>-</div><div class='del'>-        gf_pump_traverse_directory (&amp;loc);</div><div class='del'>-</div><div class='del'>-        pump_complete_migration (this);</div><div class='del'>-out:</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-static int</div><div class='del'>-pump_task_completion (int ret, void *data)</div><div class='del'>-{</div><div class='del'>-        xlator_t *this = NULL;</div><div class='del'>-        call_frame_t *frame = NULL;</div><div class='del'>-        afr_private_t *priv = NULL;</div><div class='del'>-        pump_private_t *pump_priv = NULL;</div><div class='del'>-</div><div class='del'>-        this = THIS;</div><div class='del'>-</div><div class='del'>-        frame = (call_frame_t *) data;</div><div class='del'>-</div><div class='del'>-        priv = this-&gt;private;</div><div class='del'>-        pump_priv = priv-&gt;pump_private;</div><div class='del'>-</div><div class='del'>-        inode_unref (priv-&gt;root_inode);</div><div class='del'>-</div><div class='del'>-        gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-                "Pump xlator exiting");</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-pump_start (call_frame_t *pump_frame, xlator_t *this)</div><div class='del'>-{</div><div class='del'>-	afr_private_t *priv = NULL;</div><div class='del'>-	pump_private_t *pump_priv = NULL;</div><div class='del'>-</div><div class='del'>-	int ret = -1;</div><div class='del'>-</div><div class='del'>-	priv = this-&gt;private;</div><div class='del'>-        pump_priv = priv-&gt;pump_private;</div><div class='del'>-</div><div class='del'>-        if (!pump_frame-&gt;root-&gt;lk_owner)</div><div class='del'>-                pump_frame-&gt;root-&gt;lk_owner = PUMP_LK_OWNER;</div><div class='del'>-</div><div class='del'>-	ret = synctask_new (pump_priv-&gt;env, pump_task, pump_task_completion,</div><div class='del'>-                            pump_frame);</div><div class='del'>-</div><div class='del'>-        if (ret != -1) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_TRACE,</div><div class='del'>-                        "setting pump as started");</div><div class='del'>-        } else {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-                        "starting pump failed");</div><div class='del'>-                pump_change_state (this, PUMP_STATE_ABORT);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-	return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-static int</div><div class='del'>-pump_start_synctask (xlator_t *this)</div><div class='del'>-{</div><div class='del'>-        call_frame_t *frame = NULL;</div><div class='del'>-        int ret = 0;</div><div class='del'>-</div><div class='del'>-        frame = create_frame (this, this-&gt;ctx-&gt;pool);</div><div class='del'>-        if (!frame) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-                        "Out of memory");</div><div class='del'>-                ret = -1;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        pump_change_state (this, PUMP_STATE_RUNNING);</div><div class='del'>-</div><div class='del'>-        ret = pump_start (frame, this);</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-pump_cmd_start_setxattr_cbk (call_frame_t *frame,</div><div class='del'>-                             void *cookie,</div><div class='del'>-                             xlator_t *this,</div><div class='del'>-                             int32_t op_ret,</div><div class='del'>-                             int32_t op_errno)</div><div class='del'>-</div><div class='del'>-{</div><div class='del'>-        afr_local_t *local = NULL;</div><div class='del'>-        int ret = 0;</div><div class='del'>-</div><div class='del'>-        local = frame-&gt;local;</div><div class='del'>-</div><div class='del'>-        if (op_ret &lt; 0) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-                        "Could not initiate destination "</div><div class='del'>-                        "brick connect");</div><div class='del'>-                ret = op_ret;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-                "Successfully initiated destination "</div><div class='del'>-                "brick connect");</div><div class='del'>-</div><div class='del'>-        pump_mark_start_pending (this);</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        local-&gt;op_ret = ret;</div><div class='del'>-        pump_command_reply (frame, this);</div><div class='del'>-</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-static int</div><div class='del'>-pump_initiate_sink_connect (call_frame_t *frame, xlator_t *this)</div><div class='del'>-{</div><div class='del'>-        afr_local_t   *local     = NULL;</div><div class='del'>-        afr_private_t *priv      = NULL;</div><div class='del'>-        dict_t        *dict      = NULL;</div><div class='del'>-        char          *dst_brick = NULL;</div><div class='del'>-        loc_t loc;</div><div class='del'>-</div><div class='del'>-        int ret = 0;</div><div class='del'>-</div><div class='del'>-        priv  = this-&gt;private;</div><div class='del'>-        local = frame-&gt;local;</div><div class='del'>-</div><div class='del'>-        GF_ASSERT (priv-&gt;root_inode);</div><div class='del'>-</div><div class='del'>-        build_root_loc (priv-&gt;root_inode, &amp;loc);</div><div class='del'>-</div><div class='del'>-        ret = dict_get_str (local-&gt;dict, PUMP_CMD_START, &amp;dst_brick);</div><div class='del'>-        if (ret &lt; 0) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-                        "Could not get destination brick value");</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        dict = dict_new ();</div><div class='del'>-        if (!dict) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-                        "Out of memory");</div><div class='del'>-                ret = -1;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        GF_ASSERT (dst_brick);</div><div class='del'>-        gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-                "Got destination brick as %s", dst_brick);</div><div class='del'>-</div><div class='del'>-        ret = dict_set_str (dict, CLIENT_CMD_CONNECT, dst_brick);</div><div class='del'>-        if (ret &lt; 0) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-                        "Could not inititiate destination brick "</div><div class='del'>-                        "connect");</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-	STACK_WIND (frame,</div><div class='del'>-		    pump_cmd_start_setxattr_cbk,</div><div class='del'>-		    PUMP_SINK_CHILD(this),</div><div class='del'>-		    PUMP_SINK_CHILD(this)-&gt;fops-&gt;setxattr,</div><div class='del'>-		    &amp;loc,</div><div class='del'>-		    dict,</div><div class='del'>-		    0);</div><div class='del'>-</div><div class='del'>-        ret = 0;</div><div class='del'>-</div><div class='del'>-        dict_unref (dict);</div><div class='del'>-out:</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-static int</div><div class='del'>-is_pump_aborted (xlator_t *this)</div><div class='del'>-{</div><div class='del'>-        pump_state_t state;</div><div class='del'>-</div><div class='del'>-        state = pump_get_state ();</div><div class='del'>-</div><div class='del'>-        return ((state == PUMP_STATE_ABORT));</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-pump_cmd_start_getxattr_cbk (call_frame_t *frame,</div><div class='del'>-                             void *cookie,</div><div class='del'>-                             xlator_t *this,</div><div class='del'>-                             int32_t op_ret,</div><div class='del'>-                             int32_t op_errno,</div><div class='del'>-                             dict_t *dict)</div><div class='del'>-{</div><div class='del'>-        afr_local_t *local = NULL;</div><div class='del'>-        char *path = NULL;</div><div class='del'>-</div><div class='del'>-        pump_state_t state;</div><div class='del'>-        int ret = 0;</div><div class='del'>-        int need_unwind = 0;</div><div class='del'>-        int dict_ret = -1;</div><div class='del'>-</div><div class='del'>-        local = frame-&gt;local;</div><div class='del'>-</div><div class='del'>-        if (op_ret &lt; 0) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-                        "getxattr failed - changing pump "</div><div class='del'>-                        "state to RUNNING with '/'");</div><div class='del'>-                path = "/";</div><div class='del'>-                ret = op_ret;</div><div class='del'>-        } else {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_TRACE,</div><div class='del'>-                        "getxattr succeeded");</div><div class='del'>-</div><div class='del'>-                dict_ret =  dict_get_str (dict, PUMP_PATH, &amp;path);</div><div class='del'>-                if (dict_ret &lt; 0)</div><div class='del'>-                        path = "/";</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        state = pump_get_state ();</div><div class='del'>-        if ((state == PUMP_STATE_RUNNING) ||</div><div class='del'>-            (state == PUMP_STATE_RESUME)) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-                        "Pump is already started");</div><div class='del'>-                ret = -1;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        pump_set_resume_path (this, path);</div><div class='del'>-</div><div class='del'>-        if (is_pump_aborted (this))</div><div class='del'>-                /* We're re-starting pump afresh */</div><div class='del'>-                ret = pump_initiate_sink_connect (frame, this);</div><div class='del'>-        else {</div><div class='del'>-                /* We're re-starting pump from a previous</div><div class='del'>-                   pause */</div><div class='del'>-                ret = pump_start_synctask (this);</div><div class='del'>-                need_unwind = 1;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        if ((ret &lt; 0) || (need_unwind == 1)) {</div><div class='del'>-                local-&gt;op_ret = ret;</div><div class='del'>-                pump_command_reply (frame, this);</div><div class='del'>-        }</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-pump_execute_status (call_frame_t *frame, xlator_t *this)</div><div class='del'>-{</div><div class='del'>-        afr_private_t *priv = NULL;</div><div class='del'>-        pump_private_t *pump_priv = NULL;</div><div class='del'>-</div><div class='del'>-        uint64_t number_files = 0;</div><div class='del'>-</div><div class='del'>-        char filename[PATH_MAX];</div><div class='del'>-        char *dict_str = NULL;</div><div class='del'>-</div><div class='del'>-        int32_t op_ret = 0;</div><div class='del'>-        int32_t op_errno = 0;</div><div class='del'>-</div><div class='del'>-        dict_t *dict = NULL;</div><div class='del'>-        int ret = -1;</div><div class='del'>-</div><div class='del'>-        priv = this-&gt;private;</div><div class='del'>-        pump_priv = priv-&gt;pump_private;</div><div class='del'>-</div><div class='del'>-        LOCK (&amp;pump_priv-&gt;resume_path_lock);</div><div class='del'>-        {</div><div class='del'>-                number_files  = pump_priv-&gt;number_files_pumped;</div><div class='del'>-                strncpy (filename, pump_priv-&gt;current_file, PATH_MAX);</div><div class='del'>-        }</div><div class='del'>-        UNLOCK (&amp;pump_priv-&gt;resume_path_lock);</div><div class='del'>-</div><div class='del'>-        dict_str     = GF_CALLOC (1, PATH_MAX + 256, gf_afr_mt_char);</div><div class='del'>-        if (!dict_str) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-                        "Out of memory");</div><div class='del'>-                op_ret = -1;</div><div class='del'>-                op_errno = ENOMEM;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (pump_priv-&gt;pump_finished) {</div><div class='del'>-        snprintf (dict_str, PATH_MAX + 256, "Number of files migrated = %"PRIu64"        Migration complete ",</div><div class='del'>-                  number_files);</div><div class='del'>-        } else {</div><div class='del'>-        snprintf (dict_str, PATH_MAX + 256, "Number of files migrated = %"PRIu64"       Current file= %s ",</div><div class='del'>-                  number_files, filename);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        dict = dict_new ();</div><div class='del'>-</div><div class='del'>-        ret = dict_set_str (dict, PUMP_CMD_STATUS, dict_str);</div><div class='del'>-        if (ret &lt; 0) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-                        "dict_set_str returned negative value");</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        op_ret = 0;</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-</div><div class='del'>-        AFR_STACK_UNWIND (getxattr, frame, op_ret, op_errno, dict);</div><div class='del'>-</div><div class='del'>-        dict_unref (dict);</div><div class='del'>-        GF_FREE (dict_str);</div><div class='del'>-</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-pump_execute_pause (call_frame_t *frame, xlator_t *this)</div><div class='del'>-{</div><div class='del'>-        afr_local_t *local = NULL;</div><div class='del'>-</div><div class='del'>-        local = frame-&gt;local;</div><div class='del'>-</div><div class='del'>-        pump_change_state (this, PUMP_STATE_PAUSE);</div><div class='del'>-</div><div class='del'>-        local-&gt;op_ret = 0;</div><div class='del'>-        pump_command_reply (frame, this);</div><div class='del'>-</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-pump_execute_start (call_frame_t *frame, xlator_t *this)</div><div class='del'>-{</div><div class='del'>-        afr_private_t *priv = NULL;</div><div class='del'>-        afr_local_t   *local = NULL;</div><div class='del'>-</div><div class='del'>-        int ret = 0;</div><div class='del'>-        loc_t loc;</div><div class='del'>-</div><div class='del'>-        priv = this-&gt;private;</div><div class='del'>-        local = frame-&gt;local;</div><div class='del'>-</div><div class='del'>-        if (!priv-&gt;root_inode) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-                        "Pump xlator cannot be started without an initial "</div><div class='del'>-                        "lookup");</div><div class='del'>-                ret = -1;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        GF_ASSERT (priv-&gt;root_inode);</div><div class='del'>-</div><div class='del'>-        build_root_loc (priv-&gt;root_inode, &amp;loc);</div><div class='del'>-</div><div class='del'>-	STACK_WIND (frame,</div><div class='del'>-		    pump_cmd_start_getxattr_cbk,</div><div class='del'>-		    PUMP_SOURCE_CHILD(this),</div><div class='del'>-		    PUMP_SOURCE_CHILD(this)-&gt;fops-&gt;getxattr,</div><div class='del'>-		    &amp;loc,</div><div class='del'>-		    PUMP_PATH);</div><div class='del'>-</div><div class='del'>-        ret = 0;</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        if (ret &lt; 0) {</div><div class='del'>-                local-&gt;op_ret = ret;</div><div class='del'>-                pump_command_reply (frame, this);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-pump_execute_abort (call_frame_t *frame, xlator_t *this)</div><div class='del'>-{</div><div class='del'>-        afr_private_t *priv = NULL;</div><div class='del'>-        afr_local_t   *local = NULL;</div><div class='del'>-</div><div class='del'>-        priv = this-&gt;private;</div><div class='del'>-        local = frame-&gt;local;</div><div class='del'>-</div><div class='del'>-        pump_change_state (this, PUMP_STATE_ABORT);</div><div class='del'>-</div><div class='del'>-        local-&gt;op_ret = 0;</div><div class='del'>-        pump_command_reply (frame, this);</div><div class='del'>-</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-gf_boolean_t</div><div class='del'>-pump_command_status (xlator_t *this, dict_t *dict)</div><div class='del'>-{</div><div class='del'>-        char *cmd = NULL;</div><div class='del'>-        int dict_ret = -1;</div><div class='del'>-        int ret = _gf_true;</div><div class='del'>-</div><div class='del'>-        dict_ret = dict_get_str (dict, PUMP_CMD_STATUS, &amp;cmd);</div><div class='del'>-        if (dict_ret &lt; 0) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-                        "Not a pump status command");</div><div class='del'>-                ret = _gf_false;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-                "Hit a pump command - status");</div><div class='del'>-        ret = _gf_true;</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        return ret;</div><div class='del'>-</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-gf_boolean_t</div><div class='del'>-pump_command_pause (xlator_t *this, dict_t *dict)</div><div class='del'>-{</div><div class='del'>-        char *cmd = NULL;</div><div class='del'>-        int dict_ret = -1;</div><div class='del'>-        int ret = _gf_true;</div><div class='del'>-</div><div class='del'>-        dict_ret = dict_get_str (dict, PUMP_CMD_PAUSE, &amp;cmd);</div><div class='del'>-        if (dict_ret &lt; 0) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-                        "Not a pump pause command");</div><div class='del'>-                ret = _gf_false;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-                "Hit a pump command - pause");</div><div class='del'>-        ret = _gf_true;</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        return ret;</div><div class='del'>-</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-gf_boolean_t</div><div class='del'>-pump_command_abort (xlator_t *this, dict_t *dict)</div><div class='del'>-{</div><div class='del'>-        char *cmd = NULL;</div><div class='del'>-        int dict_ret = -1;</div><div class='del'>-        int ret = _gf_true;</div><div class='del'>-</div><div class='del'>-        dict_ret = dict_get_str (dict, PUMP_CMD_ABORT, &amp;cmd);</div><div class='del'>-        if (dict_ret &lt; 0) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-                        "Not a pump abort command");</div><div class='del'>-                ret = _gf_false;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-                "Hit a pump command - abort");</div><div class='del'>-        ret = _gf_true;</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        return ret;</div><div class='del'>-</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-gf_boolean_t</div><div class='del'>-pump_command_start (xlator_t *this, dict_t *dict)</div><div class='del'>-{</div><div class='del'>-        char *cmd = NULL;</div><div class='del'>-        int dict_ret = -1;</div><div class='del'>-        int ret = _gf_true;</div><div class='del'>-</div><div class='del'>-        dict_ret = dict_get_str (dict, PUMP_CMD_START, &amp;cmd);</div><div class='del'>-        if (dict_ret &lt; 0) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-                        "Not a pump start command");</div><div class='del'>-                ret = _gf_false;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-                "Hit a pump command - start");</div><div class='del'>-        ret = _gf_true;</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        return ret;</div><div class='del'>-</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-struct _xattr_key {</div><div class='del'>-        char *key;</div><div class='del'>-        struct list_head list;</div><div class='del'>-};</div><div class='del'>-</div><div class='del'>-static void</div><div class='del'>-__gather_xattr_keys (dict_t *dict, char *key, data_t *value,</div><div class='del'>-                     void *data)</div><div class='del'>-{</div><div class='del'>-        struct list_head *  list  = data;</div><div class='del'>-        struct _xattr_key * xkey  = NULL;</div><div class='del'>-</div><div class='del'>-        if (!strncmp (key, AFR_XATTR_PREFIX,</div><div class='del'>-                      strlen (AFR_XATTR_PREFIX))) {</div><div class='del'>-</div><div class='del'>-                xkey = GF_CALLOC (1, sizeof (*xkey), gf_afr_mt_xattr_key);</div><div class='del'>-                if (!xkey)</div><div class='del'>-                        return;</div><div class='del'>-</div><div class='del'>-                xkey-&gt;key = key;</div><div class='del'>-                INIT_LIST_HEAD (&amp;xkey-&gt;list);</div><div class='del'>-</div><div class='del'>-                list_add_tail (&amp;xkey-&gt;list, list);</div><div class='del'>-        }</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-static void</div><div class='del'>-__filter_xattrs (dict_t *dict)</div><div class='del'>-{</div><div class='del'>-        struct list_head keys;</div><div class='del'>-</div><div class='del'>-        struct _xattr_key *key;</div><div class='del'>-        struct _xattr_key *tmp;</div><div class='del'>-</div><div class='del'>-        INIT_LIST_HEAD (&amp;keys);</div><div class='del'>-</div><div class='del'>-        dict_foreach (dict, __gather_xattr_keys,</div><div class='del'>-                      (void *) &amp;keys);</div><div class='del'>-</div><div class='del'>-        list_for_each_entry_safe (key, tmp, &amp;keys, list) {</div><div class='del'>-                dict_del (dict, key-&gt;key);</div><div class='del'>-</div><div class='del'>-                list_del_init (&amp;key-&gt;list);</div><div class='del'>-</div><div class='del'>-                GF_FREE (key);</div><div class='del'>-        }</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-pump_getxattr_cbk (call_frame_t *frame, void *cookie,</div><div class='del'>-		  xlator_t *this, int32_t op_ret, int32_t op_errno,</div><div class='del'>-		  dict_t *dict)</div><div class='del'>-{</div><div class='del'>-	afr_private_t * priv     = NULL;</div><div class='del'>-	afr_local_t *   local    = NULL;</div><div class='del'>-	xlator_t **     children = NULL;</div><div class='del'>-</div><div class='del'>-	int unwind     = 1;</div><div class='del'>-	int last_tried = -1;</div><div class='del'>-	int this_try = -1;</div><div class='del'>-        int read_child = -1;</div><div class='del'>-</div><div class='del'>-	priv     = this-&gt;private;</div><div class='del'>-	children = priv-&gt;children;</div><div class='del'>-</div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-</div><div class='del'>-        read_child = (long) cookie;</div><div class='del'>-</div><div class='del'>-	if (op_ret == -1) {</div><div class='del'>-        retry:</div><div class='del'>-		last_tried = local-&gt;cont.getxattr.last_tried;</div><div class='del'>-</div><div class='del'>-		if (all_tried (last_tried, priv-&gt;child_count)) {</div><div class='del'>-			goto out;</div><div class='del'>-		}</div><div class='del'>-		this_try = ++local-&gt;cont.getxattr.last_tried;</div><div class='del'>-</div><div class='del'>-                if (this_try == read_child) {</div><div class='del'>-                        goto retry;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-		unwind = 0;</div><div class='del'>-		STACK_WIND_COOKIE (frame, pump_getxattr_cbk,</div><div class='del'>-				   (void *) (long) read_child,</div><div class='del'>-				   children[this_try],</div><div class='del'>-				   children[this_try]-&gt;fops-&gt;getxattr,</div><div class='del'>-				   &amp;local-&gt;loc,</div><div class='del'>-				   local-&gt;cont.getxattr.name);</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-	if (unwind) {</div><div class='del'>-                if (op_ret &gt;= 0 &amp;&amp; dict)</div><div class='del'>-                        __filter_xattrs (dict);</div><div class='del'>-</div><div class='del'>-		AFR_STACK_UNWIND (getxattr, frame, op_ret, op_errno, dict);</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-pump_getxattr (call_frame_t *frame, xlator_t *this,</div><div class='del'>-	      loc_t *loc, const char *name)</div><div class='del'>-{</div><div class='del'>-	afr_private_t *   priv       = NULL;</div><div class='del'>-	xlator_t **       children   = NULL;</div><div class='del'>-	int               call_child = 0;</div><div class='del'>-	afr_local_t     * local      = NULL;</div><div class='del'>-</div><div class='del'>-        int               read_child = -1;</div><div class='del'>-</div><div class='del'>-	int32_t op_ret   = -1;</div><div class='del'>-	int32_t op_errno = 0;</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-	VALIDATE_OR_GOTO (frame, out);</div><div class='del'>-	VALIDATE_OR_GOTO (this, out);</div><div class='del'>-	VALIDATE_OR_GOTO (this-&gt;private, out);</div><div class='del'>-</div><div class='del'>-	priv     = this-&gt;private;</div><div class='del'>-	VALIDATE_OR_GOTO (priv-&gt;children, out);</div><div class='del'>-</div><div class='del'>-	children = priv-&gt;children;</div><div class='del'>-</div><div class='del'>-	ALLOC_OR_GOTO (local, afr_local_t, out);</div><div class='del'>-	frame-&gt;local = local;</div><div class='del'>-</div><div class='del'>-        if (name) {</div><div class='del'>-                if (!strncmp (name, AFR_XATTR_PREFIX,</div><div class='del'>-                              strlen (AFR_XATTR_PREFIX))) {</div><div class='del'>-</div><div class='del'>-                        op_errno = ENODATA;</div><div class='del'>-                        goto out;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                if (!strcmp (name, PUMP_CMD_STATUS)) {</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-                                "Hit pump command - status");</div><div class='del'>-                        pump_execute_status (frame, this);</div><div class='del'>-                        op_ret = 0;</div><div class='del'>-                        goto out;</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        read_child = afr_read_child (this, loc-&gt;inode);</div><div class='del'>-</div><div class='del'>-        if (read_child &gt;= 0) {</div><div class='del'>-                call_child = read_child;</div><div class='del'>-</div><div class='del'>-                local-&gt;cont.getxattr.last_tried = -1;</div><div class='del'>-        } else {</div><div class='del'>-                call_child = afr_first_up_child (priv);</div><div class='del'>-</div><div class='del'>-                if (call_child == -1) {</div><div class='del'>-                        op_errno = ENOTCONN;</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-                                "no child is up");</div><div class='del'>-                        goto out;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                local-&gt;cont.getxattr.last_tried = call_child;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-	loc_copy (&amp;local-&gt;loc, loc);</div><div class='del'>-	if (name)</div><div class='del'>-	  local-&gt;cont.getxattr.name       = gf_strdup (name);</div><div class='del'>-</div><div class='del'>-	STACK_WIND_COOKIE (frame, pump_getxattr_cbk,</div><div class='del'>-			   (void *) (long) call_child,</div><div class='del'>-			   children[call_child], children[call_child]-&gt;fops-&gt;getxattr,</div><div class='del'>-			   loc, name);</div><div class='del'>-</div><div class='del'>-	op_ret = 0;</div><div class='del'>-out:</div><div class='del'>-	if (op_ret == -1) {</div><div class='del'>-		AFR_STACK_UNWIND (getxattr, frame, op_ret, op_errno, NULL);</div><div class='del'>-	}</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-static int</div><div class='del'>-afr_setxattr_unwind (call_frame_t *frame, xlator_t *this)</div><div class='del'>-{</div><div class='del'>-	afr_local_t *   local = NULL;</div><div class='del'>-	afr_private_t * priv  = NULL;</div><div class='del'>-	call_frame_t   *main_frame = NULL;</div><div class='del'>-</div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-	priv  = this-&gt;private;</div><div class='del'>-</div><div class='del'>-	LOCK (&amp;frame-&gt;lock);</div><div class='del'>-	{</div><div class='del'>-		if (local-&gt;transaction.main_frame)</div><div class='del'>-			main_frame = local-&gt;transaction.main_frame;</div><div class='del'>-		local-&gt;transaction.main_frame = NULL;</div><div class='del'>-	}</div><div class='del'>-	UNLOCK (&amp;frame-&gt;lock);</div><div class='del'>-</div><div class='del'>-	if (main_frame) {</div><div class='del'>-		AFR_STACK_UNWIND (setxattr, main_frame,</div><div class='del'>-                                  local-&gt;op_ret, local-&gt;op_errno)</div><div class='del'>-	}</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-static int</div><div class='del'>-afr_setxattr_wind_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-		       int32_t op_ret, int32_t op_errno)</div><div class='del'>-{</div><div class='del'>-	afr_local_t *   local = NULL;</div><div class='del'>-	afr_private_t * priv  = NULL;</div><div class='del'>-</div><div class='del'>-	int call_count  = -1;</div><div class='del'>-	int need_unwind = 0;</div><div class='del'>-</div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-	priv = this-&gt;private;</div><div class='del'>-</div><div class='del'>-	LOCK (&amp;frame-&gt;lock);</div><div class='del'>-	{</div><div class='del'>-		if (op_ret != -1) {</div><div class='del'>-			if (local-&gt;success_count == 0) {</div><div class='del'>-				local-&gt;op_ret = op_ret;</div><div class='del'>-			}</div><div class='del'>-			local-&gt;success_count++;</div><div class='del'>-</div><div class='del'>-			if (local-&gt;success_count == priv-&gt;child_count) {</div><div class='del'>-				need_unwind = 1;</div><div class='del'>-			}</div><div class='del'>-		}</div><div class='del'>-</div><div class='del'>-		local-&gt;op_errno = op_errno;</div><div class='del'>-	}</div><div class='del'>-	UNLOCK (&amp;frame-&gt;lock);</div><div class='del'>-</div><div class='del'>-	if (need_unwind)</div><div class='del'>-		local-&gt;transaction.unwind (frame, this);</div><div class='del'>-</div><div class='del'>-	call_count = afr_frame_return (frame);</div><div class='del'>-</div><div class='del'>-	if (call_count == 0) {</div><div class='del'>-		local-&gt;transaction.resume (frame, this);</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-static int</div><div class='del'>-afr_setxattr_wind (call_frame_t *frame, xlator_t *this)</div><div class='del'>-{</div><div class='del'>-	afr_local_t *local = NULL;</div><div class='del'>-	afr_private_t *priv = NULL;</div><div class='del'>-</div><div class='del'>-	int call_count = -1;</div><div class='del'>-	int i = 0;</div><div class='del'>-</div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-	priv = this-&gt;private;</div><div class='del'>-</div><div class='del'>-	call_count = afr_up_children_count (priv-&gt;child_count, local-&gt;child_up);</div><div class='del'>-</div><div class='del'>-	if (call_count == 0) {</div><div class='del'>-		local-&gt;transaction.resume (frame, this);</div><div class='del'>-		return 0;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	local-&gt;call_count = call_count;</div><div class='del'>-</div><div class='del'>-	for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='del'>-		if (local-&gt;child_up[i]) {</div><div class='del'>-			STACK_WIND_COOKIE (frame, afr_setxattr_wind_cbk,</div><div class='del'>-					   (void *) (long) i,</div><div class='del'>-					   priv-&gt;children[i],</div><div class='del'>-					   priv-&gt;children[i]-&gt;fops-&gt;setxattr,</div><div class='del'>-					   &amp;local-&gt;loc,</div><div class='del'>-					   local-&gt;cont.setxattr.dict,</div><div class='del'>-					   local-&gt;cont.setxattr.flags);</div><div class='del'>-</div><div class='del'>-			if (!--call_count)</div><div class='del'>-				break;</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-static int</div><div class='del'>-afr_setxattr_done (call_frame_t *frame, xlator_t *this)</div><div class='del'>-{</div><div class='del'>-	afr_local_t * local = frame-&gt;local;</div><div class='del'>-</div><div class='del'>-	local-&gt;transaction.unwind (frame, this);</div><div class='del'>-</div><div class='del'>-	AFR_STACK_DESTROY (frame);</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-pump_setxattr_cbk (call_frame_t *frame,</div><div class='del'>-		      void *cookie,</div><div class='del'>-		      xlator_t *this,</div><div class='del'>-		      int32_t op_ret,</div><div class='del'>-		      int32_t op_errno)</div><div class='del'>-{</div><div class='del'>-	STACK_UNWIND (frame,</div><div class='del'>-		      op_ret,</div><div class='del'>-		      op_errno);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-pump_command_reply (call_frame_t *frame, xlator_t *this)</div><div class='del'>-{</div><div class='del'>-        afr_local_t *local = NULL;</div><div class='del'>-</div><div class='del'>-        local = frame-&gt;local;</div><div class='del'>-</div><div class='del'>-        if (local-&gt;op_ret &lt; 0)</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_NORMAL,</div><div class='del'>-                        "Command failed");</div><div class='del'>-        else</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_NORMAL,</div><div class='del'>-                        "Command succeeded");</div><div class='del'>-</div><div class='del'>-        dict_unref (local-&gt;dict);</div><div class='del'>-</div><div class='del'>-        AFR_STACK_UNWIND (setxattr,</div><div class='del'>-                          frame,</div><div class='del'>-                          local-&gt;op_ret,</div><div class='del'>-                          local-&gt;op_errno);</div><div class='del'>-</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-pump_parse_command (call_frame_t *frame, xlator_t *this,</div><div class='del'>-                    afr_local_t *local, dict_t *dict)</div><div class='del'>-{</div><div class='del'>-</div><div class='del'>-        int ret = -1;</div><div class='del'>-</div><div class='del'>-        if (pump_command_start (this, dict)) {</div><div class='del'>-                frame-&gt;local = local;</div><div class='del'>-                local-&gt;dict = dict_ref (dict);</div><div class='del'>-                ret = pump_execute_start (frame, this);</div><div class='del'>-</div><div class='del'>-        } else if (pump_command_pause (this, dict)) {</div><div class='del'>-                frame-&gt;local = local;</div><div class='del'>-                local-&gt;dict = dict_ref (dict);</div><div class='del'>-                ret = pump_execute_pause (frame, this);</div><div class='del'>-</div><div class='del'>-        } else if (pump_command_abort (this, dict)) {</div><div class='del'>-                frame-&gt;local = local;</div><div class='del'>-                local-&gt;dict = dict_ref (dict);</div><div class='del'>-                ret = pump_execute_abort (frame, this);</div><div class='del'>-        }</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-pump_setxattr (call_frame_t *frame, xlator_t *this,</div><div class='del'>-               loc_t *loc, dict_t *dict, int32_t flags)</div><div class='del'>-{</div><div class='del'>-	afr_private_t * priv  = NULL;</div><div class='del'>-	afr_local_t   * local = NULL;</div><div class='del'>-	call_frame_t   *transaction_frame = NULL;</div><div class='del'>-</div><div class='del'>-	int ret = -1;</div><div class='del'>-</div><div class='del'>-	int op_ret   = -1;</div><div class='del'>-	int op_errno = 0;</div><div class='del'>-</div><div class='del'>-	VALIDATE_OR_GOTO (frame, out);</div><div class='del'>-	VALIDATE_OR_GOTO (this, out);</div><div class='del'>-	VALIDATE_OR_GOTO (this-&gt;private, out);</div><div class='del'>-</div><div class='del'>-	priv = this-&gt;private;</div><div class='del'>-</div><div class='del'>-	ALLOC_OR_GOTO (local, afr_local_t, out);</div><div class='del'>-</div><div class='del'>-	ret = AFR_LOCAL_INIT (local, priv);</div><div class='del'>-	if (ret &lt; 0) {</div><div class='del'>-		op_errno = -ret;</div><div class='del'>-		goto out;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-        ret = pump_parse_command (frame, this,</div><div class='del'>-                                  local, dict);</div><div class='del'>-        if (ret &gt;= 0) {</div><div class='del'>-                op_ret = 0;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-	transaction_frame = copy_frame (frame);</div><div class='del'>-	if (!transaction_frame) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-			"Out of memory.");</div><div class='del'>-		goto out;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	transaction_frame-&gt;local = local;</div><div class='del'>-</div><div class='del'>-	local-&gt;op_ret = -1;</div><div class='del'>-</div><div class='del'>-	local-&gt;cont.setxattr.dict  = dict_ref (dict);</div><div class='del'>-	local-&gt;cont.setxattr.flags = flags;</div><div class='del'>-</div><div class='del'>-	local-&gt;transaction.fop    = afr_setxattr_wind;</div><div class='del'>-	local-&gt;transaction.done   = afr_setxattr_done;</div><div class='del'>-	local-&gt;transaction.unwind = afr_setxattr_unwind;</div><div class='del'>-</div><div class='del'>-	loc_copy (&amp;local-&gt;loc, loc);</div><div class='del'>-</div><div class='del'>-	local-&gt;transaction.main_frame = frame;</div><div class='del'>-	local-&gt;transaction.start   = LLONG_MAX - 1;</div><div class='del'>-	local-&gt;transaction.len     = 0;</div><div class='del'>-</div><div class='del'>-	afr_transaction (transaction_frame, this, AFR_METADATA_TRANSACTION);</div><div class='del'>-</div><div class='del'>-	op_ret = 0;</div><div class='del'>-out:</div><div class='del'>-	if (op_ret == -1) {</div><div class='del'>-		if (transaction_frame)</div><div class='del'>-			AFR_STACK_DESTROY (transaction_frame);</div><div class='del'>-		AFR_STACK_UNWIND (setxattr, frame, op_ret, op_errno);</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-mem_acct_init (xlator_t *this)</div><div class='del'>-{</div><div class='del'>-        int     ret = -1;</div><div class='del'>-</div><div class='del'>-        if (!this)</div><div class='del'>-                return ret;</div><div class='del'>-</div><div class='del'>-        ret = xlator_mem_acct_init (this, gf_afr_mt_end + 1);</div><div class='del'>-</div><div class='del'>-        if (ret != 0) {</div><div class='del'>-                gf_log(this-&gt;name, GF_LOG_ERROR, "Memory accounting init"</div><div class='del'>-                                "failed");</div><div class='del'>-                return ret;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-static int</div><div class='del'>-is_xlator_pump_sink (xlator_t *child)</div><div class='del'>-{</div><div class='del'>-        return (child == PUMP_SINK_CHILD(THIS));</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-static int</div><div class='del'>-is_xlator_pump_source (xlator_t *child)</div><div class='del'>-{</div><div class='del'>-        return (child == PUMP_SOURCE_CHILD(THIS));</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-notify (xlator_t *this, int32_t event,</div><div class='del'>-	void *data, ...)</div><div class='del'>-{</div><div class='del'>-        int ret = -1;</div><div class='del'>-        xlator_t *child_xl = NULL;</div><div class='del'>-</div><div class='del'>-        child_xl = (xlator_t *) data;</div><div class='del'>-</div><div class='del'>-        ret = afr_notify (this, event, data);</div><div class='del'>-</div><div class='del'>-	switch (event) {</div><div class='del'>-	case GF_EVENT_CHILD_DOWN:</div><div class='del'>-                if (is_xlator_pump_source (child_xl))</div><div class='del'>-                        pump_change_state (this, PUMP_STATE_ABORT);</div><div class='del'>-                break;</div><div class='del'>-</div><div class='del'>-        case GF_EVENT_CHILD_UP:</div><div class='del'>-                if (is_xlator_pump_sink (child_xl))</div><div class='del'>-                        if (is_pump_start_pending (this)) {</div><div class='del'>-                                ret = pump_start_synctask (this);</div><div class='del'>-                                if (ret &lt; 0)</div><div class='del'>-                                        gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-                                                "Could not start pump "</div><div class='del'>-                                                "synctask");</div><div class='del'>-                                else</div><div class='del'>-                                        pump_remove_start_pending (this);</div><div class='del'>-                        }</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-init (xlator_t *this)</div><div class='del'>-{</div><div class='del'>-	afr_private_t * priv        = NULL;</div><div class='del'>-        pump_private_t *pump_priv = NULL;</div><div class='del'>-	int             child_count = 0;</div><div class='del'>-	xlator_list_t * trav        = NULL;</div><div class='del'>-	int             i           = 0;</div><div class='del'>-	int             ret         = -1;</div><div class='del'>-	int             op_errno    = 0;</div><div class='del'>-</div><div class='del'>-        int source_child = 0;</div><div class='del'>-</div><div class='del'>-	if (!this-&gt;children) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-			"pump translator needs a source and sink"</div><div class='del'>-                        "subvolumes defined.");</div><div class='del'>-		return -1;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	if (!this-&gt;parents) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_WARNING,</div><div class='del'>-			"Volume is dangling.");</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	ALLOC_OR_GOTO (this-&gt;private, afr_private_t, out);</div><div class='del'>-</div><div class='del'>-	priv = this-&gt;private;</div><div class='del'>-</div><div class='del'>-        priv-&gt;read_child = source_child;</div><div class='del'>-        priv-&gt;favorite_child = source_child;</div><div class='del'>-        priv-&gt;background_self_heal_count = 0;</div><div class='del'>-</div><div class='del'>-	priv-&gt;data_self_heal     = 1;</div><div class='del'>-	priv-&gt;metadata_self_heal = 1;</div><div class='del'>-	priv-&gt;entry_self_heal    = 1;</div><div class='del'>-</div><div class='del'>-        priv-&gt;data_self_heal_algorithm = "";</div><div class='del'>-</div><div class='del'>-        priv-&gt;data_self_heal_window_size = 16;</div><div class='del'>-</div><div class='del'>-	priv-&gt;data_change_log     = 1;</div><div class='del'>-	priv-&gt;metadata_change_log = 1;</div><div class='del'>-	priv-&gt;entry_change_log    = 1;</div><div class='del'>-</div><div class='del'>-	/* Locking options */</div><div class='del'>-</div><div class='del'>-        /* Lock server count infact does not matter. Locks are held</div><div class='del'>-           on all subvolumes, in this case being the source</div><div class='del'>-           and the sink.</div><div class='del'>-        */</div><div class='del'>-</div><div class='del'>-	priv-&gt;data_lock_server_count = 2;</div><div class='del'>-	priv-&gt;metadata_lock_server_count = 2;</div><div class='del'>-	priv-&gt;entry_lock_server_count = 2;</div><div class='del'>-</div><div class='del'>-	priv-&gt;strict_readdir = _gf_false;</div><div class='del'>-</div><div class='del'>-        trav = this-&gt;children;</div><div class='del'>-        while (trav) {</div><div class='del'>-                child_count++;</div><div class='del'>-                trav = trav-&gt;next;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-	priv-&gt;wait_count = 1;</div><div class='del'>-</div><div class='del'>-        if (child_count != 2) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-                        "There should be exactly 2 children - one source "</div><div class='del'>-                        "and one sink");</div><div class='del'>-                return -1;</div><div class='del'>-        }</div><div class='del'>-	priv-&gt;child_count = child_count;</div><div class='del'>-</div><div class='del'>-	LOCK_INIT (&amp;priv-&gt;lock);</div><div class='del'>-        LOCK_INIT (&amp;priv-&gt;read_child_lock);</div><div class='del'>-</div><div class='del'>-	priv-&gt;child_up = GF_CALLOC (sizeof (unsigned char), child_count,</div><div class='del'>-                                 gf_afr_mt_char);</div><div class='del'>-	if (!priv-&gt;child_up) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-			"Out of memory.");</div><div class='del'>-		op_errno = ENOMEM;</div><div class='del'>-		goto out;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	priv-&gt;children = GF_CALLOC (sizeof (xlator_t *), child_count,</div><div class='del'>-                                 gf_afr_mt_xlator_t);</div><div class='del'>-	if (!priv-&gt;children) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-			"Out of memory.");</div><div class='del'>-		op_errno = ENOMEM;</div><div class='del'>-		goto out;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-        priv-&gt;pending_key = GF_CALLOC (sizeof (*priv-&gt;pending_key),</div><div class='del'>-                                       child_count,</div><div class='del'>-                                       gf_afr_mt_char);</div><div class='del'>-        if (!priv-&gt;pending_key) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-                        "Out of memory.");</div><div class='del'>-                op_errno = ENOMEM;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-	trav = this-&gt;children;</div><div class='del'>-	i = 0;</div><div class='del'>-	while (i &lt; child_count) {</div><div class='del'>-		priv-&gt;children[i] = trav-&gt;xlator;</div><div class='del'>-</div><div class='del'>-                ret = asprintf (&amp;priv-&gt;pending_key[i], "%s.%s", AFR_XATTR_PREFIX,</div><div class='del'>-                                trav-&gt;xlator-&gt;name);</div><div class='del'>-                if (-1 == ret) {</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-                                "asprintf failed to set pending key");</div><div class='del'>-                        op_errno = ENOMEM;</div><div class='del'>-                        goto out;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-		trav = trav-&gt;next;</div><div class='del'>-		i++;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-        priv-&gt;first_lookup = 1;</div><div class='del'>-        priv-&gt;root_inode = NULL;</div><div class='del'>-</div><div class='del'>-	pump_priv = GF_CALLOC (1, sizeof (*pump_priv),</div><div class='del'>-                            gf_afr_mt_pump_priv);</div><div class='del'>-	if (!pump_priv) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-			"Out of memory");</div><div class='del'>-                op_errno = ENOMEM;</div><div class='del'>-		goto out;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-        LOCK_INIT (&amp;pump_priv-&gt;resume_path_lock);</div><div class='del'>-        LOCK_INIT (&amp;pump_priv-&gt;pump_state_lock);</div><div class='del'>-</div><div class='del'>-        pump_priv-&gt;resume_path = GF_CALLOC (1, PATH_MAX,</div><div class='del'>-                                            gf_afr_mt_char);</div><div class='del'>-        if (!pump_priv-&gt;resume_path) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-                        "Out of memory");</div><div class='del'>-                ret = -1;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-	pump_priv-&gt;env = syncenv_new (0);</div><div class='del'>-        if (!pump_priv-&gt;env) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-                        "Could not create new sync-environment");</div><div class='del'>-                ret = -1;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-	priv-&gt;pump_private = pump_priv;</div><div class='del'>-</div><div class='del'>-        pump_change_state (this, PUMP_STATE_ABORT);</div><div class='del'>-</div><div class='del'>-	ret = 0;</div><div class='del'>-out:</div><div class='del'>-	return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-fini (xlator_t *this)</div><div class='del'>-{</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-struct xlator_fops fops = {</div><div class='del'>-	.lookup      = afr_lookup,</div><div class='del'>-	.open        = afr_open,</div><div class='del'>-	.lk          = afr_lk,</div><div class='del'>-	.flush       = afr_flush,</div><div class='del'>-	.statfs      = afr_statfs,</div><div class='del'>-	.fsync       = afr_fsync,</div><div class='del'>-	.fsyncdir    = afr_fsyncdir,</div><div class='del'>-	.xattrop     = afr_xattrop,</div><div class='del'>-	.fxattrop    = afr_fxattrop,</div><div class='del'>-	.inodelk     = afr_inodelk,</div><div class='del'>-	.finodelk    = afr_finodelk,</div><div class='del'>-	.entrylk     = afr_entrylk,</div><div class='del'>-	.fentrylk    = afr_fentrylk,</div><div class='del'>-</div><div class='del'>-	/* inode read */</div><div class='del'>-	.access      = afr_access,</div><div class='del'>-	.stat        = afr_stat,</div><div class='del'>-	.fstat       = afr_fstat,</div><div class='del'>-	.readlink    = afr_readlink,</div><div class='del'>-	.getxattr    = pump_getxattr,</div><div class='del'>-	.readv       = afr_readv,</div><div class='del'>-</div><div class='del'>-	/* inode write */</div><div class='del'>-	.writev      = afr_writev,</div><div class='del'>-	.truncate    = afr_truncate,</div><div class='del'>-	.ftruncate   = afr_ftruncate,</div><div class='del'>-	.setxattr    = pump_setxattr,</div><div class='del'>-        .setattr     = afr_setattr,</div><div class='del'>-	.fsetattr    = afr_fsetattr,</div><div class='del'>-	.removexattr = afr_removexattr,</div><div class='del'>-</div><div class='del'>-	/* dir read */</div><div class='del'>-	.opendir     = afr_opendir,</div><div class='del'>-	.readdir     = afr_readdir,</div><div class='del'>-	.readdirp    = afr_readdirp,</div><div class='del'>-</div><div class='del'>-	/* dir write */</div><div class='del'>-	.create      = afr_create,</div><div class='del'>-	.mknod       = afr_mknod,</div><div class='del'>-	.mkdir       = afr_mkdir,</div><div class='del'>-	.unlink      = afr_unlink,</div><div class='del'>-	.rmdir       = afr_rmdir,</div><div class='del'>-	.link        = afr_link,</div><div class='del'>-	.symlink     = afr_symlink,</div><div class='del'>-	.rename      = afr_rename,</div><div class='del'>-};</div><div class='del'>-</div><div class='del'>-struct xlator_dumpops dumpops = {</div><div class='del'>-        .priv       = afr_priv_dump,</div><div class='del'>-};</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-struct xlator_cbks cbks = {</div><div class='del'>-	.release     = afr_release,</div><div class='del'>-	.releasedir  = afr_releasedir,</div><div class='del'>-};</div><div class='del'>-</div><div class='del'>-struct volume_options options[] = {</div><div class='del'>-	{ .key  = {NULL} },</div><div class='del'>-};</div><div class='head'>diff --git a/xlators/cluster/afr/src/pump.h b/xlators/cluster/afr/src/pump.h<br/>deleted file mode 100644<br/>index 65cfcb55b5b..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/xlators/cluster/afr/src/pump.h?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/cluster/afr/src/pump.h</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,97 +0,0 @@</div><div class='del'>-/*</div><div class='del'>-   Copyright (c) 2007-2009 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='del'>-   This file is part of GlusterFS.</div><div class='del'>-</div><div class='del'>-   GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-   it under the terms of the GNU General Public License as published</div><div class='del'>-   by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-   or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-   GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-   WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-   General Public License for more details.</div><div class='del'>-</div><div class='del'>-   You should have received a copy of the GNU General Public License</div><div class='del'>-   along with this program.  If not, see</div><div class='del'>-   &lt;http://www.gnu.org/licenses/&gt;.</div><div class='del'>-*/</div><div class='del'>-</div><div class='del'>-#ifndef __PUMP_H__</div><div class='del'>-#define __PUMP_H__</div><div class='del'>-</div><div class='del'>-#include "syncop.h"</div><div class='del'>-</div><div class='del'>-/* FIXME: Needs to be defined in a common file */</div><div class='del'>-#define CLIENT_CMD_CONNECT "trusted.glusterfs.client-connect"</div><div class='del'>-#define CLIENT_CMD_DISCONNECT "trusted.glusterfs.client-disconnect"</div><div class='del'>-</div><div class='del'>-#define PUMP_PID 696969</div><div class='del'>-#define PUMP_LK_OWNER 696969</div><div class='del'>-</div><div class='del'>-#define IS_ROOT_PATH(path) (!strcmp (path, "/"))</div><div class='del'>-#define IS_ENTRY_CWD(entry) (!strcmp (entry, "."))</div><div class='del'>-#define IS_ENTRY_PARENT(entry) (!strcmp (entry, ".."))</div><div class='del'>-</div><div class='del'>-#define PUMP_CMD_START  "trusted.glusterfs.pump.start"</div><div class='del'>-#define PUMP_CMD_ABORT  "trusted.glusterfs.pump.abort"</div><div class='del'>-#define PUMP_CMD_PAUSE  "trusted.glusterfs.pump.pause"</div><div class='del'>-#define PUMP_CMD_STATUS "trusted.glusterfs.pump.status"</div><div class='del'>-</div><div class='del'>-#define PUMP_SOURCE_COMPLETE "trusted.glusterfs.pump-source-complete"</div><div class='del'>-#define PUMP_SINK_COMPLETE "trusted.glusterfs.pump-sink-complete"</div><div class='del'>-</div><div class='del'>-#define PUMP_PATH "trusted.glusterfs.pump-path"</div><div class='del'>-</div><div class='del'>-#define PUMP_SOURCE_CHILD(xl) (xl-&gt;children-&gt;xlator)</div><div class='del'>-#define PUMP_SINK_CHILD(xl) (xl-&gt;children-&gt;next-&gt;xlator)</div><div class='del'>-</div><div class='del'>-typedef enum {</div><div class='del'>-        PUMP_STATE_RUNNING,             /* Pump is running and migrating files */</div><div class='del'>-        PUMP_STATE_RESUME,              /* Pump is resuming from a previous pause */</div><div class='del'>-        PUMP_STATE_PAUSE,               /* Pump is paused */</div><div class='del'>-        PUMP_STATE_ABORT,               /* Pump is aborted */</div><div class='del'>-} pump_state_t;</div><div class='del'>-</div><div class='del'>-typedef struct _pump_private {</div><div class='del'>-	struct syncenv *env;            /* The env pointer to the pump synctask */</div><div class='del'>-        const char *resume_path;        /* path to resume from the last pause */</div><div class='del'>-        gf_lock_t resume_path_lock;     /* Synchronize resume_path changes */</div><div class='del'>-        gf_lock_t pump_state_lock;      /* Synchronize pump_state changes */</div><div class='del'>-        pump_state_t pump_state;        /* State of pump */</div><div class='del'>-        char current_file[PATH_MAX];    /* Current file being pumped */</div><div class='del'>-        uint64_t number_files_pumped;   /* Number of files pumped */</div><div class='del'>-        gf_boolean_t pump_finished;     /* Boolean to indicate pump termination */</div><div class='del'>-        char pump_start_pending;        /* Boolean to mark start pending until</div><div class='del'>-                                           CHILD_UP */</div><div class='del'>-} pump_private_t;</div><div class='del'>-</div><div class='del'>-void</div><div class='del'>-build_root_loc (inode_t *inode, loc_t *loc);</div><div class='del'>-int pump_start (call_frame_t *frame, xlator_t *this);</div><div class='del'>-</div><div class='del'>-gf_boolean_t</div><div class='del'>-pump_command_start (xlator_t *this, dict_t *dict);</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-pump_execute_start (call_frame_t *frame, xlator_t *this);</div><div class='del'>-</div><div class='del'>-gf_boolean_t</div><div class='del'>-pump_command_pause (xlator_t *this, dict_t *dict);</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-pump_execute_pause (call_frame_t *frame, xlator_t *this);</div><div class='del'>-</div><div class='del'>-gf_boolean_t</div><div class='del'>-pump_command_abort (xlator_t *this, dict_t *dict);</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-pump_execute_abort (call_frame_t *frame, xlator_t *this);</div><div class='del'>-</div><div class='del'>-gf_boolean_t</div><div class='del'>-pump_command_status (xlator_t *this, dict_t *dict);</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-pump_execute_status (call_frame_t *frame, xlator_t *this);</div><div class='del'>-</div><div class='del'>-#endif /* __PUMP_H__ */</div><div class='head'>diff --git a/xlators/cluster/dht/src/Makefile.am b/xlators/cluster/dht/src/Makefile.am<br/>index 4b69aa07100..56f1f2ad7c8 100644<br/>--- a/<a href='/cgit/glusterfs.git/tree/xlators/cluster/dht/src/Makefile.am?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/cluster/dht/src/Makefile.am</a><br/>+++ b/<a href='/cgit/glusterfs.git/tree/xlators/cluster/dht/src/Makefile.am?id=d1d7a6f35c816822fab51c820e25023863c239c1'>xlators/cluster/dht/src/Makefile.am</a></div><div class='hunk'>@@ -1,34 +1,48 @@</div><div class='del'>-</div><div class='ctx'> xlator_LTLIBRARIES = dht.la nufa.la switch.la</div><div class='del'>-xlatordir = $(libdir)/glusterfs/$(PACKAGE_VERSION)/xlator/cluster</div><div class='ctx'> </div><div class='add'>+AM_CFLAGS = -Wall $(GF_CFLAGS)</div><div class='ctx'> </div><div class='del'>-dht_common_source = dht-layout.c dht-helper.c dht-linkfile.c \</div><div class='del'>-		dht-selfheal.c dht-rename.c dht-hashfn.c dht-diskusage.c</div><div class='add'>+xlatordir = $(libdir)/glusterfs/$(PACKAGE_VERSION)/xlator/cluster</div><div class='ctx'> </div><div class='del'>-dht_la_SOURCES = $(dht_common_source) dht.c </div><div class='add'>+dht_common_source = dht-layout.c dht-helper.c dht-linkfile.c dht-rebalance.c \</div><div class='add'>+	dht-selfheal.c dht-rename.c dht-hashfn.c dht-diskusage.c \</div><div class='add'>+	dht-common.c dht-inode-write.c dht-inode-read.c dht-shared.c \</div><div class='add'>+	dht-lock.c $(top_builddir)/xlators/lib/src/libxlator.c</div><div class='add'>+</div><div class='add'>+dht_la_SOURCES = $(dht_common_source) dht.c</div><div class='ctx'> </div><div class='ctx'> nufa_la_SOURCES = $(dht_common_source) nufa.c</div><div class='ctx'> switch_la_SOURCES = $(dht_common_source) switch.c</div><div class='ctx'> </div><div class='del'>-dht_la_LDFLAGS = -module -avoidversion</div><div class='add'>+dht_la_LDFLAGS = -module $(GF_XLATOR_DEFAULT_LDFLAGS)</div><div class='ctx'> dht_la_LIBADD = $(top_builddir)/libglusterfs/src/libglusterfs.la</div><div class='ctx'> </div><div class='del'>-nufa_la_LDFLAGS = -module -avoidversion</div><div class='add'>+nufa_la_LDFLAGS = -module $(GF_XLATOR_DEFAULT_LDFLAGS)</div><div class='ctx'> nufa_la_LIBADD = $(top_builddir)/libglusterfs/src/libglusterfs.la</div><div class='ctx'> </div><div class='del'>-switch_la_LDFLAGS = -module -avoidversion</div><div class='add'>+switch_la_LDFLAGS = -module $(GF_XLATOR_DEFAULT_LDFLAGS)</div><div class='ctx'> switch_la_LIBADD = $(top_builddir)/libglusterfs/src/libglusterfs.la</div><div class='ctx'> </div><div class='del'>-noinst_HEADERS = dht-common.h dht-common.c dht-mem-types.h</div><div class='add'>+noinst_HEADERS = dht-common.h dht-mem-types.h dht-messages.h \</div><div class='add'>+	dht-lock.h $(top_builddir)/xlators/lib/src/libxlator.h</div><div class='ctx'> </div><div class='del'>-AM_CFLAGS = -fPIC -D_FILE_OFFSET_BITS=64 -D_GNU_SOURCE -Wall -D$(GF_HOST_OS) \</div><div class='del'>-	-I$(top_srcdir)/libglusterfs/src -shared -nostartfiles $(GF_CFLAGS)</div><div class='add'>+AM_CPPFLAGS = $(GF_CPPFLAGS) -I$(top_srcdir)/libglusterfs/src \</div><div class='add'>+	-I$(top_srcdir)/rpc/xdr/src -I$(top_builddir)/rpc/xdr/src \</div><div class='add'>+	-I$(top_srcdir)/rpc/rpc-lib/src \</div><div class='add'>+	-I$(top_srcdir)/xlators/lib/src \</div><div class='add'>+	-DDATADIR=\"$(localstatedir)\" \</div><div class='add'>+	-DLIBDIR=\"$(libdir)\"</div><div class='ctx'> </div><div class='del'>-CLEANFILES = </div><div class='add'>+CLEANFILES =</div><div class='ctx'> </div><div class='ctx'> uninstall-local:</div><div class='ctx'> 	rm -f $(DESTDIR)$(xlatordir)/distribute.so</div><div class='ctx'> </div><div class='ctx'> install-data-hook:</div><div class='del'>-	ln -sf dht.so $(DESTDIR)$(xlatordir)/distribute.so
\ No newline at end of file</div><div class='add'>+	ln -sf dht.so $(DESTDIR)$(xlatordir)/distribute.so</div><div class='add'>+</div><div class='add'>+if UNITTEST</div><div class='add'>+CLEANFILES += *.gcda *.gcno *_xunit.xml</div><div class='add'>+noinst_PROGRAMS =</div><div class='add'>+TESTS =</div><div class='add'>+endif</div><div class='head'>diff --git a/xlators/cluster/dht/src/dht-common.c b/xlators/cluster/dht/src/dht-common.c<br/>index 24430e6bcb4..8ba0cc4c732 100644<br/>--- a/<a href='/cgit/glusterfs.git/tree/xlators/cluster/dht/src/dht-common.c?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/cluster/dht/src/dht-common.c</a><br/>+++ b/<a href='/cgit/glusterfs.git/tree/xlators/cluster/dht/src/dht-common.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>xlators/cluster/dht/src/dht-common.c</a></div><div class='hunk'>@@ -1,4611 +1,11391 @@</div><div class='ctx'> /*</div><div class='del'>-   Copyright (c) 2009-2009 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='del'>-   This file is part of GlusterFS.</div><div class='del'>-</div><div class='del'>-   GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-   it under the terms of the GNU General Public License as published</div><div class='del'>-   by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-   or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-   GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-   WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-   General Public License for more details.</div><div class='del'>-</div><div class='del'>-   You should have received a copy of the GNU General Public License</div><div class='del'>-   along with this program.  If not, see</div><div class='del'>-   &lt;http://www.gnu.org/licenses/&gt;.</div><div class='del'>-*/</div><div class='del'>-</div><div class='add'>+  Copyright (c) 2008-2012 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='ctx'> </div><div class='del'>-#ifndef _CONFIG_H</div><div class='del'>-#define _CONFIG_H</div><div class='del'>-#include "config.h"</div><div class='del'>-#endif</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='ctx'> </div><div class='ctx'> /* TODO: add NS locking */</div><div class='ctx'> </div><div class='del'>-#include "glusterfs.h"</div><div class='del'>-#include "xlator.h"</div><div class='add'>+#include "libxlator.h"</div><div class='ctx'> #include "dht-common.h"</div><div class='del'>-#include "defaults.h"</div><div class='add'>+#include "dht-lock.h"</div><div class='add'>+#include &lt;glusterfs/byte-order.h&gt;</div><div class='add'>+#include &lt;glusterfs/quota-common-utils.h&gt;</div><div class='add'>+#include &lt;glusterfs/upcall-utils.h&gt;</div><div class='add'>+#include "glusterfs/compat-errno.h"  // for ENODATA on BSD</div><div class='add'>+#include &lt;glusterfs/common-utils.h&gt;</div><div class='ctx'> </div><div class='ctx'> #include &lt;sys/time.h&gt;</div><div class='ctx'> #include &lt;libgen.h&gt;</div><div class='add'>+#include &lt;signal.h&gt;</div><div class='ctx'> </div><div class='del'>-/* TODO:</div><div class='del'>-   - use volumename in xattr instead of "dht"</div><div class='del'>-   - use NS locks</div><div class='del'>-   - handle all cases in self heal layout reconstruction</div><div class='del'>-   - complete linkfile selfheal</div><div class='del'>-*/</div><div class='add'>+static int</div><div class='add'>+dht_rmdir_readdirp_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                       int op_ret, int op_errno, gf_dirent_t *entries,</div><div class='add'>+                       dict_t *xdata);</div><div class='ctx'> </div><div class='add'>+static int</div><div class='add'>+dht_link2(xlator_t *this, xlator_t *subvol, call_frame_t *frame, int ret);</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-dht_lookup_selfheal_cbk (call_frame_t *frame, void *cookie,</div><div class='del'>-			 xlator_t *this,</div><div class='del'>-			 int op_ret, int op_errno)</div><div class='add'>+static int</div><div class='add'>+dht_set_dir_xattr_req(xlator_t *this, loc_t *loc, dict_t *xattr_req);</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+dht_lookup_everywhere_done(call_frame_t *frame, xlator_t *this);</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+dht_common_mark_mdsxattr_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                             int op_ret, int op_errno, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+dht_rmdir_unlock(call_frame_t *frame, xlator_t *this);</div><div class='add'>+</div><div class='add'>+static const char *dht_dbg_vxattrs[] = {DHT_DBG_HASHED_SUBVOL_PATTERN, NULL};</div><div class='add'>+</div><div class='add'>+/* Check the xdata to make sure EBADF has been set by client xlator */</div><div class='add'>+int32_t</div><div class='add'>+dht_check_remote_fd_failed_error(dht_local_t *local, int op_ret, int op_errno)</div><div class='ctx'> {</div><div class='del'>-	dht_local_t  *local = NULL;</div><div class='del'>-	dht_layout_t *layout = NULL;</div><div class='del'>-	int           ret = 0;</div><div class='add'>+    if (op_ret == -1 &amp;&amp; (op_errno == EBADF || op_errno == EBADFD) &amp;&amp;</div><div class='add'>+        !(local-&gt;fd_checked)) {</div><div class='add'>+        return 1;</div><div class='add'>+    }</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-	ret = op_ret;</div><div class='add'>+/* Sets the blocks and size values to fixed values. This is to be called</div><div class='add'>+ * only for dirs. The caller is responsible for checking the type</div><div class='add'>+ */</div><div class='add'>+int32_t</div><div class='add'>+dht_set_fixed_dir_stat(struct iatt *stat)</div><div class='add'>+{</div><div class='add'>+    if (stat) {</div><div class='add'>+        stat-&gt;ia_blocks = DHT_DIR_STAT_BLOCKS;</div><div class='add'>+        stat-&gt;ia_size = DHT_DIR_STAT_SIZE;</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='add'>+    return -1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* Return true if key exists in array</div><div class='add'>+ */</div><div class='add'>+static gf_boolean_t</div><div class='add'>+dht_match_xattr(const char *key)</div><div class='add'>+{</div><div class='add'>+    char **xattrs_to_heal = get_xattrs_to_heal();</div><div class='ctx'> </div><div class='del'>-        dht_frame_su_undo (frame);</div><div class='add'>+    return gf_get_index_by_elem(xattrs_to_heal, (char *)key) &gt;= 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+dht_aggregate_quota_xattr(dict_t *dst, char *key, data_t *value)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    quota_meta_t *meta_dst = NULL;</div><div class='add'>+    quota_meta_t *meta_src = NULL;</div><div class='add'>+    int64_t *size = NULL;</div><div class='add'>+    int64_t dst_dir_count = 0;</div><div class='add'>+    int64_t src_dir_count = 0;</div><div class='add'>+</div><div class='add'>+    if (value == NULL) {</div><div class='add'>+        gf_msg("dht", GF_LOG_WARNING, 0, DHT_MSG_DATA_NULL,</div><div class='add'>+               "data value is NULL");</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_get_bin(dst, key, (void **)&amp;meta_dst);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        meta_dst = GF_CALLOC(1, sizeof(quota_meta_t), gf_common_quota_meta_t);</div><div class='add'>+        if (meta_dst == NULL) {</div><div class='add'>+            gf_msg("dht", GF_LOG_WARNING, ENOMEM, DHT_MSG_NO_MEMORY,</div><div class='add'>+                   "Memory allocation failed");</div><div class='add'>+            ret = -1;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+        ret = dict_set_bin(dst, key, meta_dst, sizeof(quota_meta_t));</div><div class='add'>+        if (ret &lt; 0) {</div><div class='add'>+            gf_msg("dht", GF_LOG_WARNING, EINVAL, DHT_MSG_DICT_SET_FAILED,</div><div class='add'>+                   "dht aggregate dict set failed");</div><div class='add'>+            GF_FREE(meta_dst);</div><div class='add'>+            ret = -1;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	if (ret == 0) {</div><div class='del'>-		layout = local-&gt;selfheal.layout;</div><div class='del'>-		ret = dht_layout_set (this, local-&gt;inode, layout);</div><div class='add'>+    if (value-&gt;len &gt; sizeof(int64_t)) {</div><div class='add'>+        meta_src = data_to_bin(value);</div><div class='ctx'> </div><div class='del'>-		if (local-&gt;ia_ino) {</div><div class='del'>-			local-&gt;stbuf.ia_ino = local-&gt;ia_ino;</div><div class='del'>-		} else {</div><div class='del'>-			gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-				"could not find hashed subvolume for %s",</div><div class='del'>-				local-&gt;loc.path);</div><div class='del'>-		}</div><div class='add'>+        meta_dst-&gt;size = hton64(ntoh64(meta_dst-&gt;size) +</div><div class='add'>+                                ntoh64(meta_src-&gt;size));</div><div class='add'>+        meta_dst-&gt;file_count = hton64(ntoh64(meta_dst-&gt;file_count) +</div><div class='add'>+                                      ntoh64(meta_src-&gt;file_count));</div><div class='ctx'> </div><div class='del'>-                if (local-&gt;loc.parent)</div><div class='del'>-                        local-&gt;postparent.ia_ino = local-&gt;loc.parent-&gt;ino;</div><div class='del'>-	}</div><div class='add'>+        if (value-&gt;len &gt; (2 * sizeof(int64_t))) {</div><div class='add'>+            dst_dir_count = ntoh64(meta_dst-&gt;dir_count);</div><div class='add'>+            src_dir_count = ntoh64(meta_src-&gt;dir_count);</div><div class='ctx'> </div><div class='del'>-        WIPE (&amp;local-&gt;postparent);</div><div class='add'>+            if (src_dir_count &gt; dst_dir_count)</div><div class='add'>+                meta_dst-&gt;dir_count = meta_src-&gt;dir_count;</div><div class='add'>+        } else {</div><div class='add'>+            meta_dst-&gt;dir_count = 0;</div><div class='add'>+        }</div><div class='add'>+    } else {</div><div class='add'>+        size = data_to_bin(value);</div><div class='add'>+        meta_dst-&gt;size = hton64(ntoh64(meta_dst-&gt;size) + ntoh64(*size));</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	DHT_STACK_UNWIND (lookup, frame, ret, local-&gt;op_errno, local-&gt;inode,</div><div class='del'>-			  &amp;local-&gt;stbuf, local-&gt;xattr, &amp;local-&gt;postparent);</div><div class='add'>+    ret = 0;</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	return 0;</div><div class='add'>+static int</div><div class='add'>+add_opt(char **optsp, const char *opt)</div><div class='add'>+{</div><div class='add'>+    char *newopts = NULL;</div><div class='add'>+    unsigned oldsize = 0;</div><div class='add'>+    unsigned newsize = 0;</div><div class='add'>+</div><div class='add'>+    if (*optsp == NULL)</div><div class='add'>+        newopts = gf_strdup(opt);</div><div class='add'>+    else {</div><div class='add'>+        oldsize = strlen(*optsp);</div><div class='add'>+        newsize = oldsize + 1 + strlen(opt) + 1;</div><div class='add'>+        newopts = GF_REALLOC(*optsp, newsize);</div><div class='add'>+        if (newopts)</div><div class='add'>+            sprintf(newopts + oldsize, ",%s", opt);</div><div class='add'>+    }</div><div class='add'>+    if (newopts == NULL) {</div><div class='add'>+        gf_msg("dht", GF_LOG_WARNING, 0, DHT_MSG_NO_MEMORY,</div><div class='add'>+               "Error to add choices in buffer in add_opt");</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+    *optsp = newopts;</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+/* Return Choice list from Split brain status */</div><div class='add'>+static char *</div><div class='add'>+getChoices(const char *value)</div><div class='add'>+{</div><div class='add'>+    int i = 0;</div><div class='add'>+    char *ptr = NULL;</div><div class='add'>+    char *tok = NULL;</div><div class='add'>+    char *result = NULL;</div><div class='add'>+    char *newval = NULL;</div><div class='add'>+</div><div class='add'>+    ptr = strstr(value, "Choices:");</div><div class='add'>+    if (!ptr) {</div><div class='add'>+        result = ptr;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    newval = gf_strdup(ptr);</div><div class='add'>+    if (!newval) {</div><div class='add'>+        result = newval;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    tok = strtok(newval, ":");</div><div class='add'>+    if (!tok) {</div><div class='add'>+        result = tok;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    while (tok) {</div><div class='add'>+        i++;</div><div class='add'>+        if (i == 2)</div><div class='add'>+            break;</div><div class='add'>+        tok = strtok(NULL, ":");</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    result = gf_strdup(tok);</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-dht_lookup_dir_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-                    int op_ret, int op_errno,</div><div class='del'>-                    inode_t *inode, struct iatt *stbuf, dict_t *xattr,</div><div class='del'>-                    struct iatt *postparent)</div><div class='del'>-{</div><div class='del'>-	dht_conf_t   *conf                    = NULL;</div><div class='del'>-        dht_local_t  *local                   = NULL;</div><div class='del'>-        int           this_call_cnt           = 0;</div><div class='del'>-        call_frame_t *prev                    = NULL;</div><div class='del'>-	dht_layout_t *layout                  = NULL;</div><div class='del'>-	int           ret                     = 0;</div><div class='del'>-	int           is_dir                  = 0;</div><div class='del'>-</div><div class='del'>-	conf  = this-&gt;private;</div><div class='del'>-        local = frame-&gt;local;</div><div class='del'>-        prev  = cookie;</div><div class='del'>-</div><div class='del'>-	layout = local-&gt;layout;</div><div class='del'>-</div><div class='del'>-        LOCK (&amp;frame-&gt;lock);</div><div class='del'>-        {</div><div class='del'>-                /* TODO: assert equal mode on stbuf-&gt;st_mode and</div><div class='del'>-		   local-&gt;stbuf-&gt;st_mode</div><div class='del'>-</div><div class='del'>-		   else mkdir/chmod/chown and fix</div><div class='del'>-		*/</div><div class='del'>-		ret = dht_layout_merge (this, layout, prev-&gt;this,</div><div class='del'>-					op_ret, op_errno, xattr);</div><div class='del'>-</div><div class='del'>-		if (op_ret == -1) {</div><div class='del'>-			local-&gt;op_errno = ENOENT;</div><div class='del'>-			gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-				"lookup of %s on %s returned error (%s)",</div><div class='del'>-				local-&gt;loc.path, prev-&gt;this-&gt;name,</div><div class='del'>-				strerror (op_errno));</div><div class='del'>-</div><div class='del'>-			goto unlock;</div><div class='del'>-		}</div><div class='del'>-</div><div class='del'>- 		is_dir = check_is_dir (inode, stbuf, xattr);</div><div class='del'>- 		if (!is_dir) {</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-                                "lookup of %s on %s returned non dir 0%o",</div><div class='del'>-                                local-&gt;loc.path, prev-&gt;this-&gt;name,</div><div class='del'>-                                stbuf-&gt;ia_type);</div><div class='del'>-                        local-&gt;need_selfheal = 1;</div><div class='del'>- 			goto unlock;</div><div class='del'>-                }</div><div class='add'>+out:</div><div class='add'>+    if (newval)</div><div class='add'>+        GF_FREE(newval);</div><div class='ctx'> </div><div class='del'>- 		local-&gt;op_ret = 0;</div><div class='del'>- 		if (local-&gt;xattr == NULL)</div><div class='del'>- 			local-&gt;xattr = dict_ref (xattr);</div><div class='del'>- 		if (local-&gt;inode == NULL)</div><div class='del'>- 			local-&gt;inode = inode_ref (inode);</div><div class='add'>+    return result;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-		dht_iatt_merge (this, &amp;local-&gt;stbuf, stbuf, prev-&gt;this);</div><div class='del'>-                dht_iatt_merge (this, &amp;local-&gt;postparent, postparent,</div><div class='del'>-                                prev-&gt;this);</div><div class='add'>+/* This function prepare a list of choices for key</div><div class='add'>+   (replica.split-brain-status) in   case of metadata split brain</div><div class='add'>+   only on the basis of key-value passed to this function.</div><div class='add'>+   After prepare the list of choices it update the same key in dict</div><div class='add'>+   with this value to reflect the same in</div><div class='add'>+   replica.split-brain-status attr for file.</div><div class='ctx'> </div><div class='del'>-                if (prev-&gt;this == dht_first_up_subvol (this)) {</div><div class='del'>-			local-&gt;ia_ino = local-&gt;stbuf.ia_ino;</div><div class='del'>-                        local-&gt;ia_gen = local-&gt;stbuf.ia_gen;</div><div class='del'>-                }</div><div class='add'>+*/</div><div class='ctx'> </div><div class='add'>+static int</div><div class='add'>+dht_aggregate_split_brain_xattr(dict_t *dst, char *key, data_t *value)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+    char *oldvalue = NULL;</div><div class='add'>+    char *old_choice = NULL;</div><div class='add'>+    char *new_choice = NULL;</div><div class='add'>+    char *full_choice = NULL;</div><div class='add'>+    char *status = NULL;</div><div class='add'>+</div><div class='add'>+    if (value == NULL) {</div><div class='add'>+        gf_msg("dht", GF_LOG_WARNING, 0, DHT_MSG_DATA_NULL,</div><div class='add'>+               "GF_AFR_SBRAIN_STATUS value is NULL");</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_get_str(dst, key, &amp;oldvalue);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    /* skip code that is irrelevant if !oldvalue */</div><div class='add'>+    if (!oldvalue)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    if (strstr(oldvalue, "not")) {</div><div class='add'>+        gf_msg_debug("dht", 0, "Need to update split-brain status in dict");</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    if (strstr(oldvalue, "metadata-split-brain:yes") &amp;&amp;</div><div class='add'>+        (strstr(oldvalue, "data-split-brain:no"))) {</div><div class='add'>+        if (strstr(value-&gt;data, "not")) {</div><div class='add'>+            gf_msg_debug("dht", 0, "No need to update split-brain status");</div><div class='add'>+            ret = 0;</div><div class='add'>+            goto out;</div><div class='ctx'>         }</div><div class='del'>-unlock:</div><div class='del'>-        UNLOCK (&amp;frame-&gt;lock);</div><div class='add'>+        if (strstr(value-&gt;data, "yes") &amp;&amp;</div><div class='add'>+            (strncmp(oldvalue, value-&gt;data, strlen(oldvalue)))) {</div><div class='add'>+            old_choice = getChoices(oldvalue);</div><div class='add'>+            if (!old_choice) {</div><div class='add'>+                gf_msg("dht", GF_LOG_WARNING, 0, DHT_MSG_NO_MEMORY,</div><div class='add'>+                       "Error to get choices");</div><div class='add'>+                ret = -1;</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='ctx'> </div><div class='add'>+            ret = add_opt(&amp;full_choice, old_choice);</div><div class='add'>+            if (ret) {</div><div class='add'>+                gf_msg("dht", GF_LOG_WARNING, 0, DHT_MSG_NO_MEMORY,</div><div class='add'>+                       "Error to add choices");</div><div class='add'>+                ret = -1;</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='ctx'> </div><div class='del'>-        this_call_cnt = dht_frame_return (frame);</div><div class='add'>+            new_choice = getChoices(value-&gt;data);</div><div class='add'>+            if (!new_choice) {</div><div class='add'>+                gf_msg("dht", GF_LOG_WARNING, 0, DHT_MSG_NO_MEMORY,</div><div class='add'>+                       "Error to get choices");</div><div class='add'>+                ret = -1;</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='ctx'> </div><div class='del'>-        if (is_last_call (this_call_cnt)) {</div><div class='del'>-                if (local-&gt;need_selfheal) {</div><div class='del'>-                        local-&gt;need_selfheal = 0;</div><div class='del'>-                        dht_lookup_everywhere (frame, this, &amp;local-&gt;loc);</div><div class='del'>-                        return 0;</div><div class='del'>-                }</div><div class='add'>+            ret = add_opt(&amp;full_choice, new_choice);</div><div class='add'>+            if (ret) {</div><div class='add'>+                gf_msg("dht", GF_LOG_WARNING, 0, DHT_MSG_NO_MEMORY,</div><div class='add'>+                       "Error to add choices ");</div><div class='add'>+                ret = -1;</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+            ret = gf_asprintf(&amp;status,</div><div class='add'>+                              "data-split-brain:%s    "</div><div class='add'>+                              "metadata-split-brain:%s   Choices:%s",</div><div class='add'>+                              "no", "yes", full_choice);</div><div class='add'>+</div><div class='add'>+            if (-1 == ret) {</div><div class='add'>+                gf_msg("dht", GF_LOG_WARNING, 0, DHT_MSG_NO_MEMORY,</div><div class='add'>+                       "Error to prepare status ");</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+            ret = dict_set_dynstr(dst, key, status);</div><div class='add'>+            if (ret) {</div><div class='add'>+                gf_msg("dht", GF_LOG_WARNING, 0, DHT_MSG_DICT_SET_FAILED,</div><div class='add'>+                       "Failed to set full choice");</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-		if (local-&gt;op_ret == 0) {</div><div class='del'>-			ret = dht_layout_normalize (this, &amp;local-&gt;loc, layout);</div><div class='add'>+out:</div><div class='add'>+    if (old_choice)</div><div class='add'>+        GF_FREE(old_choice);</div><div class='add'>+    if (new_choice)</div><div class='add'>+        GF_FREE(new_choice);</div><div class='add'>+    if (full_choice)</div><div class='add'>+        GF_FREE(full_choice);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-			if (ret != 0) {</div><div class='del'>-				gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-					"fixing assignment on %s",</div><div class='del'>-					local-&gt;loc.path);</div><div class='del'>-				goto selfheal;</div><div class='del'>-			}</div><div class='add'>+static int</div><div class='add'>+dht_aggregate(dict_t *this, char *key, data_t *value, void *data)</div><div class='add'>+{</div><div class='add'>+    dict_t *dst = NULL;</div><div class='add'>+    int32_t ret = -1;</div><div class='add'>+    data_t *dict_data = NULL;</div><div class='add'>+</div><div class='add'>+    dst = data;</div><div class='add'>+</div><div class='add'>+    /* compare split brain xattr only */</div><div class='add'>+    if (strcmp(key, GF_AFR_SBRAIN_STATUS) == 0) {</div><div class='add'>+        ret = dht_aggregate_split_brain_xattr(dst, key, value);</div><div class='add'>+        if (!ret)</div><div class='add'>+            goto out;</div><div class='add'>+    } else if (strcmp(key, QUOTA_SIZE_KEY) == 0) {</div><div class='add'>+        ret = dht_aggregate_quota_xattr(dst, key, value);</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_msg("dht", GF_LOG_WARNING, 0,</div><div class='add'>+                   DHT_MSG_AGGREGATE_QUOTA_XATTR_FAILED,</div><div class='add'>+                   "Failed to aggregate quota xattr");</div><div class='add'>+        }</div><div class='add'>+        goto out;</div><div class='add'>+    } else if (fnmatch(GF_XATTR_STIME_PATTERN, key, FNM_NOESCAPE) == 0) {</div><div class='add'>+        ret = gf_get_min_stime(THIS, dst, key, value);</div><div class='add'>+        goto out;</div><div class='add'>+    } else {</div><div class='add'>+        /* compare user xattrs only */</div><div class='add'>+        if (!strncmp(key, "user.", SLEN("user."))) {</div><div class='add'>+            ret = dict_lookup(dst, key, &amp;dict_data);</div><div class='add'>+            if (!ret &amp;&amp; dict_data &amp;&amp; value) {</div><div class='add'>+                ret = is_data_equal(dict_data, value);</div><div class='add'>+                if (!ret)</div><div class='add'>+                    gf_msg_debug("dht", 0, "xattr mismatch for %s", key);</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-			dht_layout_set (this, local-&gt;inode, layout);</div><div class='add'>+    ret = dict_set(dst, key, value);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_msg("dht", GF_LOG_WARNING, 0, DHT_MSG_DICT_SET_FAILED,</div><div class='add'>+               "Failed to set dictionary value: key = %s", key);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-			if (local-&gt;ia_ino) {</div><div class='del'>-				local-&gt;stbuf.ia_ino = local-&gt;ia_ino;</div><div class='del'>-                                local-&gt;stbuf.ia_gen = local-&gt;ia_gen;</div><div class='del'>-			} else {</div><div class='del'>-				gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-					"could not find hashed subvol for %s",</div><div class='del'>-					local-&gt;loc.path);</div><div class='del'>-			}</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-                        if (local-&gt;loc.parent)</div><div class='del'>-                                local-&gt;postparent.ia_ino =</div><div class='del'>-                                        local-&gt;loc.parent-&gt;ino;</div><div class='del'>-		}</div><div class='add'>+static void</div><div class='add'>+dht_aggregate_xattr(dict_t *dst, dict_t *src)</div><div class='add'>+{</div><div class='add'>+    if ((dst == NULL) || (src == NULL)) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    dict_foreach(src, dht_aggregate, dst);</div><div class='add'>+out:</div><div class='add'>+    return;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-		DHT_STACK_UNWIND (lookup, frame, local-&gt;op_ret, local-&gt;op_errno,</div><div class='del'>-				  local-&gt;inode, &amp;local-&gt;stbuf, local-&gt;xattr,</div><div class='del'>-                                  &amp;local-&gt;postparent);</div><div class='add'>+/* Code to save hashed subvol on inode ctx as a mds subvol</div><div class='add'>+ */</div><div class='add'>+int</div><div class='add'>+dht_inode_ctx_mdsvol_set(inode_t *inode, xlator_t *this, xlator_t *mds_subvol)</div><div class='add'>+{</div><div class='add'>+    dht_inode_ctx_t *ctx = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    uint64_t ctx_int = 0;</div><div class='add'>+    gf_boolean_t ctx_free = _gf_false;</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;inode-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        ret = __inode_ctx_get(inode, this, &amp;ctx_int);</div><div class='add'>+        if (ctx_int) {</div><div class='add'>+            ctx = (dht_inode_ctx_t *)(uintptr_t)ctx_int;</div><div class='add'>+            ctx-&gt;mds_subvol = mds_subvol;</div><div class='add'>+        } else {</div><div class='add'>+            ctx = GF_CALLOC(1, sizeof(*ctx), gf_dht_mt_inode_ctx_t);</div><div class='add'>+            if (!ctx)</div><div class='add'>+                goto unlock;</div><div class='add'>+            ctx-&gt;mds_subvol = mds_subvol;</div><div class='add'>+            ctx_free = _gf_true;</div><div class='add'>+            ctx_int = (long)ctx;</div><div class='add'>+            ret = __inode_ctx_set(inode, this, &amp;ctx_int);</div><div class='ctx'>         }</div><div class='add'>+    }</div><div class='add'>+unlock:</div><div class='add'>+    UNLOCK(&amp;inode-&gt;lock);</div><div class='add'>+    if (ret &amp;&amp; ctx_free)</div><div class='add'>+        GF_FREE(ctx);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	return 0;</div><div class='add'>+/*Code to get mds subvol from inode ctx */</div><div class='ctx'> </div><div class='del'>-selfheal:</div><div class='del'>-        dht_frame_su_do (frame);</div><div class='del'>-	ret = dht_selfheal_directory (frame, dht_lookup_selfheal_cbk,</div><div class='del'>-				      &amp;local-&gt;loc, layout);</div><div class='add'>+int</div><div class='add'>+dht_inode_ctx_mdsvol_get(inode_t *inode, xlator_t *this, xlator_t **mdsvol)</div><div class='add'>+{</div><div class='add'>+    dht_inode_ctx_t *ctx = NULL;</div><div class='add'>+    int ret = -1;</div><div class='ctx'> </div><div class='del'>-	return 0;</div><div class='add'>+    if (!mdsvol)</div><div class='add'>+        return ret;</div><div class='add'>+</div><div class='add'>+    if (__is_root_gfid(inode-&gt;gfid)) {</div><div class='add'>+        (*mdsvol) = FIRST_CHILD(this);</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dht_inode_ctx_get(inode, this, &amp;ctx);</div><div class='add'>+</div><div class='add'>+    if (!ret &amp;&amp; ctx) {</div><div class='add'>+        if (ctx-&gt;mds_subvol) {</div><div class='add'>+            *mdsvol = ctx-&gt;mds_subvol;</div><div class='add'>+            ret = 0;</div><div class='add'>+        } else {</div><div class='add'>+            ret = -1;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-dht_revalidate_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-                    int op_ret, int op_errno,</div><div class='del'>-                    inode_t *inode, struct iatt *stbuf, dict_t *xattr,</div><div class='del'>-                    struct iatt *postparent)</div><div class='del'>-{</div><div class='del'>-        dht_local_t  *local         = NULL;</div><div class='del'>-        int           this_call_cnt = 0;</div><div class='del'>-        call_frame_t *prev          = NULL;</div><div class='del'>-	dht_layout_t *layout        = NULL;</div><div class='del'>-	dht_conf_t   *conf          = NULL;</div><div class='del'>-	int           ret  = -1;</div><div class='del'>-	int           is_dir = 0;</div><div class='del'>-	int           is_linkfile = 0;</div><div class='add'>+/* TODO:</div><div class='add'>+   - use volumename in xattr instead of "dht"</div><div class='add'>+   - use NS locks</div><div class='add'>+   - handle all cases in self heal layout reconstruction</div><div class='add'>+   - complete linkfile selfheal</div><div class='add'>+*/</div><div class='ctx'> </div><div class='del'>-        local = frame-&gt;local;</div><div class='del'>-        prev  = cookie;</div><div class='del'>-	conf = this-&gt;private;</div><div class='del'>-</div><div class='del'>-        LOCK (&amp;frame-&gt;lock);</div><div class='del'>-        {</div><div class='del'>-		if (op_ret == -1) {</div><div class='del'>-			local-&gt;op_errno = op_errno;</div><div class='del'>-</div><div class='del'>-			if ((op_errno != ENOTCONN) </div><div class='del'>-                            &amp;&amp; (op_errno != ENOENT)</div><div class='del'>-                            &amp;&amp; (op_errno != ESTALE)) {</div><div class='del'>-				gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-					"subvolume %s returned -1 (%s)",</div><div class='del'>-					prev-&gt;this-&gt;name, strerror (op_errno));</div><div class='del'>-			}</div><div class='del'>-                        </div><div class='del'>-                        if (op_errno == ESTALE) {</div><div class='del'>-                                /* propogate the ESTALE to parent. </div><div class='del'>-                                 * setting local-&gt;layout_mismatch would send</div><div class='del'>-                                 * ESTALE to parent. */</div><div class='del'>-                                local-&gt;layout_mismatch = 1;</div><div class='del'>-                        }</div><div class='add'>+static int</div><div class='add'>+dht_lookup_selfheal_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                        int op_ret, int op_errno, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    dht_layout_t *layout = NULL;</div><div class='add'>+    dht_conf_t *conf = NULL;</div><div class='add'>+    int ret = -1;</div><div class='ctx'> </div><div class='del'>-			goto unlock;</div><div class='del'>-		}</div><div class='del'>-</div><div class='del'>-		if (stbuf-&gt;ia_type != local-&gt;inode-&gt;ia_type) {</div><div class='del'>-			gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-				"mismatching filetypes 0%o v/s 0%o for %s",</div><div class='del'>-				(stbuf-&gt;ia_type), (local-&gt;inode-&gt;ia_type),</div><div class='del'>-				local-&gt;loc.path);</div><div class='del'>-</div><div class='del'>-			local-&gt;op_ret = -1;</div><div class='del'>-			local-&gt;op_errno = EINVAL;</div><div class='del'>-</div><div class='del'>-			goto unlock;</div><div class='del'>-		}</div><div class='del'>-</div><div class='del'>-		layout = local-&gt;layout;</div><div class='del'>-		</div><div class='del'>-		is_dir = check_is_dir (inode, stbuf, xattr);</div><div class='del'>-		is_linkfile = check_is_linkfile (inode, stbuf, xattr);</div><div class='del'>-		</div><div class='del'>-		if (is_linkfile) {</div><div class='del'>-			gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-				"linkfile found in revalidate for %s",</div><div class='del'>-				local-&gt;loc.path);</div><div class='del'>-			local-&gt;layout_mismatch = 1;</div><div class='del'>-</div><div class='del'>-			goto unlock;</div><div class='del'>-		}</div><div class='del'>-</div><div class='del'>-		if (is_dir) {</div><div class='del'>-			ret = dht_layout_dir_mismatch (this, layout,</div><div class='del'>-						       prev-&gt;this, &amp;local-&gt;loc,</div><div class='del'>-						       xattr);</div><div class='del'>-			if (ret != 0) {</div><div class='del'>-				gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-					"mismatching layouts for %s", </div><div class='del'>-					local-&gt;loc.path);</div><div class='del'>-			</div><div class='del'>-				local-&gt;layout_mismatch = 1;</div><div class='del'>-</div><div class='del'>-				goto unlock;</div><div class='del'>-			}</div><div class='del'>-		} </div><div class='del'>-		</div><div class='del'>-		dht_iatt_merge (this, &amp;local-&gt;stbuf, stbuf, prev-&gt;this);</div><div class='del'>-                dht_iatt_merge (this, &amp;local-&gt;postparent, postparent,</div><div class='del'>-                                prev-&gt;this);</div><div class='del'>-		</div><div class='del'>-		local-&gt;op_ret = 0;</div><div class='del'>-		local-&gt;stbuf.ia_ino = local-&gt;ia_ino;</div><div class='del'>-</div><div class='del'>-                if (local-&gt;loc.parent)</div><div class='del'>-                        local-&gt;postparent.ia_ino = local-&gt;loc.parent-&gt;ino;</div><div class='del'>-</div><div class='del'>-		if (!local-&gt;xattr)</div><div class='del'>-			local-&gt;xattr = dict_ref (xattr);</div><div class='del'>-	}</div><div class='del'>-unlock:</div><div class='del'>-	UNLOCK (&amp;frame-&gt;lock);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("dht", frame, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("dht", this, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("dht", frame-&gt;local, out);</div><div class='ctx'> </div><div class='del'>-        this_call_cnt = dht_frame_return (frame);</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    conf = this-&gt;private;</div><div class='add'>+    ret = op_ret;</div><div class='ctx'> </div><div class='del'>-        if (is_last_call (this_call_cnt)) {</div><div class='del'>-		if (!IA_ISDIR (local-&gt;stbuf.ia_type)</div><div class='del'>-		    &amp;&amp; (local-&gt;hashed_subvol != local-&gt;cached_subvol)</div><div class='del'>-		    &amp;&amp; (local-&gt;stbuf.ia_nlink == 1)</div><div class='del'>-		    &amp;&amp; (conf-&gt;unhashed_sticky_bit)) {</div><div class='del'>-			local-&gt;stbuf.ia_prot.sticky = 1;</div><div class='del'>-		}</div><div class='add'>+    FRAME_SU_UNDO(frame, dht_local_t);</div><div class='ctx'> </div><div class='del'>-		if (local-&gt;layout_mismatch) {</div><div class='del'>-			local-&gt;op_ret = -1;</div><div class='del'>-			local-&gt;op_errno = ESTALE;</div><div class='del'>-		}</div><div class='add'>+    if (ret == 0) {</div><div class='add'>+        layout = local-&gt;selfheal.layout;</div><div class='add'>+        ret = dht_layout_set(this, local-&gt;inode, layout);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-                WIPE (&amp;local-&gt;postparent);</div><div class='add'>+    dht_inode_ctx_time_update(local-&gt;inode, this, &amp;local-&gt;stbuf, 1);</div><div class='add'>+    if (local-&gt;loc.parent) {</div><div class='add'>+        dht_inode_ctx_time_update(local-&gt;loc.parent, this, &amp;local-&gt;postparent,</div><div class='add'>+                                  1);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-		DHT_STACK_UNWIND (lookup, frame, local-&gt;op_ret, local-&gt;op_errno,</div><div class='del'>-				  local-&gt;inode, &amp;local-&gt;stbuf, local-&gt;xattr,</div><div class='del'>-                                  &amp;local-&gt;postparent);</div><div class='del'>-	}</div><div class='add'>+    DHT_STRIP_PHASE1_FLAGS(&amp;local-&gt;stbuf);</div><div class='add'>+    dht_set_fixed_dir_stat(&amp;local-&gt;postparent);</div><div class='add'>+    /* Delete mds xattr at the time of STACK UNWIND */</div><div class='add'>+    GF_REMOVE_INTERNAL_XATTR(conf-&gt;mds_xattr_key, local-&gt;xattr);</div><div class='ctx'> </div><div class='del'>-        return 0;</div><div class='add'>+    DHT_STACK_UNWIND(lookup, frame, ret, local-&gt;op_errno, local-&gt;inode,</div><div class='add'>+                     &amp;local-&gt;stbuf, local-&gt;xattr, &amp;local-&gt;postparent);</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+static int</div><div class='add'>+dht_discover_complete(xlator_t *this, call_frame_t *discover_frame)</div><div class='add'>+{</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    dht_local_t *heal_local = NULL;</div><div class='add'>+    call_frame_t *main_frame = NULL;</div><div class='add'>+    call_frame_t *heal_frame = NULL;</div><div class='add'>+    int op_errno = 0;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    dht_layout_t *layout = NULL;</div><div class='add'>+    dht_conf_t *conf = NULL;</div><div class='add'>+    uint32_t vol_commit_hash = 0;</div><div class='add'>+    xlator_t *source = NULL;</div><div class='add'>+    int heal_path = 0;</div><div class='add'>+    int error_while_marking_mds = 0;</div><div class='add'>+    int i = 0;</div><div class='add'>+    loc_t loc = {0};</div><div class='add'>+    int8_t is_read_only = 0, layout_anomalies = 0;</div><div class='add'>+    char gfid_local[GF_UUID_BUF_SIZE] = {0};</div><div class='add'>+</div><div class='add'>+    local = discover_frame-&gt;local;</div><div class='add'>+    layout = local-&gt;layout;</div><div class='add'>+    conf = this-&gt;private;</div><div class='add'>+    gf_uuid_unparse(local-&gt;gfid, gfid_local);</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;discover_frame-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        main_frame = local-&gt;main_frame;</div><div class='add'>+        local-&gt;main_frame = NULL;</div><div class='add'>+    }</div><div class='add'>+    UNLOCK(&amp;discover_frame-&gt;lock);</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-dht_lookup_linkfile_create_cbk (call_frame_t *frame, void *cookie,</div><div class='del'>-				xlator_t *this,</div><div class='del'>-				int32_t op_ret, int32_t op_errno,</div><div class='del'>-                                inode_t *inode, struct iatt *stbuf,</div><div class='del'>-                                struct iatt *preparent, struct iatt *postparent)</div><div class='del'>-{</div><div class='del'>-	dht_local_t  *local = NULL;</div><div class='del'>-	xlator_t     *cached_subvol = NULL;</div><div class='del'>-	dht_conf_t   *conf = NULL;</div><div class='del'>-        int           ret = -1;</div><div class='del'>-</div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-	cached_subvol = local-&gt;cached_subvol;</div><div class='del'>-	conf = this-&gt;private;</div><div class='del'>-</div><div class='del'>-        ret = dht_layout_preset (this, local-&gt;cached_subvol, inode);</div><div class='add'>+    if (!main_frame)</div><div class='add'>+        return 0;</div><div class='add'>+</div><div class='add'>+    /* Code to update all extended attributed from</div><div class='add'>+       subvol to local-&gt;xattr on that internal xattr has found</div><div class='add'>+    */</div><div class='add'>+    if (conf-&gt;subvolume_cnt == 1)</div><div class='add'>+        local-&gt;need_xattr_heal = 0;</div><div class='add'>+    if (local-&gt;need_xattr_heal &amp;&amp; (local-&gt;mds_xattr)) {</div><div class='add'>+        dht_dir_set_heal_xattr(this, local, local-&gt;xattr, local-&gt;mds_xattr,</div><div class='add'>+                               NULL, NULL);</div><div class='add'>+        dict_unref(local-&gt;mds_xattr);</div><div class='add'>+        local-&gt;mds_xattr = NULL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_get_int8(local-&gt;xattr_req, QUOTA_READ_ONLY_KEY, &amp;is_read_only);</div><div class='add'>+    if (ret &lt; 0)</div><div class='add'>+        gf_msg_debug(this-&gt;name, 0, "key = %s not present in dict",</div><div class='add'>+                     QUOTA_READ_ONLY_KEY);</div><div class='add'>+</div><div class='add'>+    if (local-&gt;file_count &amp;&amp; local-&gt;dir_count) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_ERROR, 0, DHT_MSG_FILE_TYPE_MISMATCH,</div><div class='add'>+               "path %s exists as a file on one subvolume "</div><div class='add'>+               "and directory on another. "</div><div class='add'>+               "Please fix it manually",</div><div class='add'>+               local-&gt;loc.path);</div><div class='add'>+        op_errno = EIO;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (local-&gt;cached_subvol) {</div><div class='add'>+        ret = dht_layout_preset(this, local-&gt;cached_subvol, local-&gt;inode);</div><div class='ctx'>         if (ret &lt; 0) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-                        "failed to set layout for subvolume %s",</div><div class='del'>-                        cached_subvol ? cached_subvol-&gt;name : "&lt;nil&gt;");</div><div class='del'>-                local-&gt;op_ret = -1;</div><div class='del'>-                local-&gt;op_errno = EINVAL;</div><div class='del'>-                goto unwind;</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_WARNING, 0, DHT_MSG_LAYOUT_SET_FAILED,</div><div class='add'>+                   "failed to set layout for subvolume %s",</div><div class='add'>+                   local-&gt;cached_subvol ? local-&gt;cached_subvol-&gt;name : "&lt;nil&gt;");</div><div class='add'>+            op_errno = EINVAL;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    } else {</div><div class='add'>+        ret = dht_layout_normalize(this, &amp;local-&gt;loc, layout);</div><div class='add'>+        if ((ret &lt; 0) || ((ret &gt; 0) &amp;&amp; (local-&gt;op_ret != 0))) {</div><div class='add'>+            /* either the layout is incorrect or the directory is</div><div class='add'>+             * not found even in one subvolume.</div><div class='add'>+             */</div><div class='add'>+            gf_msg_debug(this-&gt;name, 0,</div><div class='add'>+                         "normalizing failed on %s "</div><div class='add'>+                         "(overlaps/holes present: %s, "</div><div class='add'>+                         "ENOENT errors: %d)",</div><div class='add'>+                         local-&gt;loc.path, (ret &lt; 0) ? "yes" : "no",</div><div class='add'>+                         (ret &gt; 0) ? ret : 0);</div><div class='add'>+            layout_anomalies = 1;</div><div class='add'>+        } else if (local-&gt;inode) {</div><div class='add'>+            dht_layout_set(this, local-&gt;inode, layout);</div><div class='ctx'>         }</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	local-&gt;op_ret = 0;</div><div class='del'>-	if ((local-&gt;stbuf.ia_nlink == 1)</div><div class='del'>-	    &amp;&amp; (conf-&gt;unhashed_sticky_bit)) {</div><div class='del'>-		local-&gt;stbuf.ia_prot.sticky = 1;</div><div class='del'>-	}</div><div class='add'>+    if (!conf-&gt;vch_forced) {</div><div class='add'>+        ret = dict_get_uint32(local-&gt;xattr, conf-&gt;commithash_xattr_name,</div><div class='add'>+                              &amp;vol_commit_hash);</div><div class='add'>+        if (ret == 0) {</div><div class='add'>+            conf-&gt;vol_commit_hash = vol_commit_hash;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        if (local-&gt;loc.parent)</div><div class='del'>-                local-&gt;postparent.ia_ino = local-&gt;loc.parent-&gt;ino;</div><div class='add'>+    if (IA_ISDIR(local-&gt;stbuf.ia_type) &amp;&amp; !is_read_only) {</div><div class='add'>+        for (i = 0; i &lt; layout-&gt;cnt; i++) {</div><div class='add'>+            if (!source &amp;&amp; !layout-&gt;list[i].err)</div><div class='add'>+                source = layout-&gt;list[i].xlator;</div><div class='add'>+            if (layout-&gt;list[i].err == ENOENT ||</div><div class='add'>+                layout-&gt;list[i].err == ESTALE) {</div><div class='add'>+                heal_path = 1;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            if (source &amp;&amp; heal_path)</div><div class='add'>+                break;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (IA_ISDIR(local-&gt;stbuf.ia_type)) {</div><div class='add'>+        /* Call function to save hashed subvol on inode ctx if</div><div class='add'>+           internal mds xattr is not present and all subvols are up</div><div class='add'>+        */</div><div class='add'>+        if (!local-&gt;op_ret &amp;&amp; !__is_root_gfid(local-&gt;stbuf.ia_gfid))</div><div class='add'>+            (void)dht_common_mark_mdsxattr(discover_frame,</div><div class='add'>+                                           &amp;error_while_marking_mds, 1);</div><div class='add'>+</div><div class='add'>+        if (local-&gt;need_xattr_heal &amp;&amp; !heal_path) {</div><div class='add'>+            local-&gt;need_xattr_heal = 0;</div><div class='add'>+            ret = dht_dir_xattr_heal(this, local, &amp;op_errno);</div><div class='add'>+            if (ret) {</div><div class='add'>+                gf_msg(this-&gt;name, GF_LOG_ERROR, op_errno,</div><div class='add'>+                       DHT_MSG_DIR_XATTR_HEAL_FAILED,</div><div class='add'>+                       "xattr heal failed for "</div><div class='add'>+                       "directory  gfid is %s ",</div><div class='add'>+                       gfid_local);</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-unwind:</div><div class='del'>-        WIPE (&amp;local-&gt;postparent);</div><div class='add'>+    if (source &amp;&amp; (heal_path || layout_anomalies || error_while_marking_mds)) {</div><div class='add'>+        gf_uuid_copy(loc.gfid, local-&gt;gfid);</div><div class='add'>+        if (gf_uuid_is_null(loc.gfid)) {</div><div class='add'>+            goto done;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        if (local-&gt;inode)</div><div class='add'>+            loc.inode = inode_ref(local-&gt;inode);</div><div class='add'>+        else</div><div class='add'>+            goto done;</div><div class='add'>+</div><div class='add'>+        heal_frame = create_frame(this, this-&gt;ctx-&gt;pool);</div><div class='add'>+        if (heal_frame) {</div><div class='add'>+            heal_local = dht_local_init(heal_frame, &amp;loc, NULL, 0);</div><div class='add'>+            if (!heal_local)</div><div class='add'>+                goto cleanup;</div><div class='add'>+</div><div class='add'>+            gf_uuid_copy(heal_local-&gt;gfid, local-&gt;gfid);</div><div class='add'>+            heal_frame-&gt;cookie = source;</div><div class='add'>+            heal_local-&gt;xattr = dict_ref(local-&gt;xattr);</div><div class='add'>+            heal_local-&gt;stbuf = local-&gt;stbuf;</div><div class='add'>+            heal_local-&gt;postparent = local-&gt;postparent;</div><div class='add'>+            heal_local-&gt;inode = inode_ref(loc.inode);</div><div class='add'>+            heal_local-&gt;main_frame = main_frame;</div><div class='add'>+            FRAME_SU_DO(heal_frame, dht_local_t);</div><div class='add'>+            ret = synctask_new(this-&gt;ctx-&gt;env, dht_heal_full_path,</div><div class='add'>+                               dht_heal_full_path_done, heal_frame, heal_frame);</div><div class='add'>+            if (!ret) {</div><div class='add'>+                loc_wipe(&amp;loc);</div><div class='add'>+                return 0;</div><div class='add'>+            }</div><div class='add'>+            /*</div><div class='add'>+             * Failed to spawn the synctask. Returning</div><div class='add'>+             * with out doing heal.</div><div class='add'>+             */</div><div class='add'>+        cleanup:</div><div class='add'>+            loc_wipe(&amp;loc);</div><div class='add'>+            DHT_STACK_DESTROY(heal_frame);</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+done:</div><div class='add'>+    dht_set_fixed_dir_stat(&amp;local-&gt;postparent);</div><div class='add'>+    /* Delete mds xattr at the time of STACK UNWIND */</div><div class='add'>+    if (local-&gt;xattr)</div><div class='add'>+        GF_REMOVE_INTERNAL_XATTR(conf-&gt;mds_xattr_key, local-&gt;xattr);</div><div class='add'>+</div><div class='add'>+    DHT_STACK_UNWIND(lookup, main_frame, local-&gt;op_ret, local-&gt;op_errno,</div><div class='add'>+                     local-&gt;inode, &amp;local-&gt;stbuf, local-&gt;xattr,</div><div class='add'>+                     &amp;local-&gt;postparent);</div><div class='add'>+    return 0;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    DHT_STACK_UNWIND(lookup, main_frame, -1, op_errno, NULL, NULL, NULL, NULL);</div><div class='ctx'> </div><div class='del'>-	DHT_STACK_UNWIND (lookup, frame, local-&gt;op_ret, local-&gt;op_errno,</div><div class='del'>-			  local-&gt;inode, &amp;local-&gt;stbuf, local-&gt;xattr,</div><div class='del'>-                          &amp;local-&gt;postparent);</div><div class='del'>-	return 0;</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+static int</div><div class='add'>+dht_common_mark_mdsxattr_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                             int op_ret, int op_errno, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    xlator_t *prev = cookie;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    dht_conf_t *conf = 0;</div><div class='add'>+    dht_layout_t *layout = NULL;</div><div class='add'>+    int32_t mds_heal_fresh_lookup = 0;</div><div class='add'>+</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, frame, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, frame-&gt;local, out);</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    conf = this-&gt;private;</div><div class='add'>+    layout = local-&gt;selfheal.layout;</div><div class='add'>+    mds_heal_fresh_lookup = local-&gt;mds_heal_fresh_lookup;</div><div class='add'>+</div><div class='add'>+    if (op_ret) {</div><div class='add'>+        gf_msg_debug(this-&gt;name, op_ret,</div><div class='add'>+                     "Failed to set %s on the MDS %s for path %s. ",</div><div class='add'>+                     conf-&gt;mds_xattr_key, prev-&gt;name, local-&gt;loc.path);</div><div class='add'>+    } else {</div><div class='add'>+        /* Save mds subvol on inode ctx */</div><div class='add'>+        ret = dht_inode_ctx_mdsvol_set(local-&gt;inode, this, prev);</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, 0, DHT_MSG_SET_INODE_CTX_FAILED,</div><div class='add'>+                   "Failed to set mds subvol on inode ctx"</div><div class='add'>+                   " %s for %s ",</div><div class='add'>+                   prev-&gt;name, local-&gt;loc.path);</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    if (!local-&gt;mds_heal_fresh_lookup &amp;&amp; layout) {</div><div class='add'>+        dht_selfheal_dir_setattr(frame, &amp;local-&gt;loc, &amp;local-&gt;stbuf, 0xffffffff,</div><div class='add'>+                                 layout);</div><div class='add'>+    }</div><div class='add'>+out:</div><div class='add'>+    if (mds_heal_fresh_lookup)</div><div class='add'>+        DHT_STACK_DESTROY(frame);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-dht_lookup_everywhere_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-			   int32_t op_ret, int32_t op_errno,</div><div class='del'>-                           inode_t *inode, struct iatt *buf, dict_t *xattr,</div><div class='del'>-                           struct iatt *postparent)</div><div class='del'>-{</div><div class='del'>-	dht_conf_t   *conf          = NULL;</div><div class='del'>-        dht_local_t  *local         = NULL;</div><div class='del'>-        int           this_call_cnt = 0;</div><div class='del'>-        call_frame_t *prev          = NULL;</div><div class='del'>-	int           is_linkfile   = 0;</div><div class='del'>-	int           is_dir        = 0;</div><div class='del'>-	xlator_t     *subvol        = NULL;</div><div class='del'>-	loc_t        *loc           = NULL;</div><div class='del'>-	xlator_t     *link_subvol   = NULL;</div><div class='del'>-	xlator_t     *hashed_subvol = NULL;</div><div class='del'>-	xlator_t     *cached_subvol = NULL;</div><div class='del'>-        int           ret = -1;</div><div class='del'>-</div><div class='del'>-	conf   = this-&gt;private;</div><div class='del'>-</div><div class='del'>-	local  = frame-&gt;local;</div><div class='del'>-	loc    = &amp;local-&gt;loc;</div><div class='del'>-</div><div class='del'>-	prev   = cookie;</div><div class='del'>-	subvol = prev-&gt;this;</div><div class='del'>-</div><div class='del'>-	LOCK (&amp;frame-&gt;lock);</div><div class='del'>-	{</div><div class='del'>-		if (op_ret == -1) {</div><div class='del'>-			if (op_errno != ENOENT)</div><div class='del'>-				local-&gt;op_errno = op_errno;</div><div class='del'>-			goto unlock;</div><div class='del'>-		}</div><div class='del'>-</div><div class='del'>-		is_linkfile = check_is_linkfile (inode, buf, xattr);</div><div class='del'>-		is_dir = check_is_dir (inode, buf, xattr);</div><div class='del'>-</div><div class='del'>-		if (is_linkfile) {</div><div class='del'>-			link_subvol = dht_linkfile_subvol (this, inode, buf,</div><div class='del'>-							   xattr);</div><div class='del'>-			gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-				"found on %s linkfile %s (-&gt; %s)",</div><div class='del'>-				subvol-&gt;name, loc-&gt;path,</div><div class='del'>-				link_subvol ? link_subvol-&gt;name : "''");</div><div class='del'>-			goto unlock;</div><div class='del'>-		}</div><div class='del'>-</div><div class='del'>-                if (is_dir) {</div><div class='del'>-                        local-&gt;dir_count++;</div><div class='del'>-</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-                                "found on %s directory %s",</div><div class='del'>-                                subvol-&gt;name, loc-&gt;path);</div><div class='del'>-                } else {</div><div class='del'>-                        local-&gt;file_count++;</div><div class='del'>-</div><div class='del'>-                        if (!local-&gt;cached_subvol) {</div><div class='del'>-                                /* found one file */</div><div class='del'>-                                dht_iatt_merge (this, &amp;local-&gt;stbuf, buf,</div><div class='del'>-                                                subvol);</div><div class='del'>-                                local-&gt;xattr = dict_ref (xattr);</div><div class='del'>-                                local-&gt;cached_subvol = subvol;</div><div class='del'>-                                gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-                                        "found on %s file %s",</div><div class='del'>-                                        subvol-&gt;name, loc-&gt;path);</div><div class='del'>-                                </div><div class='del'>-                                dht_iatt_merge (this, &amp;local-&gt;postparent,</div><div class='del'>-                                                postparent, subvol);</div><div class='del'>-                        } else {</div><div class='del'>-                                gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-                                        "multiple subvolumes (%s and %s) have "</div><div class='del'>-                                        "file %s", local-&gt;cached_subvol-&gt;name,</div><div class='del'>-                                        subvol-&gt;name, local-&gt;loc.path);</div><div class='del'>-                        }</div><div class='del'>-                }</div><div class='del'>-	}</div><div class='del'>-unlock:</div><div class='del'>-	UNLOCK (&amp;frame-&gt;lock);</div><div class='del'>-</div><div class='del'>-	if (is_linkfile) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-			"deleting stale linkfile %s on %s",</div><div class='del'>-			loc-&gt;path, subvol-&gt;name);</div><div class='del'>-		dht_linkfile_unlink (frame, this, subvol, loc);</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	this_call_cnt = dht_frame_return (frame);</div><div class='del'>-	if (is_last_call (this_call_cnt)) {</div><div class='del'>-		hashed_subvol = local-&gt;hashed_subvol;</div><div class='del'>-		cached_subvol = local-&gt;cached_subvol;</div><div class='del'>-</div><div class='del'>-                if (local-&gt;file_count &amp;&amp; local-&gt;dir_count) {</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-                                "path %s exists as a file on one subvolume " </div><div class='del'>-                                "and directory on another. "</div><div class='del'>-                                "Please fix it manually",</div><div class='del'>-                                loc-&gt;path);</div><div class='del'>-                        DHT_STACK_UNWIND (lookup, frame, -1, EIO, NULL, NULL, NULL,</div><div class='del'>-                                          NULL);</div><div class='del'>-                        return 0;</div><div class='del'>-                }</div><div class='add'>+static xlator_t *</div><div class='add'>+dht_inode_get_hashed_subvol(inode_t *inode, xlator_t *this, loc_t *loc)</div><div class='add'>+{</div><div class='add'>+    char *path = NULL;</div><div class='add'>+    loc_t populate_loc = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    char *name = NULL;</div><div class='add'>+    xlator_t *hash_subvol = NULL;</div><div class='add'>+</div><div class='add'>+    if (!inode)</div><div class='add'>+        return hash_subvol;</div><div class='add'>+</div><div class='add'>+    if (loc &amp;&amp; loc-&gt;parent &amp;&amp; loc-&gt;path) {</div><div class='add'>+        if (!loc-&gt;name) {</div><div class='add'>+            name = strrchr(loc-&gt;path, '/');</div><div class='add'>+            if (name) {</div><div class='add'>+                loc-&gt;name = name + 1;</div><div class='add'>+            } else {</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+        hash_subvol = dht_subvol_get_hashed(this, loc);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-                if (local-&gt;dir_count) {</div><div class='del'>-                        dht_lookup_directory (frame, this, &amp;local-&gt;loc);</div><div class='del'>-                        return 0;</div><div class='del'>-                }</div><div class='add'>+    if (!gf_uuid_is_null(inode-&gt;gfid)) {</div><div class='add'>+        populate_loc.inode = inode_ref(inode);</div><div class='add'>+        populate_loc.parent = inode_parent(populate_loc.inode, NULL, NULL);</div><div class='add'>+        inode_path(populate_loc.inode, NULL, &amp;path);</div><div class='ctx'> </div><div class='del'>-		if (!cached_subvol) {</div><div class='del'>-			DHT_STACK_UNWIND (lookup, frame, -1, ENOENT, NULL, NULL, NULL,</div><div class='del'>-                                          NULL);</div><div class='del'>-			return 0;</div><div class='del'>-		}</div><div class='del'>-</div><div class='del'>-                if (!hashed_subvol) {</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-                                "cannot create linkfile file for %s on %s: "</div><div class='del'>-                                "hashed subvolume cannot be found.",</div><div class='del'>-                                loc-&gt;path, cached_subvol-&gt;name);</div><div class='del'>-                        </div><div class='del'>-                        local-&gt;op_ret = 0;</div><div class='del'>-                        local-&gt;op_errno = 0;</div><div class='del'>-</div><div class='del'>-                        ret = dht_layout_preset (frame-&gt;this, cached_subvol,</div><div class='del'>-                                                 local-&gt;inode);</div><div class='del'>-                        if (ret &lt; 0) {</div><div class='del'>-                                gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-                                        "failed to set layout for subvol %s",</div><div class='del'>-                                        cached_subvol ? cached_subvol-&gt;name :</div><div class='del'>-                                        "&lt;nil&gt;");</div><div class='del'>-                                local-&gt;op_ret = -1;</div><div class='del'>-                                local-&gt;op_errno = EINVAL;</div><div class='del'>-                        }</div><div class='add'>+        if (!path)</div><div class='add'>+            goto out;</div><div class='ctx'> </div><div class='del'>-                        if (local-&gt;loc.parent)</div><div class='del'>-                                local-&gt;postparent.ia_ino =</div><div class='del'>-                                        local-&gt;loc.parent-&gt;ino;</div><div class='add'>+        populate_loc.path = path;</div><div class='add'>+        if (!populate_loc.name &amp;&amp; populate_loc.path) {</div><div class='add'>+            name = strrchr(populate_loc.path, '/');</div><div class='add'>+            if (name) {</div><div class='add'>+                populate_loc.name = name + 1;</div><div class='ctx'> </div><div class='del'>-                        WIPE (&amp;local-&gt;postparent);</div><div class='add'>+            } else {</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+        hash_subvol = dht_subvol_get_hashed(this, &amp;populate_loc);</div><div class='add'>+    }</div><div class='add'>+out:</div><div class='add'>+    if (populate_loc.inode)</div><div class='add'>+        loc_wipe(&amp;populate_loc);</div><div class='add'>+    return hash_subvol;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-                        DHT_STACK_UNWIND (lookup, frame, local-&gt;op_ret,</div><div class='del'>-                                          local-&gt;op_errno, local-&gt;inode,</div><div class='del'>-                                          &amp;local-&gt;stbuf, local-&gt;xattr,</div><div class='del'>-                                          &amp;local-&gt;postparent);</div><div class='del'>-                        return 0;</div><div class='add'>+/* Common function call by revalidate/selfheal code path to populate</div><div class='add'>+   internal xattr if it is not present, mark_during_fresh_lookup value</div><div class='add'>+   determines either function is call by revalidate_cbk(discover_complete)</div><div class='add'>+   or call by selfheal code path while fresh lookup.</div><div class='add'>+   Here we do wind a call serially in case of fresh lookup and</div><div class='add'>+   for other lookup code path we do wind a call parallel.The reason</div><div class='add'>+   to wind a call serially is at the time of fresh lookup directory is not</div><div class='add'>+   discovered and at the time of revalidate_lookup directory is</div><div class='add'>+   already discovered. So, revalidate codepath can race with setxattr</div><div class='add'>+   codepath and can get into spurious heals because of an ongoing setxattr.</div><div class='add'>+   This can slow down revalidates, if healing happens in foreground.</div><div class='add'>+   However, if healing happens in background, there is no direct performance</div><div class='add'>+   penalty.</div><div class='add'>+*/</div><div class='add'>+int</div><div class='add'>+dht_common_mark_mdsxattr(call_frame_t *frame, int *errst,</div><div class='add'>+                         int mark_during_fresh_lookup)</div><div class='add'>+{</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    xlator_t *this = NULL;</div><div class='add'>+    xlator_t *hashed_subvol = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    int i = 0;</div><div class='add'>+    dict_t *xattrs = NULL;</div><div class='add'>+    char gfid_local[GF_UUID_BUF_SIZE] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int32_t zero[1] = {0};</div><div class='add'>+    dht_conf_t *conf = 0;</div><div class='add'>+    dht_layout_t *layout = NULL;</div><div class='add'>+    dht_local_t *copy_local = NULL;</div><div class='add'>+    call_frame_t *xattr_frame = NULL;</div><div class='add'>+    gf_boolean_t vol_down = _gf_false;</div><div class='add'>+</div><div class='add'>+    GF_VALIDATE_OR_GOTO("dht", frame, out);</div><div class='add'>+    this = frame-&gt;this;</div><div class='add'>+    GF_VALIDATE_OR_GOTO("dht", this, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, frame-&gt;local, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, this-&gt;private, out);</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    conf = this-&gt;private;</div><div class='add'>+    layout = local-&gt;selfheal.layout;</div><div class='add'>+    local-&gt;mds_heal_fresh_lookup = mark_during_fresh_lookup;</div><div class='add'>+</div><div class='add'>+    gf_uuid_unparse(local-&gt;gfid, gfid_local);</div><div class='add'>+</div><div class='add'>+    /* Code to update hashed subvol consider as a mds subvol</div><div class='add'>+       and wind a setxattr call on hashed subvol to update</div><div class='add'>+       internal xattr</div><div class='add'>+    */</div><div class='add'>+    if (!local-&gt;xattr || !dict_get(local-&gt;xattr, conf-&gt;mds_xattr_key)) {</div><div class='add'>+        /* It means no internal MDS xattr has been set yet</div><div class='add'>+         */</div><div class='add'>+        /* Check the status of all subvol are up while call</div><div class='add'>+           this function call by lookup code path</div><div class='add'>+        */</div><div class='add'>+        if (mark_during_fresh_lookup) {</div><div class='add'>+            for (i = 0; i &lt; conf-&gt;subvolume_cnt; i++) {</div><div class='add'>+                if (!conf-&gt;subvolume_status[i]) {</div><div class='add'>+                    vol_down = _gf_true;</div><div class='add'>+                    break;</div><div class='ctx'>                 }</div><div class='add'>+            }</div><div class='add'>+            if (vol_down) {</div><div class='add'>+                gf_msg_debug(this-&gt;name, 0,</div><div class='add'>+                             "subvol %s is down. Unable to "</div><div class='add'>+                             " save mds subvol on inode for "</div><div class='add'>+                             " path %s gfid is %s ",</div><div class='add'>+                             conf-&gt;subvolumes[i]-&gt;name, local-&gt;loc.path,</div><div class='add'>+                             gfid_local);</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-                        "linking file %s existing on %s to %s (hash)",</div><div class='del'>-                        loc-&gt;path, cached_subvol-&gt;name,</div><div class='del'>-                        hashed_subvol-&gt;name);</div><div class='del'>-                        </div><div class='del'>-                dht_linkfile_create (frame, </div><div class='del'>-                                     dht_lookup_linkfile_create_cbk,</div><div class='del'>-                                     cached_subvol, hashed_subvol, loc);</div><div class='del'>-	}</div><div class='add'>+        /* Calculate hashed subvol based on inode and parent node</div><div class='add'>+         */</div><div class='add'>+        hashed_subvol = dht_inode_get_hashed_subvol(local-&gt;inode, this,</div><div class='add'>+                                                    &amp;local-&gt;loc);</div><div class='add'>+        if (!hashed_subvol) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_DEBUG, 0,</div><div class='add'>+                   DHT_MSG_HASHED_SUBVOL_GET_FAILED,</div><div class='add'>+                   "Failed to get hashed subvol for path %s"</div><div class='add'>+                   "gfid is %s ",</div><div class='add'>+                   local-&gt;loc.path, gfid_local);</div><div class='add'>+            if (errst)</div><div class='add'>+                (*errst) = 1;</div><div class='add'>+            ret = -1;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+        xattrs = dict_new();</div><div class='add'>+        if (!xattrs) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, ENOMEM, DHT_MSG_NO_MEMORY,</div><div class='add'>+                   "dict_new failed");</div><div class='add'>+            ret = -1;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+        /* Add internal MDS xattr on disk for hashed subvol</div><div class='add'>+         */</div><div class='add'>+        ret = dht_dict_set_array(xattrs, conf-&gt;mds_xattr_key, zero, 1);</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_WARNING, ENOMEM, DHT_MSG_DICT_SET_FAILED,</div><div class='add'>+                   "Failed to set dictionary"</div><div class='add'>+                   "  value:key = %s for "</div><div class='add'>+                   "path %s",</div><div class='add'>+                   conf-&gt;mds_xattr_key, local-&gt;loc.path);</div><div class='add'>+            ret = -1;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+        /* Create a new frame to wind a call only while</div><div class='add'>+           this function call by revalidate_cbk code path</div><div class='add'>+           To wind a call parallel need to create a new frame</div><div class='add'>+        */</div><div class='add'>+        if (mark_during_fresh_lookup) {</div><div class='add'>+            xattr_frame = create_frame(this, this-&gt;ctx-&gt;pool);</div><div class='add'>+            if (!xattr_frame) {</div><div class='add'>+                ret = -1;</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+            copy_local = dht_local_init(xattr_frame, &amp;(local-&gt;loc), NULL, 0);</div><div class='add'>+            if (!copy_local) {</div><div class='add'>+                ret = -1;</div><div class='add'>+                DHT_STACK_DESTROY(xattr_frame);</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+            copy_local-&gt;stbuf = local-&gt;stbuf;</div><div class='add'>+            copy_local-&gt;mds_heal_fresh_lookup = mark_during_fresh_lookup;</div><div class='add'>+            if (!copy_local-&gt;inode)</div><div class='add'>+                copy_local-&gt;inode = inode_ref(local-&gt;inode);</div><div class='add'>+            gf_uuid_copy(copy_local-&gt;loc.gfid, local-&gt;gfid);</div><div class='add'>+            FRAME_SU_DO(xattr_frame, dht_local_t);</div><div class='add'>+            STACK_WIND_COOKIE(xattr_frame, dht_common_mark_mdsxattr_cbk,</div><div class='add'>+                              hashed_subvol, hashed_subvol,</div><div class='add'>+                              hashed_subvol-&gt;fops-&gt;setxattr, &amp;local-&gt;loc,</div><div class='add'>+                              xattrs, 0, NULL);</div><div class='add'>+        } else {</div><div class='add'>+            STACK_WIND_COOKIE(frame, dht_common_mark_mdsxattr_cbk,</div><div class='add'>+                              (void *)hashed_subvol, hashed_subvol,</div><div class='add'>+                              hashed_subvol-&gt;fops-&gt;setxattr, &amp;local-&gt;loc,</div><div class='add'>+                              xattrs, 0, NULL);</div><div class='add'>+        }</div><div class='add'>+    } else {</div><div class='add'>+        gf_msg_debug(this-&gt;name, 0,</div><div class='add'>+                     "internal xattr %s is present on subvol"</div><div class='add'>+                     "on path %s gfid is %s ",</div><div class='add'>+                     conf-&gt;mds_xattr_key, local-&gt;loc.path, gfid_local);</div><div class='add'>+        if (!mark_during_fresh_lookup)</div><div class='add'>+            dht_selfheal_dir_setattr(frame, &amp;local-&gt;loc, &amp;local-&gt;stbuf,</div><div class='add'>+                                     0xffffffff, layout);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	return 0;</div><div class='add'>+out:</div><div class='add'>+    if (xattrs)</div><div class='add'>+        dict_unref(xattrs);</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+/* Get the value of key from dict in the bytewise and save in array after</div><div class='add'>+   convert from network byte order to host byte order</div><div class='add'>+*/</div><div class='add'>+static int32_t</div><div class='add'>+dht_dict_get_array(dict_t *dict, char *key, int32_t value[], int32_t size,</div><div class='add'>+                   int *errst)</div><div class='add'>+{</div><div class='add'>+    void *ptr = NULL;</div><div class='add'>+    int32_t len = -1;</div><div class='add'>+    int32_t vindex = -1;</div><div class='add'>+    int32_t err = -1;</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    if (dict == NULL) {</div><div class='add'>+        (*errst) = -1;</div><div class='add'>+        return -EINVAL;</div><div class='add'>+    }</div><div class='add'>+    err = dict_get_ptr_and_len(dict, key, &amp;ptr, &amp;len);</div><div class='add'>+    if (err != 0) {</div><div class='add'>+        (*errst) = -1;</div><div class='add'>+        return err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (len != (size * sizeof(int32_t))) {</div><div class='add'>+        (*errst) = -1;</div><div class='add'>+        return -EINVAL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    for (vindex = 0; vindex &lt; size; vindex++) {</div><div class='add'>+        value[vindex] = ntoh32(*((int32_t *)ptr + vindex));</div><div class='add'>+        if (value[vindex] &lt; 0)</div><div class='add'>+            ret = -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-dht_lookup_everywhere (call_frame_t *frame, xlator_t *this, loc_t *loc)</div><div class='add'>+static int</div><div class='add'>+dht_discover_cbk(call_frame_t *frame, void *cookie, xlator_t *this, int op_ret,</div><div class='add'>+                 int op_errno, inode_t *inode, struct iatt *stbuf,</div><div class='add'>+                 dict_t *xattr, struct iatt *postparent)</div><div class='ctx'> {</div><div class='del'>-	dht_conf_t     *conf = NULL;</div><div class='del'>-	dht_local_t    *local = NULL;</div><div class='del'>-	int             i = 0;</div><div class='del'>-	int             call_cnt = 0;</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    int this_call_cnt = 0;</div><div class='add'>+    xlator_t *prev = NULL;</div><div class='add'>+    dht_layout_t *layout = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int is_dir = 0;</div><div class='add'>+    int32_t check_mds = 0;</div><div class='add'>+    int is_linkfile = 0;</div><div class='add'>+    int attempt_unwind = 0;</div><div class='add'>+    dht_conf_t *conf = 0;</div><div class='add'>+    char gfid_local[GF_UUID_BUF_SIZE] = {0};</div><div class='add'>+    char gfid_node[GF_UUID_BUF_SIZE] = {0};</div><div class='add'>+    int32_t mds_xattr_val[1] = {0};</div><div class='add'>+    int errst = 0;</div><div class='add'>+</div><div class='add'>+    GF_VALIDATE_OR_GOTO("dht", frame, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("dht", this, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("dht", frame-&gt;local, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("dht", this-&gt;private, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("dht", cookie, out);</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    prev = cookie;</div><div class='add'>+    conf = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    layout = local-&gt;layout;</div><div class='add'>+</div><div class='add'>+    /* Check if the gfid is different for file from other node */</div><div class='add'>+    if (!op_ret &amp;&amp; gf_uuid_compare(local-&gt;gfid, stbuf-&gt;ia_gfid)) {</div><div class='add'>+        gf_uuid_unparse(stbuf-&gt;ia_gfid, gfid_node);</div><div class='add'>+        gf_uuid_unparse(local-&gt;gfid, gfid_local);</div><div class='add'>+</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_WARNING, 0, DHT_MSG_GFID_MISMATCH,</div><div class='add'>+               "%s: gfid different on %s, gfid local = %s"</div><div class='add'>+               "gfid other = %s",</div><div class='add'>+               local-&gt;loc.path, prev-&gt;name, gfid_local, gfid_node);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;frame-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        /* TODO: assert equal mode on stbuf-&gt;st_mode and</div><div class='add'>+           local-&gt;stbuf-&gt;st_mode</div><div class='add'>+</div><div class='add'>+           else mkdir/chmod/chown and fix</div><div class='add'>+        */</div><div class='add'>+</div><div class='add'>+        ret = dht_layout_merge(this, layout, prev, op_ret, op_errno, xattr);</div><div class='add'>+        if (ret)</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_WARNING, 0, DHT_MSG_LAYOUT_MERGE_FAILED,</div><div class='add'>+                   "%s: failed to merge layouts for subvol %s", local-&gt;loc.path,</div><div class='add'>+                   prev-&gt;name);</div><div class='ctx'> </div><div class='del'>-	conf = this-&gt;private;</div><div class='del'>-	local = frame-&gt;local;</div><div class='add'>+        if (op_ret == -1) {</div><div class='add'>+            local-&gt;op_errno = op_errno;</div><div class='add'>+            gf_msg_debug(this-&gt;name, op_errno,</div><div class='add'>+                         "lookup of %s on %s returned error", local-&gt;loc.path,</div><div class='add'>+                         prev-&gt;name);</div><div class='ctx'> </div><div class='del'>-	call_cnt = conf-&gt;subvolume_cnt;</div><div class='del'>-	local-&gt;call_cnt = call_cnt;</div><div class='add'>+            goto unlock;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-	if (!local-&gt;inode)</div><div class='del'>-		local-&gt;inode = inode_ref (loc-&gt;inode);</div><div class='add'>+        is_linkfile = check_is_linkfile(inode, stbuf, xattr,</div><div class='add'>+                                        conf-&gt;link_xattr_name);</div><div class='add'>+        is_dir = check_is_dir(inode, stbuf, xattr);</div><div class='ctx'> </div><div class='del'>-	for (i = 0; i &lt; call_cnt; i++) {</div><div class='del'>-		STACK_WIND (frame, dht_lookup_everywhere_cbk,</div><div class='del'>-			    conf-&gt;subvolumes[i],</div><div class='del'>-			    conf-&gt;subvolumes[i]-&gt;fops-&gt;lookup,</div><div class='del'>-			    loc, local-&gt;xattr_req);</div><div class='del'>-	}</div><div class='add'>+        if (is_dir) {</div><div class='add'>+            local-&gt;dir_count++;</div><div class='add'>+        } else {</div><div class='add'>+            local-&gt;file_count++;</div><div class='add'>+</div><div class='add'>+            if (!is_linkfile &amp;&amp; !local-&gt;cached_subvol) {</div><div class='add'>+                /* real file */</div><div class='add'>+                /* Ok, we somehow managed to find a file on</div><div class='add'>+                 * more than one subvol. ignore this or we</div><div class='add'>+                 * will end up overwriting information while a</div><div class='add'>+                 * a thread is potentially unwinding from</div><div class='add'>+                 * dht_discover_complete</div><div class='add'>+                 */</div><div class='add'>+                local-&gt;cached_subvol = prev;</div><div class='add'>+                attempt_unwind = 1;</div><div class='add'>+            } else {</div><div class='add'>+                goto unlock;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='add'>+        local-&gt;op_ret = 0;</div><div class='ctx'> </div><div class='add'>+        if (local-&gt;xattr == NULL) {</div><div class='add'>+            local-&gt;xattr = dict_ref(xattr);</div><div class='add'>+        } else {</div><div class='add'>+            /* Don't aggregate for files. See BZ#1484709 */</div><div class='add'>+            if (is_dir)</div><div class='add'>+                dht_aggregate_xattr(local-&gt;xattr, xattr);</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-dht_lookup_linkfile_cbk (call_frame_t *frame, void *cookie,</div><div class='del'>-                         xlator_t *this, int op_ret, int op_errno,</div><div class='del'>-                         inode_t *inode, struct iatt *stbuf, dict_t *xattr,</div><div class='del'>-                         struct iatt *postparent)</div><div class='del'>-{</div><div class='del'>-        call_frame_t *prev          = NULL;</div><div class='del'>-	dht_local_t  *local         = NULL;</div><div class='del'>-	xlator_t     *subvol        = NULL;</div><div class='del'>-	loc_t        *loc           = NULL;</div><div class='del'>-	dht_conf_t   *conf          = NULL;</div><div class='del'>-        int           ret           = 0;</div><div class='del'>-</div><div class='del'>-        prev   = cookie;</div><div class='del'>-	subvol = prev-&gt;this;</div><div class='del'>-	conf   = this-&gt;private;</div><div class='del'>-	local  = frame-&gt;local;</div><div class='del'>-	loc    = &amp;local-&gt;loc;</div><div class='add'>+        if (local-&gt;inode == NULL)</div><div class='add'>+            local-&gt;inode = inode_ref(inode);</div><div class='ctx'> </div><div class='del'>-        if (op_ret == -1) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-			"lookup of %s on %s (following linkfile) failed (%s)",</div><div class='del'>-			local-&gt;loc.path, subvol-&gt;name, strerror (op_errno));</div><div class='del'>-                goto err;</div><div class='del'>-	}</div><div class='add'>+        dht_iatt_merge(this, &amp;local-&gt;stbuf, stbuf);</div><div class='add'>+        dht_iatt_merge(this, &amp;local-&gt;postparent, postparent);</div><div class='ctx'> </div><div class='del'>-        if (check_is_dir (inode, stbuf, xattr)) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-                        "lookup of %s on %s (following linkfile) reached dir",</div><div class='del'>-                        local-&gt;loc.path, subvol-&gt;name);</div><div class='del'>-                goto err;</div><div class='add'>+        if (!dict_get(xattr, conf-&gt;mds_xattr_key)) {</div><div class='add'>+            goto unlock;</div><div class='add'>+        } else {</div><div class='add'>+            gf_msg_debug(this-&gt;name, 0,</div><div class='add'>+                         "internal xattr %s is present on subvol"</div><div class='add'>+                         "on path %s gfid is %s ",</div><div class='add'>+                         conf-&gt;mds_xattr_key, local-&gt;loc.path, gfid_local);</div><div class='add'>+        }</div><div class='add'>+        check_mds = dht_dict_get_array(xattr, conf-&gt;mds_xattr_key,</div><div class='add'>+                                       mds_xattr_val, 1, &amp;errst);</div><div class='add'>+        /* save mds subvol on inode ctx */</div><div class='add'>+        ret = dht_inode_ctx_mdsvol_set(local-&gt;inode, this, prev);</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, 0, DHT_MSG_SET_INODE_CTX_FAILED,</div><div class='add'>+                   "Failed to set hashed subvol for %s vol is %s",</div><div class='add'>+                   local-&gt;loc.path, prev-&gt;name);</div><div class='ctx'>         }</div><div class='ctx'> </div><div class='del'>-        if (check_is_linkfile (inode, stbuf, xattr)) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-                        "lookup of %s on %s (following linkfile) reached link",</div><div class='del'>-                        local-&gt;loc.path, subvol-&gt;name);</div><div class='del'>-                goto err;</div><div class='add'>+        if ((check_mds &lt; 0) &amp;&amp; !errst) {</div><div class='add'>+            local-&gt;mds_xattr = dict_ref(xattr);</div><div class='add'>+            gf_msg_debug(this-&gt;name, 0,</div><div class='add'>+                         "Value of %s is not zero on mds subvol"</div><div class='add'>+                         "so xattr needs to be healed on non mds"</div><div class='add'>+                         " path is %s and vol name is %s "</div><div class='add'>+                         " gfid is %s",</div><div class='add'>+                         conf-&gt;mds_xattr_key, local-&gt;loc.path, prev-&gt;name,</div><div class='add'>+                         gfid_local);</div><div class='add'>+            local-&gt;need_xattr_heal = 1;</div><div class='add'>+            local-&gt;mds_subvol = prev;</div><div class='ctx'>         }</div><div class='add'>+    }</div><div class='add'>+unlock:</div><div class='add'>+    UNLOCK(&amp;frame-&gt;lock);</div><div class='add'>+out:</div><div class='add'>+    /* Make sure, the thread executing dht_discover_complete is the one</div><div class='add'>+     * which calls STACK_DESTROY (frame). In the case of "attempt_unwind",</div><div class='add'>+     * this makes sure that the thread don't call dht_frame_return, till</div><div class='add'>+     * call to dht_discover_complete is done.</div><div class='add'>+     */</div><div class='add'>+    if (attempt_unwind) {</div><div class='add'>+        dht_discover_complete(this, frame);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	if ((stbuf-&gt;ia_nlink == 1)</div><div class='del'>-	    &amp;&amp; (conf-&gt;unhashed_sticky_bit)) {</div><div class='del'>-		stbuf-&gt;ia_prot.sticky = 1;</div><div class='del'>-	}</div><div class='del'>-        dht_itransform (this, prev-&gt;this, stbuf-&gt;ia_ino, &amp;stbuf-&gt;ia_ino);</div><div class='del'>-        if (local-&gt;loc.parent)</div><div class='del'>-                postparent-&gt;ia_ino = local-&gt;loc.parent-&gt;ino;</div><div class='del'>-        </div><div class='del'>-	ret = dht_layout_preset (this, prev-&gt;this, inode);</div><div class='del'>-	if (ret &lt; 0) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-                        "failed to set layout for subvolume %s",</div><div class='del'>-                        prev-&gt;this-&gt;name);</div><div class='del'>-		op_ret   = -1;</div><div class='del'>-		op_errno = EINVAL;</div><div class='del'>-		goto out;</div><div class='del'>-	}</div><div class='add'>+    this_call_cnt = dht_frame_return(frame);</div><div class='ctx'> </div><div class='del'>-out:</div><div class='del'>-        WIPE (postparent);</div><div class='add'>+    if (is_last_call(this_call_cnt) &amp;&amp; !attempt_unwind) {</div><div class='add'>+        dht_discover_complete(this, frame);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        DHT_STACK_UNWIND (lookup, frame, op_ret, op_errno, inode, stbuf, xattr,</div><div class='del'>-                          postparent);</div><div class='add'>+    if (is_last_call(this_call_cnt))</div><div class='add'>+        DHT_STACK_DESTROY(frame);</div><div class='ctx'> </div><div class='del'>-        return 0;</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='add'>+static int</div><div class='add'>+dht_set_file_xattr_req(xlator_t *this, loc_t *loc, dict_t *xattr_req)</div><div class='add'>+{</div><div class='add'>+    int ret = -EINVAL;</div><div class='add'>+    dht_conf_t *conf = NULL;</div><div class='add'>+</div><div class='add'>+    conf = this-&gt;private;</div><div class='add'>+    if (!conf) {</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (!xattr_req) {</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Used to check whether this is a linkto file.</div><div class='add'>+     */</div><div class='add'>+    ret = dict_set_uint32(xattr_req, conf-&gt;link_xattr_name, 256);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_WARNING, ENOMEM, DHT_MSG_DICT_SET_FAILED,</div><div class='add'>+               "Failed to set dictionary value:key = %s for "</div><div class='add'>+               "path %s",</div><div class='add'>+               conf-&gt;link_xattr_name, loc-&gt;path);</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* This is used to make sure we don't unlink linkto files</div><div class='add'>+     * which are the target of an ongoing file migration.</div><div class='add'>+     */</div><div class='add'>+    ret = dict_set_uint32(xattr_req, GLUSTERFS_OPEN_FD_COUNT, 4);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_WARNING, ENOMEM, DHT_MSG_DICT_SET_FAILED,</div><div class='add'>+               "Failed to set dictionary value:key = %s for "</div><div class='add'>+               "path %s",</div><div class='add'>+               GLUSTERFS_OPEN_FD_COUNT, loc-&gt;path);</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='ctx'> err:</div><div class='del'>-        dht_lookup_everywhere (frame, this, loc);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        return 0;</div><div class='add'>+/* This is a gfid based nameless lookup. Without a name, the hashed subvol</div><div class='add'>+ * cannot be calculated so a lookup is sent to all subvols.</div><div class='add'>+ */</div><div class='add'>+static int</div><div class='add'>+dht_do_discover(call_frame_t *frame, xlator_t *this, loc_t *loc)</div><div class='add'>+{</div><div class='add'>+    int ret;</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    dht_conf_t *conf = NULL;</div><div class='add'>+    int call_cnt = 0;</div><div class='add'>+    int op_errno = EINVAL;</div><div class='add'>+    int i = 0;</div><div class='add'>+    call_frame_t *discover_frame = NULL;</div><div class='add'>+</div><div class='add'>+    conf = this-&gt;private;</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+</div><div class='add'>+    /* As we do not know if this is a file or directory, request</div><div class='add'>+     * both file and directory xattrs</div><div class='add'>+     */</div><div class='add'>+    ret = dht_set_file_xattr_req(this, loc, local-&gt;xattr_req);</div><div class='add'>+    if (ret) {</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dht_set_dir_xattr_req(this, loc, local-&gt;xattr_req);</div><div class='add'>+    if (ret) {</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (loc_is_root(loc)) {</div><div class='add'>+        /* Request the DHT commit hash xattr (trusted.glusterfs.dht.commithash)</div><div class='add'>+         * set on the brick root.</div><div class='add'>+         */</div><div class='add'>+        ret = dict_set_uint32(local-&gt;xattr_req, conf-&gt;commithash_xattr_name,</div><div class='add'>+                              sizeof(uint32_t));</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    call_cnt = conf-&gt;subvolume_cnt;</div><div class='add'>+    local-&gt;call_cnt = call_cnt;</div><div class='add'>+</div><div class='add'>+    local-&gt;layout = dht_layout_new(this, conf-&gt;subvolume_cnt);</div><div class='add'>+</div><div class='add'>+    if (!local-&gt;layout) {</div><div class='add'>+        op_errno = ENOMEM;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    gf_uuid_copy(local-&gt;gfid, loc-&gt;gfid);</div><div class='add'>+</div><div class='add'>+    discover_frame = copy_frame(frame);</div><div class='add'>+    if (!discover_frame) {</div><div class='add'>+        op_errno = ENOMEM;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    discover_frame-&gt;local = local;</div><div class='add'>+    frame-&gt;local = NULL;</div><div class='add'>+    local-&gt;main_frame = frame;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; call_cnt; i++) {</div><div class='add'>+        STACK_WIND_COOKIE(discover_frame, dht_discover_cbk, conf-&gt;subvolumes[i],</div><div class='add'>+                          conf-&gt;subvolumes[i],</div><div class='add'>+                          conf-&gt;subvolumes[i]-&gt;fops-&gt;lookup, &amp;local-&gt;loc,</div><div class='add'>+                          local-&gt;xattr_req);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+</div><div class='add'>+err:</div><div class='add'>+    DHT_STACK_UNWIND(lookup, frame, -1, op_errno, NULL, NULL, NULL, NULL);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+/* Code to call syntask to heal custom xattr from hashed subvol</div><div class='add'>+   to non hashed subvol</div><div class='add'>+*/</div><div class='add'>+int</div><div class='add'>+dht_dir_xattr_heal(xlator_t *this, dht_local_t *local, int *op_errno)</div><div class='add'>+{</div><div class='add'>+    dht_local_t *copy_local = NULL;</div><div class='add'>+    call_frame_t *copy = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    char gfid_local[GF_UUID_BUF_SIZE] = {0};</div><div class='add'>+</div><div class='add'>+    if (gf_uuid_is_null(local-&gt;gfid)) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_ERROR, 0, DHT_MSG_DIR_XATTR_HEAL_FAILED,</div><div class='add'>+               "No gfid exists for path %s "</div><div class='add'>+               "so healing xattr is not possible",</div><div class='add'>+               local-&gt;loc.path);</div><div class='add'>+        *op_errno = EIO;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    gf_uuid_unparse(local-&gt;gfid, gfid_local);</div><div class='add'>+    copy = create_frame(this, this-&gt;ctx-&gt;pool);</div><div class='add'>+    if (copy) {</div><div class='add'>+        copy_local = dht_local_init(copy, &amp;(local-&gt;loc), NULL, 0);</div><div class='add'>+        if (!copy_local) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, ENOMEM,</div><div class='add'>+                   DHT_MSG_DIR_XATTR_HEAL_FAILED,</div><div class='add'>+                   "Memory allocation failed "</div><div class='add'>+                   "for path %s gfid %s ",</div><div class='add'>+                   local-&gt;loc.path, gfid_local);</div><div class='add'>+            *op_errno = ENOMEM;</div><div class='add'>+            DHT_STACK_DESTROY(copy);</div><div class='add'>+        } else {</div><div class='add'>+            copy_local-&gt;stbuf = local-&gt;stbuf;</div><div class='add'>+            gf_uuid_copy(copy_local-&gt;loc.gfid, local-&gt;gfid);</div><div class='add'>+            copy_local-&gt;mds_subvol = local-&gt;mds_subvol;</div><div class='add'>+            FRAME_SU_DO(copy, dht_local_t);</div><div class='add'>+            ret = synctask_new(this-&gt;ctx-&gt;env, dht_dir_heal_xattrs,</div><div class='add'>+                               dht_dir_heal_xattrs_done, copy, copy);</div><div class='add'>+            if (ret) {</div><div class='add'>+                gf_msg(this-&gt;name, GF_LOG_ERROR, ENOMEM,</div><div class='add'>+                       DHT_MSG_DIR_XATTR_HEAL_FAILED,</div><div class='add'>+                       "Synctask creation failed to heal xattr "</div><div class='add'>+                       "for path %s gfid %s ",</div><div class='add'>+                       local-&gt;loc.path, gfid_local);</div><div class='add'>+                *op_errno = ENOMEM;</div><div class='add'>+                DHT_STACK_DESTROY(copy);</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+dht_needs_selfheal(call_frame_t *frame, xlator_t *this)</div><div class='add'>+{</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    dht_layout_t *layout = NULL;</div><div class='add'>+    int needs_selfheal = 0;</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    layout = local-&gt;layout;</div><div class='add'>+</div><div class='add'>+    if (local-&gt;need_attrheal || local-&gt;need_xattr_heal ||</div><div class='add'>+        local-&gt;need_selfheal) {</div><div class='add'>+        needs_selfheal = 1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dht_layout_normalize(this, &amp;local-&gt;loc, layout);</div><div class='add'>+</div><div class='add'>+    if (ret != 0) {</div><div class='add'>+        gf_msg_debug(this-&gt;name, 0, "fixing assignment on %s", local-&gt;loc.path);</div><div class='add'>+        needs_selfheal = 1;</div><div class='add'>+    }</div><div class='add'>+    return needs_selfheal;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+is_permission_different(ia_prot_t *prot1, ia_prot_t *prot2)</div><div class='add'>+{</div><div class='add'>+    if ((prot1-&gt;owner.read != prot2-&gt;owner.read) ||</div><div class='add'>+        (prot1-&gt;owner.write != prot2-&gt;owner.write) ||</div><div class='add'>+        (prot1-&gt;owner.exec != prot2-&gt;owner.exec) ||</div><div class='add'>+        (prot1-&gt;group.read != prot2-&gt;group.read) ||</div><div class='add'>+        (prot1-&gt;group.write != prot2-&gt;group.write) ||</div><div class='add'>+        (prot1-&gt;group.exec != prot2-&gt;group.exec) ||</div><div class='add'>+        (prot1-&gt;other.read != prot2-&gt;other.read) ||</div><div class='add'>+        (prot1-&gt;other.write != prot2-&gt;other.write) ||</div><div class='add'>+        (prot1-&gt;other.exec != prot2-&gt;other.exec) ||</div><div class='add'>+        (prot1-&gt;suid != prot2-&gt;suid) || (prot1-&gt;sgid != prot2-&gt;sgid) ||</div><div class='add'>+        (prot1-&gt;sticky != prot2-&gt;sticky)) {</div><div class='add'>+        return 1;</div><div class='add'>+    } else {</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-dht_lookup_directory (call_frame_t *frame, xlator_t *this, loc_t *loc)</div><div class='add'>+dht_lookup_dir_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                   int op_ret, int op_errno, inode_t *inode, struct iatt *stbuf,</div><div class='add'>+                   dict_t *xattr, struct iatt *postparent)</div><div class='ctx'> {</div><div class='del'>-        int           call_cnt = 0;</div><div class='del'>-        int           i = 0;</div><div class='del'>-        dht_conf_t   *conf = NULL;</div><div class='del'>-        dht_local_t  *local = NULL;</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    dht_conf_t *conf = NULL;</div><div class='add'>+    int this_call_cnt = 0;</div><div class='add'>+    xlator_t *prev = NULL;</div><div class='add'>+    dht_layout_t *layout = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int is_dir = 0;</div><div class='add'>+    int32_t check_mds = 0;</div><div class='add'>+    int errst = 0;</div><div class='add'>+    char gfid_local[GF_UUID_BUF_SIZE] = {0};</div><div class='add'>+    char gfid_node[GF_UUID_BUF_SIZE] = {0};</div><div class='add'>+    int32_t mds_xattr_val[1] = {0};</div><div class='add'>+</div><div class='add'>+    GF_VALIDATE_OR_GOTO("dht", frame, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("dht", this, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("dht", frame-&gt;local, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("dht", this-&gt;private, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("dht", cookie, out);</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    prev = cookie;</div><div class='add'>+    conf = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    layout = local-&gt;layout;</div><div class='add'>+    gf_msg_debug(this-&gt;name, op_errno,</div><div class='add'>+                 "%s: lookup on %s returned with op_ret = %d, op_errno = %d",</div><div class='add'>+                 local-&gt;loc.path, prev-&gt;name, op_ret, op_errno);</div><div class='add'>+</div><div class='add'>+    /* The first successful lookup*/</div><div class='add'>+    if (!op_ret &amp;&amp; gf_uuid_is_null(local-&gt;gfid)) {</div><div class='add'>+        memcpy(local-&gt;gfid, stbuf-&gt;ia_gfid, 16);</div><div class='add'>+    }</div><div class='add'>+    if (!gf_uuid_is_null(local-&gt;gfid)) {</div><div class='add'>+        gf_uuid_unparse(local-&gt;gfid, gfid_local);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Check if the gfid is different for file from other node */</div><div class='add'>+    if (!op_ret &amp;&amp; gf_uuid_compare(local-&gt;gfid, stbuf-&gt;ia_gfid)) {</div><div class='add'>+        gf_uuid_unparse(stbuf-&gt;ia_gfid, gfid_node);</div><div class='add'>+</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_WARNING, 0, DHT_MSG_GFID_MISMATCH,</div><div class='add'>+               "%s: gfid different on %s."</div><div class='add'>+               " gfid local = %s, gfid subvol = %s",</div><div class='add'>+               local-&gt;loc.path, prev-&gt;name, gfid_local, gfid_node);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;frame-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        /* TODO: assert equal mode on stbuf-&gt;st_mode and</div><div class='add'>+           local-&gt;stbuf-&gt;st_mode</div><div class='add'>+           else mkdir/chmod/chown and fix</div><div class='add'>+        */</div><div class='add'>+        ret = dht_layout_merge(this, layout, prev, op_ret, op_errno, xattr);</div><div class='ctx'> </div><div class='del'>-        conf = this-&gt;private;</div><div class='del'>-        local = frame-&gt;local;</div><div class='add'>+        if (op_ret == -1) {</div><div class='add'>+            local-&gt;op_errno = op_errno;</div><div class='ctx'> </div><div class='del'>-        call_cnt        = conf-&gt;subvolume_cnt;</div><div class='del'>-        local-&gt;call_cnt = call_cnt;</div><div class='del'>-		</div><div class='del'>-        local-&gt;layout = dht_layout_new (this, conf-&gt;subvolume_cnt);</div><div class='del'>-        if (!local-&gt;layout) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-                        "Out of memory");</div><div class='del'>-                DHT_STACK_UNWIND (lookup, frame, -1, ENOMEM, NULL, NULL, NULL, NULL);</div><div class='del'>-                return 0;</div><div class='add'>+            /* The GFID is missing on this subvol. Force a heal. */</div><div class='add'>+            if (op_errno == ENODATA) {</div><div class='add'>+                local-&gt;need_lookup_everywhere = 1;</div><div class='add'>+            }</div><div class='add'>+            goto unlock;</div><div class='ctx'>         }</div><div class='del'>-		</div><div class='del'>-        for (i = 0; i &lt; call_cnt; i++) {</div><div class='del'>-                STACK_WIND (frame, dht_lookup_dir_cbk,</div><div class='del'>-                            conf-&gt;subvolumes[i],</div><div class='del'>-                            conf-&gt;subvolumes[i]-&gt;fops-&gt;lookup,</div><div class='del'>-                            &amp;local-&gt;loc, local-&gt;xattr_req);</div><div class='add'>+</div><div class='add'>+        is_dir = check_is_dir(inode, stbuf, xattr);</div><div class='add'>+        if (!is_dir) {</div><div class='add'>+            gf_msg_debug(this-&gt;name, 0,</div><div class='add'>+                         "%s: lookup on %s returned non dir 0%o"</div><div class='add'>+                         "calling lookup_everywhere",</div><div class='add'>+                         local-&gt;loc.path, prev-&gt;name, stbuf-&gt;ia_type);</div><div class='add'>+</div><div class='add'>+            local-&gt;need_lookup_everywhere = 1;</div><div class='add'>+            goto unlock;</div><div class='ctx'>         }</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='ctx'> </div><div class='add'>+        local-&gt;op_ret = 0;</div><div class='add'>+        if (local-&gt;xattr == NULL) {</div><div class='add'>+            local-&gt;xattr = dict_ref(xattr);</div><div class='add'>+        } else {</div><div class='add'>+            dht_aggregate_xattr(local-&gt;xattr, xattr);</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-dht_lookup_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-                int op_ret, int op_errno,</div><div class='del'>-                inode_t *inode, struct iatt *stbuf, dict_t *xattr,</div><div class='del'>-                struct iatt *postparent)</div><div class='del'>-{</div><div class='del'>-        char          is_linkfile   = 0;</div><div class='del'>-        char          is_dir        = 0;</div><div class='del'>-        xlator_t     *subvol        = NULL;</div><div class='del'>-        dht_conf_t   *conf          = NULL;</div><div class='del'>-        dht_local_t  *local         = NULL;</div><div class='del'>-        loc_t        *loc           = NULL;</div><div class='del'>-        call_frame_t *prev          = NULL;</div><div class='del'>-        int           ret           = 0;</div><div class='del'>-        uint64_t      tmp_layout    = 0;</div><div class='del'>-        dht_layout_t *parent_layout = NULL;</div><div class='del'>-</div><div class='del'>-        conf  = this-&gt;private;</div><div class='del'>-</div><div class='del'>-        prev  = cookie;</div><div class='del'>-        local = frame-&gt;local;</div><div class='del'>-        loc   = &amp;local-&gt;loc;</div><div class='del'>-</div><div class='del'>-	if (ENTRY_MISSING (op_ret, op_errno)) {</div><div class='del'>-                if (conf-&gt;search_unhashed == GF_DHT_LOOKUP_UNHASHED_ON) {</div><div class='del'>-			local-&gt;op_errno = ENOENT;</div><div class='del'>-			dht_lookup_everywhere (frame, this, loc);</div><div class='del'>-			return 0;</div><div class='del'>-		}</div><div class='del'>-                if ((conf-&gt;search_unhashed == GF_DHT_LOOKUP_UNHASHED_AUTO) &amp;&amp;</div><div class='del'>-                    (loc-&gt;parent)) {</div><div class='del'>-                        ret = inode_ctx_get (loc-&gt;parent, this, &amp;tmp_layout);</div><div class='del'>-                        parent_layout = (dht_layout_t *)(long)tmp_layout;</div><div class='del'>-                        if (parent_layout-&gt;search_unhashed) {</div><div class='del'>-                                local-&gt;op_errno = ENOENT;</div><div class='del'>-                                dht_lookup_everywhere (frame, this, loc);</div><div class='del'>-                                return 0;</div><div class='del'>-                        }</div><div class='add'>+        if (__is_root_gfid(stbuf-&gt;ia_gfid)) {</div><div class='add'>+            ret = dht_dir_has_layout(xattr, conf-&gt;xattr_name);</div><div class='add'>+            if (ret &gt;= 0) {</div><div class='add'>+                if (is_greater_time(local-&gt;prebuf.ia_ctime,</div><div class='add'>+                                    local-&gt;prebuf.ia_ctime_nsec,</div><div class='add'>+                                    stbuf-&gt;ia_ctime, stbuf-&gt;ia_ctime_nsec)) {</div><div class='add'>+                    /* Choose source */</div><div class='add'>+                    local-&gt;prebuf.ia_gid = stbuf-&gt;ia_gid;</div><div class='add'>+                    local-&gt;prebuf.ia_uid = stbuf-&gt;ia_uid;</div><div class='add'>+</div><div class='add'>+                    local-&gt;prebuf.ia_ctime = stbuf-&gt;ia_ctime;</div><div class='add'>+                    local-&gt;prebuf.ia_ctime_nsec = stbuf-&gt;ia_ctime_nsec;</div><div class='add'>+                    local-&gt;prebuf.ia_prot = stbuf-&gt;ia_prot;</div><div class='ctx'>                 }</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>- 	if (op_ret == 0) {</div><div class='del'>- 		is_dir      = check_is_dir (inode, stbuf, xattr);</div><div class='del'>- 		if (is_dir) {</div><div class='del'>- 			local-&gt;inode = inode_ref (inode);</div><div class='del'>- 			local-&gt;xattr = dict_ref (xattr);</div><div class='del'>- 		}</div><div class='del'>- 	}</div><div class='del'>-</div><div class='del'>- 	if (is_dir || (op_ret == -1 &amp;&amp; op_errno == ENOTCONN)) {</div><div class='del'>-                dht_lookup_directory (frame, this, &amp;local-&gt;loc);</div><div class='del'>-                return 0;</div><div class='del'>- 	}</div><div class='del'>- </div><div class='del'>-        if (op_ret == -1)</div><div class='del'>-                goto out;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-        is_linkfile = check_is_linkfile (inode, stbuf, xattr);</div><div class='del'>-        is_dir      = check_is_dir (inode, stbuf, xattr);</div><div class='del'>-</div><div class='del'>-        if (!is_dir &amp;&amp; !is_linkfile) {</div><div class='del'>-                /* non-directory and not a linkfile */</div><div class='del'>-</div><div class='del'>-		dht_itransform (this, prev-&gt;this, stbuf-&gt;ia_ino,</div><div class='del'>-				&amp;stbuf-&gt;ia_ino);</div><div class='del'>-                if (loc-&gt;parent)</div><div class='del'>-                        postparent-&gt;ia_ino = loc-&gt;parent-&gt;ino;</div><div class='del'>-</div><div class='del'>-		ret = dht_layout_preset (this, prev-&gt;this, inode);</div><div class='del'>-		if (ret &lt; 0) {</div><div class='del'>-			gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-				"could not set pre-set layout for subvolume %s",</div><div class='del'>-				prev-&gt;this-&gt;name);</div><div class='del'>-			op_ret   = -1;</div><div class='del'>-			op_errno = EINVAL;</div><div class='del'>-			goto out;</div><div class='del'>-		}</div><div class='del'>-                goto out; </div><div class='del'>-	}</div><div class='add'>+        if (local-&gt;stbuf.ia_type != IA_INVAL) {</div><div class='add'>+            /* This is not the first subvol to respond</div><div class='add'>+             * Compare values to see if attrs need to be healed</div><div class='add'>+             */</div><div class='add'>+            if ((local-&gt;stbuf.ia_gid != stbuf-&gt;ia_gid) ||</div><div class='add'>+                (local-&gt;stbuf.ia_uid != stbuf-&gt;ia_uid) ||</div><div class='add'>+                (is_permission_different(&amp;local-&gt;stbuf.ia_prot,</div><div class='add'>+                                         &amp;stbuf-&gt;ia_prot))) {</div><div class='add'>+                local-&gt;need_attrheal = 1;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-        if (is_linkfile) {</div><div class='del'>-                subvol = dht_linkfile_subvol (this, inode, stbuf, xattr);</div><div class='del'>-</div><div class='del'>-                if (!subvol) {</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-                                "linkfile not having link subvolume. path=%s",</div><div class='del'>-                                loc-&gt;path);</div><div class='del'>-			dht_lookup_everywhere (frame, this, loc);</div><div class='del'>-			return 0;</div><div class='del'>-                }</div><div class='add'>+        if (local-&gt;inode == NULL)</div><div class='add'>+            local-&gt;inode = inode_ref(inode);</div><div class='add'>+</div><div class='add'>+        dht_iatt_merge(this, &amp;local-&gt;stbuf, stbuf);</div><div class='add'>+        dht_iatt_merge(this, &amp;local-&gt;postparent, postparent);</div><div class='ctx'> </div><div class='del'>-		STACK_WIND (frame, dht_lookup_linkfile_cbk,</div><div class='del'>-			    subvol, subvol-&gt;fops-&gt;lookup,</div><div class='del'>-			    &amp;local-&gt;loc, local-&gt;xattr_req);</div><div class='add'>+        if (!dict_get(xattr, conf-&gt;mds_xattr_key)) {</div><div class='add'>+            gf_msg_debug(this-&gt;name, 0,</div><div class='add'>+                         "%s: mds xattr %s is not present "</div><div class='add'>+                         "on %s(gfid = %s)",</div><div class='add'>+                         local-&gt;loc.path, conf-&gt;mds_xattr_key, prev-&gt;name,</div><div class='add'>+                         gfid_local);</div><div class='add'>+            goto unlock;</div><div class='ctx'>         }</div><div class='ctx'> </div><div class='del'>-        return 0;</div><div class='add'>+        /* Save the mds subvol info and stbuf. This is the value that will</div><div class='add'>+         * be used for healing</div><div class='add'>+         */</div><div class='add'>+        local-&gt;mds_subvol = prev;</div><div class='add'>+        local-&gt;mds_stbuf = *stbuf;</div><div class='ctx'> </div><div class='del'>-out:</div><div class='del'>-        /* </div><div class='del'>-         * FIXME: postparent-&gt;ia_size and postparent-&gt;st_blocks do not have </div><div class='del'>-         * correct values. since, postparent corresponds to a directory these </div><div class='del'>-         * two members should have values equal to sum of corresponding values</div><div class='del'>-         * from each of the subvolume. See dht_iatt_merge for reference.</div><div class='add'>+        /* Save mds subvol on inode ctx */</div><div class='add'>+</div><div class='add'>+        ret = dht_inode_ctx_mdsvol_set(local-&gt;inode, this, prev);</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, 0, DHT_MSG_SET_INODE_CTX_FAILED,</div><div class='add'>+                   "%s: Failed to set mds (%s)", local-&gt;loc.path, prev-&gt;name);</div><div class='add'>+        }</div><div class='add'>+        check_mds = dht_dict_get_array(xattr, conf-&gt;mds_xattr_key,</div><div class='add'>+                                       mds_xattr_val, 1, &amp;errst);</div><div class='add'>+        if ((check_mds &lt; 0) &amp;&amp; !errst) {</div><div class='add'>+            /* Check if xattrs need to be healed on the directories */</div><div class='add'>+            local-&gt;mds_xattr = dict_ref(xattr);</div><div class='add'>+            gf_msg_debug(this-&gt;name, 0,</div><div class='add'>+                         "%s: %s is not zero on %s. Xattrs need to be healed."</div><div class='add'>+                         "(gfid = %s)",</div><div class='add'>+                         local-&gt;loc.path, conf-&gt;mds_xattr_key, prev-&gt;name,</div><div class='add'>+                         gfid_local);</div><div class='add'>+            local-&gt;need_xattr_heal = 1;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+unlock:</div><div class='add'>+    UNLOCK(&amp;frame-&gt;lock);</div><div class='add'>+</div><div class='add'>+    this_call_cnt = dht_frame_return(frame);</div><div class='add'>+</div><div class='add'>+    if (is_last_call(this_call_cnt)) {</div><div class='add'>+        /* If the mds subvol is not set correctly*/</div><div class='add'>+        if (!__is_root_gfid(local-&gt;gfid) &amp;&amp;</div><div class='add'>+            (!dict_get(local-&gt;xattr, conf-&gt;mds_xattr_key))) {</div><div class='add'>+            local-&gt;need_selfheal = 1;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        /* No need to call xattr heal code if volume count is 1</div><div class='ctx'>          */</div><div class='add'>+        if (conf-&gt;subvolume_cnt == 1) {</div><div class='add'>+            local-&gt;need_xattr_heal = 0;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-        WIPE (postparent);</div><div class='add'>+        if (local-&gt;need_selfheal || local-&gt;need_lookup_everywhere) {</div><div class='add'>+            /* Set the gfid-req so posix will set the GFID*/</div><div class='add'>+            if (!gf_uuid_is_null(local-&gt;gfid)) {</div><div class='add'>+                /* Ok, this should _never_ happen */</div><div class='add'>+                ret = dict_set_static_bin(local-&gt;xattr_req, "gfid-req",</div><div class='add'>+                                          local-&gt;gfid, 16);</div><div class='add'>+            } else {</div><div class='add'>+                if (!gf_uuid_is_null(local-&gt;gfid_req))</div><div class='add'>+                    ret = dict_set_static_bin(local-&gt;xattr_req, "gfid-req",</div><div class='add'>+                                              local-&gt;gfid_req, 16);</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-        DHT_STACK_UNWIND (lookup, frame, op_ret, op_errno, inode, stbuf, xattr,</div><div class='del'>-                          postparent);</div><div class='del'>-        return 0;</div><div class='add'>+        if (local-&gt;need_lookup_everywhere) {</div><div class='add'>+            local-&gt;need_lookup_everywhere = 0;</div><div class='add'>+            dht_lookup_everywhere(frame, this, &amp;local-&gt;loc);</div><div class='add'>+            return 0;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        if (local-&gt;op_ret == 0) {</div><div class='add'>+            if (dht_needs_selfheal(frame, this)) {</div><div class='add'>+                goto selfheal;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            dht_layout_set(this, local-&gt;inode, layout);</div><div class='add'>+            if (local-&gt;inode) {</div><div class='add'>+                dht_inode_ctx_time_update(local-&gt;inode, this, &amp;local-&gt;stbuf, 1);</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            if (local-&gt;loc.parent) {</div><div class='add'>+                dht_inode_ctx_time_update(local-&gt;loc.parent, this,</div><div class='add'>+                                          &amp;local-&gt;postparent, 1);</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        DHT_STRIP_PHASE1_FLAGS(&amp;local-&gt;stbuf);</div><div class='add'>+        dht_set_fixed_dir_stat(&amp;local-&gt;postparent);</div><div class='add'>+        /* Delete mds xattr at the time of STACK UNWIND */</div><div class='add'>+        if (local-&gt;xattr)</div><div class='add'>+            GF_REMOVE_INTERNAL_XATTR(conf-&gt;mds_xattr_key, local-&gt;xattr);</div><div class='add'>+</div><div class='add'>+        DHT_STACK_UNWIND(lookup, frame, local-&gt;op_ret, local-&gt;op_errno,</div><div class='add'>+                         local-&gt;inode, &amp;local-&gt;stbuf, local-&gt;xattr,</div><div class='add'>+                         &amp;local-&gt;postparent);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+</div><div class='add'>+selfheal:</div><div class='add'>+    FRAME_SU_DO(frame, dht_local_t);</div><div class='add'>+    ret = dht_selfheal_directory(frame, dht_lookup_selfheal_cbk, &amp;local-&gt;loc,</div><div class='add'>+                                 layout);</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+static int</div><div class='add'>+dht_lookup_directory(call_frame_t *frame, xlator_t *this, loc_t *loc)</div><div class='add'>+{</div><div class='add'>+    int call_cnt = 0;</div><div class='add'>+    int i = 0;</div><div class='add'>+    dht_conf_t *conf = NULL;</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    GF_VALIDATE_OR_GOTO("dht", frame, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("dht", this, unwind);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("dht", frame-&gt;local, unwind);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("dht", this-&gt;private, unwind);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("dht", loc, unwind);</div><div class='add'>+</div><div class='add'>+    conf = this-&gt;private;</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+</div><div class='add'>+    call_cnt = conf-&gt;subvolume_cnt;</div><div class='add'>+    local-&gt;call_cnt = call_cnt;</div><div class='add'>+</div><div class='add'>+    local-&gt;layout = dht_layout_new(this, conf-&gt;subvolume_cnt);</div><div class='add'>+    if (!local-&gt;layout) {</div><div class='add'>+        goto unwind;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (local-&gt;xattr != NULL) {</div><div class='add'>+        dict_unref(local-&gt;xattr);</div><div class='add'>+        local-&gt;xattr = NULL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (!gf_uuid_is_null(local-&gt;gfid)) {</div><div class='add'>+        /* use this gfid in order to heal any missing ones */</div><div class='add'>+        ret = dict_set_gfuuid(local-&gt;xattr_req, "gfid-req", local-&gt;gfid, true);</div><div class='add'>+        if (ret)</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_WARNING, 0, DHT_MSG_DICT_SET_FAILED,</div><div class='add'>+                   "%s: Failed to set dictionary value:"</div><div class='add'>+                   " key = gfid-req",</div><div class='add'>+                   local-&gt;loc.path);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; call_cnt; i++) {</div><div class='add'>+        STACK_WIND_COOKIE(</div><div class='add'>+            frame, dht_lookup_dir_cbk, conf-&gt;subvolumes[i], conf-&gt;subvolumes[i],</div><div class='add'>+            conf-&gt;subvolumes[i]-&gt;fops-&gt;lookup, &amp;local-&gt;loc, local-&gt;xattr_req);</div><div class='add'>+    }</div><div class='add'>+    return 0;</div><div class='add'>+unwind:</div><div class='add'>+    DHT_STACK_UNWIND(lookup, frame, -1, ENOMEM, NULL, NULL, NULL, NULL);</div><div class='add'>+out:</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-dht_lookup (call_frame_t *frame, xlator_t *this,</div><div class='del'>-            loc_t *loc, dict_t *xattr_req)</div><div class='del'>-{</div><div class='del'>-        xlator_t     *subvol = NULL;</div><div class='del'>-        xlator_t     *hashed_subvol = NULL;</div><div class='del'>-        xlator_t     *cached_subvol = NULL;</div><div class='del'>-        dht_local_t  *local  = NULL;</div><div class='del'>-	dht_conf_t   *conf = NULL;</div><div class='del'>-        int           ret    = -1;</div><div class='del'>-        int           op_errno = -1;</div><div class='del'>-	dht_layout_t *layout = NULL;</div><div class='del'>-	int           i = 0;</div><div class='del'>-	int           call_cnt = 0;</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-        VALIDATE_OR_GOTO (frame, err);</div><div class='del'>-        VALIDATE_OR_GOTO (this, err);</div><div class='del'>-        VALIDATE_OR_GOTO (loc, err);</div><div class='del'>-        VALIDATE_OR_GOTO (loc-&gt;inode, err);</div><div class='del'>-        VALIDATE_OR_GOTO (loc-&gt;path, err);</div><div class='del'>-</div><div class='del'>-	conf = this-&gt;private;</div><div class='del'>-</div><div class='del'>-        local = dht_local_init (frame);</div><div class='del'>-	if (!local) {</div><div class='del'>-		op_errno = ENOMEM;</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-			"Out of memory");</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='del'>-        if (!dht_filter_loc_subvol_key (this, loc, &amp;local-&gt;loc,</div><div class='del'>-                                        &amp;hashed_subvol)) {</div><div class='del'>-                ret = loc_dup (loc, &amp;local-&gt;loc);</div><div class='del'>-                if (ret == -1) {</div><div class='del'>-                        op_errno = errno;</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-                                "copying location failed for path=%s",</div><div class='del'>-                                loc-&gt;path);</div><div class='del'>-                        goto err;</div><div class='add'>+dht_revalidate_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                   int op_ret, int op_errno, inode_t *inode, struct iatt *stbuf,</div><div class='add'>+                   dict_t *xattr, struct iatt *postparent)</div><div class='add'>+{</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    int this_call_cnt = 0;</div><div class='add'>+    xlator_t *prev = NULL;</div><div class='add'>+    dht_layout_t *layout = NULL;</div><div class='add'>+    dht_conf_t *conf = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int is_dir = 0;</div><div class='add'>+    int is_linkfile = 0;</div><div class='add'>+    int follow_link = 0;</div><div class='add'>+    char gfid[GF_UUID_BUF_SIZE] = {0};</div><div class='add'>+    uint32_t vol_commit_hash = 0;</div><div class='add'>+    xlator_t *subvol = NULL;</div><div class='add'>+    int32_t check_mds = 0;</div><div class='add'>+    int errst = 0, i = 0;</div><div class='add'>+    int32_t mds_xattr_val[1] = {0};</div><div class='add'>+</div><div class='add'>+    GF_VALIDATE_OR_GOTO("dht", frame, err);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("dht", this, err);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("dht", frame-&gt;local, err);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("dht", cookie, err);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("dht", this-&gt;private, err);</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    prev = cookie;</div><div class='add'>+    conf = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    if (!conf-&gt;vch_forced) {</div><div class='add'>+        /* Update the commithash value if available</div><div class='add'>+         */</div><div class='add'>+        ret = dict_get_uint32(xattr, conf-&gt;commithash_xattr_name,</div><div class='add'>+                              &amp;vol_commit_hash);</div><div class='add'>+        if (ret == 0) {</div><div class='add'>+            conf-&gt;vol_commit_hash = vol_commit_hash;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    gf_uuid_unparse(local-&gt;loc.gfid, gfid);</div><div class='add'>+</div><div class='add'>+    gf_msg_debug(this-&gt;name, op_errno,</div><div class='add'>+                 "%s: revalidate lookup on %s returned op_ret %d",</div><div class='add'>+                 local-&gt;loc.path, prev-&gt;name, op_ret);</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;frame-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        if (gf_uuid_is_null(local-&gt;gfid)) {</div><div class='add'>+            memcpy(local-&gt;gfid, local-&gt;loc.gfid, 16);</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        if (op_ret == -1) {</div><div class='add'>+            local-&gt;op_errno = op_errno;</div><div class='add'>+</div><div class='add'>+            if ((op_errno != ENOTCONN) &amp;&amp; (op_errno != ENOENT) &amp;&amp;</div><div class='add'>+                (op_errno != ESTALE)) {</div><div class='add'>+                gf_msg(this-&gt;name, GF_LOG_INFO, op_errno,</div><div class='add'>+                       DHT_MSG_REVALIDATE_CBK_INFO,</div><div class='add'>+                       "Revalidate: subvolume %s for %s "</div><div class='add'>+                       "(gfid = %s) returned -1",</div><div class='add'>+                       prev-&gt;name, local-&gt;loc.path, gfid);</div><div class='add'>+            }</div><div class='add'>+            if (op_errno == ESTALE) {</div><div class='add'>+                /* propagate the ESTALE to parent.</div><div class='add'>+                 * setting local-&gt;return_estale would send</div><div class='add'>+                 * ESTALE to parent. */</div><div class='add'>+                local-&gt;return_estale = 1;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            /* if it is ENOENT, we may have to do a</div><div class='add'>+             * 'lookup_everywhere()' to make sure</div><div class='add'>+             * the file is not migrated */</div><div class='add'>+            if (op_errno == ENOENT) {</div><div class='add'>+                if (IA_ISREG(local-&gt;loc.inode-&gt;ia_type)) {</div><div class='add'>+                    gf_msg_debug(this-&gt;name, 0,</div><div class='add'>+                                 "found ENOENT for %s. "</div><div class='add'>+                                 "Setting "</div><div class='add'>+                                 "need_lookup_everywhere"</div><div class='add'>+                                 " flag to 1",</div><div class='add'>+                                 local-&gt;loc.path);</div><div class='add'>+</div><div class='add'>+                    local-&gt;need_lookup_everywhere = 1;</div><div class='add'>+                } else if (IA_ISDIR(local-&gt;loc.inode-&gt;ia_type)) {</div><div class='add'>+                    layout = local-&gt;layout;</div><div class='add'>+                    for (i = 0; i &lt; layout-&gt;cnt; i++) {</div><div class='add'>+                        if (layout-&gt;list[i].xlator == prev) {</div><div class='add'>+                            layout-&gt;list[i].err = op_errno;</div><div class='add'>+                            break;</div><div class='add'>+                        }</div><div class='add'>+                    }</div><div class='add'>+</div><div class='add'>+                    local-&gt;need_selfheal = 1;</div><div class='ctx'>                 }</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            /* The GFID is missing on this subvol. Lookup everywhere to force a</div><div class='add'>+             * gfid heal</div><div class='add'>+             */</div><div class='add'>+            if ((op_errno == ENODATA) &amp;&amp;</div><div class='add'>+                (IA_ISDIR(local-&gt;loc.inode-&gt;ia_type))) {</div><div class='add'>+                local-&gt;need_lookup_everywhere = 1;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            goto unlock;</div><div class='ctx'>         }</div><div class='ctx'> </div><div class='del'>-	if (xattr_req) {</div><div class='del'>-		local-&gt;xattr_req = dict_ref (xattr_req);</div><div class='del'>-	} else {</div><div class='del'>-		local-&gt;xattr_req = dict_new ();</div><div class='del'>-	}</div><div class='add'>+        if ((!IA_ISINVAL(local-&gt;inode-&gt;ia_type)) &amp;&amp;</div><div class='add'>+            stbuf-&gt;ia_type != local-&gt;inode-&gt;ia_type) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_WARNING, 0, DHT_MSG_FILE_TYPE_MISMATCH,</div><div class='add'>+                   "mismatching filetypes 0%o v/s 0%o for %s,"</div><div class='add'>+                   " gfid = %s",</div><div class='add'>+                   (stbuf-&gt;ia_type), (local-&gt;inode-&gt;ia_type), local-&gt;loc.path,</div><div class='add'>+                   gfid);</div><div class='ctx'> </div><div class='del'>-        if (!hashed_subvol)</div><div class='del'>-                hashed_subvol = dht_subvol_get_hashed (this, loc);</div><div class='del'>-	cached_subvol = dht_subvol_get_cached (this, loc-&gt;inode);</div><div class='add'>+            local-&gt;op_ret = -1;</div><div class='add'>+            local-&gt;op_errno = EINVAL;</div><div class='ctx'> </div><div class='del'>-	local-&gt;cached_subvol = cached_subvol;</div><div class='del'>-	local-&gt;hashed_subvol = hashed_subvol;</div><div class='add'>+            goto unlock;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-        if (is_revalidate (loc)) {</div><div class='del'>-		local-&gt;layout = layout = dht_layout_get (this, loc-&gt;inode);</div><div class='add'>+        layout = local-&gt;layout;</div><div class='ctx'> </div><div class='del'>-                if (!layout) {</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-                                "revalidate without cache. path=%s",</div><div class='del'>-                                loc-&gt;path);</div><div class='del'>-                        op_errno = EINVAL;</div><div class='del'>-                        goto err;</div><div class='add'>+        is_dir = check_is_dir(inode, stbuf, xattr);</div><div class='add'>+        is_linkfile = check_is_linkfile(inode, stbuf, xattr,</div><div class='add'>+                                        conf-&gt;link_xattr_name);</div><div class='add'>+        if (is_linkfile) {</div><div class='add'>+            follow_link = 1;</div><div class='add'>+            goto unlock;</div><div class='add'>+        }</div><div class='add'>+        if (is_dir) {</div><div class='add'>+            ret = dht_dir_has_layout(xattr, conf-&gt;xattr_name);</div><div class='add'>+            if (ret &gt;= 0) {</div><div class='add'>+                if (is_greater_time(local-&gt;prebuf.ia_ctime,</div><div class='add'>+                                    local-&gt;prebuf.ia_ctime_nsec,</div><div class='add'>+                                    stbuf-&gt;ia_ctime, stbuf-&gt;ia_ctime_nsec)) {</div><div class='add'>+                    /* Choose source */</div><div class='add'>+                    local-&gt;prebuf.ia_gid = stbuf-&gt;ia_gid;</div><div class='add'>+                    local-&gt;prebuf.ia_uid = stbuf-&gt;ia_uid;</div><div class='add'>+</div><div class='add'>+                    local-&gt;prebuf.ia_ctime = stbuf-&gt;ia_ctime;</div><div class='add'>+                    local-&gt;prebuf.ia_ctime_nsec = stbuf-&gt;ia_ctime_nsec;</div><div class='add'>+</div><div class='add'>+                    if (__is_root_gfid(stbuf-&gt;ia_gfid))</div><div class='add'>+                        local-&gt;prebuf.ia_prot = stbuf-&gt;ia_prot;</div><div class='add'>+                }</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            if (local-&gt;stbuf.ia_type != IA_INVAL) {</div><div class='add'>+                if ((local-&gt;stbuf.ia_gid != stbuf-&gt;ia_gid) ||</div><div class='add'>+                    (local-&gt;stbuf.ia_uid != stbuf-&gt;ia_uid) ||</div><div class='add'>+                    is_permission_different(&amp;local-&gt;stbuf.ia_prot,</div><div class='add'>+                                            &amp;stbuf-&gt;ia_prot)) {</div><div class='add'>+                    local-&gt;need_attrheal = 1;</div><div class='add'>+                }</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            if (!dict_get(xattr, conf-&gt;mds_xattr_key)) {</div><div class='add'>+                gf_msg_debug(this-&gt;name, 0,</div><div class='add'>+                             "%s: internal xattr %s is not present"</div><div class='add'>+                             " on subvol %s(gfid is %s)",</div><div class='add'>+                             local-&gt;loc.path, conf-&gt;mds_xattr_key, prev-&gt;name,</div><div class='add'>+                             gfid);</div><div class='add'>+            } else {</div><div class='add'>+                check_mds = dht_dict_get_array(xattr, conf-&gt;mds_xattr_key,</div><div class='add'>+                                               mds_xattr_val, 1, &amp;errst);</div><div class='add'>+                local-&gt;mds_subvol = prev;</div><div class='add'>+                local-&gt;mds_stbuf.ia_gid = stbuf-&gt;ia_gid;</div><div class='add'>+                local-&gt;mds_stbuf.ia_uid = stbuf-&gt;ia_uid;</div><div class='add'>+                local-&gt;mds_stbuf.ia_prot = stbuf-&gt;ia_prot;</div><div class='add'>+</div><div class='add'>+                /* save mds subvol on inode ctx */</div><div class='add'>+                ret = dht_inode_ctx_mdsvol_set(local-&gt;inode, this, prev);</div><div class='add'>+                if (ret) {</div><div class='add'>+                    gf_msg(this-&gt;name, GF_LOG_ERROR, 0,</div><div class='add'>+                           DHT_MSG_SET_INODE_CTX_FAILED,</div><div class='add'>+                           "Failed to set MDS subvol for %s vol is %s",</div><div class='add'>+                           local-&gt;loc.path, prev-&gt;name);</div><div class='ctx'>                 }</div><div class='add'>+                if ((check_mds &lt; 0) &amp;&amp; !errst) {</div><div class='add'>+                    /* Check if xattrs need to be healed on the directory</div><div class='add'>+                     */</div><div class='add'>+                    local-&gt;mds_xattr = dict_ref(xattr);</div><div class='add'>+                    gf_msg_debug(this-&gt;name, 0,</div><div class='add'>+                                 "Value of %s is not zero on "</div><div class='add'>+                                 "hashed subvol so xattr needs to"</div><div class='add'>+                                 " be healed on non hashed"</div><div class='add'>+                                 " path is %s and vol name is %s "</div><div class='add'>+                                 " gfid is %s",</div><div class='add'>+                                 conf-&gt;mds_xattr_key, local-&gt;loc.path,</div><div class='add'>+                                 prev-&gt;name, gfid);</div><div class='add'>+                    local-&gt;need_xattr_heal = 1;</div><div class='add'>+                }</div><div class='add'>+            }</div><div class='add'>+            ret = dht_layout_dir_mismatch(this, layout, prev, &amp;local-&gt;loc,</div><div class='add'>+                                          xattr);</div><div class='add'>+            if (ret != 0) {</div><div class='add'>+                /* In memory layout does not match on-disk layout.</div><div class='add'>+                 */</div><div class='add'>+                gf_msg(this-&gt;name, GF_LOG_INFO, 0, DHT_MSG_LAYOUT_MISMATCH,</div><div class='add'>+                       "Mismatching layouts for %s, gfid = %s", local-&gt;loc.path,</div><div class='add'>+                       gfid);</div><div class='add'>+</div><div class='add'>+                local-&gt;layout_mismatch = 1;</div><div class='add'>+</div><div class='add'>+                goto unlock;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        gf_uuid_copy(local-&gt;stbuf.ia_gfid, stbuf-&gt;ia_gfid);</div><div class='add'>+        dht_iatt_merge(this, &amp;local-&gt;stbuf, stbuf);</div><div class='add'>+        dht_iatt_merge(this, &amp;local-&gt;postparent, postparent);</div><div class='ctx'> </div><div class='del'>-		if (layout-&gt;gen &amp;&amp; (layout-&gt;gen &lt; conf-&gt;gen)) {</div><div class='del'>-			gf_log (this-&gt;name, GF_LOG_TRACE,</div><div class='del'>-				"incomplete layout failure for path=%s",</div><div class='del'>-				loc-&gt;path);</div><div class='del'>-</div><div class='del'>-                        dht_layout_unref (this, local-&gt;layout);</div><div class='del'>-                        local-&gt;layout = NULL;</div><div class='del'>-			goto do_fresh_lookup;</div><div class='del'>-		}</div><div class='del'>-</div><div class='del'>-		local-&gt;inode    = inode_ref (loc-&gt;inode);</div><div class='del'>-		local-&gt;ia_ino   = loc-&gt;inode-&gt;ino;</div><div class='del'>-		</div><div class='del'>-		local-&gt;call_cnt = layout-&gt;cnt;</div><div class='del'>-		call_cnt = local-&gt;call_cnt;</div><div class='del'>-		</div><div class='del'>-		/* NOTE: we don't require 'trusted.glusterfs.dht.linkto' attribute,</div><div class='del'>-		 *       revalidates directly go to the cached-subvolume.</div><div class='del'>-		 */</div><div class='del'>-		ret = dict_set_uint32 (local-&gt;xattr_req, </div><div class='del'>-				       "trusted.glusterfs.dht", 4 * 4);</div><div class='del'>-</div><div class='del'>-		for (i = 0; i &lt; layout-&gt;cnt; i++) {</div><div class='del'>-			subvol = layout-&gt;list[i].xlator;</div><div class='del'>-			</div><div class='del'>-			STACK_WIND (frame, dht_revalidate_cbk,</div><div class='del'>-				    subvol, subvol-&gt;fops-&gt;lookup,</div><div class='del'>-				    &amp;local-&gt;loc, local-&gt;xattr_req);</div><div class='del'>-</div><div class='del'>-			if (!--call_cnt)</div><div class='del'>-				break;</div><div class='del'>-		}</div><div class='add'>+        local-&gt;op_ret = 0;</div><div class='add'>+</div><div class='add'>+        if (!local-&gt;xattr) {</div><div class='add'>+            local-&gt;xattr = dict_ref(xattr);</div><div class='add'>+        } else if (is_dir) {</div><div class='add'>+            dht_aggregate_xattr(local-&gt;xattr, xattr);</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+unlock:</div><div class='add'>+    UNLOCK(&amp;frame-&gt;lock);</div><div class='add'>+</div><div class='add'>+    if (follow_link) {</div><div class='add'>+        /* Found a linkto file. Follow it to see if the target file exists</div><div class='add'>+         */</div><div class='add'>+        gf_uuid_copy(local-&gt;gfid, stbuf-&gt;ia_gfid);</div><div class='add'>+</div><div class='add'>+        subvol = dht_linkfile_subvol(this, inode, stbuf, xattr);</div><div class='add'>+        if (!subvol) {</div><div class='add'>+            op_errno = ESTALE;</div><div class='add'>+            local-&gt;op_ret = -1;</div><div class='ctx'>         } else {</div><div class='del'>-        do_fresh_lookup:</div><div class='del'>-		/* TODO: remove the hard-coding */</div><div class='del'>-		ret = dict_set_uint32 (local-&gt;xattr_req, </div><div class='del'>-				       "trusted.glusterfs.dht", 4 * 4);</div><div class='del'>-</div><div class='del'>-		ret = dict_set_uint32 (local-&gt;xattr_req, </div><div class='del'>-				       "trusted.glusterfs.dht.linkto", 256);</div><div class='del'>-</div><div class='del'>-                if (!hashed_subvol) {</div><div class='del'>-			gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-				"no subvolume in layout for path=%s, "</div><div class='del'>-				"checking on all the subvols to see if "</div><div class='del'>-				"it is a directory", loc-&gt;path);</div><div class='del'>- 			call_cnt        = conf-&gt;subvolume_cnt;</div><div class='del'>- 			local-&gt;call_cnt = call_cnt;</div><div class='del'>- 			</div><div class='del'>- 			local-&gt;layout = dht_layout_new (this,</div><div class='del'>-                                                        conf-&gt;subvolume_cnt);</div><div class='del'>- 			if (!local-&gt;layout) {</div><div class='del'>- 				op_errno = ENOMEM;</div><div class='del'>- 				gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>- 					"Out of memory");</div><div class='del'>- 				goto err;</div><div class='del'>- 			}</div><div class='del'>-</div><div class='del'>-			for (i = 0; i &lt; call_cnt; i++) {</div><div class='del'>- 				STACK_WIND (frame, dht_lookup_dir_cbk,</div><div class='del'>- 					    conf-&gt;subvolumes[i],</div><div class='del'>- 					    conf-&gt;subvolumes[i]-&gt;fops-&gt;lookup,</div><div class='del'>- 					    &amp;local-&gt;loc, local-&gt;xattr_req);</div><div class='del'>- 			}</div><div class='del'>- 			return 0;</div><div class='add'>+            STACK_WIND_COOKIE(frame, dht_lookup_linkfile_cbk, subvol, subvol,</div><div class='add'>+                              subvol-&gt;fops-&gt;lookup, &amp;local-&gt;loc,</div><div class='add'>+                              local-&gt;xattr_req);</div><div class='add'>+            return 0;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    this_call_cnt = dht_frame_return(frame);</div><div class='add'>+</div><div class='add'>+    if (is_last_call(this_call_cnt)) {</div><div class='add'>+        if (!IA_ISDIR(local-&gt;stbuf.ia_type) &amp;&amp;</div><div class='add'>+            (local-&gt;hashed_subvol != local-&gt;cached_subvol) &amp;&amp;</div><div class='add'>+            (local-&gt;stbuf.ia_nlink == 1) &amp;&amp;</div><div class='add'>+            (conf &amp;&amp; conf-&gt;unhashed_sticky_bit)) {</div><div class='add'>+            local-&gt;stbuf.ia_prot.sticky = 1;</div><div class='add'>+        }</div><div class='add'>+        /* No need to call heal code if volume count is 1</div><div class='add'>+         */</div><div class='add'>+        if (conf-&gt;subvolume_cnt == 1)</div><div class='add'>+            local-&gt;need_xattr_heal = 0;</div><div class='add'>+</div><div class='add'>+        if (IA_ISDIR(local-&gt;stbuf.ia_type)) {</div><div class='add'>+            /* No mds xattr found. Trigger a heal to set it */</div><div class='add'>+            if (!__is_root_gfid(local-&gt;loc.inode-&gt;gfid) &amp;&amp;</div><div class='add'>+                (!dict_get(local-&gt;xattr, conf-&gt;mds_xattr_key)))</div><div class='add'>+                local-&gt;need_selfheal = 1;</div><div class='add'>+</div><div class='add'>+            if (dht_needs_selfheal(frame, this)) {</div><div class='add'>+                if (!__is_root_gfid(local-&gt;loc.inode-&gt;gfid)) {</div><div class='add'>+                    if (local-&gt;mds_subvol) {</div><div class='add'>+                        local-&gt;stbuf.ia_gid = local-&gt;mds_stbuf.ia_gid;</div><div class='add'>+                        local-&gt;stbuf.ia_uid = local-&gt;mds_stbuf.ia_uid;</div><div class='add'>+                        local-&gt;stbuf.ia_prot = local-&gt;mds_stbuf.ia_prot;</div><div class='add'>+                    }</div><div class='add'>+                } else {</div><div class='add'>+                    local-&gt;stbuf.ia_gid = local-&gt;prebuf.ia_gid;</div><div class='add'>+                    local-&gt;stbuf.ia_uid = local-&gt;prebuf.ia_uid;</div><div class='add'>+                    local-&gt;stbuf.ia_prot = local-&gt;prebuf.ia_prot;</div><div class='ctx'>                 }</div><div class='ctx'> </div><div class='del'>-                STACK_WIND (frame, dht_lookup_cbk,</div><div class='del'>-                            hashed_subvol, hashed_subvol-&gt;fops-&gt;lookup,</div><div class='del'>-                            loc, local-&gt;xattr_req);</div><div class='add'>+                layout = local-&gt;layout;</div><div class='add'>+                dht_selfheal_directory(frame, dht_lookup_selfheal_cbk,</div><div class='add'>+                                       &amp;local-&gt;loc, layout);</div><div class='add'>+                return 0;</div><div class='add'>+            }</div><div class='ctx'>         }</div><div class='ctx'> </div><div class='del'>-        return 0;</div><div class='add'>+        if (local-&gt;layout_mismatch) {</div><div class='add'>+            /* Found layout mismatch in the directory, need to</div><div class='add'>+               fix this in the inode context */</div><div class='add'>+            dht_layout_unref(this, local-&gt;layout);</div><div class='add'>+            local-&gt;layout = NULL;</div><div class='add'>+            dht_lookup_directory(frame, this, &amp;local-&gt;loc);</div><div class='add'>+            return 0;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        if (local-&gt;need_lookup_everywhere) {</div><div class='add'>+            /* As the current layout gave ENOENT error, we would</div><div class='add'>+               need a new layout */</div><div class='add'>+            dht_layout_unref(this, local-&gt;layout);</div><div class='add'>+            local-&gt;layout = NULL;</div><div class='add'>+</div><div class='add'>+            /* We know that current cached subvol is no longer</div><div class='add'>+               valid, get the new one */</div><div class='add'>+            local-&gt;cached_subvol = NULL;</div><div class='add'>+            if (local-&gt;xattr_req) {</div><div class='add'>+                if (!gf_uuid_is_null(local-&gt;gfid)) {</div><div class='add'>+                    ret = dict_set_static_bin(local-&gt;xattr_req, "gfid-req",</div><div class='add'>+                                              local-&gt;gfid, 16);</div><div class='add'>+                }</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            dht_lookup_everywhere(frame, this, &amp;local-&gt;loc);</div><div class='add'>+            return 0;</div><div class='add'>+        }</div><div class='add'>+        if (local-&gt;return_estale) {</div><div class='add'>+            local-&gt;op_ret = -1;</div><div class='add'>+            local-&gt;op_errno = ESTALE;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        if (local-&gt;loc.parent) {</div><div class='add'>+            dht_inode_ctx_time_update(local-&gt;loc.parent, this,</div><div class='add'>+                                      &amp;local-&gt;postparent, 1);</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        DHT_STRIP_PHASE1_FLAGS(&amp;local-&gt;stbuf);</div><div class='add'>+        dht_set_fixed_dir_stat(&amp;local-&gt;postparent);</div><div class='add'>+</div><div class='add'>+        /* local-&gt;stbuf is updated only from subvols which have a layout</div><div class='add'>+         * The reason is to avoid choosing attr heal source from newly</div><div class='add'>+         * added bricks. In case e.g we have only one subvol and for</div><div class='add'>+         * some reason layout is not present on it, then local-&gt;stbuf</div><div class='add'>+         * will be EINVAL. This is an indication that the subvols</div><div class='add'>+         * active in the cluster do not have layouts on disk.</div><div class='add'>+         * Unwind with ESTALE to trigger a fresh lookup */</div><div class='add'>+        if (is_dir &amp;&amp; local-&gt;stbuf.ia_type == IA_INVAL) {</div><div class='add'>+            local-&gt;op_ret = -1;</div><div class='add'>+            local-&gt;op_errno = ESTALE;</div><div class='add'>+        }</div><div class='add'>+        /* Delete mds xattr at the time of STACK UNWIND */</div><div class='add'>+        if (local-&gt;xattr)</div><div class='add'>+            GF_REMOVE_INTERNAL_XATTR(conf-&gt;mds_xattr_key, local-&gt;xattr);</div><div class='add'>+</div><div class='add'>+        DHT_STACK_UNWIND(lookup, frame, local-&gt;op_ret, local-&gt;op_errno,</div><div class='add'>+                         local-&gt;inode, &amp;local-&gt;stbuf, local-&gt;xattr,</div><div class='add'>+                         &amp;local-&gt;postparent);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='ctx'> err:</div><div class='del'>-	op_errno = (op_errno == -1) ? errno : op_errno;</div><div class='del'>-        DHT_STACK_UNWIND (lookup, frame, -1, op_errno, NULL, NULL, NULL, NULL);</div><div class='del'>-        return 0;</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+static int</div><div class='add'>+dht_lookup_linkfile_create_cbk(call_frame_t *frame, void *cooie, xlator_t *this,</div><div class='add'>+                               int32_t op_ret, int32_t op_errno, inode_t *inode,</div><div class='add'>+                               struct iatt *stbuf, struct iatt *preparent,</div><div class='add'>+                               struct iatt *postparent, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    xlator_t *cached_subvol = NULL;</div><div class='add'>+    dht_conf_t *conf = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    char gfid[GF_UUID_BUF_SIZE] = {0};</div><div class='add'>+</div><div class='add'>+    GF_VALIDATE_OR_GOTO("dht", frame, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("dht", this, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("dht", frame-&gt;local, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("dht", this-&gt;private, out);</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    cached_subvol = local-&gt;cached_subvol;</div><div class='add'>+    conf = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    gf_uuid_unparse(local-&gt;loc.gfid, gfid);</div><div class='add'>+</div><div class='add'>+    if (local-&gt;locked)</div><div class='add'>+        dht_unlock_namespace(frame, &amp;local-&gt;lock[0]);</div><div class='add'>+</div><div class='add'>+    ret = dht_layout_preset(this, local-&gt;cached_subvol, local-&gt;loc.inode);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        gf_msg_debug(this-&gt;name, EINVAL,</div><div class='add'>+                     "Failed to set layout for subvolume %s, "</div><div class='add'>+                     "(gfid = %s)",</div><div class='add'>+                     cached_subvol ? cached_subvol-&gt;name : "&lt;nil&gt;", gfid);</div><div class='add'>+        local-&gt;op_ret = -1;</div><div class='add'>+        local-&gt;op_errno = EINVAL;</div><div class='add'>+        goto unwind;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    local-&gt;op_ret = 0;</div><div class='add'>+    if ((local-&gt;stbuf.ia_nlink == 1) &amp;&amp; (conf &amp;&amp; conf-&gt;unhashed_sticky_bit)) {</div><div class='add'>+        local-&gt;stbuf.ia_prot.sticky = 1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (local-&gt;loc.parent) {</div><div class='add'>+        dht_inode_ctx_time_update(local-&gt;loc.parent, this, postparent, 1);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-dht_truncate_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-	      int op_ret, int op_errno, struct iatt *prebuf,</div><div class='del'>-              struct iatt *postbuf)</div><div class='del'>-{</div><div class='del'>-	dht_local_t  *local = NULL;</div><div class='del'>-	int           this_call_cnt = 0;</div><div class='del'>-	call_frame_t *prev = NULL;</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-	prev = cookie;</div><div class='del'>-</div><div class='del'>-	LOCK (&amp;frame-&gt;lock);</div><div class='del'>-	{</div><div class='del'>-		if (op_ret == -1) {</div><div class='del'>-			local-&gt;op_errno = op_errno;</div><div class='del'>-			gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-				"subvolume %s returned -1 (%s)",</div><div class='del'>-				prev-&gt;this-&gt;name, strerror (op_errno));</div><div class='del'>-			goto unlock;</div><div class='del'>-		}</div><div class='del'>-</div><div class='del'>-                dht_iatt_merge (this, &amp;local-&gt;prebuf, prebuf, prev-&gt;this);</div><div class='del'>-		dht_iatt_merge (this, &amp;local-&gt;stbuf, postbuf, prev-&gt;this);</div><div class='del'>-</div><div class='del'>-		if (local-&gt;inode) {</div><div class='del'>-			local-&gt;stbuf.ia_ino = local-&gt;inode-&gt;ino;</div><div class='del'>-                        local-&gt;prebuf.ia_ino = local-&gt;inode-&gt;ino;</div><div class='del'>-                }</div><div class='add'>+unwind:</div><div class='add'>+    gf_msg_debug(this-&gt;name, 0,</div><div class='add'>+                 "creation of linkto on hashed subvol:%s, "</div><div class='add'>+                 "returned with op_ret %d and op_errno %d: %s",</div><div class='add'>+                 local-&gt;hashed_subvol-&gt;name, op_ret, op_errno,</div><div class='add'>+                 uuid_utoa(local-&gt;loc.gfid));</div><div class='ctx'> </div><div class='del'>-		local-&gt;op_ret = 0;</div><div class='del'>-	}</div><div class='del'>-unlock:</div><div class='del'>-	UNLOCK (&amp;frame-&gt;lock);</div><div class='add'>+    if (local-&gt;linked == _gf_true)</div><div class='add'>+        dht_linkfile_attr_heal(frame, this);</div><div class='ctx'> </div><div class='del'>-	this_call_cnt = dht_frame_return (frame);</div><div class='del'>-	if (is_last_call (this_call_cnt))</div><div class='del'>-		DHT_STACK_UNWIND (truncate, frame, local-&gt;op_ret, local-&gt;op_errno,</div><div class='del'>-				  &amp;local-&gt;prebuf, &amp;local-&gt;stbuf);</div><div class='add'>+    dht_set_fixed_dir_stat(&amp;local-&gt;postparent);</div><div class='ctx'> </div><div class='del'>-        return 0;</div><div class='add'>+    DHT_STRIP_PHASE1_FLAGS(&amp;local-&gt;stbuf);</div><div class='add'>+    DHT_STACK_UNWIND(lookup, frame, local-&gt;op_ret, local-&gt;op_errno,</div><div class='add'>+                     local-&gt;inode, &amp;local-&gt;stbuf, local-&gt;xattr,</div><div class='add'>+                     &amp;local-&gt;postparent);</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+static int</div><div class='add'>+dht_lookup_unlink_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                      int op_ret, int op_errno, struct iatt *preparent,</div><div class='add'>+                      struct iatt *postparent, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    int this_call_cnt = 0;</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    const char *path = NULL;</div><div class='ctx'> </div><div class='add'>+    local = (dht_local_t *)frame-&gt;local;</div><div class='add'>+    path = local-&gt;loc.path;</div><div class='add'>+    FRAME_SU_UNDO(frame, dht_local_t);</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-dht_attr_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-	      int op_ret, int op_errno, struct iatt *stbuf)</div><div class='del'>-{</div><div class='del'>-	dht_local_t  *local = NULL;</div><div class='del'>-	int           this_call_cnt = 0;</div><div class='del'>-	call_frame_t *prev = NULL;</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-	prev = cookie;</div><div class='del'>-</div><div class='del'>-	LOCK (&amp;frame-&gt;lock);</div><div class='del'>-	{</div><div class='del'>-		if (op_ret == -1) {</div><div class='del'>-			local-&gt;op_errno = op_errno;</div><div class='del'>-			gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-				"subvolume %s returned -1 (%s)",</div><div class='del'>-				prev-&gt;this-&gt;name, strerror (op_errno));</div><div class='del'>-			goto unlock;</div><div class='del'>-		}</div><div class='del'>-</div><div class='del'>-		dht_iatt_merge (this, &amp;local-&gt;stbuf, stbuf, prev-&gt;this);</div><div class='del'>-		</div><div class='del'>-		if (local-&gt;inode)</div><div class='del'>-			local-&gt;stbuf.ia_ino = local-&gt;inode-&gt;ino;</div><div class='del'>-		local-&gt;op_ret = 0;</div><div class='del'>-	}</div><div class='del'>-unlock:</div><div class='del'>-	UNLOCK (&amp;frame-&gt;lock);</div><div class='add'>+    gf_msg(this-&gt;name, GF_LOG_INFO, 0, DHT_MSG_UNLINK_LOOKUP_INFO,</div><div class='add'>+           "lookup_unlink returned with "</div><div class='add'>+           "op_ret -&gt; %d and op-errno -&gt; %d for %s",</div><div class='add'>+           op_ret, op_errno, ((path == NULL) ? "null" : path));</div><div class='ctx'> </div><div class='del'>-	this_call_cnt = dht_frame_return (frame);</div><div class='del'>-	if (is_last_call (this_call_cnt))</div><div class='del'>-		DHT_STACK_UNWIND (stat, frame, local-&gt;op_ret, local-&gt;op_errno,</div><div class='del'>-				  &amp;local-&gt;stbuf);</div><div class='add'>+    this_call_cnt = dht_frame_return(frame);</div><div class='add'>+    if (is_last_call(this_call_cnt)) {</div><div class='add'>+        dht_lookup_everywhere_done(frame, this);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        return 0;</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-dht_stat (call_frame_t *frame, xlator_t *this,</div><div class='del'>-	  loc_t *loc)</div><div class='add'>+static int</div><div class='add'>+dht_lookup_unlink_of_false_linkto_cbk(call_frame_t *frame, void *cookie,</div><div class='add'>+                                      xlator_t *this, int op_ret, int op_errno,</div><div class='add'>+                                      struct iatt *preparent,</div><div class='add'>+                                      struct iatt *postparent, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-	xlator_t     *subvol = NULL;</div><div class='del'>-        int           op_errno = -1;</div><div class='del'>-	dht_local_t  *local = NULL;</div><div class='del'>-	dht_layout_t *layout = NULL;</div><div class='del'>-	int           i = 0;</div><div class='add'>+    int this_call_cnt = 0;</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    const char *path = NULL;</div><div class='ctx'> </div><div class='add'>+    local = (dht_local_t *)frame-&gt;local;</div><div class='add'>+    path = local-&gt;loc.path;</div><div class='ctx'> </div><div class='del'>-        VALIDATE_OR_GOTO (frame, err);</div><div class='del'>-        VALIDATE_OR_GOTO (this, err);</div><div class='del'>-        VALIDATE_OR_GOTO (loc, err);</div><div class='del'>-        VALIDATE_OR_GOTO (loc-&gt;inode, err);</div><div class='del'>-        VALIDATE_OR_GOTO (loc-&gt;path, err);</div><div class='add'>+    FRAME_SU_UNDO(frame, dht_local_t);</div><div class='ctx'> </div><div class='add'>+    gf_msg(this-&gt;name, GF_LOG_INFO, 0, DHT_MSG_UNLINK_LOOKUP_INFO,</div><div class='add'>+           "lookup_unlink returned with "</div><div class='add'>+           "op_ret -&gt; %d and op-errno -&gt; %d for %s",</div><div class='add'>+           op_ret, op_errno, ((path == NULL) ? "null" : path));</div><div class='ctx'> </div><div class='del'>-	local = dht_local_init (frame);</div><div class='del'>-	if (!local) {</div><div class='del'>-		op_errno = ENOMEM;</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-			"Out of memory");</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='add'>+    this_call_cnt = dht_frame_return(frame);</div><div class='add'>+    if (is_last_call(this_call_cnt)) {</div><div class='add'>+        if ((op_ret == 0) || ((op_errno != EBUSY) &amp;&amp; (op_errno != ENOTCONN))) {</div><div class='add'>+            dht_lookup_everywhere_done(frame, this);</div><div class='add'>+        } else {</div><div class='add'>+            /*When dht_lookup_everywhere is performed, one cached</div><div class='add'>+             *and one hashed file was found and hashed file does</div><div class='add'>+             *not point to the above mentioned cached node. So it</div><div class='add'>+             *was considered as stale and an unlink was performed.</div><div class='add'>+             *But unlink fails. So may be rebalance is in progress.</div><div class='add'>+             *now ideally we have two data-files. One obtained during</div><div class='add'>+             *lookup_everywhere and one where unlink-failed. So</div><div class='add'>+             *at this point in time we cannot decide which one to</div><div class='add'>+             *choose because there are chances of first cached</div><div class='add'>+             *file is truncated after rebalance and if it is chosen</div><div class='add'>+             *as cached node, application will fail. So return EIO.*/</div><div class='add'>+</div><div class='add'>+            if (op_errno == EBUSY) {</div><div class='add'>+                gf_msg(this-&gt;name, GF_LOG_ERROR, op_errno,</div><div class='add'>+                       DHT_MSG_UNLINK_FAILED,</div><div class='add'>+                       "Could not unlink the linkto file as "</div><div class='add'>+                       "either fd is open and/or linkto xattr "</div><div class='add'>+                       "is set for %s",</div><div class='add'>+                       ((path == NULL) ? "null" : path));</div><div class='add'>+            }</div><div class='add'>+            DHT_STACK_UNWIND(lookup, frame, -1, EIO, NULL, NULL, NULL, NULL);</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	local-&gt;layout = layout = dht_layout_get (this, loc-&gt;inode);</div><div class='del'>-	if (!layout) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-			"no layout for path=%s", loc-&gt;path);</div><div class='del'>-		op_errno = EINVAL;</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	local-&gt;inode = inode_ref (loc-&gt;inode);</div><div class='del'>-	local-&gt;call_cnt = layout-&gt;cnt;</div><div class='add'>+static int</div><div class='add'>+dht_lookup_unlink_stale_linkto_cbk(call_frame_t *frame, void *cookie,</div><div class='add'>+                                   xlator_t *this, int op_ret, int op_errno,</div><div class='add'>+                                   struct iatt *preparent,</div><div class='add'>+                                   struct iatt *postparent, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    const char *path = NULL;</div><div class='ctx'> </div><div class='del'>-	for (i = 0; i &lt; layout-&gt;cnt; i++) {</div><div class='del'>-		subvol = layout-&gt;list[i].xlator;</div><div class='add'>+    /* NOTE:</div><div class='add'>+     * If stale file unlink fails either there is an open-fd or is not an</div><div class='add'>+     * dht-linkto-file then posix_unlink returns EBUSY, which is overwritten</div><div class='add'>+     *  to ENOENT</div><div class='add'>+     */</div><div class='ctx'> </div><div class='del'>-		STACK_WIND (frame, dht_attr_cbk,</div><div class='del'>-			    subvol, subvol-&gt;fops-&gt;stat,</div><div class='del'>-			    loc);</div><div class='del'>-	}</div><div class='add'>+    local = frame-&gt;local;</div><div class='ctx'> </div><div class='del'>-	return 0;</div><div class='add'>+    if (local) {</div><div class='add'>+        FRAME_SU_UNDO(frame, dht_local_t);</div><div class='add'>+        if (local-&gt;loc.path)</div><div class='add'>+            path = local-&gt;loc.path;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-err:</div><div class='del'>-	op_errno = (op_errno == -1) ? errno : op_errno;</div><div class='del'>-	DHT_STACK_UNWIND (stat, frame, -1, op_errno, NULL);</div><div class='add'>+    gf_msg(this-&gt;name, GF_LOG_INFO, 0, DHT_MSG_UNLINK_LOOKUP_INFO,</div><div class='add'>+           "Returned with op_ret %d and "</div><div class='add'>+           "op_errno %d for %s",</div><div class='add'>+           op_ret, op_errno, ((path == NULL) ? "null" : path));</div><div class='add'>+</div><div class='add'>+    DHT_STACK_UNWIND(lookup, frame, -1, ENOENT, NULL, NULL, NULL, NULL);</div><div class='ctx'> </div><div class='del'>-	return 0;</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+static int</div><div class='add'>+dht_fill_dict_to_avoid_unlink_of_migrating_file(dict_t *dict)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-dht_fstat (call_frame_t *frame, xlator_t *this,</div><div class='del'>-	   fd_t *fd)</div><div class='del'>-{</div><div class='del'>-	xlator_t     *subvol = NULL;</div><div class='del'>-        int           op_errno = -1;</div><div class='del'>-	dht_local_t  *local = NULL;</div><div class='del'>-	dht_layout_t *layout = NULL;</div><div class='del'>-	int           i = 0;</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-        VALIDATE_OR_GOTO (frame, err);</div><div class='del'>-        VALIDATE_OR_GOTO (this, err);</div><div class='del'>-        VALIDATE_OR_GOTO (fd, err);</div><div class='del'>-</div><div class='del'>-	local = dht_local_init (frame);</div><div class='del'>-	if (!local) {</div><div class='del'>-		op_errno = ENOMEM;</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-			"Out of memory");</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	local-&gt;layout = layout = dht_layout_get (this, fd-&gt;inode);</div><div class='del'>-	if (!layout) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-			"no layout for fd=%p", fd);</div><div class='del'>-		op_errno = EINVAL;</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	local-&gt;inode    = inode_ref (fd-&gt;inode);</div><div class='del'>-	local-&gt;call_cnt = layout-&gt;cnt;;</div><div class='del'>-</div><div class='del'>-	for (i = 0; i &lt; layout-&gt;cnt; i++) {</div><div class='del'>-		subvol = layout-&gt;list[i].xlator;</div><div class='del'>-		STACK_WIND (frame, dht_attr_cbk,</div><div class='del'>-			    subvol, subvol-&gt;fops-&gt;fstat,</div><div class='del'>-			    fd);</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='add'>+    ret = dict_set_int32_sizen(dict, DHT_SKIP_NON_LINKTO_UNLINK, 1);</div><div class='ctx'> </div><div class='del'>-err:</div><div class='del'>-	op_errno = (op_errno == -1) ? errno : op_errno;</div><div class='del'>-	DHT_STACK_UNWIND (fstat, frame, -1, op_errno, NULL);</div><div class='add'>+    if (ret)</div><div class='add'>+        return -1;</div><div class='add'>+</div><div class='add'>+    ret = dict_set_int32_sizen(dict, DHT_SKIP_OPEN_FD_UNLINK, 1);</div><div class='ctx'> </div><div class='del'>-	return 0;</div><div class='add'>+    if (ret)</div><div class='add'>+        return -1;</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+static int32_t</div><div class='add'>+dht_linkfile_create_lookup_cbk(call_frame_t *frame, void *cookie,</div><div class='add'>+                               xlator_t *this, int32_t op_ret, int32_t op_errno,</div><div class='add'>+                               inode_t *inode, struct iatt *buf, dict_t *xdata,</div><div class='add'>+                               struct iatt *postparent)</div><div class='add'>+{</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    int call_cnt = 0, ret = 0;</div><div class='add'>+    xlator_t *subvol = NULL;</div><div class='add'>+    uuid_t gfid = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    char gfid_str[GF_UUID_BUF_SIZE] = {0};</div><div class='add'>+</div><div class='add'>+    subvol = cookie;</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+</div><div class='add'>+    if (subvol == local-&gt;hashed_subvol) {</div><div class='add'>+        if ((op_ret == 0) || (op_errno != ENOENT))</div><div class='add'>+            local-&gt;dont_create_linkto = _gf_true;</div><div class='add'>+    } else {</div><div class='add'>+        if (gf_uuid_is_null(local-&gt;gfid))</div><div class='add'>+            gf_uuid_copy(gfid, local-&gt;loc.gfid);</div><div class='add'>+        else</div><div class='add'>+            gf_uuid_copy(gfid, local-&gt;gfid);</div><div class='add'>+</div><div class='add'>+        if ((op_ret == 0) &amp;&amp; gf_uuid_compare(gfid, buf-&gt;ia_gfid)) {</div><div class='add'>+            gf_uuid_unparse(gfid, gfid_str);</div><div class='add'>+            gf_msg_debug(this-&gt;name, 0,</div><div class='add'>+                         "gfid (%s) different on cached subvol "</div><div class='add'>+                         "(%s) and looked up inode (%s), not "</div><div class='add'>+                         "creating linkto",</div><div class='add'>+                         uuid_utoa(buf-&gt;ia_gfid), subvol-&gt;name, gfid_str);</div><div class='add'>+            local-&gt;dont_create_linkto = _gf_true;</div><div class='add'>+        } else if (op_ret == -1) {</div><div class='add'>+            local-&gt;dont_create_linkto = _gf_true;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    call_cnt = dht_frame_return(frame);</div><div class='add'>+    if (is_last_call(call_cnt)) {</div><div class='add'>+        if (local-&gt;dont_create_linkto)</div><div class='add'>+            goto no_linkto;</div><div class='add'>+        else {</div><div class='add'>+            gf_msg_debug(this-&gt;name, 0,</div><div class='add'>+                         "Creating linkto file on %s(hash) to "</div><div class='add'>+                         "%s on %s (gfid = %s)",</div><div class='add'>+                         local-&gt;hashed_subvol-&gt;name, local-&gt;loc.path,</div><div class='add'>+                         local-&gt;cached_subvol-&gt;name, gfid_str);</div><div class='add'>+</div><div class='add'>+            ret = dht_linkfile_create(frame, dht_lookup_linkfile_create_cbk,</div><div class='add'>+                                      this, local-&gt;cached_subvol,</div><div class='add'>+                                      local-&gt;hashed_subvol, &amp;local-&gt;loc);</div><div class='add'>+</div><div class='add'>+            if (ret &lt; 0)</div><div class='add'>+                goto no_linkto;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-dht_truncate (call_frame_t *frame, xlator_t *this,</div><div class='del'>-	      loc_t *loc, off_t offset)</div><div class='add'>+    return 0;</div><div class='add'>+</div><div class='add'>+no_linkto:</div><div class='add'>+    gf_msg_debug(this-&gt;name, 0,</div><div class='add'>+                 "skipped linkto creation (path:%s) (gfid:%s) "</div><div class='add'>+                 "(hashed-subvol:%s) (cached-subvol:%s)",</div><div class='add'>+                 local-&gt;loc.path, gfid_str, local-&gt;hashed_subvol-&gt;name,</div><div class='add'>+                 local-&gt;cached_subvol-&gt;name);</div><div class='add'>+</div><div class='add'>+    dht_lookup_linkfile_create_cbk(frame, NULL, this, 0, 0, local-&gt;loc.inode,</div><div class='add'>+                                   &amp;local-&gt;stbuf, &amp;local-&gt;preparent,</div><div class='add'>+                                   &amp;local-&gt;postparent, local-&gt;xattr);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int32_t</div><div class='add'>+dht_call_lookup_linkfile_create(call_frame_t *frame, void *cookie,</div><div class='add'>+                                xlator_t *this, int32_t op_ret,</div><div class='add'>+                                int32_t op_errno, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-	xlator_t     *subvol = NULL;</div><div class='del'>-        int           op_errno = -1;</div><div class='del'>-	dht_local_t  *local = NULL;</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    char gfid[GF_UUID_BUF_SIZE] = {0};</div><div class='add'>+    int i = 0;</div><div class='add'>+    xlator_t *subvol = NULL;</div><div class='ctx'> </div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    if (gf_uuid_is_null(local-&gt;gfid))</div><div class='add'>+        gf_uuid_unparse(local-&gt;loc.gfid, gfid);</div><div class='add'>+    else</div><div class='add'>+        gf_uuid_unparse(local-&gt;gfid, gfid);</div><div class='ctx'> </div><div class='del'>-        VALIDATE_OR_GOTO (frame, err);</div><div class='del'>-        VALIDATE_OR_GOTO (this, err);</div><div class='del'>-        VALIDATE_OR_GOTO (loc, err);</div><div class='del'>-        VALIDATE_OR_GOTO (loc-&gt;inode, err);</div><div class='del'>-        VALIDATE_OR_GOTO (loc-&gt;path, err);</div><div class='add'>+    if (op_ret &lt; 0) {</div><div class='add'>+        gf_log(this-&gt;name, GF_LOG_WARNING,</div><div class='add'>+               "protecting namespace failed, skipping linkto "</div><div class='add'>+               "creation (path:%s)(gfid:%s)(hashed-subvol:%s)"</div><div class='add'>+               "(cached-subvol:%s)",</div><div class='add'>+               local-&gt;loc.path, gfid, local-&gt;hashed_subvol-&gt;name,</div><div class='add'>+               local-&gt;cached_subvol-&gt;name);</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	subvol = dht_subvol_get_cached (this, loc-&gt;inode);</div><div class='del'>-	if (!subvol) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-			"no cached subvolume for path=%s", loc-&gt;path);</div><div class='del'>-		op_errno = EINVAL;</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='add'>+    local-&gt;locked = _gf_true;</div><div class='ctx'> </div><div class='del'>-	local = dht_local_init (frame);</div><div class='del'>-	if (!local) {</div><div class='del'>-		op_errno = ENOMEM;</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-			"Out of memory");</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='add'>+    local-&gt;call_cnt = 2;</div><div class='ctx'> </div><div class='del'>-	local-&gt;inode = inode_ref (loc-&gt;inode);</div><div class='del'>-	local-&gt;call_cnt = 1;</div><div class='add'>+    for (i = 0; i &lt; 2; i++) {</div><div class='add'>+        subvol = (subvol == NULL) ? local-&gt;hashed_subvol : local-&gt;cached_subvol;</div><div class='ctx'> </div><div class='del'>-	STACK_WIND (frame, dht_truncate_cbk,</div><div class='del'>-		    subvol, subvol-&gt;fops-&gt;truncate,</div><div class='del'>-		    loc, offset);</div><div class='add'>+        STACK_WIND_COOKIE(frame, dht_linkfile_create_lookup_cbk, subvol, subvol,</div><div class='add'>+                          subvol-&gt;fops-&gt;lookup, &amp;local-&gt;loc, NULL);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	return 0;</div><div class='add'>+    return 0;</div><div class='ctx'> </div><div class='ctx'> err:</div><div class='del'>-	op_errno = (op_errno == -1) ? errno : op_errno;</div><div class='del'>-	DHT_STACK_UNWIND (truncate, frame, -1, op_errno, NULL, NULL);</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='add'>+    dht_lookup_linkfile_create_cbk(frame, NULL, this, 0, 0, local-&gt;loc.inode,</div><div class='add'>+                                   &amp;local-&gt;stbuf, &amp;local-&gt;preparent,</div><div class='add'>+                                   &amp;local-&gt;postparent, local-&gt;xattr);</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-dht_ftruncate (call_frame_t *frame, xlator_t *this,</div><div class='del'>-	       fd_t *fd, off_t offset)</div><div class='add'>+/* Rebalance is performed from cached_node to hashed_node. Initial cached_node</div><div class='add'>+ * contains a non-linkto file. After migration it is converted to linkto and</div><div class='add'>+ * then unlinked. And at hashed_subvolume, first a linkto file is present,</div><div class='add'>+ * then after migration it is converted to a non-linkto file.</div><div class='add'>+ *</div><div class='add'>+ * Lets assume a file is present on cached subvolume and a new brick is added</div><div class='add'>+ * and new brick is the new_hashed subvolume. So fresh lookup on newly added</div><div class='add'>+ * hashed subvolume will fail and dht_lookup_everywhere gets called.  If just</div><div class='add'>+ * before sending the dht_lookup_everywhere request rebalance is in progress,</div><div class='add'>+ *</div><div class='add'>+ * from cached subvolume it may see: Nonlinkto or linkto or No file</div><div class='add'>+ * from hashed subvolume it may see: No file or linkto file or non-linkto file</div><div class='add'>+ *</div><div class='add'>+ * So this boils down to 9 cases:</div><div class='add'>+ *   at cached_subvol            at hashed_subvol</div><div class='add'>+ *   ----------------           -----------------</div><div class='add'>+ *</div><div class='add'>+ *a)   No file                     No file</div><div class='add'>+ *    [request reached after    [Request reached before</div><div class='add'>+ *       migration]                Migration]</div><div class='add'>+ *</div><div class='add'>+ *b)   No file                     Linkto File</div><div class='add'>+ *</div><div class='add'>+ *c)   No file                     Non-Linkto File</div><div class='add'>+ *</div><div class='add'>+ *d)   Linkto                      No-File</div><div class='add'>+ *</div><div class='add'>+ *e)   Linkto                      Linkto</div><div class='add'>+ *</div><div class='add'>+ *f)   Linkto                      Non-Linkto</div><div class='add'>+ *</div><div class='add'>+ *g)   NonLinkto                   No-File</div><div class='add'>+ *</div><div class='add'>+ *h)   NonLinkto                   Linkto</div><div class='add'>+ *</div><div class='add'>+ *i)   NonLinkto                   NonLinkto</div><div class='add'>+ *</div><div class='add'>+ * dht_lookup_everywhere_done takes decision based on any of the above case</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+dht_lookup_everywhere_done(call_frame_t *frame, xlator_t *this)</div><div class='ctx'> {</div><div class='del'>-	xlator_t     *subvol = NULL;</div><div class='del'>-        int           op_errno = -1;</div><div class='del'>-	dht_local_t  *local = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    xlator_t *hashed_subvol = NULL;</div><div class='add'>+    xlator_t *cached_subvol = NULL;</div><div class='add'>+    dht_layout_t *layout = NULL;</div><div class='add'>+    char gfid[GF_UUID_BUF_SIZE] = {0};</div><div class='add'>+    gf_boolean_t found_non_linkto_on_hashed = _gf_false;</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    hashed_subvol = local-&gt;hashed_subvol;</div><div class='add'>+    cached_subvol = local-&gt;cached_subvol;</div><div class='add'>+</div><div class='add'>+    gf_uuid_unparse(local-&gt;loc.gfid, gfid);</div><div class='add'>+</div><div class='add'>+    if (local-&gt;file_count &amp;&amp; local-&gt;dir_count) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_ERROR, 0, DHT_MSG_FILE_TYPE_MISMATCH,</div><div class='add'>+               "path %s (gfid = %s)exists as a file on one "</div><div class='add'>+               "subvolume and directory on another. "</div><div class='add'>+               "Please fix it manually",</div><div class='add'>+               local-&gt;loc.path, gfid);</div><div class='add'>+        DHT_STACK_UNWIND(lookup, frame, -1, EIO, NULL, NULL, NULL, NULL);</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='add'>+    if (local-&gt;op_ret &amp;&amp; local-&gt;gfid_missing) {</div><div class='add'>+        if (gf_uuid_is_null(local-&gt;gfid_req)) {</div><div class='add'>+            DHT_STACK_UNWIND(lookup, frame, -1, ENODATA, NULL, NULL, NULL,</div><div class='add'>+                             NULL);</div><div class='add'>+            return 0;</div><div class='add'>+        }</div><div class='add'>+        /* A hack */</div><div class='add'>+        dht_lookup_directory(frame, this, &amp;local-&gt;loc);</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='add'>+    if (local-&gt;dir_count) {</div><div class='add'>+        dht_lookup_directory(frame, this, &amp;local-&gt;loc);</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    gf_msg_debug(this-&gt;name, 0,</div><div class='add'>+                 "STATUS: hashed_subvol %s "</div><div class='add'>+                 "cached_subvol %s",</div><div class='add'>+                 (hashed_subvol == NULL) ? "null" : hashed_subvol-&gt;name,</div><div class='add'>+                 (cached_subvol == NULL) ? "null" : cached_subvol-&gt;name);</div><div class='add'>+</div><div class='add'>+    if (!cached_subvol) {</div><div class='add'>+        if (local-&gt;skip_unlink.handle_valid_link &amp;&amp; hashed_subvol) {</div><div class='add'>+            /*Purpose of "DHT_SKIP_NON_LINKTO_UNLINK":</div><div class='add'>+             * If this lookup is performed by rebalance and this</div><div class='add'>+             * rebalance process detected hashed file and by</div><div class='add'>+             * the time it sends the lookup request to cached node,</div><div class='add'>+             * file got migrated and now at initial hashed_node,</div><div class='add'>+             * final migrated file is present. With current logic,</div><div class='add'>+             * because this process fails to find the cached_node,</div><div class='add'>+             * it will unlink the file at initial hashed_node.</div><div class='add'>+             *</div><div class='add'>+             * So we avoid this by setting key, and checking at the</div><div class='add'>+             * posix_unlink that unlink the file only if file is a</div><div class='add'>+             * linkto file and not a migrated_file.</div><div class='add'>+             */</div><div class='add'>+</div><div class='add'>+            ret = dht_fill_dict_to_avoid_unlink_of_migrating_file(</div><div class='add'>+                local-&gt;xattr_req);</div><div class='add'>+</div><div class='add'>+            if (ret) {</div><div class='add'>+                /* If for some reason, setting key in the dict</div><div class='add'>+                 * fails, return with ENOENT, as with respect to</div><div class='add'>+                 * this process, it detected only a stale link</div><div class='add'>+                 * file.</div><div class='add'>+                 *</div><div class='add'>+                 * Next lookup will delete it.</div><div class='add'>+                 *</div><div class='add'>+                 * Performing deletion of stale link file when</div><div class='add'>+                 * setting key in dict fails, may cause the data</div><div class='add'>+                 * loss because of the above mentioned race.</div><div class='add'>+                 */</div><div class='add'>+</div><div class='add'>+                DHT_STACK_UNWIND(lookup, frame, -1, ENOENT, NULL, NULL, NULL,</div><div class='add'>+                                 NULL);</div><div class='add'>+            } else {</div><div class='add'>+                local-&gt;skip_unlink.handle_valid_link = _gf_false;</div><div class='add'>+</div><div class='add'>+                gf_msg_debug(this-&gt;name, 0,</div><div class='add'>+                             "No Cached was found and "</div><div class='add'>+                             "unlink on hashed was skipped"</div><div class='add'>+                             " so performing now: %s",</div><div class='add'>+                             local-&gt;loc.path);</div><div class='add'>+                FRAME_SU_DO(frame, dht_local_t);</div><div class='add'>+                STACK_WIND(frame, dht_lookup_unlink_stale_linkto_cbk,</div><div class='add'>+                           hashed_subvol, hashed_subvol-&gt;fops-&gt;unlink,</div><div class='add'>+                           &amp;local-&gt;loc, 0, local-&gt;xattr_req);</div><div class='add'>+            }</div><div class='ctx'> </div><div class='del'>-        VALIDATE_OR_GOTO (frame, err);</div><div class='del'>-        VALIDATE_OR_GOTO (this, err);</div><div class='del'>-        VALIDATE_OR_GOTO (fd, err);</div><div class='add'>+        } else {</div><div class='add'>+            gf_msg_debug(this-&gt;name, 0,</div><div class='add'>+                         "There was no cached file and  "</div><div class='add'>+                         "unlink on hashed is not skipped %s",</div><div class='add'>+                         local-&gt;loc.path);</div><div class='ctx'> </div><div class='del'>-	subvol = dht_subvol_get_cached (this, fd-&gt;inode);</div><div class='del'>-	if (!subvol) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-			"no cached subvolume for fd=%p", fd);</div><div class='del'>-		op_errno = EINVAL;</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='add'>+            DHT_STACK_UNWIND(lookup, frame, -1, ENOENT, NULL, NULL, NULL, NULL);</div><div class='add'>+        }</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* At the time of dht_lookup, no file was found on hashed and that is</div><div class='add'>+     * why dht_lookup_everywhere is called, but by the time</div><div class='add'>+     * dht_lookup_everywhere</div><div class='add'>+     * reached to server, file might have already migrated. In that case we</div><div class='add'>+     * will find a migrated file at the hashed_node. In this case store the</div><div class='add'>+     * layout in context and return successfully.</div><div class='add'>+     */</div><div class='add'>+</div><div class='add'>+    if (hashed_subvol || local-&gt;need_lookup_everywhere) {</div><div class='add'>+        if (local-&gt;need_lookup_everywhere) {</div><div class='add'>+            found_non_linkto_on_hashed = _gf_true;</div><div class='add'>+</div><div class='add'>+        } else if ((local-&gt;file_count == 1) &amp;&amp;</div><div class='add'>+                   (hashed_subvol == cached_subvol)) {</div><div class='add'>+            gf_msg_debug(this-&gt;name, 0,</div><div class='add'>+                         "found cached file on hashed subvolume "</div><div class='add'>+                         "so store in context and return for %s",</div><div class='add'>+                         local-&gt;loc.path);</div><div class='add'>+</div><div class='add'>+            found_non_linkto_on_hashed = _gf_true;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-	local = dht_local_init (frame);</div><div class='del'>-	if (!local) {</div><div class='del'>-		op_errno = ENOMEM;</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-			"Out of memory");</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='add'>+        if (found_non_linkto_on_hashed)</div><div class='add'>+            goto preset_layout;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	local-&gt;inode = inode_ref (fd-&gt;inode);</div><div class='del'>-	local-&gt;call_cnt = 1;</div><div class='add'>+    if (hashed_subvol) {</div><div class='add'>+        if (local-&gt;skip_unlink.handle_valid_link == _gf_true) {</div><div class='add'>+            if (cached_subvol == local-&gt;skip_unlink.hash_links_to) {</div><div class='add'>+                if (gf_uuid_compare(local-&gt;skip_unlink.cached_gfid,</div><div class='add'>+                                    local-&gt;skip_unlink.hashed_gfid)) {</div><div class='add'>+                    /*GFID different, return error*/</div><div class='add'>+                    DHT_STACK_UNWIND(lookup, frame, -1, ESTALE, NULL, NULL,</div><div class='add'>+                                     NULL, NULL);</div><div class='ctx'> </div><div class='del'>-	STACK_WIND (frame, dht_truncate_cbk,</div><div class='del'>-		    subvol, subvol-&gt;fops-&gt;ftruncate,</div><div class='del'>-		    fd, offset);</div><div class='add'>+                    return 0;</div><div class='add'>+                }</div><div class='ctx'> </div><div class='del'>-	return 0;</div><div class='add'>+                ret = dht_layout_preset(this, cached_subvol, local-&gt;loc.inode);</div><div class='add'>+                if (ret) {</div><div class='add'>+                    gf_msg(this-&gt;name, GF_LOG_INFO, 0,</div><div class='add'>+                           DHT_MSG_LAYOUT_PRESET_FAILED,</div><div class='add'>+                           "Could not set pre-set layout "</div><div class='add'>+                           "for subvolume %s",</div><div class='add'>+                           cached_subvol-&gt;name);</div><div class='add'>+                }</div><div class='ctx'> </div><div class='del'>-err:</div><div class='del'>-	op_errno = (op_errno == -1) ? errno : op_errno;</div><div class='del'>-	DHT_STACK_UNWIND (ftruncate, frame, -1, op_errno, NULL, NULL);</div><div class='add'>+                local-&gt;op_ret = (ret == 0) ? ret : -1;</div><div class='add'>+                local-&gt;op_errno = (ret == 0) ? ret : EINVAL;</div><div class='ctx'> </div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='add'>+                /* Presence of local-&gt;cached_subvol validates</div><div class='add'>+                 * that lookup from cached node is successful</div><div class='add'>+                 */</div><div class='ctx'> </div><div class='add'>+                if (!local-&gt;op_ret &amp;&amp; local-&gt;loc.parent) {</div><div class='add'>+                    dht_inode_ctx_time_update(local-&gt;loc.parent, this,</div><div class='add'>+                                              &amp;local-&gt;postparent, 1);</div><div class='add'>+                }</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-dht_unlink_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-                int op_ret, int op_errno, struct iatt *preparent,</div><div class='del'>-                struct iatt *postparent)</div><div class='del'>-{</div><div class='del'>-	dht_local_t  *local = NULL;</div><div class='del'>-	call_frame_t *prev  = NULL;</div><div class='del'>-</div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-	prev  = cookie;</div><div class='del'>-</div><div class='del'>-	LOCK (&amp;frame-&gt;lock);</div><div class='del'>-	{</div><div class='del'>-		if (op_ret == -1) {</div><div class='del'>-                        local-&gt;op_ret   = -1;</div><div class='del'>-			local-&gt;op_errno = op_errno;</div><div class='del'>-			gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-				"subvolume %s returned -1 (%s)",</div><div class='del'>-				prev-&gt;this-&gt;name, strerror (op_errno));</div><div class='del'>-			goto unlock;</div><div class='del'>-		}</div><div class='del'>-</div><div class='del'>-                preparent-&gt;ia_ino = local-&gt;loc.parent-&gt;ino;</div><div class='del'>-                postparent-&gt;ia_ino = local-&gt;loc.parent-&gt;ino;</div><div class='del'>-		local-&gt;op_ret = 0;</div><div class='del'>-</div><div class='del'>-                local-&gt;postparent = *postparent;</div><div class='del'>-                local-&gt;preparent = *preparent;</div><div class='del'>-</div><div class='del'>-                WIPE (&amp;local-&gt;postparent);</div><div class='del'>-                WIPE (&amp;local-&gt;preparent);</div><div class='del'>-	}</div><div class='del'>-unlock:</div><div class='del'>-	UNLOCK (&amp;frame-&gt;lock);</div><div class='add'>+                gf_msg_debug(this-&gt;name, 0,</div><div class='add'>+                             "Skipped unlinking linkto file "</div><div class='add'>+                             "on the hashed subvolume. "</div><div class='add'>+                             "Returning success as it is a "</div><div class='add'>+                             "valid linkto file. Path:%s",</div><div class='add'>+                             local-&gt;loc.path);</div><div class='add'>+</div><div class='add'>+                goto unwind_hashed_and_cached;</div><div class='add'>+            } else {</div><div class='add'>+                local-&gt;skip_unlink.handle_valid_link = _gf_false;</div><div class='add'>+</div><div class='add'>+                gf_msg_debug(this-&gt;name, 0,</div><div class='add'>+                             "Linkto file found on hashed "</div><div class='add'>+                             "subvol "</div><div class='add'>+                             "and data file found on cached "</div><div class='add'>+                             "subvolume. But linkto points to "</div><div class='add'>+                             "different cached subvolume (%s) "</div><div class='add'>+                             "path %s",</div><div class='add'>+                             (local-&gt;skip_unlink.hash_links_to</div><div class='add'>+                                  ? local-&gt;skip_unlink.hash_links_to-&gt;name</div><div class='add'>+                                  : " &lt;nil&gt;"),</div><div class='add'>+                             local-&gt;loc.path);</div><div class='add'>+</div><div class='add'>+                if (local-&gt;skip_unlink.opend_fd_count == 0) {</div><div class='add'>+                    ret = dht_fill_dict_to_avoid_unlink_of_migrating_file(</div><div class='add'>+                        local-&gt;xattr_req);</div><div class='add'>+</div><div class='add'>+                    if (ret) {</div><div class='add'>+                        DHT_STACK_UNWIND(lookup, frame, -1, EIO, NULL, NULL,</div><div class='add'>+                                         NULL, NULL);</div><div class='add'>+                    } else {</div><div class='add'>+                        local-&gt;call_cnt = 1;</div><div class='add'>+                        FRAME_SU_DO(frame, dht_local_t);</div><div class='add'>+                        STACK_WIND(frame, dht_lookup_unlink_of_false_linkto_cbk,</div><div class='add'>+                                   hashed_subvol, hashed_subvol-&gt;fops-&gt;unlink,</div><div class='add'>+                                   &amp;local-&gt;loc, 0, local-&gt;xattr_req);</div><div class='add'>+                    }</div><div class='add'>+</div><div class='add'>+                    return 0;</div><div class='add'>+                }</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+preset_layout:</div><div class='add'>+</div><div class='add'>+    if (found_non_linkto_on_hashed) {</div><div class='add'>+        if (local-&gt;need_lookup_everywhere) {</div><div class='add'>+            if (gf_uuid_compare(local-&gt;gfid, local-&gt;inode-&gt;gfid)) {</div><div class='add'>+                /* GFID different, return error */</div><div class='add'>+                DHT_STACK_UNWIND(lookup, frame, -1, ENOENT, NULL, NULL, NULL,</div><div class='add'>+                                 NULL);</div><div class='add'>+                return 0;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        local-&gt;op_ret = 0;</div><div class='add'>+        local-&gt;op_errno = 0;</div><div class='add'>+        layout = dht_layout_for_subvol(this, cached_subvol);</div><div class='add'>+        if (!layout) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_INFO, 0, DHT_MSG_SUBVOL_INFO,</div><div class='add'>+                   "%s: no pre-set layout for subvolume %s,"</div><div class='add'>+                   " gfid = %s",</div><div class='add'>+                   local-&gt;loc.path,</div><div class='add'>+                   (cached_subvol ? cached_subvol-&gt;name : "&lt;nil&gt;"), gfid);</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        ret = dht_layout_set(this, local-&gt;inode, layout);</div><div class='add'>+        if (ret &lt; 0) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_INFO, 0, DHT_MSG_SUBVOL_INFO,</div><div class='add'>+                   "%s: failed to set layout for subvol %s, "</div><div class='add'>+                   "gfid = %s",</div><div class='add'>+                   local-&gt;loc.path,</div><div class='add'>+                   (cached_subvol ? cached_subvol-&gt;name : "&lt;nil&gt;"), gfid);</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        if (local-&gt;loc.parent) {</div><div class='add'>+            dht_inode_ctx_time_update(local-&gt;loc.parent, this,</div><div class='add'>+                                      &amp;local-&gt;postparent, 1);</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        DHT_STRIP_PHASE1_FLAGS(&amp;local-&gt;stbuf);</div><div class='add'>+        dht_set_fixed_dir_stat(&amp;local-&gt;postparent);</div><div class='add'>+        DHT_STACK_UNWIND(lookup, frame, local-&gt;op_ret, local-&gt;op_errno,</div><div class='add'>+                         local-&gt;inode, &amp;local-&gt;stbuf, local-&gt;xattr,</div><div class='add'>+                         &amp;local-&gt;postparent);</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        DHT_STACK_UNWIND (unlink, frame, local-&gt;op_ret, local-&gt;op_errno,</div><div class='del'>-                          &amp;local-&gt;preparent, &amp;local-&gt;postparent);</div><div class='add'>+    if (!hashed_subvol) {</div><div class='add'>+        gf_msg_debug(this-&gt;name, 0,</div><div class='add'>+                     "Cannot create linkfile for %s on %s: "</div><div class='add'>+                     "hashed subvolume cannot be found, gfid = %s.",</div><div class='add'>+                     local-&gt;loc.path, cached_subvol-&gt;name, gfid);</div><div class='ctx'> </div><div class='add'>+        local-&gt;op_ret = 0;</div><div class='add'>+        local-&gt;op_errno = 0;</div><div class='add'>+</div><div class='add'>+        ret = dht_layout_preset(frame-&gt;this, cached_subvol, local-&gt;inode);</div><div class='add'>+        if (ret &lt; 0) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_INFO, 0, DHT_MSG_LAYOUT_PRESET_FAILED,</div><div class='add'>+                   "Failed to set layout for subvol %s"</div><div class='add'>+                   ", gfid = %s",</div><div class='add'>+                   cached_subvol ? cached_subvol-&gt;name : "&lt;nil&gt;", gfid);</div><div class='add'>+            local-&gt;op_ret = -1;</div><div class='add'>+            local-&gt;op_errno = EINVAL;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        if (local-&gt;loc.parent) {</div><div class='add'>+            dht_inode_ctx_time_update(local-&gt;loc.parent, this,</div><div class='add'>+                                      &amp;local-&gt;postparent, 1);</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        DHT_STRIP_PHASE1_FLAGS(&amp;local-&gt;stbuf);</div><div class='add'>+        dht_set_fixed_dir_stat(&amp;local-&gt;postparent);</div><div class='add'>+        DHT_STACK_UNWIND(lookup, frame, local-&gt;op_ret, local-&gt;op_errno,</div><div class='add'>+                         local-&gt;inode, &amp;local-&gt;stbuf, local-&gt;xattr,</div><div class='add'>+                         &amp;local-&gt;postparent);</div><div class='ctx'>         return 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (frame-&gt;root-&gt;op != GF_FOP_RENAME) {</div><div class='add'>+        local-&gt;current = &amp;local-&gt;lock[0];</div><div class='add'>+        ret = dht_protect_namespace(frame, &amp;local-&gt;loc, hashed_subvol,</div><div class='add'>+                                    &amp;local-&gt;current-&gt;ns,</div><div class='add'>+                                    dht_call_lookup_linkfile_create);</div><div class='add'>+    } else {</div><div class='add'>+        gf_msg_debug(this-&gt;name, 0,</div><div class='add'>+                     "Creating linkto file on %s(hash) to %s on %s "</div><div class='add'>+                     "(gfid = %s)",</div><div class='add'>+                     hashed_subvol-&gt;name, local-&gt;loc.path, cached_subvol-&gt;name,</div><div class='add'>+                     gfid);</div><div class='add'>+</div><div class='add'>+        ret = dht_linkfile_create(frame, dht_lookup_linkfile_create_cbk, this,</div><div class='add'>+                                  cached_subvol, hashed_subvol, &amp;local-&gt;loc);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+</div><div class='add'>+unwind_hashed_and_cached:</div><div class='add'>+    DHT_STRIP_PHASE1_FLAGS(&amp;local-&gt;stbuf);</div><div class='add'>+    dht_set_fixed_dir_stat(&amp;local-&gt;postparent);</div><div class='add'>+    DHT_STACK_UNWIND(lookup, frame, local-&gt;op_ret, local-&gt;op_errno,</div><div class='add'>+                     local-&gt;inode, &amp;local-&gt;stbuf, local-&gt;xattr,</div><div class='add'>+                     &amp;local-&gt;postparent);</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+static int</div><div class='add'>+dht_lookup_everywhere_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                          int32_t op_ret, int32_t op_errno, inode_t *inode,</div><div class='add'>+                          struct iatt *buf, dict_t *xattr,</div><div class='add'>+                          struct iatt *postparent)</div><div class='add'>+{</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    int this_call_cnt = 0;</div><div class='add'>+    xlator_t *prev = NULL;</div><div class='add'>+    int is_linkfile = 0;</div><div class='add'>+    int is_dir = 0;</div><div class='add'>+    loc_t *loc = NULL;</div><div class='add'>+    xlator_t *link_subvol = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int32_t fd_count = 0;</div><div class='add'>+    dht_conf_t *conf = NULL;</div><div class='add'>+    char gfid[GF_UUID_BUF_SIZE] = {0};</div><div class='add'>+    dict_t *dict_req = {0};</div><div class='add'>+</div><div class='add'>+    GF_VALIDATE_OR_GOTO("dht", frame, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("dht", this, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("dht", frame-&gt;local, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("dht", cookie, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("dht", this-&gt;private, out);</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    loc = &amp;local-&gt;loc;</div><div class='add'>+    conf = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    prev = cookie;</div><div class='add'>+</div><div class='add'>+    gf_msg_debug(this-&gt;name, 0,</div><div class='add'>+                 "returned with op_ret %d and op_errno %d (%s) "</div><div class='add'>+                 "from subvol %s",</div><div class='add'>+                 op_ret, op_errno, loc-&gt;path, prev-&gt;name);</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;frame-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        if (op_ret == -1) {</div><div class='add'>+            if (op_errno != ENOENT)</div><div class='add'>+                local-&gt;op_errno = op_errno;</div><div class='add'>+            if (op_errno == ENODATA)</div><div class='add'>+                local-&gt;gfid_missing = _gf_true;</div><div class='add'>+            goto unlock;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-dht_unlink_linkfile_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-                         int op_ret, int op_errno, struct iatt *preparent,</div><div class='del'>-                         struct iatt *postparent)</div><div class='del'>-{</div><div class='del'>-	dht_local_t  *local = NULL;</div><div class='del'>-	call_frame_t *prev = NULL;</div><div class='del'>-</div><div class='del'>-        xlator_t *cached_subvol = NULL;</div><div class='del'>-</div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-	prev  = cookie;</div><div class='del'>-</div><div class='del'>-	LOCK (&amp;frame-&gt;lock);</div><div class='del'>-	{</div><div class='del'>-		if (op_ret == -1) {</div><div class='del'>-			local-&gt;op_errno = op_errno;</div><div class='del'>-			gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-				"subvolume %s returned -1 (%s)",</div><div class='del'>-				prev-&gt;this-&gt;name, strerror (op_errno));</div><div class='del'>-			goto unlock;</div><div class='del'>-		}</div><div class='del'>-</div><div class='del'>-		local-&gt;op_ret = 0;</div><div class='del'>-	}</div><div class='add'>+        if (gf_uuid_is_null(local-&gt;gfid))</div><div class='add'>+            gf_uuid_copy(local-&gt;gfid, buf-&gt;ia_gfid);</div><div class='add'>+</div><div class='add'>+        gf_uuid_unparse(local-&gt;gfid, gfid);</div><div class='add'>+</div><div class='add'>+        if (gf_uuid_compare(local-&gt;gfid, buf-&gt;ia_gfid)) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_WARNING, 0, DHT_MSG_GFID_MISMATCH,</div><div class='add'>+                   "%s: gfid differs on subvolume %s,"</div><div class='add'>+                   " gfid local = %s, gfid node = %s",</div><div class='add'>+                   loc-&gt;path, prev-&gt;name, gfid, uuid_utoa(buf-&gt;ia_gfid));</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        is_linkfile = check_is_linkfile(inode, buf, xattr,</div><div class='add'>+                                        conf-&gt;link_xattr_name);</div><div class='add'>+</div><div class='add'>+        if (is_linkfile) {</div><div class='add'>+            link_subvol = dht_linkfile_subvol(this, inode, buf, xattr);</div><div class='add'>+            gf_msg_debug(this-&gt;name, 0, "found on %s linkfile %s (-&gt; %s)",</div><div class='add'>+                         prev-&gt;name, loc-&gt;path,</div><div class='add'>+                         link_subvol ? link_subvol-&gt;name : "''");</div><div class='add'>+            goto unlock;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        is_dir = check_is_dir(inode, buf, xattr);</div><div class='add'>+</div><div class='add'>+        /* non linkfile GFID takes precedence but don't overwrite</div><div class='add'>+         gfid if we have already found a cached file*/</div><div class='add'>+        if (!local-&gt;cached_subvol)</div><div class='add'>+            gf_uuid_copy(local-&gt;gfid, buf-&gt;ia_gfid);</div><div class='add'>+</div><div class='add'>+        if (is_dir) {</div><div class='add'>+            local-&gt;dir_count++;</div><div class='add'>+</div><div class='add'>+            gf_msg_debug(this-&gt;name, 0, "found on %s directory %s", prev-&gt;name,</div><div class='add'>+                         loc-&gt;path);</div><div class='add'>+        } else {</div><div class='add'>+            local-&gt;file_count++;</div><div class='add'>+</div><div class='add'>+            gf_msg_debug(this-&gt;name, 0, "found cached file on %s for %s",</div><div class='add'>+                         prev-&gt;name, loc-&gt;path);</div><div class='add'>+</div><div class='add'>+            if (!local-&gt;cached_subvol) {</div><div class='add'>+                /* found one file */</div><div class='add'>+                dht_iatt_merge(this, &amp;local-&gt;stbuf, buf);</div><div class='add'>+</div><div class='add'>+                local-&gt;xattr = dict_ref(xattr);</div><div class='add'>+                local-&gt;cached_subvol = prev;</div><div class='add'>+</div><div class='add'>+                gf_msg_debug(this-&gt;name, 0,</div><div class='add'>+                             "storing cached on %s file"</div><div class='add'>+                             " %s",</div><div class='add'>+                             prev-&gt;name, loc-&gt;path);</div><div class='add'>+</div><div class='add'>+                dht_iatt_merge(this, &amp;local-&gt;postparent, postparent);</div><div class='add'>+</div><div class='add'>+                gf_uuid_copy(local-&gt;skip_unlink.cached_gfid, buf-&gt;ia_gfid);</div><div class='add'>+            } else {</div><div class='add'>+                /* This is where we need 'rename' both entries logic */</div><div class='add'>+                gf_msg(this-&gt;name, GF_LOG_WARNING, 0,</div><div class='add'>+                       DHT_MSG_FILE_ON_MULT_SUBVOL,</div><div class='add'>+                       "multiple subvolumes (%s and %s) have "</div><div class='add'>+                       "file %s (preferably rename the file "</div><div class='add'>+                       "in the backend,and do a fresh lookup)",</div><div class='add'>+                       local-&gt;cached_subvol-&gt;name, prev-&gt;name, local-&gt;loc.path);</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='ctx'> unlock:</div><div class='del'>-	UNLOCK (&amp;frame-&gt;lock);</div><div class='add'>+    UNLOCK(&amp;frame-&gt;lock);</div><div class='add'>+</div><div class='add'>+    if (is_linkfile) {</div><div class='add'>+        ret = dict_get_int32(xattr, GLUSTERFS_OPEN_FD_COUNT, &amp;fd_count);</div><div class='add'>+</div><div class='add'>+        /*  Any linkto file found on the non-hashed subvolume should</div><div class='add'>+         *  be unlinked (performed in the "else if" block below)</div><div class='add'>+         *</div><div class='add'>+         *  But if a linkto file is found on hashed subvolume, it may be</div><div class='add'>+         *  pointing to valid cached node. So unlinking of linkto</div><div class='add'>+         *  file on hashed subvolume is skipped and inside</div><div class='add'>+         *  dht_lookup_everywhere_done, checks are performed. If this</div><div class='add'>+         *  linkto file is found as stale linkto file, it is deleted</div><div class='add'>+         *  otherwise unlink is skipped.</div><div class='add'>+         */</div><div class='ctx'> </div><div class='del'>-        if (op_ret == -1)</div><div class='del'>-                goto err;</div><div class='add'>+        if (local-&gt;hashed_subvol &amp;&amp; local-&gt;hashed_subvol == prev) {</div><div class='add'>+            local-&gt;skip_unlink.handle_valid_link = _gf_true;</div><div class='add'>+            local-&gt;skip_unlink.opend_fd_count = fd_count;</div><div class='add'>+            local-&gt;skip_unlink.hash_links_to = link_subvol;</div><div class='add'>+            gf_uuid_copy(local-&gt;skip_unlink.hashed_gfid, buf-&gt;ia_gfid);</div><div class='add'>+</div><div class='add'>+            gf_msg_debug(this-&gt;name, 0,</div><div class='add'>+                         "Found"</div><div class='add'>+                         " one linkto file on hashed subvol %s "</div><div class='add'>+                         "for %s: Skipping unlinking till "</div><div class='add'>+                         "everywhere_done",</div><div class='add'>+                         prev-&gt;name, loc-&gt;path);</div><div class='add'>+</div><div class='add'>+        } else if (!ret &amp;&amp; (fd_count == 0)) {</div><div class='add'>+            dict_req = dict_new();</div><div class='add'>+</div><div class='add'>+            ret = dht_fill_dict_to_avoid_unlink_of_migrating_file(dict_req);</div><div class='add'>+</div><div class='add'>+            if (ret) {</div><div class='add'>+                /* Skip unlinking for dict_failure</div><div class='add'>+                 *File is found as a linkto file on non-hashed,</div><div class='add'>+                 *subvolume. In the current implementation,</div><div class='add'>+                 *finding a linkto-file on non-hashed does not</div><div class='add'>+                 *always implies that it is stale. So deletion</div><div class='add'>+                 *of file should be done only when both fd is</div><div class='add'>+                 *closed and linkto-xattr is set. In case of</div><div class='add'>+                 *dict_set failure, avoid skipping of file.</div><div class='add'>+                 *NOTE: dht_frame_return should get called for</div><div class='add'>+                 *      this block.</div><div class='add'>+                 */</div><div class='add'>+</div><div class='add'>+                dict_unref(dict_req);</div><div class='add'>+</div><div class='add'>+            } else {</div><div class='add'>+                gf_msg(this-&gt;name, GF_LOG_INFO, 0, DHT_MSG_SUBVOL_INFO,</div><div class='add'>+                       "attempting deletion of stale linkfile "</div><div class='add'>+                       "%s on %s (hashed subvol is %s)",</div><div class='add'>+                       loc-&gt;path, prev-&gt;name,</div><div class='add'>+                       (local-&gt;hashed_subvol ? local-&gt;hashed_subvol-&gt;name</div><div class='add'>+                                             : "&lt;null&gt;"));</div><div class='add'>+                /* *</div><div class='add'>+                 * These stale files may be created using root</div><div class='add'>+                 * user. Hence deletion will work only with</div><div class='add'>+                 * root.</div><div class='add'>+                 */</div><div class='add'>+                FRAME_SU_DO(frame, dht_local_t);</div><div class='add'>+                STACK_WIND(frame, dht_lookup_unlink_cbk, prev,</div><div class='add'>+                           prev-&gt;fops-&gt;unlink, loc, 0, dict_req);</div><div class='add'>+</div><div class='add'>+                dict_unref(dict_req);</div><div class='ctx'> </div><div class='del'>-        cached_subvol = dht_subvol_get_cached (this, local-&gt;loc.inode);</div><div class='del'>-        if (!cached_subvol) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-                        "no cached subvolume for path=%s",</div><div class='del'>-                        local-&gt;loc.path);</div><div class='del'>-                local-&gt;op_errno = EINVAL;</div><div class='del'>-                goto err;</div><div class='add'>+                return 0;</div><div class='add'>+            }</div><div class='ctx'>         }</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        STACK_WIND (frame, dht_unlink_cbk,</div><div class='del'>-                    cached_subvol, cached_subvol-&gt;fops-&gt;unlink,</div><div class='del'>-                    &amp;local-&gt;loc);</div><div class='add'>+    this_call_cnt = dht_frame_return(frame);</div><div class='add'>+    if (is_last_call(this_call_cnt)) {</div><div class='add'>+        dht_lookup_everywhere_done(frame, this);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        return 0;</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='add'>+int</div><div class='add'>+dht_lookup_everywhere(call_frame_t *frame, xlator_t *this, loc_t *loc)</div><div class='add'>+{</div><div class='add'>+    dht_conf_t *conf = NULL;</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    int i = 0;</div><div class='add'>+    int call_cnt = 0;</div><div class='add'>+</div><div class='add'>+    GF_VALIDATE_OR_GOTO("dht", frame, err);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("dht", this, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("dht", frame-&gt;local, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("dht", this-&gt;private, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("dht", loc, out);</div><div class='add'>+</div><div class='add'>+    conf = this-&gt;private;</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+</div><div class='add'>+    call_cnt = conf-&gt;subvolume_cnt;</div><div class='add'>+    local-&gt;call_cnt = call_cnt;</div><div class='add'>+</div><div class='add'>+    if (!local-&gt;inode)</div><div class='add'>+        local-&gt;inode = inode_ref(loc-&gt;inode);</div><div class='add'>+</div><div class='add'>+    gf_msg_debug(this-&gt;name, 0, "winding lookup call to %d subvols", call_cnt);</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; call_cnt; i++) {</div><div class='add'>+        STACK_WIND_COOKIE(frame, dht_lookup_everywhere_cbk, conf-&gt;subvolumes[i],</div><div class='add'>+                          conf-&gt;subvolumes[i],</div><div class='add'>+                          conf-&gt;subvolumes[i]-&gt;fops-&gt;lookup, loc,</div><div class='add'>+                          local-&gt;xattr_req);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+out:</div><div class='add'>+    DHT_STACK_UNWIND(lookup, frame, -1, EINVAL, NULL, NULL, NULL, NULL);</div><div class='ctx'> err:</div><div class='del'>-        DHT_STACK_UNWIND (unlink, frame, -1, local-&gt;op_errno,</div><div class='del'>-                          NULL, NULL);</div><div class='del'>-        return 0;</div><div class='add'>+    return -1;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-dht_fsync_cbk (call_frame_t *frame, void *cookie, xlator_t *this, int op_ret,</div><div class='del'>-               int op_errno, struct iatt *prebuf, struct iatt *postbuf)</div><div class='add'>+dht_lookup_linkfile_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                        int op_ret, int op_errno, inode_t *inode,</div><div class='add'>+                        struct iatt *stbuf, dict_t *xattr,</div><div class='add'>+                        struct iatt *postparent)</div><div class='ctx'> {</div><div class='del'>-	dht_local_t  *local = NULL;</div><div class='del'>-	int           this_call_cnt = 0;</div><div class='del'>-	call_frame_t *prev = NULL;</div><div class='add'>+    xlator_t *prev = NULL;</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    xlator_t *subvol = NULL;</div><div class='add'>+    loc_t *loc = NULL;</div><div class='add'>+    dht_conf_t *conf = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    char gfid[GF_UUID_BUF_SIZE] = {0};</div><div class='add'>+</div><div class='add'>+    GF_VALIDATE_OR_GOTO("dht", frame, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("dht", this, unwind);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("dht", frame-&gt;local, unwind);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("dht", this-&gt;private, unwind);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("dht", cookie, unwind);</div><div class='add'>+</div><div class='add'>+    prev = cookie;</div><div class='add'>+    subvol = prev;</div><div class='add'>+    conf = this-&gt;private;</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    loc = &amp;local-&gt;loc;</div><div class='add'>+</div><div class='add'>+    gf_uuid_unparse(loc-&gt;gfid, gfid);</div><div class='add'>+</div><div class='add'>+    if (op_ret == -1) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_INFO, op_errno, DHT_MSG_LINK_FILE_LOOKUP_INFO,</div><div class='add'>+               "Lookup of %s on %s (following linkfile) failed "</div><div class='add'>+               ",gfid = %s",</div><div class='add'>+               local-&gt;loc.path, subvol-&gt;name, gfid);</div><div class='add'>+</div><div class='add'>+        /* If cached subvol returned ENOTCONN, do not do</div><div class='add'>+        lookup_everywhere. We need to make sure linkfile does not get</div><div class='add'>+        removed, which can take away the namespace, and subvol is</div><div class='add'>+        anyways down. */</div><div class='add'>+</div><div class='add'>+        local-&gt;cached_subvol = NULL;</div><div class='add'>+        if (op_errno != ENOTCONN)</div><div class='add'>+            goto err;</div><div class='add'>+        else</div><div class='add'>+            goto unwind;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (check_is_dir(inode, stbuf, xattr)) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_INFO, 0, DHT_MSG_LINK_FILE_LOOKUP_INFO,</div><div class='add'>+               "Lookup of %s on %s (following linkfile) reached dir,"</div><div class='add'>+               " gfid = %s",</div><div class='add'>+               local-&gt;loc.path, subvol-&gt;name, gfid);</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (check_is_linkfile(inode, stbuf, xattr, conf-&gt;link_xattr_name)) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_INFO, 0, DHT_MSG_LINK_FILE_LOOKUP_INFO,</div><div class='add'>+               "lookup of %s on %s (following linkfile) reached link,"</div><div class='add'>+               "gfid = %s",</div><div class='add'>+               local-&gt;loc.path, subvol-&gt;name, gfid);</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (gf_uuid_compare(local-&gt;gfid, stbuf-&gt;ia_gfid)) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_WARNING, 0, DHT_MSG_GFID_MISMATCH,</div><div class='add'>+               "%s: gfid different on data file on %s,"</div><div class='add'>+               " gfid local = %s, gfid node = %s ",</div><div class='add'>+               local-&gt;loc.path, subvol-&gt;name, gfid, uuid_utoa(stbuf-&gt;ia_gfid));</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if ((stbuf-&gt;ia_nlink == 1) &amp;&amp; (conf &amp;&amp; conf-&gt;unhashed_sticky_bit)) {</div><div class='add'>+        stbuf-&gt;ia_prot.sticky = 1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dht_layout_preset(this, prev, inode);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_INFO, 0, DHT_MSG_LAYOUT_PRESET_FAILED,</div><div class='add'>+               "Failed to set layout for subvolume %s,"</div><div class='add'>+               "gfid = %s",</div><div class='add'>+               prev-&gt;name, gfid);</div><div class='add'>+        op_ret = -1;</div><div class='add'>+        op_errno = EINVAL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (local-&gt;loc.parent) {</div><div class='add'>+        dht_inode_ctx_time_update(local-&gt;loc.parent, this, postparent, 1);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='add'>+unwind:</div><div class='add'>+    DHT_STRIP_PHASE1_FLAGS(stbuf);</div><div class='add'>+    dht_set_fixed_dir_stat(postparent);</div><div class='add'>+    DHT_STACK_UNWIND(lookup, frame, op_ret, op_errno, inode, stbuf, xattr,</div><div class='add'>+                     postparent);</div><div class='ctx'> </div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-	prev = cookie;</div><div class='add'>+    return 0;</div><div class='ctx'> </div><div class='del'>-	LOCK (&amp;frame-&gt;lock);</div><div class='del'>-	{</div><div class='del'>-		if (op_ret == -1) {</div><div class='del'>-			local-&gt;op_errno = op_errno;</div><div class='del'>-			gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-				"subvolume %s returned -1 (%s)",</div><div class='del'>-				prev-&gt;this-&gt;name, strerror (op_errno));</div><div class='del'>-			goto unlock;</div><div class='del'>-		}</div><div class='add'>+err:</div><div class='add'>+    dht_lookup_everywhere(frame, this, loc);</div><div class='add'>+out:</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-		local-&gt;op_ret = 0;</div><div class='del'>-	}</div><div class='del'>-unlock:</div><div class='del'>-	UNLOCK (&amp;frame-&gt;lock);</div><div class='add'>+/* Code to get hashed subvol based on inode and loc</div><div class='add'>+   First it check if loc-&gt;parent and loc-&gt;path exist then it get</div><div class='add'>+   hashed subvol based on loc.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+static gf_boolean_t</div><div class='add'>+dht_should_lookup_everywhere(xlator_t *this, dht_conf_t *conf, loc_t *loc)</div><div class='add'>+{</div><div class='add'>+    dht_layout_t *parent_layout = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    gf_boolean_t lookup_everywhere = _gf_true;</div><div class='add'>+</div><div class='add'>+    /* lookup-optimize supersedes lookup-unhashed settings.</div><div class='add'>+     * If it is set, do not process search_unhashed</div><div class='add'>+     * If lookup-optimize if enabled, lookup everywhere if:</div><div class='add'>+     *  - this is the rebalance daemon.</div><div class='add'>+     *  - loc-&gt;parent is unavailable.</div><div class='add'>+     *  - parent_layout is unavailable</div><div class='add'>+     *  - parent_layout-&gt;commit_hash != conf-&gt;vol_commit_hash</div><div class='add'>+     */</div><div class='add'>+</div><div class='add'>+    if (conf-&gt;lookup_optimize) {</div><div class='add'>+        if (!conf-&gt;defrag &amp;&amp; loc-&gt;parent) {</div><div class='add'>+            ret = dht_inode_ctx_layout_get(loc-&gt;parent, this, &amp;parent_layout);</div><div class='add'>+            if (!ret &amp;&amp; parent_layout &amp;&amp;</div><div class='add'>+                (parent_layout-&gt;commit_hash == conf-&gt;vol_commit_hash)) {</div><div class='add'>+                lookup_everywhere = _gf_false;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+        goto out;</div><div class='add'>+    } else {</div><div class='add'>+        if (conf-&gt;search_unhashed == GF_DHT_LOOKUP_UNHASHED_AUTO) {</div><div class='add'>+            if (loc-&gt;parent) {</div><div class='add'>+                ret = dht_inode_ctx_layout_get(loc-&gt;parent, this,</div><div class='add'>+                                               &amp;parent_layout);</div><div class='add'>+                if (ret || !parent_layout ||</div><div class='add'>+                    (!parent_layout-&gt;search_unhashed)) {</div><div class='add'>+                    lookup_everywhere = _gf_false;</div><div class='add'>+                }</div><div class='add'>+            } else {</div><div class='add'>+                lookup_everywhere = _gf_false;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+out:</div><div class='add'>+    return lookup_everywhere;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+dht_lookup_cbk(call_frame_t *frame, void *cookie, xlator_t *this, int op_ret,</div><div class='add'>+               int op_errno, inode_t *inode, struct iatt *stbuf, dict_t *xattr,</div><div class='add'>+               struct iatt *postparent)</div><div class='add'>+{</div><div class='add'>+    char is_linkfile = 0;</div><div class='add'>+    char is_dir = 0;</div><div class='add'>+    xlator_t *subvol = NULL;</div><div class='add'>+    dht_conf_t *conf = NULL;</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    loc_t *loc = NULL;</div><div class='add'>+    xlator_t *prev = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    uint32_t vol_commit_hash = 0;</div><div class='add'>+</div><div class='add'>+    GF_VALIDATE_OR_GOTO("dht", frame, err);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("dht", this, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("dht", frame-&gt;local, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("dht", cookie, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("dht", this-&gt;private, out);</div><div class='add'>+</div><div class='add'>+    conf = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    prev = cookie;</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    loc = &amp;local-&gt;loc;</div><div class='add'>+</div><div class='add'>+    gf_msg_debug(this-&gt;name, op_errno,</div><div class='add'>+                 "%s: fresh_lookup on %s returned with op_ret %d", loc-&gt;path,</div><div class='add'>+                 prev-&gt;name, op_ret);</div><div class='add'>+</div><div class='add'>+    if (op_ret == -1) {</div><div class='add'>+        if (ENTRY_MISSING(op_ret, op_errno)) {</div><div class='add'>+            if (1 == conf-&gt;subvolume_cnt) {</div><div class='add'>+                /* No need to lookup again */</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            gf_msg_debug(this-&gt;name, 0, "Entry %s missing on subvol %s",</div><div class='add'>+                         loc-&gt;path, prev-&gt;name);</div><div class='ctx'> </div><div class='del'>-        if (local &amp;&amp; (op_ret == 0)) {</div><div class='del'>-                prebuf-&gt;ia_ino = local-&gt;ia_ino;</div><div class='del'>-                postbuf-&gt;ia_ino = local-&gt;ia_ino;</div><div class='add'>+            if (dht_should_lookup_everywhere(this, conf, loc)) {</div><div class='add'>+                local-&gt;op_errno = ENOENT;</div><div class='add'>+                dht_lookup_everywhere(frame, this, loc);</div><div class='add'>+                return 0;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+        } else {</div><div class='add'>+            /* posix returns ENODATA if the gfid is not set but the client and</div><div class='add'>+             * server protocol layers do not send the stbuf. We need to</div><div class='add'>+             * heal this so check if this is a directory on the other subvols.</div><div class='add'>+             */</div><div class='add'>+            if ((op_errno == ENOTCONN) || (op_errno == ENODATA)) {</div><div class='add'>+                dht_lookup_directory(frame, this, &amp;local-&gt;loc);</div><div class='add'>+                return 0;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+        gf_msg_debug(this-&gt;name, op_errno, "%s: Lookup on subvolume %s failed",</div><div class='add'>+                     loc-&gt;path, prev-&gt;name);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Lookup succeeded - op_ret = 0 */</div><div class='add'>+</div><div class='add'>+    /* This is required for handling stale linkfile deletion,</div><div class='add'>+     * or any more call which happens from this 'loc'.</div><div class='add'>+     */</div><div class='add'>+    if (gf_uuid_is_null(local-&gt;gfid)) {</div><div class='add'>+        /*This is set from the first successful response*/</div><div class='add'>+        memcpy(local-&gt;gfid, stbuf-&gt;ia_gfid, 16);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (!conf-&gt;vch_forced) {</div><div class='add'>+        /* Update the commit hash in conf if it is found */</div><div class='add'>+        ret = dict_get_uint32(xattr, conf-&gt;commithash_xattr_name,</div><div class='add'>+                              &amp;vol_commit_hash);</div><div class='add'>+        if (ret == 0) {</div><div class='add'>+            conf-&gt;vol_commit_hash = vol_commit_hash;</div><div class='ctx'>         }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    is_dir = check_is_dir(inode, stbuf, xattr);</div><div class='add'>+    if (is_dir) {</div><div class='add'>+        /* A directory is present on all subvols, send the lookup to</div><div class='add'>+         * all subvols now */</div><div class='add'>+        local-&gt;inode = inode_ref(inode);</div><div class='add'>+        local-&gt;xattr = dict_ref(xattr);</div><div class='add'>+        dht_lookup_directory(frame, this, &amp;local-&gt;loc);</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	this_call_cnt = dht_frame_return (frame);</div><div class='del'>-	if (is_last_call (this_call_cnt))</div><div class='del'>-		DHT_STACK_UNWIND (fsync, frame, local-&gt;op_ret, local-&gt;op_errno,</div><div class='del'>-                                  prebuf, postbuf);</div><div class='add'>+    is_linkfile = check_is_linkfile(inode, stbuf, xattr, conf-&gt;link_xattr_name);</div><div class='ctx'> </div><div class='add'>+    if (!is_linkfile) {</div><div class='add'>+        /* non-directory and not a linkto file. This is a data file</div><div class='add'>+         * Update the layout to point to the cached subvol</div><div class='add'>+         */</div><div class='add'>+</div><div class='add'>+        ret = dht_layout_preset(this, prev, inode);</div><div class='add'>+        if (ret &lt; 0) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_INFO, 0, DHT_MSG_LAYOUT_PRESET_FAILED,</div><div class='add'>+                   "%s: could not set pre-set layout for subvolume %s",</div><div class='add'>+                   loc-&gt;path, prev-&gt;name);</div><div class='add'>+            op_ret = -1;</div><div class='add'>+            op_errno = EINVAL;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* This is a linkto file. Get the value of the target subvol from the</div><div class='add'>+     * linkto xattr and lookup there to see if the file exists</div><div class='add'>+     */</div><div class='add'>+    subvol = dht_linkfile_subvol(this, inode, stbuf, xattr);</div><div class='add'>+    if (!subvol) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_INFO, 0, DHT_MSG_SUBVOL_INFO,</div><div class='add'>+               "%s: No link subvol for linkto", loc-&gt;path);</div><div class='add'>+        dht_lookup_everywhere(frame, this, loc);</div><div class='ctx'>         return 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    gf_msg_debug(this-&gt;name, 0, "%s: Calling lookup on linkto target %s",</div><div class='add'>+                 loc-&gt;path, subvol-&gt;name);</div><div class='add'>+</div><div class='add'>+    STACK_WIND_COOKIE(frame, dht_lookup_linkfile_cbk, subvol, subvol,</div><div class='add'>+                      subvol-&gt;fops-&gt;lookup, &amp;local-&gt;loc, local-&gt;xattr_req);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    /*</div><div class='add'>+     * FIXME: postparent-&gt;ia_size and postparent-&gt;st_blocks do not have</div><div class='add'>+     * correct values. since, postparent corresponds to a directory these</div><div class='add'>+     * two members should have values equal to sum of corresponding values</div><div class='add'>+     * from each of the subvolume. See dht_iatt_merge for reference.</div><div class='add'>+     */</div><div class='add'>+</div><div class='add'>+    if (!op_ret &amp;&amp; local &amp;&amp; local-&gt;loc.parent) {</div><div class='add'>+        dht_inode_ctx_time_update(local-&gt;loc.parent, this, postparent, 1);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    DHT_STRIP_PHASE1_FLAGS(stbuf);</div><div class='add'>+    dht_set_fixed_dir_stat(postparent);</div><div class='add'>+    DHT_STACK_UNWIND(lookup, frame, op_ret, op_errno, inode, stbuf, xattr,</div><div class='add'>+                     postparent);</div><div class='add'>+err:</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+/* For directories, check if acl xattrs have been requested (by the acl</div><div class='add'>+ * xlator), if not, request for them. These xattrs are needed for dht dir</div><div class='add'>+ * self-heal to perform proper self-healing of dirs</div><div class='add'>+ */</div><div class='add'>+static void</div><div class='add'>+dht_check_and_set_acl_xattr_req(xlator_t *this, dict_t *xattr_req)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(xattr_req);</div><div class='add'>+</div><div class='add'>+    if (!dict_get(xattr_req, POSIX_ACL_ACCESS_XATTR)) {</div><div class='add'>+        ret = dict_set_int8(xattr_req, POSIX_ACL_ACCESS_XATTR, 0);</div><div class='add'>+        if (ret)</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_WARNING, -ret, DHT_MSG_DICT_SET_FAILED,</div><div class='add'>+                   "Failed to set dictionary value:key = %s",</div><div class='add'>+                   POSIX_ACL_ACCESS_XATTR);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (!dict_get(xattr_req, POSIX_ACL_DEFAULT_XATTR)) {</div><div class='add'>+        ret = dict_set_int8(xattr_req, POSIX_ACL_DEFAULT_XATTR, 0);</div><div class='add'>+        if (ret)</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_WARNING, -ret, DHT_MSG_DICT_SET_FAILED,</div><div class='add'>+                   "Failed to set dictionary value:key = %s",</div><div class='add'>+                   POSIX_ACL_DEFAULT_XATTR);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return;</div><div class='add'>+}</div><div class='ctx'> </div><div class='add'>+/* for directories, we need the following info:</div><div class='add'>+ * the layout : trusted.glusterfs.dht</div><div class='add'>+ * the mds information : trusted.glusterfs.dht.mds</div><div class='add'>+ * the acl info: See above</div><div class='add'>+ */</div><div class='add'>+static int</div><div class='add'>+dht_set_dir_xattr_req(xlator_t *this, loc_t *loc, dict_t *xattr_req)</div><div class='add'>+{</div><div class='add'>+    int ret = -EINVAL;</div><div class='add'>+    dht_conf_t *conf = NULL;</div><div class='add'>+</div><div class='add'>+    conf = this-&gt;private;</div><div class='add'>+    if (!conf) {</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (!xattr_req) {</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Xattr to get the layout for a directory</div><div class='add'>+     */</div><div class='add'>+    ret = dict_set_uint32(xattr_req, conf-&gt;xattr_name, 4 * 4);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_WARNING, ENOMEM, DHT_MSG_DICT_SET_FAILED,</div><div class='add'>+               "Failed to set dictionary value:key = %s for "</div><div class='add'>+               "path %s",</div><div class='add'>+               conf-&gt;xattr_name, loc-&gt;path);</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /*Non-fatal failure */</div><div class='add'>+    ret = dict_set_uint32(xattr_req, conf-&gt;mds_xattr_key, 4);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_WARNING, ENOMEM, DHT_MSG_DICT_SET_FAILED,</div><div class='add'>+               "Failed to set dictionary value:key = %s for "</div><div class='add'>+               "path %s",</div><div class='add'>+               conf-&gt;mds_xattr_key, loc-&gt;path);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    dht_check_and_set_acl_xattr_req(this, xattr_req);</div><div class='add'>+    ret = 0;</div><div class='add'>+err:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-dht_err_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-	     int op_ret, int op_errno)</div><div class='add'>+/* If the hashed subvol is present, send the lookup to only that subvol first.</div><div class='add'>+ * If no hashed subvol, send a lookup to all subvols and proceed based on the</div><div class='add'>+ * responses.</div><div class='add'>+ */</div><div class='add'>+static int</div><div class='add'>+dht_do_fresh_lookup(call_frame_t *frame, xlator_t *this, loc_t *loc)</div><div class='ctx'> {</div><div class='del'>-	dht_local_t  *local = NULL;</div><div class='del'>-	int           this_call_cnt = 0;</div><div class='del'>-	call_frame_t *prev = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    dht_conf_t *conf = NULL;</div><div class='add'>+    xlator_t *hashed_subvol = NULL;</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    int op_errno = -1;</div><div class='add'>+    int call_cnt = 0;</div><div class='add'>+    int i = 0;</div><div class='add'>+</div><div class='add'>+    conf = this-&gt;private;</div><div class='add'>+    if (!conf) {</div><div class='add'>+        op_errno = EINVAL;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    if (!local) {</div><div class='add'>+        op_errno = EINVAL;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Since we don't know whether this is a file or a directory,</div><div class='add'>+     * request all xattrs*/</div><div class='add'>+    ret = dht_set_file_xattr_req(this, loc, local-&gt;xattr_req);</div><div class='add'>+    if (ret) {</div><div class='add'>+        op_errno = -ret;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dht_set_dir_xattr_req(this, loc, local-&gt;xattr_req);</div><div class='add'>+    if (ret) {</div><div class='add'>+        op_errno = -ret;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Fuse sets a random value in gfid-req. If the gfid is missing</div><div class='add'>+     * on one or more subvols, posix will set the gfid to this value,</div><div class='add'>+     * causing GFID mismatches for directories. Remove the value fuse</div><div class='add'>+     * has sent before sending the lookup.</div><div class='add'>+     */</div><div class='add'>+    ret = dict_get_gfuuid(local-&gt;xattr_req, "gfid-req", &amp;local-&gt;gfid_req);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_msg_debug(this-&gt;name, 0, "%s: No gfid-req available", loc-&gt;path);</div><div class='add'>+    } else {</div><div class='add'>+        dict_del(local-&gt;xattr_req, "gfid-req");</div><div class='add'>+    }</div><div class='add'>+    /* This should have been set in dht_lookup */</div><div class='add'>+    hashed_subvol = local-&gt;hashed_subvol;</div><div class='add'>+</div><div class='add'>+    if (!hashed_subvol) {</div><div class='add'>+        gf_msg_debug(this-&gt;name, 0,</div><div class='add'>+                     "%s: no subvolume in layout for path, "</div><div class='add'>+                     "checking on all the subvols to see if "</div><div class='add'>+                     "it is a directory",</div><div class='add'>+                     loc-&gt;path);</div><div class='add'>+</div><div class='add'>+        call_cnt = conf-&gt;subvolume_cnt;</div><div class='add'>+        local-&gt;call_cnt = call_cnt;</div><div class='ctx'> </div><div class='add'>+        /* Allocate a layout. This will be populated and saved in</div><div class='add'>+         * the dht inode_ctx on successful lookup</div><div class='add'>+         */</div><div class='add'>+        local-&gt;layout = dht_layout_new(this, conf-&gt;subvolume_cnt);</div><div class='add'>+        if (!local-&gt;layout) {</div><div class='add'>+            op_errno = ENOMEM;</div><div class='add'>+            goto err;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        gf_msg_debug(this-&gt;name, 0,</div><div class='add'>+                     "%s: Found null hashed subvol. Calling lookup"</div><div class='add'>+                     " on all nodes.",</div><div class='add'>+                     loc-&gt;path);</div><div class='ctx'> </div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-	prev = cookie;</div><div class='add'>+        for (i = 0; i &lt; call_cnt; i++) {</div><div class='add'>+            STACK_WIND_COOKIE(frame, dht_lookup_dir_cbk, conf-&gt;subvolumes[i],</div><div class='add'>+                              conf-&gt;subvolumes[i],</div><div class='add'>+                              conf-&gt;subvolumes[i]-&gt;fops-&gt;lookup, &amp;local-&gt;loc,</div><div class='add'>+                              local-&gt;xattr_req);</div><div class='add'>+        }</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	LOCK (&amp;frame-&gt;lock);</div><div class='del'>-	{</div><div class='del'>-		if (op_ret == -1) {</div><div class='del'>-			local-&gt;op_errno = op_errno;</div><div class='del'>-			gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-				"subvolume %s returned -1 (%s)",</div><div class='del'>-				prev-&gt;this-&gt;name, strerror (op_errno));</div><div class='del'>-			goto unlock;</div><div class='del'>-		}</div><div class='add'>+    /* if the hashed_subvol is non-null, send the lookup there first so</div><div class='add'>+     * as to see whether we have a file or a directory */</div><div class='add'>+    gf_msg_debug(this-&gt;name, 0, "%s: Calling fresh lookup on %s", loc-&gt;path,</div><div class='add'>+                 hashed_subvol-&gt;name);</div><div class='ctx'> </div><div class='del'>-		local-&gt;op_ret = 0;</div><div class='del'>-	}</div><div class='del'>-unlock:</div><div class='del'>-	UNLOCK (&amp;frame-&gt;lock);</div><div class='add'>+    STACK_WIND_COOKIE(frame, dht_lookup_cbk, hashed_subvol, hashed_subvol,</div><div class='add'>+                      hashed_subvol-&gt;fops-&gt;lookup, loc, local-&gt;xattr_req);</div><div class='add'>+    return 0;</div><div class='add'>+err:</div><div class='add'>+    op_errno = (op_errno == -1) ? errno : op_errno;</div><div class='add'>+    DHT_STACK_UNWIND(lookup, frame, -1, op_errno, NULL, NULL, NULL, NULL);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	this_call_cnt = dht_frame_return (frame);</div><div class='del'>-	if (is_last_call (this_call_cnt)) {</div><div class='del'>-		DHT_STACK_UNWIND (setxattr, frame, local-&gt;op_ret, local-&gt;op_errno);</div><div class='add'>+static int</div><div class='add'>+dht_do_revalidate(call_frame_t *frame, xlator_t *this, loc_t *loc)</div><div class='add'>+{</div><div class='add'>+    xlator_t *subvol = NULL;</div><div class='add'>+    xlator_t *mds_subvol = NULL;</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    dht_conf_t *conf = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int op_errno = -1;</div><div class='add'>+    dht_layout_t *layout = NULL;</div><div class='add'>+    int i = 0;</div><div class='add'>+    int call_cnt = 0;</div><div class='add'>+    int gen = 0;</div><div class='add'>+</div><div class='add'>+    conf = this-&gt;private;</div><div class='add'>+    if (!conf) {</div><div class='add'>+        op_errno = EINVAL;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    if (!local) {</div><div class='add'>+        op_errno = EINVAL;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    layout = local-&gt;layout;</div><div class='add'>+    if (!layout) {</div><div class='add'>+        gf_msg_debug(this-&gt;name, 0,</div><div class='add'>+                     "path = %s. No layout found in the inode ctx.", loc-&gt;path);</div><div class='add'>+        op_errno = EINVAL;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Generation number has changed. This layout may be stale. */</div><div class='add'>+    if (layout-&gt;gen &amp;&amp; (layout-&gt;gen &lt; conf-&gt;gen)) {</div><div class='add'>+        gen = layout-&gt;gen;</div><div class='add'>+        dht_layout_unref(this, local-&gt;layout);</div><div class='add'>+        local-&gt;layout = NULL;</div><div class='add'>+        local-&gt;cached_subvol = NULL;</div><div class='add'>+</div><div class='add'>+        gf_msg_debug(this-&gt;name, 0,</div><div class='add'>+                     "path = %s. In memory layout may be stale."</div><div class='add'>+                     "(layout-&gt;gen (%d) is less than "</div><div class='add'>+                     "conf-&gt;gen (%d)). Calling fresh lookup.",</div><div class='add'>+                     loc-&gt;path, gen, conf-&gt;gen);</div><div class='add'>+</div><div class='add'>+        dht_do_fresh_lookup(frame, this, loc);</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    local-&gt;inode = inode_ref(loc-&gt;inode);</div><div class='add'>+</div><div class='add'>+    /* Since we don't know whether this has changed,</div><div class='add'>+     * request all xattrs*/</div><div class='add'>+    ret = dht_set_file_xattr_req(this, loc, local-&gt;xattr_req);</div><div class='add'>+    if (ret) {</div><div class='add'>+        op_errno = -ret;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dht_set_dir_xattr_req(this, loc, local-&gt;xattr_req);</div><div class='add'>+    if (ret) {</div><div class='add'>+        op_errno = -ret;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (IA_ISDIR(local-&gt;inode-&gt;ia_type)) {</div><div class='add'>+        ret = dht_inode_ctx_mdsvol_get(local-&gt;inode, this, &amp;mds_subvol);</div><div class='add'>+        if (ret || !mds_subvol) {</div><div class='add'>+            gf_msg_debug(this-&gt;name, 0, "path = %s. No mds subvol in inode ctx",</div><div class='add'>+                         local-&gt;loc.path);</div><div class='ctx'>         }</div><div class='add'>+        local-&gt;mds_subvol = mds_subvol;</div><div class='add'>+        local-&gt;call_cnt = conf-&gt;subvolume_cnt;</div><div class='add'>+</div><div class='add'>+        /* local-&gt;call_cnt will change as responses are processed. Always use a</div><div class='add'>+         * local copy to loop through the STACK_WIND calls</div><div class='add'>+         */</div><div class='add'>+</div><div class='add'>+        call_cnt = local-&gt;call_cnt;</div><div class='ctx'> </div><div class='add'>+        for (i = 0; i &lt; call_cnt; i++) {</div><div class='add'>+            STACK_WIND_COOKIE(frame, dht_revalidate_cbk, conf-&gt;subvolumes[i],</div><div class='add'>+                              conf-&gt;subvolumes[i],</div><div class='add'>+                              conf-&gt;subvolumes[i]-&gt;fops-&gt;lookup, loc,</div><div class='add'>+                              local-&gt;xattr_req);</div><div class='add'>+        }</div><div class='ctx'>         return 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* If not a dir, this should be 1 */</div><div class='add'>+    local-&gt;call_cnt = layout-&gt;cnt;</div><div class='add'>+    call_cnt = local-&gt;call_cnt;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; call_cnt; i++) {</div><div class='add'>+        subvol = layout-&gt;list[i].xlator;</div><div class='add'>+</div><div class='add'>+        gf_msg_debug(this-&gt;name, 0,</div><div class='add'>+                     "path = %s. Calling "</div><div class='add'>+                     "revalidate lookup on %s",</div><div class='add'>+                     loc-&gt;path, subvol-&gt;name);</div><div class='add'>+</div><div class='add'>+        STACK_WIND_COOKIE(frame, dht_revalidate_cbk, subvol, subvol,</div><div class='add'>+                          subvol-&gt;fops-&gt;lookup, &amp;local-&gt;loc, local-&gt;xattr_req);</div><div class='add'>+    }</div><div class='add'>+    return 0;</div><div class='add'>+err:</div><div class='add'>+    op_errno = (op_errno == -1) ? errno : op_errno;</div><div class='add'>+    DHT_STACK_UNWIND(lookup, frame, -1, op_errno, NULL, NULL, NULL, NULL);</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+/* Depending on the input, decide if this is a:</div><div class='add'>+ * fresh-lookup: loc-&gt;name is provided but no dht inode ctx</div><div class='add'>+ * revalidation: loc-&gt;name is provided, dht inode ctx is present</div><div class='add'>+ * discover: gfid based nameless lookup.</div><div class='add'>+ */</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-dht_access (call_frame_t *frame, xlator_t *this,</div><div class='del'>-	    loc_t *loc, int32_t mask)</div><div class='add'>+dht_lookup(call_frame_t *frame, xlator_t *this, loc_t *loc, dict_t *xattr_req)</div><div class='ctx'> {</div><div class='del'>-	xlator_t     *subvol = NULL;</div><div class='del'>-        int           op_errno = -1;</div><div class='del'>-	dht_local_t  *local = NULL;</div><div class='add'>+    xlator_t *hashed_subvol = NULL;</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    dht_conf_t *conf = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int op_errno = -1;</div><div class='add'>+    loc_t new_loc = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    VALIDATE_OR_GOTO(frame, err);</div><div class='add'>+    VALIDATE_OR_GOTO(this, err);</div><div class='add'>+    VALIDATE_OR_GOTO(loc, err);</div><div class='add'>+    VALIDATE_OR_GOTO(loc-&gt;inode, err);</div><div class='add'>+</div><div class='add'>+    conf = this-&gt;private;</div><div class='add'>+    if (!conf)</div><div class='add'>+        goto err;</div><div class='add'>+</div><div class='add'>+    local = dht_local_init(frame, loc, NULL, GF_FOP_LOOKUP);</div><div class='add'>+    if (!local) {</div><div class='add'>+        op_errno = ENOMEM;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dht_filter_loc_subvol_key(this, loc, &amp;new_loc, &amp;hashed_subvol);</div><div class='add'>+    if (ret) {</div><div class='add'>+        loc_wipe(&amp;local-&gt;loc);</div><div class='add'>+        ret = loc_dup(&amp;new_loc, &amp;local-&gt;loc);</div><div class='add'>+</div><div class='add'>+        /* we no longer need 'new_loc' entries */</div><div class='add'>+        loc_wipe(&amp;new_loc);</div><div class='add'>+</div><div class='add'>+        /* check if loc_dup() is successful */</div><div class='add'>+        if (ret == -1) {</div><div class='add'>+            op_errno = errno;</div><div class='add'>+            gf_msg_debug(this-&gt;name, errno,</div><div class='add'>+                         "copying location failed for path=%s", loc-&gt;path);</div><div class='add'>+            goto err;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (xattr_req) {</div><div class='add'>+        local-&gt;xattr_req = dict_ref(xattr_req);</div><div class='add'>+    } else {</div><div class='add'>+        local-&gt;xattr_req = dict_new();</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Nameless lookup */</div><div class='add'>+</div><div class='add'>+    /* This is usually sent by NFS. Lookups are done based on the gfid and</div><div class='add'>+     * no name information is available. Without the name, dht cannot calculate</div><div class='add'>+     * the hash and has to send a lookup to all subvols.</div><div class='add'>+     */</div><div class='add'>+    if (gf_uuid_is_null(loc-&gt;pargfid) &amp;&amp; !gf_uuid_is_null(loc-&gt;gfid) &amp;&amp;</div><div class='add'>+        !__is_root_gfid(loc-&gt;inode-&gt;gfid)) {</div><div class='add'>+        local-&gt;cached_subvol = NULL;</div><div class='add'>+        dht_do_discover(frame, this, loc);</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='add'>+    if (loc_is_root(loc)) {</div><div class='add'>+        /* Request the DHT commit hash xattr (trusted.glusterfs.dht.commithash)</div><div class='add'>+         * set on the brick root.</div><div class='add'>+         */</div><div class='add'>+        ret = dict_set_uint32(local-&gt;xattr_req, conf-&gt;commithash_xattr_name,</div><div class='add'>+                              sizeof(uint32_t));</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        VALIDATE_OR_GOTO (frame, err);</div><div class='del'>-        VALIDATE_OR_GOTO (this, err);</div><div class='del'>-        VALIDATE_OR_GOTO (loc, err);</div><div class='del'>-        VALIDATE_OR_GOTO (loc-&gt;inode, err);</div><div class='del'>-        VALIDATE_OR_GOTO (loc-&gt;path, err);</div><div class='add'>+    if (!hashed_subvol)</div><div class='add'>+        hashed_subvol = dht_subvol_get_hashed(this, loc);</div><div class='add'>+    local-&gt;hashed_subvol = hashed_subvol;</div><div class='ctx'> </div><div class='del'>-	subvol = dht_subvol_get_cached (this, loc-&gt;inode);</div><div class='del'>-	if (!subvol) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-			"no cached subvolume for path=%s", loc-&gt;path);</div><div class='del'>-		op_errno = EINVAL;</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='add'>+    if (is_revalidate(loc)) {</div><div class='add'>+        /* The entry has been looked up before and has a dht inode_ctx</div><div class='add'>+         */</div><div class='add'>+        dht_do_revalidate(frame, this, loc);</div><div class='add'>+        return 0;</div><div class='add'>+    } else {</div><div class='add'>+        /* Entry has not been looked up before</div><div class='add'>+         */</div><div class='add'>+        dht_do_fresh_lookup(frame, this, loc);</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	local = dht_local_init (frame);</div><div class='del'>-	if (!local) {</div><div class='del'>-		op_errno = ENOMEM;</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-			"Out of memory");</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='add'>+    return 0;</div><div class='add'>+err:</div><div class='add'>+    op_errno = (op_errno == -1) ? errno : op_errno;</div><div class='add'>+    DHT_STACK_UNWIND(lookup, frame, -1, op_errno, NULL, NULL, NULL, NULL);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	local-&gt;call_cnt = 1;</div><div class='add'>+static int</div><div class='add'>+dht_unlink_linkfile_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                        int op_ret, int op_errno, struct iatt *preparent,</div><div class='add'>+                        struct iatt *postparent, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    xlator_t *prev = NULL;</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    prev = cookie;</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;frame-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        if ((op_ret == -1) &amp;&amp;</div><div class='add'>+            !((op_errno == ENOENT) || (op_errno == ENOTCONN))) {</div><div class='add'>+            local-&gt;op_errno = op_errno;</div><div class='add'>+            UNLOCK(&amp;frame-&gt;lock);</div><div class='add'>+            gf_msg_debug(this-&gt;name, op_errno,</div><div class='add'>+                         "Unlink link: subvolume %s returned -1", prev-&gt;name);</div><div class='add'>+            goto post_unlock;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-	STACK_WIND (frame, dht_err_cbk,</div><div class='del'>-		    subvol, subvol-&gt;fops-&gt;access,</div><div class='del'>-		    loc, mask);</div><div class='add'>+        local-&gt;op_ret = 0;</div><div class='add'>+    }</div><div class='add'>+    UNLOCK(&amp;frame-&gt;lock);</div><div class='add'>+post_unlock:</div><div class='add'>+    dht_set_fixed_dir_stat(&amp;local-&gt;preparent);</div><div class='add'>+    dht_set_fixed_dir_stat(&amp;local-&gt;postparent);</div><div class='add'>+    DHT_STACK_UNWIND(unlink, frame, local-&gt;op_ret, local-&gt;op_errno,</div><div class='add'>+                     &amp;local-&gt;preparent, &amp;local-&gt;postparent, xdata);</div><div class='ctx'> </div><div class='del'>-	return 0;</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-err:</div><div class='del'>-	op_errno = (op_errno == -1) ? errno : op_errno;</div><div class='del'>-	DHT_STACK_UNWIND (access, frame, -1, op_errno);</div><div class='add'>+static int</div><div class='add'>+dht_unlink_cbk(call_frame_t *frame, void *cookie, xlator_t *this, int op_ret,</div><div class='add'>+               int op_errno, struct iatt *preparent, struct iatt *postparent,</div><div class='add'>+               dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    xlator_t *prev = NULL;</div><div class='add'>+    xlator_t *hashed_subvol = NULL;</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    prev = cookie;</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;frame-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        if (op_ret == -1) {</div><div class='add'>+            if (op_errno != ENOENT) {</div><div class='add'>+                local-&gt;op_ret = -1;</div><div class='add'>+                local-&gt;op_errno = op_errno;</div><div class='add'>+            } else {</div><div class='add'>+                local-&gt;op_ret = 0;</div><div class='add'>+            }</div><div class='add'>+            UNLOCK(&amp;frame-&gt;lock);</div><div class='add'>+            gf_msg_debug(this-&gt;name, op_errno,</div><div class='add'>+                         "Unlink: subvolume %s returned -1", prev-&gt;name);</div><div class='add'>+            goto post_unlock;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        local-&gt;op_ret = 0;</div><div class='ctx'> </div><div class='del'>-	return 0;</div><div class='add'>+        local-&gt;postparent = *postparent;</div><div class='add'>+        local-&gt;preparent = *preparent;</div><div class='add'>+</div><div class='add'>+        if (local-&gt;loc.parent) {</div><div class='add'>+            dht_inode_ctx_time_update(local-&gt;loc.parent, this,</div><div class='add'>+                                      &amp;local-&gt;preparent, 0);</div><div class='add'>+            dht_inode_ctx_time_update(local-&gt;loc.parent, this,</div><div class='add'>+                                      &amp;local-&gt;postparent, 1);</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    UNLOCK(&amp;frame-&gt;lock);</div><div class='add'>+post_unlock:</div><div class='add'>+    if (!local-&gt;op_ret) {</div><div class='add'>+        hashed_subvol = dht_subvol_get_hashed(this, &amp;local-&gt;loc);</div><div class='add'>+        if (hashed_subvol &amp;&amp; hashed_subvol != local-&gt;cached_subvol) {</div><div class='add'>+            /*</div><div class='add'>+             * If hashed and cached are different, then we need</div><div class='add'>+             * to unlink linkfile from hashed subvol if data</div><div class='add'>+             * file is deleted successfully</div><div class='add'>+             */</div><div class='add'>+            STACK_WIND_COOKIE(frame, dht_unlink_linkfile_cbk, hashed_subvol,</div><div class='add'>+                              hashed_subvol, hashed_subvol-&gt;fops-&gt;unlink,</div><div class='add'>+                              &amp;local-&gt;loc, local-&gt;flags, xdata);</div><div class='add'>+            return 0;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    dht_set_fixed_dir_stat(&amp;local-&gt;preparent);</div><div class='add'>+    dht_set_fixed_dir_stat(&amp;local-&gt;postparent);</div><div class='add'>+    DHT_STACK_UNWIND(unlink, frame, local-&gt;op_ret, local-&gt;op_errno,</div><div class='add'>+                     &amp;local-&gt;preparent, &amp;local-&gt;postparent, xdata);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+static int</div><div class='add'>+dht_common_setxattr_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                        int32_t op_ret, int32_t op_errno, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    DHT_STACK_UNWIND(setxattr, frame, op_ret, op_errno, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-dht_readlink_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-		  int op_ret, int op_errno, const char *path, struct iatt *sbuf)</div><div class='add'>+static int</div><div class='add'>+dht_fix_layout_setxattr_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                            int32_t op_ret, int32_t op_errno, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-        dht_local_t *local = NULL;</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    dht_layout_t *layout = NULL;</div><div class='ctx'> </div><div class='add'>+    if (op_ret == 0) {</div><div class='add'>+        /* update the layout in the inode ctx */</div><div class='ctx'>         local = frame-&gt;local;</div><div class='del'>-        if (op_ret == -1)</div><div class='del'>-                goto err;</div><div class='add'>+        layout = local-&gt;selfheal.layout;</div><div class='ctx'> </div><div class='del'>-        if (local) {</div><div class='del'>-                sbuf-&gt;ia_ino = local-&gt;ia_ino;</div><div class='del'>-        } else {</div><div class='del'>-                op_ret = -1;</div><div class='del'>-                op_errno = EINVAL;</div><div class='add'>+        dht_layout_set(this, local-&gt;loc.inode, layout);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    DHT_STACK_UNWIND(setxattr, frame, op_ret, op_errno, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+dht_err_cbk(call_frame_t *frame, void *cookie, xlator_t *this, int op_ret,</div><div class='add'>+            int op_errno, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    int this_call_cnt = 0;</div><div class='add'>+    xlator_t *prev = NULL;</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    prev = cookie;</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;frame-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        if (op_ret == -1) {</div><div class='add'>+            local-&gt;op_errno = op_errno;</div><div class='add'>+            UNLOCK(&amp;frame-&gt;lock);</div><div class='add'>+            gf_msg_debug(this-&gt;name, op_errno, "subvolume %s returned -1",</div><div class='add'>+                         prev-&gt;name);</div><div class='add'>+            goto post_unlock;</div><div class='ctx'>         }</div><div class='ctx'> </div><div class='del'>-err:</div><div class='del'>-        DHT_STACK_UNWIND (readlink, frame, op_ret, op_errno, path, sbuf);</div><div class='add'>+        local-&gt;op_ret = 0;</div><div class='add'>+    }</div><div class='add'>+    UNLOCK(&amp;frame-&gt;lock);</div><div class='add'>+post_unlock:</div><div class='add'>+    this_call_cnt = dht_frame_return(frame);</div><div class='add'>+    if (is_last_call(this_call_cnt)) {</div><div class='add'>+        if ((local-&gt;fop == GF_FOP_SETXATTR) ||</div><div class='add'>+            (local-&gt;fop == GF_FOP_FSETXATTR)) {</div><div class='add'>+            DHT_STACK_UNWIND(setxattr, frame, local-&gt;op_ret, local-&gt;op_errno,</div><div class='add'>+                             NULL);</div><div class='add'>+            /* 'local' itself may not be valid after this */</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+        if ((local-&gt;fop == GF_FOP_REMOVEXATTR) ||</div><div class='add'>+            (local-&gt;fop == GF_FOP_FREMOVEXATTR)) {</div><div class='add'>+            DHT_STACK_UNWIND(removexattr, frame, local-&gt;op_ret, local-&gt;op_errno,</div><div class='add'>+                             NULL);</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        return 0;</div><div class='add'>+out:</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+/* Set the value[] of key into dict after convert from</div><div class='add'>+   host byte order to network byte order</div><div class='add'>+*/</div><div class='add'>+int32_t</div><div class='add'>+dht_dict_set_array(dict_t *dict, char *key, int32_t value[], int32_t size)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int32_t *ptr = NULL;</div><div class='add'>+    int32_t vindex;</div><div class='add'>+</div><div class='add'>+    if (value == NULL) {</div><div class='add'>+        return -EINVAL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ptr = GF_MALLOC(sizeof(int32_t) * size, gf_common_mt_char);</div><div class='add'>+    if (ptr == NULL) {</div><div class='add'>+        return -ENOMEM;</div><div class='add'>+    }</div><div class='add'>+    for (vindex = 0; vindex &lt; size; vindex++) {</div><div class='add'>+        ptr[vindex] = hton32(value[vindex]);</div><div class='add'>+    }</div><div class='add'>+    ret = dict_set_bin(dict, key, ptr, sizeof(int32_t) * size);</div><div class='add'>+    if (ret)</div><div class='add'>+        GF_FREE(ptr);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-dht_readlink (call_frame_t *frame, xlator_t *this,</div><div class='del'>-	      loc_t *loc, size_t size)</div><div class='del'>-{</div><div class='del'>-	xlator_t     *subvol = NULL;</div><div class='del'>-        int           op_errno = -1;</div><div class='del'>-        dht_local_t  *local = NULL;</div><div class='del'>-</div><div class='del'>-        VALIDATE_OR_GOTO (frame, err);</div><div class='del'>-        VALIDATE_OR_GOTO (this, err);</div><div class='del'>-        VALIDATE_OR_GOTO (loc, err);</div><div class='del'>-        VALIDATE_OR_GOTO (loc-&gt;inode, err);</div><div class='del'>-        VALIDATE_OR_GOTO (loc-&gt;path, err);</div><div class='del'>-</div><div class='del'>-	subvol = dht_subvol_get_cached (this, loc-&gt;inode);</div><div class='del'>-	if (!subvol) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-			"no cached subvolume for path=%s", loc-&gt;path);</div><div class='del'>-		op_errno = EINVAL;</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	local = dht_local_init (frame);</div><div class='del'>-	if (!local) {</div><div class='del'>-		op_errno = ENOMEM;</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-			"Out of memory");</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-        local-&gt;ia_ino = loc-&gt;inode-&gt;ino;</div><div class='del'>- </div><div class='del'>-	STACK_WIND (frame, dht_readlink_cbk,</div><div class='del'>-		    subvol, subvol-&gt;fops-&gt;readlink,</div><div class='del'>-		    loc, size);</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='add'>+static int</div><div class='add'>+dht_common_mds_xattrop_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                           int32_t op_ret, int32_t op_errno, dict_t *dict,</div><div class='add'>+                           dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    call_frame_t *prev = cookie;</div><div class='ctx'> </div><div class='del'>-err:</div><div class='del'>-	op_errno = (op_errno == -1) ? errno : op_errno;</div><div class='del'>-	DHT_STACK_UNWIND (readlink, frame, -1, op_errno, NULL, NULL);</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+</div><div class='add'>+    if (op_ret)</div><div class='add'>+        gf_msg_debug(this-&gt;name, op_errno, "subvolume %s returned -1",</div><div class='add'>+                     prev-&gt;this-&gt;name);</div><div class='add'>+</div><div class='add'>+    if (local-&gt;fop == GF_FOP_SETXATTR) {</div><div class='add'>+        DHT_STACK_UNWIND(setxattr, frame, 0, op_errno, local-&gt;xdata);</div><div class='add'>+        /* 'local' itself may not be valid after this */</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (local-&gt;fop == GF_FOP_FSETXATTR) {</div><div class='add'>+        DHT_STACK_UNWIND(fsetxattr, frame, 0, op_errno, local-&gt;xdata);</div><div class='add'>+        /* 'local' itself may not be valid after this */</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (local-&gt;fop == GF_FOP_REMOVEXATTR) {</div><div class='add'>+        DHT_STACK_UNWIND(removexattr, frame, 0, op_errno, NULL);</div><div class='add'>+        /* 'local' itself may not be valid after this */</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (local-&gt;fop == GF_FOP_FREMOVEXATTR) {</div><div class='add'>+        DHT_STACK_UNWIND(fremovexattr, frame, 0, op_errno, NULL);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	return 0;</div><div class='add'>+out:</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+/* Code to wind a xattrop call to add 1 on current mds internal xattr</div><div class='add'>+   value</div><div class='add'>+*/</div><div class='add'>+static int</div><div class='add'>+dht_setxattr_non_mds_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                         int op_ret, int op_errno, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    int this_call_cnt = 0;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    dict_t *xattrop = NULL;</div><div class='add'>+    int32_t addone[1] = {1};</div><div class='add'>+    call_frame_t *prev = NULL;</div><div class='add'>+    dht_conf_t *conf = NULL;</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    prev = cookie;</div><div class='add'>+    conf = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;frame-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        if (op_ret &amp;&amp; !local-&gt;op_ret) {</div><div class='add'>+            local-&gt;op_ret = op_ret;</div><div class='add'>+            local-&gt;op_errno = op_errno;</div><div class='add'>+            UNLOCK(&amp;frame-&gt;lock);</div><div class='add'>+            gf_msg_debug(this-&gt;name, op_errno, "subvolume %s returned -1",</div><div class='add'>+                         prev-&gt;this-&gt;name);</div><div class='add'>+            goto post_unlock;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    UNLOCK(&amp;frame-&gt;lock);</div><div class='add'>+post_unlock:</div><div class='add'>+    this_call_cnt = dht_frame_return(frame);</div><div class='add'>+</div><div class='add'>+    if (is_last_call(this_call_cnt)) {</div><div class='add'>+        if (!local-&gt;op_ret) {</div><div class='add'>+            xattrop = dict_new();</div><div class='add'>+            if (!xattrop) {</div><div class='add'>+                gf_msg(this-&gt;name, GF_LOG_ERROR, DHT_MSG_NO_MEMORY, 0,</div><div class='add'>+                       "dictionary creation failed");</div><div class='add'>+                ret = -1;</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+            ret = dht_dict_set_array(xattrop, conf-&gt;mds_xattr_key, addone, 1);</div><div class='add'>+            if (ret != 0) {</div><div class='add'>+                gf_msg(this-&gt;name, GF_LOG_ERROR, 0, DHT_MSG_DICT_SET_FAILED,</div><div class='add'>+                       "dictionary set array failed ");</div><div class='add'>+                ret = -1;</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+            if ((local-&gt;fop == GF_FOP_SETXATTR) ||</div><div class='add'>+                (local-&gt;fop == GF_FOP_REMOVEXATTR)) {</div><div class='add'>+                STACK_WIND(frame, dht_common_mds_xattrop_cbk, local-&gt;mds_subvol,</div><div class='add'>+                           local-&gt;mds_subvol-&gt;fops-&gt;xattrop, &amp;local-&gt;loc,</div><div class='add'>+                           GF_XATTROP_ADD_ARRAY, xattrop, NULL);</div><div class='add'>+            } else {</div><div class='add'>+                STACK_WIND(frame, dht_common_mds_xattrop_cbk, local-&gt;mds_subvol,</div><div class='add'>+                           local-&gt;mds_subvol-&gt;fops-&gt;fxattrop, local-&gt;fd,</div><div class='add'>+                           GF_XATTROP_ADD_ARRAY, xattrop, NULL);</div><div class='add'>+            }</div><div class='add'>+        } else {</div><div class='add'>+            if (local-&gt;fop == GF_FOP_SETXATTR) {</div><div class='add'>+                DHT_STACK_UNWIND(setxattr, frame, 0, 0, local-&gt;xdata);</div><div class='add'>+                /* 'local' itself may not be valid after this */</div><div class='add'>+                goto just_return;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            if (local-&gt;fop == GF_FOP_FSETXATTR) {</div><div class='add'>+                DHT_STACK_UNWIND(fsetxattr, frame, 0, 0, local-&gt;xdata);</div><div class='add'>+                /* 'local' itself may not be valid after this */</div><div class='add'>+                goto just_return;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            if (local-&gt;fop == GF_FOP_REMOVEXATTR) {</div><div class='add'>+                DHT_STACK_UNWIND(removexattr, frame, 0, 0, NULL);</div><div class='add'>+                /* 'local' itself may not be valid after this */</div><div class='add'>+                goto just_return;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            if (local-&gt;fop == GF_FOP_FREMOVEXATTR) {</div><div class='add'>+                DHT_STACK_UNWIND(fremovexattr, frame, 0, 0, NULL);</div><div class='add'>+                /* 'local' itself may not be valid after this */</div><div class='add'>+                goto just_return;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+out:</div><div class='add'>+    if (ret) {</div><div class='add'>+        if (local-&gt;fop == GF_FOP_SETXATTR) {</div><div class='add'>+            DHT_STACK_UNWIND(setxattr, frame, 0, 0, local-&gt;xdata);</div><div class='add'>+            /* 'local' itself may not be valid after this */</div><div class='add'>+            goto just_return;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-dht_fix_layout_cbk (call_frame_t *frame, void *cookie,</div><div class='del'>-                    xlator_t *this, int32_t op_ret, int32_t op_errno)</div><div class='add'>+        if (local-&gt;fop == GF_FOP_FSETXATTR) {</div><div class='add'>+            DHT_STACK_UNWIND(fsetxattr, frame, 0, 0, local-&gt;xdata);</div><div class='add'>+            /* 'local' itself may not be valid after this */</div><div class='add'>+            goto just_return;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        if (local-&gt;fop == GF_FOP_REMOVEXATTR) {</div><div class='add'>+            DHT_STACK_UNWIND(removexattr, frame, 0, 0, NULL);</div><div class='add'>+            /* 'local' itself may not be valid after this */</div><div class='add'>+            goto just_return;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        if (local-&gt;fop == GF_FOP_FREMOVEXATTR) {</div><div class='add'>+            DHT_STACK_UNWIND(fremovexattr, frame, 0, 0, NULL);</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+just_return:</div><div class='add'>+    if (xattrop)</div><div class='add'>+        dict_unref(xattrop);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+dht_setxattr_mds_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                     int op_ret, int op_errno, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-        DHT_STACK_UNWIND (getxattr, frame, -1, ENODATA, NULL);</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    dht_conf_t *conf = NULL;</div><div class='add'>+    call_frame_t *prev = NULL;</div><div class='add'>+    xlator_t *mds_subvol = NULL;</div><div class='add'>+    int i = 0;</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    prev = cookie;</div><div class='add'>+    conf = this-&gt;private;</div><div class='add'>+    mds_subvol = local-&gt;mds_subvol;</div><div class='add'>+</div><div class='add'>+    if (op_ret == -1) {</div><div class='add'>+        local-&gt;op_ret = op_ret;</div><div class='add'>+        local-&gt;op_errno = op_errno;</div><div class='add'>+        gf_msg_debug(this-&gt;name, op_errno, "subvolume %s returned -1",</div><div class='add'>+                     prev-&gt;this-&gt;name);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    local-&gt;op_ret = 0;</div><div class='add'>+    local-&gt;call_cnt = conf-&gt;subvolume_cnt - 1;</div><div class='add'>+    local-&gt;xdata = dict_ref(xdata);</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; conf-&gt;subvolume_cnt; i++) {</div><div class='add'>+        if (mds_subvol &amp;&amp; (mds_subvol == conf-&gt;subvolumes[i]))</div><div class='add'>+            continue;</div><div class='add'>+        if (local-&gt;fop == GF_FOP_SETXATTR) {</div><div class='add'>+            STACK_WIND(frame, dht_setxattr_non_mds_cbk, conf-&gt;subvolumes[i],</div><div class='add'>+                       conf-&gt;subvolumes[i]-&gt;fops-&gt;setxattr, &amp;local-&gt;loc,</div><div class='add'>+                       local-&gt;xattr, local-&gt;flags, local-&gt;xattr_req);</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-        return 0;</div><div class='add'>+        if (local-&gt;fop == GF_FOP_FSETXATTR) {</div><div class='add'>+            STACK_WIND(frame, dht_setxattr_non_mds_cbk, conf-&gt;subvolumes[i],</div><div class='add'>+                       conf-&gt;subvolumes[i]-&gt;fops-&gt;fsetxattr, local-&gt;fd,</div><div class='add'>+                       local-&gt;xattr, local-&gt;flags, local-&gt;xattr_req);</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        if (local-&gt;fop == GF_FOP_REMOVEXATTR) {</div><div class='add'>+            STACK_WIND(frame, dht_setxattr_non_mds_cbk, conf-&gt;subvolumes[i],</div><div class='add'>+                       conf-&gt;subvolumes[i]-&gt;fops-&gt;removexattr, &amp;local-&gt;loc,</div><div class='add'>+                       local-&gt;key, local-&gt;xattr_req);</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        if (local-&gt;fop == GF_FOP_FREMOVEXATTR) {</div><div class='add'>+            STACK_WIND(frame, dht_setxattr_non_mds_cbk, conf-&gt;subvolumes[i],</div><div class='add'>+                       conf-&gt;subvolumes[i]-&gt;fops-&gt;fremovexattr, local-&gt;fd,</div><div class='add'>+                       local-&gt;key, local-&gt;xattr_req);</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+out:</div><div class='add'>+    if (local-&gt;fop == GF_FOP_SETXATTR) {</div><div class='add'>+        DHT_STACK_UNWIND(setxattr, frame, local-&gt;op_ret, local-&gt;op_errno,</div><div class='add'>+                         xdata);</div><div class='add'>+        /* 'local' itself may not be valid after this */</div><div class='add'>+        goto just_return;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (local-&gt;fop == GF_FOP_FSETXATTR) {</div><div class='add'>+        DHT_STACK_UNWIND(fsetxattr, frame, local-&gt;op_ret, local-&gt;op_errno,</div><div class='add'>+                         xdata);</div><div class='add'>+        /* 'local' itself may not be valid after this */</div><div class='add'>+        goto just_return;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (local-&gt;fop == GF_FOP_REMOVEXATTR) {</div><div class='add'>+        DHT_STACK_UNWIND(removexattr, frame, local-&gt;op_ret, local-&gt;op_errno,</div><div class='add'>+                         NULL);</div><div class='add'>+        /* 'local' itself may not be valid after this */</div><div class='add'>+        goto just_return;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (local-&gt;fop == GF_FOP_FREMOVEXATTR) {</div><div class='add'>+        DHT_STACK_UNWIND(fremovexattr, frame, local-&gt;op_ret, local-&gt;op_errno,</div><div class='add'>+                         NULL);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+just_return:</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+dht_xattrop_mds_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                    int op_ret, int op_errno, dict_t *dict, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    call_frame_t *prev = NULL;</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    prev = cookie;</div><div class='add'>+</div><div class='add'>+    if (op_ret == -1) {</div><div class='add'>+        local-&gt;op_errno = op_errno;</div><div class='add'>+        local-&gt;op_ret = op_ret;</div><div class='add'>+        gf_msg_debug(this-&gt;name, op_errno, "subvolume %s returned -1",</div><div class='add'>+                     prev-&gt;this-&gt;name);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (local-&gt;fop == GF_FOP_SETXATTR) {</div><div class='add'>+        STACK_WIND(frame, dht_setxattr_mds_cbk, local-&gt;mds_subvol,</div><div class='add'>+                   local-&gt;mds_subvol-&gt;fops-&gt;setxattr, &amp;local-&gt;loc, local-&gt;xattr,</div><div class='add'>+                   local-&gt;flags, local-&gt;xattr_req);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (local-&gt;fop == GF_FOP_FSETXATTR) {</div><div class='add'>+        STACK_WIND(frame, dht_setxattr_mds_cbk, local-&gt;mds_subvol,</div><div class='add'>+                   local-&gt;mds_subvol-&gt;fops-&gt;fsetxattr, local-&gt;fd, local-&gt;xattr,</div><div class='add'>+                   local-&gt;flags, local-&gt;xattr_req);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (local-&gt;fop == GF_FOP_REMOVEXATTR) {</div><div class='add'>+        STACK_WIND(frame, dht_setxattr_mds_cbk, local-&gt;mds_subvol,</div><div class='add'>+                   local-&gt;mds_subvol-&gt;fops-&gt;removexattr, &amp;local-&gt;loc,</div><div class='add'>+                   local-&gt;key, local-&gt;xattr_req);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (local-&gt;fop == GF_FOP_FREMOVEXATTR) {</div><div class='add'>+        STACK_WIND(frame, dht_setxattr_mds_cbk, local-&gt;mds_subvol,</div><div class='add'>+                   local-&gt;mds_subvol-&gt;fops-&gt;fremovexattr, local-&gt;fd, local-&gt;key,</div><div class='add'>+                   local-&gt;xattr_req);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+out:</div><div class='add'>+    if (local-&gt;fop == GF_FOP_SETXATTR) {</div><div class='add'>+        DHT_STACK_UNWIND(setxattr, frame, local-&gt;op_ret, local-&gt;op_errno,</div><div class='add'>+                         xdata);</div><div class='add'>+        /* 'local' itself may not be valid after this */</div><div class='add'>+        goto just_return;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (local-&gt;fop == GF_FOP_FSETXATTR) {</div><div class='add'>+        DHT_STACK_UNWIND(fsetxattr, frame, local-&gt;op_ret, local-&gt;op_errno,</div><div class='add'>+                         xdata);</div><div class='add'>+        /* 'local' itself may not be valid after this */</div><div class='add'>+        goto just_return;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (local-&gt;fop == GF_FOP_REMOVEXATTR) {</div><div class='add'>+        DHT_STACK_UNWIND(removexattr, frame, local-&gt;op_ret, local-&gt;op_errno,</div><div class='add'>+                         NULL);</div><div class='add'>+        /* 'local' itself may not be valid after this */</div><div class='add'>+        goto just_return;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (local-&gt;fop == GF_FOP_FREMOVEXATTR) {</div><div class='add'>+        DHT_STACK_UNWIND(fremovexattr, frame, local-&gt;op_ret, local-&gt;op_errno,</div><div class='add'>+                         NULL);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+just_return:</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> static void</div><div class='del'>-fill_layout_info (dht_layout_t *layout, char *buf)</div><div class='add'>+fill_layout_info(dht_layout_t *layout, char *buf)</div><div class='ctx'> {</div><div class='del'>-        int i = 0;</div><div class='del'>-        char tmp_buf[128] = {0,};</div><div class='add'>+    int i = 0;</div><div class='add'>+    char tmp_buf[128] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; layout-&gt;cnt; i++) {</div><div class='add'>+        snprintf(tmp_buf, sizeof(tmp_buf), "(%s %u %u)",</div><div class='add'>+                 layout-&gt;list[i].xlator-&gt;name, layout-&gt;list[i].start,</div><div class='add'>+                 layout-&gt;list[i].stop);</div><div class='add'>+        if (i)</div><div class='add'>+            strcat(buf, " ");</div><div class='add'>+        strcat(buf, tmp_buf);</div><div class='add'>+    }</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        for (i = 0; i &lt; layout-&gt;cnt; i++) {</div><div class='del'>-                snprintf (tmp_buf, 128, "(%s %u %u)",</div><div class='del'>-                          layout-&gt;list[i].xlator-&gt;name,</div><div class='del'>-                          layout-&gt;list[i].start,</div><div class='del'>-                          layout-&gt;list[i].stop);</div><div class='del'>-                if (i)</div><div class='del'>-                        strcat (buf, " ");</div><div class='del'>-                strcat (buf, tmp_buf);</div><div class='add'>+static void</div><div class='add'>+dht_fill_pathinfo_xattr(xlator_t *this, dht_local_t *local, char *xattr_buf,</div><div class='add'>+                        int32_t alloc_len, int flag, char *layout_buf)</div><div class='add'>+{</div><div class='add'>+    if (flag) {</div><div class='add'>+        if (local-&gt;xattr_val) {</div><div class='add'>+            snprintf(xattr_buf, alloc_len,</div><div class='add'>+                     "((&lt;" DHT_PATHINFO_HEADER "%s&gt; %s) (%s-layout %s))",</div><div class='add'>+                     this-&gt;name, local-&gt;xattr_val, this-&gt;name, layout_buf);</div><div class='add'>+        } else {</div><div class='add'>+            snprintf(xattr_buf, alloc_len, "(%s-layout %s)", this-&gt;name,</div><div class='add'>+                     layout_buf);</div><div class='ctx'>         }</div><div class='add'>+    } else if (local-&gt;xattr_val) {</div><div class='add'>+        snprintf(xattr_buf, alloc_len, "(&lt;" DHT_PATHINFO_HEADER "%s&gt; %s)",</div><div class='add'>+                 this-&gt;name, local-&gt;xattr_val);</div><div class='add'>+    } else {</div><div class='add'>+        xattr_buf[0] = '\0';</div><div class='add'>+    }</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-dht_pathinfo_getxattr_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-                           int op_ret, int op_errno, dict_t *xattr)</div><div class='del'>-{</div><div class='del'>-	dht_local_t  *local = NULL;</div><div class='del'>-        int ret = 0;</div><div class='del'>-        int flag = 0;</div><div class='del'>-        int this_call_cnt = 0;</div><div class='del'>-        char *value_got = NULL;</div><div class='del'>-        char  layout_buf[8192] = {0,};</div><div class='del'>-        char  xattr_buf[8192 + 1024] = {0,};</div><div class='del'>-        dict_t *dict = NULL;</div><div class='add'>+static int</div><div class='add'>+dht_vgetxattr_alloc_and_fill(dht_local_t *local, dict_t *xattr, xlator_t *this,</div><div class='add'>+                             int op_errno)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    char *value = NULL;</div><div class='add'>+</div><div class='add'>+    ret = dict_get_str(xattr, local-&gt;xsel, &amp;value);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_ERROR, op_errno, DHT_MSG_GET_XATTR_FAILED,</div><div class='add'>+               "Subvolume %s returned -1", this-&gt;name);</div><div class='add'>+        local-&gt;op_ret = -1;</div><div class='add'>+        local-&gt;op_errno = op_errno;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    local-&gt;alloc_len += strlen(value);</div><div class='add'>+</div><div class='add'>+    if (!local-&gt;xattr_val) {</div><div class='add'>+        local-&gt;alloc_len += (SLEN(DHT_PATHINFO_HEADER) + 10);</div><div class='add'>+        local-&gt;xattr_val = GF_MALLOC(local-&gt;alloc_len, gf_common_mt_char);</div><div class='add'>+        if (!local-&gt;xattr_val) {</div><div class='add'>+            ret = -1;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+        local-&gt;xattr_val[0] = '\0';</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    int plen = strlen(local-&gt;xattr_val);</div><div class='add'>+    if (plen) {</div><div class='add'>+        /* extra byte(s) for \0 to be safe */</div><div class='add'>+        local-&gt;alloc_len += (plen + 2);</div><div class='add'>+        local-&gt;xattr_val = GF_REALLOC(local-&gt;xattr_val, local-&gt;alloc_len);</div><div class='add'>+        if (!local-&gt;xattr_val) {</div><div class='add'>+            ret = -1;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        local = frame-&gt;local;</div><div class='add'>+    (void)strcat(local-&gt;xattr_val, value);</div><div class='add'>+    (void)strcat(local-&gt;xattr_val, " ");</div><div class='add'>+    local-&gt;op_ret = 0;</div><div class='ctx'> </div><div class='del'>-        if (op_ret != -1) {</div><div class='del'>-                ret = dict_get_str (xattr, GF_XATTR_PATHINFO_KEY, &amp;value_got);</div><div class='del'>-                if (!ret) {</div><div class='del'>-                        if (!local-&gt;pathinfo)</div><div class='del'>-                                local-&gt;pathinfo = GF_CALLOC (8192, sizeof (char),</div><div class='del'>-                                                             gf_common_mt_char);</div><div class='del'>-                        if (local-&gt;pathinfo)</div><div class='del'>-                                strcat (local-&gt;pathinfo, value_got);</div><div class='del'>-                }</div><div class='add'>+    ret = 0;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+dht_vgetxattr_fill_and_set(dht_local_t *local, dict_t **dict, xlator_t *this,</div><div class='add'>+                           gf_boolean_t flag)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    char *xattr_buf = NULL;</div><div class='add'>+    char layout_buf[8192] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    if (flag)</div><div class='add'>+        fill_layout_info(local-&gt;layout, layout_buf);</div><div class='add'>+</div><div class='add'>+    *dict = dict_new();</div><div class='add'>+    if (!*dict)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    local-&gt;xattr_val[strlen(local-&gt;xattr_val) - 1] = '\0';</div><div class='add'>+</div><div class='add'>+    /* we would need max this many bytes to create xattr string</div><div class='add'>+     * extra 40 bytes is just an estimated amount of additional</div><div class='add'>+     * space required as we include translator name and some</div><div class='add'>+     * spaces, brackets etc. when forming the pathinfo string.</div><div class='add'>+     *</div><div class='add'>+     * For node-uuid we just don't have all the pretty formatting,</div><div class='add'>+     * but since this is a generic routine for pathinfo &amp; node-uuid</div><div class='add'>+     * we don't have conditional space allocation and try to be</div><div class='add'>+     * generic</div><div class='add'>+     */</div><div class='add'>+    local-&gt;alloc_len += (2 * strlen(this-&gt;name)) + strlen(layout_buf) + 40;</div><div class='add'>+    xattr_buf = GF_MALLOC(local-&gt;alloc_len, gf_common_mt_char);</div><div class='add'>+    if (!xattr_buf)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    if (XATTR_IS_PATHINFO(local-&gt;xsel)) {</div><div class='add'>+        (void)dht_fill_pathinfo_xattr(this, local, xattr_buf, local-&gt;alloc_len,</div><div class='add'>+                                      flag, layout_buf);</div><div class='add'>+    } else if ((XATTR_IS_NODE_UUID(local-&gt;xsel)) ||</div><div class='add'>+               (XATTR_IS_NODE_UUID_LIST(local-&gt;xsel))) {</div><div class='add'>+        (void)snprintf(xattr_buf, local-&gt;alloc_len, "%s", local-&gt;xattr_val);</div><div class='add'>+    } else {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_WARNING, 0, DHT_MSG_GET_XATTR_FAILED,</div><div class='add'>+               "Unknown local-&gt;xsel (%s)", local-&gt;xsel);</div><div class='add'>+        GF_FREE(xattr_buf);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_set_dynstr(*dict, local-&gt;xsel, xattr_buf);</div><div class='add'>+    if (ret)</div><div class='add'>+        GF_FREE(xattr_buf);</div><div class='add'>+    GF_FREE(local-&gt;xattr_val);</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+dht_find_local_subvol_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                          int op_ret, int op_errno, dict_t *xattr,</div><div class='add'>+                          dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    dht_conf_t *conf = NULL;</div><div class='add'>+    xlator_t *prev = NULL;</div><div class='add'>+    int this_call_cnt = 0;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    char *uuid_str = NULL;</div><div class='add'>+    char *uuid_list = NULL;</div><div class='add'>+    char *next_uuid_str = NULL;</div><div class='add'>+    char *saveptr = NULL;</div><div class='add'>+    uuid_t node_uuid = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    char *uuid_list_copy = NULL;</div><div class='add'>+    int count = 0;</div><div class='add'>+    int i = 0;</div><div class='add'>+    int index = 0;</div><div class='add'>+    int found = 0;</div><div class='add'>+    nodeuuid_info_t *tmp_ptr = NULL;</div><div class='add'>+</div><div class='add'>+    VALIDATE_OR_GOTO(frame, out);</div><div class='add'>+    VALIDATE_OR_GOTO(frame-&gt;local, out);</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    prev = cookie;</div><div class='add'>+    conf = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    VALIDATE_OR_GOTO(conf-&gt;defrag, out);</div><div class='add'>+</div><div class='add'>+    gf_msg_debug(this-&gt;name, 0, "subvol %s returned", prev-&gt;name);</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;frame-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        this_call_cnt = --local-&gt;call_cnt;</div><div class='add'>+        if (op_ret &lt; 0) {</div><div class='add'>+            local-&gt;op_ret = -1;</div><div class='add'>+            local-&gt;op_errno = op_errno;</div><div class='add'>+            UNLOCK(&amp;frame-&gt;lock);</div><div class='add'>+            if (op_errno == ENODATA)</div><div class='add'>+                gf_msg_debug(this-&gt;name, 0, "failed to get node-uuid");</div><div class='add'>+            else</div><div class='add'>+                gf_msg(this-&gt;name, GF_LOG_ERROR, op_errno,</div><div class='add'>+                       DHT_MSG_GET_XATTR_FAILED, "failed to get node-uuid");</div><div class='add'>+            goto post_unlock;</div><div class='ctx'>         }</div><div class='ctx'> </div><div class='del'>-        this_call_cnt = dht_frame_return (frame);</div><div class='del'>-        if (is_last_call (this_call_cnt)) {</div><div class='del'>-                if (local-&gt;layout-&gt;cnt &gt; 1) {</div><div class='del'>-                        /* Set it for directory */</div><div class='del'>-                        fill_layout_info (local-&gt;layout, layout_buf);</div><div class='del'>-                        flag = 1;</div><div class='del'>-                }</div><div class='add'>+        ret = dict_get_str(xattr, local-&gt;xsel, &amp;uuid_list);</div><div class='ctx'> </div><div class='del'>-                dict = dict_new ();</div><div class='add'>+        if (ret &lt; 0) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, 0, DHT_MSG_DICT_GET_FAILED,</div><div class='add'>+                   "Failed to get %s", local-&gt;xsel);</div><div class='add'>+            local-&gt;op_ret = -1;</div><div class='add'>+            local-&gt;op_errno = EINVAL;</div><div class='add'>+            goto unlock;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-                if (flag &amp;&amp; local-&gt;pathinfo)</div><div class='del'>-                        snprintf (xattr_buf, 9216, "((%s %s) (%s-layout %s))",</div><div class='del'>-                                  this-&gt;name, local-&gt;pathinfo, this-&gt;name,</div><div class='del'>-                                  layout_buf);</div><div class='del'>-                else if (local-&gt;pathinfo)</div><div class='del'>-                        snprintf (xattr_buf, 9216, "(%s %s)",</div><div class='del'>-                                  this-&gt;name, local-&gt;pathinfo);</div><div class='del'>-                else if (flag)</div><div class='del'>-                        snprintf (xattr_buf, 9216, "(%s-layout %s)",</div><div class='del'>-                                  this-&gt;name, layout_buf);</div><div class='add'>+        /* As DHT will not know details of its child xlators</div><div class='add'>+         * we need to parse this twice to get the count first</div><div class='add'>+         * and allocate memory later.</div><div class='add'>+         */</div><div class='add'>+        count = 0;</div><div class='add'>+        index = conf-&gt;local_subvols_cnt;</div><div class='ctx'> </div><div class='del'>-                ret = dict_set_str (dict, GF_XATTR_PATHINFO_KEY,</div><div class='del'>-                                    xattr_buf);</div><div class='add'>+        uuid_list_copy = gf_strdup(uuid_list);</div><div class='add'>+        if (!uuid_list_copy)</div><div class='add'>+            goto unlock;</div><div class='ctx'> </div><div class='del'>-                if (local-&gt;pathinfo)</div><div class='del'>-                        GF_FREE (local-&gt;pathinfo);</div><div class='del'>-                GF_FREE (local-&gt;key);</div><div class='add'>+        for (uuid_str = strtok_r(uuid_list, " ", &amp;saveptr); uuid_str;</div><div class='add'>+             uuid_str = next_uuid_str) {</div><div class='add'>+            next_uuid_str = strtok_r(NULL, " ", &amp;saveptr);</div><div class='add'>+            if (gf_uuid_parse(uuid_str, node_uuid)) {</div><div class='add'>+                local-&gt;op_ret = -1;</div><div class='add'>+                local-&gt;op_errno = EINVAL;</div><div class='add'>+                UNLOCK(&amp;frame-&gt;lock);</div><div class='add'>+                gf_msg(this-&gt;name, GF_LOG_ERROR, 0, DHT_MSG_UUID_PARSE_ERROR,</div><div class='add'>+                       "Failed to parse uuid for %s", prev-&gt;name);</div><div class='add'>+                goto post_unlock;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            count++;</div><div class='add'>+            if (gf_uuid_compare(node_uuid, conf-&gt;defrag-&gt;node_uuid)) {</div><div class='add'>+                gf_msg_debug(this-&gt;name, 0,</div><div class='add'>+                             "subvol %s does not"</div><div class='add'>+                             "belong to this node",</div><div class='add'>+                             prev-&gt;name);</div><div class='add'>+            } else {</div><div class='add'>+                /* handle multiple bricks of the same replica</div><div class='add'>+                 * on the same node */</div><div class='add'>+                if (found)</div><div class='add'>+                    continue;</div><div class='add'>+                conf-&gt;local_subvols[(conf-&gt;local_subvols_cnt)++] = prev;</div><div class='add'>+                found = 1;</div><div class='add'>+                gf_msg_debug(this-&gt;name, 0,</div><div class='add'>+                             "subvol %s belongs to"</div><div class='add'>+                             " this node",</div><div class='add'>+                             prev-&gt;name);</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        if (!found) {</div><div class='add'>+            local-&gt;op_ret = 0;</div><div class='add'>+            goto unlock;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-                DHT_STACK_UNWIND (getxattr, frame, op_ret, op_errno, dict);</div><div class='add'>+        conf-&gt;local_nodeuuids[index].count = count;</div><div class='add'>+        conf-&gt;local_nodeuuids[index].elements = GF_CALLOC(</div><div class='add'>+            count, sizeof(nodeuuid_info_t), 1);</div><div class='ctx'> </div><div class='del'>-                if (dict)</div><div class='del'>-                        dict_unref (dict);</div><div class='add'>+        /* The node-uuids are guaranteed to be returned in the same</div><div class='add'>+         * order as the bricks</div><div class='add'>+         * A null node-uuid is returned for a brick that is down.</div><div class='add'>+         */</div><div class='ctx'> </div><div class='del'>-                return 0;</div><div class='add'>+        saveptr = NULL;</div><div class='add'>+        i = 0;</div><div class='add'>+</div><div class='add'>+        for (uuid_str = strtok_r(uuid_list_copy, " ", &amp;saveptr); uuid_str;</div><div class='add'>+             uuid_str = next_uuid_str) {</div><div class='add'>+            next_uuid_str = strtok_r(NULL, " ", &amp;saveptr);</div><div class='add'>+            tmp_ptr = &amp;(conf-&gt;local_nodeuuids[index].elements[i]);</div><div class='add'>+            gf_uuid_parse(uuid_str, tmp_ptr-&gt;uuid);</div><div class='add'>+</div><div class='add'>+            if (!gf_uuid_compare(tmp_ptr-&gt;uuid, conf-&gt;defrag-&gt;node_uuid)) {</div><div class='add'>+                tmp_ptr-&gt;info = REBAL_NODEUUID_MINE;</div><div class='add'>+            }</div><div class='add'>+            i++;</div><div class='add'>+            tmp_ptr = NULL;</div><div class='ctx'>         }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    local-&gt;op_ret = 0;</div><div class='add'>+unlock:</div><div class='add'>+    UNLOCK(&amp;frame-&gt;lock);</div><div class='add'>+post_unlock:</div><div class='add'>+    if (!is_last_call(this_call_cnt))</div><div class='add'>+        goto out;</div><div class='ctx'> </div><div class='del'>-        if (local-&gt;pathinfo)</div><div class='del'>-                strcat (local-&gt;pathinfo, " Link: ");</div><div class='add'>+    if (local-&gt;op_ret == -1) {</div><div class='add'>+        goto unwind;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        /* This will happen if there pending */</div><div class='del'>-        STACK_WIND (frame, dht_pathinfo_getxattr_cbk, local-&gt;hashed_subvol,</div><div class='del'>-                    local-&gt;hashed_subvol-&gt;fops-&gt;getxattr,</div><div class='del'>-                    &amp;local-&gt;loc, local-&gt;key);</div><div class='add'>+    DHT_STACK_UNWIND(getxattr, frame, 0, 0, xattr, xdata);</div><div class='add'>+    goto out;</div><div class='ctx'> </div><div class='del'>-        return 0;</div><div class='add'>+unwind:</div><div class='add'>+</div><div class='add'>+    GF_FREE(conf-&gt;local_nodeuuids[index].elements);</div><div class='add'>+    conf-&gt;local_nodeuuids[index].elements = NULL;</div><div class='add'>+</div><div class='add'>+    DHT_STACK_UNWIND(getxattr, frame, -1, local-&gt;op_errno, NULL, xdata);</div><div class='add'>+out:</div><div class='add'>+    GF_FREE(uuid_list_copy);</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-dht_linkinfo_getxattr_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-                           int op_ret, int op_errno, dict_t *xattr)</div><div class='del'>-{</div><div class='del'>-        int   ret   = 0;</div><div class='del'>-        char *value = NULL;</div><div class='del'>-</div><div class='del'>-        if (op_ret != -1) {</div><div class='del'>-                ret = dict_get_str (xattr, GF_XATTR_PATHINFO_KEY, &amp;value);</div><div class='del'>-                if (!ret) {</div><div class='del'>-                        ret = dict_set_str (xattr, GF_XATTR_LINKINFO_KEY, value);</div><div class='del'>-                        if (!ret)</div><div class='del'>-                                gf_log (this-&gt;name, GF_LOG_TRACE,</div><div class='del'>-                                        "failed to set linkinfo");</div><div class='del'>-                }</div><div class='add'>+static int</div><div class='add'>+dht_vgetxattr_dir_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                      int op_ret, int op_errno, dict_t *xattr, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    int this_call_cnt = 0;</div><div class='add'>+    dict_t *dict = NULL;</div><div class='add'>+</div><div class='add'>+    VALIDATE_OR_GOTO(frame, out);</div><div class='add'>+    VALIDATE_OR_GOTO(frame-&gt;local, out);</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;frame-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        this_call_cnt = --local-&gt;call_cnt;</div><div class='add'>+        if (op_ret &lt; 0) {</div><div class='add'>+            if (op_errno != ENOTCONN) {</div><div class='add'>+                local-&gt;op_ret = -1;</div><div class='add'>+                local-&gt;op_errno = op_errno;</div><div class='add'>+                UNLOCK(&amp;frame-&gt;lock);</div><div class='add'>+                gf_msg(this-&gt;name, GF_LOG_ERROR, op_errno,</div><div class='add'>+                       DHT_MSG_GET_XATTR_FAILED, "getxattr err for dir");</div><div class='add'>+                goto post_unlock;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            goto unlock;</div><div class='ctx'>         }</div><div class='ctx'> </div><div class='del'>-        DHT_STACK_UNWIND (getxattr, frame, op_ret, op_errno, xattr);</div><div class='add'>+        ret = dht_vgetxattr_alloc_and_fill(local, xattr, this, op_errno);</div><div class='add'>+        if (ret) {</div><div class='add'>+            UNLOCK(&amp;frame-&gt;lock);</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, op_errno, DHT_MSG_DICT_SET_FAILED,</div><div class='add'>+                   "alloc or fill failure");</div><div class='add'>+            goto post_unlock;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+unlock:</div><div class='add'>+    UNLOCK(&amp;frame-&gt;lock);</div><div class='add'>+post_unlock:</div><div class='add'>+    if (!is_last_call(this_call_cnt))</div><div class='add'>+        goto out;</div><div class='ctx'> </div><div class='del'>-        return 0;</div><div class='add'>+    /* -- last call: do patch ups -- */</div><div class='add'>+</div><div class='add'>+    if (local-&gt;op_ret == -1) {</div><div class='add'>+        goto unwind;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dht_vgetxattr_fill_and_set(local, &amp;dict, this, _gf_true);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto unwind;</div><div class='add'>+</div><div class='add'>+    DHT_STACK_UNWIND(getxattr, frame, 0, 0, dict, xdata);</div><div class='add'>+    goto cleanup;</div><div class='add'>+</div><div class='add'>+unwind:</div><div class='add'>+    DHT_STACK_UNWIND(getxattr, frame, -1, local-&gt;op_errno, NULL, NULL);</div><div class='add'>+cleanup:</div><div class='add'>+    if (dict)</div><div class='add'>+        dict_unref(dict);</div><div class='add'>+out:</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-dht_getxattr_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-		  int op_ret, int op_errno, dict_t *xattr)</div><div class='add'>+static int</div><div class='add'>+dht_vgetxattr_cbk(call_frame_t *frame, void *cookie, xlator_t *this, int op_ret,</div><div class='add'>+                  int op_errno, dict_t *xattr, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-        if (op_ret != -1) {</div><div class='del'>-                if (dict_get (xattr, "trusted.glusterfs.dht")) {</div><div class='del'>-                        dict_del (xattr, "trusted.glusterfs.dht");</div><div class='del'>-                }</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    dict_t *dict = NULL;</div><div class='add'>+    xlator_t *prev = NULL;</div><div class='add'>+    gf_boolean_t flag = _gf_true;</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    prev = cookie;</div><div class='add'>+</div><div class='add'>+    if (op_ret &lt; 0) {</div><div class='add'>+        local-&gt;op_ret = -1;</div><div class='add'>+        local-&gt;op_errno = op_errno;</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_ERROR, op_errno, DHT_MSG_GET_XATTR_FAILED,</div><div class='add'>+               "vgetxattr: Subvolume %s returned -1", prev-&gt;name);</div><div class='add'>+        goto unwind;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dht_vgetxattr_alloc_and_fill(local, xattr, this, op_errno);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_ERROR, 0, DHT_MSG_NO_MEMORY,</div><div class='add'>+               "Allocation or fill failure");</div><div class='add'>+        goto unwind;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    flag = (local-&gt;layout-&gt;cnt &gt; 1) ? _gf_true : _gf_false;</div><div class='add'>+</div><div class='add'>+    ret = dht_vgetxattr_fill_and_set(local, &amp;dict, this, flag);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto unwind;</div><div class='add'>+</div><div class='add'>+    DHT_STACK_UNWIND(getxattr, frame, 0, 0, dict, xdata);</div><div class='add'>+    goto cleanup;</div><div class='add'>+</div><div class='add'>+unwind:</div><div class='add'>+    DHT_STACK_UNWIND(getxattr, frame, -1, local-&gt;op_errno, NULL, NULL);</div><div class='add'>+cleanup:</div><div class='add'>+    if (dict)</div><div class='add'>+        dict_unref(dict);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+dht_linkinfo_getxattr_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                          int op_ret, int op_errno, dict_t *xattr,</div><div class='add'>+                          dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+    char *value = NULL;</div><div class='add'>+</div><div class='add'>+    if (op_ret != -1) {</div><div class='add'>+        ret = dict_get_str(xattr, GF_XATTR_PATHINFO_KEY, &amp;value);</div><div class='add'>+        if (!ret) {</div><div class='add'>+            ret = dict_set_str(xattr, GF_XATTR_LINKINFO_KEY, value);</div><div class='add'>+            if (!ret)</div><div class='add'>+                gf_msg_trace(this-&gt;name, 0, "failed to set linkinfo");</div><div class='ctx'>         }</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        DHT_STACK_UNWIND (getxattr, frame, op_ret, op_errno, xattr);</div><div class='add'>+    DHT_STACK_UNWIND(getxattr, frame, op_ret, op_errno, xattr, xdata);</div><div class='ctx'> </div><div class='del'>-        return 0;</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+static int</div><div class='add'>+dht_mds_getxattr_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                     int op_ret, int op_errno, dict_t *xattr, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    dht_conf_t *conf = NULL;</div><div class='add'>+</div><div class='add'>+    VALIDATE_OR_GOTO(frame, err);</div><div class='add'>+    VALIDATE_OR_GOTO(frame-&gt;local, err);</div><div class='add'>+    VALIDATE_OR_GOTO(this-&gt;private, err);</div><div class='add'>+</div><div class='add'>+    conf = this-&gt;private;</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+</div><div class='add'>+    if (!xattr || (op_ret == -1)) {</div><div class='add'>+        local-&gt;op_ret = op_ret;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    dict_del(xattr, conf-&gt;xattr_name);</div><div class='add'>+    local-&gt;op_ret = 0;</div><div class='add'>+</div><div class='add'>+    if (!local-&gt;xattr) {</div><div class='add'>+        local-&gt;xattr = dict_copy_with_ref(xattr, NULL);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    DHT_STACK_UNWIND(getxattr, frame, local-&gt;op_ret, op_errno, local-&gt;xattr,</div><div class='add'>+                     xdata);</div><div class='add'>+    return 0;</div><div class='add'>+err:</div><div class='add'>+    DHT_STACK_UNWIND(getxattr, frame, -1, EINVAL, NULL, NULL);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-dht_getxattr (call_frame_t *frame, xlator_t *this,</div><div class='del'>-	      loc_t *loc, const char *key)</div><div class='del'>-{</div><div class='del'>-	xlator_t     *subvol        = NULL;</div><div class='del'>-	xlator_t     *hashed_subvol = NULL;</div><div class='del'>-	xlator_t     *cached_subvol = NULL;</div><div class='del'>-	dht_conf_t   *conf          = NULL;</div><div class='del'>-	dht_local_t  *local         = NULL;</div><div class='del'>-        dht_layout_t *layout        = NULL;</div><div class='del'>-        int           op_errno      = -1;</div><div class='del'>-        int           ret           = 0;</div><div class='del'>-        int           flag          = 0;</div><div class='del'>-        int           i             = 0;</div><div class='del'>-</div><div class='del'>-        VALIDATE_OR_GOTO (frame, err);</div><div class='del'>-        VALIDATE_OR_GOTO (this, err);</div><div class='del'>-        VALIDATE_OR_GOTO (loc, err);</div><div class='del'>-        VALIDATE_OR_GOTO (loc-&gt;inode, err);</div><div class='del'>-        VALIDATE_OR_GOTO (loc-&gt;path, err);</div><div class='del'>-</div><div class='del'>-        conf   = this-&gt;private;</div><div class='del'>-        layout = dht_layout_get (this, loc-&gt;inode);</div><div class='del'>-        if (key &amp;&amp; (strcmp (key, GF_XATTR_PATHINFO_KEY) == 0)) {</div><div class='del'>-                hashed_subvol = dht_subvol_get_hashed (this, loc);</div><div class='del'>-                cached_subvol = dht_subvol_get_cached (this, loc-&gt;inode);</div><div class='del'>-</div><div class='del'>-                local = dht_local_init (frame);</div><div class='del'>-                if (!local) {</div><div class='del'>-                        op_errno = ENOMEM;</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-                                "Out of memory");</div><div class='del'>-                        goto err;</div><div class='del'>-                }</div><div class='add'>+dht_getxattr_cbk(call_frame_t *frame, void *cookie, xlator_t *this, int op_ret,</div><div class='add'>+                 int op_errno, dict_t *xattr, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    int this_call_cnt = 0;</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    dht_conf_t *conf = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    VALIDATE_OR_GOTO(frame, err);</div><div class='add'>+    VALIDATE_OR_GOTO(frame-&gt;local, err);</div><div class='add'>+    VALIDATE_OR_GOTO(this-&gt;private, err);</div><div class='add'>+</div><div class='add'>+    conf = this-&gt;private;</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+</div><div class='add'>+    if (dht_check_remote_fd_failed_error(local, op_ret, op_errno)) {</div><div class='add'>+        ret = dht_check_and_open_fd_on_subvol(this, frame);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto err;</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-                ret = loc_dup (loc, &amp;local-&gt;loc);</div><div class='del'>-                if (ret == -1) {</div><div class='del'>-                        op_errno = ENOMEM;</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-                                "Out of memory");</div><div class='del'>-                        goto err;</div><div class='del'>-                }</div><div class='del'>-                local-&gt;key = gf_strdup (key);</div><div class='del'>-                if (!local-&gt;key) {</div><div class='del'>-                        op_errno = ENOMEM;</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-                                "Out of memory");</div><div class='del'>-                        goto err;</div><div class='del'>-                }</div><div class='del'>-                local-&gt;layout = layout;</div><div class='add'>+    LOCK(&amp;frame-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        if (!xattr || (op_ret == -1)) {</div><div class='add'>+            local-&gt;op_ret = op_ret;</div><div class='add'>+            goto unlock;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-                local-&gt;call_cnt = 1;</div><div class='del'>-                if (hashed_subvol != cached_subvol) {</div><div class='del'>-                        local-&gt;call_cnt = 2;</div><div class='del'>-                        local-&gt;hashed_subvol = hashed_subvol;</div><div class='del'>-                }</div><div class='add'>+        dict_del(xattr, conf-&gt;xattr_name);</div><div class='add'>+        dict_del(xattr, conf-&gt;mds_xattr_key);</div><div class='ctx'> </div><div class='del'>-                STACK_WIND (frame, dht_pathinfo_getxattr_cbk, cached_subvol,</div><div class='del'>-                            cached_subvol-&gt;fops-&gt;getxattr, loc, key);</div><div class='add'>+        dict_del(xattr, conf-&gt;commithash_xattr_name);</div><div class='ctx'> </div><div class='del'>-                return 0;</div><div class='add'>+        if (frame-&gt;root-&gt;pid &gt;= 0) {</div><div class='add'>+            GF_REMOVE_INTERNAL_XATTR("trusted.glusterfs.quota*", xattr);</div><div class='add'>+            GF_REMOVE_INTERNAL_XATTR("trusted.pgfid*", xattr);</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        local-&gt;op_ret = 0;</div><div class='add'>+</div><div class='add'>+        if (!local-&gt;xattr) {</div><div class='add'>+            local-&gt;xattr = dict_copy_with_ref(xattr, NULL);</div><div class='add'>+        } else {</div><div class='add'>+            dht_aggregate_xattr(local-&gt;xattr, xattr);</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        if (!local-&gt;xdata) {</div><div class='add'>+            local-&gt;xdata = dict_ref(xdata);</div><div class='add'>+        } else if ((local-&gt;inode &amp;&amp; IA_ISDIR(local-&gt;inode-&gt;ia_type)) ||</div><div class='add'>+                   (local-&gt;fd &amp;&amp; IA_ISDIR(local-&gt;fd-&gt;inode-&gt;ia_type))) {</div><div class='add'>+            dht_aggregate_xattr(local-&gt;xdata, xdata);</div><div class='ctx'>         }</div><div class='del'>-        if (key &amp;&amp; (strcmp (key, GF_XATTR_LINKINFO_KEY) == 0)) {</div><div class='del'>-                hashed_subvol = dht_subvol_get_hashed (this, loc);</div><div class='del'>-                cached_subvol = dht_subvol_get_cached (this, loc-&gt;inode);</div><div class='del'>-                if (hashed_subvol == cached_subvol) {</div><div class='del'>-                        op_errno = ENODATA;</div><div class='del'>-                        goto err;</div><div class='add'>+    }</div><div class='add'>+unlock:</div><div class='add'>+    UNLOCK(&amp;frame-&gt;lock);</div><div class='add'>+</div><div class='add'>+    this_call_cnt = dht_frame_return(frame);</div><div class='add'>+    if (is_last_call(this_call_cnt)) {</div><div class='add'>+        /* If we have a valid xattr received from any one of the</div><div class='add'>+         * subvolume, let's return it */</div><div class='add'>+        if (local-&gt;xattr) {</div><div class='add'>+            local-&gt;op_ret = 0;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        DHT_STACK_UNWIND(getxattr, frame, local-&gt;op_ret, op_errno, local-&gt;xattr,</div><div class='add'>+                         local-&gt;xdata);</div><div class='add'>+    }</div><div class='add'>+    return 0;</div><div class='add'>+err:</div><div class='add'>+    DHT_STACK_UNWIND(getxattr, frame, -1, EINVAL, NULL, NULL);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int32_t</div><div class='add'>+dht_getxattr_unwind(call_frame_t *frame, int op_ret, int op_errno, dict_t *dict,</div><div class='add'>+                    dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    DHT_STACK_UNWIND(getxattr, frame, op_ret, op_errno, dict, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+dht_getxattr_get_real_filename_cbk(call_frame_t *frame, void *cookie,</div><div class='add'>+                                   xlator_t *this, int op_ret, int op_errno,</div><div class='add'>+                                   dict_t *xattr, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    int this_call_cnt = 0;</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;frame-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        if (local-&gt;op_errno == EOPNOTSUPP) {</div><div class='add'>+            /* Nothing to do here, we have already found</div><div class='add'>+             * a subvol which does not have the get_real_filename</div><div class='add'>+             * optimization. If condition is for simple logic.</div><div class='add'>+             */</div><div class='add'>+            goto unlock;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        if (op_ret == -1) {</div><div class='add'>+            if (op_errno == EOPNOTSUPP) {</div><div class='add'>+                /* This subvol does not have the optimization.</div><div class='add'>+                 * Better let the user know we don't support it.</div><div class='add'>+                 * Remove previous results if any.</div><div class='add'>+                 */</div><div class='add'>+</div><div class='add'>+                if (local-&gt;xattr) {</div><div class='add'>+                    dict_unref(local-&gt;xattr);</div><div class='add'>+                    local-&gt;xattr = NULL;</div><div class='ctx'>                 }</div><div class='del'>-                if (hashed_subvol) {</div><div class='del'>-                        STACK_WIND (frame, dht_linkinfo_getxattr_cbk, hashed_subvol,</div><div class='del'>-                                    hashed_subvol-&gt;fops-&gt;getxattr, loc,</div><div class='del'>-                                    GF_XATTR_PATHINFO_KEY);</div><div class='del'>-                        return 0;</div><div class='add'>+</div><div class='add'>+                if (local-&gt;xattr_req) {</div><div class='add'>+                    dict_unref(local-&gt;xattr_req);</div><div class='add'>+                    local-&gt;xattr_req = NULL;</div><div class='ctx'>                 }</div><div class='del'>-                op_errno = ENODATA;</div><div class='del'>-                goto err;</div><div class='add'>+</div><div class='add'>+                local-&gt;op_ret = op_ret;</div><div class='add'>+                local-&gt;op_errno = op_errno;</div><div class='add'>+                UNLOCK(&amp;frame-&gt;lock);</div><div class='add'>+                gf_msg(this-&gt;name, GF_LOG_WARNING, op_errno,</div><div class='add'>+                       DHT_MSG_UPGRADE_BRICKS,</div><div class='add'>+                       "At least "</div><div class='add'>+                       "one of the bricks does not support "</div><div class='add'>+                       "this operation. Please upgrade all "</div><div class='add'>+                       "bricks.");</div><div class='add'>+                goto post_unlock;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            if (op_errno == ENOATTR) {</div><div class='add'>+                /* Do nothing, our defaults are set to this.</div><div class='add'>+                 */</div><div class='add'>+                goto unlock;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            /* This is a place holder for every other error</div><div class='add'>+             * case. I am not sure of how to interpret</div><div class='add'>+             * ENOTCONN etc. As of now, choosing to ignore</div><div class='add'>+             * down subvol and return a good result(if any)</div><div class='add'>+             * from other subvol.</div><div class='add'>+             */</div><div class='add'>+            UNLOCK(&amp;frame-&gt;lock);</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_WARNING, op_errno,</div><div class='add'>+                   DHT_MSG_GET_XATTR_FAILED, "Failed to get real filename.");</div><div class='add'>+            goto post_unlock;</div><div class='ctx'>         }</div><div class='del'>-        if (key &amp;&amp; (strcmp (key, GF_XATTR_FIX_LAYOUT_KEY) == 0)) {</div><div class='del'>-                for (i = 0; i &lt; layout-&gt;cnt; i++) {</div><div class='del'>-                        if (layout-&gt;list[i].start == layout-&gt;list[i].stop) {</div><div class='del'>-                                flag = 1;</div><div class='del'>-                                break;</div><div class='del'>-                        }</div><div class='del'>-                }</div><div class='del'>-                if ((layout-&gt;cnt &lt; conf-&gt;subvolume_cnt) || flag) {</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_INFO,</div><div class='del'>-                                "expanding layout of %s from %d to %d",</div><div class='del'>-                                loc-&gt;path, layout-&gt;cnt, conf-&gt;subvolume_cnt);</div><div class='del'>-                        local = dht_local_init (frame);</div><div class='del'>-                        if (!local) {</div><div class='del'>-                                op_errno = ENOMEM;</div><div class='del'>-                                gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-                                        "Out of memory");</div><div class='del'>-                                goto err;</div><div class='del'>-                        }</div><div class='ctx'> </div><div class='del'>-                        ret = loc_dup (loc, &amp;local-&gt;loc);</div><div class='del'>-                        if (ret == -1) {</div><div class='del'>-                                op_errno = ENOMEM;</div><div class='del'>-                                gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-                                        "Out of memory");</div><div class='del'>-                                goto err;</div><div class='del'>-                        }</div><div class='del'>-                        local-&gt;layout = layout;</div><div class='add'>+        /* This subvol has the required file.</div><div class='add'>+         * There could be other subvols which have returned</div><div class='add'>+         * success already, choosing to return the latest good</div><div class='add'>+         * result.</div><div class='add'>+         */</div><div class='add'>+        if (local-&gt;xattr)</div><div class='add'>+            dict_unref(local-&gt;xattr);</div><div class='add'>+        local-&gt;xattr = dict_ref(xattr);</div><div class='ctx'> </div><div class='del'>-                        dht_selfheal_new_directory (frame, dht_fix_layout_cbk,</div><div class='del'>-                                                    layout);</div><div class='del'>-                        return 0;</div><div class='del'>-                }</div><div class='del'>-                op_errno = ENODATA;</div><div class='del'>-                goto err;</div><div class='add'>+        if (local-&gt;xattr_req) {</div><div class='add'>+            dict_unref(local-&gt;xattr_req);</div><div class='add'>+            local-&gt;xattr_req = NULL;</div><div class='ctx'>         }</div><div class='del'>-	subvol = dht_subvol_get_cached (this, loc-&gt;inode);</div><div class='del'>-	if (!subvol) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-			"no cached subvolume for path=%s", loc-&gt;path);</div><div class='del'>-		op_errno = EINVAL;</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='add'>+        if (xdata)</div><div class='add'>+            local-&gt;xattr_req = dict_ref(xdata);</div><div class='add'>+</div><div class='add'>+        local-&gt;op_ret = op_ret;</div><div class='add'>+        local-&gt;op_errno = 0;</div><div class='add'>+        UNLOCK(&amp;frame-&gt;lock);</div><div class='add'>+        gf_msg_debug(this-&gt;name, 0, "Found a matching file.");</div><div class='add'>+        goto post_unlock;</div><div class='add'>+    }</div><div class='add'>+unlock:</div><div class='add'>+    UNLOCK(&amp;frame-&gt;lock);</div><div class='add'>+post_unlock:</div><div class='add'>+    this_call_cnt = dht_frame_return(frame);</div><div class='add'>+    if (is_last_call(this_call_cnt)) {</div><div class='add'>+        DHT_STACK_UNWIND(getxattr, frame, local-&gt;op_ret, local-&gt;op_errno,</div><div class='add'>+                         local-&gt;xattr, local-&gt;xattr_req);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	STACK_WIND (frame, dht_getxattr_cbk,</div><div class='del'>-		    subvol, subvol-&gt;fops-&gt;getxattr,</div><div class='del'>-		    loc, key);</div><div class='add'>+static int</div><div class='add'>+dht_getxattr_get_real_filename(call_frame_t *frame, xlator_t *this, loc_t *loc,</div><div class='add'>+                               const char *key, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    int i = 0;</div><div class='add'>+    dht_layout_t *layout = NULL;</div><div class='add'>+    int cnt = 0;</div><div class='add'>+    xlator_t *subvol = NULL;</div><div class='ctx'> </div><div class='del'>-	return 0;</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    layout = local-&gt;layout;</div><div class='ctx'> </div><div class='del'>-err:</div><div class='del'>-	op_errno = (op_errno == -1) ? errno : op_errno;</div><div class='del'>-	DHT_STACK_UNWIND (getxattr, frame, -1, op_errno, NULL);</div><div class='add'>+    cnt = local-&gt;call_cnt = layout-&gt;cnt;</div><div class='add'>+</div><div class='add'>+    local-&gt;op_ret = -1;</div><div class='add'>+    local-&gt;op_errno = ENOATTR;</div><div class='ctx'> </div><div class='del'>-	return 0;</div><div class='add'>+    for (i = 0; i &lt; cnt; i++) {</div><div class='add'>+        subvol = layout-&gt;list[i].xlator;</div><div class='add'>+        STACK_WIND(frame, dht_getxattr_get_real_filename_cbk, subvol,</div><div class='add'>+                   subvol-&gt;fops-&gt;getxattr, loc, key, xdata);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+static int</div><div class='add'>+dht_marker_populate_args(call_frame_t *frame, int type, int *gauge,</div><div class='add'>+                         xlator_t **subvols)</div><div class='add'>+{</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    int i = 0;</div><div class='add'>+    dht_layout_t *layout = NULL;</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-dht_setxattr (call_frame_t *frame, xlator_t *this,</div><div class='del'>-	      loc_t *loc, dict_t *xattr, int flags)</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    layout = local-&gt;layout;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; layout-&gt;cnt; i++)</div><div class='add'>+        subvols[i] = layout-&gt;list[i].xlator;</div><div class='add'>+</div><div class='add'>+    return layout-&gt;cnt;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+dht_is_debug_xattr_key(const char **array, char *key)</div><div class='ctx'> {</div><div class='del'>-	xlator_t     *subvol = NULL;</div><div class='del'>-        int           op_errno = -1;</div><div class='del'>-	dht_local_t  *local = NULL;</div><div class='add'>+    int i = 0;</div><div class='ctx'> </div><div class='add'>+    for (i = 0; array[i]; i++) {</div><div class='add'>+        if (fnmatch(array[i], key, FNM_NOESCAPE) == 0)</div><div class='add'>+            return i;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        VALIDATE_OR_GOTO (frame, err);</div><div class='del'>-        VALIDATE_OR_GOTO (this, err);</div><div class='del'>-        VALIDATE_OR_GOTO (loc, err);</div><div class='del'>-        VALIDATE_OR_GOTO (loc-&gt;inode, err);</div><div class='del'>-        VALIDATE_OR_GOTO (loc-&gt;path, err);</div><div class='add'>+    return -1;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	subvol = dht_subvol_get_cached (this, loc-&gt;inode);</div><div class='del'>-	if (!subvol) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-			"no cached subvolume for path=%s", loc-&gt;path);</div><div class='del'>-		op_errno = EINVAL;</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='add'>+/* Note we already have frame-&gt;local initialised here*/</div><div class='ctx'> </div><div class='del'>-	local = dht_local_init (frame);</div><div class='del'>-	if (!local) {</div><div class='del'>-		op_errno = ENOMEM;</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-			"Out of memory");</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='add'>+static int</div><div class='add'>+dht_handle_debug_getxattr(call_frame_t *frame, xlator_t *this, loc_t *loc,</div><div class='add'>+                          const char *key)</div><div class='add'>+{</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int op_errno = ENODATA;</div><div class='add'>+    char *value = NULL;</div><div class='add'>+    loc_t file_loc = {0};</div><div class='add'>+    const char *name = NULL;</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+</div><div class='add'>+    if (dht_is_debug_xattr_key(dht_dbg_vxattrs, (char *)key) == -1) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    local-&gt;xattr = dict_new();</div><div class='add'>+    if (!local-&gt;xattr) {</div><div class='add'>+        op_errno = ENOMEM;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (strncmp(key, DHT_DBG_HASHED_SUBVOL_KEY,</div><div class='add'>+                SLEN(DHT_DBG_HASHED_SUBVOL_KEY)) == 0) {</div><div class='add'>+        name = key + strlen(DHT_DBG_HASHED_SUBVOL_KEY);</div><div class='add'>+        if (strlen(name) == 0) {</div><div class='add'>+            op_errno = EINVAL;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-	local-&gt;call_cnt = 1;</div><div class='add'>+        ret = dht_build_child_loc(this, &amp;file_loc, loc, (char *)name);</div><div class='add'>+        if (ret) {</div><div class='add'>+            op_errno = ENOMEM;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-	STACK_WIND (frame, dht_err_cbk,</div><div class='del'>-		    subvol, subvol-&gt;fops-&gt;setxattr,</div><div class='del'>-		    loc, xattr, flags);</div><div class='add'>+        local-&gt;hashed_subvol = dht_subvol_get_hashed(this, &amp;file_loc);</div><div class='add'>+        if (local-&gt;hashed_subvol == NULL) {</div><div class='add'>+            op_errno = ENODATA;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-	return 0;</div><div class='add'>+        value = gf_strdup(local-&gt;hashed_subvol-&gt;name);</div><div class='add'>+        if (!value) {</div><div class='add'>+            op_errno = ENOMEM;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-err:</div><div class='del'>-	op_errno = (op_errno == -1) ? errno : op_errno;</div><div class='del'>-	DHT_STACK_UNWIND (setxattr, frame, -1, op_errno);</div><div class='add'>+        ret = dict_set_dynstr(local-&gt;xattr, (char *)key, value);</div><div class='add'>+        if (ret &lt; 0) {</div><div class='add'>+            op_errno = -ret;</div><div class='add'>+            ret = -1;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+        ret = 0;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	return 0;</div><div class='add'>+out:</div><div class='add'>+    loc_wipe(&amp;file_loc);</div><div class='add'>+    DHT_STACK_UNWIND(getxattr, frame, ret, op_errno, local-&gt;xattr, NULL);</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+/* Virtual Xattr which returns 1 if all subvols are up,</div><div class='add'>+   else returns 0. Geo-rep then uses this virtual xattr</div><div class='add'>+   after a fresh mount and starts the I/O.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+enum dht_vxattr_subvol {</div><div class='add'>+    DHT_VXATTR_SUBVOLS_UP = 1,</div><div class='add'>+    DHT_VXATTR_SUBVOLS_DOWN = 0,</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+dht_vgetxattr_subvol_status(call_frame_t *frame, xlator_t *this,</div><div class='add'>+                            const char *key)</div><div class='add'>+{</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int op_errno = ENODATA;</div><div class='add'>+    int value = DHT_VXATTR_SUBVOLS_UP;</div><div class='add'>+    int i = 0;</div><div class='add'>+    dht_conf_t *conf = NULL;</div><div class='add'>+</div><div class='add'>+    conf = this-&gt;private;</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+</div><div class='add'>+    if (!key) {</div><div class='add'>+        op_errno = EINVAL;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    local-&gt;xattr = dict_new();</div><div class='add'>+    if (!local-&gt;xattr) {</div><div class='add'>+        op_errno = ENOMEM;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    for (i = 0; i &lt; conf-&gt;subvolume_cnt; i++) {</div><div class='add'>+        if (!conf-&gt;subvolume_status[i]) {</div><div class='add'>+            value = DHT_VXATTR_SUBVOLS_DOWN;</div><div class='add'>+            gf_msg_debug(this-&gt;name, 0, "subvol %s is down ",</div><div class='add'>+                         conf-&gt;subvolumes[i]-&gt;name);</div><div class='add'>+            break;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    ret = dict_set_int8(local-&gt;xattr, (char *)key, value);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        op_errno = -ret;</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    ret = 0;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    DHT_STACK_UNWIND(getxattr, frame, ret, op_errno, local-&gt;xattr, NULL);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-dht_removexattr (call_frame_t *frame, xlator_t *this,</div><div class='del'>-		 loc_t *loc, const char *key)</div><div class='add'>+dht_getxattr(call_frame_t *frame, xlator_t *this, loc_t *loc, const char *key,</div><div class='add'>+             dict_t *xdata)</div><div class='add'>+#define DHT_IS_DIR(layout) (layout-&gt;cnt &gt; 1)</div><div class='ctx'> {</div><div class='del'>-	xlator_t     *subvol = NULL;</div><div class='del'>-        int           op_errno = -1;</div><div class='del'>-	dht_local_t  *local = NULL;</div><div class='add'>+    xlator_t *subvol = NULL;</div><div class='add'>+    xlator_t *hashed_subvol = NULL;</div><div class='add'>+    xlator_t *mds_subvol = NULL;</div><div class='add'>+    xlator_t *cached_subvol = NULL;</div><div class='add'>+    dht_conf_t *conf = NULL;</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    dht_layout_t *layout = NULL;</div><div class='add'>+    int op_errno = -1;</div><div class='add'>+    int i = 0;</div><div class='add'>+    int cnt = 0;</div><div class='add'>+    char *node_uuid_key = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    GF_CHECK_XATTR_KEY_AND_GOTO(key, IO_THREADS_QUEUE_SIZE_KEY, op_errno, err);</div><div class='add'>+    VALIDATE_OR_GOTO(frame, err);</div><div class='add'>+    VALIDATE_OR_GOTO(this, err);</div><div class='add'>+    VALIDATE_OR_GOTO(loc, err);</div><div class='add'>+    VALIDATE_OR_GOTO(loc-&gt;inode, err);</div><div class='add'>+    VALIDATE_OR_GOTO(this-&gt;private, err);</div><div class='add'>+</div><div class='add'>+    conf = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    local = dht_local_init(frame, loc, NULL, GF_FOP_GETXATTR);</div><div class='add'>+    if (!local) {</div><div class='add'>+        op_errno = ENOMEM;</div><div class='add'>+</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    layout = local-&gt;layout;</div><div class='add'>+    if (!layout) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_ERROR, 0, DHT_MSG_LAYOUT_NULL,</div><div class='add'>+               "Layout is NULL");</div><div class='add'>+        op_errno = ENOENT;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* skip over code which is irrelevant without a valid key */</div><div class='add'>+    if (!key)</div><div class='add'>+        goto no_key;</div><div class='add'>+</div><div class='add'>+    local-&gt;key = gf_strdup(key);</div><div class='add'>+    if (!local-&gt;key) {</div><div class='add'>+        op_errno = ENOMEM;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (strncmp(key, conf-&gt;mds_xattr_key, strlen(key)) == 0) {</div><div class='add'>+        op_errno = ENOTSUP;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (strncmp(key, DHT_SUBVOL_STATUS_KEY, SLEN(DHT_SUBVOL_STATUS_KEY)) == 0) {</div><div class='add'>+        dht_vgetxattr_subvol_status(frame, this, key);</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* skip over code which is irrelevant if !DHT_IS_DIR(layout) */</div><div class='add'>+    if (!DHT_IS_DIR(layout))</div><div class='add'>+        goto no_dht_is_dir;</div><div class='add'>+</div><div class='add'>+    if ((strncmp(key, GF_XATTR_GET_REAL_FILENAME_KEY,</div><div class='add'>+                 SLEN(GF_XATTR_GET_REAL_FILENAME_KEY)) == 0) &amp;&amp;</div><div class='add'>+        DHT_IS_DIR(layout)) {</div><div class='add'>+        dht_getxattr_get_real_filename(frame, this, loc, key, xdata);</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (!strcmp(key, GF_REBAL_FIND_LOCAL_SUBVOL)) {</div><div class='add'>+        ret = gf_asprintf(&amp;node_uuid_key, "%s", GF_XATTR_LIST_NODE_UUIDS_KEY);</div><div class='add'>+        if (ret == -1 || !node_uuid_key) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, 0, DHT_MSG_NO_MEMORY,</div><div class='add'>+                   "Failed to copy node uuid key");</div><div class='add'>+            op_errno = ENOMEM;</div><div class='add'>+            goto err;</div><div class='add'>+        }</div><div class='add'>+        (void)snprintf(local-&gt;xsel, sizeof(local-&gt;xsel), "%s", node_uuid_key);</div><div class='add'>+        cnt = local-&gt;call_cnt = conf-&gt;subvolume_cnt;</div><div class='add'>+        for (i = 0; i &lt; cnt; i++) {</div><div class='add'>+            STACK_WIND_COOKIE(frame, dht_find_local_subvol_cbk,</div><div class='add'>+                              conf-&gt;subvolumes[i], conf-&gt;subvolumes[i],</div><div class='add'>+                              conf-&gt;subvolumes[i]-&gt;fops-&gt;getxattr, loc,</div><div class='add'>+                              node_uuid_key, xdata);</div><div class='add'>+        }</div><div class='add'>+        if (node_uuid_key)</div><div class='add'>+            GF_FREE(node_uuid_key);</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (!strcmp(key, GF_REBAL_OLD_FIND_LOCAL_SUBVOL)) {</div><div class='add'>+        ret = gf_asprintf(&amp;node_uuid_key, "%s", GF_XATTR_NODE_UUID_KEY);</div><div class='add'>+        if (ret == -1 || !node_uuid_key) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, 0, DHT_MSG_NO_MEMORY,</div><div class='add'>+                   "Failed to copy node uuid key");</div><div class='add'>+            op_errno = ENOMEM;</div><div class='add'>+            goto err;</div><div class='add'>+        }</div><div class='add'>+        (void)snprintf(local-&gt;xsel, sizeof(local-&gt;xsel), "%s", node_uuid_key);</div><div class='add'>+        cnt = local-&gt;call_cnt = conf-&gt;subvolume_cnt;</div><div class='add'>+        for (i = 0; i &lt; cnt; i++) {</div><div class='add'>+            STACK_WIND_COOKIE(frame, dht_find_local_subvol_cbk,</div><div class='add'>+                              conf-&gt;subvolumes[i], conf-&gt;subvolumes[i],</div><div class='add'>+                              conf-&gt;subvolumes[i]-&gt;fops-&gt;getxattr, loc,</div><div class='add'>+                              node_uuid_key, xdata);</div><div class='add'>+        }</div><div class='add'>+        if (node_uuid_key)</div><div class='add'>+            GF_FREE(node_uuid_key);</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* for file use cached subvolume (obviously!): see if {}</div><div class='add'>+     * below</div><div class='add'>+     * for directory:</div><div class='add'>+     *  wind to all subvolumes and exclude subvolumes which</div><div class='add'>+     *  return ENOTCONN (in callback)</div><div class='add'>+     *</div><div class='add'>+     * NOTE: Don't trust inode here, as that may not be valid</div><div class='add'>+     *       (until inode_link() happens)</div><div class='add'>+     */</div><div class='add'>+</div><div class='add'>+    if (XATTR_IS_PATHINFO(key) || (strcmp(key, GF_XATTR_NODE_UUID_KEY) == 0) ||</div><div class='add'>+        (strcmp(key, GF_XATTR_LIST_NODE_UUIDS_KEY) == 0)) {</div><div class='add'>+        (void)snprintf(local-&gt;xsel, sizeof(local-&gt;xsel), "%s", key);</div><div class='add'>+        cnt = local-&gt;call_cnt = layout-&gt;cnt;</div><div class='add'>+        for (i = 0; i &lt; cnt; i++) {</div><div class='add'>+            subvol = layout-&gt;list[i].xlator;</div><div class='add'>+            STACK_WIND(frame, dht_vgetxattr_dir_cbk, subvol,</div><div class='add'>+                       subvol-&gt;fops-&gt;getxattr, loc, key, xdata);</div><div class='add'>+        }</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+no_dht_is_dir:</div><div class='add'>+    /* node-uuid or pathinfo for files */</div><div class='add'>+    if (XATTR_IS_PATHINFO(key) || (strcmp(key, GF_XATTR_NODE_UUID_KEY) == 0)) {</div><div class='add'>+        cached_subvol = local-&gt;cached_subvol;</div><div class='add'>+        (void)snprintf(local-&gt;xsel, sizeof(local-&gt;xsel), "%s", key);</div><div class='add'>+        local-&gt;call_cnt = 1;</div><div class='add'>+        STACK_WIND_COOKIE(frame, dht_vgetxattr_cbk, cached_subvol,</div><div class='add'>+                          cached_subvol, cached_subvol-&gt;fops-&gt;getxattr, loc,</div><div class='add'>+                          key, xdata);</div><div class='ctx'> </div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (strcmp(key, GF_XATTR_LINKINFO_KEY) == 0) {</div><div class='add'>+        hashed_subvol = dht_subvol_get_hashed(this, loc);</div><div class='add'>+        if (!hashed_subvol) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, 0,</div><div class='add'>+                   DHT_MSG_HASHED_SUBVOL_GET_FAILED,</div><div class='add'>+                   "Failed to get hashed subvol for %s", loc-&gt;path);</div><div class='add'>+            op_errno = EINVAL;</div><div class='add'>+            goto err;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-        VALIDATE_OR_GOTO (frame, err);</div><div class='del'>-        VALIDATE_OR_GOTO (this, err);</div><div class='del'>-        VALIDATE_OR_GOTO (loc, err);</div><div class='del'>-        VALIDATE_OR_GOTO (loc-&gt;inode, err);</div><div class='del'>-        VALIDATE_OR_GOTO (loc-&gt;path, err);</div><div class='add'>+        cached_subvol = dht_subvol_get_cached(this, loc-&gt;inode);</div><div class='add'>+        if (!cached_subvol) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, 0,</div><div class='add'>+                   DHT_MSG_CACHED_SUBVOL_GET_FAILED,</div><div class='add'>+                   "Failed to get cached subvol for %s", loc-&gt;path);</div><div class='add'>+            op_errno = EINVAL;</div><div class='add'>+            goto err;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-	subvol = dht_subvol_get_cached (this, loc-&gt;inode);</div><div class='del'>-	if (!subvol) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-			"no cached subvolume for path=%s", loc-&gt;path);</div><div class='del'>-		op_errno = EINVAL;</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='add'>+        if (hashed_subvol == cached_subvol) {</div><div class='add'>+            op_errno = ENODATA;</div><div class='add'>+            goto err;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-	local = dht_local_init (frame);</div><div class='del'>-	if (!local) {</div><div class='del'>-		op_errno = ENOMEM;</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-			"Out of memory");</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='add'>+        STACK_WIND(frame, dht_linkinfo_getxattr_cbk, hashed_subvol,</div><div class='add'>+                   hashed_subvol-&gt;fops-&gt;getxattr, loc, GF_XATTR_PATHINFO_KEY,</div><div class='add'>+                   xdata);</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	local-&gt;call_cnt = 1;</div><div class='add'>+    if (dht_is_debug_xattr_key(dht_dbg_vxattrs, (char *)key) &gt;= 0) {</div><div class='add'>+        dht_handle_debug_getxattr(frame, this, loc, key);</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	STACK_WIND (frame, dht_err_cbk,</div><div class='del'>-		    subvol, subvol-&gt;fops-&gt;removexattr,</div><div class='del'>-		    loc, key);</div><div class='add'>+no_key:</div><div class='add'>+    if (cluster_handle_marker_getxattr(frame, loc, key, conf-&gt;vol_uuid,</div><div class='add'>+                                       dht_getxattr_unwind,</div><div class='add'>+                                       dht_marker_populate_args) == 0)</div><div class='add'>+        return 0;</div><div class='ctx'> </div><div class='del'>-	return 0;</div><div class='add'>+    if (DHT_IS_DIR(layout)) {</div><div class='add'>+        local-&gt;call_cnt = conf-&gt;subvolume_cnt;</div><div class='add'>+        cnt = conf-&gt;subvolume_cnt;</div><div class='add'>+        ret = dht_inode_ctx_mdsvol_get(loc-&gt;inode, this, &amp;mds_subvol);</div><div class='add'>+        if (!mds_subvol) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_INFO, 0, DHT_MSG_HASHED_SUBVOL_GET_FAILED,</div><div class='add'>+                   "Cannot determine MDS, fetching xattr %s randomly"</div><div class='add'>+                   " from a subvol for path %s ",</div><div class='add'>+                   key, loc-&gt;path);</div><div class='add'>+        } else {</div><div class='add'>+            /* TODO need to handle it, As of now we are</div><div class='add'>+               choosing availability instead of chossing</div><div class='add'>+               consistencty, in case of mds_subvol is</div><div class='add'>+               down winding a getxattr call on other subvol</div><div class='add'>+               and return xattr</div><div class='add'>+            */</div><div class='add'>+            local-&gt;mds_subvol = mds_subvol;</div><div class='add'>+            for (i = 0; i &lt; cnt; i++) {</div><div class='add'>+                if (conf-&gt;subvolumes[i] == mds_subvol) {</div><div class='add'>+                    if (!conf-&gt;subvolume_status[i]) {</div><div class='add'>+                        gf_msg(this-&gt;name, GF_LOG_INFO, 0,</div><div class='add'>+                               DHT_MSG_HASHED_SUBVOL_DOWN,</div><div class='add'>+                               "MDS %s is down for path"</div><div class='add'>+                               " path %s so fetching xattr "</div><div class='add'>+                               "%s randomly from a subvol ",</div><div class='add'>+                               local-&gt;mds_subvol-&gt;name, loc-&gt;path, key);</div><div class='add'>+                        ret = 1;</div><div class='add'>+                    }</div><div class='add'>+                }</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        if (!ret &amp;&amp; key &amp;&amp; local-&gt;mds_subvol &amp;&amp; dht_match_xattr(key)) {</div><div class='add'>+            STACK_WIND(frame, dht_mds_getxattr_cbk, local-&gt;mds_subvol,</div><div class='add'>+                       local-&gt;mds_subvol-&gt;fops-&gt;getxattr, loc, key, xdata);</div><div class='add'>+</div><div class='add'>+            return 0;</div><div class='add'>+        }</div><div class='add'>+    } else {</div><div class='add'>+        cnt = local-&gt;call_cnt = 1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; cnt; i++) {</div><div class='add'>+        subvol = layout-&gt;list[i].xlator;</div><div class='add'>+        STACK_WIND(frame, dht_getxattr_cbk, subvol, subvol-&gt;fops-&gt;getxattr, loc,</div><div class='add'>+                   key, xdata);</div><div class='add'>+    }</div><div class='add'>+    return 0;</div><div class='ctx'> </div><div class='ctx'> err:</div><div class='del'>-	op_errno = (op_errno == -1) ? errno : op_errno;</div><div class='del'>-	DHT_STACK_UNWIND (removexattr, frame, -1, op_errno);</div><div class='add'>+    op_errno = (op_errno == -1) ? errno : op_errno;</div><div class='add'>+    DHT_STACK_UNWIND(getxattr, frame, -1, op_errno, NULL, NULL);</div><div class='ctx'> </div><div class='del'>-	return 0;</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='del'>-</div><div class='add'>+#undef DHT_IS_DIR</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-dht_fd_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-	      int op_ret, int op_errno, fd_t *fd)</div><div class='add'>+dht_fgetxattr(call_frame_t *frame, xlator_t *this, fd_t *fd, const char *key,</div><div class='add'>+              dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-	dht_local_t  *local = NULL;</div><div class='del'>-	int           this_call_cnt = 0;</div><div class='del'>-	call_frame_t *prev = NULL;</div><div class='add'>+    xlator_t *subvol = NULL;</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    dht_layout_t *layout = NULL;</div><div class='add'>+    int op_errno = -1;</div><div class='add'>+    int i = 0;</div><div class='add'>+    int cnt = 0;</div><div class='add'>+    xlator_t *mds_subvol = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    dht_conf_t *conf = NULL;</div><div class='add'>+    char gfid[GF_UUID_BUF_SIZE] = {0};</div><div class='add'>+</div><div class='add'>+    VALIDATE_OR_GOTO(frame, err);</div><div class='add'>+    VALIDATE_OR_GOTO(this, err);</div><div class='add'>+    VALIDATE_OR_GOTO(fd, err);</div><div class='add'>+    VALIDATE_OR_GOTO(fd-&gt;inode, err);</div><div class='add'>+    VALIDATE_OR_GOTO(this-&gt;private, err);</div><div class='add'>+</div><div class='add'>+    conf = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    local = dht_local_init(frame, NULL, fd, GF_FOP_FGETXATTR);</div><div class='add'>+    if (!local) {</div><div class='add'>+        op_errno = ENOMEM;</div><div class='add'>+</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    layout = local-&gt;layout;</div><div class='add'>+    if (!layout) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_ERROR, 0, DHT_MSG_LAYOUT_NULL,</div><div class='add'>+               "Layout is NULL");</div><div class='add'>+        op_errno = ENOENT;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (key) {</div><div class='add'>+        local-&gt;key = gf_strdup(key);</div><div class='add'>+        if (!local-&gt;key) {</div><div class='add'>+            op_errno = ENOMEM;</div><div class='add'>+            goto err;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    gf_uuid_unparse(fd-&gt;inode-&gt;gfid, gfid);</div><div class='add'>+</div><div class='add'>+    if ((fd-&gt;inode-&gt;ia_type == IA_IFDIR) &amp;&amp; key &amp;&amp;</div><div class='add'>+        (strncmp(key, GF_XATTR_LOCKINFO_KEY, SLEN(GF_XATTR_LOCKINFO_KEY)) !=</div><div class='add'>+         0)) {</div><div class='add'>+        local-&gt;call_cnt = conf-&gt;subvolume_cnt;</div><div class='add'>+        cnt = conf-&gt;subvolume_cnt;</div><div class='add'>+        ret = dht_inode_ctx_mdsvol_get(fd-&gt;inode, this, &amp;mds_subvol);</div><div class='add'>+</div><div class='add'>+        if (!mds_subvol) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, 0,</div><div class='add'>+                   DHT_MSG_HASHED_SUBVOL_GET_FAILED,</div><div class='add'>+                   "cannot determine MDS, fetching xattr %s "</div><div class='add'>+                   " randomly from a subvol for gfid %s ",</div><div class='add'>+                   key, gfid);</div><div class='add'>+        } else {</div><div class='add'>+            /* TODO need to handle it, As of now we are</div><div class='add'>+               choosing availability instead of chossing</div><div class='add'>+               consistencty, in case of hashed_subvol is</div><div class='add'>+               down winding a getxattr call on other subvol</div><div class='add'>+               and return xattr</div><div class='add'>+            */</div><div class='add'>+            local-&gt;mds_subvol = mds_subvol;</div><div class='add'>+            for (i = 0; i &lt; cnt; i++) {</div><div class='add'>+                if (conf-&gt;subvolumes[i] == mds_subvol) {</div><div class='add'>+                    if (!conf-&gt;subvolume_status[i]) {</div><div class='add'>+                        gf_msg(this-&gt;name, GF_LOG_WARNING, 0,</div><div class='add'>+                               DHT_MSG_HASHED_SUBVOL_DOWN,</div><div class='add'>+                               "MDS subvolume %s is down"</div><div class='add'>+                               " for gfid %s so fetching xattr "</div><div class='add'>+                               " %s randomly from a subvol ",</div><div class='add'>+                               local-&gt;mds_subvol-&gt;name, gfid, key);</div><div class='add'>+                        ret = 1;</div><div class='add'>+                    }</div><div class='add'>+                }</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='ctx'> </div><div class='add'>+        if (!ret &amp;&amp; key &amp;&amp; local-&gt;mds_subvol &amp;&amp; dht_match_xattr(key)) {</div><div class='add'>+            STACK_WIND(frame, dht_mds_getxattr_cbk, local-&gt;mds_subvol,</div><div class='add'>+                       local-&gt;mds_subvol-&gt;fops-&gt;fgetxattr, fd, key, NULL);</div><div class='ctx'> </div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-	prev = cookie;</div><div class='add'>+            return 0;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-	LOCK (&amp;frame-&gt;lock);</div><div class='del'>-	{</div><div class='del'>-		if (op_ret == -1) {</div><div class='del'>-			local-&gt;op_errno = op_errno;</div><div class='del'>-			gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-				"subvolume %s returned -1 (%s)",</div><div class='del'>-				prev-&gt;this-&gt;name, strerror (op_errno));</div><div class='del'>-			goto unlock;</div><div class='del'>-		}</div><div class='add'>+    } else {</div><div class='add'>+        cnt = local-&gt;call_cnt = 1;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-		local-&gt;op_ret = 0;</div><div class='del'>-	}</div><div class='del'>-unlock:</div><div class='del'>-	UNLOCK (&amp;frame-&gt;lock);</div><div class='add'>+    for (i = 0; i &lt; cnt; i++) {</div><div class='add'>+        subvol = layout-&gt;list[i].xlator;</div><div class='add'>+        STACK_WIND(frame, dht_getxattr_cbk, subvol, subvol-&gt;fops-&gt;fgetxattr, fd,</div><div class='add'>+                   key, NULL);</div><div class='add'>+    }</div><div class='add'>+    return 0;</div><div class='ctx'> </div><div class='del'>-	this_call_cnt = dht_frame_return (frame);</div><div class='del'>-	if (is_last_call (this_call_cnt))</div><div class='del'>-		DHT_STACK_UNWIND (open, frame, local-&gt;op_ret, local-&gt;op_errno,</div><div class='del'>-				  local-&gt;fd);</div><div class='add'>+err:</div><div class='add'>+    op_errno = (op_errno == -1) ? errno : op_errno;</div><div class='add'>+    DHT_STACK_UNWIND(fgetxattr, frame, -1, op_errno, NULL, NULL);</div><div class='ctx'> </div><div class='del'>-        return 0;</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+static int</div><div class='add'>+dht_setxattr2(xlator_t *this, xlator_t *subvol, call_frame_t *frame, int ret)</div><div class='add'>+{</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    int op_errno = EINVAL;</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-dht_open (call_frame_t *frame, xlator_t *this,</div><div class='del'>-	  loc_t *loc, int flags, fd_t *fd, int wbflags)</div><div class='del'>-{</div><div class='del'>-	xlator_t     *subvol = NULL;</div><div class='del'>-	int           ret = -1;</div><div class='del'>-        int           op_errno = -1;</div><div class='del'>-	dht_local_t  *local = NULL;</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-        VALIDATE_OR_GOTO (frame, err);</div><div class='del'>-        VALIDATE_OR_GOTO (this, err);</div><div class='del'>-        VALIDATE_OR_GOTO (fd, err);</div><div class='del'>-</div><div class='del'>-	subvol = dht_subvol_get_cached (this, fd-&gt;inode);</div><div class='del'>-	if (!subvol) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-			"no cached subvolume for fd=%p", fd);</div><div class='del'>-		op_errno = EINVAL;</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	local = dht_local_init (frame);</div><div class='del'>-	if (!local) {</div><div class='del'>-		op_errno = ENOMEM;</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-			"Out of memory");</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	local-&gt;fd = fd_ref (fd);</div><div class='del'>-	ret = loc_dup (loc, &amp;local-&gt;loc);</div><div class='del'>-	if (ret == -1) {</div><div class='del'>-		op_errno = ENOMEM;</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-			"Out of memory");</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	local-&gt;call_cnt = 1;</div><div class='del'>-</div><div class='del'>-	STACK_WIND (frame, dht_fd_cbk,</div><div class='del'>-		    subvol, subvol-&gt;fops-&gt;open,</div><div class='del'>-		    loc, flags, fd, wbflags);</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='add'>+    if (!frame || !frame-&gt;local)</div><div class='add'>+        goto err;</div><div class='ctx'> </div><div class='del'>-err:</div><div class='del'>-	op_errno = (op_errno == -1) ? errno : op_errno;</div><div class='del'>-	DHT_STACK_UNWIND (open, frame, -1, op_errno, NULL);</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    op_errno = local-&gt;op_errno;</div><div class='ctx'> </div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='add'>+    if (we_are_not_migrating(ret)) {</div><div class='add'>+        /* This dht xlator is not migrating the file. Unwind and</div><div class='add'>+         * pass on the original mode bits so the higher DHT layer</div><div class='add'>+         * can handle this.</div><div class='add'>+         */</div><div class='add'>+        DHT_STACK_UNWIND(setxattr, frame, local-&gt;op_ret, local-&gt;op_errno,</div><div class='add'>+                         local-&gt;rebalance.xdata);</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='add'>+    if (subvol == NULL)</div><div class='add'>+        goto err;</div><div class='add'>+</div><div class='add'>+    local-&gt;call_cnt = 2; /* This is the second attempt */</div><div class='add'>+</div><div class='add'>+    if (local-&gt;fop == GF_FOP_SETXATTR) {</div><div class='add'>+        STACK_WIND_COOKIE(frame, dht_file_setxattr_cbk, subvol, subvol,</div><div class='add'>+                          subvol-&gt;fops-&gt;setxattr, &amp;local-&gt;loc,</div><div class='add'>+                          local-&gt;rebalance.xattr, local-&gt;rebalance.flags,</div><div class='add'>+                          local-&gt;xattr_req);</div><div class='add'>+    } else {</div><div class='add'>+        STACK_WIND_COOKIE(frame, dht_file_setxattr_cbk, subvol, subvol,</div><div class='add'>+                          subvol-&gt;fops-&gt;fsetxattr, local-&gt;fd,</div><div class='add'>+                          local-&gt;rebalance.xattr, local-&gt;rebalance.flags,</div><div class='add'>+                          local-&gt;xattr_req);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+</div><div class='add'>+err:</div><div class='add'>+    DHT_STACK_UNWIND(setxattr, frame, (local ? local-&gt;op_ret : -1), op_errno,</div><div class='add'>+                     NULL);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-dht_readv_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-	       int op_ret, int op_errno,</div><div class='del'>-	       struct iovec *vector, int count, struct iatt *stbuf,</div><div class='del'>-               struct iobref *iobref)</div><div class='add'>+dht_file_setxattr_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                      int op_ret, int op_errno, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-        dht_local_t     *local = frame-&gt;local;</div><div class='del'>-</div><div class='del'>-        if (!local) {</div><div class='del'>-                op_ret = -1;</div><div class='del'>-                op_errno = EINVAL;</div><div class='del'>-                goto out;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    xlator_t *prev = NULL;</div><div class='add'>+    struct iatt *stbuf = NULL;</div><div class='add'>+    inode_t *inode = NULL;</div><div class='add'>+    xlator_t *subvol1 = NULL, *subvol2 = NULL;</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    prev = cookie;</div><div class='add'>+</div><div class='add'>+    local-&gt;op_errno = op_errno;</div><div class='add'>+</div><div class='add'>+    if ((local-&gt;fop == GF_FOP_FSETXATTR) &amp;&amp;</div><div class='add'>+        dht_check_remote_fd_failed_error(local, op_ret, op_errno)) {</div><div class='add'>+        ret = dht_check_and_open_fd_on_subvol(this, frame);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if ((op_ret == -1) &amp;&amp; !dht_inode_missing(op_errno)) {</div><div class='add'>+        gf_msg_debug(this-&gt;name, op_errno, "subvolume %s returned -1.",</div><div class='add'>+                     prev-&gt;name);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (local-&gt;call_cnt != 1)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    ret = dict_get_bin(xdata, DHT_IATT_IN_XDATA_KEY, (void **)&amp;stbuf);</div><div class='add'>+</div><div class='add'>+    if ((!op_ret) &amp;&amp; !stbuf) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    local-&gt;op_ret = op_ret;</div><div class='add'>+    local-&gt;rebalance.target_op_fn = dht_setxattr2;</div><div class='add'>+    if (xdata)</div><div class='add'>+        local-&gt;rebalance.xdata = dict_ref(xdata);</div><div class='add'>+</div><div class='add'>+    /* Phase 2 of migration */</div><div class='add'>+    if ((op_ret == -1) || IS_DHT_MIGRATION_PHASE2(stbuf)) {</div><div class='add'>+        ret = dht_rebalance_complete_check(this, frame);</div><div class='add'>+        if (!ret)</div><div class='add'>+            return 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Phase 1 of migration */</div><div class='add'>+    if (IS_DHT_MIGRATION_PHASE1(stbuf)) {</div><div class='add'>+        inode = (local-&gt;fd) ? local-&gt;fd-&gt;inode : local-&gt;loc.inode;</div><div class='add'>+</div><div class='add'>+        ret = dht_inode_ctx_get_mig_info(this, inode, &amp;subvol1, &amp;subvol2);</div><div class='add'>+        if (!dht_mig_info_is_invalid(local-&gt;cached_subvol, subvol1, subvol2)) {</div><div class='add'>+            dht_setxattr2(this, subvol2, frame, 0);</div><div class='add'>+            return 0;</div><div class='ctx'>         }</div><div class='ctx'> </div><div class='del'>-        if (op_ret != -1)</div><div class='del'>-                stbuf-&gt;ia_ino = local-&gt;ia_ino;</div><div class='add'>+        ret = dht_rebalance_in_progress_check(this, frame);</div><div class='add'>+        if (!ret)</div><div class='add'>+            return 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='ctx'> out:</div><div class='del'>-        DHT_STACK_UNWIND (readv, frame, op_ret, op_errno, vector, count, stbuf,</div><div class='del'>-                          iobref);</div><div class='ctx'> </div><div class='del'>-        return 0;</div><div class='add'>+    if (local-&gt;fop == GF_FOP_SETXATTR) {</div><div class='add'>+        DHT_STACK_UNWIND(setxattr, frame, op_ret, op_errno, xdata);</div><div class='add'>+    } else {</div><div class='add'>+        DHT_STACK_UNWIND(fsetxattr, frame, op_ret, op_errno, xdata);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+/* Function is call by dict_foreach_fnmatch if key is match with</div><div class='add'>+   user.* and set boolean flag to true</div><div class='add'>+*/</div><div class='add'>+static int</div><div class='add'>+dht_is_user_xattr(dict_t *this, char *key, data_t *value, void *data)</div><div class='add'>+{</div><div class='add'>+    gf_boolean_t *user_xattr_found = data;</div><div class='add'>+    *user_xattr_found = _gf_true;</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-dht_readv (call_frame_t *frame, xlator_t *this,</div><div class='del'>-	   fd_t *fd, size_t size, off_t off)</div><div class='del'>-{</div><div class='del'>-	xlator_t     *subvol = NULL;</div><div class='del'>-        int           op_errno = -1;</div><div class='del'>-        dht_local_t  *local = NULL;</div><div class='del'>-</div><div class='del'>-        VALIDATE_OR_GOTO (frame, err);</div><div class='del'>-        VALIDATE_OR_GOTO (this, err);</div><div class='del'>-        VALIDATE_OR_GOTO (fd, err);</div><div class='del'>-</div><div class='del'>-	subvol = dht_subvol_get_cached (this, fd-&gt;inode);</div><div class='del'>-	if (!subvol) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-			"no cached subvolume for fd=%p", fd);</div><div class='del'>-		op_errno = EINVAL;</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-        local = dht_local_init (frame);</div><div class='del'>-        if (!local) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_ERROR, "Out of memory");</div><div class='del'>-                op_errno = ENOMEM;</div><div class='add'>+/* Common code to wind a (f)(set|remove)xattr call to set xattr on directory</div><div class='add'>+ */</div><div class='add'>+static int</div><div class='add'>+dht_dir_common_set_remove_xattr(call_frame_t *frame, xlator_t *this, loc_t *loc,</div><div class='add'>+                                fd_t *fd, dict_t *xattr, int flags,</div><div class='add'>+                                dict_t *xdata, int *op_errno)</div><div class='add'>+</div><div class='add'>+{</div><div class='add'>+    dict_t *xattrop = NULL;</div><div class='add'>+    int32_t subone[1] = {-1};</div><div class='add'>+    gf_boolean_t uxattr_key_found = _gf_false;</div><div class='add'>+    xlator_t *mds_subvol = NULL;</div><div class='add'>+    xlator_t *travvol = NULL;</div><div class='add'>+    dht_conf_t *conf = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int i = 0;</div><div class='add'>+    int call_cnt = 0;</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    char gfid_local[GF_UUID_BUF_SIZE] = {0};</div><div class='add'>+    char **xattrs_to_heal;</div><div class='add'>+</div><div class='add'>+    conf = this-&gt;private;</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    call_cnt = conf-&gt;subvolume_cnt;</div><div class='add'>+    local-&gt;flags = flags;</div><div class='add'>+    xattrs_to_heal = get_xattrs_to_heal();</div><div class='add'>+</div><div class='add'>+    if (!gf_uuid_is_null(local-&gt;gfid)) {</div><div class='add'>+        gf_uuid_unparse(local-&gt;gfid, gfid_local);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if ((local-&gt;fop == GF_FOP_SETXATTR) || (local-&gt;fop == GF_FOP_FSETXATTR)) {</div><div class='add'>+        /* Check if any user xattr present in xattr</div><div class='add'>+         */</div><div class='add'>+        dict_foreach_fnmatch(xattr, "user*", dht_is_user_xattr,</div><div class='add'>+                             &amp;uxattr_key_found);</div><div class='add'>+</div><div class='add'>+        /* Check if any custom key xattr present in dict xattr</div><div class='add'>+           and start index from 1 because user xattr already</div><div class='add'>+           checked in previous line</div><div class='add'>+        */</div><div class='add'>+        for (i = 1; xattrs_to_heal[i]; i++)</div><div class='add'>+            if (dict_get(xattr, xattrs_to_heal[i]))</div><div class='add'>+                uxattr_key_found = _gf_true;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if ((local-&gt;fop == GF_FOP_REMOVEXATTR) ||</div><div class='add'>+        (local-&gt;fop == GF_FOP_FREMOVEXATTR)) {</div><div class='add'>+        /* Check if any custom key xattr present in local-&gt;key</div><div class='add'>+         */</div><div class='add'>+        for (i = 0; xattrs_to_heal[i]; i++)</div><div class='add'>+            if (strstr(local-&gt;key, xattrs_to_heal[i]))</div><div class='add'>+                uxattr_key_found = _gf_true;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* If there is no custom key xattr present or gfid is root</div><div class='add'>+       or call_cnt is 1 then wind a (f)setxattr call on all subvols</div><div class='add'>+    */</div><div class='add'>+    if (!uxattr_key_found || __is_root_gfid(local-&gt;gfid) || call_cnt == 1) {</div><div class='add'>+        for (i = 0; i &lt; conf-&gt;subvolume_cnt; i++) {</div><div class='add'>+            travvol = conf-&gt;subvolumes[i];</div><div class='add'>+            if ((local-&gt;fop == GF_FOP_SETXATTR) ||</div><div class='add'>+                (local-&gt;fop == GF_FOP_FSETXATTR)) {</div><div class='add'>+                if (fd) {</div><div class='add'>+                    STACK_WIND_COOKIE(frame, dht_err_cbk, travvol, travvol,</div><div class='add'>+                                      travvol-&gt;fops-&gt;fsetxattr, fd, xattr,</div><div class='add'>+                                      flags, xdata);</div><div class='add'>+                } else {</div><div class='add'>+                    STACK_WIND_COOKIE(frame, dht_err_cbk, travvol, travvol,</div><div class='add'>+                                      travvol-&gt;fops-&gt;setxattr, loc, xattr,</div><div class='add'>+                                      flags, xdata);</div><div class='add'>+                }</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            if ((local-&gt;fop == GF_FOP_REMOVEXATTR) ||</div><div class='add'>+                (local-&gt;fop == GF_FOP_FREMOVEXATTR)) {</div><div class='add'>+                if (fd) {</div><div class='add'>+                    STACK_WIND_COOKIE(frame, dht_err_cbk, travvol, travvol,</div><div class='add'>+                                      travvol-&gt;fops-&gt;fremovexattr, fd,</div><div class='add'>+                                      local-&gt;key, local-&gt;xattr_req);</div><div class='add'>+                } else {</div><div class='add'>+                    STACK_WIND_COOKIE(frame, dht_err_cbk, travvol, travvol,</div><div class='add'>+                                      travvol-&gt;fops-&gt;removexattr, loc,</div><div class='add'>+                                      local-&gt;key, local-&gt;xattr_req);</div><div class='add'>+                }</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Calculate hash subvol based on inode and parent inode</div><div class='add'>+     */</div><div class='add'>+    if (fd) {</div><div class='add'>+        ret = dht_inode_ctx_mdsvol_get(fd-&gt;inode, this, &amp;mds_subvol);</div><div class='add'>+    } else {</div><div class='add'>+        ret = dht_inode_ctx_mdsvol_get(loc-&gt;inode, this, &amp;mds_subvol);</div><div class='add'>+    }</div><div class='add'>+    if (ret || !mds_subvol) {</div><div class='add'>+        if (fd) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, 0,</div><div class='add'>+                   DHT_MSG_HASHED_SUBVOL_GET_FAILED,</div><div class='add'>+                   "Failed to get mds subvol for fd %p"</div><div class='add'>+                   "gfid is %s ",</div><div class='add'>+                   fd, gfid_local);</div><div class='add'>+        } else {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, 0,</div><div class='add'>+                   DHT_MSG_HASHED_SUBVOL_GET_FAILED,</div><div class='add'>+                   "%s: Failed to get mds subvol. (gfid is %s)", loc-&gt;path,</div><div class='add'>+                   gfid_local);</div><div class='add'>+        }</div><div class='add'>+        (*op_errno) = ENOENT;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    local-&gt;mds_subvol = mds_subvol;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; conf-&gt;subvolume_cnt; i++) {</div><div class='add'>+        if (conf-&gt;subvolumes[i] == mds_subvol) {</div><div class='add'>+            if (!conf-&gt;subvolume_status[i]) {</div><div class='add'>+                gf_msg(this-&gt;name, GF_LOG_WARNING, 0,</div><div class='add'>+                       DHT_MSG_HASHED_SUBVOL_DOWN,</div><div class='add'>+                       "MDS subvol is down for path "</div><div class='add'>+                       " %s gfid is %s Unable to set xattr ",</div><div class='add'>+                       local-&gt;loc.path, gfid_local);</div><div class='add'>+                (*op_errno) = ENOTCONN;</div><div class='ctx'>                 goto err;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (uxattr_key_found) {</div><div class='add'>+        xattrop = dict_new();</div><div class='add'>+        if (!xattrop) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, DHT_MSG_NO_MEMORY, 0,</div><div class='add'>+                   "dictionary creation failed for path %s "</div><div class='add'>+                   "for gfid is %s ",</div><div class='add'>+                   local-&gt;loc.path, gfid_local);</div><div class='add'>+            (*op_errno) = ENOMEM;</div><div class='add'>+            goto err;</div><div class='add'>+        }</div><div class='add'>+        local-&gt;xattr = dict_ref(xattr);</div><div class='add'>+        /* Subtract current MDS xattr value to -1 , value of MDS</div><div class='add'>+           xattr represents no. of times xattr modification failed</div><div class='add'>+           on non MDS subvols.</div><div class='add'>+        */</div><div class='add'>+        ret = dht_dict_set_array(xattrop, conf-&gt;mds_xattr_key, subone, 1);</div><div class='add'>+        if (ret != 0) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, 0, DHT_MSG_DICT_SET_FAILED,</div><div class='add'>+                   "dictionary set array failed for path %s "</div><div class='add'>+                   "for gfid is %s ",</div><div class='add'>+                   local-&gt;loc.path, gfid_local);</div><div class='add'>+            if (xattrop)</div><div class='add'>+                dict_unref(xattrop);</div><div class='add'>+            (*op_errno) = ret;</div><div class='add'>+            goto err;</div><div class='ctx'>         }</div><div class='add'>+        /* Wind a xattrop call to use ref counting approach</div><div class='add'>+           update mds xattr to -1 before update xattr on</div><div class='add'>+           hashed subvol and update mds xattr to +1 after update</div><div class='add'>+           xattr on all non hashed subvol</div><div class='add'>+        */</div><div class='add'>+        if (fd) {</div><div class='add'>+            STACK_WIND(frame, dht_xattrop_mds_cbk, local-&gt;mds_subvol,</div><div class='add'>+                       local-&gt;mds_subvol-&gt;fops-&gt;fxattrop, fd,</div><div class='add'>+                       GF_XATTROP_ADD_ARRAY, xattrop, NULL);</div><div class='add'>+        } else {</div><div class='add'>+            STACK_WIND(frame, dht_xattrop_mds_cbk, local-&gt;mds_subvol,</div><div class='add'>+                       local-&gt;mds_subvol-&gt;fops-&gt;xattrop, loc,</div><div class='add'>+                       GF_XATTROP_ADD_ARRAY, xattrop, NULL);</div><div class='add'>+        }</div><div class='add'>+        if (xattrop)</div><div class='add'>+            dict_unref(xattrop);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        local-&gt;ia_ino = fd-&gt;inode-&gt;ino;</div><div class='del'>-	STACK_WIND (frame, dht_readv_cbk,</div><div class='del'>-		    subvol, subvol-&gt;fops-&gt;readv,</div><div class='del'>-		    fd, size, off);</div><div class='add'>+    return 0;</div><div class='add'>+err:</div><div class='add'>+    return -1;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	return 0;</div><div class='add'>+int</div><div class='add'>+dht_fsetxattr(call_frame_t *frame, xlator_t *this, fd_t *fd, dict_t *xattr,</div><div class='add'>+              int flags, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    xlator_t *subvol = NULL;</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    int op_errno = EINVAL;</div><div class='add'>+    dht_conf_t *conf = NULL;</div><div class='add'>+    dht_layout_t *layout = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int call_cnt = 0;</div><div class='add'>+</div><div class='add'>+    VALIDATE_OR_GOTO(frame, err);</div><div class='add'>+    VALIDATE_OR_GOTO(this, err);</div><div class='add'>+    VALIDATE_OR_GOTO(fd, err);</div><div class='add'>+    VALIDATE_OR_GOTO(fd-&gt;inode, err);</div><div class='add'>+    VALIDATE_OR_GOTO(this-&gt;private, err);</div><div class='add'>+</div><div class='add'>+    conf = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    if (!conf-&gt;defrag)</div><div class='add'>+        GF_IF_INTERNAL_XATTR_GOTO(conf-&gt;wild_xattr_name, xattr, op_errno, err);</div><div class='add'>+</div><div class='add'>+    local = dht_local_init(frame, NULL, fd, GF_FOP_FSETXATTR);</div><div class='add'>+    if (!local) {</div><div class='add'>+        op_errno = ENOMEM;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    subvol = local-&gt;cached_subvol;</div><div class='add'>+    if (!subvol) {</div><div class='add'>+        gf_msg_debug(this-&gt;name, 0, "no cached subvolume for fd=%p", fd);</div><div class='add'>+        op_errno = EINVAL;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    layout = local-&gt;layout;</div><div class='add'>+    if (!layout) {</div><div class='add'>+        gf_msg_debug(this-&gt;name, 0, "no layout for fd=%p", fd);</div><div class='add'>+        op_errno = EINVAL;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    local-&gt;xattr_req = xdata ? dict_ref(xdata) : dict_new();</div><div class='add'>+    local-&gt;call_cnt = call_cnt = layout-&gt;cnt;</div><div class='add'>+</div><div class='add'>+    if (IA_ISDIR(fd-&gt;inode-&gt;ia_type)) {</div><div class='add'>+        local-&gt;hashed_subvol = NULL;</div><div class='add'>+        ret = dht_dir_common_set_remove_xattr(frame, this, NULL, fd, xattr,</div><div class='add'>+                                              flags, xdata, &amp;op_errno);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto err;</div><div class='add'>+    } else {</div><div class='add'>+        local-&gt;call_cnt = 1;</div><div class='add'>+        local-&gt;rebalance.xattr = dict_ref(xattr);</div><div class='add'>+        local-&gt;rebalance.flags = flags;</div><div class='add'>+</div><div class='add'>+        ret = dict_set_int8(local-&gt;xattr_req, DHT_IATT_IN_XDATA_KEY, 1);</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_msg_debug(this-&gt;name, 0,</div><div class='add'>+                         "Failed to set dictionary key %s for fd=%p",</div><div class='add'>+                         DHT_IATT_IN_XDATA_KEY, fd);</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        STACK_WIND_COOKIE(frame, dht_file_setxattr_cbk, subvol, subvol,</div><div class='add'>+                          subvol-&gt;fops-&gt;fsetxattr, fd, xattr, flags,</div><div class='add'>+                          local-&gt;xattr_req);</div><div class='add'>+    }</div><div class='add'>+    return 0;</div><div class='ctx'> </div><div class='ctx'> err:</div><div class='del'>-	op_errno = (op_errno == -1) ? errno : op_errno;</div><div class='del'>-	DHT_STACK_UNWIND (readv, frame, -1, op_errno, NULL, 0, NULL, NULL);</div><div class='add'>+    op_errno = (op_errno == -1) ? errno : op_errno;</div><div class='add'>+    DHT_STACK_UNWIND(fsetxattr, frame, -1, op_errno, NULL);</div><div class='ctx'> </div><div class='del'>-	return 0;</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+static int</div><div class='add'>+dht_checking_pathinfo_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                          int op_ret, int op_errno, dict_t *xattr,</div><div class='add'>+                          dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    int i = -1;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    char *value = NULL;</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    dht_conf_t *conf = NULL;</div><div class='add'>+    xlator_t *prev = NULL;</div><div class='add'>+    int this_call_cnt = 0;</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    prev = cookie;</div><div class='add'>+    conf = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    if (op_ret == -1)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    ret = dict_get_str(xattr, GF_XATTR_PATHINFO_KEY, &amp;value);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    if (!strcmp(value, local-&gt;key)) {</div><div class='add'>+        for (i = 0; i &lt; conf-&gt;subvolume_cnt; i++) {</div><div class='add'>+            if (conf-&gt;subvolumes[i] == prev)</div><div class='add'>+                conf-&gt;decommissioned_bricks[i] = prev;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    this_call_cnt = dht_frame_return(frame);</div><div class='add'>+    if (is_last_call(this_call_cnt)) {</div><div class='add'>+        DHT_STACK_UNWIND(setxattr, frame, local-&gt;op_ret, ENOTSUP, NULL);</div><div class='add'>+    }</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+dht_nuke_dir_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                 int32_t op_ret, int32_t op_errno, struct iatt *preparent,</div><div class='add'>+                 struct iatt *postparent, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    STACK_UNWIND_STRICT(setxattr, frame, op_ret, op_errno, NULL);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+dht_nuke_dir(call_frame_t *frame, xlator_t *this, loc_t *loc, data_t *tmp)</div><div class='add'>+{</div><div class='add'>+    if (!IA_ISDIR(loc-&gt;inode-&gt;ia_type)) {</div><div class='add'>+        DHT_STACK_UNWIND(setxattr, frame, -1, ENOTSUP, NULL);</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Setxattr didn't need the parent, but rmdir does. */</div><div class='add'>+    loc-&gt;parent = inode_parent(loc-&gt;inode, NULL, NULL);</div><div class='add'>+    if (!loc-&gt;parent) {</div><div class='add'>+        DHT_STACK_UNWIND(setxattr, frame, -1, ENOENT, NULL);</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='add'>+    gf_uuid_copy(loc-&gt;pargfid, loc-&gt;parent-&gt;gfid);</div><div class='add'>+</div><div class='add'>+    if (!loc-&gt;name &amp;&amp; loc-&gt;path) {</div><div class='add'>+        loc-&gt;name = strrchr(loc-&gt;path, '/');</div><div class='add'>+        if (loc-&gt;name) {</div><div class='add'>+            ++(loc-&gt;name);</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /*</div><div class='add'>+     * We do this instead of calling dht_rmdir_do directly for two reasons.</div><div class='add'>+     * The first is that we want to reuse all of the initialization that</div><div class='add'>+     * dht_rmdir does, so if it ever changes we'll just follow along.  The</div><div class='add'>+     * second (i.e. why we don't use STACK_WIND_TAIL) is so that we don't</div><div class='add'>+     * obscure the fact that we came in via this path instead of a genuine</div><div class='add'>+     * rmdir.  That makes debugging just a tiny bit easier.</div><div class='add'>+     */</div><div class='add'>+    STACK_WIND(frame, dht_nuke_dir_cbk, this, this-&gt;fops-&gt;rmdir, loc, 1, NULL);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-dht_writev_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-		int op_ret, int op_errno, struct iatt *prebuf,</div><div class='del'>-                struct iatt *postbuf)</div><div class='add'>+dht_setxattr(call_frame_t *frame, xlator_t *this, loc_t *loc, dict_t *xattr,</div><div class='add'>+             int flags, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-        dht_local_t *local = NULL;</div><div class='add'>+    xlator_t *subvol = NULL;</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    dht_conf_t *conf = NULL;</div><div class='add'>+    dht_methods_t *methods = NULL;</div><div class='add'>+    dht_layout_t *layout = NULL;</div><div class='add'>+    int i = 0;</div><div class='add'>+    int op_errno = EINVAL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    data_t *tmp = NULL;</div><div class='add'>+    uint32_t dir_spread = 0;</div><div class='add'>+    char value[4096] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    gf_dht_migrate_data_type_t forced_rebalance = GF_DHT_MIGRATE_DATA;</div><div class='add'>+    int call_cnt = 0;</div><div class='add'>+    uint32_t new_hash = 0;</div><div class='add'>+</div><div class='add'>+    VALIDATE_OR_GOTO(frame, err);</div><div class='add'>+    VALIDATE_OR_GOTO(this, err);</div><div class='add'>+    VALIDATE_OR_GOTO(loc, err);</div><div class='add'>+    VALIDATE_OR_GOTO(loc-&gt;inode, err);</div><div class='add'>+</div><div class='add'>+    conf = this-&gt;private;</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, conf, err);</div><div class='add'>+</div><div class='add'>+    methods = &amp;(conf-&gt;methods);</div><div class='add'>+</div><div class='add'>+    /* Rebalance daemon is allowed to set internal keys */</div><div class='add'>+    if (!conf-&gt;defrag)</div><div class='add'>+        GF_IF_INTERNAL_XATTR_GOTO(conf-&gt;wild_xattr_name, xattr, op_errno, err);</div><div class='add'>+</div><div class='add'>+    local = dht_local_init(frame, loc, NULL, GF_FOP_SETXATTR);</div><div class='add'>+    if (!local) {</div><div class='add'>+        op_errno = ENOMEM;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    subvol = local-&gt;cached_subvol;</div><div class='add'>+    if (!subvol) {</div><div class='add'>+        gf_msg_debug(this-&gt;name, 0, "no cached subvolume for path=%s",</div><div class='add'>+                     loc-&gt;path);</div><div class='add'>+        op_errno = EINVAL;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    layout = local-&gt;layout;</div><div class='add'>+    if (!layout) {</div><div class='add'>+        gf_msg_debug(this-&gt;name, 0, "no layout for path=%s", loc-&gt;path);</div><div class='add'>+        op_errno = EINVAL;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    local-&gt;call_cnt = call_cnt = layout-&gt;cnt;</div><div class='add'>+    tmp = dict_get(xattr, conf-&gt;mds_xattr_key);</div><div class='add'>+    if (tmp) {</div><div class='add'>+        op_errno = ENOTSUP;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    tmp = dict_get(xattr, GF_XATTR_FILE_MIGRATE_KEY);</div><div class='add'>+    if (tmp) {</div><div class='add'>+        if (IA_ISDIR(loc-&gt;inode-&gt;ia_type)) {</div><div class='add'>+            op_errno = ENOTSUP;</div><div class='add'>+            goto err;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-        if (op_ret == -1) {</div><div class='del'>-                goto out;</div><div class='add'>+        /* TODO: need to interpret the 'value' for more meaning</div><div class='add'>+           (ie, 'target' subvolume given there, etc) */</div><div class='add'>+        memcpy(value, tmp-&gt;data, tmp-&gt;len);</div><div class='add'>+        if (strcmp(value, "force") == 0)</div><div class='add'>+            forced_rebalance = GF_DHT_MIGRATE_DATA_EVEN_IF_LINK_EXISTS;</div><div class='add'>+</div><div class='add'>+        if (conf-&gt;decommission_in_progress)</div><div class='add'>+            forced_rebalance = GF_DHT_MIGRATE_HARDLINK;</div><div class='add'>+</div><div class='add'>+        if (!loc-&gt;path) {</div><div class='add'>+            op_errno = EINVAL;</div><div class='add'>+            goto err;</div><div class='ctx'>         }</div><div class='ctx'> </div><div class='del'>-        local = frame-&gt;local;</div><div class='del'>-        if (!local) {</div><div class='del'>-                op_ret = -1;</div><div class='del'>-                op_errno = EINVAL;</div><div class='del'>-                goto out;</div><div class='del'>-        } </div><div class='del'>-        </div><div class='del'>-        prebuf-&gt;ia_ino = local-&gt;ia_ino;</div><div class='del'>-        postbuf-&gt;ia_ino = local-&gt;ia_ino;</div><div class='add'>+        if (!local-&gt;loc.name)</div><div class='add'>+            local-&gt;loc.name = strrchr(local-&gt;loc.path, '/') + 1;</div><div class='ctx'> </div><div class='del'>-out:</div><div class='del'>-        DHT_STACK_UNWIND (writev, frame, op_ret, op_errno, prebuf, postbuf);</div><div class='add'>+        if (!local-&gt;loc.parent)</div><div class='add'>+            local-&gt;loc.parent = inode_parent(local-&gt;loc.inode, NULL, NULL);</div><div class='ctx'> </div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='add'>+        if ((!local-&gt;loc.name) || (!local-&gt;loc.parent)) {</div><div class='add'>+            op_errno = EINVAL;</div><div class='add'>+            goto err;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='add'>+        if (gf_uuid_is_null(local-&gt;loc.pargfid))</div><div class='add'>+            gf_uuid_copy(local-&gt;loc.pargfid, local-&gt;loc.parent-&gt;gfid);</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-dht_writev (call_frame_t *frame, xlator_t *this,</div><div class='del'>-	    fd_t *fd, struct iovec *vector, int count, off_t off,</div><div class='del'>-            struct iobref *iobref)</div><div class='del'>-{</div><div class='del'>-	xlator_t     *subvol = NULL;</div><div class='del'>-        int           op_errno = -1;</div><div class='del'>-        dht_local_t  *local = NULL;</div><div class='del'>-</div><div class='del'>-        VALIDATE_OR_GOTO (frame, err);</div><div class='del'>-        VALIDATE_OR_GOTO (this, err);</div><div class='del'>-        VALIDATE_OR_GOTO (fd, err);</div><div class='del'>-</div><div class='del'>-	subvol = dht_subvol_get_cached (this, fd-&gt;inode);</div><div class='del'>-	if (!subvol) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-			"no cached subvolume for fd=%p", fd);</div><div class='del'>-		op_errno = EINVAL;</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-        local = dht_local_init (frame);</div><div class='del'>-        if (!local) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-                        "Out of memory");</div><div class='del'>-                op_errno = ENOMEM;</div><div class='del'>-                goto err;</div><div class='add'>+        methods-&gt;migration_get_dst_subvol(this, local);</div><div class='add'>+</div><div class='add'>+        if (!local-&gt;rebalance.target_node) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, 0,</div><div class='add'>+                   DHT_MSG_HASHED_SUBVOL_GET_FAILED,</div><div class='add'>+                   "Failed to get hashed subvol for %s", loc-&gt;path);</div><div class='add'>+            op_errno = EINVAL;</div><div class='add'>+            goto err;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        local-&gt;rebalance.from_subvol = local-&gt;cached_subvol;</div><div class='add'>+</div><div class='add'>+        if (local-&gt;rebalance.target_node == local-&gt;rebalance.from_subvol) {</div><div class='add'>+            op_errno = EEXIST;</div><div class='add'>+            goto err;</div><div class='ctx'>         }</div><div class='add'>+        if (local-&gt;rebalance.target_node) {</div><div class='add'>+            local-&gt;flags = forced_rebalance;</div><div class='add'>+</div><div class='add'>+            frame-&gt;root-&gt;pid = GF_CLIENT_PID_DEFRAG;</div><div class='add'>+</div><div class='add'>+            ret = dht_start_rebalance_task(this, frame);</div><div class='add'>+            if (!ret)</div><div class='add'>+                return 0;</div><div class='ctx'> </div><div class='del'>-        local-&gt;ia_ino = fd-&gt;inode-&gt;ino;</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, 0, DHT_MSG_REBALANCE_START_FAILED,</div><div class='add'>+                   "%s: failed to create a new rebalance synctask", loc-&gt;path);</div><div class='add'>+        }</div><div class='add'>+        op_errno = EINVAL;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    tmp = dict_get(xattr, "decommission-brick");</div><div class='add'>+    if (tmp) {</div><div class='add'>+        /* This operation should happen only on '/' */</div><div class='add'>+        if (!__is_root_gfid(loc-&gt;inode-&gt;gfid)) {</div><div class='add'>+            op_errno = ENOTSUP;</div><div class='add'>+            goto err;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        memcpy(value, tmp-&gt;data, min(tmp-&gt;len, 4095));</div><div class='add'>+        local-&gt;key = gf_strdup(value);</div><div class='add'>+        local-&gt;call_cnt = conf-&gt;subvolume_cnt;</div><div class='add'>+</div><div class='add'>+        for (i = 0; i &lt; conf-&gt;subvolume_cnt; i++) {</div><div class='add'>+            /* Get the pathinfo, and then compare */</div><div class='add'>+            STACK_WIND_COOKIE(frame, dht_checking_pathinfo_cbk,</div><div class='add'>+                              conf-&gt;subvolumes[i], conf-&gt;subvolumes[i],</div><div class='add'>+                              conf-&gt;subvolumes[i]-&gt;fops-&gt;getxattr, loc,</div><div class='add'>+                              GF_XATTR_PATHINFO_KEY, NULL);</div><div class='add'>+        }</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    tmp = dict_get(xattr, GF_XATTR_FIX_LAYOUT_KEY);</div><div class='add'>+    if (tmp) {</div><div class='add'>+        ret = dict_get_uint32(xattr, "new-commit-hash", &amp;new_hash);</div><div class='add'>+        if (ret == 0) {</div><div class='add'>+            gf_msg_debug(this-&gt;name, 0,</div><div class='add'>+                         "updating commit hash for %s from %u to %u",</div><div class='add'>+                         uuid_utoa(loc-&gt;gfid), layout-&gt;commit_hash, new_hash);</div><div class='add'>+            layout-&gt;commit_hash = new_hash;</div><div class='add'>+</div><div class='add'>+            ret = dht_update_commit_hash_for_layout(frame);</div><div class='add'>+            if (ret) {</div><div class='add'>+                op_errno = ENOTCONN;</div><div class='add'>+                goto err;</div><div class='add'>+            }</div><div class='add'>+            return ret;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-	STACK_WIND (frame, dht_writev_cbk,</div><div class='del'>-		    subvol, subvol-&gt;fops-&gt;writev,</div><div class='del'>-		    fd, vector, count, off, iobref);</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_INFO, 0, DHT_MSG_FIX_LAYOUT_INFO,</div><div class='add'>+               "fixing the layout of %s", loc-&gt;path);</div><div class='ctx'> </div><div class='del'>-	return 0;</div><div class='add'>+        ret = dht_fix_directory_layout(frame, dht_fix_layout_setxattr_cbk,</div><div class='add'>+                                       layout);</div><div class='add'>+        if (ret) {</div><div class='add'>+            op_errno = ENOTCONN;</div><div class='add'>+            goto err;</div><div class='add'>+        }</div><div class='add'>+        return ret;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    tmp = dict_get(xattr, "distribute.directory-spread-count");</div><div class='add'>+    if (tmp) {</div><div class='add'>+        /* Setxattr value is packed as 'binary', not string */</div><div class='add'>+        memcpy(value, tmp-&gt;data, min(tmp-&gt;len, 4095));</div><div class='add'>+        ret = gf_string2uint32(value, &amp;dir_spread);</div><div class='add'>+        if (!ret &amp;&amp; ((dir_spread &lt;= conf-&gt;subvolume_cnt) &amp;&amp; (dir_spread &gt; 0))) {</div><div class='add'>+            layout-&gt;spread_cnt = dir_spread;</div><div class='add'>+</div><div class='add'>+            ret = dht_fix_directory_layout(frame, dht_common_setxattr_cbk,</div><div class='add'>+                                           layout);</div><div class='add'>+            if (ret) {</div><div class='add'>+                op_errno = ENOTCONN;</div><div class='add'>+                goto err;</div><div class='add'>+            }</div><div class='add'>+            return ret;</div><div class='add'>+        }</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_ERROR, 0, DHT_MSG_OPERATION_NOT_SUP,</div><div class='add'>+               "wrong 'directory-spread-count' value (%s)", value);</div><div class='add'>+        op_errno = ENOTSUP;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    tmp = dict_get(xattr, "glusterfs.dht.nuke");</div><div class='add'>+    if (tmp) {</div><div class='add'>+        return dht_nuke_dir(frame, this, loc, tmp);</div><div class='add'>+    }</div><div class='add'>+    local-&gt;xattr_req = xdata ? dict_ref(xdata) : dict_new();</div><div class='add'>+</div><div class='add'>+    if (IA_ISDIR(loc-&gt;inode-&gt;ia_type)) {</div><div class='add'>+        local-&gt;hashed_subvol = NULL;</div><div class='add'>+        ret = dht_dir_common_set_remove_xattr(frame, this, loc, NULL, xattr,</div><div class='add'>+                                              flags, xdata, &amp;op_errno);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto err;</div><div class='add'>+    } else {</div><div class='add'>+        local-&gt;rebalance.xattr = dict_ref(xattr);</div><div class='add'>+        local-&gt;rebalance.flags = flags;</div><div class='add'>+        local-&gt;call_cnt = 1;</div><div class='add'>+</div><div class='add'>+        ret = dict_set_int8(local-&gt;xattr_req, DHT_IATT_IN_XDATA_KEY, 1);</div><div class='add'>+</div><div class='add'>+        STACK_WIND_COOKIE(frame, dht_file_setxattr_cbk, subvol, subvol,</div><div class='add'>+                          subvol-&gt;fops-&gt;setxattr, loc, xattr, flags,</div><div class='add'>+                          local-&gt;xattr_req);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='ctx'> </div><div class='ctx'> err:</div><div class='del'>-	op_errno = (op_errno == -1) ? errno : op_errno;</div><div class='del'>-	DHT_STACK_UNWIND (writev, frame, -1, op_errno, NULL, NULL);</div><div class='add'>+    op_errno = (op_errno == -1) ? errno : op_errno;</div><div class='add'>+    DHT_STACK_UNWIND(setxattr, frame, -1, op_errno, NULL);</div><div class='ctx'> </div><div class='del'>-	return 0;</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+static int</div><div class='add'>+dht_removexattr2(xlator_t *this, xlator_t *subvol, call_frame_t *frame, int ret)</div><div class='add'>+{</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    int op_errno = EINVAL;</div><div class='add'>+</div><div class='add'>+    if (!frame || !frame-&gt;local)</div><div class='add'>+        goto err;</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    op_errno = local-&gt;op_errno;</div><div class='add'>+</div><div class='add'>+    local-&gt;call_cnt = 2; /* This is the second attempt */</div><div class='add'>+</div><div class='add'>+    if (we_are_not_migrating(ret)) {</div><div class='add'>+        /* This dht xlator is not migrating the file. Unwind and</div><div class='add'>+         * pass on the original mode bits so the higher DHT layer</div><div class='add'>+         * can handle this.</div><div class='add'>+         */</div><div class='add'>+        DHT_STACK_UNWIND(removexattr, frame, local-&gt;op_ret, local-&gt;op_errno,</div><div class='add'>+                         local-&gt;rebalance.xdata);</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (subvol == NULL)</div><div class='add'>+        goto err;</div><div class='add'>+</div><div class='add'>+    if (local-&gt;fop == GF_FOP_REMOVEXATTR) {</div><div class='add'>+        STACK_WIND_COOKIE(frame, dht_file_removexattr_cbk, subvol, subvol,</div><div class='add'>+                          subvol-&gt;fops-&gt;removexattr, &amp;local-&gt;loc, local-&gt;key,</div><div class='add'>+                          local-&gt;xattr_req);</div><div class='add'>+    } else {</div><div class='add'>+        STACK_WIND_COOKIE(frame, dht_file_removexattr_cbk, subvol, subvol,</div><div class='add'>+                          subvol-&gt;fops-&gt;fremovexattr, local-&gt;fd, local-&gt;key,</div><div class='add'>+                          local-&gt;xattr_req);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+</div><div class='add'>+err:</div><div class='add'>+    DHT_STACK_UNWIND(removexattr, frame, -1, op_errno, NULL);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-dht_flush (call_frame_t *frame, xlator_t *this, fd_t *fd)</div><div class='add'>+dht_file_removexattr_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                         int op_ret, int op_errno, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-	xlator_t     *subvol = NULL;</div><div class='del'>-        int           op_errno = -1;</div><div class='del'>-	dht_local_t  *local = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    xlator_t *prev = NULL;</div><div class='add'>+    struct iatt *stbuf = NULL;</div><div class='add'>+    inode_t *inode = NULL;</div><div class='add'>+    xlator_t *subvol1 = NULL, *subvol2 = NULL;</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    prev = cookie;</div><div class='add'>+</div><div class='add'>+    local-&gt;op_errno = op_errno;</div><div class='add'>+</div><div class='add'>+    if ((local-&gt;fop == GF_FOP_FREMOVEXATTR) &amp;&amp;</div><div class='add'>+        dht_check_remote_fd_failed_error(local, op_ret, op_errno)) {</div><div class='add'>+        ret = dht_check_and_open_fd_on_subvol(this, frame);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='add'>+    if ((op_ret == -1) &amp;&amp; !dht_inode_missing(op_errno)) {</div><div class='add'>+        gf_msg_debug(this-&gt;name, op_errno, "subvolume %s returned -1",</div><div class='add'>+                     prev-&gt;name);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        VALIDATE_OR_GOTO (frame, err);</div><div class='del'>-        VALIDATE_OR_GOTO (this, err);</div><div class='del'>-        VALIDATE_OR_GOTO (fd, err);</div><div class='add'>+    if (local-&gt;call_cnt != 1)</div><div class='add'>+        goto out;</div><div class='ctx'> </div><div class='del'>-	subvol = dht_subvol_get_cached (this, fd-&gt;inode);</div><div class='del'>-	if (!subvol) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-			"no cached subvolume for fd=%p", fd);</div><div class='del'>-		op_errno = EINVAL;</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='add'>+    ret = dict_get_bin(xdata, DHT_IATT_IN_XDATA_KEY, (void **)&amp;stbuf);</div><div class='ctx'> </div><div class='del'>-	local = dht_local_init (frame);</div><div class='del'>-	if (!local) {</div><div class='del'>-		op_errno = ENOMEM;</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-			"Out of memory");</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='add'>+    if ((!op_ret) &amp;&amp; !stbuf) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	local-&gt;fd = fd_ref (fd);</div><div class='del'>-	local-&gt;call_cnt = 1;</div><div class='add'>+    local-&gt;op_ret = 0;</div><div class='ctx'> </div><div class='del'>-	STACK_WIND (frame, dht_err_cbk,</div><div class='del'>-		    subvol, subvol-&gt;fops-&gt;flush, fd);</div><div class='add'>+    local-&gt;rebalance.target_op_fn = dht_removexattr2;</div><div class='add'>+    if (xdata)</div><div class='add'>+        local-&gt;rebalance.xdata = dict_ref(xdata);</div><div class='ctx'> </div><div class='del'>-	return 0;</div><div class='add'>+    /* Phase 2 of migration */</div><div class='add'>+    if ((op_ret == -1) || IS_DHT_MIGRATION_PHASE2(stbuf)) {</div><div class='add'>+        ret = dht_rebalance_complete_check(this, frame);</div><div class='add'>+        if (!ret)</div><div class='add'>+            return 0;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-err:</div><div class='del'>-	op_errno = (op_errno == -1) ? errno : op_errno;</div><div class='del'>-	DHT_STACK_UNWIND (flush, frame, -1, op_errno);</div><div class='add'>+    /* Phase 1 of migration */</div><div class='add'>+    if (IS_DHT_MIGRATION_PHASE1(stbuf)) {</div><div class='add'>+        inode = (local-&gt;fd) ? local-&gt;fd-&gt;inode : local-&gt;loc.inode;</div><div class='ctx'> </div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='add'>+        ret = dht_inode_ctx_get_mig_info(this, inode, &amp;subvol1, &amp;subvol2);</div><div class='add'>+        if (!dht_mig_info_is_invalid(local-&gt;cached_subvol, subvol1, subvol2)) {</div><div class='add'>+            dht_removexattr2(this, subvol2, frame, 0);</div><div class='add'>+            return 0;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='add'>+        ret = dht_rebalance_in_progress_check(this, frame);</div><div class='add'>+        if (!ret)</div><div class='add'>+            return 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (local-&gt;fop == GF_FOP_REMOVEXATTR) {</div><div class='add'>+        DHT_STACK_UNWIND(removexattr, frame, op_ret, op_errno, xdata);</div><div class='add'>+    } else {</div><div class='add'>+        DHT_STACK_UNWIND(fremovexattr, frame, op_ret, op_errno, xdata);</div><div class='add'>+    }</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-dht_fsync (call_frame_t *frame, xlator_t *this,</div><div class='del'>-	   fd_t *fd, int datasync)</div><div class='add'>+dht_removexattr(call_frame_t *frame, xlator_t *this, loc_t *loc,</div><div class='add'>+                const char *key, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-	xlator_t     *subvol = NULL;</div><div class='del'>-        int           op_errno = -1;</div><div class='del'>-	dht_local_t  *local = NULL;</div><div class='add'>+    xlator_t *subvol = NULL;</div><div class='add'>+    int op_errno = -1;</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    dht_layout_t *layout = NULL;</div><div class='add'>+    int call_cnt = 0;</div><div class='add'>+    dht_conf_t *conf = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    VALIDATE_OR_GOTO(this, err);</div><div class='add'>+    VALIDATE_OR_GOTO(this-&gt;private, err);</div><div class='add'>+</div><div class='add'>+    conf = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    GF_IF_NATIVE_XATTR_GOTO(conf-&gt;wild_xattr_name, key, op_errno, err);</div><div class='add'>+</div><div class='add'>+    VALIDATE_OR_GOTO(frame, err);</div><div class='add'>+    VALIDATE_OR_GOTO(loc, err);</div><div class='add'>+    VALIDATE_OR_GOTO(loc-&gt;inode, err);</div><div class='add'>+</div><div class='add'>+    local = dht_local_init(frame, loc, NULL, GF_FOP_REMOVEXATTR);</div><div class='add'>+    if (!local) {</div><div class='add'>+        op_errno = ENOMEM;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    subvol = local-&gt;cached_subvol;</div><div class='add'>+    if (!subvol) {</div><div class='add'>+        gf_msg_debug(this-&gt;name, 0, "no cached subvolume for path=%s",</div><div class='add'>+                     loc-&gt;path);</div><div class='add'>+        op_errno = EINVAL;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    layout = local-&gt;layout;</div><div class='add'>+    if (!local-&gt;layout) {</div><div class='add'>+        gf_msg_debug(this-&gt;name, 0, "no layout for path=%s", loc-&gt;path);</div><div class='add'>+        op_errno = EINVAL;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+    local-&gt;xattr_req = (xdata) ? dict_ref(xdata) : dict_new();</div><div class='add'>+</div><div class='add'>+    local-&gt;call_cnt = call_cnt = layout-&gt;cnt;</div><div class='add'>+    local-&gt;key = gf_strdup(key);</div><div class='add'>+</div><div class='add'>+    if (key &amp;&amp; (strncmp(key, conf-&gt;mds_xattr_key, strlen(key)) == 0)) {</div><div class='add'>+        op_errno = ENOTSUP;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (IA_ISDIR(loc-&gt;inode-&gt;ia_type)) {</div><div class='add'>+        local-&gt;hashed_subvol = NULL;</div><div class='add'>+        ret = dht_dir_common_set_remove_xattr(frame, this, loc, NULL, NULL, 0,</div><div class='add'>+                                              local-&gt;xattr_req, &amp;op_errno);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto err;</div><div class='add'>+</div><div class='add'>+    } else {</div><div class='add'>+        local-&gt;call_cnt = 1;</div><div class='add'>+        ret = dict_set_int8(local-&gt;xattr_req, DHT_IATT_IN_XDATA_KEY, 1);</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, ENOMEM, DHT_MSG_DICT_SET_FAILED,</div><div class='add'>+                   "Failed to "</div><div class='add'>+                   "set dictionary key %s for %s",</div><div class='add'>+                   DHT_IATT_IN_XDATA_KEY, loc-&gt;path);</div><div class='add'>+        }</div><div class='ctx'> </div><div class='add'>+        STACK_WIND_COOKIE(frame, dht_file_removexattr_cbk, subvol, subvol,</div><div class='add'>+                          subvol-&gt;fops-&gt;removexattr, loc, key,</div><div class='add'>+                          local-&gt;xattr_req);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        VALIDATE_OR_GOTO (frame, err);</div><div class='del'>-        VALIDATE_OR_GOTO (this, err);</div><div class='del'>-        VALIDATE_OR_GOTO (fd, err);</div><div class='add'>+    return 0;</div><div class='ctx'> </div><div class='del'>-	subvol = dht_subvol_get_cached (this, fd-&gt;inode);</div><div class='del'>-	if (!subvol) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-			"no cached subvolume for fd=%p", fd);</div><div class='del'>-		op_errno = EINVAL;</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='add'>+err:</div><div class='add'>+    op_errno = (op_errno == -1) ? errno : op_errno;</div><div class='add'>+    DHT_STACK_UNWIND(removexattr, frame, -1, op_errno, NULL);</div><div class='ctx'> </div><div class='del'>-	local = dht_local_init (frame);</div><div class='del'>-	if (!local) {</div><div class='del'>-		op_errno = ENOMEM;</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-			"Out of memory");</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='del'>-	local-&gt;call_cnt = 1;</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        local-&gt;ia_ino = fd-&gt;inode-&gt;ino;</div><div class='add'>+int</div><div class='add'>+dht_fremovexattr(call_frame_t *frame, xlator_t *this, fd_t *fd, const char *key,</div><div class='add'>+                 dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    xlator_t *subvol = NULL;</div><div class='add'>+    int op_errno = -1;</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    dht_layout_t *layout = NULL;</div><div class='add'>+    int call_cnt = 0;</div><div class='add'>+    dht_conf_t *conf = 0;</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    VALIDATE_OR_GOTO(this, err);</div><div class='add'>+    VALIDATE_OR_GOTO(this-&gt;private, err);</div><div class='add'>+</div><div class='add'>+    conf = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    GF_IF_NATIVE_XATTR_GOTO(conf-&gt;wild_xattr_name, key, op_errno, err);</div><div class='add'>+</div><div class='add'>+    VALIDATE_OR_GOTO(frame, err);</div><div class='add'>+</div><div class='add'>+    local = dht_local_init(frame, NULL, fd, GF_FOP_FREMOVEXATTR);</div><div class='add'>+    if (!local) {</div><div class='add'>+        op_errno = ENOMEM;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    subvol = local-&gt;cached_subvol;</div><div class='add'>+    if (!subvol) {</div><div class='add'>+        gf_msg_debug(this-&gt;name, 0, "no cached subvolume for inode=%s",</div><div class='add'>+                     uuid_utoa(fd-&gt;inode-&gt;gfid));</div><div class='add'>+        op_errno = EINVAL;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    layout = local-&gt;layout;</div><div class='add'>+    if (!local-&gt;layout) {</div><div class='add'>+        gf_msg_debug(this-&gt;name, 0, "no layout for inode=%s",</div><div class='add'>+                     uuid_utoa(fd-&gt;inode-&gt;gfid));</div><div class='add'>+        op_errno = EINVAL;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+    local-&gt;xattr_req = xdata ? dict_ref(xdata) : dict_new();</div><div class='add'>+</div><div class='add'>+    local-&gt;call_cnt = call_cnt = layout-&gt;cnt;</div><div class='add'>+    local-&gt;key = gf_strdup(key);</div><div class='add'>+</div><div class='add'>+    if (IA_ISDIR(fd-&gt;inode-&gt;ia_type)) {</div><div class='add'>+        local-&gt;hashed_subvol = NULL;</div><div class='add'>+        ret = dht_dir_common_set_remove_xattr(frame, this, NULL, fd, NULL, 0,</div><div class='add'>+                                              local-&gt;xattr_req, &amp;op_errno);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto err;</div><div class='add'>+</div><div class='add'>+    } else {</div><div class='add'>+        local-&gt;call_cnt = 1;</div><div class='add'>+        ret = dict_set_int8(local-&gt;xattr_req, DHT_IATT_IN_XDATA_KEY, 1);</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, ENOMEM, DHT_MSG_DICT_SET_FAILED,</div><div class='add'>+                   "Failed to "</div><div class='add'>+                   "set dictionary key %s for fd=%p",</div><div class='add'>+                   DHT_IATT_IN_XDATA_KEY, fd);</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-	STACK_WIND (frame, dht_fsync_cbk,</div><div class='del'>-		    subvol, subvol-&gt;fops-&gt;fsync,</div><div class='del'>-		    fd, datasync);</div><div class='add'>+        STACK_WIND_COOKIE(frame, dht_file_removexattr_cbk, subvol, subvol,</div><div class='add'>+                          subvol-&gt;fops-&gt;fremovexattr, fd, key,</div><div class='add'>+                          local-&gt;xattr_req);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	return 0;</div><div class='add'>+    return 0;</div><div class='ctx'> </div><div class='ctx'> err:</div><div class='del'>-	op_errno = (op_errno == -1) ? errno : op_errno;</div><div class='del'>-	DHT_STACK_UNWIND (fsync, frame, -1, op_errno, NULL, NULL);</div><div class='add'>+    op_errno = (op_errno == -1) ? errno : op_errno;</div><div class='add'>+    DHT_STACK_UNWIND(fremovexattr, frame, -1, op_errno, NULL);</div><div class='ctx'> </div><div class='del'>-	return 0;</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-dht_lk_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-	    int op_ret, int op_errno, struct flock *flock)</div><div class='add'>+dht_fd_cbk(call_frame_t *frame, void *cookie, xlator_t *this, int op_ret,</div><div class='add'>+           int op_errno, fd_t *fd, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-        DHT_STACK_UNWIND (lk, frame, op_ret, op_errno, flock);</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    int this_call_cnt = 0;</div><div class='add'>+    xlator_t *prev = NULL;</div><div class='ctx'> </div><div class='del'>-        return 0;</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    prev = cookie;</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;frame-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        if (op_ret == -1) {</div><div class='add'>+            local-&gt;op_errno = op_errno;</div><div class='add'>+            UNLOCK(&amp;frame-&gt;lock);</div><div class='add'>+            gf_msg_debug(this-&gt;name, op_errno, "subvolume %s returned -1",</div><div class='add'>+                         prev-&gt;name);</div><div class='add'>+            goto post_unlock;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        local-&gt;op_ret = 0;</div><div class='add'>+    }</div><div class='add'>+    UNLOCK(&amp;frame-&gt;lock);</div><div class='add'>+post_unlock:</div><div class='add'>+    this_call_cnt = dht_frame_return(frame);</div><div class='add'>+    if (is_last_call(this_call_cnt))</div><div class='add'>+        DHT_STACK_UNWIND(open, frame, local-&gt;op_ret, local-&gt;op_errno, local-&gt;fd,</div><div class='add'>+                         NULL);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+/*</div><div class='add'>+ * dht_normalize_stats -</div><div class='add'>+ */</div><div class='add'>+static void</div><div class='add'>+dht_normalize_stats(struct statvfs *buf, unsigned long bsize,</div><div class='add'>+                    unsigned long frsize)</div><div class='add'>+{</div><div class='add'>+    double factor = 0;</div><div class='add'>+</div><div class='add'>+    if (buf-&gt;f_bsize != bsize) {</div><div class='add'>+        buf-&gt;f_bsize = bsize;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (buf-&gt;f_frsize != frsize) {</div><div class='add'>+        factor = ((double)buf-&gt;f_frsize) / frsize;</div><div class='add'>+        buf-&gt;f_frsize = frsize;</div><div class='add'>+        buf-&gt;f_blocks = (fsblkcnt_t)(factor * buf-&gt;f_blocks);</div><div class='add'>+        buf-&gt;f_bfree = (fsblkcnt_t)(factor * buf-&gt;f_bfree);</div><div class='add'>+        buf-&gt;f_bavail = (fsblkcnt_t)(factor * buf-&gt;f_bavail);</div><div class='add'>+    }</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-dht_lk (call_frame_t *frame, xlator_t *this,</div><div class='del'>-	fd_t *fd, int cmd, struct flock *flock)</div><div class='add'>+static int</div><div class='add'>+dht_statfs_cbk(call_frame_t *frame, void *cookie, xlator_t *this, int op_ret,</div><div class='add'>+               int op_errno, struct statvfs *statvfs, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-	xlator_t     *subvol = NULL;</div><div class='del'>-        int           op_errno = -1;</div><div class='add'>+    gf_boolean_t event = _gf_false;</div><div class='add'>+    qdstatfs_action_t action = qdstatfs_action_OFF;</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    int this_call_cnt = 0;</div><div class='add'>+    int bsize = 0;</div><div class='add'>+    int frsize = 0;</div><div class='add'>+    GF_UNUSED int ret = 0;</div><div class='add'>+    unsigned long new_usage = 0;</div><div class='add'>+    unsigned long cur_usage = 0;</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    GF_ASSERT(local);</div><div class='add'>+</div><div class='add'>+    if (xdata)</div><div class='add'>+        ret = dict_get_int8(xdata, "quota-deem-statfs", (int8_t *)&amp;event);</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;frame-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        if (op_ret == -1) {</div><div class='add'>+            local-&gt;op_errno = op_errno;</div><div class='add'>+            goto unlock;</div><div class='add'>+        }</div><div class='add'>+        if (!statvfs) {</div><div class='add'>+            op_errno = EINVAL;</div><div class='add'>+            local-&gt;op_ret = -1;</div><div class='add'>+            goto unlock;</div><div class='add'>+        }</div><div class='add'>+        local-&gt;op_ret = 0;</div><div class='add'>+</div><div class='add'>+        if (local-&gt;quota_deem_statfs) {</div><div class='add'>+            if (event == _gf_true) {</div><div class='add'>+                action = qdstatfs_action_COMPARE;</div><div class='add'>+            } else {</div><div class='add'>+                action = qdstatfs_action_NEGLECT;</div><div class='add'>+            }</div><div class='add'>+        } else {</div><div class='add'>+            if (event == _gf_true) {</div><div class='add'>+                action = qdstatfs_action_REPLACE;</div><div class='add'>+                local-&gt;quota_deem_statfs = _gf_true;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='ctx'> </div><div class='add'>+        if (local-&gt;quota_deem_statfs) {</div><div class='add'>+            switch (action) {</div><div class='add'>+                case qdstatfs_action_NEGLECT:</div><div class='add'>+                    goto unlock;</div><div class='ctx'> </div><div class='del'>-        VALIDATE_OR_GOTO (frame, err);</div><div class='del'>-        VALIDATE_OR_GOTO (this, err);</div><div class='del'>-        VALIDATE_OR_GOTO (fd, err);</div><div class='add'>+                case qdstatfs_action_REPLACE:</div><div class='add'>+                    local-&gt;statvfs = *statvfs;</div><div class='add'>+                    goto unlock;</div><div class='ctx'> </div><div class='del'>-	subvol = dht_subvol_get_cached (this, fd-&gt;inode);</div><div class='del'>-	if (!subvol) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-			"no cached subvolume for fd=%p", fd);</div><div class='del'>-		op_errno = EINVAL;</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='add'>+                case qdstatfs_action_COMPARE:</div><div class='add'>+                    new_usage = statvfs-&gt;f_blocks - statvfs-&gt;f_bfree;</div><div class='add'>+                    cur_usage = local-&gt;statvfs.f_blocks -</div><div class='add'>+                                local-&gt;statvfs.f_bfree;</div><div class='ctx'> </div><div class='del'>-	STACK_WIND (frame, dht_lk_cbk,</div><div class='del'>-		    subvol, subvol-&gt;fops-&gt;lk,</div><div class='del'>-		    fd, cmd, flock);</div><div class='add'>+                    /* Take the max of the usage from subvols */</div><div class='add'>+                    if (new_usage &gt;= cur_usage)</div><div class='add'>+                        local-&gt;statvfs = *statvfs;</div><div class='add'>+                    goto unlock;</div><div class='ctx'> </div><div class='del'>-	return 0;</div><div class='add'>+                default:</div><div class='add'>+                    break;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-err:</div><div class='del'>-	op_errno = (op_errno == -1) ? errno : op_errno;</div><div class='del'>-	DHT_STACK_UNWIND (lk, frame, -1, op_errno, NULL);</div><div class='add'>+        if (local-&gt;statvfs.f_bsize != 0) {</div><div class='add'>+            bsize = max(local-&gt;statvfs.f_bsize, statvfs-&gt;f_bsize);</div><div class='add'>+            frsize = max(local-&gt;statvfs.f_frsize, statvfs-&gt;f_frsize);</div><div class='add'>+            dht_normalize_stats(&amp;local-&gt;statvfs, bsize, frsize);</div><div class='add'>+            dht_normalize_stats(statvfs, bsize, frsize);</div><div class='add'>+        } else {</div><div class='add'>+            local-&gt;statvfs.f_bsize = statvfs-&gt;f_bsize;</div><div class='add'>+            local-&gt;statvfs.f_frsize = statvfs-&gt;f_frsize;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='add'>+        local-&gt;statvfs.f_blocks += statvfs-&gt;f_blocks;</div><div class='add'>+        local-&gt;statvfs.f_bfree += statvfs-&gt;f_bfree;</div><div class='add'>+        local-&gt;statvfs.f_bavail += statvfs-&gt;f_bavail;</div><div class='add'>+        local-&gt;statvfs.f_files += statvfs-&gt;f_files;</div><div class='add'>+        local-&gt;statvfs.f_ffree += statvfs-&gt;f_ffree;</div><div class='add'>+        local-&gt;statvfs.f_favail += statvfs-&gt;f_favail;</div><div class='add'>+        local-&gt;statvfs.f_fsid = statvfs-&gt;f_fsid;</div><div class='add'>+        local-&gt;statvfs.f_flag = statvfs-&gt;f_flag;</div><div class='add'>+        local-&gt;statvfs.f_namemax = statvfs-&gt;f_namemax;</div><div class='add'>+    }</div><div class='add'>+unlock:</div><div class='add'>+    UNLOCK(&amp;frame-&gt;lock);</div><div class='add'>+</div><div class='add'>+    this_call_cnt = dht_frame_return(frame);</div><div class='add'>+    if (is_last_call(this_call_cnt))</div><div class='add'>+        DHT_STACK_UNWIND(statfs, frame, local-&gt;op_ret, local-&gt;op_errno,</div><div class='add'>+                         &amp;local-&gt;statvfs, xdata);</div><div class='ctx'> </div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-dht_statfs_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-		int op_ret, int op_errno, struct statvfs *statvfs)</div><div class='del'>-{</div><div class='del'>-	dht_local_t  *local = NULL;</div><div class='del'>-	int           this_call_cnt = 0;</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-</div><div class='del'>-	LOCK (&amp;frame-&gt;lock);</div><div class='del'>-	{</div><div class='del'>-		if (op_ret == -1) {</div><div class='del'>-			local-&gt;op_errno = op_errno;</div><div class='del'>-			goto unlock;</div><div class='del'>-		}</div><div class='del'>-		local-&gt;op_ret = 0;</div><div class='del'>-</div><div class='del'>-		/* TODO: normalize sizes */</div><div class='del'>-		local-&gt;statvfs.f_bsize    = statvfs-&gt;f_bsize;</div><div class='del'>-		local-&gt;statvfs.f_frsize   = statvfs-&gt;f_frsize;</div><div class='del'>-</div><div class='del'>-		local-&gt;statvfs.f_blocks  += statvfs-&gt;f_blocks;</div><div class='del'>-		local-&gt;statvfs.f_bfree   += statvfs-&gt;f_bfree;</div><div class='del'>-		local-&gt;statvfs.f_bavail  += statvfs-&gt;f_bavail;</div><div class='del'>-		local-&gt;statvfs.f_files   += statvfs-&gt;f_files;</div><div class='del'>-		local-&gt;statvfs.f_ffree   += statvfs-&gt;f_ffree;</div><div class='del'>-		local-&gt;statvfs.f_favail  += statvfs-&gt;f_favail;</div><div class='del'>-		local-&gt;statvfs.f_fsid     = statvfs-&gt;f_fsid;</div><div class='del'>-		local-&gt;statvfs.f_flag     = statvfs-&gt;f_flag;</div><div class='del'>-		local-&gt;statvfs.f_namemax  = statvfs-&gt;f_namemax;</div><div class='del'>-</div><div class='del'>-	}</div><div class='del'>-unlock:</div><div class='del'>-	UNLOCK (&amp;frame-&gt;lock);</div><div class='add'>+dht_statfs(call_frame_t *frame, xlator_t *this, loc_t *loc, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    dht_conf_t *conf = NULL;</div><div class='add'>+    int op_errno = -1;</div><div class='add'>+    int i = -1;</div><div class='add'>+    inode_t *inode = NULL;</div><div class='add'>+    inode_table_t *itable = NULL;</div><div class='add'>+    static uuid_t root_gfid = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1};</div><div class='add'>+    loc_t newloc = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    VALIDATE_OR_GOTO(frame, err);</div><div class='add'>+    VALIDATE_OR_GOTO(this, err);</div><div class='add'>+    VALIDATE_OR_GOTO(loc, err);</div><div class='add'>+    VALIDATE_OR_GOTO(this-&gt;private, err);</div><div class='add'>+</div><div class='add'>+    conf = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    local = dht_local_init(frame, NULL, NULL, GF_FOP_STATFS);</div><div class='add'>+    if (!local) {</div><div class='add'>+        op_errno = ENOMEM;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (loc-&gt;inode &amp;&amp; !IA_ISDIR(loc-&gt;inode-&gt;ia_type)) {</div><div class='add'>+        itable = loc-&gt;inode-&gt;table;</div><div class='add'>+        if (!itable) {</div><div class='add'>+            op_errno = EINVAL;</div><div class='add'>+            goto err;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='add'>+        loc = &amp;local-&gt;loc2;</div><div class='ctx'> </div><div class='del'>-	this_call_cnt = dht_frame_return (frame);</div><div class='del'>-	if (is_last_call (this_call_cnt))</div><div class='del'>-		DHT_STACK_UNWIND (statfs, frame, local-&gt;op_ret, local-&gt;op_errno,</div><div class='del'>-				  &amp;local-&gt;statvfs);</div><div class='add'>+        inode = inode_find(itable, root_gfid);</div><div class='add'>+        if (!inode) {</div><div class='add'>+            op_errno = EINVAL;</div><div class='add'>+            goto err;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='add'>+        dht_build_root_loc(inode, &amp;newloc);</div><div class='add'>+        loc = &amp;newloc;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='add'>+    local-&gt;call_cnt = conf-&gt;subvolume_cnt;</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-dht_statfs (call_frame_t *frame, xlator_t *this, loc_t *loc)</div><div class='del'>-{</div><div class='del'>-	dht_local_t  *local  = NULL;</div><div class='del'>-	dht_conf_t   *conf = NULL;</div><div class='del'>-        int           op_errno = -1;</div><div class='del'>-	int           i = -1;</div><div class='add'>+    for (i = 0; i &lt; conf-&gt;subvolume_cnt; i++) {</div><div class='add'>+        STACK_WIND(frame, dht_statfs_cbk, conf-&gt;subvolumes[i],</div><div class='add'>+                   conf-&gt;subvolumes[i]-&gt;fops-&gt;statfs, loc, xdata);</div><div class='add'>+    }</div><div class='add'>+    return 0;</div><div class='ctx'> </div><div class='add'>+err:</div><div class='add'>+    op_errno = (op_errno == -1) ? errno : op_errno;</div><div class='add'>+    DHT_STACK_UNWIND(statfs, frame, -1, op_errno, NULL, NULL);</div><div class='ctx'> </div><div class='del'>-        VALIDATE_OR_GOTO (frame, err);</div><div class='del'>-        VALIDATE_OR_GOTO (this, err);</div><div class='del'>-        VALIDATE_OR_GOTO (loc, err);</div><div class='del'>-        VALIDATE_OR_GOTO (loc-&gt;inode, err);</div><div class='del'>-        VALIDATE_OR_GOTO (loc-&gt;path, err);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	conf = this-&gt;private;</div><div class='add'>+int</div><div class='add'>+dht_opendir(call_frame_t *frame, xlator_t *this, loc_t *loc, fd_t *fd,</div><div class='add'>+            dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    dht_conf_t *conf = NULL;</div><div class='add'>+    int op_errno = -1;</div><div class='add'>+    int i = -1;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    gf_boolean_t new_xdata = _gf_false;</div><div class='add'>+    xlator_t **subvolumes = NULL;</div><div class='add'>+    int call_count = 0;</div><div class='add'>+</div><div class='add'>+    VALIDATE_OR_GOTO(frame, err);</div><div class='add'>+    VALIDATE_OR_GOTO(this, err);</div><div class='add'>+    VALIDATE_OR_GOTO(fd, err);</div><div class='add'>+    VALIDATE_OR_GOTO(this-&gt;private, err);</div><div class='add'>+</div><div class='add'>+    conf = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    local = dht_local_init(frame, loc, fd, GF_FOP_OPENDIR);</div><div class='add'>+    if (!local) {</div><div class='add'>+        op_errno = ENOMEM;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+    local-&gt;first_up_subvol = dht_first_up_subvol(this);</div><div class='add'>+</div><div class='add'>+    if (!xdata) {</div><div class='add'>+        xdata = dict_new();</div><div class='add'>+        if (!xdata) {</div><div class='add'>+            op_errno = ENOMEM;</div><div class='add'>+            goto err;</div><div class='add'>+        }</div><div class='add'>+        new_xdata = _gf_true;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_set_uint32(xdata, conf-&gt;link_xattr_name, 256);</div><div class='add'>+    if (ret)</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_WARNING, 0, DHT_MSG_DICT_SET_FAILED,</div><div class='add'>+               "Failed to set dictionary value : key = %s",</div><div class='add'>+               conf-&gt;link_xattr_name);</div><div class='add'>+</div><div class='add'>+    /* dht_readdirp will wind to all subvols so open has to be sent to</div><div class='add'>+     * all subvols whether or not conf-&gt;local_subvols is set */</div><div class='add'>+</div><div class='add'>+    call_count = local-&gt;call_cnt = conf-&gt;subvolume_cnt;</div><div class='add'>+    subvolumes = conf-&gt;subvolumes;</div><div class='add'>+</div><div class='add'>+    /* In case of parallel-readdir, the readdir-ahead will be loaded</div><div class='add'>+     * below dht, in this case, if we want to enable or disable SKIP_DIRs</div><div class='add'>+     * it has to be done in opendir, so that prefetching logic in</div><div class='add'>+     * readdir-ahead, honors it */</div><div class='add'>+    for (i = 0; i &lt; call_count; i++) {</div><div class='add'>+        if (conf-&gt;readdir_optimize == _gf_true) {</div><div class='add'>+            if (subvolumes[i] != local-&gt;first_up_subvol) {</div><div class='add'>+                ret = dict_set_int32(xdata, GF_READDIR_SKIP_DIRS, 1);</div><div class='add'>+                if (ret)</div><div class='add'>+                    gf_msg(this-&gt;name, GF_LOG_ERROR, 0, DHT_MSG_DICT_SET_FAILED,</div><div class='add'>+                           "Failed to set dictionary"</div><div class='add'>+                           " value :key = %s, ret:%d",</div><div class='add'>+                           GF_READDIR_SKIP_DIRS, ret);</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-	local = dht_local_init (frame);</div><div class='del'>-	local-&gt;call_cnt = conf-&gt;subvolume_cnt;</div><div class='add'>+        STACK_WIND_COOKIE(frame, dht_fd_cbk, subvolumes[i], subvolumes[i],</div><div class='add'>+                          subvolumes[i]-&gt;fops-&gt;opendir, loc, fd, xdata);</div><div class='add'>+        dict_del(xdata, GF_READDIR_SKIP_DIRS);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	for (i = 0; i &lt; conf-&gt;subvolume_cnt; i++) {</div><div class='del'>-		STACK_WIND (frame, dht_statfs_cbk,</div><div class='del'>-			    conf-&gt;subvolumes[i],</div><div class='del'>-			    conf-&gt;subvolumes[i]-&gt;fops-&gt;statfs, loc);</div><div class='del'>-	}</div><div class='add'>+    if (new_xdata)</div><div class='add'>+        dict_unref(xdata);</div><div class='ctx'> </div><div class='del'>-	return 0;</div><div class='add'>+    return 0;</div><div class='ctx'> </div><div class='ctx'> err:</div><div class='del'>-	op_errno = (op_errno == -1) ? errno : op_errno;</div><div class='del'>-	DHT_STACK_UNWIND (statfs, frame, -1, op_errno, NULL);</div><div class='add'>+    op_errno = (op_errno == -1) ? errno : op_errno;</div><div class='add'>+    DHT_STACK_UNWIND(opendir, frame, -1, op_errno, NULL, NULL);</div><div class='ctx'> </div><div class='del'>-	return 0;</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+/* dht_readdirp_cbk creates a new dentry and dentry-&gt;inode is not assigned.</div><div class='add'>+   This functions assigns an inode if all of the following conditions are</div><div class='add'>+   true:</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-dht_opendir (call_frame_t *frame, xlator_t *this, loc_t *loc, fd_t *fd)</div><div class='add'>+   * DHT has only one child. In this case the entire layout is present on</div><div class='add'>+   this single child and hence we can set complete layout in inode.</div><div class='add'>+   * backend has complete layout and there are no anomalies in it and from</div><div class='add'>+   this information layout can be constructed and set in inode.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+dht_populate_inode_for_dentry(xlator_t *this, xlator_t *subvol,</div><div class='add'>+                              gf_dirent_t *entry, gf_dirent_t *orig_entry)</div><div class='ctx'> {</div><div class='del'>-	dht_local_t  *local  = NULL;</div><div class='del'>-	dht_conf_t   *conf = NULL;</div><div class='del'>-	int           ret = -1;</div><div class='del'>-        int           op_errno = -1;</div><div class='del'>-	int           i = -1;</div><div class='add'>+    dht_layout_t *layout = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    loc_t loc = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    if (gf_uuid_is_null(orig_entry-&gt;d_stat.ia_gfid)) {</div><div class='add'>+        /* this skips the '..' entry for the root of the volume */</div><div class='add'>+        return;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    gf_uuid_copy(loc.gfid, orig_entry-&gt;d_stat.ia_gfid);</div><div class='add'>+    loc.inode = inode_ref(orig_entry-&gt;inode);</div><div class='add'>+</div><div class='add'>+    if (is_revalidate(&amp;loc)) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    layout = dht_layout_new(this, 1);</div><div class='add'>+    if (!layout)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    ret = dht_layout_merge(this, layout, subvol, 0, 0, orig_entry-&gt;dict);</div><div class='add'>+    if (!ret) {</div><div class='add'>+        ret = dht_layout_normalize(this, &amp;loc, layout);</div><div class='add'>+        if (ret == 0) {</div><div class='add'>+            dht_layout_set(this, orig_entry-&gt;inode, layout);</div><div class='add'>+            entry-&gt;inode = inode_ref(orig_entry-&gt;inode);</div><div class='add'>+            layout = NULL;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='ctx'> </div><div class='add'>+    if (layout)</div><div class='add'>+        dht_layout_unref(this, layout);</div><div class='ctx'> </div><div class='del'>-        VALIDATE_OR_GOTO (frame, err);</div><div class='del'>-        VALIDATE_OR_GOTO (this, err);</div><div class='del'>-        VALIDATE_OR_GOTO (fd, err);</div><div class='add'>+out:</div><div class='add'>+    loc_wipe(&amp;loc);</div><div class='add'>+    return;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	conf = this-&gt;private;</div><div class='add'>+/* Posix returns op_errno = ENOENT to indicate that there are no more</div><div class='add'>+ * entries</div><div class='add'>+ */</div><div class='add'>+static int</div><div class='add'>+dht_readdirp_cbk(call_frame_t *frame, void *cookie, xlator_t *this, int op_ret,</div><div class='add'>+                 int op_errno, gf_dirent_t *orig_entries, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    gf_dirent_t entries;</div><div class='add'>+    gf_dirent_t *orig_entry = NULL;</div><div class='add'>+    gf_dirent_t *entry = NULL;</div><div class='add'>+    xlator_t *prev = NULL;</div><div class='add'>+    xlator_t *next_subvol = NULL;</div><div class='add'>+    off_t next_offset = 0;</div><div class='add'>+    int count = 0;</div><div class='add'>+    dht_layout_t *layout = NULL;</div><div class='add'>+    dht_conf_t *conf = NULL;</div><div class='add'>+    dht_methods_t *methods = NULL;</div><div class='add'>+    xlator_t *subvol = 0;</div><div class='add'>+    xlator_t *hashed_subvol = 0;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    int readdir_optimize = 0;</div><div class='add'>+    inode_table_t *itable = NULL;</div><div class='add'>+    inode_t *inode = NULL;</div><div class='add'>+    gf_boolean_t skip_hashed_check = _gf_false;</div><div class='add'>+</div><div class='add'>+    INIT_LIST_HEAD(&amp;entries.list);</div><div class='add'>+</div><div class='add'>+    prev = cookie;</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, local-&gt;fd, unwind);</div><div class='add'>+</div><div class='add'>+    itable = local-&gt;fd-&gt;inode-&gt;table;</div><div class='add'>+</div><div class='add'>+    conf = this-&gt;private;</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, conf, unwind);</div><div class='add'>+</div><div class='add'>+    methods = &amp;(conf-&gt;methods);</div><div class='add'>+</div><div class='add'>+    if (op_ret &lt;= 0) {</div><div class='add'>+        goto done;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Why aren't we skipping DHT entirely in case of a single subvol?</div><div class='add'>+     * Because if this was a larger volume earlier and all but one subvol</div><div class='add'>+     * was removed, there might be stale linkto files on the subvol.</div><div class='add'>+     */</div><div class='add'>+    if (conf-&gt;subvolume_cnt == 1) {</div><div class='add'>+        /* return all directory and file entries except</div><div class='add'>+         * linkto files for a single child DHT</div><div class='add'>+         */</div><div class='add'>+        skip_hashed_check = _gf_true;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	local = dht_local_init (frame);</div><div class='del'>-	if (!local) {</div><div class='del'>-		op_errno = ENOMEM;</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-			"Out of memory");</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='add'>+    if (!local-&gt;layout)</div><div class='add'>+        local-&gt;layout = dht_layout_get(this, local-&gt;fd-&gt;inode);</div><div class='ctx'> </div><div class='del'>-	local-&gt;fd = fd_ref (fd);</div><div class='del'>-	ret = loc_dup (loc, &amp;local-&gt;loc);</div><div class='del'>-	if (ret == -1) {</div><div class='del'>-		op_errno = ENOMEM;</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-			"Out of memory");</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='add'>+    layout = local-&gt;layout;</div><div class='ctx'> </div><div class='del'>-	local-&gt;call_cnt = conf-&gt;subvolume_cnt;</div><div class='add'>+    /* This will skip the entries on the subvol without a layout,</div><div class='add'>+     * hence preventing the crash but rmdir might fail with</div><div class='add'>+     * "directory not empty" errors*/</div><div class='ctx'> </div><div class='del'>-	for (i = 0; i &lt; conf-&gt;subvolume_cnt; i++) {</div><div class='del'>-		STACK_WIND (frame, dht_fd_cbk,</div><div class='del'>-			    conf-&gt;subvolumes[i],</div><div class='del'>-			    conf-&gt;subvolumes[i]-&gt;fops-&gt;opendir,</div><div class='del'>-			    loc, fd);</div><div class='del'>-	}</div><div class='add'>+    if (layout == NULL)</div><div class='add'>+        goto done;</div><div class='ctx'> </div><div class='del'>-	return 0;</div><div class='add'>+    if (conf-&gt;readdir_optimize == _gf_true)</div><div class='add'>+        readdir_optimize = 1;</div><div class='ctx'> </div><div class='del'>-err:</div><div class='del'>-	op_errno = (op_errno == -1) ? errno : op_errno;</div><div class='del'>-	DHT_STACK_UNWIND (opendir, frame, -1, op_errno, NULL);</div><div class='add'>+    gf_msg_debug(this-&gt;name, 0, "Processing entries from %s", prev-&gt;name);</div><div class='ctx'> </div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='add'>+    list_for_each_entry(orig_entry, (&amp;orig_entries-&gt;list), list)</div><div class='add'>+    {</div><div class='add'>+        next_offset = orig_entry-&gt;d_off;</div><div class='ctx'> </div><div class='add'>+        gf_msg_debug(this-&gt;name, 0, "%s: entry = %s, type = %d", prev-&gt;name,</div><div class='add'>+                     orig_entry-&gt;d_name, orig_entry-&gt;d_type);</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-dht_readdirp_cbk (call_frame_t *frame, void *cookie, xlator_t *this, int op_ret,</div><div class='del'>-                  int op_errno, gf_dirent_t *orig_entries)</div><div class='del'>-{</div><div class='del'>-	dht_local_t  *local = NULL;</div><div class='del'>-	gf_dirent_t   entries;</div><div class='del'>-	gf_dirent_t  *orig_entry = NULL;</div><div class='del'>-	gf_dirent_t  *entry = NULL;</div><div class='del'>-	call_frame_t *prev = NULL;</div><div class='del'>-	xlator_t     *next_subvol = NULL;</div><div class='del'>-        off_t         next_offset = 0;</div><div class='del'>-	int           count = 0;</div><div class='del'>-        dht_layout_t *layout = 0;</div><div class='del'>-        dht_conf_t   *conf   = NULL;</div><div class='del'>-        xlator_t     *subvol = 0;</div><div class='del'>-</div><div class='del'>-	INIT_LIST_HEAD (&amp;entries.list);</div><div class='del'>-	prev = cookie;</div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-	conf  = this-&gt;private;</div><div class='del'>-</div><div class='del'>-	if (op_ret &lt; 0)</div><div class='del'>-		goto done;</div><div class='del'>-</div><div class='del'>-        if (!local-&gt;layout)</div><div class='del'>-                local-&gt;layout = dht_layout_get (this, local-&gt;fd-&gt;inode);</div><div class='add'>+        if (IA_ISINVAL(orig_entry-&gt;d_stat.ia_type)) {</div><div class='add'>+            /*stat failed somewhere- display this entry but the data may</div><div class='add'>+             * be inaccurate.</div><div class='add'>+             */</div><div class='add'>+            gf_msg_debug(this-&gt;name, EINVAL, "Invalid stat for %s (gfid %s)",</div><div class='add'>+                         orig_entry-&gt;d_name,</div><div class='add'>+                         uuid_utoa(orig_entry-&gt;d_stat.ia_gfid));</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-        layout = local-&gt;layout;</div><div class='add'>+        if (check_is_linkfile(NULL, (&amp;orig_entry-&gt;d_stat), orig_entry-&gt;dict,</div><div class='add'>+                              conf-&gt;link_xattr_name)) {</div><div class='add'>+            gf_msg_debug(this-&gt;name, 0, "%s: %s is a linkto file", prev-&gt;name,</div><div class='add'>+                         orig_entry-&gt;d_name);</div><div class='add'>+            continue;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-	list_for_each_entry (orig_entry, (&amp;orig_entries-&gt;list), list) {</div><div class='del'>-                next_offset = orig_entry-&gt;d_off;</div><div class='add'>+        if (skip_hashed_check) {</div><div class='add'>+            goto list;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-                if (check_is_linkfile (NULL, (&amp;orig_entry-&gt;d_stat), NULL)</div><div class='del'>-                    || (check_is_dir (NULL, (&amp;orig_entry-&gt;d_stat), NULL)</div><div class='del'>-                        &amp;&amp; (prev-&gt;this != dht_first_up_subvol (this)))) {</div><div class='del'>-                        continue;</div><div class='del'>-                }</div><div class='add'>+        if (check_is_dir(NULL, (&amp;orig_entry-&gt;d_stat), NULL)) {</div><div class='add'>+            /*Directory entries filtering :</div><div class='add'>+             * a) If rebalance is running, pick from first_up_subvol</div><div class='add'>+             * b) (rebalance not running)hashed subvolume is NULL or</div><div class='add'>+             * down then filter in first_up_subvolume. Other wise the</div><div class='add'>+             * corresponding hashed subvolume will take care of the</div><div class='add'>+             * directory entry.</div><div class='add'>+             */</div><div class='add'>+            if (readdir_optimize) {</div><div class='add'>+                if (prev == local-&gt;first_up_subvol)</div><div class='add'>+                    goto list;</div><div class='add'>+                else</div><div class='add'>+                    continue;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            hashed_subvol = methods-&gt;layout_search(this, layout,</div><div class='add'>+                                                   orig_entry-&gt;d_name);</div><div class='add'>+</div><div class='add'>+            if (prev == hashed_subvol)</div><div class='add'>+                goto list;</div><div class='add'>+            if ((hashed_subvol &amp;&amp; dht_subvol_status(conf, hashed_subvol)) ||</div><div class='add'>+                (prev != local-&gt;first_up_subvol))</div><div class='add'>+                continue;</div><div class='add'>+</div><div class='add'>+            goto list;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-                entry = gf_dirent_for_name (orig_entry-&gt;d_name);</div><div class='del'>-                if (!entry) {</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-                                "Out of memory");</div><div class='del'>-                        goto unwind;</div><div class='del'>-                }</div><div class='add'>+    list:</div><div class='add'>+        entry = gf_dirent_for_name(orig_entry-&gt;d_name);</div><div class='add'>+        if (!entry) {</div><div class='add'>+            goto unwind;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-                /* Do this if conf-&gt;search_unhashed is set to "auto" */</div><div class='del'>-                if (conf-&gt;search_unhashed == GF_DHT_LOOKUP_UNHASHED_AUTO) {</div><div class='del'>-                        subvol = dht_layout_search (this, layout,</div><div class='del'>-                                                    orig_entry-&gt;d_name);</div><div class='del'>-                        if (!subvol || (subvol != prev-&gt;this)) {</div><div class='del'>-                                /* TODO: Count the number of entries which need</div><div class='del'>-                                   linkfile to prove its existance in fs */</div><div class='del'>-                                layout-&gt;search_unhashed++;</div><div class='del'>-                        }</div><div class='del'>-                }</div><div class='del'>-                entry-&gt;d_stat = orig_entry-&gt;d_stat;</div><div class='del'>-</div><div class='del'>-                dht_itransform (this, prev-&gt;this, orig_entry-&gt;d_ino,</div><div class='del'>-                                &amp;entry-&gt;d_ino);</div><div class='del'>-                dht_itransform (this, prev-&gt;this, orig_entry-&gt;d_off,</div><div class='del'>-                                &amp;entry-&gt;d_off);</div><div class='del'>-</div><div class='del'>-                entry-&gt;d_stat.ia_ino = entry-&gt;d_ino;</div><div class='del'>-                entry-&gt;d_type = orig_entry-&gt;d_type;</div><div class='del'>-                entry-&gt;d_len  = orig_entry-&gt;d_len;</div><div class='del'>-</div><div class='del'>-                list_add_tail (&amp;entry-&gt;list, &amp;entries.list);</div><div class='del'>-                count++;</div><div class='del'>-	}</div><div class='del'>-	op_ret = count;</div><div class='del'>-        /* We need to ensure that only the last subvolume's end-of-directory</div><div class='del'>-         * notification is respected so that directory reading does not stop</div><div class='del'>-         * before all subvolumes have been read. That could happen because the</div><div class='del'>-         * posix for each subvolume sends a ENOENT on end-of-directory but in</div><div class='del'>-         * distribute we're not concerned only with a posix's view of the</div><div class='del'>-         * directory but the aggregated namespace' view of the directory.</div><div class='del'>-         */</div><div class='del'>-        if (prev-&gt;this != dht_last_up_subvol (this))</div><div class='del'>-                op_errno = 0;</div><div class='add'>+        /* Do this if conf-&gt;search_unhashed is set to "auto" */</div><div class='add'>+        if (conf-&gt;search_unhashed == GF_DHT_LOOKUP_UNHASHED_AUTO) {</div><div class='add'>+            subvol = methods-&gt;layout_search(this, layout, orig_entry-&gt;d_name);</div><div class='add'>+            if (!subvol || (subvol != prev)) {</div><div class='add'>+                /* TODO: Count the number of entries which need</div><div class='add'>+                   linkfile to prove its existence in fs */</div><div class='add'>+                layout-&gt;search_unhashed++;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-done:</div><div class='del'>-	if (count == 0) {</div><div class='del'>-                /* non-zero next_offset means that</div><div class='del'>-                   EOF is not yet hit on the current subvol</div><div class='del'>-                */</div><div class='del'>-                if (next_offset == 0) {</div><div class='del'>-                        next_subvol = dht_subvol_next (this, prev-&gt;this);</div><div class='del'>-                } else {</div><div class='del'>-                        next_subvol = prev-&gt;this;</div><div class='add'>+        entry-&gt;d_off = orig_entry-&gt;d_off;</div><div class='add'>+        entry-&gt;d_stat = orig_entry-&gt;d_stat;</div><div class='add'>+        entry-&gt;d_ino = orig_entry-&gt;d_ino;</div><div class='add'>+        entry-&gt;d_type = orig_entry-&gt;d_type;</div><div class='add'>+        entry-&gt;d_len = orig_entry-&gt;d_len;</div><div class='add'>+</div><div class='add'>+        if (orig_entry-&gt;dict)</div><div class='add'>+            entry-&gt;dict = dict_ref(orig_entry-&gt;dict);</div><div class='add'>+</div><div class='add'>+        /* making sure we set the inode ctx right with layout,</div><div class='add'>+           currently possible only for non-directories, so for</div><div class='add'>+           directories don't set entry inodes */</div><div class='add'>+        if (IA_ISDIR(entry-&gt;d_stat.ia_type)) {</div><div class='add'>+            entry-&gt;d_stat.ia_blocks = DHT_DIR_STAT_BLOCKS;</div><div class='add'>+            entry-&gt;d_stat.ia_size = DHT_DIR_STAT_SIZE;</div><div class='add'>+            if (orig_entry-&gt;inode) {</div><div class='add'>+                dht_inode_ctx_time_update(orig_entry-&gt;inode, this,</div><div class='add'>+                                          &amp;entry-&gt;d_stat, 1);</div><div class='add'>+</div><div class='add'>+                if (conf-&gt;subvolume_cnt == 1) {</div><div class='add'>+                    dht_populate_inode_for_dentry(this, prev, entry,</div><div class='add'>+                                                  orig_entry);</div><div class='ctx'>                 }</div><div class='add'>+            }</div><div class='add'>+        } else {</div><div class='add'>+            if (orig_entry-&gt;dict &amp;&amp;</div><div class='add'>+                dict_get(orig_entry-&gt;dict, conf-&gt;link_xattr_name)) {</div><div class='add'>+                /* Strip out the S and T flags set by rebalance*/</div><div class='add'>+                DHT_STRIP_PHASE1_FLAGS(&amp;entry-&gt;d_stat);</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            if (orig_entry-&gt;inode) {</div><div class='add'>+                ret = dht_layout_preset(this, prev, orig_entry-&gt;inode);</div><div class='add'>+                if (ret)</div><div class='add'>+                    gf_msg(this-&gt;name, GF_LOG_WARNING, 0,</div><div class='add'>+                           DHT_MSG_LAYOUT_SET_FAILED,</div><div class='add'>+                           "failed to link the layout "</div><div class='add'>+                           "in inode for %s",</div><div class='add'>+                           orig_entry-&gt;d_name);</div><div class='add'>+</div><div class='add'>+                entry-&gt;inode = inode_ref(orig_entry-&gt;inode);</div><div class='add'>+            } else if (itable) {</div><div class='add'>+                /*</div><div class='add'>+                 * orig_entry-&gt;inode might be null if any upper</div><div class='add'>+                 * layer xlators below client set to null, to</div><div class='add'>+                 * force a lookup on the inode even if the inode</div><div class='add'>+                 * is present in the inode table. In that case</div><div class='add'>+                 * we just update the ctx to make sure we didn't</div><div class='add'>+                 * missed anything.</div><div class='add'>+                 */</div><div class='add'>+                inode = inode_find(itable, orig_entry-&gt;d_stat.ia_gfid);</div><div class='add'>+                if (inode) {</div><div class='add'>+                    ret = dht_layout_preset(this, prev, inode);</div><div class='add'>+                    if (ret)</div><div class='add'>+                        gf_msg(this-&gt;name, GF_LOG_WARNING, 0,</div><div class='add'>+                               DHT_MSG_LAYOUT_SET_FAILED,</div><div class='add'>+                               "failed to link the layout"</div><div class='add'>+                               " in inode for %s",</div><div class='add'>+                               orig_entry-&gt;d_name);</div><div class='add'>+                    inode_unref(inode);</div><div class='add'>+                    inode = NULL;</div><div class='add'>+                }</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-		if (!next_subvol) {</div><div class='del'>-			goto unwind;</div><div class='del'>-		}</div><div class='add'>+        gf_msg_debug(this-&gt;name, 0, "%s: Adding entry = %s", prev-&gt;name,</div><div class='add'>+                     entry-&gt;d_name);</div><div class='ctx'> </div><div class='del'>-		STACK_WIND (frame, dht_readdirp_cbk,</div><div class='del'>-			    next_subvol, next_subvol-&gt;fops-&gt;readdirp,</div><div class='del'>-			    local-&gt;fd, local-&gt;size, next_offset);</div><div class='del'>-		return 0;</div><div class='del'>-	}</div><div class='add'>+        list_add_tail(&amp;entry-&gt;list, &amp;entries.list);</div><div class='add'>+        count++;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-unwind:</div><div class='del'>-	if (op_ret &lt; 0)</div><div class='del'>-		op_ret = 0;</div><div class='add'>+done:</div><div class='ctx'> </div><div class='del'>-	DHT_STACK_UNWIND (readdirp, frame, op_ret, op_errno, &amp;entries);</div><div class='add'>+    /* We need to ensure that only the last subvolume's end-of-directory</div><div class='add'>+     * notification is respected so that directory reading does not stop</div><div class='add'>+     * before all subvolumes have been read. That could happen because the</div><div class='add'>+     * posix for each subvolume sends a ENOENT on end-of-directory but in</div><div class='add'>+     * distribute we're not concerned only with a posix's view of the</div><div class='add'>+     * directory but the aggregated namespace' view of the directory.</div><div class='add'>+     * Possible values:</div><div class='add'>+     * op_ret == 0 and op_errno != 0</div><div class='add'>+     *   if op_errno != ENOENT : Error.Unwind.</div><div class='add'>+     *   if op_errno == ENOENT : There are no more entries on this subvol.</div><div class='add'>+     *                           Move to the next one.</div><div class='add'>+     * op_ret &gt; 0 and count == 0 :</div><div class='add'>+     *    The subvol returned entries to dht but all were stripped out.</div><div class='add'>+     *    For example, if they were linkto files or dirs where</div><div class='add'>+     *    hashed_subvol != prev. Try to get some entries by winding</div><div class='add'>+     *    to the next subvol. This can be dangerous if parallel readdir</div><div class='add'>+     *    is enabled as it grows the stack.</div><div class='add'>+     *</div><div class='add'>+     * op_ret &gt; 0 and count &gt; 0:</div><div class='add'>+     *   We found some entries. Unwind even if the buffer is not full.</div><div class='add'>+     *</div><div class='add'>+     */</div><div class='add'>+</div><div class='add'>+    op_ret = count;</div><div class='add'>+    if (count == 0) {</div><div class='add'>+        /* non-zero next_offset means that</div><div class='add'>+         * EOF is not yet hit on the current subvol</div><div class='add'>+         */</div><div class='add'>+        if ((next_offset == 0) || (op_errno == ENOENT)) {</div><div class='add'>+            next_offset = 0;</div><div class='add'>+            next_subvol = dht_subvol_next(this, prev);</div><div class='add'>+        } else {</div><div class='add'>+            next_subvol = prev;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-	gf_dirent_free (&amp;entries);</div><div class='add'>+        if (!next_subvol) {</div><div class='add'>+            goto unwind;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='add'>+        if (conf-&gt;readdir_optimize == _gf_true) {</div><div class='add'>+            if (next_subvol != local-&gt;first_up_subvol) {</div><div class='add'>+                ret = dict_set_int32(local-&gt;xattr, GF_READDIR_SKIP_DIRS, 1);</div><div class='add'>+                if (ret)</div><div class='add'>+                    gf_msg(this-&gt;name, GF_LOG_ERROR, 0, DHT_MSG_DICT_SET_FAILED,</div><div class='add'>+                           "Failed to set dictionary value"</div><div class='add'>+                           ":key = %s",</div><div class='add'>+                           GF_READDIR_SKIP_DIRS);</div><div class='add'>+            } else {</div><div class='add'>+                dict_del(local-&gt;xattr, GF_READDIR_SKIP_DIRS);</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        STACK_WIND_COOKIE(frame, dht_readdirp_cbk, next_subvol, next_subvol,</div><div class='add'>+                          next_subvol-&gt;fops-&gt;readdirp, local-&gt;fd, local-&gt;size,</div><div class='add'>+                          next_offset, local-&gt;xattr);</div><div class='ctx'>         return 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+unwind:</div><div class='add'>+    /* We need to ensure that only the last subvolume's end-of-directory</div><div class='add'>+     * notification is respected so that directory reading does not stop</div><div class='add'>+     * before all subvolumes have been read. That could happen because the</div><div class='add'>+     * posix for each subvolume sends a ENOENT on end-of-directory but in</div><div class='add'>+     * distribute we're not concerned only with a posix's view of the</div><div class='add'>+     * directory but the aggregated namespace' view of the directory.</div><div class='add'>+     */</div><div class='add'>+    if (op_ret &lt; 0)</div><div class='add'>+        op_ret = 0;</div><div class='add'>+</div><div class='add'>+    if (prev != dht_last_up_subvol(this))</div><div class='add'>+        op_errno = 0;</div><div class='add'>+</div><div class='add'>+    DHT_STACK_UNWIND(readdirp, frame, op_ret, op_errno, &amp;entries, NULL);</div><div class='add'>+</div><div class='add'>+    gf_dirent_free(&amp;entries);</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+static int</div><div class='add'>+dht_readdir_cbk(call_frame_t *frame, void *cookie, xlator_t *this, int op_ret,</div><div class='add'>+                int op_errno, gf_dirent_t *orig_entries, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    gf_dirent_t entries;</div><div class='add'>+    gf_dirent_t *orig_entry = NULL;</div><div class='add'>+    gf_dirent_t *entry = NULL;</div><div class='add'>+    xlator_t *prev = NULL;</div><div class='add'>+    xlator_t *next_subvol = NULL;</div><div class='add'>+    off_t next_offset = 0;</div><div class='add'>+    int count = 0;</div><div class='add'>+    dht_layout_t *layout = 0;</div><div class='add'>+    xlator_t *subvol = 0;</div><div class='add'>+    dht_conf_t *conf = NULL;</div><div class='add'>+    dht_methods_t *methods = NULL;</div><div class='add'>+    gf_boolean_t skip_hashed_check = _gf_false;</div><div class='ctx'> </div><div class='add'>+    INIT_LIST_HEAD(&amp;entries.list);</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-dht_readdir_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-		 int op_ret, int op_errno, gf_dirent_t *orig_entries)</div><div class='del'>-{</div><div class='del'>-	dht_local_t  *local = NULL;</div><div class='del'>-	gf_dirent_t   entries;</div><div class='del'>-	gf_dirent_t  *orig_entry = NULL;</div><div class='del'>-	gf_dirent_t  *entry = NULL;</div><div class='del'>-	call_frame_t *prev = NULL;</div><div class='del'>-	xlator_t     *next_subvol = NULL;</div><div class='del'>-        off_t         next_offset = 0;</div><div class='del'>-	int           count = 0;</div><div class='del'>-        dht_layout_t *layout = 0;</div><div class='del'>-        dht_conf_t   *conf   = NULL;</div><div class='del'>-        xlator_t     *subvol = 0;</div><div class='del'>-</div><div class='del'>-	INIT_LIST_HEAD (&amp;entries.list);</div><div class='del'>-	prev = cookie;</div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-	conf  = this-&gt;private;</div><div class='del'>-</div><div class='del'>-	if (op_ret &lt; 0)</div><div class='del'>-		goto done;</div><div class='del'>-</div><div class='del'>-        if (!local-&gt;layout)</div><div class='del'>-                local-&gt;layout = dht_layout_get (this, local-&gt;fd-&gt;inode);</div><div class='add'>+    prev = cookie;</div><div class='add'>+    local = frame-&gt;local;</div><div class='ctx'> </div><div class='del'>-        layout = local-&gt;layout;</div><div class='add'>+    conf = this-&gt;private;</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, conf, done);</div><div class='ctx'> </div><div class='del'>-	list_for_each_entry (orig_entry, (&amp;orig_entries-&gt;list), list) {</div><div class='del'>-                next_offset = orig_entry-&gt;d_off;</div><div class='add'>+    methods = &amp;(conf-&gt;methods);</div><div class='ctx'> </div><div class='del'>-                subvol = dht_layout_search (this, layout, orig_entry-&gt;d_name);</div><div class='add'>+    if (op_ret &lt;= 0)</div><div class='add'>+        goto done;</div><div class='ctx'> </div><div class='del'>-                if (!subvol || (subvol == prev-&gt;this)) {</div><div class='del'>-                        entry = gf_dirent_for_name (orig_entry-&gt;d_name);</div><div class='del'>-                        if (!entry) {</div><div class='del'>-                                gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-                                        "memory allocation failed :(");</div><div class='del'>-                                goto unwind;</div><div class='del'>-                        }</div><div class='add'>+    if (!local-&gt;layout)</div><div class='add'>+        local-&gt;layout = dht_layout_get(this, local-&gt;fd-&gt;inode);</div><div class='ctx'> </div><div class='del'>-                        dht_itransform (this, prev-&gt;this, orig_entry-&gt;d_ino,</div><div class='del'>-                                        &amp;entry-&gt;d_ino);</div><div class='del'>-                        dht_itransform (this, prev-&gt;this, orig_entry-&gt;d_off,</div><div class='del'>-                                        &amp;entry-&gt;d_off);</div><div class='add'>+    layout = local-&gt;layout;</div><div class='ctx'> </div><div class='del'>-                        entry-&gt;d_type = orig_entry-&gt;d_type;</div><div class='del'>-                        entry-&gt;d_len  = orig_entry-&gt;d_len;</div><div class='add'>+    gf_msg_debug(this-&gt;name, 0, "Processing entries from %s", prev-&gt;name);</div><div class='ctx'> </div><div class='del'>-                        list_add_tail (&amp;entry-&gt;list, &amp;entries.list);</div><div class='del'>-                        count++;</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='del'>-	op_ret = count;</div><div class='del'>-        /* We need to ensure that only the last subvolume's end-of-directory</div><div class='del'>-         * notification is respected so that directory reading does not stop</div><div class='del'>-         * before all subvolumes have been read. That could happen because the</div><div class='del'>-         * posix for each subvolume sends a ENOENT on end-of-directory but in</div><div class='del'>-         * distribute we're not concerned only with a posix's view of the</div><div class='del'>-         * directory but the aggregated namespace' view of the directory.</div><div class='del'>-         */</div><div class='del'>-        if (prev-&gt;this != dht_last_up_subvol (this))</div><div class='del'>-                op_errno = 0;</div><div class='add'>+    if (conf-&gt;subvolume_cnt == 1) {</div><div class='add'>+        /*return everything*/</div><div class='add'>+        skip_hashed_check = _gf_true;</div><div class='add'>+        count = op_ret;</div><div class='add'>+        goto done;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    list_for_each_entry(orig_entry, (&amp;orig_entries-&gt;list), list)</div><div class='add'>+    {</div><div class='add'>+        next_offset = orig_entry-&gt;d_off;</div><div class='add'>+</div><div class='add'>+        gf_msg_debug(this-&gt;name, 0, "%s: entry = %s, type = %d", prev-&gt;name,</div><div class='add'>+                     orig_entry-&gt;d_name, orig_entry-&gt;d_type);</div><div class='ctx'> </div><div class='add'>+        subvol = methods-&gt;layout_search(this, layout, orig_entry-&gt;d_name);</div><div class='add'>+</div><div class='add'>+        if (!subvol || (subvol == prev)) {</div><div class='add'>+            entry = gf_dirent_for_name(orig_entry-&gt;d_name);</div><div class='add'>+            if (!entry) {</div><div class='add'>+                gf_msg(this-&gt;name, GF_LOG_ERROR, ENOMEM, DHT_MSG_NO_MEMORY,</div><div class='add'>+                       "Memory allocation failed ");</div><div class='add'>+                goto unwind;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            entry-&gt;d_off = orig_entry-&gt;d_off;</div><div class='add'>+            entry-&gt;d_ino = orig_entry-&gt;d_ino;</div><div class='add'>+            entry-&gt;d_type = orig_entry-&gt;d_type;</div><div class='add'>+            entry-&gt;d_len = orig_entry-&gt;d_len;</div><div class='add'>+</div><div class='add'>+            gf_msg_debug(this-&gt;name, 0, "%s: Adding = entry %s", prev-&gt;name,</div><div class='add'>+                         entry-&gt;d_name);</div><div class='add'>+</div><div class='add'>+            list_add_tail(&amp;entry-&gt;list, &amp;entries.list);</div><div class='add'>+            count++;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='ctx'> done:</div><div class='del'>-	if (count == 0) {</div><div class='del'>-                /* non-zero next_offset means that</div><div class='del'>-                   EOF is not yet hit on the current subvol</div><div class='del'>-                */</div><div class='del'>-                if (next_offset == 0) {</div><div class='del'>-                        next_subvol = dht_subvol_next (this, prev-&gt;this);</div><div class='del'>-                } else {</div><div class='del'>-                        next_subvol = prev-&gt;this;</div><div class='del'>-                }</div><div class='add'>+    op_ret = count;</div><div class='add'>+    /* We need to ensure that only the last subvolume's end-of-directory</div><div class='add'>+     * notification is respected so that directory reading does not stop</div><div class='add'>+     * before all subvolumes have been read. That could happen because the</div><div class='add'>+     * posix for each subvolume sends a ENOENT on end-of-directory but in</div><div class='add'>+     * distribute we're not concerned only with a posix's view of the</div><div class='add'>+     * directory but the aggregated namespace' view of the directory.</div><div class='add'>+     */</div><div class='add'>+    if (count == 0) {</div><div class='add'>+        if ((next_offset == 0) || (op_errno == ENOENT)) {</div><div class='add'>+            next_offset = 0;</div><div class='add'>+            next_subvol = dht_subvol_next(this, prev);</div><div class='add'>+        } else {</div><div class='add'>+            next_subvol = prev;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-		if (!next_subvol) {</div><div class='del'>-			goto unwind;</div><div class='del'>-		}</div><div class='add'>+        if (!next_subvol) {</div><div class='add'>+            goto unwind;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-		STACK_WIND (frame, dht_readdir_cbk,</div><div class='del'>-			    next_subvol, next_subvol-&gt;fops-&gt;readdir,</div><div class='del'>-			    local-&gt;fd, local-&gt;size, next_offset);</div><div class='del'>-		return 0;</div><div class='del'>-	}</div><div class='add'>+        STACK_WIND_COOKIE(frame, dht_readdir_cbk, next_subvol, next_subvol,</div><div class='add'>+                          next_subvol-&gt;fops-&gt;readdir, local-&gt;fd, local-&gt;size,</div><div class='add'>+                          next_offset, NULL);</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='ctx'> unwind:</div><div class='del'>-	if (op_ret &lt; 0)</div><div class='del'>-		op_ret = 0;</div><div class='add'>+    /* We need to ensure that only the last subvolume's end-of-directory</div><div class='add'>+     * notification is respected so that directory reading does not stop</div><div class='add'>+     * before all subvolumes have been read. That could happen because the</div><div class='add'>+     * posix for each subvolume sends a ENOENT on end-of-directory but in</div><div class='add'>+     * distribute we're not concerned only with a posix's view of the</div><div class='add'>+     * directory but the aggregated namespace' view of the directory.</div><div class='add'>+     */</div><div class='add'>+</div><div class='add'>+    if (prev != dht_last_up_subvol(this))</div><div class='add'>+        op_errno = 0;</div><div class='add'>+</div><div class='add'>+    if (!skip_hashed_check) {</div><div class='add'>+        DHT_STACK_UNWIND(readdir, frame, op_ret, op_errno, &amp;entries, NULL);</div><div class='add'>+        gf_dirent_free(&amp;entries);</div><div class='add'>+</div><div class='add'>+    } else {</div><div class='add'>+        DHT_STACK_UNWIND(readdir, frame, op_ret, op_errno, orig_entries, NULL);</div><div class='add'>+    }</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+dht_do_readdir(call_frame_t *frame, xlator_t *this, fd_t *fd, size_t size,</div><div class='add'>+               off_t yoff, int whichop, dict_t *dict)</div><div class='add'>+{</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    int op_errno = -1;</div><div class='add'>+    xlator_t *xvol = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    dht_conf_t *conf = NULL;</div><div class='add'>+</div><div class='add'>+    VALIDATE_OR_GOTO(frame, err);</div><div class='add'>+    VALIDATE_OR_GOTO(this, err);</div><div class='add'>+    VALIDATE_OR_GOTO(fd, err);</div><div class='add'>+    VALIDATE_OR_GOTO(this-&gt;private, err);</div><div class='add'>+</div><div class='add'>+    conf = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    local = dht_local_init(frame, NULL, NULL, whichop);</div><div class='add'>+    if (!local) {</div><div class='add'>+        op_errno = ENOMEM;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    local-&gt;fd = fd_ref(fd);</div><div class='add'>+    local-&gt;size = size;</div><div class='add'>+    local-&gt;xattr_req = (dict) ? dict_ref(dict) : NULL;</div><div class='add'>+    local-&gt;first_up_subvol = dht_first_up_subvol(this);</div><div class='add'>+    local-&gt;op_ret = -1;</div><div class='add'>+</div><div class='add'>+    dht_deitransform(this, yoff, &amp;xvol);</div><div class='add'>+</div><div class='add'>+    /* TODO: do proper readdir */</div><div class='add'>+    if (whichop == GF_FOP_READDIRP) {</div><div class='add'>+        if (dict)</div><div class='add'>+            local-&gt;xattr = dict_ref(dict);</div><div class='add'>+        else</div><div class='add'>+            local-&gt;xattr = dict_new();</div><div class='add'>+</div><div class='add'>+        if (local-&gt;xattr) {</div><div class='add'>+            ret = dict_set_uint32(local-&gt;xattr, conf-&gt;link_xattr_name, 256);</div><div class='add'>+            if (ret)</div><div class='add'>+                gf_msg(this-&gt;name, GF_LOG_WARNING, 0, DHT_MSG_DICT_SET_FAILED,</div><div class='add'>+                       "Failed to set dictionary value"</div><div class='add'>+                       " : key = %s",</div><div class='add'>+                       conf-&gt;link_xattr_name);</div><div class='add'>+</div><div class='add'>+            if (conf-&gt;readdir_optimize == _gf_true) {</div><div class='add'>+                if (xvol != local-&gt;first_up_subvol) {</div><div class='add'>+                    ret = dict_set_int32(local-&gt;xattr, GF_READDIR_SKIP_DIRS, 1);</div><div class='add'>+                    if (ret)</div><div class='add'>+                        gf_msg(this-&gt;name, GF_LOG_ERROR, 0,</div><div class='add'>+                               DHT_MSG_DICT_SET_FAILED,</div><div class='add'>+                               "Failed to set "</div><div class='add'>+                               "dictionary value: "</div><div class='add'>+                               "key = %s",</div><div class='add'>+                               GF_READDIR_SKIP_DIRS);</div><div class='add'>+                } else {</div><div class='add'>+                    dict_del(local-&gt;xattr, GF_READDIR_SKIP_DIRS);</div><div class='add'>+                }</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            if (conf-&gt;subvolume_cnt == 1) {</div><div class='add'>+                ret = dict_set_uint32(local-&gt;xattr, conf-&gt;xattr_name, 4 * 4);</div><div class='add'>+                if (ret) {</div><div class='add'>+                    gf_msg(this-&gt;name, GF_LOG_WARNING, ENOMEM,</div><div class='add'>+                           DHT_MSG_DICT_SET_FAILED,</div><div class='add'>+                           "Failed to set dictionary "</div><div class='add'>+                           "value:key = %s ",</div><div class='add'>+                           conf-&gt;xattr_name);</div><div class='add'>+                }</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-	DHT_STACK_UNWIND (readdir, frame, op_ret, op_errno, &amp;entries);</div><div class='add'>+        STACK_WIND_COOKIE(frame, dht_readdirp_cbk, xvol, xvol,</div><div class='add'>+                          xvol-&gt;fops-&gt;readdirp, fd, size, yoff, local-&gt;xattr);</div><div class='add'>+    } else {</div><div class='add'>+        STACK_WIND_COOKIE(frame, dht_readdir_cbk, xvol, xvol,</div><div class='add'>+                          xvol-&gt;fops-&gt;readdir, fd, size, yoff, local-&gt;xattr);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	gf_dirent_free (&amp;entries);</div><div class='add'>+    return 0;</div><div class='ctx'> </div><div class='del'>-        return 0;</div><div class='add'>+err:</div><div class='add'>+    op_errno = (op_errno == -1) ? errno : op_errno;</div><div class='add'>+    DHT_STACK_UNWIND(readdir, frame, -1, op_errno, NULL, NULL);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+int</div><div class='add'>+dht_readdir(call_frame_t *frame, xlator_t *this, fd_t *fd, size_t size,</div><div class='add'>+            off_t yoff, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    int op = GF_FOP_READDIR;</div><div class='add'>+    dht_conf_t *conf = NULL;</div><div class='add'>+    int i = 0;</div><div class='add'>+</div><div class='add'>+    conf = this-&gt;private;</div><div class='add'>+    if (!conf)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; conf-&gt;subvolume_cnt; i++) {</div><div class='add'>+        if (!conf-&gt;subvolume_status[i]) {</div><div class='add'>+            op = GF_FOP_READDIRP;</div><div class='add'>+            break;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (conf-&gt;use_readdirp)</div><div class='add'>+        op = GF_FOP_READDIRP;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    dht_do_readdir(frame, this, fd, size, yoff, op, 0);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-dht_do_readdir (call_frame_t *frame, xlator_t *this, fd_t *fd, size_t size,</div><div class='del'>-                off_t yoff, int whichop)</div><div class='add'>+dht_readdirp(call_frame_t *frame, xlator_t *this, fd_t *fd, size_t size,</div><div class='add'>+             off_t yoff, dict_t *dict)</div><div class='ctx'> {</div><div class='del'>-	dht_local_t  *local  = NULL;</div><div class='del'>-	dht_conf_t   *conf = NULL;</div><div class='del'>-        int           op_errno = -1;</div><div class='del'>-	xlator_t     *xvol = NULL;</div><div class='del'>-	off_t         xoff = 0;</div><div class='add'>+    dht_do_readdir(frame, this, fd, size, yoff, GF_FOP_READDIRP, dict);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='add'>+static int</div><div class='add'>+dht_fsyncdir_cbk(call_frame_t *frame, void *cookie, xlator_t *this, int op_ret,</div><div class='add'>+                 int op_errno, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    int this_call_cnt = 0;</div><div class='ctx'> </div><div class='del'>-        VALIDATE_OR_GOTO (frame, err);</div><div class='del'>-        VALIDATE_OR_GOTO (this, err);</div><div class='del'>-        VALIDATE_OR_GOTO (fd, err);</div><div class='add'>+    local = frame-&gt;local;</div><div class='ctx'> </div><div class='del'>-	conf = this-&gt;private;</div><div class='add'>+    LOCK(&amp;frame-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        if (op_ret == -1)</div><div class='add'>+            local-&gt;op_errno = op_errno;</div><div class='add'>+        else if (op_ret == 0)</div><div class='add'>+            local-&gt;op_ret = 0;</div><div class='add'>+    }</div><div class='add'>+    UNLOCK(&amp;frame-&gt;lock);</div><div class='add'>+    this_call_cnt = dht_frame_return(frame);</div><div class='add'>+    if (is_last_call(this_call_cnt))</div><div class='add'>+        DHT_STACK_UNWIND(fsyncdir, frame, local-&gt;op_ret, local-&gt;op_errno,</div><div class='add'>+                         xdata);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	local = dht_local_init (frame);</div><div class='del'>-	if (!local) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-			"Out of memory");</div><div class='del'>-		op_errno = ENOMEM;</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='add'>+int</div><div class='add'>+dht_fsyncdir(call_frame_t *frame, xlator_t *this, fd_t *fd, int datasync,</div><div class='add'>+             dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    dht_conf_t *conf = NULL;</div><div class='add'>+    int op_errno = -1;</div><div class='add'>+    int i = -1;</div><div class='ctx'> </div><div class='del'>-	local-&gt;fd = fd_ref (fd);</div><div class='del'>-	local-&gt;size = size;</div><div class='add'>+    VALIDATE_OR_GOTO(frame, err);</div><div class='add'>+    VALIDATE_OR_GOTO(this, err);</div><div class='add'>+    VALIDATE_OR_GOTO(fd, err);</div><div class='add'>+    VALIDATE_OR_GOTO(this-&gt;private, err);</div><div class='ctx'> </div><div class='del'>-	dht_deitransform (this, yoff, &amp;xvol, (uint64_t *)&amp;xoff);</div><div class='add'>+    conf = this-&gt;private;</div><div class='ctx'> </div><div class='del'>-	/* TODO: do proper readdir */</div><div class='del'>-        if (whichop == GF_FOP_READDIR)</div><div class='del'>-                STACK_WIND (frame, dht_readdir_cbk, xvol, xvol-&gt;fops-&gt;readdir,</div><div class='del'>-                            fd, size, xoff);</div><div class='del'>-        else</div><div class='del'>-                STACK_WIND (frame, dht_readdirp_cbk, xvol, xvol-&gt;fops-&gt;readdirp,</div><div class='del'>-                            fd, size, xoff);</div><div class='add'>+    local = dht_local_init(frame, NULL, NULL, GF_FOP_FSYNCDIR);</div><div class='add'>+    if (!local) {</div><div class='add'>+        op_errno = ENOMEM;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    local-&gt;fd = fd_ref(fd);</div><div class='add'>+    local-&gt;call_cnt = conf-&gt;subvolume_cnt;</div><div class='ctx'> </div><div class='del'>-	return 0;</div><div class='add'>+    for (i = 0; i &lt; conf-&gt;subvolume_cnt; i++) {</div><div class='add'>+        STACK_WIND(frame, dht_fsyncdir_cbk, conf-&gt;subvolumes[i],</div><div class='add'>+                   conf-&gt;subvolumes[i]-&gt;fops-&gt;fsyncdir, fd, datasync, xdata);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='ctx'> </div><div class='ctx'> err:</div><div class='del'>-	op_errno = (op_errno == -1) ? errno : op_errno;</div><div class='del'>-	DHT_STACK_UNWIND (readdir, frame, -1, op_errno, NULL);</div><div class='add'>+    op_errno = (op_errno == -1) ? errno : op_errno;</div><div class='add'>+    DHT_STACK_UNWIND(fsyncdir, frame, -1, op_errno, NULL);</div><div class='ctx'> </div><div class='del'>-	return 0;</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-dht_readdir (call_frame_t *frame, xlator_t *this, fd_t *fd, size_t size,</div><div class='del'>-             off_t yoff)</div><div class='add'>+dht_newfile_cbk(call_frame_t *frame, void *cookie, xlator_t *this, int op_ret,</div><div class='add'>+                int op_errno, inode_t *inode, struct iatt *stbuf,</div><div class='add'>+                struct iatt *preparent, struct iatt *postparent, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-        int          op = GF_FOP_READDIR;</div><div class='del'>-        dht_conf_t  *conf = NULL;</div><div class='del'>-        int          i = 0;</div><div class='del'>-</div><div class='del'>-        conf = this-&gt;private;</div><div class='add'>+    xlator_t *prev = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+</div><div class='add'>+    if (op_ret == -1)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    if (!local) {</div><div class='add'>+        op_ret = -1;</div><div class='add'>+        op_errno = EINVAL;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    prev = cookie;</div><div class='add'>+</div><div class='add'>+    if (local-&gt;loc.parent) {</div><div class='add'>+        dht_inode_ctx_time_update(local-&gt;loc.parent, this, preparent, 0);</div><div class='add'>+        dht_inode_ctx_time_update(local-&gt;loc.parent, this, postparent, 1);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dht_layout_preset(this, prev, inode);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        gf_msg_debug(this-&gt;name, EINVAL,</div><div class='add'>+                     "could not set pre-set layout for subvolume %s",</div><div class='add'>+                     prev ? prev-&gt;name : NULL);</div><div class='add'>+        op_ret = -1;</div><div class='add'>+        op_errno = EINVAL;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    if (local-&gt;linked == _gf_true)</div><div class='add'>+        dht_linkfile_attr_heal(frame, this);</div><div class='add'>+out:</div><div class='add'>+    /*</div><div class='add'>+     * FIXME: ia_size and st_blocks of preparent and postparent do not have</div><div class='add'>+     * correct values. since, preparent and postparent buffers correspond</div><div class='add'>+     * to a directory these two members should have values equal to sum of</div><div class='add'>+     * corresponding values from each of the subvolume.</div><div class='add'>+     * See dht_iatt_merge for reference.</div><div class='add'>+     */</div><div class='add'>+    DHT_STRIP_PHASE1_FLAGS(stbuf);</div><div class='add'>+    dht_set_fixed_dir_stat(postparent);</div><div class='add'>+    dht_set_fixed_dir_stat(preparent);</div><div class='add'>+</div><div class='add'>+    if (local &amp;&amp; local-&gt;lock[0].layout.parent_layout.locks) {</div><div class='add'>+        /* store op_errno for failure case*/</div><div class='add'>+        local-&gt;op_errno = op_errno;</div><div class='add'>+        local-&gt;refresh_layout_unlock(frame, this, op_ret, 1);</div><div class='ctx'> </div><div class='del'>-        for (i = 0; i &lt; conf-&gt;subvolume_cnt; i++) {</div><div class='del'>-                if (!conf-&gt;subvolume_status[i]) {</div><div class='del'>-                        op = GF_FOP_READDIRP;</div><div class='del'>-                        break;</div><div class='del'>-                }</div><div class='add'>+        if (op_ret == 0) {</div><div class='add'>+            DHT_STACK_UNWIND(mknod, frame, op_ret, op_errno, inode, stbuf,</div><div class='add'>+                             preparent, postparent, xdata);</div><div class='ctx'>         }</div><div class='add'>+    } else {</div><div class='add'>+        DHT_STACK_UNWIND(mknod, frame, op_ret, op_errno, inode, stbuf,</div><div class='add'>+                         preparent, postparent, xdata);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        if (conf-&gt;use_readdirp)</div><div class='del'>-                op = GF_FOP_READDIRP;</div><div class='del'>-</div><div class='del'>-        dht_do_readdir (frame, this, fd, size, yoff, op);</div><div class='del'>-        return 0;</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-dht_readdirp (call_frame_t *frame, xlator_t *this, fd_t *fd, size_t size,</div><div class='del'>-              off_t yoff)</div><div class='add'>+static int</div><div class='add'>+dht_mknod_linkfile_create_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                              int32_t op_ret, int32_t op_errno, inode_t *inode,</div><div class='add'>+                              struct iatt *stbuf, struct iatt *preparent,</div><div class='add'>+                              struct iatt *postparent, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-        dht_do_readdir (frame, this, fd, size, yoff, GF_FOP_READDIRP);</div><div class='del'>-        return 0;</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    xlator_t *cached_subvol = NULL;</div><div class='add'>+    dht_conf_t *conf = NULL;</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+</div><div class='add'>+    if (!local || !local-&gt;cached_subvol) {</div><div class='add'>+        op_errno = EINVAL;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (op_ret == -1) {</div><div class='add'>+        local-&gt;op_errno = op_errno;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    conf = this-&gt;private;</div><div class='add'>+    if (!conf) {</div><div class='add'>+        local-&gt;op_errno = EINVAL;</div><div class='add'>+        op_errno = EINVAL;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    cached_subvol = local-&gt;cached_subvol;</div><div class='add'>+</div><div class='add'>+    if (local-&gt;params) {</div><div class='add'>+        dict_del(local-&gt;params, conf-&gt;link_xattr_name);</div><div class='add'>+        dict_del(local-&gt;params, GLUSTERFS_INTERNAL_FOP_KEY);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    STACK_WIND_COOKIE(frame, dht_newfile_cbk, (void *)cached_subvol,</div><div class='add'>+                      cached_subvol, cached_subvol-&gt;fops-&gt;mknod, &amp;local-&gt;loc,</div><div class='add'>+                      local-&gt;mode, local-&gt;rdev, local-&gt;umask, local-&gt;params);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+err:</div><div class='add'>+    if (local &amp;&amp; local-&gt;lock[0].layout.parent_layout.locks) {</div><div class='add'>+        local-&gt;refresh_layout_unlock(frame, this, -1, 1);</div><div class='add'>+    } else {</div><div class='add'>+        DHT_STACK_UNWIND(mknod, frame, -1, op_errno, NULL, NULL, NULL, NULL,</div><div class='add'>+                         NULL);</div><div class='add'>+    }</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+static int</div><div class='add'>+dht_mknod_wind_to_avail_subvol(call_frame_t *frame, xlator_t *this,</div><div class='add'>+                               xlator_t *subvol, loc_t *loc, dev_t rdev,</div><div class='add'>+                               mode_t mode, mode_t umask, dict_t *params)</div><div class='add'>+{</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    xlator_t *avail_subvol = NULL;</div><div class='ctx'> </div><div class='add'>+    local = frame-&gt;local;</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-dht_fsyncdir_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-		  int op_ret, int op_errno)</div><div class='add'>+    if (!dht_is_subvol_filled(this, subvol)) {</div><div class='add'>+        gf_msg_debug(this-&gt;name, 0, "creating %s on %s", loc-&gt;path,</div><div class='add'>+                     subvol-&gt;name);</div><div class='add'>+</div><div class='add'>+        STACK_WIND_COOKIE(frame, dht_newfile_cbk, (void *)subvol, subvol,</div><div class='add'>+                          subvol-&gt;fops-&gt;mknod, loc, mode, rdev, umask, params);</div><div class='add'>+    } else {</div><div class='add'>+        avail_subvol = dht_free_disk_available_subvol(this, subvol, local);</div><div class='add'>+</div><div class='add'>+        if (avail_subvol != subvol) {</div><div class='add'>+            local-&gt;params = dict_ref(params);</div><div class='add'>+            local-&gt;rdev = rdev;</div><div class='add'>+            local-&gt;mode = mode;</div><div class='add'>+            local-&gt;umask = umask;</div><div class='add'>+            local-&gt;cached_subvol = avail_subvol;</div><div class='add'>+            local-&gt;hashed_subvol = subvol;</div><div class='add'>+</div><div class='add'>+            gf_msg_debug(this-&gt;name, 0, "creating %s on %s (link at %s)",</div><div class='add'>+                         loc-&gt;path, avail_subvol-&gt;name, subvol-&gt;name);</div><div class='add'>+</div><div class='add'>+            dht_linkfile_create(frame, dht_mknod_linkfile_create_cbk, this,</div><div class='add'>+                                avail_subvol, subvol, loc);</div><div class='add'>+</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        gf_msg_debug(this-&gt;name, 0, "creating %s on %s", loc-&gt;path,</div><div class='add'>+                     subvol-&gt;name);</div><div class='add'>+</div><div class='add'>+        STACK_WIND_COOKIE(frame, dht_newfile_cbk, (void *)subvol, subvol,</div><div class='add'>+                          subvol-&gt;fops-&gt;mknod, loc, mode, rdev, umask, params);</div><div class='add'>+    }</div><div class='add'>+out:</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int32_t</div><div class='add'>+dht_mknod_do(call_frame_t *frame)</div><div class='ctx'> {</div><div class='del'>-	dht_local_t  *local = NULL;</div><div class='del'>-	int           this_call_cnt = 0;</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    dht_layout_t *refreshed = NULL;</div><div class='add'>+    xlator_t *subvol = NULL;</div><div class='add'>+    xlator_t *this = NULL;</div><div class='add'>+    dht_conf_t *conf = NULL;</div><div class='add'>+    dht_methods_t *methods = NULL;</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+</div><div class='add'>+    this = THIS;</div><div class='add'>+</div><div class='add'>+    conf = this-&gt;private;</div><div class='ctx'> </div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, conf, err);</div><div class='ctx'> </div><div class='del'>-	local = frame-&gt;local;</div><div class='add'>+    methods = &amp;(conf-&gt;methods);</div><div class='ctx'> </div><div class='del'>-	LOCK (&amp;frame-&gt;lock);</div><div class='del'>-	{</div><div class='del'>-		if (op_ret == -1)</div><div class='del'>-			local-&gt;op_errno = op_errno;</div><div class='add'>+    /* We don't need parent_loc anymore */</div><div class='add'>+    loc_wipe(&amp;local-&gt;loc);</div><div class='ctx'> </div><div class='del'>-		if (op_ret == 0)</div><div class='del'>-			local-&gt;op_ret = 0;</div><div class='del'>-	}</div><div class='del'>-	UNLOCK (&amp;frame-&gt;lock);</div><div class='add'>+    loc_copy(&amp;local-&gt;loc, &amp;local-&gt;loc2);</div><div class='ctx'> </div><div class='del'>-	this_call_cnt = dht_frame_return (frame);</div><div class='del'>-	if (is_last_call (this_call_cnt))</div><div class='del'>-		DHT_STACK_UNWIND (fsyncdir, frame, local-&gt;op_ret, local-&gt;op_errno);</div><div class='add'>+    loc_wipe(&amp;local-&gt;loc2);</div><div class='ctx'> </div><div class='add'>+    refreshed = local-&gt;selfheal.refreshed_layout;</div><div class='add'>+</div><div class='add'>+    subvol = methods-&gt;layout_search(this, refreshed, local-&gt;loc.name);</div><div class='add'>+</div><div class='add'>+    if (!subvol) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_ERROR, 0, DHT_MSG_HASHED_SUBVOL_GET_FAILED,</div><div class='add'>+               "no subvolume in "</div><div class='add'>+               "layout for path=%s",</div><div class='add'>+               local-&gt;loc.path);</div><div class='add'>+        local-&gt;op_errno = ENOENT;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    dht_mknod_wind_to_avail_subvol(frame, this, subvol, &amp;local-&gt;loc,</div><div class='add'>+                                   local-&gt;rdev, local-&gt;mode, local-&gt;umask,</div><div class='add'>+                                   local-&gt;params);</div><div class='add'>+    return 0;</div><div class='add'>+err:</div><div class='add'>+    local-&gt;refresh_layout_unlock(frame, this, -1, 1);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int32_t</div><div class='add'>+dht_mknod_unlock_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                     int32_t op_ret, int32_t op_errno, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    DHT_STACK_DESTROY(frame);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int32_t</div><div class='add'>+dht_mknod_finish(call_frame_t *frame, xlator_t *this, int op_ret,</div><div class='add'>+                 int invoke_cbk)</div><div class='add'>+{</div><div class='add'>+    dht_local_t *local = NULL, *lock_local = NULL;</div><div class='add'>+    call_frame_t *lock_frame = NULL;</div><div class='add'>+    int lock_count = 0;</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    lock_count = dht_lock_count(local-&gt;lock[0].layout.parent_layout.locks,</div><div class='add'>+                                local-&gt;lock[0].layout.parent_layout.lk_count);</div><div class='add'>+    if (lock_count == 0)</div><div class='add'>+        goto done;</div><div class='add'>+</div><div class='add'>+    lock_frame = copy_frame(frame);</div><div class='add'>+    if (lock_frame == NULL) {</div><div class='add'>+        goto done;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    lock_local = dht_local_init(lock_frame, &amp;local-&gt;loc, NULL,</div><div class='add'>+                                lock_frame-&gt;root-&gt;op);</div><div class='add'>+    if (lock_local == NULL) {</div><div class='add'>+        goto done;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    lock_local-&gt;lock[0]</div><div class='add'>+        .layout.parent_layout.locks = local-&gt;lock[0].layout.parent_layout.locks;</div><div class='add'>+    lock_local-&gt;lock[0].layout.parent_layout.lk_count =</div><div class='add'>+        local-&gt;lock[0].layout.parent_layout.lk_count;</div><div class='add'>+</div><div class='add'>+    local-&gt;lock[0].layout.parent_layout.locks = NULL;</div><div class='add'>+    local-&gt;lock[0].layout.parent_layout.lk_count = 0;</div><div class='add'>+</div><div class='add'>+    dht_unlock_inodelk(lock_frame,</div><div class='add'>+                       lock_local-&gt;lock[0].layout.parent_layout.locks,</div><div class='add'>+                       lock_local-&gt;lock[0].layout.parent_layout.lk_count,</div><div class='add'>+                       dht_mknod_unlock_cbk);</div><div class='add'>+    lock_frame = NULL;</div><div class='add'>+</div><div class='add'>+done:</div><div class='add'>+    if (lock_frame != NULL) {</div><div class='add'>+        DHT_STACK_DESTROY(lock_frame);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (op_ret == 0)</div><div class='ctx'>         return 0;</div><div class='add'>+</div><div class='add'>+    DHT_STACK_UNWIND(mknod, frame, op_ret, local-&gt;op_errno, NULL, NULL, NULL,</div><div class='add'>+                     NULL, NULL);</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+static int32_t</div><div class='add'>+dht_mknod_lock_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                   int32_t op_ret, int32_t op_errno, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-dht_fsyncdir (call_frame_t *frame, xlator_t *this, fd_t *fd, int datasync)</div><div class='add'>+    if (!local) {</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (op_ret &lt; 0) {</div><div class='add'>+        gf_msg("DHT", GF_LOG_ERROR, 0, DHT_MSG_INODE_LK_ERROR,</div><div class='add'>+               "mknod lock failed for file: %s", local-&gt;loc2.name);</div><div class='add'>+</div><div class='add'>+        local-&gt;op_errno = op_errno;</div><div class='add'>+</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    local-&gt;refresh_layout_unlock = dht_mknod_finish;</div><div class='add'>+</div><div class='add'>+    local-&gt;refresh_layout_done = dht_mknod_do;</div><div class='add'>+</div><div class='add'>+    dht_refresh_layout(frame);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+err:</div><div class='add'>+    if (local)</div><div class='add'>+        dht_mknod_finish(frame, this, -1, 0);</div><div class='add'>+    else</div><div class='add'>+        DHT_STACK_UNWIND(mknod, frame, -1, EINVAL, NULL, NULL, NULL, NULL,</div><div class='add'>+                         NULL);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int32_t</div><div class='add'>+dht_mknod_lock(call_frame_t *frame, xlator_t *subvol)</div><div class='ctx'> {</div><div class='del'>-	dht_local_t  *local  = NULL;</div><div class='del'>-	dht_conf_t   *conf = NULL;</div><div class='del'>-        int           op_errno = -1;</div><div class='del'>-	int           i = -1;</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    int count = 1, ret = -1;</div><div class='add'>+    dht_lock_t **lk_array = NULL;</div><div class='ctx'> </div><div class='add'>+    GF_VALIDATE_OR_GOTO("dht", frame, err);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(frame-&gt;this-&gt;name, frame-&gt;local, err);</div><div class='ctx'> </div><div class='del'>-        VALIDATE_OR_GOTO (frame, err);</div><div class='del'>-        VALIDATE_OR_GOTO (this, err);</div><div class='del'>-        VALIDATE_OR_GOTO (fd, err);</div><div class='add'>+    local = frame-&gt;local;</div><div class='ctx'> </div><div class='del'>-	conf = this-&gt;private;</div><div class='add'>+    lk_array = GF_CALLOC(count, sizeof(*lk_array), gf_common_mt_pointer);</div><div class='ctx'> </div><div class='del'>-	local = dht_local_init (frame);</div><div class='del'>-	if (!local) {</div><div class='del'>-		op_errno = ENOMEM;</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-			"Out of memory");</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='add'>+    if (lk_array == NULL)</div><div class='add'>+        goto err;</div><div class='ctx'> </div><div class='del'>-	local-&gt;fd = fd_ref (fd);</div><div class='del'>-	local-&gt;call_cnt = conf-&gt;subvolume_cnt;</div><div class='add'>+    lk_array[0] = dht_lock_new(frame-&gt;this, subvol, &amp;local-&gt;loc, F_RDLCK,</div><div class='add'>+                               DHT_LAYOUT_HEAL_DOMAIN, NULL,</div><div class='add'>+                               IGNORE_ENOENT_ESTALE);</div><div class='ctx'> </div><div class='del'>-	for (i = 0; i &lt; conf-&gt;subvolume_cnt; i++) {</div><div class='del'>-		STACK_WIND (frame, dht_fsyncdir_cbk,</div><div class='del'>-			    conf-&gt;subvolumes[i],</div><div class='del'>-			    conf-&gt;subvolumes[i]-&gt;fops-&gt;fsyncdir,</div><div class='del'>-			    fd, datasync);</div><div class='del'>-	}</div><div class='add'>+    if (lk_array[0] == NULL)</div><div class='add'>+        goto err;</div><div class='ctx'> </div><div class='del'>-	return 0;</div><div class='add'>+    local-&gt;lock[0].layout.parent_layout.locks = lk_array;</div><div class='add'>+    local-&gt;lock[0].layout.parent_layout.lk_count = count;</div><div class='ctx'> </div><div class='add'>+    ret = dht_blocking_inodelk(frame, lk_array, count, dht_mknod_lock_cbk);</div><div class='add'>+</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        local-&gt;lock[0].layout.parent_layout.locks = NULL;</div><div class='add'>+        local-&gt;lock[0].layout.parent_layout.lk_count = 0;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='ctx'> err:</div><div class='del'>-	op_errno = (op_errno == -1) ? errno : op_errno;</div><div class='del'>-	DHT_STACK_UNWIND (fsyncdir, frame, -1, op_errno);</div><div class='add'>+    if (lk_array != NULL) {</div><div class='add'>+        dht_lock_array_free(lk_array, count);</div><div class='add'>+        GF_FREE(lk_array);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	return 0;</div><div class='add'>+    return -1;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-dht_newfile_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-		 int op_ret, int op_errno,</div><div class='del'>-                 inode_t *inode, struct iatt *stbuf, struct iatt *preparent,</div><div class='del'>-                 struct iatt *postparent)</div><div class='add'>+static int</div><div class='add'>+dht_refresh_parent_layout_resume(call_frame_t *frame, xlator_t *this, int ret,</div><div class='add'>+                                 int invoke_cbk)</div><div class='ctx'> {</div><div class='del'>-	call_frame_t *prev = NULL;</div><div class='del'>-	int           ret = -1;</div><div class='del'>-        dht_local_t  *local = NULL;</div><div class='add'>+    dht_local_t *local = NULL, *parent_local = NULL;</div><div class='add'>+    call_stub_t *stub = NULL;</div><div class='add'>+    call_frame_t *parent_frame = NULL;</div><div class='ctx'> </div><div class='add'>+    local = frame-&gt;local;</div><div class='ctx'> </div><div class='del'>-	if (op_ret == -1)</div><div class='del'>-		goto out;</div><div class='add'>+    stub = local-&gt;stub;</div><div class='add'>+    local-&gt;stub = NULL;</div><div class='ctx'> </div><div class='del'>-        local = frame-&gt;local;</div><div class='del'>-        if (!local) {</div><div class='del'>-                op_ret = -1;</div><div class='del'>-                op_errno = EINVAL;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='add'>+    parent_frame = stub-&gt;frame;</div><div class='add'>+    parent_local = parent_frame-&gt;local;</div><div class='ctx'> </div><div class='del'>-	prev = cookie;</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        parent_local-&gt;op_ret = -1;</div><div class='add'>+        parent_local-&gt;op_errno = local-&gt;op_errno ? local-&gt;op_errno : EIO;</div><div class='add'>+    } else {</div><div class='add'>+        parent_local-&gt;op_ret = 0;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	dht_itransform (this, prev-&gt;this, stbuf-&gt;ia_ino, &amp;stbuf-&gt;ia_ino);</div><div class='del'>-        if (local-&gt;loc.parent) {</div><div class='del'>-                preparent-&gt;ia_ino = local-&gt;loc.parent-&gt;ino;</div><div class='del'>-                postparent-&gt;ia_ino = local-&gt;loc.parent-&gt;ino;</div><div class='del'>-</div><div class='del'>-                WIPE (preparent);</div><div class='del'>-                WIPE (postparent);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        ret = dht_layout_preset (this, prev-&gt;this, inode);</div><div class='del'>-	if (ret &lt; 0) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-			"could not set pre-set layout for subvolume %s",</div><div class='del'>-			prev-&gt;this-&gt;name);</div><div class='del'>-		op_ret   = -1;</div><div class='del'>-		op_errno = EINVAL;</div><div class='del'>-		goto out;</div><div class='del'>-	}</div><div class='del'>-out:</div><div class='del'>-        /* </div><div class='del'>-         * FIXME: ia_size and st_blocks of preparent and postparent do not have </div><div class='del'>-         * correct values. since, preparent and postparent buffers correspond</div><div class='del'>-         * to a directory these two members should have values equal to sum of</div><div class='del'>-         * corresponding values from each of the subvolume.</div><div class='del'>-         * See dht_iatt_merge for reference.</div><div class='del'>-         */ </div><div class='add'>+    call_resume(stub);</div><div class='add'>+</div><div class='add'>+    DHT_STACK_DESTROY(frame);</div><div class='ctx'> </div><div class='del'>-	DHT_STACK_UNWIND (mknod, frame, op_ret, op_errno, inode, stbuf, preparent,</div><div class='del'>-                          postparent);</div><div class='del'>-	return 0;</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-dht_mknod_linkfile_create_cbk (call_frame_t *frame, void *cookie,</div><div class='del'>-                               xlator_t *this,</div><div class='del'>-                               int32_t op_ret, int32_t op_errno,</div><div class='del'>-                               inode_t *inode, struct iatt *stbuf,</div><div class='del'>-                               struct iatt *preparent, struct iatt *postparent)</div><div class='add'>+static int</div><div class='add'>+dht_refresh_parent_layout_done(call_frame_t *frame)</div><div class='ctx'> {</div><div class='del'>-	dht_local_t  *local = NULL;</div><div class='del'>-	xlator_t     *cached_subvol = NULL;</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    int ret = 0;</div><div class='ctx'> </div><div class='del'>-        if (op_ret == -1)</div><div class='del'>-                goto err;</div><div class='add'>+    local = frame-&gt;local;</div><div class='ctx'> </div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-	cached_subvol = local-&gt;cached_subvol;</div><div class='add'>+    if (local-&gt;op_ret &lt; 0) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto resume;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        STACK_WIND (frame, dht_newfile_cbk,</div><div class='del'>-                    cached_subvol, cached_subvol-&gt;fops-&gt;mknod,</div><div class='del'>-                    &amp;local-&gt;loc, local-&gt;mode, local-&gt;rdev,</div><div class='del'>-                    local-&gt;params);</div><div class='add'>+    dht_layout_set(frame-&gt;this, local-&gt;loc.inode,</div><div class='add'>+                   local-&gt;selfheal.refreshed_layout);</div><div class='ctx'> </div><div class='del'>-        return 0;</div><div class='del'>- err:</div><div class='del'>- 	DHT_STACK_UNWIND (mknod, frame, -1, op_errno, NULL, NULL, NULL, NULL);	</div><div class='del'>- 	return 0;</div><div class='add'>+resume:</div><div class='add'>+    dht_refresh_parent_layout_resume(frame, frame-&gt;this, ret, 1);</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-dht_mknod (call_frame_t *frame, xlator_t *this,</div><div class='del'>-	   loc_t *loc, mode_t mode, dev_t rdev, dict_t *params)</div><div class='del'>-{</div><div class='del'>-	xlator_t    *subvol = NULL;</div><div class='del'>-	int          op_errno = -1;</div><div class='del'>-        int          ret = -1;</div><div class='del'>-        xlator_t    *avail_subvol = NULL;</div><div class='del'>-	dht_conf_t  *conf = NULL;</div><div class='del'>-	dht_local_t *local = NULL;</div><div class='del'>-</div><div class='del'>-	VALIDATE_OR_GOTO (frame, err);</div><div class='del'>-	VALIDATE_OR_GOTO (this, err);</div><div class='del'>-	VALIDATE_OR_GOTO (loc, err);</div><div class='del'>-</div><div class='del'>-	conf = this-&gt;private;</div><div class='del'>-</div><div class='del'>-        dht_get_du_info (frame, this, loc);</div><div class='del'>-</div><div class='del'>-	local = dht_local_init (frame);</div><div class='del'>-	if (!local) {</div><div class='del'>-		op_errno = ENOMEM;</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-			"Out of memory");</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	subvol = dht_subvol_get_hashed (this, loc);</div><div class='del'>-	if (!subvol) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-			"no subvolume in layout for path=%s",</div><div class='del'>-			loc-&gt;path);</div><div class='del'>-		op_errno = ENOENT;</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-        ret = loc_dup (loc, &amp;local-&gt;loc);</div><div class='del'>-        if (ret == -1) {</div><div class='del'>-                op_errno = ENOMEM;</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-                        "Out of memory");</div><div class='del'>-                goto err;</div><div class='del'>-        }</div><div class='add'>+static int</div><div class='add'>+dht_handle_parent_layout_change(xlator_t *this, call_stub_t *stub)</div><div class='add'>+{</div><div class='add'>+    call_frame_t *refresh_frame = NULL, *frame = NULL;</div><div class='add'>+    dht_local_t *refresh_local = NULL, *local = NULL;</div><div class='ctx'> </div><div class='del'>-        if (!dht_is_subvol_filled (this, subvol)) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_TRACE,</div><div class='del'>-                        "creating %s on %s", loc-&gt;path, subvol-&gt;name);</div><div class='del'>-                </div><div class='del'>-                STACK_WIND (frame, dht_newfile_cbk,</div><div class='del'>-                            subvol, subvol-&gt;fops-&gt;mknod,</div><div class='del'>-                            loc, mode, rdev, params);</div><div class='del'>-        } else {</div><div class='del'>-                avail_subvol = dht_free_disk_available_subvol (this, subvol);</div><div class='del'>-                if (avail_subvol != subvol) {</div><div class='del'>-                        /* Choose the minimum filled volume, and create the </div><div class='del'>-                           files there */</div><div class='del'>-</div><div class='del'>-                        local-&gt;params = dict_ref (params);</div><div class='del'>-                        local-&gt;cached_subvol = avail_subvol;</div><div class='del'>-                        local-&gt;mode = mode; </div><div class='del'>-                        local-&gt;rdev = rdev;</div><div class='del'>-                        </div><div class='del'>-                        dht_linkfile_create (frame, </div><div class='del'>-                                             dht_mknod_linkfile_create_cbk,</div><div class='del'>-                                             avail_subvol, subvol, loc);</div><div class='del'>-                } else {</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_TRACE,</div><div class='del'>-                                "creating %s on %s", loc-&gt;path, subvol-&gt;name);</div><div class='del'>-                        </div><div class='del'>-                        STACK_WIND (frame, dht_newfile_cbk,</div><div class='del'>-                                    subvol, subvol-&gt;fops-&gt;mknod,</div><div class='del'>-                                    loc, mode, rdev, params);</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='add'>+    frame = stub-&gt;frame;</div><div class='add'>+    local = frame-&gt;local;</div><div class='ctx'> </div><div class='del'>-	return 0;</div><div class='add'>+    refresh_frame = copy_frame(frame);</div><div class='add'>+    if (!refresh_frame) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_ERROR, ENOMEM, DHT_MSG_NO_MEMORY,</div><div class='add'>+               "mem allocation failed for refresh_frame");</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-err:</div><div class='del'>-	op_errno = (op_errno == -1) ? errno : op_errno;</div><div class='del'>-	DHT_STACK_UNWIND (mknod, frame, -1, op_errno,</div><div class='del'>-                          NULL, NULL, NULL, NULL);</div><div class='add'>+    refresh_local = dht_local_init(refresh_frame, NULL, NULL, stub-&gt;fop);</div><div class='add'>+    if (!refresh_local) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_ERROR, ENOMEM, DHT_MSG_NO_MEMORY,</div><div class='add'>+               "mem allocation failed for refresh_local");</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    refresh_local-&gt;loc.inode = inode_ref(local-&gt;loc.parent);</div><div class='add'>+    gf_uuid_copy(refresh_local-&gt;loc.gfid, local-&gt;loc.parent-&gt;gfid);</div><div class='ctx'> </div><div class='del'>-	return 0;</div><div class='add'>+    refresh_local-&gt;stub = stub;</div><div class='add'>+</div><div class='add'>+    refresh_local-&gt;refresh_layout_unlock = dht_refresh_parent_layout_resume;</div><div class='add'>+    refresh_local-&gt;refresh_layout_done = dht_refresh_parent_layout_done;</div><div class='add'>+</div><div class='add'>+    dht_refresh_layout(refresh_frame);</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+static int32_t</div><div class='add'>+dht_call_mkdir_stub(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                    int32_t op_ret, int32_t op_errno, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    call_stub_t *stub = NULL;</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-dht_symlink (call_frame_t *frame, xlator_t *this,</div><div class='del'>-	     const char *linkname, loc_t *loc, dict_t *params)</div><div class='del'>-{</div><div class='del'>-	xlator_t    *subvol = NULL;</div><div class='del'>-	int          op_errno = -1;</div><div class='del'>-        dht_local_t *local = NULL;</div><div class='del'>-        int          ret = -1;</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-	VALIDATE_OR_GOTO (frame, err);</div><div class='del'>-	VALIDATE_OR_GOTO (this, err);</div><div class='del'>-	VALIDATE_OR_GOTO (loc, err);</div><div class='del'>-</div><div class='del'>-	local = dht_local_init (frame);</div><div class='del'>-	if (!local) {</div><div class='del'>-		op_errno = ENOMEM;</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-			"Out of memory");</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	subvol = dht_subvol_get_hashed (this, loc);</div><div class='del'>-	if (!subvol) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-			"no subvolume in layout for path=%s",</div><div class='del'>-			loc-&gt;path);</div><div class='del'>-		op_errno = ENOENT;</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-        ret = loc_copy (&amp;local-&gt;loc, loc);</div><div class='del'>-        if (ret == -1) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_TRACE, "Failed to copy loc");</div><div class='del'>-                op_errno = ENOMEM;</div><div class='del'>-                goto err;</div><div class='del'>-        }</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    stub = local-&gt;stub;</div><div class='add'>+    local-&gt;stub = NULL;</div><div class='ctx'> </div><div class='del'>-	gf_log (this-&gt;name, GF_LOG_TRACE,</div><div class='del'>-		"creating %s on %s", loc-&gt;path, subvol-&gt;name);</div><div class='add'>+    if (op_ret &lt; 0) {</div><div class='add'>+        local-&gt;op_ret = -1;</div><div class='add'>+        local-&gt;op_errno = op_errno;</div><div class='add'>+    } else {</div><div class='add'>+        local-&gt;op_ret = 0;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	STACK_WIND (frame, dht_newfile_cbk,</div><div class='del'>-		    subvol, subvol-&gt;fops-&gt;symlink,</div><div class='del'>-		    linkname, loc, params);</div><div class='add'>+    call_resume(stub);</div><div class='ctx'> </div><div class='del'>-	return 0;</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='add'>+static int32_t</div><div class='add'>+dht_guard_parent_layout_and_namespace(xlator_t *subvol, call_stub_t *stub)</div><div class='add'>+{</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    loc_t *loc = NULL;</div><div class='add'>+    xlator_t *hashed_subvol = NULL, *this = NULL;</div><div class='add'>+    ;</div><div class='add'>+    call_frame_t *frame = NULL;</div><div class='add'>+    char pgfid[GF_UUID_BUF_SIZE] = {0};</div><div class='add'>+    int32_t *parent_disk_layout = NULL;</div><div class='add'>+    dht_layout_t *parent_layout = NULL;</div><div class='add'>+    dht_conf_t *conf = NULL;</div><div class='add'>+</div><div class='add'>+    GF_VALIDATE_OR_GOTO("dht", stub, err);</div><div class='add'>+</div><div class='add'>+    frame = stub-&gt;frame;</div><div class='add'>+    this = frame-&gt;this;</div><div class='add'>+</div><div class='add'>+    conf = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+</div><div class='add'>+    local-&gt;stub = stub;</div><div class='add'>+</div><div class='add'>+    /* TODO: recheck whether we should lock on src or dst if we do similar</div><div class='add'>+     * stale layout checks for rename.</div><div class='add'>+     */</div><div class='add'>+    loc = &amp;stub-&gt;args.loc;</div><div class='add'>+</div><div class='add'>+    gf_uuid_unparse(loc-&gt;parent-&gt;gfid, pgfid);</div><div class='add'>+</div><div class='add'>+    if (local-&gt;params == NULL) {</div><div class='add'>+        local-&gt;params = dict_new();</div><div class='add'>+        if (local-&gt;params == NULL) {</div><div class='add'>+            local-&gt;op_errno = ENOMEM;</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_WARNING, local-&gt;op_errno,</div><div class='add'>+                   DHT_MSG_PARENT_LAYOUT_CHANGED,</div><div class='add'>+                   "%s (%s/%s) (path: %s): "</div><div class='add'>+                   "dict allocation failed",</div><div class='add'>+                   gf_fop_list[stub-&gt;fop], pgfid, loc-&gt;name, loc-&gt;path);</div><div class='add'>+            goto err;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    hashed_subvol = dht_subvol_get_hashed(this, loc);</div><div class='add'>+    if (hashed_subvol == NULL) {</div><div class='add'>+        local-&gt;op_errno = EINVAL;</div><div class='add'>+</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_WARNING, local-&gt;op_errno,</div><div class='add'>+               DHT_MSG_PARENT_LAYOUT_CHANGED,</div><div class='add'>+               "%s (%s/%s) (path: %s): "</div><div class='add'>+               "hashed subvolume not found",</div><div class='add'>+               gf_fop_list[stub-&gt;fop], pgfid, loc-&gt;name, loc-&gt;path);</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    parent_layout = dht_layout_get(this, loc-&gt;parent);</div><div class='add'>+</div><div class='add'>+    ret = dht_disk_layout_extract_for_subvol(this, parent_layout, hashed_subvol,</div><div class='add'>+                                             &amp;parent_disk_layout);</div><div class='add'>+    if (ret == -1) {</div><div class='add'>+        local-&gt;op_errno = EINVAL;</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_WARNING, local-&gt;op_errno,</div><div class='add'>+               DHT_MSG_PARENT_LAYOUT_CHANGED,</div><div class='add'>+               "%s (%s/%s) (path: %s): "</div><div class='add'>+               "extracting in-memory layout of parent failed. ",</div><div class='add'>+               gf_fop_list[stub-&gt;fop], pgfid, loc-&gt;name, loc-&gt;path);</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    memcpy((void *)local-&gt;parent_disk_layout, (void *)parent_disk_layout,</div><div class='add'>+           sizeof(local-&gt;parent_disk_layout));</div><div class='add'>+</div><div class='add'>+    dht_layout_unref(this, parent_layout);</div><div class='add'>+    parent_layout = NULL;</div><div class='add'>+</div><div class='add'>+    ret = dict_set_str(local-&gt;params, GF_PREOP_PARENT_KEY, conf-&gt;xattr_name);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        local-&gt;op_errno = -ret;</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_WARNING, local-&gt;op_errno,</div><div class='add'>+               DHT_MSG_PARENT_LAYOUT_CHANGED,</div><div class='add'>+               "%s (%s/%s) (path: %s): "</div><div class='add'>+               "setting %s key in params dictionary failed. ",</div><div class='add'>+               gf_fop_list[stub-&gt;fop], pgfid, loc-&gt;name, loc-&gt;path,</div><div class='add'>+               GF_PREOP_PARENT_KEY);</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_set_bin(local-&gt;params, conf-&gt;xattr_name, parent_disk_layout,</div><div class='add'>+                       4 * 4);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        local-&gt;op_errno = -ret;</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_WARNING, local-&gt;op_errno,</div><div class='add'>+               DHT_MSG_PARENT_LAYOUT_CHANGED,</div><div class='add'>+               "%s (%s/%s) (path: %s): "</div><div class='add'>+               "setting parent-layout in params dictionary failed. ",</div><div class='add'>+               gf_fop_list[stub-&gt;fop], pgfid, loc-&gt;name, loc-&gt;path);</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    parent_disk_layout = NULL;</div><div class='add'>+    local-&gt;hashed_subvol = hashed_subvol;</div><div class='add'>+</div><div class='add'>+    local-&gt;current = &amp;local-&gt;lock[0];</div><div class='add'>+    ret = dht_protect_namespace(frame, loc, hashed_subvol, &amp;local-&gt;current-&gt;ns,</div><div class='add'>+                                dht_call_mkdir_stub);</div><div class='add'>+    if (ret &lt; 0)</div><div class='add'>+        goto err;</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='ctx'> err:</div><div class='del'>-	op_errno = (op_errno == -1) ? errno : op_errno;</div><div class='del'>-	DHT_STACK_UNWIND (link, frame, -1, op_errno,</div><div class='del'>-                          NULL, NULL, NULL, NULL);</div><div class='ctx'> </div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='add'>+    if (parent_disk_layout != NULL)</div><div class='add'>+        GF_FREE(parent_disk_layout);</div><div class='add'>+</div><div class='add'>+    if (parent_layout != NULL)</div><div class='add'>+        dht_layout_unref(this, parent_layout);</div><div class='ctx'> </div><div class='add'>+    return -1;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-dht_unlink (call_frame_t *frame, xlator_t *this, loc_t *loc)</div><div class='del'>-{</div><div class='del'>-	xlator_t    *cached_subvol = NULL;</div><div class='del'>-	xlator_t    *hashed_subvol = NULL;</div><div class='del'>-        int          ret = -1;</div><div class='del'>-	int          op_errno = -1;</div><div class='del'>-	dht_local_t *local = NULL;</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-	VALIDATE_OR_GOTO (frame, err);</div><div class='del'>-	VALIDATE_OR_GOTO (this, err);</div><div class='del'>-	VALIDATE_OR_GOTO (loc, err);</div><div class='del'>-</div><div class='del'>-        if (dht_filter_loc_subvol_key (this, loc, &amp;local-&gt;loc,</div><div class='del'>-                                       &amp;cached_subvol)) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_NORMAL,</div><div class='del'>-                        "unlinking %s on %s (given path %s)",</div><div class='del'>-                        local-&gt;loc.path, cached_subvol-&gt;name, loc-&gt;path);</div><div class='del'>-                STACK_WIND (frame, dht_unlink_cbk,</div><div class='del'>-                            cached_subvol, cached_subvol-&gt;fops-&gt;unlink,</div><div class='del'>-                            &amp;local-&gt;loc);</div><div class='add'>+dht_mknod(call_frame_t *frame, xlator_t *this, loc_t *loc, mode_t mode,</div><div class='add'>+          dev_t rdev, mode_t umask, dict_t *params)</div><div class='add'>+{</div><div class='add'>+    xlator_t *subvol = NULL;</div><div class='add'>+    int op_errno = -1;</div><div class='add'>+    int i = 0;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    dht_conf_t *conf = NULL;</div><div class='add'>+</div><div class='add'>+    VALIDATE_OR_GOTO(frame, err);</div><div class='add'>+    VALIDATE_OR_GOTO(this, err);</div><div class='add'>+    VALIDATE_OR_GOTO(loc, err);</div><div class='add'>+</div><div class='add'>+    conf = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    dht_get_du_info(frame, this, loc);</div><div class='add'>+</div><div class='add'>+    local = dht_local_init(frame, loc, NULL, GF_FOP_MKNOD);</div><div class='add'>+    if (!local) {</div><div class='add'>+        op_errno = ENOMEM;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    subvol = dht_subvol_get_hashed(this, loc);</div><div class='add'>+    if (!subvol) {</div><div class='add'>+        gf_msg_debug(this-&gt;name, 0, "no subvolume in layout for path=%s",</div><div class='add'>+                     loc-&gt;path);</div><div class='add'>+        op_errno = EIO;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Post remove-brick, the client layout may not be in sync with</div><div class='add'>+     * disk layout because of lack of lookup. Hence,a mknod call</div><div class='add'>+     * may fall on the decommissioned brick.  Hence, if the</div><div class='add'>+     * hashed_subvol is part of decommissioned bricks  list, do a</div><div class='add'>+     * lookup on parent dir. If a fix-layout is already done by the</div><div class='add'>+     * remove-brick process, the parent directory layout will be in</div><div class='add'>+     * sync with that of the disk. If fix-layout is still ending</div><div class='add'>+     * on the parent directory, we can let the file get created on</div><div class='add'>+     * the decommissioned brick which will be eventually migrated to</div><div class='add'>+     * non-decommissioned brick based on the new layout.</div><div class='add'>+     */</div><div class='add'>+</div><div class='add'>+    if (conf-&gt;decommission_subvols_cnt) {</div><div class='add'>+        for (i = 0; i &lt; conf-&gt;subvolume_cnt; i++) {</div><div class='add'>+            if (conf-&gt;decommissioned_bricks[i] &amp;&amp;</div><div class='add'>+                conf-&gt;decommissioned_bricks[i] == subvol) {</div><div class='add'>+                gf_msg_debug(this-&gt;name, 0,</div><div class='add'>+                             "hashed subvol:%s is "</div><div class='add'>+                             "part of decommission brick list for "</div><div class='add'>+                             "file: %s",</div><div class='add'>+                             subvol-&gt;name, loc-&gt;path);</div><div class='add'>+</div><div class='add'>+                /* dht_refresh_layout needs directory info in</div><div class='add'>+                 * local-&gt;loc. Hence, storing the parent_loc in</div><div class='add'>+                 * local-&gt;loc and storing the create context in</div><div class='add'>+                 * local-&gt;loc2. We will restore this information</div><div class='add'>+                 * in dht_creation do */</div><div class='add'>+</div><div class='add'>+                ret = loc_copy(&amp;local-&gt;loc2, &amp;local-&gt;loc);</div><div class='add'>+                if (ret) {</div><div class='add'>+                    gf_msg(this-&gt;name, GF_LOG_ERROR, ENOMEM, DHT_MSG_NO_MEMORY,</div><div class='add'>+                           "loc_copy failed %s", loc-&gt;path);</div><div class='add'>+</div><div class='add'>+                    goto err;</div><div class='add'>+                }</div><div class='add'>+</div><div class='add'>+                local-&gt;params = dict_ref(params);</div><div class='add'>+                local-&gt;rdev = rdev;</div><div class='add'>+                local-&gt;mode = mode;</div><div class='add'>+                local-&gt;umask = umask;</div><div class='add'>+</div><div class='add'>+                loc_wipe(&amp;local-&gt;loc);</div><div class='add'>+</div><div class='add'>+                ret = dht_build_parent_loc(this, &amp;local-&gt;loc, loc, &amp;op_errno);</div><div class='add'>+</div><div class='add'>+                if (ret) {</div><div class='add'>+                    gf_msg(this-&gt;name, GF_LOG_ERROR, ENOMEM, DHT_MSG_LOC_FAILED,</div><div class='add'>+                           "parent loc build failed");</div><div class='add'>+                    goto err;</div><div class='add'>+                }</div><div class='add'>+</div><div class='add'>+                ret = dht_mknod_lock(frame, subvol);</div><div class='add'>+</div><div class='add'>+                if (ret &lt; 0) {</div><div class='add'>+                    gf_msg(this-&gt;name, GF_LOG_ERROR, 0, DHT_MSG_INODE_LK_ERROR,</div><div class='add'>+                           "locking parent failed");</div><div class='add'>+                    goto err;</div><div class='add'>+                }</div><div class='add'>+</div><div class='ctx'>                 goto done;</div><div class='add'>+            }</div><div class='ctx'>         }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    dht_mknod_wind_to_avail_subvol(frame, this, subvol, loc, rdev, mode, umask,</div><div class='add'>+                                   params);</div><div class='ctx'> </div><div class='del'>-	cached_subvol = dht_subvol_get_cached (this, loc-&gt;inode);</div><div class='del'>-	if (!cached_subvol) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-			"no cached subvolume for path=%s", loc-&gt;path);</div><div class='del'>-		op_errno = EINVAL;</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	hashed_subvol = dht_subvol_get_hashed (this, loc);</div><div class='del'>-	if (!hashed_subvol) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-			"no subvolume in layout for path=%s",</div><div class='del'>-			loc-&gt;path);</div><div class='del'>-		op_errno = EINVAL;</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	local = dht_local_init (frame);</div><div class='del'>-	if (!local) {</div><div class='del'>-		op_errno = ENOMEM;</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-			"Out of memory");</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	ret = loc_copy (&amp;local-&gt;loc, loc);</div><div class='del'>-	if (ret == -1) {</div><div class='del'>-		op_errno = ENOMEM;</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-			"Out of memory");</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	if (hashed_subvol != cached_subvol) {</div><div class='del'>-		STACK_WIND (frame, dht_unlink_linkfile_cbk,</div><div class='del'>-			    hashed_subvol, hashed_subvol-&gt;fops-&gt;unlink, loc);</div><div class='del'>-        } else {</div><div class='del'>-                STACK_WIND (frame, dht_unlink_cbk,</div><div class='del'>-                            cached_subvol, cached_subvol-&gt;fops-&gt;unlink, loc);</div><div class='del'>-        }</div><div class='ctx'> done:</div><div class='del'>-	return 0;</div><div class='add'>+    return 0;</div><div class='add'>+</div><div class='ctx'> err:</div><div class='del'>-	op_errno = (op_errno == -1) ? errno : op_errno;</div><div class='del'>-	DHT_STACK_UNWIND (unlink, frame, -1, op_errno, NULL, NULL);</div><div class='add'>+    op_errno = (op_errno == -1) ? errno : op_errno;</div><div class='add'>+    DHT_STACK_UNWIND(mknod, frame, -1, op_errno, NULL, NULL, NULL, NULL, NULL);</div><div class='ctx'> </div><div class='del'>-	return 0;</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+int</div><div class='add'>+dht_symlink(call_frame_t *frame, xlator_t *this, const char *linkname,</div><div class='add'>+            loc_t *loc, mode_t umask, dict_t *params)</div><div class='add'>+{</div><div class='add'>+    xlator_t *subvol = NULL;</div><div class='add'>+    int op_errno = -1;</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+</div><div class='add'>+    VALIDATE_OR_GOTO(frame, err);</div><div class='add'>+    VALIDATE_OR_GOTO(this, err);</div><div class='add'>+    VALIDATE_OR_GOTO(loc, err);</div><div class='add'>+</div><div class='add'>+    local = dht_local_init(frame, loc, NULL, GF_FOP_SYMLINK);</div><div class='add'>+    if (!local) {</div><div class='add'>+        op_errno = ENOMEM;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    subvol = dht_subvol_get_hashed(this, loc);</div><div class='add'>+    if (!subvol) {</div><div class='add'>+        gf_msg_debug(this-&gt;name, 0, "no subvolume in layout for path=%s",</div><div class='add'>+                     loc-&gt;path);</div><div class='add'>+        op_errno = EIO;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    gf_msg_trace(this-&gt;name, 0, "creating %s on %s", loc-&gt;path, subvol-&gt;name);</div><div class='add'>+</div><div class='add'>+    STACK_WIND_COOKIE(frame, dht_newfile_cbk, (void *)subvol, subvol,</div><div class='add'>+                      subvol-&gt;fops-&gt;symlink, linkname, loc, umask, params);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+</div><div class='add'>+err:</div><div class='add'>+    op_errno = (op_errno == -1) ? errno : op_errno;</div><div class='add'>+    DHT_STACK_UNWIND(link, frame, -1, op_errno, NULL, NULL, NULL, NULL, NULL);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-dht_link_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-	      int op_ret, int op_errno,</div><div class='del'>-              inode_t *inode, struct iatt *stbuf, struct iatt *preparent,</div><div class='del'>-              struct iatt *postparent)</div><div class='add'>+dht_unlink(call_frame_t *frame, xlator_t *this, loc_t *loc, int xflag,</div><div class='add'>+           dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-        call_frame_t *prev = NULL;</div><div class='del'>-	dht_layout_t *layout = NULL;</div><div class='del'>-	dht_local_t  *local = NULL;</div><div class='add'>+    xlator_t *cached_subvol = NULL;</div><div class='add'>+    int op_errno = -1;</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+</div><div class='add'>+    VALIDATE_OR_GOTO(frame, err);</div><div class='add'>+    VALIDATE_OR_GOTO(this, err);</div><div class='add'>+    VALIDATE_OR_GOTO(loc, err);</div><div class='add'>+</div><div class='add'>+    local = dht_local_init(frame, loc, NULL, GF_FOP_UNLINK);</div><div class='add'>+    if (!local) {</div><div class='add'>+        op_errno = ENOMEM;</div><div class='add'>+</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    cached_subvol = local-&gt;cached_subvol;</div><div class='add'>+    if (!cached_subvol) {</div><div class='add'>+        gf_msg_debug(this-&gt;name, 0, "no cached subvolume for path=%s",</div><div class='add'>+                     loc-&gt;path);</div><div class='add'>+        op_errno = EINVAL;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    local-&gt;flags = xflag;</div><div class='add'>+    STACK_WIND_COOKIE(frame, dht_unlink_cbk, cached_subvol, cached_subvol,</div><div class='add'>+                      cached_subvol-&gt;fops-&gt;unlink, loc, xflag, xdata);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+err:</div><div class='add'>+    op_errno = (op_errno == -1) ? errno : op_errno;</div><div class='add'>+    DHT_STACK_UNWIND(unlink, frame, -1, op_errno, NULL, NULL, NULL);</div><div class='ctx'> </div><div class='del'>-        prev = cookie;</div><div class='del'>-	local = frame-&gt;local;</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        if (op_ret == -1)</div><div class='del'>-                goto out;</div><div class='add'>+static int</div><div class='add'>+dht_remove_stale_linkto_cbk(int ret, call_frame_t *sync_frame, void *data)</div><div class='add'>+{</div><div class='add'>+    DHT_STACK_DESTROY(sync_frame);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	layout = dht_layout_for_subvol (this, prev-&gt;this);</div><div class='del'>-	if (!layout) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-			"no pre-set layout for subvolume %s",</div><div class='del'>-			prev-&gt;this-&gt;name);</div><div class='del'>-		op_ret   = -1;</div><div class='del'>-		op_errno = EINVAL;</div><div class='del'>-		goto out;</div><div class='del'>-	}</div><div class='add'>+static int</div><div class='add'>+dht_remove_stale_linkto(void *data)</div><div class='add'>+{</div><div class='add'>+    call_frame_t *frame = NULL;</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    xlator_t *this = NULL;</div><div class='add'>+    dict_t *xdata_in = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    GF_VALIDATE_OR_GOTO("dht", data, out);</div><div class='add'>+</div><div class='add'>+    frame = data;</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    this = frame-&gt;this;</div><div class='add'>+    GF_VALIDATE_OR_GOTO("dht", this, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("dht", local, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("dht", local-&gt;link_subvol, out);</div><div class='add'>+</div><div class='add'>+    xdata_in = dict_new();</div><div class='add'>+    if (!xdata_in)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    ret = dht_fill_dict_to_avoid_unlink_of_migrating_file(xdata_in);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_WARNING, -ret, 0,</div><div class='add'>+               "Failed to set keys for stale linkto"</div><div class='add'>+               "deletion on path %s",</div><div class='add'>+               local-&gt;loc.path);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = syncop_unlink(local-&gt;link_subvol, &amp;local-&gt;loc, xdata_in, NULL);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_WARNING, -ret, 0,</div><div class='add'>+               "Removal of linkto failed"</div><div class='add'>+               " on path %s at subvol %s",</div><div class='add'>+               local-&gt;loc.path, local-&gt;link_subvol-&gt;name);</div><div class='add'>+    }</div><div class='add'>+out:</div><div class='add'>+    if (xdata_in)</div><div class='add'>+        dict_unref(xdata_in);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	stbuf-&gt;ia_ino = local-&gt;loc.inode-&gt;ino;</div><div class='add'>+static int</div><div class='add'>+dht_link_cbk(call_frame_t *frame, void *cookie, xlator_t *this, int op_ret,</div><div class='add'>+             int op_errno, inode_t *inode, struct iatt *stbuf,</div><div class='add'>+             struct iatt *preparent, struct iatt *postparent, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    gf_boolean_t stbuf_merged = _gf_false;</div><div class='add'>+    xlator_t *subvol = NULL;</div><div class='add'>+    call_frame_t *cleanup_frame = NULL;</div><div class='add'>+    dht_local_t *cleanup_local = NULL;</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+</div><div class='add'>+    if (op_ret == -1) {</div><div class='add'>+        /* Remove the linkto if exists */</div><div class='add'>+        if (local-&gt;linked) {</div><div class='add'>+            cleanup_frame = create_frame(this, this-&gt;ctx-&gt;pool);</div><div class='add'>+            if (cleanup_frame) {</div><div class='add'>+                cleanup_local = dht_local_init(cleanup_frame, &amp;local-&gt;loc2,</div><div class='add'>+                                               NULL, 0);</div><div class='add'>+                if (!cleanup_local || !local-&gt;link_subvol) {</div><div class='add'>+                    DHT_STACK_DESTROY(cleanup_frame);</div><div class='add'>+                    goto out;</div><div class='add'>+                }</div><div class='add'>+                cleanup_local-&gt;link_subvol = local-&gt;link_subvol;</div><div class='add'>+                FRAME_SU_DO(cleanup_frame, dht_local_t);</div><div class='add'>+                ret = synctask_new(this-&gt;ctx-&gt;env, dht_remove_stale_linkto,</div><div class='add'>+                                   dht_remove_stale_linkto_cbk, cleanup_frame,</div><div class='add'>+                                   cleanup_frame);</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+        /* No continuation on DHT inode missing errors, as we should</div><div class='add'>+         * then have a good stbuf that states P2 happened. We would</div><div class='add'>+         * get inode missing if, the file completed migrated between</div><div class='add'>+         * the lookup and the link call */</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Update parent on success, even if P1/2 checks are positive.</div><div class='add'>+     * The second call on success will further update the parent */</div><div class='add'>+    if (local-&gt;loc.parent) {</div><div class='add'>+        dht_inode_ctx_time_update(local-&gt;loc.parent, this, preparent, 0);</div><div class='add'>+        dht_inode_ctx_time_update(local-&gt;loc.parent, this, postparent, 1);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Update linkto attrs, if this is the first call and non-P2,</div><div class='add'>+     * if we detect P2 then we need to trust the attrs from the</div><div class='add'>+     * second call, not the first */</div><div class='add'>+    if (local-&gt;linked == _gf_true &amp;&amp;</div><div class='add'>+        ((local-&gt;call_cnt == 1 &amp;&amp; !IS_DHT_MIGRATION_PHASE2(stbuf)) ||</div><div class='add'>+         (local-&gt;call_cnt != 1 &amp;&amp; IS_DHT_MIGRATION_PHASE2(&amp;local-&gt;stbuf)))) {</div><div class='add'>+        dht_iatt_merge(this, &amp;local-&gt;stbuf, stbuf);</div><div class='add'>+        stbuf_merged = _gf_true;</div><div class='add'>+        dht_linkfile_attr_heal(frame, this);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* No further P1/2 checks if we are in the second iteration of</div><div class='add'>+     * the call */</div><div class='add'>+    if (local-&gt;call_cnt != 1) {</div><div class='add'>+        goto out;</div><div class='add'>+    } else {</div><div class='add'>+        /* Preserve the return values, in case the migration decides</div><div class='add'>+         * to recreate the link on the same subvol that the current</div><div class='add'>+         * hased for the link was created on. */</div><div class='add'>+        dht_iatt_merge(this, &amp;local-&gt;preparent, preparent);</div><div class='add'>+        dht_iatt_merge(this, &amp;local-&gt;postparent, postparent);</div><div class='add'>+        if (!stbuf_merged) {</div><div class='add'>+            dht_iatt_merge(this, &amp;local-&gt;stbuf, stbuf);</div><div class='add'>+            stbuf_merged = _gf_true;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-        preparent-&gt;ia_ino = local-&gt;loc2.parent-&gt;ino;</div><div class='del'>-        postparent-&gt;ia_ino = local-&gt;loc2.parent-&gt;ino;</div><div class='add'>+        local-&gt;inode = inode_ref(inode);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        WIPE (preparent);</div><div class='del'>-        WIPE (postparent);</div><div class='add'>+    local-&gt;op_ret = op_ret;</div><div class='add'>+    local-&gt;op_errno = op_errno;</div><div class='add'>+    local-&gt;rebalance.target_op_fn = dht_link2;</div><div class='add'>+    dht_set_local_rebalance(this, local, stbuf, preparent, postparent, xdata);</div><div class='ctx'> </div><div class='add'>+    /* Check if the rebalance phase2 is true */</div><div class='add'>+    if (IS_DHT_MIGRATION_PHASE2(stbuf)) {</div><div class='add'>+        ret = dht_inode_ctx_get_mig_info(this, local-&gt;loc.inode, NULL, &amp;subvol);</div><div class='add'>+        if (!subvol) {</div><div class='add'>+            /* Phase 2 of migration */</div><div class='add'>+            ret = dht_rebalance_complete_check(this, frame);</div><div class='add'>+            if (!ret)</div><div class='add'>+                return 0;</div><div class='add'>+        } else {</div><div class='add'>+            dht_link2(this, subvol, frame, 0);</div><div class='add'>+            return 0;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Check if the rebalance phase1 is true */</div><div class='add'>+    if (IS_DHT_MIGRATION_PHASE1(stbuf)) {</div><div class='add'>+        ret = dht_inode_ctx_get_mig_info(this, local-&gt;loc.inode, NULL, &amp;subvol);</div><div class='add'>+        if (subvol) {</div><div class='add'>+            dht_link2(this, subvol, frame, 0);</div><div class='add'>+            return 0;</div><div class='add'>+        }</div><div class='add'>+        ret = dht_rebalance_in_progress_check(this, frame);</div><div class='add'>+        if (!ret)</div><div class='add'>+            return 0;</div><div class='add'>+    }</div><div class='ctx'> out:</div><div class='del'>-        DHT_STACK_UNWIND (link, frame, op_ret, op_errno, inode, stbuf, preparent,</div><div class='del'>-                          postparent);</div><div class='add'>+    DHT_STRIP_PHASE1_FLAGS(stbuf);</div><div class='ctx'> </div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='add'>+    dht_set_fixed_dir_stat(preparent);</div><div class='add'>+    dht_set_fixed_dir_stat(postparent);</div><div class='add'>+    DHT_STACK_UNWIND(link, frame, op_ret, op_errno, inode, stbuf, preparent,</div><div class='add'>+                     postparent, NULL);</div><div class='ctx'> </div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-dht_link_linkfile_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-		       int op_ret, int op_errno,</div><div class='del'>-                       inode_t *inode, struct iatt *stbuf,</div><div class='del'>-                       struct iatt *preparent, struct iatt *postparent)</div><div class='add'>+static int</div><div class='add'>+dht_link2(xlator_t *this, xlator_t *subvol, call_frame_t *frame, int ret)</div><div class='ctx'> {</div><div class='del'>-	dht_local_t  *local = NULL;</div><div class='del'>-	xlator_t     *srcvol = NULL;</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    int op_errno = EINVAL;</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    if (!local)</div><div class='add'>+        goto err;</div><div class='ctx'> </div><div class='add'>+    op_errno = local-&gt;op_errno;</div><div class='ctx'> </div><div class='del'>-	if (op_ret == -1)</div><div class='del'>-		goto err;</div><div class='add'>+    if (we_are_not_migrating(ret)) {</div><div class='add'>+        /* This dht xlator is not migrating the file. Unwind and</div><div class='add'>+         * pass on the original mode bits so the higher DHT layer</div><div class='add'>+         * can handle this.</div><div class='add'>+         */</div><div class='add'>+        dht_set_fixed_dir_stat(&amp;local-&gt;preparent);</div><div class='add'>+        dht_set_fixed_dir_stat(&amp;local-&gt;postparent);</div><div class='ctx'> </div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-	srcvol = local-&gt;linkfile.srcvol;</div><div class='add'>+        DHT_STACK_UNWIND(link, frame, local-&gt;op_ret, op_errno, local-&gt;inode,</div><div class='add'>+                         &amp;local-&gt;stbuf, &amp;local-&gt;preparent, &amp;local-&gt;postparent,</div><div class='add'>+                         NULL);</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (subvol == NULL) {</div><div class='add'>+        op_errno = EINVAL;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Second call to create link file could result in EEXIST as the</div><div class='add'>+     * first call created the linkto in the currently</div><div class='add'>+     * migrating subvol, which could be the new hashed subvol */</div><div class='add'>+    if (local-&gt;link_subvol == subvol) {</div><div class='add'>+        DHT_STRIP_PHASE1_FLAGS(&amp;local-&gt;stbuf);</div><div class='add'>+        dht_set_fixed_dir_stat(&amp;local-&gt;preparent);</div><div class='add'>+        dht_set_fixed_dir_stat(&amp;local-&gt;postparent);</div><div class='add'>+        DHT_STACK_UNWIND(link, frame, 0, 0, local-&gt;inode, &amp;local-&gt;stbuf,</div><div class='add'>+                         &amp;local-&gt;preparent, &amp;local-&gt;postparent, NULL);</div><div class='ctx'> </div><div class='del'>-	STACK_WIND (frame, dht_link_cbk,</div><div class='del'>-		    srcvol, srcvol-&gt;fops-&gt;link,</div><div class='del'>-		    &amp;local-&gt;loc, &amp;local-&gt;loc2);</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	return 0;</div><div class='add'>+    local-&gt;call_cnt = 2;</div><div class='ctx'> </div><div class='add'>+    STACK_WIND(frame, dht_link_cbk, subvol, subvol-&gt;fops-&gt;link, &amp;local-&gt;loc,</div><div class='add'>+               &amp;local-&gt;loc2, local-&gt;xattr_req);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='ctx'> err:</div><div class='del'>-	DHT_STACK_UNWIND (link, frame, op_ret, op_errno, inode, stbuf, preparent,</div><div class='del'>-                          postparent);</div><div class='add'>+    DHT_STACK_UNWIND(link, frame, -1, op_errno, NULL, NULL, NULL, NULL, NULL);</div><div class='ctx'> </div><div class='del'>-	return 0;</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+static int</div><div class='add'>+dht_link_linkfile_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                      int op_ret, int op_errno, inode_t *inode,</div><div class='add'>+                      struct iatt *stbuf, struct iatt *preparent,</div><div class='add'>+                      struct iatt *postparent, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    xlator_t *srcvol = NULL;</div><div class='add'>+</div><div class='add'>+    if (op_ret == -1)</div><div class='add'>+        goto err;</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-dht_link (call_frame_t *frame, xlator_t *this,</div><div class='del'>-	  loc_t *oldloc, loc_t *newloc)</div><div class='del'>-{</div><div class='del'>-	xlator_t    *cached_subvol = NULL;</div><div class='del'>-	xlator_t    *hashed_subvol = NULL;</div><div class='del'>-	int          op_errno = -1;</div><div class='del'>-	int          ret = -1;</div><div class='del'>-	dht_local_t *local = NULL;</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-	VALIDATE_OR_GOTO (frame, err);</div><div class='del'>-	VALIDATE_OR_GOTO (this, err);</div><div class='del'>-	VALIDATE_OR_GOTO (oldloc, err);</div><div class='del'>-	VALIDATE_OR_GOTO (newloc, err);</div><div class='del'>-</div><div class='del'>-	cached_subvol = dht_subvol_get_cached (this, oldloc-&gt;inode);</div><div class='del'>-	if (!cached_subvol) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-			"no cached subvolume for path=%s", oldloc-&gt;path);</div><div class='del'>-		op_errno = EINVAL;</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	hashed_subvol = dht_subvol_get_hashed (this, newloc);</div><div class='del'>-	if (!hashed_subvol) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-			"no subvolume in layout for path=%s",</div><div class='del'>-			newloc-&gt;path);</div><div class='del'>-		op_errno = EINVAL;</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	local = dht_local_init (frame);</div><div class='del'>-	if (!local) {</div><div class='del'>-		op_errno = ENOMEM;</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-			"Out of memory");</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	ret = loc_copy (&amp;local-&gt;loc, oldloc);</div><div class='del'>-	if (ret == -1) {</div><div class='del'>-		op_errno = ENOMEM;</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-			"Out of memory");</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	ret = loc_copy (&amp;local-&gt;loc2, newloc);</div><div class='del'>-	if (ret == -1) {</div><div class='del'>-		op_errno = ENOMEM;</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-			"Out of memory");</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	if (hashed_subvol != cached_subvol) {</div><div class='del'>-		dht_linkfile_create (frame, dht_link_linkfile_cbk,</div><div class='del'>-				     cached_subvol, hashed_subvol, newloc);</div><div class='del'>-	} else {</div><div class='del'>-		STACK_WIND (frame, dht_link_cbk,</div><div class='del'>-			    cached_subvol, cached_subvol-&gt;fops-&gt;link,</div><div class='del'>-			    oldloc, newloc);</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    srcvol = local-&gt;linkfile.srcvol;</div><div class='add'>+</div><div class='add'>+    STACK_WIND(frame, dht_link_cbk, srcvol, srcvol-&gt;fops-&gt;link, &amp;local-&gt;loc,</div><div class='add'>+               &amp;local-&gt;loc2, local-&gt;xattr_req);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='ctx'> </div><div class='ctx'> err:</div><div class='del'>-	op_errno = (op_errno == -1) ? errno : op_errno;</div><div class='del'>-	DHT_STACK_UNWIND (link, frame, -1, op_errno, NULL, NULL, NULL, NULL);</div><div class='add'>+    DHT_STRIP_PHASE1_FLAGS(stbuf);</div><div class='add'>+    dht_set_fixed_dir_stat(preparent);</div><div class='add'>+    dht_set_fixed_dir_stat(postparent);</div><div class='add'>+    DHT_STACK_UNWIND(link, frame, op_ret, op_errno, inode, stbuf, preparent,</div><div class='add'>+                     postparent, xdata);</div><div class='ctx'> </div><div class='del'>-	return 0;</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+int</div><div class='add'>+dht_link(call_frame_t *frame, xlator_t *this, loc_t *oldloc, loc_t *newloc,</div><div class='add'>+         dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    xlator_t *cached_subvol = NULL;</div><div class='add'>+    xlator_t *hashed_subvol = NULL;</div><div class='add'>+    int op_errno = -1;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+</div><div class='add'>+    VALIDATE_OR_GOTO(frame, err);</div><div class='add'>+    VALIDATE_OR_GOTO(this, err);</div><div class='add'>+    VALIDATE_OR_GOTO(oldloc, err);</div><div class='add'>+    VALIDATE_OR_GOTO(newloc, err);</div><div class='add'>+</div><div class='add'>+    local = dht_local_init(frame, oldloc, NULL, GF_FOP_LINK);</div><div class='add'>+    if (!local) {</div><div class='add'>+        op_errno = ENOMEM;</div><div class='add'>+</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+    local-&gt;call_cnt = 1;</div><div class='add'>+</div><div class='add'>+    cached_subvol = local-&gt;cached_subvol;</div><div class='add'>+    if (!cached_subvol) {</div><div class='add'>+        gf_msg_debug(this-&gt;name, 0, "no cached subvolume for path=%s",</div><div class='add'>+                     oldloc-&gt;path);</div><div class='add'>+        op_errno = ENOENT;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    hashed_subvol = dht_subvol_get_hashed(this, newloc);</div><div class='add'>+    if (!hashed_subvol) {</div><div class='add'>+        gf_msg_debug(this-&gt;name, 0, "no subvolume in layout for path=%s",</div><div class='add'>+                     newloc-&gt;path);</div><div class='add'>+        op_errno = EIO;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = loc_copy(&amp;local-&gt;loc2, newloc);</div><div class='add'>+    if (ret == -1) {</div><div class='add'>+        op_errno = ENOMEM;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+    if (xdata)</div><div class='add'>+        local-&gt;xattr_req = dict_ref(xdata);</div><div class='add'>+</div><div class='add'>+    if (hashed_subvol != cached_subvol) {</div><div class='add'>+        gf_uuid_copy(local-&gt;gfid, oldloc-&gt;inode-&gt;gfid);</div><div class='add'>+        dht_linkfile_create(frame, dht_link_linkfile_cbk, this, cached_subvol,</div><div class='add'>+                            hashed_subvol, newloc);</div><div class='add'>+    } else {</div><div class='add'>+        STACK_WIND(frame, dht_link_cbk, cached_subvol,</div><div class='add'>+                   cached_subvol-&gt;fops-&gt;link, oldloc, newloc, xdata);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+</div><div class='add'>+err:</div><div class='add'>+    op_errno = (op_errno == -1) ? errno : op_errno;</div><div class='add'>+    DHT_STACK_UNWIND(link, frame, -1, op_errno, NULL, NULL, NULL, NULL, NULL);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-dht_create_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-		 int op_ret, int op_errno,</div><div class='del'>-		 fd_t *fd, inode_t *inode, struct iatt *stbuf,</div><div class='del'>-                 struct iatt *preparent, struct iatt *postparent)</div><div class='add'>+dht_create_cbk(call_frame_t *frame, void *cookie, xlator_t *this, int op_ret,</div><div class='add'>+               int op_errno, fd_t *fd, inode_t *inode, struct iatt *stbuf,</div><div class='add'>+               struct iatt *preparent, struct iatt *postparent, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-	call_frame_t *prev = NULL;</div><div class='del'>-	int           ret = -1;</div><div class='del'>-        dht_local_t  *local = NULL;</div><div class='add'>+    xlator_t *prev = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    gf_boolean_t parent_layout_changed = _gf_false;</div><div class='add'>+    char pgfid[GF_UUID_BUF_SIZE] = {0};</div><div class='add'>+    xlator_t *subvol = NULL;</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    if (!local) {</div><div class='add'>+        op_ret = -1;</div><div class='add'>+        op_errno = EINVAL;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (op_ret == -1) {</div><div class='add'>+        local-&gt;op_errno = op_errno;</div><div class='add'>+        parent_layout_changed = (xdata &amp;&amp;</div><div class='add'>+                                 dict_get(xdata, GF_PREOP_CHECK_FAILED))</div><div class='add'>+                                    ? _gf_true</div><div class='add'>+                                    : _gf_false;</div><div class='add'>+</div><div class='add'>+        if (parent_layout_changed) {</div><div class='add'>+            if (local &amp;&amp; local-&gt;lock[0].layout.parent_layout.locks) {</div><div class='add'>+                /* Returning failure as the layout could not be fixed even under</div><div class='add'>+                 * the lock */</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='ctx'> </div><div class='del'>-	if (op_ret == -1)</div><div class='del'>-		goto out;</div><div class='add'>+            gf_uuid_unparse(local-&gt;loc.parent-&gt;gfid, pgfid);</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_INFO, 0, DHT_MSG_PARENT_LAYOUT_CHANGED,</div><div class='add'>+                   "create (%s/%s) (path: %s): parent layout "</div><div class='add'>+                   "changed. Attempting a layout refresh and then a "</div><div class='add'>+                   "retry",</div><div class='add'>+                   pgfid, local-&gt;loc.name, local-&gt;loc.path);</div><div class='add'>+</div><div class='add'>+            /*</div><div class='add'>+              dht_refresh_layout needs directory info in local-&gt;loc.Hence,</div><div class='add'>+              storing the parent_loc in local-&gt;loc and storing the create</div><div class='add'>+              context in local-&gt;loc2. We will restore this information in</div><div class='add'>+              dht_creation_do.</div><div class='add'>+             */</div><div class='add'>+</div><div class='add'>+            loc_wipe(&amp;local-&gt;loc2);</div><div class='add'>+</div><div class='add'>+            ret = loc_copy(&amp;local-&gt;loc2, &amp;local-&gt;loc);</div><div class='add'>+            if (ret) {</div><div class='add'>+                gf_msg(this-&gt;name, GF_LOG_ERROR, ENOMEM, DHT_MSG_NO_MEMORY,</div><div class='add'>+                       "loc_copy failed %s", local-&gt;loc.path);</div><div class='ctx'> </div><div class='del'>-        local = frame-&gt;local;</div><div class='del'>-        if (!local) {</div><div class='del'>-                op_ret = -1;</div><div class='del'>-                op_errno = EINVAL;</div><div class='ctx'>                 goto out;</div><div class='del'>-        }</div><div class='add'>+            }</div><div class='ctx'> </div><div class='del'>-	prev = cookie;</div><div class='add'>+            loc_wipe(&amp;local-&gt;loc);</div><div class='ctx'> </div><div class='del'>-	dht_itransform (this, prev-&gt;this, stbuf-&gt;ia_ino, &amp;stbuf-&gt;ia_ino);</div><div class='del'>-        if (local-&gt;loc.parent) {</div><div class='del'>-                preparent-&gt;ia_ino = local-&gt;loc.parent-&gt;ino;</div><div class='del'>-                postparent-&gt;ia_ino = local-&gt;loc.parent-&gt;ino;</div><div class='add'>+            ret = dht_build_parent_loc(this, &amp;local-&gt;loc, &amp;local-&gt;loc2,</div><div class='add'>+                                       &amp;op_errno);</div><div class='add'>+</div><div class='add'>+            if (ret) {</div><div class='add'>+                gf_msg(this-&gt;name, GF_LOG_ERROR, ENOMEM, DHT_MSG_LOC_FAILED,</div><div class='add'>+                       "parent loc build failed");</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            subvol = dht_subvol_get_hashed(this, &amp;local-&gt;loc2);</div><div class='add'>+</div><div class='add'>+            ret = dht_create_lock(frame, subvol);</div><div class='add'>+            if (ret &lt; 0) {</div><div class='add'>+                gf_msg(this-&gt;name, GF_LOG_ERROR, 0, DHT_MSG_INODE_LK_ERROR,</div><div class='add'>+                       "locking parent failed");</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='ctx'> </div><div class='del'>-                WIPE (preparent);</div><div class='del'>-                WIPE (postparent);</div><div class='add'>+            return 0;</div><div class='ctx'>         }</div><div class='ctx'> </div><div class='del'>-        ret = dht_layout_preset (this, prev-&gt;this, inode);</div><div class='del'>-	if (ret != 0) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-			"could not set preset layout for subvol %s",</div><div class='del'>-                        prev-&gt;this-&gt;name);</div><div class='del'>-		op_ret   = -1;</div><div class='del'>-		op_errno = EINVAL;</div><div class='del'>-		goto out;</div><div class='del'>-	}</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='add'>+    prev = cookie;</div><div class='add'>+</div><div class='add'>+    if (local-&gt;loc.parent) {</div><div class='add'>+        dht_inode_ctx_time_update(local-&gt;loc.parent, this, preparent, 0);</div><div class='add'>+</div><div class='add'>+        dht_inode_ctx_time_update(local-&gt;loc.parent, this, postparent, 1);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dht_fd_ctx_set(this, fd, prev);</div><div class='add'>+    if (ret != 0) {</div><div class='add'>+        gf_msg_debug(this-&gt;name, 0,</div><div class='add'>+                     "Possible fd leak. "</div><div class='add'>+                     "Could not set fd ctx for subvol %s",</div><div class='add'>+                     prev-&gt;name);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dht_layout_preset(this, prev, inode);</div><div class='add'>+    if (ret != 0) {</div><div class='add'>+        gf_msg_debug(this-&gt;name, 0, "could not set preset layout for subvol %s",</div><div class='add'>+                     prev-&gt;name);</div><div class='add'>+        op_ret = -1;</div><div class='add'>+        op_errno = EINVAL;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    local-&gt;op_errno = op_errno;</div><div class='add'>+</div><div class='add'>+    if (local-&gt;linked == _gf_true) {</div><div class='add'>+        local-&gt;stbuf = *stbuf;</div><div class='add'>+        dht_linkfile_attr_heal(frame, this);</div><div class='add'>+    }</div><div class='ctx'> out:</div><div class='del'>-	DHT_STACK_UNWIND (create, frame, op_ret, op_errno, fd, inode, stbuf, preparent,</div><div class='del'>-                          postparent);</div><div class='del'>-	return 0;</div><div class='add'>+</div><div class='add'>+    DHT_STRIP_PHASE1_FLAGS(stbuf);</div><div class='add'>+    dht_set_fixed_dir_stat(preparent);</div><div class='add'>+    dht_set_fixed_dir_stat(postparent);</div><div class='add'>+</div><div class='add'>+    if (local &amp;&amp; local-&gt;lock[0].layout.parent_layout.locks) {</div><div class='add'>+        /* store op_errno for failure case*/</div><div class='add'>+        local-&gt;op_errno = op_errno;</div><div class='add'>+        local-&gt;refresh_layout_unlock(frame, this, op_ret, 1);</div><div class='add'>+</div><div class='add'>+        if (op_ret == 0) {</div><div class='add'>+            DHT_STACK_UNWIND(create, frame, op_ret, op_errno, fd, inode, stbuf,</div><div class='add'>+                             preparent, postparent, xdata);</div><div class='add'>+        }</div><div class='add'>+    } else {</div><div class='add'>+        DHT_STACK_UNWIND(create, frame, op_ret, op_errno, fd, inode, stbuf,</div><div class='add'>+                         preparent, postparent, xdata);</div><div class='add'>+    }</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+static int</div><div class='add'>+dht_create_linkfile_create_cbk(call_frame_t *frame, void *cookie,</div><div class='add'>+                               xlator_t *this, int32_t op_ret, int32_t op_errno,</div><div class='add'>+                               inode_t *inode, struct iatt *stbuf,</div><div class='add'>+                               struct iatt *preparent, struct iatt *postparent,</div><div class='add'>+                               dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    xlator_t *cached_subvol = NULL;</div><div class='add'>+    dht_conf_t *conf = NULL;</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    if (!local) {</div><div class='add'>+        op_errno = EINVAL;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (op_ret == -1) {</div><div class='add'>+        local-&gt;op_errno = op_errno;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    conf = this-&gt;private;</div><div class='add'>+    if (!conf) {</div><div class='add'>+        local-&gt;op_errno = EINVAL;</div><div class='add'>+        op_errno = EINVAL;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    cached_subvol = local-&gt;cached_subvol;</div><div class='add'>+</div><div class='add'>+    if (local-&gt;params) {</div><div class='add'>+        dict_del(local-&gt;params, conf-&gt;link_xattr_name);</div><div class='add'>+        dict_del(local-&gt;params, GLUSTERFS_INTERNAL_FOP_KEY);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    STACK_WIND_COOKIE(frame, dht_create_cbk, cached_subvol, cached_subvol,</div><div class='add'>+                      cached_subvol-&gt;fops-&gt;create, &amp;local-&gt;loc, local-&gt;flags,</div><div class='add'>+                      local-&gt;mode, local-&gt;umask, local-&gt;fd, local-&gt;params);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+err:</div><div class='add'>+    if (local &amp;&amp; local-&gt;lock[0].layout.parent_layout.locks) {</div><div class='add'>+        local-&gt;refresh_layout_unlock(frame, this, -1, 1);</div><div class='add'>+    } else {</div><div class='add'>+        DHT_STACK_UNWIND(create, frame, -1, op_errno, NULL, NULL, NULL, NULL,</div><div class='add'>+                         NULL, NULL);</div><div class='add'>+    }</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-dht_create_linkfile_create_cbk (call_frame_t *frame, void *cookie,</div><div class='del'>-				xlator_t *this,</div><div class='del'>-				int32_t op_ret, int32_t op_errno,</div><div class='del'>-                                inode_t *inode, struct iatt *stbuf,</div><div class='del'>-                                struct iatt *preparent, struct iatt *postparent)</div><div class='add'>+static int</div><div class='add'>+dht_create_wind_to_avail_subvol(call_frame_t *frame, xlator_t *this,</div><div class='add'>+                                xlator_t *subvol, loc_t *loc, int32_t flags,</div><div class='add'>+                                mode_t mode, mode_t umask, fd_t *fd,</div><div class='add'>+                                dict_t *params)</div><div class='ctx'> {</div><div class='del'>-	dht_local_t  *local = NULL;</div><div class='del'>-	xlator_t     *cached_subvol = NULL;</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    xlator_t *avail_subvol = NULL;</div><div class='ctx'> </div><div class='del'>-        if (op_ret == -1)</div><div class='del'>-                goto err;</div><div class='add'>+    local = frame-&gt;local;</div><div class='ctx'> </div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-	cached_subvol = local-&gt;cached_subvol;</div><div class='add'>+    if (!dht_is_subvol_filled(this, subvol)) {</div><div class='add'>+        gf_msg_debug(this-&gt;name, 0, "creating %s on %s", loc-&gt;path,</div><div class='add'>+                     subvol-&gt;name);</div><div class='ctx'> </div><div class='del'>-        STACK_WIND (frame, dht_create_cbk,</div><div class='del'>-                    cached_subvol, cached_subvol-&gt;fops-&gt;create,</div><div class='del'>-                    &amp;local-&gt;loc, local-&gt;flags, local-&gt;mode,</div><div class='del'>-                    local-&gt;fd, local-&gt;params);</div><div class='add'>+        dht_set_parent_layout_in_dict(loc, this, local);</div><div class='ctx'> </div><div class='del'>-        return 0;</div><div class='del'>- err:</div><div class='del'>- 	DHT_STACK_UNWIND (create, frame, -1, op_errno, NULL, NULL, NULL, NULL, NULL);</div><div class='del'>- 	return 0;</div><div class='add'>+        STACK_WIND_COOKIE(frame, dht_create_cbk, subvol, subvol,</div><div class='add'>+                          subvol-&gt;fops-&gt;create, loc, flags, mode, umask, fd,</div><div class='add'>+                          params);</div><div class='add'>+</div><div class='add'>+    } else {</div><div class='add'>+        avail_subvol = dht_free_disk_available_subvol(this, subvol, local);</div><div class='add'>+</div><div class='add'>+        if (avail_subvol != subvol) {</div><div class='add'>+            local-&gt;cached_subvol = avail_subvol;</div><div class='add'>+            local-&gt;hashed_subvol = subvol;</div><div class='add'>+</div><div class='add'>+            gf_msg_debug(this-&gt;name, 0, "creating %s on %s (link at %s)",</div><div class='add'>+                         loc-&gt;path, avail_subvol-&gt;name, subvol-&gt;name);</div><div class='add'>+</div><div class='add'>+            dht_linkfile_create(frame, dht_create_linkfile_create_cbk, this,</div><div class='add'>+                                avail_subvol, subvol, loc);</div><div class='add'>+</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        gf_msg_debug(this-&gt;name, 0, "creating %s on %s", loc-&gt;path,</div><div class='add'>+                     subvol-&gt;name);</div><div class='add'>+</div><div class='add'>+        dht_set_parent_layout_in_dict(loc, this, local);</div><div class='add'>+</div><div class='add'>+        STACK_WIND_COOKIE(frame, dht_create_cbk, subvol, subvol,</div><div class='add'>+                          subvol-&gt;fops-&gt;create, loc, flags, mode, umask, fd,</div><div class='add'>+                          params);</div><div class='add'>+    }</div><div class='add'>+out:</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-dht_create (call_frame_t *frame, xlator_t *this,</div><div class='del'>-	    loc_t *loc, int32_t flags, mode_t mode,</div><div class='del'>-            fd_t *fd, dict_t *params)</div><div class='del'>-{</div><div class='del'>-	int          op_errno = -1;</div><div class='del'>-        int          ret = -1;</div><div class='del'>-	xlator_t    *subvol = NULL;</div><div class='del'>-	dht_conf_t  *conf = NULL;</div><div class='del'>-        dht_local_t *local = NULL;</div><div class='del'>-        xlator_t    *avail_subvol = NULL;</div><div class='del'>-</div><div class='del'>-	VALIDATE_OR_GOTO (frame, err);</div><div class='del'>-	VALIDATE_OR_GOTO (this, err);</div><div class='del'>-	VALIDATE_OR_GOTO (loc, err);</div><div class='del'>-</div><div class='del'>-	conf = this-&gt;private;</div><div class='del'>-</div><div class='del'>-        dht_get_du_info (frame, this, loc);</div><div class='del'>-</div><div class='del'>-	local = dht_local_init (frame);</div><div class='del'>-	if (!local) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-			"Out of memory");</div><div class='del'>-		op_errno = ENOMEM;</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-        if (dht_filter_loc_subvol_key (this, loc, &amp;local-&gt;loc,</div><div class='del'>-                                       &amp;subvol)) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_NORMAL,</div><div class='del'>-                        "creating %s on %s (got create on %s)",</div><div class='del'>-                        local-&gt;loc.path, subvol-&gt;name, loc-&gt;path);</div><div class='del'>-                STACK_WIND (frame, dht_create_cbk,</div><div class='del'>-                            subvol, subvol-&gt;fops-&gt;create,</div><div class='del'>-                            &amp;local-&gt;loc, flags, mode, fd, params);</div><div class='del'>-                goto done;</div><div class='add'>+dht_build_parent_loc(xlator_t *this, loc_t *parent, loc_t *child,</div><div class='add'>+                     int32_t *op_errno)</div><div class='add'>+{</div><div class='add'>+    inode_table_t *table = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    if (!parent || !child) {</div><div class='add'>+        if (op_errno)</div><div class='add'>+            *op_errno = EINVAL;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (child-&gt;parent) {</div><div class='add'>+        parent-&gt;inode = inode_ref(child-&gt;parent);</div><div class='add'>+        if (!parent-&gt;inode) {</div><div class='add'>+            if (op_errno)</div><div class='add'>+                *op_errno = EINVAL;</div><div class='add'>+            goto out;</div><div class='ctx'>         }</div><div class='ctx'> </div><div class='del'>-        ret = loc_dup (loc, &amp;local-&gt;loc);</div><div class='del'>-        if (ret == -1) {</div><div class='del'>-                op_errno = ENOMEM;</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-                        "Out of memory");</div><div class='del'>-                goto err;</div><div class='del'>-        }</div><div class='del'>-        subvol = dht_subvol_get_hashed (this, loc);</div><div class='del'>-        if (!subvol) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-                        "no subvolume in layout for path=%s",</div><div class='del'>-                        loc-&gt;path);</div><div class='del'>-                op_errno = ENOENT;</div><div class='del'>-                goto err;</div><div class='add'>+        gf_uuid_copy(parent-&gt;gfid, child-&gt;pargfid);</div><div class='add'>+</div><div class='add'>+        ret = 0;</div><div class='add'>+</div><div class='add'>+        goto out;</div><div class='add'>+    } else {</div><div class='add'>+        if (gf_uuid_is_null(child-&gt;pargfid)) {</div><div class='add'>+            if (op_errno)</div><div class='add'>+                *op_errno = EINVAL;</div><div class='add'>+            goto out;</div><div class='ctx'>         }</div><div class='ctx'> </div><div class='del'>-        if (!dht_is_subvol_filled (this, subvol)) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_TRACE,</div><div class='del'>-                        "creating %s on %s", loc-&gt;path, subvol-&gt;name);</div><div class='del'>-                STACK_WIND (frame, dht_create_cbk,</div><div class='del'>-                            subvol, subvol-&gt;fops-&gt;create,</div><div class='del'>-                            loc, flags, mode, fd, params);</div><div class='del'>-                goto done;</div><div class='add'>+        table = this-&gt;itable;</div><div class='add'>+</div><div class='add'>+        if (!table) {</div><div class='add'>+            if (op_errno) {</div><div class='add'>+                *op_errno = EINVAL;</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='ctx'>         }</div><div class='del'>-        /* Choose the minimum filled volume, and create the </div><div class='del'>-           files there */</div><div class='del'>-        /* TODO */</div><div class='del'>-        avail_subvol = dht_free_disk_available_subvol (this, subvol);</div><div class='del'>-        if (avail_subvol != subvol) {</div><div class='del'>-                local-&gt;fd = fd_ref (fd);</div><div class='del'>-                local-&gt;params = dict_ref (params);</div><div class='del'>-                local-&gt;flags = flags;</div><div class='del'>-                local-&gt;mode = mode;</div><div class='ctx'> </div><div class='del'>-                local-&gt;cached_subvol = avail_subvol;</div><div class='del'>-                local-&gt;hashed_subvol = subvol;</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_TRACE,</div><div class='del'>-                        "creating %s on %s (link at %s)", loc-&gt;path,</div><div class='del'>-                        avail_subvol-&gt;name, subvol-&gt;name);</div><div class='del'>-                dht_linkfile_create (frame,</div><div class='del'>-                                     dht_create_linkfile_create_cbk,</div><div class='del'>-                                     avail_subvol, subvol, loc);</div><div class='del'>-                goto done;</div><div class='add'>+        parent-&gt;inode = inode_find(table, child-&gt;pargfid);</div><div class='add'>+</div><div class='add'>+        if (!parent-&gt;inode) {</div><div class='add'>+            if (op_errno) {</div><div class='add'>+                *op_errno = EINVAL;</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='ctx'>         }</div><div class='del'>-        gf_log (this-&gt;name, GF_LOG_TRACE,</div><div class='del'>-                "creating %s on %s", loc-&gt;path, subvol-&gt;name);</div><div class='del'>-        STACK_WIND (frame, dht_create_cbk,</div><div class='del'>-                    subvol, subvol-&gt;fops-&gt;create,</div><div class='del'>-                    loc, flags, mode, fd, params);</div><div class='del'>-done:</div><div class='del'>-	return 0;</div><div class='ctx'> </div><div class='del'>-err:</div><div class='del'>-	op_errno = (op_errno == -1) ? errno : op_errno;</div><div class='del'>-	DHT_STACK_UNWIND (create, frame, -1, op_errno, NULL, NULL, NULL, NULL, NULL);</div><div class='add'>+        gf_uuid_copy(parent-&gt;gfid, child-&gt;pargfid);</div><div class='ctx'> </div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='add'>+        ret = 0;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-dht_mkdir_selfheal_cbk (call_frame_t *frame, void *cookie,</div><div class='del'>-			xlator_t *this,</div><div class='del'>-			int32_t op_ret, int32_t op_errno)</div><div class='add'>+static int32_t</div><div class='add'>+dht_create_do(call_frame_t *frame)</div><div class='ctx'> {</div><div class='del'>-	dht_local_t   *local = NULL;</div><div class='del'>-	dht_layout_t  *layout = NULL;</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    dht_layout_t *refreshed = NULL;</div><div class='add'>+    xlator_t *subvol = NULL;</div><div class='add'>+    xlator_t *this = NULL;</div><div class='add'>+    dht_conf_t *conf = NULL;</div><div class='add'>+    dht_methods_t *methods = NULL;</div><div class='ctx'> </div><div class='add'>+    local = frame-&gt;local;</div><div class='ctx'> </div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-	layout = local-&gt;selfheal.layout;</div><div class='add'>+    this = THIS;</div><div class='ctx'> </div><div class='del'>-	if (op_ret == 0) {</div><div class='del'>-                dht_layout_set (this, local-&gt;inode, layout);</div><div class='del'>-		local-&gt;stbuf.ia_ino = local-&gt;ia_ino;</div><div class='del'>-                local-&gt;stbuf.ia_gen = local-&gt;ia_gen;</div><div class='del'>-                if (local-&gt;loc.parent) {</div><div class='del'>-                        local-&gt;preparent.ia_ino = local-&gt;loc.parent-&gt;ino;</div><div class='del'>-                        local-&gt;postparent.ia_ino = local-&gt;loc.parent-&gt;ino;</div><div class='add'>+    conf = this-&gt;private;</div><div class='ctx'> </div><div class='del'>-                        WIPE (&amp;local-&gt;preparent);</div><div class='del'>-                        WIPE (&amp;local-&gt;postparent);</div><div class='del'>-                }</div><div class='del'>-	}</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, conf, err);</div><div class='ctx'> </div><div class='del'>-	DHT_STACK_UNWIND (mkdir, frame, op_ret, op_errno,</div><div class='del'>-			  local-&gt;inode, &amp;local-&gt;stbuf, &amp;local-&gt;preparent,</div><div class='del'>-                          &amp;local-&gt;postparent);</div><div class='add'>+    methods = &amp;(conf-&gt;methods);</div><div class='ctx'> </div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='add'>+    /* We don't need parent_loc anymore */</div><div class='add'>+    loc_wipe(&amp;local-&gt;loc);</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-dht_mkdir_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-               int op_ret, int op_errno, inode_t *inode, struct iatt *stbuf,</div><div class='del'>-               struct iatt *preparent, struct iatt *postparent)</div><div class='del'>-{</div><div class='del'>-	dht_local_t  *local = NULL;</div><div class='del'>-	int           this_call_cnt = 0;</div><div class='del'>-	int           ret = -1;</div><div class='del'>-        int           subvol_filled = 0;</div><div class='del'>-	call_frame_t *prev = NULL;</div><div class='del'>-	dht_layout_t *layout = NULL;</div><div class='del'>-	dht_conf_t   *conf = NULL;</div><div class='del'>-</div><div class='del'>-	conf = this-&gt;private;</div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-	prev  = cookie;</div><div class='del'>-	layout = local-&gt;layout;</div><div class='del'>-</div><div class='del'>-        subvol_filled = dht_is_subvol_filled (this, prev-&gt;this);</div><div class='del'>-</div><div class='del'>-	LOCK (&amp;frame-&gt;lock);</div><div class='del'>-	{</div><div class='del'>-                if (subvol_filled &amp;&amp; (op_ret != -1)) {</div><div class='del'>-                        ret = dht_layout_merge (this, layout, prev-&gt;this,</div><div class='del'>-                                                -1, ENOSPC, NULL);</div><div class='del'>-                } else {</div><div class='del'>-                        ret = dht_layout_merge (this, layout, prev-&gt;this,</div><div class='del'>-                                                op_ret, op_errno, NULL);</div><div class='del'>-                }</div><div class='add'>+    loc_copy(&amp;local-&gt;loc, &amp;local-&gt;loc2);</div><div class='ctx'> </div><div class='del'>-		if (op_ret == -1) {</div><div class='del'>-			local-&gt;op_errno = op_errno;</div><div class='del'>-			goto unlock;</div><div class='del'>-		}</div><div class='del'>-		dht_iatt_merge (this, &amp;local-&gt;stbuf, stbuf, prev-&gt;this);</div><div class='del'>-                dht_iatt_merge (this, &amp;local-&gt;preparent, preparent, prev-&gt;this);</div><div class='del'>-                dht_iatt_merge (this, &amp;local-&gt;postparent, postparent,</div><div class='del'>-                                prev-&gt;this);</div><div class='del'>-</div><div class='del'>-                if (prev-&gt;this == dht_first_up_subvol (this)) {</div><div class='del'>-                        local-&gt;ia_ino = local-&gt;stbuf.ia_ino;</div><div class='del'>-                        local-&gt;ia_gen = local-&gt;stbuf.ia_gen;</div><div class='del'>-                }</div><div class='add'>+    loc_wipe(&amp;local-&gt;loc2);</div><div class='ctx'> </div><div class='del'>-	}</div><div class='del'>-unlock:</div><div class='del'>-	UNLOCK (&amp;frame-&gt;lock);</div><div class='add'>+    refreshed = local-&gt;selfheal.refreshed_layout;</div><div class='ctx'> </div><div class='del'>-	this_call_cnt = dht_frame_return (frame);</div><div class='del'>-	if (is_last_call (this_call_cnt)) {</div><div class='del'>-		dht_selfheal_new_directory (frame, dht_mkdir_selfheal_cbk,</div><div class='del'>-					    layout);</div><div class='del'>-	}</div><div class='add'>+    subvol = methods-&gt;layout_search(this, refreshed, local-&gt;loc.name);</div><div class='ctx'> </div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='add'>+    if (!subvol) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_ERROR, 0, DHT_MSG_HASHED_SUBVOL_GET_FAILED,</div><div class='add'>+               "no subvolume in "</div><div class='add'>+               "layout for path=%s",</div><div class='add'>+               local-&gt;loc.path);</div><div class='add'>+        local-&gt;op_errno = ENOENT;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-dht_mkdir_hashed_cbk (call_frame_t *frame, void *cookie, </div><div class='del'>-		      xlator_t *this, int op_ret, int op_errno,</div><div class='del'>-                      inode_t *inode, struct iatt *stbuf,</div><div class='del'>-                      struct iatt *preparent, struct iatt *postparent)</div><div class='del'>-{</div><div class='del'>-	dht_local_t  *local = NULL;</div><div class='del'>-	int           ret = -1;</div><div class='del'>-	call_frame_t *prev = NULL;</div><div class='del'>-	dht_layout_t *layout = NULL;</div><div class='del'>-	dht_conf_t   *conf = NULL;</div><div class='del'>-	int           i = 0;</div><div class='del'>-	xlator_t     *hashed_subvol = NULL;</div><div class='del'>-</div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-	prev  = cookie;</div><div class='del'>-	layout = local-&gt;layout;</div><div class='del'>-	conf = this-&gt;private;</div><div class='del'>-	hashed_subvol = local-&gt;hashed_subvol;</div><div class='del'>-</div><div class='del'>-        if (dht_is_subvol_filled (this, hashed_subvol))</div><div class='del'>-                ret = dht_layout_merge (this, layout, prev-&gt;this,</div><div class='del'>-                                        -1, ENOSPC, NULL);</div><div class='del'>-        else</div><div class='del'>-                ret = dht_layout_merge (this, layout, prev-&gt;this,</div><div class='del'>-                                        op_ret, op_errno, NULL);</div><div class='del'>-        </div><div class='del'>-	if (op_ret == -1) {</div><div class='del'>-		local-&gt;op_errno = op_errno;</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='del'>-	local-&gt;op_ret = 0;</div><div class='del'>-</div><div class='del'>-	dht_iatt_merge (this, &amp;local-&gt;stbuf, stbuf, prev-&gt;this);</div><div class='del'>-        dht_iatt_merge (this, &amp;local-&gt;preparent, preparent, prev-&gt;this);</div><div class='del'>-        dht_iatt_merge (this, &amp;local-&gt;postparent, postparent, prev-&gt;this);</div><div class='del'>-</div><div class='del'>-	local-&gt;ia_ino = local-&gt;stbuf.ia_ino;</div><div class='del'>-        local-&gt;ia_gen = local-&gt;stbuf.ia_gen;</div><div class='del'>-</div><div class='del'>-	local-&gt;call_cnt = conf-&gt;subvolume_cnt - 1;</div><div class='del'>-	</div><div class='del'>-	if (local-&gt;call_cnt == 0) {</div><div class='del'>-		dht_selfheal_directory (frame, dht_mkdir_selfheal_cbk,</div><div class='del'>-					&amp;local-&gt;loc, layout);</div><div class='del'>-	}</div><div class='del'>-	for (i = 0; i &lt; conf-&gt;subvolume_cnt; i++) {</div><div class='del'>-		if (conf-&gt;subvolumes[i] == hashed_subvol)</div><div class='del'>-			continue;</div><div class='del'>-		STACK_WIND (frame, dht_mkdir_cbk,</div><div class='del'>-			    conf-&gt;subvolumes[i],</div><div class='del'>-			    conf-&gt;subvolumes[i]-&gt;fops-&gt;mkdir,</div><div class='del'>-			    &amp;local-&gt;loc, local-&gt;mode, local-&gt;params);</div><div class='del'>-	}</div><div class='del'>-	return 0;</div><div class='add'>+    dht_create_wind_to_avail_subvol(frame, this, subvol, &amp;local-&gt;loc,</div><div class='add'>+                                    local-&gt;flags, local-&gt;mode, local-&gt;umask,</div><div class='add'>+                                    local-&gt;fd, local-&gt;params);</div><div class='add'>+    return 0;</div><div class='ctx'> err:</div><div class='del'>-	DHT_STACK_UNWIND (mkdir, frame, -1, op_errno, NULL, NULL, NULL, NULL);</div><div class='del'>-        return 0;</div><div class='add'>+    local-&gt;refresh_layout_unlock(frame, this, -1, 1);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+static int32_t</div><div class='add'>+dht_create_unlock_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                      int32_t op_ret, int32_t op_errno, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    DHT_STACK_DESTROY(frame);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-dht_mkdir (call_frame_t *frame, xlator_t *this,</div><div class='del'>-	   loc_t *loc, mode_t mode, dict_t *params)</div><div class='del'>-{</div><div class='del'>-	dht_local_t  *local  = NULL;</div><div class='del'>-	dht_conf_t   *conf = NULL;</div><div class='del'>-        int           op_errno = -1;</div><div class='del'>-	int           ret = -1;</div><div class='del'>-	xlator_t     *hashed_subvol = NULL;</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-        VALIDATE_OR_GOTO (frame, err);</div><div class='del'>-        VALIDATE_OR_GOTO (this, err);</div><div class='del'>-        VALIDATE_OR_GOTO (loc, err);</div><div class='del'>-        VALIDATE_OR_GOTO (loc-&gt;inode, err);</div><div class='del'>-        VALIDATE_OR_GOTO (loc-&gt;path, err);</div><div class='del'>-</div><div class='del'>-	conf = this-&gt;private;</div><div class='del'>-</div><div class='del'>-        dht_get_du_info (frame, this, loc);</div><div class='del'>-</div><div class='del'>-	local = dht_local_init (frame);</div><div class='del'>-	if (!local) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-			"Out of memory");</div><div class='del'>-		op_errno = ENOMEM;</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	hashed_subvol = dht_subvol_get_hashed (this, loc);</div><div class='del'>-</div><div class='del'>-	if (hashed_subvol == NULL) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-			"hashed subvol not found for %s",</div><div class='del'>-                        loc-&gt;path);</div><div class='del'>-		op_errno = EINVAL;</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	local-&gt;hashed_subvol = hashed_subvol;</div><div class='del'>-	local-&gt;inode = inode_ref (loc-&gt;inode);</div><div class='del'>-	ret = loc_copy (&amp;local-&gt;loc, loc);</div><div class='del'>-	local-&gt;mode = mode;</div><div class='del'>-</div><div class='del'>-	if (ret == -1) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-			"Out of memory");</div><div class='del'>-		op_errno = ENOMEM;</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-        local-&gt;params = dict_ref (params);</div><div class='del'>-</div><div class='del'>-	local-&gt;layout = dht_layout_new (this, conf-&gt;subvolume_cnt);</div><div class='del'>-	if (!local-&gt;layout) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-			"Out of memory");</div><div class='del'>-		op_errno = ENOMEM;</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	STACK_WIND (frame, dht_mkdir_hashed_cbk,</div><div class='del'>-		    hashed_subvol,</div><div class='del'>-		    hashed_subvol-&gt;fops-&gt;mkdir,</div><div class='del'>-		    loc, mode, params);</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='add'>+static int32_t</div><div class='add'>+dht_create_finish(call_frame_t *frame, xlator_t *this, int op_ret,</div><div class='add'>+                  int invoke_cbk)</div><div class='add'>+{</div><div class='add'>+    dht_local_t *local = NULL, *lock_local = NULL;</div><div class='add'>+    call_frame_t *lock_frame = NULL;</div><div class='add'>+    int lock_count = 0;</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    lock_count = dht_lock_count(local-&gt;lock[0].layout.parent_layout.locks,</div><div class='add'>+                                local-&gt;lock[0].layout.parent_layout.lk_count);</div><div class='add'>+    if (lock_count == 0)</div><div class='add'>+        goto done;</div><div class='add'>+</div><div class='add'>+    lock_frame = copy_frame(frame);</div><div class='add'>+    if (lock_frame == NULL) {</div><div class='add'>+        goto done;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    lock_local = dht_local_init(lock_frame, &amp;local-&gt;loc, NULL,</div><div class='add'>+                                lock_frame-&gt;root-&gt;op);</div><div class='add'>+    if (lock_local == NULL) {</div><div class='add'>+        goto done;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    lock_local-&gt;lock[0]</div><div class='add'>+        .layout.parent_layout.locks = local-&gt;lock[0].layout.parent_layout.locks;</div><div class='add'>+    lock_local-&gt;lock[0].layout.parent_layout.lk_count =</div><div class='add'>+        local-&gt;lock[0].layout.parent_layout.lk_count;</div><div class='add'>+</div><div class='add'>+    local-&gt;lock[0].layout.parent_layout.locks = NULL;</div><div class='add'>+    local-&gt;lock[0].layout.parent_layout.lk_count = 0;</div><div class='add'>+</div><div class='add'>+    dht_unlock_inodelk(lock_frame,</div><div class='add'>+                       lock_local-&gt;lock[0].layout.parent_layout.locks,</div><div class='add'>+                       lock_local-&gt;lock[0].layout.parent_layout.lk_count,</div><div class='add'>+                       dht_create_unlock_cbk);</div><div class='add'>+    lock_frame = NULL;</div><div class='ctx'> </div><div class='del'>-err:</div><div class='del'>-	op_errno = (op_errno == -1) ? errno : op_errno;</div><div class='del'>-	DHT_STACK_UNWIND (mkdir, frame, -1, op_errno, NULL, NULL, NULL, NULL);</div><div class='add'>+done:</div><div class='add'>+    if (lock_frame != NULL) {</div><div class='add'>+        DHT_STACK_DESTROY(lock_frame);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='add'>+    if (op_ret == 0)</div><div class='add'>+        return 0;</div><div class='ctx'> </div><div class='add'>+    DHT_STACK_UNWIND(create, frame, op_ret, local-&gt;op_errno, NULL, NULL, NULL,</div><div class='add'>+                     NULL, NULL, NULL);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-dht_rmdir_selfheal_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-			int op_ret, int op_errno)</div><div class='add'>+static int32_t</div><div class='add'>+dht_create_lock_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                    int32_t op_ret, int32_t op_errno, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-	dht_local_t  *local = NULL;</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='ctx'> </div><div class='del'>-	local = frame-&gt;local;</div><div class='add'>+    local = frame-&gt;local;</div><div class='ctx'> </div><div class='del'>-        if (local-&gt;loc.parent) {</div><div class='del'>-                local-&gt;preparent.ia_ino = local-&gt;loc.parent-&gt;ino;</div><div class='del'>-                local-&gt;postparent.ia_ino = local-&gt;loc.parent-&gt;ino;</div><div class='del'>-        }</div><div class='add'>+    if (!local) {</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	DHT_STACK_UNWIND (rmdir, frame, local-&gt;op_ret, local-&gt;op_errno,</div><div class='del'>-                          &amp;local-&gt;preparent, &amp;local-&gt;postparent);</div><div class='add'>+    if (op_ret &lt; 0) {</div><div class='add'>+        gf_msg("DHT", GF_LOG_ERROR, 0, DHT_MSG_INODE_LK_ERROR,</div><div class='add'>+               "Create lock failed for file: %s", local-&gt;loc2.name);</div><div class='ctx'> </div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='add'>+        local-&gt;op_errno = op_errno;</div><div class='ctx'> </div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-dht_rmdir_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-	       int op_ret, int op_errno, struct iatt *preparent,</div><div class='del'>-               struct iatt *postparent)</div><div class='add'>+    local-&gt;refresh_layout_unlock = dht_create_finish;</div><div class='add'>+</div><div class='add'>+    local-&gt;refresh_layout_done = dht_create_do;</div><div class='add'>+</div><div class='add'>+    dht_refresh_layout(frame);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+err:</div><div class='add'>+    if (local)</div><div class='add'>+        dht_create_finish(frame, this, -1, 0);</div><div class='add'>+    else</div><div class='add'>+        DHT_STACK_UNWIND(create, frame, -1, EINVAL, NULL, NULL, NULL, NULL,</div><div class='add'>+                         NULL, NULL);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+dht_create_lock(call_frame_t *frame, xlator_t *subvol)</div><div class='ctx'> {</div><div class='del'>-	dht_local_t  *local = NULL;</div><div class='del'>-	int           this_call_cnt = 0;</div><div class='del'>-	call_frame_t *prev = NULL;</div><div class='del'>-</div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-	prev  = cookie;</div><div class='del'>-</div><div class='del'>-	LOCK (&amp;frame-&gt;lock);</div><div class='del'>-	{</div><div class='del'>-		if (op_ret == -1) {</div><div class='del'>-			local-&gt;op_errno = op_errno;</div><div class='del'>-			local-&gt;op_ret   = -1;</div><div class='del'>-</div><div class='del'>-			if (op_errno != ENOENT)</div><div class='del'>-				local-&gt;need_selfheal = 1;</div><div class='del'>-</div><div class='del'>-			gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-				"rmdir on %s for %s failed (%s)",</div><div class='del'>-				prev-&gt;this-&gt;name, local-&gt;loc.path,</div><div class='del'>-				strerror (op_errno));</div><div class='del'>-			goto unlock;</div><div class='del'>-		}</div><div class='del'>-</div><div class='del'>-                dht_iatt_merge (this, &amp;local-&gt;preparent, preparent, prev-&gt;this);</div><div class='del'>-                dht_iatt_merge (this, &amp;local-&gt;postparent, postparent,</div><div class='del'>-                                prev-&gt;this);</div><div class='del'>-	}</div><div class='del'>-unlock:</div><div class='del'>-	UNLOCK (&amp;frame-&gt;lock);</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    int count = 1, ret = -1;</div><div class='add'>+    dht_lock_t **lk_array = NULL;</div><div class='ctx'> </div><div class='add'>+    GF_VALIDATE_OR_GOTO("dht", frame, err);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(frame-&gt;this-&gt;name, frame-&gt;local, err);</div><div class='ctx'> </div><div class='del'>-	this_call_cnt = dht_frame_return (frame);</div><div class='del'>-	if (is_last_call (this_call_cnt)) {</div><div class='del'>-		if (local-&gt;need_selfheal) {</div><div class='del'>-                        local-&gt;layout =</div><div class='del'>-                                dht_layout_get (this, local-&gt;loc.inode);</div><div class='add'>+    local = frame-&gt;local;</div><div class='ctx'> </div><div class='del'>-			/* TODO: neater interface needed below */</div><div class='del'>-			local-&gt;stbuf.ia_type = local-&gt;loc.inode-&gt;ia_type;</div><div class='add'>+    lk_array = GF_CALLOC(count, sizeof(*lk_array), gf_common_mt_pointer);</div><div class='ctx'> </div><div class='del'>-			dht_selfheal_restore (frame, dht_rmdir_selfheal_cbk,</div><div class='del'>-					      &amp;local-&gt;loc, local-&gt;layout);</div><div class='del'>-		} else {</div><div class='del'>-                        if (local-&gt;loc.parent) {</div><div class='del'>-                                local-&gt;preparent.ia_ino =</div><div class='del'>-                                        local-&gt;loc.parent-&gt;ino;</div><div class='del'>-                                local-&gt;postparent.ia_ino =</div><div class='del'>-                                        local-&gt;loc.parent-&gt;ino;</div><div class='add'>+    if (lk_array == NULL)</div><div class='add'>+        goto err;</div><div class='ctx'> </div><div class='del'>-                                WIPE (&amp;local-&gt;preparent);</div><div class='del'>-                                WIPE (&amp;local-&gt;postparent);</div><div class='del'>-                        }</div><div class='add'>+    lk_array[0] = dht_lock_new(frame-&gt;this, subvol, &amp;local-&gt;loc, F_RDLCK,</div><div class='add'>+                               DHT_LAYOUT_HEAL_DOMAIN, NULL,</div><div class='add'>+                               IGNORE_ENOENT_ESTALE);</div><div class='ctx'> </div><div class='del'>-			DHT_STACK_UNWIND (rmdir, frame, local-&gt;op_ret,</div><div class='del'>-					  local-&gt;op_errno, &amp;local-&gt;preparent,</div><div class='del'>-                                          &amp;local-&gt;postparent);</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='add'>+    if (lk_array[0] == NULL)</div><div class='add'>+        goto err;</div><div class='ctx'> </div><div class='del'>-        return 0;</div><div class='add'>+    local-&gt;lock[0].layout.parent_layout.locks = lk_array;</div><div class='add'>+    local-&gt;lock[0].layout.parent_layout.lk_count = count;</div><div class='add'>+</div><div class='add'>+    ret = dht_blocking_inodelk(frame, lk_array, count, dht_create_lock_cbk);</div><div class='add'>+</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        local-&gt;lock[0].layout.parent_layout.locks = NULL;</div><div class='add'>+        local-&gt;lock[0].layout.parent_layout.lk_count = 0;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+err:</div><div class='add'>+    if (lk_array != NULL) {</div><div class='add'>+        dht_lock_array_free(lk_array, count);</div><div class='add'>+        GF_FREE(lk_array);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return -1;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+int</div><div class='add'>+dht_set_parent_layout_in_dict(loc_t *loc, xlator_t *this, dht_local_t *local)</div><div class='add'>+{</div><div class='add'>+    dht_conf_t *conf = this-&gt;private;</div><div class='add'>+    dht_layout_t *parent_layout = NULL;</div><div class='add'>+    int *parent_disk_layout = NULL;</div><div class='add'>+    xlator_t *hashed_subvol = NULL;</div><div class='add'>+    char pgfid[GF_UUID_BUF_SIZE] = {0};</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    gf_uuid_unparse(loc-&gt;parent-&gt;gfid, pgfid);</div><div class='add'>+</div><div class='add'>+    parent_layout = dht_layout_get(this, loc-&gt;parent);</div><div class='add'>+    hashed_subvol = dht_subvol_get_hashed(this, loc);</div><div class='add'>+</div><div class='add'>+    ret = dht_disk_layout_extract_for_subvol(this, parent_layout, hashed_subvol,</div><div class='add'>+                                             &amp;parent_disk_layout);</div><div class='add'>+    if (ret == -1) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_WARNING, local-&gt;op_errno,</div><div class='add'>+               DHT_MSG_PARENT_LAYOUT_CHANGED,</div><div class='add'>+               "%s (%s/%s) (path: %s): "</div><div class='add'>+               "extracting in-memory layout of parent failed. ",</div><div class='add'>+               gf_fop_list[local-&gt;fop], pgfid, loc-&gt;name, loc-&gt;path);</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_set_str_sizen(local-&gt;params, GF_PREOP_PARENT_KEY,</div><div class='add'>+                             conf-&gt;xattr_name);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_WARNING, local-&gt;op_errno,</div><div class='add'>+               DHT_MSG_PARENT_LAYOUT_CHANGED,</div><div class='add'>+               "%s (%s/%s) (path: %s): "</div><div class='add'>+               "setting %s key in params dictionary failed. ",</div><div class='add'>+               gf_fop_list[local-&gt;fop], pgfid, loc-&gt;name, loc-&gt;path,</div><div class='add'>+               GF_PREOP_PARENT_KEY);</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_set_bin(local-&gt;params, conf-&gt;xattr_name, parent_disk_layout,</div><div class='add'>+                       4 * 4);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_WARNING, local-&gt;op_errno,</div><div class='add'>+               DHT_MSG_PARENT_LAYOUT_CHANGED,</div><div class='add'>+               "%s (%s/%s) (path: %s): "</div><div class='add'>+               "setting parent-layout in params dictionary failed. ",</div><div class='add'>+               gf_fop_list[local-&gt;fop], pgfid, loc-&gt;name, loc-&gt;path);</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+err:</div><div class='add'>+    dht_layout_unref(this, parent_layout);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-dht_rmdir_do (call_frame_t *frame, xlator_t *this)</div><div class='add'>+dht_create(call_frame_t *frame, xlator_t *this, loc_t *loc, int32_t flags,</div><div class='add'>+           mode_t mode, mode_t umask, fd_t *fd, dict_t *params)</div><div class='ctx'> {</div><div class='del'>-	dht_local_t  *local = NULL;</div><div class='del'>-	dht_conf_t   *conf = NULL;</div><div class='del'>-	int           i = 0;</div><div class='add'>+    int op_errno = -1;</div><div class='add'>+    xlator_t *subvol = NULL;</div><div class='add'>+    xlator_t *hashed_subvol = NULL;</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    int i = 0;</div><div class='add'>+    dht_conf_t *conf = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    VALIDATE_OR_GOTO(frame, err);</div><div class='add'>+    VALIDATE_OR_GOTO(this, err);</div><div class='add'>+    VALIDATE_OR_GOTO(loc, err);</div><div class='add'>+</div><div class='add'>+    conf = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    dht_get_du_info(frame, this, loc);</div><div class='add'>+</div><div class='add'>+    local = dht_local_init(frame, loc, fd, GF_FOP_CREATE);</div><div class='add'>+    if (!local) {</div><div class='add'>+        op_errno = ENOMEM;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    local-&gt;params = dict_ref(params);</div><div class='add'>+    local-&gt;flags = flags;</div><div class='add'>+    local-&gt;mode = mode;</div><div class='add'>+    local-&gt;umask = umask;</div><div class='add'>+</div><div class='add'>+    if (dht_filter_loc_subvol_key(this, loc, &amp;local-&gt;loc, &amp;subvol)) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_INFO, 0, DHT_MSG_SUBVOL_INFO,</div><div class='add'>+               "creating %s on %s (got create on %s)", local-&gt;loc.path,</div><div class='add'>+               subvol-&gt;name, loc-&gt;path);</div><div class='add'>+</div><div class='add'>+        /* Since lookup-optimize is enabled by default, we need</div><div class='add'>+         * to create the linkto file if required.</div><div class='add'>+         * Note this does not check for decommisioned bricks</div><div class='add'>+         * and min-free-disk limits as this is a debugging tool</div><div class='add'>+         * and not expected to be used in production.</div><div class='add'>+         */</div><div class='add'>+        hashed_subvol = dht_subvol_get_hashed(this, &amp;local-&gt;loc);</div><div class='add'>+</div><div class='add'>+        if (hashed_subvol &amp;&amp; (hashed_subvol != subvol)) {</div><div class='add'>+            /* Create the linkto file and then the data file */</div><div class='add'>+            local-&gt;cached_subvol = subvol;</div><div class='add'>+            local-&gt;hashed_subvol = hashed_subvol;</div><div class='ctx'> </div><div class='del'>-	conf = this-&gt;private;</div><div class='del'>-	local = frame-&gt;local;</div><div class='add'>+            dht_linkfile_create(frame, dht_create_linkfile_create_cbk, this,</div><div class='add'>+                                subvol, hashed_subvol, &amp;local-&gt;loc);</div><div class='add'>+            goto done;</div><div class='add'>+        }</div><div class='add'>+        /* We either don't have a hashed subvol or the hashed subvol is</div><div class='add'>+         * the same as the one specified. No need to create the linkto</div><div class='add'>+         * file as we expect a lookup everywhere if there are problems</div><div class='add'>+         * with the parent layout</div><div class='add'>+         */</div><div class='ctx'> </div><div class='del'>-	if (local-&gt;op_ret == -1)</div><div class='del'>-		goto err;</div><div class='add'>+        dht_set_parent_layout_in_dict(loc, this, local);</div><div class='add'>+</div><div class='add'>+        STACK_WIND_COOKIE(frame, dht_create_cbk, subvol, subvol,</div><div class='add'>+                          subvol-&gt;fops-&gt;create, &amp;local-&gt;loc, flags, mode, umask,</div><div class='add'>+                          fd, params);</div><div class='add'>+        goto done;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    subvol = dht_subvol_get_hashed(this, loc);</div><div class='add'>+    if (!subvol) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_ERROR, 0, DHT_MSG_HASHED_SUBVOL_GET_FAILED,</div><div class='add'>+               "no subvolume in layout for path=%s", loc-&gt;path);</div><div class='add'>+</div><div class='add'>+        op_errno = EIO;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Post remove-brick, the client layout may not be in sync with</div><div class='add'>+     * disk layout because of lack of lookup. Hence,a create call</div><div class='add'>+     * may fall on the decommissioned brick.  Hence, if the</div><div class='add'>+     * hashed_subvol is part of decommissioned bricks  list, do a</div><div class='add'>+     * lookup on parent dir. If a fix-layout is already done by the</div><div class='add'>+     * remove-brick process, the parent directory layout will be in</div><div class='add'>+     * sync with that of the disk. If fix-layout is still ending</div><div class='add'>+     * on the parent directory, we can let the file get created on</div><div class='add'>+     * the decommissioned brick which will be eventually migrated to</div><div class='add'>+     * non-decommissioned brick based on the new layout.</div><div class='add'>+     */</div><div class='add'>+</div><div class='add'>+    if (conf-&gt;decommission_subvols_cnt) {</div><div class='add'>+        for (i = 0; i &lt; conf-&gt;subvolume_cnt; i++) {</div><div class='add'>+            if (conf-&gt;decommissioned_bricks[i] &amp;&amp;</div><div class='add'>+                conf-&gt;decommissioned_bricks[i] == subvol) {</div><div class='add'>+                gf_msg_debug(this-&gt;name, 0,</div><div class='add'>+                             "hashed subvol:%s is "</div><div class='add'>+                             "part of decommission brick list for "</div><div class='add'>+                             "file: %s",</div><div class='add'>+                             subvol-&gt;name, loc-&gt;path);</div><div class='add'>+</div><div class='add'>+                /* dht_refresh_layout needs directory info in</div><div class='add'>+                 * local-&gt;loc. Hence, storing the parent_loc in</div><div class='add'>+                 * local-&gt;loc and storing the create context in</div><div class='add'>+                 * local-&gt;loc2. We will restore this information</div><div class='add'>+                 * in dht_creation do */</div><div class='add'>+</div><div class='add'>+                ret = loc_copy(&amp;local-&gt;loc2, &amp;local-&gt;loc);</div><div class='add'>+                if (ret) {</div><div class='add'>+                    gf_msg(this-&gt;name, GF_LOG_ERROR, ENOMEM, DHT_MSG_NO_MEMORY,</div><div class='add'>+                           "loc_copy failed %s", loc-&gt;path);</div><div class='add'>+</div><div class='add'>+                    goto err;</div><div class='add'>+                }</div><div class='ctx'> </div><div class='del'>-	local-&gt;call_cnt = conf-&gt;subvolume_cnt;</div><div class='add'>+                loc_wipe(&amp;local-&gt;loc);</div><div class='add'>+</div><div class='add'>+                ret = dht_build_parent_loc(this, &amp;local-&gt;loc, loc, &amp;op_errno);</div><div class='add'>+</div><div class='add'>+                if (ret) {</div><div class='add'>+                    gf_msg(this-&gt;name, GF_LOG_ERROR, ENOMEM, DHT_MSG_LOC_FAILED,</div><div class='add'>+                           "parent loc build failed");</div><div class='add'>+                    goto err;</div><div class='add'>+                }</div><div class='ctx'> </div><div class='del'>-	for (i = 0; i &lt; conf-&gt;subvolume_cnt; i++) {</div><div class='del'>-		STACK_WIND (frame, dht_rmdir_cbk,</div><div class='del'>-			    conf-&gt;subvolumes[i],</div><div class='del'>-			    conf-&gt;subvolumes[i]-&gt;fops-&gt;rmdir,</div><div class='del'>-			    &amp;local-&gt;loc);</div><div class='del'>-	}</div><div class='add'>+                ret = dht_create_lock(frame, subvol);</div><div class='ctx'> </div><div class='del'>-	return 0;</div><div class='add'>+                if (ret &lt; 0) {</div><div class='add'>+                    gf_msg(this-&gt;name, GF_LOG_ERROR, 0, DHT_MSG_INODE_LK_ERROR,</div><div class='add'>+                           "locking parent failed");</div><div class='add'>+                    goto err;</div><div class='add'>+                }</div><div class='add'>+</div><div class='add'>+                goto done;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    dht_create_wind_to_avail_subvol(frame, this, subvol, loc, flags, mode,</div><div class='add'>+                                    umask, fd, params);</div><div class='add'>+done:</div><div class='add'>+    return 0;</div><div class='ctx'> </div><div class='ctx'> err:</div><div class='del'>-	DHT_STACK_UNWIND (rmdir, frame, local-&gt;op_ret, local-&gt;op_errno,</div><div class='del'>-                          &amp;local-&gt;preparent, &amp;local-&gt;postparent);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='ctx'> </div><div class='add'>+    op_errno = (op_errno == -1) ? errno : op_errno;</div><div class='add'>+    DHT_STACK_UNWIND(create, frame, -1, op_errno, NULL, NULL, NULL, NULL, NULL,</div><div class='add'>+                     NULL);</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-dht_rmdir_linkfile_unlink_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-                               int op_ret, int op_errno, struct iatt *preparent,</div><div class='del'>-                               struct iatt *postparent)</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+dht_mkdir_selfheal_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                       int32_t op_ret, int32_t op_errno, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-        dht_local_t    *local = NULL;</div><div class='del'>-        call_frame_t   *prev = NULL;</div><div class='del'>-        xlator_t       *src = NULL;</div><div class='del'>-        call_frame_t   *main_frame = NULL;</div><div class='del'>-        dht_local_t    *main_local = NULL;</div><div class='del'>-        int             this_call_cnt = 0;</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    dht_layout_t *layout = NULL;</div><div class='ctx'> </div><div class='del'>-        local  = frame-&gt;local;</div><div class='del'>-        prev   = cookie;</div><div class='del'>-        src    = prev-&gt;this;</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    layout = local-&gt;selfheal.layout;</div><div class='ctx'> </div><div class='del'>-        main_frame = local-&gt;main_frame;</div><div class='del'>-        main_local = main_frame-&gt;local;</div><div class='add'>+    FRAME_SU_UNDO(frame, dht_local_t);</div><div class='add'>+    dht_set_fixed_dir_stat(&amp;local-&gt;preparent);</div><div class='add'>+    dht_set_fixed_dir_stat(&amp;local-&gt;postparent);</div><div class='ctx'> </div><div class='del'>-        if (op_ret == 0) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_TRACE,</div><div class='del'>-                        "unlinked linkfile %s on %s",</div><div class='del'>-                        local-&gt;loc.path, src-&gt;name);</div><div class='add'>+    if (op_ret == 0) {</div><div class='add'>+        dht_layout_set(this, local-&gt;inode, layout);</div><div class='add'>+</div><div class='add'>+        dht_inode_ctx_time_update(local-&gt;inode, this, &amp;local-&gt;stbuf, 1);</div><div class='add'>+        if (local-&gt;loc.parent) {</div><div class='add'>+            dht_inode_ctx_time_update(local-&gt;loc.parent, this,</div><div class='add'>+                                      &amp;local-&gt;preparent, 0);</div><div class='add'>+</div><div class='add'>+            dht_inode_ctx_time_update(local-&gt;loc.parent, this,</div><div class='add'>+                                      &amp;local-&gt;postparent, 1);</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    DHT_STACK_UNWIND(mkdir, frame, op_ret, op_errno, local-&gt;inode,</div><div class='add'>+                     &amp;local-&gt;stbuf, &amp;local-&gt;preparent, &amp;local-&gt;postparent,</div><div class='add'>+                     NULL);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+dht_mkdir_cbk(call_frame_t *frame, void *cookie, xlator_t *this, int op_ret,</div><div class='add'>+              int op_errno, inode_t *inode, struct iatt *stbuf,</div><div class='add'>+              struct iatt *preparent, struct iatt *postparent, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    int this_call_cnt = 0;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    gf_boolean_t subvol_filled = _gf_false;</div><div class='add'>+    gf_boolean_t dir_exists = _gf_false;</div><div class='add'>+    xlator_t *prev = NULL;</div><div class='add'>+    dht_layout_t *layout = NULL;</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    prev = cookie;</div><div class='add'>+    layout = local-&gt;layout;</div><div class='add'>+</div><div class='add'>+    subvol_filled = dht_is_subvol_filled(this, prev);</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;frame-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        if (subvol_filled &amp;&amp; (op_ret != -1)) {</div><div class='add'>+            ret = dht_layout_merge(this, layout, prev, -1, ENOSPC, NULL);</div><div class='ctx'>         } else {</div><div class='del'>-                main_local-&gt;op_ret   = -1;</div><div class='del'>-                main_local-&gt;op_errno = op_errno;</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-                        "unlink of %s on %s failed (%s)",</div><div class='del'>-                        local-&gt;loc.path, src-&gt;name, strerror (op_errno));</div><div class='add'>+            if (op_ret == -1 &amp;&amp; op_errno == EEXIST) {</div><div class='add'>+                /* Very likely just a race between mkdir and</div><div class='add'>+                   self-heal (from lookup of a concurrent mkdir</div><div class='add'>+                   attempt).</div><div class='add'>+                   Ignore error for now. layout setting will</div><div class='add'>+                   anyways fail if this was a different (old)</div><div class='add'>+                   pre-existing different directory.</div><div class='add'>+                */</div><div class='add'>+                op_ret = 0;</div><div class='add'>+                dir_exists = _gf_true;</div><div class='add'>+            }</div><div class='add'>+            ret = dht_layout_merge(this, layout, prev, op_ret, op_errno, NULL);</div><div class='add'>+        }</div><div class='add'>+        if (ret)</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_WARNING, 0, DHT_MSG_LAYOUT_MERGE_FAILED,</div><div class='add'>+                   "%s: failed to merge layouts for subvol %s", local-&gt;loc.path,</div><div class='add'>+                   prev-&gt;name);</div><div class='add'>+</div><div class='add'>+        if (op_ret == -1) {</div><div class='add'>+            local-&gt;op_errno = op_errno;</div><div class='add'>+            goto unlock;</div><div class='ctx'>         }</div><div class='ctx'> </div><div class='del'>-        this_call_cnt = dht_frame_return (main_frame);</div><div class='del'>-        if (is_last_call (this_call_cnt))</div><div class='del'>-                dht_rmdir_do (main_frame, this);</div><div class='add'>+        if (dir_exists)</div><div class='add'>+            goto unlock;</div><div class='ctx'> </div><div class='del'>-        DHT_STACK_DESTROY (frame);</div><div class='del'>-        return 0;</div><div class='add'>+        dht_iatt_merge(this, &amp;local-&gt;stbuf, stbuf);</div><div class='add'>+        dht_iatt_merge(this, &amp;local-&gt;preparent, preparent);</div><div class='add'>+        dht_iatt_merge(this, &amp;local-&gt;postparent, postparent);</div><div class='add'>+    }</div><div class='add'>+unlock:</div><div class='add'>+    UNLOCK(&amp;frame-&gt;lock);</div><div class='add'>+</div><div class='add'>+    this_call_cnt = dht_frame_return(frame);</div><div class='add'>+    if (is_last_call(this_call_cnt)) {</div><div class='add'>+        /*Unlock entrylk and inodelk once mkdir is done on all subvols*/</div><div class='add'>+        dht_unlock_namespace(frame, &amp;local-&gt;lock[0]);</div><div class='add'>+        FRAME_SU_DO(frame, dht_local_t);</div><div class='add'>+        dht_selfheal_new_directory(frame, dht_mkdir_selfheal_cbk, layout);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+static int</div><div class='add'>+dht_mkdir_hashed_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                     int op_ret, int op_errno, inode_t *inode,</div><div class='add'>+                     struct iatt *stbuf, struct iatt *preparent,</div><div class='add'>+                     struct iatt *postparent, dict_t *xdata);</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-dht_rmdir_lookup_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-                      int op_ret, int op_errno, inode_t *inode,</div><div class='del'>-                      struct iatt *stbuf, dict_t *xattr, struct iatt *parent)</div><div class='add'>+static int</div><div class='add'>+dht_mkdir_helper(call_frame_t *frame, xlator_t *this, loc_t *loc, mode_t mode,</div><div class='add'>+                 mode_t umask, dict_t *params)</div><div class='ctx'> {</div><div class='del'>-        dht_local_t    *local = NULL;</div><div class='del'>-        call_frame_t   *prev = NULL;</div><div class='del'>-        xlator_t       *src = NULL;</div><div class='del'>-        call_frame_t   *main_frame = NULL;</div><div class='del'>-        dht_local_t    *main_local = NULL;</div><div class='del'>-        int             this_call_cnt = 0;</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    dht_conf_t *conf = NULL;</div><div class='add'>+    int op_errno = -1, ret = -1;</div><div class='add'>+    xlator_t *hashed_subvol = NULL;</div><div class='add'>+    int32_t *parent_disk_layout = NULL;</div><div class='add'>+    dht_layout_t *parent_layout = NULL;</div><div class='add'>+    char pgfid[GF_UUID_BUF_SIZE] = {0};</div><div class='add'>+</div><div class='add'>+    VALIDATE_OR_GOTO(frame, err);</div><div class='add'>+    VALIDATE_OR_GOTO(this, err);</div><div class='add'>+    VALIDATE_OR_GOTO(loc, err);</div><div class='add'>+    VALIDATE_OR_GOTO(loc-&gt;inode, err);</div><div class='add'>+    VALIDATE_OR_GOTO(loc-&gt;path, err);</div><div class='add'>+    VALIDATE_OR_GOTO(this-&gt;private, err);</div><div class='add'>+</div><div class='add'>+    gf_uuid_unparse(loc-&gt;parent-&gt;gfid, pgfid);</div><div class='add'>+</div><div class='add'>+    conf = this-&gt;private;</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+</div><div class='add'>+    if (local-&gt;op_ret == -1) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_WARNING, local-&gt;op_errno,</div><div class='add'>+               DHT_MSG_PARENT_LAYOUT_CHANGED,</div><div class='add'>+               "mkdir (%s/%s) (path: %s): refreshing parent layout "</div><div class='add'>+               "failed.",</div><div class='add'>+               pgfid, loc-&gt;name, loc-&gt;path);</div><div class='add'>+</div><div class='add'>+        op_errno = local-&gt;op_errno;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    local-&gt;op_ret = -1;</div><div class='add'>+</div><div class='add'>+    hashed_subvol = dht_subvol_get_hashed(this, loc);</div><div class='add'>+    if (hashed_subvol == NULL) {</div><div class='add'>+        gf_msg_debug(this-&gt;name, 0,</div><div class='add'>+                     "mkdir (%s/%s) (path: %s): hashed subvol not "</div><div class='add'>+                     "found",</div><div class='add'>+                     pgfid, loc-&gt;name, loc-&gt;path);</div><div class='add'>+        op_errno = ENOENT;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    local-&gt;hashed_subvol = hashed_subvol;</div><div class='add'>+</div><div class='add'>+    parent_layout = dht_layout_get(this, loc-&gt;parent);</div><div class='add'>+</div><div class='add'>+    ret = dht_disk_layout_extract_for_subvol(this, parent_layout, hashed_subvol,</div><div class='add'>+                                             &amp;parent_disk_layout);</div><div class='add'>+    if (ret == -1) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_WARNING, EIO, DHT_MSG_PARENT_LAYOUT_CHANGED,</div><div class='add'>+               "mkdir (%s/%s) (path: %s): "</div><div class='add'>+               "extracting in-memory layout of parent failed. ",</div><div class='add'>+               pgfid, loc-&gt;name, loc-&gt;path);</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (memcmp(local-&gt;parent_disk_layout, parent_disk_layout,</div><div class='add'>+               sizeof(local-&gt;parent_disk_layout)) == 0) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_WARNING, EIO, DHT_MSG_PARENT_LAYOUT_CHANGED,</div><div class='add'>+               "mkdir (%s/%s) (path: %s): loop detected. "</div><div class='add'>+               "parent layout didn't change even though "</div><div class='add'>+               "previous attempt of mkdir failed because of "</div><div class='add'>+               "in-memory layout not matching with that on disk.",</div><div class='add'>+               pgfid, loc-&gt;name, loc-&gt;path);</div><div class='add'>+        op_errno = EIO;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    memcpy((void *)local-&gt;parent_disk_layout, (void *)parent_disk_layout,</div><div class='add'>+           sizeof(local-&gt;parent_disk_layout));</div><div class='add'>+</div><div class='add'>+    dht_layout_unref(this, parent_layout);</div><div class='add'>+    parent_layout = NULL;</div><div class='add'>+</div><div class='add'>+    ret = dict_set_str(params, GF_PREOP_PARENT_KEY, conf-&gt;xattr_name);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        local-&gt;op_errno = -ret;</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_WARNING, local-&gt;op_errno,</div><div class='add'>+               DHT_MSG_PARENT_LAYOUT_CHANGED,</div><div class='add'>+               "mkdir (%s/%s) (path: %s): "</div><div class='add'>+               "setting %s key in params dictionary failed. ",</div><div class='add'>+               pgfid, loc-&gt;name, loc-&gt;path, GF_PREOP_PARENT_KEY);</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_set_bin(params, conf-&gt;xattr_name, parent_disk_layout, 4 * 4);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        local-&gt;op_errno = -ret;</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_WARNING, local-&gt;op_errno,</div><div class='add'>+               DHT_MSG_PARENT_LAYOUT_CHANGED,</div><div class='add'>+               "setting parent-layout in params dictionary failed. "</div><div class='add'>+               "mkdir (%s/%s) (path: %s)",</div><div class='add'>+               pgfid, loc-&gt;name, loc-&gt;path);</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    parent_disk_layout = NULL;</div><div class='add'>+</div><div class='add'>+    STACK_WIND_COOKIE(frame, dht_mkdir_hashed_cbk, hashed_subvol, hashed_subvol,</div><div class='add'>+                      hashed_subvol-&gt;fops-&gt;mkdir, loc, mode, umask, params);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='ctx'> </div><div class='del'>-        local = frame-&gt;local;</div><div class='del'>-        prev  = cookie;</div><div class='del'>-        src   = prev-&gt;this;</div><div class='add'>+err:</div><div class='add'>+    dht_unlock_namespace(frame, &amp;local-&gt;lock[0]);</div><div class='ctx'> </div><div class='del'>-        main_frame = local-&gt;main_frame;</div><div class='del'>-        main_local = main_frame-&gt;local;</div><div class='add'>+    op_errno = local ? local-&gt;op_errno : op_errno;</div><div class='add'>+    DHT_STACK_UNWIND(mkdir, frame, -1, op_errno, NULL, NULL, NULL, NULL, NULL);</div><div class='ctx'> </div><div class='del'>-        if (op_ret != 0)</div><div class='del'>-                goto err;</div><div class='add'>+    if (parent_disk_layout != NULL)</div><div class='add'>+        GF_FREE(parent_disk_layout);</div><div class='add'>+</div><div class='add'>+    if (parent_layout != NULL)</div><div class='add'>+        dht_layout_unref(this, parent_layout);</div><div class='ctx'> </div><div class='del'>-        if (check_is_linkfile (inode, stbuf, xattr) == 0) {</div><div class='del'>-                main_local-&gt;op_ret  = -1;</div><div class='del'>-                main_local-&gt;op_errno = ENOTEMPTY;</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_WARNING,</div><div class='del'>-                        "%s on %s found to be not a linkfile (type=0%o)",</div><div class='del'>-                        local-&gt;loc.path, src-&gt;name, stbuf-&gt;ia_type);</div><div class='add'>+static int</div><div class='add'>+dht_mkdir_hashed_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                     int op_ret, int op_errno, inode_t *inode,</div><div class='add'>+                     struct iatt *stbuf, struct iatt *preparent,</div><div class='add'>+                     struct iatt *postparent, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    xlator_t *prev = NULL;</div><div class='add'>+    dht_layout_t *layout = NULL;</div><div class='add'>+    dht_conf_t *conf = NULL;</div><div class='add'>+    int i = 0;</div><div class='add'>+    xlator_t *hashed_subvol = NULL;</div><div class='add'>+    char pgfid[GF_UUID_BUF_SIZE] = {0};</div><div class='add'>+    gf_boolean_t parent_layout_changed = _gf_false;</div><div class='add'>+    call_stub_t *stub = NULL;</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    prev = cookie;</div><div class='add'>+    layout = local-&gt;layout;</div><div class='add'>+    conf = this-&gt;private;</div><div class='add'>+    hashed_subvol = local-&gt;hashed_subvol;</div><div class='add'>+</div><div class='add'>+    gf_uuid_unparse(local-&gt;loc.parent-&gt;gfid, pgfid);</div><div class='add'>+</div><div class='add'>+    if (gf_uuid_is_null(local-&gt;loc.gfid) &amp;&amp; !op_ret)</div><div class='add'>+        gf_uuid_copy(local-&gt;loc.gfid, stbuf-&gt;ia_gfid);</div><div class='add'>+</div><div class='add'>+    if (op_ret == -1) {</div><div class='add'>+        local-&gt;op_errno = op_errno;</div><div class='add'>+</div><div class='add'>+        parent_layout_changed = (xdata &amp;&amp;</div><div class='add'>+                                 dict_get(xdata, GF_PREOP_CHECK_FAILED))</div><div class='add'>+                                    ? 1</div><div class='add'>+                                    : 0;</div><div class='add'>+        if (parent_layout_changed) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_INFO, 0, DHT_MSG_PARENT_LAYOUT_CHANGED,</div><div class='add'>+                   "mkdir (%s/%s) (path: %s): parent layout "</div><div class='add'>+                   "changed. Attempting a refresh and then a "</div><div class='add'>+                   "retry",</div><div class='add'>+                   pgfid, local-&gt;loc.name, local-&gt;loc.path);</div><div class='add'>+</div><div class='add'>+            stub = fop_mkdir_stub(frame, dht_mkdir_helper, &amp;local-&gt;loc,</div><div class='add'>+                                  local-&gt;mode, local-&gt;umask, local-&gt;params);</div><div class='add'>+            if (stub == NULL) {</div><div class='add'>+                goto err;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            ret = dht_handle_parent_layout_change(this, stub);</div><div class='add'>+            if (ret) {</div><div class='ctx'>                 goto err;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            stub = NULL;</div><div class='add'>+</div><div class='add'>+            return 0;</div><div class='ctx'>         }</div><div class='ctx'> </div><div class='del'>-        STACK_WIND (frame, dht_rmdir_linkfile_unlink_cbk,</div><div class='del'>-                    src, src-&gt;fops-&gt;unlink, &amp;local-&gt;loc);</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    dict_del(local-&gt;params, GF_PREOP_PARENT_KEY);</div><div class='add'>+    dict_del(local-&gt;params, conf-&gt;xattr_name);</div><div class='add'>+</div><div class='add'>+    if (dht_is_subvol_filled(this, hashed_subvol))</div><div class='add'>+        ret = dht_layout_merge(this, layout, prev, -1, ENOSPC, NULL);</div><div class='add'>+    else</div><div class='add'>+        ret = dht_layout_merge(this, layout, prev, op_ret, op_errno, NULL);</div><div class='add'>+</div><div class='add'>+    /* TODO: we may have to return from the function</div><div class='add'>+       if layout merge fails. For now, lets just log an error */</div><div class='add'>+    if (ret)</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_WARNING, 0, DHT_MSG_LAYOUT_MERGE_FAILED,</div><div class='add'>+               "%s: failed to merge layouts for subvol %s", local-&gt;loc.path,</div><div class='add'>+               prev-&gt;name);</div><div class='add'>+</div><div class='add'>+    local-&gt;op_ret = 0;</div><div class='add'>+</div><div class='add'>+    dht_iatt_merge(this, &amp;local-&gt;stbuf, stbuf);</div><div class='add'>+    dht_iatt_merge(this, &amp;local-&gt;preparent, preparent);</div><div class='add'>+    dht_iatt_merge(this, &amp;local-&gt;postparent, postparent);</div><div class='add'>+</div><div class='add'>+    local-&gt;call_cnt = conf-&gt;subvolume_cnt - 1;</div><div class='add'>+    /* Delete internal mds xattr from params dict to avoid store</div><div class='add'>+      internal mds xattr on other subvols</div><div class='add'>+    */</div><div class='add'>+    dict_del(local-&gt;params, conf-&gt;mds_xattr_key);</div><div class='add'>+</div><div class='add'>+    if (gf_uuid_is_null(local-&gt;loc.gfid))</div><div class='add'>+        gf_uuid_copy(local-&gt;loc.gfid, stbuf-&gt;ia_gfid);</div><div class='add'>+</div><div class='add'>+    /* Set hashed subvol as a mds subvol on inode ctx */</div><div class='add'>+    /*if (!local-&gt;inode)</div><div class='add'>+            local-&gt;inode  = inode_ref (inode);</div><div class='add'>+    */</div><div class='add'>+    ret = dht_inode_ctx_mdsvol_set(local-&gt;inode, this, hashed_subvol);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_ERROR, 0, DHT_MSG_SET_INODE_CTX_FAILED,</div><div class='add'>+               "Failed to set hashed subvol for %s on inode vol is %s",</div><div class='add'>+               local-&gt;loc.path, hashed_subvol-&gt;name);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (local-&gt;call_cnt == 0) {</div><div class='add'>+        /*Unlock namespace lock once mkdir is done on all subvols*/</div><div class='add'>+        dht_unlock_namespace(frame, &amp;local-&gt;lock[0]);</div><div class='add'>+        FRAME_SU_DO(frame, dht_local_t);</div><div class='add'>+        dht_selfheal_directory(frame, dht_mkdir_selfheal_cbk, &amp;local-&gt;loc,</div><div class='add'>+                               layout);</div><div class='ctx'>         return 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; conf-&gt;subvolume_cnt; i++) {</div><div class='add'>+        if (conf-&gt;subvolumes[i] == hashed_subvol)</div><div class='add'>+            continue;</div><div class='add'>+        STACK_WIND_COOKIE(frame, dht_mkdir_cbk, conf-&gt;subvolumes[i],</div><div class='add'>+                          conf-&gt;subvolumes[i], conf-&gt;subvolumes[i]-&gt;fops-&gt;mkdir,</div><div class='add'>+                          &amp;local-&gt;loc, local-&gt;mode, local-&gt;umask,</div><div class='add'>+                          local-&gt;params);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='ctx'> err:</div><div class='add'>+    if (local-&gt;op_ret != 0) {</div><div class='add'>+        dht_unlock_namespace(frame, &amp;local-&gt;lock[0]);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        this_call_cnt = dht_frame_return (main_frame);</div><div class='del'>-        if (is_last_call (this_call_cnt))</div><div class='del'>-                dht_rmdir_do (main_frame, this);</div><div class='add'>+    DHT_STACK_UNWIND(mkdir, frame, -1, op_errno, NULL, NULL, NULL, NULL, NULL);</div><div class='ctx'> </div><div class='del'>-        DHT_STACK_DESTROY (frame);</div><div class='del'>-        return 0;</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+static int</div><div class='add'>+dht_mkdir_guard_parent_layout_cbk(call_frame_t *frame, xlator_t *this,</div><div class='add'>+                                  loc_t *loc, mode_t mode, mode_t umask,</div><div class='add'>+                                  dict_t *params)</div><div class='add'>+{</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    dht_conf_t *conf = 0;</div><div class='add'>+    char pgfid[GF_UUID_BUF_SIZE] = {0};</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int32_t zero[1] = {0};</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    conf = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    gf_uuid_unparse(loc-&gt;parent-&gt;gfid, pgfid);</div><div class='add'>+</div><div class='add'>+    if (local-&gt;op_ret &lt; 0) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_WARNING, local-&gt;op_errno,</div><div class='add'>+               DHT_MSG_PARENT_LAYOUT_CHANGED,</div><div class='add'>+               "mkdir (%s/%s) (path: %s): "</div><div class='add'>+               "Acquiring lock on parent to guard against "</div><div class='add'>+               "layout-change failed.",</div><div class='add'>+               pgfid, loc-&gt;name, loc-&gt;path);</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    local-&gt;op_ret = -1;</div><div class='add'>+    /* Add internal MDS xattr on disk for hashed subvol</div><div class='add'>+     */</div><div class='add'>+    ret = dht_dict_set_array(params, conf-&gt;mds_xattr_key, zero, 1);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_WARNING, ENOMEM, DHT_MSG_DICT_SET_FAILED,</div><div class='add'>+               "Failed to set dictionary value:key = %s for "</div><div class='add'>+               "path %s",</div><div class='add'>+               conf-&gt;mds_xattr_key, loc-&gt;path);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    STACK_WIND_COOKIE(frame, dht_mkdir_hashed_cbk, local-&gt;hashed_subvol,</div><div class='add'>+                      local-&gt;hashed_subvol, local-&gt;hashed_subvol-&gt;fops-&gt;mkdir,</div><div class='add'>+                      loc, mode, umask, params);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+err:</div><div class='add'>+    DHT_STACK_UNWIND(mkdir, frame, -1, local-&gt;op_errno, NULL, NULL, NULL, NULL,</div><div class='add'>+                     NULL);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-dht_rmdir_is_subvol_empty (call_frame_t *frame, xlator_t *this,</div><div class='del'>-                           gf_dirent_t *entries, xlator_t *src)</div><div class='add'>+dht_mkdir(call_frame_t *frame, xlator_t *this, loc_t *loc, mode_t mode,</div><div class='add'>+          mode_t umask, dict_t *params)</div><div class='ctx'> {</div><div class='del'>-        int                 ret = 0;</div><div class='del'>-        int                 build_ret = 0;</div><div class='del'>-        gf_dirent_t        *trav = NULL;</div><div class='del'>-        call_frame_t       *lookup_frame = NULL;</div><div class='del'>-        dht_local_t        *lookup_local = NULL;</div><div class='del'>-        dht_local_t        *local = NULL;</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    dht_conf_t *conf = NULL;</div><div class='add'>+    int op_errno = EINVAL, ret = -1;</div><div class='add'>+    xlator_t *hashed_subvol = NULL;</div><div class='add'>+    char pgfid[GF_UUID_BUF_SIZE] = {0};</div><div class='add'>+    call_stub_t *stub = NULL;</div><div class='add'>+</div><div class='add'>+    VALIDATE_OR_GOTO(frame, err);</div><div class='add'>+    VALIDATE_OR_GOTO(this, err);</div><div class='add'>+    VALIDATE_OR_GOTO(loc, err);</div><div class='add'>+    VALIDATE_OR_GOTO(loc-&gt;inode, err);</div><div class='add'>+    VALIDATE_OR_GOTO(loc-&gt;path, err);</div><div class='add'>+    VALIDATE_OR_GOTO(this-&gt;private, err);</div><div class='add'>+</div><div class='add'>+    gf_uuid_unparse(loc-&gt;parent-&gt;gfid, pgfid);</div><div class='add'>+</div><div class='add'>+    conf = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    if (!params || !dict_get(params, "gfid-req")) {</div><div class='add'>+        op_errno = EPERM;</div><div class='add'>+        gf_msg_callingfn(this-&gt;name, GF_LOG_WARNING, op_errno,</div><div class='add'>+                         DHT_MSG_GFID_NULL,</div><div class='add'>+                         "mkdir: %s is received "</div><div class='add'>+                         "without gfid-req %p",</div><div class='add'>+                         loc-&gt;path, params);</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    dht_get_du_info(frame, this, loc);</div><div class='add'>+</div><div class='add'>+    local = dht_local_init(frame, loc, NULL, GF_FOP_MKDIR);</div><div class='add'>+    if (!local) {</div><div class='add'>+        op_errno = ENOMEM;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    hashed_subvol = dht_subvol_get_hashed(this, loc);</div><div class='add'>+    if (hashed_subvol == NULL) {</div><div class='add'>+        gf_msg_debug(this-&gt;name, 0, "hashed subvol not found for %s",</div><div class='add'>+                     loc-&gt;path);</div><div class='add'>+        local-&gt;op_errno = EIO;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    local-&gt;hashed_subvol = hashed_subvol;</div><div class='add'>+    local-&gt;mode = mode;</div><div class='add'>+    local-&gt;umask = umask;</div><div class='add'>+    if (params)</div><div class='add'>+        local-&gt;params = dict_ref(params);</div><div class='add'>+</div><div class='add'>+    local-&gt;inode = inode_ref(loc-&gt;inode);</div><div class='add'>+</div><div class='add'>+    local-&gt;layout = dht_layout_new(this, conf-&gt;subvolume_cnt);</div><div class='add'>+    if (!local-&gt;layout) {</div><div class='add'>+        op_errno = ENOMEM;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* set the newly created directory hash to the commit hash</div><div class='add'>+     * if the configuration option is set. If configuration option</div><div class='add'>+     * is not set, the older clients may still be connecting to the</div><div class='add'>+     * volume and hence we need to preserve the 1 in disk[0] part of the</div><div class='add'>+     * layout xattr */</div><div class='add'>+    if (conf-&gt;lookup_optimize)</div><div class='add'>+        local-&gt;layout-&gt;commit_hash = conf-&gt;vol_commit_hash;</div><div class='add'>+    else</div><div class='add'>+        local-&gt;layout-&gt;commit_hash = DHT_LAYOUT_HASH_INVALID;</div><div class='add'>+</div><div class='add'>+    stub = fop_mkdir_stub(frame, dht_mkdir_guard_parent_layout_cbk, loc, mode,</div><div class='add'>+                          umask, params);</div><div class='add'>+    if (stub == NULL) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_WARNING, ENOMEM,</div><div class='add'>+               DHT_MSG_PARENT_LAYOUT_CHANGED,</div><div class='add'>+               "mkdir (%s/%s) (path: %s): "</div><div class='add'>+               "creating stub failed.",</div><div class='add'>+               pgfid, loc-&gt;name, loc-&gt;path);</div><div class='add'>+        local-&gt;op_errno = ENOMEM;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dht_guard_parent_layout_and_namespace(this, stub);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_WARNING, 0, DHT_MSG_PARENT_LAYOUT_CHANGED,</div><div class='add'>+               "mkdir (%s/%s) (path: %s) cannot wind lock request to "</div><div class='add'>+               "guard parent layout",</div><div class='add'>+               pgfid, loc-&gt;name, loc-&gt;path);</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='ctx'> </div><div class='del'>-        local = frame-&gt;local;</div><div class='add'>+err:</div><div class='add'>+    op_errno = local ? local-&gt;op_errno : op_errno;</div><div class='add'>+    DHT_STACK_UNWIND(mkdir, frame, -1, op_errno, NULL, NULL, NULL, NULL, NULL);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+dht_rmdir_selfheal_cbk(call_frame_t *heal_frame, void *cookie, xlator_t *this,</div><div class='add'>+                       int op_ret, int op_errno, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    dht_local_t *heal_local = NULL;</div><div class='add'>+    call_frame_t *main_frame = NULL;</div><div class='add'>+</div><div class='add'>+    heal_local = heal_frame-&gt;local;</div><div class='add'>+    main_frame = heal_local-&gt;main_frame;</div><div class='add'>+    local = main_frame-&gt;local;</div><div class='add'>+</div><div class='add'>+    DHT_STACK_DESTROY(heal_frame);</div><div class='add'>+    dht_set_fixed_dir_stat(&amp;local-&gt;preparent);</div><div class='add'>+    dht_set_fixed_dir_stat(&amp;local-&gt;postparent);</div><div class='add'>+</div><div class='add'>+    DHT_STACK_UNWIND(rmdir, main_frame, local-&gt;op_ret, local-&gt;op_errno,</div><div class='add'>+                     &amp;local-&gt;preparent, &amp;local-&gt;postparent, NULL);</div><div class='ctx'> </div><div class='del'>-        list_for_each_entry (trav, &amp;entries-&gt;list, list) {</div><div class='del'>-                if (strcmp (trav-&gt;d_name, ".") == 0)</div><div class='del'>-                        continue;</div><div class='del'>-                if (strcmp (trav-&gt;d_name, "..") == 0)</div><div class='del'>-                        continue;</div><div class='del'>-                if (check_is_linkfile (NULL, (&amp;trav-&gt;d_stat), NULL) == 1) {</div><div class='del'>-                        ret++;</div><div class='del'>-                        continue;</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+dht_rmdir_hashed_subvol_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                            int op_ret, int op_errno, struct iatt *preparent,</div><div class='add'>+                            struct iatt *postparent, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    dht_local_t *heal_local = NULL;</div><div class='add'>+    call_frame_t *heal_frame = NULL;</div><div class='add'>+    dht_conf_t *conf = NULL;</div><div class='add'>+    int this_call_cnt = 0;</div><div class='add'>+    xlator_t *prev = NULL;</div><div class='add'>+    char gfid[GF_UUID_BUF_SIZE] = {0};</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    prev = cookie;</div><div class='add'>+    conf = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    gf_uuid_unparse(local-&gt;loc.gfid, gfid);</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;frame-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        if (op_ret == -1) {</div><div class='add'>+            local-&gt;op_errno = op_errno;</div><div class='add'>+            local-&gt;op_ret = -1;</div><div class='add'>+            if (conf-&gt;subvolume_cnt != 1) {</div><div class='add'>+                if (op_errno != ENOENT &amp;&amp; op_errno != EACCES &amp;&amp;</div><div class='add'>+                    op_errno != ESTALE) {</div><div class='add'>+                    local-&gt;need_selfheal = 1;</div><div class='ctx'>                 }</div><div class='add'>+            }</div><div class='ctx'> </div><div class='del'>-                /* this entry is either a directory which is neither "." nor "..",</div><div class='del'>-                   or a non directory which is not a linkfile. the directory is to</div><div class='del'>-                   be treated as non-empty</div><div class='del'>-                */</div><div class='del'>-                return 0;</div><div class='add'>+            gf_msg_debug(this-&gt;name, op_errno,</div><div class='add'>+                         "rmdir on %s for %s failed "</div><div class='add'>+                         "(gfid = %s)",</div><div class='add'>+                         prev-&gt;name, local-&gt;loc.path, gfid);</div><div class='add'>+            goto unlock;</div><div class='ctx'>         }</div><div class='ctx'> </div><div class='del'>-        list_for_each_entry (trav, &amp;entries-&gt;list, list) {</div><div class='del'>-                if (strcmp (trav-&gt;d_name, ".") == 0)</div><div class='del'>-                        continue;</div><div class='del'>-                if (strcmp (trav-&gt;d_name, "..") == 0)</div><div class='del'>-                        continue;</div><div class='add'>+        dht_iatt_merge(this, &amp;local-&gt;preparent, preparent);</div><div class='add'>+        dht_iatt_merge(this, &amp;local-&gt;postparent, postparent);</div><div class='add'>+    }</div><div class='add'>+unlock:</div><div class='add'>+    UNLOCK(&amp;frame-&gt;lock);</div><div class='ctx'> </div><div class='del'>-                lookup_frame = NULL;</div><div class='del'>-                lookup_local = NULL;</div><div class='add'>+    this_call_cnt = dht_frame_return(frame);</div><div class='add'>+    if (is_last_call(this_call_cnt)) {</div><div class='add'>+        if (local-&gt;need_selfheal) {</div><div class='add'>+            dht_rmdir_unlock(frame, this);</div><div class='add'>+            local-&gt;layout = dht_layout_get(this, local-&gt;loc.inode);</div><div class='ctx'> </div><div class='del'>-                lookup_frame = copy_frame (frame);</div><div class='del'>-                if (!lookup_frame) {</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-                                "Out of Memory");</div><div class='del'>-                        /* out of memory, let the rmdir fail</div><div class='del'>-                           (as non-empty, unfortunately) */</div><div class='del'>-                        goto err;</div><div class='del'>-                }</div><div class='add'>+            /* TODO: neater interface needed below */</div><div class='add'>+            local-&gt;stbuf.ia_type = local-&gt;loc.inode-&gt;ia_type;</div><div class='ctx'> </div><div class='del'>-                lookup_local = GF_CALLOC (sizeof (*local), 1,</div><div class='del'>-                                          gf_dht_mt_dht_local_t);</div><div class='del'>-                if (!lookup_local) {</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-                                "Out of Memory");</div><div class='del'>-                        goto err;</div><div class='del'>-                }</div><div class='add'>+            gf_uuid_copy(local-&gt;gfid, local-&gt;loc.inode-&gt;gfid);</div><div class='add'>+</div><div class='add'>+            /* Use a different frame or else the rmdir op_ret is</div><div class='add'>+             * overwritten by that of the selfheal */</div><div class='ctx'> </div><div class='del'>-                lookup_frame-&gt;local = lookup_local;</div><div class='del'>-                lookup_local-&gt;main_frame = frame;</div><div class='add'>+            heal_frame = copy_frame(frame);</div><div class='ctx'> </div><div class='del'>-                build_ret = dht_build_child_loc (this, &amp;lookup_local-&gt;loc,</div><div class='del'>-                                                 &amp;local-&gt;loc, trav-&gt;d_name);</div><div class='del'>-                if (build_ret != 0)</div><div class='del'>-                        goto err;</div><div class='add'>+            if (heal_frame == NULL) {</div><div class='add'>+                goto err;</div><div class='add'>+            }</div><div class='ctx'> </div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_TRACE,</div><div class='del'>-                        "looking up %s on %s",</div><div class='del'>-                        lookup_local-&gt;loc.path, src-&gt;name);</div><div class='add'>+            heal_local = dht_local_init(heal_frame, &amp;local-&gt;loc, NULL, 0);</div><div class='add'>+            if (!heal_local) {</div><div class='add'>+                DHT_STACK_DESTROY(heal_frame);</div><div class='add'>+                goto err;</div><div class='add'>+            }</div><div class='ctx'> </div><div class='del'>-                LOCK (&amp;frame-&gt;lock);</div><div class='del'>-                {</div><div class='del'>-                        local-&gt;call_cnt++;</div><div class='del'>-                }</div><div class='del'>-                UNLOCK (&amp;frame-&gt;lock);</div><div class='add'>+            heal_local-&gt;inode = inode_ref(local-&gt;loc.inode);</div><div class='add'>+            heal_local-&gt;main_frame = frame;</div><div class='add'>+            gf_uuid_copy(heal_local-&gt;gfid, local-&gt;loc.inode-&gt;gfid);</div><div class='ctx'> </div><div class='del'>-                STACK_WIND (lookup_frame, dht_rmdir_lookup_cbk,</div><div class='del'>-                            src, src-&gt;fops-&gt;lookup,</div><div class='del'>-                            &amp;lookup_local-&gt;loc, NULL);</div><div class='del'>-                ret++;</div><div class='add'>+            dht_selfheal_restore(heal_frame, dht_rmdir_selfheal_cbk,</div><div class='add'>+                                 &amp;heal_local-&gt;loc, heal_local-&gt;layout);</div><div class='add'>+            return 0;</div><div class='add'>+        } else {</div><div class='add'>+            if (local-&gt;loc.parent) {</div><div class='add'>+                dht_inode_ctx_time_update(local-&gt;loc.parent, this,</div><div class='add'>+                                          &amp;local-&gt;preparent, 0);</div><div class='add'>+</div><div class='add'>+                dht_inode_ctx_time_update(local-&gt;loc.parent, this,</div><div class='add'>+                                          &amp;local-&gt;postparent, 1);</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            dht_set_fixed_dir_stat(&amp;local-&gt;preparent);</div><div class='add'>+            dht_set_fixed_dir_stat(&amp;local-&gt;postparent);</div><div class='add'>+</div><div class='add'>+            dht_rmdir_unlock(frame, this);</div><div class='add'>+            DHT_STACK_UNWIND(rmdir, frame, local-&gt;op_ret, local-&gt;op_errno,</div><div class='add'>+                             &amp;local-&gt;preparent, &amp;local-&gt;postparent, NULL);</div><div class='ctx'>         }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='ctx'> </div><div class='del'>-        return ret;</div><div class='ctx'> err:</div><div class='del'>-        DHT_STACK_DESTROY (lookup_frame);</div><div class='del'>-        return 0;</div><div class='add'>+    DHT_STACK_UNWIND(rmdir, frame, local-&gt;op_ret, local-&gt;op_errno, NULL, NULL,</div><div class='add'>+                     NULL);</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+static int</div><div class='add'>+dht_rmdir_unlock_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                     int32_t op_ret, int32_t op_errno, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    DHT_STACK_DESTROY(frame);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-dht_rmdir_readdirp_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-                        int op_ret, int op_errno, gf_dirent_t *entries)</div><div class='del'>-{</div><div class='del'>-	dht_local_t  *local = NULL;</div><div class='del'>-	int           this_call_cnt = -1;</div><div class='del'>-	call_frame_t *prev = NULL;</div><div class='del'>-        xlator_t     *src = NULL;</div><div class='del'>-        int           ret = 0;</div><div class='del'>-</div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-	prev  = cookie;</div><div class='del'>-        src   = prev-&gt;this;</div><div class='del'>-</div><div class='del'>-	if (op_ret &gt; 2) {</div><div class='del'>-                ret = dht_rmdir_is_subvol_empty (frame, this, entries, src);</div><div class='del'>-</div><div class='del'>-                switch (ret) {</div><div class='del'>-                case 0: /* non linkfiles exist */</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_TRACE,</div><div class='del'>-                                "readdir on %s for %s returned %d entries",</div><div class='del'>-                                prev-&gt;this-&gt;name, local-&gt;loc.path, op_ret);</div><div class='del'>-                        local-&gt;op_ret = -1;</div><div class='del'>-                        local-&gt;op_errno = ENOTEMPTY;</div><div class='del'>-                        break;</div><div class='del'>-                default:</div><div class='del'>-                        /* @ret number of linkfiles are getting unlinked */</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_TRACE,</div><div class='del'>-                                "readdir on %s for %s found %d linkfiles",</div><div class='del'>-                                prev-&gt;this-&gt;name, local-&gt;loc.path, ret);</div><div class='del'>-                        break;</div><div class='del'>-                }</div><div class='del'>-	}</div><div class='add'>+static int</div><div class='add'>+dht_rmdir_unlock(call_frame_t *frame, xlator_t *this)</div><div class='add'>+{</div><div class='add'>+    dht_local_t *local = NULL, *lock_local = NULL;</div><div class='add'>+    call_frame_t *lock_frame = NULL;</div><div class='add'>+    int lock_count = 0;</div><div class='ctx'> </div><div class='del'>-	this_call_cnt = dht_frame_return (frame);</div><div class='add'>+    local = frame-&gt;local;</div><div class='ctx'> </div><div class='del'>-	if (is_last_call (this_call_cnt)) {</div><div class='del'>-		dht_rmdir_do (frame, this);</div><div class='del'>-	}</div><div class='add'>+    /* Unlock entrylk */</div><div class='add'>+    dht_unlock_entrylk_wrapper(frame, &amp;local-&gt;lock[0].ns.directory_ns);</div><div class='ctx'> </div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='add'>+    /* Unlock inodelk */</div><div class='add'>+    lock_count = dht_lock_count(local-&gt;lock[0].ns.parent_layout.locks,</div><div class='add'>+                                local-&gt;lock[0].ns.parent_layout.lk_count);</div><div class='ctx'> </div><div class='add'>+    if (lock_count == 0)</div><div class='add'>+        goto done;</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-dht_rmdir_opendir_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-		       int op_ret, int op_errno, fd_t *fd)</div><div class='add'>+    lock_frame = copy_frame(frame);</div><div class='add'>+    if (lock_frame == NULL)</div><div class='add'>+        goto done;</div><div class='add'>+</div><div class='add'>+    lock_local = dht_local_init(lock_frame, &amp;local-&gt;loc, NULL,</div><div class='add'>+                                lock_frame-&gt;root-&gt;op);</div><div class='add'>+    if (lock_local == NULL)</div><div class='add'>+        goto done;</div><div class='add'>+</div><div class='add'>+    lock_local-&gt;lock[0].ns.parent_layout.locks = local-&gt;lock[0]</div><div class='add'>+                                                     .ns.parent_layout.locks;</div><div class='add'>+    lock_local-&gt;lock[0]</div><div class='add'>+        .ns.parent_layout.lk_count = local-&gt;lock[0].ns.parent_layout.lk_count;</div><div class='add'>+</div><div class='add'>+    local-&gt;lock[0].ns.parent_layout.locks = NULL;</div><div class='add'>+    local-&gt;lock[0].ns.parent_layout.lk_count = 0;</div><div class='add'>+    dht_unlock_inodelk(lock_frame, lock_local-&gt;lock[0].ns.parent_layout.locks,</div><div class='add'>+                       lock_local-&gt;lock[0].ns.parent_layout.lk_count,</div><div class='add'>+                       dht_rmdir_unlock_cbk);</div><div class='add'>+    lock_frame = NULL;</div><div class='add'>+</div><div class='add'>+done:</div><div class='add'>+    if (lock_frame != NULL) {</div><div class='add'>+        DHT_STACK_DESTROY(lock_frame);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+dht_rmdir_cbk(call_frame_t *frame, void *cookie, xlator_t *this, int op_ret,</div><div class='add'>+              int op_errno, struct iatt *preparent, struct iatt *postparent,</div><div class='add'>+              dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-	dht_local_t  *local = NULL;</div><div class='del'>-	int           this_call_cnt = -1;</div><div class='del'>-	call_frame_t *prev = NULL;</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    int this_call_cnt = 0;</div><div class='add'>+    xlator_t *prev = NULL;</div><div class='add'>+    int done = 0;</div><div class='add'>+    char gfid[GF_UUID_BUF_SIZE] = {0};</div><div class='add'>+    dht_local_t *heal_local = NULL;</div><div class='add'>+    call_frame_t *heal_frame = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    prev = cookie;</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;frame-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        if (op_ret == -1) {</div><div class='add'>+            if ((op_errno != ENOENT) &amp;&amp; (op_errno != ESTALE)) {</div><div class='add'>+                local-&gt;op_errno = op_errno;</div><div class='add'>+                local-&gt;op_ret = -1;</div><div class='ctx'> </div><div class='add'>+                if (op_errno != EACCES)</div><div class='add'>+                    local-&gt;need_selfheal = 1;</div><div class='add'>+            }</div><div class='ctx'> </div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-	prev  = cookie;</div><div class='add'>+            gf_uuid_unparse(local-&gt;loc.gfid, gfid);</div><div class='ctx'> </div><div class='del'>-	if (op_ret == -1) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-			"opendir on %s for %s failed (%s)",</div><div class='del'>-			prev-&gt;this-&gt;name, local-&gt;loc.path,</div><div class='del'>-			strerror (op_errno));</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='add'>+            gf_msg_debug(this-&gt;name, op_errno,</div><div class='add'>+                         "rmdir on %s for %s failed."</div><div class='add'>+                         "(gfid = %s)",</div><div class='add'>+                         prev-&gt;name, local-&gt;loc.path, gfid);</div><div class='add'>+            goto unlock;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-	STACK_WIND (frame, dht_rmdir_readdirp_cbk,</div><div class='del'>-		    prev-&gt;this, prev-&gt;this-&gt;fops-&gt;readdirp,</div><div class='del'>-		    local-&gt;fd, 4096, 0);</div><div class='add'>+        /* Track if rmdir succeeded on at least one subvol*/</div><div class='add'>+        local-&gt;fop_succeeded = 1;</div><div class='add'>+        dht_iatt_merge(this, &amp;local-&gt;preparent, preparent);</div><div class='add'>+        dht_iatt_merge(this, &amp;local-&gt;postparent, postparent);</div><div class='add'>+    }</div><div class='add'>+unlock:</div><div class='add'>+    UNLOCK(&amp;frame-&gt;lock);</div><div class='ctx'> </div><div class='del'>-	return 0;</div><div class='add'>+    this_call_cnt = dht_frame_return(frame);</div><div class='ctx'> </div><div class='del'>-err:</div><div class='del'>-	this_call_cnt = dht_frame_return (frame);</div><div class='add'>+    /* if local-&gt;hashed_subvol, we are yet to wind to hashed_subvol. */</div><div class='add'>+    if (local-&gt;hashed_subvol &amp;&amp; (this_call_cnt == 1)) {</div><div class='add'>+        done = 1;</div><div class='add'>+    } else if (!local-&gt;hashed_subvol &amp;&amp; !this_call_cnt) {</div><div class='add'>+        done = 1;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	if (is_last_call (this_call_cnt)) {</div><div class='del'>-		dht_rmdir_do (frame, this);</div><div class='del'>-	}</div><div class='add'>+    if (done) {</div><div class='add'>+        if (local-&gt;need_selfheal &amp;&amp; local-&gt;fop_succeeded) {</div><div class='add'>+            dht_rmdir_unlock(frame, this);</div><div class='add'>+            local-&gt;layout = dht_layout_get(this, local-&gt;loc.inode);</div><div class='ctx'> </div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='add'>+            /* TODO: neater interface needed below */</div><div class='add'>+            local-&gt;stbuf.ia_type = local-&gt;loc.inode-&gt;ia_type;</div><div class='ctx'> </div><div class='add'>+            gf_uuid_copy(local-&gt;gfid, local-&gt;loc.inode-&gt;gfid);</div><div class='add'>+            heal_frame = copy_frame(frame);</div><div class='add'>+            if (heal_frame == NULL) {</div><div class='add'>+                goto err;</div><div class='add'>+            }</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-dht_rmdir (call_frame_t *frame, xlator_t *this, loc_t *loc)</div><div class='del'>-{</div><div class='del'>-	dht_local_t  *local  = NULL;</div><div class='del'>-	dht_conf_t   *conf = NULL;</div><div class='del'>-        int           op_errno = -1;</div><div class='del'>-	int           i = -1;</div><div class='del'>-	int           ret = -1;</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-        VALIDATE_OR_GOTO (frame, err);</div><div class='del'>-        VALIDATE_OR_GOTO (this, err);</div><div class='del'>-        VALIDATE_OR_GOTO (loc, err);</div><div class='del'>-        VALIDATE_OR_GOTO (loc-&gt;inode, err);</div><div class='del'>-        VALIDATE_OR_GOTO (loc-&gt;path, err);</div><div class='del'>-</div><div class='del'>-	conf = this-&gt;private;</div><div class='del'>-</div><div class='del'>-	local = dht_local_init (frame);</div><div class='del'>-	if (!local) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-			"Out of memory");</div><div class='del'>-		op_errno = ENOMEM;</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	local-&gt;call_cnt = conf-&gt;subvolume_cnt;</div><div class='del'>-	local-&gt;op_ret   = 0;</div><div class='del'>-</div><div class='del'>-	ret = loc_copy (&amp;local-&gt;loc, loc);</div><div class='del'>-	if (ret == -1) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-			"Out of memory");</div><div class='del'>-		op_errno = ENOMEM;</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	local-&gt;fd = fd_create (local-&gt;loc.inode, frame-&gt;root-&gt;pid);</div><div class='del'>-	if (!local-&gt;fd) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-			"Out of memory");</div><div class='del'>-		op_errno = ENOMEM;</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	for (i = 0; i &lt; conf-&gt;subvolume_cnt; i++) {</div><div class='del'>-		STACK_WIND (frame, dht_rmdir_opendir_cbk,</div><div class='del'>-			    conf-&gt;subvolumes[i],</div><div class='del'>-			    conf-&gt;subvolumes[i]-&gt;fops-&gt;opendir,</div><div class='del'>-			    loc, local-&gt;fd);</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='add'>+            heal_local = dht_local_init(heal_frame, &amp;local-&gt;loc, NULL, 0);</div><div class='add'>+            if (!heal_local) {</div><div class='add'>+                DHT_STACK_DESTROY(heal_frame);</div><div class='add'>+                goto err;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            heal_local-&gt;inode = inode_ref(local-&gt;loc.inode);</div><div class='add'>+            heal_local-&gt;main_frame = frame;</div><div class='add'>+            gf_uuid_copy(heal_local-&gt;gfid, local-&gt;loc.inode-&gt;gfid);</div><div class='add'>+            ret = dht_selfheal_restore(heal_frame, dht_rmdir_selfheal_cbk,</div><div class='add'>+                                       &amp;heal_local-&gt;loc, heal_local-&gt;layout);</div><div class='add'>+            if (ret) {</div><div class='add'>+                DHT_STACK_DESTROY(heal_frame);</div><div class='add'>+                goto err;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+        } else if (this_call_cnt) {</div><div class='add'>+            /* If non-hashed subvol's have responded, proceed */</div><div class='add'>+            if (local-&gt;op_ret == 0) {</div><div class='add'>+                /* Delete the dir from the hashed subvol if:</div><div class='add'>+                 * The fop succeeded on at least one subvol</div><div class='add'>+                 *  and did not fail on any</div><div class='add'>+                 *  or</div><div class='add'>+                 *  The fop failed with ENOENT/ESTALE on</div><div class='add'>+                 *  all subvols */</div><div class='add'>+</div><div class='add'>+                STACK_WIND_COOKIE(frame, dht_rmdir_hashed_subvol_cbk,</div><div class='add'>+                                  local-&gt;hashed_subvol, local-&gt;hashed_subvol,</div><div class='add'>+                                  local-&gt;hashed_subvol-&gt;fops-&gt;rmdir,</div><div class='add'>+                                  &amp;local-&gt;loc, local-&gt;flags, NULL);</div><div class='add'>+            } else {</div><div class='add'>+                /* hashed-subvol was non-NULL and rmdir failed on</div><div class='add'>+                 * all non hashed-subvols. Unwind rmdir with</div><div class='add'>+                 * local-&gt;op_ret and local-&gt;op_errno. */</div><div class='add'>+                dht_rmdir_unlock(frame, this);</div><div class='add'>+                DHT_STACK_UNWIND(rmdir, frame, local-&gt;op_ret, local-&gt;op_errno,</div><div class='add'>+                                 &amp;local-&gt;preparent, &amp;local-&gt;postparent, NULL);</div><div class='ctx'> </div><div class='del'>-err:</div><div class='del'>-	op_errno = (op_errno == -1) ? errno : op_errno;</div><div class='del'>-	DHT_STACK_UNWIND (rmdir, frame, -1, op_errno,</div><div class='del'>-                          NULL, NULL);</div><div class='add'>+                return 0;</div><div class='add'>+            }</div><div class='add'>+        } else if (!this_call_cnt) {</div><div class='add'>+            /* All subvol's have responded, proceed */</div><div class='ctx'> </div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='add'>+            if (local-&gt;loc.parent) {</div><div class='add'>+                dht_inode_ctx_time_update(local-&gt;loc.parent, this,</div><div class='add'>+                                          &amp;local-&gt;preparent, 0);</div><div class='ctx'> </div><div class='add'>+                dht_inode_ctx_time_update(local-&gt;loc.parent, this,</div><div class='add'>+                                          &amp;local-&gt;postparent, 1);</div><div class='add'>+            }</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-dht_xattrop_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-		 int32_t op_ret, int32_t op_errno, dict_t *dict)</div><div class='del'>-{</div><div class='del'>-	DHT_STACK_UNWIND (xattrop, frame, op_ret, op_errno, dict);</div><div class='del'>-	return 0;</div><div class='add'>+            dht_set_fixed_dir_stat(&amp;local-&gt;preparent);</div><div class='add'>+            dht_set_fixed_dir_stat(&amp;local-&gt;postparent);</div><div class='add'>+</div><div class='add'>+            dht_rmdir_unlock(frame, this);</div><div class='add'>+            DHT_STACK_UNWIND(rmdir, frame, local-&gt;op_ret, local-&gt;op_errno,</div><div class='add'>+                             &amp;local-&gt;preparent, &amp;local-&gt;postparent, NULL);</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+</div><div class='add'>+err:</div><div class='add'>+    DHT_STACK_UNWIND(rmdir, frame, -1, local-&gt;op_errno, NULL, NULL, NULL);</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+static int</div><div class='add'>+dht_rmdir_lock_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                   int32_t op_ret, int32_t op_errno, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    dht_conf_t *conf = NULL;</div><div class='add'>+    int i = 0;</div><div class='add'>+    xlator_t *hashed_subvol;</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-dht_xattrop (call_frame_t *frame, xlator_t *this, loc_t *loc,</div><div class='del'>-	     gf_xattrop_flags_t flags, dict_t *dict)</div><div class='del'>-{</div><div class='del'>-	xlator_t     *subvol = NULL;</div><div class='del'>-        int           op_errno = -1;</div><div class='del'>-	dht_local_t  *local = NULL;</div><div class='del'>-</div><div class='del'>-        VALIDATE_OR_GOTO (frame, err);</div><div class='del'>-        VALIDATE_OR_GOTO (this, err);</div><div class='del'>-        VALIDATE_OR_GOTO (loc, err);</div><div class='del'>-        VALIDATE_OR_GOTO (loc-&gt;inode, err);</div><div class='del'>-        VALIDATE_OR_GOTO (loc-&gt;path, err);</div><div class='del'>-</div><div class='del'>-	subvol = dht_subvol_get_cached (this, loc-&gt;inode);</div><div class='del'>-	if (!subvol) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-			"no cached subvolume for path=%s", loc-&gt;path);</div><div class='del'>-		op_errno = EINVAL;</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	local = dht_local_init (frame);</div><div class='del'>-	if (!local) {</div><div class='del'>-		op_errno = ENOMEM;</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-			"Out of memory");</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	local-&gt;inode = inode_ref (loc-&gt;inode);</div><div class='del'>-	local-&gt;call_cnt = 1;</div><div class='del'>-</div><div class='del'>-	STACK_WIND (frame,</div><div class='del'>-		    dht_xattrop_cbk,</div><div class='del'>-		    subvol, subvol-&gt;fops-&gt;xattrop,</div><div class='del'>-		    loc, flags, dict);</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='add'>+    conf = this-&gt;private;</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+</div><div class='add'>+    if (op_ret &lt; 0) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_WARNING, op_errno, DHT_MSG_INODE_LK_ERROR,</div><div class='add'>+               "acquiring entrylk after inodelk failed rmdir for %s)",</div><div class='add'>+               local-&gt;loc.path);</div><div class='add'>+</div><div class='add'>+        local-&gt;op_ret = -1;</div><div class='add'>+        local-&gt;op_errno = op_errno;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    hashed_subvol = local-&gt;hashed_subvol;</div><div class='add'>+    for (i = 0; i &lt; conf-&gt;subvolume_cnt; i++) {</div><div class='add'>+        if (hashed_subvol &amp;&amp; (hashed_subvol == conf-&gt;subvolumes[i]))</div><div class='add'>+            continue;</div><div class='add'>+</div><div class='add'>+        STACK_WIND_COOKIE(frame, dht_rmdir_cbk, conf-&gt;subvolumes[i],</div><div class='add'>+                          conf-&gt;subvolumes[i], conf-&gt;subvolumes[i]-&gt;fops-&gt;rmdir,</div><div class='add'>+                          &amp;local-&gt;loc, local-&gt;flags, NULL);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='ctx'> </div><div class='ctx'> err:</div><div class='del'>-	op_errno = (op_errno == -1) ? errno : op_errno;</div><div class='del'>-	DHT_STACK_UNWIND (xattrop, frame, -1, op_errno, NULL);</div><div class='add'>+    DHT_STACK_UNWIND(rmdir, frame, local-&gt;op_ret, local-&gt;op_errno,</div><div class='add'>+                     &amp;local-&gt;preparent, &amp;local-&gt;postparent, NULL);</div><div class='ctx'> </div><div class='del'>-	return 0;</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+static int</div><div class='add'>+dht_rmdir_do(call_frame_t *frame, xlator_t *this)</div><div class='add'>+{</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    dht_conf_t *conf = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    xlator_t *hashed_subvol = NULL;</div><div class='add'>+    char gfid[GF_UUID_BUF_SIZE] = {0};</div><div class='add'>+</div><div class='add'>+    VALIDATE_OR_GOTO(frame-&gt;local, err);</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    VALIDATE_OR_GOTO(this-&gt;private, out);</div><div class='add'>+    conf = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    if (local-&gt;op_ret == -1)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    local-&gt;call_cnt = conf-&gt;subvolume_cnt;</div><div class='add'>+</div><div class='add'>+    /* first remove from non-hashed_subvol */</div><div class='add'>+    hashed_subvol = dht_subvol_get_hashed(this, &amp;local-&gt;loc);</div><div class='add'>+</div><div class='add'>+    if (!hashed_subvol) {</div><div class='add'>+        gf_uuid_unparse(local-&gt;loc.gfid, gfid);</div><div class='add'>+</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_WARNING, 0, DHT_MSG_HASHED_SUBVOL_GET_FAILED,</div><div class='add'>+               "Failed to get hashed subvol for %s (gfid = %s)",</div><div class='add'>+               local-&gt;loc.path, gfid);</div><div class='add'>+    } else {</div><div class='add'>+        local-&gt;hashed_subvol = hashed_subvol;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* When DHT has only 1 child */</div><div class='add'>+    if (conf-&gt;subvolume_cnt == 1) {</div><div class='add'>+        STACK_WIND_COOKIE(frame, dht_rmdir_hashed_subvol_cbk,</div><div class='add'>+                          conf-&gt;subvolumes[0], conf-&gt;subvolumes[0],</div><div class='add'>+                          conf-&gt;subvolumes[0]-&gt;fops-&gt;rmdir, &amp;local-&gt;loc,</div><div class='add'>+                          local-&gt;flags, NULL);</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-dht_fxattrop_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-		  int32_t op_ret, int32_t op_errno, dict_t *dict)</div><div class='add'>+    local-&gt;current = &amp;local-&gt;lock[0];</div><div class='add'>+    ret = dht_protect_namespace(frame, &amp;local-&gt;loc, local-&gt;hashed_subvol,</div><div class='add'>+                                &amp;local-&gt;current-&gt;ns, dht_rmdir_lock_cbk);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        local-&gt;op_ret = -1;</div><div class='add'>+        local-&gt;op_errno = errno ? errno : EINVAL;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    dht_set_fixed_dir_stat(&amp;local-&gt;preparent);</div><div class='add'>+    dht_set_fixed_dir_stat(&amp;local-&gt;postparent);</div><div class='add'>+</div><div class='add'>+    DHT_STACK_UNWIND(rmdir, frame, local-&gt;op_ret, local-&gt;op_errno,</div><div class='add'>+                     &amp;local-&gt;preparent, &amp;local-&gt;postparent, NULL);</div><div class='add'>+    return 0;</div><div class='add'>+err:</div><div class='add'>+    DHT_STACK_UNWIND(rmdir, frame, -1, EINVAL, NULL, NULL, NULL);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+dht_rmdir_readdirp_done(call_frame_t *readdirp_frame, xlator_t *this)</div><div class='ctx'> {</div><div class='del'>-	DHT_STACK_UNWIND (fxattrop, frame, op_ret, op_errno, dict);</div><div class='del'>-	return 0;</div><div class='add'>+    call_frame_t *main_frame = NULL;</div><div class='add'>+    dht_local_t *main_local = NULL;</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    int this_call_cnt = 0;</div><div class='add'>+</div><div class='add'>+    local = readdirp_frame-&gt;local;</div><div class='add'>+    main_frame = local-&gt;main_frame;</div><div class='add'>+    main_local = main_frame-&gt;local;</div><div class='add'>+</div><div class='add'>+    /* At least one readdirp failed.</div><div class='add'>+     * This is a bit hit or miss - if readdirp failed on more than</div><div class='add'>+     * one subvol, we don't know which error is returned.</div><div class='add'>+     */</div><div class='add'>+    if (local-&gt;op_ret == -1) {</div><div class='add'>+        main_local-&gt;op_ret = local-&gt;op_ret;</div><div class='add'>+        main_local-&gt;op_errno = local-&gt;op_errno;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    this_call_cnt = dht_frame_return(main_frame);</div><div class='add'>+</div><div class='add'>+    if (is_last_call(this_call_cnt))</div><div class='add'>+        dht_rmdir_do(main_frame, this);</div><div class='add'>+</div><div class='add'>+    DHT_STACK_DESTROY(readdirp_frame);</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+/* Keep sending readdirp on the subvol until it returns no more entries</div><div class='add'>+ * It is possible that not all entries will fit in a single readdirp in</div><div class='add'>+ * which case the rmdir will keep failing with ENOTEMPTY</div><div class='add'>+ */</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-dht_fxattrop (call_frame_t *frame, xlator_t *this,</div><div class='del'>-	      fd_t *fd, gf_xattrop_flags_t flags, dict_t *dict)</div><div class='add'>+static int</div><div class='add'>+dht_rmdir_readdirp_do(call_frame_t *readdirp_frame, xlator_t *this)</div><div class='ctx'> {</div><div class='del'>-	xlator_t     *subvol = NULL;</div><div class='del'>-        int           op_errno = -1;</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='ctx'> </div><div class='del'>-        VALIDATE_OR_GOTO (frame, err);</div><div class='del'>-        VALIDATE_OR_GOTO (this, err);</div><div class='del'>-        VALIDATE_OR_GOTO (fd, err);</div><div class='add'>+    local = readdirp_frame-&gt;local;</div><div class='ctx'> </div><div class='del'>-	subvol = dht_subvol_get_cached (this, fd-&gt;inode);</div><div class='del'>-	if (!subvol) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-			"no cached subvolume for fd=%p", fd);</div><div class='del'>-		op_errno = EINVAL;</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='add'>+    if (local-&gt;op_ret == -1) {</div><div class='add'>+        /* there is no point doing another readdirp on this</div><div class='add'>+         * subvol . */</div><div class='add'>+        dht_rmdir_readdirp_done(readdirp_frame, this);</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	STACK_WIND (frame,</div><div class='del'>-		    dht_fxattrop_cbk,</div><div class='del'>-		    subvol, subvol-&gt;fops-&gt;fxattrop,</div><div class='del'>-		    fd, flags, dict);</div><div class='add'>+    STACK_WIND_COOKIE(readdirp_frame, dht_rmdir_readdirp_cbk,</div><div class='add'>+                      local-&gt;hashed_subvol, local-&gt;hashed_subvol,</div><div class='add'>+                      local-&gt;hashed_subvol-&gt;fops-&gt;readdirp, local-&gt;fd, 4096, 0,</div><div class='add'>+                      local-&gt;xattr);</div><div class='ctx'> </div><div class='del'>-	return 0;</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-err:</div><div class='del'>-	op_errno = (op_errno == -1) ? errno : op_errno;</div><div class='del'>-	DHT_STACK_UNWIND (fxattrop, frame, -1, op_errno, NULL);</div><div class='add'>+static int</div><div class='add'>+dht_rmdir_linkfile_unlink_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                              int op_ret, int op_errno, struct iatt *preparent,</div><div class='add'>+                              struct iatt *postparent, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    xlator_t *prev = NULL;</div><div class='add'>+    xlator_t *src = NULL;</div><div class='add'>+    call_frame_t *readdirp_frame = NULL;</div><div class='add'>+    dht_local_t *readdirp_local = NULL;</div><div class='add'>+    int this_call_cnt = 0;</div><div class='add'>+    char gfid[GF_UUID_BUF_SIZE] = {0};</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    prev = cookie;</div><div class='add'>+    src = prev;</div><div class='add'>+</div><div class='add'>+    readdirp_frame = local-&gt;main_frame;</div><div class='add'>+    readdirp_local = readdirp_frame-&gt;local;</div><div class='add'>+</div><div class='add'>+    gf_uuid_unparse(local-&gt;loc.gfid, gfid);</div><div class='add'>+</div><div class='add'>+    if (op_ret == 0) {</div><div class='add'>+        gf_msg_trace(this-&gt;name, 0, "Unlinked linkfile %s on %s, gfid = %s",</div><div class='add'>+                     local-&gt;loc.path, src-&gt;name, gfid);</div><div class='add'>+    } else {</div><div class='add'>+        if (op_errno != ENOENT) {</div><div class='add'>+            readdirp_local-&gt;op_ret = -1;</div><div class='add'>+            readdirp_local-&gt;op_errno = op_errno;</div><div class='add'>+        }</div><div class='add'>+        gf_msg_debug(this-&gt;name, op_errno,</div><div class='add'>+                     "Unlink of %s on %s failed. (gfid = %s)", local-&gt;loc.path,</div><div class='add'>+                     src-&gt;name, gfid);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	return 0;</div><div class='add'>+    this_call_cnt = dht_frame_return(readdirp_frame);</div><div class='add'>+</div><div class='add'>+    if (is_last_call(this_call_cnt))</div><div class='add'>+        dht_rmdir_readdirp_do(readdirp_frame, this);</div><div class='add'>+</div><div class='add'>+    DHT_STACK_DESTROY(frame);</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+static int</div><div class='add'>+dht_rmdir_lookup_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                     int op_ret, int op_errno, inode_t *inode,</div><div class='add'>+                     struct iatt *stbuf, dict_t *xattr, struct iatt *parent)</div><div class='add'>+{</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    xlator_t *prev = NULL;</div><div class='add'>+    xlator_t *src = NULL;</div><div class='add'>+    call_frame_t *readdirp_frame = NULL;</div><div class='add'>+    dht_local_t *readdirp_local = NULL;</div><div class='add'>+    int this_call_cnt = 0;</div><div class='add'>+    dht_conf_t *conf = this-&gt;private;</div><div class='add'>+    char gfid[GF_UUID_BUF_SIZE] = {0};</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    prev = cookie;</div><div class='add'>+    src = prev;</div><div class='add'>+</div><div class='add'>+    gf_msg_debug(this-&gt;name, 0, "dht_rmdir_lookup_cbk %s", local-&gt;loc.path);</div><div class='add'>+</div><div class='add'>+    readdirp_frame = local-&gt;main_frame;</div><div class='add'>+    readdirp_local = readdirp_frame-&gt;local;</div><div class='add'>+</div><div class='add'>+    if (op_ret != 0) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_WARNING, op_errno, DHT_MSG_FILE_LOOKUP_FAILED,</div><div class='add'>+               "lookup failed for %s on %s", local-&gt;loc.path, src-&gt;name);</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (!check_is_linkfile(inode, stbuf, xattr, conf-&gt;link_xattr_name)) {</div><div class='add'>+        readdirp_local-&gt;op_ret = -1;</div><div class='add'>+        readdirp_local-&gt;op_errno = ENOTEMPTY;</div><div class='add'>+</div><div class='add'>+        gf_uuid_unparse(local-&gt;loc.gfid, gfid);</div><div class='add'>+</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_WARNING, 0, DHT_MSG_NOT_LINK_FILE_ERROR,</div><div class='add'>+               "%s on %s is not a linkfile (type=0%o, gfid = %s)",</div><div class='add'>+               local-&gt;loc.path, src-&gt;name, stbuf-&gt;ia_type, gfid);</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    STACK_WIND_COOKIE(frame, dht_rmdir_linkfile_unlink_cbk, src, src,</div><div class='add'>+                      src-&gt;fops-&gt;unlink, &amp;local-&gt;loc, 0, NULL);</div><div class='add'>+    return 0;</div><div class='add'>+err:</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-dht_inodelk_cbk (call_frame_t *frame, void *cookie,</div><div class='del'>-		 xlator_t *this, int32_t op_ret, int32_t op_errno)</div><div class='add'>+    this_call_cnt = dht_frame_return(readdirp_frame);</div><div class='add'>+    if (is_last_call(this_call_cnt)) {</div><div class='add'>+        dht_rmdir_readdirp_do(readdirp_frame, this);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    DHT_STACK_DESTROY(frame);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='add'>+static int</div><div class='add'>+dht_rmdir_cached_lookup_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                            int op_ret, int op_errno, inode_t *inode,</div><div class='add'>+                            struct iatt *stbuf, dict_t *xattr,</div><div class='add'>+                            struct iatt *parent)</div><div class='ctx'> {</div><div class='del'>-	DHT_STACK_UNWIND (inodelk, frame, op_ret, op_errno);</div><div class='del'>-	return 0;</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    xlator_t *src = NULL;</div><div class='add'>+    call_frame_t *readdirp_frame = NULL;</div><div class='add'>+    dht_local_t *readdirp_local = NULL;</div><div class='add'>+    int this_call_cnt = 0;</div><div class='add'>+    dht_conf_t *conf = this-&gt;private;</div><div class='add'>+    dict_t *xattrs = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    src = local-&gt;hashed_subvol;</div><div class='add'>+</div><div class='add'>+    /* main_frame here is the readdirp_frame */</div><div class='add'>+</div><div class='add'>+    readdirp_frame = local-&gt;main_frame;</div><div class='add'>+    readdirp_local = readdirp_frame-&gt;local;</div><div class='add'>+</div><div class='add'>+    gf_msg_debug(this-&gt;name, 0, "returning for %s ", local-&gt;loc.path);</div><div class='add'>+</div><div class='add'>+    if (op_ret == 0) {</div><div class='add'>+        readdirp_local-&gt;op_ret = -1;</div><div class='add'>+        readdirp_local-&gt;op_errno = ENOTEMPTY;</div><div class='add'>+</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_WARNING, 0, DHT_MSG_SUBVOL_ERROR,</div><div class='add'>+               "%s found on cached subvol %s", local-&gt;loc.path, src-&gt;name);</div><div class='add'>+        goto err;</div><div class='add'>+    } else if (op_errno != ENOENT) {</div><div class='add'>+        readdirp_local-&gt;op_ret = -1;</div><div class='add'>+        readdirp_local-&gt;op_errno = op_errno;</div><div class='add'>+</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_WARNING, op_errno, DHT_MSG_SUBVOL_ERROR,</div><div class='add'>+               "%s not found on cached subvol %s", local-&gt;loc.path, src-&gt;name);</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    xattrs = dict_new();</div><div class='add'>+    if (!xattrs) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_ERROR, ENOMEM, DHT_MSG_NO_MEMORY,</div><div class='add'>+               "dict_new failed");</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_set_uint32(xattrs, conf-&gt;link_xattr_name, 256);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_ERROR, 0, DHT_MSG_DICT_SET_FAILED,</div><div class='add'>+               "Failed to set dictionary value: key = %s",</div><div class='add'>+               conf-&gt;link_xattr_name);</div><div class='add'>+        if (xattrs)</div><div class='add'>+            dict_unref(xattrs);</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+    STACK_WIND_COOKIE(frame, dht_rmdir_lookup_cbk, src, src, src-&gt;fops-&gt;lookup,</div><div class='add'>+                      &amp;local-&gt;loc, xattrs);</div><div class='add'>+    if (xattrs)</div><div class='add'>+        dict_unref(xattrs);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+err:</div><div class='add'>+</div><div class='add'>+    this_call_cnt = dht_frame_return(readdirp_frame);</div><div class='add'>+</div><div class='add'>+    /* Once all the lookups/unlinks etc have returned, proceed to wind</div><div class='add'>+     * readdirp on the subvol again until no entries are returned.</div><div class='add'>+     * This is required if there are more entries than can be returned</div><div class='add'>+     * in a single readdirp call.</div><div class='add'>+     */</div><div class='add'>+</div><div class='add'>+    if (is_last_call(this_call_cnt))</div><div class='add'>+        dht_rmdir_readdirp_do(readdirp_frame, this);</div><div class='add'>+</div><div class='add'>+    DHT_STACK_DESTROY(frame);</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+static int</div><div class='add'>+dht_rmdir_is_subvol_empty(call_frame_t *frame, xlator_t *this,</div><div class='add'>+                          gf_dirent_t *entries, xlator_t *src)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+    int build_ret = 0;</div><div class='add'>+    gf_dirent_t *trav = NULL;</div><div class='add'>+    call_frame_t *lookup_frame = NULL;</div><div class='add'>+    dht_local_t *lookup_local = NULL;</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    dict_t *xattrs = NULL;</div><div class='add'>+    dht_conf_t *conf = this-&gt;private;</div><div class='add'>+    xlator_t *subvol = NULL;</div><div class='add'>+    char gfid[GF_UUID_BUF_SIZE] = {0};</div><div class='add'>+    int count = 0;</div><div class='add'>+    gf_boolean_t unwind = _gf_false;</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+</div><div class='add'>+    list_for_each_entry(trav, &amp;entries-&gt;list, list)</div><div class='add'>+    {</div><div class='add'>+        if (strcmp(trav-&gt;d_name, ".") == 0)</div><div class='add'>+            continue;</div><div class='add'>+        if (strcmp(trav-&gt;d_name, "..") == 0)</div><div class='add'>+            continue;</div><div class='add'>+        if (check_is_linkfile(NULL, (&amp;trav-&gt;d_stat), trav-&gt;dict,</div><div class='add'>+                              conf-&gt;link_xattr_name)) {</div><div class='add'>+            count++;</div><div class='add'>+            continue;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-int32_t</div><div class='del'>-dht_inodelk (call_frame_t *frame, xlator_t *this,</div><div class='del'>-	     const char *volume, loc_t *loc, int32_t cmd, struct flock *lock)</div><div class='del'>-{</div><div class='del'>-	xlator_t     *subvol = NULL;</div><div class='del'>-        int           op_errno = -1;</div><div class='del'>-	dht_local_t  *local = NULL;</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-        VALIDATE_OR_GOTO (frame, err);</div><div class='del'>-        VALIDATE_OR_GOTO (this, err);</div><div class='del'>-        VALIDATE_OR_GOTO (loc, err);</div><div class='del'>-        VALIDATE_OR_GOTO (loc-&gt;inode, err);</div><div class='del'>-        VALIDATE_OR_GOTO (loc-&gt;path, err);</div><div class='del'>-</div><div class='del'>-	subvol = dht_subvol_get_cached (this, loc-&gt;inode);</div><div class='del'>-	if (!subvol) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-			"no cached subvolume for path=%s", loc-&gt;path);</div><div class='del'>-		op_errno = EINVAL;</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	local = dht_local_init (frame);</div><div class='del'>-	if (!local) {</div><div class='del'>-		op_errno = ENOMEM;</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-			"Out of memory");</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	local-&gt;inode = inode_ref (loc-&gt;inode);</div><div class='del'>-	local-&gt;call_cnt = 1;</div><div class='del'>-</div><div class='del'>-	STACK_WIND (frame,</div><div class='del'>-		    dht_inodelk_cbk,</div><div class='del'>-		    subvol, subvol-&gt;fops-&gt;inodelk,</div><div class='del'>-		    volume, loc, cmd, lock);</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='add'>+        /* this entry is either a directory which is neither "." nor "..",</div><div class='add'>+           or a non directory which is not a linkfile. the directory is to</div><div class='add'>+           be treated as non-empty</div><div class='add'>+        */</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    xattrs = dict_new();</div><div class='add'>+    if (!xattrs) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_ERROR, ENOMEM, DHT_MSG_NO_MEMORY,</div><div class='add'>+               "dict_new failed");</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_set_uint32(xattrs, conf-&gt;link_xattr_name, 256);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_ERROR, 0, DHT_MSG_DICT_SET_FAILED,</div><div class='add'>+               "Failed to set dictionary value: key = %s",</div><div class='add'>+               conf-&gt;link_xattr_name);</div><div class='add'>+</div><div class='add'>+        if (xattrs)</div><div class='add'>+            dict_unref(xattrs);</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    local-&gt;call_cnt = count;</div><div class='add'>+    ret = 0;</div><div class='add'>+</div><div class='add'>+    list_for_each_entry(trav, &amp;entries-&gt;list, list)</div><div class='add'>+    {</div><div class='add'>+        if (strcmp(trav-&gt;d_name, ".") == 0)</div><div class='add'>+            continue;</div><div class='add'>+        if (strcmp(trav-&gt;d_name, "..") == 0)</div><div class='add'>+            continue;</div><div class='add'>+</div><div class='add'>+        lookup_frame = copy_frame(frame);</div><div class='add'>+</div><div class='add'>+        if (!lookup_frame) {</div><div class='add'>+            /* out of memory, let the rmdir fail</div><div class='add'>+               (as non-empty, unfortunately) */</div><div class='add'>+            goto err;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        lookup_local = dht_local_init(lookup_frame, NULL, NULL, GF_FOP_LOOKUP);</div><div class='add'>+        if (!lookup_local) {</div><div class='add'>+            goto err;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        lookup_frame-&gt;local = lookup_local;</div><div class='add'>+        lookup_local-&gt;main_frame = frame;</div><div class='add'>+        lookup_local-&gt;hashed_subvol = src;</div><div class='add'>+</div><div class='add'>+        build_ret = dht_build_child_loc(this, &amp;lookup_local-&gt;loc, &amp;local-&gt;loc,</div><div class='add'>+                                        trav-&gt;d_name);</div><div class='add'>+        if (build_ret != 0)</div><div class='add'>+            goto err;</div><div class='add'>+</div><div class='add'>+        gf_uuid_copy(lookup_local-&gt;loc.gfid, trav-&gt;d_stat.ia_gfid);</div><div class='ctx'> </div><div class='add'>+        gf_uuid_unparse(lookup_local-&gt;loc.gfid, gfid);</div><div class='add'>+</div><div class='add'>+        gf_msg_trace(this-&gt;name, 0, "looking up %s on subvolume %s, gfid = %s",</div><div class='add'>+                     lookup_local-&gt;loc.path, src-&gt;name, gfid);</div><div class='add'>+</div><div class='add'>+        subvol = dht_linkfile_subvol(this, NULL, &amp;trav-&gt;d_stat, trav-&gt;dict);</div><div class='add'>+        if (!subvol || (subvol == src)) {</div><div class='add'>+            /* we need to delete the linkto file if it does not have a</div><div class='add'>+             * valid subvol or it points to itself.</div><div class='add'>+             */</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_INFO, 0, DHT_MSG_INVALID_LINKFILE,</div><div class='add'>+                   "Linkfile does not have link subvolume. "</div><div class='add'>+                   "path = %s, gfid = %s",</div><div class='add'>+                   lookup_local-&gt;loc.path, gfid);</div><div class='add'>+</div><div class='add'>+            gf_msg_debug(this-&gt;name, 0, "looking up %s on subvol %s, gfid = %s",</div><div class='add'>+                         lookup_local-&gt;loc.path, src-&gt;name, gfid);</div><div class='add'>+</div><div class='add'>+            STACK_WIND_COOKIE(lookup_frame, dht_rmdir_lookup_cbk, src, src,</div><div class='add'>+                              src-&gt;fops-&gt;lookup, &amp;lookup_local-&gt;loc, xattrs);</div><div class='add'>+        } else {</div><div class='add'>+            gf_msg_debug(this-&gt;name, 0,</div><div class='add'>+                         "Looking up linkfile target %s on "</div><div class='add'>+                         " subvol %s, gfid = %s",</div><div class='add'>+                         lookup_local-&gt;loc.path, subvol-&gt;name, gfid);</div><div class='add'>+</div><div class='add'>+            STACK_WIND(lookup_frame, dht_rmdir_cached_lookup_cbk, subvol,</div><div class='add'>+                       subvol-&gt;fops-&gt;lookup, &amp;lookup_local-&gt;loc, xattrs);</div><div class='add'>+        }</div><div class='add'>+        ret++;</div><div class='add'>+</div><div class='add'>+        lookup_frame = NULL;</div><div class='add'>+        lookup_local = NULL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (xattrs)</div><div class='add'>+        dict_unref(xattrs);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='ctx'> err:</div><div class='del'>-	op_errno = (op_errno == -1) ? errno : op_errno;</div><div class='del'>-	DHT_STACK_UNWIND (inodelk, frame, -1, op_errno);</div><div class='add'>+    if (xattrs)</div><div class='add'>+        dict_unref(xattrs);</div><div class='ctx'> </div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='add'>+    if (lookup_frame)</div><div class='add'>+        DHT_STACK_DESTROY(lookup_frame);</div><div class='ctx'> </div><div class='add'>+    /* Handle the case where the wound calls have unwound before the</div><div class='add'>+     * loop processing is done</div><div class='add'>+     */</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-dht_finodelk_cbk (call_frame_t *frame, void *cookie,</div><div class='del'>-		  xlator_t *this, int32_t op_ret, int32_t op_errno)</div><div class='add'>+    LOCK(&amp;frame-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        local-&gt;op_ret = -1;</div><div class='add'>+        local-&gt;op_errno = ENOTEMPTY;</div><div class='ctx'> </div><div class='del'>-{</div><div class='del'>-	DHT_STACK_UNWIND (finodelk, frame, op_ret, op_errno);</div><div class='del'>-	return 0;</div><div class='add'>+        local-&gt;call_cnt -= (count - ret);</div><div class='add'>+        if (!local-&gt;call_cnt)</div><div class='add'>+            unwind = _gf_true;</div><div class='add'>+    }</div><div class='add'>+    UNLOCK(&amp;frame-&gt;lock);</div><div class='add'>+</div><div class='add'>+    if (!unwind) {</div><div class='add'>+        return ret;</div><div class='add'>+    }</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+/*</div><div class='add'>+ * No more entries on this subvol. Proceed to the actual rmdir operation.</div><div class='add'>+ */</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-dht_finodelk (call_frame_t *frame, xlator_t *this,</div><div class='del'>-	      const char *volume, fd_t *fd, int32_t cmd, struct flock *lock)</div><div class='add'>+static int</div><div class='add'>+dht_rmdir_readdirp_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                       int op_ret, int op_errno, gf_dirent_t *entries,</div><div class='add'>+                       dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    xlator_t *prev = NULL;</div><div class='add'>+    xlator_t *src = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    char *path = NULL;</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    prev = cookie;</div><div class='add'>+    src = prev;</div><div class='add'>+</div><div class='add'>+    if (op_ret &gt; 2) {</div><div class='add'>+        /* dht_rmdir_is_subvol_empty() may free the frame,</div><div class='add'>+         * copy path for logging.</div><div class='add'>+         */</div><div class='add'>+        path = gf_strdup(local-&gt;loc.path);</div><div class='add'>+</div><div class='add'>+        ret = dht_rmdir_is_subvol_empty(frame, this, entries, src);</div><div class='add'>+</div><div class='add'>+        switch (ret) {</div><div class='add'>+            case 0: /* non linkfiles exist */</div><div class='add'>+                gf_msg_trace(this-&gt;name, 0,</div><div class='add'>+                             "readdir on %s for %s returned %d "</div><div class='add'>+                             "entries",</div><div class='add'>+                             prev-&gt;name, local-&gt;loc.path, op_ret);</div><div class='add'>+                local-&gt;op_ret = -1;</div><div class='add'>+                local-&gt;op_errno = ENOTEMPTY;</div><div class='add'>+                break;</div><div class='add'>+            default:</div><div class='add'>+                /* @ret number of linkfiles are getting unlinked */</div><div class='add'>+                gf_msg_trace(this-&gt;name, 0,</div><div class='add'>+                             "readdir on %s for %s found %d "</div><div class='add'>+                             "linkfiles",</div><div class='add'>+                             prev-&gt;name, path, ret);</div><div class='add'>+                break;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* readdirp failed or no linkto files were found on this subvol */</div><div class='add'>+    if (!ret)</div><div class='add'>+        dht_rmdir_readdirp_done(frame, this);</div><div class='add'>+</div><div class='add'>+    GF_FREE(path);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+dht_rmdir_opendir_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                      int op_ret, int op_errno, fd_t *fd, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-	xlator_t     *subvol = NULL;</div><div class='del'>-        int           op_errno = -1;</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    int this_call_cnt = -1;</div><div class='add'>+    xlator_t *prev = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    dht_conf_t *conf = this-&gt;private;</div><div class='add'>+    dict_t *dict = NULL;</div><div class='add'>+    int i = 0;</div><div class='add'>+    char gfid[GF_UUID_BUF_SIZE] = {0};</div><div class='add'>+    dht_local_t *readdirp_local = NULL;</div><div class='add'>+    call_frame_t *readdirp_frame = NULL;</div><div class='add'>+    int cnt = 0;</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    prev = cookie;</div><div class='add'>+</div><div class='add'>+    this_call_cnt = dht_frame_return(frame);</div><div class='add'>+    if (op_ret == -1) {</div><div class='add'>+        gf_uuid_unparse(local-&gt;loc.gfid, gfid);</div><div class='add'>+</div><div class='add'>+        gf_msg_debug(this-&gt;name, op_errno,</div><div class='add'>+                     "opendir on %s for %s failed, "</div><div class='add'>+                     "gfid = %s,",</div><div class='add'>+                     prev-&gt;name, local-&gt;loc.path, gfid);</div><div class='add'>+        if ((op_errno != ENOENT) &amp;&amp; (op_errno != ESTALE)) {</div><div class='add'>+            local-&gt;op_ret = -1;</div><div class='add'>+            local-&gt;op_errno = op_errno;</div><div class='add'>+        }</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (!is_last_call(this_call_cnt))</div><div class='add'>+        return 0;</div><div class='add'>+</div><div class='add'>+    if (local-&gt;op_ret == -1)</div><div class='add'>+        goto err;</div><div class='add'>+</div><div class='add'>+    fd_bind(fd);</div><div class='add'>+</div><div class='add'>+    dict = dict_new();</div><div class='add'>+    if (!dict) {</div><div class='add'>+        local-&gt;op_ret = -1;</div><div class='add'>+        local-&gt;op_errno = ENOMEM;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_set_uint32(dict, conf-&gt;link_xattr_name, 256);</div><div class='add'>+    if (ret)</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_WARNING, 0, DHT_MSG_DICT_SET_FAILED,</div><div class='add'>+               "%s: Failed to set dictionary value:key = %s", local-&gt;loc.path,</div><div class='add'>+               conf-&gt;link_xattr_name);</div><div class='add'>+</div><div class='add'>+    cnt = local-&gt;call_cnt = conf-&gt;subvolume_cnt;</div><div class='add'>+</div><div class='add'>+    /* Create a separate frame per subvol as we might need</div><div class='add'>+     * to resend readdirp multiple times to get all the</div><div class='add'>+     * entries.</div><div class='add'>+     */</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; conf-&gt;subvolume_cnt; i++) {</div><div class='add'>+        readdirp_frame = copy_frame(frame);</div><div class='add'>+</div><div class='add'>+        if (!readdirp_frame) {</div><div class='add'>+            cnt--;</div><div class='add'>+            /* Reduce the local-&gt;call_cnt as well */</div><div class='add'>+            (void)dht_frame_return(frame);</div><div class='add'>+            continue;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        readdirp_local = dht_local_init(readdirp_frame, &amp;local-&gt;loc, local-&gt;fd,</div><div class='add'>+                                        0);</div><div class='add'>+</div><div class='add'>+        if (!readdirp_local) {</div><div class='add'>+            DHT_STACK_DESTROY(readdirp_frame);</div><div class='add'>+            cnt--;</div><div class='add'>+            /* Reduce the local-&gt;call_cnt as well */</div><div class='add'>+            dht_frame_return(frame);</div><div class='add'>+            continue;</div><div class='add'>+        }</div><div class='add'>+        readdirp_local-&gt;main_frame = frame;</div><div class='add'>+        readdirp_local-&gt;op_ret = 0;</div><div class='add'>+        readdirp_local-&gt;xattr = dict_ref(dict);</div><div class='add'>+        /* overload this field to save the subvol info */</div><div class='add'>+        readdirp_local-&gt;hashed_subvol = conf-&gt;subvolumes[i];</div><div class='ctx'> </div><div class='del'>-        VALIDATE_OR_GOTO (frame, err);</div><div class='del'>-        VALIDATE_OR_GOTO (this, err);</div><div class='del'>-        VALIDATE_OR_GOTO (fd, err);</div><div class='add'>+        STACK_WIND_COOKIE(readdirp_frame, dht_rmdir_readdirp_cbk,</div><div class='add'>+                          conf-&gt;subvolumes[i], conf-&gt;subvolumes[i],</div><div class='add'>+                          conf-&gt;subvolumes[i]-&gt;fops-&gt;readdirp,</div><div class='add'>+                          readdirp_local-&gt;fd, 4096, 0, readdirp_local-&gt;xattr);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	subvol = dht_subvol_get_cached (this, fd-&gt;inode);</div><div class='del'>-	if (!subvol) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-			"no cached subvolume for fd=%p", fd);</div><div class='del'>-		op_errno = EINVAL;</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='add'>+    if (dict)</div><div class='add'>+        dict_unref(dict);</div><div class='ctx'> </div><div class='add'>+    /* Could not wind readdirp to any subvol */</div><div class='ctx'> </div><div class='del'>-	STACK_WIND (frame,</div><div class='del'>-		    dht_finodelk_cbk,</div><div class='del'>-		    subvol, subvol-&gt;fops-&gt;finodelk,</div><div class='del'>-		    volume, fd, cmd, lock);</div><div class='add'>+    if (!cnt)</div><div class='add'>+        goto err;</div><div class='ctx'> </div><div class='del'>-	return 0;</div><div class='add'>+    return 0;</div><div class='ctx'> </div><div class='ctx'> err:</div><div class='del'>-	op_errno = (op_errno == -1) ? errno : op_errno;</div><div class='del'>-	DHT_STACK_UNWIND (finodelk, frame, -1, op_errno);</div><div class='add'>+    if (is_last_call(this_call_cnt)) {</div><div class='add'>+        dht_rmdir_do(frame, this);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	return 0;</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-dht_entrylk_cbk (call_frame_t *frame, void *cookie,</div><div class='del'>-		 xlator_t *this, int32_t op_ret, int32_t op_errno)</div><div class='del'>-</div><div class='add'>+dht_rmdir(call_frame_t *frame, xlator_t *this, loc_t *loc, int flags,</div><div class='add'>+          dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-	DHT_STACK_UNWIND (entrylk, frame, op_ret, op_errno);</div><div class='del'>-	return 0;</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    dht_conf_t *conf = NULL;</div><div class='add'>+    int op_errno = -1;</div><div class='add'>+    int i = -1;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    dict_t *xattr_req = NULL;</div><div class='add'>+</div><div class='add'>+    VALIDATE_OR_GOTO(frame, err);</div><div class='add'>+    VALIDATE_OR_GOTO(this, err);</div><div class='add'>+    VALIDATE_OR_GOTO(loc, err);</div><div class='add'>+    VALIDATE_OR_GOTO(loc-&gt;inode, err);</div><div class='add'>+    VALIDATE_OR_GOTO(loc-&gt;path, err);</div><div class='add'>+    VALIDATE_OR_GOTO(this-&gt;private, err);</div><div class='add'>+</div><div class='add'>+    conf = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    local = dht_local_init(frame, loc, NULL, GF_FOP_RMDIR);</div><div class='add'>+    if (!local) {</div><div class='add'>+        op_errno = ENOMEM;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    local-&gt;call_cnt = conf-&gt;subvolume_cnt;</div><div class='add'>+    local-&gt;op_ret = 0;</div><div class='add'>+    local-&gt;fop_succeeded = 0;</div><div class='add'>+</div><div class='add'>+    local-&gt;flags = flags;</div><div class='add'>+</div><div class='add'>+    local-&gt;fd = fd_create(local-&gt;loc.inode, frame-&gt;root-&gt;pid);</div><div class='add'>+    if (!local-&gt;fd) {</div><div class='add'>+        op_errno = ENOMEM;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (flags) {</div><div class='add'>+        return dht_rmdir_do(frame, this);</div><div class='add'>+    }</div><div class='add'>+    if (xdata) {</div><div class='add'>+        xattr_req = dict_ref(xdata);</div><div class='add'>+    } else {</div><div class='add'>+        xattr_req = dict_new();</div><div class='add'>+    }</div><div class='add'>+    if (xattr_req) {</div><div class='add'>+        ret = dict_set_uint32(xattr_req, conf-&gt;link_xattr_name, 256);</div><div class='add'>+        /* If parallel-readdir is enabled, this is required</div><div class='add'>+         * to handle stale linkto files in the directory</div><div class='add'>+         * being deleted. If this fails, log an error but</div><div class='add'>+         * do not prevent the operation.</div><div class='add'>+         */</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, 0, 0, "%s: failed to set key %s",</div><div class='add'>+                   loc-&gt;path, conf-&gt;link_xattr_name);</div><div class='add'>+        }</div><div class='add'>+    } else {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_ERROR, 0, 0, "%s: failed to set key %s",</div><div class='add'>+               loc-&gt;path, conf-&gt;link_xattr_name);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; conf-&gt;subvolume_cnt; i++) {</div><div class='add'>+        STACK_WIND_COOKIE(frame, dht_rmdir_opendir_cbk, conf-&gt;subvolumes[i],</div><div class='add'>+                          conf-&gt;subvolumes[i],</div><div class='add'>+                          conf-&gt;subvolumes[i]-&gt;fops-&gt;opendir, loc, local-&gt;fd,</div><div class='add'>+                          xattr_req);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (xattr_req) {</div><div class='add'>+        dict_unref(xattr_req);</div><div class='add'>+    }</div><div class='add'>+    return 0;</div><div class='add'>+</div><div class='add'>+err:</div><div class='add'>+    op_errno = (op_errno == -1) ? errno : op_errno;</div><div class='add'>+    DHT_STACK_UNWIND(rmdir, frame, -1, op_errno, NULL, NULL, NULL);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+static int</div><div class='add'>+dht_entrylk_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                int32_t op_ret, int32_t op_errno, dict_t *xdata)</div><div class='ctx'> </div><div class='add'>+{</div><div class='add'>+    DHT_STACK_UNWIND(entrylk, frame, op_ret, op_errno, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* TODO</div><div class='add'>+ * Sending entrylk to cached subvol can result in stale lock</div><div class='add'>+ * as described in the bug 1311002.</div><div class='add'>+ */</div><div class='ctx'> int</div><div class='del'>-dht_entrylk (call_frame_t *frame, xlator_t *this,</div><div class='del'>-	     const char *volume, loc_t *loc, const char *basename,</div><div class='del'>-	     entrylk_cmd cmd, entrylk_type type)</div><div class='del'>-{</div><div class='del'>-	xlator_t     *subvol = NULL;</div><div class='del'>-        int           op_errno = -1;</div><div class='del'>-	dht_local_t  *local = NULL;</div><div class='del'>-</div><div class='del'>-        VALIDATE_OR_GOTO (frame, err);</div><div class='del'>-        VALIDATE_OR_GOTO (this, err);</div><div class='del'>-        VALIDATE_OR_GOTO (loc, err);</div><div class='del'>-        VALIDATE_OR_GOTO (loc-&gt;inode, err);</div><div class='del'>-        VALIDATE_OR_GOTO (loc-&gt;path, err);</div><div class='del'>-</div><div class='del'>-	subvol = dht_subvol_get_cached (this, loc-&gt;inode);</div><div class='del'>-	if (!subvol) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-			"no cached subvolume for path=%s", loc-&gt;path);</div><div class='del'>-		op_errno = EINVAL;</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	local = dht_local_init (frame);</div><div class='del'>-	if (!local) {</div><div class='del'>-		op_errno = ENOMEM;</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-			"Out of memory");</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	local-&gt;inode = inode_ref (loc-&gt;inode);</div><div class='del'>-	local-&gt;call_cnt = 1;</div><div class='del'>-</div><div class='del'>-	STACK_WIND (frame, dht_entrylk_cbk,</div><div class='del'>-		    subvol, subvol-&gt;fops-&gt;entrylk,</div><div class='del'>-		    volume, loc, basename, cmd, type);</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='add'>+dht_entrylk(call_frame_t *frame, xlator_t *this, const char *volume, loc_t *loc,</div><div class='add'>+            const char *basename, entrylk_cmd cmd, entrylk_type type,</div><div class='add'>+            dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    xlator_t *subvol = NULL;</div><div class='add'>+    int op_errno = -1;</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    char gfid[GF_UUID_BUF_SIZE] = {0};</div><div class='add'>+</div><div class='add'>+    VALIDATE_OR_GOTO(frame, err);</div><div class='add'>+    VALIDATE_OR_GOTO(this, err);</div><div class='add'>+    VALIDATE_OR_GOTO(loc, err);</div><div class='add'>+    VALIDATE_OR_GOTO(loc-&gt;inode, err);</div><div class='add'>+</div><div class='add'>+    local = dht_local_init(frame, loc, NULL, GF_FOP_ENTRYLK);</div><div class='add'>+    if (!local) {</div><div class='add'>+        op_errno = ENOMEM;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    subvol = local-&gt;cached_subvol;</div><div class='add'>+    if (!subvol) {</div><div class='add'>+        gf_uuid_unparse(loc-&gt;gfid, gfid);</div><div class='add'>+</div><div class='add'>+        gf_msg_debug(this-&gt;name, 0,</div><div class='add'>+                     "no cached subvolume for path=%s, "</div><div class='add'>+                     "gfid = %s",</div><div class='add'>+                     loc-&gt;path, gfid);</div><div class='add'>+        op_errno = EINVAL;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    local-&gt;call_cnt = 1;</div><div class='add'>+</div><div class='add'>+    STACK_WIND(frame, dht_entrylk_cbk, subvol, subvol-&gt;fops-&gt;entrylk, volume,</div><div class='add'>+               loc, basename, cmd, type, xdata);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='ctx'> </div><div class='ctx'> err:</div><div class='del'>-	op_errno = (op_errno == -1) ? errno : op_errno;</div><div class='del'>-	DHT_STACK_UNWIND (entrylk, frame, -1, op_errno);</div><div class='add'>+    op_errno = (op_errno == -1) ? errno : op_errno;</div><div class='add'>+    DHT_STACK_UNWIND(entrylk, frame, -1, op_errno, NULL);</div><div class='ctx'> </div><div class='del'>-	return 0;</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-dht_fentrylk_cbk (call_frame_t *frame, void *cookie,</div><div class='del'>-		  xlator_t *this, int32_t op_ret, int32_t op_errno)</div><div class='add'>+static int</div><div class='add'>+dht_fentrylk_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                 int32_t op_ret, int32_t op_errno, dict_t *xdata)</div><div class='ctx'> </div><div class='ctx'> {</div><div class='del'>-	DHT_STACK_UNWIND (fentrylk, frame, op_ret, op_errno);</div><div class='del'>-	return 0;</div><div class='add'>+    DHT_STACK_UNWIND(fentrylk, frame, op_ret, op_errno, NULL);</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-dht_fentrylk (call_frame_t *frame, xlator_t *this,</div><div class='del'>-	      const char *volume, fd_t *fd, const char *basename,</div><div class='del'>-	      entrylk_cmd cmd, entrylk_type type)</div><div class='add'>+dht_fentrylk(call_frame_t *frame, xlator_t *this, const char *volume, fd_t *fd,</div><div class='add'>+             const char *basename, entrylk_cmd cmd, entrylk_type type,</div><div class='add'>+             dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-	xlator_t     *subvol = NULL;</div><div class='del'>-        int           op_errno = -1;</div><div class='add'>+    xlator_t *subvol = NULL;</div><div class='add'>+    int op_errno = -1;</div><div class='add'>+    char gfid[GF_UUID_BUF_SIZE] = {0};</div><div class='add'>+</div><div class='add'>+    VALIDATE_OR_GOTO(frame, err);</div><div class='add'>+    VALIDATE_OR_GOTO(this, err);</div><div class='add'>+    VALIDATE_OR_GOTO(fd, err);</div><div class='add'>+    VALIDATE_OR_GOTO(fd-&gt;inode, err);</div><div class='ctx'> </div><div class='del'>-        VALIDATE_OR_GOTO (frame, err);</div><div class='del'>-        VALIDATE_OR_GOTO (this, err);</div><div class='del'>-        VALIDATE_OR_GOTO (fd, err);</div><div class='add'>+    gf_uuid_unparse(fd-&gt;inode-&gt;gfid, gfid);</div><div class='ctx'> </div><div class='del'>-	subvol = dht_subvol_get_cached (this, fd-&gt;inode);</div><div class='del'>-	if (!subvol) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-			"no cached subvolume for fd=%p", fd);</div><div class='del'>-		op_errno = EINVAL;</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='add'>+    subvol = dht_subvol_get_cached(this, fd-&gt;inode);</div><div class='add'>+    if (!subvol) {</div><div class='add'>+        gf_msg_debug(this-&gt;name, 0,</div><div class='add'>+                     "No cached subvolume for fd=%p,"</div><div class='add'>+                     " gfid = %s",</div><div class='add'>+                     fd, gfid);</div><div class='add'>+        op_errno = EINVAL;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	STACK_WIND (frame, dht_fentrylk_cbk,</div><div class='del'>-		    subvol, subvol-&gt;fops-&gt;fentrylk,</div><div class='del'>-		    volume, fd, basename, cmd, type);</div><div class='add'>+    STACK_WIND(frame, dht_fentrylk_cbk, subvol, subvol-&gt;fops-&gt;fentrylk, volume,</div><div class='add'>+               fd, basename, cmd, type, xdata);</div><div class='ctx'> </div><div class='del'>-	return 0;</div><div class='add'>+    return 0;</div><div class='ctx'> </div><div class='ctx'> err:</div><div class='del'>-	op_errno = (op_errno == -1) ? errno : op_errno;</div><div class='del'>-	DHT_STACK_UNWIND (fentrylk, frame, -1, op_errno);</div><div class='add'>+    op_errno = (op_errno == -1) ? errno : op_errno;</div><div class='add'>+    DHT_STACK_UNWIND(fentrylk, frame, -1, op_errno, NULL);</div><div class='ctx'> </div><div class='del'>-	return 0;</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+static int32_t</div><div class='add'>+dht_ipc_cbk(call_frame_t *frame, void *cookie, xlator_t *this, int32_t op_ret,</div><div class='add'>+            int32_t op_errno, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    int this_call_cnt = 0;</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-dht_setattr_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-                 int op_ret, int op_errno, struct iatt *statpre,</div><div class='del'>-                 struct iatt *statpost)</div><div class='del'>-{</div><div class='del'>-	dht_local_t  *local = NULL;</div><div class='del'>-	int           this_call_cnt = 0;</div><div class='del'>-	call_frame_t *prev = NULL;</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-	prev = cookie;</div><div class='del'>-</div><div class='del'>-	LOCK (&amp;frame-&gt;lock);</div><div class='del'>-	{</div><div class='del'>-		if (op_ret == -1) {</div><div class='del'>-			local-&gt;op_errno = op_errno;</div><div class='del'>-			gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-				"subvolume %s returned -1 (%s)",</div><div class='del'>-				prev-&gt;this-&gt;name, strerror (op_errno));</div><div class='del'>-			goto unlock;</div><div class='del'>-		}</div><div class='del'>-</div><div class='del'>-		dht_iatt_merge (this, &amp;local-&gt;prebuf, statpre, prev-&gt;this);</div><div class='del'>-                dht_iatt_merge (this, &amp;local-&gt;stbuf, statpost, prev-&gt;this);</div><div class='del'>-		</div><div class='del'>-		if (local-&gt;inode) {</div><div class='del'>-			local-&gt;prebuf.ia_ino = local-&gt;inode-&gt;ino;</div><div class='del'>-                        local-&gt;stbuf.ia_ino = local-&gt;inode-&gt;ino;</div><div class='del'>-                }</div><div class='add'>+    GF_VALIDATE_OR_GOTO("dht", frame, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("dht", this, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("dht", frame-&gt;local, out);</div><div class='ctx'> </div><div class='del'>-		local-&gt;op_ret = 0;</div><div class='del'>-	}</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;frame-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        if (op_ret &lt; 0 &amp;&amp; op_errno != ENOTCONN) {</div><div class='add'>+            local-&gt;op_errno = op_errno;</div><div class='add'>+            goto unlock;</div><div class='add'>+        }</div><div class='add'>+        local-&gt;op_ret = 0;</div><div class='add'>+    }</div><div class='ctx'> unlock:</div><div class='del'>-	UNLOCK (&amp;frame-&gt;lock);</div><div class='add'>+    UNLOCK(&amp;frame-&gt;lock);</div><div class='ctx'> </div><div class='del'>-	this_call_cnt = dht_frame_return (frame);</div><div class='del'>-	if (is_last_call (this_call_cnt))</div><div class='del'>-		DHT_STACK_UNWIND (setattr, frame, local-&gt;op_ret, local-&gt;op_errno,</div><div class='del'>-				  &amp;local-&gt;prebuf, &amp;local-&gt;stbuf);</div><div class='add'>+    this_call_cnt = dht_frame_return(frame);</div><div class='add'>+    if (is_last_call(this_call_cnt)) {</div><div class='add'>+        DHT_STACK_UNWIND(ipc, frame, local-&gt;op_ret, local-&gt;op_errno, NULL);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        return 0;</div><div class='add'>+out:</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+int32_t</div><div class='add'>+dht_ipc(call_frame_t *frame, xlator_t *this, int32_t op, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    int op_errno = EINVAL;</div><div class='add'>+    dht_conf_t *conf = NULL;</div><div class='add'>+    int call_cnt = 0;</div><div class='add'>+    int i = 0;</div><div class='add'>+</div><div class='add'>+    VALIDATE_OR_GOTO(frame, err);</div><div class='add'>+    VALIDATE_OR_GOTO(this, err);</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-dht_setattr (call_frame_t *frame, xlator_t *this, loc_t *loc,</div><div class='del'>-             struct iatt *stbuf, int32_t valid)</div><div class='del'>-{</div><div class='del'>-	dht_layout_t *layout = NULL;</div><div class='del'>-	dht_local_t  *local  = NULL;</div><div class='del'>-        int           op_errno = -1;</div><div class='del'>-	int           i = -1;</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-        VALIDATE_OR_GOTO (frame, err);</div><div class='del'>-        VALIDATE_OR_GOTO (this, err);</div><div class='del'>-        VALIDATE_OR_GOTO (loc, err);</div><div class='del'>-        VALIDATE_OR_GOTO (loc-&gt;inode, err);</div><div class='del'>-        VALIDATE_OR_GOTO (loc-&gt;path, err);</div><div class='del'>-</div><div class='del'>-	local = dht_local_init (frame);</div><div class='del'>-	if (!local) {</div><div class='del'>-		op_errno = ENOMEM;</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-			"memory allocation failed :(");</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	local-&gt;layout = layout = dht_layout_get (this, loc-&gt;inode);</div><div class='del'>-	if (!layout) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-			"no layout for path=%s", loc-&gt;path);</div><div class='del'>-		op_errno = EINVAL;</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	if (!layout_is_sane (layout)) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-			"layout is not sane for path=%s", loc-&gt;path);</div><div class='del'>-		op_errno = EINVAL;</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	local-&gt;inode = inode_ref (loc-&gt;inode);</div><div class='del'>-	local-&gt;call_cnt = layout-&gt;cnt;</div><div class='del'>-</div><div class='del'>-	for (i = 0; i &lt; layout-&gt;cnt; i++) {</div><div class='del'>-		STACK_WIND (frame, dht_setattr_cbk,</div><div class='del'>-			    layout-&gt;list[i].xlator,</div><div class='del'>-			    layout-&gt;list[i].xlator-&gt;fops-&gt;setattr,</div><div class='del'>-			    loc, stbuf, valid);</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='add'>+    if (op != GF_IPC_TARGET_UPCALL)</div><div class='add'>+        goto wind_default;</div><div class='add'>+</div><div class='add'>+    VALIDATE_OR_GOTO(this-&gt;private, err);</div><div class='add'>+    conf = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    local = dht_local_init(frame, NULL, NULL, GF_FOP_IPC);</div><div class='add'>+    if (!local) {</div><div class='add'>+        op_errno = ENOMEM;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    call_cnt = conf-&gt;subvolume_cnt;</div><div class='add'>+    local-&gt;call_cnt = call_cnt;</div><div class='add'>+</div><div class='add'>+    if (xdata) {</div><div class='add'>+        if (dict_set_int8(xdata, conf-&gt;xattr_name, 0) &lt; 0)</div><div class='add'>+            goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; call_cnt; i++) {</div><div class='add'>+        STACK_WIND(frame, dht_ipc_cbk, conf-&gt;subvolumes[i],</div><div class='add'>+                   conf-&gt;subvolumes[i]-&gt;fops-&gt;ipc, op, xdata);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='ctx'> </div><div class='ctx'> err:</div><div class='del'>-	op_errno = (op_errno == -1) ? errno : op_errno;</div><div class='del'>-	DHT_STACK_UNWIND (setattr, frame, -1, op_errno, NULL, NULL);</div><div class='add'>+    DHT_STACK_UNWIND(ipc, frame, -1, op_errno, NULL);</div><div class='ctx'> </div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='add'>+    return 0;</div><div class='ctx'> </div><div class='add'>+wind_default:</div><div class='add'>+    STACK_WIND(frame, default_ipc_cbk, FIRST_CHILD(this),</div><div class='add'>+               FIRST_CHILD(this)-&gt;fops-&gt;ipc, op, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-dht_fsetattr (call_frame_t *frame, xlator_t *this, fd_t *fd, struct iatt *stbuf,</div><div class='del'>-              int32_t valid)</div><div class='del'>-{</div><div class='del'>-	dht_layout_t *layout = NULL;</div><div class='del'>-	dht_local_t  *local  = NULL;</div><div class='del'>-        int           op_errno = -1;</div><div class='del'>-	int           i = -1;</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-        VALIDATE_OR_GOTO (frame, err);</div><div class='del'>-        VALIDATE_OR_GOTO (this, err);</div><div class='del'>-        VALIDATE_OR_GOTO (fd, err);</div><div class='del'>-</div><div class='del'>-	local = dht_local_init (frame);</div><div class='del'>-	if (!local) {</div><div class='del'>-		op_errno = ENOMEM;</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-			"Out of memory");</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	local-&gt;layout = layout = dht_layout_get (this, fd-&gt;inode);</div><div class='del'>-	if (!layout) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-			"no layout for fd=%p", fd);</div><div class='del'>-		op_errno = EINVAL;</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	if (!layout_is_sane (layout)) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-			"layout is not sane for fd=%p", fd);</div><div class='del'>-		op_errno = EINVAL;</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	local-&gt;inode = inode_ref (fd-&gt;inode);</div><div class='del'>-	local-&gt;call_cnt = layout-&gt;cnt;</div><div class='del'>-</div><div class='del'>-	for (i = 0; i &lt; layout-&gt;cnt; i++) {</div><div class='del'>-		STACK_WIND (frame, dht_setattr_cbk,</div><div class='del'>-			    layout-&gt;list[i].xlator,</div><div class='del'>-			    layout-&gt;list[i].xlator-&gt;fops-&gt;fsetattr,</div><div class='del'>-			    fd, stbuf, valid);</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='add'>+dht_forget(xlator_t *this, inode_t *inode)</div><div class='add'>+{</div><div class='add'>+    uint64_t ctx_int = 0;</div><div class='add'>+    dht_inode_ctx_t *ctx = NULL;</div><div class='add'>+    dht_layout_t *layout = NULL;</div><div class='ctx'> </div><div class='del'>-err:</div><div class='del'>-	op_errno = (op_errno == -1) ? errno : op_errno;</div><div class='del'>-	DHT_STACK_UNWIND (fsetattr, frame, -1, op_errno, NULL, NULL);</div><div class='add'>+    inode_ctx_del(inode, this, &amp;ctx_int);</div><div class='add'>+</div><div class='add'>+    if (!ctx_int)</div><div class='add'>+        return 0;</div><div class='add'>+</div><div class='add'>+    ctx = (dht_inode_ctx_t *)(long)ctx_int;</div><div class='add'>+</div><div class='add'>+    layout = ctx-&gt;layout;</div><div class='add'>+    ctx-&gt;layout = NULL;</div><div class='add'>+    dht_layout_unref(this, layout);</div><div class='add'>+    GF_FREE(ctx);</div><div class='ctx'> </div><div class='del'>-	return 0;</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+int</div><div class='add'>+dht_notify(xlator_t *this, int event, void *data, ...)</div><div class='add'>+{</div><div class='add'>+    xlator_t *subvol = NULL;</div><div class='add'>+    int cnt = -1;</div><div class='add'>+    int i = -1;</div><div class='add'>+    dht_conf_t *conf = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int propagate = 0;</div><div class='add'>+</div><div class='add'>+    int had_heard_from_all = 0;</div><div class='add'>+    int have_heard_from_all = 0;</div><div class='add'>+    gf_defrag_info_t *defrag = NULL;</div><div class='add'>+    dict_t *dict = NULL;</div><div class='add'>+    gf_defrag_type cmd = 0;</div><div class='add'>+    dict_t *output = NULL;</div><div class='add'>+    va_list ap;</div><div class='add'>+    struct gf_upcall *up_data = NULL;</div><div class='add'>+    struct gf_upcall_cache_invalidation *up_ci = NULL;</div><div class='add'>+</div><div class='add'>+    conf = this-&gt;private;</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, conf, out);</div><div class='add'>+</div><div class='add'>+    /* had all subvolumes reported status once till now? */</div><div class='add'>+    had_heard_from_all = 1;</div><div class='add'>+    for (i = 0; i &lt; conf-&gt;subvolume_cnt; i++) {</div><div class='add'>+        if (!conf-&gt;last_event[i]) {</div><div class='add'>+            had_heard_from_all = 0;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    switch (event) {</div><div class='add'>+        case GF_EVENT_CHILD_UP:</div><div class='add'>+            subvol = data;</div><div class='add'>+</div><div class='add'>+            conf-&gt;gen++;</div><div class='add'>+</div><div class='add'>+            for (i = 0; i &lt; conf-&gt;subvolume_cnt; i++) {</div><div class='add'>+                if (subvol == conf-&gt;subvolumes[i]) {</div><div class='add'>+                    cnt = i;</div><div class='add'>+                    break;</div><div class='add'>+                }</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            if (cnt == -1) {</div><div class='add'>+                gf_msg_debug(this-&gt;name, 0,</div><div class='add'>+                             "got GF_EVENT_CHILD_UP bad "</div><div class='add'>+                             "subvolume %s",</div><div class='add'>+                             subvol-&gt;name);</div><div class='add'>+                break;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            LOCK(&amp;conf-&gt;subvolume_lock);</div><div class='add'>+            {</div><div class='add'>+                conf-&gt;subvolume_status[cnt] = 1;</div><div class='add'>+                conf-&gt;last_event[cnt] = event;</div><div class='add'>+                conf-&gt;subvol_up_time[cnt] = gf_time();</div><div class='add'>+            }</div><div class='add'>+            UNLOCK(&amp;conf-&gt;subvolume_lock);</div><div class='add'>+</div><div class='add'>+            /* one of the node came back up, do a stat update */</div><div class='add'>+            dht_get_du_info_for_subvol(this, cnt);</div><div class='add'>+</div><div class='add'>+            break;</div><div class='add'>+</div><div class='add'>+        case GF_EVENT_SOME_DESCENDENT_UP:</div><div class='add'>+            subvol = data;</div><div class='add'>+            conf-&gt;gen++;</div><div class='add'>+            propagate = 1;</div><div class='add'>+</div><div class='add'>+            break;</div><div class='add'>+</div><div class='add'>+        case GF_EVENT_SOME_DESCENDENT_DOWN:</div><div class='add'>+            subvol = data;</div><div class='add'>+            propagate = 1;</div><div class='add'>+</div><div class='add'>+            break;</div><div class='add'>+</div><div class='add'>+        case GF_EVENT_CHILD_DOWN:</div><div class='add'>+            subvol = data;</div><div class='add'>+</div><div class='add'>+            if (conf-&gt;assert_no_child_down) {</div><div class='add'>+                gf_msg(this-&gt;name, GF_LOG_WARNING, 0, DHT_MSG_CHILD_DOWN,</div><div class='add'>+                       "Received CHILD_DOWN. Exiting");</div><div class='add'>+                if (conf-&gt;defrag) {</div><div class='add'>+                    gf_defrag_stop(conf, GF_DEFRAG_STATUS_FAILED, NULL);</div><div class='add'>+                } else {</div><div class='add'>+                    kill(getpid(), SIGTERM);</div><div class='add'>+                }</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            for (i = 0; i &lt; conf-&gt;subvolume_cnt; i++) {</div><div class='add'>+                if (subvol == conf-&gt;subvolumes[i]) {</div><div class='add'>+                    cnt = i;</div><div class='add'>+                    break;</div><div class='add'>+                }</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            if (cnt == -1) {</div><div class='add'>+                gf_msg_debug(this-&gt;name, 0,</div><div class='add'>+                             "got GF_EVENT_CHILD_DOWN bad "</div><div class='add'>+                             "subvolume %s",</div><div class='add'>+                             subvol-&gt;name);</div><div class='add'>+                break;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            LOCK(&amp;conf-&gt;subvolume_lock);</div><div class='add'>+            {</div><div class='add'>+                conf-&gt;subvolume_status[cnt] = 0;</div><div class='add'>+                conf-&gt;last_event[cnt] = event;</div><div class='add'>+                conf-&gt;subvol_up_time[cnt] = 0;</div><div class='add'>+            }</div><div class='add'>+            UNLOCK(&amp;conf-&gt;subvolume_lock);</div><div class='add'>+</div><div class='add'>+            for (i = 0; i &lt; conf-&gt;subvolume_cnt; i++)</div><div class='add'>+                if (conf-&gt;last_event[i] != event)</div><div class='add'>+                    event = GF_EVENT_SOME_DESCENDENT_DOWN;</div><div class='add'>+            break;</div><div class='add'>+</div><div class='add'>+        case GF_EVENT_CHILD_CONNECTING:</div><div class='add'>+            subvol = data;</div><div class='add'>+</div><div class='add'>+            for (i = 0; i &lt; conf-&gt;subvolume_cnt; i++) {</div><div class='add'>+                if (subvol == conf-&gt;subvolumes[i]) {</div><div class='add'>+                    cnt = i;</div><div class='add'>+                    break;</div><div class='add'>+                }</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            if (cnt == -1) {</div><div class='add'>+                gf_msg_debug(this-&gt;name, 0,</div><div class='add'>+                             "got GF_EVENT_CHILD_CONNECTING"</div><div class='add'>+                             " bad subvolume %s",</div><div class='add'>+                             subvol-&gt;name);</div><div class='add'>+                break;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            LOCK(&amp;conf-&gt;subvolume_lock);</div><div class='add'>+            {</div><div class='add'>+                conf-&gt;last_event[cnt] = event;</div><div class='add'>+            }</div><div class='add'>+            UNLOCK(&amp;conf-&gt;subvolume_lock);</div><div class='add'>+</div><div class='add'>+            break;</div><div class='add'>+        case GF_EVENT_VOLUME_DEFRAG: {</div><div class='add'>+            if (!conf-&gt;defrag) {</div><div class='add'>+                return ret;</div><div class='add'>+            }</div><div class='add'>+            defrag = conf-&gt;defrag;</div><div class='add'>+</div><div class='add'>+            dict = data;</div><div class='add'>+            va_start(ap, data);</div><div class='add'>+            output = va_arg(ap, dict_t *);</div><div class='add'>+</div><div class='add'>+            ret = dict_get_int32(dict, "rebalance-command", (int32_t *)&amp;cmd);</div><div class='add'>+            if (ret) {</div><div class='add'>+                va_end(ap);</div><div class='add'>+                return ret;</div><div class='add'>+            }</div><div class='add'>+            LOCK(&amp;defrag-&gt;lock);</div><div class='add'>+            {</div><div class='add'>+                if (defrag-&gt;is_exiting)</div><div class='add'>+                    goto unlock;</div><div class='add'>+                if ((cmd == GF_DEFRAG_CMD_STATUS) ||</div><div class='add'>+                    (cmd == GF_DEFRAG_CMD_DETACH_STATUS))</div><div class='add'>+                    gf_defrag_status_get(conf, output);</div><div class='add'>+                else if (cmd == GF_DEFRAG_CMD_DETACH_START)</div><div class='add'>+                    defrag-&gt;cmd = GF_DEFRAG_CMD_DETACH_START;</div><div class='add'>+                else if (cmd == GF_DEFRAG_CMD_STOP ||</div><div class='add'>+                         cmd == GF_DEFRAG_CMD_DETACH_STOP)</div><div class='add'>+                    gf_defrag_stop(conf, GF_DEFRAG_STATUS_STOPPED, output);</div><div class='add'>+            }</div><div class='add'>+        unlock:</div><div class='add'>+            UNLOCK(&amp;defrag-&gt;lock);</div><div class='add'>+            va_end(ap);</div><div class='add'>+            return ret;</div><div class='add'>+            break;</div><div class='add'>+        }</div><div class='add'>+        case GF_EVENT_UPCALL:</div><div class='add'>+            up_data = (struct gf_upcall *)data;</div><div class='add'>+            if (up_data-&gt;event_type != GF_UPCALL_CACHE_INVALIDATION)</div><div class='add'>+                break;</div><div class='add'>+            up_ci = (struct gf_upcall_cache_invalidation *)up_data-&gt;data;</div><div class='add'>+</div><div class='add'>+            /* Since md-cache will be aggressively filtering lookups,</div><div class='add'>+             * the stale layout issue will be more pronounced. Hence</div><div class='add'>+             * when a layout xattr is changed by the rebalance process</div><div class='add'>+             * notify all the md-cache clients to invalidate the existing</div><div class='add'>+             * stat cache and send the lookup next time*/</div><div class='add'>+            if (up_ci-&gt;dict &amp;&amp; dict_get(up_ci-&gt;dict, conf-&gt;xattr_name))</div><div class='add'>+                up_ci-&gt;flags |= UP_EXPLICIT_LOOKUP;</div><div class='add'>+</div><div class='add'>+            /* TODO: Instead of invalidating iatt, update the new</div><div class='add'>+             * hashed/cached subvolume in dht inode_ctx */</div><div class='add'>+            if (IS_DHT_LINKFILE_MODE(&amp;up_ci-&gt;stat))</div><div class='add'>+                up_ci-&gt;flags |= UP_EXPLICIT_LOOKUP;</div><div class='add'>+</div><div class='add'>+            propagate = 1;</div><div class='add'>+            break;</div><div class='add'>+        default:</div><div class='add'>+            propagate = 1;</div><div class='add'>+            break;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* have all subvolumes reported status once by now? */</div><div class='add'>+    have_heard_from_all = 1;</div><div class='add'>+    for (i = 0; i &lt; conf-&gt;subvolume_cnt; i++) {</div><div class='add'>+        if (!conf-&gt;last_event[i])</div><div class='add'>+            have_heard_from_all = 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* if all subvols have reported status, no need to hide anything</div><div class='add'>+       or wait for anything else. Just propagate blindly */</div><div class='add'>+    if (have_heard_from_all) {</div><div class='add'>+        propagate = 1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (!had_heard_from_all &amp;&amp; have_heard_from_all) {</div><div class='add'>+        static int run_defrag = 0;</div><div class='add'>+        /* This is the first event which completes aggregation</div><div class='add'>+           of events from all subvolumes. If at least one subvol</div><div class='add'>+           had come up, propagate CHILD_UP, but only this time</div><div class='add'>+        */</div><div class='add'>+        event = GF_EVENT_CHILD_DOWN;</div><div class='add'>+</div><div class='add'>+        for (i = 0; i &lt; conf-&gt;subvolume_cnt; i++) {</div><div class='add'>+            if (conf-&gt;last_event[i] == GF_EVENT_CHILD_UP) {</div><div class='add'>+                event = GF_EVENT_CHILD_UP;</div><div class='add'>+                break;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            if (conf-&gt;last_event[i] == GF_EVENT_CHILD_CONNECTING) {</div><div class='add'>+                event = GF_EVENT_CHILD_CONNECTING;</div><div class='add'>+                /* continue to check other events for CHILD_UP */</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        /* Rebalance is started with assert_no_child_down. So we do</div><div class='add'>+         * not need to handle CHILD_DOWN event here.</div><div class='add'>+         *</div><div class='add'>+         * If there is a graph switch, we should not restart the</div><div class='add'>+         * rebalance daemon. Use 'run_defrag' to indicate if the</div><div class='add'>+         * thread has already started.</div><div class='add'>+         */</div><div class='add'>+        if (conf-&gt;defrag &amp;&amp; !run_defrag) {</div><div class='add'>+            run_defrag = 1;</div><div class='add'>+            ret = gf_thread_create(&amp;conf-&gt;defrag-&gt;th, NULL, gf_defrag_start,</div><div class='add'>+                                   this, "dhtdg");</div><div class='add'>+            if (ret) {</div><div class='add'>+                GF_FREE(conf-&gt;defrag);</div><div class='add'>+                conf-&gt;defrag = NULL;</div><div class='add'>+                kill(getpid(), SIGTERM);</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+    if (propagate)</div><div class='add'>+        ret = default_notify(this, event, data);</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-dht_forget (xlator_t *this, inode_t *inode)</div><div class='add'>+dht_inode_ctx_layout_get(inode_t *inode, xlator_t *this, dht_layout_t **layout)</div><div class='ctx'> {</div><div class='del'>-	uint64_t      tmp_layout = 0;</div><div class='del'>-	dht_layout_t *layout = NULL;</div><div class='add'>+    dht_inode_ctx_t *ctx = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    ret = dht_inode_ctx_get(inode, this, &amp;ctx);</div><div class='add'>+</div><div class='add'>+    if (!ret &amp;&amp; ctx) {</div><div class='add'>+        if (ctx-&gt;layout) {</div><div class='add'>+            if (layout)</div><div class='add'>+                *layout = ctx-&gt;layout;</div><div class='add'>+            ret = 0;</div><div class='add'>+        } else {</div><div class='add'>+            ret = -1;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+dht_log_new_layout_for_dir_selfheal(xlator_t *this, loc_t *loc,</div><div class='add'>+                                    dht_layout_t *layout)</div><div class='add'>+{</div><div class='add'>+    char string[2048] = {0};</div><div class='add'>+    char *output_string = NULL;</div><div class='add'>+    int len = 0;</div><div class='add'>+    int off = 0;</div><div class='add'>+    int i = 0;</div><div class='add'>+    gf_loglevel_t log_level = gf_log_get_loglevel();</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    if (log_level &lt; GF_LOG_INFO)</div><div class='add'>+        return;</div><div class='add'>+</div><div class='add'>+    if (!layout)</div><div class='add'>+        return;</div><div class='add'>+</div><div class='add'>+    if (!layout-&gt;cnt)</div><div class='add'>+        return;</div><div class='add'>+</div><div class='add'>+    if (!loc)</div><div class='add'>+        return;</div><div class='add'>+</div><div class='add'>+    if (!loc-&gt;path)</div><div class='add'>+        return;</div><div class='add'>+</div><div class='add'>+    ret = snprintf(string, sizeof(string), "Setting layout of %s with ",</div><div class='add'>+                   loc-&gt;path);</div><div class='add'>+</div><div class='add'>+    if (ret &lt; 0)</div><div class='add'>+        return;</div><div class='add'>+</div><div class='add'>+    len += ret;</div><div class='ctx'> </div><div class='del'>-	inode_ctx_get (inode, this, &amp;tmp_layout);</div><div class='add'>+    /* Calculation  of total length of the string required to calloc</div><div class='add'>+     * output_string. Log includes subvolume-name, start-range, end-range</div><div class='add'>+     * and err value.</div><div class='add'>+     *</div><div class='add'>+     * This log will help to debug cases where:</div><div class='add'>+     * a) Different processes set different layout of a directory.</div><div class='add'>+     * b) Error captured in lookup, which will be filled in layout-&gt;err</div><div class='add'>+     * (like ENOENT, ESTALE etc)</div><div class='add'>+     */</div><div class='ctx'> </div><div class='del'>-	if (!tmp_layout)</div><div class='del'>-		return 0;</div><div class='add'>+    for (i = 0; i &lt; layout-&gt;cnt; i++) {</div><div class='add'>+        ret = snprintf(string, sizeof(string),</div><div class='add'>+                       "[Subvol_name: %s, Err: %d , Start: "</div><div class='add'>+                       "0x%x, Stop: 0x%x, Hash: 0x%x], ",</div><div class='add'>+                       layout-&gt;list[i].xlator-&gt;name, layout-&gt;list[i].err,</div><div class='add'>+                       layout-&gt;list[i].start, layout-&gt;list[i].stop,</div><div class='add'>+                       layout-&gt;list[i].commit_hash);</div><div class='ctx'> </div><div class='del'>-	layout = (dht_layout_t *)(long)tmp_layout;</div><div class='del'>-        dht_layout_unref (this, layout);</div><div class='add'>+        if (ret &lt; 0)</div><div class='add'>+            return;</div><div class='ctx'> </div><div class='del'>-	return 0;</div><div class='add'>+        len += ret;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    len++;</div><div class='add'>+</div><div class='add'>+    output_string = GF_MALLOC(len + 1, gf_common_mt_char);</div><div class='add'>+</div><div class='add'>+    if (!output_string)</div><div class='add'>+        return;</div><div class='add'>+</div><div class='add'>+    ret = snprintf(output_string, len + 1, "Setting layout of %s with ",</div><div class='add'>+                   loc-&gt;path);</div><div class='add'>+</div><div class='add'>+    if (ret &lt; 0)</div><div class='add'>+        goto err;</div><div class='add'>+</div><div class='add'>+    off += ret;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; layout-&gt;cnt; i++) {</div><div class='add'>+        ret = snprintf(output_string + off, len - off,</div><div class='add'>+                       "[Subvol_name: %s, Err: %d , Start: "</div><div class='add'>+                       "0x%x, Stop: 0x%x, Hash: 0x%x], ",</div><div class='add'>+                       layout-&gt;list[i].xlator-&gt;name, layout-&gt;list[i].err,</div><div class='add'>+                       layout-&gt;list[i].start, layout-&gt;list[i].stop,</div><div class='add'>+                       layout-&gt;list[i].commit_hash);</div><div class='add'>+</div><div class='add'>+        if (ret &lt; 0)</div><div class='add'>+            goto err;</div><div class='add'>+</div><div class='add'>+        off += ret;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    gf_msg(this-&gt;name, GF_LOG_DEBUG, 0, DHT_MSG_LOG_FIXED_LAYOUT, "%s",</div><div class='add'>+           output_string);</div><div class='add'>+</div><div class='add'>+err:</div><div class='add'>+    GF_FREE(output_string);</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+int32_t</div><div class='add'>+dht_migration_get_dst_subvol(xlator_t *this, dht_local_t *local)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    if (!local)</div><div class='add'>+        goto out;</div><div class='ctx'> </div><div class='add'>+    local-&gt;rebalance.target_node = dht_subvol_get_hashed(this, &amp;local-&gt;loc);</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-dht_init_subvolumes (xlator_t *this, dht_conf_t *conf)</div><div class='add'>+    if (local-&gt;rebalance.target_node)</div><div class='add'>+        ret = 0;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+This function should not be called more then once during a FOP</div><div class='add'>+handling path. It is valid only for for ops on files</div><div class='add'>+*/</div><div class='add'>+int32_t</div><div class='add'>+dht_set_local_rebalance(xlator_t *this, dht_local_t *local, struct iatt *stbuf,</div><div class='add'>+                        struct iatt *prebuf, struct iatt *postbuf,</div><div class='add'>+                        dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-        xlator_list_t *subvols = NULL;</div><div class='del'>-        int            cnt = 0;</div><div class='add'>+    if (!local)</div><div class='add'>+        return -1;</div><div class='ctx'> </div><div class='add'>+    if (local-&gt;rebalance.set) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_WARNING, 0, DHT_MSG_REBAL_STRUCT_SET,</div><div class='add'>+               "local-&gt;rebalance already set");</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        for (subvols = this-&gt;children; subvols; subvols = subvols-&gt;next)</div><div class='del'>-                cnt++;</div><div class='add'>+    if (stbuf)</div><div class='add'>+        memcpy(&amp;local-&gt;rebalance.stbuf, stbuf, sizeof(struct iatt));</div><div class='ctx'> </div><div class='del'>-        conf-&gt;subvolumes = GF_CALLOC (cnt, sizeof (xlator_t *),</div><div class='del'>-                                      gf_dht_mt_xlator_t);</div><div class='del'>-        if (!conf-&gt;subvolumes) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-                        "Out of memory");</div><div class='del'>-                return -1;</div><div class='del'>-        }</div><div class='del'>-        conf-&gt;subvolume_cnt = cnt;</div><div class='add'>+    if (prebuf)</div><div class='add'>+        memcpy(&amp;local-&gt;rebalance.prebuf, prebuf, sizeof(struct iatt));</div><div class='ctx'> </div><div class='del'>-        cnt = 0;</div><div class='del'>-        for (subvols = this-&gt;children; subvols; subvols = subvols-&gt;next)</div><div class='del'>-                conf-&gt;subvolumes[cnt++] = subvols-&gt;xlator;</div><div class='add'>+    if (postbuf)</div><div class='add'>+        memcpy(&amp;local-&gt;rebalance.postbuf, postbuf, sizeof(struct iatt));</div><div class='ctx'> </div><div class='del'>-	conf-&gt;subvolume_status = GF_CALLOC (cnt, sizeof (char),</div><div class='del'>-                                            gf_dht_mt_char);</div><div class='del'>-	if (!conf-&gt;subvolume_status) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-			"Out of memory");</div><div class='del'>-		return -1;</div><div class='del'>-	}</div><div class='add'>+    if (xdata)</div><div class='add'>+        local-&gt;rebalance.xdata = dict_ref(xdata);</div><div class='ctx'> </div><div class='del'>-        return 0;</div><div class='add'>+    local-&gt;rebalance.set = 1;</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+int32_t</div><div class='add'>+dht_release(xlator_t *this, fd_t *fd)</div><div class='add'>+{</div><div class='add'>+    return dht_fd_ctx_destroy(this, fd);</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-dht_notify (xlator_t *this, int event, void *data, ...)</div><div class='add'>+static int</div><div class='add'>+dht_pt_mkdir_cbk(call_frame_t *frame, void *cookie, xlator_t *this, int op_ret,</div><div class='add'>+                 int op_errno, inode_t *inode, struct iatt *stbuf,</div><div class='add'>+                 struct iatt *preparent, struct iatt *postparent, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-	xlator_t   *subvol = NULL;</div><div class='del'>-	int         cnt    = -1;</div><div class='del'>-	int         i      = -1;</div><div class='del'>-	dht_conf_t *conf   = NULL;</div><div class='del'>-	int         ret    = -1;</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='ctx'> </div><div class='add'>+    local = frame-&gt;local;</div><div class='ctx'> </div><div class='del'>-	conf = this-&gt;private;</div><div class='add'>+    if (!op_ret) {</div><div class='add'>+        dht_layout_set(this, inode, local-&gt;layout);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	switch (event) {</div><div class='del'>-	case GF_EVENT_CHILD_UP:</div><div class='del'>-		subvol = data;</div><div class='add'>+    DHT_STACK_UNWIND(mkdir, frame, op_ret, op_errno, inode, stbuf, preparent,</div><div class='add'>+                     postparent, NULL);</div><div class='ctx'> </div><div class='del'>-		conf-&gt;gen++;</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-		for (i = 0; i &lt; conf-&gt;subvolume_cnt; i++) {</div><div class='del'>-			if (subvol == conf-&gt;subvolumes[i]) {</div><div class='del'>-				cnt = i;</div><div class='del'>-				break;</div><div class='del'>-			}</div><div class='del'>-		}</div><div class='add'>+int32_t</div><div class='add'>+dht_pt_mkdir(call_frame_t *frame, xlator_t *this, loc_t *loc, mode_t mode,</div><div class='add'>+             mode_t umask, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    dht_layout_t *layout = NULL;</div><div class='add'>+    dht_conf_t *conf = NULL;</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    bool free_xdata = false;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    int op_errno = 0;</div><div class='add'>+    int32_t *disk_layout_p = NULL;</div><div class='add'>+</div><div class='add'>+    conf = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    local = dht_local_init(frame, loc, NULL, GF_FOP_MKDIR);</div><div class='add'>+    if (!local) {</div><div class='add'>+        op_errno = ENOMEM;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    layout = dht_layout_new(this, conf-&gt;subvolume_cnt);</div><div class='add'>+    if (!layout)</div><div class='add'>+        goto wind;</div><div class='add'>+</div><div class='add'>+    local-&gt;layout = layout;</div><div class='add'>+</div><div class='add'>+    if (!xdata) {</div><div class='add'>+        xdata = dict_new();</div><div class='add'>+        if (!xdata)</div><div class='add'>+            goto wind;</div><div class='add'>+        free_xdata = true;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /*Set the xlator or the following will crash*/</div><div class='add'>+    layout-&gt;list[0].xlator = conf-&gt;subvolumes[0];</div><div class='add'>+</div><div class='add'>+    dht_selfheal_layout_new_directory(frame, loc, layout);</div><div class='add'>+</div><div class='add'>+    dht_disk_layout_extract(this, layout, 0, &amp;disk_layout_p);</div><div class='add'>+</div><div class='add'>+    ret = dict_set_bin(xdata, conf-&gt;xattr_name, disk_layout_p, 4 * 4);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_msg("dht", GF_LOG_DEBUG, EINVAL, DHT_MSG_DICT_SET_FAILED,</div><div class='add'>+               "dht layout dict set failed");</div><div class='add'>+    }</div><div class='add'>+wind:</div><div class='add'>+    STACK_WIND(frame, dht_pt_mkdir_cbk, FIRST_CHILD(this),</div><div class='add'>+               FIRST_CHILD(this)-&gt;fops-&gt;mkdir, loc, mode, umask, xdata);</div><div class='add'>+    if (free_xdata)</div><div class='add'>+        dict_unref(xdata);</div><div class='add'>+    return 0;</div><div class='ctx'> </div><div class='del'>-		if (cnt == -1) {</div><div class='del'>-			gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-				"got GF_EVENT_CHILD_UP bad subvolume %s",</div><div class='del'>-				subvol-&gt;name);</div><div class='del'>-			break;</div><div class='del'>-		}</div><div class='add'>+err:</div><div class='add'>+    op_errno = local ? local-&gt;op_errno : op_errno;</div><div class='add'>+    DHT_STACK_UNWIND(mkdir, frame, -1, op_errno, NULL, NULL, NULL, NULL, NULL);</div><div class='ctx'> </div><div class='del'>-		LOCK (&amp;conf-&gt;subvolume_lock);</div><div class='del'>-		{</div><div class='del'>-			conf-&gt;subvolume_status[cnt] = 1;</div><div class='del'>-		}</div><div class='del'>-		UNLOCK (&amp;conf-&gt;subvolume_lock);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-                /* one of the node came back up, do a stat update */</div><div class='del'>-                dht_get_du_info_for_subvol (this, cnt);</div><div class='add'>+static int</div><div class='add'>+dht_pt_getxattr_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                    int op_ret, int op_errno, dict_t *xattr, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    dht_conf_t *conf = NULL;</div><div class='ctx'> </div><div class='del'>-		break;</div><div class='add'>+    conf = this-&gt;private;</div><div class='add'>+    dict_del(xattr, conf-&gt;xattr_name);</div><div class='add'>+    dict_del(xattr, conf-&gt;mds_xattr_key);</div><div class='add'>+    dict_del(xattr, conf-&gt;commithash_xattr_name);</div><div class='ctx'> </div><div class='del'>-	case GF_EVENT_CHILD_DOWN:</div><div class='del'>-		subvol = data;</div><div class='add'>+    if (frame-&gt;root-&gt;pid &gt;= 0) {</div><div class='add'>+        GF_REMOVE_INTERNAL_XATTR("trusted.glusterfs.quota*", xattr);</div><div class='add'>+        GF_REMOVE_INTERNAL_XATTR("trusted.pgfid*", xattr);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-		for (i = 0; i &lt; conf-&gt;subvolume_cnt; i++) {</div><div class='del'>-			if (subvol == conf-&gt;subvolumes[i]) {</div><div class='del'>-				cnt = i;</div><div class='del'>-				break;</div><div class='del'>-			}</div><div class='del'>-		}</div><div class='add'>+    DHT_STACK_UNWIND(getxattr, frame, op_ret, op_errno, xattr, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-		if (cnt == -1) {</div><div class='del'>-			gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-				"got GF_EVENT_CHILD_DOWN bad subvolume %s",</div><div class='del'>-				subvol-&gt;name);</div><div class='del'>-			break;</div><div class='del'>-		}</div><div class='add'>+int</div><div class='add'>+dht_pt_getxattr(call_frame_t *frame, xlator_t *this, loc_t *loc,</div><div class='add'>+                const char *key, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    STACK_WIND(frame, dht_pt_getxattr_cbk, FIRST_CHILD(this),</div><div class='add'>+               FIRST_CHILD(this)-&gt;fops-&gt;getxattr, loc, key, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+dht_pt_fgetxattr_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                     int op_ret, int op_errno, dict_t *xattr, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    dht_conf_t *conf = NULL;</div><div class='ctx'> </div><div class='del'>-		LOCK (&amp;conf-&gt;subvolume_lock);</div><div class='del'>-		{</div><div class='del'>-			conf-&gt;subvolume_status[cnt] = 0;</div><div class='del'>-		}</div><div class='del'>-		UNLOCK (&amp;conf-&gt;subvolume_lock);</div><div class='add'>+    conf = this-&gt;private;</div><div class='add'>+    dict_del(xattr, conf-&gt;xattr_name);</div><div class='ctx'> </div><div class='del'>-		break;</div><div class='del'>-	}</div><div class='add'>+    if (frame-&gt;root-&gt;pid &gt;= 0) {</div><div class='add'>+        GF_REMOVE_INTERNAL_XATTR("trusted.glusterfs.quota*", xattr);</div><div class='add'>+        GF_REMOVE_INTERNAL_XATTR("trusted.pgfid*", xattr);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	ret = default_notify (this, event, data);</div><div class='add'>+    DHT_STACK_UNWIND(fgetxattr, frame, op_ret, op_errno, xattr, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	return ret;</div><div class='add'>+int</div><div class='add'>+dht_pt_fgetxattr(call_frame_t *frame, xlator_t *this, fd_t *fd, const char *key,</div><div class='add'>+                 dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    STACK_WIND(frame, dht_pt_fgetxattr_cbk, FIRST_CHILD(this),</div><div class='add'>+               FIRST_CHILD(this)-&gt;fops-&gt;fgetxattr, fd, key, xdata);</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+/* The job of this function is to check if all the xlators have updated</div><div class='add'>+ * error in the layout. */</div><div class='add'>+int</div><div class='add'>+dht_dir_layout_error_check(xlator_t *this, inode_t *inode)</div><div class='add'>+{</div><div class='add'>+    dht_layout_t *layout = NULL;</div><div class='add'>+    int i = 0;</div><div class='add'>+</div><div class='add'>+    layout = dht_layout_get(this, inode);</div><div class='add'>+    for (i = 0; i &lt; layout-&gt;cnt; i++) {</div><div class='add'>+        if (layout-&gt;list[i].err == 0) {</div><div class='add'>+            return 0;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Returning the first xlator error as all xlators have errors */</div><div class='add'>+    return layout-&gt;list[0].err;</div><div class='add'>+}</div><div class='head'>diff --git a/xlators/cluster/dht/src/dht-common.h b/xlators/cluster/dht/src/dht-common.h<br/>index 58edca9f66c..fe0dc3db34a 100644<br/>--- a/<a href='/cgit/glusterfs.git/tree/xlators/cluster/dht/src/dht-common.h?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/cluster/dht/src/dht-common.h</a><br/>+++ b/<a href='/cgit/glusterfs.git/tree/xlators/cluster/dht/src/dht-common.h?id=d1d7a6f35c816822fab51c820e25023863c239c1'>xlators/cluster/dht/src/dht-common.h</a></div><div class='hunk'>@@ -1,302 +1,1384 @@</div><div class='ctx'> /*</div><div class='del'>-   Copyright (c) 2008-2009 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='del'>-   This file is part of GlusterFS.</div><div class='del'>-</div><div class='del'>-   GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-   it under the terms of the GNU General Public License as published</div><div class='del'>-   by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-   or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-   GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-   WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-   General Public License for more details.</div><div class='del'>-</div><div class='del'>-   You should have received a copy of the GNU General Public License</div><div class='del'>-   along with this program.  If not, see</div><div class='del'>-   &lt;http://www.gnu.org/licenses/&gt;.</div><div class='add'>+  Copyright (c) 2008-2012 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='ctx'> */</div><div class='ctx'> </div><div class='del'>-#ifndef _CONFIG_H</div><div class='del'>-#define _CONFIG_H</div><div class='del'>-#include "config.h"</div><div class='del'>-#endif</div><div class='add'>+#include &lt;regex.h&gt;</div><div class='ctx'> </div><div class='ctx'> #include "dht-mem-types.h"</div><div class='add'>+#include "dht-messages.h"</div><div class='add'>+#include &lt;glusterfs/call-stub.h&gt;</div><div class='add'>+#include "libxlator.h"</div><div class='add'>+#include &lt;glusterfs/syncop.h&gt;</div><div class='add'>+#include &lt;glusterfs/refcount.h&gt;</div><div class='add'>+#include &lt;glusterfs/timer.h&gt;</div><div class='add'>+#include "protocol-common.h"</div><div class='add'>+#include &lt;glusterfs/glusterfs-acl.h&gt;</div><div class='ctx'> </div><div class='ctx'> #ifndef _DHT_H</div><div class='ctx'> #define _DHT_H</div><div class='ctx'> </div><div class='del'>-#define GF_XATTR_FIX_LAYOUT_KEY   "trusted.distribute.fix.layout"</div><div class='del'>-#define GF_DHT_LOOKUP_UNHASHED_ON   1</div><div class='add'>+#define GF_XATTR_FIX_LAYOUT_KEY "distribute.fix.layout"</div><div class='add'>+#define GF_XATTR_FILE_MIGRATE_KEY "trusted.distribute.migrate-data"</div><div class='add'>+#define DHT_MDS_STR "mds"</div><div class='add'>+#define GF_DHT_LOOKUP_UNHASHED_OFF 0</div><div class='add'>+#define GF_DHT_LOOKUP_UNHASHED_ON 1</div><div class='ctx'> #define GF_DHT_LOOKUP_UNHASHED_AUTO 2</div><div class='add'>+#define DHT_PATHINFO_HEADER "DISTRIBUTE:"</div><div class='add'>+#define DHT_FILE_MIGRATE_DOMAIN "dht.file.migrate"</div><div class='add'>+/* Layout synchronization */</div><div class='add'>+#define DHT_LAYOUT_HEAL_DOMAIN "dht.layout.heal"</div><div class='add'>+/* Namespace synchronization */</div><div class='add'>+#define DHT_ENTRY_SYNC_DOMAIN "dht.entry.sync"</div><div class='add'>+#define DHT_LAYOUT_HASH_INVALID 1</div><div class='add'>+#define MAX_REBAL_THREADS sysconf(_SC_NPROCESSORS_ONLN)</div><div class='add'>+</div><div class='add'>+#define DHT_DIR_STAT_BLOCKS 8</div><div class='add'>+#define DHT_DIR_STAT_SIZE 4096</div><div class='add'>+</div><div class='add'>+/* Virtual xattr for subvols status */</div><div class='add'>+</div><div class='add'>+#define DHT_SUBVOL_STATUS_KEY "dht.subvol.status"</div><div class='add'>+</div><div class='add'>+/* Virtual xattrs for debugging */</div><div class='add'>+</div><div class='add'>+#define DHT_DBG_HASHED_SUBVOL_PATTERN "dht.file.hashed-subvol.*"</div><div class='add'>+#define DHT_DBG_HASHED_SUBVOL_KEY "dht.file.hashed-subvol."</div><div class='ctx'> </div><div class='del'>-#include &lt;fnmatch.h&gt;</div><div class='add'>+/* Rebalance nodeuuid flags */</div><div class='add'>+#define REBAL_NODEUUID_MINE 0x01</div><div class='ctx'> </div><div class='del'>-typedef int (*dht_selfheal_dir_cbk_t) (call_frame_t *frame, void *cookie,</div><div class='del'>-				       xlator_t *this,</div><div class='del'>-				       int32_t op_ret, int32_t op_errno);</div><div class='add'>+typedef int (*dht_selfheal_dir_cbk_t)(call_frame_t *frame, void *cookie,</div><div class='add'>+                                      xlator_t *this, int32_t op_ret,</div><div class='add'>+                                      int32_t op_errno, dict_t *xdata);</div><div class='add'>+typedef int (*dht_defrag_cbk_fn_t)(xlator_t *this, xlator_t *dst_node,</div><div class='add'>+                                   call_frame_t *frame, int ret);</div><div class='ctx'> </div><div class='add'>+typedef int (*dht_refresh_layout_unlock)(call_frame_t *frame, xlator_t *this,</div><div class='add'>+                                         int op_ret, int invoke_cbk);</div><div class='add'>+</div><div class='add'>+typedef int (*dht_refresh_layout_done_handle)(call_frame_t *frame);</div><div class='ctx'> </div><div class='ctx'> struct dht_layout {</div><div class='del'>-        int               cnt;</div><div class='del'>-	int               preset;</div><div class='del'>-        int               gen;</div><div class='del'>-	int               type;</div><div class='del'>-        int               ref;   /* use with dht_conf_t-&gt;layout_lock */</div><div class='del'>-        int               search_unhashed;</div><div class='del'>-        struct {</div><div class='del'>-		int       err;   /* 0 = normal</div><div class='del'>-				   -1 = dir exists and no xattr</div><div class='del'>-				   &gt;0 = dir lookup failed with errno</div><div class='del'>-				 */</div><div class='del'>-                uint32_t  start;</div><div class='del'>-                uint32_t  stop;</div><div class='del'>-                xlator_t *xlator;</div><div class='del'>-        } list[0];</div><div class='add'>+    int spread_cnt; /* layout spread count per directory,</div><div class='add'>+                       is controlled by 'setxattr()' with</div><div class='add'>+                       special key */</div><div class='add'>+    int cnt;</div><div class='add'>+    int preset;</div><div class='add'>+    /*</div><div class='add'>+     * The last *configuration* state for which this directory was known</div><div class='add'>+     * to be in balance.  The corresponding vol_commit_hash changes</div><div class='add'>+     * whenever bricks are added or removed.  This value changes when a</div><div class='add'>+     * (full) rebalance is complete.  If they match, it's safe to assume</div><div class='add'>+     * that every file is where it should be and there's no need to do</div><div class='add'>+     * lookups for files elsewhere.  If they don't, then we have to do a</div><div class='add'>+     * global lookup to be sure.</div><div class='add'>+     */</div><div class='add'>+    uint32_t commit_hash;</div><div class='add'>+    /*</div><div class='add'>+     * The *runtime* state of the volume, changes when connections to</div><div class='add'>+     * bricks are made or lost.</div><div class='add'>+     */</div><div class='add'>+    int gen;</div><div class='add'>+    int type;</div><div class='add'>+    gf_atomic_t ref; /* use with dht_conf_t-&gt;layout_lock */</div><div class='add'>+    uint32_t search_unhashed;</div><div class='add'>+    struct {</div><div class='add'>+        int err; /* 0 = normal</div><div class='add'>+                    -1 = dir exists and no xattr</div><div class='add'>+                    &gt;0 = dir lookup failed with errno</div><div class='add'>+                 */</div><div class='add'>+        uint32_t start;</div><div class='add'>+        uint32_t stop;</div><div class='add'>+        uint32_t commit_hash;</div><div class='add'>+        xlator_t *xlator;</div><div class='add'>+    } list[];</div><div class='ctx'> };</div><div class='ctx'> typedef struct dht_layout dht_layout_t;</div><div class='ctx'> </div><div class='add'>+struct dht_stat_time {</div><div class='add'>+    uint32_t atime;</div><div class='add'>+    uint32_t atime_nsec;</div><div class='add'>+    uint32_t ctime;</div><div class='add'>+    uint32_t ctime_nsec;</div><div class='add'>+    uint32_t mtime;</div><div class='add'>+    uint32_t mtime_nsec;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+typedef struct dht_stat_time dht_stat_time_t;</div><div class='add'>+</div><div class='add'>+struct dht_inode_ctx {</div><div class='add'>+    dht_layout_t *layout;</div><div class='add'>+    dht_stat_time_t time;</div><div class='add'>+    xlator_t *lock_subvol;</div><div class='add'>+    xlator_t *mds_subvol; /* This is only used for directories */</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+typedef struct dht_inode_ctx dht_inode_ctx_t;</div><div class='ctx'> </div><div class='ctx'> typedef enum {</div><div class='del'>-	DHT_HASH_TYPE_DM,</div><div class='add'>+    DHT_HASH_TYPE_DM,</div><div class='add'>+    DHT_HASH_TYPE_DM_USER,</div><div class='ctx'> } dht_hashfn_type_t;</div><div class='ctx'> </div><div class='add'>+typedef enum {</div><div class='add'>+    DHT_INODELK,</div><div class='add'>+    DHT_ENTRYLK,</div><div class='add'>+} dht_lock_type_t;</div><div class='add'>+</div><div class='add'>+/* rebalance related */</div><div class='add'>+struct dht_rebalance_ {</div><div class='add'>+    xlator_t *from_subvol;</div><div class='add'>+    xlator_t *target_node;</div><div class='add'>+    off_t offset;</div><div class='add'>+    size_t size;</div><div class='add'>+    int32_t flags;</div><div class='add'>+    int count;</div><div class='add'>+    struct iobref *iobref;</div><div class='add'>+    struct iovec *vector;</div><div class='add'>+    struct iatt stbuf;</div><div class='add'>+    struct iatt prebuf;</div><div class='add'>+    struct iatt postbuf;</div><div class='add'>+    dht_defrag_cbk_fn_t target_op_fn;</div><div class='add'>+    dict_t *xdata;</div><div class='add'>+    dict_t *xattr;</div><div class='add'>+    dict_t *dict;</div><div class='add'>+    struct gf_flock flock;</div><div class='add'>+    int32_t set;</div><div class='add'>+    int lock_cmd;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+/**</div><div class='add'>+ * Enum to store decided action based on the qdstatfs (quota-deem-statfs)</div><div class='add'>+ * events</div><div class='add'>+ **/</div><div class='add'>+typedef enum {</div><div class='add'>+    qdstatfs_action_OFF = 0,</div><div class='add'>+    qdstatfs_action_REPLACE,</div><div class='add'>+    qdstatfs_action_NEGLECT,</div><div class='add'>+    qdstatfs_action_COMPARE,</div><div class='add'>+} qdstatfs_action_t;</div><div class='add'>+</div><div class='add'>+typedef enum {</div><div class='add'>+    REACTION_INVALID,</div><div class='add'>+    FAIL_ON_ANY_ERROR,</div><div class='add'>+    IGNORE_ENOENT_ESTALE,</div><div class='add'>+    IGNORE_ENOENT_ESTALE_EIO,</div><div class='add'>+} dht_reaction_type_t;</div><div class='add'>+</div><div class='add'>+struct dht_skip_linkto_unlink {</div><div class='add'>+    xlator_t *hash_links_to;</div><div class='add'>+    uuid_t cached_gfid;</div><div class='add'>+    uuid_t hashed_gfid;</div><div class='add'>+    int opend_fd_count;</div><div class='add'>+    gf_boolean_t handle_valid_link;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+typedef struct {</div><div class='add'>+    xlator_t *xl;</div><div class='add'>+    loc_t loc;      /* contains/points to inode to lock on. */</div><div class='add'>+    char *domain;   /* Only locks within a single domain</div><div class='add'>+                     * contend with each other</div><div class='add'>+                     */</div><div class='add'>+    char *basename; /* Required for entrylk */</div><div class='add'>+    gf_boolean_t locked;</div><div class='add'>+    dht_reaction_type_t do_on_failure;</div><div class='add'>+    short type; /* read/write lock.                     */</div><div class='add'>+    gf_lkowner_t lk_owner;</div><div class='add'>+} dht_lock_t;</div><div class='add'>+</div><div class='add'>+/* The lock structure represents inodelk. */</div><div class='add'>+typedef struct {</div><div class='add'>+    fop_inodelk_cbk_t inodelk_cbk;</div><div class='add'>+    dht_lock_t **locks;</div><div class='add'>+    int lk_count;</div><div class='add'>+    dht_reaction_type_t reaction;</div><div class='add'>+</div><div class='add'>+    /* whether locking failed on _any_ of the "locks" above */</div><div class='add'>+    int op_ret;</div><div class='add'>+    int op_errno;</div><div class='add'>+} dht_ilock_wrap_t;</div><div class='add'>+</div><div class='add'>+/* The lock structure represents entrylk. */</div><div class='add'>+typedef struct {</div><div class='add'>+    fop_entrylk_cbk_t entrylk_cbk;</div><div class='add'>+    dht_lock_t **locks;</div><div class='add'>+    int lk_count;</div><div class='add'>+    dht_reaction_type_t reaction;</div><div class='add'>+</div><div class='add'>+    /* whether locking failed on _any_ of the "locks" above */</div><div class='add'>+    int op_ret;</div><div class='add'>+    int op_errno;</div><div class='add'>+} dht_elock_wrap_t;</div><div class='add'>+</div><div class='add'>+/* The first member of dht_dir_transaction_t should be of type dht_ilock_wrap_t.</div><div class='add'>+ * Otherwise it can result in subtle memory corruption issues as in most of the</div><div class='add'>+ * places we use lock[0].layout.my_layout or lock[0].layout.parent_layout and</div><div class='add'>+ * lock[0].ns.parent_layout (like in dht_local_wipe).</div><div class='add'>+ */</div><div class='add'>+typedef union {</div><div class='add'>+    union {</div><div class='add'>+        dht_ilock_wrap_t my_layout;</div><div class='add'>+        dht_ilock_wrap_t parent_layout;</div><div class='add'>+    } layout;</div><div class='add'>+    struct dht_namespace {</div><div class='add'>+        dht_ilock_wrap_t parent_layout;</div><div class='add'>+        dht_elock_wrap_t directory_ns;</div><div class='add'>+        fop_entrylk_cbk_t ns_cbk;</div><div class='add'>+    } ns;</div><div class='add'>+} dht_dir_transaction_t;</div><div class='add'>+</div><div class='add'>+typedef int (*dht_selfheal_layout_t)(call_frame_t *frame, loc_t *loc,</div><div class='add'>+                                     dht_layout_t *layout);</div><div class='add'>+</div><div class='add'>+typedef gf_boolean_t (*dht_need_heal_t)(call_frame_t *frame,</div><div class='add'>+                                        dht_layout_t **inmem,</div><div class='add'>+                                        dht_layout_t **ondisk);</div><div class='ctx'> </div><div class='ctx'> struct dht_local {</div><div class='del'>-	int                      call_cnt;</div><div class='del'>-	loc_t                    loc;</div><div class='del'>-	loc_t                    loc2;</div><div class='del'>-	int                      op_ret;</div><div class='del'>-	int                      op_errno;</div><div class='del'>-	int                      layout_mismatch;</div><div class='del'>-        /* Use stbuf as the postbuf, when we require both</div><div class='del'>-         * pre and post attrs */</div><div class='del'>-	struct iatt              stbuf;</div><div class='del'>-        struct iatt              prebuf;</div><div class='del'>-        struct iatt              preoldparent;</div><div class='del'>-        struct iatt              postoldparent;</div><div class='del'>-        struct iatt              preparent;</div><div class='del'>-        struct iatt              postparent;</div><div class='del'>-	struct statvfs           statvfs;</div><div class='del'>-	fd_t                    *fd;</div><div class='del'>-	inode_t                 *inode;</div><div class='del'>-        dict_t                  *params;</div><div class='del'>-	dict_t                  *xattr;</div><div class='del'>-	dict_t                  *xattr_req;</div><div class='del'>-	dht_layout_t            *layout;</div><div class='del'>-	size_t                   size;</div><div class='del'>-	ino_t                    ia_ino;</div><div class='del'>-        ino_t                    ia_gen;</div><div class='del'>-	xlator_t                *src_hashed, *src_cached;</div><div class='del'>-	xlator_t                *dst_hashed, *dst_cached;</div><div class='del'>-	xlator_t                *cached_subvol;</div><div class='del'>-	xlator_t                *hashed_subvol;</div><div class='del'>-	char                     need_selfheal;</div><div class='del'>-        int                      file_count;</div><div class='del'>-        int                      dir_count;</div><div class='del'>-        call_frame_t            *main_frame;</div><div class='del'>-	struct {</div><div class='del'>-		fop_mknod_cbk_t  linkfile_cbk;</div><div class='del'>-		struct iatt      stbuf;</div><div class='del'>-		loc_t            loc;</div><div class='del'>-		inode_t         *inode;</div><div class='del'>-		dict_t          *xattr;</div><div class='del'>-		xlator_t        *srcvol;</div><div class='del'>-	} linkfile;</div><div class='del'>-	struct {</div><div class='del'>-		uint32_t         hole_cnt;</div><div class='del'>-		uint32_t         overlaps_cnt;</div><div class='del'>-		uint32_t         missing;</div><div class='del'>-		uint32_t         down;</div><div class='del'>-		uint32_t         misc;</div><div class='del'>-		dht_selfheal_dir_cbk_t   dir_cbk;</div><div class='del'>-		dht_layout_t    *layout;</div><div class='del'>-	} selfheal;</div><div class='del'>-        uint32_t                 uid;</div><div class='del'>-        uint32_t                 gid;</div><div class='del'>-</div><div class='del'>-	/* needed by nufa */</div><div class='del'>-	int32_t flags;</div><div class='del'>-	mode_t  mode;</div><div class='del'>-	dev_t   rdev;</div><div class='del'>-</div><div class='del'>-        /* need for file-info */</div><div class='del'>-        char   *pathinfo;</div><div class='del'>-        char   *key;</div><div class='del'>-</div><div class='del'>-        char   *newpath;</div><div class='add'>+    loc_t loc;</div><div class='add'>+    loc_t loc2;</div><div class='add'>+    int call_cnt;</div><div class='add'>+    int op_ret;</div><div class='add'>+    int op_errno;</div><div class='add'>+    int layout_mismatch;</div><div class='add'>+    /* Use stbuf as the postbuf, when we require both</div><div class='add'>+     * pre and post attrs */</div><div class='add'>+    struct iatt stbuf;</div><div class='add'>+    struct iatt mds_stbuf;</div><div class='add'>+    struct iatt prebuf;</div><div class='add'>+    struct iatt preoldparent;</div><div class='add'>+    struct iatt postoldparent;</div><div class='add'>+    struct iatt preparent;</div><div class='add'>+    struct iatt postparent;</div><div class='add'>+    struct statvfs statvfs;</div><div class='add'>+    fd_t *fd;</div><div class='add'>+    inode_t *inode;</div><div class='add'>+    dict_t *params;</div><div class='add'>+    dict_t *xattr;</div><div class='add'>+    dict_t *mds_xattr;</div><div class='add'>+    dict_t *xdata; /* dict used to save xdata response by xattr fop */</div><div class='add'>+    dict_t *xattr_req;</div><div class='add'>+    dht_layout_t *layout;</div><div class='add'>+    size_t size;</div><div class='add'>+    ino_t ia_ino;</div><div class='add'>+    xlator_t *src_hashed, *src_cached;</div><div class='add'>+    xlator_t *dst_hashed, *dst_cached;</div><div class='add'>+    xlator_t *cached_subvol;</div><div class='add'>+    xlator_t *hashed_subvol;</div><div class='add'>+    xlator_t *mds_subvol; /* This is use for dir only */</div><div class='add'>+    int file_count;</div><div class='add'>+    int dir_count;</div><div class='add'>+    call_frame_t *main_frame;</div><div class='add'>+    int fop_succeeded;</div><div class='add'>+    struct {</div><div class='add'>+        fop_mknod_cbk_t linkfile_cbk;</div><div class='add'>+        struct iatt stbuf;</div><div class='add'>+        loc_t loc;</div><div class='add'>+        inode_t *inode;</div><div class='add'>+        dict_t *xattr;</div><div class='add'>+        xlator_t *srcvol;</div><div class='add'>+    } linkfile;</div><div class='add'>+    struct {</div><div class='add'>+        uint32_t hole_cnt;</div><div class='add'>+        uint32_t overlaps_cnt;</div><div class='add'>+        uint32_t down;</div><div class='add'>+        uint32_t misc;</div><div class='add'>+        dht_selfheal_dir_cbk_t dir_cbk;</div><div class='add'>+        dht_selfheal_layout_t healer;</div><div class='add'>+        dht_need_heal_t should_heal;</div><div class='add'>+        dht_layout_t *layout, *refreshed_layout;</div><div class='add'>+        uint32_t missing_cnt;</div><div class='add'>+        gf_boolean_t force_mkdir;</div><div class='add'>+    } selfheal;</div><div class='add'>+</div><div class='add'>+    dht_refresh_layout_unlock refresh_layout_unlock;</div><div class='add'>+    dht_refresh_layout_done_handle refresh_layout_done;</div><div class='add'>+</div><div class='add'>+    uint32_t uid;</div><div class='add'>+    uint32_t gid;</div><div class='add'>+    pid_t pid;</div><div class='add'>+</div><div class='add'>+    glusterfs_fop_t fop;</div><div class='add'>+</div><div class='add'>+    /* need for file-info */</div><div class='add'>+    char *xattr_val;</div><div class='add'>+    char *key;</div><div class='add'>+</div><div class='add'>+    /* needed by nufa */</div><div class='add'>+    int32_t flags;</div><div class='add'>+    mode_t mode;</div><div class='add'>+    dev_t rdev;</div><div class='add'>+    mode_t umask;</div><div class='add'>+</div><div class='add'>+    /* which xattr request? */</div><div class='add'>+    char xsel[256];</div><div class='add'>+    int32_t alloc_len;</div><div class='add'>+</div><div class='add'>+    /* gfid related */</div><div class='add'>+    uuid_t gfid;</div><div class='add'>+    uuid_t gfid_req;</div><div class='add'>+</div><div class='add'>+    xlator_t *link_subvol;</div><div class='add'>+</div><div class='add'>+    struct dht_rebalance_ rebalance;</div><div class='add'>+    xlator_t *first_up_subvol;</div><div class='add'>+</div><div class='add'>+    struct dht_skip_linkto_unlink skip_unlink;</div><div class='add'>+</div><div class='add'>+    dht_dir_transaction_t lock[2], *current;</div><div class='add'>+</div><div class='add'>+    /* inodelks during filerename for backward compatibility */</div><div class='add'>+    dht_lock_t **rename_inodelk_backward_compatible;</div><div class='add'>+</div><div class='add'>+    call_stub_t *stub;</div><div class='add'>+    int32_t parent_disk_layout[4];</div><div class='add'>+</div><div class='add'>+    /* rename rollback */</div><div class='add'>+    int *ret_cache;</div><div class='add'>+</div><div class='add'>+    loc_t loc2_copy;</div><div class='add'>+</div><div class='add'>+    int rename_inodelk_bc_count;</div><div class='add'>+    /* This is use only for directory operation */</div><div class='add'>+    int32_t valid;</div><div class='add'>+    int32_t mds_heal_fresh_lookup;</div><div class='add'>+    short lock_type;</div><div class='add'>+    char need_selfheal;</div><div class='add'>+    char need_xattr_heal;</div><div class='add'>+    char need_attrheal;</div><div class='add'>+    /* flag used to make sure we need to return estale in</div><div class='add'>+       {lookup,revalidate}_cbk */</div><div class='add'>+    char return_estale;</div><div class='add'>+    char need_lookup_everywhere;</div><div class='add'>+    /* fd open check */</div><div class='add'>+    gf_boolean_t fd_checked;</div><div class='add'>+    gf_boolean_t linked;</div><div class='add'>+    gf_boolean_t added_link;</div><div class='add'>+    gf_boolean_t is_linkfile;</div><div class='add'>+    gf_boolean_t quota_deem_statfs;</div><div class='add'>+    gf_boolean_t heal_layout;</div><div class='add'>+    gf_boolean_t locked;</div><div class='add'>+    gf_boolean_t dont_create_linkto;</div><div class='add'>+    gf_boolean_t gfid_missing;</div><div class='ctx'> };</div><div class='ctx'> typedef struct dht_local dht_local_t;</div><div class='ctx'> </div><div class='ctx'> /* du - disk-usage */</div><div class='ctx'> struct dht_du {</div><div class='del'>-        double   avail_percent;</div><div class='del'>-        uint64_t avail_space;</div><div class='del'>-        uint32_t log;</div><div class='add'>+    double avail_percent;</div><div class='add'>+    double avail_inodes;</div><div class='add'>+    uint64_t avail_space;</div><div class='add'>+    uint32_t log;</div><div class='add'>+    uint32_t chunks;</div><div class='add'>+    uint32_t total_blocks;</div><div class='add'>+    uint32_t avail_blocks;</div><div class='add'>+    uint32_t frsize; /*fragment size*/</div><div class='ctx'> };</div><div class='ctx'> typedef struct dht_du dht_du_t;</div><div class='ctx'> </div><div class='add'>+enum gf_defrag_type {</div><div class='add'>+    GF_DEFRAG_CMD_NONE = 0,</div><div class='add'>+    GF_DEFRAG_CMD_START = 1,</div><div class='add'>+    GF_DEFRAG_CMD_STOP = 1 + 1,</div><div class='add'>+    GF_DEFRAG_CMD_STATUS = 1 + 2,</div><div class='add'>+    GF_DEFRAG_CMD_START_LAYOUT_FIX = 1 + 3,</div><div class='add'>+    GF_DEFRAG_CMD_START_FORCE = 1 + 4,</div><div class='add'>+    GF_DEFRAG_CMD_DETACH_STATUS = 1 + 11,</div><div class='add'>+    GF_DEFRAG_CMD_DETACH_START = 1 + 13,</div><div class='add'>+    GF_DEFRAG_CMD_DETACH_COMMIT = 1 + 14,</div><div class='add'>+    GF_DEFRAG_CMD_DETACH_COMMIT_FORCE = 1 + 15,</div><div class='add'>+    GF_DEFRAG_CMD_DETACH_STOP = 1 + 16,</div><div class='add'>+    /* new labels are used so it will help</div><div class='add'>+     * while removing old labels by easily differentiating.</div><div class='add'>+     * A few labels are added so that the count remains same</div><div class='add'>+     * between this enum and the ones on the xdr file.</div><div class='add'>+     * different values for the same enum cause errors and</div><div class='add'>+     * confusion.</div><div class='add'>+     */</div><div class='add'>+};</div><div class='add'>+typedef enum gf_defrag_type gf_defrag_type;</div><div class='add'>+</div><div class='add'>+enum gf_defrag_status_t {</div><div class='add'>+    GF_DEFRAG_STATUS_NOT_STARTED,</div><div class='add'>+    GF_DEFRAG_STATUS_STARTED,</div><div class='add'>+    GF_DEFRAG_STATUS_STOPPED,</div><div class='add'>+    GF_DEFRAG_STATUS_COMPLETE,</div><div class='add'>+    GF_DEFRAG_STATUS_FAILED,</div><div class='add'>+    GF_DEFRAG_STATUS_LAYOUT_FIX_STARTED,</div><div class='add'>+    GF_DEFRAG_STATUS_LAYOUT_FIX_STOPPED,</div><div class='add'>+    GF_DEFRAG_STATUS_LAYOUT_FIX_COMPLETE,</div><div class='add'>+    GF_DEFRAG_STATUS_LAYOUT_FIX_FAILED,</div><div class='add'>+};</div><div class='add'>+typedef enum gf_defrag_status_t gf_defrag_status_t;</div><div class='add'>+</div><div class='add'>+typedef struct gf_defrag_pattern_list gf_defrag_pattern_list_t;</div><div class='add'>+</div><div class='add'>+struct gf_defrag_pattern_list {</div><div class='add'>+    char path_pattern[256];</div><div class='add'>+    uint64_t size;</div><div class='add'>+    gf_defrag_pattern_list_t *next;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct dht_container {</div><div class='add'>+    union {</div><div class='add'>+        struct list_head list;</div><div class='add'>+        struct {</div><div class='add'>+            struct _gf_dirent_t *next;</div><div class='add'>+            struct _gf_dirent_t *prev;</div><div class='add'>+        };</div><div class='add'>+    };</div><div class='add'>+    gf_dirent_t *df_entry;</div><div class='add'>+    xlator_t *this;</div><div class='add'>+    loc_t *parent_loc;</div><div class='add'>+    dict_t *migrate_data;</div><div class='add'>+    int local_subvol_index;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+typedef struct nodeuuid_info {</div><div class='add'>+    char info;   /* Set to 1 is this is my node's uuid*/</div><div class='add'>+    uuid_t uuid; /* Store the nodeuuid as well for debugging*/</div><div class='add'>+} nodeuuid_info_t;</div><div class='add'>+</div><div class='add'>+typedef struct subvol_nodeuuids_info {</div><div class='add'>+    nodeuuid_info_t *elements;</div><div class='add'>+    int count;</div><div class='add'>+} subvol_nodeuuids_info_t;</div><div class='add'>+</div><div class='add'>+struct gf_defrag_info_ {</div><div class='add'>+    uint64_t total_files;</div><div class='add'>+    uint64_t total_data;</div><div class='add'>+    uint64_t num_files_lookedup;</div><div class='add'>+    uint64_t total_failures;</div><div class='add'>+    uint64_t skipped;</div><div class='add'>+    uint64_t num_dirs_processed;</div><div class='add'>+    uint64_t size_processed;</div><div class='add'>+    gf_lock_t lock;</div><div class='add'>+    pthread_t th;</div><div class='add'>+    struct rpc_clnt *rpc;</div><div class='add'>+    uint32_t connected;</div><div class='add'>+    uint32_t is_exiting;</div><div class='add'>+    pid_t pid;</div><div class='add'>+    int cmd;</div><div class='add'>+    inode_t *root_inode;</div><div class='add'>+    uuid_t node_uuid;</div><div class='add'>+    time_t start_time;</div><div class='add'>+    uint32_t new_commit_hash;</div><div class='add'>+    gf_defrag_status_t defrag_status;</div><div class='add'>+    gf_defrag_pattern_list_t *defrag_pattern;</div><div class='add'>+</div><div class='add'>+    pthread_cond_t parallel_migration_cond;</div><div class='add'>+    pthread_mutex_t dfq_mutex;</div><div class='add'>+    pthread_cond_t rebalance_crawler_alarm;</div><div class='add'>+    int32_t q_entry_count;</div><div class='add'>+    int32_t global_error;</div><div class='add'>+    struct dht_container *queue;</div><div class='add'>+    int32_t crawl_done;</div><div class='add'>+    int32_t abort;</div><div class='add'>+    int32_t wakeup_crawler;</div><div class='add'>+</div><div class='add'>+    /*Throttle params*/</div><div class='add'>+    /*stands for reconfigured thread count*/</div><div class='add'>+    int32_t recon_thread_count;</div><div class='add'>+    pthread_cond_t df_wakeup_thread;</div><div class='add'>+</div><div class='add'>+    /* backpointer to make it easier to write functions for rebalance */</div><div class='add'>+    xlator_t *this;</div><div class='add'>+</div><div class='add'>+    pthread_cond_t fc_wakeup_cond;</div><div class='add'>+    pthread_mutex_t fc_mutex;</div><div class='add'>+</div><div class='add'>+    /*stands for current running thread count*/</div><div class='add'>+    int32_t current_thread_count;</div><div class='add'>+</div><div class='add'>+    gf_boolean_t stats;</div><div class='add'>+    /* lock migration flag */</div><div class='add'>+    gf_boolean_t lock_migration_enabled;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+typedef struct gf_defrag_info_ gf_defrag_info_t;</div><div class='add'>+</div><div class='add'>+struct dht_methods_s {</div><div class='add'>+    int32_t (*migration_get_dst_subvol)(xlator_t *this, dht_local_t *local);</div><div class='add'>+    int32_t (*migration_other)(xlator_t *this, gf_defrag_info_t *defrag);</div><div class='add'>+    xlator_t *(*layout_search)(xlator_t *this, dht_layout_t *layout,</div><div class='add'>+                               const char *name);</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+typedef struct dht_methods_s dht_methods_t;</div><div class='add'>+</div><div class='ctx'> struct dht_conf {</div><div class='del'>-	gf_lock_t      subvolume_lock;</div><div class='del'>-        int            subvolume_cnt;</div><div class='del'>-        xlator_t     **subvolumes;</div><div class='del'>-	char          *subvolume_status;</div><div class='del'>-	dht_layout_t **file_layouts;</div><div class='del'>-	dht_layout_t **dir_layouts;</div><div class='del'>-	dht_layout_t  *default_dir_layout;</div><div class='del'>-	gf_boolean_t   search_unhashed;</div><div class='del'>-	int            gen;</div><div class='del'>-        dht_du_t      *du_stats;</div><div class='del'>-        uint64_t       min_free_disk;</div><div class='del'>-        char           disk_unit;</div><div class='del'>-        int32_t        refresh_interval;</div><div class='del'>-        gf_boolean_t   unhashed_sticky_bit;</div><div class='del'>-	struct timeval last_stat_fetch;</div><div class='del'>-        gf_lock_t      layout_lock;</div><div class='del'>-        void          *private;     /* Can be used by wrapper xlators over</div><div class='del'>-                                       dht */</div><div class='del'>-        gf_boolean_t   use_readdirp;</div><div class='add'>+    xlator_t **subvolumes;</div><div class='add'>+    char *subvolume_status;</div><div class='add'>+    int *last_event;</div><div class='add'>+    dht_layout_t **file_layouts;</div><div class='add'>+    dht_layout_t **dir_layouts;</div><div class='add'>+    unsigned int search_unhashed;</div><div class='add'>+    int gen;</div><div class='add'>+    dht_du_t *du_stats;</div><div class='add'>+    double min_free_disk;</div><div class='add'>+    double min_free_inodes;</div><div class='add'>+    int subvolume_cnt;</div><div class='add'>+    int32_t refresh_interval;</div><div class='add'>+    gf_lock_t subvolume_lock;</div><div class='add'>+    time_t last_stat_fetch;</div><div class='add'>+    gf_lock_t layout_lock;</div><div class='add'>+    dict_t *leaf_to_subvol;</div><div class='add'>+    void *private; /* Can be used by wrapper xlators over</div><div class='add'>+                      dht */</div><div class='add'>+    time_t *subvol_up_time;</div><div class='add'>+</div><div class='add'>+    /* to keep track of nodes which are decommissioned */</div><div class='add'>+    xlator_t **decommissioned_bricks;</div><div class='add'>+    int decommission_in_progress;</div><div class='add'>+    int decommission_subvols_cnt;</div><div class='add'>+</div><div class='add'>+    /* defrag related */</div><div class='add'>+    gf_defrag_info_t *defrag;</div><div class='add'>+</div><div class='add'>+    /* Support regex-based name reinterpretation. */</div><div class='add'>+    regex_t rsync_regex;</div><div class='add'>+    regex_t extra_regex;</div><div class='add'>+</div><div class='add'>+    /* Support variable xattr names. */</div><div class='add'>+    char *xattr_name;</div><div class='add'>+    char *mds_xattr_key;</div><div class='add'>+    char *link_xattr_name;</div><div class='add'>+    char *commithash_xattr_name;</div><div class='add'>+    char *wild_xattr_name;</div><div class='add'>+</div><div class='add'>+    dht_methods_t methods;</div><div class='add'>+</div><div class='add'>+    struct mem_pool *lock_pool;</div><div class='add'>+</div><div class='add'>+    /*local subvol storage for rebalance*/</div><div class='add'>+    xlator_t **local_subvols;</div><div class='add'>+    subvol_nodeuuids_info_t *local_nodeuuids;</div><div class='add'>+    int32_t local_subvols_cnt;</div><div class='add'>+</div><div class='add'>+    int dthrottle;</div><div class='add'>+</div><div class='add'>+    /* Hard link handle requirement for migration triggered from client*/</div><div class='add'>+    synclock_t link_lock;</div><div class='add'>+</div><div class='add'>+    /* lock migration */</div><div class='add'>+    gf_lock_t lock;</div><div class='add'>+</div><div class='add'>+    /* This is the count used as the distribute layout for a directory */</div><div class='add'>+    /* Will be a global flag to control the layout spread count */</div><div class='add'>+    uint32_t dir_spread_cnt;</div><div class='add'>+</div><div class='add'>+    /*</div><div class='add'>+     * "Commit hash" for this volume topology.  Changed whenever bricks</div><div class='add'>+     * are added or removed.</div><div class='add'>+     */</div><div class='add'>+    uint32_t vol_commit_hash;</div><div class='add'>+</div><div class='add'>+    char vol_uuid[UUID_SIZE + 1];</div><div class='add'>+</div><div class='add'>+    char disk_unit;</div><div class='add'>+</div><div class='add'>+    gf_boolean_t lock_migration_enabled;</div><div class='add'>+</div><div class='add'>+    gf_boolean_t vch_forced;</div><div class='add'>+</div><div class='add'>+    gf_boolean_t use_fallocate;</div><div class='add'>+</div><div class='add'>+    gf_boolean_t force_migration;</div><div class='add'>+</div><div class='add'>+    gf_boolean_t lookup_optimize;</div><div class='add'>+</div><div class='add'>+    gf_boolean_t unhashed_sticky_bit;</div><div class='add'>+</div><div class='add'>+    gf_boolean_t assert_no_child_down;</div><div class='add'>+</div><div class='add'>+    gf_boolean_t use_readdirp;</div><div class='add'>+</div><div class='add'>+    /* Request to filter directory entries in readdir request */</div><div class='add'>+    gf_boolean_t readdir_optimize;</div><div class='add'>+</div><div class='add'>+    gf_boolean_t rsync_regex_valid;</div><div class='add'>+</div><div class='add'>+    gf_boolean_t extra_regex_valid;</div><div class='add'>+</div><div class='add'>+    /* Support size-weighted rebalancing (heterogeneous bricks). */</div><div class='add'>+    gf_boolean_t do_weighting;</div><div class='add'>+</div><div class='add'>+    gf_boolean_t randomize_by_gfid;</div><div class='ctx'> };</div><div class='ctx'> typedef struct dht_conf dht_conf_t;</div><div class='ctx'> </div><div class='add'>+struct dht_dfoffset_ctx {</div><div class='add'>+    xlator_t *this;</div><div class='add'>+    off_t offset;</div><div class='add'>+    int32_t readdir_done;</div><div class='add'>+};</div><div class='add'>+typedef struct dht_dfoffset_ctx dht_dfoffset_ctx_t;</div><div class='ctx'> </div><div class='ctx'> struct dht_disk_layout {</div><div class='del'>-	uint32_t           cnt;</div><div class='del'>-	uint32_t           type;</div><div class='del'>-	struct {</div><div class='del'>-		uint32_t   start;</div><div class='del'>-		uint32_t   stop;</div><div class='del'>-	} list[1];</div><div class='add'>+    uint32_t cnt;</div><div class='add'>+    uint32_t type;</div><div class='add'>+    struct {</div><div class='add'>+        uint32_t start;</div><div class='add'>+        uint32_t stop;</div><div class='add'>+    } list[1];</div><div class='ctx'> };</div><div class='ctx'> typedef struct dht_disk_layout dht_disk_layout_t;</div><div class='ctx'> </div><div class='del'>-#define WIPE(statp) do { typeof(*statp) z = {0,}; if (statp) *statp = z; } while (0)</div><div class='add'>+typedef enum {</div><div class='add'>+    GF_DHT_MIGRATE_DATA,</div><div class='add'>+    GF_DHT_MIGRATE_DATA_EVEN_IF_LINK_EXISTS,</div><div class='add'>+    GF_DHT_MIGRATE_HARDLINK,</div><div class='add'>+    GF_DHT_MIGRATE_HARDLINK_IN_PROGRESS</div><div class='add'>+} gf_dht_migrate_data_type_t;</div><div class='add'>+</div><div class='add'>+typedef enum {</div><div class='add'>+    GF_DHT_EQUAL_DISTRIBUTION,</div><div class='add'>+    GF_DHT_WEIGHTED_DISTRIBUTION</div><div class='add'>+} dht_distribution_type_t;</div><div class='ctx'> </div><div class='del'>-#define ENTRY_MISSING(op_ret, op_errno) (op_ret == -1 &amp;&amp; op_errno == ENOENT)</div><div class='add'>+struct dir_dfmeta {</div><div class='add'>+    gf_dirent_t *equeue;</div><div class='add'>+    dht_dfoffset_ctx_t *offset_var;</div><div class='add'>+    struct list_head **head;</div><div class='add'>+    struct list_head **iterator;</div><div class='add'>+    int *fetch_entries;</div><div class='add'>+    /* fds corresponding to local subvols only */</div><div class='add'>+    fd_t **lfd;</div><div class='add'>+};</div><div class='ctx'> </div><div class='del'>-#define is_fs_root(loc) (strcmp (loc-&gt;path, "/") == 0)</div><div class='add'>+typedef struct dht_migrate_info {</div><div class='add'>+    xlator_t *src_subvol;</div><div class='add'>+    xlator_t *dst_subvol;</div><div class='add'>+    GF_REF_DECL;</div><div class='add'>+} dht_migrate_info_t;</div><div class='ctx'> </div><div class='del'>-#define is_revalidate(loc) (inode_ctx_get (loc-&gt;inode, this, NULL) == 0)</div><div class='add'>+typedef struct dht_fd_ctx {</div><div class='add'>+    uint64_t opened_on_dst;</div><div class='add'>+    GF_REF_DECL;</div><div class='add'>+} dht_fd_ctx_t;</div><div class='add'>+</div><div class='add'>+#define ENTRY_MISSING(op_ret, op_errno) (op_ret == -1 &amp;&amp; op_errno == ENOENT)</div><div class='add'>+</div><div class='add'>+#define is_revalidate(loc)                                                     \</div><div class='add'>+    (dht_inode_ctx_layout_get((loc)-&gt;inode, this, NULL) == 0)</div><div class='ctx'> </div><div class='ctx'> #define is_last_call(cnt) (cnt == 0)</div><div class='ctx'> </div><div class='del'>-#define DHT_LINKFILE_MODE (S_ISVTX)</div><div class='del'>-#define check_is_linkfile(i,s,x) (                                      \</div><div class='del'>-                ((st_mode_from_ia (s-&gt;ia_prot, s-&gt;ia_type) &amp; ~S_IFMT)   \</div><div class='del'>-                 == DHT_LINKFILE_MODE) &amp;&amp;                               \</div><div class='del'>-                (s-&gt;ia_size == 0))</div><div class='add'>+#define DHT_MIGRATION_IN_PROGRESS 1</div><div class='add'>+#define DHT_MIGRATION_COMPLETED 2</div><div class='add'>+</div><div class='add'>+#define check_is_linkfile(i, s, x, n)                                          \</div><div class='add'>+    (IS_DHT_LINKFILE_MODE(s) &amp;&amp; dict_get(x, n))</div><div class='add'>+</div><div class='add'>+#define IS_DHT_MIGRATION_PHASE2(buf)                                           \</div><div class='add'>+    (IA_ISREG((buf)-&gt;ia_type) &amp;&amp;                                               \</div><div class='add'>+     ((st_mode_from_ia((buf)-&gt;ia_prot, (buf)-&gt;ia_type) &amp; ~S_IFMT) ==           \</div><div class='add'>+      DHT_LINKFILE_MODE))</div><div class='add'>+</div><div class='add'>+#define IS_DHT_MIGRATION_PHASE1(buf)                                           \</div><div class='add'>+    (IA_ISREG((buf)-&gt;ia_type) &amp;&amp; ((buf)-&gt;ia_prot.sticky == 1) &amp;&amp;               \</div><div class='add'>+     ((buf)-&gt;ia_prot.sgid == 1))</div><div class='ctx'> </div><div class='del'>-#define check_is_dir(i,s,x) (IA_ISDIR(s-&gt;ia_type))</div><div class='add'>+#define DHT_STRIP_PHASE1_FLAGS(buf)                                            \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        if ((buf) &amp;&amp; IS_DHT_MIGRATION_PHASE1(buf)) {                           \</div><div class='add'>+            (buf)-&gt;ia_prot.sticky = 0;                                         \</div><div class='add'>+            (buf)-&gt;ia_prot.sgid = 0;                                           \</div><div class='add'>+        }                                                                      \</div><div class='add'>+    } while (0)</div><div class='add'>+</div><div class='add'>+#define dht_inode_missing(op_errno) (op_errno == ENOENT || op_errno == ESTALE)</div><div class='add'>+</div><div class='add'>+#define check_is_dir(i, s, x) (IA_ISDIR(s-&gt;ia_type))</div><div class='ctx'> </div><div class='ctx'> #define layout_is_sane(layout) ((layout) &amp;&amp; (layout-&gt;cnt &gt; 0))</div><div class='ctx'> </div><div class='del'>-#define DHT_STACK_UNWIND(fop, frame, params ...) do {           \</div><div class='del'>-		dht_local_t *__local = NULL;                    \</div><div class='del'>-                xlator_t *__xl = NULL;                          \</div><div class='del'>-                if (frame) {                                    \</div><div class='del'>-                        __xl = frame-&gt;this;                     \</div><div class='del'>-                        __local = frame-&gt;local;                 \</div><div class='del'>-                        frame-&gt;local = NULL;                    \</div><div class='del'>-                }                                               \</div><div class='del'>-		STACK_UNWIND_STRICT (fop, frame, params);       \</div><div class='del'>-		dht_local_wipe (__xl, __local);                 \</div><div class='del'>-	} while (0)</div><div class='del'>-</div><div class='del'>-#define DHT_STACK_DESTROY(frame) do {		       \</div><div class='del'>-		dht_local_t *__local = NULL;           \</div><div class='del'>-                xlator_t *__xl = NULL;                 \</div><div class='del'>-                __xl = frame-&gt;this;                    \</div><div class='del'>-		__local = frame-&gt;local;                \</div><div class='del'>-		frame-&gt;local = NULL;		       \</div><div class='del'>-		STACK_DESTROY (frame-&gt;root);	       \</div><div class='del'>-		dht_local_wipe (__xl, __local);	       \</div><div class='del'>-	} while (0)</div><div class='del'>-</div><div class='del'>-dht_layout_t *dht_layout_new (xlator_t *this, int cnt);</div><div class='del'>-dht_layout_t *dht_layout_get (xlator_t *this, inode_t *inode);</div><div class='del'>-dht_layout_t *dht_layout_for_subvol (xlator_t *this, xlator_t *subvol);</div><div class='del'>-xlator_t *dht_layout_search (xlator_t *this, dht_layout_t *layout,</div><div class='del'>-			     const char *name);</div><div class='del'>-int dht_layout_normalize (xlator_t *this, loc_t *loc, dht_layout_t *layout);</div><div class='del'>-int dht_layout_anomalies (xlator_t *this, loc_t *loc, dht_layout_t *layout,</div><div class='del'>-			  uint32_t *holes_p, uint32_t *overlaps_p,</div><div class='del'>-			  uint32_t *missing_p, uint32_t *down_p,</div><div class='del'>-			  uint32_t *misc_p);</div><div class='del'>-int dht_layout_dir_mismatch (xlator_t *this, dht_layout_t *layout,</div><div class='del'>-			     xlator_t *subvol, loc_t *loc, dict_t *xattr);</div><div class='del'>-</div><div class='del'>-xlator_t *dht_linkfile_subvol (xlator_t *this, inode_t *inode,</div><div class='del'>-			       struct iatt *buf, dict_t *xattr);</div><div class='del'>-int dht_linkfile_unlink (call_frame_t *frame, xlator_t *this,</div><div class='del'>-			 xlator_t *subvol, loc_t *loc);</div><div class='del'>-</div><div class='del'>-int dht_layouts_init (xlator_t *this, dht_conf_t *conf);</div><div class='del'>-int dht_layout_merge (xlator_t *this, dht_layout_t *layout, xlator_t *subvol,</div><div class='del'>-		      int op_ret, int op_errno, dict_t *xattr);</div><div class='del'>-</div><div class='del'>-int dht_disk_layout_extract (xlator_t *this, dht_layout_t *layout,</div><div class='del'>-			     int pos, int32_t **disk_layout_p);</div><div class='del'>-int dht_disk_layout_merge (xlator_t *this, dht_layout_t *layout,</div><div class='del'>-			   int pos, void *disk_layout_raw);</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int dht_frame_return (call_frame_t *frame);</div><div class='del'>-</div><div class='del'>-int dht_itransform (xlator_t *this, xlator_t *subvol, uint64_t x, uint64_t *y);</div><div class='del'>-int dht_deitransform (xlator_t *this, uint64_t y, xlator_t **subvol,</div><div class='del'>-		      uint64_t *x);</div><div class='del'>-</div><div class='del'>-void dht_local_wipe (xlator_t *this, dht_local_t *local);</div><div class='del'>-dht_local_t *dht_local_init (call_frame_t *frame);</div><div class='del'>-int dht_iatt_merge (xlator_t *this, struct iatt *to, struct iatt *from,</div><div class='del'>-		    xlator_t *subvol);</div><div class='del'>-</div><div class='del'>-xlator_t *dht_subvol_get_hashed (xlator_t *this, loc_t *loc);</div><div class='del'>-xlator_t *dht_subvol_get_cached (xlator_t *this, inode_t *inode);</div><div class='del'>-xlator_t *dht_subvol_next (xlator_t *this, xlator_t *prev);</div><div class='del'>-int dht_subvol_cnt (xlator_t *this, xlator_t *subvol);</div><div class='del'>-</div><div class='del'>-int dht_hash_compute (int type, const char *name, uint32_t *hash_p);</div><div class='del'>-</div><div class='del'>-int dht_linkfile_create (call_frame_t *frame, fop_mknod_cbk_t linkfile_cbk,</div><div class='del'>-			 xlator_t *tovol, xlator_t *fromvol, loc_t *loc);</div><div class='del'>-int dht_lookup_directory (call_frame_t *frame, xlator_t *this, loc_t *loc);</div><div class='del'>-int dht_lookup_everywhere (call_frame_t *frame, xlator_t *this, loc_t *loc);</div><div class='del'>-int</div><div class='del'>-dht_selfheal_directory (call_frame_t *frame, dht_selfheal_dir_cbk_t cbk,</div><div class='del'>-			loc_t *loc, dht_layout_t *layout);</div><div class='del'>-int</div><div class='del'>-dht_selfheal_new_directory (call_frame_t *frame, dht_selfheal_dir_cbk_t cbk,</div><div class='del'>-			    dht_layout_t *layout);</div><div class='del'>-int</div><div class='del'>-dht_selfheal_restore (call_frame_t *frame, dht_selfheal_dir_cbk_t cbk,</div><div class='del'>-		      loc_t *loc, dht_layout_t *layout);</div><div class='del'>-int</div><div class='del'>-dht_layout_sort_volname (dht_layout_t *layout);</div><div class='del'>-</div><div class='del'>-int dht_rename (call_frame_t *frame, xlator_t *this,</div><div class='del'>-		loc_t *oldloc, loc_t *newloc);</div><div class='del'>-</div><div class='del'>-int dht_get_du_info (call_frame_t *frame, xlator_t *this, loc_t *loc);</div><div class='del'>-</div><div class='del'>-int dht_is_subvol_filled (xlator_t *this, xlator_t *subvol);</div><div class='del'>-xlator_t *dht_free_disk_available_subvol (xlator_t *this, xlator_t *subvol);</div><div class='del'>-int dht_get_du_info_for_subvol (xlator_t *this, int subvol_idx);</div><div class='del'>-</div><div class='del'>-int dht_layout_preset (xlator_t *this, xlator_t *subvol, inode_t *inode);</div><div class='del'>-int dht_layout_set (xlator_t *this, inode_t *inode, dht_layout_t *layout);</div><div class='del'>-void dht_layout_unref (xlator_t *this, dht_layout_t *layout);</div><div class='del'>-dht_layout_t *dht_layout_ref (xlator_t *this, dht_layout_t *layout);</div><div class='del'>-xlator_t *dht_first_up_subvol (xlator_t *this);</div><div class='del'>-xlator_t *dht_last_up_subvol (xlator_t *this);</div><div class='del'>-int dht_frame_su_do (call_frame_t *frame);</div><div class='del'>-int dht_frame_su_undo (call_frame_t *frame);</div><div class='del'>-</div><div class='del'>-int dht_build_child_loc (xlator_t *this, loc_t *child, loc_t *parent, char *name);</div><div class='del'>-</div><div class='del'>-int dht_filter_loc_subvol_key (xlator_t *this, loc_t *loc, loc_t *new_loc,</div><div class='del'>-                               xlator_t **subvol);</div><div class='add'>+#define we_are_not_migrating(x) ((x) == 1)</div><div class='add'>+</div><div class='add'>+#define DHT_STACK_UNWIND(fop, frame, params...)                                \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        dht_local_t *__local = NULL;                                           \</div><div class='add'>+        xlator_t *__xl = NULL;                                                 \</div><div class='add'>+        if (frame) {                                                           \</div><div class='add'>+            __xl = frame-&gt;this;                                                \</div><div class='add'>+            __local = frame-&gt;local;                                            \</div><div class='add'>+            frame-&gt;local = NULL;                                               \</div><div class='add'>+        }                                                                      \</div><div class='add'>+        STACK_UNWIND_STRICT(fop, frame, params);                               \</div><div class='add'>+        dht_local_wipe(__xl, __local);                                         \</div><div class='add'>+    } while (0)</div><div class='add'>+</div><div class='add'>+#define DHT_STACK_DESTROY(frame)                                               \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        dht_local_t *__local = NULL;                                           \</div><div class='add'>+        xlator_t *__xl = NULL;                                                 \</div><div class='add'>+        __xl = frame-&gt;this;                                                    \</div><div class='add'>+        __local = frame-&gt;local;                                                \</div><div class='add'>+        frame-&gt;local = NULL;                                                   \</div><div class='add'>+        STACK_DESTROY(frame-&gt;root);                                            \</div><div class='add'>+        dht_local_wipe(__xl, __local);                                         \</div><div class='add'>+    } while (0)</div><div class='add'>+</div><div class='add'>+#define DHT_UPDATE_TIME(ctx_sec, ctx_nsec, new_sec, new_nsec, post)            \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        if (ctx_sec == new_sec)                                                \</div><div class='add'>+            new_nsec = max(new_nsec, ctx_nsec);                                \</div><div class='add'>+        else if (ctx_sec &gt; new_sec) {                                          \</div><div class='add'>+            new_sec = ctx_sec;                                                 \</div><div class='add'>+            new_nsec = ctx_nsec;                                               \</div><div class='add'>+        }                                                                      \</div><div class='add'>+        if (post) {                                                            \</div><div class='add'>+            ctx_sec = new_sec;                                                 \</div><div class='add'>+            ctx_nsec = new_nsec;                                               \</div><div class='add'>+        }                                                                      \</div><div class='add'>+    } while (0)</div><div class='add'>+</div><div class='add'>+#define is_greater_time(a, an, b, bn)                                          \</div><div class='add'>+    (((a) &lt; (b)) || (((a) == (b)) &amp;&amp; ((an) &lt; (bn))))</div><div class='add'>+</div><div class='add'>+#define DHT_MARK_FOP_INTERNAL(xattr)                                           \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        int tmp = -1;                                                          \</div><div class='add'>+        if (!xattr) {                                                          \</div><div class='add'>+            xattr = dict_new();                                                \</div><div class='add'>+            if (!xattr)                                                        \</div><div class='add'>+                break;                                                         \</div><div class='add'>+        }                                                                      \</div><div class='add'>+        tmp = dict_set_str(xattr, GLUSTERFS_INTERNAL_FOP_KEY, "yes");          \</div><div class='add'>+        if (tmp) {                                                             \</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, 0, DHT_MSG_DICT_SET_FAILED,       \</div><div class='add'>+                   "Failed to set dictionary value: key = %s,"                 \</div><div class='add'>+                   " path = %s",                                               \</div><div class='add'>+                   GLUSTERFS_INTERNAL_FOP_KEY, local-&gt;loc.path);               \</div><div class='add'>+        }                                                                      \</div><div class='add'>+    } while (0)</div><div class='add'>+</div><div class='add'>+dht_layout_t *</div><div class='add'>+dht_layout_new(xlator_t *this, int cnt);</div><div class='add'>+dht_layout_t *</div><div class='add'>+dht_layout_get(xlator_t *this, inode_t *inode);</div><div class='add'>+dht_layout_t *</div><div class='add'>+dht_layout_for_subvol(xlator_t *this, xlator_t *subvol);</div><div class='add'>+xlator_t *</div><div class='add'>+dht_layout_search(xlator_t *this, dht_layout_t *layout, const char *name);</div><div class='add'>+int32_t</div><div class='add'>+dht_migration_get_dst_subvol(xlator_t *this, dht_local_t *local);</div><div class='add'>+int32_t</div><div class='add'>+dht_migration_needed(xlator_t *this);</div><div class='add'>+int</div><div class='add'>+dht_layout_normalize(xlator_t *this, loc_t *loc, dht_layout_t *layout);</div><div class='add'>+void</div><div class='add'>+dht_layout_anomalies(xlator_t *this, loc_t *loc, dht_layout_t *layout,</div><div class='add'>+                     uint32_t *holes_p, uint32_t *overlaps_p,</div><div class='add'>+                     uint32_t *missing_p, uint32_t *down_p, uint32_t *misc_p,</div><div class='add'>+                     uint32_t *no_space_p);</div><div class='add'>+int</div><div class='add'>+dht_layout_dir_mismatch(xlator_t *this, dht_layout_t *layout, xlator_t *subvol,</div><div class='add'>+                        loc_t *loc, dict_t *xattr);</div><div class='add'>+xlator_t *</div><div class='add'>+dht_linkfile_subvol(xlator_t *this, inode_t *inode, struct iatt *buf,</div><div class='add'>+                    dict_t *xattr);</div><div class='add'>+int</div><div class='add'>+dht_linkfile_unlink(call_frame_t *frame, xlator_t *this, xlator_t *subvol,</div><div class='add'>+                    loc_t *loc);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+dht_layouts_init(xlator_t *this, dht_conf_t *conf);</div><div class='add'>+int</div><div class='add'>+dht_layout_merge(xlator_t *this, dht_layout_t *layout, xlator_t *subvol,</div><div class='add'>+                 int op_ret, int op_errno, dict_t *xattr);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+dht_disk_layout_extract(xlator_t *this, dht_layout_t *layout, int pos,</div><div class='add'>+                        int32_t **disk_layout_p);</div><div class='add'>+int</div><div class='add'>+dht_disk_layout_extract_for_subvol(xlator_t *this, dht_layout_t *layout,</div><div class='add'>+                                   xlator_t *subvol, int32_t **disk_layout_p);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+dht_frame_return(call_frame_t *frame);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+dht_deitransform(xlator_t *this, uint64_t y, xlator_t **subvol);</div><div class='ctx'> </div><div class='add'>+void</div><div class='add'>+dht_local_wipe(xlator_t *this, dht_local_t *local);</div><div class='add'>+dht_local_t *</div><div class='add'>+dht_local_init(call_frame_t *frame, loc_t *loc, fd_t *fd, glusterfs_fop_t fop);</div><div class='add'>+int</div><div class='add'>+dht_iatt_merge(xlator_t *this, struct iatt *to, struct iatt *from);</div><div class='add'>+</div><div class='add'>+xlator_t *</div><div class='add'>+dht_subvol_get_hashed(xlator_t *this, loc_t *loc);</div><div class='add'>+xlator_t *</div><div class='add'>+dht_subvol_get_cached(xlator_t *this, inode_t *inode);</div><div class='add'>+xlator_t *</div><div class='add'>+dht_subvol_next(xlator_t *this, xlator_t *prev);</div><div class='add'>+xlator_t *</div><div class='add'>+dht_subvol_next_available(xlator_t *this, xlator_t *prev);</div><div class='add'>+int</div><div class='add'>+dht_subvol_cnt(xlator_t *this, xlator_t *subvol);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+dht_hash_compute(xlator_t *this, int type, const char *name, uint32_t *hash_p);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+dht_linkfile_create(call_frame_t *frame, fop_mknod_cbk_t linkfile_cbk,</div><div class='add'>+                    xlator_t *this, xlator_t *tovol, xlator_t *fromvol,</div><div class='add'>+                    loc_t *loc);</div><div class='add'>+int</div><div class='add'>+dht_lookup_everywhere(call_frame_t *frame, xlator_t *this, loc_t *loc);</div><div class='add'>+int</div><div class='add'>+dht_selfheal_directory(call_frame_t *frame, dht_selfheal_dir_cbk_t cbk,</div><div class='add'>+                       loc_t *loc, dht_layout_t *layout);</div><div class='add'>+int</div><div class='add'>+dht_selfheal_new_directory(call_frame_t *frame, dht_selfheal_dir_cbk_t cbk,</div><div class='add'>+                           dht_layout_t *layout);</div><div class='add'>+int</div><div class='add'>+dht_selfheal_restore(call_frame_t *frame, dht_selfheal_dir_cbk_t cbk,</div><div class='add'>+                     loc_t *loc, dht_layout_t *layout);</div><div class='add'>+void</div><div class='add'>+dht_layout_sort_volname(dht_layout_t *layout);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+dht_get_du_info(call_frame_t *frame, xlator_t *this, loc_t *loc);</div><div class='add'>+</div><div class='add'>+gf_boolean_t</div><div class='add'>+dht_is_subvol_filled(xlator_t *this, xlator_t *subvol);</div><div class='add'>+xlator_t *</div><div class='add'>+dht_free_disk_available_subvol(xlator_t *this, xlator_t *subvol,</div><div class='add'>+                               dht_local_t *layout);</div><div class='add'>+int</div><div class='add'>+dht_get_du_info_for_subvol(xlator_t *this, int subvol_idx);</div><div class='ctx'> </div><div class='add'>+int</div><div class='add'>+dht_layout_preset(xlator_t *this, xlator_t *subvol, inode_t *inode);</div><div class='add'>+int</div><div class='add'>+dht_layout_set(xlator_t *this, inode_t *inode, dht_layout_t *layout);</div><div class='add'>+;</div><div class='add'>+void</div><div class='add'>+dht_layout_unref(xlator_t *this, dht_layout_t *layout);</div><div class='add'>+dht_layout_t *</div><div class='add'>+dht_layout_ref(xlator_t *this, dht_layout_t *layout);</div><div class='add'>+int</div><div class='add'>+dht_layout_index_for_subvol(dht_layout_t *layout, xlator_t *subvol);</div><div class='add'>+xlator_t *</div><div class='add'>+dht_first_up_subvol(xlator_t *this);</div><div class='add'>+xlator_t *</div><div class='add'>+dht_last_up_subvol(xlator_t *this);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+dht_build_child_loc(xlator_t *this, loc_t *child, loc_t *parent, char *name);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+dht_filter_loc_subvol_key(xlator_t *this, loc_t *loc, loc_t *new_loc,</div><div class='add'>+                          xlator_t **subvol);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+dht_rename_cleanup(call_frame_t *frame);</div><div class='add'>+int</div><div class='add'>+dht_rename_link_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                    int32_t op_ret, int32_t op_errno, inode_t *inode,</div><div class='add'>+                    struct iatt *stbuf, struct iatt *preparent,</div><div class='add'>+                    struct iatt *postparent, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+dht_update_commit_hash_for_layout(call_frame_t *frame);</div><div class='add'>+int</div><div class='add'>+dht_fix_directory_layout(call_frame_t *frame, dht_selfheal_dir_cbk_t dir_cbk,</div><div class='add'>+                         dht_layout_t *layout);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+dht_init_subvolumes(xlator_t *this, dht_conf_t *conf);</div><div class='add'>+</div><div class='add'>+/* migration/rebalance */</div><div class='add'>+int</div><div class='add'>+dht_start_rebalance_task(xlator_t *this, call_frame_t *frame);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+dht_rebalance_in_progress_check(xlator_t *this, call_frame_t *frame);</div><div class='add'>+int</div><div class='add'>+dht_rebalance_complete_check(xlator_t *this, call_frame_t *frame);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+dht_init_local_subvolumes(xlator_t *this, dht_conf_t *conf);</div><div class='add'>+</div><div class='add'>+/* FOPS */</div><div class='add'>+int32_t</div><div class='add'>+dht_lookup(call_frame_t *frame, xlator_t *this, loc_t *loc, dict_t *xattr_req);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+dht_stat(call_frame_t *frame, xlator_t *this, loc_t *loc, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+dht_fstat(call_frame_t *frame, xlator_t *this, fd_t *fd, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+dht_truncate(call_frame_t *frame, xlator_t *this, loc_t *loc, off_t offset,</div><div class='add'>+             dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+dht_ftruncate(call_frame_t *frame, xlator_t *this, fd_t *fd, off_t offset,</div><div class='add'>+              dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+dht_access(call_frame_t *frame, xlator_t *this, loc_t *loc, int32_t mask,</div><div class='add'>+           dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+dht_readlink(call_frame_t *frame, xlator_t *this, loc_t *loc, size_t size,</div><div class='add'>+             dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+dht_mknod(call_frame_t *frame, xlator_t *this, loc_t *loc, mode_t mode,</div><div class='add'>+          dev_t rdev, mode_t umask, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+dht_mkdir(call_frame_t *frame, xlator_t *this, loc_t *loc, mode_t mode,</div><div class='add'>+          mode_t umask, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+dht_unlink(call_frame_t *frame, xlator_t *this, loc_t *loc, int xflag,</div><div class='add'>+           dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+dht_rmdir(call_frame_t *frame, xlator_t *this, loc_t *loc, int flags,</div><div class='add'>+          dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+dht_symlink(call_frame_t *frame, xlator_t *this, const char *linkpath,</div><div class='add'>+            loc_t *loc, mode_t umask, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+dht_rename(call_frame_t *frame, xlator_t *this, loc_t *oldloc, loc_t *newloc,</div><div class='add'>+           dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+dht_link(call_frame_t *frame, xlator_t *this, loc_t *oldloc, loc_t *newloc,</div><div class='add'>+         dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+dht_create(call_frame_t *frame, xlator_t *this, loc_t *loc, int32_t flags,</div><div class='add'>+           mode_t mode, mode_t umask, fd_t *fd, dict_t *params);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+dht_open(call_frame_t *frame, xlator_t *this, loc_t *loc, int32_t flags,</div><div class='add'>+         fd_t *fd, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+dht_readv(call_frame_t *frame, xlator_t *this, fd_t *fd, size_t size,</div><div class='add'>+          off_t offset, uint32_t flags, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+dht_writev(call_frame_t *frame, xlator_t *this, fd_t *fd, struct iovec *vector,</div><div class='add'>+           int32_t count, off_t offset, uint32_t flags, struct iobref *iobref,</div><div class='add'>+           dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+dht_flush(call_frame_t *frame, xlator_t *this, fd_t *fd, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+dht_fsync(call_frame_t *frame, xlator_t *this, fd_t *fd, int32_t datasync,</div><div class='add'>+          dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+dht_opendir(call_frame_t *frame, xlator_t *this, loc_t *loc, fd_t *fd,</div><div class='add'>+            dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+dht_fsyncdir(call_frame_t *frame, xlator_t *this, fd_t *fd, int32_t datasync,</div><div class='add'>+             dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+dht_statfs(call_frame_t *frame, xlator_t *this, loc_t *loc, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+dht_setxattr(call_frame_t *frame, xlator_t *this, loc_t *loc, dict_t *dict,</div><div class='add'>+             int32_t flags, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+dht_getxattr(call_frame_t *frame, xlator_t *this, loc_t *loc, const char *name,</div><div class='add'>+             dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+dht_fsetxattr(call_frame_t *frame, xlator_t *this, fd_t *fd, dict_t *dict,</div><div class='add'>+              int32_t flags, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+dht_fgetxattr(call_frame_t *frame, xlator_t *this, fd_t *fd, const char *name,</div><div class='add'>+              dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+dht_removexattr(call_frame_t *frame, xlator_t *this, loc_t *loc,</div><div class='add'>+                const char *name, dict_t *xdata);</div><div class='add'>+int32_t</div><div class='add'>+dht_fremovexattr(call_frame_t *frame, xlator_t *this, fd_t *fd,</div><div class='add'>+                 const char *name, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+dht_lk(call_frame_t *frame, xlator_t *this, fd_t *fd, int32_t cmd,</div><div class='add'>+       struct gf_flock *flock, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+dht_lease(call_frame_t *frame, xlator_t *this, loc_t *loc,</div><div class='add'>+          struct gf_lease *lease, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+dht_inodelk(call_frame_t *frame, xlator_t *this, const char *volume, loc_t *loc,</div><div class='add'>+            int32_t cmd, struct gf_flock *flock, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+dht_finodelk(call_frame_t *frame, xlator_t *this, const char *volume, fd_t *fd,</div><div class='add'>+             int32_t cmd, struct gf_flock *flock, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+dht_entrylk(call_frame_t *frame, xlator_t *this, const char *volume, loc_t *loc,</div><div class='add'>+            const char *basename, entrylk_cmd cmd, entrylk_type type,</div><div class='add'>+            dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+dht_fentrylk(call_frame_t *frame, xlator_t *this, const char *volume, fd_t *fd,</div><div class='add'>+             const char *basename, entrylk_cmd cmd, entrylk_type type,</div><div class='add'>+             dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+dht_readdir(call_frame_t *frame, xlator_t *this, fd_t *fd, size_t size,</div><div class='add'>+            off_t off, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+dht_readdirp(call_frame_t *frame, xlator_t *this, fd_t *fd, size_t size,</div><div class='add'>+             off_t off, dict_t *dict);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+dht_xattrop(call_frame_t *frame, xlator_t *this, loc_t *loc,</div><div class='add'>+            gf_xattrop_flags_t flags, dict_t *dict, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+dht_fxattrop(call_frame_t *frame, xlator_t *this, fd_t *fd,</div><div class='add'>+             gf_xattrop_flags_t flags, dict_t *dict, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+dht_forget(xlator_t *this, inode_t *inode);</div><div class='add'>+int32_t</div><div class='add'>+dht_setattr(call_frame_t *frame, xlator_t *this, loc_t *loc, struct iatt *stbuf,</div><div class='add'>+            int32_t valid, dict_t *xdata);</div><div class='add'>+int32_t</div><div class='add'>+dht_fsetattr(call_frame_t *frame, xlator_t *this, fd_t *fd, struct iatt *stbuf,</div><div class='add'>+             int32_t valid, dict_t *xdata);</div><div class='add'>+int32_t</div><div class='add'>+dht_fallocate(call_frame_t *frame, xlator_t *this, fd_t *fd, int32_t mode,</div><div class='add'>+              off_t offset, size_t len, dict_t *xdata);</div><div class='add'>+int32_t</div><div class='add'>+dht_discard(call_frame_t *frame, xlator_t *this, fd_t *fd, off_t offset,</div><div class='add'>+            size_t len, dict_t *xdata);</div><div class='add'>+int32_t</div><div class='add'>+dht_zerofill(call_frame_t *frame, xlator_t *this, fd_t *fd, off_t offset,</div><div class='add'>+             off_t len, dict_t *xdata);</div><div class='add'>+int32_t</div><div class='add'>+dht_ipc(call_frame_t *frame, xlator_t *this, int32_t op, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+dht_set_subvol_range(xlator_t *this);</div><div class='add'>+int32_t</div><div class='add'>+dht_init(xlator_t *this);</div><div class='add'>+void</div><div class='add'>+dht_fini(xlator_t *this);</div><div class='add'>+int</div><div class='add'>+dht_reconfigure(xlator_t *this, dict_t *options);</div><div class='add'>+int32_t</div><div class='add'>+dht_notify(xlator_t *this, int32_t event, void *data, ...);</div><div class='add'>+</div><div class='add'>+/* definitions for nufa/switch */</div><div class='add'>+int</div><div class='add'>+dht_revalidate_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                   int op_ret, int op_errno, inode_t *inode, struct iatt *stbuf,</div><div class='add'>+                   dict_t *xattr, struct iatt *postparent);</div><div class='add'>+int</div><div class='add'>+dht_lookup_dir_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                   int op_ret, int op_errno, inode_t *inode, struct iatt *stbuf,</div><div class='add'>+                   dict_t *xattr, struct iatt *postparent);</div><div class='add'>+int</div><div class='add'>+dht_lookup_linkfile_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                        int op_ret, int op_errno, inode_t *inode,</div><div class='add'>+                        struct iatt *stbuf, dict_t *xattr,</div><div class='add'>+                        struct iatt *postparent);</div><div class='add'>+int</div><div class='add'>+dht_lookup_cbk(call_frame_t *frame, void *cookie, xlator_t *this, int op_ret,</div><div class='add'>+               int op_errno, inode_t *inode, struct iatt *stbuf, dict_t *xattr,</div><div class='add'>+               struct iatt *postparent);</div><div class='add'>+int</div><div class='add'>+dht_create_cbk(call_frame_t *frame, void *cookie, xlator_t *this, int op_ret,</div><div class='add'>+               int op_errno, fd_t *fd, inode_t *inode, struct iatt *stbuf,</div><div class='add'>+               struct iatt *preparent, struct iatt *postparent, dict_t *xdata);</div><div class='add'>+int</div><div class='add'>+dht_newfile_cbk(call_frame_t *frame, void *cookie, xlator_t *this, int op_ret,</div><div class='add'>+                int op_errno, inode_t *inode, struct iatt *stbuf,</div><div class='add'>+                struct iatt *preparent, struct iatt *postparent, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+dht_finodelk_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                 int32_t op_ret, int32_t op_errno, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+dht_getxattr_cbk(call_frame_t *frame, void *cookie, xlator_t *this, int op_ret,</div><div class='add'>+                 int op_errno, dict_t *xattr, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+dht_common_xattrop_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                       int32_t op_ret, int32_t op_errno, dict_t *dict,</div><div class='add'>+                       dict_t *xdata);</div><div class='add'>+int</div><div class='add'>+gf_defrag_status_get(dht_conf_t *conf, dict_t *dict);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+gf_defrag_stop(dht_conf_t *conf, gf_defrag_status_t status, dict_t *output);</div><div class='add'>+</div><div class='add'>+void *</div><div class='add'>+gf_defrag_start(void *this);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+gf_defrag_handle_hardlink(xlator_t *this, loc_t *loc, int *fop_errno);</div><div class='add'>+int</div><div class='add'>+dht_migrate_file(xlator_t *this, loc_t *loc, xlator_t *from, xlator_t *to,</div><div class='add'>+                 int flag, int *fop_errno);</div><div class='add'>+int</div><div class='add'>+dht_inode_ctx_layout_get(inode_t *inode, xlator_t *this,</div><div class='add'>+                         dht_layout_t **layout_int);</div><div class='add'>+int</div><div class='add'>+dht_inode_ctx_layout_set(inode_t *inode, xlator_t *this,</div><div class='add'>+                         dht_layout_t *layout_int);</div><div class='add'>+int</div><div class='add'>+dht_inode_ctx_time_update(inode_t *inode, xlator_t *this, struct iatt *stat,</div><div class='add'>+                          int32_t update_ctx);</div><div class='add'>+void</div><div class='add'>+dht_inode_ctx_time_set(inode_t *inode, xlator_t *this, struct iatt *stat);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+dht_inode_ctx_get(inode_t *inode, xlator_t *this, dht_inode_ctx_t **ctx);</div><div class='add'>+int</div><div class='add'>+dht_inode_ctx_set(inode_t *inode, xlator_t *this, dht_inode_ctx_t *ctx);</div><div class='add'>+int</div><div class='add'>+dht_dir_attr_heal(void *data);</div><div class='add'>+int</div><div class='add'>+dht_dir_attr_heal_done(int ret, call_frame_t *sync_frame, void *data);</div><div class='add'>+xlator_t *</div><div class='add'>+dht_subvol_with_free_space_inodes(xlator_t *this, xlator_t *subvol,</div><div class='add'>+                                  xlator_t *ignore, dht_layout_t *layout,</div><div class='add'>+                                  uint64_t filesize);</div><div class='add'>+xlator_t *</div><div class='add'>+dht_subvol_maxspace_nonzeroinode(xlator_t *this, xlator_t *subvol,</div><div class='add'>+                                 dht_layout_t *layout);</div><div class='add'>+int</div><div class='add'>+dht_dir_has_layout(dict_t *xattr, char *name);</div><div class='add'>+int</div><div class='add'>+dht_linkfile_attr_heal(call_frame_t *frame, xlator_t *this);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+dht_priv_dump(xlator_t *this);</div><div class='add'>+int32_t</div><div class='add'>+dht_inodectx_dump(xlator_t *this, inode_t *inode);</div><div class='add'>+</div><div class='add'>+gf_boolean_t</div><div class='add'>+dht_is_subvol_in_layout(dht_layout_t *layout, xlator_t *xlator);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+dht_inode_ctx_get_mig_info(xlator_t *this, inode_t *inode,</div><div class='add'>+                           xlator_t **src_subvol, xlator_t **dst_subvol);</div><div class='add'>+gf_boolean_t</div><div class='add'>+dht_mig_info_is_invalid(xlator_t *current, xlator_t *src_subvol,</div><div class='add'>+                        xlator_t *dst_subvol);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+dht_subvol_status(dht_conf_t *conf, xlator_t *subvol);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+dht_log_new_layout_for_dir_selfheal(xlator_t *this, loc_t *loc,</div><div class='add'>+                                    dht_layout_t *layout);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+dht_layout_sort(dht_layout_t *layout);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+dht_heal_full_path(void *data);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+dht_heal_full_path_done(int op_ret, call_frame_t *frame, void *data);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+dht_layout_missing_dirs(dht_layout_t *layout);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+dht_refresh_layout(call_frame_t *frame);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+dht_build_parent_loc(xlator_t *this, loc_t *parent, loc_t *child,</div><div class='add'>+                     int32_t *op_errno);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+dht_set_local_rebalance(xlator_t *this, dht_local_t *local, struct iatt *stbuf,</div><div class='add'>+                        struct iatt *prebuf, struct iatt *postbuf,</div><div class='add'>+                        dict_t *xdata);</div><div class='add'>+void</div><div class='add'>+dht_build_root_loc(inode_t *inode, loc_t *loc);</div><div class='add'>+</div><div class='add'>+gf_boolean_t</div><div class='add'>+dht_fd_open_on_dst(xlator_t *this, fd_t *fd, xlator_t *dst);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+dht_fd_ctx_destroy(xlator_t *this, fd_t *fd);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+dht_release(xlator_t *this, fd_t *fd);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+dht_set_fixed_dir_stat(struct iatt *stat);</div><div class='add'>+</div><div class='add'>+xlator_t *</div><div class='add'>+dht_get_lock_subvolume(xlator_t *this, struct gf_flock *lock,</div><div class='add'>+                       dht_local_t *local);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+dht_lk_inode_unref(call_frame_t *frame, int32_t op_ret);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+dht_fd_ctx_set(xlator_t *this, fd_t *fd, xlator_t *subvol);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+dht_check_and_open_fd_on_subvol(xlator_t *this, call_frame_t *frame);</div><div class='add'>+</div><div class='add'>+/* FD fop callbacks */</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+dht_writev_cbk(call_frame_t *frame, void *cookie, xlator_t *this, int op_ret,</div><div class='add'>+               int op_errno, struct iatt *prebuf, struct iatt *postbuf,</div><div class='add'>+               dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+dht_flush_cbk(call_frame_t *frame, void *cookie, xlator_t *this, int op_ret,</div><div class='add'>+              int op_errno, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+dht_file_setattr_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                     int op_ret, int op_errno, struct iatt *prebuf,</div><div class='add'>+                     struct iatt *postbuf, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+dht_zerofill_cbk(call_frame_t *frame, void *cookie, xlator_t *this, int op_ret,</div><div class='add'>+                 int op_errno, struct iatt *prebuf, struct iatt *postbuf,</div><div class='add'>+                 dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+dht_discard_cbk(call_frame_t *frame, void *cookie, xlator_t *this, int op_ret,</div><div class='add'>+                int op_errno, struct iatt *prebuf, struct iatt *postbuf,</div><div class='add'>+                dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+dht_fallocate_cbk(call_frame_t *frame, void *cookie, xlator_t *this, int op_ret,</div><div class='add'>+                  int op_errno, struct iatt *prebuf, struct iatt *postbuf,</div><div class='add'>+                  dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+dht_truncate_cbk(call_frame_t *frame, void *cookie, xlator_t *this, int op_ret,</div><div class='add'>+                 int op_errno, struct iatt *prebuf, struct iatt *postbuf,</div><div class='add'>+                 dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+dht_fsync_cbk(call_frame_t *frame, void *cookie, xlator_t *this, int op_ret,</div><div class='add'>+              int op_errno, struct iatt *prebuf, struct iatt *postbuf,</div><div class='add'>+              dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+dht_readv_cbk(call_frame_t *frame, void *cookie, xlator_t *this, int op_ret,</div><div class='add'>+              int op_errno, struct iovec *vector, int count, struct iatt *stbuf,</div><div class='add'>+              struct iobref *iobref, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+dht_file_attr_cbk(call_frame_t *frame, void *cookie, xlator_t *this, int op_ret,</div><div class='add'>+                  int op_errno, struct iatt *stbuf, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+dht_file_removexattr_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                         int op_ret, int op_errno, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+dht_file_setxattr_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                      int op_ret, int op_errno, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+/* All custom xattr heal functions */</div><div class='add'>+int</div><div class='add'>+dht_dir_heal_xattrs(void *data);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+dht_dir_heal_xattrs_done(int ret, call_frame_t *sync_frame, void *data);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+dht_dict_set_array(dict_t *dict, char *key, int32_t value[], int32_t size);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+dht_set_user_xattr(dict_t *dict, char *k, data_t *v, void *data);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+dht_dir_set_heal_xattr(xlator_t *this, dht_local_t *local, dict_t *dst,</div><div class='add'>+                       dict_t *src, int *uret, int *uflag);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+dht_dir_xattr_heal(xlator_t *this, dht_local_t *local, int *op_errno);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+dht_common_mark_mdsxattr(call_frame_t *frame, int *errst, int flag);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+dht_inode_ctx_mdsvol_get(inode_t *inode, xlator_t *this, xlator_t **mdsvol);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+dht_selfheal_dir_setattr(call_frame_t *frame, loc_t *loc, struct iatt *stbuf,</div><div class='add'>+                         int32_t valid, dht_layout_t *layout);</div><div class='add'>+</div><div class='add'>+/* Abstract out the DHT-IATT-IN-DICT */</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+dht_selfheal_layout_new_directory(call_frame_t *frame, loc_t *loc,</div><div class='add'>+                                  dht_layout_t *new_layout);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+dht_pt_fgetxattr(call_frame_t *frame, xlator_t *this, fd_t *fd, const char *key,</div><div class='add'>+                 dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+dht_pt_getxattr(call_frame_t *frame, xlator_t *this, loc_t *loc,</div><div class='add'>+                const char *key, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+dht_pt_mkdir(call_frame_t *frame, xlator_t *this, loc_t *loc, mode_t mode,</div><div class='add'>+             mode_t umask, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+dht_pt_rename(call_frame_t *frame, xlator_t *this, loc_t *oldloc, loc_t *newloc,</div><div class='add'>+              dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+dht_check_remote_fd_failed_error(dht_local_t *local, int op_ret, int op_errno);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+dht_common_xattrop_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                       int32_t op_ret, int32_t op_errno, dict_t *dict,</div><div class='add'>+                       dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+dht_create_lock(call_frame_t *frame, xlator_t *subvol);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+dht_set_parent_layout_in_dict(loc_t *loc, xlator_t *this, dht_local_t *local);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+dht_dir_layout_error_check(xlator_t *this, inode_t *inode);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+dht_inode_ctx_mdsvol_set(inode_t *inode, xlator_t *this, xlator_t *mds_subvol);</div><div class='ctx'> #endif /* _DHT_H */</div><div class='head'>diff --git a/xlators/cluster/dht/src/dht-diskusage.c b/xlators/cluster/dht/src/dht-diskusage.c<br/>index d2decd9d11b..c0588828fdb 100644<br/>--- a/<a href='/cgit/glusterfs.git/tree/xlators/cluster/dht/src/dht-diskusage.c?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/cluster/dht/src/dht-diskusage.c</a><br/>+++ b/<a href='/cgit/glusterfs.git/tree/xlators/cluster/dht/src/dht-diskusage.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>xlators/cluster/dht/src/dht-diskusage.c</a></div><div class='hunk'>@@ -1,261 +1,487 @@</div><div class='ctx'> /*</div><div class='del'>-   Copyright (c) 2009 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='del'>-   This file is part of GlusterFS.</div><div class='del'>-</div><div class='del'>-   GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-   it under the terms of the GNU General Public License as published</div><div class='del'>-   by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-   or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-   GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-   WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-   General Public License for more details.</div><div class='del'>-</div><div class='del'>-   You should have received a copy of the GNU General Public License</div><div class='del'>-   along with this program.  If not, see</div><div class='del'>-   &lt;http://www.gnu.org/licenses/&gt;.</div><div class='del'>-*/</div><div class='del'>-</div><div class='add'>+  Copyright (c) 2008-2012 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='ctx'> </div><div class='del'>-#ifndef _CONFIG_H</div><div class='del'>-#define _CONFIG_H</div><div class='del'>-#include "config.h"</div><div class='del'>-#endif</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='ctx'> </div><div class='ctx'> /* TODO: add NS locking */</div><div class='ctx'> </div><div class='del'>-#include "glusterfs.h"</div><div class='del'>-#include "xlator.h"</div><div class='ctx'> #include "dht-common.h"</div><div class='del'>-#include "defaults.h"</div><div class='ctx'> </div><div class='ctx'> #include &lt;sys/time.h&gt;</div><div class='add'>+#include &lt;glusterfs/events.h&gt;</div><div class='ctx'> </div><div class='del'>-</div><div class='del'>-int </div><div class='del'>-dht_du_info_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-                 int op_ret, int op_errno, struct statvfs *statvfs)</div><div class='add'>+int</div><div class='add'>+dht_du_info_cbk(call_frame_t *frame, void *cookie, xlator_t *this, int op_ret,</div><div class='add'>+                int op_errno, struct statvfs *statvfs, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-	dht_conf_t    *conf         = NULL;</div><div class='del'>-        call_frame_t  *prev          = NULL;</div><div class='del'>-	int            this_call_cnt = 0;</div><div class='del'>-        int            i = 0;</div><div class='del'>-        double         percent = 0;</div><div class='del'>-        uint64_t       bytes = 0;</div><div class='del'>-</div><div class='del'>-        conf = this-&gt;private;</div><div class='del'>-        prev = cookie;</div><div class='del'>-</div><div class='del'>-        if (op_ret == -1) </div><div class='del'>-                goto out;</div><div class='del'>-</div><div class='del'>-        if (statvfs &amp;&amp; statvfs-&gt;f_blocks) {</div><div class='del'>-                percent = (statvfs-&gt;f_bfree * 100) / statvfs-&gt;f_blocks;</div><div class='del'>-                bytes = (statvfs-&gt;f_bfree * statvfs-&gt;f_bsize);</div><div class='del'>-        }</div><div class='del'>-        </div><div class='del'>-        LOCK (&amp;conf-&gt;subvolume_lock);</div><div class='del'>-        {</div><div class='del'>-                for (i = 0; i &lt; conf-&gt;subvolume_cnt; i++)</div><div class='del'>-                        if (prev-&gt;this == conf-&gt;subvolumes[i]) {</div><div class='del'>-                                conf-&gt;du_stats[i].avail_percent = percent;</div><div class='del'>-                                conf-&gt;du_stats[i].avail_space   = bytes;</div><div class='del'>-                                gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-                                        "on subvolume '%s': avail_percent is: "</div><div class='del'>-                                        "%.2f and avail_space is: %"PRIu64"",</div><div class='del'>-                                        prev-&gt;this-&gt;name, </div><div class='del'>-                                        conf-&gt;du_stats[i].avail_percent,</div><div class='del'>-                                        conf-&gt;du_stats[i].avail_space);</div><div class='del'>-                        }</div><div class='del'>-        }</div><div class='del'>-        UNLOCK (&amp;conf-&gt;subvolume_lock);</div><div class='del'>-</div><div class='del'>- out:</div><div class='del'>-	this_call_cnt = dht_frame_return (frame);</div><div class='del'>-	if (is_last_call (this_call_cnt))</div><div class='del'>-		DHT_STACK_DESTROY (frame);</div><div class='del'>-</div><div class='del'>-        return 0;</div><div class='add'>+    dht_conf_t *conf = NULL;</div><div class='add'>+    xlator_t *prev = NULL;</div><div class='add'>+    int this_call_cnt = 0;</div><div class='add'>+    int i = 0;</div><div class='add'>+    double percent = 0;</div><div class='add'>+    double percent_inodes = 0;</div><div class='add'>+    uint64_t bytes = 0;</div><div class='add'>+    uint32_t bpc; /* blocks per chunk */</div><div class='add'>+    uint32_t chunks = 0;</div><div class='add'>+</div><div class='add'>+    conf = this-&gt;private;</div><div class='add'>+    prev = cookie;</div><div class='add'>+</div><div class='add'>+    if (op_ret == -1 || !statvfs) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_WARNING, op_errno,</div><div class='add'>+               DHT_MSG_GET_DISK_INFO_ERROR, "failed to get disk info from %s",</div><div class='add'>+               prev-&gt;name);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (statvfs-&gt;f_blocks) {</div><div class='add'>+        percent = (statvfs-&gt;f_bavail * 100) / statvfs-&gt;f_blocks;</div><div class='add'>+        bytes = (statvfs-&gt;f_bavail * statvfs-&gt;f_frsize);</div><div class='add'>+        /*</div><div class='add'>+         * A 32-bit count of 1MB chunks allows a maximum brick size of</div><div class='add'>+         * ~4PB.  It's possible that we could see a single local FS</div><div class='add'>+         * bigger than that some day, but this code is likely to be</div><div class='add'>+         * irrelevant by then.  Meanwhile, it's more important to keep</div><div class='add'>+         * the chunk size small so the layout-calculation code that</div><div class='add'>+         * uses this value can be tested on normal machines.</div><div class='add'>+         */</div><div class='add'>+        bpc = (1 &lt;&lt; 20) / statvfs-&gt;f_bsize;</div><div class='add'>+        chunks = (statvfs-&gt;f_blocks + bpc - 1) / bpc;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (statvfs-&gt;f_files) {</div><div class='add'>+        percent_inodes = (statvfs-&gt;f_ffree * 100) / statvfs-&gt;f_files;</div><div class='add'>+    } else {</div><div class='add'>+        /*</div><div class='add'>+         * Set percent inodes to 100 for dynamically allocated inode</div><div class='add'>+         * filesystems. The rationale is that distribute need not</div><div class='add'>+         * worry about total inodes; rather, let the 'create()' be</div><div class='add'>+         * scheduled on the hashed subvol regardless of the total</div><div class='add'>+         * inodes.</div><div class='add'>+         */</div><div class='add'>+        percent_inodes = 100;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;conf-&gt;subvolume_lock);</div><div class='add'>+    {</div><div class='add'>+        for (i = 0; i &lt; conf-&gt;subvolume_cnt; i++)</div><div class='add'>+            if (prev == conf-&gt;subvolumes[i]) {</div><div class='add'>+                conf-&gt;du_stats[i].avail_percent = percent;</div><div class='add'>+                conf-&gt;du_stats[i].avail_space = bytes;</div><div class='add'>+                conf-&gt;du_stats[i].avail_inodes = percent_inodes;</div><div class='add'>+                conf-&gt;du_stats[i].chunks = chunks;</div><div class='add'>+                conf-&gt;du_stats[i].total_blocks = statvfs-&gt;f_blocks;</div><div class='add'>+                conf-&gt;du_stats[i].avail_blocks = statvfs-&gt;f_bavail;</div><div class='add'>+                conf-&gt;du_stats[i].frsize = statvfs-&gt;f_frsize;</div><div class='add'>+</div><div class='add'>+                gf_msg_debug(this-&gt;name, 0,</div><div class='add'>+                             "subvolume '%s': avail_percent "</div><div class='add'>+                             "is: %.2f and avail_space "</div><div class='add'>+                             "is: %" PRIu64</div><div class='add'>+                             " and avail_inodes"</div><div class='add'>+                             " is: %.2f",</div><div class='add'>+                             prev-&gt;name, conf-&gt;du_stats[i].avail_percent,</div><div class='add'>+                             conf-&gt;du_stats[i].avail_space,</div><div class='add'>+                             conf-&gt;du_stats[i].avail_inodes);</div><div class='add'>+                break; /* no point in looping further */</div><div class='add'>+            }</div><div class='add'>+    }</div><div class='add'>+    UNLOCK(&amp;conf-&gt;subvolume_lock);</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    this_call_cnt = dht_frame_return(frame);</div><div class='add'>+    if (is_last_call(this_call_cnt))</div><div class='add'>+        DHT_STACK_DESTROY(frame);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-dht_get_du_info_for_subvol (xlator_t *this, int subvol_idx)</div><div class='add'>+dht_get_du_info_for_subvol(xlator_t *this, int subvol_idx)</div><div class='ctx'> {</div><div class='del'>-	dht_conf_t    *conf         = NULL;</div><div class='del'>-	call_frame_t  *statfs_frame = NULL;</div><div class='del'>-	dht_local_t   *statfs_local = NULL;</div><div class='del'>-        call_pool_t   *pool         = NULL;</div><div class='add'>+    dht_conf_t *conf = NULL;</div><div class='add'>+    call_frame_t *statfs_frame = NULL;</div><div class='add'>+    dht_local_t *statfs_local = NULL;</div><div class='add'>+    call_pool_t *pool = NULL;</div><div class='add'>+    loc_t tmp_loc = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    conf = this-&gt;private;</div><div class='add'>+    pool = this-&gt;ctx-&gt;pool;</div><div class='add'>+</div><div class='add'>+    statfs_frame = create_frame(this, pool);</div><div class='add'>+    if (!statfs_frame) {</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* local-&gt;fop value is not used in this case */</div><div class='add'>+    statfs_local = dht_local_init(statfs_frame, NULL, NULL, GF_FOP_MAXVALUE);</div><div class='add'>+    if (!statfs_local) {</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* make it root gfid, should be enough to get the proper info back */</div><div class='add'>+    tmp_loc.gfid[15] = 1;</div><div class='add'>+</div><div class='add'>+    statfs_local-&gt;call_cnt = 1;</div><div class='add'>+    STACK_WIND_COOKIE(</div><div class='add'>+        statfs_frame, dht_du_info_cbk, conf-&gt;subvolumes[subvol_idx],</div><div class='add'>+        conf-&gt;subvolumes[subvol_idx],</div><div class='add'>+        conf-&gt;subvolumes[subvol_idx]-&gt;fops-&gt;statfs, &amp;tmp_loc, NULL);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+err:</div><div class='add'>+    if (statfs_frame)</div><div class='add'>+        DHT_STACK_DESTROY(statfs_frame);</div><div class='ctx'> </div><div class='del'>-	conf = this-&gt;private;</div><div class='del'>-        pool = this-&gt;ctx-&gt;pool;</div><div class='add'>+    return -1;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        statfs_frame = create_frame (this, pool);</div><div class='add'>+int</div><div class='add'>+dht_get_du_info(call_frame_t *frame, xlator_t *this, loc_t *loc)</div><div class='add'>+{</div><div class='add'>+    int i = 0;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    dht_conf_t *conf = NULL;</div><div class='add'>+    call_frame_t *statfs_frame = NULL;</div><div class='add'>+    dht_local_t *statfs_local = NULL;</div><div class='add'>+    loc_t tmp_loc = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    time_t now;</div><div class='add'>+</div><div class='add'>+    conf = this-&gt;private;</div><div class='add'>+    now = gf_time();</div><div class='add'>+    /* make it root gfid, should be enough to get the proper</div><div class='add'>+       info back */</div><div class='add'>+    tmp_loc.gfid[15] = 1;</div><div class='add'>+</div><div class='add'>+    if (now &gt; (conf-&gt;refresh_interval + conf-&gt;last_stat_fetch)) {</div><div class='add'>+        statfs_frame = copy_frame(frame);</div><div class='ctx'>         if (!statfs_frame) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-                        "Out of memory");</div><div class='del'>-                goto err;</div><div class='add'>+            goto err;</div><div class='ctx'>         }</div><div class='del'>-        </div><div class='del'>-        statfs_local = dht_local_init (statfs_frame);</div><div class='add'>+</div><div class='add'>+        /* In this case, 'local-&gt;fop' is not used */</div><div class='add'>+        statfs_local = dht_local_init(statfs_frame, loc, NULL, GF_FOP_MAXVALUE);</div><div class='ctx'>         if (!statfs_local) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-                        "Out of memory");</div><div class='del'>-                goto err;</div><div class='add'>+            goto err;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        statfs_local-&gt;params = dict_new();</div><div class='add'>+        if (!statfs_local-&gt;params)</div><div class='add'>+            goto err;</div><div class='add'>+</div><div class='add'>+        ret = dict_set_int8(statfs_local-&gt;params,</div><div class='add'>+                            GF_INTERNAL_IGNORE_DEEM_STATFS, 1);</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, 0, DHT_MSG_DICT_SET_FAILED,</div><div class='add'>+                   "Failed to set " GF_INTERNAL_IGNORE_DEEM_STATFS " in dict");</div><div class='add'>+            goto err;</div><div class='ctx'>         }</div><div class='del'>-        </div><div class='del'>-        loc_t tmp_loc = { .inode = NULL,</div><div class='del'>-                          .path = "/",</div><div class='del'>-        };</div><div class='del'>-        </div><div class='del'>-        statfs_local-&gt;call_cnt = 1;</div><div class='del'>-        STACK_WIND (statfs_frame, dht_du_info_cbk,</div><div class='del'>-                    conf-&gt;subvolumes[subvol_idx],</div><div class='del'>-                    conf-&gt;subvolumes[subvol_idx]-&gt;fops-&gt;statfs,</div><div class='del'>-                    &amp;tmp_loc);</div><div class='del'>-</div><div class='del'>-        return 0;</div><div class='del'>- err:</div><div class='del'>-	if (statfs_frame)</div><div class='del'>-		DHT_STACK_DESTROY (statfs_frame);</div><div class='del'>-        </div><div class='del'>-        return -1;</div><div class='add'>+</div><div class='add'>+        statfs_local-&gt;call_cnt = conf-&gt;subvolume_cnt;</div><div class='add'>+        for (i = 0; i &lt; conf-&gt;subvolume_cnt; i++) {</div><div class='add'>+            STACK_WIND_COOKIE(statfs_frame, dht_du_info_cbk,</div><div class='add'>+                              conf-&gt;subvolumes[i], conf-&gt;subvolumes[i],</div><div class='add'>+                              conf-&gt;subvolumes[i]-&gt;fops-&gt;statfs, &amp;tmp_loc,</div><div class='add'>+                              statfs_local-&gt;params);</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        conf-&gt;last_stat_fetch = now;</div><div class='add'>+    }</div><div class='add'>+    return 0;</div><div class='add'>+err:</div><div class='add'>+    if (statfs_frame)</div><div class='add'>+        DHT_STACK_DESTROY(statfs_frame);</div><div class='add'>+</div><div class='add'>+    return -1;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-dht_get_du_info (call_frame_t *frame, xlator_t *this, loc_t *loc)</div><div class='add'>+gf_boolean_t</div><div class='add'>+dht_is_subvol_filled(xlator_t *this, xlator_t *subvol)</div><div class='ctx'> {</div><div class='del'>-        int            i = 0;</div><div class='del'>-	dht_conf_t    *conf         = NULL;</div><div class='del'>-	call_frame_t  *statfs_frame = NULL;</div><div class='del'>-	dht_local_t   *statfs_local = NULL;</div><div class='del'>-        struct timeval tv = {0,};</div><div class='del'>-</div><div class='del'>-	conf  = this-&gt;private;</div><div class='del'>-</div><div class='del'>-	gettimeofday (&amp;tv, NULL);</div><div class='del'>-	if (tv.tv_sec &gt; (conf-&gt;refresh_interval </div><div class='del'>-			 + conf-&gt;last_stat_fetch.tv_sec)) {</div><div class='del'>-</div><div class='del'>-                statfs_frame = copy_frame (frame);</div><div class='del'>-                if (!statfs_frame) {</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-                                "Out of memory");</div><div class='del'>-                        goto err;</div><div class='add'>+    int i = 0;</div><div class='add'>+    char vol_name[256];</div><div class='add'>+    dht_conf_t *conf = NULL;</div><div class='add'>+    gf_boolean_t subvol_filled_inodes = _gf_false;</div><div class='add'>+    gf_boolean_t subvol_filled_space = _gf_false;</div><div class='add'>+    gf_boolean_t is_subvol_filled = _gf_false;</div><div class='add'>+    double usage = 0;</div><div class='add'>+</div><div class='add'>+    conf = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    /* Check for values above specified percent or free disk */</div><div class='add'>+    LOCK(&amp;conf-&gt;subvolume_lock);</div><div class='add'>+    {</div><div class='add'>+        for (i = 0; i &lt; conf-&gt;subvolume_cnt; i++) {</div><div class='add'>+            if (subvol == conf-&gt;subvolumes[i]) {</div><div class='add'>+                if (conf-&gt;disk_unit == 'p') {</div><div class='add'>+                    if (conf-&gt;du_stats[i].avail_percent &lt; conf-&gt;min_free_disk) {</div><div class='add'>+                        subvol_filled_space = _gf_true;</div><div class='add'>+                        break;</div><div class='add'>+                    }</div><div class='add'>+</div><div class='add'>+                } else {</div><div class='add'>+                    if (conf-&gt;du_stats[i].avail_space &lt; conf-&gt;min_free_disk) {</div><div class='add'>+                        subvol_filled_space = _gf_true;</div><div class='add'>+                        break;</div><div class='add'>+                    }</div><div class='ctx'>                 }</div><div class='del'>-</div><div class='del'>-                statfs_local = dht_local_init (statfs_frame);</div><div class='del'>-                if (!statfs_local) {</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-                                "Out of memory");</div><div class='del'>-                        goto err;</div><div class='add'>+                if (conf-&gt;du_stats[i].avail_inodes &lt; conf-&gt;min_free_inodes) {</div><div class='add'>+                    subvol_filled_inodes = _gf_true;</div><div class='add'>+                    break;</div><div class='ctx'>                 }</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    UNLOCK(&amp;conf-&gt;subvolume_lock);</div><div class='ctx'> </div><div class='del'>-                loc_copy (&amp;statfs_local-&gt;loc, loc);</div><div class='del'>-                loc_t tmp_loc = { .inode = NULL,</div><div class='del'>-                              .path = "/",</div><div class='del'>-                };</div><div class='del'>-                </div><div class='del'>-                statfs_local-&gt;call_cnt = conf-&gt;subvolume_cnt;</div><div class='del'>-                for (i = 0; i &lt; conf-&gt;subvolume_cnt; i++) {</div><div class='del'>-                        STACK_WIND (statfs_frame, dht_du_info_cbk,</div><div class='del'>-                                    conf-&gt;subvolumes[i],</div><div class='del'>-                                    conf-&gt;subvolumes[i]-&gt;fops-&gt;statfs,</div><div class='del'>-                                    &amp;tmp_loc);</div><div class='del'>-                }</div><div class='add'>+    if (subvol_filled_space &amp;&amp; conf-&gt;subvolume_status[i]) {</div><div class='add'>+        if (!(conf-&gt;du_stats[i].log++ % (GF_UNIVERSAL_ANSWER * 10))) {</div><div class='add'>+            usage = 100 - conf-&gt;du_stats[i].avail_percent;</div><div class='add'>+</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_WARNING, 0, DHT_MSG_SUBVOL_INSUFF_SPACE,</div><div class='add'>+                   "disk space on subvolume '%s' is getting "</div><div class='add'>+                   "full (%.2f %%), consider adding more bricks",</div><div class='add'>+                   subvol-&gt;name, usage);</div><div class='add'>+</div><div class='add'>+            (void)snprintf(vol_name, sizeof(vol_name), "%s", this-&gt;name);</div><div class='add'>+            vol_name[(strlen(this-&gt;name) - 4)] = '\0';</div><div class='ctx'> </div><div class='del'>-                conf-&gt;last_stat_fetch.tv_sec = tv.tv_sec;</div><div class='add'>+            gf_event(EVENT_DHT_DISK_USAGE, "volume=%s;subvol=%s;usage=%.2f %%",</div><div class='add'>+                     vol_name, subvol-&gt;name, usage);</div><div class='ctx'>         }</div><div class='del'>-        return 0;</div><div class='del'>-err:</div><div class='del'>-	if (statfs_frame)</div><div class='del'>-		DHT_STACK_DESTROY (statfs_frame);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (subvol_filled_inodes &amp;&amp; conf-&gt;subvolume_status[i]) {</div><div class='add'>+        if (!(conf-&gt;du_stats[i].log++ % (GF_UNIVERSAL_ANSWER * 10))) {</div><div class='add'>+            usage = 100 - conf-&gt;du_stats[i].avail_inodes;</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_CRITICAL, 0, DHT_MSG_SUBVOL_INSUFF_INODES,</div><div class='add'>+                   "inodes on subvolume '%s' are at "</div><div class='add'>+                   "(%.2f %%), consider adding more bricks",</div><div class='add'>+                   subvol-&gt;name, usage);</div><div class='add'>+</div><div class='add'>+            (void)snprintf(vol_name, sizeof(vol_name), "%s", this-&gt;name);</div><div class='add'>+            vol_name[(strlen(this-&gt;name) - 4)] = '\0';</div><div class='add'>+</div><div class='add'>+            gf_event(EVENT_DHT_INODES_USAGE,</div><div class='add'>+                     "volume=%s;subvol=%s;usage=%.2f %%", vol_name,</div><div class='add'>+                     subvol-&gt;name, usage);</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    is_subvol_filled = (subvol_filled_space || subvol_filled_inodes);</div><div class='ctx'> </div><div class='del'>-        return -1;</div><div class='add'>+    return is_subvol_filled;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+/*Get the best subvolume to create the file in*/</div><div class='add'>+xlator_t *</div><div class='add'>+dht_free_disk_available_subvol(xlator_t *this, xlator_t *subvol,</div><div class='add'>+                               dht_local_t *local)</div><div class='add'>+{</div><div class='add'>+    xlator_t *avail_subvol = NULL;</div><div class='add'>+    dht_conf_t *conf = NULL;</div><div class='add'>+    dht_layout_t *layout = NULL;</div><div class='add'>+    loc_t *loc = NULL;</div><div class='add'>+</div><div class='add'>+    conf = this-&gt;private;</div><div class='add'>+    if (!local)</div><div class='add'>+        goto out;</div><div class='add'>+    loc = &amp;local-&gt;loc;</div><div class='add'>+    if (!local-&gt;layout) {</div><div class='add'>+        layout = dht_layout_get(this, loc-&gt;parent);</div><div class='add'>+</div><div class='add'>+        if (!layout) {</div><div class='add'>+            gf_msg_debug(this-&gt;name, 0,</div><div class='add'>+                         "Missing layout. path=%s,"</div><div class='add'>+                         " parent gfid = %s",</div><div class='add'>+                         loc-&gt;path, uuid_utoa(loc-&gt;parent-&gt;gfid));</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    } else {</div><div class='add'>+        layout = dht_layout_ref(this, local-&gt;layout);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;conf-&gt;subvolume_lock);</div><div class='add'>+    {</div><div class='add'>+        avail_subvol = dht_subvol_with_free_space_inodes(this, subvol, NULL,</div><div class='add'>+                                                         layout, 0);</div><div class='add'>+        if (!avail_subvol) {</div><div class='add'>+            avail_subvol = dht_subvol_maxspace_nonzeroinode(this, subvol,</div><div class='add'>+                                                            layout);</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    UNLOCK(&amp;conf-&gt;subvolume_lock);</div><div class='add'>+out:</div><div class='add'>+    if (!avail_subvol) {</div><div class='add'>+        gf_msg_debug(this-&gt;name, 0,</div><div class='add'>+                     "No subvolume has enough free space \</div><div class='add'>+                              and/or inodes to create");</div><div class='add'>+        avail_subvol = subvol;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-dht_is_subvol_filled (xlator_t *this, xlator_t *subvol)</div><div class='add'>+    if (layout)</div><div class='add'>+        dht_layout_unref(this, layout);</div><div class='add'>+    return avail_subvol;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static inline int32_t</div><div class='add'>+dht_subvol_has_err(dht_conf_t *conf, xlator_t *this, xlator_t *ignore,</div><div class='add'>+                   dht_layout_t *layout)</div><div class='ctx'> {</div><div class='del'>-        int         i = 0;</div><div class='del'>-        int         subvol_filled = 0;</div><div class='del'>-	dht_conf_t *conf = NULL;</div><div class='del'>-</div><div class='del'>-        conf = this-&gt;private;</div><div class='del'>-</div><div class='del'>-        /* Check for values above specified percent or free disk */</div><div class='del'>-        LOCK (&amp;conf-&gt;subvolume_lock);</div><div class='del'>-        {</div><div class='del'>-                for (i = 0; i &lt; conf-&gt;subvolume_cnt; i++) {</div><div class='del'>-                        if (subvol == conf-&gt;subvolumes[i]) {</div><div class='del'>-                                if (conf-&gt;disk_unit == 'p') {</div><div class='del'>-                                        if (conf-&gt;du_stats[i].avail_percent &lt;</div><div class='del'>-                                            conf-&gt;min_free_disk) {</div><div class='del'>-                                                subvol_filled = 1;</div><div class='del'>-                                                break;</div><div class='del'>-                                        }</div><div class='del'>-                                } else {</div><div class='del'>-                                        if (conf-&gt;du_stats[i].avail_space &lt;</div><div class='del'>-                                            conf-&gt;min_free_disk) {</div><div class='del'>-                                                subvol_filled = 1;</div><div class='del'>-                                                break;</div><div class='del'>-                                        }</div><div class='del'>-                                }</div><div class='del'>-                        }</div><div class='del'>-                }</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int i = 0;</div><div class='add'>+</div><div class='add'>+    if (!this || !layout)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    /* this check is meant for rebalance process. The source of the file</div><div class='add'>+     * should be ignored for space check */</div><div class='add'>+    if (this == ignore) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* check if subvol has layout errors, before selecting it */</div><div class='add'>+    for (i = 0; i &lt; layout-&gt;cnt; i++) {</div><div class='add'>+        if (!strcmp(layout-&gt;list[i].xlator-&gt;name, this-&gt;name) &amp;&amp;</div><div class='add'>+            (layout-&gt;list[i].err != 0)) {</div><div class='add'>+            ret = -1;</div><div class='add'>+            goto out;</div><div class='ctx'>         }</div><div class='del'>-        UNLOCK (&amp;conf-&gt;subvolume_lock);</div><div class='del'>-</div><div class='del'>-        if (subvol_filled &amp;&amp; conf-&gt;subvolume_status[i]) {</div><div class='del'>-                if (!(conf-&gt;du_stats[i].log++ % (GF_UNIVERSAL_ANSWER * 10))) {</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_WARNING,</div><div class='del'>-                                "disk space on subvolume '%s' is getting "</div><div class='del'>-                                "full (%.2f %%), consider adding more nodes", </div><div class='del'>-                                subvol-&gt;name, </div><div class='del'>-                                (100 - conf-&gt;du_stats[i].avail_percent));</div><div class='del'>-                }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* discard decommissioned subvol */</div><div class='add'>+    if (conf-&gt;decommission_subvols_cnt) {</div><div class='add'>+        for (i = 0; i &lt; conf-&gt;subvolume_cnt; i++) {</div><div class='add'>+            if (conf-&gt;decommissioned_bricks[i] &amp;&amp;</div><div class='add'>+                conf-&gt;decommissioned_bricks[i] == this) {</div><div class='add'>+                ret = -1;</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='ctx'>         }</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        return subvol_filled;</div><div class='add'>+    ret = 0;</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+/*Get subvolume which has both space and inodes more than the min criteria*/</div><div class='ctx'> xlator_t *</div><div class='del'>-dht_free_disk_available_subvol (xlator_t *this, xlator_t *subvol) </div><div class='add'>+dht_subvol_with_free_space_inodes(xlator_t *this, xlator_t *subvol,</div><div class='add'>+                                  xlator_t *ignore, dht_layout_t *layout,</div><div class='add'>+                                  uint64_t filesize)</div><div class='ctx'> {</div><div class='del'>-        int         i = 0;</div><div class='del'>-        double      max= 0;</div><div class='del'>-        xlator_t   *avail_subvol = NULL;</div><div class='del'>-	dht_conf_t *conf = NULL;</div><div class='del'>-</div><div class='del'>-        conf = this-&gt;private;</div><div class='del'>-        avail_subvol = subvol;</div><div class='add'>+    int i = 0;</div><div class='add'>+    double max = 0;</div><div class='add'>+    double max_inodes = 0;</div><div class='add'>+    int ignore_subvol = 0;</div><div class='add'>+    uint64_t total_blocks = 0;</div><div class='add'>+    uint64_t avail_blocks = 0;</div><div class='add'>+    uint64_t frsize = 0;</div><div class='add'>+    double post_availspace = 0;</div><div class='add'>+    double post_percent = 0;</div><div class='add'>+</div><div class='add'>+    xlator_t *avail_subvol = NULL;</div><div class='add'>+    dht_conf_t *conf = NULL;</div><div class='add'>+</div><div class='add'>+    conf = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; conf-&gt;subvolume_cnt; i++) {</div><div class='add'>+        /* check if subvol has layout errors and also it is not a</div><div class='add'>+         * decommissioned brick, before selecting it */</div><div class='add'>+        ignore_subvol = dht_subvol_has_err(conf, conf-&gt;subvolumes[i], ignore,</div><div class='add'>+                                           layout);</div><div class='add'>+        if (ignore_subvol)</div><div class='add'>+            continue;</div><div class='add'>+</div><div class='add'>+        if ((conf-&gt;disk_unit == 'p') &amp;&amp;</div><div class='add'>+            (conf-&gt;du_stats[i].avail_percent &gt; conf-&gt;min_free_disk) &amp;&amp;</div><div class='add'>+            (conf-&gt;du_stats[i].avail_inodes &gt; conf-&gt;min_free_inodes)) {</div><div class='add'>+            if ((conf-&gt;du_stats[i].avail_inodes &gt; max_inodes) ||</div><div class='add'>+                (conf-&gt;du_stats[i].avail_percent &gt; max)) {</div><div class='add'>+                max = conf-&gt;du_stats[i].avail_percent;</div><div class='add'>+                max_inodes = conf-&gt;du_stats[i].avail_inodes;</div><div class='add'>+                avail_subvol = conf-&gt;subvolumes[i];</div><div class='add'>+                total_blocks = conf-&gt;du_stats[i].total_blocks;</div><div class='add'>+                avail_blocks = conf-&gt;du_stats[i].avail_blocks;</div><div class='add'>+                frsize = conf-&gt;du_stats[i].frsize;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-        LOCK (&amp;conf-&gt;subvolume_lock);</div><div class='del'>-        {</div><div class='del'>-                for (i = 0; i &lt; conf-&gt;subvolume_cnt; i++) {</div><div class='del'>-                        if (conf-&gt;disk_unit == 'p') {</div><div class='del'>-                                if (conf-&gt;du_stats[i].avail_percent &gt; max) {</div><div class='del'>-                                        max = conf-&gt;du_stats[i].avail_percent;</div><div class='del'>-                                        avail_subvol = conf-&gt;subvolumes[i];</div><div class='del'>-                                }</div><div class='del'>-                        } else {</div><div class='del'>-                                if (conf-&gt;du_stats[i].avail_space &gt; max) {</div><div class='del'>-                                        max = conf-&gt;du_stats[i].avail_space;</div><div class='del'>-                                        avail_subvol = conf-&gt;subvolumes[i];</div><div class='del'>-                                }</div><div class='del'>-                        }</div><div class='del'>-                }</div><div class='add'>+        if ((conf-&gt;disk_unit != 'p') &amp;&amp;</div><div class='add'>+            (conf-&gt;du_stats[i].avail_space &gt; conf-&gt;min_free_disk) &amp;&amp;</div><div class='add'>+            (conf-&gt;du_stats[i].avail_inodes &gt; conf-&gt;min_free_inodes)) {</div><div class='add'>+            if ((conf-&gt;du_stats[i].avail_inodes &gt; max_inodes) ||</div><div class='add'>+                (conf-&gt;du_stats[i].avail_space &gt; max)) {</div><div class='add'>+                max = conf-&gt;du_stats[i].avail_space;</div><div class='add'>+                max_inodes = conf-&gt;du_stats[i].avail_inodes;</div><div class='add'>+                avail_subvol = conf-&gt;subvolumes[i];</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (avail_subvol) {</div><div class='add'>+        if (conf-&gt;disk_unit == 'p') {</div><div class='add'>+            post_availspace = (avail_blocks * frsize) - filesize;</div><div class='add'>+            post_percent = (post_availspace * 100) / (total_blocks * frsize);</div><div class='add'>+            if (post_percent &lt; conf-&gt;min_free_disk)</div><div class='add'>+                avail_subvol = NULL;</div><div class='ctx'>         }</div><div class='del'>-        UNLOCK (&amp;conf-&gt;subvolume_lock);</div><div class='add'>+        if (conf-&gt;disk_unit != 'p') {</div><div class='add'>+            if ((max - filesize) &lt; conf-&gt;min_free_disk)</div><div class='add'>+                avail_subvol = NULL;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        if (max &lt; conf-&gt;min_free_disk)</div><div class='del'>-                avail_subvol = subvol;</div><div class='add'>+    return avail_subvol;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        if (avail_subvol == subvol) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-                        "no subvolume has enough free space to create");</div><div class='add'>+/* Get subvol which has at least one inode and maximum space */</div><div class='add'>+xlator_t *</div><div class='add'>+dht_subvol_maxspace_nonzeroinode(xlator_t *this, xlator_t *subvol,</div><div class='add'>+                                 dht_layout_t *layout)</div><div class='add'>+{</div><div class='add'>+    int i = 0;</div><div class='add'>+    double max = 0;</div><div class='add'>+    int ignore_subvol = 0;</div><div class='add'>+</div><div class='add'>+    xlator_t *avail_subvol = NULL;</div><div class='add'>+    dht_conf_t *conf = NULL;</div><div class='add'>+</div><div class='add'>+    conf = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; conf-&gt;subvolume_cnt; i++) {</div><div class='add'>+        /* check if subvol has layout errors and also it is not a</div><div class='add'>+         * decommissioned brick, before selecting it*/</div><div class='add'>+</div><div class='add'>+        ignore_subvol = dht_subvol_has_err(conf, conf-&gt;subvolumes[i], NULL,</div><div class='add'>+                                           layout);</div><div class='add'>+        if (ignore_subvol)</div><div class='add'>+            continue;</div><div class='add'>+</div><div class='add'>+        if (conf-&gt;disk_unit == 'p') {</div><div class='add'>+            if ((conf-&gt;du_stats[i].avail_percent &gt; max) &amp;&amp;</div><div class='add'>+                (conf-&gt;du_stats[i].avail_inodes &gt; 0)) {</div><div class='add'>+                max = conf-&gt;du_stats[i].avail_percent;</div><div class='add'>+                avail_subvol = conf-&gt;subvolumes[i];</div><div class='add'>+            }</div><div class='add'>+        } else {</div><div class='add'>+            if ((conf-&gt;du_stats[i].avail_space &gt; max) &amp;&amp;</div><div class='add'>+                (conf-&gt;du_stats[i].avail_inodes &gt; 0)) {</div><div class='add'>+                max = conf-&gt;du_stats[i].avail_space;</div><div class='add'>+                avail_subvol = conf-&gt;subvolumes[i];</div><div class='add'>+            }</div><div class='ctx'>         }</div><div class='del'>-                </div><div class='del'>-        return avail_subvol;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return avail_subvol;</div><div class='ctx'> }</div><div class='head'>diff --git a/xlators/cluster/dht/src/dht-hashfn.c b/xlators/cluster/dht/src/dht-hashfn.c<br/>index dfc1541fa1e..acda67c312a 100644<br/>--- a/<a href='/cgit/glusterfs.git/tree/xlators/cluster/dht/src/dht-hashfn.c?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/cluster/dht/src/dht-hashfn.c</a><br/>+++ b/<a href='/cgit/glusterfs.git/tree/xlators/cluster/dht/src/dht-hashfn.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>xlators/cluster/dht/src/dht-hashfn.c</a></div><div class='hunk'>@@ -1,81 +1,110 @@</div><div class='ctx'> /*</div><div class='del'>-   Copyright (c) 2008-2009 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='del'>-   This file is part of GlusterFS.</div><div class='del'>-</div><div class='del'>-   GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-   it under the terms of the GNU General Public License as published</div><div class='del'>-   by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-   or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-   GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-   WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-   General Public License for more details.</div><div class='del'>-</div><div class='del'>-   You should have received a copy of the GNU General Public License</div><div class='del'>-   along with this program.  If not, see</div><div class='del'>-   &lt;http://www.gnu.org/licenses/&gt;.</div><div class='del'>-*/</div><div class='del'>-</div><div class='del'>-#ifndef _CONFIG_H</div><div class='del'>-#define _CONFIG_H</div><div class='del'>-#include "config.h"</div><div class='del'>-#endif</div><div class='add'>+  Copyright (c) 2008-2012 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='ctx'> </div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='ctx'> </div><div class='del'>-#include "glusterfs.h"</div><div class='del'>-#include "xlator.h"</div><div class='ctx'> #include "dht-common.h"</div><div class='del'>-#include "hashfn.h"</div><div class='add'>+#include &lt;glusterfs/hashfn.h&gt;</div><div class='ctx'> </div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-dht_hash_compute_internal (int type, const char *name, uint32_t *hash_p)</div><div class='add'>+static int</div><div class='add'>+dht_hash_compute_internal(int type, const char *name, const int len,</div><div class='add'>+                          uint32_t *hash_p)</div><div class='ctx'> {</div><div class='del'>-	int      ret = 0;</div><div class='del'>-	uint32_t hash = 0;</div><div class='del'>-</div><div class='del'>-	switch (type) {</div><div class='del'>-	case DHT_HASH_TYPE_DM:</div><div class='del'>-		hash = gf_dm_hashfn (name, strlen (name));</div><div class='del'>-		break;</div><div class='del'>-	default:</div><div class='del'>-		ret = -1;</div><div class='del'>-		break;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	if (ret == 0) {</div><div class='del'>-		*hash_p = hash;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	return ret;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    uint32_t hash = 0;</div><div class='add'>+</div><div class='add'>+    switch (type) {</div><div class='add'>+        case DHT_HASH_TYPE_DM:</div><div class='add'>+        case DHT_HASH_TYPE_DM_USER:</div><div class='add'>+            hash = gf_dm_hashfn(name, len);</div><div class='add'>+            break;</div><div class='add'>+        default:</div><div class='add'>+            ret = -1;</div><div class='add'>+            break;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (ret == 0) {</div><div class='add'>+        *hash_p = hash;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='del'>-#define MAKE_RSYNC_FRIENDLY_NAME(rsync_frndly_name, name) do {          \</div><div class='del'>-                rsync_frndly_name = (char *) name;			\</div><div class='del'>-                if (name[0] == '.') {                                   \</div><div class='del'>-                        char *dot   = 0;                                \</div><div class='del'>-                        int namelen = 0;                                \</div><div class='del'>-                                                                        \</div><div class='del'>-                        dot = strrchr (name, '.');                      \</div><div class='del'>-                        if (dot &amp;&amp; dot &gt; (name + 1) &amp;&amp; *(dot + 1)) {    \</div><div class='del'>-                                namelen = (dot - name);                 \</div><div class='del'>-                                rsync_frndly_name = alloca (namelen);   \</div><div class='del'>-                                strncpy (rsync_frndly_name, name + 1,   \</div><div class='del'>-                                         namelen);                      \</div><div class='del'>-                                rsync_frndly_name[namelen - 1] = 0;     \</div><div class='del'>-                        }                                               \</div><div class='del'>-                }                                                       \</div><div class='del'>-        } while (0);</div><div class='del'>-</div><div class='add'>+/* The function returns:</div><div class='add'>+ * 0  : in case no munge took place</div><div class='add'>+ * &gt;0 : the length (inc. terminating NULL!) of the newly modified string,</div><div class='add'>+ *      if it was munged.</div><div class='add'>+ */</div><div class='add'>+static int</div><div class='add'>+dht_munge_name(const char *original, char *modified, size_t len, regex_t *re)</div><div class='add'>+{</div><div class='add'>+    regmatch_t matches[2] = {</div><div class='add'>+        {0},</div><div class='add'>+    };</div><div class='add'>+    size_t new_len = 0;</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    ret = regexec(re, original, 2, matches, 0);</div><div class='add'>+</div><div class='add'>+    if (ret != REG_NOMATCH) {</div><div class='add'>+        if (matches[1].rm_so != -1) {</div><div class='add'>+            new_len = matches[1].rm_eo - matches[1].rm_so;</div><div class='add'>+            /* Equal would fail due to the NUL at the end. */</div><div class='add'>+            if (new_len &lt; len) {</div><div class='add'>+                memcpy(modified, original + matches[1].rm_so, new_len);</div><div class='add'>+                modified[new_len] = '\0';</div><div class='add'>+                return new_len + 1; /* +1 for the terminating NULL */</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* This is guaranteed safe because of how the dest was allocated. */</div><div class='add'>+    strcpy(modified, original);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-dht_hash_compute (int type, const char *name, uint32_t *hash_p)</div><div class='add'>+dht_hash_compute(xlator_t *this, int type, const char *name, uint32_t *hash_p)</div><div class='ctx'> {</div><div class='del'>-	char     *rsync_friendly_name = NULL;</div><div class='del'>-</div><div class='del'>-	MAKE_RSYNC_FRIENDLY_NAME (rsync_friendly_name, name);</div><div class='del'>-</div><div class='del'>-	return dht_hash_compute_internal (type, rsync_friendly_name, hash_p);</div><div class='add'>+    char *rsync_friendly_name = NULL;</div><div class='add'>+    dht_conf_t *priv = NULL;</div><div class='add'>+    size_t len = 0;</div><div class='add'>+    int munged = 0;</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    if (name == NULL)</div><div class='add'>+        return -1;</div><div class='add'>+</div><div class='add'>+    len = strlen(name) + 1;</div><div class='add'>+    rsync_friendly_name = alloca(len);</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;priv-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        if (priv-&gt;extra_regex_valid) {</div><div class='add'>+            munged = dht_munge_name(name, rsync_friendly_name, len,</div><div class='add'>+                                    &amp;priv-&gt;extra_regex);</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        if (!munged &amp;&amp; priv-&gt;rsync_regex_valid) {</div><div class='add'>+            gf_msg_trace(this-&gt;name, 0, "trying regex for %s", name);</div><div class='add'>+            munged = dht_munge_name(name, rsync_friendly_name, len,</div><div class='add'>+                                    &amp;priv-&gt;rsync_regex);</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    UNLOCK(&amp;priv-&gt;lock);</div><div class='add'>+    if (munged) {</div><div class='add'>+        gf_msg_debug(this-&gt;name, 0, "munged down to %s", rsync_friendly_name);</div><div class='add'>+        len = munged;</div><div class='add'>+    } else {</div><div class='add'>+        rsync_friendly_name = (char *)name;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return dht_hash_compute_internal(type, rsync_friendly_name, len - 1,</div><div class='add'>+                                     hash_p);</div><div class='ctx'> }</div><div class='head'>diff --git a/xlators/cluster/dht/src/dht-helper.c b/xlators/cluster/dht/src/dht-helper.c<br/>index 804685b65ba..3f2fe43d5f3 100644<br/>--- a/<a href='/cgit/glusterfs.git/tree/xlators/cluster/dht/src/dht-helper.c?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/cluster/dht/src/dht-helper.c</a><br/>+++ b/<a href='/cgit/glusterfs.git/tree/xlators/cluster/dht/src/dht-helper.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>xlators/cluster/dht/src/dht-helper.c</a></div><div class='hunk'>@@ -1,509 +1,2304 @@</div><div class='ctx'> /*</div><div class='del'>-   Copyright (c) 2008-2009 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='del'>-   This file is part of GlusterFS.</div><div class='del'>-</div><div class='del'>-   GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-   it under the terms of the GNU General Public License as published</div><div class='del'>-   by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-   or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-   GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-   WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-   General Public License for more details.</div><div class='del'>-</div><div class='del'>-   You should have received a copy of the GNU General Public License</div><div class='del'>-   along with this program.  If not, see</div><div class='del'>-   &lt;http://www.gnu.org/licenses/&gt;.</div><div class='add'>+  Copyright (c) 2008-2012 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='ctx'> */</div><div class='ctx'> </div><div class='del'>-#ifndef _CONFIG_H</div><div class='del'>-#define _CONFIG_H</div><div class='del'>-#include "config.h"</div><div class='del'>-#endif</div><div class='add'>+#include "dht-common.h"</div><div class='add'>+#include "dht-lock.h"</div><div class='add'>+#include "glusterfs/compat-errno.h"  // for ENODATA on BSD</div><div class='ctx'> </div><div class='add'>+static void</div><div class='add'>+dht_free_fd_ctx(dht_fd_ctx_t *fd_ctx)</div><div class='add'>+{</div><div class='add'>+    GF_FREE(fd_ctx);</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-#include "glusterfs.h"</div><div class='del'>-#include "xlator.h"</div><div class='del'>-#include "dht-common.h"</div><div class='add'>+int32_t</div><div class='add'>+dht_fd_ctx_destroy(xlator_t *this, fd_t *fd)</div><div class='add'>+{</div><div class='add'>+    dht_fd_ctx_t *fd_ctx = NULL;</div><div class='add'>+    uint64_t value = 0;</div><div class='add'>+    int32_t ret = -1;</div><div class='add'>+</div><div class='add'>+    GF_VALIDATE_OR_GOTO("dht", this, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, fd, out);</div><div class='add'>+</div><div class='add'>+    ret = fd_ctx_del(fd, this, &amp;value);</div><div class='add'>+    if (ret) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    fd_ctx = (dht_fd_ctx_t *)(uintptr_t)value;</div><div class='add'>+    if (fd_ctx) {</div><div class='add'>+        GF_REF_PUT(fd_ctx);</div><div class='add'>+    }</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+__dht_fd_ctx_set(xlator_t *this, fd_t *fd, xlator_t *dst)</div><div class='add'>+{</div><div class='add'>+    dht_fd_ctx_t *fd_ctx = NULL;</div><div class='add'>+    uint64_t value = 0;</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    GF_VALIDATE_OR_GOTO("dht", this, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, fd, out);</div><div class='ctx'> </div><div class='add'>+    fd_ctx = GF_CALLOC(1, sizeof(*fd_ctx), gf_dht_mt_fd_ctx_t);</div><div class='add'>+</div><div class='add'>+    if (!fd_ctx) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    fd_ctx-&gt;opened_on_dst = (uint64_t)(uintptr_t)dst;</div><div class='add'>+    GF_REF_INIT(fd_ctx, dht_free_fd_ctx);</div><div class='add'>+</div><div class='add'>+    value = (uint64_t)(uintptr_t)fd_ctx;</div><div class='add'>+</div><div class='add'>+    ret = __fd_ctx_set(fd, this, value);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_WARNING, 0, DHT_MSG_FD_CTX_SET_FAILED,</div><div class='add'>+                "fd=0x%p", fd, NULL);</div><div class='add'>+        GF_REF_PUT(fd_ctx);</div><div class='add'>+    }</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-dht_frame_return (call_frame_t *frame)</div><div class='add'>+dht_fd_ctx_set(xlator_t *this, fd_t *fd, xlator_t *dst)</div><div class='ctx'> {</div><div class='del'>-	dht_local_t *local = NULL;</div><div class='del'>-	int          this_call_cnt = -1;</div><div class='add'>+    dht_fd_ctx_t *fd_ctx = NULL;</div><div class='add'>+    uint64_t value = 0;</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    GF_VALIDATE_OR_GOTO("dht", this, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, fd, out);</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;fd-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        ret = __fd_ctx_get(fd, this, &amp;value);</div><div class='add'>+        if (ret &amp;&amp; value) {</div><div class='add'>+            fd_ctx = (dht_fd_ctx_t *)(uintptr_t)value;</div><div class='add'>+            if (fd_ctx-&gt;opened_on_dst == (uint64_t)(uintptr_t)dst) {</div><div class='add'>+                /* This could happen due to racing</div><div class='add'>+                 * check_progress tasks*/</div><div class='add'>+                goto unlock;</div><div class='add'>+            } else {</div><div class='add'>+                /* This would be a big problem*/</div><div class='add'>+                /* Overwrite and hope for the best*/</div><div class='add'>+                fd_ctx-&gt;opened_on_dst = (uint64_t)(uintptr_t)dst;</div><div class='add'>+                UNLOCK(&amp;fd-&gt;lock);</div><div class='add'>+                gf_smsg(this-&gt;name, GF_LOG_WARNING, 0, DHT_MSG_INVALID_VALUE,</div><div class='add'>+                        NULL);</div><div class='ctx'> </div><div class='del'>-	if (!frame)</div><div class='del'>-		return -1;</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+        ret = __dht_fd_ctx_set(this, fd, dst);</div><div class='add'>+    }</div><div class='add'>+unlock:</div><div class='add'>+    UNLOCK(&amp;fd-&gt;lock);</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	local = frame-&gt;local;</div><div class='add'>+static dht_fd_ctx_t *</div><div class='add'>+dht_fd_ctx_get(xlator_t *this, fd_t *fd)</div><div class='add'>+{</div><div class='add'>+    dht_fd_ctx_t *fd_ctx = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    uint64_t tmp_val = 0;</div><div class='add'>+</div><div class='add'>+    GF_VALIDATE_OR_GOTO("dht", this, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, fd, out);</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;fd-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        ret = __fd_ctx_get(fd, this, &amp;tmp_val);</div><div class='add'>+        if ((ret &lt; 0) || (tmp_val == 0)) {</div><div class='add'>+            goto unlock;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-	LOCK (&amp;frame-&gt;lock);</div><div class='del'>-	{</div><div class='del'>-		this_call_cnt = --local-&gt;call_cnt;</div><div class='del'>-	}</div><div class='del'>-	UNLOCK (&amp;frame-&gt;lock);</div><div class='add'>+        fd_ctx = (dht_fd_ctx_t *)(uintptr_t)tmp_val;</div><div class='add'>+        GF_REF_GET(fd_ctx);</div><div class='add'>+    }</div><div class='add'>+unlock:</div><div class='add'>+    UNLOCK(&amp;fd-&gt;lock);</div><div class='ctx'> </div><div class='del'>-	return this_call_cnt;</div><div class='add'>+out:</div><div class='add'>+    return fd_ctx;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+gf_boolean_t</div><div class='add'>+dht_fd_open_on_dst(xlator_t *this, fd_t *fd, xlator_t *dst)</div><div class='add'>+{</div><div class='add'>+    dht_fd_ctx_t *fd_ctx = NULL;</div><div class='add'>+    gf_boolean_t opened = _gf_false;</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-dht_itransform (xlator_t *this, xlator_t *subvol, uint64_t x, uint64_t *y_p)</div><div class='add'>+    fd_ctx = dht_fd_ctx_get(this, fd);</div><div class='add'>+</div><div class='add'>+    if (fd_ctx) {</div><div class='add'>+        if (fd_ctx-&gt;opened_on_dst == (uint64_t)(uintptr_t)dst) {</div><div class='add'>+            opened = _gf_true;</div><div class='add'>+        }</div><div class='add'>+        GF_REF_PUT(fd_ctx);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return opened;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+dht_free_mig_info(void *data)</div><div class='ctx'> {</div><div class='del'>-	dht_conf_t *conf = NULL;</div><div class='del'>-	int         cnt = 0;</div><div class='del'>-	int         max = 0;</div><div class='del'>-	uint64_t    y = 0;</div><div class='add'>+    dht_migrate_info_t *miginfo = NULL;</div><div class='add'>+</div><div class='add'>+    miginfo = data;</div><div class='add'>+    GF_FREE(miginfo);</div><div class='ctx'> </div><div class='add'>+    return;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+dht_inode_ctx_set_mig_info(xlator_t *this, inode_t *inode, xlator_t *src_subvol,</div><div class='add'>+                           xlator_t *dst_subvol)</div><div class='add'>+{</div><div class='add'>+    dht_migrate_info_t *miginfo = NULL;</div><div class='add'>+    uint64_t value = 0;</div><div class='add'>+    int ret = -1;</div><div class='ctx'> </div><div class='del'>-	if (x == ((uint64_t) -1)) {</div><div class='del'>-		y = (uint64_t) -1;</div><div class='del'>-		goto out;</div><div class='del'>-	}</div><div class='add'>+    miginfo = GF_CALLOC(1, sizeof(*miginfo), gf_dht_mt_miginfo_t);</div><div class='add'>+    if (miginfo == NULL)</div><div class='add'>+        goto out;</div><div class='ctx'> </div><div class='del'>-	conf = this-&gt;private;</div><div class='add'>+    miginfo-&gt;src_subvol = src_subvol;</div><div class='add'>+    miginfo-&gt;dst_subvol = dst_subvol;</div><div class='add'>+    GF_REF_INIT(miginfo, dht_free_mig_info);</div><div class='ctx'> </div><div class='del'>-	max = conf-&gt;subvolume_cnt;</div><div class='del'>-	cnt = dht_subvol_cnt (this, subvol);</div><div class='add'>+    value = (uint64_t)(uintptr_t)miginfo;</div><div class='ctx'> </div><div class='del'>-	y = ((x * max) + cnt);</div><div class='add'>+    ret = inode_ctx_set1(inode, this, &amp;value);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        GF_REF_PUT(miginfo);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='ctx'> out:</div><div class='del'>-	if (y_p)</div><div class='del'>-		*y_p = y;</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+dht_inode_ctx_get_mig_info(xlator_t *this, inode_t *inode,</div><div class='add'>+                           xlator_t **src_subvol, xlator_t **dst_subvol)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    uint64_t tmp_miginfo = 0;</div><div class='add'>+    dht_migrate_info_t *miginfo = NULL;</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;inode-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        ret = __inode_ctx_get1(inode, this, &amp;tmp_miginfo);</div><div class='add'>+        if ((ret &lt; 0) || (tmp_miginfo == 0)) {</div><div class='add'>+            UNLOCK(&amp;inode-&gt;lock);</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-	return 0;</div><div class='add'>+        miginfo = (dht_migrate_info_t *)(uintptr_t)tmp_miginfo;</div><div class='add'>+        GF_REF_GET(miginfo);</div><div class='add'>+    }</div><div class='add'>+    UNLOCK(&amp;inode-&gt;lock);</div><div class='add'>+</div><div class='add'>+    if (src_subvol)</div><div class='add'>+        *src_subvol = miginfo-&gt;src_subvol;</div><div class='add'>+</div><div class='add'>+    if (dst_subvol)</div><div class='add'>+        *dst_subvol = miginfo-&gt;dst_subvol;</div><div class='add'>+</div><div class='add'>+    GF_REF_PUT(miginfo);</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+gf_boolean_t</div><div class='add'>+dht_mig_info_is_invalid(xlator_t *current, xlator_t *src_subvol,</div><div class='add'>+                        xlator_t *dst_subvol)</div><div class='add'>+{</div><div class='add'>+    /* Not set</div><div class='add'>+     */</div><div class='add'>+    if (!src_subvol || !dst_subvol)</div><div class='add'>+        return _gf_true;</div><div class='add'>+</div><div class='add'>+    /* Invalid scenarios:</div><div class='add'>+     * The src_subvol does not match the subvol on which the current op was sent</div><div class='add'>+     * so the cached subvol has changed between the last mig_info_set and now.</div><div class='add'>+     * src_subvol == dst_subvol. The file was migrated without any FOP detecting</div><div class='add'>+     * a P2 so the old dst is now the current subvol.</div><div class='add'>+     *</div><div class='add'>+     * There is still one scenario where the info could be outdated - if</div><div class='add'>+     * file has undergone multiple migrations and ends up on the same src_subvol</div><div class='add'>+     * on which the mig_info was first set.</div><div class='add'>+     */</div><div class='add'>+    if ((current == dst_subvol) || (current != src_subvol))</div><div class='add'>+        return _gf_true;</div><div class='add'>+</div><div class='add'>+    return _gf_false;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* Used to check if fd fops have the fd opened on the cached subvol</div><div class='add'>+ * This is required when:</div><div class='add'>+ * 1. an fd is opened on FILE1 on subvol1</div><div class='add'>+ * 2. the file is migrated to subvol2</div><div class='add'>+ * 3. a lookup updates the cached subvol in the inode_ctx to subvol2</div><div class='add'>+ * 4. a write comes on the fd</div><div class='add'>+ * The write is sent to subvol2 on an fd which has been opened only on fd1</div><div class='add'>+ * Since the migration phase checks don't kick in, the fop fails with EBADF</div><div class='add'>+ *</div><div class='add'>+ */</div><div class='add'>+</div><div class='ctx'> int</div><div class='del'>-dht_filter_loc_subvol_key (xlator_t *this, loc_t *loc, loc_t *new_loc,</div><div class='del'>-                           xlator_t **subvol)</div><div class='add'>+dht_check_and_open_fd_on_subvol_complete(int ret, call_frame_t *frame,</div><div class='add'>+                                         void *data)</div><div class='ctx'> {</div><div class='del'>-        char          *new_name  = NULL;</div><div class='del'>-        char          *new_path  = NULL;</div><div class='del'>-        xlator_list_t *trav      = NULL;</div><div class='del'>-        char           key[1024] = {0,};</div><div class='del'>-        int            ret       = 0; /* not found */</div><div class='add'>+    glusterfs_fop_t fop = 0;</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    xlator_t *subvol = NULL;</div><div class='add'>+    xlator_t *this = NULL;</div><div class='add'>+    fd_t *fd = NULL;</div><div class='add'>+    int op_errno = -1;</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    this = frame-&gt;this;</div><div class='add'>+    fop = local-&gt;fop;</div><div class='add'>+    subvol = local-&gt;cached_subvol;</div><div class='add'>+    fd = local-&gt;fd;</div><div class='add'>+</div><div class='add'>+    if (ret) {</div><div class='add'>+        op_errno = local-&gt;op_errno;</div><div class='add'>+        goto handle_err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    switch (fop) {</div><div class='add'>+        case GF_FOP_WRITE:</div><div class='add'>+            STACK_WIND_COOKIE(frame, dht_writev_cbk, subvol, subvol,</div><div class='add'>+                              subvol-&gt;fops-&gt;writev, fd, local-&gt;rebalance.vector,</div><div class='add'>+                              local-&gt;rebalance.count, local-&gt;rebalance.offset,</div><div class='add'>+                              local-&gt;rebalance.flags, local-&gt;rebalance.iobref,</div><div class='add'>+                              local-&gt;xattr_req);</div><div class='add'>+            break;</div><div class='add'>+</div><div class='add'>+        case GF_FOP_FLUSH:</div><div class='add'>+            STACK_WIND(frame, dht_flush_cbk, subvol, subvol-&gt;fops-&gt;flush, fd,</div><div class='add'>+                       local-&gt;xattr_req);</div><div class='add'>+            break;</div><div class='add'>+</div><div class='add'>+        case GF_FOP_FSETATTR:</div><div class='add'>+            STACK_WIND_COOKIE(frame, dht_file_setattr_cbk, subvol, subvol,</div><div class='add'>+                              subvol-&gt;fops-&gt;fsetattr, fd,</div><div class='add'>+                              &amp;local-&gt;rebalance.stbuf, local-&gt;rebalance.flags,</div><div class='add'>+                              local-&gt;xattr_req);</div><div class='add'>+            break;</div><div class='add'>+</div><div class='add'>+        case GF_FOP_ZEROFILL:</div><div class='add'>+            STACK_WIND_COOKIE(frame, dht_zerofill_cbk, subvol, subvol,</div><div class='add'>+                              subvol-&gt;fops-&gt;zerofill, fd,</div><div class='add'>+                              local-&gt;rebalance.offset, local-&gt;rebalance.size,</div><div class='add'>+                              local-&gt;xattr_req);</div><div class='add'>+</div><div class='add'>+            break;</div><div class='add'>+</div><div class='add'>+        case GF_FOP_DISCARD:</div><div class='add'>+            STACK_WIND_COOKIE(frame, dht_discard_cbk, subvol, subvol,</div><div class='add'>+                              subvol-&gt;fops-&gt;discard, local-&gt;fd,</div><div class='add'>+                              local-&gt;rebalance.offset, local-&gt;rebalance.size,</div><div class='add'>+                              local-&gt;xattr_req);</div><div class='add'>+            break;</div><div class='add'>+</div><div class='add'>+        case GF_FOP_FALLOCATE:</div><div class='add'>+            STACK_WIND_COOKIE(frame, dht_fallocate_cbk, subvol, subvol,</div><div class='add'>+                              subvol-&gt;fops-&gt;fallocate, fd,</div><div class='add'>+                              local-&gt;rebalance.flags, local-&gt;rebalance.offset,</div><div class='add'>+                              local-&gt;rebalance.size, local-&gt;xattr_req);</div><div class='add'>+            break;</div><div class='add'>+</div><div class='add'>+        case GF_FOP_FTRUNCATE:</div><div class='add'>+            STACK_WIND_COOKIE(frame, dht_truncate_cbk, subvol, subvol,</div><div class='add'>+                              subvol-&gt;fops-&gt;ftruncate, fd,</div><div class='add'>+                              local-&gt;rebalance.offset, local-&gt;xattr_req);</div><div class='add'>+            break;</div><div class='add'>+</div><div class='add'>+        case GF_FOP_FSYNC:</div><div class='add'>+            STACK_WIND_COOKIE(frame, dht_fsync_cbk, subvol, subvol,</div><div class='add'>+                              subvol-&gt;fops-&gt;fsync, local-&gt;fd,</div><div class='add'>+                              local-&gt;rebalance.flags, local-&gt;xattr_req);</div><div class='add'>+            break;</div><div class='add'>+</div><div class='add'>+        case GF_FOP_READ:</div><div class='add'>+            STACK_WIND(frame, dht_readv_cbk, subvol, subvol-&gt;fops-&gt;readv,</div><div class='add'>+                       local-&gt;fd, local-&gt;rebalance.size,</div><div class='add'>+                       local-&gt;rebalance.offset, local-&gt;rebalance.flags,</div><div class='add'>+                       local-&gt;xattr_req);</div><div class='add'>+            break;</div><div class='add'>+</div><div class='add'>+        case GF_FOP_FSTAT:</div><div class='add'>+            STACK_WIND_COOKIE(frame, dht_file_attr_cbk, subvol, subvol,</div><div class='add'>+                              subvol-&gt;fops-&gt;fstat, fd, local-&gt;xattr_req);</div><div class='add'>+            break;</div><div class='add'>+</div><div class='add'>+        case GF_FOP_FSETXATTR:</div><div class='add'>+            STACK_WIND_COOKIE(frame, dht_file_setxattr_cbk, subvol, subvol,</div><div class='add'>+                              subvol-&gt;fops-&gt;fsetxattr, local-&gt;fd,</div><div class='add'>+                              local-&gt;rebalance.xattr, local-&gt;rebalance.flags,</div><div class='add'>+                              local-&gt;xattr_req);</div><div class='add'>+            break;</div><div class='add'>+</div><div class='add'>+        case GF_FOP_FREMOVEXATTR:</div><div class='add'>+            STACK_WIND_COOKIE(frame, dht_file_removexattr_cbk, subvol, subvol,</div><div class='add'>+                              subvol-&gt;fops-&gt;fremovexattr, local-&gt;fd, local-&gt;key,</div><div class='add'>+                              local-&gt;xattr_req);</div><div class='add'>+</div><div class='add'>+            break;</div><div class='add'>+</div><div class='add'>+        case GF_FOP_FXATTROP:</div><div class='add'>+            STACK_WIND(frame, dht_common_xattrop_cbk, subvol,</div><div class='add'>+                       subvol-&gt;fops-&gt;fxattrop, local-&gt;fd,</div><div class='add'>+                       local-&gt;rebalance.flags, local-&gt;rebalance.xattr,</div><div class='add'>+                       local-&gt;xattr_req);</div><div class='add'>+            break;</div><div class='add'>+</div><div class='add'>+        case GF_FOP_FGETXATTR:</div><div class='add'>+            STACK_WIND(frame, dht_getxattr_cbk, subvol, subvol-&gt;fops-&gt;fgetxattr,</div><div class='add'>+                       local-&gt;fd, local-&gt;key, NULL);</div><div class='add'>+            break;</div><div class='add'>+</div><div class='add'>+        case GF_FOP_FINODELK:</div><div class='add'>+            STACK_WIND(frame, dht_finodelk_cbk, subvol, subvol-&gt;fops-&gt;finodelk,</div><div class='add'>+                       local-&gt;key, local-&gt;fd, local-&gt;rebalance.lock_cmd,</div><div class='add'>+                       &amp;local-&gt;rebalance.flock, local-&gt;xattr_req);</div><div class='add'>+            break;</div><div class='add'>+        default:</div><div class='add'>+            gf_smsg(this-&gt;name, GF_LOG_ERROR, 0, DHT_MSG_UNKNOWN_FOP, "fd=%p",</div><div class='add'>+                    fd, "gfid=%s", uuid_utoa(fd-&gt;inode-&gt;gfid), "name=%s",</div><div class='add'>+                    subvol-&gt;name, NULL);</div><div class='add'>+            break;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    goto out;</div><div class='add'>+</div><div class='add'>+    /* Could not open the fd on the dst. Unwind */</div><div class='add'>+</div><div class='add'>+handle_err:</div><div class='add'>+</div><div class='add'>+    switch (fop) {</div><div class='add'>+        case GF_FOP_WRITE:</div><div class='add'>+            DHT_STACK_UNWIND(writev, frame, -1, op_errno, NULL, NULL, NULL);</div><div class='add'>+            break;</div><div class='add'>+</div><div class='add'>+        case GF_FOP_FLUSH:</div><div class='add'>+            DHT_STACK_UNWIND(flush, frame, -1, op_errno, NULL);</div><div class='add'>+            break;</div><div class='add'>+</div><div class='add'>+        case GF_FOP_FSETATTR:</div><div class='add'>+            DHT_STACK_UNWIND(fsetattr, frame, -1, op_errno, NULL, NULL, NULL);</div><div class='add'>+            break;</div><div class='add'>+</div><div class='add'>+        case GF_FOP_ZEROFILL:</div><div class='add'>+            DHT_STACK_UNWIND(zerofill, frame, -1, op_errno, NULL, NULL, NULL);</div><div class='add'>+            break;</div><div class='add'>+</div><div class='add'>+        case GF_FOP_DISCARD:</div><div class='add'>+            DHT_STACK_UNWIND(discard, frame, -1, op_errno, NULL, NULL, NULL);</div><div class='add'>+            break;</div><div class='add'>+</div><div class='add'>+        case GF_FOP_FALLOCATE:</div><div class='add'>+            DHT_STACK_UNWIND(fallocate, frame, -1, op_errno, NULL, NULL, NULL);</div><div class='add'>+            break;</div><div class='add'>+</div><div class='add'>+        case GF_FOP_FTRUNCATE:</div><div class='add'>+            DHT_STACK_UNWIND(ftruncate, frame, -1, op_errno, NULL, NULL, NULL);</div><div class='add'>+            break;</div><div class='add'>+</div><div class='add'>+        case GF_FOP_FSYNC:</div><div class='add'>+            DHT_STACK_UNWIND(fsync, frame, -1, op_errno, NULL, NULL, NULL);</div><div class='add'>+            break;</div><div class='add'>+</div><div class='add'>+        case GF_FOP_READ:</div><div class='add'>+            DHT_STACK_UNWIND(readv, frame, -1, op_errno, NULL, 0, NULL, NULL,</div><div class='add'>+                             NULL);</div><div class='add'>+            break;</div><div class='add'>+</div><div class='add'>+        case GF_FOP_FSTAT:</div><div class='add'>+            DHT_STACK_UNWIND(fstat, frame, -1, op_errno, NULL, NULL);</div><div class='add'>+            break;</div><div class='add'>+</div><div class='add'>+        case GF_FOP_FSETXATTR:</div><div class='add'>+            DHT_STACK_UNWIND(fsetxattr, frame, -1, op_errno, NULL);</div><div class='add'>+            break;</div><div class='add'>+</div><div class='add'>+        case GF_FOP_FREMOVEXATTR:</div><div class='add'>+            DHT_STACK_UNWIND(fremovexattr, frame, -1, op_errno, NULL);</div><div class='add'>+            break;</div><div class='add'>+</div><div class='add'>+        case GF_FOP_FXATTROP:</div><div class='add'>+            DHT_STACK_UNWIND(fxattrop, frame, -1, op_errno, NULL, NULL);</div><div class='add'>+            break;</div><div class='add'>+</div><div class='add'>+        case GF_FOP_FGETXATTR:</div><div class='add'>+            DHT_STACK_UNWIND(fgetxattr, frame, -1, op_errno, NULL, NULL);</div><div class='add'>+            break;</div><div class='add'>+</div><div class='add'>+        case GF_FOP_FINODELK:</div><div class='add'>+            DHT_STACK_UNWIND(finodelk, frame, -1, op_errno, NULL);</div><div class='add'>+            break;</div><div class='add'>+</div><div class='add'>+        default:</div><div class='add'>+            gf_smsg(this-&gt;name, GF_LOG_ERROR, 0, DHT_MSG_UNKNOWN_FOP, "fd=%p",</div><div class='add'>+                    fd, "gfid=%s", uuid_utoa(fd-&gt;inode-&gt;gfid), "name=%s",</div><div class='add'>+                    subvol-&gt;name, NULL);</div><div class='add'>+            break;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        /* Why do other tasks if first required 'char' itself is not there */</div><div class='del'>-        if (loc-&gt;name &amp;&amp; !strchr (loc-&gt;name, '@'))</div><div class='del'>-                goto out;</div><div class='add'>+out:</div><div class='ctx'> </div><div class='del'>-        trav = this-&gt;children;</div><div class='del'>-        while (trav) {</div><div class='del'>-                snprintf (key, 1024, "*@%s:%s", this-&gt;name, trav-&gt;xlator-&gt;name);</div><div class='del'>-                if (fnmatch (key, loc-&gt;name, FNM_NOESCAPE) == 0) {</div><div class='del'>-                        new_name = GF_CALLOC(strlen (loc-&gt;name),</div><div class='del'>-                                             sizeof (char),</div><div class='del'>-                                             gf_common_mt_char);</div><div class='del'>-                        if (!new_name)</div><div class='del'>-                                goto out;</div><div class='del'>-                        if (fnmatch (key, loc-&gt;path, FNM_NOESCAPE) == 0) {</div><div class='del'>-                                new_path = GF_CALLOC(strlen (loc-&gt;path),</div><div class='del'>-                                                     sizeof (char),</div><div class='del'>-                                                     gf_common_mt_char);</div><div class='del'>-                                if (!new_path)</div><div class='del'>-                                        goto out;</div><div class='del'>-                                strncpy (new_path, loc-&gt;path, (strlen (loc-&gt;path) -</div><div class='del'>-                                                               strlen (key) + 1));</div><div class='del'>-                        }</div><div class='del'>-                        strncpy (new_name, loc-&gt;name, (strlen (loc-&gt;name) -</div><div class='del'>-                                                       strlen (key) + 1));</div><div class='del'>-</div><div class='del'>-                        if (new_loc) {</div><div class='del'>-                                new_loc-&gt;path   = ((new_path) ? new_path:</div><div class='del'>-                                                   gf_strdup (loc-&gt;path));</div><div class='del'>-                                new_loc-&gt;name   = new_name;</div><div class='del'>-                                new_loc-&gt;ino    = loc-&gt;ino;</div><div class='del'>-                                new_loc-&gt;inode  = inode_ref (loc-&gt;inode);</div><div class='del'>-                                new_loc-&gt;parent = inode_ref (loc-&gt;parent);</div><div class='del'>-                        }</div><div class='del'>-                        *subvol         = trav-&gt;xlator;</div><div class='del'>-                        ret = 1;  /* success */</div><div class='del'>-                        goto out;</div><div class='del'>-                }</div><div class='del'>-                trav = trav-&gt;next;</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* Check once again if the fd has been opened on the cached subvol.</div><div class='add'>+ * If not, open and update the fd_ctx.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+dht_check_and_open_fd_on_subvol_task(void *data)</div><div class='add'>+{</div><div class='add'>+    loc_t loc = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int ret = -1;</div><div class='add'>+    call_frame_t *frame = NULL;</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    fd_t *fd = NULL;</div><div class='add'>+    xlator_t *this = NULL;</div><div class='add'>+    xlator_t *subvol = NULL;</div><div class='add'>+</div><div class='add'>+    frame = data;</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    this = THIS;</div><div class='add'>+    fd = local-&gt;fd;</div><div class='add'>+    subvol = local-&gt;cached_subvol;</div><div class='add'>+</div><div class='add'>+    local-&gt;fd_checked = _gf_true;</div><div class='add'>+</div><div class='add'>+    if (fd_is_anonymous(fd) || dht_fd_open_on_dst(this, fd, subvol)) {</div><div class='add'>+        ret = 0;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    gf_msg_debug(this-&gt;name, 0, "Opening fd (%p, flags=0%o) on file %s @ %s",</div><div class='add'>+                 fd, fd-&gt;flags, uuid_utoa(fd-&gt;inode-&gt;gfid), subvol-&gt;name);</div><div class='add'>+</div><div class='add'>+    loc.inode = inode_ref(fd-&gt;inode);</div><div class='add'>+    gf_uuid_copy(loc.gfid, fd-&gt;inode-&gt;gfid);</div><div class='add'>+</div><div class='add'>+    /* Open this on the dst subvol */</div><div class='add'>+</div><div class='add'>+    SYNCTASK_SETID(0, 0);</div><div class='add'>+</div><div class='add'>+    ret = syncop_open(subvol, &amp;loc, (fd-&gt;flags &amp; ~(O_CREAT | O_EXCL | O_TRUNC)),</div><div class='add'>+                      fd, NULL, NULL);</div><div class='add'>+</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_ERROR, -ret, DHT_MSG_OPEN_FD_ON_DST_FAILED,</div><div class='add'>+                "fd=%p", fd, "flags=0%o", fd-&gt;flags, "gfid=%s",</div><div class='add'>+                uuid_utoa(fd-&gt;inode-&gt;gfid), "name=%s", subvol-&gt;name, NULL);</div><div class='add'>+        /* This can happen if the cached subvol was updated in the</div><div class='add'>+         * inode_ctx and the fd was opened on the new cached suvol</div><div class='add'>+         * after this fop was wound on the old cached subvol.</div><div class='add'>+         * As we do not close the fd on the old subvol (a leak)</div><div class='add'>+         * don't treat ENOENT as an error and allow the phase1/phase2</div><div class='add'>+         * checks to handle it.</div><div class='add'>+         */</div><div class='add'>+</div><div class='add'>+        if ((-ret != ENOENT) &amp;&amp; (-ret != ESTALE)) {</div><div class='add'>+            local-&gt;op_errno = -ret;</div><div class='add'>+            ret = -1;</div><div class='add'>+        } else {</div><div class='add'>+            ret = 0;</div><div class='ctx'>         }</div><div class='add'>+</div><div class='add'>+        local-&gt;op_errno = -ret;</div><div class='add'>+        ret = -1;</div><div class='add'>+</div><div class='add'>+    } else {</div><div class='add'>+        dht_fd_ctx_set(this, fd, subvol);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    SYNCTASK_SETID(frame-&gt;root-&gt;uid, frame-&gt;root-&gt;gid);</div><div class='ctx'> out:</div><div class='del'>-        if (!ret) {</div><div class='del'>-                /* !success */</div><div class='del'>-                if (new_path)</div><div class='del'>-                        GF_FREE (new_path);</div><div class='del'>-                if (new_name)</div><div class='del'>-                        GF_FREE (new_name);</div><div class='del'>-        }</div><div class='del'>-        return ret;</div><div class='add'>+    loc_wipe(&amp;loc);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-dht_deitransform (xlator_t *this, uint64_t y, xlator_t **subvol_p,</div><div class='del'>-		  uint64_t *x_p)</div><div class='add'>+dht_check_and_open_fd_on_subvol(xlator_t *this, call_frame_t *frame)</div><div class='ctx'> {</div><div class='del'>-	dht_conf_t *conf = NULL;</div><div class='del'>-	int         cnt = 0;</div><div class='del'>-	int         max = 0;</div><div class='del'>-	uint64_t    x = 0;</div><div class='del'>-	xlator_t   *subvol = 0;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+</div><div class='add'>+    /*</div><div class='add'>+            if (dht_fd_open_on_dst (this, fd, subvol))</div><div class='add'>+                    goto out;</div><div class='add'>+    */</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+</div><div class='add'>+    ret = synctask_new(this-&gt;ctx-&gt;env, dht_check_and_open_fd_on_subvol_task,</div><div class='add'>+                       dht_check_and_open_fd_on_subvol_complete, frame, frame);</div><div class='ctx'> </div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_ERROR, 0, DHT_MSG_SYNCTASK_CREATE_FAILED,</div><div class='add'>+                "to-check-and-open fd=%p", local-&gt;fd, NULL);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	conf = this-&gt;private;</div><div class='del'>-	max = conf-&gt;subvolume_cnt;</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	cnt = y % max;</div><div class='del'>-	x   = y / max;</div><div class='add'>+int</div><div class='add'>+dht_frame_return(call_frame_t *frame)</div><div class='add'>+{</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    int this_call_cnt = -1;</div><div class='ctx'> </div><div class='del'>-	subvol = conf-&gt;subvolumes[cnt];</div><div class='add'>+    if (!frame)</div><div class='add'>+        return -1;</div><div class='ctx'> </div><div class='del'>-	if (subvol_p)</div><div class='del'>-		*subvol_p = subvol;</div><div class='add'>+    local = frame-&gt;local;</div><div class='ctx'> </div><div class='del'>-	if (x_p)</div><div class='del'>-		*x_p = x;</div><div class='add'>+    LOCK(&amp;frame-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        this_call_cnt = --local-&gt;call_cnt;</div><div class='add'>+    }</div><div class='add'>+    UNLOCK(&amp;frame-&gt;lock);</div><div class='ctx'> </div><div class='del'>-	return 0;</div><div class='add'>+    return this_call_cnt;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+/*</div><div class='add'>+ * Use this function to specify which subvol you want the file created</div><div class='add'>+ * on - this need not be the hashed subvol.</div><div class='add'>+ * Format: &lt;filename&gt;@&lt;this-&gt;name&gt;:&lt;subvol-name&gt;</div><div class='add'>+ * Eg: file-1@vol1-dht:vol1-client-0</div><div class='add'>+ *     where vol1 is a pure distribute volume</div><div class='add'>+ *     will create file-1 on vol1-client-0</div><div class='add'>+ */</div><div class='ctx'> </div><div class='del'>-void</div><div class='del'>-dht_local_wipe (xlator_t *this, dht_local_t *local)</div><div class='add'>+int</div><div class='add'>+dht_filter_loc_subvol_key(xlator_t *this, loc_t *loc, loc_t *new_loc,</div><div class='add'>+                          xlator_t **subvol)</div><div class='ctx'> {</div><div class='del'>-	if (!local)</div><div class='del'>-		return;</div><div class='add'>+    char *new_name = NULL;</div><div class='add'>+    char *new_path = NULL;</div><div class='add'>+    xlator_list_t *trav = NULL;</div><div class='add'>+    char key[1024] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int ret = 0; /* not found */</div><div class='add'>+    int keylen = 0;</div><div class='add'>+    int name_len = 0;</div><div class='add'>+    int path_len = 0;</div><div class='add'>+</div><div class='add'>+    /* Why do other tasks if first required 'char' itself is not there */</div><div class='add'>+    if (!new_loc || !loc || !loc-&gt;name || !strchr(loc-&gt;name, '@')) {</div><div class='add'>+        /* Skip the GF_FREE checks here */</div><div class='add'>+        return ret;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    trav = this-&gt;children;</div><div class='add'>+    while (trav) {</div><div class='add'>+        keylen = snprintf(key, sizeof(key), "*@%s:%s", this-&gt;name,</div><div class='add'>+                          trav-&gt;xlator-&gt;name);</div><div class='add'>+        /* Ignore '*' */</div><div class='add'>+        keylen = keylen - 1;</div><div class='add'>+        if (fnmatch(key, loc-&gt;name, FNM_NOESCAPE) == 0) {</div><div class='add'>+            name_len = strlen(loc-&gt;name) - keylen;</div><div class='add'>+            new_name = GF_MALLOC(name_len + 1, gf_common_mt_char);</div><div class='add'>+            if (!new_name)</div><div class='add'>+                goto out;</div><div class='add'>+            if (fnmatch(key, loc-&gt;path, FNM_NOESCAPE) == 0) {</div><div class='add'>+                path_len = strlen(loc-&gt;path) - keylen;</div><div class='add'>+                new_path = GF_MALLOC(path_len + 1, gf_common_mt_char);</div><div class='add'>+                if (!new_path)</div><div class='add'>+                    goto out;</div><div class='add'>+                snprintf(new_path, path_len + 1, "%s", loc-&gt;path);</div><div class='add'>+            }</div><div class='add'>+            snprintf(new_name, name_len + 1, "%s", loc-&gt;name);</div><div class='add'>+</div><div class='add'>+            if (new_loc) {</div><div class='add'>+                new_loc-&gt;path = ((new_path) ? new_path : gf_strdup(loc-&gt;path));</div><div class='add'>+                new_loc-&gt;name = new_name;</div><div class='add'>+                new_loc-&gt;inode = inode_ref(loc-&gt;inode);</div><div class='add'>+                new_loc-&gt;parent = inode_ref(loc-&gt;parent);</div><div class='add'>+            }</div><div class='add'>+            *subvol = trav-&gt;xlator;</div><div class='add'>+            ret = 1; /* success */</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+        trav = trav-&gt;next;</div><div class='add'>+    }</div><div class='add'>+out:</div><div class='add'>+    if (!ret) {</div><div class='add'>+        /* !success */</div><div class='add'>+        GF_FREE(new_path);</div><div class='add'>+        GF_FREE(new_name);</div><div class='add'>+    }</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	loc_wipe (&amp;local-&gt;loc);</div><div class='del'>-	loc_wipe (&amp;local-&gt;loc2);</div><div class='add'>+static xlator_t *</div><div class='add'>+dht_get_subvol_from_id(xlator_t *this, int client_id)</div><div class='add'>+{</div><div class='add'>+    xlator_t *xl = NULL;</div><div class='add'>+    dht_conf_t *conf = NULL;</div><div class='add'>+    char *sid = NULL;</div><div class='add'>+    int32_t ret = -1;</div><div class='ctx'> </div><div class='del'>-	if (local-&gt;xattr)</div><div class='del'>-		dict_unref (local-&gt;xattr);</div><div class='add'>+    conf = this-&gt;private;</div><div class='ctx'> </div><div class='del'>-	if (local-&gt;inode)</div><div class='del'>-		inode_unref (local-&gt;inode);</div><div class='add'>+    ret = gf_asprintf(&amp;sid, "%d", client_id);</div><div class='add'>+    if (ret == -1) {</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_ERROR, 0, DHT_MSG_ASPRINTF_FAILED, NULL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	if (local-&gt;layout) {</div><div class='del'>-		dht_layout_unref (this, local-&gt;layout);</div><div class='del'>-                local-&gt;layout = NULL;</div><div class='del'>-        }</div><div class='add'>+    if (dict_get_ptr(conf-&gt;leaf_to_subvol, sid, (void **)&amp;xl))</div><div class='add'>+        xl = NULL;</div><div class='ctx'> </div><div class='del'>-	loc_wipe (&amp;local-&gt;linkfile.loc);</div><div class='add'>+    GF_FREE(sid);</div><div class='ctx'> </div><div class='del'>-	if (local-&gt;linkfile.xattr)</div><div class='del'>-		dict_unref (local-&gt;linkfile.xattr);</div><div class='add'>+out:</div><div class='add'>+    return xl;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	if (local-&gt;linkfile.inode)</div><div class='del'>-		inode_unref (local-&gt;linkfile.inode);</div><div class='add'>+int</div><div class='add'>+dht_deitransform(xlator_t *this, uint64_t y, xlator_t **subvol_p)</div><div class='add'>+{</div><div class='add'>+    int client_id = 0;</div><div class='add'>+    xlator_t *subvol = 0;</div><div class='add'>+    dht_conf_t *conf = NULL;</div><div class='ctx'> </div><div class='del'>-	if (local-&gt;fd) {</div><div class='del'>-		fd_unref (local-&gt;fd);</div><div class='del'>-		local-&gt;fd = NULL;</div><div class='del'>-	}</div><div class='add'>+    if (!this-&gt;private)</div><div class='add'>+        return -1;</div><div class='ctx'> </div><div class='del'>-        if (local-&gt;params) {</div><div class='del'>-                dict_unref (local-&gt;params);</div><div class='del'>-                local-&gt;params = NULL;</div><div class='del'>-        }</div><div class='add'>+    conf = this-&gt;private;</div><div class='ctx'> </div><div class='del'>-	if (local-&gt;xattr_req)</div><div class='del'>-		dict_unref (local-&gt;xattr_req);</div><div class='add'>+    client_id = gf_deitransform(this, y);</div><div class='ctx'> </div><div class='del'>-        if (local-&gt;selfheal.layout) {</div><div class='del'>-                dht_layout_unref (this, local-&gt;selfheal.layout);</div><div class='del'>-                local-&gt;selfheal.layout = NULL;</div><div class='del'>-        }</div><div class='add'>+    subvol = dht_get_subvol_from_id(this, client_id);</div><div class='ctx'> </div><div class='del'>-        if (local-&gt;newpath) {</div><div class='del'>-                GF_FREE (local-&gt;newpath);</div><div class='del'>-        }</div><div class='add'>+    if (!subvol)</div><div class='add'>+        subvol = conf-&gt;subvolumes[0];</div><div class='ctx'> </div><div class='del'>-	GF_FREE (local);</div><div class='del'>-}</div><div class='add'>+    if (subvol_p)</div><div class='add'>+        *subvol_p = subvol;</div><div class='ctx'> </div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-dht_local_t *</div><div class='del'>-dht_local_init (call_frame_t *frame)</div><div class='add'>+void</div><div class='add'>+dht_local_wipe(xlator_t *this, dht_local_t *local)</div><div class='ctx'> {</div><div class='del'>-	dht_local_t *local = NULL;</div><div class='add'>+    int i = 0;</div><div class='ctx'> </div><div class='del'>-	/* TODO: use mem-pool */</div><div class='del'>-	local = GF_CALLOC (1, sizeof (*local),</div><div class='del'>-                           gf_dht_mt_dht_local_t);</div><div class='add'>+    if (!local)</div><div class='add'>+        return;</div><div class='ctx'> </div><div class='del'>-	if (!local)</div><div class='del'>-		return NULL;</div><div class='add'>+    loc_wipe(&amp;local-&gt;loc);</div><div class='add'>+    loc_wipe(&amp;local-&gt;loc2);</div><div class='add'>+    loc_wipe(&amp;local-&gt;loc2_copy);</div><div class='ctx'> </div><div class='del'>-	local-&gt;op_ret = -1;</div><div class='del'>-	local-&gt;op_errno = EUCLEAN;</div><div class='add'>+    if (local-&gt;xattr)</div><div class='add'>+        dict_unref(local-&gt;xattr);</div><div class='ctx'> </div><div class='del'>-	frame-&gt;local = local;</div><div class='add'>+    if (local-&gt;inode)</div><div class='add'>+        inode_unref(local-&gt;inode);</div><div class='ctx'> </div><div class='del'>-	return local;</div><div class='del'>-}</div><div class='add'>+    if (local-&gt;layout) {</div><div class='add'>+        dht_layout_unref(this, local-&gt;layout);</div><div class='add'>+        local-&gt;layout = NULL;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='add'>+    loc_wipe(&amp;local-&gt;linkfile.loc);</div><div class='ctx'> </div><div class='del'>-char *</div><div class='del'>-basestr (const char *str)</div><div class='del'>-{</div><div class='del'>-        char *basestr = NULL;</div><div class='add'>+    if (local-&gt;linkfile.xattr)</div><div class='add'>+        dict_unref(local-&gt;linkfile.xattr);</div><div class='ctx'> </div><div class='del'>-        basestr = strrchr (str, '/');</div><div class='del'>-        if (basestr)</div><div class='del'>-                basestr ++;</div><div class='add'>+    if (local-&gt;linkfile.inode)</div><div class='add'>+        inode_unref(local-&gt;linkfile.inode);</div><div class='ctx'> </div><div class='del'>-        return basestr;</div><div class='del'>-}</div><div class='add'>+    if (local-&gt;fd) {</div><div class='add'>+        fd_unref(local-&gt;fd);</div><div class='add'>+        local-&gt;fd = NULL;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='add'>+    if (local-&gt;params) {</div><div class='add'>+        dict_unref(local-&gt;params);</div><div class='add'>+        local-&gt;params = NULL;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-xlator_t *</div><div class='del'>-dht_first_up_subvol (xlator_t *this)</div><div class='add'>+    if (local-&gt;xattr_req)</div><div class='add'>+        dict_unref(local-&gt;xattr_req);</div><div class='add'>+    if (local-&gt;mds_xattr)</div><div class='add'>+        dict_unref(local-&gt;mds_xattr);</div><div class='add'>+    if (local-&gt;xdata)</div><div class='add'>+        dict_unref(local-&gt;xdata);</div><div class='add'>+</div><div class='add'>+    if (local-&gt;selfheal.layout) {</div><div class='add'>+        dht_layout_unref(this, local-&gt;selfheal.layout);</div><div class='add'>+        local-&gt;selfheal.layout = NULL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (local-&gt;selfheal.refreshed_layout) {</div><div class='add'>+        dht_layout_unref(this, local-&gt;selfheal.refreshed_layout);</div><div class='add'>+        local-&gt;selfheal.refreshed_layout = NULL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; 2; i++) {</div><div class='add'>+        dht_lock_array_free(local-&gt;lock[i].ns.parent_layout.locks,</div><div class='add'>+                            local-&gt;lock[i].ns.parent_layout.lk_count);</div><div class='add'>+</div><div class='add'>+        GF_FREE(local-&gt;lock[i].ns.parent_layout.locks);</div><div class='add'>+</div><div class='add'>+        dht_lock_array_free(local-&gt;lock[i].ns.directory_ns.locks,</div><div class='add'>+                            local-&gt;lock[i].ns.directory_ns.lk_count);</div><div class='add'>+        GF_FREE(local-&gt;lock[i].ns.directory_ns.locks);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    GF_FREE(local-&gt;key);</div><div class='add'>+</div><div class='add'>+    if (local-&gt;rebalance.xdata)</div><div class='add'>+        dict_unref(local-&gt;rebalance.xdata);</div><div class='add'>+</div><div class='add'>+    if (local-&gt;rebalance.xattr)</div><div class='add'>+        dict_unref(local-&gt;rebalance.xattr);</div><div class='add'>+</div><div class='add'>+    if (local-&gt;rebalance.dict)</div><div class='add'>+        dict_unref(local-&gt;rebalance.dict);</div><div class='add'>+</div><div class='add'>+    GF_FREE(local-&gt;rebalance.vector);</div><div class='add'>+</div><div class='add'>+    if (local-&gt;rebalance.iobref)</div><div class='add'>+        iobref_unref(local-&gt;rebalance.iobref);</div><div class='add'>+</div><div class='add'>+    if (local-&gt;stub) {</div><div class='add'>+        call_stub_destroy(local-&gt;stub);</div><div class='add'>+        local-&gt;stub = NULL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (local-&gt;ret_cache)</div><div class='add'>+        GF_FREE(local-&gt;ret_cache);</div><div class='add'>+</div><div class='add'>+    mem_put(local);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+dht_local_t *</div><div class='add'>+dht_local_init(call_frame_t *frame, loc_t *loc, fd_t *fd, glusterfs_fop_t fop)</div><div class='ctx'> {</div><div class='del'>-	dht_conf_t *conf = NULL;</div><div class='del'>-	xlator_t   *child = NULL;</div><div class='del'>-	int         i = 0;</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    inode_t *inode = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    local = mem_get0(THIS-&gt;local_pool);</div><div class='add'>+    if (!local)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    if (loc) {</div><div class='add'>+        ret = loc_copy(&amp;local-&gt;loc, loc);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+</div><div class='add'>+        inode = loc-&gt;inode;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	conf = this-&gt;private;</div><div class='add'>+    if (fd) {</div><div class='add'>+        local-&gt;fd = fd_ref(fd);</div><div class='add'>+        if (!inode)</div><div class='add'>+            inode = fd-&gt;inode;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	LOCK (&amp;conf-&gt;subvolume_lock);</div><div class='del'>-	{</div><div class='del'>-		for (i = 0; i &lt; conf-&gt;subvolume_cnt; i++) {</div><div class='del'>-			if (conf-&gt;subvolume_status[i]) {</div><div class='del'>-				child = conf-&gt;subvolumes[i];</div><div class='del'>-				break;</div><div class='del'>-			}</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='del'>-	UNLOCK (&amp;conf-&gt;subvolume_lock);</div><div class='add'>+    local-&gt;op_ret = -1;</div><div class='add'>+    local-&gt;op_errno = EUCLEAN;</div><div class='add'>+    local-&gt;fop = fop;</div><div class='ctx'> </div><div class='del'>-	return child;</div><div class='add'>+    if (inode) {</div><div class='add'>+        local-&gt;layout = dht_layout_get(frame-&gt;this, inode);</div><div class='add'>+        local-&gt;cached_subvol = dht_subvol_get_cached(frame-&gt;this, inode);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    frame-&gt;local = local;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (ret) {</div><div class='add'>+        if (local)</div><div class='add'>+            mem_put(local);</div><div class='add'>+        local = NULL;</div><div class='add'>+    }</div><div class='add'>+    return local;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> xlator_t *</div><div class='del'>-dht_last_up_subvol (xlator_t *this)</div><div class='del'>-{</div><div class='del'>-        dht_conf_t *conf = NULL;</div><div class='del'>-        xlator_t   *child = NULL;</div><div class='del'>-        int         i = 0;</div><div class='del'>-</div><div class='del'>-        conf = this-&gt;private;</div><div class='del'>-        LOCK (&amp;conf-&gt;subvolume_lock);</div><div class='del'>-        {</div><div class='del'>-                for (i = conf-&gt;subvolume_cnt-1; i &gt;= 0; i--) {</div><div class='del'>-                        if (conf-&gt;subvolume_status[i]) {</div><div class='del'>-                                child = conf-&gt;subvolumes[i];</div><div class='del'>-                                break;</div><div class='del'>-                        }</div><div class='add'>+dht_first_up_subvol(xlator_t *this)</div><div class='add'>+{</div><div class='add'>+    dht_conf_t *conf = NULL;</div><div class='add'>+    xlator_t *child = NULL;</div><div class='add'>+    int i = 0;</div><div class='add'>+    time_t time = 0;</div><div class='add'>+</div><div class='add'>+    conf = this-&gt;private;</div><div class='add'>+    if (!conf)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;conf-&gt;subvolume_lock);</div><div class='add'>+    {</div><div class='add'>+        for (i = 0; i &lt; conf-&gt;subvolume_cnt; i++) {</div><div class='add'>+            if (conf-&gt;subvol_up_time[i]) {</div><div class='add'>+                if (!time) {</div><div class='add'>+                    time = conf-&gt;subvol_up_time[i];</div><div class='add'>+                    child = conf-&gt;subvolumes[i];</div><div class='add'>+                } else if (time &gt; conf-&gt;subvol_up_time[i]) {</div><div class='add'>+                    time = conf-&gt;subvol_up_time[i];</div><div class='add'>+                    child = conf-&gt;subvolumes[i];</div><div class='ctx'>                 }</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    UNLOCK(&amp;conf-&gt;subvolume_lock);</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return child;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+xlator_t *</div><div class='add'>+dht_last_up_subvol(xlator_t *this)</div><div class='add'>+{</div><div class='add'>+    dht_conf_t *conf = NULL;</div><div class='add'>+    xlator_t *child = NULL;</div><div class='add'>+    int i = 0;</div><div class='add'>+</div><div class='add'>+    conf = this-&gt;private;</div><div class='add'>+    if (!conf)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;conf-&gt;subvolume_lock);</div><div class='add'>+    {</div><div class='add'>+        for (i = conf-&gt;subvolume_cnt - 1; i &gt;= 0; i--) {</div><div class='add'>+            if (conf-&gt;subvolume_status[i]) {</div><div class='add'>+                child = conf-&gt;subvolumes[i];</div><div class='add'>+                break;</div><div class='add'>+            }</div><div class='ctx'>         }</div><div class='del'>-        UNLOCK (&amp;conf-&gt;subvolume_lock);</div><div class='add'>+    }</div><div class='add'>+    UNLOCK(&amp;conf-&gt;subvolume_lock);</div><div class='ctx'> </div><div class='del'>-        return child;</div><div class='add'>+out:</div><div class='add'>+    return child;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> xlator_t *</div><div class='del'>-dht_subvol_get_hashed (xlator_t *this, loc_t *loc)</div><div class='add'>+dht_subvol_get_hashed(xlator_t *this, loc_t *loc)</div><div class='ctx'> {</div><div class='del'>-        dht_layout_t *layout = NULL;</div><div class='del'>-        xlator_t     *subvol = NULL;</div><div class='add'>+    dht_layout_t *layout = NULL;</div><div class='add'>+    xlator_t *subvol = NULL;</div><div class='add'>+    dht_conf_t *conf = NULL;</div><div class='add'>+    dht_methods_t *methods = NULL;</div><div class='ctx'> </div><div class='del'>-        if (is_fs_root (loc)) {</div><div class='del'>-                subvol = dht_first_up_subvol (this);</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='add'>+    GF_VALIDATE_OR_GOTO("dht", this, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, loc, out);</div><div class='ctx'> </div><div class='del'>-        layout = dht_layout_get (this, loc-&gt;parent);</div><div class='add'>+    conf = this-&gt;private;</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, conf, out);</div><div class='ctx'> </div><div class='del'>-        if (!layout) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-                        "layout missing path=%s parent=%"PRId64,</div><div class='del'>-                        loc-&gt;path, loc-&gt;parent-&gt;ino);</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='add'>+    methods = &amp;(conf-&gt;methods);</div><div class='ctx'> </div><div class='del'>-        subvol = dht_layout_search (this, layout, loc-&gt;name);</div><div class='add'>+    if (__is_root_gfid(loc-&gt;gfid)) {</div><div class='add'>+        subvol = dht_first_up_subvol(this);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        if (!subvol) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-                        "could not find subvolume for path=%s",</div><div class='del'>-                        loc-&gt;path);</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, loc-&gt;parent, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, loc-&gt;name, out);</div><div class='add'>+</div><div class='add'>+    layout = dht_layout_get(this, loc-&gt;parent);</div><div class='add'>+</div><div class='add'>+    if (!layout) {</div><div class='add'>+        gf_msg_debug(this-&gt;name, 0, "Missing layout. path=%s, parent gfid =%s",</div><div class='add'>+                     loc-&gt;path, uuid_utoa(loc-&gt;parent-&gt;gfid));</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    subvol = methods-&gt;layout_search(this, layout, loc-&gt;name);</div><div class='add'>+</div><div class='add'>+    if (!subvol) {</div><div class='add'>+        gf_msg_debug(this-&gt;name, 0, "No hashed subvolume for path=%s",</div><div class='add'>+                     loc-&gt;path);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='ctx'> out:</div><div class='del'>-        if (layout) {</div><div class='del'>-                dht_layout_unref (this, layout);</div><div class='del'>-        }</div><div class='add'>+    if (layout) {</div><div class='add'>+        dht_layout_unref(this, layout);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        return subvol;</div><div class='add'>+    return subvol;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> xlator_t *</div><div class='del'>-dht_subvol_get_cached (xlator_t *this, inode_t *inode)</div><div class='add'>+dht_subvol_get_cached(xlator_t *this, inode_t *inode)</div><div class='ctx'> {</div><div class='del'>-        dht_layout_t *layout = NULL;</div><div class='del'>-        xlator_t     *subvol = NULL;</div><div class='add'>+    dht_layout_t *layout = NULL;</div><div class='add'>+    xlator_t *subvol = NULL;</div><div class='ctx'> </div><div class='add'>+    GF_VALIDATE_OR_GOTO("dht", this, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, inode, out);</div><div class='ctx'> </div><div class='del'>-        layout = dht_layout_get (this, inode);</div><div class='add'>+    layout = dht_layout_get(this, inode);</div><div class='ctx'> </div><div class='del'>-        if (!layout) {</div><div class='del'>-                goto out;</div><div class='add'>+    if (!layout) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    subvol = layout-&gt;list[0].xlator;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (layout) {</div><div class='add'>+        dht_layout_unref(this, layout);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return subvol;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+xlator_t *</div><div class='add'>+dht_subvol_next(xlator_t *this, xlator_t *prev)</div><div class='add'>+{</div><div class='add'>+    dht_conf_t *conf = NULL;</div><div class='add'>+    int i = 0;</div><div class='add'>+    xlator_t *next = NULL;</div><div class='add'>+</div><div class='add'>+    conf = this-&gt;private;</div><div class='add'>+    if (!conf)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; conf-&gt;subvolume_cnt; i++) {</div><div class='add'>+        if (conf-&gt;subvolumes[i] == prev) {</div><div class='add'>+            if ((i + 1) &lt; conf-&gt;subvolume_cnt)</div><div class='add'>+                next = conf-&gt;subvolumes[i + 1];</div><div class='add'>+            break;</div><div class='ctx'>         }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return next;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	subvol = layout-&gt;list[0].xlator;</div><div class='add'>+/* This func wraps around, if prev is actually the last subvol.</div><div class='add'>+ */</div><div class='add'>+xlator_t *</div><div class='add'>+dht_subvol_next_available(xlator_t *this, xlator_t *prev)</div><div class='add'>+{</div><div class='add'>+    dht_conf_t *conf = NULL;</div><div class='add'>+    int i = 0;</div><div class='add'>+    xlator_t *next = NULL;</div><div class='add'>+</div><div class='add'>+    conf = this-&gt;private;</div><div class='add'>+    if (!conf)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; conf-&gt;subvolume_cnt; i++) {</div><div class='add'>+        if (conf-&gt;subvolumes[i] == prev) {</div><div class='add'>+            /* if prev is last in conf-&gt;subvolumes, then wrap</div><div class='add'>+             * around.</div><div class='add'>+             */</div><div class='add'>+            if ((i + 1) &lt; conf-&gt;subvolume_cnt) {</div><div class='add'>+                next = conf-&gt;subvolumes[i + 1];</div><div class='add'>+            } else {</div><div class='add'>+                next = conf-&gt;subvolumes[0];</div><div class='add'>+            }</div><div class='add'>+            break;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='ctx'> </div><div class='ctx'> out:</div><div class='del'>-        if (layout) {</div><div class='del'>-                dht_layout_unref (this, layout);</div><div class='add'>+    return next;</div><div class='add'>+}</div><div class='add'>+int</div><div class='add'>+dht_subvol_cnt(xlator_t *this, xlator_t *subvol)</div><div class='add'>+{</div><div class='add'>+    int i = 0;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    dht_conf_t *conf = NULL;</div><div class='add'>+</div><div class='add'>+    conf = this-&gt;private;</div><div class='add'>+    if (!conf)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; conf-&gt;subvolume_cnt; i++) {</div><div class='add'>+        if (subvol == conf-&gt;subvolumes[i]) {</div><div class='add'>+            ret = i;</div><div class='add'>+            break;</div><div class='ctx'>         }</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        return subvol;</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+#define set_if_greater(a, b)                                                   \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        if ((a) &lt; (b))                                                         \</div><div class='add'>+            (a) = (b);                                                         \</div><div class='add'>+    } while (0)</div><div class='ctx'> </div><div class='del'>-xlator_t *</div><div class='del'>-dht_subvol_next (xlator_t *this, xlator_t *prev)</div><div class='add'>+#define set_if_greater_time(a, an, b, bn)                                      \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        if (((a) &lt; (b)) || (((a) == (b)) &amp;&amp; ((an) &lt; (bn)))) {                  \</div><div class='add'>+            (a) = (b);                                                         \</div><div class='add'>+            (an) = (bn);                                                       \</div><div class='add'>+        }                                                                      \</div><div class='add'>+    } while (0)</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+dht_iatt_merge(xlator_t *this, struct iatt *to, struct iatt *from)</div><div class='ctx'> {</div><div class='del'>-	dht_conf_t *conf = NULL;</div><div class='del'>-	int         i = 0;</div><div class='del'>-	xlator_t   *next = NULL;</div><div class='add'>+    if (!from || !to)</div><div class='add'>+        return 0;</div><div class='add'>+</div><div class='add'>+    to-&gt;ia_dev = from-&gt;ia_dev;</div><div class='add'>+</div><div class='add'>+    gf_uuid_copy(to-&gt;ia_gfid, from-&gt;ia_gfid);</div><div class='add'>+</div><div class='add'>+    to-&gt;ia_ino = from-&gt;ia_ino;</div><div class='add'>+    to-&gt;ia_prot = from-&gt;ia_prot;</div><div class='add'>+    to-&gt;ia_type = from-&gt;ia_type;</div><div class='add'>+    to-&gt;ia_nlink = from-&gt;ia_nlink;</div><div class='add'>+    to-&gt;ia_rdev = from-&gt;ia_rdev;</div><div class='add'>+    to-&gt;ia_size += from-&gt;ia_size;</div><div class='add'>+    to-&gt;ia_blksize = from-&gt;ia_blksize;</div><div class='add'>+    to-&gt;ia_blocks += from-&gt;ia_blocks;</div><div class='add'>+</div><div class='add'>+    if (IA_ISDIR(from-&gt;ia_type)) {</div><div class='add'>+        to-&gt;ia_blocks = DHT_DIR_STAT_BLOCKS;</div><div class='add'>+        to-&gt;ia_size = DHT_DIR_STAT_SIZE;</div><div class='add'>+    }</div><div class='add'>+    set_if_greater(to-&gt;ia_uid, from-&gt;ia_uid);</div><div class='add'>+    set_if_greater(to-&gt;ia_gid, from-&gt;ia_gid);</div><div class='add'>+</div><div class='add'>+    set_if_greater_time(to-&gt;ia_atime, to-&gt;ia_atime_nsec, from-&gt;ia_atime,</div><div class='add'>+                        from-&gt;ia_atime_nsec);</div><div class='add'>+    set_if_greater_time(to-&gt;ia_mtime, to-&gt;ia_mtime_nsec, from-&gt;ia_mtime,</div><div class='add'>+                        from-&gt;ia_mtime_nsec);</div><div class='add'>+    set_if_greater_time(to-&gt;ia_ctime, to-&gt;ia_ctime_nsec, from-&gt;ia_ctime,</div><div class='add'>+                        from-&gt;ia_ctime_nsec);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	conf = this-&gt;private;</div><div class='add'>+int</div><div class='add'>+dht_build_child_loc(xlator_t *this, loc_t *child, loc_t *parent, char *name)</div><div class='add'>+{</div><div class='add'>+    if (!child) {</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	for (i = 0; i &lt; conf-&gt;subvolume_cnt; i++) {</div><div class='del'>-		if (conf-&gt;subvolumes[i] == prev) {</div><div class='del'>-			if ((i + 1) &lt; conf-&gt;subvolume_cnt)</div><div class='del'>-				next = conf-&gt;subvolumes[i + 1];</div><div class='del'>-			break;</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='add'>+    if (strcmp(parent-&gt;path, "/") == 0)</div><div class='add'>+        gf_asprintf((char **)&amp;child-&gt;path, "/%s", name);</div><div class='add'>+    else</div><div class='add'>+        gf_asprintf((char **)&amp;child-&gt;path, "%s/%s", parent-&gt;path, name);</div><div class='ctx'> </div><div class='del'>-	return next;</div><div class='add'>+    if (!child-&gt;path) {</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    child-&gt;name = strrchr(child-&gt;path, '/');</div><div class='add'>+    if (child-&gt;name)</div><div class='add'>+        child-&gt;name++;</div><div class='add'>+</div><div class='add'>+    child-&gt;parent = inode_ref(parent-&gt;inode);</div><div class='add'>+    child-&gt;inode = inode_new(parent-&gt;inode-&gt;table);</div><div class='add'>+</div><div class='add'>+    if (!child-&gt;inode) {</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+err:</div><div class='add'>+    if (child) {</div><div class='add'>+        loc_wipe(child);</div><div class='add'>+    }</div><div class='add'>+    return -1;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+int</div><div class='add'>+dht_init_local_subvolumes(xlator_t *this, dht_conf_t *conf)</div><div class='add'>+{</div><div class='add'>+    xlator_list_t *subvols = NULL;</div><div class='add'>+    int cnt = 0;</div><div class='add'>+</div><div class='add'>+    if (!conf)</div><div class='add'>+        return -1;</div><div class='add'>+</div><div class='add'>+    for (subvols = this-&gt;children; subvols; subvols = subvols-&gt;next)</div><div class='add'>+        cnt++;</div><div class='add'>+</div><div class='add'>+    conf-&gt;local_subvols = GF_CALLOC(cnt, sizeof(xlator_t *),</div><div class='add'>+                                    gf_dht_mt_xlator_t);</div><div class='add'>+</div><div class='add'>+    /* FIX FIX : do this dynamically*/</div><div class='add'>+    conf-&gt;local_nodeuuids = GF_CALLOC(cnt, sizeof(subvol_nodeuuids_info_t),</div><div class='add'>+                                      gf_dht_nodeuuids_t);</div><div class='add'>+</div><div class='add'>+    if (!conf-&gt;local_subvols || !conf-&gt;local_nodeuuids) {</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    conf-&gt;local_subvols_cnt = 0;</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-dht_subvol_cnt (xlator_t *this, xlator_t *subvol)</div><div class='add'>+dht_init_subvolumes(xlator_t *this, dht_conf_t *conf)</div><div class='ctx'> {</div><div class='del'>-	int i = 0;</div><div class='del'>-	int ret = -1;</div><div class='del'>-	dht_conf_t *conf = NULL;</div><div class='add'>+    xlator_list_t *subvols = NULL;</div><div class='add'>+    int cnt = 0;</div><div class='add'>+</div><div class='add'>+    if (!conf)</div><div class='add'>+        return -1;</div><div class='add'>+</div><div class='add'>+    for (subvols = this-&gt;children; subvols; subvols = subvols-&gt;next)</div><div class='add'>+        cnt++;</div><div class='add'>+</div><div class='add'>+    conf-&gt;subvolumes = GF_CALLOC(cnt, sizeof(xlator_t *), gf_dht_mt_xlator_t);</div><div class='add'>+    if (!conf-&gt;subvolumes) {</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+    conf-&gt;subvolume_cnt = cnt;</div><div class='add'>+    /* Doesn't make sense to do any dht layer tasks</div><div class='add'>+       if the subvol count is 1. Set it as pass_through */</div><div class='add'>+    if (cnt == 1)</div><div class='add'>+        this-&gt;pass_through = _gf_true;</div><div class='add'>+</div><div class='add'>+    conf-&gt;local_subvols_cnt = 0;</div><div class='add'>+</div><div class='add'>+    dht_set_subvol_range(this);</div><div class='add'>+</div><div class='add'>+    cnt = 0;</div><div class='add'>+    for (subvols = this-&gt;children; subvols; subvols = subvols-&gt;next)</div><div class='add'>+        conf-&gt;subvolumes[cnt++] = subvols-&gt;xlator;</div><div class='ctx'> </div><div class='add'>+    conf-&gt;subvolume_status = GF_CALLOC(cnt, sizeof(char), gf_dht_mt_char);</div><div class='add'>+    if (!conf-&gt;subvolume_status) {</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    conf-&gt;last_event = GF_CALLOC(cnt, sizeof(int), gf_dht_mt_char);</div><div class='add'>+    if (!conf-&gt;last_event) {</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    conf-&gt;subvol_up_time = GF_CALLOC(cnt, sizeof(time_t),</div><div class='add'>+                                     gf_dht_mt_subvol_time);</div><div class='add'>+    if (!conf-&gt;subvol_up_time) {</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	conf = this-&gt;private;</div><div class='add'>+    conf-&gt;du_stats = GF_CALLOC(conf-&gt;subvolume_cnt, sizeof(dht_du_t),</div><div class='add'>+                               gf_dht_mt_dht_du_t);</div><div class='add'>+    if (!conf-&gt;du_stats) {</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	for (i = 0; i &lt; conf-&gt;subvolume_cnt; i++) {</div><div class='del'>-		if (subvol == conf-&gt;subvolumes[i]) {</div><div class='del'>-			ret = i;</div><div class='del'>-			break;</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='add'>+    conf-&gt;decommissioned_bricks = GF_CALLOC(cnt, sizeof(xlator_t *),</div><div class='add'>+                                            gf_dht_mt_xlator_t);</div><div class='add'>+    if (!conf-&gt;decommissioned_bricks) {</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	return ret;</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+/*</div><div class='add'>+ op_ret values :</div><div class='add'>+  0 : Success.</div><div class='add'>+ -1 : Failure.</div><div class='add'>+  1 : File is being migrated but not by this DHT layer.</div><div class='add'>+*/</div><div class='ctx'> </div><div class='del'>-#define set_if_greater(a, b) do {		\</div><div class='del'>-		if ((a) &lt; (b))			\</div><div class='del'>-			(a) = (b);		\</div><div class='del'>-	} while (0)</div><div class='add'>+static int</div><div class='add'>+dht_migration_complete_check_done(int op_ret, call_frame_t *frame, void *data)</div><div class='add'>+{</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    xlator_t *subvol = NULL;</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+</div><div class='add'>+    if (op_ret != 0)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    if (local-&gt;cached_subvol == NULL) {</div><div class='add'>+        local-&gt;op_errno = EINVAL;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    subvol = local-&gt;cached_subvol;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    local-&gt;rebalance.target_op_fn(THIS, subvol, frame, op_ret);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-dht_iatt_merge (xlator_t *this, struct iatt *to,</div><div class='del'>-		struct iatt *from, xlator_t *subvol)</div><div class='add'>+dht_migration_complete_check_task(void *data)</div><div class='ctx'> {</div><div class='del'>-        if (!from || !to)</div><div class='del'>-                return 0;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    xlator_t *src_node = NULL;</div><div class='add'>+    xlator_t *dst_node = NULL, *linkto_target = NULL;</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    dict_t *dict = NULL;</div><div class='add'>+    struct iatt stbuf = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    xlator_t *this = NULL;</div><div class='add'>+    call_frame_t *frame = NULL;</div><div class='add'>+    loc_t tmp_loc = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    char *path = NULL;</div><div class='add'>+    dht_conf_t *conf = NULL;</div><div class='add'>+    inode_t *inode = NULL;</div><div class='add'>+    fd_t *iter_fd = NULL;</div><div class='add'>+    fd_t *tmp = NULL;</div><div class='add'>+    uint64_t tmp_miginfo = 0;</div><div class='add'>+    dht_migrate_info_t *miginfo = NULL;</div><div class='add'>+    gf_boolean_t skip_open = _gf_false;</div><div class='add'>+    int open_failed = 0;</div><div class='add'>+</div><div class='add'>+    this = THIS;</div><div class='add'>+    frame = data;</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    conf = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    src_node = local-&gt;cached_subvol;</div><div class='add'>+</div><div class='add'>+    if (!local-&gt;loc.inode &amp;&amp; !local-&gt;fd) {</div><div class='add'>+        local-&gt;op_errno = EINVAL;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    inode = (!local-&gt;fd) ? local-&gt;loc.inode : local-&gt;fd-&gt;inode;</div><div class='add'>+</div><div class='add'>+    /* getxattr on cached_subvol for 'linkto' value. Do path based getxattr</div><div class='add'>+     * as root:root. If a fd is already open, access check won't be done*/</div><div class='add'>+</div><div class='add'>+    if (!local-&gt;loc.inode) {</div><div class='add'>+        ret = syncop_fgetxattr(src_node, local-&gt;fd, &amp;dict,</div><div class='add'>+                               conf-&gt;link_xattr_name, NULL, NULL);</div><div class='add'>+    } else {</div><div class='add'>+        SYNCTASK_SETID(0, 0);</div><div class='add'>+        ret = syncop_getxattr(src_node, &amp;local-&gt;loc, &amp;dict,</div><div class='add'>+                              conf-&gt;link_xattr_name, NULL, NULL);</div><div class='add'>+        SYNCTASK_SETID(frame-&gt;root-&gt;uid, frame-&gt;root-&gt;gid);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /*</div><div class='add'>+     * Each DHT xlator layer has its own name for the linkto xattr.</div><div class='add'>+     * If the file mode bits indicate the the file is being migrated but</div><div class='add'>+     * this layer's linkto xattr is not set, it means that another</div><div class='add'>+     * DHT layer is migrating the file. In this case, return 1 so</div><div class='add'>+     * the mode bits can be passed on to the higher layer for appropriate</div><div class='add'>+     * action.</div><div class='add'>+     */</div><div class='add'>+    if (-ret == ENODATA) {</div><div class='add'>+        /* This DHT translator is not migrating this file */</div><div class='add'>+</div><div class='add'>+        ret = inode_ctx_reset1(inode, this, &amp;tmp_miginfo);</div><div class='add'>+        if (tmp_miginfo) {</div><div class='add'>+            /* This can be a problem if the file was</div><div class='add'>+             * migrated by two different layers. Raise</div><div class='add'>+             * a warning here.</div><div class='add'>+             */</div><div class='add'>+            gf_smsg(</div><div class='add'>+                this-&gt;name, GF_LOG_WARNING, 0, DHT_MSG_HAS_MIGINFO, "tmp=%s",</div><div class='add'>+                tmp_loc.path ? tmp_loc.path : uuid_utoa(tmp_loc.gfid), NULL);</div><div class='add'>+</div><div class='add'>+            miginfo = (void *)(uintptr_t)tmp_miginfo;</div><div class='add'>+            GF_REF_PUT(miginfo);</div><div class='add'>+        }</div><div class='add'>+        ret = 1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (!ret)</div><div class='add'>+        linkto_target = dht_linkfile_subvol(this, NULL, NULL, dict);</div><div class='add'>+</div><div class='add'>+    if (local-&gt;loc.inode) {</div><div class='add'>+        loc_copy(&amp;tmp_loc, &amp;local-&gt;loc);</div><div class='add'>+    } else {</div><div class='add'>+        tmp_loc.inode = inode_ref(inode);</div><div class='add'>+        gf_uuid_copy(tmp_loc.gfid, inode-&gt;gfid);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = syncop_lookup(this, &amp;tmp_loc, &amp;stbuf, 0, 0, 0);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_ERROR, -ret, DHT_MSG_FILE_LOOKUP_FAILED,</div><div class='add'>+                "tmp=%s", tmp_loc.path ? tmp_loc.path : uuid_utoa(tmp_loc.gfid),</div><div class='add'>+                "name=%s", this-&gt;name, NULL);</div><div class='add'>+        local-&gt;op_errno = -ret;</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    dst_node = dht_subvol_get_cached(this, tmp_loc.inode);</div><div class='add'>+    if (linkto_target &amp;&amp; dst_node != linkto_target) {</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_WARNING, 0, DHT_MSG_INVALID_LINKFILE,</div><div class='add'>+                "linkto_target_name=%s", linkto_target-&gt;name, "dst_name=%s",</div><div class='add'>+                dst_node-&gt;name, NULL);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (gf_uuid_compare(stbuf.ia_gfid, tmp_loc.inode-&gt;gfid)) {</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_ERROR, 0, DHT_MSG_GFID_MISMATCH, "tmp=%s",</div><div class='add'>+                tmp_loc.path ? tmp_loc.path : uuid_utoa(tmp_loc.gfid),</div><div class='add'>+                "dst_name=%s", dst_node-&gt;name, NULL);</div><div class='add'>+        ret = -1;</div><div class='add'>+        local-&gt;op_errno = EIO;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* update local. A layout is set in inode-ctx in lookup already */</div><div class='add'>+</div><div class='add'>+    dht_layout_unref(this, local-&gt;layout);</div><div class='add'>+</div><div class='add'>+    local-&gt;layout = dht_layout_get(frame-&gt;this, inode);</div><div class='add'>+    local-&gt;cached_subvol = dst_node;</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+</div><div class='add'>+    /* once we detect the migration complete, the inode-ctx2 is no more</div><div class='add'>+       required.. delete the ctx and also, it means, open() already</div><div class='add'>+       done on all the fd of inode */</div><div class='add'>+    ret = inode_ctx_reset1(inode, this, &amp;tmp_miginfo);</div><div class='add'>+    if (tmp_miginfo) {</div><div class='add'>+        miginfo = (void *)(uintptr_t)tmp_miginfo;</div><div class='add'>+        GF_REF_PUT(miginfo);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* perform 'open()' on all the fd's present on the inode */</div><div class='add'>+    if (tmp_loc.path == NULL) {</div><div class='add'>+        inode_path(inode, NULL, &amp;path);</div><div class='add'>+        if (path)</div><div class='add'>+            tmp_loc.path = path;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;inode-&gt;lock);</div><div class='add'>+</div><div class='add'>+    if (list_empty(&amp;inode-&gt;fd_list))</div><div class='add'>+        goto unlock;</div><div class='add'>+</div><div class='add'>+    /* perform open as root:root. There is window between linkfile</div><div class='add'>+     * creation(root:root) and setattr with the correct uid/gid</div><div class='add'>+     */</div><div class='add'>+    SYNCTASK_SETID(0, 0);</div><div class='add'>+</div><div class='add'>+    /* It's possible that we are the last user of iter_fd after each</div><div class='add'>+     * iteration. In this case the fd_unref() of iter_fd at the end of</div><div class='add'>+     * the loop will cause the destruction of the fd. So we need to</div><div class='add'>+     * iterate the list safely because iter_fd cannot be trusted.</div><div class='add'>+     */</div><div class='add'>+    iter_fd = list_entry((&amp;inode-&gt;fd_list)-&gt;next, typeof(*iter_fd), inode_list);</div><div class='add'>+    while (&amp;iter_fd-&gt;inode_list != (&amp;inode-&gt;fd_list)) {</div><div class='add'>+        if (fd_is_anonymous(iter_fd) ||</div><div class='add'>+            (dht_fd_open_on_dst(this, iter_fd, dst_node))) {</div><div class='add'>+            if (!tmp) {</div><div class='add'>+                iter_fd = list_entry(iter_fd-&gt;inode_list.next, typeof(*iter_fd),</div><div class='add'>+                                     inode_list);</div><div class='add'>+                continue;</div><div class='add'>+            }</div><div class='add'>+            skip_open = _gf_true;</div><div class='add'>+        }</div><div class='add'>+        /* We need to release the inode-&gt;lock before calling</div><div class='add'>+         * syncop_open() to avoid possible deadlocks. However this</div><div class='add'>+         * can cause the iter_fd to be released by other threads.</div><div class='add'>+         * To avoid this, we take a reference before releasing the</div><div class='add'>+         * lock.</div><div class='add'>+         */</div><div class='add'>+        fd_ref(iter_fd);</div><div class='add'>+</div><div class='add'>+        UNLOCK(&amp;inode-&gt;lock);</div><div class='add'>+</div><div class='add'>+        if (tmp) {</div><div class='add'>+            fd_unref(tmp);</div><div class='add'>+            tmp = NULL;</div><div class='add'>+        }</div><div class='add'>+        if (skip_open)</div><div class='add'>+            goto next;</div><div class='add'>+</div><div class='add'>+        /* flags for open are stripped down to allow following the</div><div class='add'>+         * new location of the file, otherwise we can get EEXIST or</div><div class='add'>+         * truncate the file again as rebalance is moving the data */</div><div class='add'>+        ret = syncop_open(dst_node, &amp;tmp_loc,</div><div class='add'>+                          (iter_fd-&gt;flags &amp; ~(O_CREAT | O_EXCL | O_TRUNC)),</div><div class='add'>+                          iter_fd, NULL, NULL);</div><div class='add'>+        if (ret &lt; 0) {</div><div class='add'>+            gf_smsg(this-&gt;name, GF_LOG_ERROR, -ret,</div><div class='add'>+                    DHT_MSG_OPEN_FD_ON_DST_FAILED, "id=%p", iter_fd,</div><div class='add'>+                    "flags=0%o", iter_fd-&gt;flags, "path=%s", path, "name=%s",</div><div class='add'>+                    dst_node-&gt;name, NULL);</div><div class='add'>+</div><div class='add'>+            open_failed = 1;</div><div class='add'>+            local-&gt;op_errno = -ret;</div><div class='add'>+            ret = -1;</div><div class='add'>+        } else {</div><div class='add'>+            dht_fd_ctx_set(this, iter_fd, dst_node);</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-	to-&gt;ia_dev      = from-&gt;ia_dev;</div><div class='add'>+    next:</div><div class='add'>+        LOCK(&amp;inode-&gt;lock);</div><div class='add'>+        skip_open = _gf_false;</div><div class='add'>+        tmp = iter_fd;</div><div class='add'>+        iter_fd = list_entry(tmp-&gt;inode_list.next, typeof(*tmp), inode_list);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        uuid_copy (to-&gt;ia_gfid, from-&gt;ia_gfid);</div><div class='add'>+    SYNCTASK_SETID(frame-&gt;root-&gt;uid, frame-&gt;root-&gt;gid);</div><div class='ctx'> </div><div class='del'>-	dht_itransform (this, subvol, from-&gt;ia_ino, &amp;to-&gt;ia_ino);</div><div class='del'>-        to-&gt;ia_gen      = from-&gt;ia_gen;</div><div class='add'>+    if (open_failed) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto unlock;</div><div class='add'>+    }</div><div class='add'>+    ret = 0;</div><div class='ctx'> </div><div class='del'>-	to-&gt;ia_prot     = from-&gt;ia_prot;</div><div class='del'>-	to-&gt;ia_type     = from-&gt;ia_type;</div><div class='del'>-	to-&gt;ia_nlink    = from-&gt;ia_nlink;</div><div class='del'>-	to-&gt;ia_rdev     = from-&gt;ia_rdev;</div><div class='del'>-	to-&gt;ia_size    += from-&gt;ia_size;</div><div class='del'>-	to-&gt;ia_blksize  = from-&gt;ia_blksize;</div><div class='del'>-	to-&gt;ia_blocks  += from-&gt;ia_blocks;</div><div class='add'>+unlock:</div><div class='add'>+    UNLOCK(&amp;inode-&gt;lock);</div><div class='add'>+    if (tmp) {</div><div class='add'>+        fd_unref(tmp);</div><div class='add'>+        tmp = NULL;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	set_if_greater (to-&gt;ia_uid, from-&gt;ia_uid);</div><div class='del'>-	set_if_greater (to-&gt;ia_gid, from-&gt;ia_gid);</div><div class='add'>+out:</div><div class='add'>+    if (dict) {</div><div class='add'>+        dict_unref(dict);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	set_if_greater (to-&gt;ia_atime, from-&gt;ia_atime);</div><div class='del'>-	set_if_greater (to-&gt;ia_mtime, from-&gt;ia_mtime);</div><div class='del'>-	set_if_greater (to-&gt;ia_ctime, from-&gt;ia_ctime);</div><div class='add'>+    loc_wipe(&amp;tmp_loc);</div><div class='ctx'> </div><div class='del'>-	return 0;</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-dht_frame_su_do (call_frame_t *frame)</div><div class='add'>+dht_rebalance_complete_check(xlator_t *this, call_frame_t *frame)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    ret = synctask_new(this-&gt;ctx-&gt;env, dht_migration_complete_check_task,</div><div class='add'>+                       dht_migration_complete_check_done, frame, frame);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* During 'in-progress' state, both nodes should have the file */</div><div class='add'>+/*</div><div class='add'>+ op_ret values :</div><div class='add'>+  0 : Success</div><div class='add'>+ -1 : Failure.</div><div class='add'>+  1 : File is being migrated but not by this DHT layer.</div><div class='add'>+*/</div><div class='add'>+static int</div><div class='add'>+dht_inprogress_check_done(int op_ret, call_frame_t *frame, void *data)</div><div class='ctx'> {</div><div class='del'>-        dht_local_t     *local = NULL;</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    xlator_t *dst_subvol = NULL, *src_subvol = NULL;</div><div class='add'>+    inode_t *inode = NULL;</div><div class='ctx'> </div><div class='del'>-        local = frame-&gt;local;</div><div class='add'>+    local = frame-&gt;local;</div><div class='ctx'> </div><div class='del'>-        local-&gt;uid = frame-&gt;root-&gt;uid;</div><div class='del'>-        local-&gt;gid = frame-&gt;root-&gt;gid;</div><div class='add'>+    if (op_ret != 0)</div><div class='add'>+        goto out;</div><div class='ctx'> </div><div class='del'>-        frame-&gt;root-&gt;uid = 0;</div><div class='del'>-        frame-&gt;root-&gt;gid = 0;</div><div class='add'>+    inode = local-&gt;loc.inode ? local-&gt;loc.inode : local-&gt;fd-&gt;inode;</div><div class='ctx'> </div><div class='del'>-        return 0;</div><div class='add'>+    dht_inode_ctx_get_mig_info(THIS, inode, &amp;src_subvol, &amp;dst_subvol);</div><div class='add'>+    if (dht_mig_info_is_invalid(local-&gt;cached_subvol, src_subvol, dst_subvol)) {</div><div class='add'>+        dst_subvol = dht_subvol_get_cached(THIS, inode);</div><div class='add'>+        if (!dst_subvol) {</div><div class='add'>+            local-&gt;op_errno = EINVAL;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    local-&gt;rebalance.target_op_fn(THIS, dst_subvol, frame, op_ret);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+static int</div><div class='add'>+dht_rebalance_inprogress_task(void *data)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    xlator_t *src_node = NULL;</div><div class='add'>+    xlator_t *dst_node = NULL;</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    dict_t *dict = NULL;</div><div class='add'>+    call_frame_t *frame = NULL;</div><div class='add'>+    xlator_t *this = NULL;</div><div class='add'>+    char *path = NULL;</div><div class='add'>+    struct iatt stbuf = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    loc_t tmp_loc = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    dht_conf_t *conf = NULL;</div><div class='add'>+    inode_t *inode = NULL;</div><div class='add'>+    fd_t *iter_fd = NULL;</div><div class='add'>+    fd_t *tmp = NULL;</div><div class='add'>+    int open_failed = 0;</div><div class='add'>+    uint64_t tmp_miginfo = 0;</div><div class='add'>+    dht_migrate_info_t *miginfo = NULL;</div><div class='add'>+    gf_boolean_t skip_open = _gf_false;</div><div class='add'>+</div><div class='add'>+    this = THIS;</div><div class='add'>+    frame = data;</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    conf = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    src_node = local-&gt;cached_subvol;</div><div class='add'>+</div><div class='add'>+    if (!local-&gt;loc.inode &amp;&amp; !local-&gt;fd)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    inode = (!local-&gt;fd) ? local-&gt;loc.inode : local-&gt;fd-&gt;inode;</div><div class='add'>+</div><div class='add'>+    /* getxattr on cached_subvol for 'linkto' value. Do path based getxattr</div><div class='add'>+     * as root:root. If a fd is already open, access check won't be done*/</div><div class='add'>+    if (local-&gt;loc.inode) {</div><div class='add'>+        SYNCTASK_SETID(0, 0);</div><div class='add'>+        ret = syncop_getxattr(src_node, &amp;local-&gt;loc, &amp;dict,</div><div class='add'>+                              conf-&gt;link_xattr_name, NULL, NULL);</div><div class='add'>+        SYNCTASK_SETID(frame-&gt;root-&gt;uid, frame-&gt;root-&gt;gid);</div><div class='add'>+    } else {</div><div class='add'>+        ret = syncop_fgetxattr(src_node, local-&gt;fd, &amp;dict,</div><div class='add'>+                               conf-&gt;link_xattr_name, NULL, NULL);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /*</div><div class='add'>+     * Each DHT xlator layer has its own name for the linkto xattr.</div><div class='add'>+     * If the file mode bits indicate the the file is being migrated but</div><div class='add'>+     * this layer's linkto xattr is not present, it means that another</div><div class='add'>+     * DHT layer is migrating the file. In this case, return 1 so</div><div class='add'>+     * the mode bits can be passed on to the higher layer for appropriate</div><div class='add'>+     * action.</div><div class='add'>+     */</div><div class='add'>+</div><div class='add'>+    if (-ret == ENODATA) {</div><div class='add'>+        /* This DHT layer is not migrating this file */</div><div class='add'>+        ret = inode_ctx_reset1(inode, this, &amp;tmp_miginfo);</div><div class='add'>+        if (tmp_miginfo) {</div><div class='add'>+            /* This can be a problem if the file was</div><div class='add'>+             * migrated by two different layers. Raise</div><div class='add'>+             * a warning here.</div><div class='add'>+             */</div><div class='add'>+            gf_smsg(</div><div class='add'>+                this-&gt;name, GF_LOG_WARNING, 0, DHT_MSG_HAS_MIGINFO, "tmp=%s",</div><div class='add'>+                tmp_loc.path ? tmp_loc.path : uuid_utoa(tmp_loc.gfid), NULL);</div><div class='add'>+            miginfo = (void *)(uintptr_t)tmp_miginfo;</div><div class='add'>+            GF_REF_PUT(miginfo);</div><div class='add'>+        }</div><div class='add'>+        ret = 1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_ERROR, -ret, DHT_MSG_GET_XATTR_FAILED,</div><div class='add'>+                "path=%s", local-&gt;loc.path, NULL);</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    dst_node = dht_linkfile_subvol(this, NULL, NULL, dict);</div><div class='add'>+    if (!dst_node) {</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_ERROR, 0, DHT_MSG_GET_XATTR_FAILED,</div><div class='add'>+                "path=%s", local-&gt;loc.path, NULL);</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    local-&gt;rebalance.target_node = dst_node;</div><div class='add'>+</div><div class='add'>+    if (local-&gt;loc.inode) {</div><div class='add'>+        loc_copy(&amp;tmp_loc, &amp;local-&gt;loc);</div><div class='add'>+    } else {</div><div class='add'>+        tmp_loc.inode = inode_ref(inode);</div><div class='add'>+        gf_uuid_copy(tmp_loc.gfid, inode-&gt;gfid);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* lookup on dst */</div><div class='add'>+    ret = syncop_lookup(dst_node, &amp;tmp_loc, &amp;stbuf, NULL, NULL, NULL);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_ERROR, -ret, DHT_MSG_FILE_LOOKUP_FAILED,</div><div class='add'>+                "tmp=%s", tmp_loc.path ? tmp_loc.path : uuid_utoa(tmp_loc.gfid),</div><div class='add'>+                "name=%s", dst_node-&gt;name, NULL);</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (gf_uuid_compare(stbuf.ia_gfid, tmp_loc.inode-&gt;gfid)) {</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_ERROR, 0, DHT_MSG_GFID_MISMATCH, "tmp=%s",</div><div class='add'>+                tmp_loc.path ? tmp_loc.path : uuid_utoa(tmp_loc.gfid),</div><div class='add'>+                "name=%s", dst_node-&gt;name, NULL);</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    ret = 0;</div><div class='add'>+</div><div class='add'>+    if (tmp_loc.path == NULL) {</div><div class='add'>+        inode_path(inode, NULL, &amp;path);</div><div class='add'>+        if (path)</div><div class='add'>+            tmp_loc.path = path;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;inode-&gt;lock);</div><div class='add'>+</div><div class='add'>+    if (list_empty(&amp;inode-&gt;fd_list))</div><div class='add'>+        goto unlock;</div><div class='add'>+</div><div class='add'>+    /* perform open as root:root. There is window between linkfile</div><div class='add'>+     * creation(root:root) and setattr with the correct uid/gid</div><div class='add'>+     */</div><div class='add'>+    SYNCTASK_SETID(0, 0);</div><div class='add'>+</div><div class='add'>+    /* It's possible that we are the last user of iter_fd after each</div><div class='add'>+     * iteration. In this case the fd_unref() of iter_fd at the end of</div><div class='add'>+     * the loop will cause the destruction of the fd. So we need to</div><div class='add'>+     * iterate the list safely because iter_fd cannot be trusted.</div><div class='add'>+     */</div><div class='add'>+    iter_fd = list_entry((&amp;inode-&gt;fd_list)-&gt;next, typeof(*iter_fd), inode_list);</div><div class='add'>+    while (&amp;iter_fd-&gt;inode_list != (&amp;inode-&gt;fd_list)) {</div><div class='add'>+        /* We need to release the inode-&gt;lock before calling</div><div class='add'>+         * syncop_open() to avoid possible deadlocks. However this</div><div class='add'>+         * can cause the iter_fd to be released by other threads.</div><div class='add'>+         * To avoid this, we take a reference before releasing the</div><div class='add'>+         * lock.</div><div class='add'>+         */</div><div class='add'>+</div><div class='add'>+        if (fd_is_anonymous(iter_fd) ||</div><div class='add'>+            (dht_fd_open_on_dst(this, iter_fd, dst_node))) {</div><div class='add'>+            if (!tmp) {</div><div class='add'>+                iter_fd = list_entry(iter_fd-&gt;inode_list.next, typeof(*iter_fd),</div><div class='add'>+                                     inode_list);</div><div class='add'>+                continue;</div><div class='add'>+            }</div><div class='add'>+            skip_open = _gf_true;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        /* Yes, this is ugly but there isn't a cleaner way to do this</div><div class='add'>+         * the fd_ref is an atomic increment so not too bad. We want to</div><div class='add'>+         * reduce the number of inode locks and unlocks.</div><div class='add'>+         */</div><div class='add'>+</div><div class='add'>+        fd_ref(iter_fd);</div><div class='add'>+        UNLOCK(&amp;inode-&gt;lock);</div><div class='add'>+</div><div class='add'>+        if (tmp) {</div><div class='add'>+            fd_unref(tmp);</div><div class='add'>+            tmp = NULL;</div><div class='add'>+        }</div><div class='add'>+        if (skip_open)</div><div class='add'>+            goto next;</div><div class='add'>+</div><div class='add'>+        /* flags for open are stripped down to allow following the</div><div class='add'>+         * new location of the file, otherwise we can get EEXIST or</div><div class='add'>+         * truncate the file again as rebalance is moving the data */</div><div class='add'>+        ret = syncop_open(dst_node, &amp;tmp_loc,</div><div class='add'>+                          (iter_fd-&gt;flags &amp; ~(O_CREAT | O_EXCL | O_TRUNC)),</div><div class='add'>+                          iter_fd, NULL, NULL);</div><div class='add'>+        if (ret &lt; 0) {</div><div class='add'>+            gf_smsg(this-&gt;name, GF_LOG_ERROR, -ret,</div><div class='add'>+                    DHT_MSG_OPEN_FD_ON_DST_FAILED, "fd=%p", iter_fd,</div><div class='add'>+                    "flags=0%o", iter_fd-&gt;flags, "path=%s", path, "name=%s",</div><div class='add'>+                    dst_node-&gt;name, NULL);</div><div class='add'>+            ret = -1;</div><div class='add'>+            open_failed = 1;</div><div class='add'>+        } else {</div><div class='add'>+            /* Potential fd leak if this fails here as it will be</div><div class='add'>+               reopened at the next Phase1/2 check */</div><div class='add'>+            dht_fd_ctx_set(this, iter_fd, dst_node);</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+    next:</div><div class='add'>+        LOCK(&amp;inode-&gt;lock);</div><div class='add'>+        skip_open = _gf_false;</div><div class='add'>+        tmp = iter_fd;</div><div class='add'>+        iter_fd = list_entry(tmp-&gt;inode_list.next, typeof(*tmp), inode_list);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    SYNCTASK_SETID(frame-&gt;root-&gt;uid, frame-&gt;root-&gt;gid);</div><div class='add'>+</div><div class='add'>+unlock:</div><div class='add'>+    UNLOCK(&amp;inode-&gt;lock);</div><div class='add'>+</div><div class='add'>+    if (tmp) {</div><div class='add'>+        fd_unref(tmp);</div><div class='add'>+        tmp = NULL;</div><div class='add'>+    }</div><div class='add'>+    if (open_failed) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dht_inode_ctx_set_mig_info(this, inode, src_node, dst_node);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_ERROR, 0, DHT_MSG_SET_INODE_CTX_FAILED,</div><div class='add'>+                "path=%s", local-&gt;loc.path, "name=%s", dst_node-&gt;name, NULL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+out:</div><div class='add'>+    if (dict) {</div><div class='add'>+        dict_unref(dict);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    loc_wipe(&amp;tmp_loc);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-dht_frame_su_undo (call_frame_t *frame)</div><div class='add'>+dht_rebalance_in_progress_check(xlator_t *this, call_frame_t *frame)</div><div class='ctx'> {</div><div class='del'>-        dht_local_t     *local = NULL;</div><div class='add'>+    int ret = -1;</div><div class='ctx'> </div><div class='del'>-        local = frame-&gt;local;</div><div class='add'>+    ret = synctask_new(this-&gt;ctx-&gt;env, dht_rebalance_inprogress_task,</div><div class='add'>+                       dht_inprogress_check_done, frame, frame);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        frame-&gt;root-&gt;uid = local-&gt;uid;</div><div class='del'>-        frame-&gt;root-&gt;gid = local-&gt;gid;</div><div class='add'>+int</div><div class='add'>+dht_inode_ctx_layout_set(inode_t *inode, xlator_t *this,</div><div class='add'>+                         dht_layout_t *layout_int)</div><div class='add'>+{</div><div class='add'>+    dht_inode_ctx_t *ctx = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    ret = dht_inode_ctx_get(inode, this, &amp;ctx);</div><div class='add'>+    if (!ret &amp;&amp; ctx) {</div><div class='add'>+        ctx-&gt;layout = layout_int;</div><div class='add'>+    } else {</div><div class='add'>+        ctx = GF_CALLOC(1, sizeof(*ctx), gf_dht_mt_inode_ctx_t);</div><div class='add'>+        if (!ctx)</div><div class='add'>+            return ret;</div><div class='add'>+        ctx-&gt;layout = layout_int;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dht_inode_ctx_set(inode, this, ctx);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        return 0;</div><div class='add'>+void</div><div class='add'>+dht_inode_ctx_time_set(inode_t *inode, xlator_t *this, struct iatt *stat)</div><div class='add'>+{</div><div class='add'>+    dht_inode_ctx_t *ctx = NULL;</div><div class='add'>+    dht_stat_time_t *time = 0;</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    ret = dht_inode_ctx_get(inode, this, &amp;ctx);</div><div class='add'>+</div><div class='add'>+    if (ret)</div><div class='add'>+        return;</div><div class='add'>+</div><div class='add'>+    time = &amp;ctx-&gt;time;</div><div class='add'>+</div><div class='add'>+    time-&gt;mtime = stat-&gt;ia_mtime;</div><div class='add'>+    time-&gt;mtime_nsec = stat-&gt;ia_mtime_nsec;</div><div class='add'>+</div><div class='add'>+    time-&gt;ctime = stat-&gt;ia_ctime;</div><div class='add'>+    time-&gt;ctime_nsec = stat-&gt;ia_ctime_nsec;</div><div class='add'>+</div><div class='add'>+    time-&gt;atime = stat-&gt;ia_atime;</div><div class='add'>+    time-&gt;atime_nsec = stat-&gt;ia_atime_nsec;</div><div class='add'>+</div><div class='add'>+    return;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+dht_inode_ctx_time_update(inode_t *inode, xlator_t *this, struct iatt *stat,</div><div class='add'>+                          int32_t post)</div><div class='add'>+{</div><div class='add'>+    dht_inode_ctx_t *ctx = NULL;</div><div class='add'>+    dht_stat_time_t *time = 0;</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, stat, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, inode, out);</div><div class='add'>+</div><div class='add'>+    ret = dht_inode_ctx_get(inode, this, &amp;ctx);</div><div class='add'>+</div><div class='add'>+    if (ret) {</div><div class='add'>+        ctx = GF_CALLOC(1, sizeof(*ctx), gf_dht_mt_inode_ctx_t);</div><div class='add'>+        if (!ctx)</div><div class='add'>+            return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    time = &amp;ctx-&gt;time;</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;inode-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        DHT_UPDATE_TIME(time-&gt;mtime, time-&gt;mtime_nsec, stat-&gt;ia_mtime,</div><div class='add'>+                        stat-&gt;ia_mtime_nsec, post);</div><div class='add'>+        DHT_UPDATE_TIME(time-&gt;ctime, time-&gt;ctime_nsec, stat-&gt;ia_ctime,</div><div class='add'>+                        stat-&gt;ia_ctime_nsec, post);</div><div class='add'>+        DHT_UPDATE_TIME(time-&gt;atime, time-&gt;atime_nsec, stat-&gt;ia_atime,</div><div class='add'>+                        stat-&gt;ia_atime_nsec, post);</div><div class='add'>+    }</div><div class='add'>+    UNLOCK(&amp;inode-&gt;lock);</div><div class='add'>+</div><div class='add'>+    ret = dht_inode_ctx_set(inode, this, ctx);</div><div class='add'>+out:</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+dht_inode_ctx_get(inode_t *inode, xlator_t *this, dht_inode_ctx_t **ctx)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    uint64_t ctx_int = 0;</div><div class='add'>+</div><div class='add'>+    GF_VALIDATE_OR_GOTO("dht", this, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, inode, out);</div><div class='add'>+</div><div class='add'>+    ret = inode_ctx_get(inode, this, &amp;ctx_int);</div><div class='add'>+</div><div class='add'>+    if (ret)</div><div class='add'>+        return ret;</div><div class='add'>+</div><div class='add'>+    if (ctx)</div><div class='add'>+        *ctx = (dht_inode_ctx_t *)(uintptr_t)ctx_int;</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+int</div><div class='add'>+dht_inode_ctx_set(inode_t *inode, xlator_t *this, dht_inode_ctx_t *ctx)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    uint64_t ctx_int = 0;</div><div class='add'>+</div><div class='add'>+    GF_VALIDATE_OR_GOTO("dht", this, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, inode, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, ctx, out);</div><div class='add'>+</div><div class='add'>+    ctx_int = (long)ctx;</div><div class='add'>+    ret = inode_ctx_set(inode, this, &amp;ctx_int);</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-dht_build_child_loc (xlator_t *this, loc_t *child, loc_t *parent, char *name)</div><div class='add'>+dht_subvol_status(dht_conf_t *conf, xlator_t *subvol)</div><div class='add'>+{</div><div class='add'>+    int i;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; conf-&gt;subvolume_cnt; i++) {</div><div class='add'>+        if (conf-&gt;subvolumes[i] == subvol) {</div><div class='add'>+            return conf-&gt;subvolume_status[i];</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+inode_t *</div><div class='add'>+dht_heal_path(xlator_t *this, char *path, inode_table_t *itable)</div><div class='ctx'> {</div><div class='del'>-        if (!child) {</div><div class='del'>-                goto err;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    struct iatt iatt = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    inode_t *linked_inode = NULL;</div><div class='add'>+    loc_t loc = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    char *bname = NULL;</div><div class='add'>+    char *save_ptr = NULL;</div><div class='add'>+    static uuid_t gfid = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1};</div><div class='add'>+    char *tmp_path = NULL;</div><div class='add'>+</div><div class='add'>+    tmp_path = gf_strdup(path);</div><div class='add'>+    if (!tmp_path) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    gf_uuid_copy(loc.pargfid, gfid);</div><div class='add'>+    loc.parent = inode_ref(itable-&gt;root);</div><div class='add'>+</div><div class='add'>+    bname = strtok_r(tmp_path, "/", &amp;save_ptr);</div><div class='add'>+</div><div class='add'>+    /* sending a lookup on parent directory,</div><div class='add'>+     * Eg:  if  path is like /a/b/c/d/e/f/g/</div><div class='add'>+     * then we will send a lookup on a first and then b,c,d,etc</div><div class='add'>+     */</div><div class='add'>+</div><div class='add'>+    while (bname) {</div><div class='add'>+        linked_inode = NULL;</div><div class='add'>+        loc.inode = inode_grep(itable, loc.parent, bname);</div><div class='add'>+        if (loc.inode == NULL) {</div><div class='add'>+            loc.inode = inode_new(itable);</div><div class='add'>+            if (loc.inode == NULL) {</div><div class='add'>+                ret = -ENOMEM;</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+        } else {</div><div class='add'>+            /*</div><div class='add'>+             * Inode is already populated in the inode table.</div><div class='add'>+             * Which means we already looked up the inode and</div><div class='add'>+             * linked with a dentry. So that we will skip</div><div class='add'>+             * lookup on this entry, and proceed to next.</div><div class='add'>+             */</div><div class='add'>+            linked_inode = loc.inode;</div><div class='add'>+            bname = strtok_r(NULL, "/", &amp;save_ptr);</div><div class='add'>+            if (!bname) {</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+            inode_unref(loc.parent);</div><div class='add'>+            loc.parent = loc.inode;</div><div class='add'>+            gf_uuid_copy(loc.pargfid, loc.inode-&gt;gfid);</div><div class='add'>+            loc.inode = NULL;</div><div class='add'>+            continue;</div><div class='ctx'>         }</div><div class='ctx'> </div><div class='del'>-        if (strcmp (parent-&gt;path, "/") == 0)</div><div class='del'>-                gf_asprintf ((char **)&amp;child-&gt;path, "/%s", name);</div><div class='del'>-        else</div><div class='del'>-                gf_asprintf ((char **)&amp;child-&gt;path, "%s/%s", parent-&gt;path, name);</div><div class='add'>+        loc.name = bname;</div><div class='add'>+        ret = loc_path(&amp;loc, bname);</div><div class='ctx'> </div><div class='del'>-        if (!child-&gt;path) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-                        "Out of memory");</div><div class='del'>-                goto err;</div><div class='add'>+        ret = syncop_lookup(this, &amp;loc, &amp;iatt, NULL, NULL, NULL);</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_smsg(this-&gt;name, GF_LOG_INFO, -ret, DHT_MSG_DIR_SELFHEAL_FAILED,</div><div class='add'>+                    "path=%s", path, "subvolume=%s", this-&gt;name, "bname=%s",</div><div class='add'>+                    bname, NULL);</div><div class='add'>+            goto out;</div><div class='ctx'>         }</div><div class='ctx'> </div><div class='del'>-        child-&gt;name = strrchr (child-&gt;path, '/');</div><div class='del'>-        if (child-&gt;name)</div><div class='del'>-                child-&gt;name++;</div><div class='add'>+        linked_inode = inode_link(loc.inode, loc.parent, bname, &amp;iatt);</div><div class='add'>+        if (!linked_inode)</div><div class='add'>+            goto out;</div><div class='add'>+</div><div class='add'>+        loc_wipe(&amp;loc);</div><div class='add'>+        gf_uuid_copy(loc.pargfid, linked_inode-&gt;gfid);</div><div class='add'>+        loc.inode = NULL;</div><div class='add'>+</div><div class='add'>+        bname = strtok_r(NULL, "/", &amp;save_ptr);</div><div class='add'>+        if (bname)</div><div class='add'>+            loc.parent = linked_inode;</div><div class='add'>+    }</div><div class='add'>+out:</div><div class='add'>+    inode_ref(linked_inode);</div><div class='add'>+    loc_wipe(&amp;loc);</div><div class='add'>+    GF_FREE(tmp_path);</div><div class='ctx'> </div><div class='del'>-        child-&gt;parent = inode_ref (parent-&gt;inode);</div><div class='del'>-        child-&gt;inode = inode_new (parent-&gt;inode-&gt;table);</div><div class='add'>+    return linked_inode;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        if (!child-&gt;inode) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-                        "Out of memory");</div><div class='del'>-                goto err;</div><div class='add'>+int</div><div class='add'>+dht_heal_full_path(void *data)</div><div class='add'>+{</div><div class='add'>+    call_frame_t *heal_frame = data;</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    loc_t loc = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    dict_t *dict = NULL;</div><div class='add'>+    char *path = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    xlator_t *source = NULL;</div><div class='add'>+    xlator_t *this = NULL;</div><div class='add'>+    inode_table_t *itable = NULL;</div><div class='add'>+    inode_t *inode = NULL;</div><div class='add'>+    inode_t *tmp_inode = NULL;</div><div class='add'>+</div><div class='add'>+    GF_VALIDATE_OR_GOTO("DHT", heal_frame, out);</div><div class='add'>+</div><div class='add'>+    local = heal_frame-&gt;local;</div><div class='add'>+    this = heal_frame-&gt;this;</div><div class='add'>+    source = heal_frame-&gt;cookie;</div><div class='add'>+    heal_frame-&gt;cookie = NULL;</div><div class='add'>+    gf_uuid_copy(loc.gfid, local-&gt;gfid);</div><div class='add'>+</div><div class='add'>+    if (local-&gt;loc.inode)</div><div class='add'>+        loc.inode = inode_ref(local-&gt;loc.inode);</div><div class='add'>+    else</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    itable = loc.inode-&gt;table;</div><div class='add'>+    ret = syncop_getxattr(source, &amp;loc, &amp;dict, GET_ANCESTRY_PATH_KEY, NULL,</div><div class='add'>+                          NULL);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_INFO, -ret, DHT_MSG_DIR_HEAL_ABORT,</div><div class='add'>+                "subvol=%s", source-&gt;name, NULL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_get_str(dict, GET_ANCESTRY_PATH_KEY, &amp;path);</div><div class='add'>+    if (path) {</div><div class='add'>+        inode = dht_heal_path(this, path, itable);</div><div class='add'>+        if (inode &amp;&amp; inode != local-&gt;inode) {</div><div class='add'>+            /*</div><div class='add'>+             * if inode returned by heal function is different</div><div class='add'>+             * from what we passed, which means a racing thread</div><div class='add'>+             * already linked a different inode for dentry.</div><div class='add'>+             * So we will update our local-&gt;inode, so that we can</div><div class='add'>+             * retrurn proper inode.</div><div class='add'>+             */</div><div class='add'>+            tmp_inode = local-&gt;inode;</div><div class='add'>+            local-&gt;inode = inode;</div><div class='add'>+            inode_unref(tmp_inode);</div><div class='add'>+            tmp_inode = NULL;</div><div class='add'>+        } else {</div><div class='add'>+            inode_unref(inode);</div><div class='ctx'>         }</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        return 0;</div><div class='del'>-err:</div><div class='del'>-        loc_wipe (child);</div><div class='add'>+out:</div><div class='add'>+    loc_wipe(&amp;loc);</div><div class='add'>+    if (dict)</div><div class='add'>+        dict_unref(dict);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+dht_heal_full_path_done(int op_ret, call_frame_t *heal_frame, void *data)</div><div class='add'>+{</div><div class='add'>+    call_frame_t *main_frame = NULL;</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    xlator_t *this = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int op_errno = 0;</div><div class='add'>+</div><div class='add'>+    local = heal_frame-&gt;local;</div><div class='add'>+    main_frame = local-&gt;main_frame;</div><div class='add'>+    local-&gt;main_frame = NULL;</div><div class='add'>+    this = heal_frame-&gt;this;</div><div class='add'>+</div><div class='add'>+    dht_set_fixed_dir_stat(&amp;local-&gt;postparent);</div><div class='add'>+    if (local-&gt;need_xattr_heal) {</div><div class='add'>+        local-&gt;need_xattr_heal = 0;</div><div class='add'>+        ret = dht_dir_xattr_heal(this, local, &amp;op_errno);</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_smsg(this-&gt;name, GF_LOG_ERROR, op_errno,</div><div class='add'>+                    DHT_MSG_DIR_XATTR_HEAL_FAILED, "path=%s", local-&gt;loc.path,</div><div class='add'>+                    NULL);</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    DHT_STACK_UNWIND(lookup, main_frame, 0, 0, local-&gt;inode, &amp;local-&gt;stbuf,</div><div class='add'>+                     local-&gt;xattr, &amp;local-&gt;postparent);</div><div class='add'>+</div><div class='add'>+    DHT_STACK_DESTROY(heal_frame);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* This function must be called inside an inode lock */</div><div class='add'>+int</div><div class='add'>+__dht_lock_subvol_set(inode_t *inode, xlator_t *this, xlator_t *lock_subvol)</div><div class='add'>+{</div><div class='add'>+    dht_inode_ctx_t *ctx = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    uint64_t value = 0;</div><div class='add'>+</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, inode, out);</div><div class='add'>+</div><div class='add'>+    ret = __inode_ctx_get0(inode, this, &amp;value);</div><div class='add'>+    if (ret || !value) {</div><div class='ctx'>         return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ctx = (dht_inode_ctx_t *)(uintptr_t)value;</div><div class='add'>+    ctx-&gt;lock_subvol = lock_subvol;</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+xlator_t *</div><div class='add'>+dht_get_lock_subvolume(xlator_t *this, struct gf_flock *lock,</div><div class='add'>+                       dht_local_t *local)</div><div class='add'>+{</div><div class='add'>+    xlator_t *subvol = NULL;</div><div class='add'>+    inode_t *inode = NULL;</div><div class='add'>+    int32_t ret = -1;</div><div class='add'>+    uint64_t value = 0;</div><div class='add'>+    xlator_t *cached_subvol = NULL;</div><div class='add'>+    dht_inode_ctx_t *ctx = NULL;</div><div class='add'>+    char gfid[GF_UUID_BUF_SIZE] = {0};</div><div class='add'>+</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, lock, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, local, out);</div><div class='add'>+</div><div class='add'>+    cached_subvol = local-&gt;cached_subvol;</div><div class='add'>+</div><div class='add'>+    if (local-&gt;loc.inode || local-&gt;fd) {</div><div class='add'>+        inode = local-&gt;loc.inode ? local-&gt;loc.inode : local-&gt;fd-&gt;inode;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (!inode)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    if (!(IA_ISDIR(inode-&gt;ia_type) || IA_ISINVAL(inode-&gt;ia_type))) {</div><div class='add'>+        /*</div><div class='add'>+         * We may get non-linked inode for directories as part</div><div class='add'>+         * of the selfheal code path. So checking  for IA_INVAL</div><div class='add'>+         * type also. This will only happen for directory.</div><div class='add'>+         */</div><div class='add'>+        subvol = local-&gt;cached_subvol;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (lock-&gt;l_type != F_UNLCK) {</div><div class='add'>+        /*</div><div class='add'>+         * inode purging might happen on NFS between a lk</div><div class='add'>+         * and unlk. Due to this lk and unlk might be sent</div><div class='add'>+         * to different subvols.</div><div class='add'>+         * So during a lock request, taking a ref on inode</div><div class='add'>+         * to prevent inode purging. inode unref will happen</div><div class='add'>+         * in unlock cbk code path.</div><div class='add'>+         */</div><div class='add'>+        inode_ref(inode);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;inode-&gt;lock);</div><div class='add'>+    ret = __inode_ctx_get0(inode, this, &amp;value);</div><div class='add'>+    if (!ret &amp;&amp; value) {</div><div class='add'>+        ctx = (dht_inode_ctx_t *)(uintptr_t)value;</div><div class='add'>+        subvol = ctx-&gt;lock_subvol;</div><div class='add'>+    }</div><div class='add'>+    if (!subvol &amp;&amp; lock-&gt;l_type != F_UNLCK &amp;&amp; cached_subvol) {</div><div class='add'>+        ret = __dht_lock_subvol_set(inode, this, cached_subvol);</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_uuid_unparse(inode-&gt;gfid, gfid);</div><div class='add'>+            UNLOCK(&amp;inode-&gt;lock);</div><div class='add'>+            gf_smsg(this-&gt;name, GF_LOG_WARNING, 0, DHT_MSG_SET_INODE_CTX_FAILED,</div><div class='add'>+                    "lock_subvol gfid=%s", gfid, NULL);</div><div class='add'>+            goto post_unlock;</div><div class='add'>+        }</div><div class='add'>+        subvol = cached_subvol;</div><div class='add'>+    }</div><div class='add'>+    UNLOCK(&amp;inode-&gt;lock);</div><div class='add'>+post_unlock:</div><div class='add'>+    if (!subvol &amp;&amp; inode &amp;&amp; lock-&gt;l_type != F_UNLCK) {</div><div class='add'>+        inode_unref(inode);</div><div class='add'>+    }</div><div class='add'>+out:</div><div class='add'>+    return subvol;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+dht_lk_inode_unref(call_frame_t *frame, int32_t op_ret)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    inode_t *inode = NULL;</div><div class='add'>+    xlator_t *this = NULL;</div><div class='add'>+    char gfid[GF_UUID_BUF_SIZE] = {0};</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    this = frame-&gt;this;</div><div class='add'>+</div><div class='add'>+    if (local-&gt;loc.inode || local-&gt;fd) {</div><div class='add'>+        inode = local-&gt;loc.inode ? local-&gt;loc.inode : local-&gt;fd-&gt;inode;</div><div class='add'>+    }</div><div class='add'>+    if (!inode) {</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_WARNING, 0, DHT_MSG_LOCK_INODE_UNREF_FAILED,</div><div class='add'>+                NULL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (!(IA_ISDIR(inode-&gt;ia_type) || IA_ISINVAL(inode-&gt;ia_type))) {</div><div class='add'>+        ret = 0;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    switch (local-&gt;lock_type) {</div><div class='add'>+        case F_RDLCK:</div><div class='add'>+        case F_WRLCK:</div><div class='add'>+            if (op_ret) {</div><div class='add'>+                gf_uuid_unparse(inode-&gt;gfid, gfid);</div><div class='add'>+                gf_msg_debug(this-&gt;name, 0, "lock request failed for gfid %s",</div><div class='add'>+                             gfid);</div><div class='add'>+                inode_unref(inode);</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+            break;</div><div class='add'>+</div><div class='add'>+        case F_UNLCK:</div><div class='add'>+            if (!op_ret) {</div><div class='add'>+                inode_unref(inode);</div><div class='add'>+            } else {</div><div class='add'>+                gf_uuid_unparse(inode-&gt;gfid, gfid);</div><div class='add'>+                gf_smsg(this-&gt;name, GF_LOG_WARNING, 0,</div><div class='add'>+                        DHT_MSG_LOCK_INODE_UNREF_FAILED, "gfid=%s", gfid, NULL);</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+        default:</div><div class='add'>+            break;</div><div class='add'>+    }</div><div class='add'>+    ret = 0;</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* Code to update custom extended attributes from src dict to dst dict</div><div class='add'>+ */</div><div class='add'>+void</div><div class='add'>+dht_dir_set_heal_xattr(xlator_t *this, dht_local_t *local, dict_t *dst,</div><div class='add'>+                       dict_t *src, int *uret, int *uflag)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    data_t *keyval = NULL;</div><div class='add'>+    int luret = -1;</div><div class='add'>+    int luflag = -1;</div><div class='add'>+    int i = 0;</div><div class='add'>+    char **xattrs_to_heal;</div><div class='add'>+</div><div class='add'>+    if (!src || !dst) {</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_WARNING, EINVAL, DHT_MSG_DST_NULL_SET_FAILED,</div><div class='add'>+                "path=%s", local-&gt;loc.path, NULL);</div><div class='add'>+        return;</div><div class='add'>+    }</div><div class='add'>+    /* Check if any user xattr present in src dict and set</div><div class='add'>+       it to dst dict</div><div class='add'>+    */</div><div class='add'>+    luret = dict_foreach_fnmatch(src, "user.*", dht_set_user_xattr, dst);</div><div class='add'>+    /* Check if any other custom xattr present in src dict</div><div class='add'>+       and set it to dst dict, here index start from 1 because</div><div class='add'>+       user xattr already checked in previous statement</div><div class='add'>+    */</div><div class='add'>+</div><div class='add'>+    xattrs_to_heal = get_xattrs_to_heal();</div><div class='add'>+</div><div class='add'>+    for (i = 1; xattrs_to_heal[i]; i++) {</div><div class='add'>+        keyval = dict_get(src, xattrs_to_heal[i]);</div><div class='add'>+        if (keyval) {</div><div class='add'>+            luflag = 1;</div><div class='add'>+            ret = dict_set(dst, xattrs_to_heal[i], keyval);</div><div class='add'>+            if (ret)</div><div class='add'>+                gf_smsg(this-&gt;name, GF_LOG_WARNING, ENOMEM,</div><div class='add'>+                        DHT_MSG_DICT_SET_FAILED, "key=%s", xattrs_to_heal[i],</div><div class='add'>+                        "path=%s", local-&gt;loc.path, NULL);</div><div class='add'>+            keyval = NULL;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    if (uret)</div><div class='add'>+        (*uret) = luret;</div><div class='add'>+    if (uflag)</div><div class='add'>+        (*uflag) = luflag;</div><div class='ctx'> }</div><div class='head'>diff --git a/xlators/cluster/dht/src/dht-inode-read.c b/xlators/cluster/dht/src/dht-inode-read.c<br/>new file mode 100644<br/>index 00000000000..dbb8070b0da<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/xlators/cluster/dht/src/dht-inode-read.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>xlators/cluster/dht/src/dht-inode-read.c</a></div><div class='hunk'>@@ -0,0 +1,1658 @@</div><div class='add'>+/*</div><div class='add'>+  Copyright (c) 2008-2012 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#include "dht-common.h"</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+dht_access2(xlator_t *this, xlator_t *dst_node, call_frame_t *frame, int ret);</div><div class='add'>+static int</div><div class='add'>+dht_readv2(xlator_t *this, xlator_t *dst_node, call_frame_t *frame, int ret);</div><div class='add'>+static int</div><div class='add'>+dht_attr2(xlator_t *this, xlator_t *dst_node, call_frame_t *frame, int ret);</div><div class='add'>+static int</div><div class='add'>+dht_open2(xlator_t *this, xlator_t *dst_node, call_frame_t *frame, int ret);</div><div class='add'>+static int</div><div class='add'>+dht_flush2(xlator_t *this, xlator_t *dst_node, call_frame_t *frame, int ret);</div><div class='add'>+static int</div><div class='add'>+dht_lk2(xlator_t *this, xlator_t *dst_node, call_frame_t *frame, int ret);</div><div class='add'>+static int</div><div class='add'>+dht_fsync2(xlator_t *this, xlator_t *dst_node, call_frame_t *frame, int ret);</div><div class='add'>+static int</div><div class='add'>+dht_common_xattrop2(xlator_t *this, xlator_t *subvol, call_frame_t *frame,</div><div class='add'>+                    int ret);</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+dht_open_cbk(call_frame_t *frame, void *cookie, xlator_t *this, int op_ret,</div><div class='add'>+             int op_errno, fd_t *fd, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    xlator_t *prev = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    prev = cookie;</div><div class='add'>+</div><div class='add'>+    local-&gt;op_errno = op_errno;</div><div class='add'>+    if ((op_ret == -1) &amp;&amp; !dht_inode_missing(op_errno)) {</div><div class='add'>+        gf_msg_debug(this-&gt;name, op_errno, "subvolume %s returned -1",</div><div class='add'>+                     prev-&gt;name);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Update ctx if the fd has been opened on the target*/</div><div class='add'>+    if (!op_ret &amp;&amp; (local-&gt;call_cnt == 1)) {</div><div class='add'>+        dht_fd_ctx_set(this, fd, prev);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (!op_ret || (local-&gt;call_cnt != 1))</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    /* rebalance would have happened */</div><div class='add'>+    local-&gt;rebalance.target_op_fn = dht_open2;</div><div class='add'>+    ret = dht_rebalance_complete_check(this, frame);</div><div class='add'>+    if (!ret)</div><div class='add'>+        return 0;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    DHT_STACK_UNWIND(open, frame, op_ret, op_errno, local-&gt;fd, xdata);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+dht_open2(xlator_t *this, xlator_t *subvol, call_frame_t *frame, int ret)</div><div class='add'>+{</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    int op_errno = EINVAL;</div><div class='add'>+</div><div class='add'>+    if (!frame || !frame-&gt;local)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    op_errno = local-&gt;op_errno;</div><div class='add'>+</div><div class='add'>+    if (we_are_not_migrating(ret)) {</div><div class='add'>+        /* This DHT layer is not migrating the file */</div><div class='add'>+        DHT_STACK_UNWIND(open, frame, -1, local-&gt;op_errno, NULL,</div><div class='add'>+                         local-&gt;rebalance.xdata);</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (subvol == NULL)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    local-&gt;call_cnt = 2;</div><div class='add'>+</div><div class='add'>+    STACK_WIND_COOKIE(frame, dht_open_cbk, subvol, subvol, subvol-&gt;fops-&gt;open,</div><div class='add'>+                      &amp;local-&gt;loc, local-&gt;rebalance.flags, local-&gt;fd,</div><div class='add'>+                      local-&gt;xattr_req);</div><div class='add'>+    return 0;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    DHT_STACK_UNWIND(open, frame, -1, op_errno, NULL, NULL);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+dht_open(call_frame_t *frame, xlator_t *this, loc_t *loc, int flags, fd_t *fd,</div><div class='add'>+         dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    xlator_t *subvol = NULL;</div><div class='add'>+    int op_errno = -1;</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+</div><div class='add'>+    VALIDATE_OR_GOTO(frame, err);</div><div class='add'>+    VALIDATE_OR_GOTO(this, err);</div><div class='add'>+    VALIDATE_OR_GOTO(fd, err);</div><div class='add'>+</div><div class='add'>+    local = dht_local_init(frame, loc, fd, GF_FOP_OPEN);</div><div class='add'>+    if (!local) {</div><div class='add'>+        op_errno = ENOMEM;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    subvol = local-&gt;cached_subvol;</div><div class='add'>+    if (!subvol) {</div><div class='add'>+        gf_msg_debug(this-&gt;name, 0, "no cached subvolume for fd=%p", fd);</div><div class='add'>+        op_errno = EINVAL;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+    if (xdata)</div><div class='add'>+        local-&gt;xattr_req = dict_ref(xdata);</div><div class='add'>+</div><div class='add'>+    local-&gt;rebalance.flags = flags;</div><div class='add'>+    local-&gt;call_cnt = 1;</div><div class='add'>+</div><div class='add'>+    STACK_WIND_COOKIE(frame, dht_open_cbk, subvol, subvol, subvol-&gt;fops-&gt;open,</div><div class='add'>+                      loc, flags, fd, xdata);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+</div><div class='add'>+err:</div><div class='add'>+    op_errno = (op_errno == -1) ? errno : op_errno;</div><div class='add'>+    DHT_STACK_UNWIND(open, frame, -1, op_errno, NULL, NULL);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+dht_file_attr_cbk(call_frame_t *frame, void *cookie, xlator_t *this, int op_ret,</div><div class='add'>+                  int op_errno, struct iatt *stbuf, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    xlator_t *subvol1 = 0;</div><div class='add'>+    xlator_t *subvol2 = 0;</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    xlator_t *prev = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    inode_t *inode = NULL;</div><div class='add'>+</div><div class='add'>+    GF_VALIDATE_OR_GOTO("dht", frame, err);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("dht", this, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("dht", frame-&gt;local, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("dht", cookie, out);</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    prev = cookie;</div><div class='add'>+</div><div class='add'>+    if ((local-&gt;fop == GF_FOP_FSTAT) &amp;&amp;</div><div class='add'>+        dht_check_remote_fd_failed_error(local, op_ret, op_errno)) {</div><div class='add'>+        ret = dht_check_and_open_fd_on_subvol(this, frame);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if ((op_ret == -1) &amp;&amp; !dht_inode_missing(op_errno)) {</div><div class='add'>+        local-&gt;op_errno = op_errno;</div><div class='add'>+        gf_msg_debug(this-&gt;name, op_errno, "subvolume %s returned -1",</div><div class='add'>+                     prev-&gt;name);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (local-&gt;call_cnt != 1)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    local-&gt;op_errno = op_errno;</div><div class='add'>+    local-&gt;op_ret = op_ret;</div><div class='add'>+</div><div class='add'>+    /* Check if the rebalance phase2 is true */</div><div class='add'>+    if ((op_ret == -1) || IS_DHT_MIGRATION_PHASE2(stbuf)) {</div><div class='add'>+        local-&gt;rebalance.target_op_fn = dht_attr2;</div><div class='add'>+        dht_set_local_rebalance(this, local, NULL, NULL, stbuf, xdata);</div><div class='add'>+        inode = (local-&gt;fd) ? local-&gt;fd-&gt;inode : local-&gt;loc.inode;</div><div class='add'>+</div><div class='add'>+        dht_inode_ctx_get_mig_info(this, inode, &amp;subvol1, &amp;subvol2);</div><div class='add'>+        if (dht_mig_info_is_invalid(local-&gt;cached_subvol, subvol1, subvol2)) {</div><div class='add'>+            /* Phase 2 of migration */</div><div class='add'>+            ret = dht_rebalance_complete_check(this, frame);</div><div class='add'>+            if (!ret)</div><div class='add'>+                return 0;</div><div class='add'>+        } else {</div><div class='add'>+            /* it is a non-fd op or it is an fd based Fop and</div><div class='add'>+               opened on the dst.*/</div><div class='add'>+            if (local-&gt;fd &amp;&amp; !dht_fd_open_on_dst(this, local-&gt;fd, subvol2)) {</div><div class='add'>+                ret = dht_rebalance_complete_check(this, frame);</div><div class='add'>+                if (!ret)</div><div class='add'>+                    return 0;</div><div class='add'>+            } else {</div><div class='add'>+                dht_attr2(this, subvol2, frame, 0);</div><div class='add'>+                return 0;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    DHT_STRIP_PHASE1_FLAGS(stbuf);</div><div class='add'>+    DHT_STACK_UNWIND(stat, frame, op_ret, op_errno, stbuf, xdata);</div><div class='add'>+err:</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+dht_attr2(xlator_t *this, xlator_t *subvol, call_frame_t *frame, int ret)</div><div class='add'>+{</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    int op_errno = EINVAL;</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    if (!local)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    op_errno = local-&gt;op_errno;</div><div class='add'>+</div><div class='add'>+    if (we_are_not_migrating(ret)) {</div><div class='add'>+        /* This dht xlator is not migrating the file. Unwind and</div><div class='add'>+         * pass on the original mode bits so the higher DHT layer</div><div class='add'>+         * can handle this.</div><div class='add'>+         */</div><div class='add'>+        DHT_STACK_UNWIND(stat, frame, local-&gt;op_ret, op_errno,</div><div class='add'>+                         &amp;local-&gt;rebalance.postbuf, local-&gt;rebalance.xdata);</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (subvol == NULL)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    local-&gt;call_cnt = 2;</div><div class='add'>+</div><div class='add'>+    if (local-&gt;fop == GF_FOP_FSTAT) {</div><div class='add'>+        STACK_WIND_COOKIE(frame, dht_file_attr_cbk, subvol, subvol,</div><div class='add'>+                          subvol-&gt;fops-&gt;fstat, local-&gt;fd, local-&gt;xattr_req);</div><div class='add'>+    } else {</div><div class='add'>+        STACK_WIND_COOKIE(frame, dht_file_attr_cbk, subvol, subvol,</div><div class='add'>+                          subvol-&gt;fops-&gt;stat, &amp;local-&gt;loc, local-&gt;xattr_req);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    DHT_STACK_UNWIND(stat, frame, -1, op_errno, NULL, NULL);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+dht_attr_cbk(call_frame_t *frame, void *cookie, xlator_t *this, int op_ret,</div><div class='add'>+             int op_errno, struct iatt *stbuf, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    int this_call_cnt = 0;</div><div class='add'>+    xlator_t *prev = NULL;</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    prev = cookie;</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;frame-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        if (op_ret == -1) {</div><div class='add'>+            local-&gt;op_errno = op_errno;</div><div class='add'>+            UNLOCK(&amp;frame-&gt;lock);</div><div class='add'>+            gf_msg_debug(this-&gt;name, op_errno, "subvolume %s returned -1",</div><div class='add'>+                         prev-&gt;name);</div><div class='add'>+</div><div class='add'>+            goto post_unlock;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        dht_iatt_merge(this, &amp;local-&gt;stbuf, stbuf);</div><div class='add'>+</div><div class='add'>+        local-&gt;op_ret = 0;</div><div class='add'>+    }</div><div class='add'>+    UNLOCK(&amp;frame-&gt;lock);</div><div class='add'>+post_unlock:</div><div class='add'>+    this_call_cnt = dht_frame_return(frame);</div><div class='add'>+    if (is_last_call(this_call_cnt)) {</div><div class='add'>+        DHT_STACK_UNWIND(stat, frame, local-&gt;op_ret, local-&gt;op_errno,</div><div class='add'>+                         &amp;local-&gt;stbuf, xdata);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+dht_stat(call_frame_t *frame, xlator_t *this, loc_t *loc, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    xlator_t *subvol = NULL;</div><div class='add'>+    int op_errno = -1;</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    dht_layout_t *layout = NULL;</div><div class='add'>+    int i = 0;</div><div class='add'>+    int call_cnt = 0;</div><div class='add'>+</div><div class='add'>+    VALIDATE_OR_GOTO(frame, err);</div><div class='add'>+    VALIDATE_OR_GOTO(this, err);</div><div class='add'>+    VALIDATE_OR_GOTO(loc, err);</div><div class='add'>+    VALIDATE_OR_GOTO(loc-&gt;inode, err);</div><div class='add'>+    VALIDATE_OR_GOTO(loc-&gt;path, err);</div><div class='add'>+</div><div class='add'>+    local = dht_local_init(frame, loc, NULL, GF_FOP_STAT);</div><div class='add'>+    if (!local) {</div><div class='add'>+        op_errno = ENOMEM;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    layout = local-&gt;layout;</div><div class='add'>+    if (!layout) {</div><div class='add'>+        gf_msg_debug(this-&gt;name, 0, "no layout for path=%s", loc-&gt;path);</div><div class='add'>+        op_errno = EINVAL;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+    if (xdata)</div><div class='add'>+        local-&gt;xattr_req = dict_ref(xdata);</div><div class='add'>+</div><div class='add'>+    if (IA_ISREG(loc-&gt;inode-&gt;ia_type)) {</div><div class='add'>+        local-&gt;call_cnt = 1;</div><div class='add'>+</div><div class='add'>+        subvol = local-&gt;cached_subvol;</div><div class='add'>+</div><div class='add'>+        STACK_WIND_COOKIE(frame, dht_file_attr_cbk, subvol, subvol,</div><div class='add'>+                          subvol-&gt;fops-&gt;stat, loc, xdata);</div><div class='add'>+</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    local-&gt;call_cnt = call_cnt = layout-&gt;cnt;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; call_cnt; i++) {</div><div class='add'>+        subvol = layout-&gt;list[i].xlator;</div><div class='add'>+</div><div class='add'>+        STACK_WIND_COOKIE(frame, dht_attr_cbk, subvol, subvol,</div><div class='add'>+                          subvol-&gt;fops-&gt;stat, loc, xdata);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+</div><div class='add'>+err:</div><div class='add'>+    op_errno = (op_errno == -1) ? errno : op_errno;</div><div class='add'>+    DHT_STACK_UNWIND(stat, frame, -1, op_errno, NULL, NULL);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+dht_fstat(call_frame_t *frame, xlator_t *this, fd_t *fd, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    xlator_t *subvol = NULL;</div><div class='add'>+    int op_errno = -1;</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    dht_layout_t *layout = NULL;</div><div class='add'>+    int i = 0;</div><div class='add'>+    int call_cnt = 0;</div><div class='add'>+</div><div class='add'>+    VALIDATE_OR_GOTO(frame, err);</div><div class='add'>+    VALIDATE_OR_GOTO(this, err);</div><div class='add'>+    VALIDATE_OR_GOTO(fd, err);</div><div class='add'>+</div><div class='add'>+    local = dht_local_init(frame, NULL, fd, GF_FOP_FSTAT);</div><div class='add'>+    if (!local) {</div><div class='add'>+        op_errno = ENOMEM;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    layout = local-&gt;layout;</div><div class='add'>+    if (!layout) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_ERROR, 0, 0, "no layout for fd=%p", fd);</div><div class='add'>+        op_errno = EINVAL;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+    if (xdata)</div><div class='add'>+        local-&gt;xattr_req = dict_ref(xdata);</div><div class='add'>+</div><div class='add'>+    if (IA_ISREG(fd-&gt;inode-&gt;ia_type)) {</div><div class='add'>+        local-&gt;call_cnt = 1;</div><div class='add'>+</div><div class='add'>+        subvol = local-&gt;cached_subvol;</div><div class='add'>+</div><div class='add'>+        STACK_WIND_COOKIE(frame, dht_file_attr_cbk, subvol, subvol,</div><div class='add'>+                          subvol-&gt;fops-&gt;fstat, fd, xdata);</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    local-&gt;call_cnt = call_cnt = layout-&gt;cnt;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; call_cnt; i++) {</div><div class='add'>+        subvol = layout-&gt;list[i].xlator;</div><div class='add'>+        STACK_WIND_COOKIE(frame, dht_attr_cbk, subvol, subvol,</div><div class='add'>+                          subvol-&gt;fops-&gt;fstat, fd, xdata);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+</div><div class='add'>+err:</div><div class='add'>+    op_errno = (op_errno == -1) ? errno : op_errno;</div><div class='add'>+    DHT_STACK_UNWIND(fstat, frame, -1, op_errno, NULL, NULL);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+dht_readv_cbk(call_frame_t *frame, void *cookie, xlator_t *this, int op_ret,</div><div class='add'>+              int op_errno, struct iovec *vector, int count, struct iatt *stbuf,</div><div class='add'>+              struct iobref *iobref, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    xlator_t *src_subvol = 0;</div><div class='add'>+    xlator_t *dst_subvol = 0;</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    if (!local) {</div><div class='add'>+        op_ret = -1;</div><div class='add'>+        op_errno = EINVAL;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* This is already second try, no need for re-check */</div><div class='add'>+    if (local-&gt;call_cnt != 1)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    if (dht_check_remote_fd_failed_error(local, op_ret, op_errno)) {</div><div class='add'>+        ret = dht_check_and_open_fd_on_subvol(this, frame);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if ((op_ret == -1) &amp;&amp; !dht_inode_missing(op_errno))</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    local-&gt;op_errno = op_errno;</div><div class='add'>+    if ((op_ret == -1) || IS_DHT_MIGRATION_PHASE2(stbuf)) {</div><div class='add'>+        local-&gt;op_ret = op_ret;</div><div class='add'>+        local-&gt;rebalance.target_op_fn = dht_readv2;</div><div class='add'>+        dht_set_local_rebalance(this, local, NULL, NULL, stbuf, xdata);</div><div class='add'>+        /* File would be migrated to other node */</div><div class='add'>+        ret = dht_inode_ctx_get_mig_info(this, local-&gt;fd-&gt;inode, &amp;src_subvol,</div><div class='add'>+                                         &amp;dst_subvol);</div><div class='add'>+</div><div class='add'>+        if (dht_mig_info_is_invalid(local-&gt;cached_subvol, src_subvol,</div><div class='add'>+                                    dst_subvol) ||</div><div class='add'>+            !dht_fd_open_on_dst(this, local-&gt;fd, dst_subvol)) {</div><div class='add'>+            ret = dht_rebalance_complete_check(this, frame);</div><div class='add'>+            if (!ret)</div><div class='add'>+                return 0;</div><div class='add'>+        } else {</div><div class='add'>+            /* value is already set in fd_ctx, that means no need</div><div class='add'>+               to check for whether its complete or not. */</div><div class='add'>+            dht_readv2(this, dst_subvol, frame, 0);</div><div class='add'>+            return 0;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    DHT_STRIP_PHASE1_FLAGS(stbuf);</div><div class='add'>+</div><div class='add'>+    DHT_STACK_UNWIND(readv, frame, op_ret, op_errno, vector, count, stbuf,</div><div class='add'>+                     iobref, xdata);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+dht_readv2(xlator_t *this, xlator_t *subvol, call_frame_t *frame, int ret)</div><div class='add'>+{</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    int op_errno = EINVAL;</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    if (!local)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    op_errno = local-&gt;op_errno;</div><div class='add'>+</div><div class='add'>+    if (we_are_not_migrating(ret)) {</div><div class='add'>+        /* This dht xlator is not migrating the file. Unwind and</div><div class='add'>+         * pass on the original mode bits so the higher DHT layer</div><div class='add'>+         * can handle this.</div><div class='add'>+         */</div><div class='add'>+        DHT_STACK_UNWIND(readv, frame, local-&gt;op_ret, op_errno, NULL, 0,</div><div class='add'>+                         &amp;local-&gt;rebalance.postbuf, NULL,</div><div class='add'>+                         local-&gt;rebalance.xdata);</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (subvol == NULL)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    local-&gt;call_cnt = 2;</div><div class='add'>+</div><div class='add'>+    STACK_WIND(frame, dht_readv_cbk, subvol, subvol-&gt;fops-&gt;readv, local-&gt;fd,</div><div class='add'>+               local-&gt;rebalance.size, local-&gt;rebalance.offset,</div><div class='add'>+               local-&gt;rebalance.flags, local-&gt;xattr_req);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    DHT_STACK_UNWIND(readv, frame, -1, op_errno, NULL, 0, NULL, NULL, NULL);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+dht_readv(call_frame_t *frame, xlator_t *this, fd_t *fd, size_t size, off_t off,</div><div class='add'>+          uint32_t flags, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    xlator_t *subvol = NULL;</div><div class='add'>+    int op_errno = -1;</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+</div><div class='add'>+    VALIDATE_OR_GOTO(frame, err);</div><div class='add'>+    VALIDATE_OR_GOTO(this, err);</div><div class='add'>+    VALIDATE_OR_GOTO(fd, err);</div><div class='add'>+</div><div class='add'>+    local = dht_local_init(frame, NULL, fd, GF_FOP_READ);</div><div class='add'>+    if (!local) {</div><div class='add'>+        op_errno = ENOMEM;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    subvol = local-&gt;cached_subvol;</div><div class='add'>+    if (!subvol) {</div><div class='add'>+        gf_msg_debug(this-&gt;name, 0, "no cached subvolume for fd=%p", fd);</div><div class='add'>+        op_errno = EINVAL;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (xdata)</div><div class='add'>+        local-&gt;xattr_req = dict_ref(xdata);</div><div class='add'>+</div><div class='add'>+    local-&gt;rebalance.offset = off;</div><div class='add'>+    local-&gt;rebalance.size = size;</div><div class='add'>+    local-&gt;rebalance.flags = flags;</div><div class='add'>+    local-&gt;call_cnt = 1;</div><div class='add'>+</div><div class='add'>+    STACK_WIND(frame, dht_readv_cbk, subvol, subvol-&gt;fops-&gt;readv, local-&gt;fd,</div><div class='add'>+               local-&gt;rebalance.size, local-&gt;rebalance.offset,</div><div class='add'>+               local-&gt;rebalance.flags, local-&gt;xattr_req);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+</div><div class='add'>+err:</div><div class='add'>+    op_errno = (op_errno == -1) ? errno : op_errno;</div><div class='add'>+    DHT_STACK_UNWIND(readv, frame, -1, op_errno, NULL, 0, NULL, NULL, NULL);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+dht_access_cbk(call_frame_t *frame, void *cookie, xlator_t *this, int op_ret,</div><div class='add'>+               int op_errno, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    xlator_t *subvol = NULL;</div><div class='add'>+    xlator_t *prev = NULL;</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    prev = cookie;</div><div class='add'>+</div><div class='add'>+    if (!prev)</div><div class='add'>+        goto out;</div><div class='add'>+    if (local-&gt;call_cnt != 1)</div><div class='add'>+        goto out;</div><div class='add'>+    if ((op_ret == -1) &amp;&amp;</div><div class='add'>+        ((op_errno == ENOTCONN) || dht_inode_missing(op_errno)) &amp;&amp;</div><div class='add'>+        IA_ISDIR(local-&gt;loc.inode-&gt;ia_type)) {</div><div class='add'>+        subvol = dht_subvol_next_available(this, prev);</div><div class='add'>+        if (!subvol)</div><div class='add'>+            goto out;</div><div class='add'>+</div><div class='add'>+        /* check if we are done with visiting every node */</div><div class='add'>+        if (subvol == local-&gt;cached_subvol) {</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        STACK_WIND_COOKIE(frame, dht_access_cbk, subvol, subvol,</div><div class='add'>+                          subvol-&gt;fops-&gt;access, &amp;local-&gt;loc,</div><div class='add'>+                          local-&gt;rebalance.flags, NULL);</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='add'>+    if ((op_ret == -1) &amp;&amp; dht_inode_missing(op_errno) &amp;&amp;</div><div class='add'>+        !(IA_ISDIR(local-&gt;loc.inode-&gt;ia_type))) {</div><div class='add'>+        /* File would be migrated to other node */</div><div class='add'>+        local-&gt;op_errno = op_errno;</div><div class='add'>+        local-&gt;rebalance.target_op_fn = dht_access2;</div><div class='add'>+        ret = dht_rebalance_complete_check(frame-&gt;this, frame);</div><div class='add'>+        if (!ret)</div><div class='add'>+            return 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    DHT_STACK_UNWIND(access, frame, op_ret, op_errno, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+dht_access2(xlator_t *this, xlator_t *subvol, call_frame_t *frame, int ret)</div><div class='add'>+{</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    int op_errno = EINVAL;</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    if (!local)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    op_errno = local-&gt;op_errno;</div><div class='add'>+</div><div class='add'>+    if (we_are_not_migrating(ret)) {</div><div class='add'>+        /* This dht xlator is not migrating the file. Unwind and</div><div class='add'>+         * pass on the original mode bits so the higher DHT layer</div><div class='add'>+         * can handle this.</div><div class='add'>+         */</div><div class='add'>+</div><div class='add'>+        DHT_STACK_UNWIND(access, frame, -1, op_errno, NULL);</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (subvol == NULL)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    local-&gt;call_cnt = 2;</div><div class='add'>+</div><div class='add'>+    STACK_WIND_COOKIE(frame, dht_access_cbk, subvol, subvol,</div><div class='add'>+                      subvol-&gt;fops-&gt;access, &amp;local-&gt;loc, local-&gt;rebalance.flags,</div><div class='add'>+                      local-&gt;xattr_req);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    DHT_STACK_UNWIND(access, frame, -1, op_errno, NULL);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+dht_access(call_frame_t *frame, xlator_t *this, loc_t *loc, int32_t mask,</div><div class='add'>+           dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    xlator_t *subvol = NULL;</div><div class='add'>+    int op_errno = -1;</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+</div><div class='add'>+    VALIDATE_OR_GOTO(frame, err);</div><div class='add'>+    VALIDATE_OR_GOTO(this, err);</div><div class='add'>+    VALIDATE_OR_GOTO(loc, err);</div><div class='add'>+    VALIDATE_OR_GOTO(loc-&gt;inode, err);</div><div class='add'>+    VALIDATE_OR_GOTO(loc-&gt;path, err);</div><div class='add'>+</div><div class='add'>+    local = dht_local_init(frame, loc, NULL, GF_FOP_ACCESS);</div><div class='add'>+    if (!local) {</div><div class='add'>+        op_errno = ENOMEM;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    local-&gt;rebalance.flags = mask;</div><div class='add'>+    local-&gt;call_cnt = 1;</div><div class='add'>+    subvol = local-&gt;cached_subvol;</div><div class='add'>+    if (!subvol) {</div><div class='add'>+        gf_msg_debug(this-&gt;name, 0, "no cached subvolume for path=%s",</div><div class='add'>+                     loc-&gt;path);</div><div class='add'>+        op_errno = EINVAL;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+    if (xdata)</div><div class='add'>+        local-&gt;xattr_req = dict_ref(xdata);</div><div class='add'>+</div><div class='add'>+    STACK_WIND_COOKIE(frame, dht_access_cbk, subvol, subvol,</div><div class='add'>+                      subvol-&gt;fops-&gt;access, loc, mask, xdata);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+</div><div class='add'>+err:</div><div class='add'>+    op_errno = (op_errno == -1) ? errno : op_errno;</div><div class='add'>+    DHT_STACK_UNWIND(access, frame, -1, op_errno, NULL);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+dht_flush_cbk(call_frame_t *frame, void *cookie, xlator_t *this, int op_ret,</div><div class='add'>+              int op_errno, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    xlator_t *subvol = 0;</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+</div><div class='add'>+    local-&gt;op_errno = op_errno;</div><div class='add'>+</div><div class='add'>+    if (local-&gt;call_cnt != 1)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    if (dht_check_remote_fd_failed_error(local, op_ret, op_errno)) {</div><div class='add'>+        ret = dht_check_and_open_fd_on_subvol(this, frame);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    local-&gt;rebalance.target_op_fn = dht_flush2;</div><div class='add'>+</div><div class='add'>+    local-&gt;op_ret = op_ret;</div><div class='add'>+    local-&gt;op_errno = op_errno;</div><div class='add'>+</div><div class='add'>+    /* If context is set, then send flush() it to the destination */</div><div class='add'>+    dht_inode_ctx_get_mig_info(this, local-&gt;fd-&gt;inode, NULL, &amp;subvol);</div><div class='add'>+    if (subvol &amp;&amp; dht_fd_open_on_dst(this, local-&gt;fd, subvol)) {</div><div class='add'>+        dht_flush2(this, subvol, frame, 0);</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (op_errno == EREMOTE) {</div><div class='add'>+        ret = dht_rebalance_complete_check(this, frame);</div><div class='add'>+        if (!ret) {</div><div class='add'>+            return 0;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    DHT_STACK_UNWIND(flush, frame, op_ret, op_errno, xdata);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+dht_flush2(xlator_t *this, xlator_t *subvol, call_frame_t *frame, int ret)</div><div class='add'>+{</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    int32_t op_errno = EINVAL;</div><div class='add'>+</div><div class='add'>+    if ((frame == NULL) || (frame-&gt;local == NULL))</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+</div><div class='add'>+    op_errno = local-&gt;op_errno;</div><div class='add'>+</div><div class='add'>+    if (subvol == NULL)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    local-&gt;call_cnt = 2; /* This is the second attempt */</div><div class='add'>+</div><div class='add'>+    STACK_WIND(frame, dht_flush_cbk, subvol, subvol-&gt;fops-&gt;flush, local-&gt;fd,</div><div class='add'>+               local-&gt;xattr_req);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    DHT_STACK_UNWIND(flush, frame, -1, op_errno, NULL);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+dht_flush(call_frame_t *frame, xlator_t *this, fd_t *fd, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    xlator_t *subvol = NULL;</div><div class='add'>+    int op_errno = -1;</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+</div><div class='add'>+    VALIDATE_OR_GOTO(frame, err);</div><div class='add'>+    VALIDATE_OR_GOTO(this, err);</div><div class='add'>+    VALIDATE_OR_GOTO(fd, err);</div><div class='add'>+</div><div class='add'>+    local = dht_local_init(frame, NULL, fd, GF_FOP_FLUSH);</div><div class='add'>+    if (!local) {</div><div class='add'>+        op_errno = ENOMEM;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    subvol = local-&gt;cached_subvol;</div><div class='add'>+    if (!subvol) {</div><div class='add'>+        gf_msg_debug(this-&gt;name, 0, "no cached subvolume for fd=%p", fd);</div><div class='add'>+        op_errno = EINVAL;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (xdata)</div><div class='add'>+        local-&gt;xattr_req = dict_ref(xdata);</div><div class='add'>+</div><div class='add'>+    local-&gt;call_cnt = 1;</div><div class='add'>+</div><div class='add'>+    STACK_WIND(frame, dht_flush_cbk, subvol, subvol-&gt;fops-&gt;flush, fd,</div><div class='add'>+               local-&gt;xattr_req);</div><div class='add'>+    return 0;</div><div class='add'>+</div><div class='add'>+err:</div><div class='add'>+    op_errno = (op_errno == -1) ? errno : op_errno;</div><div class='add'>+    DHT_STACK_UNWIND(flush, frame, -1, op_errno, NULL);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+dht_fsync_cbk(call_frame_t *frame, void *cookie, xlator_t *this, int op_ret,</div><div class='add'>+              int op_errno, struct iatt *prebuf, struct iatt *postbuf,</div><div class='add'>+              dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    xlator_t *prev = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    inode_t *inode = NULL;</div><div class='add'>+    xlator_t *src_subvol = 0;</div><div class='add'>+    xlator_t *dst_subvol = 0;</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    prev = cookie;</div><div class='add'>+</div><div class='add'>+    local-&gt;op_errno = op_errno;</div><div class='add'>+</div><div class='add'>+    if (dht_check_remote_fd_failed_error(local, op_ret, op_errno)) {</div><div class='add'>+        ret = dht_check_and_open_fd_on_subvol(this, frame);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (op_ret == -1 &amp;&amp; !dht_inode_missing(op_errno)) {</div><div class='add'>+        gf_msg_debug(this-&gt;name, op_errno, "subvolume %s returned -1",</div><div class='add'>+                     prev-&gt;name);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (local-&gt;call_cnt != 1) {</div><div class='add'>+        if (local-&gt;stbuf.ia_blocks) {</div><div class='add'>+            dht_iatt_merge(this, postbuf, &amp;local-&gt;stbuf);</div><div class='add'>+            dht_iatt_merge(this, prebuf, &amp;local-&gt;prebuf);</div><div class='add'>+        }</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    local-&gt;op_ret = op_ret;</div><div class='add'>+    inode = local-&gt;fd-&gt;inode;</div><div class='add'>+</div><div class='add'>+    local-&gt;rebalance.target_op_fn = dht_fsync2;</div><div class='add'>+    dht_set_local_rebalance(this, local, NULL, prebuf, postbuf, xdata);</div><div class='add'>+</div><div class='add'>+    if ((op_ret == -1) || IS_DHT_MIGRATION_PHASE2(postbuf)) {</div><div class='add'>+        ret = dht_rebalance_complete_check(this, frame);</div><div class='add'>+        if (!ret)</div><div class='add'>+            return 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Check if the rebalance phase1 is true */</div><div class='add'>+    if (IS_DHT_MIGRATION_PHASE1(postbuf)) {</div><div class='add'>+        dht_iatt_merge(this, &amp;local-&gt;stbuf, postbuf);</div><div class='add'>+        dht_iatt_merge(this, &amp;local-&gt;prebuf, prebuf);</div><div class='add'>+</div><div class='add'>+        dht_inode_ctx_get_mig_info(this, inode, &amp;src_subvol, &amp;dst_subvol);</div><div class='add'>+</div><div class='add'>+        if (dht_mig_info_is_invalid(local-&gt;cached_subvol, src_subvol,</div><div class='add'>+                                    dst_subvol) ||</div><div class='add'>+            !dht_fd_open_on_dst(this, local-&gt;fd, dst_subvol)) {</div><div class='add'>+            ret = dht_rebalance_in_progress_check(this, frame);</div><div class='add'>+            if (!ret)</div><div class='add'>+                return 0;</div><div class='add'>+        } else {</div><div class='add'>+            dht_fsync2(this, dst_subvol, frame, 0);</div><div class='add'>+            return 0;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    DHT_STRIP_PHASE1_FLAGS(postbuf);</div><div class='add'>+    DHT_STRIP_PHASE1_FLAGS(prebuf);</div><div class='add'>+</div><div class='add'>+    DHT_STACK_UNWIND(fsync, frame, op_ret, op_errno, prebuf, postbuf, xdata);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+dht_fsync2(xlator_t *this, xlator_t *subvol, call_frame_t *frame, int ret)</div><div class='add'>+{</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    int32_t op_errno = EINVAL;</div><div class='add'>+</div><div class='add'>+    if ((frame == NULL) || (frame-&gt;local == NULL))</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    op_errno = local-&gt;op_errno;</div><div class='add'>+</div><div class='add'>+    if (we_are_not_migrating(ret)) {</div><div class='add'>+        /* This dht xlator is not migrating the file. Unwind and</div><div class='add'>+         * pass on the original mode bits so the higher DHT layer</div><div class='add'>+         * can handle this.</div><div class='add'>+         */</div><div class='add'>+        DHT_STACK_UNWIND(fsync, frame, local-&gt;op_ret, op_errno,</div><div class='add'>+                         &amp;local-&gt;rebalance.prebuf, &amp;local-&gt;rebalance.postbuf,</div><div class='add'>+                         local-&gt;rebalance.xdata);</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (subvol == NULL)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    local-&gt;call_cnt = 2; /* This is the second attempt */</div><div class='add'>+</div><div class='add'>+    STACK_WIND_COOKIE(frame, dht_fsync_cbk, subvol, subvol, subvol-&gt;fops-&gt;fsync,</div><div class='add'>+                      local-&gt;fd, local-&gt;rebalance.flags, local-&gt;xattr_req);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    DHT_STACK_UNWIND(fsync, frame, -1, op_errno, NULL, NULL, NULL);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+dht_fsync(call_frame_t *frame, xlator_t *this, fd_t *fd, int datasync,</div><div class='add'>+          dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    xlator_t *subvol = NULL;</div><div class='add'>+    int op_errno = -1;</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+</div><div class='add'>+    VALIDATE_OR_GOTO(frame, err);</div><div class='add'>+    VALIDATE_OR_GOTO(this, err);</div><div class='add'>+    VALIDATE_OR_GOTO(fd, err);</div><div class='add'>+</div><div class='add'>+    local = dht_local_init(frame, NULL, fd, GF_FOP_FSYNC);</div><div class='add'>+    if (!local) {</div><div class='add'>+        op_errno = ENOMEM;</div><div class='add'>+</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+    if (xdata)</div><div class='add'>+        local-&gt;xattr_req = dict_ref(xdata);</div><div class='add'>+</div><div class='add'>+    local-&gt;call_cnt = 1;</div><div class='add'>+    local-&gt;rebalance.flags = datasync;</div><div class='add'>+</div><div class='add'>+    subvol = local-&gt;cached_subvol;</div><div class='add'>+</div><div class='add'>+    STACK_WIND_COOKIE(frame, dht_fsync_cbk, subvol, subvol, subvol-&gt;fops-&gt;fsync,</div><div class='add'>+                      local-&gt;fd, local-&gt;rebalance.flags, local-&gt;xattr_req);</div><div class='add'>+    return 0;</div><div class='add'>+</div><div class='add'>+err:</div><div class='add'>+    op_errno = (op_errno == -1) ? errno : op_errno;</div><div class='add'>+    DHT_STACK_UNWIND(fsync, frame, -1, op_errno, NULL, NULL, NULL);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* TODO: for 'lk()' call, we need some other special error, may be ESTALE to</div><div class='add'>+   indicate that lock migration happened on the fd, so we can consider it as</div><div class='add'>+   phase 2 of migration */</div><div class='add'>+static int</div><div class='add'>+dht_lk_cbk(call_frame_t *frame, void *cookie, xlator_t *this, int op_ret,</div><div class='add'>+           int op_errno, struct gf_flock *flock, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    xlator_t *subvol = NULL;</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+</div><div class='add'>+    if (!local) {</div><div class='add'>+        op_ret = -1;</div><div class='add'>+        op_errno = EINVAL;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (local-&gt;call_cnt != 1)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    local-&gt;rebalance.target_op_fn = dht_lk2;</div><div class='add'>+</div><div class='add'>+    local-&gt;op_ret = op_ret;</div><div class='add'>+    local-&gt;op_errno = op_errno;</div><div class='add'>+</div><div class='add'>+    if (xdata)</div><div class='add'>+        local-&gt;rebalance.xdata = dict_ref(xdata);</div><div class='add'>+</div><div class='add'>+    if (op_errno == EREMOTE) {</div><div class='add'>+        dht_inode_ctx_get_mig_info(this, local-&gt;fd-&gt;inode, NULL, &amp;subvol);</div><div class='add'>+        if (subvol &amp;&amp; dht_fd_open_on_dst(this, local-&gt;fd, subvol)) {</div><div class='add'>+            dht_lk2(this, subvol, frame, 0);</div><div class='add'>+            return 0;</div><div class='add'>+        } else {</div><div class='add'>+            ret = dht_rebalance_complete_check(this, frame);</div><div class='add'>+            if (!ret) {</div><div class='add'>+                return 0;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    dht_lk_inode_unref(frame, op_ret);</div><div class='add'>+    DHT_STACK_UNWIND(lk, frame, op_ret, op_errno, flock, xdata);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+dht_lk2(xlator_t *this, xlator_t *subvol, call_frame_t *frame, int ret)</div><div class='add'>+{</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    int32_t op_errno = EINVAL;</div><div class='add'>+</div><div class='add'>+    if ((frame == NULL) || (frame-&gt;local == NULL))</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+</div><div class='add'>+    op_errno = local-&gt;op_errno;</div><div class='add'>+</div><div class='add'>+    if (subvol == NULL)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    local-&gt;call_cnt = 2; /* This is the second attempt */</div><div class='add'>+</div><div class='add'>+    STACK_WIND(frame, dht_lk_cbk, subvol, subvol-&gt;fops-&gt;lk, local-&gt;fd,</div><div class='add'>+               local-&gt;rebalance.lock_cmd, &amp;local-&gt;rebalance.flock,</div><div class='add'>+               local-&gt;xattr_req);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    DHT_STACK_UNWIND(lk, frame, -1, op_errno, NULL, NULL);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+dht_lk(call_frame_t *frame, xlator_t *this, fd_t *fd, int cmd,</div><div class='add'>+       struct gf_flock *flock, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    xlator_t *lock_subvol = NULL;</div><div class='add'>+    int op_errno = -1;</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+</div><div class='add'>+    VALIDATE_OR_GOTO(frame, err);</div><div class='add'>+    VALIDATE_OR_GOTO(this, err);</div><div class='add'>+    VALIDATE_OR_GOTO(fd, err);</div><div class='add'>+</div><div class='add'>+    local = dht_local_init(frame, NULL, fd, GF_FOP_LK);</div><div class='add'>+    if (!local) {</div><div class='add'>+        op_errno = ENOMEM;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    local-&gt;lock_type = flock-&gt;l_type;</div><div class='add'>+    lock_subvol = dht_get_lock_subvolume(this, flock, local);</div><div class='add'>+    if (!lock_subvol) {</div><div class='add'>+        gf_msg_debug(this-&gt;name, 0, "no lock subvolume for path=%p", fd);</div><div class='add'>+        op_errno = EINVAL;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /*</div><div class='add'>+            local-&gt;cached_subvol = lock_subvol;</div><div class='add'>+            ret = dht_check_and_open_fd_on_subvol (this, frame);</div><div class='add'>+            if (ret)</div><div class='add'>+                    goto err;</div><div class='add'>+    */</div><div class='add'>+    if (xdata)</div><div class='add'>+        local-&gt;xattr_req = dict_ref(xdata);</div><div class='add'>+</div><div class='add'>+    local-&gt;rebalance.flock = *flock;</div><div class='add'>+    local-&gt;rebalance.lock_cmd = cmd;</div><div class='add'>+</div><div class='add'>+    local-&gt;call_cnt = 1;</div><div class='add'>+</div><div class='add'>+    STACK_WIND(frame, dht_lk_cbk, lock_subvol, lock_subvol-&gt;fops-&gt;lk, fd, cmd,</div><div class='add'>+               flock, xdata);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+</div><div class='add'>+err:</div><div class='add'>+    op_errno = (op_errno == -1) ? errno : op_errno;</div><div class='add'>+    DHT_STACK_UNWIND(lk, frame, -1, op_errno, NULL, NULL);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+dht_lease_cbk(call_frame_t *frame, void *cookie, xlator_t *this, int op_ret,</div><div class='add'>+              int op_errno, struct gf_lease *lease, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    DHT_STACK_UNWIND(lease, frame, op_ret, op_errno, lease, xdata);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+dht_lease(call_frame_t *frame, xlator_t *this, loc_t *loc,</div><div class='add'>+          struct gf_lease *lease, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    xlator_t *subvol = NULL;</div><div class='add'>+    int op_errno = -1;</div><div class='add'>+</div><div class='add'>+    VALIDATE_OR_GOTO(frame, err);</div><div class='add'>+    VALIDATE_OR_GOTO(this, err);</div><div class='add'>+    VALIDATE_OR_GOTO(loc, err);</div><div class='add'>+</div><div class='add'>+    subvol = dht_subvol_get_cached(this, loc-&gt;inode);</div><div class='add'>+    if (!subvol) {</div><div class='add'>+        gf_msg_debug(this-&gt;name, 0, "no cached subvolume for path=%s",</div><div class='add'>+                     loc-&gt;path);</div><div class='add'>+        op_errno = EINVAL;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* TODO: for rebalance, we need to preserve the fop arguments */</div><div class='add'>+    STACK_WIND(frame, dht_lease_cbk, subvol, subvol-&gt;fops-&gt;lease, loc, lease,</div><div class='add'>+               xdata);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+</div><div class='add'>+err:</div><div class='add'>+    op_errno = (op_errno == -1) ? errno : op_errno;</div><div class='add'>+    DHT_STACK_UNWIND(lease, frame, -1, op_errno, NULL, NULL);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* Symlinks are currently not migrated, so no need for any check here */</div><div class='add'>+static int</div><div class='add'>+dht_readlink_cbk(call_frame_t *frame, void *cookie, xlator_t *this, int op_ret,</div><div class='add'>+                 int op_errno, const char *path, struct iatt *stbuf,</div><div class='add'>+                 dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    if (op_ret == -1)</div><div class='add'>+        goto err;</div><div class='add'>+</div><div class='add'>+    if (!local) {</div><div class='add'>+        op_ret = -1;</div><div class='add'>+        op_errno = EINVAL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+err:</div><div class='add'>+    DHT_STRIP_PHASE1_FLAGS(stbuf);</div><div class='add'>+    DHT_STACK_UNWIND(readlink, frame, op_ret, op_errno, path, stbuf, xdata);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+dht_readlink(call_frame_t *frame, xlator_t *this, loc_t *loc, size_t size,</div><div class='add'>+             dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    xlator_t *subvol = NULL;</div><div class='add'>+    int op_errno = -1;</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+</div><div class='add'>+    VALIDATE_OR_GOTO(frame, err);</div><div class='add'>+    VALIDATE_OR_GOTO(this, err);</div><div class='add'>+    VALIDATE_OR_GOTO(loc, err);</div><div class='add'>+    VALIDATE_OR_GOTO(loc-&gt;inode, err);</div><div class='add'>+    VALIDATE_OR_GOTO(loc-&gt;path, err);</div><div class='add'>+</div><div class='add'>+    local = dht_local_init(frame, loc, NULL, GF_FOP_READLINK);</div><div class='add'>+    if (!local) {</div><div class='add'>+        op_errno = ENOMEM;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    subvol = local-&gt;cached_subvol;</div><div class='add'>+    if (!subvol) {</div><div class='add'>+        gf_msg_debug(this-&gt;name, 0, "no cached subvolume for path=%s",</div><div class='add'>+                     loc-&gt;path);</div><div class='add'>+        op_errno = EINVAL;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    STACK_WIND(frame, dht_readlink_cbk, subvol, subvol-&gt;fops-&gt;readlink, loc,</div><div class='add'>+               size, xdata);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+</div><div class='add'>+err:</div><div class='add'>+    op_errno = (op_errno == -1) ? errno : op_errno;</div><div class='add'>+    DHT_STACK_UNWIND(readlink, frame, -1, op_errno, NULL, NULL, NULL);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* Get both DHT_IATT_IN_XDATA_KEY and DHT_MODE_IN_XDATA_KEY</div><div class='add'>+ * Use DHT_MODE_IN_XDATA_KEY if available, else fall back to</div><div class='add'>+ * DHT_IATT_IN_XDATA_KEY</div><div class='add'>+ * This will return a dummy iatt with only the mode and type set</div><div class='add'>+ */</div><div class='add'>+static int</div><div class='add'>+dht_read_iatt_from_xdata(dict_t *xdata, struct iatt *stbuf)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int32_t mode = 0;</div><div class='add'>+</div><div class='add'>+    ret = dict_get_int32(xdata, DHT_MODE_IN_XDATA_KEY, &amp;mode);</div><div class='add'>+</div><div class='add'>+    if (ret) {</div><div class='add'>+        ret = dict_get_bin(xdata, DHT_IATT_IN_XDATA_KEY, (void **)&amp;stbuf);</div><div class='add'>+    } else {</div><div class='add'>+        stbuf-&gt;ia_prot = ia_prot_from_st_mode(mode);</div><div class='add'>+        stbuf-&gt;ia_type = ia_type_from_st_mode(mode);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+dht_common_xattrop_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                       int32_t op_ret, int32_t op_errno, dict_t *dict,</div><div class='add'>+                       dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    call_frame_t *call_frame = NULL;</div><div class='add'>+    xlator_t *prev = NULL;</div><div class='add'>+    xlator_t *src_subvol = NULL;</div><div class='add'>+    xlator_t *dst_subvol = NULL;</div><div class='add'>+    struct iatt stbuf = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int ret = -1;</div><div class='add'>+    inode_t *inode = NULL;</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    call_frame = cookie;</div><div class='add'>+    prev = call_frame-&gt;this;</div><div class='add'>+</div><div class='add'>+    local-&gt;op_errno = op_errno;</div><div class='add'>+</div><div class='add'>+    if ((op_ret == -1) &amp;&amp; !dht_inode_missing(op_errno)) {</div><div class='add'>+        gf_msg_debug(this-&gt;name, op_errno, "subvolume %s returned -1.",</div><div class='add'>+                     prev-&gt;name);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (local-&gt;call_cnt != 1)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    if (dht_check_remote_fd_failed_error(local, op_ret, op_errno)) {</div><div class='add'>+        ret = dht_check_and_open_fd_on_subvol(this, frame);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dht_read_iatt_from_xdata(xdata, &amp;stbuf);</div><div class='add'>+</div><div class='add'>+    if ((!op_ret) &amp;&amp; (ret)) {</div><div class='add'>+        /* This is a potential problem and can cause corruption</div><div class='add'>+         * with sharding.</div><div class='add'>+         * Oh well. We tried.</div><div class='add'>+         */</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    local-&gt;op_ret = op_ret;</div><div class='add'>+    local-&gt;rebalance.target_op_fn = dht_common_xattrop2;</div><div class='add'>+    if (xdata)</div><div class='add'>+        local-&gt;rebalance.xdata = dict_ref(xdata);</div><div class='add'>+</div><div class='add'>+    if (dict)</div><div class='add'>+        local-&gt;rebalance.dict = dict_ref(dict);</div><div class='add'>+</div><div class='add'>+    /* Phase 2 of migration */</div><div class='add'>+    if ((op_ret == -1) || IS_DHT_MIGRATION_PHASE2(&amp;stbuf)) {</div><div class='add'>+        ret = dht_rebalance_complete_check(this, frame);</div><div class='add'>+        if (!ret)</div><div class='add'>+            return 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Check if the rebalance phase1 is true */</div><div class='add'>+    if (IS_DHT_MIGRATION_PHASE1(&amp;stbuf)) {</div><div class='add'>+        inode = local-&gt;loc.inode ? local-&gt;loc.inode : local-&gt;fd-&gt;inode;</div><div class='add'>+        dht_inode_ctx_get_mig_info(this, inode, &amp;src_subvol, &amp;dst_subvol);</div><div class='add'>+</div><div class='add'>+        if (dht_mig_info_is_invalid(local-&gt;cached_subvol, src_subvol,</div><div class='add'>+                                    dst_subvol) ||</div><div class='add'>+            !dht_fd_open_on_dst(this, local-&gt;fd, dst_subvol)) {</div><div class='add'>+            ret = dht_rebalance_in_progress_check(this, frame);</div><div class='add'>+            if (!ret)</div><div class='add'>+                return 0;</div><div class='add'>+        } else {</div><div class='add'>+            dht_common_xattrop2(this, dst_subvol, frame, 0);</div><div class='add'>+            return 0;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (local-&gt;fop == GF_FOP_XATTROP) {</div><div class='add'>+        DHT_STACK_UNWIND(xattrop, frame, op_ret, op_errno, dict, xdata);</div><div class='add'>+    } else {</div><div class='add'>+        DHT_STACK_UNWIND(fxattrop, frame, op_ret, op_errno, dict, xdata);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+dht_common_xattrop2(xlator_t *this, xlator_t *subvol, call_frame_t *frame,</div><div class='add'>+                    int ret)</div><div class='add'>+{</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    int32_t op_errno = EINVAL;</div><div class='add'>+</div><div class='add'>+    if ((frame == NULL) || (frame-&gt;local == NULL))</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    op_errno = local-&gt;op_errno;</div><div class='add'>+</div><div class='add'>+    if (we_are_not_migrating(ret)) {</div><div class='add'>+        /* This dht xlator is not migrating the file. Unwind and</div><div class='add'>+         * pass on the original mode bits so the higher DHT layer</div><div class='add'>+         * can handle this.</div><div class='add'>+         */</div><div class='add'>+        if (local-&gt;fop == GF_FOP_XATTROP) {</div><div class='add'>+            DHT_STACK_UNWIND(xattrop, frame, local-&gt;op_ret, op_errno,</div><div class='add'>+                             local-&gt;rebalance.dict, local-&gt;rebalance.xdata);</div><div class='add'>+        } else {</div><div class='add'>+            DHT_STACK_UNWIND(fxattrop, frame, local-&gt;op_ret, op_errno,</div><div class='add'>+                             local-&gt;rebalance.dict, local-&gt;rebalance.xdata);</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (subvol == NULL)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    local-&gt;call_cnt = 2; /* This is the second attempt */</div><div class='add'>+</div><div class='add'>+    if (local-&gt;fop == GF_FOP_XATTROP) {</div><div class='add'>+        STACK_WIND(frame, dht_common_xattrop_cbk, subvol, subvol-&gt;fops-&gt;xattrop,</div><div class='add'>+                   &amp;local-&gt;loc, local-&gt;rebalance.flags, local-&gt;rebalance.xattr,</div><div class='add'>+                   local-&gt;xattr_req);</div><div class='add'>+    } else {</div><div class='add'>+        STACK_WIND(frame, dht_common_xattrop_cbk, subvol,</div><div class='add'>+                   subvol-&gt;fops-&gt;fxattrop, local-&gt;fd, local-&gt;rebalance.flags,</div><div class='add'>+                   local-&gt;rebalance.xattr, local-&gt;xattr_req);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+</div><div class='add'>+    /* If local is unavailable we could be unwinding the wrong</div><div class='add'>+     * function here */</div><div class='add'>+</div><div class='add'>+    if (local &amp;&amp; (local-&gt;fop == GF_FOP_XATTROP)) {</div><div class='add'>+        DHT_STACK_UNWIND(xattrop, frame, -1, op_errno, NULL, NULL);</div><div class='add'>+    } else {</div><div class='add'>+        DHT_STACK_UNWIND(fxattrop, frame, -1, op_errno, NULL, NULL);</div><div class='add'>+    }</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+dht_xattrop_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                int32_t op_ret, int32_t op_errno, dict_t *dict, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    DHT_STACK_UNWIND(xattrop, frame, op_ret, op_errno, dict, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* Set both DHT_IATT_IN_XDATA_KEY and DHT_MODE_IN_XDATA_KEY</div><div class='add'>+ * Use DHT_MODE_IN_XDATA_KEY if available. Else fall back to</div><div class='add'>+ * DHT_IATT_IN_XDATA_KEY</div><div class='add'>+ */</div><div class='add'>+static int</div><div class='add'>+dht_request_iatt_in_xdata(dict_t *xattr_req)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    ret = dict_set_int8(xattr_req, DHT_MODE_IN_XDATA_KEY, 1);</div><div class='add'>+    ret = dict_set_int8(xattr_req, DHT_IATT_IN_XDATA_KEY, 1);</div><div class='add'>+</div><div class='add'>+    /* At least one call succeeded */</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+dht_xattrop(call_frame_t *frame, xlator_t *this, loc_t *loc,</div><div class='add'>+            gf_xattrop_flags_t flags, dict_t *dict, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    xlator_t *subvol = NULL;</div><div class='add'>+    int op_errno = -1;</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    VALIDATE_OR_GOTO(frame, err);</div><div class='add'>+    VALIDATE_OR_GOTO(this, err);</div><div class='add'>+    VALIDATE_OR_GOTO(loc, err);</div><div class='add'>+    VALIDATE_OR_GOTO(loc-&gt;inode, err);</div><div class='add'>+</div><div class='add'>+    local = dht_local_init(frame, loc, NULL, GF_FOP_XATTROP);</div><div class='add'>+    if (!local) {</div><div class='add'>+        op_errno = ENOMEM;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    subvol = local-&gt;cached_subvol;</div><div class='add'>+    if (!subvol) {</div><div class='add'>+        gf_msg_debug(this-&gt;name, 0, "no cached subvolume for gfid=%s",</div><div class='add'>+                     uuid_utoa(loc-&gt;inode-&gt;gfid));</div><div class='add'>+        op_errno = EINVAL;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Todo : Handle dirs as well. At the moment the only xlator above dht</div><div class='add'>+     * that uses xattrop is sharding and that is only for files */</div><div class='add'>+</div><div class='add'>+    if (IA_ISDIR(loc-&gt;inode-&gt;ia_type)) {</div><div class='add'>+        STACK_WIND(frame, dht_xattrop_cbk, subvol, subvol-&gt;fops-&gt;xattrop, loc,</div><div class='add'>+                   flags, dict, xdata);</div><div class='add'>+</div><div class='add'>+    } else {</div><div class='add'>+        local-&gt;xattr_req = xdata ? dict_ref(xdata) : dict_new();</div><div class='add'>+        local-&gt;call_cnt = 1;</div><div class='add'>+</div><div class='add'>+        local-&gt;rebalance.xattr = dict_ref(dict);</div><div class='add'>+        local-&gt;rebalance.flags = flags;</div><div class='add'>+</div><div class='add'>+        ret = dht_request_iatt_in_xdata(local-&gt;xattr_req);</div><div class='add'>+</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_msg_debug(this-&gt;name, 0,</div><div class='add'>+                         "Failed to set dictionary key %s file=%s",</div><div class='add'>+                         DHT_IATT_IN_XDATA_KEY, loc-&gt;path);</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        STACK_WIND(frame, dht_common_xattrop_cbk, subvol, subvol-&gt;fops-&gt;xattrop,</div><div class='add'>+                   loc, local-&gt;rebalance.flags, local-&gt;rebalance.xattr,</div><div class='add'>+                   local-&gt;xattr_req);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+</div><div class='add'>+err:</div><div class='add'>+    op_errno = (op_errno == -1) ? errno : op_errno;</div><div class='add'>+    DHT_STACK_UNWIND(xattrop, frame, -1, op_errno, NULL, NULL);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+dht_fxattrop_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                 int32_t op_ret, int32_t op_errno, dict_t *dict, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    DHT_STACK_UNWIND(fxattrop, frame, op_ret, op_errno, dict, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+dht_fxattrop(call_frame_t *frame, xlator_t *this, fd_t *fd,</div><div class='add'>+             gf_xattrop_flags_t flags, dict_t *dict, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    xlator_t *subvol = NULL;</div><div class='add'>+    int op_errno = -1;</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    VALIDATE_OR_GOTO(frame, err);</div><div class='add'>+    VALIDATE_OR_GOTO(this, err);</div><div class='add'>+    VALIDATE_OR_GOTO(fd, err);</div><div class='add'>+</div><div class='add'>+    subvol = dht_subvol_get_cached(this, fd-&gt;inode);</div><div class='add'>+    if (!subvol) {</div><div class='add'>+        gf_msg_debug(this-&gt;name, 0, "no cached subvolume for fd=%p", fd);</div><div class='add'>+        op_errno = EINVAL;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    local = dht_local_init(frame, NULL, fd, GF_FOP_FXATTROP);</div><div class='add'>+    if (!local) {</div><div class='add'>+        op_errno = ENOMEM;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Todo : Handle dirs as well. At the moment the only xlator above dht</div><div class='add'>+     * that uses xattrop is sharding and that is only for files */</div><div class='add'>+</div><div class='add'>+    if (IA_ISDIR(fd-&gt;inode-&gt;ia_type)) {</div><div class='add'>+        STACK_WIND(frame, dht_fxattrop_cbk, subvol, subvol-&gt;fops-&gt;fxattrop, fd,</div><div class='add'>+                   flags, dict, xdata);</div><div class='add'>+</div><div class='add'>+    } else {</div><div class='add'>+        local-&gt;xattr_req = xdata ? dict_ref(xdata) : dict_new();</div><div class='add'>+        local-&gt;call_cnt = 1;</div><div class='add'>+</div><div class='add'>+        local-&gt;rebalance.xattr = dict_ref(dict);</div><div class='add'>+        local-&gt;rebalance.flags = flags;</div><div class='add'>+</div><div class='add'>+        ret = dht_request_iatt_in_xdata(local-&gt;xattr_req);</div><div class='add'>+</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_msg_debug(this-&gt;name, 0, "Failed to set dictionary key %s fd=%p",</div><div class='add'>+                         DHT_IATT_IN_XDATA_KEY, fd);</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        STACK_WIND(frame, dht_common_xattrop_cbk, subvol,</div><div class='add'>+                   subvol-&gt;fops-&gt;fxattrop, fd, local-&gt;rebalance.flags,</div><div class='add'>+                   local-&gt;rebalance.xattr, local-&gt;xattr_req);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+</div><div class='add'>+err:</div><div class='add'>+    op_errno = (op_errno == -1) ? errno : op_errno;</div><div class='add'>+    DHT_STACK_UNWIND(fxattrop, frame, -1, op_errno, NULL, NULL);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* Currently no translators on top of 'distribute' will be using</div><div class='add'>+ * below fops, hence not implementing 'migration' related checks</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+dht_inodelk_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                int32_t op_ret, int32_t op_errno, dict_t *xdata)</div><div class='add'>+</div><div class='add'>+{</div><div class='add'>+    dht_lk_inode_unref(frame, op_ret);</div><div class='add'>+    DHT_STACK_UNWIND(inodelk, frame, op_ret, op_errno, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+dht_inodelk(call_frame_t *frame, xlator_t *this, const char *volume, loc_t *loc,</div><div class='add'>+            int32_t cmd, struct gf_flock *lock, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    xlator_t *lock_subvol = NULL;</div><div class='add'>+    int op_errno = -1;</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+</div><div class='add'>+    VALIDATE_OR_GOTO(frame, err);</div><div class='add'>+    VALIDATE_OR_GOTO(this, err);</div><div class='add'>+    VALIDATE_OR_GOTO(loc, err);</div><div class='add'>+    VALIDATE_OR_GOTO(loc-&gt;inode, err);</div><div class='add'>+</div><div class='add'>+    local = dht_local_init(frame, loc, NULL, GF_FOP_INODELK);</div><div class='add'>+    if (!local) {</div><div class='add'>+        op_errno = ENOMEM;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    local-&gt;lock_type = lock-&gt;l_type;</div><div class='add'>+    lock_subvol = dht_get_lock_subvolume(this, lock, local);</div><div class='add'>+    if (!lock_subvol) {</div><div class='add'>+        gf_msg_debug(this-&gt;name, 0, "no lock subvolume for path=%s", loc-&gt;path);</div><div class='add'>+        op_errno = EINVAL;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    local-&gt;call_cnt = 1;</div><div class='add'>+</div><div class='add'>+    STACK_WIND(frame, dht_inodelk_cbk, lock_subvol, lock_subvol-&gt;fops-&gt;inodelk,</div><div class='add'>+               volume, loc, cmd, lock, xdata);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+</div><div class='add'>+err:</div><div class='add'>+    op_errno = (op_errno == -1) ? errno : op_errno;</div><div class='add'>+    DHT_STACK_UNWIND(inodelk, frame, -1, op_errno, NULL);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+dht_finodelk_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                 int32_t op_ret, int32_t op_errno, dict_t *xdata)</div><div class='add'>+</div><div class='add'>+{</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    GF_VALIDATE_OR_GOTO("dht", frame, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("dht", this, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("dht", frame-&gt;local, out);</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+</div><div class='add'>+    if (dht_check_remote_fd_failed_error(local, op_ret, op_errno)) {</div><div class='add'>+        ret = dht_check_and_open_fd_on_subvol(this, frame);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    dht_lk_inode_unref(frame, op_ret);</div><div class='add'>+    DHT_STACK_UNWIND(finodelk, frame, op_ret, op_errno, xdata);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+dht_finodelk(call_frame_t *frame, xlator_t *this, const char *volume, fd_t *fd,</div><div class='add'>+             int32_t cmd, struct gf_flock *lock, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    xlator_t *lock_subvol = NULL;</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    int op_errno = -1;</div><div class='add'>+</div><div class='add'>+    VALIDATE_OR_GOTO(frame, err);</div><div class='add'>+    VALIDATE_OR_GOTO(this, err);</div><div class='add'>+    VALIDATE_OR_GOTO(fd, err);</div><div class='add'>+</div><div class='add'>+    local = dht_local_init(frame, NULL, fd, GF_FOP_INODELK);</div><div class='add'>+    if (!local) {</div><div class='add'>+        op_errno = ENOMEM;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    local-&gt;call_cnt = 1;</div><div class='add'>+    local-&gt;lock_type = lock-&gt;l_type;</div><div class='add'>+</div><div class='add'>+    lock_subvol = dht_get_lock_subvolume(this, lock, local);</div><div class='add'>+    if (!lock_subvol) {</div><div class='add'>+        gf_msg_debug(this-&gt;name, 0, "no lock subvolume for fd=%p", fd);</div><div class='add'>+        op_errno = EINVAL;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /*</div><div class='add'>+            local-&gt;cached_subvol = lock_subvol;</div><div class='add'>+            ret = dht_check_and_open_fd_on_subvol (this, frame);</div><div class='add'>+            if (ret)</div><div class='add'>+                    goto err;</div><div class='add'>+    */</div><div class='add'>+    local-&gt;rebalance.flock = *lock;</div><div class='add'>+    local-&gt;rebalance.lock_cmd = cmd;</div><div class='add'>+    local-&gt;key = gf_strdup(volume);</div><div class='add'>+</div><div class='add'>+    if (xdata)</div><div class='add'>+        local-&gt;xattr_req = dict_ref(xdata);</div><div class='add'>+</div><div class='add'>+    STACK_WIND(frame, dht_finodelk_cbk, lock_subvol,</div><div class='add'>+               lock_subvol-&gt;fops-&gt;finodelk, volume, fd, cmd, lock, xdata);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+</div><div class='add'>+err:</div><div class='add'>+    op_errno = (op_errno == -1) ? errno : op_errno;</div><div class='add'>+    DHT_STACK_UNWIND(finodelk, frame, -1, op_errno, NULL);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='head'>diff --git a/xlators/cluster/dht/src/dht-inode-write.c b/xlators/cluster/dht/src/dht-inode-write.c<br/>new file mode 100644<br/>index 00000000000..2f23ce90fbd<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/xlators/cluster/dht/src/dht-inode-write.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>xlators/cluster/dht/src/dht-inode-write.c</a></div><div class='hunk'>@@ -0,0 +1,1404 @@</div><div class='add'>+/*</div><div class='add'>+  Copyright (c) 2008-2012 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#include "dht-common.h"</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+dht_writev2(xlator_t *this, xlator_t *subvol, call_frame_t *frame, int ret);</div><div class='add'>+static int</div><div class='add'>+dht_truncate2(xlator_t *this, xlator_t *subvol, call_frame_t *frame, int ret);</div><div class='add'>+static int</div><div class='add'>+dht_setattr2(xlator_t *this, xlator_t *subvol, call_frame_t *frame, int ret);</div><div class='add'>+static int</div><div class='add'>+dht_fallocate2(xlator_t *this, xlator_t *subvol, call_frame_t *frame, int ret);</div><div class='add'>+static int</div><div class='add'>+dht_discard2(xlator_t *this, xlator_t *subvol, call_frame_t *frame, int ret);</div><div class='add'>+static int</div><div class='add'>+dht_zerofill2(xlator_t *this, xlator_t *subvol, call_frame_t *frame, int ret);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+dht_writev_cbk(call_frame_t *frame, void *cookie, xlator_t *this, int op_ret,</div><div class='add'>+               int op_errno, struct iatt *prebuf, struct iatt *postbuf,</div><div class='add'>+               dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    xlator_t *prev = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    xlator_t *subvol1 = NULL;</div><div class='add'>+    xlator_t *subvol2 = NULL;</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    prev = cookie;</div><div class='add'>+</div><div class='add'>+    if (!local) {</div><div class='add'>+        op_ret = -1;</div><div class='add'>+        op_errno = EINVAL;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* writev fails with EBADF if dht has not yet opened the fd</div><div class='add'>+     * on the cached subvol. This could happen if the file was migrated</div><div class='add'>+     * and a lookup updated the cached subvol in the inode ctx.</div><div class='add'>+     * We only check once as this could be a valid bad fd error.</div><div class='add'>+     */</div><div class='add'>+</div><div class='add'>+    if (dht_check_remote_fd_failed_error(local, op_ret, op_errno)) {</div><div class='add'>+        ret = dht_check_and_open_fd_on_subvol(this, frame);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (op_ret == -1 &amp;&amp; !dht_inode_missing(op_errno)) {</div><div class='add'>+        local-&gt;op_errno = op_errno;</div><div class='add'>+        local-&gt;op_ret = -1;</div><div class='add'>+        gf_msg_debug(this-&gt;name, 0, "subvolume %s returned -1 (%s)", prev-&gt;name,</div><div class='add'>+                     strerror(op_errno));</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (local-&gt;call_cnt != 1) {</div><div class='add'>+        /* preserve the modes of source */</div><div class='add'>+        if (local-&gt;stbuf.ia_blocks) {</div><div class='add'>+            dht_iatt_merge(this, postbuf, &amp;local-&gt;stbuf);</div><div class='add'>+            dht_iatt_merge(this, prebuf, &amp;local-&gt;prebuf);</div><div class='add'>+        }</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    local-&gt;rebalance.target_op_fn = dht_writev2;</div><div class='add'>+</div><div class='add'>+    local-&gt;op_ret = op_ret;</div><div class='add'>+    local-&gt;op_errno = op_errno;</div><div class='add'>+</div><div class='add'>+    /* We might need to pass the stbuf information to the higher DHT</div><div class='add'>+     * layer for appropriate handling.</div><div class='add'>+     */</div><div class='add'>+</div><div class='add'>+    dht_set_local_rebalance(this, local, NULL, prebuf, postbuf, xdata);</div><div class='add'>+</div><div class='add'>+    /* Phase 2 of migration */</div><div class='add'>+    if ((op_ret == -1) || IS_DHT_MIGRATION_PHASE2(postbuf)) {</div><div class='add'>+        ret = dht_rebalance_complete_check(this, frame);</div><div class='add'>+        if (!ret)</div><div class='add'>+            return 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Check if the rebalance phase1 is true */</div><div class='add'>+    if (IS_DHT_MIGRATION_PHASE1(postbuf)) {</div><div class='add'>+        if (!local-&gt;xattr_req) {</div><div class='add'>+            local-&gt;xattr_req = dict_new();</div><div class='add'>+            if (!local-&gt;xattr_req) {</div><div class='add'>+                gf_msg(this-&gt;name, GF_LOG_ERROR, DHT_MSG_NO_MEMORY, ENOMEM,</div><div class='add'>+                       "insufficient memory");</div><div class='add'>+                local-&gt;op_errno = ENOMEM;</div><div class='add'>+                local-&gt;op_ret = -1;</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        ret = dict_set_uint32(local-&gt;xattr_req, GF_PROTECT_FROM_EXTERNAL_WRITES,</div><div class='add'>+                              1);</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, DHT_MSG_DICT_SET_FAILED, 0,</div><div class='add'>+                   "Failed to set key %s in dictionary",</div><div class='add'>+                   GF_PROTECT_FROM_EXTERNAL_WRITES);</div><div class='add'>+            local-&gt;op_errno = ENOMEM;</div><div class='add'>+            local-&gt;op_ret = -1;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        dht_iatt_merge(this, &amp;local-&gt;stbuf, postbuf);</div><div class='add'>+        dht_iatt_merge(this, &amp;local-&gt;prebuf, prebuf);</div><div class='add'>+</div><div class='add'>+        ret = dht_inode_ctx_get_mig_info(this, local-&gt;fd-&gt;inode, &amp;subvol1,</div><div class='add'>+                                         &amp;subvol2);</div><div class='add'>+        if (!dht_mig_info_is_invalid(local-&gt;cached_subvol, subvol1, subvol2)) {</div><div class='add'>+            if (dht_fd_open_on_dst(this, local-&gt;fd, subvol2)) {</div><div class='add'>+                dht_writev2(this, subvol2, frame, 0);</div><div class='add'>+                return 0;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+        ret = dht_rebalance_in_progress_check(this, frame);</div><div class='add'>+        if (!ret)</div><div class='add'>+            return 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    DHT_STRIP_PHASE1_FLAGS(postbuf);</div><div class='add'>+    DHT_STRIP_PHASE1_FLAGS(prebuf);</div><div class='add'>+</div><div class='add'>+    DHT_STACK_UNWIND(writev, frame, op_ret, op_errno, prebuf, postbuf, xdata);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+dht_writev2(xlator_t *this, xlator_t *subvol, call_frame_t *frame, int ret)</div><div class='add'>+{</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    int32_t op_errno = EINVAL;</div><div class='add'>+</div><div class='add'>+    if ((frame == NULL) || (frame-&gt;local == NULL))</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    op_errno = local-&gt;op_errno;</div><div class='add'>+</div><div class='add'>+    if (we_are_not_migrating(ret)) {</div><div class='add'>+        /* This dht xlator is not migrating the file. Unwind and</div><div class='add'>+         * pass on the original mode bits so the higher DHT layer</div><div class='add'>+         * can handle this.</div><div class='add'>+         */</div><div class='add'>+        DHT_STACK_UNWIND(writev, frame, local-&gt;op_ret, local-&gt;op_errno,</div><div class='add'>+                         &amp;local-&gt;rebalance.prebuf, &amp;local-&gt;rebalance.postbuf,</div><div class='add'>+                         local-&gt;rebalance.xdata);</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (subvol == NULL)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    local-&gt;call_cnt = 2; /* This is the second attempt */</div><div class='add'>+</div><div class='add'>+    STACK_WIND_COOKIE(frame, dht_writev_cbk, subvol, subvol,</div><div class='add'>+                      subvol-&gt;fops-&gt;writev, local-&gt;fd, local-&gt;rebalance.vector,</div><div class='add'>+                      local-&gt;rebalance.count, local-&gt;rebalance.offset,</div><div class='add'>+                      local-&gt;rebalance.flags, local-&gt;rebalance.iobref,</div><div class='add'>+                      local-&gt;xattr_req);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    DHT_STACK_UNWIND(writev, frame, -1, op_errno, NULL, NULL, NULL);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+dht_writev(call_frame_t *frame, xlator_t *this, fd_t *fd, struct iovec *vector,</div><div class='add'>+           int count, off_t off, uint32_t flags, struct iobref *iobref,</div><div class='add'>+           dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    xlator_t *subvol = NULL;</div><div class='add'>+    int op_errno = -1;</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+</div><div class='add'>+    VALIDATE_OR_GOTO(frame, err);</div><div class='add'>+    VALIDATE_OR_GOTO(this, err);</div><div class='add'>+    VALIDATE_OR_GOTO(fd, err);</div><div class='add'>+</div><div class='add'>+    local = dht_local_init(frame, NULL, fd, GF_FOP_WRITE);</div><div class='add'>+    if (!local) {</div><div class='add'>+        op_errno = ENOMEM;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    subvol = local-&gt;cached_subvol;</div><div class='add'>+    if (!subvol) {</div><div class='add'>+        gf_msg_debug(this-&gt;name, 0, "no cached subvolume for fd=%p", fd);</div><div class='add'>+        op_errno = EINVAL;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (xdata)</div><div class='add'>+        local-&gt;xattr_req = dict_ref(xdata);</div><div class='add'>+</div><div class='add'>+    local-&gt;rebalance.vector = iov_dup(vector, count);</div><div class='add'>+    local-&gt;rebalance.offset = off;</div><div class='add'>+    local-&gt;rebalance.count = count;</div><div class='add'>+    local-&gt;rebalance.flags = flags;</div><div class='add'>+    local-&gt;rebalance.iobref = iobref_ref(iobref);</div><div class='add'>+    local-&gt;call_cnt = 1;</div><div class='add'>+</div><div class='add'>+    STACK_WIND_COOKIE(frame, dht_writev_cbk, subvol, subvol,</div><div class='add'>+                      subvol-&gt;fops-&gt;writev, fd, local-&gt;rebalance.vector,</div><div class='add'>+                      local-&gt;rebalance.count, local-&gt;rebalance.offset,</div><div class='add'>+                      local-&gt;rebalance.flags, local-&gt;rebalance.iobref,</div><div class='add'>+                      local-&gt;xattr_req);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+</div><div class='add'>+err:</div><div class='add'>+    op_errno = (op_errno == -1) ? errno : op_errno;</div><div class='add'>+    DHT_STACK_UNWIND(writev, frame, -1, op_errno, NULL, NULL, NULL);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+dht_truncate_cbk(call_frame_t *frame, void *cookie, xlator_t *this, int op_ret,</div><div class='add'>+                 int op_errno, struct iatt *prebuf, struct iatt *postbuf,</div><div class='add'>+                 dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    xlator_t *prev = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    xlator_t *src_subvol = NULL;</div><div class='add'>+    xlator_t *dst_subvol = NULL;</div><div class='add'>+    inode_t *inode = NULL;</div><div class='add'>+</div><div class='add'>+    GF_VALIDATE_OR_GOTO("dht", frame, err);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("dht", this, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("dht", frame-&gt;local, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("dht", cookie, out);</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    prev = cookie;</div><div class='add'>+</div><div class='add'>+    /* Needs to be checked only for ftruncate.</div><div class='add'>+     * ftruncate fails with EBADF/EINVAL if dht has not yet opened the fd</div><div class='add'>+     * on the cached subvol. This could happen if the file was migrated</div><div class='add'>+     * and a lookup updated the cached subvol in the inode ctx.</div><div class='add'>+     * We only check once as this could actually be a valid error.</div><div class='add'>+     */</div><div class='add'>+</div><div class='add'>+    if ((local-&gt;fop == GF_FOP_FTRUNCATE) &amp;&amp;</div><div class='add'>+        dht_check_remote_fd_failed_error(local, op_ret, op_errno)) {</div><div class='add'>+        ret = dht_check_and_open_fd_on_subvol(this, frame);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if ((op_ret == -1) &amp;&amp; !dht_inode_missing(op_errno)) {</div><div class='add'>+        local-&gt;op_errno = op_errno;</div><div class='add'>+        local-&gt;op_ret = -1;</div><div class='add'>+        gf_msg_debug(this-&gt;name, op_errno, "subvolume %s returned -1",</div><div class='add'>+                     prev-&gt;name);</div><div class='add'>+</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (local-&gt;call_cnt != 1) {</div><div class='add'>+        if (local-&gt;stbuf.ia_blocks) {</div><div class='add'>+            dht_iatt_merge(this, postbuf, &amp;local-&gt;stbuf);</div><div class='add'>+            dht_iatt_merge(this, prebuf, &amp;local-&gt;prebuf);</div><div class='add'>+        }</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    local-&gt;rebalance.target_op_fn = dht_truncate2;</div><div class='add'>+</div><div class='add'>+    local-&gt;op_ret = op_ret;</div><div class='add'>+    local-&gt;op_errno = op_errno;</div><div class='add'>+</div><div class='add'>+    /* We might need to pass the stbuf information to the higher DHT</div><div class='add'>+     * layer for appropriate handling.</div><div class='add'>+     */</div><div class='add'>+</div><div class='add'>+    dht_set_local_rebalance(this, local, NULL, prebuf, postbuf, xdata);</div><div class='add'>+</div><div class='add'>+    /* Phase 2 of migration */</div><div class='add'>+    if ((op_ret == -1) || IS_DHT_MIGRATION_PHASE2(postbuf)) {</div><div class='add'>+        ret = dht_rebalance_complete_check(this, frame);</div><div class='add'>+        if (!ret)</div><div class='add'>+            return 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Check if the rebalance phase1 is true */</div><div class='add'>+    if (IS_DHT_MIGRATION_PHASE1(postbuf)) {</div><div class='add'>+        dht_iatt_merge(this, &amp;local-&gt;stbuf, postbuf);</div><div class='add'>+        dht_iatt_merge(this, &amp;local-&gt;prebuf, prebuf);</div><div class='add'>+</div><div class='add'>+        inode = (local-&gt;fd) ? local-&gt;fd-&gt;inode : local-&gt;loc.inode;</div><div class='add'>+</div><div class='add'>+        dht_inode_ctx_get_mig_info(this, inode, &amp;src_subvol, &amp;dst_subvol);</div><div class='add'>+        if (!dht_mig_info_is_invalid(local-&gt;cached_subvol, src_subvol,</div><div class='add'>+                                     dst_subvol)) {</div><div class='add'>+            if ((!local-&gt;fd) ||</div><div class='add'>+                ((local-&gt;fd) &amp;&amp;</div><div class='add'>+                 dht_fd_open_on_dst(this, local-&gt;fd, dst_subvol))) {</div><div class='add'>+                dht_truncate2(this, dst_subvol, frame, 0);</div><div class='add'>+                return 0;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+        ret = dht_rebalance_in_progress_check(this, frame);</div><div class='add'>+        if (!ret)</div><div class='add'>+            return 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    DHT_STRIP_PHASE1_FLAGS(postbuf);</div><div class='add'>+    DHT_STRIP_PHASE1_FLAGS(prebuf);</div><div class='add'>+</div><div class='add'>+    DHT_STACK_UNWIND(truncate, frame, op_ret, op_errno, prebuf, postbuf, xdata);</div><div class='add'>+err:</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+dht_truncate2(xlator_t *this, xlator_t *subvol, call_frame_t *frame, int ret)</div><div class='add'>+{</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    int32_t op_errno = EINVAL;</div><div class='add'>+</div><div class='add'>+    if (!frame || !frame-&gt;local)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    op_errno = local-&gt;op_errno;</div><div class='add'>+</div><div class='add'>+    /* This dht xlator is not migrating the file  */</div><div class='add'>+    if (we_are_not_migrating(ret)) {</div><div class='add'>+        DHT_STACK_UNWIND(truncate, frame, local-&gt;op_ret, local-&gt;op_errno,</div><div class='add'>+                         &amp;local-&gt;rebalance.prebuf, &amp;local-&gt;rebalance.postbuf,</div><div class='add'>+                         local-&gt;rebalance.xdata);</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (subvol == NULL)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    local-&gt;call_cnt = 2; /* This is the second attempt */</div><div class='add'>+</div><div class='add'>+    if (local-&gt;fop == GF_FOP_TRUNCATE) {</div><div class='add'>+        STACK_WIND_COOKIE(frame, dht_truncate_cbk, subvol, subvol,</div><div class='add'>+                          subvol-&gt;fops-&gt;truncate, &amp;local-&gt;loc,</div><div class='add'>+                          local-&gt;rebalance.offset, local-&gt;xattr_req);</div><div class='add'>+    } else {</div><div class='add'>+        STACK_WIND_COOKIE(frame, dht_truncate_cbk, subvol, subvol,</div><div class='add'>+                          subvol-&gt;fops-&gt;ftruncate, local-&gt;fd,</div><div class='add'>+                          local-&gt;rebalance.offset, local-&gt;xattr_req);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    DHT_STACK_UNWIND(truncate, frame, -1, op_errno, NULL, NULL, NULL);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+dht_truncate(call_frame_t *frame, xlator_t *this, loc_t *loc, off_t offset,</div><div class='add'>+             dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    xlator_t *subvol = NULL;</div><div class='add'>+    int op_errno = -1;</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+</div><div class='add'>+    VALIDATE_OR_GOTO(frame, err);</div><div class='add'>+    VALIDATE_OR_GOTO(this, err);</div><div class='add'>+    VALIDATE_OR_GOTO(loc, err);</div><div class='add'>+    VALIDATE_OR_GOTO(loc-&gt;inode, err);</div><div class='add'>+</div><div class='add'>+    local = dht_local_init(frame, loc, NULL, GF_FOP_TRUNCATE);</div><div class='add'>+    if (!local) {</div><div class='add'>+        op_errno = ENOMEM;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    local-&gt;rebalance.offset = offset;</div><div class='add'>+    local-&gt;call_cnt = 1;</div><div class='add'>+    subvol = local-&gt;cached_subvol;</div><div class='add'>+    if (!subvol) {</div><div class='add'>+        gf_msg_debug(this-&gt;name, 0, "no cached subvolume for gfid=%s",</div><div class='add'>+                     uuid_utoa(loc-&gt;inode-&gt;gfid));</div><div class='add'>+        op_errno = EINVAL;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (xdata)</div><div class='add'>+        local-&gt;xattr_req = dict_ref(xdata);</div><div class='add'>+</div><div class='add'>+    STACK_WIND_COOKIE(frame, dht_truncate_cbk, subvol, subvol,</div><div class='add'>+                      subvol-&gt;fops-&gt;truncate, loc, offset, xdata);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+</div><div class='add'>+err:</div><div class='add'>+    op_errno = (op_errno == -1) ? errno : op_errno;</div><div class='add'>+    DHT_STACK_UNWIND(truncate, frame, -1, op_errno, NULL, NULL, NULL);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+dht_ftruncate(call_frame_t *frame, xlator_t *this, fd_t *fd, off_t offset,</div><div class='add'>+              dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    xlator_t *subvol = NULL;</div><div class='add'>+    int op_errno = -1;</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+</div><div class='add'>+    VALIDATE_OR_GOTO(frame, err);</div><div class='add'>+    VALIDATE_OR_GOTO(this, err);</div><div class='add'>+    VALIDATE_OR_GOTO(fd, err);</div><div class='add'>+</div><div class='add'>+    local = dht_local_init(frame, NULL, fd, GF_FOP_FTRUNCATE);</div><div class='add'>+    if (!local) {</div><div class='add'>+        op_errno = ENOMEM;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    local-&gt;rebalance.offset = offset;</div><div class='add'>+    local-&gt;call_cnt = 1;</div><div class='add'>+    subvol = local-&gt;cached_subvol;</div><div class='add'>+    if (!subvol) {</div><div class='add'>+        gf_msg_debug(this-&gt;name, 0, "no cached subvolume for fd=%p", fd);</div><div class='add'>+        op_errno = EINVAL;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (xdata)</div><div class='add'>+        local-&gt;xattr_req = dict_ref(xdata);</div><div class='add'>+</div><div class='add'>+    STACK_WIND_COOKIE(frame, dht_truncate_cbk, subvol, subvol,</div><div class='add'>+                      subvol-&gt;fops-&gt;ftruncate, fd, local-&gt;rebalance.offset,</div><div class='add'>+                      local-&gt;xattr_req);</div><div class='add'>+    return 0;</div><div class='add'>+</div><div class='add'>+err:</div><div class='add'>+    op_errno = (op_errno == -1) ? errno : op_errno;</div><div class='add'>+    DHT_STACK_UNWIND(ftruncate, frame, -1, op_errno, NULL, NULL, NULL);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+dht_fallocate_cbk(call_frame_t *frame, void *cookie, xlator_t *this, int op_ret,</div><div class='add'>+                  int op_errno, struct iatt *prebuf, struct iatt *postbuf,</div><div class='add'>+                  dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    xlator_t *prev = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    xlator_t *src_subvol = NULL;</div><div class='add'>+    xlator_t *dst_subvol = NULL;</div><div class='add'>+</div><div class='add'>+    GF_VALIDATE_OR_GOTO("dht", frame, err);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("dht", this, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("dht", frame-&gt;local, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("dht", cookie, out);</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    prev = cookie;</div><div class='add'>+</div><div class='add'>+    /* fallocate fails with EBADF if dht has not yet opened the fd</div><div class='add'>+     * on the cached subvol. This could happen if the file was migrated</div><div class='add'>+     * and a lookup updated the cached subvol in the inode ctx.</div><div class='add'>+     * We only check once as this could actually be a valid error.</div><div class='add'>+     */</div><div class='add'>+</div><div class='add'>+    if (dht_check_remote_fd_failed_error(local, op_ret, op_errno)) {</div><div class='add'>+        ret = dht_check_and_open_fd_on_subvol(this, frame);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if ((op_ret == -1) &amp;&amp; !dht_inode_missing(op_errno)) {</div><div class='add'>+        local-&gt;op_errno = op_errno;</div><div class='add'>+        local-&gt;op_ret = -1;</div><div class='add'>+        gf_msg_debug(this-&gt;name, op_errno, "subvolume %s returned -1",</div><div class='add'>+                     prev-&gt;name);</div><div class='add'>+</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (local-&gt;call_cnt != 1) {</div><div class='add'>+        if (local-&gt;stbuf.ia_blocks) {</div><div class='add'>+            dht_iatt_merge(this, postbuf, &amp;local-&gt;stbuf);</div><div class='add'>+            dht_iatt_merge(this, prebuf, &amp;local-&gt;prebuf);</div><div class='add'>+        }</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    local-&gt;op_ret = op_ret;</div><div class='add'>+    local-&gt;op_errno = op_errno;</div><div class='add'>+    local-&gt;rebalance.target_op_fn = dht_fallocate2;</div><div class='add'>+</div><div class='add'>+    dht_set_local_rebalance(this, local, NULL, prebuf, postbuf, xdata);</div><div class='add'>+</div><div class='add'>+    /* Phase 2 of migration */</div><div class='add'>+    if ((op_ret == -1) || IS_DHT_MIGRATION_PHASE2(postbuf)) {</div><div class='add'>+        ret = dht_rebalance_complete_check(this, frame);</div><div class='add'>+        if (!ret)</div><div class='add'>+            return 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Check if the rebalance phase1 is true */</div><div class='add'>+    if (IS_DHT_MIGRATION_PHASE1(postbuf)) {</div><div class='add'>+        dht_iatt_merge(this, &amp;local-&gt;stbuf, postbuf);</div><div class='add'>+        dht_iatt_merge(this, &amp;local-&gt;prebuf, prebuf);</div><div class='add'>+</div><div class='add'>+        dht_inode_ctx_get_mig_info(this, local-&gt;fd-&gt;inode, &amp;src_subvol,</div><div class='add'>+                                   &amp;dst_subvol);</div><div class='add'>+        if (!dht_mig_info_is_invalid(local-&gt;cached_subvol, src_subvol,</div><div class='add'>+                                     dst_subvol)) {</div><div class='add'>+            if (dht_fd_open_on_dst(this, local-&gt;fd, dst_subvol)) {</div><div class='add'>+                dht_fallocate2(this, dst_subvol, frame, 0);</div><div class='add'>+                return 0;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+        ret = dht_rebalance_in_progress_check(this, frame);</div><div class='add'>+        if (!ret)</div><div class='add'>+            return 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    DHT_STRIP_PHASE1_FLAGS(postbuf);</div><div class='add'>+    DHT_STRIP_PHASE1_FLAGS(prebuf);</div><div class='add'>+</div><div class='add'>+    DHT_STACK_UNWIND(fallocate, frame, op_ret, op_errno, prebuf, postbuf,</div><div class='add'>+                     xdata);</div><div class='add'>+err:</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+dht_fallocate2(xlator_t *this, xlator_t *subvol, call_frame_t *frame, int ret)</div><div class='add'>+{</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    int32_t op_errno = EINVAL;</div><div class='add'>+</div><div class='add'>+    if (!frame || !frame-&gt;local)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    op_errno = local-&gt;op_errno;</div><div class='add'>+</div><div class='add'>+    if (we_are_not_migrating(ret)) {</div><div class='add'>+        /* This dht xlator is not migrating the file. Unwind and</div><div class='add'>+         * pass on the original mode bits so the higher DHT layer</div><div class='add'>+         * can handle this.</div><div class='add'>+         */</div><div class='add'>+        DHT_STACK_UNWIND(fallocate, frame, local-&gt;op_ret, local-&gt;op_errno,</div><div class='add'>+                         &amp;local-&gt;rebalance.prebuf, &amp;local-&gt;rebalance.postbuf,</div><div class='add'>+                         local-&gt;rebalance.xdata);</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (subvol == NULL)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    local-&gt;call_cnt = 2; /* This is the second attempt */</div><div class='add'>+</div><div class='add'>+    STACK_WIND_COOKIE(frame, dht_fallocate_cbk, subvol, subvol,</div><div class='add'>+                      subvol-&gt;fops-&gt;fallocate, local-&gt;fd,</div><div class='add'>+                      local-&gt;rebalance.flags, local-&gt;rebalance.offset,</div><div class='add'>+                      local-&gt;rebalance.size, local-&gt;xattr_req);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    DHT_STACK_UNWIND(fallocate, frame, -1, op_errno, NULL, NULL, NULL);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+dht_fallocate(call_frame_t *frame, xlator_t *this, fd_t *fd, int32_t mode,</div><div class='add'>+              off_t offset, size_t len, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    xlator_t *subvol = NULL;</div><div class='add'>+    int op_errno = -1;</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+</div><div class='add'>+    VALIDATE_OR_GOTO(frame, err);</div><div class='add'>+    VALIDATE_OR_GOTO(this, err);</div><div class='add'>+    VALIDATE_OR_GOTO(fd, err);</div><div class='add'>+</div><div class='add'>+    local = dht_local_init(frame, NULL, fd, GF_FOP_FALLOCATE);</div><div class='add'>+    if (!local) {</div><div class='add'>+        op_errno = ENOMEM;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    local-&gt;rebalance.flags = mode;</div><div class='add'>+    local-&gt;rebalance.offset = offset;</div><div class='add'>+    local-&gt;rebalance.size = len;</div><div class='add'>+</div><div class='add'>+    local-&gt;call_cnt = 1;</div><div class='add'>+    subvol = local-&gt;cached_subvol;</div><div class='add'>+    if (!subvol) {</div><div class='add'>+        gf_msg_debug(this-&gt;name, 0, "no cached subvolume for fd=%p", fd);</div><div class='add'>+        op_errno = EINVAL;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (xdata)</div><div class='add'>+        local-&gt;xattr_req = dict_ref(xdata);</div><div class='add'>+</div><div class='add'>+    STACK_WIND_COOKIE(frame, dht_fallocate_cbk, subvol, subvol,</div><div class='add'>+                      subvol-&gt;fops-&gt;fallocate, fd, local-&gt;rebalance.flags,</div><div class='add'>+                      local-&gt;rebalance.offset, local-&gt;rebalance.size,</div><div class='add'>+                      local-&gt;xattr_req);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+</div><div class='add'>+err:</div><div class='add'>+    op_errno = (op_errno == -1) ? errno : op_errno;</div><div class='add'>+    DHT_STACK_UNWIND(fallocate, frame, -1, op_errno, NULL, NULL, NULL);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+dht_discard_cbk(call_frame_t *frame, void *cookie, xlator_t *this, int op_ret,</div><div class='add'>+                int op_errno, struct iatt *prebuf, struct iatt *postbuf,</div><div class='add'>+                dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    xlator_t *prev = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    xlator_t *src_subvol = NULL;</div><div class='add'>+    xlator_t *dst_subvol = NULL;</div><div class='add'>+</div><div class='add'>+    GF_VALIDATE_OR_GOTO("dht", frame, err);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("dht", this, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("dht", frame-&gt;local, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("dht", cookie, out);</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    prev = cookie;</div><div class='add'>+</div><div class='add'>+    /* discard fails with EBADF if dht has not yet opened the fd</div><div class='add'>+     * on the cached subvol. This could happen if the file was migrated</div><div class='add'>+     * and a lookup updated the cached subvol in the inode ctx.</div><div class='add'>+     * We only check once as this could actually be a valid error.</div><div class='add'>+     */</div><div class='add'>+    if (dht_check_remote_fd_failed_error(local, op_ret, op_errno)) {</div><div class='add'>+        ret = dht_check_and_open_fd_on_subvol(this, frame);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if ((op_ret == -1) &amp;&amp; !dht_inode_missing(op_errno)) {</div><div class='add'>+        local-&gt;op_errno = op_errno;</div><div class='add'>+        local-&gt;op_ret = -1;</div><div class='add'>+        gf_msg_debug(this-&gt;name, op_errno, "subvolume %s returned -1",</div><div class='add'>+                     prev-&gt;name);</div><div class='add'>+</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (local-&gt;call_cnt != 1) {</div><div class='add'>+        if (local-&gt;stbuf.ia_blocks) {</div><div class='add'>+            dht_iatt_merge(this, postbuf, &amp;local-&gt;stbuf);</div><div class='add'>+            dht_iatt_merge(this, prebuf, &amp;local-&gt;prebuf);</div><div class='add'>+        }</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    local-&gt;rebalance.target_op_fn = dht_discard2;</div><div class='add'>+    local-&gt;op_ret = op_ret;</div><div class='add'>+    local-&gt;op_errno = op_errno;</div><div class='add'>+</div><div class='add'>+    dht_set_local_rebalance(this, local, NULL, prebuf, postbuf, xdata);</div><div class='add'>+</div><div class='add'>+    /* Phase 2 of migration */</div><div class='add'>+    if ((op_ret == -1) || IS_DHT_MIGRATION_PHASE2(postbuf)) {</div><div class='add'>+        ret = dht_rebalance_complete_check(this, frame);</div><div class='add'>+        if (!ret)</div><div class='add'>+            return 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Check if the rebalance phase1 is true */</div><div class='add'>+    if (IS_DHT_MIGRATION_PHASE1(postbuf)) {</div><div class='add'>+        dht_iatt_merge(this, &amp;local-&gt;stbuf, postbuf);</div><div class='add'>+        dht_iatt_merge(this, &amp;local-&gt;prebuf, prebuf);</div><div class='add'>+</div><div class='add'>+        dht_inode_ctx_get_mig_info(this, local-&gt;fd-&gt;inode, &amp;src_subvol,</div><div class='add'>+                                   &amp;dst_subvol);</div><div class='add'>+        if (!dht_mig_info_is_invalid(local-&gt;cached_subvol, src_subvol,</div><div class='add'>+                                     dst_subvol)) {</div><div class='add'>+            if (dht_fd_open_on_dst(this, local-&gt;fd, dst_subvol)) {</div><div class='add'>+                dht_discard2(this, dst_subvol, frame, 0);</div><div class='add'>+                return 0;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+        ret = dht_rebalance_in_progress_check(this, frame);</div><div class='add'>+        if (!ret)</div><div class='add'>+            return 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    DHT_STRIP_PHASE1_FLAGS(postbuf);</div><div class='add'>+    DHT_STRIP_PHASE1_FLAGS(prebuf);</div><div class='add'>+</div><div class='add'>+    DHT_STACK_UNWIND(discard, frame, op_ret, op_errno, prebuf, postbuf, xdata);</div><div class='add'>+err:</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+dht_discard2(xlator_t *this, xlator_t *subvol, call_frame_t *frame, int ret)</div><div class='add'>+{</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    int32_t op_errno = EINVAL;</div><div class='add'>+</div><div class='add'>+    if (!frame || !frame-&gt;local)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    op_errno = local-&gt;op_errno;</div><div class='add'>+</div><div class='add'>+    if (we_are_not_migrating(ret)) {</div><div class='add'>+        /* This dht xlator is not migrating the file. Unwind and</div><div class='add'>+         * pass on the original mode bits so the higher DHT layer</div><div class='add'>+         * can handle this.</div><div class='add'>+         */</div><div class='add'>+        DHT_STACK_UNWIND(discard, frame, local-&gt;op_ret, local-&gt;op_errno,</div><div class='add'>+                         &amp;local-&gt;rebalance.prebuf, &amp;local-&gt;rebalance.postbuf,</div><div class='add'>+                         local-&gt;rebalance.xdata);</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (subvol == NULL)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    local-&gt;call_cnt = 2; /* This is the second attempt */</div><div class='add'>+</div><div class='add'>+    STACK_WIND_COOKIE(frame, dht_discard_cbk, subvol, subvol,</div><div class='add'>+                      subvol-&gt;fops-&gt;discard, local-&gt;fd, local-&gt;rebalance.offset,</div><div class='add'>+                      local-&gt;rebalance.size, local-&gt;xattr_req);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    DHT_STACK_UNWIND(discard, frame, -1, op_errno, NULL, NULL, NULL);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+dht_discard(call_frame_t *frame, xlator_t *this, fd_t *fd, off_t offset,</div><div class='add'>+            size_t len, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    xlator_t *subvol = NULL;</div><div class='add'>+    int op_errno = -1;</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+</div><div class='add'>+    VALIDATE_OR_GOTO(frame, err);</div><div class='add'>+    VALIDATE_OR_GOTO(this, err);</div><div class='add'>+    VALIDATE_OR_GOTO(fd, err);</div><div class='add'>+</div><div class='add'>+    local = dht_local_init(frame, NULL, fd, GF_FOP_DISCARD);</div><div class='add'>+    if (!local) {</div><div class='add'>+        op_errno = ENOMEM;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    local-&gt;rebalance.offset = offset;</div><div class='add'>+    local-&gt;rebalance.size = len;</div><div class='add'>+</div><div class='add'>+    local-&gt;call_cnt = 1;</div><div class='add'>+    subvol = local-&gt;cached_subvol;</div><div class='add'>+    if (!subvol) {</div><div class='add'>+        gf_msg_debug(this-&gt;name, 0, "no cached subvolume for fd=%p", fd);</div><div class='add'>+        op_errno = EINVAL;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (xdata)</div><div class='add'>+        local-&gt;xattr_req = dict_ref(xdata);</div><div class='add'>+</div><div class='add'>+    STACK_WIND_COOKIE(frame, dht_discard_cbk, subvol, subvol,</div><div class='add'>+                      subvol-&gt;fops-&gt;discard, fd, local-&gt;rebalance.offset,</div><div class='add'>+                      local-&gt;rebalance.size, local-&gt;xattr_req);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+</div><div class='add'>+err:</div><div class='add'>+    op_errno = (op_errno == -1) ? errno : op_errno;</div><div class='add'>+    DHT_STACK_UNWIND(discard, frame, -1, op_errno, NULL, NULL, NULL);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+dht_zerofill_cbk(call_frame_t *frame, void *cookie, xlator_t *this, int op_ret,</div><div class='add'>+                 int op_errno, struct iatt *prebuf, struct iatt *postbuf,</div><div class='add'>+                 dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    xlator_t *prev = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    xlator_t *subvol1 = NULL, *subvol2 = NULL;</div><div class='add'>+</div><div class='add'>+    GF_VALIDATE_OR_GOTO("dht", frame, err);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("dht", this, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("dht", frame-&gt;local, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("dht", cookie, out);</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    prev = cookie;</div><div class='add'>+</div><div class='add'>+    /* zerofill fails with EBADF if dht has not yet opened the fd</div><div class='add'>+     * on the cached subvol. This could happen if the file was migrated</div><div class='add'>+     * and a lookup updated the cached subvol in the inode ctx.</div><div class='add'>+     * We only check once as this could actually be a valid error.</div><div class='add'>+     */</div><div class='add'>+    if (dht_check_remote_fd_failed_error(local, op_ret, op_errno)) {</div><div class='add'>+        ret = dht_check_and_open_fd_on_subvol(this, frame);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if ((op_ret == -1) &amp;&amp; !dht_inode_missing(op_errno)) {</div><div class='add'>+        local-&gt;op_errno = op_errno;</div><div class='add'>+        local-&gt;op_ret = -1;</div><div class='add'>+        gf_msg_debug(this-&gt;name, op_errno, "subvolume %s returned -1",</div><div class='add'>+                     prev-&gt;name);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (local-&gt;call_cnt != 1) {</div><div class='add'>+        if (local-&gt;stbuf.ia_blocks) {</div><div class='add'>+            dht_iatt_merge(this, postbuf, &amp;local-&gt;stbuf);</div><div class='add'>+            dht_iatt_merge(this, prebuf, &amp;local-&gt;prebuf);</div><div class='add'>+        }</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    local-&gt;rebalance.target_op_fn = dht_zerofill2;</div><div class='add'>+    local-&gt;op_ret = op_ret;</div><div class='add'>+    local-&gt;op_errno = op_errno;</div><div class='add'>+</div><div class='add'>+    dht_set_local_rebalance(this, local, NULL, prebuf, postbuf, xdata);</div><div class='add'>+</div><div class='add'>+    /* Phase 2 of migration */</div><div class='add'>+    if ((op_ret == -1) || IS_DHT_MIGRATION_PHASE2(postbuf)) {</div><div class='add'>+        ret = dht_rebalance_complete_check(this, frame);</div><div class='add'>+        if (!ret)</div><div class='add'>+            return 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Check if the rebalance phase1 is true */</div><div class='add'>+    if (IS_DHT_MIGRATION_PHASE1(postbuf)) {</div><div class='add'>+        dht_iatt_merge(this, &amp;local-&gt;stbuf, postbuf);</div><div class='add'>+        dht_iatt_merge(this, &amp;local-&gt;prebuf, prebuf);</div><div class='add'>+</div><div class='add'>+        ret = dht_inode_ctx_get_mig_info(this, local-&gt;fd-&gt;inode, &amp;subvol1,</div><div class='add'>+                                         &amp;subvol2);</div><div class='add'>+        if (!dht_mig_info_is_invalid(local-&gt;cached_subvol, subvol1, subvol2)) {</div><div class='add'>+            if (dht_fd_open_on_dst(this, local-&gt;fd, subvol2)) {</div><div class='add'>+                dht_zerofill2(this, subvol2, frame, 0);</div><div class='add'>+                return 0;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        ret = dht_rebalance_in_progress_check(this, frame);</div><div class='add'>+        if (!ret)</div><div class='add'>+            return 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    DHT_STRIP_PHASE1_FLAGS(postbuf);</div><div class='add'>+    DHT_STRIP_PHASE1_FLAGS(prebuf);</div><div class='add'>+</div><div class='add'>+    DHT_STACK_UNWIND(zerofill, frame, op_ret, op_errno, prebuf, postbuf, xdata);</div><div class='add'>+err:</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+dht_zerofill2(xlator_t *this, xlator_t *subvol, call_frame_t *frame, int ret)</div><div class='add'>+{</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    int32_t op_errno = EINVAL;</div><div class='add'>+</div><div class='add'>+    if (!frame || !frame-&gt;local)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+</div><div class='add'>+    op_errno = local-&gt;op_errno;</div><div class='add'>+</div><div class='add'>+    if (we_are_not_migrating(ret)) {</div><div class='add'>+        /* This dht xlator is not migrating the file. Unwind and</div><div class='add'>+         * pass on the original mode bits so the higher DHT layer</div><div class='add'>+         * can handle this.</div><div class='add'>+         */</div><div class='add'>+        DHT_STACK_UNWIND(zerofill, frame, local-&gt;op_ret, local-&gt;op_errno,</div><div class='add'>+                         &amp;local-&gt;rebalance.prebuf, &amp;local-&gt;rebalance.postbuf,</div><div class='add'>+                         local-&gt;rebalance.xdata);</div><div class='add'>+</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (subvol == NULL)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    local-&gt;call_cnt = 2; /* This is the second attempt */</div><div class='add'>+</div><div class='add'>+    STACK_WIND_COOKIE(frame, dht_zerofill_cbk, subvol, subvol,</div><div class='add'>+                      subvol-&gt;fops-&gt;zerofill, local-&gt;fd,</div><div class='add'>+                      local-&gt;rebalance.offset, local-&gt;rebalance.size,</div><div class='add'>+                      local-&gt;xattr_req);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+</div><div class='add'>+    DHT_STACK_UNWIND(zerofill, frame, -1, op_errno, NULL, NULL, NULL);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+dht_zerofill(call_frame_t *frame, xlator_t *this, fd_t *fd, off_t offset,</div><div class='add'>+             off_t len, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    xlator_t *subvol = NULL;</div><div class='add'>+    int op_errno = -1;</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+</div><div class='add'>+    VALIDATE_OR_GOTO(frame, err);</div><div class='add'>+    VALIDATE_OR_GOTO(this, err);</div><div class='add'>+    VALIDATE_OR_GOTO(fd, err);</div><div class='add'>+</div><div class='add'>+    local = dht_local_init(frame, NULL, fd, GF_FOP_ZEROFILL);</div><div class='add'>+    if (!local) {</div><div class='add'>+        op_errno = ENOMEM;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    local-&gt;rebalance.offset = offset;</div><div class='add'>+    local-&gt;rebalance.size = len;</div><div class='add'>+</div><div class='add'>+    local-&gt;call_cnt = 1;</div><div class='add'>+    subvol = local-&gt;cached_subvol;</div><div class='add'>+    if (!subvol) {</div><div class='add'>+        gf_msg_debug(this-&gt;name, 0, "no cached subvolume for fd=%p", fd);</div><div class='add'>+        op_errno = EINVAL;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (xdata)</div><div class='add'>+        local-&gt;xattr_req = dict_ref(xdata);</div><div class='add'>+</div><div class='add'>+    STACK_WIND_COOKIE(frame, dht_zerofill_cbk, subvol, subvol,</div><div class='add'>+                      subvol-&gt;fops-&gt;zerofill, fd, local-&gt;rebalance.offset,</div><div class='add'>+                      local-&gt;rebalance.size, local-&gt;xattr_req);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+</div><div class='add'>+err:</div><div class='add'>+    op_errno = (op_errno == -1) ? errno : op_errno;</div><div class='add'>+    DHT_STACK_UNWIND(zerofill, frame, -1, op_errno, NULL, NULL, NULL);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* handle cases of migration here for 'setattr()' calls */</div><div class='add'>+int</div><div class='add'>+dht_file_setattr_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                     int op_ret, int op_errno, struct iatt *prebuf,</div><div class='add'>+                     struct iatt *postbuf, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    xlator_t *prev = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    prev = cookie;</div><div class='add'>+</div><div class='add'>+    local-&gt;op_errno = op_errno;</div><div class='add'>+</div><div class='add'>+    if ((local-&gt;fop == GF_FOP_FSETATTR) &amp;&amp;</div><div class='add'>+        dht_check_remote_fd_failed_error(local, op_ret, op_errno)) {</div><div class='add'>+        ret = dht_check_and_open_fd_on_subvol(this, frame);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if ((op_ret == -1) &amp;&amp; !dht_inode_missing(op_errno)) {</div><div class='add'>+        gf_msg_debug(this-&gt;name, op_errno, "subvolume %s returned -1",</div><div class='add'>+                     prev-&gt;name);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (local-&gt;call_cnt != 1)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    local-&gt;op_ret = op_ret;</div><div class='add'>+    local-&gt;op_errno = op_errno;</div><div class='add'>+</div><div class='add'>+    local-&gt;rebalance.target_op_fn = dht_setattr2;</div><div class='add'>+</div><div class='add'>+    /* Phase 2 of migration */</div><div class='add'>+    if ((op_ret == -1) || IS_DHT_MIGRATION_PHASE2(postbuf)) {</div><div class='add'>+        dht_set_local_rebalance(this, local, NULL, prebuf, postbuf, xdata);</div><div class='add'>+</div><div class='add'>+        ret = dht_rebalance_complete_check(this, frame);</div><div class='add'>+        if (!ret)</div><div class='add'>+            return 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* At the end of the migration process, whatever 'attr' we</div><div class='add'>+       have on source file will be migrated to destination file</div><div class='add'>+       in one shot, hence we don't need to check for in progress</div><div class='add'>+       state here (ie, PHASE1) */</div><div class='add'>+out:</div><div class='add'>+    DHT_STRIP_PHASE1_FLAGS(postbuf);</div><div class='add'>+    DHT_STRIP_PHASE1_FLAGS(prebuf);</div><div class='add'>+</div><div class='add'>+    DHT_STACK_UNWIND(setattr, frame, op_ret, op_errno, prebuf, postbuf, xdata);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+dht_setattr2(xlator_t *this, xlator_t *subvol, call_frame_t *frame, int ret)</div><div class='add'>+{</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    int32_t op_errno = EINVAL;</div><div class='add'>+</div><div class='add'>+    if (!frame || !frame-&gt;local)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    op_errno = local-&gt;op_errno;</div><div class='add'>+</div><div class='add'>+    if (we_are_not_migrating(ret)) {</div><div class='add'>+        /* This dht xlator is not migrating the file. Unwind and</div><div class='add'>+         * pass on the original mode bits so the higher DHT layer</div><div class='add'>+         * can handle this.</div><div class='add'>+         */</div><div class='add'>+        DHT_STACK_UNWIND(setattr, frame, local-&gt;op_ret, local-&gt;op_errno,</div><div class='add'>+                         &amp;local-&gt;rebalance.prebuf, &amp;local-&gt;rebalance.postbuf,</div><div class='add'>+                         local-&gt;rebalance.xdata);</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (subvol == NULL)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    local-&gt;call_cnt = 2; /* This is the second attempt */</div><div class='add'>+</div><div class='add'>+    if (local-&gt;fop == GF_FOP_SETATTR) {</div><div class='add'>+        STACK_WIND_COOKIE(frame, dht_file_setattr_cbk, subvol, subvol,</div><div class='add'>+                          subvol-&gt;fops-&gt;setattr, &amp;local-&gt;loc,</div><div class='add'>+                          &amp;local-&gt;rebalance.stbuf, local-&gt;rebalance.flags,</div><div class='add'>+                          local-&gt;xattr_req);</div><div class='add'>+    } else {</div><div class='add'>+        STACK_WIND_COOKIE(frame, dht_file_setattr_cbk, subvol, subvol,</div><div class='add'>+                          subvol-&gt;fops-&gt;fsetattr, local-&gt;fd,</div><div class='add'>+                          &amp;local-&gt;rebalance.stbuf, local-&gt;rebalance.flags,</div><div class='add'>+                          local-&gt;xattr_req);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    DHT_STACK_UNWIND(setattr, frame, -1, op_errno, NULL, NULL, NULL);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* Keep the existing code same for all the cases other than regular file */</div><div class='add'>+int</div><div class='add'>+dht_setattr_cbk(call_frame_t *frame, void *cookie, xlator_t *this, int op_ret,</div><div class='add'>+                int op_errno, struct iatt *statpre, struct iatt *statpost,</div><div class='add'>+                dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    int this_call_cnt = 0;</div><div class='add'>+    xlator_t *prev = NULL;</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    prev = cookie;</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;frame-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        if (op_ret == -1) {</div><div class='add'>+            local-&gt;op_errno = op_errno;</div><div class='add'>+            UNLOCK(&amp;frame-&gt;lock);</div><div class='add'>+            gf_msg_debug(this-&gt;name, op_errno, "subvolume %s returned -1",</div><div class='add'>+                         prev-&gt;name);</div><div class='add'>+            goto post_unlock;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        dht_iatt_merge(this, &amp;local-&gt;prebuf, statpre);</div><div class='add'>+        dht_iatt_merge(this, &amp;local-&gt;stbuf, statpost);</div><div class='add'>+</div><div class='add'>+        local-&gt;op_ret = 0;</div><div class='add'>+        local-&gt;op_errno = 0;</div><div class='add'>+    }</div><div class='add'>+    UNLOCK(&amp;frame-&gt;lock);</div><div class='add'>+post_unlock:</div><div class='add'>+    this_call_cnt = dht_frame_return(frame);</div><div class='add'>+    if (is_last_call(this_call_cnt)) {</div><div class='add'>+        if (local-&gt;op_ret == 0)</div><div class='add'>+            dht_inode_ctx_time_set(local-&gt;loc.inode, this, &amp;local-&gt;stbuf);</div><div class='add'>+        DHT_STACK_UNWIND(setattr, frame, local-&gt;op_ret, local-&gt;op_errno,</div><div class='add'>+                         &amp;local-&gt;prebuf, &amp;local-&gt;stbuf, xdata);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* Keep the existing code same for all the cases other than regular file */</div><div class='add'>+int</div><div class='add'>+dht_non_mds_setattr_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                        int op_ret, int op_errno, struct iatt *statpre,</div><div class='add'>+                        struct iatt *statpost, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    int this_call_cnt = 0;</div><div class='add'>+    xlator_t *prev = NULL;</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    prev = cookie;</div><div class='add'>+</div><div class='add'>+    if (op_ret == -1) {</div><div class='add'>+        gf_msg(this-&gt;name, op_errno, 0, 0, "subvolume %s returned -1",</div><div class='add'>+               prev-&gt;name);</div><div class='add'>+        goto post_unlock;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;frame-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        dht_iatt_merge(this, &amp;local-&gt;prebuf, statpre);</div><div class='add'>+        dht_iatt_merge(this, &amp;local-&gt;stbuf, statpost);</div><div class='add'>+</div><div class='add'>+        local-&gt;op_ret = 0;</div><div class='add'>+        local-&gt;op_errno = 0;</div><div class='add'>+    }</div><div class='add'>+    UNLOCK(&amp;frame-&gt;lock);</div><div class='add'>+post_unlock:</div><div class='add'>+    this_call_cnt = dht_frame_return(frame);</div><div class='add'>+    if (is_last_call(this_call_cnt)) {</div><div class='add'>+        dht_inode_ctx_time_set(local-&gt;loc.inode, this, &amp;local-&gt;stbuf);</div><div class='add'>+        DHT_STACK_UNWIND(setattr, frame, 0, 0, &amp;local-&gt;prebuf, &amp;local-&gt;stbuf,</div><div class='add'>+                         xdata);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+dht_mds_setattr_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                    int op_ret, int op_errno, struct iatt *statpre,</div><div class='add'>+                    struct iatt *statpost, dict_t *xdata)</div><div class='add'>+</div><div class='add'>+{</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    dht_conf_t *conf = NULL;</div><div class='add'>+    xlator_t *prev = NULL;</div><div class='add'>+    xlator_t *mds_subvol = NULL;</div><div class='add'>+    struct iatt loc_stbuf = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int i = 0;</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    prev = cookie;</div><div class='add'>+    conf = this-&gt;private;</div><div class='add'>+    mds_subvol = local-&gt;mds_subvol;</div><div class='add'>+</div><div class='add'>+    if (op_ret == -1) {</div><div class='add'>+        local-&gt;op_ret = op_ret;</div><div class='add'>+        local-&gt;op_errno = op_errno;</div><div class='add'>+        gf_msg_debug(this-&gt;name, op_errno, "subvolume %s returned -1",</div><div class='add'>+                     prev-&gt;name);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    local-&gt;op_ret = 0;</div><div class='add'>+    loc_stbuf = local-&gt;stbuf;</div><div class='add'>+    dht_iatt_merge(this, &amp;local-&gt;prebuf, statpre);</div><div class='add'>+    dht_iatt_merge(this, &amp;local-&gt;stbuf, statpost);</div><div class='add'>+</div><div class='add'>+    local-&gt;call_cnt = conf-&gt;subvolume_cnt - 1;</div><div class='add'>+    for (i = 0; i &lt; conf-&gt;subvolume_cnt; i++) {</div><div class='add'>+        if (mds_subvol == conf-&gt;subvolumes[i])</div><div class='add'>+            continue;</div><div class='add'>+        STACK_WIND_COOKIE(frame, dht_non_mds_setattr_cbk, conf-&gt;subvolumes[i],</div><div class='add'>+                          conf-&gt;subvolumes[i],</div><div class='add'>+                          conf-&gt;subvolumes[i]-&gt;fops-&gt;setattr, &amp;local-&gt;loc,</div><div class='add'>+                          &amp;loc_stbuf, local-&gt;valid, local-&gt;xattr_req);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+out:</div><div class='add'>+    DHT_STACK_UNWIND(setattr, frame, local-&gt;op_ret, local-&gt;op_errno,</div><div class='add'>+                     &amp;local-&gt;prebuf, &amp;local-&gt;stbuf, xdata);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+dht_setattr(call_frame_t *frame, xlator_t *this, loc_t *loc, struct iatt *stbuf,</div><div class='add'>+            int32_t valid, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    xlator_t *subvol = NULL;</div><div class='add'>+    xlator_t *mds_subvol = NULL;</div><div class='add'>+    dht_layout_t *layout = NULL;</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    int op_errno = -1;</div><div class='add'>+    int i = -1;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int call_cnt = 0;</div><div class='add'>+    dht_conf_t *conf = NULL;</div><div class='add'>+</div><div class='add'>+    VALIDATE_OR_GOTO(frame, err);</div><div class='add'>+    VALIDATE_OR_GOTO(this, err);</div><div class='add'>+    VALIDATE_OR_GOTO(loc, err);</div><div class='add'>+    VALIDATE_OR_GOTO(loc-&gt;inode, err);</div><div class='add'>+    VALIDATE_OR_GOTO(loc-&gt;path, err);</div><div class='add'>+</div><div class='add'>+    conf = this-&gt;private;</div><div class='add'>+    local = dht_local_init(frame, loc, NULL, GF_FOP_SETATTR);</div><div class='add'>+    if (!local) {</div><div class='add'>+        op_errno = ENOMEM;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    layout = local-&gt;layout;</div><div class='add'>+    if (!layout) {</div><div class='add'>+        gf_msg_debug(this-&gt;name, 0, "no layout for path=%s", loc-&gt;path);</div><div class='add'>+        op_errno = EINVAL;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (!layout_is_sane(layout)) {</div><div class='add'>+        gf_msg_debug(this-&gt;name, 0, "layout is not sane for path=%s",</div><div class='add'>+                     loc-&gt;path);</div><div class='add'>+        op_errno = EINVAL;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+    if (xdata)</div><div class='add'>+        local-&gt;xattr_req = dict_ref(xdata);</div><div class='add'>+</div><div class='add'>+    if (IA_ISREG(loc-&gt;inode-&gt;ia_type)) {</div><div class='add'>+        /* in the regular file _cbk(), we need to check for</div><div class='add'>+           migration possibilities */</div><div class='add'>+        local-&gt;rebalance.stbuf = *stbuf;</div><div class='add'>+        local-&gt;rebalance.flags = valid;</div><div class='add'>+        local-&gt;call_cnt = 1;</div><div class='add'>+        subvol = local-&gt;cached_subvol;</div><div class='add'>+</div><div class='add'>+        STACK_WIND_COOKIE(frame, dht_file_setattr_cbk, subvol, subvol,</div><div class='add'>+                          subvol-&gt;fops-&gt;setattr, loc, stbuf, valid, xdata);</div><div class='add'>+</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    local-&gt;call_cnt = call_cnt = layout-&gt;cnt;</div><div class='add'>+</div><div class='add'>+    if (IA_ISDIR(loc-&gt;inode-&gt;ia_type) &amp;&amp; !__is_root_gfid(loc-&gt;inode-&gt;gfid) &amp;&amp;</div><div class='add'>+        call_cnt != 1) {</div><div class='add'>+        ret = dht_inode_ctx_mdsvol_get(loc-&gt;inode, this, &amp;mds_subvol);</div><div class='add'>+        if (ret || !mds_subvol) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, 0,</div><div class='add'>+                   DHT_MSG_HASHED_SUBVOL_GET_FAILED,</div><div class='add'>+                   "Failed to get mds subvol for path %s", local-&gt;loc.path);</div><div class='add'>+            op_errno = EINVAL;</div><div class='add'>+            goto err;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        local-&gt;mds_subvol = mds_subvol;</div><div class='add'>+        for (i = 0; i &lt; conf-&gt;subvolume_cnt; i++) {</div><div class='add'>+            if (conf-&gt;subvolumes[i] == mds_subvol) {</div><div class='add'>+                if (!conf-&gt;subvolume_status[i]) {</div><div class='add'>+                    gf_msg(this-&gt;name, GF_LOG_WARNING, layout-&gt;list[i].err,</div><div class='add'>+                           DHT_MSG_HASHED_SUBVOL_DOWN,</div><div class='add'>+                           "MDS subvol is down for path "</div><div class='add'>+                           " %s Unable to set attr ",</div><div class='add'>+                           local-&gt;loc.path);</div><div class='add'>+                    op_errno = ENOTCONN;</div><div class='add'>+                    goto err;</div><div class='add'>+                }</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+        local-&gt;valid = valid;</div><div class='add'>+        local-&gt;stbuf = *stbuf;</div><div class='add'>+</div><div class='add'>+        STACK_WIND_COOKIE(frame, dht_mds_setattr_cbk, local-&gt;mds_subvol,</div><div class='add'>+                          local-&gt;mds_subvol, local-&gt;mds_subvol-&gt;fops-&gt;setattr,</div><div class='add'>+                          loc, stbuf, valid, xdata);</div><div class='add'>+        return 0;</div><div class='add'>+    } else {</div><div class='add'>+        for (i = 0; i &lt; call_cnt; i++) {</div><div class='add'>+            STACK_WIND_COOKIE(frame, dht_setattr_cbk, layout-&gt;list[i].xlator,</div><div class='add'>+                              layout-&gt;list[i].xlator,</div><div class='add'>+                              layout-&gt;list[i].xlator-&gt;fops-&gt;setattr, loc, stbuf,</div><div class='add'>+                              valid, xdata);</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+</div><div class='add'>+err:</div><div class='add'>+    op_errno = (op_errno == -1) ? errno : op_errno;</div><div class='add'>+    DHT_STACK_UNWIND(setattr, frame, -1, op_errno, NULL, NULL, NULL);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+dht_fsetattr(call_frame_t *frame, xlator_t *this, fd_t *fd, struct iatt *stbuf,</div><div class='add'>+             int32_t valid, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    xlator_t *subvol = NULL;</div><div class='add'>+    dht_layout_t *layout = NULL;</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    int op_errno = -1;</div><div class='add'>+    int i = -1;</div><div class='add'>+    int call_cnt = 0;</div><div class='add'>+</div><div class='add'>+    VALIDATE_OR_GOTO(frame, err);</div><div class='add'>+    VALIDATE_OR_GOTO(this, err);</div><div class='add'>+    VALIDATE_OR_GOTO(fd, err);</div><div class='add'>+</div><div class='add'>+    local = dht_local_init(frame, NULL, fd, GF_FOP_FSETATTR);</div><div class='add'>+    if (!local) {</div><div class='add'>+        op_errno = ENOMEM;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    layout = local-&gt;layout;</div><div class='add'>+    if (!layout) {</div><div class='add'>+        gf_msg_debug(this-&gt;name, 0, "no layout for fd=%p", fd);</div><div class='add'>+        op_errno = EINVAL;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (!layout_is_sane(layout)) {</div><div class='add'>+        gf_msg_debug(this-&gt;name, 0, "layout is not sane for fd=%p", fd);</div><div class='add'>+        op_errno = EINVAL;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+    if (xdata)</div><div class='add'>+        local-&gt;xattr_req = dict_ref(xdata);</div><div class='add'>+</div><div class='add'>+    if (IA_ISREG(fd-&gt;inode-&gt;ia_type)) {</div><div class='add'>+        /* in the regular file _cbk(), we need to check for</div><div class='add'>+           migration possibilities */</div><div class='add'>+        local-&gt;rebalance.stbuf = *stbuf;</div><div class='add'>+        local-&gt;rebalance.flags = valid;</div><div class='add'>+        local-&gt;call_cnt = 1;</div><div class='add'>+        subvol = local-&gt;cached_subvol;</div><div class='add'>+</div><div class='add'>+        STACK_WIND_COOKIE(frame, dht_file_setattr_cbk, subvol, subvol,</div><div class='add'>+                          subvol-&gt;fops-&gt;fsetattr, fd, &amp;local-&gt;rebalance.stbuf,</div><div class='add'>+                          local-&gt;rebalance.flags, local-&gt;xattr_req);</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    local-&gt;call_cnt = call_cnt = layout-&gt;cnt;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; call_cnt; i++) {</div><div class='add'>+        STACK_WIND_COOKIE(frame, dht_setattr_cbk, layout-&gt;list[i].xlator,</div><div class='add'>+                          layout-&gt;list[i].xlator,</div><div class='add'>+                          layout-&gt;list[i].xlator-&gt;fops-&gt;fsetattr, fd, stbuf,</div><div class='add'>+                          valid, xdata);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+</div><div class='add'>+err:</div><div class='add'>+    op_errno = (op_errno == -1) ? errno : op_errno;</div><div class='add'>+    DHT_STACK_UNWIND(fsetattr, frame, -1, op_errno, NULL, NULL, NULL);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='head'>diff --git a/xlators/cluster/dht/src/dht-layout.c b/xlators/cluster/dht/src/dht-layout.c<br/>index 5ff2bdbe80a..fda904c92c9 100644<br/>--- a/<a href='/cgit/glusterfs.git/tree/xlators/cluster/dht/src/dht-layout.c?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/cluster/dht/src/dht-layout.c</a><br/>+++ b/<a href='/cgit/glusterfs.git/tree/xlators/cluster/dht/src/dht-layout.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>xlators/cluster/dht/src/dht-layout.c</a></div><div class='hunk'>@@ -1,713 +1,808 @@</div><div class='ctx'> /*</div><div class='del'>-   Copyright (c) 2008-2009 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='del'>-   This file is part of GlusterFS.</div><div class='del'>-</div><div class='del'>-   GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-   it under the terms of the GNU General Public License as published</div><div class='del'>-   by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-   or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-   GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-   WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-   General Public License for more details.</div><div class='del'>-</div><div class='del'>-   You should have received a copy of the GNU General Public License</div><div class='del'>-   along with this program.  If not, see</div><div class='del'>-   &lt;http://www.gnu.org/licenses/&gt;.</div><div class='del'>-*/</div><div class='del'>-</div><div class='del'>-#ifndef _CONFIG_H</div><div class='del'>-#define _CONFIG_H</div><div class='del'>-#include "config.h"</div><div class='del'>-#endif</div><div class='add'>+  Copyright (c) 2008-2012 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='ctx'> </div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='ctx'> </div><div class='del'>-#include "glusterfs.h"</div><div class='del'>-#include "xlator.h"</div><div class='ctx'> #include "dht-common.h"</div><div class='del'>-#include "byte-order.h"</div><div class='add'>+#include &lt;glusterfs/byte-order.h&gt;</div><div class='add'>+#include "unittest/unittest.h"</div><div class='ctx'> </div><div class='del'>-#define layout_base_size (sizeof (dht_layout_t))</div><div class='add'>+#define layout_base_size (sizeof(dht_layout_t))</div><div class='ctx'> </div><div class='del'>-#define layout_entry_size (sizeof ((dht_layout_t *)NULL)-&gt;list[0])</div><div class='add'>+#define layout_entry_size (sizeof((dht_layout_t *)NULL)-&gt;list[0])</div><div class='ctx'> </div><div class='ctx'> #define layout_size(cnt) (layout_base_size + (cnt * layout_entry_size))</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> dht_layout_t *</div><div class='del'>-dht_layout_new (xlator_t *this, int cnt)</div><div class='add'>+dht_layout_new(xlator_t *this, int cnt)</div><div class='ctx'> {</div><div class='del'>-	dht_layout_t *layout = NULL;</div><div class='del'>-        dht_conf_t   *conf = NULL;</div><div class='add'>+    dht_layout_t *layout = NULL;</div><div class='add'>+    dht_conf_t *conf = NULL;</div><div class='ctx'> </div><div class='add'>+    REQUIRE(NULL != this);</div><div class='add'>+    REQUIRE(cnt &gt;= 0);</div><div class='ctx'> </div><div class='del'>-        conf = this-&gt;private;</div><div class='add'>+    conf = this-&gt;private;</div><div class='ctx'> </div><div class='del'>-	layout = GF_CALLOC (1, layout_size (cnt),</div><div class='del'>-                            gf_dht_mt_dht_layout_t);</div><div class='del'>-	if (!layout) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-			"Out of memory");</div><div class='del'>-		goto out;</div><div class='del'>-	}</div><div class='add'>+    layout = GF_CALLOC(1, layout_size(cnt), gf_dht_mt_dht_layout_t);</div><div class='add'>+    if (!layout) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        layout-&gt;type = DHT_HASH_TYPE_DM;</div><div class='del'>-	layout-&gt;cnt = cnt;</div><div class='del'>-        if (conf)</div><div class='del'>-                layout-&gt;gen = conf-&gt;gen;</div><div class='add'>+    layout-&gt;type = DHT_HASH_TYPE_DM;</div><div class='add'>+    layout-&gt;cnt = cnt;</div><div class='ctx'> </div><div class='del'>-        layout-&gt;ref = 1;</div><div class='add'>+    if (conf) {</div><div class='add'>+        layout-&gt;spread_cnt = conf-&gt;dir_spread_cnt;</div><div class='add'>+        layout-&gt;gen = conf-&gt;gen;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    GF_ATOMIC_INIT(layout-&gt;ref, 1);</div><div class='add'>+</div><div class='add'>+    ENSURE(NULL != layout);</div><div class='add'>+    ENSURE(layout-&gt;type == DHT_HASH_TYPE_DM);</div><div class='add'>+    ENSURE(layout-&gt;cnt == cnt);</div><div class='add'>+    ENSURE(GF_ATOMIC_GET(layout-&gt;ref) == 1);</div><div class='ctx'> out:</div><div class='del'>-	return layout;</div><div class='add'>+    return layout;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> dht_layout_t *</div><div class='del'>-dht_layout_get (xlator_t *this, inode_t *inode)</div><div class='add'>+dht_layout_get(xlator_t *this, inode_t *inode)</div><div class='ctx'> {</div><div class='del'>-        dht_conf_t   *conf = NULL;</div><div class='del'>-        uint64_t      layout_int = 0;</div><div class='del'>-        dht_layout_t *layout = NULL;</div><div class='del'>-        int           ret    = -1;</div><div class='del'>-</div><div class='del'>-        conf = this-&gt;private;</div><div class='del'>-        LOCK (&amp;conf-&gt;layout_lock);</div><div class='del'>-        {</div><div class='del'>-                ret = inode_ctx_get (inode, this, &amp;layout_int);</div><div class='del'>-                if (ret == 0) {</div><div class='del'>-                        layout = (dht_layout_t *) (unsigned long) layout_int;</div><div class='del'>-                        layout-&gt;ref++;</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='del'>-        UNLOCK (&amp;conf-&gt;layout_lock);</div><div class='del'>-</div><div class='del'>-        return layout;</div><div class='add'>+    dht_layout_t *layout = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    ret = dht_inode_ctx_layout_get(inode, this, &amp;layout);</div><div class='add'>+    if ((!ret) &amp;&amp; layout) {</div><div class='add'>+        GF_ATOMIC_INC(layout-&gt;ref);</div><div class='add'>+    }</div><div class='add'>+    return layout;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-dht_layout_set (xlator_t *this, inode_t *inode, dht_layout_t *layout)</div><div class='add'>+dht_layout_set(xlator_t *this, inode_t *inode, dht_layout_t *layout)</div><div class='ctx'> {</div><div class='del'>-        dht_conf_t   *conf = NULL;</div><div class='del'>-        int           oldret = -1;</div><div class='del'>-        int           ret = 0;</div><div class='del'>-        dht_layout_t *old_layout;</div><div class='del'>-        uint64_t      old_layout_int;</div><div class='del'>-</div><div class='del'>-        conf = this-&gt;private;</div><div class='del'>-        LOCK (&amp;conf-&gt;layout_lock);</div><div class='del'>-        {</div><div class='del'>-                oldret = inode_ctx_get (inode, this, &amp;old_layout_int);</div><div class='del'>-</div><div class='del'>-                layout-&gt;ref++;</div><div class='del'>-                ret = inode_ctx_put (inode, this, (uint64_t) (unsigned long)</div><div class='del'>-                                     layout);</div><div class='del'>-        }</div><div class='del'>-        UNLOCK (&amp;conf-&gt;layout_lock);</div><div class='del'>-</div><div class='del'>-        if (oldret == 0) {</div><div class='del'>-                old_layout = (dht_layout_t *) (unsigned long) old_layout_int;</div><div class='del'>-                dht_layout_unref (this, old_layout);</div><div class='del'>-        }</div><div class='add'>+    dht_conf_t *conf = NULL;</div><div class='add'>+    int oldret = -1;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    dht_layout_t *old_layout;</div><div class='add'>+</div><div class='add'>+    conf = this-&gt;private;</div><div class='add'>+    if (!conf || !layout)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;conf-&gt;layout_lock);</div><div class='add'>+    {</div><div class='add'>+        oldret = dht_inode_ctx_layout_get(inode, this, &amp;old_layout);</div><div class='add'>+        if (layout)</div><div class='add'>+            GF_ATOMIC_INC(layout-&gt;ref);</div><div class='add'>+        ret = dht_inode_ctx_layout_set(inode, this, layout);</div><div class='add'>+    }</div><div class='add'>+    UNLOCK(&amp;conf-&gt;layout_lock);</div><div class='add'>+</div><div class='add'>+    if (!oldret) {</div><div class='add'>+        dht_layout_unref(this, old_layout);</div><div class='add'>+    }</div><div class='add'>+    if (ret)</div><div class='add'>+        GF_ATOMIC_DEC(layout-&gt;ref);</div><div class='ctx'> </div><div class='del'>-        return ret;</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> void</div><div class='del'>-dht_layout_unref (xlator_t *this, dht_layout_t *layout)</div><div class='add'>+dht_layout_unref(xlator_t *this, dht_layout_t *layout)</div><div class='ctx'> {</div><div class='del'>-        dht_conf_t  *conf = NULL;</div><div class='del'>-        int          ref = 0;</div><div class='add'>+    int ref = 0;</div><div class='ctx'> </div><div class='del'>-        if (layout-&gt;preset)</div><div class='del'>-                return;</div><div class='add'>+    if (!layout || layout-&gt;preset || !this-&gt;private)</div><div class='add'>+        return;</div><div class='ctx'> </div><div class='del'>-        conf = this-&gt;private;</div><div class='del'>-        LOCK (&amp;conf-&gt;layout_lock);</div><div class='del'>-        {</div><div class='del'>-                ref = --layout-&gt;ref;</div><div class='del'>-        }</div><div class='del'>-        UNLOCK (&amp;conf-&gt;layout_lock);</div><div class='add'>+    ref = GF_ATOMIC_DEC(layout-&gt;ref);</div><div class='ctx'> </div><div class='del'>-        if (!ref)</div><div class='del'>-                GF_FREE (layout);</div><div class='add'>+    if (!ref)</div><div class='add'>+        GF_FREE(layout);</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> dht_layout_t *</div><div class='del'>-dht_layout_ref (xlator_t *this, dht_layout_t *layout)</div><div class='add'>+dht_layout_ref(xlator_t *this, dht_layout_t *layout)</div><div class='ctx'> {</div><div class='del'>-        dht_conf_t  *conf = NULL;</div><div class='del'>-</div><div class='del'>-        if (layout-&gt;preset)</div><div class='del'>-                return layout;</div><div class='add'>+    if (layout-&gt;preset || !this-&gt;private)</div><div class='add'>+        return layout;</div><div class='ctx'> </div><div class='del'>-        conf = this-&gt;private;</div><div class='del'>-        LOCK (&amp;conf-&gt;layout_lock);</div><div class='del'>-        {</div><div class='del'>-                layout-&gt;ref++;</div><div class='del'>-        }</div><div class='del'>-        UNLOCK (&amp;conf-&gt;layout_lock);</div><div class='add'>+    GF_ATOMIC_INC(layout-&gt;ref);</div><div class='ctx'> </div><div class='del'>-        return layout;</div><div class='add'>+    return layout;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> xlator_t *</div><div class='del'>-dht_layout_search (xlator_t *this, dht_layout_t *layout, const char *name)</div><div class='add'>+dht_layout_search(xlator_t *this, dht_layout_t *layout, const char *name)</div><div class='ctx'> {</div><div class='del'>-	uint32_t   hash = 0;</div><div class='del'>-        xlator_t  *subvol = NULL;</div><div class='del'>-	int        i = 0;</div><div class='del'>-	int        ret = 0;</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-	ret = dht_hash_compute (layout-&gt;type, name, &amp;hash);</div><div class='del'>-	if (ret != 0) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-			"hash computation failed for type=%d name=%s",</div><div class='del'>-			layout-&gt;type, name);</div><div class='del'>-		goto out;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	for (i = 0; i &lt; layout-&gt;cnt; i++) {</div><div class='del'>-		if (layout-&gt;list[i].start &lt;= hash</div><div class='del'>-		    &amp;&amp; layout-&gt;list[i].stop &gt;= hash) {</div><div class='del'>-			subvol = layout-&gt;list[i].xlator;</div><div class='del'>-			break;</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	if (!subvol) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-			"no subvolume for hash (value) = %u", hash);</div><div class='del'>-	}</div><div class='add'>+    uint32_t hash = 0;</div><div class='add'>+    xlator_t *subvol = NULL;</div><div class='add'>+    int i = 0;</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    ret = dht_hash_compute(this, layout-&gt;type, name, &amp;hash);</div><div class='add'>+    if (ret != 0) {</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_WARNING, 0, DHT_MSG_COMPUTE_HASH_FAILED,</div><div class='add'>+                "type=%d", layout-&gt;type, "name=%s", name, NULL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; layout-&gt;cnt; i++) {</div><div class='add'>+        if (layout-&gt;list[i].start &lt;= hash &amp;&amp; layout-&gt;list[i].stop &gt;= hash) {</div><div class='add'>+            subvol = layout-&gt;list[i].xlator;</div><div class='add'>+            break;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (!subvol) {</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_WARNING, 0, DHT_MSG_HASHED_SUBVOL_GET_FAILED,</div><div class='add'>+                "hash-value=0x%x", hash, NULL);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='ctx'> out:</div><div class='del'>-	return subvol;</div><div class='add'>+    return subvol;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> dht_layout_t *</div><div class='del'>-dht_layout_for_subvol (xlator_t *this, xlator_t *subvol)</div><div class='add'>+dht_layout_for_subvol(xlator_t *this, xlator_t *subvol)</div><div class='ctx'> {</div><div class='del'>-	dht_conf_t   *conf = NULL;</div><div class='del'>-	dht_layout_t *layout = NULL;</div><div class='del'>-	int           i = 0;</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-	conf = this-&gt;private;</div><div class='del'>-</div><div class='del'>-	for (i = 0; i &lt; conf-&gt;subvolume_cnt; i++) {</div><div class='del'>-		if (conf-&gt;subvolumes[i] == subvol) {</div><div class='del'>-			layout = conf-&gt;file_layouts[i];</div><div class='del'>-			break;</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='add'>+    dht_conf_t *conf = NULL;</div><div class='add'>+    dht_layout_t *layout = NULL;</div><div class='add'>+    int i = 0;</div><div class='add'>+</div><div class='add'>+    conf = this-&gt;private;</div><div class='add'>+    if (!conf)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; conf-&gt;subvolume_cnt; i++) {</div><div class='add'>+        if (conf-&gt;subvolumes[i] == subvol) {</div><div class='add'>+            layout = conf-&gt;file_layouts[i];</div><div class='add'>+            break;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	return layout;</div><div class='add'>+out:</div><div class='add'>+    return layout;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-dht_layouts_init (xlator_t *this, dht_conf_t *conf)</div><div class='add'>+dht_layouts_init(xlator_t *this, dht_conf_t *conf)</div><div class='ctx'> {</div><div class='del'>-	dht_layout_t *layout = NULL;</div><div class='del'>-	int           i = 0;</div><div class='del'>-	int           ret = -1;</div><div class='del'>-	</div><div class='add'>+    dht_layout_t *layout = NULL;</div><div class='add'>+    int i = 0;</div><div class='add'>+    int ret = -1;</div><div class='ctx'> </div><div class='del'>-	conf-&gt;file_layouts = GF_CALLOC (conf-&gt;subvolume_cnt,</div><div class='del'>-				        sizeof (dht_layout_t *),</div><div class='del'>-                                        gf_dht_mt_dht_layout_t);</div><div class='del'>-	if (!conf-&gt;file_layouts) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-			"Out of memory");</div><div class='del'>-		goto out;</div><div class='del'>-	}</div><div class='add'>+    if (!conf)</div><div class='add'>+        goto out;</div><div class='ctx'> </div><div class='del'>-	for (i = 0; i &lt; conf-&gt;subvolume_cnt; i++) {</div><div class='del'>-		layout = dht_layout_new (this, 1);</div><div class='add'>+    conf-&gt;file_layouts = GF_CALLOC(conf-&gt;subvolume_cnt, sizeof(dht_layout_t *),</div><div class='add'>+                                   gf_dht_mt_dht_layout_t);</div><div class='add'>+    if (!conf-&gt;file_layouts) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-		if (!layout) {</div><div class='del'>-			goto out;</div><div class='del'>-		}</div><div class='add'>+    for (i = 0; i &lt; conf-&gt;subvolume_cnt; i++) {</div><div class='add'>+        layout = dht_layout_new(this, 1);</div><div class='ctx'> </div><div class='del'>-		layout-&gt;preset = 1;</div><div class='add'>+        if (!layout) {</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        layout-&gt;preset = 1;</div><div class='ctx'> </div><div class='del'>-		layout-&gt;list[0].xlator = conf-&gt;subvolumes[i];</div><div class='add'>+        layout-&gt;list[0].xlator = conf-&gt;subvolumes[i];</div><div class='ctx'> </div><div class='del'>-		conf-&gt;file_layouts[i] = layout;</div><div class='del'>-	}</div><div class='add'>+        conf-&gt;file_layouts[i] = layout;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	ret = 0;</div><div class='add'>+    ret = 0;</div><div class='ctx'> out:</div><div class='del'>-	return ret;</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-dht_disk_layout_extract (xlator_t *this, dht_layout_t *layout,</div><div class='del'>-			 int pos, int32_t **disk_layout_p)</div><div class='add'>+dht_disk_layout_extract(xlator_t *this, dht_layout_t *layout, int pos,</div><div class='add'>+                        int32_t **disk_layout_p)</div><div class='ctx'> {</div><div class='del'>-	int      ret = -1;</div><div class='del'>-	int32_t *disk_layout = NULL;</div><div class='del'>-</div><div class='del'>-	disk_layout = GF_CALLOC (5, sizeof (int),</div><div class='del'>-                                 gf_dht_mt_int32_t);</div><div class='del'>-	if (!disk_layout) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-			"Out of memory");</div><div class='del'>-		goto out;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	disk_layout[0] = hton32 (1);</div><div class='del'>-	disk_layout[1] = hton32 (layout-&gt;type);</div><div class='del'>-	disk_layout[2] = hton32 (layout-&gt;list[pos].start);</div><div class='del'>-	disk_layout[3] = hton32 (layout-&gt;list[pos].stop);</div><div class='del'>-</div><div class='del'>-	if (disk_layout_p)</div><div class='del'>-		*disk_layout_p = disk_layout;</div><div class='del'>-	ret = 0;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int32_t *disk_layout = NULL;</div><div class='add'>+</div><div class='add'>+    disk_layout = GF_CALLOC(5, sizeof(int), gf_dht_mt_int32_t);</div><div class='add'>+    if (!disk_layout) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    disk_layout[0] = hton32(layout-&gt;list[pos].commit_hash);</div><div class='add'>+    disk_layout[1] = hton32(layout-&gt;type);</div><div class='add'>+    disk_layout[2] = hton32(layout-&gt;list[pos].start);</div><div class='add'>+    disk_layout[3] = hton32(layout-&gt;list[pos].stop);</div><div class='add'>+</div><div class='add'>+    if (disk_layout_p)</div><div class='add'>+        *disk_layout_p = disk_layout;</div><div class='add'>+    else</div><div class='add'>+        GF_FREE(disk_layout);</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='ctx'> </div><div class='ctx'> out:</div><div class='del'>-	return ret;</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-dht_disk_layout_merge (xlator_t *this, dht_layout_t *layout,</div><div class='del'>-		       int pos, void *disk_layout_raw)</div><div class='add'>+dht_disk_layout_extract_for_subvol(xlator_t *this, dht_layout_t *layout,</div><div class='add'>+                                   xlator_t *subvol, int32_t **disk_layout_p)</div><div class='ctx'> {</div><div class='del'>-	int      cnt = 0;</div><div class='del'>-	int      type = 0;</div><div class='del'>-	int      start_off = 0;</div><div class='del'>-	int      stop_off = 0;</div><div class='del'>-        int      disk_layout[4];</div><div class='add'>+    int i = 0;</div><div class='ctx'> </div><div class='del'>-	/* TODO: assert disk_layout_ptr is of required length */</div><div class='add'>+    for (i = 0; i &lt; layout-&gt;cnt; i++) {</div><div class='add'>+        if (layout-&gt;list[i].xlator == subvol)</div><div class='add'>+            break;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        memcpy (disk_layout, disk_layout_raw, sizeof (disk_layout));</div><div class='add'>+    if (i == layout-&gt;cnt)</div><div class='add'>+        return -1;</div><div class='ctx'> </div><div class='del'>-	cnt  = ntoh32 (disk_layout[0]);</div><div class='del'>-	if (cnt != 1) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-			"disk layout has invalid count %d", cnt);</div><div class='del'>-		return -1;</div><div class='del'>-	}</div><div class='add'>+    return dht_disk_layout_extract(this, layout, i, disk_layout_p);</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	/* TODO: assert type is compatible */</div><div class='del'>-	type      = ntoh32 (disk_layout[1]);</div><div class='del'>-	start_off = ntoh32 (disk_layout[2]);</div><div class='del'>-	stop_off  = ntoh32 (disk_layout[3]);</div><div class='add'>+static int</div><div class='add'>+dht_disk_layout_merge(xlator_t *this, dht_layout_t *layout, int pos,</div><div class='add'>+                      void *disk_layout_raw, int disk_layout_len)</div><div class='add'>+{</div><div class='add'>+    int type = 0;</div><div class='add'>+    int start_off = 0;</div><div class='add'>+    int stop_off = 0;</div><div class='add'>+    int commit_hash = 0;</div><div class='add'>+    int disk_layout[4];</div><div class='add'>+</div><div class='add'>+    if (!disk_layout_raw) {</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_CRITICAL, 0, DHT_MSG_LAYOUT_MERGE_FAILED,</div><div class='add'>+                NULL);</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(disk_layout_len == sizeof(disk_layout));</div><div class='add'>+</div><div class='add'>+    memcpy(disk_layout, disk_layout_raw, disk_layout_len);</div><div class='add'>+</div><div class='add'>+    type = ntoh32(disk_layout[1]);</div><div class='add'>+    switch (type) {</div><div class='add'>+        case DHT_HASH_TYPE_DM_USER:</div><div class='add'>+            gf_msg_debug(this-&gt;name, 0, "found user-set layout");</div><div class='add'>+            layout-&gt;type = type;</div><div class='add'>+            /* Fall through. */</div><div class='add'>+        case DHT_HASH_TYPE_DM:</div><div class='add'>+            break;</div><div class='add'>+        default:</div><div class='add'>+            gf_smsg(this-&gt;name, GF_LOG_CRITICAL, 0, DHT_MSG_INVALID_DISK_LAYOUT,</div><div class='add'>+                    "layout=%d", disk_layout[1], NULL);</div><div class='add'>+            return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    commit_hash = ntoh32(disk_layout[0]);</div><div class='add'>+    start_off = ntoh32(disk_layout[2]);</div><div class='add'>+    stop_off = ntoh32(disk_layout[3]);</div><div class='add'>+</div><div class='add'>+    layout-&gt;list[pos].commit_hash = commit_hash;</div><div class='add'>+    layout-&gt;list[pos].start = start_off;</div><div class='add'>+    layout-&gt;list[pos].stop = stop_off;</div><div class='add'>+</div><div class='add'>+    gf_msg_trace(this-&gt;name, 0,</div><div class='add'>+                 "merged to layout: 0x%x - 0x%x (hash 0x%x, type %d) from %s",</div><div class='add'>+                 start_off, stop_off, commit_hash, type,</div><div class='add'>+                 layout-&gt;list[pos].xlator-&gt;name);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	layout-&gt;list[pos].start = start_off;</div><div class='del'>-	layout-&gt;list[pos].stop  = stop_off;</div><div class='add'>+int</div><div class='add'>+dht_layout_merge(xlator_t *this, dht_layout_t *layout, xlator_t *subvol,</div><div class='add'>+                 int op_ret, int op_errno, dict_t *xattr)</div><div class='add'>+{</div><div class='add'>+    int i = 0;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int err = -1;</div><div class='add'>+    void *disk_layout_raw = NULL;</div><div class='add'>+    int disk_layout_len = 0;</div><div class='add'>+    dht_conf_t *conf = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    if (op_ret != 0) {</div><div class='add'>+        err = op_errno;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (!layout)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; layout-&gt;cnt; i++) {</div><div class='add'>+        if (layout-&gt;list[i].xlator == NULL) {</div><div class='add'>+            layout-&gt;list[i].err = err;</div><div class='add'>+            layout-&gt;list[i].xlator = subvol;</div><div class='add'>+            break;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	gf_log (this-&gt;name, GF_LOG_TRACE,</div><div class='del'>-		"merged to layout: %u - %u (type %d) from %s",</div><div class='del'>-		start_off, stop_off, type,</div><div class='del'>-		layout-&gt;list[pos].xlator-&gt;name);</div><div class='add'>+    if (op_ret != 0) {</div><div class='add'>+        ret = 0;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (xattr) {</div><div class='add'>+        /* during lookup and not mkdir */</div><div class='add'>+        ret = dict_get_ptr_and_len(xattr, conf-&gt;xattr_name, &amp;disk_layout_raw,</div><div class='add'>+                                   &amp;disk_layout_len);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (ret != 0) {</div><div class='add'>+        layout-&gt;list[i].err = 0;</div><div class='add'>+        gf_msg_trace(this-&gt;name, 0, "Missing disk layout on %s. err = %d",</div><div class='add'>+                     subvol-&gt;name, err);</div><div class='add'>+        ret = 0;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='add'>+    ret = dht_disk_layout_merge(this, layout, i, disk_layout_raw,</div><div class='add'>+                                disk_layout_len);</div><div class='add'>+    if (ret != 0) {</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_WARNING, 0, DHT_MSG_LAYOUT_MERGE_FAILED,</div><div class='add'>+                "subvolume=%s", subvol-&gt;name, NULL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='add'>+    if (layout-&gt;commit_hash == 0) {</div><div class='add'>+        layout-&gt;commit_hash = layout-&gt;list[i].commit_hash;</div><div class='add'>+    } else if (layout-&gt;commit_hash != layout-&gt;list[i].commit_hash) {</div><div class='add'>+        layout-&gt;commit_hash = DHT_LAYOUT_HASH_INVALID;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-dht_layout_merge (xlator_t *this, dht_layout_t *layout, xlator_t *subvol,</div><div class='del'>-		  int op_ret, int op_errno, dict_t *xattr)</div><div class='del'>-{</div><div class='del'>-	int      i     = 0;</div><div class='del'>-	int      ret   = -1;</div><div class='del'>-	int      err   = -1;</div><div class='del'>-	void    *disk_layout_raw = NULL;</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-	if (op_ret != 0) {</div><div class='del'>-		err = op_errno;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	for (i = 0; i &lt; layout-&gt;cnt; i++) {</div><div class='del'>-		if (layout-&gt;list[i].xlator == NULL) {</div><div class='del'>-			layout-&gt;list[i].err    = err;</div><div class='del'>-			layout-&gt;list[i].xlator = subvol;</div><div class='del'>-			break;</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	if (op_ret != 0) {</div><div class='del'>-		ret = 0;</div><div class='del'>-		goto out;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	if (xattr) {</div><div class='del'>-		/* during lookup and not mkdir */</div><div class='del'>-		ret = dict_get_ptr (xattr, "trusted.glusterfs.dht",</div><div class='del'>-				    &amp;disk_layout_raw);</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	if (ret != 0) {</div><div class='del'>-		layout-&gt;list[i].err = -1;</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_TRACE,</div><div class='del'>-			"missing disk layout on %s. err = %d",</div><div class='del'>-			subvol-&gt;name, err);</div><div class='del'>-		ret = 0;</div><div class='del'>-		goto out;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	ret = dht_disk_layout_merge (this, layout, i, disk_layout_raw);</div><div class='del'>-	if (ret != 0) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-			"layout merge from subvolume %s failed",</div><div class='del'>-			subvol-&gt;name);</div><div class='del'>-		goto out;</div><div class='del'>-	}</div><div class='del'>-	layout-&gt;list[i].err = 0;</div><div class='add'>+    layout-&gt;list[i].err = 0;</div><div class='ctx'> </div><div class='ctx'> out:</div><div class='del'>-	return ret;</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+void</div><div class='add'>+dht_layout_entry_swap(dht_layout_t *layout, int i, int j)</div><div class='add'>+{</div><div class='add'>+    uint32_t start_swap = 0;</div><div class='add'>+    uint32_t stop_swap = 0;</div><div class='add'>+    uint32_t commit_hash_swap = 0;</div><div class='add'>+    xlator_t *xlator_swap = 0;</div><div class='add'>+    int err_swap = 0;</div><div class='add'>+</div><div class='add'>+    start_swap = layout-&gt;list[i].start;</div><div class='add'>+    stop_swap = layout-&gt;list[i].stop;</div><div class='add'>+    xlator_swap = layout-&gt;list[i].xlator;</div><div class='add'>+    err_swap = layout-&gt;list[i].err;</div><div class='add'>+    commit_hash_swap = layout-&gt;list[i].commit_hash;</div><div class='add'>+</div><div class='add'>+    layout-&gt;list[i].start = layout-&gt;list[j].start;</div><div class='add'>+    layout-&gt;list[i].stop = layout-&gt;list[j].stop;</div><div class='add'>+    layout-&gt;list[i].xlator = layout-&gt;list[j].xlator;</div><div class='add'>+    layout-&gt;list[i].err = layout-&gt;list[j].err;</div><div class='add'>+    layout-&gt;list[i].commit_hash = layout-&gt;list[j].commit_hash;</div><div class='add'>+</div><div class='add'>+    layout-&gt;list[j].start = start_swap;</div><div class='add'>+    layout-&gt;list[j].stop = stop_swap;</div><div class='add'>+    layout-&gt;list[j].xlator = xlator_swap;</div><div class='add'>+    layout-&gt;list[j].err = err_swap;</div><div class='add'>+    layout-&gt;list[j].commit_hash = commit_hash_swap;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> void</div><div class='del'>-dht_layout_entry_swap (dht_layout_t *layout, int i, int j)</div><div class='add'>+dht_layout_range_swap(dht_layout_t *layout, int i, int j)</div><div class='ctx'> {</div><div class='del'>-	uint32_t  start_swap = 0;</div><div class='del'>-	uint32_t  stop_swap = 0;</div><div class='del'>-	xlator_t *xlator_swap = 0;</div><div class='del'>-	int       err_swap = 0;</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-	start_swap  = layout-&gt;list[i].start;</div><div class='del'>-	stop_swap   = layout-&gt;list[i].stop;</div><div class='del'>-	xlator_swap = layout-&gt;list[i].xlator;</div><div class='del'>-	err_swap    = layout-&gt;list[i].err;</div><div class='del'>-</div><div class='del'>-	layout-&gt;list[i].start  = layout-&gt;list[j].start;</div><div class='del'>-	layout-&gt;list[i].stop   = layout-&gt;list[j].stop;</div><div class='del'>-	layout-&gt;list[i].xlator = layout-&gt;list[j].xlator;</div><div class='del'>-	layout-&gt;list[i].err    = layout-&gt;list[j].err;</div><div class='del'>-</div><div class='del'>-	layout-&gt;list[j].start  = start_swap;</div><div class='del'>-	layout-&gt;list[j].stop   = stop_swap;</div><div class='del'>-	layout-&gt;list[j].xlator = xlator_swap;</div><div class='del'>-	layout-&gt;list[j].err    = err_swap;</div><div class='add'>+    uint32_t start_swap = 0;</div><div class='add'>+    uint32_t stop_swap = 0;</div><div class='add'>+</div><div class='add'>+    start_swap = layout-&gt;list[i].start;</div><div class='add'>+    stop_swap = layout-&gt;list[i].stop;</div><div class='add'>+</div><div class='add'>+    layout-&gt;list[i].start = layout-&gt;list[j].start;</div><div class='add'>+    layout-&gt;list[i].stop = layout-&gt;list[j].stop;</div><div class='add'>+</div><div class='add'>+    layout-&gt;list[j].start = start_swap;</div><div class='add'>+    layout-&gt;list[j].stop = stop_swap;</div><div class='add'>+}</div><div class='add'>+static int64_t</div><div class='add'>+dht_layout_entry_cmp_volname(dht_layout_t *layout, int i, int j)</div><div class='add'>+{</div><div class='add'>+    return (strcmp(layout-&gt;list[i].xlator-&gt;name, layout-&gt;list[j].xlator-&gt;name));</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-int64_t</div><div class='del'>-dht_layout_entry_cmp_volname (dht_layout_t *layout, int i, int j)</div><div class='add'>+gf_boolean_t</div><div class='add'>+dht_is_subvol_in_layout(dht_layout_t *layout, xlator_t *xlator)</div><div class='ctx'> {</div><div class='del'>-	return (strcmp (layout-&gt;list[i].xlator-&gt;name, </div><div class='del'>-			layout-&gt;list[j].xlator-&gt;name));</div><div class='add'>+    int i = 0;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; layout-&gt;cnt; i++) {</div><div class='add'>+        /* Check if xlator is already part of layout, and layout is</div><div class='add'>+         * non-zero. */</div><div class='add'>+        if (!strcmp(layout-&gt;list[i].xlator-&gt;name, xlator-&gt;name)) {</div><div class='add'>+            if (layout-&gt;list[i].start != layout-&gt;list[i].stop)</div><div class='add'>+                return _gf_true;</div><div class='add'>+            break;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    return _gf_false;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-int64_t</div><div class='del'>-dht_layout_entry_cmp (dht_layout_t *layout, int i, int j)</div><div class='add'>+static int64_t</div><div class='add'>+dht_layout_entry_cmp(dht_layout_t *layout, int i, int j)</div><div class='ctx'> {</div><div class='del'>-	int64_t diff = 0;</div><div class='add'>+    int64_t diff = 0;</div><div class='ctx'> </div><div class='del'>-	if (layout-&gt;list[i].err || layout-&gt;list[j].err)</div><div class='del'>-		diff = layout-&gt;list[i].err - layout-&gt;list[j].err;</div><div class='del'>-	else</div><div class='del'>-		diff = (int64_t) layout-&gt;list[i].start</div><div class='del'>-			- (int64_t) layout-&gt;list[j].start;</div><div class='add'>+    /* swap zero'ed out layouts to front, if needed */</div><div class='add'>+    if (!layout-&gt;list[j].start &amp;&amp; !layout-&gt;list[j].stop) {</div><div class='add'>+        diff = (int64_t)layout-&gt;list[i].stop - (int64_t)layout-&gt;list[j].stop;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    diff = (int64_t)layout-&gt;list[i].start - (int64_t)layout-&gt;list[j].start;</div><div class='ctx'> </div><div class='del'>-	return diff;</div><div class='add'>+out:</div><div class='add'>+    return diff;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-dht_layout_sort (dht_layout_t *layout)</div><div class='add'>+dht_layout_sort(dht_layout_t *layout)</div><div class='ctx'> {</div><div class='del'>-	int       i = 0;</div><div class='del'>-	int       j = 0;</div><div class='del'>-	int64_t   ret = 0;</div><div class='add'>+    int i = 0;</div><div class='add'>+    int j = 0;</div><div class='add'>+    int64_t ret = 0;</div><div class='ctx'> </div><div class='del'>-	/* TODO: O(n^2) -- bad bad */</div><div class='add'>+    /* TODO: O(n^2) -- bad bad */</div><div class='ctx'> </div><div class='del'>-	for (i = 0; i &lt; layout-&gt;cnt - 1; i++) {</div><div class='del'>-		for (j = i + 1; j &lt; layout-&gt;cnt; j++) {</div><div class='del'>-			ret = dht_layout_entry_cmp (layout, i, j);</div><div class='del'>-			if (ret &gt; 0)</div><div class='del'>-				dht_layout_entry_swap (layout, i, j);</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='add'>+    for (i = 0; i &lt; layout-&gt;cnt - 1; i++) {</div><div class='add'>+        for (j = i + 1; j &lt; layout-&gt;cnt; j++) {</div><div class='add'>+            ret = dht_layout_entry_cmp(layout, i, j);</div><div class='add'>+            if (ret &gt; 0)</div><div class='add'>+                dht_layout_entry_swap(layout, i, j);</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	return 0;</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-dht_layout_sort_volname (dht_layout_t *layout)</div><div class='add'>+void</div><div class='add'>+dht_layout_sort_volname(dht_layout_t *layout)</div><div class='ctx'> {</div><div class='del'>-	int       i = 0;</div><div class='del'>-	int       j = 0;</div><div class='del'>-	int64_t   ret = 0;</div><div class='add'>+    int i = 0;</div><div class='add'>+    int j = 0;</div><div class='add'>+    int64_t ret = 0;</div><div class='ctx'> </div><div class='del'>-	/* TODO: O(n^2) -- bad bad */</div><div class='add'>+    /* TODO: O(n^2) -- bad bad */</div><div class='ctx'> </div><div class='del'>-	for (i = 0; i &lt; layout-&gt;cnt - 1; i++) {</div><div class='del'>-		for (j = i + 1; j &lt; layout-&gt;cnt; j++) {</div><div class='del'>-			ret = dht_layout_entry_cmp_volname (layout, i, j);</div><div class='del'>-			if (ret &gt; 0)</div><div class='del'>-				dht_layout_entry_swap (layout, i, j);</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='add'>+    for (i = 0; i &lt; layout-&gt;cnt - 1; i++) {</div><div class='add'>+        for (j = i + 1; j &lt; layout-&gt;cnt; j++) {</div><div class='add'>+            ret = dht_layout_entry_cmp_volname(layout, i, j);</div><div class='add'>+            if (ret &gt; 0)</div><div class='add'>+                dht_layout_entry_swap(layout, i, j);</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+dht_layout_anomalies(xlator_t *this, loc_t *loc, dht_layout_t *layout,</div><div class='add'>+                     uint32_t *holes_p, uint32_t *overlaps_p,</div><div class='add'>+                     uint32_t *missing_p, uint32_t *down_p, uint32_t *misc_p,</div><div class='add'>+                     uint32_t *no_space_p)</div><div class='add'>+{</div><div class='add'>+    uint32_t overlaps = 0;</div><div class='add'>+    uint32_t missing = 0;</div><div class='add'>+    uint32_t down = 0;</div><div class='add'>+    uint32_t misc = 0;</div><div class='add'>+    uint32_t hole_cnt = 0;</div><div class='add'>+    uint32_t overlap_cnt = 0;</div><div class='add'>+    int i = 0;</div><div class='add'>+    uint32_t prev_stop = 0;</div><div class='add'>+    uint32_t last_stop = 0;</div><div class='add'>+    char is_virgin = 1;</div><div class='add'>+    uint32_t no_space = 0;</div><div class='add'>+</div><div class='add'>+    /* This function scans through the layout spread of a directory to</div><div class='add'>+       check if there are any anomalies. Prior to calling this function</div><div class='add'>+       the layout entries should be sorted in the ascending order.</div><div class='add'>+</div><div class='add'>+       If the layout entry has err != 0</div><div class='add'>+            then increment the corresponding anomaly.</div><div class='add'>+       else</div><div class='add'>+            if (start of the current layout entry &gt; stop + 1 of previous</div><div class='add'>+               non erroneous layout entry)</div><div class='add'>+                    then it indicates a hole in the layout</div><div class='add'>+            if (start of the current layout entry &lt; stop + 1 of previous</div><div class='add'>+                non erroneous layout entry)</div><div class='add'>+                     then it indicates an overlap in the layout</div><div class='add'>+    */</div><div class='add'>+    last_stop = layout-&gt;list[0].start - 1;</div><div class='add'>+    prev_stop = last_stop;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; layout-&gt;cnt; i++) {</div><div class='add'>+        switch (layout-&gt;list[i].err) {</div><div class='add'>+            case -1:</div><div class='add'>+            case ENOENT:</div><div class='add'>+            case ESTALE:</div><div class='add'>+                missing++;</div><div class='add'>+                continue;</div><div class='add'>+            case ENOTCONN:</div><div class='add'>+                down++;</div><div class='add'>+                continue;</div><div class='add'>+            case ENOSPC:</div><div class='add'>+                no_space++;</div><div class='add'>+                continue;</div><div class='add'>+            case 0:</div><div class='add'>+                /* if err == 0 and start == stop, then it is a non misc++;</div><div class='add'>+                 * participating subvolume(spread-cnt). Then, do not</div><div class='add'>+                 * check for anomalies. If start != stop, then treat it</div><div class='add'>+                 * as misc err */</div><div class='add'>+                if (layout-&gt;list[i].start == layout-&gt;list[i].stop) {</div><div class='add'>+                    continue;</div><div class='add'>+                }</div><div class='add'>+                break;</div><div class='add'>+            default:</div><div class='add'>+                misc++;</div><div class='add'>+                continue;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-	return 0;</div><div class='add'>+        is_virgin = 0;</div><div class='add'>+</div><div class='add'>+        if ((prev_stop + 1) &lt; layout-&gt;list[i].start) {</div><div class='add'>+            hole_cnt++;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        if ((prev_stop + 1) &gt; layout-&gt;list[i].start) {</div><div class='add'>+            overlap_cnt++;</div><div class='add'>+            overlaps += ((prev_stop + 1) - layout-&gt;list[i].start);</div><div class='add'>+        }</div><div class='add'>+        prev_stop = layout-&gt;list[i].stop;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if ((last_stop - prev_stop) || is_virgin)</div><div class='add'>+        hole_cnt++;</div><div class='add'>+</div><div class='add'>+    if (holes_p)</div><div class='add'>+        *holes_p = hole_cnt;</div><div class='add'>+</div><div class='add'>+    if (overlaps_p)</div><div class='add'>+        *overlaps_p = overlap_cnt;</div><div class='add'>+</div><div class='add'>+    if (missing_p)</div><div class='add'>+        *missing_p = missing;</div><div class='add'>+</div><div class='add'>+    if (down_p)</div><div class='add'>+        *down_p = down;</div><div class='add'>+</div><div class='add'>+    if (misc_p)</div><div class='add'>+        *misc_p = misc;</div><div class='add'>+</div><div class='add'>+    if (no_space_p)</div><div class='add'>+        *no_space_p = no_space;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+int</div><div class='add'>+dht_layout_missing_dirs(dht_layout_t *layout)</div><div class='add'>+{</div><div class='add'>+    int i = 0, missing = 0;</div><div class='add'>+</div><div class='add'>+    if (layout == NULL)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; layout-&gt;cnt; i++) {</div><div class='add'>+        if ((layout-&gt;list[i].err == ENOENT) ||</div><div class='add'>+            ((layout-&gt;list[i].err == -1) &amp;&amp; (layout-&gt;list[i].start == 0) &amp;&amp;</div><div class='add'>+             (layout-&gt;list[i].stop == 0))) {</div><div class='add'>+            missing++;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return missing;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-dht_layout_anomalies (xlator_t *this, loc_t *loc, dht_layout_t *layout,</div><div class='del'>-		      uint32_t *holes_p, uint32_t *overlaps_p,</div><div class='del'>-		      uint32_t *missing_p, uint32_t *down_p, uint32_t *misc_p)</div><div class='add'>+dht_layout_normalize(xlator_t *this, loc_t *loc, dht_layout_t *layout)</div><div class='ctx'> {</div><div class='del'>-	uint32_t    overlaps = 0;</div><div class='del'>-	uint32_t    missing  = 0;</div><div class='del'>-	uint32_t    down     = 0;</div><div class='del'>-	uint32_t    misc     = 0;</div><div class='del'>-	uint32_t    hole_cnt = 0;</div><div class='del'>-	uint32_t    overlap_cnt = 0;</div><div class='del'>-	int         i = 0;</div><div class='del'>-	int         ret = 0;</div><div class='del'>-	uint32_t    prev_stop = 0;</div><div class='del'>-	uint32_t    last_stop = 0;</div><div class='del'>-	char        is_virgin = 1;</div><div class='del'>-</div><div class='del'>-	/* TODO: explain WTF is happening */</div><div class='del'>-</div><div class='del'>-	last_stop = layout-&gt;list[0].start - 1;</div><div class='del'>-	prev_stop = last_stop;</div><div class='del'>-</div><div class='del'>-	for (i = 0; i &lt; layout-&gt;cnt; i++) {</div><div class='del'>-		if (layout-&gt;list[i].err) {</div><div class='del'>-			switch (layout-&gt;list[i].err) {</div><div class='del'>-			case -1:</div><div class='del'>-			case ENOENT:</div><div class='del'>-				missing++;</div><div class='del'>-				break;</div><div class='del'>-			case ENOTCONN:</div><div class='del'>-				down++;</div><div class='del'>-				break;</div><div class='del'>-			case ENOSPC:</div><div class='del'>-				down++;</div><div class='del'>-				break;</div><div class='del'>-			default:</div><div class='del'>-				misc++;</div><div class='del'>-			}</div><div class='del'>-			continue;</div><div class='del'>-		}</div><div class='del'>-</div><div class='del'>-		is_virgin = 0;</div><div class='del'>-</div><div class='del'>-		if ((prev_stop + 1) &lt; layout-&gt;list[i].start) {</div><div class='del'>-			hole_cnt++;</div><div class='del'>-		}</div><div class='del'>-</div><div class='del'>-		if ((prev_stop + 1) &gt; layout-&gt;list[i].start) {</div><div class='del'>-			overlap_cnt++;</div><div class='del'>-			overlaps += ((prev_stop + 1) - layout-&gt;list[i].start);</div><div class='del'>-		}</div><div class='del'>-		prev_stop = layout-&gt;list[i].stop;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	if ((last_stop - prev_stop) || is_virgin)</div><div class='del'>-	    hole_cnt++;</div><div class='del'>-</div><div class='del'>-	if (holes_p)</div><div class='del'>-		*holes_p = hole_cnt;</div><div class='del'>-</div><div class='del'>-	if (overlaps_p)</div><div class='del'>-		*overlaps_p = overlap_cnt;</div><div class='del'>-</div><div class='del'>-	if (missing_p)</div><div class='del'>-		*missing_p = missing;</div><div class='del'>-</div><div class='del'>-	if (down_p)</div><div class='del'>-		*down_p = down;</div><div class='del'>-</div><div class='del'>-	if (misc_p)</div><div class='del'>-		*misc_p = misc;</div><div class='del'>-</div><div class='del'>-	return ret;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    uint32_t holes = 0;</div><div class='add'>+    uint32_t overlaps = 0;</div><div class='add'>+    uint32_t missing = 0;</div><div class='add'>+    uint32_t down = 0;</div><div class='add'>+    uint32_t misc = 0, missing_dirs = 0;</div><div class='add'>+    char gfid[GF_UUID_BUF_SIZE] = {0};</div><div class='add'>+</div><div class='add'>+    ret = dht_layout_sort(layout);</div><div class='add'>+    if (ret == -1) {</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_WARNING, 0, DHT_MSG_LAYOUT_SORT_FAILED,</div><div class='add'>+                NULL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    gf_uuid_unparse(loc-&gt;gfid, gfid);</div><div class='add'>+</div><div class='add'>+    dht_layout_anomalies(this, loc, layout, &amp;holes, &amp;overlaps, &amp;missing, &amp;down,</div><div class='add'>+                         &amp;misc, NULL);</div><div class='add'>+</div><div class='add'>+    if (holes || overlaps) {</div><div class='add'>+        if (missing == layout-&gt;cnt) {</div><div class='add'>+            gf_msg_debug(this-&gt;name, 0,</div><div class='add'>+                         "Directory %s looked up first time"</div><div class='add'>+                         " gfid = %s",</div><div class='add'>+                         loc-&gt;path, gfid);</div><div class='add'>+        } else {</div><div class='add'>+            gf_smsg(this-&gt;name, GF_LOG_INFO, 0, DHT_MSG_ANOMALIES_INFO,</div><div class='add'>+                    "path=%s", loc-&gt;path, "gfid=%s", gfid, "holes=%d", holes,</div><div class='add'>+                    "overlaps=%d", overlaps, NULL);</div><div class='add'>+        }</div><div class='add'>+        ret = -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (ret &gt;= 0) {</div><div class='add'>+        missing_dirs = dht_layout_missing_dirs(layout);</div><div class='add'>+        /* TODO During DHT selfheal rewrite (almost) find a better place</div><div class='add'>+         * to detect this - probably in dht_layout_anomalies()</div><div class='add'>+         */</div><div class='add'>+        if (missing_dirs &gt; 0)</div><div class='add'>+            ret += missing_dirs;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+int</div><div class='add'>+dht_dir_has_layout(dict_t *xattr, char *name)</div><div class='add'>+{</div><div class='add'>+    void *disk_layout_raw = NULL;</div><div class='add'>+</div><div class='add'>+    return dict_get_ptr(xattr, name, &amp;disk_layout_raw);</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-dht_layout_normalize (xlator_t *this, loc_t *loc, dht_layout_t *layout)</div><div class='add'>+dht_layout_dir_mismatch(xlator_t *this, dht_layout_t *layout, xlator_t *subvol,</div><div class='add'>+                        loc_t *loc, dict_t *xattr)</div><div class='ctx'> {</div><div class='del'>-	int          ret   = 0;</div><div class='del'>-	int          i = 0;</div><div class='del'>-	uint32_t     holes = 0;</div><div class='del'>-	uint32_t     overlaps = 0;</div><div class='del'>-	uint32_t     missing = 0;</div><div class='del'>-	uint32_t     down = 0;</div><div class='del'>-	uint32_t     misc = 0;</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-	ret = dht_layout_sort (layout);</div><div class='del'>-	if (ret == -1) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-			"sort failed?! how the ....");</div><div class='del'>-		goto out;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	ret = dht_layout_anomalies (this, loc, layout,</div><div class='del'>-				    &amp;holes, &amp;overlaps,</div><div class='del'>-				    &amp;missing, &amp;down, &amp;misc);</div><div class='del'>-	if (ret == -1) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-			"error while finding anomalies in %s -- not good news",</div><div class='del'>-			loc-&gt;path);</div><div class='del'>-		goto out;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	if (holes || overlaps) {</div><div class='del'>-		if (missing == layout-&gt;cnt) {</div><div class='del'>-			gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-				"directory %s looked up first time",</div><div class='del'>-				loc-&gt;path);</div><div class='del'>-		} else {</div><div class='del'>-			gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-				"found anomalies in %s. holes=%d overlaps=%d",</div><div class='del'>-				loc-&gt;path, holes, overlaps);</div><div class='del'>-		}</div><div class='del'>-		ret = 1;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	for (i = 0; i &lt; layout-&gt;cnt; i++) {</div><div class='del'>-	/* TODO During DHT selfheal rewrite (almost) find a better place to </div><div class='del'>-	 * detect this - probably in dht_layout_anomalies() </div><div class='del'>-	 */</div><div class='del'>-		if (layout-&gt;list[i].err &gt; 0) {</div><div class='del'>-			gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-				"path=%s err=%s on subvol=%s",</div><div class='del'>-                                loc-&gt;path, strerror (layout-&gt;list[i].err),</div><div class='del'>-                                (layout-&gt;list[i].xlator ?</div><div class='del'>-                                 layout-&gt;list[i].xlator-&gt;name : "&lt;&gt;"));</div><div class='del'>-                        if (layout-&gt;list[i].err == ENOENT)</div><div class='del'>-                                ret = 1;</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='add'>+    int idx = 0;</div><div class='add'>+    int pos = -1;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    int err = 0;</div><div class='add'>+    int dict_ret = 0;</div><div class='add'>+    int32_t disk_layout[4];</div><div class='add'>+    void *disk_layout_raw = NULL;</div><div class='add'>+    uint32_t start_off = -1;</div><div class='add'>+    uint32_t stop_off = -1;</div><div class='add'>+    uint32_t commit_hash = -1;</div><div class='add'>+    dht_conf_t *conf = this-&gt;private;</div><div class='add'>+    char gfid[GF_UUID_BUF_SIZE] = {0};</div><div class='add'>+</div><div class='add'>+    if (loc &amp;&amp; loc-&gt;inode)</div><div class='add'>+        gf_uuid_unparse(loc-&gt;inode-&gt;gfid, gfid);</div><div class='add'>+</div><div class='add'>+    for (idx = 0; idx &lt; layout-&gt;cnt; idx++) {</div><div class='add'>+        if (layout-&gt;list[idx].xlator == subvol) {</div><div class='add'>+            pos = idx;</div><div class='add'>+            break;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='ctx'> </div><div class='add'>+    if (pos == -1) {</div><div class='add'>+        if (loc) {</div><div class='add'>+            gf_msg_debug(this-&gt;name, 0, "%s - no layout info for subvolume %s",</div><div class='add'>+                         loc ? loc-&gt;path : "path not found", subvol-&gt;name);</div><div class='add'>+        }</div><div class='add'>+        ret = 1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    err = layout-&gt;list[pos].err;</div><div class='add'>+</div><div class='add'>+    if (!xattr) {</div><div class='add'>+        if (err == 0) {</div><div class='add'>+            if (loc) {</div><div class='add'>+                gf_smsg(this-&gt;name, GF_LOG_INFO, 0, DHT_MSG_XATTR_DICT_NULL,</div><div class='add'>+                        "path=%s", loc-&gt;path, NULL);</div><div class='add'>+            } else {</div><div class='add'>+                gf_smsg(this-&gt;name, GF_LOG_INFO, 0, DHT_MSG_XATTR_DICT_NULL,</div><div class='add'>+                        "path not found", NULL);</div><div class='add'>+            }</div><div class='add'>+            ret = -1;</div><div class='add'>+        }</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    dict_ret = dict_get_ptr(xattr, conf-&gt;xattr_name, &amp;disk_layout_raw);</div><div class='add'>+</div><div class='add'>+    if (dict_ret &lt; 0) {</div><div class='add'>+        if (err == 0 &amp;&amp; layout-&gt;list[pos].stop) {</div><div class='add'>+            if (loc) {</div><div class='add'>+                gf_smsg(this-&gt;name, GF_LOG_INFO, 0, DHT_MSG_DISK_LAYOUT_MISSING,</div><div class='add'>+                        "path=%s", loc-&gt;path, "gfid=%s", gfid, NULL);</div><div class='add'>+            } else {</div><div class='add'>+                gf_smsg(this-&gt;name, GF_LOG_INFO, 0, DHT_MSG_DISK_LAYOUT_MISSING,</div><div class='add'>+                        "path not found"</div><div class='add'>+                        "gfid=%s",</div><div class='add'>+                        gfid, NULL);</div><div class='add'>+            }</div><div class='add'>+            ret = -1;</div><div class='add'>+        }</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    memcpy(disk_layout, disk_layout_raw, sizeof(disk_layout));</div><div class='add'>+</div><div class='add'>+    start_off = ntoh32(disk_layout[2]);</div><div class='add'>+    stop_off = ntoh32(disk_layout[3]);</div><div class='add'>+    commit_hash = ntoh32(disk_layout[0]);</div><div class='add'>+</div><div class='add'>+    if ((layout-&gt;list[pos].start != start_off) ||</div><div class='add'>+        (layout-&gt;list[pos].stop != stop_off) ||</div><div class='add'>+        (layout-&gt;list[pos].commit_hash != commit_hash)) {</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_INFO, 0, DHT_MSG_LAYOUT_INFO, "subvol=%s",</div><div class='add'>+                layout-&gt;list[pos].xlator-&gt;name, "inode-layout:start=0x%x",</div><div class='add'>+                layout-&gt;list[pos].start, "inode-layout:stop=0x%x",</div><div class='add'>+                layout-&gt;list[pos].stop, "layout-commit-hash=0x%x; ",</div><div class='add'>+                layout-&gt;list[pos].commit_hash, "disk-layout:start-off=0x%x",</div><div class='add'>+                start_off, "disk-layout:top-off=0x%x", stop_off,</div><div class='add'>+                "commit-hash=0x%x", commit_hash, NULL);</div><div class='add'>+        ret = 1;</div><div class='add'>+    } else {</div><div class='add'>+        ret = 0;</div><div class='add'>+    }</div><div class='ctx'> out:</div><div class='del'>-	return ret;</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-dht_layout_dir_mismatch (xlator_t *this, dht_layout_t *layout, xlator_t *subvol,</div><div class='del'>-			 loc_t *loc, dict_t *xattr)</div><div class='add'>+dht_layout_preset(xlator_t *this, xlator_t *subvol, inode_t *inode)</div><div class='ctx'> {</div><div class='del'>-	int       idx = 0;</div><div class='del'>-	int       pos = -1;</div><div class='del'>-	int       ret = 0;</div><div class='del'>-        int       err = 0;</div><div class='del'>-        int       dict_ret = 0;</div><div class='del'>-	int32_t   disk_layout[4];</div><div class='del'>-        void     *disk_layout_raw = NULL;</div><div class='del'>-	int32_t   count = -1;</div><div class='del'>-	uint32_t  start_off = -1;</div><div class='del'>-	uint32_t  stop_off = -1;</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-	for (idx = 0; idx &lt; layout-&gt;cnt; idx++) {</div><div class='del'>-		if (layout-&gt;list[idx].xlator == subvol) {</div><div class='del'>-			pos = idx;</div><div class='del'>-			break;</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='del'>-	</div><div class='del'>-	if (pos == -1) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-			"%s - no layout info for subvolume %s",</div><div class='del'>-			loc-&gt;path, subvol-&gt;name);</div><div class='del'>-		ret = 1;</div><div class='del'>-		goto out;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-        err = layout-&gt;list[pos].err;</div><div class='del'>-</div><div class='del'>-	if (!xattr) {</div><div class='del'>-                if (err == 0) {</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-                                "%s - xattr dictionary is NULL",</div><div class='del'>-                                loc-&gt;path);</div><div class='del'>-                        ret = -1;</div><div class='del'>-                }</div><div class='del'>-		goto out;</div><div class='del'>-	}</div><div class='add'>+    dht_layout_t *layout = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    dht_conf_t *conf = NULL;</div><div class='ctx'> </div><div class='del'>-	dict_ret = dict_get_ptr (xattr, "trusted.glusterfs.dht",</div><div class='del'>-                                 &amp;disk_layout_raw);</div><div class='add'>+    conf = this-&gt;private;</div><div class='add'>+    if (!conf)</div><div class='add'>+        goto out;</div><div class='ctx'> </div><div class='del'>-	if (dict_ret &lt; 0) {</div><div class='del'>-                if (err == 0) {</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-                                "%s - disk layout missing", loc-&gt;path);</div><div class='del'>-                        ret = -1;</div><div class='del'>-                }</div><div class='del'>-		goto out;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-        memcpy (disk_layout, disk_layout_raw, sizeof (disk_layout));</div><div class='del'>-</div><div class='del'>-	count  = ntoh32 (disk_layout[0]);</div><div class='del'>-	if (count != 1) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-			"%s - disk layout has invalid count %d",</div><div class='del'>-			loc-&gt;path, count);</div><div class='del'>-		ret = -1;</div><div class='del'>-		goto out;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	start_off = ntoh32 (disk_layout[2]);</div><div class='del'>-	stop_off  = ntoh32 (disk_layout[3]);</div><div class='del'>-	</div><div class='del'>-	if ((layout-&gt;list[pos].start != start_off)</div><div class='del'>-	    || (layout-&gt;list[pos].stop != stop_off)) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-			"subvol: %s; inode layout - %"PRId32" - %"PRId32"; "</div><div class='del'>-			"disk layout - %"PRId32" - %"PRId32,</div><div class='del'>-			layout-&gt;list[pos].xlator-&gt;name,</div><div class='del'>-			layout-&gt;list[pos].start, layout-&gt;list[pos].stop,</div><div class='del'>-			start_off, stop_off);</div><div class='del'>-		ret = 1;</div><div class='del'>-	} else {</div><div class='del'>-		ret = 0;</div><div class='del'>-	}</div><div class='add'>+    layout = dht_layout_for_subvol(this, subvol);</div><div class='add'>+    if (!layout) {</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_INFO, 0, DHT_MSG_SUBVOL_NO_LAYOUT_INFO,</div><div class='add'>+                "subvolume=%s", subvol ? subvol-&gt;name : "&lt;nil&gt;", NULL);</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    gf_msg_debug(this-&gt;name, 0, "file = %s, subvol = %s",</div><div class='add'>+                 uuid_utoa(inode-&gt;gfid), subvol ? subvol-&gt;name : "&lt;nil&gt;");</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;conf-&gt;layout_lock);</div><div class='add'>+    {</div><div class='add'>+        dht_inode_ctx_layout_set(inode, this, layout);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    UNLOCK(&amp;conf-&gt;layout_lock);</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='ctx'> out:</div><div class='del'>-	return ret;</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-dht_layout_preset (xlator_t *this, xlator_t *subvol, inode_t *inode)</div><div class='add'>+dht_layout_index_for_subvol(dht_layout_t *layout, xlator_t *subvol)</div><div class='ctx'> {</div><div class='del'>-        dht_layout_t *layout = NULL;</div><div class='del'>-        int           ret = -1;</div><div class='del'>-        dht_conf_t   *conf = NULL;</div><div class='del'>-</div><div class='del'>-        conf = this-&gt;private;</div><div class='del'>-</div><div class='del'>-	layout = dht_layout_for_subvol (this, subvol);</div><div class='del'>-	if (!layout) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-			"no pre-set layout for subvolume %s",</div><div class='del'>-			subvol ? subvol-&gt;name : "&lt;nil&gt;");</div><div class='del'>-		ret = -1;</div><div class='del'>-		goto out;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-        LOCK (&amp;conf-&gt;layout_lock);</div><div class='del'>-        {</div><div class='del'>-                inode_ctx_put (inode, this, (uint64_t)(long)layout);</div><div class='add'>+    int i = 0, ret = -1;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; layout-&gt;cnt; i++) {</div><div class='add'>+        if (layout-&gt;list[i].xlator == subvol) {</div><div class='add'>+            ret = i;</div><div class='add'>+            break;</div><div class='ctx'>         }</div><div class='del'>-        UNLOCK (&amp;conf-&gt;layout_lock);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        ret = 0;</div><div class='del'>-out:</div><div class='del'>-        return ret;</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='head'>diff --git a/xlators/cluster/dht/src/dht-linkfile.c b/xlators/cluster/dht/src/dht-linkfile.c<br/>index 1ecae5dfd35..89ec6cca56e 100644<br/>--- a/<a href='/cgit/glusterfs.git/tree/xlators/cluster/dht/src/dht-linkfile.c?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/cluster/dht/src/dht-linkfile.c</a><br/>+++ b/<a href='/cgit/glusterfs.git/tree/xlators/cluster/dht/src/dht-linkfile.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>xlators/cluster/dht/src/dht-linkfile.c</a></div><div class='hunk'>@@ -1,241 +1,328 @@</div><div class='ctx'> /*</div><div class='del'>-   Copyright (c) 2008-2009 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='del'>-   This file is part of GlusterFS.</div><div class='del'>-</div><div class='del'>-   GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-   it under the terms of the GNU General Public License as published</div><div class='del'>-   by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-   or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-   GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-   WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-   General Public License for more details.</div><div class='del'>-</div><div class='del'>-   You should have received a copy of the GNU General Public License</div><div class='del'>-   along with this program.  If not, see</div><div class='del'>-   &lt;http://www.gnu.org/licenses/&gt;.</div><div class='del'>-*/</div><div class='del'>-</div><div class='del'>-#ifndef _CONFIG_H</div><div class='del'>-#define _CONFIG_H</div><div class='del'>-#include "config.h"</div><div class='del'>-#endif</div><div class='add'>+  Copyright (c) 2008-2012 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='ctx'> </div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='ctx'> </div><div class='del'>-#include "glusterfs.h"</div><div class='del'>-#include "xlator.h"</div><div class='del'>-#include "compat.h"</div><div class='add'>+#include &lt;glusterfs/compat.h&gt;</div><div class='ctx'> #include "dht-common.h"</div><div class='ctx'> </div><div class='add'>+static int</div><div class='add'>+dht_linkfile_lookup_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                        int op_ret, int op_errno, inode_t *inode,</div><div class='add'>+                        struct iatt *stbuf, dict_t *xattr,</div><div class='add'>+                        struct iatt *postparent)</div><div class='add'>+{</div><div class='add'>+    char is_linkfile = 0;</div><div class='add'>+    dht_conf_t *conf = NULL;</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    xlator_t *prev = NULL;</div><div class='add'>+    char gfid[GF_UUID_BUF_SIZE] = {0};</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    prev = cookie;</div><div class='add'>+    conf = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    if (op_ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    gf_uuid_unparse(local-&gt;loc.gfid, gfid);</div><div class='add'>+</div><div class='add'>+    is_linkfile = check_is_linkfile(inode, stbuf, xattr, conf-&gt;link_xattr_name);</div><div class='add'>+    if (!is_linkfile)</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_WARNING, 0, DHT_MSG_NOT_LINK_FILE_ERROR,</div><div class='add'>+                "name=%s", prev-&gt;name, "path=%s", local-&gt;loc.path, "gfid=%s",</div><div class='add'>+                gfid, NULL);</div><div class='add'>+out:</div><div class='add'>+    local-&gt;linkfile.linkfile_cbk(frame, cookie, this, op_ret, op_errno, inode,</div><div class='add'>+                                 stbuf, postparent, postparent, xattr);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='add'>+static int</div><div class='add'>+dht_linkfile_create_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                        int op_ret, int op_errno, inode_t *inode,</div><div class='add'>+                        struct iatt *stbuf, struct iatt *preparent,</div><div class='add'>+                        struct iatt *postparent, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    xlator_t *subvol = NULL;</div><div class='add'>+    dict_t *xattrs = NULL;</div><div class='add'>+    dht_conf_t *conf = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+</div><div class='add'>+    if (!op_ret)</div><div class='add'>+        local-&gt;linked = _gf_true;</div><div class='add'>+</div><div class='add'>+    FRAME_SU_UNDO(frame, dht_local_t);</div><div class='add'>+</div><div class='add'>+    if (op_ret &amp;&amp; (op_errno == EEXIST)) {</div><div class='add'>+        conf = this-&gt;private;</div><div class='add'>+        subvol = cookie;</div><div class='add'>+        if (!subvol)</div><div class='add'>+            goto out;</div><div class='add'>+        xattrs = dict_new();</div><div class='add'>+        if (!xattrs)</div><div class='add'>+            goto out;</div><div class='add'>+        ret = dict_set_uint32(xattrs, conf-&gt;link_xattr_name, 256);</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_smsg(this-&gt;name, GF_LOG_ERROR, 0, DHT_MSG_DICT_SET_FAILED,</div><div class='add'>+                    "mame=%s", conf-&gt;link_xattr_name, NULL);</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        STACK_WIND_COOKIE(frame, dht_linkfile_lookup_cbk, subvol, subvol,</div><div class='add'>+                          subvol-&gt;fops-&gt;lookup, &amp;local-&gt;linkfile.loc, xattrs);</div><div class='add'>+        if (xattrs)</div><div class='add'>+            dict_unref(xattrs);</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='add'>+out:</div><div class='add'>+    local-&gt;linkfile.linkfile_cbk(frame, cookie, this, op_ret, op_errno, inode,</div><div class='add'>+                                 stbuf, preparent, postparent, xdata);</div><div class='add'>+    if (xattrs)</div><div class='add'>+        dict_unref(xattrs);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-dht_linkfile_xattr_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-			int op_ret, int op_errno)</div><div class='add'>+dht_linkfile_create(call_frame_t *frame, fop_mknod_cbk_t linkfile_cbk,</div><div class='add'>+                    xlator_t *this, xlator_t *tovol, xlator_t *fromvol,</div><div class='add'>+                    loc_t *loc)</div><div class='ctx'> {</div><div class='del'>-	dht_local_t *local = NULL;</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    dict_t *dict = NULL;</div><div class='add'>+    int need_unref = 0;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    dht_conf_t *conf = this-&gt;private;</div><div class='add'>+    char gfid[GF_UUID_BUF_SIZE] = {0};</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    local-&gt;linkfile.linkfile_cbk = linkfile_cbk;</div><div class='add'>+    local-&gt;linkfile.srcvol = tovol;</div><div class='add'>+    loc_copy(&amp;local-&gt;linkfile.loc, loc);</div><div class='add'>+</div><div class='add'>+    local-&gt;linked = _gf_false;</div><div class='add'>+</div><div class='add'>+    dict = local-&gt;params;</div><div class='add'>+    if (!dict) {</div><div class='add'>+        dict = dict_new();</div><div class='add'>+        if (!dict)</div><div class='add'>+            goto out;</div><div class='add'>+        need_unref = 1;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='add'>+    if (!gf_uuid_is_null(local-&gt;gfid)) {</div><div class='add'>+        gf_uuid_unparse(local-&gt;gfid, gfid);</div><div class='ctx'> </div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-	local-&gt;linkfile.linkfile_cbk (frame, cookie, this, op_ret, op_errno,</div><div class='del'>-				      local-&gt;linkfile.inode,</div><div class='del'>-				      &amp;local-&gt;linkfile.stbuf, NULL, NULL);</div><div class='add'>+        ret = dict_set_gfuuid(dict, "gfid-req", local-&gt;gfid, true);</div><div class='add'>+        if (ret)</div><div class='add'>+            gf_smsg("dht-linkfile", GF_LOG_INFO, 0, DHT_MSG_DICT_SET_FAILED,</div><div class='add'>+                    "path=%s", loc-&gt;path, "gfid=%s", gfid, NULL);</div><div class='add'>+    } else {</div><div class='add'>+        gf_uuid_unparse(loc-&gt;gfid, gfid);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_set_str(dict, GLUSTERFS_INTERNAL_FOP_KEY, "yes");</div><div class='add'>+    if (ret)</div><div class='add'>+        gf_smsg("dht-linkfile", GF_LOG_INFO, 0, DHT_MSG_DICT_SET_FAILED,</div><div class='add'>+                "path=%s", loc-&gt;path, "key=%s", GLUSTERFS_INTERNAL_FOP_KEY,</div><div class='add'>+                "gfid=%s", gfid, NULL);</div><div class='add'>+</div><div class='add'>+    ret = dict_set_str(dict, conf-&gt;link_xattr_name, tovol-&gt;name);</div><div class='add'>+</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        gf_smsg(frame-&gt;this-&gt;name, GF_LOG_INFO, 0, DHT_MSG_CREATE_LINK_FAILED,</div><div class='add'>+                "path=%s", loc-&gt;path, "gfid=%s", gfid, NULL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    local-&gt;link_subvol = fromvol;</div><div class='add'>+    /* Always create as root:root. dht_linkfile_attr_heal fixes the</div><div class='add'>+     * ownsership */</div><div class='add'>+    FRAME_SU_DO(frame, dht_local_t);</div><div class='add'>+    STACK_WIND_COOKIE(frame, dht_linkfile_create_cbk, fromvol, fromvol,</div><div class='add'>+                      fromvol-&gt;fops-&gt;mknod, loc, S_IFREG | DHT_LINKFILE_MODE, 0,</div><div class='add'>+                      0, dict);</div><div class='add'>+</div><div class='add'>+    if (need_unref &amp;&amp; dict)</div><div class='add'>+        dict_unref(dict);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+out:</div><div class='add'>+    local-&gt;linkfile.linkfile_cbk(frame, frame-&gt;this, frame-&gt;this, -1, ENOMEM,</div><div class='add'>+                                 loc-&gt;inode, NULL, NULL, NULL, NULL);</div><div class='add'>+</div><div class='add'>+    if (need_unref &amp;&amp; dict)</div><div class='add'>+        dict_unref(dict);</div><div class='ctx'> </div><div class='del'>-	return 0;</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+int</div><div class='add'>+dht_linkfile_unlink_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                        int32_t op_ret, int32_t op_errno,</div><div class='add'>+                        struct iatt *preparent, struct iatt *postparent,</div><div class='add'>+                        dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    xlator_t *subvol = NULL;</div><div class='add'>+    char gfid[GF_UUID_BUF_SIZE] = {0};</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    subvol = cookie;</div><div class='add'>+</div><div class='add'>+    if (op_ret == -1) {</div><div class='add'>+        gf_uuid_unparse(local-&gt;loc.gfid, gfid);</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_INFO, op_errno, DHT_MSG_UNLINK_FAILED,</div><div class='add'>+                "path=%s", local-&gt;loc.path, "gfid=%s", gfid, "subvolume=%s",</div><div class='add'>+                subvol-&gt;name, NULL);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    DHT_STACK_DESTROY(frame);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-dht_linkfile_create_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-                         int op_ret, int op_errno, inode_t *inode,</div><div class='del'>-                         struct iatt *stbuf, struct iatt *preparent,</div><div class='del'>-                         struct iatt *postparent)</div><div class='add'>+dht_linkfile_unlink(call_frame_t *frame, xlator_t *this, xlator_t *subvol,</div><div class='add'>+                    loc_t *loc)</div><div class='ctx'> {</div><div class='del'>-	dht_local_t  *local = NULL;</div><div class='del'>-	call_frame_t *prev = NULL;</div><div class='del'>-	dict_t       *xattr = NULL;</div><div class='del'>-	data_t       *str_data = NULL;</div><div class='del'>-	int           ret = -1;</div><div class='del'>-</div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-	prev  = cookie;</div><div class='del'>-</div><div class='del'>-	if (op_ret == -1)</div><div class='del'>-		goto err;</div><div class='del'>-</div><div class='del'>-	xattr = get_new_dict ();</div><div class='del'>-	if (!xattr) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-			"Out of memory");</div><div class='del'>-		op_errno = ENOMEM;</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	local-&gt;linkfile.xattr = dict_ref (xattr);</div><div class='del'>-	local-&gt;linkfile.inode = inode_ref (inode);</div><div class='del'>-</div><div class='del'>-	str_data = str_to_data (local-&gt;linkfile.srcvol-&gt;name);</div><div class='del'>-	if (!str_data) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-			"Out of memory");</div><div class='del'>-		op_errno = ENOMEM;</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	ret = dict_set (xattr, "trusted.glusterfs.dht.linkto", str_data);</div><div class='del'>-	if (ret &lt; 0) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-			"failed to initialize linkfile data");</div><div class='del'>-	}</div><div class='del'>-	str_data = NULL;</div><div class='del'>-</div><div class='del'>-	local-&gt;linkfile.stbuf = *stbuf;</div><div class='del'>-</div><div class='del'>-	STACK_WIND (frame, dht_linkfile_xattr_cbk,</div><div class='del'>-		    prev-&gt;this, prev-&gt;this-&gt;fops-&gt;setxattr,</div><div class='del'>-		    &amp;local-&gt;linkfile.loc, local-&gt;linkfile.xattr, 0);</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='add'>+    call_frame_t *unlink_frame = NULL;</div><div class='add'>+    dht_local_t *unlink_local = NULL;</div><div class='ctx'> </div><div class='add'>+    unlink_frame = copy_frame(frame);</div><div class='add'>+    if (!unlink_frame) {</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Using non-fop value here, as anyways, 'local-&gt;fop' is not used in</div><div class='add'>+       this particular case */</div><div class='add'>+    unlink_local = dht_local_init(unlink_frame, loc, NULL, GF_FOP_MAXVALUE);</div><div class='add'>+    if (!unlink_local) {</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    STACK_WIND_COOKIE(unlink_frame, dht_linkfile_unlink_cbk, subvol, subvol,</div><div class='add'>+                      subvol-&gt;fops-&gt;unlink, &amp;unlink_local-&gt;loc, 0, NULL);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='ctx'> err:</div><div class='del'>-	if (str_data) {</div><div class='del'>-		data_destroy (str_data);</div><div class='del'>-		str_data = NULL;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-        local-&gt;linkfile.linkfile_cbk (frame, cookie, this, op_ret, op_errno,</div><div class='del'>-                                      inode, stbuf, preparent, postparent);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='add'>+    if (unlink_frame)</div><div class='add'>+        DHT_STACK_DESTROY(unlink_frame);</div><div class='ctx'> </div><div class='add'>+    return -1;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-dht_linkfile_create (call_frame_t *frame, fop_mknod_cbk_t linkfile_cbk,</div><div class='del'>-		     xlator_t *tovol, xlator_t *fromvol, loc_t *loc)</div><div class='add'>+xlator_t *</div><div class='add'>+dht_linkfile_subvol(xlator_t *this, inode_t *inode, struct iatt *stbuf,</div><div class='add'>+                    dict_t *xattr)</div><div class='ctx'> {</div><div class='del'>-	dht_local_t *local = NULL;</div><div class='del'>-        dict_t      *dict = NULL;</div><div class='del'>-        int          ret = 0;</div><div class='add'>+    dht_conf_t *conf = NULL;</div><div class='add'>+    xlator_t *subvol = NULL;</div><div class='add'>+    void *volname = NULL;</div><div class='add'>+    int i = 0, ret = 0;</div><div class='ctx'> </div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-	local-&gt;linkfile.linkfile_cbk = linkfile_cbk;</div><div class='del'>-	local-&gt;linkfile.srcvol = tovol;</div><div class='del'>-	loc_copy (&amp;local-&gt;linkfile.loc, loc);</div><div class='add'>+    conf = this-&gt;private;</div><div class='ctx'> </div><div class='del'>-        dict = dict_new ();</div><div class='del'>-        if (!dict)</div><div class='del'>-                goto out;</div><div class='add'>+    if (!xattr)</div><div class='add'>+        goto out;</div><div class='ctx'> </div><div class='del'>-        ret = dict_set_static_bin (dict, "gfid-req", loc-&gt;inode-&gt;gfid, 16);</div><div class='del'>-        if (ret)</div><div class='del'>-                gf_log ("dht-linkfile", GF_LOG_DEBUG, "gfid set failed");</div><div class='add'>+    ret = dict_get_ptr(xattr, conf-&gt;link_xattr_name, &amp;volname);</div><div class='ctx'> </div><div class='del'>-	STACK_WIND (frame, dht_linkfile_create_cbk,</div><div class='del'>-		    fromvol, fromvol-&gt;fops-&gt;mknod, loc,</div><div class='del'>-		    S_IFREG | DHT_LINKFILE_MODE, 0, dict);</div><div class='add'>+    if ((-1 == ret) || !volname)</div><div class='add'>+        goto out;</div><div class='ctx'> </div><div class='del'>-        if (dict)</div><div class='del'>-                dict_unref (dict);</div><div class='add'>+    for (i = 0; i &lt; conf-&gt;subvolume_cnt; i++) {</div><div class='add'>+        if (strcmp(conf-&gt;subvolumes[i]-&gt;name, (char *)volname) == 0) {</div><div class='add'>+            subvol = conf-&gt;subvolumes[i];</div><div class='add'>+            break;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        return 0;</div><div class='ctx'> out:</div><div class='del'>-	local-&gt;linkfile.linkfile_cbk (frame, NULL, frame-&gt;this, -1, ENOMEM,</div><div class='del'>-				      loc-&gt;inode, NULL, NULL, NULL);</div><div class='del'>-	return 0;</div><div class='add'>+    return subvol;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-dht_linkfile_unlink_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-			 int32_t op_ret, int32_t op_errno,</div><div class='del'>-                         struct iatt *preparent, struct iatt *postparent)</div><div class='add'>+static int</div><div class='add'>+dht_linkfile_setattr_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                         int op_ret, int op_errno, struct iatt *statpre,</div><div class='add'>+                         struct iatt *statpost, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-	dht_local_t   *local = NULL;</div><div class='del'>-	call_frame_t  *prev = NULL;</div><div class='del'>-	xlator_t      *subvol = NULL;</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    loc_t *loc = NULL;</div><div class='ctx'> </div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-	prev = cookie;</div><div class='del'>-	subvol = prev-&gt;this;</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    loc = &amp;local-&gt;loc;</div><div class='ctx'> </div><div class='del'>-	if (op_ret == -1) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-			"unlinking linkfile %s on %s failed (%s)",</div><div class='del'>-			local-&gt;loc.path, subvol-&gt;name, strerror (op_errno));</div><div class='del'>-	}</div><div class='add'>+    if (op_ret)</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_ERROR, op_errno, DHT_MSG_SETATTR_FAILED,</div><div class='add'>+                "path=%s", (loc-&gt;path ? loc-&gt;path : "NULL"), "gfid=%s",</div><div class='add'>+                uuid_utoa(local-&gt;gfid), NULL);</div><div class='ctx'> </div><div class='del'>-	DHT_STACK_DESTROY (frame);</div><div class='add'>+    DHT_STACK_DESTROY(frame);</div><div class='ctx'> </div><div class='del'>-	return 0;</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-dht_linkfile_unlink (call_frame_t *frame, xlator_t *this,</div><div class='del'>-		     xlator_t *subvol, loc_t *loc)</div><div class='add'>+dht_linkfile_attr_heal(call_frame_t *frame, xlator_t *this)</div><div class='ctx'> {</div><div class='del'>-	call_frame_t *unlink_frame = NULL;</div><div class='del'>-	dht_local_t  *unlink_local = NULL;</div><div class='del'>-</div><div class='del'>-	unlink_frame = copy_frame (frame);</div><div class='del'>-	if (!unlink_frame) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-			"Out of memory");</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	unlink_local = dht_local_init (unlink_frame);</div><div class='del'>-	if (!unlink_local) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-			"Out of memory");</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	loc_copy (&amp;unlink_local-&gt;loc, loc);</div><div class='del'>-</div><div class='del'>-	STACK_WIND (unlink_frame, dht_linkfile_unlink_cbk,</div><div class='del'>-		    subvol, subvol-&gt;fops-&gt;unlink,</div><div class='del'>-		    &amp;unlink_local-&gt;loc);</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>-err:</div><div class='del'>-	if (unlink_frame)</div><div class='del'>-		DHT_STACK_DESTROY (unlink_frame);</div><div class='add'>+    int ret = -1;</div><div class='add'>+    call_frame_t *copy = NULL;</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    dht_local_t *copy_local = NULL;</div><div class='add'>+    xlator_t *subvol = NULL;</div><div class='add'>+    struct iatt stbuf = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    dict_t *xattr = NULL;</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+</div><div class='add'>+    GF_VALIDATE_OR_GOTO("dht", local, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("dht", local-&gt;link_subvol, out);</div><div class='add'>+</div><div class='add'>+    if (local-&gt;stbuf.ia_type == IA_INVAL)</div><div class='add'>+        return 0;</div><div class='ctx'> </div><div class='del'>-	return -1;</div><div class='del'>-}</div><div class='add'>+    DHT_MARK_FOP_INTERNAL(xattr);</div><div class='ctx'> </div><div class='add'>+    gf_uuid_copy(local-&gt;loc.gfid, local-&gt;stbuf.ia_gfid);</div><div class='ctx'> </div><div class='del'>-xlator_t *</div><div class='del'>-dht_linkfile_subvol (xlator_t *this, inode_t *inode, struct iatt *stbuf,</div><div class='del'>-		     dict_t *xattr)</div><div class='del'>-{</div><div class='del'>-	dht_conf_t *conf = NULL;</div><div class='del'>-	xlator_t   *subvol = NULL;</div><div class='del'>-	void       *volname = NULL;</div><div class='del'>-	int         i = 0, ret = 0;</div><div class='add'>+    copy = copy_frame(frame);</div><div class='ctx'> </div><div class='add'>+    if (!copy)</div><div class='add'>+        goto out;</div><div class='ctx'> </div><div class='del'>-	conf = this-&gt;private;</div><div class='add'>+    copy_local = dht_local_init(copy, &amp;local-&gt;loc, NULL, 0);</div><div class='ctx'> </div><div class='del'>-	if (!xattr)</div><div class='del'>-		goto out;</div><div class='add'>+    if (!copy_local)</div><div class='add'>+        goto out;</div><div class='ctx'> </div><div class='del'>-	ret = dict_get_ptr (xattr, "trusted.glusterfs.dht.linkto", &amp;volname);</div><div class='add'>+    stbuf = local-&gt;stbuf;</div><div class='add'>+    subvol = local-&gt;link_subvol;</div><div class='ctx'> </div><div class='del'>-	if ((-1 == ret) || !volname)</div><div class='del'>-		goto out;</div><div class='add'>+    copy-&gt;local = copy_local;</div><div class='ctx'> </div><div class='del'>-	for (i = 0; i &lt; conf-&gt;subvolume_cnt; i++) {</div><div class='del'>-		if (strcmp (conf-&gt;subvolumes[i]-&gt;name, (char *)volname) == 0) {</div><div class='del'>-			subvol = conf-&gt;subvolumes[i];</div><div class='del'>-			break;</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='add'>+    FRAME_SU_DO(copy, dht_local_t);</div><div class='ctx'> </div><div class='add'>+    STACK_WIND(copy, dht_linkfile_setattr_cbk, subvol, subvol-&gt;fops-&gt;setattr,</div><div class='add'>+               &amp;copy_local-&gt;loc, &amp;stbuf, (GF_SET_ATTR_UID | GF_SET_ATTR_GID),</div><div class='add'>+               xattr);</div><div class='add'>+    ret = 0;</div><div class='ctx'> out:</div><div class='del'>-	return subvol;</div><div class='del'>-}</div><div class='add'>+    if ((ret &lt; 0) &amp;&amp; (copy))</div><div class='add'>+        DHT_STACK_DESTROY(copy);</div><div class='ctx'> </div><div class='add'>+    if (xattr)</div><div class='add'>+        dict_unref(xattr);</div><div class='ctx'> </div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='head'>diff --git a/xlators/cluster/dht/src/dht-lock.c b/xlators/cluster/dht/src/dht-lock.c<br/>new file mode 100644<br/>index 00000000000..638821ccee5<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/xlators/cluster/dht/src/dht-lock.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>xlators/cluster/dht/src/dht-lock.c</a></div><div class='hunk'>@@ -0,0 +1,1392 @@</div><div class='add'>+/*</div><div class='add'>+  Copyright (c) 2016 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#include "dht-lock.h"</div><div class='add'>+</div><div class='add'>+static char *</div><div class='add'>+dht_lock_asprintf(dht_lock_t *lock)</div><div class='add'>+{</div><div class='add'>+    char *lk_buf = NULL;</div><div class='add'>+    char gfid[GF_UUID_BUF_SIZE] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    if (lock == NULL)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    uuid_utoa_r(lock-&gt;loc.gfid, gfid);</div><div class='add'>+</div><div class='add'>+    gf_asprintf(&amp;lk_buf, "%s:%s", lock-&gt;xl-&gt;name, gfid);</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return lk_buf;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+dht_log_lk_array(char *name, gf_loglevel_t log_level, dht_lock_t **lk_array,</div><div class='add'>+                 int count)</div><div class='add'>+{</div><div class='add'>+    int i = 0;</div><div class='add'>+    char *lk_buf = NULL;</div><div class='add'>+</div><div class='add'>+    if ((lk_array == NULL) || (count == 0))</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; count; i++) {</div><div class='add'>+        lk_buf = dht_lock_asprintf(lk_array[i]);</div><div class='add'>+        if (!lk_buf)</div><div class='add'>+            goto out;</div><div class='add'>+</div><div class='add'>+        gf_smsg(name, log_level, 0, DHT_MSG_LK_ARRAY_INFO, "index=%d", i,</div><div class='add'>+                "lk_buf=%s", lk_buf, NULL);</div><div class='add'>+        GF_FREE(lk_buf);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+dht_lock_stack_destroy(call_frame_t *lock_frame, dht_lock_type_t lk)</div><div class='add'>+{</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+</div><div class='add'>+    local = lock_frame-&gt;local;</div><div class='add'>+</div><div class='add'>+    if (lk == DHT_INODELK) {</div><div class='add'>+        local-&gt;lock[0].layout.my_layout.locks = NULL;</div><div class='add'>+        local-&gt;lock[0].layout.my_layout.lk_count = 0;</div><div class='add'>+    } else {</div><div class='add'>+        local-&gt;lock[0].ns.directory_ns.locks = NULL;</div><div class='add'>+        local-&gt;lock[0].ns.directory_ns.lk_count = 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    DHT_STACK_DESTROY(lock_frame);</div><div class='add'>+    return;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+dht_lock_free(dht_lock_t *lock)</div><div class='add'>+{</div><div class='add'>+    if (lock == NULL)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    loc_wipe(&amp;lock-&gt;loc);</div><div class='add'>+    GF_FREE(lock-&gt;domain);</div><div class='add'>+    GF_FREE(lock-&gt;basename);</div><div class='add'>+    mem_put(lock);</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+dht_set_lkowner(dht_lock_t **lk_array, int count, gf_lkowner_t *lkowner)</div><div class='add'>+{</div><div class='add'>+    int i = 0;</div><div class='add'>+</div><div class='add'>+    if (!lk_array || !lkowner)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; count; i++) {</div><div class='add'>+        lk_array[i]-&gt;lk_owner = *lkowner;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+dht_lock_request_cmp(const void *val1, const void *val2)</div><div class='add'>+{</div><div class='add'>+    dht_lock_t *lock1 = NULL;</div><div class='add'>+    dht_lock_t *lock2 = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    lock1 = *(dht_lock_t **)val1;</div><div class='add'>+    lock2 = *(dht_lock_t **)val2;</div><div class='add'>+</div><div class='add'>+    GF_VALIDATE_OR_GOTO("dht-locks", lock1, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("dht-locks", lock2, out);</div><div class='add'>+</div><div class='add'>+    ret = strcmp(lock1-&gt;xl-&gt;name, lock2-&gt;xl-&gt;name);</div><div class='add'>+</div><div class='add'>+    if (ret == 0) {</div><div class='add'>+        ret = gf_uuid_compare(lock1-&gt;loc.gfid, lock2-&gt;loc.gfid);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+dht_lock_order_requests(dht_lock_t **locks, int count)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    if (!locks || !count)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    qsort(locks, count, sizeof(*locks), dht_lock_request_cmp);</div><div class='add'>+    ret = 0;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+dht_lock_array_free(dht_lock_t **lk_array, int count)</div><div class='add'>+{</div><div class='add'>+    int i = 0;</div><div class='add'>+    dht_lock_t *lock = NULL;</div><div class='add'>+</div><div class='add'>+    if (lk_array == NULL)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; count; i++) {</div><div class='add'>+        lock = lk_array[i];</div><div class='add'>+        lk_array[i] = NULL;</div><div class='add'>+        dht_lock_free(lock);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+dht_lock_count(dht_lock_t **lk_array, int lk_count)</div><div class='add'>+{</div><div class='add'>+    int i = 0, locked = 0;</div><div class='add'>+</div><div class='add'>+    if ((lk_array == NULL) || (lk_count == 0))</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; lk_count; i++) {</div><div class='add'>+        if (lk_array[i]-&gt;locked)</div><div class='add'>+            locked++;</div><div class='add'>+    }</div><div class='add'>+out:</div><div class='add'>+    return locked;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static call_frame_t *</div><div class='add'>+dht_lock_frame(call_frame_t *parent_frame)</div><div class='add'>+{</div><div class='add'>+    call_frame_t *lock_frame = NULL;</div><div class='add'>+</div><div class='add'>+    lock_frame = copy_frame(parent_frame);</div><div class='add'>+    if (lock_frame == NULL)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    set_lk_owner_from_ptr(&amp;lock_frame-&gt;root-&gt;lk_owner, parent_frame-&gt;root);</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return lock_frame;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+dht_lock_t *</div><div class='add'>+dht_lock_new(xlator_t *this, xlator_t *xl, loc_t *loc, short type,</div><div class='add'>+             const char *domain, const char *basename,</div><div class='add'>+             dht_reaction_type_t do_on_failure)</div><div class='add'>+{</div><div class='add'>+    dht_conf_t *conf = NULL;</div><div class='add'>+    dht_lock_t *lock = NULL;</div><div class='add'>+</div><div class='add'>+    conf = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    lock = mem_get0(conf-&gt;lock_pool);</div><div class='add'>+    if (lock == NULL)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    lock-&gt;xl = xl;</div><div class='add'>+    lock-&gt;type = type;</div><div class='add'>+    lock-&gt;do_on_failure = do_on_failure;</div><div class='add'>+</div><div class='add'>+    lock-&gt;domain = gf_strdup(domain);</div><div class='add'>+    if (lock-&gt;domain == NULL) {</div><div class='add'>+        dht_lock_free(lock);</div><div class='add'>+        lock = NULL;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (basename) {</div><div class='add'>+        lock-&gt;basename = gf_strdup(basename);</div><div class='add'>+        if (lock-&gt;basename == NULL) {</div><div class='add'>+            dht_lock_free(lock);</div><div class='add'>+            lock = NULL;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Fill only inode and gfid.</div><div class='add'>+       posix and protocol/server give preference to pargfid/basename over</div><div class='add'>+       gfid/inode for resolution if all the three parameters of loc_t are</div><div class='add'>+       present. I want to avoid the following hypothetical situation:</div><div class='add'>+</div><div class='add'>+       1. rebalance did a lookup on a dentry and got a gfid.</div><div class='add'>+       2. rebalance acquires lock on loc_t which was filled with gfid and</div><div class='add'>+          path (pargfid/bname) from step 1.</div><div class='add'>+       3. somebody deleted and recreated the same file</div><div class='add'>+       4. rename on the same path acquires lock on loc_t which now points</div><div class='add'>+          to a different inode (and hence gets the lock).</div><div class='add'>+       5. rebalance continues to migrate file (note that not all fops done</div><div class='add'>+          by rebalance during migration are inode/gfid based Eg., unlink)</div><div class='add'>+       6. rename continues.</div><div class='add'>+    */</div><div class='add'>+    lock-&gt;loc.inode = inode_ref(loc-&gt;inode);</div><div class='add'>+    loc_gfid(loc, lock-&gt;loc.gfid);</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return lock;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+dht_local_entrylk_init(call_frame_t *frame, dht_lock_t **lk_array, int lk_count,</div><div class='add'>+                       fop_entrylk_cbk_t entrylk_cbk)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+</div><div class='add'>+    if (local == NULL) {</div><div class='add'>+        local = dht_local_init(frame, NULL, NULL, 0);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (local == NULL) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    local-&gt;lock[0].ns.directory_ns.entrylk_cbk = entrylk_cbk;</div><div class='add'>+    local-&gt;lock[0].ns.directory_ns.locks = lk_array;</div><div class='add'>+    local-&gt;lock[0].ns.directory_ns.lk_count = lk_count;</div><div class='add'>+</div><div class='add'>+    ret = dht_lock_order_requests(local-&gt;lock[0].ns.directory_ns.locks,</div><div class='add'>+                                  local-&gt;lock[0].ns.directory_ns.lk_count);</div><div class='add'>+    if (ret &lt; 0)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+dht_entrylk_done(call_frame_t *lock_frame)</div><div class='add'>+{</div><div class='add'>+    fop_entrylk_cbk_t entrylk_cbk = NULL;</div><div class='add'>+    call_frame_t *main_frame = NULL;</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+</div><div class='add'>+    local = lock_frame-&gt;local;</div><div class='add'>+    main_frame = local-&gt;main_frame;</div><div class='add'>+</div><div class='add'>+    local-&gt;lock[0].ns.directory_ns.locks = NULL;</div><div class='add'>+    local-&gt;lock[0].ns.directory_ns.lk_count = 0;</div><div class='add'>+</div><div class='add'>+    entrylk_cbk = local-&gt;lock[0].ns.directory_ns.entrylk_cbk;</div><div class='add'>+    local-&gt;lock[0].ns.directory_ns.entrylk_cbk = NULL;</div><div class='add'>+</div><div class='add'>+    entrylk_cbk(main_frame, NULL, main_frame-&gt;this,</div><div class='add'>+                local-&gt;lock[0].ns.directory_ns.op_ret,</div><div class='add'>+                local-&gt;lock[0].ns.directory_ns.op_errno, NULL);</div><div class='add'>+</div><div class='add'>+    dht_lock_stack_destroy(lock_frame, DHT_ENTRYLK);</div><div class='add'>+    return;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int32_t</div><div class='add'>+dht_unlock_entrylk_done(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                        int32_t op_ret, int32_t op_errno, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    char gfid[GF_UUID_BUF_SIZE] = {0};</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    gf_uuid_unparse(local-&gt;lock[0].ns.directory_ns.locks[0]-&gt;loc.inode-&gt;gfid,</div><div class='add'>+                    gfid);</div><div class='add'>+</div><div class='add'>+    if (op_ret &lt; 0) {</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_WARNING, op_errno,</div><div class='add'>+                DHT_MSG_UNLOCK_GFID_FAILED, "gfid=%s", gfid,</div><div class='add'>+                "DHT_LAYOUT_HEAL_DOMAIN", NULL);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    DHT_STACK_DESTROY(frame);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int32_t</div><div class='add'>+dht_unlock_entrylk_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                       int32_t op_ret, int32_t op_errno, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    int lk_index = 0, call_cnt = 0;</div><div class='add'>+    char gfid[GF_UUID_BUF_SIZE] = {0};</div><div class='add'>+</div><div class='add'>+    lk_index = (long)cookie;</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+</div><div class='add'>+    uuid_utoa_r(local-&gt;lock[0].ns.directory_ns.locks[lk_index]-&gt;loc.gfid, gfid);</div><div class='add'>+</div><div class='add'>+    if (op_ret &lt; 0) {</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_WARNING, op_errno, DHT_MSG_UNLOCKING_FAILED,</div><div class='add'>+                "name=%s",</div><div class='add'>+                local-&gt;lock[0].ns.directory_ns.locks[lk_index]-&gt;xl-&gt;name,</div><div class='add'>+                "gfid=%s", gfid, NULL);</div><div class='add'>+    } else {</div><div class='add'>+        local-&gt;lock[0].ns.directory_ns.locks[lk_index]-&gt;locked = 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    call_cnt = dht_frame_return(frame);</div><div class='add'>+    if (is_last_call(call_cnt)) {</div><div class='add'>+        dht_entrylk_done(frame);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int32_t</div><div class='add'>+dht_unlock_entrylk(call_frame_t *frame, dht_lock_t **lk_array, int lk_count,</div><div class='add'>+                   fop_entrylk_cbk_t entrylk_cbk)</div><div class='add'>+{</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    int ret = -1, i = 0;</div><div class='add'>+    call_frame_t *lock_frame = NULL;</div><div class='add'>+    int call_cnt = 0;</div><div class='add'>+</div><div class='add'>+    GF_VALIDATE_OR_GOTO("dht-locks", frame, done);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(frame-&gt;this-&gt;name, lk_array, done);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(frame-&gt;this-&gt;name, entrylk_cbk, done);</div><div class='add'>+</div><div class='add'>+    call_cnt = dht_lock_count(lk_array, lk_count);</div><div class='add'>+    if (call_cnt == 0) {</div><div class='add'>+        ret = 0;</div><div class='add'>+        goto done;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    lock_frame = dht_lock_frame(frame);</div><div class='add'>+    if (lock_frame == NULL) {</div><div class='add'>+        gf_smsg(frame-&gt;this-&gt;name, GF_LOG_WARNING, 0,</div><div class='add'>+                DHT_MSG_ALLOC_FRAME_FAILED_NOT_UNLOCKING_FOLLOWING_ENTRYLKS,</div><div class='add'>+                NULL);</div><div class='add'>+</div><div class='add'>+        dht_log_lk_array(frame-&gt;this-&gt;name, GF_LOG_WARNING, lk_array, lk_count);</div><div class='add'>+        goto done;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dht_local_entrylk_init(lock_frame, lk_array, lk_count, entrylk_cbk);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        gf_smsg(frame-&gt;this-&gt;name, GF_LOG_WARNING, 0,</div><div class='add'>+                DHT_MSG_LOCAL_LOCKS_STORE_FAILED_UNLOCKING_FOLLOWING_ENTRYLK,</div><div class='add'>+                NULL);</div><div class='add'>+</div><div class='add'>+        dht_log_lk_array(frame-&gt;this-&gt;name, GF_LOG_WARNING, lk_array, lk_count);</div><div class='add'>+</div><div class='add'>+        goto done;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    local = lock_frame-&gt;local;</div><div class='add'>+    local-&gt;main_frame = frame;</div><div class='add'>+    local-&gt;call_cnt = call_cnt;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; local-&gt;lock[0].ns.directory_ns.lk_count; i++) {</div><div class='add'>+        if (!local-&gt;lock[0].ns.directory_ns.locks[i]-&gt;locked)</div><div class='add'>+            continue;</div><div class='add'>+</div><div class='add'>+        lock_frame-&gt;root</div><div class='add'>+            -&gt;lk_owner = local-&gt;lock[0].ns.directory_ns.locks[i]-&gt;lk_owner;</div><div class='add'>+        STACK_WIND_COOKIE(</div><div class='add'>+            lock_frame, dht_unlock_entrylk_cbk, (void *)(long)i,</div><div class='add'>+            local-&gt;lock[0].ns.directory_ns.locks[i]-&gt;xl,</div><div class='add'>+            local-&gt;lock[0].ns.directory_ns.locks[i]-&gt;xl-&gt;fops-&gt;entrylk,</div><div class='add'>+            local-&gt;lock[0].ns.directory_ns.locks[i]-&gt;domain,</div><div class='add'>+            &amp;local-&gt;lock[0].ns.directory_ns.locks[i]-&gt;loc,</div><div class='add'>+            local-&gt;lock[0].ns.directory_ns.locks[i]-&gt;basename, ENTRYLK_UNLOCK,</div><div class='add'>+            ENTRYLK_WRLCK, NULL);</div><div class='add'>+        if (!--call_cnt)</div><div class='add'>+            break;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+</div><div class='add'>+done:</div><div class='add'>+    if (lock_frame)</div><div class='add'>+        dht_lock_stack_destroy(lock_frame, DHT_ENTRYLK);</div><div class='add'>+</div><div class='add'>+    /* no locks acquired, invoke entrylk_cbk */</div><div class='add'>+    if (ret == 0)</div><div class='add'>+        entrylk_cbk(frame, NULL, frame-&gt;this, 0, 0, NULL);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+dht_unlock_entrylk_wrapper(call_frame_t *frame, dht_elock_wrap_t *entrylk)</div><div class='add'>+{</div><div class='add'>+    dht_local_t *local = NULL, *lock_local = NULL;</div><div class='add'>+    call_frame_t *lock_frame = NULL;</div><div class='add'>+    char pgfid[GF_UUID_BUF_SIZE] = {0};</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+</div><div class='add'>+    if (!entrylk || !entrylk-&gt;locks)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    gf_uuid_unparse(local-&gt;loc.parent-&gt;gfid, pgfid);</div><div class='add'>+</div><div class='add'>+    lock_frame = copy_frame(frame);</div><div class='add'>+    if (lock_frame == NULL) {</div><div class='add'>+        gf_smsg(frame-&gt;this-&gt;name, GF_LOG_WARNING, ENOMEM,</div><div class='add'>+                DHT_MSG_COPY_FRAME_FAILED, "pgfid=%s", pgfid, "name=%s",</div><div class='add'>+                local-&gt;loc.name, "path=%s", local-&gt;loc.path, NULL);</div><div class='add'>+        goto done;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    lock_local = dht_local_init(lock_frame, NULL, NULL, 0);</div><div class='add'>+    if (lock_local == NULL) {</div><div class='add'>+        gf_smsg(frame-&gt;this-&gt;name, GF_LOG_WARNING, ENOMEM,</div><div class='add'>+                DHT_MSG_CREATE_FAILED, "local", "pgfid=%s", pgfid, "name=%s",</div><div class='add'>+                local-&gt;loc.name, "path=%s", local-&gt;loc.path, NULL);</div><div class='add'>+        goto done;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    lock_frame-&gt;local = lock_local;</div><div class='add'>+</div><div class='add'>+    lock_local-&gt;lock[0].ns.directory_ns.locks = entrylk-&gt;locks;</div><div class='add'>+    lock_local-&gt;lock[0].ns.directory_ns.lk_count = entrylk-&gt;lk_count;</div><div class='add'>+    entrylk-&gt;locks = NULL;</div><div class='add'>+    entrylk-&gt;lk_count = 0;</div><div class='add'>+</div><div class='add'>+    ret = dht_unlock_entrylk(</div><div class='add'>+        lock_frame, lock_local-&gt;lock[0].ns.directory_ns.locks,</div><div class='add'>+        lock_local-&gt;lock[0].ns.directory_ns.lk_count, dht_unlock_entrylk_done);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto done;</div><div class='add'>+</div><div class='add'>+    lock_frame = NULL;</div><div class='add'>+</div><div class='add'>+done:</div><div class='add'>+    if (lock_frame != NULL) {</div><div class='add'>+        DHT_STACK_DESTROY(lock_frame);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+dht_entrylk_cleanup_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                        int32_t op_ret, int32_t op_errno, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    dht_entrylk_done(frame);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+dht_entrylk_cleanup(call_frame_t *lock_frame)</div><div class='add'>+{</div><div class='add'>+    dht_lock_t **lk_array = NULL;</div><div class='add'>+    int lk_count = 0, lk_acquired = 0;</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+</div><div class='add'>+    local = lock_frame-&gt;local;</div><div class='add'>+</div><div class='add'>+    lk_array = local-&gt;lock[0].ns.directory_ns.locks;</div><div class='add'>+    lk_count = local-&gt;lock[0].ns.directory_ns.lk_count;</div><div class='add'>+</div><div class='add'>+    lk_acquired = dht_lock_count(lk_array, lk_count);</div><div class='add'>+    if (lk_acquired != 0) {</div><div class='add'>+        dht_unlock_entrylk(lock_frame, lk_array, lk_count,</div><div class='add'>+                           dht_entrylk_cleanup_cbk);</div><div class='add'>+    } else {</div><div class='add'>+        dht_entrylk_done(lock_frame);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int32_t</div><div class='add'>+dht_blocking_entrylk_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                         int32_t op_ret, int32_t op_errno, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    int lk_index = 0;</div><div class='add'>+    int i = 0;</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+</div><div class='add'>+    lk_index = (long)cookie;</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    if (op_ret == 0) {</div><div class='add'>+        local-&gt;lock[0].ns.directory_ns.locks[lk_index]-&gt;locked = _gf_true;</div><div class='add'>+    } else {</div><div class='add'>+        switch (op_errno) {</div><div class='add'>+            case ESTALE:</div><div class='add'>+            case ENOENT:</div><div class='add'>+                if (local-&gt;lock[0]</div><div class='add'>+                        .ns.directory_ns.locks[lk_index]</div><div class='add'>+                        -&gt;do_on_failure != IGNORE_ENOENT_ESTALE) {</div><div class='add'>+                    local-&gt;lock[0].ns.directory_ns.op_ret = -1;</div><div class='add'>+                    local-&gt;lock[0].ns.directory_ns.op_errno = op_errno;</div><div class='add'>+                    goto cleanup;</div><div class='add'>+                }</div><div class='add'>+                break;</div><div class='add'>+            default:</div><div class='add'>+                local-&gt;lock[0].ns.directory_ns.op_ret = -1;</div><div class='add'>+                local-&gt;lock[0].ns.directory_ns.op_errno = op_errno;</div><div class='add'>+                goto cleanup;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (lk_index == (local-&gt;lock[0].ns.directory_ns.lk_count - 1)) {</div><div class='add'>+        for (i = 0; (i &lt; local-&gt;lock[0].ns.directory_ns.lk_count) &amp;&amp;</div><div class='add'>+                    (!local-&gt;lock[0].ns.directory_ns.locks[i]-&gt;locked);</div><div class='add'>+             i++)</div><div class='add'>+            ;</div><div class='add'>+</div><div class='add'>+        if (i == local-&gt;lock[0].ns.directory_ns.lk_count) {</div><div class='add'>+            local-&gt;lock[0].ns.directory_ns.op_ret = -1;</div><div class='add'>+            local-&gt;lock[0].ns.directory_ns.op_errno = op_errno;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        dht_entrylk_done(frame);</div><div class='add'>+    } else {</div><div class='add'>+        dht_blocking_entrylk_rec(frame, ++lk_index);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+</div><div class='add'>+cleanup:</div><div class='add'>+    dht_entrylk_cleanup(frame);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+dht_blocking_entrylk_rec(call_frame_t *frame, int i)</div><div class='add'>+{</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+</div><div class='add'>+    STACK_WIND_COOKIE(</div><div class='add'>+        frame, dht_blocking_entrylk_cbk, (void *)(long)i,</div><div class='add'>+        local-&gt;lock[0].ns.directory_ns.locks[i]-&gt;xl,</div><div class='add'>+        local-&gt;lock[0].ns.directory_ns.locks[i]-&gt;xl-&gt;fops-&gt;entrylk,</div><div class='add'>+        local-&gt;lock[0].ns.directory_ns.locks[i]-&gt;domain,</div><div class='add'>+        &amp;local-&gt;lock[0].ns.directory_ns.locks[i]-&gt;loc,</div><div class='add'>+        local-&gt;lock[0].ns.directory_ns.locks[i]-&gt;basename, ENTRYLK_LOCK,</div><div class='add'>+        ENTRYLK_WRLCK, NULL);</div><div class='add'>+</div><div class='add'>+    return;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+dht_blocking_entrylk(call_frame_t *frame, dht_lock_t **lk_array, int lk_count,</div><div class='add'>+                     fop_entrylk_cbk_t entrylk_cbk)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    call_frame_t *lock_frame = NULL;</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+</div><div class='add'>+    GF_VALIDATE_OR_GOTO("dht-locks", frame, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(frame-&gt;this-&gt;name, lk_array, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(frame-&gt;this-&gt;name, entrylk_cbk, out);</div><div class='add'>+</div><div class='add'>+    lock_frame = dht_lock_frame(frame);</div><div class='add'>+    if (lock_frame == NULL)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    ret = dht_local_entrylk_init(lock_frame, lk_array, lk_count, entrylk_cbk);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    dht_set_lkowner(lk_array, lk_count, &amp;lock_frame-&gt;root-&gt;lk_owner);</div><div class='add'>+</div><div class='add'>+    local = lock_frame-&gt;local;</div><div class='add'>+    local-&gt;main_frame = frame;</div><div class='add'>+</div><div class='add'>+    dht_blocking_entrylk_rec(lock_frame, 0);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+out:</div><div class='add'>+    if (lock_frame)</div><div class='add'>+        dht_lock_stack_destroy(lock_frame, DHT_ENTRYLK);</div><div class='add'>+</div><div class='add'>+    return -1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+dht_local_inodelk_init(call_frame_t *frame, dht_lock_t **lk_array, int lk_count,</div><div class='add'>+                       fop_inodelk_cbk_t inodelk_cbk)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+</div><div class='add'>+    if (local == NULL) {</div><div class='add'>+        local = dht_local_init(frame, NULL, NULL, 0);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (local == NULL) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    local-&gt;lock[0].layout.my_layout.inodelk_cbk = inodelk_cbk;</div><div class='add'>+    local-&gt;lock[0].layout.my_layout.locks = lk_array;</div><div class='add'>+    local-&gt;lock[0].layout.my_layout.lk_count = lk_count;</div><div class='add'>+</div><div class='add'>+    ret = dht_lock_order_requests(local-&gt;lock[0].layout.my_layout.locks,</div><div class='add'>+                                  local-&gt;lock[0].layout.my_layout.lk_count);</div><div class='add'>+    if (ret &lt; 0)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+dht_inodelk_done(call_frame_t *lock_frame)</div><div class='add'>+{</div><div class='add'>+    fop_inodelk_cbk_t inodelk_cbk = NULL;</div><div class='add'>+    call_frame_t *main_frame = NULL;</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+</div><div class='add'>+    local = lock_frame-&gt;local;</div><div class='add'>+    main_frame = local-&gt;main_frame;</div><div class='add'>+</div><div class='add'>+    local-&gt;lock[0].layout.my_layout.locks = NULL;</div><div class='add'>+    local-&gt;lock[0].layout.my_layout.lk_count = 0;</div><div class='add'>+</div><div class='add'>+    inodelk_cbk = local-&gt;lock[0].layout.my_layout.inodelk_cbk;</div><div class='add'>+    local-&gt;lock[0].layout.my_layout.inodelk_cbk = NULL;</div><div class='add'>+</div><div class='add'>+    inodelk_cbk(main_frame, NULL, main_frame-&gt;this,</div><div class='add'>+                local-&gt;lock[0].layout.my_layout.op_ret,</div><div class='add'>+                local-&gt;lock[0].layout.my_layout.op_errno, NULL);</div><div class='add'>+</div><div class='add'>+    dht_lock_stack_destroy(lock_frame, DHT_INODELK);</div><div class='add'>+    return;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int32_t</div><div class='add'>+dht_unlock_inodelk_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                       int32_t op_ret, int32_t op_errno, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    int lk_index = 0, call_cnt = 0;</div><div class='add'>+    char gfid[GF_UUID_BUF_SIZE] = {0};</div><div class='add'>+</div><div class='add'>+    lk_index = (long)cookie;</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    if (op_ret &lt; 0) {</div><div class='add'>+        uuid_utoa_r(local-&gt;lock[0].layout.my_layout.locks[lk_index]-&gt;loc.gfid,</div><div class='add'>+                    gfid);</div><div class='add'>+</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_WARNING, op_errno, DHT_MSG_UNLOCKING_FAILED,</div><div class='add'>+                "name=%s",</div><div class='add'>+                local-&gt;lock[0].layout.my_layout.locks[lk_index]-&gt;xl-&gt;name,</div><div class='add'>+                "gfid=%s", gfid, NULL);</div><div class='add'>+    } else {</div><div class='add'>+        local-&gt;lock[0].layout.my_layout.locks[lk_index]-&gt;locked = 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    call_cnt = dht_frame_return(frame);</div><div class='add'>+    if (is_last_call(call_cnt)) {</div><div class='add'>+        dht_inodelk_done(frame);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int32_t</div><div class='add'>+dht_unlock_inodelk_done(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                        int32_t op_ret, int32_t op_errno, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    char gfid[GF_UUID_BUF_SIZE] = {0};</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    gf_uuid_unparse(local-&gt;lock[0].layout.my_layout.locks[0]-&gt;loc.inode-&gt;gfid,</div><div class='add'>+                    gfid);</div><div class='add'>+</div><div class='add'>+    if (op_ret &lt; 0) {</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_WARNING, op_errno,</div><div class='add'>+                DHT_MSG_UNLOCK_GFID_FAILED, "DHT_LAYOUT_HEAL_DOMAIN gfid=%s",</div><div class='add'>+                gfid, NULL);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    DHT_STACK_DESTROY(frame);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+dht_unlock_inodelk(call_frame_t *frame, dht_lock_t **lk_array, int lk_count,</div><div class='add'>+                   fop_inodelk_cbk_t inodelk_cbk)</div><div class='add'>+{</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    struct gf_flock flock = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int ret = -1, i = 0;</div><div class='add'>+    call_frame_t *lock_frame = NULL;</div><div class='add'>+    int call_cnt = 0;</div><div class='add'>+</div><div class='add'>+    GF_VALIDATE_OR_GOTO("dht-locks", frame, done);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(frame-&gt;this-&gt;name, lk_array, done);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(frame-&gt;this-&gt;name, inodelk_cbk, done);</div><div class='add'>+</div><div class='add'>+    call_cnt = dht_lock_count(lk_array, lk_count);</div><div class='add'>+    if (call_cnt == 0) {</div><div class='add'>+        ret = 0;</div><div class='add'>+        goto done;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    lock_frame = dht_lock_frame(frame);</div><div class='add'>+    if (lock_frame == NULL) {</div><div class='add'>+        gf_smsg(frame-&gt;this-&gt;name, GF_LOG_WARNING, 0,</div><div class='add'>+                DHT_MSG_ALLOC_FRAME_FAILED_NOT_UNLOCKING_FOLLOWING_ENTRYLKS,</div><div class='add'>+                NULL);</div><div class='add'>+</div><div class='add'>+        dht_log_lk_array(frame-&gt;this-&gt;name, GF_LOG_WARNING, lk_array, lk_count);</div><div class='add'>+        goto done;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dht_local_inodelk_init(lock_frame, lk_array, lk_count, inodelk_cbk);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        gf_smsg(frame-&gt;this-&gt;name, GF_LOG_WARNING, 0,</div><div class='add'>+                DHT_MSG_LOCAL_LOCKS_STORE_FAILED_UNLOCKING_FOLLOWING_ENTRYLK,</div><div class='add'>+                NULL);</div><div class='add'>+</div><div class='add'>+        dht_log_lk_array(frame-&gt;this-&gt;name, GF_LOG_WARNING, lk_array, lk_count);</div><div class='add'>+</div><div class='add'>+        goto done;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    local = lock_frame-&gt;local;</div><div class='add'>+    local-&gt;main_frame = frame;</div><div class='add'>+    local-&gt;call_cnt = call_cnt;</div><div class='add'>+</div><div class='add'>+    flock.l_type = F_UNLCK;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; local-&gt;lock[0].layout.my_layout.lk_count; i++) {</div><div class='add'>+        if (!local-&gt;lock[0].layout.my_layout.locks[i]-&gt;locked)</div><div class='add'>+            continue;</div><div class='add'>+</div><div class='add'>+        lock_frame-&gt;root</div><div class='add'>+            -&gt;lk_owner = local-&gt;lock[0].layout.my_layout.locks[i]-&gt;lk_owner;</div><div class='add'>+        STACK_WIND_COOKIE(</div><div class='add'>+            lock_frame, dht_unlock_inodelk_cbk, (void *)(long)i,</div><div class='add'>+            local-&gt;lock[0].layout.my_layout.locks[i]-&gt;xl,</div><div class='add'>+            local-&gt;lock[0].layout.my_layout.locks[i]-&gt;xl-&gt;fops-&gt;inodelk,</div><div class='add'>+            local-&gt;lock[0].layout.my_layout.locks[i]-&gt;domain,</div><div class='add'>+            &amp;local-&gt;lock[0].layout.my_layout.locks[i]-&gt;loc, F_SETLK, &amp;flock,</div><div class='add'>+            NULL);</div><div class='add'>+        if (!--call_cnt)</div><div class='add'>+            break;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+</div><div class='add'>+done:</div><div class='add'>+    if (lock_frame)</div><div class='add'>+        dht_lock_stack_destroy(lock_frame, DHT_INODELK);</div><div class='add'>+</div><div class='add'>+    /* no locks acquired, invoke inodelk_cbk */</div><div class='add'>+    if (ret == 0)</div><div class='add'>+        inodelk_cbk(frame, NULL, frame-&gt;this, 0, 0, NULL);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+dht_unlock_inodelk_wrapper(call_frame_t *frame, dht_ilock_wrap_t *inodelk)</div><div class='add'>+{</div><div class='add'>+    dht_local_t *local = NULL, *lock_local = NULL;</div><div class='add'>+    call_frame_t *lock_frame = NULL;</div><div class='add'>+    char pgfid[GF_UUID_BUF_SIZE] = {0};</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+</div><div class='add'>+    if (!inodelk || !inodelk-&gt;locks)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    gf_uuid_unparse(local-&gt;loc.parent-&gt;gfid, pgfid);</div><div class='add'>+</div><div class='add'>+    lock_frame = copy_frame(frame);</div><div class='add'>+    if (lock_frame == NULL) {</div><div class='add'>+        gf_smsg(frame-&gt;this-&gt;name, GF_LOG_WARNING, ENOMEM,</div><div class='add'>+                DHT_MSG_COPY_FRAME_FAILED, "pgfid=%s", pgfid, "name=%s",</div><div class='add'>+                local-&gt;loc.name, "path=%s", local-&gt;loc.path, NULL);</div><div class='add'>+        goto done;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    lock_local = dht_local_init(lock_frame, NULL, NULL, 0);</div><div class='add'>+    if (lock_local == NULL) {</div><div class='add'>+        gf_smsg(frame-&gt;this-&gt;name, GF_LOG_WARNING, ENOMEM,</div><div class='add'>+                DHT_MSG_CREATE_FAILED, "local", "gfid=%s", pgfid, "name=%s",</div><div class='add'>+                local-&gt;loc.name, "path=%s", local-&gt;loc.path, NULL);</div><div class='add'>+        goto done;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    lock_frame-&gt;local = lock_local;</div><div class='add'>+</div><div class='add'>+    lock_local-&gt;lock[0].layout.my_layout.locks = inodelk-&gt;locks;</div><div class='add'>+    lock_local-&gt;lock[0].layout.my_layout.lk_count = inodelk-&gt;lk_count;</div><div class='add'>+    inodelk-&gt;locks = NULL;</div><div class='add'>+    inodelk-&gt;lk_count = 0;</div><div class='add'>+</div><div class='add'>+    ret = dht_unlock_inodelk(</div><div class='add'>+        lock_frame, lock_local-&gt;lock[0].layout.my_layout.locks,</div><div class='add'>+        lock_local-&gt;lock[0].layout.my_layout.lk_count, dht_unlock_inodelk_done);</div><div class='add'>+</div><div class='add'>+    if (ret)</div><div class='add'>+        goto done;</div><div class='add'>+</div><div class='add'>+    lock_frame = NULL;</div><div class='add'>+</div><div class='add'>+done:</div><div class='add'>+    if (lock_frame != NULL) {</div><div class='add'>+        DHT_STACK_DESTROY(lock_frame);</div><div class='add'>+    }</div><div class='add'>+out:</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+dht_inodelk_cleanup_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                        int32_t op_ret, int32_t op_errno, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    dht_inodelk_done(frame);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+dht_inodelk_cleanup(call_frame_t *lock_frame)</div><div class='add'>+{</div><div class='add'>+    dht_lock_t **lk_array = NULL;</div><div class='add'>+    int lk_count = 0, lk_acquired = 0;</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+</div><div class='add'>+    local = lock_frame-&gt;local;</div><div class='add'>+</div><div class='add'>+    lk_array = local-&gt;lock[0].layout.my_layout.locks;</div><div class='add'>+    lk_count = local-&gt;lock[0].layout.my_layout.lk_count;</div><div class='add'>+</div><div class='add'>+    lk_acquired = dht_lock_count(lk_array, lk_count);</div><div class='add'>+    if (lk_acquired != 0) {</div><div class='add'>+        dht_unlock_inodelk(lock_frame, lk_array, lk_count,</div><div class='add'>+                           dht_inodelk_cleanup_cbk);</div><div class='add'>+    } else {</div><div class='add'>+        dht_inodelk_done(lock_frame);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int32_t</div><div class='add'>+dht_nonblocking_inodelk_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                            int32_t op_ret, int32_t op_errno, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    int lk_index = 0, call_cnt = 0;</div><div class='add'>+    char gfid[GF_UUID_BUF_SIZE] = {0};</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    lk_index = (long)cookie;</div><div class='add'>+</div><div class='add'>+    if (op_ret == -1) {</div><div class='add'>+        local-&gt;lock[0].layout.my_layout.op_ret = -1;</div><div class='add'>+        local-&gt;lock[0].layout.my_layout.op_errno = op_errno;</div><div class='add'>+</div><div class='add'>+        if (local &amp;&amp; local-&gt;lock[0].layout.my_layout.locks[lk_index]) {</div><div class='add'>+            uuid_utoa_r(local-&gt;lock[0]</div><div class='add'>+                            .layout.my_layout.locks[lk_index]</div><div class='add'>+                            -&gt;loc.inode-&gt;gfid,</div><div class='add'>+                        gfid);</div><div class='add'>+</div><div class='add'>+            gf_msg_debug(</div><div class='add'>+                this-&gt;name, op_errno,</div><div class='add'>+                "inodelk failed on gfid: %s "</div><div class='add'>+                "subvolume: %s",</div><div class='add'>+                gfid,</div><div class='add'>+                local-&gt;lock[0].layout.my_layout.locks[lk_index]-&gt;xl-&gt;name);</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    local-&gt;lock[0].layout.my_layout.locks[lk_index]-&gt;locked = _gf_true;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    call_cnt = dht_frame_return(frame);</div><div class='add'>+    if (is_last_call(call_cnt)) {</div><div class='add'>+        if (local-&gt;lock[0].layout.my_layout.op_ret &lt; 0) {</div><div class='add'>+            dht_inodelk_cleanup(frame);</div><div class='add'>+            return 0;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        dht_inodelk_done(frame);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+dht_nonblocking_inodelk(call_frame_t *frame, dht_lock_t **lk_array,</div><div class='add'>+                        int lk_count, fop_inodelk_cbk_t inodelk_cbk)</div><div class='add'>+{</div><div class='add'>+    struct gf_flock flock = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int i = 0, ret = 0;</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    call_frame_t *lock_frame = NULL;</div><div class='add'>+</div><div class='add'>+    GF_VALIDATE_OR_GOTO("dht-locks", frame, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(frame-&gt;this-&gt;name, lk_array, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(frame-&gt;this-&gt;name, inodelk_cbk, out);</div><div class='add'>+</div><div class='add'>+    lock_frame = dht_lock_frame(frame);</div><div class='add'>+    if (lock_frame == NULL)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    ret = dht_local_inodelk_init(lock_frame, lk_array, lk_count, inodelk_cbk);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    dht_set_lkowner(lk_array, lk_count, &amp;lock_frame-&gt;root-&gt;lk_owner);</div><div class='add'>+</div><div class='add'>+    local = lock_frame-&gt;local;</div><div class='add'>+    local-&gt;main_frame = frame;</div><div class='add'>+</div><div class='add'>+    local-&gt;call_cnt = lk_count;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; lk_count; i++) {</div><div class='add'>+        flock.l_type = local-&gt;lock[0].layout.my_layout.locks[i]-&gt;type;</div><div class='add'>+</div><div class='add'>+        STACK_WIND_COOKIE(</div><div class='add'>+            lock_frame, dht_nonblocking_inodelk_cbk, (void *)(long)i,</div><div class='add'>+            local-&gt;lock[0].layout.my_layout.locks[i]-&gt;xl,</div><div class='add'>+            local-&gt;lock[0].layout.my_layout.locks[i]-&gt;xl-&gt;fops-&gt;inodelk,</div><div class='add'>+            local-&gt;lock[0].layout.my_layout.locks[i]-&gt;domain,</div><div class='add'>+            &amp;local-&gt;lock[0].layout.my_layout.locks[i]-&gt;loc, F_SETLK, &amp;flock,</div><div class='add'>+            NULL);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (lock_frame)</div><div class='add'>+        dht_lock_stack_destroy(lock_frame, DHT_INODELK);</div><div class='add'>+</div><div class='add'>+    return -1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int32_t</div><div class='add'>+dht_blocking_inodelk_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                         int32_t op_ret, int32_t op_errno, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    int lk_index = 0;</div><div class='add'>+    int i = 0;</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    char gfid[GF_UUID_BUF_SIZE] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    dht_reaction_type_t reaction = 0;</div><div class='add'>+</div><div class='add'>+    lk_index = (long)cookie;</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    if (op_ret == 0) {</div><div class='add'>+        local-&gt;lock[0].layout.my_layout.locks[lk_index]-&gt;locked = _gf_true;</div><div class='add'>+    } else {</div><div class='add'>+        switch (op_errno) {</div><div class='add'>+            case ESTALE:</div><div class='add'>+            case ENOENT:</div><div class='add'>+                reaction = local-&gt;lock[0]</div><div class='add'>+                               .layout.my_layout.locks[lk_index]</div><div class='add'>+                               -&gt;do_on_failure;</div><div class='add'>+                if ((reaction != IGNORE_ENOENT_ESTALE) &amp;&amp;</div><div class='add'>+                    (reaction != IGNORE_ENOENT_ESTALE_EIO)) {</div><div class='add'>+                    gf_uuid_unparse(local-&gt;lock[0]</div><div class='add'>+                                        .layout.my_layout.locks[lk_index]</div><div class='add'>+                                        -&gt;loc.gfid,</div><div class='add'>+                                    gfid);</div><div class='add'>+                    local-&gt;lock[0].layout.my_layout.op_ret = -1;</div><div class='add'>+                    local-&gt;lock[0].layout.my_layout.op_errno = op_errno;</div><div class='add'>+                    gf_smsg(this-&gt;name, GF_LOG_ERROR, op_errno,</div><div class='add'>+                            DHT_MSG_INODELK_FAILED, "subvol=%s",</div><div class='add'>+                            local-&gt;lock[0]</div><div class='add'>+                                .layout.my_layout.locks[lk_index]</div><div class='add'>+                                -&gt;xl-&gt;name,</div><div class='add'>+                            "gfid=%s", gfid, NULL);</div><div class='add'>+                    goto cleanup;</div><div class='add'>+                }</div><div class='add'>+                break;</div><div class='add'>+            case EIO:</div><div class='add'>+                reaction = local-&gt;lock[0]</div><div class='add'>+                               .layout.my_layout.locks[lk_index]</div><div class='add'>+                               -&gt;do_on_failure;</div><div class='add'>+                if (reaction != IGNORE_ENOENT_ESTALE_EIO) {</div><div class='add'>+                    gf_uuid_unparse(local-&gt;lock[0]</div><div class='add'>+                                        .layout.my_layout.locks[lk_index]</div><div class='add'>+                                        -&gt;loc.gfid,</div><div class='add'>+                                    gfid);</div><div class='add'>+                    local-&gt;lock[0].layout.my_layout.op_ret = -1;</div><div class='add'>+                    local-&gt;lock[0].layout.my_layout.op_errno = op_errno;</div><div class='add'>+                    gf_smsg(this-&gt;name, GF_LOG_ERROR, op_errno,</div><div class='add'>+                            DHT_MSG_INODELK_FAILED, "subvol=%s",</div><div class='add'>+                            local-&gt;lock[0]</div><div class='add'>+                                .layout.my_layout.locks[lk_index]</div><div class='add'>+                                -&gt;xl-&gt;name,</div><div class='add'>+                            "gfid=%s", gfid, NULL);</div><div class='add'>+                    goto cleanup;</div><div class='add'>+                }</div><div class='add'>+                break;</div><div class='add'>+</div><div class='add'>+            default:</div><div class='add'>+                gf_uuid_unparse(</div><div class='add'>+                    local-&gt;lock[0].layout.my_layout.locks[lk_index]-&gt;loc.gfid,</div><div class='add'>+                    gfid);</div><div class='add'>+                local-&gt;lock[0].layout.my_layout.op_ret = -1;</div><div class='add'>+                local-&gt;lock[0].layout.my_layout.op_errno = op_errno;</div><div class='add'>+                gf_smsg(</div><div class='add'>+                    this-&gt;name, GF_LOG_ERROR, op_errno, DHT_MSG_INODELK_FAILED,</div><div class='add'>+                    "subvol=%s",</div><div class='add'>+                    local-&gt;lock[0].layout.my_layout.locks[lk_index]-&gt;xl-&gt;name,</div><div class='add'>+                    "gfid=%s", gfid, NULL);</div><div class='add'>+                goto cleanup;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (lk_index == (local-&gt;lock[0].layout.my_layout.lk_count - 1)) {</div><div class='add'>+        for (i = 0; (i &lt; local-&gt;lock[0].layout.my_layout.lk_count) &amp;&amp;</div><div class='add'>+                    (!local-&gt;lock[0].layout.my_layout.locks[i]-&gt;locked);</div><div class='add'>+             i++)</div><div class='add'>+            ;</div><div class='add'>+</div><div class='add'>+        if (i == local-&gt;lock[0].layout.my_layout.lk_count) {</div><div class='add'>+            local-&gt;lock[0].layout.my_layout.op_ret = -1;</div><div class='add'>+            local-&gt;lock[0].layout.my_layout.op_errno = op_errno;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        dht_inodelk_done(frame);</div><div class='add'>+    } else {</div><div class='add'>+        dht_blocking_inodelk_rec(frame, ++lk_index);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+</div><div class='add'>+cleanup:</div><div class='add'>+    dht_inodelk_cleanup(frame);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+dht_blocking_inodelk_rec(call_frame_t *frame, int i)</div><div class='add'>+{</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    struct gf_flock flock = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+</div><div class='add'>+    flock.l_type = local-&gt;lock[0].layout.my_layout.locks[i]-&gt;type;</div><div class='add'>+</div><div class='add'>+    STACK_WIND_COOKIE(</div><div class='add'>+        frame, dht_blocking_inodelk_cbk, (void *)(long)i,</div><div class='add'>+        local-&gt;lock[0].layout.my_layout.locks[i]-&gt;xl,</div><div class='add'>+        local-&gt;lock[0].layout.my_layout.locks[i]-&gt;xl-&gt;fops-&gt;inodelk,</div><div class='add'>+        local-&gt;lock[0].layout.my_layout.locks[i]-&gt;domain,</div><div class='add'>+        &amp;local-&gt;lock[0].layout.my_layout.locks[i]-&gt;loc, F_SETLKW, &amp;flock, NULL);</div><div class='add'>+</div><div class='add'>+    return;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+dht_blocking_inodelk(call_frame_t *frame, dht_lock_t **lk_array, int lk_count,</div><div class='add'>+                     fop_inodelk_cbk_t inodelk_cbk)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    call_frame_t *lock_frame = NULL;</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    dht_local_t *tmp_local = NULL;</div><div class='add'>+    char gfid[GF_UUID_BUF_SIZE] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    GF_VALIDATE_OR_GOTO("dht-locks", frame, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(frame-&gt;this-&gt;name, lk_array, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(frame-&gt;this-&gt;name, inodelk_cbk, out);</div><div class='add'>+</div><div class='add'>+    tmp_local = frame-&gt;local;</div><div class='add'>+</div><div class='add'>+    lock_frame = dht_lock_frame(frame);</div><div class='add'>+    if (lock_frame == NULL) {</div><div class='add'>+        gf_uuid_unparse(tmp_local-&gt;loc.gfid, gfid);</div><div class='add'>+        gf_smsg("dht", GF_LOG_ERROR, ENOMEM, DHT_MSG_LOCK_FRAME_FAILED,</div><div class='add'>+                "gfid=%s", gfid, "path=%s", tmp_local-&gt;loc.path, NULL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dht_local_inodelk_init(lock_frame, lk_array, lk_count, inodelk_cbk);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        gf_uuid_unparse(tmp_local-&gt;loc.gfid, gfid);</div><div class='add'>+        gf_smsg("dht", GF_LOG_ERROR, ENOMEM, DHT_MSG_LOCAL_LOCK_INIT_FAILED,</div><div class='add'>+                "gfid=%s", gfid, "path=%s", tmp_local-&gt;loc.path, NULL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    dht_set_lkowner(lk_array, lk_count, &amp;lock_frame-&gt;root-&gt;lk_owner);</div><div class='add'>+</div><div class='add'>+    local = lock_frame-&gt;local;</div><div class='add'>+    local-&gt;main_frame = frame;</div><div class='add'>+</div><div class='add'>+    dht_blocking_inodelk_rec(lock_frame, 0);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+out:</div><div class='add'>+    if (lock_frame)</div><div class='add'>+        dht_lock_stack_destroy(lock_frame, DHT_INODELK);</div><div class='add'>+</div><div class='add'>+    return -1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+dht_unlock_namespace(call_frame_t *frame, dht_dir_transaction_t *lock)</div><div class='add'>+{</div><div class='add'>+    GF_VALIDATE_OR_GOTO("dht-locks", frame, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(frame-&gt;this-&gt;name, lock, out);</div><div class='add'>+</div><div class='add'>+    dht_unlock_entrylk_wrapper(frame, &amp;lock-&gt;ns.directory_ns);</div><div class='add'>+    dht_unlock_inodelk_wrapper(frame, &amp;lock-&gt;ns.parent_layout);</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int32_t</div><div class='add'>+dht_protect_namespace_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                          int32_t op_ret, int32_t op_errno, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    if (op_ret != 0)</div><div class='add'>+        dht_unlock_inodelk_wrapper(frame, &amp;local-&gt;current-&gt;ns.parent_layout);</div><div class='add'>+</div><div class='add'>+    local-&gt;current-&gt;ns.ns_cbk(frame, cookie, this, op_ret, op_errno, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+dht_blocking_entrylk_after_inodelk(call_frame_t *frame, void *cookie,</div><div class='add'>+                                   xlator_t *this, int32_t op_ret,</div><div class='add'>+                                   int32_t op_errno, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    loc_t *loc = NULL;</div><div class='add'>+    dht_lock_t **lk_array = NULL;</div><div class='add'>+    char pgfid[GF_UUID_BUF_SIZE] = {0};</div><div class='add'>+    int count = 0;</div><div class='add'>+    dht_elock_wrap_t *entrylk = NULL;</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    entrylk = &amp;local-&gt;current-&gt;ns.directory_ns;</div><div class='add'>+</div><div class='add'>+    if (op_ret &lt; 0) {</div><div class='add'>+        local-&gt;op_ret = -1;</div><div class='add'>+        local-&gt;op_errno = op_errno;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    loc = &amp;entrylk-&gt;locks[0]-&gt;loc;</div><div class='add'>+    gf_uuid_unparse(loc-&gt;gfid, pgfid);</div><div class='add'>+</div><div class='add'>+    local-&gt;op_ret = 0;</div><div class='add'>+    lk_array = entrylk-&gt;locks;</div><div class='add'>+    count = entrylk-&gt;lk_count;</div><div class='add'>+</div><div class='add'>+    ret = dht_blocking_entrylk(frame, lk_array, count,</div><div class='add'>+                               dht_protect_namespace_cbk);</div><div class='add'>+</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        local-&gt;op_ret = -1;</div><div class='add'>+        local-&gt;op_errno = EIO;</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_WARNING, local-&gt;op_errno,</div><div class='add'>+                DHT_MSG_ENTRYLK_FAILED_AFT_INODELK, "fop=%s",</div><div class='add'>+                gf_fop_list[local-&gt;fop], "pgfid=%s", pgfid, "basename=%s",</div><div class='add'>+                entrylk-&gt;locks[0]-&gt;basename, NULL);</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+</div><div class='add'>+err:</div><div class='add'>+    if (lk_array != NULL) {</div><div class='add'>+        dht_lock_array_free(lk_array, count);</div><div class='add'>+        GF_FREE(lk_array);</div><div class='add'>+        entrylk-&gt;locks = NULL;</div><div class='add'>+        entrylk-&gt;lk_count = 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Unlock inodelk. No harm calling unlock twice */</div><div class='add'>+    dht_unlock_inodelk_wrapper(frame, &amp;local-&gt;current-&gt;ns.parent_layout);</div><div class='add'>+    /* Call ns_cbk. It will take care of unwinding */</div><div class='add'>+    local-&gt;current-&gt;ns.ns_cbk(frame, NULL, this, local-&gt;op_ret, local-&gt;op_errno,</div><div class='add'>+                              NULL);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* Given the loc and the subvol, this routine takes the inodelk on</div><div class='add'>+ * the parent inode and entrylk on (parent, loc-&gt;name). This routine</div><div class='add'>+ * is specific as it supports only one subvol on which it takes inodelk</div><div class='add'>+ * and then entrylk serially.</div><div class='add'>+ */</div><div class='add'>+int</div><div class='add'>+dht_protect_namespace(call_frame_t *frame, loc_t *loc, xlator_t *subvol,</div><div class='add'>+                      struct dht_namespace *ns, fop_entrylk_cbk_t ns_cbk)</div><div class='add'>+{</div><div class='add'>+    dht_ilock_wrap_t *inodelk = NULL;</div><div class='add'>+    dht_elock_wrap_t *entrylk = NULL;</div><div class='add'>+    dht_lock_t **lk_array = NULL;</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    xlator_t *this = NULL;</div><div class='add'>+    loc_t parent = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int ret = -1;</div><div class='add'>+    char pgfid[GF_UUID_BUF_SIZE] = {0};</div><div class='add'>+    int32_t op_errno = 0;</div><div class='add'>+    int count = 1;</div><div class='add'>+</div><div class='add'>+    GF_VALIDATE_OR_GOTO("dht-locks", frame, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(frame-&gt;this-&gt;name, loc, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(frame-&gt;this-&gt;name, loc-&gt;parent, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(frame-&gt;this-&gt;name, subvol, out);</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    this = frame-&gt;this;</div><div class='add'>+</div><div class='add'>+    inodelk = &amp;ns-&gt;parent_layout;</div><div class='add'>+    entrylk = &amp;ns-&gt;directory_ns;</div><div class='add'>+</div><div class='add'>+    /* Initialize entrylk_cbk and parent loc */</div><div class='add'>+    ns-&gt;ns_cbk = ns_cbk;</div><div class='add'>+</div><div class='add'>+    ret = dht_build_parent_loc(this, &amp;parent, loc, &amp;op_errno);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_ERROR, op_errno, DHT_MSG_LOC_FAILED,</div><div class='add'>+                "gfid=%s", loc-&gt;gfid, "name=%s", loc-&gt;name, "path=%s",</div><div class='add'>+                loc-&gt;path, NULL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    gf_uuid_unparse(parent.gfid, pgfid);</div><div class='add'>+</div><div class='add'>+    /* Alloc inodelk */</div><div class='add'>+    inodelk-&gt;locks = GF_CALLOC(count, sizeof(*lk_array), gf_common_mt_pointer);</div><div class='add'>+    if (inodelk-&gt;locks == NULL) {</div><div class='add'>+        local-&gt;op_errno = ENOMEM;</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_WARNING, local-&gt;op_errno,</div><div class='add'>+                DHT_MSG_CALLOC_FAILED, "fop=%s", gf_fop_list[local-&gt;fop],</div><div class='add'>+                "pgfid=%s", pgfid, "name=%s", loc-&gt;name, "path=%s", loc-&gt;path,</div><div class='add'>+                NULL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    inodelk-&gt;locks[0] = dht_lock_new(this, subvol, &amp;parent, F_RDLCK,</div><div class='add'>+                                     DHT_LAYOUT_HEAL_DOMAIN, NULL,</div><div class='add'>+                                     FAIL_ON_ANY_ERROR);</div><div class='add'>+    if (inodelk-&gt;locks[0] == NULL) {</div><div class='add'>+        local-&gt;op_errno = ENOMEM;</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_WARNING, local-&gt;op_errno,</div><div class='add'>+                DHT_MSG_LOCK_ALLOC_FAILED, "inodelk-fop=%s",</div><div class='add'>+                gf_fop_list[local-&gt;fop], "pgfid=%s", pgfid, "name=%s",</div><div class='add'>+                loc-&gt;name, "path=%s", loc-&gt;path, NULL);</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+    inodelk-&gt;lk_count = count;</div><div class='add'>+</div><div class='add'>+    /* Allock entrylk */</div><div class='add'>+    entrylk-&gt;locks = GF_CALLOC(count, sizeof(*lk_array), gf_common_mt_pointer);</div><div class='add'>+    if (entrylk-&gt;locks == NULL) {</div><div class='add'>+        local-&gt;op_errno = ENOMEM;</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_WARNING, local-&gt;op_errno,</div><div class='add'>+                DHT_MSG_CALLOC_FAILED, "entrylk-fop=%s",</div><div class='add'>+                gf_fop_list[local-&gt;fop], "pgfid=%s", pgfid, "name=%s",</div><div class='add'>+                loc-&gt;name, "path=%s", loc-&gt;path, NULL);</div><div class='add'>+</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    entrylk-&gt;locks[0] = dht_lock_new(this, subvol, &amp;parent, F_WRLCK,</div><div class='add'>+                                     DHT_ENTRY_SYNC_DOMAIN, loc-&gt;name,</div><div class='add'>+                                     FAIL_ON_ANY_ERROR);</div><div class='add'>+    if (entrylk-&gt;locks[0] == NULL) {</div><div class='add'>+        local-&gt;op_errno = ENOMEM;</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_WARNING, local-&gt;op_errno,</div><div class='add'>+                DHT_MSG_LOCK_ALLOC_FAILED, "entrylk-fop=%s",</div><div class='add'>+                gf_fop_list[local-&gt;fop], "pgfid=%s", pgfid, "name=%s",</div><div class='add'>+                loc-&gt;name, "path=%s", loc-&gt;path, NULL);</div><div class='add'>+</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+    entrylk-&gt;lk_count = count;</div><div class='add'>+</div><div class='add'>+    /* Take read inodelk on parent. If it is successful, take write entrylk</div><div class='add'>+     * on name in cbk.</div><div class='add'>+     */</div><div class='add'>+    lk_array = inodelk-&gt;locks;</div><div class='add'>+    ret = dht_blocking_inodelk(frame, lk_array, count,</div><div class='add'>+                               dht_blocking_entrylk_after_inodelk);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        local-&gt;op_errno = EIO;</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_WARNING, local-&gt;op_errno,</div><div class='add'>+                DHT_MSG_BLOCK_INODELK_FAILED, "fop=%s", gf_fop_list[local-&gt;fop],</div><div class='add'>+                "pgfid=%s", pgfid, "name=%s", loc-&gt;name, "path=%s", loc-&gt;path,</div><div class='add'>+                NULL);</div><div class='add'>+</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    loc_wipe(&amp;parent);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+err:</div><div class='add'>+    if (entrylk-&gt;locks != NULL) {</div><div class='add'>+        dht_lock_array_free(entrylk-&gt;locks, count);</div><div class='add'>+        GF_FREE(entrylk-&gt;locks);</div><div class='add'>+        entrylk-&gt;locks = NULL;</div><div class='add'>+        entrylk-&gt;lk_count = 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (inodelk-&gt;locks != NULL) {</div><div class='add'>+        dht_lock_array_free(inodelk-&gt;locks, count);</div><div class='add'>+        GF_FREE(inodelk-&gt;locks);</div><div class='add'>+        inodelk-&gt;locks = NULL;</div><div class='add'>+        inodelk-&gt;lk_count = 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    loc_wipe(&amp;parent);</div><div class='add'>+out:</div><div class='add'>+    return -1;</div><div class='add'>+}</div><div class='head'>diff --git a/xlators/cluster/dht/src/dht-lock.h b/xlators/cluster/dht/src/dht-lock.h<br/>new file mode 100644<br/>index 00000000000..6485c03fb6e<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/xlators/cluster/dht/src/dht-lock.h?id=d1d7a6f35c816822fab51c820e25023863c239c1'>xlators/cluster/dht/src/dht-lock.h</a></div><div class='hunk'>@@ -0,0 +1,91 @@</div><div class='add'>+/*</div><div class='add'>+  Copyright (c) 2016 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#ifndef _DHT_LOCK_H</div><div class='add'>+#define _DHT_LOCK_H</div><div class='add'>+</div><div class='add'>+#include "dht-common.h"</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+dht_lock_array_free(dht_lock_t **lk_array, int count);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+dht_lock_count(dht_lock_t **lk_array, int lk_count);</div><div class='add'>+</div><div class='add'>+dht_lock_t *</div><div class='add'>+dht_lock_new(xlator_t *this, xlator_t *xl, loc_t *loc, short type,</div><div class='add'>+             const char *domain, const char *basename,</div><div class='add'>+             dht_reaction_type_t do_on_failure);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+dht_unlock_entrylk_wrapper(call_frame_t *, dht_elock_wrap_t *);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+dht_blocking_entrylk_rec(call_frame_t *frame, int i);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+dht_blocking_entrylk(call_frame_t *frame, dht_lock_t **lk_array, int lk_count,</div><div class='add'>+                     fop_inodelk_cbk_t entrylk_cbk);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+dht_unlock_inodelk(call_frame_t *frame, dht_lock_t **lk_array, int lk_count,</div><div class='add'>+                   fop_inodelk_cbk_t inodelk_cbk);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+dht_unlock_inodelk_wrapper(call_frame_t *, dht_ilock_wrap_t *);</div><div class='add'>+</div><div class='add'>+/* Acquire non-blocking inodelk on a list of xlators.</div><div class='add'>+ *</div><div class='add'>+ * @lk_array: array of lock requests lock on.</div><div class='add'>+ *</div><div class='add'>+ * @lk_count: number of locks in @lk_array</div><div class='add'>+ *</div><div class='add'>+ * @inodelk_cbk: will be called after inodelk replies are received</div><div class='add'>+ *</div><div class='add'>+ * @retval: -1 if stack_winding inodelk fails. 0 otherwise.</div><div class='add'>+ *          inodelk_cbk is called with appropriate error on errors.</div><div class='add'>+ *          On failure to acquire lock on all members of list, successful</div><div class='add'>+ *          locks are unlocked before invoking cbk.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+dht_nonblocking_inodelk(call_frame_t *frame, dht_lock_t **lk_array,</div><div class='add'>+                        int lk_count, fop_inodelk_cbk_t inodelk_cbk);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+dht_blocking_inodelk_rec(call_frame_t *frame, int i);</div><div class='add'>+</div><div class='add'>+/* same as dht_nonblocking_inodelk, but issues sequential blocking locks on</div><div class='add'>+ * @lk_array directly. locks are issued on some order which remains same</div><div class='add'>+ * for a list of xlators (irrespective of order of xlators within list).</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+dht_blocking_inodelk(call_frame_t *frame, dht_lock_t **lk_array, int lk_count,</div><div class='add'>+                     fop_inodelk_cbk_t inodelk_cbk);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+dht_blocking_entrylk_after_inodelk(call_frame_t *frame, void *cookie,</div><div class='add'>+                                   xlator_t *this, int32_t op_ret,</div><div class='add'>+                                   int32_t op_errno, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+dht_blocking_entrylk_after_inodelk_rename(call_frame_t *frame, void *cookie,</div><div class='add'>+                                          xlator_t *this, int32_t op_ret,</div><div class='add'>+                                          int32_t op_errno, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+dht_unlock_namespace(call_frame_t *, dht_dir_transaction_t *);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+dht_protect_namespace(call_frame_t *frame, loc_t *loc, xlator_t *subvol,</div><div class='add'>+                      struct dht_namespace *ns, fop_entrylk_cbk_t ns_cbk);</div><div class='add'>+</div><div class='add'>+#endif /* _DHT_LOCK_H */</div><div class='head'>diff --git a/xlators/cluster/dht/src/dht-mem-types.h b/xlators/cluster/dht/src/dht-mem-types.h<br/>index 4a7a8bd811a..e3c4471334a 100644<br/>--- a/<a href='/cgit/glusterfs.git/tree/xlators/cluster/dht/src/dht-mem-types.h?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/cluster/dht/src/dht-mem-types.h</a><br/>+++ b/<a href='/cgit/glusterfs.git/tree/xlators/cluster/dht/src/dht-mem-types.h?id=d1d7a6f35c816822fab51c820e25023863c239c1'>xlators/cluster/dht/src/dht-mem-types.h</a></div><div class='hunk'>@@ -1,42 +1,38 @@</div><div class='del'>-</div><div class='ctx'> /*</div><div class='del'>-   Copyright (c) 2008-2009 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='del'>-   This file is part of GlusterFS.</div><div class='del'>-</div><div class='del'>-   GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-   it under the terms of the GNU General Public License as published</div><div class='del'>-   by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-   or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-   GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-   WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-   General Public License for more details.</div><div class='add'>+  Copyright (c) 2008-2012 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='ctx'> </div><div class='del'>-   You should have received a copy of the GNU General Public License</div><div class='del'>-   along with this program.  If not, see</div><div class='del'>-   &lt;http://www.gnu.org/licenses/&gt;.</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='ctx'> */</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> #ifndef __DHT_MEM_TYPES_H__</div><div class='ctx'> #define __DHT_MEM_TYPES_H__</div><div class='ctx'> </div><div class='del'>-#include "mem-types.h"</div><div class='add'>+#include &lt;glusterfs/mem-types.h&gt;</div><div class='ctx'> </div><div class='ctx'> enum gf_dht_mem_types_ {</div><div class='del'>-        gf_dht_mt_dht_du_t = gf_common_mt_end + 1,</div><div class='del'>-        gf_dht_mt_dht_conf_t,</div><div class='del'>-        gf_dht_mt_char,</div><div class='del'>-        gf_dht_mt_int32_t,</div><div class='del'>-        gf_dht_mt_dht_local_t,</div><div class='del'>-        gf_dht_mt_xlator_t,</div><div class='del'>-        gf_dht_mt_dht_layout_t,</div><div class='del'>-        gf_switch_mt_dht_conf_t,</div><div class='del'>-        gf_switch_mt_dht_du_t,</div><div class='del'>-        gf_switch_mt_switch_sched_array,</div><div class='del'>-        gf_switch_mt_switch_struct,</div><div class='del'>-        gf_dht_mt_end</div><div class='add'>+    gf_dht_mt_dht_du_t = gf_common_mt_end + 1,</div><div class='add'>+    gf_dht_mt_dht_conf_t,</div><div class='add'>+    gf_dht_mt_char,</div><div class='add'>+    gf_dht_mt_int32_t,</div><div class='add'>+    gf_dht_mt_xlator_t,</div><div class='add'>+    gf_dht_mt_dht_layout_t,</div><div class='add'>+    gf_switch_mt_switch_sched_array,</div><div class='add'>+    gf_switch_mt_switch_struct,</div><div class='add'>+    gf_dht_mt_subvol_time,</div><div class='add'>+    gf_dht_mt_loc_t,</div><div class='add'>+    gf_defrag_info_mt,</div><div class='add'>+    gf_dht_mt_inode_ctx_t,</div><div class='add'>+    gf_dht_mt_dirent_t,</div><div class='add'>+    gf_dht_mt_container_t,</div><div class='add'>+    gf_dht_mt_octx_t,</div><div class='add'>+    gf_dht_mt_miginfo_t,</div><div class='add'>+    gf_dht_mt_fd_ctx_t,</div><div class='add'>+    gf_dht_ret_cache_t,</div><div class='add'>+    gf_dht_nodeuuids_t,</div><div class='add'>+    gf_dht_mt_end</div><div class='ctx'> };</div><div class='ctx'> #endif</div><div class='del'>-</div><div class='head'>diff --git a/xlators/cluster/dht/src/dht-messages.h b/xlators/cluster/dht/src/dht-messages.h<br/>new file mode 100644<br/>index 00000000000..601f8dad78b<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/xlators/cluster/dht/src/dht-messages.h?id=d1d7a6f35c816822fab51c820e25023863c239c1'>xlators/cluster/dht/src/dht-messages.h</a></div><div class='hunk'>@@ -0,0 +1,386 @@</div><div class='add'>+/*Copyright (c) 2015 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#ifndef _DHT_MESSAGES_H_</div><div class='add'>+#define _DHT_MESSAGES_H_</div><div class='add'>+</div><div class='add'>+#include &lt;glusterfs/glfs-message-id.h&gt;</div><div class='add'>+</div><div class='add'>+/* To add new message IDs, append new identifiers at the end of the list.</div><div class='add'>+ *</div><div class='add'>+ * Never remove a message ID. If it's not used anymore, you can rename it or</div><div class='add'>+ * leave it as it is, but not delete it. This is to prevent reutilization of</div><div class='add'>+ * IDs by other messages.</div><div class='add'>+ *</div><div class='add'>+ * The component name must match one of the entries defined in</div><div class='add'>+ * glfs-message-id.h.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+GLFS_MSGID(</div><div class='add'>+    DHT, DHT_MSG_CACHED_SUBVOL_GET_FAILED, DHT_MSG_CREATE_LINK_FAILED,</div><div class='add'>+    DHT_MSG_DICT_SET_FAILED, DHT_MSG_DIR_ATTR_HEAL_FAILED,</div><div class='add'>+    DHT_MSG_DIR_SELFHEAL_FAILED, DHT_MSG_DIR_SELFHEAL_XATTR_FAILED,</div><div class='add'>+    DHT_MSG_FILE_ON_MULT_SUBVOL, DHT_MSG_FILE_TYPE_MISMATCH,</div><div class='add'>+    DHT_MSG_GFID_MISMATCH, DHT_MSG_GFID_NULL, DHT_MSG_HASHED_SUBVOL_GET_FAILED,</div><div class='add'>+    DHT_MSG_INIT_FAILED, DHT_MSG_INVALID_CONFIGURATION,</div><div class='add'>+    DHT_MSG_INVALID_DISK_LAYOUT, DHT_MSG_INVALID_OPTION,</div><div class='add'>+    DHT_MSG_LAYOUT_FIX_FAILED, DHT_MSG_LAYOUT_MERGE_FAILED,</div><div class='add'>+    DHT_MSG_LAYOUT_MISMATCH, DHT_MSG_LAYOUT_NULL, DHT_MSG_MIGRATE_DATA_COMPLETE,</div><div class='add'>+    DHT_MSG_MIGRATE_DATA_FAILED, DHT_MSG_MIGRATE_FILE_COMPLETE,</div><div class='add'>+    DHT_MSG_MIGRATE_FILE_FAILED, DHT_MSG_NO_MEMORY, DHT_MSG_OPENDIR_FAILED,</div><div class='add'>+    DHT_MSG_REBALANCE_FAILED, DHT_MSG_REBALANCE_START_FAILED,</div><div class='add'>+    DHT_MSG_REBALANCE_STATUS, DHT_MSG_REBALANCE_STOPPED, DHT_MSG_RENAME_FAILED,</div><div class='add'>+    DHT_MSG_SETATTR_FAILED, DHT_MSG_SUBVOL_INSUFF_INODES,</div><div class='add'>+    DHT_MSG_SUBVOL_INSUFF_SPACE, DHT_MSG_UNLINK_FAILED,</div><div class='add'>+    DHT_MSG_LAYOUT_SET_FAILED, DHT_MSG_LOG_FIXED_LAYOUT,</div><div class='add'>+    DHT_MSG_GET_XATTR_FAILED, DHT_MSG_FILE_LOOKUP_FAILED,</div><div class='add'>+    DHT_MSG_OPEN_FD_FAILED, DHT_MSG_SET_INODE_CTX_FAILED,</div><div class='add'>+    DHT_MSG_UNLOCKING_FAILED, DHT_MSG_DISK_LAYOUT_NULL, DHT_MSG_SUBVOL_INFO,</div><div class='add'>+    DHT_MSG_CHUNK_SIZE_INFO, DHT_MSG_LAYOUT_FORM_FAILED, DHT_MSG_SUBVOL_ERROR,</div><div class='add'>+    DHT_MSG_LAYOUT_SORT_FAILED, DHT_MSG_REGEX_INFO, DHT_MSG_FOPEN_FAILED,</div><div class='add'>+    DHT_MSG_SET_HOSTNAME_FAILED, DHT_MSG_BRICK_ERROR, DHT_MSG_SYNCOP_FAILED,</div><div class='add'>+    DHT_MSG_MIGRATE_INFO, DHT_MSG_SOCKET_ERROR, DHT_MSG_CREATE_FD_FAILED,</div><div class='add'>+    DHT_MSG_READDIR_ERROR, DHT_MSG_CHILD_LOC_BUILD_FAILED,</div><div class='add'>+    DHT_MSG_SET_SWITCH_PATTERN_ERROR, DHT_MSG_COMPUTE_HASH_FAILED,</div><div class='add'>+    DHT_MSG_FIND_LAYOUT_ANOMALIES_ERROR, DHT_MSG_ANOMALIES_INFO,</div><div class='add'>+    DHT_MSG_LAYOUT_INFO, DHT_MSG_INODE_LK_ERROR, DHT_MSG_RENAME_INFO,</div><div class='add'>+    DHT_MSG_DATA_NULL, DHT_MSG_AGGREGATE_QUOTA_XATTR_FAILED,</div><div class='add'>+    DHT_MSG_UNLINK_LOOKUP_INFO, DHT_MSG_LINK_FILE_LOOKUP_INFO,</div><div class='add'>+    DHT_MSG_OPERATION_NOT_SUP, DHT_MSG_NOT_LINK_FILE_ERROR, DHT_MSG_CHILD_DOWN,</div><div class='add'>+    DHT_MSG_UUID_PARSE_ERROR, DHT_MSG_GET_DISK_INFO_ERROR,</div><div class='add'>+    DHT_MSG_INVALID_VALUE, DHT_MSG_SWITCH_PATTERN_INFO,</div><div class='add'>+    DHT_MSG_SUBVOL_OP_FAILED, DHT_MSG_LAYOUT_PRESET_FAILED,</div><div class='add'>+    DHT_MSG_INVALID_LINKFILE, DHT_MSG_FIX_LAYOUT_INFO,</div><div class='add'>+    DHT_MSG_GET_HOSTNAME_FAILED, DHT_MSG_WRITE_FAILED,</div><div class='add'>+    DHT_MSG_MIGRATE_HARDLINK_FILE_FAILED, DHT_MSG_FSYNC_FAILED,</div><div class='add'>+    DHT_MSG_SUBVOL_DECOMMISSION_INFO, DHT_MSG_BRICK_QUERY_FAILED,</div><div class='add'>+    DHT_MSG_SUBVOL_NO_LAYOUT_INFO, DHT_MSG_OPEN_FD_ON_DST_FAILED,</div><div class='add'>+    DHT_MSG_SUBVOL_NOT_FOUND, DHT_MSG_FILE_LOOKUP_ON_DST_FAILED,</div><div class='add'>+    DHT_MSG_DISK_LAYOUT_MISSING, DHT_MSG_DICT_GET_FAILED,</div><div class='add'>+    DHT_MSG_REVALIDATE_CBK_INFO, DHT_MSG_UPGRADE_BRICKS, DHT_MSG_LK_ARRAY_INFO,</div><div class='add'>+    DHT_MSG_RENAME_NOT_LOCAL, DHT_MSG_RECONFIGURE_INFO,</div><div class='add'>+    DHT_MSG_INIT_LOCAL_SUBVOL_FAILED, DHT_MSG_SYS_CALL_GET_TIME_FAILED,</div><div class='add'>+    DHT_MSG_NO_DISK_USAGE_STATUS, DHT_MSG_SUBVOL_DOWN_ERROR,</div><div class='add'>+    DHT_MSG_REBAL_THROTTLE_INFO, DHT_MSG_COMMIT_HASH_INFO,</div><div class='add'>+    DHT_MSG_REBAL_STRUCT_SET, DHT_MSG_HAS_MIGINFO, DHT_MSG_SETTLE_HASH_FAILED,</div><div class='add'>+    DHT_MSG_DEFRAG_PROCESS_DIR_FAILED, DHT_MSG_FD_CTX_SET_FAILED,</div><div class='add'>+    DHT_MSG_STALE_LOOKUP, DHT_MSG_PARENT_LAYOUT_CHANGED,</div><div class='add'>+    DHT_MSG_LOCK_MIGRATION_FAILED, DHT_MSG_LOCK_INODE_UNREF_FAILED,</div><div class='add'>+    DHT_MSG_ASPRINTF_FAILED, DHT_MSG_DIR_LOOKUP_FAILED, DHT_MSG_INODELK_FAILED,</div><div class='add'>+    DHT_MSG_LOCK_FRAME_FAILED, DHT_MSG_LOCAL_LOCK_INIT_FAILED,</div><div class='add'>+    DHT_MSG_ENTRYLK_ERROR, DHT_MSG_INODELK_ERROR, DHT_MSG_LOC_FAILED,</div><div class='add'>+    DHT_MSG_UNKNOWN_FOP, DHT_MSG_MIGRATE_FILE_SKIPPED,</div><div class='add'>+    DHT_MSG_DIR_XATTR_HEAL_FAILED, DHT_MSG_HASHED_SUBVOL_DOWN,</div><div class='add'>+    DHT_MSG_NON_HASHED_SUBVOL_DOWN, DHT_MSG_SYNCTASK_CREATE_FAILED,</div><div class='add'>+    DHT_MSG_DIR_HEAL_ABORT, DHT_MSG_MIGRATE_SKIP, DHT_MSG_FD_CREATE_FAILED,</div><div class='add'>+    DHT_MSG_DICT_NEW_FAILED, DHT_MSG_FAILED_TO_OPEN, DHT_MSG_CREATE_FAILED,</div><div class='add'>+    DHT_MSG_FILE_NOT_EXIST, DHT_MSG_CHOWN_FAILED, DHT_MSG_FALLOCATE_FAILED,</div><div class='add'>+    DHT_MSG_FTRUNCATE_FAILED, DHT_MSG_STATFS_FAILED, DHT_MSG_WRITE_CROSS,</div><div class='add'>+    DHT_MSG_NEW_TARGET_FOUND, DHT_MSG_INSUFF_MEMORY, DHT_MSG_SET_XATTR_FAILED,</div><div class='add'>+    DHT_MSG_SET_MODE_FAILED, DHT_MSG_FILE_EXISTS_IN_DEST,</div><div class='add'>+    DHT_MSG_SYMLINK_FAILED, DHT_MSG_LINKFILE_DEL_FAILED, DHT_MSG_MKNOD_FAILED,</div><div class='add'>+    DHT_MSG_MIGRATE_CLEANUP_FAILED, DHT_MSG_LOCK_MIGRATE,</div><div class='add'>+    DHT_MSG_PARENT_BUILD_FAILED, DHT_MSG_HASHED_SUBVOL_NOT_FOUND,</div><div class='add'>+    DHT_MSG_ACQUIRE_ENTRYLK_FAILED, DHT_MSG_CREATE_DST_FAILED,</div><div class='add'>+    DHT_MSG_MIGRATION_EXIT, DHT_MSG_CHANGED_DST, DHT_MSG_TRACE_FAILED,</div><div class='add'>+    DHT_MSG_WRITE_LOCK_FAILED, DHT_MSG_GETACTIVELK_FAILED, DHT_MSG_STAT_FAILED,</div><div class='add'>+    DHT_MSG_UNLINK_PERFORM_FAILED, DHT_MSG_CLANUP_SOURCE_FILE_FAILED,</div><div class='add'>+    DHT_MSG_UNLOCK_FILE_FAILED, DHT_MSG_REMOVE_XATTR_FAILED,</div><div class='add'>+    DHT_MSG_DATA_MIGRATE_ABORT, DHT_MSG_DEFRAG_NULL, DHT_MSG_PARENT_NULL,</div><div class='add'>+    DHT_MSG_GFID_NOT_PRESENT, DHT_MSG_CHILD_LOC_FAILED,</div><div class='add'>+    DHT_MSG_SET_LOOKUP_FAILED, DHT_MSG_DIR_REMOVED, DHT_MSG_FIX_NOT_COMP,</div><div class='add'>+    DHT_MSG_SUBVOL_DETER_FAILED, DHT_MSG_LOCAL_SUBVOL, DHT_MSG_NODE_UUID,</div><div class='add'>+    DHT_MSG_SIZE_FILE, DHT_MSG_GET_DATA_SIZE_FAILED,</div><div class='add'>+    DHT_MSG_PTHREAD_JOIN_FAILED, DHT_MSG_COUNTER_THREAD_CREATE_FAILED,</div><div class='add'>+    DHT_MSG_MIGRATION_INIT_QUEUE_FAILED, DHT_MSG_PAUSED_TIMEOUT, DHT_MSG_WOKE,</div><div class='add'>+    DHT_MSG_ABORT_REBALANCE, DHT_MSG_CREATE_TASK_REBAL_FAILED,</div><div class='add'>+    DHT_MSG_REBAL_ESTIMATE_NOT_AVAIL, DHT_MSG_ADD_CHOICES_ERROR,</div><div class='add'>+    DHT_MSG_GET_CHOICES_ERROR, DHT_MSG_PREPARE_STATUS_ERROR,</div><div class='add'>+    DHT_MSG_SET_CHOICE_FAILED, DHT_MSG_SET_HASHED_SUBVOL_FAILED,</div><div class='add'>+    DHT_MSG_XATTR_HEAL_NOT_POSS, DHT_MSG_LINKTO_FILE_FAILED,</div><div class='add'>+    DHT_MSG_STALE_LINKFILE_DELETE, DHT_MSG_NO_SUBVOL_FOR_LINKTO,</div><div class='add'>+    DHT_MSG_SUBVOL_RETURNED, DHT_MSG_UNKNOWN_LOCAL_XSEL, DHT_MSG_GET_XATTR_ERR,</div><div class='add'>+    DHT_MSG_ALLOC_OR_FILL_FAILED, DHT_MSG_GET_REAL_NAME_FAILED,</div><div class='add'>+    DHT_MSG_COPY_UUID_FAILED, DHT_MSG_MDS_DETER_FAILED,</div><div class='add'>+    DHT_MSG_CREATE_REBAL_FAILED, DHT_MSG_LINK_LAYOUT_FAILED,</div><div class='add'>+    DHT_MSG_NO_SUBVOL_IN_LAYOUT, DHT_MSG_MEM_ALLOC_FAILED,</div><div class='add'>+    DHT_MSG_SET_IN_PARAMS_DICT_FAILED, DHT_MSG_LOC_COPY_FAILED,</div><div class='add'>+    DHT_MSG_PARENT_LOC_FAILED, DHT_MSG_CREATE_LOCK_FAILED,</div><div class='add'>+    DHT_MSG_PREV_ATTEMPT_FAILED, DHT_MSG_REFRESH_ATTEMPT,</div><div class='add'>+    DHT_MSG_ACQUIRE_LOCK_FAILED, DHT_MSG_CREATE_STUB_FAILED,</div><div class='add'>+    DHT_MSG_WIND_LOCK_REQ_FAILED, DHT_MSG_REFRESH_FAILED,</div><div class='add'>+    DHT_MSG_CACHED_SUBVOL_ERROR, DHT_MSG_NO_LINK_SUBVOL, DHT_MSG_SET_KEY_FAILED,</div><div class='add'>+    DHT_MSG_REMOVE_LINKTO_FAILED, DHT_MSG_LAYOUT_DICT_SET_FAILED,</div><div class='add'>+    DHT_MSG_XATTR_DICT_NULL, DHT_MSG_DUMMY_ALLOC_FAILED, DHT_MSG_DICT_IS_NULL,</div><div class='add'>+    DHT_MSG_LINK_INODE_FAILED, DHT_MSG_SELFHEAL_FAILED, DHT_MSG_NO_MDS_SUBVOL,</div><div class='add'>+    DHT_MSG_LIST_XATTRS_FAILED, DHT_MSG_RESET_INTER_XATTR_FAILED,</div><div class='add'>+    DHT_MSG_MDS_DOWN_UNABLE_TO_SET, DHT_MSG_WIND_UNLOCK_FAILED,</div><div class='add'>+    DHT_MSG_COMMIT_HASH_FAILED, DHT_MSG_UNLOCK_GFID_FAILED,</div><div class='add'>+    DHT_MSG_UNLOCK_FOLLOW_ENTRYLK, DHT_MSG_COPY_FRAME_FAILED,</div><div class='add'>+    DHT_MSG_UNLOCK_FOLLOW_LOCKS, DHT_MSG_ENTRYLK_FAILED_AFT_INODELK,</div><div class='add'>+    DHT_MSG_CALLOC_FAILED, DHT_MSG_LOCK_ALLOC_FAILED,</div><div class='add'>+    DHT_MSG_BLOCK_INODELK_FAILED,</div><div class='add'>+    DHT_MSG_LOCAL_LOCKS_STORE_FAILED_UNLOCKING_FOLLOWING_ENTRYLK,</div><div class='add'>+    DHT_MSG_ALLOC_FRAME_FAILED_NOT_UNLOCKING_FOLLOWING_ENTRYLKS,</div><div class='add'>+    DHT_MSG_DST_NULL_SET_FAILED);</div><div class='add'>+</div><div class='add'>+#define DHT_MSG_FD_CTX_SET_FAILED_STR "Failed to set fd ctx"</div><div class='add'>+#define DHT_MSG_INVALID_VALUE_STR "Different dst found in the fd ctx"</div><div class='add'>+#define DHT_MSG_UNKNOWN_FOP_STR "Unknown FOP on file"</div><div class='add'>+#define DHT_MSG_OPEN_FD_ON_DST_FAILED_STR "Failed to open the fd on file"</div><div class='add'>+#define DHT_MSG_SYNCTASK_CREATE_FAILED_STR "Failed to create synctask"</div><div class='add'>+#define DHT_MSG_ASPRINTF_FAILED_STR                                            \</div><div class='add'>+    "asprintf failed while fetching subvol from the id"</div><div class='add'>+#define DHT_MSG_HAS_MIGINFO_STR "Found miginfo in the inode ctx"</div><div class='add'>+#define DHT_MSG_FILE_LOOKUP_FAILED_STR "failed to lookup the file"</div><div class='add'>+#define DHT_MSG_INVALID_LINKFILE_STR                                           \</div><div class='add'>+    "linkto target is different from cached-subvol. treating as destination "  \</div><div class='add'>+    "subvol"</div><div class='add'>+#define DHT_MSG_GFID_MISMATCH_STR "gfid different on the target file"</div><div class='add'>+#define DHT_MSG_GET_XATTR_FAILED_STR "failed to get 'linkto' xattr"</div><div class='add'>+#define DHT_MSG_SET_INODE_CTX_FAILED_STR "failed to set inode-ctx target file"</div><div class='add'>+#define DHT_MSG_DIR_SELFHEAL_FAILED_STR "Healing of path failed"</div><div class='add'>+#define DHT_MSG_DIR_HEAL_ABORT_STR                                             \</div><div class='add'>+    "Failed to get path from subvol. Aborting directory healing"</div><div class='add'>+#define DHT_MSG_DIR_XATTR_HEAL_FAILED_STR "xattr heal failed for directory"</div><div class='add'>+#define DHT_MSG_LOCK_INODE_UNREF_FAILED_STR                                    \</div><div class='add'>+    "Found a NULL inode. Failed to unref the inode"</div><div class='add'>+#define DHT_MSG_DICT_SET_FAILED_STR "Failed to set dictionary value"</div><div class='add'>+#define DHT_MSG_NOT_LINK_FILE_ERROR_STR "got non-linkfile"</div><div class='add'>+#define DHT_MSG_CREATE_LINK_FAILED_STR "failed to initialize linkfile data"</div><div class='add'>+#define DHT_MSG_UNLINK_FAILED_STR "Unlinking linkfile on subvolume failed"</div><div class='add'>+#define DHT_MSG_MIGRATE_FILE_FAILED_STR "Migrate file failed"</div><div class='add'>+#define DHT_MSG_NO_MEMORY_STR "could not allocate memory for dict"</div><div class='add'>+#define DHT_MSG_SUBVOL_ERROR_STR "Failed to get linkto subvol"</div><div class='add'>+#define DHT_MSG_MIGRATE_HARDLINK_FILE_FAILED_STR "link failed on subvol"</div><div class='add'>+#define DHT_MSG_MIGRATE_FILE_SKIPPED_STR "Migration skipped"</div><div class='add'>+#define DHT_MSG_FD_CREATE_FAILED_STR "fd create failed"</div><div class='add'>+#define DHT_MSG_DICT_NEW_FAILED_STR "dict_new failed"</div><div class='add'>+#define DHT_MSG_FAILED_TO_OPEN_STR "failed to open"</div><div class='add'>+#define DHT_MSG_CREATE_FAILED_STR "failed to create"</div><div class='add'>+#define DHT_MSG_FILE_NOT_EXIST_STR "file does not exist"</div><div class='add'>+#define DHT_MSG_CHOWN_FAILED_STR "chown failed"</div><div class='add'>+#define DHT_MSG_FALLOCATE_FAILED_STR "fallocate failed"</div><div class='add'>+#define DHT_MSG_FTRUNCATE_FAILED_STR "ftruncate failed"</div><div class='add'>+#define DHT_MSG_STATFS_FAILED_STR "failed to get statfs"</div><div class='add'>+#define DHT_MSG_WRITE_CROSS_STR                                                \</div><div class='add'>+    "write will cross min-fre-disk for file on subvol. looking for new subvol"</div><div class='add'>+#define DHT_MSG_SUBVOL_INSUFF_SPACE_STR                                        \</div><div class='add'>+    "Could not find any subvol with space accommodating the file. Cosider "    \</div><div class='add'>+    "adding bricks"</div><div class='add'>+#define DHT_MSG_NEW_TARGET_FOUND_STR "New target found for file"</div><div class='add'>+#define DHT_MSG_INSUFF_MEMORY_STR "insufficient memory"</div><div class='add'>+#define DHT_MSG_SET_XATTR_FAILED_STR "failed to set xattr"</div><div class='add'>+#define DHT_MSG_SET_MODE_FAILED_STR "failed to set mode"</div><div class='add'>+#define DHT_MSG_FILE_EXISTS_IN_DEST_STR "file exists in destination"</div><div class='add'>+#define DHT_MSG_LINKFILE_DEL_FAILED_STR "failed to delete the linkfile"</div><div class='add'>+#define DHT_MSG_SYMLINK_FAILED_STR "symlink failed"</div><div class='add'>+#define DHT_MSG_MKNOD_FAILED_STR "mknod failed"</div><div class='add'>+#define DHT_MSG_SETATTR_FAILED_STR "failed to perform setattr"</div><div class='add'>+#define DHT_MSG_MIGRATE_CLEANUP_FAILED_STR                                     \</div><div class='add'>+    "Migrate file cleanup failed: failed to fstat file"</div><div class='add'>+#define DHT_MSG_LOCK_MIGRATE_STR "locks will be migrated for file"</div><div class='add'>+#define DHT_MSG_PARENT_BUILD_FAILED_STR                                        \</div><div class='add'>+    "failed to build parent loc, which is needed to acquire entrylk to "       \</div><div class='add'>+    "synchronize with renames on this path. Skipping migration"</div><div class='add'>+#define DHT_MSG_HASHED_SUBVOL_NOT_FOUND_STR                                    \</div><div class='add'>+    "cannot find hashed subvol which is needed to synchronize with renames "   \</div><div class='add'>+    "on this path. Skipping migration"</div><div class='add'>+#define DHT_MSG_ACQUIRE_ENTRYLK_FAILED_STR "failed to acquire entrylk on subvol"</div><div class='add'>+#define DHT_MSG_CREATE_DST_FAILED_STR "create dst failed for file"</div><div class='add'>+#define DHT_MSG_MIGRATION_EXIT_STR "Exiting migration"</div><div class='add'>+#define DHT_MSG_CHANGED_DST_STR "destination changed fo file"</div><div class='add'>+#define DHT_MSG_TRACE_FAILED_STR "Trace failed"</div><div class='add'>+#define DHT_MSG_WRITE_LOCK_FAILED_STR "write lock failed"</div><div class='add'>+#define DHT_MSG_GETACTIVELK_FAILED_STR "getactivelk failed for file"</div><div class='add'>+#define DHT_MSG_STAT_FAILED_STR "failed to do a stat"</div><div class='add'>+#define DHT_MSG_UNLINK_PERFORM_FAILED_STR "failed to perform unlink"</div><div class='add'>+#define DHT_MSG_MIGRATE_FILE_COMPLETE_STR "completed migration"</div><div class='add'>+#define DHT_MSG_CLANUP_SOURCE_FILE_FAILED_STR "failed to cleanup source file"</div><div class='add'>+#define DHT_MSG_UNLOCK_FILE_FAILED_STR "failed to unlock file"</div><div class='add'>+#define DHT_MSG_REMOVE_XATTR_FAILED_STR "remove xattr failed"</div><div class='add'>+#define DHT_MSG_SOCKET_ERROR_STR "Failed to unlink listener socket"</div><div class='add'>+#define DHT_MSG_HASHED_SUBVOL_GET_FAILED_STR "Failed to get hashed subvolume"</div><div class='add'>+#define DHT_MSG_CACHED_SUBVOL_GET_FAILED_STR "Failed to get cached subvolume"</div><div class='add'>+#define DHT_MSG_MIGRATE_DATA_FAILED_STR "migrate-data failed"</div><div class='add'>+#define DHT_MSG_DEFRAG_NULL_STR "defrag is NULL"</div><div class='add'>+#define DHT_MSG_DATA_MIGRATE_ABORT_STR                                         \</div><div class='add'>+    "Readdirp failed. Aborting data migration for dict"</div><div class='add'>+#define DHT_MSG_LAYOUT_FIX_FAILED_STR "fix layout failed"</div><div class='add'>+#define DHT_MSG_PARENT_NULL_STR "parent is NULL"</div><div class='add'>+#define DHT_MSG_GFID_NOT_PRESENT_STR "gfid not present"</div><div class='add'>+#define DHT_MSG_CHILD_LOC_FAILED_STR "Child loc build failed"</div><div class='add'>+#define DHT_MSG_SET_LOOKUP_FAILED_STR "Failed to set lookup"</div><div class='add'>+#define DHT_MSG_DIR_LOOKUP_FAILED_STR "lookup failed"</div><div class='add'>+#define DHT_MSG_DIR_REMOVED_STR "Dir renamed or removed. Skipping"</div><div class='add'>+#define DHT_MSG_READDIR_ERROR_STR "readdir failed, Aborting fix-layout"</div><div class='add'>+#define DHT_MSG_SETTLE_HASH_FAILED_STR "Settle hash failed"</div><div class='add'>+#define DHT_MSG_DEFRAG_PROCESS_DIR_FAILED_STR "gf_defrag_process_dir failed"</div><div class='add'>+#define DHT_MSG_FIX_NOT_COMP_STR                                               \</div><div class='add'>+    "Unable to retrieve fixlayout xattr. Assume background fix layout not "    \</div><div class='add'>+    "complete"</div><div class='add'>+#define DHT_MSG_SUBVOL_DETER_FAILED_STR                                        \</div><div class='add'>+    "local subvolume determination failed with error"</div><div class='add'>+#define DHT_MSG_LOCAL_SUBVOL_STR "local subvol"</div><div class='add'>+#define DHT_MSG_NODE_UUID_STR "node uuid"</div><div class='add'>+#define DHT_MSG_SIZE_FILE_STR "Total size files"</div><div class='add'>+#define DHT_MSG_GET_DATA_SIZE_FAILED_STR                                       \</div><div class='add'>+    "Failed to get the total data size. Unable to estimate time to complete "  \</div><div class='add'>+    "rebalance"</div><div class='add'>+#define DHT_MSG_PTHREAD_JOIN_FAILED_STR                                        \</div><div class='add'>+    "file_counter_thread: pthread_join failed"</div><div class='add'>+#define DHT_MSG_COUNTER_THREAD_CREATE_FAILED_STR                               \</div><div class='add'>+    "Failed to create the file counter thread"</div><div class='add'>+#define DHT_MSG_MIGRATION_INIT_QUEUE_FAILED_STR                                \</div><div class='add'>+    "Failed to initialise migration queue"</div><div class='add'>+#define DHT_MSG_REBALANCE_STOPPED_STR "Received stop command on rebalance"</div><div class='add'>+#define DHT_MSG_PAUSED_TIMEOUT_STR "Request pause timer timeout"</div><div class='add'>+#define DHT_MSG_WOKE_STR "woken"</div><div class='add'>+#define DHT_MSG_ABORT_REBALANCE_STR "Aborting rebalance"</div><div class='add'>+#define DHT_MSG_REBALANCE_START_FAILED_STR                                     \</div><div class='add'>+    "Failed to start rebalance: look up on / failed"</div><div class='add'>+#define DHT_MSG_CREATE_TASK_REBAL_FAILED_STR                                   \</div><div class='add'>+    "Could not create task for rebalance"</div><div class='add'>+#define DHT_MSG_REBAL_ESTIMATE_NOT_AVAIL_STR                                   \</div><div class='add'>+    "Rebalance estimates will not be available"</div><div class='add'>+#define DHT_MSG_REBALANCE_STATUS_STR "Rebalance status"</div><div class='add'>+#define DHT_MSG_DATA_NULL_STR "data value is NULL"</div><div class='add'>+#define DHT_MSG_ADD_CHOICES_ERROR_STR "Error to add choices in buffer"</div><div class='add'>+#define DHT_MSG_GET_CHOICES_ERROR_STR "Error to get choices"</div><div class='add'>+#define DHT_MSG_PREPARE_STATUS_ERROR_STR "Error to prepare status"</div><div class='add'>+#define DHT_MSG_SET_CHOICE_FAILED_STR "Failed to set full choice"</div><div class='add'>+#define DHT_MSG_AGGREGATE_QUOTA_XATTR_FAILED_STR                               \</div><div class='add'>+    "Failed to aggregate quota xattr"</div><div class='add'>+#define DHT_MSG_FILE_TYPE_MISMATCH_STR                                         \</div><div class='add'>+    "path exists as a file on one subvolume and directory on another. Please " \</div><div class='add'>+    "fix it manually"</div><div class='add'>+#define DHT_MSG_LAYOUT_SET_FAILED_STR "failed to set layout for subvolume"</div><div class='add'>+#define DHT_MSG_LAYOUT_MERGE_FAILED_STR "failed to merge layouts for subvolume"</div><div class='add'>+#define DHT_MSG_SET_HASHED_SUBVOL_FAILED_STR "Failed to set hashed subvolume"</div><div class='add'>+#define DHT_MSG_XATTR_HEAL_NOT_POSS_STR                                        \</div><div class='add'>+    "No gfid exists for path. so healing xattr is not possible"</div><div class='add'>+#define DHT_MSG_REVALIDATE_CBK_INFO_STR "Revalidate: subvolume returned -1"</div><div class='add'>+#define DHT_MSG_LAYOUT_MISMATCH_STR "Mismatching layouts"</div><div class='add'>+#define DHT_MSG_UNLINK_LOOKUP_INFO_STR "lookup_unlink retuened"</div><div class='add'>+#define DHT_MSG_LINKTO_FILE_FAILED_STR                                         \</div><div class='add'>+    "Could not unlink the linkto file as either fd is open and/or linkto "     \</div><div class='add'>+    "xattr is set"</div><div class='add'>+#define DHT_MSG_LAYOUT_PRESET_FAILED_STR                                       \</div><div class='add'>+    "Could not set pre-set layout for subvolume"</div><div class='add'>+#define DHT_MSG_FILE_ON_MULT_SUBVOL_STR                                        \</div><div class='add'>+    "multiple subvolumes have file (preferably rename the file in the "        \</div><div class='add'>+    "backend, and do a fresh lookup"</div><div class='add'>+#define DHT_MSG_STALE_LINKFILE_DELETE_STR                                      \</div><div class='add'>+    "attempting deletion of stale linkfile"</div><div class='add'>+#define DHT_MSG_LINK_FILE_LOOKUP_INFO_STR "Lookup on following linkfile"</div><div class='add'>+#define DHT_MSG_NO_SUBVOL_FOR_LINKTO_STR "No link subvolume for linkto"</div><div class='add'>+#define DHT_MSG_SUBVOL_RETURNED_STR "Subvolume returned -1"</div><div class='add'>+#define DHT_MSG_UNKNOWN_LOCAL_XSEL_STR "Unknown local-&gt;xsel"</div><div class='add'>+#define DHT_MSG_DICT_GET_FAILED_STR "Failed to get"</div><div class='add'>+#define DHT_MSG_UUID_PARSE_ERROR_STR "Failed to parse uuid"</div><div class='add'>+#define DHT_MSG_GET_XATTR_ERR_STR "getxattr err for dir"</div><div class='add'>+#define DHT_MSG_ALLOC_OR_FILL_FAILED_STR "alloc or fill failed"</div><div class='add'>+#define DHT_MSG_UPGRADE_BRICKS_STR                                             \</div><div class='add'>+    "At least one of the bricks does not support this operation. Please "      \</div><div class='add'>+    "upgrade all bricks"</div><div class='add'>+#define DHT_MSG_GET_REAL_NAME_FAILED_STR "Failed to get real filename"</div><div class='add'>+#define DHT_MSG_LAYOUT_NULL_STR "Layout is NULL"</div><div class='add'>+#define DHT_MSG_COPY_UUID_FAILED_STR "Failed to copy node uuid key"</div><div class='add'>+#define DHT_MSG_MDS_DETER_FAILED_STR                                           \</div><div class='add'>+    "Cannot determine MDS, fetching xattr randomly from a subvol"</div><div class='add'>+#define DHT_MSG_HASHED_SUBVOL_DOWN_STR                                         \</div><div class='add'>+    "MDS is down for path, so fetching xattr randomly from subvol"</div><div class='add'>+#define DHT_MSG_CREATE_REBAL_FAILED_STR                                        \</div><div class='add'>+    "failed to create a new rebalance synctask"</div><div class='add'>+#define DHT_MSG_FIX_LAYOUT_INFO_STR "fixing the layout"</div><div class='add'>+#define DHT_MSG_OPERATION_NOT_SUP_STR "wrong directory-spread-count value"</div><div class='add'>+#define DHT_MSG_LINK_LAYOUT_FAILED_STR "failed to link the layout in inode"</div><div class='add'>+#define DHT_MSG_NO_SUBVOL_IN_LAYOUT_STR "no subvolume in layout for path"</div><div class='add'>+#define DHT_MSG_INODE_LK_ERROR_STR "mknod lock failed for file"</div><div class='add'>+#define DHT_MSG_MEM_ALLOC_FAILED_STR "mem allocation failed"</div><div class='add'>+#define DHT_MSG_PARENT_LAYOUT_CHANGED_STR                                      \</div><div class='add'>+    "extracting in-memory layout of parent failed"</div><div class='add'>+#define DHT_MSG_SET_IN_PARAMS_DICT_FAILED_STR                                  \</div><div class='add'>+    "setting in params dictionary failed"</div><div class='add'>+#define DHT_MSG_LOC_COPY_FAILED_STR "loc_copy failed"</div><div class='add'>+#define DHT_MSG_LOC_FAILED_STR "parent loc build failed"</div><div class='add'>+#define DHT_MSG_PARENT_LOC_FAILED_STR "locking parent failed"</div><div class='add'>+#define DHT_MSG_CREATE_LOCK_FAILED_STR "Create lock failed"</div><div class='add'>+#define DHT_MSG_PREV_ATTEMPT_FAILED_STR                                        \</div><div class='add'>+    "mkdir loop detected. parent layout didn't change even though previous "   \</div><div class='add'>+    "attempt of mkdir failed because of in-memory layout not matching with "   \</div><div class='add'>+    "that on disk."</div><div class='add'>+#define DHT_MSG_REFRESH_ATTEMPT_STR                                            \</div><div class='add'>+    "mkdir parent layout changed. Attempting a refresh and then a retry"</div><div class='add'>+#define DHT_MSG_ACQUIRE_LOCK_FAILED_STR                                        \</div><div class='add'>+    "Acquiring lock on parent to guard against layout-change failed"</div><div class='add'>+#define DHT_MSG_CREATE_STUB_FAILED_STR "creating stub failed"</div><div class='add'>+#define DHT_MSG_WIND_LOCK_REQ_FAILED_STR                                       \</div><div class='add'>+    "cannot wind lock request to guard parent layout"</div><div class='add'>+#define DHT_MSG_REFRESH_FAILED_STR "refreshing parent layout failed."</div><div class='add'>+#define DHT_MSG_CACHED_SUBVOL_ERROR_STR "On cached subvol"</div><div class='add'>+#define DHT_MSG_NO_LINK_SUBVOL_STR "Linkfile does not have link subvolume"</div><div class='add'>+#define DHT_MSG_SET_KEY_FAILED_STR "failed to set key"</div><div class='add'>+#define DHT_MSG_CHILD_DOWN_STR "Received CHILD_DOWN. Exiting"</div><div class='add'>+#define DHT_MSG_LOG_FIXED_LAYOUT_STR "log layout fixed"</div><div class='add'>+#define DHT_MSG_REBAL_STRUCT_SET_STR "local-&gt;rebalance already set"</div><div class='add'>+#define DHT_MSG_REMOVE_LINKTO_FAILED_STR "Removal of linkto failed at subvol"</div><div class='add'>+#define DHT_MSG_LAYOUT_DICT_SET_FAILED_STR "dht layout dict set failed"</div><div class='add'>+#define DHT_MSG_SUBVOL_INFO_STR "creating subvolume"</div><div class='add'>+#define DHT_MSG_COMPUTE_HASH_FAILED_STR "hash computation failed"</div><div class='add'>+#define DHT_MSG_INVALID_DISK_LAYOUT_STR                                        \</div><div class='add'>+    "Invalid disk layout: Catastrophic error layout with unknown type found"</div><div class='add'>+#define DHT_MSG_LAYOUT_SORT_FAILED_STR "layout sort failed"</div><div class='add'>+#define DHT_MSG_ANOMALIES_INFO_STR "Found anomalies"</div><div class='add'>+#define DHT_MSG_XATTR_DICT_NULL_STR "xattr dictionary is NULL"</div><div class='add'>+#define DHT_MSG_DISK_LAYOUT_MISSING_STR "Disk layout missing"</div><div class='add'>+#define DHT_MSG_LAYOUT_INFO_STR "layout info"</div><div class='add'>+#define DHT_MSG_SUBVOL_NO_LAYOUT_INFO_STR "no pre-set layout for subvol"</div><div class='add'>+#define DHT_MSG_SELFHEAL_XATTR_FAILED_STR "layout setxattr failed"</div><div class='add'>+#define DHT_MSG_DIR_SELFHEAL_XATTR_FAILED_STR "Directory self heal xattr failed"</div><div class='add'>+#define DHT_MSG_DUMMY_ALLOC_FAILED_STR "failed to allocate dummy layout"</div><div class='add'>+#define DHT_MSG_DICT_IS_NULL_STR                                               \</div><div class='add'>+    "dict is NULL, need to make sure gfids are same"</div><div class='add'>+#define DHT_MSG_ENTRYLK_ERROR_STR "acquiring entrylk after inodelk failed"</div><div class='add'>+#define DHT_MSG_NO_DISK_USAGE_STATUS_STR "no du stats"</div><div class='add'>+#define DHT_MSG_LINK_INODE_FAILED_STR "linking inode failed"</div><div class='add'>+#define DHT_MSG_SELFHEAL_FAILED_STR "Directory selfheal failed"</div><div class='add'>+#define DHT_MSG_NO_MDS_SUBVOL_STR "No mds subvol"</div><div class='add'>+#define DHT_MSG_LIST_XATTRS_FAILED_STR "failed to list xattrs"</div><div class='add'>+#define DHT_MSG_RESET_INTER_XATTR_FAILED_STR "Failed to reset internal xattr"</div><div class='add'>+#define DHT_MSG_MDS_DOWN_UNABLE_TO_SET_STR                                     \</div><div class='add'>+    "mds subvol is down, unable to set xattr"</div><div class='add'>+#define DHT_MSG_DIR_ATTR_HEAL_FAILED_STR                                       \</div><div class='add'>+    "Directory attr heal failed. Failed to set uid/gid"</div><div class='add'>+#define DHT_MSG_WIND_UNLOCK_FAILED_STR                                         \</div><div class='add'>+    "Winding unlock failed: stale locks left on brick"</div><div class='add'>+#define DHT_MSG_COMMIT_HASH_FAILED_STR "Directory commit hash updaten failed"</div><div class='add'>+#define DHT_MSG_LK_ARRAY_INFO_STR "lk info"</div><div class='add'>+#define DHT_MSG_UNLOCK_GFID_FAILED_STR                                         \</div><div class='add'>+    "unlock failed on gfid: stale lock might be left"</div><div class='add'>+#define DHT_MSG_UNLOCKING_FAILED_STR "unlocking failed"</div><div class='add'>+#define DHT_MSG_UNLOCK_FOLLOW_ENTRYLK_STR "not unlocking following entrylks"</div><div class='add'>+#define DHT_MSG_COPY_FRAME_FAILED_STR "copy frame failed"</div><div class='add'>+#define DHT_MSG_UNLOCK_FOLLOW_LOCKS_STR "not unlocking following locks"</div><div class='add'>+#define DHT_MSG_INODELK_FAILED_STR "inodelk failed on subvol"</div><div class='add'>+#define DHT_MSG_LOCK_FRAME_FAILED_STR "memory allocation failed for lock_frame"</div><div class='add'>+#define DHT_MSG_LOCAL_LOCK_INIT_FAILED_STR "dht_local_lock_init failed"</div><div class='add'>+#define DHT_MSG_ENTRYLK_FAILED_AFT_INODELK_STR                                 \</div><div class='add'>+    "dht_blocking_entrylk failed after taking inodelk"</div><div class='add'>+#define DHT_MSG_BLOCK_INODELK_FAILED_STR "dht_blocking_inodelk failed"</div><div class='add'>+#define DHT_MSG_CALLOC_FAILED_STR "calloc failed"</div><div class='add'>+#define DHT_MSG_LOCK_ALLOC_FAILED_STR "lock allocation failed"</div><div class='add'>+#define DHT_MSG_ALLOC_FRAME_FAILED_NOT_UNLOCKING_FOLLOWING_ENTRYLKS_STR        \</div><div class='add'>+    "cannot allocate a frame, not unlocking following entrylks"</div><div class='add'>+#define DHT_MSG_LOCAL_LOCKS_STORE_FAILED_UNLOCKING_FOLLOWING_ENTRYLK_STR       \</div><div class='add'>+    "storing locks in local failed, not unlocking following entrylks"</div><div class='add'>+#define DHT_MSG_DST_NULL_SET_FAILED_STR                                        \</div><div class='add'>+    "src or dst is NULL, Failed to set dictionary value"</div><div class='add'>+</div><div class='add'>+#endif /* _DHT_MESSAGES_H_ */</div><div class='head'>diff --git a/xlators/cluster/dht/src/dht-rebalance.c b/xlators/cluster/dht/src/dht-rebalance.c<br/>new file mode 100644<br/>index 00000000000..8ba8082bd86<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/xlators/cluster/dht/src/dht-rebalance.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>xlators/cluster/dht/src/dht-rebalance.c</a></div><div class='hunk'>@@ -0,0 +1,4702 @@</div><div class='add'>+/*</div><div class='add'>+  Copyright (c) 2008-2012 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#include "dht-common.h"</div><div class='add'>+#include &lt;glusterfs/syscall.h&gt;</div><div class='add'>+#include &lt;fnmatch.h&gt;</div><div class='add'>+#include &lt;signal.h&gt;</div><div class='add'>+#include &lt;glusterfs/events.h&gt;</div><div class='add'>+#include "glusterfs/compat-errno.h"  // for ENODATA on BSD</div><div class='add'>+</div><div class='add'>+#define GF_DISK_SECTOR_SIZE 512</div><div class='add'>+#define DHT_REBALANCE_PID 4242        /* Change it if required */</div><div class='add'>+#define DHT_REBALANCE_BLKSIZE 1048576 /* 1 MB */</div><div class='add'>+#define MAX_MIGRATE_QUEUE_COUNT 500</div><div class='add'>+#define MIN_MIGRATE_QUEUE_COUNT 200</div><div class='add'>+#define MAX_REBAL_TYPE_SIZE 16</div><div class='add'>+#define FILE_CNT_INTERVAL 600       /* 10 mins */</div><div class='add'>+#define ESTIMATE_START_INTERVAL 600 /* 10 mins */</div><div class='add'>+#define HARDLINK_MIG_INPROGRESS -2</div><div class='add'>+#define SKIP_MIGRATION_FD_POSITIVE -3</div><div class='add'>+#ifndef MAX</div><div class='add'>+#define MAX(a, b) (((a) &gt; (b)) ? (a) : (b))</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#define GF_CRAWL_INDEX_MOVE(idx, sv_cnt)                                       \</div><div class='add'>+    {                                                                          \</div><div class='add'>+        idx++;                                                                 \</div><div class='add'>+        idx %= sv_cnt;                                                         \</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+uint64_t g_totalfiles = 0;</div><div class='add'>+uint64_t g_totalsize = 0;</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+gf_defrag_free_dir_dfmeta(struct dir_dfmeta *meta, int local_subvols_cnt)</div><div class='add'>+{</div><div class='add'>+    int i = 0;</div><div class='add'>+</div><div class='add'>+    if (meta) {</div><div class='add'>+        for (i = 0; i &lt; local_subvols_cnt; i++) {</div><div class='add'>+            if (meta-&gt;equeue)</div><div class='add'>+                gf_dirent_free(&amp;meta-&gt;equeue[i]);</div><div class='add'>+            if (meta-&gt;lfd &amp;&amp; meta-&gt;lfd[i])</div><div class='add'>+                fd_unref(meta-&gt;lfd[i]);</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        GF_FREE(meta-&gt;equeue);</div><div class='add'>+        GF_FREE(meta-&gt;head);</div><div class='add'>+        GF_FREE(meta-&gt;iterator);</div><div class='add'>+        GF_FREE(meta-&gt;offset_var);</div><div class='add'>+        GF_FREE(meta-&gt;fetch_entries);</div><div class='add'>+        GF_FREE(meta-&gt;lfd);</div><div class='add'>+        GF_FREE(meta);</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+gf_defrag_free_container(struct dht_container *container)</div><div class='add'>+{</div><div class='add'>+    if (container) {</div><div class='add'>+        gf_dirent_entry_free(container-&gt;df_entry);</div><div class='add'>+</div><div class='add'>+        if (container-&gt;parent_loc) {</div><div class='add'>+            loc_wipe(container-&gt;parent_loc);</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        GF_FREE(container-&gt;parent_loc);</div><div class='add'>+</div><div class='add'>+        GF_FREE(container);</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+dht_set_global_defrag_error(gf_defrag_info_t *defrag, int ret)</div><div class='add'>+{</div><div class='add'>+    LOCK(&amp;defrag-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        defrag-&gt;global_error = ret;</div><div class='add'>+    }</div><div class='add'>+    UNLOCK(&amp;defrag-&gt;lock);</div><div class='add'>+    return;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+dht_send_rebalance_event(xlator_t *this, int cmd, gf_defrag_status_t status)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    char *volname = NULL;</div><div class='add'>+    char *tmpstr = NULL;</div><div class='add'>+    char *ptr = NULL;</div><div class='add'>+    char *suffix = "-dht";</div><div class='add'>+    int len = 0;</div><div class='add'>+</div><div class='add'>+    eventtypes_t event = EVENT_LAST;</div><div class='add'>+</div><div class='add'>+    switch (status) {</div><div class='add'>+        case GF_DEFRAG_STATUS_COMPLETE:</div><div class='add'>+            event = EVENT_VOLUME_REBALANCE_COMPLETE;</div><div class='add'>+            break;</div><div class='add'>+        case GF_DEFRAG_STATUS_FAILED:</div><div class='add'>+            event = EVENT_VOLUME_REBALANCE_FAILED;</div><div class='add'>+            break;</div><div class='add'>+        case GF_DEFRAG_STATUS_STOPPED:</div><div class='add'>+            event = EVENT_VOLUME_REBALANCE_STOP;</div><div class='add'>+            break;</div><div class='add'>+        default:</div><div class='add'>+            break;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* DHT volume */</div><div class='add'>+    len = strlen(this-&gt;name) - strlen(suffix);</div><div class='add'>+    tmpstr = gf_strdup(this-&gt;name);</div><div class='add'>+    if (tmpstr) {</div><div class='add'>+        ptr = tmpstr + len;</div><div class='add'>+        if (!strcmp(ptr, suffix)) {</div><div class='add'>+            tmpstr[len] = '\0';</div><div class='add'>+            volname = tmpstr;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (!volname) {</div><div class='add'>+        /* Better than nothing */</div><div class='add'>+        volname = this-&gt;name;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (event != EVENT_LAST) {</div><div class='add'>+        gf_event(event, "volume=%s", volname);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    GF_FREE(tmpstr);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+dht_strip_out_acls(dict_t *dict)</div><div class='add'>+{</div><div class='add'>+    if (dict) {</div><div class='add'>+        dict_del(dict, "trusted.SGI_ACL_FILE");</div><div class='add'>+        dict_del(dict, POSIX_ACL_ACCESS_XATTR);</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+   return values:</div><div class='add'>+   -1 : failure</div><div class='add'>+   -2 : success</div><div class='add'>+</div><div class='add'>+Hard link migration is carried out in three stages.</div><div class='add'>+</div><div class='add'>+(Say there are n hardlinks)</div><div class='add'>+Stage 1: Setting the new hashed subvol information on the 1st hardlink</div><div class='add'>+         encountered (linkto setxattr)</div><div class='add'>+</div><div class='add'>+Stage 2: Creating hardlinks on new hashed subvol for the 2nd to (n-1)th</div><div class='add'>+         hardlink</div><div class='add'>+</div><div class='add'>+Stage 3: Physical migration of the data file for nth hardlink</div><div class='add'>+</div><div class='add'>+Why to deem "-2" as success and not "0":</div><div class='add'>+</div><div class='add'>+   dht_migrate_file expects return value "0" from _is_file_migratable if</div><div class='add'>+the file has to be migrated.</div><div class='add'>+</div><div class='add'>+   _is_file_migratable returns zero only when it is called with the</div><div class='add'>+flag "GF_DHT_MIGRATE_HARDLINK_IN_PROGRESS".</div><div class='add'>+</div><div class='add'>+   gf_defrag_handle_hardlink calls dht_migrate_file for physical migration</div><div class='add'>+of the data file with the flag "GF_DHT_MIGRATE_HARDLINK_IN_PROGRESS"</div><div class='add'>+</div><div class='add'>+Hence, gf_defrag_handle_hardlink returning "0" for success will force</div><div class='add'>+"dht_migrate_file" to migrate each of the hardlink which is not intended.</div><div class='add'>+</div><div class='add'>+For each of the three stage mentioned above "-2" will be returned and will</div><div class='add'>+be converted to "0" in dht_migrate_file.</div><div class='add'>+</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+gf_defrag_handle_hardlink(xlator_t *this, loc_t *loc, int *fop_errno)</div><div class='add'>+{</div><div class='add'>+    int32_t ret = -1;</div><div class='add'>+    xlator_t *cached_subvol = NULL;</div><div class='add'>+    xlator_t *hashed_subvol = NULL;</div><div class='add'>+    xlator_t *linkto_subvol = NULL;</div><div class='add'>+    data_t *data = NULL;</div><div class='add'>+    struct iatt iatt = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int32_t op_errno = 0;</div><div class='add'>+    dht_conf_t *conf = NULL;</div><div class='add'>+    gf_loglevel_t loglevel = 0;</div><div class='add'>+    dict_t *link_xattr = NULL;</div><div class='add'>+    dict_t *dict = NULL;</div><div class='add'>+    dict_t *xattr_rsp = NULL;</div><div class='add'>+    struct iatt stbuf = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    *fop_errno = EINVAL;</div><div class='add'>+</div><div class='add'>+    GF_VALIDATE_OR_GOTO("defrag", loc, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("defrag", loc-&gt;name, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("defrag", this, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("defrag", this-&gt;private, out);</div><div class='add'>+</div><div class='add'>+    conf = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    if (gf_uuid_is_null(loc-&gt;pargfid)) {</div><div class='add'>+        gf_msg("", GF_LOG_ERROR, 0, DHT_MSG_MIGRATE_FILE_FAILED,</div><div class='add'>+               "Migrate file failed :"</div><div class='add'>+               "loc-&gt;pargfid is NULL for %s",</div><div class='add'>+               loc-&gt;path);</div><div class='add'>+        *fop_errno = EINVAL;</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (gf_uuid_is_null(loc-&gt;gfid)) {</div><div class='add'>+        gf_msg("", GF_LOG_ERROR, 0, DHT_MSG_MIGRATE_FILE_FAILED,</div><div class='add'>+               "Migrate file failed :"</div><div class='add'>+               "loc-&gt;gfid is NULL for %s",</div><div class='add'>+               loc-&gt;path);</div><div class='add'>+        *fop_errno = EINVAL;</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    link_xattr = dict_new();</div><div class='add'>+    if (!link_xattr) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        *fop_errno = ENOMEM;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /*</div><div class='add'>+      Parallel migration can lead to migration of the hard link multiple</div><div class='add'>+      times which can lead to data loss. Hence, adding a fresh lookup to</div><div class='add'>+      decide whether migration is required or not.</div><div class='add'>+</div><div class='add'>+      Elaborating the scenario for let say 10 hardlinks [link{1..10}]:</div><div class='add'>+          Let say the first hard link "link1"  does the setxattr of the</div><div class='add'>+      new hashed subvolume info on the cached file. As there are multiple</div><div class='add'>+      threads working, we might have already all the links created on the</div><div class='add'>+      new hashed by the time we reach hardlink let say link5. Now the</div><div class='add'>+      number of links on hashed is equal to that of cached. Hence, file</div><div class='add'>+      migration will happen for link6.</div><div class='add'>+</div><div class='add'>+             Cached                                 Hashed</div><div class='add'>+      --------T link6                        rwxrwxrwx   link6</div><div class='add'>+</div><div class='add'>+      Now post above state all the link file on the cached will be zero</div><div class='add'>+      byte linkto files. Hence, if we still do migration for the following</div><div class='add'>+      files link{7..10}, we will end up migrating 0 data leading to data</div><div class='add'>+      loss.</div><div class='add'>+            Hence, a lookup can make sure whether we need to migrate the</div><div class='add'>+      file or not.</div><div class='add'>+    */</div><div class='add'>+</div><div class='add'>+    dict = dict_new();</div><div class='add'>+    if (!dict) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        *fop_errno = ENOMEM;</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_ERROR, ENOMEM, DHT_MSG_NO_MEMORY,</div><div class='add'>+               "could not allocate memory for dict");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_set_int32(dict, conf-&gt;link_xattr_name, 256);</div><div class='add'>+    if (ret) {</div><div class='add'>+        *fop_errno = ENOMEM;</div><div class='add'>+        ret = -1;</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_ERROR, 0, DHT_MSG_MIGRATE_FILE_FAILED,</div><div class='add'>+               "Migrate file failed:"</div><div class='add'>+               "%s: failed to set 'linkto' key in dict",</div><div class='add'>+               loc-&gt;path);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = syncop_lookup(this, loc, &amp;stbuf, NULL, dict, &amp;xattr_rsp);</div><div class='add'>+    if (ret) {</div><div class='add'>+        /*Ignore ENOENT and ESTALE as file might have been</div><div class='add'>+          migrated already*/</div><div class='add'>+        if (-ret == ENOENT || -ret == ESTALE) {</div><div class='add'>+            ret = -2;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_ERROR, -ret, DHT_MSG_MIGRATE_FILE_FAILED,</div><div class='add'>+               "Migrate file failed:%s lookup failed with ret = %d", loc-&gt;path,</div><div class='add'>+               ret);</div><div class='add'>+        *fop_errno = -ret;</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    cached_subvol = dht_subvol_get_cached(this, loc-&gt;inode);</div><div class='add'>+    if (!cached_subvol) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_ERROR, 0, DHT_MSG_MIGRATE_FILE_FAILED,</div><div class='add'>+               "Migrate file failed :"</div><div class='add'>+               "Failed to get cached subvol"</div><div class='add'>+               " for %s on %s",</div><div class='add'>+               loc-&gt;name, this-&gt;name);</div><div class='add'>+        *fop_errno = EINVAL;</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    hashed_subvol = dht_subvol_get_hashed(this, loc);</div><div class='add'>+    if (!hashed_subvol) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_ERROR, 0, DHT_MSG_MIGRATE_FILE_FAILED,</div><div class='add'>+               "Migrate file failed :"</div><div class='add'>+               "Failed to get hashed subvol"</div><div class='add'>+               " for %s on %s",</div><div class='add'>+               loc-&gt;name, this-&gt;name);</div><div class='add'>+        *fop_errno = EINVAL;</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Hardlink migration happens only with remove-brick. So this condition will</div><div class='add'>+     * be true only when the migration has happened. In case hardlinks are</div><div class='add'>+     * migrated for rebalance case, remove this check. Having this check here</div><div class='add'>+     * avoid redundant calls below*/</div><div class='add'>+    if (hashed_subvol == cached_subvol) {</div><div class='add'>+        ret = -2;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    gf_log(this-&gt;name, GF_LOG_INFO,</div><div class='add'>+           "Attempting to migrate hardlink %s "</div><div class='add'>+           "with gfid %s from %s -&gt; %s",</div><div class='add'>+           loc-&gt;name, uuid_utoa(loc-&gt;gfid), cached_subvol-&gt;name,</div><div class='add'>+           hashed_subvol-&gt;name);</div><div class='add'>+</div><div class='add'>+    data = dict_get(xattr_rsp, conf-&gt;link_xattr_name);</div><div class='add'>+    /* set linkto on cached -&gt; hashed if not present, else link it */</div><div class='add'>+    if (!data) {</div><div class='add'>+        ret = dict_set_str(link_xattr, conf-&gt;link_xattr_name,</div><div class='add'>+                           hashed_subvol-&gt;name);</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, 0, DHT_MSG_MIGRATE_FILE_FAILED,</div><div class='add'>+                   "Migrate file failed :"</div><div class='add'>+                   "Failed to set dictionary value:"</div><div class='add'>+                   " key = %s for %s",</div><div class='add'>+                   conf-&gt;link_xattr_name, loc-&gt;name);</div><div class='add'>+            *fop_errno = ENOMEM;</div><div class='add'>+            ret = -1;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        ret = syncop_setxattr(cached_subvol, loc, link_xattr, 0, NULL, NULL);</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, -ret, DHT_MSG_MIGRATE_FILE_FAILED,</div><div class='add'>+                   "Migrate file failed :"</div><div class='add'>+                   "Linkto setxattr failed %s -&gt; %s",</div><div class='add'>+                   cached_subvol-&gt;name, loc-&gt;name);</div><div class='add'>+            *fop_errno = -ret;</div><div class='add'>+            ret = -1;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        gf_msg_debug(this-&gt;name, 0,</div><div class='add'>+                     "hardlink target subvol created on %s "</div><div class='add'>+                     ",cached %s, file %s",</div><div class='add'>+                     hashed_subvol-&gt;name, cached_subvol-&gt;name, loc-&gt;path);</div><div class='add'>+</div><div class='add'>+        ret = -2;</div><div class='add'>+        goto out;</div><div class='add'>+    } else {</div><div class='add'>+        linkto_subvol = dht_linkfile_subvol(this, NULL, NULL, xattr_rsp);</div><div class='add'>+        if (!linkto_subvol) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, 0, DHT_MSG_SUBVOL_ERROR,</div><div class='add'>+                   "Failed to get "</div><div class='add'>+                   "linkto subvol for %s",</div><div class='add'>+                   loc-&gt;name);</div><div class='add'>+        } else {</div><div class='add'>+            hashed_subvol = linkto_subvol;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        ret = syncop_link(hashed_subvol, loc, loc, &amp;iatt, NULL, NULL);</div><div class='add'>+        if (ret) {</div><div class='add'>+            op_errno = -ret;</div><div class='add'>+            ret = -1;</div><div class='add'>+</div><div class='add'>+            loglevel = (op_errno == EEXIST) ? GF_LOG_DEBUG : GF_LOG_ERROR;</div><div class='add'>+            gf_msg(this-&gt;name, loglevel, op_errno,</div><div class='add'>+                   DHT_MSG_MIGRATE_HARDLINK_FILE_FAILED,</div><div class='add'>+                   "link of %s -&gt; %s"</div><div class='add'>+                   " failed on  subvol %s",</div><div class='add'>+                   loc-&gt;name, uuid_utoa(loc-&gt;gfid), hashed_subvol-&gt;name);</div><div class='add'>+            if (op_errno != EEXIST) {</div><div class='add'>+                *fop_errno = op_errno;</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+        } else {</div><div class='add'>+            gf_msg_debug(this-&gt;name, 0,</div><div class='add'>+                         "syncop_link successful for"</div><div class='add'>+                         " hardlink %s on subvol %s, cached %s",</div><div class='add'>+                         loc-&gt;path, hashed_subvol-&gt;name, cached_subvol-&gt;name);</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = syncop_lookup(hashed_subvol, loc, &amp;iatt, NULL, NULL, NULL);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_ERROR, -ret, DHT_MSG_MIGRATE_FILE_FAILED,</div><div class='add'>+               "Migrate file failed :Failed lookup %s on %s ", loc-&gt;name,</div><div class='add'>+               hashed_subvol-&gt;name);</div><div class='add'>+</div><div class='add'>+        *fop_errno = -ret;</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* There is a race where on the target subvol for the hardlink</div><div class='add'>+     * (note: hash subvol for the hardlink might differ from this), some</div><div class='add'>+     * other client(non-rebalance) would have created a linkto file for that</div><div class='add'>+     * hardlink as part of lookup. So let say there are 10 hardlinks, on the</div><div class='add'>+     * 5th hardlink it self the hardlinks might have migrated. Now for</div><div class='add'>+     * (6..10th) hardlinks the cached and target would be same as the file</div><div class='add'>+     * has already migrated. Hence this check is needed  */</div><div class='add'>+    if (cached_subvol == hashed_subvol) {</div><div class='add'>+        gf_msg_debug(this-&gt;name, 0,</div><div class='add'>+                     "source %s and destination %s "</div><div class='add'>+                     "for hardlink %s are same",</div><div class='add'>+                     cached_subvol-&gt;name, hashed_subvol-&gt;name, loc-&gt;path);</div><div class='add'>+        ret = -2;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (iatt.ia_nlink == stbuf.ia_nlink) {</div><div class='add'>+        ret = dht_migrate_file(this, loc, cached_subvol, hashed_subvol,</div><div class='add'>+                               GF_DHT_MIGRATE_HARDLINK_IN_PROGRESS, fop_errno);</div><div class='add'>+        if (ret) {</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    ret = -2;</div><div class='add'>+out:</div><div class='add'>+    if (link_xattr)</div><div class='add'>+        dict_unref(link_xattr);</div><div class='add'>+</div><div class='add'>+    if (xattr_rsp)</div><div class='add'>+        dict_unref(xattr_rsp);</div><div class='add'>+</div><div class='add'>+    if (dict)</div><div class='add'>+        dict_unref(dict);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+__check_file_has_hardlink(xlator_t *this, loc_t *loc, struct iatt *stbuf,</div><div class='add'>+                          dict_t *xattrs, int flags, gf_defrag_info_t *defrag,</div><div class='add'>+                          dht_conf_t *conf, int *fop_errno)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    if (flags == GF_DHT_MIGRATE_HARDLINK_IN_PROGRESS) {</div><div class='add'>+        ret = 0;</div><div class='add'>+        return ret;</div><div class='add'>+    }</div><div class='add'>+    if (stbuf-&gt;ia_nlink &gt; 1) {</div><div class='add'>+        /* support for decomission */</div><div class='add'>+        if (flags == GF_DHT_MIGRATE_HARDLINK) {</div><div class='add'>+            synclock_lock(&amp;conf-&gt;link_lock);</div><div class='add'>+            ret = gf_defrag_handle_hardlink(this, loc, fop_errno);</div><div class='add'>+            synclock_unlock(&amp;conf-&gt;link_lock);</div><div class='add'>+            /*</div><div class='add'>+            Returning zero will force the file to be remigrated.</div><div class='add'>+            Checkout gf_defrag_handle_hardlink for more information.</div><div class='add'>+            */</div><div class='add'>+            if (ret &amp;&amp; ret != -2) {</div><div class='add'>+                gf_msg(this-&gt;name, GF_LOG_WARNING, 0,</div><div class='add'>+                       DHT_MSG_MIGRATE_FILE_FAILED,</div><div class='add'>+                       "Migrate file failed:"</div><div class='add'>+                       "%s: failed to migrate file with link",</div><div class='add'>+                       loc-&gt;path);</div><div class='add'>+            }</div><div class='add'>+        } else {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_WARNING, 0, DHT_MSG_MIGRATE_FILE_FAILED,</div><div class='add'>+                   "Migration skipped for:"</div><div class='add'>+                   "%s: file has hardlinks",</div><div class='add'>+                   loc-&gt;path);</div><div class='add'>+            *fop_errno = ENOTSUP;</div><div class='add'>+            ret = 1;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+     return values</div><div class='add'>+     0 : File will be migrated</div><div class='add'>+    -2 : File will not be migrated</div><div class='add'>+         (This is the return value from gf_defrag_handle_hardlink. Checkout</div><div class='add'>+         gf_defrag_handle_hardlink for description of "returning -2")</div><div class='add'>+    -1 : failure</div><div class='add'>+*/</div><div class='add'>+static int</div><div class='add'>+__is_file_migratable(xlator_t *this, loc_t *loc, struct iatt *stbuf,</div><div class='add'>+                     dict_t *xattrs, int flags, gf_defrag_info_t *defrag,</div><div class='add'>+                     dht_conf_t *conf, int *fop_errno)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int lock_count = 0;</div><div class='add'>+</div><div class='add'>+    if (IA_ISDIR(stbuf-&gt;ia_type)) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_WARNING, 0, DHT_MSG_MIGRATE_FILE_FAILED,</div><div class='add'>+               "Migrate file failed:"</div><div class='add'>+               "%s: migrate-file called on directory",</div><div class='add'>+               loc-&gt;path);</div><div class='add'>+        *fop_errno = EISDIR;</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (!conf-&gt;lock_migration_enabled) {</div><div class='add'>+        ret = dict_get_int32(xattrs, GLUSTERFS_POSIXLK_COUNT, &amp;lock_count);</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_WARNING, 0, DHT_MSG_MIGRATE_FILE_FAILED,</div><div class='add'>+                   "Migrate file failed:"</div><div class='add'>+                   "%s: Unable to get lock count for file",</div><div class='add'>+                   loc-&gt;path);</div><div class='add'>+            *fop_errno = EINVAL;</div><div class='add'>+            ret = -1;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        if (lock_count) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_WARNING, 0, DHT_MSG_MIGRATE_FILE_FAILED,</div><div class='add'>+                   "Migrate file failed: %s: File has locks."</div><div class='add'>+                   " Skipping file migration",</div><div class='add'>+                   loc-&gt;path);</div><div class='add'>+            *fop_errno = ENOTSUP;</div><div class='add'>+            ret = 1;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Check if file has hardlink*/</div><div class='add'>+    ret = __check_file_has_hardlink(this, loc, stbuf, xattrs, flags, defrag,</div><div class='add'>+                                    conf, fop_errno);</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+__dht_rebalance_create_dst_file(xlator_t *this, xlator_t *to, xlator_t *from,</div><div class='add'>+                                loc_t *loc, struct iatt *stbuf, fd_t **dst_fd,</div><div class='add'>+                                int *fop_errno, int file_has_holes)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int ret2 = -1;</div><div class='add'>+    fd_t *fd = NULL;</div><div class='add'>+    struct iatt new_stbuf = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    struct iatt check_stbuf = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    dht_conf_t *conf = NULL;</div><div class='add'>+    dict_t *dict = NULL;</div><div class='add'>+    dict_t *xdata = NULL;</div><div class='add'>+</div><div class='add'>+    conf = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    dict = dict_new();</div><div class='add'>+    if (!dict) {</div><div class='add'>+        *fop_errno = ENOMEM;</div><div class='add'>+        ret = -1;</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_ERROR, ENOMEM, DHT_MSG_NO_MEMORY,</div><div class='add'>+               "dictionary allocation failed for"</div><div class='add'>+               "path:%s",</div><div class='add'>+               loc-&gt;path);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    ret = dict_set_gfuuid(dict, "gfid-req", stbuf-&gt;ia_gfid, true);</div><div class='add'>+    if (ret) {</div><div class='add'>+        *fop_errno = ENOMEM;</div><div class='add'>+        ret = -1;</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_ERROR, 0, DHT_MSG_DICT_SET_FAILED,</div><div class='add'>+               "%s: failed to set dictionary value: key = gfid-req", loc-&gt;path);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_set_str(dict, conf-&gt;link_xattr_name, from-&gt;name);</div><div class='add'>+    if (ret) {</div><div class='add'>+        *fop_errno = ENOMEM;</div><div class='add'>+        ret = -1;</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_ERROR, 0, DHT_MSG_DICT_SET_FAILED,</div><div class='add'>+               "%s: failed to set dictionary value: key = %s ", loc-&gt;path,</div><div class='add'>+               conf-&gt;link_xattr_name);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    fd = fd_create(loc-&gt;inode, DHT_REBALANCE_PID);</div><div class='add'>+    if (!fd) {</div><div class='add'>+        *fop_errno = ENOMEM;</div><div class='add'>+        ret = -1;</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_ERROR, ENOMEM, DHT_MSG_MIGRATE_FILE_FAILED,</div><div class='add'>+               "%s: fd create failed (destination)", loc-&gt;path);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    xdata = dict_new();</div><div class='add'>+    if (!xdata) {</div><div class='add'>+        *fop_errno = ENOMEM;</div><div class='add'>+        ret = -1;</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_ERROR, ENOMEM, DHT_MSG_MIGRATE_FILE_FAILED,</div><div class='add'>+               "%s: dict_new failed)", loc-&gt;path);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_set_int32_sizen(xdata, GF_CLEAN_WRITE_PROTECTION, 1);</div><div class='add'>+    if (ret) {</div><div class='add'>+        *fop_errno = ENOMEM;</div><div class='add'>+        ret = -1;</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_ERROR, 0, DHT_MSG_DICT_SET_FAILED,</div><div class='add'>+               "%s: failed to set dictionary value: key = %s ", loc-&gt;path,</div><div class='add'>+               GF_CLEAN_WRITE_PROTECTION);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = syncop_lookup(to, loc, &amp;new_stbuf, NULL, xdata, NULL);</div><div class='add'>+    if (!ret) {</div><div class='add'>+        /* File exits in the destination, check if gfid matches */</div><div class='add'>+        if (gf_uuid_compare(stbuf-&gt;ia_gfid, new_stbuf.ia_gfid) != 0) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, 0, DHT_MSG_GFID_MISMATCH,</div><div class='add'>+                   "file %s exists in %s with different gfid", loc-&gt;path,</div><div class='add'>+                   to-&gt;name);</div><div class='add'>+            *fop_errno = EINVAL;</div><div class='add'>+            ret = -1;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    if ((ret &lt; 0) &amp;&amp; (-ret != ENOENT)) {</div><div class='add'>+        /* File exists in destination, but not accessible */</div><div class='add'>+        gf_msg(THIS-&gt;name, GF_LOG_WARNING, -ret, DHT_MSG_MIGRATE_FILE_FAILED,</div><div class='add'>+               "%s: failed to lookup file", loc-&gt;path);</div><div class='add'>+        *fop_errno = -ret;</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Create the destination with LINKFILE mode, and linkto xattr,</div><div class='add'>+       if the linkfile already exists, just open the file */</div><div class='add'>+    if (!ret) {</div><div class='add'>+        /*</div><div class='add'>+         * File already present, just open the file.</div><div class='add'>+         */</div><div class='add'>+        ret = syncop_open(to, loc, O_RDWR, fd, NULL, NULL);</div><div class='add'>+        if (ret &lt; 0) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, -ret, DHT_MSG_MIGRATE_FILE_FAILED,</div><div class='add'>+                   "failed to open %s on %s", loc-&gt;path, to-&gt;name);</div><div class='add'>+            *fop_errno = -ret;</div><div class='add'>+            ret = -1;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    } else {</div><div class='add'>+        ret = syncop_create(to, loc, O_RDWR, DHT_LINKFILE_MODE, fd, &amp;new_stbuf,</div><div class='add'>+                            dict, NULL);</div><div class='add'>+        if (ret &lt; 0) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, -ret, DHT_MSG_MIGRATE_FILE_FAILED,</div><div class='add'>+                   "failed to create %s on %s", loc-&gt;path, to-&gt;name);</div><div class='add'>+            *fop_errno = -ret;</div><div class='add'>+            ret = -1;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    fd_bind(fd);</div><div class='add'>+</div><div class='add'>+    /*Reason of doing lookup after create again:</div><div class='add'>+     *In the create, there is some time-gap between opening fd at the</div><div class='add'>+     *server (posix_layer) and binding it in server (incrementing fd count),</div><div class='add'>+     *so if in that time-gap, if other process sends unlink considering it</div><div class='add'>+     *as a linkto file, because inode-&gt;fd count will be 0, so file will be</div><div class='add'>+     *unlinked at the backend. And because further operations are performed</div><div class='add'>+     *on fd, so though migration will be done but will end with no file</div><div class='add'>+     *at  the backend.</div><div class='add'>+     */</div><div class='add'>+</div><div class='add'>+    ret = syncop_lookup(to, loc, &amp;check_stbuf, NULL, NULL, NULL);</div><div class='add'>+    if (!ret) {</div><div class='add'>+        if (gf_uuid_compare(stbuf-&gt;ia_gfid, check_stbuf.ia_gfid) != 0) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, 0, DHT_MSG_GFID_MISMATCH,</div><div class='add'>+                   "file %s exists in %s with different gfid,"</div><div class='add'>+                   "found in lookup after create",</div><div class='add'>+                   loc-&gt;path, to-&gt;name);</div><div class='add'>+            *fop_errno = EINVAL;</div><div class='add'>+            ret = -1;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (-ret == ENOENT) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_ERROR, -ret, DHT_MSG_MIGRATE_FILE_FAILED,</div><div class='add'>+               "%s: file does not exist"</div><div class='add'>+               "on %s",</div><div class='add'>+               loc-&gt;path, to-&gt;name);</div><div class='add'>+        *fop_errno = -ret;</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = syncop_fsetattr(to, fd, stbuf, (GF_SET_ATTR_UID | GF_SET_ATTR_GID),</div><div class='add'>+                          NULL, NULL, NULL, NULL);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        *fop_errno = -ret;</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_ERROR, -ret, DHT_MSG_MIGRATE_FILE_FAILED,</div><div class='add'>+               "chown failed for %s on %s", loc-&gt;path, to-&gt;name);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* No need to bother about 0 byte size files */</div><div class='add'>+    if (stbuf-&gt;ia_size &gt; 0) {</div><div class='add'>+        if (conf-&gt;use_fallocate &amp;&amp; !file_has_holes) {</div><div class='add'>+            ret = syncop_fallocate(to, fd, 0, 0, stbuf-&gt;ia_size, NULL, NULL);</div><div class='add'>+            if (ret &lt; 0) {</div><div class='add'>+                if (ret == -EOPNOTSUPP || ret == -EINVAL || ret == -ENOSYS) {</div><div class='add'>+                    conf-&gt;use_fallocate = _gf_false;</div><div class='add'>+                } else {</div><div class='add'>+                    gf_msg(this-&gt;name, GF_LOG_ERROR, -ret,</div><div class='add'>+                           DHT_MSG_MIGRATE_FILE_FAILED,</div><div class='add'>+                           "fallocate failed for %s on %s", loc-&gt;path,</div><div class='add'>+                           to-&gt;name);</div><div class='add'>+</div><div class='add'>+                    *fop_errno = -ret;</div><div class='add'>+</div><div class='add'>+                    /* fallocate does not release the space</div><div class='add'>+                     * in some cases</div><div class='add'>+                     */</div><div class='add'>+                    ret2 = syncop_ftruncate(to, fd, 0, NULL, NULL, NULL, NULL);</div><div class='add'>+                    if (ret2 &lt; 0) {</div><div class='add'>+                        gf_msg(this-&gt;name, GF_LOG_WARNING, -ret2,</div><div class='add'>+                               DHT_MSG_MIGRATE_FILE_FAILED,</div><div class='add'>+                               "ftruncate failed for "</div><div class='add'>+                               "%s on %s",</div><div class='add'>+                               loc-&gt;path, to-&gt;name);</div><div class='add'>+                    }</div><div class='add'>+                    goto out;</div><div class='add'>+                }</div><div class='add'>+            }</div><div class='add'>+        } else {</div><div class='add'>+            ret = syncop_ftruncate(to, fd, stbuf-&gt;ia_size, NULL, NULL, NULL,</div><div class='add'>+                                   NULL);</div><div class='add'>+            if (ret &lt; 0) {</div><div class='add'>+                *fop_errno = -ret;</div><div class='add'>+                gf_msg(this-&gt;name, GF_LOG_WARNING, -ret,</div><div class='add'>+                       DHT_MSG_MIGRATE_FILE_FAILED,</div><div class='add'>+                       "ftruncate failed for %s on %s", loc-&gt;path, to-&gt;name);</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* success */</div><div class='add'>+    ret = 0;</div><div class='add'>+</div><div class='add'>+    if (dst_fd)</div><div class='add'>+        *dst_fd = fd;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (ret) {</div><div class='add'>+        if (fd) {</div><div class='add'>+            fd_unref(fd);</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    if (dict)</div><div class='add'>+        dict_unref(dict);</div><div class='add'>+</div><div class='add'>+    if (xdata)</div><div class='add'>+        dict_unref(xdata);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+__dht_check_free_space(xlator_t *this, xlator_t *to, xlator_t *from, loc_t *loc,</div><div class='add'>+                       struct iatt *stbuf, int flag, dht_conf_t *conf,</div><div class='add'>+                       gf_boolean_t *target_changed, xlator_t **new_subvol,</div><div class='add'>+                       int *fop_errno)</div><div class='add'>+{</div><div class='add'>+    struct statvfs src_statfs = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    struct statvfs dst_statfs = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int ret = -1;</div><div class='add'>+    dict_t *xdata = NULL;</div><div class='add'>+    dht_layout_t *layout = NULL;</div><div class='add'>+    uint64_t src_statfs_blocks = 1;</div><div class='add'>+    uint64_t dst_statfs_blocks = 1;</div><div class='add'>+    double dst_post_availspacepercent = 0;</div><div class='add'>+    double src_post_availspacepercent = 0;</div><div class='add'>+    uint64_t file_blocks = 0;</div><div class='add'>+    uint64_t src_total_blocks = 0;</div><div class='add'>+    uint64_t dst_total_blocks = 0;</div><div class='add'>+</div><div class='add'>+    xdata = dict_new();</div><div class='add'>+    if (!xdata) {</div><div class='add'>+        *fop_errno = ENOMEM;</div><div class='add'>+        ret = -1;</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_ERROR, ENOMEM, DHT_MSG_NO_MEMORY,</div><div class='add'>+               "failed to allocate dictionary");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_set_int8(xdata, GF_INTERNAL_IGNORE_DEEM_STATFS, 1);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log(this-&gt;name, GF_LOG_ERROR,</div><div class='add'>+               "Failed to set " GF_INTERNAL_IGNORE_DEEM_STATFS " in dict");</div><div class='add'>+        ret = -1;</div><div class='add'>+        *fop_errno = ENOMEM;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = syncop_statfs(from, loc, &amp;src_statfs, xdata, NULL);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_ERROR, -ret, DHT_MSG_MIGRATE_FILE_FAILED,</div><div class='add'>+               "failed to get statfs of %s on %s", loc-&gt;path, from-&gt;name);</div><div class='add'>+        *fop_errno = -ret;</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = syncop_statfs(to, loc, &amp;dst_statfs, xdata, NULL);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_ERROR, -ret, DHT_MSG_MIGRATE_FILE_FAILED,</div><div class='add'>+               "failed to get statfs of %s on %s", loc-&gt;path, to-&gt;name);</div><div class='add'>+        *fop_errno = -ret;</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    gf_msg_debug(this-&gt;name, 0,</div><div class='add'>+                 "min_free_disk - %f , block available - %" PRId64</div><div class='add'>+                 ", block size - %lu",</div><div class='add'>+                 conf-&gt;min_free_disk, dst_statfs.f_bavail, dst_statfs.f_bsize);</div><div class='add'>+</div><div class='add'>+    dst_statfs_blocks = dst_statfs.f_bavail *</div><div class='add'>+                        (dst_statfs.f_frsize / GF_DISK_SECTOR_SIZE);</div><div class='add'>+</div><div class='add'>+    src_statfs_blocks = src_statfs.f_bavail *</div><div class='add'>+                        (src_statfs.f_frsize / GF_DISK_SECTOR_SIZE);</div><div class='add'>+</div><div class='add'>+    dst_total_blocks = dst_statfs.f_blocks *</div><div class='add'>+                       (dst_statfs.f_frsize / GF_DISK_SECTOR_SIZE);</div><div class='add'>+</div><div class='add'>+    src_total_blocks = src_statfs.f_blocks *</div><div class='add'>+                       (src_statfs.f_frsize / GF_DISK_SECTOR_SIZE);</div><div class='add'>+</div><div class='add'>+    /* if force option is given, do not check for space @ dst.</div><div class='add'>+     * Check only if space is avail for the file */</div><div class='add'>+    if (flag != GF_DHT_MIGRATE_DATA)</div><div class='add'>+        goto check_avail_space;</div><div class='add'>+</div><div class='add'>+    /* Check:</div><div class='add'>+       During rebalance `migrate-data` - Destination subvol experiences</div><div class='add'>+       a `reduction` in 'blocks' of free space, at the same time source</div><div class='add'>+       subvol gains certain 'blocks' of free space. A valid check is</div><div class='add'>+       necessary here to avoid erroneous move to destination where</div><div class='add'>+       the space could be scantily available.</div><div class='add'>+       With heterogeneous brick support, an actual space comparison could</div><div class='add'>+       prevent any files being migrated to newly added bricks if they are</div><div class='add'>+       smaller then the free space available on the existing bricks.</div><div class='add'>+     */</div><div class='add'>+    if (!conf-&gt;use_fallocate) {</div><div class='add'>+        file_blocks = stbuf-&gt;ia_size + GF_DISK_SECTOR_SIZE - 1;</div><div class='add'>+        file_blocks /= GF_DISK_SECTOR_SIZE;</div><div class='add'>+</div><div class='add'>+        if (file_blocks &gt;= dst_statfs_blocks) {</div><div class='add'>+            dst_statfs_blocks = 0;</div><div class='add'>+        } else {</div><div class='add'>+            dst_statfs_blocks -= file_blocks;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    src_post_availspacepercent = ((src_statfs_blocks + file_blocks) * 100) /</div><div class='add'>+                                 src_total_blocks;</div><div class='add'>+</div><div class='add'>+    dst_post_availspacepercent = (dst_statfs_blocks * 100) / dst_total_blocks;</div><div class='add'>+</div><div class='add'>+    if (dst_post_availspacepercent &lt; src_post_availspacepercent) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_WARNING, 0, DHT_MSG_MIGRATE_FILE_FAILED,</div><div class='add'>+               "data movement of file "</div><div class='add'>+               "{blocks:%" PRIu64</div><div class='add'>+               " name:(%s)} would result in "</div><div class='add'>+               "dst node (%s:%" PRIu64</div><div class='add'>+               ") having lower disk "</div><div class='add'>+               "space than the source node (%s:%" PRIu64</div><div class='add'>+               ")"</div><div class='add'>+               ".Skipping file.",</div><div class='add'>+               stbuf-&gt;ia_blocks, loc-&gt;path, to-&gt;name, dst_statfs_blocks,</div><div class='add'>+               from-&gt;name, src_statfs_blocks);</div><div class='add'>+</div><div class='add'>+        /* this is not a 'failure', but we don't want to</div><div class='add'>+           consider this as 'success' too :-/ */</div><div class='add'>+        *fop_errno = ENOSPC;</div><div class='add'>+        ret = 1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+check_avail_space:</div><div class='add'>+    if (conf-&gt;disk_unit == 'p' &amp;&amp; dst_statfs.f_blocks) {</div><div class='add'>+        dst_post_availspacepercent = (dst_statfs_blocks * 100) /</div><div class='add'>+                                     dst_total_blocks;</div><div class='add'>+</div><div class='add'>+        gf_msg_debug(this-&gt;name, 0,</div><div class='add'>+                     "file : %s, post_availspacepercent"</div><div class='add'>+                     " : %lf f_bavail : %" PRIu64 " min-free-disk: %lf",</div><div class='add'>+                     loc-&gt;path, dst_post_availspacepercent, dst_statfs.f_bavail,</div><div class='add'>+                     conf-&gt;min_free_disk);</div><div class='add'>+</div><div class='add'>+        if (dst_post_availspacepercent &lt; conf-&gt;min_free_disk) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_WARNING, 0, 0,</div><div class='add'>+                   "Write will cross min-free-disk for "</div><div class='add'>+                   "file - %s on subvol - %s. Looking "</div><div class='add'>+                   "for new subvol",</div><div class='add'>+                   loc-&gt;path, to-&gt;name);</div><div class='add'>+</div><div class='add'>+            goto find_new_subvol;</div><div class='add'>+        } else {</div><div class='add'>+            ret = 0;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (conf-&gt;disk_unit != 'p') {</div><div class='add'>+        if ((dst_statfs_blocks * GF_DISK_SECTOR_SIZE) &lt; conf-&gt;min_free_disk) {</div><div class='add'>+            gf_msg_debug(this-&gt;name, 0,</div><div class='add'>+                         "file : %s,  destination frsize: %lu "</div><div class='add'>+                         "f_bavail : %" PRIu64 " min-free-disk: %lf",</div><div class='add'>+                         loc-&gt;path, dst_statfs.f_frsize, dst_statfs.f_bavail,</div><div class='add'>+                         conf-&gt;min_free_disk);</div><div class='add'>+</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_WARNING, 0, 0,</div><div class='add'>+                   "write will"</div><div class='add'>+                   " cross min-free-disk for file - %s on subvol -"</div><div class='add'>+                   " %s. looking for new subvol",</div><div class='add'>+                   loc-&gt;path, to-&gt;name);</div><div class='add'>+</div><div class='add'>+            goto find_new_subvol;</div><div class='add'>+</div><div class='add'>+        } else {</div><div class='add'>+            ret = 0;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+find_new_subvol:</div><div class='add'>+    layout = dht_layout_get(this, loc-&gt;parent);</div><div class='add'>+    if (!layout) {</div><div class='add'>+        gf_log(this-&gt;name, GF_LOG_ERROR, "Layout is NULL");</div><div class='add'>+        *fop_errno = EINVAL;</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    *new_subvol = dht_subvol_with_free_space_inodes(this, to, from, layout,</div><div class='add'>+                                                    stbuf-&gt;ia_size);</div><div class='add'>+    if ((!(*new_subvol)) || (*new_subvol == from)) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_WARNING, 0, DHT_MSG_SUBVOL_INSUFF_SPACE,</div><div class='add'>+               "Could not find any subvol"</div><div class='add'>+               " with space accommodating the file - %s. Consider "</div><div class='add'>+               "adding bricks",</div><div class='add'>+               loc-&gt;path);</div><div class='add'>+</div><div class='add'>+        *target_changed = _gf_false;</div><div class='add'>+        *fop_errno = ENOSPC;</div><div class='add'>+        ret = -1;</div><div class='add'>+    } else {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_INFO, 0, 0,</div><div class='add'>+               "new target found - %s"</div><div class='add'>+               " for file - %s",</div><div class='add'>+               (*new_subvol)-&gt;name, loc-&gt;path);</div><div class='add'>+        *target_changed = _gf_true;</div><div class='add'>+        ret = 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (xdata)</div><div class='add'>+        dict_unref(xdata);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+__dht_rebalance_migrate_data(xlator_t *this, gf_defrag_info_t *defrag,</div><div class='add'>+                             xlator_t *from, xlator_t *to, fd_t *src, fd_t *dst,</div><div class='add'>+                             uint64_t ia_size, int hole_exists, int *fop_errno)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+    int count = 0;</div><div class='add'>+    off_t offset = 0;</div><div class='add'>+    off_t data_offset = 0;</div><div class='add'>+    off_t hole_offset = 0;</div><div class='add'>+    struct iovec *vector = NULL;</div><div class='add'>+    struct iobref *iobref = NULL;</div><div class='add'>+    uint64_t total = 0;</div><div class='add'>+    size_t read_size = 0;</div><div class='add'>+    size_t data_block_size = 0;</div><div class='add'>+    dict_t *xdata = NULL;</div><div class='add'>+    dht_conf_t *conf = NULL;</div><div class='add'>+</div><div class='add'>+    conf = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    /* if file size is '0', no need to enter this loop */</div><div class='add'>+    while (total &lt; ia_size) {</div><div class='add'>+        /* This is a regular file - read it sequentially */</div><div class='add'>+        if (!hole_exists) {</div><div class='add'>+            read_size = (((ia_size - total) &gt; DHT_REBALANCE_BLKSIZE)</div><div class='add'>+                             ? DHT_REBALANCE_BLKSIZE</div><div class='add'>+                             : (ia_size - total));</div><div class='add'>+        } else {</div><div class='add'>+            /* This is a sparse file - read only the data segments in the file</div><div class='add'>+             */</div><div class='add'>+</div><div class='add'>+            /* If the previous data block is fully copied, find the next data</div><div class='add'>+             * segment</div><div class='add'>+             * starting at the offset of the last read and written byte,  */</div><div class='add'>+            if (data_block_size &lt;= 0) {</div><div class='add'>+                ret = syncop_seek(from, src, offset, GF_SEEK_DATA, NULL,</div><div class='add'>+                                  &amp;data_offset);</div><div class='add'>+                if (ret) {</div><div class='add'>+                    if (ret == -ENXIO)</div><div class='add'>+                        ret = 0; /* No more data segments */</div><div class='add'>+                    else</div><div class='add'>+                        *fop_errno = -ret; /* Error occurred */</div><div class='add'>+</div><div class='add'>+                    break;</div><div class='add'>+                }</div><div class='add'>+</div><div class='add'>+                /* If the position of the current data segment is greater than</div><div class='add'>+                 * the position of the next hole, find the next hole in order to</div><div class='add'>+                 * calculate the length of the new data segment */</div><div class='add'>+                if (data_offset &gt; hole_offset) {</div><div class='add'>+                    /* Starting at the offset of the last data segment, find the</div><div class='add'>+                     * next hole */</div><div class='add'>+                    ret = syncop_seek(from, src, data_offset, GF_SEEK_HOLE,</div><div class='add'>+                                      NULL, &amp;hole_offset);</div><div class='add'>+                    if (ret) {</div><div class='add'>+                        /* If an error occurred here it's a real error because</div><div class='add'>+                         * if the seek for a data segment was successful then</div><div class='add'>+                         * necessarily another hole must exist (EOF is a hole)</div><div class='add'>+                         */</div><div class='add'>+                        *fop_errno = -ret;</div><div class='add'>+                        break;</div><div class='add'>+                    }</div><div class='add'>+</div><div class='add'>+                    /* Calculate the total size of the current data block */</div><div class='add'>+                    data_block_size = hole_offset - data_offset;</div><div class='add'>+                }</div><div class='add'>+            } else {</div><div class='add'>+                /* There is still data in the current segment, move the</div><div class='add'>+                 * data_offset to the position of the last written byte */</div><div class='add'>+                data_offset = offset;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            /* Calculate how much data needs to be read and written. If the data</div><div class='add'>+             * segment's length is bigger than DHT_REBALANCE_BLKSIZE, read and</div><div class='add'>+             * write DHT_REBALANCE_BLKSIZE data length and the rest in the</div><div class='add'>+             * next iteration(s) */</div><div class='add'>+            read_size = ((data_block_size &gt; DHT_REBALANCE_BLKSIZE)</div><div class='add'>+                             ? DHT_REBALANCE_BLKSIZE</div><div class='add'>+                             : data_block_size);</div><div class='add'>+</div><div class='add'>+            /* Calculate the remaining size of the data block - maybe there's no</div><div class='add'>+             * need to seek for data in the next iteration */</div><div class='add'>+            data_block_size -= read_size;</div><div class='add'>+</div><div class='add'>+            /* Set offset to the offset of the data segment so read and write</div><div class='add'>+             * will have the correct position */</div><div class='add'>+            offset = data_offset;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        ret = syncop_readv(from, src, read_size, offset, 0, &amp;vector, &amp;count,</div><div class='add'>+                           &amp;iobref, NULL, NULL, NULL);</div><div class='add'>+</div><div class='add'>+        if (!ret || (ret &lt; 0)) {</div><div class='add'>+            if (!ret) {</div><div class='add'>+                /* File was probably truncated*/</div><div class='add'>+                ret = -1;</div><div class='add'>+                *fop_errno = ENOSPC;</div><div class='add'>+            } else {</div><div class='add'>+                *fop_errno = -ret;</div><div class='add'>+            }</div><div class='add'>+            break;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        if (!conf-&gt;force_migration) {</div><div class='add'>+            if (!xdata) {</div><div class='add'>+                xdata = dict_new();</div><div class='add'>+                if (!xdata) {</div><div class='add'>+                    gf_msg("dht", GF_LOG_ERROR, 0, DHT_MSG_MIGRATE_FILE_FAILED,</div><div class='add'>+                           "insufficient memory");</div><div class='add'>+                    ret = -1;</div><div class='add'>+                    *fop_errno = ENOMEM;</div><div class='add'>+                    break;</div><div class='add'>+                }</div><div class='add'>+</div><div class='add'>+                /* Fail this write and abort rebalance if we</div><div class='add'>+                 * detect a write from client since migration of</div><div class='add'>+                 * this file started. This is done to avoid</div><div class='add'>+                 * potential data corruption due to out of order</div><div class='add'>+                 * writes from rebalance and client to the same</div><div class='add'>+                 * region (as compared between src and dst</div><div class='add'>+                 * files). See</div><div class='add'>+                 * https://github.com/gluster/glusterfs/issues/308</div><div class='add'>+                 * for more details.</div><div class='add'>+                 */</div><div class='add'>+                ret = dict_set_int32_sizen(xdata, GF_AVOID_OVERWRITE, 1);</div><div class='add'>+                if (ret) {</div><div class='add'>+                    gf_msg("dht", GF_LOG_ERROR, 0, ENOMEM,</div><div class='add'>+                           "failed to set dict");</div><div class='add'>+                    ret = -1;</div><div class='add'>+                    *fop_errno = ENOMEM;</div><div class='add'>+                    break;</div><div class='add'>+                }</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        ret = syncop_writev(to, dst, vector, count, offset, iobref, 0, NULL,</div><div class='add'>+                            NULL, xdata, NULL);</div><div class='add'>+        if (ret &lt; 0) {</div><div class='add'>+            *fop_errno = -ret;</div><div class='add'>+            break;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        offset += ret;</div><div class='add'>+        total += ret;</div><div class='add'>+</div><div class='add'>+        GF_FREE(vector);</div><div class='add'>+        if (iobref)</div><div class='add'>+            iobref_unref(iobref);</div><div class='add'>+        iobref = NULL;</div><div class='add'>+        vector = NULL;</div><div class='add'>+    }</div><div class='add'>+    if (iobref)</div><div class='add'>+        iobref_unref(iobref);</div><div class='add'>+    GF_FREE(vector);</div><div class='add'>+</div><div class='add'>+    if (ret &gt;= 0)</div><div class='add'>+        ret = 0;</div><div class='add'>+    else</div><div class='add'>+        ret = -1;</div><div class='add'>+</div><div class='add'>+    if (xdata) {</div><div class='add'>+        dict_unref(xdata);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+__dht_rebalance_open_src_file(xlator_t *this, xlator_t *from, xlator_t *to,</div><div class='add'>+                              loc_t *loc, struct iatt *stbuf, fd_t **src_fd,</div><div class='add'>+                              gf_boolean_t *clean_src, int *fop_errno)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+    fd_t *fd = NULL;</div><div class='add'>+    dict_t *dict = NULL;</div><div class='add'>+    struct iatt iatt = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    dht_conf_t *conf = NULL;</div><div class='add'>+</div><div class='add'>+    conf = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    *clean_src = _gf_false;</div><div class='add'>+</div><div class='add'>+    fd = fd_create(loc-&gt;inode, DHT_REBALANCE_PID);</div><div class='add'>+    if (!fd) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_ERROR, 0, DHT_MSG_MIGRATE_FILE_FAILED,</div><div class='add'>+               "%s: fd create failed (source)", loc-&gt;path);</div><div class='add'>+        *fop_errno = ENOMEM;</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = syncop_open(from, loc, O_RDWR, fd, NULL, NULL);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_ERROR, -ret, DHT_MSG_MIGRATE_FILE_FAILED,</div><div class='add'>+               "failed to open file %s on %s", loc-&gt;path, from-&gt;name);</div><div class='add'>+        *fop_errno = -ret;</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    fd_bind(fd);</div><div class='add'>+</div><div class='add'>+    if (src_fd)</div><div class='add'>+        *src_fd = fd;</div><div class='add'>+</div><div class='add'>+    ret = -1;</div><div class='add'>+    dict = dict_new();</div><div class='add'>+    if (!dict) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_ERROR, 0, DHT_MSG_MIGRATE_FILE_FAILED,</div><div class='add'>+               "%s: Could not allocate memory for dict", loc-&gt;path);</div><div class='add'>+        *fop_errno = ENOMEM;</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_set_str(dict, conf-&gt;link_xattr_name, to-&gt;name);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log(this-&gt;name, GF_LOG_ERROR,</div><div class='add'>+               "failed to set xattr in dict for %s (linkto:%s)", loc-&gt;path,</div><div class='add'>+               to-&gt;name);</div><div class='add'>+        *fop_errno = ENOMEM;</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Once the migration starts, the source should have 'linkto' key set</div><div class='add'>+       to show which is the target, so other clients can work around it */</div><div class='add'>+    ret = syncop_setxattr(from, loc, dict, 0, NULL, NULL);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_ERROR, -ret, DHT_MSG_MIGRATE_FILE_FAILED,</div><div class='add'>+               "failed to set xattr on %s in %s", loc-&gt;path, from-&gt;name);</div><div class='add'>+        *fop_errno = -ret;</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Reset source mode/xattr if migration fails*/</div><div class='add'>+    *clean_src = _gf_true;</div><div class='add'>+</div><div class='add'>+    /* mode should be (+S+T) to indicate migration is in progress */</div><div class='add'>+    iatt.ia_prot = stbuf-&gt;ia_prot;</div><div class='add'>+    iatt.ia_type = stbuf-&gt;ia_type;</div><div class='add'>+    iatt.ia_prot.sticky = 1;</div><div class='add'>+    iatt.ia_prot.sgid = 1;</div><div class='add'>+</div><div class='add'>+    ret = syncop_setattr(from, loc, &amp;iatt, GF_SET_ATTR_MODE, NULL, NULL, NULL,</div><div class='add'>+                         NULL);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_ERROR, -ret, DHT_MSG_MIGRATE_FILE_FAILED,</div><div class='add'>+               "failed to set mode on %s in %s", loc-&gt;path, from-&gt;name);</div><div class='add'>+        *fop_errno = -ret;</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* success */</div><div class='add'>+    ret = 0;</div><div class='add'>+out:</div><div class='add'>+    if (dict)</div><div class='add'>+        dict_unref(dict);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+migrate_special_files(xlator_t *this, xlator_t *from, xlator_t *to, loc_t *loc,</div><div class='add'>+                      struct iatt *buf, int *fop_errno)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    dict_t *rsp_dict = NULL;</div><div class='add'>+    dict_t *dict = NULL;</div><div class='add'>+    char *link = NULL;</div><div class='add'>+    struct iatt stbuf = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    dht_conf_t *conf = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    dict = dict_new();</div><div class='add'>+    if (!dict) {</div><div class='add'>+        *fop_errno = ENOMEM;</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    ret = dict_set_int32(dict, conf-&gt;link_xattr_name, 256);</div><div class='add'>+    if (ret) {</div><div class='add'>+        *fop_errno = ENOMEM;</div><div class='add'>+        ret = -1;</div><div class='add'>+        gf_log(this-&gt;name, GF_LOG_ERROR,</div><div class='add'>+               "%s: failed to set 'linkto' key in dict", loc-&gt;path);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* check in the destination if the file is link file */</div><div class='add'>+    ret = syncop_lookup(to, loc, &amp;stbuf, NULL, dict, &amp;rsp_dict);</div><div class='add'>+    if ((ret &lt; 0) &amp;&amp; (-ret != ENOENT)) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_WARNING, -ret, DHT_MSG_MIGRATE_FILE_FAILED,</div><div class='add'>+               "%s: lookup failed", loc-&gt;path);</div><div class='add'>+        *fop_errno = -ret;</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* we no more require this key */</div><div class='add'>+    dict_del(dict, conf-&gt;link_xattr_name);</div><div class='add'>+</div><div class='add'>+    /* file exists in target node, only if it is 'linkfile' its valid,</div><div class='add'>+       otherwise, error out */</div><div class='add'>+    if (!ret) {</div><div class='add'>+        if (!check_is_linkfile(loc-&gt;inode, &amp;stbuf, rsp_dict,</div><div class='add'>+                               conf-&gt;link_xattr_name)) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_WARNING, 0, DHT_MSG_MIGRATE_FILE_FAILED,</div><div class='add'>+                   "%s: file exists in destination", loc-&gt;path);</div><div class='add'>+            *fop_errno = EINVAL;</div><div class='add'>+            ret = -1;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        /* as file is linkfile, delete it */</div><div class='add'>+        ret = syncop_unlink(to, loc, NULL, NULL);</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_WARNING, -ret,</div><div class='add'>+                   DHT_MSG_MIGRATE_FILE_FAILED,</div><div class='add'>+                   "%s: failed to delete the linkfile", loc-&gt;path);</div><div class='add'>+            *fop_errno = -ret;</div><div class='add'>+            ret = -1;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Set the gfid of the source file in dict */</div><div class='add'>+    ret = dict_set_gfuuid(dict, "gfid-req", buf-&gt;ia_gfid, true);</div><div class='add'>+    if (ret) {</div><div class='add'>+        *fop_errno = ENOMEM;</div><div class='add'>+        ret = -1;</div><div class='add'>+        gf_log(this-&gt;name, GF_LOG_ERROR,</div><div class='add'>+               "%s: failed to set gfid in dict for create", loc-&gt;path);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Create the file in target */</div><div class='add'>+    if (IA_ISLNK(buf-&gt;ia_type)) {</div><div class='add'>+        /* Handle symlinks separately */</div><div class='add'>+        ret = syncop_readlink(from, loc, &amp;link, buf-&gt;ia_size, NULL, NULL);</div><div class='add'>+        if (ret &lt; 0) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_WARNING, -ret,</div><div class='add'>+                   DHT_MSG_MIGRATE_FILE_FAILED,</div><div class='add'>+                   "%s: readlink on symlink failed", loc-&gt;path);</div><div class='add'>+            *fop_errno = -ret;</div><div class='add'>+            ret = -1;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        ret = syncop_symlink(to, loc, link, 0, dict, NULL);</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_WARNING, -ret,</div><div class='add'>+                   DHT_MSG_MIGRATE_FILE_FAILED, "%s: creating symlink failed",</div><div class='add'>+                   loc-&gt;path);</div><div class='add'>+            *fop_errno = -ret;</div><div class='add'>+            ret = -1;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        goto done;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = syncop_mknod(to, loc, st_mode_from_ia(buf-&gt;ia_prot, buf-&gt;ia_type),</div><div class='add'>+                       makedev(ia_major(buf-&gt;ia_rdev), ia_minor(buf-&gt;ia_rdev)),</div><div class='add'>+                       0, dict, NULL);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_WARNING, -ret, DHT_MSG_MIGRATE_FILE_FAILED,</div><div class='add'>+               "%s: mknod failed", loc-&gt;path);</div><div class='add'>+        *fop_errno = -ret;</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+done:</div><div class='add'>+    ret = syncop_setattr(to, loc, buf,</div><div class='add'>+                         (GF_SET_ATTR_MTIME | GF_SET_ATTR_UID |</div><div class='add'>+                          GF_SET_ATTR_GID | GF_SET_ATTR_MODE),</div><div class='add'>+                         NULL, NULL, NULL, NULL);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_WARNING, -ret, DHT_MSG_MIGRATE_FILE_FAILED,</div><div class='add'>+               "%s: failed to perform setattr on %s", loc-&gt;path, to-&gt;name);</div><div class='add'>+        *fop_errno = -ret;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = syncop_unlink(from, loc, NULL, NULL);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_WARNING, -ret, DHT_MSG_MIGRATE_FILE_FAILED,</div><div class='add'>+               "%s: unlink failed", loc-&gt;path);</div><div class='add'>+        *fop_errno = -ret;</div><div class='add'>+        ret = -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    GF_FREE(link);</div><div class='add'>+    if (dict)</div><div class='add'>+        dict_unref(dict);</div><div class='add'>+</div><div class='add'>+    if (rsp_dict)</div><div class='add'>+        dict_unref(rsp_dict);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+__dht_migration_cleanup_src_file(xlator_t *this, loc_t *loc, fd_t *fd,</div><div class='add'>+                                 xlator_t *from, ia_prot_t *src_ia_prot)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    dht_conf_t *conf = NULL;</div><div class='add'>+    struct iatt new_stbuf = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    if (!this || !fd || !from || !src_ia_prot) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    conf = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    /*Revert source mode and xattr changes*/</div><div class='add'>+    ret = syncop_fstat(from, fd, &amp;new_stbuf, NULL, NULL);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        /* Failed to get the stat info */</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_ERROR, -ret, DHT_MSG_MIGRATE_FILE_FAILED,</div><div class='add'>+               "Migrate file cleanup failed: failed to fstat "</div><div class='add'>+               "file %s on %s ",</div><div class='add'>+               loc-&gt;path, from-&gt;name);</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Remove the sticky bit and sgid bit set, reset it to 0*/</div><div class='add'>+    if (!src_ia_prot-&gt;sticky)</div><div class='add'>+        new_stbuf.ia_prot.sticky = 0;</div><div class='add'>+</div><div class='add'>+    if (!src_ia_prot-&gt;sgid)</div><div class='add'>+        new_stbuf.ia_prot.sgid = 0;</div><div class='add'>+</div><div class='add'>+    ret = syncop_fsetattr(from, fd, &amp;new_stbuf,</div><div class='add'>+                          (GF_SET_ATTR_GID | GF_SET_ATTR_MODE), NULL, NULL,</div><div class='add'>+                          NULL, NULL);</div><div class='add'>+</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_WARNING, -ret, DHT_MSG_MIGRATE_FILE_FAILED,</div><div class='add'>+               "Migrate file cleanup failed:"</div><div class='add'>+               "%s: failed to perform fsetattr on %s ",</div><div class='add'>+               loc-&gt;path, from-&gt;name);</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = syncop_fremovexattr(from, fd, conf-&gt;link_xattr_name, 0, NULL);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log(this-&gt;name, GF_LOG_WARNING,</div><div class='add'>+               "%s: failed to remove linkto xattr on %s (%s)", loc-&gt;path,</div><div class='add'>+               from-&gt;name, strerror(-ret));</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+  return values:</div><div class='add'>+</div><div class='add'>+   -1 : failure</div><div class='add'>+    0 : successfully migrated data</div><div class='add'>+    1 : not a failure, but we can't migrate data as of now</div><div class='add'>+*/</div><div class='add'>+int</div><div class='add'>+dht_migrate_file(xlator_t *this, loc_t *loc, xlator_t *from, xlator_t *to,</div><div class='add'>+                 int flag, int *fop_errno)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    struct iatt new_stbuf = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    struct iatt stbuf = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    struct iatt empty_iatt = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    ia_prot_t src_ia_prot = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    fd_t *src_fd = NULL;</div><div class='add'>+    fd_t *dst_fd = NULL;</div><div class='add'>+    dict_t *dict = NULL;</div><div class='add'>+    dict_t *xattr = NULL;</div><div class='add'>+    dict_t *xattr_rsp = NULL;</div><div class='add'>+    int file_has_holes = 0;</div><div class='add'>+    dht_conf_t *conf = this-&gt;private;</div><div class='add'>+    int rcvd_enoent_from_src = 0;</div><div class='add'>+    struct gf_flock flock = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    struct gf_flock plock = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    loc_t tmp_loc = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    loc_t parent_loc = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    gf_boolean_t inodelk_locked = _gf_false;</div><div class='add'>+    gf_boolean_t entrylk_locked = _gf_false;</div><div class='add'>+    gf_boolean_t p_locked = _gf_false;</div><div class='add'>+    int lk_ret = -1;</div><div class='add'>+    gf_defrag_info_t *defrag = NULL;</div><div class='add'>+    gf_boolean_t clean_src = _gf_false;</div><div class='add'>+    gf_boolean_t clean_dst = _gf_false;</div><div class='add'>+    int log_level = GF_LOG_INFO;</div><div class='add'>+    gf_boolean_t delete_src_linkto = _gf_true;</div><div class='add'>+    lock_migration_info_t locklist;</div><div class='add'>+    dict_t *meta_dict = NULL;</div><div class='add'>+    gf_boolean_t meta_locked = _gf_false;</div><div class='add'>+    gf_boolean_t target_changed = _gf_false;</div><div class='add'>+    xlator_t *new_target = NULL;</div><div class='add'>+    xlator_t *old_target = NULL;</div><div class='add'>+    xlator_t *hashed_subvol = NULL;</div><div class='add'>+    fd_t *linkto_fd = NULL;</div><div class='add'>+    dict_t *xdata = NULL;</div><div class='add'>+</div><div class='add'>+    if (from == to) {</div><div class='add'>+        gf_msg_debug(this-&gt;name, 0,</div><div class='add'>+                     "destination and source are same. file %s"</div><div class='add'>+                     " might have migrated already",</div><div class='add'>+                     loc-&gt;path);</div><div class='add'>+        ret = 0;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    gf_log(this-&gt;name, log_level, "%s: attempting to move from %s to %s",</div><div class='add'>+           loc-&gt;path, from-&gt;name, to-&gt;name);</div><div class='add'>+</div><div class='add'>+    dict = dict_new();</div><div class='add'>+    if (!dict) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        *fop_errno = ENOMEM;</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_ERROR, ENOMEM, DHT_MSG_NO_MEMORY,</div><div class='add'>+               "Could not allocate memory for dict");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    ret = dict_set_int32(dict, conf-&gt;link_xattr_name, 256);</div><div class='add'>+    if (ret) {</div><div class='add'>+        *fop_errno = ENOMEM;</div><div class='add'>+        ret = -1;</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_ERROR, 0, DHT_MSG_MIGRATE_FILE_FAILED,</div><div class='add'>+               "Migrate file failed:"</div><div class='add'>+               "%s: failed to set 'linkto' key in dict",</div><div class='add'>+               loc-&gt;path);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Do not migrate file in case lock migration is not enabled on the</div><div class='add'>+     * volume*/</div><div class='add'>+    if (!conf-&gt;lock_migration_enabled) {</div><div class='add'>+        ret = dict_set_int32(dict, GLUSTERFS_POSIXLK_COUNT, sizeof(int32_t));</div><div class='add'>+        if (ret) {</div><div class='add'>+            *fop_errno = ENOMEM;</div><div class='add'>+            ret = -1;</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, 0, DHT_MSG_MIGRATE_FILE_FAILED,</div><div class='add'>+                   "Migrate file failed: %s: failed to "</div><div class='add'>+                   "set " GLUSTERFS_POSIXLK_COUNT " key in dict",</div><div class='add'>+                   loc-&gt;path);</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    } else {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_INFO, 0, 0,</div><div class='add'>+               "locks will be migrated"</div><div class='add'>+               " for file: %s",</div><div class='add'>+               loc-&gt;path);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* The file is locked to prevent a rename during a migration. Renames</div><div class='add'>+     * and migrations on the file at the same time can lead to data loss.</div><div class='add'>+     */</div><div class='add'>+</div><div class='add'>+    ret = dht_build_parent_loc(this, &amp;parent_loc, loc, fop_errno);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_WARNING, *fop_errno,</div><div class='add'>+               DHT_MSG_MIGRATE_FILE_FAILED,</div><div class='add'>+               "%s: failed to build parent loc, which is needed to "</div><div class='add'>+               "acquire entrylk to synchronize with renames on this "</div><div class='add'>+               "path. Skipping migration",</div><div class='add'>+               loc-&gt;path);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    hashed_subvol = dht_subvol_get_hashed(this, loc);</div><div class='add'>+    if (hashed_subvol == NULL) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_WARNING, EINVAL, DHT_MSG_MIGRATE_FILE_FAILED,</div><div class='add'>+               "%s: cannot find hashed subvol which is needed to "</div><div class='add'>+               "synchronize with renames on this path. "</div><div class='add'>+               "Skipping migration",</div><div class='add'>+               loc-&gt;path);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    flock.l_type = F_WRLCK;</div><div class='add'>+</div><div class='add'>+    tmp_loc.inode = inode_ref(loc-&gt;inode);</div><div class='add'>+    gf_uuid_copy(tmp_loc.gfid, loc-&gt;gfid);</div><div class='add'>+    tmp_loc.path = gf_strdup(loc-&gt;path);</div><div class='add'>+</div><div class='add'>+    /* this inodelk happens with flock.owner being zero. But to synchronize</div><div class='add'>+     * hardlink migration we need to have different lkowner for each migration</div><div class='add'>+     * Filed a bug here: https://bugzilla.redhat.com/show_bug.cgi?id=1468202 to</div><div class='add'>+     * track the fix for this. Currently synclock takes care of synchronizing</div><div class='add'>+     * hardlink migration. Once this bug is fixed we can avoid taking synclock</div><div class='add'>+     */</div><div class='add'>+    ret = syncop_inodelk(from, DHT_FILE_MIGRATE_DOMAIN, &amp;tmp_loc, F_SETLKW,</div><div class='add'>+                         &amp;flock, NULL, NULL);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        *fop_errno = -ret;</div><div class='add'>+        ret = -1;</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_WARNING, *fop_errno,</div><div class='add'>+               DHT_MSG_MIGRATE_FILE_FAILED,</div><div class='add'>+               "migrate file failed: "</div><div class='add'>+               "%s: failed to lock file on %s",</div><div class='add'>+               loc-&gt;path, from-&gt;name);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    inodelk_locked = _gf_true;</div><div class='add'>+</div><div class='add'>+    /* dht_rename has changed to use entrylk on hashed subvol for</div><div class='add'>+     * synchronization. So, rebalance too has to acquire an entrylk on</div><div class='add'>+     * hashed subvol.</div><div class='add'>+     */</div><div class='add'>+    ret = syncop_entrylk(hashed_subvol, DHT_ENTRY_SYNC_DOMAIN, &amp;parent_loc,</div><div class='add'>+                         loc-&gt;name, ENTRYLK_LOCK, ENTRYLK_WRLCK, NULL, NULL);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        *fop_errno = -ret;</div><div class='add'>+        ret = -1;</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_WARNING, *fop_errno,</div><div class='add'>+               DHT_MSG_MIGRATE_FILE_FAILED,</div><div class='add'>+               "%s: failed to acquire entrylk on subvol %s", loc-&gt;path,</div><div class='add'>+               hashed_subvol-&gt;name);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    entrylk_locked = _gf_true;</div><div class='add'>+</div><div class='add'>+    /* Phase 1 - Data migration is in progress from now on */</div><div class='add'>+    ret = syncop_lookup(from, loc, &amp;stbuf, NULL, dict, &amp;xattr_rsp);</div><div class='add'>+    if (ret) {</div><div class='add'>+        *fop_errno = -ret;</div><div class='add'>+        ret = -1;</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_ERROR, *fop_errno,</div><div class='add'>+               DHT_MSG_MIGRATE_FILE_FAILED,</div><div class='add'>+               "Migrate file failed:"</div><div class='add'>+               "%s: lookup failed on %s",</div><div class='add'>+               loc-&gt;path, from-&gt;name);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* preserve source mode, so set the same to the destination */</div><div class='add'>+    src_ia_prot = stbuf.ia_prot;</div><div class='add'>+</div><div class='add'>+    /* Check if file can be migrated */</div><div class='add'>+    ret = __is_file_migratable(this, loc, &amp;stbuf, xattr_rsp, flag, defrag, conf,</div><div class='add'>+                               fop_errno);</div><div class='add'>+    if (ret) {</div><div class='add'>+        if (ret == HARDLINK_MIG_INPROGRESS)</div><div class='add'>+            ret = 0;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Take care of the special files */</div><div class='add'>+    if (!IA_ISREG(stbuf.ia_type)) {</div><div class='add'>+        /* Special files */</div><div class='add'>+        ret = migrate_special_files(this, from, to, loc, &amp;stbuf, fop_errno);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Try to preserve 'holes' while migrating data */</div><div class='add'>+    if (stbuf.ia_size &gt; (stbuf.ia_blocks * GF_DISK_SECTOR_SIZE))</div><div class='add'>+        file_has_holes = 1;</div><div class='add'>+</div><div class='add'>+    /* create the destination, with required modes/xattr */</div><div class='add'>+    ret = __dht_rebalance_create_dst_file(this, to, from, loc, &amp;stbuf, &amp;dst_fd,</div><div class='add'>+                                          fop_errno, file_has_holes);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_ERROR, 0, 0,</div><div class='add'>+               "Create dst failed"</div><div class='add'>+               " on - %s for file - %s",</div><div class='add'>+               to-&gt;name, loc-&gt;path);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    clean_dst = _gf_true;</div><div class='add'>+</div><div class='add'>+    ret = __dht_check_free_space(this, to, from, loc, &amp;stbuf, flag, conf,</div><div class='add'>+                                 &amp;target_changed, &amp;new_target, fop_errno);</div><div class='add'>+    if (target_changed) {</div><div class='add'>+        /* Can't handle for hardlinks. Marking this as failure */</div><div class='add'>+        if (flag == GF_DHT_MIGRATE_HARDLINK_IN_PROGRESS || stbuf.ia_nlink &gt; 1) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, 0, DHT_MSG_SUBVOL_INSUFF_SPACE,</div><div class='add'>+                   "Exiting migration for"</div><div class='add'>+                   " file - %s. flag - %d, stbuf.ia_nlink - %d",</div><div class='add'>+                   loc-&gt;path, flag, stbuf.ia_nlink);</div><div class='add'>+            ret = -1;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        ret = syncop_ftruncate(to, dst_fd, 0, NULL, NULL, NULL, NULL);</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_log(this-&gt;name, GF_LOG_WARNING,</div><div class='add'>+                   "%s: failed to perform truncate on %s (%s)", loc-&gt;path,</div><div class='add'>+                   to-&gt;name, strerror(-ret));</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        syncop_close(dst_fd);</div><div class='add'>+        dst_fd = NULL;</div><div class='add'>+</div><div class='add'>+        old_target = to;</div><div class='add'>+        to = new_target;</div><div class='add'>+</div><div class='add'>+        clean_dst = _gf_false;</div><div class='add'>+</div><div class='add'>+        /* if the file migration is successful to this new target, then</div><div class='add'>+         * update the xattr on the old destination to point the new</div><div class='add'>+         * destination. We need to do update this only post migration</div><div class='add'>+         * as in case of failure the linkto needs to point to the source</div><div class='add'>+         * subvol */</div><div class='add'>+        ret = __dht_rebalance_create_dst_file(</div><div class='add'>+            this, to, from, loc, &amp;stbuf, &amp;dst_fd, fop_errno, file_has_holes);</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_log(this-&gt;name, GF_LOG_ERROR,</div><div class='add'>+                   "Create dst failed"</div><div class='add'>+                   " on - %s for file - %s",</div><div class='add'>+                   to-&gt;name, loc-&gt;path);</div><div class='add'>+            goto out;</div><div class='add'>+        } else {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_INFO, 0, 0,</div><div class='add'>+                   "destination for file "</div><div class='add'>+                   "- %s is changed to - %s",</div><div class='add'>+                   loc-&gt;path, to-&gt;name);</div><div class='add'>+            clean_dst = _gf_true;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (ret) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Open the source, and also update mode/xattr */</div><div class='add'>+    ret = __dht_rebalance_open_src_file(this, from, to, loc, &amp;stbuf, &amp;src_fd,</div><div class='add'>+                                        &amp;clean_src, fop_errno);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_ERROR, 0, DHT_MSG_MIGRATE_FILE_FAILED,</div><div class='add'>+               "Migrate file failed: failed to open %s on %s", loc-&gt;path,</div><div class='add'>+               from-&gt;name);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* TODO: move all xattr related operations to fd based operations */</div><div class='add'>+    ret = syncop_listxattr(from, loc, &amp;xattr, NULL, NULL);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        *fop_errno = -ret;</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_WARNING, *fop_errno,</div><div class='add'>+               DHT_MSG_MIGRATE_FILE_FAILED,</div><div class='add'>+               "Migrate file failed:"</div><div class='add'>+               "%s: failed to get xattr from %s",</div><div class='add'>+               loc-&gt;path, from-&gt;name);</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Copying posix acls to the linkto file messes up the permissions*/</div><div class='add'>+    dht_strip_out_acls(xattr);</div><div class='add'>+</div><div class='add'>+    /* Remove the linkto xattr as we don't want to overwrite the value</div><div class='add'>+     * set on the dst.</div><div class='add'>+     */</div><div class='add'>+    dict_del(xattr, conf-&gt;link_xattr_name);</div><div class='add'>+</div><div class='add'>+    /* We need to error out if this fails as having the wrong shard xattrs</div><div class='add'>+     * set on the dst could cause data corruption</div><div class='add'>+     */</div><div class='add'>+    ret = syncop_fsetxattr(to, dst_fd, xattr, 0, NULL, NULL);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        *fop_errno = -ret;</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_WARNING, -ret, DHT_MSG_MIGRATE_FILE_FAILED,</div><div class='add'>+               "%s: failed to set xattr on %s", loc-&gt;path, to-&gt;name);</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (xattr_rsp) {</div><div class='add'>+        /* we no more require this key */</div><div class='add'>+        dict_del(dict, conf-&gt;link_xattr_name);</div><div class='add'>+        dict_unref(xattr_rsp);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = syncop_fstat(from, src_fd, &amp;stbuf, dict, &amp;xattr_rsp);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_ERROR, -ret, DHT_MSG_MIGRATE_FILE_FAILED,</div><div class='add'>+               "Migrate file failed:failed to lookup %s on %s ", loc-&gt;path,</div><div class='add'>+               from-&gt;name);</div><div class='add'>+        *fop_errno = -ret;</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Check again if file has hardlink */</div><div class='add'>+    ret = __check_file_has_hardlink(this, loc, &amp;stbuf, xattr_rsp, flag, defrag,</div><div class='add'>+                                    conf, fop_errno);</div><div class='add'>+    if (ret) {</div><div class='add'>+        if (ret == HARDLINK_MIG_INPROGRESS)</div><div class='add'>+            ret = 0;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = __dht_rebalance_migrate_data(this, defrag, from, to, src_fd, dst_fd,</div><div class='add'>+                                       stbuf.ia_size, file_has_holes,</div><div class='add'>+                                       fop_errno);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_ERROR, 0, DHT_MSG_MIGRATE_FILE_FAILED,</div><div class='add'>+               "Migrate file failed: %s: failed to migrate data", loc-&gt;path);</div><div class='add'>+</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* TODO: Sync the locks */</div><div class='add'>+</div><div class='add'>+    xdata = dict_new();</div><div class='add'>+    if (!xdata || dict_set_int8(xdata, "last-fsync", 1)) {</div><div class='add'>+        gf_log(this-&gt;name, GF_LOG_ERROR,</div><div class='add'>+               "%s: failed to set last-fsync flag on "</div><div class='add'>+               "%s (%s)",</div><div class='add'>+               loc-&gt;path, to-&gt;name, strerror(ENOMEM));</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = syncop_fsync(to, dst_fd, 0, NULL, NULL, xdata, NULL);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log(this-&gt;name, GF_LOG_WARNING, "%s: failed to fsync on %s (%s)",</div><div class='add'>+               loc-&gt;path, to-&gt;name, strerror(-ret));</div><div class='add'>+        *fop_errno = -ret;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Phase 2 - Data-Migration Complete, Housekeeping updates pending */</div><div class='add'>+</div><div class='add'>+    ret = syncop_fstat(from, src_fd, &amp;new_stbuf, NULL, NULL);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        /* Failed to get the stat info */</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_ERROR, -ret, DHT_MSG_MIGRATE_FILE_FAILED,</div><div class='add'>+               "Migrate file failed: failed to fstat file %s on %s ", loc-&gt;path,</div><div class='add'>+               from-&gt;name);</div><div class='add'>+        *fop_errno = -ret;</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Lock the entire source file to prevent clients from taking a</div><div class='add'>+       lock on it as dht_lk does not handle file migration.</div><div class='add'>+</div><div class='add'>+       This still leaves a small window where conflicting locks can</div><div class='add'>+       be granted to different clients. If client1 requests a blocking</div><div class='add'>+       lock on the src file, it will be granted after the migrating</div><div class='add'>+       process releases its lock. If client2 requests a lock on the dst</div><div class='add'>+       data file, it will also be granted, but all FOPs will be redirected</div><div class='add'>+       to the dst data file.</div><div class='add'>+    */</div><div class='add'>+</div><div class='add'>+    /* Take meta lock  */</div><div class='add'>+</div><div class='add'>+    if (conf-&gt;lock_migration_enabled) {</div><div class='add'>+        meta_dict = dict_new();</div><div class='add'>+        if (!meta_dict) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, 0, DHT_MSG_MIGRATE_FILE_FAILED,</div><div class='add'>+                   "dict_new failed");</div><div class='add'>+</div><div class='add'>+            *fop_errno = ENOMEM;</div><div class='add'>+            ret = -1;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        ret = dict_set_str(meta_dict, GLUSTERFS_INTERNAL_FOP_KEY, "yes");</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, 0, DHT_MSG_DICT_SET_FAILED,</div><div class='add'>+                   "Failed to set dictionary value: key = %s,"</div><div class='add'>+                   " path = %s",</div><div class='add'>+                   GLUSTERFS_INTERNAL_FOP_KEY, loc-&gt;path);</div><div class='add'>+            *fop_errno = ENOMEM;</div><div class='add'>+            ret = -1;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        ret = dict_set_int32(meta_dict, GF_META_LOCK_KEY, 1);</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, 0, DHT_MSG_MIGRATE_FILE_FAILED,</div><div class='add'>+                   "Trace dict_set failed");</div><div class='add'>+            *fop_errno = ENOMEM;</div><div class='add'>+            ret = -1;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        ret = syncop_setxattr(from, loc, meta_dict, 0, NULL, NULL);</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, -ret, DHT_MSG_MIGRATE_FILE_FAILED,</div><div class='add'>+                   "Trace syncop_setxattr metalock failed");</div><div class='add'>+</div><div class='add'>+            *fop_errno = -ret;</div><div class='add'>+            ret = -1;</div><div class='add'>+            goto out;</div><div class='add'>+        } else {</div><div class='add'>+            meta_locked = _gf_true;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (!conf-&gt;lock_migration_enabled) {</div><div class='add'>+        plock.l_type = F_WRLCK;</div><div class='add'>+        plock.l_start = 0;</div><div class='add'>+        plock.l_len = 0;</div><div class='add'>+        plock.l_whence = SEEK_SET;</div><div class='add'>+</div><div class='add'>+        ret = syncop_lk(from, src_fd, F_SETLK, &amp;plock, NULL, NULL);</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, -ret, DHT_MSG_MIGRATE_FILE_FAILED,</div><div class='add'>+                   "Migrate file failed:"</div><div class='add'>+                   "%s: Failed to lock on %s",</div><div class='add'>+                   loc-&gt;path, from-&gt;name);</div><div class='add'>+            *fop_errno = -ret;</div><div class='add'>+            ret = -1;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        p_locked = _gf_true;</div><div class='add'>+</div><div class='add'>+    } else {</div><div class='add'>+        INIT_LIST_HEAD(&amp;locklist.list);</div><div class='add'>+</div><div class='add'>+        ret = syncop_getactivelk(from, loc, &amp;locklist, NULL, NULL);</div><div class='add'>+        if (ret == 0) {</div><div class='add'>+            gf_log(this-&gt;name, GF_LOG_INFO, "No active locks on:%s", loc-&gt;path);</div><div class='add'>+</div><div class='add'>+        } else if (ret &gt; 0) {</div><div class='add'>+            ret = syncop_setactivelk(to, loc, &amp;locklist, NULL, NULL);</div><div class='add'>+            if (ret) {</div><div class='add'>+                gf_msg(this-&gt;name, GF_LOG_ERROR, -ret,</div><div class='add'>+                       DHT_MSG_LOCK_MIGRATION_FAILED, "write lock failed on:%s",</div><div class='add'>+                       loc-&gt;path);</div><div class='add'>+</div><div class='add'>+                *fop_errno = -ret;</div><div class='add'>+                ret = -1;</div><div class='add'>+                goto metaunlock;</div><div class='add'>+            }</div><div class='add'>+        } else {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, -ret,</div><div class='add'>+                   DHT_MSG_LOCK_MIGRATION_FAILED,</div><div class='add'>+                   "getactivelk failed for file: %s", loc-&gt;path);</div><div class='add'>+            *fop_errno = -ret;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* source would have both sticky bit and sgid bit set, reset it to 0,</div><div class='add'>+       and set the source permission on destination, if it was not set</div><div class='add'>+       prior to setting rebalance-modes in source  */</div><div class='add'>+    if (!src_ia_prot.sticky)</div><div class='add'>+        new_stbuf.ia_prot.sticky = 0;</div><div class='add'>+</div><div class='add'>+    if (!src_ia_prot.sgid)</div><div class='add'>+        new_stbuf.ia_prot.sgid = 0;</div><div class='add'>+</div><div class='add'>+    /* TODO: if the source actually had sticky bit, or sgid bit set,</div><div class='add'>+       we are not handling it */</div><div class='add'>+</div><div class='add'>+    ret = syncop_fsetattr(</div><div class='add'>+        to, dst_fd, &amp;new_stbuf,</div><div class='add'>+        (GF_SET_ATTR_UID | GF_SET_ATTR_GID | GF_SET_ATTR_MODE), NULL, NULL,</div><div class='add'>+        NULL, NULL);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_WARNING, -ret, DHT_MSG_MIGRATE_FILE_FAILED,</div><div class='add'>+               "Migrate file failed:"</div><div class='add'>+               "%s: failed to perform setattr on %s ",</div><div class='add'>+               loc-&gt;path, to-&gt;name);</div><div class='add'>+        *fop_errno = -ret;</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto metaunlock;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Because 'futimes' is not portable */</div><div class='add'>+    ret = syncop_setattr(to, loc, &amp;new_stbuf,</div><div class='add'>+                         (GF_SET_ATTR_MTIME | GF_SET_ATTR_ATIME), NULL, NULL,</div><div class='add'>+                         NULL, NULL);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log(this-&gt;name, GF_LOG_WARNING,</div><div class='add'>+               "%s: failed to perform setattr on %s ", loc-&gt;path, to-&gt;name);</div><div class='add'>+        *fop_errno = -ret;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (target_changed) {</div><div class='add'>+        dict_del(dict, GLUSTERFS_POSIXLK_COUNT);</div><div class='add'>+        ret = dict_set_str(dict, conf-&gt;link_xattr_name, to-&gt;name);</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_log(this-&gt;name, GF_LOG_ERROR,</div><div class='add'>+                   "failed to set xattr in dict for %s (linkto:%s)", loc-&gt;path,</div><div class='add'>+                   to-&gt;name);</div><div class='add'>+            *fop_errno = ENOMEM;</div><div class='add'>+            ret = -1;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        ret = syncop_setxattr(old_target, loc, dict, 0, NULL, NULL);</div><div class='add'>+        if (ret &amp;&amp; -ret != ESTALE &amp;&amp; -ret != ENOENT) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, -ret, DHT_MSG_MIGRATE_FILE_FAILED,</div><div class='add'>+                   "failed to set xattr on %s in %s", loc-&gt;path,</div><div class='add'>+                   old_target-&gt;name);</div><div class='add'>+            *fop_errno = -ret;</div><div class='add'>+            ret = -1;</div><div class='add'>+            goto out;</div><div class='add'>+        } else if (-ret == ESTALE || -ret == ENOENT) {</div><div class='add'>+            /* The failure ESTALE indicates that the linkto</div><div class='add'>+             * file on the hashed subvol might have been deleted.</div><div class='add'>+             * In this case will create a linkto file with new target</div><div class='add'>+             * as linkto xattr value*/</div><div class='add'>+            linkto_fd = fd_create(loc-&gt;inode, DHT_REBALANCE_PID);</div><div class='add'>+            if (!linkto_fd) {</div><div class='add'>+                gf_msg(this-&gt;name, GF_LOG_ERROR, errno,</div><div class='add'>+                       DHT_MSG_MIGRATE_FILE_FAILED, "%s: fd create failed",</div><div class='add'>+                       loc-&gt;path);</div><div class='add'>+                *fop_errno = ENOMEM;</div><div class='add'>+                ret = -1;</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+            ret = syncop_create(old_target, loc, O_RDWR, DHT_LINKFILE_MODE,</div><div class='add'>+                                linkto_fd, NULL, dict, NULL);</div><div class='add'>+            if (ret != 0 &amp;&amp; -ret != EEXIST &amp;&amp; -ret != ESTALE) {</div><div class='add'>+                *fop_errno = -ret;</div><div class='add'>+                ret = -1;</div><div class='add'>+                gf_msg(this-&gt;name, GF_LOG_ERROR, -ret,</div><div class='add'>+                       DHT_MSG_MIGRATE_FILE_FAILED,</div><div class='add'>+                       "failed to create linkto file on %s in %s", loc-&gt;path,</div><div class='add'>+                       old_target-&gt;name);</div><div class='add'>+                goto out;</div><div class='add'>+            } else if (ret == 0) {</div><div class='add'>+                ret = syncop_fsetattr(old_target, linkto_fd, &amp;stbuf,</div><div class='add'>+                                      (GF_SET_ATTR_UID | GF_SET_ATTR_GID), NULL,</div><div class='add'>+                                      NULL, NULL, NULL);</div><div class='add'>+                if (ret &lt; 0) {</div><div class='add'>+                    *fop_errno = -ret;</div><div class='add'>+                    gf_msg(this-&gt;name, GF_LOG_ERROR, -ret,</div><div class='add'>+                           DHT_MSG_MIGRATE_FILE_FAILED,</div><div class='add'>+                           "chown failed for %s on %s", loc-&gt;path,</div><div class='add'>+                           old_target-&gt;name);</div><div class='add'>+                }</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    clean_dst = _gf_false;</div><div class='add'>+</div><div class='add'>+    /* Posix acls are not set on DHT linkto files as part of the initial</div><div class='add'>+     * initial xattrs set on the dst file, so these need</div><div class='add'>+     * to be set on the dst file after the linkto attrs are removed.</div><div class='add'>+     * TODO: Optimize this.</div><div class='add'>+     */</div><div class='add'>+    if (xattr) {</div><div class='add'>+        dict_unref(xattr);</div><div class='add'>+        xattr = NULL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Set only the Posix ACLs this time */</div><div class='add'>+    ret = syncop_getxattr(from, loc, &amp;xattr, POSIX_ACL_ACCESS_XATTR, NULL,</div><div class='add'>+                          NULL);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        if ((-ret != ENODATA) &amp;&amp; (-ret != ENOATTR)) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_WARNING, -ret,</div><div class='add'>+                   DHT_MSG_MIGRATE_FILE_FAILED,</div><div class='add'>+                   "Migrate file failed:"</div><div class='add'>+                   "%s: failed to get xattr from %s",</div><div class='add'>+                   loc-&gt;path, from-&gt;name);</div><div class='add'>+            *fop_errno = -ret;</div><div class='add'>+        }</div><div class='add'>+    } else {</div><div class='add'>+        ret = syncop_setxattr(to, loc, xattr, 0, NULL, NULL);</div><div class='add'>+        if (ret &lt; 0) {</div><div class='add'>+            /* Potential problem here where Posix ACLs will</div><div class='add'>+             * not be set on the target file */</div><div class='add'>+</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_WARNING, -ret,</div><div class='add'>+                   DHT_MSG_MIGRATE_FILE_FAILED,</div><div class='add'>+                   "Migrate file failed:"</div><div class='add'>+                   "%s: failed to set xattr on %s",</div><div class='add'>+                   loc-&gt;path, to-&gt;name);</div><div class='add'>+            *fop_errno = -ret;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* The src file is being unlinked after this so we don't need</div><div class='add'>+       to clean it up */</div><div class='add'>+    clean_src = _gf_false;</div><div class='add'>+</div><div class='add'>+    /* Make the source as a linkfile first before deleting it */</div><div class='add'>+    empty_iatt.ia_prot.sticky = 1;</div><div class='add'>+    ret = syncop_fsetattr(from, src_fd, &amp;empty_iatt, GF_SET_ATTR_MODE, NULL,</div><div class='add'>+                          NULL, NULL, NULL);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_WARNING, -ret, DHT_MSG_MIGRATE_FILE_FAILED,</div><div class='add'>+               "Migrate file failed:"</div><div class='add'>+               "%s: failed to perform setattr on %s ",</div><div class='add'>+               loc-&gt;path, from-&gt;name);</div><div class='add'>+        *fop_errno = -ret;</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto metaunlock;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Free up the data blocks on the source node, as the whole</div><div class='add'>+        file is migrated */</div><div class='add'>+    ret = syncop_ftruncate(from, src_fd, 0, NULL, NULL, NULL, NULL);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log(this-&gt;name, GF_LOG_WARNING,</div><div class='add'>+               "%s: failed to perform truncate on %s (%s)", loc-&gt;path,</div><div class='add'>+               from-&gt;name, strerror(-ret));</div><div class='add'>+        *fop_errno = -ret;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* remove the 'linkto' xattr from the destination */</div><div class='add'>+    ret = syncop_fremovexattr(to, dst_fd, conf-&gt;link_xattr_name, 0, NULL);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log(this-&gt;name, GF_LOG_WARNING,</div><div class='add'>+               "%s: failed to perform removexattr on %s (%s)", loc-&gt;path,</div><div class='add'>+               to-&gt;name, strerror(-ret));</div><div class='add'>+        *fop_errno = -ret;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Do a stat and check the gfid before unlink */</div><div class='add'>+</div><div class='add'>+    /*</div><div class='add'>+     * Cached file changes its state from non-linkto to linkto file after</div><div class='add'>+     * migrating data. If lookup from any other mount-point is performed,</div><div class='add'>+     * converted-linkto-cached file will be treated as a stale and will be</div><div class='add'>+     * unlinked. But by this time, file is already migrated. So further</div><div class='add'>+     * failure because of ENOENT should  not be treated as error</div><div class='add'>+     */</div><div class='add'>+</div><div class='add'>+    ret = syncop_stat(from, loc, &amp;empty_iatt, NULL, NULL);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_WARNING, -ret, DHT_MSG_MIGRATE_FILE_FAILED,</div><div class='add'>+               "%s: failed to do a stat on %s", loc-&gt;path, from-&gt;name);</div><div class='add'>+</div><div class='add'>+        if (-ret != ENOENT) {</div><div class='add'>+            *fop_errno = -ret;</div><div class='add'>+            ret = -1;</div><div class='add'>+            goto metaunlock;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        rcvd_enoent_from_src = 1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if ((gf_uuid_compare(empty_iatt.ia_gfid, loc-&gt;gfid) == 0) &amp;&amp;</div><div class='add'>+        (!rcvd_enoent_from_src) &amp;&amp; delete_src_linkto) {</div><div class='add'>+        /* take out the source from namespace */</div><div class='add'>+        ret = syncop_unlink(from, loc, NULL, NULL);</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_WARNING, -ret,</div><div class='add'>+                   DHT_MSG_MIGRATE_FILE_FAILED,</div><div class='add'>+                   "%s: failed to perform unlink on %s", loc-&gt;path, from-&gt;name);</div><div class='add'>+            *fop_errno = -ret;</div><div class='add'>+            ret = -1;</div><div class='add'>+            goto metaunlock;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = syncop_lookup(this, loc, NULL, NULL, NULL, NULL);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_msg_debug(this-&gt;name, -ret,</div><div class='add'>+                     "%s: failed to lookup the file on subvolumes", loc-&gt;path);</div><div class='add'>+        *fop_errno = -ret;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    gf_msg(this-&gt;name, log_level, 0, DHT_MSG_MIGRATE_FILE_COMPLETE,</div><div class='add'>+           "completed migration of %s from subvolume %s to %s", loc-&gt;path,</div><div class='add'>+           from-&gt;name, to-&gt;name);</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+</div><div class='add'>+metaunlock:</div><div class='add'>+</div><div class='add'>+    if (conf-&gt;lock_migration_enabled &amp;&amp; meta_locked) {</div><div class='add'>+        dict_del(meta_dict, GF_META_LOCK_KEY);</div><div class='add'>+</div><div class='add'>+        ret = dict_set_int32(meta_dict, GF_META_UNLOCK_KEY, 1);</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, 0, DHT_MSG_MIGRATE_FILE_FAILED,</div><div class='add'>+                   "Trace dict_set failed");</div><div class='add'>+</div><div class='add'>+            *fop_errno = ENOMEM;</div><div class='add'>+            ret = -1;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        if (clean_dst == _gf_false)</div><div class='add'>+            ret = dict_set_int32(meta_dict, "status", 1);</div><div class='add'>+        else</div><div class='add'>+            ret = dict_set_int32(meta_dict, "status", 0);</div><div class='add'>+</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, 0, DHT_MSG_MIGRATE_FILE_FAILED,</div><div class='add'>+                   "Trace dict_set failed");</div><div class='add'>+</div><div class='add'>+            *fop_errno = ENOMEM;</div><div class='add'>+            ret = -1;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        ret = syncop_setxattr(from, loc, meta_dict, 0, NULL, NULL);</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, -ret, DHT_MSG_MIGRATE_FILE_FAILED,</div><div class='add'>+                   "Trace syncop_setxattr meta unlock failed");</div><div class='add'>+</div><div class='add'>+            *fop_errno = -ret;</div><div class='add'>+            ret = -1;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (clean_src) {</div><div class='add'>+        /* Revert source mode and xattr changes*/</div><div class='add'>+        lk_ret = __dht_migration_cleanup_src_file(this, loc, src_fd, from,</div><div class='add'>+                                                  &amp;src_ia_prot);</div><div class='add'>+        if (lk_ret) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_WARNING, 0, DHT_MSG_MIGRATE_FILE_FAILED,</div><div class='add'>+                   "%s: failed to cleanup source file on %s", loc-&gt;path,</div><div class='add'>+                   from-&gt;name);</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* reset the destination back to 0 */</div><div class='add'>+    if (clean_dst) {</div><div class='add'>+        lk_ret = syncop_ftruncate(to, dst_fd, 0, NULL, NULL, NULL, NULL);</div><div class='add'>+        if (lk_ret) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, -lk_ret,</div><div class='add'>+                   DHT_MSG_MIGRATE_FILE_FAILED,</div><div class='add'>+                   "Migrate file failed: "</div><div class='add'>+                   "%s: failed to reset target size back to 0",</div><div class='add'>+                   loc-&gt;path);</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (inodelk_locked) {</div><div class='add'>+        flock.l_type = F_UNLCK;</div><div class='add'>+</div><div class='add'>+        lk_ret = syncop_inodelk(from, DHT_FILE_MIGRATE_DOMAIN, &amp;tmp_loc,</div><div class='add'>+                                F_SETLK, &amp;flock, NULL, NULL);</div><div class='add'>+        if (lk_ret &lt; 0) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_WARNING, -lk_ret,</div><div class='add'>+                   DHT_MSG_MIGRATE_FILE_FAILED,</div><div class='add'>+                   "%s: failed to unlock file on %s", loc-&gt;path, from-&gt;name);</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (entrylk_locked) {</div><div class='add'>+        lk_ret = syncop_entrylk(hashed_subvol, DHT_ENTRY_SYNC_DOMAIN,</div><div class='add'>+                                &amp;parent_loc, loc-&gt;name, ENTRYLK_UNLOCK,</div><div class='add'>+                                ENTRYLK_UNLOCK, NULL, NULL);</div><div class='add'>+        if (lk_ret &lt; 0) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_WARNING, -lk_ret,</div><div class='add'>+                   DHT_MSG_MIGRATE_FILE_FAILED,</div><div class='add'>+                   "%s: failed to unlock entrylk on %s", loc-&gt;path,</div><div class='add'>+                   hashed_subvol-&gt;name);</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (p_locked) {</div><div class='add'>+        plock.l_type = F_UNLCK;</div><div class='add'>+        lk_ret = syncop_lk(from, src_fd, F_SETLK, &amp;plock, NULL, NULL);</div><div class='add'>+</div><div class='add'>+        if (lk_ret &lt; 0) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_WARNING, -lk_ret,</div><div class='add'>+                   DHT_MSG_MIGRATE_FILE_FAILED,</div><div class='add'>+                   "%s: failed to unlock file on %s", loc-&gt;path, from-&gt;name);</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    lk_ret = syncop_removexattr(to, loc, GF_PROTECT_FROM_EXTERNAL_WRITES, NULL,</div><div class='add'>+                                NULL);</div><div class='add'>+    if (lk_ret &amp;&amp; (lk_ret != -ENODATA) &amp;&amp; (lk_ret != -ENOATTR)) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_WARNING, -lk_ret, 0,</div><div class='add'>+               "%s: removexattr failed key %s", loc-&gt;path,</div><div class='add'>+               GF_PROTECT_FROM_EXTERNAL_WRITES);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (dict)</div><div class='add'>+        dict_unref(dict);</div><div class='add'>+</div><div class='add'>+    if (xattr)</div><div class='add'>+        dict_unref(xattr);</div><div class='add'>+    if (xattr_rsp)</div><div class='add'>+        dict_unref(xattr_rsp);</div><div class='add'>+</div><div class='add'>+    if (dst_fd)</div><div class='add'>+        syncop_close(dst_fd);</div><div class='add'>+</div><div class='add'>+    if (src_fd)</div><div class='add'>+        syncop_close(src_fd);</div><div class='add'>+    if (linkto_fd)</div><div class='add'>+        syncop_close(linkto_fd);</div><div class='add'>+</div><div class='add'>+    if (xdata)</div><div class='add'>+        dict_unref(xdata);</div><div class='add'>+</div><div class='add'>+    loc_wipe(&amp;tmp_loc);</div><div class='add'>+    loc_wipe(&amp;parent_loc);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+rebalance_task(void *data)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    call_frame_t *frame = NULL;</div><div class='add'>+    int fop_errno = 0;</div><div class='add'>+</div><div class='add'>+    frame = data;</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+</div><div class='add'>+    /* This function is 'synchrounous', hence if it returns,</div><div class='add'>+       we are done with the task */</div><div class='add'>+    ret = dht_migrate_file(THIS, &amp;local-&gt;loc, local-&gt;rebalance.from_subvol,</div><div class='add'>+                           local-&gt;rebalance.target_node, local-&gt;flags,</div><div class='add'>+                           &amp;fop_errno);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+rebalance_task_completion(int op_ret, call_frame_t *sync_frame, void *data)</div><div class='add'>+{</div><div class='add'>+    int32_t op_errno = EINVAL;</div><div class='add'>+</div><div class='add'>+    if (op_ret == -1) {</div><div class='add'>+        /* Failure of migration process, mostly due to write process.</div><div class='add'>+           as we can't preserve the exact errno, lets say there was</div><div class='add'>+           no space to migrate-data</div><div class='add'>+        */</div><div class='add'>+        op_errno = ENOSPC;</div><div class='add'>+    } else if (op_ret == 1) {</div><div class='add'>+        /* migration didn't happen, but is not a failure, let the user</div><div class='add'>+           understand that he doesn't have permission to migrate the</div><div class='add'>+           file.</div><div class='add'>+        */</div><div class='add'>+        op_ret = -1;</div><div class='add'>+        op_errno = EPERM;</div><div class='add'>+    } else if (op_ret != 0) {</div><div class='add'>+        op_errno = -op_ret;</div><div class='add'>+        op_ret = -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    DHT_STACK_UNWIND(setxattr, sync_frame, op_ret, op_errno, NULL);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+dht_start_rebalance_task(xlator_t *this, call_frame_t *frame)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    ret = synctask_new(this-&gt;ctx-&gt;env, rebalance_task,</div><div class='add'>+                       rebalance_task_completion, frame, frame);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+gf_listener_stop(xlator_t *this)</div><div class='add'>+{</div><div class='add'>+    glusterfs_ctx_t *ctx = NULL;</div><div class='add'>+    cmd_args_t *cmd_args = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    ctx = this-&gt;ctx;</div><div class='add'>+    GF_ASSERT(ctx);</div><div class='add'>+    cmd_args = &amp;ctx-&gt;cmd_args;</div><div class='add'>+    if (cmd_args-&gt;sock_file) {</div><div class='add'>+        ret = sys_unlink(cmd_args-&gt;sock_file);</div><div class='add'>+        if (ret &amp;&amp; (ENOENT == errno)) {</div><div class='add'>+            ret = 0;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_ERROR, errno, DHT_MSG_SOCKET_ERROR,</div><div class='add'>+               "Failed to unlink listener "</div><div class='add'>+               "socket %s",</div><div class='add'>+               cmd_args-&gt;sock_file);</div><div class='add'>+    }</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+dht_build_root_inode(xlator_t *this, inode_t **inode)</div><div class='add'>+{</div><div class='add'>+    inode_table_t *itable = NULL;</div><div class='add'>+    static uuid_t root_gfid = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1};</div><div class='add'>+</div><div class='add'>+    itable = inode_table_new(0, this);</div><div class='add'>+    if (!itable)</div><div class='add'>+        return;</div><div class='add'>+</div><div class='add'>+    *inode = inode_find(itable, root_gfid);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+dht_build_root_loc(inode_t *inode, loc_t *loc)</div><div class='add'>+{</div><div class='add'>+    loc-&gt;path = "/";</div><div class='add'>+    loc-&gt;inode = inode;</div><div class='add'>+    loc-&gt;inode-&gt;ia_type = IA_IFDIR;</div><div class='add'>+    memset(loc-&gt;gfid, 0, 16);</div><div class='add'>+    loc-&gt;gfid[15] = 1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* return values: 1 -&gt; error, bug ignore and continue</div><div class='add'>+                  0 -&gt; proceed</div><div class='add'>+                 -1 -&gt; error, handle it */</div><div class='add'>+int32_t</div><div class='add'>+gf_defrag_handle_migrate_error(int32_t op_errno, gf_defrag_info_t *defrag)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+    /* if errno is not ENOTCONN, we can still continue</div><div class='add'>+       with rebalance process */</div><div class='add'>+    if (op_errno != ENOTCONN) {</div><div class='add'>+        ret = 1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (op_errno == ENOTCONN) {</div><div class='add'>+        /* Most probably mount point went missing (mostly due</div><div class='add'>+           to a brick down), say rebalance failure to user,</div><div class='add'>+           let him restart it if everything is fine */</div><div class='add'>+        defrag-&gt;defrag_status = GF_DEFRAG_STATUS_FAILED;</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static gf_boolean_t</div><div class='add'>+gf_defrag_pattern_match(gf_defrag_info_t *defrag, char *name, uint64_t size)</div><div class='add'>+{</div><div class='add'>+    gf_defrag_pattern_list_t *trav = NULL;</div><div class='add'>+    gf_boolean_t match = _gf_false;</div><div class='add'>+    gf_boolean_t ret = _gf_false;</div><div class='add'>+</div><div class='add'>+    GF_VALIDATE_OR_GOTO("dht", defrag, out);</div><div class='add'>+</div><div class='add'>+    trav = defrag-&gt;defrag_pattern;</div><div class='add'>+    while (trav) {</div><div class='add'>+        if (!fnmatch(trav-&gt;path_pattern, name, FNM_NOESCAPE)) {</div><div class='add'>+            match = _gf_true;</div><div class='add'>+            break;</div><div class='add'>+        }</div><div class='add'>+        trav = trav-&gt;next;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if ((match == _gf_true) &amp;&amp; (size &gt;= trav-&gt;size))</div><div class='add'>+        ret = _gf_true;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+dht_dfreaddirp_done(dht_dfoffset_ctx_t *offset_var, int cnt)</div><div class='add'>+{</div><div class='add'>+    int i;</div><div class='add'>+    int result = 1;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; cnt; i++) {</div><div class='add'>+        if (offset_var[i].readdir_done == 0) {</div><div class='add'>+            result = 0;</div><div class='add'>+            break;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    return result;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int static gf_defrag_ctx_subvols_init(dht_dfoffset_ctx_t *offset_var,</div><div class='add'>+                                      xlator_t *this)</div><div class='add'>+{</div><div class='add'>+    int i;</div><div class='add'>+    dht_conf_t *conf = NULL;</div><div class='add'>+</div><div class='add'>+    conf = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    if (!conf)</div><div class='add'>+        return -1;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; conf-&gt;local_subvols_cnt; i++) {</div><div class='add'>+        offset_var[i].this = conf-&gt;local_subvols[i];</div><div class='add'>+        offset_var[i].offset = (off_t)0;</div><div class='add'>+        offset_var[i].readdir_done = 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+dht_get_first_non_null_index(subvol_nodeuuids_info_t *entry)</div><div class='add'>+{</div><div class='add'>+    int i = 0;</div><div class='add'>+    int index = 0;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; entry-&gt;count; i++) {</div><div class='add'>+        if (!gf_uuid_is_null(entry-&gt;elements[i].uuid)) {</div><div class='add'>+            index = i;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (i == entry-&gt;count) {</div><div class='add'>+        index = -1;</div><div class='add'>+    }</div><div class='add'>+out:</div><div class='add'>+    return index;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* Return value</div><div class='add'>+ * 0 : this node does not migrate the file</div><div class='add'>+ * 1 : this node migrates the file</div><div class='add'>+ *</div><div class='add'>+ * Use the hash value of the gfid to determine which node will migrate files.</div><div class='add'>+ * Using the gfid instead of the name also ensures that the same node handles</div><div class='add'>+ * all hardlinks.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+gf_boolean_t</div><div class='add'>+gf_defrag_should_i_migrate(xlator_t *this, int local_subvol_index, uuid_t gfid)</div><div class='add'>+{</div><div class='add'>+    gf_boolean_t ret = _gf_false;</div><div class='add'>+    int i = local_subvol_index;</div><div class='add'>+    char *str = NULL;</div><div class='add'>+    uint32_t hashval = 0;</div><div class='add'>+    int32_t index = 0;</div><div class='add'>+    dht_conf_t *conf = NULL;</div><div class='add'>+    char buf[UUID_CANONICAL_FORM_LEN + 1] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    subvol_nodeuuids_info_t *entry = NULL;</div><div class='add'>+</div><div class='add'>+    conf = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    /* Pure distribute. A subvol in this case</div><div class='add'>+        will be handled by only one node */</div><div class='add'>+</div><div class='add'>+    entry = &amp;(conf-&gt;local_nodeuuids[i]);</div><div class='add'>+    if (entry-&gt;count == 1) {</div><div class='add'>+        return 1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    str = uuid_utoa_r(gfid, buf);</div><div class='add'>+    if (dht_hash_compute(this, 0, str, &amp;hashval) == 0) {</div><div class='add'>+        index = (hashval % entry-&gt;count);</div><div class='add'>+        if (entry-&gt;elements[index].info == REBAL_NODEUUID_MINE) {</div><div class='add'>+            /* Index matches this node's nodeuuid.*/</div><div class='add'>+            ret = _gf_true;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        /* Brick down - some other node has to migrate these files*/</div><div class='add'>+        if (gf_uuid_is_null(entry-&gt;elements[index].uuid)) {</div><div class='add'>+            /* Fall back to the first non-null index */</div><div class='add'>+            index = dht_get_first_non_null_index(entry);</div><div class='add'>+</div><div class='add'>+            if (index == -1) {</div><div class='add'>+                /* None of the bricks in the subvol are up.</div><div class='add'>+                 * CHILD_DOWN will kill the process soon */</div><div class='add'>+</div><div class='add'>+                return _gf_false;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            if (entry-&gt;elements[index].info == REBAL_NODEUUID_MINE) {</div><div class='add'>+                /* Index matches this node's nodeuuid.*/</div><div class='add'>+                ret = _gf_true;</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+gf_defrag_migrate_single_file(void *opaque)</div><div class='add'>+{</div><div class='add'>+    xlator_t *this = NULL;</div><div class='add'>+    dht_conf_t *conf = NULL;</div><div class='add'>+    gf_defrag_info_t *defrag = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    gf_dirent_t *entry = NULL;</div><div class='add'>+    struct timeval start = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    loc_t entry_loc = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    loc_t *loc = NULL;</div><div class='add'>+    struct iatt iatt = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    dict_t *migrate_data = NULL;</div><div class='add'>+    struct timeval end = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    double elapsed = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    struct dht_container *rebal_entry = NULL;</div><div class='add'>+    inode_t *inode = NULL;</div><div class='add'>+    xlator_t *hashed_subvol = NULL;</div><div class='add'>+    xlator_t *cached_subvol = NULL;</div><div class='add'>+    call_frame_t *statfs_frame = NULL;</div><div class='add'>+    xlator_t *old_THIS = NULL;</div><div class='add'>+    data_t *tmp = NULL;</div><div class='add'>+    int fop_errno = 0;</div><div class='add'>+    gf_dht_migrate_data_type_t rebal_type = GF_DHT_MIGRATE_DATA;</div><div class='add'>+    char value[MAX_REBAL_TYPE_SIZE] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    struct iatt *iatt_ptr = NULL;</div><div class='add'>+    gf_boolean_t update_skippedcount = _gf_true;</div><div class='add'>+    int i = 0;</div><div class='add'>+    gf_boolean_t should_i_migrate = 0;</div><div class='add'>+</div><div class='add'>+    rebal_entry = (struct dht_container *)opaque;</div><div class='add'>+    if (!rebal_entry) {</div><div class='add'>+        gf_log("DHT", GF_LOG_ERROR, "rebal_entry is NULL");</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    this = rebal_entry-&gt;this;</div><div class='add'>+</div><div class='add'>+    conf = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    defrag = conf-&gt;defrag;</div><div class='add'>+</div><div class='add'>+    loc = rebal_entry-&gt;parent_loc;</div><div class='add'>+</div><div class='add'>+    migrate_data = rebal_entry-&gt;migrate_data;</div><div class='add'>+</div><div class='add'>+    entry = rebal_entry-&gt;df_entry;</div><div class='add'>+    iatt_ptr = &amp;entry-&gt;d_stat;</div><div class='add'>+</div><div class='add'>+    if (defrag-&gt;defrag_status != GF_DEFRAG_STATUS_STARTED) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (defrag-&gt;stats == _gf_true) {</div><div class='add'>+        gettimeofday(&amp;start, NULL);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (defrag-&gt;defrag_pattern &amp;&amp;</div><div class='add'>+        (gf_defrag_pattern_match(defrag, entry-&gt;d_name,</div><div class='add'>+                                 entry-&gt;d_stat.ia_size) == _gf_false)) {</div><div class='add'>+        gf_log(this-&gt;name, GF_LOG_ERROR, "pattern_match failed");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    memset(&amp;entry_loc, 0, sizeof(entry_loc));</div><div class='add'>+</div><div class='add'>+    ret = dht_build_child_loc(this, &amp;entry_loc, loc, entry-&gt;d_name);</div><div class='add'>+    if (ret) {</div><div class='add'>+        LOCK(&amp;defrag-&gt;lock);</div><div class='add'>+        {</div><div class='add'>+            defrag-&gt;total_failures += 1;</div><div class='add'>+        }</div><div class='add'>+        UNLOCK(&amp;defrag-&gt;lock);</div><div class='add'>+</div><div class='add'>+        ret = 0;</div><div class='add'>+</div><div class='add'>+        gf_log(this-&gt;name, GF_LOG_ERROR, "Child loc build failed");</div><div class='add'>+</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    should_i_migrate = gf_defrag_should_i_migrate(</div><div class='add'>+        this, rebal_entry-&gt;local_subvol_index, entry-&gt;d_stat.ia_gfid);</div><div class='add'>+</div><div class='add'>+    gf_uuid_copy(entry_loc.gfid, entry-&gt;d_stat.ia_gfid);</div><div class='add'>+</div><div class='add'>+    gf_uuid_copy(entry_loc.pargfid, loc-&gt;gfid);</div><div class='add'>+</div><div class='add'>+    ret = syncop_lookup(this, &amp;entry_loc, &amp;iatt, NULL, NULL, NULL);</div><div class='add'>+</div><div class='add'>+    if (!should_i_migrate) {</div><div class='add'>+        /* this node isn't supposed to migrate the file. suppressing any</div><div class='add'>+         * potential error from lookup as this file is under migration by</div><div class='add'>+         * another node */</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_msg_debug(this-&gt;name, -ret,</div><div class='add'>+                         "Ignoring lookup failure: node isn't migrating %s",</div><div class='add'>+                         entry_loc.path);</div><div class='add'>+            ret = 0;</div><div class='add'>+        }</div><div class='add'>+        gf_msg_debug(this-&gt;name, 0, "Don't migrate %s ", entry_loc.path);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_ERROR, -ret, DHT_MSG_MIGRATE_FILE_FAILED,</div><div class='add'>+               "Migrate file failed: %s lookup failed", entry_loc.path);</div><div class='add'>+</div><div class='add'>+        /* Increase failure count only for remove-brick op, so that</div><div class='add'>+         * user is warned to check the removed-brick for any files left</div><div class='add'>+         * unmigrated</div><div class='add'>+         */</div><div class='add'>+        if (conf-&gt;decommission_subvols_cnt) {</div><div class='add'>+            LOCK(&amp;defrag-&gt;lock);</div><div class='add'>+            {</div><div class='add'>+                defrag-&gt;total_failures += 1;</div><div class='add'>+            }</div><div class='add'>+            UNLOCK(&amp;defrag-&gt;lock);</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        ret = 0;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    iatt_ptr = &amp;iatt;</div><div class='add'>+</div><div class='add'>+    hashed_subvol = dht_subvol_get_hashed(this, &amp;entry_loc);</div><div class='add'>+    if (!hashed_subvol) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_ERROR, 0, DHT_MSG_HASHED_SUBVOL_GET_FAILED,</div><div class='add'>+               "Failed to get hashed subvol for %s", entry_loc.path);</div><div class='add'>+        ret = 0;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    cached_subvol = dht_subvol_get_cached(this, entry_loc.inode);</div><div class='add'>+    if (!cached_subvol) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_ERROR, 0, DHT_MSG_CACHED_SUBVOL_GET_FAILED,</div><div class='add'>+               "Failed to get cached subvol for %s", entry_loc.path);</div><div class='add'>+</div><div class='add'>+        ret = 0;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (hashed_subvol == cached_subvol) {</div><div class='add'>+        ret = 0;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    inode = inode_link(entry_loc.inode, entry_loc.parent, entry-&gt;d_name, &amp;iatt);</div><div class='add'>+    inode_unref(entry_loc.inode);</div><div class='add'>+    /* use the inode returned by inode_link */</div><div class='add'>+    entry_loc.inode = inode;</div><div class='add'>+</div><div class='add'>+    old_THIS = THIS;</div><div class='add'>+    THIS = this;</div><div class='add'>+    statfs_frame = create_frame(this, this-&gt;ctx-&gt;pool);</div><div class='add'>+    if (!statfs_frame) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_ERROR, DHT_MSG_NO_MEMORY, ENOMEM,</div><div class='add'>+               "Insufficient memory. Frame creation failed");</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* async statfs information for honoring min-free-disk */</div><div class='add'>+    dht_get_du_info(statfs_frame, this, loc);</div><div class='add'>+    THIS = old_THIS;</div><div class='add'>+</div><div class='add'>+    tmp = dict_get(migrate_data, GF_XATTR_FILE_MIGRATE_KEY);</div><div class='add'>+    if (tmp) {</div><div class='add'>+        memcpy(value, tmp-&gt;data, tmp-&gt;len);</div><div class='add'>+        if (strcmp(value, "force") == 0)</div><div class='add'>+            rebal_type = GF_DHT_MIGRATE_DATA_EVEN_IF_LINK_EXISTS;</div><div class='add'>+</div><div class='add'>+        if (conf-&gt;decommission_in_progress)</div><div class='add'>+            rebal_type = GF_DHT_MIGRATE_HARDLINK;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dht_migrate_file(this, &amp;entry_loc, cached_subvol, hashed_subvol,</div><div class='add'>+                           rebal_type, &amp;fop_errno);</div><div class='add'>+    if (ret == 1) {</div><div class='add'>+        if (fop_errno == ENOSPC) {</div><div class='add'>+            gf_msg_debug(this-&gt;name, 0,</div><div class='add'>+                         "migrate-data skipped for"</div><div class='add'>+                         " %s due to space constraints",</div><div class='add'>+                         entry_loc.path);</div><div class='add'>+</div><div class='add'>+            /* For remove-brick case if the source is not one of the</div><div class='add'>+             * removed-brick, do not mark the error as failure */</div><div class='add'>+            if (conf-&gt;decommission_subvols_cnt) {</div><div class='add'>+                for (i = 0; i &lt; conf-&gt;subvolume_cnt; i++) {</div><div class='add'>+                    if (conf-&gt;decommissioned_bricks[i] == cached_subvol) {</div><div class='add'>+                        LOCK(&amp;defrag-&gt;lock);</div><div class='add'>+                        {</div><div class='add'>+                            defrag-&gt;total_failures += 1;</div><div class='add'>+                            update_skippedcount = _gf_false;</div><div class='add'>+                        }</div><div class='add'>+                        UNLOCK(&amp;defrag-&gt;lock);</div><div class='add'>+</div><div class='add'>+                        break;</div><div class='add'>+                    }</div><div class='add'>+                }</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            if (update_skippedcount) {</div><div class='add'>+                LOCK(&amp;defrag-&gt;lock);</div><div class='add'>+                {</div><div class='add'>+                    defrag-&gt;skipped += 1;</div><div class='add'>+                }</div><div class='add'>+                UNLOCK(&amp;defrag-&gt;lock);</div><div class='add'>+</div><div class='add'>+                gf_msg(this-&gt;name, GF_LOG_INFO, 0, DHT_MSG_MIGRATE_FILE_SKIPPED,</div><div class='add'>+                       "File migration skipped for %s.", entry_loc.path);</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+        } else if (fop_errno == ENOTSUP) {</div><div class='add'>+            gf_msg_debug(this-&gt;name, 0,</div><div class='add'>+                         "migrate-data skipped for"</div><div class='add'>+                         " hardlink %s ",</div><div class='add'>+                         entry_loc.path);</div><div class='add'>+            LOCK(&amp;defrag-&gt;lock);</div><div class='add'>+            {</div><div class='add'>+                defrag-&gt;skipped += 1;</div><div class='add'>+            }</div><div class='add'>+            UNLOCK(&amp;defrag-&gt;lock);</div><div class='add'>+</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_INFO, 0, DHT_MSG_MIGRATE_FILE_SKIPPED,</div><div class='add'>+                   "File migration skipped for %s.", entry_loc.path);</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        ret = 0;</div><div class='add'>+        goto out;</div><div class='add'>+    } else if (ret &lt; 0) {</div><div class='add'>+        if (fop_errno != EEXIST) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, fop_errno,</div><div class='add'>+                   DHT_MSG_MIGRATE_FILE_FAILED, "migrate-data failed for %s",</div><div class='add'>+                   entry_loc.path);</div><div class='add'>+</div><div class='add'>+            LOCK(&amp;defrag-&gt;lock);</div><div class='add'>+            {</div><div class='add'>+                defrag-&gt;total_failures += 1;</div><div class='add'>+            }</div><div class='add'>+            UNLOCK(&amp;defrag-&gt;lock);</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        ret = gf_defrag_handle_migrate_error(fop_errno, defrag);</div><div class='add'>+</div><div class='add'>+        if (!ret) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, fop_errno,</div><div class='add'>+                   DHT_MSG_MIGRATE_FILE_FAILED,</div><div class='add'>+                   "migrate-data on %s failed:", entry_loc.path);</div><div class='add'>+        } else if (ret == 1) {</div><div class='add'>+            ret = 0;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;defrag-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        defrag-&gt;total_files += 1;</div><div class='add'>+        defrag-&gt;total_data += iatt.ia_size;</div><div class='add'>+    }</div><div class='add'>+    UNLOCK(&amp;defrag-&gt;lock);</div><div class='add'>+</div><div class='add'>+    if (defrag-&gt;stats == _gf_true) {</div><div class='add'>+        gettimeofday(&amp;end, NULL);</div><div class='add'>+        elapsed = gf_tvdiff(&amp;start, &amp;end);</div><div class='add'>+        gf_log(this-&gt;name, GF_LOG_INFO,</div><div class='add'>+               "Migration of "</div><div class='add'>+               "file:%s size:%" PRIu64</div><div class='add'>+               " bytes took %.2f"</div><div class='add'>+               "secs and ret: %d",</div><div class='add'>+               entry_loc.name, iatt.ia_size, elapsed / 1e6, ret);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (statfs_frame) {</div><div class='add'>+        STACK_DESTROY(statfs_frame-&gt;root);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (iatt_ptr) {</div><div class='add'>+        LOCK(&amp;defrag-&gt;lock);</div><div class='add'>+        {</div><div class='add'>+            defrag-&gt;size_processed += iatt_ptr-&gt;ia_size;</div><div class='add'>+        }</div><div class='add'>+        UNLOCK(&amp;defrag-&gt;lock);</div><div class='add'>+    }</div><div class='add'>+    loc_wipe(&amp;entry_loc);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void *</div><div class='add'>+gf_defrag_task(void *opaque)</div><div class='add'>+{</div><div class='add'>+    struct list_head *q_head = NULL;</div><div class='add'>+    struct dht_container *iterator = NULL;</div><div class='add'>+    gf_defrag_info_t *defrag = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    pid_t pid = GF_CLIENT_PID_DEFRAG;</div><div class='add'>+</div><div class='add'>+    defrag = (gf_defrag_info_t *)opaque;</div><div class='add'>+    if (!defrag) {</div><div class='add'>+        gf_msg("dht", GF_LOG_ERROR, 0, 0, "defrag is NULL");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    syncopctx_setfspid(&amp;pid);</div><div class='add'>+</div><div class='add'>+    q_head = &amp;(defrag-&gt;queue[0].list);</div><div class='add'>+</div><div class='add'>+    /* The following while loop will dequeue one entry from the defrag-&gt;queue</div><div class='add'>+       under lock. We will update the defrag-&gt;global_error only when there</div><div class='add'>+       is an error which is critical to stop the rebalance process. The stop</div><div class='add'>+       message will be intimated to other migrator threads by setting the</div><div class='add'>+       defrag-&gt;defrag_status to GF_DEFRAG_STATUS_FAILED.</div><div class='add'>+</div><div class='add'>+       In defrag-&gt;queue, a low watermark (MIN_MIGRATE_QUEUE_COUNT) is</div><div class='add'>+       maintained so that crawler does not starve the file migration</div><div class='add'>+       workers and a high watermark (MAX_MIGRATE_QUEUE_COUNT) so that</div><div class='add'>+       crawler does not go far ahead in filling up the queue.</div><div class='add'>+     */</div><div class='add'>+</div><div class='add'>+    while (_gf_true) {</div><div class='add'>+        if (defrag-&gt;defrag_status != GF_DEFRAG_STATUS_STARTED) {</div><div class='add'>+            pthread_cond_broadcast(&amp;defrag-&gt;rebalance_crawler_alarm);</div><div class='add'>+            pthread_cond_broadcast(&amp;defrag-&gt;parallel_migration_cond);</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        pthread_mutex_lock(&amp;defrag-&gt;dfq_mutex);</div><div class='add'>+        {</div><div class='add'>+            /*Throttle down:</div><div class='add'>+              If the reconfigured count is less than current thread</div><div class='add'>+              count, then the current thread will sleep */</div><div class='add'>+</div><div class='add'>+            /*TODO: Need to refactor the following block to work</div><div class='add'>+             *under defrag-&gt;lock. For now access</div><div class='add'>+             * defrag-&gt;current_thread_count and rthcount under</div><div class='add'>+             * dfq_mutex lock */</div><div class='add'>+            while (!defrag-&gt;crawl_done &amp;&amp; (defrag-&gt;recon_thread_count &lt;</div><div class='add'>+                                           defrag-&gt;current_thread_count)) {</div><div class='add'>+                defrag-&gt;current_thread_count--;</div><div class='add'>+                gf_msg_debug("DHT", 0,</div><div class='add'>+                             "Thread sleeping. "</div><div class='add'>+                             "current thread count: %d",</div><div class='add'>+                             defrag-&gt;current_thread_count);</div><div class='add'>+</div><div class='add'>+                pthread_cond_wait(&amp;defrag-&gt;df_wakeup_thread,</div><div class='add'>+                                  &amp;defrag-&gt;dfq_mutex);</div><div class='add'>+</div><div class='add'>+                defrag-&gt;current_thread_count++;</div><div class='add'>+                gf_msg_debug("DHT", 0,</div><div class='add'>+                             "Thread wokeup. "</div><div class='add'>+                             "current thread count: %d",</div><div class='add'>+                             defrag-&gt;current_thread_count);</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            if (defrag-&gt;q_entry_count) {</div><div class='add'>+                iterator = list_entry(q_head-&gt;next, typeof(*iterator), list);</div><div class='add'>+</div><div class='add'>+                gf_msg_debug("DHT", 0,</div><div class='add'>+                             "picking entry "</div><div class='add'>+                             "%s",</div><div class='add'>+                             iterator-&gt;df_entry-&gt;d_name);</div><div class='add'>+</div><div class='add'>+                list_del_init(&amp;(iterator-&gt;list));</div><div class='add'>+</div><div class='add'>+                defrag-&gt;q_entry_count--;</div><div class='add'>+</div><div class='add'>+                if ((defrag-&gt;q_entry_count &lt; MIN_MIGRATE_QUEUE_COUNT) &amp;&amp;</div><div class='add'>+                    defrag-&gt;wakeup_crawler) {</div><div class='add'>+                    pthread_cond_broadcast(&amp;defrag-&gt;rebalance_crawler_alarm);</div><div class='add'>+                }</div><div class='add'>+                pthread_mutex_unlock(&amp;defrag-&gt;dfq_mutex);</div><div class='add'>+                ret = gf_defrag_migrate_single_file((void *)iterator);</div><div class='add'>+</div><div class='add'>+                /*Critical errors: ENOTCONN and ENOSPACE*/</div><div class='add'>+                if (ret) {</div><div class='add'>+                    dht_set_global_defrag_error(defrag, ret);</div><div class='add'>+</div><div class='add'>+                    defrag-&gt;defrag_status = GF_DEFRAG_STATUS_FAILED;</div><div class='add'>+</div><div class='add'>+                    pthread_cond_broadcast(&amp;defrag-&gt;rebalance_crawler_alarm);</div><div class='add'>+</div><div class='add'>+                    pthread_cond_broadcast(&amp;defrag-&gt;parallel_migration_cond);</div><div class='add'>+</div><div class='add'>+                    goto out;</div><div class='add'>+                }</div><div class='add'>+</div><div class='add'>+                gf_defrag_free_container(iterator);</div><div class='add'>+</div><div class='add'>+                continue;</div><div class='add'>+            } else {</div><div class='add'>+                /* defrag-&gt;crawl_done flag is set means crawling</div><div class='add'>+                 file system is done and hence a list_empty when</div><div class='add'>+                 the above flag is set indicates there are no more</div><div class='add'>+                 entries to be added to the queue and rebalance is</div><div class='add'>+                 finished */</div><div class='add'>+</div><div class='add'>+                if (!defrag-&gt;crawl_done) {</div><div class='add'>+                    defrag-&gt;current_thread_count--;</div><div class='add'>+                    gf_msg_debug("DHT", 0,</div><div class='add'>+                                 "Thread "</div><div class='add'>+                                 "sleeping while  waiting "</div><div class='add'>+                                 "for migration entries. "</div><div class='add'>+                                 "current thread  count:%d",</div><div class='add'>+                                 defrag-&gt;current_thread_count);</div><div class='add'>+</div><div class='add'>+                    pthread_cond_wait(&amp;defrag-&gt;parallel_migration_cond,</div><div class='add'>+                                      &amp;defrag-&gt;dfq_mutex);</div><div class='add'>+                }</div><div class='add'>+</div><div class='add'>+                if (defrag-&gt;crawl_done &amp;&amp; !defrag-&gt;q_entry_count) {</div><div class='add'>+                    defrag-&gt;current_thread_count++;</div><div class='add'>+                    gf_msg_debug("DHT", 0, "Exiting thread");</div><div class='add'>+</div><div class='add'>+                    pthread_cond_broadcast(&amp;defrag-&gt;parallel_migration_cond);</div><div class='add'>+                    goto unlock;</div><div class='add'>+                } else {</div><div class='add'>+                    defrag-&gt;current_thread_count++;</div><div class='add'>+                    gf_msg_debug("DHT", 0,</div><div class='add'>+                                 "Thread woke up"</div><div class='add'>+                                 " as found migrating entries. "</div><div class='add'>+                                 "current thread count:%d",</div><div class='add'>+                                 defrag-&gt;current_thread_count);</div><div class='add'>+</div><div class='add'>+                    pthread_mutex_unlock(&amp;defrag-&gt;dfq_mutex);</div><div class='add'>+                    continue;</div><div class='add'>+                }</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+    unlock:</div><div class='add'>+        pthread_mutex_unlock(&amp;defrag-&gt;dfq_mutex);</div><div class='add'>+        break;</div><div class='add'>+    }</div><div class='add'>+out:</div><div class='add'>+    return NULL;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int static gf_defrag_get_entry(xlator_t *this, int i,</div><div class='add'>+                               struct dht_container **container, loc_t *loc,</div><div class='add'>+                               dht_conf_t *conf, gf_defrag_info_t *defrag,</div><div class='add'>+                               fd_t *fd, dict_t *migrate_data,</div><div class='add'>+                               struct dir_dfmeta *dir_dfmeta, dict_t *xattr_req,</div><div class='add'>+                               int *perrno)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+    char is_linkfile = 0;</div><div class='add'>+    gf_dirent_t *df_entry = NULL;</div><div class='add'>+    struct dht_container *tmp_container = NULL;</div><div class='add'>+</div><div class='add'>+    if (defrag-&gt;defrag_status != GF_DEFRAG_STATUS_STARTED) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (dir_dfmeta-&gt;offset_var[i].readdir_done == 1) {</div><div class='add'>+        ret = 0;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (dir_dfmeta-&gt;fetch_entries[i] == 1) {</div><div class='add'>+        if (!fd) {</div><div class='add'>+            dir_dfmeta-&gt;fetch_entries[i] = 0;</div><div class='add'>+            dir_dfmeta-&gt;offset_var[i].readdir_done = 1;</div><div class='add'>+            ret = 0;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        ret = syncop_readdirp(conf-&gt;local_subvols[i], fd, 131072,</div><div class='add'>+                              dir_dfmeta-&gt;offset_var[i].offset,</div><div class='add'>+                              &amp;(dir_dfmeta-&gt;equeue[i]), xattr_req, NULL);</div><div class='add'>+        if (ret == 0) {</div><div class='add'>+            dir_dfmeta-&gt;offset_var[i].readdir_done = 1;</div><div class='add'>+            ret = 0;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        if (ret &lt; 0) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_WARNING, -ret,</div><div class='add'>+                   DHT_MSG_MIGRATE_DATA_FAILED,</div><div class='add'>+                   "Readdirp failed. Aborting data migration for "</div><div class='add'>+                   "directory: %s",</div><div class='add'>+                   loc-&gt;path);</div><div class='add'>+            *perrno = -ret;</div><div class='add'>+            ret = -1;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        if (list_empty(&amp;(dir_dfmeta-&gt;equeue[i].list))) {</div><div class='add'>+            dir_dfmeta-&gt;offset_var[i].readdir_done = 1;</div><div class='add'>+            ret = 0;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        dir_dfmeta-&gt;fetch_entries[i] = 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    while (1) {</div><div class='add'>+        if (defrag-&gt;defrag_status != GF_DEFRAG_STATUS_STARTED) {</div><div class='add'>+            ret = -1;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        df_entry = list_entry(dir_dfmeta-&gt;iterator[i]-&gt;next, typeof(*df_entry),</div><div class='add'>+                              list);</div><div class='add'>+</div><div class='add'>+        if (&amp;df_entry-&gt;list == dir_dfmeta-&gt;head[i]) {</div><div class='add'>+            gf_dirent_free(&amp;(dir_dfmeta-&gt;equeue[i]));</div><div class='add'>+            INIT_LIST_HEAD(&amp;(dir_dfmeta-&gt;equeue[i].list));</div><div class='add'>+            dir_dfmeta-&gt;fetch_entries[i] = 1;</div><div class='add'>+            dir_dfmeta-&gt;iterator[i] = dir_dfmeta-&gt;head[i];</div><div class='add'>+            ret = 0;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        dir_dfmeta-&gt;iterator[i] = dir_dfmeta-&gt;iterator[i]-&gt;next;</div><div class='add'>+</div><div class='add'>+        dir_dfmeta-&gt;offset_var[i].offset = df_entry-&gt;d_off;</div><div class='add'>+        if (!strcmp(df_entry-&gt;d_name, ".") || !strcmp(df_entry-&gt;d_name, ".."))</div><div class='add'>+            continue;</div><div class='add'>+</div><div class='add'>+        if (IA_ISDIR(df_entry-&gt;d_stat.ia_type)) {</div><div class='add'>+            defrag-&gt;size_processed += df_entry-&gt;d_stat.ia_size;</div><div class='add'>+            continue;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        defrag-&gt;num_files_lookedup++;</div><div class='add'>+</div><div class='add'>+        if (defrag-&gt;defrag_pattern &amp;&amp;</div><div class='add'>+            (gf_defrag_pattern_match(defrag, df_entry-&gt;d_name,</div><div class='add'>+                                     df_entry-&gt;d_stat.ia_size) == _gf_false)) {</div><div class='add'>+            defrag-&gt;size_processed += df_entry-&gt;d_stat.ia_size;</div><div class='add'>+            continue;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        is_linkfile = check_is_linkfile(NULL, &amp;df_entry-&gt;d_stat, df_entry-&gt;dict,</div><div class='add'>+                                        conf-&gt;link_xattr_name);</div><div class='add'>+</div><div class='add'>+        if (is_linkfile) {</div><div class='add'>+            /* No need to add linkto file to the queue for</div><div class='add'>+               migration. Only the actual data file need to</div><div class='add'>+               be checked for migration criteria.</div><div class='add'>+            */</div><div class='add'>+</div><div class='add'>+            gf_msg_debug(this-&gt;name, 0,</div><div class='add'>+                         "Skipping linkfile"</div><div class='add'>+                         " %s on subvol: %s",</div><div class='add'>+                         df_entry-&gt;d_name, conf-&gt;local_subvols[i]-&gt;name);</div><div class='add'>+            continue;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        /*Build Container Structure */</div><div class='add'>+</div><div class='add'>+        tmp_container = GF_CALLOC(1, sizeof(struct dht_container),</div><div class='add'>+                                  gf_dht_mt_container_t);</div><div class='add'>+        if (!tmp_container) {</div><div class='add'>+            gf_log(this-&gt;name, GF_LOG_ERROR,</div><div class='add'>+                   "Failed to allocate "</div><div class='add'>+                   "memory for container");</div><div class='add'>+            ret = -1;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+        tmp_container-&gt;df_entry = gf_dirent_for_name(df_entry-&gt;d_name);</div><div class='add'>+        if (!tmp_container-&gt;df_entry) {</div><div class='add'>+            gf_log(this-&gt;name, GF_LOG_ERROR,</div><div class='add'>+                   "Failed to allocate "</div><div class='add'>+                   "memory for df_entry");</div><div class='add'>+            ret = -1;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        tmp_container-&gt;local_subvol_index = i;</div><div class='add'>+</div><div class='add'>+        tmp_container-&gt;df_entry-&gt;d_stat = df_entry-&gt;d_stat;</div><div class='add'>+</div><div class='add'>+        tmp_container-&gt;df_entry-&gt;d_ino = df_entry-&gt;d_ino;</div><div class='add'>+</div><div class='add'>+        tmp_container-&gt;df_entry-&gt;d_type = df_entry-&gt;d_type;</div><div class='add'>+</div><div class='add'>+        tmp_container-&gt;df_entry-&gt;d_len = df_entry-&gt;d_len;</div><div class='add'>+</div><div class='add'>+        tmp_container-&gt;parent_loc = GF_CALLOC(1, sizeof(*loc), gf_dht_mt_loc_t);</div><div class='add'>+        if (!tmp_container-&gt;parent_loc) {</div><div class='add'>+            gf_log(this-&gt;name, GF_LOG_ERROR,</div><div class='add'>+                   "Failed to allocate "</div><div class='add'>+                   "memory for loc");</div><div class='add'>+            ret = -1;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        ret = loc_copy(tmp_container-&gt;parent_loc, loc);</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_log(this-&gt;name, GF_LOG_ERROR, "loc_copy failed");</div><div class='add'>+            ret = -1;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        tmp_container-&gt;migrate_data = migrate_data;</div><div class='add'>+</div><div class='add'>+        tmp_container-&gt;this = this;</div><div class='add'>+</div><div class='add'>+        if (df_entry-&gt;dict)</div><div class='add'>+            tmp_container-&gt;df_entry-&gt;dict = dict_ref(df_entry-&gt;dict);</div><div class='add'>+</div><div class='add'>+        /*Build Container Structure &gt;&gt; END*/</div><div class='add'>+</div><div class='add'>+        ret = 0;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (ret == 0) {</div><div class='add'>+        *container = tmp_container;</div><div class='add'>+    } else {</div><div class='add'>+        if (tmp_container) {</div><div class='add'>+            gf_defrag_free_container(tmp_container);</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+gf_defrag_process_dir(xlator_t *this, gf_defrag_info_t *defrag, loc_t *loc,</div><div class='add'>+                      dict_t *migrate_data, int *perrno)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    dht_conf_t *conf = NULL;</div><div class='add'>+    gf_dirent_t entries;</div><div class='add'>+    dict_t *xattr_req = NULL;</div><div class='add'>+    struct timeval dir_start = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    struct timeval end = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    double elapsed = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int local_subvols_cnt = 0;</div><div class='add'>+    int i = 0;</div><div class='add'>+    int j = 0;</div><div class='add'>+    struct dht_container *container = NULL;</div><div class='add'>+    int ldfq_count = 0;</div><div class='add'>+    int dfc_index = 0;</div><div class='add'>+    int throttle_up = 0;</div><div class='add'>+    struct dir_dfmeta *dir_dfmeta = NULL;</div><div class='add'>+    xlator_t *old_THIS = NULL;</div><div class='add'>+</div><div class='add'>+    gf_log(this-&gt;name, GF_LOG_INFO, "migrate data called on %s", loc-&gt;path);</div><div class='add'>+    gettimeofday(&amp;dir_start, NULL);</div><div class='add'>+</div><div class='add'>+    conf = this-&gt;private;</div><div class='add'>+    local_subvols_cnt = conf-&gt;local_subvols_cnt;</div><div class='add'>+</div><div class='add'>+    if (!local_subvols_cnt) {</div><div class='add'>+        ret = 0;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    old_THIS = THIS;</div><div class='add'>+    THIS = this;</div><div class='add'>+</div><div class='add'>+    dir_dfmeta = GF_CALLOC(1, sizeof(*dir_dfmeta), gf_common_mt_pointer);</div><div class='add'>+    if (!dir_dfmeta) {</div><div class='add'>+        gf_log(this-&gt;name, GF_LOG_ERROR, "dir_dfmeta is NULL");</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    dir_dfmeta-&gt;lfd = GF_CALLOC(local_subvols_cnt, sizeof(fd_t *),</div><div class='add'>+                                gf_common_mt_pointer);</div><div class='add'>+    if (!dir_dfmeta-&gt;lfd) {</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_ERROR, ENOMEM, DHT_MSG_INSUFF_MEMORY,</div><div class='add'>+                "for dir_dfmeta", NULL);</div><div class='add'>+        ret = -1;</div><div class='add'>+        *perrno = ENOMEM;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; local_subvols_cnt; i++) {</div><div class='add'>+        dir_dfmeta-&gt;lfd[i] = fd_create(loc-&gt;inode, defrag-&gt;pid);</div><div class='add'>+        if (!dir_dfmeta-&gt;lfd[i]) {</div><div class='add'>+            gf_smsg(this-&gt;name, GF_LOG_ERROR, ENOMEM, DHT_MSG_FD_CREATE_FAILED,</div><div class='add'>+                    NULL);</div><div class='add'>+            *perrno = ENOMEM;</div><div class='add'>+            ret = -1;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        ret = syncop_opendir(conf-&gt;local_subvols[i], loc, dir_dfmeta-&gt;lfd[i],</div><div class='add'>+                             NULL, NULL);</div><div class='add'>+        if (ret) {</div><div class='add'>+            fd_unref(dir_dfmeta-&gt;lfd[i]);</div><div class='add'>+            dir_dfmeta-&gt;lfd[i] = NULL;</div><div class='add'>+            gf_smsg(this-&gt;name, GF_LOG_WARNING, 0, DHT_MSG_FAILED_TO_OPEN,</div><div class='add'>+                    "dir: %s", loc-&gt;path, "subvol: %s",</div><div class='add'>+                    conf-&gt;local_subvols[i]-&gt;name, NULL);</div><div class='add'>+</div><div class='add'>+            if (conf-&gt;decommission_in_progress) {</div><div class='add'>+                *perrno = -ret;</div><div class='add'>+                ret = -1;</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+        } else {</div><div class='add'>+            fd_bind(dir_dfmeta-&gt;lfd[i]);</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    dir_dfmeta-&gt;head = GF_CALLOC(local_subvols_cnt, sizeof(*(dir_dfmeta-&gt;head)),</div><div class='add'>+                                 gf_common_mt_pointer);</div><div class='add'>+    if (!dir_dfmeta-&gt;head) {</div><div class='add'>+        gf_log(this-&gt;name, GF_LOG_ERROR, "dir_dfmeta-&gt;head is NULL");</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    dir_dfmeta-&gt;iterator = GF_CALLOC(local_subvols_cnt,</div><div class='add'>+                                     sizeof(*(dir_dfmeta-&gt;iterator)),</div><div class='add'>+                                     gf_common_mt_pointer);</div><div class='add'>+    if (!dir_dfmeta-&gt;iterator) {</div><div class='add'>+        gf_log(this-&gt;name, GF_LOG_ERROR, "dir_dfmeta-&gt;iterator is NULL");</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    dir_dfmeta-&gt;equeue = GF_CALLOC(local_subvols_cnt, sizeof(entries),</div><div class='add'>+                                   gf_dht_mt_dirent_t);</div><div class='add'>+    if (!dir_dfmeta-&gt;equeue) {</div><div class='add'>+        gf_log(this-&gt;name, GF_LOG_ERROR, "dir_dfmeta-&gt;equeue is NULL");</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    dir_dfmeta-&gt;offset_var = GF_CALLOC(</div><div class='add'>+        local_subvols_cnt, sizeof(dht_dfoffset_ctx_t), gf_dht_mt_octx_t);</div><div class='add'>+    if (!dir_dfmeta-&gt;offset_var) {</div><div class='add'>+        gf_log(this-&gt;name, GF_LOG_ERROR, "dir_dfmeta-&gt;offset_var is NULL");</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = gf_defrag_ctx_subvols_init(dir_dfmeta-&gt;offset_var, this);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log(this-&gt;name, GF_LOG_ERROR,</div><div class='add'>+               "dht_dfoffset_ctx_t"</div><div class='add'>+               "initialization failed");</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    dir_dfmeta-&gt;fetch_entries = GF_CALLOC(local_subvols_cnt, sizeof(int),</div><div class='add'>+                                          gf_common_mt_int);</div><div class='add'>+    if (!dir_dfmeta-&gt;fetch_entries) {</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_ERROR, ENOMEM, DHT_MSG_INSUFF_MEMORY,</div><div class='add'>+                "for dir_dfmeta-&gt;fetch_entries", NULL);</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; local_subvols_cnt; i++) {</div><div class='add'>+        INIT_LIST_HEAD(&amp;(dir_dfmeta-&gt;equeue[i].list));</div><div class='add'>+        dir_dfmeta-&gt;head[i] = &amp;(dir_dfmeta-&gt;equeue[i].list);</div><div class='add'>+        dir_dfmeta-&gt;iterator[i] = dir_dfmeta-&gt;head[i];</div><div class='add'>+        dir_dfmeta-&gt;fetch_entries[i] = 1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    xattr_req = dict_new();</div><div class='add'>+    if (!xattr_req) {</div><div class='add'>+        gf_log(this-&gt;name, GF_LOG_ERROR, "dict_new failed");</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_set_uint32(xattr_req, conf-&gt;link_xattr_name, 256);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log(this-&gt;name, GF_LOG_ERROR,</div><div class='add'>+               "failed to set dict for "</div><div class='add'>+               "key: %s",</div><div class='add'>+               conf-&gt;link_xattr_name);</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /*</div><div class='add'>+     Job: Read entries from each local subvol and store the entries</div><div class='add'>+          in equeue array of linked list. Now pick one entry from the</div><div class='add'>+          equeue array in a round robin basis and add them to defrag Queue.</div><div class='add'>+    */</div><div class='add'>+</div><div class='add'>+    while (!dht_dfreaddirp_done(dir_dfmeta-&gt;offset_var, local_subvols_cnt)) {</div><div class='add'>+        pthread_mutex_lock(&amp;defrag-&gt;dfq_mutex);</div><div class='add'>+        {</div><div class='add'>+            /*Throttle up: If reconfigured count is higher than</div><div class='add'>+              current thread count, wake up the sleeping threads</div><div class='add'>+              TODO: Need to refactor this. Instead of making the</div><div class='add'>+              thread sleep and wake, we should terminate and spawn</div><div class='add'>+              threads on-demand*/</div><div class='add'>+</div><div class='add'>+            if (defrag-&gt;recon_thread_count &gt; defrag-&gt;current_thread_count) {</div><div class='add'>+                throttle_up = (defrag-&gt;recon_thread_count -</div><div class='add'>+                               defrag-&gt;current_thread_count);</div><div class='add'>+                for (j = 0; j &lt; throttle_up; j++) {</div><div class='add'>+                    pthread_cond_signal(&amp;defrag-&gt;df_wakeup_thread);</div><div class='add'>+                }</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            while (defrag-&gt;q_entry_count &gt; MAX_MIGRATE_QUEUE_COUNT) {</div><div class='add'>+                defrag-&gt;wakeup_crawler = 1;</div><div class='add'>+                pthread_cond_wait(&amp;defrag-&gt;rebalance_crawler_alarm,</div><div class='add'>+                                  &amp;defrag-&gt;dfq_mutex);</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            ldfq_count = defrag-&gt;q_entry_count;</div><div class='add'>+</div><div class='add'>+            if (defrag-&gt;wakeup_crawler) {</div><div class='add'>+                defrag-&gt;wakeup_crawler = 0;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+        pthread_mutex_unlock(&amp;defrag-&gt;dfq_mutex);</div><div class='add'>+</div><div class='add'>+        while (</div><div class='add'>+            ldfq_count &lt;= MAX_MIGRATE_QUEUE_COUNT &amp;&amp;</div><div class='add'>+            !dht_dfreaddirp_done(dir_dfmeta-&gt;offset_var, local_subvols_cnt)) {</div><div class='add'>+            ret = gf_defrag_get_entry(this, dfc_index, &amp;container, loc, conf,</div><div class='add'>+                                      defrag, dir_dfmeta-&gt;lfd[dfc_index],</div><div class='add'>+                                      migrate_data, dir_dfmeta, xattr_req,</div><div class='add'>+                                      perrno);</div><div class='add'>+</div><div class='add'>+            if (defrag-&gt;defrag_status == GF_DEFRAG_STATUS_STOPPED) {</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            if (ret) {</div><div class='add'>+                gf_log(this-&gt;name, GF_LOG_WARNING,</div><div class='add'>+                       "Found "</div><div class='add'>+                       "error from gf_defrag_get_entry");</div><div class='add'>+</div><div class='add'>+                ret = -1;</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            /* Check if we got an entry, else we need to move the</div><div class='add'>+               index to the next subvol */</div><div class='add'>+            if (!container) {</div><div class='add'>+                GF_CRAWL_INDEX_MOVE(dfc_index, local_subvols_cnt);</div><div class='add'>+                continue;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            /* Q this entry in the dfq */</div><div class='add'>+            pthread_mutex_lock(&amp;defrag-&gt;dfq_mutex);</div><div class='add'>+            {</div><div class='add'>+                list_add_tail(&amp;container-&gt;list, &amp;(defrag-&gt;queue[0].list));</div><div class='add'>+                defrag-&gt;q_entry_count++;</div><div class='add'>+                ldfq_count = defrag-&gt;q_entry_count;</div><div class='add'>+</div><div class='add'>+                gf_msg_debug(this-&gt;name, 0,</div><div class='add'>+                             "added "</div><div class='add'>+                             "file:%s parent:%s to the queue ",</div><div class='add'>+                             container-&gt;df_entry-&gt;d_name,</div><div class='add'>+                             container-&gt;parent_loc-&gt;path);</div><div class='add'>+</div><div class='add'>+                pthread_cond_signal(&amp;defrag-&gt;parallel_migration_cond);</div><div class='add'>+            }</div><div class='add'>+            pthread_mutex_unlock(&amp;defrag-&gt;dfq_mutex);</div><div class='add'>+</div><div class='add'>+            GF_CRAWL_INDEX_MOVE(dfc_index, local_subvols_cnt);</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    gettimeofday(&amp;end, NULL);</div><div class='add'>+    elapsed = gf_tvdiff(&amp;dir_start, &amp;end);</div><div class='add'>+    gf_log(this-&gt;name, GF_LOG_INFO,</div><div class='add'>+           "Migration operation on dir %s took "</div><div class='add'>+           "%.2f secs",</div><div class='add'>+           loc-&gt;path, elapsed / 1e6);</div><div class='add'>+    ret = 0;</div><div class='add'>+out:</div><div class='add'>+    THIS = old_THIS;</div><div class='add'>+    gf_defrag_free_dir_dfmeta(dir_dfmeta, local_subvols_cnt);</div><div class='add'>+</div><div class='add'>+    if (xattr_req)</div><div class='add'>+        dict_unref(xattr_req);</div><div class='add'>+</div><div class='add'>+    /* It does not matter if it errored out - this number is</div><div class='add'>+     * used to calculate rebalance estimated time to complete.</div><div class='add'>+     * No locking required as dirs are processed by a single thread.</div><div class='add'>+     */</div><div class='add'>+    defrag-&gt;num_dirs_processed++;</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+gf_defrag_settle_hash(xlator_t *this, gf_defrag_info_t *defrag, loc_t *loc,</div><div class='add'>+                      dict_t *fix_layout)</div><div class='add'>+{</div><div class='add'>+    int ret;</div><div class='add'>+    dht_conf_t *conf = NULL;</div><div class='add'>+    /*</div><div class='add'>+     * Now we're ready to update the directory commit hash for the volume</div><div class='add'>+     * root, so that hash miscompares and broadcast lookups can stop.</div><div class='add'>+     * However, we want to skip that if fix-layout is all we did.  In</div><div class='add'>+     * that case, we want the miscompares etc. to continue until a real</div><div class='add'>+     * rebalance is complete.</div><div class='add'>+     */</div><div class='add'>+    if (defrag-&gt;cmd == GF_DEFRAG_CMD_START_LAYOUT_FIX ||</div><div class='add'>+        defrag-&gt;cmd == GF_DEFRAG_CMD_DETACH_START) {</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    conf = this-&gt;private;</div><div class='add'>+    if (!conf) {</div><div class='add'>+        /*Uh oh</div><div class='add'>+         */</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (conf-&gt;local_subvols_cnt == 0 || !conf-&gt;lookup_optimize) {</div><div class='add'>+        /* Commit hash updates are only done on local subvolumes and</div><div class='add'>+         * only when lookup optimization is needed (for older client</div><div class='add'>+         * support)</div><div class='add'>+         */</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_set_uint32(fix_layout, "new-commit-hash",</div><div class='add'>+                          defrag-&gt;new_commit_hash);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log(this-&gt;name, GF_LOG_ERROR, "Failed to set new-commit-hash");</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = syncop_setxattr(this, loc, fix_layout, 0, NULL, NULL);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_ERROR, -ret, DHT_MSG_LAYOUT_FIX_FAILED,</div><div class='add'>+               "fix layout on %s failed", loc-&gt;path);</div><div class='add'>+</div><div class='add'>+        if (-ret == ENOENT || -ret == ESTALE) {</div><div class='add'>+            /* Dir most likely is deleted */</div><div class='add'>+            return 0;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* TBD: find more efficient solution than adding/deleting every time */</div><div class='add'>+    dict_del(fix_layout, "new-commit-hash");</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+gf_defrag_fix_layout(xlator_t *this, gf_defrag_info_t *defrag, loc_t *loc,</div><div class='add'>+                     dict_t *fix_layout, dict_t *migrate_data)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    loc_t entry_loc = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    fd_t *fd = NULL;</div><div class='add'>+    gf_dirent_t entries;</div><div class='add'>+    gf_dirent_t *tmp = NULL;</div><div class='add'>+    gf_dirent_t *entry = NULL;</div><div class='add'>+    gf_boolean_t free_entries = _gf_false;</div><div class='add'>+    off_t offset = 0;</div><div class='add'>+    struct iatt iatt = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    inode_t *linked_inode = NULL, *inode = NULL;</div><div class='add'>+    dht_conf_t *conf = NULL;</div><div class='add'>+    int perrno = 0;</div><div class='add'>+</div><div class='add'>+    conf = this-&gt;private;</div><div class='add'>+    if (!conf) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = syncop_lookup(this, loc, &amp;iatt, NULL, NULL, NULL);</div><div class='add'>+    if (ret) {</div><div class='add'>+        if (strcmp(loc-&gt;path, "/") == 0) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, -ret, DHT_MSG_DIR_LOOKUP_FAILED,</div><div class='add'>+                   "lookup failed for:%s", loc-&gt;path);</div><div class='add'>+</div><div class='add'>+            defrag-&gt;total_failures++;</div><div class='add'>+            ret = -1;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        if (-ret == ENOENT || -ret == ESTALE) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_INFO, -ret, DHT_MSG_DIR_LOOKUP_FAILED,</div><div class='add'>+                   "Dir:%s renamed or removed. Skipping", loc-&gt;path);</div><div class='add'>+            if (conf-&gt;decommission_subvols_cnt) {</div><div class='add'>+                defrag-&gt;total_failures++;</div><div class='add'>+            }</div><div class='add'>+            ret = 0;</div><div class='add'>+            goto out;</div><div class='add'>+        } else {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, -ret, DHT_MSG_DIR_LOOKUP_FAILED,</div><div class='add'>+                   "lookup failed for:%s", loc-&gt;path);</div><div class='add'>+</div><div class='add'>+            defrag-&gt;total_failures++;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    fd = fd_create(loc-&gt;inode, defrag-&gt;pid);</div><div class='add'>+    if (!fd) {</div><div class='add'>+        gf_log(this-&gt;name, GF_LOG_ERROR, "Failed to create fd");</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = syncop_opendir(this, loc, fd, NULL, NULL);</div><div class='add'>+    if (ret) {</div><div class='add'>+        if (-ret == ENOENT || -ret == ESTALE) {</div><div class='add'>+            if (conf-&gt;decommission_subvols_cnt) {</div><div class='add'>+                defrag-&gt;total_failures++;</div><div class='add'>+            }</div><div class='add'>+            ret = 0;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        gf_log(this-&gt;name, GF_LOG_ERROR,</div><div class='add'>+               "Failed to open dir %s, "</div><div class='add'>+               "err:%d",</div><div class='add'>+               loc-&gt;path, -ret);</div><div class='add'>+</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    fd_bind(fd);</div><div class='add'>+    INIT_LIST_HEAD(&amp;entries.list);</div><div class='add'>+</div><div class='add'>+    while ((ret = syncop_readdirp(this, fd, 131072, offset, &amp;entries, NULL,</div><div class='add'>+                                  NULL)) != 0) {</div><div class='add'>+        if (ret &lt; 0) {</div><div class='add'>+            if (-ret == ENOENT || -ret == ESTALE) {</div><div class='add'>+                if (conf-&gt;decommission_subvols_cnt) {</div><div class='add'>+                    defrag-&gt;total_failures++;</div><div class='add'>+                }</div><div class='add'>+                ret = 0;</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, -ret, DHT_MSG_READDIR_ERROR,</div><div class='add'>+                   "readdirp failed for "</div><div class='add'>+                   "path %s. Aborting fix-layout",</div><div class='add'>+                   loc-&gt;path);</div><div class='add'>+</div><div class='add'>+            ret = -1;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        if (list_empty(&amp;entries.list))</div><div class='add'>+            break;</div><div class='add'>+</div><div class='add'>+        free_entries = _gf_true;</div><div class='add'>+</div><div class='add'>+        list_for_each_entry_safe(entry, tmp, &amp;entries.list, list)</div><div class='add'>+        {</div><div class='add'>+            if (defrag-&gt;defrag_status != GF_DEFRAG_STATUS_STARTED) {</div><div class='add'>+                ret = 1;</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            offset = entry-&gt;d_off;</div><div class='add'>+</div><div class='add'>+            if (!strcmp(entry-&gt;d_name, ".") || !strcmp(entry-&gt;d_name, ".."))</div><div class='add'>+                continue;</div><div class='add'>+            if (!IA_ISDIR(entry-&gt;d_stat.ia_type)) {</div><div class='add'>+                continue;</div><div class='add'>+            }</div><div class='add'>+            loc_wipe(&amp;entry_loc);</div><div class='add'>+</div><div class='add'>+            ret = dht_build_child_loc(this, &amp;entry_loc, loc, entry-&gt;d_name);</div><div class='add'>+            if (ret) {</div><div class='add'>+                gf_log(this-&gt;name, GF_LOG_ERROR,</div><div class='add'>+                       "Child loc"</div><div class='add'>+                       " build failed for entry: %s",</div><div class='add'>+                       entry-&gt;d_name);</div><div class='add'>+</div><div class='add'>+                if (conf-&gt;decommission_in_progress) {</div><div class='add'>+                    defrag-&gt;defrag_status = GF_DEFRAG_STATUS_FAILED;</div><div class='add'>+</div><div class='add'>+                    goto out;</div><div class='add'>+                } else {</div><div class='add'>+                    continue;</div><div class='add'>+                }</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            if (gf_uuid_is_null(entry-&gt;d_stat.ia_gfid)) {</div><div class='add'>+                gf_log(this-&gt;name, GF_LOG_ERROR,</div><div class='add'>+                       "%s/%s"</div><div class='add'>+                       " gfid not present",</div><div class='add'>+                       loc-&gt;path, entry-&gt;d_name);</div><div class='add'>+                continue;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            gf_uuid_copy(entry_loc.gfid, entry-&gt;d_stat.ia_gfid);</div><div class='add'>+</div><div class='add'>+            /*In case the gfid stored in the inode by inode_link</div><div class='add'>+             * and the gfid obtained in the lookup differs, then</div><div class='add'>+             * client3_3_lookup_cbk will return ESTALE and proper</div><div class='add'>+             * error will be captured</div><div class='add'>+             */</div><div class='add'>+</div><div class='add'>+            linked_inode = inode_link(entry_loc.inode, loc-&gt;inode,</div><div class='add'>+                                      entry-&gt;d_name, &amp;entry-&gt;d_stat);</div><div class='add'>+</div><div class='add'>+            inode = entry_loc.inode;</div><div class='add'>+            entry_loc.inode = linked_inode;</div><div class='add'>+            inode_unref(inode);</div><div class='add'>+</div><div class='add'>+            if (gf_uuid_is_null(loc-&gt;gfid)) {</div><div class='add'>+                gf_log(this-&gt;name, GF_LOG_ERROR,</div><div class='add'>+                       "%s/%s"</div><div class='add'>+                       " gfid not present",</div><div class='add'>+                       loc-&gt;path, entry-&gt;d_name);</div><div class='add'>+                continue;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            gf_uuid_copy(entry_loc.pargfid, loc-&gt;gfid);</div><div class='add'>+</div><div class='add'>+            ret = syncop_lookup(this, &amp;entry_loc, &amp;iatt, NULL, NULL, NULL);</div><div class='add'>+            if (ret) {</div><div class='add'>+                if (-ret == ENOENT || -ret == ESTALE) {</div><div class='add'>+                    gf_msg(this-&gt;name, GF_LOG_INFO, -ret,</div><div class='add'>+                           DHT_MSG_DIR_LOOKUP_FAILED,</div><div class='add'>+                           "Dir:%s renamed or removed. "</div><div class='add'>+                           "Skipping",</div><div class='add'>+                           loc-&gt;path);</div><div class='add'>+                    ret = 0;</div><div class='add'>+                    if (conf-&gt;decommission_subvols_cnt) {</div><div class='add'>+                        defrag-&gt;total_failures++;</div><div class='add'>+                    }</div><div class='add'>+                    continue;</div><div class='add'>+                } else {</div><div class='add'>+                    gf_msg(this-&gt;name, GF_LOG_ERROR, -ret,</div><div class='add'>+                           DHT_MSG_DIR_LOOKUP_FAILED, "lookup failed for:%s",</div><div class='add'>+                           entry_loc.path);</div><div class='add'>+</div><div class='add'>+                    defrag-&gt;total_failures++;</div><div class='add'>+</div><div class='add'>+                    if (conf-&gt;decommission_in_progress) {</div><div class='add'>+                        defrag-&gt;defrag_status = GF_DEFRAG_STATUS_FAILED;</div><div class='add'>+                        ret = -1;</div><div class='add'>+                        goto out;</div><div class='add'>+                    } else {</div><div class='add'>+                        continue;</div><div class='add'>+                    }</div><div class='add'>+                }</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            /* A return value of 2 means, either process_dir or</div><div class='add'>+             * lookup of a dir failed. Hence, don't commit hash</div><div class='add'>+             * for the current directory*/</div><div class='add'>+</div><div class='add'>+            ret = gf_defrag_fix_layout(this, defrag, &amp;entry_loc, fix_layout,</div><div class='add'>+                                       migrate_data);</div><div class='add'>+</div><div class='add'>+            if (defrag-&gt;defrag_status == GF_DEFRAG_STATUS_STOPPED ||</div><div class='add'>+                defrag-&gt;defrag_status == GF_DEFRAG_STATUS_FAILED) {</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            if (ret) {</div><div class='add'>+                gf_msg(this-&gt;name, GF_LOG_ERROR, 0, DHT_MSG_LAYOUT_FIX_FAILED,</div><div class='add'>+                       "Fix layout failed for %s", entry_loc.path);</div><div class='add'>+</div><div class='add'>+                defrag-&gt;total_failures++;</div><div class='add'>+</div><div class='add'>+                if (conf-&gt;decommission_in_progress) {</div><div class='add'>+                    defrag-&gt;defrag_status = GF_DEFRAG_STATUS_FAILED;</div><div class='add'>+</div><div class='add'>+                    goto out;</div><div class='add'>+                } else {</div><div class='add'>+                    /* Let's not commit-hash if</div><div class='add'>+                     * gf_defrag_fix_layout failed*/</div><div class='add'>+                    continue;</div><div class='add'>+                }</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        gf_dirent_free(&amp;entries);</div><div class='add'>+        free_entries = _gf_false;</div><div class='add'>+        INIT_LIST_HEAD(&amp;entries.list);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* A directory layout is fixed only after its subdirs are healed to</div><div class='add'>+     * any newly added bricks. If the layout is fixed before subdirs are</div><div class='add'>+     * healed, the newly added brick will get a non-null layout.</div><div class='add'>+     * Any subdirs which hash to that layout will no longer show up</div><div class='add'>+     * in a directory listing until they are healed.</div><div class='add'>+     */</div><div class='add'>+</div><div class='add'>+    ret = syncop_setxattr(this, loc, fix_layout, 0, NULL, NULL);</div><div class='add'>+</div><div class='add'>+    /* In case of a race where the directory is deleted just before</div><div class='add'>+     * layout setxattr, the errors are updated in the layout structure.</div><div class='add'>+     * We can use this information to make a decision whether the directory</div><div class='add'>+     * is deleted entirely.</div><div class='add'>+     */</div><div class='add'>+    if (ret == 0) {</div><div class='add'>+        ret = dht_dir_layout_error_check(this, loc-&gt;inode);</div><div class='add'>+        ret = -ret;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (ret) {</div><div class='add'>+        if (-ret == ENOENT || -ret == ESTALE) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_INFO, -ret, DHT_MSG_LAYOUT_FIX_FAILED,</div><div class='add'>+                   "Setxattr failed. Dir %s "</div><div class='add'>+                   "renamed or removed",</div><div class='add'>+                   loc-&gt;path);</div><div class='add'>+            if (conf-&gt;decommission_subvols_cnt) {</div><div class='add'>+                defrag-&gt;total_failures++;</div><div class='add'>+            }</div><div class='add'>+            ret = 0;</div><div class='add'>+            goto out;</div><div class='add'>+        } else {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, -ret, DHT_MSG_LAYOUT_FIX_FAILED,</div><div class='add'>+                   "Setxattr failed for %s", loc-&gt;path);</div><div class='add'>+</div><div class='add'>+            defrag-&gt;total_failures++;</div><div class='add'>+</div><div class='add'>+            if (conf-&gt;decommission_in_progress) {</div><div class='add'>+                defrag-&gt;defrag_status = GF_DEFRAG_STATUS_FAILED;</div><div class='add'>+                ret = -1;</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (defrag-&gt;cmd != GF_DEFRAG_CMD_START_LAYOUT_FIX) {</div><div class='add'>+        ret = gf_defrag_process_dir(this, defrag, loc, migrate_data, &amp;perrno);</div><div class='add'>+</div><div class='add'>+        if (ret) {</div><div class='add'>+            if (perrno == ENOENT || perrno == ESTALE) {</div><div class='add'>+                ret = 0;</div><div class='add'>+                goto out;</div><div class='add'>+            } else {</div><div class='add'>+                defrag-&gt;total_failures++;</div><div class='add'>+</div><div class='add'>+                gf_msg(this-&gt;name, GF_LOG_ERROR, 0,</div><div class='add'>+                       DHT_MSG_DEFRAG_PROCESS_DIR_FAILED,</div><div class='add'>+                       "gf_defrag_process_dir failed for "</div><div class='add'>+                       "directory: %s",</div><div class='add'>+                       loc-&gt;path);</div><div class='add'>+</div><div class='add'>+                if (conf-&gt;decommission_in_progress) {</div><div class='add'>+                    goto out;</div><div class='add'>+                }</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    gf_msg_trace(this-&gt;name, 0, "fix layout called on %s", loc-&gt;path);</div><div class='add'>+</div><div class='add'>+    if (gf_defrag_settle_hash(this, defrag, loc, fix_layout) != 0) {</div><div class='add'>+        defrag-&gt;total_failures++;</div><div class='add'>+</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_ERROR, 0, DHT_MSG_SETTLE_HASH_FAILED,</div><div class='add'>+               "Settle hash failed for %s", loc-&gt;path);</div><div class='add'>+</div><div class='add'>+        ret = -1;</div><div class='add'>+</div><div class='add'>+        if (conf-&gt;decommission_in_progress) {</div><div class='add'>+            defrag-&gt;defrag_status = GF_DEFRAG_STATUS_FAILED;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+out:</div><div class='add'>+    if (free_entries)</div><div class='add'>+        gf_dirent_free(&amp;entries);</div><div class='add'>+</div><div class='add'>+    loc_wipe(&amp;entry_loc);</div><div class='add'>+</div><div class='add'>+    if (fd)</div><div class='add'>+        fd_unref(fd);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+dht_init_local_subvols_and_nodeuuids(xlator_t *this, dht_conf_t *conf,</div><div class='add'>+                                     loc_t *loc)</div><div class='add'>+{</div><div class='add'>+    dict_t *dict = NULL;</div><div class='add'>+    uuid_t *uuid_ptr = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int i = 0;</div><div class='add'>+    int j = 0;</div><div class='add'>+</div><div class='add'>+    /* Find local subvolumes */</div><div class='add'>+    ret = syncop_getxattr(this, loc, &amp;dict, GF_REBAL_FIND_LOCAL_SUBVOL, NULL,</div><div class='add'>+                          NULL);</div><div class='add'>+    if (ret &amp;&amp; (ret != -ENODATA)) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_ERROR, -ret, 0,</div><div class='add'>+               "local "</div><div class='add'>+               "subvolume determination failed with error: %d",</div><div class='add'>+               -ret);</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (!ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    ret = syncop_getxattr(this, loc, &amp;dict, GF_REBAL_OLD_FIND_LOCAL_SUBVOL,</div><div class='add'>+                          NULL, NULL);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_ERROR, -ret, 0,</div><div class='add'>+               "local "</div><div class='add'>+               "subvolume determination failed with error: %d",</div><div class='add'>+               -ret);</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    ret = 0;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (ret) {</div><div class='add'>+        return ret;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; conf-&gt;local_subvols_cnt; i++) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_INFO, 0, 0,</div><div class='add'>+               "local subvol: "</div><div class='add'>+               "%s",</div><div class='add'>+               conf-&gt;local_subvols[i]-&gt;name);</div><div class='add'>+</div><div class='add'>+        for (j = 0; j &lt; conf-&gt;local_nodeuuids[i].count; j++) {</div><div class='add'>+            uuid_ptr = &amp;(conf-&gt;local_nodeuuids[i].elements[j].uuid);</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_INFO, 0, 0, "node uuid : %s",</div><div class='add'>+                   uuid_utoa(*uuid_ptr));</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* Functions for the rebalance estimates feature */</div><div class='add'>+</div><div class='add'>+uint64_t</div><div class='add'>+gf_defrag_subvol_file_size(xlator_t *this, loc_t *root_loc)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    struct statvfs buf = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    ret = syncop_statfs(this, root_loc, &amp;buf, NULL, NULL);</div><div class='add'>+    if (ret) {</div><div class='add'>+        /* Aargh! */</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='add'>+    return ((buf.f_blocks - buf.f_bfree) * buf.f_frsize);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+uint64_t</div><div class='add'>+gf_defrag_total_file_size(xlator_t *this, loc_t *root_loc)</div><div class='add'>+{</div><div class='add'>+    dht_conf_t *conf = NULL;</div><div class='add'>+    int i = 0;</div><div class='add'>+    uint64_t size_files = 0;</div><div class='add'>+    uint64_t total_size = 0;</div><div class='add'>+</div><div class='add'>+    conf = this-&gt;private;</div><div class='add'>+    if (!conf) {</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; conf-&gt;local_subvols_cnt; i++) {</div><div class='add'>+        size_files = gf_defrag_subvol_file_size(conf-&gt;local_subvols[i],</div><div class='add'>+                                                root_loc);</div><div class='add'>+        total_size += size_files;</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_INFO, 0, 0,</div><div class='add'>+               "local subvol: %s,"</div><div class='add'>+               "cnt = %" PRIu64,</div><div class='add'>+               conf-&gt;local_subvols[i]-&gt;name, size_files);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    gf_msg(this-&gt;name, GF_LOG_INFO, 0, 0, "Total size files = %" PRIu64,</div><div class='add'>+           total_size);</div><div class='add'>+</div><div class='add'>+    return total_size;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void *</div><div class='add'>+dht_file_counter_thread(void *args)</div><div class='add'>+{</div><div class='add'>+    gf_defrag_info_t *defrag = NULL;</div><div class='add'>+    loc_t root_loc = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    struct timespec time_to_wait = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    uint64_t tmp_size = 0;</div><div class='add'>+</div><div class='add'>+    if (!args)</div><div class='add'>+        return NULL;</div><div class='add'>+</div><div class='add'>+    defrag = (gf_defrag_info_t *)args;</div><div class='add'>+    dht_build_root_loc(defrag-&gt;root_inode, &amp;root_loc);</div><div class='add'>+</div><div class='add'>+    while (defrag-&gt;defrag_status == GF_DEFRAG_STATUS_STARTED) {</div><div class='add'>+        timespec_now(&amp;time_to_wait);</div><div class='add'>+        time_to_wait.tv_sec += 600;</div><div class='add'>+</div><div class='add'>+        pthread_mutex_lock(&amp;defrag-&gt;fc_mutex);</div><div class='add'>+        pthread_cond_timedwait(&amp;defrag-&gt;fc_wakeup_cond, &amp;defrag-&gt;fc_mutex,</div><div class='add'>+                               &amp;time_to_wait);</div><div class='add'>+</div><div class='add'>+        pthread_mutex_unlock(&amp;defrag-&gt;fc_mutex);</div><div class='add'>+</div><div class='add'>+        if (defrag-&gt;defrag_status != GF_DEFRAG_STATUS_STARTED)</div><div class='add'>+            break;</div><div class='add'>+</div><div class='add'>+        tmp_size = gf_defrag_total_file_size(defrag-&gt;this, &amp;root_loc);</div><div class='add'>+</div><div class='add'>+        gf_log("dht", GF_LOG_INFO, "tmp data size =%" PRIu64, tmp_size);</div><div class='add'>+</div><div class='add'>+        if (!tmp_size) {</div><div class='add'>+            gf_msg("dht", GF_LOG_ERROR, 0, 0,</div><div class='add'>+                   "Failed to get "</div><div class='add'>+                   "the total data size. Unable to estimate "</div><div class='add'>+                   "time to complete rebalance.");</div><div class='add'>+        } else {</div><div class='add'>+            g_totalsize = tmp_size;</div><div class='add'>+            gf_msg_debug("dht", 0, "total data size =%" PRIu64, g_totalsize);</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return NULL;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+gf_defrag_estimates_cleanup(xlator_t *this, gf_defrag_info_t *defrag,</div><div class='add'>+                            pthread_t filecnt_thread)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    /* Wake up the filecounter thread.</div><div class='add'>+     * By now the defrag status will no longer be</div><div class='add'>+     * GF_DEFRAG_STATUS_STARTED so the thread will exit the loop.</div><div class='add'>+     */</div><div class='add'>+    pthread_mutex_lock(&amp;defrag-&gt;fc_mutex);</div><div class='add'>+    {</div><div class='add'>+        pthread_cond_broadcast(&amp;defrag-&gt;fc_wakeup_cond);</div><div class='add'>+    }</div><div class='add'>+    pthread_mutex_unlock(&amp;defrag-&gt;fc_mutex);</div><div class='add'>+</div><div class='add'>+    ret = pthread_join(filecnt_thread, NULL);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_msg("dht", GF_LOG_ERROR, ret, 0,</div><div class='add'>+               "file_counter_thread: pthread_join failed.");</div><div class='add'>+        ret = -1;</div><div class='add'>+    }</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+gf_defrag_estimates_init(xlator_t *this, loc_t *loc, pthread_t *filecnt_thread)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    dht_conf_t *conf = NULL;</div><div class='add'>+    gf_defrag_info_t *defrag = NULL;</div><div class='add'>+</div><div class='add'>+    conf = this-&gt;private;</div><div class='add'>+    defrag = conf-&gt;defrag;</div><div class='add'>+</div><div class='add'>+    g_totalsize = gf_defrag_total_file_size(this, loc);</div><div class='add'>+    if (!g_totalsize) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_ERROR, 0, 0,</div><div class='add'>+               "Failed to get "</div><div class='add'>+               "the total data size. Unable to estimate "</div><div class='add'>+               "time to complete rebalance.");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = gf_thread_create(filecnt_thread, NULL, dht_file_counter_thread,</div><div class='add'>+                           (void *)defrag, "dhtfcnt");</div><div class='add'>+</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_ERROR, ret, 0,</div><div class='add'>+               "Failed to "</div><div class='add'>+               "create the file counter thread ");</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    ret = 0;</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* Init and cleanup functions for parallel file migration*/</div><div class='add'>+int</div><div class='add'>+gf_defrag_parallel_migration_init(xlator_t *this, gf_defrag_info_t *defrag,</div><div class='add'>+                                  pthread_t **tid_array, int *thread_index)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int thread_spawn_count = 0;</div><div class='add'>+    int index = 0;</div><div class='add'>+    pthread_t *tid = NULL;</div><div class='add'>+</div><div class='add'>+    if (!defrag)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    /* Initialize global entry queue */</div><div class='add'>+    defrag-&gt;queue = GF_CALLOC(1, sizeof(struct dht_container),</div><div class='add'>+                              gf_dht_mt_container_t);</div><div class='add'>+</div><div class='add'>+    if (!defrag-&gt;queue) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_ERROR, ENOMEM, 0,</div><div class='add'>+               "Failed to initialise migration queue");</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    INIT_LIST_HEAD(&amp;(defrag-&gt;queue[0].list));</div><div class='add'>+</div><div class='add'>+    thread_spawn_count = MAX(MAX_REBAL_THREADS, 4);</div><div class='add'>+</div><div class='add'>+    gf_msg_debug(this-&gt;name, 0, "thread_spawn_count: %d", thread_spawn_count);</div><div class='add'>+</div><div class='add'>+    tid = GF_CALLOC(thread_spawn_count, sizeof(pthread_t),</div><div class='add'>+                    gf_common_mt_pthread_t);</div><div class='add'>+    if (!tid) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_ERROR, ENOMEM, 0,</div><div class='add'>+               "Failed to create migration threads");</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    defrag-&gt;current_thread_count = thread_spawn_count;</div><div class='add'>+</div><div class='add'>+    /*Spawn Threads Here*/</div><div class='add'>+    while (index &lt; thread_spawn_count) {</div><div class='add'>+        ret = gf_thread_create(&amp;(tid[index]), NULL, gf_defrag_task,</div><div class='add'>+                               (void *)defrag, "dhtmig%d", (index + 1) &amp; 0x3ff);</div><div class='add'>+        if (ret != 0) {</div><div class='add'>+            gf_msg("DHT", GF_LOG_ERROR, ret, 0, "Thread[%d] creation failed. ",</div><div class='add'>+                   index);</div><div class='add'>+            ret = -1;</div><div class='add'>+            goto out;</div><div class='add'>+        } else {</div><div class='add'>+            gf_log("DHT", GF_LOG_INFO,</div><div class='add'>+                   "Thread[%d] "</div><div class='add'>+                   "creation successful",</div><div class='add'>+                   index);</div><div class='add'>+        }</div><div class='add'>+        index++;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+out:</div><div class='add'>+    *thread_index = index;</div><div class='add'>+    *tid_array = tid;</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+gf_defrag_parallel_migration_cleanup(gf_defrag_info_t *defrag,</div><div class='add'>+                                     pthread_t *tid_array, int thread_index)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int i = 0;</div><div class='add'>+</div><div class='add'>+    if (!defrag)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    /* Wake up all migration threads */</div><div class='add'>+    pthread_mutex_lock(&amp;defrag-&gt;dfq_mutex);</div><div class='add'>+    {</div><div class='add'>+        defrag-&gt;crawl_done = 1;</div><div class='add'>+</div><div class='add'>+        pthread_cond_broadcast(&amp;defrag-&gt;parallel_migration_cond);</div><div class='add'>+        pthread_cond_broadcast(&amp;defrag-&gt;df_wakeup_thread);</div><div class='add'>+    }</div><div class='add'>+    pthread_mutex_unlock(&amp;defrag-&gt;dfq_mutex);</div><div class='add'>+</div><div class='add'>+    /*Wait for all the threads to complete their task*/</div><div class='add'>+    for (i = 0; i &lt; thread_index; i++) {</div><div class='add'>+        pthread_join(tid_array[i], NULL);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    GF_FREE(tid_array);</div><div class='add'>+</div><div class='add'>+    /* Cleanup the migration queue */</div><div class='add'>+    if (defrag-&gt;queue) {</div><div class='add'>+        gf_dirent_free(defrag-&gt;queue[0].df_entry);</div><div class='add'>+        INIT_LIST_HEAD(&amp;(defrag-&gt;queue[0].list));</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    GF_FREE(defrag-&gt;queue);</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+gf_defrag_start_crawl(void *data)</div><div class='add'>+{</div><div class='add'>+    xlator_t *this = NULL;</div><div class='add'>+    dht_conf_t *conf = NULL;</div><div class='add'>+    gf_defrag_info_t *defrag = NULL;</div><div class='add'>+    dict_t *fix_layout = NULL;</div><div class='add'>+    dict_t *migrate_data = NULL;</div><div class='add'>+    dict_t *status = NULL;</div><div class='add'>+    glusterfs_ctx_t *ctx = NULL;</div><div class='add'>+    call_frame_t *statfs_frame = NULL;</div><div class='add'>+    xlator_t *old_THIS = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    loc_t loc = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    struct iatt iatt = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    struct iatt parent = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int thread_index = 0;</div><div class='add'>+    pthread_t *tid = NULL;</div><div class='add'>+    pthread_t filecnt_thread;</div><div class='add'>+    gf_boolean_t fc_thread_started = _gf_false;</div><div class='add'>+</div><div class='add'>+    this = data;</div><div class='add'>+    if (!this)</div><div class='add'>+        goto exit;</div><div class='add'>+</div><div class='add'>+    ctx = this-&gt;ctx;</div><div class='add'>+    if (!ctx)</div><div class='add'>+        goto exit;</div><div class='add'>+</div><div class='add'>+    conf = this-&gt;private;</div><div class='add'>+    if (!conf)</div><div class='add'>+        goto exit;</div><div class='add'>+</div><div class='add'>+    defrag = conf-&gt;defrag;</div><div class='add'>+    if (!defrag)</div><div class='add'>+        goto exit;</div><div class='add'>+</div><div class='add'>+    defrag-&gt;start_time = gf_time();</div><div class='add'>+</div><div class='add'>+    dht_build_root_inode(this, &amp;defrag-&gt;root_inode);</div><div class='add'>+    if (!defrag-&gt;root_inode)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    dht_build_root_loc(defrag-&gt;root_inode, &amp;loc);</div><div class='add'>+</div><div class='add'>+    /* fix-layout on '/' first */</div><div class='add'>+</div><div class='add'>+    ret = syncop_lookup(this, &amp;loc, &amp;iatt, &amp;parent, NULL, NULL);</div><div class='add'>+</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_ERROR, -ret, DHT_MSG_REBALANCE_START_FAILED,</div><div class='add'>+               "Failed to start rebalance: look up on / failed");</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    old_THIS = THIS;</div><div class='add'>+    THIS = this;</div><div class='add'>+</div><div class='add'>+    statfs_frame = create_frame(this, this-&gt;ctx-&gt;pool);</div><div class='add'>+    if (!statfs_frame) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_ERROR, DHT_MSG_NO_MEMORY, ENOMEM,</div><div class='add'>+               "Insufficient memory. Frame creation failed");</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* async statfs update for honoring min-free-disk */</div><div class='add'>+    dht_get_du_info(statfs_frame, this, &amp;loc);</div><div class='add'>+    THIS = old_THIS;</div><div class='add'>+</div><div class='add'>+    fix_layout = dict_new();</div><div class='add'>+    if (!fix_layout) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /*</div><div class='add'>+     * Unfortunately, we can't do special xattrs (like fix.layout) and</div><div class='add'>+     * real ones in the same call currently, and changing it seems</div><div class='add'>+     * riskier than just doing two calls.</div><div class='add'>+     */</div><div class='add'>+</div><div class='add'>+    gf_log(this-&gt;name, GF_LOG_INFO, "%s using commit hash %u", __func__,</div><div class='add'>+           conf-&gt;vol_commit_hash);</div><div class='add'>+</div><div class='add'>+    ret = dict_set_uint32(fix_layout, conf-&gt;commithash_xattr_name,</div><div class='add'>+                          conf-&gt;vol_commit_hash);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log(this-&gt;name, GF_LOG_ERROR, "Failed to set %s",</div><div class='add'>+               conf-&gt;commithash_xattr_name);</div><div class='add'>+        defrag-&gt;total_failures++;</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = syncop_setxattr(this, &amp;loc, fix_layout, 0, NULL, NULL);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log(this-&gt;name, GF_LOG_ERROR,</div><div class='add'>+               "Failed to set commit hash on %s. "</div><div class='add'>+               "Rebalance cannot proceed.",</div><div class='add'>+               loc.path);</div><div class='add'>+        defrag-&gt;total_failures++;</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* We now return to our regularly scheduled program. */</div><div class='add'>+</div><div class='add'>+    ret = dict_set_str(fix_layout, GF_XATTR_FIX_LAYOUT_KEY, "yes");</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_ERROR, 0, DHT_MSG_REBALANCE_START_FAILED,</div><div class='add'>+               "Failed to start rebalance:"</div><div class='add'>+               "Failed to set dictionary value: key = %s",</div><div class='add'>+               GF_XATTR_FIX_LAYOUT_KEY);</div><div class='add'>+        defrag-&gt;total_failures++;</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    defrag-&gt;new_commit_hash = conf-&gt;vol_commit_hash;</div><div class='add'>+</div><div class='add'>+    ret = syncop_setxattr(this, &amp;loc, fix_layout, 0, NULL, NULL);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_ERROR, -ret, DHT_MSG_REBALANCE_FAILED,</div><div class='add'>+               "fix layout on %s failed", loc.path);</div><div class='add'>+        defrag-&gt;total_failures++;</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (defrag-&gt;cmd != GF_DEFRAG_CMD_START_LAYOUT_FIX) {</div><div class='add'>+        /* We need to migrate files */</div><div class='add'>+</div><div class='add'>+        migrate_data = dict_new();</div><div class='add'>+        if (!migrate_data) {</div><div class='add'>+            defrag-&gt;total_failures++;</div><div class='add'>+            ret = -1;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+        ret = dict_set_str(</div><div class='add'>+            migrate_data, GF_XATTR_FILE_MIGRATE_KEY,</div><div class='add'>+            (defrag-&gt;cmd == GF_DEFRAG_CMD_START_FORCE) ? "force" : "non-force");</div><div class='add'>+        if (ret) {</div><div class='add'>+            defrag-&gt;total_failures++;</div><div class='add'>+            ret = -1;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        ret = dht_init_local_subvols_and_nodeuuids(this, conf, &amp;loc);</div><div class='add'>+        if (ret) {</div><div class='add'>+            ret = -1;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        /* Initialise the structures required for parallel migration */</div><div class='add'>+        ret = gf_defrag_parallel_migration_init(this, defrag, &amp;tid,</div><div class='add'>+                                                &amp;thread_index);</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, 0, 0, "Aborting rebalance.");</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        ret = gf_defrag_estimates_init(this, &amp;loc, &amp;filecnt_thread);</div><div class='add'>+        if (ret) {</div><div class='add'>+            /* Not a fatal error. Allow the rebalance to proceed*/</div><div class='add'>+            ret = 0;</div><div class='add'>+        } else {</div><div class='add'>+            fc_thread_started = _gf_true;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = gf_defrag_fix_layout(this, defrag, &amp;loc, fix_layout, migrate_data);</div><div class='add'>+    if (ret) {</div><div class='add'>+        defrag-&gt;total_failures++;</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (gf_defrag_settle_hash(this, defrag, &amp;loc, fix_layout) != 0) {</div><div class='add'>+        defrag-&gt;total_failures++;</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    gf_log("DHT", GF_LOG_INFO, "crawling file-system completed");</div><div class='add'>+out:</div><div class='add'>+</div><div class='add'>+    /* We are here means crawling the entire file system is done</div><div class='add'>+       or something failed. Set defrag-&gt;crawl_done flag to intimate</div><div class='add'>+       the migrator threads to exhaust the defrag-&gt;queue and terminate*/</div><div class='add'>+</div><div class='add'>+    if (ret) {</div><div class='add'>+        defrag-&gt;defrag_status = GF_DEFRAG_STATUS_FAILED;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    gf_defrag_parallel_migration_cleanup(defrag, tid, thread_index);</div><div class='add'>+</div><div class='add'>+    if ((defrag-&gt;defrag_status != GF_DEFRAG_STATUS_STOPPED) &amp;&amp;</div><div class='add'>+        (defrag-&gt;defrag_status != GF_DEFRAG_STATUS_FAILED)) {</div><div class='add'>+        defrag-&gt;defrag_status = GF_DEFRAG_STATUS_COMPLETE;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (fc_thread_started) {</div><div class='add'>+        gf_defrag_estimates_cleanup(this, defrag, filecnt_thread);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    dht_send_rebalance_event(this, defrag-&gt;cmd, defrag-&gt;defrag_status);</div><div class='add'>+</div><div class='add'>+    status = dict_new();</div><div class='add'>+    LOCK(&amp;defrag-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        gf_defrag_status_get(conf, status);</div><div class='add'>+        if (ctx &amp;&amp; ctx-&gt;notify)</div><div class='add'>+            ctx-&gt;notify(GF_EN_DEFRAG_STATUS, status);</div><div class='add'>+        if (status)</div><div class='add'>+            dict_unref(status);</div><div class='add'>+        defrag-&gt;is_exiting = 1;</div><div class='add'>+    }</div><div class='add'>+    UNLOCK(&amp;defrag-&gt;lock);</div><div class='add'>+</div><div class='add'>+    GF_FREE(defrag);</div><div class='add'>+    conf-&gt;defrag = NULL;</div><div class='add'>+</div><div class='add'>+    if (migrate_data)</div><div class='add'>+        dict_unref(migrate_data);</div><div class='add'>+</div><div class='add'>+    if (statfs_frame) {</div><div class='add'>+        STACK_DESTROY(statfs_frame-&gt;root);</div><div class='add'>+    }</div><div class='add'>+exit:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+gf_defrag_done(int ret, call_frame_t *sync_frame, void *data)</div><div class='add'>+{</div><div class='add'>+    gf_listener_stop(sync_frame-&gt;this);</div><div class='add'>+</div><div class='add'>+    STACK_DESTROY(sync_frame-&gt;root);</div><div class='add'>+    kill(getpid(), SIGTERM);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void *</div><div class='add'>+gf_defrag_start(void *data)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    call_frame_t *frame = NULL;</div><div class='add'>+    dht_conf_t *conf = NULL;</div><div class='add'>+    gf_defrag_info_t *defrag = NULL;</div><div class='add'>+    xlator_t *this = NULL;</div><div class='add'>+    xlator_t *old_THIS = NULL;</div><div class='add'>+</div><div class='add'>+    this = data;</div><div class='add'>+    conf = this-&gt;private;</div><div class='add'>+    if (!conf)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    defrag = conf-&gt;defrag;</div><div class='add'>+    if (!defrag)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    frame = create_frame(this, this-&gt;ctx-&gt;pool);</div><div class='add'>+    if (!frame)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    frame-&gt;root-&gt;pid = GF_CLIENT_PID_DEFRAG;</div><div class='add'>+</div><div class='add'>+    defrag-&gt;pid = frame-&gt;root-&gt;pid;</div><div class='add'>+</div><div class='add'>+    defrag-&gt;defrag_status = GF_DEFRAG_STATUS_STARTED;</div><div class='add'>+</div><div class='add'>+    old_THIS = THIS;</div><div class='add'>+    THIS = this;</div><div class='add'>+    ret = synctask_new(this-&gt;ctx-&gt;env, gf_defrag_start_crawl, gf_defrag_done,</div><div class='add'>+                       frame, this);</div><div class='add'>+</div><div class='add'>+    if (ret)</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_ERROR, 0, DHT_MSG_REBALANCE_START_FAILED,</div><div class='add'>+               "Could not create task for rebalance");</div><div class='add'>+    THIS = old_THIS;</div><div class='add'>+out:</div><div class='add'>+    return NULL;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+uint64_t</div><div class='add'>+gf_defrag_get_estimates_based_on_size(dht_conf_t *conf)</div><div class='add'>+{</div><div class='add'>+    gf_defrag_info_t *defrag = NULL;</div><div class='add'>+    double rate_processed = 0;</div><div class='add'>+    uint64_t total_processed = 0;</div><div class='add'>+    uint64_t tmp_count = 0;</div><div class='add'>+    uint64_t time_to_complete = 0;</div><div class='add'>+    double elapsed = 0;</div><div class='add'>+</div><div class='add'>+    defrag = conf-&gt;defrag;</div><div class='add'>+</div><div class='add'>+    if (!g_totalsize)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    elapsed = gf_time() - defrag-&gt;start_time;</div><div class='add'>+</div><div class='add'>+    /* Don't calculate the estimates for the first 10 minutes.</div><div class='add'>+     * It is unlikely to be accurate and estimates are not required</div><div class='add'>+     * if the process finishes in less than 10 mins.</div><div class='add'>+     */</div><div class='add'>+</div><div class='add'>+    if (elapsed &lt; ESTIMATE_START_INTERVAL) {</div><div class='add'>+        gf_msg(THIS-&gt;name, GF_LOG_INFO, 0, 0,</div><div class='add'>+               "Rebalance estimates will not be available for the "</div><div class='add'>+               "first %d seconds.",</div><div class='add'>+               ESTIMATE_START_INTERVAL);</div><div class='add'>+</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    total_processed = defrag-&gt;size_processed;</div><div class='add'>+</div><div class='add'>+    /* rate at which files processed */</div><div class='add'>+    rate_processed = (total_processed) / elapsed;</div><div class='add'>+</div><div class='add'>+    tmp_count = g_totalsize;</div><div class='add'>+</div><div class='add'>+    if (rate_processed) {</div><div class='add'>+        time_to_complete = (tmp_count) / rate_processed;</div><div class='add'>+</div><div class='add'>+    } else {</div><div class='add'>+        gf_msg(THIS-&gt;name, GF_LOG_ERROR, 0, 0,</div><div class='add'>+               "Unable to calculate estimated time for rebalance");</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    gf_log(THIS-&gt;name, GF_LOG_INFO,</div><div class='add'>+           "TIME: (size) total_processed=%" PRIu64 " tmp_cnt = %" PRIu64</div><div class='add'>+           ","</div><div class='add'>+           "rate_processed=%f, elapsed = %f",</div><div class='add'>+           total_processed, tmp_count, rate_processed, elapsed);</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return time_to_complete;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+gf_defrag_status_get(dht_conf_t *conf, dict_t *dict)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+    uint64_t files = 0;</div><div class='add'>+    uint64_t size = 0;</div><div class='add'>+    uint64_t lookup = 0;</div><div class='add'>+    uint64_t failures = 0;</div><div class='add'>+    uint64_t skipped = 0;</div><div class='add'>+    char *status = "";</div><div class='add'>+    double elapsed = 0;</div><div class='add'>+    uint64_t time_to_complete = 0;</div><div class='add'>+    uint64_t time_left = 0;</div><div class='add'>+    gf_defrag_info_t *defrag = conf-&gt;defrag;</div><div class='add'>+</div><div class='add'>+    if (!defrag)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+    if (defrag-&gt;defrag_status == GF_DEFRAG_STATUS_NOT_STARTED)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    files = defrag-&gt;total_files;</div><div class='add'>+    size = defrag-&gt;total_data;</div><div class='add'>+    lookup = defrag-&gt;num_files_lookedup;</div><div class='add'>+    failures = defrag-&gt;total_failures;</div><div class='add'>+    skipped = defrag-&gt;skipped;</div><div class='add'>+</div><div class='add'>+    elapsed = gf_time() - defrag-&gt;start_time;</div><div class='add'>+</div><div class='add'>+    /* The rebalance is still in progress */</div><div class='add'>+</div><div class='add'>+    if (defrag-&gt;defrag_status == GF_DEFRAG_STATUS_STARTED) {</div><div class='add'>+        time_to_complete = gf_defrag_get_estimates_based_on_size(conf);</div><div class='add'>+</div><div class='add'>+        if (time_to_complete &amp;&amp; (time_to_complete &gt; elapsed))</div><div class='add'>+            time_left = time_to_complete - elapsed;</div><div class='add'>+</div><div class='add'>+        gf_log(THIS-&gt;name, GF_LOG_INFO,</div><div class='add'>+               "TIME: Estimated total time to complete (size)= %" PRIu64</div><div class='add'>+               " seconds, seconds left = %" PRIu64 "",</div><div class='add'>+               time_to_complete, time_left);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (!dict)</div><div class='add'>+        goto log;</div><div class='add'>+</div><div class='add'>+    ret = dict_set_uint64(dict, "files", files);</div><div class='add'>+    if (ret)</div><div class='add'>+        gf_log(THIS-&gt;name, GF_LOG_WARNING, "failed to set file count");</div><div class='add'>+</div><div class='add'>+    ret = dict_set_uint64(dict, "size", size);</div><div class='add'>+    if (ret)</div><div class='add'>+        gf_log(THIS-&gt;name, GF_LOG_WARNING, "failed to set size of xfer");</div><div class='add'>+</div><div class='add'>+    ret = dict_set_uint64(dict, "lookups", lookup);</div><div class='add'>+    if (ret)</div><div class='add'>+        gf_log(THIS-&gt;name, GF_LOG_WARNING, "failed to set lookedup file count");</div><div class='add'>+</div><div class='add'>+    ret = dict_set_int32(dict, "status", defrag-&gt;defrag_status);</div><div class='add'>+    if (ret)</div><div class='add'>+        gf_log(THIS-&gt;name, GF_LOG_WARNING, "failed to set status");</div><div class='add'>+</div><div class='add'>+    ret = dict_set_double(dict, "run-time", elapsed);</div><div class='add'>+    if (ret)</div><div class='add'>+        gf_log(THIS-&gt;name, GF_LOG_WARNING, "failed to set run-time");</div><div class='add'>+</div><div class='add'>+    ret = dict_set_uint64(dict, "failures", failures);</div><div class='add'>+    if (ret)</div><div class='add'>+        gf_log(THIS-&gt;name, GF_LOG_WARNING, "failed to set failure count");</div><div class='add'>+</div><div class='add'>+    ret = dict_set_uint64(dict, "skipped", skipped);</div><div class='add'>+    if (ret)</div><div class='add'>+        gf_log(THIS-&gt;name, GF_LOG_WARNING, "failed to set skipped file count");</div><div class='add'>+</div><div class='add'>+    ret = dict_set_uint64(dict, "time-left", time_left);</div><div class='add'>+    if (ret)</div><div class='add'>+        gf_log(THIS-&gt;name, GF_LOG_WARNING, "failed to set time-left");</div><div class='add'>+</div><div class='add'>+log:</div><div class='add'>+    switch (defrag-&gt;defrag_status) {</div><div class='add'>+        case GF_DEFRAG_STATUS_NOT_STARTED:</div><div class='add'>+            status = "not started";</div><div class='add'>+            break;</div><div class='add'>+        case GF_DEFRAG_STATUS_STARTED:</div><div class='add'>+            status = "in progress";</div><div class='add'>+            break;</div><div class='add'>+        case GF_DEFRAG_STATUS_STOPPED:</div><div class='add'>+            status = "stopped";</div><div class='add'>+            break;</div><div class='add'>+        case GF_DEFRAG_STATUS_COMPLETE:</div><div class='add'>+            status = "completed";</div><div class='add'>+            break;</div><div class='add'>+        case GF_DEFRAG_STATUS_FAILED:</div><div class='add'>+            status = "failed";</div><div class='add'>+            break;</div><div class='add'>+        default:</div><div class='add'>+            break;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    gf_msg(THIS-&gt;name, GF_LOG_INFO, 0, DHT_MSG_REBALANCE_STATUS,</div><div class='add'>+           "Rebalance is %s. Time taken is %.2f secs", status, elapsed);</div><div class='add'>+    gf_msg(THIS-&gt;name, GF_LOG_INFO, 0, DHT_MSG_REBALANCE_STATUS,</div><div class='add'>+           "Files migrated: %" PRIu64 ", size: %" PRIu64 ", lookups: %" PRIu64</div><div class='add'>+           ", failures: %" PRIu64</div><div class='add'>+           ", skipped: "</div><div class='add'>+           "%" PRIu64,</div><div class='add'>+           files, size, lookup, failures, skipped);</div><div class='add'>+out:</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+gf_defrag_stop(dht_conf_t *conf, gf_defrag_status_t status, dict_t *output)</div><div class='add'>+{</div><div class='add'>+    /* TODO: set a variable 'stop_defrag' here, it should be checked</div><div class='add'>+       in defrag loop */</div><div class='add'>+    int ret = -1;</div><div class='add'>+    gf_defrag_info_t *defrag = conf-&gt;defrag;</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(defrag);</div><div class='add'>+</div><div class='add'>+    if (defrag-&gt;defrag_status == GF_DEFRAG_STATUS_NOT_STARTED) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    gf_msg("", GF_LOG_INFO, 0, DHT_MSG_REBALANCE_STOPPED,</div><div class='add'>+           "Received stop command on rebalance");</div><div class='add'>+    defrag-&gt;defrag_status = status;</div><div class='add'>+</div><div class='add'>+    if (output)</div><div class='add'>+        gf_defrag_status_get(conf, output);</div><div class='add'>+    ret = 0;</div><div class='add'>+out:</div><div class='add'>+    gf_msg_debug("", 0, "Returning %d", ret);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='head'>diff --git a/xlators/cluster/dht/src/dht-rename.c b/xlators/cluster/dht/src/dht-rename.c<br/>index d88fc74450a..d9dbf50492f 100644<br/>--- a/<a href='/cgit/glusterfs.git/tree/xlators/cluster/dht/src/dht-rename.c?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/cluster/dht/src/dht-rename.c</a><br/>+++ b/<a href='/cgit/glusterfs.git/tree/xlators/cluster/dht/src/dht-rename.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>xlators/cluster/dht/src/dht-rename.c</a></div><div class='hunk'>@@ -1,712 +1,1997 @@</div><div class='ctx'> /*</div><div class='del'>-   Copyright (c) 2008-2009 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='del'>-   This file is part of GlusterFS.</div><div class='del'>-</div><div class='del'>-   GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-   it under the terms of the GNU General Public License as published</div><div class='del'>-   by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-   or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-   GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-   WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-   General Public License for more details.</div><div class='del'>-</div><div class='del'>-   You should have received a copy of the GNU General Public License</div><div class='del'>-   along with this program.  If not, see</div><div class='del'>-   &lt;http://www.gnu.org/licenses/&gt;.</div><div class='add'>+  Copyright (c) 2008-2012 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='ctx'> */</div><div class='ctx'> </div><div class='ctx'> /* TODO: link(oldpath, newpath) fails if newpath already exists. DHT should</div><div class='ctx'>  *       delete the newpath if it gets EEXISTS from link() call.</div><div class='ctx'>  */</div><div class='del'>-#ifndef _CONFIG_H</div><div class='del'>-#define _CONFIG_H</div><div class='del'>-#include "config.h"</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-#include "glusterfs.h"</div><div class='del'>-#include "xlator.h"</div><div class='ctx'> #include "dht-common.h"</div><div class='del'>-#include "defaults.h"</div><div class='add'>+#include "dht-lock.h"</div><div class='add'>+#include &lt;glusterfs/defaults.h&gt;</div><div class='ctx'> </div><div class='add'>+int</div><div class='add'>+dht_rename_unlock(call_frame_t *frame, xlator_t *this);</div><div class='add'>+int32_t</div><div class='add'>+dht_rename_lock_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                    int32_t op_ret, int32_t op_errno, dict_t *xdata);</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-dht_rename_dir_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-		    int32_t op_ret, int32_t op_errno, struct iatt *stbuf,</div><div class='del'>-                    struct iatt *preoldparent, struct iatt *postoldparent,</div><div class='del'>-                    struct iatt *prenewparent, struct iatt *postnewparent)</div><div class='add'>+dht_rename_unlock_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                      int32_t op_ret, int32_t op_errno, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-	dht_local_t  *local = NULL;</div><div class='del'>-	int           this_call_cnt = 0;</div><div class='del'>-	call_frame_t *prev = NULL;</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='ctx'> </div><div class='add'>+    local = frame-&gt;local;</div><div class='ctx'> </div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-	prev = cookie;</div><div class='add'>+    dht_set_fixed_dir_stat(&amp;local-&gt;preoldparent);</div><div class='add'>+    dht_set_fixed_dir_stat(&amp;local-&gt;postoldparent);</div><div class='add'>+    dht_set_fixed_dir_stat(&amp;local-&gt;preparent);</div><div class='add'>+    dht_set_fixed_dir_stat(&amp;local-&gt;postparent);</div><div class='ctx'> </div><div class='del'>-	if (op_ret == -1) {</div><div class='del'>-		/* TODO: undo the damage */</div><div class='add'>+    if (IA_ISREG(local-&gt;stbuf.ia_type))</div><div class='add'>+        DHT_STRIP_PHASE1_FLAGS(&amp;local-&gt;stbuf);</div><div class='ctx'> </div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-			"rename %s -&gt; %s on %s failed (%s)",</div><div class='del'>-			local-&gt;loc.path, local-&gt;loc2.path,</div><div class='del'>-			prev-&gt;this-&gt;name, strerror (op_errno));</div><div class='add'>+    DHT_STACK_UNWIND(rename, frame, local-&gt;op_ret, local-&gt;op_errno,</div><div class='add'>+                     &amp;local-&gt;stbuf, &amp;local-&gt;preoldparent, &amp;local-&gt;postoldparent,</div><div class='add'>+                     &amp;local-&gt;preparent, &amp;local-&gt;postparent, local-&gt;xattr);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-		local-&gt;op_ret   = op_ret;</div><div class='del'>-		local-&gt;op_errno = op_errno;</div><div class='del'>-	} else {</div><div class='del'>-		/* TODO: construct proper stbuf for dir */</div><div class='del'>-                /* </div><div class='del'>-                 * FIXME: is this the correct way to build stbuf and</div><div class='del'>-                 * parent bufs?</div><div class='del'>-                */</div><div class='del'>-                dht_iatt_merge (this, &amp;local-&gt;stbuf, stbuf, prev-&gt;this);</div><div class='del'>-                dht_iatt_merge (this, &amp;local-&gt;preoldparent, preoldparent,</div><div class='del'>-                                prev-&gt;this);</div><div class='del'>-                dht_iatt_merge (this, &amp;local-&gt;postoldparent, postoldparent,</div><div class='del'>-                                prev-&gt;this);</div><div class='del'>-                dht_iatt_merge (this, &amp;local-&gt;preparent, prenewparent,</div><div class='del'>-                                prev-&gt;this);</div><div class='del'>-                dht_iatt_merge (this, &amp;local-&gt;postparent, postnewparent,</div><div class='del'>-                                prev-&gt;this);</div><div class='del'>-	}</div><div class='add'>+static void</div><div class='add'>+dht_rename_dir_unlock_src(call_frame_t *frame, xlator_t *this)</div><div class='add'>+{</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    dht_unlock_namespace(frame, &amp;local-&gt;lock[0]);</div><div class='add'>+    return;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+dht_rename_dir_unlock_dst(call_frame_t *frame, xlator_t *this)</div><div class='add'>+{</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    int op_ret = -1;</div><div class='add'>+    char src_gfid[GF_UUID_BUF_SIZE] = {0};</div><div class='add'>+    char dst_gfid[GF_UUID_BUF_SIZE] = {0};</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+</div><div class='add'>+    /* Unlock entrylk */</div><div class='add'>+    dht_unlock_entrylk_wrapper(frame, &amp;local-&gt;lock[1].ns.directory_ns);</div><div class='add'>+</div><div class='add'>+    /* Unlock inodelk */</div><div class='add'>+    op_ret = dht_unlock_inodelk(frame, local-&gt;lock[1].ns.parent_layout.locks,</div><div class='add'>+                                local-&gt;lock[1].ns.parent_layout.lk_count,</div><div class='add'>+                                dht_rename_unlock_cbk);</div><div class='add'>+    if (op_ret &lt; 0) {</div><div class='add'>+        uuid_utoa_r(local-&gt;loc.inode-&gt;gfid, src_gfid);</div><div class='add'>+</div><div class='add'>+        if (local-&gt;loc2.inode)</div><div class='add'>+            uuid_utoa_r(local-&gt;loc2.inode-&gt;gfid, dst_gfid);</div><div class='add'>+</div><div class='add'>+        if (IA_ISREG(local-&gt;stbuf.ia_type))</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_WARNING, 0, DHT_MSG_UNLOCKING_FAILED,</div><div class='add'>+                   "winding unlock inodelk failed "</div><div class='add'>+                   "rename (%s:%s:%s %s:%s:%s), "</div><div class='add'>+                   "stale locks left on bricks",</div><div class='add'>+                   local-&gt;loc.path, src_gfid, local-&gt;src_cached-&gt;name,</div><div class='add'>+                   local-&gt;loc2.path, dst_gfid,</div><div class='add'>+                   local-&gt;dst_cached ? local-&gt;dst_cached-&gt;name : NULL);</div><div class='add'>+        else</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_WARNING, 0, DHT_MSG_UNLOCKING_FAILED,</div><div class='add'>+                   "winding unlock inodelk failed "</div><div class='add'>+                   "rename (%s:%s %s:%s), "</div><div class='add'>+                   "stale locks left on bricks",</div><div class='add'>+                   local-&gt;loc.path, src_gfid, local-&gt;loc2.path, dst_gfid);</div><div class='add'>+</div><div class='add'>+        dht_rename_unlock_cbk(frame, NULL, this, 0, 0, NULL);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+dht_rename_dir_unlock(call_frame_t *frame, xlator_t *this)</div><div class='add'>+{</div><div class='add'>+    dht_rename_dir_unlock_src(frame, this);</div><div class='add'>+    dht_rename_dir_unlock_dst(frame, this);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+int</div><div class='add'>+dht_rename_dir_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                   int32_t op_ret, int32_t op_errno, struct iatt *stbuf,</div><div class='add'>+                   struct iatt *preoldparent, struct iatt *postoldparent,</div><div class='add'>+                   struct iatt *prenewparent, struct iatt *postnewparent,</div><div class='add'>+                   dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    dht_conf_t *conf = NULL;</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    int this_call_cnt = 0;</div><div class='add'>+    xlator_t *prev = NULL;</div><div class='add'>+    int i = 0;</div><div class='add'>+    char gfid[GF_UUID_BUF_SIZE] = {0};</div><div class='add'>+    int subvol_cnt = -1;</div><div class='add'>+</div><div class='add'>+    conf = this-&gt;private;</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    prev = cookie;</div><div class='add'>+    subvol_cnt = dht_subvol_cnt(this, prev);</div><div class='add'>+    local-&gt;ret_cache[subvol_cnt] = op_ret;</div><div class='add'>+</div><div class='add'>+    if (op_ret == -1) {</div><div class='add'>+        gf_uuid_unparse(local-&gt;loc.inode-&gt;gfid, gfid);</div><div class='add'>+</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_INFO, op_errno, DHT_MSG_RENAME_FAILED,</div><div class='add'>+               "Rename %s -&gt; %s on %s failed, (gfid = %s)", local-&gt;loc.path,</div><div class='add'>+               local-&gt;loc2.path, prev-&gt;name, gfid);</div><div class='add'>+</div><div class='add'>+        local-&gt;op_ret = op_ret;</div><div class='add'>+        local-&gt;op_errno = op_errno;</div><div class='add'>+        goto unwind;</div><div class='add'>+    }</div><div class='add'>+    /* TODO: construct proper stbuf for dir */</div><div class='add'>+    /*</div><div class='add'>+     * FIXME: is this the correct way to build stbuf and</div><div class='add'>+     * parent bufs?</div><div class='add'>+     */</div><div class='add'>+    dht_iatt_merge(this, &amp;local-&gt;stbuf, stbuf);</div><div class='add'>+    dht_iatt_merge(this, &amp;local-&gt;preoldparent, preoldparent);</div><div class='add'>+    dht_iatt_merge(this, &amp;local-&gt;postoldparent, postoldparent);</div><div class='add'>+    dht_iatt_merge(this, &amp;local-&gt;preparent, prenewparent);</div><div class='add'>+    dht_iatt_merge(this, &amp;local-&gt;postparent, postnewparent);</div><div class='ctx'> </div><div class='del'>-	this_call_cnt = dht_frame_return (frame);</div><div class='del'>-	if (is_last_call (this_call_cnt)) {</div><div class='del'>-                local-&gt;stbuf.ia_ino = local-&gt;loc.inode-&gt;ino;</div><div class='add'>+unwind:</div><div class='add'>+    this_call_cnt = dht_frame_return(frame);</div><div class='add'>+    if (is_last_call(this_call_cnt)) {</div><div class='add'>+        /* We get here with local-&gt;call_cnt == 0. Which means</div><div class='add'>+         * we are the only one executing this code, there is</div><div class='add'>+         * no contention. Therefore it's safe to manipulate or</div><div class='add'>+         * deref local-&gt;call_cnt directly (without locking).</div><div class='add'>+         */</div><div class='add'>+        if (local-&gt;ret_cache[conf-&gt;subvolume_cnt] == 0) {</div><div class='add'>+            /* count errant subvols in last field of ret_cache */</div><div class='add'>+            for (i = 0; i &lt; conf-&gt;subvolume_cnt; i++) {</div><div class='add'>+                if (local-&gt;ret_cache[i] != 0)</div><div class='add'>+                    ++local-&gt;ret_cache[conf-&gt;subvolume_cnt];</div><div class='add'>+            }</div><div class='add'>+            if (local-&gt;ret_cache[conf-&gt;subvolume_cnt]) {</div><div class='add'>+                /* undoing the damage:</div><div class='add'>+                 * for all subvolumes, where rename</div><div class='add'>+                 * succeeded, we perform the reverse operation</div><div class='add'>+                 */</div><div class='add'>+                for (i = 0; i &lt; conf-&gt;subvolume_cnt; i++) {</div><div class='add'>+                    if (local-&gt;ret_cache[i] == 0)</div><div class='add'>+                        ++local-&gt;call_cnt;</div><div class='add'>+                }</div><div class='add'>+                for (i = 0; i &lt; conf-&gt;subvolume_cnt; i++) {</div><div class='add'>+                    if (local-&gt;ret_cache[i])</div><div class='add'>+                        continue;</div><div class='ctx'> </div><div class='del'>-                local-&gt;preoldparent.ia_ino = local-&gt;loc.parent-&gt;ino;</div><div class='del'>-                local-&gt;postoldparent.ia_ino = local-&gt;loc.parent-&gt;ino;</div><div class='add'>+                    STACK_WIND(frame, dht_rename_dir_cbk, conf-&gt;subvolumes[i],</div><div class='add'>+                               conf-&gt;subvolumes[i]-&gt;fops-&gt;rename, &amp;local-&gt;loc2,</div><div class='add'>+                               &amp;local-&gt;loc, NULL);</div><div class='add'>+                }</div><div class='ctx'> </div><div class='del'>-                local-&gt;preparent.ia_ino = local-&gt;loc2.parent-&gt;ino;</div><div class='del'>-                local-&gt;postparent.ia_ino = local-&gt;loc2.parent-&gt;ino;</div><div class='add'>+                return 0;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-                WIPE (&amp;local-&gt;preoldparent);</div><div class='del'>-                WIPE (&amp;local-&gt;postoldparent);</div><div class='del'>-                WIPE (&amp;local-&gt;preparent);</div><div class='del'>-                WIPE (&amp;local-&gt;postparent);</div><div class='add'>+        WIPE(&amp;local-&gt;preoldparent);</div><div class='add'>+        WIPE(&amp;local-&gt;postoldparent);</div><div class='add'>+        WIPE(&amp;local-&gt;preparent);</div><div class='add'>+        WIPE(&amp;local-&gt;postparent);</div><div class='ctx'> </div><div class='del'>-		DHT_STACK_UNWIND (rename, frame, local-&gt;op_ret, local-&gt;op_errno,</div><div class='del'>-				  &amp;local-&gt;stbuf, &amp;local-&gt;preoldparent,</div><div class='del'>-                                  &amp;local-&gt;postoldparent,</div><div class='del'>-                                  &amp;local-&gt;preparent, &amp;local-&gt;postparent);</div><div class='del'>-	}</div><div class='add'>+        dht_rename_dir_unlock(frame, this);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	return 0;</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+int</div><div class='add'>+dht_rename_hashed_dir_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                          int32_t op_ret, int32_t op_errno, struct iatt *stbuf,</div><div class='add'>+                          struct iatt *preoldparent, struct iatt *postoldparent,</div><div class='add'>+                          struct iatt *prenewparent, struct iatt *postnewparent,</div><div class='add'>+                          dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    dht_conf_t *conf = NULL;</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    int call_cnt = 0;</div><div class='add'>+    xlator_t *prev = NULL;</div><div class='add'>+    int i = 0;</div><div class='add'>+    char gfid[GF_UUID_BUF_SIZE] = {0};</div><div class='add'>+</div><div class='add'>+    conf = this-&gt;private;</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    prev = cookie;</div><div class='add'>+</div><div class='add'>+    if (op_ret == -1) {</div><div class='add'>+        gf_uuid_unparse(local-&gt;loc.inode-&gt;gfid, gfid);</div><div class='add'>+</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_INFO, op_errno, DHT_MSG_RENAME_FAILED,</div><div class='add'>+               "rename %s -&gt; %s on %s failed, (gfid = %s) ", local-&gt;loc.path,</div><div class='add'>+               local-&gt;loc2.path, prev-&gt;name, gfid);</div><div class='add'>+</div><div class='add'>+        local-&gt;op_ret = op_ret;</div><div class='add'>+        local-&gt;op_errno = op_errno;</div><div class='add'>+        goto unwind;</div><div class='add'>+    }</div><div class='add'>+    /* TODO: construct proper stbuf for dir */</div><div class='add'>+    /*</div><div class='add'>+     * FIXME: is this the correct way to build stbuf and</div><div class='add'>+     * parent bufs?</div><div class='add'>+     */</div><div class='add'>+    dht_iatt_merge(this, &amp;local-&gt;stbuf, stbuf);</div><div class='add'>+    dht_iatt_merge(this, &amp;local-&gt;preoldparent, preoldparent);</div><div class='add'>+    dht_iatt_merge(this, &amp;local-&gt;postoldparent, postoldparent);</div><div class='add'>+    dht_iatt_merge(this, &amp;local-&gt;preparent, prenewparent);</div><div class='add'>+    dht_iatt_merge(this, &amp;local-&gt;postparent, postnewparent);</div><div class='add'>+</div><div class='add'>+    call_cnt = local-&gt;call_cnt = conf-&gt;subvolume_cnt - 1;</div><div class='add'>+</div><div class='add'>+    if (!local-&gt;call_cnt)</div><div class='add'>+        goto unwind;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; conf-&gt;subvolume_cnt; i++) {</div><div class='add'>+        if (conf-&gt;subvolumes[i] == local-&gt;dst_hashed)</div><div class='add'>+            continue;</div><div class='add'>+        STACK_WIND_COOKIE(</div><div class='add'>+            frame, dht_rename_dir_cbk, conf-&gt;subvolumes[i], conf-&gt;subvolumes[i],</div><div class='add'>+            conf-&gt;subvolumes[i]-&gt;fops-&gt;rename, &amp;local-&gt;loc, &amp;local-&gt;loc2, NULL);</div><div class='add'>+        if (!--call_cnt)</div><div class='add'>+            break;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+unwind:</div><div class='add'>+    WIPE(&amp;local-&gt;preoldparent);</div><div class='add'>+    WIPE(&amp;local-&gt;postoldparent);</div><div class='add'>+    WIPE(&amp;local-&gt;preparent);</div><div class='add'>+    WIPE(&amp;local-&gt;postparent);</div><div class='ctx'> </div><div class='add'>+    dht_rename_dir_unlock(frame, this);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-dht_rename_dir_do (call_frame_t *frame, xlator_t *this)</div><div class='add'>+dht_rename_dir_do(call_frame_t *frame, xlator_t *this)</div><div class='ctx'> {</div><div class='del'>-	dht_local_t  *local = NULL;</div><div class='del'>-	dht_conf_t   *conf = NULL;</div><div class='del'>-	int           i = 0;</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='ctx'> </div><div class='del'>-	conf = this-&gt;private;</div><div class='del'>-	local = frame-&gt;local;</div><div class='add'>+    local = frame-&gt;local;</div><div class='ctx'> </div><div class='del'>-	if (local-&gt;op_ret == -1)</div><div class='del'>-		goto err;</div><div class='add'>+    if (local-&gt;op_ret == -1)</div><div class='add'>+        goto err;</div><div class='ctx'> </div><div class='del'>-	local-&gt;call_cnt = conf-&gt;subvolume_cnt;</div><div class='del'>-	local-&gt;op_ret = 0;</div><div class='add'>+    local-&gt;op_ret = 0;</div><div class='ctx'> </div><div class='del'>-	for (i = 0; i &lt; conf-&gt;subvolume_cnt; i++) {</div><div class='del'>-		STACK_WIND (frame, dht_rename_dir_cbk,</div><div class='del'>-			    conf-&gt;subvolumes[i],</div><div class='del'>-			    conf-&gt;subvolumes[i]-&gt;fops-&gt;rename,</div><div class='del'>-			    &amp;local-&gt;loc, &amp;local-&gt;loc2);</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='add'>+    STACK_WIND_COOKIE(frame, dht_rename_hashed_dir_cbk, local-&gt;dst_hashed,</div><div class='add'>+                      local-&gt;dst_hashed, local-&gt;dst_hashed-&gt;fops-&gt;rename,</div><div class='add'>+                      &amp;local-&gt;loc, &amp;local-&gt;loc2, NULL);</div><div class='add'>+    return 0;</div><div class='ctx'> </div><div class='ctx'> err:</div><div class='del'>-	DHT_STACK_UNWIND (rename, frame, local-&gt;op_ret, local-&gt;op_errno, NULL, NULL,</div><div class='del'>-                          NULL, NULL, NULL);</div><div class='del'>-	return 0;</div><div class='add'>+    dht_rename_dir_unlock(frame, this);</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-dht_rename_readdir_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-			int op_ret, int op_errno, gf_dirent_t *entries)</div><div class='add'>+dht_rename_readdir_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                       int op_ret, int op_errno, gf_dirent_t *entries,</div><div class='add'>+                       dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-	dht_local_t  *local = NULL;</div><div class='del'>-	int           this_call_cnt = -1;</div><div class='del'>-	call_frame_t *prev = NULL;</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    int this_call_cnt = -1;</div><div class='add'>+    xlator_t *prev = NULL;</div><div class='ctx'> </div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-	prev  = cookie;</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    prev = cookie;</div><div class='ctx'> </div><div class='del'>-	if (op_ret &gt; 2) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_TRACE,</div><div class='del'>-			"readdir on %s for %s returned %d entries",</div><div class='del'>-			prev-&gt;this-&gt;name, local-&gt;loc.path, op_ret);</div><div class='del'>-		local-&gt;op_ret = -1;</div><div class='del'>-		local-&gt;op_errno = ENOTEMPTY;</div><div class='del'>-	}</div><div class='add'>+    if (op_ret &gt; 2) {</div><div class='add'>+        gf_msg_trace(this-&gt;name, 0, "readdir on %s for %s returned %d entries",</div><div class='add'>+                     prev-&gt;name, local-&gt;loc.path, op_ret);</div><div class='add'>+        local-&gt;op_ret = -1;</div><div class='add'>+        local-&gt;op_errno = ENOTEMPTY;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	this_call_cnt = dht_frame_return (frame);</div><div class='add'>+    this_call_cnt = dht_frame_return(frame);</div><div class='ctx'> </div><div class='del'>-	if (is_last_call (this_call_cnt)) {</div><div class='del'>-		dht_rename_dir_do (frame, this);</div><div class='del'>-	}</div><div class='add'>+    if (is_last_call(this_call_cnt)) {</div><div class='add'>+        dht_rename_dir_do(frame, this);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	return 0;</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-dht_rename_opendir_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-			int op_ret, int op_errno, fd_t *fd)</div><div class='add'>+dht_rename_opendir_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                       int op_ret, int op_errno, fd_t *fd, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-	dht_local_t  *local = NULL;</div><div class='del'>-	int           this_call_cnt = -1;</div><div class='del'>-	call_frame_t *prev = NULL;</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    int this_call_cnt = -1;</div><div class='add'>+    xlator_t *prev = NULL;</div><div class='add'>+    char gfid[GF_UUID_BUF_SIZE] = {0};</div><div class='ctx'> </div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    prev = cookie;</div><div class='ctx'> </div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-	prev  = cookie;</div><div class='add'>+    if (op_ret == -1) {</div><div class='add'>+        gf_uuid_unparse(local-&gt;loc.inode-&gt;gfid, gfid);</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_INFO, op_errno, DHT_MSG_OPENDIR_FAILED,</div><div class='add'>+               "opendir on %s for %s failed,(gfid = %s) ", prev-&gt;name,</div><div class='add'>+               local-&gt;loc.path, gfid);</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	if (op_ret == -1) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-			"opendir on %s for %s failed (%s)",</div><div class='del'>-			prev-&gt;this-&gt;name, local-&gt;loc.path,</div><div class='del'>-			strerror (op_errno));</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='add'>+    fd_bind(fd);</div><div class='add'>+    STACK_WIND_COOKIE(frame, dht_rename_readdir_cbk, prev, prev,</div><div class='add'>+                      prev-&gt;fops-&gt;readdir, local-&gt;fd, 4096, 0, NULL);</div><div class='ctx'> </div><div class='del'>-	STACK_WIND (frame, dht_rename_readdir_cbk,</div><div class='del'>-		    prev-&gt;this, prev-&gt;this-&gt;fops-&gt;readdir,</div><div class='del'>-		    local-&gt;fd, 4096, 0);</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='add'>+    return 0;</div><div class='ctx'> </div><div class='ctx'> err:</div><div class='del'>-	this_call_cnt = dht_frame_return (frame);</div><div class='add'>+    this_call_cnt = dht_frame_return(frame);</div><div class='ctx'> </div><div class='del'>-	if (is_last_call (this_call_cnt)) {</div><div class='del'>-		dht_rename_dir_do (frame, this);</div><div class='del'>-	}</div><div class='add'>+    if (is_last_call(this_call_cnt)) {</div><div class='add'>+        dht_rename_dir_do(frame, this);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	return 0;</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-dht_rename_dir (call_frame_t *frame, xlator_t *this)</div><div class='add'>+dht_rename_dir_lock2_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                         int32_t op_ret, int32_t op_errno, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-	dht_conf_t  *conf = NULL;</div><div class='del'>-	dht_local_t *local = NULL;</div><div class='del'>-	int          i = 0;</div><div class='del'>-	int          op_errno = -1;</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    char src_gfid[GF_UUID_BUF_SIZE] = {0};</div><div class='add'>+    char dst_gfid[GF_UUID_BUF_SIZE] = {0};</div><div class='add'>+    dht_conf_t *conf = NULL;</div><div class='add'>+    int i = 0;</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    conf = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    if (op_ret &lt; 0) {</div><div class='add'>+        uuid_utoa_r(local-&gt;loc.inode-&gt;gfid, src_gfid);</div><div class='add'>+</div><div class='add'>+        if (local-&gt;loc2.inode)</div><div class='add'>+            uuid_utoa_r(local-&gt;loc2.inode-&gt;gfid, dst_gfid);</div><div class='add'>+</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_WARNING, op_errno, DHT_MSG_INODE_LK_ERROR,</div><div class='add'>+               "acquiring entrylk after inodelk failed"</div><div class='add'>+               "rename (%s:%s:%s %s:%s:%s)",</div><div class='add'>+               local-&gt;loc.path, src_gfid, local-&gt;src_cached-&gt;name,</div><div class='add'>+               local-&gt;loc2.path, dst_gfid,</div><div class='add'>+               local-&gt;dst_cached ? local-&gt;dst_cached-&gt;name : NULL);</div><div class='add'>+</div><div class='add'>+        local-&gt;op_ret = -1;</div><div class='add'>+        local-&gt;op_errno = op_errno;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    local-&gt;fd = fd_create(local-&gt;loc.inode, frame-&gt;root-&gt;pid);</div><div class='add'>+    if (!local-&gt;fd) {</div><div class='add'>+        op_errno = ENOMEM;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    local-&gt;op_ret = 0;</div><div class='add'>+</div><div class='add'>+    if (!local-&gt;dst_cached) {</div><div class='add'>+        dht_rename_dir_do(frame, this);</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='add'>+    for (i = 0; i &lt; conf-&gt;subvolume_cnt; i++) {</div><div class='add'>+        STACK_WIND_COOKIE(frame, dht_rename_opendir_cbk, conf-&gt;subvolumes[i],</div><div class='add'>+                          conf-&gt;subvolumes[i],</div><div class='add'>+                          conf-&gt;subvolumes[i]-&gt;fops-&gt;opendir, &amp;local-&gt;loc2,</div><div class='add'>+                          local-&gt;fd, NULL);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	conf = frame-&gt;this-&gt;private;</div><div class='del'>-	local = frame-&gt;local;</div><div class='add'>+    return 0;</div><div class='ctx'> </div><div class='del'>-	local-&gt;call_cnt = conf-&gt;subvolume_cnt;</div><div class='add'>+err:</div><div class='add'>+    /* No harm in calling an extra unlock */</div><div class='add'>+    dht_rename_dir_unlock(frame, this);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        for (i = 0; i &lt; conf-&gt;subvolume_cnt; i++) {</div><div class='del'>-                if (!conf-&gt;subvolume_status[i]) {</div><div class='del'>-                        op_errno = ENOTCONN;</div><div class='del'>-                        goto err;</div><div class='del'>-                }</div><div class='add'>+int</div><div class='add'>+dht_rename_dir_lock1_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                         int32_t op_ret, int32_t op_errno, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    char src_gfid[GF_UUID_BUF_SIZE] = {0};</div><div class='add'>+    char dst_gfid[GF_UUID_BUF_SIZE] = {0};</div><div class='add'>+    int ret = 0;</div><div class='add'>+    loc_t *loc = NULL;</div><div class='add'>+    xlator_t *subvol = NULL;</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+</div><div class='add'>+    if (op_ret &lt; 0) {</div><div class='add'>+        uuid_utoa_r(local-&gt;loc.inode-&gt;gfid, src_gfid);</div><div class='add'>+</div><div class='add'>+        if (local-&gt;loc2.inode)</div><div class='add'>+            uuid_utoa_r(local-&gt;loc2.inode-&gt;gfid, dst_gfid);</div><div class='add'>+</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_WARNING, op_errno, DHT_MSG_INODE_LK_ERROR,</div><div class='add'>+               "acquiring entrylk after inodelk failed"</div><div class='add'>+               "rename (%s:%s:%s %s:%s:%s)",</div><div class='add'>+               local-&gt;loc.path, src_gfid, local-&gt;src_cached-&gt;name,</div><div class='add'>+               local-&gt;loc2.path, dst_gfid,</div><div class='add'>+               local-&gt;dst_cached ? local-&gt;dst_cached-&gt;name : NULL);</div><div class='add'>+</div><div class='add'>+        local-&gt;op_ret = -1;</div><div class='add'>+        local-&gt;op_errno = op_errno;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (local-&gt;current == &amp;local-&gt;lock[0]) {</div><div class='add'>+        loc = &amp;local-&gt;loc2;</div><div class='add'>+        subvol = local-&gt;dst_hashed;</div><div class='add'>+        local-&gt;current = &amp;local-&gt;lock[1];</div><div class='add'>+    } else {</div><div class='add'>+        loc = &amp;local-&gt;loc;</div><div class='add'>+        subvol = local-&gt;src_hashed;</div><div class='add'>+        local-&gt;current = &amp;local-&gt;lock[0];</div><div class='add'>+    }</div><div class='add'>+    ret = dht_protect_namespace(frame, loc, subvol, &amp;local-&gt;current-&gt;ns,</div><div class='add'>+                                dht_rename_dir_lock2_cbk);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        op_errno = EINVAL;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+err:</div><div class='add'>+    /* No harm in calling an extra unlock */</div><div class='add'>+    dht_rename_dir_unlock(frame, this);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+ * If the hashed subvolumes of both source and dst are the different,</div><div class='add'>+ * lock in dictionary order of hashed subvol-&gt;name. This is important</div><div class='add'>+ * in case the parent directory is the same for both src and dst to</div><div class='add'>+ * prevent inodelk deadlocks when racing with a fix-layout op on the parent.</div><div class='add'>+ *</div><div class='add'>+ * If the hashed subvols are the same, use the gfid/name to determine</div><div class='add'>+ * the order of taking locks to prevent entrylk deadlocks when the parent</div><div class='add'>+ * dirs are the same.</div><div class='add'>+ *</div><div class='add'>+ */</div><div class='add'>+static int</div><div class='add'>+dht_order_rename_lock(call_frame_t *frame, loc_t **loc, xlator_t **subvol)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+    int op_ret = 0;</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    char *src = NULL;</div><div class='add'>+    char *dst = NULL;</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+</div><div class='add'>+    if (local-&gt;src_hashed-&gt;name == local-&gt;dst_hashed-&gt;name) {</div><div class='add'>+        ret = 0;</div><div class='add'>+    } else {</div><div class='add'>+        ret = strcmp(local-&gt;src_hashed-&gt;name, local-&gt;dst_hashed-&gt;name);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (ret == 0) {</div><div class='add'>+        /* hashed subvols are the same for src and dst */</div><div class='add'>+        /* Entrylks need to be ordered*/</div><div class='add'>+</div><div class='add'>+        src = alloca(GF_UUID_BNAME_BUF_SIZE + strlen(local-&gt;loc.name) + 1);</div><div class='add'>+        if (!src) {</div><div class='add'>+            gf_msg(frame-&gt;this-&gt;name, GF_LOG_ERROR, ENOMEM, 0,</div><div class='add'>+                   "Insufficient memory for src");</div><div class='add'>+            op_ret = -1;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        if (!gf_uuid_is_null(local-&gt;loc.pargfid))</div><div class='add'>+            uuid_utoa_r(local-&gt;loc.pargfid, src);</div><div class='add'>+        else if (local-&gt;loc.parent)</div><div class='add'>+            uuid_utoa_r(local-&gt;loc.parent-&gt;gfid, src);</div><div class='add'>+        else</div><div class='add'>+            src[0] = '\0';</div><div class='add'>+</div><div class='add'>+        strcat(src, local-&gt;loc.name);</div><div class='add'>+</div><div class='add'>+        dst = alloca(GF_UUID_BNAME_BUF_SIZE + strlen(local-&gt;loc2.name) + 1);</div><div class='add'>+        if (!dst) {</div><div class='add'>+            gf_msg(frame-&gt;this-&gt;name, GF_LOG_ERROR, ENOMEM, 0,</div><div class='add'>+                   "Insufficient memory for dst");</div><div class='add'>+            op_ret = -1;</div><div class='add'>+            goto out;</div><div class='ctx'>         }</div><div class='ctx'> </div><div class='del'>-	local-&gt;fd = fd_create (local-&gt;loc.inode, frame-&gt;root-&gt;pid);</div><div class='del'>-	if (!local-&gt;fd) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-			"Out of memory");</div><div class='del'>-		op_errno = ENOMEM;</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='add'>+        if (!gf_uuid_is_null(local-&gt;loc2.pargfid))</div><div class='add'>+            uuid_utoa_r(local-&gt;loc2.pargfid, dst);</div><div class='add'>+        else if (local-&gt;loc2.parent)</div><div class='add'>+            uuid_utoa_r(local-&gt;loc2.parent-&gt;gfid, dst);</div><div class='add'>+        else</div><div class='add'>+            dst[0] = '\0';</div><div class='ctx'> </div><div class='del'>-	local-&gt;op_ret = 0;</div><div class='add'>+        strcat(dst, local-&gt;loc2.name);</div><div class='add'>+        ret = strcmp(src, dst);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	if (!local-&gt;dst_cached) {</div><div class='del'>-		dht_rename_dir_do (frame, this);</div><div class='del'>-		return 0;</div><div class='del'>-	}</div><div class='add'>+    if (ret &lt;= 0) {</div><div class='add'>+        /*inodelk in dictionary order of hashed subvol names*/</div><div class='add'>+        /*entrylk in dictionary order of gfid/basename */</div><div class='add'>+        local-&gt;current = &amp;local-&gt;lock[0];</div><div class='add'>+        *loc = &amp;local-&gt;loc;</div><div class='add'>+        *subvol = local-&gt;src_hashed;</div><div class='ctx'> </div><div class='del'>-	for (i = 0; i &lt; conf-&gt;subvolume_cnt; i++) {</div><div class='del'>-		STACK_WIND (frame, dht_rename_opendir_cbk,</div><div class='del'>-			    conf-&gt;subvolumes[i],</div><div class='del'>-			    conf-&gt;subvolumes[i]-&gt;fops-&gt;opendir,</div><div class='del'>-			    &amp;local-&gt;loc2, local-&gt;fd);</div><div class='del'>-	}</div><div class='add'>+    } else {</div><div class='add'>+        local-&gt;current = &amp;local-&gt;lock[1];</div><div class='add'>+        *loc = &amp;local-&gt;loc2;</div><div class='add'>+        *subvol = local-&gt;dst_hashed;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    op_ret = 0;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return op_ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	return 0;</div><div class='add'>+int</div><div class='add'>+dht_rename_dir(call_frame_t *frame, xlator_t *this)</div><div class='add'>+{</div><div class='add'>+    dht_conf_t *conf = NULL;</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    loc_t *loc = NULL;</div><div class='add'>+    xlator_t *subvol = NULL;</div><div class='add'>+    int i = 0;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    int op_errno = -1;</div><div class='add'>+</div><div class='add'>+    conf = frame-&gt;this-&gt;private;</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+</div><div class='add'>+    local-&gt;ret_cache = GF_CALLOC(conf-&gt;subvolume_cnt + 1, sizeof(int),</div><div class='add'>+                                 gf_dht_ret_cache_t);</div><div class='add'>+</div><div class='add'>+    if (local-&gt;ret_cache == NULL) {</div><div class='add'>+        op_errno = ENOMEM;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    local-&gt;call_cnt = conf-&gt;subvolume_cnt;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; conf-&gt;subvolume_cnt; i++) {</div><div class='add'>+        if (!conf-&gt;subvolume_status[i]) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_INFO, 0, DHT_MSG_RENAME_FAILED,</div><div class='add'>+                   "Rename dir failed: subvolume down (%s)",</div><div class='add'>+                   conf-&gt;subvolumes[i]-&gt;name);</div><div class='add'>+            op_errno = ENOTCONN;</div><div class='add'>+            goto err;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Locks on src and dst needs to ordered which otherwise might cause</div><div class='add'>+     * deadlocks when rename (src, dst) and rename (dst, src) is done from</div><div class='add'>+     * two different clients</div><div class='add'>+     */</div><div class='add'>+    ret = dht_order_rename_lock(frame, &amp;loc, &amp;subvol);</div><div class='add'>+    if (ret) {</div><div class='add'>+        op_errno = ENOMEM;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Rename must take locks on src to avoid lookup selfheal from</div><div class='add'>+     * recreating src on those subvols where the rename was successful.</div><div class='add'>+     * The locks can't be issued parallel as two different clients might</div><div class='add'>+     * attempt same rename command and be in dead lock.</div><div class='add'>+     */</div><div class='add'>+    ret = dht_protect_namespace(frame, loc, subvol, &amp;local-&gt;current-&gt;ns,</div><div class='add'>+                                dht_rename_dir_lock1_cbk);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        op_errno = EINVAL;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='ctx'> </div><div class='ctx'> err:</div><div class='del'>-	op_errno = (op_errno == -1) ? errno : op_errno;</div><div class='del'>-	DHT_STACK_UNWIND (rename, frame, -1, op_errno, NULL, NULL, NULL, NULL, NULL);</div><div class='del'>-	return 0;</div><div class='add'>+    DHT_STACK_UNWIND(rename, frame, -1, op_errno, NULL, NULL, NULL, NULL, NULL,</div><div class='add'>+                     NULL);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+dht_rename_track_for_changelog(xlator_t *this, dict_t *xattr, loc_t *oldloc,</div><div class='add'>+                               loc_t *newloc)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    dht_changelog_rename_info_t *info = NULL;</div><div class='add'>+    char *name = NULL;</div><div class='add'>+    int len1 = 0;</div><div class='add'>+    int len2 = 0;</div><div class='add'>+    int size = 0;</div><div class='add'>+</div><div class='add'>+    if (!xattr || !oldloc || !newloc || !this)</div><div class='add'>+        return ret;</div><div class='add'>+</div><div class='add'>+    len1 = strlen(oldloc-&gt;name) + 1;</div><div class='add'>+    len2 = strlen(newloc-&gt;name) + 1;</div><div class='add'>+    size = sizeof(dht_changelog_rename_info_t) + len1 + len2;</div><div class='add'>+</div><div class='add'>+    info = GF_CALLOC(size, sizeof(char), gf_common_mt_char);</div><div class='add'>+    if (!info) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_ERROR, 0, DHT_MSG_DICT_SET_FAILED,</div><div class='add'>+               "Failed to calloc memory");</div><div class='add'>+        return ret;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    gf_uuid_copy(info-&gt;old_pargfid, oldloc-&gt;pargfid);</div><div class='add'>+    gf_uuid_copy(info-&gt;new_pargfid, newloc-&gt;pargfid);</div><div class='add'>+</div><div class='add'>+    info-&gt;oldname_len = len1;</div><div class='add'>+    info-&gt;newname_len = len2;</div><div class='add'>+    strncpy(info-&gt;buffer, oldloc-&gt;name, len1);</div><div class='add'>+    name = info-&gt;buffer + len1;</div><div class='add'>+    strncpy(name, newloc-&gt;name, len2);</div><div class='add'>+</div><div class='add'>+    ret = dict_set_bin(xattr, DHT_CHANGELOG_RENAME_OP_KEY, info, size);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_ERROR, 0, DHT_MSG_DICT_SET_FAILED,</div><div class='add'>+               "Failed to set dictionary value: key = %s,"</div><div class='add'>+               " path = %s",</div><div class='add'>+               DHT_CHANGELOG_RENAME_OP_KEY, oldloc-&gt;name);</div><div class='add'>+        GF_FREE(info);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+#define DHT_MARKER_DONT_ACCOUNT(xattr)                                         \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        int tmp = -1;                                                          \</div><div class='add'>+        if (!xattr) {                                                          \</div><div class='add'>+            xattr = dict_new();                                                \</div><div class='add'>+            if (!xattr)                                                        \</div><div class='add'>+                break;                                                         \</div><div class='add'>+        }                                                                      \</div><div class='add'>+        tmp = dict_set_str(xattr, GLUSTERFS_MARKER_DONT_ACCOUNT_KEY, "yes");   \</div><div class='add'>+        if (tmp) {                                                             \</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, 0, DHT_MSG_DICT_SET_FAILED,       \</div><div class='add'>+                   "Failed to set dictionary value: key = %s,"                 \</div><div class='add'>+                   " path = %s",                                               \</div><div class='add'>+                   GLUSTERFS_MARKER_DONT_ACCOUNT_KEY, local-&gt;loc.path);        \</div><div class='add'>+        }                                                                      \</div><div class='add'>+    } while (0)</div><div class='add'>+</div><div class='add'>+#define DHT_CHANGELOG_TRACK_AS_RENAME(xattr, oldloc, newloc)                   \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        int tmp = -1;                                                          \</div><div class='add'>+        if (!xattr) {                                                          \</div><div class='add'>+            xattr = dict_new();                                                \</div><div class='add'>+            if (!xattr) {                                                      \</div><div class='add'>+                gf_msg(this-&gt;name, GF_LOG_ERROR, 0, DHT_MSG_DICT_SET_FAILED,   \</div><div class='add'>+                       "Failed to create dictionary to "                       \</div><div class='add'>+                       "track rename");                                        \</div><div class='add'>+                break;                                                         \</div><div class='add'>+            }                                                                  \</div><div class='add'>+        }                                                                      \</div><div class='add'>+                                                                               \</div><div class='add'>+        tmp = dht_rename_track_for_changelog(this, xattr, oldloc, newloc);     \</div><div class='add'>+                                                                               \</div><div class='add'>+        if (tmp) {                                                             \</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, 0, DHT_MSG_DICT_SET_FAILED,       \</div><div class='add'>+                   "Failed to set dictionary value: key = %s,"                 \</div><div class='add'>+                   " path = %s",                                               \</div><div class='add'>+                   DHT_CHANGELOG_RENAME_OP_KEY, (oldloc)-&gt;path);               \</div><div class='add'>+        }                                                                      \</div><div class='add'>+    } while (0)</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-dht_rename_unlink_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-		       int32_t op_ret, int32_t op_errno, struct iatt *preparent,</div><div class='del'>-                       struct iatt *postparent)</div><div class='add'>+dht_rename_unlock(call_frame_t *frame, xlator_t *this)</div><div class='ctx'> {</div><div class='del'>-	dht_local_t  *local = NULL;</div><div class='del'>-	call_frame_t *prev = NULL;</div><div class='del'>-	int           this_call_cnt = 0;</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    int op_ret = -1;</div><div class='add'>+    char src_gfid[GF_UUID_BUF_SIZE] = {0};</div><div class='add'>+    char dst_gfid[GF_UUID_BUF_SIZE] = {0};</div><div class='add'>+    dht_ilock_wrap_t inodelk_wrapper = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    inodelk_wrapper.locks = local-&gt;rename_inodelk_backward_compatible;</div><div class='add'>+    inodelk_wrapper.lk_count = local-&gt;rename_inodelk_bc_count;</div><div class='add'>+</div><div class='add'>+    op_ret = dht_unlock_inodelk_wrapper(frame, &amp;inodelk_wrapper);</div><div class='add'>+    if (op_ret &lt; 0) {</div><div class='add'>+        uuid_utoa_r(local-&gt;loc.inode-&gt;gfid, src_gfid);</div><div class='add'>+</div><div class='add'>+        if (local-&gt;loc2.inode)</div><div class='add'>+            uuid_utoa_r(local-&gt;loc2.inode-&gt;gfid, dst_gfid);</div><div class='add'>+</div><div class='add'>+        if (IA_ISREG(local-&gt;stbuf.ia_type))</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_WARNING, 0, DHT_MSG_UNLOCKING_FAILED,</div><div class='add'>+                   "winding unlock inodelk failed "</div><div class='add'>+                   "rename (%s:%s:%s %s:%s:%s), "</div><div class='add'>+                   "stale locks left on bricks",</div><div class='add'>+                   local-&gt;loc.path, src_gfid, local-&gt;src_cached-&gt;name,</div><div class='add'>+                   local-&gt;loc2.path, dst_gfid,</div><div class='add'>+                   local-&gt;dst_cached ? local-&gt;dst_cached-&gt;name : NULL);</div><div class='add'>+        else</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_WARNING, 0, DHT_MSG_UNLOCKING_FAILED,</div><div class='add'>+                   "winding unlock inodelk failed "</div><div class='add'>+                   "rename (%s:%s %s:%s), "</div><div class='add'>+                   "stale locks left on bricks",</div><div class='add'>+                   local-&gt;loc.path, src_gfid, local-&gt;loc2.path, dst_gfid);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    dht_unlock_namespace(frame, &amp;local-&gt;lock[0]);</div><div class='add'>+    dht_unlock_namespace(frame, &amp;local-&gt;lock[1]);</div><div class='add'>+</div><div class='add'>+    dht_rename_unlock_cbk(frame, NULL, this, local-&gt;op_ret, local-&gt;op_errno,</div><div class='add'>+                          NULL);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-	prev  = cookie;</div><div class='add'>+int</div><div class='add'>+dht_rename_done(call_frame_t *frame, xlator_t *this)</div><div class='add'>+{</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='ctx'> </div><div class='del'>-        if (!local) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-                        "!local, should not happen");</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='add'>+    local = frame-&gt;local;</div><div class='ctx'> </div><div class='del'>-	this_call_cnt = dht_frame_return (frame);</div><div class='add'>+    if (local-&gt;linked == _gf_true) {</div><div class='add'>+        local-&gt;linked = _gf_false;</div><div class='add'>+        dht_linkfile_attr_heal(frame, this);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	if (op_ret == -1) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-			"unlink on %s failed (%s)",</div><div class='del'>-			prev-&gt;this-&gt;name, strerror (op_errno));</div><div class='del'>-	}</div><div class='add'>+    dht_rename_unlock(frame, this);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        WIPE (&amp;local-&gt;preoldparent);</div><div class='del'>-        WIPE (&amp;local-&gt;postoldparent);</div><div class='del'>-        WIPE (&amp;local-&gt;preparent);</div><div class='del'>-        WIPE (&amp;local-&gt;postparent);</div><div class='add'>+int</div><div class='add'>+dht_rename_unlink_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                      int32_t op_ret, int32_t op_errno, struct iatt *preparent,</div><div class='add'>+                      struct iatt *postparent, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    xlator_t *prev = NULL;</div><div class='add'>+    int this_call_cnt = 0;</div><div class='ctx'> </div><div class='del'>-	if (is_last_call (this_call_cnt)) {</div><div class='del'>-		DHT_STACK_UNWIND (rename, frame, local-&gt;op_ret, local-&gt;op_errno,</div><div class='del'>-				  &amp;local-&gt;stbuf, &amp;local-&gt;preoldparent,</div><div class='del'>-                                  &amp;local-&gt;postoldparent, &amp;local-&gt;preparent,</div><div class='del'>-                                  &amp;local-&gt;postparent);</div><div class='del'>-        }</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    prev = cookie;</div><div class='add'>+</div><div class='add'>+    FRAME_SU_UNDO(frame, dht_local_t);</div><div class='add'>+    if (!local) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_ERROR, 0, DHT_MSG_INVALID_VALUE,</div><div class='add'>+               "!local, should not happen");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    this_call_cnt = dht_frame_return(frame);</div><div class='add'>+</div><div class='add'>+    if (op_ret == -1) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_WARNING, op_errno, DHT_MSG_UNLINK_FAILED,</div><div class='add'>+               "%s: Rename: unlink on %s failed ", local-&gt;loc.path, prev-&gt;name);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    WIPE(&amp;local-&gt;preoldparent);</div><div class='add'>+    WIPE(&amp;local-&gt;postoldparent);</div><div class='add'>+    WIPE(&amp;local-&gt;preparent);</div><div class='add'>+    WIPE(&amp;local-&gt;postparent);</div><div class='add'>+</div><div class='add'>+    if (is_last_call(this_call_cnt)) {</div><div class='add'>+        dht_rename_done(frame, this);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='ctx'> out:</div><div class='del'>-	return 0;</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-dht_rename_cleanup (call_frame_t *frame)</div><div class='add'>+dht_rename_cleanup(call_frame_t *frame)</div><div class='ctx'> {</div><div class='del'>-	dht_local_t *local = NULL;</div><div class='del'>-	xlator_t    *this = NULL;</div><div class='del'>-	xlator_t    *src_hashed = NULL;</div><div class='del'>-	xlator_t    *src_cached = NULL;</div><div class='del'>-	xlator_t    *dst_hashed = NULL;</div><div class='del'>-	xlator_t    *dst_cached = NULL;</div><div class='del'>-	int          call_cnt = 0;</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    xlator_t *this = NULL;</div><div class='add'>+    xlator_t *src_hashed = NULL;</div><div class='add'>+    xlator_t *src_cached = NULL;</div><div class='add'>+    xlator_t *dst_hashed = NULL;</div><div class='add'>+    xlator_t *dst_cached = NULL;</div><div class='add'>+    int call_cnt = 0;</div><div class='add'>+    dict_t *xattr = NULL;</div><div class='add'>+    char gfid[GF_UUID_BUF_SIZE] = {0};</div><div class='ctx'> </div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    this = frame-&gt;this;</div><div class='ctx'> </div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-	this  = frame-&gt;this;</div><div class='add'>+    src_hashed = local-&gt;src_hashed;</div><div class='add'>+    src_cached = local-&gt;src_cached;</div><div class='add'>+    dst_hashed = local-&gt;dst_hashed;</div><div class='add'>+    dst_cached = local-&gt;dst_cached;</div><div class='ctx'> </div><div class='del'>-	src_hashed = local-&gt;src_hashed;</div><div class='del'>-	src_cached = local-&gt;src_cached;</div><div class='del'>-	dst_hashed = local-&gt;dst_hashed;</div><div class='del'>-	dst_cached = local-&gt;dst_cached;</div><div class='add'>+    if (src_cached == dst_cached)</div><div class='add'>+        goto nolinks;</div><div class='ctx'> </div><div class='del'>-	if (src_cached == dst_cached)</div><div class='del'>-		goto nolinks;</div><div class='add'>+    if (local-&gt;linked &amp;&amp; (dst_hashed != src_hashed) &amp;&amp;</div><div class='add'>+        (dst_hashed != src_cached)) {</div><div class='add'>+        call_cnt++;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	if (dst_hashed != src_hashed &amp;&amp; dst_hashed != src_cached)</div><div class='del'>-		call_cnt++;</div><div class='add'>+    if (local-&gt;added_link &amp;&amp; (src_cached != dst_hashed)) {</div><div class='add'>+        call_cnt++;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	if (src_cached != dst_hashed)</div><div class='del'>-		call_cnt++;</div><div class='add'>+    local-&gt;call_cnt = call_cnt;</div><div class='ctx'> </div><div class='del'>-	local-&gt;call_cnt = call_cnt;</div><div class='add'>+    if (!call_cnt)</div><div class='add'>+        goto nolinks;</div><div class='ctx'> </div><div class='del'>-        if (!call_cnt)</div><div class='del'>-                goto nolinks;</div><div class='add'>+    DHT_MARK_FOP_INTERNAL(xattr);</div><div class='ctx'> </div><div class='del'>-	if (dst_hashed != src_hashed &amp;&amp; dst_hashed != src_cached) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_TRACE,</div><div class='del'>-			"unlinking linkfile %s @ %s =&gt; %s",</div><div class='del'>-			local-&gt;loc.path, dst_hashed-&gt;name, src_cached-&gt;name);</div><div class='del'>-                STACK_WIND (frame, dht_rename_unlink_cbk,</div><div class='del'>-                            dst_hashed, dst_hashed-&gt;fops-&gt;unlink,</div><div class='del'>-                            &amp;local-&gt;loc);</div><div class='del'>-	}</div><div class='add'>+    gf_uuid_unparse(local-&gt;loc.inode-&gt;gfid, gfid);</div><div class='ctx'> </div><div class='del'>-	if (src_cached != dst_hashed) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_TRACE,</div><div class='del'>-			"unlinking link %s =&gt; %s (%s)", local-&gt;loc.path,</div><div class='del'>-			local-&gt;loc2.path, src_cached-&gt;name);</div><div class='del'>-		STACK_WIND (frame, dht_rename_unlink_cbk,</div><div class='del'>-			    src_cached, src_cached-&gt;fops-&gt;unlink,</div><div class='del'>-			    &amp;local-&gt;loc2);</div><div class='del'>-	}</div><div class='add'>+    if (local-&gt;linked &amp;&amp; (dst_hashed != src_hashed) &amp;&amp;</div><div class='add'>+        (dst_hashed != src_cached)) {</div><div class='add'>+        dict_t *xattr_new = NULL;</div><div class='ctx'> </div><div class='del'>-        return 0;</div><div class='add'>+        gf_msg_trace(this-&gt;name, 0,</div><div class='add'>+                     "unlinking linkfile %s @ %s =&gt; %s, (gfid = %s)",</div><div class='add'>+                     local-&gt;loc.path, dst_hashed-&gt;name, src_cached-&gt;name, gfid);</div><div class='add'>+</div><div class='add'>+        xattr_new = dict_copy_with_ref(xattr, NULL);</div><div class='add'>+</div><div class='add'>+        DHT_MARKER_DONT_ACCOUNT(xattr_new);</div><div class='add'>+</div><div class='add'>+        FRAME_SU_DO(frame, dht_local_t);</div><div class='add'>+        STACK_WIND_COOKIE(frame, dht_rename_unlink_cbk, dst_hashed, dst_hashed,</div><div class='add'>+                          dst_hashed-&gt;fops-&gt;unlink, &amp;local-&gt;loc, 0, xattr_new);</div><div class='add'>+</div><div class='add'>+        dict_unref(xattr_new);</div><div class='add'>+        xattr_new = NULL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (local-&gt;added_link &amp;&amp; (src_cached != dst_hashed)) {</div><div class='add'>+        dict_t *xattr_new = NULL;</div><div class='add'>+</div><div class='add'>+        gf_msg_trace(this-&gt;name, 0, "unlinking link %s =&gt; %s (%s), (gfid = %s)",</div><div class='add'>+                     local-&gt;loc.path, local-&gt;loc2.path, src_cached-&gt;name, gfid);</div><div class='add'>+</div><div class='add'>+        xattr_new = dict_copy_with_ref(xattr, NULL);</div><div class='add'>+</div><div class='add'>+        if (gf_uuid_compare(local-&gt;loc.pargfid, local-&gt;loc2.pargfid) == 0) {</div><div class='add'>+            DHT_MARKER_DONT_ACCOUNT(xattr_new);</div><div class='add'>+        }</div><div class='add'>+        /* *</div><div class='add'>+         * The link to file is created using root permission.</div><div class='add'>+         * Hence deletion should happen using root. Otherwise</div><div class='add'>+         * it will fail.</div><div class='add'>+         */</div><div class='add'>+        FRAME_SU_DO(frame, dht_local_t);</div><div class='add'>+        STACK_WIND_COOKIE(frame, dht_rename_unlink_cbk, src_cached, src_cached,</div><div class='add'>+                          src_cached-&gt;fops-&gt;unlink, &amp;local-&gt;loc2, 0, xattr_new);</div><div class='add'>+</div><div class='add'>+        dict_unref(xattr_new);</div><div class='add'>+        xattr_new = NULL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (xattr)</div><div class='add'>+        dict_unref(xattr);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='ctx'> </div><div class='ctx'> nolinks:</div><div class='del'>-        WIPE (&amp;local-&gt;preoldparent);</div><div class='del'>-        WIPE (&amp;local-&gt;postoldparent);</div><div class='del'>-        WIPE (&amp;local-&gt;preparent);</div><div class='del'>-        WIPE (&amp;local-&gt;postparent);</div><div class='add'>+    WIPE(&amp;local-&gt;preoldparent);</div><div class='add'>+    WIPE(&amp;local-&gt;postoldparent);</div><div class='add'>+    WIPE(&amp;local-&gt;preparent);</div><div class='add'>+    WIPE(&amp;local-&gt;postparent);</div><div class='ctx'> </div><div class='del'>-	DHT_STACK_UNWIND (rename, frame, local-&gt;op_ret, local-&gt;op_errno,</div><div class='del'>-			  &amp;local-&gt;stbuf, &amp;local-&gt;preoldparent,</div><div class='del'>-                          &amp;local-&gt;postoldparent, &amp;local-&gt;preparent,</div><div class='del'>-                          &amp;local-&gt;postparent);</div><div class='add'>+    dht_rename_unlock(frame, this);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        return 0;</div><div class='add'>+int</div><div class='add'>+dht_rename_unlink(call_frame_t *frame, xlator_t *this)</div><div class='add'>+{</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    xlator_t *src_hashed = NULL;</div><div class='add'>+    xlator_t *src_cached = NULL;</div><div class='add'>+    xlator_t *dst_hashed = NULL;</div><div class='add'>+    xlator_t *dst_cached = NULL;</div><div class='add'>+    xlator_t *rename_subvol = NULL;</div><div class='add'>+    dict_t *xattr = NULL;</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+</div><div class='add'>+    src_hashed = local-&gt;src_hashed;</div><div class='add'>+    src_cached = local-&gt;src_cached;</div><div class='add'>+    dst_hashed = local-&gt;dst_hashed;</div><div class='add'>+    dst_cached = local-&gt;dst_cached;</div><div class='add'>+</div><div class='add'>+    local-&gt;call_cnt = 0;</div><div class='add'>+</div><div class='add'>+    /* NOTE: rename_subvol is the same subvolume from which dht_rename_cbk</div><div class='add'>+     * is called. since rename has already happened on rename_subvol,</div><div class='add'>+     * unlink shouldn't be sent for oldpath (either linkfile or cached-file)</div><div class='add'>+     * on rename_subvol. */</div><div class='add'>+    if (src_cached == dst_cached)</div><div class='add'>+        rename_subvol = src_cached;</div><div class='add'>+    else</div><div class='add'>+        rename_subvol = dst_hashed;</div><div class='add'>+</div><div class='add'>+    /* TODO: delete files in background */</div><div class='add'>+</div><div class='add'>+    if (src_cached != dst_hashed &amp;&amp; src_cached != dst_cached)</div><div class='add'>+        local-&gt;call_cnt++;</div><div class='add'>+</div><div class='add'>+    if (src_hashed != rename_subvol &amp;&amp; src_hashed != src_cached)</div><div class='add'>+        local-&gt;call_cnt++;</div><div class='add'>+</div><div class='add'>+    if (dst_cached &amp;&amp; dst_cached != dst_hashed &amp;&amp; dst_cached != src_cached)</div><div class='add'>+        local-&gt;call_cnt++;</div><div class='add'>+</div><div class='add'>+    if (local-&gt;call_cnt == 0)</div><div class='add'>+        goto unwind;</div><div class='add'>+</div><div class='add'>+    DHT_MARK_FOP_INTERNAL(xattr);</div><div class='add'>+</div><div class='add'>+    if (src_cached != dst_hashed &amp;&amp; src_cached != dst_cached) {</div><div class='add'>+        dict_t *xattr_new = NULL;</div><div class='add'>+</div><div class='add'>+        xattr_new = dict_copy_with_ref(xattr, NULL);</div><div class='add'>+</div><div class='add'>+        gf_msg_trace(this-&gt;name, 0, "deleting old src datafile %s @ %s",</div><div class='add'>+                     local-&gt;loc.path, src_cached-&gt;name);</div><div class='add'>+</div><div class='add'>+        if (gf_uuid_compare(local-&gt;loc.pargfid, local-&gt;loc2.pargfid) == 0) {</div><div class='add'>+            DHT_MARKER_DONT_ACCOUNT(xattr_new);</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        DHT_CHANGELOG_TRACK_AS_RENAME(xattr_new, &amp;local-&gt;loc, &amp;local-&gt;loc2);</div><div class='add'>+        STACK_WIND_COOKIE(frame, dht_rename_unlink_cbk, src_cached, src_cached,</div><div class='add'>+                          src_cached-&gt;fops-&gt;unlink, &amp;local-&gt;loc, 0, xattr_new);</div><div class='add'>+</div><div class='add'>+        dict_unref(xattr_new);</div><div class='add'>+        xattr_new = NULL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (src_hashed != rename_subvol &amp;&amp; src_hashed != src_cached) {</div><div class='add'>+        dict_t *xattr_new = NULL;</div><div class='add'>+</div><div class='add'>+        xattr_new = dict_copy_with_ref(xattr, NULL);</div><div class='add'>+</div><div class='add'>+        gf_msg_trace(this-&gt;name, 0, "deleting old src linkfile %s @ %s",</div><div class='add'>+                     local-&gt;loc.path, src_hashed-&gt;name);</div><div class='add'>+</div><div class='add'>+        DHT_MARKER_DONT_ACCOUNT(xattr_new);</div><div class='add'>+</div><div class='add'>+        STACK_WIND_COOKIE(frame, dht_rename_unlink_cbk, src_hashed, src_hashed,</div><div class='add'>+                          src_hashed-&gt;fops-&gt;unlink, &amp;local-&gt;loc, 0, xattr_new);</div><div class='add'>+</div><div class='add'>+        dict_unref(xattr_new);</div><div class='add'>+        xattr_new = NULL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (dst_cached &amp;&amp; (dst_cached != dst_hashed) &amp;&amp;</div><div class='add'>+        (dst_cached != src_cached)) {</div><div class='add'>+        gf_msg_trace(this-&gt;name, 0, "deleting old dst datafile %s @ %s",</div><div class='add'>+                     local-&gt;loc2.path, dst_cached-&gt;name);</div><div class='add'>+</div><div class='add'>+        STACK_WIND_COOKIE(frame, dht_rename_unlink_cbk, dst_cached, dst_cached,</div><div class='add'>+                          dst_cached-&gt;fops-&gt;unlink, &amp;local-&gt;loc2, 0, xattr);</div><div class='add'>+    }</div><div class='add'>+    if (xattr)</div><div class='add'>+        dict_unref(xattr);</div><div class='add'>+    return 0;</div><div class='add'>+</div><div class='add'>+unwind:</div><div class='add'>+    WIPE(&amp;local-&gt;preoldparent);</div><div class='add'>+    WIPE(&amp;local-&gt;postoldparent);</div><div class='add'>+    WIPE(&amp;local-&gt;preparent);</div><div class='add'>+    WIPE(&amp;local-&gt;postparent);</div><div class='add'>+</div><div class='add'>+    dht_rename_done(frame, this);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+int</div><div class='add'>+dht_rename_links_create_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                            int32_t op_ret, int32_t op_errno, inode_t *inode,</div><div class='add'>+                            struct iatt *stbuf, struct iatt *preparent,</div><div class='add'>+                            struct iatt *postparent, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    xlator_t *prev = NULL;</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    call_frame_t *main_frame = NULL;</div><div class='add'>+</div><div class='add'>+    prev = cookie;</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    main_frame = local-&gt;main_frame;</div><div class='add'>+</div><div class='add'>+    /* TODO: Handle this case in lookup-optimize */</div><div class='add'>+    if (op_ret == -1) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_WARNING, op_errno, DHT_MSG_CREATE_LINK_FAILED,</div><div class='add'>+               "link/file %s on %s failed", local-&gt;loc.path, prev-&gt;name);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (local-&gt;linked == _gf_true) {</div><div class='add'>+        local-&gt;linked = _gf_false;</div><div class='add'>+        dht_linkfile_attr_heal(frame, this);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    dht_rename_unlink(main_frame, this);</div><div class='add'>+    DHT_STACK_DESTROY(frame);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-dht_rename_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-		int32_t op_ret, int32_t op_errno, struct iatt *stbuf,</div><div class='del'>-                struct iatt *preoldparent, struct iatt *postoldparent,</div><div class='del'>-                struct iatt *prenewparent, struct iatt *postnewparent)</div><div class='del'>-{</div><div class='del'>-	dht_local_t  *local = NULL;</div><div class='del'>-	call_frame_t *prev = NULL;</div><div class='del'>-	xlator_t     *src_hashed = NULL;</div><div class='del'>-	xlator_t     *src_cached = NULL;</div><div class='del'>-	xlator_t     *dst_hashed = NULL;</div><div class='del'>-	xlator_t     *dst_cached = NULL;</div><div class='del'>-	xlator_t     *rename_subvol = NULL;</div><div class='del'>-</div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-	prev = cookie;</div><div class='del'>-</div><div class='del'>-	src_hashed = local-&gt;src_hashed;</div><div class='del'>-	src_cached = local-&gt;src_cached;</div><div class='del'>-	dst_hashed = local-&gt;dst_hashed;</div><div class='del'>-	dst_cached = local-&gt;dst_cached;</div><div class='del'>-</div><div class='del'>-	if (op_ret == -1) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-			"rename on %s failed (%s)", prev-&gt;this-&gt;name,</div><div class='del'>-			strerror (op_errno));</div><div class='del'>-		local-&gt;op_ret   = op_ret;</div><div class='del'>-		local-&gt;op_errno = op_errno;</div><div class='del'>-		goto cleanup;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-        dht_iatt_merge (this, &amp;local-&gt;stbuf, stbuf, prev-&gt;this);</div><div class='del'>-        dht_iatt_merge (this, &amp;local-&gt;preoldparent, preoldparent, prev-&gt;this);</div><div class='del'>-        dht_iatt_merge (this, &amp;local-&gt;postoldparent, postoldparent, prev-&gt;this);</div><div class='del'>-        dht_iatt_merge (this, &amp;local-&gt;preparent, prenewparent, prev-&gt;this);</div><div class='del'>-        dht_iatt_merge (this, &amp;local-&gt;postparent, postnewparent, prev-&gt;this);</div><div class='del'>-</div><div class='del'>-        local-&gt;stbuf.ia_ino = local-&gt;loc.inode-&gt;ino;</div><div class='del'>-</div><div class='del'>-        local-&gt;preoldparent.ia_ino = local-&gt;loc.parent-&gt;ino;</div><div class='del'>-        local-&gt;postoldparent.ia_ino = local-&gt;loc.parent-&gt;ino;</div><div class='del'>-</div><div class='del'>-        local-&gt;preparent.ia_ino = local-&gt;loc2.parent-&gt;ino;</div><div class='del'>-        local-&gt;postparent.ia_ino = local-&gt;loc2.parent-&gt;ino;</div><div class='del'>-	</div><div class='del'>-	/* NOTE: rename_subvol is the same subvolume from which dht_rename_cbk</div><div class='del'>-	 *       is called. since rename has already happened on rename_subvol,</div><div class='del'>-	 *       unlink should not be sent for oldpath (either linkfile or cached-file)</div><div class='del'>-	 *       on rename_subvol. */</div><div class='del'>-	if (src_cached == dst_cached)</div><div class='del'>-		rename_subvol = src_cached;</div><div class='del'>-	else</div><div class='del'>-		rename_subvol = dst_hashed;</div><div class='del'>-</div><div class='del'>-	/* TODO: delete files in background */</div><div class='del'>-</div><div class='del'>-	if (src_cached != dst_hashed &amp;&amp; src_cached != dst_cached)</div><div class='del'>-		local-&gt;call_cnt++;</div><div class='del'>-</div><div class='del'>-	if (src_hashed != rename_subvol &amp;&amp; src_hashed != src_cached)</div><div class='del'>-		local-&gt;call_cnt++;</div><div class='del'>-</div><div class='del'>-	if (dst_cached &amp;&amp; dst_cached != dst_hashed &amp;&amp; dst_cached != src_cached)</div><div class='del'>-		local-&gt;call_cnt++;</div><div class='del'>-</div><div class='del'>-	if (local-&gt;call_cnt == 0)</div><div class='del'>-		goto unwind;</div><div class='del'>-</div><div class='del'>-	if (src_cached != dst_hashed &amp;&amp; src_cached != dst_cached) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_TRACE,</div><div class='del'>-			"deleting old src datafile %s @ %s",</div><div class='del'>-			local-&gt;loc.path, src_cached-&gt;name);</div><div class='del'>-</div><div class='del'>-		STACK_WIND (frame, dht_rename_unlink_cbk,</div><div class='del'>-			    src_cached, src_cached-&gt;fops-&gt;unlink,</div><div class='del'>-			    &amp;local-&gt;loc);</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	if (src_hashed != rename_subvol &amp;&amp; src_hashed != src_cached) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_TRACE,</div><div class='del'>-			"deleting old src linkfile %s @ %s",</div><div class='del'>-			local-&gt;loc.path, src_hashed-&gt;name);</div><div class='del'>-</div><div class='del'>-		STACK_WIND (frame, dht_rename_unlink_cbk,</div><div class='del'>-			    src_hashed, src_hashed-&gt;fops-&gt;unlink,</div><div class='del'>-			    &amp;local-&gt;loc);</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	if (dst_cached</div><div class='del'>-	    &amp;&amp; (dst_cached != dst_hashed)</div><div class='del'>-	    &amp;&amp; (dst_cached != src_cached)) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_TRACE,</div><div class='del'>-			"deleting old dst datafile %s @ %s",</div><div class='del'>-			local-&gt;loc2.path, dst_cached-&gt;name);</div><div class='del'>-</div><div class='del'>-		STACK_WIND (frame, dht_rename_unlink_cbk,</div><div class='del'>-			    dst_cached, dst_cached-&gt;fops-&gt;unlink,</div><div class='del'>-			    &amp;local-&gt;loc2);</div><div class='del'>-	}</div><div class='del'>-	return 0;</div><div class='add'>+dht_rename_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+               int32_t op_ret, int32_t op_errno, struct iatt *stbuf,</div><div class='add'>+               struct iatt *preoldparent, struct iatt *postoldparent,</div><div class='add'>+               struct iatt *prenewparent, struct iatt *postnewparent,</div><div class='add'>+               dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    xlator_t *prev = NULL;</div><div class='add'>+    xlator_t *src_cached = NULL;</div><div class='add'>+    xlator_t *dst_hashed = NULL;</div><div class='add'>+    xlator_t *dst_cached = NULL;</div><div class='add'>+    call_frame_t *link_frame = NULL;</div><div class='add'>+    dht_local_t *link_local = NULL;</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    prev = cookie;</div><div class='add'>+</div><div class='add'>+    src_cached = local-&gt;src_cached;</div><div class='add'>+    dst_hashed = local-&gt;dst_hashed;</div><div class='add'>+    dst_cached = local-&gt;dst_cached;</div><div class='add'>+</div><div class='add'>+    if (local-&gt;linked == _gf_true)</div><div class='add'>+        FRAME_SU_UNDO(frame, dht_local_t);</div><div class='add'>+</div><div class='add'>+    /* It is a critical failure iff we fail to rename the cached file</div><div class='add'>+     * if the rename of the linkto failed, it is not a critical failure,</div><div class='add'>+     * and we do not want to lose the created hard link for the new</div><div class='add'>+     * name as that could have been read by other clients.</div><div class='add'>+     *</div><div class='add'>+     * NOTE: If another client is attempting the same oldname -&gt; newname</div><div class='add'>+     * rename, and finds both file names as existing, and are hard links</div><div class='add'>+     * to each other, then FUSE would send in an unlink for oldname. In</div><div class='add'>+     * this time duration if we treat the linkto as a critical error and</div><div class='add'>+     * unlink the newname we created, we would have effectively lost the</div><div class='add'>+     * file to rename operations.</div><div class='add'>+     *</div><div class='add'>+     * Repercussions of treating this as a non-critical error is that</div><div class='add'>+     * we could leave behind a stale linkto file and/or not create the new</div><div class='add'>+     * linkto file, the second case would be rectified by a subsequent</div><div class='add'>+     * lookup, the first case by a rebalance, like for all stale linkto</div><div class='add'>+     * files */</div><div class='add'>+</div><div class='add'>+    if (op_ret == -1) {</div><div class='add'>+        /* Critical failure: unable to rename the cached file */</div><div class='add'>+        if (prev == src_cached) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_WARNING, op_errno, DHT_MSG_RENAME_FAILED,</div><div class='add'>+                   "%s: Rename on %s failed, (gfid = %s) ", local-&gt;loc.path,</div><div class='add'>+                   prev-&gt;name,</div><div class='add'>+                   local-&gt;loc.inode ? uuid_utoa(local-&gt;loc.inode-&gt;gfid) : "");</div><div class='add'>+            local-&gt;op_ret = op_ret;</div><div class='add'>+            local-&gt;op_errno = op_errno;</div><div class='add'>+            goto cleanup;</div><div class='add'>+        } else {</div><div class='add'>+            /* Non-critical failure, unable to rename the linkto</div><div class='add'>+             * file</div><div class='add'>+             */</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_INFO, op_errno, DHT_MSG_RENAME_FAILED,</div><div class='add'>+                   "%s: Rename (linkto file) on %s failed, "</div><div class='add'>+                   "(gfid = %s) ",</div><div class='add'>+                   local-&gt;loc.path, prev-&gt;name,</div><div class='add'>+                   local-&gt;loc.inode ? uuid_utoa(local-&gt;loc.inode-&gt;gfid) : "");</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    if (xdata) {</div><div class='add'>+        if (!local-&gt;xattr)</div><div class='add'>+            local-&gt;xattr = dict_ref(xdata);</div><div class='add'>+        else</div><div class='add'>+            local-&gt;xattr = dict_copy_with_ref(xdata, local-&gt;xattr);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Merge attrs only from src_cached. In case there of src_cached !=</div><div class='add'>+     * dst_hashed, this ignores linkfile attrs. */</div><div class='add'>+    if (prev == src_cached) {</div><div class='add'>+        dht_iatt_merge(this, &amp;local-&gt;stbuf, stbuf);</div><div class='add'>+        dht_iatt_merge(this, &amp;local-&gt;preoldparent, preoldparent);</div><div class='add'>+        dht_iatt_merge(this, &amp;local-&gt;postoldparent, postoldparent);</div><div class='add'>+        dht_iatt_merge(this, &amp;local-&gt;preparent, prenewparent);</div><div class='add'>+        dht_iatt_merge(this, &amp;local-&gt;postparent, postnewparent);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Create the linkto file for the dst file */</div><div class='add'>+    if ((src_cached == dst_cached) &amp;&amp; (dst_hashed != dst_cached)) {</div><div class='add'>+        link_frame = copy_frame(frame);</div><div class='add'>+        if (!link_frame) {</div><div class='add'>+            goto unlink;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-unwind:</div><div class='del'>-        WIPE (&amp;local-&gt;preoldparent);</div><div class='del'>-        WIPE (&amp;local-&gt;postoldparent);</div><div class='del'>-        WIPE (&amp;local-&gt;preparent);</div><div class='del'>-        WIPE (&amp;local-&gt;postparent);</div><div class='add'>+        /* fop value sent as maxvalue because it is not used</div><div class='add'>+         * anywhere in this case */</div><div class='add'>+        link_local = dht_local_init(link_frame, &amp;local-&gt;loc2, NULL,</div><div class='add'>+                                    GF_FOP_MAXVALUE);</div><div class='add'>+        if (!link_local) {</div><div class='add'>+            goto unlink;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        if (link_local-&gt;loc.inode)</div><div class='add'>+            inode_unref(link_local-&gt;loc.inode);</div><div class='add'>+        link_local-&gt;loc.inode = inode_ref(local-&gt;loc.inode);</div><div class='add'>+        link_local-&gt;main_frame = frame;</div><div class='add'>+        link_local-&gt;stbuf = local-&gt;stbuf;</div><div class='add'>+        gf_uuid_copy(link_local-&gt;gfid, local-&gt;loc.inode-&gt;gfid);</div><div class='ctx'> </div><div class='del'>-	DHT_STACK_UNWIND (rename, frame, local-&gt;op_ret, local-&gt;op_errno,</div><div class='del'>-			  &amp;local-&gt;stbuf, &amp;local-&gt;preoldparent,</div><div class='del'>-                          &amp;local-&gt;postoldparent, &amp;local-&gt;preparent,</div><div class='del'>-                          &amp;local-&gt;postparent);</div><div class='add'>+        dht_linkfile_create(link_frame, dht_rename_links_create_cbk, this,</div><div class='add'>+                            src_cached, dst_hashed, &amp;link_local-&gt;loc);</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	return 0;</div><div class='add'>+unlink:</div><div class='add'>+</div><div class='add'>+    if (link_frame) {</div><div class='add'>+        DHT_STACK_DESTROY(link_frame);</div><div class='add'>+    }</div><div class='add'>+    dht_rename_unlink(frame, this);</div><div class='add'>+    return 0;</div><div class='ctx'> </div><div class='ctx'> cleanup:</div><div class='del'>-        dht_rename_cleanup (frame);</div><div class='add'>+    dht_rename_cleanup(frame);</div><div class='ctx'> </div><div class='del'>-        return 0;</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+int</div><div class='add'>+dht_do_rename(call_frame_t *frame)</div><div class='add'>+{</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    xlator_t *dst_hashed = NULL;</div><div class='add'>+    xlator_t *src_cached = NULL;</div><div class='add'>+    xlator_t *dst_cached = NULL;</div><div class='add'>+    xlator_t *this = NULL;</div><div class='add'>+    xlator_t *rename_subvol = NULL;</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    this = frame-&gt;this;</div><div class='add'>+</div><div class='add'>+    dst_hashed = local-&gt;dst_hashed;</div><div class='add'>+    dst_cached = local-&gt;dst_cached;</div><div class='add'>+    src_cached = local-&gt;src_cached;</div><div class='add'>+</div><div class='add'>+    if (src_cached == dst_cached)</div><div class='add'>+        rename_subvol = src_cached;</div><div class='add'>+    else</div><div class='add'>+        rename_subvol = dst_hashed;</div><div class='add'>+</div><div class='add'>+    if ((src_cached != dst_hashed) &amp;&amp; (rename_subvol == dst_hashed)) {</div><div class='add'>+        DHT_MARKER_DONT_ACCOUNT(local-&gt;xattr_req);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (rename_subvol == src_cached) {</div><div class='add'>+        DHT_CHANGELOG_TRACK_AS_RENAME(local-&gt;xattr_req, &amp;local-&gt;loc,</div><div class='add'>+                                      &amp;local-&gt;loc2);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    gf_msg_trace(this-&gt;name, 0, "renaming %s =&gt; %s (%s)", local-&gt;loc.path,</div><div class='add'>+                 local-&gt;loc2.path, rename_subvol-&gt;name);</div><div class='add'>+</div><div class='add'>+    if (local-&gt;linked == _gf_true)</div><div class='add'>+        FRAME_SU_DO(frame, dht_local_t);</div><div class='add'>+    STACK_WIND_COOKIE(frame, dht_rename_cbk, rename_subvol, rename_subvol,</div><div class='add'>+                      rename_subvol-&gt;fops-&gt;rename, &amp;local-&gt;loc, &amp;local-&gt;loc2,</div><div class='add'>+                      local-&gt;xattr_req);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-dht_do_rename (call_frame_t *frame)</div><div class='add'>+dht_rename_link_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                    int32_t op_ret, int32_t op_errno, inode_t *inode,</div><div class='add'>+                    struct iatt *stbuf, struct iatt *preparent,</div><div class='add'>+                    struct iatt *postparent, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-	dht_local_t *local = NULL;</div><div class='del'>-	xlator_t    *dst_hashed = NULL;</div><div class='del'>-	xlator_t    *src_cached = NULL;</div><div class='del'>-	xlator_t    *dst_cached = NULL;</div><div class='del'>-	xlator_t    *this = NULL;</div><div class='del'>-	xlator_t    *rename_subvol = NULL;</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    xlator_t *prev = NULL;</div><div class='ctx'> </div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    prev = cookie;</div><div class='ctx'> </div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-	this  = frame-&gt;this;</div><div class='add'>+    if (op_ret == -1) {</div><div class='add'>+        gf_msg_debug(this-&gt;name, 0, "link/file on %s failed (%s)", prev-&gt;name,</div><div class='add'>+                     strerror(op_errno));</div><div class='add'>+        local-&gt;op_ret = -1;</div><div class='add'>+        local-&gt;op_errno = op_errno;</div><div class='add'>+        local-&gt;added_link = _gf_false;</div><div class='add'>+    } else</div><div class='add'>+        dht_iatt_merge(this, &amp;local-&gt;stbuf, stbuf);</div><div class='ctx'> </div><div class='del'>-	dst_hashed = local-&gt;dst_hashed;</div><div class='del'>-	dst_cached = local-&gt;dst_cached;</div><div class='del'>-	src_cached = local-&gt;src_cached;</div><div class='add'>+    if (local-&gt;op_ret == -1)</div><div class='add'>+        goto cleanup;</div><div class='ctx'> </div><div class='del'>-	if (src_cached == dst_cached)</div><div class='del'>-		rename_subvol = src_cached;</div><div class='del'>-	else</div><div class='del'>-		rename_subvol = dst_hashed;</div><div class='add'>+    dht_do_rename(frame);</div><div class='ctx'> </div><div class='del'>-	gf_log (this-&gt;name, GF_LOG_TRACE,</div><div class='del'>-		"renaming %s =&gt; %s (%s)",</div><div class='del'>-		local-&gt;loc.path, local-&gt;loc2.path, rename_subvol-&gt;name);</div><div class='add'>+    return 0;</div><div class='ctx'> </div><div class='del'>-	STACK_WIND (frame, dht_rename_cbk,</div><div class='del'>-		    rename_subvol, rename_subvol-&gt;fops-&gt;rename,</div><div class='del'>-		    &amp;local-&gt;loc, &amp;local-&gt;loc2);</div><div class='add'>+cleanup:</div><div class='add'>+    dht_rename_cleanup(frame);</div><div class='ctx'> </div><div class='del'>-	return 0;</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-dht_rename_links_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-		      int32_t op_ret, int32_t op_errno,</div><div class='del'>-                      inode_t *inode, struct iatt *stbuf,</div><div class='del'>-                      struct iatt *preparent, struct iatt *postparent)</div><div class='del'>-{</div><div class='del'>-	dht_local_t  *local = NULL;</div><div class='del'>-	call_frame_t *prev = NULL;</div><div class='del'>-	int           this_call_cnt  = 0;</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-	prev = cookie;</div><div class='del'>-	</div><div class='del'>-	if (op_ret == -1) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-			"link/file on %s failed (%s)",</div><div class='del'>-			prev-&gt;this-&gt;name, strerror (op_errno));</div><div class='del'>-		local-&gt;op_ret   = -1;</div><div class='del'>-		local-&gt;op_errno = op_errno;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	this_call_cnt = dht_frame_return (frame);</div><div class='del'>-	if (is_last_call (this_call_cnt)) {</div><div class='del'>-		if (local-&gt;op_ret == -1)</div><div class='del'>-			goto cleanup;</div><div class='del'>-		</div><div class='del'>-		dht_do_rename (frame);</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='add'>+dht_rename_linkto_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                      int32_t op_ret, int32_t op_errno, inode_t *inode,</div><div class='add'>+                      struct iatt *stbuf, struct iatt *preparent,</div><div class='add'>+                      struct iatt *postparent, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    xlator_t *prev = NULL;</div><div class='add'>+    xlator_t *src_cached = NULL;</div><div class='add'>+    dict_t *xattr = NULL;</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    DHT_MARK_FOP_INTERNAL(xattr);</div><div class='add'>+    prev = cookie;</div><div class='add'>+    src_cached = local-&gt;src_cached;</div><div class='add'>+</div><div class='add'>+    if (op_ret == -1) {</div><div class='add'>+        gf_msg_debug(this-&gt;name, 0, "link/file on %s failed (%s)", prev-&gt;name,</div><div class='add'>+                     strerror(op_errno));</div><div class='add'>+        local-&gt;op_ret = -1;</div><div class='add'>+        local-&gt;op_errno = op_errno;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* If linkto creation failed move to failure cleanup code,</div><div class='add'>+     * instead of continuing with creating the link file */</div><div class='add'>+    if (local-&gt;op_ret != 0) {</div><div class='add'>+        goto cleanup;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    gf_msg_trace(this-&gt;name, 0, "link %s =&gt; %s (%s)", local-&gt;loc.path,</div><div class='add'>+                 local-&gt;loc2.path, src_cached-&gt;name);</div><div class='add'>+    if (gf_uuid_compare(local-&gt;loc.pargfid, local-&gt;loc2.pargfid) == 0) {</div><div class='add'>+        DHT_MARKER_DONT_ACCOUNT(xattr);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    local-&gt;added_link = _gf_true;</div><div class='add'>+</div><div class='add'>+    STACK_WIND_COOKIE(frame, dht_rename_link_cbk, src_cached, src_cached,</div><div class='add'>+                      src_cached-&gt;fops-&gt;link, &amp;local-&gt;loc, &amp;local-&gt;loc2, xattr);</div><div class='add'>+</div><div class='add'>+    if (xattr)</div><div class='add'>+        dict_unref(xattr);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='ctx'> </div><div class='ctx'> cleanup:</div><div class='del'>-        dht_rename_cleanup (frame);</div><div class='add'>+    dht_rename_cleanup(frame);</div><div class='ctx'> </div><div class='del'>-	return 0;</div><div class='add'>+    if (xattr)</div><div class='add'>+        dict_unref(xattr);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+int</div><div class='add'>+dht_rename_unlink_links_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                            int32_t op_ret, int32_t op_errno,</div><div class='add'>+                            struct iatt *preparent, struct iatt *postparent,</div><div class='add'>+                            dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    xlator_t *prev = NULL;</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    prev = cookie;</div><div class='add'>+</div><div class='add'>+    if ((op_ret == -1) &amp;&amp; (op_errno != ENOENT)) {</div><div class='add'>+        gf_msg_debug(this-&gt;name, 0, "unlink of %s on %s failed (%s)",</div><div class='add'>+                     local-&gt;loc2.path, prev-&gt;name, strerror(op_errno));</div><div class='add'>+        local-&gt;op_ret = -1;</div><div class='add'>+        local-&gt;op_errno = op_errno;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (local-&gt;op_ret == -1)</div><div class='add'>+        goto cleanup;</div><div class='add'>+</div><div class='add'>+    dht_do_rename(frame);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+</div><div class='add'>+cleanup:</div><div class='add'>+    dht_rename_cleanup(frame);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-dht_rename_create_links (call_frame_t *frame)</div><div class='add'>+dht_rename_create_links(call_frame_t *frame)</div><div class='ctx'> {</div><div class='del'>-	dht_local_t *local = NULL;</div><div class='del'>-	xlator_t    *this = NULL;</div><div class='del'>-	xlator_t    *src_hashed = NULL;</div><div class='del'>-	xlator_t    *src_cached = NULL;</div><div class='del'>-	xlator_t    *dst_hashed = NULL;</div><div class='del'>-	xlator_t    *dst_cached = NULL;</div><div class='del'>-	int          call_cnt = 0;</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    xlator_t *this = NULL;</div><div class='add'>+    xlator_t *src_hashed = NULL;</div><div class='add'>+    xlator_t *src_cached = NULL;</div><div class='add'>+    xlator_t *dst_hashed = NULL;</div><div class='add'>+    xlator_t *dst_cached = NULL;</div><div class='add'>+    int call_cnt = 0;</div><div class='add'>+    dict_t *xattr = NULL;</div><div class='ctx'> </div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    this = frame-&gt;this;</div><div class='ctx'> </div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-	this  = frame-&gt;this;</div><div class='add'>+    src_hashed = local-&gt;src_hashed;</div><div class='add'>+    src_cached = local-&gt;src_cached;</div><div class='add'>+    dst_hashed = local-&gt;dst_hashed;</div><div class='add'>+    dst_cached = local-&gt;dst_cached;</div><div class='ctx'> </div><div class='del'>-	src_hashed = local-&gt;src_hashed;</div><div class='del'>-	src_cached = local-&gt;src_cached;</div><div class='del'>-	dst_hashed = local-&gt;dst_hashed;</div><div class='del'>-	dst_cached = local-&gt;dst_cached;</div><div class='add'>+    DHT_MARK_FOP_INTERNAL(xattr);</div><div class='ctx'> </div><div class='del'>-	if (src_cached == dst_cached)</div><div class='del'>-		goto nolinks;</div><div class='add'>+    if (src_cached == dst_cached) {</div><div class='add'>+        dict_t *xattr_new = NULL;</div><div class='ctx'> </div><div class='del'>-	if (dst_hashed != src_hashed &amp;&amp; dst_hashed != src_cached)</div><div class='del'>-		call_cnt++;</div><div class='add'>+        if (dst_hashed == dst_cached)</div><div class='add'>+            goto nolinks;</div><div class='ctx'> </div><div class='del'>-	if (src_cached != dst_hashed)</div><div class='del'>-		call_cnt++;</div><div class='add'>+        xattr_new = dict_copy_with_ref(xattr, NULL);</div><div class='ctx'> </div><div class='del'>-	local-&gt;call_cnt = call_cnt;</div><div class='add'>+        gf_msg_trace(this-&gt;name, 0, "unlinking dst linkfile %s @ %s",</div><div class='add'>+                     local-&gt;loc2.path, dst_hashed-&gt;name);</div><div class='ctx'> </div><div class='del'>-	if (dst_hashed != src_hashed &amp;&amp; dst_hashed != src_cached) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_TRACE,</div><div class='del'>-			"linkfile %s @ %s =&gt; %s",</div><div class='del'>-			local-&gt;loc.path, dst_hashed-&gt;name, src_cached-&gt;name);</div><div class='del'>-		dht_linkfile_create (frame, dht_rename_links_cbk,</div><div class='del'>-				     src_cached, dst_hashed, &amp;local-&gt;loc);</div><div class='del'>-	}</div><div class='add'>+        DHT_MARKER_DONT_ACCOUNT(xattr_new);</div><div class='ctx'> </div><div class='del'>-	if (src_cached != dst_hashed) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_TRACE,</div><div class='del'>-			"link %s =&gt; %s (%s)", local-&gt;loc.path,</div><div class='del'>-			local-&gt;loc2.path, src_cached-&gt;name);</div><div class='del'>-		STACK_WIND (frame, dht_rename_links_cbk,</div><div class='del'>-			    src_cached, src_cached-&gt;fops-&gt;link,</div><div class='del'>-			    &amp;local-&gt;loc, &amp;local-&gt;loc2);</div><div class='del'>-	}</div><div class='add'>+        STACK_WIND_COOKIE(frame, dht_rename_unlink_links_cbk, dst_hashed,</div><div class='add'>+                          dst_hashed, dst_hashed-&gt;fops-&gt;unlink, &amp;local-&gt;loc2, 0,</div><div class='add'>+                          xattr_new);</div><div class='add'>+</div><div class='add'>+        dict_unref(xattr_new);</div><div class='add'>+        if (xattr)</div><div class='add'>+            dict_unref(xattr);</div><div class='add'>+</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (src_cached != dst_hashed) {</div><div class='add'>+        /* needed to create the link file */</div><div class='add'>+        call_cnt++;</div><div class='add'>+        if (dst_hashed != src_hashed)</div><div class='add'>+            /* needed to create the linkto file */</div><div class='add'>+            call_cnt++;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* We should not have any failures post the link creation, as this</div><div class='add'>+     * introduces the newname into the namespace. Clients could have cached</div><div class='add'>+     * the existence of the newname and may start taking actions based on</div><div class='add'>+     * the same. Hence create the linkto first, and then attempt the link.</div><div class='add'>+     *</div><div class='add'>+     * NOTE: If another client is attempting the same oldname -&gt; newname</div><div class='add'>+     * rename, and finds both file names as existing, and are hard links</div><div class='add'>+     * to each other, then FUSE would send in an unlink for oldname. In</div><div class='add'>+     * this time duration if we treat the linkto as a critical error and</div><div class='add'>+     * unlink the newname we created, we would have effectively lost the</div><div class='add'>+     * file to rename operations. */</div><div class='add'>+    if (dst_hashed != src_hashed &amp;&amp; src_cached != dst_hashed) {</div><div class='add'>+        gf_msg_trace(this-&gt;name, 0, "linkfile %s @ %s =&gt; %s", local-&gt;loc.path,</div><div class='add'>+                     dst_hashed-&gt;name, src_cached-&gt;name);</div><div class='add'>+</div><div class='add'>+        memcpy(local-&gt;gfid, local-&gt;loc.inode-&gt;gfid, 16);</div><div class='add'>+        dht_linkfile_create(frame, dht_rename_linkto_cbk, this, src_cached,</div><div class='add'>+                            dst_hashed, &amp;local-&gt;loc);</div><div class='add'>+    } else if (src_cached != dst_hashed) {</div><div class='add'>+        dict_t *xattr_new = NULL;</div><div class='add'>+</div><div class='add'>+        xattr_new = dict_copy_with_ref(xattr, NULL);</div><div class='add'>+</div><div class='add'>+        gf_msg_trace(this-&gt;name, 0, "link %s =&gt; %s (%s)", local-&gt;loc.path,</div><div class='add'>+                     local-&gt;loc2.path, src_cached-&gt;name);</div><div class='add'>+        if (gf_uuid_compare(local-&gt;loc.pargfid, local-&gt;loc2.pargfid) == 0) {</div><div class='add'>+            DHT_MARKER_DONT_ACCOUNT(xattr_new);</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        local-&gt;added_link = _gf_true;</div><div class='add'>+</div><div class='add'>+        STACK_WIND_COOKIE(frame, dht_rename_link_cbk, src_cached, src_cached,</div><div class='add'>+                          src_cached-&gt;fops-&gt;link, &amp;local-&gt;loc, &amp;local-&gt;loc2,</div><div class='add'>+                          xattr_new);</div><div class='add'>+</div><div class='add'>+        dict_unref(xattr_new);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='ctx'> nolinks:</div><div class='del'>-	if (!call_cnt) {</div><div class='del'>-		/* skip to next step */</div><div class='del'>-		dht_do_rename (frame);</div><div class='del'>-	}</div><div class='add'>+    if (!call_cnt) {</div><div class='add'>+        /* skip to next step */</div><div class='add'>+        dht_do_rename(frame);</div><div class='add'>+    }</div><div class='add'>+    if (xattr)</div><div class='add'>+        dict_unref(xattr);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+dht_rename_lookup_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                      int op_ret, int op_errno, inode_t *inode,</div><div class='add'>+                      struct iatt *stbuf, dict_t *xattr,</div><div class='add'>+                      struct iatt *postparent)</div><div class='add'>+{</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    int call_cnt = 0;</div><div class='add'>+    dht_conf_t *conf = NULL;</div><div class='add'>+    char gfid_local[GF_UUID_BUF_SIZE] = {0};</div><div class='add'>+    char gfid_server[GF_UUID_BUF_SIZE] = {0};</div><div class='add'>+    int child_index = -1;</div><div class='add'>+    gf_boolean_t is_src = _gf_false;</div><div class='add'>+    loc_t *loc = NULL;</div><div class='add'>+</div><div class='add'>+    child_index = (long)cookie;</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    conf = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    is_src = (child_index == 0);</div><div class='add'>+    if (is_src)</div><div class='add'>+        loc = &amp;local-&gt;loc;</div><div class='add'>+    else</div><div class='add'>+        loc = &amp;local-&gt;loc2;</div><div class='add'>+</div><div class='add'>+    if (op_ret &gt;= 0) {</div><div class='add'>+        if (is_src)</div><div class='add'>+            local-&gt;src_cached = dht_subvol_get_cached(this, local-&gt;loc.inode);</div><div class='add'>+        else {</div><div class='add'>+            if (loc-&gt;inode)</div><div class='add'>+                gf_uuid_unparse(loc-&gt;inode-&gt;gfid, gfid_local);</div><div class='add'>+</div><div class='add'>+            gf_msg_debug(this-&gt;name, 0,</div><div class='add'>+                         "dst_cached before lookup: %s, "</div><div class='add'>+                         "(path:%s)(gfid:%s),",</div><div class='add'>+                         local-&gt;loc2.path,</div><div class='add'>+                         local-&gt;dst_cached ? local-&gt;dst_cached-&gt;name : NULL,</div><div class='add'>+                         local-&gt;dst_cached ? gfid_local : NULL);</div><div class='add'>+</div><div class='add'>+            local-&gt;dst_cached = dht_subvol_get_cached(this,</div><div class='add'>+                                                      local-&gt;loc2_copy.inode);</div><div class='add'>+</div><div class='add'>+            gf_uuid_unparse(stbuf-&gt;ia_gfid, gfid_local);</div><div class='add'>+</div><div class='add'>+            gf_msg_debug(this-&gt;name, GF_LOG_WARNING,</div><div class='add'>+                         "dst_cached after lookup: %s, "</div><div class='add'>+                         "(path:%s)(gfid:%s)",</div><div class='add'>+                         local-&gt;loc2.path,</div><div class='add'>+                         local-&gt;dst_cached ? local-&gt;dst_cached-&gt;name : NULL,</div><div class='add'>+                         local-&gt;dst_cached ? gfid_local : NULL);</div><div class='add'>+</div><div class='add'>+            if ((local-&gt;loc2.inode == NULL) ||</div><div class='add'>+                gf_uuid_compare(stbuf-&gt;ia_gfid, local-&gt;loc2.inode-&gt;gfid)) {</div><div class='add'>+                if (local-&gt;loc2.inode != NULL) {</div><div class='add'>+                    inode_unlink(local-&gt;loc2.inode, local-&gt;loc2.parent,</div><div class='add'>+                                 local-&gt;loc2.name);</div><div class='add'>+                    inode_unref(local-&gt;loc2.inode);</div><div class='add'>+                }</div><div class='add'>+</div><div class='add'>+                local-&gt;loc2.inode = inode_link(local-&gt;loc2_copy.inode,</div><div class='add'>+                                               local-&gt;loc2_copy.parent,</div><div class='add'>+                                               local-&gt;loc2_copy.name, stbuf);</div><div class='add'>+                gf_uuid_copy(local-&gt;loc2.gfid, stbuf-&gt;ia_gfid);</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (op_ret &lt; 0) {</div><div class='add'>+        if (is_src) {</div><div class='add'>+            /* The meaning of is_linkfile is overloaded here. For locking</div><div class='add'>+             * to work properly both rebalance and rename should acquire</div><div class='add'>+             * lock on datafile. The reason for sending this lookup is to</div><div class='add'>+             * find out whether we've acquired a lock on data file.</div><div class='add'>+             * Between the lookup before rename and this rename, the</div><div class='add'>+             * file could be migrated by a rebalance process and now this</div><div class='add'>+             * file this might be a linkto file. We verify that by sending</div><div class='add'>+             * this lookup. However, if this lookup fails we cannot really</div><div class='add'>+             * say whether we've acquired lock on a datafile or linkto file.</div><div class='add'>+             * So, we act conservatively and _assume_</div><div class='add'>+             * that this is a linkfile and fail the rename operation.</div><div class='add'>+             */</div><div class='add'>+            local-&gt;is_linkfile = _gf_true;</div><div class='add'>+            local-&gt;op_errno = op_errno;</div><div class='add'>+        } else {</div><div class='add'>+            if (local-&gt;dst_cached)</div><div class='add'>+                gf_msg_debug(this-&gt;name, op_errno,</div><div class='add'>+                             "file %s (gfid:%s) was present "</div><div class='add'>+                             "(hashed-subvol=%s, "</div><div class='add'>+                             "cached-subvol=%s) before rename,"</div><div class='add'>+                             " but lookup failed",</div><div class='add'>+                             local-&gt;loc2.path,</div><div class='add'>+                             uuid_utoa(local-&gt;loc2.inode-&gt;gfid),</div><div class='add'>+                             local-&gt;dst_hashed-&gt;name, local-&gt;dst_cached-&gt;name);</div><div class='add'>+            if (dht_inode_missing(op_errno))</div><div class='add'>+                local-&gt;dst_cached = NULL;</div><div class='add'>+        }</div><div class='add'>+    } else if (is_src &amp;&amp; xattr &amp;&amp;</div><div class='add'>+               check_is_linkfile(inode, stbuf, xattr, conf-&gt;link_xattr_name)) {</div><div class='add'>+        local-&gt;is_linkfile = _gf_true;</div><div class='add'>+        /* Found linkto file instead of data file, passdown ENOENT</div><div class='add'>+         * based on the above comment */</div><div class='add'>+        local-&gt;op_errno = ENOENT;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (!local-&gt;is_linkfile &amp;&amp; (op_ret &gt;= 0) &amp;&amp;</div><div class='add'>+        gf_uuid_compare(loc-&gt;gfid, stbuf-&gt;ia_gfid)) {</div><div class='add'>+        gf_uuid_unparse(loc-&gt;gfid, gfid_local);</div><div class='add'>+        gf_uuid_unparse(stbuf-&gt;ia_gfid, gfid_server);</div><div class='add'>+</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_WARNING, 0, DHT_MSG_GFID_MISMATCH,</div><div class='add'>+               "path:%s, received a different gfid, local_gfid= %s"</div><div class='add'>+               " server_gfid: %s",</div><div class='add'>+               local-&gt;loc.path, gfid_local, gfid_server);</div><div class='add'>+</div><div class='add'>+        /* Will passdown ENOENT anyway since the file we sent on</div><div class='add'>+         * rename is replaced with a different file */</div><div class='add'>+        local-&gt;op_errno = ENOENT;</div><div class='add'>+        /* Since local-&gt;is_linkfile is used here to detect failure,</div><div class='add'>+         * marking this to true */</div><div class='add'>+        local-&gt;is_linkfile = _gf_true;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    call_cnt = dht_frame_return(frame);</div><div class='add'>+    if (is_last_call(call_cnt)) {</div><div class='add'>+        if (local-&gt;is_linkfile) {</div><div class='add'>+            local-&gt;op_ret = -1;</div><div class='add'>+            goto fail;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        dht_rename_create_links(frame);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+fail:</div><div class='add'>+    dht_rename_unlock(frame, this);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+dht_rename_file_lock1_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                          int32_t op_ret, int32_t op_errno, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    char src_gfid[GF_UUID_BUF_SIZE] = {0};</div><div class='add'>+    char dst_gfid[GF_UUID_BUF_SIZE] = {0};</div><div class='add'>+    int ret = 0;</div><div class='add'>+    loc_t *loc = NULL;</div><div class='add'>+    xlator_t *subvol = NULL;</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+</div><div class='add'>+    if (op_ret &lt; 0) {</div><div class='add'>+        uuid_utoa_r(local-&gt;loc.inode-&gt;gfid, src_gfid);</div><div class='add'>+</div><div class='add'>+        if (local-&gt;loc2.inode)</div><div class='add'>+            uuid_utoa_r(local-&gt;loc2.inode-&gt;gfid, dst_gfid);</div><div class='add'>+</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_WARNING, op_errno, DHT_MSG_INODE_LK_ERROR,</div><div class='add'>+               "protecting namespace of %s failed"</div><div class='add'>+               "rename (%s:%s:%s %s:%s:%s)",</div><div class='add'>+               local-&gt;current == &amp;local-&gt;lock[0] ? local-&gt;loc.path</div><div class='add'>+                                                 : local-&gt;loc2.path,</div><div class='add'>+               local-&gt;loc.path, src_gfid, local-&gt;src_hashed-&gt;name,</div><div class='add'>+               local-&gt;loc2.path, dst_gfid,</div><div class='add'>+               local-&gt;dst_hashed ? local-&gt;dst_hashed-&gt;name : NULL);</div><div class='add'>+</div><div class='add'>+        local-&gt;op_ret = -1;</div><div class='add'>+        local-&gt;op_errno = op_errno;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (local-&gt;current == &amp;local-&gt;lock[0]) {</div><div class='add'>+        loc = &amp;local-&gt;loc2;</div><div class='add'>+        subvol = local-&gt;dst_hashed;</div><div class='add'>+        local-&gt;current = &amp;local-&gt;lock[1];</div><div class='add'>+    } else {</div><div class='add'>+        loc = &amp;local-&gt;loc;</div><div class='add'>+        subvol = local-&gt;src_hashed;</div><div class='add'>+        local-&gt;current = &amp;local-&gt;lock[0];</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dht_protect_namespace(frame, loc, subvol, &amp;local-&gt;current-&gt;ns,</div><div class='add'>+                                dht_rename_lock_cbk);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        op_errno = EINVAL;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+err:</div><div class='add'>+    /* No harm in calling an extra unlock */</div><div class='add'>+    dht_rename_unlock(frame, this);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+dht_rename_file_protect_namespace(call_frame_t *frame, void *cookie,</div><div class='add'>+                                  xlator_t *this, int32_t op_ret,</div><div class='add'>+                                  int32_t op_errno, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    char src_gfid[GF_UUID_BUF_SIZE] = {0};</div><div class='add'>+    char dst_gfid[GF_UUID_BUF_SIZE] = {0};</div><div class='add'>+    int ret = 0;</div><div class='add'>+    loc_t *loc = NULL;</div><div class='add'>+    xlator_t *subvol = NULL;</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+</div><div class='add'>+    if (op_ret &lt; 0) {</div><div class='add'>+        uuid_utoa_r(local-&gt;loc.inode-&gt;gfid, src_gfid);</div><div class='add'>+</div><div class='add'>+        if (local-&gt;loc2.inode)</div><div class='add'>+            uuid_utoa_r(local-&gt;loc2.inode-&gt;gfid, dst_gfid);</div><div class='add'>+</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_WARNING, op_errno, DHT_MSG_INODE_LK_ERROR,</div><div class='add'>+               "acquiring inodelk failed "</div><div class='add'>+               "rename (%s:%s:%s %s:%s:%s)",</div><div class='add'>+               local-&gt;loc.path, src_gfid, local-&gt;src_cached-&gt;name,</div><div class='add'>+               local-&gt;loc2.path, dst_gfid,</div><div class='add'>+               local-&gt;dst_cached ? local-&gt;dst_cached-&gt;name : NULL);</div><div class='add'>+</div><div class='add'>+        local-&gt;op_ret = -1;</div><div class='add'>+        local-&gt;op_errno = op_errno;</div><div class='add'>+</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Locks on src and dst needs to ordered which otherwise might cause</div><div class='add'>+     * deadlocks when rename (src, dst) and rename (dst, src) is done from</div><div class='add'>+     * two different clients</div><div class='add'>+     */</div><div class='add'>+    ret = dht_order_rename_lock(frame, &amp;loc, &amp;subvol);</div><div class='add'>+    if (ret) {</div><div class='add'>+        local-&gt;op_errno = ENOMEM;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dht_protect_namespace(frame, loc, subvol, &amp;local-&gt;current-&gt;ns,</div><div class='add'>+                                dht_rename_file_lock1_cbk);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        op_errno = EINVAL;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+</div><div class='add'>+err:</div><div class='add'>+    /* Its fine to call unlock even when no locks are acquired, as we check</div><div class='add'>+     * for lock-&gt;locked before winding a unlock call.</div><div class='add'>+     */</div><div class='add'>+    dht_rename_unlock(frame, this);</div><div class='ctx'> </div><div class='del'>-	return 0;</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+int32_t</div><div class='add'>+dht_rename_lock_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                    int32_t op_ret, int32_t op_errno, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    char src_gfid[GF_UUID_BUF_SIZE] = {0};</div><div class='add'>+    char dst_gfid[GF_UUID_BUF_SIZE] = {0};</div><div class='add'>+    dict_t *xattr_req = NULL;</div><div class='add'>+    dht_conf_t *conf = NULL;</div><div class='add'>+    int i = 0;</div><div class='add'>+    xlator_t *subvol = NULL;</div><div class='add'>+    dht_lock_t *lock = NULL;</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    conf = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    if (op_ret &lt; 0) {</div><div class='add'>+        uuid_utoa_r(local-&gt;loc.inode-&gt;gfid, src_gfid);</div><div class='add'>+</div><div class='add'>+        if (local-&gt;loc2.inode)</div><div class='add'>+            uuid_utoa_r(local-&gt;loc2.inode-&gt;gfid, dst_gfid);</div><div class='add'>+</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_WARNING, op_errno, DHT_MSG_INODE_LK_ERROR,</div><div class='add'>+               "protecting namespace of %s failed. "</div><div class='add'>+               "rename (%s:%s:%s %s:%s:%s)",</div><div class='add'>+               local-&gt;current == &amp;local-&gt;lock[0] ? local-&gt;loc.path</div><div class='add'>+                                                 : local-&gt;loc2.path,</div><div class='add'>+               local-&gt;loc.path, src_gfid, local-&gt;src_hashed-&gt;name,</div><div class='add'>+               local-&gt;loc2.path, dst_gfid,</div><div class='add'>+               local-&gt;dst_hashed ? local-&gt;dst_hashed-&gt;name : NULL);</div><div class='add'>+</div><div class='add'>+        local-&gt;op_ret = -1;</div><div class='add'>+        local-&gt;op_errno = op_errno;</div><div class='add'>+</div><div class='add'>+        goto done;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    xattr_req = dict_new();</div><div class='add'>+    if (xattr_req == NULL) {</div><div class='add'>+        local-&gt;op_ret = -1;</div><div class='add'>+        local-&gt;op_errno = ENOMEM;</div><div class='add'>+        goto done;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    op_ret = dict_set_uint32(xattr_req, conf-&gt;link_xattr_name, 256);</div><div class='add'>+    if (op_ret &lt; 0) {</div><div class='add'>+        local-&gt;op_ret = -1;</div><div class='add'>+        local-&gt;op_errno = -op_ret;</div><div class='add'>+        goto done;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* dst_cached might've changed. This normally happens for two reasons:</div><div class='add'>+     * 1. rebalance migrated dst</div><div class='add'>+     * 2. Another parallel rename was done overwriting dst</div><div class='add'>+     *</div><div class='add'>+     * Doing a lookup on local-&gt;loc2 when dst exists, but is associated</div><div class='add'>+     * with a different gfid will result in an ESTALE error. So, do a fresh</div><div class='add'>+     * lookup with a new inode on dst-path and handle change of dst-cached</div><div class='add'>+     * in the cbk. Also, to identify dst-cached changes we do a lookup on</div><div class='add'>+     * "this" rather than the subvol.</div><div class='add'>+     */</div><div class='add'>+    loc_copy(&amp;local-&gt;loc2_copy, &amp;local-&gt;loc2);</div><div class='add'>+    inode_unref(local-&gt;loc2_copy.inode);</div><div class='add'>+    local-&gt;loc2_copy.inode = inode_new(local-&gt;loc.inode-&gt;table);</div><div class='add'>+</div><div class='add'>+    /* Why not use local-&gt;lock.locks[?].loc for lookup post lock phase</div><div class='add'>+     * ---------------------------------------------------------------</div><div class='add'>+     * "layout.parent_layout.locks[?].loc" does not have the name and pargfid</div><div class='add'>+     * populated.</div><div class='add'>+     * Reason: If we had populated the name and pargfid, server might</div><div class='add'>+     * resolve to a successful lookup even if there is a file with same name</div><div class='add'>+     * with a different gfid(unlink &amp; create) as server does name based</div><div class='add'>+     * resolution on first priority. And this can result in operating on a</div><div class='add'>+     * different inode entirely.</div><div class='add'>+     *</div><div class='add'>+     * Now consider a scenario where source file was renamed by some other</div><div class='add'>+     * client to a new name just before this lock was granted. So if a</div><div class='add'>+     * lookup would be done on local-&gt;lock[0].layout.parent_layout.locks[?].loc,</div><div class='add'>+     * server will send success even if the entry was renamed (since server will</div><div class='add'>+     * do a gfid based resolution). So once a lock is granted, make sure the</div><div class='add'>+     * file exists with the name that the client requested with.</div><div class='add'>+     * */</div><div class='add'>+</div><div class='add'>+    local-&gt;call_cnt = 2;</div><div class='add'>+    for (i = 0; i &lt; 2; i++) {</div><div class='add'>+        if (i == 0) {</div><div class='add'>+            lock = local-&gt;rename_inodelk_backward_compatible[0];</div><div class='add'>+            if (gf_uuid_compare(local-&gt;loc.gfid, lock-&gt;loc.gfid) == 0)</div><div class='add'>+                subvol = lock-&gt;xl;</div><div class='add'>+            else {</div><div class='add'>+                lock = local-&gt;rename_inodelk_backward_compatible[1];</div><div class='add'>+                subvol = lock-&gt;xl;</div><div class='add'>+            }</div><div class='add'>+        } else {</div><div class='add'>+            subvol = this;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        STACK_WIND_COOKIE(frame, dht_rename_lookup_cbk, (void *)(long)i, subvol,</div><div class='add'>+                          subvol-&gt;fops-&gt;lookup,</div><div class='add'>+                          (i == 0) ? &amp;local-&gt;loc : &amp;local-&gt;loc2_copy,</div><div class='add'>+                          xattr_req);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    dict_unref(xattr_req);</div><div class='add'>+    return 0;</div><div class='add'>+</div><div class='add'>+done:</div><div class='add'>+    /* Its fine to call unlock even when no locks are acquired, as we check</div><div class='add'>+     * for lock-&gt;locked before winding a unlock call.</div><div class='add'>+     */</div><div class='add'>+    dht_rename_unlock(frame, this);</div><div class='add'>+</div><div class='add'>+    if (xattr_req)</div><div class='add'>+        dict_unref(xattr_req);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-dht_rename (call_frame_t *frame, xlator_t *this,</div><div class='del'>-	    loc_t *oldloc, loc_t *newloc)</div><div class='del'>-{</div><div class='del'>-	xlator_t    *src_cached = NULL;</div><div class='del'>-	xlator_t    *src_hashed = NULL;</div><div class='del'>-	xlator_t    *dst_cached = NULL;</div><div class='del'>-	xlator_t    *dst_hashed = NULL;</div><div class='del'>-	int          op_errno = -1;</div><div class='del'>-	int          ret = -1;</div><div class='del'>-	dht_local_t *local = NULL;</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-	VALIDATE_OR_GOTO (frame, err);</div><div class='del'>-	VALIDATE_OR_GOTO (this, err);</div><div class='del'>-	VALIDATE_OR_GOTO (oldloc, err);</div><div class='del'>-	VALIDATE_OR_GOTO (newloc, err);</div><div class='del'>-</div><div class='del'>-	src_hashed = dht_subvol_get_hashed (this, oldloc);</div><div class='del'>-	if (!src_hashed) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-			"no subvolume in layout for path=%s",</div><div class='del'>-			oldloc-&gt;path);</div><div class='del'>-		op_errno = EINVAL;</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	src_cached = dht_subvol_get_cached (this, oldloc-&gt;inode);</div><div class='del'>-	if (!src_cached) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-			"no cached subvolume for path=%s", oldloc-&gt;path);</div><div class='del'>-		op_errno = EINVAL;</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	dst_hashed = dht_subvol_get_hashed (this, newloc);</div><div class='del'>-	if (!dst_hashed) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-			"no subvolume in layout for path=%s",</div><div class='del'>-			newloc-&gt;path);</div><div class='del'>-		op_errno = EINVAL;</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	if (newloc-&gt;inode)</div><div class='del'>-		dst_cached = dht_subvol_get_cached (this, newloc-&gt;inode);</div><div class='del'>-</div><div class='del'>-	local = dht_local_init (frame);</div><div class='del'>-	if (!local) {</div><div class='del'>-		op_errno = ENOMEM;</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-			"Out of memory");</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	ret = loc_copy (&amp;local-&gt;loc, oldloc);</div><div class='del'>-	if (ret == -1) {</div><div class='del'>-		op_errno = ENOMEM;</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-			"Out of memory");</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	ret = loc_copy (&amp;local-&gt;loc2, newloc);</div><div class='del'>-	if (ret == -1) {</div><div class='del'>-		op_errno = ENOMEM;</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-			"Out of memory");</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	local-&gt;src_hashed = src_hashed;</div><div class='del'>-	local-&gt;src_cached = src_cached;</div><div class='del'>-	local-&gt;dst_hashed = dst_hashed;</div><div class='del'>-	local-&gt;dst_cached = dst_cached;</div><div class='del'>-</div><div class='del'>-	gf_log (this-&gt;name, GF_LOG_TRACE,</div><div class='del'>-		"renaming %s (hash=%s/cache=%s) =&gt; %s (hash=%s/cache=%s)",</div><div class='del'>-		oldloc-&gt;path, src_hashed-&gt;name, src_cached-&gt;name,</div><div class='del'>-		newloc-&gt;path, dst_hashed-&gt;name,</div><div class='del'>-		dst_cached ? dst_cached-&gt;name : "&lt;nul&gt;");</div><div class='del'>-</div><div class='del'>-	if (IA_ISDIR (oldloc-&gt;inode-&gt;ia_type)) {</div><div class='del'>-		dht_rename_dir (frame, this);</div><div class='del'>-	} else {</div><div class='del'>-		local-&gt;op_ret = 0;</div><div class='del'>-		dht_rename_create_links (frame);</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='add'>+dht_rename_lock(call_frame_t *frame)</div><div class='add'>+{</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    int count = 1, ret = -1;</div><div class='add'>+    dht_lock_t **lk_array = NULL;</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+</div><div class='add'>+    if (local-&gt;dst_cached)</div><div class='add'>+        count++;</div><div class='add'>+</div><div class='add'>+    lk_array = GF_CALLOC(count, sizeof(*lk_array), gf_common_mt_pointer);</div><div class='add'>+    if (lk_array == NULL)</div><div class='add'>+        goto err;</div><div class='add'>+</div><div class='add'>+    lk_array[0] = dht_lock_new(frame-&gt;this, local-&gt;src_cached, &amp;local-&gt;loc,</div><div class='add'>+                               F_WRLCK, DHT_FILE_MIGRATE_DOMAIN, NULL,</div><div class='add'>+                               FAIL_ON_ANY_ERROR);</div><div class='add'>+    if (lk_array[0] == NULL)</div><div class='add'>+        goto err;</div><div class='add'>+</div><div class='add'>+    if (local-&gt;dst_cached) {</div><div class='add'>+        /* dst might be removed by the time inodelk reaches bricks,</div><div class='add'>+         * which can result in ESTALE errors. POSIX imposes no</div><div class='add'>+         * restriction for dst to be present for renames to be</div><div class='add'>+         * successful. So, we'll ignore ESTALE errors. As far as</div><div class='add'>+         * synchronization on dst goes, we'll achieve the same by</div><div class='add'>+         * holding entrylk on parent directory of dst in the namespace</div><div class='add'>+         * of basename(dst). Also, there might not be quorum in cluster</div><div class='add'>+         * xlators like EC/disperse on errno, in which case they return</div><div class='add'>+         * EIO. For eg., in a disperse (4 + 2), 3 might return success</div><div class='add'>+         * and three might return ESTALE. Disperse, having no Quorum</div><div class='add'>+         * unwinds inodelk with EIO. So, ignore EIO too.</div><div class='add'>+         */</div><div class='add'>+        lk_array[1] = dht_lock_new(frame-&gt;this, local-&gt;dst_cached, &amp;local-&gt;loc2,</div><div class='add'>+                                   F_WRLCK, DHT_FILE_MIGRATE_DOMAIN, NULL,</div><div class='add'>+                                   IGNORE_ENOENT_ESTALE_EIO);</div><div class='add'>+        if (lk_array[1] == NULL)</div><div class='add'>+            goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    local-&gt;rename_inodelk_backward_compatible = lk_array;</div><div class='add'>+    local-&gt;rename_inodelk_bc_count = count;</div><div class='add'>+</div><div class='add'>+    /* retaining inodelks for the sake of backward compatibility. Please</div><div class='add'>+     * make sure to remove this inodelk once all of 3.10, 3.12 and 3.13</div><div class='add'>+     * reach EOL. Better way of getting synchronization would be to acquire</div><div class='add'>+     * entrylks on src and dst parent directories in the namespace of</div><div class='add'>+     * basenames of src and dst</div><div class='add'>+     */</div><div class='add'>+    ret = dht_blocking_inodelk(frame, lk_array, count,</div><div class='add'>+                               dht_rename_file_protect_namespace);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        local-&gt;rename_inodelk_backward_compatible = NULL;</div><div class='add'>+        local-&gt;rename_inodelk_bc_count = 0;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+err:</div><div class='add'>+    if (lk_array != NULL) {</div><div class='add'>+        int tmp_count = 0, i = 0;</div><div class='add'>+</div><div class='add'>+        for (i = 0; (i &lt; count) &amp;&amp; (lk_array[i]); i++, tmp_count++)</div><div class='add'>+            ;</div><div class='add'>+</div><div class='add'>+        dht_lock_array_free(lk_array, tmp_count);</div><div class='add'>+        GF_FREE(lk_array);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return -1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+dht_rename(call_frame_t *frame, xlator_t *this, loc_t *oldloc, loc_t *newloc,</div><div class='add'>+           dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    xlator_t *src_cached = NULL;</div><div class='add'>+    xlator_t *src_hashed = NULL;</div><div class='add'>+    xlator_t *dst_cached = NULL;</div><div class='add'>+    xlator_t *dst_hashed = NULL;</div><div class='add'>+    int op_errno = -1;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    char gfid[GF_UUID_BUF_SIZE] = {0};</div><div class='add'>+    char newgfid[GF_UUID_BUF_SIZE] = {0};</div><div class='add'>+</div><div class='add'>+    VALIDATE_OR_GOTO(frame, err);</div><div class='add'>+    VALIDATE_OR_GOTO(this, err);</div><div class='add'>+    VALIDATE_OR_GOTO(oldloc, err);</div><div class='add'>+    VALIDATE_OR_GOTO(newloc, err);</div><div class='add'>+</div><div class='add'>+    gf_uuid_unparse(oldloc-&gt;inode-&gt;gfid, gfid);</div><div class='add'>+</div><div class='add'>+    src_hashed = dht_subvol_get_hashed(this, oldloc);</div><div class='add'>+    if (!src_hashed) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_INFO, 0, DHT_MSG_RENAME_FAILED,</div><div class='add'>+               "No hashed subvolume in layout for path=%s,"</div><div class='add'>+               "(gfid = %s)",</div><div class='add'>+               oldloc-&gt;path, gfid);</div><div class='add'>+        op_errno = EINVAL;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    src_cached = dht_subvol_get_cached(this, oldloc-&gt;inode);</div><div class='add'>+    if (!src_cached) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_INFO, 0, DHT_MSG_RENAME_FAILED,</div><div class='add'>+               "No cached subvolume for path = %s,"</div><div class='add'>+               "(gfid = %s)",</div><div class='add'>+               oldloc-&gt;path, gfid);</div><div class='add'>+</div><div class='add'>+        op_errno = EINVAL;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    dst_hashed = dht_subvol_get_hashed(this, newloc);</div><div class='add'>+    if (!dst_hashed) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_INFO, 0, DHT_MSG_RENAME_FAILED,</div><div class='add'>+               "No hashed subvolume in layout for path=%s", newloc-&gt;path);</div><div class='add'>+        op_errno = EINVAL;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (newloc-&gt;inode)</div><div class='add'>+        dst_cached = dht_subvol_get_cached(this, newloc-&gt;inode);</div><div class='add'>+</div><div class='add'>+    local = dht_local_init(frame, oldloc, NULL, GF_FOP_RENAME);</div><div class='add'>+    if (!local) {</div><div class='add'>+        op_errno = ENOMEM;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+    /* cached_subvol will be set from dht_local_init, reset it to NULL,</div><div class='add'>+       as the logic of handling rename is different  */</div><div class='add'>+    local-&gt;cached_subvol = NULL;</div><div class='add'>+</div><div class='add'>+    ret = loc_copy(&amp;local-&gt;loc2, newloc);</div><div class='add'>+    if (ret == -1) {</div><div class='add'>+        op_errno = ENOMEM;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    local-&gt;src_hashed = src_hashed;</div><div class='add'>+    local-&gt;src_cached = src_cached;</div><div class='add'>+    local-&gt;dst_hashed = dst_hashed;</div><div class='add'>+    local-&gt;dst_cached = dst_cached;</div><div class='add'>+    if (xdata)</div><div class='add'>+        local-&gt;xattr_req = dict_ref(xdata);</div><div class='add'>+</div><div class='add'>+    if (newloc-&gt;inode)</div><div class='add'>+        gf_uuid_unparse(newloc-&gt;inode-&gt;gfid, newgfid);</div><div class='add'>+</div><div class='add'>+    gf_msg(this-&gt;name, GF_LOG_INFO, 0, DHT_MSG_RENAME_INFO,</div><div class='add'>+           "renaming %s (%s) (hash=%s/cache=%s) =&gt; %s (%s) "</div><div class='add'>+           "(hash=%s/cache=%s) ",</div><div class='add'>+           oldloc-&gt;path, gfid, src_hashed-&gt;name, src_cached-&gt;name, newloc-&gt;path,</div><div class='add'>+           newloc-&gt;inode ? newgfid : NULL, dst_hashed-&gt;name,</div><div class='add'>+           dst_cached ? dst_cached-&gt;name : "&lt;nul&gt;");</div><div class='add'>+</div><div class='add'>+    if (IA_ISDIR(oldloc-&gt;inode-&gt;ia_type)) {</div><div class='add'>+        dht_rename_dir(frame, this);</div><div class='add'>+    } else {</div><div class='add'>+        local-&gt;op_ret = 0;</div><div class='add'>+        ret = dht_rename_lock(frame);</div><div class='add'>+        if (ret &lt; 0) {</div><div class='add'>+            op_errno = ENOMEM;</div><div class='add'>+            goto err;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='ctx'> </div><div class='ctx'> err:</div><div class='del'>-	op_errno = (op_errno == -1) ? errno : op_errno;</div><div class='del'>-	DHT_STACK_UNWIND (rename, frame, -1, op_errno, NULL, NULL, NULL, NULL, NULL);</div><div class='add'>+    op_errno = (op_errno == -1) ? errno : op_errno;</div><div class='add'>+    DHT_STACK_UNWIND(rename, frame, -1, op_errno, NULL, NULL, NULL, NULL, NULL,</div><div class='add'>+                     NULL);</div><div class='ctx'> </div><div class='del'>-	return 0;</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+dht_pt_rename(call_frame_t *frame, xlator_t *this, loc_t *oldloc, loc_t *newloc,</div><div class='add'>+              dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    gf_boolean_t free_xdata = _gf_false;</div><div class='add'>+</div><div class='add'>+    /* Just a pass through */</div><div class='add'>+    if (!IA_ISDIR(oldloc-&gt;inode-&gt;ia_type)) {</div><div class='add'>+        if (!xdata) {</div><div class='add'>+            free_xdata = _gf_true;</div><div class='add'>+        }</div><div class='add'>+        DHT_CHANGELOG_TRACK_AS_RENAME(xdata, oldloc, newloc);</div><div class='add'>+    }</div><div class='add'>+    default_rename(frame, this, oldloc, newloc, xdata);</div><div class='add'>+    if (free_xdata &amp;&amp; xdata) {</div><div class='add'>+        dict_unref(xdata);</div><div class='add'>+        xdata = NULL;</div><div class='add'>+    }</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='head'>diff --git a/xlators/cluster/dht/src/dht-selfheal.c b/xlators/cluster/dht/src/dht-selfheal.c<br/>index d5d9892b556..3e24065227c 100644<br/>--- a/<a href='/cgit/glusterfs.git/tree/xlators/cluster/dht/src/dht-selfheal.c?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/cluster/dht/src/dht-selfheal.c</a><br/>+++ b/<a href='/cgit/glusterfs.git/tree/xlators/cluster/dht/src/dht-selfheal.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>xlators/cluster/dht/src/dht-selfheal.c</a></div><div class='hunk'>@@ -1,532 +1,2600 @@</div><div class='ctx'> /*</div><div class='del'>-   Copyright (c) 2008-2009 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='del'>-   This file is part of GlusterFS.</div><div class='del'>-</div><div class='del'>-   GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-   it under the terms of the GNU General Public License as published</div><div class='del'>-   by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-   or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-   GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-   WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-   General Public License for more details.</div><div class='del'>-</div><div class='del'>-   You should have received a copy of the GNU General Public License</div><div class='del'>-   along with this program.  If not, see</div><div class='del'>-   &lt;http://www.gnu.org/licenses/&gt;.</div><div class='add'>+  Copyright (c) 2008-2012 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='ctx'> */</div><div class='ctx'> </div><div class='del'>-#ifndef _CONFIG_H</div><div class='del'>-#define _CONFIG_H</div><div class='del'>-#include "config.h"</div><div class='del'>-#endif</div><div class='add'>+#include "dht-lock.h"</div><div class='add'>+</div><div class='add'>+#define DHT_SET_LAYOUT_RANGE(layout, i, srt, chunk, path)                      \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        layout-&gt;list[i].start = srt;                                           \</div><div class='add'>+        layout-&gt;list[i].stop = srt + chunk - 1;                                \</div><div class='add'>+        layout-&gt;list[i].commit_hash = layout-&gt;commit_hash;                     \</div><div class='add'>+                                                                               \</div><div class='add'>+        gf_msg_trace(this-&gt;name, 0,                                            \</div><div class='add'>+                     "gave fix: 0x%x - 0x%x, with commit-hash 0x%x"            \</div><div class='add'>+                     " on %s for %s",                                          \</div><div class='add'>+                     layout-&gt;list[i].start, layout-&gt;list[i].stop,              \</div><div class='add'>+                     layout-&gt;list[i].commit_hash,                              \</div><div class='add'>+                     layout-&gt;list[i].xlator-&gt;name, path);                      \</div><div class='add'>+    } while (0)</div><div class='add'>+</div><div class='add'>+#define DHT_RESET_LAYOUT_RANGE(layout)                                         \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        int cnt = 0;                                                           \</div><div class='add'>+        for (cnt = 0; cnt &lt; layout-&gt;cnt; cnt++) {                              \</div><div class='add'>+            layout-&gt;list[cnt].start = 0;                                       \</div><div class='add'>+            layout-&gt;list[cnt].stop = 0;                                        \</div><div class='add'>+        }                                                                      \</div><div class='add'>+    } while (0)</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+dht_selfheal_layout_lock(call_frame_t *frame, dht_layout_t *layout,</div><div class='add'>+                         gf_boolean_t newdir, dht_selfheal_layout_t healer,</div><div class='add'>+                         dht_need_heal_t should_heal);</div><div class='add'>+</div><div class='add'>+static uint32_t</div><div class='add'>+dht_overlap_calc(dht_layout_t *old, int o, dht_layout_t *new, int n)</div><div class='add'>+{</div><div class='add'>+    if (o &gt;= old-&gt;cnt || n &gt;= new-&gt;cnt)</div><div class='add'>+        return 0;</div><div class='add'>+</div><div class='add'>+    if (old-&gt;list[o].err &gt; 0 || new-&gt;list[n].err &gt; 0)</div><div class='add'>+        return 0;</div><div class='add'>+</div><div class='add'>+    if (old-&gt;list[o].start == old-&gt;list[o].stop) {</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (new-&gt;list[n].start == new-&gt;list[n].stop) {</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='add'>+    if ((old-&gt;list[o].start &gt; new-&gt;list[n].stop) ||</div><div class='add'>+        (old-&gt;list[o].stop &lt; new-&gt;list[n].start))</div><div class='add'>+        return 0;</div><div class='ctx'> </div><div class='del'>-#include "glusterfs.h"</div><div class='del'>-#include "xlator.h"</div><div class='del'>-#include "dht-common.h"</div><div class='add'>+    return min(old-&gt;list[o].stop, new-&gt;list[n].stop) -</div><div class='add'>+           max(old-&gt;list[o].start, new-&gt;list[n].start) + 1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+dht_selfheal_unlock_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                        int32_t op_ret, int32_t op_errno, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    DHT_STACK_DESTROY(frame);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='add'>+int</div><div class='add'>+dht_selfheal_dir_finish(call_frame_t *frame, xlator_t *this, int ret,</div><div class='add'>+                        int invoke_cbk)</div><div class='add'>+{</div><div class='add'>+    dht_local_t *local = NULL, *lock_local = NULL;</div><div class='add'>+    call_frame_t *lock_frame = NULL;</div><div class='add'>+    int lock_count = 0;</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+</div><div class='add'>+    /* Unlock entrylk */</div><div class='add'>+    dht_unlock_entrylk_wrapper(frame, &amp;local-&gt;lock[0].ns.directory_ns);</div><div class='add'>+</div><div class='add'>+    /* Unlock inodelk */</div><div class='add'>+    lock_count = dht_lock_count(local-&gt;lock[0].ns.parent_layout.locks,</div><div class='add'>+                                local-&gt;lock[0].ns.parent_layout.lk_count);</div><div class='add'>+    if (lock_count == 0)</div><div class='add'>+        goto done;</div><div class='add'>+</div><div class='add'>+    lock_frame = copy_frame(frame);</div><div class='add'>+    if (lock_frame == NULL) {</div><div class='add'>+        goto done;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    lock_local = dht_local_init(lock_frame, &amp;local-&gt;loc, NULL,</div><div class='add'>+                                lock_frame-&gt;root-&gt;op);</div><div class='add'>+    if (lock_local == NULL) {</div><div class='add'>+        goto done;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    lock_local-&gt;lock[0].ns.parent_layout.locks = local-&gt;lock[0]</div><div class='add'>+                                                     .ns.parent_layout.locks;</div><div class='add'>+    lock_local-&gt;lock[0]</div><div class='add'>+        .ns.parent_layout.lk_count = local-&gt;lock[0].ns.parent_layout.lk_count;</div><div class='add'>+</div><div class='add'>+    local-&gt;lock[0].ns.parent_layout.locks = NULL;</div><div class='add'>+    local-&gt;lock[0].ns.parent_layout.lk_count = 0;</div><div class='add'>+</div><div class='add'>+    dht_unlock_inodelk(lock_frame, lock_local-&gt;lock[0].ns.parent_layout.locks,</div><div class='add'>+                       lock_local-&gt;lock[0].ns.parent_layout.lk_count,</div><div class='add'>+                       dht_selfheal_unlock_cbk);</div><div class='add'>+    lock_frame = NULL;</div><div class='add'>+</div><div class='add'>+done:</div><div class='add'>+    if (invoke_cbk)</div><div class='add'>+        local-&gt;selfheal.dir_cbk(frame, NULL, frame-&gt;this, ret, local-&gt;op_errno,</div><div class='add'>+                                NULL);</div><div class='add'>+    if (lock_frame != NULL) {</div><div class='add'>+        DHT_STACK_DESTROY(lock_frame);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-dht_selfheal_dir_finish (call_frame_t *frame, xlator_t *this, int ret)</div><div class='add'>+dht_refresh_layout_done(call_frame_t *frame)</div><div class='ctx'> {</div><div class='del'>-	dht_local_t  *local = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    dht_layout_t *refreshed = NULL, *heal = NULL;</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    dht_need_heal_t should_heal = NULL;</div><div class='add'>+    dht_selfheal_layout_t healer = NULL;</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+</div><div class='add'>+    refreshed = local-&gt;selfheal.refreshed_layout;</div><div class='add'>+    heal = local-&gt;selfheal.layout;</div><div class='ctx'> </div><div class='add'>+    healer = local-&gt;selfheal.healer;</div><div class='add'>+    should_heal = local-&gt;selfheal.should_heal;</div><div class='ctx'> </div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-	local-&gt;selfheal.dir_cbk (frame, NULL, frame-&gt;this, ret,</div><div class='del'>-				 local-&gt;op_errno);</div><div class='add'>+    ret = dht_layout_sort(refreshed);</div><div class='add'>+    if (ret == -1) {</div><div class='add'>+        gf_smsg(frame-&gt;this-&gt;name, GF_LOG_WARNING, 0,</div><div class='add'>+                DHT_MSG_LAYOUT_SORT_FAILED, NULL);</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	return 0;</div><div class='add'>+    if (should_heal(frame, &amp;heal, &amp;refreshed)) {</div><div class='add'>+        healer(frame, &amp;local-&gt;loc, heal);</div><div class='add'>+    } else {</div><div class='add'>+        local-&gt;selfheal.layout = NULL;</div><div class='add'>+        local-&gt;selfheal.refreshed_layout = NULL;</div><div class='add'>+        local-&gt;selfheal.layout = refreshed;</div><div class='add'>+</div><div class='add'>+        dht_layout_unref(frame-&gt;this, heal);</div><div class='add'>+</div><div class='add'>+        dht_selfheal_dir_finish(frame, frame-&gt;this, 0, 1);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+</div><div class='add'>+err:</div><div class='add'>+    dht_selfheal_dir_finish(frame, frame-&gt;this, -1, 1);</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+int</div><div class='add'>+dht_refresh_layout_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                       int op_ret, int op_errno, inode_t *inode,</div><div class='add'>+                       struct iatt *stbuf, dict_t *xattr,</div><div class='add'>+                       struct iatt *postparent)</div><div class='add'>+{</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    int this_call_cnt = 0;</div><div class='add'>+    xlator_t *prev = NULL;</div><div class='add'>+    dht_layout_t *layout = NULL;</div><div class='add'>+    char gfid[GF_UUID_BUF_SIZE] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    GF_VALIDATE_OR_GOTO("dht", frame, err);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("dht", this, err);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("dht", frame-&gt;local, err);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("dht", this-&gt;private, err);</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    prev = cookie;</div><div class='add'>+</div><div class='add'>+    layout = local-&gt;selfheal.refreshed_layout;</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;frame-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        op_ret = dht_layout_merge(this, layout, prev, op_ret, op_errno, xattr);</div><div class='add'>+</div><div class='add'>+        dht_iatt_merge(this, &amp;local-&gt;stbuf, stbuf);</div><div class='add'>+</div><div class='add'>+        if (op_ret == -1) {</div><div class='add'>+            gf_uuid_unparse(local-&gt;loc.gfid, gfid);</div><div class='add'>+            local-&gt;op_errno = op_errno;</div><div class='add'>+            gf_smsg(this-&gt;name, GF_LOG_ERROR, op_errno,</div><div class='add'>+                    DHT_MSG_FILE_LOOKUP_FAILED, "path=%s", local-&gt;loc.path,</div><div class='add'>+                    "name=%s", prev-&gt;name, "gfid=%s", gfid, NULL);</div><div class='add'>+</div><div class='add'>+            goto unlock;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        local-&gt;op_ret = 0;</div><div class='add'>+    }</div><div class='add'>+unlock:</div><div class='add'>+    UNLOCK(&amp;frame-&gt;lock);</div><div class='add'>+</div><div class='add'>+    this_call_cnt = dht_frame_return(frame);</div><div class='add'>+</div><div class='add'>+    if (is_last_call(this_call_cnt)) {</div><div class='add'>+        if (local-&gt;op_ret == 0) {</div><div class='add'>+            local-&gt;refresh_layout_done(frame);</div><div class='add'>+        } else {</div><div class='add'>+            goto err;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+</div><div class='add'>+err:</div><div class='add'>+    if (local) {</div><div class='add'>+        local-&gt;refresh_layout_unlock(frame, this, -1, 1);</div><div class='add'>+    }</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-dht_selfheal_dir_xattr_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-			    int op_ret, int op_errno)</div><div class='add'>+dht_refresh_layout(call_frame_t *frame)</div><div class='add'>+{</div><div class='add'>+    int call_cnt = 0;</div><div class='add'>+    int i = 0, ret = -1;</div><div class='add'>+    dht_conf_t *conf = NULL;</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    xlator_t *this = NULL;</div><div class='add'>+    char gfid[GF_UUID_BUF_SIZE] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    GF_VALIDATE_OR_GOTO("dht", frame, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("dht", frame-&gt;local, out);</div><div class='add'>+</div><div class='add'>+    this = frame-&gt;this;</div><div class='add'>+    conf = this-&gt;private;</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+</div><div class='add'>+    call_cnt = conf-&gt;subvolume_cnt;</div><div class='add'>+    local-&gt;call_cnt = call_cnt;</div><div class='add'>+    local-&gt;op_ret = -1;</div><div class='add'>+</div><div class='add'>+    if (local-&gt;selfheal.refreshed_layout) {</div><div class='add'>+        dht_layout_unref(this, local-&gt;selfheal.refreshed_layout);</div><div class='add'>+        local-&gt;selfheal.refreshed_layout = NULL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    local-&gt;selfheal.refreshed_layout = dht_layout_new(this,</div><div class='add'>+                                                      conf-&gt;subvolume_cnt);</div><div class='add'>+    if (!local-&gt;selfheal.refreshed_layout) {</div><div class='add'>+        gf_uuid_unparse(local-&gt;loc.gfid, gfid);</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_ERROR, ENOMEM, DHT_MSG_MEM_ALLOC_FAILED,</div><div class='add'>+                "path=%s", local-&gt;loc.path, "gfid=%s", gfid, NULL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (local-&gt;xattr != NULL) {</div><div class='add'>+        dict_del(local-&gt;xattr, conf-&gt;xattr_name);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (local-&gt;xattr_req == NULL) {</div><div class='add'>+        gf_uuid_unparse(local-&gt;loc.gfid, gfid);</div><div class='add'>+        local-&gt;xattr_req = dict_new();</div><div class='add'>+        if (local-&gt;xattr_req == NULL) {</div><div class='add'>+            gf_smsg(this-&gt;name, GF_LOG_ERROR, ENOMEM, DHT_MSG_NO_MEMORY,</div><div class='add'>+                    "path=%s", local-&gt;loc.path, "gfid=%s", gfid, NULL);</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (dict_get(local-&gt;xattr_req, conf-&gt;xattr_name) == 0) {</div><div class='add'>+        ret = dict_set_uint32(local-&gt;xattr_req, conf-&gt;xattr_name, 4 * 4);</div><div class='add'>+        if (ret)</div><div class='add'>+            gf_smsg(this-&gt;name, GF_LOG_WARNING, 0, DHT_MSG_DICT_SET_FAILED,</div><div class='add'>+                    "path=%s", local-&gt;loc.path, "key=%s", conf-&gt;xattr_name,</div><div class='add'>+                    NULL);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; call_cnt; i++) {</div><div class='add'>+        STACK_WIND_COOKIE(frame, dht_refresh_layout_cbk, conf-&gt;subvolumes[i],</div><div class='add'>+                          conf-&gt;subvolumes[i],</div><div class='add'>+                          conf-&gt;subvolumes[i]-&gt;fops-&gt;lookup, &amp;local-&gt;loc,</div><div class='add'>+                          local-&gt;xattr_req);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (local) {</div><div class='add'>+        local-&gt;refresh_layout_unlock(frame, this, -1, 1);</div><div class='add'>+    }</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+dht_selfheal_layout_lock_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                             int32_t op_ret, int32_t op_errno, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-	dht_local_t  *local = NULL;</div><div class='del'>-	call_frame_t *prev = NULL;</div><div class='del'>-	xlator_t     *subvol = NULL;</div><div class='del'>-	int           i = 0;</div><div class='del'>-	dht_layout_t *layout = NULL;</div><div class='del'>-	int           err = 0;</div><div class='del'>-	int           this_call_cnt = 0;</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='ctx'> </div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-	layout = local-&gt;selfheal.layout;</div><div class='del'>-	prev = cookie;</div><div class='del'>-	subvol = prev-&gt;this;</div><div class='add'>+    local = frame-&gt;local;</div><div class='ctx'> </div><div class='del'>-	if (op_ret == 0)</div><div class='del'>-		err = 0;</div><div class='del'>-	else</div><div class='del'>-		err = op_errno;</div><div class='add'>+    if (!local) {</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	for (i = 0; i &lt; layout-&gt;cnt; i++) {</div><div class='del'>-		if (layout-&gt;list[i].xlator == subvol) {</div><div class='del'>-			layout-&gt;list[i].err = err;</div><div class='del'>-			break;</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='add'>+    if (op_ret &lt; 0) {</div><div class='add'>+        local-&gt;op_errno = op_errno;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	this_call_cnt = dht_frame_return (frame);</div><div class='add'>+    local-&gt;refresh_layout_unlock = dht_selfheal_dir_finish;</div><div class='add'>+    local-&gt;refresh_layout_done = dht_refresh_layout_done;</div><div class='ctx'> </div><div class='del'>-	if (is_last_call (this_call_cnt)) {</div><div class='del'>-		dht_selfheal_dir_finish (frame, this, 0);</div><div class='del'>-	}</div><div class='add'>+    dht_refresh_layout(frame);</div><div class='add'>+    return 0;</div><div class='ctx'> </div><div class='del'>-	return 0;</div><div class='add'>+err:</div><div class='add'>+    dht_selfheal_dir_finish(frame, this, -1, 1);</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+gf_boolean_t</div><div class='add'>+dht_should_heal_layout(call_frame_t *frame, dht_layout_t **heal,</div><div class='add'>+                       dht_layout_t **ondisk)</div><div class='add'>+{</div><div class='add'>+    gf_boolean_t fixit = _gf_true;</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    int heal_missing_dirs = 0;</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+</div><div class='add'>+    if ((heal == NULL) || (*heal == NULL) || (ondisk == NULL) ||</div><div class='add'>+        (*ondisk == NULL))</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    dht_layout_anomalies(</div><div class='add'>+        frame-&gt;this, &amp;local-&gt;loc, *ondisk, &amp;local-&gt;selfheal.hole_cnt,</div><div class='add'>+        &amp;local-&gt;selfheal.overlaps_cnt, &amp;local-&gt;selfheal.missing_cnt,</div><div class='add'>+        &amp;local-&gt;selfheal.down, &amp;local-&gt;selfheal.misc, NULL);</div><div class='add'>+</div><div class='add'>+    /* Directories might've been created as part of this self-heal. We've to</div><div class='add'>+     * sync non-layout xattrs and set range 0-0 on new directories</div><div class='add'>+     */</div><div class='add'>+    heal_missing_dirs = local-&gt;selfheal.force_mkdir</div><div class='add'>+                            ? local-&gt;selfheal.force_mkdir</div><div class='add'>+                            : dht_layout_missing_dirs(*heal);</div><div class='add'>+</div><div class='add'>+    if ((local-&gt;selfheal.hole_cnt == 0) &amp;&amp;</div><div class='add'>+        (local-&gt;selfheal.overlaps_cnt == 0) &amp;&amp; heal_missing_dirs) {</div><div class='add'>+        dht_layout_t *tmp = NULL;</div><div class='add'>+</div><div class='add'>+        /* Just added a brick and need to set 0-0 range on this brick.</div><div class='add'>+         * But ondisk layout is well-formed. So, swap layouts "heal" and</div><div class='add'>+         * "ondisk". Now "ondisk" layout will be used for healing</div><div class='add'>+         * xattrs. If there are any non-participating subvols in</div><div class='add'>+         * "ondisk" layout, dht_selfheal_dir_xattr_persubvol will set</div><div class='add'>+         * 0-0 and non-layout xattrs. This way we won't end up in</div><div class='add'>+         * "corrupting" already set and well-formed "ondisk" layout.</div><div class='add'>+         */</div><div class='add'>+        tmp = *heal;</div><div class='add'>+        *heal = *ondisk;</div><div class='add'>+        *ondisk = tmp;</div><div class='add'>+</div><div class='add'>+        /* Current selfheal code, heals non-layout xattrs only after</div><div class='add'>+         * an add-brick. In fact non-layout xattrs are considered as</div><div class='add'>+         * secondary citizens which are healed only if layout xattrs</div><div class='add'>+         * need to be healed. This is wrong, since for eg., quota can be</div><div class='add'>+         * set when layout is well-formed, but a node is down. Also,</div><div class='add'>+         * just for healing non-layout xattrs, we don't need locking.</div><div class='add'>+         * This issue is _NOT FIXED_ by this patch.</div><div class='add'>+         */</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    fixit = (local-&gt;selfheal.hole_cnt || local-&gt;selfheal.overlaps_cnt ||</div><div class='add'>+             heal_missing_dirs);</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return fixit;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-dht_selfheal_dir_xattr_persubvol (call_frame_t *frame, loc_t *loc,</div><div class='del'>-				  dht_layout_t *layout, int i)</div><div class='add'>+dht_layout_span(dht_layout_t *layout)</div><div class='ctx'> {</div><div class='del'>-	xlator_t          *subvol = NULL;</div><div class='del'>-	dict_t            *xattr = NULL;</div><div class='del'>-	int                ret = 0;</div><div class='del'>-	xlator_t          *this = NULL;</div><div class='del'>-	int32_t           *disk_layout = NULL;</div><div class='add'>+    int i = 0, count = 0;</div><div class='ctx'> </div><div class='add'>+    for (i = 0; i &lt; layout-&gt;cnt; i++) {</div><div class='add'>+        if (layout-&gt;list[i].err)</div><div class='add'>+            continue;</div><div class='ctx'> </div><div class='del'>-	subvol = layout-&gt;list[i].xlator;</div><div class='del'>-	this = frame-&gt;this;</div><div class='add'>+        if (layout-&gt;list[i].start != layout-&gt;list[i].stop)</div><div class='add'>+            count++;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return count;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+dht_decommissioned_bricks_in_layout(xlator_t *this, dht_layout_t *layout)</div><div class='add'>+{</div><div class='add'>+    dht_conf_t *conf = NULL;</div><div class='add'>+    int count = 0, i = 0, j = 0;</div><div class='ctx'> </div><div class='del'>-	xattr = get_new_dict ();</div><div class='del'>-	if (!xattr) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-			"Out of memory");</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='add'>+    if ((this == NULL) || (layout == NULL))</div><div class='add'>+        goto out;</div><div class='ctx'> </div><div class='del'>-	ret = dht_disk_layout_extract (this, layout, i, &amp;disk_layout);</div><div class='del'>-	if (ret == -1) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-			"failed to extract disk layout");</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='add'>+    conf = this-&gt;private;</div><div class='ctx'> </div><div class='del'>-	ret = dict_set_bin (xattr, "trusted.glusterfs.dht",</div><div class='del'>-			    disk_layout, 4 * 4);</div><div class='del'>-	if (ret == -1) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-			"failed to set xattr dictionary");</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='del'>-	disk_layout = NULL;</div><div class='add'>+    for (i = 0; i &lt; layout-&gt;cnt; i++) {</div><div class='add'>+        for (j = 0; j &lt; conf-&gt;subvolume_cnt; j++) {</div><div class='add'>+            if (conf-&gt;decommissioned_bricks[j] &amp;&amp;</div><div class='add'>+                conf-&gt;decommissioned_bricks[j] == layout-&gt;list[i].xlator) {</div><div class='add'>+                count++;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	gf_log (this-&gt;name, GF_LOG_TRACE,</div><div class='del'>-		"setting hash range %u - %u (type %d) on subvolume %s for %s",</div><div class='del'>-		layout-&gt;list[i].start, layout-&gt;list[i].stop,</div><div class='del'>-		layout-&gt;type, subvol-&gt;name, loc-&gt;path);</div><div class='add'>+out:</div><div class='add'>+    return count;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	dict_ref (xattr);</div><div class='add'>+dht_distribution_type_t</div><div class='add'>+dht_distribution_type(xlator_t *this, dht_layout_t *layout)</div><div class='add'>+{</div><div class='add'>+    dht_distribution_type_t type = GF_DHT_EQUAL_DISTRIBUTION;</div><div class='add'>+    int i = 0;</div><div class='add'>+    uint32_t start_range = 0, range = 0, diff = 0;</div><div class='add'>+</div><div class='add'>+    if ((this == NULL) || (layout == NULL) || (layout-&gt;cnt &lt; 1)) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; layout-&gt;cnt; i++) {</div><div class='add'>+        if (start_range == 0) {</div><div class='add'>+            start_range = layout-&gt;list[i].stop - layout-&gt;list[i].start;</div><div class='add'>+            continue;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-	STACK_WIND (frame, dht_selfheal_dir_xattr_cbk,</div><div class='del'>-		    subvol, subvol-&gt;fops-&gt;setxattr,</div><div class='del'>-		    loc, xattr, 0);</div><div class='add'>+        range = layout-&gt;list[i].stop - layout-&gt;list[i].start;</div><div class='add'>+        diff = (range &gt;= start_range) ? range - start_range</div><div class='add'>+                                      : start_range - range;</div><div class='ctx'> </div><div class='del'>-	dict_unref (xattr);</div><div class='add'>+        if ((range != 0) &amp;&amp; (diff &gt; layout-&gt;cnt)) {</div><div class='add'>+            type = GF_DHT_WEIGHTED_DISTRIBUTION;</div><div class='add'>+            break;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	return 0;</div><div class='add'>+out:</div><div class='add'>+    return type;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-err:</div><div class='del'>-	if (xattr)</div><div class='del'>-		dict_destroy (xattr);</div><div class='add'>+gf_boolean_t</div><div class='add'>+dht_should_fix_layout(call_frame_t *frame, dht_layout_t **inmem,</div><div class='add'>+                      dht_layout_t **ondisk)</div><div class='add'>+{</div><div class='add'>+    gf_boolean_t fixit = _gf_true;</div><div class='add'>+</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    int layout_span = 0;</div><div class='add'>+    int decommissioned_bricks = 0;</div><div class='add'>+    dht_conf_t *conf = NULL;</div><div class='add'>+    dht_distribution_type_t inmem_dist_type = 0;</div><div class='add'>+    dht_distribution_type_t ondisk_dist_type = 0;</div><div class='add'>+</div><div class='add'>+    conf = frame-&gt;this-&gt;private;</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+</div><div class='add'>+    if ((inmem == NULL) || (*inmem == NULL) || (ondisk == NULL) ||</div><div class='add'>+        (*ondisk == NULL))</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    dht_layout_anomalies(frame-&gt;this, &amp;local-&gt;loc, *ondisk,</div><div class='add'>+                         &amp;local-&gt;selfheal.hole_cnt,</div><div class='add'>+                         &amp;local-&gt;selfheal.overlaps_cnt, NULL,</div><div class='add'>+                         &amp;local-&gt;selfheal.down, &amp;local-&gt;selfheal.misc, NULL);</div><div class='add'>+</div><div class='add'>+    if (local-&gt;selfheal.down || local-&gt;selfheal.misc) {</div><div class='add'>+        fixit = _gf_false;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (local-&gt;selfheal.hole_cnt || local-&gt;selfheal.overlaps_cnt)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    /* If commit hashes are being updated, let it through */</div><div class='add'>+    if ((*inmem)-&gt;commit_hash != (*ondisk)-&gt;commit_hash)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    layout_span = dht_layout_span(*ondisk);</div><div class='add'>+</div><div class='add'>+    decommissioned_bricks = dht_decommissioned_bricks_in_layout(frame-&gt;this,</div><div class='add'>+                                                                *ondisk);</div><div class='add'>+    inmem_dist_type = dht_distribution_type(frame-&gt;this, *inmem);</div><div class='add'>+    ondisk_dist_type = dht_distribution_type(frame-&gt;this, *ondisk);</div><div class='add'>+</div><div class='add'>+    if ((decommissioned_bricks == 0) &amp;&amp;</div><div class='add'>+        (layout_span ==</div><div class='add'>+         (conf-&gt;subvolume_cnt - conf-&gt;decommission_subvols_cnt)) &amp;&amp;</div><div class='add'>+        (inmem_dist_type == ondisk_dist_type))</div><div class='add'>+        fixit = _gf_false;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+</div><div class='add'>+    return fixit;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+dht_selfheal_layout_lock(call_frame_t *frame, dht_layout_t *layout,</div><div class='add'>+                         gf_boolean_t newdir, dht_selfheal_layout_t healer,</div><div class='add'>+                         dht_need_heal_t should_heal)</div><div class='add'>+{</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    int count = 1, ret = -1, i = 0;</div><div class='add'>+    dht_lock_t **lk_array = NULL;</div><div class='add'>+    dht_conf_t *conf = NULL;</div><div class='add'>+    dht_layout_t *tmp = NULL;</div><div class='add'>+    char gfid[GF_UUID_BUF_SIZE] = {0};</div><div class='add'>+</div><div class='add'>+    GF_VALIDATE_OR_GOTO("dht", frame, err);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(frame-&gt;this-&gt;name, frame-&gt;local, err);</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='ctx'> </div><div class='del'>-	if (disk_layout)</div><div class='del'>-		GF_FREE (disk_layout);</div><div class='add'>+    conf = frame-&gt;this-&gt;private;</div><div class='ctx'> </div><div class='del'>-	dht_selfheal_dir_xattr_cbk (frame, subvol, frame-&gt;this,</div><div class='del'>-				    -1, ENOMEM);</div><div class='del'>-	return 0;</div><div class='add'>+    local-&gt;selfheal.healer = healer;</div><div class='add'>+    local-&gt;selfheal.should_heal = should_heal;</div><div class='add'>+</div><div class='add'>+    tmp = local-&gt;selfheal.layout;</div><div class='add'>+    local-&gt;selfheal.layout = dht_layout_ref(frame-&gt;this, layout);</div><div class='add'>+    dht_layout_unref(frame-&gt;this, tmp);</div><div class='add'>+</div><div class='add'>+    if (!newdir) {</div><div class='add'>+        count = conf-&gt;subvolume_cnt;</div><div class='add'>+</div><div class='add'>+        lk_array = GF_CALLOC(count, sizeof(*lk_array), gf_common_mt_char);</div><div class='add'>+        if (lk_array == NULL) {</div><div class='add'>+            gf_uuid_unparse(local-&gt;stbuf.ia_gfid, gfid);</div><div class='add'>+            gf_smsg("dht", GF_LOG_ERROR, ENOMEM, DHT_MSG_MEM_ALLOC_FAILED,</div><div class='add'>+                    "lk_array-gfid=%s", gfid, "path=%s", local-&gt;loc.path, NULL);</div><div class='add'>+            goto err;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        for (i = 0; i &lt; count; i++) {</div><div class='add'>+            lk_array[i] = dht_lock_new(</div><div class='add'>+                frame-&gt;this, conf-&gt;subvolumes[i], &amp;local-&gt;loc, F_WRLCK,</div><div class='add'>+                DHT_LAYOUT_HEAL_DOMAIN, NULL, FAIL_ON_ANY_ERROR);</div><div class='add'>+            if (lk_array[i] == NULL) {</div><div class='add'>+                gf_uuid_unparse(local-&gt;stbuf.ia_gfid, gfid);</div><div class='add'>+                gf_smsg(THIS-&gt;name, GF_LOG_ERROR, ENOMEM,</div><div class='add'>+                        DHT_MSG_MEM_ALLOC_FAILED, "lk_array-gfid=%s", gfid,</div><div class='add'>+                        "path=%s", local-&gt;loc.path, NULL);</div><div class='add'>+                goto err;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+    } else {</div><div class='add'>+        count = 1;</div><div class='add'>+        lk_array = GF_CALLOC(count, sizeof(*lk_array), gf_common_mt_char);</div><div class='add'>+        if (lk_array == NULL) {</div><div class='add'>+            gf_uuid_unparse(local-&gt;stbuf.ia_gfid, gfid);</div><div class='add'>+            gf_smsg(THIS-&gt;name, GF_LOG_ERROR, ENOMEM, DHT_MSG_MEM_ALLOC_FAILED,</div><div class='add'>+                    "lk_array-gfid=%s", gfid, "path=%s", local-&gt;loc.path, NULL);</div><div class='add'>+            goto err;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        lk_array[0] = dht_lock_new(frame-&gt;this, local-&gt;hashed_subvol,</div><div class='add'>+                                   &amp;local-&gt;loc, F_WRLCK, DHT_LAYOUT_HEAL_DOMAIN,</div><div class='add'>+                                   NULL, FAIL_ON_ANY_ERROR);</div><div class='add'>+        if (lk_array[0] == NULL) {</div><div class='add'>+            gf_uuid_unparse(local-&gt;stbuf.ia_gfid, gfid);</div><div class='add'>+            gf_smsg(THIS-&gt;name, GF_LOG_ERROR, ENOMEM, DHT_MSG_MEM_ALLOC_FAILED,</div><div class='add'>+                    "lk_array-gfid=%s", gfid, "path=%s", local-&gt;loc.path, NULL);</div><div class='add'>+            goto err;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    local-&gt;lock[0].layout.my_layout.locks = lk_array;</div><div class='add'>+    local-&gt;lock[0].layout.my_layout.lk_count = count;</div><div class='add'>+</div><div class='add'>+    ret = dht_blocking_inodelk(frame, lk_array, count,</div><div class='add'>+                               dht_selfheal_layout_lock_cbk);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        local-&gt;lock[0].layout.my_layout.locks = NULL;</div><div class='add'>+        local-&gt;lock[0].layout.my_layout.lk_count = 0;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+err:</div><div class='add'>+    if (lk_array != NULL) {</div><div class='add'>+        dht_lock_array_free(lk_array, count);</div><div class='add'>+        GF_FREE(lk_array);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return -1;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+static int</div><div class='add'>+dht_selfheal_dir_xattr_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                           int op_ret, int op_errno, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    xlator_t *subvol = NULL;</div><div class='add'>+    struct iatt *stbuf = NULL;</div><div class='add'>+    int i = 0;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    dht_layout_t *layout = NULL;</div><div class='add'>+    int err = 0;</div><div class='add'>+    int this_call_cnt = 0;</div><div class='add'>+    char gfid[GF_UUID_BUF_SIZE] = {0};</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    layout = local-&gt;selfheal.layout;</div><div class='add'>+    subvol = cookie;</div><div class='add'>+</div><div class='add'>+    if (op_ret == 0) {</div><div class='add'>+        err = 0;</div><div class='add'>+    } else {</div><div class='add'>+        gf_uuid_unparse(local-&gt;loc.gfid, gfid);</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_ERROR, op_errno,</div><div class='add'>+                DHT_MSG_DIR_SELFHEAL_XATTR_FAILED, "name=%s", subvol-&gt;name,</div><div class='add'>+                "path=%s", local-&gt;loc.path, "gfid=%s", gfid, NULL);</div><div class='add'>+        err = op_errno;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_get_bin(xdata, DHT_IATT_IN_XDATA_KEY, (void **)&amp;stbuf);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        gf_uuid_unparse(local-&gt;loc.gfid, gfid);</div><div class='add'>+        gf_msg_debug(this-&gt;name, 0,</div><div class='add'>+                     "key = %s not present in dict"</div><div class='add'>+                     ", path:%s gfid:%s",</div><div class='add'>+                     DHT_IATT_IN_XDATA_KEY, local-&gt;loc.path, gfid);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; layout-&gt;cnt; i++) {</div><div class='add'>+        if (layout-&gt;list[i].xlator == subvol) {</div><div class='add'>+            layout-&gt;list[i].err = err;</div><div class='add'>+            break;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;frame-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        dht_iatt_merge(this, &amp;local-&gt;stbuf, stbuf);</div><div class='add'>+    }</div><div class='add'>+    UNLOCK(&amp;frame-&gt;lock);</div><div class='add'>+</div><div class='add'>+    this_call_cnt = dht_frame_return(frame);</div><div class='add'>+</div><div class='add'>+    if (is_last_call(this_call_cnt)) {</div><div class='add'>+        dht_selfheal_dir_finish(frame, this, 0, 1);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='add'>+/* Code is required to set user xattr to local-&gt;xattr</div><div class='add'>+ */</div><div class='ctx'> int</div><div class='del'>-dht_selfheal_dir_xattr (call_frame_t *frame, loc_t *loc, dht_layout_t *layout)</div><div class='add'>+dht_set_user_xattr(dict_t *dict, char *k, data_t *v, void *data)</div><div class='add'>+{</div><div class='add'>+    dict_t *set_xattr = data;</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    ret = dict_set(set_xattr, k, v);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+dht_selfheal_dir_xattr_persubvol(call_frame_t *frame, loc_t *loc,</div><div class='add'>+                                 dht_layout_t *layout, int i,</div><div class='add'>+                                 xlator_t *req_subvol)</div><div class='ctx'> {</div><div class='del'>-	dht_local_t *local = NULL;</div><div class='del'>-	int          missing_xattr = 0;</div><div class='del'>-	int          i = 0;</div><div class='del'>-	xlator_t    *this = NULL;</div><div class='add'>+    xlator_t *subvol = NULL;</div><div class='add'>+    dict_t *xattr = NULL;</div><div class='add'>+    dict_t *xdata = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    xlator_t *this = NULL;</div><div class='add'>+    int32_t *disk_layout = NULL;</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    dht_conf_t *conf = NULL;</div><div class='add'>+    data_t *data = NULL;</div><div class='add'>+    char gfid[GF_UUID_BUF_SIZE] = {0};</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    if (req_subvol)</div><div class='add'>+        subvol = req_subvol;</div><div class='add'>+    else</div><div class='add'>+        subvol = layout-&gt;list[i].xlator;</div><div class='add'>+    this = frame-&gt;this;</div><div class='add'>+</div><div class='add'>+    GF_VALIDATE_OR_GOTO("", this, err);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, layout, err);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, local, err);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, subvol, err);</div><div class='add'>+    VALIDATE_OR_GOTO(this-&gt;private, err);</div><div class='add'>+</div><div class='add'>+    conf = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    xattr = dict_new();</div><div class='add'>+    if (!xattr) {</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    xdata = dict_new();</div><div class='add'>+    if (!xdata)</div><div class='add'>+        goto err;</div><div class='add'>+</div><div class='add'>+    ret = dict_set_str(xdata, GLUSTERFS_INTERNAL_FOP_KEY, "yes");</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_WARNING, 0, DHT_MSG_DICT_SET_FAILED,</div><div class='add'>+                "path=%s", loc-&gt;path, "key=%s", GLUSTERFS_INTERNAL_FOP_KEY,</div><div class='add'>+                "gfid=%s", gfid, NULL);</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_set_int8(xdata, DHT_IATT_IN_XDATA_KEY, 1);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_WARNING, 0, DHT_MSG_DICT_SET_FAILED,</div><div class='add'>+                "path=%s", loc-&gt;path, "key=%s", DHT_IATT_IN_XDATA_KEY,</div><div class='add'>+                "gfid=%s", gfid, NULL);</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    gf_uuid_unparse(loc-&gt;inode-&gt;gfid, gfid);</div><div class='add'>+</div><div class='add'>+    ret = dht_disk_layout_extract(this, layout, i, &amp;disk_layout);</div><div class='add'>+    if (ret == -1) {</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_WARNING, 0,</div><div class='add'>+                DHT_MSG_DIR_SELFHEAL_XATTR_FAILED,</div><div class='add'>+                "extract-disk-layout-failed, path=%s", loc-&gt;path, "subvol=%s",</div><div class='add'>+                subvol-&gt;name, "gfid=%s", gfid, NULL);</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_set_bin(xattr, conf-&gt;xattr_name, disk_layout, 4 * 4);</div><div class='add'>+    if (ret == -1) {</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_WARNING, 0,</div><div class='add'>+                DHT_MSG_DIR_SELFHEAL_XATTR_FAILED, "path=%s", loc-&gt;path,</div><div class='add'>+                "subvol=%s", subvol-&gt;name,</div><div class='add'>+                "set-xattr-dictionary-failed"</div><div class='add'>+                "gfid=%s",</div><div class='add'>+                gfid, NULL);</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+    disk_layout = NULL;</div><div class='add'>+</div><div class='add'>+    gf_msg_trace(this-&gt;name, 0,</div><div class='add'>+                 "setting hash range 0x%x - 0x%x (type %d) on subvolume %s"</div><div class='add'>+                 " for %s",</div><div class='add'>+                 layout-&gt;list[i].start, layout-&gt;list[i].stop, layout-&gt;type,</div><div class='add'>+                 subvol-&gt;name, loc-&gt;path);</div><div class='add'>+</div><div class='add'>+    if (local-&gt;xattr) {</div><div class='add'>+        data = dict_get(local-&gt;xattr, QUOTA_LIMIT_KEY);</div><div class='add'>+        if (data) {</div><div class='add'>+            ret = dict_add(xattr, QUOTA_LIMIT_KEY, data);</div><div class='add'>+            if (ret) {</div><div class='add'>+                gf_smsg(this-&gt;name, GF_LOG_ERROR, 0, DHT_MSG_DICT_SET_FAILED,</div><div class='add'>+                        "path=%s", loc-&gt;path, "key=%s", QUOTA_LIMIT_KEY, NULL);</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+        data = dict_get(local-&gt;xattr, QUOTA_LIMIT_OBJECTS_KEY);</div><div class='add'>+        if (data) {</div><div class='add'>+            ret = dict_add(xattr, QUOTA_LIMIT_OBJECTS_KEY, data);</div><div class='add'>+            if (ret) {</div><div class='add'>+                gf_smsg(this-&gt;name, GF_LOG_ERROR, 0, DHT_MSG_DICT_SET_FAILED,</div><div class='add'>+                        "path=%s", loc-&gt;path, "key=%s", QUOTA_LIMIT_OBJECTS_KEY,</div><div class='add'>+                        NULL);</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-	this = frame-&gt;this;</div><div class='add'>+    if (!gf_uuid_is_null(local-&gt;gfid))</div><div class='add'>+        gf_uuid_copy(loc-&gt;gfid, local-&gt;gfid);</div><div class='ctx'> </div><div class='del'>-	for (i = 0; i &lt; layout-&gt;cnt; i++) {</div><div class='del'>-		if (layout-&gt;list[i].err != -1 || !layout-&gt;list[i].stop) {</div><div class='del'>-			/* err != -1 would mean xattr present on the directory</div><div class='del'>-			 * or the directory is itself non existant.</div><div class='del'>-			 * !layout-&gt;list[i].stop would mean layout absent</div><div class='del'>-			 */</div><div class='del'>-			continue;</div><div class='del'>-		}</div><div class='del'>-		missing_xattr++;</div><div class='del'>-	}</div><div class='add'>+    STACK_WIND_COOKIE(frame, dht_selfheal_dir_xattr_cbk, (void *)subvol, subvol,</div><div class='add'>+                      subvol-&gt;fops-&gt;setxattr, loc, xattr, 0, xdata);</div><div class='ctx'> </div><div class='del'>-	gf_log (this-&gt;name, GF_LOG_TRACE,</div><div class='del'>-		"%d subvolumes missing xattr for %s",</div><div class='del'>-		missing_xattr, loc-&gt;path);</div><div class='add'>+    dict_unref(xattr);</div><div class='add'>+    dict_unref(xdata);</div><div class='ctx'> </div><div class='del'>-	if (missing_xattr == 0) {</div><div class='del'>-		dht_selfheal_dir_finish (frame, this, 0);</div><div class='del'>-		return 0;</div><div class='del'>-	}</div><div class='add'>+    return 0;</div><div class='ctx'> </div><div class='del'>-	local-&gt;call_cnt = missing_xattr;</div><div class='add'>+err:</div><div class='add'>+    if (xattr)</div><div class='add'>+        dict_unref(xattr);</div><div class='add'>+    if (xdata)</div><div class='add'>+        dict_unref(xdata);</div><div class='ctx'> </div><div class='del'>-	for (i = 0; i &lt; layout-&gt;cnt; i++) {</div><div class='del'>-		if (layout-&gt;list[i].err != -1 || !layout-&gt;list[i].stop)</div><div class='del'>-			continue;</div><div class='add'>+    GF_FREE(disk_layout);</div><div class='add'>+</div><div class='add'>+    dht_selfheal_dir_xattr_cbk(frame, (void *)subvol, frame-&gt;this, -1, ENOMEM,</div><div class='add'>+                               NULL);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-		dht_selfheal_dir_xattr_persubvol (frame, loc, layout, i);</div><div class='add'>+static int</div><div class='add'>+dht_fix_dir_xattr(call_frame_t *frame, loc_t *loc, dht_layout_t *layout)</div><div class='add'>+{</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    int i = 0;</div><div class='add'>+    int count = 0;</div><div class='add'>+    xlator_t *this = NULL;</div><div class='add'>+    dht_conf_t *conf = NULL;</div><div class='add'>+    dht_layout_t *dummy = NULL;</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    this = frame-&gt;this;</div><div class='add'>+    conf = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    gf_msg_debug(this-&gt;name, 0, "%s: Writing the new range for all subvolumes",</div><div class='add'>+                 loc-&gt;path);</div><div class='add'>+</div><div class='add'>+    local-&gt;call_cnt = count = conf-&gt;subvolume_cnt;</div><div class='add'>+</div><div class='add'>+    if (gf_log_get_loglevel() &gt;= GF_LOG_DEBUG)</div><div class='add'>+        dht_log_new_layout_for_dir_selfheal(this, loc, layout);</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; layout-&gt;cnt; i++) {</div><div class='add'>+        dht_selfheal_dir_xattr_persubvol(frame, loc, layout, i, NULL);</div><div class='add'>+</div><div class='add'>+        if (--count == 0)</div><div class='add'>+            goto out;</div><div class='add'>+    }</div><div class='add'>+    /* if we are here, subvolcount &gt; layout_count. subvols-per-directory</div><div class='add'>+     * option might be set here. We need to clear out layout from the</div><div class='add'>+     * non-participating subvolumes, else it will result in overlaps */</div><div class='add'>+    dummy = dht_layout_new(this, 1);</div><div class='add'>+    if (!dummy)</div><div class='add'>+        goto out;</div><div class='add'>+    dummy-&gt;commit_hash = layout-&gt;commit_hash;</div><div class='add'>+    for (i = 0; i &lt; conf-&gt;subvolume_cnt; i++) {</div><div class='add'>+        if (_gf_false == dht_is_subvol_in_layout(layout, conf-&gt;subvolumes[i])) {</div><div class='add'>+            dht_selfheal_dir_xattr_persubvol(frame, loc, dummy, 0,</div><div class='add'>+                                             conf-&gt;subvolumes[i]);</div><div class='add'>+            if (--count == 0)</div><div class='add'>+                break;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-		if (--missing_xattr == 0)</div><div class='del'>-			break;</div><div class='del'>-	}</div><div class='del'>-	return 0;</div><div class='add'>+    dht_layout_unref(this, dummy);</div><div class='add'>+out:</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+static int</div><div class='add'>+dht_selfheal_dir_xattr(call_frame_t *frame, loc_t *loc, dht_layout_t *layout)</div><div class='add'>+{</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    int missing_xattr = 0;</div><div class='add'>+    int i = 0;</div><div class='add'>+    xlator_t *this = NULL;</div><div class='add'>+    dht_conf_t *conf = NULL;</div><div class='add'>+    dht_layout_t *dummy = NULL;</div><div class='add'>+    char gfid[GF_UUID_BUF_SIZE] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    this = frame-&gt;this;</div><div class='add'>+    conf = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; layout-&gt;cnt; i++) {</div><div class='add'>+        if (layout-&gt;list[i].err != -1 || !layout-&gt;list[i].stop) {</div><div class='add'>+            /* err != -1 would mean xattr present on the directory</div><div class='add'>+             * or the directory is non existent.</div><div class='add'>+             * !layout-&gt;list[i].stop would mean layout absent</div><div class='add'>+             */</div><div class='add'>+</div><div class='add'>+            continue;</div><div class='add'>+        }</div><div class='add'>+        missing_xattr++;</div><div class='add'>+    }</div><div class='add'>+    /* Also account for subvolumes with no-layout. Used for zero'ing out</div><div class='add'>+     * the layouts and for setting quota key's if present */</div><div class='add'>+    for (i = 0; i &lt; conf-&gt;subvolume_cnt; i++) {</div><div class='add'>+        if (_gf_false == dht_is_subvol_in_layout(layout, conf-&gt;subvolumes[i])) {</div><div class='add'>+            missing_xattr++;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    gf_msg_trace(this-&gt;name, 0, "%d subvolumes missing xattr for %s",</div><div class='add'>+                 missing_xattr, loc-&gt;path);</div><div class='add'>+</div><div class='add'>+    if (missing_xattr == 0) {</div><div class='add'>+        dht_selfheal_dir_finish(frame, this, 0, 1);</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    local-&gt;call_cnt = missing_xattr;</div><div class='add'>+</div><div class='add'>+    if (gf_log_get_loglevel() &gt;= GF_LOG_DEBUG)</div><div class='add'>+        dht_log_new_layout_for_dir_selfheal(this, loc, layout);</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; layout-&gt;cnt; i++) {</div><div class='add'>+        if (layout-&gt;list[i].err != -1 || !layout-&gt;list[i].stop)</div><div class='add'>+            continue;</div><div class='add'>+</div><div class='add'>+        dht_selfheal_dir_xattr_persubvol(frame, loc, layout, i, NULL);</div><div class='add'>+</div><div class='add'>+        if (--missing_xattr == 0)</div><div class='add'>+            break;</div><div class='add'>+    }</div><div class='add'>+    dummy = dht_layout_new(this, 1);</div><div class='add'>+    if (!dummy) {</div><div class='add'>+        gf_uuid_unparse(loc-&gt;gfid, gfid);</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_ERROR, ENOMEM, DHT_MSG_DUMMY_ALLOC_FAILED,</div><div class='add'>+                "path=%s", loc-&gt;path, "gfid=%s", gfid, NULL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    for (i = 0; i &lt; conf-&gt;subvolume_cnt &amp;&amp; missing_xattr; i++) {</div><div class='add'>+        if (_gf_false == dht_is_subvol_in_layout(layout, conf-&gt;subvolumes[i])) {</div><div class='add'>+            dht_selfheal_dir_xattr_persubvol(frame, loc, dummy, 0,</div><div class='add'>+                                             conf-&gt;subvolumes[i]);</div><div class='add'>+            missing_xattr--;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    dht_layout_unref(this, dummy);</div><div class='add'>+out:</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-dht_selfheal_dir_mkdir_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-			    int op_ret, int op_errno,</div><div class='del'>-                            inode_t *inode, struct iatt *stbuf,</div><div class='del'>-                            struct iatt *preparent, struct iatt *postparent)</div><div class='del'>-{</div><div class='del'>-	dht_local_t   *local = NULL;</div><div class='del'>-	dht_layout_t  *layout = NULL;</div><div class='del'>-	call_frame_t  *prev = NULL;</div><div class='del'>-	xlator_t      *subvol = NULL;</div><div class='del'>-	int            i = 0;</div><div class='del'>-	int            this_call_cnt = 0;</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-	local  = frame-&gt;local;</div><div class='del'>-	layout = local-&gt;selfheal.layout;</div><div class='del'>-	prev   = cookie;</div><div class='del'>-	subvol = prev-&gt;this;</div><div class='del'>-</div><div class='del'>-	if ((op_ret == 0) || ((op_ret == -1) &amp;&amp; (op_errno == EEXIST))) {</div><div class='del'>-		for (i = 0; i &lt; layout-&gt;cnt; i++) {</div><div class='del'>-			if (layout-&gt;list[i].xlator == subvol) {</div><div class='del'>-				layout-&gt;list[i].err = -1;</div><div class='del'>-				break;</div><div class='del'>-			}</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-        if (op_ret)</div><div class='del'>-                goto out;</div><div class='add'>+dht_selfheal_dir_setattr_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                             int op_ret, int op_errno, struct iatt *statpre,</div><div class='add'>+                             struct iatt *statpost, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    dht_layout_t *layout = NULL;</div><div class='add'>+    int this_call_cnt = 0, ret = -1;</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    layout = local-&gt;selfheal.layout;</div><div class='add'>+</div><div class='add'>+    this_call_cnt = dht_frame_return(frame);</div><div class='add'>+</div><div class='add'>+    if (is_last_call(this_call_cnt)) {</div><div class='add'>+        if (!local-&gt;heal_layout) {</div><div class='add'>+            gf_msg_trace(this-&gt;name, 0, "Skip heal layout for %s gfid = %s ",</div><div class='add'>+                         local-&gt;loc.path, uuid_utoa(local-&gt;gfid));</div><div class='add'>+</div><div class='add'>+            dht_selfheal_dir_finish(frame, this, 0, 1);</div><div class='add'>+            return 0;</div><div class='add'>+        }</div><div class='add'>+        ret = dht_selfheal_layout_lock(frame, layout, _gf_false,</div><div class='add'>+                                       dht_selfheal_dir_xattr,</div><div class='add'>+                                       dht_should_heal_layout);</div><div class='add'>+</div><div class='add'>+        if (ret &lt; 0) {</div><div class='add'>+            dht_selfheal_dir_finish(frame, this, -1, 1);</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+dht_selfheal_dir_setattr(call_frame_t *frame, loc_t *loc, struct iatt *stbuf,</div><div class='add'>+                         int32_t valid, dht_layout_t *layout)</div><div class='add'>+{</div><div class='add'>+    int missing_attr = 0;</div><div class='add'>+    int i = 0, ret = -1;</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    dht_conf_t *conf = NULL;</div><div class='add'>+    xlator_t *this = NULL;</div><div class='add'>+    int cnt = 0;</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    this = frame-&gt;this;</div><div class='add'>+    conf = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    /* We need to heal the attrs if:</div><div class='add'>+     * 1. Any directories were missing - the newly created dirs will need</div><div class='add'>+     *    to have the correct attrs set</div><div class='add'>+     * 2. An existing dir does not have the correct permissions -they may</div><div class='add'>+     *    have been changed when a brick was down.</div><div class='add'>+     */</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; layout-&gt;cnt; i++) {</div><div class='add'>+        if (layout-&gt;list[i].err == -1)</div><div class='add'>+            missing_attr++;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if ((missing_attr == 0) &amp;&amp; (local-&gt;need_attrheal == 0)) {</div><div class='add'>+        if (!local-&gt;heal_layout) {</div><div class='add'>+            gf_msg_trace(this-&gt;name, 0, "Skip heal layout for %s gfid = %s ",</div><div class='add'>+                         loc-&gt;path, uuid_utoa(loc-&gt;gfid));</div><div class='add'>+            dht_selfheal_dir_finish(frame, this, 0, 1);</div><div class='add'>+            return 0;</div><div class='add'>+        }</div><div class='add'>+        ret = dht_selfheal_layout_lock(frame, layout, _gf_false,</div><div class='add'>+                                       dht_selfheal_dir_xattr,</div><div class='add'>+                                       dht_should_heal_layout);</div><div class='ctx'> </div><div class='add'>+        if (ret &lt; 0) {</div><div class='add'>+            dht_selfheal_dir_finish(frame, this, -1, 1);</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        dht_iatt_merge (this, &amp;local-&gt;stbuf, stbuf, prev-&gt;this);</div><div class='del'>-        if (prev-&gt;this == local-&gt;hashed_subvol)</div><div class='del'>-                local-&gt;ia_ino = local-&gt;stbuf.ia_ino;</div><div class='add'>+    cnt = local-&gt;call_cnt = conf-&gt;subvolume_cnt;</div><div class='ctx'> </div><div class='del'>-        dht_iatt_merge (this, &amp;local-&gt;preparent, preparent, prev-&gt;this);</div><div class='del'>-        dht_iatt_merge (this, &amp;local-&gt;postparent, postparent, prev-&gt;this);</div><div class='add'>+    for (i = 0; i &lt; cnt; i++) {</div><div class='add'>+        STACK_WIND(frame, dht_selfheal_dir_setattr_cbk, layout-&gt;list[i].xlator,</div><div class='add'>+                   layout-&gt;list[i].xlator-&gt;fops-&gt;setattr, loc, stbuf, valid,</div><div class='add'>+                   NULL);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+dht_selfheal_dir_mkdir_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                           int op_ret, int op_errno, inode_t *inode,</div><div class='add'>+                           struct iatt *stbuf, struct iatt *preparent,</div><div class='add'>+                           struct iatt *postparent, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    dht_layout_t *layout = NULL;</div><div class='add'>+    xlator_t *prev = NULL;</div><div class='add'>+    xlator_t *subvol = NULL;</div><div class='add'>+    int i = 0, ret = -1;</div><div class='add'>+    int this_call_cnt = 0;</div><div class='add'>+    char gfid[GF_UUID_BUF_SIZE] = {0};</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    layout = local-&gt;selfheal.layout;</div><div class='add'>+    prev = cookie;</div><div class='add'>+    subvol = prev;</div><div class='add'>+</div><div class='add'>+    if ((op_ret == 0) || ((op_ret == -1) &amp;&amp; (op_errno == EEXIST))) {</div><div class='add'>+        for (i = 0; i &lt; layout-&gt;cnt; i++) {</div><div class='add'>+            if (layout-&gt;list[i].xlator == subvol) {</div><div class='add'>+                layout-&gt;list[i].err = -1;</div><div class='add'>+                break;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (op_ret) {</div><div class='add'>+        gf_uuid_unparse(local-&gt;loc.gfid, gfid);</div><div class='add'>+        gf_smsg(this-&gt;name,</div><div class='add'>+                ((op_errno == EEXIST) ? GF_LOG_DEBUG : GF_LOG_WARNING),</div><div class='add'>+                op_errno, DHT_MSG_DIR_SELFHEAL_FAILED, "path=%s",</div><div class='add'>+                local-&gt;loc.path, "gfid=%s", gfid, NULL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    dht_iatt_merge(this, &amp;local-&gt;preparent, preparent);</div><div class='add'>+    dht_iatt_merge(this, &amp;local-&gt;postparent, postparent);</div><div class='add'>+    ret = 0;</div><div class='ctx'> </div><div class='ctx'> out:</div><div class='del'>-	this_call_cnt = dht_frame_return (frame);</div><div class='add'>+    this_call_cnt = dht_frame_return(frame);</div><div class='ctx'> </div><div class='del'>-	if (is_last_call (this_call_cnt)) {</div><div class='del'>-		dht_selfheal_dir_xattr (frame, &amp;local-&gt;loc, layout);</div><div class='del'>-	}</div><div class='add'>+    if (is_last_call(this_call_cnt)) {</div><div class='add'>+        dht_selfheal_dir_finish(frame, this, ret, 0);</div><div class='add'>+        dht_selfheal_dir_setattr(frame, &amp;local-&gt;loc, &amp;local-&gt;stbuf, 0xffffff,</div><div class='add'>+                                 layout);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	return 0;</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+static int</div><div class='add'>+dht_selfheal_dir_mkdir_lookup_done(call_frame_t *frame, xlator_t *this)</div><div class='add'>+{</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    int i = 0;</div><div class='add'>+    dict_t *dict = NULL;</div><div class='add'>+    dht_layout_t *layout = NULL;</div><div class='add'>+    loc_t *loc = NULL;</div><div class='add'>+    int cnt = 0;</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    VALIDATE_OR_GOTO(this-&gt;private, err);</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    layout = local-&gt;layout;</div><div class='add'>+    loc = &amp;local-&gt;loc;</div><div class='add'>+</div><div class='add'>+    if (!gf_uuid_is_null(local-&gt;gfid)) {</div><div class='add'>+        dict = dict_new();</div><div class='add'>+        if (!dict)</div><div class='add'>+            return -1;</div><div class='add'>+</div><div class='add'>+        ret = dict_set_gfuuid(dict, "gfid-req", local-&gt;gfid, true);</div><div class='add'>+        if (ret)</div><div class='add'>+            gf_smsg(this-&gt;name, GF_LOG_WARNING, 0, DHT_MSG_DICT_SET_FAILED,</div><div class='add'>+                    "path=%s", loc-&gt;path, "key=gfid-req", NULL);</div><div class='add'>+    } else if (local-&gt;params) {</div><div class='add'>+        /* Send the dictionary from higher layers directly */</div><div class='add'>+</div><div class='add'>+        dict = dict_ref(local-&gt;params);</div><div class='add'>+    }</div><div class='add'>+    /* Code to update all extended attributed from local-&gt;xattr</div><div class='add'>+       to dict</div><div class='add'>+    */</div><div class='add'>+    dht_dir_set_heal_xattr(this, local, dict, local-&gt;xattr, NULL, NULL);</div><div class='add'>+</div><div class='add'>+    if (!dict) {</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_WARNING, 0, DHT_MSG_DICT_IS_NULL, NULL);</div><div class='add'>+        dict = dict_new();</div><div class='add'>+        if (!dict)</div><div class='add'>+            return -1;</div><div class='add'>+    }</div><div class='add'>+    ret = dict_set_flag(dict, GF_INTERNAL_CTX_KEY, GF_DHT_HEAL_DIR);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_ERROR, 0, DHT_MSG_DICT_SET_FAILED, "key=%s",</div><div class='add'>+                GF_INTERNAL_CTX_KEY, "path=%s", loc-&gt;path, NULL);</div><div class='add'>+        /* We can still continue. As heal can still happen</div><div class='add'>+         * unless quota limits have reached for the dir.</div><div class='add'>+         */</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    cnt = layout-&gt;cnt;</div><div class='add'>+    for (i = 0; i &lt; cnt; i++) {</div><div class='add'>+        if (layout-&gt;list[i].err == ESTALE || layout-&gt;list[i].err == ENOENT ||</div><div class='add'>+            local-&gt;selfheal.force_mkdir) {</div><div class='add'>+            gf_msg_debug(this-&gt;name, 0, "Creating directory %s on subvol %s",</div><div class='add'>+                         loc-&gt;path, layout-&gt;list[i].xlator-&gt;name);</div><div class='add'>+</div><div class='add'>+            STACK_WIND_COOKIE(</div><div class='add'>+                frame, dht_selfheal_dir_mkdir_cbk, layout-&gt;list[i].xlator,</div><div class='add'>+                layout-&gt;list[i].xlator, layout-&gt;list[i].xlator-&gt;fops-&gt;mkdir,</div><div class='add'>+                loc,</div><div class='add'>+                st_mode_from_ia(local-&gt;stbuf.ia_prot, local-&gt;stbuf.ia_type), 0,</div><div class='add'>+                dict);</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-dht_selfheal_dir_mkdir (call_frame_t *frame, loc_t *loc,</div><div class='del'>-			dht_layout_t *layout, int force)</div><div class='add'>+    if (dict)</div><div class='add'>+        dict_unref(dict);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+</div><div class='add'>+err:</div><div class='add'>+    dht_selfheal_dir_finish(frame, this, -1, 1);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+dht_selfheal_dir_mkdir_lookup_cbk(call_frame_t *frame, void *cookie,</div><div class='add'>+                                  xlator_t *this, int op_ret, int op_errno,</div><div class='add'>+                                  inode_t *inode, struct iatt *stbuf,</div><div class='add'>+                                  dict_t *xattr, struct iatt *postparent)</div><div class='add'>+{</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    int i = 0;</div><div class='add'>+    int this_call_cnt = 0;</div><div class='add'>+    int missing_dirs = 0;</div><div class='add'>+    dht_layout_t *layout = NULL;</div><div class='add'>+    xlator_t *prev = 0;</div><div class='add'>+    loc_t *loc = NULL;</div><div class='add'>+    char gfid_local[GF_UUID_BUF_SIZE] = {0};</div><div class='add'>+    int index = -1;</div><div class='add'>+</div><div class='add'>+    VALIDATE_OR_GOTO(this-&gt;private, err);</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    layout = local-&gt;layout;</div><div class='add'>+    loc = &amp;local-&gt;loc;</div><div class='add'>+    prev = cookie;</div><div class='add'>+</div><div class='add'>+    if (!gf_uuid_is_null(local-&gt;gfid))</div><div class='add'>+        gf_uuid_unparse(local-&gt;gfid, gfid_local);</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;frame-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        index = dht_layout_index_for_subvol(layout, prev);</div><div class='add'>+        if ((op_ret &lt; 0) &amp;&amp; (op_errno == ENOENT || op_errno == ESTALE)) {</div><div class='add'>+            local-&gt;selfheal.hole_cnt = !local-&gt;selfheal.hole_cnt</div><div class='add'>+                                           ? 1</div><div class='add'>+                                           : local-&gt;selfheal.hole_cnt + 1;</div><div class='add'>+            /* the status might have changed. Update the layout with the</div><div class='add'>+             * new status</div><div class='add'>+             */</div><div class='add'>+            if (index &gt;= 0) {</div><div class='add'>+                layout-&gt;list[index].err = op_errno;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        if (!op_ret) {</div><div class='add'>+            dht_iatt_merge(this, &amp;local-&gt;stbuf, stbuf);</div><div class='add'>+            if (prev == local-&gt;mds_subvol) {</div><div class='add'>+                dict_unref(local-&gt;xattr);</div><div class='add'>+                local-&gt;xattr = dict_ref(xattr);</div><div class='add'>+            }</div><div class='add'>+            /* the status might have changed. Update the layout with the</div><div class='add'>+             * new status</div><div class='add'>+             */</div><div class='add'>+            if (index &gt;= 0) {</div><div class='add'>+                layout-&gt;list[index].err = -1;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    UNLOCK(&amp;frame-&gt;lock);</div><div class='add'>+</div><div class='add'>+    this_call_cnt = dht_frame_return(frame);</div><div class='add'>+</div><div class='add'>+    if (is_last_call(this_call_cnt)) {</div><div class='add'>+        if (local-&gt;selfheal.hole_cnt == layout-&gt;cnt) {</div><div class='add'>+            gf_msg_debug(this-&gt;name, op_errno,</div><div class='add'>+                         "Lookup failed, an rmdir could have "</div><div class='add'>+                         "deleted this entry %s",</div><div class='add'>+                         loc-&gt;name);</div><div class='add'>+            local-&gt;op_errno = op_errno;</div><div class='add'>+            goto err;</div><div class='add'>+        } else {</div><div class='add'>+            for (i = 0; i &lt; layout-&gt;cnt; i++) {</div><div class='add'>+                if (layout-&gt;list[i].err == ENOENT ||</div><div class='add'>+                    layout-&gt;list[i].err == ESTALE ||</div><div class='add'>+                    local-&gt;selfheal.force_mkdir)</div><div class='add'>+                    missing_dirs++;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            if (missing_dirs == 0) {</div><div class='add'>+                dht_selfheal_dir_finish(frame, this, 0, 0);</div><div class='add'>+                dht_selfheal_dir_setattr(frame, loc, &amp;local-&gt;stbuf, 0xffffffff,</div><div class='add'>+                                         layout);</div><div class='add'>+                return 0;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            local-&gt;call_cnt = missing_dirs;</div><div class='add'>+            dht_selfheal_dir_mkdir_lookup_done(frame, this);</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+</div><div class='add'>+err:</div><div class='add'>+    dht_selfheal_dir_finish(frame, this, -1, 1);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+dht_selfheal_dir_mkdir_lock_cbk(call_frame_t *frame, void *cookie,</div><div class='add'>+                                xlator_t *this, int32_t op_ret,</div><div class='add'>+                                int32_t op_errno, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-	int           missing_dirs = 0;</div><div class='del'>-	int           i = 0;</div><div class='del'>-	dht_local_t  *local = NULL;</div><div class='del'>-	xlator_t     *this = NULL;</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    dht_conf_t *conf = NULL;</div><div class='add'>+    int i = 0;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    xlator_t *mds_subvol = NULL;</div><div class='ctx'> </div><div class='add'>+    VALIDATE_OR_GOTO(this-&gt;private, err);</div><div class='ctx'> </div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-	this = frame-&gt;this;</div><div class='add'>+    conf = this-&gt;private;</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    mds_subvol = local-&gt;mds_subvol;</div><div class='ctx'> </div><div class='del'>-	for (i = 0; i &lt; layout-&gt;cnt; i++) {</div><div class='del'>-		if (layout-&gt;list[i].err == ENOENT || force)</div><div class='del'>-			missing_dirs++;</div><div class='del'>-	}</div><div class='add'>+    local-&gt;call_cnt = conf-&gt;subvolume_cnt;</div><div class='ctx'> </div><div class='del'>-	if (missing_dirs == 0) {</div><div class='del'>-		dht_selfheal_dir_xattr (frame, loc, layout);</div><div class='del'>-		return 0;</div><div class='del'>-	}</div><div class='add'>+    if (op_ret &lt; 0) {</div><div class='add'>+        if (op_errno == EINVAL) {</div><div class='add'>+            local-&gt;call_cnt = 1;</div><div class='add'>+            dht_selfheal_dir_mkdir_lookup_done(frame, this);</div><div class='add'>+            return 0;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-	local-&gt;call_cnt = missing_dirs;</div><div class='del'>-	for (i = 0; i &lt; layout-&gt;cnt; i++) {</div><div class='del'>-		if (layout-&gt;list[i].err == ENOENT || force) {</div><div class='del'>-			gf_log (this-&gt;name, GF_LOG_TRACE,</div><div class='del'>-				"creating directory %s on subvol %s",</div><div class='del'>-				loc-&gt;path, layout-&gt;list[i].xlator-&gt;name);</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_WARNING, op_errno, DHT_MSG_ENTRYLK_ERROR,</div><div class='add'>+                "path=%s", local-&gt;loc.path, NULL);</div><div class='add'>+</div><div class='add'>+        local-&gt;op_errno = op_errno;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* After getting locks, perform lookup again to ensure that the</div><div class='add'>+       directory was not deleted by a racing rmdir</div><div class='add'>+    */</div><div class='add'>+    if (!local-&gt;xattr_req)</div><div class='add'>+        local-&gt;xattr_req = dict_new();</div><div class='add'>+</div><div class='add'>+    ret = dict_set_int32(local-&gt;xattr_req, "list-xattr", 1);</div><div class='add'>+    if (ret)</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_ERROR, 0, DHT_MSG_DICT_SET_FAILED, "path=%s",</div><div class='add'>+                local-&gt;loc.path, NULL);</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; conf-&gt;subvolume_cnt; i++) {</div><div class='add'>+        if (mds_subvol &amp;&amp; conf-&gt;subvolumes[i] == mds_subvol) {</div><div class='add'>+            STACK_WIND_COOKIE(frame, dht_selfheal_dir_mkdir_lookup_cbk,</div><div class='add'>+                              conf-&gt;subvolumes[i], conf-&gt;subvolumes[i],</div><div class='add'>+                              conf-&gt;subvolumes[i]-&gt;fops-&gt;lookup, &amp;local-&gt;loc,</div><div class='add'>+                              local-&gt;xattr_req);</div><div class='add'>+        } else {</div><div class='add'>+            STACK_WIND_COOKIE(frame, dht_selfheal_dir_mkdir_lookup_cbk,</div><div class='add'>+                              conf-&gt;subvolumes[i], conf-&gt;subvolumes[i],</div><div class='add'>+                              conf-&gt;subvolumes[i]-&gt;fops-&gt;lookup, &amp;local-&gt;loc,</div><div class='add'>+                              NULL);</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-			STACK_WIND (frame, dht_selfheal_dir_mkdir_cbk,</div><div class='del'>-				    layout-&gt;list[i].xlator,</div><div class='del'>-				    layout-&gt;list[i].xlator-&gt;fops-&gt;mkdir,</div><div class='del'>-				    loc,</div><div class='del'>-                                    st_mode_from_ia (local-&gt;stbuf.ia_prot,</div><div class='del'>-                                                     local-&gt;stbuf.ia_type),</div><div class='del'>-                                    NULL);</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='add'>+    return 0;</div><div class='ctx'> </div><div class='del'>-	return 0;</div><div class='add'>+err:</div><div class='add'>+    dht_selfheal_dir_finish(frame, this, -1, 1);</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+static int</div><div class='add'>+dht_selfheal_dir_mkdir(call_frame_t *frame, loc_t *loc, dht_layout_t *layout,</div><div class='add'>+                       int force)</div><div class='add'>+{</div><div class='add'>+    int missing_dirs = 0;</div><div class='add'>+    int i = 0;</div><div class='add'>+    int op_errno = 0;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    xlator_t *this = NULL;</div><div class='add'>+    dht_conf_t *conf = NULL;</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    this = frame-&gt;this;</div><div class='add'>+    conf = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    local-&gt;selfheal.force_mkdir = force;</div><div class='add'>+    local-&gt;selfheal.hole_cnt = 0;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; layout-&gt;cnt; i++) {</div><div class='add'>+        if (layout-&gt;list[i].err == ENOENT || force)</div><div class='add'>+            missing_dirs++;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (missing_dirs == 0) {</div><div class='add'>+        /* We don't need to create any directories. Proceed to heal the</div><div class='add'>+         * attrs and xattrs</div><div class='add'>+         */</div><div class='add'>+        if (!__is_root_gfid(local-&gt;stbuf.ia_gfid)) {</div><div class='add'>+            if (local-&gt;need_xattr_heal) {</div><div class='add'>+                local-&gt;need_xattr_heal = 0;</div><div class='add'>+                ret = dht_dir_xattr_heal(this, local, &amp;op_errno);</div><div class='add'>+                if (ret) {</div><div class='add'>+                    gf_smsg(this-&gt;name, GF_LOG_ERROR, op_errno,</div><div class='add'>+                            DHT_MSG_DIR_XATTR_HEAL_FAILED, "path=%s",</div><div class='add'>+                            local-&gt;loc.path, "gfid=%s", local-&gt;gfid, NULL);</div><div class='add'>+                }</div><div class='add'>+            } else {</div><div class='add'>+                if (!gf_uuid_is_null(local-&gt;gfid))</div><div class='add'>+                    gf_uuid_copy(loc-&gt;gfid, local-&gt;gfid);</div><div class='add'>+</div><div class='add'>+                ret = dht_common_mark_mdsxattr(frame, NULL, 0);</div><div class='add'>+                if (!ret)</div><div class='add'>+                    return 0;</div><div class='add'>+</div><div class='add'>+                gf_smsg(this-&gt;name, GF_LOG_INFO, 0, DHT_MSG_SET_XATTR_FAILED,</div><div class='add'>+                        "path=%s", local-&gt;loc.path, "gfid=%s", local-&gt;gfid,</div><div class='add'>+                        NULL);</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+        dht_selfheal_dir_setattr(frame, loc, &amp;local-&gt;stbuf, 0xffffffff, layout);</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* MDS xattr is populated only while DHT is having more than one</div><div class='add'>+     subvol.In case of graph switch while adding more dht subvols need to</div><div class='add'>+     consider hash subvol as a MDS to avoid MDS check failure at the time</div><div class='add'>+     of running fop on directory</div><div class='add'>+    */</div><div class='add'>+    if (!dict_get(local-&gt;xattr, conf-&gt;mds_xattr_key) &amp;&amp;</div><div class='add'>+        (conf-&gt;subvolume_cnt &gt; 1)) {</div><div class='add'>+        if (local-&gt;hashed_subvol == NULL) {</div><div class='add'>+            local-&gt;hashed_subvol = dht_subvol_get_hashed(this, loc);</div><div class='add'>+            if (local-&gt;hashed_subvol == NULL) {</div><div class='add'>+                local-&gt;op_errno = EINVAL;</div><div class='add'>+                gf_smsg(this-&gt;name, GF_LOG_WARNING, local-&gt;op_errno,</div><div class='add'>+                        DHT_MSG_HASHED_SUBVOL_GET_FAILED, "gfid=%s",</div><div class='add'>+                        loc-&gt;pargfid, "name=%s", loc-&gt;name, "path=%s",</div><div class='add'>+                        loc-&gt;path, NULL);</div><div class='add'>+                goto err;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+        ret = dht_inode_ctx_mdsvol_set(local-&gt;inode, this,</div><div class='add'>+                                       local-&gt;hashed_subvol);</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, 0, DHT_MSG_SET_INODE_CTX_FAILED,</div><div class='add'>+                   "Failed to set hashed subvol for %s on inode vol is %s",</div><div class='add'>+                   local-&gt;loc.path,</div><div class='add'>+                   local-&gt;hashed_subvol ? local-&gt;hashed_subvol-&gt;name : "NULL");</div><div class='add'>+            goto err;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (local-&gt;hashed_subvol == NULL) {</div><div class='add'>+        local-&gt;hashed_subvol = dht_subvol_get_hashed(this, loc);</div><div class='add'>+        if (local-&gt;hashed_subvol == NULL) {</div><div class='add'>+            local-&gt;op_errno = EINVAL;</div><div class='add'>+            gf_smsg(this-&gt;name, GF_LOG_WARNING, local-&gt;op_errno,</div><div class='add'>+                    DHT_MSG_HASHED_SUBVOL_GET_FAILED, "gfid=%s", loc-&gt;pargfid,</div><div class='add'>+                    "name=%s", loc-&gt;name, "path=%s", loc-&gt;path, NULL);</div><div class='add'>+            goto err;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    local-&gt;current = &amp;local-&gt;lock[0];</div><div class='add'>+    ret = dht_protect_namespace(frame, loc, local-&gt;hashed_subvol,</div><div class='add'>+                                &amp;local-&gt;current-&gt;ns,</div><div class='add'>+                                dht_selfheal_dir_mkdir_lock_cbk);</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-dht_selfheal_layout_alloc_start (xlator_t *this, loc_t *loc,</div><div class='del'>-                                 dht_layout_t *layout)</div><div class='add'>+    if (ret &lt; 0)</div><div class='add'>+        goto err;</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+err:</div><div class='add'>+    return -1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+dht_selfheal_layout_alloc_start(xlator_t *this, loc_t *loc,</div><div class='add'>+                                dht_layout_t *layout)</div><div class='ctx'> {</div><div class='del'>-        int           start = 0;</div><div class='del'>-        uint32_t      hashval = 0;</div><div class='del'>-        int           ret = 0;</div><div class='add'>+    int start = 0;</div><div class='add'>+    uint32_t hashval = 0;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    const char *str = NULL;</div><div class='add'>+    dht_conf_t *conf = NULL;</div><div class='add'>+    char buf[UUID_CANONICAL_FORM_LEN + 1] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    conf = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    if (conf-&gt;randomize_by_gfid) {</div><div class='add'>+        str = uuid_utoa_r(loc-&gt;gfid, buf);</div><div class='add'>+    } else {</div><div class='add'>+        str = loc-&gt;path;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dht_hash_compute(this, layout-&gt;type, str, &amp;hashval);</div><div class='add'>+    if (ret == 0) {</div><div class='add'>+        start = (hashval % layout-&gt;cnt);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return start;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        ret = dht_hash_compute (layout-&gt;type, loc-&gt;path, &amp;hashval);</div><div class='del'>-        if (ret == 0) {</div><div class='del'>-                start = (hashval % layout-&gt;cnt);</div><div class='add'>+static int</div><div class='add'>+dht_get_layout_count(xlator_t *this, dht_layout_t *layout, int new_layout)</div><div class='add'>+{</div><div class='add'>+    int i = 0;</div><div class='add'>+    int j = 0;</div><div class='add'>+    int err = 0;</div><div class='add'>+    int count = 0;</div><div class='add'>+    dht_conf_t *conf = NULL;</div><div class='add'>+</div><div class='add'>+    /* Gets in use only for replace-brick, remove-brick */</div><div class='add'>+    conf = this-&gt;private;</div><div class='add'>+    for (i = 0; i &lt; layout-&gt;cnt; i++) {</div><div class='add'>+        for (j = 0; j &lt; conf-&gt;subvolume_cnt; j++) {</div><div class='add'>+            if (conf-&gt;decommissioned_bricks[j] &amp;&amp;</div><div class='add'>+                conf-&gt;decommissioned_bricks[j] == layout-&gt;list[i].xlator) {</div><div class='add'>+                layout-&gt;list[i].err = EINVAL;</div><div class='add'>+                break;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; layout-&gt;cnt; i++) {</div><div class='add'>+        err = layout-&gt;list[i].err;</div><div class='add'>+        if (err == -1 || err == 0 || err == ENOENT) {</div><div class='add'>+            /* Take this with a pinch of salt. The behaviour seems</div><div class='add'>+             * to be slightly different when this function is</div><div class='add'>+             * invoked from mkdir codepath. For eg., err == 0 in</div><div class='add'>+             * mkdir codepath means directory created but xattr</div><div class='add'>+             * is not set yet.</div><div class='add'>+             */</div><div class='add'>+</div><div class='add'>+            /* Setting list[i].err = -1 is an indication for</div><div class='add'>+               dht_selfheal_layout_new_directory() to assign</div><div class='add'>+               a range. We set it to -1 based on any one of</div><div class='add'>+               the three criteria:</div><div class='add'>+</div><div class='add'>+               - err == -1 already, which means directory</div><div class='add'>+                 existed but layout was not set on it.</div><div class='add'>+</div><div class='add'>+               - err == 0, which means directory exists and</div><div class='add'>+                 has an old layout piece which will be</div><div class='add'>+                 overwritten now.</div><div class='add'>+</div><div class='add'>+               - err == ENOENT, which means directory does</div><div class='add'>+                 not exist (possibly racing with mkdir or</div><div class='add'>+                 finishing half done mkdir). The missing</div><div class='add'>+                 directory will be attempted to be recreated.</div><div class='add'>+            */</div><div class='add'>+            count++;</div><div class='add'>+            if (!err)</div><div class='add'>+                layout-&gt;list[i].err = -1;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* no subvolume has enough space, but can't stop directory creation */</div><div class='add'>+    if (!count || !new_layout) {</div><div class='add'>+        for (i = 0; i &lt; layout-&gt;cnt; i++) {</div><div class='add'>+            err = layout-&gt;list[i].err;</div><div class='add'>+            if (err == ENOSPC) {</div><div class='add'>+                layout-&gt;list[i].err = -1;</div><div class='add'>+                count++;</div><div class='add'>+            }</div><div class='ctx'>         }</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        return start;</div><div class='add'>+    /* if layout-&gt;spread_cnt is set, check if it is &lt;= available</div><div class='add'>+     * subvolumes (down brick and decommissioned bricks are considered</div><div class='add'>+     * un-available). Else return count (available up bricks) */</div><div class='add'>+    count = ((layout-&gt;spread_cnt &amp;&amp; (layout-&gt;spread_cnt &lt;= count))</div><div class='add'>+                 ? layout-&gt;spread_cnt</div><div class='add'>+                 : ((count) ? count : 1));</div><div class='add'>+</div><div class='add'>+    return count;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+void</div><div class='add'>+dht_selfheal_layout_new_directory(call_frame_t *frame, loc_t *loc,</div><div class='add'>+                                  dht_layout_t *new_layout);</div><div class='ctx'> </div><div class='ctx'> void</div><div class='del'>-dht_selfheal_layout_new_directory (call_frame_t *frame, loc_t *loc,</div><div class='del'>-				   dht_layout_t *layout)</div><div class='del'>-{</div><div class='del'>-	xlator_t    *this = NULL;</div><div class='del'>-	uint32_t     chunk = 0;</div><div class='del'>-	int          i = 0;</div><div class='del'>-	uint32_t     start = 0;</div><div class='del'>-	int          cnt = 0;</div><div class='del'>-	int          err = 0;</div><div class='del'>-        int          start_subvol = 0;</div><div class='del'>-</div><div class='del'>-	this = frame-&gt;this;</div><div class='del'>-</div><div class='del'>-	for (i = 0; i &lt; layout-&gt;cnt; i++) {</div><div class='del'>-		err = layout-&gt;list[i].err;</div><div class='del'>-		if (err == -1 || err == 0) {</div><div class='del'>-			layout-&gt;list[i].err = -1;</div><div class='del'>-			cnt++;</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-        /* no subvolume has enough space, but can't stop directory creation */</div><div class='del'>-        if (!cnt) {</div><div class='del'>-                for (i = 0; i &lt; layout-&gt;cnt; i++) {</div><div class='del'>-                        err = layout-&gt;list[i].err;</div><div class='del'>-                        if (err == ENOSPC) {</div><div class='del'>-                                layout-&gt;list[i].err = -1;</div><div class='del'>-                                cnt++;</div><div class='del'>-                        }</div><div class='add'>+dht_layout_range_swap(dht_layout_t *layout, int i, int j);</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+ * It's a bit icky using local variables in a macro, but it makes the rest</div><div class='add'>+ * of the code a lot clearer.</div><div class='add'>+ */</div><div class='add'>+#define OV_ENTRY(x, y) table[x * new-&gt;cnt + y]</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+dht_selfheal_layout_maximize_overlap(call_frame_t *frame, loc_t *loc,</div><div class='add'>+                                     dht_layout_t *new, dht_layout_t *old)</div><div class='add'>+{</div><div class='add'>+    int i = 0;</div><div class='add'>+    int j = 0;</div><div class='add'>+    uint32_t curr_overlap = 0;</div><div class='add'>+    uint32_t max_overlap = 0;</div><div class='add'>+    int max_overlap_idx = -1;</div><div class='add'>+    uint32_t overlap = 0;</div><div class='add'>+    uint32_t *table = NULL;</div><div class='add'>+</div><div class='add'>+    dht_layout_sort_volname(old);</div><div class='add'>+    /* Now both old_layout-&gt;list[] and new_layout-&gt;list[]</div><div class='add'>+       are match the same xlators/subvolumes. i.e,</div><div class='add'>+       old_layout-&gt;[i] and new_layout-&gt;[i] are referring</div><div class='add'>+       to the same subvolumes</div><div class='add'>+    */</div><div class='add'>+</div><div class='add'>+    /* Build a table of overlaps between new[i] and old[j]. */</div><div class='add'>+    table = alloca(sizeof(overlap) * old-&gt;cnt * new-&gt;cnt);</div><div class='add'>+    if (!table) {</div><div class='add'>+        return;</div><div class='add'>+    }</div><div class='add'>+    memset(table, 0, sizeof(overlap) * old-&gt;cnt * new-&gt;cnt);</div><div class='add'>+    for (i = 0; i &lt; new-&gt;cnt; ++i) {</div><div class='add'>+        for (j = 0; j &lt; old-&gt;cnt; ++j) {</div><div class='add'>+            OV_ENTRY(i, j) = dht_overlap_calc(old, j, new, i);</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; new-&gt;cnt; i++) {</div><div class='add'>+        if (new-&gt;list[i].err &gt; 0) {</div><div class='add'>+            /* Subvol might be marked for decommission</div><div class='add'>+               with EINVAL, or some other serious error</div><div class='add'>+               marked with positive errno.</div><div class='add'>+            */</div><div class='add'>+            continue;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        max_overlap = 0;</div><div class='add'>+        max_overlap_idx = i;</div><div class='add'>+        for (j = (i + 1); j &lt; new-&gt;cnt; ++j) {</div><div class='add'>+            if (new-&gt;list[j].err &gt; 0) {</div><div class='add'>+                /* Subvol might be marked for decommission</div><div class='add'>+                with EINVAL, or some other serious error</div><div class='add'>+                marked with positive errno.</div><div class='add'>+                */</div><div class='add'>+                continue;</div><div class='add'>+            }</div><div class='add'>+            /* Calculate the overlap now. */</div><div class='add'>+            curr_overlap = OV_ENTRY(i, i) + OV_ENTRY(j, j);</div><div class='add'>+            /* Calculate the overlap after the proposed swap. */</div><div class='add'>+            overlap = OV_ENTRY(i, j) + OV_ENTRY(j, i);</div><div class='add'>+            /* Are we better than status quo? */</div><div class='add'>+            if (overlap &gt; curr_overlap) {</div><div class='add'>+                overlap -= curr_overlap;</div><div class='add'>+                /* Are we better than the previous choice? */</div><div class='add'>+                if (overlap &gt; max_overlap) {</div><div class='add'>+                    max_overlap = overlap;</div><div class='add'>+                    max_overlap_idx = j;</div><div class='ctx'>                 }</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        if (max_overlap_idx != i) {</div><div class='add'>+            dht_layout_range_swap(new, i, max_overlap_idx);</div><div class='add'>+            /* Need to swap the table values too. */</div><div class='add'>+            for (j = 0; j &lt; old-&gt;cnt; ++j) {</div><div class='add'>+                overlap = OV_ENTRY(i, j);</div><div class='add'>+                OV_ENTRY(i, j) = OV_ENTRY(max_overlap_idx, j);</div><div class='add'>+                OV_ENTRY(max_overlap_idx, j) = overlap;</div><div class='add'>+            }</div><div class='ctx'>         }</div><div class='add'>+    }</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	chunk = ((unsigned long) 0xffffffff) / ((cnt) ? cnt : 1);</div><div class='del'>-</div><div class='del'>-	start_subvol = dht_selfheal_layout_alloc_start (this, loc, layout);</div><div class='del'>-</div><div class='del'>-	for (i = start_subvol; i &lt; layout-&gt;cnt; i++) {</div><div class='del'>-		err = layout-&gt;list[i].err;</div><div class='del'>-		if (err == -1) {</div><div class='del'>-			layout-&gt;list[i].start = start;</div><div class='del'>-			layout-&gt;list[i].stop  = start + chunk - 1;</div><div class='del'>-			</div><div class='del'>-			start = start + chunk;</div><div class='del'>-</div><div class='del'>-			gf_log (this-&gt;name, GF_LOG_TRACE,</div><div class='del'>-				"gave fix: %u - %u on %s for %s",</div><div class='del'>-				layout-&gt;list[i].start, layout-&gt;list[i].stop,</div><div class='del'>-				layout-&gt;list[i].xlator-&gt;name, loc-&gt;path);</div><div class='del'>-			if (--cnt == 0) {</div><div class='del'>-				layout-&gt;list[i].stop = 0xffffffff;</div><div class='del'>-				break;</div><div class='del'>-			}</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	for (i = 0; i &lt; start_subvol; i++) {</div><div class='del'>-		err = layout-&gt;list[i].err;</div><div class='del'>-		if (err == -1) {</div><div class='del'>-			layout-&gt;list[i].start = start;</div><div class='del'>-			layout-&gt;list[i].stop  = start + chunk - 1;</div><div class='del'>-			</div><div class='del'>-			start = start + chunk;</div><div class='del'>-</div><div class='del'>-			gf_log (this-&gt;name, GF_LOG_TRACE,</div><div class='del'>-				"gave fix: %u - %u on %s for %s",</div><div class='del'>-				layout-&gt;list[i].start, layout-&gt;list[i].stop,</div><div class='del'>-				layout-&gt;list[i].xlator-&gt;name, loc-&gt;path);</div><div class='del'>-			if (--cnt == 0) {</div><div class='del'>-				layout-&gt;list[i].stop = 0xffffffff;</div><div class='del'>-				break;</div><div class='del'>-			}</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='add'>+static dht_layout_t *</div><div class='add'>+dht_fix_layout_of_directory(call_frame_t *frame, loc_t *loc,</div><div class='add'>+                            dht_layout_t *layout)</div><div class='add'>+{</div><div class='add'>+    int i = 0;</div><div class='add'>+    xlator_t *this = NULL;</div><div class='add'>+    dht_layout_t *new_layout = NULL;</div><div class='add'>+    dht_conf_t *priv = NULL;</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    uint32_t subvol_down = 0;</div><div class='add'>+    gf_boolean_t maximize_overlap = _gf_true;</div><div class='add'>+    char gfid[GF_UUID_BUF_SIZE] = {0};</div><div class='add'>+</div><div class='add'>+    this = frame-&gt;this;</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+</div><div class='add'>+    if (layout-&gt;type == DHT_HASH_TYPE_DM_USER) {</div><div class='add'>+        gf_msg_debug(THIS-&gt;name, 0, "leaving %s alone", loc-&gt;path);</div><div class='add'>+        goto done;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    new_layout = dht_layout_new(this, priv-&gt;subvolume_cnt);</div><div class='add'>+    if (!new_layout) {</div><div class='add'>+        gf_uuid_unparse(loc-&gt;gfid, gfid);</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_ERROR, ENOMEM, DHT_MSG_MEM_ALLOC_FAILED,</div><div class='add'>+                "new_layout, path=%s", loc-&gt;path, "gfid=%s", gfid, NULL);</div><div class='add'>+        goto done;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* If a subvolume is down, do not re-write the layout. */</div><div class='add'>+    dht_layout_anomalies(this, loc, layout, NULL, NULL, NULL, &amp;subvol_down,</div><div class='add'>+                         NULL, NULL);</div><div class='add'>+</div><div class='add'>+    if (subvol_down) {</div><div class='add'>+        gf_uuid_unparse(loc-&gt;gfid, gfid);</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_WARNING, 0, DHT_MSG_LAYOUT_FIX_FAILED,</div><div class='add'>+                "subvol-down=%u", subvol_down, "Skipping-fix-layout", "path=%s",</div><div class='add'>+                loc-&gt;path, "gfid=%s", gfid, NULL);</div><div class='add'>+        GF_FREE(new_layout);</div><div class='add'>+        return NULL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; new_layout-&gt;cnt; i++) {</div><div class='add'>+        if (layout-&gt;list[i].err != ENOSPC)</div><div class='add'>+            new_layout-&gt;list[i].err = layout-&gt;list[i].err;</div><div class='add'>+        else</div><div class='add'>+            new_layout-&gt;list[i].err = -1;</div><div class='add'>+</div><div class='add'>+        new_layout-&gt;list[i].xlator = layout-&gt;list[i].xlator;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    new_layout-&gt;commit_hash = layout-&gt;commit_hash;</div><div class='add'>+</div><div class='add'>+    if (priv-&gt;du_stats) {</div><div class='add'>+        for (i = 0; i &lt; priv-&gt;subvolume_cnt; ++i) {</div><div class='add'>+            gf_smsg(this-&gt;name, GF_LOG_DEBUG, 0, DHT_MSG_SUBVOL_INFO,</div><div class='add'>+                    "index=%d", i, "name=%s", priv-&gt;subvolumes[i]-&gt;name,</div><div class='add'>+                    "chunks=%u", priv-&gt;du_stats[i].chunks, "path=%s", loc-&gt;path,</div><div class='add'>+                    NULL);</div><div class='add'>+</div><div class='add'>+            /* Maximize overlap if the bricks are all the same</div><div class='add'>+             *  size.</div><div class='add'>+             * This is probably not going to be very common on</div><div class='add'>+             * live setups but will benefit our regression tests</div><div class='add'>+             */</div><div class='add'>+            if (i &amp;&amp; (priv-&gt;du_stats[i].chunks != priv-&gt;du_stats[0].chunks)) {</div><div class='add'>+                maximize_overlap = _gf_false;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+    } else {</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_WARNING, 0, DHT_MSG_NO_DISK_USAGE_STATUS,</div><div class='add'>+                NULL);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* First give it a layout as though it is a new directory. This</div><div class='add'>+       ensures rotation to kick in */</div><div class='add'>+    dht_layout_sort_volname(new_layout);</div><div class='add'>+    dht_selfheal_layout_new_directory(frame, loc, new_layout);</div><div class='add'>+</div><div class='add'>+    /* Maximize overlap if weighted-rebalance is disabled */</div><div class='add'>+    if (!priv-&gt;do_weighting)</div><div class='add'>+        maximize_overlap = _gf_true;</div><div class='add'>+</div><div class='add'>+    /* Now selectively re-assign ranges only when it helps */</div><div class='add'>+    if (maximize_overlap) {</div><div class='add'>+        dht_selfheal_layout_maximize_overlap(frame, loc, new_layout, layout);</div><div class='add'>+    }</div><div class='add'>+done:</div><div class='add'>+    if (new_layout) {</div><div class='add'>+        /* Make sure the extra 'ref' for existing layout is removed */</div><div class='add'>+        dht_layout_unref(this, local-&gt;layout);</div><div class='add'>+</div><div class='add'>+        local-&gt;layout = new_layout;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return local-&gt;layout;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+/*</div><div class='add'>+ * Having to call this 2x for each entry in the layout is pretty horrible, but</div><div class='add'>+ * that's what all of this layout-sorting nonsense gets us.</div><div class='add'>+ */</div><div class='add'>+static uint32_t</div><div class='add'>+dht_get_chunks_from_xl(xlator_t *parent, xlator_t *child)</div><div class='add'>+{</div><div class='add'>+    dht_conf_t *priv = parent-&gt;private;</div><div class='add'>+    xlator_list_t *trav;</div><div class='add'>+    uint32_t index = 0;</div><div class='add'>+</div><div class='add'>+    if (!priv-&gt;du_stats) {</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-dht_selfheal_dir_getafix (call_frame_t *frame, loc_t *loc,</div><div class='del'>-			  dht_layout_t *layout)</div><div class='del'>-{</div><div class='del'>-	dht_conf_t  *conf = NULL;</div><div class='del'>-	xlator_t    *this = NULL;</div><div class='del'>-	dht_local_t *local = NULL;</div><div class='del'>-	int          missing = -1;</div><div class='del'>-	int          down = -1;</div><div class='del'>-	int          holes = -1;</div><div class='del'>-	int          ret = -1;</div><div class='del'>-	int          i = -1;</div><div class='del'>-	int          overlaps = -1;</div><div class='del'>-</div><div class='del'>-	this = frame-&gt;this;</div><div class='del'>-	conf = this-&gt;private;</div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-</div><div class='del'>-	missing = local-&gt;selfheal.missing;</div><div class='del'>-	down = local-&gt;selfheal.down;</div><div class='del'>-	holes = local-&gt;selfheal.hole_cnt;</div><div class='del'>-	overlaps = local-&gt;selfheal.overlaps_cnt;</div><div class='del'>-</div><div class='del'>-	if ((missing + down) == conf-&gt;subvolume_cnt) {</div><div class='del'>-		dht_selfheal_layout_new_directory (frame, loc, layout);</div><div class='del'>-		ret = 0;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	if (holes &lt;= down) {</div><div class='del'>-		/* the down subvol might fill up the holes */</div><div class='del'>-		ret = 0;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	if (holes || overlaps) {</div><div class='del'>-		dht_selfheal_layout_new_directory (frame, loc, layout);</div><div class='del'>-		ret = 0;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	for (i = 0; i &lt; layout-&gt;cnt; i++) {</div><div class='del'>-		/* directory not present */</div><div class='del'>-		if (layout-&gt;list[i].err == ENOENT) {</div><div class='del'>-			ret = 0;</div><div class='del'>-			break;</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	/* TODO: give a fix to these non-virgins */</div><div class='del'>-</div><div class='del'>-	return ret;</div><div class='add'>+    for (trav = parent-&gt;children; trav; trav = trav-&gt;next) {</div><div class='add'>+        if (trav-&gt;xlator == child) {</div><div class='add'>+            return priv-&gt;du_stats[index].chunks;</div><div class='add'>+        }</div><div class='add'>+        ++index;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+dht_selfheal_layout_new_directory(call_frame_t *frame, loc_t *loc,</div><div class='add'>+                                  dht_layout_t *layout)</div><div class='add'>+{</div><div class='add'>+    xlator_t *this = NULL;</div><div class='add'>+    double chunk = 0;</div><div class='add'>+    int i = 0;</div><div class='add'>+    uint32_t start = 0;</div><div class='add'>+    int bricks_to_use = 0;</div><div class='add'>+    int err = 0;</div><div class='add'>+    int start_subvol = 0;</div><div class='add'>+    uint32_t curr_size;</div><div class='add'>+    uint32_t range_size;</div><div class='add'>+    uint64_t total_size = 0;</div><div class='add'>+    int real_i;</div><div class='add'>+    dht_conf_t *priv;</div><div class='add'>+    gf_boolean_t weight_by_size;</div><div class='add'>+    int bricks_used = 0;</div><div class='add'>+</div><div class='add'>+    this = frame-&gt;this;</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+    weight_by_size = priv-&gt;do_weighting;</div><div class='add'>+</div><div class='add'>+    bricks_to_use = dht_get_layout_count(this, layout, 1);</div><div class='add'>+    GF_ASSERT(bricks_to_use &gt; 0);</div><div class='add'>+</div><div class='add'>+    bricks_used = 0;</div><div class='add'>+    for (i = 0; i &lt; layout-&gt;cnt; ++i) {</div><div class='add'>+        err = layout-&gt;list[i].err;</div><div class='add'>+        if ((err != -1) &amp;&amp; (err != ENOENT)) {</div><div class='add'>+            continue;</div><div class='add'>+        }</div><div class='add'>+        curr_size = dht_get_chunks_from_xl(this, layout-&gt;list[i].xlator);</div><div class='add'>+        if (!curr_size) {</div><div class='add'>+            weight_by_size = _gf_false;</div><div class='add'>+            break;</div><div class='add'>+        }</div><div class='add'>+        total_size += curr_size;</div><div class='add'>+        if (++bricks_used &gt;= bricks_to_use) {</div><div class='add'>+            break;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (weight_by_size &amp;&amp; total_size) {</div><div class='add'>+        /* We know total_size is not zero. */</div><div class='add'>+        chunk = ((double)0xffffffff) / ((double)total_size);</div><div class='add'>+        gf_msg_debug(this-&gt;name, 0,</div><div class='add'>+                     "chunk size = 0xffffffff / %" PRIu64 " = %f", total_size,</div><div class='add'>+                     chunk);</div><div class='add'>+    } else {</div><div class='add'>+        weight_by_size = _gf_false;</div><div class='add'>+        chunk = ((unsigned long)0xffffffff) / bricks_to_use;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    start_subvol = dht_selfheal_layout_alloc_start(this, loc, layout);</div><div class='add'>+</div><div class='add'>+    /* clear out the range, as we are re-computing here */</div><div class='add'>+    DHT_RESET_LAYOUT_RANGE(layout);</div><div class='add'>+</div><div class='add'>+    /*</div><div class='add'>+     * OK, what's this "real_i" stuff about?  This used to be two loops -</div><div class='add'>+     * from start_subvol to layout-&gt;cnt-1, then from 0 to start_subvol-1.</div><div class='add'>+     * That way is practically an open invitation to bugs when only one</div><div class='add'>+     * of the loops is updated.  Using real_i and modulo operators to make</div><div class='add'>+     * it one loop avoids this problem.  Remember, folks: it's everyone's</div><div class='add'>+     * responsibility to help stamp out copy/paste abuse.</div><div class='add'>+     */</div><div class='add'>+    bricks_used = 0;</div><div class='add'>+    for (real_i = 0; real_i &lt; layout-&gt;cnt; real_i++) {</div><div class='add'>+        i = (real_i + start_subvol) % layout-&gt;cnt;</div><div class='add'>+        err = layout-&gt;list[i].err;</div><div class='add'>+        if ((err != -1) &amp;&amp; (err != ENOENT)) {</div><div class='add'>+            continue;</div><div class='add'>+        }</div><div class='add'>+        if (weight_by_size) {</div><div class='add'>+            curr_size = dht_get_chunks_from_xl(this, layout-&gt;list[i].xlator);</div><div class='add'>+            if (!curr_size) {</div><div class='add'>+                continue;</div><div class='add'>+            }</div><div class='add'>+        } else {</div><div class='add'>+            curr_size = 1;</div><div class='add'>+        }</div><div class='add'>+        range_size = chunk * curr_size;</div><div class='add'>+        gf_msg_debug(this-&gt;name, 0, "assigning range size 0x%x to %s",</div><div class='add'>+                     range_size, layout-&gt;list[i].xlator-&gt;name);</div><div class='add'>+        DHT_SET_LAYOUT_RANGE(layout, i, start, range_size, loc-&gt;path);</div><div class='add'>+        if (++bricks_used &gt;= bricks_to_use) {</div><div class='add'>+            layout-&gt;list[i].stop = 0xffffffff;</div><div class='add'>+            goto done;</div><div class='add'>+        }</div><div class='add'>+        start += range_size;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+done:</div><div class='add'>+    return;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+dht_selfheal_dir_getafix(call_frame_t *frame, loc_t *loc, dht_layout_t *layout)</div><div class='add'>+{</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    uint32_t holes = 0;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int i = -1;</div><div class='add'>+    uint32_t overlaps = 0;</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+</div><div class='add'>+    holes = local-&gt;selfheal.hole_cnt;</div><div class='add'>+    overlaps = local-&gt;selfheal.overlaps_cnt;</div><div class='add'>+</div><div class='add'>+    if (holes || overlaps) {</div><div class='add'>+        /* If the layout has anomalies which would change the hash</div><div class='add'>+         * ranges, then we need to reset the commit_hash for this</div><div class='add'>+         * directory, as the layout would change and things may not</div><div class='add'>+         * be in place as expected */</div><div class='add'>+        layout-&gt;commit_hash = DHT_LAYOUT_HASH_INVALID;</div><div class='add'>+        dht_selfheal_layout_new_directory(frame, loc, layout);</div><div class='add'>+        ret = 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; layout-&gt;cnt; i++) {</div><div class='add'>+        /* directory not present */</div><div class='add'>+        if (layout-&gt;list[i].err == ENOENT) {</div><div class='add'>+            ret = 0;</div><div class='add'>+            break;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* TODO: give a fix to these non-virgins */</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-dht_selfheal_new_directory (call_frame_t *frame, </div><div class='del'>-			    dht_selfheal_dir_cbk_t dir_cbk,</div><div class='del'>-			    dht_layout_t *layout)</div><div class='add'>+dht_selfheal_new_directory(call_frame_t *frame, dht_selfheal_dir_cbk_t dir_cbk,</div><div class='add'>+                           dht_layout_t *layout)</div><div class='ctx'> {</div><div class='del'>-	dht_local_t *local = NULL;</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    inode_t *linked_inode = NULL, *inode = NULL;</div><div class='add'>+    loc_t *loc = NULL;</div><div class='add'>+    char pgfid[GF_UUID_BUF_SIZE] = {0};</div><div class='add'>+    char gfid[GF_UUID_BUF_SIZE] = {0};</div><div class='add'>+    int32_t op_errno = EIO;</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+</div><div class='add'>+    loc = &amp;local-&gt;loc;</div><div class='add'>+</div><div class='add'>+    gf_uuid_unparse(local-&gt;stbuf.ia_gfid, gfid);</div><div class='add'>+    gf_uuid_unparse(loc-&gt;parent-&gt;gfid, pgfid);</div><div class='add'>+</div><div class='add'>+    linked_inode = inode_link(loc-&gt;inode, loc-&gt;parent, loc-&gt;name,</div><div class='add'>+                              &amp;local-&gt;stbuf);</div><div class='add'>+    if (!linked_inode) {</div><div class='add'>+        gf_smsg(frame-&gt;this-&gt;name, GF_LOG_WARNING, 0, DHT_MSG_LINK_INODE_FAILED,</div><div class='add'>+                "pgfid=%s", pgfid, "name=%s", loc-&gt;name, "gfid=%s", gfid, NULL);</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	local = frame-&gt;local;</div><div class='add'>+    inode = loc-&gt;inode;</div><div class='add'>+    loc-&gt;inode = linked_inode;</div><div class='add'>+    inode_unref(inode);</div><div class='ctx'> </div><div class='del'>-	local-&gt;selfheal.dir_cbk = dir_cbk;</div><div class='del'>-	local-&gt;selfheal.layout = dht_layout_ref (frame-&gt;this, layout);</div><div class='add'>+    local-&gt;selfheal.dir_cbk = dir_cbk;</div><div class='add'>+    local-&gt;selfheal.layout = dht_layout_ref(frame-&gt;this, layout);</div><div class='ctx'> </div><div class='del'>-	dht_layout_sort_volname (layout);</div><div class='del'>-	dht_selfheal_layout_new_directory (frame, &amp;local-&gt;loc, layout);</div><div class='del'>-	dht_selfheal_dir_xattr (frame, &amp;local-&gt;loc, layout);</div><div class='del'>-	return 0;</div><div class='add'>+    dht_layout_sort_volname(layout);</div><div class='add'>+    dht_selfheal_layout_new_directory(frame, &amp;local-&gt;loc, layout);</div><div class='add'>+</div><div class='add'>+    op_errno = ENOMEM;</div><div class='add'>+    ret = dht_selfheal_layout_lock(frame, layout, _gf_true,</div><div class='add'>+                                   dht_selfheal_dir_xattr,</div><div class='add'>+                                   dht_should_heal_layout);</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        dir_cbk(frame, NULL, frame-&gt;this, -1, op_errno, NULL);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+int</div><div class='add'>+dht_fix_directory_layout(call_frame_t *frame, dht_selfheal_dir_cbk_t dir_cbk,</div><div class='add'>+                         dht_layout_t *layout)</div><div class='add'>+{</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    dht_layout_t *tmp_layout = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+</div><div class='add'>+    local-&gt;selfheal.dir_cbk = dir_cbk;</div><div class='add'>+    local-&gt;selfheal.layout = dht_layout_ref(frame-&gt;this, layout);</div><div class='add'>+</div><div class='add'>+    /* No layout sorting required here */</div><div class='add'>+    tmp_layout = dht_fix_layout_of_directory(frame, &amp;local-&gt;loc, layout);</div><div class='add'>+    if (!tmp_layout) {</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dht_selfheal_layout_lock(frame, tmp_layout, _gf_false,</div><div class='add'>+                                   dht_fix_dir_xattr, dht_should_fix_layout);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-dht_selfheal_directory (call_frame_t *frame, dht_selfheal_dir_cbk_t dir_cbk,</div><div class='del'>-			loc_t *loc, dht_layout_t *layout)</div><div class='del'>-{</div><div class='del'>-	dht_local_t *local    = NULL;</div><div class='del'>-	uint32_t     holes    = 0;</div><div class='del'>-	uint32_t     down     = 0;</div><div class='del'>-	uint32_t     misc     = 0;</div><div class='del'>-	int          ret      = 0;</div><div class='del'>-	xlator_t    *this     = NULL;</div><div class='del'>-</div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-	this = frame-&gt;this;</div><div class='del'>-</div><div class='del'>-	dht_layout_anomalies (this, loc, layout,</div><div class='del'>-                              &amp;local-&gt;selfheal.hole_cnt,</div><div class='del'>-                              &amp;local-&gt;selfheal.overlaps_cnt,</div><div class='del'>-                              &amp;local-&gt;selfheal.missing,</div><div class='del'>-                              &amp;local-&gt;selfheal.down,</div><div class='del'>-                              &amp;local-&gt;selfheal.misc);</div><div class='del'>-</div><div class='del'>-	holes    = local-&gt;selfheal.hole_cnt;</div><div class='del'>-	down     = local-&gt;selfheal.down;</div><div class='del'>-	misc     = local-&gt;selfheal.misc;</div><div class='del'>-</div><div class='del'>-	local-&gt;selfheal.dir_cbk = dir_cbk;</div><div class='del'>-	local-&gt;selfheal.layout = dht_layout_ref (this, layout);</div><div class='del'>-</div><div class='del'>-	if (down) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-			"%d subvolumes down -- not fixing", down);</div><div class='del'>-		ret = 0;</div><div class='del'>-		goto sorry_no_fix;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	if (misc) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-			"%d subvolumes have unrecoverable errors", misc);</div><div class='del'>-		ret = 0;</div><div class='del'>-		goto sorry_no_fix;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	dht_layout_sort_volname (layout);</div><div class='del'>-	ret = dht_selfheal_dir_getafix (frame, loc, layout);</div><div class='del'>-</div><div class='del'>-	if (ret == -1) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-			"not able to form layout for the directory");</div><div class='del'>-		goto sorry_no_fix;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	dht_selfheal_dir_mkdir (frame, loc, layout, 0);</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='add'>+dht_selfheal_directory(call_frame_t *frame, dht_selfheal_dir_cbk_t dir_cbk,</div><div class='add'>+                       loc_t *loc, dht_layout_t *layout)</div><div class='add'>+{</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    xlator_t *this = NULL;</div><div class='add'>+    uint32_t down = 0;</div><div class='add'>+    uint32_t misc = 0;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    char pgfid[GF_UUID_BUF_SIZE] = {0};</div><div class='add'>+    char gfid[GF_UUID_BUF_SIZE] = {0};</div><div class='add'>+    inode_t *linked_inode = NULL, *inode = NULL;</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    this = frame-&gt;this;</div><div class='add'>+</div><div class='add'>+    local-&gt;selfheal.dir_cbk = dir_cbk;</div><div class='add'>+    local-&gt;selfheal.layout = dht_layout_ref(this, layout);</div><div class='add'>+</div><div class='add'>+    if (local-&gt;need_attrheal) {</div><div class='add'>+        if (__is_root_gfid(local-&gt;stbuf.ia_gfid)) {</div><div class='add'>+            local-&gt;stbuf.ia_gid = local-&gt;prebuf.ia_gid;</div><div class='add'>+            local-&gt;stbuf.ia_uid = local-&gt;prebuf.ia_uid;</div><div class='add'>+</div><div class='add'>+            local-&gt;stbuf.ia_ctime = local-&gt;prebuf.ia_ctime;</div><div class='add'>+            local-&gt;stbuf.ia_ctime_nsec = local-&gt;prebuf.ia_ctime_nsec;</div><div class='add'>+            local-&gt;stbuf.ia_prot = local-&gt;prebuf.ia_prot;</div><div class='add'>+</div><div class='add'>+        } else if (!IA_ISINVAL(local-&gt;mds_stbuf.ia_type)) {</div><div class='add'>+            local-&gt;stbuf = local-&gt;mds_stbuf;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (!__is_root_gfid(local-&gt;stbuf.ia_gfid)) {</div><div class='add'>+        gf_uuid_unparse(local-&gt;stbuf.ia_gfid, gfid);</div><div class='add'>+        gf_uuid_unparse(loc-&gt;parent-&gt;gfid, pgfid);</div><div class='add'>+</div><div class='add'>+        linked_inode = inode_link(loc-&gt;inode, loc-&gt;parent, loc-&gt;name,</div><div class='add'>+                                  &amp;local-&gt;stbuf);</div><div class='add'>+        if (!linked_inode) {</div><div class='add'>+            gf_smsg(this-&gt;name, GF_LOG_WARNING, 0, DHT_MSG_LINK_INODE_FAILED,</div><div class='add'>+                    "pgfid=%s", pgfid, "name=%s", loc-&gt;name, "gfid=%s", gfid,</div><div class='add'>+                    NULL);</div><div class='add'>+            ret = 0;</div><div class='add'>+            goto sorry_no_fix;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        inode = loc-&gt;inode;</div><div class='add'>+        loc-&gt;inode = linked_inode;</div><div class='add'>+        inode_unref(inode);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (local-&gt;need_xattr_heal &amp;&amp; (local-&gt;mds_xattr)) {</div><div class='add'>+        dht_dir_set_heal_xattr(this, local, local-&gt;xattr, local-&gt;mds_xattr,</div><div class='add'>+                               NULL, NULL);</div><div class='add'>+        dict_unref(local-&gt;mds_xattr);</div><div class='add'>+        local-&gt;mds_xattr = NULL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    dht_layout_anomalies(this, loc, layout, &amp;local-&gt;selfheal.hole_cnt,</div><div class='add'>+                         &amp;local-&gt;selfheal.overlaps_cnt,</div><div class='add'>+                         &amp;local-&gt;selfheal.missing_cnt, &amp;local-&gt;selfheal.down,</div><div class='add'>+                         &amp;local-&gt;selfheal.misc, NULL);</div><div class='add'>+</div><div class='add'>+    down = local-&gt;selfheal.down;</div><div class='add'>+    misc = local-&gt;selfheal.misc;</div><div class='add'>+</div><div class='add'>+    if (down) {</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_WARNING, 0, DHT_MSG_SELFHEAL_FAILED,</div><div class='add'>+                "path=%s", loc-&gt;path, "subvol-down=%d", down, "Not-fixing",</div><div class='add'>+                "gfid=%s", gfid, NULL);</div><div class='add'>+        ret = 0;</div><div class='add'>+        goto sorry_no_fix;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (misc) {</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_WARNING, 0, DHT_MSG_SELFHEAL_FAILED,</div><div class='add'>+                "path=%s", loc-&gt;path, "misc=%d", misc, "unrecoverable-errors",</div><div class='add'>+                "gfid=%s", gfid, NULL);</div><div class='add'>+</div><div class='add'>+        ret = 0;</div><div class='add'>+        goto sorry_no_fix;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    dht_layout_sort_volname(layout);</div><div class='add'>+    local-&gt;heal_layout = _gf_true;</div><div class='add'>+</div><div class='add'>+    /* Ignore return value as it can be inferred from result of</div><div class='add'>+     * dht_layout_anomalies</div><div class='add'>+     */</div><div class='add'>+    dht_selfheal_dir_getafix(frame, loc, layout);</div><div class='add'>+</div><div class='add'>+    if (!(local-&gt;selfheal.hole_cnt || local-&gt;selfheal.overlaps_cnt ||</div><div class='add'>+          local-&gt;selfheal.missing_cnt)) {</div><div class='add'>+        local-&gt;heal_layout = _gf_false;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dht_selfheal_dir_mkdir(frame, loc, layout, 0);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        ret = 0;</div><div class='add'>+        goto sorry_no_fix;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='ctx'> </div><div class='ctx'> sorry_no_fix:</div><div class='del'>-	/* TODO: need to put appropriate local-&gt;op_errno */</div><div class='del'>-	dht_selfheal_dir_finish (frame, this, ret);</div><div class='add'>+    /* TODO: need to put appropriate local-&gt;op_errno */</div><div class='add'>+    dht_selfheal_dir_finish(frame, this, ret, 1);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+dht_selfheal_restore(call_frame_t *frame, dht_selfheal_dir_cbk_t dir_cbk,</div><div class='add'>+                     loc_t *loc, dht_layout_t *layout)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+</div><div class='add'>+    local-&gt;selfheal.dir_cbk = dir_cbk;</div><div class='add'>+    local-&gt;selfheal.layout = dht_layout_ref(frame-&gt;this, layout);</div><div class='add'>+</div><div class='add'>+    ret = dht_selfheal_dir_mkdir(frame, loc, layout, 1);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+dht_dir_heal_xattrs(void *data)</div><div class='add'>+{</div><div class='add'>+    call_frame_t *frame = NULL;</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    xlator_t *subvol = NULL;</div><div class='add'>+    xlator_t *mds_subvol = NULL;</div><div class='add'>+    xlator_t *this = NULL;</div><div class='add'>+    dht_conf_t *conf = NULL;</div><div class='add'>+    dict_t *user_xattr = NULL;</div><div class='add'>+    dict_t *internal_xattr = NULL;</div><div class='add'>+    dict_t *mds_xattr = NULL;</div><div class='add'>+    dict_t *xdata = NULL;</div><div class='add'>+    int call_cnt = 0;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int uret = 0;</div><div class='add'>+    int uflag = 0;</div><div class='add'>+    int i = 0;</div><div class='add'>+    int xattr_hashed = 0;</div><div class='add'>+    char gfid[GF_UUID_BUF_SIZE] = {0};</div><div class='add'>+    int32_t allzero[1] = {0};</div><div class='add'>+</div><div class='add'>+    GF_VALIDATE_OR_GOTO("dht", data, out);</div><div class='add'>+</div><div class='add'>+    frame = data;</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    this = frame-&gt;this;</div><div class='add'>+    GF_VALIDATE_OR_GOTO("dht", this, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, local, out);</div><div class='add'>+    mds_subvol = local-&gt;mds_subvol;</div><div class='add'>+    conf = this-&gt;private;</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, conf, out);</div><div class='add'>+    gf_uuid_unparse(local-&gt;loc.gfid, gfid);</div><div class='add'>+</div><div class='add'>+    if (!mds_subvol) {</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_WARNING, 0, DHT_MSG_NO_MDS_SUBVOL, "path=%s",</div><div class='add'>+                local-&gt;loc.path, "gfid=%s", gfid, NULL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if ((local-&gt;loc.inode &amp;&amp; gf_uuid_is_null(local-&gt;loc.inode-&gt;gfid)) ||</div><div class='add'>+        gf_uuid_is_null(local-&gt;loc.gfid)) {</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_WARNING, 0, DHT_MSG_GFID_NOT_PRESENT,</div><div class='add'>+                "skip-heal path=%s", local-&gt;loc.path, "gfid=%s", gfid, NULL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    internal_xattr = dict_new();</div><div class='add'>+    if (!internal_xattr) {</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_ERROR, 0, DHT_MSG_CREATE_FAILED,</div><div class='add'>+                "dictionary", NULL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    xdata = dict_new();</div><div class='add'>+    if (!xdata) {</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_ERROR, 0, DHT_MSG_CREATE_FAILED,</div><div class='add'>+                "dictionary", NULL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    call_cnt = conf-&gt;subvolume_cnt;</div><div class='add'>+</div><div class='add'>+    user_xattr = dict_new();</div><div class='add'>+    if (!user_xattr) {</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_ERROR, 0, DHT_MSG_CREATE_FAILED,</div><div class='add'>+                "dictionary", NULL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = syncop_listxattr(local-&gt;mds_subvol, &amp;local-&gt;loc, &amp;mds_xattr, NULL,</div><div class='add'>+                           NULL);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_ERROR, -ret, DHT_MSG_LIST_XATTRS_FAILED,</div><div class='add'>+                "path=%s", local-&gt;loc.path, "name=%s", local-&gt;mds_subvol-&gt;name,</div><div class='add'>+                NULL);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (!mds_xattr)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    dht_dir_set_heal_xattr(this, local, user_xattr, mds_xattr, &amp;uret, &amp;uflag);</div><div class='add'>+</div><div class='add'>+    /* To set quota related xattr need to set GLUSTERFS_INTERNAL_FOP_KEY</div><div class='add'>+     * key value to 1</div><div class='add'>+     */</div><div class='add'>+    if (dict_get(user_xattr, QUOTA_LIMIT_KEY) ||</div><div class='add'>+        dict_get(user_xattr, QUOTA_LIMIT_OBJECTS_KEY)) {</div><div class='add'>+        ret = dict_set_int32(xdata, GLUSTERFS_INTERNAL_FOP_KEY, 1);</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_smsg(this-&gt;name, GF_LOG_ERROR, 0, DHT_MSG_DICT_SET_FAILED,</div><div class='add'>+                    "key=%s", GLUSTERFS_INTERNAL_FOP_KEY, "path=%s",</div><div class='add'>+                    local-&gt;loc.path, NULL);</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    if (uret &lt;= 0 &amp;&amp; !uflag)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; call_cnt; i++) {</div><div class='add'>+        subvol = conf-&gt;subvolumes[i];</div><div class='add'>+        if (subvol == mds_subvol)</div><div class='add'>+            continue;</div><div class='add'>+        if (uret || uflag) {</div><div class='add'>+            /* Custom xattr heal is required - let posix handle it */</div><div class='add'>+            ret = dict_set_int8(xdata, "sync_backend_xattrs", _gf_true);</div><div class='add'>+            if (ret) {</div><div class='add'>+                gf_smsg(this-&gt;name, GF_LOG_WARNING, 0, DHT_MSG_DICT_SET_FAILED,</div><div class='add'>+                        "path=%s", local-&gt;loc.path, "key=%s",</div><div class='add'>+                        "sync_backend_xattrs", NULL);</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            ret = syncop_setxattr(subvol, &amp;local-&gt;loc, user_xattr, 0, xdata,</div><div class='add'>+                                  NULL);</div><div class='add'>+            if (ret) {</div><div class='add'>+                xattr_hashed = 1;</div><div class='add'>+                gf_smsg(this-&gt;name, GF_LOG_ERROR, -ret,</div><div class='add'>+                        DHT_MSG_DIR_XATTR_HEAL_FAILED,</div><div class='add'>+                        "set-user-xattr-failed path=%s", local-&gt;loc.path,</div><div class='add'>+                        "subvol=%s", subvol-&gt;name, "gfid=%s", gfid, NULL);</div><div class='add'>+            } else {</div><div class='add'>+                dict_del(xdata, "sync_backend_xattrs");</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    /* After heal all custom xattr reset internal MDS xattr to 0 */</div><div class='add'>+    if (!xattr_hashed) {</div><div class='add'>+        ret = dht_dict_set_array(internal_xattr, conf-&gt;mds_xattr_key, allzero,</div><div class='add'>+                                 1);</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_smsg(this-&gt;name, GF_LOG_WARNING, ENOMEM, DHT_MSG_DICT_SET_FAILED,</div><div class='add'>+                    "key=%s", conf-&gt;mds_xattr_key, "path=%s", local-&gt;loc.path,</div><div class='add'>+                    NULL);</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+        ret = syncop_setxattr(mds_subvol, &amp;local-&gt;loc, internal_xattr, 0, NULL,</div><div class='add'>+                              NULL);</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_smsg(this-&gt;name, GF_LOG_ERROR, -ret,</div><div class='add'>+                    DHT_MSG_DIR_XATTR_HEAL_FAILED, "path=%s", local-&gt;loc.path,</div><div class='add'>+                    "subvol=%s", mds_subvol-&gt;name, "gfid=%s", gfid, NULL);</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	return 0;</div><div class='add'>+out:</div><div class='add'>+    if (user_xattr)</div><div class='add'>+        dict_unref(user_xattr);</div><div class='add'>+    if (mds_xattr)</div><div class='add'>+        dict_unref(mds_xattr);</div><div class='add'>+    if (internal_xattr)</div><div class='add'>+        dict_unref(internal_xattr);</div><div class='add'>+    if (xdata)</div><div class='add'>+        dict_unref(xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+dht_dir_heal_xattrs_done(int ret, call_frame_t *sync_frame, void *data)</div><div class='add'>+{</div><div class='add'>+    DHT_STACK_DESTROY(sync_frame);</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+int</div><div class='add'>+dht_dir_attr_heal(void *data)</div><div class='add'>+{</div><div class='add'>+    call_frame_t *frame = NULL;</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    xlator_t *subvol = NULL;</div><div class='add'>+    xlator_t *mds_subvol = NULL;</div><div class='add'>+    xlator_t *this = NULL;</div><div class='add'>+    dht_conf_t *conf = NULL;</div><div class='add'>+    int call_cnt = 0;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int i = 0;</div><div class='add'>+    char gfid[GF_UUID_BUF_SIZE] = {0};</div><div class='add'>+</div><div class='add'>+    GF_VALIDATE_OR_GOTO("dht", data, out);</div><div class='add'>+</div><div class='add'>+    frame = data;</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    this = frame-&gt;this;</div><div class='add'>+    GF_VALIDATE_OR_GOTO("dht", this, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("dht", local, out);</div><div class='add'>+    conf = this-&gt;private;</div><div class='add'>+    GF_VALIDATE_OR_GOTO("dht", conf, out);</div><div class='add'>+</div><div class='add'>+    mds_subvol = local-&gt;mds_subvol;</div><div class='add'>+    call_cnt = conf-&gt;subvolume_cnt;</div><div class='add'>+</div><div class='add'>+    if (!__is_root_gfid(local-&gt;stbuf.ia_gfid) &amp;&amp; (!mds_subvol)) {</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_WARNING, 0, DHT_MSG_NO_MDS_SUBVOL, "path=%s",</div><div class='add'>+                local-&gt;loc.path, "gfid=%s", gfid, NULL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (!__is_root_gfid(local-&gt;stbuf.ia_gfid)) {</div><div class='add'>+        for (i = 0; i &lt; conf-&gt;subvolume_cnt; i++) {</div><div class='add'>+            if (conf-&gt;subvolumes[i] == mds_subvol) {</div><div class='add'>+                if (!conf-&gt;subvolume_status[i]) {</div><div class='add'>+                    gf_smsg(this-&gt;name, GF_LOG_ERROR, 0,</div><div class='add'>+                            DHT_MSG_MDS_DOWN_UNABLE_TO_SET, "path=%s",</div><div class='add'>+                            local-&gt;loc.path, "gfid=%s", gfid, NULL);</div><div class='add'>+                    goto out;</div><div class='add'>+                }</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; call_cnt; i++) {</div><div class='add'>+        subvol = conf-&gt;subvolumes[i];</div><div class='add'>+        if (!subvol || subvol == mds_subvol)</div><div class='add'>+            continue;</div><div class='add'>+        if (__is_root_gfid(local-&gt;stbuf.ia_gfid)) {</div><div class='add'>+            ret = syncop_setattr(</div><div class='add'>+                subvol, &amp;local-&gt;loc, &amp;local-&gt;stbuf,</div><div class='add'>+                (GF_SET_ATTR_UID | GF_SET_ATTR_GID | GF_SET_ATTR_MODE), NULL,</div><div class='add'>+                NULL, NULL, NULL);</div><div class='add'>+        } else {</div><div class='add'>+            ret = syncop_setattr(</div><div class='add'>+                subvol, &amp;local-&gt;loc, &amp;local-&gt;mds_stbuf,</div><div class='add'>+                (GF_SET_ATTR_UID | GF_SET_ATTR_GID | GF_SET_ATTR_MODE), NULL,</div><div class='add'>+                NULL, NULL, NULL);</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_uuid_unparse(local-&gt;loc.gfid, gfid);</div><div class='add'>+</div><div class='add'>+            gf_smsg(this-&gt;name, GF_LOG_ERROR, -ret,</div><div class='add'>+                    DHT_MSG_DIR_ATTR_HEAL_FAILED, "path=%s", local-&gt;loc.path,</div><div class='add'>+                    "subvol=%s", subvol-&gt;name, "gfid=%s", gfid, NULL);</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+out:</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-dht_selfheal_restore (call_frame_t *frame, dht_selfheal_dir_cbk_t dir_cbk,</div><div class='del'>-		      loc_t *loc, dht_layout_t *layout)</div><div class='add'>+dht_dir_attr_heal_done(int ret, call_frame_t *sync_frame, void *data)</div><div class='ctx'> {</div><div class='del'>-	int          ret = 0;</div><div class='del'>-	dht_local_t *local    = NULL;</div><div class='add'>+    DHT_STACK_DESTROY(sync_frame);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* EXIT: dht_update_commit_hash_for_layout */</div><div class='add'>+static int</div><div class='add'>+dht_update_commit_hash_for_layout_done(call_frame_t *frame, void *cookie,</div><div class='add'>+                                       xlator_t *this, int32_t op_ret,</div><div class='add'>+                                       int32_t op_errno, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+</div><div class='add'>+    /* preserve oldest error */</div><div class='add'>+    if (op_ret &amp;&amp; !local-&gt;op_ret) {</div><div class='add'>+        local-&gt;op_ret = op_ret;</div><div class='add'>+        local-&gt;op_errno = op_errno;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='add'>+    DHT_STACK_UNWIND(setxattr, frame, local-&gt;op_ret, local-&gt;op_errno, NULL);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+dht_update_commit_hash_for_layout_unlock(call_frame_t *frame, xlator_t *this)</div><div class='add'>+{</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+</div><div class='add'>+    ret = dht_unlock_inodelk(frame, local-&gt;lock[0].layout.my_layout.locks,</div><div class='add'>+                             local-&gt;lock[0].layout.my_layout.lk_count,</div><div class='add'>+                             dht_update_commit_hash_for_layout_done);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        /* preserve oldest error, just ... */</div><div class='add'>+        if (!local-&gt;op_ret) {</div><div class='add'>+            local-&gt;op_errno = errno;</div><div class='add'>+            local-&gt;op_ret = -1;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-	local = frame-&gt;local;</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_WARNING, errno, DHT_MSG_WIND_UNLOCK_FAILED,</div><div class='add'>+                "path=%s", local-&gt;loc.path, NULL);</div><div class='ctx'> </div><div class='del'>-	local-&gt;selfheal.dir_cbk = dir_cbk;</div><div class='del'>-	local-&gt;selfheal.layout = dht_layout_ref (frame-&gt;this, layout);</div><div class='add'>+        dht_update_commit_hash_for_layout_done(frame, NULL, this, 0, 0, NULL);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	ret = dht_selfheal_dir_mkdir (frame, loc, layout, 1);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+dht_update_commit_hash_for_layout_cbk(call_frame_t *frame, void *cookie,</div><div class='add'>+                                      xlator_t *this, int op_ret, int op_errno,</div><div class='add'>+                                      dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    int this_call_cnt = 0;</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;frame-&gt;lock);</div><div class='add'>+    /* store first failure, just because */</div><div class='add'>+    if (op_ret &amp;&amp; !local-&gt;op_ret) {</div><div class='add'>+        local-&gt;op_ret = op_ret;</div><div class='add'>+        local-&gt;op_errno = op_errno;</div><div class='add'>+    }</div><div class='add'>+    UNLOCK(&amp;frame-&gt;lock);</div><div class='add'>+</div><div class='add'>+    this_call_cnt = dht_frame_return(frame);</div><div class='add'>+</div><div class='add'>+    if (is_last_call(this_call_cnt)) {</div><div class='add'>+        dht_update_commit_hash_for_layout_unlock(frame, this);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+dht_update_commit_hash_for_layout_resume(call_frame_t *frame, void *cookie,</div><div class='add'>+                                         xlator_t *this, int32_t op_ret,</div><div class='add'>+                                         int32_t op_errno, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    int count = 1, ret = -1, i = 0, j = 0;</div><div class='add'>+    dht_conf_t *conf = NULL;</div><div class='add'>+    dht_layout_t *layout = NULL;</div><div class='add'>+    int32_t *disk_layout = NULL;</div><div class='add'>+    dict_t **xattr = NULL;</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    conf = frame-&gt;this-&gt;private;</div><div class='add'>+    count = conf-&gt;local_subvols_cnt;</div><div class='add'>+    layout = local-&gt;layout;</div><div class='add'>+</div><div class='add'>+    if (op_ret &lt; 0) {</div><div class='add'>+        goto err_done;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* We precreate the xattr list as we cannot change call count post the</div><div class='add'>+     * first wind as we may never continue from there. So we finish prep</div><div class='add'>+     * work before winding the setxattrs */</div><div class='add'>+    xattr = GF_CALLOC(count, sizeof(*xattr), gf_common_mt_char);</div><div class='add'>+    if (!xattr) {</div><div class='add'>+        local-&gt;op_errno = errno;</div><div class='add'>+</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_WARNING, errno, DHT_MSG_COMMIT_HASH_FAILED,</div><div class='add'>+                "allocation-failed path=%s", local-&gt;loc.path, NULL);</div><div class='add'>+</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; count; i++) {</div><div class='add'>+        /* find the layout index for the subvolume */</div><div class='add'>+        ret = dht_layout_index_for_subvol(layout, conf-&gt;local_subvols[i]);</div><div class='add'>+        if (ret &lt; 0) {</div><div class='add'>+            local-&gt;op_errno = ENOENT;</div><div class='add'>+</div><div class='add'>+            gf_smsg(this-&gt;name, GF_LOG_WARNING, 0, DHT_MSG_COMMIT_HASH_FAILED,</div><div class='add'>+                    "path=%s", local-&gt;loc.path, "subvol=%s",</div><div class='add'>+                    conf-&gt;local_subvols[i]-&gt;name, "find-disk-layout-failed",</div><div class='add'>+                    NULL);</div><div class='add'>+</div><div class='add'>+            goto err;</div><div class='add'>+        }</div><div class='add'>+        j = ret;</div><div class='add'>+</div><div class='add'>+        /* update the commit hash for the layout */</div><div class='add'>+        layout-&gt;list[j].commit_hash = layout-&gt;commit_hash;</div><div class='add'>+</div><div class='add'>+        /* extract the current layout */</div><div class='add'>+        ret = dht_disk_layout_extract(this, layout, j, &amp;disk_layout);</div><div class='add'>+        if (ret == -1) {</div><div class='add'>+            local-&gt;op_errno = errno;</div><div class='add'>+</div><div class='add'>+            gf_smsg(this-&gt;name, GF_LOG_WARNING, errno,</div><div class='add'>+                    DHT_MSG_COMMIT_HASH_FAILED, "path=%s", local-&gt;loc.path,</div><div class='add'>+                    "subvol=%s", conf-&gt;local_subvols[i]-&gt;name,</div><div class='add'>+                    "extract-disk-layout-failed", NULL);</div><div class='add'>+</div><div class='add'>+            goto err;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        xattr[i] = dict_new();</div><div class='add'>+        if (!xattr[i]) {</div><div class='add'>+            local-&gt;op_errno = errno;</div><div class='add'>+</div><div class='add'>+            gf_smsg(this-&gt;name, GF_LOG_WARNING, errno,</div><div class='add'>+                    DHT_MSG_COMMIT_HASH_FAILED, "path=%s Allocation-failed",</div><div class='add'>+                    local-&gt;loc.path, NULL);</div><div class='add'>+</div><div class='add'>+            goto err;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        ret = dict_set_bin(xattr[i], conf-&gt;xattr_name, disk_layout, 4 * 4);</div><div class='add'>+        if (ret != 0) {</div><div class='add'>+            local-&gt;op_errno = ENOMEM;</div><div class='add'>+</div><div class='add'>+            gf_smsg(this-&gt;name, GF_LOG_WARNING, 0,</div><div class='add'>+                    DHT_MSG_DIR_SELFHEAL_XATTR_FAILED, "path=%s",</div><div class='add'>+                    local-&gt;loc.path, "subvol=%s", conf-&gt;local_subvols[i]-&gt;name,</div><div class='add'>+                    "set-xattr-failed", NULL);</div><div class='add'>+</div><div class='add'>+            goto err;</div><div class='add'>+        }</div><div class='add'>+        disk_layout = NULL;</div><div class='add'>+</div><div class='add'>+        gf_msg_trace(this-&gt;name, 0,</div><div class='add'>+                     "setting commit hash %u on subvolume %s"</div><div class='add'>+                     " for %s",</div><div class='add'>+                     layout-&gt;list[j].commit_hash, conf-&gt;local_subvols[i]-&gt;name,</div><div class='add'>+                     local-&gt;loc.path);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* wind the setting of the commit hash across the local subvols */</div><div class='add'>+    local-&gt;call_cnt = count;</div><div class='add'>+    local-&gt;op_ret = 0;</div><div class='add'>+    local-&gt;op_errno = 0;</div><div class='add'>+    for (i = 0; i &lt; count; i++) {</div><div class='add'>+        STACK_WIND(frame, dht_update_commit_hash_for_layout_cbk,</div><div class='add'>+                   conf-&gt;local_subvols[i],</div><div class='add'>+                   conf-&gt;local_subvols[i]-&gt;fops-&gt;setxattr, &amp;local-&gt;loc,</div><div class='add'>+                   xattr[i], 0, NULL);</div><div class='add'>+    }</div><div class='add'>+    for (i = 0; i &lt; count; i++)</div><div class='add'>+        dict_unref(xattr[i]);</div><div class='add'>+    GF_FREE(xattr);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+err:</div><div class='add'>+    if (xattr) {</div><div class='add'>+        for (i = 0; i &lt; count; i++) {</div><div class='add'>+            if (xattr[i])</div><div class='add'>+                dict_unref(xattr[i]);</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        GF_FREE(xattr);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    GF_FREE(disk_layout);</div><div class='add'>+</div><div class='add'>+    local-&gt;op_ret = -1;</div><div class='add'>+</div><div class='add'>+    dht_update_commit_hash_for_layout_unlock(frame, this);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+err_done:</div><div class='add'>+    local-&gt;op_ret = -1;</div><div class='add'>+</div><div class='add'>+    dht_update_commit_hash_for_layout_done(frame, NULL, this, 0, 0, NULL);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* ENTER: dht_update_commit_hash_for_layout (see EXIT above)</div><div class='add'>+ * This function is invoked from rebalance only.</div><div class='add'>+ * As a result, the check here is simple enough to see if defrag is present</div><div class='add'>+ * in the conf, as other data would be populated appropriately if so.</div><div class='add'>+ * If ever this was to be used in other code paths, checks would need to</div><div class='add'>+ * change.</div><div class='add'>+ *</div><div class='add'>+ * Functional details:</div><div class='add'>+ *  - Lock the inodes on the subvols that we want the commit hash updated</div><div class='add'>+ *  - Update each layout with the inode layout, modified to take in the new</div><div class='add'>+ *    commit hash.</div><div class='add'>+ *  - Unlock and return.</div><div class='add'>+ */</div><div class='add'>+int</div><div class='add'>+dht_update_commit_hash_for_layout(call_frame_t *frame)</div><div class='add'>+{</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    int count = 1, ret = -1, i = 0;</div><div class='add'>+    dht_lock_t **lk_array = NULL;</div><div class='add'>+    dht_conf_t *conf = NULL;</div><div class='add'>+</div><div class='add'>+    GF_VALIDATE_OR_GOTO("dht", frame, err);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(frame-&gt;this-&gt;name, frame-&gt;local, err);</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    conf = frame-&gt;this-&gt;private;</div><div class='add'>+</div><div class='add'>+    if (!conf-&gt;defrag)</div><div class='add'>+        goto err;</div><div class='add'>+</div><div class='add'>+    count = conf-&gt;local_subvols_cnt;</div><div class='add'>+    lk_array = GF_CALLOC(count, sizeof(*lk_array), gf_common_mt_char);</div><div class='add'>+    if (lk_array == NULL)</div><div class='add'>+        goto err;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; count; i++) {</div><div class='add'>+        lk_array[i] = dht_lock_new(frame-&gt;this, conf-&gt;local_subvols[i],</div><div class='add'>+                                   &amp;local-&gt;loc, F_WRLCK, DHT_LAYOUT_HEAL_DOMAIN,</div><div class='add'>+                                   NULL, FAIL_ON_ANY_ERROR);</div><div class='add'>+        if (lk_array[i] == NULL)</div><div class='add'>+            goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    local-&gt;lock[0].layout.my_layout.locks = lk_array;</div><div class='add'>+    local-&gt;lock[0].layout.my_layout.lk_count = count;</div><div class='add'>+</div><div class='add'>+    ret = dht_blocking_inodelk(frame, lk_array, count,</div><div class='add'>+                               dht_update_commit_hash_for_layout_resume);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        local-&gt;lock[0].layout.my_layout.locks = NULL;</div><div class='add'>+        local-&gt;lock[0].layout.my_layout.lk_count = 0;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+err:</div><div class='add'>+    if (lk_array != NULL) {</div><div class='add'>+        dht_lock_array_free(lk_array, count);</div><div class='add'>+        GF_FREE(lk_array);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	return ret;</div><div class='add'>+    return -1;</div><div class='ctx'> }</div><div class='head'>diff --git a/xlators/cluster/dht/src/dht-shared.c b/xlators/cluster/dht/src/dht-shared.c<br/>new file mode 100644<br/>index 00000000000..bb72b0ffbb5<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/xlators/cluster/dht/src/dht-shared.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>xlators/cluster/dht/src/dht-shared.c</a></div><div class='hunk'>@@ -0,0 +1,1104 @@</div><div class='add'>+/*</div><div class='add'>+  Copyright (c) 2008-2012 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+/* TODO: add NS locking */</div><div class='add'>+#include &lt;glusterfs/statedump.h&gt;</div><div class='add'>+#include "dht-common.h"</div><div class='add'>+#include "dht-messages.h"</div><div class='add'>+</div><div class='add'>+#ifndef MAX</div><div class='add'>+#define MAX(a, b) (((a) &gt; (b)) ? (a) : (b))</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+/* TODO:</div><div class='add'>+   - use volumename in xattr instead of "dht"</div><div class='add'>+   - use NS locks</div><div class='add'>+   - handle all cases in self heal layout reconstruction</div><div class='add'>+   - complete linkfile selfheal</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+dht_layout_dump(dht_layout_t *layout, const char *prefix)</div><div class='add'>+{</div><div class='add'>+    char key[GF_DUMP_MAX_BUF_LEN];</div><div class='add'>+    int i = 0;</div><div class='add'>+</div><div class='add'>+    if (!layout)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    gf_proc_dump_build_key(key, prefix, "cnt");</div><div class='add'>+    gf_proc_dump_write(key, "%d", layout-&gt;cnt);</div><div class='add'>+    gf_proc_dump_build_key(key, prefix, "preset");</div><div class='add'>+    gf_proc_dump_write(key, "%d", layout-&gt;preset);</div><div class='add'>+    gf_proc_dump_build_key(key, prefix, "gen");</div><div class='add'>+    gf_proc_dump_write(key, "%d", layout-&gt;gen);</div><div class='add'>+    if (layout-&gt;type != IA_INVAL) {</div><div class='add'>+        gf_proc_dump_build_key(key, prefix, "inode type");</div><div class='add'>+        gf_proc_dump_write(key, "%d", layout-&gt;type);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (!IA_ISDIR(layout-&gt;type))</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; layout-&gt;cnt; i++) {</div><div class='add'>+        gf_proc_dump_build_key(key, prefix, "list[%d].err", i);</div><div class='add'>+        gf_proc_dump_write(key, "%d", layout-&gt;list[i].err);</div><div class='add'>+        gf_proc_dump_build_key(key, prefix, "list[%d].start", i);</div><div class='add'>+        gf_proc_dump_write(key, "0x%x", layout-&gt;list[i].start);</div><div class='add'>+        gf_proc_dump_build_key(key, prefix, "list[%d].stop", i);</div><div class='add'>+        gf_proc_dump_write(key, "0x%x", layout-&gt;list[i].stop);</div><div class='add'>+        if (layout-&gt;list[i].xlator) {</div><div class='add'>+            gf_proc_dump_build_key(key, prefix, "list[%d].xlator.type", i);</div><div class='add'>+            gf_proc_dump_write(key, "%s", layout-&gt;list[i].xlator-&gt;type);</div><div class='add'>+            gf_proc_dump_build_key(key, prefix, "list[%d].xlator.name", i);</div><div class='add'>+            gf_proc_dump_write(key, "%s", layout-&gt;list[i].xlator-&gt;name);</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+dht_priv_dump(xlator_t *this)</div><div class='add'>+{</div><div class='add'>+    char key_prefix[GF_DUMP_MAX_BUF_LEN];</div><div class='add'>+    char key[GF_DUMP_MAX_BUF_LEN];</div><div class='add'>+    int i = 0;</div><div class='add'>+    dht_conf_t *conf = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    if (!this)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    conf = this-&gt;private;</div><div class='add'>+    if (!conf)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    ret = TRY_LOCK(&amp;conf-&gt;subvolume_lock);</div><div class='add'>+    if (ret != 0) {</div><div class='add'>+        return ret;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    gf_proc_dump_add_section("xlator.cluster.dht.%s.priv", this-&gt;name);</div><div class='add'>+    gf_proc_dump_build_key(key_prefix, "xlator.cluster.dht", "%s.priv",</div><div class='add'>+                           this-&gt;name);</div><div class='add'>+    gf_proc_dump_write("subvol_cnt", "%d", conf-&gt;subvolume_cnt);</div><div class='add'>+    for (i = 0; i &lt; conf-&gt;subvolume_cnt; i++) {</div><div class='add'>+        snprintf(key, sizeof(key), "subvolumes[%d]", i);</div><div class='add'>+        gf_proc_dump_write(key, "%s.%s", conf-&gt;subvolumes[i]-&gt;type,</div><div class='add'>+                           conf-&gt;subvolumes[i]-&gt;name);</div><div class='add'>+        if (conf-&gt;file_layouts &amp;&amp; conf-&gt;file_layouts[i]) {</div><div class='add'>+            snprintf(key, sizeof(key), "file_layouts[%d]", i);</div><div class='add'>+            dht_layout_dump(conf-&gt;file_layouts[i], key);</div><div class='add'>+        }</div><div class='add'>+        if (conf-&gt;dir_layouts &amp;&amp; conf-&gt;dir_layouts[i]) {</div><div class='add'>+            snprintf(key, sizeof(key), "dir_layouts[%d]", i);</div><div class='add'>+            dht_layout_dump(conf-&gt;dir_layouts[i], key);</div><div class='add'>+        }</div><div class='add'>+        if (conf-&gt;subvolume_status) {</div><div class='add'>+            snprintf(key, sizeof(key), "subvolume_status[%d]", i);</div><div class='add'>+            gf_proc_dump_write(key, "%d", (int)conf-&gt;subvolume_status[i]);</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    gf_proc_dump_write("search_unhashed", "%d", conf-&gt;search_unhashed);</div><div class='add'>+    gf_proc_dump_write("gen", "%d", conf-&gt;gen);</div><div class='add'>+    gf_proc_dump_write("min_free_disk", "%lf", conf-&gt;min_free_disk);</div><div class='add'>+    gf_proc_dump_write("min_free_inodes", "%lf", conf-&gt;min_free_inodes);</div><div class='add'>+    gf_proc_dump_write("disk_unit", "%c", conf-&gt;disk_unit);</div><div class='add'>+    gf_proc_dump_write("refresh_interval", "%d", conf-&gt;refresh_interval);</div><div class='add'>+    gf_proc_dump_write("unhashed_sticky_bit", "%d", conf-&gt;unhashed_sticky_bit);</div><div class='add'>+    gf_proc_dump_write("use-readdirp", "%d", conf-&gt;use_readdirp);</div><div class='add'>+</div><div class='add'>+    if (conf-&gt;du_stats &amp;&amp; conf-&gt;subvolume_status) {</div><div class='add'>+        for (i = 0; i &lt; conf-&gt;subvolume_cnt; i++) {</div><div class='add'>+            if (!conf-&gt;subvolume_status[i])</div><div class='add'>+                continue;</div><div class='add'>+</div><div class='add'>+            snprintf(key, sizeof(key), "subvolumes[%d]", i);</div><div class='add'>+            gf_proc_dump_write(key, "%s", conf-&gt;subvolumes[i]-&gt;name);</div><div class='add'>+</div><div class='add'>+            snprintf(key, sizeof(key), "du_stats[%d].avail_percent", i);</div><div class='add'>+            gf_proc_dump_write(key, "%lf", conf-&gt;du_stats[i].avail_percent);</div><div class='add'>+</div><div class='add'>+            snprintf(key, sizeof(key), "du_stats[%d].avail_space", i);</div><div class='add'>+            gf_proc_dump_write(key, "%" PRIu64, conf-&gt;du_stats[i].avail_space);</div><div class='add'>+</div><div class='add'>+            snprintf(key, sizeof(key), "du_stats[%d].avail_inodes", i);</div><div class='add'>+            gf_proc_dump_write(key, "%lf", conf-&gt;du_stats[i].avail_inodes);</div><div class='add'>+</div><div class='add'>+            snprintf(key, sizeof(key), "du_stats[%d].log", i);</div><div class='add'>+            gf_proc_dump_write(key, "%" PRIu32, conf-&gt;du_stats[i].log);</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (conf-&gt;last_stat_fetch)</div><div class='add'>+        gf_proc_dump_write("last_stat_fetch", "%s",</div><div class='add'>+                           ctime(&amp;conf-&gt;last_stat_fetch));</div><div class='add'>+</div><div class='add'>+    UNLOCK(&amp;conf-&gt;subvolume_lock);</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+dht_inodectx_dump(xlator_t *this, inode_t *inode)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    dht_layout_t *layout = NULL;</div><div class='add'>+</div><div class='add'>+    if (!this)</div><div class='add'>+        goto out;</div><div class='add'>+    if (!inode)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    ret = dht_inode_ctx_layout_get(inode, this, &amp;layout);</div><div class='add'>+</div><div class='add'>+    if ((ret != 0) || !layout)</div><div class='add'>+        return ret;</div><div class='add'>+</div><div class='add'>+    gf_proc_dump_add_section("xlator.cluster.dht.%s.inode", this-&gt;name);</div><div class='add'>+    dht_layout_dump(layout, "layout");</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+dht_fini(xlator_t *this)</div><div class='add'>+{</div><div class='add'>+    int i = 0;</div><div class='add'>+    dht_conf_t *conf = NULL;</div><div class='add'>+</div><div class='add'>+    GF_VALIDATE_OR_GOTO("dht", this, out);</div><div class='add'>+</div><div class='add'>+    conf = this-&gt;private;</div><div class='add'>+    this-&gt;private = NULL;</div><div class='add'>+    if (conf) {</div><div class='add'>+        if (conf-&gt;file_layouts) {</div><div class='add'>+            for (i = 0; i &lt; conf-&gt;subvolume_cnt; i++) {</div><div class='add'>+                GF_FREE(conf-&gt;file_layouts[i]);</div><div class='add'>+            }</div><div class='add'>+            GF_FREE(conf-&gt;file_layouts);</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        dict_unref(conf-&gt;leaf_to_subvol);</div><div class='add'>+</div><div class='add'>+        /* allocated in dht_init_subvolumes() */</div><div class='add'>+        GF_FREE(conf-&gt;subvolumes);</div><div class='add'>+        GF_FREE(conf-&gt;subvolume_status);</div><div class='add'>+        GF_FREE(conf-&gt;last_event);</div><div class='add'>+        GF_FREE(conf-&gt;subvol_up_time);</div><div class='add'>+        GF_FREE(conf-&gt;du_stats);</div><div class='add'>+        GF_FREE(conf-&gt;decommissioned_bricks);</div><div class='add'>+</div><div class='add'>+        /* allocated in dht_init() */</div><div class='add'>+        GF_FREE(conf-&gt;mds_xattr_key);</div><div class='add'>+        GF_FREE(conf-&gt;link_xattr_name);</div><div class='add'>+        GF_FREE(conf-&gt;commithash_xattr_name);</div><div class='add'>+        GF_FREE(conf-&gt;wild_xattr_name);</div><div class='add'>+</div><div class='add'>+        /* allocated in dht_init_regex() */</div><div class='add'>+        if (conf-&gt;rsync_regex_valid)</div><div class='add'>+            regfree(&amp;conf-&gt;rsync_regex);</div><div class='add'>+        if (conf-&gt;extra_regex_valid)</div><div class='add'>+            regfree(&amp;conf-&gt;extra_regex);</div><div class='add'>+</div><div class='add'>+        synclock_destroy(&amp;conf-&gt;link_lock);</div><div class='add'>+</div><div class='add'>+        if (conf-&gt;lock_pool)</div><div class='add'>+            mem_pool_destroy(conf-&gt;lock_pool);</div><div class='add'>+</div><div class='add'>+        GF_FREE(conf);</div><div class='add'>+    }</div><div class='add'>+out:</div><div class='add'>+    return;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+mem_acct_init(xlator_t *this)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    GF_VALIDATE_OR_GOTO("dht", this, out);</div><div class='add'>+</div><div class='add'>+    ret = xlator_mem_acct_init(this, gf_dht_mt_end + 1);</div><div class='add'>+</div><div class='add'>+    if (ret != 0) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_ERROR, 0, DHT_MSG_NO_MEMORY,</div><div class='add'>+               "Memory accounting init failed");</div><div class='add'>+        return ret;</div><div class='add'>+    }</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+dht_parse_decommissioned_bricks(xlator_t *this, dht_conf_t *conf,</div><div class='add'>+                                const char *bricks)</div><div class='add'>+{</div><div class='add'>+    int i = 0;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    char *tmpstr = NULL;</div><div class='add'>+    char *dup_brick = NULL;</div><div class='add'>+    char *node = NULL;</div><div class='add'>+</div><div class='add'>+    if (!conf || !bricks)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    dup_brick = gf_strdup(bricks);</div><div class='add'>+    if (dup_brick == NULL) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    node = strtok_r(dup_brick, ",", &amp;tmpstr);</div><div class='add'>+    while (node) {</div><div class='add'>+        for (i = 0; i &lt; conf-&gt;subvolume_cnt; i++) {</div><div class='add'>+            if (!strcmp(conf-&gt;subvolumes[i]-&gt;name, node)) {</div><div class='add'>+                conf-&gt;decommissioned_bricks[i] = conf-&gt;subvolumes[i];</div><div class='add'>+                conf-&gt;decommission_subvols_cnt++;</div><div class='add'>+                gf_msg(this-&gt;name, GF_LOG_INFO, 0,</div><div class='add'>+                       DHT_MSG_SUBVOL_DECOMMISSION_INFO,</div><div class='add'>+                       "decommissioning subvolume %s",</div><div class='add'>+                       conf-&gt;subvolumes[i]-&gt;name);</div><div class='add'>+                break;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+        if (i == conf-&gt;subvolume_cnt) {</div><div class='add'>+            /* Wrong node given. */</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+        node = strtok_r(NULL, ",", &amp;tmpstr);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+    conf-&gt;decommission_in_progress = 1;</div><div class='add'>+out:</div><div class='add'>+    GF_FREE(dup_brick);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+dht_decommissioned_remove(xlator_t *this, dht_conf_t *conf)</div><div class='add'>+{</div><div class='add'>+    int i = 0;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; conf-&gt;subvolume_cnt; i++) {</div><div class='add'>+        if (conf-&gt;decommissioned_bricks[i]) {</div><div class='add'>+            conf-&gt;decommissioned_bricks[i] = NULL;</div><div class='add'>+            conf-&gt;decommission_subvols_cnt--;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+dht_init_regex(xlator_t *this, dict_t *odict, char *name, regex_t *re,</div><div class='add'>+               gf_boolean_t *re_valid, dht_conf_t *conf)</div><div class='add'>+{</div><div class='add'>+    char *temp_str = NULL;</div><div class='add'>+</div><div class='add'>+    if (dict_get_str(odict, name, &amp;temp_str) != 0) {</div><div class='add'>+        if (strcmp(name, "rsync-hash-regex")) {</div><div class='add'>+            return;</div><div class='add'>+        }</div><div class='add'>+        temp_str = "^\\.(.+)\\.[^.]+$";</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;conf-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        if (*re_valid) {</div><div class='add'>+            regfree(re);</div><div class='add'>+            *re_valid = _gf_false;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        if (!strcmp(temp_str, "none")) {</div><div class='add'>+            goto unlock;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        if (regcomp(re, temp_str, REG_EXTENDED) == 0) {</div><div class='add'>+            gf_msg_debug(this-&gt;name, 0, "using regex %s = %s", name, temp_str);</div><div class='add'>+            *re_valid = _gf_true;</div><div class='add'>+        } else {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_WARNING, 0, DHT_MSG_REGEX_INFO,</div><div class='add'>+                   "compiling regex %s failed", temp_str);</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+unlock:</div><div class='add'>+    UNLOCK(&amp;conf-&gt;lock);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+dht_set_subvol_range(xlator_t *this)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    dht_conf_t *conf = NULL;</div><div class='add'>+</div><div class='add'>+    conf = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    if (!conf)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    conf-&gt;leaf_to_subvol = dict_new();</div><div class='add'>+    if (!conf-&gt;leaf_to_subvol)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    ret = glusterfs_reachable_leaves(this, conf-&gt;leaf_to_subvol);</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+dht_configure_throttle(xlator_t *this, dht_conf_t *conf, char *temp_str)</div><div class='add'>+{</div><div class='add'>+    int rebal_thread_count = 0;</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    pthread_mutex_lock(&amp;conf-&gt;defrag-&gt;dfq_mutex);</div><div class='add'>+    {</div><div class='add'>+        if (!strcasecmp(temp_str, "lazy")) {</div><div class='add'>+            conf-&gt;defrag-&gt;recon_thread_count = 1;</div><div class='add'>+        } else if (!strcasecmp(temp_str, "normal")) {</div><div class='add'>+            conf-&gt;defrag-&gt;recon_thread_count = 2;</div><div class='add'>+        } else if (!strcasecmp(temp_str, "aggressive")) {</div><div class='add'>+            conf-&gt;defrag-&gt;recon_thread_count = MAX(MAX_REBAL_THREADS - 4, 4);</div><div class='add'>+        } else if ((gf_string2int(temp_str, &amp;rebal_thread_count) == 0)) {</div><div class='add'>+            if ((rebal_thread_count &gt; 0) &amp;&amp;</div><div class='add'>+                (rebal_thread_count &lt;= MAX_REBAL_THREADS)) {</div><div class='add'>+                conf-&gt;defrag-&gt;recon_thread_count = rebal_thread_count;</div><div class='add'>+                pthread_mutex_unlock(&amp;conf-&gt;defrag-&gt;dfq_mutex);</div><div class='add'>+                gf_msg(this-&gt;name, GF_LOG_INFO, 0, 0,</div><div class='add'>+                       "rebal thread count configured to %d",</div><div class='add'>+                       rebal_thread_count);</div><div class='add'>+                goto out;</div><div class='add'>+            } else {</div><div class='add'>+                pthread_mutex_unlock(&amp;conf-&gt;defrag-&gt;dfq_mutex);</div><div class='add'>+                gf_msg(this-&gt;name, GF_LOG_ERROR, 0, DHT_MSG_INVALID_OPTION,</div><div class='add'>+                       "Invalid option: Reconfigure: "</div><div class='add'>+                       "rebal-throttle should be "</div><div class='add'>+                       "within range of 0 and maximum number of"</div><div class='add'>+                       " cores available");</div><div class='add'>+                ret = -1;</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+        } else {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, 0, DHT_MSG_INVALID_OPTION,</div><div class='add'>+                   "Invalid option: Reconfigure: "</div><div class='add'>+                   "rebal-throttle should be {lazy|normal|aggressive}"</div><div class='add'>+                   " or a number up to the number of cores available,"</div><div class='add'>+                   " not (%s), defaulting to (%d)",</div><div class='add'>+                   temp_str, conf-&gt;dthrottle);</div><div class='add'>+            ret = -1;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    pthread_mutex_unlock(&amp;conf-&gt;defrag-&gt;dfq_mutex);</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+dht_reconfigure(xlator_t *this, dict_t *options)</div><div class='add'>+{</div><div class='add'>+    dht_conf_t *conf = NULL;</div><div class='add'>+    char *temp_str = NULL;</div><div class='add'>+    gf_boolean_t search_unhashed;</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    GF_VALIDATE_OR_GOTO("dht", this, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("dht", options, out);</div><div class='add'>+</div><div class='add'>+    conf = this-&gt;private;</div><div class='add'>+    if (!conf)</div><div class='add'>+        return 0;</div><div class='add'>+</div><div class='add'>+    if (dict_get_str(options, "lookup-unhashed", &amp;temp_str) == 0) {</div><div class='add'>+        /* If option is not "auto", other options _should_ be boolean*/</div><div class='add'>+        if (strcasecmp(temp_str, "auto")) {</div><div class='add'>+            if (!gf_string2boolean(temp_str, &amp;search_unhashed)) {</div><div class='add'>+                gf_msg_debug(this-&gt;name, 0,</div><div class='add'>+                             "Reconfigure: "</div><div class='add'>+                             "lookup-unhashed reconfigured(%s)",</div><div class='add'>+                             temp_str);</div><div class='add'>+                conf-&gt;search_unhashed = search_unhashed;</div><div class='add'>+            } else {</div><div class='add'>+                gf_msg(this-&gt;name, GF_LOG_ERROR, 0, DHT_MSG_INVALID_OPTION,</div><div class='add'>+                       "Invalid option: Reconfigure: "</div><div class='add'>+                       "lookup-unhashed should be boolean,"</div><div class='add'>+                       " not (%s), defaulting to (%d)",</div><div class='add'>+                       temp_str, conf-&gt;search_unhashed);</div><div class='add'>+                ret = -1;</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+        } else {</div><div class='add'>+            gf_msg_debug(this-&gt;name, 0,</div><div class='add'>+                         "Reconfigure:"</div><div class='add'>+                         " lookup-unhashed reconfigured auto ");</div><div class='add'>+            conf-&gt;search_unhashed = GF_DHT_LOOKUP_UNHASHED_AUTO;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    GF_OPTION_RECONF("lookup-optimize", conf-&gt;lookup_optimize, options, bool,</div><div class='add'>+                     out);</div><div class='add'>+</div><div class='add'>+    GF_OPTION_RECONF("min-free-disk", conf-&gt;min_free_disk, options,</div><div class='add'>+                     percent_or_size, out);</div><div class='add'>+    /* option can be any one of percent or bytes */</div><div class='add'>+    conf-&gt;disk_unit = 0;</div><div class='add'>+    if (conf-&gt;min_free_disk &lt; 100.0)</div><div class='add'>+        conf-&gt;disk_unit = 'p';</div><div class='add'>+</div><div class='add'>+    GF_OPTION_RECONF("min-free-inodes", conf-&gt;min_free_inodes, options, percent,</div><div class='add'>+                     out);</div><div class='add'>+</div><div class='add'>+    GF_OPTION_RECONF("directory-layout-spread", conf-&gt;dir_spread_cnt, options,</div><div class='add'>+                     uint32, out);</div><div class='add'>+</div><div class='add'>+    GF_OPTION_RECONF("readdir-optimize", conf-&gt;readdir_optimize, options, bool,</div><div class='add'>+                     out);</div><div class='add'>+    GF_OPTION_RECONF("randomize-hash-range-by-gfid", conf-&gt;randomize_by_gfid,</div><div class='add'>+                     options, bool, out);</div><div class='add'>+</div><div class='add'>+    GF_OPTION_RECONF("lock-migration", conf-&gt;lock_migration_enabled, options,</div><div class='add'>+                     bool, out);</div><div class='add'>+</div><div class='add'>+    GF_OPTION_RECONF("force-migration", conf-&gt;force_migration, options, bool,</div><div class='add'>+                     out);</div><div class='add'>+</div><div class='add'>+    if (conf-&gt;defrag) {</div><div class='add'>+        if (dict_get_str(options, "rebal-throttle", &amp;temp_str) == 0) {</div><div class='add'>+            ret = dht_configure_throttle(this, conf, temp_str);</div><div class='add'>+            if (ret == -1)</div><div class='add'>+                goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (conf-&gt;defrag) {</div><div class='add'>+        conf-&gt;defrag-&gt;lock_migration_enabled = conf-&gt;lock_migration_enabled;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (conf-&gt;defrag) {</div><div class='add'>+        GF_OPTION_RECONF("rebalance-stats", conf-&gt;defrag-&gt;stats, options, bool,</div><div class='add'>+                         out);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (dict_get_str(options, "decommissioned-bricks", &amp;temp_str) == 0) {</div><div class='add'>+        ret = dht_parse_decommissioned_bricks(this, conf, temp_str);</div><div class='add'>+        if (ret == -1)</div><div class='add'>+            goto out;</div><div class='add'>+    } else {</div><div class='add'>+        dht_decommissioned_remove(this, conf);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    dht_init_regex(this, options, "rsync-hash-regex", &amp;conf-&gt;rsync_regex,</div><div class='add'>+                   &amp;conf-&gt;rsync_regex_valid, conf);</div><div class='add'>+    dht_init_regex(this, options, "extra-hash-regex", &amp;conf-&gt;extra_regex,</div><div class='add'>+                   &amp;conf-&gt;extra_regex_valid, conf);</div><div class='add'>+</div><div class='add'>+    GF_OPTION_RECONF("weighted-rebalance", conf-&gt;do_weighting, options, bool,</div><div class='add'>+                     out);</div><div class='add'>+</div><div class='add'>+    GF_OPTION_RECONF("use-readdirp", conf-&gt;use_readdirp, options, bool, out);</div><div class='add'>+    ret = 0;</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+gf_defrag_pattern_list_fill(xlator_t *this, gf_defrag_info_t *defrag,</div><div class='add'>+                            char *data)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    char *tmp_str = NULL;</div><div class='add'>+    char *tmp_str1 = NULL;</div><div class='add'>+    char *dup_str = NULL;</div><div class='add'>+    char *num = NULL;</div><div class='add'>+    char *pattern_str = NULL;</div><div class='add'>+    char *pattern = NULL;</div><div class='add'>+    gf_defrag_pattern_list_t *temp_list = NULL;</div><div class='add'>+    gf_defrag_pattern_list_t *pattern_list = NULL;</div><div class='add'>+</div><div class='add'>+    if (!this || !defrag || !data)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    /* Get the pattern for pattern list. "pattern:&lt;optional-size&gt;"</div><div class='add'>+     * eg: *avi, *pdf:10MB, *:1TB</div><div class='add'>+     */</div><div class='add'>+    pattern_str = strtok_r(data, ",", &amp;tmp_str);</div><div class='add'>+    while (pattern_str) {</div><div class='add'>+        dup_str = gf_strdup(pattern_str);</div><div class='add'>+        if (!dup_str)</div><div class='add'>+            goto out;</div><div class='add'>+        pattern_list = GF_CALLOC(1, sizeof(gf_defrag_pattern_list_t), 1);</div><div class='add'>+        if (!pattern_list) {</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+        pattern = strtok_r(dup_str, ":", &amp;tmp_str1);</div><div class='add'>+        num = strtok_r(NULL, ":", &amp;tmp_str1);</div><div class='add'>+        if (!pattern)</div><div class='add'>+            goto out;</div><div class='add'>+        if (!num) {</div><div class='add'>+            if (gf_string2bytesize_uint64(pattern, &amp;pattern_list-&gt;size) == 0) {</div><div class='add'>+                pattern = "*";</div><div class='add'>+            }</div><div class='add'>+        } else if (gf_string2bytesize_uint64(num, &amp;pattern_list-&gt;size) != 0) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, 0, DHT_MSG_INVALID_OPTION,</div><div class='add'>+                   "Invalid option. Defrag pattern:"</div><div class='add'>+                   " Invalid number format \"%s\"",</div><div class='add'>+                   num);</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+        memcpy(pattern_list-&gt;path_pattern, pattern, strlen(dup_str));</div><div class='add'>+</div><div class='add'>+        if (!defrag-&gt;defrag_pattern)</div><div class='add'>+            temp_list = NULL;</div><div class='add'>+        else</div><div class='add'>+            temp_list = defrag-&gt;defrag_pattern;</div><div class='add'>+</div><div class='add'>+        pattern_list-&gt;next = temp_list;</div><div class='add'>+</div><div class='add'>+        defrag-&gt;defrag_pattern = pattern_list;</div><div class='add'>+        pattern_list = NULL;</div><div class='add'>+</div><div class='add'>+        GF_FREE(dup_str);</div><div class='add'>+        dup_str = NULL;</div><div class='add'>+</div><div class='add'>+        pattern_str = strtok_r(NULL, ",", &amp;tmp_str);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+out:</div><div class='add'>+    if (ret)</div><div class='add'>+        GF_FREE(pattern_list);</div><div class='add'>+    GF_FREE(dup_str);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+dht_init_methods(xlator_t *this)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    dht_conf_t *conf = NULL;</div><div class='add'>+    dht_methods_t *methods = NULL;</div><div class='add'>+</div><div class='add'>+    GF_VALIDATE_OR_GOTO("dht", this, err);</div><div class='add'>+</div><div class='add'>+    conf = this-&gt;private;</div><div class='add'>+    methods = &amp;(conf-&gt;methods);</div><div class='add'>+</div><div class='add'>+    methods-&gt;migration_get_dst_subvol = dht_migration_get_dst_subvol;</div><div class='add'>+    methods-&gt;migration_other = NULL;</div><div class='add'>+    methods-&gt;layout_search = dht_layout_search;</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+err:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+dht_init(xlator_t *this)</div><div class='add'>+{</div><div class='add'>+    dht_conf_t *conf = NULL;</div><div class='add'>+    char *temp_str = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int i = 0;</div><div class='add'>+    gf_defrag_info_t *defrag = NULL;</div><div class='add'>+    int cmd = 0;</div><div class='add'>+    char *node_uuid = NULL;</div><div class='add'>+    uint32_t commit_hash = 0;</div><div class='add'>+</div><div class='add'>+    GF_VALIDATE_OR_GOTO("dht", this, err);</div><div class='add'>+</div><div class='add'>+    if (!this-&gt;children) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_CRITICAL, 0, DHT_MSG_INVALID_CONFIGURATION,</div><div class='add'>+               "Distribute needs more than one subvolume");</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (!this-&gt;parents) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_WARNING, 0, DHT_MSG_INVALID_CONFIGURATION,</div><div class='add'>+               "dangling volume. check volfile");</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    conf = GF_CALLOC(1, sizeof(*conf), gf_dht_mt_dht_conf_t);</div><div class='add'>+    if (!conf) {</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    LOCK_INIT(&amp;conf-&gt;subvolume_lock);</div><div class='add'>+    LOCK_INIT(&amp;conf-&gt;layout_lock);</div><div class='add'>+    LOCK_INIT(&amp;conf-&gt;lock);</div><div class='add'>+    synclock_init(&amp;conf-&gt;link_lock, SYNC_LOCK_DEFAULT);</div><div class='add'>+</div><div class='add'>+    /* We get the commit-hash to set only for rebalance process */</div><div class='add'>+    if (dict_get_uint32(this-&gt;options, "commit-hash", &amp;commit_hash) == 0) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_INFO, 0, DHT_MSG_COMMIT_HASH_INFO,</div><div class='add'>+               "%s using commit hash %u", __func__, commit_hash);</div><div class='add'>+        conf-&gt;vol_commit_hash = commit_hash;</div><div class='add'>+        conf-&gt;vch_forced = _gf_true;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_get_int32(this-&gt;options, "rebalance-cmd", &amp;cmd);</div><div class='add'>+</div><div class='add'>+    if (cmd) {</div><div class='add'>+        defrag = GF_CALLOC(1, sizeof(gf_defrag_info_t), gf_defrag_info_mt);</div><div class='add'>+</div><div class='add'>+        GF_VALIDATE_OR_GOTO(this-&gt;name, defrag, err);</div><div class='add'>+</div><div class='add'>+        LOCK_INIT(&amp;defrag-&gt;lock);</div><div class='add'>+</div><div class='add'>+        defrag-&gt;is_exiting = 0;</div><div class='add'>+</div><div class='add'>+        conf-&gt;defrag = defrag;</div><div class='add'>+        defrag-&gt;this = this;</div><div class='add'>+</div><div class='add'>+        ret = dict_get_str(this-&gt;options, "node-uuid", &amp;node_uuid);</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, 0, DHT_MSG_INVALID_CONFIGURATION,</div><div class='add'>+                   "Invalid volume configuration: "</div><div class='add'>+                   "node-uuid not specified");</div><div class='add'>+            goto err;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        if (gf_uuid_parse(node_uuid, defrag-&gt;node_uuid)) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, 0, DHT_MSG_INVALID_OPTION,</div><div class='add'>+                   "Invalid option:"</div><div class='add'>+                   " Cannot parse glusterd node uuid");</div><div class='add'>+            goto err;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        defrag-&gt;cmd = cmd;</div><div class='add'>+</div><div class='add'>+        defrag-&gt;stats = _gf_false;</div><div class='add'>+</div><div class='add'>+        defrag-&gt;queue = NULL;</div><div class='add'>+</div><div class='add'>+        defrag-&gt;crawl_done = 0;</div><div class='add'>+</div><div class='add'>+        defrag-&gt;global_error = 0;</div><div class='add'>+</div><div class='add'>+        defrag-&gt;q_entry_count = 0;</div><div class='add'>+</div><div class='add'>+        defrag-&gt;wakeup_crawler = 0;</div><div class='add'>+</div><div class='add'>+        pthread_mutex_init(&amp;defrag-&gt;dfq_mutex, 0);</div><div class='add'>+        pthread_cond_init(&amp;defrag-&gt;parallel_migration_cond, 0);</div><div class='add'>+        pthread_cond_init(&amp;defrag-&gt;rebalance_crawler_alarm, 0);</div><div class='add'>+        pthread_cond_init(&amp;defrag-&gt;df_wakeup_thread, 0);</div><div class='add'>+</div><div class='add'>+        pthread_mutex_init(&amp;defrag-&gt;fc_mutex, 0);</div><div class='add'>+        pthread_cond_init(&amp;defrag-&gt;fc_wakeup_cond, 0);</div><div class='add'>+</div><div class='add'>+        defrag-&gt;global_error = 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    conf-&gt;use_fallocate = 1;</div><div class='add'>+</div><div class='add'>+    conf-&gt;search_unhashed = GF_DHT_LOOKUP_UNHASHED_ON;</div><div class='add'>+    if (dict_get_str(this-&gt;options, "lookup-unhashed", &amp;temp_str) == 0) {</div><div class='add'>+        /* If option is not "auto", other options _should_ be boolean */</div><div class='add'>+        if (strcasecmp(temp_str, "auto")) {</div><div class='add'>+            gf_boolean_t search_unhashed_bool;</div><div class='add'>+            ret = gf_string2boolean(temp_str, &amp;search_unhashed_bool);</div><div class='add'>+            if (ret == -1) {</div><div class='add'>+                goto err;</div><div class='add'>+            }</div><div class='add'>+            conf-&gt;search_unhashed = search_unhashed_bool</div><div class='add'>+                                        ? GF_DHT_LOOKUP_UNHASHED_ON</div><div class='add'>+                                        : GF_DHT_LOOKUP_UNHASHED_OFF;</div><div class='add'>+        } else {</div><div class='add'>+            conf-&gt;search_unhashed = GF_DHT_LOOKUP_UNHASHED_AUTO;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    GF_OPTION_INIT("lookup-optimize", conf-&gt;lookup_optimize, bool, err);</div><div class='add'>+</div><div class='add'>+    GF_OPTION_INIT("unhashed-sticky-bit", conf-&gt;unhashed_sticky_bit, bool, err);</div><div class='add'>+</div><div class='add'>+    GF_OPTION_INIT("use-readdirp", conf-&gt;use_readdirp, bool, err);</div><div class='add'>+</div><div class='add'>+    GF_OPTION_INIT("min-free-disk", conf-&gt;min_free_disk, percent_or_size, err);</div><div class='add'>+</div><div class='add'>+    GF_OPTION_INIT("min-free-inodes", conf-&gt;min_free_inodes, percent, err);</div><div class='add'>+</div><div class='add'>+    conf-&gt;dir_spread_cnt = conf-&gt;subvolume_cnt;</div><div class='add'>+    GF_OPTION_INIT("directory-layout-spread", conf-&gt;dir_spread_cnt, uint32,</div><div class='add'>+                   err);</div><div class='add'>+</div><div class='add'>+    GF_OPTION_INIT("assert-no-child-down", conf-&gt;assert_no_child_down, bool,</div><div class='add'>+                   err);</div><div class='add'>+</div><div class='add'>+    GF_OPTION_INIT("readdir-optimize", conf-&gt;readdir_optimize, bool, err);</div><div class='add'>+</div><div class='add'>+    GF_OPTION_INIT("lock-migration", conf-&gt;lock_migration_enabled, bool, err);</div><div class='add'>+</div><div class='add'>+    GF_OPTION_INIT("force-migration", conf-&gt;force_migration, bool, err);</div><div class='add'>+</div><div class='add'>+    if (defrag) {</div><div class='add'>+        defrag-&gt;lock_migration_enabled = conf-&gt;lock_migration_enabled;</div><div class='add'>+</div><div class='add'>+        GF_OPTION_INIT("rebalance-stats", defrag-&gt;stats, bool, err);</div><div class='add'>+        if (dict_get_str(this-&gt;options, "rebalance-filter", &amp;temp_str) == 0) {</div><div class='add'>+            if (gf_defrag_pattern_list_fill(this, defrag, temp_str) == -1) {</div><div class='add'>+                gf_msg(this-&gt;name, GF_LOG_ERROR, 0, DHT_MSG_INVALID_OPTION,</div><div class='add'>+                       "Invalid option:"</div><div class='add'>+                       " Cannot parse rebalance-filter (%s)",</div><div class='add'>+                       temp_str);</div><div class='add'>+</div><div class='add'>+                goto err;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* option can be any one of percent or bytes */</div><div class='add'>+    conf-&gt;disk_unit = 0;</div><div class='add'>+    if (conf-&gt;min_free_disk &lt; 100)</div><div class='add'>+        conf-&gt;disk_unit = 'p';</div><div class='add'>+</div><div class='add'>+    ret = dht_init_subvolumes(this, conf);</div><div class='add'>+    if (ret == -1) {</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (cmd) {</div><div class='add'>+        ret = dht_init_local_subvolumes(this, conf);</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, 0,</div><div class='add'>+                   DHT_MSG_INIT_LOCAL_SUBVOL_FAILED,</div><div class='add'>+                   "dht_init_local_subvolumes failed");</div><div class='add'>+            goto err;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (dict_get_str(this-&gt;options, "decommissioned-bricks", &amp;temp_str) == 0) {</div><div class='add'>+        ret = dht_parse_decommissioned_bricks(this, conf, temp_str);</div><div class='add'>+        if (ret == -1)</div><div class='add'>+            goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    dht_init_regex(this, this-&gt;options, "rsync-hash-regex", &amp;conf-&gt;rsync_regex,</div><div class='add'>+                   &amp;conf-&gt;rsync_regex_valid, conf);</div><div class='add'>+    dht_init_regex(this, this-&gt;options, "extra-hash-regex", &amp;conf-&gt;extra_regex,</div><div class='add'>+                   &amp;conf-&gt;extra_regex_valid, conf);</div><div class='add'>+</div><div class='add'>+    ret = dht_layouts_init(this, conf);</div><div class='add'>+    if (ret == -1) {</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    conf-&gt;gen = 1;</div><div class='add'>+</div><div class='add'>+    this-&gt;local_pool = mem_pool_new(dht_local_t, 512);</div><div class='add'>+    if (!this-&gt;local_pool) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_ERROR, ENOMEM, DHT_MSG_NO_MEMORY,</div><div class='add'>+               " DHT initialisation failed. "</div><div class='add'>+               "failed to create local_t's memory pool");</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    GF_OPTION_INIT("randomize-hash-range-by-gfid", conf-&gt;randomize_by_gfid,</div><div class='add'>+                   bool, err);</div><div class='add'>+</div><div class='add'>+    if (defrag) {</div><div class='add'>+        GF_OPTION_INIT("rebal-throttle", temp_str, str, err);</div><div class='add'>+        if (temp_str) {</div><div class='add'>+            ret = dht_configure_throttle(this, conf, temp_str);</div><div class='add'>+            if (ret == -1)</div><div class='add'>+                goto err;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    GF_OPTION_INIT("xattr-name", conf-&gt;xattr_name, str, err);</div><div class='add'>+    gf_asprintf(&amp;conf-&gt;mds_xattr_key, "%s." DHT_MDS_STR, conf-&gt;xattr_name);</div><div class='add'>+    gf_asprintf(&amp;conf-&gt;link_xattr_name, "%s." DHT_LINKFILE_STR,</div><div class='add'>+                conf-&gt;xattr_name);</div><div class='add'>+    gf_asprintf(&amp;conf-&gt;commithash_xattr_name, "%s." DHT_COMMITHASH_STR,</div><div class='add'>+                conf-&gt;xattr_name);</div><div class='add'>+    gf_asprintf(&amp;conf-&gt;wild_xattr_name, "%s*", conf-&gt;xattr_name);</div><div class='add'>+    if (!conf-&gt;link_xattr_name || !conf-&gt;wild_xattr_name) {</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    GF_OPTION_INIT("weighted-rebalance", conf-&gt;do_weighting, bool, err);</div><div class='add'>+</div><div class='add'>+    conf-&gt;lock_pool = mem_pool_new(dht_lock_t, 512);</div><div class='add'>+    if (!conf-&gt;lock_pool) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_ERROR, 0, DHT_MSG_INIT_FAILED,</div><div class='add'>+               "failed to create lock mem_pool, failing "</div><div class='add'>+               "initialization");</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    this-&gt;private = conf;</div><div class='add'>+</div><div class='add'>+    if (dht_set_subvol_range(this))</div><div class='add'>+        goto err;</div><div class='add'>+</div><div class='add'>+    if (dht_init_methods(this))</div><div class='add'>+        goto err;</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+</div><div class='add'>+err:</div><div class='add'>+    if (conf) {</div><div class='add'>+        if (conf-&gt;file_layouts) {</div><div class='add'>+            for (i = 0; i &lt; conf-&gt;subvolume_cnt; i++) {</div><div class='add'>+                GF_FREE(conf-&gt;file_layouts[i]);</div><div class='add'>+            }</div><div class='add'>+            GF_FREE(conf-&gt;file_layouts);</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        GF_FREE(conf-&gt;subvolumes);</div><div class='add'>+</div><div class='add'>+        GF_FREE(conf-&gt;subvolume_status);</div><div class='add'>+</div><div class='add'>+        GF_FREE(conf-&gt;du_stats);</div><div class='add'>+</div><div class='add'>+        GF_FREE(conf-&gt;defrag);</div><div class='add'>+</div><div class='add'>+        GF_FREE(conf-&gt;xattr_name);</div><div class='add'>+        GF_FREE(conf-&gt;link_xattr_name);</div><div class='add'>+        GF_FREE(conf-&gt;wild_xattr_name);</div><div class='add'>+        GF_FREE(conf-&gt;mds_xattr_key);</div><div class='add'>+</div><div class='add'>+        if (conf-&gt;lock_pool)</div><div class='add'>+            mem_pool_destroy(conf-&gt;lock_pool);</div><div class='add'>+</div><div class='add'>+        GF_FREE(conf);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return -1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+struct volume_options dht_options[] = {</div><div class='add'>+    {</div><div class='add'>+        .key = {"lookup-unhashed"},</div><div class='add'>+        .value = {"auto", "yes", "no", "enable", "disable", "1", "0", "on",</div><div class='add'>+                  "off"},</div><div class='add'>+        .type = GF_OPTION_TYPE_STR,</div><div class='add'>+        .default_value = "on",</div><div class='add'>+        .description =</div><div class='add'>+            "This option if set to ON, does a lookup through "</div><div class='add'>+            "all the sub-volumes, in case a lookup didn't return any result "</div><div class='add'>+            "from the hash subvolume. If set to OFF, it does not do a lookup "</div><div class='add'>+            "on the remaining subvolumes.",</div><div class='add'>+        .op_version = {1},</div><div class='add'>+        .flags = OPT_FLAG_CLIENT_OPT | OPT_FLAG_SETTABLE,</div><div class='add'>+        .level = OPT_STATUS_BASIC,</div><div class='add'>+    },</div><div class='add'>+    {.key = {"lookup-optimize"},</div><div class='add'>+     .type = GF_OPTION_TYPE_BOOL,</div><div class='add'>+     .default_value = "on",</div><div class='add'>+     .description =</div><div class='add'>+         "This option if set to ON enables the optimization "</div><div class='add'>+         "of -ve lookups, by not doing a lookup on non-hashed subvolumes for "</div><div class='add'>+         "files, in case the hashed subvolume does not return any result. "</div><div class='add'>+         "This option disregards the lookup-unhashed setting, when enabled.",</div><div class='add'>+     .op_version = {GD_OP_VERSION_3_7_2},</div><div class='add'>+     .level = OPT_STATUS_ADVANCED,</div><div class='add'>+     .flags = OPT_FLAG_CLIENT_OPT | OPT_FLAG_SETTABLE | OPT_FLAG_DOC},</div><div class='add'>+    {.key = {"min-free-disk"},</div><div class='add'>+     .type = GF_OPTION_TYPE_PERCENT_OR_SIZET,</div><div class='add'>+     .default_value = "10%",</div><div class='add'>+     .description =</div><div class='add'>+         "Percentage/Size of disk space, after which the "</div><div class='add'>+         "process starts balancing out the cluster, and logs will appear "</div><div class='add'>+         "in log files",</div><div class='add'>+     .op_version = {1},</div><div class='add'>+     .level = OPT_STATUS_BASIC,</div><div class='add'>+     .flags = OPT_FLAG_CLIENT_OPT | OPT_FLAG_SETTABLE | OPT_FLAG_DOC},</div><div class='add'>+    {.key = {"min-free-inodes"},</div><div class='add'>+     .type = GF_OPTION_TYPE_PERCENT,</div><div class='add'>+     .default_value = "5%",</div><div class='add'>+     .description = "after system has only N% of inodes, warnings "</div><div class='add'>+                    "starts to appear in log files",</div><div class='add'>+     .op_version = {1},</div><div class='add'>+     .level = OPT_STATUS_BASIC,</div><div class='add'>+     .flags = OPT_FLAG_CLIENT_OPT | OPT_FLAG_SETTABLE | OPT_FLAG_DOC},</div><div class='add'>+    {</div><div class='add'>+        .key = {"unhashed-sticky-bit"},</div><div class='add'>+        .type = GF_OPTION_TYPE_BOOL,</div><div class='add'>+        .default_value = "off",</div><div class='add'>+    },</div><div class='add'>+    {.key = {"use-readdirp"},</div><div class='add'>+     .type = GF_OPTION_TYPE_BOOL,</div><div class='add'>+     .default_value = "on",</div><div class='add'>+     .description = "This option if set to ON, forces the use of "</div><div class='add'>+                    "readdirp, and hence also displays the stats of the files.",</div><div class='add'>+     .level = OPT_STATUS_ADVANCED,</div><div class='add'>+     .flags = OPT_FLAG_CLIENT_OPT | OPT_FLAG_SETTABLE | OPT_FLAG_DOC},</div><div class='add'>+    {.key = {"assert-no-child-down"},</div><div class='add'>+     .type = GF_OPTION_TYPE_BOOL,</div><div class='add'>+     .default_value = "off",</div><div class='add'>+     .description = "This option if set to ON, in the event of "</div><div class='add'>+                    "CHILD_DOWN, will call exit."},</div><div class='add'>+    {</div><div class='add'>+        .key = {"directory-layout-spread"},</div><div class='add'>+        .type = GF_OPTION_TYPE_INT,</div><div class='add'>+        .min = 1,</div><div class='add'>+        .validate = GF_OPT_VALIDATE_MIN,</div><div class='add'>+        .description = "Specifies the directory layout spread. Takes number "</div><div class='add'>+                       "of subvolumes as default value.",</div><div class='add'>+</div><div class='add'>+        .op_version = {2},</div><div class='add'>+    },</div><div class='add'>+    {</div><div class='add'>+        .key = {"decommissioned-bricks"},</div><div class='add'>+        .type = GF_OPTION_TYPE_ANY,</div><div class='add'>+        .description =</div><div class='add'>+            "This option if set to ON, decommissions "</div><div class='add'>+            "the brick, so that no new data is allowed to be created "</div><div class='add'>+            "on that brick.",</div><div class='add'>+        .level = OPT_STATUS_ADVANCED,</div><div class='add'>+    },</div><div class='add'>+    {</div><div class='add'>+        .key = {"rebalance-cmd"},</div><div class='add'>+        .type = GF_OPTION_TYPE_INT,</div><div class='add'>+    },</div><div class='add'>+    {</div><div class='add'>+        .key = {"commit-hash"},</div><div class='add'>+        .type = GF_OPTION_TYPE_INT,</div><div class='add'>+    },</div><div class='add'>+    {</div><div class='add'>+        .key = {"node-uuid"},</div><div class='add'>+        .type = GF_OPTION_TYPE_STR,</div><div class='add'>+    },</div><div class='add'>+    {</div><div class='add'>+        .key = {"rebalance-stats"},</div><div class='add'>+        .type = GF_OPTION_TYPE_BOOL,</div><div class='add'>+        .default_value = "off",</div><div class='add'>+        .description =</div><div class='add'>+            "This option if set to ON displays and logs the "</div><div class='add'>+            " time taken for migration of each file, during the rebalance "</div><div class='add'>+            "process. If set to OFF, the rebalance logs will only display the "</div><div class='add'>+            "time spent in each directory.",</div><div class='add'>+        .op_version = {2},</div><div class='add'>+        .level = OPT_STATUS_BASIC,</div><div class='add'>+    },</div><div class='add'>+    {.key = {"readdir-optimize"},</div><div class='add'>+     .type = GF_OPTION_TYPE_BOOL,</div><div class='add'>+     .default_value = "off",</div><div class='add'>+     .description =</div><div class='add'>+         "This option if set to ON enables the optimization "</div><div class='add'>+         "that allows DHT to requests non-first subvolumes to filter out "</div><div class='add'>+         "directory entries.",</div><div class='add'>+     .op_version = {1},</div><div class='add'>+     .level = OPT_STATUS_ADVANCED,</div><div class='add'>+     .flags = OPT_FLAG_CLIENT_OPT | OPT_FLAG_SETTABLE | OPT_FLAG_DOC},</div><div class='add'>+    {.key = {"rsync-hash-regex"},</div><div class='add'>+     .type = GF_OPTION_TYPE_STR,</div><div class='add'>+     /* Setting a default here doesn't work.  See dht_init_regex. */</div><div class='add'>+     .description =</div><div class='add'>+         "Regular expression for stripping temporary-file "</div><div class='add'>+         "suffix and prefix used by rsync, to prevent relocation when the "</div><div class='add'>+         "file is renamed.",</div><div class='add'>+     .op_version = {3},</div><div class='add'>+     .level = OPT_STATUS_BASIC,</div><div class='add'>+     .flags = OPT_FLAG_CLIENT_OPT | OPT_FLAG_SETTABLE | OPT_FLAG_DOC},</div><div class='add'>+    {.key = {"extra-hash-regex"},</div><div class='add'>+     .type = GF_OPTION_TYPE_STR,</div><div class='add'>+     /* Setting a default here doesn't work.  See dht_init_regex. */</div><div class='add'>+     .description =</div><div class='add'>+         "Regular expression for stripping temporary-file "</div><div class='add'>+         "suffix and prefix used by an application, to prevent relocation when "</div><div class='add'>+         "the file is renamed.",</div><div class='add'>+     .op_version = {3},</div><div class='add'>+     .level = OPT_STATUS_BASIC,</div><div class='add'>+     .flags = OPT_FLAG_CLIENT_OPT | OPT_FLAG_SETTABLE | OPT_FLAG_DOC},</div><div class='add'>+    {</div><div class='add'>+        .key = {"rebalance-filter"},</div><div class='add'>+        .type = GF_OPTION_TYPE_STR,</div><div class='add'>+    },</div><div class='add'>+</div><div class='add'>+    {</div><div class='add'>+        .key = {"xattr-name"},</div><div class='add'>+        .type = GF_OPTION_TYPE_STR,</div><div class='add'>+        .default_value = "trusted.glusterfs.dht",</div><div class='add'>+        .description =</div><div class='add'>+            "Base for extended attributes used by this "</div><div class='add'>+            "translator instance, to avoid conflicts with others above or "</div><div class='add'>+            "below it.",</div><div class='add'>+        .op_version = {3},</div><div class='add'>+    },</div><div class='add'>+</div><div class='add'>+    {.key = {"weighted-rebalance"},</div><div class='add'>+     .type = GF_OPTION_TYPE_BOOL,</div><div class='add'>+     .default_value = "on",</div><div class='add'>+     .description =</div><div class='add'>+         "When enabled, files will be allocated to bricks "</div><div class='add'>+         "with a probability proportional to their size.  Otherwise, all "</div><div class='add'>+         "bricks will have the same probability (legacy behavior).",</div><div class='add'>+     .op_version = {GD_OP_VERSION_3_6_0},</div><div class='add'>+     .level = OPT_STATUS_BASIC,</div><div class='add'>+     .flags = OPT_FLAG_CLIENT_OPT | OPT_FLAG_SETTABLE | OPT_FLAG_DOC},</div><div class='add'>+</div><div class='add'>+    /* NUFA option */</div><div class='add'>+    {.key = {"local-volume-name"}, .type = GF_OPTION_TYPE_XLATOR},</div><div class='add'>+</div><div class='add'>+    /* switch option */</div><div class='add'>+    {.key = {"pattern.switch.case"}, .type = GF_OPTION_TYPE_ANY},</div><div class='add'>+</div><div class='add'>+    {</div><div class='add'>+        .key = {"randomize-hash-range-by-gfid"},</div><div class='add'>+        .type = GF_OPTION_TYPE_BOOL,</div><div class='add'>+        .default_value = "off",</div><div class='add'>+        .description =</div><div class='add'>+            "Use gfid of directory to determine the subvolume "</div><div class='add'>+            "from which hash ranges are allocated starting with 0. "</div><div class='add'>+            "Note that we still use a directory/file's name to determine the "</div><div class='add'>+            "subvolume to which it hashes",</div><div class='add'>+        .op_version = {GD_OP_VERSION_3_6_0},</div><div class='add'>+    },</div><div class='add'>+</div><div class='add'>+    {.key = {"rebal-throttle"},</div><div class='add'>+     .type = GF_OPTION_TYPE_STR,</div><div class='add'>+     .default_value = "normal",</div><div class='add'>+     .description = " Sets the maximum number of parallel file migrations "</div><div class='add'>+                    "allowed on a node during the rebalance operation. The"</div><div class='add'>+                    " default value is normal and allows a max of "</div><div class='add'>+                    "[($(processing units) - 4) / 2), 2]  files to be "</div><div class='add'>+                    "migrated at a time. Lazy will allow only one file to "</div><div class='add'>+                    "be migrated at a time and aggressive will allow "</div><div class='add'>+                    "max of [($(processing units) - 4) / 2), 4]",</div><div class='add'>+     .op_version = {GD_OP_VERSION_3_7_0},</div><div class='add'>+     .level = OPT_STATUS_BASIC,</div><div class='add'>+     .flags = OPT_FLAG_CLIENT_OPT | OPT_FLAG_SETTABLE | OPT_FLAG_DOC</div><div class='add'>+</div><div class='add'>+    },</div><div class='add'>+</div><div class='add'>+    {.key = {"lock-migration"},</div><div class='add'>+     .type = GF_OPTION_TYPE_BOOL,</div><div class='add'>+     .default_value = "off",</div><div class='add'>+     .description = " If enabled this feature will migrate the posix locks"</div><div class='add'>+                    " associated with a file during rebalance",</div><div class='add'>+     .op_version = {GD_OP_VERSION_3_8_0},</div><div class='add'>+     .level = OPT_STATUS_ADVANCED,</div><div class='add'>+     .flags = OPT_FLAG_CLIENT_OPT | OPT_FLAG_SETTABLE | OPT_FLAG_DOC},</div><div class='add'>+</div><div class='add'>+    {.key = {"force-migration"},</div><div class='add'>+     .type = GF_OPTION_TYPE_BOOL,</div><div class='add'>+     .default_value = "off",</div><div class='add'>+     .description = "If disabled, rebalance will not migrate files that "</div><div class='add'>+                    "are being written to by an application",</div><div class='add'>+     .op_version = {GD_OP_VERSION_4_0_0},</div><div class='add'>+     .level = OPT_STATUS_ADVANCED,</div><div class='add'>+     .flags = OPT_FLAG_CLIENT_OPT | OPT_FLAG_SETTABLE | OPT_FLAG_DOC},</div><div class='add'>+</div><div class='add'>+    {.key = {NULL}},</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+#define NUM_DHT_OPTIONS (sizeof(dht_options) / sizeof(dht_options[0]))</div><div class='add'>+</div><div class='add'>+extern struct volume_options options[NUM_DHT_OPTIONS]</div><div class='add'>+    __attribute__((alias("dht_options")));</div><div class='head'>diff --git a/xlators/cluster/dht/src/dht.c b/xlators/cluster/dht/src/dht.c<br/>index c926a1cf400..53de8292704 100644<br/>--- a/<a href='/cgit/glusterfs.git/tree/xlators/cluster/dht/src/dht.c?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/cluster/dht/src/dht.c</a><br/>+++ b/<a href='/cgit/glusterfs.git/tree/xlators/cluster/dht/src/dht.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>xlators/cluster/dht/src/dht.c</a></div><div class='hunk'>@@ -1,449 +1,123 @@</div><div class='ctx'> /*</div><div class='del'>-   Copyright (c) 2008-2009 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='del'>-   This file is part of GlusterFS.</div><div class='add'>+  Copyright (c) 2008-2012 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='ctx'> </div><div class='del'>-   GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-   it under the terms of the GNU General Public License as published</div><div class='del'>-   by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-   or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-   GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-   WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-   General Public License for more details.</div><div class='del'>-</div><div class='del'>-   You should have received a copy of the GNU General Public License</div><div class='del'>-   along with this program.  If not, see</div><div class='del'>-   &lt;http://www.gnu.org/licenses/&gt;.</div><div class='del'>-*/</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-#ifndef _CONFIG_H</div><div class='del'>-#define _CONFIG_H</div><div class='del'>-#include "config.h"</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-/* TODO: add NS locking */</div><div class='del'>-</div><div class='del'>-#include "statedump.h"</div><div class='del'>-#include "dht-common.c"</div><div class='del'>-</div><div class='del'>-/* TODO:</div><div class='del'>-   - use volumename in xattr instead of "dht"</div><div class='del'>-   - use NS locks</div><div class='del'>-   - handle all cases in self heal layout reconstruction</div><div class='del'>-   - complete linkfile selfheal</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='ctx'> */</div><div class='ctx'> </div><div class='del'>-</div><div class='del'>-void</div><div class='del'>-dht_layout_dump (dht_layout_t  *layout, const char *prefix)</div><div class='del'>-{</div><div class='del'>-</div><div class='del'>-        char    key[GF_DUMP_MAX_BUF_LEN];</div><div class='del'>-        int     i = 0;</div><div class='del'>-</div><div class='del'>-        if (!layout)</div><div class='del'>-                return;</div><div class='del'>-</div><div class='del'>-        gf_proc_dump_build_key(key, prefix, "cnt");</div><div class='del'>-        gf_proc_dump_write(key, "%d", layout-&gt;cnt);</div><div class='del'>-        gf_proc_dump_build_key(key, prefix, "preset");</div><div class='del'>-        gf_proc_dump_write(key, "%d", layout-&gt;preset);</div><div class='del'>-        gf_proc_dump_build_key(key, prefix, "gen");</div><div class='del'>-        gf_proc_dump_write(key, "%d", layout-&gt;gen);</div><div class='del'>-        gf_proc_dump_build_key(key, prefix, "type");</div><div class='del'>-        gf_proc_dump_write(key, "%d", layout-&gt;type);</div><div class='del'>-</div><div class='del'>-        for (i = 0; i &lt; layout-&gt;cnt; i++) {</div><div class='del'>-                gf_proc_dump_build_key(key, prefix,"list[%d].err", i);</div><div class='del'>-                gf_proc_dump_write(key, "%d", layout-&gt;list[i].err);</div><div class='del'>-                gf_proc_dump_build_key(key, prefix,"list[%d].start", i);</div><div class='del'>-                gf_proc_dump_write(key, "%u", layout-&gt;list[i].start);</div><div class='del'>-                gf_proc_dump_build_key(key, prefix,"list[%d].stop", i);</div><div class='del'>-                gf_proc_dump_write(key, "%u", layout-&gt;list[i].stop);</div><div class='del'>-                if (layout-&gt;list[i].xlator) {</div><div class='del'>-                        gf_proc_dump_build_key(key, prefix,</div><div class='del'>-                                               "list[%d].xlator.type", i);</div><div class='del'>-                        gf_proc_dump_write(key, "%s",</div><div class='del'>-                                           layout-&gt;list[i].xlator-&gt;type);</div><div class='del'>-                        gf_proc_dump_build_key(key, prefix,</div><div class='del'>-                                               "list[%d].xlator.name", i);</div><div class='del'>-                        gf_proc_dump_write(key, "%s",</div><div class='del'>-                                           layout-&gt;list[i].xlator-&gt;name);</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-dht_priv_dump (xlator_t *this)</div><div class='del'>-{</div><div class='del'>-	char            key_prefix[GF_DUMP_MAX_BUF_LEN];</div><div class='del'>-	char            key[GF_DUMP_MAX_BUF_LEN];</div><div class='del'>-        int             i = 0;</div><div class='del'>-        dht_conf_t      *conf = NULL;</div><div class='del'>-        int             ret = 0;</div><div class='del'>-</div><div class='del'>-        if (!this)</div><div class='del'>-                return -1;</div><div class='del'>-</div><div class='del'>-        conf = this-&gt;private;</div><div class='del'>-</div><div class='del'>-        if (!conf)</div><div class='del'>-                return -1;</div><div class='del'>-</div><div class='del'>-        ret = TRY_LOCK(&amp;conf-&gt;subvolume_lock);</div><div class='del'>-</div><div class='del'>-        if (ret != 0) {</div><div class='del'>-                gf_log("", GF_LOG_WARNING, "Unable to lock dht subvolume %s",</div><div class='del'>-                                this-&gt;name);</div><div class='del'>-                return ret;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        gf_proc_dump_add_section("xlator.cluster.dht.%s.priv", this-&gt;name);</div><div class='del'>-        gf_proc_dump_build_key(key_prefix,"xlator.cluster.dht","%s.priv",</div><div class='del'>-                               this-&gt;name);</div><div class='del'>-        gf_proc_dump_build_key(key, key_prefix, "subvolume_cnt");</div><div class='del'>-        gf_proc_dump_write(key,"%d", conf-&gt;subvolume_cnt);</div><div class='del'>-        for (i = 0; i &lt; conf-&gt;subvolume_cnt; i++) {</div><div class='del'>-                gf_proc_dump_build_key(key, key_prefix, "subvolumes[%d]", i);</div><div class='del'>-                gf_proc_dump_write(key, "%s.%s", conf-&gt;subvolumes[i]-&gt;type,</div><div class='del'>-                                   conf-&gt;subvolumes[i]-&gt;name);</div><div class='del'>-                if (conf-&gt;file_layouts &amp;&amp; conf-&gt;file_layouts[i]){</div><div class='del'>-                        gf_proc_dump_build_key(key, key_prefix,</div><div class='del'>-                                               "file_layouts[%d]",i);</div><div class='del'>-                        dht_layout_dump(conf-&gt;file_layouts[i], key);</div><div class='del'>-                }</div><div class='del'>-                if (conf-&gt;dir_layouts &amp;&amp; conf-&gt;dir_layouts[i]) {</div><div class='del'>-                        gf_proc_dump_build_key(key, key_prefix,</div><div class='del'>-                                              "dir_layouts[%d]",i);</div><div class='del'>-                        dht_layout_dump(conf-&gt;dir_layouts[i], key);</div><div class='del'>-                }</div><div class='del'>-                if (conf-&gt;subvolume_status) {</div><div class='del'>-                        gf_proc_dump_build_key(key, key_prefix,</div><div class='del'>-                                                "subvolume_status[%d]", i);</div><div class='del'>-                        gf_proc_dump_write(key, "%d",</div><div class='del'>-                                               (int)conf-&gt;subvolume_status[i]);</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        gf_proc_dump_build_key(key, key_prefix,"default_dir_layout");</div><div class='del'>-        dht_layout_dump(conf-&gt;default_dir_layout, key);</div><div class='del'>-</div><div class='del'>-        gf_proc_dump_build_key(key, key_prefix, "search_unhashed");</div><div class='del'>-        gf_proc_dump_write(key, "%d", conf-&gt;search_unhashed);</div><div class='del'>-        gf_proc_dump_build_key(key, key_prefix, "gen");</div><div class='del'>-        gf_proc_dump_write(key, "%d", conf-&gt;gen);</div><div class='del'>-        gf_proc_dump_build_key(key, key_prefix, "min_free_disk");</div><div class='del'>-        gf_proc_dump_write(key, "%lu", conf-&gt;min_free_disk);</div><div class='del'>-        gf_proc_dump_build_key(key, key_prefix, "disk_unit");</div><div class='del'>-        gf_proc_dump_write(key, "%c", conf-&gt;disk_unit);</div><div class='del'>-        gf_proc_dump_build_key(key, key_prefix, "refresh_interval");</div><div class='del'>-        gf_proc_dump_write(key, "%d", conf-&gt;refresh_interval);</div><div class='del'>-        gf_proc_dump_build_key(key, key_prefix, "unhashed_sticky_bit");</div><div class='del'>-        gf_proc_dump_write(key, "%d", conf-&gt;unhashed_sticky_bit);</div><div class='del'>-        if (conf -&gt;du_stats) {</div><div class='del'>-                gf_proc_dump_build_key(key, key_prefix,</div><div class='del'>-                                "du_stats.avail_percent");</div><div class='del'>-                gf_proc_dump_write(key, "%lf", conf-&gt;du_stats-&gt;avail_percent);</div><div class='del'>-                gf_proc_dump_build_key(key, key_prefix,</div><div class='del'>-                                "du_stats.avail_space");</div><div class='del'>-                gf_proc_dump_write(key, "%lu", conf-&gt;du_stats-&gt;avail_space);</div><div class='del'>-                gf_proc_dump_build_key(key, key_prefix,</div><div class='del'>-                                "du_stats.log");</div><div class='del'>-                gf_proc_dump_write(key, "%lu", conf-&gt;du_stats-&gt;log);</div><div class='del'>-        }</div><div class='del'>-        gf_proc_dump_build_key(key, key_prefix, "last_stat_fetch");</div><div class='del'>-        gf_proc_dump_write(key, "%s", ctime(&amp;conf-&gt;last_stat_fetch.tv_sec));</div><div class='del'>-</div><div class='del'>-        UNLOCK(&amp;conf-&gt;subvolume_lock);</div><div class='del'>-</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-dht_inodectx_dump (xlator_t *this, inode_t *inode)</div><div class='del'>-{</div><div class='del'>-        int             ret = -1;</div><div class='del'>-        char            key_prefix[GF_DUMP_MAX_BUF_LEN];</div><div class='del'>-        dht_layout_t    *layout = NULL;</div><div class='del'>-	uint64_t        tmp_layout = 0;</div><div class='del'>-</div><div class='del'>-        if (!inode)</div><div class='del'>-                return -1;</div><div class='del'>-</div><div class='del'>-	ret = inode_ctx_get (inode, this, &amp;tmp_layout);</div><div class='del'>-</div><div class='del'>-        if (ret != 0)</div><div class='del'>-                return ret;</div><div class='del'>-</div><div class='del'>-        layout = (dht_layout_t *)(long)tmp_layout;</div><div class='del'>-</div><div class='del'>-        if (!layout)</div><div class='del'>-                return -1;</div><div class='del'>-</div><div class='del'>-        gf_proc_dump_build_key(key_prefix, "xlator.cluster.dht",</div><div class='del'>-                               "%s.inode.%ld", this-&gt;name, inode-&gt;ino);</div><div class='del'>-        dht_layout_dump(layout, key_prefix);</div><div class='del'>-</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-notify (xlator_t *this, int event, void *data, ...)</div><div class='del'>-{</div><div class='del'>-	int ret = -1;</div><div class='del'>-</div><div class='del'>-	ret = dht_notify (this, event, data);</div><div class='del'>-</div><div class='del'>-	return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-void</div><div class='del'>-fini (xlator_t *this)</div><div class='del'>-{</div><div class='del'>-        int         i = 0;</div><div class='del'>-        dht_conf_t *conf = NULL;</div><div class='del'>-</div><div class='del'>-	conf = this-&gt;private;</div><div class='del'>-</div><div class='del'>-        if (conf) {</div><div class='del'>-                if (conf-&gt;file_layouts) {</div><div class='del'>-                        for (i = 0; i &lt; conf-&gt;subvolume_cnt; i++) {</div><div class='del'>-                                GF_FREE (conf-&gt;file_layouts[i]);</div><div class='del'>-                        }</div><div class='del'>-                        GF_FREE (conf-&gt;file_layouts);</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                if (conf-&gt;default_dir_layout)</div><div class='del'>-                        GF_FREE (conf-&gt;default_dir_layout);</div><div class='del'>-</div><div class='del'>-                if (conf-&gt;subvolumes)</div><div class='del'>-                        GF_FREE (conf-&gt;subvolumes);</div><div class='del'>-</div><div class='del'>-		if (conf-&gt;subvolume_status)</div><div class='del'>-			GF_FREE (conf-&gt;subvolume_status);</div><div class='del'>-</div><div class='del'>-                GF_FREE (conf);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-	return;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-mem_acct_init (xlator_t *this)</div><div class='del'>-{</div><div class='del'>-        int     ret = -1;</div><div class='del'>-</div><div class='del'>-        if (!this)</div><div class='del'>-                return ret;</div><div class='del'>-</div><div class='del'>-        ret = xlator_mem_acct_init (this, gf_dht_mt_end + 1);</div><div class='del'>-        </div><div class='del'>-        if (ret != 0) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_ERROR, "Memory accounting init"</div><div class='del'>-                                "failed");</div><div class='del'>-                return ret;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-init (xlator_t *this)</div><div class='del'>-{</div><div class='del'>-        dht_conf_t    *conf = NULL;</div><div class='del'>-	char          *temp_str = NULL;</div><div class='del'>-        int            ret = -1;</div><div class='del'>-        int            i = 0;</div><div class='del'>-        uint32_t       temp_free_disk = 0;</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-	if (!this-&gt;children) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_CRITICAL,</div><div class='del'>-			"Distribute needs more than one subvolume");</div><div class='del'>-		return -1;</div><div class='del'>-	}</div><div class='del'>-  </div><div class='del'>-	if (!this-&gt;parents) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_WARNING,</div><div class='del'>-			"dangling volume. check volfile");</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-        conf = GF_CALLOC (1, sizeof (*conf), gf_dht_mt_dht_conf_t);</div><div class='del'>-        if (!conf) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-                        "Out of memory");</div><div class='del'>-                goto err;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        conf-&gt;search_unhashed = GF_DHT_LOOKUP_UNHASHED_ON;</div><div class='del'>-	if (dict_get_str (this-&gt;options, "lookup-unhashed", &amp;temp_str) == 0) {</div><div class='del'>-                /* If option is not "auto", other options _should_ be boolean */</div><div class='del'>-                if (strcasecmp (temp_str, "auto"))</div><div class='del'>-                        gf_string2boolean (temp_str, &amp;conf-&gt;search_unhashed);</div><div class='del'>-                else</div><div class='del'>-                        conf-&gt;search_unhashed = GF_DHT_LOOKUP_UNHASHED_AUTO;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	conf-&gt;unhashed_sticky_bit = 0;</div><div class='del'>-</div><div class='del'>-	if (dict_get_str (this-&gt;options, "unhashed-sticky-bit", </div><div class='del'>-                          &amp;temp_str) == 0) {</div><div class='del'>-	        gf_string2boolean (temp_str, &amp;conf-&gt;unhashed_sticky_bit);</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	conf-&gt;use_readdirp = 0;</div><div class='del'>-</div><div class='del'>-	if (dict_get_str (this-&gt;options, "use-readdirp",</div><div class='del'>-                          &amp;temp_str) == 0) {</div><div class='del'>-	        gf_string2boolean (temp_str, &amp;conf-&gt;use_readdirp);</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-        conf-&gt;disk_unit = 'p';</div><div class='del'>-        conf-&gt;min_free_disk = 10;</div><div class='del'>-</div><div class='del'>-	if (dict_get_str (this-&gt;options, "min-free-disk", &amp;temp_str) == 0) {</div><div class='del'>-		if (gf_string2percent (temp_str, &amp;temp_free_disk) == 0) {</div><div class='del'>-                        if (temp_free_disk &gt; 100) {</div><div class='del'>-                                gf_string2bytesize (temp_str, </div><div class='del'>-                                                    &amp;conf-&gt;min_free_disk);</div><div class='del'>-                                conf-&gt;disk_unit = 'b';</div><div class='del'>-                        } else {</div><div class='del'>-                                conf-&gt;min_free_disk = (uint64_t)temp_free_disk;</div><div class='del'>-                        }</div><div class='del'>-                } else {</div><div class='del'>-                        gf_string2bytesize (temp_str, &amp;conf-&gt;min_free_disk);</div><div class='del'>-                        conf-&gt;disk_unit = 'b';</div><div class='del'>-                }</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-        ret = dht_init_subvolumes (this, conf);</div><div class='del'>-        if (ret == -1) {</div><div class='del'>-                goto err;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        ret = dht_layouts_init (this, conf);</div><div class='del'>-        if (ret == -1) {</div><div class='del'>-                goto err;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        conf-&gt;du_stats = GF_CALLOC (conf-&gt;subvolume_cnt, sizeof (dht_du_t),</div><div class='del'>-                                    gf_dht_mt_dht_du_t);</div><div class='del'>-        if (!conf-&gt;du_stats) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-                        "Out of memory");</div><div class='del'>-                goto err;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-	LOCK_INIT (&amp;conf-&gt;subvolume_lock);</div><div class='del'>-	LOCK_INIT (&amp;conf-&gt;layout_lock);</div><div class='del'>-</div><div class='del'>-	conf-&gt;gen = 1;</div><div class='del'>-</div><div class='del'>-        this-&gt;private = conf;</div><div class='del'>-</div><div class='del'>-        return 0;</div><div class='del'>-</div><div class='del'>-err:</div><div class='del'>-        if (conf) {</div><div class='del'>-                if (conf-&gt;file_layouts) {</div><div class='del'>-                        for (i = 0; i &lt; conf-&gt;subvolume_cnt; i++) {</div><div class='del'>-                                GF_FREE (conf-&gt;file_layouts[i]);</div><div class='del'>-                        }</div><div class='del'>-                        GF_FREE (conf-&gt;file_layouts);</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                if (conf-&gt;default_dir_layout)</div><div class='del'>-                        GF_FREE (conf-&gt;default_dir_layout);</div><div class='del'>-</div><div class='del'>-                if (conf-&gt;subvolumes)</div><div class='del'>-                        GF_FREE (conf-&gt;subvolumes);</div><div class='del'>-</div><div class='del'>-		if (conf-&gt;subvolume_status)</div><div class='del'>-			GF_FREE (conf-&gt;subvolume_status);</div><div class='del'>-</div><div class='del'>-                if (conf-&gt;du_stats)</div><div class='del'>-                        GF_FREE (conf-&gt;du_stats);</div><div class='del'>-</div><div class='del'>-                GF_FREE (conf);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        return -1;</div><div class='del'>-}</div><div class='del'>-</div><div class='add'>+#include "dht-common.h"</div><div class='add'>+</div><div class='add'>+struct xlator_fops dht_pt_fops = {</div><div class='add'>+    /* we need to keep mkdir to make sure we</div><div class='add'>+       have layout on new directory */</div><div class='add'>+    .mkdir = dht_pt_mkdir,</div><div class='add'>+    .getxattr = dht_pt_getxattr,</div><div class='add'>+    .fgetxattr = dht_pt_fgetxattr,</div><div class='add'>+</div><div class='add'>+    /* required to trace fop properly in changelog */</div><div class='add'>+    .rename = dht_pt_rename,</div><div class='add'>+</div><div class='add'>+    /* FIXME: commenting the '.lookup()' below made some of</div><div class='add'>+       the failing tests to pass. I would remove the below</div><div class='add'>+       line, but keeping it here as a reminder for people</div><div class='add'>+       to check for issues if they find concerns with DHT</div><div class='add'>+       pass-through logic  */</div><div class='add'>+    /*</div><div class='add'>+      .lookup = dht_lookup,</div><div class='add'>+      .readdir = dht_readdir,</div><div class='add'>+      .readdirp = dht_readdirp,</div><div class='add'>+    */</div><div class='add'>+    /* Keeping above as commented, mainly to support the</div><div class='add'>+       usecase of a gluster volume getting to 1x(anytype),</div><div class='add'>+       due to remove-brick (shrinking) exercise. In that case,</div><div class='add'>+       we would need above fops to be available, so we can</div><div class='add'>+       handle the case of dangling linkto files (if any) */</div><div class='add'>+};</div><div class='ctx'> </div><div class='ctx'> struct xlator_fops fops = {</div><div class='del'>-	.lookup      = dht_lookup,</div><div class='del'>-	.mknod       = dht_mknod,</div><div class='del'>-	.create      = dht_create,</div><div class='del'>-</div><div class='del'>-	.stat        = dht_stat,</div><div class='del'>-	.fstat       = dht_fstat,</div><div class='del'>-	.truncate    = dht_truncate,</div><div class='del'>-	.ftruncate   = dht_ftruncate,</div><div class='del'>-	.access      = dht_access,</div><div class='del'>-	.readlink    = dht_readlink,</div><div class='del'>-	.setxattr    = dht_setxattr,</div><div class='del'>-	.getxattr    = dht_getxattr,</div><div class='del'>-	.removexattr = dht_removexattr,</div><div class='del'>-	.open        = dht_open,</div><div class='del'>-	.readv       = dht_readv,</div><div class='del'>-	.writev      = dht_writev,</div><div class='del'>-	.flush       = dht_flush,</div><div class='del'>-	.fsync       = dht_fsync,</div><div class='del'>-	.statfs      = dht_statfs,</div><div class='del'>-	.lk          = dht_lk,</div><div class='del'>-	.opendir     = dht_opendir,</div><div class='del'>-	.readdir     = dht_readdir,</div><div class='del'>-	.readdirp    = dht_readdirp,</div><div class='del'>-	.fsyncdir    = dht_fsyncdir,</div><div class='del'>-	.symlink     = dht_symlink,</div><div class='del'>-	.unlink      = dht_unlink,</div><div class='del'>-	.link        = dht_link,</div><div class='del'>-	.mkdir       = dht_mkdir,</div><div class='del'>-	.rmdir       = dht_rmdir,</div><div class='del'>-	.rename      = dht_rename,</div><div class='del'>-	.inodelk     = dht_inodelk,</div><div class='del'>-	.finodelk    = dht_finodelk,</div><div class='del'>-	.entrylk     = dht_entrylk,</div><div class='del'>-	.fentrylk    = dht_fentrylk,</div><div class='del'>-	.xattrop     = dht_xattrop,</div><div class='del'>-	.fxattrop    = dht_fxattrop,</div><div class='del'>-        .setattr     = dht_setattr, </div><div class='del'>-        .fsetattr    = dht_fsetattr,</div><div class='add'>+    .ipc = dht_ipc,</div><div class='add'>+    .lookup = dht_lookup,</div><div class='add'>+    .mknod = dht_mknod,</div><div class='add'>+    .create = dht_create,</div><div class='add'>+</div><div class='add'>+    .open = dht_open,</div><div class='add'>+    .statfs = dht_statfs,</div><div class='add'>+    .opendir = dht_opendir,</div><div class='add'>+    .readdir = dht_readdir,</div><div class='add'>+    .readdirp = dht_readdirp,</div><div class='add'>+    .fsyncdir = dht_fsyncdir,</div><div class='add'>+    .symlink = dht_symlink,</div><div class='add'>+    .unlink = dht_unlink,</div><div class='add'>+    .link = dht_link,</div><div class='add'>+    .mkdir = dht_mkdir,</div><div class='add'>+    .rmdir = dht_rmdir,</div><div class='add'>+    .rename = dht_rename,</div><div class='add'>+    .entrylk = dht_entrylk,</div><div class='add'>+    .fentrylk = dht_fentrylk,</div><div class='add'>+</div><div class='add'>+    /* Inode read operations */</div><div class='add'>+    .stat = dht_stat,</div><div class='add'>+    .fstat = dht_fstat,</div><div class='add'>+    .access = dht_access,</div><div class='add'>+    .readlink = dht_readlink,</div><div class='add'>+    .getxattr = dht_getxattr,</div><div class='add'>+    .fgetxattr = dht_fgetxattr,</div><div class='add'>+    .readv = dht_readv,</div><div class='add'>+    .flush = dht_flush,</div><div class='add'>+    .fsync = dht_fsync,</div><div class='add'>+    .inodelk = dht_inodelk,</div><div class='add'>+    .finodelk = dht_finodelk,</div><div class='add'>+    .lk = dht_lk,</div><div class='add'>+    .lease = dht_lease,</div><div class='add'>+</div><div class='add'>+    /* Inode write operations */</div><div class='add'>+    .fremovexattr = dht_fremovexattr,</div><div class='add'>+    .removexattr = dht_removexattr,</div><div class='add'>+    .setxattr = dht_setxattr,</div><div class='add'>+    .fsetxattr = dht_fsetxattr,</div><div class='add'>+    .truncate = dht_truncate,</div><div class='add'>+    .ftruncate = dht_ftruncate,</div><div class='add'>+    .writev = dht_writev,</div><div class='add'>+    .xattrop = dht_xattrop,</div><div class='add'>+    .fxattrop = dht_fxattrop,</div><div class='add'>+    .setattr = dht_setattr,</div><div class='add'>+    .fsetattr = dht_fsetattr,</div><div class='add'>+    .fallocate = dht_fallocate,</div><div class='add'>+    .discard = dht_discard,</div><div class='add'>+    .zerofill = dht_zerofill,</div><div class='ctx'> };</div><div class='ctx'> </div><div class='ctx'> struct xlator_dumpops dumpops = {</div><div class='del'>-        .priv = dht_priv_dump,</div><div class='del'>-        .inodectx = dht_inodectx_dump,</div><div class='add'>+    .priv = dht_priv_dump,</div><div class='add'>+    .inodectx = dht_inodectx_dump,</div><div class='ctx'> };</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> struct xlator_cbks cbks = {</div><div class='del'>-//	.release    = dht_release,</div><div class='del'>-//      .releasedir = dht_releasedir,</div><div class='del'>-	.forget     = dht_forget</div><div class='add'>+    .release = dht_release,</div><div class='add'>+    //      .releasedir = dht_releasedir,</div><div class='add'>+    .forget = dht_forget,</div><div class='ctx'> };</div><div class='ctx'> </div><div class='del'>-</div><div class='del'>-struct volume_options options[] = {</div><div class='del'>-        { .key  = {"lookup-unhashed"},</div><div class='del'>-          .value = {"auto", "yes", "no", "enable", "disable", "1", "0",</div><div class='del'>-                    "on", "off"},</div><div class='del'>-	  .type = GF_OPTION_TYPE_STR</div><div class='del'>-	},</div><div class='del'>-        { .key  = {"min-free-disk"},</div><div class='del'>-          .type = GF_OPTION_TYPE_PERCENT_OR_SIZET,</div><div class='del'>-        },</div><div class='del'>-        { .key = {"unhashed-sticky-bit"},</div><div class='del'>-          .type = GF_OPTION_TYPE_BOOL</div><div class='del'>-        },</div><div class='del'>-        { .key = {"use-readdirp"},</div><div class='del'>-          .type = GF_OPTION_TYPE_BOOL</div><div class='del'>-        },</div><div class='del'>-	{ .key  = {NULL} },</div><div class='add'>+extern int32_t</div><div class='add'>+mem_acct_init(xlator_t *this);</div><div class='add'>+</div><div class='add'>+extern struct volume_options dht_options[];</div><div class='add'>+</div><div class='add'>+xlator_api_t xlator_api = {</div><div class='add'>+    .init = dht_init,</div><div class='add'>+    .fini = dht_fini,</div><div class='add'>+    .notify = dht_notify,</div><div class='add'>+    .reconfigure = dht_reconfigure,</div><div class='add'>+    .mem_acct_init = mem_acct_init,</div><div class='add'>+    .op_version = {1}, /* Present from the initial version */</div><div class='add'>+    .dumpops = &amp;dumpops,</div><div class='add'>+    .fops = &amp;fops,</div><div class='add'>+    .cbks = &amp;cbks,</div><div class='add'>+    .options = dht_options,</div><div class='add'>+    .identifier = "distribute",</div><div class='add'>+    .pass_through_fops = &amp;dht_pt_fops,</div><div class='add'>+    .category = GF_MAINTAINED,</div><div class='ctx'> };</div><div class='head'>diff --git a/xlators/cluster/dht/src/nufa.c b/xlators/cluster/dht/src/nufa.c<br/>index 190fbae695e..3648a564840 100644<br/>--- a/<a href='/cgit/glusterfs.git/tree/xlators/cluster/dht/src/nufa.c?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/cluster/dht/src/nufa.c</a><br/>+++ b/<a href='/cgit/glusterfs.git/tree/xlators/cluster/dht/src/nufa.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>xlators/cluster/dht/src/nufa.c</a></div><div class='hunk'>@@ -1,762 +1,657 @@</div><div class='ctx'> /*</div><div class='del'>-   Copyright (c) 2008-2009 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='del'>-   This file is part of GlusterFS.</div><div class='del'>-</div><div class='del'>-   GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-   it under the terms of the GNU General Public License as published</div><div class='del'>-   by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-   or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-   GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-   WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-   General Public License for more details.</div><div class='del'>-</div><div class='del'>-   You should have received a copy of the GNU General Public License</div><div class='del'>-   along with this program.  If not, see</div><div class='del'>-   &lt;http://www.gnu.org/licenses/&gt;.</div><div class='del'>-*/</div><div class='del'>-</div><div class='add'>+  Copyright (c) 2008-2012 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='ctx'> </div><div class='del'>-#ifndef _CONFIG_H</div><div class='del'>-#define _CONFIG_H</div><div class='del'>-#include "config.h"</div><div class='del'>-#endif</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='ctx'> </div><div class='del'>-#include "dht-common.c"</div><div class='add'>+#include "dht-common.h"</div><div class='ctx'> </div><div class='ctx'> /* TODO: all 'TODO's in dht.c holds good */</div><div class='ctx'> </div><div class='add'>+extern struct volume_options dht_options[];</div><div class='add'>+</div><div class='ctx'> int</div><div class='del'>-nufa_local_lookup_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-		       int op_ret, int op_errno,</div><div class='del'>-                       inode_t *inode, struct iatt *stbuf, dict_t *xattr,</div><div class='del'>-                       struct iatt *postparent)</div><div class='add'>+nufa_local_lookup_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                      int op_ret, int op_errno, inode_t *inode,</div><div class='add'>+                      struct iatt *stbuf, dict_t *xattr,</div><div class='add'>+                      struct iatt *postparent)</div><div class='ctx'> {</div><div class='del'>-        xlator_t     *subvol      = NULL;</div><div class='del'>-        char          is_linkfile = 0;</div><div class='del'>-        char          is_dir      = 0;</div><div class='del'>-        dht_conf_t   *conf        = NULL;</div><div class='del'>-        dht_local_t  *local       = NULL;</div><div class='del'>-        loc_t        *loc         = NULL;</div><div class='del'>-        int           i           = 0;</div><div class='del'>-        call_frame_t *prev        = NULL;</div><div class='del'>-	int           call_cnt    = 0;</div><div class='del'>-        int           ret         = 0;</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-        conf  = this-&gt;private;</div><div class='del'>-</div><div class='del'>-        prev  = cookie;</div><div class='del'>-        local = frame-&gt;local;</div><div class='del'>-        loc   = &amp;local-&gt;loc;</div><div class='del'>-</div><div class='del'>-	if (ENTRY_MISSING (op_ret, op_errno)) {</div><div class='del'>-		if (conf-&gt;search_unhashed) {</div><div class='del'>-			local-&gt;op_errno = ENOENT;</div><div class='del'>-			dht_lookup_everywhere (frame, this, loc);</div><div class='del'>-			return 0;</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-        if (op_ret == -1)</div><div class='del'>-                goto out;</div><div class='del'>-</div><div class='del'>-        is_linkfile = check_is_linkfile (inode, stbuf, xattr);</div><div class='del'>-        is_dir      = check_is_dir (inode, stbuf, xattr);</div><div class='del'>-</div><div class='del'>-        if (!is_dir &amp;&amp; !is_linkfile) {</div><div class='del'>-                /* non-directory and not a linkfile */</div><div class='del'>-</div><div class='del'>-		dht_itransform (this, prev-&gt;this, stbuf-&gt;ia_ino,</div><div class='del'>-				&amp;stbuf-&gt;ia_ino);</div><div class='del'>-</div><div class='del'>-		ret = dht_layout_preset (this, prev-&gt;this, inode);</div><div class='del'>-		if (ret &lt; 0) {</div><div class='del'>-			gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-				"could not set pre-set layout for subvol %s",</div><div class='del'>-				prev-&gt;this-&gt;name);</div><div class='del'>-			op_ret   = -1;</div><div class='del'>-			op_errno = EINVAL;</div><div class='del'>-			goto err;</div><div class='del'>-		}</div><div class='del'>-</div><div class='del'>-                goto out;</div><div class='add'>+    xlator_t *subvol = NULL;</div><div class='add'>+    char is_linkfile = 0;</div><div class='add'>+    char is_dir = 0;</div><div class='add'>+    dht_conf_t *conf = NULL;</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    loc_t *loc = NULL;</div><div class='add'>+    int i = 0;</div><div class='add'>+    xlator_t *prev = NULL;</div><div class='add'>+    int call_cnt = 0;</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    conf = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    prev = cookie;</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    loc = &amp;local-&gt;loc;</div><div class='add'>+</div><div class='add'>+    if (ENTRY_MISSING(op_ret, op_errno)) {</div><div class='add'>+        if (conf-&gt;search_unhashed) {</div><div class='add'>+            local-&gt;op_errno = ENOENT;</div><div class='add'>+            dht_lookup_everywhere(frame, this, loc);</div><div class='add'>+            return 0;</div><div class='ctx'>         }</div><div class='del'>-</div><div class='del'>-        if (is_dir) {</div><div class='del'>-                call_cnt        = conf-&gt;subvolume_cnt;</div><div class='del'>-		local-&gt;call_cnt = call_cnt;</div><div class='del'>-</div><div class='del'>-                local-&gt;inode = inode_ref (inode);</div><div class='del'>-                local-&gt;xattr = dict_ref (xattr);</div><div class='del'>-</div><div class='del'>-		local-&gt;op_ret = 0;</div><div class='del'>-		local-&gt;op_errno = 0;</div><div class='del'>-</div><div class='del'>-		local-&gt;layout = dht_layout_new (this, conf-&gt;subvolume_cnt);</div><div class='del'>-		if (!local-&gt;layout) {</div><div class='del'>-			op_ret   = -1;</div><div class='del'>-			op_errno = ENOMEM;</div><div class='del'>-			gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-				"memory allocation failed :(");</div><div class='del'>-			goto err;</div><div class='del'>-		}</div><div class='del'>-</div><div class='del'>-                for (i = 0; i &lt; call_cnt; i++) {</div><div class='del'>-                        STACK_WIND (frame, dht_lookup_dir_cbk,</div><div class='del'>-                                    conf-&gt;subvolumes[i],</div><div class='del'>-                                    conf-&gt;subvolumes[i]-&gt;fops-&gt;lookup,</div><div class='del'>-                                    &amp;local-&gt;loc, local-&gt;xattr_req);</div><div class='del'>-                }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (op_ret == -1)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    is_linkfile = check_is_linkfile(inode, stbuf, xattr, conf-&gt;link_xattr_name);</div><div class='add'>+    is_dir = check_is_dir(inode, stbuf, xattr);</div><div class='add'>+</div><div class='add'>+    if (!is_dir &amp;&amp; !is_linkfile) {</div><div class='add'>+        /* non-directory and not a linkfile */</div><div class='add'>+        ret = dht_layout_preset(this, prev, inode);</div><div class='add'>+        if (ret &lt; 0) {</div><div class='add'>+            gf_msg_debug(this-&gt;name, 0,</div><div class='add'>+                         "could not set pre-set layout for subvol"</div><div class='add'>+                         " %s",</div><div class='add'>+                         prev-&gt;name);</div><div class='add'>+            op_ret = -1;</div><div class='add'>+            op_errno = EINVAL;</div><div class='add'>+            goto err;</div><div class='ctx'>         }</div><div class='ctx'> </div><div class='del'>-        if (is_linkfile) {</div><div class='del'>-                subvol = dht_linkfile_subvol (this, inode, stbuf, xattr);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-                if (!subvol) {</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-                                "linkfile not having link subvolume. path=%s",</div><div class='del'>-                                loc-&gt;path);</div><div class='del'>-			dht_lookup_everywhere (frame, this, loc);</div><div class='del'>-			return 0;</div><div class='del'>-                }</div><div class='add'>+    if (is_dir) {</div><div class='add'>+        call_cnt = conf-&gt;subvolume_cnt;</div><div class='add'>+        local-&gt;call_cnt = call_cnt;</div><div class='ctx'> </div><div class='del'>-		STACK_WIND (frame, dht_lookup_linkfile_cbk,</div><div class='del'>-			    subvol, subvol-&gt;fops-&gt;lookup,</div><div class='del'>-			    &amp;local-&gt;loc, local-&gt;xattr_req);</div><div class='add'>+        local-&gt;inode = inode_ref(inode);</div><div class='add'>+        local-&gt;xattr = dict_ref(xattr);</div><div class='add'>+</div><div class='add'>+        local-&gt;op_ret = 0;</div><div class='add'>+        local-&gt;op_errno = 0;</div><div class='add'>+</div><div class='add'>+        local-&gt;layout = dht_layout_new(this, conf-&gt;subvolume_cnt);</div><div class='add'>+        if (!local-&gt;layout) {</div><div class='add'>+            op_ret = -1;</div><div class='add'>+            op_errno = ENOMEM;</div><div class='add'>+            goto err;</div><div class='ctx'>         }</div><div class='ctx'> </div><div class='del'>-        return 0;</div><div class='add'>+        for (i = 0; i &lt; call_cnt; i++) {</div><div class='add'>+            STACK_WIND_COOKIE(frame, dht_lookup_dir_cbk, conf-&gt;subvolumes[i],</div><div class='add'>+                              conf-&gt;subvolumes[i],</div><div class='add'>+                              conf-&gt;subvolumes[i]-&gt;fops-&gt;lookup, &amp;local-&gt;loc,</div><div class='add'>+                              local-&gt;xattr_req);</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-out:</div><div class='del'>-	if (!local-&gt;hashed_subvol) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-			"no subvolume in layout for path=%s",</div><div class='del'>-			local-&gt;loc.path);</div><div class='del'>-                local-&gt;op_errno = ENOENT;</div><div class='del'>-                dht_lookup_everywhere (frame, this, loc);</div><div class='del'>-                return 0;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	STACK_WIND (frame, dht_lookup_cbk,</div><div class='del'>-		    local-&gt;hashed_subvol, local-&gt;hashed_subvol-&gt;fops-&gt;lookup,</div><div class='del'>-		    &amp;local-&gt;loc, local-&gt;xattr_req);</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>-</div><div class='del'>- err:</div><div class='del'>-        DHT_STACK_UNWIND (lookup, frame, op_ret, op_errno,</div><div class='del'>-                          inode, stbuf, xattr, NULL);</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='add'>+    if (is_linkfile) {</div><div class='add'>+        subvol = dht_linkfile_subvol(this, inode, stbuf, xattr);</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-nufa_lookup (call_frame_t *frame, xlator_t *this,</div><div class='del'>-	     loc_t *loc, dict_t *xattr_req)</div><div class='del'>-{</div><div class='del'>-        xlator_t     *hashed_subvol = NULL;</div><div class='del'>-        xlator_t     *cached_subvol = NULL;</div><div class='del'>-        xlator_t     *subvol = NULL;</div><div class='del'>-        dht_local_t  *local  = NULL;</div><div class='del'>-	dht_conf_t   *conf = NULL;</div><div class='del'>-        int           ret    = -1;</div><div class='del'>-        int           op_errno = -1;</div><div class='del'>-	dht_layout_t *layout = NULL;</div><div class='del'>-	int           i = 0;</div><div class='del'>-	int           call_cnt = 0;</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-        VALIDATE_OR_GOTO (frame, err);</div><div class='del'>-        VALIDATE_OR_GOTO (this, err);</div><div class='del'>-        VALIDATE_OR_GOTO (loc, err);</div><div class='del'>-        VALIDATE_OR_GOTO (loc-&gt;inode, err);</div><div class='del'>-        VALIDATE_OR_GOTO (loc-&gt;path, err);</div><div class='del'>-</div><div class='del'>-	conf = this-&gt;private;</div><div class='del'>-</div><div class='del'>-        local = dht_local_init (frame);</div><div class='del'>-	if (!local) {</div><div class='del'>-		op_errno = ENOMEM;</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-			"Out of memory");</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-        ret = loc_dup (loc, &amp;local-&gt;loc);</div><div class='del'>-        if (ret == -1) {</div><div class='del'>-                op_errno = errno;</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-                        "copying location failed for path=%s",</div><div class='del'>-                        loc-&gt;path);</div><div class='del'>-                goto err;</div><div class='add'>+        if (!subvol) {</div><div class='add'>+            gf_msg_debug(this-&gt;name, 0,</div><div class='add'>+                         "linkfile has no link subvolume. path=%s", loc-&gt;path);</div><div class='add'>+            dht_lookup_everywhere(frame, this, loc);</div><div class='add'>+            return 0;</div><div class='ctx'>         }</div><div class='ctx'> </div><div class='del'>-	if (xattr_req) {</div><div class='del'>-		local-&gt;xattr_req = dict_ref (xattr_req);</div><div class='del'>-	} else {</div><div class='del'>-		local-&gt;xattr_req = dict_new ();</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	hashed_subvol = dht_subvol_get_hashed (this, &amp;local-&gt;loc);</div><div class='del'>-	cached_subvol = dht_subvol_get_cached (this, local-&gt;loc.inode);</div><div class='del'>-</div><div class='del'>-	local-&gt;cached_subvol = cached_subvol;</div><div class='del'>-	local-&gt;hashed_subvol = hashed_subvol;</div><div class='del'>-</div><div class='del'>-        if (is_revalidate (loc)) {</div><div class='del'>-		local-&gt;layout = layout = dht_layout_get (this, loc-&gt;inode);</div><div class='del'>-</div><div class='del'>-                if (!layout) {</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-                                "revalidate without cache. path=%s",</div><div class='del'>-                                loc-&gt;path);</div><div class='del'>-                        op_errno = EINVAL;</div><div class='del'>-                        goto err;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-		if (layout-&gt;gen &amp;&amp; (layout-&gt;gen &lt; conf-&gt;gen)) {</div><div class='del'>-			gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-				"incomplete layout failure for path=%s",</div><div class='del'>-				loc-&gt;path);</div><div class='del'>-                        dht_layout_unref (this, local-&gt;layout);</div><div class='del'>-			goto do_fresh_lookup;</div><div class='del'>-		}</div><div class='del'>-</div><div class='del'>-		local-&gt;inode    = inode_ref (loc-&gt;inode);</div><div class='del'>-		local-&gt;ia_ino   = loc-&gt;inode-&gt;ino;</div><div class='del'>-</div><div class='del'>-		local-&gt;call_cnt = layout-&gt;cnt;</div><div class='del'>-		call_cnt = local-&gt;call_cnt;</div><div class='del'>-</div><div class='del'>-		/* NOTE: we don't require 'trusted.glusterfs.dht.linkto' attribute,</div><div class='del'>-		 *       revalidates directly go to the cached-subvolume.</div><div class='del'>-		 */</div><div class='del'>-		ret = dict_set_uint32 (local-&gt;xattr_req,</div><div class='del'>-				       "trusted.glusterfs.dht", 4 * 4);</div><div class='del'>-                if (ret &lt; 0) {</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-                                "Failed to set dict value.");</div><div class='del'>-                        op_errno = -1;</div><div class='del'>-                        goto err;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-		for (i = 0; i &lt; layout-&gt;cnt; i++) {</div><div class='del'>-			subvol = layout-&gt;list[i].xlator;</div><div class='del'>-</div><div class='del'>-			STACK_WIND (frame, dht_revalidate_cbk,</div><div class='del'>-				    subvol, subvol-&gt;fops-&gt;lookup,</div><div class='del'>-				    loc, local-&gt;xattr_req);</div><div class='del'>-</div><div class='del'>-			if (!--call_cnt)</div><div class='del'>-				break;</div><div class='del'>-		}</div><div class='del'>-	} else {</div><div class='del'>-        do_fresh_lookup:</div><div class='del'>-		ret = dict_set_uint32 (local-&gt;xattr_req,</div><div class='del'>-				       "trusted.glusterfs.dht", 4 * 4);</div><div class='del'>-                if (ret &lt; 0) {</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-                                "Failed to set dict value.");</div><div class='del'>-                        op_errno = -1;</div><div class='del'>-                        goto err;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-		ret = dict_set_uint32 (local-&gt;xattr_req,</div><div class='del'>-				       "trusted.glusterfs.dht.linkto", 256);</div><div class='del'>-                if (ret &lt; 0) {</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-                                "Failed to set dict value.");</div><div class='del'>-                        op_errno = -1;</div><div class='del'>-                        goto err;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-		/* Send it to only local volume */</div><div class='del'>-		STACK_WIND (frame, nufa_local_lookup_cbk,</div><div class='del'>-			    (xlator_t *)conf-&gt;private,</div><div class='del'>-			    ((xlator_t *)conf-&gt;private)-&gt;fops-&gt;lookup,</div><div class='del'>-			    loc, local-&gt;xattr_req);</div><div class='del'>-	}</div><div class='add'>+        STACK_WIND_COOKIE(frame, dht_lookup_linkfile_cbk, subvol, subvol,</div><div class='add'>+                          subvol-&gt;fops-&gt;lookup, &amp;local-&gt;loc, local-&gt;xattr_req);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='ctx'> </div><div class='add'>+out:</div><div class='add'>+    if (!local-&gt;hashed_subvol) {</div><div class='add'>+        gf_msg_debug(this-&gt;name, 0, "no subvolume in layout for path=%s",</div><div class='add'>+                     local-&gt;loc.path);</div><div class='add'>+        local-&gt;op_errno = ENOENT;</div><div class='add'>+        dht_lookup_everywhere(frame, this, loc);</div><div class='ctx'>         return 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    STACK_WIND_COOKIE(frame, dht_lookup_cbk, local-&gt;hashed_subvol,</div><div class='add'>+                      local-&gt;hashed_subvol, local-&gt;hashed_subvol-&gt;fops-&gt;lookup,</div><div class='add'>+                      &amp;local-&gt;loc, local-&gt;xattr_req);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='ctx'> </div><div class='ctx'> err:</div><div class='del'>-	op_errno = (op_errno == -1) ? errno : op_errno;</div><div class='del'>-        DHT_STACK_UNWIND (lookup, frame, -1, op_errno, NULL, NULL, NULL, NULL);</div><div class='del'>-	return 0;</div><div class='add'>+    DHT_STACK_UNWIND(lookup, frame, op_ret, op_errno, inode, stbuf, xattr,</div><div class='add'>+                     postparent);</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-nufa_create_linkfile_create_cbk (call_frame_t *frame, void *cookie,</div><div class='del'>-				 xlator_t *this, int op_ret, int op_errno,</div><div class='del'>-                                 inode_t *inode, struct iatt *stbuf,</div><div class='del'>-                                 struct iatt *preparent,</div><div class='del'>-                                 struct iatt *postparent)</div><div class='add'>+nufa_lookup(call_frame_t *frame, xlator_t *this, loc_t *loc, dict_t *xattr_req)</div><div class='ctx'> {</div><div class='del'>-	dht_local_t  *local = NULL;</div><div class='add'>+    xlator_t *hashed_subvol = NULL;</div><div class='add'>+    xlator_t *subvol = NULL;</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    dht_conf_t *conf = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int op_errno = -1;</div><div class='add'>+    dht_layout_t *layout = NULL;</div><div class='add'>+    int i = 0;</div><div class='add'>+    int call_cnt = 0;</div><div class='add'>+</div><div class='add'>+    VALIDATE_OR_GOTO(frame, err);</div><div class='add'>+    VALIDATE_OR_GOTO(this, err);</div><div class='add'>+    VALIDATE_OR_GOTO(loc, err);</div><div class='add'>+    VALIDATE_OR_GOTO(loc-&gt;inode, err);</div><div class='add'>+    VALIDATE_OR_GOTO(loc-&gt;path, err);</div><div class='add'>+</div><div class='add'>+    conf = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    local = dht_local_init(frame, loc, NULL, GF_FOP_LOOKUP);</div><div class='add'>+    if (!local) {</div><div class='add'>+        op_errno = ENOMEM;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (xattr_req) {</div><div class='add'>+        local-&gt;xattr_req = dict_ref(xattr_req);</div><div class='add'>+    } else {</div><div class='add'>+        local-&gt;xattr_req = dict_new();</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    hashed_subvol = dht_subvol_get_hashed(this, &amp;local-&gt;loc);</div><div class='add'>+</div><div class='add'>+    local-&gt;hashed_subvol = hashed_subvol;</div><div class='add'>+</div><div class='add'>+    if (is_revalidate(loc)) {</div><div class='add'>+        layout = local-&gt;layout;</div><div class='add'>+        if (!layout) {</div><div class='add'>+            gf_msg_debug(this-&gt;name, 0,</div><div class='add'>+                         "revalidate lookup without cache. "</div><div class='add'>+                         "path=%s",</div><div class='add'>+                         loc-&gt;path);</div><div class='add'>+            op_errno = EINVAL;</div><div class='add'>+            goto err;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-	local = frame-&gt;local;</div><div class='add'>+        if (layout-&gt;gen &amp;&amp; (layout-&gt;gen &lt; conf-&gt;gen)) {</div><div class='add'>+            gf_msg_debug(this-&gt;name, 0, "incomplete layout failure for path=%s",</div><div class='add'>+                         loc-&gt;path);</div><div class='add'>+            dht_layout_unref(this, local-&gt;layout);</div><div class='add'>+            goto do_fresh_lookup;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-	if (op_ret == -1)</div><div class='del'>-		goto err;</div><div class='add'>+        local-&gt;inode = inode_ref(loc-&gt;inode);</div><div class='ctx'> </div><div class='del'>-	STACK_WIND (frame, dht_create_cbk,</div><div class='del'>-		    local-&gt;cached_subvol, local-&gt;cached_subvol-&gt;fops-&gt;create,</div><div class='del'>-		    &amp;local-&gt;loc, local-&gt;flags, local-&gt;mode, local-&gt;fd,</div><div class='del'>-                    local-&gt;params);</div><div class='add'>+        local-&gt;call_cnt = layout-&gt;cnt;</div><div class='add'>+        call_cnt = local-&gt;call_cnt;</div><div class='ctx'> </div><div class='del'>-	return 0;</div><div class='add'>+        /* NOTE: we don't require 'trusted.glusterfs.dht.linkto' attribute,</div><div class='add'>+         *       revalidates directly go to the cached-subvolume.</div><div class='add'>+         */</div><div class='add'>+        ret = dict_set_uint32(local-&gt;xattr_req, conf-&gt;xattr_name, 4 * 4);</div><div class='add'>+        if (ret &lt; 0) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, 0, DHT_MSG_DICT_SET_FAILED,</div><div class='add'>+                   "Failed to set dict value.");</div><div class='add'>+            op_errno = -1;</div><div class='add'>+            goto err;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>- err:</div><div class='del'>-	DHT_STACK_UNWIND (create, frame, -1, op_errno,</div><div class='del'>-                          NULL, NULL, NULL, NULL, NULL);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='add'>+        for (i = 0; i &lt; layout-&gt;cnt; i++) {</div><div class='add'>+            subvol = layout-&gt;list[i].xlator;</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-nufa_create (call_frame_t *frame, xlator_t *this,</div><div class='del'>-	     loc_t *loc, int32_t flags, mode_t mode,</div><div class='del'>-             fd_t *fd, dict_t *params)</div><div class='del'>-{</div><div class='del'>-	dht_local_t *local = NULL;</div><div class='del'>-	dht_conf_t  *conf  = NULL;</div><div class='del'>-	xlator_t    *subvol = NULL;</div><div class='del'>-        xlator_t    *avail_subvol = NULL;</div><div class='del'>-	int          op_errno = -1;</div><div class='del'>-	int          ret = -1;</div><div class='del'>-</div><div class='del'>-	VALIDATE_OR_GOTO (frame, err);</div><div class='del'>-	VALIDATE_OR_GOTO (this, err);</div><div class='del'>-	VALIDATE_OR_GOTO (loc, err);</div><div class='del'>-</div><div class='del'>-	conf  = this-&gt;private;</div><div class='del'>-</div><div class='del'>-        dht_get_du_info (frame, this, loc);</div><div class='del'>-</div><div class='del'>-        local = dht_local_init (frame);</div><div class='del'>-	if (!local) {</div><div class='del'>-		op_errno = ENOMEM;</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-			"Out of memory");</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	subvol = dht_subvol_get_hashed (this, loc);</div><div class='del'>-	if (!subvol) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-			"no subvolume in layout for path=%s",</div><div class='del'>-			loc-&gt;path);</div><div class='del'>-		op_errno = ENOENT;</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-        avail_subvol = conf-&gt;private;</div><div class='del'>-        if (dht_is_subvol_filled (this, (xlator_t *)conf-&gt;private)) {</div><div class='del'>-                avail_subvol =</div><div class='del'>-                        dht_free_disk_available_subvol (this,</div><div class='del'>-                                                        (xlator_t *)conf-&gt;private);</div><div class='del'>-        }</div><div class='add'>+            STACK_WIND_COOKIE(frame, dht_revalidate_cbk, subvol, subvol,</div><div class='add'>+                              subvol-&gt;fops-&gt;lookup, loc, local-&gt;xattr_req);</div><div class='ctx'> </div><div class='del'>-        if (subvol != avail_subvol) {</div><div class='del'>-                /* create a link file instead of actual file */</div><div class='del'>-                ret = loc_copy (&amp;local-&gt;loc, loc);</div><div class='del'>-                if (ret == -1) {</div><div class='del'>-                                gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-                                        "Out of memory");</div><div class='del'>-                                op_errno = ENOMEM;</div><div class='del'>-                                goto err;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                local-&gt;fd = fd_ref (fd);</div><div class='del'>-                local-&gt;params = dict_ref (params);</div><div class='del'>-                local-&gt;mode = mode;</div><div class='del'>-                local-&gt;flags = flags;</div><div class='del'>-</div><div class='del'>-                local-&gt;cached_subvol = avail_subvol;</div><div class='del'>-                dht_linkfile_create (frame,</div><div class='del'>-                                     nufa_create_linkfile_create_cbk,</div><div class='del'>-                                     avail_subvol, subvol, loc);</div><div class='del'>-                return 0;</div><div class='add'>+            if (!--call_cnt)</div><div class='add'>+                break;</div><div class='add'>+        }</div><div class='add'>+    } else {</div><div class='add'>+    do_fresh_lookup:</div><div class='add'>+        ret = dict_set_uint32(local-&gt;xattr_req, conf-&gt;xattr_name, 4 * 4);</div><div class='add'>+        if (ret &lt; 0) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, 0, DHT_MSG_DICT_SET_FAILED,</div><div class='add'>+                   "Failed to set dict value.");</div><div class='add'>+            op_errno = -1;</div><div class='add'>+            goto err;</div><div class='ctx'>         }</div><div class='ctx'> </div><div class='del'>-        gf_log (this-&gt;name, GF_LOG_TRACE,</div><div class='del'>-                "creating %s on %s", loc-&gt;path, subvol-&gt;name);</div><div class='add'>+        ret = dict_set_uint32(local-&gt;xattr_req, conf-&gt;link_xattr_name, 256);</div><div class='add'>+        if (ret &lt; 0) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, 0, DHT_MSG_DICT_SET_FAILED,</div><div class='add'>+                   "Failed to set dict value.");</div><div class='add'>+            op_errno = -1;</div><div class='add'>+            goto err;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-        STACK_WIND (frame, dht_create_cbk,</div><div class='del'>-                    subvol, subvol-&gt;fops-&gt;create,</div><div class='del'>-                    loc, flags, mode, fd, params);</div><div class='add'>+        /* Send it to only local volume */</div><div class='add'>+        STACK_WIND_COOKIE(</div><div class='add'>+            frame, nufa_local_lookup_cbk, ((xlator_t *)conf-&gt;private),</div><div class='add'>+            ((xlator_t *)conf-&gt;private),</div><div class='add'>+            ((xlator_t *)conf-&gt;private)-&gt;fops-&gt;lookup, loc, local-&gt;xattr_req);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        return 0;</div><div class='add'>+    return 0;</div><div class='ctx'> </div><div class='ctx'> err:</div><div class='del'>-	op_errno = (op_errno == -1) ? errno : op_errno;</div><div class='del'>-	DHT_STACK_UNWIND (create, frame, -1, op_errno,</div><div class='del'>-                          NULL, NULL, NULL, NULL, NULL);</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='add'>+    op_errno = (op_errno == -1) ? errno : op_errno;</div><div class='add'>+    DHT_STACK_UNWIND(lookup, frame, -1, op_errno, NULL, NULL, NULL, NULL);</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-nufa_mknod_linkfile_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-                         int op_ret, int op_errno, inode_t *inode,</div><div class='del'>-                         struct iatt *stbuf, struct iatt *preparent,</div><div class='del'>-                         struct iatt *postparent)</div><div class='add'>+nufa_create_linkfile_create_cbk(call_frame_t *frame, void *cookie,</div><div class='add'>+                                xlator_t *this, int op_ret, int op_errno,</div><div class='add'>+                                inode_t *inode, struct iatt *stbuf,</div><div class='add'>+                                struct iatt *preparent, struct iatt *postparent,</div><div class='add'>+                                dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-	dht_local_t  *local = NULL;</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='ctx'> </div><div class='del'>-	local = frame-&gt;local;</div><div class='add'>+    local = frame-&gt;local;</div><div class='ctx'> </div><div class='del'>-	if (op_ret &gt;= 0) {</div><div class='del'>-		STACK_WIND (frame, dht_newfile_cbk,</div><div class='del'>-			    local-&gt;cached_subvol,</div><div class='del'>-			    local-&gt;cached_subvol-&gt;fops-&gt;mknod,</div><div class='del'>-			    &amp;local-&gt;loc, local-&gt;mode, local-&gt;rdev,</div><div class='del'>-                            local-&gt;params);</div><div class='add'>+    if (op_ret == -1)</div><div class='add'>+        goto err;</div><div class='ctx'> </div><div class='del'>-		return 0;</div><div class='del'>-	}</div><div class='add'>+    STACK_WIND_COOKIE(frame, dht_create_cbk, local-&gt;cached_subvol,</div><div class='add'>+                      local-&gt;cached_subvol, local-&gt;cached_subvol-&gt;fops-&gt;create,</div><div class='add'>+                      &amp;local-&gt;loc, local-&gt;flags, local-&gt;mode, local-&gt;umask,</div><div class='add'>+                      local-&gt;fd, local-&gt;params);</div><div class='ctx'> </div><div class='del'>-        WIPE (postparent);</div><div class='del'>-        WIPE (preparent);</div><div class='add'>+    return 0;</div><div class='ctx'> </div><div class='del'>-	DHT_STACK_UNWIND (link, frame, op_ret, op_errno,</div><div class='del'>-                          inode, stbuf, preparent, postparent);</div><div class='del'>-	return 0;</div><div class='add'>+err:</div><div class='add'>+    DHT_STACK_UNWIND(create, frame, -1, op_errno, NULL, NULL, NULL, NULL, NULL,</div><div class='add'>+                     NULL);</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-nufa_mknod (call_frame_t *frame, xlator_t *this,</div><div class='del'>-	    loc_t *loc, mode_t mode, dev_t rdev, dict_t *params)</div><div class='add'>+nufa_create(call_frame_t *frame, xlator_t *this, loc_t *loc, int32_t flags,</div><div class='add'>+            mode_t mode, mode_t umask, fd_t *fd, dict_t *params)</div><div class='ctx'> {</div><div class='del'>-	dht_local_t *local = NULL;</div><div class='del'>-	dht_conf_t  *conf  = NULL;</div><div class='del'>-	xlator_t    *subvol = NULL;</div><div class='del'>-        xlator_t    *avail_subvol = NULL;</div><div class='del'>-	int          op_errno = -1;</div><div class='del'>-	int          ret = -1;</div><div class='del'>-</div><div class='del'>-	VALIDATE_OR_GOTO (frame, err);</div><div class='del'>-	VALIDATE_OR_GOTO (this, err);</div><div class='del'>-	VALIDATE_OR_GOTO (loc, err);</div><div class='del'>-</div><div class='del'>-	conf  = this-&gt;private;</div><div class='del'>-</div><div class='del'>-        dht_get_du_info (frame, this, loc);</div><div class='del'>-</div><div class='del'>-        local = dht_local_init (frame);</div><div class='del'>-	if (!local) {</div><div class='del'>-		op_errno = ENOMEM;</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-			"Out of memory");</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	subvol = dht_subvol_get_hashed (this, loc);</div><div class='del'>-	if (!subvol) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-			"no subvolume in layout for path=%s",</div><div class='del'>-			loc-&gt;path);</div><div class='del'>-		op_errno = ENOENT;</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-        /* Consider the disksize in consideration */</div><div class='del'>-        avail_subvol = conf-&gt;private;</div><div class='del'>-        if (dht_is_subvol_filled (this, (xlator_t *)conf-&gt;private)) {</div><div class='del'>-                avail_subvol =</div><div class='del'>-                        dht_free_disk_available_subvol (this,</div><div class='del'>-                                                        (xlator_t *)conf-&gt;private);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-	if (avail_subvol != subvol) {</div><div class='del'>-		/* Create linkfile first */</div><div class='del'>-		ret = loc_copy (&amp;local-&gt;loc, loc);</div><div class='del'>-		if (ret == -1) {</div><div class='del'>-			gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-				"Out of memory");</div><div class='del'>-			op_errno = ENOMEM;</div><div class='del'>-			goto err;</div><div class='del'>-		}</div><div class='del'>-</div><div class='del'>-                local-&gt;params = dict_ref (params);</div><div class='del'>-		local-&gt;mode = mode;</div><div class='del'>-		local-&gt;rdev = rdev;</div><div class='del'>-		local-&gt;cached_subvol = avail_subvol;</div><div class='del'>-</div><div class='del'>-		dht_linkfile_create (frame, nufa_mknod_linkfile_cbk,</div><div class='del'>-                                     avail_subvol, subvol, loc);</div><div class='del'>-		return 0;</div><div class='del'>-	}</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    dht_conf_t *conf = NULL;</div><div class='add'>+    xlator_t *subvol = NULL;</div><div class='add'>+    xlator_t *avail_subvol = NULL;</div><div class='add'>+    int op_errno = -1;</div><div class='add'>+</div><div class='add'>+    VALIDATE_OR_GOTO(frame, err);</div><div class='add'>+    VALIDATE_OR_GOTO(this, err);</div><div class='add'>+    VALIDATE_OR_GOTO(loc, err);</div><div class='add'>+</div><div class='add'>+    conf = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    dht_get_du_info(frame, this, loc);</div><div class='add'>+</div><div class='add'>+    local = dht_local_init(frame, loc, fd, GF_FOP_CREATE);</div><div class='add'>+    if (!local) {</div><div class='add'>+        op_errno = ENOMEM;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    subvol = dht_subvol_get_hashed(this, loc);</div><div class='add'>+    if (!subvol) {</div><div class='add'>+        gf_msg_debug(this-&gt;name, 0, "no subvolume in layout for path=%s",</div><div class='add'>+                     loc-&gt;path);</div><div class='add'>+        op_errno = ENOENT;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    avail_subvol = conf-&gt;private;</div><div class='add'>+    if (dht_is_subvol_filled(this, (xlator_t *)conf-&gt;private)) {</div><div class='add'>+        avail_subvol = dht_free_disk_available_subvol(</div><div class='add'>+            this, (xlator_t *)conf-&gt;private, local);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (subvol != avail_subvol) {</div><div class='add'>+        /* create a link file instead of actual file */</div><div class='add'>+        local-&gt;params = dict_ref(params);</div><div class='add'>+        local-&gt;mode = mode;</div><div class='add'>+        local-&gt;flags = flags;</div><div class='add'>+        local-&gt;umask = umask;</div><div class='add'>+        local-&gt;cached_subvol = avail_subvol;</div><div class='add'>+        dht_linkfile_create(frame, nufa_create_linkfile_create_cbk, this,</div><div class='add'>+                            avail_subvol, subvol, loc);</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	gf_log (this-&gt;name, GF_LOG_TRACE,</div><div class='del'>-		"creating %s on %s", loc-&gt;path, subvol-&gt;name);</div><div class='add'>+    gf_msg_trace(this-&gt;name, 0, "creating %s on %s", loc-&gt;path, subvol-&gt;name);</div><div class='ctx'> </div><div class='del'>-	STACK_WIND (frame, dht_newfile_cbk,</div><div class='del'>-		    subvol, subvol-&gt;fops-&gt;mknod,</div><div class='del'>-		    loc, mode, rdev, params);</div><div class='add'>+    STACK_WIND_COOKIE(frame, dht_create_cbk, subvol, subvol,</div><div class='add'>+                      subvol-&gt;fops-&gt;create, loc, flags, mode, umask, fd,</div><div class='add'>+                      params);</div><div class='ctx'> </div><div class='del'>-	return 0;</div><div class='add'>+    return 0;</div><div class='ctx'> </div><div class='ctx'> err:</div><div class='del'>-	op_errno = (op_errno == -1) ? errno : op_errno;</div><div class='del'>-	DHT_STACK_UNWIND (mknod, frame, -1, op_errno,</div><div class='del'>-                          NULL, NULL, NULL, NULL);</div><div class='add'>+    op_errno = (op_errno == -1) ? errno : op_errno;</div><div class='add'>+    DHT_STACK_UNWIND(create, frame, -1, op_errno, NULL, NULL, NULL, NULL, NULL,</div><div class='add'>+                     NULL);</div><div class='ctx'> </div><div class='del'>-	return 0;</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-notify (xlator_t *this, int event, void *data, ...)</div><div class='add'>+nufa_mknod_linkfile_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                        int op_ret, int op_errno, inode_t *inode,</div><div class='add'>+                        struct iatt *stbuf, struct iatt *preparent,</div><div class='add'>+                        struct iatt *postparent, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-	int ret = -1;</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='ctx'> </div><div class='del'>-	ret = dht_notify (this, event, data);</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    if (!local || !local-&gt;cached_subvol) {</div><div class='add'>+        op_errno = EINVAL;</div><div class='add'>+        op_ret = -1;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	return ret;</div><div class='del'>-}</div><div class='add'>+    if (op_ret &gt;= 0) {</div><div class='add'>+        STACK_WIND_COOKIE(</div><div class='add'>+            frame, dht_newfile_cbk, (void *)local-&gt;cached_subvol,</div><div class='add'>+            local-&gt;cached_subvol, local-&gt;cached_subvol-&gt;fops-&gt;mknod,</div><div class='add'>+            &amp;local-&gt;loc, local-&gt;mode, local-&gt;rdev, local-&gt;umask, local-&gt;params);</div><div class='ctx'> </div><div class='del'>-void</div><div class='del'>-fini (xlator_t *this)</div><div class='del'>-{</div><div class='del'>-        int         i = 0;</div><div class='del'>-        dht_conf_t *conf = NULL;</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='add'>+err:</div><div class='add'>+    WIPE(postparent);</div><div class='add'>+    WIPE(preparent);</div><div class='ctx'> </div><div class='del'>-	conf = this-&gt;private;</div><div class='add'>+    DHT_STACK_UNWIND(link, frame, op_ret, op_errno, inode, stbuf, preparent,</div><div class='add'>+                     postparent, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        if (conf) {</div><div class='del'>-                if (conf-&gt;file_layouts) {</div><div class='del'>-                        for (i = 0; i &lt; conf-&gt;subvolume_cnt; i++) {</div><div class='del'>-                                GF_FREE (conf-&gt;file_layouts[i]);</div><div class='del'>-                        }</div><div class='del'>-                        GF_FREE (conf-&gt;file_layouts);</div><div class='del'>-                }</div><div class='add'>+int</div><div class='add'>+nufa_mknod(call_frame_t *frame, xlator_t *this, loc_t *loc, mode_t mode,</div><div class='add'>+           dev_t rdev, mode_t umask, dict_t *params)</div><div class='add'>+{</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    dht_conf_t *conf = NULL;</div><div class='add'>+    xlator_t *subvol = NULL;</div><div class='add'>+    xlator_t *avail_subvol = NULL;</div><div class='add'>+    int op_errno = -1;</div><div class='add'>+</div><div class='add'>+    VALIDATE_OR_GOTO(frame, err);</div><div class='add'>+    VALIDATE_OR_GOTO(this, err);</div><div class='add'>+    VALIDATE_OR_GOTO(loc, err);</div><div class='add'>+</div><div class='add'>+    conf = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    dht_get_du_info(frame, this, loc);</div><div class='add'>+</div><div class='add'>+    local = dht_local_init(frame, loc, NULL, GF_FOP_MKNOD);</div><div class='add'>+    if (!local) {</div><div class='add'>+        op_errno = ENOMEM;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    subvol = dht_subvol_get_hashed(this, loc);</div><div class='add'>+    if (!subvol) {</div><div class='add'>+        gf_msg_debug(this-&gt;name, 0, "no subvolume in layout for path=%s",</div><div class='add'>+                     loc-&gt;path);</div><div class='add'>+        op_errno = ENOENT;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Consider the disksize in consideration */</div><div class='add'>+    avail_subvol = conf-&gt;private;</div><div class='add'>+    if (dht_is_subvol_filled(this, (xlator_t *)conf-&gt;private)) {</div><div class='add'>+        avail_subvol = dht_free_disk_available_subvol(</div><div class='add'>+            this, (xlator_t *)conf-&gt;private, local);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (avail_subvol != subvol) {</div><div class='add'>+        /* Create linkfile first */</div><div class='add'>+</div><div class='add'>+        local-&gt;params = dict_ref(params);</div><div class='add'>+        local-&gt;mode = mode;</div><div class='add'>+        local-&gt;umask = umask;</div><div class='add'>+        local-&gt;rdev = rdev;</div><div class='add'>+        local-&gt;cached_subvol = avail_subvol;</div><div class='add'>+</div><div class='add'>+        dht_linkfile_create(frame, nufa_mknod_linkfile_cbk, this, avail_subvol,</div><div class='add'>+                            subvol, loc);</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-                if (conf-&gt;default_dir_layout)</div><div class='del'>-                        GF_FREE (conf-&gt;default_dir_layout);</div><div class='add'>+    gf_msg_trace(this-&gt;name, 0, "creating %s on %s", loc-&gt;path, subvol-&gt;name);</div><div class='ctx'> </div><div class='del'>-                if (conf-&gt;subvolumes)</div><div class='del'>-                        GF_FREE (conf-&gt;subvolumes);</div><div class='add'>+    STACK_WIND_COOKIE(frame, dht_newfile_cbk, (void *)subvol, subvol,</div><div class='add'>+                      subvol-&gt;fops-&gt;mknod, loc, mode, rdev, umask, params);</div><div class='ctx'> </div><div class='del'>-		if (conf-&gt;subvolume_status)</div><div class='del'>-			GF_FREE (conf-&gt;subvolume_status);</div><div class='add'>+    return 0;</div><div class='ctx'> </div><div class='del'>-                GF_FREE (conf);</div><div class='del'>-        }</div><div class='add'>+err:</div><div class='add'>+    op_errno = (op_errno == -1) ? errno : op_errno;</div><div class='add'>+    DHT_STACK_UNWIND(mknod, frame, -1, op_errno, NULL, NULL, NULL, NULL, NULL);</div><div class='ctx'> </div><div class='del'>-	return;</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-init (xlator_t *this)</div><div class='add'>+gf_boolean_t</div><div class='add'>+same_first_part(char *str1, char term1, char *str2, char term2)</div><div class='ctx'> {</div><div class='del'>-        dht_conf_t    *conf = NULL;</div><div class='del'>-	xlator_list_t *trav = NULL;</div><div class='del'>-	data_t        *data = NULL;</div><div class='del'>-	char          *local_volname = NULL;</div><div class='del'>-	char          *temp_str = NULL;</div><div class='del'>-        int            ret = -1;</div><div class='del'>-        int            i = 0;</div><div class='del'>-	char           my_hostname[256];</div><div class='del'>-	uint32_t       temp_free_disk = 0;</div><div class='del'>-</div><div class='del'>-	if (!this-&gt;children) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_CRITICAL,</div><div class='del'>-			"NUFA needs more than one subvolume");</div><div class='del'>-		return -1;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	if (!this-&gt;parents) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_WARNING,</div><div class='del'>-			"dangling volume. check volfile");</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-        conf = GF_CALLOC (1, sizeof (*conf),</div><div class='del'>-                          gf_dht_mt_dht_conf_t);</div><div class='del'>-        if (!conf) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-                        "Out of memory");</div><div class='del'>-                goto err;</div><div class='add'>+    gf_boolean_t ended1;</div><div class='add'>+    gf_boolean_t ended2;</div><div class='add'>+</div><div class='add'>+    for (;;) {</div><div class='add'>+        ended1 = ((*str1 == '\0') || (*str1 == term1));</div><div class='add'>+        ended2 = ((*str2 == '\0') || (*str2 == term2));</div><div class='add'>+        if (ended1 &amp;&amp; ended2) {</div><div class='add'>+            return _gf_true;</div><div class='ctx'>         }</div><div class='del'>-</div><div class='del'>-        conf-&gt;search_unhashed = GF_DHT_LOOKUP_UNHASHED_ON;</div><div class='del'>-	if (dict_get_str (this-&gt;options, "lookup-unhashed", &amp;temp_str) == 0) {</div><div class='del'>-                /* If option is not "auto", other options _should_ be boolean */</div><div class='del'>-                if (strcasecmp (temp_str, "auto"))</div><div class='del'>-                        gf_string2boolean (temp_str, &amp;conf-&gt;search_unhashed);</div><div class='del'>-                else</div><div class='del'>-                        conf-&gt;search_unhashed = GF_DHT_LOOKUP_UNHASHED_AUTO;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-        ret = dht_init_subvolumes (this, conf);</div><div class='del'>-        if (ret == -1) {</div><div class='del'>-                goto err;</div><div class='add'>+        if (ended1 || ended2 || (*str1 != *str2)) {</div><div class='add'>+            return _gf_false;</div><div class='ctx'>         }</div><div class='add'>+        ++str1;</div><div class='add'>+        ++str2;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        ret = dht_layouts_init (this, conf);</div><div class='del'>-        if (ret == -1) {</div><div class='del'>-                goto err;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-	LOCK_INIT (&amp;conf-&gt;subvolume_lock);</div><div class='del'>-	LOCK_INIT (&amp;conf-&gt;layout_lock);</div><div class='del'>-</div><div class='del'>-	conf-&gt;gen = 1;</div><div class='del'>-</div><div class='del'>-	local_volname = "localhost";</div><div class='del'>-	ret = gethostname (my_hostname, 256);</div><div class='del'>-	if (ret &lt; 0) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_WARNING,</div><div class='del'>-			"could not find hostname (%s)",</div><div class='del'>-			strerror (errno));</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	if (ret == 0)</div><div class='del'>-		local_volname = my_hostname;</div><div class='del'>-</div><div class='del'>-	data = dict_get (this-&gt;options, "local-volume-name");</div><div class='del'>-	if (data) {</div><div class='del'>-		local_volname = data-&gt;data;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	trav = this-&gt;children;</div><div class='del'>-	while (trav) {</div><div class='del'>-		if (strcmp (trav-&gt;xlator-&gt;name, local_volname) == 0)</div><div class='del'>-			break;</div><div class='del'>-		trav = trav-&gt;next;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	if (!trav) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-			"Could not find subvolume named '%s'. "</div><div class='del'>-			"Please define volume with the name as the hostname "</div><div class='del'>-			"or override it with 'option local-volume-name'",</div><div class='del'>-			local_volname);</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='del'>-	/* The volume specified exists */</div><div class='del'>-	conf-&gt;private = trav-&gt;xlator;</div><div class='del'>-</div><div class='del'>-        conf-&gt;min_free_disk = 10;</div><div class='del'>-        conf-&gt;disk_unit = 'p';</div><div class='del'>-</div><div class='del'>-        if (dict_get_str (this-&gt;options, "min-free-disk",</div><div class='del'>-                          &amp;temp_str) == 0) {</div><div class='del'>-                if (gf_string2percent (temp_str,</div><div class='del'>-                                       &amp;temp_free_disk) == 0) {</div><div class='del'>-                        if (temp_free_disk &gt; 100) {</div><div class='del'>-                                gf_string2bytesize (temp_str,</div><div class='del'>-                                                        &amp;conf-&gt;min_free_disk);</div><div class='del'>-                                conf-&gt;disk_unit = 'b';</div><div class='del'>-                        } else {</div><div class='del'>-                                conf-&gt;min_free_disk = (uint64_t)temp_free_disk;</div><div class='del'>-                                conf-&gt;disk_unit = 'p';</div><div class='del'>-                        }</div><div class='del'>-                } else {</div><div class='del'>-                        gf_string2bytesize (temp_str,</div><div class='del'>-                                                &amp;conf-&gt;min_free_disk);</div><div class='del'>-                        conf-&gt;disk_unit = 'b';</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        conf-&gt;du_stats = GF_CALLOC (conf-&gt;subvolume_cnt, sizeof (dht_du_t),</div><div class='del'>-                                    gf_dht_mt_dht_du_t);</div><div class='del'>-        if (!conf-&gt;du_stats) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-                        "Out of memory");</div><div class='del'>-                goto err;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        this-&gt;private = conf;</div><div class='del'>-</div><div class='del'>-        return 0;</div><div class='del'>-</div><div class='del'>-err:</div><div class='del'>-        if (conf) {</div><div class='del'>-                if (conf-&gt;file_layouts) {</div><div class='del'>-                        for (i = 0; i &lt; conf-&gt;subvolume_cnt; i++) {</div><div class='del'>-                                GF_FREE (conf-&gt;file_layouts[i]);</div><div class='del'>-                        }</div><div class='del'>-                        GF_FREE (conf-&gt;file_layouts);</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                if (conf-&gt;default_dir_layout)</div><div class='del'>-                        GF_FREE (conf-&gt;default_dir_layout);</div><div class='add'>+typedef struct nufa_args {</div><div class='add'>+    xlator_t *this;</div><div class='add'>+    char *volname;</div><div class='add'>+    gf_boolean_t addr_match;</div><div class='add'>+} nufa_args_t;</div><div class='ctx'> </div><div class='del'>-                if (conf-&gt;subvolumes)</div><div class='del'>-                        GF_FREE (conf-&gt;subvolumes);</div><div class='add'>+static void</div><div class='add'>+nufa_find_local_brick(xlator_t *xl, void *data)</div><div class='add'>+{</div><div class='add'>+    nufa_args_t *args = data;</div><div class='add'>+    xlator_t *this = args-&gt;this;</div><div class='add'>+    char *local_volname = args-&gt;volname;</div><div class='add'>+    gf_boolean_t addr_match = args-&gt;addr_match;</div><div class='add'>+    char *brick_host = NULL;</div><div class='add'>+    dht_conf_t *conf = this-&gt;private;</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    /*This means a local subvol was already found. We pick the first brick</div><div class='add'>+     * that is local*/</div><div class='add'>+    if (conf-&gt;private)</div><div class='add'>+        return;</div><div class='add'>+</div><div class='add'>+    if (strcmp(xl-&gt;name, local_volname) == 0) {</div><div class='add'>+        conf-&gt;private = xl;</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_INFO, 0, DHT_MSG_SUBVOL_INFO,</div><div class='add'>+               "Using specified subvol %s", local_volname);</div><div class='add'>+        return;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (!addr_match)</div><div class='add'>+        return;</div><div class='add'>+</div><div class='add'>+    ret = dict_get_str(xl-&gt;options, "remote-host", &amp;brick_host);</div><div class='add'>+    if ((ret == 0) &amp;&amp; (gf_is_same_address(local_volname, brick_host) ||</div><div class='add'>+                       gf_is_local_addr(brick_host))) {</div><div class='add'>+        conf-&gt;private = xl;</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_INFO, 0, DHT_MSG_SUBVOL_INFO,</div><div class='add'>+               "Using the first local "</div><div class='add'>+               "subvol %s",</div><div class='add'>+               xl-&gt;name);</div><div class='add'>+        return;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-		if (conf-&gt;subvolume_status)</div><div class='del'>-			GF_FREE (conf-&gt;subvolume_status);</div><div class='add'>+static void</div><div class='add'>+nufa_to_dht(xlator_t *this)</div><div class='add'>+{</div><div class='add'>+    GF_ASSERT(this);</div><div class='add'>+    GF_ASSERT(this-&gt;fops);</div><div class='ctx'> </div><div class='del'>-                if (conf-&gt;du_stats)</div><div class='del'>-                        GF_FREE (conf-&gt;du_stats);</div><div class='add'>+    this-&gt;fops-&gt;lookup = dht_lookup;</div><div class='add'>+    this-&gt;fops-&gt;create = dht_create;</div><div class='add'>+    this-&gt;fops-&gt;mknod = dht_mknod;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-                GF_FREE (conf);</div><div class='add'>+int</div><div class='add'>+nufa_find_local_subvol(xlator_t *this, void (*fn)(xlator_t *each, void *data),</div><div class='add'>+                       void *data)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    dht_conf_t *conf = this-&gt;private;</div><div class='add'>+    xlator_list_t *trav = NULL;</div><div class='add'>+    xlator_t *parent = NULL;</div><div class='add'>+    xlator_t *candidate = NULL;</div><div class='add'>+</div><div class='add'>+    xlator_foreach_depth_first(this, fn, data);</div><div class='add'>+    if (!conf-&gt;private) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_ERROR, 0, DHT_MSG_BRICK_ERROR,</div><div class='add'>+               "Couldn't find a local "</div><div class='add'>+               "brick");</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    candidate = conf-&gt;private;</div><div class='add'>+    trav = candidate-&gt;parents;</div><div class='add'>+    while (trav) {</div><div class='add'>+        parent = trav-&gt;xlator;</div><div class='add'>+        if (strcmp(parent-&gt;type, "cluster/nufa") == 0) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_INFO, 0, DHT_MSG_SUBVOL_INFO,</div><div class='add'>+                   "Found local subvol, "</div><div class='add'>+                   "%s",</div><div class='add'>+                   candidate-&gt;name);</div><div class='add'>+            ret = 0;</div><div class='add'>+            conf-&gt;private = candidate;</div><div class='add'>+            break;</div><div class='ctx'>         }</div><div class='ctx'> </div><div class='del'>-        return -1;</div><div class='add'>+        candidate = parent;</div><div class='add'>+        trav = parent-&gt;parents;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+int</div><div class='add'>+nufa_init(xlator_t *this)</div><div class='add'>+{</div><div class='add'>+    data_t *data = NULL;</div><div class='add'>+    char *local_volname = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    char my_hostname[256];</div><div class='add'>+    gf_boolean_t addr_match = _gf_false;</div><div class='add'>+    nufa_args_t args = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    ret = dht_init(this);</div><div class='add'>+    if (ret) {</div><div class='add'>+        return ret;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if ((data = dict_get(this-&gt;options, "local-volume-name"))) {</div><div class='add'>+        local_volname = data-&gt;data;</div><div class='add'>+</div><div class='add'>+    } else {</div><div class='add'>+        addr_match = _gf_true;</div><div class='add'>+        local_volname = "localhost";</div><div class='add'>+        ret = gethostname(my_hostname, 256);</div><div class='add'>+        if (ret == 0)</div><div class='add'>+            local_volname = my_hostname;</div><div class='add'>+</div><div class='add'>+        else</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_WARNING, errno,</div><div class='add'>+                   DHT_MSG_GET_HOSTNAME_FAILED, "could not find hostname");</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    args.this = this;</div><div class='add'>+    args.volname = local_volname;</div><div class='add'>+    args.addr_match = addr_match;</div><div class='add'>+    ret = nufa_find_local_subvol(this, nufa_find_local_brick, &amp;args);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_INFO, 0, DHT_MSG_SUBVOL_INFO,</div><div class='add'>+               "Unable to find local subvolume, switching "</div><div class='add'>+               "to dht mode");</div><div class='add'>+        nufa_to_dht(this);</div><div class='add'>+    }</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-struct xlator_fops fops = {</div><div class='del'>-	.lookup      = nufa_lookup,</div><div class='del'>-	.create      = nufa_create,</div><div class='del'>-	.mknod       = nufa_mknod,</div><div class='del'>-</div><div class='del'>-	.stat        = dht_stat,</div><div class='del'>-	.fstat       = dht_fstat,</div><div class='del'>-	.truncate    = dht_truncate,</div><div class='del'>-	.ftruncate   = dht_ftruncate,</div><div class='del'>-	.access      = dht_access,</div><div class='del'>-	.readlink    = dht_readlink,</div><div class='del'>-	.setxattr    = dht_setxattr,</div><div class='del'>-	.getxattr    = dht_getxattr,</div><div class='del'>-	.removexattr = dht_removexattr,</div><div class='del'>-	.open        = dht_open,</div><div class='del'>-	.readv       = dht_readv,</div><div class='del'>-	.writev      = dht_writev,</div><div class='del'>-	.flush       = dht_flush,</div><div class='del'>-	.fsync       = dht_fsync,</div><div class='del'>-	.statfs      = dht_statfs,</div><div class='del'>-	.lk          = dht_lk,</div><div class='del'>-	.opendir     = dht_opendir,</div><div class='del'>-	.readdir     = dht_readdir,</div><div class='del'>-	.readdirp    = dht_readdirp,</div><div class='del'>-	.fsyncdir    = dht_fsyncdir,</div><div class='del'>-	.symlink     = dht_symlink,</div><div class='del'>-	.unlink      = dht_unlink,</div><div class='del'>-	.link        = dht_link,</div><div class='del'>-	.mkdir       = dht_mkdir,</div><div class='del'>-	.rmdir       = dht_rmdir,</div><div class='del'>-	.rename      = dht_rename,</div><div class='del'>-	.inodelk     = dht_inodelk,</div><div class='del'>-	.finodelk    = dht_finodelk,</div><div class='del'>-	.entrylk     = dht_entrylk,</div><div class='del'>-	.fentrylk    = dht_fentrylk,</div><div class='del'>-	.xattrop     = dht_xattrop,</div><div class='del'>-	.fxattrop    = dht_fxattrop,</div><div class='del'>-        .setattr     = dht_setattr,</div><div class='add'>+dht_methods_t dht_methods = {</div><div class='add'>+    .migration_get_dst_subvol = dht_migration_get_dst_subvol,</div><div class='add'>+    .layout_search = dht_layout_search,</div><div class='ctx'> };</div><div class='ctx'> </div><div class='del'>-</div><div class='del'>-struct xlator_cbks cbks = {</div><div class='del'>-	.forget     = dht_forget</div><div class='add'>+struct xlator_fops fops = {</div><div class='add'>+    .lookup = nufa_lookup,</div><div class='add'>+    .create = nufa_create,</div><div class='add'>+    .mknod = nufa_mknod,</div><div class='add'>+</div><div class='add'>+    .stat = dht_stat,</div><div class='add'>+    .fstat = dht_fstat,</div><div class='add'>+    .truncate = dht_truncate,</div><div class='add'>+    .ftruncate = dht_ftruncate,</div><div class='add'>+    .access = dht_access,</div><div class='add'>+    .readlink = dht_readlink,</div><div class='add'>+    .setxattr = dht_setxattr,</div><div class='add'>+    .getxattr = dht_getxattr,</div><div class='add'>+    .removexattr = dht_removexattr,</div><div class='add'>+    .open = dht_open,</div><div class='add'>+    .readv = dht_readv,</div><div class='add'>+    .writev = dht_writev,</div><div class='add'>+    .flush = dht_flush,</div><div class='add'>+    .fsync = dht_fsync,</div><div class='add'>+    .statfs = dht_statfs,</div><div class='add'>+    .lk = dht_lk,</div><div class='add'>+    .opendir = dht_opendir,</div><div class='add'>+    .readdir = dht_readdir,</div><div class='add'>+    .readdirp = dht_readdirp,</div><div class='add'>+    .fsyncdir = dht_fsyncdir,</div><div class='add'>+    .symlink = dht_symlink,</div><div class='add'>+    .unlink = dht_unlink,</div><div class='add'>+    .link = dht_link,</div><div class='add'>+    .mkdir = dht_mkdir,</div><div class='add'>+    .rmdir = dht_rmdir,</div><div class='add'>+    .rename = dht_rename,</div><div class='add'>+    .inodelk = dht_inodelk,</div><div class='add'>+    .finodelk = dht_finodelk,</div><div class='add'>+    .entrylk = dht_entrylk,</div><div class='add'>+    .fentrylk = dht_fentrylk,</div><div class='add'>+    .xattrop = dht_xattrop,</div><div class='add'>+    .fxattrop = dht_fxattrop,</div><div class='add'>+    .setattr = dht_setattr,</div><div class='ctx'> };</div><div class='ctx'> </div><div class='del'>-</div><div class='del'>-struct volume_options options[] = {</div><div class='del'>-        { .key  = {"lookup-unhashed"},</div><div class='del'>-          .value = {"auto", "yes", "no", "enable", "disable", "1", "0",</div><div class='del'>-                    "on", "off"},</div><div class='del'>-	  .type = GF_OPTION_TYPE_STR</div><div class='del'>-	},</div><div class='del'>-	{ .key  = {"local-volume-name"},</div><div class='del'>-	  .type = GF_OPTION_TYPE_XLATOR</div><div class='del'>-	},</div><div class='del'>-        { .key  = {"min-free-disk"},</div><div class='del'>-          .type = GF_OPTION_TYPE_PERCENT_OR_SIZET,</div><div class='del'>-        },</div><div class='del'>-	{ .key  = {NULL} },</div><div class='add'>+struct xlator_cbks cbks = {.forget = dht_forget};</div><div class='add'>+extern int32_t</div><div class='add'>+mem_acct_init(xlator_t *this);</div><div class='add'>+</div><div class='add'>+xlator_api_t xlator_api = {</div><div class='add'>+    .init = nufa_init,</div><div class='add'>+    .fini = dht_fini,</div><div class='add'>+    .notify = dht_notify,</div><div class='add'>+    .reconfigure = dht_reconfigure,</div><div class='add'>+    .mem_acct_init = mem_acct_init,</div><div class='add'>+    .op_version = {1}, /* Present from the initial version */</div><div class='add'>+    .fops = &amp;fops,</div><div class='add'>+    .cbks = &amp;cbks,</div><div class='add'>+    .options = dht_options,</div><div class='add'>+    .identifier = "nufa",</div><div class='add'>+    .category = GF_TECH_PREVIEW,</div><div class='ctx'> };</div><div class='head'>diff --git a/xlators/cluster/dht/src/switch.c b/xlators/cluster/dht/src/switch.c<br/>index f3de211fd4b..207d109a025 100644<br/>--- a/<a href='/cgit/glusterfs.git/tree/xlators/cluster/dht/src/switch.c?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/cluster/dht/src/switch.c</a><br/>+++ b/<a href='/cgit/glusterfs.git/tree/xlators/cluster/dht/src/switch.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>xlators/cluster/dht/src/switch.c</a></div><div class='hunk'>@@ -1,29 +1,14 @@</div><div class='ctx'> /*</div><div class='del'>-   Copyright (c) 2009 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='del'>-   This file is part of GlusterFS.</div><div class='del'>-</div><div class='del'>-   GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-   it under the terms of the GNU General Public License as published</div><div class='del'>-   by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-   or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-   GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-   WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-   General Public License for more details.</div><div class='del'>-</div><div class='del'>-   You should have received a copy of the GNU General Public License</div><div class='del'>-   along with this program.  If not, see</div><div class='del'>-   &lt;http://www.gnu.org/licenses/&gt;.</div><div class='del'>-*/</div><div class='del'>-</div><div class='add'>+  Copyright (c) 2008-2012 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='ctx'> </div><div class='del'>-#ifndef _CONFIG_H</div><div class='del'>-#define _CONFIG_H</div><div class='del'>-#include "config.h"</div><div class='del'>-#endif</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='ctx'> </div><div class='del'>-#include "dht-common.c"</div><div class='add'>+#include "dht-common.h"</div><div class='ctx'> #include "dht-mem-types.h"</div><div class='ctx'> </div><div class='ctx'> #include &lt;sys/time.h&gt;</div><div class='hunk'>@@ -31,1036 +16,876 @@</div><div class='ctx'> #include &lt;fnmatch.h&gt;</div><div class='ctx'> #include &lt;string.h&gt;</div><div class='ctx'> </div><div class='add'>+extern struct volume_options dht_options[];</div><div class='add'>+</div><div class='ctx'> struct switch_sched_array {</div><div class='del'>-	xlator_t *xl;</div><div class='del'>-	int32_t   eligible;</div><div class='del'>-	int32_t   considered;</div><div class='add'>+    xlator_t *xl;</div><div class='add'>+    int32_t eligible;</div><div class='add'>+    int32_t considered;</div><div class='ctx'> };</div><div class='ctx'> </div><div class='ctx'> /* Select one of this struct based on the path's pattern match */</div><div class='ctx'> struct switch_struct {</div><div class='del'>-	struct switch_struct      *next;</div><div class='del'>-        struct switch_sched_array *array;</div><div class='del'>-	int32_t                    node_index; /* Index of the node in</div><div class='del'>-                                                  this pattern. */</div><div class='del'>-	int32_t                    num_child;  /* Total num of child nodes</div><div class='del'>-                                                  with this pattern. */</div><div class='del'>-	char                       path_pattern[256];</div><div class='add'>+    struct switch_struct *next;</div><div class='add'>+    struct switch_sched_array *array;</div><div class='add'>+    int32_t node_index; /* Index of the node in</div><div class='add'>+                           this pattern. */</div><div class='add'>+    int32_t num_child;  /* Total num of child nodes</div><div class='add'>+                           with this pattern. */</div><div class='add'>+    char path_pattern[256];</div><div class='ctx'> };</div><div class='ctx'> </div><div class='ctx'> /* TODO: all 'TODO's in dht.c holds good */</div><div class='ctx'> /* This function should return child node as '*:subvolumes' is inserterd */</div><div class='ctx'> </div><div class='ctx'> static int32_t</div><div class='del'>-gf_switch_valid_child (xlator_t *this, const char *child)</div><div class='add'>+gf_switch_valid_child(xlator_t *this, const char *child)</div><div class='ctx'> {</div><div class='del'>-        xlator_list_t *children = NULL;</div><div class='del'>-        int32_t        ret = 0;</div><div class='del'>-</div><div class='del'>-        children = this-&gt;children;</div><div class='del'>-        while (children) {</div><div class='del'>-                if (!strcmp (child, children-&gt;xlator-&gt;name)) {</div><div class='del'>-                        ret = 1;</div><div class='del'>-                        break;</div><div class='del'>-                }</div><div class='del'>-                children = children-&gt;next;</div><div class='add'>+    xlator_list_t *children = NULL;</div><div class='add'>+    int32_t ret = 0;</div><div class='add'>+</div><div class='add'>+    children = this-&gt;children;</div><div class='add'>+    while (children) {</div><div class='add'>+        if (!strcmp(child, children-&gt;xlator-&gt;name)) {</div><div class='add'>+            ret = 1;</div><div class='add'>+            break;</div><div class='ctx'>         }</div><div class='add'>+        children = children-&gt;next;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        return ret;</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> static xlator_t *</div><div class='del'>-get_switch_matching_subvol (const char *path, dht_conf_t *conf,</div><div class='del'>-                            xlator_t *hashed_subvol)</div><div class='add'>+get_switch_matching_subvol(const char *path, dht_conf_t *conf,</div><div class='add'>+                           xlator_t *hashed_subvol)</div><div class='ctx'> {</div><div class='del'>-        struct switch_struct *cond      = NULL;</div><div class='del'>-	struct switch_struct *trav      = NULL;</div><div class='del'>-	char                 *pathname  = NULL;</div><div class='del'>-	int                   idx     = 0;</div><div class='del'>-</div><div class='del'>-        cond = conf-&gt;private;</div><div class='del'>-        if (!cond)</div><div class='del'>-                return hashed_subvol;</div><div class='del'>-</div><div class='del'>-        trav = cond;</div><div class='del'>-        pathname = gf_strdup (path);</div><div class='del'>-	while (trav) {</div><div class='del'>-		if (fnmatch (trav-&gt;path_pattern,</div><div class='del'>-			     pathname, FNM_NOESCAPE) == 0) {</div><div class='del'>-                        for (idx = 0; idx &lt; trav-&gt;num_child; idx++) {</div><div class='del'>-                                if (trav-&gt;array[idx].xl == hashed_subvol)</div><div class='del'>-                                        return hashed_subvol;</div><div class='del'>-                        }</div><div class='del'>-                        idx = trav-&gt;node_index++;</div><div class='del'>-                        trav-&gt;node_index %= trav-&gt;num_child;</div><div class='del'>-                        return trav-&gt;array[idx].xl;</div><div class='del'>-		}</div><div class='del'>-		trav = trav-&gt;next;</div><div class='del'>-	}</div><div class='del'>-	GF_FREE (pathname);</div><div class='del'>-	return hashed_subvol;</div><div class='del'>-}</div><div class='add'>+    struct switch_struct *cond = NULL;</div><div class='add'>+    struct switch_struct *trav = NULL;</div><div class='add'>+    char *pathname = NULL;</div><div class='add'>+    int idx = 0;</div><div class='add'>+    xlator_t *subvol = NULL;</div><div class='add'>+</div><div class='add'>+    cond = conf-&gt;private;</div><div class='add'>+    subvol = hashed_subvol;</div><div class='add'>+    if (!cond)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    pathname = gf_strdup(path);</div><div class='add'>+    if (!pathname)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    trav = cond;</div><div class='add'>+    while (trav) {</div><div class='add'>+        if (fnmatch(trav-&gt;path_pattern, pathname, FNM_NOESCAPE) == 0) {</div><div class='add'>+            for (idx = 0; idx &lt; trav-&gt;num_child; idx++) {</div><div class='add'>+                if (trav-&gt;array[idx].xl == hashed_subvol)</div><div class='add'>+                    goto out;</div><div class='add'>+            }</div><div class='add'>+            idx = trav-&gt;node_index++;</div><div class='add'>+            trav-&gt;node_index %= trav-&gt;num_child;</div><div class='add'>+            subvol = trav-&gt;array[idx].xl;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+        trav = trav-&gt;next;</div><div class='add'>+    }</div><div class='add'>+out:</div><div class='add'>+    GF_FREE(pathname);</div><div class='ctx'> </div><div class='add'>+    return subvol;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-switch_local_lookup_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-                         int op_ret, int op_errno,</div><div class='del'>-                         inode_t *inode, struct iatt *stbuf, dict_t *xattr,</div><div class='del'>-                         struct iatt *postparent)</div><div class='add'>+switch_local_lookup_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                        int op_ret, int op_errno, inode_t *inode,</div><div class='add'>+                        struct iatt *stbuf, dict_t *xattr,</div><div class='add'>+                        struct iatt *postparent)</div><div class='ctx'> {</div><div class='del'>-        xlator_t     *subvol      = NULL;</div><div class='del'>-        char          is_linkfile = 0;</div><div class='del'>-        char          is_dir      = 0;</div><div class='del'>-        dht_conf_t   *conf        = NULL;</div><div class='del'>-        dht_local_t  *local       = NULL;</div><div class='del'>-        loc_t        *loc         = NULL;</div><div class='del'>-        int           i           = 0;</div><div class='del'>-        call_frame_t *prev        = NULL;</div><div class='del'>-	int           call_cnt    = 0;</div><div class='del'>-        int           ret         = 0;</div><div class='del'>-</div><div class='del'>-        conf  = this-&gt;private;</div><div class='del'>-</div><div class='del'>-        prev  = cookie;</div><div class='del'>-        local = frame-&gt;local;</div><div class='del'>-        loc   = &amp;local-&gt;loc;</div><div class='del'>-</div><div class='del'>-	if (ENTRY_MISSING (op_ret, op_errno)) {</div><div class='del'>-		if (conf-&gt;search_unhashed) {</div><div class='del'>-			local-&gt;op_errno = ENOENT;</div><div class='del'>-			dht_lookup_everywhere (frame, this, loc);</div><div class='del'>-			return 0;</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-        if (op_ret == -1)</div><div class='del'>-                goto out;</div><div class='del'>-</div><div class='del'>-        is_linkfile = check_is_linkfile (inode, stbuf, xattr);</div><div class='del'>-        is_dir      = check_is_dir (inode, stbuf, xattr);</div><div class='del'>-</div><div class='del'>-        if (!is_dir &amp;&amp; !is_linkfile) {</div><div class='del'>-                /* non-directory and not a linkfile */</div><div class='del'>-</div><div class='del'>-		dht_itransform (this, prev-&gt;this, stbuf-&gt;ia_ino,</div><div class='del'>-				&amp;stbuf-&gt;ia_ino);</div><div class='del'>-</div><div class='del'>-		ret = dht_layout_preset (this, prev-&gt;this, inode);</div><div class='del'>-		if (ret &lt; 0) {</div><div class='del'>-			gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-				"could not set pre-set layout for subvol %s",</div><div class='del'>-				prev-&gt;this-&gt;name);</div><div class='del'>-			op_ret   = -1;</div><div class='del'>-			op_errno = EINVAL;</div><div class='del'>-			goto err;</div><div class='del'>-		}</div><div class='del'>-</div><div class='del'>-                goto out;</div><div class='add'>+    xlator_t *subvol = NULL;</div><div class='add'>+    char is_linkfile = 0;</div><div class='add'>+    char is_dir = 0;</div><div class='add'>+    dht_conf_t *conf = NULL;</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    loc_t *loc = NULL;</div><div class='add'>+    int i = 0;</div><div class='add'>+    xlator_t *prev = NULL;</div><div class='add'>+    int call_cnt = 0;</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    conf = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    prev = cookie;</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    loc = &amp;local-&gt;loc;</div><div class='add'>+</div><div class='add'>+    if (ENTRY_MISSING(op_ret, op_errno)) {</div><div class='add'>+        if (conf-&gt;search_unhashed) {</div><div class='add'>+            local-&gt;op_errno = ENOENT;</div><div class='add'>+            dht_lookup_everywhere(frame, this, loc);</div><div class='add'>+            return 0;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (op_ret == -1)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    is_linkfile = check_is_linkfile(inode, stbuf, xattr, conf-&gt;link_xattr_name);</div><div class='add'>+    is_dir = check_is_dir(inode, stbuf, xattr);</div><div class='add'>+</div><div class='add'>+    if (!is_dir &amp;&amp; !is_linkfile) {</div><div class='add'>+        /* non-directory and not a linkfile */</div><div class='add'>+</div><div class='add'>+        ret = dht_layout_preset(this, prev, inode);</div><div class='add'>+        if (ret &lt; 0) {</div><div class='add'>+            gf_msg_debug(this-&gt;name, 0,</div><div class='add'>+                         "could not set pre-set layout "</div><div class='add'>+                         "for subvol %s",</div><div class='add'>+                         prev-&gt;name);</div><div class='add'>+            op_ret = -1;</div><div class='add'>+            op_errno = EINVAL;</div><div class='add'>+            goto err;</div><div class='ctx'>         }</div><div class='ctx'> </div><div class='del'>-        if (is_dir) {</div><div class='del'>-                call_cnt        = conf-&gt;subvolume_cnt;</div><div class='del'>-		local-&gt;call_cnt = call_cnt;</div><div class='del'>-</div><div class='del'>-                local-&gt;inode = inode_ref (inode);</div><div class='del'>-                local-&gt;xattr = dict_ref (xattr);</div><div class='del'>-</div><div class='del'>-		local-&gt;op_ret = 0;</div><div class='del'>-		local-&gt;op_errno = 0;</div><div class='del'>-</div><div class='del'>-		local-&gt;layout = dht_layout_new (this, conf-&gt;subvolume_cnt);</div><div class='del'>-		if (!local-&gt;layout) {</div><div class='del'>-			op_ret   = -1;</div><div class='del'>-			op_errno = ENOMEM;</div><div class='del'>-			gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-				"memory allocation failed :(");</div><div class='del'>-			goto err;</div><div class='del'>-		}</div><div class='del'>-</div><div class='del'>-                for (i = 0; i &lt; call_cnt; i++) {</div><div class='del'>-                        STACK_WIND (frame, dht_lookup_dir_cbk,</div><div class='del'>-                                    conf-&gt;subvolumes[i],</div><div class='del'>-                                    conf-&gt;subvolumes[i]-&gt;fops-&gt;lookup,</div><div class='del'>-                                    &amp;local-&gt;loc, local-&gt;xattr_req);</div><div class='del'>-                }</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (is_dir) {</div><div class='add'>+        call_cnt = conf-&gt;subvolume_cnt;</div><div class='add'>+        local-&gt;call_cnt = call_cnt;</div><div class='add'>+</div><div class='add'>+        local-&gt;inode = inode_ref(inode);</div><div class='add'>+        local-&gt;xattr = dict_ref(xattr);</div><div class='add'>+</div><div class='add'>+        local-&gt;op_ret = 0;</div><div class='add'>+        local-&gt;op_errno = 0;</div><div class='add'>+</div><div class='add'>+        local-&gt;layout = dht_layout_new(this, conf-&gt;subvolume_cnt);</div><div class='add'>+        if (!local-&gt;layout) {</div><div class='add'>+            op_ret = -1;</div><div class='add'>+            op_errno = ENOMEM;</div><div class='add'>+            gf_msg_debug(this-&gt;name, 0, "memory allocation failed :(");</div><div class='add'>+            goto err;</div><div class='ctx'>         }</div><div class='ctx'> </div><div class='del'>-        if (is_linkfile) {</div><div class='del'>-                subvol = dht_linkfile_subvol (this, inode, stbuf, xattr);</div><div class='add'>+        for (i = 0; i &lt; call_cnt; i++) {</div><div class='add'>+            STACK_WIND_COOKIE(frame, dht_lookup_dir_cbk, conf-&gt;subvolumes[i],</div><div class='add'>+                              conf-&gt;subvolumes[i],</div><div class='add'>+                              conf-&gt;subvolumes[i]-&gt;fops-&gt;lookup, &amp;local-&gt;loc,</div><div class='add'>+                              local-&gt;xattr_req);</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-                if (!subvol) {</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-                                "linkfile not having link subvolume. path=%s",</div><div class='del'>-                                loc-&gt;path);</div><div class='del'>-			dht_lookup_everywhere (frame, this, loc);</div><div class='del'>-			return 0;</div><div class='del'>-                }</div><div class='add'>+    if (is_linkfile) {</div><div class='add'>+        subvol = dht_linkfile_subvol(this, inode, stbuf, xattr);</div><div class='ctx'> </div><div class='del'>-		STACK_WIND (frame, dht_lookup_linkfile_cbk,</div><div class='del'>-			    subvol, subvol-&gt;fops-&gt;lookup,</div><div class='del'>-			    &amp;local-&gt;loc, local-&gt;xattr_req);</div><div class='add'>+        if (!subvol) {</div><div class='add'>+            gf_msg_debug(this-&gt;name, 0,</div><div class='add'>+                         "linkfile has no link subvolume.path=%s", loc-&gt;path);</div><div class='add'>+            dht_lookup_everywhere(frame, this, loc);</div><div class='add'>+            return 0;</div><div class='ctx'>         }</div><div class='ctx'> </div><div class='del'>-        return 0;</div><div class='add'>+        STACK_WIND_COOKIE(frame, dht_lookup_linkfile_cbk, subvol, subvol,</div><div class='add'>+                          subvol-&gt;fops-&gt;lookup, &amp;local-&gt;loc, local-&gt;xattr_req);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='ctx'> </div><div class='ctx'> out:</div><div class='del'>-	if (!local-&gt;hashed_subvol) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-			"no subvolume in layout for path=%s",</div><div class='del'>-			local-&gt;loc.path);</div><div class='del'>-                local-&gt;op_errno = ENOENT;</div><div class='del'>-                dht_lookup_everywhere (frame, this, loc);</div><div class='del'>-                return 0;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	STACK_WIND (frame, dht_lookup_cbk,</div><div class='del'>-		    local-&gt;hashed_subvol, local-&gt;hashed_subvol-&gt;fops-&gt;lookup,</div><div class='del'>-		    &amp;local-&gt;loc, local-&gt;xattr_req);</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>-</div><div class='del'>- err:</div><div class='del'>-        DHT_STACK_UNWIND (lookup, frame, op_ret, op_errno,</div><div class='del'>-                          inode, stbuf, xattr, NULL);</div><div class='add'>+    if (!local-&gt;hashed_subvol) {</div><div class='add'>+        gf_msg_debug(this-&gt;name, 0, "no subvolume in layout for path=%s",</div><div class='add'>+                     local-&gt;loc.path);</div><div class='add'>+        local-&gt;op_errno = ENOENT;</div><div class='add'>+        dht_lookup_everywhere(frame, this, loc);</div><div class='ctx'>         return 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    STACK_WIND_COOKIE(frame, dht_lookup_cbk, local-&gt;hashed_subvol,</div><div class='add'>+                      local-&gt;hashed_subvol, local-&gt;hashed_subvol-&gt;fops-&gt;lookup,</div><div class='add'>+                      &amp;local-&gt;loc, local-&gt;xattr_req);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+</div><div class='add'>+err:</div><div class='add'>+    DHT_STACK_UNWIND(lookup, frame, op_ret, op_errno, inode, stbuf, xattr,</div><div class='add'>+                     NULL);</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-switch_lookup (call_frame_t *frame, xlator_t *this,</div><div class='del'>-	     loc_t *loc, dict_t *xattr_req)</div><div class='add'>+switch_lookup(call_frame_t *frame, xlator_t *this, loc_t *loc,</div><div class='add'>+              dict_t *xattr_req)</div><div class='ctx'> {</div><div class='del'>-        xlator_t     *hashed_subvol = NULL;</div><div class='del'>-        xlator_t     *cached_subvol = NULL;</div><div class='del'>-        xlator_t     *subvol = NULL;</div><div class='del'>-        dht_local_t  *local  = NULL;</div><div class='del'>-	dht_conf_t   *conf = NULL;</div><div class='del'>-        int           ret    = -1;</div><div class='del'>-        int           op_errno = -1;</div><div class='del'>-	dht_layout_t *layout = NULL;</div><div class='del'>-	int           i = 0;</div><div class='del'>-	int           call_cnt = 0;</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-        VALIDATE_OR_GOTO (frame, err);</div><div class='del'>-        VALIDATE_OR_GOTO (this, err);</div><div class='del'>-        VALIDATE_OR_GOTO (loc, err);</div><div class='del'>-        VALIDATE_OR_GOTO (loc-&gt;inode, err);</div><div class='del'>-        VALIDATE_OR_GOTO (loc-&gt;path, err);</div><div class='del'>-</div><div class='del'>-	conf = this-&gt;private;</div><div class='del'>-</div><div class='del'>-        local = dht_local_init (frame);</div><div class='del'>-	if (!local) {</div><div class='del'>-		op_errno = ENOMEM;</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-			"Out of memory");</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-        ret = loc_dup (loc, &amp;local-&gt;loc);</div><div class='del'>-        if (ret == -1) {</div><div class='del'>-                op_errno = errno;</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-                        "copying location failed for path=%s",</div><div class='del'>-                        loc-&gt;path);</div><div class='del'>-                goto err;</div><div class='add'>+    xlator_t *hashed_subvol = NULL;</div><div class='add'>+    xlator_t *cached_subvol = NULL;</div><div class='add'>+    xlator_t *subvol = NULL;</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    dht_conf_t *conf = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int op_errno = -1;</div><div class='add'>+    dht_layout_t *layout = NULL;</div><div class='add'>+    int i = 0;</div><div class='add'>+    int call_cnt = 0;</div><div class='add'>+</div><div class='add'>+    VALIDATE_OR_GOTO(frame, err);</div><div class='add'>+    VALIDATE_OR_GOTO(this, err);</div><div class='add'>+    VALIDATE_OR_GOTO(loc, err);</div><div class='add'>+    VALIDATE_OR_GOTO(loc-&gt;inode, err);</div><div class='add'>+    VALIDATE_OR_GOTO(loc-&gt;path, err);</div><div class='add'>+</div><div class='add'>+    conf = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    local = dht_local_init(frame, loc, NULL, GF_FOP_LOOKUP);</div><div class='add'>+    if (!local) {</div><div class='add'>+        op_errno = ENOMEM;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (xattr_req) {</div><div class='add'>+        local-&gt;xattr_req = dict_ref(xattr_req);</div><div class='add'>+    } else {</div><div class='add'>+        local-&gt;xattr_req = dict_new();</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    hashed_subvol = dht_subvol_get_hashed(this, &amp;local-&gt;loc);</div><div class='add'>+    cached_subvol = local-&gt;cached_subvol;</div><div class='add'>+</div><div class='add'>+    local-&gt;hashed_subvol = hashed_subvol;</div><div class='add'>+</div><div class='add'>+    if (is_revalidate(loc)) {</div><div class='add'>+        layout = local-&gt;layout;</div><div class='add'>+        if (!layout) {</div><div class='add'>+            gf_msg_debug(this-&gt;name, 0,</div><div class='add'>+                         "revalidate lookup without cache. path=%s", loc-&gt;path);</div><div class='add'>+            op_errno = EINVAL;</div><div class='add'>+            goto err;</div><div class='ctx'>         }</div><div class='ctx'> </div><div class='del'>-	if (xattr_req) {</div><div class='del'>-		local-&gt;xattr_req = dict_ref (xattr_req);</div><div class='del'>-	} else {</div><div class='del'>-		local-&gt;xattr_req = dict_new ();</div><div class='del'>-	}</div><div class='add'>+        if (layout-&gt;gen &amp;&amp; (layout-&gt;gen &lt; conf-&gt;gen)) {</div><div class='add'>+            gf_msg_debug(this-&gt;name, 0, "incomplete layout failure for path=%s",</div><div class='add'>+                         loc-&gt;path);</div><div class='add'>+            dht_layout_unref(this, local-&gt;layout);</div><div class='add'>+            goto do_fresh_lookup;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-	hashed_subvol = dht_subvol_get_hashed (this, &amp;local-&gt;loc);</div><div class='del'>-	cached_subvol = dht_subvol_get_cached (this, local-&gt;loc.inode);</div><div class='add'>+        local-&gt;inode = inode_ref(loc-&gt;inode);</div><div class='ctx'> </div><div class='del'>-	local-&gt;cached_subvol = cached_subvol;</div><div class='del'>-	local-&gt;hashed_subvol = hashed_subvol;</div><div class='add'>+        local-&gt;call_cnt = layout-&gt;cnt;</div><div class='add'>+        call_cnt = local-&gt;call_cnt;</div><div class='ctx'> </div><div class='del'>-        if (is_revalidate (loc)) {</div><div class='del'>-		local-&gt;layout = layout = dht_layout_get (this, loc-&gt;inode);</div><div class='add'>+        /* NOTE: we don't require 'trusted.glusterfs.dht.linkto'</div><div class='add'>+         * attribute, revalidates directly go to the cached-subvolume.</div><div class='add'>+         */</div><div class='add'>+        ret = dict_set_uint32(local-&gt;xattr_req, conf-&gt;xattr_name, 4 * 4);</div><div class='add'>+        if (ret &lt; 0)</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_WARNING, 0, DHT_MSG_DICT_SET_FAILED,</div><div class='add'>+                   "failed to set dict value for %s", conf-&gt;xattr_name);</div><div class='ctx'> </div><div class='del'>-                if (!layout) {</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-                                "revalidate without cache. path=%s",</div><div class='del'>-                                loc-&gt;path);</div><div class='del'>-                        op_errno = EINVAL;</div><div class='del'>-                        goto err;</div><div class='del'>-                }</div><div class='add'>+        for (i = 0; i &lt; layout-&gt;cnt; i++) {</div><div class='add'>+            subvol = layout-&gt;list[i].xlator;</div><div class='ctx'> </div><div class='del'>-		if (layout-&gt;gen &amp;&amp; (layout-&gt;gen &lt; conf-&gt;gen)) {</div><div class='del'>-			gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-				"incomplete layout failure for path=%s",</div><div class='del'>-				loc-&gt;path);</div><div class='del'>-                        dht_layout_unref (this, local-&gt;layout);</div><div class='del'>-			goto do_fresh_lookup;</div><div class='del'>-		}</div><div class='del'>-</div><div class='del'>-		local-&gt;inode    = inode_ref (loc-&gt;inode);</div><div class='del'>-		local-&gt;ia_ino   = loc-&gt;inode-&gt;ino;</div><div class='del'>-</div><div class='del'>-		local-&gt;call_cnt = layout-&gt;cnt;</div><div class='del'>-		call_cnt = local-&gt;call_cnt;</div><div class='del'>-</div><div class='del'>-		/* NOTE: we don't require 'trusted.glusterfs.dht.linkto'</div><div class='del'>-                 * attribute, revalidates directly go to the cached-subvolume.</div><div class='del'>-		 */</div><div class='del'>-		ret = dict_set_uint32 (local-&gt;xattr_req,</div><div class='del'>-				       "trusted.glusterfs.dht", 4 * 4);</div><div class='del'>-                if (ret &lt; 0)</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_WARNING,</div><div class='del'>-                                "failed to set dict value for "</div><div class='del'>-                                "trusted.glusterfs.dht");</div><div class='del'>-</div><div class='del'>-		for (i = 0; i &lt; layout-&gt;cnt; i++) {</div><div class='del'>-			subvol = layout-&gt;list[i].xlator;</div><div class='del'>-</div><div class='del'>-			STACK_WIND (frame, dht_revalidate_cbk,</div><div class='del'>-				    subvol, subvol-&gt;fops-&gt;lookup,</div><div class='del'>-				    loc, local-&gt;xattr_req);</div><div class='del'>-</div><div class='del'>-			if (!--call_cnt)</div><div class='del'>-				break;</div><div class='del'>-		}</div><div class='del'>-	} else {</div><div class='del'>-        do_fresh_lookup:</div><div class='del'>-		ret = dict_set_uint32 (local-&gt;xattr_req,</div><div class='del'>-				       "trusted.glusterfs.dht", 4 * 4);</div><div class='del'>-                if (ret &lt; 0)</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_WARNING,</div><div class='del'>-                                "failed to set dict value for "</div><div class='del'>-                                "trusted.glusterfs.dht");</div><div class='del'>-                </div><div class='del'>-		ret = dict_set_uint32 (local-&gt;xattr_req,</div><div class='del'>-				       "trusted.glusterfs.dht.linkto", 256);</div><div class='del'>-                if (ret &lt; 0)</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_WARNING, </div><div class='del'>-                                "failed to set dict value for " </div><div class='del'>-                                "trusted.glusterfs.dht.linkto");</div><div class='del'>-</div><div class='del'>-                if (!hashed_subvol) {</div><div class='del'>-			gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-				"no subvolume in layout for path=%s, "</div><div class='del'>-				"checking on all the subvols to see if "</div><div class='del'>-				"it is a directory", loc-&gt;path);</div><div class='del'>- 			call_cnt        = conf-&gt;subvolume_cnt;</div><div class='del'>- 			local-&gt;call_cnt = call_cnt;</div><div class='del'>-</div><div class='del'>- 			local-&gt;layout = dht_layout_new (this,</div><div class='del'>-                                                        conf-&gt;subvolume_cnt);</div><div class='del'>- 			if (!local-&gt;layout) {</div><div class='del'>- 				op_errno = ENOMEM;</div><div class='del'>- 				gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>- 					"Out of memory");</div><div class='del'>- 				goto err;</div><div class='del'>- 			}</div><div class='del'>-</div><div class='del'>-			for (i = 0; i &lt; call_cnt; i++) {</div><div class='del'>- 				STACK_WIND (frame, dht_lookup_dir_cbk,</div><div class='del'>- 					    conf-&gt;subvolumes[i],</div><div class='del'>- 					    conf-&gt;subvolumes[i]-&gt;fops-&gt;lookup,</div><div class='del'>- 					    &amp;local-&gt;loc, local-&gt;xattr_req);</div><div class='del'>- 			}</div><div class='del'>- 			return 0;</div><div class='del'>-                }</div><div class='add'>+            STACK_WIND_COOKIE(frame, dht_revalidate_cbk, subvol, subvol,</div><div class='add'>+                              subvol-&gt;fops-&gt;lookup, loc, local-&gt;xattr_req);</div><div class='ctx'> </div><div class='del'>-		/*  */</div><div class='del'>-                cached_subvol = get_switch_matching_subvol (loc-&gt;path, conf,</div><div class='del'>-                                                            hashed_subvol);</div><div class='del'>-                if (cached_subvol == hashed_subvol) {</div><div class='del'>-                        STACK_WIND (frame, dht_lookup_cbk,</div><div class='del'>-                                    hashed_subvol,</div><div class='del'>-                                    hashed_subvol-&gt;fops-&gt;lookup,</div><div class='del'>-                                    loc, local-&gt;xattr_req);</div><div class='del'>-                } else {</div><div class='del'>-                        STACK_WIND (frame, switch_local_lookup_cbk,</div><div class='del'>-                                    cached_subvol,</div><div class='del'>-                                    cached_subvol-&gt;fops-&gt;lookup,</div><div class='del'>-                                    loc, local-&gt;xattr_req);</div><div class='del'>-                }</div><div class='add'>+            if (!--call_cnt)</div><div class='add'>+                break;</div><div class='add'>+        }</div><div class='add'>+    } else {</div><div class='add'>+    do_fresh_lookup:</div><div class='add'>+        ret = dict_set_uint32(local-&gt;xattr_req, conf-&gt;xattr_name, 4 * 4);</div><div class='add'>+        if (ret &lt; 0)</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_WARNING, 0, DHT_MSG_DICT_SET_FAILED,</div><div class='add'>+                   "failed to set dict value for %s", conf-&gt;xattr_name);</div><div class='add'>+</div><div class='add'>+        ret = dict_set_uint32(local-&gt;xattr_req, conf-&gt;link_xattr_name, 256);</div><div class='add'>+        if (ret &lt; 0)</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_WARNING, EINVAL, DHT_MSG_DICT_SET_FAILED,</div><div class='add'>+                   "failed to set dict value for %s", conf-&gt;link_xattr_name);</div><div class='add'>+</div><div class='add'>+        if (!hashed_subvol) {</div><div class='add'>+            gf_msg_debug(this-&gt;name, 0,</div><div class='add'>+                         "no subvolume in layout for path=%s, "</div><div class='add'>+                         "checking on all the subvols to see if "</div><div class='add'>+                         "it is a directory",</div><div class='add'>+                         loc-&gt;path);</div><div class='add'>+            call_cnt = conf-&gt;subvolume_cnt;</div><div class='add'>+            local-&gt;call_cnt = call_cnt;</div><div class='add'>+</div><div class='add'>+            local-&gt;layout = dht_layout_new(this, conf-&gt;subvolume_cnt);</div><div class='add'>+            if (!local-&gt;layout) {</div><div class='add'>+                op_errno = ENOMEM;</div><div class='add'>+                goto err;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            for (i = 0; i &lt; call_cnt; i++) {</div><div class='add'>+                STACK_WIND_COOKIE(frame, dht_lookup_dir_cbk,</div><div class='add'>+                                  conf-&gt;subvolumes[i], conf-&gt;subvolumes[i],</div><div class='add'>+                                  conf-&gt;subvolumes[i]-&gt;fops-&gt;lookup,</div><div class='add'>+                                  &amp;local-&gt;loc, local-&gt;xattr_req);</div><div class='add'>+            }</div><div class='add'>+            return 0;</div><div class='ctx'>         }</div><div class='ctx'> </div><div class='del'>-        return 0;</div><div class='add'>+        /*  */</div><div class='add'>+        cached_subvol = get_switch_matching_subvol(loc-&gt;path, conf,</div><div class='add'>+                                                   hashed_subvol);</div><div class='add'>+        if (cached_subvol == hashed_subvol) {</div><div class='add'>+            STACK_WIND_COOKIE(frame, dht_lookup_cbk, hashed_subvol,</div><div class='add'>+                              hashed_subvol, hashed_subvol-&gt;fops-&gt;lookup, loc,</div><div class='add'>+                              local-&gt;xattr_req);</div><div class='add'>+        } else {</div><div class='add'>+            STACK_WIND_COOKIE(frame, switch_local_lookup_cbk, cached_subvol,</div><div class='add'>+                              cached_subvol, cached_subvol-&gt;fops-&gt;lookup, loc,</div><div class='add'>+                              local-&gt;xattr_req);</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='ctx'> </div><div class='ctx'> err:</div><div class='del'>-	op_errno = (op_errno == -1) ? errno : op_errno;</div><div class='del'>-        DHT_STACK_UNWIND (lookup, frame, -1, op_errno, NULL, NULL, NULL, NULL);</div><div class='del'>-	return 0;</div><div class='add'>+    op_errno = (op_errno == -1) ? errno : op_errno;</div><div class='add'>+    DHT_STACK_UNWIND(lookup, frame, -1, op_errno, NULL, NULL, NULL, NULL);</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-switch_create_linkfile_create_cbk (call_frame_t *frame, void *cookie,</div><div class='del'>-				 xlator_t *this, int op_ret, int op_errno,</div><div class='del'>-                                 inode_t *inode, struct iatt *stbuf,</div><div class='del'>-                                 struct iatt *preparent,</div><div class='del'>-                                 struct iatt *postparent)</div><div class='add'>+switch_create_linkfile_create_cbk(call_frame_t *frame, void *cookie,</div><div class='add'>+                                  xlator_t *this, int op_ret, int op_errno,</div><div class='add'>+                                  inode_t *inode, struct iatt *stbuf,</div><div class='add'>+                                  struct iatt *preparent,</div><div class='add'>+                                  struct iatt *postparent, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-	dht_local_t  *local = NULL;</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='ctx'> </div><div class='del'>-	local = frame-&gt;local;</div><div class='add'>+    local = frame-&gt;local;</div><div class='ctx'> </div><div class='del'>-	if (op_ret == -1)</div><div class='del'>-		goto err;</div><div class='add'>+    if (op_ret == -1)</div><div class='add'>+        goto err;</div><div class='ctx'> </div><div class='del'>-	STACK_WIND (frame, dht_create_cbk,</div><div class='del'>-		    local-&gt;cached_subvol, local-&gt;cached_subvol-&gt;fops-&gt;create,</div><div class='del'>-		    &amp;local-&gt;loc, local-&gt;flags, local-&gt;mode, local-&gt;fd,</div><div class='del'>-                    local-&gt;params);</div><div class='add'>+    STACK_WIND_COOKIE(frame, dht_create_cbk, local-&gt;cached_subvol,</div><div class='add'>+                      local-&gt;cached_subvol, local-&gt;cached_subvol-&gt;fops-&gt;create,</div><div class='add'>+                      &amp;local-&gt;loc, local-&gt;flags, local-&gt;mode, local-&gt;umask,</div><div class='add'>+                      local-&gt;fd, local-&gt;params);</div><div class='ctx'> </div><div class='del'>-	return 0;</div><div class='add'>+    return 0;</div><div class='ctx'> </div><div class='del'>- err:</div><div class='del'>-	DHT_STACK_UNWIND (create, frame, -1, op_errno,</div><div class='del'>-                          NULL, NULL, NULL, NULL, NULL);</div><div class='del'>-	return 0;</div><div class='add'>+err:</div><div class='add'>+    DHT_STACK_UNWIND(create, frame, -1, op_errno, NULL, NULL, NULL, NULL, NULL,</div><div class='add'>+                     NULL);</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-switch_create (call_frame_t *frame, xlator_t *this,</div><div class='del'>-               loc_t *loc, int32_t flags, mode_t mode,</div><div class='del'>-               fd_t *fd, dict_t *params)</div><div class='add'>+switch_create(call_frame_t *frame, xlator_t *this, loc_t *loc, int32_t flags,</div><div class='add'>+              mode_t mode, mode_t umask, fd_t *fd, dict_t *params)</div><div class='ctx'> {</div><div class='del'>-	dht_local_t *local = NULL;</div><div class='del'>-	dht_conf_t  *conf  = NULL;</div><div class='del'>-	xlator_t    *subvol = NULL;</div><div class='del'>-        xlator_t    *avail_subvol = NULL;</div><div class='del'>-	int          op_errno = -1;</div><div class='del'>-	int          ret = -1;</div><div class='del'>-</div><div class='del'>-	VALIDATE_OR_GOTO (frame, err);</div><div class='del'>-	VALIDATE_OR_GOTO (this, err);</div><div class='del'>-	VALIDATE_OR_GOTO (loc, err);</div><div class='del'>-</div><div class='del'>-	conf  = this-&gt;private;</div><div class='del'>-</div><div class='del'>-        dht_get_du_info (frame, this, loc);</div><div class='del'>-</div><div class='del'>-        local = dht_local_init (frame);</div><div class='del'>-	if (!local) {</div><div class='del'>-		op_errno = ENOMEM;</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-			"Out of memory");</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	subvol = dht_subvol_get_hashed (this, loc);</div><div class='del'>-	if (!subvol) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-			"no subvolume in layout for path=%s",</div><div class='del'>-			loc-&gt;path);</div><div class='del'>-		op_errno = ENOENT;</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-        avail_subvol = get_switch_matching_subvol (loc-&gt;path, conf, subvol);</div><div class='del'>-        if (dht_is_subvol_filled (this, avail_subvol)) {</div><div class='del'>-                avail_subvol =</div><div class='del'>-                        dht_free_disk_available_subvol (this, avail_subvol);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (subvol != avail_subvol) {</div><div class='del'>-                /* create a link file instead of actual file */</div><div class='del'>-                ret = loc_copy (&amp;local-&gt;loc, loc);</div><div class='del'>-                if (ret == -1) {</div><div class='del'>-                                gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-                                        "Out of memory");</div><div class='del'>-                                op_errno = ENOMEM;</div><div class='del'>-                                goto err;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                local-&gt;fd = fd_ref (fd);</div><div class='del'>-                local-&gt;mode = mode;</div><div class='del'>-                local-&gt;flags = flags;</div><div class='del'>-</div><div class='del'>-                local-&gt;cached_subvol = avail_subvol;</div><div class='del'>-                dht_linkfile_create (frame,</div><div class='del'>-                                     switch_create_linkfile_create_cbk,</div><div class='del'>-                                     avail_subvol, subvol, loc);</div><div class='del'>-                return 0;</div><div class='del'>-        }</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    dht_conf_t *conf = NULL;</div><div class='add'>+    xlator_t *subvol = NULL;</div><div class='add'>+    xlator_t *avail_subvol = NULL;</div><div class='add'>+    int op_errno = -1;</div><div class='add'>+</div><div class='add'>+    VALIDATE_OR_GOTO(frame, err);</div><div class='add'>+    VALIDATE_OR_GOTO(this, err);</div><div class='add'>+    VALIDATE_OR_GOTO(loc, err);</div><div class='add'>+</div><div class='add'>+    conf = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    dht_get_du_info(frame, this, loc);</div><div class='add'>+</div><div class='add'>+    local = dht_local_init(frame, loc, fd, GF_FOP_CREATE);</div><div class='add'>+    if (!local) {</div><div class='add'>+        op_errno = ENOMEM;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    subvol = dht_subvol_get_hashed(this, loc);</div><div class='add'>+    if (!subvol) {</div><div class='add'>+        gf_msg_debug(this-&gt;name, 0, "no subvolume in layout for path=%s",</div><div class='add'>+                     loc-&gt;path);</div><div class='add'>+        op_errno = ENOENT;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    avail_subvol = get_switch_matching_subvol(loc-&gt;path, conf, subvol);</div><div class='add'>+    if (dht_is_subvol_filled(this, avail_subvol)) {</div><div class='add'>+        avail_subvol = dht_free_disk_available_subvol(this, avail_subvol,</div><div class='add'>+                                                      local);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (subvol != avail_subvol) {</div><div class='add'>+        /* create a link file instead of actual file */</div><div class='add'>+        local-&gt;mode = mode;</div><div class='add'>+        local-&gt;flags = flags;</div><div class='add'>+        local-&gt;umask = umask;</div><div class='add'>+        local-&gt;cached_subvol = avail_subvol;</div><div class='add'>+        dht_linkfile_create(frame, switch_create_linkfile_create_cbk, this,</div><div class='add'>+                            avail_subvol, subvol, loc);</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        gf_log (this-&gt;name, GF_LOG_TRACE,</div><div class='del'>-                "creating %s on %s", loc-&gt;path, subvol-&gt;name);</div><div class='add'>+    gf_msg_trace(this-&gt;name, 0, "creating %s on %s", loc-&gt;path, subvol-&gt;name);</div><div class='ctx'> </div><div class='del'>-        STACK_WIND (frame, dht_create_cbk,</div><div class='del'>-                    subvol, subvol-&gt;fops-&gt;create,</div><div class='del'>-                    loc, flags, mode, fd, params);</div><div class='add'>+    STACK_WIND_COOKIE(frame, dht_create_cbk, subvol, subvol,</div><div class='add'>+                      subvol-&gt;fops-&gt;create, loc, flags, mode, umask, fd,</div><div class='add'>+                      params);</div><div class='ctx'> </div><div class='del'>-        return 0;</div><div class='add'>+    return 0;</div><div class='ctx'> </div><div class='ctx'> err:</div><div class='del'>-	op_errno = (op_errno == -1) ? errno : op_errno;</div><div class='del'>-	DHT_STACK_UNWIND (create, frame, -1, op_errno,</div><div class='del'>-                          NULL, NULL, NULL, NULL, NULL);</div><div class='add'>+    op_errno = (op_errno == -1) ? errno : op_errno;</div><div class='add'>+    DHT_STACK_UNWIND(create, frame, -1, op_errno, NULL, NULL, NULL, NULL, NULL,</div><div class='add'>+                     NULL);</div><div class='ctx'> </div><div class='del'>-	return 0;</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-switch_mknod_linkfile_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-                         int op_ret, int op_errno, inode_t *inode,</div><div class='del'>-                         struct iatt *stbuf, struct iatt *preparent,</div><div class='del'>-                         struct iatt *postparent)</div><div class='add'>+switch_mknod_linkfile_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                          int op_ret, int op_errno, inode_t *inode,</div><div class='add'>+                          struct iatt *stbuf, struct iatt *preparent,</div><div class='add'>+                          struct iatt *postparent, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-	dht_local_t  *local = NULL;</div><div class='del'>-</div><div class='del'>-	local = frame-&gt;local;</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='ctx'> </div><div class='del'>-	if (op_ret &gt;= 0) {</div><div class='del'>-		STACK_WIND (frame, dht_newfile_cbk,</div><div class='del'>-			    local-&gt;cached_subvol,</div><div class='del'>-			    local-&gt;cached_subvol-&gt;fops-&gt;mknod,</div><div class='del'>-			    &amp;local-&gt;loc, local-&gt;mode, local-&gt;rdev,</div><div class='del'>-                            local-&gt;params);</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    if (!local || !local-&gt;cached_subvol) {</div><div class='add'>+        op_errno = EINVAL;</div><div class='add'>+        op_ret = -1;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-		return 0;</div><div class='del'>-	}</div><div class='add'>+    if (op_ret &gt;= 0) {</div><div class='add'>+        STACK_WIND_COOKIE(</div><div class='add'>+            frame, dht_newfile_cbk, (void *)local-&gt;cached_subvol,</div><div class='add'>+            local-&gt;cached_subvol, local-&gt;cached_subvol-&gt;fops-&gt;mknod,</div><div class='add'>+            &amp;local-&gt;loc, local-&gt;mode, local-&gt;rdev, local-&gt;umask, local-&gt;params);</div><div class='ctx'> </div><div class='del'>-	DHT_STACK_UNWIND (link, frame, op_ret, op_errno,</div><div class='del'>-                          inode, stbuf, preparent, postparent);</div><div class='del'>-	return 0;</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='add'>+err:</div><div class='add'>+    DHT_STACK_UNWIND(link, frame, op_ret, op_errno, inode, stbuf, preparent,</div><div class='add'>+                     postparent, xdata);</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-switch_mknod (call_frame_t *frame, xlator_t *this,</div><div class='del'>-              loc_t *loc, mode_t mode, dev_t rdev, dict_t *params)</div><div class='add'>+switch_mknod(call_frame_t *frame, xlator_t *this, loc_t *loc, mode_t mode,</div><div class='add'>+             dev_t rdev, mode_t umask, dict_t *params)</div><div class='ctx'> {</div><div class='del'>-	dht_local_t *local = NULL;</div><div class='del'>-	dht_conf_t  *conf  = NULL;</div><div class='del'>-	xlator_t    *subvol = NULL;</div><div class='del'>-        xlator_t    *avail_subvol = NULL;</div><div class='del'>-	int          op_errno = -1;</div><div class='del'>-	int          ret = -1;</div><div class='del'>-</div><div class='del'>-	VALIDATE_OR_GOTO (frame, err);</div><div class='del'>-	VALIDATE_OR_GOTO (this, err);</div><div class='del'>-	VALIDATE_OR_GOTO (loc, err);</div><div class='del'>-</div><div class='del'>-	conf  = this-&gt;private;</div><div class='del'>-</div><div class='del'>-        dht_get_du_info (frame, this, loc);</div><div class='del'>-</div><div class='del'>-        local = dht_local_init (frame);</div><div class='del'>-	if (!local) {</div><div class='del'>-		op_errno = ENOMEM;</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-			"Out of memory");</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	subvol = dht_subvol_get_hashed (this, loc);</div><div class='del'>-	if (!subvol) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-			"no subvolume in layout for path=%s",</div><div class='del'>-			loc-&gt;path);</div><div class='del'>-		op_errno = ENOENT;</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-        /* Consider the disksize in consideration */</div><div class='del'>-        avail_subvol = get_switch_matching_subvol (loc-&gt;path, conf, subvol);</div><div class='del'>-        if (dht_is_subvol_filled (this, avail_subvol)) {</div><div class='del'>-                avail_subvol =</div><div class='del'>-                        dht_free_disk_available_subvol (this, avail_subvol);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-	if (avail_subvol != subvol) {</div><div class='del'>-		/* Create linkfile first */</div><div class='del'>-		ret = loc_copy (&amp;local-&gt;loc, loc);</div><div class='del'>-		if (ret == -1) {</div><div class='del'>-			gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-				"Out of memory");</div><div class='del'>-			op_errno = ENOMEM;</div><div class='del'>-			goto err;</div><div class='del'>-		}</div><div class='del'>-</div><div class='del'>-                local-&gt;params = dict_ref (params);</div><div class='del'>-		local-&gt;mode = mode;</div><div class='del'>-		local-&gt;rdev = rdev;</div><div class='del'>-		local-&gt;cached_subvol = avail_subvol;</div><div class='del'>-</div><div class='del'>-		dht_linkfile_create (frame, switch_mknod_linkfile_cbk,</div><div class='del'>-                                     avail_subvol, subvol, loc);</div><div class='del'>-		return 0;</div><div class='del'>-	}</div><div class='add'>+    dht_local_t *local = NULL;</div><div class='add'>+    dht_conf_t *conf = NULL;</div><div class='add'>+    xlator_t *subvol = NULL;</div><div class='add'>+    xlator_t *avail_subvol = NULL;</div><div class='add'>+    int op_errno = -1;</div><div class='add'>+</div><div class='add'>+    VALIDATE_OR_GOTO(frame, err);</div><div class='add'>+    VALIDATE_OR_GOTO(this, err);</div><div class='add'>+    VALIDATE_OR_GOTO(loc, err);</div><div class='add'>+</div><div class='add'>+    conf = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    dht_get_du_info(frame, this, loc);</div><div class='add'>+</div><div class='add'>+    local = dht_local_init(frame, loc, NULL, GF_FOP_MKNOD);</div><div class='add'>+    if (!local) {</div><div class='add'>+        op_errno = ENOMEM;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    subvol = dht_subvol_get_hashed(this, loc);</div><div class='add'>+    if (!subvol) {</div><div class='add'>+        gf_msg_debug(this-&gt;name, 0, "no subvolume in layout for path=%s",</div><div class='add'>+                     loc-&gt;path);</div><div class='add'>+        op_errno = ENOENT;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Consider the disksize in consideration */</div><div class='add'>+    avail_subvol = get_switch_matching_subvol(loc-&gt;path, conf, subvol);</div><div class='add'>+    if (dht_is_subvol_filled(this, avail_subvol)) {</div><div class='add'>+        avail_subvol = dht_free_disk_available_subvol(this, avail_subvol,</div><div class='add'>+                                                      local);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (avail_subvol != subvol) {</div><div class='add'>+        /* Create linkfile first */</div><div class='add'>+</div><div class='add'>+        local-&gt;params = dict_ref(params);</div><div class='add'>+        local-&gt;mode = mode;</div><div class='add'>+        local-&gt;umask = umask;</div><div class='add'>+        local-&gt;rdev = rdev;</div><div class='add'>+        local-&gt;cached_subvol = avail_subvol;</div><div class='add'>+</div><div class='add'>+        dht_linkfile_create(frame, switch_mknod_linkfile_cbk, this,</div><div class='add'>+                            avail_subvol, subvol, loc);</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	gf_log (this-&gt;name, GF_LOG_TRACE,</div><div class='del'>-		"creating %s on %s", loc-&gt;path, subvol-&gt;name);</div><div class='add'>+    gf_msg_trace(this-&gt;name, 0, "creating %s on %s", loc-&gt;path, subvol-&gt;name);</div><div class='ctx'> </div><div class='del'>-	STACK_WIND (frame, dht_newfile_cbk,</div><div class='del'>-		    subvol, subvol-&gt;fops-&gt;mknod,</div><div class='del'>-		    loc, mode, rdev, params);</div><div class='add'>+    STACK_WIND_COOKIE(frame, dht_newfile_cbk, (void *)subvol, subvol,</div><div class='add'>+                      subvol-&gt;fops-&gt;mknod, loc, mode, rdev, umask, params);</div><div class='ctx'> </div><div class='del'>-	return 0;</div><div class='add'>+    return 0;</div><div class='ctx'> </div><div class='ctx'> err:</div><div class='del'>-	op_errno = (op_errno == -1) ? errno : op_errno;</div><div class='del'>-	DHT_STACK_UNWIND (mknod, frame, -1, op_errno,</div><div class='del'>-                          NULL, NULL, NULL, NULL);</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-notify (xlator_t *this, int event, void *data, ...)</div><div class='del'>-{</div><div class='del'>-	int ret = -1;</div><div class='del'>-</div><div class='del'>-	ret = dht_notify (this, event, data);</div><div class='add'>+    op_errno = (op_errno == -1) ? errno : op_errno;</div><div class='add'>+    DHT_STACK_UNWIND(mknod, frame, -1, op_errno, NULL, NULL, NULL, NULL, NULL);</div><div class='ctx'> </div><div class='del'>-	return ret;</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> void</div><div class='del'>-fini (xlator_t *this)</div><div class='add'>+switch_fini(xlator_t *this)</div><div class='ctx'> {</div><div class='del'>-        int                   i = 0;</div><div class='del'>-        dht_conf_t           *conf = NULL;</div><div class='del'>-        struct switch_struct *trav = NULL;</div><div class='del'>-        struct switch_struct *prev = NULL;</div><div class='del'>-</div><div class='del'>-	conf = this-&gt;private;</div><div class='del'>-</div><div class='del'>-        if (conf) {</div><div class='del'>-                trav = (struct switch_struct *)conf-&gt;private;</div><div class='del'>-                conf-&gt;private = NULL;</div><div class='del'>-                while (trav) {</div><div class='del'>-                        if (trav-&gt;array)</div><div class='del'>-                                GF_FREE (trav-&gt;array);</div><div class='del'>-                        prev = trav;</div><div class='del'>-                        trav = trav-&gt;next;</div><div class='del'>-                        GF_FREE (prev);</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                if (conf-&gt;file_layouts) {</div><div class='del'>-                        for (i = 0; i &lt; conf-&gt;subvolume_cnt; i++) {</div><div class='del'>-                                GF_FREE (conf-&gt;file_layouts[i]);</div><div class='del'>-                        }</div><div class='del'>-                        GF_FREE (conf-&gt;file_layouts);</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                if (conf-&gt;default_dir_layout)</div><div class='del'>-                        GF_FREE (conf-&gt;default_dir_layout);</div><div class='del'>-</div><div class='del'>-                if (conf-&gt;subvolumes)</div><div class='del'>-                        GF_FREE (conf-&gt;subvolumes);</div><div class='del'>-</div><div class='del'>-		if (conf-&gt;subvolume_status)</div><div class='del'>-			GF_FREE (conf-&gt;subvolume_status);</div><div class='del'>-</div><div class='del'>-                GF_FREE (conf);</div><div class='add'>+    dht_conf_t *conf = NULL;</div><div class='add'>+    struct switch_struct *trav = NULL;</div><div class='add'>+    struct switch_struct *prev = NULL;</div><div class='add'>+</div><div class='add'>+    conf = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    if (conf) {</div><div class='add'>+        trav = (struct switch_struct *)conf-&gt;private;</div><div class='add'>+        conf-&gt;private = NULL;</div><div class='add'>+        while (trav) {</div><div class='add'>+            GF_FREE(trav-&gt;array);</div><div class='add'>+            prev = trav;</div><div class='add'>+            trav = trav-&gt;next;</div><div class='add'>+            GF_FREE(prev);</div><div class='ctx'>         }</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-	return;</div><div class='add'>+    dht_fini(this);</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-set_switch_pattern (xlator_t *this, dht_conf_t *conf,</div><div class='del'>-                    const char *pattern_str)</div><div class='add'>+set_switch_pattern(xlator_t *this, dht_conf_t *conf, const char *pattern_str)</div><div class='ctx'> {</div><div class='del'>-        int                         flag = 0;</div><div class='del'>-        int                         idx = 0;</div><div class='del'>-        int                         index = 0;</div><div class='del'>-        int                         child_count = 0;</div><div class='del'>-        char                       *tmp = NULL;</div><div class='del'>-        char                       *tmp1 = NULL;</div><div class='del'>-        char                       *child = NULL;</div><div class='del'>-        char                       *tmp_str = NULL;</div><div class='del'>-        char                       *tmp_str1 = NULL;</div><div class='del'>-        char                       *dup_str = NULL;</div><div class='del'>-        char                       *dup_childs = NULL;</div><div class='del'>-        char                       *switch_str = NULL;</div><div class='del'>-        char                       *pattern = NULL;</div><div class='del'>-        char                       *childs = NULL;</div><div class='del'>-        char                       *option_string = NULL;</div><div class='del'>-        struct switch_struct        *switch_buf = NULL;</div><div class='del'>-        struct switch_struct        *switch_opt = NULL;</div><div class='del'>-        struct switch_struct        *trav = NULL;</div><div class='del'>-	struct switch_sched_array  *switch_buf_array = NULL;</div><div class='del'>-	xlator_list_t              *trav_xl = NULL;</div><div class='del'>-</div><div class='del'>-        trav_xl = this-&gt;children;</div><div class='del'>-	while (trav_xl) {</div><div class='del'>-		index++;</div><div class='del'>-		trav_xl = trav_xl-&gt;next;</div><div class='del'>-	}</div><div class='del'>-	child_count = index;</div><div class='del'>-	switch_buf_array = GF_CALLOC ((index + 1),</div><div class='del'>-                                      sizeof (struct switch_sched_array),</div><div class='del'>-                                      gf_switch_mt_switch_sched_array);</div><div class='del'>-        if (!switch_buf_array)</div><div class='del'>-                goto err;</div><div class='add'>+    int flag = 0;</div><div class='add'>+    int idx = 0;</div><div class='add'>+    int index = 0;</div><div class='add'>+    int child_count = 0;</div><div class='add'>+    char *tmp = NULL;</div><div class='add'>+    char *tmp1 = NULL;</div><div class='add'>+    char *child = NULL;</div><div class='add'>+    char *tmp_str = NULL;</div><div class='add'>+    char *tmp_str1 = NULL;</div><div class='add'>+    char *dup_str = NULL;</div><div class='add'>+    char *dup_childs = NULL;</div><div class='add'>+    char *switch_str = NULL;</div><div class='add'>+    char *pattern = NULL;</div><div class='add'>+    char *childs = NULL;</div><div class='add'>+    char *option_string = NULL;</div><div class='add'>+    size_t pattern_length;</div><div class='add'>+    struct switch_struct *switch_buf = NULL;</div><div class='add'>+    struct switch_struct *switch_opt = NULL;</div><div class='add'>+    struct switch_struct *trav = NULL;</div><div class='add'>+    struct switch_sched_array *switch_buf_array = NULL;</div><div class='add'>+    xlator_list_t *trav_xl = NULL;</div><div class='add'>+</div><div class='add'>+    trav_xl = this-&gt;children;</div><div class='add'>+    while (trav_xl) {</div><div class='add'>+        index++;</div><div class='add'>+        trav_xl = trav_xl-&gt;next;</div><div class='add'>+    }</div><div class='add'>+    child_count = index;</div><div class='add'>+    switch_buf_array = GF_CALLOC((index + 1), sizeof(struct switch_sched_array),</div><div class='add'>+                                 gf_switch_mt_switch_sched_array);</div><div class='add'>+    if (!switch_buf_array)</div><div class='add'>+        goto err;</div><div class='add'>+</div><div class='add'>+    trav_xl = this-&gt;children;</div><div class='add'>+    index = 0;</div><div class='add'>+</div><div class='add'>+    while (trav_xl) {</div><div class='add'>+        switch_buf_array[index].xl = trav_xl-&gt;xlator;</div><div class='add'>+        switch_buf_array[index].eligible = 1;</div><div class='add'>+        trav_xl = trav_xl-&gt;next;</div><div class='add'>+        index++;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /*  *jpg:child1,child2;*mpg:child3;*:child4,child5,child6 */</div><div class='add'>+</div><div class='add'>+    /* Get the pattern for considering switch case.</div><div class='add'>+       "option block-size *avi:10MB" etc */</div><div class='add'>+    option_string = gf_strdup(pattern_str);</div><div class='add'>+    if (option_string == NULL) {</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+    switch_str = strtok_r(option_string, ";", &amp;tmp_str);</div><div class='add'>+    while (switch_str) {</div><div class='add'>+        dup_str = gf_strdup(switch_str);</div><div class='add'>+        if (dup_str == NULL) {</div><div class='add'>+            goto err;</div><div class='add'>+        }</div><div class='add'>+        switch_opt = GF_CALLOC(1, sizeof(struct switch_struct),</div><div class='add'>+                               gf_switch_mt_switch_struct);</div><div class='add'>+        if (!switch_opt) {</div><div class='add'>+            GF_FREE(dup_str);</div><div class='add'>+            goto err;</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-	trav_xl = this-&gt;children;</div><div class='del'>-	index = 0;</div><div class='del'>-</div><div class='del'>-	while (trav_xl) {</div><div class='del'>-		switch_buf_array[index].xl = trav_xl-&gt;xlator;</div><div class='del'>-		switch_buf_array[index].eligible = 1;</div><div class='del'>-		trav_xl = trav_xl-&gt;next;</div><div class='del'>-		index++;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	/*  *jpg:child1,child2;*mpg:child3;*:child4,child5,child6 */</div><div class='del'>-</div><div class='del'>-        /* Get the pattern for considering switch case.</div><div class='del'>-           "option block-size *avi:10MB" etc */</div><div class='del'>-        option_string = gf_strdup (pattern_str);</div><div class='del'>-        switch_str = strtok_r (option_string, ";", &amp;tmp_str);</div><div class='del'>-        while (switch_str) {</div><div class='del'>-                dup_str = gf_strdup (switch_str);</div><div class='del'>-                switch_opt = GF_CALLOC (1, sizeof (struct switch_struct),</div><div class='del'>-                                        gf_switch_mt_switch_struct);</div><div class='del'>-                if (!switch_opt)</div><div class='del'>-                        goto err;</div><div class='del'>-</div><div class='del'>-                pattern = strtok_r (dup_str, ":", &amp;tmp_str1);</div><div class='del'>-                childs = strtok_r (NULL, ":", &amp;tmp_str1);</div><div class='del'>-                if (strncmp (pattern, "*", 2) == 0) {</div><div class='del'>-                        gf_log ("switch", GF_LOG_NORMAL,</div><div class='del'>-                                "'*' pattern will be taken by default "</div><div class='del'>-                                "for all the unconfigured child nodes,"</div><div class='del'>-                                " hence neglecting current option");</div><div class='del'>-                        switch_str = strtok_r (NULL, ";", &amp;tmp_str);</div><div class='del'>-                        GF_FREE (dup_str);</div><div class='del'>-                        continue;</div><div class='del'>-                }</div><div class='del'>-                memcpy (switch_opt-&gt;path_pattern, pattern, strlen (pattern));</div><div class='del'>-                if (childs) {</div><div class='del'>-                        dup_childs = gf_strdup (childs);</div><div class='del'>-                        child = strtok_r (dup_childs, ",", &amp;tmp);</div><div class='del'>-                        while (child) {</div><div class='del'>-                                if (gf_switch_valid_child (this, child)) {</div><div class='del'>-                                        idx++;</div><div class='del'>-                                        child = strtok_r (NULL, ",", &amp;tmp);</div><div class='del'>-                                } else {</div><div class='del'>-                                        gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-                                                "%s is not a subvolume of %s. "</div><div class='del'>-                                                "pattern can only be scheduled "</div><div class='del'>-                                                "only to a subvolume of %s",</div><div class='del'>-                                                child, this-&gt;name, this-&gt;name);</div><div class='del'>-                                        goto err;</div><div class='del'>-                                }</div><div class='del'>-                        }</div><div class='del'>-                        GF_FREE (dup_childs);</div><div class='del'>-                        child = strtok_r (childs, ",", &amp;tmp1);</div><div class='del'>-                        switch_opt-&gt;num_child = idx;</div><div class='del'>-                        switch_opt-&gt;array = GF_CALLOC (1, (idx *</div><div class='del'>-                                                       sizeof (struct switch_sched_array)),</div><div class='del'>-                                                       gf_switch_mt_switch_sched_array);</div><div class='del'>-                        if (!switch_opt-&gt;array)</div><div class='del'>-                                goto err;</div><div class='del'>-                        idx = 0;</div><div class='del'>-                        while (child) {</div><div class='del'>-                                for (index = 0; index &lt; child_count; index++) {</div><div class='del'>-                                        if (strcmp (switch_buf_array[index].xl-&gt;name,</div><div class='del'>-                                                    child) == 0) {</div><div class='del'>-                                                gf_log ("switch", GF_LOG_DEBUG,</div><div class='del'>-                                                        "'%s' pattern will be "</div><div class='del'>-                                                        "scheduled to \"%s\"",</div><div class='del'>-                                                        switch_opt-&gt;path_pattern, child);</div><div class='del'>-                                                /*</div><div class='del'>-                                                  if (switch_buf_array[index-1].considered) {</div><div class='del'>-                                                  gf_log ("switch", GF_LOG_DEBUG,</div><div class='del'>-                                                  "ambiguity found, exiting");</div><div class='del'>-                                                  return -1;</div><div class='del'>-                                                  }</div><div class='del'>-                                                */</div><div class='del'>-                                                switch_opt-&gt;array[idx].xl = switch_buf_array[index].xl;</div><div class='del'>-                                                switch_buf_array[index].considered = 1;</div><div class='del'>-                                                idx++;</div><div class='del'>-                                                break;</div><div class='del'>-                                        }</div><div class='del'>-                                }</div><div class='del'>-                                child = strtok_r (NULL, ",", &amp;tmp1);</div><div class='del'>-                        }</div><div class='add'>+        pattern = strtok_r(dup_str, ":", &amp;tmp_str1);</div><div class='add'>+        childs = strtok_r(NULL, ":", &amp;tmp_str1);</div><div class='add'>+        if (strncmp(pattern, "*", 2) == 0) {</div><div class='add'>+            gf_msg("switch", GF_LOG_INFO, 0, DHT_MSG_SWITCH_PATTERN_INFO,</div><div class='add'>+                   "'*' pattern will be taken by default "</div><div class='add'>+                   "for all the unconfigured child nodes,"</div><div class='add'>+                   " hence neglecting current option");</div><div class='add'>+            switch_str = strtok_r(NULL, ";", &amp;tmp_str);</div><div class='add'>+            GF_FREE(switch_opt);</div><div class='add'>+            switch_opt = NULL;</div><div class='add'>+            GF_FREE(dup_str);</div><div class='add'>+            continue;</div><div class='add'>+        }</div><div class='add'>+        GF_FREE(dup_str);</div><div class='add'>+</div><div class='add'>+        pattern_length = strlen(pattern);</div><div class='add'>+        if (pattern_length &gt;= (sizeof(switch_opt-&gt;path_pattern))) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, 0,</div><div class='add'>+                   DHT_MSG_SET_SWITCH_PATTERN_ERROR, "Pattern (%s) too long",</div><div class='add'>+                   pattern);</div><div class='add'>+            goto err;</div><div class='add'>+        }</div><div class='add'>+        memcpy(switch_opt-&gt;path_pattern, pattern, pattern_length);</div><div class='add'>+        switch_opt-&gt;path_pattern[pattern_length] = '\0';</div><div class='add'>+</div><div class='add'>+        if (childs) {</div><div class='add'>+            dup_childs = gf_strdup(childs);</div><div class='add'>+            if (dup_childs == NULL) {</div><div class='add'>+                goto err;</div><div class='add'>+            }</div><div class='add'>+            child = strtok_r(dup_childs, ",", &amp;tmp);</div><div class='add'>+            while (child) {</div><div class='add'>+                if (gf_switch_valid_child(this, child)) {</div><div class='add'>+                    idx++;</div><div class='add'>+                    child = strtok_r(NULL, ",", &amp;tmp);</div><div class='ctx'>                 } else {</div><div class='del'>-                        /* error */</div><div class='del'>-                        gf_log ("switch", GF_LOG_ERROR,</div><div class='del'>-                                "Check \"scheduler.switch.case\" "</div><div class='del'>-                                "option in unify volume. Exiting");</div><div class='del'>-                        goto err;</div><div class='add'>+                    gf_msg(this-&gt;name, GF_LOG_ERROR, 0, DHT_MSG_SUBVOL_ERROR,</div><div class='add'>+                           "%s is not a subvolume of %s. "</div><div class='add'>+                           "pattern can only be scheduled "</div><div class='add'>+                           "only to a subvolume of %s",</div><div class='add'>+                           child, this-&gt;name, this-&gt;name);</div><div class='add'>+                    GF_FREE(dup_childs);</div><div class='add'>+                    goto err;</div><div class='ctx'>                 }</div><div class='del'>-                GF_FREE (dup_str);</div><div class='del'>-                </div><div class='del'>-                /* Link it to the main structure */</div><div class='del'>-                if (switch_buf) {</div><div class='del'>-                        /* there are already few entries */</div><div class='del'>-                        trav = switch_buf;</div><div class='del'>-                        while (trav-&gt;next)</div><div class='del'>-                                trav = trav-&gt;next;</div><div class='del'>-                        trav-&gt;next = switch_opt;</div><div class='del'>-                } else {</div><div class='del'>-                        /* First entry */</div><div class='del'>-                        switch_buf = switch_opt;</div><div class='add'>+            }</div><div class='add'>+            GF_FREE(dup_childs);</div><div class='add'>+            child = strtok_r(childs, ",", &amp;tmp1);</div><div class='add'>+            switch_opt-&gt;num_child = idx;</div><div class='add'>+            switch_opt-&gt;array = GF_CALLOC(</div><div class='add'>+                1, (idx * sizeof(struct switch_sched_array)),</div><div class='add'>+                gf_switch_mt_switch_sched_array);</div><div class='add'>+            if (!switch_opt-&gt;array)</div><div class='add'>+                goto err;</div><div class='add'>+            idx = 0;</div><div class='add'>+            while (child) {</div><div class='add'>+                for (index = 0; index &lt; child_count; index++) {</div><div class='add'>+                    if (strcmp(switch_buf_array[index].xl-&gt;name, child) == 0) {</div><div class='add'>+                        gf_msg_debug("switch", 0,</div><div class='add'>+                                     "'%s' pattern will be "</div><div class='add'>+                                     "scheduled to \"%s\"",</div><div class='add'>+                                     switch_opt-&gt;path_pattern, child);</div><div class='add'>+                        /*</div><div class='add'>+                          if (switch_buf_array[index-1].considered) {</div><div class='add'>+                          gf_msg_debug ("switch", 0,</div><div class='add'>+                          "ambiguity found, exiting");</div><div class='add'>+                          return -1;</div><div class='add'>+                          }</div><div class='add'>+                        */</div><div class='add'>+                        switch_opt-&gt;array[idx].xl = switch_buf_array[index].xl;</div><div class='add'>+                        switch_buf_array[index].considered = 1;</div><div class='add'>+                        idx++;</div><div class='add'>+                        break;</div><div class='add'>+                    }</div><div class='ctx'>                 }</div><div class='del'>-                switch_str = strtok_r (NULL, ";", &amp;tmp_str);</div><div class='add'>+                child = strtok_r(NULL, ",", &amp;tmp1);</div><div class='add'>+            }</div><div class='add'>+        } else {</div><div class='add'>+            /* error */</div><div class='add'>+            gf_msg("switch", GF_LOG_ERROR, 0, DHT_MSG_SET_SWITCH_PATTERN_ERROR,</div><div class='add'>+                   "Check \"scheduler.switch.case\" "</div><div class='add'>+                   "option in unify volume. Exiting");</div><div class='add'>+            goto err;</div><div class='ctx'>         }</div><div class='ctx'> </div><div class='del'>-	/* Now, all the pattern based considerations done, so for all the</div><div class='del'>-	 * remaining pattern, '*' to all the remaining child nodes</div><div class='del'>-	 */</div><div class='del'>-	{</div><div class='del'>-		for (index=0; index &lt; child_count; index++) {</div><div class='del'>-			/* check for considered flag */</div><div class='del'>-			if (switch_buf_array[index].considered)</div><div class='del'>-				continue;</div><div class='del'>-			flag++;</div><div class='del'>-		}</div><div class='del'>-		if (!flag) {</div><div class='del'>-			gf_log ("switch", GF_LOG_ERROR,</div><div class='del'>-				"No nodes left for pattern '*'. Exiting");</div><div class='del'>-			goto err;</div><div class='del'>-		}</div><div class='del'>-		switch_opt = GF_CALLOC (1, sizeof (struct switch_struct),</div><div class='del'>-                                        gf_switch_mt_switch_struct);</div><div class='del'>-                if (!switch_opt)</div><div class='del'>-                        goto err;</div><div class='del'>-</div><div class='del'>-		/* Add the '*' pattern to the array */</div><div class='del'>-		memcpy (switch_opt-&gt;path_pattern, "*", 2);</div><div class='del'>-		switch_opt-&gt;num_child = flag;</div><div class='del'>-		switch_opt-&gt;array =</div><div class='del'>-			GF_CALLOC (1, </div><div class='del'>-                                   flag * sizeof (struct switch_sched_array),</div><div class='del'>-                                   gf_switch_mt_switch_sched_array);</div><div class='del'>-                if (!switch_opt-&gt;array)</div><div class='del'>-                        goto err;</div><div class='del'>-		flag = 0;</div><div class='del'>-		for (index=0; index &lt; child_count; index++) {</div><div class='del'>-			/* check for considered flag */</div><div class='del'>-			if (switch_buf_array[index].considered)</div><div class='del'>-				continue;</div><div class='del'>-			gf_log ("switch", GF_LOG_DEBUG,</div><div class='del'>-				"'%s' pattern will be scheduled to \"%s\"",</div><div class='del'>-				switch_opt-&gt;path_pattern,</div><div class='del'>-				switch_buf_array[index].xl-&gt;name);</div><div class='del'>-			switch_opt-&gt;array[flag].xl =</div><div class='del'>-				switch_buf_array[index].xl;</div><div class='del'>-			switch_buf_array[index].considered = 1;</div><div class='del'>-			flag++;</div><div class='del'>-                }</div><div class='del'>-		if (switch_buf) {</div><div class='del'>-			/* there are already few entries */</div><div class='del'>-			trav = switch_buf;</div><div class='del'>-			while (trav-&gt;next)</div><div class='del'>-				trav = trav-&gt;next;</div><div class='del'>-			trav-&gt;next = switch_opt;</div><div class='del'>-		} else {</div><div class='del'>-			/* First entry */</div><div class='del'>-			switch_buf = switch_opt;</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='del'>-        /* */</div><div class='del'>-        conf-&gt;private = switch_buf;</div><div class='del'>-</div><div class='del'>-        return 0;</div><div class='del'>-err:</div><div class='add'>+        /* Link it to the main structure */</div><div class='ctx'>         if (switch_buf) {</div><div class='del'>-                if (switch_buf_array)</div><div class='del'>-                        GF_FREE (switch_buf_array);</div><div class='del'>-                trav = switch_buf;</div><div class='del'>-                while (trav) {</div><div class='del'>-                        if (trav-&gt;array)</div><div class='del'>-                                GF_FREE (trav-&gt;array);</div><div class='del'>-                        switch_opt = trav;</div><div class='del'>-                        trav = trav-&gt;next;</div><div class='del'>-                        GF_FREE (switch_opt);</div><div class='del'>-                }</div><div class='add'>+            /* there are already few entries */</div><div class='add'>+            trav = switch_buf;</div><div class='add'>+            while (trav-&gt;next)</div><div class='add'>+                trav = trav-&gt;next;</div><div class='add'>+            trav-&gt;next = switch_opt;</div><div class='add'>+        } else {</div><div class='add'>+            /* First entry */</div><div class='add'>+            switch_buf = switch_opt;</div><div class='ctx'>         }</div><div class='del'>-        return -1;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-init (xlator_t *this)</div><div class='del'>-{</div><div class='del'>-        dht_conf_t            *conf = NULL;</div><div class='del'>-	data_t                *data = NULL;</div><div class='del'>-	char                  *temp_str = NULL;</div><div class='del'>-        int                    ret = -1;</div><div class='del'>-        int                    i = 0;</div><div class='del'>-	uint32_t               temp_free_disk = 0;</div><div class='del'>-</div><div class='del'>-	if (!this-&gt;children) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_CRITICAL,</div><div class='del'>-			"SWITCH needs more than one subvolume");</div><div class='del'>-		return -1;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	if (!this-&gt;parents) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_WARNING,</div><div class='del'>-			"dangling volume. check volfile");</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-        conf = GF_CALLOC (1, sizeof (*conf), gf_switch_mt_dht_conf_t);</div><div class='del'>-        if (!conf) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-                        "Out of memory");</div><div class='del'>-                goto err;</div><div class='add'>+        switch_opt = NULL;</div><div class='add'>+        switch_str = strtok_r(NULL, ";", &amp;tmp_str);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Now, all the pattern based considerations done, so for all the</div><div class='add'>+     * remaining pattern, '*' to all the remaining child nodes</div><div class='add'>+     */</div><div class='add'>+    {</div><div class='add'>+        for (index = 0; index &lt; child_count; index++) {</div><div class='add'>+            /* check for considered flag */</div><div class='add'>+            if (switch_buf_array[index].considered)</div><div class='add'>+                continue;</div><div class='add'>+            flag++;</div><div class='ctx'>         }</div><div class='del'>-</div><div class='del'>-        conf-&gt;search_unhashed = GF_DHT_LOOKUP_UNHASHED_ON;</div><div class='del'>-	if (dict_get_str (this-&gt;options, "lookup-unhashed", &amp;temp_str) == 0) {</div><div class='del'>-                /* If option is not "auto", other options _should_ be boolean */</div><div class='del'>-                if (strcasecmp (temp_str, "auto"))</div><div class='del'>-                        gf_string2boolean (temp_str, &amp;conf-&gt;search_unhashed);</div><div class='del'>-                else</div><div class='del'>-                        conf-&gt;search_unhashed = GF_DHT_LOOKUP_UNHASHED_AUTO;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	conf-&gt;unhashed_sticky_bit = 0;</div><div class='del'>-	if (dict_get_str (this-&gt;options, "unhashed-sticky-bit",</div><div class='del'>-                          &amp;temp_str) == 0) {</div><div class='del'>-	        gf_string2boolean (temp_str, &amp;conf-&gt;unhashed_sticky_bit);</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-        conf-&gt;min_free_disk = 10;</div><div class='del'>-        conf-&gt;disk_unit = 'p';</div><div class='del'>-</div><div class='del'>-        if (dict_get_str (this-&gt;options, "min-free-disk",</div><div class='del'>-                          &amp;temp_str) == 0) {</div><div class='del'>-                if (gf_string2percent (temp_str,</div><div class='del'>-                                       &amp;temp_free_disk) == 0) {</div><div class='del'>-                        if (temp_free_disk &gt; 100) {</div><div class='del'>-                                gf_string2bytesize (temp_str,</div><div class='del'>-                                                        &amp;conf-&gt;min_free_disk);</div><div class='del'>-                                conf-&gt;disk_unit = 'b';</div><div class='del'>-                        } else {</div><div class='del'>-                                conf-&gt;min_free_disk = (uint64_t)temp_free_disk;</div><div class='del'>-                                conf-&gt;disk_unit = 'p';</div><div class='del'>-                        }</div><div class='del'>-                } else {</div><div class='del'>-                        gf_string2bytesize (temp_str,</div><div class='del'>-                                                &amp;conf-&gt;min_free_disk);</div><div class='del'>-                        conf-&gt;disk_unit = 'b';</div><div class='del'>-                }</div><div class='add'>+        if (!flag) {</div><div class='add'>+            gf_msg("switch", GF_LOG_ERROR, 0, DHT_MSG_SET_SWITCH_PATTERN_ERROR,</div><div class='add'>+                   "No nodes left for pattern '*'. Exiting");</div><div class='add'>+            goto err;</div><div class='ctx'>         }</div><div class='del'>-</div><div class='del'>-	data = dict_get (this-&gt;options, "pattern.switch.case");</div><div class='del'>-	if (data) {</div><div class='del'>-                /* TODO: */</div><div class='del'>-                ret = set_switch_pattern (this, conf, data-&gt;data);</div><div class='del'>-                if (ret) {</div><div class='del'>-                        goto err;</div><div class='del'>-                }</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-        ret = dht_init_subvolumes (this, conf);</div><div class='del'>-        if (ret == -1) {</div><div class='del'>-                goto err;</div><div class='add'>+        switch_opt = GF_CALLOC(1, sizeof(struct switch_struct),</div><div class='add'>+                               gf_switch_mt_switch_struct);</div><div class='add'>+        if (!switch_opt)</div><div class='add'>+            goto err;</div><div class='add'>+</div><div class='add'>+        /* Add the '*' pattern to the array */</div><div class='add'>+        memcpy(switch_opt-&gt;path_pattern, "*", 2);</div><div class='add'>+        switch_opt-&gt;num_child = flag;</div><div class='add'>+        switch_opt-&gt;array = GF_CALLOC(1,</div><div class='add'>+                                      flag * sizeof(struct switch_sched_array),</div><div class='add'>+                                      gf_switch_mt_switch_sched_array);</div><div class='add'>+        if (!switch_opt-&gt;array)</div><div class='add'>+            goto err;</div><div class='add'>+        flag = 0;</div><div class='add'>+        for (index = 0; index &lt; child_count; index++) {</div><div class='add'>+            /* check for considered flag */</div><div class='add'>+            if (switch_buf_array[index].considered)</div><div class='add'>+                continue;</div><div class='add'>+            gf_msg_debug("switch", 0,</div><div class='add'>+                         "'%s'"</div><div class='add'>+                         " pattern will be scheduled to \"%s\"",</div><div class='add'>+                         switch_opt-&gt;path_pattern,</div><div class='add'>+                         switch_buf_array[index].xl-&gt;name);</div><div class='add'>+</div><div class='add'>+            switch_opt-&gt;array[flag].xl = switch_buf_array[index].xl;</div><div class='add'>+            switch_buf_array[index].considered = 1;</div><div class='add'>+            flag++;</div><div class='ctx'>         }</div><div class='del'>-</div><div class='del'>-        ret = dht_layouts_init (this, conf);</div><div class='del'>-        if (ret == -1) {</div><div class='del'>-                goto err;</div><div class='add'>+        if (switch_buf) {</div><div class='add'>+            /* there are already few entries */</div><div class='add'>+            trav = switch_buf;</div><div class='add'>+            while (trav-&gt;next)</div><div class='add'>+                trav = trav-&gt;next;</div><div class='add'>+            trav-&gt;next = switch_opt;</div><div class='add'>+        } else {</div><div class='add'>+            /* First entry */</div><div class='add'>+            switch_buf = switch_opt;</div><div class='ctx'>         }</div><div class='add'>+        switch_opt = NULL;</div><div class='add'>+    }</div><div class='add'>+    /* */</div><div class='add'>+    conf-&gt;private = switch_buf;</div><div class='ctx'> </div><div class='del'>-	LOCK_INIT (&amp;conf-&gt;subvolume_lock);</div><div class='del'>-	LOCK_INIT (&amp;conf-&gt;layout_lock);</div><div class='add'>+    GF_FREE(option_string);</div><div class='add'>+    return 0;</div><div class='add'>+err:</div><div class='add'>+    GF_FREE(switch_buf_array);</div><div class='add'>+    GF_FREE(switch_opt);</div><div class='add'>+    GF_FREE(option_string);</div><div class='add'>+</div><div class='add'>+    if (switch_buf) {</div><div class='add'>+        trav = switch_buf;</div><div class='add'>+        while (trav) {</div><div class='add'>+            GF_FREE(trav-&gt;array);</div><div class='add'>+            switch_opt = trav;</div><div class='add'>+            trav = trav-&gt;next;</div><div class='add'>+            GF_FREE(switch_opt);</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    return -1;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-	conf-&gt;gen = 1;</div><div class='add'>+int32_t</div><div class='add'>+switch_init(xlator_t *this)</div><div class='add'>+{</div><div class='add'>+    dht_conf_t *conf = NULL;</div><div class='add'>+    data_t *data = NULL;</div><div class='add'>+    int ret = -1;</div><div class='ctx'> </div><div class='del'>-        conf-&gt;du_stats = GF_CALLOC (conf-&gt;subvolume_cnt, sizeof (dht_du_t),</div><div class='del'>-                                    gf_switch_mt_dht_du_t);</div><div class='del'>-        if (!conf-&gt;du_stats) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-                        "Out of memory");</div><div class='del'>-                goto err;</div><div class='add'>+    ret = dht_init(this);</div><div class='add'>+    if (ret) {</div><div class='add'>+        return ret;</div><div class='add'>+    }</div><div class='add'>+    conf = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    data = dict_get(this-&gt;options, "pattern.switch.case");</div><div class='add'>+    if (data) {</div><div class='add'>+        /* TODO: */</div><div class='add'>+        ret = set_switch_pattern(this, conf, data-&gt;data);</div><div class='add'>+        if (ret) {</div><div class='add'>+            goto err;</div><div class='ctx'>         }</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        this-&gt;private = conf;</div><div class='del'>-</div><div class='del'>-        return 0;</div><div class='add'>+    this-&gt;private = conf;</div><div class='add'>+    return 0;</div><div class='ctx'> </div><div class='ctx'> err:</div><div class='del'>-        if (conf) {</div><div class='del'>-                if (conf-&gt;file_layouts) {</div><div class='del'>-                        for (i = 0; i &lt; conf-&gt;subvolume_cnt; i++) {</div><div class='del'>-                                GF_FREE (conf-&gt;file_layouts[i]);</div><div class='del'>-                        }</div><div class='del'>-                        GF_FREE (conf-&gt;file_layouts);</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                if (conf-&gt;default_dir_layout)</div><div class='del'>-                        GF_FREE (conf-&gt;default_dir_layout);</div><div class='del'>-</div><div class='del'>-                if (conf-&gt;subvolumes)</div><div class='del'>-                        GF_FREE (conf-&gt;subvolumes);</div><div class='del'>-</div><div class='del'>-		if (conf-&gt;subvolume_status)</div><div class='del'>-			GF_FREE (conf-&gt;subvolume_status);</div><div class='del'>-</div><div class='del'>-                if (conf-&gt;du_stats)</div><div class='del'>-                        GF_FREE (conf-&gt;du_stats);</div><div class='del'>-</div><div class='del'>-                GF_FREE (conf);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        return -1;</div><div class='add'>+    dht_fini(this);</div><div class='add'>+    return -1;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> struct xlator_fops fops = {</div><div class='del'>-	.lookup      = switch_lookup,</div><div class='del'>-	.create      = switch_create,</div><div class='del'>-	.mknod       = switch_mknod,</div><div class='del'>-</div><div class='del'>-	.stat        = dht_stat,</div><div class='del'>-	.fstat       = dht_fstat,</div><div class='del'>-	.truncate    = dht_truncate,</div><div class='del'>-	.ftruncate   = dht_ftruncate,</div><div class='del'>-	.access      = dht_access,</div><div class='del'>-	.readlink    = dht_readlink,</div><div class='del'>-	.setxattr    = dht_setxattr,</div><div class='del'>-	.getxattr    = dht_getxattr,</div><div class='del'>-	.removexattr = dht_removexattr,</div><div class='del'>-	.open        = dht_open,</div><div class='del'>-	.readv       = dht_readv,</div><div class='del'>-	.writev      = dht_writev,</div><div class='del'>-	.flush       = dht_flush,</div><div class='del'>-	.fsync       = dht_fsync,</div><div class='del'>-	.statfs      = dht_statfs,</div><div class='del'>-	.lk          = dht_lk,</div><div class='del'>-	.opendir     = dht_opendir,</div><div class='del'>-	.readdir     = dht_readdir,</div><div class='del'>-	.readdirp    = dht_readdirp,</div><div class='del'>-	.fsyncdir    = dht_fsyncdir,</div><div class='del'>-	.symlink     = dht_symlink,</div><div class='del'>-	.unlink      = dht_unlink,</div><div class='del'>-	.link        = dht_link,</div><div class='del'>-	.mkdir       = dht_mkdir,</div><div class='del'>-	.rmdir       = dht_rmdir,</div><div class='del'>-	.rename      = dht_rename,</div><div class='del'>-	.inodelk     = dht_inodelk,</div><div class='del'>-	.finodelk    = dht_finodelk,</div><div class='del'>-	.entrylk     = dht_entrylk,</div><div class='del'>-	.fentrylk    = dht_fentrylk,</div><div class='del'>-	.xattrop     = dht_xattrop,</div><div class='del'>-	.fxattrop    = dht_fxattrop,</div><div class='del'>-        .setattr     = dht_setattr,</div><div class='add'>+    .lookup = switch_lookup,</div><div class='add'>+    .create = switch_create,</div><div class='add'>+    .mknod = switch_mknod,</div><div class='add'>+</div><div class='add'>+    .stat = dht_stat,</div><div class='add'>+    .fstat = dht_fstat,</div><div class='add'>+    .truncate = dht_truncate,</div><div class='add'>+    .ftruncate = dht_ftruncate,</div><div class='add'>+    .access = dht_access,</div><div class='add'>+    .readlink = dht_readlink,</div><div class='add'>+    .setxattr = dht_setxattr,</div><div class='add'>+    .getxattr = dht_getxattr,</div><div class='add'>+    .removexattr = dht_removexattr,</div><div class='add'>+    .open = dht_open,</div><div class='add'>+    .readv = dht_readv,</div><div class='add'>+    .writev = dht_writev,</div><div class='add'>+    .flush = dht_flush,</div><div class='add'>+    .fsync = dht_fsync,</div><div class='add'>+    .statfs = dht_statfs,</div><div class='add'>+    .lk = dht_lk,</div><div class='add'>+    .opendir = dht_opendir,</div><div class='add'>+    .readdir = dht_readdir,</div><div class='add'>+    .readdirp = dht_readdirp,</div><div class='add'>+    .fsyncdir = dht_fsyncdir,</div><div class='add'>+    .symlink = dht_symlink,</div><div class='add'>+    .unlink = dht_unlink,</div><div class='add'>+    .link = dht_link,</div><div class='add'>+    .mkdir = dht_mkdir,</div><div class='add'>+    .rmdir = dht_rmdir,</div><div class='add'>+    .rename = dht_rename,</div><div class='add'>+    .inodelk = dht_inodelk,</div><div class='add'>+    .finodelk = dht_finodelk,</div><div class='add'>+    .entrylk = dht_entrylk,</div><div class='add'>+    .fentrylk = dht_fentrylk,</div><div class='add'>+    .xattrop = dht_xattrop,</div><div class='add'>+    .fxattrop = dht_fxattrop,</div><div class='add'>+    .setattr = dht_setattr,</div><div class='ctx'> };</div><div class='ctx'> </div><div class='del'>-</div><div class='del'>-struct xlator_cbks cbks = {</div><div class='del'>-	.forget     = dht_forget</div><div class='del'>-};</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-struct volume_options options[] = {</div><div class='del'>-        { .key  = {"lookup-unhashed"},</div><div class='del'>-          .value = {"auto", "yes", "no", "enable", "disable", "1", "0",</div><div class='del'>-                    "on", "off"},</div><div class='del'>-	  .type = GF_OPTION_TYPE_STR</div><div class='del'>-	},</div><div class='del'>-	{ .key  = {"pattern.switch.case"},</div><div class='del'>-	  .type = GF_OPTION_TYPE_ANY</div><div class='del'>-	},</div><div class='del'>-        { .key  = {"min-free-disk"},</div><div class='del'>-          .type = GF_OPTION_TYPE_PERCENT_OR_SIZET,</div><div class='del'>-        },</div><div class='del'>-	{ .key  = {NULL} },</div><div class='add'>+struct xlator_cbks cbks = {.forget = dht_forget};</div><div class='add'>+extern int32_t</div><div class='add'>+mem_acct_init(xlator_t *this);</div><div class='add'>+</div><div class='add'>+xlator_api_t xlator_api = {</div><div class='add'>+    .init = switch_init,</div><div class='add'>+    .fini = switch_fini,</div><div class='add'>+    .notify = dht_notify,</div><div class='add'>+    .reconfigure = dht_reconfigure,</div><div class='add'>+    .mem_acct_init = mem_acct_init,</div><div class='add'>+    .op_version = {1}, /* Present from the initial version */</div><div class='add'>+    .fops = &amp;fops,</div><div class='add'>+    .cbks = &amp;cbks,</div><div class='add'>+    .options = dht_options,</div><div class='add'>+    .identifier = "switch",</div><div class='add'>+    .category = GF_TECH_PREVIEW,</div><div class='ctx'> };</div><div class='head'>diff --git a/xlators/cluster/dht/src/unittest/dht_layout_mock.c b/xlators/cluster/dht/src/unittest/dht_layout_mock.c<br/>new file mode 100644<br/>index 00000000000..771452963d1<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/xlators/cluster/dht/src/unittest/dht_layout_mock.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>xlators/cluster/dht/src/unittest/dht_layout_mock.c</a></div><div class='hunk'>@@ -0,0 +1,73 @@</div><div class='add'>+/*</div><div class='add'>+  Copyright (c) 2014 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+#include &lt;glusterfs/glusterfs.h&gt;</div><div class='add'>+#include &lt;glusterfs/xlator.h&gt;</div><div class='add'>+#include "dht-common.h"</div><div class='add'>+#include &lt;glusterfs/byte-order.h&gt;</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+dht_hash_compute(xlator_t *this, int type, const char *name, uint32_t *hash_p)</div><div class='add'>+{</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+dht_inode_ctx_layout_get(inode_t *inode, xlator_t *this, dht_layout_t **layout)</div><div class='add'>+{</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+dht_inode_ctx_layout_set(inode_t *inode, xlator_t *this,</div><div class='add'>+                         dht_layout_t *layout_int)</div><div class='add'>+{</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+dict_get_ptr(dict_t *this, char *key, void **ptr)</div><div class='add'>+{</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+dict_get_ptr_and_len(dict_t *this, char *key, void **ptr, int *len)</div><div class='add'>+{</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+_gf_log(const char *domain, const char *file, const char *function,</div><div class='add'>+        int32_t line, gf_loglevel_t level, const char *fmt, ...)</div><div class='add'>+{</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+_gf_log_callingfn(const char *domain, const char *file, const char *function,</div><div class='add'>+                  int32_t line, gf_loglevel_t level, const char *fmt, ...)</div><div class='add'>+{</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+gf_uuid_unparse(const uuid_t uu, char *out)</div><div class='add'>+{</div><div class='add'>+    // could call a will-return function here</div><div class='add'>+    // to place the correct data in *out</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+_gf_msg(const char *domain, const char *file, const char *function,</div><div class='add'>+        int32_t line, gf_loglevel_t level, int errnum, int trace,</div><div class='add'>+        uint64_t msgid, const char *fmt, ...)</div><div class='add'>+{</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='head'>diff --git a/xlators/cluster/dht/src/unittest/dht_layout_unittest.c b/xlators/cluster/dht/src/unittest/dht_layout_unittest.c<br/>new file mode 100644<br/>index 00000000000..c94a1d0a2e1<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/xlators/cluster/dht/src/unittest/dht_layout_unittest.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>xlators/cluster/dht/src/unittest/dht_layout_unittest.c</a></div><div class='hunk'>@@ -0,0 +1,127 @@</div><div class='add'>+/*</div><div class='add'>+  Copyright (c) 2008-2014 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#include "dht-common.h"</div><div class='add'>+#include &lt;glusterfs/logging.h&gt;</div><div class='add'>+#include &lt;glusterfs/xlator.h&gt;</div><div class='add'>+</div><div class='add'>+#include &lt;inttypes.h&gt;</div><div class='add'>+#include &lt;stdarg.h&gt;</div><div class='add'>+#include &lt;stddef.h&gt;</div><div class='add'>+#include &lt;setjmp.h&gt;</div><div class='add'>+#include &lt;cmocka_pbc.h&gt;</div><div class='add'>+#include &lt;cmocka.h&gt;</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+ * Helper functions</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+static xlator_t *</div><div class='add'>+helper_xlator_init(uint32_t num_types)</div><div class='add'>+{</div><div class='add'>+    xlator_t *xl;</div><div class='add'>+    int i, ret;</div><div class='add'>+</div><div class='add'>+    REQUIRE(num_types &gt; 0);</div><div class='add'>+</div><div class='add'>+    xl = test_calloc(1, sizeof(xlator_t));</div><div class='add'>+    assert_non_null(xl);</div><div class='add'>+    xl-&gt;mem_acct-&gt;num_types = num_types;</div><div class='add'>+    xl-&gt;mem_acct = test_calloc(sizeof(struct mem_acct) +</div><div class='add'>+                               sizeof(struct mem_acct_rec) + num_types);</div><div class='add'>+    assert_non_null(xl-&gt;mem_acct);</div><div class='add'>+</div><div class='add'>+    xl-&gt;ctx = test_calloc(1, sizeof(glusterfs_ctx_t));</div><div class='add'>+    assert_non_null(xl-&gt;ctx);</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; num_types; i++) {</div><div class='add'>+        ret = LOCK_INIT(&amp;(xl-&gt;mem_acct.rec[i].lock));</div><div class='add'>+        assert_false(ret);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ENSURE(num_types == xl-&gt;mem_acct.num_types);</div><div class='add'>+    ENSURE(NULL != xl);</div><div class='add'>+</div><div class='add'>+    return xl;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+helper_xlator_destroy(xlator_t *xl)</div><div class='add'>+{</div><div class='add'>+    int i, ret;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; xl-&gt;mem_acct.num_types; i++) {</div><div class='add'>+        ret = LOCK_DESTROY(&amp;(xl-&gt;mem_acct.rec[i].lock));</div><div class='add'>+        assert_int_equal(ret, 0);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    free(xl-&gt;mem_acct.rec);</div><div class='add'>+    free(xl-&gt;ctx);</div><div class='add'>+    free(xl);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+ * Unit tests</div><div class='add'>+ */</div><div class='add'>+static void</div><div class='add'>+test_dht_layout_new(void **state)</div><div class='add'>+{</div><div class='add'>+    xlator_t *xl;</div><div class='add'>+    dht_layout_t *layout;</div><div class='add'>+    dht_conf_t *conf;</div><div class='add'>+    int cnt;</div><div class='add'>+</div><div class='add'>+    expect_assert_failure(dht_layout_new(NULL, 0));</div><div class='add'>+    expect_assert_failure(dht_layout_new((xlator_t *)0x12345, -1));</div><div class='add'>+    xl = helper_xlator_init(10);</div><div class='add'>+</div><div class='add'>+    // xl-&gt;private is NULL</div><div class='add'>+    assert_null(xl-&gt;private);</div><div class='add'>+    cnt = 100;</div><div class='add'>+    layout = dht_layout_new(xl, cnt);</div><div class='add'>+    assert_non_null(layout);</div><div class='add'>+    assert_int_equal(layout-&gt;type, DHT_HASH_TYPE_DM);</div><div class='add'>+    assert_int_equal(layout-&gt;cnt, cnt);</div><div class='add'>+    assert_int_equal(GF_ATOMIC_GET(layout-&gt;ref), 1);</div><div class='add'>+    assert_int_equal(layout-&gt;gen, 0);</div><div class='add'>+    assert_int_equal(layout-&gt;spread_cnt, 0);</div><div class='add'>+    free(layout);</div><div class='add'>+</div><div class='add'>+    // xl-&gt;private is not NULL</div><div class='add'>+    cnt = 110;</div><div class='add'>+    conf = (dht_conf_t *)test_calloc(1, sizeof(dht_conf_t));</div><div class='add'>+    assert_non_null(conf);</div><div class='add'>+    conf-&gt;dir_spread_cnt = 12345;</div><div class='add'>+    conf-&gt;gen = -123;</div><div class='add'>+    xl-&gt;private = conf;</div><div class='add'>+</div><div class='add'>+    layout = dht_layout_new(xl, cnt);</div><div class='add'>+    assert_non_null(layout);</div><div class='add'>+    assert_int_equal(layout-&gt;type, DHT_HASH_TYPE_DM);</div><div class='add'>+    assert_int_equal(layout-&gt;cnt, cnt);</div><div class='add'>+    assert_int_equal(GF_ATOMIC_GET(layout-&gt;ref), 1);</div><div class='add'>+    assert_int_equal(layout-&gt;gen, conf-&gt;gen);</div><div class='add'>+    assert_int_equal(layout-&gt;spread_cnt, conf-&gt;dir_spread_cnt);</div><div class='add'>+    free(layout);</div><div class='add'>+</div><div class='add'>+    free(conf);</div><div class='add'>+    helper_xlator_destroy(xl);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+main(void)</div><div class='add'>+{</div><div class='add'>+    const struct CMUnitTest xlator_dht_layout_tests[] = {</div><div class='add'>+        unit_test(test_dht_layout_new),</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    return cmocka_run_group_tests(xlator_dht_layout_tests, NULL, NULL);</div><div class='add'>+}</div><div class='head'>diff --git a/libglusterfsclient/Makefile.am b/xlators/cluster/ec/Makefile.am<br/>index d471a3f9243..d471a3f9243 100644<br/>--- a/<a href='/cgit/glusterfs.git/tree/libglusterfsclient/Makefile.am?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>libglusterfsclient/Makefile.am</a><br/>+++ b/<a href='/cgit/glusterfs.git/tree/xlators/cluster/ec/Makefile.am?id=d1d7a6f35c816822fab51c820e25023863c239c1'>xlators/cluster/ec/Makefile.am</a></div><div class='head'>diff --git a/xlators/cluster/ec/src/Makefile.am b/xlators/cluster/ec/src/Makefile.am<br/>new file mode 100644<br/>index 00000000000..406a636bbc2<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/xlators/cluster/ec/src/Makefile.am?id=d1d7a6f35c816822fab51c820e25023863c239c1'>xlators/cluster/ec/src/Makefile.am</a></div><div class='hunk'>@@ -0,0 +1,83 @@</div><div class='add'>+xlator_LTLIBRARIES = ec.la</div><div class='add'>+xlatordir = $(libdir)/glusterfs/$(PACKAGE_VERSION)/xlator/cluster</div><div class='add'>+</div><div class='add'>+ec_sources := ec.c</div><div class='add'>+ec_sources += ec-data.c</div><div class='add'>+ec_sources += ec-helpers.c</div><div class='add'>+ec_sources += ec-common.c</div><div class='add'>+ec_sources += ec-generic.c</div><div class='add'>+ec_sources += ec-locks.c</div><div class='add'>+ec_sources += ec-dir-read.c</div><div class='add'>+ec_sources += ec-dir-write.c</div><div class='add'>+ec_sources += ec-inode-read.c</div><div class='add'>+ec_sources += ec-inode-write.c</div><div class='add'>+ec_sources += ec-combine.c</div><div class='add'>+ec_sources += ec-method.c</div><div class='add'>+ec_sources += ec-galois.c</div><div class='add'>+ec_sources += ec-code.c</div><div class='add'>+ec_sources += ec-code-c.c</div><div class='add'>+ec_sources += ec-gf8.c</div><div class='add'>+ec_sources += ec-heal.c</div><div class='add'>+ec_sources += ec-heald.c</div><div class='add'>+</div><div class='add'>+ec_headers := ec.h</div><div class='add'>+ec_headers += ec-mem-types.h</div><div class='add'>+ec_headers += ec-helpers.h</div><div class='add'>+ec_headers += ec-data.h</div><div class='add'>+ec_headers += ec-fops.h</div><div class='add'>+ec_headers += ec-common.h</div><div class='add'>+ec_headers += ec-combine.h</div><div class='add'>+ec_headers += ec-method.h</div><div class='add'>+ec_headers += ec-galois.h</div><div class='add'>+ec_headers += ec-code.h</div><div class='add'>+ec_headers += ec-code-c.h</div><div class='add'>+ec_headers += ec-gf8.h</div><div class='add'>+ec_headers += ec-heald.h</div><div class='add'>+ec_headers += ec-messages.h</div><div class='add'>+ec_headers += ec-types.h</div><div class='add'>+</div><div class='add'>+if ENABLE_EC_DYNAMIC_INTEL</div><div class='add'>+  ec_sources += ec-code-intel.c</div><div class='add'>+  ec_headers += ec-code-intel.h</div><div class='add'>+endif</div><div class='add'>+</div><div class='add'>+if ENABLE_EC_DYNAMIC_X64</div><div class='add'>+  ec_sources += ec-code-x64.c</div><div class='add'>+  ec_headers += ec-code-x64.h</div><div class='add'>+endif</div><div class='add'>+</div><div class='add'>+if ENABLE_EC_DYNAMIC_SSE</div><div class='add'>+  ec_sources += ec-code-sse.c</div><div class='add'>+  ec_headers += ec-code-sse.h</div><div class='add'>+endif</div><div class='add'>+</div><div class='add'>+if ENABLE_EC_DYNAMIC_AVX</div><div class='add'>+  ec_sources += ec-code-avx.c</div><div class='add'>+  ec_headers += ec-code-avx.h</div><div class='add'>+endif</div><div class='add'>+</div><div class='add'>+ec_ext_sources = $(top_builddir)/xlators/lib/src/libxlator.c</div><div class='add'>+</div><div class='add'>+ec_ext_headers = $(top_builddir)/xlators/lib/src/libxlator.h</div><div class='add'>+</div><div class='add'>+ec_la_LDFLAGS = -module $(GF_XLATOR_DEFAULT_LDFLAGS)</div><div class='add'>+ec_la_SOURCES = $(ec_sources) $(ec_headers) $(ec_ext_sources) $(ec_ext_headers)</div><div class='add'>+ec_la_LIBADD = $(top_builddir)/libglusterfs/src/libglusterfs.la</div><div class='add'>+</div><div class='add'>+AM_CPPFLAGS = $(GF_CPPFLAGS)</div><div class='add'>+AM_CPPFLAGS += -I$(top_srcdir)/libglusterfs/src</div><div class='add'>+AM_CPPFLAGS += -I$(top_srcdir)/xlators/lib/src</div><div class='add'>+AM_CPPFLAGS += -I$(top_srcdir)/rpc/rpc-lib/src</div><div class='add'>+AM_CPPFLAGS += -I$(top_srcdir)/rpc/xdr/src</div><div class='add'>+AM_CPPFLAGS += -I$(top_builddir)/rpc/xdr/src</div><div class='add'>+AM_CPPFLAGS += -DGLUSTERFS_LIBEXECDIR=\"$(GLUSTERFS_LIBEXECDIR)\"</div><div class='add'>+</div><div class='add'>+AM_CFLAGS = -Wall $(GF_CFLAGS)</div><div class='add'>+</div><div class='add'>+CLEANFILES =</div><div class='add'>+</div><div class='add'>+install-data-hook:</div><div class='add'>+	ln -sf ec.so $(DESTDIR)$(xlatordir)/disperse.so</div><div class='add'>+</div><div class='add'>+uninstall-local:</div><div class='add'>+	rm -f $(DESTDIR)$(xlatordir)/disperse.so</div><div class='head'>diff --git a/xlators/cluster/ec/src/ec-code-avx.c b/xlators/cluster/ec/src/ec-code-avx.c<br/>new file mode 100644<br/>index 00000000000..70afaa00f54<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/xlators/cluster/ec/src/ec-code-avx.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>xlators/cluster/ec/src/ec-code-avx.c</a></div><div class='hunk'>@@ -0,0 +1,109 @@</div><div class='add'>+/*</div><div class='add'>+  Copyright (c) 2015 DataLab, s.l. &lt;http://www.datalab.es&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#include &lt;errno.h&gt;</div><div class='add'>+</div><div class='add'>+#include "ec-code-intel.h"</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+ec_code_avx_prolog(ec_code_builder_t *builder)</div><div class='add'>+{</div><div class='add'>+    builder-&gt;loop = builder-&gt;address;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+ec_code_avx_epilog(ec_code_builder_t *builder)</div><div class='add'>+{</div><div class='add'>+    ec_code_intel_op_add_i2r(builder, 32, REG_DX);</div><div class='add'>+    ec_code_intel_op_add_i2r(builder, 32, REG_DI);</div><div class='add'>+    ec_code_intel_op_test_i2r(builder, builder-&gt;width - 1, REG_DX);</div><div class='add'>+    ec_code_intel_op_jne(builder, builder-&gt;loop);</div><div class='add'>+</div><div class='add'>+    ec_code_intel_op_ret(builder, 0);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+ec_code_avx_load(ec_code_builder_t *builder, uint32_t dst, uint32_t idx,</div><div class='add'>+                 uint32_t bit)</div><div class='add'>+{</div><div class='add'>+    if (builder-&gt;linear) {</div><div class='add'>+        ec_code_intel_op_mov_m2avx(</div><div class='add'>+            builder, REG_SI, REG_DX, 1,</div><div class='add'>+            idx * builder-&gt;width * builder-&gt;bits + bit * builder-&gt;width, dst);</div><div class='add'>+    } else {</div><div class='add'>+        if (builder-&gt;base != idx) {</div><div class='add'>+            ec_code_intel_op_mov_m2r(builder, REG_SI, REG_NULL, 0, idx * 8,</div><div class='add'>+                                     REG_AX);</div><div class='add'>+            builder-&gt;base = idx;</div><div class='add'>+        }</div><div class='add'>+        ec_code_intel_op_mov_m2avx(builder, REG_AX, REG_DX, 1,</div><div class='add'>+                                   bit * builder-&gt;width, dst);</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+ec_code_avx_store(ec_code_builder_t *builder, uint32_t src, uint32_t bit)</div><div class='add'>+{</div><div class='add'>+    ec_code_intel_op_mov_avx2m(builder, src, REG_DI, REG_NULL, 0,</div><div class='add'>+                               bit * builder-&gt;width);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+ec_code_avx_copy(ec_code_builder_t *builder, uint32_t dst, uint32_t src)</div><div class='add'>+{</div><div class='add'>+    ec_code_intel_op_mov_avx2avx(builder, src, dst);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+ec_code_avx_xor2(ec_code_builder_t *builder, uint32_t dst, uint32_t src)</div><div class='add'>+{</div><div class='add'>+    ec_code_intel_op_xor_avx2avx(builder, src, dst);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+ec_code_avx_xor3(ec_code_builder_t *builder, uint32_t dst, uint32_t src1,</div><div class='add'>+                 uint32_t src2)</div><div class='add'>+{</div><div class='add'>+    ec_code_intel_op_mov_avx2avx(builder, src1, dst);</div><div class='add'>+    ec_code_intel_op_xor_avx2avx(builder, src2, dst);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+ec_code_avx_xorm(ec_code_builder_t *builder, uint32_t dst, uint32_t idx,</div><div class='add'>+                 uint32_t bit)</div><div class='add'>+{</div><div class='add'>+    if (builder-&gt;linear) {</div><div class='add'>+        ec_code_intel_op_xor_m2avx(</div><div class='add'>+            builder, REG_SI, REG_DX, 1,</div><div class='add'>+            idx * builder-&gt;width * builder-&gt;bits + bit * builder-&gt;width, dst);</div><div class='add'>+    } else {</div><div class='add'>+        if (builder-&gt;base != idx) {</div><div class='add'>+            ec_code_intel_op_mov_m2r(builder, REG_SI, REG_NULL, 0, idx * 8,</div><div class='add'>+                                     REG_AX);</div><div class='add'>+            builder-&gt;base = idx;</div><div class='add'>+        }</div><div class='add'>+        ec_code_intel_op_xor_m2avx(builder, REG_AX, REG_DX, 1,</div><div class='add'>+                                   bit * builder-&gt;width, dst);</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static char *ec_code_avx_needed_flags[] = {"avx2", NULL};</div><div class='add'>+</div><div class='add'>+ec_code_gen_t ec_code_gen_avx = {.name = "avx",</div><div class='add'>+                                 .flags = ec_code_avx_needed_flags,</div><div class='add'>+                                 .width = 32,</div><div class='add'>+                                 .prolog = ec_code_avx_prolog,</div><div class='add'>+                                 .epilog = ec_code_avx_epilog,</div><div class='add'>+                                 .load = ec_code_avx_load,</div><div class='add'>+                                 .store = ec_code_avx_store,</div><div class='add'>+                                 .copy = ec_code_avx_copy,</div><div class='add'>+                                 .xor2 = ec_code_avx_xor2,</div><div class='add'>+                                 .xor3 = ec_code_avx_xor3,</div><div class='add'>+                                 .xorm = ec_code_avx_xorm};</div><div class='head'>diff --git a/xlators/cluster/ec/src/ec-code-avx.h b/xlators/cluster/ec/src/ec-code-avx.h<br/>new file mode 100644<br/>index 00000000000..fdca4ad2c8f<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/xlators/cluster/ec/src/ec-code-avx.h?id=d1d7a6f35c816822fab51c820e25023863c239c1'>xlators/cluster/ec/src/ec-code-avx.h</a></div><div class='hunk'>@@ -0,0 +1,18 @@</div><div class='add'>+/*</div><div class='add'>+  Copyright (c) 2015 DataLab, s.l. &lt;http://www.datalab.es&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#ifndef __EC_CODE_AVX_H__</div><div class='add'>+#define __EC_CODE_AVX_H__</div><div class='add'>+</div><div class='add'>+#include "ec-code.h"</div><div class='add'>+</div><div class='add'>+extern ec_code_gen_t ec_code_gen_avx;</div><div class='add'>+</div><div class='add'>+#endif /* __EC_CODE_AVX_H__ */</div><div class='head'>diff --git a/xlators/cluster/ec/src/ec-code-c.c b/xlators/cluster/ec/src/ec-code-c.c<br/>new file mode 100644<br/>index 00000000000..acdc665c2cf<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/xlators/cluster/ec/src/ec-code-c.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>xlators/cluster/ec/src/ec-code-c.c</a></div><div class='hunk'>@@ -0,0 +1,11679 @@</div><div class='add'>+/*</div><div class='add'>+  Copyright (c) 2015 DataLab, s.l. &lt;http://www.datalab.es&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#include &lt;inttypes.h&gt;</div><div class='add'>+#include &lt;string.h&gt;</div><div class='add'>+</div><div class='add'>+#include "ec-method.h"</div><div class='add'>+#include "ec-code-c.h"</div><div class='add'>+</div><div class='add'>+#define WIDTH (EC_METHOD_WORD_SIZE / sizeof(uint64_t))</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_00(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    memcpy(out, in, EC_METHOD_WORD_SIZE * 8);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_01(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        out_ptr[0] ^= in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] ^= in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] ^= in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] ^= in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] ^= in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] ^= in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] ^= in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] ^= in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_02(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        out0 = in7;</div><div class='add'>+        out1 = in0;</div><div class='add'>+        out7 = in6;</div><div class='add'>+        out5 = in4;</div><div class='add'>+        out6 = in5;</div><div class='add'>+        out3 = in2 ^ in7;</div><div class='add'>+        out4 = in3 ^ in7;</div><div class='add'>+        out2 = in1 ^ in7;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_03(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        out0 = in0 ^ in7;</div><div class='add'>+        tmp0 = in2 ^ in7;</div><div class='add'>+        out1 = in0 ^ in1;</div><div class='add'>+        out7 = in6 ^ in7;</div><div class='add'>+        out5 = in4 ^ in5;</div><div class='add'>+        out6 = in5 ^ in6;</div><div class='add'>+        out4 = in3 ^ in4 ^ in7;</div><div class='add'>+        out2 = tmp0 ^ in1;</div><div class='add'>+        out3 = tmp0 ^ in3;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_04(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        out0 = in6;</div><div class='add'>+        out1 = in7;</div><div class='add'>+        out7 = in5;</div><div class='add'>+        out6 = in4;</div><div class='add'>+        tmp0 = in6 ^ in7;</div><div class='add'>+        out2 = in0 ^ in6;</div><div class='add'>+        out5 = in3 ^ in7;</div><div class='add'>+        out3 = tmp0 ^ in1;</div><div class='add'>+        out4 = tmp0 ^ in2;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_05(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        out0 = in0 ^ in6;</div><div class='add'>+        out1 = in1 ^ in7;</div><div class='add'>+        out7 = in5 ^ in7;</div><div class='add'>+        out6 = in4 ^ in6;</div><div class='add'>+        out2 = out0 ^ in2;</div><div class='add'>+        out3 = out1 ^ in3 ^ in6;</div><div class='add'>+        out5 = out7 ^ in3;</div><div class='add'>+        out4 = out6 ^ in2 ^ in7;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_06(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        out0 = in6 ^ in7;</div><div class='add'>+        tmp0 = in1 ^ in6;</div><div class='add'>+        out1 = in0 ^ in7;</div><div class='add'>+        out7 = in5 ^ in6;</div><div class='add'>+        out6 = in4 ^ in5;</div><div class='add'>+        out4 = in2 ^ in3 ^ in6;</div><div class='add'>+        out5 = in3 ^ in4 ^ in7;</div><div class='add'>+        out3 = tmp0 ^ in2;</div><div class='add'>+        out2 = tmp0 ^ out1;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_07(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0, tmp1, tmp2, tmp3;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        tmp0 = in2 ^ in6;</div><div class='add'>+        tmp1 = in5 ^ in6;</div><div class='add'>+        tmp2 = in0 ^ in7;</div><div class='add'>+        tmp3 = tmp0 ^ in3;</div><div class='add'>+        out6 = tmp1 ^ in4;</div><div class='add'>+        out7 = tmp1 ^ in7;</div><div class='add'>+        out0 = tmp2 ^ in6;</div><div class='add'>+        out1 = tmp2 ^ in1;</div><div class='add'>+        out3 = tmp3 ^ in1;</div><div class='add'>+        out4 = tmp3 ^ in4;</div><div class='add'>+        out5 = out4 ^ out7 ^ in2;</div><div class='add'>+        out2 = tmp0 ^ out1;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_08(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        out0 = in5;</div><div class='add'>+        out1 = in6;</div><div class='add'>+        out7 = in4;</div><div class='add'>+        out6 = in3 ^ in7;</div><div class='add'>+        out3 = in0 ^ in5 ^ in6;</div><div class='add'>+        out5 = in2 ^ in6 ^ in7;</div><div class='add'>+        out2 = in5 ^ in7;</div><div class='add'>+        out4 = out2 ^ in1 ^ in6;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_09(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        out0 = in0 ^ in5;</div><div class='add'>+        tmp0 = in3 ^ in6;</div><div class='add'>+        out1 = in1 ^ in6;</div><div class='add'>+        out7 = in4 ^ in7;</div><div class='add'>+        out2 = in2 ^ in5 ^ in7;</div><div class='add'>+        out3 = tmp0 ^ out0;</div><div class='add'>+        out6 = tmp0 ^ in7;</div><div class='add'>+        out4 = out1 ^ out7 ^ in5;</div><div class='add'>+        out5 = out2 ^ in6;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_0A(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        out0 = in5 ^ in7;</div><div class='add'>+        out1 = in0 ^ in6;</div><div class='add'>+        out7 = in4 ^ in6;</div><div class='add'>+        out2 = in1 ^ in5;</div><div class='add'>+        out6 = out0 ^ in3;</div><div class='add'>+        out3 = out0 ^ out1 ^ in2;</div><div class='add'>+        out5 = out7 ^ in2 ^ in7;</div><div class='add'>+        out4 = out2 ^ in3 ^ in6;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_0B(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0, tmp1, tmp2;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        tmp0 = in2 ^ in5;</div><div class='add'>+        tmp1 = in0 ^ in6;</div><div class='add'>+        tmp2 = in4 ^ in7;</div><div class='add'>+        out0 = in0 ^ in5 ^ in7;</div><div class='add'>+        out2 = tmp0 ^ in1;</div><div class='add'>+        out1 = tmp1 ^ in1;</div><div class='add'>+        out6 = tmp1 ^ out0 ^ in3;</div><div class='add'>+        out7 = tmp2 ^ in6;</div><div class='add'>+        out4 = tmp2 ^ out6 ^ in1;</div><div class='add'>+        out3 = out6 ^ in0 ^ in2;</div><div class='add'>+        out5 = tmp0 ^ out7;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_0C(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0, tmp1;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        out0 = in5 ^ in6;</div><div class='add'>+        out1 = in6 ^ in7;</div><div class='add'>+        out7 = in4 ^ in5;</div><div class='add'>+        tmp0 = in1 ^ in5;</div><div class='add'>+        tmp1 = in0 ^ in7;</div><div class='add'>+        out5 = in2 ^ in3 ^ in6;</div><div class='add'>+        out6 = in3 ^ in4 ^ in7;</div><div class='add'>+        out2 = tmp1 ^ out0;</div><div class='add'>+        out4 = tmp0 ^ in2;</div><div class='add'>+        out3 = tmp0 ^ tmp1;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_0D(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0, tmp1, tmp2;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        tmp0 = in4 ^ in5;</div><div class='add'>+        tmp1 = in5 ^ in6;</div><div class='add'>+        out1 = in1 ^ in6 ^ in7;</div><div class='add'>+        out7 = tmp0 ^ in7;</div><div class='add'>+        out4 = tmp0 ^ in1 ^ in2;</div><div class='add'>+        out0 = tmp1 ^ in0;</div><div class='add'>+        tmp2 = tmp1 ^ in3;</div><div class='add'>+        out6 = tmp2 ^ out7;</div><div class='add'>+        out2 = out0 ^ in2 ^ in7;</div><div class='add'>+        out3 = out0 ^ out1 ^ in3;</div><div class='add'>+        out5 = tmp2 ^ in2;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_0E(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0, tmp1, tmp2, tmp3;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        tmp0 = in0 ^ in1;</div><div class='add'>+        tmp1 = in2 ^ in5;</div><div class='add'>+        tmp2 = in5 ^ in6;</div><div class='add'>+        out1 = in0 ^ in6 ^ in7;</div><div class='add'>+        out3 = tmp0 ^ tmp1;</div><div class='add'>+        out2 = tmp0 ^ tmp2;</div><div class='add'>+        tmp3 = tmp1 ^ in3;</div><div class='add'>+        out7 = tmp2 ^ in4;</div><div class='add'>+        out0 = tmp2 ^ in7;</div><div class='add'>+        out4 = tmp3 ^ in1 ^ in7;</div><div class='add'>+        out5 = tmp3 ^ out7;</div><div class='add'>+        out6 = out0 ^ out5 ^ in2;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_0F(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0, tmp1, tmp2, tmp3;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        tmp0 = in6 ^ in7;</div><div class='add'>+        tmp1 = tmp0 ^ in1;</div><div class='add'>+        tmp2 = tmp0 ^ in5;</div><div class='add'>+        out1 = tmp1 ^ in0;</div><div class='add'>+        out7 = tmp2 ^ in4;</div><div class='add'>+        out0 = tmp2 ^ in0;</div><div class='add'>+        out6 = out7 ^ in3;</div><div class='add'>+        out5 = out6 ^ in2 ^ in7;</div><div class='add'>+        tmp3 = tmp1 ^ out0 ^ in2;</div><div class='add'>+        out4 = tmp1 ^ out5;</div><div class='add'>+        out2 = tmp3 ^ in6;</div><div class='add'>+        out3 = tmp3 ^ in3;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_10(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0, tmp1;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        out0 = in4;</div><div class='add'>+        out1 = in5;</div><div class='add'>+        out7 = in3 ^ in7;</div><div class='add'>+        tmp0 = in6 ^ in7;</div><div class='add'>+        out2 = in4 ^ in6;</div><div class='add'>+        tmp1 = out2 ^ in5;</div><div class='add'>+        out6 = tmp0 ^ in2;</div><div class='add'>+        out3 = tmp0 ^ tmp1;</div><div class='add'>+        out5 = out2 ^ out3 ^ in1;</div><div class='add'>+        out4 = tmp1 ^ in0;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_11(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        out7 = in3;</div><div class='add'>+        out0 = in0 ^ in4;</div><div class='add'>+        out1 = in1 ^ in5;</div><div class='add'>+        out6 = in2 ^ in7;</div><div class='add'>+        out4 = in0 ^ in5 ^ in6;</div><div class='add'>+        out5 = in1 ^ in6 ^ in7;</div><div class='add'>+        out2 = in2 ^ in4 ^ in6;</div><div class='add'>+        out3 = in3 ^ in4 ^ in5 ^ in7;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_12(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0, tmp1;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        out0 = in4 ^ in7;</div><div class='add'>+        out1 = in0 ^ in5;</div><div class='add'>+        out3 = in2 ^ in4 ^ in5;</div><div class='add'>+        tmp0 = out0 ^ in6;</div><div class='add'>+        out2 = tmp0 ^ in1;</div><div class='add'>+        tmp1 = tmp0 ^ in3;</div><div class='add'>+        out6 = tmp0 ^ out3;</div><div class='add'>+        out5 = out2 ^ in5;</div><div class='add'>+        out7 = tmp1 ^ in4;</div><div class='add'>+        out4 = tmp1 ^ out1;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_13(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0, tmp1;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        out7 = in3 ^ in6;</div><div class='add'>+        tmp0 = in0 ^ in5;</div><div class='add'>+        tmp1 = in4 ^ in7;</div><div class='add'>+        out6 = in2 ^ in5 ^ in7;</div><div class='add'>+        out4 = tmp0 ^ out7 ^ in7;</div><div class='add'>+        out1 = tmp0 ^ in1;</div><div class='add'>+        out0 = tmp1 ^ in0;</div><div class='add'>+        out5 = tmp1 ^ in1 ^ in6;</div><div class='add'>+        out3 = tmp1 ^ out6 ^ in3;</div><div class='add'>+        out2 = out5 ^ in2;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_14(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0, tmp1;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        out0 = in4 ^ in6;</div><div class='add'>+        out1 = in5 ^ in7;</div><div class='add'>+        out2 = in0 ^ in4;</div><div class='add'>+        tmp0 = out0 ^ in5;</div><div class='add'>+        out7 = out1 ^ in3;</div><div class='add'>+        tmp1 = out1 ^ in2;</div><div class='add'>+        out3 = tmp0 ^ in1;</div><div class='add'>+        out6 = tmp0 ^ tmp1;</div><div class='add'>+        out4 = tmp1 ^ out2;</div><div class='add'>+        out5 = out3 ^ in3 ^ in4;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_15(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        out7 = in3 ^ in5;</div><div class='add'>+        tmp0 = in0 ^ in4;</div><div class='add'>+        out1 = in1 ^ in5 ^ in7;</div><div class='add'>+        out5 = in1 ^ in3 ^ in6;</div><div class='add'>+        out0 = tmp0 ^ in6;</div><div class='add'>+        out2 = tmp0 ^ in2;</div><div class='add'>+        out3 = out5 ^ in4 ^ in5;</div><div class='add'>+        out6 = out2 ^ in0 ^ in7;</div><div class='add'>+        out4 = tmp0 ^ out6 ^ in5;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_16(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0, tmp1, tmp2, tmp3;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        tmp0 = in0 ^ in5;</div><div class='add'>+        tmp1 = in4 ^ in7;</div><div class='add'>+        tmp2 = in2 ^ in3 ^ in4;</div><div class='add'>+        out1 = tmp0 ^ in7;</div><div class='add'>+        out4 = tmp0 ^ tmp2;</div><div class='add'>+        out0 = tmp1 ^ in6;</div><div class='add'>+        tmp3 = tmp1 ^ in1;</div><div class='add'>+        out6 = out0 ^ in2 ^ in5;</div><div class='add'>+        out2 = tmp3 ^ in0;</div><div class='add'>+        out3 = out6 ^ in1;</div><div class='add'>+        out7 = tmp2 ^ out6;</div><div class='add'>+        out5 = tmp3 ^ out7;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_17(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0, tmp1, tmp2, tmp3;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        tmp0 = in2 ^ in5;</div><div class='add'>+        tmp1 = in3 ^ in6;</div><div class='add'>+        tmp2 = tmp0 ^ in4;</div><div class='add'>+        out4 = tmp0 ^ in0 ^ in3;</div><div class='add'>+        out7 = tmp1 ^ in5;</div><div class='add'>+        tmp3 = tmp1 ^ in1;</div><div class='add'>+        out6 = tmp2 ^ in7;</div><div class='add'>+        out5 = tmp3 ^ in4;</div><div class='add'>+        out3 = tmp3 ^ out6;</div><div class='add'>+        out0 = out3 ^ out4 ^ in1;</div><div class='add'>+        out2 = out3 ^ out7 ^ in0;</div><div class='add'>+        out1 = tmp2 ^ out2;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_18(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0, tmp1;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        out0 = in4 ^ in5;</div><div class='add'>+        out1 = in5 ^ in6;</div><div class='add'>+        tmp0 = in4 ^ in7;</div><div class='add'>+        out5 = in1 ^ in2 ^ in5;</div><div class='add'>+        out6 = in2 ^ in3 ^ in6;</div><div class='add'>+        out2 = tmp0 ^ out1;</div><div class='add'>+        out7 = tmp0 ^ in3;</div><div class='add'>+        tmp1 = tmp0 ^ in0;</div><div class='add'>+        out3 = tmp1 ^ in6;</div><div class='add'>+        out4 = tmp1 ^ in1;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_19(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0, tmp1;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        out5 = in1 ^ in2;</div><div class='add'>+        out7 = in3 ^ in4;</div><div class='add'>+        tmp0 = in0 ^ in7;</div><div class='add'>+        out6 = in2 ^ in3;</div><div class='add'>+        out1 = in1 ^ in5 ^ in6;</div><div class='add'>+        out0 = in0 ^ in4 ^ in5;</div><div class='add'>+        out4 = tmp0 ^ in1;</div><div class='add'>+        tmp1 = tmp0 ^ in6;</div><div class='add'>+        out2 = tmp1 ^ out0 ^ in2;</div><div class='add'>+        out3 = tmp1 ^ out7;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_1A(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0, tmp1, tmp2, tmp3;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        tmp0 = in4 ^ in5;</div><div class='add'>+        tmp1 = in5 ^ in6;</div><div class='add'>+        tmp2 = tmp0 ^ in1;</div><div class='add'>+        out0 = tmp0 ^ in7;</div><div class='add'>+        out1 = tmp1 ^ in0;</div><div class='add'>+        tmp3 = tmp1 ^ in3;</div><div class='add'>+        out5 = tmp2 ^ in2;</div><div class='add'>+        out2 = tmp2 ^ in6;</div><div class='add'>+        out7 = tmp3 ^ out0;</div><div class='add'>+        out6 = tmp3 ^ in2;</div><div class='add'>+        out4 = tmp3 ^ out2 ^ in0;</div><div class='add'>+        out3 = tmp0 ^ out1 ^ in2;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_1B(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0, tmp1, tmp2, tmp3, tmp4;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        tmp0 = in2 ^ in4;</div><div class='add'>+        tmp1 = in2 ^ in5;</div><div class='add'>+        tmp2 = in3 ^ in6;</div><div class='add'>+        out5 = tmp0 ^ in1;</div><div class='add'>+        tmp3 = tmp0 ^ in0;</div><div class='add'>+        out6 = tmp1 ^ in3;</div><div class='add'>+        out0 = tmp1 ^ tmp3 ^ in7;</div><div class='add'>+        out7 = tmp2 ^ in4;</div><div class='add'>+        tmp4 = out5 ^ in6;</div><div class='add'>+        out3 = tmp2 ^ tmp3;</div><div class='add'>+        out2 = tmp4 ^ in5;</div><div class='add'>+        out4 = tmp4 ^ out3;</div><div class='add'>+        out1 = tmp3 ^ out2;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_1C(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0, tmp1, tmp2, tmp3, tmp4;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        tmp0 = in2 ^ in3;</div><div class='add'>+        tmp1 = in4 ^ in6;</div><div class='add'>+        tmp2 = in5 ^ in7;</div><div class='add'>+        out6 = tmp0 ^ tmp1;</div><div class='add'>+        out0 = tmp1 ^ in5;</div><div class='add'>+        out1 = tmp2 ^ in6;</div><div class='add'>+        tmp3 = tmp2 ^ in1;</div><div class='add'>+        tmp4 = tmp2 ^ in4;</div><div class='add'>+        out2 = tmp4 ^ in0;</div><div class='add'>+        out7 = tmp4 ^ in3;</div><div class='add'>+        out5 = tmp0 ^ tmp3;</div><div class='add'>+        out3 = tmp3 ^ out2;</div><div class='add'>+        out4 = out3 ^ in2 ^ in6;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_1D(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0, tmp1, tmp2, tmp3, tmp4;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        tmp0 = in1 ^ in3;</div><div class='add'>+        tmp1 = in0 ^ in4;</div><div class='add'>+        tmp2 = in3 ^ in4;</div><div class='add'>+        tmp3 = in2 ^ in7;</div><div class='add'>+        out3 = tmp0 ^ tmp1;</div><div class='add'>+        out5 = tmp0 ^ tmp3;</div><div class='add'>+        tmp4 = tmp1 ^ in5;</div><div class='add'>+        out6 = tmp2 ^ in2;</div><div class='add'>+        out7 = tmp2 ^ in5;</div><div class='add'>+        out2 = tmp3 ^ tmp4;</div><div class='add'>+        out4 = out3 ^ out6 ^ in6;</div><div class='add'>+        out0 = tmp4 ^ in6;</div><div class='add'>+        out1 = out2 ^ out4 ^ in4;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_1E(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0, tmp1, tmp2, tmp3;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        tmp0 = in0 ^ in4;</div><div class='add'>+        tmp1 = in2 ^ in7;</div><div class='add'>+        tmp2 = tmp0 ^ in1;</div><div class='add'>+        out3 = tmp1 ^ tmp2;</div><div class='add'>+        out2 = tmp2 ^ in5;</div><div class='add'>+        out4 = out3 ^ in3 ^ in6;</div><div class='add'>+        tmp3 = out4 ^ in7;</div><div class='add'>+        out6 = tmp3 ^ out2 ^ in4;</div><div class='add'>+        out7 = tmp1 ^ out6;</div><div class='add'>+        out0 = out7 ^ in3;</div><div class='add'>+        out1 = tmp0 ^ out0;</div><div class='add'>+        out5 = tmp3 ^ out1;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_1F(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0, tmp1;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        tmp0 = in4 ^ in6;</div><div class='add'>+        tmp1 = tmp0 ^ in5;</div><div class='add'>+        out7 = tmp1 ^ in3;</div><div class='add'>+        out0 = tmp1 ^ in0 ^ in7;</div><div class='add'>+        out6 = out7 ^ in2 ^ in6;</div><div class='add'>+        out1 = out0 ^ in1 ^ in4;</div><div class='add'>+        out4 = out0 ^ out6 ^ in1;</div><div class='add'>+        out3 = tmp0 ^ out4;</div><div class='add'>+        out2 = out4 ^ out7 ^ in7;</div><div class='add'>+        out5 = out3 ^ in0;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_20(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0, tmp1;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        out1 = in4;</div><div class='add'>+        out0 = in3 ^ in7;</div><div class='add'>+        tmp0 = in3 ^ in4;</div><div class='add'>+        tmp1 = in6 ^ in7;</div><div class='add'>+        out2 = out0 ^ in5;</div><div class='add'>+        out4 = tmp0 ^ in5;</div><div class='add'>+        out3 = tmp0 ^ tmp1;</div><div class='add'>+        out7 = tmp1 ^ in2;</div><div class='add'>+        out6 = tmp1 ^ in1 ^ in5;</div><div class='add'>+        out5 = out2 ^ out3 ^ in0;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_21(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        out1 = in1 ^ in4;</div><div class='add'>+        tmp0 = in4 ^ in6;</div><div class='add'>+        out4 = in3 ^ in5;</div><div class='add'>+        out7 = in2 ^ in6;</div><div class='add'>+        out0 = in0 ^ in3 ^ in7;</div><div class='add'>+        out6 = in1 ^ in5 ^ in7;</div><div class='add'>+        out3 = tmp0 ^ in7;</div><div class='add'>+        out5 = tmp0 ^ in0;</div><div class='add'>+        out2 = out4 ^ in2 ^ in7;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_22(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        out0 = in3;</div><div class='add'>+        out1 = in0 ^ in4;</div><div class='add'>+        out7 = in2 ^ in7;</div><div class='add'>+        out4 = in4 ^ in5 ^ in7;</div><div class='add'>+        out5 = in0 ^ in5 ^ in6;</div><div class='add'>+        out6 = in1 ^ in6 ^ in7;</div><div class='add'>+        out3 = in2 ^ in3 ^ in4 ^ in6;</div><div class='add'>+        out2 = in1 ^ in3 ^ in5;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_23(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        out7 = in2;</div><div class='add'>+        out0 = in0 ^ in3;</div><div class='add'>+        out4 = in5 ^ in7;</div><div class='add'>+        out5 = in0 ^ in6;</div><div class='add'>+        out6 = in1 ^ in7;</div><div class='add'>+        out3 = in2 ^ in4 ^ in6;</div><div class='add'>+        out1 = in0 ^ in1 ^ in4;</div><div class='add'>+        out2 = out4 ^ out6 ^ in2 ^ in3;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_24(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0, tmp1;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        out1 = in4 ^ in7;</div><div class='add'>+        tmp0 = in3 ^ in4;</div><div class='add'>+        out0 = in3 ^ in6 ^ in7;</div><div class='add'>+        out3 = tmp0 ^ in1;</div><div class='add'>+        tmp1 = out0 ^ in5;</div><div class='add'>+        out6 = tmp1 ^ out3;</div><div class='add'>+        out2 = tmp1 ^ in0;</div><div class='add'>+        out7 = tmp1 ^ in2 ^ in3;</div><div class='add'>+        out5 = out2 ^ in4;</div><div class='add'>+        out4 = tmp0 ^ out7;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_25(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        out3 = in1 ^ in4;</div><div class='add'>+        tmp0 = in2 ^ in5;</div><div class='add'>+        out1 = out3 ^ in7;</div><div class='add'>+        out7 = tmp0 ^ in6;</div><div class='add'>+        out6 = out1 ^ in5;</div><div class='add'>+        out4 = out7 ^ in3 ^ in7;</div><div class='add'>+        out2 = out4 ^ in0;</div><div class='add'>+        out0 = tmp0 ^ out2;</div><div class='add'>+        out5 = out0 ^ in4;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_26(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0, tmp1, tmp2;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        out0 = in3 ^ in6;</div><div class='add'>+        tmp0 = in4 ^ in7;</div><div class='add'>+        out7 = in2 ^ in5 ^ in7;</div><div class='add'>+        tmp1 = out0 ^ in0 ^ in5;</div><div class='add'>+        out1 = tmp0 ^ in0;</div><div class='add'>+        tmp2 = tmp0 ^ in6;</div><div class='add'>+        out2 = tmp1 ^ in1;</div><div class='add'>+        out5 = tmp1 ^ in7;</div><div class='add'>+        out6 = tmp2 ^ in1;</div><div class='add'>+        out4 = tmp2 ^ out7;</div><div class='add'>+        out3 = out0 ^ out6 ^ in2;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_27(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        out7 = in2 ^ in5;</div><div class='add'>+        out0 = in0 ^ in3 ^ in6;</div><div class='add'>+        out6 = in1 ^ in4 ^ in7;</div><div class='add'>+        out4 = out7 ^ in6;</div><div class='add'>+        out2 = out0 ^ out7 ^ in1;</div><div class='add'>+        out5 = out0 ^ in7;</div><div class='add'>+        out1 = out6 ^ in0;</div><div class='add'>+        out3 = out6 ^ in2;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_28(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0, tmp1, tmp2;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        out2 = in3;</div><div class='add'>+        out1 = in4 ^ in6;</div><div class='add'>+        out0 = in3 ^ in5 ^ in7;</div><div class='add'>+        tmp0 = out1 ^ in7;</div><div class='add'>+        tmp1 = out0 ^ in4;</div><div class='add'>+        out7 = tmp0 ^ in2;</div><div class='add'>+        tmp2 = tmp0 ^ in1;</div><div class='add'>+        out3 = tmp1 ^ in0;</div><div class='add'>+        out6 = tmp1 ^ tmp2;</div><div class='add'>+        out4 = tmp2 ^ in3;</div><div class='add'>+        out5 = out3 ^ in2 ^ in3;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_29(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0, tmp1, tmp2;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        out2 = in2 ^ in3;</div><div class='add'>+        tmp0 = in1 ^ in3;</div><div class='add'>+        tmp1 = in4 ^ in6;</div><div class='add'>+        tmp2 = in0 ^ in4 ^ in7;</div><div class='add'>+        out6 = tmp0 ^ in5;</div><div class='add'>+        out4 = tmp0 ^ in6 ^ in7;</div><div class='add'>+        out1 = tmp1 ^ in1;</div><div class='add'>+        out7 = tmp1 ^ in2;</div><div class='add'>+        out3 = tmp2 ^ in5;</div><div class='add'>+        out5 = tmp2 ^ in2;</div><div class='add'>+        out0 = out3 ^ in3 ^ in4;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_2A(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0, tmp1;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        out0 = in3 ^ in5;</div><div class='add'>+        tmp0 = in1 ^ in3;</div><div class='add'>+        tmp1 = in0 ^ in4;</div><div class='add'>+        out7 = in2 ^ in4 ^ in7;</div><div class='add'>+        out3 = tmp1 ^ out0 ^ in2;</div><div class='add'>+        out2 = tmp0 ^ in7;</div><div class='add'>+        out6 = tmp0 ^ in6;</div><div class='add'>+        out1 = tmp1 ^ in6;</div><div class='add'>+        out5 = tmp1 ^ out7 ^ in5;</div><div class='add'>+        out4 = out1 ^ in0 ^ in1;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_2B(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0, tmp1;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        out4 = in1 ^ in6;</div><div class='add'>+        out7 = in2 ^ in4;</div><div class='add'>+        tmp0 = in0 ^ in5;</div><div class='add'>+        tmp1 = in2 ^ in7;</div><div class='add'>+        out6 = in1 ^ in3;</div><div class='add'>+        out1 = out4 ^ in0 ^ in4;</div><div class='add'>+        out3 = tmp0 ^ out7;</div><div class='add'>+        out0 = tmp0 ^ in3;</div><div class='add'>+        out5 = tmp1 ^ in0;</div><div class='add'>+        out2 = tmp1 ^ out6;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_2C(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0, tmp1, tmp2, tmp3;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        tmp0 = in2 ^ in5;</div><div class='add'>+        tmp1 = in2 ^ in3 ^ in4;</div><div class='add'>+        tmp2 = tmp0 ^ in6;</div><div class='add'>+        out4 = tmp1 ^ in1;</div><div class='add'>+        out5 = tmp1 ^ in0 ^ in5;</div><div class='add'>+        tmp3 = tmp2 ^ in4;</div><div class='add'>+        out6 = tmp2 ^ out4;</div><div class='add'>+        out7 = tmp3 ^ in7;</div><div class='add'>+        out2 = tmp3 ^ out5;</div><div class='add'>+        out3 = out6 ^ in0;</div><div class='add'>+        out0 = tmp1 ^ out7;</div><div class='add'>+        out1 = tmp0 ^ out7;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_2D(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0, tmp1, tmp2, tmp3;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        tmp0 = in2 ^ in3;</div><div class='add'>+        out4 = tmp0 ^ in1;</div><div class='add'>+        tmp1 = tmp0 ^ in0;</div><div class='add'>+        out2 = tmp1 ^ in6;</div><div class='add'>+        out5 = tmp1 ^ in4;</div><div class='add'>+        tmp2 = out2 ^ in2;</div><div class='add'>+        tmp3 = tmp2 ^ in5;</div><div class='add'>+        out0 = tmp3 ^ in7;</div><div class='add'>+        out7 = tmp3 ^ out5;</div><div class='add'>+        out6 = out4 ^ out7 ^ in6;</div><div class='add'>+        out3 = tmp2 ^ out6;</div><div class='add'>+        out1 = out0 ^ out6 ^ in0;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_2E(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0, tmp1, tmp2;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        tmp0 = in4 ^ in7;</div><div class='add'>+        out0 = in3 ^ in5 ^ in6;</div><div class='add'>+        tmp1 = tmp0 ^ in0;</div><div class='add'>+        tmp2 = tmp0 ^ in2;</div><div class='add'>+        out1 = tmp1 ^ in6;</div><div class='add'>+        out4 = tmp2 ^ in1;</div><div class='add'>+        out7 = tmp2 ^ in5;</div><div class='add'>+        out3 = out0 ^ out4 ^ in0;</div><div class='add'>+        out2 = out3 ^ out7 ^ in7;</div><div class='add'>+        out6 = tmp1 ^ out2;</div><div class='add'>+        out5 = tmp1 ^ out7 ^ in3;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_2F(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0, tmp1, tmp2;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        tmp0 = in0 ^ in3;</div><div class='add'>+        tmp1 = in2 ^ in5;</div><div class='add'>+        out4 = in1 ^ in2 ^ in7;</div><div class='add'>+        out6 = in1 ^ in3 ^ in4;</div><div class='add'>+        out5 = tmp0 ^ in2;</div><div class='add'>+        tmp2 = tmp0 ^ in6;</div><div class='add'>+        out7 = tmp1 ^ in4;</div><div class='add'>+        out0 = tmp2 ^ in5;</div><div class='add'>+        out2 = tmp2 ^ out4;</div><div class='add'>+        out1 = tmp2 ^ out6 ^ in7;</div><div class='add'>+        out3 = tmp1 ^ out1;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_30(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0, tmp1;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        out1 = in4 ^ in5;</div><div class='add'>+        tmp0 = in3 ^ in6;</div><div class='add'>+        tmp1 = in4 ^ in7;</div><div class='add'>+        out6 = in1 ^ in2 ^ in5;</div><div class='add'>+        out3 = tmp0 ^ in5;</div><div class='add'>+        out4 = tmp0 ^ in0;</div><div class='add'>+        out7 = tmp0 ^ in2;</div><div class='add'>+        out0 = tmp1 ^ in3;</div><div class='add'>+        out2 = tmp1 ^ out3;</div><div class='add'>+        out5 = tmp1 ^ in0 ^ in1;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_31(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0, tmp1, tmp2;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        out3 = in5 ^ in6;</div><div class='add'>+        tmp0 = in4 ^ in5;</div><div class='add'>+        tmp1 = in0 ^ in3 ^ in4;</div><div class='add'>+        tmp2 = out3 ^ in2;</div><div class='add'>+        out1 = tmp0 ^ in1;</div><div class='add'>+        out0 = tmp1 ^ in7;</div><div class='add'>+        out4 = tmp1 ^ in6;</div><div class='add'>+        out6 = tmp2 ^ in1;</div><div class='add'>+        out2 = tmp2 ^ out0 ^ in0;</div><div class='add'>+        out5 = out1 ^ in0 ^ in7;</div><div class='add'>+        out7 = tmp0 ^ out2;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_32(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0, tmp1;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        out0 = in3 ^ in4;</div><div class='add'>+        out7 = in2 ^ in3;</div><div class='add'>+        tmp0 = in5 ^ in6;</div><div class='add'>+        tmp1 = in0 ^ in7;</div><div class='add'>+        out6 = in1 ^ in2;</div><div class='add'>+        out1 = in0 ^ in4 ^ in5;</div><div class='add'>+        out2 = tmp0 ^ out0 ^ in1;</div><div class='add'>+        out3 = tmp0 ^ out7 ^ in7;</div><div class='add'>+        out4 = tmp1 ^ in6;</div><div class='add'>+        out5 = tmp1 ^ in1;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_33(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0, tmp1, tmp2, tmp3, tmp4;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        tmp0 = in2 ^ in3;</div><div class='add'>+        tmp1 = in0 ^ in4;</div><div class='add'>+        tmp2 = in1 ^ in5;</div><div class='add'>+        out6 = in1 ^ in2 ^ in6;</div><div class='add'>+        out7 = tmp0 ^ in7;</div><div class='add'>+        out0 = tmp1 ^ in3;</div><div class='add'>+        out1 = tmp1 ^ tmp2;</div><div class='add'>+        tmp3 = tmp2 ^ in7;</div><div class='add'>+        tmp4 = tmp2 ^ in4 ^ in6;</div><div class='add'>+        out5 = tmp3 ^ in0;</div><div class='add'>+        out3 = tmp3 ^ out6;</div><div class='add'>+        out4 = tmp4 ^ out5;</div><div class='add'>+        out2 = tmp0 ^ tmp4;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_34(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0, tmp1, tmp2, tmp3, tmp4;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        tmp0 = in3 ^ in4;</div><div class='add'>+        tmp1 = in4 ^ in5;</div><div class='add'>+        tmp2 = tmp0 ^ in1;</div><div class='add'>+        tmp3 = tmp0 ^ in6;</div><div class='add'>+        out1 = tmp1 ^ in7;</div><div class='add'>+        tmp4 = tmp1 ^ in2;</div><div class='add'>+        out5 = tmp2 ^ in0;</div><div class='add'>+        out3 = tmp2 ^ out1;</div><div class='add'>+        out0 = tmp3 ^ in7;</div><div class='add'>+        out7 = tmp3 ^ tmp4;</div><div class='add'>+        out6 = tmp4 ^ in1;</div><div class='add'>+        out2 = out3 ^ out5 ^ in3;</div><div class='add'>+        out4 = tmp4 ^ out2;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_35(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0, tmp1, tmp2;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        tmp0 = in2 ^ in6;</div><div class='add'>+        tmp1 = in5 ^ in7;</div><div class='add'>+        out7 = tmp0 ^ tmp1 ^ in3;</div><div class='add'>+        out3 = tmp1 ^ in1;</div><div class='add'>+        out1 = out3 ^ in4;</div><div class='add'>+        tmp2 = out1 ^ in7;</div><div class='add'>+        out5 = tmp2 ^ in0 ^ in3;</div><div class='add'>+        out6 = tmp0 ^ tmp2;</div><div class='add'>+        out0 = out3 ^ out5 ^ in6;</div><div class='add'>+        out4 = tmp0 ^ out0;</div><div class='add'>+        out2 = out4 ^ in5;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_36(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0, tmp1;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        out4 = in0 ^ in2;</div><div class='add'>+        tmp0 = in1 ^ in3;</div><div class='add'>+        out0 = in3 ^ in4 ^ in6;</div><div class='add'>+        out6 = in1 ^ in2 ^ in4;</div><div class='add'>+        out5 = tmp0 ^ in0;</div><div class='add'>+        tmp1 = out5 ^ in5;</div><div class='add'>+        out2 = tmp1 ^ in4;</div><div class='add'>+        out3 = tmp1 ^ out4;</div><div class='add'>+        out1 = tmp0 ^ out2 ^ in7;</div><div class='add'>+        out7 = out3 ^ in1;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_37(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0, tmp1, tmp2, tmp3;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        tmp0 = in1 ^ in2;</div><div class='add'>+        tmp1 = in2 ^ in4;</div><div class='add'>+        tmp2 = tmp0 ^ in6;</div><div class='add'>+        out3 = tmp0 ^ in5;</div><div class='add'>+        out4 = tmp1 ^ in0;</div><div class='add'>+        out6 = tmp2 ^ in4;</div><div class='add'>+        out1 = out3 ^ out4 ^ in7;</div><div class='add'>+        tmp3 = out4 ^ in1 ^ in3;</div><div class='add'>+        out7 = tmp3 ^ out1;</div><div class='add'>+        out2 = tmp3 ^ in5;</div><div class='add'>+        out5 = tmp1 ^ out2;</div><div class='add'>+        out0 = tmp2 ^ tmp3;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_38(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0, tmp1, tmp2;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        out3 = in0 ^ in3;</div><div class='add'>+        tmp0 = in3 ^ in4;</div><div class='add'>+        tmp1 = in5 ^ in7;</div><div class='add'>+        tmp2 = out3 ^ in1;</div><div class='add'>+        out2 = tmp0 ^ in6;</div><div class='add'>+        out0 = tmp0 ^ tmp1;</div><div class='add'>+        out4 = tmp1 ^ tmp2;</div><div class='add'>+        out7 = out2 ^ in2;</div><div class='add'>+        out1 = out2 ^ in3 ^ in5;</div><div class='add'>+        out6 = out4 ^ in0 ^ in2;</div><div class='add'>+        out5 = tmp2 ^ out7;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_39(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0, tmp1, tmp2;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        out3 = in0;</div><div class='add'>+        tmp0 = in1 ^ in5;</div><div class='add'>+        tmp1 = tmp0 ^ in4;</div><div class='add'>+        out1 = tmp1 ^ in6;</div><div class='add'>+        out5 = out1 ^ in0 ^ in2;</div><div class='add'>+        tmp2 = tmp0 ^ out5;</div><div class='add'>+        out2 = tmp2 ^ in0 ^ in3;</div><div class='add'>+        out7 = out2 ^ in7;</div><div class='add'>+        out6 = tmp1 ^ out7;</div><div class='add'>+        out4 = tmp2 ^ out6;</div><div class='add'>+        out0 = out4 ^ in1;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_3A(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0, tmp1, tmp2, tmp3, tmp4, tmp5;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        tmp0 = in0 ^ in1;</div><div class='add'>+        tmp1 = in0 ^ in2;</div><div class='add'>+        tmp2 = in3 ^ in4;</div><div class='add'>+        tmp3 = in1 ^ in6;</div><div class='add'>+        tmp4 = in3 ^ in7;</div><div class='add'>+        out4 = tmp0 ^ in5;</div><div class='add'>+        out5 = tmp1 ^ tmp3;</div><div class='add'>+        out3 = tmp1 ^ tmp4;</div><div class='add'>+        out0 = tmp2 ^ in5;</div><div class='add'>+        out7 = tmp2 ^ in2;</div><div class='add'>+        tmp5 = tmp3 ^ in4;</div><div class='add'>+        out2 = tmp4 ^ tmp5;</div><div class='add'>+        out1 = tmp5 ^ out4;</div><div class='add'>+        out6 = tmp0 ^ out3;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_3B(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0, tmp1, tmp2;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        tmp0 = in1 ^ in6;</div><div class='add'>+        tmp1 = in2 ^ in7;</div><div class='add'>+        tmp2 = tmp0 ^ in3;</div><div class='add'>+        out3 = tmp1 ^ in0;</div><div class='add'>+        out6 = tmp1 ^ tmp2;</div><div class='add'>+        out2 = out6 ^ in4;</div><div class='add'>+        out7 = tmp0 ^ out2;</div><div class='add'>+        out0 = out3 ^ out7 ^ in5;</div><div class='add'>+        out5 = out0 ^ out2 ^ in7;</div><div class='add'>+        out1 = tmp2 ^ out0;</div><div class='add'>+        out4 = out1 ^ in6;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_3C(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0, tmp1, tmp2;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        tmp0 = in0 ^ in3;</div><div class='add'>+        tmp1 = in2 ^ in7;</div><div class='add'>+        tmp2 = in1 ^ in6 ^ in7;</div><div class='add'>+        out2 = tmp0 ^ in4;</div><div class='add'>+        out3 = tmp0 ^ tmp2;</div><div class='add'>+        out4 = tmp1 ^ out3 ^ in5;</div><div class='add'>+        out5 = tmp2 ^ out2 ^ in2;</div><div class='add'>+        out1 = out4 ^ out5 ^ in6;</div><div class='add'>+        out0 = out1 ^ in3;</div><div class='add'>+        out7 = tmp1 ^ out0;</div><div class='add'>+        out6 = tmp2 ^ out7;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_3D(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0, tmp1, tmp2;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        tmp0 = in0 ^ in2;</div><div class='add'>+        tmp1 = tmp0 ^ in3;</div><div class='add'>+        out2 = tmp1 ^ in4;</div><div class='add'>+        tmp2 = out2 ^ in5;</div><div class='add'>+        out4 = tmp2 ^ in1 ^ in6;</div><div class='add'>+        out5 = out4 ^ in7;</div><div class='add'>+        out6 = out5 ^ in0;</div><div class='add'>+        out7 = out6 ^ in1;</div><div class='add'>+        out0 = tmp0 ^ out7;</div><div class='add'>+        out1 = tmp1 ^ out5;</div><div class='add'>+        out3 = tmp2 ^ out6;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_3E(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0, tmp1;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        tmp0 = in3 ^ in5;</div><div class='add'>+        tmp1 = tmp0 ^ in4;</div><div class='add'>+        out0 = tmp1 ^ in6;</div><div class='add'>+        out7 = tmp1 ^ in2;</div><div class='add'>+        out6 = out7 ^ in1 ^ in5 ^ in7;</div><div class='add'>+        out2 = out6 ^ in0 ^ in2;</div><div class='add'>+        out4 = out0 ^ out6 ^ in0;</div><div class='add'>+        out5 = tmp0 ^ out4;</div><div class='add'>+        out3 = out5 ^ in7;</div><div class='add'>+        out1 = out3 ^ out6 ^ in5;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_3F(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0, tmp1, tmp2;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        tmp0 = in0 ^ in1;</div><div class='add'>+        out3 = tmp0 ^ in2 ^ in6;</div><div class='add'>+        tmp1 = out3 ^ in5 ^ in7;</div><div class='add'>+        out4 = tmp1 ^ in4;</div><div class='add'>+        out5 = tmp1 ^ in3;</div><div class='add'>+        out1 = out4 ^ in2;</div><div class='add'>+        out7 = out1 ^ out3 ^ in3;</div><div class='add'>+        out2 = tmp0 ^ out7 ^ in5;</div><div class='add'>+        tmp2 = out2 ^ in0;</div><div class='add'>+        out6 = tmp2 ^ in6;</div><div class='add'>+        out0 = tmp1 ^ tmp2;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_40(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0, tmp1;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        out1 = in3 ^ in7;</div><div class='add'>+        tmp0 = in3 ^ in4;</div><div class='add'>+        tmp1 = in6 ^ in7;</div><div class='add'>+        out4 = tmp0 ^ in2;</div><div class='add'>+        out5 = tmp0 ^ in5;</div><div class='add'>+        out0 = tmp1 ^ in2;</div><div class='add'>+        out7 = tmp1 ^ in1 ^ in5;</div><div class='add'>+        out2 = out0 ^ in4;</div><div class='add'>+        out3 = out2 ^ out5 ^ in7;</div><div class='add'>+        out6 = out3 ^ out4 ^ in0;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_41(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0, tmp1;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        out4 = in2 ^ in3;</div><div class='add'>+        tmp0 = in5 ^ in6;</div><div class='add'>+        tmp1 = in6 ^ in7;</div><div class='add'>+        out5 = in3 ^ in4;</div><div class='add'>+        out1 = in1 ^ in3 ^ in7;</div><div class='add'>+        out6 = in0 ^ in4 ^ in5;</div><div class='add'>+        out3 = tmp0 ^ in2;</div><div class='add'>+        out7 = tmp0 ^ in1;</div><div class='add'>+        out2 = tmp1 ^ in4;</div><div class='add'>+        out0 = tmp1 ^ in0 ^ in2;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_42(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        out0 = in2 ^ in6;</div><div class='add'>+        out5 = in3 ^ in5;</div><div class='add'>+        out1 = in0 ^ in3 ^ in7;</div><div class='add'>+        out7 = in1 ^ in5 ^ in7;</div><div class='add'>+        out4 = in2 ^ in4 ^ in7;</div><div class='add'>+        out6 = in0 ^ in4 ^ in6;</div><div class='add'>+        out2 = out0 ^ in1 ^ in4;</div><div class='add'>+        out3 = out5 ^ in6 ^ in7;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_43(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        out5 = in3;</div><div class='add'>+        out7 = in1 ^ in5;</div><div class='add'>+        out4 = in2 ^ in7;</div><div class='add'>+        out6 = in0 ^ in4;</div><div class='add'>+        out0 = in0 ^ in2 ^ in6;</div><div class='add'>+        out3 = in5 ^ in6 ^ in7;</div><div class='add'>+        out2 = in1 ^ in4 ^ in6;</div><div class='add'>+        out1 = in0 ^ in1 ^ in3 ^ in7;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_44(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        out1 = in3;</div><div class='add'>+        out0 = in2 ^ in7;</div><div class='add'>+        tmp0 = in4 ^ in7;</div><div class='add'>+        out7 = in1 ^ in6 ^ in7;</div><div class='add'>+        out6 = in0 ^ in5 ^ in6;</div><div class='add'>+        out4 = tmp0 ^ in3 ^ in6;</div><div class='add'>+        out3 = out0 ^ in1 ^ in3 ^ in5;</div><div class='add'>+        out2 = out0 ^ in0 ^ in4;</div><div class='add'>+        out5 = tmp0 ^ in5;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_45(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        out1 = in1 ^ in3;</div><div class='add'>+        out7 = in1 ^ in6;</div><div class='add'>+        out5 = in4 ^ in7;</div><div class='add'>+        out6 = in0 ^ in5;</div><div class='add'>+        out0 = in0 ^ in2 ^ in7;</div><div class='add'>+        out4 = in3 ^ in6 ^ in7;</div><div class='add'>+        out2 = out5 ^ in0;</div><div class='add'>+        out3 = out0 ^ out6 ^ in1;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_46(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        out0 = in2;</div><div class='add'>+        out1 = in0 ^ in3;</div><div class='add'>+        out7 = in1 ^ in7;</div><div class='add'>+        out4 = in4 ^ in6;</div><div class='add'>+        out5 = in5 ^ in7;</div><div class='add'>+        out6 = in0 ^ in6;</div><div class='add'>+        out3 = in1 ^ in3 ^ in5;</div><div class='add'>+        out2 = out4 ^ out6 ^ in1 ^ in2;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_47(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        out4 = in6;</div><div class='add'>+        out7 = in1;</div><div class='add'>+        out5 = in7;</div><div class='add'>+        out6 = in0;</div><div class='add'>+        tmp0 = in0 ^ in1;</div><div class='add'>+        out3 = in1 ^ in5;</div><div class='add'>+        out0 = in0 ^ in2;</div><div class='add'>+        out1 = tmp0 ^ in3;</div><div class='add'>+        out2 = tmp0 ^ in4;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_48(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0, tmp1;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        tmp0 = in2 ^ in3;</div><div class='add'>+        out1 = in3 ^ in6 ^ in7;</div><div class='add'>+        out3 = tmp0 ^ in0;</div><div class='add'>+        out0 = tmp0 ^ out1 ^ in5;</div><div class='add'>+        tmp1 = out0 ^ in4;</div><div class='add'>+        out2 = tmp1 ^ in7;</div><div class='add'>+        out5 = tmp1 ^ in3;</div><div class='add'>+        out4 = out5 ^ in1;</div><div class='add'>+        out7 = tmp0 ^ out4;</div><div class='add'>+        out6 = tmp1 ^ out3;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_49(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0, tmp1;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        out3 = in0 ^ in2;</div><div class='add'>+        tmp0 = in2 ^ in5;</div><div class='add'>+        out2 = in4 ^ in5 ^ in6;</div><div class='add'>+        tmp1 = tmp0 ^ out2 ^ in3;</div><div class='add'>+        out7 = out2 ^ in1;</div><div class='add'>+        out5 = tmp1 ^ in7;</div><div class='add'>+        out4 = out5 ^ out7 ^ in6;</div><div class='add'>+        out1 = tmp0 ^ out4;</div><div class='add'>+        out6 = out1 ^ out7 ^ in0;</div><div class='add'>+        out0 = tmp1 ^ out6;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_4A(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0, tmp1;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        tmp0 = in2 ^ in6;</div><div class='add'>+        tmp1 = in3 ^ in7;</div><div class='add'>+        out0 = tmp0 ^ in5;</div><div class='add'>+        out3 = tmp1 ^ in0;</div><div class='add'>+        out5 = tmp1 ^ out0;</div><div class='add'>+        out4 = out0 ^ in1 ^ in4;</div><div class='add'>+        out1 = out3 ^ in6;</div><div class='add'>+        out2 = out4 ^ in7;</div><div class='add'>+        out6 = out1 ^ in4;</div><div class='add'>+        out7 = tmp0 ^ out2;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_4B(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0, tmp1, tmp2, tmp3;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        out3 = in0 ^ in7;</div><div class='add'>+        tmp0 = in1 ^ in5;</div><div class='add'>+        tmp1 = in2 ^ in6;</div><div class='add'>+        tmp2 = out3 ^ in3;</div><div class='add'>+        out7 = tmp0 ^ in4;</div><div class='add'>+        out4 = tmp0 ^ tmp1;</div><div class='add'>+        tmp3 = tmp1 ^ in0;</div><div class='add'>+        out6 = tmp2 ^ in4;</div><div class='add'>+        out5 = tmp2 ^ tmp3;</div><div class='add'>+        out1 = tmp2 ^ in1 ^ in6;</div><div class='add'>+        out2 = out7 ^ in6 ^ in7;</div><div class='add'>+        out0 = tmp3 ^ in5;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_4C(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0, tmp1, tmp2;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        out1 = in3 ^ in6;</div><div class='add'>+        tmp0 = in2 ^ in5;</div><div class='add'>+        tmp1 = out1 ^ in5 ^ in7;</div><div class='add'>+        out0 = tmp0 ^ in7;</div><div class='add'>+        tmp2 = tmp0 ^ in4;</div><div class='add'>+        out6 = tmp1 ^ in0;</div><div class='add'>+        out2 = tmp2 ^ in0;</div><div class='add'>+        out5 = tmp2 ^ in6;</div><div class='add'>+        out3 = tmp0 ^ out6 ^ in1;</div><div class='add'>+        out7 = out0 ^ out5 ^ in1;</div><div class='add'>+        out4 = tmp1 ^ out7;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_4D(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0, tmp1, tmp2;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        tmp0 = in0 ^ in5;</div><div class='add'>+        tmp1 = in1 ^ in6;</div><div class='add'>+        out4 = in1 ^ in3 ^ in5;</div><div class='add'>+        tmp2 = tmp0 ^ in7;</div><div class='add'>+        out2 = tmp0 ^ in4;</div><div class='add'>+        out1 = tmp1 ^ in3;</div><div class='add'>+        out7 = tmp1 ^ in4;</div><div class='add'>+        out0 = tmp2 ^ in2;</div><div class='add'>+        out6 = tmp2 ^ in3;</div><div class='add'>+        out5 = out7 ^ in1 ^ in2;</div><div class='add'>+        out3 = tmp1 ^ out0 ^ in5;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_4E(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        out0 = in2 ^ in5;</div><div class='add'>+        out7 = in1 ^ in4 ^ in7;</div><div class='add'>+        out1 = in0 ^ in3 ^ in6;</div><div class='add'>+        out5 = out0 ^ in6;</div><div class='add'>+        out4 = out7 ^ in5;</div><div class='add'>+        out3 = out1 ^ in1;</div><div class='add'>+        out6 = out1 ^ in7;</div><div class='add'>+        out2 = out4 ^ in0 ^ in2;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_4F(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        out5 = in2 ^ in6;</div><div class='add'>+        out7 = in1 ^ in4;</div><div class='add'>+        out3 = in0 ^ in1 ^ in6;</div><div class='add'>+        out4 = in1 ^ in5 ^ in7;</div><div class='add'>+        out0 = in0 ^ in2 ^ in5;</div><div class='add'>+        out6 = in0 ^ in3 ^ in7;</div><div class='add'>+        out1 = out3 ^ in3;</div><div class='add'>+        out2 = out4 ^ in0 ^ in4;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_50(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0, tmp1, tmp2;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        out2 = in2 ^ in7;</div><div class='add'>+        tmp0 = in3 ^ in5;</div><div class='add'>+        out0 = out2 ^ in4 ^ in6;</div><div class='add'>+        out1 = tmp0 ^ in7;</div><div class='add'>+        tmp1 = tmp0 ^ in6;</div><div class='add'>+        out3 = out0 ^ in3;</div><div class='add'>+        out7 = tmp1 ^ in1;</div><div class='add'>+        tmp2 = tmp1 ^ in0;</div><div class='add'>+        out5 = out3 ^ in1 ^ in2;</div><div class='add'>+        out4 = tmp2 ^ in2;</div><div class='add'>+        out6 = tmp2 ^ out3;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_51(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        out2 = in7;</div><div class='add'>+        out3 = in2 ^ in4 ^ in6 ^ in7;</div><div class='add'>+        out0 = out3 ^ in0;</div><div class='add'>+        out6 = out0 ^ in5;</div><div class='add'>+        out4 = out6 ^ in3 ^ in7;</div><div class='add'>+        out1 = out0 ^ out4 ^ in1;</div><div class='add'>+        out7 = out1 ^ in6;</div><div class='add'>+        out5 = out7 ^ in4;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_52(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0, tmp1, tmp2, tmp3;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        out2 = in1 ^ in2;</div><div class='add'>+        tmp0 = in2 ^ in4;</div><div class='add'>+        tmp1 = in3 ^ in5;</div><div class='add'>+        tmp2 = in3 ^ in6;</div><div class='add'>+        tmp3 = in0 ^ in7;</div><div class='add'>+        out0 = tmp0 ^ in6;</div><div class='add'>+        out6 = tmp0 ^ tmp3;</div><div class='add'>+        out7 = tmp1 ^ in1;</div><div class='add'>+        out1 = tmp1 ^ tmp3;</div><div class='add'>+        out3 = tmp2 ^ in4;</div><div class='add'>+        out5 = tmp2 ^ in1 ^ in7;</div><div class='add'>+        out4 = tmp2 ^ out1 ^ in2;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_53(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        out2 = in1;</div><div class='add'>+        out3 = in4 ^ in6;</div><div class='add'>+        out0 = out3 ^ in0 ^ in2;</div><div class='add'>+        out6 = out0 ^ in7;</div><div class='add'>+        out4 = out6 ^ in5;</div><div class='add'>+        out7 = out0 ^ out4 ^ in1 ^ in3;</div><div class='add'>+        out1 = out7 ^ in0;</div><div class='add'>+        out5 = out7 ^ in6;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_54(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0, tmp1, tmp2, tmp3;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        out1 = in3 ^ in5;</div><div class='add'>+        tmp0 = in1 ^ in3;</div><div class='add'>+        tmp1 = in2 ^ in4;</div><div class='add'>+        tmp2 = in0 ^ in7;</div><div class='add'>+        out5 = in1 ^ in4 ^ in6;</div><div class='add'>+        out4 = tmp2 ^ out1;</div><div class='add'>+        out7 = tmp0 ^ in6;</div><div class='add'>+        out3 = tmp0 ^ tmp1;</div><div class='add'>+        out0 = tmp1 ^ in7;</div><div class='add'>+        tmp3 = tmp2 ^ in2;</div><div class='add'>+        out2 = tmp3 ^ in6;</div><div class='add'>+        out6 = tmp3 ^ in5;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_55(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0, tmp1, tmp2;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        tmp0 = in1 ^ in3;</div><div class='add'>+        tmp1 = in1 ^ in4;</div><div class='add'>+        tmp2 = in6 ^ in7;</div><div class='add'>+        out7 = tmp0 ^ tmp2;</div><div class='add'>+        out1 = tmp0 ^ in5;</div><div class='add'>+        out3 = tmp1 ^ in2;</div><div class='add'>+        out5 = tmp1 ^ in5 ^ in6;</div><div class='add'>+        out2 = tmp2 ^ in0;</div><div class='add'>+        out4 = out5 ^ out7 ^ in0;</div><div class='add'>+        out6 = out2 ^ in2 ^ in5;</div><div class='add'>+        out0 = out5 ^ out6 ^ in1;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_56(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        out0 = in2 ^ in4;</div><div class='add'>+        tmp0 = in0 ^ in2;</div><div class='add'>+        out4 = in0 ^ in5;</div><div class='add'>+        out7 = in1 ^ in3;</div><div class='add'>+        out5 = in1 ^ in6;</div><div class='add'>+        out6 = tmp0 ^ in7;</div><div class='add'>+        out2 = tmp0 ^ out5;</div><div class='add'>+        out1 = out4 ^ in3;</div><div class='add'>+        out3 = out7 ^ in4 ^ in7;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_57(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0, tmp1;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        tmp0 = in0 ^ in5;</div><div class='add'>+        tmp1 = in1 ^ in7;</div><div class='add'>+        out0 = in0 ^ in2 ^ in4;</div><div class='add'>+        out5 = in1 ^ in5 ^ in6;</div><div class='add'>+        out4 = tmp0 ^ in4;</div><div class='add'>+        out1 = tmp0 ^ in1 ^ in3;</div><div class='add'>+        out2 = tmp0 ^ out5;</div><div class='add'>+        out3 = tmp1 ^ in4;</div><div class='add'>+        out7 = tmp1 ^ in3;</div><div class='add'>+        out6 = tmp1 ^ out2 ^ in2;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_58(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0, tmp1;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        out2 = in2 ^ in5;</div><div class='add'>+        tmp0 = in2 ^ in3 ^ in4;</div><div class='add'>+        out5 = tmp0 ^ in1;</div><div class='add'>+        out6 = tmp0 ^ in0 ^ in5;</div><div class='add'>+        out3 = out6 ^ in7;</div><div class='add'>+        tmp1 = out2 ^ out5;</div><div class='add'>+        out7 = tmp1 ^ in6;</div><div class='add'>+        out4 = tmp1 ^ out3 ^ in3;</div><div class='add'>+        out0 = out4 ^ out7 ^ in0;</div><div class='add'>+        out1 = tmp0 ^ out0;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_59(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0, tmp1;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        out2 = in5;</div><div class='add'>+        tmp0 = in0 ^ in5 ^ in7;</div><div class='add'>+        out3 = tmp0 ^ in2 ^ in4;</div><div class='add'>+        out0 = out3 ^ in6;</div><div class='add'>+        tmp1 = out0 ^ in7;</div><div class='add'>+        out6 = tmp1 ^ in3;</div><div class='add'>+        out5 = out6 ^ in0 ^ in1 ^ in6;</div><div class='add'>+        out4 = tmp0 ^ out5;</div><div class='add'>+        out1 = tmp1 ^ out4;</div><div class='add'>+        out7 = out1 ^ in4;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_5A(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0, tmp1, tmp2;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        tmp0 = in1 ^ in2;</div><div class='add'>+        tmp1 = in2 ^ in5;</div><div class='add'>+        out5 = tmp0 ^ in3;</div><div class='add'>+        out4 = tmp0 ^ in0;</div><div class='add'>+        tmp2 = tmp1 ^ in4;</div><div class='add'>+        out2 = tmp1 ^ in1 ^ in7;</div><div class='add'>+        out7 = tmp2 ^ out5;</div><div class='add'>+        out6 = out4 ^ out7 ^ in5;</div><div class='add'>+        out0 = tmp2 ^ in6;</div><div class='add'>+        out1 = out0 ^ out6 ^ in7;</div><div class='add'>+        out3 = tmp1 ^ out6;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_5B(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0, tmp1, tmp2, tmp3, tmp4;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        tmp0 = in2 ^ in3;</div><div class='add'>+        tmp1 = in0 ^ in4;</div><div class='add'>+        tmp2 = in1 ^ in5;</div><div class='add'>+        out5 = tmp0 ^ tmp2;</div><div class='add'>+        tmp3 = tmp1 ^ in6;</div><div class='add'>+        out3 = tmp1 ^ in5;</div><div class='add'>+        out2 = tmp2 ^ in7;</div><div class='add'>+        tmp4 = out3 ^ in2;</div><div class='add'>+        out7 = out2 ^ in3 ^ in4;</div><div class='add'>+        out0 = tmp4 ^ in6;</div><div class='add'>+        out6 = tmp0 ^ tmp3;</div><div class='add'>+        out4 = tmp2 ^ tmp4;</div><div class='add'>+        out1 = tmp3 ^ out7;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_5C(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0, tmp1, tmp2;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        tmp0 = in3 ^ in6;</div><div class='add'>+        tmp1 = in0 ^ in2 ^ in5;</div><div class='add'>+        out1 = tmp0 ^ in5;</div><div class='add'>+        tmp2 = tmp0 ^ in1;</div><div class='add'>+        out2 = tmp1 ^ in6;</div><div class='add'>+        out6 = tmp1 ^ in3;</div><div class='add'>+        out4 = tmp2 ^ in0;</div><div class='add'>+        out7 = tmp2 ^ in4;</div><div class='add'>+        out3 = tmp1 ^ out7;</div><div class='add'>+        out0 = out3 ^ out4 ^ in7;</div><div class='add'>+        out5 = out0 ^ in1 ^ in5;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_5D(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0, tmp1, tmp2, tmp3, tmp4;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        tmp0 = in0 ^ in1;</div><div class='add'>+        tmp1 = in0 ^ in6;</div><div class='add'>+        out2 = tmp1 ^ in5;</div><div class='add'>+        tmp2 = out2 ^ in3;</div><div class='add'>+        out6 = tmp2 ^ in2;</div><div class='add'>+        out1 = tmp0 ^ tmp2;</div><div class='add'>+        tmp3 = out1 ^ in4 ^ in5;</div><div class='add'>+        out4 = tmp3 ^ in0;</div><div class='add'>+        out7 = tmp3 ^ in7;</div><div class='add'>+        tmp4 = out4 ^ out6;</div><div class='add'>+        out5 = tmp4 ^ in7;</div><div class='add'>+        out0 = tmp0 ^ out5;</div><div class='add'>+        out3 = tmp1 ^ tmp4;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_5E(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0, tmp1, tmp2, tmp3, tmp4;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        tmp0 = in2 ^ in5;</div><div class='add'>+        tmp1 = in3 ^ in5;</div><div class='add'>+        tmp2 = in1 ^ in7;</div><div class='add'>+        out7 = in1 ^ in3 ^ in4;</div><div class='add'>+        out0 = tmp0 ^ in4;</div><div class='add'>+        tmp3 = tmp1 ^ in0;</div><div class='add'>+        out5 = tmp2 ^ in2;</div><div class='add'>+        out1 = tmp3 ^ in6;</div><div class='add'>+        out6 = tmp0 ^ tmp3;</div><div class='add'>+        tmp4 = tmp2 ^ out1;</div><div class='add'>+        out3 = tmp4 ^ in4;</div><div class='add'>+        out4 = tmp1 ^ tmp4;</div><div class='add'>+        out2 = tmp0 ^ out4;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_5F(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0, tmp1, tmp2, tmp3;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        tmp0 = in1 ^ in5;</div><div class='add'>+        tmp1 = in0 ^ in6;</div><div class='add'>+        tmp2 = tmp0 ^ in7;</div><div class='add'>+        tmp3 = tmp1 ^ in3;</div><div class='add'>+        out2 = tmp1 ^ tmp2;</div><div class='add'>+        out5 = tmp2 ^ in2;</div><div class='add'>+        out6 = tmp3 ^ in2;</div><div class='add'>+        out3 = out2 ^ in4;</div><div class='add'>+        out4 = out3 ^ in5;</div><div class='add'>+        out1 = tmp0 ^ tmp3;</div><div class='add'>+        out7 = tmp3 ^ out4;</div><div class='add'>+        out0 = out4 ^ out5 ^ in6;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_60(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0, tmp1;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        out4 = in2 ^ in5;</div><div class='add'>+        tmp0 = in3 ^ in6;</div><div class='add'>+        out1 = in3 ^ in4 ^ in7;</div><div class='add'>+        out7 = out4 ^ in1;</div><div class='add'>+        tmp1 = out4 ^ in4;</div><div class='add'>+        out0 = tmp0 ^ in2;</div><div class='add'>+        out5 = tmp0 ^ in0;</div><div class='add'>+        out2 = tmp0 ^ tmp1;</div><div class='add'>+        out3 = tmp1 ^ in7;</div><div class='add'>+        out6 = out3 ^ out7 ^ in0;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_61(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0, tmp1;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        tmp0 = in2 ^ in5;</div><div class='add'>+        out4 = tmp0 ^ in4;</div><div class='add'>+        tmp1 = out4 ^ in3;</div><div class='add'>+        out3 = tmp1 ^ in7;</div><div class='add'>+        out2 = tmp1 ^ in2 ^ in6;</div><div class='add'>+        out1 = tmp0 ^ out3 ^ in1;</div><div class='add'>+        out0 = out2 ^ out4 ^ in0;</div><div class='add'>+        out7 = tmp1 ^ out1;</div><div class='add'>+        out6 = out0 ^ out1 ^ in2;</div><div class='add'>+        out5 = tmp0 ^ out0;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_62(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0, tmp1, tmp2, tmp3;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        out3 = in4 ^ in5;</div><div class='add'>+        tmp0 = in0 ^ in3 ^ in4;</div><div class='add'>+        out1 = tmp0 ^ in7;</div><div class='add'>+        out5 = tmp0 ^ in6;</div><div class='add'>+        tmp1 = out1 ^ in0;</div><div class='add'>+        tmp2 = tmp1 ^ out3;</div><div class='add'>+        out4 = tmp2 ^ in2;</div><div class='add'>+        tmp3 = tmp2 ^ in1;</div><div class='add'>+        out0 = out4 ^ in5 ^ in6;</div><div class='add'>+        out7 = tmp3 ^ out0;</div><div class='add'>+        out6 = tmp0 ^ tmp3;</div><div class='add'>+        out2 = tmp1 ^ out7;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_63(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0, tmp1, tmp2, tmp3, tmp4;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        tmp0 = in3 ^ in4;</div><div class='add'>+        tmp1 = in1 ^ in7;</div><div class='add'>+        out3 = tmp0 ^ in5;</div><div class='add'>+        tmp2 = out3 ^ in6;</div><div class='add'>+        out4 = out3 ^ in2 ^ in7;</div><div class='add'>+        out5 = tmp2 ^ in0;</div><div class='add'>+        tmp3 = out5 ^ in3;</div><div class='add'>+        out0 = tmp3 ^ out4;</div><div class='add'>+        out2 = tmp1 ^ tmp2;</div><div class='add'>+        out6 = tmp1 ^ tmp3;</div><div class='add'>+        tmp4 = tmp0 ^ out2;</div><div class='add'>+        out1 = tmp4 ^ out5;</div><div class='add'>+        out7 = tmp4 ^ in2;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_64(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0, tmp1;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        out0 = in2 ^ in3;</div><div class='add'>+        out1 = in3 ^ in4;</div><div class='add'>+        out7 = in1 ^ in2;</div><div class='add'>+        tmp0 = in4 ^ in5;</div><div class='add'>+        tmp1 = in0 ^ in7;</div><div class='add'>+        out4 = in5 ^ in6 ^ in7;</div><div class='add'>+        out2 = tmp0 ^ out0 ^ in0;</div><div class='add'>+        out3 = tmp0 ^ out7 ^ in6;</div><div class='add'>+        out5 = tmp1 ^ in6;</div><div class='add'>+        out6 = tmp1 ^ in1;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_65(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0, tmp1, tmp2, tmp3;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        tmp0 = in0 ^ in3;</div><div class='add'>+        tmp1 = in4 ^ in5;</div><div class='add'>+        tmp2 = in6 ^ in7;</div><div class='add'>+        out7 = in1 ^ in2 ^ in7;</div><div class='add'>+        out1 = in1 ^ in3 ^ in4;</div><div class='add'>+        out0 = tmp0 ^ in2;</div><div class='add'>+        out2 = tmp0 ^ tmp1;</div><div class='add'>+        out4 = tmp1 ^ tmp2;</div><div class='add'>+        tmp3 = tmp2 ^ in0;</div><div class='add'>+        out3 = out4 ^ out7 ^ in3;</div><div class='add'>+        out5 = tmp3 ^ in5;</div><div class='add'>+        out6 = tmp3 ^ in1;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_66(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0, tmp1, tmp2, tmp3, tmp4;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        tmp0 = in1 ^ in2;</div><div class='add'>+        tmp1 = in2 ^ in3;</div><div class='add'>+        tmp2 = in0 ^ in4;</div><div class='add'>+        out7 = tmp0 ^ in6;</div><div class='add'>+        out0 = tmp1 ^ in7;</div><div class='add'>+        out1 = tmp2 ^ in3;</div><div class='add'>+        tmp3 = tmp2 ^ in6;</div><div class='add'>+        tmp4 = out1 ^ in5;</div><div class='add'>+        out5 = tmp3 ^ in7;</div><div class='add'>+        out4 = tmp3 ^ tmp4;</div><div class='add'>+        out2 = tmp0 ^ tmp4 ^ in7;</div><div class='add'>+        out6 = tmp1 ^ out2 ^ in4;</div><div class='add'>+        out3 = tmp3 ^ out6;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_67(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0, tmp1, tmp2, tmp3;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        tmp0 = in0 ^ in3;</div><div class='add'>+        tmp1 = tmp0 ^ in1;</div><div class='add'>+        tmp2 = tmp0 ^ in7;</div><div class='add'>+        out1 = tmp1 ^ in4;</div><div class='add'>+        out0 = tmp2 ^ in2;</div><div class='add'>+        tmp3 = out1 ^ in7;</div><div class='add'>+        out2 = tmp3 ^ in5;</div><div class='add'>+        out3 = out2 ^ in0 ^ in6;</div><div class='add'>+        out7 = tmp1 ^ out0 ^ in6;</div><div class='add'>+        out5 = tmp1 ^ out3;</div><div class='add'>+        out4 = tmp2 ^ out5;</div><div class='add'>+        out6 = tmp3 ^ out4;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_68(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0, tmp1, tmp2, tmp3;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        tmp0 = in3 ^ in4;</div><div class='add'>+        tmp1 = in2 ^ in3 ^ in5;</div><div class='add'>+        tmp2 = tmp0 ^ in1;</div><div class='add'>+        tmp3 = tmp0 ^ in6;</div><div class='add'>+        out0 = tmp1 ^ in6;</div><div class='add'>+        out6 = tmp2 ^ in0;</div><div class='add'>+        out7 = tmp1 ^ tmp2;</div><div class='add'>+        out1 = tmp3 ^ in7;</div><div class='add'>+        out2 = out1 ^ in2;</div><div class='add'>+        out4 = tmp2 ^ out2;</div><div class='add'>+        out3 = out4 ^ out6 ^ in3;</div><div class='add'>+        out5 = tmp3 ^ out3;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_69(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        tmp0 = in6 ^ in7;</div><div class='add'>+        out2 = tmp0 ^ in3 ^ in4;</div><div class='add'>+        out1 = out2 ^ in1;</div><div class='add'>+        out3 = out2 ^ in0 ^ in2;</div><div class='add'>+        out4 = out1 ^ in2 ^ in3;</div><div class='add'>+        out6 = out1 ^ in0 ^ in7;</div><div class='add'>+        out7 = out4 ^ in5 ^ in6;</div><div class='add'>+        out5 = out4 ^ out6 ^ in5;</div><div class='add'>+        out0 = tmp0 ^ out5;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_6A(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0, tmp1, tmp2;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        tmp0 = in2 ^ in6;</div><div class='add'>+        out3 = in0 ^ in4 ^ in6;</div><div class='add'>+        tmp1 = tmp0 ^ in3;</div><div class='add'>+        out4 = tmp1 ^ in1;</div><div class='add'>+        tmp2 = tmp1 ^ in7;</div><div class='add'>+        out2 = out4 ^ in4;</div><div class='add'>+        out0 = tmp2 ^ in5;</div><div class='add'>+        out5 = tmp2 ^ out3;</div><div class='add'>+        out7 = out2 ^ in3 ^ in5;</div><div class='add'>+        out1 = tmp0 ^ out5;</div><div class='add'>+        out6 = tmp1 ^ out7 ^ in0;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_6B(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0, tmp1;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        tmp0 = in4 ^ in6;</div><div class='add'>+        out2 = tmp0 ^ in1 ^ in3;</div><div class='add'>+        out4 = out2 ^ in2;</div><div class='add'>+        tmp1 = out2 ^ in0;</div><div class='add'>+        out7 = out4 ^ in3 ^ in5 ^ in7;</div><div class='add'>+        out1 = tmp1 ^ in7;</div><div class='add'>+        out3 = tmp1 ^ in1;</div><div class='add'>+        out6 = tmp1 ^ in5;</div><div class='add'>+        out0 = tmp1 ^ out7 ^ in6;</div><div class='add'>+        out5 = tmp0 ^ out0;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_6C(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0, tmp1;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        out4 = in1;</div><div class='add'>+        tmp0 = in2 ^ in3;</div><div class='add'>+        out5 = in0 ^ in2;</div><div class='add'>+        out1 = in3 ^ in4 ^ in6;</div><div class='add'>+        tmp1 = out5 ^ in1;</div><div class='add'>+        out0 = tmp0 ^ in5;</div><div class='add'>+        out6 = tmp0 ^ tmp1;</div><div class='add'>+        out3 = tmp1 ^ in4;</div><div class='add'>+        out7 = out3 ^ in0;</div><div class='add'>+        out2 = out6 ^ out7 ^ in7;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_6D(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0, tmp1;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        out4 = in1 ^ in4;</div><div class='add'>+        tmp0 = in0 ^ in2;</div><div class='add'>+        tmp1 = out4 ^ in3;</div><div class='add'>+        out7 = out4 ^ in2 ^ in7;</div><div class='add'>+        out5 = tmp0 ^ in5;</div><div class='add'>+        out3 = tmp0 ^ tmp1;</div><div class='add'>+        out1 = tmp1 ^ in6;</div><div class='add'>+        out0 = out5 ^ in3;</div><div class='add'>+        out2 = out3 ^ out7 ^ in4;</div><div class='add'>+        out6 = out1 ^ in0 ^ in4;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_6E(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0, tmp1, tmp2;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        tmp0 = in1 ^ in3;</div><div class='add'>+        tmp1 = in0 ^ in4;</div><div class='add'>+        out4 = tmp0 ^ in7;</div><div class='add'>+        out6 = tmp0 ^ in0 ^ in5;</div><div class='add'>+        out5 = tmp1 ^ in2;</div><div class='add'>+        tmp2 = tmp1 ^ in3;</div><div class='add'>+        out3 = tmp2 ^ out4;</div><div class='add'>+        out1 = tmp2 ^ in6;</div><div class='add'>+        out2 = tmp0 ^ out5;</div><div class='add'>+        out0 = out2 ^ out3 ^ in5;</div><div class='add'>+        out7 = out1 ^ out2 ^ in4;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_6F(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0, tmp1, tmp2;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        tmp0 = in3 ^ in7;</div><div class='add'>+        tmp1 = tmp0 ^ in4;</div><div class='add'>+        tmp2 = tmp0 ^ in0 ^ in2;</div><div class='add'>+        out4 = tmp1 ^ in1;</div><div class='add'>+        out0 = tmp2 ^ in5;</div><div class='add'>+        out3 = out4 ^ in0;</div><div class='add'>+        out2 = out3 ^ in7;</div><div class='add'>+        out1 = out2 ^ in6;</div><div class='add'>+        out6 = out1 ^ in4 ^ in5;</div><div class='add'>+        out7 = tmp2 ^ out1;</div><div class='add'>+        out5 = tmp1 ^ out0;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_70(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0, tmp1, tmp2;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        out3 = in2;</div><div class='add'>+        tmp0 = in2 ^ in4;</div><div class='add'>+        out2 = in2 ^ in3 ^ in5;</div><div class='add'>+        tmp1 = tmp0 ^ in6;</div><div class='add'>+        tmp2 = out2 ^ in7;</div><div class='add'>+        out0 = tmp1 ^ in3;</div><div class='add'>+        out4 = tmp1 ^ in0;</div><div class='add'>+        out7 = tmp2 ^ in1;</div><div class='add'>+        out6 = out4 ^ in1;</div><div class='add'>+        out5 = out7 ^ in0 ^ in2;</div><div class='add'>+        out1 = tmp0 ^ tmp2;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_71(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0, tmp1, tmp2;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        out2 = in3 ^ in5;</div><div class='add'>+        out3 = in2 ^ in3;</div><div class='add'>+        tmp0 = in0 ^ in2;</div><div class='add'>+        tmp1 = out2 ^ in1;</div><div class='add'>+        out4 = tmp0 ^ in6;</div><div class='add'>+        tmp2 = tmp0 ^ in1;</div><div class='add'>+        out7 = tmp1 ^ in2;</div><div class='add'>+        out1 = tmp1 ^ in4 ^ in7;</div><div class='add'>+        out0 = out4 ^ in3 ^ in4;</div><div class='add'>+        out6 = tmp2 ^ in4;</div><div class='add'>+        out5 = tmp2 ^ out3 ^ in7;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_72(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0, tmp1, tmp2;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        out3 = in7;</div><div class='add'>+        tmp0 = in0 ^ in4;</div><div class='add'>+        tmp1 = tmp0 ^ in3 ^ in7;</div><div class='add'>+        out1 = tmp1 ^ in5;</div><div class='add'>+        out5 = out1 ^ in1;</div><div class='add'>+        tmp2 = tmp0 ^ out5;</div><div class='add'>+        out2 = tmp2 ^ in2;</div><div class='add'>+        out7 = out2 ^ in6;</div><div class='add'>+        out6 = tmp1 ^ out7;</div><div class='add'>+        out4 = tmp2 ^ out6;</div><div class='add'>+        out0 = out4 ^ in0;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_73(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        out3 = in3 ^ in7;</div><div class='add'>+        out2 = out3 ^ in1 ^ in5;</div><div class='add'>+        out1 = out2 ^ in0 ^ in4;</div><div class='add'>+        out5 = out1 ^ in5;</div><div class='add'>+        out6 = out1 ^ out3 ^ in2;</div><div class='add'>+        out0 = out2 ^ out6 ^ in6;</div><div class='add'>+        out7 = out0 ^ out1 ^ in3;</div><div class='add'>+        out4 = out0 ^ in4;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_74(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0, tmp1;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        tmp0 = in3 ^ in4;</div><div class='add'>+        tmp1 = in1 ^ in2 ^ in6;</div><div class='add'>+        out4 = in0 ^ in4 ^ in7;</div><div class='add'>+        out5 = in0 ^ in1 ^ in5;</div><div class='add'>+        out0 = tmp0 ^ in2;</div><div class='add'>+        out1 = tmp0 ^ in5;</div><div class='add'>+        out3 = tmp1 ^ in7;</div><div class='add'>+        out6 = tmp1 ^ in0;</div><div class='add'>+        out2 = tmp1 ^ out5 ^ in3;</div><div class='add'>+        out7 = out3 ^ in3 ^ in6;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_75(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0, tmp1, tmp2;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        out4 = in0 ^ in7;</div><div class='add'>+        tmp0 = in1 ^ in3;</div><div class='add'>+        out5 = in0 ^ in1;</div><div class='add'>+        out7 = tmp0 ^ in2;</div><div class='add'>+        tmp1 = tmp0 ^ in4;</div><div class='add'>+        out6 = out5 ^ in2;</div><div class='add'>+        tmp2 = out7 ^ in6;</div><div class='add'>+        out1 = tmp1 ^ in5;</div><div class='add'>+        out0 = tmp1 ^ out6;</div><div class='add'>+        out3 = tmp2 ^ in7;</div><div class='add'>+        out2 = tmp2 ^ out6 ^ in5;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_76(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0, tmp1, tmp2, tmp3;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        out3 = in1 ^ in6;</div><div class='add'>+        tmp0 = in0 ^ in5;</div><div class='add'>+        tmp1 = in3 ^ in7;</div><div class='add'>+        tmp2 = tmp0 ^ in4;</div><div class='add'>+        tmp3 = tmp1 ^ in2;</div><div class='add'>+        out5 = tmp2 ^ in1;</div><div class='add'>+        out1 = tmp2 ^ in3;</div><div class='add'>+        out0 = tmp3 ^ in4;</div><div class='add'>+        out4 = out1 ^ in5;</div><div class='add'>+        out7 = tmp3 ^ out3;</div><div class='add'>+        out2 = tmp0 ^ out7;</div><div class='add'>+        out6 = tmp1 ^ out2;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_77(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0, tmp1, tmp2, tmp3;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        out4 = in0 ^ in3;</div><div class='add'>+        tmp0 = in1 ^ in4;</div><div class='add'>+        tmp1 = in1 ^ in6;</div><div class='add'>+        tmp2 = out4 ^ in5;</div><div class='add'>+        out5 = tmp0 ^ in0;</div><div class='add'>+        out1 = tmp0 ^ tmp2;</div><div class='add'>+        out3 = tmp1 ^ in3;</div><div class='add'>+        out2 = tmp1 ^ tmp2 ^ in7;</div><div class='add'>+        out7 = out3 ^ in2;</div><div class='add'>+        tmp3 = out7 ^ in6;</div><div class='add'>+        out6 = tmp2 ^ tmp3;</div><div class='add'>+        out0 = tmp3 ^ out5 ^ in7;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_78(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0, tmp1, tmp2;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        tmp0 = in0 ^ in3;</div><div class='add'>+        tmp1 = in2 ^ in7;</div><div class='add'>+        tmp2 = in0 ^ in5 ^ in6;</div><div class='add'>+        out2 = tmp1 ^ in3;</div><div class='add'>+        out3 = tmp2 ^ in2;</div><div class='add'>+        out5 = out3 ^ in1 ^ in3;</div><div class='add'>+        out0 = tmp0 ^ out3 ^ in4;</div><div class='add'>+        out1 = tmp1 ^ out0;</div><div class='add'>+        out4 = out1 ^ out5 ^ in5;</div><div class='add'>+        out7 = tmp0 ^ out4;</div><div class='add'>+        out6 = tmp2 ^ out7;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_79(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0, tmp1, tmp2, tmp3;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        out2 = in3 ^ in7;</div><div class='add'>+        tmp0 = in3 ^ in4;</div><div class='add'>+        tmp1 = in1 ^ in5;</div><div class='add'>+        tmp2 = tmp1 ^ in2;</div><div class='add'>+        out4 = tmp2 ^ in0 ^ in7;</div><div class='add'>+        tmp3 = out4 ^ in5;</div><div class='add'>+        out5 = tmp3 ^ out2 ^ in6;</div><div class='add'>+        out7 = tmp0 ^ tmp2;</div><div class='add'>+        out6 = tmp0 ^ tmp3;</div><div class='add'>+        out3 = tmp1 ^ out5;</div><div class='add'>+        out0 = out3 ^ in4;</div><div class='add'>+        out1 = tmp3 ^ out0;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_7A(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0, tmp1;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        tmp0 = in1 ^ in2;</div><div class='add'>+        out2 = tmp0 ^ in3;</div><div class='add'>+        tmp1 = out2 ^ in4;</div><div class='add'>+        out4 = tmp1 ^ in0 ^ in5;</div><div class='add'>+        out5 = out4 ^ in6;</div><div class='add'>+        out6 = out5 ^ in7;</div><div class='add'>+        out7 = out6 ^ in0;</div><div class='add'>+        out0 = out7 ^ in1;</div><div class='add'>+        out1 = tmp0 ^ out6;</div><div class='add'>+        out3 = tmp1 ^ out6;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_7B(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0, tmp1, tmp2;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        out2 = in1 ^ in3;</div><div class='add'>+        tmp0 = in0 ^ in5;</div><div class='add'>+        out4 = tmp0 ^ out2 ^ in2;</div><div class='add'>+        tmp1 = out4 ^ in4;</div><div class='add'>+        out6 = tmp1 ^ in7;</div><div class='add'>+        out5 = tmp1 ^ in5 ^ in6;</div><div class='add'>+        out0 = out6 ^ in1 ^ in6;</div><div class='add'>+        tmp2 = out0 ^ in2;</div><div class='add'>+        out1 = tmp2 ^ in1;</div><div class='add'>+        out3 = tmp2 ^ in4;</div><div class='add'>+        out7 = tmp0 ^ out5;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_7C(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0, tmp1;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        tmp0 = in3 ^ in5;</div><div class='add'>+        tmp1 = tmp0 ^ in4;</div><div class='add'>+        out0 = tmp1 ^ in2;</div><div class='add'>+        out1 = tmp1 ^ in6;</div><div class='add'>+        out7 = out0 ^ in1 ^ in5 ^ in7;</div><div class='add'>+        out5 = out1 ^ out7 ^ in0;</div><div class='add'>+        out3 = out5 ^ in6;</div><div class='add'>+        out6 = tmp0 ^ out5;</div><div class='add'>+        out2 = out6 ^ in1;</div><div class='add'>+        out4 = out2 ^ out7 ^ in5;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_7D(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0, tmp1, tmp2, tmp3;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        tmp0 = in1 ^ in2;</div><div class='add'>+        tmp1 = tmp0 ^ in3;</div><div class='add'>+        tmp2 = tmp0 ^ in6;</div><div class='add'>+        out7 = tmp1 ^ in4;</div><div class='add'>+        tmp3 = tmp2 ^ in0;</div><div class='add'>+        out5 = tmp3 ^ in7;</div><div class='add'>+        out4 = tmp3 ^ in2 ^ in5;</div><div class='add'>+        out2 = tmp1 ^ out5;</div><div class='add'>+        out6 = tmp2 ^ out2;</div><div class='add'>+        out0 = out4 ^ out7 ^ in6;</div><div class='add'>+        out1 = tmp3 ^ out0;</div><div class='add'>+        out3 = out6 ^ in5;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_7E(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0, tmp1, tmp2;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        tmp0 = in3 ^ in4;</div><div class='add'>+        tmp1 = in0 ^ in5;</div><div class='add'>+        out1 = tmp0 ^ tmp1 ^ in6;</div><div class='add'>+        out3 = tmp1 ^ in1;</div><div class='add'>+        out4 = out1 ^ in1 ^ in7;</div><div class='add'>+        tmp2 = out4 ^ in3;</div><div class='add'>+        out5 = tmp2 ^ in2;</div><div class='add'>+        out6 = tmp0 ^ out5;</div><div class='add'>+        out7 = tmp1 ^ out4 ^ in2;</div><div class='add'>+        out2 = out6 ^ in5 ^ in7;</div><div class='add'>+        out0 = tmp2 ^ out2;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_7F(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0, tmp1, tmp2, tmp3;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        tmp0 = in2 ^ in7;</div><div class='add'>+        tmp1 = tmp0 ^ in3 ^ in5;</div><div class='add'>+        tmp2 = tmp1 ^ in0;</div><div class='add'>+        out0 = tmp2 ^ in4;</div><div class='add'>+        out6 = tmp2 ^ in1;</div><div class='add'>+        out3 = tmp0 ^ out6;</div><div class='add'>+        tmp3 = out3 ^ in6;</div><div class='add'>+        out1 = tmp3 ^ in4;</div><div class='add'>+        out2 = tmp3 ^ in5;</div><div class='add'>+        out4 = tmp3 ^ in7;</div><div class='add'>+        out5 = tmp1 ^ out1;</div><div class='add'>+        out7 = out0 ^ out4 ^ in3;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_80(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0, tmp1, tmp2;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        tmp0 = in2 ^ in3;</div><div class='add'>+        tmp1 = in4 ^ in5;</div><div class='add'>+        out1 = in2 ^ in6 ^ in7;</div><div class='add'>+        out5 = tmp0 ^ in4;</div><div class='add'>+        tmp2 = tmp0 ^ in1;</div><div class='add'>+        out6 = tmp1 ^ in3;</div><div class='add'>+        out7 = tmp1 ^ in0 ^ in6;</div><div class='add'>+        out4 = tmp2 ^ in7;</div><div class='add'>+        out3 = tmp2 ^ out6;</div><div class='add'>+        out2 = out3 ^ out5 ^ in6;</div><div class='add'>+        out0 = out2 ^ in3 ^ in7;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_81(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0, tmp1;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        tmp0 = in4 ^ in6;</div><div class='add'>+        tmp1 = tmp0 ^ in3;</div><div class='add'>+        out6 = tmp1 ^ in5;</div><div class='add'>+        out5 = out6 ^ in2 ^ in6;</div><div class='add'>+        out3 = out5 ^ in1;</div><div class='add'>+        out2 = tmp0 ^ out3;</div><div class='add'>+        out1 = out3 ^ out6 ^ in7;</div><div class='add'>+        out4 = tmp1 ^ out1;</div><div class='add'>+        out7 = out2 ^ out4 ^ in0;</div><div class='add'>+        out0 = out7 ^ in1 ^ in4;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_82(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        out4 = in1 ^ in2;</div><div class='add'>+        tmp0 = in6 ^ in7;</div><div class='add'>+        out5 = in2 ^ in3;</div><div class='add'>+        out6 = in3 ^ in4;</div><div class='add'>+        out7 = in0 ^ in4 ^ in5;</div><div class='add'>+        out0 = in1 ^ in5 ^ in6;</div><div class='add'>+        out1 = tmp0 ^ in0 ^ in2;</div><div class='add'>+        out2 = tmp0 ^ in3 ^ in5;</div><div class='add'>+        out3 = tmp0 ^ out0 ^ in4;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_83(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0, tmp1, tmp2, tmp3, tmp4;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        tmp0 = in0 ^ in1;</div><div class='add'>+        tmp1 = in2 ^ in5;</div><div class='add'>+        tmp2 = in3 ^ in6;</div><div class='add'>+        out4 = in1 ^ in2 ^ in4;</div><div class='add'>+        out0 = tmp0 ^ in5 ^ in6;</div><div class='add'>+        out5 = tmp1 ^ in3;</div><div class='add'>+        tmp3 = tmp1 ^ in7;</div><div class='add'>+        out6 = tmp2 ^ in4;</div><div class='add'>+        out2 = tmp2 ^ tmp3;</div><div class='add'>+        tmp4 = tmp3 ^ out4;</div><div class='add'>+        out1 = tmp3 ^ out0;</div><div class='add'>+        out3 = tmp4 ^ in3;</div><div class='add'>+        out7 = tmp0 ^ tmp4;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_84(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        out1 = in2 ^ in6;</div><div class='add'>+        out6 = in3 ^ in5;</div><div class='add'>+        out0 = in1 ^ in5 ^ in7;</div><div class='add'>+        out7 = in0 ^ in4 ^ in6;</div><div class='add'>+        out4 = in1 ^ in3 ^ in6;</div><div class='add'>+        out5 = in2 ^ in4 ^ in7;</div><div class='add'>+        out2 = out6 ^ in0 ^ in1;</div><div class='add'>+        out3 = out5 ^ in5 ^ in6;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_85(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0, tmp1, tmp2, tmp3;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        tmp0 = in1 ^ in6;</div><div class='add'>+        tmp1 = in3 ^ in6;</div><div class='add'>+        tmp2 = tmp0 ^ in4;</div><div class='add'>+        out1 = tmp0 ^ in2;</div><div class='add'>+        out6 = tmp1 ^ in5;</div><div class='add'>+        out4 = tmp2 ^ in3;</div><div class='add'>+        tmp3 = out1 ^ out6;</div><div class='add'>+        out2 = tmp3 ^ in0;</div><div class='add'>+        out3 = tmp2 ^ tmp3 ^ in7;</div><div class='add'>+        out7 = out2 ^ out3 ^ in1;</div><div class='add'>+        out5 = tmp1 ^ out3;</div><div class='add'>+        out0 = tmp2 ^ out7 ^ in5;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_86(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        out6 = in3;</div><div class='add'>+        out7 = in0 ^ in4;</div><div class='add'>+        out0 = in1 ^ in5;</div><div class='add'>+        out5 = in2 ^ in7;</div><div class='add'>+        out3 = in4 ^ in5 ^ in6;</div><div class='add'>+        out1 = in0 ^ in2 ^ in6;</div><div class='add'>+        out4 = in1 ^ in6 ^ in7;</div><div class='add'>+        out2 = in0 ^ in3 ^ in5 ^ in7;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_87(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0, tmp1;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        out6 = in3 ^ in6;</div><div class='add'>+        tmp0 = in0 ^ in1;</div><div class='add'>+        out7 = in0 ^ in4 ^ in7;</div><div class='add'>+        out5 = in2 ^ in5 ^ in7;</div><div class='add'>+        out3 = out6 ^ in4 ^ in5;</div><div class='add'>+        out0 = tmp0 ^ in5;</div><div class='add'>+        tmp1 = tmp0 ^ in6;</div><div class='add'>+        out2 = out5 ^ in0 ^ in3;</div><div class='add'>+        out1 = tmp1 ^ in2;</div><div class='add'>+        out4 = tmp1 ^ out7;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_88(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0, tmp1;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        out1 = in2 ^ in7;</div><div class='add'>+        tmp0 = in5 ^ in6;</div><div class='add'>+        out0 = in1 ^ in6 ^ in7;</div><div class='add'>+        out6 = in4 ^ in5 ^ in7;</div><div class='add'>+        out3 = out0 ^ out1 ^ in0 ^ in4;</div><div class='add'>+        out7 = tmp0 ^ in0;</div><div class='add'>+        tmp1 = tmp0 ^ in3;</div><div class='add'>+        out2 = out0 ^ in3;</div><div class='add'>+        out4 = tmp1 ^ in2;</div><div class='add'>+        out5 = tmp1 ^ out6;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_89(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0, tmp1, tmp2;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        tmp0 = in0 ^ in7;</div><div class='add'>+        tmp1 = in2 ^ in7;</div><div class='add'>+        tmp2 = tmp0 ^ in6;</div><div class='add'>+        out1 = tmp1 ^ in1;</div><div class='add'>+        out7 = tmp2 ^ in5;</div><div class='add'>+        out0 = tmp2 ^ in1;</div><div class='add'>+        out2 = out1 ^ in3 ^ in6;</div><div class='add'>+        out6 = out7 ^ in0 ^ in4;</div><div class='add'>+        out5 = out6 ^ in3;</div><div class='add'>+        out3 = tmp0 ^ out2 ^ in4;</div><div class='add'>+        out4 = tmp1 ^ out5;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_8A(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        out0 = in1 ^ in6;</div><div class='add'>+        out7 = in0 ^ in5;</div><div class='add'>+        out2 = in3 ^ in6;</div><div class='add'>+        out6 = in4 ^ in7;</div><div class='add'>+        out1 = in0 ^ in2 ^ in7;</div><div class='add'>+        out3 = out0 ^ out6 ^ in0;</div><div class='add'>+        out4 = out1 ^ out7 ^ in6;</div><div class='add'>+        out5 = out2 ^ in7;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_8B(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0, tmp1, tmp2, tmp3, tmp4;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        tmp0 = in0 ^ in1;</div><div class='add'>+        tmp1 = in3 ^ in6;</div><div class='add'>+        tmp2 = in5 ^ in7;</div><div class='add'>+        tmp3 = tmp0 ^ in7;</div><div class='add'>+        out0 = tmp0 ^ in6;</div><div class='add'>+        out2 = tmp1 ^ in2;</div><div class='add'>+        out5 = tmp1 ^ tmp2;</div><div class='add'>+        out7 = tmp2 ^ in0;</div><div class='add'>+        tmp4 = tmp3 ^ in4;</div><div class='add'>+        out1 = tmp3 ^ in2;</div><div class='add'>+        out6 = tmp4 ^ out0;</div><div class='add'>+        out4 = out6 ^ in2 ^ in5;</div><div class='add'>+        out3 = tmp1 ^ tmp4;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_8C(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        out1 = in2;</div><div class='add'>+        out0 = in1 ^ in7;</div><div class='add'>+        out7 = in0 ^ in6;</div><div class='add'>+        out5 = in4 ^ in6;</div><div class='add'>+        out6 = in5 ^ in7;</div><div class='add'>+        out2 = out0 ^ in0 ^ in3;</div><div class='add'>+        out3 = out5 ^ out7 ^ in2 ^ in7;</div><div class='add'>+        out4 = out6 ^ in3;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_8D(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        out1 = in1 ^ in2;</div><div class='add'>+        tmp0 = in6 ^ in7;</div><div class='add'>+        out0 = in0 ^ in1 ^ in7;</div><div class='add'>+        out5 = in4 ^ in5 ^ in6;</div><div class='add'>+        out6 = tmp0 ^ in5;</div><div class='add'>+        out7 = tmp0 ^ in0;</div><div class='add'>+        out4 = tmp0 ^ out5 ^ in3;</div><div class='add'>+        out2 = out0 ^ in2 ^ in3;</div><div class='add'>+        out3 = out2 ^ in1 ^ in4;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_8E(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        out0 = in1;</div><div class='add'>+        out4 = in5;</div><div class='add'>+        out7 = in0;</div><div class='add'>+        out5 = in6;</div><div class='add'>+        out6 = in7;</div><div class='add'>+        out3 = in0 ^ in4;</div><div class='add'>+        out1 = in0 ^ in2;</div><div class='add'>+        out2 = in0 ^ in3;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_8F(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        out0 = in0 ^ in1;</div><div class='add'>+        tmp0 = in0 ^ in3;</div><div class='add'>+        out4 = in4 ^ in5;</div><div class='add'>+        out7 = in0 ^ in7;</div><div class='add'>+        out5 = in5 ^ in6;</div><div class='add'>+        out6 = in6 ^ in7;</div><div class='add'>+        out1 = out0 ^ in2;</div><div class='add'>+        out2 = tmp0 ^ in2;</div><div class='add'>+        out3 = tmp0 ^ in4;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_90(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0, tmp1, tmp2;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        tmp0 = in1 ^ in2;</div><div class='add'>+        tmp1 = in2 ^ in6 ^ in7;</div><div class='add'>+        out3 = tmp0 ^ in7;</div><div class='add'>+        out1 = tmp1 ^ in5;</div><div class='add'>+        tmp2 = out1 ^ in4;</div><div class='add'>+        out6 = tmp2 ^ in3;</div><div class='add'>+        out5 = out6 ^ in1;</div><div class='add'>+        out4 = out5 ^ in0;</div><div class='add'>+        out0 = tmp0 ^ tmp2;</div><div class='add'>+        out7 = tmp0 ^ out4;</div><div class='add'>+        out2 = tmp1 ^ out5;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_91(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0, tmp1, tmp2, tmp3;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        tmp0 = in2 ^ in4;</div><div class='add'>+        tmp1 = tmp0 ^ in3 ^ in5;</div><div class='add'>+        out2 = tmp1 ^ in1;</div><div class='add'>+        out6 = tmp1 ^ in7;</div><div class='add'>+        tmp2 = out2 ^ in5 ^ in7;</div><div class='add'>+        out3 = tmp2 ^ in4;</div><div class='add'>+        out5 = tmp2 ^ in6;</div><div class='add'>+        out1 = tmp1 ^ out5 ^ in2;</div><div class='add'>+        tmp3 = out1 ^ in0;</div><div class='add'>+        out4 = tmp3 ^ in3;</div><div class='add'>+        out0 = tmp0 ^ tmp3;</div><div class='add'>+        out7 = tmp2 ^ tmp3;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_92(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0, tmp1;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        out3 = in1;</div><div class='add'>+        tmp0 = in4 ^ in5;</div><div class='add'>+        tmp1 = tmp0 ^ in1;</div><div class='add'>+        out2 = tmp0 ^ in3 ^ in7;</div><div class='add'>+        out0 = tmp1 ^ in6;</div><div class='add'>+        out7 = out2 ^ in0;</div><div class='add'>+        out4 = out0 ^ in0 ^ in2;</div><div class='add'>+        out5 = out4 ^ out7 ^ in5;</div><div class='add'>+        out6 = tmp1 ^ out5;</div><div class='add'>+        out1 = out6 ^ out7 ^ in7;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_93(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0, tmp1, tmp2;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        out3 = in1 ^ in3;</div><div class='add'>+        tmp0 = in2 ^ in7;</div><div class='add'>+        tmp1 = out3 ^ in6;</div><div class='add'>+        tmp2 = tmp0 ^ in4;</div><div class='add'>+        out5 = tmp0 ^ tmp1;</div><div class='add'>+        out6 = tmp2 ^ in3;</div><div class='add'>+        out2 = out6 ^ in5;</div><div class='add'>+        out0 = out2 ^ out5 ^ in0;</div><div class='add'>+        out7 = tmp1 ^ out0;</div><div class='add'>+        out1 = tmp2 ^ out0;</div><div class='add'>+        out4 = out1 ^ in7;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_94(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        out3 = in2 ^ in6;</div><div class='add'>+        tmp0 = in1 ^ in4 ^ in5;</div><div class='add'>+        out1 = out3 ^ in5;</div><div class='add'>+        out5 = tmp0 ^ out3;</div><div class='add'>+        out0 = tmp0 ^ in7;</div><div class='add'>+        out4 = tmp0 ^ in0 ^ in3;</div><div class='add'>+        out6 = out1 ^ in3 ^ in7;</div><div class='add'>+        out2 = out4 ^ in6;</div><div class='add'>+        out7 = out0 ^ out2 ^ in4;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_95(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0, tmp1, tmp2, tmp3, tmp4, tmp5;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        tmp0 = in2 ^ in3;</div><div class='add'>+        out3 = tmp0 ^ in6;</div><div class='add'>+        tmp1 = tmp0 ^ in7;</div><div class='add'>+        tmp2 = out3 ^ in0;</div><div class='add'>+        out6 = tmp1 ^ in5;</div><div class='add'>+        tmp3 = tmp2 ^ in4;</div><div class='add'>+        out7 = tmp3 ^ in2;</div><div class='add'>+        tmp4 = tmp3 ^ in5;</div><div class='add'>+        out2 = tmp4 ^ in1;</div><div class='add'>+        tmp5 = out2 ^ in6;</div><div class='add'>+        out0 = tmp1 ^ tmp5;</div><div class='add'>+        out1 = tmp5 ^ out7;</div><div class='add'>+        out4 = tmp2 ^ out1;</div><div class='add'>+        out5 = tmp4 ^ out4;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_96(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0, tmp1, tmp2;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        out3 = in6 ^ in7;</div><div class='add'>+        tmp0 = in1 ^ in5;</div><div class='add'>+        tmp1 = in5 ^ in6;</div><div class='add'>+        out6 = out3 ^ in2 ^ in3;</div><div class='add'>+        out0 = tmp0 ^ in4;</div><div class='add'>+        tmp2 = tmp1 ^ in2;</div><div class='add'>+        out4 = out0 ^ in0 ^ in7;</div><div class='add'>+        out1 = tmp2 ^ in0;</div><div class='add'>+        out5 = tmp2 ^ in1;</div><div class='add'>+        out7 = tmp0 ^ out4 ^ in3;</div><div class='add'>+        out2 = tmp1 ^ out7;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_97(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0, tmp1, tmp2, tmp3;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        tmp0 = in0 ^ in4;</div><div class='add'>+        tmp1 = in2 ^ in6;</div><div class='add'>+        out3 = in3 ^ in6 ^ in7;</div><div class='add'>+        out7 = tmp0 ^ in3;</div><div class='add'>+        tmp2 = tmp0 ^ in5;</div><div class='add'>+        out5 = tmp1 ^ in1;</div><div class='add'>+        out6 = tmp1 ^ out3;</div><div class='add'>+        out0 = tmp2 ^ in1;</div><div class='add'>+        out2 = tmp2 ^ out3 ^ in2;</div><div class='add'>+        tmp3 = out0 ^ in4;</div><div class='add'>+        out4 = tmp3 ^ in7;</div><div class='add'>+        out1 = tmp1 ^ tmp3;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_98(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0, tmp1;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        tmp0 = in5 ^ in7;</div><div class='add'>+        tmp1 = in1 ^ in4 ^ in7;</div><div class='add'>+        out1 = tmp0 ^ in2;</div><div class='add'>+        out0 = tmp1 ^ in6;</div><div class='add'>+        out2 = tmp1 ^ in3;</div><div class='add'>+        out6 = out0 ^ out1 ^ in1;</div><div class='add'>+        out5 = tmp0 ^ out2;</div><div class='add'>+        out3 = tmp1 ^ out6 ^ in0;</div><div class='add'>+        out7 = out0 ^ out5 ^ in0;</div><div class='add'>+        out4 = out6 ^ out7 ^ in7;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_99(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0, tmp1, tmp2;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        tmp0 = in0 ^ in3;</div><div class='add'>+        out5 = in1 ^ in3 ^ in4;</div><div class='add'>+        out6 = in2 ^ in4 ^ in5;</div><div class='add'>+        out4 = tmp0 ^ in2;</div><div class='add'>+        tmp1 = tmp0 ^ in6;</div><div class='add'>+        tmp2 = out5 ^ in7;</div><div class='add'>+        out7 = tmp1 ^ in5;</div><div class='add'>+        out0 = tmp1 ^ tmp2;</div><div class='add'>+        out2 = tmp2 ^ in2;</div><div class='add'>+        out3 = out0 ^ out6 ^ in3;</div><div class='add'>+        out1 = tmp1 ^ out3;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_9A(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0, tmp1, tmp2;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        out2 = in3 ^ in4;</div><div class='add'>+        tmp0 = in0 ^ in5;</div><div class='add'>+        tmp1 = in1 ^ in6;</div><div class='add'>+        out5 = in1 ^ in3 ^ in5;</div><div class='add'>+        tmp2 = tmp0 ^ in7;</div><div class='add'>+        out3 = tmp0 ^ tmp1;</div><div class='add'>+        out0 = tmp1 ^ in4;</div><div class='add'>+        out7 = tmp2 ^ in3;</div><div class='add'>+        out1 = tmp2 ^ in2;</div><div class='add'>+        out6 = out0 ^ in1 ^ in2;</div><div class='add'>+        out4 = out1 ^ in4 ^ in5;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_9B(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        out5 = in1 ^ in3;</div><div class='add'>+        tmp0 = in3 ^ in5;</div><div class='add'>+        out6 = in2 ^ in4;</div><div class='add'>+        out4 = in0 ^ in2 ^ in7;</div><div class='add'>+        out7 = tmp0 ^ in0;</div><div class='add'>+        out2 = out6 ^ in3;</div><div class='add'>+        out1 = out4 ^ in1 ^ in5;</div><div class='add'>+        out3 = out7 ^ in1 ^ in6;</div><div class='add'>+        out0 = tmp0 ^ out3 ^ in4;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_9C(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        out1 = in2 ^ in5;</div><div class='add'>+        tmp0 = in0 ^ in3 ^ in6;</div><div class='add'>+        out3 = out1 ^ in0;</div><div class='add'>+        out6 = out1 ^ in6;</div><div class='add'>+        out7 = tmp0 ^ in7;</div><div class='add'>+        out4 = out7 ^ in4;</div><div class='add'>+        out2 = out4 ^ in1;</div><div class='add'>+        out0 = tmp0 ^ out2;</div><div class='add'>+        out5 = out0 ^ in5;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_9D(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        out6 = in2 ^ in5;</div><div class='add'>+        tmp0 = in0 ^ in3;</div><div class='add'>+        out5 = in1 ^ in4 ^ in7;</div><div class='add'>+        out1 = out6 ^ in1;</div><div class='add'>+        out3 = tmp0 ^ out6;</div><div class='add'>+        out7 = tmp0 ^ in6;</div><div class='add'>+        out0 = out5 ^ in0;</div><div class='add'>+        out4 = out7 ^ in7;</div><div class='add'>+        out2 = out5 ^ out7 ^ in2;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_9E(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        out0 = in1 ^ in4;</div><div class='add'>+        tmp0 = in0 ^ in5;</div><div class='add'>+        out6 = in2 ^ in6;</div><div class='add'>+        out7 = in0 ^ in3 ^ in7;</div><div class='add'>+        out4 = in0 ^ in4 ^ in6;</div><div class='add'>+        out5 = in1 ^ in5 ^ in7;</div><div class='add'>+        out1 = tmp0 ^ in2;</div><div class='add'>+        out3 = tmp0 ^ in7;</div><div class='add'>+        out2 = out4 ^ in3;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_9F(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        out6 = in2;</div><div class='add'>+        out7 = in0 ^ in3;</div><div class='add'>+        tmp0 = in0 ^ in1;</div><div class='add'>+        out4 = in0 ^ in6;</div><div class='add'>+        out5 = in1 ^ in7;</div><div class='add'>+        out1 = tmp0 ^ in2 ^ in5;</div><div class='add'>+        out2 = out7 ^ in2 ^ in4 ^ in6;</div><div class='add'>+        out3 = out7 ^ in5 ^ in7;</div><div class='add'>+        out0 = tmp0 ^ in4;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_A0(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0, tmp1, tmp2, tmp3;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        tmp0 = in1 ^ in6;</div><div class='add'>+        out2 = tmp0 ^ in7;</div><div class='add'>+        tmp1 = tmp0 ^ in5;</div><div class='add'>+        out6 = out2 ^ in3 ^ in4;</div><div class='add'>+        out0 = tmp1 ^ in3;</div><div class='add'>+        tmp2 = out0 ^ in2;</div><div class='add'>+        out3 = tmp2 ^ in7;</div><div class='add'>+        tmp3 = tmp2 ^ in1;</div><div class='add'>+        out5 = tmp3 ^ in0;</div><div class='add'>+        out4 = tmp3 ^ out6;</div><div class='add'>+        out7 = out5 ^ out6 ^ in1;</div><div class='add'>+        out1 = tmp1 ^ out4;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_A1(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0, tmp1, tmp2;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        tmp0 = in2 ^ in5;</div><div class='add'>+        tmp1 = tmp0 ^ in1;</div><div class='add'>+        tmp2 = tmp0 ^ in4;</div><div class='add'>+        out4 = tmp1 ^ in7;</div><div class='add'>+        out7 = tmp2 ^ in0;</div><div class='add'>+        out6 = tmp2 ^ out4 ^ in3;</div><div class='add'>+        out3 = out4 ^ in6;</div><div class='add'>+        out2 = out3 ^ in5;</div><div class='add'>+        out1 = out2 ^ in4;</div><div class='add'>+        out5 = out1 ^ out6 ^ in0;</div><div class='add'>+        out0 = tmp1 ^ out5;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_A2(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        out2 = in6;</div><div class='add'>+        tmp0 = in1 ^ in3 ^ in5;</div><div class='add'>+        out3 = tmp0 ^ in6;</div><div class='add'>+        out4 = tmp0 ^ in2 ^ in4;</div><div class='add'>+        out0 = out3 ^ in7;</div><div class='add'>+        out6 = out0 ^ in4;</div><div class='add'>+        out1 = out0 ^ out4 ^ in0;</div><div class='add'>+        out7 = out1 ^ in5;</div><div class='add'>+        out5 = out7 ^ in3 ^ in7;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_A3(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0, tmp1;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        out2 = in2 ^ in6;</div><div class='add'>+        out3 = in1 ^ in5 ^ in6;</div><div class='add'>+        tmp0 = out2 ^ in0;</div><div class='add'>+        out4 = out2 ^ out3 ^ in3;</div><div class='add'>+        tmp1 = tmp0 ^ in4;</div><div class='add'>+        out0 = tmp0 ^ out4 ^ in7;</div><div class='add'>+        out5 = tmp1 ^ in3;</div><div class='add'>+        out7 = tmp1 ^ in5;</div><div class='add'>+        out1 = tmp1 ^ in1 ^ in7;</div><div class='add'>+        out6 = tmp1 ^ out0 ^ in2;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_A4(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0, tmp1, tmp2, tmp3, tmp4;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        tmp0 = in1 ^ in3;</div><div class='add'>+        tmp1 = in2 ^ in4;</div><div class='add'>+        tmp2 = in2 ^ in5;</div><div class='add'>+        tmp3 = in0 ^ in7;</div><div class='add'>+        out0 = tmp0 ^ in5;</div><div class='add'>+        out6 = tmp0 ^ in6 ^ in7;</div><div class='add'>+        out1 = tmp1 ^ in6;</div><div class='add'>+        out7 = tmp1 ^ tmp3;</div><div class='add'>+        out3 = tmp2 ^ in3;</div><div class='add'>+        tmp4 = tmp2 ^ out1;</div><div class='add'>+        out2 = tmp3 ^ in1;</div><div class='add'>+        out5 = tmp4 ^ out7;</div><div class='add'>+        out4 = tmp4 ^ in1;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_A5(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0, tmp1, tmp2;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        out3 = in2 ^ in5;</div><div class='add'>+        tmp0 = in1 ^ in6;</div><div class='add'>+        tmp1 = in0 ^ in1;</div><div class='add'>+        tmp2 = in2 ^ in4;</div><div class='add'>+        out6 = in1 ^ in3 ^ in7;</div><div class='add'>+        out4 = tmp0 ^ in5;</div><div class='add'>+        out1 = tmp0 ^ tmp2;</div><div class='add'>+        out0 = tmp1 ^ in3 ^ in5;</div><div class='add'>+        out2 = tmp1 ^ in2 ^ in7;</div><div class='add'>+        out7 = tmp2 ^ in0;</div><div class='add'>+        out5 = tmp0 ^ out2;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_A6(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        out2 = in0;</div><div class='add'>+        out3 = in3 ^ in5 ^ in7;</div><div class='add'>+        out1 = in0 ^ in2 ^ in4 ^ in6;</div><div class='add'>+        out0 = out3 ^ in1;</div><div class='add'>+        out7 = out1 ^ in7;</div><div class='add'>+        out6 = out0 ^ in6;</div><div class='add'>+        out5 = out7 ^ in5;</div><div class='add'>+        out4 = out6 ^ in4;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_A7(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        out2 = in0 ^ in2;</div><div class='add'>+        out3 = in5 ^ in7;</div><div class='add'>+        out7 = out2 ^ in4 ^ in6;</div><div class='add'>+        out6 = out3 ^ in1 ^ in3;</div><div class='add'>+        out1 = out7 ^ in1;</div><div class='add'>+        out5 = out7 ^ in7;</div><div class='add'>+        out0 = out6 ^ in0;</div><div class='add'>+        out4 = out6 ^ in6;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_A8(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0, tmp1, tmp2;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        tmp0 = in2 ^ in4;</div><div class='add'>+        tmp1 = in1 ^ in6;</div><div class='add'>+        tmp2 = in0 ^ in2 ^ in7;</div><div class='add'>+        out1 = tmp0 ^ in7;</div><div class='add'>+        out4 = tmp0 ^ in6;</div><div class='add'>+        out0 = tmp1 ^ in3;</div><div class='add'>+        out2 = tmp1 ^ in5;</div><div class='add'>+        out6 = tmp1 ^ in4;</div><div class='add'>+        out7 = tmp2 ^ in5;</div><div class='add'>+        out3 = tmp2 ^ out0 ^ in6;</div><div class='add'>+        out5 = out7 ^ in2 ^ in3;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_A9(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        out4 = in2 ^ in6;</div><div class='add'>+        out6 = in1 ^ in4;</div><div class='add'>+        out7 = in0 ^ in2 ^ in5;</div><div class='add'>+        out5 = in0 ^ in3 ^ in7;</div><div class='add'>+        out2 = out4 ^ in1 ^ in5;</div><div class='add'>+        out1 = out6 ^ in2 ^ in7;</div><div class='add'>+        out0 = out2 ^ out7 ^ in3;</div><div class='add'>+        out3 = out1 ^ in0 ^ in4;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_AA(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0, tmp1, tmp2;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        tmp0 = in0 ^ in2;</div><div class='add'>+        tmp1 = in1 ^ in3;</div><div class='add'>+        tmp2 = in6 ^ in7;</div><div class='add'>+        out1 = tmp0 ^ in4 ^ in7;</div><div class='add'>+        out3 = tmp1 ^ in0;</div><div class='add'>+        out0 = tmp1 ^ tmp2;</div><div class='add'>+        out2 = tmp2 ^ in5;</div><div class='add'>+        out7 = tmp0 ^ out2;</div><div class='add'>+        out6 = out1 ^ out7 ^ in1;</div><div class='add'>+        out5 = out0 ^ out6 ^ in0;</div><div class='add'>+        out4 = out5 ^ out7 ^ in7;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_AB(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0, tmp1;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        out3 = in0 ^ in1;</div><div class='add'>+        tmp0 = in1 ^ in4;</div><div class='add'>+        tmp1 = in0 ^ in7;</div><div class='add'>+        out6 = tmp0 ^ in5;</div><div class='add'>+        out1 = tmp0 ^ tmp1 ^ in2;</div><div class='add'>+        out5 = tmp1 ^ in3 ^ in4;</div><div class='add'>+        out0 = tmp0 ^ out5 ^ in6;</div><div class='add'>+        out4 = out0 ^ out3 ^ in2;</div><div class='add'>+        out2 = out4 ^ in3 ^ in5;</div><div class='add'>+        out7 = tmp1 ^ out2;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_AC(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        out0 = in1 ^ in3;</div><div class='add'>+        out1 = in2 ^ in4;</div><div class='add'>+        tmp0 = in0 ^ in2;</div><div class='add'>+        out4 = in4 ^ in7;</div><div class='add'>+        out5 = in0 ^ in5;</div><div class='add'>+        out6 = in1 ^ in6;</div><div class='add'>+        out7 = tmp0 ^ in7;</div><div class='add'>+        out3 = tmp0 ^ in3 ^ in6;</div><div class='add'>+        out2 = out5 ^ in1;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_AD(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        out4 = in7;</div><div class='add'>+        out5 = in0;</div><div class='add'>+        out6 = in1;</div><div class='add'>+        out7 = in0 ^ in2;</div><div class='add'>+        out0 = in0 ^ in1 ^ in3;</div><div class='add'>+        out2 = out7 ^ in1 ^ in5;</div><div class='add'>+        out1 = in1 ^ in2 ^ in4;</div><div class='add'>+        out3 = out7 ^ in6;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_AE(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0, tmp1, tmp2;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        out4 = in3 ^ in4;</div><div class='add'>+        tmp0 = in0 ^ in4;</div><div class='add'>+        tmp1 = in0 ^ in7;</div><div class='add'>+        out0 = in1 ^ in3 ^ in7;</div><div class='add'>+        out1 = tmp0 ^ in2;</div><div class='add'>+        out5 = tmp0 ^ in5;</div><div class='add'>+        tmp2 = tmp1 ^ in6;</div><div class='add'>+        out2 = tmp1 ^ in5;</div><div class='add'>+        out3 = tmp2 ^ in3;</div><div class='add'>+        out7 = tmp2 ^ in2;</div><div class='add'>+        out6 = tmp2 ^ out2 ^ in1;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_AF(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        out4 = in3;</div><div class='add'>+        tmp0 = in0 ^ in7;</div><div class='add'>+        out5 = in0 ^ in4;</div><div class='add'>+        out6 = in1 ^ in5;</div><div class='add'>+        out7 = in0 ^ in2 ^ in6;</div><div class='add'>+        out0 = tmp0 ^ in1 ^ in3;</div><div class='add'>+        out3 = tmp0 ^ in6;</div><div class='add'>+        out2 = tmp0 ^ in2 ^ in5;</div><div class='add'>+        out1 = out5 ^ in1 ^ in2;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_B0(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0, tmp1, tmp2, tmp3;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        tmp0 = in1 ^ in4;</div><div class='add'>+        tmp1 = in3 ^ in6;</div><div class='add'>+        out2 = tmp0 ^ in7;</div><div class='add'>+        tmp2 = tmp0 ^ tmp1;</div><div class='add'>+        out0 = tmp2 ^ in5;</div><div class='add'>+        out3 = tmp2 ^ in2;</div><div class='add'>+        out6 = out3 ^ in6;</div><div class='add'>+        tmp3 = out6 ^ in0 ^ in1;</div><div class='add'>+        out7 = tmp3 ^ in5;</div><div class='add'>+        out5 = tmp3 ^ out2;</div><div class='add'>+        out1 = out0 ^ out5 ^ in0;</div><div class='add'>+        out4 = tmp1 ^ out5;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_B1(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0, tmp1;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        tmp0 = in1 ^ in4;</div><div class='add'>+        out2 = tmp0 ^ in2 ^ in7;</div><div class='add'>+        tmp1 = out2 ^ in6;</div><div class='add'>+        out1 = tmp1 ^ in5;</div><div class='add'>+        out3 = tmp1 ^ in7;</div><div class='add'>+        out4 = tmp1 ^ in0;</div><div class='add'>+        out6 = out3 ^ in3;</div><div class='add'>+        out0 = out6 ^ in0 ^ in2 ^ in5;</div><div class='add'>+        out5 = tmp1 ^ out0 ^ in1;</div><div class='add'>+        out7 = tmp0 ^ out5;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_B2(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0, tmp1, tmp2, tmp3, tmp4;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        out2 = in4;</div><div class='add'>+        tmp0 = in4 ^ in7;</div><div class='add'>+        tmp1 = in1 ^ in3 ^ in6;</div><div class='add'>+        out3 = tmp0 ^ tmp1;</div><div class='add'>+        tmp2 = tmp1 ^ in0;</div><div class='add'>+        out0 = out3 ^ in5;</div><div class='add'>+        out4 = tmp2 ^ in2;</div><div class='add'>+        tmp3 = out4 ^ in6;</div><div class='add'>+        out5 = tmp0 ^ tmp3;</div><div class='add'>+        out1 = tmp3 ^ out0;</div><div class='add'>+        tmp4 = out1 ^ in7;</div><div class='add'>+        out7 = tmp4 ^ in3;</div><div class='add'>+        out6 = tmp2 ^ tmp4;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_B3(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0, tmp1, tmp2;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        out2 = in2 ^ in4;</div><div class='add'>+        tmp0 = in0 ^ in5;</div><div class='add'>+        tmp1 = in1 ^ in6;</div><div class='add'>+        out3 = tmp1 ^ in4 ^ in7;</div><div class='add'>+        tmp2 = tmp0 ^ out3;</div><div class='add'>+        out0 = tmp2 ^ in3;</div><div class='add'>+        out1 = tmp2 ^ in2;</div><div class='add'>+        out5 = out0 ^ in2 ^ in6;</div><div class='add'>+        out7 = tmp1 ^ out5;</div><div class='add'>+        out4 = out7 ^ in1 ^ in5 ^ in7;</div><div class='add'>+        out6 = tmp0 ^ out4;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_B4(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        out4 = in0 ^ in1;</div><div class='add'>+        out5 = out4 ^ in2;</div><div class='add'>+        tmp0 = out4 ^ in4;</div><div class='add'>+        out6 = out5 ^ in0 ^ in3;</div><div class='add'>+        out7 = tmp0 ^ out6;</div><div class='add'>+        out2 = tmp0 ^ in6 ^ in7;</div><div class='add'>+        out3 = out7 ^ in0 ^ in7;</div><div class='add'>+        out0 = out5 ^ out7 ^ in5;</div><div class='add'>+        out1 = out0 ^ out6 ^ in6;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_B5(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0, tmp1, tmp2;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        tmp0 = in0 ^ in1;</div><div class='add'>+        tmp1 = in2 ^ in4;</div><div class='add'>+        out4 = tmp0 ^ in4;</div><div class='add'>+        out3 = tmp1 ^ in7;</div><div class='add'>+        tmp2 = out4 ^ in5;</div><div class='add'>+        out7 = out3 ^ in0 ^ in3;</div><div class='add'>+        out0 = tmp2 ^ in3;</div><div class='add'>+        out2 = tmp0 ^ out3 ^ in6;</div><div class='add'>+        out5 = tmp1 ^ tmp2;</div><div class='add'>+        out6 = out2 ^ out7 ^ in2;</div><div class='add'>+        out1 = tmp0 ^ out0 ^ out6;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_B6(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0, tmp1, tmp2, tmp3;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        out3 = in3 ^ in4;</div><div class='add'>+        tmp0 = in1 ^ in2;</div><div class='add'>+        tmp1 = in0 ^ in4;</div><div class='add'>+        tmp2 = in3 ^ in5;</div><div class='add'>+        tmp3 = out3 ^ in1 ^ in7;</div><div class='add'>+        out5 = tmp0 ^ tmp1;</div><div class='add'>+        out6 = tmp0 ^ tmp2;</div><div class='add'>+        out2 = tmp1 ^ in6;</div><div class='add'>+        out4 = tmp1 ^ tmp3;</div><div class='add'>+        out0 = tmp3 ^ in5;</div><div class='add'>+        out1 = out2 ^ in2 ^ in5;</div><div class='add'>+        out7 = tmp2 ^ out1;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_B7(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0, tmp1;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        out3 = in4;</div><div class='add'>+        tmp0 = in0 ^ in4;</div><div class='add'>+        out2 = tmp0 ^ in2 ^ in6;</div><div class='add'>+        tmp1 = out2 ^ in7;</div><div class='add'>+        out1 = out2 ^ in1 ^ in5;</div><div class='add'>+        out7 = tmp1 ^ in3;</div><div class='add'>+        out5 = out1 ^ in6;</div><div class='add'>+        out6 = tmp0 ^ out1 ^ in3;</div><div class='add'>+        out0 = tmp1 ^ out6;</div><div class='add'>+        out4 = out0 ^ in5;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_B8(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0, tmp1, tmp2;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        tmp0 = in1 ^ in4;</div><div class='add'>+        tmp1 = in2 ^ in5;</div><div class='add'>+        out2 = tmp0 ^ in5;</div><div class='add'>+        out4 = tmp1 ^ in0;</div><div class='add'>+        tmp2 = tmp1 ^ in7;</div><div class='add'>+        out6 = tmp2 ^ out2;</div><div class='add'>+        out7 = out4 ^ in3;</div><div class='add'>+        out1 = tmp2 ^ in4;</div><div class='add'>+        out3 = tmp0 ^ out7;</div><div class='add'>+        out0 = out3 ^ out4 ^ in6;</div><div class='add'>+        out5 = out0 ^ in0 ^ in4;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_B9(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0, tmp1, tmp2;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        tmp0 = in0 ^ in2;</div><div class='add'>+        tmp1 = in4 ^ in5;</div><div class='add'>+        out4 = tmp0 ^ tmp1;</div><div class='add'>+        tmp2 = tmp0 ^ in3 ^ in7;</div><div class='add'>+        out3 = out4 ^ in1;</div><div class='add'>+        out7 = tmp2 ^ in5;</div><div class='add'>+        out2 = out3 ^ in0;</div><div class='add'>+        out1 = out2 ^ in7;</div><div class='add'>+        out6 = out1 ^ in5 ^ in6;</div><div class='add'>+        out0 = tmp2 ^ out6;</div><div class='add'>+        out5 = tmp1 ^ out0;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_BA(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0, tmp1, tmp2;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        tmp0 = in5 ^ in7;</div><div class='add'>+        out2 = tmp0 ^ in4;</div><div class='add'>+        tmp1 = out2 ^ in2;</div><div class='add'>+        out1 = tmp1 ^ in0;</div><div class='add'>+        out6 = tmp1 ^ in1;</div><div class='add'>+        out4 = out1 ^ in3 ^ in4;</div><div class='add'>+        tmp2 = out4 ^ out6;</div><div class='add'>+        out7 = out4 ^ in6 ^ in7;</div><div class='add'>+        out5 = tmp2 ^ in6;</div><div class='add'>+        out3 = tmp0 ^ tmp2;</div><div class='add'>+        out0 = out6 ^ out7 ^ in0;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_BB(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0, tmp1;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        out2 = in2 ^ in4 ^ in5 ^ in7;</div><div class='add'>+        tmp0 = out2 ^ in1;</div><div class='add'>+        out4 = out2 ^ in0 ^ in3;</div><div class='add'>+        out1 = tmp0 ^ in0;</div><div class='add'>+        out6 = tmp0 ^ in6;</div><div class='add'>+        out3 = out1 ^ in2;</div><div class='add'>+        tmp1 = out4 ^ out6 ^ in4;</div><div class='add'>+        out0 = tmp1 ^ in7;</div><div class='add'>+        out5 = tmp1 ^ in5;</div><div class='add'>+        out7 = tmp0 ^ tmp1;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_BC(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0, tmp1, tmp2;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        tmp0 = in0 ^ in2;</div><div class='add'>+        tmp1 = in2 ^ in4;</div><div class='add'>+        out0 = in1 ^ in3 ^ in4;</div><div class='add'>+        out6 = in1 ^ in2 ^ in7;</div><div class='add'>+        out7 = tmp0 ^ in3;</div><div class='add'>+        out5 = tmp0 ^ out6 ^ in6;</div><div class='add'>+        out1 = tmp1 ^ in5;</div><div class='add'>+        tmp2 = out1 ^ out5 ^ in1;</div><div class='add'>+        out3 = tmp2 ^ in3;</div><div class='add'>+        out4 = tmp1 ^ tmp2;</div><div class='add'>+        out2 = tmp2 ^ out6;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_BD(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0, tmp1, tmp2;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        tmp0 = in0 ^ in3;</div><div class='add'>+        tmp1 = in1 ^ in4;</div><div class='add'>+        out0 = tmp0 ^ tmp1;</div><div class='add'>+        out7 = tmp0 ^ in2 ^ in7;</div><div class='add'>+        out1 = tmp1 ^ in2 ^ in5;</div><div class='add'>+        tmp2 = out1 ^ in0;</div><div class='add'>+        out2 = tmp2 ^ in6;</div><div class='add'>+        out3 = out2 ^ in1 ^ in7;</div><div class='add'>+        out4 = out3 ^ in2;</div><div class='add'>+        out5 = tmp1 ^ out4;</div><div class='add'>+        out6 = tmp2 ^ out4;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_BE(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        tmp0 = in0 ^ in3 ^ in6;</div><div class='add'>+        out4 = tmp0 ^ in5;</div><div class='add'>+        out7 = tmp0 ^ in2;</div><div class='add'>+        out3 = out4 ^ in4;</div><div class='add'>+        out1 = out3 ^ out7 ^ in0;</div><div class='add'>+        out2 = out3 ^ in3 ^ in7;</div><div class='add'>+        out0 = out2 ^ out4 ^ in1;</div><div class='add'>+        out5 = tmp0 ^ out0;</div><div class='add'>+        out6 = out1 ^ out5 ^ in6;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_BF(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0, tmp1, tmp2, tmp3;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        tmp0 = in0 ^ in4;</div><div class='add'>+        out3 = tmp0 ^ in5 ^ in6;</div><div class='add'>+        out4 = out3 ^ in3;</div><div class='add'>+        tmp1 = out3 ^ in7;</div><div class='add'>+        out2 = tmp1 ^ in2;</div><div class='add'>+        out5 = tmp1 ^ in1;</div><div class='add'>+        tmp2 = out2 ^ in5;</div><div class='add'>+        out7 = tmp2 ^ in3 ^ in4;</div><div class='add'>+        tmp3 = tmp0 ^ out5;</div><div class='add'>+        out0 = tmp3 ^ out4;</div><div class='add'>+        out1 = tmp2 ^ tmp3;</div><div class='add'>+        out6 = tmp3 ^ in2;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_C0(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0, tmp1;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        out5 = in2 ^ in5;</div><div class='add'>+        tmp0 = in1 ^ in4;</div><div class='add'>+        tmp1 = in3 ^ in6;</div><div class='add'>+        out0 = out5 ^ in1;</div><div class='add'>+        out4 = tmp0 ^ in7;</div><div class='add'>+        out3 = tmp0 ^ tmp1;</div><div class='add'>+        out1 = tmp1 ^ in2;</div><div class='add'>+        out6 = tmp1 ^ in0;</div><div class='add'>+        out7 = out4 ^ in0;</div><div class='add'>+        out2 = out4 ^ out5 ^ in3;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_C1(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0, tmp1;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        out5 = in2;</div><div class='add'>+        tmp0 = in0 ^ in1;</div><div class='add'>+        out4 = in1 ^ in7;</div><div class='add'>+        out6 = in0 ^ in3;</div><div class='add'>+        out3 = in1 ^ in4 ^ in6;</div><div class='add'>+        tmp1 = tmp0 ^ in2;</div><div class='add'>+        out7 = tmp0 ^ in4;</div><div class='add'>+        out0 = tmp1 ^ in5;</div><div class='add'>+        out1 = tmp1 ^ out6 ^ in6;</div><div class='add'>+        out2 = out6 ^ out7 ^ in5 ^ in7;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_C2(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0, tmp1;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        out4 = in1 ^ in3 ^ in4;</div><div class='add'>+        tmp0 = in0 ^ in3 ^ in6;</div><div class='add'>+        out5 = in2 ^ in4 ^ in5;</div><div class='add'>+        tmp1 = out4 ^ in7;</div><div class='add'>+        out1 = tmp0 ^ in2;</div><div class='add'>+        out6 = tmp0 ^ in5;</div><div class='add'>+        out2 = out5 ^ in3;</div><div class='add'>+        out7 = tmp0 ^ tmp1;</div><div class='add'>+        out3 = tmp1 ^ in2 ^ in6;</div><div class='add'>+        out0 = tmp1 ^ out2;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_C3(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0, tmp1, tmp2;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        out4 = in1 ^ in3;</div><div class='add'>+        tmp0 = in0 ^ in2;</div><div class='add'>+        tmp1 = in3 ^ in5;</div><div class='add'>+        out5 = in2 ^ in4;</div><div class='add'>+        tmp2 = tmp0 ^ out4;</div><div class='add'>+        out2 = tmp1 ^ in4;</div><div class='add'>+        out6 = tmp1 ^ in0;</div><div class='add'>+        out0 = tmp1 ^ tmp2 ^ in7;</div><div class='add'>+        out1 = tmp2 ^ in6;</div><div class='add'>+        out7 = out1 ^ out5 ^ in3;</div><div class='add'>+        out3 = tmp0 ^ out7 ^ in7;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_C4(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0, tmp1;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        tmp0 = in3 ^ in7;</div><div class='add'>+        out3 = tmp0 ^ in4;</div><div class='add'>+        tmp1 = tmp0 ^ in2;</div><div class='add'>+        out1 = tmp1 ^ in6;</div><div class='add'>+        out5 = tmp1 ^ in5;</div><div class='add'>+        out4 = out1 ^ out3 ^ in1;</div><div class='add'>+        out0 = out4 ^ in4 ^ in5;</div><div class='add'>+        out2 = out0 ^ out3 ^ in0;</div><div class='add'>+        out7 = out1 ^ out2 ^ in7;</div><div class='add'>+        out6 = tmp1 ^ out0 ^ out7;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_C5(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        out3 = in4 ^ in7;</div><div class='add'>+        tmp0 = in3 ^ in7;</div><div class='add'>+        out4 = in1 ^ in2 ^ in6;</div><div class='add'>+        out6 = in0 ^ in3 ^ in4;</div><div class='add'>+        out5 = tmp0 ^ in2;</div><div class='add'>+        out1 = tmp0 ^ out4;</div><div class='add'>+        out0 = out4 ^ in0 ^ in5;</div><div class='add'>+        out2 = out0 ^ out5 ^ in4;</div><div class='add'>+        out7 = tmp0 ^ out2 ^ in6;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_C6(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0, tmp1, tmp2, tmp3, tmp4, tmp5;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        tmp0 = in5 ^ in6;</div><div class='add'>+        tmp1 = in1 ^ in7;</div><div class='add'>+        tmp2 = tmp0 ^ in0;</div><div class='add'>+        tmp3 = tmp0 ^ tmp1;</div><div class='add'>+        tmp4 = tmp2 ^ in4;</div><div class='add'>+        out0 = tmp3 ^ in2;</div><div class='add'>+        out6 = tmp4 ^ in3;</div><div class='add'>+        out2 = out6 ^ in2;</div><div class='add'>+        out7 = tmp1 ^ tmp4;</div><div class='add'>+        out3 = tmp2 ^ out2;</div><div class='add'>+        tmp5 = out3 ^ in5;</div><div class='add'>+        out5 = tmp5 ^ in7;</div><div class='add'>+        out4 = tmp3 ^ tmp5;</div><div class='add'>+        out1 = tmp4 ^ out5;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_C7(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0, tmp1;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        out3 = in2 ^ in4;</div><div class='add'>+        tmp0 = in3 ^ in5;</div><div class='add'>+        tmp1 = out3 ^ in7;</div><div class='add'>+        out6 = tmp0 ^ in0 ^ in4;</div><div class='add'>+        out5 = tmp1 ^ in3;</div><div class='add'>+        out2 = out6 ^ in6;</div><div class='add'>+        out7 = out2 ^ in1 ^ in3;</div><div class='add'>+        out0 = tmp1 ^ out7;</div><div class='add'>+        out1 = tmp0 ^ out0;</div><div class='add'>+        out4 = out1 ^ in0;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_C8(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0, tmp1;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        out0 = in1 ^ in2;</div><div class='add'>+        out1 = in2 ^ in3;</div><div class='add'>+        tmp0 = in5 ^ in6;</div><div class='add'>+        tmp1 = in0 ^ in7;</div><div class='add'>+        out2 = out1 ^ in1 ^ in4;</div><div class='add'>+        out4 = tmp0 ^ in4;</div><div class='add'>+        out5 = tmp0 ^ in7;</div><div class='add'>+        out6 = tmp1 ^ in6;</div><div class='add'>+        out7 = tmp1 ^ in1;</div><div class='add'>+        out3 = out2 ^ in0 ^ in2 ^ in5;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_C9(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        out4 = in5 ^ in6;</div><div class='add'>+        out7 = in0 ^ in1;</div><div class='add'>+        tmp0 = in1 ^ in3;</div><div class='add'>+        out5 = in6 ^ in7;</div><div class='add'>+        out6 = in0 ^ in7;</div><div class='add'>+        out0 = out7 ^ in2;</div><div class='add'>+        out3 = out7 ^ in4 ^ in5;</div><div class='add'>+        out1 = tmp0 ^ in2;</div><div class='add'>+        out2 = tmp0 ^ in4;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_CA(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0, tmp1, tmp2, tmp3;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        tmp0 = in0 ^ in7;</div><div class='add'>+        tmp1 = in2 ^ in7;</div><div class='add'>+        tmp2 = tmp0 ^ in6;</div><div class='add'>+        out0 = tmp1 ^ in1;</div><div class='add'>+        tmp3 = tmp1 ^ in3;</div><div class='add'>+        out6 = tmp2 ^ in5;</div><div class='add'>+        out7 = tmp2 ^ in1;</div><div class='add'>+        out2 = tmp3 ^ in4;</div><div class='add'>+        out5 = out6 ^ in0 ^ in4;</div><div class='add'>+        out4 = out5 ^ in3;</div><div class='add'>+        out1 = tmp0 ^ tmp3;</div><div class='add'>+        out3 = tmp3 ^ out5 ^ out7;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_CB(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0, tmp1, tmp2;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        tmp0 = in4 ^ in7;</div><div class='add'>+        tmp1 = in5 ^ in7;</div><div class='add'>+        out7 = in0 ^ in1 ^ in6;</div><div class='add'>+        out5 = tmp0 ^ in6;</div><div class='add'>+        out2 = tmp0 ^ in3;</div><div class='add'>+        out6 = tmp1 ^ in0;</div><div class='add'>+        out4 = tmp1 ^ in3 ^ in6;</div><div class='add'>+        tmp2 = out5 ^ out7 ^ in2;</div><div class='add'>+        out1 = tmp2 ^ out2;</div><div class='add'>+        out0 = tmp2 ^ in4;</div><div class='add'>+        out3 = tmp2 ^ in5;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_CC(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0, tmp1, tmp2, tmp3;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        tmp0 = in3 ^ in5;</div><div class='add'>+        tmp1 = in1 ^ in6;</div><div class='add'>+        out1 = in2 ^ in3 ^ in7;</div><div class='add'>+        out5 = tmp0 ^ in6;</div><div class='add'>+        out0 = tmp1 ^ in2;</div><div class='add'>+        tmp2 = out5 ^ in0 ^ in7;</div><div class='add'>+        out3 = tmp2 ^ in4;</div><div class='add'>+        out6 = tmp0 ^ out3;</div><div class='add'>+        out7 = tmp1 ^ tmp2 ^ in3;</div><div class='add'>+        tmp3 = out1 ^ out6;</div><div class='add'>+        out4 = tmp2 ^ tmp3;</div><div class='add'>+        out2 = tmp3 ^ in1;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_CD(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0, tmp1;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        out5 = in3 ^ in6;</div><div class='add'>+        tmp0 = in0 ^ in1;</div><div class='add'>+        tmp1 = in2 ^ in7;</div><div class='add'>+        out6 = in0 ^ in4 ^ in7;</div><div class='add'>+        out2 = tmp0 ^ out5 ^ in4;</div><div class='add'>+        out7 = tmp0 ^ in5;</div><div class='add'>+        out0 = tmp0 ^ in2 ^ in6;</div><div class='add'>+        out4 = tmp1 ^ in5;</div><div class='add'>+        out1 = tmp1 ^ in1 ^ in3;</div><div class='add'>+        out3 = out6 ^ in5 ^ in6;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_CE(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0, tmp1, tmp2;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        tmp0 = in2 ^ in5;</div><div class='add'>+        tmp1 = tmp0 ^ in3;</div><div class='add'>+        out4 = tmp1 ^ in4;</div><div class='add'>+        tmp2 = out4 ^ in6;</div><div class='add'>+        out3 = tmp2 ^ in0;</div><div class='add'>+        out5 = tmp2 ^ in2;</div><div class='add'>+        out2 = out3 ^ in5 ^ in7;</div><div class='add'>+        out6 = tmp1 ^ out2;</div><div class='add'>+        out7 = out2 ^ out4 ^ in1;</div><div class='add'>+        out1 = tmp2 ^ out6;</div><div class='add'>+        out0 = tmp0 ^ out7 ^ in0;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_CF(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0, tmp1, tmp2;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        tmp0 = in3 ^ in6;</div><div class='add'>+        tmp1 = in0 ^ in1 ^ in5;</div><div class='add'>+        out4 = in2 ^ in3 ^ in5;</div><div class='add'>+        out5 = tmp0 ^ in4;</div><div class='add'>+        out7 = tmp1 ^ in6;</div><div class='add'>+        out1 = tmp1 ^ out4 ^ in7;</div><div class='add'>+        tmp2 = out5 ^ in0;</div><div class='add'>+        out2 = tmp2 ^ in7;</div><div class='add'>+        out3 = tmp2 ^ out4;</div><div class='add'>+        out6 = tmp0 ^ out2 ^ in5;</div><div class='add'>+        out0 = tmp0 ^ out1;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_D0(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0, tmp1, tmp2, tmp3, tmp4;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        tmp0 = in0 ^ in3;</div><div class='add'>+        tmp1 = in1 ^ in4;</div><div class='add'>+        tmp2 = in2 ^ in5;</div><div class='add'>+        out7 = tmp0 ^ tmp1;</div><div class='add'>+        out0 = tmp1 ^ tmp2;</div><div class='add'>+        tmp3 = tmp2 ^ in3;</div><div class='add'>+        out1 = tmp3 ^ in6;</div><div class='add'>+        tmp4 = out1 ^ in1;</div><div class='add'>+        out2 = tmp4 ^ in7;</div><div class='add'>+        out3 = out2 ^ in2;</div><div class='add'>+        out4 = tmp0 ^ out3;</div><div class='add'>+        out5 = tmp3 ^ out3;</div><div class='add'>+        out6 = tmp4 ^ out4;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_D1(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0, tmp1, tmp2;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        tmp0 = in3 ^ in5 ^ in6;</div><div class='add'>+        tmp1 = tmp0 ^ in1;</div><div class='add'>+        out1 = tmp1 ^ in2;</div><div class='add'>+        out2 = tmp1 ^ in7;</div><div class='add'>+        out3 = out2 ^ in3;</div><div class='add'>+        out5 = out3 ^ in2;</div><div class='add'>+        tmp2 = out3 ^ in0;</div><div class='add'>+        out4 = tmp2 ^ in4;</div><div class='add'>+        out7 = tmp0 ^ out4;</div><div class='add'>+        out6 = tmp2 ^ out1 ^ in6;</div><div class='add'>+        out0 = out2 ^ out6 ^ in4;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_D2(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        tmp0 = in5 ^ in6;</div><div class='add'>+        out2 = tmp0 ^ in2 ^ in3;</div><div class='add'>+        out1 = out2 ^ in0;</div><div class='add'>+        out3 = out2 ^ in1;</div><div class='add'>+        out4 = out1 ^ in1 ^ in2;</div><div class='add'>+        out6 = out1 ^ in6 ^ in7;</div><div class='add'>+        out7 = out4 ^ in4 ^ in5;</div><div class='add'>+        out5 = out4 ^ out6 ^ in4;</div><div class='add'>+        out0 = tmp0 ^ out5;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_D3(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0, tmp1, tmp2, tmp3;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        out2 = in3 ^ in5 ^ in6;</div><div class='add'>+        tmp0 = out2 ^ in2;</div><div class='add'>+        tmp1 = tmp0 ^ in1;</div><div class='add'>+        out1 = tmp1 ^ in0;</div><div class='add'>+        out3 = tmp1 ^ in3;</div><div class='add'>+        out4 = out1 ^ in2 ^ in4;</div><div class='add'>+        tmp2 = out4 ^ in5;</div><div class='add'>+        out7 = tmp2 ^ in7;</div><div class='add'>+        out0 = tmp0 ^ out7;</div><div class='add'>+        tmp3 = out0 ^ in0;</div><div class='add'>+        out5 = tmp3 ^ in6;</div><div class='add'>+        out6 = tmp2 ^ tmp3;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_D4(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0, tmp1, tmp2;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        out3 = in3 ^ in5;</div><div class='add'>+        tmp0 = in1 ^ in5;</div><div class='add'>+        tmp1 = tmp0 ^ in2;</div><div class='add'>+        out4 = tmp1 ^ in0;</div><div class='add'>+        tmp2 = tmp1 ^ in6;</div><div class='add'>+        out2 = out4 ^ in3 ^ in7;</div><div class='add'>+        out0 = tmp2 ^ in4;</div><div class='add'>+        out5 = tmp2 ^ out3;</div><div class='add'>+        out1 = tmp0 ^ out5 ^ in7;</div><div class='add'>+        out6 = tmp0 ^ out2 ^ in4;</div><div class='add'>+        out7 = tmp1 ^ out6 ^ in7;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_D5(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0, tmp1, tmp2;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        out3 = in5;</div><div class='add'>+        tmp0 = in0 ^ in4;</div><div class='add'>+        tmp1 = tmp0 ^ in1 ^ in5;</div><div class='add'>+        out4 = tmp1 ^ in2;</div><div class='add'>+        out0 = out4 ^ in6;</div><div class='add'>+        tmp2 = tmp0 ^ out0;</div><div class='add'>+        out5 = tmp2 ^ in3;</div><div class='add'>+        out1 = out5 ^ in7;</div><div class='add'>+        out6 = tmp1 ^ out1;</div><div class='add'>+        out7 = tmp2 ^ out6;</div><div class='add'>+        out2 = out7 ^ in4;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_D6(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0, tmp1;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        tmp0 = in1 ^ in2 ^ in4 ^ in6;</div><div class='add'>+        out5 = tmp0 ^ in3;</div><div class='add'>+        out0 = tmp0 ^ in5 ^ in7;</div><div class='add'>+        out3 = out0 ^ out5 ^ in2;</div><div class='add'>+        tmp1 = out3 ^ in0;</div><div class='add'>+        out1 = tmp1 ^ in6;</div><div class='add'>+        out2 = tmp1 ^ in7;</div><div class='add'>+        out4 = tmp1 ^ in1;</div><div class='add'>+        out6 = tmp1 ^ in4;</div><div class='add'>+        out7 = tmp0 ^ out2;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_D7(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0, tmp1, tmp2;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        tmp0 = in0 ^ in3;</div><div class='add'>+        out3 = in2 ^ in5 ^ in7;</div><div class='add'>+        out2 = tmp0 ^ in5;</div><div class='add'>+        tmp1 = tmp0 ^ out3 ^ in1;</div><div class='add'>+        out1 = tmp1 ^ in6;</div><div class='add'>+        out4 = tmp1 ^ in4;</div><div class='add'>+        tmp2 = out1 ^ in4;</div><div class='add'>+        out6 = tmp2 ^ in1;</div><div class='add'>+        out7 = tmp2 ^ in2;</div><div class='add'>+        out0 = tmp2 ^ in3;</div><div class='add'>+        out5 = tmp2 ^ in0 ^ in7;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_D8(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0, tmp1;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        out4 = in0;</div><div class='add'>+        out5 = in1;</div><div class='add'>+        tmp0 = in1 ^ in2;</div><div class='add'>+        out6 = in0 ^ in2;</div><div class='add'>+        out0 = tmp0 ^ in4;</div><div class='add'>+        tmp1 = tmp0 ^ in3;</div><div class='add'>+        out7 = tmp1 ^ out6;</div><div class='add'>+        out2 = tmp1 ^ in6;</div><div class='add'>+        out3 = out7 ^ in7;</div><div class='add'>+        out1 = tmp1 ^ in1 ^ in5;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_D9(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        out4 = in0 ^ in4;</div><div class='add'>+        out5 = in1 ^ in5;</div><div class='add'>+        out2 = in1 ^ in3 ^ in6;</div><div class='add'>+        out3 = in0 ^ in1 ^ in7;</div><div class='add'>+        out6 = in0 ^ in2 ^ in6;</div><div class='add'>+        out0 = out4 ^ in1 ^ in2;</div><div class='add'>+        out1 = out5 ^ in2 ^ in3;</div><div class='add'>+        out7 = out3 ^ in3;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_DA(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0, tmp1;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        out5 = in1 ^ in4;</div><div class='add'>+        tmp0 = in2 ^ in7;</div><div class='add'>+        tmp1 = in0 ^ in2 ^ in3;</div><div class='add'>+        out0 = tmp0 ^ out5;</div><div class='add'>+        out4 = tmp0 ^ tmp1;</div><div class='add'>+        out2 = tmp0 ^ in3 ^ in6;</div><div class='add'>+        out1 = tmp1 ^ in5;</div><div class='add'>+        out3 = tmp1 ^ in1;</div><div class='add'>+        out6 = out1 ^ in3;</div><div class='add'>+        out7 = out3 ^ in2 ^ in6;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_DB(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0, tmp1, tmp2, tmp3, tmp4;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        tmp0 = in0 ^ in1;</div><div class='add'>+        tmp1 = in1 ^ in5;</div><div class='add'>+        tmp2 = in3 ^ in7;</div><div class='add'>+        out3 = tmp0 ^ in2;</div><div class='add'>+        out5 = tmp1 ^ in4;</div><div class='add'>+        out6 = tmp1 ^ out3 ^ in6;</div><div class='add'>+        out2 = tmp2 ^ in6;</div><div class='add'>+        tmp3 = tmp2 ^ in4;</div><div class='add'>+        tmp4 = out3 ^ in3;</div><div class='add'>+        out4 = tmp3 ^ in0;</div><div class='add'>+        out1 = tmp4 ^ in5;</div><div class='add'>+        out0 = tmp3 ^ tmp4;</div><div class='add'>+        out7 = tmp0 ^ out2;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_DC(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0, tmp1, tmp2, tmp3;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        tmp0 = in0 ^ in2;</div><div class='add'>+        tmp1 = in0 ^ in3;</div><div class='add'>+        out6 = tmp0 ^ in4;</div><div class='add'>+        tmp2 = tmp0 ^ in7;</div><div class='add'>+        out3 = tmp1 ^ in6;</div><div class='add'>+        tmp3 = tmp1 ^ in1;</div><div class='add'>+        out1 = tmp1 ^ tmp2 ^ in5;</div><div class='add'>+        out4 = tmp2 ^ in6;</div><div class='add'>+        out2 = tmp3 ^ in2;</div><div class='add'>+        out7 = tmp3 ^ in5;</div><div class='add'>+        out5 = tmp2 ^ out2;</div><div class='add'>+        out0 = out2 ^ out3 ^ in4;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_DD(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        out3 = in0 ^ in6;</div><div class='add'>+        out2 = in0 ^ in1 ^ in3;</div><div class='add'>+        out6 = out3 ^ in2 ^ in4;</div><div class='add'>+        out7 = out2 ^ in5 ^ in7;</div><div class='add'>+        out0 = out6 ^ in1;</div><div class='add'>+        out4 = out6 ^ in7;</div><div class='add'>+        out5 = out7 ^ in0;</div><div class='add'>+        out1 = out5 ^ in2;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_DE(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0, tmp1;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        tmp0 = in2 ^ in3 ^ in6;</div><div class='add'>+        tmp1 = in3 ^ in4 ^ in7;</div><div class='add'>+        out4 = tmp0 ^ in0;</div><div class='add'>+        out5 = tmp1 ^ in1;</div><div class='add'>+        out3 = out4 ^ in7;</div><div class='add'>+        out2 = out3 ^ in6;</div><div class='add'>+        out1 = out2 ^ in5;</div><div class='add'>+        out6 = tmp1 ^ out1;</div><div class='add'>+        out0 = tmp0 ^ out5;</div><div class='add'>+        out7 = out0 ^ out1 ^ in4;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_DF(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0, tmp1, tmp2;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        out2 = in0 ^ in3 ^ in7;</div><div class='add'>+        tmp0 = out2 ^ in1 ^ in5;</div><div class='add'>+        out1 = tmp0 ^ in2;</div><div class='add'>+        out7 = tmp0 ^ in6;</div><div class='add'>+        out5 = tmp0 ^ in0 ^ in4;</div><div class='add'>+        tmp1 = out1 ^ out5 ^ in6;</div><div class='add'>+        out4 = tmp1 ^ in3;</div><div class='add'>+        out6 = tmp1 ^ in5;</div><div class='add'>+        tmp2 = tmp1 ^ in7;</div><div class='add'>+        out0 = tmp2 ^ in1;</div><div class='add'>+        out3 = tmp2 ^ in4;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_E0(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0, tmp1;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        out3 = in1 ^ in7;</div><div class='add'>+        tmp0 = in2 ^ in4;</div><div class='add'>+        out4 = out3 ^ in3 ^ in5;</div><div class='add'>+        out2 = tmp0 ^ in1;</div><div class='add'>+        tmp1 = tmp0 ^ in6;</div><div class='add'>+        out0 = out4 ^ in2;</div><div class='add'>+        out6 = out4 ^ in0;</div><div class='add'>+        out1 = tmp1 ^ in3;</div><div class='add'>+        out5 = tmp1 ^ in0;</div><div class='add'>+        out7 = out5 ^ in1;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_E1(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0, tmp1, tmp2, tmp3;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        out2 = in1 ^ in4;</div><div class='add'>+        tmp0 = in1 ^ in7;</div><div class='add'>+        out3 = tmp0 ^ in3;</div><div class='add'>+        tmp1 = out3 ^ in5;</div><div class='add'>+        out4 = tmp1 ^ in4;</div><div class='add'>+        tmp2 = tmp1 ^ in0;</div><div class='add'>+        out0 = tmp2 ^ in2;</div><div class='add'>+        out6 = tmp2 ^ in6;</div><div class='add'>+        tmp3 = out0 ^ out4 ^ in6;</div><div class='add'>+        out5 = tmp3 ^ in5;</div><div class='add'>+        out7 = tmp0 ^ tmp3;</div><div class='add'>+        out1 = tmp2 ^ out5 ^ in7;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_E2(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        out3 = in1 ^ in2;</div><div class='add'>+        out4 = in1 ^ in5;</div><div class='add'>+        out2 = in2 ^ in4 ^ in7;</div><div class='add'>+        out5 = in0 ^ in2 ^ in6;</div><div class='add'>+        out0 = out3 ^ in3 ^ in5;</div><div class='add'>+        out7 = out3 ^ in0 ^ in4;</div><div class='add'>+        out6 = out2 ^ out7 ^ in3;</div><div class='add'>+        out1 = out5 ^ in3 ^ in4;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_E3(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0, tmp1, tmp2, tmp3, tmp4;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        out2 = in4 ^ in7;</div><div class='add'>+        tmp0 = in1 ^ in3;</div><div class='add'>+        out3 = tmp0 ^ in2;</div><div class='add'>+        tmp1 = out3 ^ in0;</div><div class='add'>+        out0 = tmp1 ^ in5;</div><div class='add'>+        tmp2 = tmp1 ^ in4;</div><div class='add'>+        out1 = tmp2 ^ in6;</div><div class='add'>+        tmp3 = tmp2 ^ in3;</div><div class='add'>+        out7 = tmp3 ^ in7;</div><div class='add'>+        out6 = out1 ^ out2 ^ in2;</div><div class='add'>+        tmp4 = tmp0 ^ out0;</div><div class='add'>+        out5 = tmp4 ^ in6;</div><div class='add'>+        out4 = tmp3 ^ tmp4;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_E4(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0, tmp1, tmp2;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        out3 = in6;</div><div class='add'>+        tmp0 = in0 ^ in4;</div><div class='add'>+        tmp1 = tmp0 ^ in2 ^ in6;</div><div class='add'>+        out2 = tmp1 ^ in1;</div><div class='add'>+        out7 = out2 ^ in5;</div><div class='add'>+        tmp2 = tmp0 ^ out7;</div><div class='add'>+        out4 = tmp2 ^ in3;</div><div class='add'>+        out0 = out4 ^ in7;</div><div class='add'>+        out6 = tmp1 ^ out0;</div><div class='add'>+        out5 = tmp2 ^ out6;</div><div class='add'>+        out1 = out5 ^ in0;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_E5(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0, tmp1, tmp2;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        out3 = in3 ^ in6;</div><div class='add'>+        tmp0 = in0 ^ in1;</div><div class='add'>+        tmp1 = in5 ^ in7;</div><div class='add'>+        out2 = tmp0 ^ in4 ^ in6;</div><div class='add'>+        tmp2 = tmp1 ^ out2;</div><div class='add'>+        out6 = tmp2 ^ in3;</div><div class='add'>+        out7 = tmp2 ^ in2;</div><div class='add'>+        out0 = out6 ^ in2 ^ in4;</div><div class='add'>+        out5 = out6 ^ in1 ^ in2;</div><div class='add'>+        out1 = tmp0 ^ out5 ^ in5;</div><div class='add'>+        out4 = tmp1 ^ out1;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_E6(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        out3 = in2 ^ in6 ^ in7;</div><div class='add'>+        out2 = out3 ^ in0 ^ in4;</div><div class='add'>+        out4 = out3 ^ in1 ^ in5;</div><div class='add'>+        out1 = out2 ^ in3;</div><div class='add'>+        out7 = out2 ^ out4 ^ in2;</div><div class='add'>+        out0 = out4 ^ in3 ^ in7;</div><div class='add'>+        out5 = out1 ^ in4;</div><div class='add'>+        out6 = out0 ^ out2 ^ in5;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_E7(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0, tmp1, tmp2, tmp3, tmp4;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        tmp0 = in2 ^ in3;</div><div class='add'>+        out3 = tmp0 ^ in6 ^ in7;</div><div class='add'>+        tmp1 = out3 ^ in0;</div><div class='add'>+        out5 = tmp1 ^ in5;</div><div class='add'>+        tmp2 = tmp1 ^ in4;</div><div class='add'>+        tmp3 = out5 ^ in7;</div><div class='add'>+        out1 = tmp2 ^ in1;</div><div class='add'>+        out0 = tmp3 ^ in1;</div><div class='add'>+        out6 = out1 ^ in2;</div><div class='add'>+        out2 = tmp0 ^ tmp2;</div><div class='add'>+        tmp4 = tmp3 ^ out6;</div><div class='add'>+        out4 = tmp4 ^ in6;</div><div class='add'>+        out7 = tmp4 ^ in0;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_E8(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0, tmp1, tmp2, tmp3;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        out4 = in3 ^ in6;</div><div class='add'>+        tmp0 = in4 ^ in7;</div><div class='add'>+        out1 = in2 ^ in3 ^ in4;</div><div class='add'>+        out5 = tmp0 ^ in0;</div><div class='add'>+        tmp1 = tmp0 ^ in1;</div><div class='add'>+        tmp2 = tmp1 ^ in5;</div><div class='add'>+        out0 = tmp1 ^ out1;</div><div class='add'>+        out2 = tmp2 ^ in2;</div><div class='add'>+        out6 = tmp2 ^ out5;</div><div class='add'>+        tmp3 = out6 ^ in6;</div><div class='add'>+        out3 = tmp3 ^ in7;</div><div class='add'>+        out7 = tmp3 ^ in2 ^ in5;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_E9(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0, tmp1, tmp2;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        tmp0 = in0 ^ in1;</div><div class='add'>+        tmp1 = in3 ^ in6;</div><div class='add'>+        tmp2 = tmp0 ^ in6;</div><div class='add'>+        out4 = tmp1 ^ in4;</div><div class='add'>+        out6 = tmp2 ^ in5;</div><div class='add'>+        out7 = tmp2 ^ in2 ^ in7;</div><div class='add'>+        out3 = out6 ^ in3 ^ in7;</div><div class='add'>+        out0 = tmp1 ^ out7;</div><div class='add'>+        out2 = out3 ^ out4 ^ in0;</div><div class='add'>+        out5 = tmp0 ^ out2;</div><div class='add'>+        out1 = out0 ^ out5 ^ in5;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_EA(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        out4 = in6 ^ in7;</div><div class='add'>+        out5 = in0 ^ in7;</div><div class='add'>+        out6 = in0 ^ in1;</div><div class='add'>+        out0 = in1 ^ in2 ^ in3;</div><div class='add'>+        out2 = in2 ^ in4 ^ in5;</div><div class='add'>+        out7 = out6 ^ in2;</div><div class='add'>+        out1 = out0 ^ out6 ^ in4;</div><div class='add'>+        out3 = out7 ^ in5 ^ in6;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_EB(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0, tmp1;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        out2 = in4 ^ in5;</div><div class='add'>+        tmp0 = in0 ^ in1;</div><div class='add'>+        out4 = in4 ^ in6 ^ in7;</div><div class='add'>+        out5 = in0 ^ in5 ^ in7;</div><div class='add'>+        out6 = tmp0 ^ in6;</div><div class='add'>+        tmp1 = tmp0 ^ in2;</div><div class='add'>+        out0 = tmp1 ^ in3;</div><div class='add'>+        out7 = tmp1 ^ in7;</div><div class='add'>+        out1 = out0 ^ in4;</div><div class='add'>+        out3 = out0 ^ in5 ^ in6;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_EC(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        out3 = in0 ^ in5;</div><div class='add'>+        out4 = in2 ^ in3 ^ in7;</div><div class='add'>+        out5 = in0 ^ in3 ^ in4;</div><div class='add'>+        out6 = out3 ^ in1 ^ in4;</div><div class='add'>+        out1 = out4 ^ in4;</div><div class='add'>+        out0 = out4 ^ in1 ^ in6;</div><div class='add'>+        out2 = out0 ^ out5 ^ in5;</div><div class='add'>+        out7 = out2 ^ in4 ^ in7;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_ED(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0, tmp1;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        tmp0 = in2 ^ in4;</div><div class='add'>+        tmp1 = in3 ^ in5;</div><div class='add'>+        out4 = tmp0 ^ in3 ^ in7;</div><div class='add'>+        out3 = tmp1 ^ in0;</div><div class='add'>+        out1 = out4 ^ in1;</div><div class='add'>+        out5 = out3 ^ in4;</div><div class='add'>+        out7 = out1 ^ out5 ^ in6;</div><div class='add'>+        out2 = tmp0 ^ out7;</div><div class='add'>+        out0 = tmp1 ^ out7;</div><div class='add'>+        out6 = out2 ^ in7;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_EE(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0, tmp1, tmp2, tmp3;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        out4 = in2;</div><div class='add'>+        tmp0 = in0 ^ in1;</div><div class='add'>+        out5 = in0 ^ in3;</div><div class='add'>+        tmp1 = tmp0 ^ in2;</div><div class='add'>+        out6 = tmp0 ^ in4;</div><div class='add'>+        tmp2 = tmp1 ^ out5;</div><div class='add'>+        out7 = tmp1 ^ in5;</div><div class='add'>+        out1 = tmp2 ^ out6 ^ in7;</div><div class='add'>+        out0 = tmp2 ^ in6;</div><div class='add'>+        tmp3 = out7 ^ in1;</div><div class='add'>+        out3 = tmp3 ^ in7;</div><div class='add'>+        out2 = tmp3 ^ in4 ^ in6;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_EF(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0, tmp1;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        out4 = in2 ^ in4;</div><div class='add'>+        tmp0 = in0 ^ in5;</div><div class='add'>+        tmp1 = in4 ^ in6;</div><div class='add'>+        out5 = tmp0 ^ in3;</div><div class='add'>+        out2 = tmp0 ^ tmp1;</div><div class='add'>+        out6 = tmp1 ^ in0 ^ in1;</div><div class='add'>+        out3 = out5 ^ in2 ^ in7;</div><div class='add'>+        out7 = out3 ^ in1 ^ in3;</div><div class='add'>+        out0 = out4 ^ out6 ^ in3;</div><div class='add'>+        out1 = tmp1 ^ out0 ^ in7;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_F0(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0, tmp1, tmp2, tmp3;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        tmp0 = in1 ^ in2;</div><div class='add'>+        tmp1 = in4 ^ in5;</div><div class='add'>+        out2 = tmp0 ^ in6;</div><div class='add'>+        out3 = tmp1 ^ in1;</div><div class='add'>+        tmp2 = tmp1 ^ in7;</div><div class='add'>+        out1 = out2 ^ out3 ^ in3;</div><div class='add'>+        tmp3 = tmp0 ^ tmp2;</div><div class='add'>+        out0 = tmp3 ^ in3;</div><div class='add'>+        out5 = tmp3 ^ in0;</div><div class='add'>+        out4 = out1 ^ out5 ^ in4;</div><div class='add'>+        out7 = out4 ^ in2;</div><div class='add'>+        out6 = tmp2 ^ out7;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_F1(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0, tmp1, tmp2, tmp3;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        out2 = in1 ^ in6;</div><div class='add'>+        tmp0 = in3 ^ in5;</div><div class='add'>+        out3 = tmp0 ^ in1 ^ in4;</div><div class='add'>+        tmp1 = out3 ^ in2;</div><div class='add'>+        out1 = tmp1 ^ in6;</div><div class='add'>+        tmp2 = tmp1 ^ in0;</div><div class='add'>+        tmp3 = out1 ^ in5;</div><div class='add'>+        out0 = tmp2 ^ in7;</div><div class='add'>+        out6 = tmp2 ^ in4;</div><div class='add'>+        out7 = tmp3 ^ in0;</div><div class='add'>+        out5 = tmp0 ^ out0;</div><div class='add'>+        out4 = tmp3 ^ out5 ^ in1;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_F2(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0, tmp1, tmp2, tmp3;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        tmp0 = in4 ^ in5;</div><div class='add'>+        out2 = in2 ^ in6 ^ in7;</div><div class='add'>+        tmp1 = tmp0 ^ in1;</div><div class='add'>+        tmp2 = tmp1 ^ in2;</div><div class='add'>+        out0 = tmp2 ^ in3;</div><div class='add'>+        out3 = tmp2 ^ in7;</div><div class='add'>+        out5 = out3 ^ in0 ^ in4;</div><div class='add'>+        tmp3 = tmp0 ^ out5;</div><div class='add'>+        out7 = tmp3 ^ in3;</div><div class='add'>+        out4 = tmp3 ^ out2;</div><div class='add'>+        out1 = out0 ^ out4 ^ in4;</div><div class='add'>+        out6 = tmp1 ^ out1;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_F3(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0, tmp1;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        out2 = in6 ^ in7;</div><div class='add'>+        tmp0 = in0 ^ in1;</div><div class='add'>+        out4 = tmp0 ^ in6;</div><div class='add'>+        tmp1 = tmp0 ^ in2;</div><div class='add'>+        out5 = tmp1 ^ in7;</div><div class='add'>+        out6 = tmp1 ^ in3;</div><div class='add'>+        out7 = out6 ^ in4;</div><div class='add'>+        out0 = out7 ^ in5;</div><div class='add'>+        out1 = out0 ^ in6;</div><div class='add'>+        out3 = out0 ^ in0 ^ in7;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_F4(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        out2 = in0 ^ in1 ^ in2;</div><div class='add'>+        tmp0 = out2 ^ in3;</div><div class='add'>+        out4 = tmp0 ^ in4;</div><div class='add'>+        out5 = out4 ^ in5;</div><div class='add'>+        out6 = out5 ^ in6;</div><div class='add'>+        out7 = out6 ^ in7;</div><div class='add'>+        out0 = out7 ^ in0;</div><div class='add'>+        out1 = out0 ^ in1;</div><div class='add'>+        out3 = tmp0 ^ out7;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_F5(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        out2 = in0 ^ in1;</div><div class='add'>+        tmp0 = out2 ^ in2;</div><div class='add'>+        out4 = tmp0 ^ in3;</div><div class='add'>+        out5 = out4 ^ in4;</div><div class='add'>+        out6 = out5 ^ in5;</div><div class='add'>+        out7 = out6 ^ in6;</div><div class='add'>+        out0 = out7 ^ in7;</div><div class='add'>+        out1 = out0 ^ in0;</div><div class='add'>+        out3 = tmp0 ^ out0;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_F6(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0, tmp1;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        tmp0 = in0 ^ in7;</div><div class='add'>+        out2 = tmp0 ^ in2;</div><div class='add'>+        out4 = out2 ^ in1 ^ in4;</div><div class='add'>+        out7 = out4 ^ in3 ^ in5;</div><div class='add'>+        out5 = out7 ^ in4 ^ in7;</div><div class='add'>+        out0 = tmp0 ^ out7 ^ in6;</div><div class='add'>+        tmp1 = out0 ^ in1;</div><div class='add'>+        out6 = out0 ^ in0 ^ in5;</div><div class='add'>+        out3 = tmp1 ^ in3;</div><div class='add'>+        out1 = tmp0 ^ tmp1;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_F7(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        out2 = in0 ^ in7;</div><div class='add'>+        tmp0 = out2 ^ in1;</div><div class='add'>+        out4 = tmp0 ^ in2;</div><div class='add'>+        out5 = out4 ^ in3 ^ in7;</div><div class='add'>+        out6 = out5 ^ in4;</div><div class='add'>+        out7 = out6 ^ in5;</div><div class='add'>+        out0 = out7 ^ in6;</div><div class='add'>+        out1 = out0 ^ in7;</div><div class='add'>+        out3 = tmp0 ^ out1;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_F8(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0, tmp1, tmp2;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        tmp0 = in0 ^ in4;</div><div class='add'>+        tmp1 = in3 ^ in5;</div><div class='add'>+        tmp2 = tmp0 ^ in6;</div><div class='add'>+        out4 = tmp0 ^ tmp1;</div><div class='add'>+        out1 = tmp1 ^ in2 ^ in4;</div><div class='add'>+        out3 = tmp2 ^ in1;</div><div class='add'>+        out5 = out3 ^ in5;</div><div class='add'>+        out7 = out1 ^ out5 ^ in7;</div><div class='add'>+        out6 = tmp1 ^ out7;</div><div class='add'>+        out0 = tmp2 ^ out7;</div><div class='add'>+        out2 = out6 ^ in0;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_F9(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0, tmp1, tmp2, tmp3, tmp4;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        tmp0 = in3 ^ in5;</div><div class='add'>+        tmp1 = in0 ^ in6;</div><div class='add'>+        out4 = tmp0 ^ in0;</div><div class='add'>+        tmp2 = tmp1 ^ in4;</div><div class='add'>+        tmp3 = tmp1 ^ in2;</div><div class='add'>+        out5 = tmp2 ^ in1;</div><div class='add'>+        out3 = out5 ^ in3;</div><div class='add'>+        tmp4 = tmp3 ^ out3;</div><div class='add'>+        out1 = tmp4 ^ in5;</div><div class='add'>+        out0 = tmp4 ^ in0 ^ in7;</div><div class='add'>+        out6 = tmp0 ^ out0 ^ in4;</div><div class='add'>+        out7 = tmp2 ^ tmp4;</div><div class='add'>+        out2 = tmp3 ^ out6;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_FA(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0, tmp1, tmp2, tmp3;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        tmp0 = in0 ^ in1;</div><div class='add'>+        tmp1 = tmp0 ^ in2;</div><div class='add'>+        tmp2 = tmp0 ^ in5;</div><div class='add'>+        tmp3 = tmp1 ^ in7;</div><div class='add'>+        out5 = tmp2 ^ in6;</div><div class='add'>+        out6 = tmp3 ^ in6;</div><div class='add'>+        out7 = tmp3 ^ in3;</div><div class='add'>+        out3 = out6 ^ in4;</div><div class='add'>+        out2 = tmp1 ^ out5;</div><div class='add'>+        out4 = out2 ^ out3 ^ in1;</div><div class='add'>+        out0 = out4 ^ out7 ^ in5;</div><div class='add'>+        out1 = tmp2 ^ out0;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_FB(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0, tmp1;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        out2 = in5 ^ in6;</div><div class='add'>+        tmp0 = in0 ^ in1;</div><div class='add'>+        out4 = in0 ^ in5 ^ in7;</div><div class='add'>+        out5 = tmp0 ^ in6;</div><div class='add'>+        tmp1 = tmp0 ^ in2;</div><div class='add'>+        out6 = tmp1 ^ in7;</div><div class='add'>+        out7 = tmp1 ^ in3;</div><div class='add'>+        out0 = out7 ^ in4;</div><div class='add'>+        out1 = out0 ^ in5;</div><div class='add'>+        out3 = out0 ^ in6 ^ in7;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_FC(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0, tmp1, tmp2, tmp3;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        tmp0 = in1 ^ in2;</div><div class='add'>+        tmp1 = in0 ^ in7;</div><div class='add'>+        out2 = tmp0 ^ tmp1 ^ in5;</div><div class='add'>+        out3 = tmp1 ^ in4;</div><div class='add'>+        tmp2 = out2 ^ in6;</div><div class='add'>+        out6 = tmp2 ^ in4;</div><div class='add'>+        out7 = tmp2 ^ in3;</div><div class='add'>+        out4 = out6 ^ in1 ^ in3;</div><div class='add'>+        tmp3 = out4 ^ in0;</div><div class='add'>+        out1 = tmp3 ^ in6;</div><div class='add'>+        out0 = tmp3 ^ in1 ^ in5;</div><div class='add'>+        out5 = tmp0 ^ out4;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_FD(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0, tmp1, tmp2, tmp3;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        tmp0 = in0 ^ in5;</div><div class='add'>+        tmp1 = in1 ^ in7;</div><div class='add'>+        out2 = tmp0 ^ tmp1;</div><div class='add'>+        out6 = out2 ^ in2 ^ in4;</div><div class='add'>+        tmp2 = out6 ^ in0;</div><div class='add'>+        out1 = tmp2 ^ in3;</div><div class='add'>+        out0 = tmp0 ^ out1 ^ in6;</div><div class='add'>+        out5 = out0 ^ in2;</div><div class='add'>+        tmp3 = out5 ^ in1;</div><div class='add'>+        out3 = tmp3 ^ in6;</div><div class='add'>+        out7 = tmp2 ^ tmp3;</div><div class='add'>+        out4 = tmp1 ^ out7;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_FE(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0, tmp1, tmp2, tmp3, tmp4;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        tmp0 = in0 ^ in2;</div><div class='add'>+        out2 = tmp0 ^ in5;</div><div class='add'>+        out3 = tmp0 ^ in4;</div><div class='add'>+        tmp1 = out3 ^ in6;</div><div class='add'>+        out4 = tmp1 ^ in5;</div><div class='add'>+        tmp2 = tmp1 ^ in1;</div><div class='add'>+        out6 = tmp2 ^ in7;</div><div class='add'>+        tmp3 = tmp2 ^ in0;</div><div class='add'>+        out0 = tmp3 ^ in3;</div><div class='add'>+        tmp4 = out0 ^ out4 ^ in7;</div><div class='add'>+        out5 = tmp4 ^ in6;</div><div class='add'>+        out7 = tmp4 ^ in2;</div><div class='add'>+        out1 = tmp3 ^ out5;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf8_muladd_FF(void *out, void *in)</div><div class='add'>+{</div><div class='add'>+    unsigned int i;</div><div class='add'>+    uint64_t *in_ptr = (uint64_t *)in;</div><div class='add'>+    uint64_t *out_ptr = (uint64_t *)out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; WIDTH; i++) {</div><div class='add'>+        uint64_t out0, out1, out2, out3, out4, out5, out6, out7;</div><div class='add'>+        uint64_t tmp0, tmp1, tmp2, tmp3;</div><div class='add'>+</div><div class='add'>+        uint64_t in0 = out_ptr[0];</div><div class='add'>+        uint64_t in1 = out_ptr[WIDTH];</div><div class='add'>+        uint64_t in2 = out_ptr[WIDTH * 2];</div><div class='add'>+        uint64_t in3 = out_ptr[WIDTH * 3];</div><div class='add'>+        uint64_t in4 = out_ptr[WIDTH * 4];</div><div class='add'>+        uint64_t in5 = out_ptr[WIDTH * 5];</div><div class='add'>+        uint64_t in6 = out_ptr[WIDTH * 6];</div><div class='add'>+        uint64_t in7 = out_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        out2 = in0 ^ in5;</div><div class='add'>+        tmp0 = in4 ^ in7;</div><div class='add'>+        tmp1 = out2 ^ in2;</div><div class='add'>+        out4 = tmp1 ^ in6;</div><div class='add'>+        out7 = tmp1 ^ in1 ^ in3;</div><div class='add'>+        out1 = tmp0 ^ out7;</div><div class='add'>+        tmp2 = out1 ^ in5;</div><div class='add'>+        out6 = tmp2 ^ in3;</div><div class='add'>+        tmp3 = tmp2 ^ in7;</div><div class='add'>+        out0 = tmp3 ^ in6;</div><div class='add'>+        out3 = tmp3 ^ in1;</div><div class='add'>+        out5 = tmp0 ^ out0 ^ in2;</div><div class='add'>+</div><div class='add'>+        out_ptr[0] = out0 ^ in_ptr[0];</div><div class='add'>+        out_ptr[WIDTH] = out1 ^ in_ptr[WIDTH];</div><div class='add'>+        out_ptr[WIDTH * 2] = out2 ^ in_ptr[WIDTH * 2];</div><div class='add'>+        out_ptr[WIDTH * 3] = out3 ^ in_ptr[WIDTH * 3];</div><div class='add'>+        out_ptr[WIDTH * 4] = out4 ^ in_ptr[WIDTH * 4];</div><div class='add'>+        out_ptr[WIDTH * 5] = out5 ^ in_ptr[WIDTH * 5];</div><div class='add'>+        out_ptr[WIDTH * 6] = out6 ^ in_ptr[WIDTH * 6];</div><div class='add'>+        out_ptr[WIDTH * 7] = out7 ^ in_ptr[WIDTH * 7];</div><div class='add'>+</div><div class='add'>+        in_ptr++;</div><div class='add'>+        out_ptr++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void (*gf8_muladd[])(void *out, void *in) = {</div><div class='add'>+    gf8_muladd_00, gf8_muladd_01, gf8_muladd_02, gf8_muladd_03, gf8_muladd_04,</div><div class='add'>+    gf8_muladd_05, gf8_muladd_06, gf8_muladd_07, gf8_muladd_08, gf8_muladd_09,</div><div class='add'>+    gf8_muladd_0A, gf8_muladd_0B, gf8_muladd_0C, gf8_muladd_0D, gf8_muladd_0E,</div><div class='add'>+    gf8_muladd_0F, gf8_muladd_10, gf8_muladd_11, gf8_muladd_12, gf8_muladd_13,</div><div class='add'>+    gf8_muladd_14, gf8_muladd_15, gf8_muladd_16, gf8_muladd_17, gf8_muladd_18,</div><div class='add'>+    gf8_muladd_19, gf8_muladd_1A, gf8_muladd_1B, gf8_muladd_1C, gf8_muladd_1D,</div><div class='add'>+    gf8_muladd_1E, gf8_muladd_1F, gf8_muladd_20, gf8_muladd_21, gf8_muladd_22,</div><div class='add'>+    gf8_muladd_23, gf8_muladd_24, gf8_muladd_25, gf8_muladd_26, gf8_muladd_27,</div><div class='add'>+    gf8_muladd_28, gf8_muladd_29, gf8_muladd_2A, gf8_muladd_2B, gf8_muladd_2C,</div><div class='add'>+    gf8_muladd_2D, gf8_muladd_2E, gf8_muladd_2F, gf8_muladd_30, gf8_muladd_31,</div><div class='add'>+    gf8_muladd_32, gf8_muladd_33, gf8_muladd_34, gf8_muladd_35, gf8_muladd_36,</div><div class='add'>+    gf8_muladd_37, gf8_muladd_38, gf8_muladd_39, gf8_muladd_3A, gf8_muladd_3B,</div><div class='add'>+    gf8_muladd_3C, gf8_muladd_3D, gf8_muladd_3E, gf8_muladd_3F, gf8_muladd_40,</div><div class='add'>+    gf8_muladd_41, gf8_muladd_42, gf8_muladd_43, gf8_muladd_44, gf8_muladd_45,</div><div class='add'>+    gf8_muladd_46, gf8_muladd_47, gf8_muladd_48, gf8_muladd_49, gf8_muladd_4A,</div><div class='add'>+    gf8_muladd_4B, gf8_muladd_4C, gf8_muladd_4D, gf8_muladd_4E, gf8_muladd_4F,</div><div class='add'>+    gf8_muladd_50, gf8_muladd_51, gf8_muladd_52, gf8_muladd_53, gf8_muladd_54,</div><div class='add'>+    gf8_muladd_55, gf8_muladd_56, gf8_muladd_57, gf8_muladd_58, gf8_muladd_59,</div><div class='add'>+    gf8_muladd_5A, gf8_muladd_5B, gf8_muladd_5C, gf8_muladd_5D, gf8_muladd_5E,</div><div class='add'>+    gf8_muladd_5F, gf8_muladd_60, gf8_muladd_61, gf8_muladd_62, gf8_muladd_63,</div><div class='add'>+    gf8_muladd_64, gf8_muladd_65, gf8_muladd_66, gf8_muladd_67, gf8_muladd_68,</div><div class='add'>+    gf8_muladd_69, gf8_muladd_6A, gf8_muladd_6B, gf8_muladd_6C, gf8_muladd_6D,</div><div class='add'>+    gf8_muladd_6E, gf8_muladd_6F, gf8_muladd_70, gf8_muladd_71, gf8_muladd_72,</div><div class='add'>+    gf8_muladd_73, gf8_muladd_74, gf8_muladd_75, gf8_muladd_76, gf8_muladd_77,</div><div class='add'>+    gf8_muladd_78, gf8_muladd_79, gf8_muladd_7A, gf8_muladd_7B, gf8_muladd_7C,</div><div class='add'>+    gf8_muladd_7D, gf8_muladd_7E, gf8_muladd_7F, gf8_muladd_80, gf8_muladd_81,</div><div class='add'>+    gf8_muladd_82, gf8_muladd_83, gf8_muladd_84, gf8_muladd_85, gf8_muladd_86,</div><div class='add'>+    gf8_muladd_87, gf8_muladd_88, gf8_muladd_89, gf8_muladd_8A, gf8_muladd_8B,</div><div class='add'>+    gf8_muladd_8C, gf8_muladd_8D, gf8_muladd_8E, gf8_muladd_8F, gf8_muladd_90,</div><div class='add'>+    gf8_muladd_91, gf8_muladd_92, gf8_muladd_93, gf8_muladd_94, gf8_muladd_95,</div><div class='add'>+    gf8_muladd_96, gf8_muladd_97, gf8_muladd_98, gf8_muladd_99, gf8_muladd_9A,</div><div class='add'>+    gf8_muladd_9B, gf8_muladd_9C, gf8_muladd_9D, gf8_muladd_9E, gf8_muladd_9F,</div><div class='add'>+    gf8_muladd_A0, gf8_muladd_A1, gf8_muladd_A2, gf8_muladd_A3, gf8_muladd_A4,</div><div class='add'>+    gf8_muladd_A5, gf8_muladd_A6, gf8_muladd_A7, gf8_muladd_A8, gf8_muladd_A9,</div><div class='add'>+    gf8_muladd_AA, gf8_muladd_AB, gf8_muladd_AC, gf8_muladd_AD, gf8_muladd_AE,</div><div class='add'>+    gf8_muladd_AF, gf8_muladd_B0, gf8_muladd_B1, gf8_muladd_B2, gf8_muladd_B3,</div><div class='add'>+    gf8_muladd_B4, gf8_muladd_B5, gf8_muladd_B6, gf8_muladd_B7, gf8_muladd_B8,</div><div class='add'>+    gf8_muladd_B9, gf8_muladd_BA, gf8_muladd_BB, gf8_muladd_BC, gf8_muladd_BD,</div><div class='add'>+    gf8_muladd_BE, gf8_muladd_BF, gf8_muladd_C0, gf8_muladd_C1, gf8_muladd_C2,</div><div class='add'>+    gf8_muladd_C3, gf8_muladd_C4, gf8_muladd_C5, gf8_muladd_C6, gf8_muladd_C7,</div><div class='add'>+    gf8_muladd_C8, gf8_muladd_C9, gf8_muladd_CA, gf8_muladd_CB, gf8_muladd_CC,</div><div class='add'>+    gf8_muladd_CD, gf8_muladd_CE, gf8_muladd_CF, gf8_muladd_D0, gf8_muladd_D1,</div><div class='add'>+    gf8_muladd_D2, gf8_muladd_D3, gf8_muladd_D4, gf8_muladd_D5, gf8_muladd_D6,</div><div class='add'>+    gf8_muladd_D7, gf8_muladd_D8, gf8_muladd_D9, gf8_muladd_DA, gf8_muladd_DB,</div><div class='add'>+    gf8_muladd_DC, gf8_muladd_DD, gf8_muladd_DE, gf8_muladd_DF, gf8_muladd_E0,</div><div class='add'>+    gf8_muladd_E1, gf8_muladd_E2, gf8_muladd_E3, gf8_muladd_E4, gf8_muladd_E5,</div><div class='add'>+    gf8_muladd_E6, gf8_muladd_E7, gf8_muladd_E8, gf8_muladd_E9, gf8_muladd_EA,</div><div class='add'>+    gf8_muladd_EB, gf8_muladd_EC, gf8_muladd_ED, gf8_muladd_EE, gf8_muladd_EF,</div><div class='add'>+    gf8_muladd_F0, gf8_muladd_F1, gf8_muladd_F2, gf8_muladd_F3, gf8_muladd_F4,</div><div class='add'>+    gf8_muladd_F5, gf8_muladd_F6, gf8_muladd_F7, gf8_muladd_F8, gf8_muladd_F9,</div><div class='add'>+    gf8_muladd_FA, gf8_muladd_FB, gf8_muladd_FC, gf8_muladd_FD, gf8_muladd_FE,</div><div class='add'>+    gf8_muladd_FF};</div><div class='add'>+</div><div class='add'>+static uint64_t zero[EC_METHOD_WORD_SIZE * 8] = {</div><div class='add'>+    0,</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_code_c_prepare(ec_gf_t *gf, uint32_t *values, uint32_t count)</div><div class='add'>+{</div><div class='add'>+    uint32_t i, last, tmp;</div><div class='add'>+</div><div class='add'>+    last = 1;</div><div class='add'>+    for (i = count; i &gt; 0; i--) {</div><div class='add'>+        if (values[i - 1] != 0) {</div><div class='add'>+            tmp = values[i - 1];</div><div class='add'>+            values[i - 1] = ec_gf_div(gf, tmp, last);</div><div class='add'>+            last = tmp;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_code_c_linear(void *dst, void *src, uint64_t offset, uint32_t *values,</div><div class='add'>+                 uint32_t count)</div><div class='add'>+{</div><div class='add'>+    src += offset;</div><div class='add'>+    gf8_muladd_00(dst, src);</div><div class='add'>+    while (--count &gt; 0) {</div><div class='add'>+        src += EC_METHOD_CHUNK_SIZE;</div><div class='add'>+        gf8_muladd[*values](dst, src);</div><div class='add'>+        values++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_code_c_interleaved(void *dst, void **src, uint64_t offset, uint32_t *values,</div><div class='add'>+                      uint32_t count)</div><div class='add'>+{</div><div class='add'>+    uint32_t i, last, tmp;</div><div class='add'>+</div><div class='add'>+    i = 0;</div><div class='add'>+    while ((last = *values++) == 0) {</div><div class='add'>+        i++;</div><div class='add'>+    }</div><div class='add'>+    gf8_muladd_00(dst, src[i++] + offset);</div><div class='add'>+    while (i &lt; count) {</div><div class='add'>+        tmp = *values++;</div><div class='add'>+        if (tmp != 0) {</div><div class='add'>+            gf8_muladd[last](dst, src[i] + offset);</div><div class='add'>+            last = tmp;</div><div class='add'>+        }</div><div class='add'>+        i++;</div><div class='add'>+    }</div><div class='add'>+    gf8_muladd[last](dst, zero);</div><div class='add'>+}</div><div class='head'>diff --git a/xlators/cluster/ec/src/ec-code-c.h b/xlators/cluster/ec/src/ec-code-c.h<br/>new file mode 100644<br/>index 00000000000..42b5a064eb8<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/xlators/cluster/ec/src/ec-code-c.h?id=d1d7a6f35c816822fab51c820e25023863c239c1'>xlators/cluster/ec/src/ec-code-c.h</a></div><div class='hunk'>@@ -0,0 +1,27 @@</div><div class='add'>+/*</div><div class='add'>+  Copyright (c) 2015 DataLab, s.l. &lt;http://www.datalab.es&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#ifndef __EC_CODE_C_H__</div><div class='add'>+#define __EC_CODE_C_H__</div><div class='add'>+</div><div class='add'>+#include "ec-types.h"</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_code_c_prepare(ec_gf_t *gf, uint32_t *values, uint32_t count);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_code_c_linear(void *dst, void *src, uint64_t offset, uint32_t *values,</div><div class='add'>+                 uint32_t count);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_code_c_interleaved(void *dst, void **src, uint64_t offset, uint32_t *values,</div><div class='add'>+                      uint32_t count);</div><div class='add'>+</div><div class='add'>+#endif /* __EC_CODE_C_H__ */</div><div class='head'>diff --git a/xlators/cluster/ec/src/ec-code-intel.c b/xlators/cluster/ec/src/ec-code-intel.c<br/>new file mode 100644<br/>index 00000000000..f1c4e13e321<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/xlators/cluster/ec/src/ec-code-intel.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>xlators/cluster/ec/src/ec-code-intel.c</a></div><div class='hunk'>@@ -0,0 +1,594 @@</div><div class='add'>+/*</div><div class='add'>+  Copyright (c) 2015 DataLab, s.l. &lt;http://www.datalab.es&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#include &lt;inttypes.h&gt;</div><div class='add'>+#include &lt;string.h&gt;</div><div class='add'>+#include &lt;errno.h&gt;</div><div class='add'>+</div><div class='add'>+#include "ec-code-intel.h"</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+ec_code_intel_init(ec_code_intel_t *intel)</div><div class='add'>+{</div><div class='add'>+    memset(intel, 0, sizeof(ec_code_intel_t));</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+ec_code_intel_prefix(ec_code_intel_t *intel, uint8_t prefix)</div><div class='add'>+{</div><div class='add'>+    intel-&gt;prefix.data[intel-&gt;prefix.bytes++] = prefix;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+ec_code_intel_rex(ec_code_intel_t *intel, gf_boolean_t w)</div><div class='add'>+{</div><div class='add'>+    gf_boolean_t present = _gf_false;</div><div class='add'>+</div><div class='add'>+    if (w) {</div><div class='add'>+        intel-&gt;rex.w = 1;</div><div class='add'>+        present = _gf_true;</div><div class='add'>+    }</div><div class='add'>+    if (intel-&gt;modrm.present) {</div><div class='add'>+        if (intel-&gt;modrm.reg &gt; 7) {</div><div class='add'>+            intel-&gt;modrm.reg &amp;= 7;</div><div class='add'>+            intel-&gt;rex.r = 1;</div><div class='add'>+            present = _gf_true;</div><div class='add'>+        }</div><div class='add'>+        if (intel-&gt;sib.present) {</div><div class='add'>+            if (intel-&gt;sib.index &gt; 7) {</div><div class='add'>+                intel-&gt;sib.index &amp;= 7;</div><div class='add'>+                intel-&gt;rex.x = 1;</div><div class='add'>+                present = _gf_true;</div><div class='add'>+            }</div><div class='add'>+            if (intel-&gt;sib.base &gt; 7) {</div><div class='add'>+                intel-&gt;sib.base &amp;= 7;</div><div class='add'>+                intel-&gt;rex.b = 1;</div><div class='add'>+                present = _gf_true;</div><div class='add'>+            }</div><div class='add'>+        } else if (intel-&gt;modrm.rm &gt; 7) {</div><div class='add'>+            intel-&gt;modrm.rm &amp;= 7;</div><div class='add'>+            intel-&gt;rex.b = 1;</div><div class='add'>+            present = _gf_true;</div><div class='add'>+        }</div><div class='add'>+    } else if (intel-&gt;reg &gt; 7) {</div><div class='add'>+        intel-&gt;reg &amp;= 7;</div><div class='add'>+        intel-&gt;rex.b = 1;</div><div class='add'>+        present = _gf_true;</div><div class='add'>+    }</div><div class='add'>+    intel-&gt;rex.present = present;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+ec_code_intel_vex(ec_code_intel_t *intel, gf_boolean_t w, gf_boolean_t l,</div><div class='add'>+                  ec_code_vex_opcode_t opcode, ec_code_vex_prefix_t prefix,</div><div class='add'>+                  uint32_t reg)</div><div class='add'>+{</div><div class='add'>+    ec_code_intel_rex(intel, w);</div><div class='add'>+    if (((intel-&gt;rex.w == 1) || (intel-&gt;rex.x == 0) || (intel-&gt;rex.b == 0)) ||</div><div class='add'>+        ((opcode != VEX_OPCODE_NONE) &amp;&amp; (opcode != VEX_OPCODE_0F))) {</div><div class='add'>+        intel-&gt;rex.present = _gf_false;</div><div class='add'>+</div><div class='add'>+        intel-&gt;vex.bytes = 3;</div><div class='add'>+        intel-&gt;vex.data[0] = 0xC4;</div><div class='add'>+        intel-&gt;vex.data[1] = ((intel-&gt;rex.r &lt;&lt; 7) | (intel-&gt;rex.x &lt;&lt; 6) |</div><div class='add'>+                              (intel-&gt;rex.b &lt;&lt; 5) | opcode) ^</div><div class='add'>+                             0xE0;</div><div class='add'>+        intel-&gt;vex.data[2] = (intel-&gt;rex.w &lt;&lt; 7) | ((~reg &amp; 0x0F) &lt;&lt; 3) |</div><div class='add'>+                             (l ? 0x04 : 0x00) | prefix;</div><div class='add'>+    } else {</div><div class='add'>+        intel-&gt;vex.bytes = 2;</div><div class='add'>+        intel-&gt;vex.data[0] = 0xC5;</div><div class='add'>+        intel-&gt;vex.data[1] = (intel-&gt;rex.r &lt;&lt; 7) | ((~reg &amp; 0x0F) &lt;&lt; 3) |</div><div class='add'>+                             (l ? 0x04 : 0x00) | prefix;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+ec_code_intel_modrm_reg(ec_code_intel_t *intel, uint32_t rm, uint32_t reg)</div><div class='add'>+{</div><div class='add'>+    intel-&gt;modrm.present = _gf_true;</div><div class='add'>+    intel-&gt;modrm.mod = 3;</div><div class='add'>+    intel-&gt;modrm.rm = rm;</div><div class='add'>+    intel-&gt;modrm.reg = reg;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+ec_code_intel_modrm_mem(ec_code_intel_t *intel, uint32_t reg,</div><div class='add'>+                        ec_code_intel_reg_t base, ec_code_intel_reg_t index,</div><div class='add'>+                        uint32_t scale, int32_t offset)</div><div class='add'>+{</div><div class='add'>+    if (index == REG_SP) {</div><div class='add'>+        intel-&gt;invalid = _gf_true;</div><div class='add'>+        return;</div><div class='add'>+    }</div><div class='add'>+    if ((index != REG_NULL) &amp;&amp; (scale != 1) &amp;&amp; (scale != 2) &amp;&amp; (scale != 4) &amp;&amp;</div><div class='add'>+        (scale != 8)) {</div><div class='add'>+        intel-&gt;invalid = _gf_true;</div><div class='add'>+        return;</div><div class='add'>+    }</div><div class='add'>+    scale &gt;&gt;= 1;</div><div class='add'>+    if (scale == 4) {</div><div class='add'>+        scale = 3;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    intel-&gt;modrm.present = _gf_true;</div><div class='add'>+    intel-&gt;modrm.reg = reg;</div><div class='add'>+</div><div class='add'>+    intel-&gt;offset.value = offset;</div><div class='add'>+    if ((offset == 0) &amp;&amp; (base != REG_BP)) {</div><div class='add'>+        intel-&gt;modrm.mod = 0;</div><div class='add'>+        intel-&gt;offset.bytes = 0;</div><div class='add'>+    } else if ((offset &gt;= -128) &amp;&amp; (offset &lt;= 127)) {</div><div class='add'>+        intel-&gt;modrm.mod = 1;</div><div class='add'>+        intel-&gt;offset.bytes = 1;</div><div class='add'>+    } else {</div><div class='add'>+        intel-&gt;modrm.mod = 2;</div><div class='add'>+        intel-&gt;offset.bytes = 4;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    intel-&gt;modrm.rm = base;</div><div class='add'>+    if ((index != REG_NULL) || (base == REG_SP)) {</div><div class='add'>+        intel-&gt;modrm.rm = 4;</div><div class='add'>+        intel-&gt;sib.present = _gf_true;</div><div class='add'>+        intel-&gt;sib.index = index;</div><div class='add'>+        if (index == REG_NULL) {</div><div class='add'>+            intel-&gt;sib.index = 4;</div><div class='add'>+        }</div><div class='add'>+        intel-&gt;sib.scale = scale;</div><div class='add'>+        intel-&gt;sib.base = base;</div><div class='add'>+        if (base == REG_NULL) {</div><div class='add'>+            intel-&gt;sib.base = 5;</div><div class='add'>+            intel-&gt;modrm.mod = 0;</div><div class='add'>+            intel-&gt;offset.bytes = 4;</div><div class='add'>+        }</div><div class='add'>+    } else if (base == REG_NULL) {</div><div class='add'>+        intel-&gt;modrm.mod = 0;</div><div class='add'>+        intel-&gt;modrm.rm = 5;</div><div class='add'>+        intel-&gt;offset.bytes = 4;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+ec_code_intel_op_1(ec_code_intel_t *intel, uint8_t opcode, uint32_t reg)</div><div class='add'>+{</div><div class='add'>+    intel-&gt;reg = reg;</div><div class='add'>+    intel-&gt;opcode.bytes = 1;</div><div class='add'>+    intel-&gt;opcode.data[0] = opcode;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+ec_code_intel_op_2(ec_code_intel_t *intel, uint8_t opcode1, uint8_t opcode2,</div><div class='add'>+                   uint32_t reg)</div><div class='add'>+{</div><div class='add'>+    intel-&gt;reg = reg;</div><div class='add'>+    intel-&gt;opcode.bytes = 2;</div><div class='add'>+    intel-&gt;opcode.data[0] = opcode1;</div><div class='add'>+    intel-&gt;opcode.data[1] = opcode2;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+ec_code_intel_immediate_1(ec_code_intel_t *intel, uint32_t value)</div><div class='add'>+{</div><div class='add'>+    intel-&gt;immediate.bytes = 1;</div><div class='add'>+    intel-&gt;immediate.value = value;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+ec_code_intel_immediate_2(ec_code_intel_t *intel, uint32_t value)</div><div class='add'>+{</div><div class='add'>+    intel-&gt;immediate.bytes = 2;</div><div class='add'>+    intel-&gt;immediate.value = value;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+ec_code_intel_immediate_4(ec_code_intel_t *intel, uint32_t value)</div><div class='add'>+{</div><div class='add'>+    intel-&gt;immediate.bytes = 4;</div><div class='add'>+    intel-&gt;immediate.value = value;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+ec_code_intel_emit(ec_code_builder_t *builder, ec_code_intel_t *intel)</div><div class='add'>+{</div><div class='add'>+    uint8_t insn[15];</div><div class='add'>+    uint32_t i, count;</div><div class='add'>+</div><div class='add'>+    if (intel-&gt;invalid) {</div><div class='add'>+        ec_code_error(builder, EINVAL);</div><div class='add'>+        return;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    count = 0;</div><div class='add'>+    for (i = 0; i &lt; intel-&gt;prefix.bytes; i++) {</div><div class='add'>+        insn[count++] = intel-&gt;prefix.data[i];</div><div class='add'>+    }</div><div class='add'>+    for (i = 0; i &lt; intel-&gt;vex.bytes; i++) {</div><div class='add'>+        insn[count++] = intel-&gt;vex.data[i];</div><div class='add'>+    }</div><div class='add'>+    if (intel-&gt;rex.present) {</div><div class='add'>+        insn[count++] = 0x40 | (intel-&gt;rex.w &lt;&lt; 3) | (intel-&gt;rex.r &lt;&lt; 2) |</div><div class='add'>+                        (intel-&gt;rex.x &lt;&lt; 1) | (intel-&gt;rex.b &lt;&lt; 0);</div><div class='add'>+    }</div><div class='add'>+    for (i = 0; i &lt; intel-&gt;opcode.bytes; i++) {</div><div class='add'>+        insn[count++] = intel-&gt;opcode.data[i];</div><div class='add'>+    }</div><div class='add'>+    if (intel-&gt;modrm.present) {</div><div class='add'>+        insn[count++] = (intel-&gt;modrm.mod &lt;&lt; 6) | (intel-&gt;modrm.reg &lt;&lt; 3) |</div><div class='add'>+                        (intel-&gt;modrm.rm &lt;&lt; 0);</div><div class='add'>+        if (intel-&gt;sib.present) {</div><div class='add'>+            insn[count++] = (intel-&gt;sib.scale &lt;&lt; 6) | (intel-&gt;sib.index &lt;&lt; 3) |</div><div class='add'>+                            (intel-&gt;sib.base &lt;&lt; 0);</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    for (i = 0; i &lt; intel-&gt;offset.bytes; i++) {</div><div class='add'>+        insn[count++] = intel-&gt;offset.data[i];</div><div class='add'>+    }</div><div class='add'>+    for (i = 0; i &lt; intel-&gt;immediate.bytes; i++) {</div><div class='add'>+        insn[count++] = intel-&gt;immediate.data[i];</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ec_code_emit(builder, insn, count);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_code_intel_op_push_r(ec_code_builder_t *builder, ec_code_intel_reg_t reg)</div><div class='add'>+{</div><div class='add'>+    ec_code_intel_t intel;</div><div class='add'>+</div><div class='add'>+    ec_code_intel_init(&amp;intel);</div><div class='add'>+</div><div class='add'>+    ec_code_intel_op_1(&amp;intel, 0x50 | (reg &amp; 7), reg);</div><div class='add'>+    ec_code_intel_rex(&amp;intel, _gf_false);</div><div class='add'>+</div><div class='add'>+    ec_code_intel_emit(builder, &amp;intel);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_code_intel_op_pop_r(ec_code_builder_t *builder, ec_code_intel_reg_t reg)</div><div class='add'>+{</div><div class='add'>+    ec_code_intel_t intel;</div><div class='add'>+</div><div class='add'>+    ec_code_intel_init(&amp;intel);</div><div class='add'>+</div><div class='add'>+    ec_code_intel_op_1(&amp;intel, 0x58 | (reg &amp; 7), reg);</div><div class='add'>+    ec_code_intel_rex(&amp;intel, _gf_false);</div><div class='add'>+</div><div class='add'>+    ec_code_intel_emit(builder, &amp;intel);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_code_intel_op_ret(ec_code_builder_t *builder, uint32_t size)</div><div class='add'>+{</div><div class='add'>+    ec_code_intel_t intel;</div><div class='add'>+</div><div class='add'>+    ec_code_intel_init(&amp;intel);</div><div class='add'>+</div><div class='add'>+    if (size == 0) {</div><div class='add'>+        ec_code_intel_op_1(&amp;intel, 0xC3, 0);</div><div class='add'>+    } else {</div><div class='add'>+        ec_code_intel_immediate_2(&amp;intel, size);</div><div class='add'>+        ec_code_intel_op_1(&amp;intel, 0xC2, 0);</div><div class='add'>+    }</div><div class='add'>+    ec_code_intel_rex(&amp;intel, _gf_false);</div><div class='add'>+</div><div class='add'>+    ec_code_intel_emit(builder, &amp;intel);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_code_intel_op_mov_r2r(ec_code_builder_t *builder, ec_code_intel_reg_t src,</div><div class='add'>+                         ec_code_intel_reg_t dst)</div><div class='add'>+{</div><div class='add'>+    ec_code_intel_t intel;</div><div class='add'>+</div><div class='add'>+    ec_code_intel_init(&amp;intel);</div><div class='add'>+</div><div class='add'>+    ec_code_intel_modrm_reg(&amp;intel, dst, src);</div><div class='add'>+    ec_code_intel_op_1(&amp;intel, 0x89, 0);</div><div class='add'>+    ec_code_intel_rex(&amp;intel, _gf_true);</div><div class='add'>+</div><div class='add'>+    ec_code_intel_emit(builder, &amp;intel);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_code_intel_op_mov_r2m(ec_code_builder_t *builder, ec_code_intel_reg_t src,</div><div class='add'>+                         ec_code_intel_reg_t base, ec_code_intel_reg_t index,</div><div class='add'>+                         uint32_t scale, int32_t offset)</div><div class='add'>+{</div><div class='add'>+    ec_code_intel_t intel;</div><div class='add'>+</div><div class='add'>+    ec_code_intel_init(&amp;intel);</div><div class='add'>+</div><div class='add'>+    ec_code_intel_modrm_mem(&amp;intel, src, base, index, scale, offset);</div><div class='add'>+    ec_code_intel_op_1(&amp;intel, 0x89, 0);</div><div class='add'>+    ec_code_intel_rex(&amp;intel, _gf_true);</div><div class='add'>+</div><div class='add'>+    ec_code_intel_emit(builder, &amp;intel);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_code_intel_op_mov_m2r(ec_code_builder_t *builder, ec_code_intel_reg_t base,</div><div class='add'>+                         ec_code_intel_reg_t index, uint32_t scale,</div><div class='add'>+                         int32_t offset, ec_code_intel_reg_t dst)</div><div class='add'>+{</div><div class='add'>+    ec_code_intel_t intel;</div><div class='add'>+</div><div class='add'>+    ec_code_intel_init(&amp;intel);</div><div class='add'>+</div><div class='add'>+    ec_code_intel_modrm_mem(&amp;intel, dst, base, index, scale, offset);</div><div class='add'>+    ec_code_intel_op_1(&amp;intel, 0x8B, 0);</div><div class='add'>+    ec_code_intel_rex(&amp;intel, _gf_true);</div><div class='add'>+</div><div class='add'>+    ec_code_intel_emit(builder, &amp;intel);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_code_intel_op_xor_r2r(ec_code_builder_t *builder, ec_code_intel_reg_t src,</div><div class='add'>+                         ec_code_intel_reg_t dst)</div><div class='add'>+{</div><div class='add'>+    ec_code_intel_t intel;</div><div class='add'>+</div><div class='add'>+    ec_code_intel_init(&amp;intel);</div><div class='add'>+</div><div class='add'>+    ec_code_intel_modrm_reg(&amp;intel, dst, src);</div><div class='add'>+    ec_code_intel_op_1(&amp;intel, 0x31, 0);</div><div class='add'>+    ec_code_intel_rex(&amp;intel, _gf_true);</div><div class='add'>+</div><div class='add'>+    ec_code_intel_emit(builder, &amp;intel);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_code_intel_op_xor_m2r(ec_code_builder_t *builder, ec_code_intel_reg_t base,</div><div class='add'>+                         ec_code_intel_reg_t index, uint32_t scale,</div><div class='add'>+                         int32_t offset, ec_code_intel_reg_t dst)</div><div class='add'>+{</div><div class='add'>+    ec_code_intel_t intel;</div><div class='add'>+</div><div class='add'>+    ec_code_intel_init(&amp;intel);</div><div class='add'>+</div><div class='add'>+    ec_code_intel_modrm_mem(&amp;intel, dst, base, index, scale, offset);</div><div class='add'>+    ec_code_intel_op_1(&amp;intel, 0x33, 0);</div><div class='add'>+    ec_code_intel_rex(&amp;intel, _gf_true);</div><div class='add'>+</div><div class='add'>+    ec_code_intel_emit(builder, &amp;intel);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_code_intel_op_add_i2r(ec_code_builder_t *builder, int32_t value,</div><div class='add'>+                         ec_code_intel_reg_t reg)</div><div class='add'>+{</div><div class='add'>+    ec_code_intel_t intel;</div><div class='add'>+</div><div class='add'>+    ec_code_intel_init(&amp;intel);</div><div class='add'>+</div><div class='add'>+    if ((value &gt;= -128) &amp;&amp; (value &lt; 128)) {</div><div class='add'>+        ec_code_intel_modrm_reg(&amp;intel, reg, 0);</div><div class='add'>+        ec_code_intel_op_1(&amp;intel, 0x83, 0);</div><div class='add'>+        ec_code_intel_immediate_1(&amp;intel, value);</div><div class='add'>+    } else {</div><div class='add'>+        if (reg == REG_AX) {</div><div class='add'>+            ec_code_intel_op_1(&amp;intel, 0x05, reg);</div><div class='add'>+        } else {</div><div class='add'>+            ec_code_intel_modrm_reg(&amp;intel, reg, 0);</div><div class='add'>+            ec_code_intel_op_1(&amp;intel, 0x81, 0);</div><div class='add'>+        }</div><div class='add'>+        ec_code_intel_immediate_4(&amp;intel, value);</div><div class='add'>+    }</div><div class='add'>+    ec_code_intel_rex(&amp;intel, _gf_true);</div><div class='add'>+</div><div class='add'>+    ec_code_intel_emit(builder, &amp;intel);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_code_intel_op_test_i2r(ec_code_builder_t *builder, uint32_t value,</div><div class='add'>+                          ec_code_intel_reg_t reg)</div><div class='add'>+{</div><div class='add'>+    ec_code_intel_t intel;</div><div class='add'>+</div><div class='add'>+    ec_code_intel_init(&amp;intel);</div><div class='add'>+</div><div class='add'>+    if (reg == REG_AX) {</div><div class='add'>+        ec_code_intel_op_1(&amp;intel, 0xA9, reg);</div><div class='add'>+    } else {</div><div class='add'>+        ec_code_intel_modrm_reg(&amp;intel, reg, 0);</div><div class='add'>+        ec_code_intel_op_1(&amp;intel, 0xF7, 0);</div><div class='add'>+    }</div><div class='add'>+    ec_code_intel_immediate_4(&amp;intel, value);</div><div class='add'>+    ec_code_intel_rex(&amp;intel, _gf_true);</div><div class='add'>+</div><div class='add'>+    ec_code_intel_emit(builder, &amp;intel);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_code_intel_op_jne(ec_code_builder_t *builder, uint32_t address)</div><div class='add'>+{</div><div class='add'>+    ec_code_intel_t intel;</div><div class='add'>+    int32_t rel;</div><div class='add'>+</div><div class='add'>+    ec_code_intel_init(&amp;intel);</div><div class='add'>+</div><div class='add'>+    rel = address - builder-&gt;address - 2;</div><div class='add'>+    if ((rel &gt;= -128) &amp;&amp; (rel &lt; 128)) {</div><div class='add'>+        ec_code_intel_op_1(&amp;intel, 0x75, 0);</div><div class='add'>+        ec_code_intel_immediate_1(&amp;intel, rel);</div><div class='add'>+    } else {</div><div class='add'>+        rel -= 4;</div><div class='add'>+        ec_code_intel_op_2(&amp;intel, 0x0F, 0x85, 0);</div><div class='add'>+        ec_code_intel_immediate_4(&amp;intel, rel);</div><div class='add'>+    }</div><div class='add'>+    ec_code_intel_rex(&amp;intel, _gf_false);</div><div class='add'>+</div><div class='add'>+    ec_code_intel_emit(builder, &amp;intel);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_code_intel_op_mov_sse2sse(ec_code_builder_t *builder, uint32_t src,</div><div class='add'>+                             uint32_t dst)</div><div class='add'>+{</div><div class='add'>+    ec_code_intel_t intel;</div><div class='add'>+</div><div class='add'>+    ec_code_intel_init(&amp;intel);</div><div class='add'>+</div><div class='add'>+    ec_code_intel_prefix(&amp;intel, 0x66);</div><div class='add'>+    ec_code_intel_modrm_reg(&amp;intel, src, dst);</div><div class='add'>+    ec_code_intel_op_2(&amp;intel, 0x0F, 0x6F, 0);</div><div class='add'>+    ec_code_intel_rex(&amp;intel, _gf_false);</div><div class='add'>+</div><div class='add'>+    ec_code_intel_emit(builder, &amp;intel);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_code_intel_op_mov_sse2m(ec_code_builder_t *builder, uint32_t src,</div><div class='add'>+                           ec_code_intel_reg_t base, ec_code_intel_reg_t index,</div><div class='add'>+                           uint32_t scale, int32_t offset)</div><div class='add'>+{</div><div class='add'>+    ec_code_intel_t intel;</div><div class='add'>+</div><div class='add'>+    ec_code_intel_init(&amp;intel);</div><div class='add'>+</div><div class='add'>+    ec_code_intel_prefix(&amp;intel, 0x66);</div><div class='add'>+    ec_code_intel_modrm_mem(&amp;intel, src, base, index, scale, offset);</div><div class='add'>+    ec_code_intel_op_2(&amp;intel, 0x0F, 0x7F, 0);</div><div class='add'>+    ec_code_intel_rex(&amp;intel, _gf_false);</div><div class='add'>+</div><div class='add'>+    ec_code_intel_emit(builder, &amp;intel);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_code_intel_op_mov_m2sse(ec_code_builder_t *builder, ec_code_intel_reg_t base,</div><div class='add'>+                           ec_code_intel_reg_t index, uint32_t scale,</div><div class='add'>+                           int32_t offset, uint32_t dst)</div><div class='add'>+{</div><div class='add'>+    ec_code_intel_t intel;</div><div class='add'>+</div><div class='add'>+    ec_code_intel_init(&amp;intel);</div><div class='add'>+</div><div class='add'>+    ec_code_intel_prefix(&amp;intel, 0x66);</div><div class='add'>+    ec_code_intel_modrm_mem(&amp;intel, dst, base, index, scale, offset);</div><div class='add'>+    ec_code_intel_op_2(&amp;intel, 0x0F, 0x6F, 0);</div><div class='add'>+    ec_code_intel_rex(&amp;intel, _gf_false);</div><div class='add'>+</div><div class='add'>+    ec_code_intel_emit(builder, &amp;intel);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_code_intel_op_xor_sse2sse(ec_code_builder_t *builder, uint32_t src,</div><div class='add'>+                             uint32_t dst)</div><div class='add'>+{</div><div class='add'>+    ec_code_intel_t intel;</div><div class='add'>+</div><div class='add'>+    ec_code_intel_init(&amp;intel);</div><div class='add'>+</div><div class='add'>+    ec_code_intel_prefix(&amp;intel, 0x66);</div><div class='add'>+    ec_code_intel_modrm_reg(&amp;intel, src, dst);</div><div class='add'>+    ec_code_intel_op_2(&amp;intel, 0x0F, 0xEF, 0);</div><div class='add'>+    ec_code_intel_rex(&amp;intel, _gf_false);</div><div class='add'>+</div><div class='add'>+    ec_code_intel_emit(builder, &amp;intel);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_code_intel_op_xor_m2sse(ec_code_builder_t *builder, ec_code_intel_reg_t base,</div><div class='add'>+                           ec_code_intel_reg_t index, uint32_t scale,</div><div class='add'>+                           int32_t offset, uint32_t dst)</div><div class='add'>+{</div><div class='add'>+    ec_code_intel_t intel;</div><div class='add'>+</div><div class='add'>+    ec_code_intel_init(&amp;intel);</div><div class='add'>+</div><div class='add'>+    ec_code_intel_prefix(&amp;intel, 0x66);</div><div class='add'>+    ec_code_intel_modrm_mem(&amp;intel, dst, base, index, scale, offset);</div><div class='add'>+    ec_code_intel_op_2(&amp;intel, 0x0F, 0xEF, 0);</div><div class='add'>+    ec_code_intel_rex(&amp;intel, _gf_false);</div><div class='add'>+</div><div class='add'>+    ec_code_intel_emit(builder, &amp;intel);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_code_intel_op_mov_avx2avx(ec_code_builder_t *builder, uint32_t src,</div><div class='add'>+                             uint32_t dst)</div><div class='add'>+{</div><div class='add'>+    ec_code_intel_t intel;</div><div class='add'>+</div><div class='add'>+    ec_code_intel_init(&amp;intel);</div><div class='add'>+</div><div class='add'>+    ec_code_intel_modrm_reg(&amp;intel, src, dst);</div><div class='add'>+    ec_code_intel_op_1(&amp;intel, 0x6F, 0);</div><div class='add'>+    ec_code_intel_vex(&amp;intel, _gf_false, _gf_true, VEX_OPCODE_0F, VEX_PREFIX_66,</div><div class='add'>+                      VEX_REG_NONE);</div><div class='add'>+</div><div class='add'>+    ec_code_intel_emit(builder, &amp;intel);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_code_intel_op_mov_avx2m(ec_code_builder_t *builder, uint32_t src,</div><div class='add'>+                           ec_code_intel_reg_t base, ec_code_intel_reg_t index,</div><div class='add'>+                           uint32_t scale, int32_t offset)</div><div class='add'>+{</div><div class='add'>+    ec_code_intel_t intel;</div><div class='add'>+</div><div class='add'>+    ec_code_intel_init(&amp;intel);</div><div class='add'>+</div><div class='add'>+    ec_code_intel_modrm_mem(&amp;intel, src, base, index, scale, offset);</div><div class='add'>+    ec_code_intel_op_1(&amp;intel, 0x7F, 0);</div><div class='add'>+    ec_code_intel_vex(&amp;intel, _gf_false, _gf_true, VEX_OPCODE_0F, VEX_PREFIX_66,</div><div class='add'>+                      VEX_REG_NONE);</div><div class='add'>+</div><div class='add'>+    ec_code_intel_emit(builder, &amp;intel);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_code_intel_op_mov_m2avx(ec_code_builder_t *builder, ec_code_intel_reg_t base,</div><div class='add'>+                           ec_code_intel_reg_t index, uint32_t scale,</div><div class='add'>+                           int32_t offset, uint32_t dst)</div><div class='add'>+{</div><div class='add'>+    ec_code_intel_t intel;</div><div class='add'>+</div><div class='add'>+    ec_code_intel_init(&amp;intel);</div><div class='add'>+</div><div class='add'>+    ec_code_intel_modrm_mem(&amp;intel, dst, base, index, scale, offset);</div><div class='add'>+    ec_code_intel_op_1(&amp;intel, 0x6F, 0);</div><div class='add'>+    ec_code_intel_vex(&amp;intel, _gf_false, _gf_true, VEX_OPCODE_0F, VEX_PREFIX_66,</div><div class='add'>+                      VEX_REG_NONE);</div><div class='add'>+</div><div class='add'>+    ec_code_intel_emit(builder, &amp;intel);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_code_intel_op_xor_avx2avx(ec_code_builder_t *builder, uint32_t src,</div><div class='add'>+                             uint32_t dst)</div><div class='add'>+{</div><div class='add'>+    ec_code_intel_t intel;</div><div class='add'>+</div><div class='add'>+    ec_code_intel_init(&amp;intel);</div><div class='add'>+</div><div class='add'>+    ec_code_intel_modrm_reg(&amp;intel, src, dst);</div><div class='add'>+    ec_code_intel_op_1(&amp;intel, 0xEF, 0);</div><div class='add'>+    ec_code_intel_vex(&amp;intel, _gf_false, _gf_true, VEX_OPCODE_0F, VEX_PREFIX_66,</div><div class='add'>+                      dst);</div><div class='add'>+</div><div class='add'>+    ec_code_intel_emit(builder, &amp;intel);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_code_intel_op_xor_m2avx(ec_code_builder_t *builder, ec_code_intel_reg_t base,</div><div class='add'>+                           ec_code_intel_reg_t index, uint32_t scale,</div><div class='add'>+                           int32_t offset, uint32_t dst)</div><div class='add'>+{</div><div class='add'>+    ec_code_intel_t intel;</div><div class='add'>+</div><div class='add'>+    ec_code_intel_init(&amp;intel);</div><div class='add'>+</div><div class='add'>+    ec_code_intel_modrm_mem(&amp;intel, dst, base, index, scale, offset);</div><div class='add'>+    ec_code_intel_op_1(&amp;intel, 0xEF, 0);</div><div class='add'>+    ec_code_intel_vex(&amp;intel, _gf_false, _gf_true, VEX_OPCODE_0F, VEX_PREFIX_66,</div><div class='add'>+                      dst);</div><div class='add'>+</div><div class='add'>+    ec_code_intel_emit(builder, &amp;intel);</div><div class='add'>+}</div><div class='head'>diff --git a/xlators/cluster/ec/src/ec-code-intel.h b/xlators/cluster/ec/src/ec-code-intel.h<br/>new file mode 100644<br/>index 00000000000..3fa4a174765<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/xlators/cluster/ec/src/ec-code-intel.h?id=d1d7a6f35c816822fab51c820e25023863c239c1'>xlators/cluster/ec/src/ec-code-intel.h</a></div><div class='hunk'>@@ -0,0 +1,191 @@</div><div class='add'>+/*</div><div class='add'>+  Copyright (c) 2015 DataLab, s.l. &lt;http://www.datalab.es&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#ifndef __EC_CODE_INTEL_H__</div><div class='add'>+#define __EC_CODE_INTEL_H__</div><div class='add'>+</div><div class='add'>+#include "ec-code.h"</div><div class='add'>+</div><div class='add'>+#define VEX_REG_NONE 0</div><div class='add'>+</div><div class='add'>+enum _ec_code_intel_reg;</div><div class='add'>+typedef enum _ec_code_intel_reg ec_code_intel_reg_t;</div><div class='add'>+</div><div class='add'>+enum _ec_code_vex_prefix;</div><div class='add'>+typedef enum _ec_code_vex_prefix ec_code_vex_prefix_t;</div><div class='add'>+</div><div class='add'>+enum _ec_code_vex_opcode;</div><div class='add'>+typedef enum _ec_code_vex_opcode ec_code_vex_opcode_t;</div><div class='add'>+</div><div class='add'>+struct _ec_code_intel_buffer;</div><div class='add'>+typedef struct _ec_code_intel_buffer ec_code_intel_buffer_t;</div><div class='add'>+</div><div class='add'>+struct _ec_code_intel_sib;</div><div class='add'>+typedef struct _ec_code_intel_sib ec_code_intel_sib_t;</div><div class='add'>+</div><div class='add'>+struct _ec_code_intel_modrm;</div><div class='add'>+typedef struct _ec_code_intel_modrm ec_code_intel_modrm_t;</div><div class='add'>+</div><div class='add'>+struct _ec_code_intel_rex;</div><div class='add'>+typedef struct _ec_code_intel_rex ec_code_intel_rex_t;</div><div class='add'>+</div><div class='add'>+struct _ec_code_intel;</div><div class='add'>+typedef struct _ec_code_intel ec_code_intel_t;</div><div class='add'>+</div><div class='add'>+enum _ec_code_intel_reg {</div><div class='add'>+    REG_NULL = -1,</div><div class='add'>+    REG_AX,</div><div class='add'>+    REG_CX,</div><div class='add'>+    REG_DX,</div><div class='add'>+    REG_BX,</div><div class='add'>+    REG_SP,</div><div class='add'>+    REG_BP,</div><div class='add'>+    REG_SI,</div><div class='add'>+    REG_DI,</div><div class='add'>+    REG_8,</div><div class='add'>+    REG_9,</div><div class='add'>+    REG_10,</div><div class='add'>+    REG_11,</div><div class='add'>+    REG_12,</div><div class='add'>+    REG_13,</div><div class='add'>+    REG_14,</div><div class='add'>+    REG_15</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+enum _ec_code_vex_prefix {</div><div class='add'>+    VEX_PREFIX_NONE = 0,</div><div class='add'>+    VEX_PREFIX_66,</div><div class='add'>+    VEX_PREFIX_F3,</div><div class='add'>+    VEX_PREFIX_F2</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+enum _ec_code_vex_opcode {</div><div class='add'>+    VEX_OPCODE_NONE = 0,</div><div class='add'>+    VEX_OPCODE_0F,</div><div class='add'>+    VEX_OPCODE_0F_38,</div><div class='add'>+    VEX_OPCODE_0F_3A</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct _ec_code_intel_buffer {</div><div class='add'>+    uint32_t bytes;</div><div class='add'>+    union {</div><div class='add'>+        uint8_t data[4];</div><div class='add'>+        uint32_t value;</div><div class='add'>+    };</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct _ec_code_intel_sib {</div><div class='add'>+    gf_boolean_t present;</div><div class='add'>+    uint32_t base;</div><div class='add'>+    uint32_t index;</div><div class='add'>+    uint32_t scale;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct _ec_code_intel_modrm {</div><div class='add'>+    gf_boolean_t present;</div><div class='add'>+    uint32_t mod;</div><div class='add'>+    uint32_t rm;</div><div class='add'>+    uint32_t reg;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct _ec_code_intel_rex {</div><div class='add'>+    gf_boolean_t present;</div><div class='add'>+    uint32_t w;</div><div class='add'>+    uint32_t r;</div><div class='add'>+    uint32_t x;</div><div class='add'>+    uint32_t b;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct _ec_code_intel {</div><div class='add'>+    gf_boolean_t invalid;</div><div class='add'>+    ec_code_intel_buffer_t prefix;</div><div class='add'>+    ec_code_intel_buffer_t opcode;</div><div class='add'>+    ec_code_intel_buffer_t offset;</div><div class='add'>+    ec_code_intel_buffer_t immediate;</div><div class='add'>+    ec_code_intel_buffer_t vex;</div><div class='add'>+    ec_code_intel_rex_t rex;</div><div class='add'>+    ec_code_intel_modrm_t modrm;</div><div class='add'>+    ec_code_intel_sib_t sib;</div><div class='add'>+    uint32_t reg;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_code_intel_op_push_r(ec_code_builder_t *builder, ec_code_intel_reg_t reg);</div><div class='add'>+void</div><div class='add'>+ec_code_intel_op_pop_r(ec_code_builder_t *builder, ec_code_intel_reg_t reg);</div><div class='add'>+void</div><div class='add'>+ec_code_intel_op_ret(ec_code_builder_t *builder, uint32_t size);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_code_intel_op_mov_r2r(ec_code_builder_t *builder, ec_code_intel_reg_t src,</div><div class='add'>+                         ec_code_intel_reg_t dst);</div><div class='add'>+void</div><div class='add'>+ec_code_intel_op_mov_r2m(ec_code_builder_t *builder, ec_code_intel_reg_t src,</div><div class='add'>+                         ec_code_intel_reg_t base, ec_code_intel_reg_t index,</div><div class='add'>+                         uint32_t scale, int32_t offset);</div><div class='add'>+void</div><div class='add'>+ec_code_intel_op_mov_m2r(ec_code_builder_t *builder, ec_code_intel_reg_t base,</div><div class='add'>+                         ec_code_intel_reg_t index, uint32_t scale,</div><div class='add'>+                         int32_t offset, ec_code_intel_reg_t dst);</div><div class='add'>+void</div><div class='add'>+ec_code_intel_op_xor_r2r(ec_code_builder_t *builder, ec_code_intel_reg_t src,</div><div class='add'>+                         ec_code_intel_reg_t dst);</div><div class='add'>+void</div><div class='add'>+ec_code_intel_op_xor_m2r(ec_code_builder_t *builder, ec_code_intel_reg_t base,</div><div class='add'>+                         ec_code_intel_reg_t index, uint32_t scale,</div><div class='add'>+                         int32_t offset, ec_code_intel_reg_t dst);</div><div class='add'>+void</div><div class='add'>+ec_code_intel_op_add_i2r(ec_code_builder_t *builder, int32_t value,</div><div class='add'>+                         ec_code_intel_reg_t reg);</div><div class='add'>+void</div><div class='add'>+ec_code_intel_op_test_i2r(ec_code_builder_t *builder, uint32_t value,</div><div class='add'>+                          ec_code_intel_reg_t reg);</div><div class='add'>+void</div><div class='add'>+ec_code_intel_op_jne(ec_code_builder_t *builder, uint32_t address);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_code_intel_op_mov_sse2sse(ec_code_builder_t *builder, uint32_t src,</div><div class='add'>+                             uint32_t dst);</div><div class='add'>+void</div><div class='add'>+ec_code_intel_op_mov_sse2m(ec_code_builder_t *builder, uint32_t src,</div><div class='add'>+                           ec_code_intel_reg_t base, ec_code_intel_reg_t index,</div><div class='add'>+                           uint32_t scale, int32_t offset);</div><div class='add'>+void</div><div class='add'>+ec_code_intel_op_mov_m2sse(ec_code_builder_t *builder, ec_code_intel_reg_t base,</div><div class='add'>+                           ec_code_intel_reg_t index, uint32_t scale,</div><div class='add'>+                           int32_t offset, uint32_t dst);</div><div class='add'>+void</div><div class='add'>+ec_code_intel_op_xor_sse2sse(ec_code_builder_t *builder, uint32_t src,</div><div class='add'>+                             uint32_t dst);</div><div class='add'>+void</div><div class='add'>+ec_code_intel_op_xor_m2sse(ec_code_builder_t *builder, ec_code_intel_reg_t base,</div><div class='add'>+                           ec_code_intel_reg_t index, uint32_t scale,</div><div class='add'>+                           int32_t offset, uint32_t dst);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_code_intel_op_mov_avx2avx(ec_code_builder_t *builder, uint32_t src,</div><div class='add'>+                             uint32_t dst);</div><div class='add'>+void</div><div class='add'>+ec_code_intel_op_mov_avx2m(ec_code_builder_t *builder, uint32_t src,</div><div class='add'>+                           ec_code_intel_reg_t base, ec_code_intel_reg_t index,</div><div class='add'>+                           uint32_t scale, int32_t offset);</div><div class='add'>+void</div><div class='add'>+ec_code_intel_op_mov_m2avx(ec_code_builder_t *builder, ec_code_intel_reg_t base,</div><div class='add'>+                           ec_code_intel_reg_t index, uint32_t scale,</div><div class='add'>+                           int32_t offset, uint32_t dst);</div><div class='add'>+void</div><div class='add'>+ec_code_intel_op_xor_avx2avx(ec_code_builder_t *builder, uint32_t src,</div><div class='add'>+                             uint32_t dst);</div><div class='add'>+void</div><div class='add'>+ec_code_intel_op_xor_m2avx(ec_code_builder_t *builder, ec_code_intel_reg_t base,</div><div class='add'>+                           ec_code_intel_reg_t index, uint32_t scale,</div><div class='add'>+                           int32_t offset, uint32_t dst);</div><div class='add'>+</div><div class='add'>+#endif /* __EC_CODE_INTEL_H__ */</div><div class='head'>diff --git a/xlators/cluster/ec/src/ec-code-sse.c b/xlators/cluster/ec/src/ec-code-sse.c<br/>new file mode 100644<br/>index 00000000000..e11e7ff8400<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/xlators/cluster/ec/src/ec-code-sse.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>xlators/cluster/ec/src/ec-code-sse.c</a></div><div class='hunk'>@@ -0,0 +1,101 @@</div><div class='add'>+/*</div><div class='add'>+  Copyright (c) 2015 DataLab, s.l. &lt;http://www.datalab.es&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#include &lt;errno.h&gt;</div><div class='add'>+</div><div class='add'>+#include "ec-code-intel.h"</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+ec_code_sse_prolog(ec_code_builder_t *builder)</div><div class='add'>+{</div><div class='add'>+    builder-&gt;loop = builder-&gt;address;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+ec_code_sse_epilog(ec_code_builder_t *builder)</div><div class='add'>+{</div><div class='add'>+    ec_code_intel_op_add_i2r(builder, 16, REG_DX);</div><div class='add'>+    ec_code_intel_op_add_i2r(builder, 16, REG_DI);</div><div class='add'>+    ec_code_intel_op_test_i2r(builder, builder-&gt;width - 1, REG_DX);</div><div class='add'>+    ec_code_intel_op_jne(builder, builder-&gt;loop);</div><div class='add'>+</div><div class='add'>+    ec_code_intel_op_ret(builder, 0);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+ec_code_sse_load(ec_code_builder_t *builder, uint32_t dst, uint32_t idx,</div><div class='add'>+                 uint32_t bit)</div><div class='add'>+{</div><div class='add'>+    if (builder-&gt;linear) {</div><div class='add'>+        ec_code_intel_op_mov_m2sse(</div><div class='add'>+            builder, REG_SI, REG_DX, 1,</div><div class='add'>+            idx * builder-&gt;width * builder-&gt;bits + bit * builder-&gt;width, dst);</div><div class='add'>+    } else {</div><div class='add'>+        if (builder-&gt;base != idx) {</div><div class='add'>+            ec_code_intel_op_mov_m2r(builder, REG_SI, REG_NULL, 0, idx * 8,</div><div class='add'>+                                     REG_AX);</div><div class='add'>+            builder-&gt;base = idx;</div><div class='add'>+        }</div><div class='add'>+        ec_code_intel_op_mov_m2sse(builder, REG_AX, REG_DX, 1,</div><div class='add'>+                                   bit * builder-&gt;width, dst);</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+ec_code_sse_store(ec_code_builder_t *builder, uint32_t src, uint32_t bit)</div><div class='add'>+{</div><div class='add'>+    ec_code_intel_op_mov_sse2m(builder, src, REG_DI, REG_NULL, 0,</div><div class='add'>+                               bit * builder-&gt;width);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+ec_code_sse_copy(ec_code_builder_t *builder, uint32_t dst, uint32_t src)</div><div class='add'>+{</div><div class='add'>+    ec_code_intel_op_mov_sse2sse(builder, src, dst);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+ec_code_sse_xor2(ec_code_builder_t *builder, uint32_t dst, uint32_t src)</div><div class='add'>+{</div><div class='add'>+    ec_code_intel_op_xor_sse2sse(builder, src, dst);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+ec_code_sse_xorm(ec_code_builder_t *builder, uint32_t dst, uint32_t idx,</div><div class='add'>+                 uint32_t bit)</div><div class='add'>+{</div><div class='add'>+    if (builder-&gt;linear) {</div><div class='add'>+        ec_code_intel_op_xor_m2sse(</div><div class='add'>+            builder, REG_SI, REG_DX, 1,</div><div class='add'>+            idx * builder-&gt;width * builder-&gt;bits + bit * builder-&gt;width, dst);</div><div class='add'>+    } else {</div><div class='add'>+        if (builder-&gt;base != idx) {</div><div class='add'>+            ec_code_intel_op_mov_m2r(builder, REG_SI, REG_NULL, 0, idx * 8,</div><div class='add'>+                                     REG_AX);</div><div class='add'>+            builder-&gt;base = idx;</div><div class='add'>+        }</div><div class='add'>+        ec_code_intel_op_xor_m2sse(builder, REG_AX, REG_DX, 1,</div><div class='add'>+                                   bit * builder-&gt;width, dst);</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static char *ec_code_sse_needed_flags[] = {"sse2", NULL};</div><div class='add'>+</div><div class='add'>+ec_code_gen_t ec_code_gen_sse = {.name = "sse",</div><div class='add'>+                                 .flags = ec_code_sse_needed_flags,</div><div class='add'>+                                 .width = 16,</div><div class='add'>+                                 .prolog = ec_code_sse_prolog,</div><div class='add'>+                                 .epilog = ec_code_sse_epilog,</div><div class='add'>+                                 .load = ec_code_sse_load,</div><div class='add'>+                                 .store = ec_code_sse_store,</div><div class='add'>+                                 .copy = ec_code_sse_copy,</div><div class='add'>+                                 .xor2 = ec_code_sse_xor2,</div><div class='add'>+                                 .xor3 = NULL,</div><div class='add'>+                                 .xorm = ec_code_sse_xorm};</div><div class='head'>diff --git a/xlators/cluster/ec/src/ec-code-sse.h b/xlators/cluster/ec/src/ec-code-sse.h<br/>new file mode 100644<br/>index 00000000000..f1acbcf894b<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/xlators/cluster/ec/src/ec-code-sse.h?id=d1d7a6f35c816822fab51c820e25023863c239c1'>xlators/cluster/ec/src/ec-code-sse.h</a></div><div class='hunk'>@@ -0,0 +1,18 @@</div><div class='add'>+/*</div><div class='add'>+  Copyright (c) 2015 DataLab, s.l. &lt;http://www.datalab.es&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#ifndef __EC_CODE_SSE_H__</div><div class='add'>+#define __EC_CODE_SSE_H__</div><div class='add'>+</div><div class='add'>+#include "ec-code.h"</div><div class='add'>+</div><div class='add'>+extern ec_code_gen_t ec_code_gen_sse;</div><div class='add'>+</div><div class='add'>+#endif /* __EC_CODE_SSE_H__ */</div><div class='head'>diff --git a/xlators/cluster/ec/src/ec-code-x64.c b/xlators/cluster/ec/src/ec-code-x64.c<br/>new file mode 100644<br/>index 00000000000..26565b4493f<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/xlators/cluster/ec/src/ec-code-x64.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>xlators/cluster/ec/src/ec-code-x64.c</a></div><div class='hunk'>@@ -0,0 +1,144 @@</div><div class='add'>+/*</div><div class='add'>+  Copyright (c) 2015 DataLab, s.l. &lt;http://www.datalab.es&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#include &lt;errno.h&gt;</div><div class='add'>+</div><div class='add'>+#include "ec-code-intel.h"</div><div class='add'>+</div><div class='add'>+static ec_code_intel_reg_t ec_code_x64_regmap[] = {</div><div class='add'>+    REG_AX, REG_CX, REG_BP, REG_8,  REG_9, REG_10,</div><div class='add'>+    REG_11, REG_12, REG_13, REG_14, REG_15};</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+ec_code_x64_prolog(ec_code_builder_t *builder)</div><div class='add'>+{</div><div class='add'>+    uint32_t i;</div><div class='add'>+</div><div class='add'>+    ec_code_intel_op_push_r(builder, REG_BP);</div><div class='add'>+    if (!builder-&gt;linear) {</div><div class='add'>+        ec_code_intel_op_push_r(builder, REG_BX);</div><div class='add'>+    }</div><div class='add'>+    if (builder-&gt;regs &gt; 11) {</div><div class='add'>+        ec_code_error(builder, EINVAL);</div><div class='add'>+        return;</div><div class='add'>+    }</div><div class='add'>+    for (i = 7; i &lt; builder-&gt;regs; i++) {</div><div class='add'>+        ec_code_intel_op_push_r(builder, ec_code_x64_regmap[i]);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    builder-&gt;loop = builder-&gt;address;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+ec_code_x64_epilog(ec_code_builder_t *builder)</div><div class='add'>+{</div><div class='add'>+    uint32_t i;</div><div class='add'>+</div><div class='add'>+    ec_code_intel_op_add_i2r(builder, 8, REG_DX);</div><div class='add'>+    ec_code_intel_op_add_i2r(builder, 8, REG_DI);</div><div class='add'>+    ec_code_intel_op_test_i2r(builder, builder-&gt;width - 1, REG_DX);</div><div class='add'>+    ec_code_intel_op_jne(builder, builder-&gt;loop);</div><div class='add'>+</div><div class='add'>+    if (builder-&gt;regs &gt; 11) {</div><div class='add'>+        ec_code_error(builder, EINVAL);</div><div class='add'>+        return;</div><div class='add'>+    }</div><div class='add'>+    for (i = builder-&gt;regs; i &gt; 7; i--) {</div><div class='add'>+        ec_code_intel_op_pop_r(builder, ec_code_x64_regmap[i - 1]);</div><div class='add'>+    }</div><div class='add'>+    if (!builder-&gt;linear) {</div><div class='add'>+        ec_code_intel_op_pop_r(builder, REG_BX);</div><div class='add'>+    }</div><div class='add'>+    ec_code_intel_op_pop_r(builder, REG_BP);</div><div class='add'>+    ec_code_intel_op_ret(builder, 0);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+ec_code_x64_load(ec_code_builder_t *builder, uint32_t dst, uint32_t idx,</div><div class='add'>+                 uint32_t bit)</div><div class='add'>+{</div><div class='add'>+    dst = ec_code_x64_regmap[dst];</div><div class='add'>+</div><div class='add'>+    if (builder-&gt;linear) {</div><div class='add'>+        ec_code_intel_op_mov_m2r(</div><div class='add'>+            builder, REG_SI, REG_DX, 1,</div><div class='add'>+            idx * builder-&gt;width * builder-&gt;bits + bit * builder-&gt;width, dst);</div><div class='add'>+    } else {</div><div class='add'>+        if (builder-&gt;base != idx) {</div><div class='add'>+            ec_code_intel_op_mov_m2r(builder, REG_SI, REG_NULL, 0, idx * 8,</div><div class='add'>+                                     REG_BX);</div><div class='add'>+            builder-&gt;base = idx;</div><div class='add'>+        }</div><div class='add'>+        ec_code_intel_op_mov_m2r(builder, REG_BX, REG_DX, 1,</div><div class='add'>+                                 bit * builder-&gt;width, dst);</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+ec_code_x64_store(ec_code_builder_t *builder, uint32_t src, uint32_t bit)</div><div class='add'>+{</div><div class='add'>+    src = ec_code_x64_regmap[src];</div><div class='add'>+</div><div class='add'>+    ec_code_intel_op_mov_r2m(builder, src, REG_DI, REG_NULL, 0,</div><div class='add'>+                             bit * builder-&gt;width);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+ec_code_x64_copy(ec_code_builder_t *builder, uint32_t dst, uint32_t src)</div><div class='add'>+{</div><div class='add'>+    dst = ec_code_x64_regmap[dst];</div><div class='add'>+    src = ec_code_x64_regmap[src];</div><div class='add'>+</div><div class='add'>+    ec_code_intel_op_mov_r2r(builder, src, dst);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+ec_code_x64_xor2(ec_code_builder_t *builder, uint32_t dst, uint32_t src)</div><div class='add'>+{</div><div class='add'>+    dst = ec_code_x64_regmap[dst];</div><div class='add'>+    src = ec_code_x64_regmap[src];</div><div class='add'>+</div><div class='add'>+    ec_code_intel_op_xor_r2r(builder, src, dst);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+ec_code_x64_xorm(ec_code_builder_t *builder, uint32_t dst, uint32_t idx,</div><div class='add'>+                 uint32_t bit)</div><div class='add'>+{</div><div class='add'>+    dst = ec_code_x64_regmap[dst];</div><div class='add'>+</div><div class='add'>+    if (builder-&gt;linear) {</div><div class='add'>+        ec_code_intel_op_xor_m2r(</div><div class='add'>+            builder, REG_SI, REG_DX, 1,</div><div class='add'>+            idx * builder-&gt;width * builder-&gt;bits + bit * builder-&gt;width, dst);</div><div class='add'>+    } else {</div><div class='add'>+        if (builder-&gt;base != idx) {</div><div class='add'>+            ec_code_intel_op_mov_m2r(builder, REG_SI, REG_NULL, 0, idx * 8,</div><div class='add'>+                                     REG_BX);</div><div class='add'>+            builder-&gt;base = idx;</div><div class='add'>+        }</div><div class='add'>+        ec_code_intel_op_xor_m2r(builder, REG_BX, REG_DX, 1,</div><div class='add'>+                                 bit * builder-&gt;width, dst);</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static char *ec_code_x64_needed_flags[] = {NULL};</div><div class='add'>+</div><div class='add'>+ec_code_gen_t ec_code_gen_x64 = {.name = "x64",</div><div class='add'>+                                 .flags = ec_code_x64_needed_flags,</div><div class='add'>+                                 .width = sizeof(uint64_t),</div><div class='add'>+                                 .prolog = ec_code_x64_prolog,</div><div class='add'>+                                 .epilog = ec_code_x64_epilog,</div><div class='add'>+                                 .load = ec_code_x64_load,</div><div class='add'>+                                 .store = ec_code_x64_store,</div><div class='add'>+                                 .copy = ec_code_x64_copy,</div><div class='add'>+                                 .xor2 = ec_code_x64_xor2,</div><div class='add'>+                                 .xor3 = NULL,</div><div class='add'>+                                 .xorm = ec_code_x64_xorm};</div><div class='head'>diff --git a/xlators/cluster/ec/src/ec-code-x64.h b/xlators/cluster/ec/src/ec-code-x64.h<br/>new file mode 100644<br/>index 00000000000..bd8174e4bf5<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/xlators/cluster/ec/src/ec-code-x64.h?id=d1d7a6f35c816822fab51c820e25023863c239c1'>xlators/cluster/ec/src/ec-code-x64.h</a></div><div class='hunk'>@@ -0,0 +1,18 @@</div><div class='add'>+/*</div><div class='add'>+  Copyright (c) 2015 DataLab, s.l. &lt;http://www.datalab.es&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#ifndef __EC_CODE_X64_H__</div><div class='add'>+#define __EC_CODE_X64_H__</div><div class='add'>+</div><div class='add'>+#include "ec-code.h"</div><div class='add'>+</div><div class='add'>+extern ec_code_gen_t ec_code_gen_x64;</div><div class='add'>+</div><div class='add'>+#endif /* __EC_CODE_X64_H__ */</div><div class='head'>diff --git a/xlators/cluster/ec/src/ec-code.c b/xlators/cluster/ec/src/ec-code.c<br/>new file mode 100644<br/>index 00000000000..03162ae05a9<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/xlators/cluster/ec/src/ec-code.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>xlators/cluster/ec/src/ec-code.c</a></div><div class='hunk'>@@ -0,0 +1,1060 @@</div><div class='add'>+/*</div><div class='add'>+  Copyright (c) 2015 DataLab, s.l. &lt;http://www.datalab.es&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#include &lt;string.h&gt;</div><div class='add'>+#include &lt;sys/mman.h&gt;</div><div class='add'>+#include &lt;sys/types.h&gt;</div><div class='add'>+#include &lt;sys/stat.h&gt;</div><div class='add'>+#include &lt;ctype.h&gt;</div><div class='add'>+</div><div class='add'>+#include &lt;glusterfs/syscall.h&gt;</div><div class='add'>+</div><div class='add'>+#include "ec-mem-types.h"</div><div class='add'>+#include "ec-code.h"</div><div class='add'>+#include "ec-messages.h"</div><div class='add'>+#include "ec-code-c.h"</div><div class='add'>+#include "ec-helpers.h"</div><div class='add'>+</div><div class='add'>+#ifdef USE_EC_DYNAMIC_X64</div><div class='add'>+#include "ec-code-x64.h"</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#ifdef USE_EC_DYNAMIC_SSE</div><div class='add'>+#include "ec-code-sse.h"</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#ifdef USE_EC_DYNAMIC_AVX</div><div class='add'>+#include "ec-code-avx.h"</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#define EC_CODE_SIZE (1024 * 64)</div><div class='add'>+#define EC_CODE_ALIGN 4096</div><div class='add'>+</div><div class='add'>+#define EC_CODE_CHUNK_MIN_SIZE 512</div><div class='add'>+</div><div class='add'>+#define EC_PROC_BUFFER_SIZE 4096</div><div class='add'>+</div><div class='add'>+#define PROC_CPUINFO "/proc/cpuinfo"</div><div class='add'>+</div><div class='add'>+struct _ec_code_proc;</div><div class='add'>+typedef struct _ec_code_proc ec_code_proc_t;</div><div class='add'>+</div><div class='add'>+struct _ec_code_proc {</div><div class='add'>+    int32_t fd;</div><div class='add'>+    gf_boolean_t eof;</div><div class='add'>+    gf_boolean_t error;</div><div class='add'>+    gf_boolean_t skip;</div><div class='add'>+    ssize_t size;</div><div class='add'>+    ssize_t pos;</div><div class='add'>+    char buffer[EC_PROC_BUFFER_SIZE];</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+static ec_code_gen_t *ec_code_gen_table[] = {</div><div class='add'>+#ifdef USE_EC_DYNAMIC_AVX</div><div class='add'>+    &amp;ec_code_gen_avx,</div><div class='add'>+#endif</div><div class='add'>+#ifdef USE_EC_DYNAMIC_SSE</div><div class='add'>+    &amp;ec_code_gen_sse,</div><div class='add'>+#endif</div><div class='add'>+#ifdef USE_EC_DYNAMIC_X64</div><div class='add'>+    &amp;ec_code_gen_x64,</div><div class='add'>+#endif</div><div class='add'>+    NULL};</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+ec_code_arg_set(ec_code_arg_t *arg, uint32_t value)</div><div class='add'>+{</div><div class='add'>+    arg-&gt;value = value;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+ec_code_arg_assign(ec_code_builder_t *builder, ec_code_op_t *op,</div><div class='add'>+                   ec_code_arg_t *arg, uint32_t reg)</div><div class='add'>+{</div><div class='add'>+    arg-&gt;value = reg;</div><div class='add'>+</div><div class='add'>+    if (builder-&gt;regs &lt;= reg) {</div><div class='add'>+        builder-&gt;regs = reg + 1;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+ec_code_arg_use(ec_code_builder_t *builder, ec_code_op_t *op,</div><div class='add'>+                ec_code_arg_t *arg, uint32_t reg)</div><div class='add'>+{</div><div class='add'>+    arg-&gt;value = reg;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+ec_code_arg_update(ec_code_builder_t *builder, ec_code_op_t *op,</div><div class='add'>+                   ec_code_arg_t *arg, uint32_t reg)</div><div class='add'>+{</div><div class='add'>+    arg-&gt;value = reg;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static ec_code_op_t *</div><div class='add'>+ec_code_op_next(ec_code_builder_t *builder)</div><div class='add'>+{</div><div class='add'>+    ec_code_op_t *op;</div><div class='add'>+</div><div class='add'>+    op = &amp;builder-&gt;ops[builder-&gt;count++];</div><div class='add'>+    memset(op, 0, sizeof(ec_code_op_t));</div><div class='add'>+</div><div class='add'>+    return op;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+ec_code_load(ec_code_builder_t *builder, uint32_t bit, uint32_t offset)</div><div class='add'>+{</div><div class='add'>+    ec_code_op_t *op;</div><div class='add'>+</div><div class='add'>+    op = ec_code_op_next(builder);</div><div class='add'>+</div><div class='add'>+    op-&gt;op = EC_GF_OP_LOAD;</div><div class='add'>+    ec_code_arg_assign(builder, op, &amp;op-&gt;arg1, builder-&gt;map[bit]);</div><div class='add'>+    ec_code_arg_set(&amp;op-&gt;arg2, offset);</div><div class='add'>+    ec_code_arg_set(&amp;op-&gt;arg3, bit);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+ec_code_store(ec_code_builder_t *builder, uint32_t reg, uint32_t bit)</div><div class='add'>+{</div><div class='add'>+    ec_code_op_t *op;</div><div class='add'>+</div><div class='add'>+    op = ec_code_op_next(builder);</div><div class='add'>+</div><div class='add'>+    op-&gt;op = EC_GF_OP_STORE;</div><div class='add'>+    ec_code_arg_use(builder, op, &amp;op-&gt;arg1, builder-&gt;map[reg]);</div><div class='add'>+    ec_code_arg_set(&amp;op-&gt;arg2, 0);</div><div class='add'>+    ec_code_arg_set(&amp;op-&gt;arg3, bit);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+ec_code_copy(ec_code_builder_t *builder, uint32_t dst, uint32_t src)</div><div class='add'>+{</div><div class='add'>+    ec_code_op_t *op;</div><div class='add'>+</div><div class='add'>+    op = ec_code_op_next(builder);</div><div class='add'>+</div><div class='add'>+    op-&gt;op = EC_GF_OP_COPY;</div><div class='add'>+    ec_code_arg_assign(builder, op, &amp;op-&gt;arg1, builder-&gt;map[dst]);</div><div class='add'>+    ec_code_arg_use(builder, op, &amp;op-&gt;arg2, builder-&gt;map[src]);</div><div class='add'>+    ec_code_arg_set(&amp;op-&gt;arg3, 0);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+ec_code_xor2(ec_code_builder_t *builder, uint32_t dst, uint32_t src)</div><div class='add'>+{</div><div class='add'>+    ec_code_op_t *op;</div><div class='add'>+</div><div class='add'>+    op = ec_code_op_next(builder);</div><div class='add'>+</div><div class='add'>+    op-&gt;op = EC_GF_OP_XOR2;</div><div class='add'>+    ec_code_arg_update(builder, op, &amp;op-&gt;arg1, builder-&gt;map[dst]);</div><div class='add'>+    ec_code_arg_use(builder, op, &amp;op-&gt;arg2, builder-&gt;map[src]);</div><div class='add'>+    ec_code_arg_set(&amp;op-&gt;arg3, 0);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+ec_code_xor3(ec_code_builder_t *builder, uint32_t dst, uint32_t src1,</div><div class='add'>+             uint32_t src2)</div><div class='add'>+{</div><div class='add'>+    ec_code_op_t *op;</div><div class='add'>+</div><div class='add'>+    if (builder-&gt;code-&gt;gen-&gt;xor3 == NULL) {</div><div class='add'>+        ec_code_copy(builder, dst, src1);</div><div class='add'>+        ec_code_xor2(builder, dst, src2);</div><div class='add'>+</div><div class='add'>+        return;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    op = ec_code_op_next(builder);</div><div class='add'>+</div><div class='add'>+    op-&gt;op = EC_GF_OP_XOR3;</div><div class='add'>+    ec_code_arg_assign(builder, op, &amp;op-&gt;arg1, builder-&gt;map[dst]);</div><div class='add'>+    ec_code_arg_use(builder, op, &amp;op-&gt;arg2, builder-&gt;map[src1]);</div><div class='add'>+    ec_code_arg_use(builder, op, &amp;op-&gt;arg3, builder-&gt;map[src2]);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+ec_code_xorm(ec_code_builder_t *builder, uint32_t bit, uint32_t offset)</div><div class='add'>+{</div><div class='add'>+    ec_code_op_t *op;</div><div class='add'>+</div><div class='add'>+    op = ec_code_op_next(builder);</div><div class='add'>+</div><div class='add'>+    op-&gt;op = EC_GF_OP_XORM;</div><div class='add'>+    ec_code_arg_update(builder, op, &amp;op-&gt;arg1, builder-&gt;map[bit]);</div><div class='add'>+    ec_code_arg_set(&amp;op-&gt;arg2, offset);</div><div class='add'>+    ec_code_arg_set(&amp;op-&gt;arg3, bit);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+ec_code_dup(ec_code_builder_t *builder, ec_gf_op_t *op)</div><div class='add'>+{</div><div class='add'>+    switch (op-&gt;op) {</div><div class='add'>+        case EC_GF_OP_COPY:</div><div class='add'>+            ec_code_copy(builder, op-&gt;arg1, op-&gt;arg2);</div><div class='add'>+            break;</div><div class='add'>+        case EC_GF_OP_XOR2:</div><div class='add'>+            ec_code_xor2(builder, op-&gt;arg1, op-&gt;arg2);</div><div class='add'>+            break;</div><div class='add'>+        case EC_GF_OP_XOR3:</div><div class='add'>+            ec_code_xor3(builder, op-&gt;arg1, op-&gt;arg2, op-&gt;arg3);</div><div class='add'>+            break;</div><div class='add'>+        default:</div><div class='add'>+            break;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+ec_code_gf_load(ec_code_builder_t *builder, uint32_t offset)</div><div class='add'>+{</div><div class='add'>+    uint32_t i;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; builder-&gt;code-&gt;gf-&gt;bits; i++) {</div><div class='add'>+        ec_code_load(builder, i, offset);</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+ec_code_gf_load_xor(ec_code_builder_t *builder, uint32_t offset)</div><div class='add'>+{</div><div class='add'>+    uint32_t i;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; builder-&gt;code-&gt;gf-&gt;bits; i++) {</div><div class='add'>+        ec_code_xorm(builder, i, offset);</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+ec_code_gf_store(ec_code_builder_t *builder)</div><div class='add'>+{</div><div class='add'>+    uint32_t i;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; builder-&gt;code-&gt;gf-&gt;bits; i++) {</div><div class='add'>+        ec_code_store(builder, i, i);</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+ec_code_gf_clear(ec_code_builder_t *builder)</div><div class='add'>+{</div><div class='add'>+    uint32_t i;</div><div class='add'>+</div><div class='add'>+    ec_code_xor2(builder, 0, 0);</div><div class='add'>+    for (i = 0; i &lt; builder-&gt;code-&gt;gf-&gt;bits; i++) {</div><div class='add'>+        ec_code_store(builder, 0, i);</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+ec_code_gf_mul(ec_code_builder_t *builder, uint32_t value)</div><div class='add'>+{</div><div class='add'>+    ec_gf_mul_t *mul;</div><div class='add'>+    ec_gf_op_t *op;</div><div class='add'>+    uint32_t map[EC_GF_MAX_REGS];</div><div class='add'>+    int32_t i;</div><div class='add'>+</div><div class='add'>+    mul = builder-&gt;code-&gt;gf-&gt;table[value];</div><div class='add'>+    for (op = mul-&gt;ops; op-&gt;op != EC_GF_OP_END; op++) {</div><div class='add'>+        ec_code_dup(builder, op);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; mul-&gt;regs; i++) {</div><div class='add'>+        map[i] = builder-&gt;map[mul-&gt;map[i]];</div><div class='add'>+    }</div><div class='add'>+    memcpy(builder-&gt;map, map, sizeof(uint32_t) * mul-&gt;regs);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static ec_code_builder_t *</div><div class='add'>+ec_code_prepare(ec_code_t *code, uint32_t count, uint32_t width,</div><div class='add'>+                gf_boolean_t linear)</div><div class='add'>+{</div><div class='add'>+    ec_code_builder_t *builder;</div><div class='add'>+    uint32_t i;</div><div class='add'>+</div><div class='add'>+    count *= code-&gt;gf-&gt;bits + code-&gt;gf-&gt;max_ops;</div><div class='add'>+    count += code-&gt;gf-&gt;bits;</div><div class='add'>+    builder = GF_MALLOC(</div><div class='add'>+        sizeof(ec_code_builder_t) + sizeof(ec_code_op_t) * count,</div><div class='add'>+        ec_mt_ec_code_builder_t);</div><div class='add'>+    if (builder == NULL) {</div><div class='add'>+        return EC_ERR(ENOMEM);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    builder-&gt;address = 0;</div><div class='add'>+    builder-&gt;code = code;</div><div class='add'>+    builder-&gt;size = 0;</div><div class='add'>+    builder-&gt;count = 0;</div><div class='add'>+    builder-&gt;regs = 0;</div><div class='add'>+    builder-&gt;error = 0;</div><div class='add'>+    builder-&gt;bits = code-&gt;gf-&gt;bits;</div><div class='add'>+    builder-&gt;width = width;</div><div class='add'>+    builder-&gt;data = NULL;</div><div class='add'>+    builder-&gt;linear = linear;</div><div class='add'>+    builder-&gt;base = -1;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; EC_GF_MAX_REGS; i++) {</div><div class='add'>+        builder-&gt;map[i] = i;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return builder;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static size_t</div><div class='add'>+ec_code_space_size(void)</div><div class='add'>+{</div><div class='add'>+    return (sizeof(ec_code_space_t) + 15) &amp; ~15;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static size_t</div><div class='add'>+ec_code_chunk_size(void)</div><div class='add'>+{</div><div class='add'>+    return (sizeof(ec_code_chunk_t) + 15) &amp; ~15;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static ec_code_chunk_t *</div><div class='add'>+ec_code_chunk_from_space(ec_code_space_t *space)</div><div class='add'>+{</div><div class='add'>+    return (ec_code_chunk_t *)((uintptr_t)space + ec_code_space_size());</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void *</div><div class='add'>+ec_code_to_executable(ec_code_space_t *space, void *addr)</div><div class='add'>+{</div><div class='add'>+    return (void *)((uintptr_t)addr - (uintptr_t)space +</div><div class='add'>+                    (uintptr_t)space-&gt;exec);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void *</div><div class='add'>+ec_code_from_executable(ec_code_space_t *space, void *addr)</div><div class='add'>+{</div><div class='add'>+    return (void *)((uintptr_t)addr - (uintptr_t)space-&gt;exec +</div><div class='add'>+                    (uintptr_t)space);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void *</div><div class='add'>+ec_code_func_from_chunk(ec_code_chunk_t *chunk, void **exec)</div><div class='add'>+{</div><div class='add'>+    void *addr;</div><div class='add'>+</div><div class='add'>+    addr = (void *)((uintptr_t)chunk + ec_code_chunk_size());</div><div class='add'>+</div><div class='add'>+    *exec = ec_code_to_executable(chunk-&gt;space, addr);</div><div class='add'>+</div><div class='add'>+    return addr;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static ec_code_chunk_t *</div><div class='add'>+ec_code_chunk_from_func(ec_code_func_linear_t func)</div><div class='add'>+{</div><div class='add'>+    ec_code_chunk_t *chunk;</div><div class='add'>+</div><div class='add'>+    chunk = (ec_code_chunk_t *)((uintptr_t)func - ec_code_chunk_size());</div><div class='add'>+</div><div class='add'>+    return ec_code_from_executable(chunk-&gt;space, chunk);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static ec_code_chunk_t *</div><div class='add'>+ec_code_chunk_split(ec_code_chunk_t *chunk, size_t size)</div><div class='add'>+{</div><div class='add'>+    ec_code_chunk_t *extra;</div><div class='add'>+    ssize_t avail;</div><div class='add'>+</div><div class='add'>+    avail = chunk-&gt;size - size - ec_code_chunk_size();</div><div class='add'>+    if (avail &gt; 0) {</div><div class='add'>+        extra = (ec_code_chunk_t *)((uintptr_t)chunk + chunk-&gt;size - avail);</div><div class='add'>+        extra-&gt;space = chunk-&gt;space;</div><div class='add'>+        extra-&gt;size = avail;</div><div class='add'>+        list_add(&amp;extra-&gt;list, &amp;chunk-&gt;list);</div><div class='add'>+        chunk-&gt;size = size;</div><div class='add'>+    }</div><div class='add'>+    list_del_init(&amp;chunk-&gt;list);</div><div class='add'>+</div><div class='add'>+    return chunk;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static gf_boolean_t</div><div class='add'>+ec_code_chunk_touch(ec_code_chunk_t *prev, ec_code_chunk_t *next)</div><div class='add'>+{</div><div class='add'>+    uintptr_t end;</div><div class='add'>+</div><div class='add'>+    end = (uintptr_t)prev + ec_code_chunk_size() + prev-&gt;size;</div><div class='add'>+    return (end == (uintptr_t)next);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static ec_code_space_t *</div><div class='add'>+ec_code_space_create(ec_code_t *code, size_t size)</div><div class='add'>+{</div><div class='add'>+    char path[] = GLUSTERFS_LIBEXECDIR "/ec-code-dynamic.XXXXXX";</div><div class='add'>+    ec_code_space_t *space;</div><div class='add'>+    void *exec;</div><div class='add'>+    int32_t fd, err;</div><div class='add'>+</div><div class='add'>+    /* We need to create memory areas to store the generated dynamic code.</div><div class='add'>+     * Obviously these areas need to be written to be able to create the</div><div class='add'>+     * code and they also need to be executable to execute it.</div><div class='add'>+     *</div><div class='add'>+     * However it's a bad practice to have a memory region that is both</div><div class='add'>+     * writable *and* executable. In fact, selinux forbids this and causes</div><div class='add'>+     * attempts to do so to fail (unless specifically configured).</div><div class='add'>+     *</div><div class='add'>+     * To solve the problem we'll use two distinct memory areas mapped to</div><div class='add'>+     * the same physical storage. One of the memory areas will have write</div><div class='add'>+     * permission, and the other will have execute permission. Both areas</div><div class='add'>+     * will have the same contents. The physical storage will be a regular</div><div class='add'>+     * file that will be mmapped to both areas.</div><div class='add'>+     */</div><div class='add'>+</div><div class='add'>+    /* We need to create a temporary file as the backend storage for the</div><div class='add'>+     * memory mapped areas. */</div><div class='add'>+    /* coverity[secure_temp] mkstemp uses 0600 as the mode and is safe */</div><div class='add'>+    fd = mkstemp(path);</div><div class='add'>+    if (fd &lt; 0) {</div><div class='add'>+        err = errno;</div><div class='add'>+        gf_msg(THIS-&gt;name, GF_LOG_ERROR, err, EC_MSG_DYN_CREATE_FAILED,</div><div class='add'>+               "Unable to create a temporary file for the ec dynamic "</div><div class='add'>+               "code");</div><div class='add'>+        space = EC_ERR(err);</div><div class='add'>+        goto done;</div><div class='add'>+    }</div><div class='add'>+    /* Once created we don't need to keep it in the file system. It will</div><div class='add'>+     * still exist until we close the last file descriptor or unmap the</div><div class='add'>+     * memory areas bound to the file. */</div><div class='add'>+    sys_unlink(path);</div><div class='add'>+</div><div class='add'>+    size = (size + EC_CODE_ALIGN - 1) &amp; ~(EC_CODE_ALIGN - 1);</div><div class='add'>+    if (sys_ftruncate(fd, size) &lt; 0) {</div><div class='add'>+        err = errno;</div><div class='add'>+        gf_msg(THIS-&gt;name, GF_LOG_ERROR, err, EC_MSG_DYN_CREATE_FAILED,</div><div class='add'>+               "Unable to resize the file for the ec dynamic code");</div><div class='add'>+        space = EC_ERR(err);</div><div class='add'>+        goto done_close;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* This creates an executable memory area to be able to run the</div><div class='add'>+     * generated fragments of code. */</div><div class='add'>+    exec = mmap(NULL, size, PROT_READ | PROT_EXEC, MAP_SHARED, fd, 0);</div><div class='add'>+    if (exec == MAP_FAILED) {</div><div class='add'>+        err = errno;</div><div class='add'>+        gf_msg(THIS-&gt;name, GF_LOG_ERROR, err, EC_MSG_DYN_CREATE_FAILED,</div><div class='add'>+               "Unable to map the executable area for the ec dynamic "</div><div class='add'>+               "code");</div><div class='add'>+        space = EC_ERR(err);</div><div class='add'>+        goto done_close;</div><div class='add'>+    }</div><div class='add'>+    /* It's not important to check the return value of mlock(). If it fails</div><div class='add'>+     * everything will continue to work normally. */</div><div class='add'>+    mlock(exec, size);</div><div class='add'>+</div><div class='add'>+    /* This maps a read/write memory area to be able to create the dynamici</div><div class='add'>+     * code. */</div><div class='add'>+    space = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);</div><div class='add'>+    if (space == MAP_FAILED) {</div><div class='add'>+        err = errno;</div><div class='add'>+        gf_msg(THIS-&gt;name, GF_LOG_ERROR, err, EC_MSG_DYN_CREATE_FAILED,</div><div class='add'>+               "Unable to map the writable area for the ec dynamic "</div><div class='add'>+               "code");</div><div class='add'>+        space = EC_ERR(err);</div><div class='add'>+</div><div class='add'>+        munmap(exec, size);</div><div class='add'>+</div><div class='add'>+        goto done_close;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    space-&gt;exec = exec;</div><div class='add'>+    space-&gt;size = size;</div><div class='add'>+    space-&gt;code = code;</div><div class='add'>+    list_add_tail(&amp;space-&gt;list, &amp;code-&gt;spaces);</div><div class='add'>+    INIT_LIST_HEAD(&amp;space-&gt;chunks);</div><div class='add'>+</div><div class='add'>+done_close:</div><div class='add'>+    /* If everything has succeeded, we already have the memory areas</div><div class='add'>+     * mapped. We don't need the file descriptor anymore because the</div><div class='add'>+     * backend storage will be there until the mmap()'d regions are</div><div class='add'>+     * unmapped. */</div><div class='add'>+    sys_close(fd);</div><div class='add'>+done:</div><div class='add'>+    return space;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+ec_code_space_destroy(ec_code_space_t *space)</div><div class='add'>+{</div><div class='add'>+    list_del_init(&amp;space-&gt;list);</div><div class='add'>+</div><div class='add'>+    munmap(space-&gt;exec, space-&gt;size);</div><div class='add'>+    munmap(space, space-&gt;size);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+ec_code_chunk_merge(ec_code_chunk_t *chunk)</div><div class='add'>+{</div><div class='add'>+    ec_code_chunk_t *item, *tmp;</div><div class='add'>+</div><div class='add'>+    list_for_each_entry_safe(item, tmp, &amp;chunk-&gt;space-&gt;chunks, list)</div><div class='add'>+    {</div><div class='add'>+        if ((uintptr_t)item &gt; (uintptr_t)chunk) {</div><div class='add'>+            list_add_tail(&amp;chunk-&gt;list, &amp;item-&gt;list);</div><div class='add'>+            if (ec_code_chunk_touch(chunk, item)) {</div><div class='add'>+                chunk-&gt;size += item-&gt;size + ec_code_chunk_size();</div><div class='add'>+                list_del_init(&amp;item-&gt;list);</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            goto check;</div><div class='add'>+        }</div><div class='add'>+        if (ec_code_chunk_touch(item, chunk)) {</div><div class='add'>+            item-&gt;size += chunk-&gt;size + ec_code_chunk_size();</div><div class='add'>+            list_del_init(&amp;item-&gt;list);</div><div class='add'>+            chunk = item;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    list_add_tail(&amp;chunk-&gt;list, &amp;chunk-&gt;space-&gt;chunks);</div><div class='add'>+</div><div class='add'>+check:</div><div class='add'>+    if (chunk-&gt;size ==</div><div class='add'>+        chunk-&gt;space-&gt;size - ec_code_space_size() - ec_code_chunk_size()) {</div><div class='add'>+        ec_code_space_destroy(chunk-&gt;space);</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static ec_code_chunk_t *</div><div class='add'>+ec_code_space_alloc(ec_code_t *code, size_t size)</div><div class='add'>+{</div><div class='add'>+    ec_code_space_t *space;</div><div class='add'>+    ec_code_chunk_t *chunk;</div><div class='add'>+    size_t map_size;</div><div class='add'>+</div><div class='add'>+    /* To minimize fragmentation, we only allocate chunks of sizes multiples</div><div class='add'>+     * of EC_CODE_CHUNK_MIN_SIZE. */</div><div class='add'>+    size = ((size + ec_code_chunk_size() + EC_CODE_CHUNK_MIN_SIZE - 1) &amp;</div><div class='add'>+            ~(EC_CODE_CHUNK_MIN_SIZE - 1)) -</div><div class='add'>+           ec_code_chunk_size();</div><div class='add'>+    list_for_each_entry(space, &amp;code-&gt;spaces, list)</div><div class='add'>+    {</div><div class='add'>+        list_for_each_entry(chunk, &amp;space-&gt;chunks, list)</div><div class='add'>+        {</div><div class='add'>+            if (chunk-&gt;size &gt;= size) {</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    map_size = EC_CODE_SIZE - ec_code_space_size() - ec_code_chunk_size();</div><div class='add'>+    if (map_size &lt; size) {</div><div class='add'>+        map_size = size;</div><div class='add'>+    }</div><div class='add'>+    space = ec_code_space_create(code, map_size);</div><div class='add'>+    if (EC_IS_ERR(space)) {</div><div class='add'>+        return (ec_code_chunk_t *)space;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    chunk = ec_code_chunk_from_space(space);</div><div class='add'>+    chunk-&gt;size = map_size - ec_code_space_size() - ec_code_chunk_size();</div><div class='add'>+    list_add(&amp;chunk-&gt;list, &amp;space-&gt;chunks);</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    chunk-&gt;space = space;</div><div class='add'>+</div><div class='add'>+    return ec_code_chunk_split(chunk, size);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static ec_code_chunk_t *</div><div class='add'>+ec_code_alloc(ec_code_t *code, uint32_t size)</div><div class='add'>+{</div><div class='add'>+    ec_code_chunk_t *chunk;</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;code-&gt;lock);</div><div class='add'>+</div><div class='add'>+    chunk = ec_code_space_alloc(code, size);</div><div class='add'>+</div><div class='add'>+    UNLOCK(&amp;code-&gt;lock);</div><div class='add'>+</div><div class='add'>+    return chunk;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+ec_code_free(ec_code_chunk_t *chunk)</div><div class='add'>+{</div><div class='add'>+    gf_lock_t *lock;</div><div class='add'>+</div><div class='add'>+    lock = &amp;chunk-&gt;space-&gt;code-&gt;lock;</div><div class='add'>+    LOCK(lock);</div><div class='add'>+</div><div class='add'>+    ec_code_chunk_merge(chunk);</div><div class='add'>+</div><div class='add'>+    UNLOCK(lock);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int32_t</div><div class='add'>+ec_code_write(ec_code_builder_t *builder)</div><div class='add'>+{</div><div class='add'>+    ec_code_gen_t *gen;</div><div class='add'>+    ec_code_op_t *op;</div><div class='add'>+    uint32_t i;</div><div class='add'>+</div><div class='add'>+    builder-&gt;error = 0;</div><div class='add'>+    builder-&gt;size = 0;</div><div class='add'>+    builder-&gt;address = 0;</div><div class='add'>+    builder-&gt;base = -1;</div><div class='add'>+</div><div class='add'>+    gen = builder-&gt;code-&gt;gen;</div><div class='add'>+    gen-&gt;prolog(builder);</div><div class='add'>+    for (i = 0; i &lt; builder-&gt;count; i++) {</div><div class='add'>+        op = &amp;builder-&gt;ops[i];</div><div class='add'>+        switch (op-&gt;op) {</div><div class='add'>+            case EC_GF_OP_LOAD:</div><div class='add'>+                gen-&gt;load(builder, op-&gt;arg1.value, op-&gt;arg2.value,</div><div class='add'>+                          op-&gt;arg3.value);</div><div class='add'>+                break;</div><div class='add'>+            case EC_GF_OP_STORE:</div><div class='add'>+                gen-&gt;store(builder, op-&gt;arg1.value, op-&gt;arg3.value);</div><div class='add'>+                break;</div><div class='add'>+            case EC_GF_OP_COPY:</div><div class='add'>+                gen-&gt;copy(builder, op-&gt;arg1.value, op-&gt;arg2.value);</div><div class='add'>+                break;</div><div class='add'>+            case EC_GF_OP_XOR2:</div><div class='add'>+                gen-&gt;xor2(builder, op-&gt;arg1.value, op-&gt;arg2.value);</div><div class='add'>+                break;</div><div class='add'>+            case EC_GF_OP_XOR3:</div><div class='add'>+                gen-&gt;xor3(builder, op-&gt;arg1.value, op-&gt;arg2.value,</div><div class='add'>+                          op-&gt;arg3.value);</div><div class='add'>+                break;</div><div class='add'>+            case EC_GF_OP_XORM:</div><div class='add'>+                gen-&gt;xorm(builder, op-&gt;arg1.value, op-&gt;arg2.value,</div><div class='add'>+                          op-&gt;arg3.value);</div><div class='add'>+                break;</div><div class='add'>+            default:</div><div class='add'>+                break;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    gen-&gt;epilog(builder);</div><div class='add'>+</div><div class='add'>+    return builder-&gt;error;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void *</div><div class='add'>+ec_code_compile(ec_code_builder_t *builder)</div><div class='add'>+{</div><div class='add'>+    ec_code_chunk_t *chunk;</div><div class='add'>+    void *func;</div><div class='add'>+    int32_t err;</div><div class='add'>+</div><div class='add'>+    err = ec_code_write(builder);</div><div class='add'>+    if (err != 0) {</div><div class='add'>+        return EC_ERR(err);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    chunk = ec_code_alloc(builder-&gt;code, builder-&gt;size);</div><div class='add'>+    if (EC_IS_ERR(chunk)) {</div><div class='add'>+        return chunk;</div><div class='add'>+    }</div><div class='add'>+    builder-&gt;data = ec_code_func_from_chunk(chunk, &amp;func);</div><div class='add'>+</div><div class='add'>+    err = ec_code_write(builder);</div><div class='add'>+    if (err != 0) {</div><div class='add'>+        ec_code_free(chunk);</div><div class='add'>+</div><div class='add'>+        return EC_ERR(err);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    GF_FREE(builder);</div><div class='add'>+</div><div class='add'>+    return func;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+ec_code_t *</div><div class='add'>+ec_code_create(ec_gf_t *gf, ec_code_gen_t *gen)</div><div class='add'>+{</div><div class='add'>+    ec_code_t *code;</div><div class='add'>+</div><div class='add'>+    code = GF_MALLOC(sizeof(ec_code_t), ec_mt_ec_code_t);</div><div class='add'>+    if (code == NULL) {</div><div class='add'>+        return EC_ERR(ENOMEM);</div><div class='add'>+    }</div><div class='add'>+    memset(code, 0, sizeof(ec_code_t));</div><div class='add'>+    INIT_LIST_HEAD(&amp;code-&gt;spaces);</div><div class='add'>+    LOCK_INIT(&amp;code-&gt;lock);</div><div class='add'>+</div><div class='add'>+    code-&gt;gf = gf;</div><div class='add'>+    code-&gt;gen = gen;</div><div class='add'>+</div><div class='add'>+    return code;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_code_destroy(ec_code_t *code)</div><div class='add'>+{</div><div class='add'>+    if (!list_empty(&amp;code-&gt;spaces)) {</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    LOCK_DESTROY(&amp;code-&gt;lock);</div><div class='add'>+</div><div class='add'>+    GF_FREE(code);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static uint32_t</div><div class='add'>+ec_code_value_next(uint32_t *values, uint32_t count, uint32_t *offset)</div><div class='add'>+{</div><div class='add'>+    uint32_t i, next;</div><div class='add'>+</div><div class='add'>+    next = 0;</div><div class='add'>+    for (i = *offset + 1; i &lt; count; i++) {</div><div class='add'>+        next = values[i];</div><div class='add'>+        if (next != 0) {</div><div class='add'>+            break;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    *offset = i;</div><div class='add'>+</div><div class='add'>+    return next;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void *</div><div class='add'>+ec_code_build_dynamic(ec_code_t *code, uint32_t width, uint32_t *values,</div><div class='add'>+                      uint32_t count, gf_boolean_t linear)</div><div class='add'>+{</div><div class='add'>+    ec_code_builder_t *builder;</div><div class='add'>+    uint32_t offset, val, next;</div><div class='add'>+</div><div class='add'>+    builder = ec_code_prepare(code, count, width, linear);</div><div class='add'>+    if (EC_IS_ERR(builder)) {</div><div class='add'>+        return builder;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    offset = -1;</div><div class='add'>+    next = ec_code_value_next(values, count, &amp;offset);</div><div class='add'>+    if (next != 0) {</div><div class='add'>+        ec_code_gf_load(builder, offset);</div><div class='add'>+        do {</div><div class='add'>+            val = next;</div><div class='add'>+            next = ec_code_value_next(values, count, &amp;offset);</div><div class='add'>+            if (next != 0) {</div><div class='add'>+                ec_code_gf_mul(builder, ec_gf_div(code-&gt;gf, val, next));</div><div class='add'>+                ec_code_gf_load_xor(builder, offset);</div><div class='add'>+            }</div><div class='add'>+        } while (next != 0);</div><div class='add'>+        ec_code_gf_mul(builder, val);</div><div class='add'>+        ec_code_gf_store(builder);</div><div class='add'>+    } else {</div><div class='add'>+        ec_code_gf_clear(builder);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return ec_code_compile(builder);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void *</div><div class='add'>+ec_code_build(ec_code_t *code, uint32_t width, uint32_t *values, uint32_t count,</div><div class='add'>+              gf_boolean_t linear)</div><div class='add'>+{</div><div class='add'>+    void *func;</div><div class='add'>+</div><div class='add'>+    if (code-&gt;gen != NULL) {</div><div class='add'>+        func = ec_code_build_dynamic(code, width, values, count, linear);</div><div class='add'>+        if (!EC_IS_ERR(func)) {</div><div class='add'>+            return func;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        gf_msg_debug(THIS-&gt;name, GF_LOG_DEBUG,</div><div class='add'>+                     "Unable to generate dynamic code. Falling back "</div><div class='add'>+                     "to precompiled code");</div><div class='add'>+</div><div class='add'>+        /* The dynamic code generation shouldn't fail in normal</div><div class='add'>+         * conditions, but if it fails at some point, it's very</div><div class='add'>+         * probable that it will fail again, so we completely disable</div><div class='add'>+         * dynamic code generation. */</div><div class='add'>+        code-&gt;gen = NULL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ec_code_c_prepare(code-&gt;gf, values, count);</div><div class='add'>+</div><div class='add'>+    if (linear) {</div><div class='add'>+        return ec_code_c_linear;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return ec_code_c_interleaved;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+ec_code_func_linear_t</div><div class='add'>+ec_code_build_linear(ec_code_t *code, uint32_t width, uint32_t *values,</div><div class='add'>+                     uint32_t count)</div><div class='add'>+{</div><div class='add'>+    return (ec_code_func_linear_t)ec_code_build(code, width, values, count,</div><div class='add'>+                                                _gf_true);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+ec_code_func_interleaved_t</div><div class='add'>+ec_code_build_interleaved(ec_code_t *code, uint32_t width, uint32_t *values,</div><div class='add'>+                          uint32_t count)</div><div class='add'>+{</div><div class='add'>+    return (ec_code_func_interleaved_t)ec_code_build(code, width, values, count,</div><div class='add'>+                                                     _gf_false);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_code_release(ec_code_t *code, ec_code_func_t *func)</div><div class='add'>+{</div><div class='add'>+    if ((func-&gt;linear != ec_code_c_linear) &amp;&amp;</div><div class='add'>+        (func-&gt;interleaved != ec_code_c_interleaved)) {</div><div class='add'>+        ec_code_free(ec_code_chunk_from_func(func-&gt;linear));</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_code_error(ec_code_builder_t *builder, int32_t error)</div><div class='add'>+{</div><div class='add'>+    if (builder-&gt;error == 0) {</div><div class='add'>+        gf_msg(THIS-&gt;name, GF_LOG_ERROR, error, EC_MSG_DYN_CODEGEN_FAILED,</div><div class='add'>+               "Failed to generate dynamic code");</div><div class='add'>+        builder-&gt;error = error;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_code_emit(ec_code_builder_t *builder, uint8_t *bytes, uint32_t count)</div><div class='add'>+{</div><div class='add'>+    if (builder-&gt;error != 0) {</div><div class='add'>+        return;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (builder-&gt;data != NULL) {</div><div class='add'>+        memcpy(builder-&gt;data + builder-&gt;size, bytes, count);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    builder-&gt;size += count;</div><div class='add'>+    builder-&gt;address += count;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static char *</div><div class='add'>+ec_code_proc_trim_left(char *text, ssize_t *length)</div><div class='add'>+{</div><div class='add'>+    ssize_t len;</div><div class='add'>+</div><div class='add'>+    for (len = *length; (len &gt; 0) &amp;&amp; isspace(*text); len--) {</div><div class='add'>+        text++;</div><div class='add'>+    }</div><div class='add'>+    *length = len;</div><div class='add'>+</div><div class='add'>+    return text;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static char *</div><div class='add'>+ec_code_proc_trim_right(char *text, ssize_t *length, char sep)</div><div class='add'>+{</div><div class='add'>+    char *last;</div><div class='add'>+    ssize_t len;</div><div class='add'>+</div><div class='add'>+    len = *length;</div><div class='add'>+</div><div class='add'>+    last = text;</div><div class='add'>+    for (len = *length; (len &gt; 0) &amp;&amp; (*text != sep); len--) {</div><div class='add'>+        if (!isspace(*text)) {</div><div class='add'>+            last = text + 1;</div><div class='add'>+        }</div><div class='add'>+        text++;</div><div class='add'>+    }</div><div class='add'>+    *last = 0;</div><div class='add'>+    *length = len;</div><div class='add'>+</div><div class='add'>+    return text;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static char *</div><div class='add'>+ec_code_proc_line_parse(ec_code_proc_t *file, ssize_t *length)</div><div class='add'>+{</div><div class='add'>+    char *text, *end;</div><div class='add'>+    ssize_t len;</div><div class='add'>+</div><div class='add'>+    len = file-&gt;size - file-&gt;pos;</div><div class='add'>+    text = ec_code_proc_trim_left(file-&gt;buffer + file-&gt;pos, &amp;len);</div><div class='add'>+    end = ec_code_proc_trim_right(text, &amp;len, '\n');</div><div class='add'>+    if (len == 0) {</div><div class='add'>+        if (!file-&gt;eof) {</div><div class='add'>+            if (text == file-&gt;buffer) {</div><div class='add'>+                file-&gt;size = file-&gt;pos = 0;</div><div class='add'>+                file-&gt;skip = _gf_true;</div><div class='add'>+            } else {</div><div class='add'>+                file-&gt;size = file-&gt;pos = end - text;</div><div class='add'>+                memmove(file-&gt;buffer, text, file-&gt;pos + 1);</div><div class='add'>+            }</div><div class='add'>+            len = sys_read(file-&gt;fd, file-&gt;buffer + file-&gt;pos,</div><div class='add'>+                           sizeof(file-&gt;buffer) - file-&gt;pos - 1);</div><div class='add'>+            if (len &gt; 0) {</div><div class='add'>+                file-&gt;size += len;</div><div class='add'>+            }</div><div class='add'>+            file-&gt;error = len &lt; 0;</div><div class='add'>+            file-&gt;eof = len &lt;= 0;</div><div class='add'>+</div><div class='add'>+            return NULL;</div><div class='add'>+        }</div><div class='add'>+        file-&gt;size = file-&gt;pos = 0;</div><div class='add'>+    } else {</div><div class='add'>+        file-&gt;pos = end - file-&gt;buffer + 1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    *length = end - text;</div><div class='add'>+</div><div class='add'>+    if (file-&gt;skip) {</div><div class='add'>+        file-&gt;skip = _gf_false;</div><div class='add'>+        text = NULL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return text;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static char *</div><div class='add'>+ec_code_proc_line(ec_code_proc_t *file, ssize_t *length)</div><div class='add'>+{</div><div class='add'>+    char *text;</div><div class='add'>+</div><div class='add'>+    text = NULL;</div><div class='add'>+    while (!file-&gt;eof) {</div><div class='add'>+        text = ec_code_proc_line_parse(file, length);</div><div class='add'>+        if (text != NULL) {</div><div class='add'>+            break;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return text;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static char *</div><div class='add'>+ec_code_proc_split(char *text, ssize_t *length, char sep)</div><div class='add'>+{</div><div class='add'>+    text = ec_code_proc_trim_right(text, length, sep);</div><div class='add'>+    if (*length == 0) {</div><div class='add'>+        return NULL;</div><div class='add'>+    }</div><div class='add'>+    (*length)--;</div><div class='add'>+    text++;</div><div class='add'>+</div><div class='add'>+    return ec_code_proc_trim_left(text, length);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static uint32_t</div><div class='add'>+ec_code_cpu_check(uint32_t idx, char *list, uint32_t count)</div><div class='add'>+{</div><div class='add'>+    ec_code_gen_t *gen;</div><div class='add'>+    char **ptr;</div><div class='add'>+    char *table[count + 1];</div><div class='add'>+    uint32_t i;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; count; i++) {</div><div class='add'>+        table[i] = list;</div><div class='add'>+        list += strlen(list) + 1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    gen = ec_code_gen_table[idx];</div><div class='add'>+    while (gen != NULL) {</div><div class='add'>+        for (ptr = gen-&gt;flags; *ptr != NULL; ptr++) {</div><div class='add'>+            for (i = 0; i &lt; count; i++) {</div><div class='add'>+                if (strcmp(*ptr, table[i]) == 0) {</div><div class='add'>+                    break;</div><div class='add'>+                }</div><div class='add'>+            }</div><div class='add'>+            if (i &gt;= count) {</div><div class='add'>+                gen = ec_code_gen_table[++idx];</div><div class='add'>+                break;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+        if (*ptr == NULL) {</div><div class='add'>+            break;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return idx;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+ec_code_gen_t *</div><div class='add'>+ec_code_detect(xlator_t *xl, const char *def)</div><div class='add'>+{</div><div class='add'>+    ec_code_proc_t file;</div><div class='add'>+    ec_code_gen_t *gen = NULL;</div><div class='add'>+    char *line, *data, *list;</div><div class='add'>+    ssize_t length;</div><div class='add'>+    uint32_t count, base, select;</div><div class='add'>+</div><div class='add'>+    if (strcmp(def, "none") == 0) {</div><div class='add'>+        gf_msg(xl-&gt;name, GF_LOG_INFO, 0, EC_MSG_EXTENSION_NONE,</div><div class='add'>+               "Not using any cpu extensions");</div><div class='add'>+</div><div class='add'>+        return NULL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    file.fd = sys_open(PROC_CPUINFO, O_RDONLY, 0);</div><div class='add'>+    if (file.fd &lt; 0) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    file.size = file.pos = 0;</div><div class='add'>+    file.eof = file.error = file.skip = _gf_false;</div><div class='add'>+</div><div class='add'>+    select = 0;</div><div class='add'>+    if (strcmp(def, "auto") != 0) {</div><div class='add'>+        while (ec_code_gen_table[select] != NULL) {</div><div class='add'>+            if (strcmp(ec_code_gen_table[select]-&gt;name, def) == 0) {</div><div class='add'>+                break;</div><div class='add'>+            }</div><div class='add'>+            select++;</div><div class='add'>+        }</div><div class='add'>+        if (ec_code_gen_table[select] == NULL) {</div><div class='add'>+            gf_msg(xl-&gt;name, GF_LOG_WARNING, EINVAL, EC_MSG_EXTENSION_UNKNOWN,</div><div class='add'>+                   "CPU extension '%s' is not known. Not using any cpu "</div><div class='add'>+                   "extensions",</div><div class='add'>+                   def);</div><div class='add'>+</div><div class='add'>+            return NULL;</div><div class='add'>+        }</div><div class='add'>+    } else {</div><div class='add'>+        def = NULL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    while ((line = ec_code_proc_line(&amp;file, &amp;length)) != NULL) {</div><div class='add'>+        data = ec_code_proc_split(line, &amp;length, ':');</div><div class='add'>+        if ((data != NULL) &amp;&amp; (strcmp(line, "flags") == 0)) {</div><div class='add'>+            list = data;</div><div class='add'>+            count = 0;</div><div class='add'>+            while ((data != NULL) &amp;&amp; (*data != 0)) {</div><div class='add'>+                count++;</div><div class='add'>+                data = ec_code_proc_split(data, &amp;length, ' ');</div><div class='add'>+            }</div><div class='add'>+            base = select;</div><div class='add'>+            select = ec_code_cpu_check(select, list, count);</div><div class='add'>+            if ((base != select) &amp;&amp; (def != NULL)) {</div><div class='add'>+                gf_msg(xl-&gt;name, GF_LOG_WARNING, ENOTSUP,</div><div class='add'>+                       EC_MSG_EXTENSION_UNSUPPORTED,</div><div class='add'>+                       "CPU extension '%s' is not supported", def);</div><div class='add'>+                def = NULL;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (file.error) {</div><div class='add'>+        gf_msg(xl-&gt;name, GF_LOG_WARNING, 0, EC_MSG_EXTENSION_FAILED,</div><div class='add'>+               "Unable to determine supported CPU extensions. Not using any "</div><div class='add'>+               "cpu extensions");</div><div class='add'>+</div><div class='add'>+        gen = NULL;</div><div class='add'>+    } else {</div><div class='add'>+        gen = ec_code_gen_table[select];</div><div class='add'>+        if (gen == NULL) {</div><div class='add'>+            gf_msg(xl-&gt;name, GF_LOG_INFO, 0, EC_MSG_EXTENSION_NONE,</div><div class='add'>+                   "Not using any cpu extensions");</div><div class='add'>+        } else {</div><div class='add'>+            gf_msg(xl-&gt;name, GF_LOG_INFO, 0, EC_MSG_EXTENSION,</div><div class='add'>+                   "Using '%s' CPU extensions", gen-&gt;name);</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    sys_close(file.fd);</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return gen;</div><div class='add'>+}</div><div class='head'>diff --git a/xlators/cluster/ec/src/ec-code.h b/xlators/cluster/ec/src/ec-code.h<br/>new file mode 100644<br/>index 00000000000..75fb35d93e3<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/xlators/cluster/ec/src/ec-code.h?id=d1d7a6f35c816822fab51c820e25023863c239c1'>xlators/cluster/ec/src/ec-code.h</a></div><div class='hunk'>@@ -0,0 +1,44 @@</div><div class='add'>+/*</div><div class='add'>+  Copyright (c) 2015 DataLab, s.l. &lt;http://www.datalab.es&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#ifndef __EC_CODE_H__</div><div class='add'>+#define __EC_CODE_H__</div><div class='add'>+</div><div class='add'>+#include &lt;glusterfs/xlator.h&gt;</div><div class='add'>+#include &lt;glusterfs/list.h&gt;</div><div class='add'>+</div><div class='add'>+#include "ec-types.h"</div><div class='add'>+#include "ec-galois.h"</div><div class='add'>+</div><div class='add'>+ec_code_gen_t *</div><div class='add'>+ec_code_detect(xlator_t *xl, const char *def);</div><div class='add'>+</div><div class='add'>+ec_code_t *</div><div class='add'>+ec_code_create(ec_gf_t *gf, ec_code_gen_t *gen);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_code_destroy(ec_code_t *code);</div><div class='add'>+</div><div class='add'>+ec_code_func_linear_t</div><div class='add'>+ec_code_build_linear(ec_code_t *code, uint32_t width, uint32_t *values,</div><div class='add'>+                     uint32_t count);</div><div class='add'>+ec_code_func_interleaved_t</div><div class='add'>+ec_code_build_interleaved(ec_code_t *code, uint32_t width, uint32_t *values,</div><div class='add'>+                          uint32_t count);</div><div class='add'>+void</div><div class='add'>+ec_code_release(ec_code_t *code, ec_code_func_t *func);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_code_error(ec_code_builder_t *builder, int32_t error);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_code_emit(ec_code_builder_t *builder, uint8_t *bytes, uint32_t count);</div><div class='add'>+</div><div class='add'>+#endif /* __EC_CODE_H__ */</div><div class='head'>diff --git a/xlators/cluster/ec/src/ec-combine.c b/xlators/cluster/ec/src/ec-combine.c<br/>new file mode 100644<br/>index 00000000000..703a30e2485<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/xlators/cluster/ec/src/ec-combine.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>xlators/cluster/ec/src/ec-combine.c</a></div><div class='hunk'>@@ -0,0 +1,995 @@</div><div class='add'>+/*</div><div class='add'>+  Copyright (c) 2012-2014 DataLab, s.l. &lt;http://www.datalab.es&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#include &lt;fnmatch.h&gt;</div><div class='add'>+</div><div class='add'>+#include "libxlator.h"</div><div class='add'>+#include &lt;glusterfs/byte-order.h&gt;</div><div class='add'>+</div><div class='add'>+#include "ec-types.h"</div><div class='add'>+#include "ec-helpers.h"</div><div class='add'>+#include "ec-common.h"</div><div class='add'>+#include "ec-combine.h"</div><div class='add'>+#include "ec-messages.h"</div><div class='add'>+#include &lt;glusterfs/quota-common-utils.h&gt;</div><div class='add'>+</div><div class='add'>+#define EC_QUOTA_PREFIX "trusted.glusterfs.quota."</div><div class='add'>+</div><div class='add'>+#define EC_MISSING_DATA ((data_t *)1ULL)</div><div class='add'>+</div><div class='add'>+struct _ec_dict_info;</div><div class='add'>+typedef struct _ec_dict_info ec_dict_info_t;</div><div class='add'>+</div><div class='add'>+struct _ec_dict_combine;</div><div class='add'>+typedef struct _ec_dict_combine ec_dict_combine_t;</div><div class='add'>+</div><div class='add'>+struct _ec_dict_info {</div><div class='add'>+    dict_t *dict;</div><div class='add'>+    int32_t count;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct _ec_dict_combine {</div><div class='add'>+    ec_cbk_data_t *cbk;</div><div class='add'>+    int32_t which;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_combine_write(ec_fop_data_t *fop, ec_cbk_data_t *dst, ec_cbk_data_t *src)</div><div class='add'>+{</div><div class='add'>+    int valid = 0;</div><div class='add'>+</div><div class='add'>+    if (!fop || !dst || !src)</div><div class='add'>+        return 0;</div><div class='add'>+</div><div class='add'>+    switch (fop-&gt;id) {</div><div class='add'>+        case GF_FOP_REMOVEXATTR:</div><div class='add'>+        case GF_FOP_FREMOVEXATTR:</div><div class='add'>+        case GF_FOP_SETXATTR:</div><div class='add'>+        case GF_FOP_FSETXATTR:</div><div class='add'>+            return 1;</div><div class='add'>+</div><div class='add'>+        case GF_FOP_SYMLINK:</div><div class='add'>+        case GF_FOP_LINK:</div><div class='add'>+        case GF_FOP_CREATE:</div><div class='add'>+        case GF_FOP_MKNOD:</div><div class='add'>+        case GF_FOP_MKDIR:</div><div class='add'>+            valid = 3;</div><div class='add'>+            break;</div><div class='add'>+        case GF_FOP_UNLINK:</div><div class='add'>+        case GF_FOP_RMDIR:</div><div class='add'>+        case GF_FOP_SETATTR:</div><div class='add'>+        case GF_FOP_FSETATTR:</div><div class='add'>+        case GF_FOP_TRUNCATE:</div><div class='add'>+        case GF_FOP_FTRUNCATE:</div><div class='add'>+        case GF_FOP_WRITE:</div><div class='add'>+        case GF_FOP_FALLOCATE:</div><div class='add'>+        case GF_FOP_DISCARD:</div><div class='add'>+        case GF_FOP_ZEROFILL:</div><div class='add'>+            valid = 2;</div><div class='add'>+            break;</div><div class='add'>+        case GF_FOP_RENAME:</div><div class='add'>+            valid = 5;</div><div class='add'>+            break;</div><div class='add'>+        default:</div><div class='add'>+            gf_msg_callingfn(fop-&gt;xl-&gt;name, GF_LOG_WARNING, EINVAL,</div><div class='add'>+                             EC_MSG_INVALID_FOP, "Invalid fop %d", fop-&gt;id);</div><div class='add'>+            return 0;</div><div class='add'>+            break;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (!ec_iatt_combine(fop, dst-&gt;iatt, src-&gt;iatt, valid)) {</div><div class='add'>+        gf_msg(fop-&gt;xl-&gt;name, GF_LOG_NOTICE, 0, EC_MSG_IATT_MISMATCH,</div><div class='add'>+               "Mismatching iatt in "</div><div class='add'>+               "answers of '%s'",</div><div class='add'>+               gf_fop_list[fop-&gt;id]);</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='add'>+    return 1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_iatt_time_merge(int64_t *dst_sec, uint32_t *dst_nsec, int64_t src_sec,</div><div class='add'>+                   uint32_t src_nsec)</div><div class='add'>+{</div><div class='add'>+    if ((*dst_sec &lt; src_sec) ||</div><div class='add'>+        ((*dst_sec == src_sec) &amp;&amp; (*dst_nsec &lt; src_nsec))) {</div><div class='add'>+        *dst_sec = src_sec;</div><div class='add'>+        *dst_nsec = src_nsec;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static gf_boolean_t</div><div class='add'>+ec_iatt_is_trusted(ec_fop_data_t *fop, struct iatt *iatt)</div><div class='add'>+{</div><div class='add'>+    uint64_t ino;</div><div class='add'>+    int32_t i;</div><div class='add'>+</div><div class='add'>+    /* Only the top level fop will have fop-&gt;locks filled. */</div><div class='add'>+    while (fop-&gt;parent != NULL) {</div><div class='add'>+        fop = fop-&gt;parent;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Lookups are special requests always done without locks taken but they</div><div class='add'>+     * require to be able to identify differences between bricks. Special</div><div class='add'>+     * handling of these differences is already done in lookup specific code</div><div class='add'>+     * so we shouldn't ignore any difference here and consider all iatt</div><div class='add'>+     * structures as trusted. */</div><div class='add'>+    if (fop-&gt;id == GF_FOP_LOOKUP) {</div><div class='add'>+        return _gf_true;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Check if the iatt references an inode locked by the current fop */</div><div class='add'>+    for (i = 0; i &lt; fop-&gt;lock_count; i++) {</div><div class='add'>+        ino = gfid_to_ino(fop-&gt;locks[i].lock-&gt;loc.inode-&gt;gfid);</div><div class='add'>+        if (iatt-&gt;ia_ino == ino) {</div><div class='add'>+            return _gf_true;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return _gf_false;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_iatt_combine(ec_fop_data_t *fop, struct iatt *dst, struct iatt *src,</div><div class='add'>+                int32_t count)</div><div class='add'>+{</div><div class='add'>+    int32_t i;</div><div class='add'>+    gf_boolean_t failed = _gf_false;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; count; i++) {</div><div class='add'>+        /* Check for basic fields. These fields must be equal always, even if</div><div class='add'>+         * the inode is not locked because in these cases the parent inode</div><div class='add'>+         * will be locked and differences in these fields require changes in</div><div class='add'>+         * the parent directory. */</div><div class='add'>+        if ((dst[i].ia_ino != src[i].ia_ino) ||</div><div class='add'>+            (((dst[i].ia_type == IA_IFBLK) || (dst[i].ia_type == IA_IFCHR)) &amp;&amp;</div><div class='add'>+             (dst[i].ia_rdev != src[i].ia_rdev)) ||</div><div class='add'>+            (gf_uuid_compare(dst[i].ia_gfid, src[i].ia_gfid) != 0)) {</div><div class='add'>+            failed = _gf_true;</div><div class='add'>+        }</div><div class='add'>+        /* Check for not so stable fields. These fields can change if the</div><div class='add'>+         * inode is not locked. */</div><div class='add'>+        if (!failed &amp;&amp; ((dst[i].ia_uid != src[i].ia_uid) ||</div><div class='add'>+                        (dst[i].ia_gid != src[i].ia_gid) ||</div><div class='add'>+                        (st_mode_from_ia(dst[i].ia_prot, dst[i].ia_type) !=</div><div class='add'>+                         st_mode_from_ia(src[i].ia_prot, src[i].ia_type)))) {</div><div class='add'>+            if (ec_iatt_is_trusted(fop, dst)) {</div><div class='add'>+                /* If the iatt contains information from an inode that is</div><div class='add'>+                 * locked, these differences are real problems, so we need to</div><div class='add'>+                 * report them. Otherwise we ignore them and don't care which</div><div class='add'>+                 * data is returned. */</div><div class='add'>+                failed = _gf_true;</div><div class='add'>+            } else {</div><div class='add'>+                gf_msg_debug(fop-&gt;xl-&gt;name, 0,</div><div class='add'>+                             "Ignoring iatt differences because inode is not "</div><div class='add'>+                             "locked");</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+        if (failed) {</div><div class='add'>+            gf_msg(fop-&gt;xl-&gt;name, GF_LOG_WARNING, 0, EC_MSG_IATT_COMBINE_FAIL,</div><div class='add'>+                   "Failed to combine iatt (inode: %" PRIu64 "-%" PRIu64</div><div class='add'>+                   ", "</div><div class='add'>+                   "links: %u-%u, uid: %u-%u, gid: %u-%u, "</div><div class='add'>+                   "rdev: %" PRIu64 "-%" PRIu64 ", size: %" PRIu64 "-%" PRIu64</div><div class='add'>+                   ", "</div><div class='add'>+                   "mode: %o-%o), %s",</div><div class='add'>+                   dst[i].ia_ino, src[i].ia_ino, dst[i].ia_nlink,</div><div class='add'>+                   src[i].ia_nlink, dst[i].ia_uid, src[i].ia_uid, dst[i].ia_gid,</div><div class='add'>+                   src[i].ia_gid, dst[i].ia_rdev, src[i].ia_rdev,</div><div class='add'>+                   dst[i].ia_size, src[i].ia_size,</div><div class='add'>+                   st_mode_from_ia(dst[i].ia_prot, dst[i].ia_type),</div><div class='add'>+                   st_mode_from_ia(src[i].ia_prot, dst[i].ia_type),</div><div class='add'>+                   ec_msg_str(fop));</div><div class='add'>+</div><div class='add'>+            return 0;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    while (count-- &gt; 0) {</div><div class='add'>+        dst[count].ia_blocks += src[count].ia_blocks;</div><div class='add'>+        if (dst[count].ia_blksize &lt; src[count].ia_blksize) {</div><div class='add'>+            dst[count].ia_blksize = src[count].ia_blksize;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        ec_iatt_time_merge(&amp;dst[count].ia_atime, &amp;dst[count].ia_atime_nsec,</div><div class='add'>+                           src[count].ia_atime, src[count].ia_atime_nsec);</div><div class='add'>+        ec_iatt_time_merge(&amp;dst[count].ia_mtime, &amp;dst[count].ia_mtime_nsec,</div><div class='add'>+                           src[count].ia_mtime, src[count].ia_mtime_nsec);</div><div class='add'>+        ec_iatt_time_merge(&amp;dst[count].ia_ctime, &amp;dst[count].ia_ctime_nsec,</div><div class='add'>+                           src[count].ia_ctime, src[count].ia_ctime_nsec);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_iatt_rebuild(ec_t *ec, struct iatt *iatt, int32_t count, int32_t answers)</div><div class='add'>+{</div><div class='add'>+    uint64_t blocks;</div><div class='add'>+</div><div class='add'>+    while (count-- &gt; 0) {</div><div class='add'>+        blocks = iatt[count].ia_blocks * ec-&gt;fragments + answers - 1;</div><div class='add'>+        blocks /= answers;</div><div class='add'>+        iatt[count].ia_blocks = blocks;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+gf_boolean_t</div><div class='add'>+ec_xattr_match(dict_t *dict, char *key, data_t *value, void *arg)</div><div class='add'>+{</div><div class='add'>+    if ((fnmatch(GF_XATTR_STIME_PATTERN, key, 0) == 0) ||</div><div class='add'>+        (strcmp(key, GET_LINK_COUNT) == 0) ||</div><div class='add'>+        (strcmp(key, GLUSTERFS_INODELK_COUNT) == 0) ||</div><div class='add'>+        (strcmp(key, GLUSTERFS_ENTRYLK_COUNT) == 0) ||</div><div class='add'>+        (strcmp(key, GLUSTERFS_OPEN_FD_COUNT) == 0)) {</div><div class='add'>+        return _gf_false;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return _gf_true;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+gf_boolean_t</div><div class='add'>+ec_value_ignore(char *key)</div><div class='add'>+{</div><div class='add'>+    if ((strcmp(key, GF_CONTENT_KEY) == 0) ||</div><div class='add'>+        (strcmp(key, GF_XATTR_PATHINFO_KEY) == 0) ||</div><div class='add'>+        (strcmp(key, GF_XATTR_USER_PATHINFO_KEY) == 0) ||</div><div class='add'>+        (strcmp(key, GF_XATTR_LOCKINFO_KEY) == 0) ||</div><div class='add'>+        (strcmp(key, GLUSTERFS_OPEN_FD_COUNT) == 0) ||</div><div class='add'>+        (strcmp(key, GLUSTERFS_INODELK_COUNT) == 0) ||</div><div class='add'>+        (strcmp(key, GLUSTERFS_ENTRYLK_COUNT) == 0) ||</div><div class='add'>+        (strncmp(key, GF_XATTR_CLRLK_CMD, SLEN(GF_XATTR_CLRLK_CMD)) == 0) ||</div><div class='add'>+        (strcmp(key, DHT_IATT_IN_XDATA_KEY) == 0) ||</div><div class='add'>+        (strncmp(key, EC_QUOTA_PREFIX, SLEN(EC_QUOTA_PREFIX)) == 0) ||</div><div class='add'>+        (fnmatch(MARKER_XATTR_PREFIX ".*." XTIME, key, 0) == 0) ||</div><div class='add'>+        (fnmatch(GF_XATTR_MARKER_KEY ".*", key, 0) == 0) ||</div><div class='add'>+        (XATTR_IS_NODE_UUID(key))) {</div><div class='add'>+        return _gf_true;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return _gf_false;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_dict_compare(dict_t *dict1, dict_t *dict2)</div><div class='add'>+{</div><div class='add'>+    if (are_dicts_equal(dict1, dict2, ec_xattr_match, ec_value_ignore))</div><div class='add'>+        return 1;</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static uint32_t</div><div class='add'>+ec_dict_list(data_t **list, ec_cbk_data_t *cbk, int32_t which, char *key,</div><div class='add'>+             gf_boolean_t global)</div><div class='add'>+{</div><div class='add'>+    ec_t *ec = cbk-&gt;fop-&gt;xl-&gt;private;</div><div class='add'>+    ec_cbk_data_t *ans = NULL;</div><div class='add'>+    dict_t *dict = NULL;</div><div class='add'>+    data_t *data;</div><div class='add'>+    uint32_t count;</div><div class='add'>+    int32_t i;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; ec-&gt;nodes; i++) {</div><div class='add'>+        /* We initialize the list with EC_MISSING_DATA if we are</div><div class='add'>+         * returning a global list or the current subvolume belongs</div><div class='add'>+         * to the group of the accepted answer. Note that if some</div><div class='add'>+         * subvolume is known to be down before issuing the request,</div><div class='add'>+         * we won't have any answer from it, so we set here the</div><div class='add'>+         * appropriate default value. */</div><div class='add'>+        if (global || ((cbk-&gt;mask &amp; (1ULL &lt;&lt; i)) != 0)) {</div><div class='add'>+            list[i] = EC_MISSING_DATA;</div><div class='add'>+        } else {</div><div class='add'>+            list[i] = NULL;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    count = 0;</div><div class='add'>+    list_for_each_entry(ans, &amp;cbk-&gt;fop-&gt;answer_list, answer_list)</div><div class='add'>+    {</div><div class='add'>+        if (global || ((cbk-&gt;mask &amp; ans-&gt;mask) != 0)) {</div><div class='add'>+            dict = (which == EC_COMBINE_XDATA) ? ans-&gt;xdata : ans-&gt;dict;</div><div class='add'>+            data = dict_get(dict, key);</div><div class='add'>+            if (data != NULL) {</div><div class='add'>+                list[ans-&gt;idx] = data;</div><div class='add'>+                count++;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return count;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_concat_prepare(xlator_t *xl, char **str, char **sep, char **post,</div><div class='add'>+                  const char *fmt, va_list args)</div><div class='add'>+{</div><div class='add'>+    char *tmp;</div><div class='add'>+    int32_t len;</div><div class='add'>+</div><div class='add'>+    len = gf_vasprintf(str, fmt, args);</div><div class='add'>+    if (len &lt; 0) {</div><div class='add'>+        return -ENOMEM;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    tmp = strchr(*str, '{');</div><div class='add'>+    if (tmp == NULL) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    *tmp++ = 0;</div><div class='add'>+    *sep = tmp;</div><div class='add'>+    tmp = strchr(tmp, '}');</div><div class='add'>+    if (tmp == NULL) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    *tmp++ = 0;</div><div class='add'>+    *post = tmp;</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    gf_msg(xl-&gt;name, GF_LOG_ERROR, EINVAL, EC_MSG_INVALID_FORMAT,</div><div class='add'>+           "Invalid concat format");</div><div class='add'>+</div><div class='add'>+    GF_FREE(*str);</div><div class='add'>+</div><div class='add'>+    return -EINVAL;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int32_t</div><div class='add'>+ec_dict_data_concat(ec_cbk_data_t *cbk, int32_t which, char *key, char *new_key,</div><div class='add'>+                    const char *def, gf_boolean_t global, const char *fmt, ...)</div><div class='add'>+{</div><div class='add'>+    ec_t *ec = cbk-&gt;fop-&gt;xl-&gt;private;</div><div class='add'>+    data_t *data[ec-&gt;nodes];</div><div class='add'>+    char *str = NULL, *pre = NULL, *sep, *post;</div><div class='add'>+    dict_t *dict;</div><div class='add'>+    va_list args;</div><div class='add'>+    int32_t i, num, len, deflen, prelen, postlen, seplen, tmp;</div><div class='add'>+    int32_t err;</div><div class='add'>+</div><div class='add'>+    ec_dict_list(data, cbk, which, key, global);</div><div class='add'>+</div><div class='add'>+    va_start(args, fmt);</div><div class='add'>+    err = ec_concat_prepare(cbk-&gt;fop-&gt;xl, &amp;pre, &amp;sep, &amp;post, fmt, args);</div><div class='add'>+    va_end(args);</div><div class='add'>+</div><div class='add'>+    if (err != 0) {</div><div class='add'>+        return err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    prelen = strlen(pre);</div><div class='add'>+    seplen = strlen(sep);</div><div class='add'>+    postlen = strlen(post);</div><div class='add'>+</div><div class='add'>+    deflen = 0;</div><div class='add'>+    if (def != NULL) {</div><div class='add'>+        deflen = strlen(def);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    len = prelen + postlen + 1;</div><div class='add'>+    num = -1;</div><div class='add'>+    for (i = 0; i &lt; ec-&gt;nodes; i++) {</div><div class='add'>+        if (data[i] == NULL) {</div><div class='add'>+            continue;</div><div class='add'>+        }</div><div class='add'>+        if (data[i] == EC_MISSING_DATA) {</div><div class='add'>+            if (def == NULL) {</div><div class='add'>+                continue;</div><div class='add'>+            }</div><div class='add'>+            len += deflen;</div><div class='add'>+        } else {</div><div class='add'>+            len += data[i]-&gt;len - 1;</div><div class='add'>+        }</div><div class='add'>+        if (num &gt;= 0) {</div><div class='add'>+            len += seplen;</div><div class='add'>+        }</div><div class='add'>+        num++;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    err = -ENOMEM;</div><div class='add'>+</div><div class='add'>+    str = GF_MALLOC(len, gf_common_mt_char);</div><div class='add'>+    if (str == NULL) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    memcpy(str, pre, prelen);</div><div class='add'>+    len = prelen;</div><div class='add'>+    for (i = 0; i &lt; ec-&gt;nodes; i++) {</div><div class='add'>+        if (data[i] == NULL) {</div><div class='add'>+            continue;</div><div class='add'>+        }</div><div class='add'>+        if (data[i] == EC_MISSING_DATA) {</div><div class='add'>+            if (deflen == 0) {</div><div class='add'>+                continue;</div><div class='add'>+            }</div><div class='add'>+            tmp = deflen;</div><div class='add'>+            memcpy(str + len, def, tmp);</div><div class='add'>+        } else {</div><div class='add'>+            tmp = data[i]-&gt;len - 1;</div><div class='add'>+            memcpy(str + len, data[i]-&gt;data, tmp);</div><div class='add'>+        }</div><div class='add'>+        len += tmp;</div><div class='add'>+        if (i &lt; num) {</div><div class='add'>+            memcpy(str + len, sep, seplen);</div><div class='add'>+            len += seplen;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    memcpy(str + len, post, postlen + 1);</div><div class='add'>+</div><div class='add'>+    dict = (which == EC_COMBINE_XDATA) ? cbk-&gt;xdata : cbk-&gt;dict;</div><div class='add'>+    if (new_key) {</div><div class='add'>+        key = new_key;</div><div class='add'>+    }</div><div class='add'>+    err = dict_set_dynstr(dict, key, str);</div><div class='add'>+    if (err != 0) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    str = NULL;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    GF_FREE(str);</div><div class='add'>+    GF_FREE(pre);</div><div class='add'>+</div><div class='add'>+    return err;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_dict_data_merge(ec_cbk_data_t *cbk, int32_t which, char *key)</div><div class='add'>+{</div><div class='add'>+    ec_t *ec = cbk-&gt;fop-&gt;xl-&gt;private;</div><div class='add'>+    data_t *data[ec-&gt;nodes];</div><div class='add'>+    dict_t *dict, *lockinfo, *tmp = NULL;</div><div class='add'>+    char *ptr = NULL;</div><div class='add'>+    int32_t i, len;</div><div class='add'>+    int32_t err;</div><div class='add'>+</div><div class='add'>+    ec_dict_list(data, cbk, which, key, _gf_false);</div><div class='add'>+</div><div class='add'>+    lockinfo = dict_new();</div><div class='add'>+    if (lockinfo == NULL) {</div><div class='add'>+        return -ENOMEM;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; ec-&gt;nodes; i++) {</div><div class='add'>+        if ((data[i] == NULL) || (data[i] == EC_MISSING_DATA)) {</div><div class='add'>+            continue;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        tmp = dict_new();</div><div class='add'>+        if (tmp == NULL) {</div><div class='add'>+            err = -ENOMEM;</div><div class='add'>+</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+        err = dict_unserialize(data[i]-&gt;data, data[i]-&gt;len, &amp;tmp);</div><div class='add'>+        if (err != 0) {</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+        if (dict_copy(tmp, lockinfo) == NULL) {</div><div class='add'>+            err = -ENOMEM;</div><div class='add'>+</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        dict_unref(tmp);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    tmp = NULL;</div><div class='add'>+</div><div class='add'>+    err = dict_allocate_and_serialize(lockinfo, (char **)&amp;ptr,</div><div class='add'>+                                      (unsigned int *)&amp;len);</div><div class='add'>+    if (err != 0) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    dict = (which == EC_COMBINE_XDATA) ? cbk-&gt;xdata : cbk-&gt;dict;</div><div class='add'>+    err = dict_set_dynptr(dict, key, ptr, len);</div><div class='add'>+    if (err != 0) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ptr = NULL;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    GF_FREE(ptr);</div><div class='add'>+    dict_unref(lockinfo);</div><div class='add'>+    if (tmp != NULL) {</div><div class='add'>+        dict_unref(tmp);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return err;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_dict_data_uuid(ec_cbk_data_t *cbk, int32_t which, char *key)</div><div class='add'>+{</div><div class='add'>+    ec_cbk_data_t *ans, *min;</div><div class='add'>+    dict_t *src, *dst;</div><div class='add'>+    data_t *data;</div><div class='add'>+</div><div class='add'>+    min = cbk;</div><div class='add'>+    for (ans = cbk-&gt;next; ans != NULL; ans = ans-&gt;next) {</div><div class='add'>+        if (ans-&gt;idx &lt; min-&gt;idx) {</div><div class='add'>+            min = ans;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (min != cbk) {</div><div class='add'>+        src = (which == EC_COMBINE_XDATA) ? min-&gt;xdata : min-&gt;dict;</div><div class='add'>+        dst = (which == EC_COMBINE_XDATA) ? cbk-&gt;xdata : cbk-&gt;dict;</div><div class='add'>+</div><div class='add'>+        data = dict_get(src, key);</div><div class='add'>+        if (data == NULL) {</div><div class='add'>+            return -ENOENT;</div><div class='add'>+        }</div><div class='add'>+        if (dict_set(dst, key, data) != 0) {</div><div class='add'>+            return -ENOMEM;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_dict_data_iatt(ec_cbk_data_t *cbk, int32_t which, char *key)</div><div class='add'>+{</div><div class='add'>+    ec_t *ec = cbk-&gt;fop-&gt;xl-&gt;private;</div><div class='add'>+    data_t *data[ec-&gt;nodes];</div><div class='add'>+    dict_t *dict;</div><div class='add'>+    struct iatt *stbuf, *tmp;</div><div class='add'>+    int32_t i, ret;</div><div class='add'>+</div><div class='add'>+    ec_dict_list(data, cbk, which, key, _gf_false);</div><div class='add'>+</div><div class='add'>+    stbuf = NULL;</div><div class='add'>+    for (i = 0; i &lt; ec-&gt;nodes; i++) {</div><div class='add'>+        if ((data[i] == NULL) || (data[i] == EC_MISSING_DATA)) {</div><div class='add'>+            continue;</div><div class='add'>+        }</div><div class='add'>+        tmp = data_to_iatt(data[i], key);</div><div class='add'>+        if (tmp == NULL) {</div><div class='add'>+            ret = -EINVAL;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+        if (stbuf == NULL) {</div><div class='add'>+            stbuf = GF_MALLOC(sizeof(struct iatt), gf_common_mt_char);</div><div class='add'>+            if (stbuf == NULL) {</div><div class='add'>+                ret = -ENOMEM;</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+            *stbuf = *tmp;</div><div class='add'>+        } else {</div><div class='add'>+            if (!ec_iatt_combine(cbk-&gt;fop, stbuf, tmp, 1)) {</div><div class='add'>+                ret = -EINVAL;</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if ((stbuf != NULL) &amp;&amp; (stbuf-&gt;ia_type == IA_IFREG)) {</div><div class='add'>+        ec_iatt_rebuild(ec, stbuf, 1, cbk-&gt;count);</div><div class='add'>+        /* TODO: not sure if an iatt could come in xdata from a fop that takes</div><div class='add'>+         *       no locks. */</div><div class='add'>+        if (!ec_get_inode_size(cbk-&gt;fop, cbk-&gt;fop-&gt;locks[0].lock-&gt;loc.inode,</div><div class='add'>+                               &amp;stbuf-&gt;ia_size)) {</div><div class='add'>+            ret = -EINVAL;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    dict = (which == EC_COMBINE_XDATA) ? cbk-&gt;xdata : cbk-&gt;dict;</div><div class='add'>+    ret = dict_set_iatt(dict, key, stbuf, false);</div><div class='add'>+    if (ret &gt;= 0) {</div><div class='add'>+        stbuf = NULL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    GF_FREE(stbuf);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_dict_data_max32(ec_cbk_data_t *cbk, int32_t which, char *key)</div><div class='add'>+{</div><div class='add'>+    ec_t *ec = cbk-&gt;fop-&gt;xl-&gt;private;</div><div class='add'>+    data_t *data[ec-&gt;nodes];</div><div class='add'>+    dict_t *dict;</div><div class='add'>+    int32_t i;</div><div class='add'>+    uint32_t max, tmp;</div><div class='add'>+</div><div class='add'>+    ec_dict_list(data, cbk, which, key, _gf_false);</div><div class='add'>+</div><div class='add'>+    max = 0;</div><div class='add'>+    for (i = 0; i &lt; ec-&gt;nodes; i++) {</div><div class='add'>+        if ((data[i] == NULL) || (data[i] == EC_MISSING_DATA)) {</div><div class='add'>+            continue;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        tmp = data_to_uint32(data[i]);</div><div class='add'>+        if (max &lt; tmp) {</div><div class='add'>+            max = tmp;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    dict = (which == EC_COMBINE_XDATA) ? cbk-&gt;xdata : cbk-&gt;dict;</div><div class='add'>+    return dict_set_uint32(dict, key, max);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_dict_data_max64(ec_cbk_data_t *cbk, int32_t which, char *key)</div><div class='add'>+{</div><div class='add'>+    ec_t *ec = cbk-&gt;fop-&gt;xl-&gt;private;</div><div class='add'>+    data_t *data[ec-&gt;nodes];</div><div class='add'>+    dict_t *dict;</div><div class='add'>+    int32_t i;</div><div class='add'>+    uint64_t max, tmp;</div><div class='add'>+</div><div class='add'>+    ec_dict_list(data, cbk, which, key, _gf_false);</div><div class='add'>+</div><div class='add'>+    max = 0;</div><div class='add'>+    for (i = 0; i &lt; ec-&gt;nodes; i++) {</div><div class='add'>+        if ((data[i] == NULL) || (data[i] == EC_MISSING_DATA)) {</div><div class='add'>+            continue;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        tmp = data_to_uint64(data[i]);</div><div class='add'>+        if (max &lt; tmp) {</div><div class='add'>+            max = tmp;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    dict = (which == EC_COMBINE_XDATA) ? cbk-&gt;xdata : cbk-&gt;dict;</div><div class='add'>+    return dict_set_uint64(dict, key, max);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_dict_data_quota(ec_cbk_data_t *cbk, int32_t which, char *key)</div><div class='add'>+{</div><div class='add'>+    ec_t *ec = cbk-&gt;fop-&gt;xl-&gt;private;</div><div class='add'>+    data_t *data[ec-&gt;nodes];</div><div class='add'>+    dict_t *dict = NULL;</div><div class='add'>+    int32_t i = 0;</div><div class='add'>+    quota_meta_t size = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    quota_meta_t max_size = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    if (ec_dict_list(data, cbk, which, key, _gf_false) == 0) {</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Quota size xattr is managed outside of the control of the ec xlator.</div><div class='add'>+     * This means that it might not be updated at the same time on all</div><div class='add'>+     * bricks and we can receive slightly different values. If that's the</div><div class='add'>+     * case, we take the maximum of all received values.</div><div class='add'>+     */</div><div class='add'>+    for (i = 0; i &lt; ec-&gt;nodes; i++) {</div><div class='add'>+        if ((data[i] == NULL) || (data[i] == EC_MISSING_DATA) ||</div><div class='add'>+            (quota_data_to_meta(data[i], &amp;size) &lt; 0)) {</div><div class='add'>+            continue;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        if (size.size &gt; max_size.size)</div><div class='add'>+            max_size.size = size.size;</div><div class='add'>+        if (size.file_count &gt; max_size.file_count)</div><div class='add'>+            max_size.file_count = size.file_count;</div><div class='add'>+        if (size.dir_count &gt; max_size.dir_count)</div><div class='add'>+            max_size.dir_count = size.dir_count;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    max_size.size *= ec-&gt;fragments;</div><div class='add'>+</div><div class='add'>+    dict = (which == EC_COMBINE_XDATA) ? cbk-&gt;xdata : cbk-&gt;dict;</div><div class='add'>+    return quota_dict_set_meta(dict, key, &amp;max_size, IA_IFDIR);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_dict_data_stime(ec_cbk_data_t *cbk, int32_t which, char *key)</div><div class='add'>+{</div><div class='add'>+    ec_t *ec = cbk-&gt;fop-&gt;xl-&gt;private;</div><div class='add'>+    data_t *data[ec-&gt;nodes];</div><div class='add'>+    dict_t *dict;</div><div class='add'>+    int32_t i, err;</div><div class='add'>+</div><div class='add'>+    ec_dict_list(data, cbk, which, key, _gf_false);</div><div class='add'>+</div><div class='add'>+    dict = (which == EC_COMBINE_XDATA) ? cbk-&gt;xdata : cbk-&gt;dict;</div><div class='add'>+    for (i = 0; i &lt; ec-&gt;nodes; i++) {</div><div class='add'>+        if ((data[i] == NULL) || (data[i] == EC_MISSING_DATA)) {</div><div class='add'>+            continue;</div><div class='add'>+        }</div><div class='add'>+        err = gf_get_max_stime(cbk-&gt;fop-&gt;xl, dict, key, data[i]);</div><div class='add'>+        if (err != 0) {</div><div class='add'>+            gf_msg(cbk-&gt;fop-&gt;xl-&gt;name, GF_LOG_ERROR, -err,</div><div class='add'>+                   EC_MSG_STIME_COMBINE_FAIL, "STIME combination failed");</div><div class='add'>+</div><div class='add'>+            return err;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_dict_data_combine(dict_t *dict, char *key, data_t *value, void *arg)</div><div class='add'>+{</div><div class='add'>+    ec_dict_combine_t *data = arg;</div><div class='add'>+</div><div class='add'>+    if ((strcmp(key, GF_XATTR_PATHINFO_KEY) == 0) ||</div><div class='add'>+        (strcmp(key, GF_XATTR_USER_PATHINFO_KEY) == 0)) {</div><div class='add'>+        return ec_dict_data_concat(data-&gt;cbk, data-&gt;which, key, NULL, NULL,</div><div class='add'>+                                   _gf_false, _gf_false, "(&lt;EC:%s&gt; { })",</div><div class='add'>+                                   data-&gt;cbk-&gt;fop-&gt;xl-&gt;name);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (strncmp(key, GF_XATTR_CLRLK_CMD, SLEN(GF_XATTR_CLRLK_CMD)) == 0) {</div><div class='add'>+        return ec_dict_data_concat(data-&gt;cbk, data-&gt;which, key, NULL, NULL,</div><div class='add'>+                                   _gf_false, "{\n}");</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (strncmp(key, GF_XATTR_LOCKINFO_KEY, SLEN(GF_XATTR_LOCKINFO_KEY)) == 0) {</div><div class='add'>+        return ec_dict_data_merge(data-&gt;cbk, data-&gt;which, key);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (strcmp(key, GET_LINK_COUNT) == 0) {</div><div class='add'>+        return ec_dict_data_max32(data-&gt;cbk, data-&gt;which, key);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (strcmp(key, GLUSTERFS_OPEN_FD_COUNT) == 0) {</div><div class='add'>+        return ec_dict_data_max32(data-&gt;cbk, data-&gt;which, key);</div><div class='add'>+    }</div><div class='add'>+    if ((strcmp(key, GLUSTERFS_INODELK_COUNT) == 0) ||</div><div class='add'>+        (strcmp(key, GLUSTERFS_ENTRYLK_COUNT) == 0)) {</div><div class='add'>+        return ec_dict_data_max32(data-&gt;cbk, data-&gt;which, key);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (strcmp(key, QUOTA_SIZE_KEY) == 0) {</div><div class='add'>+        return ec_dict_data_quota(data-&gt;cbk, data-&gt;which, key);</div><div class='add'>+    }</div><div class='add'>+    /* Ignore all other quota attributes */</div><div class='add'>+    if (strncmp(key, EC_QUOTA_PREFIX, SLEN(EC_QUOTA_PREFIX)) == 0) {</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (XATTR_IS_NODE_UUID(key)) {</div><div class='add'>+        if (data-&gt;cbk-&gt;fop-&gt;int32) {</div><div class='add'>+            /* List of node uuid is requested */</div><div class='add'>+            return ec_dict_data_concat(data-&gt;cbk, data-&gt;which, key,</div><div class='add'>+                                       GF_XATTR_LIST_NODE_UUIDS_KEY, UUID0_STR,</div><div class='add'>+                                       _gf_true, "{ }");</div><div class='add'>+        } else {</div><div class='add'>+            return ec_dict_data_uuid(data-&gt;cbk, data-&gt;which, key);</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (fnmatch(GF_XATTR_STIME_PATTERN, key, FNM_NOESCAPE) == 0) {</div><div class='add'>+        return ec_dict_data_stime(data-&gt;cbk, data-&gt;which, key);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (fnmatch(MARKER_XATTR_PREFIX ".*." XTIME, key, FNM_NOESCAPE) == 0) {</div><div class='add'>+        return ec_dict_data_max64(data-&gt;cbk, data-&gt;which, key);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (strcmp(key, GF_PRESTAT) == 0 || strcmp(key, GF_POSTSTAT) == 0) {</div><div class='add'>+        return ec_dict_data_iatt(data-&gt;cbk, data-&gt;which, key);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_dict_combine(ec_cbk_data_t *cbk, int32_t which)</div><div class='add'>+{</div><div class='add'>+    dict_t *dict = NULL;</div><div class='add'>+    ec_dict_combine_t data;</div><div class='add'>+    int32_t err = 0;</div><div class='add'>+</div><div class='add'>+    data.cbk = cbk;</div><div class='add'>+    data.which = which;</div><div class='add'>+</div><div class='add'>+    dict = (which == EC_COMBINE_XDATA) ? cbk-&gt;xdata : cbk-&gt;dict;</div><div class='add'>+    if (dict != NULL) {</div><div class='add'>+        err = dict_foreach(dict, ec_dict_data_combine, &amp;data);</div><div class='add'>+        if (err != 0) {</div><div class='add'>+            gf_msg(cbk-&gt;fop-&gt;xl-&gt;name, GF_LOG_ERROR, -err,</div><div class='add'>+                   EC_MSG_DICT_COMBINE_FAIL, "Dictionary combination failed");</div><div class='add'>+</div><div class='add'>+            return err;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_vector_compare(struct iovec *dst_vector, int32_t dst_count,</div><div class='add'>+                  struct iovec *src_vector, int32_t src_count)</div><div class='add'>+{</div><div class='add'>+    int32_t dst_size = 0, src_size = 0;</div><div class='add'>+</div><div class='add'>+    if (dst_count &gt; 0) {</div><div class='add'>+        dst_size = iov_length(dst_vector, dst_count);</div><div class='add'>+    }</div><div class='add'>+    if (src_count &gt; 0) {</div><div class='add'>+        src_size = iov_length(src_vector, src_count);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return (dst_size == src_size);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_flock_compare(struct gf_flock *dst, struct gf_flock *src)</div><div class='add'>+{</div><div class='add'>+    if ((dst-&gt;l_type != src-&gt;l_type) || (dst-&gt;l_whence != src-&gt;l_whence) ||</div><div class='add'>+        (dst-&gt;l_start != src-&gt;l_start) || (dst-&gt;l_len != src-&gt;l_len) ||</div><div class='add'>+        (dst-&gt;l_pid != src-&gt;l_pid) ||</div><div class='add'>+        !is_same_lkowner(&amp;dst-&gt;l_owner, &amp;src-&gt;l_owner)) {</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_statvfs_combine(struct statvfs *dst, struct statvfs *src)</div><div class='add'>+{</div><div class='add'>+    if (dst-&gt;f_bsize &lt; src-&gt;f_bsize) {</div><div class='add'>+        dst-&gt;f_bsize = src-&gt;f_bsize;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (dst-&gt;f_frsize &lt; src-&gt;f_frsize) {</div><div class='add'>+        dst-&gt;f_blocks *= dst-&gt;f_frsize;</div><div class='add'>+        dst-&gt;f_blocks /= src-&gt;f_frsize;</div><div class='add'>+</div><div class='add'>+        dst-&gt;f_bfree *= dst-&gt;f_frsize;</div><div class='add'>+        dst-&gt;f_bfree /= src-&gt;f_frsize;</div><div class='add'>+</div><div class='add'>+        dst-&gt;f_bavail *= dst-&gt;f_frsize;</div><div class='add'>+        dst-&gt;f_bavail /= src-&gt;f_frsize;</div><div class='add'>+</div><div class='add'>+        dst-&gt;f_frsize = src-&gt;f_frsize;</div><div class='add'>+    } else if (dst-&gt;f_frsize &gt; src-&gt;f_frsize) {</div><div class='add'>+        src-&gt;f_blocks *= src-&gt;f_frsize;</div><div class='add'>+        src-&gt;f_blocks /= dst-&gt;f_frsize;</div><div class='add'>+</div><div class='add'>+        src-&gt;f_bfree *= src-&gt;f_frsize;</div><div class='add'>+        src-&gt;f_bfree /= dst-&gt;f_frsize;</div><div class='add'>+</div><div class='add'>+        src-&gt;f_bavail *= src-&gt;f_frsize;</div><div class='add'>+        src-&gt;f_bavail /= dst-&gt;f_frsize;</div><div class='add'>+    }</div><div class='add'>+    if (dst-&gt;f_blocks &gt; src-&gt;f_blocks) {</div><div class='add'>+        dst-&gt;f_blocks = src-&gt;f_blocks;</div><div class='add'>+    }</div><div class='add'>+    if (dst-&gt;f_bfree &gt; src-&gt;f_bfree) {</div><div class='add'>+        dst-&gt;f_bfree = src-&gt;f_bfree;</div><div class='add'>+    }</div><div class='add'>+    if (dst-&gt;f_bavail &gt; src-&gt;f_bavail) {</div><div class='add'>+        dst-&gt;f_bavail = src-&gt;f_bavail;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (dst-&gt;f_files &lt; src-&gt;f_files) {</div><div class='add'>+        dst-&gt;f_files = src-&gt;f_files;</div><div class='add'>+    }</div><div class='add'>+    if (dst-&gt;f_ffree &gt; src-&gt;f_ffree) {</div><div class='add'>+        dst-&gt;f_ffree = src-&gt;f_ffree;</div><div class='add'>+    }</div><div class='add'>+    if (dst-&gt;f_favail &gt; src-&gt;f_favail) {</div><div class='add'>+        dst-&gt;f_favail = src-&gt;f_favail;</div><div class='add'>+    }</div><div class='add'>+    if (dst-&gt;f_namemax &gt; src-&gt;f_namemax) {</div><div class='add'>+        dst-&gt;f_namemax = src-&gt;f_namemax;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (dst-&gt;f_flag != src-&gt;f_flag) {</div><div class='add'>+        gf_msg_debug(THIS-&gt;name, 0,</div><div class='add'>+                     "Mismatching file system flags "</div><div class='add'>+                     "(%lX, %lX)",</div><div class='add'>+                     dst-&gt;f_flag, src-&gt;f_flag);</div><div class='add'>+    }</div><div class='add'>+    dst-&gt;f_flag &amp;= src-&gt;f_flag;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_combine_check(ec_cbk_data_t *dst, ec_cbk_data_t *src, ec_combine_f combine)</div><div class='add'>+{</div><div class='add'>+    ec_fop_data_t *fop = dst-&gt;fop;</div><div class='add'>+</div><div class='add'>+    if (dst-&gt;op_ret != src-&gt;op_ret) {</div><div class='add'>+        gf_msg_debug(fop-&gt;xl-&gt;name, 0,</div><div class='add'>+                     "Mismatching return code in "</div><div class='add'>+                     "answers of '%s': %d &lt;-&gt; %d",</div><div class='add'>+                     ec_fop_name(fop-&gt;id), dst-&gt;op_ret, src-&gt;op_ret);</div><div class='add'>+</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='add'>+    if (dst-&gt;op_ret &lt; 0) {</div><div class='add'>+        if (dst-&gt;op_errno != src-&gt;op_errno) {</div><div class='add'>+            gf_msg_debug(fop-&gt;xl-&gt;name, 0,</div><div class='add'>+                         "Mismatching errno code in "</div><div class='add'>+                         "answers of '%s': %d &lt;-&gt; %d",</div><div class='add'>+                         ec_fop_name(fop-&gt;id), dst-&gt;op_errno, src-&gt;op_errno);</div><div class='add'>+</div><div class='add'>+            return 0;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (!ec_dict_compare(dst-&gt;xdata, src-&gt;xdata)) {</div><div class='add'>+        gf_msg(fop-&gt;xl-&gt;name, GF_LOG_DEBUG, 0, EC_MSG_XDATA_MISMATCH,</div><div class='add'>+               "Mismatching xdata in answers "</div><div class='add'>+               "of '%s'",</div><div class='add'>+               ec_fop_name(fop-&gt;id));</div><div class='add'>+</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if ((dst-&gt;op_ret &gt;= 0) &amp;&amp; (combine != NULL)) {</div><div class='add'>+        return combine(fop, dst, src);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_combine(ec_cbk_data_t *newcbk, ec_combine_f combine)</div><div class='add'>+{</div><div class='add'>+    ec_fop_data_t *fop = newcbk-&gt;fop;</div><div class='add'>+    ec_cbk_data_t *cbk = NULL, *tmp = NULL;</div><div class='add'>+    struct list_head *item = NULL;</div><div class='add'>+    int32_t needed = 0;</div><div class='add'>+    char str[32];</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;fop-&gt;lock);</div><div class='add'>+</div><div class='add'>+    fop-&gt;received |= newcbk-&gt;mask;</div><div class='add'>+</div><div class='add'>+    item = fop-&gt;cbk_list.prev;</div><div class='add'>+    list_for_each_entry(cbk, &amp;fop-&gt;cbk_list, list)</div><div class='add'>+    {</div><div class='add'>+        if (ec_combine_check(newcbk, cbk, combine)) {</div><div class='add'>+            newcbk-&gt;count += cbk-&gt;count;</div><div class='add'>+            newcbk-&gt;mask |= cbk-&gt;mask;</div><div class='add'>+</div><div class='add'>+            item = cbk-&gt;list.prev;</div><div class='add'>+            while (item != &amp;fop-&gt;cbk_list) {</div><div class='add'>+                tmp = list_entry(item, ec_cbk_data_t, list);</div><div class='add'>+                if (tmp-&gt;count &gt;= newcbk-&gt;count) {</div><div class='add'>+                    break;</div><div class='add'>+                }</div><div class='add'>+                item = item-&gt;prev;</div><div class='add'>+            }</div><div class='add'>+            list_del(&amp;cbk-&gt;list);</div><div class='add'>+</div><div class='add'>+            newcbk-&gt;next = cbk;</div><div class='add'>+</div><div class='add'>+            break;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    list_add(&amp;newcbk-&gt;list, item);</div><div class='add'>+</div><div class='add'>+    ec_trace("ANSWER", fop, "combine=%s[%d]",</div><div class='add'>+             ec_bin(str, sizeof(str), newcbk-&gt;mask, 0), newcbk-&gt;count);</div><div class='add'>+</div><div class='add'>+    cbk = list_entry(fop-&gt;cbk_list.next, ec_cbk_data_t, list);</div><div class='add'>+    if ((fop-&gt;mask ^ fop-&gt;remaining) == fop-&gt;received) {</div><div class='add'>+        needed = fop-&gt;minimum - cbk-&gt;count;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    UNLOCK(&amp;fop-&gt;lock);</div><div class='add'>+</div><div class='add'>+    if (needed &gt; 0) {</div><div class='add'>+        ec_dispatch_next(fop, newcbk-&gt;idx);</div><div class='add'>+    }</div><div class='add'>+}</div><div class='head'>diff --git a/xlators/cluster/ec/src/ec-combine.h b/xlators/cluster/ec/src/ec-combine.h<br/>new file mode 100644<br/>index 00000000000..1010cc3be26<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/xlators/cluster/ec/src/ec-combine.h?id=d1d7a6f35c816822fab51c820e25023863c239c1'>xlators/cluster/ec/src/ec-combine.h</a></div><div class='hunk'>@@ -0,0 +1,44 @@</div><div class='add'>+/*</div><div class='add'>+  Copyright (c) 2012-2014 DataLab, s.l. &lt;http://www.datalab.es&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#ifndef __EC_COMBINE_H__</div><div class='add'>+#define __EC_COMBINE_H__</div><div class='add'>+</div><div class='add'>+#define EC_COMBINE_DICT 0</div><div class='add'>+#define EC_COMBINE_XDATA 1</div><div class='add'>+</div><div class='add'>+typedef int32_t (*ec_combine_f)(ec_fop_data_t *fop, ec_cbk_data_t *dst,</div><div class='add'>+                                ec_cbk_data_t *src);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_iatt_rebuild(ec_t *ec, struct iatt *iatt, int32_t count, int32_t answers);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_iatt_combine(ec_fop_data_t *fop, struct iatt *dst, struct iatt *src,</div><div class='add'>+                int32_t count);</div><div class='add'>+int32_t</div><div class='add'>+ec_dict_compare(dict_t *dict1, dict_t *dict2);</div><div class='add'>+int32_t</div><div class='add'>+ec_vector_compare(struct iovec *dst_vector, int32_t dst_count,</div><div class='add'>+                  struct iovec *src_vector, int32_t src_count);</div><div class='add'>+int32_t</div><div class='add'>+ec_flock_compare(struct gf_flock *dst, struct gf_flock *src);</div><div class='add'>+void</div><div class='add'>+ec_statvfs_combine(struct statvfs *dst, struct statvfs *src);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_dict_combine(ec_cbk_data_t *cbk, int32_t which);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_combine(ec_cbk_data_t *cbk, ec_combine_f combine);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_combine_write(ec_fop_data_t *fop, ec_cbk_data_t *dst, ec_cbk_data_t *src);</div><div class='add'>+#endif /* __EC_COMBINE_H__ */</div><div class='head'>diff --git a/xlators/cluster/ec/src/ec-common.c b/xlators/cluster/ec/src/ec-common.c<br/>new file mode 100644<br/>index 00000000000..b955efd8c2d<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/xlators/cluster/ec/src/ec-common.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>xlators/cluster/ec/src/ec-common.c</a></div><div class='hunk'>@@ -0,0 +1,3042 @@</div><div class='add'>+/*</div><div class='add'>+  Copyright (c) 2012-2014 DataLab, s.l. &lt;http://www.datalab.es&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#include &lt;glusterfs/byte-order.h&gt;</div><div class='add'>+#include &lt;glusterfs/hashfn.h&gt;</div><div class='add'>+</div><div class='add'>+#include "ec-mem-types.h"</div><div class='add'>+#include "ec-types.h"</div><div class='add'>+#include "ec-helpers.h"</div><div class='add'>+#include "ec-combine.h"</div><div class='add'>+#include "ec-common.h"</div><div class='add'>+#include "ec-fops.h"</div><div class='add'>+#include "ec-method.h"</div><div class='add'>+#include "ec.h"</div><div class='add'>+#include "ec-messages.h"</div><div class='add'>+</div><div class='add'>+#define EC_INVALID_INDEX UINT32_MAX</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_update_fd_status(fd_t *fd, xlator_t *xl, int idx, int32_t ret_status)</div><div class='add'>+{</div><div class='add'>+    ec_fd_t *fd_ctx;</div><div class='add'>+</div><div class='add'>+    if (fd == NULL)</div><div class='add'>+        return;</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;fd-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        fd_ctx = __ec_fd_get(fd, xl);</div><div class='add'>+        if (fd_ctx) {</div><div class='add'>+            if (ret_status &gt;= 0)</div><div class='add'>+                fd_ctx-&gt;fd_status[idx] = EC_FD_OPENED;</div><div class='add'>+            else</div><div class='add'>+                fd_ctx-&gt;fd_status[idx] = EC_FD_NOT_OPENED;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    UNLOCK(&amp;fd-&gt;lock);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static uintptr_t</div><div class='add'>+ec_fd_ctx_need_open(fd_t *fd, xlator_t *this, uintptr_t mask)</div><div class='add'>+{</div><div class='add'>+    int i = 0;</div><div class='add'>+    int count = 0;</div><div class='add'>+    ec_t *ec = NULL;</div><div class='add'>+    ec_fd_t *fd_ctx = NULL;</div><div class='add'>+    uintptr_t need_open = 0;</div><div class='add'>+</div><div class='add'>+    ec = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    fd_ctx = ec_fd_get(fd, this);</div><div class='add'>+    if (!fd_ctx)</div><div class='add'>+        return count;</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;fd-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        for (i = 0; i &lt; ec-&gt;nodes; i++) {</div><div class='add'>+            if ((fd_ctx-&gt;fd_status[i] == EC_FD_NOT_OPENED) &amp;&amp;</div><div class='add'>+                ((ec-&gt;xl_up &amp; (1 &lt;&lt; i)) != 0) &amp;&amp; ((mask &amp; (1 &lt;&lt; i)) != 0)) {</div><div class='add'>+                fd_ctx-&gt;fd_status[i] = EC_FD_OPENING;</div><div class='add'>+                need_open |= (1 &lt;&lt; i);</div><div class='add'>+                count++;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    UNLOCK(&amp;fd-&gt;lock);</div><div class='add'>+</div><div class='add'>+    /* If fd needs to open on minimum number of nodes</div><div class='add'>+     * then ignore fixing the fd as it has been</div><div class='add'>+     * requested from heal operation.</div><div class='add'>+     */</div><div class='add'>+    if (count &gt;= ec-&gt;fragments) {</div><div class='add'>+        need_open = 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return need_open;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static gf_boolean_t</div><div class='add'>+ec_is_fd_fixable(fd_t *fd)</div><div class='add'>+{</div><div class='add'>+    if (!fd || !fd-&gt;inode)</div><div class='add'>+        return _gf_false;</div><div class='add'>+    else if (fd_is_anonymous(fd))</div><div class='add'>+        return _gf_false;</div><div class='add'>+    else if (gf_uuid_is_null(fd-&gt;inode-&gt;gfid))</div><div class='add'>+        return _gf_false;</div><div class='add'>+</div><div class='add'>+    return _gf_true;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+ec_fix_open(ec_fop_data_t *fop, uintptr_t mask)</div><div class='add'>+{</div><div class='add'>+    uintptr_t need_open = 0;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    int32_t flags = 0;</div><div class='add'>+    loc_t loc = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    if (!ec_is_fd_fixable(fop-&gt;fd))</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    /* Evaluate how many remote fd's to be opened */</div><div class='add'>+    need_open = ec_fd_ctx_need_open(fop-&gt;fd, fop-&gt;xl, mask);</div><div class='add'>+    if (need_open == 0) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    loc.inode = inode_ref(fop-&gt;fd-&gt;inode);</div><div class='add'>+    gf_uuid_copy(loc.gfid, fop-&gt;fd-&gt;inode-&gt;gfid);</div><div class='add'>+    ret = loc_path(&amp;loc, NULL);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    flags = fop-&gt;fd-&gt;flags &amp; (~(O_TRUNC | O_APPEND | O_CREAT | O_EXCL));</div><div class='add'>+    if (IA_IFDIR == fop-&gt;fd-&gt;inode-&gt;ia_type) {</div><div class='add'>+        ec_opendir(fop-&gt;frame, fop-&gt;xl, need_open,</div><div class='add'>+                   EC_MINIMUM_ONE | EC_FOP_NO_PROPAGATE_ERROR, NULL, NULL,</div><div class='add'>+                   &amp;fop-&gt;loc[0], fop-&gt;fd, NULL);</div><div class='add'>+    } else {</div><div class='add'>+        ec_open(fop-&gt;frame, fop-&gt;xl, need_open,</div><div class='add'>+                EC_MINIMUM_ONE | EC_FOP_NO_PROPAGATE_ERROR, NULL, NULL, &amp;loc,</div><div class='add'>+                flags, fop-&gt;fd, NULL);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    loc_wipe(&amp;loc);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static off_t</div><div class='add'>+ec_range_end_get(off_t fl_start, uint64_t fl_size)</div><div class='add'>+{</div><div class='add'>+    if (fl_size &gt; 0) {</div><div class='add'>+        if (fl_size &gt;= EC_RANGE_FULL) {</div><div class='add'>+            /* Infinity */</div><div class='add'>+            fl_start = LLONG_MAX;</div><div class='add'>+        } else {</div><div class='add'>+            fl_start += fl_size - 1;</div><div class='add'>+            if (fl_start &lt; 0) {</div><div class='add'>+                /* Overflow */</div><div class='add'>+                fl_start = LLONG_MAX;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return fl_start;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static gf_boolean_t</div><div class='add'>+ec_is_range_conflict(ec_lock_link_t *l1, ec_lock_link_t *l2)</div><div class='add'>+{</div><div class='add'>+    return ((l1-&gt;fl_end &gt;= l2-&gt;fl_start) &amp;&amp; (l2-&gt;fl_end &gt;= l1-&gt;fl_start));</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static gf_boolean_t</div><div class='add'>+ec_lock_conflict(ec_lock_link_t *l1, ec_lock_link_t *l2)</div><div class='add'>+{</div><div class='add'>+    ec_t *ec = l1-&gt;fop-&gt;xl-&gt;private;</div><div class='add'>+</div><div class='add'>+    /* Fops like access/stat won't have to worry what the other fops are</div><div class='add'>+     * modifying as the fop is wound only to one brick. So it can be</div><div class='add'>+     * executed in parallel*/</div><div class='add'>+    if (l1-&gt;fop-&gt;minimum == EC_MINIMUM_ONE ||</div><div class='add'>+        l2-&gt;fop-&gt;minimum == EC_MINIMUM_ONE)</div><div class='add'>+        return _gf_false;</div><div class='add'>+</div><div class='add'>+    if ((l1-&gt;fop-&gt;flags &amp; EC_FLAG_LOCK_SHARED) &amp;&amp;</div><div class='add'>+        (l2-&gt;fop-&gt;flags &amp; EC_FLAG_LOCK_SHARED))</div><div class='add'>+        return _gf_false;</div><div class='add'>+</div><div class='add'>+    if (!ec-&gt;parallel_writes) {</div><div class='add'>+        return _gf_true;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return ec_is_range_conflict(l1, l2);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+uint32_t</div><div class='add'>+ec_select_first_by_read_policy(ec_t *ec, ec_fop_data_t *fop)</div><div class='add'>+{</div><div class='add'>+    if (ec-&gt;read_policy == EC_ROUND_ROBIN) {</div><div class='add'>+        return ec-&gt;idx;</div><div class='add'>+    } else if (ec-&gt;read_policy == EC_GFID_HASH) {</div><div class='add'>+        if (fop-&gt;use_fd) {</div><div class='add'>+            return SuperFastHash((char *)fop-&gt;fd-&gt;inode-&gt;gfid,</div><div class='add'>+                                 sizeof(fop-&gt;fd-&gt;inode-&gt;gfid)) %</div><div class='add'>+                   ec-&gt;nodes;</div><div class='add'>+        } else {</div><div class='add'>+            if (gf_uuid_is_null(fop-&gt;loc[0].gfid))</div><div class='add'>+                loc_gfid(&amp;fop-&gt;loc[0], fop-&gt;loc[0].gfid);</div><div class='add'>+            return SuperFastHash((char *)fop-&gt;loc[0].gfid,</div><div class='add'>+                                 sizeof(fop-&gt;loc[0].gfid)) %</div><div class='add'>+                   ec-&gt;nodes;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static gf_boolean_t</div><div class='add'>+ec_child_valid(ec_t *ec, ec_fop_data_t *fop, uint32_t idx)</div><div class='add'>+{</div><div class='add'>+    return (idx &lt; ec-&gt;nodes) &amp;&amp; (((fop-&gt;remaining &gt;&gt; idx) &amp; 1) == 1);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static uint32_t</div><div class='add'>+ec_child_next(ec_t *ec, ec_fop_data_t *fop, uint32_t idx)</div><div class='add'>+{</div><div class='add'>+    while (!ec_child_valid(ec, fop, idx)) {</div><div class='add'>+        if (++idx &gt;= ec-&gt;nodes) {</div><div class='add'>+            idx = 0;</div><div class='add'>+        }</div><div class='add'>+        if (idx == fop-&gt;first) {</div><div class='add'>+            return EC_INVALID_INDEX;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return idx;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_heal_report(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+               int32_t op_ret, int32_t op_errno, uintptr_t mask, uintptr_t good,</div><div class='add'>+               uintptr_t bad, uint32_t pending, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    if (op_ret &lt; 0) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_DEBUG, op_errno, EC_MSG_HEAL_FAIL,</div><div class='add'>+               "Heal failed");</div><div class='add'>+    } else {</div><div class='add'>+        if ((mask &amp; ~good) != 0) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_DEBUG, 0, EC_MSG_HEAL_SUCCESS,</div><div class='add'>+                   "Heal succeeded on %d/%d "</div><div class='add'>+                   "subvolumes",</div><div class='add'>+                   gf_bits_count(mask &amp; ~(good | bad)),</div><div class='add'>+                   gf_bits_count(mask &amp; ~good));</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static uintptr_t</div><div class='add'>+ec_fop_needs_name_heal(ec_fop_data_t *fop)</div><div class='add'>+{</div><div class='add'>+    ec_t *ec = NULL;</div><div class='add'>+    ec_cbk_data_t *cbk = NULL;</div><div class='add'>+    ec_cbk_data_t *enoent_cbk = NULL;</div><div class='add'>+</div><div class='add'>+    ec = fop-&gt;xl-&gt;private;</div><div class='add'>+    if (fop-&gt;id != GF_FOP_LOOKUP)</div><div class='add'>+        return 0;</div><div class='add'>+</div><div class='add'>+    if (!fop-&gt;loc[0].name || strlen(fop-&gt;loc[0].name) == 0)</div><div class='add'>+        return 0;</div><div class='add'>+</div><div class='add'>+    list_for_each_entry(cbk, &amp;fop-&gt;cbk_list, list)</div><div class='add'>+    {</div><div class='add'>+        if (cbk-&gt;op_ret &lt; 0 &amp;&amp; cbk-&gt;op_errno == ENOENT) {</div><div class='add'>+            enoent_cbk = cbk;</div><div class='add'>+            break;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (!enoent_cbk)</div><div class='add'>+        return 0;</div><div class='add'>+</div><div class='add'>+    return ec-&gt;xl_up &amp; ~enoent_cbk-&gt;mask;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_fop_needs_heal(ec_fop_data_t *fop)</div><div class='add'>+{</div><div class='add'>+    ec_t *ec = fop-&gt;xl-&gt;private;</div><div class='add'>+</div><div class='add'>+    if (fop-&gt;lock_count == 0) {</div><div class='add'>+        /*</div><div class='add'>+         * if fop-&gt;lock_count is zero that means it saw version mismatch</div><div class='add'>+         * without any locks so it can't be trusted. If we launch a heal</div><div class='add'>+         * based on this it will lead to INODELKs which will affect I/O</div><div class='add'>+         * performance. Considering self-heal-daemon and operations on</div><div class='add'>+         * the inode from client which take locks can still trigger the</div><div class='add'>+         * heal we can choose to not attempt a heal when fop-&gt;lock_count</div><div class='add'>+         * is zero.</div><div class='add'>+         */</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='add'>+    return (ec-&gt;xl_up &amp; ~(fop-&gt;remaining | fop-&gt;good)) != 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_check_status(ec_fop_data_t *fop)</div><div class='add'>+{</div><div class='add'>+    ec_t *ec = fop-&gt;xl-&gt;private;</div><div class='add'>+    int32_t partial = 0;</div><div class='add'>+    char str1[32], str2[32], str3[32], str4[32], str5[32];</div><div class='add'>+</div><div class='add'>+    if (!ec_fop_needs_name_heal(fop) &amp;&amp; !ec_fop_needs_heal(fop)) {</div><div class='add'>+        return;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (fop-&gt;answer &amp;&amp; fop-&gt;answer-&gt;op_ret &gt;= 0) {</div><div class='add'>+        if ((fop-&gt;id == GF_FOP_LOOKUP) || (fop-&gt;id == GF_FOP_STAT) ||</div><div class='add'>+            (fop-&gt;id == GF_FOP_FSTAT)) {</div><div class='add'>+            partial = fop-&gt;answer-&gt;iatt[0].ia_type == IA_IFDIR;</div><div class='add'>+        } else if (fop-&gt;id == GF_FOP_OPENDIR) {</div><div class='add'>+            partial = 1;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    gf_msg(</div><div class='add'>+        fop-&gt;xl-&gt;name, GF_LOG_WARNING, 0, EC_MSG_OP_FAIL_ON_SUBVOLS,</div><div class='add'>+        "Operation failed on %d of %d subvolumes.(up=%s, mask=%s, "</div><div class='add'>+        "remaining=%s, good=%s, bad=%s,"</div><div class='add'>+        "(Least significant bit represents first client/brick of subvol), %s)",</div><div class='add'>+        gf_bits_count(ec-&gt;xl_up &amp; ~(fop-&gt;remaining | fop-&gt;good)), ec-&gt;nodes,</div><div class='add'>+        ec_bin(str1, sizeof(str1), ec-&gt;xl_up, ec-&gt;nodes),</div><div class='add'>+        ec_bin(str2, sizeof(str2), fop-&gt;mask, ec-&gt;nodes),</div><div class='add'>+        ec_bin(str3, sizeof(str3), fop-&gt;remaining, ec-&gt;nodes),</div><div class='add'>+        ec_bin(str4, sizeof(str4), fop-&gt;good, ec-&gt;nodes),</div><div class='add'>+        ec_bin(str5, sizeof(str5), ec-&gt;xl_up &amp; ~(fop-&gt;remaining | fop-&gt;good),</div><div class='add'>+               ec-&gt;nodes),</div><div class='add'>+        ec_msg_str(fop));</div><div class='add'>+    if (fop-&gt;use_fd) {</div><div class='add'>+        if (fop-&gt;fd != NULL) {</div><div class='add'>+            ec_fheal(NULL, fop-&gt;xl, -1, EC_MINIMUM_ONE, ec_heal_report, NULL,</div><div class='add'>+                     fop-&gt;fd, partial, NULL);</div><div class='add'>+        }</div><div class='add'>+    } else {</div><div class='add'>+        ec_heal(NULL, fop-&gt;xl, -1, EC_MINIMUM_ONE, ec_heal_report, NULL,</div><div class='add'>+                &amp;fop-&gt;loc[0], partial, NULL);</div><div class='add'>+</div><div class='add'>+        if (fop-&gt;loc[1].inode != NULL) {</div><div class='add'>+            ec_heal(NULL, fop-&gt;xl, -1, EC_MINIMUM_ONE, ec_heal_report, NULL,</div><div class='add'>+                    &amp;fop-&gt;loc[1], partial, NULL);</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_update_good(ec_fop_data_t *fop, uintptr_t good)</div><div class='add'>+{</div><div class='add'>+    fop-&gt;good = good;</div><div class='add'>+</div><div class='add'>+    /* Fops that are executed only on one brick do not have enough information</div><div class='add'>+     * to decide if healing is needed or not. */</div><div class='add'>+    if ((fop-&gt;expected != 1) &amp;&amp; (fop-&gt;parent == NULL)) {</div><div class='add'>+        ec_check_status(fop);</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_lock_update_good(ec_lock_t *lock, ec_fop_data_t *fop)</div><div class='add'>+{</div><div class='add'>+    /* Fops that are executed only on one brick do not have enough information</div><div class='add'>+     * to update the global mask of good bricks. */</div><div class='add'>+    if (fop-&gt;expected == 1) {</div><div class='add'>+        return;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* When updating the good mask of the lock, we only take into consideration</div><div class='add'>+     * those bits corresponding to the bricks where the fop has been executed.</div><div class='add'>+     * Bad bricks are removed from good_mask, but once marked as bad it's never</div><div class='add'>+     * set to good until the lock is released and reacquired */</div><div class='add'>+</div><div class='add'>+    lock-&gt;good_mask &amp;= fop-&gt;good | fop-&gt;remaining;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+__ec_fop_set_error(ec_fop_data_t *fop, int32_t error)</div><div class='add'>+{</div><div class='add'>+    if ((error != 0) &amp;&amp; (fop-&gt;error == 0)) {</div><div class='add'>+        fop-&gt;error = error;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_fop_set_error(ec_fop_data_t *fop, int32_t error)</div><div class='add'>+{</div><div class='add'>+    LOCK(&amp;fop-&gt;lock);</div><div class='add'>+</div><div class='add'>+    __ec_fop_set_error(fop, error);</div><div class='add'>+</div><div class='add'>+    UNLOCK(&amp;fop-&gt;lock);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+gf_boolean_t</div><div class='add'>+ec_cbk_set_error(ec_cbk_data_t *cbk, int32_t error, gf_boolean_t ro)</div><div class='add'>+{</div><div class='add'>+    if ((error != 0) &amp;&amp; (cbk-&gt;op_ret &gt;= 0)) {</div><div class='add'>+        /* If cbk-&gt;op_errno was 0, it means that the fop succeeded and this</div><div class='add'>+         * error has happened while processing the answer. If the operation was</div><div class='add'>+         * read-only, there's no problem (i.e. we simply return the generated</div><div class='add'>+         * error code). However if it caused a modification, we must return EIO</div><div class='add'>+         * to indicate that the operation has been partially executed. */</div><div class='add'>+        cbk-&gt;op_errno = ro ? error : EIO;</div><div class='add'>+        cbk-&gt;op_ret = -1;</div><div class='add'>+</div><div class='add'>+        ec_fop_set_error(cbk-&gt;fop, cbk-&gt;op_errno);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return (cbk-&gt;op_ret &lt; 0);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+ec_cbk_data_t *</div><div class='add'>+ec_fop_prepare_answer(ec_fop_data_t *fop, gf_boolean_t ro)</div><div class='add'>+{</div><div class='add'>+    ec_cbk_data_t *cbk;</div><div class='add'>+    int32_t err;</div><div class='add'>+</div><div class='add'>+    cbk = fop-&gt;answer;</div><div class='add'>+    if (cbk == NULL) {</div><div class='add'>+        ec_fop_set_error(fop, EIO);</div><div class='add'>+</div><div class='add'>+        return NULL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (cbk-&gt;op_ret &lt; 0) {</div><div class='add'>+        ec_fop_set_error(fop, cbk-&gt;op_errno);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    err = ec_dict_combine(cbk, EC_COMBINE_XDATA);</div><div class='add'>+    if (ec_cbk_set_error(cbk, -err, ro)) {</div><div class='add'>+        return NULL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return cbk;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_sleep(ec_fop_data_t *fop)</div><div class='add'>+{</div><div class='add'>+    LOCK(&amp;fop-&gt;lock);</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(fop-&gt;refs &gt; 0);</div><div class='add'>+    fop-&gt;refs++;</div><div class='add'>+    fop-&gt;jobs++;</div><div class='add'>+</div><div class='add'>+    UNLOCK(&amp;fop-&gt;lock);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_check_complete(ec_fop_data_t *fop, ec_resume_f resume)</div><div class='add'>+{</div><div class='add'>+    int32_t error = -1;</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;fop-&gt;lock);</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(fop-&gt;resume == NULL);</div><div class='add'>+</div><div class='add'>+    if (--fop-&gt;jobs != 0) {</div><div class='add'>+        ec_trace("WAIT", fop, "resume=%p", resume);</div><div class='add'>+</div><div class='add'>+        fop-&gt;resume = resume;</div><div class='add'>+    } else {</div><div class='add'>+        error = fop-&gt;error;</div><div class='add'>+        fop-&gt;error = 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    UNLOCK(&amp;fop-&gt;lock);</div><div class='add'>+</div><div class='add'>+    return error;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_resume(ec_fop_data_t *fop, int32_t error)</div><div class='add'>+{</div><div class='add'>+    ec_resume_f resume = NULL;</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;fop-&gt;lock);</div><div class='add'>+</div><div class='add'>+    __ec_fop_set_error(fop, error);</div><div class='add'>+</div><div class='add'>+    if (--fop-&gt;jobs == 0) {</div><div class='add'>+        resume = fop-&gt;resume;</div><div class='add'>+        fop-&gt;resume = NULL;</div><div class='add'>+        if (resume != NULL) {</div><div class='add'>+            ec_trace("RESUME", fop, "error=%d", error);</div><div class='add'>+</div><div class='add'>+            if (fop-&gt;error != 0) {</div><div class='add'>+                error = fop-&gt;error;</div><div class='add'>+            }</div><div class='add'>+            fop-&gt;error = 0;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    UNLOCK(&amp;fop-&gt;lock);</div><div class='add'>+</div><div class='add'>+    if (resume != NULL) {</div><div class='add'>+        resume(fop, error);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ec_fop_data_release(fop);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_resume_parent(ec_fop_data_t *fop)</div><div class='add'>+{</div><div class='add'>+    ec_fop_data_t *parent;</div><div class='add'>+    int32_t error = 0;</div><div class='add'>+</div><div class='add'>+    parent = fop-&gt;parent;</div><div class='add'>+    if (parent != NULL) {</div><div class='add'>+        if ((fop-&gt;fop_flags &amp; EC_FOP_NO_PROPAGATE_ERROR) == 0) {</div><div class='add'>+            error = fop-&gt;error;</div><div class='add'>+        }</div><div class='add'>+        ec_trace("RESUME_PARENT", fop, "error=%u", error);</div><div class='add'>+        fop-&gt;parent = NULL;</div><div class='add'>+        ec_resume(parent, error);</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+gf_boolean_t</div><div class='add'>+ec_is_recoverable_error(int32_t op_errno)</div><div class='add'>+{</div><div class='add'>+    switch (op_errno) {</div><div class='add'>+        case ENOTCONN:</div><div class='add'>+        case ESTALE:</div><div class='add'>+        case ENOENT:</div><div class='add'>+        case EBADFD: /*Opened fd but brick is disconnected*/</div><div class='add'>+        case EIO:    /*Backend-fs crash like XFS/ext4 etc*/</div><div class='add'>+            return _gf_true;</div><div class='add'>+    }</div><div class='add'>+    return _gf_false;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_complete(ec_fop_data_t *fop)</div><div class='add'>+{</div><div class='add'>+    ec_cbk_data_t *cbk = NULL;</div><div class='add'>+    int32_t resume = 0, update = 0;</div><div class='add'>+    int healing_count = 0;</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;fop-&gt;lock);</div><div class='add'>+</div><div class='add'>+    ec_trace("COMPLETE", fop, "");</div><div class='add'>+</div><div class='add'>+    if (--fop-&gt;winds == 0) {</div><div class='add'>+        if (fop-&gt;answer == NULL) {</div><div class='add'>+            if (!list_empty(&amp;fop-&gt;cbk_list)) {</div><div class='add'>+                cbk = list_entry(fop-&gt;cbk_list.next, ec_cbk_data_t, list);</div><div class='add'>+                healing_count = gf_bits_count(cbk-&gt;mask &amp; fop-&gt;healing);</div><div class='add'>+                /* fop shouldn't be treated as success if it is not</div><div class='add'>+                 * successful on at least fop-&gt;minimum good copies*/</div><div class='add'>+                if ((cbk-&gt;count - healing_count) &gt;= fop-&gt;minimum) {</div><div class='add'>+                    fop-&gt;answer = cbk;</div><div class='add'>+</div><div class='add'>+                    update = 1;</div><div class='add'>+                }</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            resume = 1;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    UNLOCK(&amp;fop-&gt;lock);</div><div class='add'>+</div><div class='add'>+    /* ec_update_good() locks inode-&gt;lock. This may cause deadlocks with</div><div class='add'>+       fop-&gt;lock when used in another order. Since ec_update_good() will not</div><div class='add'>+       be called more than once for each fop, it can be called from outside</div><div class='add'>+       the fop-&gt;lock locked region. */</div><div class='add'>+    if (update) {</div><div class='add'>+        ec_update_good(fop, cbk-&gt;mask);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (resume) {</div><div class='add'>+        ec_resume(fop, 0);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ec_fop_data_release(fop);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* There could be already granted locks sitting on the bricks, unlock for which</div><div class='add'>+ * must be wound at all costs*/</div><div class='add'>+static gf_boolean_t</div><div class='add'>+ec_must_wind(ec_fop_data_t *fop)</div><div class='add'>+{</div><div class='add'>+    if ((fop-&gt;id == GF_FOP_INODELK) || (fop-&gt;id == GF_FOP_FINODELK) ||</div><div class='add'>+        (fop-&gt;id == GF_FOP_LK)) {</div><div class='add'>+        if (fop-&gt;flock.l_type == F_UNLCK)</div><div class='add'>+            return _gf_true;</div><div class='add'>+    } else if ((fop-&gt;id == GF_FOP_ENTRYLK) || (fop-&gt;id == GF_FOP_FENTRYLK)) {</div><div class='add'>+        if (fop-&gt;entrylk_cmd == ENTRYLK_UNLOCK)</div><div class='add'>+            return _gf_true;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return _gf_false;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static gf_boolean_t</div><div class='add'>+ec_internal_op(ec_fop_data_t *fop)</div><div class='add'>+{</div><div class='add'>+    if (ec_must_wind(fop))</div><div class='add'>+        return _gf_true;</div><div class='add'>+    if (fop-&gt;id == GF_FOP_XATTROP)</div><div class='add'>+        return _gf_true;</div><div class='add'>+    if (fop-&gt;id == GF_FOP_FXATTROP)</div><div class='add'>+        return _gf_true;</div><div class='add'>+    if (fop-&gt;id == GF_FOP_OPEN)</div><div class='add'>+        return _gf_true;</div><div class='add'>+    return _gf_false;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+char *</div><div class='add'>+ec_msg_str(ec_fop_data_t *fop)</div><div class='add'>+{</div><div class='add'>+    loc_t *loc1 = NULL;</div><div class='add'>+    loc_t *loc2 = NULL;</div><div class='add'>+    char gfid1[64] = {0};</div><div class='add'>+    char gfid2[64] = {0};</div><div class='add'>+    ec_fop_data_t *parent = fop-&gt;parent;</div><div class='add'>+</div><div class='add'>+    if (fop-&gt;errstr)</div><div class='add'>+        return fop-&gt;errstr;</div><div class='add'>+    if (!fop-&gt;use_fd) {</div><div class='add'>+        loc1 = &amp;fop-&gt;loc[0];</div><div class='add'>+        loc2 = &amp;fop-&gt;loc[1];</div><div class='add'>+</div><div class='add'>+        if (fop-&gt;id == GF_FOP_RENAME) {</div><div class='add'>+            gf_asprintf(&amp;fop-&gt;errstr,</div><div class='add'>+                        "FOP : '%s' failed on '%s' and '%s' with gfids "</div><div class='add'>+                        "%s and %s respectively. Parent FOP: %s",</div><div class='add'>+                        ec_fop_name(fop-&gt;id), loc1-&gt;path, loc2-&gt;path,</div><div class='add'>+                        uuid_utoa_r(loc1-&gt;gfid, gfid1),</div><div class='add'>+                        uuid_utoa_r(loc2-&gt;gfid, gfid2),</div><div class='add'>+                        parent ? ec_fop_name(parent-&gt;id) : "No Parent");</div><div class='add'>+        } else {</div><div class='add'>+            gf_asprintf(</div><div class='add'>+                &amp;fop-&gt;errstr,</div><div class='add'>+                "FOP : '%s' failed on '%s' with gfid %s. Parent FOP: %s",</div><div class='add'>+                ec_fop_name(fop-&gt;id), loc1-&gt;path,</div><div class='add'>+                uuid_utoa_r(loc1-&gt;gfid, gfid1),</div><div class='add'>+                parent ? ec_fop_name(parent-&gt;id) : "No Parent");</div><div class='add'>+        }</div><div class='add'>+    } else {</div><div class='add'>+        gf_asprintf(</div><div class='add'>+            &amp;fop-&gt;errstr, "FOP : '%s' failed on gfid %s. Parent FOP: %s",</div><div class='add'>+            ec_fop_name(fop-&gt;id), uuid_utoa_r(fop-&gt;fd-&gt;inode-&gt;gfid, gfid1),</div><div class='add'>+            parent ? ec_fop_name(parent-&gt;id) : "No Parent");</div><div class='add'>+    }</div><div class='add'>+    return fop-&gt;errstr;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+ec_log_insufficient_vol(ec_fop_data_t *fop, int32_t have, uint32_t need,</div><div class='add'>+                        int32_t loglevel)</div><div class='add'>+{</div><div class='add'>+    ec_t *ec = fop-&gt;xl-&gt;private;</div><div class='add'>+    char str1[32], str2[32], str3[32];</div><div class='add'>+</div><div class='add'>+    gf_msg(ec-&gt;xl-&gt;name, loglevel, 0, EC_MSG_CHILDS_INSUFFICIENT,</div><div class='add'>+           "Insufficient available children for this request: "</div><div class='add'>+           "Have : %d, Need : %u : Child UP : %s "</div><div class='add'>+           "Mask: %s, Healing : %s : %s ",</div><div class='add'>+           have, need, ec_bin(str1, sizeof(str1), ec-&gt;xl_up, ec-&gt;nodes),</div><div class='add'>+           ec_bin(str2, sizeof(str2), fop-&gt;mask, ec-&gt;nodes),</div><div class='add'>+           ec_bin(str3, sizeof(str3), fop-&gt;healing, ec-&gt;nodes),</div><div class='add'>+           ec_msg_str(fop));</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int32_t</div><div class='add'>+ec_child_select(ec_fop_data_t *fop)</div><div class='add'>+{</div><div class='add'>+    ec_t *ec = fop-&gt;xl-&gt;private;</div><div class='add'>+    int32_t first = 0, num = 0;</div><div class='add'>+</div><div class='add'>+    ec_fop_cleanup(fop);</div><div class='add'>+</div><div class='add'>+    fop-&gt;mask &amp;= ec-&gt;node_mask;</div><div class='add'>+    /* Wind the fop on same subvols as parent for any internal extra fops like</div><div class='add'>+     * head/tail read in case of writev fop. Unlocks shouldn't do this because</div><div class='add'>+     * unlock should go on all subvols where lock is performed*/</div><div class='add'>+    if (fop-&gt;parent &amp;&amp; !ec_internal_op(fop)) {</div><div class='add'>+        fop-&gt;mask &amp;= (fop-&gt;parent-&gt;mask &amp; ~fop-&gt;parent-&gt;healing);</div><div class='add'>+        if (ec_is_data_fop(fop-&gt;id)) {</div><div class='add'>+            fop-&gt;healing |= fop-&gt;parent-&gt;healing;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if ((fop-&gt;mask &amp; ~ec-&gt;xl_up) != 0) {</div><div class='add'>+        gf_msg(fop-&gt;xl-&gt;name, GF_LOG_WARNING, 0, EC_MSG_OP_EXEC_UNAVAIL,</div><div class='add'>+               "Executing operation with "</div><div class='add'>+               "some subvolumes unavailable. (%" PRIXPTR "). %s ",</div><div class='add'>+               fop-&gt;mask &amp; ~ec-&gt;xl_up, ec_msg_str(fop));</div><div class='add'>+        fop-&gt;mask &amp;= ec-&gt;xl_up;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    switch (fop-&gt;minimum) {</div><div class='add'>+        case EC_MINIMUM_ALL:</div><div class='add'>+            fop-&gt;minimum = gf_bits_count(fop-&gt;mask);</div><div class='add'>+            if (fop-&gt;minimum &gt;= ec-&gt;fragments) {</div><div class='add'>+                break;</div><div class='add'>+            }</div><div class='add'>+        case EC_MINIMUM_MIN:</div><div class='add'>+            fop-&gt;minimum = ec-&gt;fragments;</div><div class='add'>+            break;</div><div class='add'>+        case EC_MINIMUM_ONE:</div><div class='add'>+            fop-&gt;minimum = 1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (ec-&gt;read_policy == EC_ROUND_ROBIN) {</div><div class='add'>+        first = ec-&gt;idx;</div><div class='add'>+        if (++first &gt;= ec-&gt;nodes) {</div><div class='add'>+            first = 0;</div><div class='add'>+        }</div><div class='add'>+        ec-&gt;idx = first;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    num = gf_bits_count(fop-&gt;mask);</div><div class='add'>+    /*Unconditionally wind on healing subvolumes*/</div><div class='add'>+    fop-&gt;mask |= fop-&gt;healing;</div><div class='add'>+    fop-&gt;remaining = fop-&gt;mask;</div><div class='add'>+    fop-&gt;received = 0;</div><div class='add'>+</div><div class='add'>+    ec_trace("SELECT", fop, "");</div><div class='add'>+</div><div class='add'>+    if ((num &lt; fop-&gt;minimum) &amp;&amp; (num &lt; ec-&gt;fragments)) {</div><div class='add'>+        ec_log_insufficient_vol(fop, num, fop-&gt;minimum, GF_LOG_ERROR);</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (!fop-&gt;parent &amp;&amp; fop-&gt;lock_count &amp;&amp;</div><div class='add'>+        (fop-&gt;locks[0].update[EC_DATA_TXN] ||</div><div class='add'>+         fop-&gt;locks[0].update[EC_METADATA_TXN])) {</div><div class='add'>+        if (ec-&gt;quorum_count &amp;&amp; (num &lt; ec-&gt;quorum_count)) {</div><div class='add'>+            ec_log_insufficient_vol(fop, num, ec-&gt;quorum_count, GF_LOG_ERROR);</div><div class='add'>+            return 0;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_dispatch_next(ec_fop_data_t *fop, uint32_t idx)</div><div class='add'>+{</div><div class='add'>+    uint32_t i = EC_INVALID_INDEX;</div><div class='add'>+    ec_t *ec = fop-&gt;xl-&gt;private;</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;fop-&gt;lock);</div><div class='add'>+</div><div class='add'>+    i = ec_child_next(ec, fop, idx);</div><div class='add'>+    if (i &lt; EC_MAX_NODES) {</div><div class='add'>+        idx = i;</div><div class='add'>+</div><div class='add'>+        fop-&gt;remaining ^= 1ULL &lt;&lt; idx;</div><div class='add'>+</div><div class='add'>+        ec_trace("EXECUTE", fop, "idx=%d", idx);</div><div class='add'>+</div><div class='add'>+        fop-&gt;winds++;</div><div class='add'>+        fop-&gt;refs++;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    UNLOCK(&amp;fop-&gt;lock);</div><div class='add'>+</div><div class='add'>+    if (i &lt; EC_MAX_NODES) {</div><div class='add'>+        fop-&gt;wind(ec, fop, idx);</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_dispatch_mask(ec_fop_data_t *fop, uintptr_t mask)</div><div class='add'>+{</div><div class='add'>+    ec_t *ec = fop-&gt;xl-&gt;private;</div><div class='add'>+    int32_t count, idx;</div><div class='add'>+</div><div class='add'>+    count = gf_bits_count(mask);</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;fop-&gt;lock);</div><div class='add'>+</div><div class='add'>+    ec_trace("EXECUTE", fop, "mask=%lX", mask);</div><div class='add'>+</div><div class='add'>+    fop-&gt;remaining ^= mask;</div><div class='add'>+</div><div class='add'>+    fop-&gt;winds += count;</div><div class='add'>+    fop-&gt;refs += count;</div><div class='add'>+</div><div class='add'>+    UNLOCK(&amp;fop-&gt;lock);</div><div class='add'>+</div><div class='add'>+    idx = 0;</div><div class='add'>+    while (mask != 0) {</div><div class='add'>+        if ((mask &amp; 1) != 0) {</div><div class='add'>+            fop-&gt;wind(ec, fop, idx);</div><div class='add'>+        }</div><div class='add'>+        idx++;</div><div class='add'>+        mask &gt;&gt;= 1;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_dispatch_start(ec_fop_data_t *fop)</div><div class='add'>+{</div><div class='add'>+    fop-&gt;answer = NULL;</div><div class='add'>+    fop-&gt;good = 0;</div><div class='add'>+</div><div class='add'>+    INIT_LIST_HEAD(&amp;fop-&gt;cbk_list);</div><div class='add'>+</div><div class='add'>+    if (fop-&gt;lock_count &gt; 0) {</div><div class='add'>+        ec_owner_copy(fop-&gt;frame, &amp;fop-&gt;req_frame-&gt;root-&gt;lk_owner);</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_dispatch_one(ec_fop_data_t *fop)</div><div class='add'>+{</div><div class='add'>+    ec_dispatch_start(fop);</div><div class='add'>+</div><div class='add'>+    if (ec_child_select(fop)) {</div><div class='add'>+        ec_sleep(fop);</div><div class='add'>+</div><div class='add'>+        fop-&gt;expected = 1;</div><div class='add'>+        fop-&gt;first = ec_select_first_by_read_policy(fop-&gt;xl-&gt;private, fop);</div><div class='add'>+</div><div class='add'>+        ec_dispatch_next(fop, fop-&gt;first);</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+gf_boolean_t</div><div class='add'>+ec_dispatch_one_retry(ec_fop_data_t *fop, ec_cbk_data_t **cbk)</div><div class='add'>+{</div><div class='add'>+    ec_cbk_data_t *tmp;</div><div class='add'>+</div><div class='add'>+    tmp = ec_fop_prepare_answer(fop, _gf_true);</div><div class='add'>+    if (cbk != NULL) {</div><div class='add'>+        *cbk = tmp;</div><div class='add'>+    }</div><div class='add'>+    if ((tmp != NULL) &amp;&amp; (tmp-&gt;op_ret &lt; 0) &amp;&amp;</div><div class='add'>+        ec_is_recoverable_error(tmp-&gt;op_errno)) {</div><div class='add'>+        GF_ASSERT(fop-&gt;mask &amp; (1ULL &lt;&lt; tmp-&gt;idx));</div><div class='add'>+        fop-&gt;mask ^= (1ULL &lt;&lt; tmp-&gt;idx);</div><div class='add'>+        if (fop-&gt;mask) {</div><div class='add'>+            return _gf_true;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return _gf_false;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_dispatch_inc(ec_fop_data_t *fop)</div><div class='add'>+{</div><div class='add'>+    ec_dispatch_start(fop);</div><div class='add'>+</div><div class='add'>+    if (ec_child_select(fop)) {</div><div class='add'>+        ec_sleep(fop);</div><div class='add'>+</div><div class='add'>+        fop-&gt;expected = gf_bits_count(fop-&gt;remaining);</div><div class='add'>+        fop-&gt;first = 0;</div><div class='add'>+</div><div class='add'>+        ec_dispatch_next(fop, 0);</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_dispatch_all(ec_fop_data_t *fop)</div><div class='add'>+{</div><div class='add'>+    ec_dispatch_start(fop);</div><div class='add'>+</div><div class='add'>+    if (ec_child_select(fop)) {</div><div class='add'>+        ec_sleep(fop);</div><div class='add'>+</div><div class='add'>+        fop-&gt;expected = gf_bits_count(fop-&gt;remaining);</div><div class='add'>+        fop-&gt;first = 0;</div><div class='add'>+</div><div class='add'>+        ec_dispatch_mask(fop, fop-&gt;remaining);</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_dispatch_min(ec_fop_data_t *fop)</div><div class='add'>+{</div><div class='add'>+    ec_t *ec = fop-&gt;xl-&gt;private;</div><div class='add'>+    uintptr_t mask;</div><div class='add'>+    uint32_t idx;</div><div class='add'>+    int32_t count;</div><div class='add'>+</div><div class='add'>+    ec_dispatch_start(fop);</div><div class='add'>+</div><div class='add'>+    if (ec_child_select(fop)) {</div><div class='add'>+        ec_sleep(fop);</div><div class='add'>+</div><div class='add'>+        fop-&gt;expected = count = ec-&gt;fragments;</div><div class='add'>+        fop-&gt;first = ec_select_first_by_read_policy(fop-&gt;xl-&gt;private, fop);</div><div class='add'>+        idx = fop-&gt;first - 1;</div><div class='add'>+        mask = 0;</div><div class='add'>+        while (count-- &gt; 0) {</div><div class='add'>+            idx = ec_child_next(ec, fop, idx + 1);</div><div class='add'>+            if (idx &lt; EC_MAX_NODES)</div><div class='add'>+                mask |= 1ULL &lt;&lt; idx;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        ec_dispatch_mask(fop, mask);</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_succeed_all(ec_fop_data_t *fop)</div><div class='add'>+{</div><div class='add'>+    ec_dispatch_start(fop);</div><div class='add'>+</div><div class='add'>+    if (ec_child_select(fop)) {</div><div class='add'>+        fop-&gt;expected = gf_bits_count(fop-&gt;remaining);</div><div class='add'>+        fop-&gt;first = 0;</div><div class='add'>+</div><div class='add'>+        /* Simulate a successful execution on all bricks */</div><div class='add'>+        ec_trace("SUCCEED", fop, "");</div><div class='add'>+</div><div class='add'>+        fop-&gt;good = fop-&gt;remaining;</div><div class='add'>+        fop-&gt;remaining = 0;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+ec_lock_t *</div><div class='add'>+ec_lock_allocate(ec_fop_data_t *fop, loc_t *loc)</div><div class='add'>+{</div><div class='add'>+    ec_t *ec = fop-&gt;xl-&gt;private;</div><div class='add'>+    ec_lock_t *lock;</div><div class='add'>+    int32_t err;</div><div class='add'>+</div><div class='add'>+    if ((loc-&gt;inode == NULL) ||</div><div class='add'>+        (gf_uuid_is_null(loc-&gt;gfid) &amp;&amp; gf_uuid_is_null(loc-&gt;inode-&gt;gfid))) {</div><div class='add'>+        gf_msg(fop-&gt;xl-&gt;name, GF_LOG_ERROR, EINVAL, EC_MSG_INVALID_INODE,</div><div class='add'>+               "Trying to lock based on an invalid "</div><div class='add'>+               "inode");</div><div class='add'>+</div><div class='add'>+        __ec_fop_set_error(fop, EINVAL);</div><div class='add'>+</div><div class='add'>+        return NULL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    lock = mem_get0(ec-&gt;lock_pool);</div><div class='add'>+    if (lock != NULL) {</div><div class='add'>+        lock-&gt;good_mask = UINTPTR_MAX;</div><div class='add'>+        INIT_LIST_HEAD(&amp;lock-&gt;owners);</div><div class='add'>+        INIT_LIST_HEAD(&amp;lock-&gt;waiting);</div><div class='add'>+        INIT_LIST_HEAD(&amp;lock-&gt;frozen);</div><div class='add'>+        err = ec_loc_from_loc(fop-&gt;xl, &amp;lock-&gt;loc, loc);</div><div class='add'>+        if (err != 0) {</div><div class='add'>+            mem_put(lock);</div><div class='add'>+            lock = NULL;</div><div class='add'>+</div><div class='add'>+            __ec_fop_set_error(fop, -err);</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return lock;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_lock_destroy(ec_lock_t *lock)</div><div class='add'>+{</div><div class='add'>+    loc_wipe(&amp;lock-&gt;loc);</div><div class='add'>+    if (lock-&gt;fd != NULL) {</div><div class='add'>+        fd_unref(lock-&gt;fd);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    mem_put(lock);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_lock_compare(ec_lock_t *lock1, ec_lock_t *lock2)</div><div class='add'>+{</div><div class='add'>+    return gf_uuid_compare(lock1-&gt;loc.gfid, lock2-&gt;loc.gfid);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+ec_lock_insert(ec_fop_data_t *fop, ec_lock_t *lock, uint32_t flags, loc_t *base,</div><div class='add'>+               off_t fl_start, uint64_t fl_size)</div><div class='add'>+{</div><div class='add'>+    ec_lock_link_t *link;</div><div class='add'>+</div><div class='add'>+    /* This check is only prepared for up to 2 locks per fop. If more locks</div><div class='add'>+     * are needed this must be changed. */</div><div class='add'>+    if ((fop-&gt;lock_count &gt; 0) &amp;&amp;</div><div class='add'>+        (ec_lock_compare(fop-&gt;locks[0].lock, lock) &lt; 0)) {</div><div class='add'>+        fop-&gt;first_lock = fop-&gt;lock_count;</div><div class='add'>+    } else {</div><div class='add'>+        /* When the first lock is added to the current fop, request lock</div><div class='add'>+         * counts from locks xlator to be able to determine if there is</div><div class='add'>+         * contention and release the lock sooner. */</div><div class='add'>+        if (fop-&gt;xdata == NULL) {</div><div class='add'>+            fop-&gt;xdata = dict_new();</div><div class='add'>+            if (fop-&gt;xdata == NULL) {</div><div class='add'>+                ec_fop_set_error(fop, ENOMEM);</div><div class='add'>+                return;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+        if (dict_set_str(fop-&gt;xdata, GLUSTERFS_INODELK_DOM_COUNT,</div><div class='add'>+                         fop-&gt;xl-&gt;name) != 0) {</div><div class='add'>+            ec_fop_set_error(fop, ENOMEM);</div><div class='add'>+            return;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    link = &amp;fop-&gt;locks[fop-&gt;lock_count++];</div><div class='add'>+</div><div class='add'>+    link-&gt;lock = lock;</div><div class='add'>+    link-&gt;fop = fop;</div><div class='add'>+    link-&gt;update[EC_DATA_TXN] = (flags &amp; EC_UPDATE_DATA) != 0;</div><div class='add'>+    link-&gt;update[EC_METADATA_TXN] = (flags &amp; EC_UPDATE_META) != 0;</div><div class='add'>+    link-&gt;base = base;</div><div class='add'>+    link-&gt;fl_start = fl_start;</div><div class='add'>+    link-&gt;fl_end = ec_range_end_get(fl_start, fl_size);</div><div class='add'>+</div><div class='add'>+    lock-&gt;refs_pending++;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+ec_lock_prepare_inode_internal(ec_fop_data_t *fop, loc_t *loc, uint32_t flags,</div><div class='add'>+                               loc_t *base, off_t fl_start, uint64_t fl_size)</div><div class='add'>+{</div><div class='add'>+    ec_lock_t *lock = NULL;</div><div class='add'>+    ec_inode_t *ctx;</div><div class='add'>+</div><div class='add'>+    if ((fop-&gt;parent != NULL) || (fop-&gt;error != 0) || (loc-&gt;inode == NULL)) {</div><div class='add'>+        return;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;loc-&gt;inode-&gt;lock);</div><div class='add'>+</div><div class='add'>+    ctx = __ec_inode_get(loc-&gt;inode, fop-&gt;xl);</div><div class='add'>+    if (ctx == NULL) {</div><div class='add'>+        __ec_fop_set_error(fop, ENOMEM);</div><div class='add'>+</div><div class='add'>+        goto unlock;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (ctx-&gt;inode_lock != NULL) {</div><div class='add'>+        lock = ctx-&gt;inode_lock;</div><div class='add'>+</div><div class='add'>+        /* If there's another lock, make sure that it's not the same. Otherwise</div><div class='add'>+         * do not insert it.</div><div class='add'>+         *</div><div class='add'>+         * This can only happen on renames where source and target names are</div><div class='add'>+         * in the same directory. */</div><div class='add'>+        if ((fop-&gt;lock_count &gt; 0) &amp;&amp; (fop-&gt;locks[0].lock == lock)) {</div><div class='add'>+            /* Combine data/meta updates */</div><div class='add'>+            fop-&gt;locks[0].update[EC_DATA_TXN] |= (flags &amp; EC_UPDATE_DATA) != 0;</div><div class='add'>+            fop-&gt;locks[0].update[EC_METADATA_TXN] |= (flags &amp; EC_UPDATE_META) !=</div><div class='add'>+                                                     0;</div><div class='add'>+</div><div class='add'>+            /* Only one base inode is allowed per fop, so there shouldn't be</div><div class='add'>+             * overwrites here. */</div><div class='add'>+            if (base != NULL) {</div><div class='add'>+                fop-&gt;locks[0].base = base;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            goto update_query;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        ec_trace("LOCK_INODELK", fop,</div><div class='add'>+                 "lock=%p, inode=%p. Lock already "</div><div class='add'>+                 "acquired",</div><div class='add'>+                 lock, loc-&gt;inode);</div><div class='add'>+</div><div class='add'>+        goto insert;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    lock = ec_lock_allocate(fop, loc);</div><div class='add'>+    if (lock == NULL) {</div><div class='add'>+        goto unlock;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ec_trace("LOCK_CREATE", fop, "lock=%p", lock);</div><div class='add'>+</div><div class='add'>+    lock-&gt;flock.l_type = F_WRLCK;</div><div class='add'>+    lock-&gt;flock.l_whence = SEEK_SET;</div><div class='add'>+</div><div class='add'>+    lock-&gt;ctx = ctx;</div><div class='add'>+    ctx-&gt;inode_lock = lock;</div><div class='add'>+</div><div class='add'>+insert:</div><div class='add'>+    ec_lock_insert(fop, lock, flags, base, fl_start, fl_size);</div><div class='add'>+update_query:</div><div class='add'>+    lock-&gt;query |= (flags &amp; EC_QUERY_INFO) != 0;</div><div class='add'>+unlock:</div><div class='add'>+    UNLOCK(&amp;loc-&gt;inode-&gt;lock);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_lock_prepare_inode(ec_fop_data_t *fop, loc_t *loc, uint32_t flags,</div><div class='add'>+                      off_t fl_start, uint64_t fl_size)</div><div class='add'>+{</div><div class='add'>+    ec_lock_prepare_inode_internal(fop, loc, flags, NULL, fl_start, fl_size);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_lock_prepare_parent_inode(ec_fop_data_t *fop, loc_t *loc, loc_t *base,</div><div class='add'>+                             uint32_t flags)</div><div class='add'>+{</div><div class='add'>+    loc_t tmp;</div><div class='add'>+    int32_t err;</div><div class='add'>+</div><div class='add'>+    if (fop-&gt;error != 0) {</div><div class='add'>+        return;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    err = ec_loc_parent(fop-&gt;xl, loc, &amp;tmp);</div><div class='add'>+    if (err != 0) {</div><div class='add'>+        ec_fop_set_error(fop, -err);</div><div class='add'>+</div><div class='add'>+        return;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if ((flags &amp; EC_INODE_SIZE) != 0) {</div><div class='add'>+        flags ^= EC_INODE_SIZE;</div><div class='add'>+    } else {</div><div class='add'>+        base = NULL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ec_lock_prepare_inode_internal(fop, &amp;tmp, flags, base, 0, EC_RANGE_FULL);</div><div class='add'>+</div><div class='add'>+    loc_wipe(&amp;tmp);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_lock_prepare_fd(ec_fop_data_t *fop, fd_t *fd, uint32_t flags, off_t fl_start,</div><div class='add'>+                   uint64_t fl_size)</div><div class='add'>+{</div><div class='add'>+    loc_t loc;</div><div class='add'>+    int32_t err;</div><div class='add'>+</div><div class='add'>+    if (fop-&gt;error != 0) {</div><div class='add'>+        return;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    err = ec_loc_from_fd(fop-&gt;xl, &amp;loc, fd);</div><div class='add'>+    if (err != 0) {</div><div class='add'>+        ec_fop_set_error(fop, -err);</div><div class='add'>+</div><div class='add'>+        return;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ec_lock_prepare_inode_internal(fop, &amp;loc, flags, NULL, fl_start, fl_size);</div><div class='add'>+</div><div class='add'>+    loc_wipe(&amp;loc);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+gf_boolean_t</div><div class='add'>+ec_config_check(xlator_t *xl, ec_config_t *config)</div><div class='add'>+{</div><div class='add'>+    ec_t *ec;</div><div class='add'>+</div><div class='add'>+    ec = xl-&gt;private;</div><div class='add'>+    if ((config-&gt;version != EC_CONFIG_VERSION) ||</div><div class='add'>+        (config-&gt;algorithm != EC_CONFIG_ALGORITHM) ||</div><div class='add'>+        (config-&gt;gf_word_size != EC_GF_BITS) || (config-&gt;bricks != ec-&gt;nodes) ||</div><div class='add'>+        (config-&gt;redundancy != ec-&gt;redundancy) ||</div><div class='add'>+        (config-&gt;chunk_size != EC_METHOD_CHUNK_SIZE)) {</div><div class='add'>+        uint32_t data_bricks;</div><div class='add'>+</div><div class='add'>+        /* This combination of version/algorithm requires the following</div><div class='add'>+           values. Incorrect values for these fields are a sign of</div><div class='add'>+           corruption:</div><div class='add'>+</div><div class='add'>+             redundancy &gt; 0</div><div class='add'>+             redundancy * 2 &lt; bricks</div><div class='add'>+             gf_word_size must be a power of 2</div><div class='add'>+             chunk_size (in bits) must be a multiple of gf_word_size *</div><div class='add'>+                 (bricks - redundancy) */</div><div class='add'>+</div><div class='add'>+        data_bricks = config-&gt;bricks - config-&gt;redundancy;</div><div class='add'>+        if ((config-&gt;redundancy &lt; 1) ||</div><div class='add'>+            (config-&gt;redundancy * 2 &gt;= config-&gt;bricks) ||</div><div class='add'>+            !ec_is_power_of_2(config-&gt;gf_word_size) ||</div><div class='add'>+            ((config-&gt;chunk_size * 8) % (config-&gt;gf_word_size * data_bricks) !=</div><div class='add'>+             0)) {</div><div class='add'>+            gf_msg(xl-&gt;name, GF_LOG_ERROR, EINVAL, EC_MSG_INVALID_CONFIG,</div><div class='add'>+                   "Invalid or corrupted config");</div><div class='add'>+        } else {</div><div class='add'>+            gf_msg(xl-&gt;name, GF_LOG_ERROR, EINVAL, EC_MSG_INVALID_CONFIG,</div><div class='add'>+                   "Unsupported config "</div><div class='add'>+                   "(V=%u, A=%u, W=%u, "</div><div class='add'>+                   "N=%u, R=%u, S=%u)",</div><div class='add'>+                   config-&gt;version, config-&gt;algorithm, config-&gt;gf_word_size,</div><div class='add'>+                   config-&gt;bricks, config-&gt;redundancy, config-&gt;chunk_size);</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        return _gf_false;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return _gf_true;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+gf_boolean_t</div><div class='add'>+ec_set_dirty_flag(ec_lock_link_t *link, ec_inode_t *ctx, uint64_t *dirty)</div><div class='add'>+{</div><div class='add'>+    gf_boolean_t set_dirty = _gf_false;</div><div class='add'>+</div><div class='add'>+    if (link-&gt;update[EC_DATA_TXN] &amp;&amp; !ctx-&gt;dirty[EC_DATA_TXN]) {</div><div class='add'>+        if (!link-&gt;optimistic_changelog)</div><div class='add'>+            dirty[EC_DATA_TXN] = 1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (link-&gt;update[EC_METADATA_TXN] &amp;&amp; !ctx-&gt;dirty[EC_METADATA_TXN]) {</div><div class='add'>+        if (!link-&gt;optimistic_changelog)</div><div class='add'>+            dirty[EC_METADATA_TXN] = 1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (dirty[EC_METADATA_TXN] || dirty[EC_DATA_TXN]) {</div><div class='add'>+        set_dirty = _gf_true;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return set_dirty;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_prepare_update_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                      int32_t op_ret, int32_t op_errno, dict_t *dict,</div><div class='add'>+                      dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    struct list_head list;</div><div class='add'>+    ec_fop_data_t *fop = cookie, *parent, *tmp;</div><div class='add'>+    ec_lock_link_t *parent_link = fop-&gt;data;</div><div class='add'>+    ec_lock_link_t *link = NULL;</div><div class='add'>+    ec_lock_t *lock = NULL;</div><div class='add'>+    ec_inode_t *ctx;</div><div class='add'>+    gf_boolean_t release = _gf_false;</div><div class='add'>+    uint64_t provided_flags = 0;</div><div class='add'>+    uint64_t dirty[EC_VERSION_SIZE] = {0, 0};</div><div class='add'>+    lock = parent_link-&gt;lock;</div><div class='add'>+    parent = parent_link-&gt;fop;</div><div class='add'>+    ctx = lock-&gt;ctx;</div><div class='add'>+</div><div class='add'>+    INIT_LIST_HEAD(&amp;list);</div><div class='add'>+    provided_flags = EC_PROVIDED_FLAGS(parent_link-&gt;waiting_flags);</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;lock-&gt;loc.inode-&gt;lock);</div><div class='add'>+</div><div class='add'>+    list_for_each_entry(link, &amp;lock-&gt;owners, owner_list)</div><div class='add'>+    {</div><div class='add'>+        if ((link-&gt;waiting_flags &amp; provided_flags) != 0) {</div><div class='add'>+            link-&gt;waiting_flags ^= (link-&gt;waiting_flags &amp; provided_flags);</div><div class='add'>+            if (EC_NEEDED_FLAGS(link-&gt;waiting_flags) == 0)</div><div class='add'>+                list_add_tail(&amp;link-&gt;fop-&gt;cbk_list, &amp;list);</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    if (op_ret &lt; 0) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_WARNING, op_errno, EC_MSG_SIZE_VERS_GET_FAIL,</div><div class='add'>+               "Failed to get size and version :  %s", ec_msg_str(fop));</div><div class='add'>+</div><div class='add'>+        goto unlock;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (EC_FLAGS_HAVE(provided_flags, EC_FLAG_XATTROP)) {</div><div class='add'>+        op_errno = -ec_dict_del_array(dict, EC_XATTR_VERSION, ctx-&gt;pre_version,</div><div class='add'>+                                      EC_VERSION_SIZE);</div><div class='add'>+        if (op_errno != 0) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, op_errno,</div><div class='add'>+                   EC_MSG_VER_XATTR_GET_FAIL, "Unable to get version xattr. %s",</div><div class='add'>+                   ec_msg_str(fop));</div><div class='add'>+            goto unlock;</div><div class='add'>+        }</div><div class='add'>+        ctx-&gt;post_version[0] += ctx-&gt;pre_version[0];</div><div class='add'>+        ctx-&gt;post_version[1] += ctx-&gt;pre_version[1];</div><div class='add'>+</div><div class='add'>+        ctx-&gt;have_version = _gf_true;</div><div class='add'>+</div><div class='add'>+        if (lock-&gt;loc.inode-&gt;ia_type == IA_IFREG ||</div><div class='add'>+            lock-&gt;loc.inode-&gt;ia_type == IA_INVAL) {</div><div class='add'>+            op_errno = -ec_dict_del_number(dict, EC_XATTR_SIZE, &amp;ctx-&gt;pre_size);</div><div class='add'>+            if (op_errno != 0) {</div><div class='add'>+                if (lock-&gt;loc.inode-&gt;ia_type == IA_IFREG) {</div><div class='add'>+                    gf_msg(this-&gt;name, GF_LOG_ERROR, op_errno,</div><div class='add'>+                           EC_MSG_SIZE_XATTR_GET_FAIL,</div><div class='add'>+                           "Unable to get size xattr. %s", ec_msg_str(fop));</div><div class='add'>+                    goto unlock;</div><div class='add'>+                }</div><div class='add'>+            } else {</div><div class='add'>+                ctx-&gt;post_size = ctx-&gt;pre_size;</div><div class='add'>+</div><div class='add'>+                ctx-&gt;have_size = _gf_true;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            op_errno = -ec_dict_del_config(dict, EC_XATTR_CONFIG, &amp;ctx-&gt;config);</div><div class='add'>+            if (op_errno != 0) {</div><div class='add'>+                if ((lock-&gt;loc.inode-&gt;ia_type == IA_IFREG) ||</div><div class='add'>+                    (op_errno != ENODATA)) {</div><div class='add'>+                    gf_msg(this-&gt;name, GF_LOG_ERROR, op_errno,</div><div class='add'>+                           EC_MSG_CONFIG_XATTR_GET_FAIL,</div><div class='add'>+                           "Unable to get config xattr. %s", ec_msg_str(fop));</div><div class='add'>+</div><div class='add'>+                    goto unlock;</div><div class='add'>+                }</div><div class='add'>+            } else {</div><div class='add'>+                if (!ec_config_check(parent-&gt;xl, &amp;ctx-&gt;config)) {</div><div class='add'>+                    gf_msg(this-&gt;name, GF_LOG_ERROR, EINVAL,</div><div class='add'>+                           EC_MSG_CONFIG_XATTR_INVALID, "Invalid config xattr");</div><div class='add'>+</div><div class='add'>+                    op_errno = EINVAL;</div><div class='add'>+</div><div class='add'>+                    goto unlock;</div><div class='add'>+                }</div><div class='add'>+                ctx-&gt;have_config = _gf_true;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+        ctx-&gt;have_info = _gf_true;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ec_set_dirty_flag(fop-&gt;data, ctx, dirty);</div><div class='add'>+    if (dirty[EC_METADATA_TXN] &amp;&amp;</div><div class='add'>+        (EC_FLAGS_HAVE(provided_flags, EC_FLAG_METADATA_DIRTY))) {</div><div class='add'>+        GF_ASSERT(!ctx-&gt;dirty[EC_METADATA_TXN]);</div><div class='add'>+        ctx-&gt;dirty[EC_METADATA_TXN] = 1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (dirty[EC_DATA_TXN] &amp;&amp;</div><div class='add'>+        (EC_FLAGS_HAVE(provided_flags, EC_FLAG_DATA_DIRTY))) {</div><div class='add'>+        GF_ASSERT(!ctx-&gt;dirty[EC_DATA_TXN]);</div><div class='add'>+        ctx-&gt;dirty[EC_DATA_TXN] = 1;</div><div class='add'>+    }</div><div class='add'>+    op_errno = 0;</div><div class='add'>+unlock:</div><div class='add'>+</div><div class='add'>+    lock-&gt;waiting_flags ^= provided_flags;</div><div class='add'>+</div><div class='add'>+    if (op_errno == 0) {</div><div class='add'>+        /* If the fop fails on any of the good bricks, it is important to mark</div><div class='add'>+         * it dirty and update versions right away if dirty was not set before.</div><div class='add'>+         */</div><div class='add'>+        if (lock-&gt;good_mask &amp; ~(fop-&gt;good | fop-&gt;remaining)) {</div><div class='add'>+            release = _gf_true;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        if (parent_link-&gt;update[0] &amp;&amp; !parent_link-&gt;dirty[0]) {</div><div class='add'>+            lock-&gt;release |= release;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        if (parent_link-&gt;update[1] &amp;&amp; !parent_link-&gt;dirty[1]) {</div><div class='add'>+            lock-&gt;release |= release;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        /* We don't allow the main fop to be executed on bricks that have not</div><div class='add'>+         * succeeded the initial xattrop. */</div><div class='add'>+        ec_lock_update_good(lock, fop);</div><div class='add'>+</div><div class='add'>+        /*As of now only data healing marks bricks as healing*/</div><div class='add'>+        lock-&gt;healing |= fop-&gt;healing;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    UNLOCK(&amp;lock-&gt;loc.inode-&gt;lock);</div><div class='add'>+</div><div class='add'>+    while (!list_empty(&amp;list)) {</div><div class='add'>+        tmp = list_entry(list.next, ec_fop_data_t, cbk_list);</div><div class='add'>+        list_del_init(&amp;tmp-&gt;cbk_list);</div><div class='add'>+</div><div class='add'>+        if (op_errno == 0) {</div><div class='add'>+            tmp-&gt;mask &amp;= fop-&gt;good;</div><div class='add'>+</div><div class='add'>+            /*As of now only data healing marks bricks as healing*/</div><div class='add'>+            if (ec_is_data_fop(tmp-&gt;id)) {</div><div class='add'>+                tmp-&gt;healing |= fop-&gt;healing;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        ec_resume(tmp, op_errno);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static gf_boolean_t</div><div class='add'>+ec_set_needed_flag(ec_lock_t *lock, ec_lock_link_t *link, uint64_t flag)</div><div class='add'>+{</div><div class='add'>+    uint64_t current;</div><div class='add'>+</div><div class='add'>+    link-&gt;waiting_flags |= EC_FLAG_NEEDS(flag);</div><div class='add'>+</div><div class='add'>+    current = EC_NEEDED_FLAGS(lock-&gt;waiting_flags);</div><div class='add'>+    if (!EC_FLAGS_HAVE(current, flag)) {</div><div class='add'>+        lock-&gt;waiting_flags |= EC_FLAG_NEEDS(flag);</div><div class='add'>+        link-&gt;waiting_flags |= EC_FLAG_PROVIDES(flag);</div><div class='add'>+</div><div class='add'>+        return _gf_true;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return _gf_false;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static uint64_t</div><div class='add'>+ec_set_xattrop_flags_and_params(ec_lock_t *lock, ec_lock_link_t *link,</div><div class='add'>+                                uint64_t *dirty)</div><div class='add'>+{</div><div class='add'>+    uint64_t oldflags = 0;</div><div class='add'>+    uint64_t newflags = 0;</div><div class='add'>+    ec_inode_t *ctx = lock-&gt;ctx;</div><div class='add'>+</div><div class='add'>+    oldflags = EC_NEEDED_FLAGS(lock-&gt;waiting_flags);</div><div class='add'>+</div><div class='add'>+    if (lock-&gt;query &amp;&amp; !ctx-&gt;have_info) {</div><div class='add'>+        ec_set_needed_flag(lock, link, EC_FLAG_XATTROP);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (dirty[EC_DATA_TXN]) {</div><div class='add'>+        if (!ec_set_needed_flag(lock, link, EC_FLAG_DATA_DIRTY)) {</div><div class='add'>+            dirty[EC_DATA_TXN] = 0;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (dirty[EC_METADATA_TXN]) {</div><div class='add'>+        if (!ec_set_needed_flag(lock, link, EC_FLAG_METADATA_DIRTY)) {</div><div class='add'>+            dirty[EC_METADATA_TXN] = 0;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    newflags = EC_NEEDED_FLAGS(lock-&gt;waiting_flags);</div><div class='add'>+</div><div class='add'>+    return oldflags ^ newflags;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_get_size_version(ec_lock_link_t *link)</div><div class='add'>+{</div><div class='add'>+    loc_t loc;</div><div class='add'>+    ec_lock_t *lock;</div><div class='add'>+    ec_inode_t *ctx;</div><div class='add'>+    ec_fop_data_t *fop;</div><div class='add'>+    dict_t *dict = NULL;</div><div class='add'>+    dict_t *xdata = NULL;</div><div class='add'>+    ec_t *ec = NULL;</div><div class='add'>+    int32_t error = 0;</div><div class='add'>+    gf_boolean_t set_dirty = _gf_false;</div><div class='add'>+    uint64_t allzero[EC_VERSION_SIZE] = {0, 0};</div><div class='add'>+    uint64_t dirty[EC_VERSION_SIZE] = {0, 0};</div><div class='add'>+    lock = link-&gt;lock;</div><div class='add'>+    ctx = lock-&gt;ctx;</div><div class='add'>+    fop = link-&gt;fop;</div><div class='add'>+    ec = fop-&gt;xl-&gt;private;</div><div class='add'>+    uint64_t changed_flags = 0;</div><div class='add'>+</div><div class='add'>+    if (ec-&gt;optimistic_changelog &amp;&amp; !(ec-&gt;node_mask &amp; ~link-&gt;lock-&gt;good_mask) &amp;&amp;</div><div class='add'>+        !ec_is_data_fop(fop-&gt;id))</div><div class='add'>+        link-&gt;optimistic_changelog = _gf_true;</div><div class='add'>+</div><div class='add'>+    memset(&amp;loc, 0, sizeof(loc));</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;lock-&gt;loc.inode-&gt;lock);</div><div class='add'>+</div><div class='add'>+    set_dirty = ec_set_dirty_flag(link, ctx, dirty);</div><div class='add'>+</div><div class='add'>+    /* If ec metadata has already been retrieved, do not try again. */</div><div class='add'>+    if (ctx-&gt;have_info) {</div><div class='add'>+        if (ec_is_data_fop(fop-&gt;id)) {</div><div class='add'>+            fop-&gt;healing |= lock-&gt;healing;</div><div class='add'>+        }</div><div class='add'>+        if (!set_dirty)</div><div class='add'>+            goto unlock;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Determine if there's something we need to retrieve for the current</div><div class='add'>+     * operation. */</div><div class='add'>+    if (!set_dirty &amp;&amp; !lock-&gt;query &amp;&amp; (lock-&gt;loc.inode-&gt;ia_type != IA_IFREG) &amp;&amp;</div><div class='add'>+        (lock-&gt;loc.inode-&gt;ia_type != IA_INVAL)) {</div><div class='add'>+        goto unlock;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    changed_flags = ec_set_xattrop_flags_and_params(lock, link, dirty);</div><div class='add'>+    if (link-&gt;waiting_flags) {</div><div class='add'>+        /* This fop needs to wait until all its flags are cleared which</div><div class='add'>+         * potentially can be cleared by other xattrops that are already</div><div class='add'>+         * wound*/</div><div class='add'>+        ec_sleep(fop);</div><div class='add'>+    } else {</div><div class='add'>+        GF_ASSERT(!changed_flags);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+unlock:</div><div class='add'>+    UNLOCK(&amp;lock-&gt;loc.inode-&gt;lock);</div><div class='add'>+</div><div class='add'>+    if (!changed_flags)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    dict = dict_new();</div><div class='add'>+    if (dict == NULL) {</div><div class='add'>+        error = -ENOMEM;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (EC_FLAGS_HAVE(changed_flags, EC_FLAG_XATTROP)) {</div><div class='add'>+        /* Once we know that an xattrop will be needed,</div><div class='add'>+         * we try to get all available information in a</div><div class='add'>+         * single call. */</div><div class='add'>+        error = ec_dict_set_array(dict, EC_XATTR_VERSION, allzero,</div><div class='add'>+                                  EC_VERSION_SIZE);</div><div class='add'>+        if (error != 0) {</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        if (lock-&gt;loc.inode-&gt;ia_type == IA_IFREG ||</div><div class='add'>+            lock-&gt;loc.inode-&gt;ia_type == IA_INVAL) {</div><div class='add'>+            error = ec_dict_set_number(dict, EC_XATTR_SIZE, 0);</div><div class='add'>+            if (error == 0) {</div><div class='add'>+                error = ec_dict_set_number(dict, EC_XATTR_CONFIG, 0);</div><div class='add'>+            }</div><div class='add'>+            if (error != 0) {</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            xdata = dict_new();</div><div class='add'>+            if (xdata == NULL || dict_set_int32(xdata, GF_GET_SIZE, 1)) {</div><div class='add'>+                error = -ENOMEM;</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (memcmp(allzero, dirty, sizeof(allzero))) {</div><div class='add'>+        error = ec_dict_set_array(dict, EC_XATTR_DIRTY, dirty, EC_VERSION_SIZE);</div><div class='add'>+        if (error != 0) {</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    fop-&gt;frame-&gt;root-&gt;uid = 0;</div><div class='add'>+    fop-&gt;frame-&gt;root-&gt;gid = 0;</div><div class='add'>+</div><div class='add'>+    /* For normal fops, ec_[f]xattrop() must succeed on at least</div><div class='add'>+     * EC_MINIMUM_MIN bricks, however when this is called as part of a</div><div class='add'>+     * self-heal operation the mask of target bricks (fop-&gt;mask) could</div><div class='add'>+     * contain less than EC_MINIMUM_MIN bricks, causing the xattrop to</div><div class='add'>+     * always fail. Thus we always use the same minimum used for the main</div><div class='add'>+     * fop.</div><div class='add'>+     */</div><div class='add'>+    if (lock-&gt;fd == NULL) {</div><div class='add'>+        error = ec_loc_from_loc(fop-&gt;xl, &amp;loc, &amp;lock-&gt;loc);</div><div class='add'>+        if (error != 0) {</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+        if (gf_uuid_is_null(loc.pargfid)) {</div><div class='add'>+            if (loc.parent != NULL) {</div><div class='add'>+                inode_unref(loc.parent);</div><div class='add'>+                loc.parent = NULL;</div><div class='add'>+            }</div><div class='add'>+            GF_FREE((char *)loc.path);</div><div class='add'>+            loc.path = NULL;</div><div class='add'>+            loc.name = NULL;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        ec_xattrop(fop-&gt;frame, fop-&gt;xl, fop-&gt;mask, fop-&gt;minimum,</div><div class='add'>+                   ec_prepare_update_cbk, link, &amp;loc, GF_XATTROP_ADD_ARRAY64,</div><div class='add'>+                   dict, xdata);</div><div class='add'>+    } else {</div><div class='add'>+        ec_fxattrop(fop-&gt;frame, fop-&gt;xl, fop-&gt;mask, fop-&gt;minimum,</div><div class='add'>+                    ec_prepare_update_cbk, link, lock-&gt;fd,</div><div class='add'>+                    GF_XATTROP_ADD_ARRAY64, dict, xdata);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    error = 0;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    fop-&gt;frame-&gt;root-&gt;uid = fop-&gt;uid;</div><div class='add'>+    fop-&gt;frame-&gt;root-&gt;gid = fop-&gt;gid;</div><div class='add'>+</div><div class='add'>+    loc_wipe(&amp;loc);</div><div class='add'>+</div><div class='add'>+    if (dict != NULL) {</div><div class='add'>+        dict_unref(dict);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (xdata != NULL) {</div><div class='add'>+        dict_unref(xdata);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (error != 0) {</div><div class='add'>+        ec_fop_set_error(fop, -error);</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+gf_boolean_t</div><div class='add'>+__ec_get_inode_size(ec_fop_data_t *fop, inode_t *inode, uint64_t *size)</div><div class='add'>+{</div><div class='add'>+    ec_inode_t *ctx;</div><div class='add'>+    gf_boolean_t found = _gf_false;</div><div class='add'>+</div><div class='add'>+    ctx = __ec_inode_get(inode, fop-&gt;xl);</div><div class='add'>+    if (ctx == NULL) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (ctx-&gt;have_size) {</div><div class='add'>+        *size = ctx-&gt;post_size;</div><div class='add'>+        found = _gf_true;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return found;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+gf_boolean_t</div><div class='add'>+ec_get_inode_size(ec_fop_data_t *fop, inode_t *inode, uint64_t *size)</div><div class='add'>+{</div><div class='add'>+    gf_boolean_t found = _gf_false;</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;inode-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        found = __ec_get_inode_size(fop, inode, size);</div><div class='add'>+    }</div><div class='add'>+    UNLOCK(&amp;inode-&gt;lock);</div><div class='add'>+</div><div class='add'>+    return found;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+gf_boolean_t</div><div class='add'>+__ec_set_inode_size(ec_fop_data_t *fop, inode_t *inode, uint64_t size)</div><div class='add'>+{</div><div class='add'>+    ec_inode_t *ctx;</div><div class='add'>+    gf_boolean_t found = _gf_false;</div><div class='add'>+</div><div class='add'>+    ctx = __ec_inode_get(inode, fop-&gt;xl);</div><div class='add'>+    if (ctx == NULL) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Normal fops always have ctx-&gt;have_size set. However self-heal calls this</div><div class='add'>+     * to prepare the inode, so ctx-&gt;have_size will be false. In this case we</div><div class='add'>+     * prepare both pre_size and post_size, and set have_size and have_info to</div><div class='add'>+     * true. */</div><div class='add'>+    if (!ctx-&gt;have_size) {</div><div class='add'>+        ctx-&gt;pre_size = size;</div><div class='add'>+        ctx-&gt;have_size = ctx-&gt;have_info = _gf_true;</div><div class='add'>+    }</div><div class='add'>+    ctx-&gt;post_size = size;</div><div class='add'>+</div><div class='add'>+    found = _gf_true;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return found;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+gf_boolean_t</div><div class='add'>+ec_set_inode_size(ec_fop_data_t *fop, inode_t *inode, uint64_t size)</div><div class='add'>+{</div><div class='add'>+    gf_boolean_t found = _gf_false;</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;inode-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        found = __ec_set_inode_size(fop, inode, size);</div><div class='add'>+    }</div><div class='add'>+    UNLOCK(&amp;inode-&gt;lock);</div><div class='add'>+</div><div class='add'>+    return found;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+ec_release_stripe_cache(ec_inode_t *ctx)</div><div class='add'>+{</div><div class='add'>+    ec_stripe_list_t *stripe_cache = NULL;</div><div class='add'>+    ec_stripe_t *stripe = NULL;</div><div class='add'>+</div><div class='add'>+    stripe_cache = &amp;ctx-&gt;stripe_cache;</div><div class='add'>+    while (!list_empty(&amp;stripe_cache-&gt;lru)) {</div><div class='add'>+        stripe = list_first_entry(&amp;stripe_cache-&gt;lru, ec_stripe_t, lru);</div><div class='add'>+        list_del(&amp;stripe-&gt;lru);</div><div class='add'>+        GF_FREE(stripe);</div><div class='add'>+    }</div><div class='add'>+    stripe_cache-&gt;count = 0;</div><div class='add'>+    stripe_cache-&gt;max = 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_clear_inode_info(ec_fop_data_t *fop, inode_t *inode)</div><div class='add'>+{</div><div class='add'>+    ec_inode_t *ctx;</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;inode-&gt;lock);</div><div class='add'>+</div><div class='add'>+    ctx = __ec_inode_get(inode, fop-&gt;xl);</div><div class='add'>+    if (ctx == NULL) {</div><div class='add'>+        goto unlock;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ec_release_stripe_cache(ctx);</div><div class='add'>+    ctx-&gt;have_info = _gf_false;</div><div class='add'>+    ctx-&gt;have_config = _gf_false;</div><div class='add'>+    ctx-&gt;have_version = _gf_false;</div><div class='add'>+    ctx-&gt;have_size = _gf_false;</div><div class='add'>+</div><div class='add'>+    memset(&amp;ctx-&gt;config, 0, sizeof(ctx-&gt;config));</div><div class='add'>+    memset(ctx-&gt;pre_version, 0, sizeof(ctx-&gt;pre_version));</div><div class='add'>+    memset(ctx-&gt;post_version, 0, sizeof(ctx-&gt;post_version));</div><div class='add'>+    ctx-&gt;pre_size = ctx-&gt;post_size = 0;</div><div class='add'>+    memset(ctx-&gt;dirty, 0, sizeof(ctx-&gt;dirty));</div><div class='add'>+</div><div class='add'>+unlock:</div><div class='add'>+    UNLOCK(&amp;inode-&gt;lock);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_get_real_size_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                     int32_t op_ret, int32_t op_errno, inode_t *inode,</div><div class='add'>+                     struct iatt *buf, dict_t *xdata, struct iatt *postparent)</div><div class='add'>+{</div><div class='add'>+    ec_fop_data_t *fop = cookie;</div><div class='add'>+    ec_lock_link_t *link;</div><div class='add'>+</div><div class='add'>+    if (op_ret &gt;= 0) {</div><div class='add'>+        link = fop-&gt;data;</div><div class='add'>+        link-&gt;size = buf-&gt;ia_size;</div><div class='add'>+    } else {</div><div class='add'>+        /* Prevent failure of parent fop. */</div><div class='add'>+        fop-&gt;error = 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* This function is used to get the trusted.ec.size xattr from a file when</div><div class='add'>+ * no lock is needed on the inode. This is only required to maintain iatt</div><div class='add'>+ * structs on fops that manipulate directory entries but do not operate</div><div class='add'>+ * directly on the inode, like link, rename, ...</div><div class='add'>+ *</div><div class='add'>+ * Any error processing this request is ignored. In the worst case, an invalid</div><div class='add'>+ * or not up to date value in the iatt could cause some cache invalidation.</div><div class='add'>+ */</div><div class='add'>+void</div><div class='add'>+ec_get_real_size(ec_lock_link_t *link)</div><div class='add'>+{</div><div class='add'>+    ec_fop_data_t *fop;</div><div class='add'>+    dict_t *xdata;</div><div class='add'>+</div><div class='add'>+    if (link-&gt;base == NULL || link-&gt;base-&gt;inode == NULL) {</div><div class='add'>+        return;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (link-&gt;base-&gt;inode-&gt;ia_type != IA_IFREG) {</div><div class='add'>+        return;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    fop = link-&gt;fop;</div><div class='add'>+</div><div class='add'>+    if (ec_get_inode_size(fop, link-&gt;base-&gt;inode, &amp;link-&gt;size)) {</div><div class='add'>+        return;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    xdata = dict_new();</div><div class='add'>+    if (xdata == NULL) {</div><div class='add'>+        return;</div><div class='add'>+    }</div><div class='add'>+    if (ec_dict_set_number(xdata, EC_XATTR_SIZE, 0) != 0) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Send a simple lookup. A single answer is considered ok since this value</div><div class='add'>+     * is only used to return an iatt struct related to an inode that is not</div><div class='add'>+     * locked and have not suffered any operation. */</div><div class='add'>+    ec_lookup(fop-&gt;frame, fop-&gt;xl, fop-&gt;mask, 1, ec_get_real_size_cbk, link,</div><div class='add'>+              link-&gt;base, xdata);</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (xdata != NULL) {</div><div class='add'>+        dict_unref(xdata);</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+ec_lock_update_fd(ec_lock_t *lock, ec_fop_data_t *fop)</div><div class='add'>+{</div><div class='add'>+    /* If the fop has an fd available, attach it to the lock structure to be</div><div class='add'>+     * able to do fxattrop calls instead of xattrop. */</div><div class='add'>+    if (fop-&gt;use_fd &amp;&amp; (lock-&gt;fd == NULL)) {</div><div class='add'>+        lock-&gt;fd = __fd_ref(fop-&gt;fd);</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static gf_boolean_t</div><div class='add'>+ec_link_has_lock_conflict(ec_lock_link_t *link, gf_boolean_t waitlist_check)</div><div class='add'>+{</div><div class='add'>+    ec_lock_link_t *trav_link = NULL;</div><div class='add'>+</div><div class='add'>+    list_for_each_entry(trav_link, &amp;link-&gt;lock-&gt;owners, owner_list)</div><div class='add'>+    {</div><div class='add'>+        if (ec_lock_conflict(trav_link, link))</div><div class='add'>+            return _gf_true;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (!waitlist_check)</div><div class='add'>+        return _gf_false;</div><div class='add'>+</div><div class='add'>+    list_for_each_entry(trav_link, &amp;link-&gt;lock-&gt;waiting, wait_list)</div><div class='add'>+    {</div><div class='add'>+        if (ec_lock_conflict(trav_link, link))</div><div class='add'>+            return _gf_true;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return _gf_false;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+ec_lock_wake_shared(ec_lock_t *lock, struct list_head *list)</div><div class='add'>+{</div><div class='add'>+    ec_fop_data_t *fop;</div><div class='add'>+    ec_lock_link_t *link;</div><div class='add'>+    gf_boolean_t conflict = _gf_false;</div><div class='add'>+</div><div class='add'>+    while (!conflict &amp;&amp; !list_empty(&amp;lock-&gt;waiting)) {</div><div class='add'>+        link = list_entry(lock-&gt;waiting.next, ec_lock_link_t, wait_list);</div><div class='add'>+        fop = link-&gt;fop;</div><div class='add'>+</div><div class='add'>+        /* If lock is not acquired, at most one fop can be assigned as owner.</div><div class='add'>+         * The following fops will need to wait in the lock-&gt;waiting queue</div><div class='add'>+         * until the lock has been fully acquired. */</div><div class='add'>+        conflict = !lock-&gt;acquired;</div><div class='add'>+</div><div class='add'>+        /* If the fop is not shareable, only this fop can be assigned as owner.</div><div class='add'>+         * Other fops will need to wait until this one finishes. */</div><div class='add'>+        if (ec_link_has_lock_conflict(link, _gf_false)) {</div><div class='add'>+            conflict = _gf_true;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        /* If only one fop is allowed, it can be assigned as the owner of the</div><div class='add'>+         * lock only if there weren't any other owner. */</div><div class='add'>+        if (conflict &amp;&amp; !list_empty(&amp;lock-&gt;owners)) {</div><div class='add'>+            break;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        list_move_tail(&amp;link-&gt;wait_list, list);</div><div class='add'>+</div><div class='add'>+        list_add_tail(&amp;link-&gt;owner_list, &amp;lock-&gt;owners);</div><div class='add'>+        lock-&gt;refs_owners++;</div><div class='add'>+</div><div class='add'>+        ec_lock_update_fd(lock, fop);</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+ec_lock_apply(ec_lock_link_t *link)</div><div class='add'>+{</div><div class='add'>+    ec_fop_data_t *fop = link-&gt;fop;</div><div class='add'>+</div><div class='add'>+    fop-&gt;mask &amp;= link-&gt;lock-&gt;good_mask;</div><div class='add'>+    fop-&gt;locked++;</div><div class='add'>+</div><div class='add'>+    ec_get_size_version(link);</div><div class='add'>+    ec_get_real_size(link);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+gf_boolean_t</div><div class='add'>+ec_lock_acquire(ec_lock_link_t *link);</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+ec_lock_resume_shared(struct list_head *list)</div><div class='add'>+{</div><div class='add'>+    ec_lock_link_t *link;</div><div class='add'>+</div><div class='add'>+    while (!list_empty(list)) {</div><div class='add'>+        link = list_entry(list-&gt;next, ec_lock_link_t, wait_list);</div><div class='add'>+        list_del_init(&amp;link-&gt;wait_list);</div><div class='add'>+</div><div class='add'>+        if (link-&gt;lock-&gt;acquired) {</div><div class='add'>+            ec_lock_apply(link);</div><div class='add'>+            ec_lock(link-&gt;fop);</div><div class='add'>+        } else {</div><div class='add'>+            GF_ASSERT(list_empty(list));</div><div class='add'>+</div><div class='add'>+            ec_lock_acquire(link);</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        ec_resume(link-&gt;fop, 0);</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_lock_acquired(ec_lock_link_t *link)</div><div class='add'>+{</div><div class='add'>+    struct list_head list;</div><div class='add'>+    ec_lock_t *lock;</div><div class='add'>+    ec_fop_data_t *fop;</div><div class='add'>+</div><div class='add'>+    lock = link-&gt;lock;</div><div class='add'>+    fop = link-&gt;fop;</div><div class='add'>+</div><div class='add'>+    ec_trace("LOCKED", fop, "lock=%p", lock);</div><div class='add'>+</div><div class='add'>+    INIT_LIST_HEAD(&amp;list);</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;lock-&gt;loc.inode-&gt;lock);</div><div class='add'>+</div><div class='add'>+    lock-&gt;acquired = _gf_true;</div><div class='add'>+    if (lock-&gt;contention) {</div><div class='add'>+        lock-&gt;release = _gf_true;</div><div class='add'>+        lock-&gt;contention = _gf_false;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ec_lock_update_fd(lock, fop);</div><div class='add'>+    ec_lock_wake_shared(lock, &amp;list);</div><div class='add'>+</div><div class='add'>+    UNLOCK(&amp;lock-&gt;loc.inode-&gt;lock);</div><div class='add'>+</div><div class='add'>+    ec_lock_apply(link);</div><div class='add'>+</div><div class='add'>+    if (fop-&gt;use_fd &amp;&amp;</div><div class='add'>+        (link-&gt;update[EC_DATA_TXN] || link-&gt;update[EC_METADATA_TXN])) {</div><div class='add'>+        /* Try to reopen closed fd's only if lock has succeeded. */</div><div class='add'>+        ec_fix_open(fop, lock-&gt;mask);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ec_lock_resume_shared(&amp;list);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_locked(call_frame_t *frame, void *cookie, xlator_t *this, int32_t op_ret,</div><div class='add'>+          int32_t op_errno, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    ec_fop_data_t *fop = cookie;</div><div class='add'>+    ec_lock_link_t *link = NULL;</div><div class='add'>+    ec_lock_t *lock = NULL;</div><div class='add'>+</div><div class='add'>+    link = fop-&gt;data;</div><div class='add'>+    lock = link-&gt;lock;</div><div class='add'>+    if (op_ret &gt;= 0) {</div><div class='add'>+        lock-&gt;mask = lock-&gt;good_mask = fop-&gt;good;</div><div class='add'>+        lock-&gt;healing = 0;</div><div class='add'>+</div><div class='add'>+        ec_lock_acquired(link);</div><div class='add'>+        ec_lock(fop-&gt;parent);</div><div class='add'>+    } else {</div><div class='add'>+        LOCK(&amp;lock-&gt;loc.inode-&gt;lock);</div><div class='add'>+        {</div><div class='add'>+            lock-&gt;contention = _gf_false;</div><div class='add'>+        }</div><div class='add'>+        UNLOCK(&amp;lock-&gt;loc.inode-&gt;lock);</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_WARNING, op_errno, EC_MSG_PREOP_LOCK_FAILED,</div><div class='add'>+               "Failed to complete preop lock");</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+gf_boolean_t</div><div class='add'>+ec_lock_acquire(ec_lock_link_t *link)</div><div class='add'>+{</div><div class='add'>+    ec_lock_t *lock;</div><div class='add'>+    ec_fop_data_t *fop;</div><div class='add'>+    gf_lkowner_t lk_owner;</div><div class='add'>+</div><div class='add'>+    lock = link-&gt;lock;</div><div class='add'>+    fop = link-&gt;fop;</div><div class='add'>+</div><div class='add'>+    if (!lock-&gt;acquired) {</div><div class='add'>+        set_lk_owner_from_ptr(&amp;lk_owner, lock);</div><div class='add'>+</div><div class='add'>+        ec_trace("LOCK_ACQUIRE", fop, "lock=%p, inode=%p", lock,</div><div class='add'>+                 lock-&gt;loc.inode);</div><div class='add'>+</div><div class='add'>+        lock-&gt;flock.l_type = F_WRLCK;</div><div class='add'>+        ec_inodelk(fop-&gt;frame, fop-&gt;xl, &amp;lk_owner, -1, EC_MINIMUM_ALL,</div><div class='add'>+                   ec_locked, link, fop-&gt;xl-&gt;name, &amp;lock-&gt;loc, F_SETLKW,</div><div class='add'>+                   &amp;lock-&gt;flock, NULL);</div><div class='add'>+</div><div class='add'>+        return _gf_false;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ec_trace("LOCK_REUSE", fop, "lock=%p", lock);</div><div class='add'>+</div><div class='add'>+    ec_lock_acquired(link);</div><div class='add'>+</div><div class='add'>+    return _gf_true;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static ec_lock_link_t *</div><div class='add'>+ec_lock_timer_cancel(xlator_t *xl, ec_lock_t *lock)</div><div class='add'>+{</div><div class='add'>+    ec_lock_link_t *timer_link;</div><div class='add'>+</div><div class='add'>+    /* If we don't have any timer, there's nothing to cancel. */</div><div class='add'>+    if (lock-&gt;timer == NULL) {</div><div class='add'>+        return NULL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* We are trying to access a lock that has an unlock timer active.</div><div class='add'>+     * This means that the lock must be idle, i.e. no fop can be in the</div><div class='add'>+     * owner, waiting or frozen lists. It also means that the lock cannot</div><div class='add'>+     * have been marked as being released (this is done without timers).</div><div class='add'>+     * There should only be one owner reference, but it's possible that</div><div class='add'>+     * some fops are being prepared to use this lock. */</div><div class='add'>+    GF_ASSERT((lock-&gt;refs_owners == 1) &amp;&amp; list_empty(&amp;lock-&gt;owners) &amp;&amp;</div><div class='add'>+              list_empty(&amp;lock-&gt;waiting));</div><div class='add'>+</div><div class='add'>+    /* We take the timer_link before cancelling the timer, since a</div><div class='add'>+     * successful cancellation will destroy it. It must not be NULL</div><div class='add'>+     * because it references the fop responsible for the delayed unlock</div><div class='add'>+     * that we are currently trying to cancel. */</div><div class='add'>+    timer_link = lock-&gt;timer-&gt;data;</div><div class='add'>+    GF_ASSERT(timer_link != NULL);</div><div class='add'>+</div><div class='add'>+    if (gf_timer_call_cancel(xl-&gt;ctx, lock-&gt;timer) &lt; 0) {</div><div class='add'>+        /* It's too late to avoid the execution of the timer callback.</div><div class='add'>+         * Since we need to be sure that the callback has access to all</div><div class='add'>+         * needed resources, we cannot resume the execution of the</div><div class='add'>+         * timer fop now. This will be done in the callback. */</div><div class='add'>+        timer_link = NULL;</div><div class='add'>+    } else {</div><div class='add'>+        /* The timer has been cancelled. The fop referenced by</div><div class='add'>+         * timer_link holds the last reference. The caller is</div><div class='add'>+         * responsible to release it when not needed anymore. */</div><div class='add'>+        ec_trace("UNLOCK_CANCELLED", timer_link-&gt;fop, "lock=%p", lock);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* We have two options here:</div><div class='add'>+     *</div><div class='add'>+     * 1. The timer has been successfully cancelled.</div><div class='add'>+     *</div><div class='add'>+     *    This is the easiest case and we can continue with the currently</div><div class='add'>+     *    acquired lock.</div><div class='add'>+     *</div><div class='add'>+     * 2. The timer callback has already been fired.</div><div class='add'>+     *</div><div class='add'>+     *    In this case we have not been able to cancel the timer before</div><div class='add'>+     *    the timer callback has been fired, but we also know that</div><div class='add'>+     *    lock-&gt;timer != NULL. This means that the timer callback is still</div><div class='add'>+     *    trying to acquire the inode mutex that we currently own. We are</div><div class='add'>+     *    safe until we release it. In this case we can safely clear</div><div class='add'>+     *    lock-&gt;timer. This will cause that the timer callback does nothing</div><div class='add'>+     *    once it acquires the mutex.</div><div class='add'>+     */</div><div class='add'>+    lock-&gt;timer = NULL;</div><div class='add'>+</div><div class='add'>+    return timer_link;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static gf_boolean_t</div><div class='add'>+ec_lock_assign_owner(ec_lock_link_t *link)</div><div class='add'>+{</div><div class='add'>+    ec_fop_data_t *fop;</div><div class='add'>+    ec_lock_t *lock;</div><div class='add'>+    ec_lock_link_t *timer_link = NULL;</div><div class='add'>+    gf_boolean_t assigned = _gf_false;</div><div class='add'>+</div><div class='add'>+    /* The link cannot be in any list because we have just finished preparing</div><div class='add'>+     * it. */</div><div class='add'>+    GF_ASSERT(list_empty(&amp;link-&gt;wait_list));</div><div class='add'>+</div><div class='add'>+    fop = link-&gt;fop;</div><div class='add'>+    lock = link-&gt;lock;</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;lock-&gt;loc.inode-&gt;lock);</div><div class='add'>+</div><div class='add'>+    /* Since the link has just been prepared but it's not active yet, the</div><div class='add'>+     * refs_pending must be one at least (the ref owned by this link). */</div><div class='add'>+    GF_ASSERT(lock-&gt;refs_pending &gt; 0);</div><div class='add'>+    /* The link is not pending any more. It will be assigned to the owner,</div><div class='add'>+     * waiting or frozen list. */</div><div class='add'>+    lock-&gt;refs_pending--;</div><div class='add'>+</div><div class='add'>+    if (lock-&gt;release) {</div><div class='add'>+        ec_trace("LOCK_QUEUE_FREEZE", fop, "lock=%p", lock);</div><div class='add'>+</div><div class='add'>+        /* When lock-&gt;release is set, we'll unlock the lock as soon as</div><div class='add'>+         * possible, meaning that we won't use a timer. */</div><div class='add'>+        GF_ASSERT(lock-&gt;timer == NULL);</div><div class='add'>+</div><div class='add'>+        /* The lock is marked to be released. We can still have owners and fops</div><div class='add'>+         * in the waiting ilist f they have been added before the lock has been</div><div class='add'>+         * marked to be released. However new fops are put into the frozen list</div><div class='add'>+         * to wait for the next unlock/lock cycle. */</div><div class='add'>+        list_add_tail(&amp;link-&gt;wait_list, &amp;lock-&gt;frozen);</div><div class='add'>+</div><div class='add'>+        goto unlock;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* The lock is not marked to be released, so the frozen list should be</div><div class='add'>+     * empty. */</div><div class='add'>+    GF_ASSERT(list_empty(&amp;lock-&gt;frozen));</div><div class='add'>+</div><div class='add'>+    timer_link = ec_lock_timer_cancel(fop-&gt;xl, lock);</div><div class='add'>+</div><div class='add'>+    if (!list_empty(&amp;lock-&gt;owners)) {</div><div class='add'>+        /* There are other owners of this lock. We can only take ownership if</div><div class='add'>+         * the lock is already acquired and doesn't have conflict with existing</div><div class='add'>+         * owners, or waiters(to prevent starvation).</div><div class='add'>+         * Otherwise we need to wait.</div><div class='add'>+         */</div><div class='add'>+        if (!lock-&gt;acquired || ec_link_has_lock_conflict(link, _gf_true)) {</div><div class='add'>+            ec_trace("LOCK_QUEUE_WAIT", fop, "lock=%p", lock);</div><div class='add'>+</div><div class='add'>+            list_add_tail(&amp;link-&gt;wait_list, &amp;lock-&gt;waiting);</div><div class='add'>+</div><div class='add'>+            goto unlock;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    list_add_tail(&amp;link-&gt;owner_list, &amp;lock-&gt;owners);</div><div class='add'>+</div><div class='add'>+    /* If timer_link is not NULL, it means that we have inherited the owner</div><div class='add'>+     * reference assigned to the timer fop. In this case we simply reuse it.</div><div class='add'>+     * Otherwise we need to increase the number of owners. */</div><div class='add'>+    if (timer_link == NULL) {</div><div class='add'>+        lock-&gt;refs_owners++;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    assigned = _gf_true;</div><div class='add'>+</div><div class='add'>+unlock:</div><div class='add'>+    if (!assigned) {</div><div class='add'>+        /* We have not been able to take ownership of this lock. The fop must</div><div class='add'>+         * be put to sleep. */</div><div class='add'>+        ec_sleep(fop);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    UNLOCK(&amp;lock-&gt;loc.inode-&gt;lock);</div><div class='add'>+</div><div class='add'>+    /* If we have cancelled the timer, we need to resume the fop that was</div><div class='add'>+     * waiting for it. */</div><div class='add'>+    if (timer_link != NULL) {</div><div class='add'>+        ec_resume(timer_link-&gt;fop, 0);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return assigned;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+ec_lock_next_owner(ec_lock_link_t *link, ec_cbk_data_t *cbk,</div><div class='add'>+                   gf_boolean_t release)</div><div class='add'>+{</div><div class='add'>+    struct list_head list;</div><div class='add'>+    ec_lock_t *lock = link-&gt;lock;</div><div class='add'>+    ec_fop_data_t *fop = link-&gt;fop;</div><div class='add'>+    ec_inode_t *ctx = lock-&gt;ctx;</div><div class='add'>+</div><div class='add'>+    INIT_LIST_HEAD(&amp;list);</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;lock-&gt;loc.inode-&gt;lock);</div><div class='add'>+</div><div class='add'>+    ec_trace("LOCK_DONE", fop, "lock=%p", lock);</div><div class='add'>+</div><div class='add'>+    /* Current link must belong to the owner list of the lock. We don't</div><div class='add'>+     * decrement lock-&gt;refs_owners here because the inode mutex is released</div><div class='add'>+     * before ec_unlock() is called and we need to know when the last owner</div><div class='add'>+     * unlocks the lock to do proper cleanup. lock-&gt;refs_owners is used for</div><div class='add'>+     * this task. */</div><div class='add'>+    GF_ASSERT((lock-&gt;refs_owners &gt; 0) &amp;&amp; !list_empty(&amp;link-&gt;owner_list));</div><div class='add'>+    list_del_init(&amp;link-&gt;owner_list);</div><div class='add'>+</div><div class='add'>+    lock-&gt;release |= release;</div><div class='add'>+</div><div class='add'>+    if ((fop-&gt;error == 0) &amp;&amp; (cbk != NULL) &amp;&amp; (cbk-&gt;op_ret &gt;= 0)) {</div><div class='add'>+        if (link-&gt;update[0]) {</div><div class='add'>+            ctx-&gt;post_version[0]++;</div><div class='add'>+        }</div><div class='add'>+        if (link-&gt;update[1]) {</div><div class='add'>+            ctx-&gt;post_version[1]++;</div><div class='add'>+        }</div><div class='add'>+        /* If the fop fails on any of the good bricks, it is important to mark</div><div class='add'>+         * it dirty and update versions right away. */</div><div class='add'>+        if (link-&gt;update[0] || link-&gt;update[1]) {</div><div class='add'>+            if (lock-&gt;good_mask &amp; ~(fop-&gt;good | fop-&gt;remaining)) {</div><div class='add'>+                lock-&gt;release = _gf_true;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (fop-&gt;healing) {</div><div class='add'>+        lock-&gt;healing = fop-&gt;healing &amp; (fop-&gt;good | fop-&gt;remaining);</div><div class='add'>+    }</div><div class='add'>+    ec_lock_update_good(lock, fop);</div><div class='add'>+</div><div class='add'>+    ec_lock_wake_shared(lock, &amp;list);</div><div class='add'>+</div><div class='add'>+    UNLOCK(&amp;lock-&gt;loc.inode-&gt;lock);</div><div class='add'>+</div><div class='add'>+    ec_lock_resume_shared(&amp;list);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_lock(ec_fop_data_t *fop)</div><div class='add'>+{</div><div class='add'>+    ec_lock_link_t *link;</div><div class='add'>+</div><div class='add'>+    /* There is a chance that ec_resume is called on fop even before ec_sleep.</div><div class='add'>+     * Which can result in refs == 0 for fop leading to use after free in this</div><div class='add'>+     * function when it calls ec_sleep so do ec_sleep at start and ec_resume at</div><div class='add'>+     * the end of this function.*/</div><div class='add'>+    ec_sleep(fop);</div><div class='add'>+</div><div class='add'>+    while (fop-&gt;locked &lt; fop-&gt;lock_count) {</div><div class='add'>+        /* Since there are only up to 2 locks per fop, this xor will change</div><div class='add'>+         * the order of the locks if fop-&gt;first_lock is 1. */</div><div class='add'>+        link = &amp;fop-&gt;locks[fop-&gt;locked ^ fop-&gt;first_lock];</div><div class='add'>+</div><div class='add'>+        if (!ec_lock_assign_owner(link) || !ec_lock_acquire(link)) {</div><div class='add'>+            break;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ec_resume(fop, 0);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_lock_unfreeze(ec_lock_link_t *link)</div><div class='add'>+{</div><div class='add'>+    struct list_head list;</div><div class='add'>+    ec_lock_t *lock;</div><div class='add'>+    gf_boolean_t destroy = _gf_false;</div><div class='add'>+</div><div class='add'>+    lock = link-&gt;lock;</div><div class='add'>+</div><div class='add'>+    INIT_LIST_HEAD(&amp;list);</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;lock-&gt;loc.inode-&gt;lock);</div><div class='add'>+</div><div class='add'>+    /* The lock must be marked to be released here, since we have just released</div><div class='add'>+     * it and any attempt to assign it to more fops must have added them to the</div><div class='add'>+     * frozen list. We can only have one active reference here: the one that</div><div class='add'>+     * is processing this unfreeze. */</div><div class='add'>+    GF_ASSERT(lock-&gt;release &amp;&amp; (lock-&gt;refs_owners == 1));</div><div class='add'>+    lock-&gt;release = _gf_false;</div><div class='add'>+    lock-&gt;refs_owners = 0;</div><div class='add'>+</div><div class='add'>+    lock-&gt;acquired = _gf_false;</div><div class='add'>+</div><div class='add'>+    /* We are unfreezing a lock. This means that the lock has already been</div><div class='add'>+     * released. In this state it shouldn't have a pending timer nor have any</div><div class='add'>+     * owner, and the waiting list should be empty. Only the frozen list can</div><div class='add'>+     * contain some fop. */</div><div class='add'>+    GF_ASSERT((lock-&gt;timer == NULL) &amp;&amp; list_empty(&amp;lock-&gt;waiting) &amp;&amp;</div><div class='add'>+              list_empty(&amp;lock-&gt;owners));</div><div class='add'>+</div><div class='add'>+    /* We move all frozen fops to the waiting list. */</div><div class='add'>+    list_splice_init(&amp;lock-&gt;frozen, &amp;lock-&gt;waiting);</div><div class='add'>+</div><div class='add'>+    /* If we don't have any fop waiting nor there are any prepared fops using</div><div class='add'>+     * this lock, we can finally dispose it. */</div><div class='add'>+    destroy = list_empty(&amp;lock-&gt;waiting) &amp;&amp; (lock-&gt;refs_pending == 0);</div><div class='add'>+    if (destroy) {</div><div class='add'>+        ec_trace("LOCK_DESTROY", link-&gt;fop, "lock=%p", lock);</div><div class='add'>+</div><div class='add'>+        lock-&gt;ctx-&gt;inode_lock = NULL;</div><div class='add'>+    } else {</div><div class='add'>+        ec_trace("LOCK_UNFREEZE", link-&gt;fop, "lock=%p", lock);</div><div class='add'>+</div><div class='add'>+        ec_lock_wake_shared(lock, &amp;list);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    UNLOCK(&amp;lock-&gt;loc.inode-&gt;lock);</div><div class='add'>+</div><div class='add'>+    ec_lock_resume_shared(&amp;list);</div><div class='add'>+</div><div class='add'>+    if (destroy) {</div><div class='add'>+        ec_lock_destroy(lock);</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_unlocked(call_frame_t *frame, void *cookie, xlator_t *this, int32_t op_ret,</div><div class='add'>+            int32_t op_errno, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    ec_fop_data_t *fop = cookie;</div><div class='add'>+    ec_lock_link_t *link = fop-&gt;data;</div><div class='add'>+</div><div class='add'>+    if (op_ret &lt; 0) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_WARNING, op_errno, EC_MSG_UNLOCK_FAILED,</div><div class='add'>+               "entry/inode unlocking failed :(%s)", ec_msg_str(link-&gt;fop));</div><div class='add'>+    } else {</div><div class='add'>+        ec_trace("UNLOCKED", link-&gt;fop, "lock=%p", link-&gt;lock);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ec_lock_unfreeze(link);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_unlock_lock(ec_lock_link_t *link)</div><div class='add'>+{</div><div class='add'>+    ec_lock_t *lock;</div><div class='add'>+    ec_fop_data_t *fop;</div><div class='add'>+    gf_lkowner_t lk_owner;</div><div class='add'>+</div><div class='add'>+    lock = link-&gt;lock;</div><div class='add'>+    fop = link-&gt;fop;</div><div class='add'>+</div><div class='add'>+    lock-&gt;unlock_now = _gf_false;</div><div class='add'>+    ec_clear_inode_info(fop, lock-&gt;loc.inode);</div><div class='add'>+</div><div class='add'>+    if ((lock-&gt;mask != 0) &amp;&amp; lock-&gt;acquired) {</div><div class='add'>+        set_lk_owner_from_ptr(&amp;lk_owner, lock);</div><div class='add'>+        lock-&gt;flock.l_type = F_UNLCK;</div><div class='add'>+        ec_trace("UNLOCK_INODELK", fop, "lock=%p, inode=%p", lock,</div><div class='add'>+                 lock-&gt;loc.inode);</div><div class='add'>+</div><div class='add'>+        ec_inodelk(fop-&gt;frame, fop-&gt;xl, &amp;lk_owner, lock-&gt;mask, EC_MINIMUM_ONE,</div><div class='add'>+                   ec_unlocked, link, fop-&gt;xl-&gt;name, &amp;lock-&gt;loc, F_SETLK,</div><div class='add'>+                   &amp;lock-&gt;flock, NULL);</div><div class='add'>+    } else {</div><div class='add'>+        ec_lock_unfreeze(link);</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_inode_bad_inc(inode_t *inode, xlator_t *xl)</div><div class='add'>+{</div><div class='add'>+    ec_inode_t *ctx = NULL;</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;inode-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        ctx = __ec_inode_get(inode, xl);</div><div class='add'>+        if (ctx == NULL) {</div><div class='add'>+            goto unlock;</div><div class='add'>+        }</div><div class='add'>+        ctx-&gt;bad_version++;</div><div class='add'>+    }</div><div class='add'>+unlock:</div><div class='add'>+    UNLOCK(&amp;inode-&gt;lock);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_update_size_version_done(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                            int32_t op_ret, int32_t op_errno, dict_t *xattr,</div><div class='add'>+                            dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    ec_fop_data_t *fop = cookie;</div><div class='add'>+    ec_lock_link_t *link;</div><div class='add'>+    ec_lock_t *lock;</div><div class='add'>+    ec_inode_t *ctx;</div><div class='add'>+</div><div class='add'>+    link = fop-&gt;data;</div><div class='add'>+    lock = link-&gt;lock;</div><div class='add'>+    ctx = lock-&gt;ctx;</div><div class='add'>+</div><div class='add'>+    if (op_ret &lt; 0) {</div><div class='add'>+        if (link-&gt;lock-&gt;fd == NULL) {</div><div class='add'>+            ec_inode_bad_inc(link-&gt;lock-&gt;loc.inode, this);</div><div class='add'>+        } else {</div><div class='add'>+            ec_inode_bad_inc(link-&gt;lock-&gt;fd-&gt;inode, this);</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        gf_msg(fop-&gt;xl-&gt;name, fop_log_level(fop-&gt;id, op_errno), op_errno,</div><div class='add'>+               EC_MSG_SIZE_VERS_UPDATE_FAIL,</div><div class='add'>+               "Failed to update version and size. %s", ec_msg_str(fop));</div><div class='add'>+    } else {</div><div class='add'>+        fop-&gt;parent-&gt;good &amp;= fop-&gt;good;</div><div class='add'>+</div><div class='add'>+        ec_lock_update_good(lock, fop);</div><div class='add'>+</div><div class='add'>+        if (ec_dict_del_array(xattr, EC_XATTR_VERSION, ctx-&gt;post_version,</div><div class='add'>+                              EC_VERSION_SIZE) == 0) {</div><div class='add'>+            ctx-&gt;pre_version[0] = ctx-&gt;post_version[0];</div><div class='add'>+            ctx-&gt;pre_version[1] = ctx-&gt;post_version[1];</div><div class='add'>+</div><div class='add'>+            ctx-&gt;have_version = _gf_true;</div><div class='add'>+        }</div><div class='add'>+        if (ec_dict_del_number(xattr, EC_XATTR_SIZE, &amp;ctx-&gt;post_size) == 0) {</div><div class='add'>+            ctx-&gt;pre_size = ctx-&gt;post_size;</div><div class='add'>+</div><div class='add'>+            ctx-&gt;have_size = _gf_true;</div><div class='add'>+        }</div><div class='add'>+        if ((ec_dict_del_config(xdata, EC_XATTR_CONFIG, &amp;ctx-&gt;config) == 0) &amp;&amp;</div><div class='add'>+            ec_config_check(fop-&gt;xl, &amp;ctx-&gt;config)) {</div><div class='add'>+            ctx-&gt;have_config = _gf_true;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        ctx-&gt;have_info = _gf_true;</div><div class='add'>+    }</div><div class='add'>+    /* If we are here because of fop's and other than unlock request,</div><div class='add'>+     * that means we are still holding a lock. That make sure</div><div class='add'>+     * lock-&gt;unlock_now can not be modified.</div><div class='add'>+     */</div><div class='add'>+    if (lock-&gt;unlock_now) {</div><div class='add'>+        ec_unlock_lock(fop-&gt;data);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_update_size_version(ec_lock_link_t *link, uint64_t *version, uint64_t size,</div><div class='add'>+                       uint64_t *dirty)</div><div class='add'>+{</div><div class='add'>+    ec_fop_data_t *fop;</div><div class='add'>+    ec_lock_t *lock;</div><div class='add'>+    ec_inode_t *ctx;</div><div class='add'>+    dict_t *dict = NULL;</div><div class='add'>+    uintptr_t update_on = 0;</div><div class='add'>+    int32_t err = -ENOMEM;</div><div class='add'>+</div><div class='add'>+    fop = link-&gt;fop;</div><div class='add'>+    lock = link-&gt;lock;</div><div class='add'>+    ctx = lock-&gt;ctx;</div><div class='add'>+</div><div class='add'>+    ec_trace("UPDATE", fop, "version=%ld/%ld, size=%ld, dirty=%ld/%ld",</div><div class='add'>+             version[0], version[1], size, dirty[0], dirty[1]);</div><div class='add'>+</div><div class='add'>+    dict = dict_new();</div><div class='add'>+    if (dict == NULL) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* If we don't have version information or it has been modified, we</div><div class='add'>+     * update it. */</div><div class='add'>+    if (!ctx-&gt;have_version || (version[0] != 0) || (version[1] != 0)) {</div><div class='add'>+        err = ec_dict_set_array(dict, EC_XATTR_VERSION, version,</div><div class='add'>+                                EC_VERSION_SIZE);</div><div class='add'>+        if (err != 0) {</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (size != 0) {</div><div class='add'>+        /* If size has been changed, we should already</div><div class='add'>+         * know the previous size of the file. */</div><div class='add'>+        GF_ASSERT(ctx-&gt;have_size);</div><div class='add'>+</div><div class='add'>+        err = ec_dict_set_number(dict, EC_XATTR_SIZE, size);</div><div class='add'>+        if (err != 0) {</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (dirty[0] || dirty[1]) {</div><div class='add'>+        err = ec_dict_set_array(dict, EC_XATTR_DIRTY, dirty, EC_VERSION_SIZE);</div><div class='add'>+        if (err != 0) {</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* If config information is not known, we request it now. */</div><div class='add'>+    if ((lock-&gt;loc.inode-&gt;ia_type == IA_IFREG) &amp;&amp; !ctx-&gt;have_config) {</div><div class='add'>+        /* A failure requesting this xattr is ignored because it's not</div><div class='add'>+         * absolutely required right now. */</div><div class='add'>+        (void)ec_dict_set_number(dict, EC_XATTR_CONFIG, 0);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    fop-&gt;frame-&gt;root-&gt;uid = 0;</div><div class='add'>+    fop-&gt;frame-&gt;root-&gt;gid = 0;</div><div class='add'>+</div><div class='add'>+    update_on = lock-&gt;good_mask | lock-&gt;healing;</div><div class='add'>+</div><div class='add'>+    if (link-&gt;lock-&gt;fd == NULL) {</div><div class='add'>+        ec_xattrop(fop-&gt;frame, fop-&gt;xl, update_on, EC_MINIMUM_MIN,</div><div class='add'>+                   ec_update_size_version_done, link, &amp;link-&gt;lock-&gt;loc,</div><div class='add'>+                   GF_XATTROP_ADD_ARRAY64, dict, NULL);</div><div class='add'>+    } else {</div><div class='add'>+        ec_fxattrop(fop-&gt;frame, fop-&gt;xl, update_on, EC_MINIMUM_MIN,</div><div class='add'>+                    ec_update_size_version_done, link, link-&gt;lock-&gt;fd,</div><div class='add'>+                    GF_XATTROP_ADD_ARRAY64, dict, NULL);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    fop-&gt;frame-&gt;root-&gt;uid = fop-&gt;uid;</div><div class='add'>+    fop-&gt;frame-&gt;root-&gt;gid = fop-&gt;gid;</div><div class='add'>+</div><div class='add'>+    dict_unref(dict);</div><div class='add'>+</div><div class='add'>+    return;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (dict != NULL) {</div><div class='add'>+        dict_unref(dict);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ec_fop_set_error(fop, -err);</div><div class='add'>+</div><div class='add'>+    gf_msg(fop-&gt;xl-&gt;name, GF_LOG_ERROR, -err, EC_MSG_SIZE_VERS_UPDATE_FAIL,</div><div class='add'>+           "Unable to update version and size. %s", ec_msg_str(fop));</div><div class='add'>+</div><div class='add'>+    if (lock-&gt;unlock_now) {</div><div class='add'>+        ec_unlock_lock(fop-&gt;data);</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+gf_boolean_t</div><div class='add'>+ec_update_info(ec_lock_link_t *link)</div><div class='add'>+{</div><div class='add'>+    ec_lock_t *lock;</div><div class='add'>+    ec_inode_t *ctx;</div><div class='add'>+    uint64_t version[2] = {0, 0};</div><div class='add'>+    uint64_t dirty[2] = {0, 0};</div><div class='add'>+    uint64_t size;</div><div class='add'>+    ec_t *ec = NULL;</div><div class='add'>+    uintptr_t mask;</div><div class='add'>+</div><div class='add'>+    lock = link-&gt;lock;</div><div class='add'>+    ctx = lock-&gt;ctx;</div><div class='add'>+    ec = link-&gt;fop-&gt;xl-&gt;private;</div><div class='add'>+</div><div class='add'>+    /* pre_version[*] will be 0 if have_version is false */</div><div class='add'>+    version[EC_DATA_TXN] = ctx-&gt;post_version[EC_DATA_TXN] -</div><div class='add'>+                           ctx-&gt;pre_version[EC_DATA_TXN];</div><div class='add'>+    version[EC_METADATA_TXN] = ctx-&gt;post_version[EC_METADATA_TXN] -</div><div class='add'>+                               ctx-&gt;pre_version[EC_METADATA_TXN];</div><div class='add'>+</div><div class='add'>+    size = ctx-&gt;post_size - ctx-&gt;pre_size;</div><div class='add'>+    /* If we set the dirty flag for update fop, we have to unset it.</div><div class='add'>+     * If fop has failed on some bricks, leave the dirty as marked. */</div><div class='add'>+</div><div class='add'>+    if (lock-&gt;unlock_now) {</div><div class='add'>+        if (version[EC_DATA_TXN]) {</div><div class='add'>+            /*A data fop will have difference in post and pre version</div><div class='add'>+             *and for data fop we send writes on healing bricks also */</div><div class='add'>+            mask = lock-&gt;good_mask | lock-&gt;healing;</div><div class='add'>+        } else {</div><div class='add'>+            mask = lock-&gt;good_mask;</div><div class='add'>+        }</div><div class='add'>+        /* Ensure that nodes are up while doing final</div><div class='add'>+         * metadata update.*/</div><div class='add'>+        if (!(ec-&gt;node_mask &amp; ~(mask)) &amp;&amp; !(ec-&gt;node_mask &amp; ~ec-&gt;xl_up)) {</div><div class='add'>+            if (ctx-&gt;dirty[EC_DATA_TXN] != 0) {</div><div class='add'>+                dirty[EC_DATA_TXN] = -1;</div><div class='add'>+            }</div><div class='add'>+            if (ctx-&gt;dirty[EC_METADATA_TXN] != 0) {</div><div class='add'>+                dirty[EC_METADATA_TXN] = -1;</div><div class='add'>+            }</div><div class='add'>+            /*If everything is fine and we already</div><div class='add'>+             *have version xattr set on entry, there</div><div class='add'>+             *is no need to update version again*/</div><div class='add'>+            if (ctx-&gt;pre_version[EC_DATA_TXN]) {</div><div class='add'>+                version[EC_DATA_TXN] = 0;</div><div class='add'>+            }</div><div class='add'>+            if (ctx-&gt;pre_version[EC_METADATA_TXN]) {</div><div class='add'>+                version[EC_METADATA_TXN] = 0;</div><div class='add'>+            }</div><div class='add'>+        } else {</div><div class='add'>+            link-&gt;optimistic_changelog = _gf_false;</div><div class='add'>+            ec_set_dirty_flag(link, ctx, dirty);</div><div class='add'>+        }</div><div class='add'>+        memset(ctx-&gt;dirty, 0, sizeof(ctx-&gt;dirty));</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if ((version[EC_DATA_TXN] != 0) || (version[EC_METADATA_TXN] != 0) ||</div><div class='add'>+        (dirty[EC_DATA_TXN] != 0) || (dirty[EC_METADATA_TXN] != 0)) {</div><div class='add'>+        ec_update_size_version(link, version, size, dirty);</div><div class='add'>+        return _gf_true;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return _gf_false;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_unlock_now(ec_lock_link_t *link)</div><div class='add'>+{</div><div class='add'>+    ec_lock_t *lock;</div><div class='add'>+    lock = link-&gt;lock;</div><div class='add'>+</div><div class='add'>+    ec_trace("UNLOCK_NOW", link-&gt;fop, "lock=%p", link-&gt;lock);</div><div class='add'>+    /*At this point, lock is not being used by any fop and</div><div class='add'>+     *can not be reused by any fop as it is going to be released.</div><div class='add'>+     *lock-&gt;unlock_now can not be modified at any other place.</div><div class='add'>+     */</div><div class='add'>+    lock-&gt;unlock_now = _gf_true;</div><div class='add'>+</div><div class='add'>+    if (!ec_update_info(link)) {</div><div class='add'>+        ec_unlock_lock(link);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ec_resume(link-&gt;fop, 0);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_lock_release(ec_t *ec, inode_t *inode)</div><div class='add'>+{</div><div class='add'>+    ec_lock_t *lock;</div><div class='add'>+    ec_inode_t *ctx;</div><div class='add'>+    ec_lock_link_t *timer_link = NULL;</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;inode-&gt;lock);</div><div class='add'>+</div><div class='add'>+    ctx = __ec_inode_get(inode, ec-&gt;xl);</div><div class='add'>+    if (ctx == NULL) {</div><div class='add'>+        goto done;</div><div class='add'>+    }</div><div class='add'>+    lock = ctx-&gt;inode_lock;</div><div class='add'>+    if ((lock == NULL) || lock-&gt;release) {</div><div class='add'>+        goto done;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    gf_msg_debug(ec-&gt;xl-&gt;name, 0, "Releasing inode %p due to lock contention",</div><div class='add'>+                 inode);</div><div class='add'>+</div><div class='add'>+    if (!lock-&gt;acquired) {</div><div class='add'>+        /* This happens if some bricks already got the lock while inodelk is in</div><div class='add'>+         * progress.  Set release to true after lock is acquired*/</div><div class='add'>+        lock-&gt;contention = _gf_true;</div><div class='add'>+        goto done;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* The lock is not marked to be released, so the frozen list should be</div><div class='add'>+     * empty. */</div><div class='add'>+    GF_ASSERT(list_empty(&amp;lock-&gt;frozen));</div><div class='add'>+</div><div class='add'>+    timer_link = ec_lock_timer_cancel(ec-&gt;xl, lock);</div><div class='add'>+</div><div class='add'>+    /* We mark the lock to be released as soon as possible. */</div><div class='add'>+    lock-&gt;release = _gf_true;</div><div class='add'>+</div><div class='add'>+done:</div><div class='add'>+    UNLOCK(&amp;inode-&gt;lock);</div><div class='add'>+</div><div class='add'>+    /* If we have cancelled the timer, we need to start the unlock of the</div><div class='add'>+     * inode. If there was a timer but we have been unable to cancel it</div><div class='add'>+     * because it was just triggered, the timer callback will take care</div><div class='add'>+     * of releasing the inode. */</div><div class='add'>+    if (timer_link != NULL) {</div><div class='add'>+        ec_unlock_now(timer_link);</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_unlock_timer_add(ec_lock_link_t *link);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_unlock_timer_del(ec_lock_link_t *link)</div><div class='add'>+{</div><div class='add'>+    ec_lock_t *lock;</div><div class='add'>+    inode_t *inode;</div><div class='add'>+    gf_boolean_t now = _gf_false;</div><div class='add'>+</div><div class='add'>+    /* If we are here, it means that the timer has expired before having</div><div class='add'>+     * been cancelled. This guarantees that 'link' is still valid because</div><div class='add'>+     * the fop that contains it must be pending (if timer cancellation in</div><div class='add'>+     * ec_lock_assign_owner() fails, the fop is left sleeping).</div><div class='add'>+     *</div><div class='add'>+     * At the same time, the fop still has a reference to the lock, so</div><div class='add'>+     * it must also be valid.</div><div class='add'>+     */</div><div class='add'>+    lock = link-&gt;lock;</div><div class='add'>+</div><div class='add'>+    /* 'lock' must have a valid inode since it can only be destroyed</div><div class='add'>+     * when the lock itself is destroyed, but we have a reference to the</div><div class='add'>+     * lock to avoid this.</div><div class='add'>+     */</div><div class='add'>+    inode = lock-&gt;loc.inode;</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;inode-&gt;lock);</div><div class='add'>+</div><div class='add'>+    if (lock-&gt;timer != NULL) {</div><div class='add'>+        ec_trace("UNLOCK_DELAYED", link-&gt;fop, "lock=%p", lock);</div><div class='add'>+</div><div class='add'>+        /* The unlock timer has expired without anyone cancelling it.</div><div class='add'>+         * This means that it shouldn't have any owner, and the waiting</div><div class='add'>+         * and frozen lists should be empty.  It must have only one</div><div class='add'>+         * owner reference, but there can be fops being prepared</div><div class='add'>+         * though.</div><div class='add'>+         * */</div><div class='add'>+        GF_ASSERT(!lock-&gt;release &amp;&amp; (lock-&gt;refs_owners == 1) &amp;&amp;</div><div class='add'>+                  list_empty(&amp;lock-&gt;owners) &amp;&amp; list_empty(&amp;lock-&gt;waiting) &amp;&amp;</div><div class='add'>+                  list_empty(&amp;lock-&gt;frozen));</div><div class='add'>+</div><div class='add'>+        gf_timer_call_cancel(link-&gt;fop-&gt;xl-&gt;ctx, lock-&gt;timer);</div><div class='add'>+        lock-&gt;timer = NULL;</div><div class='add'>+</div><div class='add'>+        /* Any fop being processed from now on, will need to wait</div><div class='add'>+         * until the next unlock/lock cycle. */</div><div class='add'>+        lock-&gt;release = now = _gf_true;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    UNLOCK(&amp;inode-&gt;lock);</div><div class='add'>+</div><div class='add'>+    if (now) {</div><div class='add'>+        ec_unlock_now(link);</div><div class='add'>+    } else {</div><div class='add'>+        /* The timer has been cancelled just after firing it but before</div><div class='add'>+         * getting here. This means that another fop has used the lock</div><div class='add'>+         * and everything should be handled as if this callback were</div><div class='add'>+         * have not been executed. However we still have an owner</div><div class='add'>+         * reference.</div><div class='add'>+         *</div><div class='add'>+         * We need to release our reference. If this is not the last</div><div class='add'>+         * reference (the most common case because another fop has</div><div class='add'>+         * taken another ref) we only need to decrement the counter.</div><div class='add'>+         * Otherwise we have been delayed enough so that the other fop</div><div class='add'>+         * has had time to acquire the reference, do its operation and</div><div class='add'>+         * release it. At the time of releasing it, the fop did found</div><div class='add'>+         * that the ref counter was &gt; 1 (our reference), so the delayed</div><div class='add'>+         * unlock timer wasn't started. We need to start it again if we</div><div class='add'>+         * are the last reference.</div><div class='add'>+         *</div><div class='add'>+         * ec_unlock_timer_add() handles both cases.</div><div class='add'>+         */</div><div class='add'>+        ec_unlock_timer_add(link);</div><div class='add'>+</div><div class='add'>+        /* We need to resume the fop that was waiting for the delayed</div><div class='add'>+         * unlock.</div><div class='add'>+         */</div><div class='add'>+        ec_resume(link-&gt;fop, 0);</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_unlock_timer_cbk(void *data)</div><div class='add'>+{</div><div class='add'>+    ec_unlock_timer_del(data);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static gf_boolean_t</div><div class='add'>+ec_eager_lock_used(ec_t *ec, ec_fop_data_t *fop)</div><div class='add'>+{</div><div class='add'>+    /* Fops with no locks at this point mean that they are sent as sub-fops</div><div class='add'>+     * of other higher level fops. In this case we simply assume that the</div><div class='add'>+     * parent fop will take correct care of the eager lock. */</div><div class='add'>+    if (fop-&gt;lock_count == 0) {</div><div class='add'>+        return _gf_true;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* We may have more than one lock, but this only happens in the rename</div><div class='add'>+     * fop, and both locks will reference an inode of the same type (a</div><div class='add'>+     * directory in this case), so we only need to check the first lock. */</div><div class='add'>+    if (fop-&gt;locks[0].lock-&gt;loc.inode-&gt;ia_type == IA_IFREG) {</div><div class='add'>+        return ec-&gt;eager_lock;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return ec-&gt;other_eager_lock;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static uint32_t</div><div class='add'>+ec_eager_lock_timeout(ec_t *ec, ec_lock_t *lock)</div><div class='add'>+{</div><div class='add'>+    if (lock-&gt;loc.inode-&gt;ia_type == IA_IFREG) {</div><div class='add'>+        return ec-&gt;eager_lock_timeout;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return ec-&gt;other_eager_lock_timeout;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static gf_boolean_t</div><div class='add'>+ec_lock_delay_create(ec_lock_link_t *link)</div><div class='add'>+{</div><div class='add'>+    struct timespec delay;</div><div class='add'>+    ec_fop_data_t *fop = link-&gt;fop;</div><div class='add'>+    ec_lock_t *lock = link-&gt;lock;</div><div class='add'>+</div><div class='add'>+    delay.tv_sec = ec_eager_lock_timeout(fop-&gt;xl-&gt;private, lock);</div><div class='add'>+    delay.tv_nsec = 0;</div><div class='add'>+    lock-&gt;timer = gf_timer_call_after(fop-&gt;xl-&gt;ctx, delay, ec_unlock_timer_cbk,</div><div class='add'>+                                      link);</div><div class='add'>+    if (lock-&gt;timer == NULL) {</div><div class='add'>+        gf_msg(fop-&gt;xl-&gt;name, GF_LOG_WARNING, ENOMEM,</div><div class='add'>+               EC_MSG_UNLOCK_DELAY_FAILED, "Unable to delay an unlock");</div><div class='add'>+</div><div class='add'>+        return _gf_false;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return _gf_true;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_unlock_timer_add(ec_lock_link_t *link)</div><div class='add'>+{</div><div class='add'>+    ec_fop_data_t *fop = link-&gt;fop;</div><div class='add'>+    ec_lock_t *lock = link-&gt;lock;</div><div class='add'>+    gf_boolean_t now = _gf_false;</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;lock-&gt;loc.inode-&gt;lock);</div><div class='add'>+</div><div class='add'>+    /* We are trying to unlock the lock. We can have multiple scenarios here,</div><div class='add'>+     * but all of them need to have lock-&gt;timer == NULL:</div><div class='add'>+     *</div><div class='add'>+     * 1. There are other owners currently running that can call ec_unlock().</div><div class='add'>+     *</div><div class='add'>+     *    None of them can have started the timer until the last one. But this</div><div class='add'>+     *    call should be the consequence of this lastest one.</div><div class='add'>+     *</div><div class='add'>+     * 2. There are fops in the waiting or frozen lists.</div><div class='add'>+     *</div><div class='add'>+     *    These fops cannot call ec_unlock(). So we should be here.</div><div class='add'>+     *</div><div class='add'>+     * We must reach here with at least one owner reference.</div><div class='add'>+     */</div><div class='add'>+    GF_ASSERT((lock-&gt;timer == NULL) &amp;&amp; (lock-&gt;refs_owners &gt; 0));</div><div class='add'>+</div><div class='add'>+    /* If the fop detects that a heal is needed, we mark the lock to be</div><div class='add'>+     * released as soon as possible. */</div><div class='add'>+    lock-&gt;release |= ec_fop_needs_heal(fop);</div><div class='add'>+</div><div class='add'>+    if (lock-&gt;refs_owners &gt; 1) {</div><div class='add'>+        ec_trace("UNLOCK_SKIP", fop, "lock=%p", lock);</div><div class='add'>+</div><div class='add'>+        /* If there are other owners we cannot do anything else with the lock.</div><div class='add'>+         * Note that the current fop has already been removed from the owners</div><div class='add'>+         * list in ec_lock_reuse(). */</div><div class='add'>+        lock-&gt;refs_owners--;</div><div class='add'>+</div><div class='add'>+        UNLOCK(&amp;lock-&gt;loc.inode-&gt;lock);</div><div class='add'>+    } else if (lock-&gt;acquired) {</div><div class='add'>+        /* There are no other owners and the lock is acquired. If there were</div><div class='add'>+         * fops waiting, at least one of them should have been promoted to an</div><div class='add'>+         * owner, so the waiting list should be empty. */</div><div class='add'>+        GF_ASSERT(list_empty(&amp;lock-&gt;owners) &amp;&amp; list_empty(&amp;lock-&gt;waiting));</div><div class='add'>+</div><div class='add'>+        ec_t *ec = fop-&gt;xl-&gt;private;</div><div class='add'>+</div><div class='add'>+        /* If everything goes as expected this fop will be put to sleep until</div><div class='add'>+         * the timer callback is executed. */</div><div class='add'>+        ec_sleep(fop);</div><div class='add'>+</div><div class='add'>+        /* If the lock needs to be released, or ec is shutting down, do not</div><div class='add'>+         * delay lock release. */</div><div class='add'>+        if (!lock-&gt;release &amp;&amp; !ec-&gt;shutdown) {</div><div class='add'>+            ec_trace("UNLOCK_DELAY", fop, "lock=%p, release=%d", lock,</div><div class='add'>+                     lock-&gt;release);</div><div class='add'>+</div><div class='add'>+            if (!ec_lock_delay_create(link)) {</div><div class='add'>+                /* We are unable to create a new timer. We immediately release</div><div class='add'>+                 * the lock. */</div><div class='add'>+                lock-&gt;release = now = _gf_true;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+        } else {</div><div class='add'>+            ec_trace("UNLOCK_FORCE", fop, "lock=%p, release=%d", lock,</div><div class='add'>+                     lock-&gt;release);</div><div class='add'>+            lock-&gt;release = now = _gf_true;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        UNLOCK(&amp;lock-&gt;loc.inode-&gt;lock);</div><div class='add'>+</div><div class='add'>+        if (now) {</div><div class='add'>+            ec_unlock_now(link);</div><div class='add'>+        }</div><div class='add'>+    } else {</div><div class='add'>+        /* There are no owners and the lock is not acquired. This can only</div><div class='add'>+         * happen if a lock attempt has failed and we get to the unlock step</div><div class='add'>+         * of the fop. As in the previous case, the waiting list must be</div><div class='add'>+         * empty. */</div><div class='add'>+        GF_ASSERT(list_empty(&amp;lock-&gt;owners) &amp;&amp; list_empty(&amp;lock-&gt;waiting));</div><div class='add'>+</div><div class='add'>+        /* We need to mark the lock to be released to correctly handle fops</div><div class='add'>+         * that may get in after we release the inode mutex but before</div><div class='add'>+         * ec_lock_unfreeze() is processed. */</div><div class='add'>+        lock-&gt;release = _gf_true;</div><div class='add'>+</div><div class='add'>+        UNLOCK(&amp;lock-&gt;loc.inode-&gt;lock);</div><div class='add'>+</div><div class='add'>+        ec_lock_unfreeze(link);</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_unlock(ec_fop_data_t *fop)</div><div class='add'>+{</div><div class='add'>+    int32_t i;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; fop-&gt;lock_count; i++) {</div><div class='add'>+        ec_unlock_timer_add(&amp;fop-&gt;locks[i]);</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_flush_size_version(ec_fop_data_t *fop)</div><div class='add'>+{</div><div class='add'>+    GF_ASSERT(fop-&gt;lock_count == 1);</div><div class='add'>+    ec_update_info(&amp;fop-&gt;locks[0]);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+ec_update_stripe(ec_t *ec, ec_stripe_list_t *stripe_cache, ec_stripe_t *stripe,</div><div class='add'>+                 ec_fop_data_t *fop)</div><div class='add'>+{</div><div class='add'>+    off_t base;</div><div class='add'>+</div><div class='add'>+    /* On write fops, we only update existing fragments if the write has</div><div class='add'>+     * succeeded. Otherwise, we remove them from the cache. */</div><div class='add'>+    if ((fop-&gt;id == GF_FOP_WRITE) &amp;&amp; (fop-&gt;answer != NULL) &amp;&amp;</div><div class='add'>+        (fop-&gt;answer-&gt;op_ret &gt;= 0)) {</div><div class='add'>+        base = stripe-&gt;frag_offset - fop-&gt;frag_range.first;</div><div class='add'>+        base *= ec-&gt;fragments;</div><div class='add'>+</div><div class='add'>+        /* We check if the stripe offset falls inside the real region</div><div class='add'>+         * modified by the write fop (a write request is allowed,</div><div class='add'>+         * though uncommon, to write less bytes than requested). The</div><div class='add'>+         * current write fop implementation doesn't allow partial</div><div class='add'>+         * writes of fragments, so if there's no error, we are sure</div><div class='add'>+         * that a full stripe has been completely modified or not</div><div class='add'>+         * touched at all. The value of op_ret may not be a multiple</div><div class='add'>+         * of the stripe size because it depends on the requested</div><div class='add'>+         * size by the user, so we update the stripe if the write has</div><div class='add'>+         * modified at least one byte (meaning ec has written the full</div><div class='add'>+         * stripe). */</div><div class='add'>+        if (base &lt; fop-&gt;answer-&gt;op_ret + fop-&gt;head) {</div><div class='add'>+            memcpy(stripe-&gt;data, fop-&gt;vector[0].iov_base + base,</div><div class='add'>+                   ec-&gt;stripe_size);</div><div class='add'>+            list_move_tail(&amp;stripe-&gt;lru, &amp;stripe_cache-&gt;lru);</div><div class='add'>+</div><div class='add'>+            GF_ATOMIC_INC(ec-&gt;stats.stripe_cache.updates);</div><div class='add'>+        }</div><div class='add'>+    } else {</div><div class='add'>+        stripe-&gt;frag_offset = -1;</div><div class='add'>+        list_move(&amp;stripe-&gt;lru, &amp;stripe_cache-&gt;lru);</div><div class='add'>+</div><div class='add'>+        GF_ATOMIC_INC(ec-&gt;stats.stripe_cache.invals);</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+ec_update_cached_stripes(ec_fop_data_t *fop)</div><div class='add'>+{</div><div class='add'>+    uint64_t first;</div><div class='add'>+    uint64_t last;</div><div class='add'>+    ec_stripe_t *stripe = NULL;</div><div class='add'>+    ec_inode_t *ctx = NULL;</div><div class='add'>+    ec_stripe_list_t *stripe_cache = NULL;</div><div class='add'>+    inode_t *inode = NULL;</div><div class='add'>+    struct list_head *temp;</div><div class='add'>+    struct list_head sentinel;</div><div class='add'>+</div><div class='add'>+    first = fop-&gt;frag_range.first;</div><div class='add'>+    /* 'last' represents the first stripe not touched by the operation */</div><div class='add'>+    last = fop-&gt;frag_range.last;</div><div class='add'>+</div><div class='add'>+    /* If there are no modified stripes, we don't need to do anything</div><div class='add'>+     * else. */</div><div class='add'>+    if (last &lt;= first) {</div><div class='add'>+        return;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (!fop-&gt;use_fd) {</div><div class='add'>+        inode = fop-&gt;loc[0].inode;</div><div class='add'>+    } else {</div><div class='add'>+        inode = fop-&gt;fd-&gt;inode;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;inode-&gt;lock);</div><div class='add'>+</div><div class='add'>+    ctx = __ec_inode_get(inode, fop-&gt;xl);</div><div class='add'>+    if (ctx == NULL) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    stripe_cache = &amp;ctx-&gt;stripe_cache;</div><div class='add'>+</div><div class='add'>+    /* Since we'll be moving elements of the list to the tail, we might</div><div class='add'>+     * end in an infinite loop. To avoid it, we insert a sentinel element</div><div class='add'>+     * into the list, so that it will be used to detect when we have</div><div class='add'>+     * traversed all existing elements once. */</div><div class='add'>+    list_add_tail(&amp;sentinel, &amp;stripe_cache-&gt;lru);</div><div class='add'>+    temp = stripe_cache-&gt;lru.next;</div><div class='add'>+    while (temp != &amp;sentinel) {</div><div class='add'>+        stripe = list_entry(temp, ec_stripe_t, lru);</div><div class='add'>+        temp = temp-&gt;next;</div><div class='add'>+        if ((first &lt;= stripe-&gt;frag_offset) &amp;&amp; (stripe-&gt;frag_offset &lt; last)) {</div><div class='add'>+            ec_update_stripe(fop-&gt;xl-&gt;private, stripe_cache, stripe, fop);</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    list_del(&amp;sentinel);</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    UNLOCK(&amp;inode-&gt;lock);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_lock_reuse(ec_fop_data_t *fop)</div><div class='add'>+{</div><div class='add'>+    ec_cbk_data_t *cbk;</div><div class='add'>+    ec_t *ec = NULL;</div><div class='add'>+    int32_t i, count;</div><div class='add'>+    gf_boolean_t release = _gf_false;</div><div class='add'>+    ec = fop-&gt;xl-&gt;private;</div><div class='add'>+    cbk = fop-&gt;answer;</div><div class='add'>+</div><div class='add'>+    if (ec_eager_lock_used(ec, fop) &amp;&amp; cbk != NULL) {</div><div class='add'>+        if (cbk-&gt;xdata != NULL) {</div><div class='add'>+            if ((dict_get_int32(cbk-&gt;xdata, GLUSTERFS_INODELK_COUNT, &amp;count) ==</div><div class='add'>+                 0) &amp;&amp;</div><div class='add'>+                (count &gt; 1)) {</div><div class='add'>+                release = _gf_true;</div><div class='add'>+            }</div><div class='add'>+            if (release) {</div><div class='add'>+                gf_msg_debug(fop-&gt;xl-&gt;name, 0, "Lock contention detected");</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+    } else {</div><div class='add'>+        /* If eager lock is disabled or if we haven't get</div><div class='add'>+         * an answer with enough quorum, we always release</div><div class='add'>+         * the lock. */</div><div class='add'>+        release = _gf_true;</div><div class='add'>+    }</div><div class='add'>+    ec_update_cached_stripes(fop);</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; fop-&gt;lock_count; i++) {</div><div class='add'>+        ec_lock_next_owner(&amp;fop-&gt;locks[i], cbk, release);</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+__ec_manager(ec_fop_data_t *fop, int32_t error)</div><div class='add'>+{</div><div class='add'>+    ec_t *ec = fop-&gt;xl-&gt;private;</div><div class='add'>+</div><div class='add'>+    do {</div><div class='add'>+        ec_trace("MANAGER", fop, "error=%d", error);</div><div class='add'>+</div><div class='add'>+        if (!ec_must_wind(fop)) {</div><div class='add'>+            if (ec-&gt;xl_up_count &lt; ec-&gt;fragments) {</div><div class='add'>+                error = ENOTCONN;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        if (error != 0) {</div><div class='add'>+            fop-&gt;error = error;</div><div class='add'>+            fop-&gt;state = -fop-&gt;state;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        if ((fop-&gt;state == EC_STATE_END) || (fop-&gt;state == -EC_STATE_END)) {</div><div class='add'>+            ec_fop_data_release(fop);</div><div class='add'>+</div><div class='add'>+            break;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        /* At each state, fop must not be used anywhere else and there</div><div class='add'>+         * shouldn't be any pending subfop going on. */</div><div class='add'>+        GF_ASSERT(fop-&gt;jobs == 0);</div><div class='add'>+</div><div class='add'>+        /* While the manager is running we need to avoid that subfops launched</div><div class='add'>+         * from it could finish and call ec_resume() before the fop-&gt;handler</div><div class='add'>+         * has completed. This could lead to the same manager being executed</div><div class='add'>+         * by two threads concurrently. ec_check_complete() will take care of</div><div class='add'>+         * this reference. */</div><div class='add'>+        fop-&gt;jobs = 1;</div><div class='add'>+</div><div class='add'>+        fop-&gt;state = fop-&gt;handler(fop, fop-&gt;state);</div><div class='add'>+        GF_ASSERT(fop-&gt;state &gt;= 0);</div><div class='add'>+</div><div class='add'>+        error = ec_check_complete(fop, __ec_manager);</div><div class='add'>+    } while (error &gt;= 0);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_manager(ec_fop_data_t *fop, int32_t error)</div><div class='add'>+{</div><div class='add'>+    GF_ASSERT(fop-&gt;jobs == 0);</div><div class='add'>+    GF_ASSERT(fop-&gt;winds == 0);</div><div class='add'>+    GF_ASSERT(fop-&gt;error == 0);</div><div class='add'>+</div><div class='add'>+    if (fop-&gt;state == EC_STATE_START) {</div><div class='add'>+        fop-&gt;state = EC_STATE_INIT;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    __ec_manager(fop, error);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+gf_boolean_t</div><div class='add'>+__ec_is_last_fop(ec_t *ec)</div><div class='add'>+{</div><div class='add'>+    if ((list_empty(&amp;ec-&gt;pending_fops)) &amp;&amp;</div><div class='add'>+        (GF_ATOMIC_GET(ec-&gt;async_fop_count) == 0)) {</div><div class='add'>+        return _gf_true;</div><div class='add'>+    }</div><div class='add'>+    return _gf_false;</div><div class='add'>+}</div><div class='head'>diff --git a/xlators/cluster/ec/src/ec-common.h b/xlators/cluster/ec/src/ec-common.h<br/>new file mode 100644<br/>index 00000000000..51493612ac6<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/xlators/cluster/ec/src/ec-common.h?id=d1d7a6f35c816822fab51c820e25023863c239c1'>xlators/cluster/ec/src/ec-common.h</a></div><div class='hunk'>@@ -0,0 +1,234 @@</div><div class='add'>+/*</div><div class='add'>+  Copyright (c) 2012-2014 DataLab, s.l. &lt;http://www.datalab.es&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#ifndef __EC_COMMON_H__</div><div class='add'>+#define __EC_COMMON_H__</div><div class='add'>+</div><div class='add'>+#include "glusterfs/compat-errno.h"  // for ENODATA on BSD</div><div class='add'>+#include "ec-data.h"</div><div class='add'>+</div><div class='add'>+typedef enum { EC_DATA_TXN, EC_METADATA_TXN } ec_txn_t;</div><div class='add'>+</div><div class='add'>+#define EC_FOP_HEAL -1</div><div class='add'>+#define EC_FOP_FHEAL -2</div><div class='add'>+</div><div class='add'>+#define EC_CONFIG_VERSION 0</div><div class='add'>+</div><div class='add'>+#define EC_CONFIG_ALGORITHM 0</div><div class='add'>+</div><div class='add'>+#define EC_FLAG_LOCK_SHARED 0x0001</div><div class='add'>+</div><div class='add'>+#define QUORUM_CBK(fn, fop, frame, cookie, this, op_ret, op_errno, params...)  \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        ec_t *__ec = fop-&gt;xl-&gt;private;                                         \</div><div class='add'>+        int32_t __op_ret = 0;                                                  \</div><div class='add'>+        int32_t __op_errno = 0;                                                \</div><div class='add'>+        int32_t __success_count = gf_bits_count(fop-&gt;good);                    \</div><div class='add'>+                                                                               \</div><div class='add'>+        __op_ret = op_ret;                                                     \</div><div class='add'>+        __op_errno = op_errno;                                                 \</div><div class='add'>+        if (!fop-&gt;parent &amp;&amp; frame &amp;&amp;                                           \</div><div class='add'>+            (GF_CLIENT_PID_SELF_HEALD != frame-&gt;root-&gt;pid) &amp;&amp;                  \</div><div class='add'>+            __ec-&gt;quorum_count &amp;&amp; (__success_count &lt; __ec-&gt;quorum_count) &amp;&amp;    \</div><div class='add'>+            op_ret &gt;= 0) {                                                     \</div><div class='add'>+            __op_ret = -1;                                                     \</div><div class='add'>+            __op_errno = EIO;                                                  \</div><div class='add'>+            gf_msg(__ec-&gt;xl-&gt;name, GF_LOG_ERROR, 0,                            \</div><div class='add'>+                   EC_MSG_CHILDS_INSUFFICIENT,                                 \</div><div class='add'>+                   "Insufficient available children for this request "         \</div><div class='add'>+                   "(have %d, need %d). %s",                                   \</div><div class='add'>+                   __success_count, __ec-&gt;quorum_count, ec_msg_str(fop));      \</div><div class='add'>+        }                                                                      \</div><div class='add'>+        fn(frame, cookie, this, __op_ret, __op_errno, params);                 \</div><div class='add'>+    } while (0)</div><div class='add'>+</div><div class='add'>+enum _ec_xattrop_flags {</div><div class='add'>+    EC_FLAG_XATTROP,</div><div class='add'>+    EC_FLAG_DATA_DIRTY,</div><div class='add'>+    EC_FLAG_METADATA_DIRTY,</div><div class='add'>+</div><div class='add'>+    /* Add any new flag here, before EC_FLAG_MAX. The maximum number of</div><div class='add'>+     * flags that can be defined is 16. */</div><div class='add'>+</div><div class='add'>+    EC_FLAG_MAX</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+/* We keep two sets of flags. One to determine what's really providing the</div><div class='add'>+ * current xattrop and the other to know what the parent fop of the xattrop</div><div class='add'>+ * needs to proceed. It might happen that a fop needs some information that</div><div class='add'>+ * is being already requested by a previous fop. The two sets are stored</div><div class='add'>+ * contiguously. */</div><div class='add'>+</div><div class='add'>+#define EC_FLAG_NEEDS(_flag) (1 &lt;&lt; (_flag))</div><div class='add'>+#define EC_FLAG_PROVIDES(_flag) (1 &lt;&lt; ((_flag) + EC_FLAG_MAX))</div><div class='add'>+</div><div class='add'>+#define EC_NEEDED_FLAGS(_flags) ((_flags) &amp; ((1 &lt;&lt; EC_FLAG_MAX) - 1))</div><div class='add'>+</div><div class='add'>+#define EC_PROVIDED_FLAGS(_flags) EC_NEEDED_FLAGS((_flags) &gt;&gt; EC_FLAG_MAX)</div><div class='add'>+</div><div class='add'>+#define EC_FLAGS_HAVE(_flags, _flag) (((_flags) &amp; (1 &lt;&lt; (_flag))) != 0)</div><div class='add'>+</div><div class='add'>+#define EC_SELFHEAL_BIT 62</div><div class='add'>+</div><div class='add'>+#define EC_MINIMUM_ONE (1 &lt;&lt; 6)</div><div class='add'>+#define EC_MINIMUM_MIN (2 &lt;&lt; 6)</div><div class='add'>+#define EC_MINIMUM_ALL (3 &lt;&lt; 6)</div><div class='add'>+#define EC_FOP_NO_PROPAGATE_ERROR (1 &lt;&lt; 8)</div><div class='add'>+#define EC_FOP_MINIMUM(_flags) ((_flags)&amp;255)</div><div class='add'>+#define EC_FOP_FLAGS(_flags) ((_flags) &amp; ~255)</div><div class='add'>+</div><div class='add'>+#define EC_UPDATE_DATA 1</div><div class='add'>+#define EC_UPDATE_META 2</div><div class='add'>+#define EC_QUERY_INFO 4</div><div class='add'>+#define EC_INODE_SIZE 8</div><div class='add'>+</div><div class='add'>+#define EC_STATE_START 0</div><div class='add'>+#define EC_STATE_END 0</div><div class='add'>+#define EC_STATE_INIT 1</div><div class='add'>+#define EC_STATE_LOCK 2</div><div class='add'>+#define EC_STATE_DISPATCH 3</div><div class='add'>+#define EC_STATE_PREPARE_ANSWER 4</div><div class='add'>+#define EC_STATE_REPORT 5</div><div class='add'>+#define EC_STATE_LOCK_REUSE 6</div><div class='add'>+#define EC_STATE_UNLOCK 7</div><div class='add'>+</div><div class='add'>+#define EC_STATE_DELAYED_START 100</div><div class='add'>+</div><div class='add'>+#define EC_STATE_HEAL_ENTRY_LOOKUP 200</div><div class='add'>+#define EC_STATE_HEAL_ENTRY_PREPARE 201</div><div class='add'>+#define EC_STATE_HEAL_PRE_INODELK_LOCK 202</div><div class='add'>+#define EC_STATE_HEAL_PRE_INODE_LOOKUP 203</div><div class='add'>+#define EC_STATE_HEAL_XATTRIBUTES_REMOVE 204</div><div class='add'>+#define EC_STATE_HEAL_XATTRIBUTES_SET 205</div><div class='add'>+#define EC_STATE_HEAL_ATTRIBUTES 206</div><div class='add'>+#define EC_STATE_HEAL_OPEN 207</div><div class='add'>+#define EC_STATE_HEAL_REOPEN_FD 208</div><div class='add'>+#define EC_STATE_HEAL_UNLOCK 209</div><div class='add'>+#define EC_STATE_HEAL_UNLOCK_ENTRY 210</div><div class='add'>+#define EC_STATE_HEAL_DATA_LOCK 211</div><div class='add'>+#define EC_STATE_HEAL_DATA_COPY 212</div><div class='add'>+#define EC_STATE_HEAL_DATA_UNLOCK 213</div><div class='add'>+#define EC_STATE_HEAL_POST_INODELK_LOCK 214</div><div class='add'>+#define EC_STATE_HEAL_POST_INODE_LOOKUP 215</div><div class='add'>+#define EC_STATE_HEAL_SETATTR 216</div><div class='add'>+#define EC_STATE_HEAL_POST_INODELK_UNLOCK 217</div><div class='add'>+#define EC_STATE_HEAL_DISPATCH 218</div><div class='add'>+</div><div class='add'>+/* Value to cover the full range of a file */</div><div class='add'>+#define EC_RANGE_FULL ((uint64_t)LLONG_MAX + 1)</div><div class='add'>+</div><div class='add'>+gf_boolean_t</div><div class='add'>+ec_dispatch_one_retry(ec_fop_data_t *fop, ec_cbk_data_t **cbk);</div><div class='add'>+void</div><div class='add'>+ec_dispatch_next(ec_fop_data_t *fop, uint32_t idx);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_complete(ec_fop_data_t *fop);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_update_good(ec_fop_data_t *fop, uintptr_t good);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_fop_set_error(ec_fop_data_t *fop, int32_t error);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+__ec_fop_set_error(ec_fop_data_t *fop, int32_t error);</div><div class='add'>+</div><div class='add'>+ec_cbk_data_t *</div><div class='add'>+ec_fop_prepare_answer(ec_fop_data_t *fop, gf_boolean_t ro);</div><div class='add'>+</div><div class='add'>+gf_boolean_t</div><div class='add'>+ec_cbk_set_error(ec_cbk_data_t *cbk, int32_t error, gf_boolean_t ro);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_lock_prepare_inode(ec_fop_data_t *fop, loc_t *loc, uint32_t flags,</div><div class='add'>+                      off_t fl_start, uint64_t fl_size);</div><div class='add'>+void</div><div class='add'>+ec_lock_prepare_parent_inode(ec_fop_data_t *fop, loc_t *loc, loc_t *base,</div><div class='add'>+                             uint32_t flags);</div><div class='add'>+void</div><div class='add'>+ec_lock_prepare_fd(ec_fop_data_t *fop, fd_t *fd, uint32_t flags, off_t fl_start,</div><div class='add'>+                   uint64_t fl_size);</div><div class='add'>+void</div><div class='add'>+ec_lock(ec_fop_data_t *fop);</div><div class='add'>+void</div><div class='add'>+ec_lock_reuse(ec_fop_data_t *fop);</div><div class='add'>+void</div><div class='add'>+ec_unlock(ec_fop_data_t *fop);</div><div class='add'>+void</div><div class='add'>+ec_lock_release(ec_t *ec, inode_t *inode);</div><div class='add'>+</div><div class='add'>+gf_boolean_t</div><div class='add'>+ec_get_inode_size(ec_fop_data_t *fop, inode_t *inode, uint64_t *size);</div><div class='add'>+gf_boolean_t</div><div class='add'>+__ec_get_inode_size(ec_fop_data_t *fop, inode_t *inode, uint64_t *size);</div><div class='add'>+gf_boolean_t</div><div class='add'>+ec_set_inode_size(ec_fop_data_t *fop, inode_t *inode, uint64_t size);</div><div class='add'>+gf_boolean_t</div><div class='add'>+__ec_set_inode_size(ec_fop_data_t *fop, inode_t *inode, uint64_t size);</div><div class='add'>+void</div><div class='add'>+ec_clear_inode_info(ec_fop_data_t *fop, inode_t *inode);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_flush_size_version(ec_fop_data_t *fop);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_dispatch_all(ec_fop_data_t *fop);</div><div class='add'>+void</div><div class='add'>+ec_dispatch_inc(ec_fop_data_t *fop);</div><div class='add'>+void</div><div class='add'>+ec_dispatch_min(ec_fop_data_t *fop);</div><div class='add'>+void</div><div class='add'>+ec_dispatch_one(ec_fop_data_t *fop);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_succeed_all(ec_fop_data_t *fop);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_sleep(ec_fop_data_t *fop);</div><div class='add'>+void</div><div class='add'>+ec_resume(ec_fop_data_t *fop, int32_t error);</div><div class='add'>+void</div><div class='add'>+ec_resume_parent(ec_fop_data_t *fop);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_manager(ec_fop_data_t *fop, int32_t error);</div><div class='add'>+gf_boolean_t</div><div class='add'>+ec_is_recoverable_error(int32_t op_errno);</div><div class='add'>+void</div><div class='add'>+ec_handle_healers_done(ec_fop_data_t *fop);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_heal_inspect(call_frame_t *frame, ec_t *ec, inode_t *inode,</div><div class='add'>+                unsigned char *locked_on, gf_boolean_t self_locked,</div><div class='add'>+                gf_boolean_t thorough, ec_heal_need_t *need_heal);</div><div class='add'>+int32_t</div><div class='add'>+ec_get_heal_info(xlator_t *this, loc_t *loc, dict_t **dict);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_lock_unlocked(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                 int32_t op_ret, int32_t op_errno, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_update_fd_status(fd_t *fd, xlator_t *xl, int child_index,</div><div class='add'>+                    int32_t ret_status);</div><div class='add'>+gf_boolean_t</div><div class='add'>+ec_is_entry_healing(ec_fop_data_t *fop);</div><div class='add'>+void</div><div class='add'>+ec_set_entry_healing(ec_fop_data_t *fop);</div><div class='add'>+void</div><div class='add'>+ec_reset_entry_healing(ec_fop_data_t *fop);</div><div class='add'>+char *</div><div class='add'>+ec_msg_str(ec_fop_data_t *fop);</div><div class='add'>+gf_boolean_t</div><div class='add'>+__ec_is_last_fop(ec_t *ec);</div><div class='add'>+void</div><div class='add'>+ec_lock_update_good(ec_lock_t *lock, ec_fop_data_t *fop);</div><div class='add'>+#endif /* __EC_COMMON_H__ */</div><div class='head'>diff --git a/xlators/cluster/ec/src/ec-data.c b/xlators/cluster/ec/src/ec-data.c<br/>new file mode 100644<br/>index 00000000000..06388833546<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/xlators/cluster/ec/src/ec-data.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>xlators/cluster/ec/src/ec-data.c</a></div><div class='hunk'>@@ -0,0 +1,288 @@</div><div class='add'>+/*</div><div class='add'>+  Copyright (c) 2012-2014 DataLab, s.l. &lt;http://www.datalab.es&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#include "ec-helpers.h"</div><div class='add'>+#include "ec-common.h"</div><div class='add'>+#include "ec-data.h"</div><div class='add'>+#include "ec-messages.h"</div><div class='add'>+</div><div class='add'>+ec_cbk_data_t *</div><div class='add'>+ec_cbk_data_allocate(call_frame_t *frame, xlator_t *this, ec_fop_data_t *fop,</div><div class='add'>+                     int32_t id, int32_t idx, int32_t op_ret, int32_t op_errno)</div><div class='add'>+{</div><div class='add'>+    ec_cbk_data_t *cbk;</div><div class='add'>+    ec_t *ec = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    if (fop-&gt;xl != this) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_ERROR, EINVAL, EC_MSG_XLATOR_MISMATCH,</div><div class='add'>+               "Mismatching xlators between request "</div><div class='add'>+               "and answer (req=%s, ans=%s).",</div><div class='add'>+               fop-&gt;xl-&gt;name, this-&gt;name);</div><div class='add'>+</div><div class='add'>+        return NULL;</div><div class='add'>+    }</div><div class='add'>+    if (fop-&gt;frame != frame) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_ERROR, EINVAL, EC_MSG_FRAME_MISMATCH,</div><div class='add'>+               "Mismatching frames between request "</div><div class='add'>+               "and answer (req=%p, ans=%p).",</div><div class='add'>+               fop-&gt;frame, frame);</div><div class='add'>+</div><div class='add'>+        return NULL;</div><div class='add'>+    }</div><div class='add'>+    if (fop-&gt;id != id) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_ERROR, EINVAL, EC_MSG_FOP_MISMATCH,</div><div class='add'>+               "Mismatching fops between request "</div><div class='add'>+               "and answer (req=%d, ans=%d).",</div><div class='add'>+               fop-&gt;id, id);</div><div class='add'>+</div><div class='add'>+        return NULL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    cbk = mem_get0(ec-&gt;cbk_pool);</div><div class='add'>+    if (cbk == NULL) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_ERROR, ENOMEM, EC_MSG_NO_MEMORY,</div><div class='add'>+               "Failed to allocate memory for an "</div><div class='add'>+               "answer.");</div><div class='add'>+        return NULL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    cbk-&gt;fop = fop;</div><div class='add'>+    cbk-&gt;idx = idx;</div><div class='add'>+    cbk-&gt;mask = 1ULL &lt;&lt; idx;</div><div class='add'>+    cbk-&gt;count = 1;</div><div class='add'>+    cbk-&gt;op_ret = op_ret;</div><div class='add'>+    cbk-&gt;op_errno = op_errno;</div><div class='add'>+    INIT_LIST_HEAD(&amp;cbk-&gt;entries.list);</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;fop-&gt;lock);</div><div class='add'>+</div><div class='add'>+    list_add_tail(&amp;cbk-&gt;answer_list, &amp;fop-&gt;answer_list);</div><div class='add'>+</div><div class='add'>+    UNLOCK(&amp;fop-&gt;lock);</div><div class='add'>+</div><div class='add'>+    return cbk;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_cbk_data_destroy(ec_cbk_data_t *cbk)</div><div class='add'>+{</div><div class='add'>+    if (cbk-&gt;xdata != NULL) {</div><div class='add'>+        dict_unref(cbk-&gt;xdata);</div><div class='add'>+    }</div><div class='add'>+    if (cbk-&gt;dict != NULL) {</div><div class='add'>+        dict_unref(cbk-&gt;dict);</div><div class='add'>+    }</div><div class='add'>+    if (cbk-&gt;inode != NULL) {</div><div class='add'>+        inode_unref(cbk-&gt;inode);</div><div class='add'>+    }</div><div class='add'>+    if (cbk-&gt;fd != NULL) {</div><div class='add'>+        fd_unref(cbk-&gt;fd);</div><div class='add'>+    }</div><div class='add'>+    if (cbk-&gt;buffers != NULL) {</div><div class='add'>+        iobref_unref(cbk-&gt;buffers);</div><div class='add'>+    }</div><div class='add'>+    GF_FREE(cbk-&gt;vector);</div><div class='add'>+    gf_dirent_free(&amp;cbk-&gt;entries);</div><div class='add'>+    GF_FREE(cbk-&gt;str);</div><div class='add'>+</div><div class='add'>+    mem_put(cbk);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+ec_fop_data_t *</div><div class='add'>+ec_fop_data_allocate(call_frame_t *frame, xlator_t *this, int32_t id,</div><div class='add'>+                     uint32_t flags, uintptr_t target, uint32_t fop_flags,</div><div class='add'>+                     ec_wind_f wind, ec_handler_f handler, ec_cbk_t cbks,</div><div class='add'>+                     void *data)</div><div class='add'>+{</div><div class='add'>+    ec_fop_data_t *fop, *parent;</div><div class='add'>+    ec_t *ec = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    fop = mem_get0(ec-&gt;fop_pool);</div><div class='add'>+    if (fop == NULL) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_ERROR, ENOMEM, EC_MSG_NO_MEMORY,</div><div class='add'>+               "Failed to allocate memory for a "</div><div class='add'>+               "request.");</div><div class='add'>+</div><div class='add'>+        return NULL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    INIT_LIST_HEAD(&amp;fop-&gt;cbk_list);</div><div class='add'>+    INIT_LIST_HEAD(&amp;fop-&gt;healer);</div><div class='add'>+    INIT_LIST_HEAD(&amp;fop-&gt;answer_list);</div><div class='add'>+    INIT_LIST_HEAD(&amp;fop-&gt;pending_list);</div><div class='add'>+    INIT_LIST_HEAD(&amp;fop-&gt;locks[0].owner_list);</div><div class='add'>+    INIT_LIST_HEAD(&amp;fop-&gt;locks[0].wait_list);</div><div class='add'>+    INIT_LIST_HEAD(&amp;fop-&gt;locks[1].owner_list);</div><div class='add'>+    INIT_LIST_HEAD(&amp;fop-&gt;locks[1].wait_list);</div><div class='add'>+</div><div class='add'>+    fop-&gt;xl = this;</div><div class='add'>+    fop-&gt;req_frame = frame;</div><div class='add'>+</div><div class='add'>+    /* fops need a private frame to be able to execute some postop operations</div><div class='add'>+     * even if the original fop has completed and reported back to the upper</div><div class='add'>+     * xlator and it has destroyed the base frame.</div><div class='add'>+     *</div><div class='add'>+     * TODO: minimize usage of private frames. Reuse req_frame as much as</div><div class='add'>+     *       possible.</div><div class='add'>+     */</div><div class='add'>+    if (frame != NULL) {</div><div class='add'>+        fop-&gt;frame = copy_frame(frame);</div><div class='add'>+    } else {</div><div class='add'>+        fop-&gt;frame = create_frame(this, this-&gt;ctx-&gt;pool);</div><div class='add'>+    }</div><div class='add'>+    if (fop-&gt;frame == NULL) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_ERROR, ENOMEM, EC_MSG_NO_MEMORY,</div><div class='add'>+               "Failed to create a private frame "</div><div class='add'>+               "for a request");</div><div class='add'>+</div><div class='add'>+        mem_put(fop);</div><div class='add'>+</div><div class='add'>+        return NULL;</div><div class='add'>+    }</div><div class='add'>+    fop-&gt;id = id;</div><div class='add'>+    fop-&gt;refs = 1;</div><div class='add'>+</div><div class='add'>+    fop-&gt;flags = flags;</div><div class='add'>+    fop-&gt;minimum = EC_FOP_MINIMUM(fop_flags);</div><div class='add'>+    fop-&gt;fop_flags = EC_FOP_FLAGS(fop_flags);</div><div class='add'>+    fop-&gt;mask = target;</div><div class='add'>+</div><div class='add'>+    fop-&gt;wind = wind;</div><div class='add'>+    fop-&gt;handler = handler;</div><div class='add'>+    fop-&gt;cbks = cbks;</div><div class='add'>+    fop-&gt;data = data;</div><div class='add'>+</div><div class='add'>+    fop-&gt;uid = fop-&gt;frame-&gt;root-&gt;uid;</div><div class='add'>+    fop-&gt;gid = fop-&gt;frame-&gt;root-&gt;gid;</div><div class='add'>+</div><div class='add'>+    LOCK_INIT(&amp;fop-&gt;lock);</div><div class='add'>+</div><div class='add'>+    fop-&gt;frame-&gt;local = fop;</div><div class='add'>+</div><div class='add'>+    if (frame != NULL) {</div><div class='add'>+        parent = frame-&gt;local;</div><div class='add'>+        if (parent != NULL) {</div><div class='add'>+            ec_sleep(parent);</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        fop-&gt;parent = parent;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;ec-&gt;lock);</div><div class='add'>+</div><div class='add'>+    list_add_tail(&amp;fop-&gt;pending_list, &amp;ec-&gt;pending_fops);</div><div class='add'>+</div><div class='add'>+    UNLOCK(&amp;ec-&gt;lock);</div><div class='add'>+</div><div class='add'>+    return fop;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_fop_data_acquire(ec_fop_data_t *fop)</div><div class='add'>+{</div><div class='add'>+    LOCK(&amp;fop-&gt;lock);</div><div class='add'>+</div><div class='add'>+    ec_trace("ACQUIRE", fop, "");</div><div class='add'>+</div><div class='add'>+    fop-&gt;refs++;</div><div class='add'>+</div><div class='add'>+    UNLOCK(&amp;fop-&gt;lock);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+ec_handle_last_pending_fop_completion(ec_fop_data_t *fop, gf_boolean_t *notify)</div><div class='add'>+{</div><div class='add'>+    ec_t *ec = fop-&gt;xl-&gt;private;</div><div class='add'>+</div><div class='add'>+    *notify = _gf_false;</div><div class='add'>+</div><div class='add'>+    if (!list_empty(&amp;fop-&gt;pending_list)) {</div><div class='add'>+        LOCK(&amp;ec-&gt;lock);</div><div class='add'>+        {</div><div class='add'>+            list_del_init(&amp;fop-&gt;pending_list);</div><div class='add'>+            *notify = __ec_is_last_fop(ec);</div><div class='add'>+        }</div><div class='add'>+        UNLOCK(&amp;ec-&gt;lock);</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_fop_cleanup(ec_fop_data_t *fop)</div><div class='add'>+{</div><div class='add'>+    ec_cbk_data_t *cbk, *tmp;</div><div class='add'>+</div><div class='add'>+    list_for_each_entry_safe(cbk, tmp, &amp;fop-&gt;answer_list, answer_list)</div><div class='add'>+    {</div><div class='add'>+        list_del_init(&amp;cbk-&gt;answer_list);</div><div class='add'>+</div><div class='add'>+        ec_cbk_data_destroy(cbk);</div><div class='add'>+    }</div><div class='add'>+    INIT_LIST_HEAD(&amp;fop-&gt;cbk_list);</div><div class='add'>+</div><div class='add'>+    fop-&gt;answer = NULL;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_fop_data_release(ec_fop_data_t *fop)</div><div class='add'>+{</div><div class='add'>+    ec_t *ec = NULL;</div><div class='add'>+    int32_t refs;</div><div class='add'>+    gf_boolean_t notify = _gf_false;</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;fop-&gt;lock);</div><div class='add'>+</div><div class='add'>+    ec_trace("RELEASE", fop, "");</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(fop-&gt;refs &gt; 0);</div><div class='add'>+    refs = --fop-&gt;refs;</div><div class='add'>+</div><div class='add'>+    UNLOCK(&amp;fop-&gt;lock);</div><div class='add'>+</div><div class='add'>+    if (refs == 0) {</div><div class='add'>+        fop-&gt;frame-&gt;local = NULL;</div><div class='add'>+        STACK_DESTROY(fop-&gt;frame-&gt;root);</div><div class='add'>+</div><div class='add'>+        LOCK_DESTROY(&amp;fop-&gt;lock);</div><div class='add'>+</div><div class='add'>+        if (fop-&gt;xdata != NULL) {</div><div class='add'>+            dict_unref(fop-&gt;xdata);</div><div class='add'>+        }</div><div class='add'>+        if (fop-&gt;dict != NULL) {</div><div class='add'>+            dict_unref(fop-&gt;dict);</div><div class='add'>+        }</div><div class='add'>+        if (fop-&gt;inode != NULL) {</div><div class='add'>+            inode_unref(fop-&gt;inode);</div><div class='add'>+        }</div><div class='add'>+        if (fop-&gt;fd != NULL) {</div><div class='add'>+            fd_unref(fop-&gt;fd);</div><div class='add'>+        }</div><div class='add'>+        if (fop-&gt;buffers != NULL) {</div><div class='add'>+            iobref_unref(fop-&gt;buffers);</div><div class='add'>+        }</div><div class='add'>+        GF_FREE(fop-&gt;vector);</div><div class='add'>+        GF_FREE(fop-&gt;str[0]);</div><div class='add'>+        GF_FREE(fop-&gt;str[1]);</div><div class='add'>+        loc_wipe(&amp;fop-&gt;loc[0]);</div><div class='add'>+        loc_wipe(&amp;fop-&gt;loc[1]);</div><div class='add'>+        GF_FREE(fop-&gt;errstr);</div><div class='add'>+</div><div class='add'>+        ec_resume_parent(fop);</div><div class='add'>+</div><div class='add'>+        ec_fop_cleanup(fop);</div><div class='add'>+</div><div class='add'>+        ec = fop-&gt;xl-&gt;private;</div><div class='add'>+        ec_handle_last_pending_fop_completion(fop, &amp;notify);</div><div class='add'>+        ec_handle_healers_done(fop);</div><div class='add'>+        mem_put(fop);</div><div class='add'>+        if (notify) {</div><div class='add'>+            ec_pending_fops_completed(ec);</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+}</div><div class='head'>diff --git a/xlators/cluster/ec/src/ec-data.h b/xlators/cluster/ec/src/ec-data.h<br/>new file mode 100644<br/>index 00000000000..c8a74ffe1ed<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/xlators/cluster/ec/src/ec-data.h?id=d1d7a6f35c816822fab51c820e25023863c239c1'>xlators/cluster/ec/src/ec-data.h</a></div><div class='hunk'>@@ -0,0 +1,35 @@</div><div class='add'>+/*</div><div class='add'>+  Copyright (c) 2012-2014 DataLab, s.l. &lt;http://www.datalab.es&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#ifndef __EC_DATA_H__</div><div class='add'>+#define __EC_DATA_H__</div><div class='add'>+</div><div class='add'>+#include "ec-types.h"</div><div class='add'>+</div><div class='add'>+ec_cbk_data_t *</div><div class='add'>+ec_cbk_data_allocate(call_frame_t *frame, xlator_t *this, ec_fop_data_t *fop,</div><div class='add'>+                     int32_t id, int32_t idx, int32_t op_ret, int32_t op_errno);</div><div class='add'>+ec_fop_data_t *</div><div class='add'>+ec_fop_data_allocate(call_frame_t *frame, xlator_t *this, int32_t id,</div><div class='add'>+                     uint32_t flags, uintptr_t target, uint32_t fop_flags,</div><div class='add'>+                     ec_wind_f wind, ec_handler_f handler, ec_cbk_t cbks,</div><div class='add'>+                     void *data);</div><div class='add'>+void</div><div class='add'>+ec_fop_data_acquire(ec_fop_data_t *fop);</div><div class='add'>+void</div><div class='add'>+ec_fop_data_release(ec_fop_data_t *fop);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_fop_cleanup(ec_fop_data_t *fop);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_pending_fops_completed(ec_t *ec);</div><div class='add'>+</div><div class='add'>+#endif /* __EC_DATA_H__ */</div><div class='head'>diff --git a/xlators/cluster/ec/src/ec-dir-read.c b/xlators/cluster/ec/src/ec-dir-read.c<br/>new file mode 100644<br/>index 00000000000..f71dcfac293<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/xlators/cluster/ec/src/ec-dir-read.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>xlators/cluster/ec/src/ec-dir-read.c</a></div><div class='hunk'>@@ -0,0 +1,647 @@</div><div class='add'>+/*</div><div class='add'>+  Copyright (c) 2012-2014 DataLab, s.l. &lt;http://www.datalab.es&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#include "ec.h"</div><div class='add'>+#include "ec-messages.h"</div><div class='add'>+#include "ec-helpers.h"</div><div class='add'>+#include "ec-common.h"</div><div class='add'>+#include "ec-combine.h"</div><div class='add'>+#include "ec-fops.h"</div><div class='add'>+</div><div class='add'>+/****************************************************************</div><div class='add'>+ *</div><div class='add'>+ * File Operation: opendir</div><div class='add'>+ *</div><div class='add'>+ ***************************************************************/</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_combine_opendir(ec_fop_data_t *fop, ec_cbk_data_t *dst, ec_cbk_data_t *src)</div><div class='add'>+{</div><div class='add'>+    if (dst-&gt;fd != src-&gt;fd) {</div><div class='add'>+        gf_msg(fop-&gt;xl-&gt;name, GF_LOG_NOTICE, 0, EC_MSG_FD_MISMATCH,</div><div class='add'>+               "Mismatching fd in answers "</div><div class='add'>+               "of 'GF_FOP_OPENDIR': %p &lt;-&gt; %p",</div><div class='add'>+               dst-&gt;fd, src-&gt;fd);</div><div class='add'>+</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_opendir_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+               int32_t op_ret, int32_t op_errno, fd_t *fd, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    ec_fop_data_t *fop = NULL;</div><div class='add'>+    ec_cbk_data_t *cbk = NULL;</div><div class='add'>+    int32_t idx = (int32_t)(uintptr_t)cookie;</div><div class='add'>+</div><div class='add'>+    VALIDATE_OR_GOTO(this, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, frame, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, frame-&gt;local, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, this-&gt;private, out);</div><div class='add'>+</div><div class='add'>+    fop = frame-&gt;local;</div><div class='add'>+</div><div class='add'>+    ec_trace("CBK", fop, "idx=%d, frame=%p, op_ret=%d, op_errno=%d", idx, frame,</div><div class='add'>+             op_ret, op_errno);</div><div class='add'>+</div><div class='add'>+    cbk = ec_cbk_data_allocate(frame, this, fop, GF_FOP_OPENDIR, idx, op_ret,</div><div class='add'>+                               op_errno);</div><div class='add'>+    if (cbk != NULL) {</div><div class='add'>+        if (op_ret &gt;= 0) {</div><div class='add'>+            if (fd != NULL) {</div><div class='add'>+                cbk-&gt;fd = fd_ref(fd);</div><div class='add'>+                if (cbk-&gt;fd == NULL) {</div><div class='add'>+                    gf_msg(this-&gt;name, GF_LOG_ERROR, 0,</div><div class='add'>+                           EC_MSG_FILE_DESC_REF_FAIL,</div><div class='add'>+                           "Failed to reference a "</div><div class='add'>+                           "file descriptor.");</div><div class='add'>+</div><div class='add'>+                    goto out;</div><div class='add'>+                }</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+        if (xdata != NULL) {</div><div class='add'>+            cbk-&gt;xdata = dict_ref(xdata);</div><div class='add'>+            if (cbk-&gt;xdata == NULL) {</div><div class='add'>+                gf_msg(this-&gt;name, GF_LOG_ERROR, 0, EC_MSG_DICT_REF_FAIL,</div><div class='add'>+                       "Failed to reference a "</div><div class='add'>+                       "dictionary.");</div><div class='add'>+</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        ec_combine(cbk, ec_combine_opendir);</div><div class='add'>+</div><div class='add'>+        ec_update_fd_status(fd, this, idx, op_ret);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (fop != NULL) {</div><div class='add'>+        ec_complete(fop);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_wind_opendir(ec_t *ec, ec_fop_data_t *fop, int32_t idx)</div><div class='add'>+{</div><div class='add'>+    ec_trace("WIND", fop, "idx=%d", idx);</div><div class='add'>+</div><div class='add'>+    STACK_WIND_COOKIE(fop-&gt;frame, ec_opendir_cbk, (void *)(uintptr_t)idx,</div><div class='add'>+                      ec-&gt;xl_list[idx], ec-&gt;xl_list[idx]-&gt;fops-&gt;opendir,</div><div class='add'>+                      &amp;fop-&gt;loc[0], fop-&gt;fd, fop-&gt;xdata);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_manager_opendir(ec_fop_data_t *fop, int32_t state)</div><div class='add'>+{</div><div class='add'>+    ec_cbk_data_t *cbk;</div><div class='add'>+    ec_fd_t *ctx;</div><div class='add'>+    int32_t err;</div><div class='add'>+</div><div class='add'>+    switch (state) {</div><div class='add'>+        case EC_STATE_INIT:</div><div class='add'>+            LOCK(&amp;fop-&gt;fd-&gt;lock);</div><div class='add'>+</div><div class='add'>+            ctx = __ec_fd_get(fop-&gt;fd, fop-&gt;xl);</div><div class='add'>+            if (ctx == NULL) {</div><div class='add'>+                UNLOCK(&amp;fop-&gt;fd-&gt;lock);</div><div class='add'>+</div><div class='add'>+                fop-&gt;error = ENOMEM;</div><div class='add'>+</div><div class='add'>+                return EC_STATE_REPORT;</div><div class='add'>+            }</div><div class='add'>+            if (!ctx-&gt;loc.inode) {</div><div class='add'>+                err = ec_loc_from_loc(fop-&gt;xl, &amp;ctx-&gt;loc, &amp;fop-&gt;loc[0]);</div><div class='add'>+                if (err != 0) {</div><div class='add'>+                    UNLOCK(&amp;fop-&gt;fd-&gt;lock);</div><div class='add'>+</div><div class='add'>+                    fop-&gt;error = -err;</div><div class='add'>+</div><div class='add'>+                    return EC_STATE_REPORT;</div><div class='add'>+                }</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            UNLOCK(&amp;fop-&gt;fd-&gt;lock);</div><div class='add'>+</div><div class='add'>+            /* Fall through */</div><div class='add'>+</div><div class='add'>+        case EC_STATE_LOCK:</div><div class='add'>+            ec_lock_prepare_inode(fop, &amp;fop-&gt;loc[0], EC_QUERY_INFO, 0,</div><div class='add'>+                                  EC_RANGE_FULL);</div><div class='add'>+            ec_lock(fop);</div><div class='add'>+</div><div class='add'>+            return EC_STATE_DISPATCH;</div><div class='add'>+</div><div class='add'>+        case EC_STATE_DISPATCH:</div><div class='add'>+            ec_dispatch_all(fop);</div><div class='add'>+</div><div class='add'>+            return EC_STATE_PREPARE_ANSWER;</div><div class='add'>+</div><div class='add'>+        case EC_STATE_PREPARE_ANSWER:</div><div class='add'>+            cbk = ec_fop_prepare_answer(fop, _gf_true);</div><div class='add'>+            if (cbk != NULL) {</div><div class='add'>+                /* Save which subvolumes successfully opened the directory.</div><div class='add'>+                 * If ctx-&gt;open is 0, it means that readdir cannot be</div><div class='add'>+                 * processed in this directory.</div><div class='add'>+                 */</div><div class='add'>+                LOCK(&amp;fop-&gt;fd-&gt;lock);</div><div class='add'>+</div><div class='add'>+                ctx = __ec_fd_get(fop-&gt;fd, fop-&gt;xl);</div><div class='add'>+                if (ctx != NULL) {</div><div class='add'>+                    ctx-&gt;open |= cbk-&gt;mask;</div><div class='add'>+                }</div><div class='add'>+</div><div class='add'>+                UNLOCK(&amp;fop-&gt;fd-&gt;lock);</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            return EC_STATE_REPORT;</div><div class='add'>+</div><div class='add'>+        case EC_STATE_REPORT:</div><div class='add'>+            cbk = fop-&gt;answer;</div><div class='add'>+</div><div class='add'>+            GF_ASSERT(cbk != NULL);</div><div class='add'>+</div><div class='add'>+            if (fop-&gt;cbks.opendir != NULL) {</div><div class='add'>+                fop-&gt;cbks.opendir(fop-&gt;req_frame, fop, fop-&gt;xl, cbk-&gt;op_ret,</div><div class='add'>+                                  cbk-&gt;op_errno, cbk-&gt;fd, cbk-&gt;xdata);</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            return EC_STATE_LOCK_REUSE;</div><div class='add'>+</div><div class='add'>+        case -EC_STATE_INIT:</div><div class='add'>+        case -EC_STATE_LOCK:</div><div class='add'>+        case -EC_STATE_DISPATCH:</div><div class='add'>+        case -EC_STATE_PREPARE_ANSWER:</div><div class='add'>+        case -EC_STATE_REPORT:</div><div class='add'>+            GF_ASSERT(fop-&gt;error != 0);</div><div class='add'>+</div><div class='add'>+            if (fop-&gt;cbks.opendir != NULL) {</div><div class='add'>+                fop-&gt;cbks.opendir(fop-&gt;req_frame, fop, fop-&gt;xl, -1, fop-&gt;error,</div><div class='add'>+                                  NULL, NULL);</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            return EC_STATE_LOCK_REUSE;</div><div class='add'>+</div><div class='add'>+        case -EC_STATE_LOCK_REUSE:</div><div class='add'>+        case EC_STATE_LOCK_REUSE:</div><div class='add'>+            ec_lock_reuse(fop);</div><div class='add'>+</div><div class='add'>+            return EC_STATE_UNLOCK;</div><div class='add'>+</div><div class='add'>+        case -EC_STATE_UNLOCK:</div><div class='add'>+        case EC_STATE_UNLOCK:</div><div class='add'>+            ec_unlock(fop);</div><div class='add'>+</div><div class='add'>+            return EC_STATE_END;</div><div class='add'>+</div><div class='add'>+        default:</div><div class='add'>+            gf_msg(fop-&gt;xl-&gt;name, GF_LOG_ERROR, EINVAL, EC_MSG_UNHANDLED_STATE,</div><div class='add'>+                   "Unhandled state %d for %s", state, ec_fop_name(fop-&gt;id));</div><div class='add'>+</div><div class='add'>+            return EC_STATE_END;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_opendir(call_frame_t *frame, xlator_t *this, uintptr_t target,</div><div class='add'>+           uint32_t fop_flags, fop_opendir_cbk_t func, void *data, loc_t *loc,</div><div class='add'>+           fd_t *fd, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    ec_cbk_t callback = {.opendir = func};</div><div class='add'>+    ec_fop_data_t *fop = NULL;</div><div class='add'>+    int32_t error = ENOMEM;</div><div class='add'>+</div><div class='add'>+    gf_msg_trace("ec", 0, "EC(OPENDIR) %p", frame);</div><div class='add'>+</div><div class='add'>+    VALIDATE_OR_GOTO(this, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, frame, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, this-&gt;private, out);</div><div class='add'>+</div><div class='add'>+    fop = ec_fop_data_allocate(frame, this, GF_FOP_OPENDIR, EC_FLAG_LOCK_SHARED,</div><div class='add'>+                               target, fop_flags, ec_wind_opendir,</div><div class='add'>+                               ec_manager_opendir, callback, data);</div><div class='add'>+    if (fop == NULL) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (loc != NULL) {</div><div class='add'>+        if (loc_copy(&amp;fop-&gt;loc[0], loc) != 0) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, ENOMEM, EC_MSG_LOC_COPY_FAIL,</div><div class='add'>+                   "Failed to copy a location.");</div><div class='add'>+</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    if (fd != NULL) {</div><div class='add'>+        fop-&gt;fd = fd_ref(fd);</div><div class='add'>+        if (fop-&gt;fd == NULL) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, 0, EC_MSG_FILE_DESC_REF_FAIL,</div><div class='add'>+                   "Failed to reference a "</div><div class='add'>+                   "file descriptor.");</div><div class='add'>+</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    if (xdata != NULL) {</div><div class='add'>+        fop-&gt;xdata = dict_ref(xdata);</div><div class='add'>+        if (fop-&gt;xdata == NULL) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, 0, EC_MSG_DICT_REF_FAIL,</div><div class='add'>+                   "Failed to reference a "</div><div class='add'>+                   "dictionary.");</div><div class='add'>+</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    error = 0;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (fop != NULL) {</div><div class='add'>+        ec_manager(fop, error);</div><div class='add'>+    } else {</div><div class='add'>+        func(frame, NULL, this, -1, error, NULL, NULL);</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* Returns -1 if client_id is invalid else index of child subvol in xl_list */</div><div class='add'>+int</div><div class='add'>+ec_deitransform(xlator_t *this, off_t offset)</div><div class='add'>+{</div><div class='add'>+    int idx = -1;</div><div class='add'>+    int client_id = -1;</div><div class='add'>+    ec_t *ec = this-&gt;private;</div><div class='add'>+    char id[32] = {0};</div><div class='add'>+    int err;</div><div class='add'>+</div><div class='add'>+    client_id = gf_deitransform(this, offset);</div><div class='add'>+    sprintf(id, "%d", client_id);</div><div class='add'>+    err = dict_get_int32(ec-&gt;leaf_to_subvolid, id, &amp;idx);</div><div class='add'>+    if (err &lt; 0) {</div><div class='add'>+        idx = err;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (idx &lt; 0) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_ERROR, EINVAL, EC_MSG_INVALID_REQUEST,</div><div class='add'>+               "Invalid index %d in readdirp request", client_id);</div><div class='add'>+        idx = -EINVAL;</div><div class='add'>+    }</div><div class='add'>+    return idx;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* FOP: readdir */</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_adjust_readdirp(ec_t *ec, int32_t idx, gf_dirent_t *entries)</div><div class='add'>+{</div><div class='add'>+    gf_dirent_t *entry;</div><div class='add'>+</div><div class='add'>+    list_for_each_entry(entry, &amp;entries-&gt;list, list)</div><div class='add'>+    {</div><div class='add'>+        if (!entry-&gt;inode)</div><div class='add'>+            continue;</div><div class='add'>+</div><div class='add'>+        if (entry-&gt;d_stat.ia_type == IA_IFREG) {</div><div class='add'>+            if ((entry-&gt;dict == NULL) ||</div><div class='add'>+                (ec_dict_del_number(entry-&gt;dict, EC_XATTR_SIZE,</div><div class='add'>+                                    &amp;entry-&gt;d_stat.ia_size) != 0)) {</div><div class='add'>+                inode_unref(entry-&gt;inode);</div><div class='add'>+                entry-&gt;inode = NULL;</div><div class='add'>+            } else {</div><div class='add'>+                ec_iatt_rebuild(ec, &amp;entry-&gt;d_stat, 1, 1);</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_common_readdir_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                      int32_t op_ret, int32_t op_errno, gf_dirent_t *entries,</div><div class='add'>+                      dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    ec_fop_data_t *fop = NULL;</div><div class='add'>+    ec_cbk_data_t *cbk = NULL;</div><div class='add'>+    int32_t idx = (int32_t)(uintptr_t)cookie;</div><div class='add'>+</div><div class='add'>+    VALIDATE_OR_GOTO(this, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, frame, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, frame-&gt;local, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, this-&gt;private, out);</div><div class='add'>+</div><div class='add'>+    fop = frame-&gt;local;</div><div class='add'>+</div><div class='add'>+    ec_trace("CBK", fop, "idx=%d, frame=%p, op_ret=%d, op_errno=%d", idx, frame,</div><div class='add'>+             op_ret, op_errno);</div><div class='add'>+</div><div class='add'>+    cbk = ec_cbk_data_allocate(frame, this, fop, fop-&gt;id, idx, op_ret,</div><div class='add'>+                               op_errno);</div><div class='add'>+    if (cbk) {</div><div class='add'>+        if (xdata)</div><div class='add'>+            cbk-&gt;xdata = dict_ref(xdata);</div><div class='add'>+        if (cbk-&gt;op_ret &gt;= 0)</div><div class='add'>+            list_splice_init(&amp;entries-&gt;list, &amp;cbk-&gt;entries.list);</div><div class='add'>+        ec_combine(cbk, NULL);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (fop != NULL) {</div><div class='add'>+        ec_complete(fop);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_wind_readdir(ec_t *ec, ec_fop_data_t *fop, int32_t idx)</div><div class='add'>+{</div><div class='add'>+    ec_trace("WIND", fop, "idx=%d", idx);</div><div class='add'>+</div><div class='add'>+    STACK_WIND_COOKIE(fop-&gt;frame, ec_common_readdir_cbk, (void *)(uintptr_t)idx,</div><div class='add'>+                      ec-&gt;xl_list[idx], ec-&gt;xl_list[idx]-&gt;fops-&gt;readdir,</div><div class='add'>+                      fop-&gt;fd, fop-&gt;size, fop-&gt;offset, fop-&gt;xdata);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_manager_readdir(ec_fop_data_t *fop, int32_t state)</div><div class='add'>+{</div><div class='add'>+    ec_fd_t *ctx = NULL;</div><div class='add'>+    ec_cbk_data_t *cbk = NULL;</div><div class='add'>+</div><div class='add'>+    switch (state) {</div><div class='add'>+        case EC_STATE_INIT:</div><div class='add'>+            /* Return error if opendir has not been successfully called on</div><div class='add'>+             * any subvolume. */</div><div class='add'>+            ctx = ec_fd_get(fop-&gt;fd, fop-&gt;xl);</div><div class='add'>+            if (ctx == NULL) {</div><div class='add'>+                fop-&gt;error = ENOMEM;</div><div class='add'>+            } else if (ctx-&gt;open == 0) {</div><div class='add'>+                fop-&gt;error = EBADFD;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            if (fop-&gt;error) {</div><div class='add'>+                gf_msg(fop-&gt;xl-&gt;name, GF_LOG_ERROR, fop-&gt;error,</div><div class='add'>+                       EC_MSG_INVALID_REQUEST, "EC is not winding readdir: %s",</div><div class='add'>+                       ec_msg_str(fop));</div><div class='add'>+                return EC_STATE_REPORT;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            if (fop-&gt;id == GF_FOP_READDIRP) {</div><div class='add'>+                int32_t err;</div><div class='add'>+</div><div class='add'>+                if (fop-&gt;xdata == NULL) {</div><div class='add'>+                    fop-&gt;xdata = dict_new();</div><div class='add'>+                    if (fop-&gt;xdata == NULL) {</div><div class='add'>+                        fop-&gt;error = ENOMEM;</div><div class='add'>+</div><div class='add'>+                        return EC_STATE_REPORT;</div><div class='add'>+                    }</div><div class='add'>+                }</div><div class='add'>+</div><div class='add'>+                err = dict_set_uint64(fop-&gt;xdata, EC_XATTR_SIZE, 0);</div><div class='add'>+                if (err != 0) {</div><div class='add'>+                    fop-&gt;error = -err;</div><div class='add'>+</div><div class='add'>+                    return EC_STATE_REPORT;</div><div class='add'>+                }</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            if (fop-&gt;offset != 0) {</div><div class='add'>+                /* Non-zero offset is irrecoverable error as the offset may not</div><div class='add'>+                 * be valid on other bricks*/</div><div class='add'>+                int32_t idx = -1;</div><div class='add'>+</div><div class='add'>+                idx = ec_deitransform(fop-&gt;xl, fop-&gt;offset);</div><div class='add'>+</div><div class='add'>+                if (idx &lt; 0) {</div><div class='add'>+                    fop-&gt;error = -idx;</div><div class='add'>+                    return EC_STATE_REPORT;</div><div class='add'>+                }</div><div class='add'>+                fop-&gt;mask &amp;= 1ULL &lt;&lt; idx;</div><div class='add'>+            } else {</div><div class='add'>+                ec_lock_prepare_fd(fop, fop-&gt;fd, EC_QUERY_INFO, 0,</div><div class='add'>+                                   EC_RANGE_FULL);</div><div class='add'>+                ec_lock(fop);</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            return EC_STATE_DISPATCH;</div><div class='add'>+</div><div class='add'>+        case EC_STATE_DISPATCH:</div><div class='add'>+            ec_dispatch_one(fop);</div><div class='add'>+</div><div class='add'>+            return EC_STATE_PREPARE_ANSWER;</div><div class='add'>+</div><div class='add'>+        case EC_STATE_PREPARE_ANSWER:</div><div class='add'>+            if (ec_dispatch_one_retry(fop, &amp;cbk)) {</div><div class='add'>+                return EC_STATE_DISPATCH;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            if ((cbk != NULL) &amp;&amp; (cbk-&gt;op_ret &gt; 0) &amp;&amp;</div><div class='add'>+                (fop-&gt;id == GF_FOP_READDIRP)) {</div><div class='add'>+                ec_adjust_readdirp(fop-&gt;xl-&gt;private, cbk-&gt;idx, &amp;cbk-&gt;entries);</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            return EC_STATE_REPORT;</div><div class='add'>+</div><div class='add'>+        case EC_STATE_REPORT:</div><div class='add'>+            cbk = fop-&gt;answer;</div><div class='add'>+            GF_ASSERT(cbk);</div><div class='add'>+            if (fop-&gt;id == GF_FOP_READDIR) {</div><div class='add'>+                if (fop-&gt;cbks.readdir != NULL) {</div><div class='add'>+                    fop-&gt;cbks.readdir(fop-&gt;req_frame, fop, fop-&gt;xl, cbk-&gt;op_ret,</div><div class='add'>+                                      cbk-&gt;op_errno, &amp;cbk-&gt;entries, cbk-&gt;xdata);</div><div class='add'>+                }</div><div class='add'>+            } else {</div><div class='add'>+                if (fop-&gt;cbks.readdirp != NULL) {</div><div class='add'>+                    fop-&gt;cbks.readdirp(fop-&gt;req_frame, fop, fop-&gt;xl,</div><div class='add'>+                                       cbk-&gt;op_ret, cbk-&gt;op_errno,</div><div class='add'>+                                       &amp;cbk-&gt;entries, cbk-&gt;xdata);</div><div class='add'>+                }</div><div class='add'>+            }</div><div class='add'>+            if (fop-&gt;offset == 0)</div><div class='add'>+                return EC_STATE_LOCK_REUSE;</div><div class='add'>+            else</div><div class='add'>+                return EC_STATE_END;</div><div class='add'>+</div><div class='add'>+        case -EC_STATE_INIT:</div><div class='add'>+        case -EC_STATE_LOCK:</div><div class='add'>+        case -EC_STATE_DISPATCH:</div><div class='add'>+        case -EC_STATE_PREPARE_ANSWER:</div><div class='add'>+        case -EC_STATE_REPORT:</div><div class='add'>+            if (fop-&gt;id == GF_FOP_READDIR) {</div><div class='add'>+                if (fop-&gt;cbks.readdir != NULL) {</div><div class='add'>+                    fop-&gt;cbks.readdir(fop-&gt;req_frame, fop, fop-&gt;xl, -1,</div><div class='add'>+                                      fop-&gt;error, NULL, NULL);</div><div class='add'>+                }</div><div class='add'>+            } else {</div><div class='add'>+                if (fop-&gt;cbks.readdirp != NULL) {</div><div class='add'>+                    fop-&gt;cbks.readdirp(fop-&gt;req_frame, fop, fop-&gt;xl, -1,</div><div class='add'>+                                       fop-&gt;error, NULL, NULL);</div><div class='add'>+                }</div><div class='add'>+            }</div><div class='add'>+            if (fop-&gt;offset == 0)</div><div class='add'>+                return EC_STATE_LOCK_REUSE;</div><div class='add'>+            else</div><div class='add'>+                return EC_STATE_END;</div><div class='add'>+</div><div class='add'>+        case -EC_STATE_LOCK_REUSE:</div><div class='add'>+        case EC_STATE_LOCK_REUSE:</div><div class='add'>+            GF_ASSERT(fop-&gt;offset == 0);</div><div class='add'>+            ec_lock_reuse(fop);</div><div class='add'>+</div><div class='add'>+            return EC_STATE_UNLOCK;</div><div class='add'>+</div><div class='add'>+        case -EC_STATE_UNLOCK:</div><div class='add'>+        case EC_STATE_UNLOCK:</div><div class='add'>+            GF_ASSERT(fop-&gt;offset == 0);</div><div class='add'>+            ec_unlock(fop);</div><div class='add'>+</div><div class='add'>+            return EC_STATE_END;</div><div class='add'>+        default:</div><div class='add'>+            gf_msg(fop-&gt;xl-&gt;name, GF_LOG_ERROR, EINVAL, EC_MSG_UNHANDLED_STATE,</div><div class='add'>+                   "Unhandled state %d for %s", state, ec_fop_name(fop-&gt;id));</div><div class='add'>+</div><div class='add'>+            return EC_STATE_END;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_readdir(call_frame_t *frame, xlator_t *this, uintptr_t target,</div><div class='add'>+           uint32_t fop_flags, fop_readdir_cbk_t func, void *data, fd_t *fd,</div><div class='add'>+           size_t size, off_t offset, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    ec_cbk_t callback = {.readdir = func};</div><div class='add'>+    ec_fop_data_t *fop = NULL;</div><div class='add'>+    int32_t error = ENOMEM;</div><div class='add'>+</div><div class='add'>+    gf_msg_trace("ec", 0, "EC(READDIR) %p", frame);</div><div class='add'>+</div><div class='add'>+    VALIDATE_OR_GOTO(this, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, frame, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, this-&gt;private, out);</div><div class='add'>+</div><div class='add'>+    fop = ec_fop_data_allocate(frame, this, GF_FOP_READDIR, EC_FLAG_LOCK_SHARED,</div><div class='add'>+                               target, fop_flags, ec_wind_readdir,</div><div class='add'>+                               ec_manager_readdir, callback, data);</div><div class='add'>+    if (fop == NULL) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    fop-&gt;use_fd = 1;</div><div class='add'>+</div><div class='add'>+    fop-&gt;size = size;</div><div class='add'>+    fop-&gt;offset = offset;</div><div class='add'>+</div><div class='add'>+    if (fd != NULL) {</div><div class='add'>+        fop-&gt;fd = fd_ref(fd);</div><div class='add'>+        if (fop-&gt;fd == NULL) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, 0, EC_MSG_FILE_DESC_REF_FAIL,</div><div class='add'>+                   "Failed to reference a "</div><div class='add'>+                   "file descriptor.");</div><div class='add'>+</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    if (xdata != NULL) {</div><div class='add'>+        fop-&gt;xdata = dict_ref(xdata);</div><div class='add'>+        if (fop-&gt;xdata == NULL) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, 0, EC_MSG_DICT_REF_FAIL,</div><div class='add'>+                   "Failed to reference a "</div><div class='add'>+                   "dictionary.");</div><div class='add'>+</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    error = 0;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (fop != NULL) {</div><div class='add'>+        ec_manager(fop, error);</div><div class='add'>+    } else {</div><div class='add'>+        func(frame, NULL, this, -1, error, NULL, NULL);</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* FOP: readdirp */</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_wind_readdirp(ec_t *ec, ec_fop_data_t *fop, int32_t idx)</div><div class='add'>+{</div><div class='add'>+    ec_trace("WIND", fop, "idx=%d", idx);</div><div class='add'>+</div><div class='add'>+    STACK_WIND_COOKIE(fop-&gt;frame, ec_common_readdir_cbk, (void *)(uintptr_t)idx,</div><div class='add'>+                      ec-&gt;xl_list[idx], ec-&gt;xl_list[idx]-&gt;fops-&gt;readdirp,</div><div class='add'>+                      fop-&gt;fd, fop-&gt;size, fop-&gt;offset, fop-&gt;xdata);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_readdirp(call_frame_t *frame, xlator_t *this, uintptr_t target,</div><div class='add'>+            uint32_t fop_flags, fop_readdirp_cbk_t func, void *data, fd_t *fd,</div><div class='add'>+            size_t size, off_t offset, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    ec_cbk_t callback = {.readdirp = func};</div><div class='add'>+    ec_fop_data_t *fop = NULL;</div><div class='add'>+    int32_t error = ENOMEM;</div><div class='add'>+</div><div class='add'>+    gf_msg_trace("ec", 0, "EC(READDIRP) %p", frame);</div><div class='add'>+</div><div class='add'>+    VALIDATE_OR_GOTO(this, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, frame, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, this-&gt;private, out);</div><div class='add'>+</div><div class='add'>+    fop = ec_fop_data_allocate(</div><div class='add'>+        frame, this, GF_FOP_READDIRP, EC_FLAG_LOCK_SHARED, target, fop_flags,</div><div class='add'>+        ec_wind_readdirp, ec_manager_readdir, callback, data);</div><div class='add'>+    if (fop == NULL) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    fop-&gt;use_fd = 1;</div><div class='add'>+</div><div class='add'>+    fop-&gt;size = size;</div><div class='add'>+    fop-&gt;offset = offset;</div><div class='add'>+</div><div class='add'>+    if (fd != NULL) {</div><div class='add'>+        fop-&gt;fd = fd_ref(fd);</div><div class='add'>+        if (fop-&gt;fd == NULL) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, 0, EC_MSG_FILE_DESC_REF_FAIL,</div><div class='add'>+                   "Failed to reference a "</div><div class='add'>+                   "file descriptor.");</div><div class='add'>+</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    if (xdata != NULL) {</div><div class='add'>+        fop-&gt;xdata = dict_ref(xdata);</div><div class='add'>+        if (fop-&gt;xdata == NULL) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, 0, EC_MSG_DICT_REF_FAIL,</div><div class='add'>+                   "Failed to reference a "</div><div class='add'>+                   "dictionary.");</div><div class='add'>+</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    error = 0;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (fop != NULL) {</div><div class='add'>+        ec_manager(fop, error);</div><div class='add'>+    } else {</div><div class='add'>+        func(frame, NULL, this, -1, error, NULL, NULL);</div><div class='add'>+    }</div><div class='add'>+}</div><div class='head'>diff --git a/xlators/cluster/ec/src/ec-dir-write.c b/xlators/cluster/ec/src/ec-dir-write.c<br/>new file mode 100644<br/>index 00000000000..53d27d895c3<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/xlators/cluster/ec/src/ec-dir-write.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>xlators/cluster/ec/src/ec-dir-write.c</a></div><div class='hunk'>@@ -0,0 +1,1487 @@</div><div class='add'>+/*</div><div class='add'>+  Copyright (c) 2012-2014 DataLab, s.l. &lt;http://www.datalab.es&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#include "ec.h"</div><div class='add'>+#include "ec-messages.h"</div><div class='add'>+#include "ec-helpers.h"</div><div class='add'>+#include "ec-common.h"</div><div class='add'>+#include "ec-combine.h"</div><div class='add'>+#include "ec-method.h"</div><div class='add'>+#include "ec-fops.h"</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+ec_dir_write_cbk(call_frame_t *frame, xlator_t *this, void *cookie, int op_ret,</div><div class='add'>+                 int op_errno, struct iatt *poststat, struct iatt *preparent,</div><div class='add'>+                 struct iatt *postparent, struct iatt *preparent2,</div><div class='add'>+                 struct iatt *postparent2, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    ec_fop_data_t *fop = NULL;</div><div class='add'>+    ec_cbk_data_t *cbk = NULL;</div><div class='add'>+    int i = 0;</div><div class='add'>+    int idx = 0;</div><div class='add'>+</div><div class='add'>+    VALIDATE_OR_GOTO(this, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, frame, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, frame-&gt;local, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, this-&gt;private, out);</div><div class='add'>+</div><div class='add'>+    fop = frame-&gt;local;</div><div class='add'>+    idx = (long)cookie;</div><div class='add'>+</div><div class='add'>+    ec_trace("CBK", fop, "idx=%d, frame=%p, op_ret=%d, op_errno=%d", idx, frame,</div><div class='add'>+             op_ret, op_errno);</div><div class='add'>+</div><div class='add'>+    cbk = ec_cbk_data_allocate(frame, this, fop, fop-&gt;id, idx, op_ret,</div><div class='add'>+                               op_errno);</div><div class='add'>+    if (!cbk)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    if (xdata)</div><div class='add'>+        cbk-&gt;xdata = dict_ref(xdata);</div><div class='add'>+</div><div class='add'>+    if (op_ret &lt; 0)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    if (poststat)</div><div class='add'>+        cbk-&gt;iatt[i++] = *poststat;</div><div class='add'>+</div><div class='add'>+    if (preparent)</div><div class='add'>+        cbk-&gt;iatt[i++] = *preparent;</div><div class='add'>+</div><div class='add'>+    if (postparent)</div><div class='add'>+        cbk-&gt;iatt[i++] = *postparent;</div><div class='add'>+</div><div class='add'>+    if (preparent2)</div><div class='add'>+        cbk-&gt;iatt[i++] = *preparent2;</div><div class='add'>+</div><div class='add'>+    if (postparent2)</div><div class='add'>+        cbk-&gt;iatt[i++] = *postparent2;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (cbk)</div><div class='add'>+        ec_combine(cbk, ec_combine_write);</div><div class='add'>+</div><div class='add'>+    if (fop)</div><div class='add'>+        ec_complete(fop);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* FOP: create */</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_create_cbk(call_frame_t *frame, void *cookie, xlator_t *this, int32_t op_ret,</div><div class='add'>+              int32_t op_errno, fd_t *fd, inode_t *inode, struct iatt *buf,</div><div class='add'>+              struct iatt *preparent, struct iatt *postparent, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    return ec_dir_write_cbk(frame, this, cookie, op_ret, op_errno, buf,</div><div class='add'>+                            preparent, postparent, NULL, NULL, xdata);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_wind_create(ec_t *ec, ec_fop_data_t *fop, int32_t idx)</div><div class='add'>+{</div><div class='add'>+    ec_trace("WIND", fop, "idx=%d", idx);</div><div class='add'>+</div><div class='add'>+    STACK_WIND_COOKIE(fop-&gt;frame, ec_create_cbk, (void *)(uintptr_t)idx,</div><div class='add'>+                      ec-&gt;xl_list[idx], ec-&gt;xl_list[idx]-&gt;fops-&gt;create,</div><div class='add'>+                      &amp;fop-&gt;loc[0], fop-&gt;int32, fop-&gt;mode[0], fop-&gt;mode[1],</div><div class='add'>+                      fop-&gt;fd, fop-&gt;xdata);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_manager_create(ec_fop_data_t *fop, int32_t state)</div><div class='add'>+{</div><div class='add'>+    ec_config_t config;</div><div class='add'>+    ec_t *ec;</div><div class='add'>+    ec_cbk_data_t *cbk;</div><div class='add'>+    ec_fd_t *ctx;</div><div class='add'>+    uint64_t version[2] = {0, 0};</div><div class='add'>+    int32_t err;</div><div class='add'>+</div><div class='add'>+    switch (state) {</div><div class='add'>+        case EC_STATE_INIT:</div><div class='add'>+            LOCK(&amp;fop-&gt;fd-&gt;lock);</div><div class='add'>+</div><div class='add'>+            ctx = __ec_fd_get(fop-&gt;fd, fop-&gt;xl);</div><div class='add'>+            if (ctx == NULL) {</div><div class='add'>+                UNLOCK(&amp;fop-&gt;fd-&gt;lock);</div><div class='add'>+</div><div class='add'>+                fop-&gt;error = ENOMEM;</div><div class='add'>+</div><div class='add'>+                return EC_STATE_REPORT;</div><div class='add'>+            }</div><div class='add'>+            err = ec_loc_from_loc(fop-&gt;xl, &amp;ctx-&gt;loc, &amp;fop-&gt;loc[0]);</div><div class='add'>+            if (err != 0) {</div><div class='add'>+                UNLOCK(&amp;fop-&gt;fd-&gt;lock);</div><div class='add'>+</div><div class='add'>+                fop-&gt;error = -err;</div><div class='add'>+</div><div class='add'>+                return EC_STATE_REPORT;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            ctx-&gt;flags = fop-&gt;int32;</div><div class='add'>+</div><div class='add'>+            UNLOCK(&amp;fop-&gt;fd-&gt;lock);</div><div class='add'>+</div><div class='add'>+            if (fop-&gt;xdata == NULL) {</div><div class='add'>+                fop-&gt;xdata = dict_new();</div><div class='add'>+                if (fop-&gt;xdata == NULL) {</div><div class='add'>+                    fop-&gt;error = ENOMEM;</div><div class='add'>+</div><div class='add'>+                    return EC_STATE_REPORT;</div><div class='add'>+                }</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            ec = fop-&gt;xl-&gt;private;</div><div class='add'>+</div><div class='add'>+            config.version = EC_CONFIG_VERSION;</div><div class='add'>+            config.algorithm = EC_CONFIG_ALGORITHM;</div><div class='add'>+            config.gf_word_size = EC_GF_BITS;</div><div class='add'>+            config.bricks = ec-&gt;nodes;</div><div class='add'>+            config.redundancy = ec-&gt;redundancy;</div><div class='add'>+            config.chunk_size = EC_METHOD_CHUNK_SIZE;</div><div class='add'>+</div><div class='add'>+            err = ec_dict_set_config(fop-&gt;xdata, EC_XATTR_CONFIG, &amp;config);</div><div class='add'>+            if (err != 0) {</div><div class='add'>+                fop-&gt;error = -err;</div><div class='add'>+</div><div class='add'>+                return EC_STATE_REPORT;</div><div class='add'>+            }</div><div class='add'>+            err = ec_dict_set_array(fop-&gt;xdata, EC_XATTR_VERSION, version,</div><div class='add'>+                                    EC_VERSION_SIZE);</div><div class='add'>+            if (err != 0) {</div><div class='add'>+                fop-&gt;error = -err;</div><div class='add'>+</div><div class='add'>+                return EC_STATE_REPORT;</div><div class='add'>+            }</div><div class='add'>+            err = ec_dict_set_number(fop-&gt;xdata, EC_XATTR_SIZE, 0);</div><div class='add'>+            if (err != 0) {</div><div class='add'>+                fop-&gt;error = -err;</div><div class='add'>+</div><div class='add'>+                return EC_STATE_REPORT;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            /* We need to write to specific offsets on the bricks, so we</div><div class='add'>+             * need to remove O_APPEND from flags (if present) */</div><div class='add'>+            fop-&gt;int32 &amp;= ~O_APPEND;</div><div class='add'>+</div><div class='add'>+            /* Fall through */</div><div class='add'>+</div><div class='add'>+        case EC_STATE_LOCK:</div><div class='add'>+            ec_lock_prepare_parent_inode(fop, &amp;fop-&gt;loc[0], NULL,</div><div class='add'>+                                         EC_UPDATE_DATA | EC_UPDATE_META);</div><div class='add'>+            ec_lock(fop);</div><div class='add'>+</div><div class='add'>+            return EC_STATE_DISPATCH;</div><div class='add'>+</div><div class='add'>+        case EC_STATE_DISPATCH:</div><div class='add'>+            ec_dispatch_all(fop);</div><div class='add'>+</div><div class='add'>+            return EC_STATE_PREPARE_ANSWER;</div><div class='add'>+</div><div class='add'>+        case EC_STATE_PREPARE_ANSWER:</div><div class='add'>+            cbk = ec_fop_prepare_answer(fop, _gf_false);</div><div class='add'>+            if (cbk != NULL) {</div><div class='add'>+                int32_t err;</div><div class='add'>+</div><div class='add'>+                ec_iatt_rebuild(fop-&gt;xl-&gt;private, cbk-&gt;iatt, 3, cbk-&gt;count);</div><div class='add'>+</div><div class='add'>+                err = ec_loc_update(fop-&gt;xl, &amp;fop-&gt;loc[0], cbk-&gt;inode,</div><div class='add'>+                                    &amp;cbk-&gt;iatt[0]);</div><div class='add'>+                if (!ec_cbk_set_error(cbk, -err, _gf_false)) {</div><div class='add'>+                    LOCK(&amp;fop-&gt;fd-&gt;lock);</div><div class='add'>+</div><div class='add'>+                    ctx = __ec_fd_get(fop-&gt;fd, fop-&gt;xl);</div><div class='add'>+                    if (ctx != NULL) {</div><div class='add'>+                        ctx-&gt;open |= cbk-&gt;mask;</div><div class='add'>+                    }</div><div class='add'>+</div><div class='add'>+                    UNLOCK(&amp;fop-&gt;fd-&gt;lock);</div><div class='add'>+                }</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            return EC_STATE_REPORT;</div><div class='add'>+</div><div class='add'>+        case EC_STATE_REPORT:</div><div class='add'>+            cbk = fop-&gt;answer;</div><div class='add'>+</div><div class='add'>+            GF_ASSERT(cbk != NULL);</div><div class='add'>+</div><div class='add'>+            if (fop-&gt;cbks.create != NULL) {</div><div class='add'>+                QUORUM_CBK(fop-&gt;cbks.create, fop, fop-&gt;req_frame, fop, fop-&gt;xl,</div><div class='add'>+                           cbk-&gt;op_ret, cbk-&gt;op_errno, fop-&gt;fd,</div><div class='add'>+                           fop-&gt;loc[0].inode, &amp;cbk-&gt;iatt[0], &amp;cbk-&gt;iatt[1],</div><div class='add'>+                           &amp;cbk-&gt;iatt[2], cbk-&gt;xdata);</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            return EC_STATE_LOCK_REUSE;</div><div class='add'>+</div><div class='add'>+        case -EC_STATE_INIT:</div><div class='add'>+        case -EC_STATE_LOCK:</div><div class='add'>+        case -EC_STATE_DISPATCH:</div><div class='add'>+        case -EC_STATE_PREPARE_ANSWER:</div><div class='add'>+        case -EC_STATE_REPORT:</div><div class='add'>+            GF_ASSERT(fop-&gt;error != 0);</div><div class='add'>+</div><div class='add'>+            if (fop-&gt;cbks.create != NULL) {</div><div class='add'>+                fop-&gt;cbks.create(fop-&gt;req_frame, fop, fop-&gt;xl, -1, fop-&gt;error,</div><div class='add'>+                                 NULL, NULL, NULL, NULL, NULL, NULL);</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            return EC_STATE_LOCK_REUSE;</div><div class='add'>+</div><div class='add'>+        case -EC_STATE_LOCK_REUSE:</div><div class='add'>+        case EC_STATE_LOCK_REUSE:</div><div class='add'>+            ec_lock_reuse(fop);</div><div class='add'>+</div><div class='add'>+            return EC_STATE_UNLOCK;</div><div class='add'>+</div><div class='add'>+        case -EC_STATE_UNLOCK:</div><div class='add'>+        case EC_STATE_UNLOCK:</div><div class='add'>+            ec_unlock(fop);</div><div class='add'>+</div><div class='add'>+            return EC_STATE_END;</div><div class='add'>+</div><div class='add'>+        default:</div><div class='add'>+            gf_msg(fop-&gt;xl-&gt;name, GF_LOG_ERROR, EINVAL, EC_MSG_UNHANDLED_STATE,</div><div class='add'>+                   "Unhandled state %d for %s", state, ec_fop_name(fop-&gt;id));</div><div class='add'>+</div><div class='add'>+            return EC_STATE_END;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_create(call_frame_t *frame, xlator_t *this, uintptr_t target,</div><div class='add'>+          uint32_t fop_flags, fop_create_cbk_t func, void *data, loc_t *loc,</div><div class='add'>+          int32_t flags, mode_t mode, mode_t umask, fd_t *fd, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    ec_cbk_t callback = {.create = func};</div><div class='add'>+    ec_fop_data_t *fop = NULL;</div><div class='add'>+    int32_t error = ENOMEM;</div><div class='add'>+</div><div class='add'>+    gf_msg_trace("ec", 0, "EC(CREATE) %p", frame);</div><div class='add'>+</div><div class='add'>+    VALIDATE_OR_GOTO(this, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, frame, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, this-&gt;private, out);</div><div class='add'>+</div><div class='add'>+    fop = ec_fop_data_allocate(frame, this, GF_FOP_CREATE, 0, target, fop_flags,</div><div class='add'>+                               ec_wind_create, ec_manager_create, callback,</div><div class='add'>+                               data);</div><div class='add'>+    if (fop == NULL) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    fop-&gt;int32 = flags;</div><div class='add'>+    fop-&gt;mode[0] = mode;</div><div class='add'>+    fop-&gt;mode[1] = umask;</div><div class='add'>+</div><div class='add'>+    if (loc != NULL) {</div><div class='add'>+        if (loc_copy(&amp;fop-&gt;loc[0], loc) != 0) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, ENOMEM, EC_MSG_LOC_COPY_FAIL,</div><div class='add'>+                   "Failed to copy a location.");</div><div class='add'>+</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    if (fd != NULL) {</div><div class='add'>+        fop-&gt;fd = fd_ref(fd);</div><div class='add'>+        if (fop-&gt;fd == NULL) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, 0, EC_MSG_FILE_DESC_REF_FAIL,</div><div class='add'>+                   "Failed to reference a "</div><div class='add'>+                   "file descriptor.");</div><div class='add'>+</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    if (xdata != NULL) {</div><div class='add'>+        fop-&gt;xdata = dict_copy_with_ref(xdata, NULL);</div><div class='add'>+        if (fop-&gt;xdata == NULL) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, 0, EC_MSG_DICT_REF_FAIL,</div><div class='add'>+                   "Failed to reference a "</div><div class='add'>+                   "dictionary.");</div><div class='add'>+</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    error = 0;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (fop != NULL) {</div><div class='add'>+        ec_manager(fop, error);</div><div class='add'>+    } else {</div><div class='add'>+        func(frame, NULL, this, -1, error, NULL, NULL, NULL, NULL, NULL, NULL);</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* FOP: link */</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_link_cbk(call_frame_t *frame, void *cookie, xlator_t *this, int32_t op_ret,</div><div class='add'>+            int32_t op_errno, inode_t *inode, struct iatt *buf,</div><div class='add'>+            struct iatt *preparent, struct iatt *postparent, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    return ec_dir_write_cbk(frame, this, cookie, op_ret, op_errno, buf,</div><div class='add'>+                            preparent, postparent, NULL, NULL, xdata);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_wind_link(ec_t *ec, ec_fop_data_t *fop, int32_t idx)</div><div class='add'>+{</div><div class='add'>+    ec_trace("WIND", fop, "idx=%d", idx);</div><div class='add'>+</div><div class='add'>+    STACK_WIND_COOKIE(fop-&gt;frame, ec_link_cbk, (void *)(uintptr_t)idx,</div><div class='add'>+                      ec-&gt;xl_list[idx], ec-&gt;xl_list[idx]-&gt;fops-&gt;link,</div><div class='add'>+                      &amp;fop-&gt;loc[0], &amp;fop-&gt;loc[1], fop-&gt;xdata);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_manager_link(ec_fop_data_t *fop, int32_t state)</div><div class='add'>+{</div><div class='add'>+    ec_cbk_data_t *cbk;</div><div class='add'>+</div><div class='add'>+    switch (state) {</div><div class='add'>+        case EC_STATE_INIT:</div><div class='add'>+        case EC_STATE_LOCK:</div><div class='add'>+            ec_lock_prepare_parent_inode(</div><div class='add'>+                fop, &amp;fop-&gt;loc[1], &amp;fop-&gt;loc[0],</div><div class='add'>+                EC_UPDATE_DATA | EC_UPDATE_META | EC_INODE_SIZE);</div><div class='add'>+            ec_lock(fop);</div><div class='add'>+</div><div class='add'>+            return EC_STATE_DISPATCH;</div><div class='add'>+</div><div class='add'>+        case EC_STATE_DISPATCH:</div><div class='add'>+            ec_dispatch_all(fop);</div><div class='add'>+</div><div class='add'>+            return EC_STATE_PREPARE_ANSWER;</div><div class='add'>+</div><div class='add'>+        case EC_STATE_PREPARE_ANSWER:</div><div class='add'>+            cbk = ec_fop_prepare_answer(fop, _gf_false);</div><div class='add'>+            if (cbk != NULL) {</div><div class='add'>+                int32_t err;</div><div class='add'>+</div><div class='add'>+                ec_iatt_rebuild(fop-&gt;xl-&gt;private, cbk-&gt;iatt, 3, cbk-&gt;count);</div><div class='add'>+</div><div class='add'>+                if (cbk-&gt;iatt[0].ia_type == IA_IFREG) {</div><div class='add'>+                    cbk-&gt;iatt[0].ia_size = fop-&gt;locks[0].size;</div><div class='add'>+                }</div><div class='add'>+</div><div class='add'>+                err = ec_loc_update(fop-&gt;xl, &amp;fop-&gt;loc[0], cbk-&gt;inode,</div><div class='add'>+                                    &amp;cbk-&gt;iatt[0]);</div><div class='add'>+                ec_cbk_set_error(cbk, -err, _gf_false);</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            return EC_STATE_REPORT;</div><div class='add'>+</div><div class='add'>+        case EC_STATE_REPORT:</div><div class='add'>+            cbk = fop-&gt;answer;</div><div class='add'>+</div><div class='add'>+            GF_ASSERT(cbk != NULL);</div><div class='add'>+</div><div class='add'>+            if (fop-&gt;cbks.link != NULL) {</div><div class='add'>+                QUORUM_CBK(fop-&gt;cbks.link, fop, fop-&gt;req_frame, fop, fop-&gt;xl,</div><div class='add'>+                           cbk-&gt;op_ret, cbk-&gt;op_errno, fop-&gt;loc[0].inode,</div><div class='add'>+                           &amp;cbk-&gt;iatt[0], &amp;cbk-&gt;iatt[1], &amp;cbk-&gt;iatt[2],</div><div class='add'>+                           cbk-&gt;xdata);</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            return EC_STATE_LOCK_REUSE;</div><div class='add'>+</div><div class='add'>+        case -EC_STATE_INIT:</div><div class='add'>+        case -EC_STATE_LOCK:</div><div class='add'>+        case -EC_STATE_DISPATCH:</div><div class='add'>+        case -EC_STATE_PREPARE_ANSWER:</div><div class='add'>+        case -EC_STATE_REPORT:</div><div class='add'>+            GF_ASSERT(fop-&gt;error != 0);</div><div class='add'>+</div><div class='add'>+            if (fop-&gt;cbks.link != NULL) {</div><div class='add'>+                fop-&gt;cbks.link(fop-&gt;req_frame, fop, fop-&gt;xl, -1, fop-&gt;error,</div><div class='add'>+                               NULL, NULL, NULL, NULL, NULL);</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            return EC_STATE_LOCK_REUSE;</div><div class='add'>+</div><div class='add'>+        case -EC_STATE_LOCK_REUSE:</div><div class='add'>+        case EC_STATE_LOCK_REUSE:</div><div class='add'>+            ec_lock_reuse(fop);</div><div class='add'>+</div><div class='add'>+            return EC_STATE_UNLOCK;</div><div class='add'>+</div><div class='add'>+        case -EC_STATE_UNLOCK:</div><div class='add'>+        case EC_STATE_UNLOCK:</div><div class='add'>+            ec_unlock(fop);</div><div class='add'>+</div><div class='add'>+            return EC_STATE_END;</div><div class='add'>+</div><div class='add'>+        default:</div><div class='add'>+            gf_msg(fop-&gt;xl-&gt;name, GF_LOG_ERROR, EINVAL, EC_MSG_UNHANDLED_STATE,</div><div class='add'>+                   "Unhandled state %d for %s", state, ec_fop_name(fop-&gt;id));</div><div class='add'>+</div><div class='add'>+            return EC_STATE_END;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_link(call_frame_t *frame, xlator_t *this, uintptr_t target,</div><div class='add'>+        uint32_t fop_flags, fop_link_cbk_t func, void *data, loc_t *oldloc,</div><div class='add'>+        loc_t *newloc, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    ec_cbk_t callback = {.link = func};</div><div class='add'>+    ec_fop_data_t *fop = NULL;</div><div class='add'>+    int32_t error = ENOMEM;</div><div class='add'>+</div><div class='add'>+    gf_msg_trace("ec", 0, "EC(LINK) %p", frame);</div><div class='add'>+</div><div class='add'>+    VALIDATE_OR_GOTO(this, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, frame, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, this-&gt;private, out);</div><div class='add'>+</div><div class='add'>+    fop = ec_fop_data_allocate(frame, this, GF_FOP_LINK, 0, target, fop_flags,</div><div class='add'>+                               ec_wind_link, ec_manager_link, callback, data);</div><div class='add'>+    if (fop == NULL) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (oldloc != NULL) {</div><div class='add'>+        if (loc_copy(&amp;fop-&gt;loc[0], oldloc) != 0) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, ENOMEM, EC_MSG_LOC_COPY_FAIL,</div><div class='add'>+                   "Failed to copy a location.");</div><div class='add'>+</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    if (newloc != NULL) {</div><div class='add'>+        if (loc_copy(&amp;fop-&gt;loc[1], newloc) != 0) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, ENOMEM, EC_MSG_LOC_COPY_FAIL,</div><div class='add'>+                   "Failed to copy a location.");</div><div class='add'>+</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    if (xdata != NULL) {</div><div class='add'>+        fop-&gt;xdata = dict_copy_with_ref(xdata, NULL);</div><div class='add'>+        if (fop-&gt;xdata == NULL) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, 0, EC_MSG_DICT_REF_FAIL,</div><div class='add'>+                   "Failed to reference a "</div><div class='add'>+                   "dictionary.");</div><div class='add'>+</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    error = 0;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (fop != NULL) {</div><div class='add'>+        ec_manager(fop, error);</div><div class='add'>+    } else {</div><div class='add'>+        func(frame, NULL, this, -1, error, NULL, NULL, NULL, NULL, NULL);</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* FOP: mkdir */</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_mkdir_cbk(call_frame_t *frame, void *cookie, xlator_t *this, int32_t op_ret,</div><div class='add'>+             int32_t op_errno, inode_t *inode, struct iatt *buf,</div><div class='add'>+             struct iatt *preparent, struct iatt *postparent, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    return ec_dir_write_cbk(frame, this, cookie, op_ret, op_errno, buf,</div><div class='add'>+                            preparent, postparent, NULL, NULL, xdata);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_wind_mkdir(ec_t *ec, ec_fop_data_t *fop, int32_t idx)</div><div class='add'>+{</div><div class='add'>+    ec_trace("WIND", fop, "idx=%d", idx);</div><div class='add'>+</div><div class='add'>+    STACK_WIND_COOKIE(fop-&gt;frame, ec_mkdir_cbk, (void *)(uintptr_t)idx,</div><div class='add'>+                      ec-&gt;xl_list[idx], ec-&gt;xl_list[idx]-&gt;fops-&gt;mkdir,</div><div class='add'>+                      &amp;fop-&gt;loc[0], fop-&gt;mode[0], fop-&gt;mode[1], fop-&gt;xdata);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_manager_mkdir(ec_fop_data_t *fop, int32_t state)</div><div class='add'>+{</div><div class='add'>+    ec_cbk_data_t *cbk;</div><div class='add'>+    uint64_t version[2] = {0, 0};</div><div class='add'>+    int32_t err;</div><div class='add'>+</div><div class='add'>+    switch (state) {</div><div class='add'>+        case EC_STATE_INIT:</div><div class='add'>+            if (fop-&gt;xdata == NULL) {</div><div class='add'>+                fop-&gt;xdata = dict_new();</div><div class='add'>+                if (fop-&gt;xdata == NULL) {</div><div class='add'>+                    fop-&gt;error = ENOMEM;</div><div class='add'>+</div><div class='add'>+                    return EC_STATE_REPORT;</div><div class='add'>+                }</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            err = ec_dict_set_array(fop-&gt;xdata, EC_XATTR_VERSION, version,</div><div class='add'>+                                    EC_VERSION_SIZE);</div><div class='add'>+            if (err != 0) {</div><div class='add'>+                fop-&gt;error = -err;</div><div class='add'>+                return EC_STATE_REPORT;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            /* Fall through */</div><div class='add'>+</div><div class='add'>+        case EC_STATE_LOCK:</div><div class='add'>+            ec_lock_prepare_parent_inode(fop, &amp;fop-&gt;loc[0], NULL,</div><div class='add'>+                                         EC_UPDATE_DATA | EC_UPDATE_META);</div><div class='add'>+            ec_lock(fop);</div><div class='add'>+</div><div class='add'>+            return EC_STATE_DISPATCH;</div><div class='add'>+</div><div class='add'>+        case EC_STATE_DISPATCH:</div><div class='add'>+            ec_dispatch_all(fop);</div><div class='add'>+</div><div class='add'>+            return EC_STATE_PREPARE_ANSWER;</div><div class='add'>+</div><div class='add'>+        case EC_STATE_PREPARE_ANSWER:</div><div class='add'>+            cbk = ec_fop_prepare_answer(fop, _gf_false);</div><div class='add'>+            if (cbk != NULL) {</div><div class='add'>+                int32_t err;</div><div class='add'>+</div><div class='add'>+                ec_iatt_rebuild(fop-&gt;xl-&gt;private, cbk-&gt;iatt, 3, cbk-&gt;count);</div><div class='add'>+</div><div class='add'>+                err = ec_loc_update(fop-&gt;xl, &amp;fop-&gt;loc[0], cbk-&gt;inode,</div><div class='add'>+                                    &amp;cbk-&gt;iatt[0]);</div><div class='add'>+                ec_cbk_set_error(cbk, -err, _gf_false);</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            return EC_STATE_REPORT;</div><div class='add'>+</div><div class='add'>+        case EC_STATE_REPORT:</div><div class='add'>+            cbk = fop-&gt;answer;</div><div class='add'>+</div><div class='add'>+            GF_ASSERT(cbk != NULL);</div><div class='add'>+</div><div class='add'>+            if (fop-&gt;cbks.mkdir != NULL) {</div><div class='add'>+                QUORUM_CBK(fop-&gt;cbks.mkdir, fop, fop-&gt;req_frame, fop, fop-&gt;xl,</div><div class='add'>+                           cbk-&gt;op_ret, cbk-&gt;op_errno, fop-&gt;loc[0].inode,</div><div class='add'>+                           &amp;cbk-&gt;iatt[0], &amp;cbk-&gt;iatt[1], &amp;cbk-&gt;iatt[2],</div><div class='add'>+                           cbk-&gt;xdata);</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            return EC_STATE_LOCK_REUSE;</div><div class='add'>+</div><div class='add'>+        case -EC_STATE_INIT:</div><div class='add'>+        case -EC_STATE_LOCK:</div><div class='add'>+        case -EC_STATE_DISPATCH:</div><div class='add'>+        case -EC_STATE_PREPARE_ANSWER:</div><div class='add'>+        case -EC_STATE_REPORT:</div><div class='add'>+            cbk = fop-&gt;answer;</div><div class='add'>+            GF_ASSERT(fop-&gt;error != 0);</div><div class='add'>+</div><div class='add'>+            if (fop-&gt;cbks.mkdir != NULL) {</div><div class='add'>+                fop-&gt;cbks.mkdir(fop-&gt;req_frame, fop, fop-&gt;xl, -1, fop-&gt;error,</div><div class='add'>+                                NULL, NULL, NULL, NULL,</div><div class='add'>+                                ((cbk) ? cbk-&gt;xdata : NULL));</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            return EC_STATE_LOCK_REUSE;</div><div class='add'>+</div><div class='add'>+        case -EC_STATE_LOCK_REUSE:</div><div class='add'>+        case EC_STATE_LOCK_REUSE:</div><div class='add'>+            ec_lock_reuse(fop);</div><div class='add'>+</div><div class='add'>+            return EC_STATE_UNLOCK;</div><div class='add'>+</div><div class='add'>+        case -EC_STATE_UNLOCK:</div><div class='add'>+        case EC_STATE_UNLOCK:</div><div class='add'>+            ec_unlock(fop);</div><div class='add'>+</div><div class='add'>+            return EC_STATE_END;</div><div class='add'>+</div><div class='add'>+        default:</div><div class='add'>+            gf_msg(fop-&gt;xl-&gt;name, GF_LOG_ERROR, EINVAL, EC_MSG_UNHANDLED_STATE,</div><div class='add'>+                   "Unhandled state %d for %s", state, ec_fop_name(fop-&gt;id));</div><div class='add'>+</div><div class='add'>+            return EC_STATE_END;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_mkdir(call_frame_t *frame, xlator_t *this, uintptr_t target,</div><div class='add'>+         uint32_t fop_flags, fop_mkdir_cbk_t func, void *data, loc_t *loc,</div><div class='add'>+         mode_t mode, mode_t umask, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    ec_cbk_t callback = {.mkdir = func};</div><div class='add'>+    ec_fop_data_t *fop = NULL;</div><div class='add'>+    int32_t error = ENOMEM;</div><div class='add'>+</div><div class='add'>+    gf_msg_trace("ec", 0, "EC(MKDIR) %p", frame);</div><div class='add'>+</div><div class='add'>+    VALIDATE_OR_GOTO(this, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, frame, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, this-&gt;private, out);</div><div class='add'>+</div><div class='add'>+    fop = ec_fop_data_allocate(frame, this, GF_FOP_MKDIR, 0, target, fop_flags,</div><div class='add'>+                               ec_wind_mkdir, ec_manager_mkdir, callback, data);</div><div class='add'>+    if (fop == NULL) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    fop-&gt;mode[0] = mode;</div><div class='add'>+    fop-&gt;mode[1] = umask;</div><div class='add'>+</div><div class='add'>+    if (loc != NULL) {</div><div class='add'>+        if (loc_copy(&amp;fop-&gt;loc[0], loc) != 0) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, ENOMEM, EC_MSG_LOC_COPY_FAIL,</div><div class='add'>+                   "Failed to copy a location.");</div><div class='add'>+</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    if (xdata != NULL) {</div><div class='add'>+        fop-&gt;xdata = dict_copy_with_ref(xdata, NULL);</div><div class='add'>+        if (fop-&gt;xdata == NULL) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, 0, EC_MSG_DICT_REF_FAIL,</div><div class='add'>+                   "Failed to reference a "</div><div class='add'>+                   "dictionary.");</div><div class='add'>+</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    error = 0;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (fop != NULL) {</div><div class='add'>+        ec_manager(fop, error);</div><div class='add'>+    } else {</div><div class='add'>+        func(frame, NULL, this, -1, error, NULL, NULL, NULL, NULL, NULL);</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* FOP: mknod */</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_mknod_cbk(call_frame_t *frame, void *cookie, xlator_t *this, int32_t op_ret,</div><div class='add'>+             int32_t op_errno, inode_t *inode, struct iatt *buf,</div><div class='add'>+             struct iatt *preparent, struct iatt *postparent, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    return ec_dir_write_cbk(frame, this, cookie, op_ret, op_errno, buf,</div><div class='add'>+                            preparent, postparent, NULL, NULL, xdata);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_wind_mknod(ec_t *ec, ec_fop_data_t *fop, int32_t idx)</div><div class='add'>+{</div><div class='add'>+    ec_trace("WIND", fop, "idx=%d", idx);</div><div class='add'>+</div><div class='add'>+    STACK_WIND_COOKIE(fop-&gt;frame, ec_mknod_cbk, (void *)(uintptr_t)idx,</div><div class='add'>+                      ec-&gt;xl_list[idx], ec-&gt;xl_list[idx]-&gt;fops-&gt;mknod,</div><div class='add'>+                      &amp;fop-&gt;loc[0], fop-&gt;mode[0], fop-&gt;dev, fop-&gt;mode[1],</div><div class='add'>+                      fop-&gt;xdata);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_manager_mknod(ec_fop_data_t *fop, int32_t state)</div><div class='add'>+{</div><div class='add'>+    ec_config_t config;</div><div class='add'>+    ec_t *ec;</div><div class='add'>+    ec_cbk_data_t *cbk;</div><div class='add'>+    uint64_t version[2] = {0, 0};</div><div class='add'>+</div><div class='add'>+    switch (state) {</div><div class='add'>+        case EC_STATE_INIT:</div><div class='add'>+            if (S_ISREG(fop-&gt;mode[0])) {</div><div class='add'>+                int32_t err;</div><div class='add'>+</div><div class='add'>+                if (fop-&gt;xdata == NULL) {</div><div class='add'>+                    fop-&gt;xdata = dict_new();</div><div class='add'>+                    if (fop-&gt;xdata == NULL) {</div><div class='add'>+                        fop-&gt;error = ENOMEM;</div><div class='add'>+</div><div class='add'>+                        return EC_STATE_REPORT;</div><div class='add'>+                    }</div><div class='add'>+                }</div><div class='add'>+</div><div class='add'>+                ec = fop-&gt;xl-&gt;private;</div><div class='add'>+</div><div class='add'>+                config.version = EC_CONFIG_VERSION;</div><div class='add'>+                config.algorithm = EC_CONFIG_ALGORITHM;</div><div class='add'>+                config.gf_word_size = EC_GF_BITS;</div><div class='add'>+                config.bricks = ec-&gt;nodes;</div><div class='add'>+                config.redundancy = ec-&gt;redundancy;</div><div class='add'>+                config.chunk_size = EC_METHOD_CHUNK_SIZE;</div><div class='add'>+</div><div class='add'>+                err = ec_dict_set_config(fop-&gt;xdata, EC_XATTR_CONFIG, &amp;config);</div><div class='add'>+                if (err != 0) {</div><div class='add'>+                    fop-&gt;error = -err;</div><div class='add'>+</div><div class='add'>+                    return EC_STATE_REPORT;</div><div class='add'>+                }</div><div class='add'>+                err = ec_dict_set_array(fop-&gt;xdata, EC_XATTR_VERSION, version,</div><div class='add'>+                                        EC_VERSION_SIZE);</div><div class='add'>+                if (err != 0) {</div><div class='add'>+                    fop-&gt;error = -err;</div><div class='add'>+</div><div class='add'>+                    return EC_STATE_REPORT;</div><div class='add'>+                }</div><div class='add'>+                err = ec_dict_set_number(fop-&gt;xdata, EC_XATTR_SIZE, 0);</div><div class='add'>+                if (err != 0) {</div><div class='add'>+                    fop-&gt;error = -err;</div><div class='add'>+</div><div class='add'>+                    return EC_STATE_REPORT;</div><div class='add'>+                }</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            /* Fall through */</div><div class='add'>+</div><div class='add'>+        case EC_STATE_LOCK:</div><div class='add'>+            ec_lock_prepare_parent_inode(fop, &amp;fop-&gt;loc[0], NULL,</div><div class='add'>+                                         EC_UPDATE_DATA | EC_UPDATE_META);</div><div class='add'>+            ec_lock(fop);</div><div class='add'>+</div><div class='add'>+            return EC_STATE_DISPATCH;</div><div class='add'>+</div><div class='add'>+        case EC_STATE_DISPATCH:</div><div class='add'>+            ec_dispatch_all(fop);</div><div class='add'>+</div><div class='add'>+            return EC_STATE_PREPARE_ANSWER;</div><div class='add'>+</div><div class='add'>+        case EC_STATE_PREPARE_ANSWER:</div><div class='add'>+            cbk = ec_fop_prepare_answer(fop, _gf_false);</div><div class='add'>+            if (cbk != NULL) {</div><div class='add'>+                int32_t err;</div><div class='add'>+</div><div class='add'>+                ec_iatt_rebuild(fop-&gt;xl-&gt;private, cbk-&gt;iatt, 3, cbk-&gt;count);</div><div class='add'>+</div><div class='add'>+                err = ec_loc_update(fop-&gt;xl, &amp;fop-&gt;loc[0], cbk-&gt;inode,</div><div class='add'>+                                    &amp;cbk-&gt;iatt[0]);</div><div class='add'>+                ec_cbk_set_error(cbk, -err, _gf_false);</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            return EC_STATE_REPORT;</div><div class='add'>+</div><div class='add'>+        case EC_STATE_REPORT:</div><div class='add'>+            cbk = fop-&gt;answer;</div><div class='add'>+</div><div class='add'>+            GF_ASSERT(cbk != NULL);</div><div class='add'>+</div><div class='add'>+            if (fop-&gt;cbks.mknod != NULL) {</div><div class='add'>+                QUORUM_CBK(fop-&gt;cbks.mknod, fop, fop-&gt;req_frame, fop, fop-&gt;xl,</div><div class='add'>+                           cbk-&gt;op_ret, cbk-&gt;op_errno, fop-&gt;loc[0].inode,</div><div class='add'>+                           &amp;cbk-&gt;iatt[0], &amp;cbk-&gt;iatt[1], &amp;cbk-&gt;iatt[2],</div><div class='add'>+                           cbk-&gt;xdata);</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            return EC_STATE_LOCK_REUSE;</div><div class='add'>+</div><div class='add'>+        case -EC_STATE_INIT:</div><div class='add'>+        case -EC_STATE_LOCK:</div><div class='add'>+        case -EC_STATE_DISPATCH:</div><div class='add'>+        case -EC_STATE_PREPARE_ANSWER:</div><div class='add'>+        case -EC_STATE_REPORT:</div><div class='add'>+            GF_ASSERT(fop-&gt;error != 0);</div><div class='add'>+</div><div class='add'>+            if (fop-&gt;cbks.mknod != NULL) {</div><div class='add'>+                fop-&gt;cbks.mknod(fop-&gt;req_frame, fop, fop-&gt;xl, -1, fop-&gt;error,</div><div class='add'>+                                NULL, NULL, NULL, NULL, NULL);</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            return EC_STATE_LOCK_REUSE;</div><div class='add'>+</div><div class='add'>+        case -EC_STATE_LOCK_REUSE:</div><div class='add'>+        case EC_STATE_LOCK_REUSE:</div><div class='add'>+            ec_lock_reuse(fop);</div><div class='add'>+</div><div class='add'>+            return EC_STATE_UNLOCK;</div><div class='add'>+</div><div class='add'>+        case -EC_STATE_UNLOCK:</div><div class='add'>+        case EC_STATE_UNLOCK:</div><div class='add'>+            ec_unlock(fop);</div><div class='add'>+</div><div class='add'>+            return EC_STATE_END;</div><div class='add'>+</div><div class='add'>+        default:</div><div class='add'>+            gf_msg(fop-&gt;xl-&gt;name, GF_LOG_ERROR, EINVAL, EC_MSG_UNHANDLED_STATE,</div><div class='add'>+                   "Unhandled state %d for %s", state, ec_fop_name(fop-&gt;id));</div><div class='add'>+</div><div class='add'>+            return EC_STATE_END;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_mknod(call_frame_t *frame, xlator_t *this, uintptr_t target,</div><div class='add'>+         uint32_t fop_flags, fop_mknod_cbk_t func, void *data, loc_t *loc,</div><div class='add'>+         mode_t mode, dev_t rdev, mode_t umask, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    ec_cbk_t callback = {.mknod = func};</div><div class='add'>+    ec_fop_data_t *fop = NULL;</div><div class='add'>+    int32_t error = ENOMEM;</div><div class='add'>+</div><div class='add'>+    gf_msg_trace("ec", 0, "EC(MKNOD) %p", frame);</div><div class='add'>+</div><div class='add'>+    VALIDATE_OR_GOTO(this, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, frame, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, this-&gt;private, out);</div><div class='add'>+</div><div class='add'>+    fop = ec_fop_data_allocate(frame, this, GF_FOP_MKNOD, 0, target, fop_flags,</div><div class='add'>+                               ec_wind_mknod, ec_manager_mknod, callback, data);</div><div class='add'>+    if (fop == NULL) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    fop-&gt;mode[0] = mode;</div><div class='add'>+    fop-&gt;dev = rdev;</div><div class='add'>+    fop-&gt;mode[1] = umask;</div><div class='add'>+</div><div class='add'>+    if (loc != NULL) {</div><div class='add'>+        if (loc_copy(&amp;fop-&gt;loc[0], loc) != 0) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, ENOMEM, EC_MSG_LOC_COPY_FAIL,</div><div class='add'>+                   "Failed to copy a location.");</div><div class='add'>+</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    if (xdata != NULL) {</div><div class='add'>+        fop-&gt;xdata = dict_copy_with_ref(xdata, NULL);</div><div class='add'>+        if (fop-&gt;xdata == NULL) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, 0, EC_MSG_DICT_REF_FAIL,</div><div class='add'>+                   "Failed to reference a "</div><div class='add'>+                   "dictionary.");</div><div class='add'>+</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    error = 0;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (fop != NULL) {</div><div class='add'>+        ec_manager(fop, error);</div><div class='add'>+    } else {</div><div class='add'>+        func(frame, NULL, this, -1, error, NULL, NULL, NULL, NULL, NULL);</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* FOP: rename */</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_rename_cbk(call_frame_t *frame, void *cookie, xlator_t *this, int32_t op_ret,</div><div class='add'>+              int32_t op_errno, struct iatt *buf, struct iatt *preoldparent,</div><div class='add'>+              struct iatt *postoldparent, struct iatt *prenewparent,</div><div class='add'>+              struct iatt *postnewparent, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    return ec_dir_write_cbk(frame, this, cookie, op_ret, op_errno, buf,</div><div class='add'>+                            preoldparent, postoldparent, prenewparent,</div><div class='add'>+                            postnewparent, xdata);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_wind_rename(ec_t *ec, ec_fop_data_t *fop, int32_t idx)</div><div class='add'>+{</div><div class='add'>+    ec_trace("WIND", fop, "idx=%d", idx);</div><div class='add'>+</div><div class='add'>+    STACK_WIND_COOKIE(fop-&gt;frame, ec_rename_cbk, (void *)(uintptr_t)idx,</div><div class='add'>+                      ec-&gt;xl_list[idx], ec-&gt;xl_list[idx]-&gt;fops-&gt;rename,</div><div class='add'>+                      &amp;fop-&gt;loc[0], &amp;fop-&gt;loc[1], fop-&gt;xdata);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_manager_rename(ec_fop_data_t *fop, int32_t state)</div><div class='add'>+{</div><div class='add'>+    ec_cbk_data_t *cbk;</div><div class='add'>+</div><div class='add'>+    switch (state) {</div><div class='add'>+        case EC_STATE_INIT:</div><div class='add'>+        case EC_STATE_LOCK:</div><div class='add'>+            ec_lock_prepare_parent_inode(</div><div class='add'>+                fop, &amp;fop-&gt;loc[0], &amp;fop-&gt;loc[0],</div><div class='add'>+                EC_UPDATE_DATA | EC_UPDATE_META | EC_INODE_SIZE);</div><div class='add'>+            ec_lock_prepare_parent_inode(fop, &amp;fop-&gt;loc[1], NULL,</div><div class='add'>+                                         EC_UPDATE_DATA | EC_UPDATE_META);</div><div class='add'>+            ec_lock(fop);</div><div class='add'>+</div><div class='add'>+            return EC_STATE_DISPATCH;</div><div class='add'>+</div><div class='add'>+        case EC_STATE_DISPATCH:</div><div class='add'>+            ec_dispatch_all(fop);</div><div class='add'>+</div><div class='add'>+            return EC_STATE_PREPARE_ANSWER;</div><div class='add'>+</div><div class='add'>+        case EC_STATE_PREPARE_ANSWER:</div><div class='add'>+            cbk = ec_fop_prepare_answer(fop, _gf_false);</div><div class='add'>+            if (cbk != NULL) {</div><div class='add'>+                ec_iatt_rebuild(fop-&gt;xl-&gt;private, cbk-&gt;iatt, 5, cbk-&gt;count);</div><div class='add'>+</div><div class='add'>+                if (cbk-&gt;iatt[0].ia_type == IA_IFREG) {</div><div class='add'>+                    cbk-&gt;iatt[0].ia_size = fop-&gt;locks[0].size;</div><div class='add'>+                }</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            return EC_STATE_REPORT;</div><div class='add'>+</div><div class='add'>+        case EC_STATE_REPORT:</div><div class='add'>+            cbk = fop-&gt;answer;</div><div class='add'>+</div><div class='add'>+            GF_ASSERT(cbk != NULL);</div><div class='add'>+</div><div class='add'>+            if (fop-&gt;cbks.rename != NULL) {</div><div class='add'>+                QUORUM_CBK(fop-&gt;cbks.rename, fop, fop-&gt;req_frame, fop, fop-&gt;xl,</div><div class='add'>+                           cbk-&gt;op_ret, cbk-&gt;op_errno, &amp;cbk-&gt;iatt[0],</div><div class='add'>+                           &amp;cbk-&gt;iatt[1], &amp;cbk-&gt;iatt[2], &amp;cbk-&gt;iatt[3],</div><div class='add'>+                           &amp;cbk-&gt;iatt[4], cbk-&gt;xdata);</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            return EC_STATE_LOCK_REUSE;</div><div class='add'>+</div><div class='add'>+        case -EC_STATE_INIT:</div><div class='add'>+        case -EC_STATE_LOCK:</div><div class='add'>+        case -EC_STATE_DISPATCH:</div><div class='add'>+        case -EC_STATE_PREPARE_ANSWER:</div><div class='add'>+        case -EC_STATE_REPORT:</div><div class='add'>+            GF_ASSERT(fop-&gt;error != 0);</div><div class='add'>+</div><div class='add'>+            if (fop-&gt;cbks.rename != NULL) {</div><div class='add'>+                fop-&gt;cbks.rename(fop-&gt;req_frame, fop, fop-&gt;xl, -1, fop-&gt;error,</div><div class='add'>+                                 NULL, NULL, NULL, NULL, NULL, NULL);</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            return EC_STATE_LOCK_REUSE;</div><div class='add'>+</div><div class='add'>+        case -EC_STATE_LOCK_REUSE:</div><div class='add'>+        case EC_STATE_LOCK_REUSE:</div><div class='add'>+            ec_lock_reuse(fop);</div><div class='add'>+</div><div class='add'>+            return EC_STATE_UNLOCK;</div><div class='add'>+</div><div class='add'>+        case -EC_STATE_UNLOCK:</div><div class='add'>+        case EC_STATE_UNLOCK:</div><div class='add'>+            ec_unlock(fop);</div><div class='add'>+</div><div class='add'>+            return EC_STATE_END;</div><div class='add'>+</div><div class='add'>+        default:</div><div class='add'>+            gf_msg(fop-&gt;xl-&gt;name, GF_LOG_ERROR, EINVAL, EC_MSG_UNHANDLED_STATE,</div><div class='add'>+                   "Unhandled state %d for %s", state, ec_fop_name(fop-&gt;id));</div><div class='add'>+</div><div class='add'>+            return EC_STATE_END;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_rename(call_frame_t *frame, xlator_t *this, uintptr_t target,</div><div class='add'>+          uint32_t fop_flags, fop_rename_cbk_t func, void *data, loc_t *oldloc,</div><div class='add'>+          loc_t *newloc, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    ec_cbk_t callback = {.rename = func};</div><div class='add'>+    ec_fop_data_t *fop = NULL;</div><div class='add'>+    int32_t error = ENOMEM;</div><div class='add'>+</div><div class='add'>+    gf_msg_trace("ec", 0, "EC(RENAME) %p", frame);</div><div class='add'>+</div><div class='add'>+    VALIDATE_OR_GOTO(this, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, frame, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, this-&gt;private, out);</div><div class='add'>+</div><div class='add'>+    fop = ec_fop_data_allocate(frame, this, GF_FOP_RENAME, 0, target, fop_flags,</div><div class='add'>+                               ec_wind_rename, ec_manager_rename, callback,</div><div class='add'>+                               data);</div><div class='add'>+    if (fop == NULL) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (oldloc != NULL) {</div><div class='add'>+        if (loc_copy(&amp;fop-&gt;loc[0], oldloc) != 0) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, ENOMEM, EC_MSG_LOC_COPY_FAIL,</div><div class='add'>+                   "Failed to copy a location.");</div><div class='add'>+</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    if (newloc != NULL) {</div><div class='add'>+        if (loc_copy(&amp;fop-&gt;loc[1], newloc) != 0) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, ENOMEM, EC_MSG_LOC_COPY_FAIL,</div><div class='add'>+                   "Failed to copy a location.");</div><div class='add'>+</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    if (xdata != NULL) {</div><div class='add'>+        fop-&gt;xdata = dict_copy_with_ref(xdata, NULL);</div><div class='add'>+        if (fop-&gt;xdata == NULL) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, 0, EC_MSG_DICT_REF_FAIL,</div><div class='add'>+                   "Failed to reference a "</div><div class='add'>+                   "dictionary.");</div><div class='add'>+</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    error = 0;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (fop != NULL) {</div><div class='add'>+        ec_manager(fop, error);</div><div class='add'>+    } else {</div><div class='add'>+        func(frame, NULL, this, -1, error, NULL, NULL, NULL, NULL, NULL, NULL);</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* FOP: rmdir */</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_rmdir_cbk(call_frame_t *frame, void *cookie, xlator_t *this, int32_t op_ret,</div><div class='add'>+             int32_t op_errno, struct iatt *preparent, struct iatt *postparent,</div><div class='add'>+             dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    return ec_dir_write_cbk(frame, this, cookie, op_ret, op_errno, NULL,</div><div class='add'>+                            preparent, postparent, NULL, NULL, xdata);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_wind_rmdir(ec_t *ec, ec_fop_data_t *fop, int32_t idx)</div><div class='add'>+{</div><div class='add'>+    ec_trace("WIND", fop, "idx=%d", idx);</div><div class='add'>+</div><div class='add'>+    STACK_WIND_COOKIE(fop-&gt;frame, ec_rmdir_cbk, (void *)(uintptr_t)idx,</div><div class='add'>+                      ec-&gt;xl_list[idx], ec-&gt;xl_list[idx]-&gt;fops-&gt;rmdir,</div><div class='add'>+                      &amp;fop-&gt;loc[0], fop-&gt;int32, fop-&gt;xdata);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_manager_rmdir(ec_fop_data_t *fop, int32_t state)</div><div class='add'>+{</div><div class='add'>+    ec_cbk_data_t *cbk;</div><div class='add'>+</div><div class='add'>+    switch (state) {</div><div class='add'>+        case EC_STATE_INIT:</div><div class='add'>+        case EC_STATE_LOCK:</div><div class='add'>+            ec_lock_prepare_parent_inode(fop, &amp;fop-&gt;loc[0], NULL,</div><div class='add'>+                                         EC_UPDATE_DATA | EC_UPDATE_META);</div><div class='add'>+            ec_lock(fop);</div><div class='add'>+</div><div class='add'>+            return EC_STATE_DISPATCH;</div><div class='add'>+</div><div class='add'>+        case EC_STATE_DISPATCH:</div><div class='add'>+            ec_dispatch_all(fop);</div><div class='add'>+</div><div class='add'>+            return EC_STATE_PREPARE_ANSWER;</div><div class='add'>+</div><div class='add'>+        case EC_STATE_PREPARE_ANSWER:</div><div class='add'>+            ec_fop_prepare_answer(fop, _gf_false);</div><div class='add'>+</div><div class='add'>+            return EC_STATE_REPORT;</div><div class='add'>+</div><div class='add'>+        case EC_STATE_REPORT:</div><div class='add'>+            cbk = fop-&gt;answer;</div><div class='add'>+</div><div class='add'>+            GF_ASSERT(cbk != NULL);</div><div class='add'>+</div><div class='add'>+            if (fop-&gt;cbks.rmdir != NULL) {</div><div class='add'>+                QUORUM_CBK(fop-&gt;cbks.rmdir, fop, fop-&gt;req_frame, fop, fop-&gt;xl,</div><div class='add'>+                           cbk-&gt;op_ret, cbk-&gt;op_errno, &amp;cbk-&gt;iatt[0],</div><div class='add'>+                           &amp;cbk-&gt;iatt[1], cbk-&gt;xdata);</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            return EC_STATE_LOCK_REUSE;</div><div class='add'>+</div><div class='add'>+        case -EC_STATE_INIT:</div><div class='add'>+        case -EC_STATE_LOCK:</div><div class='add'>+        case -EC_STATE_DISPATCH:</div><div class='add'>+        case -EC_STATE_PREPARE_ANSWER:</div><div class='add'>+        case -EC_STATE_REPORT:</div><div class='add'>+            GF_ASSERT(fop-&gt;error != 0);</div><div class='add'>+</div><div class='add'>+            if (fop-&gt;cbks.rmdir != NULL) {</div><div class='add'>+                fop-&gt;cbks.rmdir(fop-&gt;req_frame, fop, fop-&gt;xl, -1, fop-&gt;error,</div><div class='add'>+                                NULL, NULL, NULL);</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            return EC_STATE_LOCK_REUSE;</div><div class='add'>+</div><div class='add'>+        case -EC_STATE_LOCK_REUSE:</div><div class='add'>+        case EC_STATE_LOCK_REUSE:</div><div class='add'>+            ec_lock_reuse(fop);</div><div class='add'>+</div><div class='add'>+            return EC_STATE_UNLOCK;</div><div class='add'>+</div><div class='add'>+        case -EC_STATE_UNLOCK:</div><div class='add'>+        case EC_STATE_UNLOCK:</div><div class='add'>+            ec_unlock(fop);</div><div class='add'>+</div><div class='add'>+            return EC_STATE_END;</div><div class='add'>+</div><div class='add'>+        default:</div><div class='add'>+            gf_msg(fop-&gt;xl-&gt;name, GF_LOG_ERROR, EINVAL, EC_MSG_UNHANDLED_STATE,</div><div class='add'>+                   "Unhandled state %d for %s", state, ec_fop_name(fop-&gt;id));</div><div class='add'>+</div><div class='add'>+            return EC_STATE_END;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_rmdir(call_frame_t *frame, xlator_t *this, uintptr_t target,</div><div class='add'>+         uint32_t fop_flags, fop_rmdir_cbk_t func, void *data, loc_t *loc,</div><div class='add'>+         int xflags, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    ec_cbk_t callback = {.rmdir = func};</div><div class='add'>+    ec_fop_data_t *fop = NULL;</div><div class='add'>+    int32_t error = ENOMEM;</div><div class='add'>+</div><div class='add'>+    gf_msg_trace("ec", 0, "EC(RMDIR) %p", frame);</div><div class='add'>+</div><div class='add'>+    VALIDATE_OR_GOTO(this, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, frame, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, this-&gt;private, out);</div><div class='add'>+</div><div class='add'>+    fop = ec_fop_data_allocate(frame, this, GF_FOP_RMDIR, 0, target, fop_flags,</div><div class='add'>+                               ec_wind_rmdir, ec_manager_rmdir, callback, data);</div><div class='add'>+    if (fop == NULL) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    fop-&gt;int32 = xflags;</div><div class='add'>+</div><div class='add'>+    if (loc != NULL) {</div><div class='add'>+        if (loc_copy(&amp;fop-&gt;loc[0], loc) != 0) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, ENOMEM, EC_MSG_LOC_COPY_FAIL,</div><div class='add'>+                   "Failed to copy a location.");</div><div class='add'>+</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    if (xdata != NULL) {</div><div class='add'>+        fop-&gt;xdata = dict_copy_with_ref(xdata, NULL);</div><div class='add'>+        if (fop-&gt;xdata == NULL) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, 0, EC_MSG_DICT_REF_FAIL,</div><div class='add'>+                   "Failed to reference a "</div><div class='add'>+                   "dictionary.");</div><div class='add'>+</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    error = 0;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (fop != NULL) {</div><div class='add'>+        ec_manager(fop, error);</div><div class='add'>+    } else {</div><div class='add'>+        func(frame, NULL, this, -1, error, NULL, NULL, NULL);</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* FOP: symlink */</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_symlink_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+               int32_t op_ret, int32_t op_errno, inode_t *inode,</div><div class='add'>+               struct iatt *buf, struct iatt *preparent,</div><div class='add'>+               struct iatt *postparent, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    return ec_dir_write_cbk(frame, this, cookie, op_ret, op_errno, buf,</div><div class='add'>+                            preparent, postparent, NULL, NULL, xdata);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_wind_symlink(ec_t *ec, ec_fop_data_t *fop, int32_t idx)</div><div class='add'>+{</div><div class='add'>+    ec_trace("WIND", fop, "idx=%d", idx);</div><div class='add'>+</div><div class='add'>+    STACK_WIND_COOKIE(fop-&gt;frame, ec_symlink_cbk, (void *)(uintptr_t)idx,</div><div class='add'>+                      ec-&gt;xl_list[idx], ec-&gt;xl_list[idx]-&gt;fops-&gt;symlink,</div><div class='add'>+                      fop-&gt;str[0], &amp;fop-&gt;loc[0], fop-&gt;mode[0], fop-&gt;xdata);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_manager_symlink(ec_fop_data_t *fop, int32_t state)</div><div class='add'>+{</div><div class='add'>+    ec_cbk_data_t *cbk;</div><div class='add'>+</div><div class='add'>+    switch (state) {</div><div class='add'>+        case EC_STATE_INIT:</div><div class='add'>+        case EC_STATE_LOCK:</div><div class='add'>+            ec_lock_prepare_parent_inode(fop, &amp;fop-&gt;loc[0], NULL,</div><div class='add'>+                                         EC_UPDATE_DATA | EC_UPDATE_META);</div><div class='add'>+            ec_lock(fop);</div><div class='add'>+</div><div class='add'>+            return EC_STATE_DISPATCH;</div><div class='add'>+</div><div class='add'>+        case EC_STATE_DISPATCH:</div><div class='add'>+            ec_dispatch_all(fop);</div><div class='add'>+</div><div class='add'>+            return EC_STATE_PREPARE_ANSWER;</div><div class='add'>+</div><div class='add'>+        case EC_STATE_PREPARE_ANSWER:</div><div class='add'>+            cbk = ec_fop_prepare_answer(fop, _gf_false);</div><div class='add'>+            if (cbk != NULL) {</div><div class='add'>+                int32_t err;</div><div class='add'>+</div><div class='add'>+                ec_iatt_rebuild(fop-&gt;xl-&gt;private, cbk-&gt;iatt, 3, cbk-&gt;count);</div><div class='add'>+</div><div class='add'>+                err = ec_loc_update(fop-&gt;xl, &amp;fop-&gt;loc[0], cbk-&gt;inode,</div><div class='add'>+                                    &amp;cbk-&gt;iatt[0]);</div><div class='add'>+                ec_cbk_set_error(cbk, -err, _gf_false);</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            return EC_STATE_REPORT;</div><div class='add'>+</div><div class='add'>+        case EC_STATE_REPORT:</div><div class='add'>+            cbk = fop-&gt;answer;</div><div class='add'>+</div><div class='add'>+            GF_ASSERT(cbk != NULL);</div><div class='add'>+</div><div class='add'>+            if (fop-&gt;cbks.symlink != NULL) {</div><div class='add'>+                QUORUM_CBK(fop-&gt;cbks.symlink, fop, fop-&gt;req_frame, fop, fop-&gt;xl,</div><div class='add'>+                           cbk-&gt;op_ret, cbk-&gt;op_errno, fop-&gt;loc[0].inode,</div><div class='add'>+                           &amp;cbk-&gt;iatt[0], &amp;cbk-&gt;iatt[1], &amp;cbk-&gt;iatt[2],</div><div class='add'>+                           cbk-&gt;xdata);</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            return EC_STATE_LOCK_REUSE;</div><div class='add'>+</div><div class='add'>+        case -EC_STATE_INIT:</div><div class='add'>+        case -EC_STATE_LOCK:</div><div class='add'>+        case -EC_STATE_DISPATCH:</div><div class='add'>+        case -EC_STATE_PREPARE_ANSWER:</div><div class='add'>+        case -EC_STATE_REPORT:</div><div class='add'>+            GF_ASSERT(fop-&gt;error != 0);</div><div class='add'>+</div><div class='add'>+            if (fop-&gt;cbks.symlink != NULL) {</div><div class='add'>+                fop-&gt;cbks.symlink(fop-&gt;req_frame, fop, fop-&gt;xl, -1, fop-&gt;error,</div><div class='add'>+                                  NULL, NULL, NULL, NULL, NULL);</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            return EC_STATE_LOCK_REUSE;</div><div class='add'>+</div><div class='add'>+        case -EC_STATE_LOCK_REUSE:</div><div class='add'>+        case EC_STATE_LOCK_REUSE:</div><div class='add'>+            ec_lock_reuse(fop);</div><div class='add'>+</div><div class='add'>+            return EC_STATE_UNLOCK;</div><div class='add'>+</div><div class='add'>+        case -EC_STATE_UNLOCK:</div><div class='add'>+        case EC_STATE_UNLOCK:</div><div class='add'>+            ec_unlock(fop);</div><div class='add'>+</div><div class='add'>+            return EC_STATE_END;</div><div class='add'>+</div><div class='add'>+        default:</div><div class='add'>+            gf_msg(fop-&gt;xl-&gt;name, GF_LOG_ERROR, EINVAL, EC_MSG_UNHANDLED_STATE,</div><div class='add'>+                   "Unhandled state %d for %s", state, ec_fop_name(fop-&gt;id));</div><div class='add'>+</div><div class='add'>+            return EC_STATE_END;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_symlink(call_frame_t *frame, xlator_t *this, uintptr_t target,</div><div class='add'>+           uint32_t fop_flags, fop_symlink_cbk_t func, void *data,</div><div class='add'>+           const char *linkname, loc_t *loc, mode_t umask, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    ec_cbk_t callback = {.symlink = func};</div><div class='add'>+    ec_fop_data_t *fop = NULL;</div><div class='add'>+    int32_t error = ENOMEM;</div><div class='add'>+</div><div class='add'>+    gf_msg_trace("ec", 0, "EC(SYMLINK) %p", frame);</div><div class='add'>+</div><div class='add'>+    VALIDATE_OR_GOTO(this, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, frame, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, this-&gt;private, out);</div><div class='add'>+</div><div class='add'>+    fop = ec_fop_data_allocate(frame, this, GF_FOP_SYMLINK, 0, target,</div><div class='add'>+                               fop_flags, ec_wind_symlink, ec_manager_symlink,</div><div class='add'>+                               callback, data);</div><div class='add'>+    if (fop == NULL) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    fop-&gt;mode[0] = umask;</div><div class='add'>+</div><div class='add'>+    if (linkname != NULL) {</div><div class='add'>+        fop-&gt;str[0] = gf_strdup(linkname);</div><div class='add'>+        if (fop-&gt;str[0] == NULL) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, ENOMEM, EC_MSG_NO_MEMORY,</div><div class='add'>+                   "Failed to duplicate a string.");</div><div class='add'>+</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    if (loc != NULL) {</div><div class='add'>+        if (loc_copy(&amp;fop-&gt;loc[0], loc) != 0) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, ENOMEM, EC_MSG_LOC_COPY_FAIL,</div><div class='add'>+                   "Failed to copy a location.");</div><div class='add'>+</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    if (xdata != NULL) {</div><div class='add'>+        fop-&gt;xdata = dict_copy_with_ref(xdata, NULL);</div><div class='add'>+        if (fop-&gt;xdata == NULL) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, 0, EC_MSG_DICT_REF_FAIL,</div><div class='add'>+                   "Failed to reference a "</div><div class='add'>+                   "dictionary.");</div><div class='add'>+</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    error = 0;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (fop != NULL) {</div><div class='add'>+        ec_manager(fop, error);</div><div class='add'>+    } else {</div><div class='add'>+        func(frame, NULL, this, -1, error, NULL, NULL, NULL, NULL, NULL);</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* FOP: unlink */</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_unlink_cbk(call_frame_t *frame, void *cookie, xlator_t *this, int32_t op_ret,</div><div class='add'>+              int32_t op_errno, struct iatt *preparent, struct iatt *postparent,</div><div class='add'>+              dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    return ec_dir_write_cbk(frame, this, cookie, op_ret, op_errno, NULL,</div><div class='add'>+                            preparent, postparent, NULL, NULL, xdata);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_wind_unlink(ec_t *ec, ec_fop_data_t *fop, int32_t idx)</div><div class='add'>+{</div><div class='add'>+    ec_trace("WIND", fop, "idx=%d", idx);</div><div class='add'>+</div><div class='add'>+    STACK_WIND_COOKIE(fop-&gt;frame, ec_unlink_cbk, (void *)(uintptr_t)idx,</div><div class='add'>+                      ec-&gt;xl_list[idx], ec-&gt;xl_list[idx]-&gt;fops-&gt;unlink,</div><div class='add'>+                      &amp;fop-&gt;loc[0], fop-&gt;int32, fop-&gt;xdata);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_manager_unlink(ec_fop_data_t *fop, int32_t state)</div><div class='add'>+{</div><div class='add'>+    ec_cbk_data_t *cbk;</div><div class='add'>+</div><div class='add'>+    switch (state) {</div><div class='add'>+        case EC_STATE_INIT:</div><div class='add'>+        case EC_STATE_LOCK:</div><div class='add'>+            ec_lock_prepare_parent_inode(fop, &amp;fop-&gt;loc[0], NULL,</div><div class='add'>+                                         EC_UPDATE_DATA | EC_UPDATE_META);</div><div class='add'>+            ec_lock(fop);</div><div class='add'>+</div><div class='add'>+            return EC_STATE_DISPATCH;</div><div class='add'>+</div><div class='add'>+        case EC_STATE_DISPATCH:</div><div class='add'>+            ec_dispatch_all(fop);</div><div class='add'>+</div><div class='add'>+            return EC_STATE_PREPARE_ANSWER;</div><div class='add'>+</div><div class='add'>+        case EC_STATE_PREPARE_ANSWER:</div><div class='add'>+            ec_fop_prepare_answer(fop, _gf_false);</div><div class='add'>+</div><div class='add'>+            return EC_STATE_REPORT;</div><div class='add'>+</div><div class='add'>+        case EC_STATE_REPORT:</div><div class='add'>+            cbk = fop-&gt;answer;</div><div class='add'>+</div><div class='add'>+            GF_ASSERT(cbk != NULL);</div><div class='add'>+</div><div class='add'>+            if (fop-&gt;cbks.unlink != NULL) {</div><div class='add'>+                QUORUM_CBK(fop-&gt;cbks.unlink, fop, fop-&gt;req_frame, fop, fop-&gt;xl,</div><div class='add'>+                           cbk-&gt;op_ret, cbk-&gt;op_errno, &amp;cbk-&gt;iatt[0],</div><div class='add'>+                           &amp;cbk-&gt;iatt[1], cbk-&gt;xdata);</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            return EC_STATE_LOCK_REUSE;</div><div class='add'>+</div><div class='add'>+        case -EC_STATE_INIT:</div><div class='add'>+        case -EC_STATE_LOCK:</div><div class='add'>+        case -EC_STATE_DISPATCH:</div><div class='add'>+        case -EC_STATE_PREPARE_ANSWER:</div><div class='add'>+        case -EC_STATE_REPORT:</div><div class='add'>+            GF_ASSERT(fop-&gt;error != 0);</div><div class='add'>+</div><div class='add'>+            if (fop-&gt;cbks.unlink != NULL) {</div><div class='add'>+                fop-&gt;cbks.unlink(fop-&gt;req_frame, fop, fop-&gt;xl, -1, fop-&gt;error,</div><div class='add'>+                                 NULL, NULL, NULL);</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            return EC_STATE_LOCK_REUSE;</div><div class='add'>+</div><div class='add'>+        case -EC_STATE_LOCK_REUSE:</div><div class='add'>+        case EC_STATE_LOCK_REUSE:</div><div class='add'>+            ec_lock_reuse(fop);</div><div class='add'>+</div><div class='add'>+            return EC_STATE_UNLOCK;</div><div class='add'>+</div><div class='add'>+        case -EC_STATE_UNLOCK:</div><div class='add'>+        case EC_STATE_UNLOCK:</div><div class='add'>+            ec_unlock(fop);</div><div class='add'>+</div><div class='add'>+            return EC_STATE_END;</div><div class='add'>+</div><div class='add'>+        default:</div><div class='add'>+            gf_msg(fop-&gt;xl-&gt;name, GF_LOG_ERROR, EINVAL, EC_MSG_UNHANDLED_STATE,</div><div class='add'>+                   "Unhandled state %d for %s", state, ec_fop_name(fop-&gt;id));</div><div class='add'>+</div><div class='add'>+            return EC_STATE_END;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_unlink(call_frame_t *frame, xlator_t *this, uintptr_t target,</div><div class='add'>+          uint32_t fop_flags, fop_unlink_cbk_t func, void *data, loc_t *loc,</div><div class='add'>+          int xflags, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    ec_cbk_t callback = {.unlink = func};</div><div class='add'>+    ec_fop_data_t *fop = NULL;</div><div class='add'>+    int32_t error = ENOMEM;</div><div class='add'>+</div><div class='add'>+    gf_msg_trace("ec", 0, "EC(UNLINK) %p", frame);</div><div class='add'>+</div><div class='add'>+    VALIDATE_OR_GOTO(this, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, frame, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, this-&gt;private, out);</div><div class='add'>+</div><div class='add'>+    fop = ec_fop_data_allocate(frame, this, GF_FOP_UNLINK, 0, target, fop_flags,</div><div class='add'>+                               ec_wind_unlink, ec_manager_unlink, callback,</div><div class='add'>+                               data);</div><div class='add'>+    if (fop == NULL) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    fop-&gt;int32 = xflags;</div><div class='add'>+</div><div class='add'>+    if (loc != NULL) {</div><div class='add'>+        if (loc_copy(&amp;fop-&gt;loc[0], loc) != 0) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, ENOMEM, EC_MSG_LOC_COPY_FAIL,</div><div class='add'>+                   "Failed to copy a location.");</div><div class='add'>+</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    if (xdata != NULL) {</div><div class='add'>+        fop-&gt;xdata = dict_copy_with_ref(xdata, NULL);</div><div class='add'>+        if (fop-&gt;xdata == NULL) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, 0, EC_MSG_DICT_REF_FAIL,</div><div class='add'>+                   "Failed to reference a "</div><div class='add'>+                   "dictionary.");</div><div class='add'>+</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    error = 0;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (fop != NULL) {</div><div class='add'>+        ec_manager(fop, error);</div><div class='add'>+    } else {</div><div class='add'>+        func(frame, NULL, this, -1, error, NULL, NULL, NULL);</div><div class='add'>+    }</div><div class='add'>+}</div><div class='head'>diff --git a/xlators/cluster/ec/src/ec-fops.h b/xlators/cluster/ec/src/ec-fops.h<br/>new file mode 100644<br/>index 00000000000..07edf8a7fec<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/xlators/cluster/ec/src/ec-fops.h?id=d1d7a6f35c816822fab51c820e25023863c239c1'>xlators/cluster/ec/src/ec-fops.h</a></div><div class='hunk'>@@ -0,0 +1,254 @@</div><div class='add'>+/*</div><div class='add'>+  Copyright (c) 2012-2014 DataLab, s.l. &lt;http://www.datalab.es&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#ifndef __EC_FOPS_H__</div><div class='add'>+#define __EC_FOPS_H__</div><div class='add'>+</div><div class='add'>+#include &lt;glusterfs/xlator.h&gt;</div><div class='add'>+</div><div class='add'>+#include "ec-types.h"</div><div class='add'>+#include "ec-common.h"</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_access(call_frame_t *frame, xlator_t *this, uintptr_t target,</div><div class='add'>+          uint32_t fop_flags, fop_access_cbk_t func, void *data, loc_t *loc,</div><div class='add'>+          int32_t mask, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_create(call_frame_t *frame, xlator_t *this, uintptr_t target,</div><div class='add'>+          uint32_t fop_flags, fop_create_cbk_t func, void *data, loc_t *loc,</div><div class='add'>+          int32_t flags, mode_t mode, mode_t umask, fd_t *fd, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_entrylk(call_frame_t *frame, xlator_t *this, uintptr_t target,</div><div class='add'>+           uint32_t fop_flags, fop_entrylk_cbk_t func, void *data,</div><div class='add'>+           const char *volume, loc_t *loc, const char *basename,</div><div class='add'>+           entrylk_cmd cmd, entrylk_type type, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_fentrylk(call_frame_t *frame, xlator_t *this, uintptr_t target,</div><div class='add'>+            uint32_t fop_flags, fop_fentrylk_cbk_t func, void *data,</div><div class='add'>+            const char *volume, fd_t *fd, const char *basename, entrylk_cmd cmd,</div><div class='add'>+            entrylk_type type, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_flush(call_frame_t *frame, xlator_t *this, uintptr_t target,</div><div class='add'>+         uint32_t fop_flags, fop_flush_cbk_t func, void *data, fd_t *fd,</div><div class='add'>+         dict_t *xdata);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_fsync(call_frame_t *frame, xlator_t *this, uintptr_t target,</div><div class='add'>+         uint32_t fop_flags, fop_fsync_cbk_t func, void *data, fd_t *fd,</div><div class='add'>+         int32_t datasync, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_fsyncdir(call_frame_t *frame, xlator_t *this, uintptr_t target,</div><div class='add'>+            uint32_t fop_flags, fop_fsyncdir_cbk_t func, void *data, fd_t *fd,</div><div class='add'>+            int32_t datasync, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_getxattr(call_frame_t *frame, xlator_t *this, uintptr_t target,</div><div class='add'>+            uint32_t fop_flags, fop_getxattr_cbk_t func, void *data, loc_t *loc,</div><div class='add'>+            const char *name, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_fgetxattr(call_frame_t *frame, xlator_t *this, uintptr_t target,</div><div class='add'>+             uint32_t fop_flags, fop_fgetxattr_cbk_t func, void *data, fd_t *fd,</div><div class='add'>+             const char *name, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_heal(call_frame_t *frame, xlator_t *this, uintptr_t target,</div><div class='add'>+        uint32_t fop_flags, fop_heal_cbk_t func, void *data, loc_t *loc,</div><div class='add'>+        int32_t partial, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_fheal(call_frame_t *frame, xlator_t *this, uintptr_t target,</div><div class='add'>+         uint32_t fop_flags, fop_fheal_cbk_t func, void *data, fd_t *fd,</div><div class='add'>+         int32_t partial, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_inodelk(call_frame_t *frame, xlator_t *this, gf_lkowner_t *owner,</div><div class='add'>+           uintptr_t target, uint32_t fop_flags, fop_inodelk_cbk_t func,</div><div class='add'>+           void *data, const char *volume, loc_t *loc, int32_t cmd,</div><div class='add'>+           struct gf_flock *flock, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_finodelk(call_frame_t *frame, xlator_t *this, gf_lkowner_t *owner,</div><div class='add'>+            uintptr_t target, uint32_t fop_flags, fop_finodelk_cbk_t func,</div><div class='add'>+            void *data, const char *volume, fd_t *fd, int32_t cmd,</div><div class='add'>+            struct gf_flock *flock, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_link(call_frame_t *frame, xlator_t *this, uintptr_t target,</div><div class='add'>+        uint32_t fop_flags, fop_link_cbk_t func, void *data, loc_t *oldloc,</div><div class='add'>+        loc_t *newloc, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_lk(call_frame_t *frame, xlator_t *this, uintptr_t target, uint32_t fop_flags,</div><div class='add'>+      fop_lk_cbk_t func, void *data, fd_t *fd, int32_t cmd,</div><div class='add'>+      struct gf_flock *flock, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_lookup(call_frame_t *frame, xlator_t *this, uintptr_t target,</div><div class='add'>+          uint32_t fop_flags, fop_lookup_cbk_t func, void *data, loc_t *loc,</div><div class='add'>+          dict_t *xdata);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_mkdir(call_frame_t *frame, xlator_t *this, uintptr_t target,</div><div class='add'>+         uint32_t fop_flags, fop_mkdir_cbk_t func, void *data, loc_t *loc,</div><div class='add'>+         mode_t mode, mode_t umask, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_mknod(call_frame_t *frame, xlator_t *this, uintptr_t target,</div><div class='add'>+         uint32_t fop_flags, fop_mknod_cbk_t func, void *data, loc_t *loc,</div><div class='add'>+         mode_t mode, dev_t rdev, mode_t umask, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_open(call_frame_t *frame, xlator_t *this, uintptr_t target,</div><div class='add'>+        uint32_t fop_flags, fop_open_cbk_t func, void *data, loc_t *loc,</div><div class='add'>+        int32_t flags, fd_t *fd, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_opendir(call_frame_t *frame, xlator_t *this, uintptr_t target,</div><div class='add'>+           uint32_t fop_flags, fop_opendir_cbk_t func, void *data, loc_t *loc,</div><div class='add'>+           fd_t *fd, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_readdir(call_frame_t *frame, xlator_t *this, uintptr_t target,</div><div class='add'>+           uint32_t fop_flags, fop_readdir_cbk_t func, void *data, fd_t *fd,</div><div class='add'>+           size_t size, off_t offset, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_readdirp(call_frame_t *frame, xlator_t *this, uintptr_t target,</div><div class='add'>+            uint32_t fop_flags, fop_readdirp_cbk_t func, void *data, fd_t *fd,</div><div class='add'>+            size_t size, off_t offset, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_readlink(call_frame_t *frame, xlator_t *this, uintptr_t target,</div><div class='add'>+            uint32_t fop_flags, fop_readlink_cbk_t func, void *data, loc_t *loc,</div><div class='add'>+            size_t size, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_readv(call_frame_t *frame, xlator_t *this, uintptr_t target,</div><div class='add'>+         uint32_t fop_flags, fop_readv_cbk_t func, void *data, fd_t *fd,</div><div class='add'>+         size_t size, off_t offset, uint32_t flags, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_removexattr(call_frame_t *frame, xlator_t *this, uintptr_t target,</div><div class='add'>+               uint32_t fop_flags, fop_removexattr_cbk_t func, void *data,</div><div class='add'>+               loc_t *loc, const char *name, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_fremovexattr(call_frame_t *frame, xlator_t *this, uintptr_t target,</div><div class='add'>+                uint32_t fop_flags, fop_fremovexattr_cbk_t func, void *data,</div><div class='add'>+                fd_t *fd, const char *name, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_rename(call_frame_t *frame, xlator_t *this, uintptr_t target,</div><div class='add'>+          uint32_t fop_flags, fop_rename_cbk_t func, void *data, loc_t *oldloc,</div><div class='add'>+          loc_t *newloc, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_rmdir(call_frame_t *frame, xlator_t *this, uintptr_t target,</div><div class='add'>+         uint32_t fop_flags, fop_rmdir_cbk_t func, void *data, loc_t *loc,</div><div class='add'>+         int xflags, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_setattr(call_frame_t *frame, xlator_t *this, uintptr_t target,</div><div class='add'>+           uint32_t fop_flags, fop_setattr_cbk_t func, void *data, loc_t *loc,</div><div class='add'>+           struct iatt *stbuf, int32_t valid, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_fsetattr(call_frame_t *frame, xlator_t *this, uintptr_t target,</div><div class='add'>+            uint32_t fop_flags, fop_fsetattr_cbk_t func, void *data, fd_t *fd,</div><div class='add'>+            struct iatt *stbuf, int32_t valid, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_setxattr(call_frame_t *frame, xlator_t *this, uintptr_t target,</div><div class='add'>+            uint32_t fop_flags, fop_setxattr_cbk_t func, void *data, loc_t *loc,</div><div class='add'>+            dict_t *dict, int32_t flags, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_fsetxattr(call_frame_t *frame, xlator_t *this, uintptr_t target,</div><div class='add'>+             uint32_t fop_flags, fop_fsetxattr_cbk_t func, void *data, fd_t *fd,</div><div class='add'>+             dict_t *dict, int32_t flags, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_stat(call_frame_t *frame, xlator_t *this, uintptr_t target,</div><div class='add'>+        uint32_t fop_flags, fop_stat_cbk_t func, void *data, loc_t *loc,</div><div class='add'>+        dict_t *xdata);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_fstat(call_frame_t *frame, xlator_t *this, uintptr_t target,</div><div class='add'>+         uint32_t fop_flags, fop_fstat_cbk_t func, void *data, fd_t *fd,</div><div class='add'>+         dict_t *xdata);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_statfs(call_frame_t *frame, xlator_t *this, uintptr_t target,</div><div class='add'>+          uint32_t fop_flags, fop_statfs_cbk_t func, void *data, loc_t *loc,</div><div class='add'>+          dict_t *xdata);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_symlink(call_frame_t *frame, xlator_t *this, uintptr_t target,</div><div class='add'>+           uint32_t fop_flags, fop_symlink_cbk_t func, void *data,</div><div class='add'>+           const char *linkname, loc_t *loc, mode_t umask, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_fallocate(call_frame_t *frame, xlator_t *this, uintptr_t target,</div><div class='add'>+             uint32_t fop_flags, fop_fallocate_cbk_t func, void *data, fd_t *fd,</div><div class='add'>+             int32_t mode, off_t offset, size_t len, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_discard(call_frame_t *frame, xlator_t *this, uintptr_t target,</div><div class='add'>+           uint32_t fop_flags, fop_discard_cbk_t func, void *data, fd_t *fd,</div><div class='add'>+           off_t offset, size_t len, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_truncate(call_frame_t *frame, xlator_t *this, uintptr_t target,</div><div class='add'>+            uint32_t fop_flags, fop_truncate_cbk_t func, void *data, loc_t *loc,</div><div class='add'>+            off_t offset, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_ftruncate(call_frame_t *frame, xlator_t *this, uintptr_t target,</div><div class='add'>+             uint32_t fop_flags, fop_ftruncate_cbk_t func, void *data, fd_t *fd,</div><div class='add'>+             off_t offset, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_unlink(call_frame_t *frame, xlator_t *this, uintptr_t target,</div><div class='add'>+          uint32_t fop_flags, fop_unlink_cbk_t func, void *data, loc_t *loc,</div><div class='add'>+          int xflags, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_writev(call_frame_t *frame, xlator_t *this, uintptr_t target,</div><div class='add'>+          uint32_t fop_flags, fop_writev_cbk_t func, void *data, fd_t *fd,</div><div class='add'>+          struct iovec *vector, int32_t count, off_t offset, uint32_t flags,</div><div class='add'>+          struct iobref *iobref, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_xattrop(call_frame_t *frame, xlator_t *this, uintptr_t target,</div><div class='add'>+           uint32_t fop_flags, fop_xattrop_cbk_t func, void *data, loc_t *loc,</div><div class='add'>+           gf_xattrop_flags_t optype, dict_t *xattr, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_fxattrop(call_frame_t *frame, xlator_t *this, uintptr_t target,</div><div class='add'>+            uint32_t fop_flags, fop_fxattrop_cbk_t func, void *data, fd_t *fd,</div><div class='add'>+            gf_xattrop_flags_t optype, dict_t *xattr, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_seek(call_frame_t *frame, xlator_t *this, uintptr_t target,</div><div class='add'>+        uint32_t fop_flags, fop_seek_cbk_t func, void *data, fd_t *fd,</div><div class='add'>+        off_t offset, gf_seek_what_t what, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_ipc(call_frame_t *frame, xlator_t *this, uintptr_t target,</div><div class='add'>+       uint32_t fop_flags, fop_ipc_cbk_t func, void *data, int32_t op,</div><div class='add'>+       dict_t *xdata);</div><div class='add'>+</div><div class='add'>+#endif /* __EC_FOPS_H__ */</div><div class='head'>diff --git a/xlators/cluster/ec/src/ec-galois.c b/xlators/cluster/ec/src/ec-galois.c<br/>new file mode 100644<br/>index 00000000000..6e4990c71f5<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/xlators/cluster/ec/src/ec-galois.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>xlators/cluster/ec/src/ec-galois.c</a></div><div class='hunk'>@@ -0,0 +1,183 @@</div><div class='add'>+/*</div><div class='add'>+  Copyright (c) 2015 DataLab, s.l. &lt;http://www.datalab.es&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#include &lt;string.h&gt;</div><div class='add'>+</div><div class='add'>+#include "ec-mem-types.h"</div><div class='add'>+#include "ec-gf8.h"</div><div class='add'>+#include "ec-helpers.h"</div><div class='add'>+</div><div class='add'>+static ec_gf_t *</div><div class='add'>+ec_gf_alloc(uint32_t bits, uint32_t mod)</div><div class='add'>+{</div><div class='add'>+    ec_gf_t *gf;</div><div class='add'>+</div><div class='add'>+    gf = GF_MALLOC(sizeof(ec_gf_t), ec_mt_ec_gf_t);</div><div class='add'>+    if (gf == NULL) {</div><div class='add'>+        goto failed;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    gf-&gt;bits = bits;</div><div class='add'>+    gf-&gt;size = 1 &lt;&lt; bits;</div><div class='add'>+    gf-&gt;mod = mod;</div><div class='add'>+</div><div class='add'>+    gf-&gt;log = GF_MALLOC(sizeof(uint32_t) * (gf-&gt;size * 2 - 1),</div><div class='add'>+                        gf_common_mt_int);</div><div class='add'>+    if (gf-&gt;log == NULL) {</div><div class='add'>+        goto failed_gf;</div><div class='add'>+    }</div><div class='add'>+    gf-&gt;pow = GF_MALLOC(sizeof(uint32_t) * (gf-&gt;size * 2 - 1),</div><div class='add'>+                        gf_common_mt_int);</div><div class='add'>+    if (gf-&gt;pow == NULL) {</div><div class='add'>+        goto failed_log;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return gf;</div><div class='add'>+</div><div class='add'>+failed_log:</div><div class='add'>+    GF_FREE(gf-&gt;log);</div><div class='add'>+failed_gf:</div><div class='add'>+    GF_FREE(gf);</div><div class='add'>+failed:</div><div class='add'>+    return EC_ERR(ENOMEM);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+ec_gf_init_tables(ec_gf_t *gf)</div><div class='add'>+{</div><div class='add'>+    uint32_t i, tmp;</div><div class='add'>+</div><div class='add'>+    memset(gf-&gt;log, -1, sizeof(uint32_t) * gf-&gt;size);</div><div class='add'>+</div><div class='add'>+    gf-&gt;pow[0] = 1;</div><div class='add'>+    gf-&gt;log[0] = gf-&gt;size;</div><div class='add'>+    gf-&gt;log[1] = 0;</div><div class='add'>+    for (i = 1; i &lt; gf-&gt;size; i++) {</div><div class='add'>+        tmp = gf-&gt;pow[i - 1] &lt;&lt; 1;</div><div class='add'>+        if (tmp &gt;= gf-&gt;size) {</div><div class='add'>+            tmp ^= gf-&gt;mod;</div><div class='add'>+        }</div><div class='add'>+        gf-&gt;pow[i + gf-&gt;size - 1] = gf-&gt;pow[i] = tmp;</div><div class='add'>+        gf-&gt;log[tmp + gf-&gt;size - 1] = gf-&gt;log[tmp] = i;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+ec_gf_t *</div><div class='add'>+ec_gf_prepare(uint32_t bits, uint32_t mod)</div><div class='add'>+{</div><div class='add'>+    ec_gf_mul_t **tbl;</div><div class='add'>+    ec_gf_t *gf;</div><div class='add'>+    uint32_t i, j;</div><div class='add'>+</div><div class='add'>+    if (bits != 8) {</div><div class='add'>+        return EC_ERR(EINVAL);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    tbl = ec_gf8_mul;</div><div class='add'>+    if (mod == 0) {</div><div class='add'>+        mod = 0x11d;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    gf = ec_gf_alloc(bits, mod);</div><div class='add'>+    if (EC_IS_ERR(gf)) {</div><div class='add'>+        return gf;</div><div class='add'>+    }</div><div class='add'>+    ec_gf_init_tables(gf);</div><div class='add'>+</div><div class='add'>+    gf-&gt;table = tbl;</div><div class='add'>+    gf-&gt;min_ops = bits * bits;</div><div class='add'>+    gf-&gt;max_ops = 0;</div><div class='add'>+    gf-&gt;avg_ops = 0;</div><div class='add'>+    for (i = 1; i &lt; gf-&gt;size; i++) {</div><div class='add'>+        for (j = 0; tbl[i]-&gt;ops[j].op != EC_GF_OP_END; j++) {</div><div class='add'>+        }</div><div class='add'>+        if (gf-&gt;max_ops &lt; j) {</div><div class='add'>+            gf-&gt;max_ops = j;</div><div class='add'>+        }</div><div class='add'>+        if (gf-&gt;min_ops &gt; j) {</div><div class='add'>+            gf-&gt;min_ops = j;</div><div class='add'>+        }</div><div class='add'>+        gf-&gt;avg_ops += j;</div><div class='add'>+    }</div><div class='add'>+    gf-&gt;avg_ops /= gf-&gt;size;</div><div class='add'>+</div><div class='add'>+    return gf;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_gf_destroy(ec_gf_t *gf)</div><div class='add'>+{</div><div class='add'>+    GF_FREE(gf-&gt;pow);</div><div class='add'>+    GF_FREE(gf-&gt;log);</div><div class='add'>+    GF_FREE(gf);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+uint32_t</div><div class='add'>+ec_gf_add(ec_gf_t *gf, uint32_t a, uint32_t b)</div><div class='add'>+{</div><div class='add'>+    if ((a &gt;= gf-&gt;size) || (b &gt;= gf-&gt;size)) {</div><div class='add'>+        return gf-&gt;size;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return a ^ b;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+uint32_t</div><div class='add'>+ec_gf_mul(ec_gf_t *gf, uint32_t a, uint32_t b)</div><div class='add'>+{</div><div class='add'>+    if ((a &gt;= gf-&gt;size) || (b &gt;= gf-&gt;size)) {</div><div class='add'>+        return gf-&gt;size;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if ((a != 0) &amp;&amp; (b != 0)) {</div><div class='add'>+        return gf-&gt;pow[gf-&gt;log[a] + gf-&gt;log[b]];</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+uint32_t</div><div class='add'>+ec_gf_div(ec_gf_t *gf, uint32_t a, uint32_t b)</div><div class='add'>+{</div><div class='add'>+    if ((a &gt;= gf-&gt;size) || (b &gt;= gf-&gt;size)) {</div><div class='add'>+        return gf-&gt;size;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (b != 0) {</div><div class='add'>+        if (a != 0) {</div><div class='add'>+            return gf-&gt;pow[gf-&gt;size - 1 + gf-&gt;log[a] - gf-&gt;log[b]];</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return gf-&gt;size;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+uint32_t</div><div class='add'>+ec_gf_exp(ec_gf_t *gf, uint32_t a, uint32_t b)</div><div class='add'>+{</div><div class='add'>+    uint32_t r;</div><div class='add'>+</div><div class='add'>+    if ((a &gt;= gf-&gt;size) || ((a == 0) &amp;&amp; (b == 0))) {</div><div class='add'>+        return gf-&gt;size;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    r = 1;</div><div class='add'>+    while (b != 0) {</div><div class='add'>+        if ((b &amp; 1) != 0) {</div><div class='add'>+            r = ec_gf_mul(gf, r, a);</div><div class='add'>+        }</div><div class='add'>+        a = ec_gf_mul(gf, a, a);</div><div class='add'>+        b &gt;&gt;= 1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return r;</div><div class='add'>+}</div><div class='head'>diff --git a/xlators/cluster/ec/src/ec-galois.h b/xlators/cluster/ec/src/ec-galois.h<br/>new file mode 100644<br/>index 00000000000..ed55d53e419<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/xlators/cluster/ec/src/ec-galois.h?id=d1d7a6f35c816822fab51c820e25023863c239c1'>xlators/cluster/ec/src/ec-galois.h</a></div><div class='hunk'>@@ -0,0 +1,32 @@</div><div class='add'>+/*</div><div class='add'>+  Copyright (c) 2015 DataLab, s.l. &lt;http://www.datalab.es&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#ifndef __EC_GALOIS_H__</div><div class='add'>+#define __EC_GALOIS_H__</div><div class='add'>+</div><div class='add'>+#include &lt;inttypes.h&gt;</div><div class='add'>+</div><div class='add'>+#include "ec-types.h"</div><div class='add'>+</div><div class='add'>+ec_gf_t *</div><div class='add'>+ec_gf_prepare(uint32_t bits, uint32_t mod);</div><div class='add'>+void</div><div class='add'>+ec_gf_destroy(ec_gf_t *gf);</div><div class='add'>+</div><div class='add'>+uint32_t</div><div class='add'>+ec_gf_add(ec_gf_t *gf, uint32_t a, uint32_t b);</div><div class='add'>+uint32_t</div><div class='add'>+ec_gf_mul(ec_gf_t *gf, uint32_t a, uint32_t b);</div><div class='add'>+uint32_t</div><div class='add'>+ec_gf_div(ec_gf_t *gf, uint32_t a, uint32_t b);</div><div class='add'>+uint32_t</div><div class='add'>+ec_gf_exp(ec_gf_t *gf, uint32_t a, uint32_t b);</div><div class='add'>+</div><div class='add'>+#endif /* __EC_GALOIS_H__ */</div><div class='head'>diff --git a/xlators/cluster/ec/src/ec-generic.c b/xlators/cluster/ec/src/ec-generic.c<br/>new file mode 100644<br/>index 00000000000..884deb93669<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/xlators/cluster/ec/src/ec-generic.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>xlators/cluster/ec/src/ec-generic.c</a></div><div class='hunk'>@@ -0,0 +1,1591 @@</div><div class='add'>+/*</div><div class='add'>+  Copyright (c) 2012-2014 DataLab, s.l. &lt;http://www.datalab.es&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#include &lt;glusterfs/byte-order.h&gt;</div><div class='add'>+</div><div class='add'>+#include "ec.h"</div><div class='add'>+#include "ec-messages.h"</div><div class='add'>+#include "ec-helpers.h"</div><div class='add'>+#include "ec-common.h"</div><div class='add'>+#include "ec-combine.h"</div><div class='add'>+#include "ec-fops.h"</div><div class='add'>+</div><div class='add'>+/* FOP: flush */</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_flush_cbk(call_frame_t *frame, void *cookie, xlator_t *this, int32_t op_ret,</div><div class='add'>+             int32_t op_errno, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    ec_fop_data_t *fop = NULL;</div><div class='add'>+    ec_cbk_data_t *cbk = NULL;</div><div class='add'>+    int32_t idx = (int32_t)(uintptr_t)cookie;</div><div class='add'>+</div><div class='add'>+    VALIDATE_OR_GOTO(this, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, frame, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, frame-&gt;local, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, this-&gt;private, out);</div><div class='add'>+</div><div class='add'>+    fop = frame-&gt;local;</div><div class='add'>+</div><div class='add'>+    ec_trace("CBK", fop, "idx=%d, frame=%p, op_ret=%d, op_errno=%d", idx, frame,</div><div class='add'>+             op_ret, op_errno);</div><div class='add'>+</div><div class='add'>+    cbk = ec_cbk_data_allocate(frame, this, fop, GF_FOP_FLUSH, idx, op_ret,</div><div class='add'>+                               op_errno);</div><div class='add'>+    if (cbk != NULL) {</div><div class='add'>+        if (xdata != NULL) {</div><div class='add'>+            cbk-&gt;xdata = dict_ref(xdata);</div><div class='add'>+            if (cbk-&gt;xdata == NULL) {</div><div class='add'>+                gf_msg(this-&gt;name, GF_LOG_ERROR, 0, EC_MSG_DICT_REF_FAIL,</div><div class='add'>+                       "Failed to reference a "</div><div class='add'>+                       "dictionary.");</div><div class='add'>+</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        ec_combine(cbk, NULL);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (fop != NULL) {</div><div class='add'>+        ec_complete(fop);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_wind_flush(ec_t *ec, ec_fop_data_t *fop, int32_t idx)</div><div class='add'>+{</div><div class='add'>+    ec_trace("WIND", fop, "idx=%d", idx);</div><div class='add'>+</div><div class='add'>+    STACK_WIND_COOKIE(fop-&gt;frame, ec_flush_cbk, (void *)(uintptr_t)idx,</div><div class='add'>+                      ec-&gt;xl_list[idx], ec-&gt;xl_list[idx]-&gt;fops-&gt;flush, fop-&gt;fd,</div><div class='add'>+                      fop-&gt;xdata);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_manager_flush(ec_fop_data_t *fop, int32_t state)</div><div class='add'>+{</div><div class='add'>+    ec_cbk_data_t *cbk;</div><div class='add'>+</div><div class='add'>+    switch (state) {</div><div class='add'>+        case EC_STATE_INIT:</div><div class='add'>+        case EC_STATE_LOCK:</div><div class='add'>+            ec_lock_prepare_fd(fop, fop-&gt;fd, 0, 0, EC_RANGE_FULL);</div><div class='add'>+            ec_lock(fop);</div><div class='add'>+</div><div class='add'>+            return EC_STATE_DISPATCH;</div><div class='add'>+</div><div class='add'>+        case EC_STATE_DISPATCH:</div><div class='add'>+            ec_flush_size_version(fop);</div><div class='add'>+</div><div class='add'>+            return EC_STATE_DELAYED_START;</div><div class='add'>+</div><div class='add'>+        case EC_STATE_DELAYED_START:</div><div class='add'>+            ec_dispatch_all(fop);</div><div class='add'>+</div><div class='add'>+            return EC_STATE_PREPARE_ANSWER;</div><div class='add'>+</div><div class='add'>+        case EC_STATE_PREPARE_ANSWER:</div><div class='add'>+            ec_fop_prepare_answer(fop, _gf_false);</div><div class='add'>+</div><div class='add'>+            return EC_STATE_REPORT;</div><div class='add'>+</div><div class='add'>+        case EC_STATE_REPORT:</div><div class='add'>+            cbk = fop-&gt;answer;</div><div class='add'>+</div><div class='add'>+            GF_ASSERT(cbk != NULL);</div><div class='add'>+</div><div class='add'>+            if (fop-&gt;cbks.flush != NULL) {</div><div class='add'>+                fop-&gt;cbks.flush(fop-&gt;req_frame, fop, fop-&gt;xl, cbk-&gt;op_ret,</div><div class='add'>+                                cbk-&gt;op_errno, cbk-&gt;xdata);</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            return EC_STATE_LOCK_REUSE;</div><div class='add'>+</div><div class='add'>+        case -EC_STATE_INIT:</div><div class='add'>+        case -EC_STATE_LOCK:</div><div class='add'>+        case -EC_STATE_DELAYED_START:</div><div class='add'>+        case -EC_STATE_DISPATCH:</div><div class='add'>+        case -EC_STATE_PREPARE_ANSWER:</div><div class='add'>+        case -EC_STATE_REPORT:</div><div class='add'>+            GF_ASSERT(fop-&gt;error != 0);</div><div class='add'>+</div><div class='add'>+            if (fop-&gt;cbks.flush != NULL) {</div><div class='add'>+                fop-&gt;cbks.flush(fop-&gt;req_frame, fop, fop-&gt;xl, -1, fop-&gt;error,</div><div class='add'>+                                NULL);</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            return EC_STATE_LOCK_REUSE;</div><div class='add'>+</div><div class='add'>+        case -EC_STATE_LOCK_REUSE:</div><div class='add'>+        case EC_STATE_LOCK_REUSE:</div><div class='add'>+            ec_lock_reuse(fop);</div><div class='add'>+</div><div class='add'>+            return EC_STATE_UNLOCK;</div><div class='add'>+</div><div class='add'>+        case -EC_STATE_UNLOCK:</div><div class='add'>+        case EC_STATE_UNLOCK:</div><div class='add'>+            ec_unlock(fop);</div><div class='add'>+</div><div class='add'>+            return EC_STATE_END;</div><div class='add'>+</div><div class='add'>+        default:</div><div class='add'>+            gf_msg(fop-&gt;xl-&gt;name, GF_LOG_ERROR, EINVAL, EC_MSG_UNHANDLED_STATE,</div><div class='add'>+                   "Unhandled state %d for %s", state, ec_fop_name(fop-&gt;id));</div><div class='add'>+</div><div class='add'>+            return EC_STATE_END;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int32_t</div><div class='add'>+ec_validate_fd(fd_t *fd, xlator_t *xl)</div><div class='add'>+{</div><div class='add'>+    uint64_t iversion = 0;</div><div class='add'>+    uint64_t fversion = 0;</div><div class='add'>+    ec_inode_t *inode_ctx = NULL;</div><div class='add'>+    ec_fd_t *fd_ctx = NULL;</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;fd-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        fd_ctx = __ec_fd_get(fd, xl);</div><div class='add'>+        if (fd_ctx) {</div><div class='add'>+            fversion = fd_ctx-&gt;bad_version;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    UNLOCK(&amp;fd-&gt;lock);</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;fd-&gt;inode-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        inode_ctx = __ec_inode_get(fd-&gt;inode, xl);</div><div class='add'>+        if (inode_ctx) {</div><div class='add'>+            iversion = inode_ctx-&gt;bad_version;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    UNLOCK(&amp;fd-&gt;inode-&gt;lock);</div><div class='add'>+    if (fversion &lt; iversion) {</div><div class='add'>+        return EBADF;</div><div class='add'>+    }</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_flush(call_frame_t *frame, xlator_t *this, uintptr_t target,</div><div class='add'>+         uint32_t fop_flags, fop_flush_cbk_t func, void *data, fd_t *fd,</div><div class='add'>+         dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    ec_cbk_t callback = {.flush = func};</div><div class='add'>+    ec_fop_data_t *fop = NULL;</div><div class='add'>+    int32_t error = ENOMEM;</div><div class='add'>+</div><div class='add'>+    gf_msg_trace("ec", 0, "EC(FLUSH) %p", frame);</div><div class='add'>+</div><div class='add'>+    VALIDATE_OR_GOTO(this, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, frame, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, this-&gt;private, out);</div><div class='add'>+</div><div class='add'>+    if (fd) {</div><div class='add'>+        error = ec_validate_fd(fd, this);</div><div class='add'>+        if (error) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, EBADF, EC_MSG_FD_BAD,</div><div class='add'>+                   "Failing %s on %s", gf_fop_list[GF_FOP_FLUSH],</div><div class='add'>+                   fd-&gt;inode ? uuid_utoa(fd-&gt;inode-&gt;gfid) : "");</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    fop = ec_fop_data_allocate(frame, this, GF_FOP_FLUSH, 0, target, fop_flags,</div><div class='add'>+                               ec_wind_flush, ec_manager_flush, callback, data);</div><div class='add'>+    if (fop == NULL) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    fop-&gt;use_fd = 1;</div><div class='add'>+</div><div class='add'>+    if (fd != NULL) {</div><div class='add'>+        fop-&gt;fd = fd_ref(fd);</div><div class='add'>+        if (fop-&gt;fd == NULL) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, 0, EC_MSG_FILE_DESC_REF_FAIL,</div><div class='add'>+                   "Failed to reference a "</div><div class='add'>+                   "file descriptor.");</div><div class='add'>+</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    if (xdata != NULL) {</div><div class='add'>+        fop-&gt;xdata = dict_ref(xdata);</div><div class='add'>+        if (fop-&gt;xdata == NULL) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, 0, EC_MSG_DICT_REF_FAIL,</div><div class='add'>+                   "Failed to reference a "</div><div class='add'>+                   "dictionary.");</div><div class='add'>+</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    error = 0;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (fop != NULL) {</div><div class='add'>+        ec_manager(fop, error);</div><div class='add'>+    } else {</div><div class='add'>+        func(frame, NULL, this, -1, error, NULL);</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* FOP: fsync */</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_combine_fsync(ec_fop_data_t *fop, ec_cbk_data_t *dst, ec_cbk_data_t *src)</div><div class='add'>+{</div><div class='add'>+    if (!ec_iatt_combine(fop, dst-&gt;iatt, src-&gt;iatt, 2)) {</div><div class='add'>+        gf_msg(fop-&gt;xl-&gt;name, GF_LOG_NOTICE, 0, EC_MSG_IATT_MISMATCH,</div><div class='add'>+               "Mismatching iatt in "</div><div class='add'>+               "answers of 'GF_FOP_FSYNC'");</div><div class='add'>+</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_fsync_cbk(call_frame_t *frame, void *cookie, xlator_t *this, int32_t op_ret,</div><div class='add'>+             int32_t op_errno, struct iatt *prebuf, struct iatt *postbuf,</div><div class='add'>+             dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    ec_fop_data_t *fop = NULL;</div><div class='add'>+    ec_cbk_data_t *cbk = NULL;</div><div class='add'>+    int32_t idx = (int32_t)(uintptr_t)cookie;</div><div class='add'>+</div><div class='add'>+    VALIDATE_OR_GOTO(this, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, frame, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, frame-&gt;local, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, this-&gt;private, out);</div><div class='add'>+</div><div class='add'>+    fop = frame-&gt;local;</div><div class='add'>+</div><div class='add'>+    ec_trace("CBK", fop, "idx=%d, frame=%p, op_ret=%d, op_errno=%d", idx, frame,</div><div class='add'>+             op_ret, op_errno);</div><div class='add'>+</div><div class='add'>+    cbk = ec_cbk_data_allocate(frame, this, fop, GF_FOP_FSYNC, idx, op_ret,</div><div class='add'>+                               op_errno);</div><div class='add'>+    if (cbk != NULL) {</div><div class='add'>+        if (op_ret &gt;= 0) {</div><div class='add'>+            if (prebuf != NULL) {</div><div class='add'>+                cbk-&gt;iatt[0] = *prebuf;</div><div class='add'>+            }</div><div class='add'>+            if (postbuf != NULL) {</div><div class='add'>+                cbk-&gt;iatt[1] = *postbuf;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+        if (xdata != NULL) {</div><div class='add'>+            cbk-&gt;xdata = dict_ref(xdata);</div><div class='add'>+            if (cbk-&gt;xdata == NULL) {</div><div class='add'>+                gf_msg(this-&gt;name, GF_LOG_ERROR, 0, EC_MSG_DICT_REF_FAIL,</div><div class='add'>+                       "Failed to reference a "</div><div class='add'>+                       "dictionary.");</div><div class='add'>+</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        ec_combine(cbk, ec_combine_fsync);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (fop != NULL) {</div><div class='add'>+        ec_complete(fop);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_wind_fsync(ec_t *ec, ec_fop_data_t *fop, int32_t idx)</div><div class='add'>+{</div><div class='add'>+    ec_trace("WIND", fop, "idx=%d", idx);</div><div class='add'>+</div><div class='add'>+    STACK_WIND_COOKIE(fop-&gt;frame, ec_fsync_cbk, (void *)(uintptr_t)idx,</div><div class='add'>+                      ec-&gt;xl_list[idx], ec-&gt;xl_list[idx]-&gt;fops-&gt;fsync, fop-&gt;fd,</div><div class='add'>+                      fop-&gt;int32, fop-&gt;xdata);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_manager_fsync(ec_fop_data_t *fop, int32_t state)</div><div class='add'>+{</div><div class='add'>+    ec_cbk_data_t *cbk;</div><div class='add'>+</div><div class='add'>+    switch (state) {</div><div class='add'>+        case EC_STATE_INIT:</div><div class='add'>+        case EC_STATE_LOCK:</div><div class='add'>+            ec_lock_prepare_fd(fop, fop-&gt;fd, EC_QUERY_INFO, 0, EC_RANGE_FULL);</div><div class='add'>+            ec_lock(fop);</div><div class='add'>+</div><div class='add'>+            return EC_STATE_DISPATCH;</div><div class='add'>+</div><div class='add'>+        case EC_STATE_DISPATCH:</div><div class='add'>+            ec_flush_size_version(fop);</div><div class='add'>+</div><div class='add'>+            return EC_STATE_DELAYED_START;</div><div class='add'>+</div><div class='add'>+        case EC_STATE_DELAYED_START:</div><div class='add'>+            ec_dispatch_all(fop);</div><div class='add'>+</div><div class='add'>+            return EC_STATE_PREPARE_ANSWER;</div><div class='add'>+</div><div class='add'>+        case EC_STATE_PREPARE_ANSWER:</div><div class='add'>+            cbk = ec_fop_prepare_answer(fop, _gf_false);</div><div class='add'>+            if (cbk != NULL) {</div><div class='add'>+                ec_iatt_rebuild(fop-&gt;xl-&gt;private, cbk-&gt;iatt, 2, cbk-&gt;count);</div><div class='add'>+</div><div class='add'>+                /* This shouldn't fail because we have the inode locked. */</div><div class='add'>+                GF_ASSERT(ec_get_inode_size(fop, fop-&gt;fd-&gt;inode,</div><div class='add'>+                                            &amp;cbk-&gt;iatt[0].ia_size));</div><div class='add'>+                cbk-&gt;iatt[1].ia_size = cbk-&gt;iatt[0].ia_size;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            return EC_STATE_REPORT;</div><div class='add'>+</div><div class='add'>+        case EC_STATE_REPORT:</div><div class='add'>+            cbk = fop-&gt;answer;</div><div class='add'>+</div><div class='add'>+            GF_ASSERT(cbk != NULL);</div><div class='add'>+</div><div class='add'>+            if (fop-&gt;cbks.fsync != NULL) {</div><div class='add'>+                fop-&gt;cbks.fsync(fop-&gt;req_frame, fop, fop-&gt;xl, cbk-&gt;op_ret,</div><div class='add'>+                                cbk-&gt;op_errno, &amp;cbk-&gt;iatt[0], &amp;cbk-&gt;iatt[1],</div><div class='add'>+                                cbk-&gt;xdata);</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            return EC_STATE_LOCK_REUSE;</div><div class='add'>+</div><div class='add'>+        case -EC_STATE_INIT:</div><div class='add'>+        case -EC_STATE_LOCK:</div><div class='add'>+        case -EC_STATE_DISPATCH:</div><div class='add'>+        case -EC_STATE_PREPARE_ANSWER:</div><div class='add'>+        case -EC_STATE_REPORT:</div><div class='add'>+        case -EC_STATE_DELAYED_START:</div><div class='add'>+            GF_ASSERT(fop-&gt;error != 0);</div><div class='add'>+</div><div class='add'>+            if (fop-&gt;cbks.fsync != NULL) {</div><div class='add'>+                fop-&gt;cbks.fsync(fop-&gt;req_frame, fop, fop-&gt;xl, -1, fop-&gt;error,</div><div class='add'>+                                NULL, NULL, NULL);</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            return EC_STATE_LOCK_REUSE;</div><div class='add'>+</div><div class='add'>+        case -EC_STATE_LOCK_REUSE:</div><div class='add'>+        case EC_STATE_LOCK_REUSE:</div><div class='add'>+            ec_lock_reuse(fop);</div><div class='add'>+</div><div class='add'>+            return EC_STATE_UNLOCK;</div><div class='add'>+</div><div class='add'>+        case -EC_STATE_UNLOCK:</div><div class='add'>+        case EC_STATE_UNLOCK:</div><div class='add'>+            ec_unlock(fop);</div><div class='add'>+</div><div class='add'>+            return EC_STATE_END;</div><div class='add'>+</div><div class='add'>+        default:</div><div class='add'>+            gf_msg(fop-&gt;xl-&gt;name, GF_LOG_ERROR, EINVAL, EC_MSG_UNHANDLED_STATE,</div><div class='add'>+                   "Unhandled state %d for %s", state, ec_fop_name(fop-&gt;id));</div><div class='add'>+</div><div class='add'>+            return EC_STATE_END;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_fsync(call_frame_t *frame, xlator_t *this, uintptr_t target,</div><div class='add'>+         uint32_t fop_flags, fop_fsync_cbk_t func, void *data, fd_t *fd,</div><div class='add'>+         int32_t datasync, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    ec_cbk_t callback = {.fsync = func};</div><div class='add'>+    ec_fop_data_t *fop = NULL;</div><div class='add'>+    int32_t error = ENOMEM;</div><div class='add'>+</div><div class='add'>+    gf_msg_trace("ec", 0, "EC(FSYNC) %p", frame);</div><div class='add'>+</div><div class='add'>+    VALIDATE_OR_GOTO(this, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, frame, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, this-&gt;private, out);</div><div class='add'>+</div><div class='add'>+    if (fd) {</div><div class='add'>+        error = ec_validate_fd(fd, this);</div><div class='add'>+        if (error) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, EBADF, EC_MSG_FD_BAD,</div><div class='add'>+                   "Failing %s on %s", gf_fop_list[GF_FOP_FSYNC],</div><div class='add'>+                   fd-&gt;inode ? uuid_utoa(fd-&gt;inode-&gt;gfid) : "");</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    fop = ec_fop_data_allocate(frame, this, GF_FOP_FSYNC, 0, target, fop_flags,</div><div class='add'>+                               ec_wind_fsync, ec_manager_fsync, callback, data);</div><div class='add'>+    if (fop == NULL) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    fop-&gt;use_fd = 1;</div><div class='add'>+</div><div class='add'>+    fop-&gt;int32 = datasync;</div><div class='add'>+</div><div class='add'>+    if (fd != NULL) {</div><div class='add'>+        fop-&gt;fd = fd_ref(fd);</div><div class='add'>+        if (fop-&gt;fd == NULL) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, 0, EC_MSG_FILE_DESC_REF_FAIL,</div><div class='add'>+                   "Failed to reference a "</div><div class='add'>+                   "file descriptor.");</div><div class='add'>+</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    if (xdata != NULL) {</div><div class='add'>+        fop-&gt;xdata = dict_ref(xdata);</div><div class='add'>+        if (fop-&gt;xdata == NULL) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, 0, EC_MSG_DICT_REF_FAIL,</div><div class='add'>+                   "Failed to reference a "</div><div class='add'>+                   "dictionary.");</div><div class='add'>+</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    error = 0;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (fop != NULL) {</div><div class='add'>+        ec_manager(fop, error);</div><div class='add'>+    } else {</div><div class='add'>+        func(frame, NULL, this, -1, error, NULL, NULL, NULL);</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* FOP: fsyncdir */</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_fsyncdir_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                int32_t op_ret, int32_t op_errno, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    ec_fop_data_t *fop = NULL;</div><div class='add'>+    ec_cbk_data_t *cbk = NULL;</div><div class='add'>+    int32_t idx = (int32_t)(uintptr_t)cookie;</div><div class='add'>+</div><div class='add'>+    VALIDATE_OR_GOTO(this, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, frame, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, frame-&gt;local, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, this-&gt;private, out);</div><div class='add'>+</div><div class='add'>+    fop = frame-&gt;local;</div><div class='add'>+</div><div class='add'>+    ec_trace("CBK", fop, "idx=%d, frame=%p, op_ret=%d, op_errno=%d", idx, frame,</div><div class='add'>+             op_ret, op_errno);</div><div class='add'>+</div><div class='add'>+    cbk = ec_cbk_data_allocate(frame, this, fop, GF_FOP_FSYNCDIR, idx, op_ret,</div><div class='add'>+                               op_errno);</div><div class='add'>+    if (cbk != NULL) {</div><div class='add'>+        if (xdata != NULL) {</div><div class='add'>+            cbk-&gt;xdata = dict_ref(xdata);</div><div class='add'>+            if (cbk-&gt;xdata == NULL) {</div><div class='add'>+                gf_msg(this-&gt;name, GF_LOG_ERROR, 0, EC_MSG_DICT_REF_FAIL,</div><div class='add'>+                       "Failed to reference a "</div><div class='add'>+                       "dictionary.");</div><div class='add'>+</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        ec_combine(cbk, NULL);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (fop != NULL) {</div><div class='add'>+        ec_complete(fop);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_wind_fsyncdir(ec_t *ec, ec_fop_data_t *fop, int32_t idx)</div><div class='add'>+{</div><div class='add'>+    ec_trace("WIND", fop, "idx=%d", idx);</div><div class='add'>+</div><div class='add'>+    STACK_WIND_COOKIE(fop-&gt;frame, ec_fsyncdir_cbk, (void *)(uintptr_t)idx,</div><div class='add'>+                      ec-&gt;xl_list[idx], ec-&gt;xl_list[idx]-&gt;fops-&gt;fsyncdir,</div><div class='add'>+                      fop-&gt;fd, fop-&gt;int32, fop-&gt;xdata);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_manager_fsyncdir(ec_fop_data_t *fop, int32_t state)</div><div class='add'>+{</div><div class='add'>+    ec_cbk_data_t *cbk;</div><div class='add'>+</div><div class='add'>+    switch (state) {</div><div class='add'>+        case EC_STATE_INIT:</div><div class='add'>+        case EC_STATE_LOCK:</div><div class='add'>+            ec_lock_prepare_fd(fop, fop-&gt;fd, 0, 0, EC_RANGE_FULL);</div><div class='add'>+            ec_lock(fop);</div><div class='add'>+</div><div class='add'>+            return EC_STATE_DISPATCH;</div><div class='add'>+</div><div class='add'>+        case EC_STATE_DISPATCH:</div><div class='add'>+            ec_flush_size_version(fop);</div><div class='add'>+</div><div class='add'>+            return EC_STATE_DELAYED_START;</div><div class='add'>+</div><div class='add'>+        case EC_STATE_DELAYED_START:</div><div class='add'>+            ec_dispatch_all(fop);</div><div class='add'>+</div><div class='add'>+            return EC_STATE_PREPARE_ANSWER;</div><div class='add'>+</div><div class='add'>+        case EC_STATE_PREPARE_ANSWER:</div><div class='add'>+            ec_fop_prepare_answer(fop, _gf_false);</div><div class='add'>+</div><div class='add'>+            return EC_STATE_REPORT;</div><div class='add'>+</div><div class='add'>+        case EC_STATE_REPORT:</div><div class='add'>+            cbk = fop-&gt;answer;</div><div class='add'>+</div><div class='add'>+            GF_ASSERT(cbk != NULL);</div><div class='add'>+</div><div class='add'>+            if (fop-&gt;cbks.fsyncdir != NULL) {</div><div class='add'>+                fop-&gt;cbks.fsyncdir(fop-&gt;req_frame, fop, fop-&gt;xl, cbk-&gt;op_ret,</div><div class='add'>+                                   cbk-&gt;op_errno, cbk-&gt;xdata);</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            return EC_STATE_LOCK_REUSE;</div><div class='add'>+</div><div class='add'>+        case -EC_STATE_INIT:</div><div class='add'>+        case -EC_STATE_LOCK:</div><div class='add'>+        case -EC_STATE_DISPATCH:</div><div class='add'>+        case -EC_STATE_PREPARE_ANSWER:</div><div class='add'>+        case -EC_STATE_REPORT:</div><div class='add'>+        case -EC_STATE_DELAYED_START:</div><div class='add'>+            GF_ASSERT(fop-&gt;error != 0);</div><div class='add'>+</div><div class='add'>+            if (fop-&gt;cbks.fsyncdir != NULL) {</div><div class='add'>+                fop-&gt;cbks.fsyncdir(fop-&gt;req_frame, fop, fop-&gt;xl, -1, fop-&gt;error,</div><div class='add'>+                                   NULL);</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            return EC_STATE_LOCK_REUSE;</div><div class='add'>+</div><div class='add'>+        case -EC_STATE_LOCK_REUSE:</div><div class='add'>+        case EC_STATE_LOCK_REUSE:</div><div class='add'>+            ec_lock_reuse(fop);</div><div class='add'>+</div><div class='add'>+            return EC_STATE_UNLOCK;</div><div class='add'>+</div><div class='add'>+        case -EC_STATE_UNLOCK:</div><div class='add'>+        case EC_STATE_UNLOCK:</div><div class='add'>+            ec_unlock(fop);</div><div class='add'>+</div><div class='add'>+            return EC_STATE_END;</div><div class='add'>+</div><div class='add'>+        default:</div><div class='add'>+            gf_msg(fop-&gt;xl-&gt;name, GF_LOG_ERROR, EINVAL, EC_MSG_UNHANDLED_STATE,</div><div class='add'>+                   "Unhandled state %d for %s", state, ec_fop_name(fop-&gt;id));</div><div class='add'>+</div><div class='add'>+            return EC_STATE_END;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_fsyncdir(call_frame_t *frame, xlator_t *this, uintptr_t target,</div><div class='add'>+            uint32_t fop_flags, fop_fsyncdir_cbk_t func, void *data, fd_t *fd,</div><div class='add'>+            int32_t datasync, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    ec_cbk_t callback = {.fsyncdir = func};</div><div class='add'>+    ec_fop_data_t *fop = NULL;</div><div class='add'>+    int32_t error = ENOMEM;</div><div class='add'>+</div><div class='add'>+    gf_msg_trace("ec", 0, "EC(FSYNCDIR) %p", frame);</div><div class='add'>+</div><div class='add'>+    VALIDATE_OR_GOTO(this, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, frame, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, this-&gt;private, out);</div><div class='add'>+</div><div class='add'>+    fop = ec_fop_data_allocate(frame, this, GF_FOP_FSYNCDIR, 0, target,</div><div class='add'>+                               fop_flags, ec_wind_fsyncdir, ec_manager_fsyncdir,</div><div class='add'>+                               callback, data);</div><div class='add'>+    if (fop == NULL) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    fop-&gt;use_fd = 1;</div><div class='add'>+</div><div class='add'>+    fop-&gt;int32 = datasync;</div><div class='add'>+</div><div class='add'>+    if (fd != NULL) {</div><div class='add'>+        fop-&gt;fd = fd_ref(fd);</div><div class='add'>+        if (fop-&gt;fd == NULL) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, 0, EC_MSG_FILE_DESC_REF_FAIL,</div><div class='add'>+                   "Failed to reference a "</div><div class='add'>+                   "file descriptor.");</div><div class='add'>+</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    if (xdata != NULL) {</div><div class='add'>+        fop-&gt;xdata = dict_ref(xdata);</div><div class='add'>+        if (fop-&gt;xdata == NULL) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, 0, EC_MSG_DICT_REF_FAIL,</div><div class='add'>+                   "Failed to reference a "</div><div class='add'>+                   "dictionary.");</div><div class='add'>+</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    error = 0;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (fop != NULL) {</div><div class='add'>+        ec_manager(fop, error);</div><div class='add'>+    } else {</div><div class='add'>+        func(frame, NULL, this, -1, error, NULL);</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* FOP: lookup */</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_lookup_rebuild(ec_t *ec, ec_fop_data_t *fop, ec_cbk_data_t *cbk)</div><div class='add'>+{</div><div class='add'>+    ec_inode_t *ctx = NULL;</div><div class='add'>+    uint64_t size = 0;</div><div class='add'>+    int32_t have_size = 0, err;</div><div class='add'>+</div><div class='add'>+    if (cbk-&gt;op_ret &lt; 0) {</div><div class='add'>+        return;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ec_dict_del_array(cbk-&gt;xdata, EC_XATTR_VERSION, cbk-&gt;version,</div><div class='add'>+                      EC_VERSION_SIZE);</div><div class='add'>+</div><div class='add'>+    err = ec_loc_update(fop-&gt;xl, &amp;fop-&gt;loc[0], cbk-&gt;inode, &amp;cbk-&gt;iatt[0]);</div><div class='add'>+    if (ec_cbk_set_error(cbk, -err, _gf_true)) {</div><div class='add'>+        return;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;cbk-&gt;inode-&gt;lock);</div><div class='add'>+</div><div class='add'>+    ctx = __ec_inode_get(cbk-&gt;inode, fop-&gt;xl);</div><div class='add'>+    if (ctx != NULL) {</div><div class='add'>+        if (ctx-&gt;have_version) {</div><div class='add'>+            cbk-&gt;version[0] = ctx-&gt;post_version[0];</div><div class='add'>+            cbk-&gt;version[1] = ctx-&gt;post_version[1];</div><div class='add'>+        }</div><div class='add'>+        if (ctx-&gt;have_size) {</div><div class='add'>+            size = ctx-&gt;post_size;</div><div class='add'>+            have_size = 1;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    UNLOCK(&amp;cbk-&gt;inode-&gt;lock);</div><div class='add'>+</div><div class='add'>+    if (cbk-&gt;iatt[0].ia_type == IA_IFREG) {</div><div class='add'>+        cbk-&gt;size = cbk-&gt;iatt[0].ia_size;</div><div class='add'>+        ec_dict_del_number(cbk-&gt;xdata, EC_XATTR_SIZE, &amp;cbk-&gt;iatt[0].ia_size);</div><div class='add'>+        if (have_size) {</div><div class='add'>+            cbk-&gt;iatt[0].ia_size = size;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_combine_lookup(ec_fop_data_t *fop, ec_cbk_data_t *dst, ec_cbk_data_t *src)</div><div class='add'>+{</div><div class='add'>+    if (!ec_iatt_combine(fop, dst-&gt;iatt, src-&gt;iatt, 2)) {</div><div class='add'>+        gf_msg(fop-&gt;xl-&gt;name, GF_LOG_DEBUG, 0, EC_MSG_IATT_MISMATCH,</div><div class='add'>+               "Mismatching iatt in "</div><div class='add'>+               "answers of 'GF_FOP_LOOKUP'");</div><div class='add'>+</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_lookup_cbk(call_frame_t *frame, void *cookie, xlator_t *this, int32_t op_ret,</div><div class='add'>+              int32_t op_errno, inode_t *inode, struct iatt *buf, dict_t *xdata,</div><div class='add'>+              struct iatt *postparent)</div><div class='add'>+{</div><div class='add'>+    ec_fop_data_t *fop = NULL;</div><div class='add'>+    ec_cbk_data_t *cbk = NULL;</div><div class='add'>+    int32_t idx = (int32_t)(uintptr_t)cookie;</div><div class='add'>+    uint64_t dirty[2] = {0};</div><div class='add'>+</div><div class='add'>+    VALIDATE_OR_GOTO(this, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, frame, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, frame-&gt;local, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, this-&gt;private, out);</div><div class='add'>+</div><div class='add'>+    fop = frame-&gt;local;</div><div class='add'>+</div><div class='add'>+    ec_trace("CBK", fop, "idx=%d, frame=%p, op_ret=%d, op_errno=%d", idx, frame,</div><div class='add'>+             op_ret, op_errno);</div><div class='add'>+</div><div class='add'>+    cbk = ec_cbk_data_allocate(frame, this, fop, GF_FOP_LOOKUP, idx, op_ret,</div><div class='add'>+                               op_errno);</div><div class='add'>+    if (cbk != NULL) {</div><div class='add'>+        if (op_ret &gt;= 0) {</div><div class='add'>+            if (inode != NULL) {</div><div class='add'>+                cbk-&gt;inode = inode_ref(inode);</div><div class='add'>+                if (cbk-&gt;inode == NULL) {</div><div class='add'>+                    gf_msg(this-&gt;name, GF_LOG_ERROR, 0, EC_MSG_INODE_REF_FAIL,</div><div class='add'>+                           "Failed to reference an inode.");</div><div class='add'>+</div><div class='add'>+                    goto out;</div><div class='add'>+                }</div><div class='add'>+            }</div><div class='add'>+            if (buf != NULL) {</div><div class='add'>+                cbk-&gt;iatt[0] = *buf;</div><div class='add'>+            }</div><div class='add'>+            if (postparent != NULL) {</div><div class='add'>+                cbk-&gt;iatt[1] = *postparent;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+        if (xdata != NULL) {</div><div class='add'>+            cbk-&gt;xdata = dict_ref(xdata);</div><div class='add'>+            if (cbk-&gt;xdata == NULL) {</div><div class='add'>+                gf_msg(this-&gt;name, GF_LOG_ERROR, 0, EC_MSG_DICT_REF_FAIL,</div><div class='add'>+                       "Failed to reference a "</div><div class='add'>+                       "dictionary.");</div><div class='add'>+</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+            ec_dict_del_array(xdata, EC_XATTR_DIRTY, dirty, EC_VERSION_SIZE);</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        ec_combine(cbk, ec_combine_lookup);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (fop != NULL) {</div><div class='add'>+        ec_complete(fop);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_wind_lookup(ec_t *ec, ec_fop_data_t *fop, int32_t idx)</div><div class='add'>+{</div><div class='add'>+    ec_trace("WIND", fop, "idx=%d", idx);</div><div class='add'>+</div><div class='add'>+    STACK_WIND_COOKIE(fop-&gt;frame, ec_lookup_cbk, (void *)(uintptr_t)idx,</div><div class='add'>+                      ec-&gt;xl_list[idx], ec-&gt;xl_list[idx]-&gt;fops-&gt;lookup,</div><div class='add'>+                      &amp;fop-&gt;loc[0], fop-&gt;xdata);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_manager_lookup(ec_fop_data_t *fop, int32_t state)</div><div class='add'>+{</div><div class='add'>+    ec_cbk_data_t *cbk;</div><div class='add'>+    int32_t err;</div><div class='add'>+</div><div class='add'>+    switch (state) {</div><div class='add'>+        case EC_STATE_INIT:</div><div class='add'>+            if (fop-&gt;xdata == NULL) {</div><div class='add'>+                fop-&gt;xdata = dict_new();</div><div class='add'>+                if (fop-&gt;xdata == NULL) {</div><div class='add'>+                    gf_msg(fop-&gt;xl-&gt;name, GF_LOG_ERROR, ENOMEM,</div><div class='add'>+                           EC_MSG_LOOKUP_REQ_PREP_FAIL,</div><div class='add'>+                           "Unable to prepare "</div><div class='add'>+                           "lookup request");</div><div class='add'>+</div><div class='add'>+                    fop-&gt;error = ENOMEM;</div><div class='add'>+</div><div class='add'>+                    return EC_STATE_REPORT;</div><div class='add'>+                }</div><div class='add'>+            } else {</div><div class='add'>+                /*TODO: To be handled once we have 'syndromes' */</div><div class='add'>+                dict_del(fop-&gt;xdata, GF_CONTENT_KEY);</div><div class='add'>+            }</div><div class='add'>+            err = dict_set_uint64(fop-&gt;xdata, EC_XATTR_SIZE, 0);</div><div class='add'>+            if (err == 0) {</div><div class='add'>+                err = dict_set_uint64(fop-&gt;xdata, EC_XATTR_VERSION, 0);</div><div class='add'>+            }</div><div class='add'>+            if (err == 0) {</div><div class='add'>+                err = dict_set_uint64(fop-&gt;xdata, EC_XATTR_DIRTY, 0);</div><div class='add'>+            }</div><div class='add'>+            if (err != 0) {</div><div class='add'>+                gf_msg(fop-&gt;xl-&gt;name, GF_LOG_ERROR, -err,</div><div class='add'>+                       EC_MSG_LOOKUP_REQ_PREP_FAIL,</div><div class='add'>+                       "Unable to prepare lookup "</div><div class='add'>+                       "request");</div><div class='add'>+</div><div class='add'>+                fop-&gt;error = -err;</div><div class='add'>+</div><div class='add'>+                return EC_STATE_REPORT;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            /* Fall through */</div><div class='add'>+</div><div class='add'>+        case EC_STATE_DISPATCH:</div><div class='add'>+            ec_dispatch_all(fop);</div><div class='add'>+</div><div class='add'>+            return EC_STATE_PREPARE_ANSWER;</div><div class='add'>+</div><div class='add'>+        case EC_STATE_PREPARE_ANSWER:</div><div class='add'>+            /*</div><div class='add'>+             * Lookup happens without any lock, so there is a chance that it</div><div class='add'>+             * will have answers before modification happened and after</div><div class='add'>+             * modification happened in the same response. So choose the next</div><div class='add'>+             * best answer when the answers don't match for EC_MINIMUM_MIN</div><div class='add'>+             */</div><div class='add'>+</div><div class='add'>+            if (!fop-&gt;answer &amp;&amp; !list_empty(&amp;fop-&gt;cbk_list)) {</div><div class='add'>+                fop-&gt;answer = list_entry(fop-&gt;cbk_list.next, ec_cbk_data_t,</div><div class='add'>+                                         list);</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            cbk = ec_fop_prepare_answer(fop, _gf_true);</div><div class='add'>+            if (cbk != NULL) {</div><div class='add'>+                ec_iatt_rebuild(fop-&gt;xl-&gt;private, cbk-&gt;iatt, 2, cbk-&gt;count);</div><div class='add'>+</div><div class='add'>+                ec_lookup_rebuild(fop-&gt;xl-&gt;private, fop, cbk);</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            return EC_STATE_REPORT;</div><div class='add'>+</div><div class='add'>+        case EC_STATE_REPORT:</div><div class='add'>+            cbk = fop-&gt;answer;</div><div class='add'>+</div><div class='add'>+            GF_ASSERT(cbk != NULL);</div><div class='add'>+</div><div class='add'>+            if (fop-&gt;cbks.lookup != NULL) {</div><div class='add'>+                fop-&gt;cbks.lookup(fop-&gt;req_frame, fop, fop-&gt;xl, cbk-&gt;op_ret,</div><div class='add'>+                                 cbk-&gt;op_errno, cbk-&gt;inode, &amp;cbk-&gt;iatt[0],</div><div class='add'>+                                 cbk-&gt;xdata, &amp;cbk-&gt;iatt[1]);</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            return EC_STATE_END;</div><div class='add'>+</div><div class='add'>+        case -EC_STATE_INIT:</div><div class='add'>+        case -EC_STATE_DISPATCH:</div><div class='add'>+        case -EC_STATE_PREPARE_ANSWER:</div><div class='add'>+        case -EC_STATE_REPORT:</div><div class='add'>+            GF_ASSERT(fop-&gt;error != 0);</div><div class='add'>+</div><div class='add'>+            if (fop-&gt;cbks.lookup != NULL) {</div><div class='add'>+                fop-&gt;cbks.lookup(fop-&gt;req_frame, fop, fop-&gt;xl, -1, fop-&gt;error,</div><div class='add'>+                                 NULL, NULL, NULL, NULL);</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            return EC_STATE_END;</div><div class='add'>+</div><div class='add'>+        default:</div><div class='add'>+            gf_msg(fop-&gt;xl-&gt;name, GF_LOG_ERROR, EINVAL, EC_MSG_UNHANDLED_STATE,</div><div class='add'>+                   "Unhandled state %d for %s", state, ec_fop_name(fop-&gt;id));</div><div class='add'>+</div><div class='add'>+            return EC_STATE_END;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_lookup(call_frame_t *frame, xlator_t *this, uintptr_t target,</div><div class='add'>+          uint32_t fop_flags, fop_lookup_cbk_t func, void *data, loc_t *loc,</div><div class='add'>+          dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    ec_cbk_t callback = {.lookup = func};</div><div class='add'>+    ec_fop_data_t *fop = NULL;</div><div class='add'>+    int32_t error = ENOMEM;</div><div class='add'>+</div><div class='add'>+    gf_msg_trace("ec", 0, "EC(LOOKUP) %p", frame);</div><div class='add'>+</div><div class='add'>+    VALIDATE_OR_GOTO(this, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, frame, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, this-&gt;private, out);</div><div class='add'>+</div><div class='add'>+    fop = ec_fop_data_allocate(frame, this, GF_FOP_LOOKUP, EC_FLAG_LOCK_SHARED,</div><div class='add'>+                               target, fop_flags, ec_wind_lookup,</div><div class='add'>+                               ec_manager_lookup, callback, data);</div><div class='add'>+    if (fop == NULL) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (loc != NULL) {</div><div class='add'>+        if (loc_copy(&amp;fop-&gt;loc[0], loc) != 0) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, ENOMEM, EC_MSG_LOC_COPY_FAIL,</div><div class='add'>+                   "Failed to copy a location.");</div><div class='add'>+</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    if (xdata != NULL) {</div><div class='add'>+        fop-&gt;xdata = dict_copy_with_ref(xdata, NULL);</div><div class='add'>+        /* Do not log failures here as a memory problem would have already</div><div class='add'>+         * been logged by the corresponding alloc functions */</div><div class='add'>+        if (fop-&gt;xdata == NULL)</div><div class='add'>+            goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    error = 0;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (fop != NULL) {</div><div class='add'>+        ec_manager(fop, error);</div><div class='add'>+    } else {</div><div class='add'>+        func(frame, NULL, this, -1, error, NULL, NULL, NULL, NULL);</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* FOP: statfs */</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_combine_statfs(ec_fop_data_t *fop, ec_cbk_data_t *dst, ec_cbk_data_t *src)</div><div class='add'>+{</div><div class='add'>+    ec_statvfs_combine(&amp;dst-&gt;statvfs, &amp;src-&gt;statvfs);</div><div class='add'>+</div><div class='add'>+    return 1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_statfs_cbk(call_frame_t *frame, void *cookie, xlator_t *this, int32_t op_ret,</div><div class='add'>+              int32_t op_errno, struct statvfs *buf, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    ec_fop_data_t *fop = NULL;</div><div class='add'>+    ec_cbk_data_t *cbk = NULL;</div><div class='add'>+    int32_t idx = (int32_t)(uintptr_t)cookie;</div><div class='add'>+</div><div class='add'>+    VALIDATE_OR_GOTO(this, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, frame, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, frame-&gt;local, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, this-&gt;private, out);</div><div class='add'>+</div><div class='add'>+    fop = frame-&gt;local;</div><div class='add'>+</div><div class='add'>+    ec_trace("CBK", fop, "idx=%d, frame=%p, op_ret=%d, op_errno=%d", idx, frame,</div><div class='add'>+             op_ret, op_errno);</div><div class='add'>+</div><div class='add'>+    cbk = ec_cbk_data_allocate(frame, this, fop, GF_FOP_STATFS, idx, op_ret,</div><div class='add'>+                               op_errno);</div><div class='add'>+    if (cbk != NULL) {</div><div class='add'>+        if (op_ret &gt;= 0) {</div><div class='add'>+            if (buf != NULL) {</div><div class='add'>+                cbk-&gt;statvfs = *buf;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+        if (xdata != NULL) {</div><div class='add'>+            cbk-&gt;xdata = dict_ref(xdata);</div><div class='add'>+            if (cbk-&gt;xdata == NULL) {</div><div class='add'>+                gf_msg(this-&gt;name, GF_LOG_ERROR, 0, EC_MSG_DICT_REF_FAIL,</div><div class='add'>+                       "Failed to reference a "</div><div class='add'>+                       "dictionary.");</div><div class='add'>+</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        ec_combine(cbk, ec_combine_statfs);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (fop != NULL) {</div><div class='add'>+        ec_complete(fop);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_wind_statfs(ec_t *ec, ec_fop_data_t *fop, int32_t idx)</div><div class='add'>+{</div><div class='add'>+    ec_trace("WIND", fop, "idx=%d", idx);</div><div class='add'>+</div><div class='add'>+    STACK_WIND_COOKIE(fop-&gt;frame, ec_statfs_cbk, (void *)(uintptr_t)idx,</div><div class='add'>+                      ec-&gt;xl_list[idx], ec-&gt;xl_list[idx]-&gt;fops-&gt;statfs,</div><div class='add'>+                      &amp;fop-&gt;loc[0], fop-&gt;xdata);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_manager_statfs(ec_fop_data_t *fop, int32_t state)</div><div class='add'>+{</div><div class='add'>+    ec_cbk_data_t *cbk = NULL;</div><div class='add'>+    gf_boolean_t deem_statfs_enabled = _gf_false;</div><div class='add'>+    int32_t err = 0;</div><div class='add'>+</div><div class='add'>+    switch (state) {</div><div class='add'>+        case EC_STATE_INIT:</div><div class='add'>+        case EC_STATE_DISPATCH:</div><div class='add'>+            ec_dispatch_all(fop);</div><div class='add'>+</div><div class='add'>+            return EC_STATE_PREPARE_ANSWER;</div><div class='add'>+</div><div class='add'>+        case EC_STATE_PREPARE_ANSWER:</div><div class='add'>+            cbk = ec_fop_prepare_answer(fop, _gf_true);</div><div class='add'>+            if (cbk != NULL) {</div><div class='add'>+                ec_t *ec = fop-&gt;xl-&gt;private;</div><div class='add'>+</div><div class='add'>+                if (cbk-&gt;xdata) {</div><div class='add'>+                    err = dict_get_int8(cbk-&gt;xdata, "quota-deem-statfs",</div><div class='add'>+                                        (int8_t *)&amp;deem_statfs_enabled);</div><div class='add'>+                    if (err != -ENOENT) {</div><div class='add'>+                        ec_cbk_set_error(cbk, -err, _gf_true);</div><div class='add'>+                    }</div><div class='add'>+                }</div><div class='add'>+</div><div class='add'>+                if (err != 0 || deem_statfs_enabled == _gf_false) {</div><div class='add'>+                    cbk-&gt;statvfs.f_blocks *= ec-&gt;fragments;</div><div class='add'>+                    cbk-&gt;statvfs.f_bfree *= ec-&gt;fragments;</div><div class='add'>+                    cbk-&gt;statvfs.f_bavail *= ec-&gt;fragments;</div><div class='add'>+                }</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            return EC_STATE_REPORT;</div><div class='add'>+</div><div class='add'>+        case EC_STATE_REPORT:</div><div class='add'>+            cbk = fop-&gt;answer;</div><div class='add'>+</div><div class='add'>+            GF_ASSERT(cbk != NULL);</div><div class='add'>+</div><div class='add'>+            if (fop-&gt;cbks.statfs != NULL) {</div><div class='add'>+                fop-&gt;cbks.statfs(fop-&gt;req_frame, fop, fop-&gt;xl, cbk-&gt;op_ret,</div><div class='add'>+                                 cbk-&gt;op_errno, &amp;cbk-&gt;statvfs, cbk-&gt;xdata);</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            return EC_STATE_END;</div><div class='add'>+</div><div class='add'>+        case -EC_STATE_INIT:</div><div class='add'>+        case -EC_STATE_DISPATCH:</div><div class='add'>+        case -EC_STATE_PREPARE_ANSWER:</div><div class='add'>+        case -EC_STATE_REPORT:</div><div class='add'>+            GF_ASSERT(fop-&gt;error != 0);</div><div class='add'>+</div><div class='add'>+            if (fop-&gt;cbks.statfs != NULL) {</div><div class='add'>+                fop-&gt;cbks.statfs(fop-&gt;req_frame, fop, fop-&gt;xl, -1, fop-&gt;error,</div><div class='add'>+                                 NULL, NULL);</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            return EC_STATE_END;</div><div class='add'>+</div><div class='add'>+        default:</div><div class='add'>+            gf_msg(fop-&gt;xl-&gt;name, GF_LOG_ERROR, EINVAL, EC_MSG_UNHANDLED_STATE,</div><div class='add'>+                   "Unhandled state %d for %s", state, ec_fop_name(fop-&gt;id));</div><div class='add'>+</div><div class='add'>+            return EC_STATE_END;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_statfs(call_frame_t *frame, xlator_t *this, uintptr_t target,</div><div class='add'>+          uint32_t fop_flags, fop_statfs_cbk_t func, void *data, loc_t *loc,</div><div class='add'>+          dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    ec_cbk_t callback = {.statfs = func};</div><div class='add'>+    ec_fop_data_t *fop = NULL;</div><div class='add'>+    int32_t error = ENOMEM;</div><div class='add'>+</div><div class='add'>+    gf_msg_trace("ec", 0, "EC(STATFS) %p", frame);</div><div class='add'>+</div><div class='add'>+    VALIDATE_OR_GOTO(this, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, frame, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, this-&gt;private, out);</div><div class='add'>+</div><div class='add'>+    fop = ec_fop_data_allocate(frame, this, GF_FOP_STATFS, EC_FLAG_LOCK_SHARED,</div><div class='add'>+                               target, fop_flags, ec_wind_statfs,</div><div class='add'>+                               ec_manager_statfs, callback, data);</div><div class='add'>+    if (fop == NULL) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (loc != NULL) {</div><div class='add'>+        if (loc_copy(&amp;fop-&gt;loc[0], loc) != 0) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, ENOMEM, EC_MSG_LOC_COPY_FAIL,</div><div class='add'>+                   "Failed to copy a location.");</div><div class='add'>+</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    if (xdata != NULL) {</div><div class='add'>+        fop-&gt;xdata = dict_ref(xdata);</div><div class='add'>+        if (fop-&gt;xdata == NULL) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, 0, EC_MSG_DICT_REF_FAIL,</div><div class='add'>+                   "Failed to reference a "</div><div class='add'>+                   "dictionary.");</div><div class='add'>+</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    error = 0;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (fop != NULL) {</div><div class='add'>+        ec_manager(fop, error);</div><div class='add'>+    } else {</div><div class='add'>+        func(frame, NULL, this, -1, error, NULL, NULL);</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* FOP: xattrop */</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_combine_xattrop(ec_fop_data_t *fop, ec_cbk_data_t *dst, ec_cbk_data_t *src)</div><div class='add'>+{</div><div class='add'>+    if (!ec_dict_compare(dst-&gt;dict, src-&gt;dict)) {</div><div class='add'>+        gf_msg(fop-&gt;xl-&gt;name, GF_LOG_DEBUG, 0, EC_MSG_DICT_MISMATCH,</div><div class='add'>+               "Mismatching dictionary in "</div><div class='add'>+               "answers of 'GF_FOP_XATTROP'");</div><div class='add'>+</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_xattrop_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+               int32_t op_ret, int32_t op_errno, dict_t *xattr, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    ec_fop_data_t *fop = NULL;</div><div class='add'>+    ec_lock_link_t *link = NULL;</div><div class='add'>+    ec_cbk_data_t *cbk = NULL;</div><div class='add'>+    uint64_t dirty[2] = {0};</div><div class='add'>+    data_t *data;</div><div class='add'>+    uint64_t *version;</div><div class='add'>+    int32_t idx = (int32_t)(uintptr_t)cookie;</div><div class='add'>+</div><div class='add'>+    VALIDATE_OR_GOTO(this, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, frame, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, frame-&gt;local, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, this-&gt;private, out);</div><div class='add'>+</div><div class='add'>+    fop = frame-&gt;local;</div><div class='add'>+</div><div class='add'>+    ec_trace("CBK", fop, "idx=%d, frame=%p, op_ret=%d, op_errno=%d", idx, frame,</div><div class='add'>+             op_ret, op_errno);</div><div class='add'>+</div><div class='add'>+    cbk = ec_cbk_data_allocate(frame, this, fop, fop-&gt;id, idx, op_ret,</div><div class='add'>+                               op_errno);</div><div class='add'>+    if (!cbk)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    if (op_ret &gt;= 0) {</div><div class='add'>+        cbk-&gt;dict = dict_ref(xattr);</div><div class='add'>+</div><div class='add'>+        data = dict_get(cbk-&gt;dict, EC_XATTR_VERSION);</div><div class='add'>+        if ((data != NULL) &amp;&amp; (data-&gt;len &gt;= sizeof(uint64_t))) {</div><div class='add'>+            version = (uint64_t *)data-&gt;data;</div><div class='add'>+</div><div class='add'>+            if (((ntoh64(version[0]) &gt;&gt; EC_SELFHEAL_BIT) &amp; 1) != 0) {</div><div class='add'>+                LOCK(&amp;fop-&gt;lock);</div><div class='add'>+</div><div class='add'>+                fop-&gt;healing |= 1ULL &lt;&lt; idx;</div><div class='add'>+</div><div class='add'>+                UNLOCK(&amp;fop-&gt;lock);</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        ec_dict_del_array(xattr, EC_XATTR_DIRTY, dirty, EC_VERSION_SIZE);</div><div class='add'>+        link = fop-&gt;data;</div><div class='add'>+        if (link) {</div><div class='add'>+            /*Keep a note of if the dirty is already set or not*/</div><div class='add'>+            link-&gt;dirty[0] |= (dirty[0] != 0);</div><div class='add'>+            link-&gt;dirty[1] |= (dirty[1] != 0);</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (xdata)</div><div class='add'>+        cbk-&gt;xdata = dict_ref(xdata);</div><div class='add'>+</div><div class='add'>+    ec_combine(cbk, ec_combine_xattrop);</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (fop)</div><div class='add'>+        ec_complete(fop);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_wind_xattrop(ec_t *ec, ec_fop_data_t *fop, int32_t idx)</div><div class='add'>+{</div><div class='add'>+    ec_trace("WIND", fop, "idx=%d", idx);</div><div class='add'>+</div><div class='add'>+    STACK_WIND_COOKIE(fop-&gt;frame, ec_xattrop_cbk, (void *)(uintptr_t)idx,</div><div class='add'>+                      ec-&gt;xl_list[idx], ec-&gt;xl_list[idx]-&gt;fops-&gt;xattrop,</div><div class='add'>+                      &amp;fop-&gt;loc[0], fop-&gt;xattrop_flags, fop-&gt;dict, fop-&gt;xdata);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_manager_xattrop(ec_fop_data_t *fop, int32_t state)</div><div class='add'>+{</div><div class='add'>+    ec_cbk_data_t *cbk;</div><div class='add'>+</div><div class='add'>+    switch (state) {</div><div class='add'>+        case EC_STATE_INIT:</div><div class='add'>+        case EC_STATE_LOCK:</div><div class='add'>+            if (fop-&gt;fd == NULL) {</div><div class='add'>+                ec_lock_prepare_inode(fop, &amp;fop-&gt;loc[0], EC_UPDATE_META, 0,</div><div class='add'>+                                      EC_RANGE_FULL);</div><div class='add'>+            } else {</div><div class='add'>+                ec_lock_prepare_fd(fop, fop-&gt;fd, EC_UPDATE_META, 0,</div><div class='add'>+                                   EC_RANGE_FULL);</div><div class='add'>+            }</div><div class='add'>+            ec_lock(fop);</div><div class='add'>+</div><div class='add'>+            return EC_STATE_DISPATCH;</div><div class='add'>+</div><div class='add'>+        case EC_STATE_DISPATCH:</div><div class='add'>+            ec_dispatch_all(fop);</div><div class='add'>+</div><div class='add'>+            return EC_STATE_PREPARE_ANSWER;</div><div class='add'>+</div><div class='add'>+        case EC_STATE_PREPARE_ANSWER:</div><div class='add'>+            cbk = ec_fop_prepare_answer(fop, _gf_false);</div><div class='add'>+            if (cbk != NULL) {</div><div class='add'>+                int32_t err;</div><div class='add'>+</div><div class='add'>+                err = ec_dict_combine(cbk, EC_COMBINE_DICT);</div><div class='add'>+                ec_cbk_set_error(cbk, -err, _gf_false);</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            return EC_STATE_REPORT;</div><div class='add'>+</div><div class='add'>+        case EC_STATE_REPORT:</div><div class='add'>+            cbk = fop-&gt;answer;</div><div class='add'>+</div><div class='add'>+            GF_ASSERT(cbk != NULL);</div><div class='add'>+</div><div class='add'>+            if (fop-&gt;id == GF_FOP_XATTROP) {</div><div class='add'>+                if (fop-&gt;cbks.xattrop != NULL) {</div><div class='add'>+                    fop-&gt;cbks.xattrop(fop-&gt;req_frame, fop, fop-&gt;xl, cbk-&gt;op_ret,</div><div class='add'>+                                      cbk-&gt;op_errno, cbk-&gt;dict, cbk-&gt;xdata);</div><div class='add'>+                }</div><div class='add'>+            } else {</div><div class='add'>+                if (fop-&gt;cbks.fxattrop != NULL) {</div><div class='add'>+                    fop-&gt;cbks.fxattrop(fop-&gt;req_frame, fop, fop-&gt;xl,</div><div class='add'>+                                       cbk-&gt;op_ret, cbk-&gt;op_errno, cbk-&gt;dict,</div><div class='add'>+                                       cbk-&gt;xdata);</div><div class='add'>+                }</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            return EC_STATE_LOCK_REUSE;</div><div class='add'>+</div><div class='add'>+        case -EC_STATE_INIT:</div><div class='add'>+        case -EC_STATE_LOCK:</div><div class='add'>+        case -EC_STATE_DISPATCH:</div><div class='add'>+        case -EC_STATE_PREPARE_ANSWER:</div><div class='add'>+        case -EC_STATE_REPORT:</div><div class='add'>+            GF_ASSERT(fop-&gt;error != 0);</div><div class='add'>+</div><div class='add'>+            if (fop-&gt;id == GF_FOP_XATTROP) {</div><div class='add'>+                if (fop-&gt;cbks.xattrop != NULL) {</div><div class='add'>+                    fop-&gt;cbks.xattrop(fop-&gt;req_frame, fop, fop-&gt;xl, -1,</div><div class='add'>+                                      fop-&gt;error, NULL, NULL);</div><div class='add'>+                }</div><div class='add'>+            } else {</div><div class='add'>+                if (fop-&gt;cbks.fxattrop != NULL) {</div><div class='add'>+                    fop-&gt;cbks.fxattrop(fop-&gt;req_frame, fop, fop-&gt;xl, -1,</div><div class='add'>+                                       fop-&gt;error, NULL, NULL);</div><div class='add'>+                }</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            return EC_STATE_LOCK_REUSE;</div><div class='add'>+</div><div class='add'>+        case -EC_STATE_LOCK_REUSE:</div><div class='add'>+        case EC_STATE_LOCK_REUSE:</div><div class='add'>+            ec_lock_reuse(fop);</div><div class='add'>+</div><div class='add'>+            return EC_STATE_UNLOCK;</div><div class='add'>+</div><div class='add'>+        case -EC_STATE_UNLOCK:</div><div class='add'>+        case EC_STATE_UNLOCK:</div><div class='add'>+            ec_unlock(fop);</div><div class='add'>+</div><div class='add'>+            return EC_STATE_END;</div><div class='add'>+</div><div class='add'>+        default:</div><div class='add'>+            gf_msg(fop-&gt;xl-&gt;name, GF_LOG_ERROR, EINVAL, EC_MSG_UNHANDLED_STATE,</div><div class='add'>+                   "Unhandled state %d for %s", state, ec_fop_name(fop-&gt;id));</div><div class='add'>+</div><div class='add'>+            return EC_STATE_END;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_xattrop(call_frame_t *frame, xlator_t *this, uintptr_t target,</div><div class='add'>+           uint32_t fop_flags, fop_xattrop_cbk_t func, void *data, loc_t *loc,</div><div class='add'>+           gf_xattrop_flags_t optype, dict_t *xattr, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    ec_cbk_t callback = {.xattrop = func};</div><div class='add'>+    ec_fop_data_t *fop = NULL;</div><div class='add'>+    int32_t error = ENOMEM;</div><div class='add'>+</div><div class='add'>+    gf_msg_trace("ec", 0, "EC(XATTROP) %p", frame);</div><div class='add'>+</div><div class='add'>+    VALIDATE_OR_GOTO(this, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, frame, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, this-&gt;private, out);</div><div class='add'>+</div><div class='add'>+    fop = ec_fop_data_allocate(frame, this, GF_FOP_XATTROP, 0, target,</div><div class='add'>+                               fop_flags, ec_wind_xattrop, ec_manager_xattrop,</div><div class='add'>+                               callback, data);</div><div class='add'>+    if (fop == NULL) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    fop-&gt;xattrop_flags = optype;</div><div class='add'>+</div><div class='add'>+    if (loc != NULL) {</div><div class='add'>+        if (loc_copy(&amp;fop-&gt;loc[0], loc) != 0) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, ENOMEM, EC_MSG_LOC_COPY_FAIL,</div><div class='add'>+                   "Failed to copy a location.");</div><div class='add'>+</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    if (xattr != NULL) {</div><div class='add'>+        fop-&gt;dict = dict_ref(xattr);</div><div class='add'>+        if (fop-&gt;dict == NULL) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, 0, EC_MSG_DICT_REF_FAIL,</div><div class='add'>+                   "Failed to reference a "</div><div class='add'>+                   "dictionary.");</div><div class='add'>+</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    if (xdata != NULL) {</div><div class='add'>+        fop-&gt;xdata = dict_ref(xdata);</div><div class='add'>+        if (fop-&gt;xdata == NULL) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, 0, EC_MSG_DICT_REF_FAIL,</div><div class='add'>+                   "Failed to reference a "</div><div class='add'>+                   "dictionary.");</div><div class='add'>+</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    error = 0;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (fop != NULL) {</div><div class='add'>+        ec_manager(fop, error);</div><div class='add'>+    } else {</div><div class='add'>+        func(frame, NULL, this, -1, error, NULL, NULL);</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_wind_fxattrop(ec_t *ec, ec_fop_data_t *fop, int32_t idx)</div><div class='add'>+{</div><div class='add'>+    ec_trace("WIND", fop, "idx=%d", idx);</div><div class='add'>+</div><div class='add'>+    STACK_WIND_COOKIE(fop-&gt;frame, ec_xattrop_cbk, (void *)(uintptr_t)idx,</div><div class='add'>+                      ec-&gt;xl_list[idx], ec-&gt;xl_list[idx]-&gt;fops-&gt;fxattrop,</div><div class='add'>+                      fop-&gt;fd, fop-&gt;xattrop_flags, fop-&gt;dict, fop-&gt;xdata);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_fxattrop(call_frame_t *frame, xlator_t *this, uintptr_t target,</div><div class='add'>+            uint32_t fop_flags, fop_fxattrop_cbk_t func, void *data, fd_t *fd,</div><div class='add'>+            gf_xattrop_flags_t optype, dict_t *xattr, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    ec_cbk_t callback = {.fxattrop = func};</div><div class='add'>+    ec_fop_data_t *fop = NULL;</div><div class='add'>+    int32_t error = ENOMEM;</div><div class='add'>+</div><div class='add'>+    gf_msg_trace("ec", 0, "EC(FXATTROP) %p", frame);</div><div class='add'>+</div><div class='add'>+    VALIDATE_OR_GOTO(this, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, frame, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, this-&gt;private, out);</div><div class='add'>+</div><div class='add'>+    fop = ec_fop_data_allocate(frame, this, GF_FOP_FXATTROP, 0, target,</div><div class='add'>+                               fop_flags, ec_wind_fxattrop, ec_manager_xattrop,</div><div class='add'>+                               callback, data);</div><div class='add'>+    if (fop == NULL) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    fop-&gt;use_fd = 1;</div><div class='add'>+</div><div class='add'>+    fop-&gt;xattrop_flags = optype;</div><div class='add'>+</div><div class='add'>+    if (fd != NULL) {</div><div class='add'>+        fop-&gt;fd = fd_ref(fd);</div><div class='add'>+        if (fop-&gt;fd == NULL) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, 0, EC_MSG_FILE_DESC_REF_FAIL,</div><div class='add'>+                   "Failed to reference a "</div><div class='add'>+                   "file descriptor.");</div><div class='add'>+</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    if (xattr != NULL) {</div><div class='add'>+        fop-&gt;dict = dict_ref(xattr);</div><div class='add'>+        if (fop-&gt;dict == NULL) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, 0, EC_MSG_DICT_REF_FAIL,</div><div class='add'>+                   "Failed to reference a "</div><div class='add'>+                   "dictionary.");</div><div class='add'>+</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    if (xdata != NULL) {</div><div class='add'>+        fop-&gt;xdata = dict_ref(xdata);</div><div class='add'>+        if (fop-&gt;xdata == NULL) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, 0, EC_MSG_DICT_REF_FAIL,</div><div class='add'>+                   "Failed to reference a "</div><div class='add'>+                   "dictionary.");</div><div class='add'>+</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    error = 0;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (fop != NULL) {</div><div class='add'>+        ec_manager(fop, error);</div><div class='add'>+    } else {</div><div class='add'>+        func(frame, NULL, this, -1, error, NULL, NULL);</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* FOP: IPC */</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_ipc_cbk(call_frame_t *frame, void *cookie, xlator_t *this, int32_t op_ret,</div><div class='add'>+           int32_t op_errno, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    ec_fop_data_t *fop = NULL;</div><div class='add'>+    ec_cbk_data_t *cbk = NULL;</div><div class='add'>+    int32_t idx = (int32_t)(uintptr_t)cookie;</div><div class='add'>+</div><div class='add'>+    VALIDATE_OR_GOTO(this, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, frame, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, frame-&gt;local, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, this-&gt;private, out);</div><div class='add'>+</div><div class='add'>+    fop = frame-&gt;local;</div><div class='add'>+</div><div class='add'>+    ec_trace("CBK", fop, "idx=%d, frame=%p, op_ret=%d, op_errno=%d", idx, frame,</div><div class='add'>+             op_ret, op_errno);</div><div class='add'>+</div><div class='add'>+    cbk = ec_cbk_data_allocate(frame, this, fop, GF_FOP_IPC, idx, op_ret,</div><div class='add'>+                               op_errno);</div><div class='add'>+</div><div class='add'>+    if (cbk != NULL) {</div><div class='add'>+        if (xdata != NULL) {</div><div class='add'>+            cbk-&gt;xdata = dict_ref(xdata);</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        ec_combine(cbk, NULL);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (fop != NULL) {</div><div class='add'>+        ec_complete(fop);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_wind_ipc(ec_t *ec, ec_fop_data_t *fop, int32_t idx)</div><div class='add'>+{</div><div class='add'>+    ec_trace("WIND", fop, "idx=%d", idx);</div><div class='add'>+</div><div class='add'>+    STACK_WIND_COOKIE(fop-&gt;frame, ec_ipc_cbk, (void *)(uintptr_t)idx,</div><div class='add'>+                      ec-&gt;xl_list[idx], ec-&gt;xl_list[idx]-&gt;fops-&gt;ipc, fop-&gt;int32,</div><div class='add'>+                      fop-&gt;xdata);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_manager_ipc(ec_fop_data_t *fop, int32_t state)</div><div class='add'>+{</div><div class='add'>+    ec_cbk_data_t *cbk;</div><div class='add'>+</div><div class='add'>+    switch (state) {</div><div class='add'>+        case EC_STATE_INIT:</div><div class='add'>+        case EC_STATE_DISPATCH:</div><div class='add'>+            ec_dispatch_all(fop);</div><div class='add'>+</div><div class='add'>+            return EC_STATE_PREPARE_ANSWER;</div><div class='add'>+</div><div class='add'>+        case EC_STATE_PREPARE_ANSWER:</div><div class='add'>+            ec_fop_prepare_answer(fop, _gf_true);</div><div class='add'>+</div><div class='add'>+            return EC_STATE_REPORT;</div><div class='add'>+</div><div class='add'>+        case EC_STATE_REPORT:</div><div class='add'>+            cbk = fop-&gt;answer;</div><div class='add'>+</div><div class='add'>+            GF_ASSERT(cbk != NULL);</div><div class='add'>+            if (fop-&gt;cbks.ipc != NULL) {</div><div class='add'>+                fop-&gt;cbks.ipc(fop-&gt;req_frame, fop, fop-&gt;xl, cbk-&gt;op_ret,</div><div class='add'>+                              cbk-&gt;op_errno, cbk-&gt;xdata);</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            return EC_STATE_END;</div><div class='add'>+</div><div class='add'>+        case -EC_STATE_INIT:</div><div class='add'>+        case -EC_STATE_DISPATCH:</div><div class='add'>+        case -EC_STATE_PREPARE_ANSWER:</div><div class='add'>+        case -EC_STATE_REPORT:</div><div class='add'>+            GF_ASSERT(fop-&gt;error != 0);</div><div class='add'>+</div><div class='add'>+            if (fop-&gt;cbks.ipc != NULL) {</div><div class='add'>+                fop-&gt;cbks.ipc(fop-&gt;req_frame, fop, fop-&gt;xl, -1, fop-&gt;error,</div><div class='add'>+                              NULL);</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            return EC_STATE_END;</div><div class='add'>+</div><div class='add'>+        default:</div><div class='add'>+            gf_msg(fop-&gt;xl-&gt;name, GF_LOG_ERROR, EINVAL, EC_MSG_UNHANDLED_STATE,</div><div class='add'>+                   "Unhandled state %d for %s", state, ec_fop_name(fop-&gt;id));</div><div class='add'>+</div><div class='add'>+            return EC_STATE_END;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_ipc(call_frame_t *frame, xlator_t *this, uintptr_t target,</div><div class='add'>+       uint32_t fop_flags, fop_ipc_cbk_t func, void *data, int32_t op,</div><div class='add'>+       dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    ec_cbk_t callback = {.ipc = func};</div><div class='add'>+    ec_fop_data_t *fop = NULL;</div><div class='add'>+    int32_t error = ENOMEM;</div><div class='add'>+</div><div class='add'>+    gf_msg_trace("ec", 0, "EC(IPC) %p", frame);</div><div class='add'>+</div><div class='add'>+    VALIDATE_OR_GOTO(this, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, frame, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, this-&gt;private, out);</div><div class='add'>+</div><div class='add'>+    fop = ec_fop_data_allocate(frame, this, GF_FOP_IPC, 0, target, fop_flags,</div><div class='add'>+                               ec_wind_ipc, ec_manager_ipc, callback, data);</div><div class='add'>+    if (fop == NULL) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    if (xdata != NULL) {</div><div class='add'>+        fop-&gt;xdata = dict_ref(xdata);</div><div class='add'>+    }</div><div class='add'>+    fop-&gt;int32 = op;</div><div class='add'>+</div><div class='add'>+    error = 0;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (fop != NULL) {</div><div class='add'>+        ec_manager(fop, error);</div><div class='add'>+    } else {</div><div class='add'>+        func(frame, NULL, this, -1, error, NULL);</div><div class='add'>+    }</div><div class='add'>+}</div><div class='head'>diff --git a/xlators/cluster/ec/src/ec-gf8.c b/xlators/cluster/ec/src/ec-gf8.c<br/>new file mode 100644<br/>index 00000000000..039adae5929<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/xlators/cluster/ec/src/ec-gf8.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>xlators/cluster/ec/src/ec-gf8.c</a></div><div class='hunk'>@@ -0,0 +1,5882 @@</div><div class='add'>+/*</div><div class='add'>+  Copyright (c) 2015 DataLab, s.l. &lt;http://www.datalab.es&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#include "ec-gf8.h"</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_00_ops[] = {{EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_00 = {0,</div><div class='add'>+                                    {</div><div class='add'>+                                        0,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_00_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_01_ops[] = {{EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_01 = {8,</div><div class='add'>+                                    {</div><div class='add'>+                                        0,</div><div class='add'>+                                        1,</div><div class='add'>+                                        2,</div><div class='add'>+                                        3,</div><div class='add'>+                                        4,</div><div class='add'>+                                        5,</div><div class='add'>+                                        6,</div><div class='add'>+                                        7,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_01_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_02_ops[] = {{EC_GF_OP_XOR2, 1, 7, 0},</div><div class='add'>+                                         {EC_GF_OP_XOR2, 2, 7, 0},</div><div class='add'>+                                         {EC_GF_OP_XOR2, 3, 7, 0},</div><div class='add'>+                                         {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_02 = {8,</div><div class='add'>+                                    {</div><div class='add'>+                                        7,</div><div class='add'>+                                        0,</div><div class='add'>+                                        1,</div><div class='add'>+                                        2,</div><div class='add'>+                                        3,</div><div class='add'>+                                        4,</div><div class='add'>+                                        5,</div><div class='add'>+                                        6,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_02_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_03_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 7, 0}, {EC_GF_OP_COPY, 8, 3, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 2, 0}, {EC_GF_OP_XOR2, 2, 1, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 0, 0}, {EC_GF_OP_XOR2, 2, 7, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 7, 0}, {EC_GF_OP_XOR2, 7, 6, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 6, 5, 0}, {EC_GF_OP_XOR2, 5, 4, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 4, 8, 0}, {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_03 = {9,</div><div class='add'>+                                    {</div><div class='add'>+                                        0,</div><div class='add'>+                                        1,</div><div class='add'>+                                        2,</div><div class='add'>+                                        3,</div><div class='add'>+                                        4,</div><div class='add'>+                                        5,</div><div class='add'>+                                        6,</div><div class='add'>+                                        7,</div><div class='add'>+                                        8,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_03_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_04_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR3, 8, 6, 7}, {EC_GF_OP_XOR2, 2, 8, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 7, 0}, {EC_GF_OP_XOR2, 1, 8, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 6, 0}, {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_04 = {9,</div><div class='add'>+                                    {</div><div class='add'>+                                        6,</div><div class='add'>+                                        7,</div><div class='add'>+                                        0,</div><div class='add'>+                                        1,</div><div class='add'>+                                        2,</div><div class='add'>+                                        3,</div><div class='add'>+                                        4,</div><div class='add'>+                                        5,</div><div class='add'>+                                        8,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_04_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_05_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 4, 6, 0}, {EC_GF_OP_XOR2, 1, 7, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 5, 7, 0}, {EC_GF_OP_XOR2, 0, 6, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 7, 4, 0}, {EC_GF_OP_XOR2, 6, 3, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 7, 2, 0}, {EC_GF_OP_XOR2, 6, 1, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 5, 0}, {EC_GF_OP_XOR2, 2, 0, 0},</div><div class='add'>+    {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_05 = {8,</div><div class='add'>+                                    {</div><div class='add'>+                                        0,</div><div class='add'>+                                        1,</div><div class='add'>+                                        2,</div><div class='add'>+                                        6,</div><div class='add'>+                                        7,</div><div class='add'>+                                        3,</div><div class='add'>+                                        4,</div><div class='add'>+                                        5,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_05_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_06_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 2, 6, 0}, {EC_GF_OP_COPY, 8, 2, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 8, 3, 0}, {EC_GF_OP_XOR2, 2, 1, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 4, 0}, {EC_GF_OP_XOR2, 1, 0, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 7, 0}, {EC_GF_OP_XOR2, 0, 7, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 7, 6, 0}, {EC_GF_OP_XOR2, 4, 5, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 7, 0}, {EC_GF_OP_XOR2, 5, 6, 0},</div><div class='add'>+    {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_06 = {9,</div><div class='add'>+                                    {</div><div class='add'>+                                        7,</div><div class='add'>+                                        0,</div><div class='add'>+                                        1,</div><div class='add'>+                                        2,</div><div class='add'>+                                        8,</div><div class='add'>+                                        3,</div><div class='add'>+                                        4,</div><div class='add'>+                                        5,</div><div class='add'>+                                        6,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_06_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_07_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 5, 6, 0}, {EC_GF_OP_XOR2, 0, 7, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 6, 0}, {EC_GF_OP_XOR2, 7, 5, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 6, 0, 0}, {EC_GF_OP_XOR2, 0, 1, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 5, 4, 0}, {EC_GF_OP_XOR2, 4, 3, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 2, 0}, {EC_GF_OP_XOR2, 2, 4, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 1, 0}, {EC_GF_OP_XOR2, 4, 7, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 6, 0}, {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_07 = {8,</div><div class='add'>+                                    {</div><div class='add'>+                                        6,</div><div class='add'>+                                        0,</div><div class='add'>+                                        1,</div><div class='add'>+                                        3,</div><div class='add'>+                                        2,</div><div class='add'>+                                        4,</div><div class='add'>+                                        5,</div><div class='add'>+                                        7,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_07_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_08_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 5, 0}, {EC_GF_OP_XOR2, 1, 5, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 6, 0}, {EC_GF_OP_XOR3, 8, 6, 7},</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 8, 0}, {EC_GF_OP_XOR2, 3, 7, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 7, 5, 0}, {EC_GF_OP_XOR2, 2, 8, 0},</div><div class='add'>+    {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_08 = {9,</div><div class='add'>+                                    {</div><div class='add'>+                                        5,</div><div class='add'>+                                        6,</div><div class='add'>+                                        7,</div><div class='add'>+                                        0,</div><div class='add'>+                                        1,</div><div class='add'>+                                        2,</div><div class='add'>+                                        3,</div><div class='add'>+                                        4,</div><div class='add'>+                                        8,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_08_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_09_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 2, 4, 0}, {EC_GF_OP_XOR2, 4, 7, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 5, 0}, {EC_GF_OP_XOR2, 5, 4, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 6, 0}, {EC_GF_OP_XOR2, 2, 5, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 6, 0}, {EC_GF_OP_XOR2, 7, 3, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 6, 2, 0}, {EC_GF_OP_XOR2, 5, 1, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 0, 0}, {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_09 = {8,</div><div class='add'>+                                    {</div><div class='add'>+                                        0,</div><div class='add'>+                                        1,</div><div class='add'>+                                        2,</div><div class='add'>+                                        3,</div><div class='add'>+                                        5,</div><div class='add'>+                                        6,</div><div class='add'>+                                        7,</div><div class='add'>+                                        4,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_09_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_0A_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 5, 0}, {EC_GF_OP_XOR2, 4, 6, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 5, 7, 0}, {EC_GF_OP_XOR2, 7, 4, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 6, 0}, {EC_GF_OP_XOR2, 7, 2, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 6, 1, 0}, {EC_GF_OP_XOR2, 2, 0, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 6, 3, 0}, {EC_GF_OP_XOR2, 2, 5, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 5, 0}, {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_0A = {8,</div><div class='add'>+                                    {</div><div class='add'>+                                        5,</div><div class='add'>+                                        0,</div><div class='add'>+                                        1,</div><div class='add'>+                                        2,</div><div class='add'>+                                        6,</div><div class='add'>+                                        7,</div><div class='add'>+                                        3,</div><div class='add'>+                                        4,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_0A_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_0B_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 4, 7, 0}, {EC_GF_OP_XOR2, 7, 0, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 7, 5, 0}, {EC_GF_OP_XOR2, 3, 7, 0},</div><div class='add'>+    {EC_GF_OP_COPY, 9, 3, 0}, {EC_GF_OP_XOR2, 5, 2, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 6, 0}, {EC_GF_OP_COPY, 8, 5, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 3, 0}, {EC_GF_OP_XOR2, 5, 1, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 6, 4, 0}, {EC_GF_OP_XOR2, 1, 0, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 2, 3, 0}, {EC_GF_OP_XOR2, 4, 1, 0},</div><div class='add'>+    {EC_GF_OP_XOR3, 3, 8, 6}, {EC_GF_OP_XOR2, 1, 9, 0},</div><div class='add'>+    {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_0B = {10,</div><div class='add'>+                                    {</div><div class='add'>+                                        7,</div><div class='add'>+                                        1,</div><div class='add'>+                                        5,</div><div class='add'>+                                        2,</div><div class='add'>+                                        4,</div><div class='add'>+                                        3,</div><div class='add'>+                                        0,</div><div class='add'>+                                        6,</div><div class='add'>+                                        8,</div><div class='add'>+                                        9,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_0B_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_0C_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 5, 0}, {EC_GF_OP_COPY, 8, 1, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 8, 2, 0}, {EC_GF_OP_XOR2, 2, 3, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 4, 0}, {EC_GF_OP_XOR2, 0, 7, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 4, 5, 0}, {EC_GF_OP_XOR2, 3, 7, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 5, 6, 0}, {EC_GF_OP_XOR2, 1, 0, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 2, 6, 0}, {EC_GF_OP_XOR2, 7, 6, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 5, 0}, {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_0C = {9,</div><div class='add'>+                                    {</div><div class='add'>+                                        5,</div><div class='add'>+                                        7,</div><div class='add'>+                                        0,</div><div class='add'>+                                        1,</div><div class='add'>+                                        8,</div><div class='add'>+                                        2,</div><div class='add'>+                                        3,</div><div class='add'>+                                        4,</div><div class='add'>+                                        6,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_0C_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_0D_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 5, 7, 0}, {EC_GF_OP_XOR2, 4, 5, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 5, 0, 0}, {EC_GF_OP_XOR2, 5, 1, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 7, 0}, {EC_GF_OP_XOR2, 0, 3, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 6, 1, 0}, {EC_GF_OP_XOR2, 3, 5, 0},</div><div class='add'>+    {EC_GF_OP_XOR3, 8, 2, 4}, {EC_GF_OP_XOR2, 5, 6, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 2, 5, 0}, {EC_GF_OP_XOR2, 1, 8, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 2, 0}, {EC_GF_OP_XOR2, 7, 2, 0},</div><div class='add'>+    {EC_GF_OP_XOR3, 2, 8, 0}, {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_0D = {9,</div><div class='add'>+                                    {</div><div class='add'>+                                        5,</div><div class='add'>+                                        6,</div><div class='add'>+                                        7,</div><div class='add'>+                                        3,</div><div class='add'>+                                        1,</div><div class='add'>+                                        0,</div><div class='add'>+                                        2,</div><div class='add'>+                                        4,</div><div class='add'>+                                        8,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_0D_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_0E_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 5, 0}, {EC_GF_OP_XOR2, 5, 6, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 0, 0}, {EC_GF_OP_XOR2, 7, 5, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 6, 0}, {EC_GF_OP_XOR2, 0, 7, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 5, 4, 0}, {EC_GF_OP_XOR2, 6, 1, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 4, 3, 0}, {EC_GF_OP_XOR2, 1, 2, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 0, 0}, {EC_GF_OP_XOR2, 2, 4, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 1, 0}, {EC_GF_OP_XOR2, 4, 7, 0},</div><div class='add'>+    {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_0E = {8,</div><div class='add'>+                                    {</div><div class='add'>+                                        7,</div><div class='add'>+                                        0,</div><div class='add'>+                                        6,</div><div class='add'>+                                        1,</div><div class='add'>+                                        3,</div><div class='add'>+                                        2,</div><div class='add'>+                                        4,</div><div class='add'>+                                        5,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_0E_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_0F_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 2, 7, 0}, {EC_GF_OP_XOR2, 7, 1, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 7, 6, 0}, {EC_GF_OP_XOR2, 4, 0, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 7, 0}, {EC_GF_OP_XOR2, 5, 0, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 6, 3, 0}, {EC_GF_OP_XOR2, 1, 5, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 5, 2, 0}, {EC_GF_OP_XOR2, 4, 1, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 4, 0}, {EC_GF_OP_XOR2, 6, 5, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 2, 3, 0}, {EC_GF_OP_XOR2, 7, 2, 0},</div><div class='add'>+    {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_0F = {8,</div><div class='add'>+                                    {</div><div class='add'>+                                        1,</div><div class='add'>+                                        0,</div><div class='add'>+                                        5,</div><div class='add'>+                                        6,</div><div class='add'>+                                        7,</div><div class='add'>+                                        2,</div><div class='add'>+                                        3,</div><div class='add'>+                                        4,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_0F_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_10_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 7, 0}, {EC_GF_OP_XOR2, 7, 6, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 2, 7, 0}, {EC_GF_OP_XOR2, 7, 5, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 6, 4, 0}, {EC_GF_OP_XOR2, 0, 5, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 7, 0}, {EC_GF_OP_XOR2, 0, 6, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 7, 6, 0}, {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_10 = {8,</div><div class='add'>+                                    {</div><div class='add'>+                                        4,</div><div class='add'>+                                        5,</div><div class='add'>+                                        6,</div><div class='add'>+                                        7,</div><div class='add'>+                                        0,</div><div class='add'>+                                        1,</div><div class='add'>+                                        2,</div><div class='add'>+                                        3,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_10_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_11_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 5, 0}, {EC_GF_OP_XOR2, 5, 6, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 6, 4, 0}, {EC_GF_OP_XOR2, 4, 0, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 5, 0}, {EC_GF_OP_XOR2, 5, 7, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 7, 2, 0}, {EC_GF_OP_XOR2, 2, 6, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 6, 3, 0}, {EC_GF_OP_XOR2, 6, 5, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 5, 1, 0}, {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_11 = {8,</div><div class='add'>+                                    {</div><div class='add'>+                                        4,</div><div class='add'>+                                        1,</div><div class='add'>+                                        2,</div><div class='add'>+                                        6,</div><div class='add'>+                                        0,</div><div class='add'>+                                        5,</div><div class='add'>+                                        7,</div><div class='add'>+                                        3,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_11_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_12_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 7, 4, 0}, {EC_GF_OP_XOR2, 6, 7, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 2, 4, 0}, {EC_GF_OP_XOR2, 3, 6, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 4, 3, 0}, {EC_GF_OP_XOR2, 1, 6, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 2, 5, 0}, {EC_GF_OP_XOR2, 0, 5, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 6, 2, 0}, {EC_GF_OP_XOR2, 5, 1, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 0, 0}, {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_12 = {8,</div><div class='add'>+                                    {</div><div class='add'>+                                        7,</div><div class='add'>+                                        0,</div><div class='add'>+                                        1,</div><div class='add'>+                                        2,</div><div class='add'>+                                        3,</div><div class='add'>+                                        5,</div><div class='add'>+                                        6,</div><div class='add'>+                                        4,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_12_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_13_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 4, 7, 0}, {EC_GF_OP_XOR2, 7, 5, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 6, 0}, {EC_GF_OP_XOR2, 5, 1, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 6, 4, 0}, {EC_GF_OP_XOR2, 7, 2, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 4, 0, 0}, {EC_GF_OP_XOR2, 5, 0, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 6, 0}, {EC_GF_OP_XOR3, 8, 3, 7},</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 2, 0}, {EC_GF_OP_XOR2, 6, 8, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 2, 1, 0}, {EC_GF_OP_XOR2, 0, 8, 0},</div><div class='add'>+    {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_13 = {9,</div><div class='add'>+                                    {</div><div class='add'>+                                        4,</div><div class='add'>+                                        5,</div><div class='add'>+                                        2,</div><div class='add'>+                                        6,</div><div class='add'>+                                        0,</div><div class='add'>+                                        1,</div><div class='add'>+                                        7,</div><div class='add'>+                                        3,</div><div class='add'>+                                        8,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_13_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_14_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 6, 4, 0}, {EC_GF_OP_XOR2, 7, 5, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 5, 6, 0}, {EC_GF_OP_XOR2, 2, 7, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 4, 0}, {EC_GF_OP_XOR2, 1, 5, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 5, 2, 0}, {EC_GF_OP_XOR2, 4, 3, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 2, 0, 0}, {EC_GF_OP_XOR2, 3, 7, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 4, 1, 0}, {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_14 = {8,</div><div class='add'>+                                    {</div><div class='add'>+                                        6,</div><div class='add'>+                                        7,</div><div class='add'>+                                        0,</div><div class='add'>+                                        1,</div><div class='add'>+                                        2,</div><div class='add'>+                                        4,</div><div class='add'>+                                        5,</div><div class='add'>+                                        3,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_14_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_15_ops[] = {</div><div class='add'>+    {EC_GF_OP_COPY, 8, 0, 0}, {EC_GF_OP_XOR2, 0, 4, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 2, 0, 0}, {EC_GF_OP_XOR2, 0, 6, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 6, 1, 0}, {EC_GF_OP_XOR2, 1, 5, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 4, 5, 0}, {EC_GF_OP_XOR2, 1, 7, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 6, 3, 0}, {EC_GF_OP_XOR2, 7, 2, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 5, 0}, {EC_GF_OP_XOR3, 5, 8, 7},</div><div class='add'>+    {EC_GF_OP_XOR2, 7, 4, 0}, {EC_GF_OP_XOR2, 4, 6, 0},</div><div class='add'>+    {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_15 = {9,</div><div class='add'>+                                    {</div><div class='add'>+                                        0,</div><div class='add'>+                                        1,</div><div class='add'>+                                        2,</div><div class='add'>+                                        4,</div><div class='add'>+                                        7,</div><div class='add'>+                                        6,</div><div class='add'>+                                        5,</div><div class='add'>+                                        3,</div><div class='add'>+                                        8,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_15_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_16_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 4, 7, 0}, {EC_GF_OP_XOR2, 3, 6, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 7, 5, 0}, {EC_GF_OP_XOR2, 6, 4, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 7, 0, 0}, {EC_GF_OP_XOR2, 2, 6, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 7, 0}, {EC_GF_OP_XOR2, 4, 1, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 5, 2, 0}, {EC_GF_OP_XOR2, 4, 0, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 2, 3, 0}, {EC_GF_OP_XOR2, 0, 3, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 5, 0}, {EC_GF_OP_XOR2, 3, 4, 0},</div><div class='add'>+    {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_16 = {8,</div><div class='add'>+                                    {</div><div class='add'>+                                        6,</div><div class='add'>+                                        7,</div><div class='add'>+                                        4,</div><div class='add'>+                                        1,</div><div class='add'>+                                        2,</div><div class='add'>+                                        3,</div><div class='add'>+                                        5,</div><div class='add'>+                                        0,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_16_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_17_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 5, 0}, {EC_GF_OP_XOR2, 6, 3, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 0, 0}, {EC_GF_OP_XOR2, 7, 5, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 2, 0}, {EC_GF_OP_XOR2, 2, 7, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 4, 2, 0}, {EC_GF_OP_XOR2, 0, 1, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 5, 4, 0}, {EC_GF_OP_XOR2, 7, 0, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 5, 0}, {EC_GF_OP_XOR2, 5, 6, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 5, 0}, {EC_GF_OP_XOR2, 5, 3, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 2, 1, 0}, {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_17 = {8,</div><div class='add'>+                                    {</div><div class='add'>+                                        5,</div><div class='add'>+                                        7,</div><div class='add'>+                                        0,</div><div class='add'>+                                        1,</div><div class='add'>+                                        3,</div><div class='add'>+                                        2,</div><div class='add'>+                                        4,</div><div class='add'>+                                        6,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_17_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_18_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 7, 4, 0}, {EC_GF_OP_XOR2, 0, 7, 0},</div><div class='add'>+    {EC_GF_OP_COPY, 8, 0, 0}, {EC_GF_OP_XOR2, 0, 1, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 2, 0}, {EC_GF_OP_XOR2, 4, 5, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 2, 3, 0}, {EC_GF_OP_XOR2, 1, 5, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 7, 0}, {EC_GF_OP_XOR2, 5, 6, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 2, 6, 0}, {EC_GF_OP_XOR2, 7, 5, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 6, 8, 0}, {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_18 = {9,</div><div class='add'>+                                    {</div><div class='add'>+                                        4,</div><div class='add'>+                                        5,</div><div class='add'>+                                        7,</div><div class='add'>+                                        6,</div><div class='add'>+                                        0,</div><div class='add'>+                                        1,</div><div class='add'>+                                        2,</div><div class='add'>+                                        3,</div><div class='add'>+                                        8,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_18_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_19_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 7, 0, 0}, {EC_GF_OP_XOR2, 0, 4, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 6, 1, 0}, {EC_GF_OP_XOR2, 7, 1, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 4, 3, 0}, {EC_GF_OP_XOR2, 0, 5, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 5, 6, 0}, {EC_GF_OP_XOR2, 3, 2, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 2, 0}, {EC_GF_OP_XOR2, 6, 7, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 2, 0, 0}, {EC_GF_OP_XOR2, 2, 6, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 6, 4, 0}, {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_19 = {8,</div><div class='add'>+                                    {</div><div class='add'>+                                        0,</div><div class='add'>+                                        5,</div><div class='add'>+                                        2,</div><div class='add'>+                                        6,</div><div class='add'>+                                        7,</div><div class='add'>+                                        1,</div><div class='add'>+                                        3,</div><div class='add'>+                                        4,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_19_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_1A_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 6, 5, 0}, {EC_GF_OP_XOR2, 5, 4, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 4, 0, 0}, {EC_GF_OP_XOR2, 7, 5, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 6, 0}, {EC_GF_OP_XOR2, 4, 1, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 6, 3, 0}, {EC_GF_OP_XOR2, 3, 4, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 5, 2, 0}, {EC_GF_OP_XOR2, 4, 0, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 2, 6, 0}, {EC_GF_OP_XOR2, 1, 5, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 6, 7, 0}, {EC_GF_OP_XOR2, 5, 0, 0},</div><div class='add'>+    {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_1A = {8,</div><div class='add'>+                                    {</div><div class='add'>+                                        7,</div><div class='add'>+                                        0,</div><div class='add'>+                                        4,</div><div class='add'>+                                        5,</div><div class='add'>+                                        3,</div><div class='add'>+                                        1,</div><div class='add'>+                                        2,</div><div class='add'>+                                        6,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_1A_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_1B_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 0, 0}, {EC_GF_OP_XOR2, 0, 2, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 2, 5, 0}, {EC_GF_OP_XOR2, 7, 2, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 2, 3, 0}, {EC_GF_OP_XOR2, 4, 0, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 1, 0}, {EC_GF_OP_XOR2, 1, 4, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 7, 4, 0}, {EC_GF_OP_XOR2, 6, 1, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 5, 6, 0}, {EC_GF_OP_XOR2, 6, 3, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 4, 5, 0}, {EC_GF_OP_XOR2, 0, 6, 0},</div><div class='add'>+    {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_1B = {8,</div><div class='add'>+                                    {</div><div class='add'>+                                        7,</div><div class='add'>+                                        4,</div><div class='add'>+                                        5,</div><div class='add'>+                                        6,</div><div class='add'>+                                        3,</div><div class='add'>+                                        1,</div><div class='add'>+                                        2,</div><div class='add'>+                                        0,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_1B_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_1C_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 6, 4, 0}, {EC_GF_OP_XOR2, 5, 6, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 6, 3, 0}, {EC_GF_OP_XOR2, 3, 0, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 1, 0}, {EC_GF_OP_XOR2, 2, 6, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 4, 0}, {EC_GF_OP_XOR2, 7, 5, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 2, 0}, {EC_GF_OP_XOR2, 4, 7, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 7, 1, 0}, {EC_GF_OP_XOR2, 6, 4, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 3, 0}, {EC_GF_OP_XOR2, 3, 6, 0},</div><div class='add'>+    {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_1C = {8,</div><div class='add'>+                                    {</div><div class='add'>+                                        5,</div><div class='add'>+                                        4,</div><div class='add'>+                                        3,</div><div class='add'>+                                        0,</div><div class='add'>+                                        1,</div><div class='add'>+                                        7,</div><div class='add'>+                                        2,</div><div class='add'>+                                        6,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_1C_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_1D_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 7, 1, 0}, {EC_GF_OP_XOR2, 1, 0, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 2, 0}, {EC_GF_OP_XOR2, 0, 4, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 2, 1, 0}, {EC_GF_OP_XOR2, 4, 3, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 7, 0}, {EC_GF_OP_XOR3, 8, 4, 2},</div><div class='add'>+    {EC_GF_OP_XOR2, 2, 6, 0}, {EC_GF_OP_XOR2, 6, 5, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 5, 8, 0}, {EC_GF_OP_XOR2, 7, 6, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 6, 0}, {EC_GF_OP_XOR2, 1, 5, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 5, 3, 0}, {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_1D = {9,</div><div class='add'>+                                    {</div><div class='add'>+                                        0,</div><div class='add'>+                                        7,</div><div class='add'>+                                        5,</div><div class='add'>+                                        8,</div><div class='add'>+                                        2,</div><div class='add'>+                                        3,</div><div class='add'>+                                        4,</div><div class='add'>+                                        1,</div><div class='add'>+                                        6,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_1D_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_1E_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 4, 0, 0}, {EC_GF_OP_XOR2, 0, 5, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 6, 0}, {EC_GF_OP_XOR2, 1, 4, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 5, 1, 0}, {EC_GF_OP_XOR2, 2, 7, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 7, 0, 0}, {EC_GF_OP_XOR2, 1, 2, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 6, 3, 0}, {EC_GF_OP_XOR2, 4, 7, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 6, 1, 0}, {EC_GF_OP_XOR2, 3, 4, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 6, 0}, {EC_GF_OP_XOR2, 2, 3, 0},</div><div class='add'>+    {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_1E = {8,</div><div class='add'>+                                    {</div><div class='add'>+                                        4,</div><div class='add'>+                                        7,</div><div class='add'>+                                        5,</div><div class='add'>+                                        1,</div><div class='add'>+                                        6,</div><div class='add'>+                                        0,</div><div class='add'>+                                        2,</div><div class='add'>+                                        3,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_1E_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_1F_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 5, 2, 0}, {EC_GF_OP_XOR2, 5, 4, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 5, 0}, {EC_GF_OP_XOR2, 5, 0, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 5, 1, 0}, {EC_GF_OP_XOR2, 6, 3, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 7, 5, 0}, {EC_GF_OP_XOR2, 2, 6, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 7, 2, 0}, {EC_GF_OP_XOR3, 8, 3, 7},</div><div class='add'>+    {EC_GF_OP_XOR2, 4, 8, 0}, {EC_GF_OP_XOR2, 1, 8, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 6, 4, 0}, {EC_GF_OP_XOR2, 0, 6, 0},</div><div class='add'>+    {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_1F = {9,</div><div class='add'>+                                    {</div><div class='add'>+                                        1,</div><div class='add'>+                                        4,</div><div class='add'>+                                        5,</div><div class='add'>+                                        6,</div><div class='add'>+                                        7,</div><div class='add'>+                                        0,</div><div class='add'>+                                        3,</div><div class='add'>+                                        2,</div><div class='add'>+                                        8,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_1F_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_20_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 6, 7, 0}, {EC_GF_OP_XOR2, 1, 5, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 7, 3, 0}, {EC_GF_OP_XOR2, 1, 6, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 4, 0}, {EC_GF_OP_XOR2, 2, 6, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 6, 3, 0}, {EC_GF_OP_XOR2, 3, 5, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 5, 7, 0}, {EC_GF_OP_XOR2, 0, 5, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 6, 0}, {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_20 = {8,</div><div class='add'>+                                    {</div><div class='add'>+                                        7,</div><div class='add'>+                                        4,</div><div class='add'>+                                        5,</div><div class='add'>+                                        6,</div><div class='add'>+                                        3,</div><div class='add'>+                                        0,</div><div class='add'>+                                        1,</div><div class='add'>+                                        2,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_20_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_21_ops[] = {</div><div class='add'>+    {EC_GF_OP_COPY, 9, 0, 0}, {EC_GF_OP_XOR2, 0, 3, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 5, 3, 0}, {EC_GF_OP_XOR2, 3, 1, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 4, 0}, {EC_GF_OP_XOR2, 4, 6, 0},</div><div class='add'>+    {EC_GF_OP_XOR3, 8, 7, 5}, {EC_GF_OP_XOR2, 0, 7, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 6, 2, 0}, {EC_GF_OP_XOR2, 7, 4, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 8, 0}, {EC_GF_OP_XOR2, 2, 8, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 4, 9, 0}, {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_21 = {10,</div><div class='add'>+                                    {</div><div class='add'>+                                        0,</div><div class='add'>+                                        1,</div><div class='add'>+                                        2,</div><div class='add'>+                                        7,</div><div class='add'>+                                        5,</div><div class='add'>+                                        4,</div><div class='add'>+                                        3,</div><div class='add'>+                                        6,</div><div class='add'>+                                        8,</div><div class='add'>+                                        9,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_21_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_22_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 4, 0}, {EC_GF_OP_XOR2, 4, 6, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 6, 7, 0}, {EC_GF_OP_XOR2, 7, 2, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 2, 3, 0}, {EC_GF_OP_XOR2, 2, 4, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 4, 5, 0}, {EC_GF_OP_XOR2, 5, 3, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 5, 1, 0}, {EC_GF_OP_XOR2, 1, 6, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 6, 4, 0}, {EC_GF_OP_XOR2, 4, 0, 0},</div><div class='add'>+    {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_22 = {8,</div><div class='add'>+                                    {</div><div class='add'>+                                        3,</div><div class='add'>+                                        0,</div><div class='add'>+                                        5,</div><div class='add'>+                                        2,</div><div class='add'>+                                        6,</div><div class='add'>+                                        4,</div><div class='add'>+                                        1,</div><div class='add'>+                                        7,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_22_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_23_ops[] = {</div><div class='add'>+    {EC_GF_OP_COPY, 8, 2, 0}, {EC_GF_OP_XOR2, 2, 4, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 2, 6, 0}, {EC_GF_OP_XOR2, 4, 0, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 6, 0, 0}, {EC_GF_OP_XOR2, 0, 3, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 5, 0}, {EC_GF_OP_XOR2, 3, 8, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 4, 1, 0}, {EC_GF_OP_XOR2, 5, 7, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 1, 0}, {EC_GF_OP_XOR2, 1, 7, 0},</div><div class='add'>+    {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_23 = {9,</div><div class='add'>+                                    {</div><div class='add'>+                                        0,</div><div class='add'>+                                        4,</div><div class='add'>+                                        3,</div><div class='add'>+                                        2,</div><div class='add'>+                                        5,</div><div class='add'>+                                        6,</div><div class='add'>+                                        1,</div><div class='add'>+                                        8,</div><div class='add'>+                                        7,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_23_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_24_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 6, 3, 0}, {EC_GF_OP_XOR2, 6, 7, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 5, 6, 0}, {EC_GF_OP_XOR2, 2, 0, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 5, 0}, {EC_GF_OP_XOR2, 7, 4, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 4, 0}, {EC_GF_OP_XOR2, 4, 0, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 3, 0}, {EC_GF_OP_XOR2, 2, 4, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 5, 1, 0}, {EC_GF_OP_XOR2, 3, 2, 0},</div><div class='add'>+    {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_24 = {8,</div><div class='add'>+                                    {</div><div class='add'>+                                        6,</div><div class='add'>+                                        7,</div><div class='add'>+                                        0,</div><div class='add'>+                                        1,</div><div class='add'>+                                        2,</div><div class='add'>+                                        4,</div><div class='add'>+                                        5,</div><div class='add'>+                                        3,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_24_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_25_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 2, 5, 0}, {EC_GF_OP_XOR2, 6, 2, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 7, 0}, {EC_GF_OP_XOR2, 3, 6, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 3, 0}, {EC_GF_OP_XOR2, 1, 4, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 2, 0, 0}, {EC_GF_OP_XOR2, 7, 1, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 4, 2, 0}, {EC_GF_OP_XOR2, 5, 7, 0},</div><div class='add'>+    {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_25 = {8,</div><div class='add'>+                                    {</div><div class='add'>+                                        2,</div><div class='add'>+                                        7,</div><div class='add'>+                                        0,</div><div class='add'>+                                        1,</div><div class='add'>+                                        3,</div><div class='add'>+                                        4,</div><div class='add'>+                                        5,</div><div class='add'>+                                        6,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_25_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_26_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 0, 0}, {EC_GF_OP_XOR2, 0, 7, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 4, 0, 0}, {EC_GF_OP_XOR2, 3, 6, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 6, 4, 0}, {EC_GF_OP_XOR2, 2, 5, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 7, 2, 0}, {EC_GF_OP_XOR2, 5, 3, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 2, 6, 0}, {EC_GF_OP_XOR2, 6, 1, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 5, 0}, {EC_GF_OP_XOR2, 5, 0, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 2, 0}, {EC_GF_OP_XOR2, 2, 1, 0},</div><div class='add'>+    {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_26 = {8,</div><div class='add'>+                                    {</div><div class='add'>+                                        3,</div><div class='add'>+                                        4,</div><div class='add'>+                                        1,</div><div class='add'>+                                        2,</div><div class='add'>+                                        0,</div><div class='add'>+                                        5,</div><div class='add'>+                                        6,</div><div class='add'>+                                        7,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_26_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_27_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 0, 0}, {EC_GF_OP_XOR2, 4, 1, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 5, 2, 0}, {EC_GF_OP_XOR2, 4, 7, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 5, 0}, {EC_GF_OP_XOR2, 3, 6, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 2, 4, 0}, {EC_GF_OP_XOR2, 0, 4, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 6, 5, 0}, {EC_GF_OP_XOR2, 1, 3, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 7, 3, 0}, {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_27 = {8,</div><div class='add'>+                                    {</div><div class='add'>+                                        3,</div><div class='add'>+                                        0,</div><div class='add'>+                                        1,</div><div class='add'>+                                        2,</div><div class='add'>+                                        6,</div><div class='add'>+                                        7,</div><div class='add'>+                                        4,</div><div class='add'>+                                        5,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_27_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_28_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 6, 4, 0}, {EC_GF_OP_XOR2, 5, 7, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 7, 6, 0}, {EC_GF_OP_XOR2, 4, 5, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 3, 0}, {EC_GF_OP_XOR2, 5, 3, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 7, 0}, {EC_GF_OP_XOR2, 0, 4, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 4, 1, 0}, {EC_GF_OP_XOR2, 7, 2, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 2, 0, 0}, {EC_GF_OP_XOR2, 0, 3, 0},</div><div class='add'>+    {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_28 = {8,</div><div class='add'>+                                    {</div><div class='add'>+                                        5,</div><div class='add'>+                                        6,</div><div class='add'>+                                        3,</div><div class='add'>+                                        0,</div><div class='add'>+                                        1,</div><div class='add'>+                                        2,</div><div class='add'>+                                        4,</div><div class='add'>+                                        7,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_28_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_29_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 6, 4, 0}, {EC_GF_OP_XOR2, 5, 3, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 4, 3, 0}, {EC_GF_OP_XOR2, 3, 2, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 7, 4, 0}, {EC_GF_OP_XOR2, 2, 6, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 6, 1, 0}, {EC_GF_OP_XOR2, 1, 5, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 7, 0}, {EC_GF_OP_XOR2, 5, 0, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 7, 6, 0}, {EC_GF_OP_XOR2, 0, 3, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 4, 5, 0}, {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_29 = {8,</div><div class='add'>+                                    {</div><div class='add'>+                                        4,</div><div class='add'>+                                        6,</div><div class='add'>+                                        3,</div><div class='add'>+                                        5,</div><div class='add'>+                                        7,</div><div class='add'>+                                        0,</div><div class='add'>+                                        1,</div><div class='add'>+                                        2,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_29_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_2A_ops[] = {</div><div class='add'>+    {EC_GF_OP_COPY, 8, 1, 0}, {EC_GF_OP_XOR2, 8, 0, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 4, 0, 0}, {EC_GF_OP_XOR2, 0, 2, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 3, 0}, {EC_GF_OP_XOR2, 3, 5, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 7, 0}, {EC_GF_OP_XOR2, 2, 3, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 7, 1, 0}, {EC_GF_OP_XOR2, 5, 0, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 2, 4, 0}, {EC_GF_OP_XOR2, 0, 4, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 6, 0}, {EC_GF_OP_XOR2, 4, 6, 0},</div><div class='add'>+    {EC_GF_OP_XOR3, 6, 8, 4}, {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_2A = {9,</div><div class='add'>+                                    {</div><div class='add'>+                                        3,</div><div class='add'>+                                        4,</div><div class='add'>+                                        7,</div><div class='add'>+                                        2,</div><div class='add'>+                                        6,</div><div class='add'>+                                        5,</div><div class='add'>+                                        1,</div><div class='add'>+                                        0,</div><div class='add'>+                                        8,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_2A_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_2B_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 7, 2, 0}, {EC_GF_OP_XOR2, 2, 4, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 6, 1, 0}, {EC_GF_OP_XOR2, 4, 0, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 5, 0, 0}, {EC_GF_OP_XOR2, 4, 6, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 3, 0}, {EC_GF_OP_XOR2, 0, 7, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 5, 0}, {EC_GF_OP_XOR2, 7, 1, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 5, 2, 0}, {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_2B = {8,</div><div class='add'>+                                    {</div><div class='add'>+                                        3,</div><div class='add'>+                                        4,</div><div class='add'>+                                        7,</div><div class='add'>+                                        5,</div><div class='add'>+                                        6,</div><div class='add'>+                                        0,</div><div class='add'>+                                        1,</div><div class='add'>+                                        2,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_2B_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_2C_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 4, 0}, {EC_GF_OP_XOR2, 4, 7, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 2, 1, 0}, {EC_GF_OP_XOR2, 6, 4, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 2, 3, 0}, {EC_GF_OP_XOR2, 3, 6, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 5, 3, 0}, {EC_GF_OP_XOR2, 1, 5, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 0, 0}, {EC_GF_OP_XOR2, 4, 1, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 7, 3, 0}, {EC_GF_OP_XOR2, 1, 2, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 4, 0}, {EC_GF_OP_XOR2, 3, 1, 0},</div><div class='add'>+    {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_2C = {8,</div><div class='add'>+                                    {</div><div class='add'>+                                        5,</div><div class='add'>+                                        6,</div><div class='add'>+                                        7,</div><div class='add'>+                                        0,</div><div class='add'>+                                        2,</div><div class='add'>+                                        3,</div><div class='add'>+                                        4,</div><div class='add'>+                                        1,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_2C_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_2D_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 2, 0}, {EC_GF_OP_XOR2, 1, 3, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 0, 0}, {EC_GF_OP_XOR2, 4, 3, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 6, 0}, {EC_GF_OP_XOR2, 6, 1, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 2, 3, 0}, {EC_GF_OP_XOR3, 8, 4, 6},</div><div class='add'>+    {EC_GF_OP_XOR2, 5, 8, 0}, {EC_GF_OP_XOR2, 7, 8, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 2, 5, 0}, {EC_GF_OP_XOR2, 0, 7, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 6, 2, 0}, {EC_GF_OP_XOR2, 7, 2, 0},</div><div class='add'>+    {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_2D = {9,</div><div class='add'>+                                    {</div><div class='add'>+                                        7,</div><div class='add'>+                                        0,</div><div class='add'>+                                        3,</div><div class='add'>+                                        5,</div><div class='add'>+                                        1,</div><div class='add'>+                                        4,</div><div class='add'>+                                        2,</div><div class='add'>+                                        6,</div><div class='add'>+                                        8,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_2D_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_2E_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 4, 1, 0}, {EC_GF_OP_XOR2, 0, 1, 0},</div><div class='add'>+    {EC_GF_OP_COPY, 8, 4, 0}, {EC_GF_OP_XOR2, 3, 6, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 5, 0}, {EC_GF_OP_XOR2, 4, 3, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 8, 7, 0}, {EC_GF_OP_XOR2, 5, 3, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 2, 8, 0}, {EC_GF_OP_XOR2, 3, 0, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 6, 8, 0}, {EC_GF_OP_XOR2, 1, 2, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 7, 3, 0}, {EC_GF_OP_XOR2, 0, 6, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 1, 0}, {EC_GF_OP_XOR2, 6, 3, 0},</div><div class='add'>+    {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_2E = {9,</div><div class='add'>+                                    {</div><div class='add'>+                                        5,</div><div class='add'>+                                        0,</div><div class='add'>+                                        7,</div><div class='add'>+                                        3,</div><div class='add'>+                                        2,</div><div class='add'>+                                        6,</div><div class='add'>+                                        4,</div><div class='add'>+                                        1,</div><div class='add'>+                                        8,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_2E_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_2F_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 2, 0}, {EC_GF_OP_XOR2, 0, 3, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 7, 1, 0}, {EC_GF_OP_XOR2, 6, 0, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 7, 2, 0}, {EC_GF_OP_XOR2, 3, 4, 0},</div><div class='add'>+    {EC_GF_OP_XOR3, 8, 7, 6}, {EC_GF_OP_XOR2, 1, 3, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 5, 2, 0}, {EC_GF_OP_XOR2, 3, 8, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 2, 8, 0}, {EC_GF_OP_XOR2, 4, 5, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 6, 5, 0}, {EC_GF_OP_XOR2, 5, 3, 0},</div><div class='add'>+    {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_2F = {9,</div><div class='add'>+                                    {</div><div class='add'>+                                        6,</div><div class='add'>+                                        3,</div><div class='add'>+                                        2,</div><div class='add'>+                                        5,</div><div class='add'>+                                        7,</div><div class='add'>+                                        0,</div><div class='add'>+                                        1,</div><div class='add'>+                                        4,</div><div class='add'>+                                        8,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_2F_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_30_ops[] = {</div><div class='add'>+    {EC_GF_OP_COPY, 8, 0, 0}, {EC_GF_OP_XOR2, 8, 1, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 2, 0}, {EC_GF_OP_XOR2, 7, 4, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 6, 3, 0}, {EC_GF_OP_XOR2, 3, 7, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 6, 0}, {EC_GF_OP_XOR2, 1, 5, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 4, 5, 0}, {EC_GF_OP_XOR2, 2, 6, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 5, 6, 0}, {EC_GF_OP_XOR3, 6, 8, 7},</div><div class='add'>+    {EC_GF_OP_XOR2, 7, 5, 0}, {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_30 = {9,</div><div class='add'>+                                    {</div><div class='add'>+                                        3,</div><div class='add'>+                                        4,</div><div class='add'>+                                        7,</div><div class='add'>+                                        5,</div><div class='add'>+                                        0,</div><div class='add'>+                                        6,</div><div class='add'>+                                        1,</div><div class='add'>+                                        2,</div><div class='add'>+                                        8,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_30_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_31_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 0, 0}, {EC_GF_OP_XOR2, 3, 4, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 4, 5, 0}, {EC_GF_OP_XOR2, 2, 1, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 4, 0}, {EC_GF_OP_XOR2, 5, 6, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 6, 3, 0}, {EC_GF_OP_XOR2, 0, 7, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 2, 5, 0}, {EC_GF_OP_XOR2, 7, 3, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 1, 0}, {EC_GF_OP_XOR2, 3, 2, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 0, 0}, {EC_GF_OP_XOR2, 4, 3, 0},</div><div class='add'>+    {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_31 = {8,</div><div class='add'>+                                    {</div><div class='add'>+                                        7,</div><div class='add'>+                                        1,</div><div class='add'>+                                        4,</div><div class='add'>+                                        5,</div><div class='add'>+                                        6,</div><div class='add'>+                                        0,</div><div class='add'>+                                        2,</div><div class='add'>+                                        3,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_31_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_32_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 6, 5, 0}, {EC_GF_OP_XOR2, 5, 0, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 1, 0}, {EC_GF_OP_XOR2, 0, 7, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 7, 6, 0}, {EC_GF_OP_XOR2, 6, 1, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 2, 0}, {EC_GF_OP_XOR2, 2, 3, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 4, 0}, {EC_GF_OP_XOR2, 4, 5, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 6, 3, 0}, {EC_GF_OP_XOR2, 5, 7, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 7, 2, 0}, {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_32 = {8,</div><div class='add'>+                                    {</div><div class='add'>+                                        3,</div><div class='add'>+                                        4,</div><div class='add'>+                                        6,</div><div class='add'>+                                        7,</div><div class='add'>+                                        5,</div><div class='add'>+                                        0,</div><div class='add'>+                                        1,</div><div class='add'>+                                        2,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_32_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_33_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 2, 0}, {EC_GF_OP_XOR2, 2, 1, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 0, 0}, {EC_GF_OP_XOR2, 1, 5, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 4, 1, 0}, {EC_GF_OP_XOR2, 6, 2, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 7, 0}, {EC_GF_OP_XOR2, 2, 4, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 7, 3, 0}, {EC_GF_OP_XOR2, 0, 6, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 2, 0}, {EC_GF_OP_XOR2, 5, 3, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 0, 0}, {EC_GF_OP_XOR2, 0, 1, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 2, 0, 0}, {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_33 = {8,</div><div class='add'>+                                    {</div><div class='add'>+                                        5,</div><div class='add'>+                                        4,</div><div class='add'>+                                        3,</div><div class='add'>+                                        0,</div><div class='add'>+                                        2,</div><div class='add'>+                                        1,</div><div class='add'>+                                        6,</div><div class='add'>+                                        7,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_33_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_34_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 5, 4, 0}, {EC_GF_OP_XOR2, 4, 3, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 2, 5, 0}, {EC_GF_OP_XOR2, 6, 4, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 5, 7, 0}, {EC_GF_OP_XOR2, 4, 0, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 7, 6, 0}, {EC_GF_OP_XOR2, 0, 5, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 6, 2, 0}, {EC_GF_OP_XOR2, 4, 1, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 0, 0}, {EC_GF_OP_XOR2, 1, 2, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 4, 0}, {EC_GF_OP_XOR2, 2, 3, 0},</div><div class='add'>+    {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_34 = {8,</div><div class='add'>+                                    {</div><div class='add'>+                                        7,</div><div class='add'>+                                        5,</div><div class='add'>+                                        3,</div><div class='add'>+                                        0,</div><div class='add'>+                                        2,</div><div class='add'>+                                        4,</div><div class='add'>+                                        1,</div><div class='add'>+                                        6,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_34_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_35_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 1, 0}, {EC_GF_OP_XOR2, 1, 4, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 7, 1, 0}, {EC_GF_OP_XOR2, 3, 7, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 3, 0}, {EC_GF_OP_XOR2, 7, 5, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 2, 0, 0}, {EC_GF_OP_XOR2, 4, 7, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 5, 2, 0}, {EC_GF_OP_XOR2, 6, 0, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 5, 0}, {EC_GF_OP_XOR2, 0, 4, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 6, 0}, {EC_GF_OP_XOR2, 3, 1, 0},</div><div class='add'>+    {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_35 = {8,</div><div class='add'>+                                    {</div><div class='add'>+                                        6,</div><div class='add'>+                                        7,</div><div class='add'>+                                        5,</div><div class='add'>+                                        4,</div><div class='add'>+                                        2,</div><div class='add'>+                                        0,</div><div class='add'>+                                        1,</div><div class='add'>+                                        3,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_35_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_36_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 5, 2, 0}, {EC_GF_OP_XOR2, 2, 0, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 6, 4, 0}, {EC_GF_OP_XOR2, 4, 2, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 7, 4, 0}, {EC_GF_OP_XOR2, 0, 1, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 6, 3, 0}, {EC_GF_OP_XOR2, 7, 5, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 5, 3, 0}, {EC_GF_OP_XOR2, 3, 0, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 5, 0}, {EC_GF_OP_XOR2, 0, 4, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 4, 1, 0}, {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_36 = {8,</div><div class='add'>+                                    {</div><div class='add'>+                                        6,</div><div class='add'>+                                        7,</div><div class='add'>+                                        4,</div><div class='add'>+                                        1,</div><div class='add'>+                                        2,</div><div class='add'>+                                        3,</div><div class='add'>+                                        0,</div><div class='add'>+                                        5,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_36_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_37_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 2, 0}, {EC_GF_OP_XOR2, 0, 2, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 6, 1, 0}, {EC_GF_OP_XOR2, 0, 4, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 5, 0}, {EC_GF_OP_XOR3, 8, 0, 1},</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 8, 0}, {EC_GF_OP_XOR2, 7, 8, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 2, 3, 0}, {EC_GF_OP_XOR2, 3, 4, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 5, 2, 0}, {EC_GF_OP_XOR2, 4, 6, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 6, 5, 0}, {EC_GF_OP_XOR2, 5, 7, 0},</div><div class='add'>+    {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_37 = {9,</div><div class='add'>+                                    {</div><div class='add'>+                                        6,</div><div class='add'>+                                        7,</div><div class='add'>+                                        2,</div><div class='add'>+                                        1,</div><div class='add'>+                                        0,</div><div class='add'>+                                        3,</div><div class='add'>+                                        4,</div><div class='add'>+                                        5,</div><div class='add'>+                                        8,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_37_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_38_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 6, 4, 0}, {EC_GF_OP_XOR2, 5, 6, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 6, 3, 0}, {EC_GF_OP_XOR2, 3, 0, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 2, 6, 0}, {EC_GF_OP_XOR2, 7, 5, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 1, 0}, {EC_GF_OP_XOR3, 8, 6, 7},</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 2, 0}, {EC_GF_OP_XOR2, 7, 1, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 8, 0}, {EC_GF_OP_XOR2, 4, 8, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 3, 0}, {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_38 = {9,</div><div class='add'>+                                    {</div><div class='add'>+                                        4,</div><div class='add'>+                                        5,</div><div class='add'>+                                        6,</div><div class='add'>+                                        3,</div><div class='add'>+                                        0,</div><div class='add'>+                                        1,</div><div class='add'>+                                        7,</div><div class='add'>+                                        2,</div><div class='add'>+                                        8,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_38_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_39_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 5, 1, 0}, {EC_GF_OP_XOR2, 4, 5, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 6, 4, 0}, {EC_GF_OP_XOR2, 2, 0, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 2, 6, 0}, {EC_GF_OP_XOR2, 3, 0, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 5, 2, 0}, {EC_GF_OP_XOR2, 3, 5, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 7, 3, 0}, {EC_GF_OP_XOR2, 4, 7, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 5, 4, 0}, {EC_GF_OP_XOR2, 1, 5, 0},</div><div class='add'>+    {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_39 = {8,</div><div class='add'>+                                    {</div><div class='add'>+                                        1,</div><div class='add'>+                                        6,</div><div class='add'>+                                        3,</div><div class='add'>+                                        0,</div><div class='add'>+                                        5,</div><div class='add'>+                                        2,</div><div class='add'>+                                        4,</div><div class='add'>+                                        7,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_39_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_3A_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 6, 1, 0}, {EC_GF_OP_XOR2, 7, 3, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 0, 0}, {EC_GF_OP_XOR2, 3, 4, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 2, 0}, {EC_GF_OP_XOR2, 4, 6, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 2, 3, 0}, {EC_GF_OP_XOR2, 6, 0, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 5, 0}, {EC_GF_OP_XOR2, 0, 7, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 5, 1, 0}, {EC_GF_OP_XOR2, 7, 4, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 0, 0}, {EC_GF_OP_XOR2, 4, 5, 0},</div><div class='add'>+    {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_3A = {8,</div><div class='add'>+                                    {</div><div class='add'>+                                        3,</div><div class='add'>+                                        4,</div><div class='add'>+                                        7,</div><div class='add'>+                                        0,</div><div class='add'>+                                        5,</div><div class='add'>+                                        6,</div><div class='add'>+                                        1,</div><div class='add'>+                                        2,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_3A_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_3B_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 2, 0, 0}, {EC_GF_OP_XOR2, 0, 4, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 0, 0}, {EC_GF_OP_XOR2, 7, 2, 0},</div><div class='add'>+    {EC_GF_OP_XOR3, 8, 7, 3}, {EC_GF_OP_XOR2, 1, 6, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 5, 0}, {EC_GF_OP_XOR2, 5, 1, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 8, 0}, {EC_GF_OP_XOR2, 0, 5, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 2, 5, 0}, {EC_GF_OP_XOR2, 4, 1, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 6, 0, 0}, {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_3B = {9,</div><div class='add'>+                                    {</div><div class='add'>+                                        3,</div><div class='add'>+                                        0,</div><div class='add'>+                                        1,</div><div class='add'>+                                        7,</div><div class='add'>+                                        6,</div><div class='add'>+                                        2,</div><div class='add'>+                                        4,</div><div class='add'>+                                        8,</div><div class='add'>+                                        5,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_3B_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_3C_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 7, 5, 0}, {EC_GF_OP_XOR2, 7, 4, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 0, 0}, {EC_GF_OP_XOR2, 6, 7, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 3, 0}, {EC_GF_OP_XOR2, 3, 6, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 5, 3, 0}, {EC_GF_OP_XOR2, 1, 5, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 2, 1, 0}, {EC_GF_OP_XOR2, 1, 4, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 7, 2, 0}, {EC_GF_OP_XOR2, 4, 0, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 5, 7, 0}, {EC_GF_OP_XOR2, 0, 5, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 5, 1, 0}, {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_3C = {8,</div><div class='add'>+                                    {</div><div class='add'>+                                        3,</div><div class='add'>+                                        6,</div><div class='add'>+                                        4,</div><div class='add'>+                                        1,</div><div class='add'>+                                        7,</div><div class='add'>+                                        2,</div><div class='add'>+                                        0,</div><div class='add'>+                                        5,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_3C_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_3D_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 2, 0, 0}, {EC_GF_OP_XOR2, 3, 2, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 5, 1, 0}, {EC_GF_OP_XOR2, 4, 3, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 5, 4, 0}, {EC_GF_OP_XOR2, 6, 5, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 7, 6, 0}, {EC_GF_OP_XOR2, 0, 7, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 7, 0}, {EC_GF_OP_XOR2, 1, 0, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 2, 1, 0}, {EC_GF_OP_XOR2, 5, 1, 0},</div><div class='add'>+    {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_3D = {8,</div><div class='add'>+                                    {</div><div class='add'>+                                        2,</div><div class='add'>+                                        3,</div><div class='add'>+                                        4,</div><div class='add'>+                                        5,</div><div class='add'>+                                        6,</div><div class='add'>+                                        7,</div><div class='add'>+                                        0,</div><div class='add'>+                                        1,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_3D_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_3E_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 5, 0}, {EC_GF_OP_XOR2, 4, 3, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 6, 4, 0}, {EC_GF_OP_XOR2, 4, 2, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 7, 0}, {EC_GF_OP_XOR2, 1, 4, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 5, 1, 0}, {EC_GF_OP_XOR2, 0, 5, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 2, 0, 0}, {EC_GF_OP_XOR2, 0, 6, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 0, 0}, {EC_GF_OP_XOR2, 7, 3, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 7, 0}, {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_3E = {8,</div><div class='add'>+                                    {</div><div class='add'>+                                        6,</div><div class='add'>+                                        1,</div><div class='add'>+                                        2,</div><div class='add'>+                                        7,</div><div class='add'>+                                        0,</div><div class='add'>+                                        3,</div><div class='add'>+                                        5,</div><div class='add'>+                                        4,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_3E_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_3F_ops[] = {</div><div class='add'>+    {EC_GF_OP_COPY, 8, 0, 0},  {EC_GF_OP_XOR2, 0, 1, 0},</div><div class='add'>+    {EC_GF_OP_COPY, 10, 4, 0}, {EC_GF_OP_XOR2, 0, 6, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 4, 5, 0},  {EC_GF_OP_XOR2, 4, 0, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 3, 0},  {EC_GF_OP_COPY, 9, 2, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 4, 0},  {EC_GF_OP_XOR2, 2, 0, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 7, 4, 0},  {EC_GF_OP_XOR3, 4, 9, 7},</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 4, 0},  {EC_GF_OP_XOR2, 5, 3, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 3, 0},  {EC_GF_OP_XOR2, 6, 5, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 10, 0}, {EC_GF_OP_XOR2, 5, 8, 0},</div><div class='add'>+    {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_3F = {11,</div><div class='add'>+                                    {</div><div class='add'>+                                        1,</div><div class='add'>+                                        7,</div><div class='add'>+                                        6,</div><div class='add'>+                                        2,</div><div class='add'>+                                        4,</div><div class='add'>+                                        3,</div><div class='add'>+                                        5,</div><div class='add'>+                                        0,</div><div class='add'>+                                        8,</div><div class='add'>+                                        9,</div><div class='add'>+                                        10,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_3F_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_40_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 2, 0}, {EC_GF_OP_XOR2, 2, 3, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 2, 4, 0}, {EC_GF_OP_XOR2, 4, 5, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 6, 4, 0}, {EC_GF_OP_XOR2, 0, 6, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 7, 3, 0}, {EC_GF_OP_XOR2, 6, 2, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 4, 0}, {EC_GF_OP_XOR3, 8, 7, 6},</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 8, 0}, {EC_GF_OP_XOR2, 5, 8, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 4, 8, 0}, {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_40 = {9,</div><div class='add'>+                                    {</div><div class='add'>+                                        5,</div><div class='add'>+                                        7,</div><div class='add'>+                                        4,</div><div class='add'>+                                        6,</div><div class='add'>+                                        2,</div><div class='add'>+                                        3,</div><div class='add'>+                                        0,</div><div class='add'>+                                        1,</div><div class='add'>+                                        8,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_40_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_41_ops[] = {</div><div class='add'>+    {EC_GF_OP_COPY, 8, 0, 0}, {EC_GF_OP_XOR2, 8, 4, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 8, 5, 0}, {EC_GF_OP_XOR2, 5, 6, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 2, 0}, {EC_GF_OP_XOR2, 6, 7, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 6, 0}, {EC_GF_OP_XOR2, 7, 1, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 6, 4, 0}, {EC_GF_OP_XOR2, 1, 5, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 7, 3, 0}, {EC_GF_OP_XOR2, 4, 3, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 5, 2, 0}, {EC_GF_OP_XOR2, 3, 2, 0},</div><div class='add'>+    {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_41 = {9,</div><div class='add'>+                                    {</div><div class='add'>+                                        0,</div><div class='add'>+                                        7,</div><div class='add'>+                                        6,</div><div class='add'>+                                        5,</div><div class='add'>+                                        3,</div><div class='add'>+                                        4,</div><div class='add'>+                                        8,</div><div class='add'>+                                        1,</div><div class='add'>+                                        2,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_41_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_42_ops[] = {</div><div class='add'>+    {EC_GF_OP_COPY, 8, 0, 0}, {EC_GF_OP_XOR2, 0, 2, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 8, 3, 0}, {EC_GF_OP_XOR2, 2, 6, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 5, 0}, {EC_GF_OP_XOR2, 4, 2, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 5, 1, 0}, {EC_GF_OP_XOR2, 0, 4, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 6, 7, 0}, {EC_GF_OP_XOR2, 1, 4, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 5, 7, 0}, {EC_GF_OP_XOR2, 4, 6, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 7, 8, 0}, {EC_GF_OP_XOR2, 6, 3, 0},</div><div class='add'>+    {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_42 = {9,</div><div class='add'>+                                    {</div><div class='add'>+                                        2,</div><div class='add'>+                                        7,</div><div class='add'>+                                        1,</div><div class='add'>+                                        6,</div><div class='add'>+                                        4,</div><div class='add'>+                                        3,</div><div class='add'>+                                        0,</div><div class='add'>+                                        5,</div><div class='add'>+                                        8,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_42_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_43_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 5, 1, 0}, {EC_GF_OP_XOR2, 1, 6, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 6, 0, 0}, {EC_GF_OP_XOR2, 0, 4, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 4, 1, 0}, {EC_GF_OP_XOR2, 1, 7, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 7, 2, 0}, {EC_GF_OP_XOR2, 2, 6, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 6, 3, 0}, {EC_GF_OP_XOR2, 6, 1, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 5, 0}, {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_43 = {8,</div><div class='add'>+                                    {</div><div class='add'>+                                        2,</div><div class='add'>+                                        6,</div><div class='add'>+                                        4,</div><div class='add'>+                                        1,</div><div class='add'>+                                        7,</div><div class='add'>+                                        3,</div><div class='add'>+                                        0,</div><div class='add'>+                                        5,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_43_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_44_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 6, 0}, {EC_GF_OP_XOR2, 4, 7, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 6, 5, 0}, {EC_GF_OP_XOR2, 5, 4, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 4, 0, 0}, {EC_GF_OP_XOR2, 4, 2, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 6, 0}, {EC_GF_OP_XOR2, 2, 7, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 6, 3, 0}, {EC_GF_OP_XOR2, 7, 1, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 2, 0}, {EC_GF_OP_XOR2, 1, 6, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 6, 5, 0}, {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_44 = {8,</div><div class='add'>+                                    {</div><div class='add'>+                                        2,</div><div class='add'>+                                        3,</div><div class='add'>+                                        4,</div><div class='add'>+                                        1,</div><div class='add'>+                                        6,</div><div class='add'>+                                        5,</div><div class='add'>+                                        0,</div><div class='add'>+                                        7,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_44_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_45_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 2, 0, 0}, {EC_GF_OP_XOR2, 4, 7, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 2, 7, 0}, {EC_GF_OP_XOR2, 7, 3, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 7, 6, 0}, {EC_GF_OP_XOR2, 5, 0, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 6, 1, 0}, {EC_GF_OP_XOR2, 3, 1, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 4, 0}, {EC_GF_OP_XOR2, 1, 5, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 2, 0}, {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_45 = {8,</div><div class='add'>+                                    {</div><div class='add'>+                                        2,</div><div class='add'>+                                        3,</div><div class='add'>+                                        0,</div><div class='add'>+                                        1,</div><div class='add'>+                                        7,</div><div class='add'>+                                        4,</div><div class='add'>+                                        5,</div><div class='add'>+                                        6,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_45_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_46_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR3, 8, 2, 4}, {EC_GF_OP_XOR2, 4, 6, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 8, 0, 0}, {EC_GF_OP_XOR2, 6, 0, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 3, 0}, {EC_GF_OP_XOR2, 3, 1, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 5, 0}, {EC_GF_OP_XOR2, 5, 7, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 7, 1, 0}, {EC_GF_OP_XOR2, 1, 8, 0},</div><div class='add'>+    {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_46 = {9,</div><div class='add'>+                                    {</div><div class='add'>+                                        2,</div><div class='add'>+                                        0,</div><div class='add'>+                                        1,</div><div class='add'>+                                        3,</div><div class='add'>+                                        4,</div><div class='add'>+                                        5,</div><div class='add'>+                                        6,</div><div class='add'>+                                        7,</div><div class='add'>+                                        8,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_46_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_47_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR3, 8, 0, 1}, {EC_GF_OP_XOR2, 2, 0, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 8, 0}, {EC_GF_OP_XOR2, 5, 1, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 4, 8, 0}, {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_47 = {9,</div><div class='add'>+                                    {</div><div class='add'>+                                        2,</div><div class='add'>+                                        3,</div><div class='add'>+                                        4,</div><div class='add'>+                                        5,</div><div class='add'>+                                        6,</div><div class='add'>+                                        7,</div><div class='add'>+                                        0,</div><div class='add'>+                                        1,</div><div class='add'>+                                        8,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_47_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_48_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 5, 2, 0}, {EC_GF_OP_XOR2, 5, 4, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 6, 5, 0}, {EC_GF_OP_XOR2, 7, 6, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 2, 3, 0}, {EC_GF_OP_XOR2, 4, 7, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 7, 0}, {EC_GF_OP_XOR2, 1, 3, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 2, 0}, {EC_GF_OP_XOR2, 5, 3, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 2, 1, 0}, {EC_GF_OP_XOR2, 7, 0, 0},</div><div class='add'>+    {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_48 = {8,</div><div class='add'>+                                    {</div><div class='add'>+                                        4,</div><div class='add'>+                                        5,</div><div class='add'>+                                        6,</div><div class='add'>+                                        0,</div><div class='add'>+                                        1,</div><div class='add'>+                                        3,</div><div class='add'>+                                        7,</div><div class='add'>+                                        2,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_48_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_49_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 0, 0}, {EC_GF_OP_XOR2, 0, 2, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 6, 5, 0}, {EC_GF_OP_XOR3, 8, 0, 6},</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 1, 0}, {EC_GF_OP_XOR2, 7, 8, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 4, 0}, {EC_GF_OP_XOR2, 3, 7, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 4, 6, 0}, {EC_GF_OP_XOR2, 5, 3, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 6, 1, 0}, {EC_GF_OP_XOR2, 2, 5, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 5, 1, 0}, {EC_GF_OP_XOR3, 1, 8, 5},</div><div class='add'>+    {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_49 = {9,</div><div class='add'>+                                    {</div><div class='add'>+                                        7,</div><div class='add'>+                                        2,</div><div class='add'>+                                        4,</div><div class='add'>+                                        0,</div><div class='add'>+                                        3,</div><div class='add'>+                                        5,</div><div class='add'>+                                        1,</div><div class='add'>+                                        6,</div><div class='add'>+                                        8,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_49_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_4A_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 2, 6, 0}, {EC_GF_OP_XOR2, 1, 4, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 7, 0}, {EC_GF_OP_XOR2, 5, 2, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 5, 0}, {EC_GF_OP_XOR2, 0, 3, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 7, 1, 0}, {EC_GF_OP_XOR2, 6, 0, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 5, 0}, {EC_GF_OP_XOR2, 2, 7, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 4, 6, 0}, {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_4A = {8,</div><div class='add'>+                                    {</div><div class='add'>+                                        5,</div><div class='add'>+                                        6,</div><div class='add'>+                                        7,</div><div class='add'>+                                        0,</div><div class='add'>+                                        1,</div><div class='add'>+                                        3,</div><div class='add'>+                                        4,</div><div class='add'>+                                        2,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_4A_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_4B_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 6, 7, 0}, {EC_GF_OP_XOR2, 7, 0, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 1, 0}, {EC_GF_OP_XOR2, 1, 4, 0},</div><div class='add'>+    {EC_GF_OP_XOR3, 8, 3, 7}, {EC_GF_OP_XOR2, 3, 6, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 5, 0}, {EC_GF_OP_XOR2, 4, 8, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 2, 3, 0}, {EC_GF_OP_XOR2, 5, 8, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 0, 0}, {EC_GF_OP_XOR2, 6, 1, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 5, 2, 0}, {EC_GF_OP_XOR2, 0, 5, 0},</div><div class='add'>+    {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_4B = {9,</div><div class='add'>+                                    {</div><div class='add'>+                                        5,</div><div class='add'>+                                        3,</div><div class='add'>+                                        6,</div><div class='add'>+                                        7,</div><div class='add'>+                                        0,</div><div class='add'>+                                        2,</div><div class='add'>+                                        4,</div><div class='add'>+                                        1,</div><div class='add'>+                                        8,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_4B_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_4C_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 5, 2, 0}, {EC_GF_OP_XOR2, 2, 0, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 6, 0}, {EC_GF_OP_XOR2, 2, 3, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 4, 5, 0}, {EC_GF_OP_XOR2, 1, 2, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 5, 7, 0}, {EC_GF_OP_XOR2, 6, 4, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 7, 1, 0}, {EC_GF_OP_XOR2, 4, 0, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 6, 0}, {EC_GF_OP_XOR2, 2, 5, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 1, 0}, {EC_GF_OP_XOR2, 1, 2, 0},</div><div class='add'>+    {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_4C = {8,</div><div class='add'>+                                    {</div><div class='add'>+                                        5,</div><div class='add'>+                                        3,</div><div class='add'>+                                        4,</div><div class='add'>+                                        7,</div><div class='add'>+                                        0,</div><div class='add'>+                                        6,</div><div class='add'>+                                        2,</div><div class='add'>+                                        1,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_4C_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_4D_ops[] = {</div><div class='add'>+    {EC_GF_OP_COPY, 8, 3, 0}, {EC_GF_OP_XOR2, 3, 4, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 4, 6, 0}, {EC_GF_OP_XOR2, 0, 1, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 4, 0}, {EC_GF_OP_XOR3, 9, 3, 1},</div><div class='add'>+    {EC_GF_OP_XOR2, 5, 9, 0}, {EC_GF_OP_XOR2, 4, 2, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 6, 5, 0}, {EC_GF_OP_XOR2, 0, 6, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 7, 0, 0}, {EC_GF_OP_XOR2, 3, 0, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 2, 7, 0}, {EC_GF_OP_XOR3, 0, 8, 2},</div><div class='add'>+    {EC_GF_OP_XOR2, 5, 2, 0}, {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_4D = {10,</div><div class='add'>+                                    {</div><div class='add'>+                                        0,</div><div class='add'>+                                        9,</div><div class='add'>+                                        3,</div><div class='add'>+                                        5,</div><div class='add'>+                                        6,</div><div class='add'>+                                        4,</div><div class='add'>+                                        7,</div><div class='add'>+                                        1,</div><div class='add'>+                                        2,</div><div class='add'>+                                        8,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_4D_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_4E_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 0, 0}, {EC_GF_OP_XOR2, 4, 1, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 2, 0}, {EC_GF_OP_XOR2, 4, 7, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 2, 5, 0}, {EC_GF_OP_XOR2, 5, 4, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 6, 0}, {EC_GF_OP_XOR2, 0, 5, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 6, 2, 0}, {EC_GF_OP_XOR2, 7, 3, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 3, 0}, {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_4E = {8,</div><div class='add'>+                                    {</div><div class='add'>+                                        2,</div><div class='add'>+                                        3,</div><div class='add'>+                                        0,</div><div class='add'>+                                        1,</div><div class='add'>+                                        5,</div><div class='add'>+                                        6,</div><div class='add'>+                                        7,</div><div class='add'>+                                        4,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_4E_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_4F_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 4, 1, 0}, {EC_GF_OP_XOR2, 1, 0, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 7, 0, 0}, {EC_GF_OP_XOR2, 0, 2, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 5, 0}, {EC_GF_OP_XOR2, 2, 6, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 5, 7, 0}, {EC_GF_OP_XOR2, 6, 1, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 7, 3, 0}, {EC_GF_OP_XOR2, 1, 5, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 6, 0}, {EC_GF_OP_XOR2, 5, 4, 0},</div><div class='add'>+    {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_4F = {8,</div><div class='add'>+                                    {</div><div class='add'>+                                        0,</div><div class='add'>+                                        3,</div><div class='add'>+                                        5,</div><div class='add'>+                                        6,</div><div class='add'>+                                        1,</div><div class='add'>+                                        2,</div><div class='add'>+                                        7,</div><div class='add'>+                                        4,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_4F_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_50_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 5, 3, 0}, {EC_GF_OP_XOR2, 4, 6, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 6, 5, 0}, {EC_GF_OP_XOR2, 5, 7, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 7, 2, 0}, {EC_GF_OP_XOR2, 0, 2, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 4, 7, 0}, {EC_GF_OP_XOR2, 0, 6, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 4, 0}, {EC_GF_OP_XOR2, 6, 1, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 2, 3, 0}, {EC_GF_OP_XOR2, 1, 2, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 2, 0, 0}, {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_50 = {8,</div><div class='add'>+                                    {</div><div class='add'>+                                        4,</div><div class='add'>+                                        5,</div><div class='add'>+                                        7,</div><div class='add'>+                                        3,</div><div class='add'>+                                        0,</div><div class='add'>+                                        1,</div><div class='add'>+                                        2,</div><div class='add'>+                                        6,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_50_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_51_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 2, 1, 0}, {EC_GF_OP_XOR2, 3, 5, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 2, 3, 0}, {EC_GF_OP_XOR2, 3, 7, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 3, 0}, {EC_GF_OP_XOR2, 6, 1, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 4, 6, 0}, {EC_GF_OP_XOR2, 2, 4, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 2, 0}, {EC_GF_OP_XOR2, 5, 0, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 0, 0}, {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_51 = {8,</div><div class='add'>+                                    {</div><div class='add'>+                                        0,</div><div class='add'>+                                        1,</div><div class='add'>+                                        7,</div><div class='add'>+                                        2,</div><div class='add'>+                                        3,</div><div class='add'>+                                        4,</div><div class='add'>+                                        5,</div><div class='add'>+                                        6,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_51_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_52_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 2, 0}, {EC_GF_OP_XOR2, 0, 7, 0},</div><div class='add'>+    {EC_GF_OP_COPY, 8, 0, 0}, {EC_GF_OP_XOR2, 0, 4, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 4, 6, 0}, {EC_GF_OP_COPY, 9, 4, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 4, 3, 0}, {EC_GF_OP_XOR2, 3, 1, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 5, 3, 0}, {EC_GF_OP_XOR2, 6, 3, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 2, 0}, {EC_GF_OP_XOR3, 3, 5, 8},</div><div class='add'>+    {EC_GF_OP_XOR2, 7, 6, 0}, {EC_GF_OP_XOR2, 2, 9, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 6, 3, 0}, {EC_GF_OP_XOR2, 3, 1, 0},</div><div class='add'>+    {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_52 = {10,</div><div class='add'>+                                    {</div><div class='add'>+                                        2,</div><div class='add'>+                                        3,</div><div class='add'>+                                        1,</div><div class='add'>+                                        4,</div><div class='add'>+                                        6,</div><div class='add'>+                                        7,</div><div class='add'>+                                        0,</div><div class='add'>+                                        5,</div><div class='add'>+                                        8,</div><div class='add'>+                                        9,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_52_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_53_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 2, 0, 0}, {EC_GF_OP_XOR2, 3, 1, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 4, 6, 0}, {EC_GF_OP_XOR2, 2, 4, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 5, 7, 0}, {EC_GF_OP_XOR2, 3, 5, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 7, 2, 0}, {EC_GF_OP_XOR2, 5, 2, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 6, 3, 0}, {EC_GF_OP_XOR2, 0, 3, 0},</div><div class='add'>+    {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_53 = {8,</div><div class='add'>+                                    {</div><div class='add'>+                                        2,</div><div class='add'>+                                        0,</div><div class='add'>+                                        1,</div><div class='add'>+                                        4,</div><div class='add'>+                                        5,</div><div class='add'>+                                        6,</div><div class='add'>+                                        7,</div><div class='add'>+                                        3,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_53_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_54_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 7, 2, 0}, {EC_GF_OP_XOR2, 0, 7, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 7, 4, 0}, {EC_GF_OP_XOR2, 4, 1, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 2, 3, 0}, {EC_GF_OP_XOR2, 1, 3, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 5, 0}, {EC_GF_OP_XOR2, 1, 6, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 5, 0, 0}, {EC_GF_OP_XOR2, 0, 6, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 6, 4, 0}, {EC_GF_OP_XOR2, 4, 2, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 2, 5, 0}, {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_54 = {8,</div><div class='add'>+                                    {</div><div class='add'>+                                        7,</div><div class='add'>+                                        3,</div><div class='add'>+                                        0,</div><div class='add'>+                                        4,</div><div class='add'>+                                        2,</div><div class='add'>+                                        6,</div><div class='add'>+                                        5,</div><div class='add'>+                                        1,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_54_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_55_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 4, 2, 0}, {EC_GF_OP_XOR2, 7, 0, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 4, 1, 0}, {EC_GF_OP_XOR2, 3, 1, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 6, 7, 0}, {EC_GF_OP_XOR2, 2, 5, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 7, 4, 0}, {EC_GF_OP_XOR2, 5, 3, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 2, 6, 0}, {EC_GF_OP_XOR2, 1, 7, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 6, 0}, {EC_GF_OP_XOR2, 7, 2, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 3, 0}, {EC_GF_OP_XOR2, 3, 7, 0},</div><div class='add'>+    {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_55 = {8,</div><div class='add'>+                                    {</div><div class='add'>+                                        1,</div><div class='add'>+                                        5,</div><div class='add'>+                                        6,</div><div class='add'>+                                        4,</div><div class='add'>+                                        3,</div><div class='add'>+                                        7,</div><div class='add'>+                                        2,</div><div class='add'>+                                        0,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_55_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_56_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 5, 0, 0}, {EC_GF_OP_XOR2, 6, 1, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 2, 0}, {EC_GF_OP_XOR2, 1, 3, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 2, 4, 0}, {EC_GF_OP_XOR2, 3, 5, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 4, 1, 0}, {EC_GF_OP_XOR2, 4, 7, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 7, 0, 0}, {EC_GF_OP_XOR2, 0, 6, 0},</div><div class='add'>+    {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_56 = {8,</div><div class='add'>+                                    {</div><div class='add'>+                                        2,</div><div class='add'>+                                        3,</div><div class='add'>+                                        0,</div><div class='add'>+                                        4,</div><div class='add'>+                                        5,</div><div class='add'>+                                        6,</div><div class='add'>+                                        7,</div><div class='add'>+                                        1,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_56_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_57_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 2, 0, 0}, {EC_GF_OP_XOR2, 5, 0, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 1, 0}, {EC_GF_OP_XOR2, 0, 6, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 1, 0}, {EC_GF_OP_XOR2, 6, 7, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 4, 0}, {EC_GF_OP_XOR2, 6, 2, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 7, 0}, {EC_GF_OP_XOR2, 2, 4, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 7, 3, 0}, {EC_GF_OP_XOR2, 4, 5, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 5, 0}, {EC_GF_OP_XOR2, 5, 0, 0},</div><div class='add'>+    {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_57 = {8,</div><div class='add'>+                                    {</div><div class='add'>+                                        2,</div><div class='add'>+                                        3,</div><div class='add'>+                                        0,</div><div class='add'>+                                        1,</div><div class='add'>+                                        4,</div><div class='add'>+                                        5,</div><div class='add'>+                                        6,</div><div class='add'>+                                        7,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_57_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_58_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 2, 0}, {EC_GF_OP_XOR2, 2, 5, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 4, 3, 0}, {EC_GF_OP_XOR2, 5, 0, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 1, 0}, {EC_GF_OP_XOR2, 5, 4, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 7, 0}, {EC_GF_OP_XOR2, 1, 4, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 7, 5, 0}, {EC_GF_OP_XOR2, 0, 3, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 6, 2, 0}, {EC_GF_OP_XOR2, 3, 6, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 6, 1, 0}, {EC_GF_OP_XOR2, 4, 3, 0},</div><div class='add'>+    {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_58 = {8,</div><div class='add'>+                                    {</div><div class='add'>+                                        4,</div><div class='add'>+                                        3,</div><div class='add'>+                                        2,</div><div class='add'>+                                        7,</div><div class='add'>+                                        0,</div><div class='add'>+                                        1,</div><div class='add'>+                                        5,</div><div class='add'>+                                        6,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_58_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_59_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 1, 0}, {EC_GF_OP_XOR2, 1, 3, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 5, 0}, {EC_GF_OP_XOR2, 2, 4, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 6, 0}, {EC_GF_OP_XOR2, 2, 1, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 2, 0}, {EC_GF_OP_XOR2, 3, 0, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 7, 3, 0}, {EC_GF_OP_XOR2, 6, 7, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 6, 0}, {EC_GF_OP_XOR2, 3, 1, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 4, 3, 0}, {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_59 = {8,</div><div class='add'>+                                    {</div><div class='add'>+                                        7,</div><div class='add'>+                                        3,</div><div class='add'>+                                        5,</div><div class='add'>+                                        6,</div><div class='add'>+                                        1,</div><div class='add'>+                                        2,</div><div class='add'>+                                        0,</div><div class='add'>+                                        4,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_59_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_5A_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 5, 2, 0}, {EC_GF_OP_XOR2, 2, 1, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 4, 5, 0}, {EC_GF_OP_XOR2, 3, 2, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 6, 4, 0}, {EC_GF_OP_XOR2, 4, 3, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 2, 0, 0}, {EC_GF_OP_XOR2, 0, 4, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 0, 0}, {EC_GF_OP_XOR2, 5, 1, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 7, 5, 0}, {EC_GF_OP_XOR2, 0, 7, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 7, 6, 0}, {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_5A = {8,</div><div class='add'>+                                    {</div><div class='add'>+                                        6,</div><div class='add'>+                                        7,</div><div class='add'>+                                        0,</div><div class='add'>+                                        1,</div><div class='add'>+                                        2,</div><div class='add'>+                                        3,</div><div class='add'>+                                        5,</div><div class='add'>+                                        4,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_5A_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_5B_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 4, 0}, {EC_GF_OP_XOR2, 1, 5, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 4, 3, 0}, {EC_GF_OP_XOR2, 5, 0, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 2, 0}, {EC_GF_OP_XOR2, 2, 5, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 6, 0}, {EC_GF_OP_XOR2, 6, 2, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 7, 1, 0}, {EC_GF_OP_XOR2, 2, 1, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 3, 0}, {EC_GF_OP_XOR2, 4, 7, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 0, 0}, {EC_GF_OP_XOR2, 0, 4, 0},</div><div class='add'>+    {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_5B = {8,</div><div class='add'>+                                    {</div><div class='add'>+                                        6,</div><div class='add'>+                                        0,</div><div class='add'>+                                        7,</div><div class='add'>+                                        5,</div><div class='add'>+                                        2,</div><div class='add'>+                                        1,</div><div class='add'>+                                        3,</div><div class='add'>+                                        4,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_5B_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_5C_ops[] = {</div><div class='add'>+    {EC_GF_OP_COPY, 8, 3, 0}, {EC_GF_OP_XOR2, 3, 6, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 4, 1, 0}, {EC_GF_OP_XOR2, 5, 3, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 0, 0}, {EC_GF_OP_XOR2, 0, 5, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 3, 0}, {EC_GF_OP_XOR2, 2, 0, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 4, 0}, {EC_GF_OP_XOR2, 4, 2, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 6, 2, 0}, {EC_GF_OP_XOR2, 7, 4, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 2, 8, 0}, {EC_GF_OP_XOR2, 0, 7, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 7, 1, 0}, {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_5C = {9,</div><div class='add'>+                                    {</div><div class='add'>+                                        7,</div><div class='add'>+                                        5,</div><div class='add'>+                                        2,</div><div class='add'>+                                        4,</div><div class='add'>+                                        1,</div><div class='add'>+                                        0,</div><div class='add'>+                                        6,</div><div class='add'>+                                        3,</div><div class='add'>+                                        8,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_5C_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_5D_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 4, 1, 0}, {EC_GF_OP_XOR2, 1, 0, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 6, 0, 0}, {EC_GF_OP_XOR2, 4, 3, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 5, 6, 0}, {EC_GF_OP_XOR2, 6, 4, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 5, 0}, {EC_GF_OP_XOR2, 7, 6, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 2, 3, 0}, {EC_GF_OP_XOR2, 0, 7, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 1, 0}, {EC_GF_OP_XOR2, 7, 2, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 4, 2, 0}, {EC_GF_OP_XOR2, 1, 7, 0},</div><div class='add'>+    {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_5D = {8,</div><div class='add'>+                                    {</div><div class='add'>+                                        1,</div><div class='add'>+                                        3,</div><div class='add'>+                                        5,</div><div class='add'>+                                        4,</div><div class='add'>+                                        6,</div><div class='add'>+                                        7,</div><div class='add'>+                                        2,</div><div class='add'>+                                        0,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_5D_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_5E_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 6, 0, 0}, {EC_GF_OP_XOR2, 6, 5, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 2, 0}, {EC_GF_OP_XOR2, 5, 2, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 2, 3, 0}, {EC_GF_OP_XOR2, 7, 1, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 6, 0}, {EC_GF_OP_XOR2, 0, 2, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 6, 7, 0}, {EC_GF_OP_XOR2, 2, 4, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 4, 5, 0}, {EC_GF_OP_XOR2, 1, 2, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 5, 6, 0}, {EC_GF_OP_XOR2, 2, 6, 0},</div><div class='add'>+    {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_5E = {8,</div><div class='add'>+                                    {</div><div class='add'>+                                        4,</div><div class='add'>+                                        3,</div><div class='add'>+                                        6,</div><div class='add'>+                                        2,</div><div class='add'>+                                        5,</div><div class='add'>+                                        7,</div><div class='add'>+                                        0,</div><div class='add'>+                                        1,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_5E_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_5F_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 3, 0}, {EC_GF_OP_XOR2, 1, 5, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 6, 0}, {EC_GF_OP_XOR2, 1, 0, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 7, 1, 0}, {EC_GF_OP_XOR2, 3, 7, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 2, 0, 0}, {EC_GF_OP_XOR2, 4, 3, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 7, 2, 0}, {EC_GF_OP_XOR2, 5, 4, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 6, 5, 0}, {EC_GF_OP_XOR2, 0, 5, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 6, 7, 0}, {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_5F = {8,</div><div class='add'>+                                    {</div><div class='add'>+                                        6,</div><div class='add'>+                                        1,</div><div class='add'>+                                        3,</div><div class='add'>+                                        4,</div><div class='add'>+                                        5,</div><div class='add'>+                                        7,</div><div class='add'>+                                        2,</div><div class='add'>+                                        0,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_5F_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_60_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 5, 2, 0}, {EC_GF_OP_XOR2, 7, 4, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 4, 5, 0}, {EC_GF_OP_XOR2, 6, 3, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 2, 6, 0}, {EC_GF_OP_XOR2, 4, 6, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 7, 0}, {EC_GF_OP_XOR2, 6, 0, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 1, 0}, {EC_GF_OP_XOR2, 0, 7, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 5, 0}, {EC_GF_OP_XOR2, 7, 5, 0},</div><div class='add'>+    {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_60 = {8,</div><div class='add'>+                                    {</div><div class='add'>+                                        2,</div><div class='add'>+                                        3,</div><div class='add'>+                                        4,</div><div class='add'>+                                        7,</div><div class='add'>+                                        5,</div><div class='add'>+                                        6,</div><div class='add'>+                                        0,</div><div class='add'>+                                        1,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_60_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_61_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 2, 0}, {EC_GF_OP_XOR2, 6, 2, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 2, 5, 0}, {EC_GF_OP_XOR2, 4, 2, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 3, 0}, {EC_GF_OP_XOR2, 3, 4, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 6, 0}, {EC_GF_OP_XOR2, 7, 3, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 2, 0, 0}, {EC_GF_OP_XOR2, 6, 3, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 7, 0}, {EC_GF_OP_XOR2, 5, 1, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 2, 0}, {EC_GF_OP_XOR2, 3, 5, 0},</div><div class='add'>+    {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_61 = {8,</div><div class='add'>+                                    {</div><div class='add'>+                                        0,</div><div class='add'>+                                        5,</div><div class='add'>+                                        6,</div><div class='add'>+                                        7,</div><div class='add'>+                                        4,</div><div class='add'>+                                        2,</div><div class='add'>+                                        1,</div><div class='add'>+                                        3,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_61_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_62_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 7, 0}, {EC_GF_OP_XOR2, 1, 2, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 2, 3, 0}, {EC_GF_OP_XOR2, 3, 4, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 4, 5, 0}, {EC_GF_OP_XOR2, 0, 3, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 5, 2, 0}, {EC_GF_OP_XOR2, 7, 0, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 2, 6, 0}, {EC_GF_OP_XOR2, 1, 5, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 6, 7, 0}, {EC_GF_OP_XOR2, 7, 1, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 2, 0}, {EC_GF_OP_XOR2, 3, 1, 0},</div><div class='add'>+    {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_62 = {8,</div><div class='add'>+                                    {</div><div class='add'>+                                        2,</div><div class='add'>+                                        0,</div><div class='add'>+                                        3,</div><div class='add'>+                                        4,</div><div class='add'>+                                        5,</div><div class='add'>+                                        6,</div><div class='add'>+                                        7,</div><div class='add'>+                                        1,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_62_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_63_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 4, 3, 0}, {EC_GF_OP_XOR2, 5, 4, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 6, 5, 0}, {EC_GF_OP_XOR2, 1, 7, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 6, 0}, {EC_GF_OP_XOR2, 6, 1, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 7, 2, 0}, {EC_GF_OP_XOR2, 3, 0, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 4, 6, 0}, {EC_GF_OP_XOR2, 7, 5, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 3, 0}, {EC_GF_OP_XOR2, 2, 4, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 7, 0}, {EC_GF_OP_XOR2, 4, 0, 0},</div><div class='add'>+    {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_63 = {8,</div><div class='add'>+                                    {</div><div class='add'>+                                        3,</div><div class='add'>+                                        4,</div><div class='add'>+                                        6,</div><div class='add'>+                                        5,</div><div class='add'>+                                        7,</div><div class='add'>+                                        0,</div><div class='add'>+                                        1,</div><div class='add'>+                                        2,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_63_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_64_ops[] = {</div><div class='add'>+    {EC_GF_OP_COPY, 8, 1, 0}, {EC_GF_OP_XOR2, 8, 0, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 2, 0}, {EC_GF_OP_XOR2, 8, 7, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 2, 3, 0}, {EC_GF_OP_XOR2, 3, 4, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 7, 6, 0}, {EC_GF_OP_XOR2, 4, 5, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 6, 1, 0}, {EC_GF_OP_XOR2, 5, 7, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 6, 4, 0}, {EC_GF_OP_XOR2, 7, 0, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 4, 2, 0}, {EC_GF_OP_XOR2, 4, 0, 0},</div><div class='add'>+    {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_64 = {9,</div><div class='add'>+                                    {</div><div class='add'>+                                        2,</div><div class='add'>+                                        3,</div><div class='add'>+                                        4,</div><div class='add'>+                                        6,</div><div class='add'>+                                        5,</div><div class='add'>+                                        7,</div><div class='add'>+                                        8,</div><div class='add'>+                                        1,</div><div class='add'>+                                        0,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_64_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_65_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 6, 7, 0}, {EC_GF_OP_XOR2, 7, 2, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 5, 6, 0}, {EC_GF_OP_XOR2, 2, 0, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 4, 5, 0}, {EC_GF_OP_XOR2, 2, 3, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 6, 1, 0}, {EC_GF_OP_XOR2, 3, 4, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 7, 1, 0}, {EC_GF_OP_XOR2, 6, 0, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 3, 0}, {EC_GF_OP_XOR2, 0, 5, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 7, 0}, {EC_GF_OP_XOR2, 5, 1, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 6, 0}, {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_65 = {8,</div><div class='add'>+                                    {</div><div class='add'>+                                        2,</div><div class='add'>+                                        5,</div><div class='add'>+                                        1,</div><div class='add'>+                                        3,</div><div class='add'>+                                        4,</div><div class='add'>+                                        0,</div><div class='add'>+                                        6,</div><div class='add'>+                                        7,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_65_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_66_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 4, 0, 0}, {EC_GF_OP_XOR2, 0, 1, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 2, 0}, {EC_GF_OP_XOR2, 2, 3, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 4, 0}, {EC_GF_OP_XOR2, 5, 7, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 2, 7, 0}, {EC_GF_OP_XOR2, 0, 5, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 4, 6, 0}, {EC_GF_OP_XOR2, 5, 3, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 6, 1, 0}, {EC_GF_OP_XOR2, 7, 4, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 5, 0}, {EC_GF_OP_XOR2, 4, 0, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 5, 7, 0}, {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_66 = {8,</div><div class='add'>+                                    {</div><div class='add'>+                                        2,</div><div class='add'>+                                        3,</div><div class='add'>+                                        1,</div><div class='add'>+                                        4,</div><div class='add'>+                                        5,</div><div class='add'>+                                        7,</div><div class='add'>+                                        0,</div><div class='add'>+                                        6,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_66_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_67_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 0, 0}, {EC_GF_OP_XOR2, 3, 1, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 4, 0}, {EC_GF_OP_XOR2, 4, 3, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 7, 4, 0}, {EC_GF_OP_XOR2, 5, 7, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 5, 0}, {EC_GF_OP_XOR2, 6, 0, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 6, 0}, {EC_GF_OP_XOR2, 1, 3, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 7, 1, 0}, {EC_GF_OP_XOR2, 2, 7, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 2, 0}, {EC_GF_OP_XOR2, 2, 3, 0},</div><div class='add'>+    {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_67 = {8,</div><div class='add'>+                                    {</div><div class='add'>+                                        2,</div><div class='add'>+                                        4,</div><div class='add'>+                                        5,</div><div class='add'>+                                        6,</div><div class='add'>+                                        7,</div><div class='add'>+                                        3,</div><div class='add'>+                                        1,</div><div class='add'>+                                        0,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_67_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_68_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 5, 2, 0}, {EC_GF_OP_XOR2, 5, 4, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 4, 3, 0}, {EC_GF_OP_XOR2, 6, 4, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 7, 6, 0}, {EC_GF_OP_XOR2, 4, 0, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 2, 7, 0}, {EC_GF_OP_XOR2, 4, 1, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 2, 0}, {EC_GF_OP_XOR2, 1, 5, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 0, 0}, {EC_GF_OP_XOR2, 5, 6, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 4, 0}, {EC_GF_OP_XOR2, 6, 3, 0},</div><div class='add'>+    {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_68 = {8,</div><div class='add'>+                                    {</div><div class='add'>+                                        5,</div><div class='add'>+                                        7,</div><div class='add'>+                                        2,</div><div class='add'>+                                        3,</div><div class='add'>+                                        0,</div><div class='add'>+                                        6,</div><div class='add'>+                                        4,</div><div class='add'>+                                        1,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_68_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_69_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 4, 6, 0}, {EC_GF_OP_XOR2, 4, 7, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 4, 0}, {EC_GF_OP_XOR2, 2, 1, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 3, 0}, {EC_GF_OP_XOR2, 4, 2, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 1, 0}, {EC_GF_OP_XOR2, 5, 4, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 7, 0, 0}, {EC_GF_OP_XOR2, 6, 5, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 2, 0, 0}, {EC_GF_OP_XOR2, 5, 7, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 6, 0}, {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_69 = {8,</div><div class='add'>+                                    {</div><div class='add'>+                                        0,</div><div class='add'>+                                        1,</div><div class='add'>+                                        3,</div><div class='add'>+                                        2,</div><div class='add'>+                                        4,</div><div class='add'>+                                        5,</div><div class='add'>+                                        7,</div><div class='add'>+                                        6,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_69_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_6A_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 7, 3, 0}, {EC_GF_OP_XOR2, 3, 5, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 4, 0}, {EC_GF_OP_XOR2, 2, 6, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 6, 0, 0}, {EC_GF_OP_XOR2, 5, 2, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 3, 0}, {EC_GF_OP_XOR2, 0, 1, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 5, 0}, {EC_GF_OP_XOR2, 5, 7, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 4, 1, 0}, {EC_GF_OP_XOR2, 7, 6, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 4, 0}, {EC_GF_OP_XOR2, 2, 7, 0},</div><div class='add'>+    {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_6A = {8,</div><div class='add'>+                                    {</div><div class='add'>+                                        5,</div><div class='add'>+                                        7,</div><div class='add'>+                                        4,</div><div class='add'>+                                        6,</div><div class='add'>+                                        1,</div><div class='add'>+                                        2,</div><div class='add'>+                                        0,</div><div class='add'>+                                        3,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_6A_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_6B_ops[] = {</div><div class='add'>+    {EC_GF_OP_COPY, 8, 1, 0}, {EC_GF_OP_XOR2, 1, 2, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 6, 0}, {EC_GF_OP_XOR2, 3, 4, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 1, 0}, {EC_GF_OP_XOR2, 2, 3, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 2, 0}, {EC_GF_OP_XOR2, 1, 5, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 7, 0, 0}, {EC_GF_OP_XOR2, 5, 0, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 7, 0}, {EC_GF_OP_XOR2, 4, 1, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 6, 4, 0}, {EC_GF_OP_XOR2, 4, 0, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 8, 0}, {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_6B = {9,</div><div class='add'>+                                    {</div><div class='add'>+                                        6,</div><div class='add'>+                                        7,</div><div class='add'>+                                        2,</div><div class='add'>+                                        0,</div><div class='add'>+                                        3,</div><div class='add'>+                                        1,</div><div class='add'>+                                        5,</div><div class='add'>+                                        4,</div><div class='add'>+                                        8,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_6B_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_6C_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 5, 2, 0}, {EC_GF_OP_XOR2, 4, 3, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 5, 3, 0}, {EC_GF_OP_XOR2, 2, 0, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 6, 4, 0}, {EC_GF_OP_XOR2, 4, 2, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 1, 0}, {EC_GF_OP_XOR2, 3, 0, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 7, 4, 0}, {EC_GF_OP_XOR2, 4, 3, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 4, 0}, {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_6C = {8,</div><div class='add'>+                                    {</div><div class='add'>+                                        5,</div><div class='add'>+                                        6,</div><div class='add'>+                                        7,</div><div class='add'>+                                        0,</div><div class='add'>+                                        1,</div><div class='add'>+                                        2,</div><div class='add'>+                                        3,</div><div class='add'>+                                        4,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_6C_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_6D_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 4, 1, 0}, {EC_GF_OP_XOR2, 1, 0, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 7, 4, 0}, {EC_GF_OP_XOR2, 0, 2, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 3, 0}, {EC_GF_OP_XOR2, 2, 7, 0},</div><div class='add'>+    {EC_GF_OP_XOR3, 8, 3, 4}, {EC_GF_OP_XOR2, 7, 1, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 5, 0, 0}, {EC_GF_OP_XOR2, 1, 6, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 8, 0}, {EC_GF_OP_XOR2, 3, 5, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 6, 8, 0}, {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_6D = {9,</div><div class='add'>+                                    {</div><div class='add'>+                                        3,</div><div class='add'>+                                        6,</div><div class='add'>+                                        7,</div><div class='add'>+                                        0,</div><div class='add'>+                                        4,</div><div class='add'>+                                        5,</div><div class='add'>+                                        1,</div><div class='add'>+                                        2,</div><div class='add'>+                                        8,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_6D_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_6E_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 1, 0}, {EC_GF_OP_XOR2, 1, 2, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 2, 0, 0}, {EC_GF_OP_XOR2, 7, 3, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 5, 0}, {EC_GF_OP_XOR2, 6, 1, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 3, 0}, {EC_GF_OP_XOR2, 2, 4, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 7, 0}, {EC_GF_OP_XOR2, 4, 6, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 2, 0}, {EC_GF_OP_XOR2, 5, 1, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 6, 3, 0}, {EC_GF_OP_XOR2, 1, 3, 0},</div><div class='add'>+    {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_6E = {8,</div><div class='add'>+                                    {</div><div class='add'>+                                        5,</div><div class='add'>+                                        6,</div><div class='add'>+                                        3,</div><div class='add'>+                                        1,</div><div class='add'>+                                        7,</div><div class='add'>+                                        2,</div><div class='add'>+                                        0,</div><div class='add'>+                                        4,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_6E_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_6F_ops[] = {</div><div class='add'>+    {EC_GF_OP_COPY, 8, 0, 0}, {EC_GF_OP_XOR2, 0, 1, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 4, 0}, {EC_GF_OP_XOR2, 3, 0, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 2, 5, 0}, {EC_GF_OP_XOR2, 7, 3, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 2, 0, 0}, {EC_GF_OP_XOR2, 6, 3, 0},</div><div class='add'>+    {EC_GF_OP_XOR3, 0, 8, 7}, {EC_GF_OP_XOR2, 1, 2, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 5, 6, 0}, {EC_GF_OP_XOR2, 2, 0, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 4, 5, 0}, {EC_GF_OP_XOR2, 5, 2, 0},</div><div class='add'>+    {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_6F = {9,</div><div class='add'>+                                    {</div><div class='add'>+                                        2,</div><div class='add'>+                                        6,</div><div class='add'>+                                        3,</div><div class='add'>+                                        7,</div><div class='add'>+                                        0,</div><div class='add'>+                                        1,</div><div class='add'>+                                        4,</div><div class='add'>+                                        5,</div><div class='add'>+                                        8,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_6F_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_70_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 2, 0}, {EC_GF_OP_XOR2, 5, 3, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 6, 4, 0}, {EC_GF_OP_XOR2, 4, 2, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 7, 5, 0}, {EC_GF_OP_XOR2, 0, 2, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 6, 0}, {EC_GF_OP_XOR2, 4, 7, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 6, 0, 0}, {EC_GF_OP_XOR2, 7, 1, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 6, 0}, {EC_GF_OP_XOR2, 0, 7, 0},</div><div class='add'>+    {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_70 = {8,</div><div class='add'>+                                    {</div><div class='add'>+                                        3,</div><div class='add'>+                                        4,</div><div class='add'>+                                        5,</div><div class='add'>+                                        2,</div><div class='add'>+                                        6,</div><div class='add'>+                                        0,</div><div class='add'>+                                        1,</div><div class='add'>+                                        7,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_70_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_71_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 6, 0, 0}, {EC_GF_OP_XOR2, 0, 1, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 5, 0}, {EC_GF_OP_XOR2, 0, 4, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 5, 3, 0}, {EC_GF_OP_XOR2, 4, 3, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 6, 2, 0}, {EC_GF_OP_XOR2, 3, 2, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 7, 4, 0}, {EC_GF_OP_XOR2, 2, 0, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 4, 6, 0}, {EC_GF_OP_XOR2, 0, 7, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 7, 1, 0}, {EC_GF_OP_XOR2, 1, 3, 0},</div><div class='add'>+    {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_71 = {8,</div><div class='add'>+                                    {</div><div class='add'>+                                        4,</div><div class='add'>+                                        7,</div><div class='add'>+                                        5,</div><div class='add'>+                                        3,</div><div class='add'>+                                        6,</div><div class='add'>+                                        0,</div><div class='add'>+                                        2,</div><div class='add'>+                                        1,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_71_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_72_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 4, 0, 0}, {EC_GF_OP_XOR2, 3, 7, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 4, 0}, {EC_GF_OP_XOR2, 5, 3, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 5, 0}, {EC_GF_OP_XOR2, 4, 1, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 2, 4, 0}, {EC_GF_OP_XOR2, 6, 2, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 6, 0}, {EC_GF_OP_XOR2, 4, 3, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 4, 0}, {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_72 = {8,</div><div class='add'>+                                    {</div><div class='add'>+                                        0,</div><div class='add'>+                                        5,</div><div class='add'>+                                        2,</div><div class='add'>+                                        7,</div><div class='add'>+                                        4,</div><div class='add'>+                                        1,</div><div class='add'>+                                        3,</div><div class='add'>+                                        6,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_72_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_73_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 5, 0}, {EC_GF_OP_XOR2, 2, 1, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 7, 3, 0}, {EC_GF_OP_XOR2, 1, 7, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 4, 0}, {EC_GF_OP_XOR2, 6, 2, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 2, 0, 0}, {EC_GF_OP_XOR2, 3, 6, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 1, 0}, {EC_GF_OP_XOR2, 6, 0, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 5, 0, 0}, {EC_GF_OP_XOR2, 4, 6, 0},</div><div class='add'>+    {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_73 = {8,</div><div class='add'>+                                    {</div><div class='add'>+                                        6,</div><div class='add'>+                                        0,</div><div class='add'>+                                        1,</div><div class='add'>+                                        7,</div><div class='add'>+                                        4,</div><div class='add'>+                                        5,</div><div class='add'>+                                        2,</div><div class='add'>+                                        3,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_73_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_74_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 2, 0}, {EC_GF_OP_XOR2, 2, 5, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 5, 0, 0}, {EC_GF_OP_XOR2, 5, 1, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 3, 0}, {EC_GF_OP_XOR2, 0, 7, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 6, 5, 0}, {EC_GF_OP_XOR2, 7, 1, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 6, 0}, {EC_GF_OP_XOR2, 3, 4, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 6, 2, 0}, {EC_GF_OP_XOR2, 4, 0, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 2, 3, 0}, {EC_GF_OP_XOR2, 0, 6, 0},</div><div class='add'>+    {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_74 = {8,</div><div class='add'>+                                    {</div><div class='add'>+                                        3,</div><div class='add'>+                                        2,</div><div class='add'>+                                        1,</div><div class='add'>+                                        0,</div><div class='add'>+                                        4,</div><div class='add'>+                                        5,</div><div class='add'>+                                        6,</div><div class='add'>+                                        7,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_74_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_75_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 2, 0, 0}, {EC_GF_OP_XOR2, 3, 2, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 2, 1, 0}, {EC_GF_OP_XOR2, 1, 0, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 4, 3, 0}, {EC_GF_OP_XOR2, 3, 1, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 7, 0}, {EC_GF_OP_XOR2, 6, 3, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 5, 2, 0}, {EC_GF_OP_XOR2, 7, 6, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 6, 5, 0}, {EC_GF_OP_XOR2, 5, 4, 0},</div><div class='add'>+    {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_75 = {8,</div><div class='add'>+                                    {</div><div class='add'>+                                        4,</div><div class='add'>+                                        5,</div><div class='add'>+                                        6,</div><div class='add'>+                                        7,</div><div class='add'>+                                        0,</div><div class='add'>+                                        1,</div><div class='add'>+                                        2,</div><div class='add'>+                                        3,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_75_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_76_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 7, 3, 0}, {EC_GF_OP_XOR2, 6, 1, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 2, 7, 0}, {EC_GF_OP_XOR3, 8, 6, 2},</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 5, 0}, {EC_GF_OP_XOR2, 2, 4, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 4, 0, 0}, {EC_GF_OP_XOR2, 0, 8, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 4, 0}, {EC_GF_OP_XOR2, 1, 4, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 7, 0, 0}, {EC_GF_OP_XOR2, 5, 3, 0},</div><div class='add'>+    {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_76 = {9,</div><div class='add'>+                                    {</div><div class='add'>+                                        2,</div><div class='add'>+                                        3,</div><div class='add'>+                                        0,</div><div class='add'>+                                        6,</div><div class='add'>+                                        5,</div><div class='add'>+                                        1,</div><div class='add'>+                                        7,</div><div class='add'>+                                        8,</div><div class='add'>+                                        4,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_76_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_77_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 7, 6, 0}, {EC_GF_OP_XOR2, 6, 1, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 0, 0}, {EC_GF_OP_XOR2, 5, 1, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 6, 3, 0}, {EC_GF_OP_XOR2, 0, 3, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 4, 0}, {EC_GF_OP_XOR2, 3, 5, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 4, 3, 0}, {EC_GF_OP_XOR2, 5, 2, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 7, 0}, {EC_GF_OP_XOR2, 2, 6, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 7, 1, 0}, {EC_GF_OP_XOR2, 7, 2, 0},</div><div class='add'>+    {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_77 = {8,</div><div class='add'>+                                    {</div><div class='add'>+                                        7,</div><div class='add'>+                                        4,</div><div class='add'>+                                        3,</div><div class='add'>+                                        6,</div><div class='add'>+                                        0,</div><div class='add'>+                                        1,</div><div class='add'>+                                        5,</div><div class='add'>+                                        2,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_77_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_78_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 6, 5, 0}, {EC_GF_OP_XOR2, 6, 0, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 0, 0}, {EC_GF_OP_XOR2, 7, 2, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 2, 6, 0}, {EC_GF_OP_XOR2, 0, 3, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 7, 0}, {EC_GF_OP_XOR3, 8, 0, 2},</div><div class='add'>+    {EC_GF_OP_XOR2, 4, 8, 0}, {EC_GF_OP_XOR2, 1, 8, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 7, 4, 0}, {EC_GF_OP_XOR2, 5, 7, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 5, 1, 0}, {EC_GF_OP_XOR2, 0, 5, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 6, 0, 0}, {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_78 = {9,</div><div class='add'>+                                    {</div><div class='add'>+                                        4,</div><div class='add'>+                                        7,</div><div class='add'>+                                        3,</div><div class='add'>+                                        2,</div><div class='add'>+                                        5,</div><div class='add'>+                                        1,</div><div class='add'>+                                        6,</div><div class='add'>+                                        0,</div><div class='add'>+                                        8,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_78_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_79_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 7, 3, 0}, {EC_GF_OP_XOR3, 8, 4, 7},</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 8, 0}, {EC_GF_OP_XOR2, 2, 1, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 6, 8, 0}, {EC_GF_OP_XOR2, 2, 0, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 6, 0}, {EC_GF_OP_XOR2, 3, 2, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 5, 1, 0}, {EC_GF_OP_XOR2, 6, 3, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 5, 0}, {EC_GF_OP_XOR2, 4, 3, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 4, 0}, {EC_GF_OP_XOR2, 0, 1, 0},</div><div class='add'>+    {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_79 = {9,</div><div class='add'>+                                    {</div><div class='add'>+                                        4,</div><div class='add'>+                                        5,</div><div class='add'>+                                        7,</div><div class='add'>+                                        3,</div><div class='add'>+                                        1,</div><div class='add'>+                                        6,</div><div class='add'>+                                        2,</div><div class='add'>+                                        0,</div><div class='add'>+                                        8,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_79_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_7A_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 2, 1, 0}, {EC_GF_OP_XOR2, 3, 2, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 4, 0, 0}, {EC_GF_OP_XOR2, 4, 3, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 5, 4, 0}, {EC_GF_OP_XOR2, 6, 5, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 7, 6, 0}, {EC_GF_OP_XOR2, 0, 7, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 2, 7, 0}, {EC_GF_OP_XOR2, 1, 0, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 4, 0, 0}, {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_7A = {8,</div><div class='add'>+                                    {</div><div class='add'>+                                        1,</div><div class='add'>+                                        2,</div><div class='add'>+                                        3,</div><div class='add'>+                                        4,</div><div class='add'>+                                        5,</div><div class='add'>+                                        6,</div><div class='add'>+                                        7,</div><div class='add'>+                                        0,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_7A_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_7B_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 1, 0}, {EC_GF_OP_XOR3, 8, 5, 3},</div><div class='add'>+    {EC_GF_OP_XOR2, 8, 0, 0}, {EC_GF_OP_COPY, 9, 4, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 8, 2, 0}, {EC_GF_OP_XOR2, 4, 6, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 4, 8, 0}, {EC_GF_OP_XOR2, 7, 4, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 5, 4, 0}, {EC_GF_OP_XOR2, 0, 4, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 2, 7, 0}, {EC_GF_OP_XOR3, 4, 1, 9},</div><div class='add'>+    {EC_GF_OP_XOR2, 6, 7, 0}, {EC_GF_OP_XOR2, 1, 7, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 4, 2, 0}, {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_7B = {10,</div><div class='add'>+                                    {</div><div class='add'>+                                        1,</div><div class='add'>+                                        2,</div><div class='add'>+                                        3,</div><div class='add'>+                                        4,</div><div class='add'>+                                        8,</div><div class='add'>+                                        5,</div><div class='add'>+                                        6,</div><div class='add'>+                                        0,</div><div class='add'>+                                        7,</div><div class='add'>+                                        9,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_7B_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_7C_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 5, 3, 0}, {EC_GF_OP_XOR2, 4, 5, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 2, 4, 0}, {EC_GF_OP_XOR2, 4, 6, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 1, 0}, {EC_GF_OP_XOR2, 0, 4, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 7, 2, 0}, {EC_GF_OP_XOR2, 3, 0, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 7, 3, 0}, {EC_GF_OP_XOR2, 5, 7, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 7, 0}, {EC_GF_OP_XOR2, 6, 5, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 5, 0}, {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_7C = {8,</div><div class='add'>+                                    {</div><div class='add'>+                                        2,</div><div class='add'>+                                        4,</div><div class='add'>+                                        1,</div><div class='add'>+                                        6,</div><div class='add'>+                                        3,</div><div class='add'>+                                        5,</div><div class='add'>+                                        7,</div><div class='add'>+                                        0,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_7C_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_7D_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 2, 1, 0}, {EC_GF_OP_XOR2, 3, 2, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 2, 6, 0}, {EC_GF_OP_XOR2, 1, 0, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 2, 0}, {EC_GF_OP_XOR2, 1, 5, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 7, 0, 0}, {EC_GF_OP_XOR2, 6, 1, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 4, 3, 0}, {EC_GF_OP_XOR2, 3, 7, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 4, 0}, {EC_GF_OP_XOR2, 2, 3, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 1, 0}, {EC_GF_OP_XOR2, 5, 2, 0},</div><div class='add'>+    {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_7D = {8,</div><div class='add'>+                                    {</div><div class='add'>+                                        1,</div><div class='add'>+                                        0,</div><div class='add'>+                                        3,</div><div class='add'>+                                        5,</div><div class='add'>+                                        6,</div><div class='add'>+                                        7,</div><div class='add'>+                                        2,</div><div class='add'>+                                        4,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_7D_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_7E_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 5, 0}, {EC_GF_OP_COPY, 8, 0, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 1, 0}, {EC_GF_OP_XOR2, 6, 3, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 6, 0, 0}, {EC_GF_OP_XOR2, 5, 6, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 6, 4, 0}, {EC_GF_OP_XOR2, 7, 6, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 6, 0}, {EC_GF_OP_XOR3, 6, 2, 7},</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 6, 0}, {EC_GF_OP_XOR2, 2, 5, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 4, 6, 0}, {EC_GF_OP_XOR2, 5, 3, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 6, 8, 0}, {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_7E = {9,</div><div class='add'>+                                    {</div><div class='add'>+                                        5,</div><div class='add'>+                                        1,</div><div class='add'>+                                        2,</div><div class='add'>+                                        0,</div><div class='add'>+                                        7,</div><div class='add'>+                                        3,</div><div class='add'>+                                        4,</div><div class='add'>+                                        6,</div><div class='add'>+                                        8,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_7E_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_7F_ops[] = {</div><div class='add'>+    {EC_GF_OP_COPY, 8, 0, 0}, {EC_GF_OP_XOR2, 0, 1, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 3, 0}, {EC_GF_OP_XOR2, 5, 0, 0},</div><div class='add'>+    {EC_GF_OP_XOR3, 9, 7, 5}, {EC_GF_OP_XOR2, 2, 9, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 2, 0}, {EC_GF_OP_XOR2, 0, 6, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 4, 1, 0}, {EC_GF_OP_XOR2, 6, 9, 0},</div><div class='add'>+    {EC_GF_OP_XOR3, 9, 6, 4}, {EC_GF_OP_XOR2, 7, 9, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 9, 0}, {EC_GF_OP_XOR2, 1, 7, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 7, 8, 0}, {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_7F = {10,</div><div class='add'>+                                    {</div><div class='add'>+                                        4,</div><div class='add'>+                                        1,</div><div class='add'>+                                        0,</div><div class='add'>+                                        5,</div><div class='add'>+                                        6,</div><div class='add'>+                                        7,</div><div class='add'>+                                        2,</div><div class='add'>+                                        3,</div><div class='add'>+                                        8,</div><div class='add'>+                                        9,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_7F_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_80_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 7, 3, 0}, {EC_GF_OP_XOR2, 3, 4, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 2, 0}, {EC_GF_OP_XOR2, 2, 3, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 5, 0}, {EC_GF_OP_XOR2, 5, 1, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 1, 0}, {EC_GF_OP_XOR2, 4, 5, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 7, 0}, {EC_GF_OP_XOR2, 6, 4, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 6, 0}, {EC_GF_OP_XOR2, 6, 2, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 7, 6, 0}, {EC_GF_OP_XOR2, 5, 7, 0},</div><div class='add'>+    {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_80 = {8,</div><div class='add'>+                                    {</div><div class='add'>+                                        7,</div><div class='add'>+                                        5,</div><div class='add'>+                                        6,</div><div class='add'>+                                        4,</div><div class='add'>+                                        1,</div><div class='add'>+                                        2,</div><div class='add'>+                                        3,</div><div class='add'>+                                        0,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_80_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_81_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 5, 0}, {EC_GF_OP_XOR2, 4, 6, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 4, 0}, {EC_GF_OP_XOR2, 2, 3, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 6, 2, 0}, {EC_GF_OP_XOR2, 1, 6, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 7, 1, 0}, {EC_GF_OP_XOR2, 4, 1, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 5, 7, 0}, {EC_GF_OP_XOR2, 0, 5, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 7, 3, 0}, {EC_GF_OP_XOR2, 2, 0, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 4, 0}, {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_81 = {8,</div><div class='add'>+                                    {</div><div class='add'>+                                        2,</div><div class='add'>+                                        7,</div><div class='add'>+                                        4,</div><div class='add'>+                                        1,</div><div class='add'>+                                        5,</div><div class='add'>+                                        6,</div><div class='add'>+                                        3,</div><div class='add'>+                                        0,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_81_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_82_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 7, 6, 0}, {EC_GF_OP_XOR2, 6, 1, 0},</div><div class='add'>+    {EC_GF_OP_COPY, 8, 6, 0}, {EC_GF_OP_XOR2, 6, 5, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 5, 4, 0}, {EC_GF_OP_XOR2, 4, 3, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 2, 0}, {EC_GF_OP_XOR2, 3, 2, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 2, 0, 0}, {EC_GF_OP_XOR2, 2, 7, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 5, 0}, {EC_GF_OP_XOR2, 7, 5, 0},</div><div class='add'>+    {EC_GF_OP_XOR3, 5, 8, 7}, {EC_GF_OP_XOR2, 7, 4, 0},</div><div class='add'>+    {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_82 = {9,</div><div class='add'>+                                    {</div><div class='add'>+                                        6,</div><div class='add'>+                                        2,</div><div class='add'>+                                        7,</div><div class='add'>+                                        5,</div><div class='add'>+                                        1,</div><div class='add'>+                                        3,</div><div class='add'>+                                        4,</div><div class='add'>+                                        0,</div><div class='add'>+                                        8,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_82_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_83_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 1, 0}, {EC_GF_OP_XOR2, 1, 2, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 2, 3, 0}, {EC_GF_OP_XOR2, 0, 3, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 2, 5, 0}, {EC_GF_OP_XOR2, 7, 2, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 5, 0, 0}, {EC_GF_OP_XOR2, 3, 6, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 4, 0}, {EC_GF_OP_XOR2, 6, 7, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 4, 3, 0}, {EC_GF_OP_XOR2, 7, 1, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 5, 0}, {EC_GF_OP_XOR2, 0, 7, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 5, 6, 0}, {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_83 = {8,</div><div class='add'>+                                    {</div><div class='add'>+                                        3,</div><div class='add'>+                                        5,</div><div class='add'>+                                        6,</div><div class='add'>+                                        7,</div><div class='add'>+                                        1,</div><div class='add'>+                                        2,</div><div class='add'>+                                        4,</div><div class='add'>+                                        0,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_83_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_84_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 5, 0}, {EC_GF_OP_XOR2, 7, 5, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 5, 6, 0}, {EC_GF_OP_XOR2, 6, 2, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 4, 6, 0}, {EC_GF_OP_XOR2, 2, 0, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 2, 4, 0}, {EC_GF_OP_XOR2, 4, 7, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 7, 1, 0}, {EC_GF_OP_XOR2, 1, 3, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 1, 0}, {EC_GF_OP_XOR2, 1, 5, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 5, 4, 0}, {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_84 = {8,</div><div class='add'>+                                    {</div><div class='add'>+                                        7,</div><div class='add'>+                                        6,</div><div class='add'>+                                        0,</div><div class='add'>+                                        4,</div><div class='add'>+                                        1,</div><div class='add'>+                                        5,</div><div class='add'>+                                        3,</div><div class='add'>+                                        2,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_84_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_85_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 6, 0}, {EC_GF_OP_XOR2, 7, 5, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 6, 2, 0}, {EC_GF_OP_XOR2, 5, 3, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 2, 7, 0}, {EC_GF_OP_XOR2, 4, 2, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 7, 0, 0}, {EC_GF_OP_XOR2, 3, 4, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 6, 1, 0}, {EC_GF_OP_XOR2, 7, 1, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 6, 0}, {EC_GF_OP_XOR2, 1, 3, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 5, 0}, {EC_GF_OP_XOR2, 2, 1, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 0, 0}, {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_85 = {8,</div><div class='add'>+                                    {</div><div class='add'>+                                        7,</div><div class='add'>+                                        6,</div><div class='add'>+                                        0,</div><div class='add'>+                                        3,</div><div class='add'>+                                        2,</div><div class='add'>+                                        4,</div><div class='add'>+                                        5,</div><div class='add'>+                                        1,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_85_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_86_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 5, 0}, {EC_GF_OP_XOR2, 5, 6, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 6, 0, 0}, {EC_GF_OP_XOR2, 0, 4, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 4, 5, 0}, {EC_GF_OP_XOR2, 5, 7, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 7, 2, 0}, {EC_GF_OP_XOR2, 2, 6, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 6, 3, 0}, {EC_GF_OP_XOR2, 6, 5, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 5, 1, 0}, {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_86 = {8,</div><div class='add'>+                                    {</div><div class='add'>+                                        1,</div><div class='add'>+                                        2,</div><div class='add'>+                                        6,</div><div class='add'>+                                        4,</div><div class='add'>+                                        5,</div><div class='add'>+                                        7,</div><div class='add'>+                                        3,</div><div class='add'>+                                        0,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_86_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_87_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 0, 0}, {EC_GF_OP_COPY, 8, 1, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 8, 6, 0}, {EC_GF_OP_XOR2, 6, 3, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 0, 0}, {EC_GF_OP_XOR2, 0, 4, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 5, 0}, {EC_GF_OP_XOR2, 4, 5, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 7, 0}, {EC_GF_OP_XOR2, 7, 5, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 4, 6, 0}, {EC_GF_OP_XOR3, 5, 8, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 7, 2, 0}, {EC_GF_OP_XOR2, 2, 8, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 7, 0}, {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_87 = {9,</div><div class='add'>+                                    {</div><div class='add'>+                                        1,</div><div class='add'>+                                        2,</div><div class='add'>+                                        3,</div><div class='add'>+                                        4,</div><div class='add'>+                                        5,</div><div class='add'>+                                        7,</div><div class='add'>+                                        6,</div><div class='add'>+                                        0,</div><div class='add'>+                                        8,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_87_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_88_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 5, 6, 0}, {EC_GF_OP_XOR2, 6, 7, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 4, 6, 0}, {EC_GF_OP_XOR2, 6, 1, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 7, 2, 0}, {EC_GF_OP_XOR2, 1, 0, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 2, 3, 0}, {EC_GF_OP_XOR2, 1, 7, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 5, 0}, {EC_GF_OP_XOR2, 2, 5, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 4, 0}, {EC_GF_OP_XOR2, 5, 4, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 4, 3, 0}, {EC_GF_OP_XOR2, 3, 6, 0},</div><div class='add'>+    {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_88 = {8,</div><div class='add'>+                                    {</div><div class='add'>+                                        6,</div><div class='add'>+                                        7,</div><div class='add'>+                                        3,</div><div class='add'>+                                        1,</div><div class='add'>+                                        2,</div><div class='add'>+                                        4,</div><div class='add'>+                                        5,</div><div class='add'>+                                        0,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_88_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_89_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 7, 2, 0}, {EC_GF_OP_XOR2, 5, 1, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 7, 0}, {EC_GF_OP_XOR2, 2, 0, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 5, 0, 0}, {EC_GF_OP_XOR2, 6, 1, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 2, 6, 0}, {EC_GF_OP_XOR3, 8, 5, 2},</div><div class='add'>+    {EC_GF_OP_XOR2, 4, 8, 0}, {EC_GF_OP_XOR2, 6, 3, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 8, 0}, {EC_GF_OP_XOR2, 3, 4, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 7, 3, 0}, {EC_GF_OP_XOR2, 5, 7, 0},</div><div class='add'>+    {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_89 = {9,</div><div class='add'>+                                    {</div><div class='add'>+                                        2,</div><div class='add'>+                                        1,</div><div class='add'>+                                        6,</div><div class='add'>+                                        5,</div><div class='add'>+                                        7,</div><div class='add'>+                                        3,</div><div class='add'>+                                        4,</div><div class='add'>+                                        0,</div><div class='add'>+                                        8,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_89_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_8A_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 2, 0, 0}, {EC_GF_OP_XOR2, 5, 0, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 6, 0}, {EC_GF_OP_XOR2, 3, 6, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 1, 0}, {EC_GF_OP_XOR2, 6, 5, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 2, 7, 0}, {EC_GF_OP_XOR2, 4, 7, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 6, 2, 0}, {EC_GF_OP_XOR2, 7, 3, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 4, 0}, {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_8A = {8,</div><div class='add'>+                                    {</div><div class='add'>+                                        1,</div><div class='add'>+                                        2,</div><div class='add'>+                                        3,</div><div class='add'>+                                        0,</div><div class='add'>+                                        6,</div><div class='add'>+                                        7,</div><div class='add'>+                                        4,</div><div class='add'>+                                        5,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_8A_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_8B_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 0, 0}, {EC_GF_OP_XOR2, 3, 6, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 6, 1, 0}, {EC_GF_OP_XOR2, 1, 7, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 7, 5, 0}, {EC_GF_OP_XOR2, 4, 1, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 5, 2, 0}, {EC_GF_OP_XOR2, 0, 7, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 2, 0}, {EC_GF_OP_XOR2, 7, 3, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 2, 3, 0}, {EC_GF_OP_XOR2, 3, 4, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 4, 6, 0}, {EC_GF_OP_XOR2, 5, 4, 0},</div><div class='add'>+    {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_8B = {8,</div><div class='add'>+                                    {</div><div class='add'>+                                        6,</div><div class='add'>+                                        1,</div><div class='add'>+                                        2,</div><div class='add'>+                                        3,</div><div class='add'>+                                        5,</div><div class='add'>+                                        7,</div><div class='add'>+                                        4,</div><div class='add'>+                                        0,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_8B_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_8C_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 7, 0}, {EC_GF_OP_XOR2, 5, 7, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 7, 4, 0}, {EC_GF_OP_XOR2, 7, 2, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 4, 6, 0}, {EC_GF_OP_XOR2, 7, 0, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 6, 0, 0}, {EC_GF_OP_XOR2, 0, 3, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 5, 0}, {EC_GF_OP_XOR2, 0, 1, 0},</div><div class='add'>+    {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_8C = {8,</div><div class='add'>+                                    {</div><div class='add'>+                                        1,</div><div class='add'>+                                        2,</div><div class='add'>+                                        0,</div><div class='add'>+                                        7,</div><div class='add'>+                                        3,</div><div class='add'>+                                        4,</div><div class='add'>+                                        5,</div><div class='add'>+                                        6,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_8C_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_8D_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 7, 0, 0}, {EC_GF_OP_XOR2, 0, 5, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 5, 4, 0}, {EC_GF_OP_XOR2, 5, 6, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 7, 0}, {EC_GF_OP_XOR2, 6, 7, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 7, 1, 0}, {EC_GF_OP_XOR2, 4, 3, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 2, 0}, {EC_GF_OP_XOR2, 2, 4, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 1, 0}, {EC_GF_OP_XOR2, 4, 0, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 6, 0}, {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_8D = {8,</div><div class='add'>+                                    {</div><div class='add'>+                                        7,</div><div class='add'>+                                        1,</div><div class='add'>+                                        3,</div><div class='add'>+                                        2,</div><div class='add'>+                                        4,</div><div class='add'>+                                        5,</div><div class='add'>+                                        0,</div><div class='add'>+                                        6,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_8D_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_8E_ops[] = {{EC_GF_OP_XOR2, 2, 0, 0},</div><div class='add'>+                                         {EC_GF_OP_XOR2, 3, 0, 0},</div><div class='add'>+                                         {EC_GF_OP_XOR2, 4, 0, 0},</div><div class='add'>+                                         {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_8E = {8,</div><div class='add'>+                                    {</div><div class='add'>+                                        1,</div><div class='add'>+                                        2,</div><div class='add'>+                                        3,</div><div class='add'>+                                        4,</div><div class='add'>+                                        5,</div><div class='add'>+                                        6,</div><div class='add'>+                                        7,</div><div class='add'>+                                        0,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_8E_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_8F_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 0, 0}, {EC_GF_OP_XOR2, 3, 0, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 7, 0}, {EC_GF_OP_XOR2, 7, 6, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 6, 5, 0}, {EC_GF_OP_XOR2, 5, 4, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 4, 3, 0}, {EC_GF_OP_XOR2, 3, 2, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 2, 1, 0}, {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_8F = {8,</div><div class='add'>+                                    {</div><div class='add'>+                                        1,</div><div class='add'>+                                        2,</div><div class='add'>+                                        3,</div><div class='add'>+                                        4,</div><div class='add'>+                                        5,</div><div class='add'>+                                        6,</div><div class='add'>+                                        7,</div><div class='add'>+                                        0,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_8F_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_90_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 2, 1, 0}, {EC_GF_OP_XOR2, 7, 2, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 6, 7, 0}, {EC_GF_OP_XOR2, 5, 1, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 5, 6, 0}, {EC_GF_OP_XOR2, 4, 5, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 4, 0}, {EC_GF_OP_XOR2, 4, 2, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 3, 0}, {EC_GF_OP_XOR2, 6, 3, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 1, 0}, {EC_GF_OP_XOR2, 2, 0, 0},</div><div class='add'>+    {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_90 = {8,</div><div class='add'>+                                    {</div><div class='add'>+                                        4,</div><div class='add'>+                                        5,</div><div class='add'>+                                        6,</div><div class='add'>+                                        7,</div><div class='add'>+                                        0,</div><div class='add'>+                                        1,</div><div class='add'>+                                        3,</div><div class='add'>+                                        2,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_90_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_91_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 3, 0}, {EC_GF_OP_XOR2, 3, 4, 0},</div><div class='add'>+    {EC_GF_OP_COPY, 9, 1, 0}, {EC_GF_OP_COPY, 8, 3, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 5, 0}, {EC_GF_OP_XOR2, 1, 2, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 3, 0}, {EC_GF_OP_XOR2, 7, 1, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 5, 7, 0}, {EC_GF_OP_XOR2, 7, 9, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 6, 5, 0}, {EC_GF_OP_XOR2, 4, 5, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 6, 0}, {EC_GF_OP_XOR2, 0, 3, 0},</div><div class='add'>+    {EC_GF_OP_XOR3, 5, 8, 0}, {EC_GF_OP_XOR2, 2, 5, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 5, 4, 0}, {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_91 = {10,</div><div class='add'>+                                    {</div><div class='add'>+                                        2,</div><div class='add'>+                                        3,</div><div class='add'>+                                        1,</div><div class='add'>+                                        4,</div><div class='add'>+                                        0,</div><div class='add'>+                                        6,</div><div class='add'>+                                        7,</div><div class='add'>+                                        5,</div><div class='add'>+                                        8,</div><div class='add'>+                                        9,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_91_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_92_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 4, 1, 0}, {EC_GF_OP_XOR2, 5, 4, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 6, 5, 0}, {EC_GF_OP_XOR2, 2, 0, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 2, 6, 0}, {EC_GF_OP_XOR2, 3, 1, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 4, 2, 0}, {EC_GF_OP_XOR2, 3, 0, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 7, 4, 0}, {EC_GF_OP_XOR2, 3, 7, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 5, 3, 0}, {EC_GF_OP_XOR2, 4, 5, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 4, 0}, {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_92 = {8,</div><div class='add'>+                                    {</div><div class='add'>+                                        6,</div><div class='add'>+                                        7,</div><div class='add'>+                                        0,</div><div class='add'>+                                        1,</div><div class='add'>+                                        2,</div><div class='add'>+                                        3,</div><div class='add'>+                                        5,</div><div class='add'>+                                        4,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_92_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_93_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 2, 7, 0}, {EC_GF_OP_XOR2, 4, 2, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 3, 0}, {EC_GF_OP_XOR2, 3, 4, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 2, 0}, {EC_GF_OP_XOR2, 5, 3, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 6, 1, 0}, {EC_GF_OP_XOR2, 0, 5, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 2, 6, 0}, {EC_GF_OP_XOR2, 6, 0, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 4, 6, 0}, {EC_GF_OP_XOR2, 7, 4, 0},</div><div class='add'>+    {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_93 = {8,</div><div class='add'>+                                    {</div><div class='add'>+                                        6,</div><div class='add'>+                                        4,</div><div class='add'>+                                        5,</div><div class='add'>+                                        1,</div><div class='add'>+                                        7,</div><div class='add'>+                                        2,</div><div class='add'>+                                        3,</div><div class='add'>+                                        0,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_93_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_94_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 2, 0}, {EC_GF_OP_XOR2, 2, 6, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 7, 2, 0}, {EC_GF_OP_XOR2, 3, 7, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 3, 0}, {EC_GF_OP_XOR2, 3, 5, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 4, 0}, {EC_GF_OP_XOR2, 5, 2, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 4, 0, 0}, {EC_GF_OP_XOR2, 1, 5, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 7, 1, 0}, {EC_GF_OP_XOR2, 0, 7, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 6, 0, 0}, {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_94 = {8,</div><div class='add'>+                                    {</div><div class='add'>+                                        7,</div><div class='add'>+                                        5,</div><div class='add'>+                                        0,</div><div class='add'>+                                        2,</div><div class='add'>+                                        6,</div><div class='add'>+                                        1,</div><div class='add'>+                                        3,</div><div class='add'>+                                        4,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_94_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_95_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 2, 0}, {EC_GF_OP_XOR2, 7, 3, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 6, 0}, {EC_GF_OP_XOR2, 0, 3, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 4, 0, 0}, {EC_GF_OP_XOR2, 2, 4, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 4, 5, 0}, {EC_GF_OP_XOR2, 1, 4, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 5, 7, 0}, {EC_GF_OP_XOR2, 6, 1, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 7, 6, 0}, {EC_GF_OP_XOR2, 6, 2, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 6, 0}, {EC_GF_OP_XOR2, 4, 0, 0},</div><div class='add'>+    {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_95 = {8,</div><div class='add'>+                                    {</div><div class='add'>+                                        7,</div><div class='add'>+                                        6,</div><div class='add'>+                                        1,</div><div class='add'>+                                        3,</div><div class='add'>+                                        0,</div><div class='add'>+                                        4,</div><div class='add'>+                                        5,</div><div class='add'>+                                        2,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_95_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_96_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 5, 1, 0}, {EC_GF_OP_XOR2, 4, 5, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 5, 6, 0}, {EC_GF_OP_XOR2, 6, 7, 0},</div><div class='add'>+    {EC_GF_OP_XOR3, 8, 0, 4}, {EC_GF_OP_XOR2, 3, 6, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 7, 8, 0}, {EC_GF_OP_XOR2, 0, 1, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 8, 3, 0}, {EC_GF_OP_XOR2, 3, 2, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 8, 0}, {EC_GF_OP_XOR2, 2, 5, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 5, 8, 0}, {EC_GF_OP_XOR2, 0, 2, 0},</div><div class='add'>+    {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_96 = {9,</div><div class='add'>+                                    {</div><div class='add'>+                                        4,</div><div class='add'>+                                        0,</div><div class='add'>+                                        1,</div><div class='add'>+                                        6,</div><div class='add'>+                                        7,</div><div class='add'>+                                        2,</div><div class='add'>+                                        3,</div><div class='add'>+                                        5,</div><div class='add'>+                                        8,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_96_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_97_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 5, 0, 0}, {EC_GF_OP_COPY, 8, 2, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 3, 0}, {EC_GF_OP_XOR2, 8, 6, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 5, 1, 0}, {EC_GF_OP_XOR2, 3, 7, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 8, 0}, {EC_GF_OP_XOR2, 7, 5, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 2, 3, 0}, {EC_GF_OP_XOR2, 6, 3, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 4, 0}, {EC_GF_OP_XOR2, 3, 1, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 4, 5, 0}, {EC_GF_OP_XOR2, 5, 8, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 4, 0}, {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_97 = {9,</div><div class='add'>+                                    {</div><div class='add'>+                                        4,</div><div class='add'>+                                        5,</div><div class='add'>+                                        3,</div><div class='add'>+                                        6,</div><div class='add'>+                                        7,</div><div class='add'>+                                        1,</div><div class='add'>+                                        2,</div><div class='add'>+                                        0,</div><div class='add'>+                                        8,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_97_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_98_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 5, 7, 0}, {EC_GF_OP_XOR2, 4, 1, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 2, 5, 0}, {EC_GF_OP_XOR2, 4, 7, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 2, 0}, {EC_GF_OP_XOR2, 3, 4, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 1, 0}, {EC_GF_OP_XOR2, 4, 6, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 5, 3, 0}, {EC_GF_OP_XOR2, 6, 0, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 4, 0}, {EC_GF_OP_XOR2, 0, 5, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 7, 0, 0}, {EC_GF_OP_XOR2, 0, 1, 0},</div><div class='add'>+    {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_98 = {8,</div><div class='add'>+                                    {</div><div class='add'>+                                        4,</div><div class='add'>+                                        2,</div><div class='add'>+                                        3,</div><div class='add'>+                                        6,</div><div class='add'>+                                        7,</div><div class='add'>+                                        5,</div><div class='add'>+                                        1,</div><div class='add'>+                                        0,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_98_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_99_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 2, 0}, {EC_GF_OP_XOR2, 7, 1, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 3, 0}, {EC_GF_OP_XOR2, 7, 2, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 4, 0}, {EC_GF_OP_XOR2, 2, 5, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 3, 0}, {EC_GF_OP_XOR2, 5, 7, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 4, 2, 0}, {EC_GF_OP_XOR2, 3, 7, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 6, 0, 0}, {EC_GF_OP_XOR2, 2, 6, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 6, 3, 0}, {EC_GF_OP_XOR2, 7, 2, 0},</div><div class='add'>+    {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_99 = {8,</div><div class='add'>+                                    {</div><div class='add'>+                                        6,</div><div class='add'>+                                        5,</div><div class='add'>+                                        3,</div><div class='add'>+                                        7,</div><div class='add'>+                                        0,</div><div class='add'>+                                        1,</div><div class='add'>+                                        4,</div><div class='add'>+                                        2,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_99_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_9A_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 5, 4, 0}, {EC_GF_OP_XOR2, 6, 4, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 4, 3, 0}, {EC_GF_OP_XOR2, 3, 2, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 2, 6, 0}, {EC_GF_OP_XOR2, 6, 1, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 0, 0}, {EC_GF_OP_XOR2, 0, 5, 0},</div><div class='add'>+    {EC_GF_OP_XOR3, 8, 4, 0}, {EC_GF_OP_XOR2, 0, 6, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 7, 8, 0}, {EC_GF_OP_XOR2, 1, 8, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 7, 0}, {EC_GF_OP_XOR2, 5, 3, 0},</div><div class='add'>+    {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_9A = {9,</div><div class='add'>+                                    {</div><div class='add'>+                                        6,</div><div class='add'>+                                        3,</div><div class='add'>+                                        4,</div><div class='add'>+                                        0,</div><div class='add'>+                                        5,</div><div class='add'>+                                        1,</div><div class='add'>+                                        2,</div><div class='add'>+                                        7,</div><div class='add'>+                                        8,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_9A_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_9B_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 6, 0, 0}, {EC_GF_OP_XOR2, 7, 2, 0},</div><div class='add'>+    {EC_GF_OP_COPY, 9, 5, 0}, {EC_GF_OP_XOR2, 7, 0, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 2, 4, 0}, {EC_GF_OP_XOR2, 6, 1, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 5, 1, 0}, {EC_GF_OP_XOR2, 4, 6, 0},</div><div class='add'>+    {EC_GF_OP_XOR3, 8, 3, 2}, {EC_GF_OP_XOR2, 1, 3, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 5, 7, 0}, {EC_GF_OP_XOR2, 3, 9, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 3, 0}, {EC_GF_OP_XOR2, 6, 3, 0},</div><div class='add'>+    {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_9B = {10,</div><div class='add'>+                                    {</div><div class='add'>+                                        4,</div><div class='add'>+                                        5,</div><div class='add'>+                                        8,</div><div class='add'>+                                        6,</div><div class='add'>+                                        7,</div><div class='add'>+                                        1,</div><div class='add'>+                                        2,</div><div class='add'>+                                        0,</div><div class='add'>+                                        3,</div><div class='add'>+                                        9,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_9B_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_9C_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 0, 0}, {EC_GF_OP_XOR2, 3, 6, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 7, 3, 0}, {EC_GF_OP_XOR2, 4, 7, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 4, 0}, {EC_GF_OP_XOR2, 3, 1, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 2, 5, 0}, {EC_GF_OP_XOR2, 5, 3, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 6, 2, 0}, {EC_GF_OP_XOR2, 0, 2, 0},</div><div class='add'>+    {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_9C = {8,</div><div class='add'>+                                    {</div><div class='add'>+                                        3,</div><div class='add'>+                                        2,</div><div class='add'>+                                        1,</div><div class='add'>+                                        0,</div><div class='add'>+                                        4,</div><div class='add'>+                                        5,</div><div class='add'>+                                        6,</div><div class='add'>+                                        7,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_9C_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_9D_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 0, 0}, {EC_GF_OP_XOR2, 4, 1, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 6, 3, 0}, {EC_GF_OP_XOR2, 5, 2, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 2, 6, 0}, {EC_GF_OP_XOR2, 4, 7, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 5, 0}, {EC_GF_OP_XOR2, 3, 5, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 7, 6, 0}, {EC_GF_OP_XOR2, 0, 4, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 2, 4, 0}, {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_9D = {8,</div><div class='add'>+                                    {</div><div class='add'>+                                        0,</div><div class='add'>+                                        1,</div><div class='add'>+                                        2,</div><div class='add'>+                                        3,</div><div class='add'>+                                        7,</div><div class='add'>+                                        4,</div><div class='add'>+                                        5,</div><div class='add'>+                                        6,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_9D_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_9E_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 7, 0, 0}, {EC_GF_OP_COPY, 8, 7, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 8, 5, 0}, {EC_GF_OP_XOR2, 5, 2, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 2, 6, 0}, {EC_GF_OP_XOR2, 5, 0, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 6, 4, 0}, {EC_GF_OP_XOR2, 6, 0, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 7, 3, 0}, {EC_GF_OP_XOR2, 0, 1, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 4, 1, 0}, {EC_GF_OP_XOR2, 3, 6, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 8, 0}, {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_9E = {9,</div><div class='add'>+                                    {</div><div class='add'>+                                        4,</div><div class='add'>+                                        5,</div><div class='add'>+                                        3,</div><div class='add'>+                                        8,</div><div class='add'>+                                        6,</div><div class='add'>+                                        0,</div><div class='add'>+                                        2,</div><div class='add'>+                                        7,</div><div class='add'>+                                        1,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_9E_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_9F_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR3, 8, 1, 2}, {EC_GF_OP_XOR2, 8, 3, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 0, 0}, {EC_GF_OP_XOR2, 4, 0, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 4, 1, 0}, {EC_GF_OP_XOR2, 5, 3, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 6, 0}, {EC_GF_OP_XOR2, 1, 7, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 6, 4, 0}, {EC_GF_OP_XOR2, 7, 5, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 6, 8, 0}, {EC_GF_OP_XOR2, 5, 8, 0},</div><div class='add'>+    {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_9F = {9,</div><div class='add'>+                                    {</div><div class='add'>+                                        4,</div><div class='add'>+                                        5,</div><div class='add'>+                                        6,</div><div class='add'>+                                        7,</div><div class='add'>+                                        0,</div><div class='add'>+                                        1,</div><div class='add'>+                                        2,</div><div class='add'>+                                        3,</div><div class='add'>+                                        8,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_9F_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_A0_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 6, 1, 0}, {EC_GF_OP_XOR2, 5, 6, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 6, 7, 0}, {EC_GF_OP_XOR2, 0, 1, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 4, 6, 0}, {EC_GF_OP_XOR2, 1, 2, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 4, 0}, {EC_GF_OP_XOR2, 4, 3, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 5, 0}, {EC_GF_OP_XOR2, 2, 3, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 5, 1, 0}, {EC_GF_OP_XOR2, 7, 2, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 2, 0, 0}, {EC_GF_OP_XOR2, 0, 5, 0},</div><div class='add'>+    {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_A0 = {8,</div><div class='add'>+                                    {</div><div class='add'>+                                        3,</div><div class='add'>+                                        1,</div><div class='add'>+                                        6,</div><div class='add'>+                                        7,</div><div class='add'>+                                        5,</div><div class='add'>+                                        2,</div><div class='add'>+                                        4,</div><div class='add'>+                                        0,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_A0_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_A1_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 2, 6, 0}, {EC_GF_OP_XOR2, 1, 7, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 2, 0}, {EC_GF_OP_XOR2, 5, 1, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 3, 0}, {EC_GF_OP_XOR2, 6, 5, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 4, 1, 0}, {EC_GF_OP_XOR2, 0, 2, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 4, 0}, {EC_GF_OP_XOR3, 8, 0, 6},</div><div class='add'>+    {EC_GF_OP_XOR2, 2, 3, 0}, {EC_GF_OP_XOR2, 7, 8, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 8, 0}, {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_A1 = {9,</div><div class='add'>+                                    {</div><div class='add'>+                                        7,</div><div class='add'>+                                        4,</div><div class='add'>+                                        1,</div><div class='add'>+                                        5,</div><div class='add'>+                                        6,</div><div class='add'>+                                        0,</div><div class='add'>+                                        2,</div><div class='add'>+                                        3,</div><div class='add'>+                                        8,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_A1_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_A2_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 2, 1, 0}, {EC_GF_OP_XOR2, 2, 4, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 5, 0}, {EC_GF_OP_XOR2, 1, 6, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 2, 3, 0}, {EC_GF_OP_XOR2, 3, 1, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 2, 0}, {EC_GF_OP_XOR2, 7, 3, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 0, 0}, {EC_GF_OP_XOR2, 0, 7, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 4, 7, 0}, {EC_GF_OP_XOR2, 5, 0, 0},</div><div class='add'>+    {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_A2 = {8,</div><div class='add'>+                                    {</div><div class='add'>+                                        7,</div><div class='add'>+                                        0,</div><div class='add'>+                                        6,</div><div class='add'>+                                        3,</div><div class='add'>+                                        2,</div><div class='add'>+                                        1,</div><div class='add'>+                                        4,</div><div class='add'>+                                        5,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_A2_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_A3_ops[] = {</div><div class='add'>+    {EC_GF_OP_COPY, 8, 2, 0}, {EC_GF_OP_XOR2, 2, 6, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 2, 0}, {EC_GF_OP_XOR2, 4, 0, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 5, 0}, {EC_GF_OP_XOR2, 5, 4, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 6, 1, 0}, {EC_GF_OP_XOR2, 4, 3, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 7, 1, 0}, {EC_GF_OP_XOR2, 3, 8, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 7, 0}, {EC_GF_OP_XOR2, 1, 3, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 7, 5, 0}, {EC_GF_OP_XOR2, 3, 0, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 4, 0}, {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_A3 = {9,</div><div class='add'>+                                    {</div><div class='add'>+                                        3,</div><div class='add'>+                                        7,</div><div class='add'>+                                        2,</div><div class='add'>+                                        6,</div><div class='add'>+                                        1,</div><div class='add'>+                                        4,</div><div class='add'>+                                        0,</div><div class='add'>+                                        5,</div><div class='add'>+                                        8,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_A3_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_A4_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 1, 0}, {EC_GF_OP_XOR2, 4, 2, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 5, 3, 0}, {EC_GF_OP_XOR2, 7, 0, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 2, 5, 0}, {EC_GF_OP_XOR2, 6, 4, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 5, 1, 0}, {EC_GF_OP_XOR2, 4, 7, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 6, 0}, {EC_GF_OP_XOR2, 1, 4, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 1, 0}, {EC_GF_OP_XOR2, 0, 3, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 2, 0}, {EC_GF_OP_XOR2, 4, 3, 0},</div><div class='add'>+    {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_A4 = {8,</div><div class='add'>+                                    {</div><div class='add'>+                                        5,</div><div class='add'>+                                        6,</div><div class='add'>+                                        7,</div><div class='add'>+                                        2,</div><div class='add'>+                                        4,</div><div class='add'>+                                        3,</div><div class='add'>+                                        0,</div><div class='add'>+                                        1,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_A4_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_A5_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 7, 1, 0}, {EC_GF_OP_XOR2, 1, 5, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 7, 0, 0}, {EC_GF_OP_XOR2, 3, 0, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 6, 1, 0}, {EC_GF_OP_XOR2, 5, 2, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 2, 0}, {EC_GF_OP_XOR2, 1, 3, 0},</div><div class='add'>+    {EC_GF_OP_XOR3, 8, 5, 6}, {EC_GF_OP_XOR2, 2, 7, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 4, 0}, {EC_GF_OP_XOR2, 3, 7, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 4, 8, 0}, {EC_GF_OP_XOR2, 7, 8, 0},</div><div class='add'>+    {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_A5 = {9,</div><div class='add'>+                                    {</div><div class='add'>+                                        1,</div><div class='add'>+                                        4,</div><div class='add'>+                                        2,</div><div class='add'>+                                        5,</div><div class='add'>+                                        6,</div><div class='add'>+                                        7,</div><div class='add'>+                                        3,</div><div class='add'>+                                        0,</div><div class='add'>+                                        8,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_A5_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_A6_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 2, 0, 0}, {EC_GF_OP_XOR2, 4, 6, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 5, 0}, {EC_GF_OP_XOR2, 2, 4, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 7, 0}, {EC_GF_OP_XOR2, 7, 2, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 3, 0}, {EC_GF_OP_XOR2, 5, 7, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 6, 1, 0}, {EC_GF_OP_XOR2, 4, 1, 0},</div><div class='add'>+    {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_A6 = {8,</div><div class='add'>+                                    {</div><div class='add'>+                                        1,</div><div class='add'>+                                        2,</div><div class='add'>+                                        0,</div><div class='add'>+                                        3,</div><div class='add'>+                                        4,</div><div class='add'>+                                        5,</div><div class='add'>+                                        6,</div><div class='add'>+                                        7,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_A6_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_A7_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 2, 0, 0}, {EC_GF_OP_XOR2, 3, 1, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 5, 7, 0}, {EC_GF_OP_XOR2, 4, 2, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 5, 0}, {EC_GF_OP_XOR2, 4, 6, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 3, 0}, {EC_GF_OP_XOR2, 6, 3, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 4, 0}, {EC_GF_OP_XOR2, 7, 4, 0},</div><div class='add'>+    {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_A7 = {8,</div><div class='add'>+                                    {</div><div class='add'>+                                        0,</div><div class='add'>+                                        1,</div><div class='add'>+                                        2,</div><div class='add'>+                                        5,</div><div class='add'>+                                        6,</div><div class='add'>+                                        7,</div><div class='add'>+                                        3,</div><div class='add'>+                                        4,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_A7_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_A8_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 2, 0}, {EC_GF_OP_XOR2, 0, 7, 0},</div><div class='add'>+    {EC_GF_OP_COPY, 8, 0, 0}, {EC_GF_OP_XOR2, 8, 1, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 6, 0}, {EC_GF_OP_COPY, 9, 4, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 5, 0}, {EC_GF_OP_XOR2, 4, 1, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 5, 1, 0}, {EC_GF_OP_XOR2, 8, 3, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 3, 0}, {EC_GF_OP_XOR2, 3, 2, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 2, 9, 0}, {EC_GF_OP_XOR2, 3, 0, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 7, 2, 0}, {EC_GF_OP_XOR2, 6, 2, 0},</div><div class='add'>+    {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_A8 = {10,</div><div class='add'>+                                    {</div><div class='add'>+                                        1,</div><div class='add'>+                                        7,</div><div class='add'>+                                        5,</div><div class='add'>+                                        8,</div><div class='add'>+                                        6,</div><div class='add'>+                                        3,</div><div class='add'>+                                        4,</div><div class='add'>+                                        0,</div><div class='add'>+                                        2,</div><div class='add'>+                                        9,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_A8_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_A9_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 4, 1, 0}, {EC_GF_OP_XOR2, 1, 0, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 5, 0, 0}, {EC_GF_OP_XOR2, 0, 3, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 7, 0}, {EC_GF_OP_XOR2, 5, 2, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 7, 2, 0}, {EC_GF_OP_XOR2, 2, 6, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 6, 1, 0}, {EC_GF_OP_XOR2, 1, 7, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 6, 0}, {EC_GF_OP_XOR2, 7, 4, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 6, 5, 0}, {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_A9 = {8,</div><div class='add'>+                                    {</div><div class='add'>+                                        3,</div><div class='add'>+                                        7,</div><div class='add'>+                                        6,</div><div class='add'>+                                        1,</div><div class='add'>+                                        2,</div><div class='add'>+                                        0,</div><div class='add'>+                                        4,</div><div class='add'>+                                        5,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_A9_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_AA_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 5, 6, 0}, {EC_GF_OP_XOR2, 3, 0, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 4, 5, 0}, {EC_GF_OP_XOR2, 6, 3, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 5, 7, 0}, {EC_GF_OP_XOR2, 2, 0, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 7, 6, 0}, {EC_GF_OP_XOR2, 2, 5, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 1, 0}, {EC_GF_OP_XOR2, 3, 1, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 7, 0}, {EC_GF_OP_XOR2, 1, 4, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 7, 4, 0}, {EC_GF_OP_XOR2, 4, 2, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 6, 4, 0}, {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_AA = {8,</div><div class='add'>+                                    {</div><div class='add'>+                                        0,</div><div class='add'>+                                        4,</div><div class='add'>+                                        5,</div><div class='add'>+                                        3,</div><div class='add'>+                                        6,</div><div class='add'>+                                        7,</div><div class='add'>+                                        1,</div><div class='add'>+                                        2,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_AA_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_AB_ops[] = {</div><div class='add'>+    {EC_GF_OP_COPY, 8, 0, 0}, {EC_GF_OP_XOR2, 0, 1, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 4, 0}, {EC_GF_OP_XOR2, 1, 5, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 6, 1, 0}, {EC_GF_OP_XOR2, 2, 0, 0},</div><div class='add'>+    {EC_GF_OP_COPY, 9, 6, 0}, {EC_GF_OP_XOR2, 6, 2, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 4, 6, 0}, {EC_GF_OP_XOR2, 7, 4, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 8, 7, 0}, {EC_GF_OP_XOR2, 3, 8, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 5, 3, 0}, {EC_GF_OP_XOR2, 6, 3, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 2, 5, 0}, {EC_GF_OP_XOR3, 3, 9, 7},</div><div class='add'>+    {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_AB = {10,</div><div class='add'>+                                    {</div><div class='add'>+                                        2,</div><div class='add'>+                                        3,</div><div class='add'>+                                        8,</div><div class='add'>+                                        0,</div><div class='add'>+                                        5,</div><div class='add'>+                                        6,</div><div class='add'>+                                        1,</div><div class='add'>+                                        4,</div><div class='add'>+                                        7,</div><div class='add'>+                                        9,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_AB_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_AC_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 5, 0, 0}, {EC_GF_OP_XOR2, 0, 2, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 2, 4, 0}, {EC_GF_OP_XOR2, 4, 7, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 7, 0, 0}, {EC_GF_OP_XOR2, 0, 3, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 6, 0}, {EC_GF_OP_XOR2, 3, 1, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 6, 1, 0}, {EC_GF_OP_XOR2, 1, 5, 0},</div><div class='add'>+    {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_AC = {8,</div><div class='add'>+                                    {</div><div class='add'>+                                        3,</div><div class='add'>+                                        2,</div><div class='add'>+                                        1,</div><div class='add'>+                                        0,</div><div class='add'>+                                        4,</div><div class='add'>+                                        5,</div><div class='add'>+                                        6,</div><div class='add'>+                                        7,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_AC_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_AD_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR3, 8, 1, 2}, {EC_GF_OP_XOR2, 2, 0, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 1, 0}, {EC_GF_OP_XOR2, 5, 0, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 0, 0}, {EC_GF_OP_XOR2, 4, 8, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 5, 8, 0}, {EC_GF_OP_XOR2, 6, 2, 0},</div><div class='add'>+    {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_AD = {9,</div><div class='add'>+                                    {</div><div class='add'>+                                        3,</div><div class='add'>+                                        4,</div><div class='add'>+                                        5,</div><div class='add'>+                                        6,</div><div class='add'>+                                        7,</div><div class='add'>+                                        0,</div><div class='add'>+                                        1,</div><div class='add'>+                                        2,</div><div class='add'>+                                        8,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_AD_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_AE_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 6, 5, 0}, {EC_GF_OP_XOR2, 5, 0, 0},</div><div class='add'>+    {EC_GF_OP_COPY, 8, 5, 0}, {EC_GF_OP_XOR2, 5, 7, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 7, 1, 0}, {EC_GF_OP_XOR2, 0, 2, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 6, 0}, {EC_GF_OP_XOR2, 7, 3, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 6, 5, 0}, {EC_GF_OP_XOR2, 2, 6, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 4, 0}, {EC_GF_OP_XOR2, 6, 3, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 4, 0}, {EC_GF_OP_XOR2, 4, 8, 0},</div><div class='add'>+    {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_AE = {9,</div><div class='add'>+                                    {</div><div class='add'>+                                        7,</div><div class='add'>+                                        0,</div><div class='add'>+                                        5,</div><div class='add'>+                                        6,</div><div class='add'>+                                        3,</div><div class='add'>+                                        4,</div><div class='add'>+                                        1,</div><div class='add'>+                                        2,</div><div class='add'>+                                        8,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_AE_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_AF_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 4, 0, 0}, {EC_GF_OP_XOR2, 6, 0, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 1, 0}, {EC_GF_OP_XOR2, 0, 7, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 5, 1, 0}, {EC_GF_OP_XOR2, 7, 6, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 2, 0}, {EC_GF_OP_XOR2, 6, 2, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 2, 5, 0}, {EC_GF_OP_XOR2, 1, 4, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 2, 0, 0}, {EC_GF_OP_XOR2, 0, 3, 0},</div><div class='add'>+    {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_AF = {8,</div><div class='add'>+                                    {</div><div class='add'>+                                        0,</div><div class='add'>+                                        1,</div><div class='add'>+                                        2,</div><div class='add'>+                                        7,</div><div class='add'>+                                        3,</div><div class='add'>+                                        4,</div><div class='add'>+                                        5,</div><div class='add'>+                                        6,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_AF_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_B0_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 4, 1, 0}, {EC_GF_OP_XOR2, 3, 6, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 7, 4, 0}, {EC_GF_OP_XOR2, 4, 3, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 2, 4, 0}, {EC_GF_OP_XOR2, 1, 0, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 4, 5, 0}, {EC_GF_OP_XOR2, 6, 2, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 6, 0}, {EC_GF_OP_XOR2, 0, 4, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 5, 1, 0}, {EC_GF_OP_XOR2, 1, 7, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 1, 0}, {EC_GF_OP_XOR2, 3, 1, 0},</div><div class='add'>+    {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_B0 = {8,</div><div class='add'>+                                    {</div><div class='add'>+                                        4,</div><div class='add'>+                                        0,</div><div class='add'>+                                        7,</div><div class='add'>+                                        2,</div><div class='add'>+                                        3,</div><div class='add'>+                                        1,</div><div class='add'>+                                        6,</div><div class='add'>+                                        5,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_B0_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_B1_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 4, 1, 0}, {EC_GF_OP_COPY, 8, 4, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 2, 7, 0}, {EC_GF_OP_XOR2, 4, 2, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 2, 3, 0}, {EC_GF_OP_XOR2, 6, 4, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 0, 0}, {EC_GF_OP_XOR2, 2, 5, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 6, 0}, {EC_GF_OP_XOR2, 7, 6, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 2, 0}, {EC_GF_OP_XOR2, 6, 5, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 7, 0}, {EC_GF_OP_XOR2, 2, 0, 0},</div><div class='add'>+    {EC_GF_OP_XOR3, 5, 8, 1}, {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_B1 = {9,</div><div class='add'>+                                    {</div><div class='add'>+                                        2,</div><div class='add'>+                                        6,</div><div class='add'>+                                        4,</div><div class='add'>+                                        7,</div><div class='add'>+                                        0,</div><div class='add'>+                                        1,</div><div class='add'>+                                        3,</div><div class='add'>+                                        5,</div><div class='add'>+                                        8,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_B1_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_B2_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 3, 0}, {EC_GF_OP_XOR2, 2, 1, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 2, 0}, {EC_GF_OP_XOR2, 6, 0, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 6, 0}, {EC_GF_OP_XOR3, 8, 4, 5},</div><div class='add'>+    {EC_GF_OP_XOR2, 2, 8, 0}, {EC_GF_OP_XOR2, 8, 1, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 7, 8, 0}, {EC_GF_OP_XOR2, 3, 8, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 7, 0}, {EC_GF_OP_XOR2, 5, 0, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 5, 0}, {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_B2 = {9,</div><div class='add'>+                                    {</div><div class='add'>+                                        0,</div><div class='add'>+                                        7,</div><div class='add'>+                                        4,</div><div class='add'>+                                        5,</div><div class='add'>+                                        6,</div><div class='add'>+                                        1,</div><div class='add'>+                                        2,</div><div class='add'>+                                        3,</div><div class='add'>+                                        8,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_B2_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_B3_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 5, 0, 0}, {EC_GF_OP_COPY, 9, 5, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 4, 2, 0}, {EC_GF_OP_XOR3, 8, 6, 4},</div><div class='add'>+    {EC_GF_OP_XOR2, 5, 3, 0}, {EC_GF_OP_XOR2, 8, 5, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 1, 0}, {EC_GF_OP_XOR2, 7, 8, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 8, 0}, {EC_GF_OP_XOR2, 1, 7, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 2, 1, 0}, {EC_GF_OP_XOR2, 6, 1, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 1, 0}, {EC_GF_OP_XOR2, 5, 2, 0},</div><div class='add'>+    {EC_GF_OP_XOR3, 1, 9, 0}, {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_B3 = {10,</div><div class='add'>+                                    {</div><div class='add'>+                                        2,</div><div class='add'>+                                        3,</div><div class='add'>+                                        4,</div><div class='add'>+                                        5,</div><div class='add'>+                                        1,</div><div class='add'>+                                        6,</div><div class='add'>+                                        0,</div><div class='add'>+                                        7,</div><div class='add'>+                                        8,</div><div class='add'>+                                        9,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_B3_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_B4_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 1, 0}, {EC_GF_OP_XOR2, 4, 3, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 0, 0}, {EC_GF_OP_XOR2, 3, 2, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 2, 1, 0}, {EC_GF_OP_XOR2, 5, 4, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 4, 2, 0}, {EC_GF_OP_XOR2, 6, 3, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 7, 4, 0}, {EC_GF_OP_XOR2, 0, 7, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 7, 6, 0}, {EC_GF_OP_XOR2, 6, 5, 0},</div><div class='add'>+    {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_B4 = {8,</div><div class='add'>+                                    {</div><div class='add'>+                                        5,</div><div class='add'>+                                        6,</div><div class='add'>+                                        7,</div><div class='add'>+                                        0,</div><div class='add'>+                                        1,</div><div class='add'>+                                        2,</div><div class='add'>+                                        3,</div><div class='add'>+                                        4,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_B4_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_B5_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 0, 0}, {EC_GF_OP_XOR2, 0, 2, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 3, 0}, {EC_GF_OP_XOR2, 6, 0, 0},</div><div class='add'>+    {EC_GF_OP_COPY, 8, 6, 0}, {EC_GF_OP_XOR2, 6, 1, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 4, 0}, {EC_GF_OP_XOR2, 4, 2, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 5, 1, 0}, {EC_GF_OP_XOR2, 7, 4, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 5, 0}, {EC_GF_OP_XOR2, 0, 7, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 5, 4, 0}, {EC_GF_OP_XOR2, 2, 0, 0},</div><div class='add'>+    {EC_GF_OP_XOR3, 4, 8, 3}, {EC_GF_OP_XOR2, 0, 6, 0},</div><div class='add'>+    {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_B5 = {9,</div><div class='add'>+                                    {</div><div class='add'>+                                        3,</div><div class='add'>+                                        4,</div><div class='add'>+                                        0,</div><div class='add'>+                                        7,</div><div class='add'>+                                        1,</div><div class='add'>+                                        5,</div><div class='add'>+                                        6,</div><div class='add'>+                                        2,</div><div class='add'>+                                        8,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_B5_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_B6_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 7, 1, 0}, {EC_GF_OP_XOR2, 0, 4, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 2, 0}, {EC_GF_OP_XOR2, 4, 3, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 2, 3, 0}, {EC_GF_OP_XOR2, 7, 4, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 5, 0}, {EC_GF_OP_XOR2, 5, 7, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 6, 0, 0}, {EC_GF_OP_XOR2, 7, 0, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 1, 0}, {EC_GF_OP_XOR2, 2, 6, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 3, 0}, {EC_GF_OP_XOR2, 3, 2, 0},</div><div class='add'>+    {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_B6 = {8,</div><div class='add'>+                                    {</div><div class='add'>+                                        5,</div><div class='add'>+                                        3,</div><div class='add'>+                                        6,</div><div class='add'>+                                        4,</div><div class='add'>+                                        7,</div><div class='add'>+                                        0,</div><div class='add'>+                                        1,</div><div class='add'>+                                        2,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_B6_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_B7_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 2, 1, 0}, {EC_GF_OP_XOR2, 0, 4, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 2, 6, 0}, {EC_GF_OP_XOR2, 0, 2, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 0, 0}, {EC_GF_OP_XOR2, 0, 5, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 7, 1, 0}, {EC_GF_OP_XOR2, 3, 7, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 6, 0, 0}, {EC_GF_OP_XOR2, 2, 3, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 5, 2, 0}, {EC_GF_OP_XOR2, 7, 5, 0},</div><div class='add'>+    {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_B7 = {8,</div><div class='add'>+                                    {</div><div class='add'>+                                        5,</div><div class='add'>+                                        0,</div><div class='add'>+                                        1,</div><div class='add'>+                                        4,</div><div class='add'>+                                        2,</div><div class='add'>+                                        6,</div><div class='add'>+                                        7,</div><div class='add'>+                                        3,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_B7_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_B8_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 2, 5, 0}, {EC_GF_OP_XOR2, 7, 2, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 2, 0, 0}, {EC_GF_OP_XOR2, 0, 1, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 6, 3, 0}, {EC_GF_OP_XOR2, 3, 2, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 4, 0}, {EC_GF_OP_XOR2, 0, 6, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 4, 7, 0}, {EC_GF_OP_XOR2, 5, 1, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 6, 1, 0}, {EC_GF_OP_XOR2, 7, 5, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 3, 0}, {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_B8 = {8,</div><div class='add'>+                                    {</div><div class='add'>+                                        6,</div><div class='add'>+                                        4,</div><div class='add'>+                                        5,</div><div class='add'>+                                        1,</div><div class='add'>+                                        2,</div><div class='add'>+                                        0,</div><div class='add'>+                                        7,</div><div class='add'>+                                        3,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_B8_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_B9_ops[] = {</div><div class='add'>+    {EC_GF_OP_COPY, 8, 0, 0}, {EC_GF_OP_XOR2, 0, 1, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 2, 5, 0}, {EC_GF_OP_XOR2, 0, 4, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 2, 0, 0}, {EC_GF_OP_XOR2, 3, 0, 0},</div><div class='add'>+    {EC_GF_OP_XOR3, 0, 8, 2}, {EC_GF_OP_XOR2, 6, 3, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 2, 0}, {EC_GF_OP_XOR2, 7, 0, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 5, 6, 0}, {EC_GF_OP_XOR2, 3, 7, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 4, 5, 0}, {EC_GF_OP_XOR2, 5, 3, 0},</div><div class='add'>+    {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_B9 = {9,</div><div class='add'>+                                    {</div><div class='add'>+                                        6,</div><div class='add'>+                                        7,</div><div class='add'>+                                        0,</div><div class='add'>+                                        2,</div><div class='add'>+                                        1,</div><div class='add'>+                                        4,</div><div class='add'>+                                        5,</div><div class='add'>+                                        3,</div><div class='add'>+                                        8,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_B9_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_BA_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 2, 0, 0}, {EC_GF_OP_XOR2, 5, 7, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 4, 5, 0}, {EC_GF_OP_XOR2, 3, 2, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 2, 4, 0}, {EC_GF_OP_XOR2, 5, 3, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 2, 0}, {EC_GF_OP_XOR2, 6, 5, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 1, 0}, {EC_GF_OP_XOR2, 7, 6, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 0, 0}, {EC_GF_OP_XOR2, 6, 0, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 7, 0}, {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_BA = {8,</div><div class='add'>+                                    {</div><div class='add'>+                                        1,</div><div class='add'>+                                        2,</div><div class='add'>+                                        4,</div><div class='add'>+                                        3,</div><div class='add'>+                                        5,</div><div class='add'>+                                        6,</div><div class='add'>+                                        0,</div><div class='add'>+                                        7,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_BA_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_BB_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 6, 0}, {EC_GF_OP_COPY, 8, 3, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 0, 0}, {EC_GF_OP_XOR2, 3, 1, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 4, 3, 0}, {EC_GF_OP_XOR2, 8, 5, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 7, 4, 0}, {EC_GF_OP_XOR2, 5, 4, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 8, 7, 0}, {EC_GF_OP_XOR2, 2, 8, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 2, 0}, {EC_GF_OP_XOR2, 1, 2, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 6, 0, 0}, {EC_GF_OP_XOR2, 4, 0, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 6, 0}, {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_BB = {9,</div><div class='add'>+                                    {</div><div class='add'>+                                        7,</div><div class='add'>+                                        2,</div><div class='add'>+                                        1,</div><div class='add'>+                                        8,</div><div class='add'>+                                        3,</div><div class='add'>+                                        5,</div><div class='add'>+                                        6,</div><div class='add'>+                                        4,</div><div class='add'>+                                        0,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_BB_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_BC_ops[] = {</div><div class='add'>+    {EC_GF_OP_COPY, 8, 1, 0}, {EC_GF_OP_XOR2, 8, 2, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 6, 0, 0}, {EC_GF_OP_XOR2, 2, 3, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 6, 7, 0}, {EC_GF_OP_XOR2, 0, 2, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 4, 2, 0}, {EC_GF_OP_XOR2, 1, 6, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 7, 8, 0}, {EC_GF_OP_XOR3, 2, 8, 4},</div><div class='add'>+    {EC_GF_OP_XOR2, 5, 6, 0}, {EC_GF_OP_XOR2, 4, 5, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 4, 0}, {EC_GF_OP_XOR2, 6, 3, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 7, 0}, {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_BC = {9,</div><div class='add'>+                                    {</div><div class='add'>+                                        2,</div><div class='add'>+                                        6,</div><div class='add'>+                                        3,</div><div class='add'>+                                        4,</div><div class='add'>+                                        5,</div><div class='add'>+                                        1,</div><div class='add'>+                                        7,</div><div class='add'>+                                        0,</div><div class='add'>+                                        8,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_BC_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_BD_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 0, 0}, {EC_GF_OP_XOR2, 3, 1, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 2, 0}, {EC_GF_OP_XOR2, 7, 1, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 4, 0}, {EC_GF_OP_XOR2, 4, 3, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 5, 1, 0}, {EC_GF_OP_XOR2, 3, 7, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 6, 0}, {EC_GF_OP_XOR2, 0, 5, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 6, 7, 0}, {EC_GF_OP_XOR2, 7, 0, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 2, 7, 0}, {EC_GF_OP_XOR2, 1, 2, 0},</div><div class='add'>+    {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_BD = {8,</div><div class='add'>+                                    {</div><div class='add'>+                                        4,</div><div class='add'>+                                        5,</div><div class='add'>+                                        0,</div><div class='add'>+                                        2,</div><div class='add'>+                                        7,</div><div class='add'>+                                        1,</div><div class='add'>+                                        6,</div><div class='add'>+                                        3,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_BD_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_BE_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 3, 0}, {EC_GF_OP_XOR2, 0, 6, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 5, 0}, {EC_GF_OP_XOR2, 5, 0, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 4, 5, 0}, {EC_GF_OP_XOR2, 3, 4, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 7, 3, 0}, {EC_GF_OP_XOR2, 3, 2, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 7, 0}, {EC_GF_OP_XOR2, 2, 0, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 6, 3, 0}, {EC_GF_OP_XOR2, 0, 1, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 1, 0}, {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_BE = {8,</div><div class='add'>+                                    {</div><div class='add'>+                                        0,</div><div class='add'>+                                        6,</div><div class='add'>+                                        7,</div><div class='add'>+                                        4,</div><div class='add'>+                                        5,</div><div class='add'>+                                        1,</div><div class='add'>+                                        3,</div><div class='add'>+                                        2,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_BE_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_BF_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 7, 1, 0}, {EC_GF_OP_XOR2, 6, 7, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 5, 6, 0}, {EC_GF_OP_XOR2, 4, 5, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 4, 0}, {EC_GF_OP_XOR2, 1, 2, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 7, 0, 0}, {EC_GF_OP_XOR2, 2, 5, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 0, 0}, {EC_GF_OP_XOR2, 6, 1, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 4, 6, 0}, {EC_GF_OP_XOR2, 4, 3, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 7, 0}, {EC_GF_OP_XOR2, 5, 3, 0},</div><div class='add'>+    {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_BF = {8,</div><div class='add'>+                                    {</div><div class='add'>+                                        5,</div><div class='add'>+                                        6,</div><div class='add'>+                                        1,</div><div class='add'>+                                        7,</div><div class='add'>+                                        3,</div><div class='add'>+                                        0,</div><div class='add'>+                                        2,</div><div class='add'>+                                        4,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_BF_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_C0_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 4, 1, 0}, {EC_GF_OP_XOR2, 6, 3, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 7, 4, 0}, {EC_GF_OP_XOR2, 4, 6, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 5, 2, 0}, {EC_GF_OP_XOR2, 2, 6, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 5, 0}, {EC_GF_OP_XOR2, 6, 0, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 5, 0}, {EC_GF_OP_XOR2, 3, 7, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 7, 0}, {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_C0 = {8,</div><div class='add'>+                                    {</div><div class='add'>+                                        1,</div><div class='add'>+                                        2,</div><div class='add'>+                                        3,</div><div class='add'>+                                        4,</div><div class='add'>+                                        7,</div><div class='add'>+                                        5,</div><div class='add'>+                                        6,</div><div class='add'>+                                        0,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_C0_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_C1_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR3, 8, 1, 2}, {EC_GF_OP_XOR2, 8, 3, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 4, 1, 0}, {EC_GF_OP_XOR2, 3, 0, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 4, 0}, {EC_GF_OP_XOR2, 1, 7, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 5, 3, 0}, {EC_GF_OP_XOR2, 7, 0, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 4, 6, 0}, {EC_GF_OP_XOR2, 7, 5, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 6, 8, 0}, {EC_GF_OP_XOR2, 5, 8, 0},</div><div class='add'>+    {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_C1 = {9,</div><div class='add'>+                                    {</div><div class='add'>+                                        5,</div><div class='add'>+                                        6,</div><div class='add'>+                                        7,</div><div class='add'>+                                        4,</div><div class='add'>+                                        1,</div><div class='add'>+                                        2,</div><div class='add'>+                                        3,</div><div class='add'>+                                        0,</div><div class='add'>+                                        8,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_C1_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_C2_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 2, 0}, {EC_GF_OP_XOR2, 1, 3, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 3, 0}, {EC_GF_OP_XOR2, 1, 4, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 6, 0, 0}, {EC_GF_OP_XOR2, 4, 2, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 2, 6, 0}, {EC_GF_OP_XOR2, 4, 5, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 5, 2, 0}, {EC_GF_OP_XOR2, 7, 1, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 4, 0}, {EC_GF_OP_XOR2, 2, 7, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 7, 3, 0}, {EC_GF_OP_XOR2, 0, 2, 0},</div><div class='add'>+    {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_C2 = {8,</div><div class='add'>+                                    {</div><div class='add'>+                                        7,</div><div class='add'>+                                        6,</div><div class='add'>+                                        3,</div><div class='add'>+                                        0,</div><div class='add'>+                                        1,</div><div class='add'>+                                        4,</div><div class='add'>+                                        5,</div><div class='add'>+                                        2,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_C2_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_C3_ops[] = {</div><div class='add'>+    {EC_GF_OP_COPY, 8, 0, 0}, {EC_GF_OP_XOR2, 0, 1, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 2, 0}, {EC_GF_OP_XOR2, 6, 0, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 2, 4, 0}, {EC_GF_OP_XOR2, 7, 0, 0},</div><div class='add'>+    {EC_GF_OP_XOR3, 0, 2, 6}, {EC_GF_OP_XOR2, 6, 3, 0},</div><div class='add'>+    {EC_GF_OP_XOR3, 9, 1, 0}, {EC_GF_OP_XOR2, 1, 3, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 5, 0}, {EC_GF_OP_XOR2, 5, 7, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 4, 3, 0}, {EC_GF_OP_XOR2, 7, 9, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 8, 0}, {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_C3 = {10,</div><div class='add'>+                                    {</div><div class='add'>+                                        5,</div><div class='add'>+                                        6,</div><div class='add'>+                                        4,</div><div class='add'>+                                        7,</div><div class='add'>+                                        1,</div><div class='add'>+                                        2,</div><div class='add'>+                                        3,</div><div class='add'>+                                        0,</div><div class='add'>+                                        8,</div><div class='add'>+                                        9,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_C3_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_C4_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 7, 0}, {EC_GF_OP_XOR2, 2, 3, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 4, 0}, {EC_GF_OP_XOR2, 4, 5, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 5, 2, 0}, {EC_GF_OP_XOR2, 1, 0, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 2, 6, 0}, {EC_GF_OP_XOR2, 1, 4, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 6, 7, 0}, {EC_GF_OP_XOR2, 0, 3, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 7, 1, 0}, {EC_GF_OP_XOR2, 1, 2, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 6, 0, 0}, {EC_GF_OP_XOR2, 0, 1, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 4, 0, 0}, {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_C4 = {8,</div><div class='add'>+                                    {</div><div class='add'>+                                        0,</div><div class='add'>+                                        2,</div><div class='add'>+                                        1,</div><div class='add'>+                                        3,</div><div class='add'>+                                        4,</div><div class='add'>+                                        5,</div><div class='add'>+                                        6,</div><div class='add'>+                                        7,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_C4_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_C5_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 4, 0}, {EC_GF_OP_XOR2, 5, 0, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 6, 1, 0}, {EC_GF_OP_XOR2, 0, 3, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 5, 0}, {EC_GF_OP_XOR2, 6, 2, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 7, 0}, {EC_GF_OP_XOR2, 5, 6, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 7, 4, 0}, {EC_GF_OP_XOR2, 2, 3, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 4, 5, 0}, {EC_GF_OP_XOR2, 3, 6, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 5, 2, 0}, {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_C5 = {8,</div><div class='add'>+                                    {</div><div class='add'>+                                        4,</div><div class='add'>+                                        3,</div><div class='add'>+                                        5,</div><div class='add'>+                                        7,</div><div class='add'>+                                        6,</div><div class='add'>+                                        2,</div><div class='add'>+                                        0,</div><div class='add'>+                                        1,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_C5_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_C6_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 4, 3, 0}, {EC_GF_OP_COPY, 8, 4, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 4, 2, 0}, {EC_GF_OP_XOR3, 9, 5, 4},</div><div class='add'>+    {EC_GF_OP_XOR2, 6, 9, 0}, {EC_GF_OP_XOR2, 0, 6, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 7, 0}, {EC_GF_OP_XOR2, 2, 0, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 7, 9, 0}, {EC_GF_OP_XOR2, 6, 1, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 2, 0}, {EC_GF_OP_XOR2, 5, 6, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 3, 0}, {EC_GF_OP_XOR2, 6, 8, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 7, 0}, {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_C6 = {10,</div><div class='add'>+                                    {</div><div class='add'>+                                        6,</div><div class='add'>+                                        3,</div><div class='add'>+                                        0,</div><div class='add'>+                                        4,</div><div class='add'>+                                        5,</div><div class='add'>+                                        7,</div><div class='add'>+                                        2,</div><div class='add'>+                                        1,</div><div class='add'>+                                        8,</div><div class='add'>+                                        9,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_C6_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_C7_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 5, 0, 0}, {EC_GF_OP_XOR2, 5, 3, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 2, 4, 0}, {EC_GF_OP_XOR2, 4, 5, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 3, 0}, {EC_GF_OP_XOR2, 6, 4, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 7, 2, 0}, {EC_GF_OP_XOR2, 1, 6, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 7, 0}, {EC_GF_OP_XOR2, 7, 1, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 5, 7, 0}, {EC_GF_OP_XOR2, 0, 5, 0},</div><div class='add'>+    {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_C7 = {8,</div><div class='add'>+                                    {</div><div class='add'>+                                        7,</div><div class='add'>+                                        0,</div><div class='add'>+                                        6,</div><div class='add'>+                                        2,</div><div class='add'>+                                        5,</div><div class='add'>+                                        3,</div><div class='add'>+                                        4,</div><div class='add'>+                                        1,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_C7_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_C8_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 6, 5, 0}, {EC_GF_OP_XOR2, 5, 0, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 1, 0}, {EC_GF_OP_XOR2, 0, 7, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 7, 6, 0}, {EC_GF_OP_XOR2, 6, 4, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 4, 3, 0}, {EC_GF_OP_XOR2, 4, 1, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 2, 0}, {EC_GF_OP_XOR2, 1, 2, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 2, 4, 0}, {EC_GF_OP_XOR2, 4, 5, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 5, 7, 0}, {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_C8 = {8,</div><div class='add'>+                                    {</div><div class='add'>+                                        1,</div><div class='add'>+                                        3,</div><div class='add'>+                                        2,</div><div class='add'>+                                        4,</div><div class='add'>+                                        6,</div><div class='add'>+                                        7,</div><div class='add'>+                                        5,</div><div class='add'>+                                        0,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_C8_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_C9_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 0, 0}, {EC_GF_OP_XOR2, 3, 0, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 7, 0}, {EC_GF_OP_XOR2, 7, 6, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 4, 1, 0}, {EC_GF_OP_XOR2, 6, 5, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 5, 4, 0}, {EC_GF_OP_XOR2, 2, 1, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 4, 3, 0}, {EC_GF_OP_XOR2, 3, 2, 0},</div><div class='add'>+    {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_C9 = {8,</div><div class='add'>+                                    {</div><div class='add'>+                                        2,</div><div class='add'>+                                        3,</div><div class='add'>+                                        4,</div><div class='add'>+                                        5,</div><div class='add'>+                                        6,</div><div class='add'>+                                        7,</div><div class='add'>+                                        0,</div><div class='add'>+                                        1,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_C9_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_CA_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 6, 7, 0}, {EC_GF_OP_XOR2, 7, 2, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 5, 6, 0}, {EC_GF_OP_XOR2, 2, 0, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 4, 5, 0}, {EC_GF_OP_XOR2, 2, 3, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 6, 1, 0}, {EC_GF_OP_XOR2, 3, 4, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 7, 0}, {EC_GF_OP_XOR2, 6, 0, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 7, 3, 0}, {EC_GF_OP_XOR2, 0, 5, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 5, 7, 0}, {EC_GF_OP_XOR2, 7, 6, 0},</div><div class='add'>+    {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_CA = {8,</div><div class='add'>+                                    {</div><div class='add'>+                                        1,</div><div class='add'>+                                        2,</div><div class='add'>+                                        5,</div><div class='add'>+                                        7,</div><div class='add'>+                                        3,</div><div class='add'>+                                        4,</div><div class='add'>+                                        0,</div><div class='add'>+                                        6,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_CA_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_CB_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 0, 0}, {EC_GF_OP_XOR2, 2, 1, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 6, 0}, {EC_GF_OP_XOR2, 6, 3, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 2, 0}, {EC_GF_OP_XOR2, 2, 7, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 4, 2, 0}, {EC_GF_OP_XOR2, 7, 5, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 5, 4, 0}, {EC_GF_OP_XOR2, 0, 7, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 4, 3, 0}, {EC_GF_OP_XOR2, 7, 6, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 6, 4, 0}, {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_CB = {8,</div><div class='add'>+                                    {</div><div class='add'>+                                        2,</div><div class='add'>+                                        3,</div><div class='add'>+                                        4,</div><div class='add'>+                                        5,</div><div class='add'>+                                        7,</div><div class='add'>+                                        6,</div><div class='add'>+                                        0,</div><div class='add'>+                                        1,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_CB_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_CC_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 7, 2, 0}, {EC_GF_OP_XOR2, 4, 7, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 2, 0}, {EC_GF_OP_XOR2, 7, 3, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 2, 1, 0}, {EC_GF_OP_XOR2, 3, 5, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 7, 0}, {EC_GF_OP_XOR2, 2, 6, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 5, 4, 0}, {EC_GF_OP_XOR2, 6, 3, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 4, 6, 0}, {EC_GF_OP_XOR2, 0, 4, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 0, 0}, {EC_GF_OP_XOR2, 1, 3, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 4, 1, 0}, {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_CC = {8,</div><div class='add'>+                                    {</div><div class='add'>+                                        2,</div><div class='add'>+                                        7,</div><div class='add'>+                                        1,</div><div class='add'>+                                        0,</div><div class='add'>+                                        5,</div><div class='add'>+                                        6,</div><div class='add'>+                                        3,</div><div class='add'>+                                        4,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_CC_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_CD_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 4, 0, 0}, {EC_GF_OP_XOR2, 3, 6, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 1, 0}, {EC_GF_OP_XOR2, 6, 2, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 3, 0}, {EC_GF_OP_XOR2, 2, 5, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 4, 0}, {EC_GF_OP_XOR2, 5, 0, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 4, 7, 0}, {EC_GF_OP_XOR2, 0, 6, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 7, 2, 0}, {EC_GF_OP_XOR2, 6, 4, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 2, 6, 0}, {EC_GF_OP_XOR2, 6, 1, 0},</div><div class='add'>+    {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_CD = {8,</div><div class='add'>+                                    {</div><div class='add'>+                                        0,</div><div class='add'>+                                        6,</div><div class='add'>+                                        1,</div><div class='add'>+                                        2,</div><div class='add'>+                                        7,</div><div class='add'>+                                        3,</div><div class='add'>+                                        4,</div><div class='add'>+                                        5,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_CD_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_CE_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 2, 0}, {EC_GF_OP_XOR2, 3, 5, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 5, 0, 0}, {EC_GF_OP_XOR2, 7, 5, 0},</div><div class='add'>+    {EC_GF_OP_COPY, 8, 7, 0}, {EC_GF_OP_XOR2, 7, 3, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 4, 0}, {EC_GF_OP_XOR2, 6, 3, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 2, 3, 0}, {EC_GF_OP_XOR3, 3, 6, 8},</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 6, 0}, {EC_GF_OP_XOR3, 8, 2, 3},</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 8, 0}, {EC_GF_OP_XOR2, 4, 8, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 5, 1, 0}, {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_CE = {9,</div><div class='add'>+                                    {</div><div class='add'>+                                        5,</div><div class='add'>+                                        7,</div><div class='add'>+                                        3,</div><div class='add'>+                                        0,</div><div class='add'>+                                        2,</div><div class='add'>+                                        6,</div><div class='add'>+                                        4,</div><div class='add'>+                                        1,</div><div class='add'>+                                        8,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_CE_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_CF_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 2, 0}, {EC_GF_OP_XOR2, 5, 3, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 6, 0}, {EC_GF_OP_XOR2, 2, 5, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 4, 0}, {EC_GF_OP_XOR2, 4, 3, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 4, 0}, {EC_GF_OP_XOR2, 7, 0, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 2, 0}, {EC_GF_OP_XOR2, 6, 7, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 5, 6, 0}, {EC_GF_OP_XOR2, 6, 1, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 0, 0}, {EC_GF_OP_XOR2, 3, 6, 0},</div><div class='add'>+    {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_CF = {8,</div><div class='add'>+                                    {</div><div class='add'>+                                        3,</div><div class='add'>+                                        6,</div><div class='add'>+                                        7,</div><div class='add'>+                                        0,</div><div class='add'>+                                        2,</div><div class='add'>+                                        4,</div><div class='add'>+                                        5,</div><div class='add'>+                                        1,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_CF_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_D0_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 5, 2, 0}, {EC_GF_OP_XOR2, 0, 3, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 5, 0}, {EC_GF_OP_XOR2, 6, 3, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 4, 1, 0}, {EC_GF_OP_XOR2, 1, 6, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 5, 4, 0}, {EC_GF_OP_XOR2, 7, 1, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 4, 0, 0}, {EC_GF_OP_XOR2, 2, 7, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 2, 0}, {EC_GF_OP_XOR2, 3, 2, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 0, 0}, {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_D0 = {8,</div><div class='add'>+                                    {</div><div class='add'>+                                        5,</div><div class='add'>+                                        6,</div><div class='add'>+                                        7,</div><div class='add'>+                                        2,</div><div class='add'>+                                        0,</div><div class='add'>+                                        3,</div><div class='add'>+                                        1,</div><div class='add'>+                                        4,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_D0_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_D1_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 2, 0}, {EC_GF_OP_XOR2, 0, 4, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 5, 1, 0}, {EC_GF_OP_XOR2, 4, 6, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 6, 5, 0}, {EC_GF_OP_XOR2, 5, 0, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 7, 6, 0}, {EC_GF_OP_XOR2, 6, 3, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 2, 7, 0}, {EC_GF_OP_XOR2, 0, 2, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 2, 0}, {EC_GF_OP_XOR3, 8, 6, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 4, 8, 0}, {EC_GF_OP_XOR2, 1, 8, 0},</div><div class='add'>+    {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_D1 = {9,</div><div class='add'>+                                    {</div><div class='add'>+                                        5,</div><div class='add'>+                                        6,</div><div class='add'>+                                        3,</div><div class='add'>+                                        2,</div><div class='add'>+                                        0,</div><div class='add'>+                                        7,</div><div class='add'>+                                        4,</div><div class='add'>+                                        1,</div><div class='add'>+                                        8,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_D1_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_D2_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 5, 0}, {EC_GF_OP_XOR2, 3, 6, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 2, 3, 0}, {EC_GF_OP_XOR2, 3, 0, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 2, 0}, {EC_GF_OP_XOR2, 3, 1, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 7, 0, 0}, {EC_GF_OP_XOR2, 4, 3, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 2, 0}, {EC_GF_OP_XOR2, 6, 7, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 5, 4, 0}, {EC_GF_OP_XOR2, 4, 6, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 7, 5, 0}, {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_D2 = {8,</div><div class='add'>+                                    {</div><div class='add'>+                                        7,</div><div class='add'>+                                        0,</div><div class='add'>+                                        2,</div><div class='add'>+                                        1,</div><div class='add'>+                                        3,</div><div class='add'>+                                        4,</div><div class='add'>+                                        6,</div><div class='add'>+                                        5,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_D2_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_D3_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 4, 7, 0}, {EC_GF_OP_COPY, 8, 4, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 2, 1, 0}, {EC_GF_OP_XOR2, 4, 2, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 5, 4, 0}, {EC_GF_OP_XOR2, 6, 5, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 8, 6, 0}, {EC_GF_OP_XOR2, 3, 8, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 2, 3, 0}, {EC_GF_OP_XOR2, 3, 0, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 3, 0}, {EC_GF_OP_XOR2, 0, 5, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 7, 1, 0}, {EC_GF_OP_XOR2, 1, 5, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 4, 7, 0}, {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_D3 = {9,</div><div class='add'>+                                    {</div><div class='add'>+                                        0,</div><div class='add'>+                                        3,</div><div class='add'>+                                        2,</div><div class='add'>+                                        8,</div><div class='add'>+                                        4,</div><div class='add'>+                                        6,</div><div class='add'>+                                        7,</div><div class='add'>+                                        1,</div><div class='add'>+                                        5,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_D3_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_D4_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 5, 0}, {EC_GF_OP_COPY, 8, 1, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 2, 0}, {EC_GF_OP_XOR2, 0, 1, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 5, 3, 0}, {EC_GF_OP_XOR2, 6, 1, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 0, 0}, {EC_GF_OP_XOR3, 1, 7, 8},</div><div class='add'>+    {EC_GF_OP_XOR2, 7, 3, 0}, {EC_GF_OP_XOR2, 3, 4, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 4, 6, 0}, {EC_GF_OP_XOR2, 2, 3, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 6, 5, 0}, {EC_GF_OP_XOR2, 3, 1, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 6, 0}, {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_D4 = {9,</div><div class='add'>+                                    {</div><div class='add'>+                                        4,</div><div class='add'>+                                        1,</div><div class='add'>+                                        7,</div><div class='add'>+                                        5,</div><div class='add'>+                                        0,</div><div class='add'>+                                        6,</div><div class='add'>+                                        3,</div><div class='add'>+                                        2,</div><div class='add'>+                                        8,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_D4_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_D5_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 4, 0}, {EC_GF_OP_XOR2, 1, 5, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 0, 0}, {EC_GF_OP_XOR2, 2, 1, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 6, 2, 0}, {EC_GF_OP_XOR2, 0, 6, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 0, 0}, {EC_GF_OP_XOR2, 7, 3, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 7, 0}, {EC_GF_OP_XOR2, 0, 1, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 4, 0, 0}, {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_D5 = {8,</div><div class='add'>+                                    {</div><div class='add'>+                                        6,</div><div class='add'>+                                        7,</div><div class='add'>+                                        4,</div><div class='add'>+                                        5,</div><div class='add'>+                                        2,</div><div class='add'>+                                        3,</div><div class='add'>+                                        1,</div><div class='add'>+                                        0,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_D5_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_D6_ops[] = {</div><div class='add'>+    {EC_GF_OP_COPY, 8, 0, 0}, {EC_GF_OP_XOR2, 0, 2, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 2, 1, 0}, {EC_GF_OP_XOR2, 2, 4, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 2, 6, 0}, {EC_GF_OP_XOR2, 3, 2, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 3, 0}, {EC_GF_OP_XOR2, 5, 0, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 2, 5, 0}, {EC_GF_OP_XOR2, 7, 2, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 7, 0}, {EC_GF_OP_XOR2, 4, 7, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 6, 7, 0}, {EC_GF_OP_XOR2, 0, 7, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 7, 8, 0}, {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_D6 = {9,</div><div class='add'>+                                    {</div><div class='add'>+                                        0,</div><div class='add'>+                                        6,</div><div class='add'>+                                        2,</div><div class='add'>+                                        7,</div><div class='add'>+                                        1,</div><div class='add'>+                                        3,</div><div class='add'>+                                        4,</div><div class='add'>+                                        5,</div><div class='add'>+                                        8,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_D6_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_D7_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 7, 2, 0}, {EC_GF_OP_XOR2, 5, 7, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 7, 0, 0}, {EC_GF_OP_XOR2, 0, 1, 0},</div><div class='add'>+    {EC_GF_OP_XOR3, 8, 3, 5}, {EC_GF_OP_XOR2, 0, 4, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 8, 0}, {EC_GF_OP_XOR2, 6, 0, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 2, 6, 0}, {EC_GF_OP_XOR2, 1, 6, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 4, 6, 0}, {EC_GF_OP_XOR2, 3, 6, 0},</div><div class='add'>+    {EC_GF_OP_XOR3, 6, 7, 8}, {EC_GF_OP_XOR2, 7, 2, 0},</div><div class='add'>+    {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_D7 = {9,</div><div class='add'>+                                    {</div><div class='add'>+                                        3,</div><div class='add'>+                                        4,</div><div class='add'>+                                        6,</div><div class='add'>+                                        5,</div><div class='add'>+                                        0,</div><div class='add'>+                                        7,</div><div class='add'>+                                        1,</div><div class='add'>+                                        2,</div><div class='add'>+                                        8,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_D7_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_D8_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 2, 0}, {EC_GF_OP_XOR2, 4, 1, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 5, 3, 0}, {EC_GF_OP_XOR2, 4, 2, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 1, 0}, {EC_GF_OP_XOR2, 2, 0, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 6, 3, 0}, {EC_GF_OP_XOR2, 3, 2, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 7, 3, 0}, {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_D8 = {8,</div><div class='add'>+                                    {</div><div class='add'>+                                        4,</div><div class='add'>+                                        5,</div><div class='add'>+                                        6,</div><div class='add'>+                                        7,</div><div class='add'>+                                        0,</div><div class='add'>+                                        1,</div><div class='add'>+                                        2,</div><div class='add'>+                                        3,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_D8_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_D9_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 4, 0, 0}, {EC_GF_OP_XOR2, 0, 1, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 5, 1, 0}, {EC_GF_OP_XOR2, 1, 2, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 6, 1, 0}, {EC_GF_OP_XOR2, 7, 0, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 4, 0}, {EC_GF_OP_XOR2, 2, 3, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 6, 0}, {EC_GF_OP_XOR2, 3, 7, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 6, 2, 0}, {EC_GF_OP_XOR2, 2, 5, 0},</div><div class='add'>+    {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_D9 = {8,</div><div class='add'>+                                    {</div><div class='add'>+                                        1,</div><div class='add'>+                                        2,</div><div class='add'>+                                        6,</div><div class='add'>+                                        7,</div><div class='add'>+                                        4,</div><div class='add'>+                                        5,</div><div class='add'>+                                        0,</div><div class='add'>+                                        3,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_D9_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_DA_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 6, 2, 0}, {EC_GF_OP_XOR2, 2, 7, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 7, 3, 0}, {EC_GF_OP_XOR2, 0, 7, 0},</div><div class='add'>+    {EC_GF_OP_XOR3, 8, 2, 0}, {EC_GF_OP_XOR2, 7, 6, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 4, 1, 0}, {EC_GF_OP_XOR2, 1, 8, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 5, 8, 0}, {EC_GF_OP_XOR2, 2, 4, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 6, 1, 0}, {EC_GF_OP_XOR2, 3, 5, 0},</div><div class='add'>+    {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_DA = {9,</div><div class='add'>+                                    {</div><div class='add'>+                                        2,</div><div class='add'>+                                        5,</div><div class='add'>+                                        7,</div><div class='add'>+                                        1,</div><div class='add'>+                                        0,</div><div class='add'>+                                        4,</div><div class='add'>+                                        3,</div><div class='add'>+                                        6,</div><div class='add'>+                                        8,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_DA_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_DB_ops[] = {</div><div class='add'>+    {EC_GF_OP_COPY, 8, 0, 0}, {EC_GF_OP_XOR2, 0, 1, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 2, 0, 0}, {EC_GF_OP_XOR2, 5, 2, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 5, 0}, {EC_GF_OP_XOR2, 8, 4, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 5, 3, 0}, {EC_GF_OP_XOR2, 4, 2, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 7, 0}, {EC_GF_OP_XOR2, 7, 4, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 4, 1, 0}, {EC_GF_OP_XOR2, 1, 6, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 6, 3, 0}, {EC_GF_OP_XOR2, 3, 8, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 6, 0}, {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_DB = {9,</div><div class='add'>+                                    {</div><div class='add'>+                                        7,</div><div class='add'>+                                        5,</div><div class='add'>+                                        6,</div><div class='add'>+                                        2,</div><div class='add'>+                                        3,</div><div class='add'>+                                        4,</div><div class='add'>+                                        1,</div><div class='add'>+                                        0,</div><div class='add'>+                                        8,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_DB_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_DC_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 7, 3, 0}, {EC_GF_OP_XOR2, 3, 0, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 4, 2, 0}, {EC_GF_OP_XOR2, 0, 4, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 1, 0}, {EC_GF_OP_XOR2, 6, 1, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 7, 0}, {EC_GF_OP_XOR2, 4, 6, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 7, 2, 0}, {EC_GF_OP_XOR2, 6, 3, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 2, 3, 0}, {EC_GF_OP_XOR2, 3, 5, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 5, 7, 0}, {EC_GF_OP_XOR2, 7, 6, 0},</div><div class='add'>+    {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_DC = {8,</div><div class='add'>+                                    {</div><div class='add'>+                                        4,</div><div class='add'>+                                        5,</div><div class='add'>+                                        2,</div><div class='add'>+                                        6,</div><div class='add'>+                                        7,</div><div class='add'>+                                        1,</div><div class='add'>+                                        0,</div><div class='add'>+                                        3,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_DC_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_DD_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 1, 0}, {EC_GF_OP_XOR2, 3, 0, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 5, 7, 0}, {EC_GF_OP_XOR2, 5, 3, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 4, 2, 0}, {EC_GF_OP_XOR2, 6, 0, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 5, 0}, {EC_GF_OP_XOR2, 4, 6, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 2, 0, 0}, {EC_GF_OP_XOR2, 1, 4, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 7, 4, 0}, {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_DD = {8,</div><div class='add'>+                                    {</div><div class='add'>+                                        1,</div><div class='add'>+                                        2,</div><div class='add'>+                                        3,</div><div class='add'>+                                        6,</div><div class='add'>+                                        7,</div><div class='add'>+                                        0,</div><div class='add'>+                                        4,</div><div class='add'>+                                        5,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_DD_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_DE_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 2, 0, 0}, {EC_GF_OP_XOR2, 3, 7, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 2, 3, 0}, {EC_GF_OP_XOR2, 6, 2, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 4, 0}, {EC_GF_OP_XOR2, 7, 6, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 5, 2, 0}, {EC_GF_OP_XOR2, 1, 3, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 7, 0}, {EC_GF_OP_XOR2, 4, 5, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 1, 0}, {EC_GF_OP_XOR2, 3, 4, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 4, 0, 0}, {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_DE = {8,</div><div class='add'>+                                    {</div><div class='add'>+                                        0,</div><div class='add'>+                                        5,</div><div class='add'>+                                        2,</div><div class='add'>+                                        6,</div><div class='add'>+                                        7,</div><div class='add'>+                                        1,</div><div class='add'>+                                        3,</div><div class='add'>+                                        4,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_DE_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_DF_ops[] = {</div><div class='add'>+    {EC_GF_OP_COPY, 8, 0, 0}, {EC_GF_OP_XOR2, 0, 2, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 4, 0}, {EC_GF_OP_XOR2, 8, 3, 0},</div><div class='add'>+    {EC_GF_OP_COPY, 9, 0, 0}, {EC_GF_OP_XOR2, 0, 6, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 8, 7, 0}, {EC_GF_OP_XOR2, 3, 0, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 7, 0, 0}, {EC_GF_OP_XOR2, 0, 5, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 4, 7, 0}, {EC_GF_OP_XOR2, 5, 1, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 7, 1, 0}, {EC_GF_OP_XOR2, 5, 8, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 2, 5, 0}, {EC_GF_OP_XOR2, 6, 5, 0},</div><div class='add'>+    {EC_GF_OP_XOR3, 1, 9, 2}, {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_DF = {10,</div><div class='add'>+                                    {</div><div class='add'>+                                        7,</div><div class='add'>+                                        2,</div><div class='add'>+                                        8,</div><div class='add'>+                                        4,</div><div class='add'>+                                        3,</div><div class='add'>+                                        1,</div><div class='add'>+                                        0,</div><div class='add'>+                                        6,</div><div class='add'>+                                        5,</div><div class='add'>+                                        9,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_DF_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_E0_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 4, 2, 0}, {EC_GF_OP_XOR2, 6, 4, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 5, 3, 0}, {EC_GF_OP_XOR2, 3, 6, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 4, 1, 0}, {EC_GF_OP_XOR2, 7, 1, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 5, 7, 0}, {EC_GF_OP_XOR2, 6, 0, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 2, 5, 0}, {EC_GF_OP_XOR2, 0, 5, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 6, 0}, {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_E0 = {8,</div><div class='add'>+                                    {</div><div class='add'>+                                        2,</div><div class='add'>+                                        3,</div><div class='add'>+                                        4,</div><div class='add'>+                                        7,</div><div class='add'>+                                        5,</div><div class='add'>+                                        6,</div><div class='add'>+                                        0,</div><div class='add'>+                                        1,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_E0_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_E1_ops[] = {</div><div class='add'>+    {EC_GF_OP_COPY, 8, 1, 0}, {EC_GF_OP_XOR2, 8, 7, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 8, 0}, {EC_GF_OP_XOR3, 9, 5, 3},</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 9, 0}, {EC_GF_OP_XOR2, 1, 4, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 7, 0, 0}, {EC_GF_OP_XOR2, 6, 0, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 4, 9, 0}, {EC_GF_OP_XOR2, 0, 2, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 2, 4, 0}, {EC_GF_OP_XOR2, 2, 6, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 5, 2, 0}, {EC_GF_OP_XOR2, 2, 8, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 7, 5, 0}, {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_E1 = {10,</div><div class='add'>+                                    {</div><div class='add'>+                                        0,</div><div class='add'>+                                        7,</div><div class='add'>+                                        1,</div><div class='add'>+                                        3,</div><div class='add'>+                                        4,</div><div class='add'>+                                        5,</div><div class='add'>+                                        6,</div><div class='add'>+                                        2,</div><div class='add'>+                                        8,</div><div class='add'>+                                        9,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_E1_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_E2_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 6, 0, 0}, {EC_GF_OP_XOR2, 5, 1, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 6, 2, 0}, {EC_GF_OP_XOR2, 1, 2, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 2, 3, 0}, {EC_GF_OP_XOR2, 0, 1, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 4, 0}, {EC_GF_OP_XOR2, 7, 2, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 4, 0, 0}, {EC_GF_OP_XOR2, 2, 5, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 7, 0}, {EC_GF_OP_XOR2, 7, 3, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 6, 0}, {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_E2 = {8,</div><div class='add'>+                                    {</div><div class='add'>+                                        2,</div><div class='add'>+                                        3,</div><div class='add'>+                                        7,</div><div class='add'>+                                        1,</div><div class='add'>+                                        5,</div><div class='add'>+                                        6,</div><div class='add'>+                                        0,</div><div class='add'>+                                        4,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_E2_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_E3_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 7, 4, 0}, {EC_GF_OP_XOR2, 3, 1, 0},</div><div class='add'>+    {EC_GF_OP_XOR3, 8, 2, 7}, {EC_GF_OP_XOR2, 4, 5, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 2, 3, 0}, {EC_GF_OP_XOR2, 5, 0, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 5, 2, 0}, {EC_GF_OP_XOR2, 0, 1, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 6, 5, 0}, {EC_GF_OP_XOR2, 1, 4, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 8, 0}, {EC_GF_OP_XOR2, 4, 6, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 6, 0}, {EC_GF_OP_XOR3, 6, 8, 4},</div><div class='add'>+    {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_E3 = {9,</div><div class='add'>+                                    {</div><div class='add'>+                                        5,</div><div class='add'>+                                        4,</div><div class='add'>+                                        7,</div><div class='add'>+                                        2,</div><div class='add'>+                                        1,</div><div class='add'>+                                        3,</div><div class='add'>+                                        6,</div><div class='add'>+                                        0,</div><div class='add'>+                                        8,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_E3_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_E4_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 4, 0, 0}, {EC_GF_OP_XOR2, 2, 6, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 2, 4, 0}, {EC_GF_OP_XOR2, 1, 2, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 5, 1, 0}, {EC_GF_OP_XOR2, 4, 5, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 4, 0}, {EC_GF_OP_XOR2, 7, 3, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 2, 7, 0}, {EC_GF_OP_XOR2, 4, 2, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 4, 0}, {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_E4 = {8,</div><div class='add'>+                                    {</div><div class='add'>+                                        7,</div><div class='add'>+                                        0,</div><div class='add'>+                                        1,</div><div class='add'>+                                        6,</div><div class='add'>+                                        3,</div><div class='add'>+                                        4,</div><div class='add'>+                                        2,</div><div class='add'>+                                        5,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_E4_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_E5_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 7, 5, 0}, {EC_GF_OP_XOR2, 5, 0, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 1, 0}, {EC_GF_OP_XOR2, 6, 3, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 6, 0}, {EC_GF_OP_XOR2, 0, 4, 0},</div><div class='add'>+    {EC_GF_OP_COPY, 8, 0, 0}, {EC_GF_OP_XOR2, 0, 7, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 2, 0, 0}, {EC_GF_OP_XOR2, 5, 2, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 2, 0}, {EC_GF_OP_XOR2, 4, 2, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 7, 5, 0}, {EC_GF_OP_XOR2, 2, 3, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 8, 0}, {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_E5 = {9,</div><div class='add'>+                                    {</div><div class='add'>+                                        4,</div><div class='add'>+                                        5,</div><div class='add'>+                                        3,</div><div class='add'>+                                        6,</div><div class='add'>+                                        7,</div><div class='add'>+                                        1,</div><div class='add'>+                                        0,</div><div class='add'>+                                        2,</div><div class='add'>+                                        8,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_E5_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_E6_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 6, 2, 0}, {EC_GF_OP_XOR2, 1, 6, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 6, 7, 0}, {EC_GF_OP_XOR2, 0, 3, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 5, 1, 0}, {EC_GF_OP_XOR2, 0, 6, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 7, 5, 0}, {EC_GF_OP_XOR2, 4, 0, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 5, 3, 0}, {EC_GF_OP_XOR2, 3, 4, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 4, 0}, {EC_GF_OP_XOR2, 2, 3, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 2, 7, 0}, {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_E6 = {8,</div><div class='add'>+                                    {</div><div class='add'>+                                        5,</div><div class='add'>+                                        4,</div><div class='add'>+                                        3,</div><div class='add'>+                                        6,</div><div class='add'>+                                        7,</div><div class='add'>+                                        0,</div><div class='add'>+                                        1,</div><div class='add'>+                                        2,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_E6_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_E7_ops[] = {</div><div class='add'>+    {EC_GF_OP_COPY, 8, 6, 0}, {EC_GF_OP_XOR2, 3, 2, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 6, 7, 0}, {EC_GF_OP_XOR2, 6, 3, 0},</div><div class='add'>+    {EC_GF_OP_XOR3, 9, 0, 6}, {EC_GF_OP_XOR2, 4, 9, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 5, 9, 0}, {EC_GF_OP_XOR2, 3, 4, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 7, 5, 0}, {EC_GF_OP_XOR2, 4, 1, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 2, 4, 0}, {EC_GF_OP_XOR2, 1, 7, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 7, 2, 0}, {EC_GF_OP_XOR2, 0, 7, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 7, 8, 0}, {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_E7 = {10,</div><div class='add'>+                                    {</div><div class='add'>+                                        1,</div><div class='add'>+                                        4,</div><div class='add'>+                                        3,</div><div class='add'>+                                        6,</div><div class='add'>+                                        7,</div><div class='add'>+                                        5,</div><div class='add'>+                                        2,</div><div class='add'>+                                        0,</div><div class='add'>+                                        8,</div><div class='add'>+                                        9,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_E7_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_E8_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 0, 0}, {EC_GF_OP_XOR2, 0, 4, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 4, 2, 0}, {EC_GF_OP_XOR2, 2, 5, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 4, 3, 0}, {EC_GF_OP_XOR2, 5, 1, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 6, 0}, {EC_GF_OP_XOR2, 6, 5, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 7, 0}, {EC_GF_OP_XOR2, 7, 6, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 0, 0}, {EC_GF_OP_XOR2, 6, 2, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 2, 1, 0}, {EC_GF_OP_XOR2, 1, 4, 0},</div><div class='add'>+    {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_E8 = {8,</div><div class='add'>+                                    {</div><div class='add'>+                                        1,</div><div class='add'>+                                        4,</div><div class='add'>+                                        2,</div><div class='add'>+                                        7,</div><div class='add'>+                                        3,</div><div class='add'>+                                        0,</div><div class='add'>+                                        5,</div><div class='add'>+                                        6,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_E8_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_E9_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 0, 0}, {EC_GF_OP_COPY, 8, 1, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 6, 0}, {EC_GF_OP_XOR2, 6, 3, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 4, 6, 0}, {EC_GF_OP_XOR2, 2, 1, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 7, 0}, {EC_GF_OP_XOR2, 0, 4, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 7, 2, 0}, {EC_GF_OP_XOR2, 5, 1, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 2, 0, 0}, {EC_GF_OP_XOR2, 6, 7, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 5, 0}, {EC_GF_OP_XOR2, 0, 3, 0},</div><div class='add'>+    {EC_GF_OP_XOR3, 1, 8, 0}, {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_E9 = {9,</div><div class='add'>+                                    {</div><div class='add'>+                                        6,</div><div class='add'>+                                        2,</div><div class='add'>+                                        0,</div><div class='add'>+                                        3,</div><div class='add'>+                                        4,</div><div class='add'>+                                        1,</div><div class='add'>+                                        5,</div><div class='add'>+                                        7,</div><div class='add'>+                                        8,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_E9_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_EA_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 2, 1, 0}, {EC_GF_OP_XOR2, 3, 2, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 0, 0}, {EC_GF_OP_XOR2, 2, 0, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 7, 0}, {EC_GF_OP_XOR2, 5, 2, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 7, 6, 0}, {EC_GF_OP_XOR2, 4, 1, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 6, 5, 0}, {EC_GF_OP_XOR2, 5, 4, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 4, 3, 0}, {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_EA = {8,</div><div class='add'>+                                    {</div><div class='add'>+                                        3,</div><div class='add'>+                                        4,</div><div class='add'>+                                        5,</div><div class='add'>+                                        6,</div><div class='add'>+                                        7,</div><div class='add'>+                                        0,</div><div class='add'>+                                        1,</div><div class='add'>+                                        2,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_EA_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_EB_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 0, 0}, {EC_GF_OP_XOR2, 2, 1, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 2, 0}, {EC_GF_OP_XOR2, 2, 7, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 7, 5, 0}, {EC_GF_OP_XOR2, 5, 4, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 7, 0}, {EC_GF_OP_XOR2, 1, 6, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 4, 3, 0}, {EC_GF_OP_XOR2, 6, 5, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 7, 6, 0}, {EC_GF_OP_XOR2, 6, 4, 0},</div><div class='add'>+    {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_EB = {8,</div><div class='add'>+                                    {</div><div class='add'>+                                        3,</div><div class='add'>+                                        4,</div><div class='add'>+                                        5,</div><div class='add'>+                                        6,</div><div class='add'>+                                        7,</div><div class='add'>+                                        0,</div><div class='add'>+                                        1,</div><div class='add'>+                                        2,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_EB_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_EC_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 5, 0}, {EC_GF_OP_XOR2, 6, 1, 0},</div><div class='add'>+    {EC_GF_OP_XOR3, 8, 4, 0}, {EC_GF_OP_XOR2, 1, 8, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 7, 3, 0}, {EC_GF_OP_XOR2, 6, 2, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 8, 0}, {EC_GF_OP_XOR2, 2, 7, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 7, 6, 0}, {EC_GF_OP_XOR2, 5, 3, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 4, 2, 0}, {EC_GF_OP_XOR2, 6, 0, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 7, 0}, {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_EC = {9,</div><div class='add'>+                                    {</div><div class='add'>+                                        7,</div><div class='add'>+                                        4,</div><div class='add'>+                                        3,</div><div class='add'>+                                        0,</div><div class='add'>+                                        2,</div><div class='add'>+                                        5,</div><div class='add'>+                                        1,</div><div class='add'>+                                        6,</div><div class='add'>+                                        8,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_EC_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_ED_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 5, 3, 0}, {EC_GF_OP_XOR2, 0, 5, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 2, 4, 0}, {EC_GF_OP_XOR2, 4, 0, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 1, 0}, {EC_GF_OP_XOR2, 6, 4, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 6, 0}, {EC_GF_OP_XOR2, 7, 3, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 2, 7, 0}, {EC_GF_OP_XOR2, 6, 2, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 5, 2, 0}, {EC_GF_OP_XOR2, 1, 6, 0},</div><div class='add'>+    {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_ED = {8,</div><div class='add'>+                                    {</div><div class='add'>+                                        5,</div><div class='add'>+                                        6,</div><div class='add'>+                                        7,</div><div class='add'>+                                        0,</div><div class='add'>+                                        1,</div><div class='add'>+                                        4,</div><div class='add'>+                                        3,</div><div class='add'>+                                        2,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_ED_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_EE_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 5, 3, 0}, {EC_GF_OP_XOR2, 3, 0, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 1, 0}, {EC_GF_OP_XOR3, 8, 2, 3},</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 4, 0}, {EC_GF_OP_XOR2, 4, 8, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 6, 4, 0}, {EC_GF_OP_XOR2, 8, 5, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 4, 7, 0}, {EC_GF_OP_XOR2, 5, 6, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 8, 0}, {EC_GF_OP_XOR2, 7, 8, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 6, 0, 0}, {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_EE = {9,</div><div class='add'>+                                    {</div><div class='add'>+                                        6,</div><div class='add'>+                                        4,</div><div class='add'>+                                        5,</div><div class='add'>+                                        7,</div><div class='add'>+                                        2,</div><div class='add'>+                                        3,</div><div class='add'>+                                        0,</div><div class='add'>+                                        1,</div><div class='add'>+                                        8,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_EE_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_EF_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 5, 1, 0}, {EC_GF_OP_XOR2, 1, 3, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 1, 0}, {EC_GF_OP_COPY, 8, 0, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 8, 2, 0}, {EC_GF_OP_XOR2, 0, 5, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 2, 4, 0}, {EC_GF_OP_XOR2, 7, 8, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 2, 0}, {EC_GF_OP_XOR2, 6, 8, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 4, 7, 0}, {EC_GF_OP_XOR2, 3, 6, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 7, 5, 0}, {EC_GF_OP_XOR2, 5, 3, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 7, 0}, {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_EF = {9,</div><div class='add'>+                                    {</div><div class='add'>+                                        6,</div><div class='add'>+                                        4,</div><div class='add'>+                                        5,</div><div class='add'>+                                        7,</div><div class='add'>+                                        2,</div><div class='add'>+                                        0,</div><div class='add'>+                                        3,</div><div class='add'>+                                        1,</div><div class='add'>+                                        8,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_EF_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_F0_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 6, 1, 0}, {EC_GF_OP_XOR2, 6, 2, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 0, 0}, {EC_GF_OP_XOR3, 8, 3, 6},</div><div class='add'>+    {EC_GF_OP_XOR2, 5, 8, 0}, {EC_GF_OP_XOR2, 8, 4, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 5, 0}, {EC_GF_OP_XOR2, 7, 8, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 1, 0}, {EC_GF_OP_XOR2, 2, 7, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 4, 0, 0}, {EC_GF_OP_XOR2, 1, 8, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 2, 0}, {EC_GF_OP_XOR2, 3, 0, 0},</div><div class='add'>+    {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_F0 = {9,</div><div class='add'>+                                    {</div><div class='add'>+                                        3,</div><div class='add'>+                                        4,</div><div class='add'>+                                        6,</div><div class='add'>+                                        1,</div><div class='add'>+                                        2,</div><div class='add'>+                                        0,</div><div class='add'>+                                        5,</div><div class='add'>+                                        7,</div><div class='add'>+                                        8,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_F0_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_F1_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 1, 0}, {EC_GF_OP_XOR2, 3, 5, 0},</div><div class='add'>+    {EC_GF_OP_COPY, 8, 3, 0}, {EC_GF_OP_XOR2, 3, 4, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 2, 3, 0}, {EC_GF_OP_COPY, 9, 2, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 2, 6, 0}, {EC_GF_OP_XOR2, 9, 0, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 6, 1, 0}, {EC_GF_OP_XOR2, 5, 2, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 7, 9, 0}, {EC_GF_OP_XOR2, 4, 9, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 5, 0}, {EC_GF_OP_XOR3, 9, 8, 7},</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 9, 0}, {EC_GF_OP_XOR2, 5, 9, 0},</div><div class='add'>+    {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_F1 = {10,</div><div class='add'>+                                    {</div><div class='add'>+                                        7,</div><div class='add'>+                                        2,</div><div class='add'>+                                        6,</div><div class='add'>+                                        3,</div><div class='add'>+                                        5,</div><div class='add'>+                                        1,</div><div class='add'>+                                        4,</div><div class='add'>+                                        0,</div><div class='add'>+                                        8,</div><div class='add'>+                                        9,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_F1_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_F2_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 1, 0}, {EC_GF_OP_XOR2, 5, 4, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 5, 0}, {EC_GF_OP_XOR2, 7, 2, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 6, 0}, {EC_GF_OP_XOR2, 6, 7, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 4, 0, 0}, {EC_GF_OP_XOR2, 2, 3, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 7, 1, 0}, {EC_GF_OP_XOR3, 8, 6, 4},</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 2, 0}, {EC_GF_OP_XOR2, 2, 0, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 8, 0}, {EC_GF_OP_XOR2, 5, 8, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 1, 0}, {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_F2 = {9,</div><div class='add'>+                                    {</div><div class='add'>+                                        1,</div><div class='add'>+                                        0,</div><div class='add'>+                                        6,</div><div class='add'>+                                        7,</div><div class='add'>+                                        4,</div><div class='add'>+                                        5,</div><div class='add'>+                                        2,</div><div class='add'>+                                        3,</div><div class='add'>+                                        8,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_F2_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_F3_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 0, 0}, {EC_GF_OP_XOR2, 2, 1, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 2, 0}, {EC_GF_OP_XOR2, 4, 3, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 2, 7, 0}, {EC_GF_OP_XOR2, 0, 7, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 5, 4, 0}, {EC_GF_OP_XOR2, 1, 6, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 7, 6, 0}, {EC_GF_OP_XOR2, 0, 5, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 6, 5, 0}, {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_F3 = {8,</div><div class='add'>+                                    {</div><div class='add'>+                                        5,</div><div class='add'>+                                        6,</div><div class='add'>+                                        7,</div><div class='add'>+                                        0,</div><div class='add'>+                                        1,</div><div class='add'>+                                        2,</div><div class='add'>+                                        3,</div><div class='add'>+                                        4,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_F3_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_F4_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 0, 0}, {EC_GF_OP_XOR2, 2, 1, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 2, 0}, {EC_GF_OP_XOR2, 4, 3, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 5, 4, 0}, {EC_GF_OP_XOR2, 6, 5, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 7, 6, 0}, {EC_GF_OP_XOR2, 0, 7, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 7, 0}, {EC_GF_OP_XOR2, 3, 7, 0},</div><div class='add'>+    {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_F4 = {8,</div><div class='add'>+                                    {</div><div class='add'>+                                        0,</div><div class='add'>+                                        1,</div><div class='add'>+                                        2,</div><div class='add'>+                                        3,</div><div class='add'>+                                        4,</div><div class='add'>+                                        5,</div><div class='add'>+                                        6,</div><div class='add'>+                                        7,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_F4_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_F5_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 0, 0}, {EC_GF_OP_XOR2, 2, 1, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 2, 0}, {EC_GF_OP_XOR2, 4, 3, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 5, 4, 0}, {EC_GF_OP_XOR2, 6, 5, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 7, 6, 0}, {EC_GF_OP_XOR2, 0, 7, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 2, 7, 0}, {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_F5 = {8,</div><div class='add'>+                                    {</div><div class='add'>+                                        7,</div><div class='add'>+                                        0,</div><div class='add'>+                                        1,</div><div class='add'>+                                        2,</div><div class='add'>+                                        3,</div><div class='add'>+                                        4,</div><div class='add'>+                                        5,</div><div class='add'>+                                        6,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_F5_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_F6_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 1, 0}, {EC_GF_OP_COPY, 8, 3, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 5, 0}, {EC_GF_OP_XOR2, 2, 0, 0},</div><div class='add'>+    {EC_GF_OP_COPY, 9, 3, 0}, {EC_GF_OP_XOR2, 3, 2, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 2, 7, 0}, {EC_GF_OP_XOR2, 4, 2, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 9, 4, 0}, {EC_GF_OP_XOR2, 4, 1, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 6, 9, 0}, {EC_GF_OP_XOR2, 7, 6, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 7, 0}, {EC_GF_OP_XOR2, 5, 7, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 6, 1, 0}, {EC_GF_OP_XOR3, 7, 8, 0},</div><div class='add'>+    {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_F6 = {10,</div><div class='add'>+                                    {</div><div class='add'>+                                        0,</div><div class='add'>+                                        6,</div><div class='add'>+                                        2,</div><div class='add'>+                                        7,</div><div class='add'>+                                        4,</div><div class='add'>+                                        3,</div><div class='add'>+                                        5,</div><div class='add'>+                                        9,</div><div class='add'>+                                        1,</div><div class='add'>+                                        8,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_F6_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_F7_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 0, 0}, {EC_GF_OP_XOR2, 2, 1, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 2, 0}, {EC_GF_OP_XOR2, 4, 3, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 5, 4, 0}, {EC_GF_OP_XOR2, 6, 5, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 7, 0}, {EC_GF_OP_XOR2, 2, 7, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 6, 0}, {EC_GF_OP_XOR2, 7, 6, 0},</div><div class='add'>+    {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_F7 = {8,</div><div class='add'>+                                    {</div><div class='add'>+                                        6,</div><div class='add'>+                                        7,</div><div class='add'>+                                        0,</div><div class='add'>+                                        1,</div><div class='add'>+                                        2,</div><div class='add'>+                                        3,</div><div class='add'>+                                        4,</div><div class='add'>+                                        5,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_F7_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_F8_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 4, 0, 0}, {EC_GF_OP_XOR2, 3, 5, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 6, 4, 0}, {EC_GF_OP_XOR2, 2, 0, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 4, 3, 0}, {EC_GF_OP_XOR2, 1, 6, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 2, 4, 0}, {EC_GF_OP_XOR2, 5, 1, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 7, 2, 0}, {EC_GF_OP_XOR2, 7, 5, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 7, 0}, {EC_GF_OP_XOR2, 6, 7, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 3, 0}, {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_F8 = {8,</div><div class='add'>+                                    {</div><div class='add'>+                                        6,</div><div class='add'>+                                        2,</div><div class='add'>+                                        0,</div><div class='add'>+                                        1,</div><div class='add'>+                                        4,</div><div class='add'>+                                        5,</div><div class='add'>+                                        3,</div><div class='add'>+                                        7,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_F8_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_F9_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 5, 0}, {EC_GF_OP_XOR2, 5, 3, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 6, 1, 0}, {EC_GF_OP_XOR2, 0, 5, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 7, 6, 0}, {EC_GF_OP_XOR2, 6, 0, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 2, 6, 0}, {EC_GF_OP_XOR2, 6, 4, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 2, 0}, {EC_GF_OP_XOR2, 3, 6, 0},</div><div class='add'>+    {EC_GF_OP_XOR3, 8, 7, 1}, {EC_GF_OP_XOR2, 1, 3, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 4, 8, 0}, {EC_GF_OP_XOR2, 5, 8, 0},</div><div class='add'>+    {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_F9 = {9,</div><div class='add'>+                                    {</div><div class='add'>+                                        4,</div><div class='add'>+                                        1,</div><div class='add'>+                                        7,</div><div class='add'>+                                        6,</div><div class='add'>+                                        0,</div><div class='add'>+                                        3,</div><div class='add'>+                                        5,</div><div class='add'>+                                        2,</div><div class='add'>+                                        8,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_F9_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_FA_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 0, 0}, {EC_GF_OP_XOR2, 0, 4, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 2, 1, 0}, {EC_GF_OP_XOR2, 0, 7, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 7, 2, 0}, {EC_GF_OP_XOR2, 1, 5, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 7, 0}, {EC_GF_OP_XOR2, 5, 0, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 7, 6, 0}, {EC_GF_OP_XOR2, 0, 3, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 6, 1, 0}, {EC_GF_OP_XOR2, 4, 7, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 0, 0}, {EC_GF_OP_XOR2, 2, 6, 0},</div><div class='add'>+    {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_FA = {8,</div><div class='add'>+                                    {</div><div class='add'>+                                        0,</div><div class='add'>+                                        1,</div><div class='add'>+                                        2,</div><div class='add'>+                                        4,</div><div class='add'>+                                        5,</div><div class='add'>+                                        6,</div><div class='add'>+                                        7,</div><div class='add'>+                                        3,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_FA_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_FB_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 0, 0}, {EC_GF_OP_XOR2, 2, 1, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 5, 0}, {EC_GF_OP_XOR2, 3, 2, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 7, 0}, {EC_GF_OP_XOR2, 2, 7, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 6, 0}, {EC_GF_OP_XOR2, 7, 6, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 4, 3, 0}, {EC_GF_OP_XOR2, 6, 5, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 7, 4, 0}, {EC_GF_OP_XOR2, 5, 4, 0},</div><div class='add'>+    {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_FB = {8,</div><div class='add'>+                                    {</div><div class='add'>+                                        4,</div><div class='add'>+                                        5,</div><div class='add'>+                                        6,</div><div class='add'>+                                        7,</div><div class='add'>+                                        0,</div><div class='add'>+                                        1,</div><div class='add'>+                                        2,</div><div class='add'>+                                        3,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_FB_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_FC_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 7, 0, 0}, {EC_GF_OP_XOR2, 7, 4, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 5, 1, 0}, {EC_GF_OP_COPY, 9, 3, 0},</div><div class='add'>+    {EC_GF_OP_XOR3, 8, 5, 7}, {EC_GF_OP_XOR2, 3, 6, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 8, 3, 0}, {EC_GF_OP_XOR2, 2, 8, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 1, 2, 0}, {EC_GF_OP_XOR2, 4, 2, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 1, 0}, {EC_GF_OP_XOR2, 3, 4, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 5, 0, 0}, {EC_GF_OP_XOR2, 6, 0, 0},</div><div class='add'>+    {EC_GF_OP_XOR3, 0, 9, 2}, {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_FC = {10,</div><div class='add'>+                                    {</div><div class='add'>+                                        5,</div><div class='add'>+                                        6,</div><div class='add'>+                                        3,</div><div class='add'>+                                        7,</div><div class='add'>+                                        1,</div><div class='add'>+                                        8,</div><div class='add'>+                                        0,</div><div class='add'>+                                        4,</div><div class='add'>+                                        2,</div><div class='add'>+                                        9,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_FC_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_FD_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 7, 1, 0}, {EC_GF_OP_COPY, 8, 7, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 5, 0, 0}, {EC_GF_OP_XOR2, 7, 5, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 4, 2, 0}, {EC_GF_OP_XOR2, 4, 7, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 5, 6, 0}, {EC_GF_OP_XOR2, 0, 4, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 0, 0}, {EC_GF_OP_XOR2, 5, 3, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 2, 5, 0}, {EC_GF_OP_XOR2, 1, 2, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 1, 0}, {EC_GF_OP_XOR2, 6, 1, 0},</div><div class='add'>+    {EC_GF_OP_XOR3, 1, 8, 0}, {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_FD = {9,</div><div class='add'>+                                    {</div><div class='add'>+                                        5,</div><div class='add'>+                                        3,</div><div class='add'>+                                        7,</div><div class='add'>+                                        6,</div><div class='add'>+                                        1,</div><div class='add'>+                                        2,</div><div class='add'>+                                        4,</div><div class='add'>+                                        0,</div><div class='add'>+                                        8,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_FD_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_FE_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 2, 0, 0}, {EC_GF_OP_COPY, 8, 2, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 2, 4, 0}, {EC_GF_OP_XOR2, 6, 2, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 8, 5, 0}, {EC_GF_OP_XOR2, 5, 6, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 6, 1, 0}, {EC_GF_OP_XOR2, 0, 6, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 6, 7, 0}, {EC_GF_OP_XOR2, 7, 3, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 7, 8, 0}, {EC_GF_OP_XOR2, 3, 0, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 4, 7, 0}, {EC_GF_OP_XOR2, 1, 7, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 4, 0}, {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_FE = {9,</div><div class='add'>+                                    {</div><div class='add'>+                                        3,</div><div class='add'>+                                        4,</div><div class='add'>+                                        8,</div><div class='add'>+                                        2,</div><div class='add'>+                                        5,</div><div class='add'>+                                        0,</div><div class='add'>+                                        6,</div><div class='add'>+                                        1,</div><div class='add'>+                                        7,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_FE_ops};</div><div class='add'>+</div><div class='add'>+static ec_gf_op_t ec_gf8_mul_FF_ops[] = {</div><div class='add'>+    {EC_GF_OP_XOR2, 4, 7, 0}, {EC_GF_OP_COPY, 9, 0, 0},</div><div class='add'>+    {EC_GF_OP_COPY, 8, 4, 0}, {EC_GF_OP_XOR2, 9, 1, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 4, 2, 0}, {EC_GF_OP_XOR2, 9, 4, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 0, 5, 0}, {EC_GF_OP_XOR2, 2, 0, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 3, 9, 0}, {EC_GF_OP_XOR2, 7, 3, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 2, 6, 0}, {EC_GF_OP_XOR2, 5, 3, 0},</div><div class='add'>+    {EC_GF_OP_XOR2, 6, 7, 0}, {EC_GF_OP_XOR2, 1, 7, 0},</div><div class='add'>+    {EC_GF_OP_XOR3, 3, 8, 5}, {EC_GF_OP_XOR2, 4, 6, 0},</div><div class='add'>+    {EC_GF_OP_END, 0, 0, 0}};</div><div class='add'>+</div><div class='add'>+static ec_gf_mul_t ec_gf8_mul_FF = {10,</div><div class='add'>+                                    {</div><div class='add'>+                                        6,</div><div class='add'>+                                        5,</div><div class='add'>+                                        0,</div><div class='add'>+                                        1,</div><div class='add'>+                                        2,</div><div class='add'>+                                        4,</div><div class='add'>+                                        9,</div><div class='add'>+                                        3,</div><div class='add'>+                                        7,</div><div class='add'>+                                        8,</div><div class='add'>+                                    },</div><div class='add'>+                                    ec_gf8_mul_FF_ops};</div><div class='add'>+</div><div class='add'>+ec_gf_mul_t *ec_gf8_mul[] = {</div><div class='add'>+    &amp;ec_gf8_mul_00, &amp;ec_gf8_mul_01, &amp;ec_gf8_mul_02, &amp;ec_gf8_mul_03,</div><div class='add'>+    &amp;ec_gf8_mul_04, &amp;ec_gf8_mul_05, &amp;ec_gf8_mul_06, &amp;ec_gf8_mul_07,</div><div class='add'>+    &amp;ec_gf8_mul_08, &amp;ec_gf8_mul_09, &amp;ec_gf8_mul_0A, &amp;ec_gf8_mul_0B,</div><div class='add'>+    &amp;ec_gf8_mul_0C, &amp;ec_gf8_mul_0D, &amp;ec_gf8_mul_0E, &amp;ec_gf8_mul_0F,</div><div class='add'>+    &amp;ec_gf8_mul_10, &amp;ec_gf8_mul_11, &amp;ec_gf8_mul_12, &amp;ec_gf8_mul_13,</div><div class='add'>+    &amp;ec_gf8_mul_14, &amp;ec_gf8_mul_15, &amp;ec_gf8_mul_16, &amp;ec_gf8_mul_17,</div><div class='add'>+    &amp;ec_gf8_mul_18, &amp;ec_gf8_mul_19, &amp;ec_gf8_mul_1A, &amp;ec_gf8_mul_1B,</div><div class='add'>+    &amp;ec_gf8_mul_1C, &amp;ec_gf8_mul_1D, &amp;ec_gf8_mul_1E, &amp;ec_gf8_mul_1F,</div><div class='add'>+    &amp;ec_gf8_mul_20, &amp;ec_gf8_mul_21, &amp;ec_gf8_mul_22, &amp;ec_gf8_mul_23,</div><div class='add'>+    &amp;ec_gf8_mul_24, &amp;ec_gf8_mul_25, &amp;ec_gf8_mul_26, &amp;ec_gf8_mul_27,</div><div class='add'>+    &amp;ec_gf8_mul_28, &amp;ec_gf8_mul_29, &amp;ec_gf8_mul_2A, &amp;ec_gf8_mul_2B,</div><div class='add'>+    &amp;ec_gf8_mul_2C, &amp;ec_gf8_mul_2D, &amp;ec_gf8_mul_2E, &amp;ec_gf8_mul_2F,</div><div class='add'>+    &amp;ec_gf8_mul_30, &amp;ec_gf8_mul_31, &amp;ec_gf8_mul_32, &amp;ec_gf8_mul_33,</div><div class='add'>+    &amp;ec_gf8_mul_34, &amp;ec_gf8_mul_35, &amp;ec_gf8_mul_36, &amp;ec_gf8_mul_37,</div><div class='add'>+    &amp;ec_gf8_mul_38, &amp;ec_gf8_mul_39, &amp;ec_gf8_mul_3A, &amp;ec_gf8_mul_3B,</div><div class='add'>+    &amp;ec_gf8_mul_3C, &amp;ec_gf8_mul_3D, &amp;ec_gf8_mul_3E, &amp;ec_gf8_mul_3F,</div><div class='add'>+    &amp;ec_gf8_mul_40, &amp;ec_gf8_mul_41, &amp;ec_gf8_mul_42, &amp;ec_gf8_mul_43,</div><div class='add'>+    &amp;ec_gf8_mul_44, &amp;ec_gf8_mul_45, &amp;ec_gf8_mul_46, &amp;ec_gf8_mul_47,</div><div class='add'>+    &amp;ec_gf8_mul_48, &amp;ec_gf8_mul_49, &amp;ec_gf8_mul_4A, &amp;ec_gf8_mul_4B,</div><div class='add'>+    &amp;ec_gf8_mul_4C, &amp;ec_gf8_mul_4D, &amp;ec_gf8_mul_4E, &amp;ec_gf8_mul_4F,</div><div class='add'>+    &amp;ec_gf8_mul_50, &amp;ec_gf8_mul_51, &amp;ec_gf8_mul_52, &amp;ec_gf8_mul_53,</div><div class='add'>+    &amp;ec_gf8_mul_54, &amp;ec_gf8_mul_55, &amp;ec_gf8_mul_56, &amp;ec_gf8_mul_57,</div><div class='add'>+    &amp;ec_gf8_mul_58, &amp;ec_gf8_mul_59, &amp;ec_gf8_mul_5A, &amp;ec_gf8_mul_5B,</div><div class='add'>+    &amp;ec_gf8_mul_5C, &amp;ec_gf8_mul_5D, &amp;ec_gf8_mul_5E, &amp;ec_gf8_mul_5F,</div><div class='add'>+    &amp;ec_gf8_mul_60, &amp;ec_gf8_mul_61, &amp;ec_gf8_mul_62, &amp;ec_gf8_mul_63,</div><div class='add'>+    &amp;ec_gf8_mul_64, &amp;ec_gf8_mul_65, &amp;ec_gf8_mul_66, &amp;ec_gf8_mul_67,</div><div class='add'>+    &amp;ec_gf8_mul_68, &amp;ec_gf8_mul_69, &amp;ec_gf8_mul_6A, &amp;ec_gf8_mul_6B,</div><div class='add'>+    &amp;ec_gf8_mul_6C, &amp;ec_gf8_mul_6D, &amp;ec_gf8_mul_6E, &amp;ec_gf8_mul_6F,</div><div class='add'>+    &amp;ec_gf8_mul_70, &amp;ec_gf8_mul_71, &amp;ec_gf8_mul_72, &amp;ec_gf8_mul_73,</div><div class='add'>+    &amp;ec_gf8_mul_74, &amp;ec_gf8_mul_75, &amp;ec_gf8_mul_76, &amp;ec_gf8_mul_77,</div><div class='add'>+    &amp;ec_gf8_mul_78, &amp;ec_gf8_mul_79, &amp;ec_gf8_mul_7A, &amp;ec_gf8_mul_7B,</div><div class='add'>+    &amp;ec_gf8_mul_7C, &amp;ec_gf8_mul_7D, &amp;ec_gf8_mul_7E, &amp;ec_gf8_mul_7F,</div><div class='add'>+    &amp;ec_gf8_mul_80, &amp;ec_gf8_mul_81, &amp;ec_gf8_mul_82, &amp;ec_gf8_mul_83,</div><div class='add'>+    &amp;ec_gf8_mul_84, &amp;ec_gf8_mul_85, &amp;ec_gf8_mul_86, &amp;ec_gf8_mul_87,</div><div class='add'>+    &amp;ec_gf8_mul_88, &amp;ec_gf8_mul_89, &amp;ec_gf8_mul_8A, &amp;ec_gf8_mul_8B,</div><div class='add'>+    &amp;ec_gf8_mul_8C, &amp;ec_gf8_mul_8D, &amp;ec_gf8_mul_8E, &amp;ec_gf8_mul_8F,</div><div class='add'>+    &amp;ec_gf8_mul_90, &amp;ec_gf8_mul_91, &amp;ec_gf8_mul_92, &amp;ec_gf8_mul_93,</div><div class='add'>+    &amp;ec_gf8_mul_94, &amp;ec_gf8_mul_95, &amp;ec_gf8_mul_96, &amp;ec_gf8_mul_97,</div><div class='add'>+    &amp;ec_gf8_mul_98, &amp;ec_gf8_mul_99, &amp;ec_gf8_mul_9A, &amp;ec_gf8_mul_9B,</div><div class='add'>+    &amp;ec_gf8_mul_9C, &amp;ec_gf8_mul_9D, &amp;ec_gf8_mul_9E, &amp;ec_gf8_mul_9F,</div><div class='add'>+    &amp;ec_gf8_mul_A0, &amp;ec_gf8_mul_A1, &amp;ec_gf8_mul_A2, &amp;ec_gf8_mul_A3,</div><div class='add'>+    &amp;ec_gf8_mul_A4, &amp;ec_gf8_mul_A5, &amp;ec_gf8_mul_A6, &amp;ec_gf8_mul_A7,</div><div class='add'>+    &amp;ec_gf8_mul_A8, &amp;ec_gf8_mul_A9, &amp;ec_gf8_mul_AA, &amp;ec_gf8_mul_AB,</div><div class='add'>+    &amp;ec_gf8_mul_AC, &amp;ec_gf8_mul_AD, &amp;ec_gf8_mul_AE, &amp;ec_gf8_mul_AF,</div><div class='add'>+    &amp;ec_gf8_mul_B0, &amp;ec_gf8_mul_B1, &amp;ec_gf8_mul_B2, &amp;ec_gf8_mul_B3,</div><div class='add'>+    &amp;ec_gf8_mul_B4, &amp;ec_gf8_mul_B5, &amp;ec_gf8_mul_B6, &amp;ec_gf8_mul_B7,</div><div class='add'>+    &amp;ec_gf8_mul_B8, &amp;ec_gf8_mul_B9, &amp;ec_gf8_mul_BA, &amp;ec_gf8_mul_BB,</div><div class='add'>+    &amp;ec_gf8_mul_BC, &amp;ec_gf8_mul_BD, &amp;ec_gf8_mul_BE, &amp;ec_gf8_mul_BF,</div><div class='add'>+    &amp;ec_gf8_mul_C0, &amp;ec_gf8_mul_C1, &amp;ec_gf8_mul_C2, &amp;ec_gf8_mul_C3,</div><div class='add'>+    &amp;ec_gf8_mul_C4, &amp;ec_gf8_mul_C5, &amp;ec_gf8_mul_C6, &amp;ec_gf8_mul_C7,</div><div class='add'>+    &amp;ec_gf8_mul_C8, &amp;ec_gf8_mul_C9, &amp;ec_gf8_mul_CA, &amp;ec_gf8_mul_CB,</div><div class='add'>+    &amp;ec_gf8_mul_CC, &amp;ec_gf8_mul_CD, &amp;ec_gf8_mul_CE, &amp;ec_gf8_mul_CF,</div><div class='add'>+    &amp;ec_gf8_mul_D0, &amp;ec_gf8_mul_D1, &amp;ec_gf8_mul_D2, &amp;ec_gf8_mul_D3,</div><div class='add'>+    &amp;ec_gf8_mul_D4, &amp;ec_gf8_mul_D5, &amp;ec_gf8_mul_D6, &amp;ec_gf8_mul_D7,</div><div class='add'>+    &amp;ec_gf8_mul_D8, &amp;ec_gf8_mul_D9, &amp;ec_gf8_mul_DA, &amp;ec_gf8_mul_DB,</div><div class='add'>+    &amp;ec_gf8_mul_DC, &amp;ec_gf8_mul_DD, &amp;ec_gf8_mul_DE, &amp;ec_gf8_mul_DF,</div><div class='add'>+    &amp;ec_gf8_mul_E0, &amp;ec_gf8_mul_E1, &amp;ec_gf8_mul_E2, &amp;ec_gf8_mul_E3,</div><div class='add'>+    &amp;ec_gf8_mul_E4, &amp;ec_gf8_mul_E5, &amp;ec_gf8_mul_E6, &amp;ec_gf8_mul_E7,</div><div class='add'>+    &amp;ec_gf8_mul_E8, &amp;ec_gf8_mul_E9, &amp;ec_gf8_mul_EA, &amp;ec_gf8_mul_EB,</div><div class='add'>+    &amp;ec_gf8_mul_EC, &amp;ec_gf8_mul_ED, &amp;ec_gf8_mul_EE, &amp;ec_gf8_mul_EF,</div><div class='add'>+    &amp;ec_gf8_mul_F0, &amp;ec_gf8_mul_F1, &amp;ec_gf8_mul_F2, &amp;ec_gf8_mul_F3,</div><div class='add'>+    &amp;ec_gf8_mul_F4, &amp;ec_gf8_mul_F5, &amp;ec_gf8_mul_F6, &amp;ec_gf8_mul_F7,</div><div class='add'>+    &amp;ec_gf8_mul_F8, &amp;ec_gf8_mul_F9, &amp;ec_gf8_mul_FA, &amp;ec_gf8_mul_FB,</div><div class='add'>+    &amp;ec_gf8_mul_FC, &amp;ec_gf8_mul_FD, &amp;ec_gf8_mul_FE, &amp;ec_gf8_mul_FF};</div><div class='head'>diff --git a/xlators/cluster/ec/src/ec-gf8.h b/xlators/cluster/ec/src/ec-gf8.h<br/>new file mode 100644<br/>index 00000000000..4aca91127fc<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/xlators/cluster/ec/src/ec-gf8.h?id=d1d7a6f35c816822fab51c820e25023863c239c1'>xlators/cluster/ec/src/ec-gf8.h</a></div><div class='hunk'>@@ -0,0 +1,18 @@</div><div class='add'>+/*</div><div class='add'>+  Copyright (c) 2015 DataLab, s.l. &lt;http://www.datalab.es&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#ifndef __EC_GF8_H__</div><div class='add'>+#define __EC_GF8_H__</div><div class='add'>+</div><div class='add'>+#include "ec-galois.h"</div><div class='add'>+</div><div class='add'>+extern ec_gf_mul_t *ec_gf8_mul[];</div><div class='add'>+</div><div class='add'>+#endif /* __EC_GF8_H__ */</div><div class='head'>diff --git a/xlators/cluster/ec/src/ec-heal.c b/xlators/cluster/ec/src/ec-heal.c<br/>new file mode 100644<br/>index 00000000000..7d991f04aac<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/xlators/cluster/ec/src/ec-heal.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>xlators/cluster/ec/src/ec-heal.c</a></div><div class='hunk'>@@ -0,0 +1,3367 @@</div><div class='add'>+/*</div><div class='add'>+  Copyright (c) 2012-2014 DataLab, s.l. &lt;http://www.datalab.es&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#include &lt;glusterfs/defaults.h&gt;</div><div class='add'>+#include &lt;glusterfs/compat-errno.h&gt;</div><div class='add'>+#include &lt;glusterfs/byte-order.h&gt;</div><div class='add'>+#include &lt;glusterfs/syncop.h&gt;</div><div class='add'>+#include &lt;glusterfs/syncop-utils.h&gt;</div><div class='add'>+#include &lt;glusterfs/cluster-syncop.h&gt;</div><div class='add'>+</div><div class='add'>+#include "ec.h"</div><div class='add'>+#include "ec-types.h"</div><div class='add'>+#include "ec-messages.h"</div><div class='add'>+#include "ec-helpers.h"</div><div class='add'>+#include "ec-common.h"</div><div class='add'>+#include "ec-combine.h"</div><div class='add'>+#include "ec-method.h"</div><div class='add'>+#include "ec-fops.h"</div><div class='add'>+#include "ec-heald.h"</div><div class='add'>+</div><div class='add'>+#define EC_COUNT(array, max)                                                   \</div><div class='add'>+    ({                                                                         \</div><div class='add'>+        int __i;                                                               \</div><div class='add'>+        int __res = 0;                                                         \</div><div class='add'>+        for (__i = 0; __i &lt; max; __i++)                                        \</div><div class='add'>+            if (array[__i])                                                    \</div><div class='add'>+                __res++;                                                       \</div><div class='add'>+        __res;                                                                 \</div><div class='add'>+    })</div><div class='add'>+#define EC_INTERSECT(dst, src1, src2, max)                                     \</div><div class='add'>+    ({                                                                         \</div><div class='add'>+        int __i;                                                               \</div><div class='add'>+        for (__i = 0; __i &lt; max; __i++)                                        \</div><div class='add'>+            dst[__i] = src1[__i] &amp;&amp; src2[__i];                                 \</div><div class='add'>+    })</div><div class='add'>+#define EC_ADJUST_SOURCE(source, sources, max)                                 \</div><div class='add'>+    ({                                                                         \</div><div class='add'>+        int __i;                                                               \</div><div class='add'>+        if (sources[source] == 0) {                                            \</div><div class='add'>+            source = -1;                                                       \</div><div class='add'>+            for (__i = 0; __i &lt; max; __i++)                                    \</div><div class='add'>+                if (sources[__i])                                              \</div><div class='add'>+                    source = __i;                                              \</div><div class='add'>+        }                                                                      \</div><div class='add'>+    })</div><div class='add'>+#define IA_EQUAL(f, s, field)                                                  \</div><div class='add'>+    (memcmp(&amp;(f.ia_##field), &amp;(s.ia_##field), sizeof(s.ia_##field)) == 0)</div><div class='add'>+#define EC_REPLIES_ALLOC(replies, numsubvols)                                  \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        int __i = 0;                                                           \</div><div class='add'>+        replies = alloca0(numsubvols * sizeof(*replies));                      \</div><div class='add'>+        for (__i = 0; __i &lt; numsubvols; __i++)                                 \</div><div class='add'>+            INIT_LIST_HEAD(&amp;replies[__i].entries.list);                        \</div><div class='add'>+    } while (0)</div><div class='add'>+</div><div class='add'>+struct ec_name_data {</div><div class='add'>+    call_frame_t *frame;</div><div class='add'>+    unsigned char *participants;</div><div class='add'>+    unsigned char *failed_on;</div><div class='add'>+    unsigned char *gfidless;</div><div class='add'>+    unsigned char *enoent;</div><div class='add'>+    unsigned char *same;</div><div class='add'>+    char *name;</div><div class='add'>+    inode_t *parent;</div><div class='add'>+    default_args_cbk_t *replies;</div><div class='add'>+    uint32_t heal_pending;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+static char *ec_ignore_xattrs[] = {GF_SELINUX_XATTR_KEY, QUOTA_SIZE_KEY, NULL};</div><div class='add'>+</div><div class='add'>+static gf_boolean_t</div><div class='add'>+ec_ignorable_key_match(dict_t *dict, char *key, data_t *val, void *mdata)</div><div class='add'>+{</div><div class='add'>+    int i = 0;</div><div class='add'>+</div><div class='add'>+    if (!key)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    if (strncmp(key, EC_XATTR_PREFIX, SLEN(EC_XATTR_PREFIX)) == 0)</div><div class='add'>+        return _gf_true;</div><div class='add'>+</div><div class='add'>+    for (i = 0; ec_ignore_xattrs[i]; i++) {</div><div class='add'>+        if (!strcmp(key, ec_ignore_xattrs[i]))</div><div class='add'>+            return _gf_true;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return _gf_false;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static gf_boolean_t</div><div class='add'>+ec_sh_key_match(dict_t *dict, char *key, data_t *val, void *mdata)</div><div class='add'>+{</div><div class='add'>+    return !ec_ignorable_key_match(dict, key, val, mdata);</div><div class='add'>+}</div><div class='add'>+/* FOP: heal */</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_set_entry_healing(ec_fop_data_t *fop)</div><div class='add'>+{</div><div class='add'>+    ec_inode_t *ctx = NULL;</div><div class='add'>+    loc_t *loc = NULL;</div><div class='add'>+</div><div class='add'>+    if (!fop)</div><div class='add'>+        return;</div><div class='add'>+</div><div class='add'>+    loc = &amp;fop-&gt;loc[0];</div><div class='add'>+    LOCK(&amp;loc-&gt;inode-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        ctx = __ec_inode_get(loc-&gt;inode, fop-&gt;xl);</div><div class='add'>+        if (ctx) {</div><div class='add'>+            ctx-&gt;heal_count += 1;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    UNLOCK(&amp;loc-&gt;inode-&gt;lock);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_reset_entry_healing(ec_fop_data_t *fop)</div><div class='add'>+{</div><div class='add'>+    ec_inode_t *ctx = NULL;</div><div class='add'>+    loc_t *loc = NULL;</div><div class='add'>+    int32_t heal_count = 0;</div><div class='add'>+    if (!fop)</div><div class='add'>+        return;</div><div class='add'>+</div><div class='add'>+    loc = &amp;fop-&gt;loc[0];</div><div class='add'>+    LOCK(&amp;loc-&gt;inode-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        ctx = __ec_inode_get(loc-&gt;inode, fop-&gt;xl);</div><div class='add'>+        if (ctx) {</div><div class='add'>+            ctx-&gt;heal_count += -1;</div><div class='add'>+            heal_count = ctx-&gt;heal_count;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    UNLOCK(&amp;loc-&gt;inode-&gt;lock);</div><div class='add'>+    GF_ASSERT(heal_count &gt;= 0);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+uintptr_t</div><div class='add'>+ec_heal_check(ec_fop_data_t *fop, uintptr_t *pgood)</div><div class='add'>+{</div><div class='add'>+    ec_cbk_data_t *cbk;</div><div class='add'>+    uintptr_t mask[2] = {0, 0};</div><div class='add'>+</div><div class='add'>+    list_for_each_entry(cbk, &amp;fop-&gt;cbk_list, list)</div><div class='add'>+    {</div><div class='add'>+        mask[cbk-&gt;op_ret &gt;= 0] |= cbk-&gt;mask;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (pgood != NULL) {</div><div class='add'>+        *pgood = mask[1];</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return mask[0];</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_heal_update(ec_fop_data_t *fop, int32_t is_open)</div><div class='add'>+{</div><div class='add'>+    ec_heal_t *heal = fop-&gt;data;</div><div class='add'>+    uintptr_t good, bad;</div><div class='add'>+</div><div class='add'>+    bad = ec_heal_check(fop, &amp;good);</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;heal-&gt;lock);</div><div class='add'>+</div><div class='add'>+    heal-&gt;bad &amp;= ~bad;</div><div class='add'>+    if (is_open) {</div><div class='add'>+        heal-&gt;open |= good;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    UNLOCK(&amp;heal-&gt;lock);</div><div class='add'>+</div><div class='add'>+    fop-&gt;error = 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_heal_avoid(ec_fop_data_t *fop)</div><div class='add'>+{</div><div class='add'>+    ec_heal_t *heal = fop-&gt;data;</div><div class='add'>+    uintptr_t bad;</div><div class='add'>+</div><div class='add'>+    bad = ec_heal_check(fop, NULL);</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;heal-&gt;lock);</div><div class='add'>+</div><div class='add'>+    heal-&gt;good &amp;= ~bad;</div><div class='add'>+</div><div class='add'>+    UNLOCK(&amp;heal-&gt;lock);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_heal_lock_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                 int32_t op_ret, int32_t op_errno, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    ec_fop_data_t *fop = cookie;</div><div class='add'>+    ec_heal_t *heal = fop-&gt;data;</div><div class='add'>+</div><div class='add'>+    if (op_ret &gt;= 0) {</div><div class='add'>+        GF_ASSERT(</div><div class='add'>+            ec_set_inode_size(heal-&gt;fop, heal-&gt;fd-&gt;inode, heal-&gt;total_size));</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_heal_lock(ec_heal_t *heal, int32_t type, fd_t *fd, loc_t *loc, off_t offset,</div><div class='add'>+             size_t size)</div><div class='add'>+{</div><div class='add'>+    struct gf_flock flock;</div><div class='add'>+    fop_inodelk_cbk_t cbk = NULL;</div><div class='add'>+</div><div class='add'>+    flock.l_type = type;</div><div class='add'>+    flock.l_whence = SEEK_SET;</div><div class='add'>+    flock.l_start = offset;</div><div class='add'>+    flock.l_len = size;</div><div class='add'>+    flock.l_pid = 0;</div><div class='add'>+    flock.l_owner.len = 0;</div><div class='add'>+</div><div class='add'>+    if (type == F_UNLCK) {</div><div class='add'>+        /* Remove inode size information before unlocking it. */</div><div class='add'>+        if (fd == NULL) {</div><div class='add'>+            ec_clear_inode_info(heal-&gt;fop, heal-&gt;loc.inode);</div><div class='add'>+        } else {</div><div class='add'>+            ec_clear_inode_info(heal-&gt;fop, heal-&gt;fd-&gt;inode);</div><div class='add'>+        }</div><div class='add'>+        cbk = ec_lock_unlocked;</div><div class='add'>+    } else {</div><div class='add'>+        /* Otherwise use the callback to update size information. */</div><div class='add'>+        cbk = ec_heal_lock_cbk;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (fd != NULL) {</div><div class='add'>+        ec_finodelk(heal-&gt;fop-&gt;frame, heal-&gt;xl,</div><div class='add'>+                    &amp;heal-&gt;fop-&gt;frame-&gt;root-&gt;lk_owner, heal-&gt;fop-&gt;mask,</div><div class='add'>+                    EC_MINIMUM_ALL, cbk, heal, heal-&gt;xl-&gt;name, fd, F_SETLKW,</div><div class='add'>+                    &amp;flock, NULL);</div><div class='add'>+    } else {</div><div class='add'>+        ec_inodelk(heal-&gt;fop-&gt;frame, heal-&gt;xl,</div><div class='add'>+                   &amp;heal-&gt;fop-&gt;frame-&gt;root-&gt;lk_owner, heal-&gt;fop-&gt;mask,</div><div class='add'>+                   EC_MINIMUM_ALL, cbk, heal, heal-&gt;xl-&gt;name, loc, F_SETLKW,</div><div class='add'>+                   &amp;flock, NULL);</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_heal_inodelk(ec_heal_t *heal, int32_t type, int32_t use_fd, off_t offset,</div><div class='add'>+                size_t size)</div><div class='add'>+{</div><div class='add'>+    ec_heal_lock(heal, type, use_fd ? heal-&gt;fd : NULL, &amp;heal-&gt;loc, offset,</div><div class='add'>+                 size);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_heal_xattr_clean(dict_t *dict, char *key, data_t *data, void *arg)</div><div class='add'>+{</div><div class='add'>+    dict_t *base = arg;</div><div class='add'>+</div><div class='add'>+    if (ec_ignorable_key_match(NULL, key, NULL, NULL)) {</div><div class='add'>+        dict_del(dict, key);</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (dict_get(base, key) != NULL)</div><div class='add'>+        dict_del(dict, key);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/********************************************************************</div><div class='add'>+ * ec_wind_xattrop_parallel:</div><div class='add'>+ *              Helper function to update the extended attributes</div><div class='add'>+ *    in parallel.</div><div class='add'>+ *</div><div class='add'>+ *******************************************************************/</div><div class='add'>+void</div><div class='add'>+ec_wind_xattrop_parallel(call_frame_t *frame, xlator_t *subvol, int child_index,</div><div class='add'>+                         loc_t *loc, gf_xattrop_flags_t flags, dict_t **dict,</div><div class='add'>+                         dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    gf_msg_debug("EC", 0, "WIND: on child %d ", child_index);</div><div class='add'>+    STACK_WIND_COOKIE(</div><div class='add'>+        frame, cluster_xattrop_cbk, (void *)(uintptr_t)child_index, subvol,</div><div class='add'>+        subvol-&gt;fops-&gt;xattrop, loc, flags, dict[child_index], xdata);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_heal_writev_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                   int32_t op_ret, int32_t op_errno, struct iatt *prebuf,</div><div class='add'>+                   struct iatt *postbuf, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    ec_fop_data_t *fop = cookie;</div><div class='add'>+    ec_heal_t *heal = fop-&gt;data;</div><div class='add'>+</div><div class='add'>+    ec_trace("WRITE_CBK", cookie, "ret=%d, errno=%d", op_ret, op_errno);</div><div class='add'>+</div><div class='add'>+    gf_msg_debug(fop-&gt;xl-&gt;name, 0,</div><div class='add'>+                 "%s: write op_ret %d, op_errno %s"</div><div class='add'>+                 " at %" PRIu64,</div><div class='add'>+                 uuid_utoa(heal-&gt;fd-&gt;inode-&gt;gfid), op_ret, strerror(op_errno),</div><div class='add'>+                 heal-&gt;offset);</div><div class='add'>+</div><div class='add'>+    ec_heal_update(cookie, 0);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_heal_readv_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                  int32_t op_ret, int32_t op_errno, struct iovec *vector,</div><div class='add'>+                  int32_t count, struct iatt *stbuf, struct iobref *iobref,</div><div class='add'>+                  dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    ec_fop_data_t *fop = cookie;</div><div class='add'>+    ec_heal_t *heal = fop-&gt;data;</div><div class='add'>+</div><div class='add'>+    ec_trace("READ_CBK", fop, "ret=%d, errno=%d", op_ret, op_errno);</div><div class='add'>+</div><div class='add'>+    ec_heal_avoid(fop);</div><div class='add'>+</div><div class='add'>+    if (op_ret &gt; 0) {</div><div class='add'>+        gf_msg_debug(fop-&gt;xl-&gt;name, 0,</div><div class='add'>+                     "%s: read succeeded, proceeding "</div><div class='add'>+                     "to write at %" PRIu64,</div><div class='add'>+                     uuid_utoa(heal-&gt;fd-&gt;inode-&gt;gfid), heal-&gt;offset);</div><div class='add'>+        ec_writev(heal-&gt;fop-&gt;frame, heal-&gt;xl, heal-&gt;bad, EC_MINIMUM_ONE,</div><div class='add'>+                  ec_heal_writev_cbk, heal, heal-&gt;fd, vector, count,</div><div class='add'>+                  heal-&gt;offset, 0, iobref, NULL);</div><div class='add'>+    } else {</div><div class='add'>+        if (op_ret &lt; 0) {</div><div class='add'>+            gf_msg_debug(fop-&gt;xl-&gt;name, 0,</div><div class='add'>+                         "%s: read failed %s, failing "</div><div class='add'>+                         "to heal block at %" PRIu64,</div><div class='add'>+                         uuid_utoa(heal-&gt;fd-&gt;inode-&gt;gfid), strerror(op_errno),</div><div class='add'>+                         heal-&gt;offset);</div><div class='add'>+            heal-&gt;bad = 0;</div><div class='add'>+        }</div><div class='add'>+        heal-&gt;done = 1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_heal_data_block(ec_heal_t *heal)</div><div class='add'>+{</div><div class='add'>+    ec_trace("DATA", heal-&gt;fop, "good=%lX, bad=%lX", heal-&gt;good, heal-&gt;bad);</div><div class='add'>+</div><div class='add'>+    if ((heal-&gt;good != 0) &amp;&amp; (heal-&gt;bad != 0) &amp;&amp;</div><div class='add'>+        (heal-&gt;iatt.ia_type == IA_IFREG)) {</div><div class='add'>+        ec_readv(heal-&gt;fop-&gt;frame, heal-&gt;xl, heal-&gt;good, EC_MINIMUM_MIN,</div><div class='add'>+                 ec_heal_readv_cbk, heal, heal-&gt;fd, heal-&gt;size, heal-&gt;offset, 0,</div><div class='add'>+                 NULL);</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* FOP: fheal */</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_fheal(call_frame_t *frame, xlator_t *this, uintptr_t target,</div><div class='add'>+         uint32_t fop_flags, fop_fheal_cbk_t func, void *data, fd_t *fd,</div><div class='add'>+         int32_t partial, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    ec_fd_t *ctx = ec_fd_get(fd, this);</div><div class='add'>+</div><div class='add'>+    if (ctx != NULL) {</div><div class='add'>+        gf_msg_trace("ec", 0, "FHEAL ctx: flags=%X, open=%" PRIXPTR, ctx-&gt;flags,</div><div class='add'>+                     ctx-&gt;open);</div><div class='add'>+        ec_heal(frame, this, target, fop_flags, func, data, &amp;ctx-&gt;loc, partial,</div><div class='add'>+                xdata);</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* Common heal code */</div><div class='add'>+void</div><div class='add'>+ec_mask_to_char_array(uintptr_t mask, unsigned char *array, int numsubvols)</div><div class='add'>+{</div><div class='add'>+    int i = 0;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; numsubvols; i++)</div><div class='add'>+        array[i] = ((mask &gt;&gt; i) &amp; 1);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+uintptr_t</div><div class='add'>+ec_char_array_to_mask(unsigned char *array, int numsubvols)</div><div class='add'>+{</div><div class='add'>+    int i = 0;</div><div class='add'>+    uintptr_t mask = 0;</div><div class='add'>+</div><div class='add'>+    if (array == NULL)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; numsubvols; i++)</div><div class='add'>+        if (array[i])</div><div class='add'>+            mask |= (1ULL &lt;&lt; i);</div><div class='add'>+out:</div><div class='add'>+    return mask;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+ec_heal_entry_find_direction(ec_t *ec, default_args_cbk_t *replies,</div><div class='add'>+                             uint64_t *versions, uint64_t *dirty,</div><div class='add'>+                             unsigned char *sources,</div><div class='add'>+                             unsigned char *healed_sinks)</div><div class='add'>+{</div><div class='add'>+    uint64_t xattr[EC_VERSION_SIZE] = {0};</div><div class='add'>+    int source = -1;</div><div class='add'>+    uint64_t max_version = 0;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    int i = 0;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; ec-&gt;nodes; i++) {</div><div class='add'>+        if (!replies[i].valid)</div><div class='add'>+            continue;</div><div class='add'>+</div><div class='add'>+        if (replies[i].op_ret == -1)</div><div class='add'>+            continue;</div><div class='add'>+</div><div class='add'>+        if (source == -1)</div><div class='add'>+            source = i;</div><div class='add'>+</div><div class='add'>+        ret = ec_dict_get_array(replies[i].xdata, EC_XATTR_VERSION, xattr,</div><div class='add'>+                                EC_VERSION_SIZE);</div><div class='add'>+        if (ret == 0) {</div><div class='add'>+            versions[i] = xattr[EC_DATA_TXN];</div><div class='add'>+            if (max_version &lt; versions[i]) {</div><div class='add'>+                max_version = versions[i];</div><div class='add'>+                source = i;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        memset(xattr, 0, sizeof(xattr));</div><div class='add'>+        ret = ec_dict_get_array(replies[i].xdata, EC_XATTR_DIRTY, xattr,</div><div class='add'>+                                EC_VERSION_SIZE);</div><div class='add'>+        if (ret == 0) {</div><div class='add'>+            dirty[i] = xattr[EC_DATA_TXN];</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (source &lt; 0)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; ec-&gt;nodes; i++) {</div><div class='add'>+        if (!replies[i].valid)</div><div class='add'>+            continue;</div><div class='add'>+</div><div class='add'>+        if (replies[i].op_ret == -1)</div><div class='add'>+            continue;</div><div class='add'>+</div><div class='add'>+        if (versions[i] == versions[source])</div><div class='add'>+            sources[i] = 1;</div><div class='add'>+        else</div><div class='add'>+            healed_sinks[i] = 1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return source;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+ec_adjust_versions(call_frame_t *frame, ec_t *ec, ec_txn_t type, inode_t *inode,</div><div class='add'>+                   int source, unsigned char *sources,</div><div class='add'>+                   unsigned char *healed_sinks, uint64_t *versions,</div><div class='add'>+                   uint64_t *dirty)</div><div class='add'>+{</div><div class='add'>+    int i = 0;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    int call_count = 0;</div><div class='add'>+    dict_t **xattr = NULL;</div><div class='add'>+    int op_ret = 0;</div><div class='add'>+    loc_t loc = {0};</div><div class='add'>+    gf_boolean_t erase_dirty = _gf_false;</div><div class='add'>+    uint64_t *versions_xattr = NULL;</div><div class='add'>+    uint64_t *dirty_xattr = NULL;</div><div class='add'>+    uint64_t allzero[2] = {0};</div><div class='add'>+    unsigned char *on = NULL;</div><div class='add'>+    unsigned char *output = NULL;</div><div class='add'>+    default_args_cbk_t *replies = NULL;</div><div class='add'>+</div><div class='add'>+    /* Allocate the required memory */</div><div class='add'>+    loc.inode = inode_ref(inode);</div><div class='add'>+    gf_uuid_copy(loc.gfid, inode-&gt;gfid);</div><div class='add'>+    on = alloca0(ec-&gt;nodes);</div><div class='add'>+    output = alloca0(ec-&gt;nodes);</div><div class='add'>+    EC_REPLIES_ALLOC(replies, ec-&gt;nodes);</div><div class='add'>+    xattr = GF_CALLOC(ec-&gt;nodes, sizeof(*xattr), gf_common_mt_pointer);</div><div class='add'>+    if (!xattr) {</div><div class='add'>+        op_ret = -ENOMEM;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    for (i = 0; i &lt; ec-&gt;nodes; i++) {</div><div class='add'>+        xattr[i] = dict_new();</div><div class='add'>+        if (!xattr[i]) {</div><div class='add'>+            op_ret = -ENOMEM;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* dirty xattr represents if the file/dir needs heal. Unless all the</div><div class='add'>+     * copies are healed, don't erase it */</div><div class='add'>+    if (EC_COUNT(sources, ec-&gt;nodes) + EC_COUNT(healed_sinks, ec-&gt;nodes) ==</div><div class='add'>+        ec-&gt;nodes)</div><div class='add'>+        erase_dirty = _gf_true;</div><div class='add'>+    else</div><div class='add'>+        op_ret = -ENOTCONN;</div><div class='add'>+</div><div class='add'>+    /* Populate the xattr array */</div><div class='add'>+    for (i = 0; i &lt; ec-&gt;nodes; i++) {</div><div class='add'>+        if (!sources[i] &amp;&amp; !healed_sinks[i])</div><div class='add'>+            continue;</div><div class='add'>+        versions_xattr = GF_CALLOC(EC_VERSION_SIZE, sizeof(*versions_xattr),</div><div class='add'>+                                   gf_common_mt_pointer);</div><div class='add'>+        if (!versions_xattr) {</div><div class='add'>+            op_ret = -ENOMEM;</div><div class='add'>+            continue;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        versions_xattr[type] = hton64(versions[source] - versions[i]);</div><div class='add'>+        ret = dict_set_bin(xattr[i], EC_XATTR_VERSION, versions_xattr,</div><div class='add'>+                           (sizeof(*versions_xattr) * EC_VERSION_SIZE));</div><div class='add'>+        if (ret &lt; 0) {</div><div class='add'>+            op_ret = -ENOMEM;</div><div class='add'>+            continue;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        if (erase_dirty) {</div><div class='add'>+            dirty_xattr = GF_CALLOC(EC_VERSION_SIZE, sizeof(*dirty_xattr),</div><div class='add'>+                                    gf_common_mt_pointer);</div><div class='add'>+            if (!dirty_xattr) {</div><div class='add'>+                op_ret = -ENOMEM;</div><div class='add'>+                continue;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            dirty_xattr[type] = hton64(-dirty[i]);</div><div class='add'>+            ret = dict_set_bin(xattr[i], EC_XATTR_DIRTY, dirty_xattr,</div><div class='add'>+                               (sizeof(*dirty_xattr) * EC_VERSION_SIZE));</div><div class='add'>+            if (ret &lt; 0) {</div><div class='add'>+                op_ret = -ENOMEM;</div><div class='add'>+                continue;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        if (memcmp(versions_xattr, allzero,</div><div class='add'>+                   (sizeof(*versions_xattr) * EC_VERSION_SIZE)) == 0) {</div><div class='add'>+            if (!erase_dirty) {</div><div class='add'>+                continue;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            if (memcmp(dirty_xattr, allzero,</div><div class='add'>+                       (sizeof(*dirty_xattr) * EC_VERSION_SIZE)) == 0) {</div><div class='add'>+                continue;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        on[i] = 1;</div><div class='add'>+        call_count++;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Update the bricks with xattr */</div><div class='add'>+    if (call_count) {</div><div class='add'>+        PARALLEL_FOP_ONLIST(ec-&gt;xl_list, on, ec-&gt;nodes, replies, frame,</div><div class='add'>+                            ec_wind_xattrop_parallel, &amp;loc,</div><div class='add'>+                            GF_XATTROP_ADD_ARRAY64, xattr, NULL);</div><div class='add'>+        ret = cluster_fop_success_fill(replies, ec-&gt;nodes, output);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (ret &lt; call_count) {</div><div class='add'>+        op_ret = -ENOTCONN;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    /* Cleanup */</div><div class='add'>+    if (xattr) {</div><div class='add'>+        for (i = 0; i &lt; ec-&gt;nodes; i++) {</div><div class='add'>+            if (xattr[i])</div><div class='add'>+                dict_unref(xattr[i]);</div><div class='add'>+        }</div><div class='add'>+        GF_FREE(xattr);</div><div class='add'>+    }</div><div class='add'>+    cluster_replies_wipe(replies, ec-&gt;nodes);</div><div class='add'>+    loc_wipe(&amp;loc);</div><div class='add'>+    return op_ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+ec_heal_metadata_find_direction(ec_t *ec, default_args_cbk_t *replies,</div><div class='add'>+                                uint64_t *versions, uint64_t *dirty,</div><div class='add'>+                                unsigned char *sources,</div><div class='add'>+                                unsigned char *healed_sinks)</div><div class='add'>+{</div><div class='add'>+    uint64_t xattr[EC_VERSION_SIZE] = {0};</div><div class='add'>+    uint64_t max_version = 0;</div><div class='add'>+    int same_count = 0;</div><div class='add'>+    int max_same_count = 0;</div><div class='add'>+    int same_source = -1;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    int i = 0;</div><div class='add'>+    int j = 0;</div><div class='add'>+    int *groups = NULL;</div><div class='add'>+    struct iatt source_ia = {0};</div><div class='add'>+    struct iatt child_ia = {0};</div><div class='add'>+</div><div class='add'>+    groups = alloca0(ec-&gt;nodes * sizeof(*groups));</div><div class='add'>+    for (i = 0; i &lt; ec-&gt;nodes; i++)</div><div class='add'>+        groups[i] = -1;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; ec-&gt;nodes; i++) {</div><div class='add'>+        if (!replies[i].valid)</div><div class='add'>+            continue;</div><div class='add'>+        if (replies[i].op_ret &lt; 0)</div><div class='add'>+            continue;</div><div class='add'>+        ret = ec_dict_get_array(replies[i].xdata, EC_XATTR_VERSION, xattr,</div><div class='add'>+                                EC_VERSION_SIZE);</div><div class='add'>+        if (ret == 0) {</div><div class='add'>+            versions[i] = xattr[EC_METADATA_TXN];</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        memset(xattr, 0, sizeof(xattr));</div><div class='add'>+        ret = ec_dict_get_array(replies[i].xdata, EC_XATTR_DIRTY, xattr,</div><div class='add'>+                                EC_VERSION_SIZE);</div><div class='add'>+        if (ret == 0) {</div><div class='add'>+            dirty[i] = xattr[EC_METADATA_TXN];</div><div class='add'>+        }</div><div class='add'>+        if (groups[i] &gt;= 0) /*Already part of group*/</div><div class='add'>+            continue;</div><div class='add'>+        groups[i] = i;</div><div class='add'>+        same_count = 1;</div><div class='add'>+        source_ia = replies[i].stat;</div><div class='add'>+        for (j = i + 1; j &lt; ec-&gt;nodes; j++) {</div><div class='add'>+            if (!replies[j].valid || replies[j].op_ret &lt; 0)</div><div class='add'>+                continue;</div><div class='add'>+            child_ia = replies[j].stat;</div><div class='add'>+            if (!IA_EQUAL(source_ia, child_ia, gfid) ||</div><div class='add'>+                !IA_EQUAL(source_ia, child_ia, type) ||</div><div class='add'>+                !IA_EQUAL(source_ia, child_ia, prot) ||</div><div class='add'>+                !IA_EQUAL(source_ia, child_ia, uid) ||</div><div class='add'>+                !IA_EQUAL(source_ia, child_ia, gid))</div><div class='add'>+                continue;</div><div class='add'>+            if (!are_dicts_equal(replies[i].xdata, replies[j].xdata,</div><div class='add'>+                                 ec_sh_key_match, NULL))</div><div class='add'>+                continue;</div><div class='add'>+            groups[j] = i;</div><div class='add'>+            same_count++;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        if (max_same_count &lt; same_count) {</div><div class='add'>+            max_same_count = same_count;</div><div class='add'>+            same_source = i;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (max_same_count &lt; ec-&gt;fragments) {</div><div class='add'>+        ret = -EIO;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; ec-&gt;nodes; i++) {</div><div class='add'>+        if (groups[i] == groups[same_source])</div><div class='add'>+            sources[i] = 1;</div><div class='add'>+        else if (replies[i].valid &amp;&amp; replies[i].op_ret &gt;= 0)</div><div class='add'>+            healed_sinks[i] = 1;</div><div class='add'>+    }</div><div class='add'>+    for (i = 0; i &lt; ec-&gt;nodes; i++) {</div><div class='add'>+        if (sources[i] &amp;&amp; (versions[i] &gt; max_version)) {</div><div class='add'>+            same_source = i;</div><div class='add'>+            max_version = versions[i];</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    ret = same_source;</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+__ec_heal_metadata_prepare(call_frame_t *frame, ec_t *ec, inode_t *inode,</div><div class='add'>+                           unsigned char *locked_on,</div><div class='add'>+                           default_args_cbk_t *replies, uint64_t *versions,</div><div class='add'>+                           uint64_t *dirty, unsigned char *sources,</div><div class='add'>+                           unsigned char *healed_sinks)</div><div class='add'>+{</div><div class='add'>+    loc_t loc = {0};</div><div class='add'>+    unsigned char *output = NULL;</div><div class='add'>+    unsigned char *lookup_on = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    int source = 0;</div><div class='add'>+    default_args_cbk_t *greplies = NULL;</div><div class='add'>+    int i = 0;</div><div class='add'>+    EC_REPLIES_ALLOC(greplies, ec-&gt;nodes);</div><div class='add'>+</div><div class='add'>+    loc.inode = inode_ref(inode);</div><div class='add'>+    gf_uuid_copy(loc.gfid, inode-&gt;gfid);</div><div class='add'>+    output = alloca0(ec-&gt;nodes);</div><div class='add'>+    lookup_on = alloca0(ec-&gt;nodes);</div><div class='add'>+    ret = cluster_lookup(ec-&gt;xl_list, locked_on, ec-&gt;nodes, replies, output,</div><div class='add'>+                         frame, ec-&gt;xl, &amp;loc, NULL);</div><div class='add'>+    if (ret &lt;= ec-&gt;fragments) {</div><div class='add'>+        ret = -ENOTCONN;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    memcpy(lookup_on, output, ec-&gt;nodes);</div><div class='add'>+    /*Use getxattr to get the filtered xattrs which filter internal xattrs*/</div><div class='add'>+    ret = cluster_getxattr(ec-&gt;xl_list, lookup_on, ec-&gt;nodes, greplies, output,</div><div class='add'>+                           frame, ec-&gt;xl, &amp;loc, NULL, NULL);</div><div class='add'>+    for (i = 0; i &lt; ec-&gt;nodes; i++) {</div><div class='add'>+        if (lookup_on[i] &amp;&amp; !output[i]) {</div><div class='add'>+            replies[i].valid = 0;</div><div class='add'>+            continue;</div><div class='add'>+        }</div><div class='add'>+        if (replies[i].xdata) {</div><div class='add'>+            dict_unref(replies[i].xdata);</div><div class='add'>+            replies[i].xdata = NULL;</div><div class='add'>+            if (greplies[i].xattr)</div><div class='add'>+                replies[i].xdata = dict_ref(greplies[i].xattr);</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    source = ec_heal_metadata_find_direction(ec, replies, versions, dirty,</div><div class='add'>+                                             sources, healed_sinks);</div><div class='add'>+    if (source &lt; 0) {</div><div class='add'>+        ret = -EIO;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    ret = source;</div><div class='add'>+out:</div><div class='add'>+    cluster_replies_wipe(greplies, ec-&gt;nodes);</div><div class='add'>+    loc_wipe(&amp;loc);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* Metadata heal */</div><div class='add'>+int</div><div class='add'>+__ec_removexattr_sinks(call_frame_t *frame, ec_t *ec, inode_t *inode,</div><div class='add'>+                       int source, unsigned char *sources,</div><div class='add'>+                       unsigned char *healed_sinks, default_args_cbk_t *replies)</div><div class='add'>+{</div><div class='add'>+    int i = 0;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    loc_t loc = {0};</div><div class='add'>+</div><div class='add'>+    loc.inode = inode_ref(inode);</div><div class='add'>+    gf_uuid_copy(loc.gfid, inode-&gt;gfid);</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; ec-&gt;nodes; i++) {</div><div class='add'>+        if (i == source)</div><div class='add'>+            continue;</div><div class='add'>+        if (!sources[i] &amp;&amp; !healed_sinks[i])</div><div class='add'>+            continue;</div><div class='add'>+        ret = dict_foreach(replies[i].xdata, ec_heal_xattr_clean,</div><div class='add'>+                           replies[source].xdata);</div><div class='add'>+        if (ret &lt; 0) {</div><div class='add'>+            sources[i] = 0;</div><div class='add'>+            healed_sinks[i] = 0;</div><div class='add'>+            continue;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        if (replies[i].xdata-&gt;count == 0) {</div><div class='add'>+            continue;</div><div class='add'>+        } else if (sources[i]) {</div><div class='add'>+            /* This can happen if setxattr/removexattr succeeds on</div><div class='add'>+             * the bricks but fails to update the version. This</div><div class='add'>+             * will make sure that the xattrs are made equal after</div><div class='add'>+             * heal*/</div><div class='add'>+            sources[i] = 0;</div><div class='add'>+            healed_sinks[i] = 1;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        ret = syncop_removexattr(ec-&gt;xl_list[i], &amp;loc, "", replies[i].xdata,</div><div class='add'>+                                 NULL);</div><div class='add'>+        if (ret &lt; 0)</div><div class='add'>+            healed_sinks[i] = 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    loc_wipe(&amp;loc);</div><div class='add'>+    if (EC_COUNT(healed_sinks, ec-&gt;nodes) == 0)</div><div class='add'>+        return -ENOTCONN;</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+__ec_heal_metadata(call_frame_t *frame, ec_t *ec, inode_t *inode,</div><div class='add'>+                   unsigned char *locked_on, unsigned char *sources,</div><div class='add'>+                   unsigned char *healed_sinks)</div><div class='add'>+{</div><div class='add'>+    loc_t loc = {0};</div><div class='add'>+    int ret = 0;</div><div class='add'>+    int source = 0;</div><div class='add'>+    default_args_cbk_t *replies = NULL;</div><div class='add'>+    default_args_cbk_t *sreplies = NULL;</div><div class='add'>+    uint64_t *versions = NULL;</div><div class='add'>+    uint64_t *dirty = NULL;</div><div class='add'>+    unsigned char *output = NULL;</div><div class='add'>+    dict_t *source_dict = NULL;</div><div class='add'>+    struct iatt source_buf = {0};</div><div class='add'>+</div><div class='add'>+    EC_REPLIES_ALLOC(replies, ec-&gt;nodes);</div><div class='add'>+    EC_REPLIES_ALLOC(sreplies, ec-&gt;nodes);</div><div class='add'>+</div><div class='add'>+    loc.inode = inode_ref(inode);</div><div class='add'>+    gf_uuid_copy(loc.gfid, inode-&gt;gfid);</div><div class='add'>+    output = alloca0(ec-&gt;nodes);</div><div class='add'>+    versions = alloca0(ec-&gt;nodes * sizeof(*versions));</div><div class='add'>+    dirty = alloca0(ec-&gt;nodes * sizeof(*dirty));</div><div class='add'>+    source = __ec_heal_metadata_prepare(frame, ec, inode, locked_on, replies,</div><div class='add'>+                                        versions, dirty, sources, healed_sinks);</div><div class='add'>+    if (source &lt; 0) {</div><div class='add'>+        ret = -EIO;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if ((EC_COUNT(sources, ec-&gt;nodes) == ec-&gt;nodes) ||</div><div class='add'>+        (EC_COUNT(healed_sinks, ec-&gt;nodes) == 0)) {</div><div class='add'>+        ret = 0;</div><div class='add'>+        goto erase_dirty;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    source_buf = replies[source].stat;</div><div class='add'>+    ret = cluster_setattr(ec-&gt;xl_list, healed_sinks, ec-&gt;nodes, sreplies,</div><div class='add'>+                          output, frame, ec-&gt;xl, &amp;loc, &amp;source_buf,</div><div class='add'>+                          GF_SET_ATTR_MODE | GF_SET_ATTR_UID | GF_SET_ATTR_GID,</div><div class='add'>+                          NULL);</div><div class='add'>+    /*In case the operation fails on some of the subvols*/</div><div class='add'>+    memcpy(healed_sinks, output, ec-&gt;nodes);</div><div class='add'>+    if (EC_COUNT(healed_sinks, ec-&gt;nodes) == 0) {</div><div class='add'>+        ret = -ENOTCONN;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = __ec_removexattr_sinks(frame, ec, inode, source, sources,</div><div class='add'>+                                 healed_sinks, replies);</div><div class='add'>+    if (ret &lt; 0)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    source_dict = dict_ref(replies[source].xdata);</div><div class='add'>+    if (dict_foreach_match(source_dict, ec_ignorable_key_match, NULL,</div><div class='add'>+                           dict_remove_foreach_fn, NULL) == -1) {</div><div class='add'>+        ret = -ENOMEM;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = cluster_setxattr(ec-&gt;xl_list, healed_sinks, ec-&gt;nodes, replies,</div><div class='add'>+                           output, frame, ec-&gt;xl, &amp;loc, source_dict, 0, NULL);</div><div class='add'>+</div><div class='add'>+    EC_INTERSECT(healed_sinks, healed_sinks, output, ec-&gt;nodes);</div><div class='add'>+    if (EC_COUNT(healed_sinks, ec-&gt;nodes) == 0) {</div><div class='add'>+        ret = -ENOTCONN;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+erase_dirty:</div><div class='add'>+    ret = ec_adjust_versions(frame, ec, EC_METADATA_TXN, inode, source, sources,</div><div class='add'>+                             healed_sinks, versions, dirty);</div><div class='add'>+out:</div><div class='add'>+    if (source_dict)</div><div class='add'>+        dict_unref(source_dict);</div><div class='add'>+</div><div class='add'>+    loc_wipe(&amp;loc);</div><div class='add'>+    cluster_replies_wipe(replies, ec-&gt;nodes);</div><div class='add'>+    cluster_replies_wipe(sreplies, ec-&gt;nodes);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+ec_heal_metadata(call_frame_t *frame, ec_t *ec, inode_t *inode,</div><div class='add'>+                 unsigned char *sources, unsigned char *healed_sinks)</div><div class='add'>+{</div><div class='add'>+    unsigned char *locked_on = NULL;</div><div class='add'>+    unsigned char *up_subvols = NULL;</div><div class='add'>+    unsigned char *output = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    default_args_cbk_t *replies = NULL;</div><div class='add'>+</div><div class='add'>+    EC_REPLIES_ALLOC(replies, ec-&gt;nodes);</div><div class='add'>+    locked_on = alloca0(ec-&gt;nodes);</div><div class='add'>+    output = alloca0(ec-&gt;nodes);</div><div class='add'>+    up_subvols = alloca0(ec-&gt;nodes);</div><div class='add'>+    ec_mask_to_char_array(ec-&gt;xl_up, up_subvols, ec-&gt;nodes);</div><div class='add'>+    ret = cluster_inodelk(ec-&gt;xl_list, up_subvols, ec-&gt;nodes, replies,</div><div class='add'>+                          locked_on, frame, ec-&gt;xl, ec-&gt;xl-&gt;name, inode, 0, 0);</div><div class='add'>+    {</div><div class='add'>+        if (ret &lt;= ec-&gt;fragments) {</div><div class='add'>+            gf_msg_debug(ec-&gt;xl-&gt;name, 0,</div><div class='add'>+                         "%s: Skipping heal "</div><div class='add'>+                         "as only %d number of subvolumes could "</div><div class='add'>+                         "be locked",</div><div class='add'>+                         uuid_utoa(inode-&gt;gfid), ret);</div><div class='add'>+            ret = -ENOTCONN;</div><div class='add'>+            goto unlock;</div><div class='add'>+        }</div><div class='add'>+        ret = __ec_heal_metadata(frame, ec, inode, locked_on, sources,</div><div class='add'>+                                 healed_sinks);</div><div class='add'>+    }</div><div class='add'>+unlock:</div><div class='add'>+    cluster_uninodelk(ec-&gt;xl_list, locked_on, ec-&gt;nodes, replies, output, frame,</div><div class='add'>+                      ec-&gt;xl, ec-&gt;xl-&gt;name, inode, 0, 0);</div><div class='add'>+    cluster_replies_wipe(replies, ec-&gt;nodes);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*entry heal*/</div><div class='add'>+int</div><div class='add'>+__ec_heal_entry_prepare(call_frame_t *frame, ec_t *ec, inode_t *inode,</div><div class='add'>+                        unsigned char *locked_on, uint64_t *versions,</div><div class='add'>+                        uint64_t *dirty, unsigned char *sources,</div><div class='add'>+                        unsigned char *healed_sinks)</div><div class='add'>+{</div><div class='add'>+    loc_t loc = {0};</div><div class='add'>+    int source = 0;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    default_args_cbk_t *replies = NULL;</div><div class='add'>+    unsigned char *output = NULL;</div><div class='add'>+    dict_t *xdata = NULL;</div><div class='add'>+</div><div class='add'>+    EC_REPLIES_ALLOC(replies, ec-&gt;nodes);</div><div class='add'>+</div><div class='add'>+    loc.inode = inode_ref(inode);</div><div class='add'>+    gf_uuid_copy(loc.gfid, inode-&gt;gfid);</div><div class='add'>+    xdata = dict_new();</div><div class='add'>+    if (!xdata) {</div><div class='add'>+        ret = -ENOMEM;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (dict_set_uint64(xdata, EC_XATTR_VERSION, 0) ||</div><div class='add'>+        dict_set_uint64(xdata, EC_XATTR_DIRTY, 0)) {</div><div class='add'>+        ret = -ENOMEM;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    output = alloca0(ec-&gt;nodes);</div><div class='add'>+    ret = cluster_lookup(ec-&gt;xl_list, locked_on, ec-&gt;nodes, replies, output,</div><div class='add'>+                         frame, ec-&gt;xl, &amp;loc, xdata);</div><div class='add'>+    if (ret &lt;= ec-&gt;fragments) {</div><div class='add'>+        ret = -ENOTCONN;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    source = ec_heal_entry_find_direction(ec, replies, versions, dirty, sources,</div><div class='add'>+                                          healed_sinks);</div><div class='add'>+    if (source &lt; 0) {</div><div class='add'>+        ret = -EIO;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    ret = source;</div><div class='add'>+out:</div><div class='add'>+    if (xdata)</div><div class='add'>+        dict_unref(xdata);</div><div class='add'>+    loc_wipe(&amp;loc);</div><div class='add'>+    cluster_replies_wipe(replies, ec-&gt;nodes);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+int32_t</div><div class='add'>+ec_set_new_entry_dirty(ec_t *ec, loc_t *loc, struct iatt *ia,</div><div class='add'>+                       call_frame_t *frame, xlator_t *this, unsigned char *on)</div><div class='add'>+{</div><div class='add'>+    dict_t *xattr = NULL;</div><div class='add'>+    int32_t ret = -1;</div><div class='add'>+    default_args_cbk_t *replies = NULL;</div><div class='add'>+    unsigned char *output = NULL;</div><div class='add'>+    uint64_t dirty[EC_VERSION_SIZE] = {1, 1};</div><div class='add'>+    loc_t newloc = {0};</div><div class='add'>+</div><div class='add'>+    /*Symlinks don't have any data to be healed*/</div><div class='add'>+    if (ia-&gt;ia_type == IA_IFLNK)</div><div class='add'>+        dirty[EC_DATA_TXN] = 0;</div><div class='add'>+</div><div class='add'>+    newloc.inode = inode_ref(loc-&gt;inode);</div><div class='add'>+    gf_uuid_copy(newloc.gfid, ia-&gt;ia_gfid);</div><div class='add'>+    EC_REPLIES_ALLOC(replies, ec-&gt;nodes);</div><div class='add'>+    output = alloca0(ec-&gt;nodes);</div><div class='add'>+    xattr = dict_new();</div><div class='add'>+    if (!xattr) {</div><div class='add'>+        ret = -ENOMEM;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = ec_dict_set_array(xattr, EC_XATTR_DIRTY, dirty, EC_VERSION_SIZE);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    ret = cluster_xattrop(ec-&gt;xl_list, on, ec-&gt;nodes, replies, output, frame,</div><div class='add'>+                          ec-&gt;xl, &amp;newloc, GF_XATTROP_ADD_ARRAY64, xattr, NULL);</div><div class='add'>+</div><div class='add'>+    if (ret &lt; ec-&gt;fragments) {</div><div class='add'>+        ret = -ENOTCONN;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (xattr)</div><div class='add'>+        dict_unref(xattr);</div><div class='add'>+    cluster_replies_wipe(replies, ec-&gt;nodes);</div><div class='add'>+    loc_wipe(&amp;newloc);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*Name heal*/</div><div class='add'>+int</div><div class='add'>+ec_delete_stale_name(dict_t *gfid_db, char *key, data_t *d, void *data)</div><div class='add'>+{</div><div class='add'>+    struct ec_name_data *name_data = data;</div><div class='add'>+    struct iatt *ia = NULL;</div><div class='add'>+    ec_t *ec = NULL;</div><div class='add'>+    loc_t loc = {0};</div><div class='add'>+    unsigned char *same = data_to_bin(d);</div><div class='add'>+    default_args_cbk_t *replies = NULL;</div><div class='add'>+    unsigned char *output = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    int estale_count = 0;</div><div class='add'>+    int i = 0;</div><div class='add'>+    call_frame_t *frame = name_data-&gt;frame;</div><div class='add'>+    uuid_t gfid;</div><div class='add'>+</div><div class='add'>+    ec = name_data-&gt;frame-&gt;this-&gt;private;</div><div class='add'>+    EC_REPLIES_ALLOC(replies, ec-&gt;nodes);</div><div class='add'>+    if (EC_COUNT(same, ec-&gt;nodes) &gt;= ec-&gt;fragments) {</div><div class='add'>+        ret = 0;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    loc.parent = inode_ref(name_data-&gt;parent);</div><div class='add'>+    loc.inode = inode_new(name_data-&gt;parent-&gt;table);</div><div class='add'>+    if (!loc.inode) {</div><div class='add'>+        ret = -ENOMEM;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    gf_uuid_parse(key, gfid);</div><div class='add'>+    gf_uuid_copy(loc.pargfid, name_data-&gt;parent-&gt;gfid);</div><div class='add'>+    loc.name = name_data-&gt;name;</div><div class='add'>+    output = alloca0(ec-&gt;nodes);</div><div class='add'>+    ret = cluster_lookup(ec-&gt;xl_list, name_data-&gt;participants, ec-&gt;nodes,</div><div class='add'>+                         replies, output, name_data-&gt;frame, ec-&gt;xl, &amp;loc, NULL);</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; ec-&gt;nodes; i++) {</div><div class='add'>+        if (!replies[i].valid)</div><div class='add'>+            continue;</div><div class='add'>+        if (replies[i].op_ret == -1) {</div><div class='add'>+            if (replies[i].op_errno == ESTALE || replies[i].op_errno == ENOENT)</div><div class='add'>+                estale_count++;</div><div class='add'>+            else</div><div class='add'>+                name_data-&gt;participants[i] = 0;</div><div class='add'>+        } else if (gf_uuid_compare(gfid, replies[i].stat.ia_gfid)) {</div><div class='add'>+            estale_count++;</div><div class='add'>+            gf_msg_debug(ec-&gt;xl-&gt;name, 0, "%s/%s: different gfid as %s",</div><div class='add'>+                         uuid_utoa(name_data-&gt;parent-&gt;gfid), name_data-&gt;name,</div><div class='add'>+                         key);</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (estale_count &lt;= ec-&gt;redundancy) {</div><div class='add'>+        /* We have at least ec-&gt;fragments number of fragments, so the</div><div class='add'>+         * file is recoverable, so don't delete it*/</div><div class='add'>+</div><div class='add'>+        /* Please note that the lookup call above could fail with</div><div class='add'>+         * ENOTCONN on all subvoumes and still this branch will be</div><div class='add'>+         * true, but in those cases conservatively we decide to not</div><div class='add'>+         * delete the file until we are sure*/</div><div class='add'>+        ret = 0;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /*Noway to recover, delete the name*/</div><div class='add'>+    loc_wipe(&amp;loc);</div><div class='add'>+    loc.parent = inode_ref(name_data-&gt;parent);</div><div class='add'>+    gf_uuid_copy(loc.pargfid, loc.parent-&gt;gfid);</div><div class='add'>+    loc.name = name_data-&gt;name;</div><div class='add'>+    for (i = 0; i &lt; ec-&gt;nodes; i++) {</div><div class='add'>+        if (same[i] &amp;&amp; replies[i].valid &amp;&amp; (replies[i].op_ret == 0)) {</div><div class='add'>+            ia = &amp;replies[i].stat;</div><div class='add'>+            break;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (!ia) {</div><div class='add'>+        ret = -ENOTCONN;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (IA_ISDIR(ia-&gt;ia_type)) {</div><div class='add'>+        ret = cluster_rmdir(ec-&gt;xl_list, same, ec-&gt;nodes, replies, output,</div><div class='add'>+                            frame, ec-&gt;xl, &amp;loc, 1, NULL);</div><div class='add'>+        gf_msg_debug(ec-&gt;xl-&gt;name, 0,</div><div class='add'>+                     "cluster rmdir succeeded on %d "</div><div class='add'>+                     "nodes",</div><div class='add'>+                     ret);</div><div class='add'>+    } else {</div><div class='add'>+        ret = cluster_unlink(ec-&gt;xl_list, same, ec-&gt;nodes, replies, output,</div><div class='add'>+                             frame, ec-&gt;xl, &amp;loc, 0, NULL);</div><div class='add'>+        gf_msg_debug(ec-&gt;xl-&gt;name, 0,</div><div class='add'>+                     "cluster unlink succeeded on %d "</div><div class='add'>+                     "nodes",</div><div class='add'>+                     ret);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; ec-&gt;nodes; i++) {</div><div class='add'>+        if (output[i]) {</div><div class='add'>+            same[i] = 0;</div><div class='add'>+            name_data-&gt;enoent[i] = 1;</div><div class='add'>+        } else {</div><div class='add'>+            /*op failed*/</div><div class='add'>+            if (same[i])</div><div class='add'>+                name_data-&gt;participants[i] = 0;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    ret = 0;</div><div class='add'>+    /*This will help in making decisions about creating names*/</div><div class='add'>+    dict_del(gfid_db, key);</div><div class='add'>+out:</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        gf_msg_debug(ec-&gt;xl-&gt;name, 0, "%s/%s: heal failed %s",</div><div class='add'>+                     uuid_utoa(name_data-&gt;parent-&gt;gfid), name_data-&gt;name,</div><div class='add'>+                     strerror(-ret));</div><div class='add'>+    }</div><div class='add'>+    cluster_replies_wipe(replies, ec-&gt;nodes);</div><div class='add'>+    loc_wipe(&amp;loc);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+ec_delete_stale_names(call_frame_t *frame, ec_t *ec, inode_t *parent,</div><div class='add'>+                      char *name, default_args_cbk_t *replies, dict_t *gfid_db,</div><div class='add'>+                      unsigned char *enoent, unsigned char *gfidless,</div><div class='add'>+                      unsigned char *participants)</div><div class='add'>+{</div><div class='add'>+    struct ec_name_data name_data = {0};</div><div class='add'>+</div><div class='add'>+    name_data.enoent = enoent;</div><div class='add'>+    name_data.gfidless = gfidless;</div><div class='add'>+    name_data.participants = participants;</div><div class='add'>+    name_data.name = name;</div><div class='add'>+    name_data.parent = parent;</div><div class='add'>+    name_data.frame = frame;</div><div class='add'>+    name_data.replies = replies;</div><div class='add'>+    return dict_foreach(gfid_db, ec_delete_stale_name, &amp;name_data);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+_assign_same(dict_t *dict, char *key, data_t *value, void *data)</div><div class='add'>+{</div><div class='add'>+    struct ec_name_data *name_data = data;</div><div class='add'>+</div><div class='add'>+    name_data-&gt;same = data_to_bin(value);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+ec_create_name(call_frame_t *frame, ec_t *ec, inode_t *parent, char *name,</div><div class='add'>+               default_args_cbk_t *lookup_replies, dict_t *gfid_db,</div><div class='add'>+               unsigned char *enoent, unsigned char *participants)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+    int i = 0;</div><div class='add'>+    struct ec_name_data name_data = {0};</div><div class='add'>+    struct iatt *ia = NULL;</div><div class='add'>+    unsigned char *output = 0;</div><div class='add'>+    unsigned char *output1 = 0;</div><div class='add'>+    unsigned char *on = NULL;</div><div class='add'>+    default_args_cbk_t *replies = NULL;</div><div class='add'>+    loc_t loc = {0};</div><div class='add'>+    loc_t srcloc = {0};</div><div class='add'>+    unsigned char *link = NULL;</div><div class='add'>+    unsigned char *create = NULL;</div><div class='add'>+    dict_t *xdata = NULL;</div><div class='add'>+    char *linkname = NULL;</div><div class='add'>+    ec_config_t config;</div><div class='add'>+</div><div class='add'>+    /* There should be just one gfid key */</div><div class='add'>+    EC_REPLIES_ALLOC(replies, ec-&gt;nodes);</div><div class='add'>+    if (gfid_db-&gt;count != 1) {</div><div class='add'>+        ret = -EINVAL;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_foreach(gfid_db, _assign_same, &amp;name_data);</div><div class='add'>+    if (ret &lt; 0)</div><div class='add'>+        goto out;</div><div class='add'>+    /*There should at least be one valid success reply with gfid*/</div><div class='add'>+    for (i = 0; i &lt; ec-&gt;nodes; i++)</div><div class='add'>+        if (name_data.same[i])</div><div class='add'>+            break;</div><div class='add'>+</div><div class='add'>+    if (i == ec-&gt;nodes) {</div><div class='add'>+        ret = -EINVAL;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ia = &amp;lookup_replies[i].stat;</div><div class='add'>+    xdata = dict_new();</div><div class='add'>+    loc.parent = inode_ref(parent);</div><div class='add'>+    gf_uuid_copy(loc.pargfid, parent-&gt;gfid);</div><div class='add'>+    loc.inode = inode_new(parent-&gt;table);</div><div class='add'>+    if (loc.inode)</div><div class='add'>+        srcloc.inode = inode_ref(loc.inode);</div><div class='add'>+    gf_uuid_copy(srcloc.gfid, ia-&gt;ia_gfid);</div><div class='add'>+    if (!loc.inode || !xdata ||</div><div class='add'>+        dict_set_static_bin(xdata, "gfid-req", ia-&gt;ia_gfid,</div><div class='add'>+                            sizeof(ia-&gt;ia_gfid))) {</div><div class='add'>+        ret = -ENOMEM;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    loc.name = name;</div><div class='add'>+    link = alloca0(ec-&gt;nodes);</div><div class='add'>+    create = alloca0(ec-&gt;nodes);</div><div class='add'>+    on = alloca0(ec-&gt;nodes);</div><div class='add'>+    output = alloca0(ec-&gt;nodes);</div><div class='add'>+    output1 = alloca0(ec-&gt;nodes);</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; ec-&gt;nodes; i++) {</div><div class='add'>+        if (!lookup_replies[i].valid)</div><div class='add'>+            continue;</div><div class='add'>+        if (lookup_replies[i].op_ret)</div><div class='add'>+            continue;</div><div class='add'>+        on[i] = 1;</div><div class='add'>+    }</div><div class='add'>+    switch (ia-&gt;ia_type) {</div><div class='add'>+        case IA_IFDIR:</div><div class='add'>+            ec_set_new_entry_dirty(ec, &amp;loc, ia, frame, ec-&gt;xl, on);</div><div class='add'>+            (void)cluster_mkdir(</div><div class='add'>+                ec-&gt;xl_list, enoent, ec-&gt;nodes, replies, output, frame, ec-&gt;xl,</div><div class='add'>+                &amp;loc, st_mode_from_ia(ia-&gt;ia_prot, ia-&gt;ia_type), 0, xdata);</div><div class='add'>+            break;</div><div class='add'>+</div><div class='add'>+        case IA_IFLNK:</div><div class='add'>+            /*Check for hard links and create/link*/</div><div class='add'>+            ret = cluster_lookup(ec-&gt;xl_list, enoent, ec-&gt;nodes, replies,</div><div class='add'>+                                 output, frame, ec-&gt;xl, &amp;srcloc, NULL);</div><div class='add'>+            for (i = 0; i &lt; ec-&gt;nodes; i++) {</div><div class='add'>+                if (output[i]) {</div><div class='add'>+                    link[i] = 1;</div><div class='add'>+                } else {</div><div class='add'>+                    if (replies[i].op_errno == ENOENT ||</div><div class='add'>+                        replies[i].op_errno == ESTALE) {</div><div class='add'>+                        create[i] = 1;</div><div class='add'>+                    }</div><div class='add'>+                }</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            if (EC_COUNT(link, ec-&gt;nodes)) {</div><div class='add'>+                cluster_link(ec-&gt;xl_list, link, ec-&gt;nodes, replies, output1,</div><div class='add'>+                             frame, ec-&gt;xl, &amp;srcloc, &amp;loc, NULL);</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            if (EC_COUNT(create, ec-&gt;nodes)) {</div><div class='add'>+                cluster_readlink(ec-&gt;xl_list, name_data.same, ec-&gt;nodes,</div><div class='add'>+                                 replies, output, frame, ec-&gt;xl, &amp;srcloc, 4096,</div><div class='add'>+                                 NULL);</div><div class='add'>+                if (EC_COUNT(output, ec-&gt;nodes) == 0) {</div><div class='add'>+                    ret = -ENOTCONN;</div><div class='add'>+                    goto out;</div><div class='add'>+                }</div><div class='add'>+</div><div class='add'>+                for (i = 0; i &lt; ec-&gt;nodes; i++) {</div><div class='add'>+                    if (output[i])</div><div class='add'>+                        break;</div><div class='add'>+                }</div><div class='add'>+                linkname = alloca0(strlen(replies[i].buf) + 1);</div><div class='add'>+                strcpy(linkname, replies[i].buf);</div><div class='add'>+                ec_set_new_entry_dirty(ec, &amp;loc, ia, frame, ec-&gt;xl, on);</div><div class='add'>+                cluster_symlink(ec-&gt;xl_list, create, ec-&gt;nodes, replies, output,</div><div class='add'>+                                frame, ec-&gt;xl, linkname, &amp;loc, 0, xdata);</div><div class='add'>+            }</div><div class='add'>+            for (i = 0; i &lt; ec-&gt;nodes; i++)</div><div class='add'>+                if (output1[i])</div><div class='add'>+                    output[i] = 1;</div><div class='add'>+            break;</div><div class='add'>+        case IA_IFREG:</div><div class='add'>+            ec_set_new_entry_dirty(ec, &amp;loc, ia, frame, ec-&gt;xl, on);</div><div class='add'>+            config.version = EC_CONFIG_VERSION;</div><div class='add'>+            config.algorithm = EC_CONFIG_ALGORITHM;</div><div class='add'>+            config.gf_word_size = EC_GF_BITS;</div><div class='add'>+            config.bricks = ec-&gt;nodes;</div><div class='add'>+            config.redundancy = ec-&gt;redundancy;</div><div class='add'>+            config.chunk_size = EC_METHOD_CHUNK_SIZE;</div><div class='add'>+</div><div class='add'>+            ret = ec_dict_set_config(xdata, EC_XATTR_CONFIG, &amp;config);</div><div class='add'>+            if (ret != 0) {</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            /* Fall through */</div><div class='add'>+</div><div class='add'>+        default:</div><div class='add'>+            ret = dict_set_int32(xdata, GLUSTERFS_INTERNAL_FOP_KEY, 1);</div><div class='add'>+            if (ret)</div><div class='add'>+                goto out;</div><div class='add'>+            ret = cluster_mknod(</div><div class='add'>+                ec-&gt;xl_list, enoent, ec-&gt;nodes, replies, output, frame, ec-&gt;xl,</div><div class='add'>+                &amp;loc, st_mode_from_ia(ia-&gt;ia_prot, ia-&gt;ia_type),</div><div class='add'>+                makedev(ia_major(ia-&gt;ia_rdev), ia_minor(ia-&gt;ia_rdev)), 0,</div><div class='add'>+                xdata);</div><div class='add'>+            break;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; ec-&gt;nodes; i++) {</div><div class='add'>+        if (enoent[i] &amp;&amp; !output[i])</div><div class='add'>+            participants[i] = 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+out:</div><div class='add'>+    if (ret &lt; 0)</div><div class='add'>+        gf_msg_debug(ec-&gt;xl-&gt;name, 0, "%s/%s: heal failed %s",</div><div class='add'>+                     uuid_utoa(parent-&gt;gfid), name, strerror(-ret));</div><div class='add'>+    cluster_replies_wipe(replies, ec-&gt;nodes);</div><div class='add'>+    loc_wipe(&amp;loc);</div><div class='add'>+    loc_wipe(&amp;srcloc);</div><div class='add'>+    if (xdata)</div><div class='add'>+        dict_unref(xdata);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+__ec_heal_name(call_frame_t *frame, ec_t *ec, inode_t *parent, char *name,</div><div class='add'>+               unsigned char *participants)</div><div class='add'>+{</div><div class='add'>+    unsigned char *output = NULL;</div><div class='add'>+    unsigned char *enoent = NULL;</div><div class='add'>+    default_args_cbk_t *replies = NULL;</div><div class='add'>+    dict_t *xdata = NULL;</div><div class='add'>+    dict_t *gfid_db = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    loc_t loc = {0};</div><div class='add'>+    int i = 0;</div><div class='add'>+    struct iatt *ia = NULL;</div><div class='add'>+    char gfid[64] = {0};</div><div class='add'>+    unsigned char *same = NULL;</div><div class='add'>+    unsigned char *gfidless = NULL;</div><div class='add'>+</div><div class='add'>+    EC_REPLIES_ALLOC(replies, ec-&gt;nodes);</div><div class='add'>+    loc.parent = inode_ref(parent);</div><div class='add'>+    loc.inode = inode_new(parent-&gt;table);</div><div class='add'>+    gf_uuid_copy(loc.pargfid, parent-&gt;gfid);</div><div class='add'>+    loc.name = name;</div><div class='add'>+    xdata = dict_new();</div><div class='add'>+    gfid_db = dict_new();</div><div class='add'>+    if (!xdata || !gfid_db || !loc.inode) {</div><div class='add'>+        ret = -ENOMEM;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_set_int32(xdata, GF_GFIDLESS_LOOKUP, 1);</div><div class='add'>+    if (ret) {</div><div class='add'>+        ret = -ENOMEM;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    output = alloca0(ec-&gt;nodes);</div><div class='add'>+    gfidless = alloca0(ec-&gt;nodes);</div><div class='add'>+    enoent = alloca0(ec-&gt;nodes);</div><div class='add'>+    ret = cluster_lookup(ec-&gt;xl_list, participants, ec-&gt;nodes, replies, output,</div><div class='add'>+                         frame, ec-&gt;xl, &amp;loc, NULL);</div><div class='add'>+    for (i = 0; i &lt; ec-&gt;nodes; i++) {</div><div class='add'>+        if (!replies[i].valid)</div><div class='add'>+            continue;</div><div class='add'>+</div><div class='add'>+        if (replies[i].op_ret == -1) {</div><div class='add'>+            /*If ESTALE comes here, that means parent dir is not</div><div class='add'>+             * present, nothing to do there, so reset participants</div><div class='add'>+             * for that brick*/</div><div class='add'>+            if (replies[i].op_errno == ENOENT)</div><div class='add'>+                enoent[i] = 1;</div><div class='add'>+            else</div><div class='add'>+                participants[i] = 0;</div><div class='add'>+            continue;</div><div class='add'>+        }</div><div class='add'>+        ia = &amp;replies[i].stat;</div><div class='add'>+        if (gf_uuid_is_null(ia-&gt;ia_gfid)) {</div><div class='add'>+            if (IA_ISDIR(ia-&gt;ia_type) || ia-&gt;ia_size == 0)</div><div class='add'>+                gfidless[i] = 1;</div><div class='add'>+            else</div><div class='add'>+                participants[i] = 0;</div><div class='add'>+        } else {</div><div class='add'>+            uuid_utoa_r(ia-&gt;ia_gfid, gfid);</div><div class='add'>+            ret = dict_get_bin(gfid_db, gfid, (void **)&amp;same);</div><div class='add'>+            if (ret &lt; 0) {</div><div class='add'>+                same = alloca0(ec-&gt;nodes);</div><div class='add'>+            }</div><div class='add'>+            same[i] = 1;</div><div class='add'>+            if (ret &lt; 0) {</div><div class='add'>+                ret = dict_set_static_bin(gfid_db, gfid, same, ec-&gt;nodes);</div><div class='add'>+            }</div><div class='add'>+            if (ret &lt; 0)</div><div class='add'>+                goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = ec_delete_stale_names(frame, ec, parent, name, replies, gfid_db,</div><div class='add'>+                                enoent, gfidless, participants);</div><div class='add'>+</div><div class='add'>+    if (gfid_db-&gt;count == 0) {</div><div class='add'>+        /* All entries seem to be stale entries and deleted,</div><div class='add'>+         * nothing more to do.*/</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (gfid_db-&gt;count &gt; 1) {</div><div class='add'>+        gf_msg(ec-&gt;xl-&gt;name, GF_LOG_INFO, 0, EC_MSG_HEAL_FAIL,</div><div class='add'>+               "%s/%s: Not able to heal", uuid_utoa(parent-&gt;gfid), name);</div><div class='add'>+        memset(participants, 0, ec-&gt;nodes);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    EC_INTERSECT(enoent, enoent, participants, ec-&gt;nodes);</div><div class='add'>+    if (EC_COUNT(enoent, ec-&gt;nodes) == 0) {</div><div class='add'>+        ret = 0;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = ec_create_name(frame, ec, parent, name, replies, gfid_db, enoent,</div><div class='add'>+                         participants);</div><div class='add'>+    if (ret &gt;= 0) {</div><div class='add'>+        /* If ec_create_name() succeeded we return 1 to indicate that a new</div><div class='add'>+         * file has been created and it will need to be healed. */</div><div class='add'>+        ret = 1;</div><div class='add'>+    }</div><div class='add'>+out:</div><div class='add'>+    cluster_replies_wipe(replies, ec-&gt;nodes);</div><div class='add'>+    loc_wipe(&amp;loc);</div><div class='add'>+    if (xdata)</div><div class='add'>+        dict_unref(xdata);</div><div class='add'>+    if (gfid_db)</div><div class='add'>+        dict_unref(gfid_db);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+ec_heal_name(call_frame_t *frame, ec_t *ec, inode_t *parent, char *name,</div><div class='add'>+             unsigned char *participants)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+    default_args_cbk_t *replies = NULL;</div><div class='add'>+    unsigned char *output = NULL;</div><div class='add'>+    unsigned char *locked_on = NULL;</div><div class='add'>+    loc_t loc = {0};</div><div class='add'>+</div><div class='add'>+    loc.parent = inode_ref(parent);</div><div class='add'>+    loc.name = name;</div><div class='add'>+    loc.inode = inode_new(parent-&gt;table);</div><div class='add'>+    if (!loc.inode) {</div><div class='add'>+        ret = -ENOMEM;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    EC_REPLIES_ALLOC(replies, ec-&gt;nodes);</div><div class='add'>+    output = alloca0(ec-&gt;nodes);</div><div class='add'>+    locked_on = alloca0(ec-&gt;nodes);</div><div class='add'>+    ret = cluster_inodelk(ec-&gt;xl_list, participants, ec-&gt;nodes, replies,</div><div class='add'>+                          locked_on, frame, ec-&gt;xl, ec-&gt;xl-&gt;name, parent, 0, 0);</div><div class='add'>+    {</div><div class='add'>+        if (ret &lt;= ec-&gt;fragments) {</div><div class='add'>+            gf_msg_debug(ec-&gt;xl-&gt;name, 0,</div><div class='add'>+                         "%s/%s: Skipping "</div><div class='add'>+                         "heal as only %d number of subvolumes could "</div><div class='add'>+                         "be locked",</div><div class='add'>+                         uuid_utoa(parent-&gt;gfid), name, ret);</div><div class='add'>+            ret = -ENOTCONN;</div><div class='add'>+            goto unlock;</div><div class='add'>+        }</div><div class='add'>+        EC_INTERSECT(participants, participants, locked_on, ec-&gt;nodes);</div><div class='add'>+        ret = __ec_heal_name(frame, ec, parent, name, participants);</div><div class='add'>+    }</div><div class='add'>+unlock:</div><div class='add'>+    cluster_uninodelk(ec-&gt;xl_list, locked_on, ec-&gt;nodes, replies, output, frame,</div><div class='add'>+                      ec-&gt;xl, ec-&gt;xl-&gt;name, parent, 0, 0);</div><div class='add'>+out:</div><div class='add'>+    cluster_replies_wipe(replies, ec-&gt;nodes);</div><div class='add'>+    loc_wipe(&amp;loc);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+ec_name_heal_handler(xlator_t *subvol, gf_dirent_t *entry, loc_t *parent,</div><div class='add'>+                     void *data)</div><div class='add'>+{</div><div class='add'>+    struct ec_name_data *name_data = data;</div><div class='add'>+    xlator_t *this = THIS;</div><div class='add'>+    ec_t *ec = this-&gt;private;</div><div class='add'>+    unsigned char *name_on = alloca0(ec-&gt;nodes);</div><div class='add'>+    int i = 0;</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    if (ec-&gt;shutdown) {</div><div class='add'>+        gf_msg_debug(this-&gt;name, 0,</div><div class='add'>+                     "Cancelling directory heal "</div><div class='add'>+                     "because EC is stopping.");</div><div class='add'>+        return -ENOTCONN;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    memcpy(name_on, name_data-&gt;participants, ec-&gt;nodes);</div><div class='add'>+    ret = ec_heal_name(name_data-&gt;frame, ec, parent-&gt;inode, entry-&gt;d_name,</div><div class='add'>+                       name_on);</div><div class='add'>+</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        memset(name_on, 0, ec-&gt;nodes);</div><div class='add'>+    } else {</div><div class='add'>+        name_data-&gt;heal_pending += ret;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; ec-&gt;nodes; i++)</div><div class='add'>+        if (name_data-&gt;participants[i] &amp;&amp; !name_on[i])</div><div class='add'>+            name_data-&gt;failed_on[i] = 1;</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+ec_heal_names(call_frame_t *frame, ec_t *ec, inode_t *inode,</div><div class='add'>+              unsigned char *participants, uint32_t *pending)</div><div class='add'>+{</div><div class='add'>+    int i = 0;</div><div class='add'>+    int j = 0;</div><div class='add'>+    loc_t loc = {0};</div><div class='add'>+    struct ec_name_data name_data = {0};</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    loc.inode = inode_ref(inode);</div><div class='add'>+    gf_uuid_copy(loc.gfid, inode-&gt;gfid);</div><div class='add'>+    name_data.frame = frame;</div><div class='add'>+    name_data.participants = participants;</div><div class='add'>+    name_data.failed_on = alloca0(ec-&gt;nodes);</div><div class='add'>+    name_data.heal_pending = 0;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; ec-&gt;nodes; i++) {</div><div class='add'>+        if (!participants[i])</div><div class='add'>+            continue;</div><div class='add'>+        ret = syncop_dir_scan(ec-&gt;xl_list[i], &amp;loc, GF_CLIENT_PID_SELF_HEALD,</div><div class='add'>+                              &amp;name_data, ec_name_heal_handler);</div><div class='add'>+        if (ret &lt; 0) {</div><div class='add'>+            break;</div><div class='add'>+        }</div><div class='add'>+        for (j = 0; j &lt; ec-&gt;nodes; j++)</div><div class='add'>+            if (name_data.failed_on[j])</div><div class='add'>+                participants[j] = 0;</div><div class='add'>+</div><div class='add'>+        if (EC_COUNT(participants, ec-&gt;nodes) &lt;= ec-&gt;fragments) {</div><div class='add'>+            ret = -ENOTCONN;</div><div class='add'>+            break;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    *pending += name_data.heal_pending;</div><div class='add'>+</div><div class='add'>+    loc_wipe(&amp;loc);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+__ec_heal_entry(call_frame_t *frame, ec_t *ec, inode_t *inode,</div><div class='add'>+                unsigned char *heal_on, unsigned char *sources,</div><div class='add'>+                unsigned char *healed_sinks, uint32_t *pending)</div><div class='add'>+{</div><div class='add'>+    unsigned char *locked_on = NULL;</div><div class='add'>+    unsigned char *output = NULL;</div><div class='add'>+    uint64_t *versions = NULL;</div><div class='add'>+    uint64_t *dirty = NULL;</div><div class='add'>+    unsigned char *participants = NULL;</div><div class='add'>+    default_args_cbk_t *replies = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    int source = 0;</div><div class='add'>+    int i = 0;</div><div class='add'>+</div><div class='add'>+    locked_on = alloca0(ec-&gt;nodes);</div><div class='add'>+    output = alloca0(ec-&gt;nodes);</div><div class='add'>+    versions = alloca0(ec-&gt;nodes * sizeof(*versions));</div><div class='add'>+    dirty = alloca0(ec-&gt;nodes * sizeof(*dirty));</div><div class='add'>+</div><div class='add'>+    EC_REPLIES_ALLOC(replies, ec-&gt;nodes);</div><div class='add'>+    ret = cluster_inodelk(ec-&gt;xl_list, heal_on, ec-&gt;nodes, replies, locked_on,</div><div class='add'>+                          frame, ec-&gt;xl, ec-&gt;xl-&gt;name, inode, 0, 0);</div><div class='add'>+    {</div><div class='add'>+        if (ret &lt;= ec-&gt;fragments) {</div><div class='add'>+            gf_msg_debug(ec-&gt;xl-&gt;name, 0,</div><div class='add'>+                         "%s: Skipping heal "</div><div class='add'>+                         "as only %d number of subvolumes could "</div><div class='add'>+                         "be locked",</div><div class='add'>+                         uuid_utoa(inode-&gt;gfid), ret);</div><div class='add'>+            ret = -ENOTCONN;</div><div class='add'>+            goto unlock;</div><div class='add'>+        }</div><div class='add'>+        ret = __ec_heal_entry_prepare(frame, ec, inode, locked_on, versions,</div><div class='add'>+                                      dirty, sources, healed_sinks);</div><div class='add'>+        source = ret;</div><div class='add'>+    }</div><div class='add'>+unlock:</div><div class='add'>+    cluster_uninodelk(ec-&gt;xl_list, locked_on, ec-&gt;nodes, replies, output, frame,</div><div class='add'>+                      ec-&gt;xl, ec-&gt;xl-&gt;name, inode, 0, 0);</div><div class='add'>+    if (ret &lt; 0)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    participants = alloca0(ec-&gt;nodes);</div><div class='add'>+    for (i = 0; i &lt; ec-&gt;nodes; i++) {</div><div class='add'>+        if (sources[i] || healed_sinks[i])</div><div class='add'>+            participants[i] = 1;</div><div class='add'>+    }</div><div class='add'>+    ret = ec_heal_names(frame, ec, inode, participants, pending);</div><div class='add'>+</div><div class='add'>+    if (EC_COUNT(participants, ec-&gt;nodes) &lt;= ec-&gt;fragments)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; ec-&gt;nodes; i++) {</div><div class='add'>+        if (!participants[i]) {</div><div class='add'>+            sources[i] = 0;</div><div class='add'>+            healed_sinks[i] = 0;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ec_adjust_versions(frame, ec, EC_DATA_TXN, inode, source, sources,</div><div class='add'>+                       healed_sinks, versions, dirty);</div><div class='add'>+out:</div><div class='add'>+    cluster_replies_wipe(replies, ec-&gt;nodes);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+ec_heal_entry(call_frame_t *frame, ec_t *ec, inode_t *inode,</div><div class='add'>+              unsigned char *sources, unsigned char *healed_sinks,</div><div class='add'>+              uint32_t *pending)</div><div class='add'>+{</div><div class='add'>+    unsigned char *locked_on = NULL;</div><div class='add'>+    unsigned char *up_subvols = NULL;</div><div class='add'>+    unsigned char *output = NULL;</div><div class='add'>+    char selfheal_domain[1024] = {0};</div><div class='add'>+    int ret = 0;</div><div class='add'>+    default_args_cbk_t *replies = NULL;</div><div class='add'>+</div><div class='add'>+    EC_REPLIES_ALLOC(replies, ec-&gt;nodes);</div><div class='add'>+    locked_on = alloca0(ec-&gt;nodes);</div><div class='add'>+    output = alloca0(ec-&gt;nodes);</div><div class='add'>+    up_subvols = alloca0(ec-&gt;nodes);</div><div class='add'>+</div><div class='add'>+    sprintf(selfheal_domain, "%s:self-heal", ec-&gt;xl-&gt;name);</div><div class='add'>+    ec_mask_to_char_array(ec-&gt;xl_up, up_subvols, ec-&gt;nodes);</div><div class='add'>+    /*If other processes are already doing the heal, don't block*/</div><div class='add'>+    ret = cluster_tiebreaker_inodelk(ec-&gt;xl_list, up_subvols, ec-&gt;nodes,</div><div class='add'>+                                     replies, locked_on, frame, ec-&gt;xl,</div><div class='add'>+                                     selfheal_domain, inode, 0, 0);</div><div class='add'>+    {</div><div class='add'>+        if (ret &lt;= ec-&gt;fragments) {</div><div class='add'>+            gf_msg_debug(ec-&gt;xl-&gt;name, 0,</div><div class='add'>+                         "%s: Skipping heal "</div><div class='add'>+                         "as only %d number of subvolumes could "</div><div class='add'>+                         "be locked",</div><div class='add'>+                         uuid_utoa(inode-&gt;gfid), ret);</div><div class='add'>+            ret = -ENOTCONN;</div><div class='add'>+            goto unlock;</div><div class='add'>+        }</div><div class='add'>+        ret = __ec_heal_entry(frame, ec, inode, locked_on, sources,</div><div class='add'>+                              healed_sinks, pending);</div><div class='add'>+    }</div><div class='add'>+unlock:</div><div class='add'>+    cluster_uninodelk(ec-&gt;xl_list, locked_on, ec-&gt;nodes, replies, output, frame,</div><div class='add'>+                      ec-&gt;xl, selfheal_domain, inode, 0, 0);</div><div class='add'>+    cluster_replies_wipe(replies, ec-&gt;nodes);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*Find direction for data heal and heal info*/</div><div class='add'>+int</div><div class='add'>+ec_heal_data_find_direction(ec_t *ec, default_args_cbk_t *replies,</div><div class='add'>+                            uint64_t *data_versions, uint64_t *dirty,</div><div class='add'>+                            uint64_t *size, unsigned char *sources,</div><div class='add'>+                            unsigned char *healed_sinks,</div><div class='add'>+                            gf_boolean_t check_ondisksize, int which)</div><div class='add'>+{</div><div class='add'>+    uint64_t xattr[EC_VERSION_SIZE] = {0};</div><div class='add'>+    char version_size[128] = {0};</div><div class='add'>+    dict_t *version_size_db = NULL;</div><div class='add'>+    unsigned char *same = NULL;</div><div class='add'>+    int max_same_count = 0;</div><div class='add'>+    int source = 0;</div><div class='add'>+    int i = 0;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    dict_t *dict = NULL;</div><div class='add'>+    uint64_t source_size = 0;</div><div class='add'>+</div><div class='add'>+    version_size_db = dict_new();</div><div class='add'>+    if (!version_size_db) {</div><div class='add'>+        ret = -ENOMEM;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; ec-&gt;nodes; i++) {</div><div class='add'>+        if (!replies[i].valid)</div><div class='add'>+            continue;</div><div class='add'>+        if (replies[i].op_ret &lt; 0)</div><div class='add'>+            continue;</div><div class='add'>+        dict = (which == EC_COMBINE_XDATA) ? replies[i].xdata</div><div class='add'>+                                           : replies[i].xattr;</div><div class='add'>+</div><div class='add'>+        ret = ec_dict_get_array(dict, EC_XATTR_VERSION, xattr, EC_VERSION_SIZE);</div><div class='add'>+        if (ret == 0) {</div><div class='add'>+            data_versions[i] = xattr[EC_DATA_TXN];</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        memset(xattr, 0, sizeof(xattr));</div><div class='add'>+        ret = ec_dict_get_array(dict, EC_XATTR_DIRTY, xattr, EC_VERSION_SIZE);</div><div class='add'>+        if (ret == 0) {</div><div class='add'>+            dirty[i] = xattr[EC_DATA_TXN];</div><div class='add'>+        }</div><div class='add'>+        ret = ec_dict_del_number(dict, EC_XATTR_SIZE, &amp;size[i]);</div><div class='add'>+        /*Build a db of same metadata and data version and size*/</div><div class='add'>+        snprintf(version_size, sizeof(version_size), "%" PRIu64 "-%" PRIu64,</div><div class='add'>+                 data_versions[i], size[i]);</div><div class='add'>+</div><div class='add'>+        ret = dict_get_bin(version_size_db, version_size, (void **)&amp;same);</div><div class='add'>+        if (ret &lt; 0) {</div><div class='add'>+            same = alloca0(ec-&gt;nodes);</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        same[i] = 1;</div><div class='add'>+        if (max_same_count &lt; EC_COUNT(same, ec-&gt;nodes)) {</div><div class='add'>+            max_same_count = EC_COUNT(same, ec-&gt;nodes);</div><div class='add'>+            source = i;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        if (ret &lt; 0) {</div><div class='add'>+            ret = dict_set_static_bin(version_size_db, version_size, same,</div><div class='add'>+                                      ec-&gt;nodes);</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        if (ret &lt; 0) {</div><div class='add'>+            ret = -ENOMEM;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    /* If we don't have ec-&gt;fragments number of same version,size it is not</div><div class='add'>+     * recoverable*/</div><div class='add'>+    if (max_same_count &lt; ec-&gt;fragments) {</div><div class='add'>+        ret = -EIO;</div><div class='add'>+        goto out;</div><div class='add'>+    } else {</div><div class='add'>+        snprintf(version_size, sizeof(version_size), "%" PRIu64 "-%" PRIu64,</div><div class='add'>+                 data_versions[source], size[source]);</div><div class='add'>+</div><div class='add'>+        ret = dict_get_bin(version_size_db, version_size, (void **)&amp;same);</div><div class='add'>+        if (ret &lt; 0)</div><div class='add'>+            goto out;</div><div class='add'>+        memcpy(sources, same, ec-&gt;nodes);</div><div class='add'>+        for (i = 0; i &lt; ec-&gt;nodes; i++) {</div><div class='add'>+            if (replies[i].valid &amp;&amp; (replies[i].op_ret == 0) &amp;&amp; !sources[i])</div><div class='add'>+                healed_sinks[i] = 1;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* There could be files with versions, size same but on disk ia_size</div><div class='add'>+     * could be different because of disk crashes, mark them as sinks as</div><div class='add'>+     * well*/</div><div class='add'>+</div><div class='add'>+    if (check_ondisksize) {</div><div class='add'>+        source_size = size[source];</div><div class='add'>+        ec_adjust_size_up(ec, &amp;source_size, _gf_true);</div><div class='add'>+</div><div class='add'>+        for (i = 0; i &lt; ec-&gt;nodes; i++) {</div><div class='add'>+            if (sources[i]) {</div><div class='add'>+                if (replies[i].stat.ia_size != source_size) {</div><div class='add'>+                    sources[i] = 0;</div><div class='add'>+                    healed_sinks[i] = 1;</div><div class='add'>+                    max_same_count--;</div><div class='add'>+                } else {</div><div class='add'>+                    source = i;</div><div class='add'>+                }</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+        if (max_same_count &lt; ec-&gt;fragments) {</div><div class='add'>+            ret = -EIO;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = source;</div><div class='add'>+out:</div><div class='add'>+    if (version_size_db)</div><div class='add'>+        dict_unref(version_size_db);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+__ec_heal_data_prepare(call_frame_t *frame, ec_t *ec, fd_t *fd,</div><div class='add'>+                       unsigned char *locked_on, uint64_t *versions,</div><div class='add'>+                       uint64_t *dirty, uint64_t *size, unsigned char *sources,</div><div class='add'>+                       unsigned char *healed_sinks, unsigned char *trim,</div><div class='add'>+                       struct iatt *stbuf)</div><div class='add'>+{</div><div class='add'>+    default_args_cbk_t *replies = NULL;</div><div class='add'>+    default_args_cbk_t *fstat_replies = NULL;</div><div class='add'>+    unsigned char *output = NULL;</div><div class='add'>+    unsigned char *fstat_output = NULL;</div><div class='add'>+    dict_t *xattrs = NULL;</div><div class='add'>+    uint64_t zero_array[2] = {0};</div><div class='add'>+    int source = 0;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    uint64_t zero_value = 0;</div><div class='add'>+    int i = 0;</div><div class='add'>+</div><div class='add'>+    EC_REPLIES_ALLOC(replies, ec-&gt;nodes);</div><div class='add'>+    EC_REPLIES_ALLOC(fstat_replies, ec-&gt;nodes);</div><div class='add'>+    output = alloca0(ec-&gt;nodes);</div><div class='add'>+    fstat_output = alloca0(ec-&gt;nodes);</div><div class='add'>+    xattrs = dict_new();</div><div class='add'>+    if (!xattrs ||</div><div class='add'>+        dict_set_static_bin(xattrs, EC_XATTR_VERSION, zero_array,</div><div class='add'>+                            sizeof(zero_array)) ||</div><div class='add'>+        dict_set_static_bin(xattrs, EC_XATTR_DIRTY, zero_array,</div><div class='add'>+                            sizeof(zero_array)) ||</div><div class='add'>+        dict_set_static_bin(xattrs, EC_XATTR_SIZE, &amp;zero_value,</div><div class='add'>+                            sizeof(zero_value))) {</div><div class='add'>+        ret = -ENOMEM;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = cluster_fxattrop(ec-&gt;xl_list, locked_on, ec-&gt;nodes, replies, output,</div><div class='add'>+                           frame, ec-&gt;xl, fd, GF_XATTROP_ADD_ARRAY64, xattrs,</div><div class='add'>+                           NULL);</div><div class='add'>+</div><div class='add'>+    ret = cluster_fstat(ec-&gt;xl_list, locked_on, ec-&gt;nodes, fstat_replies,</div><div class='add'>+                        fstat_output, frame, ec-&gt;xl, fd, NULL);</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; ec-&gt;nodes; i++) {</div><div class='add'>+        output[i] = output[i] &amp;&amp; fstat_output[i];</div><div class='add'>+        replies[i].valid = output[i];</div><div class='add'>+        if (output[i])</div><div class='add'>+            replies[i].stat = fstat_replies[i].stat;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (EC_COUNT(output, ec-&gt;nodes) &lt;= ec-&gt;fragments) {</div><div class='add'>+        ret = -ENOTCONN;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    source = ec_heal_data_find_direction(ec, replies, versions, dirty, size,</div><div class='add'>+                                         sources, healed_sinks, _gf_true,</div><div class='add'>+                                         EC_COMBINE_DICT);</div><div class='add'>+    ret = source;</div><div class='add'>+    if (ret &lt; 0)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    if (stbuf)</div><div class='add'>+        *stbuf = replies[source].stat;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; ec-&gt;nodes; i++) {</div><div class='add'>+        if (healed_sinks[i]) {</div><div class='add'>+            if (replies[i].stat.ia_size)</div><div class='add'>+                trim[i] = 1;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (EC_COUNT(sources, ec-&gt;nodes) &lt; ec-&gt;fragments) {</div><div class='add'>+        ret = -ENOTCONN;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = source;</div><div class='add'>+out:</div><div class='add'>+    if (xattrs)</div><div class='add'>+        dict_unref(xattrs);</div><div class='add'>+    cluster_replies_wipe(replies, ec-&gt;nodes);</div><div class='add'>+    cluster_replies_wipe(fstat_replies, ec-&gt;nodes);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        gf_msg_debug(ec-&gt;xl-&gt;name, 0, "%s: heal failed %s",</div><div class='add'>+                     uuid_utoa(fd-&gt;inode-&gt;gfid), strerror(-ret));</div><div class='add'>+    } else {</div><div class='add'>+        gf_msg_debug(ec-&gt;xl-&gt;name, 0,</div><div class='add'>+                     "%s: sources: %d, sinks: "</div><div class='add'>+                     "%d",</div><div class='add'>+                     uuid_utoa(fd-&gt;inode-&gt;gfid), EC_COUNT(sources, ec-&gt;nodes),</div><div class='add'>+                     EC_COUNT(healed_sinks, ec-&gt;nodes));</div><div class='add'>+    }</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+__ec_heal_mark_sinks(call_frame_t *frame, ec_t *ec, fd_t *fd,</div><div class='add'>+                     uint64_t *versions, unsigned char *healed_sinks)</div><div class='add'>+{</div><div class='add'>+    int i = 0;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    unsigned char *mark = NULL;</div><div class='add'>+    dict_t *xattrs = NULL;</div><div class='add'>+    default_args_cbk_t *replies = NULL;</div><div class='add'>+    unsigned char *output = NULL;</div><div class='add'>+    uint64_t versions_xattr[2] = {0};</div><div class='add'>+</div><div class='add'>+    EC_REPLIES_ALLOC(replies, ec-&gt;nodes);</div><div class='add'>+    xattrs = dict_new();</div><div class='add'>+    if (!xattrs) {</div><div class='add'>+        ret = -ENOMEM;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    mark = alloca0(ec-&gt;nodes);</div><div class='add'>+    for (i = 0; i &lt; ec-&gt;nodes; i++) {</div><div class='add'>+        if (!healed_sinks[i])</div><div class='add'>+            continue;</div><div class='add'>+        if ((versions[i] &gt;&gt; EC_SELFHEAL_BIT) &amp; 1)</div><div class='add'>+            continue;</div><div class='add'>+        mark[i] = 1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (EC_COUNT(mark, ec-&gt;nodes) == 0)</div><div class='add'>+        return 0;</div><div class='add'>+</div><div class='add'>+    versions_xattr[EC_DATA_TXN] = hton64(1ULL &lt;&lt; EC_SELFHEAL_BIT);</div><div class='add'>+    if (dict_set_static_bin(xattrs, EC_XATTR_VERSION, versions_xattr,</div><div class='add'>+                            sizeof(versions_xattr))) {</div><div class='add'>+        ret = -ENOMEM;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    output = alloca0(ec-&gt;nodes);</div><div class='add'>+    ret = cluster_fxattrop(ec-&gt;xl_list, mark, ec-&gt;nodes, replies, output, frame,</div><div class='add'>+                           ec-&gt;xl, fd, GF_XATTROP_ADD_ARRAY64, xattrs, NULL);</div><div class='add'>+    for (i = 0; i &lt; ec-&gt;nodes; i++) {</div><div class='add'>+        if (!output[i]) {</div><div class='add'>+            if (mark[i])</div><div class='add'>+                healed_sinks[i] = 0;</div><div class='add'>+            continue;</div><div class='add'>+        }</div><div class='add'>+        versions[i] |= (1ULL &lt;&lt; EC_SELFHEAL_BIT);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (EC_COUNT(healed_sinks, ec-&gt;nodes) == 0) {</div><div class='add'>+        ret = -ENOTCONN;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    ret = 0;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    cluster_replies_wipe(replies, ec-&gt;nodes);</div><div class='add'>+    if (xattrs)</div><div class='add'>+        dict_unref(xattrs);</div><div class='add'>+    if (ret &lt; 0)</div><div class='add'>+        gf_msg_debug(ec-&gt;xl-&gt;name, 0, "%s: heal failed %s",</div><div class='add'>+                     uuid_utoa(fd-&gt;inode-&gt;gfid), strerror(-ret));</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_manager_heal_block(ec_fop_data_t *fop, int32_t state)</div><div class='add'>+{</div><div class='add'>+    ec_heal_t *heal = fop-&gt;data;</div><div class='add'>+    heal-&gt;fop = fop;</div><div class='add'>+</div><div class='add'>+    switch (state) {</div><div class='add'>+        case EC_STATE_INIT:</div><div class='add'>+            ec_owner_set(fop-&gt;frame, fop-&gt;frame-&gt;root);</div><div class='add'>+</div><div class='add'>+            ec_heal_inodelk(heal, F_WRLCK, 1, 0, 0);</div><div class='add'>+</div><div class='add'>+            return EC_STATE_HEAL_DATA_COPY;</div><div class='add'>+</div><div class='add'>+        case EC_STATE_HEAL_DATA_COPY:</div><div class='add'>+            gf_msg_debug(fop-&gt;xl-&gt;name, 0, "%s: read/write starting",</div><div class='add'>+                         uuid_utoa(heal-&gt;fd-&gt;inode-&gt;gfid));</div><div class='add'>+            ec_heal_data_block(heal);</div><div class='add'>+</div><div class='add'>+            return EC_STATE_HEAL_DATA_UNLOCK;</div><div class='add'>+</div><div class='add'>+        case -EC_STATE_HEAL_DATA_COPY:</div><div class='add'>+        case -EC_STATE_HEAL_DATA_UNLOCK:</div><div class='add'>+        case EC_STATE_HEAL_DATA_UNLOCK:</div><div class='add'>+            ec_heal_inodelk(heal, F_UNLCK, 1, 0, 0);</div><div class='add'>+</div><div class='add'>+            return EC_STATE_REPORT;</div><div class='add'>+</div><div class='add'>+        case EC_STATE_REPORT:</div><div class='add'>+            if (fop-&gt;cbks.heal) {</div><div class='add'>+                fop-&gt;cbks.heal(fop-&gt;req_frame, fop-&gt;data, fop-&gt;xl, 0, 0,</div><div class='add'>+                               (heal-&gt;good | heal-&gt;bad), heal-&gt;good, heal-&gt;bad,</div><div class='add'>+                               0, NULL);</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            return EC_STATE_END;</div><div class='add'>+        case -EC_STATE_REPORT:</div><div class='add'>+            if (fop-&gt;cbks.heal) {</div><div class='add'>+                fop-&gt;cbks.heal(fop-&gt;req_frame, fop-&gt;data, fop-&gt;xl, -1,</div><div class='add'>+                               fop-&gt;error, 0, 0, 0, 0, NULL);</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            return EC_STATE_END;</div><div class='add'>+        default:</div><div class='add'>+            gf_msg(fop-&gt;xl-&gt;name, GF_LOG_ERROR, 0, EC_MSG_UNHANDLED_STATE,</div><div class='add'>+                   "Unhandled state %d for %s", state, ec_fop_name(fop-&gt;id));</div><div class='add'>+</div><div class='add'>+            return EC_STATE_END;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*Takes lock */</div><div class='add'>+void</div><div class='add'>+ec_heal_block(call_frame_t *frame, xlator_t *this, uintptr_t target,</div><div class='add'>+              uint32_t fop_flags, fop_heal_cbk_t func, ec_heal_t *heal)</div><div class='add'>+{</div><div class='add'>+    ec_cbk_t callback = {.heal = func};</div><div class='add'>+    ec_fop_data_t *fop = NULL;</div><div class='add'>+    int32_t error = ENOMEM;</div><div class='add'>+</div><div class='add'>+    gf_msg_trace("ec", 0, "EC(HEAL) %p", frame);</div><div class='add'>+</div><div class='add'>+    VALIDATE_OR_GOTO(this, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, this-&gt;private, out);</div><div class='add'>+</div><div class='add'>+    fop = ec_fop_data_allocate(frame, this, EC_FOP_HEAL, 0, target, fop_flags,</div><div class='add'>+                               NULL, ec_manager_heal_block, callback, heal);</div><div class='add'>+    if (fop == NULL)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    error = 0;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (fop != NULL) {</div><div class='add'>+        ec_manager(fop, error);</div><div class='add'>+    } else {</div><div class='add'>+        func(frame, heal, this, -1, error, 0, 0, 0, 0, NULL);</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_heal_block_done(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                   int32_t op_ret, int32_t op_errno, uintptr_t mask,</div><div class='add'>+                   uintptr_t good, uintptr_t bad, uint32_t pending,</div><div class='add'>+                   dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    ec_heal_t *heal = cookie;</div><div class='add'>+</div><div class='add'>+    if (heal-&gt;fop) {</div><div class='add'>+        heal-&gt;fop-&gt;heal = NULL;</div><div class='add'>+    }</div><div class='add'>+    heal-&gt;fop = NULL;</div><div class='add'>+    heal-&gt;error = op_ret &lt; 0 ? op_errno : 0;</div><div class='add'>+    syncbarrier_wake(heal-&gt;data);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+ec_sync_heal_block(call_frame_t *frame, xlator_t *this, ec_heal_t *heal)</div><div class='add'>+{</div><div class='add'>+    ec_heal_block(frame, this, heal-&gt;bad | heal-&gt;good, EC_MINIMUM_ONE,</div><div class='add'>+                  ec_heal_block_done, heal);</div><div class='add'>+    syncbarrier_wait(heal-&gt;data, 1);</div><div class='add'>+    if (heal-&gt;error != 0) {</div><div class='add'>+        return -heal-&gt;error;</div><div class='add'>+    }</div><div class='add'>+    if (heal-&gt;bad == 0)</div><div class='add'>+        return -ENOTCONN;</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+ec_rebuild_data(call_frame_t *frame, ec_t *ec, fd_t *fd, uint64_t size,</div><div class='add'>+                unsigned char *sources, unsigned char *healed_sinks)</div><div class='add'>+{</div><div class='add'>+    ec_heal_t *heal = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    syncbarrier_t barrier;</div><div class='add'>+</div><div class='add'>+    if (syncbarrier_init(&amp;barrier))</div><div class='add'>+        return -ENOMEM;</div><div class='add'>+</div><div class='add'>+    heal = alloca0(sizeof(*heal));</div><div class='add'>+    heal-&gt;fd = fd_ref(fd);</div><div class='add'>+    heal-&gt;xl = ec-&gt;xl;</div><div class='add'>+    heal-&gt;data = &amp;barrier;</div><div class='add'>+    ec_adjust_size_up(ec, &amp;size, _gf_false);</div><div class='add'>+    heal-&gt;total_size = size;</div><div class='add'>+    heal-&gt;size = (128 * GF_UNIT_KB * (ec-&gt;self_heal_window_size));</div><div class='add'>+    /* We need to adjust the size to a multiple of the stripe size of the</div><div class='add'>+     * volume. Otherwise writes would need to fill gaps (head and/or tail)</div><div class='add'>+     * with existent data from the bad bricks. This could be garbage on a</div><div class='add'>+     * damaged file or it could fail if there aren't enough bricks. */</div><div class='add'>+    heal-&gt;size -= heal-&gt;size % ec-&gt;stripe_size;</div><div class='add'>+    heal-&gt;bad = ec_char_array_to_mask(healed_sinks, ec-&gt;nodes);</div><div class='add'>+    heal-&gt;good = ec_char_array_to_mask(sources, ec-&gt;nodes);</div><div class='add'>+    heal-&gt;iatt.ia_type = IA_IFREG;</div><div class='add'>+    LOCK_INIT(&amp;heal-&gt;lock);</div><div class='add'>+</div><div class='add'>+    for (heal-&gt;offset = 0; (heal-&gt;offset &lt; size) &amp;&amp; !heal-&gt;done;</div><div class='add'>+         heal-&gt;offset += heal-&gt;size) {</div><div class='add'>+        /* We immediately abort any heal if a shutdown request has been</div><div class='add'>+         * received to avoid delays. The healing of this file will be</div><div class='add'>+         * restarted by another SHD or other client that accesses the</div><div class='add'>+         * file. */</div><div class='add'>+        if (ec-&gt;shutdown) {</div><div class='add'>+            gf_msg_debug(ec-&gt;xl-&gt;name, 0,</div><div class='add'>+                         "Cancelling heal because "</div><div class='add'>+                         "EC is stopping.");</div><div class='add'>+            ret = -ENOTCONN;</div><div class='add'>+            break;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        gf_msg_debug(ec-&gt;xl-&gt;name, 0,</div><div class='add'>+                     "%s: sources: %d, sinks: "</div><div class='add'>+                     "%d, offset: %" PRIu64 " bsize: %" PRIu64,</div><div class='add'>+                     uuid_utoa(fd-&gt;inode-&gt;gfid), EC_COUNT(sources, ec-&gt;nodes),</div><div class='add'>+                     EC_COUNT(healed_sinks, ec-&gt;nodes), heal-&gt;offset,</div><div class='add'>+                     heal-&gt;size);</div><div class='add'>+        ret = ec_sync_heal_block(frame, ec-&gt;xl, heal);</div><div class='add'>+        if (ret &lt; 0)</div><div class='add'>+            break;</div><div class='add'>+    }</div><div class='add'>+    memset(healed_sinks, 0, ec-&gt;nodes);</div><div class='add'>+    ec_mask_to_char_array(heal-&gt;bad, healed_sinks, ec-&gt;nodes);</div><div class='add'>+    fd_unref(heal-&gt;fd);</div><div class='add'>+    LOCK_DESTROY(&amp;heal-&gt;lock);</div><div class='add'>+    syncbarrier_destroy(heal-&gt;data);</div><div class='add'>+    if (ret &lt; 0)</div><div class='add'>+        gf_msg_debug(ec-&gt;xl-&gt;name, 0, "%s: heal failed %s",</div><div class='add'>+                     uuid_utoa(fd-&gt;inode-&gt;gfid), strerror(-ret));</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+__ec_heal_trim_sinks(call_frame_t *frame, ec_t *ec, fd_t *fd,</div><div class='add'>+                     unsigned char *healed_sinks, unsigned char *trim,</div><div class='add'>+                     uint64_t size)</div><div class='add'>+{</div><div class='add'>+    default_args_cbk_t *replies = NULL;</div><div class='add'>+    unsigned char *output = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    int i = 0;</div><div class='add'>+    off_t trim_offset = 0;</div><div class='add'>+</div><div class='add'>+    EC_REPLIES_ALLOC(replies, ec-&gt;nodes);</div><div class='add'>+    output = alloca0(ec-&gt;nodes);</div><div class='add'>+</div><div class='add'>+    if (EC_COUNT(trim, ec-&gt;nodes) == 0) {</div><div class='add'>+        ret = 0;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    trim_offset = size;</div><div class='add'>+    ec_adjust_offset_up(ec, &amp;trim_offset, _gf_true);</div><div class='add'>+    ret = cluster_ftruncate(ec-&gt;xl_list, trim, ec-&gt;nodes, replies, output,</div><div class='add'>+                            frame, ec-&gt;xl, fd, trim_offset, NULL);</div><div class='add'>+    for (i = 0; i &lt; ec-&gt;nodes; i++) {</div><div class='add'>+        if (!output[i] &amp;&amp; trim[i])</div><div class='add'>+            healed_sinks[i] = 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (EC_COUNT(healed_sinks, ec-&gt;nodes) == 0) {</div><div class='add'>+        ret = -ENOTCONN;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    cluster_replies_wipe(replies, ec-&gt;nodes);</div><div class='add'>+    if (ret &lt; 0)</div><div class='add'>+        gf_msg_debug(ec-&gt;xl-&gt;name, 0, "%s: heal failed %s",</div><div class='add'>+                     uuid_utoa(fd-&gt;inode-&gt;gfid), strerror(-ret));</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+ec_data_undo_pending(call_frame_t *frame, ec_t *ec, fd_t *fd, dict_t *xattr,</div><div class='add'>+                     uint64_t *versions, uint64_t *dirty, uint64_t *size,</div><div class='add'>+                     int source, gf_boolean_t erase_dirty, int idx)</div><div class='add'>+{</div><div class='add'>+    uint64_t versions_xattr[2] = {0};</div><div class='add'>+    uint64_t dirty_xattr[2] = {0};</div><div class='add'>+    uint64_t allzero[2] = {0};</div><div class='add'>+    uint64_t size_xattr = 0;</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    versions_xattr[EC_DATA_TXN] = hton64(versions[source] - versions[idx]);</div><div class='add'>+    ret = dict_set_static_bin(xattr, EC_XATTR_VERSION, versions_xattr,</div><div class='add'>+                              sizeof(versions_xattr));</div><div class='add'>+    if (ret &lt; 0)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    size_xattr = hton64(size[source] - size[idx]);</div><div class='add'>+    ret = dict_set_static_bin(xattr, EC_XATTR_SIZE, &amp;size_xattr,</div><div class='add'>+                              sizeof(size_xattr));</div><div class='add'>+    if (ret &lt; 0)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    if (erase_dirty) {</div><div class='add'>+        dirty_xattr[EC_DATA_TXN] = hton64(-dirty[idx]);</div><div class='add'>+        ret = dict_set_static_bin(xattr, EC_XATTR_DIRTY, dirty_xattr,</div><div class='add'>+                                  sizeof(dirty_xattr));</div><div class='add'>+        if (ret &lt; 0)</div><div class='add'>+            goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if ((memcmp(versions_xattr, allzero, sizeof(allzero)) == 0) &amp;&amp;</div><div class='add'>+        (memcmp(dirty_xattr, allzero, sizeof(allzero)) == 0) &amp;&amp;</div><div class='add'>+        (size_xattr == 0)) {</div><div class='add'>+        ret = 0;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = syncop_fxattrop(ec-&gt;xl_list[idx], fd, GF_XATTROP_ADD_ARRAY64, xattr,</div><div class='add'>+                          NULL, NULL, NULL);</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+__ec_fd_data_adjust_versions(call_frame_t *frame, ec_t *ec, fd_t *fd,</div><div class='add'>+                             unsigned char *sources,</div><div class='add'>+                             unsigned char *healed_sinks, uint64_t *versions,</div><div class='add'>+                             uint64_t *dirty, uint64_t *size)</div><div class='add'>+{</div><div class='add'>+    dict_t *xattr = NULL;</div><div class='add'>+    int i = 0;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    int op_ret = 0;</div><div class='add'>+    int source = -1;</div><div class='add'>+    gf_boolean_t erase_dirty = _gf_false;</div><div class='add'>+</div><div class='add'>+    xattr = dict_new();</div><div class='add'>+    if (!xattr) {</div><div class='add'>+        op_ret = -ENOMEM;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* dirty xattr represents if the file needs heal. Unless all the</div><div class='add'>+     * copies are healed, don't erase it */</div><div class='add'>+    if (EC_COUNT(sources, ec-&gt;nodes) + EC_COUNT(healed_sinks, ec-&gt;nodes) ==</div><div class='add'>+        ec-&gt;nodes)</div><div class='add'>+        erase_dirty = _gf_true;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; ec-&gt;nodes; i++) {</div><div class='add'>+        if (sources[i]) {</div><div class='add'>+            source = i;</div><div class='add'>+            break;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (source == -1) {</div><div class='add'>+        op_ret = -ENOTCONN;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; ec-&gt;nodes; i++) {</div><div class='add'>+        if (healed_sinks[i]) {</div><div class='add'>+            ret = ec_data_undo_pending(frame, ec, fd, xattr, versions, dirty,</div><div class='add'>+                                       size, source, erase_dirty, i);</div><div class='add'>+            if (ret &lt; 0)</div><div class='add'>+                goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (!erase_dirty)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; ec-&gt;nodes; i++) {</div><div class='add'>+        if (sources[i]) {</div><div class='add'>+            ret = ec_data_undo_pending(frame, ec, fd, xattr, versions, dirty,</div><div class='add'>+                                       size, source, erase_dirty, i);</div><div class='add'>+            if (ret &lt; 0)</div><div class='add'>+                continue;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+out:</div><div class='add'>+    if (xattr)</div><div class='add'>+        dict_unref(xattr);</div><div class='add'>+    return op_ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+ec_restore_time_and_adjust_versions(call_frame_t *frame, ec_t *ec, fd_t *fd,</div><div class='add'>+                                    unsigned char *sources,</div><div class='add'>+                                    unsigned char *healed_sinks,</div><div class='add'>+                                    uint64_t *versions, uint64_t *dirty,</div><div class='add'>+                                    uint64_t *size)</div><div class='add'>+{</div><div class='add'>+    unsigned char *locked_on = NULL;</div><div class='add'>+    unsigned char *participants = NULL;</div><div class='add'>+    unsigned char *output = NULL;</div><div class='add'>+    default_args_cbk_t *replies = NULL;</div><div class='add'>+    unsigned char *postsh_sources = NULL;</div><div class='add'>+    unsigned char *postsh_healed_sinks = NULL;</div><div class='add'>+    unsigned char *postsh_trim = NULL;</div><div class='add'>+    uint64_t *postsh_versions = NULL;</div><div class='add'>+    uint64_t *postsh_dirty = NULL;</div><div class='add'>+    uint64_t *postsh_size = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    int i = 0;</div><div class='add'>+    struct iatt source_buf = {0};</div><div class='add'>+    loc_t loc = {0};</div><div class='add'>+</div><div class='add'>+    locked_on = alloca0(ec-&gt;nodes);</div><div class='add'>+    output = alloca0(ec-&gt;nodes);</div><div class='add'>+    participants = alloca0(ec-&gt;nodes);</div><div class='add'>+    postsh_sources = alloca0(ec-&gt;nodes);</div><div class='add'>+    postsh_healed_sinks = alloca0(ec-&gt;nodes);</div><div class='add'>+    postsh_trim = alloca0(ec-&gt;nodes);</div><div class='add'>+    postsh_versions = alloca0(ec-&gt;nodes * sizeof(*postsh_versions));</div><div class='add'>+    postsh_dirty = alloca0(ec-&gt;nodes * sizeof(*postsh_dirty));</div><div class='add'>+    postsh_size = alloca0(ec-&gt;nodes * sizeof(*postsh_size));</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; ec-&gt;nodes; i++) {</div><div class='add'>+        if (healed_sinks[i] || sources[i])</div><div class='add'>+            participants[i] = 1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    EC_REPLIES_ALLOC(replies, ec-&gt;nodes);</div><div class='add'>+    ret = cluster_inodelk(ec-&gt;xl_list, participants, ec-&gt;nodes, replies,</div><div class='add'>+                          locked_on, frame, ec-&gt;xl, ec-&gt;xl-&gt;name, fd-&gt;inode, 0,</div><div class='add'>+                          0);</div><div class='add'>+    {</div><div class='add'>+        if (ret &lt;= ec-&gt;fragments) {</div><div class='add'>+            gf_msg_debug(ec-&gt;xl-&gt;name, 0,</div><div class='add'>+                         "%s: Skipping heal "</div><div class='add'>+                         "as only %d number of subvolumes could "</div><div class='add'>+                         "be locked",</div><div class='add'>+                         uuid_utoa(fd-&gt;inode-&gt;gfid), ret);</div><div class='add'>+            ret = -ENOTCONN;</div><div class='add'>+            goto unlock;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        ret = __ec_heal_data_prepare(frame, ec, fd, locked_on, postsh_versions,</div><div class='add'>+                                     postsh_dirty, postsh_size, postsh_sources,</div><div class='add'>+                                     postsh_healed_sinks, postsh_trim,</div><div class='add'>+                                     &amp;source_buf);</div><div class='add'>+        if (ret &lt; 0)</div><div class='add'>+            goto unlock;</div><div class='add'>+</div><div class='add'>+        loc.inode = inode_ref(fd-&gt;inode);</div><div class='add'>+        gf_uuid_copy(loc.gfid, fd-&gt;inode-&gt;gfid);</div><div class='add'>+        ret = cluster_setattr(</div><div class='add'>+            ec-&gt;xl_list, healed_sinks, ec-&gt;nodes, replies, output, frame,</div><div class='add'>+            ec-&gt;xl, &amp;loc, &amp;source_buf,</div><div class='add'>+            GF_SET_ATTR_ATIME | GF_SET_ATTR_MTIME | GF_SET_ATTR_CTIME, NULL);</div><div class='add'>+        EC_INTERSECT(healed_sinks, healed_sinks, output, ec-&gt;nodes);</div><div class='add'>+        if (EC_COUNT(healed_sinks, ec-&gt;nodes) == 0) {</div><div class='add'>+            ret = -ENOTCONN;</div><div class='add'>+            goto unlock;</div><div class='add'>+        }</div><div class='add'>+        ret = __ec_fd_data_adjust_versions(frame, ec, fd, sources, healed_sinks,</div><div class='add'>+                                           versions, dirty, size);</div><div class='add'>+    }</div><div class='add'>+unlock:</div><div class='add'>+    cluster_uninodelk(ec-&gt;xl_list, locked_on, ec-&gt;nodes, replies, output, frame,</div><div class='add'>+                      ec-&gt;xl, ec-&gt;xl-&gt;name, fd-&gt;inode, 0, 0);</div><div class='add'>+    cluster_replies_wipe(replies, ec-&gt;nodes);</div><div class='add'>+    loc_wipe(&amp;loc);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+__ec_heal_data(call_frame_t *frame, ec_t *ec, fd_t *fd, unsigned char *heal_on,</div><div class='add'>+               unsigned char *sources, unsigned char *healed_sinks)</div><div class='add'>+{</div><div class='add'>+    unsigned char *locked_on = NULL;</div><div class='add'>+    unsigned char *output = NULL;</div><div class='add'>+    uint64_t *versions = NULL;</div><div class='add'>+    uint64_t *dirty = NULL;</div><div class='add'>+    uint64_t *size = NULL;</div><div class='add'>+    unsigned char *trim = NULL;</div><div class='add'>+    default_args_cbk_t *replies = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    int source = 0;</div><div class='add'>+</div><div class='add'>+    locked_on = alloca0(ec-&gt;nodes);</div><div class='add'>+    output = alloca0(ec-&gt;nodes);</div><div class='add'>+    trim = alloca0(ec-&gt;nodes);</div><div class='add'>+    versions = alloca0(ec-&gt;nodes * sizeof(*versions));</div><div class='add'>+    dirty = alloca0(ec-&gt;nodes * sizeof(*dirty));</div><div class='add'>+    size = alloca0(ec-&gt;nodes * sizeof(*size));</div><div class='add'>+</div><div class='add'>+    EC_REPLIES_ALLOC(replies, ec-&gt;nodes);</div><div class='add'>+    ret = cluster_inodelk(ec-&gt;xl_list, heal_on, ec-&gt;nodes, replies, locked_on,</div><div class='add'>+                          frame, ec-&gt;xl, ec-&gt;xl-&gt;name, fd-&gt;inode, 0, 0);</div><div class='add'>+    {</div><div class='add'>+        if (ret &lt;= ec-&gt;fragments) {</div><div class='add'>+            gf_msg_debug(ec-&gt;xl-&gt;name, 0,</div><div class='add'>+                         "%s: Skipping heal "</div><div class='add'>+                         "as only %d number of subvolumes could "</div><div class='add'>+                         "be locked",</div><div class='add'>+                         uuid_utoa(fd-&gt;inode-&gt;gfid), ret);</div><div class='add'>+            ret = -ENOTCONN;</div><div class='add'>+            goto unlock;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        ret = __ec_heal_data_prepare(frame, ec, fd, locked_on, versions, dirty,</div><div class='add'>+                                     size, sources, healed_sinks, trim, NULL);</div><div class='add'>+        if (ret &lt; 0)</div><div class='add'>+            goto unlock;</div><div class='add'>+</div><div class='add'>+        if (EC_COUNT(healed_sinks, ec-&gt;nodes) == 0) {</div><div class='add'>+            ret = __ec_fd_data_adjust_versions(</div><div class='add'>+                frame, ec, fd, sources, healed_sinks, versions, dirty, size);</div><div class='add'>+            goto unlock;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        source = ret;</div><div class='add'>+        ret = __ec_heal_mark_sinks(frame, ec, fd, versions, healed_sinks);</div><div class='add'>+        if (ret &lt; 0)</div><div class='add'>+            goto unlock;</div><div class='add'>+</div><div class='add'>+        ret = __ec_heal_trim_sinks(frame, ec, fd, healed_sinks, trim,</div><div class='add'>+                                   size[source]);</div><div class='add'>+    }</div><div class='add'>+unlock:</div><div class='add'>+    cluster_uninodelk(ec-&gt;xl_list, locked_on, ec-&gt;nodes, replies, output, frame,</div><div class='add'>+                      ec-&gt;xl, ec-&gt;xl-&gt;name, fd-&gt;inode, 0, 0);</div><div class='add'>+    if (ret &lt; 0)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    if (EC_COUNT(healed_sinks, ec-&gt;nodes) == 0)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    gf_msg_debug(ec-&gt;xl-&gt;name, 0,</div><div class='add'>+                 "%s: sources: %d, sinks: "</div><div class='add'>+                 "%d",</div><div class='add'>+                 uuid_utoa(fd-&gt;inode-&gt;gfid), EC_COUNT(sources, ec-&gt;nodes),</div><div class='add'>+                 EC_COUNT(healed_sinks, ec-&gt;nodes));</div><div class='add'>+</div><div class='add'>+    ret = ec_rebuild_data(frame, ec, fd, size[source], sources, healed_sinks);</div><div class='add'>+    if (ret &lt; 0)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    ret = ec_restore_time_and_adjust_versions(</div><div class='add'>+        frame, ec, fd, sources, healed_sinks, versions, dirty, size);</div><div class='add'>+out:</div><div class='add'>+    cluster_replies_wipe(replies, ec-&gt;nodes);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+ec_heal_data(call_frame_t *frame, ec_t *ec, gf_boolean_t block, inode_t *inode,</div><div class='add'>+             unsigned char *sources, unsigned char *healed_sinks)</div><div class='add'>+{</div><div class='add'>+    unsigned char *locked_on = NULL;</div><div class='add'>+    unsigned char *up_subvols = NULL;</div><div class='add'>+    unsigned char *output = NULL;</div><div class='add'>+    default_args_cbk_t *replies = NULL;</div><div class='add'>+    fd_t *fd = NULL;</div><div class='add'>+    loc_t loc = {0};</div><div class='add'>+    char selfheal_domain[1024] = {0};</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    EC_REPLIES_ALLOC(replies, ec-&gt;nodes);</div><div class='add'>+</div><div class='add'>+    locked_on = alloca0(ec-&gt;nodes);</div><div class='add'>+    output = alloca0(ec-&gt;nodes);</div><div class='add'>+    up_subvols = alloca0(ec-&gt;nodes);</div><div class='add'>+    loc.inode = inode_ref(inode);</div><div class='add'>+    gf_uuid_copy(loc.gfid, inode-&gt;gfid);</div><div class='add'>+</div><div class='add'>+    fd = fd_create(inode, 0);</div><div class='add'>+    if (!fd) {</div><div class='add'>+        ret = -ENOMEM;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ec_mask_to_char_array(ec-&gt;xl_up, up_subvols, ec-&gt;nodes);</div><div class='add'>+</div><div class='add'>+    ret = cluster_open(ec-&gt;xl_list, up_subvols, ec-&gt;nodes, replies, output,</div><div class='add'>+                       frame, ec-&gt;xl, &amp;loc, O_RDWR | O_LARGEFILE, fd, NULL);</div><div class='add'>+    if (ret &lt;= ec-&gt;fragments) {</div><div class='add'>+        ret = -ENOTCONN;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    fd_bind(fd);</div><div class='add'>+    sprintf(selfheal_domain, "%s:self-heal", ec-&gt;xl-&gt;name);</div><div class='add'>+    /*If other processes are already doing the heal, don't block*/</div><div class='add'>+    if (block) {</div><div class='add'>+        ret = cluster_inodelk(ec-&gt;xl_list, output, ec-&gt;nodes, replies,</div><div class='add'>+                              locked_on, frame, ec-&gt;xl, selfheal_domain, inode,</div><div class='add'>+                              0, 0);</div><div class='add'>+    } else {</div><div class='add'>+        ret = cluster_tiebreaker_inodelk(ec-&gt;xl_list, output, ec-&gt;nodes,</div><div class='add'>+                                         replies, locked_on, frame, ec-&gt;xl,</div><div class='add'>+                                         selfheal_domain, inode, 0, 0);</div><div class='add'>+    }</div><div class='add'>+    {</div><div class='add'>+        if (ret &lt;= ec-&gt;fragments) {</div><div class='add'>+            gf_msg_debug(ec-&gt;xl-&gt;name, 0,</div><div class='add'>+                         "%s: Skipping heal "</div><div class='add'>+                         "as only %d number of subvolumes could "</div><div class='add'>+                         "be locked",</div><div class='add'>+                         uuid_utoa(inode-&gt;gfid), ret);</div><div class='add'>+            ret = -ENOTCONN;</div><div class='add'>+            goto unlock;</div><div class='add'>+        }</div><div class='add'>+        ret = __ec_heal_data(frame, ec, fd, locked_on, sources, healed_sinks);</div><div class='add'>+    }</div><div class='add'>+unlock:</div><div class='add'>+    cluster_uninodelk(ec-&gt;xl_list, locked_on, ec-&gt;nodes, replies, output, frame,</div><div class='add'>+                      ec-&gt;xl, selfheal_domain, inode, 0, 0);</div><div class='add'>+out:</div><div class='add'>+    if (fd)</div><div class='add'>+        fd_unref(fd);</div><div class='add'>+    loc_wipe(&amp;loc);</div><div class='add'>+    cluster_replies_wipe(replies, ec-&gt;nodes);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+ec_heal_purge_stale_index(call_frame_t *frame, ec_t *ec, inode_t *inode)</div><div class='add'>+{</div><div class='add'>+    int i = 0;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    dict_t **xattr = NULL;</div><div class='add'>+    loc_t loc = {0};</div><div class='add'>+    uint64_t dirty_xattr[EC_VERSION_SIZE] = {0};</div><div class='add'>+    unsigned char *on = NULL;</div><div class='add'>+    default_args_cbk_t *replies = NULL;</div><div class='add'>+    dict_t *dict = NULL;</div><div class='add'>+</div><div class='add'>+    /* Allocate the required memory */</div><div class='add'>+    loc.inode = inode_ref(inode);</div><div class='add'>+    gf_uuid_copy(loc.gfid, inode-&gt;gfid);</div><div class='add'>+    on = alloca0(ec-&gt;nodes);</div><div class='add'>+    EC_REPLIES_ALLOC(replies, ec-&gt;nodes);</div><div class='add'>+    xattr = GF_CALLOC(ec-&gt;nodes, sizeof(*xattr), gf_common_mt_pointer);</div><div class='add'>+    if (!xattr) {</div><div class='add'>+        ret = -ENOMEM;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    dict = dict_new();</div><div class='add'>+    if (!dict) {</div><div class='add'>+        ret = -ENOMEM;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    for (i = 0; i &lt; ec-&gt;nodes; i++) {</div><div class='add'>+        xattr[i] = dict;</div><div class='add'>+        on[i] = 1;</div><div class='add'>+    }</div><div class='add'>+    ret = dict_set_static_bin(dict, EC_XATTR_DIRTY, dirty_xattr,</div><div class='add'>+                              (sizeof(*dirty_xattr) * EC_VERSION_SIZE));</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        ret = -ENOMEM;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    PARALLEL_FOP_ONLIST(ec-&gt;xl_list, on, ec-&gt;nodes, replies, frame,</div><div class='add'>+                        ec_wind_xattrop_parallel, &amp;loc, GF_XATTROP_ADD_ARRAY64,</div><div class='add'>+                        xattr, NULL);</div><div class='add'>+out:</div><div class='add'>+    if (dict) {</div><div class='add'>+        dict_unref(dict);</div><div class='add'>+    }</div><div class='add'>+    if (xattr) {</div><div class='add'>+        GF_FREE(xattr);</div><div class='add'>+    }</div><div class='add'>+    cluster_replies_wipe(replies, ec-&gt;nodes);</div><div class='add'>+    loc_wipe(&amp;loc);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_heal_do(xlator_t *this, void *data, loc_t *loc, int32_t partial)</div><div class='add'>+{</div><div class='add'>+    call_frame_t *frame = NULL;</div><div class='add'>+    unsigned char *participants = NULL;</div><div class='add'>+    unsigned char *msources = NULL;</div><div class='add'>+    unsigned char *mhealed_sinks = NULL;</div><div class='add'>+    unsigned char *sources = NULL;</div><div class='add'>+    unsigned char *healed_sinks = NULL;</div><div class='add'>+    ec_t *ec = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    int op_ret = 0;</div><div class='add'>+    int op_errno = 0;</div><div class='add'>+    intptr_t mgood = 0;</div><div class='add'>+    intptr_t mbad = 0;</div><div class='add'>+    intptr_t good = 0;</div><div class='add'>+    intptr_t bad = 0;</div><div class='add'>+    uint32_t pending = 0;</div><div class='add'>+    ec_fop_data_t *fop = data;</div><div class='add'>+    gf_boolean_t blocking = _gf_false;</div><div class='add'>+    ec_heal_need_t need_heal = EC_HEAL_NONEED;</div><div class='add'>+    unsigned char *up_subvols = NULL;</div><div class='add'>+    char up_bricks[32];</div><div class='add'>+</div><div class='add'>+    ec = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    /* If it is heal request from getxattr, complete the heal and then</div><div class='add'>+     * unwind, if it is ec_heal with NULL as frame then no need to block</div><div class='add'>+     * the heal as the caller doesn't care about its completion. In case</div><div class='add'>+     * of heald whichever gets tiebreaking inodelk will take care of the</div><div class='add'>+     * heal, so no need to block*/</div><div class='add'>+    if (fop-&gt;req_frame &amp;&amp; !ec-&gt;shd.iamshd)</div><div class='add'>+        blocking = _gf_true;</div><div class='add'>+</div><div class='add'>+    frame = create_frame(this, this-&gt;ctx-&gt;pool);</div><div class='add'>+    if (!frame)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    ec_owner_set(frame, frame-&gt;root);</div><div class='add'>+    /*Do heal as root*/</div><div class='add'>+    frame-&gt;root-&gt;uid = 0;</div><div class='add'>+    frame-&gt;root-&gt;gid = 0;</div><div class='add'>+    /*Mark the fops as internal*/</div><div class='add'>+    frame-&gt;root-&gt;pid = GF_CLIENT_PID_SELF_HEALD;</div><div class='add'>+    participants = alloca0(ec-&gt;nodes);</div><div class='add'>+    ec_mask_to_char_array(ec-&gt;xl_up, participants, ec-&gt;nodes);</div><div class='add'>+</div><div class='add'>+    up_subvols = alloca0(ec-&gt;nodes);</div><div class='add'>+    ec_mask_to_char_array(ec-&gt;xl_up, up_subvols, ec-&gt;nodes);</div><div class='add'>+</div><div class='add'>+    if (loc-&gt;name &amp;&amp; strlen(loc-&gt;name)) {</div><div class='add'>+        ret = ec_heal_name(frame, ec, loc-&gt;parent, (char *)loc-&gt;name,</div><div class='add'>+                           participants);</div><div class='add'>+        if (ret &gt;= 0) {</div><div class='add'>+            gf_msg_debug(this-&gt;name, 0,</div><div class='add'>+                         "%s: name heal "</div><div class='add'>+                         "successful on %" PRIXPTR,</div><div class='add'>+                         loc-&gt;path,</div><div class='add'>+                         ec_char_array_to_mask(participants, ec-&gt;nodes));</div><div class='add'>+        } else {</div><div class='add'>+            gf_msg_debug(</div><div class='add'>+                this-&gt;name, 0,</div><div class='add'>+                "%s: name heal "</div><div class='add'>+                "failed. ret = %d, subvolumes up = %s",</div><div class='add'>+                loc-&gt;path, ret,</div><div class='add'>+                ec_bin(up_bricks, sizeof(up_bricks), ec-&gt;xl_up, ec-&gt;nodes));</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Mount triggers heal only when it detects that it must need heal, shd</div><div class='add'>+     * triggers heals periodically which need not be thorough*/</div><div class='add'>+    if (ec-&gt;shd.iamshd &amp;&amp; (ret &lt;= 0)) {</div><div class='add'>+        ec_heal_inspect(frame, ec, loc-&gt;inode, up_subvols, _gf_false, _gf_false,</div><div class='add'>+                        &amp;need_heal);</div><div class='add'>+</div><div class='add'>+        if (need_heal == EC_HEAL_PURGE_INDEX) {</div><div class='add'>+            gf_msg(ec-&gt;xl-&gt;name, GF_LOG_INFO, 0, EC_MSG_HEAL_FAIL,</div><div class='add'>+                   "Index entry needs to be purged for: %s ",</div><div class='add'>+                   uuid_utoa(loc-&gt;gfid));</div><div class='add'>+            /* We need to send zero-xattrop so that stale index entry could be</div><div class='add'>+             * removed. We need not take lock on this entry to do so as</div><div class='add'>+             * xattrop on a brick is atomic. */</div><div class='add'>+            ec_heal_purge_stale_index(frame, ec, loc-&gt;inode);</div><div class='add'>+            goto out;</div><div class='add'>+        } else if (need_heal == EC_HEAL_NONEED) {</div><div class='add'>+            gf_msg(ec-&gt;xl-&gt;name, GF_LOG_DEBUG, 0, EC_MSG_HEAL_FAIL,</div><div class='add'>+                   "Heal is not required for : %s ", uuid_utoa(loc-&gt;gfid));</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    sources = alloca0(ec-&gt;nodes);</div><div class='add'>+    healed_sinks = alloca0(ec-&gt;nodes);</div><div class='add'>+    if (IA_ISREG(loc-&gt;inode-&gt;ia_type)) {</div><div class='add'>+        ret = ec_heal_data(frame, ec, blocking, loc-&gt;inode, sources,</div><div class='add'>+                           healed_sinks);</div><div class='add'>+    } else if (IA_ISDIR(loc-&gt;inode-&gt;ia_type) &amp;&amp; !partial) {</div><div class='add'>+        ret = ec_heal_entry(frame, ec, loc-&gt;inode, sources, healed_sinks,</div><div class='add'>+                            &amp;pending);</div><div class='add'>+    } else {</div><div class='add'>+        ret = 0;</div><div class='add'>+        memcpy(sources, participants, ec-&gt;nodes);</div><div class='add'>+        memcpy(healed_sinks, participants, ec-&gt;nodes);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (ret == 0) {</div><div class='add'>+        good = ec_char_array_to_mask(sources, ec-&gt;nodes);</div><div class='add'>+        bad = ec_char_array_to_mask(healed_sinks, ec-&gt;nodes);</div><div class='add'>+    } else {</div><div class='add'>+        op_ret = -1;</div><div class='add'>+        op_errno = -ret;</div><div class='add'>+    }</div><div class='add'>+    msources = alloca0(ec-&gt;nodes);</div><div class='add'>+    mhealed_sinks = alloca0(ec-&gt;nodes);</div><div class='add'>+    ret = ec_heal_metadata(frame, ec, loc-&gt;inode, msources, mhealed_sinks);</div><div class='add'>+    if (ret == 0) {</div><div class='add'>+        mgood = ec_char_array_to_mask(msources, ec-&gt;nodes);</div><div class='add'>+        mbad = ec_char_array_to_mask(mhealed_sinks, ec-&gt;nodes);</div><div class='add'>+    } else {</div><div class='add'>+        op_ret = -1;</div><div class='add'>+        op_errno = -ret;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    ec_reset_entry_healing(fop);</div><div class='add'>+    if (fop-&gt;cbks.heal) {</div><div class='add'>+        fop-&gt;cbks.heal(fop-&gt;req_frame, fop-&gt;data, fop-&gt;xl, op_ret, op_errno,</div><div class='add'>+                       ec_char_array_to_mask(participants, ec-&gt;nodes),</div><div class='add'>+                       mgood &amp; good, mbad &amp; bad, pending, NULL);</div><div class='add'>+    }</div><div class='add'>+    if (frame)</div><div class='add'>+        STACK_DESTROY(frame-&gt;root);</div><div class='add'>+</div><div class='add'>+    return;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+ec_synctask_heal_wrap(void *opaque)</div><div class='add'>+{</div><div class='add'>+    ec_fop_data_t *fop = opaque;</div><div class='add'>+    ec_heal_do(fop-&gt;xl, fop, &amp;fop-&gt;loc[0], fop-&gt;int32);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+ec_heal_done(int ret, call_frame_t *heal, void *opaque)</div><div class='add'>+{</div><div class='add'>+    if (opaque)</div><div class='add'>+        ec_fop_data_release(opaque);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+ec_fop_data_t *</div><div class='add'>+__ec_dequeue_heals(ec_t *ec)</div><div class='add'>+{</div><div class='add'>+    ec_fop_data_t *fop = NULL;</div><div class='add'>+</div><div class='add'>+    if (list_empty(&amp;ec-&gt;heal_waiting))</div><div class='add'>+        goto none;</div><div class='add'>+</div><div class='add'>+    if ((ec-&gt;background_heals &gt; 0) &amp;&amp; (ec-&gt;healers &gt;= ec-&gt;background_heals))</div><div class='add'>+        goto none;</div><div class='add'>+</div><div class='add'>+    fop = list_entry(ec-&gt;heal_waiting.next, ec_fop_data_t, healer);</div><div class='add'>+    ec-&gt;heal_waiters--;</div><div class='add'>+    list_del_init(&amp;fop-&gt;healer);</div><div class='add'>+    list_add(&amp;fop-&gt;healer, &amp;ec-&gt;healing);</div><div class='add'>+    ec-&gt;healers++;</div><div class='add'>+    return fop;</div><div class='add'>+none:</div><div class='add'>+    gf_msg_debug(ec-&gt;xl-&gt;name, 0, "Num healers: %d, Num Waiters: %d",</div><div class='add'>+                 ec-&gt;healers, ec-&gt;heal_waiters);</div><div class='add'>+    return NULL;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_heal_fail(ec_t *ec, ec_fop_data_t *fop)</div><div class='add'>+{</div><div class='add'>+    if (fop-&gt;cbks.heal) {</div><div class='add'>+        fop-&gt;cbks.heal(fop-&gt;req_frame, fop-&gt;data, ec-&gt;xl, -1, fop-&gt;error, 0, 0,</div><div class='add'>+                       0, 0, NULL);</div><div class='add'>+    }</div><div class='add'>+    ec_fop_data_release(fop);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_launch_heal(ec_t *ec, ec_fop_data_t *fop)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+    call_frame_t *frame = NULL;</div><div class='add'>+</div><div class='add'>+    frame = create_frame(ec-&gt;xl, ec-&gt;xl-&gt;ctx-&gt;pool);</div><div class='add'>+    if (!frame) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ec_owner_set(frame, frame-&gt;root);</div><div class='add'>+    /*Do heal as root*/</div><div class='add'>+    frame-&gt;root-&gt;uid = 0;</div><div class='add'>+    frame-&gt;root-&gt;gid = 0;</div><div class='add'>+    /*Mark the fops as internal*/</div><div class='add'>+    frame-&gt;root-&gt;pid = GF_CLIENT_PID_SELF_HEALD;</div><div class='add'>+</div><div class='add'>+    ret = synctask_new(ec-&gt;xl-&gt;ctx-&gt;env, ec_synctask_heal_wrap, ec_heal_done,</div><div class='add'>+                       frame, fop);</div><div class='add'>+out:</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        ec_fop_set_error(fop, ENOMEM);</div><div class='add'>+        ec_heal_fail(ec, fop);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (frame)</div><div class='add'>+        STACK_DESTROY(frame-&gt;root);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_handle_healers_done(ec_fop_data_t *fop)</div><div class='add'>+{</div><div class='add'>+    ec_t *ec = fop-&gt;xl-&gt;private;</div><div class='add'>+    ec_fop_data_t *heal_fop = NULL;</div><div class='add'>+</div><div class='add'>+    if (list_empty(&amp;fop-&gt;healer))</div><div class='add'>+        return;</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;ec-&gt;lock);</div><div class='add'>+</div><div class='add'>+    list_del_init(&amp;fop-&gt;healer);</div><div class='add'>+</div><div class='add'>+    do {</div><div class='add'>+        ec-&gt;healers--;</div><div class='add'>+        heal_fop = __ec_dequeue_heals(ec);</div><div class='add'>+</div><div class='add'>+        if ((heal_fop != NULL) &amp;&amp; ec-&gt;shutdown) {</div><div class='add'>+            /* This will prevent ec_handle_healers_done() to be</div><div class='add'>+             * called recursively. That would be problematic if</div><div class='add'>+             * the queue is too big. */</div><div class='add'>+            list_del_init(&amp;heal_fop-&gt;healer);</div><div class='add'>+</div><div class='add'>+            UNLOCK(&amp;ec-&gt;lock);</div><div class='add'>+</div><div class='add'>+            ec_fop_set_error(fop, ENOTCONN);</div><div class='add'>+            ec_heal_fail(ec, heal_fop);</div><div class='add'>+</div><div class='add'>+            LOCK(&amp;ec-&gt;lock);</div><div class='add'>+        }</div><div class='add'>+    } while ((heal_fop != NULL) &amp;&amp; ec-&gt;shutdown);</div><div class='add'>+</div><div class='add'>+    UNLOCK(&amp;ec-&gt;lock);</div><div class='add'>+</div><div class='add'>+    if (heal_fop)</div><div class='add'>+        ec_launch_heal(ec, heal_fop);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+gf_boolean_t</div><div class='add'>+ec_is_entry_healing(ec_fop_data_t *fop)</div><div class='add'>+{</div><div class='add'>+    ec_inode_t *ctx = NULL;</div><div class='add'>+    int32_t heal_count = 0;</div><div class='add'>+    loc_t *loc = NULL;</div><div class='add'>+</div><div class='add'>+    loc = &amp;fop-&gt;loc[0];</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;loc-&gt;inode-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        ctx = __ec_inode_get(loc-&gt;inode, fop-&gt;xl);</div><div class='add'>+        if (ctx) {</div><div class='add'>+            heal_count = ctx-&gt;heal_count;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    UNLOCK(&amp;loc-&gt;inode-&gt;lock);</div><div class='add'>+    GF_ASSERT(heal_count &gt;= 0);</div><div class='add'>+    return heal_count;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_heal_throttle(xlator_t *this, ec_fop_data_t *fop)</div><div class='add'>+{</div><div class='add'>+    gf_boolean_t can_heal = _gf_true;</div><div class='add'>+    ec_t *ec = this-&gt;private;</div><div class='add'>+    ec_fop_data_t *fop_rel = NULL;</div><div class='add'>+</div><div class='add'>+    if (fop-&gt;req_frame == NULL) {</div><div class='add'>+        LOCK(&amp;ec-&gt;lock);</div><div class='add'>+        {</div><div class='add'>+            if ((ec-&gt;background_heals &gt; 0) &amp;&amp;</div><div class='add'>+                (ec-&gt;heal_wait_qlen + ec-&gt;background_heals) &gt;</div><div class='add'>+                    (ec-&gt;heal_waiters + ec-&gt;healers)) {</div><div class='add'>+                if (!ec_is_entry_healing(fop)) {</div><div class='add'>+                    list_add_tail(&amp;fop-&gt;healer, &amp;ec-&gt;heal_waiting);</div><div class='add'>+                    ec-&gt;heal_waiters++;</div><div class='add'>+                    ec_set_entry_healing(fop);</div><div class='add'>+                } else {</div><div class='add'>+                    fop_rel = fop;</div><div class='add'>+                }</div><div class='add'>+                fop = __ec_dequeue_heals(ec);</div><div class='add'>+            } else {</div><div class='add'>+                can_heal = _gf_false;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+        UNLOCK(&amp;ec-&gt;lock);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (can_heal) {</div><div class='add'>+        if (fop) {</div><div class='add'>+            if (fop-&gt;req_frame != NULL) {</div><div class='add'>+                ec_set_entry_healing(fop);</div><div class='add'>+            }</div><div class='add'>+            ec_launch_heal(ec, fop);</div><div class='add'>+        }</div><div class='add'>+    } else {</div><div class='add'>+        gf_msg_debug(this-&gt;name, 0,</div><div class='add'>+                     "Max number of heals are "</div><div class='add'>+                     "pending, background self-heal rejected");</div><div class='add'>+        ec_fop_set_error(fop, EBUSY);</div><div class='add'>+        ec_heal_fail(ec, fop);</div><div class='add'>+    }</div><div class='add'>+    if (fop_rel) {</div><div class='add'>+        ec_heal_done(0, NULL, fop_rel);</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_heal(call_frame_t *frame, xlator_t *this, uintptr_t target,</div><div class='add'>+        uint32_t fop_flags, fop_heal_cbk_t func, void *data, loc_t *loc,</div><div class='add'>+        int32_t partial, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    ec_cbk_t callback = {.heal = func};</div><div class='add'>+    ec_fop_data_t *fop = NULL;</div><div class='add'>+    int32_t err = EINVAL;</div><div class='add'>+</div><div class='add'>+    gf_msg_trace("ec", 0, "EC(HEAL) %p", frame);</div><div class='add'>+</div><div class='add'>+    VALIDATE_OR_GOTO(this, fail);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, this-&gt;private, fail);</div><div class='add'>+</div><div class='add'>+    if (!loc || !loc-&gt;inode || gf_uuid_is_null(loc-&gt;inode-&gt;gfid))</div><div class='add'>+        goto fail;</div><div class='add'>+</div><div class='add'>+    if (frame &amp;&amp; frame-&gt;local)</div><div class='add'>+        goto fail;</div><div class='add'>+    fop = ec_fop_data_allocate(frame, this, EC_FOP_HEAL, 0, target, fop_flags,</div><div class='add'>+                               NULL, NULL, callback, data);</div><div class='add'>+</div><div class='add'>+    err = ENOMEM;</div><div class='add'>+</div><div class='add'>+    if (fop == NULL)</div><div class='add'>+        goto fail;</div><div class='add'>+</div><div class='add'>+    fop-&gt;int32 = partial;</div><div class='add'>+</div><div class='add'>+    if (loc) {</div><div class='add'>+        if (loc_copy(&amp;fop-&gt;loc[0], loc) != 0)</div><div class='add'>+            goto fail;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (xdata)</div><div class='add'>+        fop-&gt;xdata = dict_ref(xdata);</div><div class='add'>+</div><div class='add'>+    ec_heal_throttle(this, fop);</div><div class='add'>+</div><div class='add'>+    return;</div><div class='add'>+</div><div class='add'>+fail:</div><div class='add'>+    if (fop)</div><div class='add'>+        ec_fop_data_release(fop);</div><div class='add'>+    if (func)</div><div class='add'>+        func(frame, data, this, -1, err, 0, 0, 0, 0, NULL);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+ec_replace_heal_done(int ret, call_frame_t *heal, void *opaque)</div><div class='add'>+{</div><div class='add'>+    ec_t *ec = opaque;</div><div class='add'>+    gf_boolean_t last_fop = _gf_false;</div><div class='add'>+</div><div class='add'>+    if (GF_ATOMIC_DEC(ec-&gt;async_fop_count) == 0) {</div><div class='add'>+        LOCK(&amp;ec-&gt;lock);</div><div class='add'>+        {</div><div class='add'>+            last_fop = __ec_is_last_fop(ec);</div><div class='add'>+        }</div><div class='add'>+        UNLOCK(&amp;ec-&gt;lock);</div><div class='add'>+    }</div><div class='add'>+    gf_msg_debug(ec-&gt;xl-&gt;name, 0, "getxattr on bricks is done ret %d", ret);</div><div class='add'>+</div><div class='add'>+    if (last_fop)</div><div class='add'>+        ec_pending_fops_completed(ec);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_replace_heal(ec_t *ec, inode_t *inode)</div><div class='add'>+{</div><div class='add'>+    loc_t loc = {0};</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    loc.inode = inode_ref(inode);</div><div class='add'>+    gf_uuid_copy(loc.gfid, inode-&gt;gfid);</div><div class='add'>+    ret = syncop_getxattr(ec-&gt;xl, &amp;loc, NULL, EC_XATTR_HEAL, NULL, NULL);</div><div class='add'>+    if (ret &lt; 0)</div><div class='add'>+        gf_msg_debug(ec-&gt;xl-&gt;name, 0, "Heal failed for replace brick ret = %d",</div><div class='add'>+                     ret);</div><div class='add'>+</div><div class='add'>+    /* Once the root inode has been checked, it might have triggered a</div><div class='add'>+     * self-heal on it after a replace brick command or for some other</div><div class='add'>+     * reason. It can also happen that the volume already had damaged</div><div class='add'>+     * files in the index, even if the heal on the root directory failed.</div><div class='add'>+     * In both cases we need to wake all index healers to continue</div><div class='add'>+     * healing remaining entries that are marked as dirty. */</div><div class='add'>+    ec_shd_index_healer_wake(ec);</div><div class='add'>+</div><div class='add'>+    loc_wipe(&amp;loc);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_replace_brick_heal_wrap(void *opaque)</div><div class='add'>+{</div><div class='add'>+    ec_t *ec = opaque;</div><div class='add'>+    inode_table_t *itable = NULL;</div><div class='add'>+    int32_t ret = -1;</div><div class='add'>+</div><div class='add'>+    if (ec-&gt;xl-&gt;itable)</div><div class='add'>+        itable = ec-&gt;xl-&gt;itable;</div><div class='add'>+    else</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    if (xlator_is_cleanup_starting(ec-&gt;xl))</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    ret = ec_replace_heal(ec, itable-&gt;root);</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_launch_replace_heal(ec_t *ec)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    ret = synctask_new(ec-&gt;xl-&gt;ctx-&gt;env, ec_replace_brick_heal_wrap,</div><div class='add'>+                       ec_replace_heal_done, NULL, ec);</div><div class='add'>+</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        gf_msg_debug(ec-&gt;xl-&gt;name, 0, "Heal failed for replace brick ret = %d",</div><div class='add'>+                     ret);</div><div class='add'>+        ec_replace_heal_done(-1, NULL, ec);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_set_heal_info(dict_t **dict_rsp, char *status)</div><div class='add'>+{</div><div class='add'>+    dict_t *dict = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    dict = dict_new();</div><div class='add'>+    if (!dict) {</div><div class='add'>+        ret = -ENOMEM;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    ret = dict_set_str(dict, "heal-info", status);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_msg(THIS-&gt;name, GF_LOG_WARNING, -ret, EC_MSG_HEAL_FAIL,</div><div class='add'>+               "Failed to set heal-info key to "</div><div class='add'>+               "%s",</div><div class='add'>+               status);</div><div class='add'>+        dict_unref(dict);</div><div class='add'>+        dict = NULL;</div><div class='add'>+    }</div><div class='add'>+    *dict_rsp = dict;</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int32_t</div><div class='add'>+_need_heal_calculate(ec_t *ec, uint64_t *dirty, unsigned char *sources,</div><div class='add'>+                     gf_boolean_t self_locked, int32_t lock_count,</div><div class='add'>+                     ec_heal_need_t *need_heal, uint64_t *versions)</div><div class='add'>+{</div><div class='add'>+    int i = 0;</div><div class='add'>+    int source_count = 0;</div><div class='add'>+</div><div class='add'>+    source_count = EC_COUNT(sources, ec-&gt;nodes);</div><div class='add'>+    if (source_count == ec-&gt;nodes) {</div><div class='add'>+        *need_heal = EC_HEAL_NONEED;</div><div class='add'>+        if (self_locked || lock_count == 0) {</div><div class='add'>+            for (i = 0; i &lt; ec-&gt;nodes; i++) {</div><div class='add'>+                if (dirty[i] || (versions[i] != versions[0])) {</div><div class='add'>+                    *need_heal = EC_HEAL_MUST;</div><div class='add'>+                    goto out;</div><div class='add'>+                }</div><div class='add'>+            }</div><div class='add'>+            /* If lock count is 0, all dirty flags are 0 and all the</div><div class='add'>+             * versions are macthing then why are we here. It looks</div><div class='add'>+             * like something went wrong while removing the index entries</div><div class='add'>+             * after completing a successful heal or fop. In this case</div><div class='add'>+             * we need to remove this index entry to avoid triggering heal</div><div class='add'>+             * in a loop and causing lookups again and again*/</div><div class='add'>+            *need_heal = EC_HEAL_PURGE_INDEX;</div><div class='add'>+        } else {</div><div class='add'>+            for (i = 0; i &lt; ec-&gt;nodes; i++) {</div><div class='add'>+                /* Since each lock can only increment the dirty</div><div class='add'>+                 * count once, if dirty is &gt; 1 it means that</div><div class='add'>+                 * another operation has left the dirty count</div><div class='add'>+                 * set and this indicates a problem in the</div><div class='add'>+                 * inode.*/</div><div class='add'>+                if (dirty[i] &gt; 1) {</div><div class='add'>+                    *need_heal = EC_HEAL_MUST;</div><div class='add'>+                    goto out;</div><div class='add'>+                }</div><div class='add'>+                if (dirty[i] != dirty[0] || (versions[i] != versions[0])) {</div><div class='add'>+                    *need_heal = EC_HEAL_MAYBE;</div><div class='add'>+                }</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+    } else {</div><div class='add'>+        *need_heal = EC_HEAL_MUST;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return source_count;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int32_t</div><div class='add'>+ec_need_metadata_heal(ec_t *ec, inode_t *inode, default_args_cbk_t *replies,</div><div class='add'>+                      int32_t lock_count, gf_boolean_t self_locked,</div><div class='add'>+                      gf_boolean_t thorough, ec_heal_need_t *need_heal)</div><div class='add'>+{</div><div class='add'>+    uint64_t *dirty = NULL;</div><div class='add'>+    unsigned char *sources = NULL;</div><div class='add'>+    unsigned char *healed_sinks = NULL;</div><div class='add'>+    uint64_t *meta_versions = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    sources = alloca0(ec-&gt;nodes);</div><div class='add'>+    healed_sinks = alloca0(ec-&gt;nodes);</div><div class='add'>+    dirty = alloca0(ec-&gt;nodes * sizeof(*dirty));</div><div class='add'>+    meta_versions = alloca0(ec-&gt;nodes * sizeof(*meta_versions));</div><div class='add'>+    ret = ec_heal_metadata_find_direction(ec, replies, meta_versions, dirty,</div><div class='add'>+                                          sources, healed_sinks);</div><div class='add'>+    if (ret &lt; 0 &amp;&amp; ret != -EIO) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = _need_heal_calculate(ec, dirty, sources, self_locked, lock_count,</div><div class='add'>+                               need_heal, meta_versions);</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int32_t</div><div class='add'>+ec_need_data_heal(ec_t *ec, inode_t *inode, default_args_cbk_t *replies,</div><div class='add'>+                  int32_t lock_count, gf_boolean_t self_locked,</div><div class='add'>+                  gf_boolean_t thorough, ec_heal_need_t *need_heal)</div><div class='add'>+{</div><div class='add'>+    uint64_t *dirty = NULL;</div><div class='add'>+    unsigned char *sources = NULL;</div><div class='add'>+    unsigned char *healed_sinks = NULL;</div><div class='add'>+    uint64_t *data_versions = NULL;</div><div class='add'>+    uint64_t *size = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    sources = alloca0(ec-&gt;nodes);</div><div class='add'>+    healed_sinks = alloca0(ec-&gt;nodes);</div><div class='add'>+    dirty = alloca0(ec-&gt;nodes * sizeof(*dirty));</div><div class='add'>+    data_versions = alloca0(ec-&gt;nodes * sizeof(*data_versions));</div><div class='add'>+    size = alloca0(ec-&gt;nodes * sizeof(*size));</div><div class='add'>+</div><div class='add'>+    /* When dd is going on and heal info is called there is a very good</div><div class='add'>+     * chance for on disk sizes to mismatch even though nothing is wrong</div><div class='add'>+     * we don't need ondisk size check there. But if the file is either</div><div class='add'>+     * self-locked or the caller wants a thorough check then make sure to</div><div class='add'>+     * perform on disk check also. */</div><div class='add'>+    ret = ec_heal_data_find_direction(</div><div class='add'>+        ec, replies, data_versions, dirty, size, sources, healed_sinks,</div><div class='add'>+        self_locked || thorough, EC_COMBINE_XDATA);</div><div class='add'>+    if (ret &lt; 0 &amp;&amp; ret != -EIO) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = _need_heal_calculate(ec, dirty, sources, self_locked, lock_count,</div><div class='add'>+                               need_heal, data_versions);</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int32_t</div><div class='add'>+ec_need_entry_heal(ec_t *ec, inode_t *inode, default_args_cbk_t *replies,</div><div class='add'>+                   int32_t lock_count, gf_boolean_t self_locked,</div><div class='add'>+                   gf_boolean_t thorough, ec_heal_need_t *need_heal)</div><div class='add'>+{</div><div class='add'>+    uint64_t *dirty = NULL;</div><div class='add'>+    unsigned char *sources = NULL;</div><div class='add'>+    unsigned char *healed_sinks = NULL;</div><div class='add'>+    uint64_t *data_versions = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    sources = alloca0(ec-&gt;nodes);</div><div class='add'>+    healed_sinks = alloca0(ec-&gt;nodes);</div><div class='add'>+    dirty = alloca0(ec-&gt;nodes * sizeof(*dirty));</div><div class='add'>+    data_versions = alloca0(ec-&gt;nodes * sizeof(*data_versions));</div><div class='add'>+</div><div class='add'>+    ret = ec_heal_entry_find_direction(ec, replies, data_versions, dirty,</div><div class='add'>+                                       sources, healed_sinks);</div><div class='add'>+    if (ret &lt; 0 &amp;&amp; ret != -EIO) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = _need_heal_calculate(ec, dirty, sources, self_locked, lock_count,</div><div class='add'>+                               need_heal, data_versions);</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int32_t</div><div class='add'>+ec_need_heal(ec_t *ec, inode_t *inode, default_args_cbk_t *replies,</div><div class='add'>+             int32_t lock_count, gf_boolean_t self_locked,</div><div class='add'>+             gf_boolean_t thorough, ec_heal_need_t *need_heal)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    ret = ec_need_metadata_heal(ec, inode, replies, lock_count, self_locked,</div><div class='add'>+                                thorough, need_heal);</div><div class='add'>+    if (ret &lt; 0)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    if (*need_heal == EC_HEAL_MUST)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    if (inode-&gt;ia_type == IA_IFREG) {</div><div class='add'>+        ret = ec_need_data_heal(ec, inode, replies, lock_count, self_locked,</div><div class='add'>+                                thorough, need_heal);</div><div class='add'>+    } else if (inode-&gt;ia_type == IA_IFDIR) {</div><div class='add'>+        ret = ec_need_entry_heal(ec, inode, replies, lock_count, self_locked,</div><div class='add'>+                                 thorough, need_heal);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_heal_inspect(call_frame_t *frame, ec_t *ec, inode_t *inode,</div><div class='add'>+                unsigned char *locked_on, gf_boolean_t self_locked,</div><div class='add'>+                gf_boolean_t thorough, ec_heal_need_t *need_heal)</div><div class='add'>+{</div><div class='add'>+    loc_t loc = {0};</div><div class='add'>+    int i = 0;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    dict_t *xdata = NULL;</div><div class='add'>+    uint64_t zero_array[2] = {0};</div><div class='add'>+    uint64_t zero_value = 0;</div><div class='add'>+    unsigned char *output = NULL;</div><div class='add'>+    default_args_cbk_t *replies = NULL;</div><div class='add'>+    int32_t lock_count = 0;</div><div class='add'>+</div><div class='add'>+    EC_REPLIES_ALLOC(replies, ec-&gt;nodes);</div><div class='add'>+    output = alloca0(ec-&gt;nodes);</div><div class='add'>+</div><div class='add'>+    loc.inode = inode_ref(inode);</div><div class='add'>+    gf_uuid_copy(loc.gfid, inode-&gt;gfid);</div><div class='add'>+</div><div class='add'>+    xdata = dict_new();</div><div class='add'>+    if (!xdata ||</div><div class='add'>+        dict_set_static_bin(xdata, EC_XATTR_VERSION, zero_array,</div><div class='add'>+                            sizeof(zero_array)) ||</div><div class='add'>+        dict_set_static_bin(xdata, EC_XATTR_DIRTY, zero_array,</div><div class='add'>+                            sizeof(zero_array)) ||</div><div class='add'>+        dict_set_static_bin(xdata, EC_XATTR_SIZE, &amp;zero_value,</div><div class='add'>+                            sizeof(zero_value))) {</div><div class='add'>+        ret = -ENOMEM;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (!self_locked) {</div><div class='add'>+        ret = dict_set_str(xdata, GLUSTERFS_INODELK_DOM_COUNT, ec-&gt;xl-&gt;name);</div><div class='add'>+        if (ret) {</div><div class='add'>+            ret = -ENOMEM;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = cluster_lookup(ec-&gt;xl_list, locked_on, ec-&gt;nodes, replies, output,</div><div class='add'>+                         frame, ec-&gt;xl, &amp;loc, xdata);</div><div class='add'>+</div><div class='add'>+    if (ret != ec-&gt;nodes) {</div><div class='add'>+        ret = ec-&gt;nodes;</div><div class='add'>+        *need_heal = EC_HEAL_MUST;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (self_locked)</div><div class='add'>+        goto need_heal;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; ec-&gt;nodes; i++) {</div><div class='add'>+        if (!output[i] || !replies[i].xdata) {</div><div class='add'>+            continue;</div><div class='add'>+        }</div><div class='add'>+        if ((dict_get_int32(replies[i].xdata, GLUSTERFS_INODELK_COUNT,</div><div class='add'>+                            &amp;lock_count) == 0) &amp;&amp;</div><div class='add'>+            lock_count &gt; 0) {</div><div class='add'>+            break;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+need_heal:</div><div class='add'>+    ret = ec_need_heal(ec, inode, replies, lock_count, self_locked, thorough,</div><div class='add'>+                       need_heal);</div><div class='add'>+out:</div><div class='add'>+    cluster_replies_wipe(replies, ec-&gt;nodes);</div><div class='add'>+    loc_wipe(&amp;loc);</div><div class='add'>+    if (xdata) {</div><div class='add'>+        dict_unref(xdata);</div><div class='add'>+    }</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_heal_locked_inspect(call_frame_t *frame, ec_t *ec, inode_t *inode,</div><div class='add'>+                       ec_heal_need_t *need_heal)</div><div class='add'>+{</div><div class='add'>+    unsigned char *locked_on = NULL;</div><div class='add'>+    unsigned char *up_subvols = NULL;</div><div class='add'>+    unsigned char *output = NULL;</div><div class='add'>+    default_args_cbk_t *replies = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    EC_REPLIES_ALLOC(replies, ec-&gt;nodes);</div><div class='add'>+    locked_on = alloca0(ec-&gt;nodes);</div><div class='add'>+    output = alloca0(ec-&gt;nodes);</div><div class='add'>+    up_subvols = alloca0(ec-&gt;nodes);</div><div class='add'>+    ec_mask_to_char_array(ec-&gt;xl_up, up_subvols, ec-&gt;nodes);</div><div class='add'>+</div><div class='add'>+    ret = cluster_inodelk(ec-&gt;xl_list, up_subvols, ec-&gt;nodes, replies,</div><div class='add'>+                          locked_on, frame, ec-&gt;xl, ec-&gt;xl-&gt;name, inode, 0, 0);</div><div class='add'>+    if (ret != ec-&gt;nodes) {</div><div class='add'>+        *need_heal = EC_HEAL_MUST;</div><div class='add'>+        goto unlock;</div><div class='add'>+    }</div><div class='add'>+    ret = ec_heal_inspect(frame, ec, inode, locked_on, _gf_true, _gf_true,</div><div class='add'>+                          need_heal);</div><div class='add'>+unlock:</div><div class='add'>+    cluster_uninodelk(ec-&gt;xl_list, locked_on, ec-&gt;nodes, replies, output, frame,</div><div class='add'>+                      ec-&gt;xl, ec-&gt;xl-&gt;name, inode, 0, 0);</div><div class='add'>+    cluster_replies_wipe(replies, ec-&gt;nodes);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_get_heal_info(xlator_t *this, loc_t *entry_loc, dict_t **dict_rsp)</div><div class='add'>+{</div><div class='add'>+    int ret = -ENOMEM;</div><div class='add'>+    ec_heal_need_t need_heal = EC_HEAL_NONEED;</div><div class='add'>+    call_frame_t *frame = NULL;</div><div class='add'>+    ec_t *ec = NULL;</div><div class='add'>+    unsigned char *up_subvols = NULL;</div><div class='add'>+    loc_t loc = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    VALIDATE_OR_GOTO(this, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, entry_loc, out);</div><div class='add'>+</div><div class='add'>+    ec = this-&gt;private;</div><div class='add'>+    up_subvols = alloca0(ec-&gt;nodes);</div><div class='add'>+    ec_mask_to_char_array(ec-&gt;xl_up, up_subvols, ec-&gt;nodes);</div><div class='add'>+</div><div class='add'>+    if (EC_COUNT(up_subvols, ec-&gt;nodes) != ec-&gt;nodes) {</div><div class='add'>+        need_heal = EC_HEAL_MUST;</div><div class='add'>+        goto set_heal;</div><div class='add'>+    }</div><div class='add'>+    frame = create_frame(this, this-&gt;ctx-&gt;pool);</div><div class='add'>+    if (!frame) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    ec_owner_set(frame, frame-&gt;root);</div><div class='add'>+    frame-&gt;root-&gt;uid = 0;</div><div class='add'>+    frame-&gt;root-&gt;gid = 0;</div><div class='add'>+    frame-&gt;root-&gt;pid = GF_CLIENT_PID_SELF_HEALD;</div><div class='add'>+</div><div class='add'>+    if (loc_copy(&amp;loc, entry_loc) != 0) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_ERROR, ENOMEM, EC_MSG_LOC_COPY_FAIL,</div><div class='add'>+               "Failed to copy a location.");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    if (!loc.inode) {</div><div class='add'>+        ret = syncop_inode_find(this, this, loc.gfid, &amp;loc.inode, NULL, NULL);</div><div class='add'>+        if (ret &lt; 0)</div><div class='add'>+            goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = ec_heal_inspect(frame, ec, loc.inode, up_subvols, _gf_false,</div><div class='add'>+                          _gf_false, &amp;need_heal);</div><div class='add'>+    if (ret == ec-&gt;nodes &amp;&amp; need_heal != EC_HEAL_MAYBE) {</div><div class='add'>+        goto set_heal;</div><div class='add'>+    }</div><div class='add'>+    need_heal = EC_HEAL_NONEED;</div><div class='add'>+    ret = ec_heal_locked_inspect(frame, ec, loc.inode, &amp;need_heal);</div><div class='add'>+    if (ret &lt; 0)</div><div class='add'>+        goto out;</div><div class='add'>+set_heal:</div><div class='add'>+    if (need_heal == EC_HEAL_MUST) {</div><div class='add'>+        ret = ec_set_heal_info(dict_rsp, "heal");</div><div class='add'>+    } else {</div><div class='add'>+        ret = ec_set_heal_info(dict_rsp, "no-heal");</div><div class='add'>+    }</div><div class='add'>+out:</div><div class='add'>+    if (frame) {</div><div class='add'>+        STACK_DESTROY(frame-&gt;root);</div><div class='add'>+    }</div><div class='add'>+    loc_wipe(&amp;loc);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='head'>diff --git a/xlators/cluster/ec/src/ec-heald.c b/xlators/cluster/ec/src/ec-heald.c<br/>new file mode 100644<br/>index 00000000000..5c1586bc9c5<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/xlators/cluster/ec/src/ec-heald.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>xlators/cluster/ec/src/ec-heald.c</a></div><div class='hunk'>@@ -0,0 +1,681 @@</div><div class='add'>+/*</div><div class='add'>+  Copyright (c) 2015 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#include &lt;glusterfs/defaults.h&gt;</div><div class='add'>+#include &lt;glusterfs/compat-errno.h&gt;</div><div class='add'>+#include "ec.h"</div><div class='add'>+#include "ec-messages.h"</div><div class='add'>+#include "ec-heald.h"</div><div class='add'>+#include "ec-mem-types.h"</div><div class='add'>+#include &lt;glusterfs/syncop.h&gt;</div><div class='add'>+#include &lt;glusterfs/syncop-utils.h&gt;</div><div class='add'>+#include "protocol-common.h"</div><div class='add'>+</div><div class='add'>+#define NTH_INDEX_HEALER(this, n)                                              \</div><div class='add'>+    (&amp;((((ec_t *)this-&gt;private))-&gt;shd.index_healers[n]))</div><div class='add'>+#define NTH_FULL_HEALER(this, n)                                               \</div><div class='add'>+    (&amp;((((ec_t *)this-&gt;private))-&gt;shd.full_healers[n]))</div><div class='add'>+</div><div class='add'>+gf_boolean_t</div><div class='add'>+ec_shd_is_subvol_local(xlator_t *this, int subvol)</div><div class='add'>+{</div><div class='add'>+    ec_t *ec = NULL;</div><div class='add'>+    gf_boolean_t is_local = _gf_false;</div><div class='add'>+    loc_t loc = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    ec = this-&gt;private;</div><div class='add'>+    loc.inode = this-&gt;itable-&gt;root;</div><div class='add'>+    syncop_is_subvol_local(ec-&gt;xl_list[subvol], &amp;loc, &amp;is_local);</div><div class='add'>+    return is_local;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+char *</div><div class='add'>+ec_subvol_name(xlator_t *this, int subvol)</div><div class='add'>+{</div><div class='add'>+    ec_t *ec = NULL;</div><div class='add'>+</div><div class='add'>+    ec = this-&gt;private;</div><div class='add'>+    if (subvol &lt; 0 || subvol &gt; ec-&gt;nodes)</div><div class='add'>+        return NULL;</div><div class='add'>+</div><div class='add'>+    return ec-&gt;xl_list[subvol]-&gt;name;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+__ec_shd_healer_wait(struct subvol_healer *healer)</div><div class='add'>+{</div><div class='add'>+    ec_t *ec = NULL;</div><div class='add'>+    struct timespec wait_till = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    ec = healer-&gt;this-&gt;private;</div><div class='add'>+</div><div class='add'>+disabled_loop:</div><div class='add'>+    wait_till.tv_sec = gf_time() + ec-&gt;shd.timeout;</div><div class='add'>+</div><div class='add'>+    while (!healer-&gt;rerun) {</div><div class='add'>+        ret = pthread_cond_timedwait(&amp;healer-&gt;cond, &amp;healer-&gt;mutex, &amp;wait_till);</div><div class='add'>+        if (ret == ETIMEDOUT)</div><div class='add'>+            break;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (ec-&gt;shutdown) {</div><div class='add'>+        healer-&gt;running = _gf_false;</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = healer-&gt;rerun;</div><div class='add'>+    healer-&gt;rerun = 0;</div><div class='add'>+</div><div class='add'>+    if (!ec-&gt;shd.enabled || !ec-&gt;up)</div><div class='add'>+        goto disabled_loop;</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+ec_shd_healer_wait(struct subvol_healer *healer)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    pthread_mutex_lock(&amp;healer-&gt;mutex);</div><div class='add'>+    {</div><div class='add'>+        ret = __ec_shd_healer_wait(healer);</div><div class='add'>+    }</div><div class='add'>+    pthread_mutex_unlock(&amp;healer-&gt;mutex);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+ec_shd_index_inode(xlator_t *this, xlator_t *subvol, inode_t **inode)</div><div class='add'>+{</div><div class='add'>+    loc_t rootloc = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int ret = 0;</div><div class='add'>+    dict_t *xattr = NULL;</div><div class='add'>+    void *index_gfid = NULL;</div><div class='add'>+</div><div class='add'>+    *inode = NULL;</div><div class='add'>+    rootloc.inode = inode_ref(this-&gt;itable-&gt;root);</div><div class='add'>+    gf_uuid_copy(rootloc.gfid, rootloc.inode-&gt;gfid);</div><div class='add'>+</div><div class='add'>+    ret = syncop_getxattr(subvol, &amp;rootloc, &amp;xattr, GF_XATTROP_INDEX_GFID, NULL,</div><div class='add'>+                          NULL);</div><div class='add'>+    if (ret &lt; 0)</div><div class='add'>+        goto out;</div><div class='add'>+    if (!xattr) {</div><div class='add'>+        ret = -EINVAL;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_get_ptr(xattr, GF_XATTROP_INDEX_GFID, &amp;index_gfid);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    gf_msg_debug(this-&gt;name, 0, "index-dir gfid for %s: %s", subvol-&gt;name,</div><div class='add'>+                 uuid_utoa(index_gfid));</div><div class='add'>+</div><div class='add'>+    ret = syncop_inode_find(this, subvol, index_gfid, inode, NULL, NULL);</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    loc_wipe(&amp;rootloc);</div><div class='add'>+</div><div class='add'>+    if (xattr)</div><div class='add'>+        dict_unref(xattr);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+ec_shd_index_purge(xlator_t *subvol, inode_t *inode, char *name)</div><div class='add'>+{</div><div class='add'>+    loc_t loc = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    loc.parent = inode_ref(inode);</div><div class='add'>+    loc.name = name;</div><div class='add'>+</div><div class='add'>+    ret = syncop_unlink(subvol, &amp;loc, NULL, NULL);</div><div class='add'>+</div><div class='add'>+    loc_wipe(&amp;loc);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static gf_boolean_t</div><div class='add'>+ec_is_heal_completed(char *status)</div><div class='add'>+{</div><div class='add'>+    char *bad_pos = NULL;</div><div class='add'>+    char *zero_pos = NULL;</div><div class='add'>+</div><div class='add'>+    if (!status) {</div><div class='add'>+        return _gf_false;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /*Logic:</div><div class='add'>+     * Status will be of the form Good: &lt;binary&gt;, Bad: &lt;binary&gt;</div><div class='add'>+     * If heal completes, if we do strchr for '0' it should be present after</div><div class='add'>+     * 'Bad:' i.e. strRchr for ':'</div><div class='add'>+     * */</div><div class='add'>+</div><div class='add'>+    zero_pos = strchr(status, '0');</div><div class='add'>+    bad_pos = strrchr(status, ':');</div><div class='add'>+    if (!zero_pos || !bad_pos) {</div><div class='add'>+        /*malformed status*/</div><div class='add'>+        return _gf_false;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (zero_pos &gt; bad_pos) {</div><div class='add'>+        return _gf_true;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return _gf_false;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+ec_shd_selfheal(struct subvol_healer *healer, int child, loc_t *loc,</div><div class='add'>+                gf_boolean_t full)</div><div class='add'>+{</div><div class='add'>+    dict_t *xdata = NULL;</div><div class='add'>+    dict_t *dict = NULL;</div><div class='add'>+    uint32_t count;</div><div class='add'>+    int32_t ret;</div><div class='add'>+    char *heal_status = NULL;</div><div class='add'>+    ec_t *ec = healer-&gt;this-&gt;private;</div><div class='add'>+</div><div class='add'>+    GF_ATOMIC_INC(ec-&gt;stats.shd.attempted);</div><div class='add'>+    ret = syncop_getxattr(healer-&gt;this, loc, &amp;dict, EC_XATTR_HEAL, NULL,</div><div class='add'>+                          &amp;xdata);</div><div class='add'>+    if (ret == 0) {</div><div class='add'>+        if (dict &amp;&amp; (dict_get_str(dict, EC_XATTR_HEAL, &amp;heal_status) == 0)) {</div><div class='add'>+            if (ec_is_heal_completed(heal_status)) {</div><div class='add'>+                GF_ATOMIC_INC(ec-&gt;stats.shd.completed);</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (!full &amp;&amp; (loc-&gt;inode-&gt;ia_type == IA_IFDIR)) {</div><div class='add'>+        /* If we have just healed a directory, it's possible that</div><div class='add'>+         * other index entries have appeared to be healed. */</div><div class='add'>+        if ((xdata != NULL) &amp;&amp;</div><div class='add'>+            (dict_get_uint32(xdata, EC_XATTR_HEAL_NEW, &amp;count) == 0) &amp;&amp;</div><div class='add'>+            (count &gt; 0)) {</div><div class='add'>+            /* Force a rerun of the index healer. */</div><div class='add'>+            gf_msg_debug(healer-&gt;this-&gt;name, 0, "%d more entries to heal",</div><div class='add'>+                         count);</div><div class='add'>+</div><div class='add'>+            healer-&gt;rerun = _gf_true;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (xdata != NULL) {</div><div class='add'>+        dict_unref(xdata);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (dict) {</div><div class='add'>+        dict_unref(dict);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+ec_shd_index_heal(xlator_t *subvol, gf_dirent_t *entry, loc_t *parent,</div><div class='add'>+                  void *data)</div><div class='add'>+{</div><div class='add'>+    struct subvol_healer *healer = data;</div><div class='add'>+    ec_t *ec = NULL;</div><div class='add'>+    loc_t loc = {0};</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    ec = healer-&gt;this-&gt;private;</div><div class='add'>+    if (ec-&gt;xl_up_count &lt;= ec-&gt;fragments) {</div><div class='add'>+        return -ENOTCONN;</div><div class='add'>+    }</div><div class='add'>+    if (!ec-&gt;shd.enabled)</div><div class='add'>+        return -EBUSY;</div><div class='add'>+</div><div class='add'>+    gf_msg_debug(healer-&gt;this-&gt;name, 0, "got entry: %s", entry-&gt;d_name);</div><div class='add'>+</div><div class='add'>+    ret = gf_uuid_parse(entry-&gt;d_name, loc.gfid);</div><div class='add'>+    if (ret)</div><div class='add'>+        return 0;</div><div class='add'>+</div><div class='add'>+    /* If this fails with ENOENT/ESTALE index is stale */</div><div class='add'>+    ret = syncop_gfid_to_path(healer-&gt;this-&gt;itable, subvol, loc.gfid,</div><div class='add'>+                              (char **)&amp;loc.path);</div><div class='add'>+    if (ret &lt; 0)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    ret = syncop_inode_find(healer-&gt;this, healer-&gt;this, loc.gfid, &amp;loc.inode,</div><div class='add'>+                            NULL, NULL);</div><div class='add'>+    if (ret &lt; 0)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    ec_shd_selfheal(healer, healer-&gt;subvol, &amp;loc, _gf_false);</div><div class='add'>+out:</div><div class='add'>+    if (ret == -ENOENT || ret == -ESTALE) {</div><div class='add'>+        gf_msg(healer-&gt;this-&gt;name, GF_LOG_DEBUG, 0, EC_MSG_HEAL_FAIL,</div><div class='add'>+               "Purging index for gfid %s:", uuid_utoa(loc.gfid));</div><div class='add'>+        ec_shd_index_purge(subvol, parent-&gt;inode, entry-&gt;d_name);</div><div class='add'>+    }</div><div class='add'>+    loc_wipe(&amp;loc);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+ec_shd_index_sweep(struct subvol_healer *healer)</div><div class='add'>+{</div><div class='add'>+    loc_t loc = {0};</div><div class='add'>+    ec_t *ec = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    xlator_t *subvol = NULL;</div><div class='add'>+    dict_t *xdata = NULL;</div><div class='add'>+</div><div class='add'>+    ec = healer-&gt;this-&gt;private;</div><div class='add'>+    subvol = ec-&gt;xl_list[healer-&gt;subvol];</div><div class='add'>+</div><div class='add'>+    ret = ec_shd_index_inode(healer-&gt;this, subvol, &amp;loc.inode);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        gf_msg(healer-&gt;this-&gt;name, GF_LOG_WARNING, errno,</div><div class='add'>+               EC_MSG_INDEX_DIR_GET_FAIL, "unable to get index-dir on %s",</div><div class='add'>+               subvol-&gt;name);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    xdata = dict_new();</div><div class='add'>+    if (!xdata || dict_set_int32(xdata, "get-gfid-type", 1)) {</div><div class='add'>+        ret = -ENOMEM;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    _mask_cancellation();</div><div class='add'>+    ret = syncop_mt_dir_scan(NULL, subvol, &amp;loc, GF_CLIENT_PID_SELF_HEALD,</div><div class='add'>+                             healer, ec_shd_index_heal, xdata,</div><div class='add'>+                             ec-&gt;shd.max_threads, ec-&gt;shd.wait_qlength);</div><div class='add'>+    _unmask_cancellation();</div><div class='add'>+out:</div><div class='add'>+    if (xdata)</div><div class='add'>+        dict_unref(xdata);</div><div class='add'>+    loc_wipe(&amp;loc);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+ec_shd_full_heal(xlator_t *subvol, gf_dirent_t *entry, loc_t *parent,</div><div class='add'>+                 void *data)</div><div class='add'>+{</div><div class='add'>+    struct subvol_healer *healer = data;</div><div class='add'>+    xlator_t *this = healer-&gt;this;</div><div class='add'>+    ec_t *ec = NULL;</div><div class='add'>+    loc_t loc = {0};</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    ec = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    if (this-&gt;cleanup_starting) {</div><div class='add'>+        return -ENOTCONN;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (ec-&gt;xl_up_count &lt;= ec-&gt;fragments) {</div><div class='add'>+        return -ENOTCONN;</div><div class='add'>+    }</div><div class='add'>+    if (!ec-&gt;shd.enabled)</div><div class='add'>+        return -EBUSY;</div><div class='add'>+</div><div class='add'>+    if (gf_uuid_is_null(entry-&gt;d_stat.ia_gfid)) {</div><div class='add'>+        /* It's possible that an entry has been removed just after</div><div class='add'>+         * being seen in a directory but before getting its stat info.</div><div class='add'>+         * In this case we'll receive a NULL gfid here. Since the file</div><div class='add'>+         * doesn't exist anymore, we can safely ignore it. */</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    loc.parent = inode_ref(parent-&gt;inode);</div><div class='add'>+    loc.name = entry-&gt;d_name;</div><div class='add'>+    gf_uuid_copy(loc.gfid, entry-&gt;d_stat.ia_gfid);</div><div class='add'>+</div><div class='add'>+    /* If this fails with ENOENT/ESTALE index is stale */</div><div class='add'>+    ret = syncop_gfid_to_path(this-&gt;itable, subvol, loc.gfid,</div><div class='add'>+                              (char **)&amp;loc.path);</div><div class='add'>+    if (ret &lt; 0)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    ret = syncop_inode_find(this, this, loc.gfid, &amp;loc.inode, NULL, NULL);</div><div class='add'>+    if (ret &lt; 0)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    ec_shd_selfheal(healer, healer-&gt;subvol, &amp;loc, _gf_true);</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    loc_wipe(&amp;loc);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+ec_shd_full_sweep(struct subvol_healer *healer, inode_t *inode)</div><div class='add'>+{</div><div class='add'>+    ec_t *ec = NULL;</div><div class='add'>+    loc_t loc = {0};</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    ec = healer-&gt;this-&gt;private;</div><div class='add'>+    loc.inode = inode;</div><div class='add'>+    _mask_cancellation();</div><div class='add'>+    ret = syncop_ftw(ec-&gt;xl_list[healer-&gt;subvol], &amp;loc,</div><div class='add'>+                     GF_CLIENT_PID_SELF_HEALD, healer, ec_shd_full_heal);</div><div class='add'>+    _unmask_cancellation();</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void *</div><div class='add'>+ec_shd_index_healer(void *data)</div><div class='add'>+{</div><div class='add'>+    struct subvol_healer *healer = NULL;</div><div class='add'>+    xlator_t *this = NULL;</div><div class='add'>+    int run = 0;</div><div class='add'>+</div><div class='add'>+    healer = data;</div><div class='add'>+    THIS = this = healer-&gt;this;</div><div class='add'>+    ec_t *ec = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    for (;;) {</div><div class='add'>+        run = ec_shd_healer_wait(healer);</div><div class='add'>+        if (run == -1)</div><div class='add'>+            break;</div><div class='add'>+</div><div class='add'>+        if (ec-&gt;xl_up_count &gt; ec-&gt;fragments) {</div><div class='add'>+            gf_msg_debug(this-&gt;name, 0, "starting index sweep on subvol %s",</div><div class='add'>+                         ec_subvol_name(this, healer-&gt;subvol));</div><div class='add'>+            ec_shd_index_sweep(healer);</div><div class='add'>+        }</div><div class='add'>+        gf_msg_debug(this-&gt;name, 0, "finished index sweep on subvol %s",</div><div class='add'>+                     ec_subvol_name(this, healer-&gt;subvol));</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return NULL;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void *</div><div class='add'>+ec_shd_full_healer(void *data)</div><div class='add'>+{</div><div class='add'>+    struct subvol_healer *healer = NULL;</div><div class='add'>+    xlator_t *this = NULL;</div><div class='add'>+    loc_t rootloc = {0};</div><div class='add'>+</div><div class='add'>+    int run = 0;</div><div class='add'>+</div><div class='add'>+    healer = data;</div><div class='add'>+    THIS = this = healer-&gt;this;</div><div class='add'>+    ec_t *ec = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    rootloc.inode = this-&gt;itable-&gt;root;</div><div class='add'>+    for (;;) {</div><div class='add'>+        run = ec_shd_healer_wait(healer);</div><div class='add'>+        if (run &lt; 0) {</div><div class='add'>+            break;</div><div class='add'>+        } else if (run == 0) {</div><div class='add'>+            continue;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        if (ec-&gt;xl_up_count &gt; ec-&gt;fragments) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_INFO, 0, EC_MSG_FULL_SWEEP_START,</div><div class='add'>+                   "starting full sweep on subvol %s",</div><div class='add'>+                   ec_subvol_name(this, healer-&gt;subvol));</div><div class='add'>+</div><div class='add'>+            ec_shd_selfheal(healer, healer-&gt;subvol, &amp;rootloc, _gf_true);</div><div class='add'>+            ec_shd_full_sweep(healer, this-&gt;itable-&gt;root);</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_INFO, 0, EC_MSG_FULL_SWEEP_STOP,</div><div class='add'>+               "finished full sweep on subvol %s",</div><div class='add'>+               ec_subvol_name(this, healer-&gt;subvol));</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return NULL;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+ec_shd_healer_init(xlator_t *this, struct subvol_healer *healer)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    ret = pthread_mutex_init(&amp;healer-&gt;mutex, NULL);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    ret = pthread_cond_init(&amp;healer-&gt;cond, NULL);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    healer-&gt;this = this;</div><div class='add'>+    healer-&gt;running = _gf_false;</div><div class='add'>+    healer-&gt;rerun = _gf_false;</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+ec_shd_healer_spawn(xlator_t *this, struct subvol_healer *healer,</div><div class='add'>+                    void *(threadfn)(void *))</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    pthread_mutex_lock(&amp;healer-&gt;mutex);</div><div class='add'>+    {</div><div class='add'>+        if (healer-&gt;running) {</div><div class='add'>+            pthread_cond_signal(&amp;healer-&gt;cond);</div><div class='add'>+        } else {</div><div class='add'>+            ret = gf_thread_create(&amp;healer-&gt;thread, NULL, threadfn, healer,</div><div class='add'>+                                   "ecshd");</div><div class='add'>+            if (ret)</div><div class='add'>+                goto unlock;</div><div class='add'>+            healer-&gt;running = 1;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        healer-&gt;rerun = 1;</div><div class='add'>+    }</div><div class='add'>+unlock:</div><div class='add'>+    pthread_mutex_unlock(&amp;healer-&gt;mutex);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+ec_shd_full_healer_spawn(xlator_t *this, int subvol)</div><div class='add'>+{</div><div class='add'>+    if (xlator_is_cleanup_starting(this))</div><div class='add'>+        return -1;</div><div class='add'>+</div><div class='add'>+    return ec_shd_healer_spawn(this, NTH_FULL_HEALER(this, subvol),</div><div class='add'>+                               ec_shd_full_healer);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+ec_shd_index_healer_spawn(xlator_t *this, int subvol)</div><div class='add'>+{</div><div class='add'>+    if (xlator_is_cleanup_starting(this))</div><div class='add'>+        return -1;</div><div class='add'>+</div><div class='add'>+    return ec_shd_healer_spawn(this, NTH_INDEX_HEALER(this, subvol),</div><div class='add'>+                               ec_shd_index_healer);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_shd_index_healer_wake(ec_t *ec)</div><div class='add'>+{</div><div class='add'>+    int32_t i;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; ec-&gt;nodes; i++) {</div><div class='add'>+        if (((ec-&gt;xl_up &gt;&gt; i) &amp; 1) != 0) {</div><div class='add'>+            ec_shd_index_healer_spawn(ec-&gt;xl, i);</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+ec_selfheal_daemon_init(xlator_t *this)</div><div class='add'>+{</div><div class='add'>+    ec_t *ec = NULL;</div><div class='add'>+    ec_self_heald_t *shd = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int i = 0;</div><div class='add'>+</div><div class='add'>+    ec = this-&gt;private;</div><div class='add'>+    shd = &amp;ec-&gt;shd;</div><div class='add'>+</div><div class='add'>+    shd-&gt;index_healers = GF_CALLOC(sizeof(*shd-&gt;index_healers), ec-&gt;nodes,</div><div class='add'>+                                   ec_mt_subvol_healer_t);</div><div class='add'>+    if (!shd-&gt;index_healers)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; ec-&gt;nodes; i++) {</div><div class='add'>+        shd-&gt;index_healers[i].subvol = i;</div><div class='add'>+        ret = ec_shd_healer_init(this, &amp;shd-&gt;index_healers[i]);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    shd-&gt;full_healers = GF_CALLOC(sizeof(*shd-&gt;full_healers), ec-&gt;nodes,</div><div class='add'>+                                  ec_mt_subvol_healer_t);</div><div class='add'>+    if (!shd-&gt;full_healers)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; ec-&gt;nodes; i++) {</div><div class='add'>+        shd-&gt;full_healers[i].subvol = i;</div><div class='add'>+        ret = ec_shd_healer_init(this, &amp;shd-&gt;full_healers[i]);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+ec_heal_op(xlator_t *this, dict_t *output, gf_xl_afr_op_t op, int xl_id)</div><div class='add'>+{</div><div class='add'>+    char key[64] = {0};</div><div class='add'>+    int op_ret = 0;</div><div class='add'>+    ec_t *ec = NULL;</div><div class='add'>+    int i = 0;</div><div class='add'>+    GF_UNUSED int ret = 0;</div><div class='add'>+</div><div class='add'>+    ec = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    op_ret = -1;</div><div class='add'>+    for (i = 0; i &lt; ec-&gt;nodes; i++) {</div><div class='add'>+        snprintf(key, sizeof(key), "%d-%d-status", xl_id, i);</div><div class='add'>+</div><div class='add'>+        if (((ec-&gt;xl_up &gt;&gt; i) &amp; 1) == 0) {</div><div class='add'>+            ret = dict_set_str(output, key, "Brick is not connected");</div><div class='add'>+        } else if (!ec-&gt;up) {</div><div class='add'>+            ret = dict_set_str(output, key, "Disperse subvolume is not up");</div><div class='add'>+        } else if (!ec_shd_is_subvol_local(this, i)) {</div><div class='add'>+            ret = dict_set_str(output, key, "Brick is remote");</div><div class='add'>+        } else {</div><div class='add'>+            ret = dict_set_str(output, key, "Started self-heal");</div><div class='add'>+            if (op == GF_SHD_OP_HEAL_FULL) {</div><div class='add'>+                ec_shd_full_healer_spawn(this, i);</div><div class='add'>+            } else if (op == GF_SHD_OP_HEAL_INDEX) {</div><div class='add'>+                ec_shd_index_healer_spawn(this, i);</div><div class='add'>+            }</div><div class='add'>+            op_ret = 0;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    return op_ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+ec_xl_op(xlator_t *this, dict_t *input, dict_t *output)</div><div class='add'>+{</div><div class='add'>+    gf_xl_afr_op_t op = GF_SHD_OP_INVALID;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    int xl_id = 0;</div><div class='add'>+</div><div class='add'>+    ret = dict_get_int32(input, "xl-op", (int32_t *)&amp;op);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    ret = dict_get_int32(input, this-&gt;name, &amp;xl_id);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    ret = dict_set_int32(output, this-&gt;name, xl_id);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    switch (op) {</div><div class='add'>+        case GF_SHD_OP_HEAL_FULL:</div><div class='add'>+            ret = ec_heal_op(this, output, op, xl_id);</div><div class='add'>+            break;</div><div class='add'>+</div><div class='add'>+        case GF_SHD_OP_HEAL_INDEX:</div><div class='add'>+            ret = ec_heal_op(this, output, op, xl_id);</div><div class='add'>+            break;</div><div class='add'>+</div><div class='add'>+        default:</div><div class='add'>+            ret = -1;</div><div class='add'>+            break;</div><div class='add'>+    }</div><div class='add'>+out:</div><div class='add'>+    dict_del(output, this-&gt;name);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_destroy_healer_object(xlator_t *this, struct subvol_healer *healer)</div><div class='add'>+{</div><div class='add'>+    if (!healer)</div><div class='add'>+        return;</div><div class='add'>+</div><div class='add'>+    pthread_cond_destroy(&amp;healer-&gt;cond);</div><div class='add'>+    pthread_mutex_destroy(&amp;healer-&gt;mutex);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_selfheal_daemon_fini(xlator_t *this)</div><div class='add'>+{</div><div class='add'>+    struct subvol_healer *healer = NULL;</div><div class='add'>+    ec_self_heald_t *shd = NULL;</div><div class='add'>+    ec_t *priv = NULL;</div><div class='add'>+    int i = 0;</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+    if (!priv)</div><div class='add'>+        return;</div><div class='add'>+</div><div class='add'>+    shd = &amp;priv-&gt;shd;</div><div class='add'>+    if (!shd-&gt;iamshd)</div><div class='add'>+        return;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; priv-&gt;nodes; i++) {</div><div class='add'>+        healer = &amp;shd-&gt;index_healers[i];</div><div class='add'>+        ec_destroy_healer_object(this, healer);</div><div class='add'>+</div><div class='add'>+        healer = &amp;shd-&gt;full_healers[i];</div><div class='add'>+        ec_destroy_healer_object(this, healer);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    GF_FREE(shd-&gt;index_healers);</div><div class='add'>+    GF_FREE(shd-&gt;full_healers);</div><div class='add'>+}</div><div class='head'>diff --git a/xlators/cluster/ec/src/ec-heald.h b/xlators/cluster/ec/src/ec-heald.h<br/>new file mode 100644<br/>index 00000000000..6c7da4edc10<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/xlators/cluster/ec/src/ec-heald.h?id=d1d7a6f35c816822fab51c820e25023863c239c1'>xlators/cluster/ec/src/ec-heald.h</a></div><div class='hunk'>@@ -0,0 +1,30 @@</div><div class='add'>+/*</div><div class='add'>+  Copyright (c) 2015 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#ifndef __EC_HEALD_H__</div><div class='add'>+#define __EC_HEALD_H__</div><div class='add'>+</div><div class='add'>+#include "ec-types.h"           // for ec_t</div><div class='add'>+#include "glusterfs/dict.h"     // for dict_t</div><div class='add'>+#include "glusterfs/globals.h"  // for xlator_t</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+ec_xl_op(xlator_t *this, dict_t *input, dict_t *output);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+ec_selfheal_daemon_init(xlator_t *this);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_shd_index_healer_wake(ec_t *ec);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_selfheal_daemon_fini(xlator_t *this);</div><div class='add'>+</div><div class='add'>+#endif /* __EC_HEALD_H__ */</div><div class='head'>diff --git a/xlators/cluster/ec/src/ec-helpers.c b/xlators/cluster/ec/src/ec-helpers.c<br/>new file mode 100644<br/>index 00000000000..48f54475e01<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/xlators/cluster/ec/src/ec-helpers.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>xlators/cluster/ec/src/ec-helpers.c</a></div><div class='hunk'>@@ -0,0 +1,867 @@</div><div class='add'>+/*</div><div class='add'>+  Copyright (c) 2012-2014 DataLab, s.l. &lt;http://www.datalab.es&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#include &lt;libgen.h&gt;</div><div class='add'>+</div><div class='add'>+#include &lt;glusterfs/byte-order.h&gt;</div><div class='add'>+</div><div class='add'>+#include "ec.h"</div><div class='add'>+#include "ec-mem-types.h"</div><div class='add'>+#include "ec-messages.h"</div><div class='add'>+#include "ec-fops.h"</div><div class='add'>+#include "ec-method.h"</div><div class='add'>+#include "ec-helpers.h"</div><div class='add'>+</div><div class='add'>+static const char *ec_fop_list[] = {[-EC_FOP_HEAL] = "HEAL"};</div><div class='add'>+</div><div class='add'>+const char *</div><div class='add'>+ec_bin(char *str, size_t size, uint64_t value, int32_t digits)</div><div class='add'>+{</div><div class='add'>+    str += size;</div><div class='add'>+</div><div class='add'>+    if (size-- &lt; 1) {</div><div class='add'>+        goto failed;</div><div class='add'>+    }</div><div class='add'>+    *--str = 0;</div><div class='add'>+</div><div class='add'>+    while ((value != 0) || (digits &gt; 0)) {</div><div class='add'>+        if (size-- &lt; 1) {</div><div class='add'>+            goto failed;</div><div class='add'>+        }</div><div class='add'>+        *--str = '0' + (value &amp; 1);</div><div class='add'>+        digits--;</div><div class='add'>+        value &gt;&gt;= 1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return str;</div><div class='add'>+</div><div class='add'>+failed:</div><div class='add'>+    return "&lt;buffer too small&gt;";</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+const char *</div><div class='add'>+ec_fop_name(int32_t id)</div><div class='add'>+{</div><div class='add'>+    if (id &gt;= 0) {</div><div class='add'>+        return gf_fop_list[id];</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return ec_fop_list[-id];</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_trace(const char *event, ec_fop_data_t *fop, const char *fmt, ...)</div><div class='add'>+{</div><div class='add'>+    char str1[32], str2[32], str3[32];</div><div class='add'>+    char *msg;</div><div class='add'>+    ec_t *ec = fop-&gt;xl-&gt;private;</div><div class='add'>+    va_list args;</div><div class='add'>+    int32_t ret;</div><div class='add'>+</div><div class='add'>+    va_start(args, fmt);</div><div class='add'>+    ret = vasprintf(&amp;msg, fmt, args);</div><div class='add'>+    va_end(args);</div><div class='add'>+</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        msg = "&lt;memory allocation error&gt;";</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    gf_msg_trace("ec", 0,</div><div class='add'>+                 "%s(%s) %p(%p) [refs=%d, winds=%d, jobs=%d] "</div><div class='add'>+                 "frame=%p/%p, min/exp=%d/%d, err=%d state=%d "</div><div class='add'>+                 "{%s:%s:%s} %s",</div><div class='add'>+                 event, ec_fop_name(fop-&gt;id), fop, fop-&gt;parent, fop-&gt;refs,</div><div class='add'>+                 fop-&gt;winds, fop-&gt;jobs, fop-&gt;req_frame, fop-&gt;frame,</div><div class='add'>+                 fop-&gt;minimum, fop-&gt;expected, fop-&gt;error, fop-&gt;state,</div><div class='add'>+                 ec_bin(str1, sizeof(str1), fop-&gt;mask, ec-&gt;nodes),</div><div class='add'>+                 ec_bin(str2, sizeof(str2), fop-&gt;remaining, ec-&gt;nodes),</div><div class='add'>+                 ec_bin(str3, sizeof(str3), fop-&gt;good, ec-&gt;nodes), msg);</div><div class='add'>+</div><div class='add'>+    if (ret &gt;= 0) {</div><div class='add'>+        free(msg);</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_bits_consume(uint64_t *n)</div><div class='add'>+{</div><div class='add'>+    uint64_t tmp;</div><div class='add'>+</div><div class='add'>+    tmp = *n;</div><div class='add'>+    tmp &amp;= -tmp;</div><div class='add'>+    *n ^= tmp;</div><div class='add'>+</div><div class='add'>+    return gf_bits_index(tmp);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+size_t</div><div class='add'>+ec_iov_copy_to(void *dst, struct iovec *vector, int32_t count, off_t offset,</div><div class='add'>+               size_t size)</div><div class='add'>+{</div><div class='add'>+    int32_t i = 0;</div><div class='add'>+    size_t total = 0, len = 0;</div><div class='add'>+</div><div class='add'>+    while (i &lt; count) {</div><div class='add'>+        if (offset &lt; vector[i].iov_len) {</div><div class='add'>+            while ((i &lt; count) &amp;&amp; (size &gt; 0)) {</div><div class='add'>+                len = size;</div><div class='add'>+                if (len &gt; vector[i].iov_len - offset) {</div><div class='add'>+                    len = vector[i].iov_len - offset;</div><div class='add'>+                }</div><div class='add'>+                memcpy(dst, vector[i++].iov_base + offset, len);</div><div class='add'>+                offset = 0;</div><div class='add'>+                dst += len;</div><div class='add'>+                total += len;</div><div class='add'>+                size -= len;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            break;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        offset -= vector[i].iov_len;</div><div class='add'>+        i++;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return total;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_buffer_alloc(xlator_t *xl, size_t size, struct iobref **piobref, void **ptr)</div><div class='add'>+{</div><div class='add'>+    struct iobref *iobref = NULL;</div><div class='add'>+    struct iobuf *iobuf = NULL;</div><div class='add'>+    int32_t ret = -ENOMEM;</div><div class='add'>+</div><div class='add'>+    iobuf = iobuf_get_page_aligned(xl-&gt;ctx-&gt;iobuf_pool, size,</div><div class='add'>+                                   EC_METHOD_WORD_SIZE);</div><div class='add'>+    if (iobuf == NULL) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    iobref = *piobref;</div><div class='add'>+    if (iobref == NULL) {</div><div class='add'>+        iobref = iobref_new();</div><div class='add'>+        if (iobref == NULL) {</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = iobref_add(iobref, iobuf);</div><div class='add'>+    if (ret != 0) {</div><div class='add'>+        if (iobref != *piobref) {</div><div class='add'>+            iobref_unref(iobref);</div><div class='add'>+        }</div><div class='add'>+        iobref = NULL;</div><div class='add'>+</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(EC_ALIGN_CHECK(iobuf-&gt;ptr, EC_METHOD_WORD_SIZE));</div><div class='add'>+</div><div class='add'>+    *ptr = iobuf-&gt;ptr;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (iobuf != NULL) {</div><div class='add'>+        iobuf_unref(iobuf);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (iobref != NULL) {</div><div class='add'>+        *piobref = iobref;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_dict_set_array(dict_t *dict, char *key, uint64_t value[], int32_t size)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    uint64_t *ptr = NULL;</div><div class='add'>+    int32_t vindex;</div><div class='add'>+</div><div class='add'>+    if (value == NULL) {</div><div class='add'>+        return -EINVAL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ptr = GF_MALLOC(sizeof(uint64_t) * size, gf_common_mt_char);</div><div class='add'>+    if (ptr == NULL) {</div><div class='add'>+        return -ENOMEM;</div><div class='add'>+    }</div><div class='add'>+    for (vindex = 0; vindex &lt; size; vindex++) {</div><div class='add'>+        ptr[vindex] = hton64(value[vindex]);</div><div class='add'>+    }</div><div class='add'>+    ret = dict_set_bin(dict, key, ptr, sizeof(uint64_t) * size);</div><div class='add'>+    if (ret)</div><div class='add'>+        GF_FREE(ptr);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_dict_get_array(dict_t *dict, char *key, uint64_t value[], int32_t size)</div><div class='add'>+{</div><div class='add'>+    void *ptr;</div><div class='add'>+    int32_t len;</div><div class='add'>+    int32_t vindex;</div><div class='add'>+    int32_t old_size = 0;</div><div class='add'>+    int32_t err;</div><div class='add'>+</div><div class='add'>+    if (dict == NULL) {</div><div class='add'>+        return -EINVAL;</div><div class='add'>+    }</div><div class='add'>+    err = dict_get_ptr_and_len(dict, key, &amp;ptr, &amp;len);</div><div class='add'>+    if (err != 0) {</div><div class='add'>+        return err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (len &gt; (size * sizeof(uint64_t)) || (len % sizeof(uint64_t))) {</div><div class='add'>+        return -EINVAL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* 3.6 version ec would have stored version in 64 bit. In that case treat</div><div class='add'>+     * metadata versions same as data*/</div><div class='add'>+    old_size = min(size, len / sizeof(uint64_t));</div><div class='add'>+    for (vindex = 0; vindex &lt; old_size; vindex++) {</div><div class='add'>+        value[vindex] = ntoh64(*((uint64_t *)ptr + vindex));</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (old_size &lt; size) {</div><div class='add'>+        for (vindex = old_size; vindex &lt; size; vindex++) {</div><div class='add'>+            value[vindex] = value[old_size - 1];</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_dict_del_array(dict_t *dict, char *key, uint64_t value[], int32_t size)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    ret = ec_dict_get_array(dict, key, value, size);</div><div class='add'>+    if (ret == 0)</div><div class='add'>+        dict_del(dict, key);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_dict_set_number(dict_t *dict, char *key, uint64_t value)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    uint64_t *ptr;</div><div class='add'>+</div><div class='add'>+    ptr = GF_MALLOC(sizeof(value), gf_common_mt_char);</div><div class='add'>+    if (ptr == NULL) {</div><div class='add'>+        return -ENOMEM;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    *ptr = hton64(value);</div><div class='add'>+</div><div class='add'>+    ret = dict_set_bin(dict, key, ptr, sizeof(value));</div><div class='add'>+    if (ret)</div><div class='add'>+        GF_FREE(ptr);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_dict_del_number(dict_t *dict, char *key, uint64_t *value)</div><div class='add'>+{</div><div class='add'>+    void *ptr;</div><div class='add'>+    int32_t len, err;</div><div class='add'>+</div><div class='add'>+    if (dict == NULL) {</div><div class='add'>+        return -EINVAL;</div><div class='add'>+    }</div><div class='add'>+    err = dict_get_ptr_and_len(dict, key, &amp;ptr, &amp;len);</div><div class='add'>+    if (err != 0) {</div><div class='add'>+        return err;</div><div class='add'>+    }</div><div class='add'>+    if (len != sizeof(uint64_t)) {</div><div class='add'>+        return -EINVAL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    *value = ntoh64(*(uint64_t *)ptr);</div><div class='add'>+</div><div class='add'>+    dict_del(dict, key);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_dict_set_config(dict_t *dict, char *key, ec_config_t *config)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    uint64_t *ptr, data;</div><div class='add'>+</div><div class='add'>+    if (config-&gt;version &gt; EC_CONFIG_VERSION) {</div><div class='add'>+        gf_msg("ec", GF_LOG_ERROR, EINVAL, EC_MSG_UNSUPPORTED_VERSION,</div><div class='add'>+               "Trying to store an unsupported config "</div><div class='add'>+               "version (%u)",</div><div class='add'>+               config-&gt;version);</div><div class='add'>+</div><div class='add'>+        return -EINVAL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ptr = GF_MALLOC(sizeof(uint64_t), gf_common_mt_char);</div><div class='add'>+    if (ptr == NULL) {</div><div class='add'>+        return -ENOMEM;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    data = ((uint64_t)config-&gt;version) &lt;&lt; 56;</div><div class='add'>+    data |= ((uint64_t)config-&gt;algorithm) &lt;&lt; 48;</div><div class='add'>+    data |= ((uint64_t)config-&gt;gf_word_size) &lt;&lt; 40;</div><div class='add'>+    data |= ((uint64_t)config-&gt;bricks) &lt;&lt; 32;</div><div class='add'>+    data |= ((uint64_t)config-&gt;redundancy) &lt;&lt; 24;</div><div class='add'>+    data |= config-&gt;chunk_size;</div><div class='add'>+</div><div class='add'>+    *ptr = hton64(data);</div><div class='add'>+</div><div class='add'>+    ret = dict_set_bin(dict, key, ptr, sizeof(uint64_t));</div><div class='add'>+    if (ret)</div><div class='add'>+        GF_FREE(ptr);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_dict_del_config(dict_t *dict, char *key, ec_config_t *config)</div><div class='add'>+{</div><div class='add'>+    void *ptr;</div><div class='add'>+    uint64_t data;</div><div class='add'>+    int32_t len, err;</div><div class='add'>+</div><div class='add'>+    if (dict == NULL) {</div><div class='add'>+        return -EINVAL;</div><div class='add'>+    }</div><div class='add'>+    err = dict_get_ptr_and_len(dict, key, &amp;ptr, &amp;len);</div><div class='add'>+    if (err != 0) {</div><div class='add'>+        return err;</div><div class='add'>+    }</div><div class='add'>+    if (len != sizeof(uint64_t)) {</div><div class='add'>+        return -EINVAL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    data = ntoh64(*(uint64_t *)ptr);</div><div class='add'>+    /* Currently we need to get the config xattr for entries of type IA_INVAL.</div><div class='add'>+     * These entries can later become IA_DIR entries (after inode_link()),</div><div class='add'>+     * which don't have a config xattr. However, since the xattr is requested</div><div class='add'>+     * using an xattrop() fop, it will always return a config full of 0's</div><div class='add'>+     * instead of saying that it doesn't exist.</div><div class='add'>+     *</div><div class='add'>+     * We need to filter out this case and consider that a config xattr == 0 is</div><div class='add'>+     * the same as a non-existent xattr. Otherwise ec_config_check() will fail.</div><div class='add'>+     */</div><div class='add'>+    if (data == 0) {</div><div class='add'>+        return -ENODATA;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    config-&gt;version = (data &gt;&gt; 56) &amp; 0xff;</div><div class='add'>+    if (config-&gt;version &gt; EC_CONFIG_VERSION) {</div><div class='add'>+        gf_msg("ec", GF_LOG_ERROR, EINVAL, EC_MSG_UNSUPPORTED_VERSION,</div><div class='add'>+               "Found an unsupported config version (%u)", config-&gt;version);</div><div class='add'>+</div><div class='add'>+        return -EINVAL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    config-&gt;algorithm = (data &gt;&gt; 48) &amp; 0xff;</div><div class='add'>+    config-&gt;gf_word_size = (data &gt;&gt; 40) &amp; 0xff;</div><div class='add'>+    config-&gt;bricks = (data &gt;&gt; 32) &amp; 0xff;</div><div class='add'>+    config-&gt;redundancy = (data &gt;&gt; 24) &amp; 0xff;</div><div class='add'>+    config-&gt;chunk_size = data &amp; 0xffffff;</div><div class='add'>+</div><div class='add'>+    dict_del(dict, key);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+gf_boolean_t</div><div class='add'>+ec_loc_gfid_check(xlator_t *xl, uuid_t dst, uuid_t src)</div><div class='add'>+{</div><div class='add'>+    if (gf_uuid_is_null(src)) {</div><div class='add'>+        return _gf_true;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (gf_uuid_is_null(dst)) {</div><div class='add'>+        gf_uuid_copy(dst, src);</div><div class='add'>+</div><div class='add'>+        return _gf_true;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (gf_uuid_compare(dst, src) != 0) {</div><div class='add'>+        gf_msg(xl-&gt;name, GF_LOG_WARNING, 0, EC_MSG_GFID_MISMATCH,</div><div class='add'>+               "Mismatching GFID's in loc");</div><div class='add'>+</div><div class='add'>+        return _gf_false;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return _gf_true;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_loc_setup_inode(xlator_t *xl, inode_table_t *table, loc_t *loc)</div><div class='add'>+{</div><div class='add'>+    int32_t ret = -EINVAL;</div><div class='add'>+</div><div class='add'>+    if (loc-&gt;inode != NULL) {</div><div class='add'>+        if (!ec_loc_gfid_check(xl, loc-&gt;gfid, loc-&gt;inode-&gt;gfid)) {</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    } else if (table != NULL) {</div><div class='add'>+        if (!gf_uuid_is_null(loc-&gt;gfid)) {</div><div class='add'>+            loc-&gt;inode = inode_find(table, loc-&gt;gfid);</div><div class='add'>+        } else if (loc-&gt;path &amp;&amp; strchr(loc-&gt;path, '/')) {</div><div class='add'>+            loc-&gt;inode = inode_resolve(table, (char *)loc-&gt;path);</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_loc_setup_parent(xlator_t *xl, inode_table_t *table, loc_t *loc)</div><div class='add'>+{</div><div class='add'>+    char *path, *parent;</div><div class='add'>+    int32_t ret = -EINVAL;</div><div class='add'>+</div><div class='add'>+    if (loc-&gt;parent != NULL) {</div><div class='add'>+        if (!ec_loc_gfid_check(xl, loc-&gt;pargfid, loc-&gt;parent-&gt;gfid)) {</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    } else if (table != NULL) {</div><div class='add'>+        if (!gf_uuid_is_null(loc-&gt;pargfid)) {</div><div class='add'>+            loc-&gt;parent = inode_find(table, loc-&gt;pargfid);</div><div class='add'>+        } else if (loc-&gt;path &amp;&amp; strchr(loc-&gt;path, '/')) {</div><div class='add'>+            path = gf_strdup(loc-&gt;path);</div><div class='add'>+            if (path == NULL) {</div><div class='add'>+                gf_msg(xl-&gt;name, GF_LOG_ERROR, ENOMEM, EC_MSG_NO_MEMORY,</div><div class='add'>+                       "Unable to duplicate path '%s'", loc-&gt;path);</div><div class='add'>+</div><div class='add'>+                ret = -ENOMEM;</div><div class='add'>+</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+            parent = dirname(path);</div><div class='add'>+            loc-&gt;parent = inode_resolve(table, parent);</div><div class='add'>+            if (loc-&gt;parent != NULL) {</div><div class='add'>+                gf_uuid_copy(loc-&gt;pargfid, loc-&gt;parent-&gt;gfid);</div><div class='add'>+            }</div><div class='add'>+            GF_FREE(path);</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* If 'pargfid' has not been determined, clear 'name' to avoid resolutions</div><div class='add'>+       based on &lt;gfid:pargfid&gt;/name. */</div><div class='add'>+    if (gf_uuid_is_null(loc-&gt;pargfid)) {</div><div class='add'>+        loc-&gt;name = NULL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_loc_setup_path(xlator_t *xl, loc_t *loc)</div><div class='add'>+{</div><div class='add'>+    static uuid_t root = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1};</div><div class='add'>+    char *name;</div><div class='add'>+    int32_t ret = -EINVAL;</div><div class='add'>+</div><div class='add'>+    if (loc-&gt;path != NULL) {</div><div class='add'>+        name = strrchr(loc-&gt;path, '/');</div><div class='add'>+        if (name == NULL) {</div><div class='add'>+            /* Allow gfid paths: &lt;gfid:...&gt; */</div><div class='add'>+            if (strncmp(loc-&gt;path, "&lt;gfid:", 6) == 0) {</div><div class='add'>+                ret = 0;</div><div class='add'>+            }</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+        if (name == loc-&gt;path) {</div><div class='add'>+            if (name[1] == 0) {</div><div class='add'>+                if (!ec_loc_gfid_check(xl, loc-&gt;gfid, root)) {</div><div class='add'>+                    goto out;</div><div class='add'>+                }</div><div class='add'>+            } else {</div><div class='add'>+                if (!ec_loc_gfid_check(xl, loc-&gt;pargfid, root)) {</div><div class='add'>+                    goto out;</div><div class='add'>+                }</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+        name++;</div><div class='add'>+</div><div class='add'>+        if (loc-&gt;name != NULL) {</div><div class='add'>+            if (strcmp(loc-&gt;name, name) != 0) {</div><div class='add'>+                gf_msg(xl-&gt;name, GF_LOG_ERROR, EINVAL, EC_MSG_INVALID_LOC_NAME,</div><div class='add'>+                       "Invalid name '%s' in loc", loc-&gt;name);</div><div class='add'>+</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+        } else {</div><div class='add'>+            loc-&gt;name = name;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_loc_parent(xlator_t *xl, loc_t *loc, loc_t *parent)</div><div class='add'>+{</div><div class='add'>+    inode_table_t *table = NULL;</div><div class='add'>+    char *str = NULL;</div><div class='add'>+    int32_t ret = -ENOMEM;</div><div class='add'>+</div><div class='add'>+    memset(parent, 0, sizeof(loc_t));</div><div class='add'>+</div><div class='add'>+    if (loc-&gt;parent != NULL) {</div><div class='add'>+        table = loc-&gt;parent-&gt;table;</div><div class='add'>+        parent-&gt;inode = inode_ref(loc-&gt;parent);</div><div class='add'>+    } else if (loc-&gt;inode != NULL) {</div><div class='add'>+        table = loc-&gt;inode-&gt;table;</div><div class='add'>+    }</div><div class='add'>+    if (!gf_uuid_is_null(loc-&gt;pargfid)) {</div><div class='add'>+        gf_uuid_copy(parent-&gt;gfid, loc-&gt;pargfid);</div><div class='add'>+    }</div><div class='add'>+    if (loc-&gt;path &amp;&amp; strchr(loc-&gt;path, '/')) {</div><div class='add'>+        str = gf_strdup(loc-&gt;path);</div><div class='add'>+        if (str == NULL) {</div><div class='add'>+            gf_msg(xl-&gt;name, GF_LOG_ERROR, ENOMEM, EC_MSG_NO_MEMORY,</div><div class='add'>+                   "Unable to duplicate path '%s'", loc-&gt;path);</div><div class='add'>+</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+        parent-&gt;path = gf_strdup(dirname(str));</div><div class='add'>+        if (parent-&gt;path == NULL) {</div><div class='add'>+            gf_msg(xl-&gt;name, GF_LOG_ERROR, ENOMEM, EC_MSG_NO_MEMORY,</div><div class='add'>+                   "Unable to duplicate path '%s'", dirname(str));</div><div class='add'>+</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = ec_loc_setup_path(xl, parent);</div><div class='add'>+    if (ret == 0) {</div><div class='add'>+        ret = ec_loc_setup_inode(xl, table, parent);</div><div class='add'>+    }</div><div class='add'>+    if (ret == 0) {</div><div class='add'>+        ret = ec_loc_setup_parent(xl, table, parent);</div><div class='add'>+    }</div><div class='add'>+    if (ret != 0) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if ((parent-&gt;inode == NULL) &amp;&amp; (parent-&gt;path == NULL) &amp;&amp;</div><div class='add'>+        gf_uuid_is_null(parent-&gt;gfid)) {</div><div class='add'>+        gf_msg(xl-&gt;name, GF_LOG_ERROR, EINVAL, EC_MSG_LOC_PARENT_INODE_MISSING,</div><div class='add'>+               "Parent inode missing for loc_t");</div><div class='add'>+</div><div class='add'>+        ret = -EINVAL;</div><div class='add'>+</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    GF_FREE(str);</div><div class='add'>+</div><div class='add'>+    if (ret != 0) {</div><div class='add'>+        loc_wipe(parent);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_loc_update(xlator_t *xl, loc_t *loc, inode_t *inode, struct iatt *iatt)</div><div class='add'>+{</div><div class='add'>+    inode_table_t *table = NULL;</div><div class='add'>+    int32_t ret = -EINVAL;</div><div class='add'>+</div><div class='add'>+    if (inode != NULL) {</div><div class='add'>+        table = inode-&gt;table;</div><div class='add'>+        if (loc-&gt;inode != inode) {</div><div class='add'>+            if (loc-&gt;inode != NULL) {</div><div class='add'>+                inode_unref(loc-&gt;inode);</div><div class='add'>+            }</div><div class='add'>+            loc-&gt;inode = inode_ref(inode);</div><div class='add'>+            gf_uuid_copy(loc-&gt;gfid, inode-&gt;gfid);</div><div class='add'>+        }</div><div class='add'>+    } else if (loc-&gt;inode != NULL) {</div><div class='add'>+        table = loc-&gt;inode-&gt;table;</div><div class='add'>+    } else if (loc-&gt;parent != NULL) {</div><div class='add'>+        table = loc-&gt;parent-&gt;table;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (iatt != NULL) {</div><div class='add'>+        if (!ec_loc_gfid_check(xl, loc-&gt;gfid, iatt-&gt;ia_gfid)) {</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = ec_loc_setup_path(xl, loc);</div><div class='add'>+    if (ret == 0) {</div><div class='add'>+        ret = ec_loc_setup_inode(xl, table, loc);</div><div class='add'>+    }</div><div class='add'>+    if (ret == 0) {</div><div class='add'>+        ret = ec_loc_setup_parent(xl, table, loc);</div><div class='add'>+    }</div><div class='add'>+    if (ret != 0) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_loc_from_fd(xlator_t *xl, loc_t *loc, fd_t *fd)</div><div class='add'>+{</div><div class='add'>+    ec_fd_t *ctx;</div><div class='add'>+    int32_t ret = -ENOMEM;</div><div class='add'>+</div><div class='add'>+    memset(loc, 0, sizeof(*loc));</div><div class='add'>+</div><div class='add'>+    ctx = ec_fd_get(fd, xl);</div><div class='add'>+    if (ctx != NULL) {</div><div class='add'>+        if (loc_copy(loc, &amp;ctx-&gt;loc) != 0) {</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = ec_loc_update(xl, loc, fd-&gt;inode, NULL);</div><div class='add'>+    if (ret != 0) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (ret != 0) {</div><div class='add'>+        loc_wipe(loc);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_loc_from_loc(xlator_t *xl, loc_t *dst, loc_t *src)</div><div class='add'>+{</div><div class='add'>+    int32_t ret = -ENOMEM;</div><div class='add'>+</div><div class='add'>+    memset(dst, 0, sizeof(*dst));</div><div class='add'>+</div><div class='add'>+    if (loc_copy(dst, src) != 0) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = ec_loc_update(xl, dst, NULL, NULL);</div><div class='add'>+    if (ret != 0) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (ret != 0) {</div><div class='add'>+        loc_wipe(dst);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_owner_set(call_frame_t *frame, void *owner)</div><div class='add'>+{</div><div class='add'>+    set_lk_owner_from_ptr(&amp;frame-&gt;root-&gt;lk_owner, owner);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_owner_copy(call_frame_t *frame, gf_lkowner_t *owner)</div><div class='add'>+{</div><div class='add'>+    lk_owner_copy(&amp;frame-&gt;root-&gt;lk_owner, owner);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+ec_stripe_cache_init(ec_t *ec, ec_inode_t *ctx)</div><div class='add'>+{</div><div class='add'>+    ec_stripe_list_t *stripe_cache = NULL;</div><div class='add'>+</div><div class='add'>+    stripe_cache = &amp;(ctx-&gt;stripe_cache);</div><div class='add'>+    if (stripe_cache-&gt;max == 0) {</div><div class='add'>+        stripe_cache-&gt;max = ec-&gt;stripe_cache;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+ec_inode_t *</div><div class='add'>+__ec_inode_get(inode_t *inode, xlator_t *xl)</div><div class='add'>+{</div><div class='add'>+    ec_inode_t *ctx = NULL;</div><div class='add'>+    uint64_t value = 0;</div><div class='add'>+</div><div class='add'>+    if ((__inode_ctx_get(inode, xl, &amp;value) != 0) || (value == 0)) {</div><div class='add'>+        ctx = GF_MALLOC(sizeof(*ctx), ec_mt_ec_inode_t);</div><div class='add'>+        if (ctx != NULL) {</div><div class='add'>+            memset(ctx, 0, sizeof(*ctx));</div><div class='add'>+            INIT_LIST_HEAD(&amp;ctx-&gt;heal);</div><div class='add'>+            INIT_LIST_HEAD(&amp;ctx-&gt;stripe_cache.lru);</div><div class='add'>+            ctx-&gt;heal_count = 0;</div><div class='add'>+            value = (uint64_t)(uintptr_t)ctx;</div><div class='add'>+            if (__inode_ctx_set(inode, xl, &amp;value) != 0) {</div><div class='add'>+                GF_FREE(ctx);</div><div class='add'>+</div><div class='add'>+                return NULL;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+    } else {</div><div class='add'>+        ctx = (ec_inode_t *)(uintptr_t)value;</div><div class='add'>+    }</div><div class='add'>+    if (ctx)</div><div class='add'>+        ec_stripe_cache_init(xl-&gt;private, ctx);</div><div class='add'>+</div><div class='add'>+    return ctx;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+ec_inode_t *</div><div class='add'>+ec_inode_get(inode_t *inode, xlator_t *xl)</div><div class='add'>+{</div><div class='add'>+    ec_inode_t *ctx = NULL;</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;inode-&gt;lock);</div><div class='add'>+</div><div class='add'>+    ctx = __ec_inode_get(inode, xl);</div><div class='add'>+</div><div class='add'>+    UNLOCK(&amp;inode-&gt;lock);</div><div class='add'>+</div><div class='add'>+    return ctx;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+ec_fd_t *</div><div class='add'>+__ec_fd_get(fd_t *fd, xlator_t *xl)</div><div class='add'>+{</div><div class='add'>+    int i = 0;</div><div class='add'>+    ec_fd_t *ctx = NULL;</div><div class='add'>+    ec_inode_t *ictx = NULL;</div><div class='add'>+    uint64_t value = 0;</div><div class='add'>+    ec_t *ec = xl-&gt;private;</div><div class='add'>+</div><div class='add'>+    if ((__fd_ctx_get(fd, xl, &amp;value) != 0) || (value == 0)) {</div><div class='add'>+        ctx = GF_MALLOC(sizeof(*ctx) + (sizeof(ec_fd_status_t) * ec-&gt;nodes),</div><div class='add'>+                        ec_mt_ec_fd_t);</div><div class='add'>+        if (ctx != NULL) {</div><div class='add'>+            memset(ctx, 0, sizeof(*ctx));</div><div class='add'>+</div><div class='add'>+            for (i = 0; i &lt; ec-&gt;nodes; i++) {</div><div class='add'>+                if (fd_is_anonymous(fd)) {</div><div class='add'>+                    ctx-&gt;fd_status[i] = EC_FD_OPENED;</div><div class='add'>+                } else {</div><div class='add'>+                    ctx-&gt;fd_status[i] = EC_FD_NOT_OPENED;</div><div class='add'>+                }</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            value = (uint64_t)(uintptr_t)ctx;</div><div class='add'>+            if (__fd_ctx_set(fd, xl, value) != 0) {</div><div class='add'>+                GF_FREE(ctx);</div><div class='add'>+                return NULL;</div><div class='add'>+            }</div><div class='add'>+            /* Only refering bad-version so no need for lock</div><div class='add'>+             * */</div><div class='add'>+            ictx = __ec_inode_get(fd-&gt;inode, xl);</div><div class='add'>+            if (ictx) {</div><div class='add'>+                ctx-&gt;bad_version = ictx-&gt;bad_version;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+    } else {</div><div class='add'>+        ctx = (ec_fd_t *)(uintptr_t)value;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Treat anonymous fd specially */</div><div class='add'>+    if (fd-&gt;anonymous &amp;&amp; ctx) {</div><div class='add'>+        /* Mark the fd open for all subvolumes. */</div><div class='add'>+        ctx-&gt;open = -1;</div><div class='add'>+        /* Try to populate ctx-&gt;loc with fd-&gt;inode information. */</div><div class='add'>+        ec_loc_update(xl, &amp;ctx-&gt;loc, fd-&gt;inode, NULL);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return ctx;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+ec_fd_t *</div><div class='add'>+ec_fd_get(fd_t *fd, xlator_t *xl)</div><div class='add'>+{</div><div class='add'>+    ec_fd_t *ctx = NULL;</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;fd-&gt;lock);</div><div class='add'>+</div><div class='add'>+    ctx = __ec_fd_get(fd, xl);</div><div class='add'>+</div><div class='add'>+    UNLOCK(&amp;fd-&gt;lock);</div><div class='add'>+</div><div class='add'>+    return ctx;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+gf_boolean_t</div><div class='add'>+ec_is_internal_xattr(dict_t *dict, char *key, data_t *value, void *data)</div><div class='add'>+{</div><div class='add'>+    if (key &amp;&amp; (strncmp(key, EC_XATTR_PREFIX, SLEN(EC_XATTR_PREFIX)) == 0))</div><div class='add'>+        return _gf_true;</div><div class='add'>+</div><div class='add'>+    return _gf_false;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_filter_internal_xattrs(dict_t *xattr)</div><div class='add'>+{</div><div class='add'>+    dict_foreach_match(xattr, ec_is_internal_xattr, NULL,</div><div class='add'>+                       dict_remove_foreach_fn, NULL);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+gf_boolean_t</div><div class='add'>+ec_is_data_fop(glusterfs_fop_t fop)</div><div class='add'>+{</div><div class='add'>+    switch (fop) {</div><div class='add'>+        case GF_FOP_WRITE:</div><div class='add'>+        case GF_FOP_TRUNCATE:</div><div class='add'>+        case GF_FOP_FTRUNCATE:</div><div class='add'>+        case GF_FOP_FALLOCATE:</div><div class='add'>+        case GF_FOP_DISCARD:</div><div class='add'>+        case GF_FOP_ZEROFILL:</div><div class='add'>+            return _gf_true;</div><div class='add'>+        default:</div><div class='add'>+            return _gf_false;</div><div class='add'>+    }</div><div class='add'>+    return _gf_false;</div><div class='add'>+}</div><div class='add'>+/*</div><div class='add'>+gf_boolean_t</div><div class='add'>+ec_is_metadata_fop (int32_t lock_kind, glusterfs_fop_t fop)</div><div class='add'>+{</div><div class='add'>+        if (lock_kind == EC_LOCK_ENTRY) {</div><div class='add'>+                return _gf_false;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        switch (fop) {</div><div class='add'>+        case GF_FOP_SETATTR:</div><div class='add'>+        case GF_FOP_FSETATTR:</div><div class='add'>+        case GF_FOP_SETXATTR:</div><div class='add'>+        case GF_FOP_FSETXATTR:</div><div class='add'>+        case GF_FOP_REMOVEXATTR:</div><div class='add'>+        case GF_FOP_FREMOVEXATTR:</div><div class='add'>+                return _gf_true;</div><div class='add'>+        default:</div><div class='add'>+                return _gf_false;</div><div class='add'>+        }</div><div class='add'>+        return _gf_false;</div><div class='add'>+}*/</div><div class='head'>diff --git a/xlators/cluster/ec/src/ec-helpers.h b/xlators/cluster/ec/src/ec-helpers.h<br/>new file mode 100644<br/>index 00000000000..015db514e05<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/xlators/cluster/ec/src/ec-helpers.h?id=d1d7a6f35c816822fab51c820e25023863c239c1'>xlators/cluster/ec/src/ec-helpers.h</a></div><div class='hunk'>@@ -0,0 +1,200 @@</div><div class='add'>+/*</div><div class='add'>+  Copyright (c) 2012-2014 DataLab, s.l. &lt;http://www.datalab.es&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#ifndef __EC_HELPERS_H__</div><div class='add'>+#define __EC_HELPERS_H__</div><div class='add'>+</div><div class='add'>+#include "ec-types.h"</div><div class='add'>+</div><div class='add'>+#define EC_ERR(_x) ((void *)-(intptr_t)(_x))</div><div class='add'>+#define EC_IS_ERR(_x) (((uintptr_t)(_x) &amp; ~0xfffULL) == ~0xfffULL)</div><div class='add'>+#define EC_GET_ERR(_x) ((int32_t)(intptr_t)(_x))</div><div class='add'>+</div><div class='add'>+#define EC_ALIGN_CHECK(_ptr, _align) ((((uintptr_t)(_ptr)) &amp; ((_align)-1)) == 0)</div><div class='add'>+</div><div class='add'>+const char *</div><div class='add'>+ec_bin(char *str, size_t size, uint64_t value, int32_t digits);</div><div class='add'>+const char *</div><div class='add'>+ec_fop_name(int32_t id);</div><div class='add'>+void</div><div class='add'>+ec_trace(const char *event, ec_fop_data_t *fop, const char *fmt, ...);</div><div class='add'>+int32_t</div><div class='add'>+ec_bits_consume(uint64_t *n);</div><div class='add'>+size_t</div><div class='add'>+ec_iov_copy_to(void *dst, struct iovec *vector, int32_t count, off_t offset,</div><div class='add'>+               size_t size);</div><div class='add'>+int32_t</div><div class='add'>+ec_buffer_alloc(xlator_t *xl, size_t size, struct iobref **piobref, void **ptr);</div><div class='add'>+int32_t</div><div class='add'>+ec_dict_set_array(dict_t *dict, char *key, uint64_t *value, int32_t size);</div><div class='add'>+int32_t</div><div class='add'>+ec_dict_get_array(dict_t *dict, char *key, uint64_t value[], int32_t size);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_dict_del_array(dict_t *dict, char *key, uint64_t *value, int32_t size);</div><div class='add'>+int32_t</div><div class='add'>+ec_dict_set_number(dict_t *dict, char *key, uint64_t value);</div><div class='add'>+int32_t</div><div class='add'>+ec_dict_del_number(dict_t *dict, char *key, uint64_t *value);</div><div class='add'>+int32_t</div><div class='add'>+ec_dict_set_config(dict_t *dict, char *key, ec_config_t *config);</div><div class='add'>+int32_t</div><div class='add'>+ec_dict_del_config(dict_t *dict, char *key, ec_config_t *config);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_loc_parent(xlator_t *xl, loc_t *loc, loc_t *parent);</div><div class='add'>+int32_t</div><div class='add'>+ec_loc_update(xlator_t *xl, loc_t *loc, inode_t *inode, struct iatt *iatt);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_loc_from_fd(xlator_t *xl, loc_t *loc, fd_t *fd);</div><div class='add'>+int32_t</div><div class='add'>+ec_loc_from_loc(xlator_t *xl, loc_t *dst, loc_t *src);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_owner_set(call_frame_t *frame, void *owner);</div><div class='add'>+void</div><div class='add'>+ec_owner_copy(call_frame_t *frame, gf_lkowner_t *owner);</div><div class='add'>+</div><div class='add'>+ec_inode_t *</div><div class='add'>+__ec_inode_get(inode_t *inode, xlator_t *xl);</div><div class='add'>+ec_inode_t *</div><div class='add'>+ec_inode_get(inode_t *inode, xlator_t *xl);</div><div class='add'>+ec_fd_t *</div><div class='add'>+__ec_fd_get(fd_t *fd, xlator_t *xl);</div><div class='add'>+ec_fd_t *</div><div class='add'>+ec_fd_get(fd_t *fd, xlator_t *xl);</div><div class='add'>+</div><div class='add'>+static inline uint32_t</div><div class='add'>+ec_adjust_size_down(ec_t *ec, uint64_t *value, gf_boolean_t scale)</div><div class='add'>+{</div><div class='add'>+    uint64_t head, tmp;</div><div class='add'>+</div><div class='add'>+    tmp = *value;</div><div class='add'>+    head = tmp % ec-&gt;stripe_size;</div><div class='add'>+    tmp -= head;</div><div class='add'>+</div><div class='add'>+    if (scale) {</div><div class='add'>+        tmp /= ec-&gt;fragments;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    *value = tmp;</div><div class='add'>+</div><div class='add'>+    return (uint32_t)head;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* This function can cause an overflow if the passed value is too near to the</div><div class='add'>+ * uint64_t limit. If this happens, it returns the tail in negative form and</div><div class='add'>+ * the value is set to UINT64_MAX. */</div><div class='add'>+static inline int32_t</div><div class='add'>+ec_adjust_size_up(ec_t *ec, uint64_t *value, gf_boolean_t scale)</div><div class='add'>+{</div><div class='add'>+    uint64_t tmp;</div><div class='add'>+    int32_t tail;</div><div class='add'>+</div><div class='add'>+    tmp = *value;</div><div class='add'>+    /* We first adjust the value down. This never causes overflow. */</div><div class='add'>+    tail = ec_adjust_size_down(ec, &amp;tmp, scale);</div><div class='add'>+</div><div class='add'>+    /* If the value was already aligned, tail will be 0 and nothing else</div><div class='add'>+     * needs to be done. */</div><div class='add'>+    if (tail != 0) {</div><div class='add'>+        /* Otherwise, we need to compute the real tail and adjust the</div><div class='add'>+         * returned value to the next stripe. */</div><div class='add'>+        tail = ec-&gt;stripe_size - tail;</div><div class='add'>+        if (scale) {</div><div class='add'>+            tmp += ec-&gt;fragment_size;</div><div class='add'>+        } else {</div><div class='add'>+            tmp += ec-&gt;stripe_size;</div><div class='add'>+            /* If no scaling is requested there's a possibility of</div><div class='add'>+             * overflow. */</div><div class='add'>+            if (tmp &lt; ec-&gt;stripe_size) {</div><div class='add'>+                tmp = UINT64_MAX;</div><div class='add'>+                tail = -tail;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    *value = tmp;</div><div class='add'>+</div><div class='add'>+    return tail;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* This function is equivalent to ec_adjust_size_down() but with a potentially</div><div class='add'>+ * different parameter size (off_t vs uint64_t). */</div><div class='add'>+static inline uint32_t</div><div class='add'>+ec_adjust_offset_down(ec_t *ec, off_t *value, gf_boolean_t scale)</div><div class='add'>+{</div><div class='add'>+    off_t head, tmp;</div><div class='add'>+</div><div class='add'>+    tmp = *value;</div><div class='add'>+    head = tmp % ec-&gt;stripe_size;</div><div class='add'>+    tmp -= head;</div><div class='add'>+</div><div class='add'>+    if (scale) {</div><div class='add'>+        tmp /= ec-&gt;fragments;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    *value = tmp;</div><div class='add'>+</div><div class='add'>+    return (uint32_t)head;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* This function is equivalent to ec_adjust_size_up() but with a potentially</div><div class='add'>+ * different parameter size (off_t vs uint64_t). */</div><div class='add'>+static inline int32_t</div><div class='add'>+ec_adjust_offset_up(ec_t *ec, off_t *value, gf_boolean_t scale)</div><div class='add'>+{</div><div class='add'>+    uint64_t tail, tmp;</div><div class='add'>+</div><div class='add'>+    /* An offset is a signed type that can only have positive values, so</div><div class='add'>+     * we take advantage of this to avoid overflows. We simply convert it</div><div class='add'>+     * to an unsigned integer and operate normally. This won't cause an</div><div class='add'>+     * overflow. Overflow is only checked when converting back to an</div><div class='add'>+     * off_t. */</div><div class='add'>+    tmp = *value;</div><div class='add'>+    tail = ec-&gt;stripe_size;</div><div class='add'>+    tail -= (tmp + tail - 1) % tail + 1;</div><div class='add'>+    tmp += tail;</div><div class='add'>+    if (scale) {</div><div class='add'>+        /* If we are scaling, we'll never get an overflow. */</div><div class='add'>+        tmp /= ec-&gt;fragments;</div><div class='add'>+    } else {</div><div class='add'>+        /* Check if there has been an overflow. */</div><div class='add'>+        if ((off_t)tmp &lt; 0) {</div><div class='add'>+            tmp = GF_OFF_MAX;</div><div class='add'>+            tail = -tail;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    *value = (off_t)tmp;</div><div class='add'>+</div><div class='add'>+    return (int32_t)tail;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static inline int32_t</div><div class='add'>+ec_is_power_of_2(uint32_t value)</div><div class='add'>+{</div><div class='add'>+    return (value != 0) &amp;&amp; ((value &amp; (value - 1)) == 0);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+gf_boolean_t</div><div class='add'>+ec_is_internal_xattr(dict_t *dict, char *key, data_t *value, void *data);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_filter_internal_xattrs(dict_t *xattr);</div><div class='add'>+</div><div class='add'>+gf_boolean_t</div><div class='add'>+ec_is_data_fop(glusterfs_fop_t fop);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_launch_replace_heal(ec_t *ec);</div><div class='add'>+</div><div class='add'>+#endif /* __EC_HELPERS_H__ */</div><div class='head'>diff --git a/xlators/cluster/ec/src/ec-inode-read.c b/xlators/cluster/ec/src/ec-inode-read.c<br/>new file mode 100644<br/>index 00000000000..dad5f4d7018<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/xlators/cluster/ec/src/ec-inode-read.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>xlators/cluster/ec/src/ec-inode-read.c</a></div><div class='hunk'>@@ -0,0 +1,2046 @@</div><div class='add'>+/*</div><div class='add'>+  Copyright (c) 2012-2014 DataLab, s.l. &lt;http://www.datalab.es&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#include "ec.h"</div><div class='add'>+#include "ec-messages.h"</div><div class='add'>+#include "ec-helpers.h"</div><div class='add'>+#include "ec-common.h"</div><div class='add'>+#include "ec-combine.h"</div><div class='add'>+#include "ec-method.h"</div><div class='add'>+#include "ec-fops.h"</div><div class='add'>+</div><div class='add'>+/* FOP: access */</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_access_cbk(call_frame_t *frame, void *cookie, xlator_t *this, int32_t op_ret,</div><div class='add'>+              int32_t op_errno, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    ec_fop_data_t *fop = NULL;</div><div class='add'>+    ec_cbk_data_t *cbk = NULL;</div><div class='add'>+    int32_t idx = (int32_t)(uintptr_t)cookie;</div><div class='add'>+</div><div class='add'>+    VALIDATE_OR_GOTO(this, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, frame, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, frame-&gt;local, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, this-&gt;private, out);</div><div class='add'>+</div><div class='add'>+    fop = frame-&gt;local;</div><div class='add'>+</div><div class='add'>+    ec_trace("CBK", fop, "idx=%d, frame=%p, op_ret=%d, op_errno=%d", idx, frame,</div><div class='add'>+             op_ret, op_errno);</div><div class='add'>+</div><div class='add'>+    cbk = ec_cbk_data_allocate(frame, this, fop, GF_FOP_ACCESS, idx, op_ret,</div><div class='add'>+                               op_errno);</div><div class='add'>+    if (cbk) {</div><div class='add'>+        if (xdata)</div><div class='add'>+            cbk-&gt;xdata = dict_ref(xdata);</div><div class='add'>+        ec_combine(cbk, NULL);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (fop != NULL) {</div><div class='add'>+        ec_complete(fop);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_wind_access(ec_t *ec, ec_fop_data_t *fop, int32_t idx)</div><div class='add'>+{</div><div class='add'>+    ec_trace("WIND", fop, "idx=%d", idx);</div><div class='add'>+</div><div class='add'>+    STACK_WIND_COOKIE(fop-&gt;frame, ec_access_cbk, (void *)(uintptr_t)idx,</div><div class='add'>+                      ec-&gt;xl_list[idx], ec-&gt;xl_list[idx]-&gt;fops-&gt;access,</div><div class='add'>+                      &amp;fop-&gt;loc[0], fop-&gt;int32, fop-&gt;xdata);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_manager_access(ec_fop_data_t *fop, int32_t state)</div><div class='add'>+{</div><div class='add'>+    ec_cbk_data_t *cbk = NULL;</div><div class='add'>+</div><div class='add'>+    switch (state) {</div><div class='add'>+        case EC_STATE_INIT:</div><div class='add'>+        case EC_STATE_LOCK:</div><div class='add'>+            ec_lock_prepare_inode(fop, &amp;fop-&gt;loc[0], EC_QUERY_INFO, 0,</div><div class='add'>+                                  EC_RANGE_FULL);</div><div class='add'>+            ec_lock(fop);</div><div class='add'>+</div><div class='add'>+            return EC_STATE_DISPATCH;</div><div class='add'>+</div><div class='add'>+        case EC_STATE_DISPATCH:</div><div class='add'>+            ec_dispatch_one(fop);</div><div class='add'>+</div><div class='add'>+            return EC_STATE_PREPARE_ANSWER;</div><div class='add'>+</div><div class='add'>+        case EC_STATE_PREPARE_ANSWER:</div><div class='add'>+            if (ec_dispatch_one_retry(fop, NULL)) {</div><div class='add'>+                return EC_STATE_DISPATCH;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            return EC_STATE_REPORT;</div><div class='add'>+</div><div class='add'>+        case EC_STATE_REPORT:</div><div class='add'>+            cbk = fop-&gt;answer;</div><div class='add'>+            GF_ASSERT(cbk);</div><div class='add'>+            if (fop-&gt;cbks.access != NULL) {</div><div class='add'>+                if (cbk) {</div><div class='add'>+                    fop-&gt;cbks.access(fop-&gt;req_frame, fop, fop-&gt;xl, cbk-&gt;op_ret,</div><div class='add'>+                                     cbk-&gt;op_errno, cbk-&gt;xdata);</div><div class='add'>+                }</div><div class='add'>+            }</div><div class='add'>+            return EC_STATE_LOCK_REUSE;</div><div class='add'>+</div><div class='add'>+        case -EC_STATE_INIT:</div><div class='add'>+        case -EC_STATE_LOCK:</div><div class='add'>+        case -EC_STATE_DISPATCH:</div><div class='add'>+        case -EC_STATE_PREPARE_ANSWER:</div><div class='add'>+        case -EC_STATE_REPORT:</div><div class='add'>+            if (fop-&gt;cbks.access != NULL) {</div><div class='add'>+                fop-&gt;cbks.access(fop-&gt;req_frame, fop, fop-&gt;xl, -1, fop-&gt;error,</div><div class='add'>+                                 NULL);</div><div class='add'>+            }</div><div class='add'>+            return EC_STATE_LOCK_REUSE;</div><div class='add'>+</div><div class='add'>+        case -EC_STATE_LOCK_REUSE:</div><div class='add'>+        case EC_STATE_LOCK_REUSE:</div><div class='add'>+            ec_lock_reuse(fop);</div><div class='add'>+</div><div class='add'>+            return EC_STATE_UNLOCK;</div><div class='add'>+</div><div class='add'>+        case -EC_STATE_UNLOCK:</div><div class='add'>+        case EC_STATE_UNLOCK:</div><div class='add'>+            ec_unlock(fop);</div><div class='add'>+</div><div class='add'>+            return EC_STATE_END;</div><div class='add'>+</div><div class='add'>+        default:</div><div class='add'>+            gf_msg(fop-&gt;xl-&gt;name, GF_LOG_ERROR, EINVAL, EC_MSG_UNHANDLED_STATE,</div><div class='add'>+                   "Unhandled state %d for %s", state, ec_fop_name(fop-&gt;id));</div><div class='add'>+</div><div class='add'>+            return EC_STATE_END;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_access(call_frame_t *frame, xlator_t *this, uintptr_t target,</div><div class='add'>+          uint32_t fop_flags, fop_access_cbk_t func, void *data, loc_t *loc,</div><div class='add'>+          int32_t mask, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    ec_cbk_t callback = {.access = func};</div><div class='add'>+    ec_fop_data_t *fop = NULL;</div><div class='add'>+    int32_t error = ENOMEM;</div><div class='add'>+</div><div class='add'>+    gf_msg_trace("ec", 0, "EC(ACCESS) %p", frame);</div><div class='add'>+</div><div class='add'>+    VALIDATE_OR_GOTO(this, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, frame, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, this-&gt;private, out);</div><div class='add'>+</div><div class='add'>+    fop = ec_fop_data_allocate(frame, this, GF_FOP_ACCESS, EC_FLAG_LOCK_SHARED,</div><div class='add'>+                               target, fop_flags, ec_wind_access,</div><div class='add'>+                               ec_manager_access, callback, data);</div><div class='add'>+    if (fop == NULL) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    fop-&gt;int32 = mask;</div><div class='add'>+</div><div class='add'>+    if (loc != NULL) {</div><div class='add'>+        if (loc_copy(&amp;fop-&gt;loc[0], loc) != 0) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, ENOMEM, EC_MSG_LOC_COPY_FAIL,</div><div class='add'>+                   "Failed to copy a location.");</div><div class='add'>+</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    if (xdata != NULL) {</div><div class='add'>+        fop-&gt;xdata = dict_ref(xdata);</div><div class='add'>+        if (fop-&gt;xdata == NULL) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, 0, EC_MSG_DICT_REF_FAIL,</div><div class='add'>+                   "Failed to reference a "</div><div class='add'>+                   "dictionary.");</div><div class='add'>+</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    error = 0;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (fop != NULL) {</div><div class='add'>+        ec_manager(fop, error);</div><div class='add'>+    } else {</div><div class='add'>+        func(frame, NULL, this, -1, error, NULL);</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* FOP: getxattr */</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_combine_getxattr(ec_fop_data_t *fop, ec_cbk_data_t *dst, ec_cbk_data_t *src)</div><div class='add'>+{</div><div class='add'>+    if (!ec_dict_compare(dst-&gt;dict, src-&gt;dict)) {</div><div class='add'>+        gf_msg(fop-&gt;xl-&gt;name, GF_LOG_NOTICE, 0, EC_MSG_DICT_MISMATCH,</div><div class='add'>+               "Mismatching dictionary in "</div><div class='add'>+               "answers of 'GF_FOP_GETXATTR'");</div><div class='add'>+</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_getxattr_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                int32_t op_ret, int32_t op_errno, dict_t *dict, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    ec_fop_data_t *fop = NULL;</div><div class='add'>+    ec_cbk_data_t *cbk = NULL;</div><div class='add'>+    int32_t idx = (int32_t)(uintptr_t)cookie;</div><div class='add'>+</div><div class='add'>+    VALIDATE_OR_GOTO(this, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, frame, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, frame-&gt;local, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, this-&gt;private, out);</div><div class='add'>+</div><div class='add'>+    fop = frame-&gt;local;</div><div class='add'>+</div><div class='add'>+    ec_trace("CBK", fop, "idx=%d, frame=%p, op_ret=%d, op_errno=%d", idx, frame,</div><div class='add'>+             op_ret, op_errno);</div><div class='add'>+</div><div class='add'>+    cbk = ec_cbk_data_allocate(frame, this, fop, GF_FOP_GETXATTR, idx, op_ret,</div><div class='add'>+                               op_errno);</div><div class='add'>+    if (cbk != NULL) {</div><div class='add'>+        if (op_ret &gt;= 0) {</div><div class='add'>+            if (dict != NULL) {</div><div class='add'>+                cbk-&gt;dict = dict_ref(dict);</div><div class='add'>+                if (cbk-&gt;dict == NULL) {</div><div class='add'>+                    gf_msg(this-&gt;name, GF_LOG_ERROR, 0, EC_MSG_DICT_REF_FAIL,</div><div class='add'>+                           "Failed to reference a "</div><div class='add'>+                           "dictionary.");</div><div class='add'>+</div><div class='add'>+                    goto out;</div><div class='add'>+                }</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+        if (xdata != NULL) {</div><div class='add'>+            cbk-&gt;xdata = dict_ref(xdata);</div><div class='add'>+            if (cbk-&gt;xdata == NULL) {</div><div class='add'>+                gf_msg(this-&gt;name, GF_LOG_ERROR, 0, EC_MSG_DICT_REF_FAIL,</div><div class='add'>+                       "Failed to reference a "</div><div class='add'>+                       "dictionary.");</div><div class='add'>+</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        ec_combine(cbk, ec_combine_getxattr);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (fop != NULL) {</div><div class='add'>+        ec_complete(fop);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_wind_getxattr(ec_t *ec, ec_fop_data_t *fop, int32_t idx)</div><div class='add'>+{</div><div class='add'>+    ec_trace("WIND", fop, "idx=%d", idx);</div><div class='add'>+</div><div class='add'>+    STACK_WIND_COOKIE(fop-&gt;frame, ec_getxattr_cbk, (void *)(uintptr_t)idx,</div><div class='add'>+                      ec-&gt;xl_list[idx], ec-&gt;xl_list[idx]-&gt;fops-&gt;getxattr,</div><div class='add'>+                      &amp;fop-&gt;loc[0], fop-&gt;str[0], fop-&gt;xdata);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_handle_special_xattrs(ec_fop_data_t *fop)</div><div class='add'>+{</div><div class='add'>+    ec_cbk_data_t *cbk = NULL;</div><div class='add'>+    /* Stime may not be available on all the bricks, so even if some of the</div><div class='add'>+     * subvols succeed the operation, treat it as answer.*/</div><div class='add'>+    if (fop-&gt;str[0] &amp;&amp; fnmatch(GF_XATTR_STIME_PATTERN, fop-&gt;str[0], 0) == 0) {</div><div class='add'>+        if (!fop-&gt;answer || (fop-&gt;answer-&gt;op_ret &lt; 0)) {</div><div class='add'>+            list_for_each_entry(cbk, &amp;fop-&gt;cbk_list, list)</div><div class='add'>+            {</div><div class='add'>+                if (cbk-&gt;op_ret &gt;= 0) {</div><div class='add'>+                    fop-&gt;answer = cbk;</div><div class='add'>+                    break;</div><div class='add'>+                }</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_manager_getxattr(ec_fop_data_t *fop, int32_t state)</div><div class='add'>+{</div><div class='add'>+    ec_cbk_data_t *cbk;</div><div class='add'>+</div><div class='add'>+    switch (state) {</div><div class='add'>+        case EC_STATE_INIT:</div><div class='add'>+        case EC_STATE_LOCK:</div><div class='add'>+            /* clear-locks commands must be done without any locks acquired</div><div class='add'>+               to avoid interferences. */</div><div class='add'>+            if ((fop-&gt;str[0] == NULL) ||</div><div class='add'>+                (strncmp(fop-&gt;str[0], GF_XATTR_CLRLK_CMD,</div><div class='add'>+                         SLEN(GF_XATTR_CLRLK_CMD)) != 0)) {</div><div class='add'>+                if (fop-&gt;fd == NULL) {</div><div class='add'>+                    ec_lock_prepare_inode(fop, &amp;fop-&gt;loc[0], EC_QUERY_INFO, 0,</div><div class='add'>+                                          EC_RANGE_FULL);</div><div class='add'>+                } else {</div><div class='add'>+                    ec_lock_prepare_fd(fop, fop-&gt;fd, EC_QUERY_INFO, 0,</div><div class='add'>+                                       EC_RANGE_FULL);</div><div class='add'>+                }</div><div class='add'>+                ec_lock(fop);</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            return EC_STATE_DISPATCH;</div><div class='add'>+</div><div class='add'>+        case EC_STATE_DISPATCH:</div><div class='add'>+            if (fop-&gt;minimum == EC_MINIMUM_ALL) {</div><div class='add'>+                ec_dispatch_all(fop);</div><div class='add'>+            } else {</div><div class='add'>+                ec_dispatch_one(fop);</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            return EC_STATE_PREPARE_ANSWER;</div><div class='add'>+</div><div class='add'>+        case EC_STATE_PREPARE_ANSWER:</div><div class='add'>+            ec_handle_special_xattrs(fop);</div><div class='add'>+            if (fop-&gt;minimum == EC_MINIMUM_ALL) {</div><div class='add'>+                cbk = ec_fop_prepare_answer(fop, _gf_true);</div><div class='add'>+            } else {</div><div class='add'>+                if (ec_dispatch_one_retry(fop, &amp;cbk)) {</div><div class='add'>+                    return EC_STATE_DISPATCH;</div><div class='add'>+                }</div><div class='add'>+            }</div><div class='add'>+            if (cbk != NULL) {</div><div class='add'>+                int32_t err;</div><div class='add'>+</div><div class='add'>+                err = ec_dict_combine(cbk, EC_COMBINE_DICT);</div><div class='add'>+                if (!ec_cbk_set_error(cbk, -err, _gf_true)) {</div><div class='add'>+                    if (cbk-&gt;xdata != NULL)</div><div class='add'>+                        ec_filter_internal_xattrs(cbk-&gt;xdata);</div><div class='add'>+</div><div class='add'>+                    if (cbk-&gt;dict != NULL)</div><div class='add'>+                        ec_filter_internal_xattrs(cbk-&gt;dict);</div><div class='add'>+                }</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            return EC_STATE_REPORT;</div><div class='add'>+</div><div class='add'>+        case EC_STATE_REPORT:</div><div class='add'>+            cbk = fop-&gt;answer;</div><div class='add'>+</div><div class='add'>+            GF_ASSERT(cbk != NULL);</div><div class='add'>+</div><div class='add'>+            if (fop-&gt;cbks.getxattr != NULL) {</div><div class='add'>+                fop-&gt;cbks.getxattr(fop-&gt;req_frame, fop, fop-&gt;xl, cbk-&gt;op_ret,</div><div class='add'>+                                   cbk-&gt;op_errno, cbk-&gt;dict, cbk-&gt;xdata);</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            return EC_STATE_LOCK_REUSE;</div><div class='add'>+</div><div class='add'>+        case -EC_STATE_INIT:</div><div class='add'>+        case -EC_STATE_LOCK:</div><div class='add'>+        case -EC_STATE_DISPATCH:</div><div class='add'>+        case -EC_STATE_PREPARE_ANSWER:</div><div class='add'>+        case -EC_STATE_REPORT:</div><div class='add'>+            GF_ASSERT(fop-&gt;error != 0);</div><div class='add'>+</div><div class='add'>+            if (fop-&gt;cbks.getxattr != NULL) {</div><div class='add'>+                fop-&gt;cbks.getxattr(fop-&gt;req_frame, fop, fop-&gt;xl, -1, fop-&gt;error,</div><div class='add'>+                                   NULL, NULL);</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            return EC_STATE_LOCK_REUSE;</div><div class='add'>+</div><div class='add'>+        case -EC_STATE_LOCK_REUSE:</div><div class='add'>+        case EC_STATE_LOCK_REUSE:</div><div class='add'>+            ec_lock_reuse(fop);</div><div class='add'>+</div><div class='add'>+            return EC_STATE_UNLOCK;</div><div class='add'>+</div><div class='add'>+        case -EC_STATE_UNLOCK:</div><div class='add'>+        case EC_STATE_UNLOCK:</div><div class='add'>+            ec_unlock(fop);</div><div class='add'>+</div><div class='add'>+            return EC_STATE_END;</div><div class='add'>+</div><div class='add'>+        default:</div><div class='add'>+            gf_msg(fop-&gt;xl-&gt;name, GF_LOG_ERROR, EINVAL, EC_MSG_UNHANDLED_STATE,</div><div class='add'>+                   "Unhandled state %d for %s", state, ec_fop_name(fop-&gt;id));</div><div class='add'>+</div><div class='add'>+            return EC_STATE_END;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_getxattr_heal_cbk(call_frame_t *frame, void *cookie, xlator_t *xl,</div><div class='add'>+                     int32_t op_ret, int32_t op_errno, uintptr_t mask,</div><div class='add'>+                     uintptr_t good, uintptr_t bad, uint32_t pending,</div><div class='add'>+                     dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    fop_getxattr_cbk_t func = cookie;</div><div class='add'>+    ec_t *ec = xl-&gt;private;</div><div class='add'>+    dict_t *dict = NULL;</div><div class='add'>+    char *str;</div><div class='add'>+    char bin1[65], bin2[65];</div><div class='add'>+</div><div class='add'>+    /* We try to return the 'pending' information in xdata, but if this cannot</div><div class='add'>+     * be set, we will ignore it silently. We prefer to report the success or</div><div class='add'>+     * failure of the heal itself. */</div><div class='add'>+    if (xdata == NULL) {</div><div class='add'>+        xdata = dict_new();</div><div class='add'>+    } else {</div><div class='add'>+        dict_ref(xdata);</div><div class='add'>+    }</div><div class='add'>+    if (xdata != NULL) {</div><div class='add'>+        if (dict_set_uint32(xdata, EC_XATTR_HEAL_NEW, pending) != 0) {</div><div class='add'>+            /* dict_set_uint32() is marked as 'warn_unused_result' and gcc</div><div class='add'>+             * enforces to check the result in this case. However we don't</div><div class='add'>+             * really care if it succeeded or not. We'll just do the same.</div><div class='add'>+             *</div><div class='add'>+             * This empty 'if' avoids the warning, and it will be removed by</div><div class='add'>+             * the optimizer. */</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (op_ret &gt;= 0) {</div><div class='add'>+        dict = dict_new();</div><div class='add'>+        if (dict == NULL) {</div><div class='add'>+            op_ret = -1;</div><div class='add'>+            op_errno = ENOMEM;</div><div class='add'>+        } else {</div><div class='add'>+            if (gf_asprintf(&amp;str, "Good: %s, Bad: %s",</div><div class='add'>+                            ec_bin(bin1, sizeof(bin1), good, ec-&gt;nodes),</div><div class='add'>+                            ec_bin(bin2, sizeof(bin2), mask &amp; ~(good | bad),</div><div class='add'>+                                   ec-&gt;nodes)) &lt; 0) {</div><div class='add'>+                dict_unref(dict);</div><div class='add'>+                dict = NULL;</div><div class='add'>+</div><div class='add'>+                op_ret = -1;</div><div class='add'>+                op_errno = ENOMEM;</div><div class='add'>+</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            if (dict_set_dynstr(dict, EC_XATTR_HEAL, str) != 0) {</div><div class='add'>+                GF_FREE(str);</div><div class='add'>+                dict_unref(dict);</div><div class='add'>+                dict = NULL;</div><div class='add'>+</div><div class='add'>+                op_ret = -1;</div><div class='add'>+                op_errno = ENOMEM;</div><div class='add'>+</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    func(frame, NULL, xl, op_ret, op_errno, dict, xdata);</div><div class='add'>+</div><div class='add'>+    if (dict != NULL) {</div><div class='add'>+        dict_unref(dict);</div><div class='add'>+    }</div><div class='add'>+    if (xdata != NULL) {</div><div class='add'>+        dict_unref(xdata);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_getxattr(call_frame_t *frame, xlator_t *this, uintptr_t target,</div><div class='add'>+            uint32_t fop_flags, fop_getxattr_cbk_t func, void *data, loc_t *loc,</div><div class='add'>+            const char *name, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    ec_cbk_t callback = {.getxattr = func};</div><div class='add'>+    ec_fop_data_t *fop = NULL;</div><div class='add'>+    int32_t error = ENOMEM;</div><div class='add'>+</div><div class='add'>+    gf_msg_trace("ec", 0, "EC(GETXATTR) %p", frame);</div><div class='add'>+</div><div class='add'>+    VALIDATE_OR_GOTO(this, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, frame, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, this-&gt;private, out);</div><div class='add'>+</div><div class='add'>+    /* Special handling of an explicit self-heal request */</div><div class='add'>+    if ((name != NULL) &amp;&amp; (strcmp(name, EC_XATTR_HEAL) == 0)) {</div><div class='add'>+        ec_heal(frame, this, target, EC_MINIMUM_ONE, ec_getxattr_heal_cbk, func,</div><div class='add'>+                loc, 0, NULL);</div><div class='add'>+</div><div class='add'>+        return;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    fop = ec_fop_data_allocate(</div><div class='add'>+        frame, this, GF_FOP_GETXATTR, EC_FLAG_LOCK_SHARED, target, fop_flags,</div><div class='add'>+        ec_wind_getxattr, ec_manager_getxattr, callback, data);</div><div class='add'>+    if (fop == NULL) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (loc != NULL) {</div><div class='add'>+        if (loc_copy(&amp;fop-&gt;loc[0], loc) != 0) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, ENOMEM, EC_MSG_LOC_COPY_FAIL,</div><div class='add'>+                   "Failed to copy a location.");</div><div class='add'>+</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    if (name != NULL) {</div><div class='add'>+        /* In case of list-node-uuids xattr, set flag to indicate</div><div class='add'>+         * the same and use node-uuid xattr for winding fop */</div><div class='add'>+        if (XATTR_IS_NODE_UUID_LIST(name)) {</div><div class='add'>+            fop-&gt;int32 = 1;</div><div class='add'>+            fop-&gt;str[0] = gf_strdup(GF_XATTR_NODE_UUID_KEY);</div><div class='add'>+        } else {</div><div class='add'>+            fop-&gt;str[0] = gf_strdup(name);</div><div class='add'>+        }</div><div class='add'>+        if (fop-&gt;str[0] == NULL) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, ENOMEM, EC_MSG_NO_MEMORY,</div><div class='add'>+                   "Failed to duplicate a string.");</div><div class='add'>+</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    if (xdata != NULL) {</div><div class='add'>+        fop-&gt;xdata = dict_ref(xdata);</div><div class='add'>+        if (fop-&gt;xdata == NULL) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, 0, EC_MSG_DICT_REF_FAIL,</div><div class='add'>+                   "Failed to reference a "</div><div class='add'>+                   "dictionary.");</div><div class='add'>+</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    error = 0;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (fop != NULL) {</div><div class='add'>+        ec_manager(fop, error);</div><div class='add'>+    } else {</div><div class='add'>+        func(frame, NULL, this, -1, error, NULL, NULL);</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* FOP: fgetxattr */</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_fgetxattr_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                 int32_t op_ret, int32_t op_errno, dict_t *dict, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    ec_fop_data_t *fop = NULL;</div><div class='add'>+    ec_cbk_data_t *cbk = NULL;</div><div class='add'>+    int32_t idx = (int32_t)(uintptr_t)cookie;</div><div class='add'>+</div><div class='add'>+    VALIDATE_OR_GOTO(this, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, frame, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, frame-&gt;local, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, this-&gt;private, out);</div><div class='add'>+</div><div class='add'>+    fop = frame-&gt;local;</div><div class='add'>+</div><div class='add'>+    ec_trace("CBK", fop, "idx=%d, frame=%p, op_ret=%d, op_errno=%d", idx, frame,</div><div class='add'>+             op_ret, op_errno);</div><div class='add'>+</div><div class='add'>+    cbk = ec_cbk_data_allocate(frame, this, fop, GF_FOP_FGETXATTR, idx, op_ret,</div><div class='add'>+                               op_errno);</div><div class='add'>+    if (cbk != NULL) {</div><div class='add'>+        if (op_ret &gt;= 0) {</div><div class='add'>+            if (dict != NULL) {</div><div class='add'>+                cbk-&gt;dict = dict_ref(dict);</div><div class='add'>+                if (cbk-&gt;dict == NULL) {</div><div class='add'>+                    gf_msg(this-&gt;name, GF_LOG_ERROR, 0, EC_MSG_DICT_REF_FAIL,</div><div class='add'>+                           "Failed to reference a "</div><div class='add'>+                           "dictionary.");</div><div class='add'>+</div><div class='add'>+                    goto out;</div><div class='add'>+                }</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+        if (xdata != NULL) {</div><div class='add'>+            cbk-&gt;xdata = dict_ref(xdata);</div><div class='add'>+            if (cbk-&gt;xdata == NULL) {</div><div class='add'>+                gf_msg(this-&gt;name, GF_LOG_ERROR, 0, EC_MSG_DICT_REF_FAIL,</div><div class='add'>+                       "Failed to reference a "</div><div class='add'>+                       "dictionary.");</div><div class='add'>+</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        ec_combine(cbk, ec_combine_getxattr);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (fop != NULL) {</div><div class='add'>+        ec_complete(fop);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_wind_fgetxattr(ec_t *ec, ec_fop_data_t *fop, int32_t idx)</div><div class='add'>+{</div><div class='add'>+    ec_trace("WIND", fop, "idx=%d", idx);</div><div class='add'>+</div><div class='add'>+    STACK_WIND_COOKIE(fop-&gt;frame, ec_fgetxattr_cbk, (void *)(uintptr_t)idx,</div><div class='add'>+                      ec-&gt;xl_list[idx], ec-&gt;xl_list[idx]-&gt;fops-&gt;fgetxattr,</div><div class='add'>+                      fop-&gt;fd, fop-&gt;str[0], fop-&gt;xdata);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_fgetxattr(call_frame_t *frame, xlator_t *this, uintptr_t target,</div><div class='add'>+             uint32_t fop_flags, fop_fgetxattr_cbk_t func, void *data, fd_t *fd,</div><div class='add'>+             const char *name, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    ec_cbk_t callback = {.fgetxattr = func};</div><div class='add'>+    ec_fop_data_t *fop = NULL;</div><div class='add'>+    int32_t error = ENOMEM;</div><div class='add'>+</div><div class='add'>+    gf_msg_trace("ec", 0, "EC(FGETXATTR) %p", frame);</div><div class='add'>+</div><div class='add'>+    VALIDATE_OR_GOTO(this, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, frame, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, this-&gt;private, out);</div><div class='add'>+</div><div class='add'>+    fop = ec_fop_data_allocate(</div><div class='add'>+        frame, this, GF_FOP_FGETXATTR, EC_FLAG_LOCK_SHARED, target, fop_flags,</div><div class='add'>+        ec_wind_fgetxattr, ec_manager_getxattr, callback, data);</div><div class='add'>+    if (fop == NULL) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    fop-&gt;use_fd = 1;</div><div class='add'>+</div><div class='add'>+    if (fd != NULL) {</div><div class='add'>+        fop-&gt;fd = fd_ref(fd);</div><div class='add'>+        if (fop-&gt;fd == NULL) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, 0, EC_MSG_FILE_DESC_REF_FAIL,</div><div class='add'>+                   "Failed to reference a "</div><div class='add'>+                   "file descriptor.");</div><div class='add'>+</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    if (name != NULL) {</div><div class='add'>+        fop-&gt;str[0] = gf_strdup(name);</div><div class='add'>+        if (fop-&gt;str[0] == NULL) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, ENOMEM, EC_MSG_NO_MEMORY,</div><div class='add'>+                   "Failed to duplicate a string.");</div><div class='add'>+</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    if (xdata != NULL) {</div><div class='add'>+        fop-&gt;xdata = dict_ref(xdata);</div><div class='add'>+        if (fop-&gt;xdata == NULL) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, 0, EC_MSG_DICT_REF_FAIL,</div><div class='add'>+                   "Failed to reference a "</div><div class='add'>+                   "dictionary.");</div><div class='add'>+</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    error = 0;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (fop != NULL) {</div><div class='add'>+        ec_manager(fop, error);</div><div class='add'>+    } else {</div><div class='add'>+        func(frame, NULL, this, -1, error, NULL, NULL);</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* FOP: open */</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_combine_open(ec_fop_data_t *fop, ec_cbk_data_t *dst, ec_cbk_data_t *src)</div><div class='add'>+{</div><div class='add'>+    if (dst-&gt;fd != src-&gt;fd) {</div><div class='add'>+        gf_msg(fop-&gt;xl-&gt;name, GF_LOG_NOTICE, 0, EC_MSG_FD_MISMATCH,</div><div class='add'>+               "Mismatching fd in answers "</div><div class='add'>+               "of 'GF_FOP_OPEN': %p &lt;-&gt; %p",</div><div class='add'>+               dst-&gt;fd, src-&gt;fd);</div><div class='add'>+</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_open_cbk(call_frame_t *frame, void *cookie, xlator_t *this, int32_t op_ret,</div><div class='add'>+            int32_t op_errno, fd_t *fd, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    ec_fop_data_t *fop = NULL;</div><div class='add'>+    ec_cbk_data_t *cbk = NULL;</div><div class='add'>+    int32_t idx = (int32_t)(uintptr_t)cookie;</div><div class='add'>+</div><div class='add'>+    VALIDATE_OR_GOTO(this, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, frame, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, frame-&gt;local, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, this-&gt;private, out);</div><div class='add'>+</div><div class='add'>+    fop = frame-&gt;local;</div><div class='add'>+</div><div class='add'>+    ec_trace("CBK", fop, "idx=%d, frame=%p, op_ret=%d, op_errno=%d", idx, frame,</div><div class='add'>+             op_ret, op_errno);</div><div class='add'>+</div><div class='add'>+    cbk = ec_cbk_data_allocate(frame, this, fop, GF_FOP_OPEN, idx, op_ret,</div><div class='add'>+                               op_errno);</div><div class='add'>+    if (cbk != NULL) {</div><div class='add'>+        if (op_ret &gt;= 0) {</div><div class='add'>+            if (fd != NULL) {</div><div class='add'>+                cbk-&gt;fd = fd_ref(fd);</div><div class='add'>+                if (cbk-&gt;fd == NULL) {</div><div class='add'>+                    gf_msg(this-&gt;name, GF_LOG_ERROR, 0,</div><div class='add'>+                           EC_MSG_FILE_DESC_REF_FAIL,</div><div class='add'>+                           "Failed to reference a "</div><div class='add'>+                           "file descriptor.");</div><div class='add'>+</div><div class='add'>+                    goto out;</div><div class='add'>+                }</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+        if (xdata != NULL) {</div><div class='add'>+            cbk-&gt;xdata = dict_ref(xdata);</div><div class='add'>+            if (cbk-&gt;xdata == NULL) {</div><div class='add'>+                gf_msg(this-&gt;name, GF_LOG_ERROR, 0, EC_MSG_DICT_REF_FAIL,</div><div class='add'>+                       "Failed to reference a "</div><div class='add'>+                       "dictionary.");</div><div class='add'>+</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        ec_combine(cbk, ec_combine_open);</div><div class='add'>+</div><div class='add'>+        ec_update_fd_status(fd, this, idx, op_ret);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (fop != NULL) {</div><div class='add'>+        ec_complete(fop);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_wind_open(ec_t *ec, ec_fop_data_t *fop, int32_t idx)</div><div class='add'>+{</div><div class='add'>+    ec_trace("WIND", fop, "idx=%d", idx);</div><div class='add'>+</div><div class='add'>+    STACK_WIND_COOKIE(fop-&gt;frame, ec_open_cbk, (void *)(uintptr_t)idx,</div><div class='add'>+                      ec-&gt;xl_list[idx], ec-&gt;xl_list[idx]-&gt;fops-&gt;open,</div><div class='add'>+                      &amp;fop-&gt;loc[0], fop-&gt;int32, fop-&gt;fd, fop-&gt;xdata);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_open_truncate_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                     int32_t op_ret, int32_t op_errno, struct iatt *prebuf,</div><div class='add'>+                     struct iatt *postbuf, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    ec_fop_data_t *fop = cookie;</div><div class='add'>+    int32_t error = 0;</div><div class='add'>+</div><div class='add'>+    fop = fop-&gt;data;</div><div class='add'>+    if (op_ret &gt;= 0) {</div><div class='add'>+        fop-&gt;answer-&gt;iatt[0] = *postbuf;</div><div class='add'>+    } else {</div><div class='add'>+        error = op_errno;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ec_resume(fop, error);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_manager_open(ec_fop_data_t *fop, int32_t state)</div><div class='add'>+{</div><div class='add'>+    ec_cbk_data_t *cbk;</div><div class='add'>+    ec_fd_t *ctx;</div><div class='add'>+    int32_t err;</div><div class='add'>+</div><div class='add'>+    switch (state) {</div><div class='add'>+        case EC_STATE_INIT:</div><div class='add'>+            LOCK(&amp;fop-&gt;fd-&gt;lock);</div><div class='add'>+</div><div class='add'>+            ctx = __ec_fd_get(fop-&gt;fd, fop-&gt;xl);</div><div class='add'>+            if (ctx == NULL) {</div><div class='add'>+                UNLOCK(&amp;fop-&gt;fd-&gt;lock);</div><div class='add'>+</div><div class='add'>+                fop-&gt;error = ENOMEM;</div><div class='add'>+</div><div class='add'>+                return EC_STATE_REPORT;</div><div class='add'>+            }</div><div class='add'>+            if (!ctx-&gt;loc.inode) {</div><div class='add'>+                err = ec_loc_from_loc(fop-&gt;xl, &amp;ctx-&gt;loc, &amp;fop-&gt;loc[0]);</div><div class='add'>+                if (err != 0) {</div><div class='add'>+                    UNLOCK(&amp;fop-&gt;fd-&gt;lock);</div><div class='add'>+</div><div class='add'>+                    fop-&gt;error = -err;</div><div class='add'>+</div><div class='add'>+                    return EC_STATE_REPORT;</div><div class='add'>+                }</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            ctx-&gt;flags = fop-&gt;int32;</div><div class='add'>+</div><div class='add'>+            UNLOCK(&amp;fop-&gt;fd-&gt;lock);</div><div class='add'>+</div><div class='add'>+            /* We need to write to specific offsets on the bricks, so we</div><div class='add'>+               need to remove O_APPEND from flags (if present).</div><div class='add'>+               If O_TRUNC is specified, we remove it from open and an</div><div class='add'>+               ftruncate will be executed later, which will correctly update</div><div class='add'>+               the file size taking appropriate locks. O_TRUNC flag is saved</div><div class='add'>+               into fop-&gt;uint32 to use it later.*/</div><div class='add'>+            fop-&gt;uint32 = fop-&gt;int32 &amp; O_TRUNC;</div><div class='add'>+            fop-&gt;int32 &amp;= ~(O_APPEND | O_TRUNC);</div><div class='add'>+</div><div class='add'>+            /* Fall through */</div><div class='add'>+</div><div class='add'>+        case EC_STATE_DISPATCH:</div><div class='add'>+            ec_dispatch_all(fop);</div><div class='add'>+</div><div class='add'>+            return EC_STATE_PREPARE_ANSWER;</div><div class='add'>+</div><div class='add'>+        case EC_STATE_PREPARE_ANSWER:</div><div class='add'>+            cbk = ec_fop_prepare_answer(fop, _gf_true);</div><div class='add'>+            if (cbk != NULL) {</div><div class='add'>+                int32_t err;</div><div class='add'>+</div><div class='add'>+                err = ec_loc_update(fop-&gt;xl, &amp;fop-&gt;loc[0], cbk-&gt;fd-&gt;inode,</div><div class='add'>+                                    NULL);</div><div class='add'>+                if (!ec_cbk_set_error(cbk, -err, _gf_true)) {</div><div class='add'>+                    LOCK(&amp;fop-&gt;fd-&gt;lock);</div><div class='add'>+</div><div class='add'>+                    ctx = __ec_fd_get(fop-&gt;fd, fop-&gt;xl);</div><div class='add'>+                    if (ctx != NULL) {</div><div class='add'>+                        ctx-&gt;open |= cbk-&gt;mask;</div><div class='add'>+                    }</div><div class='add'>+</div><div class='add'>+                    UNLOCK(&amp;fop-&gt;fd-&gt;lock);</div><div class='add'>+</div><div class='add'>+                    /* If O_TRUNC was specified, call ftruncate to</div><div class='add'>+                       effectively trunc the file with appropriate locks</div><div class='add'>+                       acquired. We don't use ctx-&gt;flags because self-heal</div><div class='add'>+                       can use the same fd with different flags. */</div><div class='add'>+                    if (fop-&gt;uint32 != 0) {</div><div class='add'>+                        ec_sleep(fop);</div><div class='add'>+                        ec_ftruncate(fop-&gt;req_frame, fop-&gt;xl, cbk-&gt;mask,</div><div class='add'>+                                     fop-&gt;minimum, ec_open_truncate_cbk, fop,</div><div class='add'>+                                     cbk-&gt;fd, 0, NULL);</div><div class='add'>+                    }</div><div class='add'>+                }</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            return EC_STATE_REPORT;</div><div class='add'>+</div><div class='add'>+        case EC_STATE_REPORT:</div><div class='add'>+            cbk = fop-&gt;answer;</div><div class='add'>+</div><div class='add'>+            GF_ASSERT(cbk != NULL);</div><div class='add'>+</div><div class='add'>+            if (fop-&gt;cbks.open != NULL) {</div><div class='add'>+                fop-&gt;cbks.open(fop-&gt;req_frame, fop, fop-&gt;xl, cbk-&gt;op_ret,</div><div class='add'>+                               cbk-&gt;op_errno, cbk-&gt;fd, cbk-&gt;xdata);</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            return EC_STATE_END;</div><div class='add'>+</div><div class='add'>+        case -EC_STATE_INIT:</div><div class='add'>+        case -EC_STATE_DISPATCH:</div><div class='add'>+        case -EC_STATE_PREPARE_ANSWER:</div><div class='add'>+        case -EC_STATE_REPORT:</div><div class='add'>+            GF_ASSERT(fop-&gt;error != 0);</div><div class='add'>+</div><div class='add'>+            if (fop-&gt;cbks.open != NULL) {</div><div class='add'>+                fop-&gt;cbks.open(fop-&gt;req_frame, fop, fop-&gt;xl, -1, fop-&gt;error,</div><div class='add'>+                               NULL, NULL);</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            return EC_STATE_END;</div><div class='add'>+</div><div class='add'>+        default:</div><div class='add'>+            gf_msg(fop-&gt;xl-&gt;name, GF_LOG_ERROR, EINVAL, EC_MSG_UNHANDLED_STATE,</div><div class='add'>+                   "Unhandled state %d for %s", state, ec_fop_name(fop-&gt;id));</div><div class='add'>+</div><div class='add'>+            return EC_STATE_END;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_open(call_frame_t *frame, xlator_t *this, uintptr_t target,</div><div class='add'>+        uint32_t fop_flags, fop_open_cbk_t func, void *data, loc_t *loc,</div><div class='add'>+        int32_t flags, fd_t *fd, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    ec_cbk_t callback = {.open = func};</div><div class='add'>+    ec_fop_data_t *fop = NULL;</div><div class='add'>+    int32_t error = ENOMEM;</div><div class='add'>+</div><div class='add'>+    gf_msg_trace("ec", 0, "EC(OPEN) %p", frame);</div><div class='add'>+</div><div class='add'>+    VALIDATE_OR_GOTO(this, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, frame, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, this-&gt;private, out);</div><div class='add'>+</div><div class='add'>+    fop = ec_fop_data_allocate(frame, this, GF_FOP_OPEN, EC_FLAG_LOCK_SHARED,</div><div class='add'>+                               target, fop_flags, ec_wind_open, ec_manager_open,</div><div class='add'>+                               callback, data);</div><div class='add'>+    if (fop == NULL) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    fop-&gt;int32 = flags;</div><div class='add'>+</div><div class='add'>+    if (loc != NULL) {</div><div class='add'>+        if (loc_copy(&amp;fop-&gt;loc[0], loc) != 0) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, ENOMEM, EC_MSG_LOC_COPY_FAIL,</div><div class='add'>+                   "Failed to copy a location.");</div><div class='add'>+</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    if (fd != NULL) {</div><div class='add'>+        fop-&gt;fd = fd_ref(fd);</div><div class='add'>+        if (fop-&gt;fd == NULL) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, 0, EC_MSG_FILE_DESC_REF_FAIL,</div><div class='add'>+                   "Failed to reference a "</div><div class='add'>+                   "file descriptor.");</div><div class='add'>+</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    if (xdata != NULL) {</div><div class='add'>+        fop-&gt;xdata = dict_ref(xdata);</div><div class='add'>+        if (fop-&gt;xdata == NULL) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, 0, EC_MSG_DICT_REF_FAIL,</div><div class='add'>+                   "Failed to reference a "</div><div class='add'>+                   "dictionary.");</div><div class='add'>+</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    error = 0;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (fop != NULL) {</div><div class='add'>+        ec_manager(fop, error);</div><div class='add'>+    } else {</div><div class='add'>+        func(frame, NULL, this, -1, error, NULL, NULL);</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* FOP: readlink */</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_combine_readlink(ec_fop_data_t *fop, ec_cbk_data_t *dst, ec_cbk_data_t *src)</div><div class='add'>+{</div><div class='add'>+    if (!ec_iatt_combine(fop, dst-&gt;iatt, src-&gt;iatt, 1)) {</div><div class='add'>+        gf_msg(fop-&gt;xl-&gt;name, GF_LOG_NOTICE, 0, EC_MSG_IATT_MISMATCH,</div><div class='add'>+               "Mismatching iatt in "</div><div class='add'>+               "answers of 'GF_FOP_READLINK'");</div><div class='add'>+</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_readlink_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                int32_t op_ret, int32_t op_errno, const char *path,</div><div class='add'>+                struct iatt *buf, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    ec_fop_data_t *fop = NULL;</div><div class='add'>+    ec_cbk_data_t *cbk = NULL;</div><div class='add'>+    int32_t idx = (int32_t)(uintptr_t)cookie;</div><div class='add'>+</div><div class='add'>+    VALIDATE_OR_GOTO(this, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, frame, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, frame-&gt;local, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, this-&gt;private, out);</div><div class='add'>+</div><div class='add'>+    fop = frame-&gt;local;</div><div class='add'>+</div><div class='add'>+    ec_trace("CBK", fop, "idx=%d, frame=%p, op_ret=%d, op_errno=%d", idx, frame,</div><div class='add'>+             op_ret, op_errno);</div><div class='add'>+</div><div class='add'>+    cbk = ec_cbk_data_allocate(frame, this, fop, fop-&gt;id, idx, op_ret,</div><div class='add'>+                               op_errno);</div><div class='add'>+    if (cbk) {</div><div class='add'>+        if (xdata)</div><div class='add'>+            cbk-&gt;xdata = dict_ref(xdata);</div><div class='add'>+</div><div class='add'>+        if (cbk-&gt;op_ret &gt;= 0) {</div><div class='add'>+            cbk-&gt;iatt[0] = *buf;</div><div class='add'>+            cbk-&gt;str = gf_strdup(path);</div><div class='add'>+            if (!cbk-&gt;str) {</div><div class='add'>+                ec_cbk_set_error(cbk, ENOMEM, _gf_true);</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+        ec_combine(cbk, NULL);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (fop != NULL)</div><div class='add'>+        ec_complete(fop);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_wind_readlink(ec_t *ec, ec_fop_data_t *fop, int32_t idx)</div><div class='add'>+{</div><div class='add'>+    ec_trace("WIND", fop, "idx=%d", idx);</div><div class='add'>+</div><div class='add'>+    STACK_WIND_COOKIE(fop-&gt;frame, ec_readlink_cbk, (void *)(uintptr_t)idx,</div><div class='add'>+                      ec-&gt;xl_list[idx], ec-&gt;xl_list[idx]-&gt;fops-&gt;readlink,</div><div class='add'>+                      &amp;fop-&gt;loc[0], fop-&gt;size, fop-&gt;xdata);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_manager_readlink(ec_fop_data_t *fop, int32_t state)</div><div class='add'>+{</div><div class='add'>+    ec_cbk_data_t *cbk = NULL;</div><div class='add'>+</div><div class='add'>+    switch (state) {</div><div class='add'>+        case EC_STATE_INIT:</div><div class='add'>+        case EC_STATE_LOCK:</div><div class='add'>+            ec_lock_prepare_inode(fop, &amp;fop-&gt;loc[0], EC_QUERY_INFO, 0,</div><div class='add'>+                                  EC_RANGE_FULL);</div><div class='add'>+            ec_lock(fop);</div><div class='add'>+            return EC_STATE_DISPATCH;</div><div class='add'>+</div><div class='add'>+        case EC_STATE_DISPATCH:</div><div class='add'>+            ec_dispatch_one(fop);</div><div class='add'>+</div><div class='add'>+            return EC_STATE_PREPARE_ANSWER;</div><div class='add'>+</div><div class='add'>+        case EC_STATE_PREPARE_ANSWER:</div><div class='add'>+            if (ec_dispatch_one_retry(fop, &amp;cbk)) {</div><div class='add'>+                return EC_STATE_DISPATCH;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            if ((cbk != NULL) &amp;&amp; (cbk-&gt;op_ret &gt;= 0)) {</div><div class='add'>+                ec_iatt_rebuild(fop-&gt;xl-&gt;private, &amp;cbk-&gt;iatt[0], 1, 1);</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            return EC_STATE_REPORT;</div><div class='add'>+</div><div class='add'>+        case EC_STATE_REPORT:</div><div class='add'>+            cbk = fop-&gt;answer;</div><div class='add'>+            GF_ASSERT(cbk);</div><div class='add'>+            if (fop-&gt;cbks.readlink != NULL) {</div><div class='add'>+                fop-&gt;cbks.readlink(fop-&gt;req_frame, fop, fop-&gt;xl, cbk-&gt;op_ret,</div><div class='add'>+                                   cbk-&gt;op_errno, cbk-&gt;str, &amp;cbk-&gt;iatt[0],</div><div class='add'>+                                   cbk-&gt;xdata);</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            return EC_STATE_LOCK_REUSE;</div><div class='add'>+</div><div class='add'>+        case -EC_STATE_INIT:</div><div class='add'>+        case -EC_STATE_LOCK:</div><div class='add'>+        case -EC_STATE_DISPATCH:</div><div class='add'>+        case -EC_STATE_PREPARE_ANSWER:</div><div class='add'>+        case -EC_STATE_REPORT:</div><div class='add'>+            if (fop-&gt;cbks.readlink != NULL) {</div><div class='add'>+                fop-&gt;cbks.readlink(fop-&gt;req_frame, fop, fop-&gt;xl, -1, fop-&gt;error,</div><div class='add'>+                                   NULL, NULL, NULL);</div><div class='add'>+            }</div><div class='add'>+            return EC_STATE_LOCK_REUSE;</div><div class='add'>+</div><div class='add'>+        case -EC_STATE_LOCK_REUSE:</div><div class='add'>+        case EC_STATE_LOCK_REUSE:</div><div class='add'>+            ec_lock_reuse(fop);</div><div class='add'>+</div><div class='add'>+            return EC_STATE_UNLOCK;</div><div class='add'>+</div><div class='add'>+        case -EC_STATE_UNLOCK:</div><div class='add'>+        case EC_STATE_UNLOCK:</div><div class='add'>+            ec_unlock(fop);</div><div class='add'>+</div><div class='add'>+            return EC_STATE_END;</div><div class='add'>+        default:</div><div class='add'>+            gf_msg(fop-&gt;xl-&gt;name, GF_LOG_ERROR, EINVAL, EC_MSG_UNHANDLED_STATE,</div><div class='add'>+                   "Unhandled state %d for %s", state, ec_fop_name(fop-&gt;id));</div><div class='add'>+</div><div class='add'>+            return EC_STATE_END;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_readlink(call_frame_t *frame, xlator_t *this, uintptr_t target,</div><div class='add'>+            uint32_t fop_flags, fop_readlink_cbk_t func, void *data, loc_t *loc,</div><div class='add'>+            size_t size, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    ec_cbk_t callback = {.readlink = func};</div><div class='add'>+    ec_fop_data_t *fop = NULL;</div><div class='add'>+    int32_t error = ENOMEM;</div><div class='add'>+</div><div class='add'>+    gf_msg_trace("ec", 0, "EC(READLINK) %p", frame);</div><div class='add'>+</div><div class='add'>+    VALIDATE_OR_GOTO(this, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, frame, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, this-&gt;private, out);</div><div class='add'>+</div><div class='add'>+    fop = ec_fop_data_allocate(</div><div class='add'>+        frame, this, GF_FOP_READLINK, EC_FLAG_LOCK_SHARED, target, fop_flags,</div><div class='add'>+        ec_wind_readlink, ec_manager_readlink, callback, data);</div><div class='add'>+    if (fop == NULL) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    fop-&gt;size = size;</div><div class='add'>+</div><div class='add'>+    if (loc != NULL) {</div><div class='add'>+        if (loc_copy(&amp;fop-&gt;loc[0], loc) != 0) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, ENOMEM, EC_MSG_LOC_COPY_FAIL,</div><div class='add'>+                   "Failed to copy a location.");</div><div class='add'>+</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    if (xdata != NULL) {</div><div class='add'>+        fop-&gt;xdata = dict_ref(xdata);</div><div class='add'>+        if (fop-&gt;xdata == NULL) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, 0, EC_MSG_DICT_REF_FAIL,</div><div class='add'>+                   "Failed to reference a "</div><div class='add'>+                   "dictionary.");</div><div class='add'>+</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    error = 0;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (fop != NULL) {</div><div class='add'>+        ec_manager(fop, error);</div><div class='add'>+    } else {</div><div class='add'>+        func(frame, NULL, this, -1, error, NULL, NULL, NULL);</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* FOP: readv */</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_readv_rebuild(ec_t *ec, ec_fop_data_t *fop, ec_cbk_data_t *cbk)</div><div class='add'>+{</div><div class='add'>+    struct iovec vector[1];</div><div class='add'>+    ec_cbk_data_t *ans = NULL;</div><div class='add'>+    struct iobref *iobref = NULL;</div><div class='add'>+    void *ptr;</div><div class='add'>+    uint64_t fsize = 0, size = 0, max = 0;</div><div class='add'>+    int32_t pos, err = -ENOMEM;</div><div class='add'>+</div><div class='add'>+    if (cbk-&gt;op_ret &lt; 0) {</div><div class='add'>+        err = -cbk-&gt;op_errno;</div><div class='add'>+</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* This shouldn't fail because we have the inode locked. */</div><div class='add'>+    GF_ASSERT(ec_get_inode_size(fop, fop-&gt;fd-&gt;inode, &amp;cbk-&gt;iatt[0].ia_size));</div><div class='add'>+</div><div class='add'>+    if (cbk-&gt;op_ret &gt; 0) {</div><div class='add'>+        void *blocks[cbk-&gt;count];</div><div class='add'>+        uint32_t values[cbk-&gt;count];</div><div class='add'>+</div><div class='add'>+        fsize = cbk-&gt;op_ret;</div><div class='add'>+        size = fsize * ec-&gt;fragments;</div><div class='add'>+        for (ans = cbk; ans != NULL; ans = ans-&gt;next) {</div><div class='add'>+            pos = gf_bits_count(cbk-&gt;mask &amp; ((1 &lt;&lt; ans-&gt;idx) - 1));</div><div class='add'>+            values[pos] = ans-&gt;idx + 1;</div><div class='add'>+            blocks[pos] = ans-&gt;vector[0].iov_base;</div><div class='add'>+            if ((ans-&gt;int32 != 1) ||</div><div class='add'>+                !EC_ALIGN_CHECK(blocks[pos], EC_METHOD_WORD_SIZE)) {</div><div class='add'>+                if (iobref == NULL) {</div><div class='add'>+                    err = ec_buffer_alloc(ec-&gt;xl, size, &amp;iobref, &amp;ptr);</div><div class='add'>+                    if (err != 0) {</div><div class='add'>+                        goto out;</div><div class='add'>+                    }</div><div class='add'>+                }</div><div class='add'>+                ec_iov_copy_to(ptr, ans-&gt;vector, ans-&gt;int32, 0, fsize);</div><div class='add'>+                blocks[pos] = ptr;</div><div class='add'>+                ptr += fsize;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        err = ec_buffer_alloc(ec-&gt;xl, size, &amp;iobref, &amp;ptr);</div><div class='add'>+        if (err != 0) {</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        err = ec_method_decode(&amp;ec-&gt;matrix, fsize, cbk-&gt;mask, values, blocks,</div><div class='add'>+                               ptr);</div><div class='add'>+        if (err != 0) {</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        vector[0].iov_base = ptr + fop-&gt;head;</div><div class='add'>+        vector[0].iov_len = size - fop-&gt;head;</div><div class='add'>+</div><div class='add'>+        max = fop-&gt;offset * ec-&gt;fragments + size;</div><div class='add'>+        if (max &gt; cbk-&gt;iatt[0].ia_size) {</div><div class='add'>+            max = cbk-&gt;iatt[0].ia_size;</div><div class='add'>+        }</div><div class='add'>+        max -= fop-&gt;offset * ec-&gt;fragments + fop-&gt;head;</div><div class='add'>+        if (max &gt; fop-&gt;user_size) {</div><div class='add'>+            max = fop-&gt;user_size;</div><div class='add'>+        }</div><div class='add'>+        size -= fop-&gt;head;</div><div class='add'>+        if (size &gt; max) {</div><div class='add'>+            vector[0].iov_len -= size - max;</div><div class='add'>+            size = max;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        cbk-&gt;op_ret = size;</div><div class='add'>+        cbk-&gt;int32 = 1;</div><div class='add'>+</div><div class='add'>+        iobref_unref(cbk-&gt;buffers);</div><div class='add'>+        cbk-&gt;buffers = iobref;</div><div class='add'>+</div><div class='add'>+        GF_FREE(cbk-&gt;vector);</div><div class='add'>+        cbk-&gt;vector = iov_dup(vector, 1);</div><div class='add'>+        if (cbk-&gt;vector == NULL) {</div><div class='add'>+            return -ENOMEM;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (iobref != NULL) {</div><div class='add'>+        iobref_unref(iobref);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return err;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_combine_readv(ec_fop_data_t *fop, ec_cbk_data_t *dst, ec_cbk_data_t *src)</div><div class='add'>+{</div><div class='add'>+    if (!ec_vector_compare(dst-&gt;vector, dst-&gt;int32, src-&gt;vector, src-&gt;int32)) {</div><div class='add'>+        gf_msg(fop-&gt;xl-&gt;name, GF_LOG_NOTICE, 0, EC_MSG_VECTOR_MISMATCH,</div><div class='add'>+               "Mismatching vector in "</div><div class='add'>+               "answers of 'GF_FOP_READ'");</div><div class='add'>+</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (!ec_iatt_combine(fop, dst-&gt;iatt, src-&gt;iatt, 1)) {</div><div class='add'>+        gf_msg(fop-&gt;xl-&gt;name, GF_LOG_NOTICE, 0, EC_MSG_IATT_MISMATCH,</div><div class='add'>+               "Mismatching iatt in "</div><div class='add'>+               "answers of 'GF_FOP_READ'");</div><div class='add'>+</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_readv_cbk(call_frame_t *frame, void *cookie, xlator_t *this, int32_t op_ret,</div><div class='add'>+             int32_t op_errno, struct iovec *vector, int32_t count,</div><div class='add'>+             struct iatt *stbuf, struct iobref *iobref, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    ec_fop_data_t *fop = NULL;</div><div class='add'>+    ec_cbk_data_t *cbk = NULL;</div><div class='add'>+    ec_t *ec = this-&gt;private;</div><div class='add'>+    int32_t idx = (int32_t)(uintptr_t)cookie;</div><div class='add'>+</div><div class='add'>+    VALIDATE_OR_GOTO(this, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, frame, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, frame-&gt;local, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, this-&gt;private, out);</div><div class='add'>+</div><div class='add'>+    fop = frame-&gt;local;</div><div class='add'>+</div><div class='add'>+    ec_trace("CBK", fop, "idx=%d, frame=%p, op_ret=%d, op_errno=%d", idx, frame,</div><div class='add'>+             op_ret, op_errno);</div><div class='add'>+</div><div class='add'>+    cbk = ec_cbk_data_allocate(frame, this, fop, GF_FOP_READ, idx, op_ret,</div><div class='add'>+                               op_errno);</div><div class='add'>+    if (cbk != NULL) {</div><div class='add'>+        if (op_ret &gt;= 0) {</div><div class='add'>+            cbk-&gt;int32 = count;</div><div class='add'>+</div><div class='add'>+            if (count &gt; 0) {</div><div class='add'>+                cbk-&gt;vector = iov_dup(vector, count);</div><div class='add'>+                if (cbk-&gt;vector == NULL) {</div><div class='add'>+                    gf_msg(this-&gt;name, GF_LOG_ERROR, ENOMEM, EC_MSG_NO_MEMORY,</div><div class='add'>+                           "Failed to duplicate a "</div><div class='add'>+                           "vector list.");</div><div class='add'>+</div><div class='add'>+                    goto out;</div><div class='add'>+                }</div><div class='add'>+                cbk-&gt;int32 = count;</div><div class='add'>+            }</div><div class='add'>+            if (stbuf != NULL) {</div><div class='add'>+                cbk-&gt;iatt[0] = *stbuf;</div><div class='add'>+            }</div><div class='add'>+            if (iobref != NULL) {</div><div class='add'>+                cbk-&gt;buffers = iobref_ref(iobref);</div><div class='add'>+                if (cbk-&gt;buffers == NULL) {</div><div class='add'>+                    gf_msg(this-&gt;name, GF_LOG_ERROR, 0, EC_MSG_BUF_REF_FAIL,</div><div class='add'>+                           "Failed to reference a "</div><div class='add'>+                           "buffer.");</div><div class='add'>+</div><div class='add'>+                    goto out;</div><div class='add'>+                }</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+        if (xdata != NULL) {</div><div class='add'>+            cbk-&gt;xdata = dict_ref(xdata);</div><div class='add'>+            if (cbk-&gt;xdata == NULL) {</div><div class='add'>+                gf_msg(this-&gt;name, GF_LOG_ERROR, 0, EC_MSG_DICT_REF_FAIL,</div><div class='add'>+                       "Failed to reference a "</div><div class='add'>+                       "dictionary.");</div><div class='add'>+</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        if ((op_ret &gt; 0) &amp;&amp; ((op_ret % ec-&gt;fragment_size) != 0)) {</div><div class='add'>+            ec_cbk_set_error(cbk, EIO, _gf_true);</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        ec_combine(cbk, ec_combine_readv);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (fop != NULL) {</div><div class='add'>+        ec_complete(fop);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_wind_readv(ec_t *ec, ec_fop_data_t *fop, int32_t idx)</div><div class='add'>+{</div><div class='add'>+    ec_trace("WIND", fop, "idx=%d", idx);</div><div class='add'>+</div><div class='add'>+    STACK_WIND_COOKIE(fop-&gt;frame, ec_readv_cbk, (void *)(uintptr_t)idx,</div><div class='add'>+                      ec-&gt;xl_list[idx], ec-&gt;xl_list[idx]-&gt;fops-&gt;readv, fop-&gt;fd,</div><div class='add'>+                      fop-&gt;size, fop-&gt;offset, fop-&gt;uint32, fop-&gt;xdata);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_manager_readv(ec_fop_data_t *fop, int32_t state)</div><div class='add'>+{</div><div class='add'>+    ec_cbk_data_t *cbk;</div><div class='add'>+    ec_t *ec = fop-&gt;xl-&gt;private;</div><div class='add'>+</div><div class='add'>+    switch (state) {</div><div class='add'>+        case EC_STATE_INIT:</div><div class='add'>+            fop-&gt;user_size = fop-&gt;size;</div><div class='add'>+            fop-&gt;head = ec_adjust_offset_down(fop-&gt;xl-&gt;private, &amp;fop-&gt;offset,</div><div class='add'>+                                              _gf_true);</div><div class='add'>+            fop-&gt;size += fop-&gt;head;</div><div class='add'>+            ec_adjust_size_up(fop-&gt;xl-&gt;private, &amp;fop-&gt;size, _gf_true);</div><div class='add'>+</div><div class='add'>+            /* Fall through */</div><div class='add'>+</div><div class='add'>+        case EC_STATE_LOCK:</div><div class='add'>+            ec_lock_prepare_fd(fop, fop-&gt;fd, EC_QUERY_INFO, fop-&gt;offset,</div><div class='add'>+                               fop-&gt;size);</div><div class='add'>+            ec_lock(fop);</div><div class='add'>+</div><div class='add'>+            return EC_STATE_DISPATCH;</div><div class='add'>+</div><div class='add'>+        case EC_STATE_DISPATCH:</div><div class='add'>+            if (ec-&gt;read_mask) {</div><div class='add'>+                fop-&gt;mask &amp;= ec-&gt;read_mask;</div><div class='add'>+            }</div><div class='add'>+            ec_dispatch_min(fop);</div><div class='add'>+</div><div class='add'>+            return EC_STATE_PREPARE_ANSWER;</div><div class='add'>+</div><div class='add'>+        case EC_STATE_PREPARE_ANSWER:</div><div class='add'>+            cbk = ec_fop_prepare_answer(fop, _gf_true);</div><div class='add'>+            if (cbk != NULL) {</div><div class='add'>+                int32_t err;</div><div class='add'>+</div><div class='add'>+                ec_iatt_rebuild(fop-&gt;xl-&gt;private, cbk-&gt;iatt, 1, cbk-&gt;count);</div><div class='add'>+</div><div class='add'>+                err = ec_readv_rebuild(fop-&gt;xl-&gt;private, fop, cbk);</div><div class='add'>+                if (err != 0) {</div><div class='add'>+                    ec_cbk_set_error(cbk, -err, _gf_true);</div><div class='add'>+                }</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            return EC_STATE_REPORT;</div><div class='add'>+</div><div class='add'>+        case EC_STATE_REPORT:</div><div class='add'>+            cbk = fop-&gt;answer;</div><div class='add'>+</div><div class='add'>+            GF_ASSERT(cbk != NULL);</div><div class='add'>+</div><div class='add'>+            if (fop-&gt;cbks.readv != NULL) {</div><div class='add'>+                fop-&gt;cbks.readv(fop-&gt;req_frame, fop, fop-&gt;xl, cbk-&gt;op_ret,</div><div class='add'>+                                cbk-&gt;op_errno, cbk-&gt;vector, cbk-&gt;int32,</div><div class='add'>+                                &amp;cbk-&gt;iatt[0], cbk-&gt;buffers, cbk-&gt;xdata);</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            return EC_STATE_LOCK_REUSE;</div><div class='add'>+</div><div class='add'>+        case -EC_STATE_INIT:</div><div class='add'>+        case -EC_STATE_LOCK:</div><div class='add'>+        case -EC_STATE_DISPATCH:</div><div class='add'>+        case -EC_STATE_PREPARE_ANSWER:</div><div class='add'>+        case -EC_STATE_REPORT:</div><div class='add'>+            GF_ASSERT(fop-&gt;error != 0);</div><div class='add'>+</div><div class='add'>+            if (fop-&gt;cbks.readv != NULL) {</div><div class='add'>+                fop-&gt;cbks.readv(fop-&gt;req_frame, fop, fop-&gt;xl, -1, fop-&gt;error,</div><div class='add'>+                                NULL, 0, NULL, NULL, NULL);</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            return EC_STATE_LOCK_REUSE;</div><div class='add'>+</div><div class='add'>+        case -EC_STATE_LOCK_REUSE:</div><div class='add'>+        case EC_STATE_LOCK_REUSE:</div><div class='add'>+            ec_lock_reuse(fop);</div><div class='add'>+</div><div class='add'>+            return EC_STATE_UNLOCK;</div><div class='add'>+</div><div class='add'>+        case -EC_STATE_UNLOCK:</div><div class='add'>+        case EC_STATE_UNLOCK:</div><div class='add'>+            ec_unlock(fop);</div><div class='add'>+</div><div class='add'>+            return EC_STATE_END;</div><div class='add'>+</div><div class='add'>+        default:</div><div class='add'>+            gf_msg(fop-&gt;xl-&gt;name, GF_LOG_ERROR, EINVAL, EC_MSG_UNHANDLED_STATE,</div><div class='add'>+                   "Unhandled state %d for %s", state, ec_fop_name(fop-&gt;id));</div><div class='add'>+</div><div class='add'>+            return EC_STATE_END;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_readv(call_frame_t *frame, xlator_t *this, uintptr_t target,</div><div class='add'>+         uint32_t fop_flags, fop_readv_cbk_t func, void *data, fd_t *fd,</div><div class='add'>+         size_t size, off_t offset, uint32_t flags, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    ec_cbk_t callback = {.readv = func};</div><div class='add'>+    ec_fop_data_t *fop = NULL;</div><div class='add'>+    int32_t error = ENOMEM;</div><div class='add'>+</div><div class='add'>+    gf_msg_trace("ec", 0, "EC(READ) %p", frame);</div><div class='add'>+</div><div class='add'>+    VALIDATE_OR_GOTO(this, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, frame, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, this-&gt;private, out);</div><div class='add'>+</div><div class='add'>+    fop = ec_fop_data_allocate(frame, this, GF_FOP_READ, EC_FLAG_LOCK_SHARED,</div><div class='add'>+                               target, fop_flags, ec_wind_readv,</div><div class='add'>+                               ec_manager_readv, callback, data);</div><div class='add'>+    if (fop == NULL) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    fop-&gt;use_fd = 1;</div><div class='add'>+</div><div class='add'>+    fop-&gt;size = size;</div><div class='add'>+    fop-&gt;offset = offset;</div><div class='add'>+    fop-&gt;uint32 = flags;</div><div class='add'>+</div><div class='add'>+    if (fd != NULL) {</div><div class='add'>+        fop-&gt;fd = fd_ref(fd);</div><div class='add'>+        if (fop-&gt;fd == NULL) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, 0, EC_MSG_FILE_DESC_REF_FAIL,</div><div class='add'>+                   "Failed to reference a "</div><div class='add'>+                   "file descriptor.");</div><div class='add'>+</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    if (xdata != NULL) {</div><div class='add'>+        fop-&gt;xdata = dict_ref(xdata);</div><div class='add'>+        if (fop-&gt;xdata == NULL) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, 0, EC_MSG_DICT_REF_FAIL,</div><div class='add'>+                   "Failed to reference a "</div><div class='add'>+                   "dictionary.");</div><div class='add'>+</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    error = 0;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (fop != NULL) {</div><div class='add'>+        ec_manager(fop, error);</div><div class='add'>+    } else {</div><div class='add'>+        func(frame, NULL, this, -1, error, NULL, 0, NULL, NULL, NULL);</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* FOP: seek */</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_seek_cbk(call_frame_t *frame, void *cookie, xlator_t *this, int32_t op_ret,</div><div class='add'>+            int32_t op_errno, off_t offset, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    ec_fop_data_t *fop = NULL;</div><div class='add'>+    ec_cbk_data_t *cbk = NULL;</div><div class='add'>+    ec_t *ec = this-&gt;private;</div><div class='add'>+    int32_t idx = (int32_t)(uintptr_t)cookie;</div><div class='add'>+</div><div class='add'>+    VALIDATE_OR_GOTO(this, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, frame, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, frame-&gt;local, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, this-&gt;private, out);</div><div class='add'>+</div><div class='add'>+    fop = frame-&gt;local;</div><div class='add'>+</div><div class='add'>+    ec_trace("CBK", fop, "idx=%d, frame=%p, op_ret=%d, op_errno=%d", idx, frame,</div><div class='add'>+             op_ret, op_errno);</div><div class='add'>+</div><div class='add'>+    cbk = ec_cbk_data_allocate(frame, this, fop, GF_FOP_SEEK, idx, op_ret,</div><div class='add'>+                               op_errno);</div><div class='add'>+    if (cbk != NULL) {</div><div class='add'>+        if (op_ret &gt;= 0) {</div><div class='add'>+            cbk-&gt;offset = offset;</div><div class='add'>+        }</div><div class='add'>+        if (xdata != NULL) {</div><div class='add'>+            cbk-&gt;xdata = dict_ref(xdata);</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        if ((op_ret &gt; 0) &amp;&amp; ((cbk-&gt;offset % ec-&gt;fragment_size) != 0)) {</div><div class='add'>+            cbk-&gt;op_ret = -1;</div><div class='add'>+            cbk-&gt;op_errno = EIO;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        ec_combine(cbk, NULL);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (fop != NULL) {</div><div class='add'>+        ec_complete(fop);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_wind_seek(ec_t *ec, ec_fop_data_t *fop, int32_t idx)</div><div class='add'>+{</div><div class='add'>+    ec_trace("WIND", fop, "idx=%d", idx);</div><div class='add'>+</div><div class='add'>+    STACK_WIND_COOKIE(fop-&gt;frame, ec_seek_cbk, (void *)(uintptr_t)idx,</div><div class='add'>+                      ec-&gt;xl_list[idx], ec-&gt;xl_list[idx]-&gt;fops-&gt;seek, fop-&gt;fd,</div><div class='add'>+                      fop-&gt;offset, fop-&gt;seek, fop-&gt;xdata);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_manager_seek(ec_fop_data_t *fop, int32_t state)</div><div class='add'>+{</div><div class='add'>+    ec_cbk_data_t *cbk;</div><div class='add'>+    uint64_t size;</div><div class='add'>+</div><div class='add'>+    switch (state) {</div><div class='add'>+        case EC_STATE_INIT:</div><div class='add'>+            fop-&gt;user_size = fop-&gt;offset;</div><div class='add'>+            fop-&gt;head = ec_adjust_offset_down(fop-&gt;xl-&gt;private, &amp;fop-&gt;offset,</div><div class='add'>+                                              _gf_true);</div><div class='add'>+</div><div class='add'>+            /* Fall through */</div><div class='add'>+</div><div class='add'>+        case EC_STATE_LOCK:</div><div class='add'>+            ec_lock_prepare_fd(fop, fop-&gt;fd, EC_QUERY_INFO, fop-&gt;offset,</div><div class='add'>+                               EC_RANGE_FULL);</div><div class='add'>+            ec_lock(fop);</div><div class='add'>+</div><div class='add'>+            return EC_STATE_DISPATCH;</div><div class='add'>+</div><div class='add'>+        case EC_STATE_DISPATCH:</div><div class='add'>+            /* This shouldn't fail because we have the inode locked. */</div><div class='add'>+            GF_ASSERT(</div><div class='add'>+                ec_get_inode_size(fop, fop-&gt;locks[0].lock-&gt;loc.inode, &amp;size));</div><div class='add'>+</div><div class='add'>+            if (fop-&gt;user_size &gt;= size) {</div><div class='add'>+                ec_fop_set_error(fop, ENXIO);</div><div class='add'>+</div><div class='add'>+                return EC_STATE_REPORT;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            ec_dispatch_one(fop);</div><div class='add'>+</div><div class='add'>+            return EC_STATE_PREPARE_ANSWER;</div><div class='add'>+</div><div class='add'>+        case EC_STATE_PREPARE_ANSWER:</div><div class='add'>+            if (ec_dispatch_one_retry(fop, &amp;cbk)) {</div><div class='add'>+                return EC_STATE_DISPATCH;</div><div class='add'>+            }</div><div class='add'>+            if ((cbk != NULL) &amp;&amp; (cbk-&gt;op_ret &gt;= 0)) {</div><div class='add'>+                ec_t *ec = fop-&gt;xl-&gt;private;</div><div class='add'>+</div><div class='add'>+                /* This shouldn't fail because we have the inode locked. */</div><div class='add'>+                GF_ASSERT(ec_get_inode_size(fop, fop-&gt;locks[0].lock-&gt;loc.inode,</div><div class='add'>+                                            &amp;size));</div><div class='add'>+</div><div class='add'>+                cbk-&gt;offset *= ec-&gt;fragments;</div><div class='add'>+                if (cbk-&gt;offset &lt; fop-&gt;user_size) {</div><div class='add'>+                    cbk-&gt;offset = fop-&gt;user_size;</div><div class='add'>+                }</div><div class='add'>+                if (cbk-&gt;offset &gt; size) {</div><div class='add'>+                    cbk-&gt;offset = size;</div><div class='add'>+                }</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            return EC_STATE_REPORT;</div><div class='add'>+</div><div class='add'>+        case EC_STATE_REPORT:</div><div class='add'>+            cbk = fop-&gt;answer;</div><div class='add'>+</div><div class='add'>+            GF_ASSERT(cbk != NULL);</div><div class='add'>+</div><div class='add'>+            if (fop-&gt;cbks.seek != NULL) {</div><div class='add'>+                fop-&gt;cbks.seek(fop-&gt;req_frame, fop, fop-&gt;xl, cbk-&gt;op_ret,</div><div class='add'>+                               cbk-&gt;op_errno, cbk-&gt;offset, cbk-&gt;xdata);</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            return EC_STATE_LOCK_REUSE;</div><div class='add'>+</div><div class='add'>+        case -EC_STATE_INIT:</div><div class='add'>+        case -EC_STATE_LOCK:</div><div class='add'>+        case -EC_STATE_DISPATCH:</div><div class='add'>+        case -EC_STATE_PREPARE_ANSWER:</div><div class='add'>+        case -EC_STATE_REPORT:</div><div class='add'>+            GF_ASSERT(fop-&gt;error != 0);</div><div class='add'>+</div><div class='add'>+            if (fop-&gt;cbks.seek != NULL) {</div><div class='add'>+                fop-&gt;cbks.seek(fop-&gt;req_frame, fop, fop-&gt;xl, -1, fop-&gt;error, 0,</div><div class='add'>+                               NULL);</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            return EC_STATE_LOCK_REUSE;</div><div class='add'>+</div><div class='add'>+        case -EC_STATE_LOCK_REUSE:</div><div class='add'>+        case EC_STATE_LOCK_REUSE:</div><div class='add'>+            ec_lock_reuse(fop);</div><div class='add'>+</div><div class='add'>+            return EC_STATE_UNLOCK;</div><div class='add'>+</div><div class='add'>+        case -EC_STATE_UNLOCK:</div><div class='add'>+        case EC_STATE_UNLOCK:</div><div class='add'>+            ec_unlock(fop);</div><div class='add'>+</div><div class='add'>+            return EC_STATE_END;</div><div class='add'>+</div><div class='add'>+        default:</div><div class='add'>+            gf_msg(fop-&gt;xl-&gt;name, GF_LOG_ERROR, 0, EC_MSG_UNHANDLED_STATE,</div><div class='add'>+                   "Unhandled state %d for %s", state, ec_fop_name(fop-&gt;id));</div><div class='add'>+</div><div class='add'>+            return EC_STATE_END;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_seek(call_frame_t *frame, xlator_t *this, uintptr_t target,</div><div class='add'>+        uint32_t fop_flags, fop_seek_cbk_t func, void *data, fd_t *fd,</div><div class='add'>+        off_t offset, gf_seek_what_t what, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    ec_cbk_t callback = {.seek = func};</div><div class='add'>+    ec_fop_data_t *fop = NULL;</div><div class='add'>+    int32_t error = EIO;</div><div class='add'>+</div><div class='add'>+    gf_msg_trace("ec", 0, "EC(SEEK) %p", frame);</div><div class='add'>+</div><div class='add'>+    VALIDATE_OR_GOTO(this, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, frame, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, this-&gt;private, out);</div><div class='add'>+</div><div class='add'>+    fop = ec_fop_data_allocate(frame, this, GF_FOP_SEEK, EC_FLAG_LOCK_SHARED,</div><div class='add'>+                               target, fop_flags, ec_wind_seek, ec_manager_seek,</div><div class='add'>+                               callback, data);</div><div class='add'>+    if (fop == NULL) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    fop-&gt;use_fd = 1;</div><div class='add'>+</div><div class='add'>+    fop-&gt;offset = offset;</div><div class='add'>+    fop-&gt;seek = what;</div><div class='add'>+</div><div class='add'>+    if (fd != NULL) {</div><div class='add'>+        fop-&gt;fd = fd_ref(fd);</div><div class='add'>+    }</div><div class='add'>+    if (xdata != NULL) {</div><div class='add'>+        fop-&gt;xdata = dict_ref(xdata);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    error = 0;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (fop != NULL) {</div><div class='add'>+        ec_manager(fop, error);</div><div class='add'>+    } else {</div><div class='add'>+        func(frame, NULL, this, -1, EIO, 0, NULL);</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* FOP: stat */</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_combine_stat(ec_fop_data_t *fop, ec_cbk_data_t *dst, ec_cbk_data_t *src)</div><div class='add'>+{</div><div class='add'>+    if (!ec_iatt_combine(fop, dst-&gt;iatt, src-&gt;iatt, 1)) {</div><div class='add'>+        gf_msg(fop-&gt;xl-&gt;name, GF_LOG_NOTICE, 0, EC_MSG_IATT_MISMATCH,</div><div class='add'>+               "Mismatching iatt in "</div><div class='add'>+               "answers of 'GF_FOP_STAT'");</div><div class='add'>+</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_stat_cbk(call_frame_t *frame, void *cookie, xlator_t *this, int32_t op_ret,</div><div class='add'>+            int32_t op_errno, struct iatt *buf, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    ec_fop_data_t *fop = NULL;</div><div class='add'>+    ec_cbk_data_t *cbk = NULL;</div><div class='add'>+    int32_t idx = (int32_t)(uintptr_t)cookie;</div><div class='add'>+</div><div class='add'>+    VALIDATE_OR_GOTO(this, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, frame, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, frame-&gt;local, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, this-&gt;private, out);</div><div class='add'>+</div><div class='add'>+    fop = frame-&gt;local;</div><div class='add'>+</div><div class='add'>+    ec_trace("CBK", fop, "idx=%d, frame=%p, op_ret=%d, op_errno=%d", idx, frame,</div><div class='add'>+             op_ret, op_errno);</div><div class='add'>+</div><div class='add'>+    cbk = ec_cbk_data_allocate(frame, this, fop, GF_FOP_STAT, idx, op_ret,</div><div class='add'>+                               op_errno);</div><div class='add'>+    if (cbk != NULL) {</div><div class='add'>+        if (op_ret &gt;= 0) {</div><div class='add'>+            if (buf != NULL) {</div><div class='add'>+                cbk-&gt;iatt[0] = *buf;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+        if (xdata != NULL) {</div><div class='add'>+            cbk-&gt;xdata = dict_ref(xdata);</div><div class='add'>+            if (cbk-&gt;xdata == NULL) {</div><div class='add'>+                gf_msg(this-&gt;name, GF_LOG_ERROR, 0, EC_MSG_DICT_REF_FAIL,</div><div class='add'>+                       "Failed to reference a "</div><div class='add'>+                       "dictionary.");</div><div class='add'>+</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        ec_combine(cbk, ec_combine_stat);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (fop != NULL) {</div><div class='add'>+        ec_complete(fop);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_wind_stat(ec_t *ec, ec_fop_data_t *fop, int32_t idx)</div><div class='add'>+{</div><div class='add'>+    ec_trace("WIND", fop, "idx=%d", idx);</div><div class='add'>+</div><div class='add'>+    STACK_WIND_COOKIE(fop-&gt;frame, ec_stat_cbk, (void *)(uintptr_t)idx,</div><div class='add'>+                      ec-&gt;xl_list[idx], ec-&gt;xl_list[idx]-&gt;fops-&gt;stat,</div><div class='add'>+                      &amp;fop-&gt;loc[0], fop-&gt;xdata);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_manager_stat(ec_fop_data_t *fop, int32_t state)</div><div class='add'>+{</div><div class='add'>+    ec_cbk_data_t *cbk;</div><div class='add'>+</div><div class='add'>+    switch (state) {</div><div class='add'>+        case EC_STATE_INIT:</div><div class='add'>+        case EC_STATE_LOCK:</div><div class='add'>+            if (fop-&gt;fd == NULL) {</div><div class='add'>+                ec_lock_prepare_inode(fop, &amp;fop-&gt;loc[0], EC_QUERY_INFO, 0,</div><div class='add'>+                                      EC_RANGE_FULL);</div><div class='add'>+            } else {</div><div class='add'>+                ec_lock_prepare_fd(fop, fop-&gt;fd, EC_QUERY_INFO, 0,</div><div class='add'>+                                   EC_RANGE_FULL);</div><div class='add'>+            }</div><div class='add'>+            ec_lock(fop);</div><div class='add'>+</div><div class='add'>+            return EC_STATE_DISPATCH;</div><div class='add'>+</div><div class='add'>+        case EC_STATE_DISPATCH:</div><div class='add'>+            ec_dispatch_all(fop);</div><div class='add'>+</div><div class='add'>+            return EC_STATE_PREPARE_ANSWER;</div><div class='add'>+</div><div class='add'>+        case EC_STATE_PREPARE_ANSWER:</div><div class='add'>+            cbk = ec_fop_prepare_answer(fop, _gf_true);</div><div class='add'>+</div><div class='add'>+            if (cbk != NULL) {</div><div class='add'>+                if (cbk-&gt;iatt[0].ia_type == IA_IFREG) {</div><div class='add'>+                    ec_iatt_rebuild(fop-&gt;xl-&gt;private, cbk-&gt;iatt, 1, cbk-&gt;count);</div><div class='add'>+</div><div class='add'>+                    /* This shouldn't fail because we have the inode locked. */</div><div class='add'>+                    GF_ASSERT(ec_get_inode_size(fop,</div><div class='add'>+                                                fop-&gt;locks[0].lock-&gt;loc.inode,</div><div class='add'>+                                                &amp;cbk-&gt;iatt[0].ia_size));</div><div class='add'>+                }</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            return EC_STATE_REPORT;</div><div class='add'>+</div><div class='add'>+        case EC_STATE_REPORT:</div><div class='add'>+            cbk = fop-&gt;answer;</div><div class='add'>+</div><div class='add'>+            GF_ASSERT(cbk != NULL);</div><div class='add'>+</div><div class='add'>+            if (fop-&gt;id == GF_FOP_STAT) {</div><div class='add'>+                if (fop-&gt;cbks.stat != NULL) {</div><div class='add'>+                    fop-&gt;cbks.stat(fop-&gt;req_frame, fop, fop-&gt;xl, cbk-&gt;op_ret,</div><div class='add'>+                                   cbk-&gt;op_errno, &amp;cbk-&gt;iatt[0], cbk-&gt;xdata);</div><div class='add'>+                }</div><div class='add'>+            } else {</div><div class='add'>+                if (fop-&gt;cbks.fstat != NULL) {</div><div class='add'>+                    fop-&gt;cbks.fstat(fop-&gt;req_frame, fop, fop-&gt;xl, cbk-&gt;op_ret,</div><div class='add'>+                                    cbk-&gt;op_errno, &amp;cbk-&gt;iatt[0], cbk-&gt;xdata);</div><div class='add'>+                }</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            return EC_STATE_LOCK_REUSE;</div><div class='add'>+</div><div class='add'>+        case -EC_STATE_INIT:</div><div class='add'>+        case -EC_STATE_LOCK:</div><div class='add'>+        case -EC_STATE_DISPATCH:</div><div class='add'>+        case -EC_STATE_PREPARE_ANSWER:</div><div class='add'>+        case -EC_STATE_REPORT:</div><div class='add'>+            GF_ASSERT(fop-&gt;error != 0);</div><div class='add'>+</div><div class='add'>+            if (fop-&gt;id == GF_FOP_STAT) {</div><div class='add'>+                if (fop-&gt;cbks.stat != NULL) {</div><div class='add'>+                    fop-&gt;cbks.stat(fop-&gt;req_frame, fop, fop-&gt;xl, -1, fop-&gt;error,</div><div class='add'>+                                   NULL, NULL);</div><div class='add'>+                }</div><div class='add'>+            } else {</div><div class='add'>+                if (fop-&gt;cbks.fstat != NULL) {</div><div class='add'>+                    fop-&gt;cbks.fstat(fop-&gt;req_frame, fop, fop-&gt;xl, -1,</div><div class='add'>+                                    fop-&gt;error, NULL, NULL);</div><div class='add'>+                }</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            return EC_STATE_LOCK_REUSE;</div><div class='add'>+</div><div class='add'>+        case -EC_STATE_LOCK_REUSE:</div><div class='add'>+        case EC_STATE_LOCK_REUSE:</div><div class='add'>+            ec_lock_reuse(fop);</div><div class='add'>+</div><div class='add'>+            return EC_STATE_UNLOCK;</div><div class='add'>+</div><div class='add'>+        case -EC_STATE_UNLOCK:</div><div class='add'>+        case EC_STATE_UNLOCK:</div><div class='add'>+            ec_unlock(fop);</div><div class='add'>+</div><div class='add'>+            return EC_STATE_END;</div><div class='add'>+</div><div class='add'>+        default:</div><div class='add'>+            gf_msg(fop-&gt;xl-&gt;name, GF_LOG_ERROR, EINVAL, EC_MSG_UNHANDLED_STATE,</div><div class='add'>+                   "Unhandled state %d for %s", state, ec_fop_name(fop-&gt;id));</div><div class='add'>+</div><div class='add'>+            return EC_STATE_END;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_stat(call_frame_t *frame, xlator_t *this, uintptr_t target,</div><div class='add'>+        uint32_t fop_flags, fop_stat_cbk_t func, void *data, loc_t *loc,</div><div class='add'>+        dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    ec_cbk_t callback = {.stat = func};</div><div class='add'>+    ec_fop_data_t *fop = NULL;</div><div class='add'>+    int32_t error = ENOMEM;</div><div class='add'>+</div><div class='add'>+    gf_msg_trace("ec", 0, "EC(STAT) %p", frame);</div><div class='add'>+</div><div class='add'>+    VALIDATE_OR_GOTO(this, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, frame, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, this-&gt;private, out);</div><div class='add'>+</div><div class='add'>+    fop = ec_fop_data_allocate(frame, this, GF_FOP_STAT, EC_FLAG_LOCK_SHARED,</div><div class='add'>+                               target, fop_flags, ec_wind_stat, ec_manager_stat,</div><div class='add'>+                               callback, data);</div><div class='add'>+    if (fop == NULL) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (loc != NULL) {</div><div class='add'>+        if (loc_copy(&amp;fop-&gt;loc[0], loc) != 0) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, ENOMEM, EC_MSG_LOC_COPY_FAIL,</div><div class='add'>+                   "Failed to copy a location.");</div><div class='add'>+</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    if (xdata != NULL) {</div><div class='add'>+        fop-&gt;xdata = dict_ref(xdata);</div><div class='add'>+        if (fop-&gt;xdata == NULL) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, 0, EC_MSG_DICT_REF_FAIL,</div><div class='add'>+                   "Failed to reference a "</div><div class='add'>+                   "dictionary.");</div><div class='add'>+</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    error = 0;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (fop != NULL) {</div><div class='add'>+        ec_manager(fop, error);</div><div class='add'>+    } else {</div><div class='add'>+        func(frame, NULL, this, -1, error, NULL, NULL);</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* FOP: fstat */</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_fstat_cbk(call_frame_t *frame, void *cookie, xlator_t *this, int32_t op_ret,</div><div class='add'>+             int32_t op_errno, struct iatt *buf, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    ec_fop_data_t *fop = NULL;</div><div class='add'>+    ec_cbk_data_t *cbk = NULL;</div><div class='add'>+    int32_t idx = (int32_t)(uintptr_t)cookie;</div><div class='add'>+</div><div class='add'>+    VALIDATE_OR_GOTO(this, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, frame, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, frame-&gt;local, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, this-&gt;private, out);</div><div class='add'>+</div><div class='add'>+    fop = frame-&gt;local;</div><div class='add'>+</div><div class='add'>+    ec_trace("CBK", fop, "idx=%d, frame=%p, op_ret=%d, op_errno=%d", idx, frame,</div><div class='add'>+             op_ret, op_errno);</div><div class='add'>+</div><div class='add'>+    cbk = ec_cbk_data_allocate(frame, this, fop, GF_FOP_FSTAT, idx, op_ret,</div><div class='add'>+                               op_errno);</div><div class='add'>+    if (cbk != NULL) {</div><div class='add'>+        if (op_ret &gt;= 0) {</div><div class='add'>+            if (buf != NULL) {</div><div class='add'>+                cbk-&gt;iatt[0] = *buf;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+        if (xdata != NULL) {</div><div class='add'>+            cbk-&gt;xdata = dict_ref(xdata);</div><div class='add'>+            if (cbk-&gt;xdata == NULL) {</div><div class='add'>+                gf_msg(this-&gt;name, GF_LOG_ERROR, 0, EC_MSG_DICT_REF_FAIL,</div><div class='add'>+                       "Failed to reference a "</div><div class='add'>+                       "dictionary.");</div><div class='add'>+</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        ec_combine(cbk, ec_combine_stat);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (fop != NULL) {</div><div class='add'>+        ec_complete(fop);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_wind_fstat(ec_t *ec, ec_fop_data_t *fop, int32_t idx)</div><div class='add'>+{</div><div class='add'>+    ec_trace("WIND", fop, "idx=%d", idx);</div><div class='add'>+</div><div class='add'>+    STACK_WIND_COOKIE(fop-&gt;frame, ec_fstat_cbk, (void *)(uintptr_t)idx,</div><div class='add'>+                      ec-&gt;xl_list[idx], ec-&gt;xl_list[idx]-&gt;fops-&gt;fstat, fop-&gt;fd,</div><div class='add'>+                      fop-&gt;xdata);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_fstat(call_frame_t *frame, xlator_t *this, uintptr_t target,</div><div class='add'>+         uint32_t fop_flags, fop_fstat_cbk_t func, void *data, fd_t *fd,</div><div class='add'>+         dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    ec_cbk_t callback = {.fstat = func};</div><div class='add'>+    ec_fop_data_t *fop = NULL;</div><div class='add'>+    int32_t error = ENOMEM;</div><div class='add'>+</div><div class='add'>+    gf_msg_trace("ec", 0, "EC(FSTAT) %p", frame);</div><div class='add'>+</div><div class='add'>+    VALIDATE_OR_GOTO(this, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, frame, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, this-&gt;private, out);</div><div class='add'>+</div><div class='add'>+    fop = ec_fop_data_allocate(frame, this, GF_FOP_FSTAT, EC_FLAG_LOCK_SHARED,</div><div class='add'>+                               target, fop_flags, ec_wind_fstat,</div><div class='add'>+                               ec_manager_stat, callback, data);</div><div class='add'>+    if (fop == NULL) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    fop-&gt;use_fd = 1;</div><div class='add'>+</div><div class='add'>+    if (fd != NULL) {</div><div class='add'>+        fop-&gt;fd = fd_ref(fd);</div><div class='add'>+        if (fop-&gt;fd == NULL) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, 0, EC_MSG_FILE_DESC_REF_FAIL,</div><div class='add'>+                   "Failed to reference a "</div><div class='add'>+                   "file descriptor.");</div><div class='add'>+</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    if (xdata != NULL) {</div><div class='add'>+        fop-&gt;xdata = dict_ref(xdata);</div><div class='add'>+        if (fop-&gt;xdata == NULL) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, 0, EC_MSG_DICT_REF_FAIL,</div><div class='add'>+                   "Failed to reference a "</div><div class='add'>+                   "dictionary.");</div><div class='add'>+</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    error = 0;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (fop != NULL) {</div><div class='add'>+        ec_manager(fop, error);</div><div class='add'>+    } else {</div><div class='add'>+        func(frame, NULL, this, -1, error, NULL, NULL);</div><div class='add'>+    }</div><div class='add'>+}</div><div class='head'>diff --git a/xlators/cluster/ec/src/ec-inode-write.c b/xlators/cluster/ec/src/ec-inode-write.c<br/>new file mode 100644<br/>index 00000000000..9b5fe2a7fdc<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/xlators/cluster/ec/src/ec-inode-write.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>xlators/cluster/ec/src/ec-inode-write.c</a></div><div class='hunk'>@@ -0,0 +1,2369 @@</div><div class='add'>+/*</div><div class='add'>+  Copyright (c) 2012-2014 DataLab, s.l. &lt;http://www.datalab.es&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#include "ec-messages.h"</div><div class='add'>+#include "ec-helpers.h"</div><div class='add'>+#include "ec-common.h"</div><div class='add'>+#include "ec-combine.h"</div><div class='add'>+#include "ec-method.h"</div><div class='add'>+#include "ec-fops.h"</div><div class='add'>+#include "ec-mem-types.h"</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_update_writev_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                     int32_t op_ret, int32_t op_errno, struct iatt *prebuf,</div><div class='add'>+                     struct iatt *postbuf, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    ec_fop_data_t *fop = cookie;</div><div class='add'>+    ec_cbk_data_t *cbk = NULL;</div><div class='add'>+    ec_fop_data_t *parent = fop-&gt;parent;</div><div class='add'>+    int i = 0;</div><div class='add'>+</div><div class='add'>+    ec_trace("UPDATE_WRITEV_CBK", cookie, "ret=%d, errno=%d, parent-fop=%s",</div><div class='add'>+             op_ret, op_errno, ec_fop_name(parent-&gt;id));</div><div class='add'>+</div><div class='add'>+    if (op_ret &lt; 0) {</div><div class='add'>+        ec_fop_set_error(parent, op_errno);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    cbk = ec_cbk_data_allocate(parent-&gt;frame, this, parent, parent-&gt;id, 0,</div><div class='add'>+                               op_ret, op_errno);</div><div class='add'>+    if (!cbk) {</div><div class='add'>+        ec_fop_set_error(parent, ENOMEM);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (xdata)</div><div class='add'>+        cbk-&gt;xdata = dict_ref(xdata);</div><div class='add'>+</div><div class='add'>+    if (prebuf)</div><div class='add'>+        cbk-&gt;iatt[i++] = *prebuf;</div><div class='add'>+</div><div class='add'>+    if (postbuf)</div><div class='add'>+        cbk-&gt;iatt[i++] = *postbuf;</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;parent-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        parent-&gt;good &amp;= fop-&gt;good;</div><div class='add'>+</div><div class='add'>+        if (gf_bits_count(parent-&gt;good) &lt; parent-&gt;minimum) {</div><div class='add'>+            __ec_fop_set_error(parent, EIO);</div><div class='add'>+        } else if (fop-&gt;error == 0 &amp;&amp; parent-&gt;answer == NULL) {</div><div class='add'>+            parent-&gt;answer = cbk;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    UNLOCK(&amp;parent-&gt;lock);</div><div class='add'>+out:</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int32_t</div><div class='add'>+ec_update_write(ec_fop_data_t *fop, uintptr_t mask, off_t offset, uint64_t size)</div><div class='add'>+{</div><div class='add'>+    struct iobref *iobref = NULL;</div><div class='add'>+    struct iobuf *iobuf = NULL;</div><div class='add'>+    struct iovec vector;</div><div class='add'>+    int32_t err = -ENOMEM;</div><div class='add'>+</div><div class='add'>+    iobref = iobref_new();</div><div class='add'>+    if (iobref == NULL) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    iobuf = iobuf_get(fop-&gt;xl-&gt;ctx-&gt;iobuf_pool);</div><div class='add'>+    if (iobuf == NULL) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    err = iobref_add(iobref, iobuf);</div><div class='add'>+    if (err != 0) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (fop-&gt;locks[0].lock)</div><div class='add'>+        ec_lock_update_good(fop-&gt;locks[0].lock, fop);</div><div class='add'>+    vector.iov_base = iobuf-&gt;ptr;</div><div class='add'>+    vector.iov_len = size;</div><div class='add'>+    memset(vector.iov_base, 0, vector.iov_len);</div><div class='add'>+</div><div class='add'>+    ec_writev(fop-&gt;frame, fop-&gt;xl, mask, fop-&gt;minimum, ec_update_writev_cbk,</div><div class='add'>+              NULL, fop-&gt;fd, &amp;vector, 1, offset, 0, iobref, NULL);</div><div class='add'>+</div><div class='add'>+    err = 0;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (iobuf != NULL) {</div><div class='add'>+        iobuf_unref(iobuf);</div><div class='add'>+    }</div><div class='add'>+    if (iobref != NULL) {</div><div class='add'>+        iobref_unref(iobref);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return err;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+ec_inode_write_cbk(call_frame_t *frame, xlator_t *this, void *cookie,</div><div class='add'>+                   int op_ret, int op_errno, struct iatt *prestat,</div><div class='add'>+                   struct iatt *poststat, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    ec_fop_data_t *fop = NULL;</div><div class='add'>+    ec_cbk_data_t *cbk = NULL;</div><div class='add'>+    int i = 0;</div><div class='add'>+    int idx = 0;</div><div class='add'>+</div><div class='add'>+    VALIDATE_OR_GOTO(this, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, frame, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, frame-&gt;local, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, this-&gt;private, out);</div><div class='add'>+</div><div class='add'>+    fop = frame-&gt;local;</div><div class='add'>+    idx = (int32_t)(uintptr_t)cookie;</div><div class='add'>+</div><div class='add'>+    ec_trace("CBK", fop, "idx=%d, frame=%p, op_ret=%d, op_errno=%d", idx, frame,</div><div class='add'>+             op_ret, op_errno);</div><div class='add'>+</div><div class='add'>+    cbk = ec_cbk_data_allocate(frame, this, fop, fop-&gt;id, idx, op_ret,</div><div class='add'>+                               op_errno);</div><div class='add'>+    if (!cbk)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    if (op_ret &lt; 0)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    if (xdata)</div><div class='add'>+        cbk-&gt;xdata = dict_ref(xdata);</div><div class='add'>+</div><div class='add'>+    if (prestat)</div><div class='add'>+        cbk-&gt;iatt[i++] = *prestat;</div><div class='add'>+</div><div class='add'>+    if (poststat)</div><div class='add'>+        cbk-&gt;iatt[i++] = *poststat;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (cbk)</div><div class='add'>+        ec_combine(cbk, ec_combine_write);</div><div class='add'>+</div><div class='add'>+    if (fop)</div><div class='add'>+        ec_complete(fop);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+/* FOP: removexattr */</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_removexattr_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                   int32_t op_ret, int32_t op_errno, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    return ec_inode_write_cbk(frame, this, cookie, op_ret, op_errno, NULL, NULL,</div><div class='add'>+                              xdata);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_wind_removexattr(ec_t *ec, ec_fop_data_t *fop, int32_t idx)</div><div class='add'>+{</div><div class='add'>+    ec_trace("WIND", fop, "idx=%d", idx);</div><div class='add'>+</div><div class='add'>+    STACK_WIND_COOKIE(fop-&gt;frame, ec_removexattr_cbk, (void *)(uintptr_t)idx,</div><div class='add'>+                      ec-&gt;xl_list[idx], ec-&gt;xl_list[idx]-&gt;fops-&gt;removexattr,</div><div class='add'>+                      &amp;fop-&gt;loc[0], fop-&gt;str[0], fop-&gt;xdata);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_xattr_cbk(call_frame_t *frame, void *cookie, xlator_t *this, int32_t op_ret,</div><div class='add'>+             int32_t op_errno, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    ec_fop_data_t *fop = cookie;</div><div class='add'>+    switch (fop-&gt;id) {</div><div class='add'>+        case GF_FOP_SETXATTR:</div><div class='add'>+            if (fop-&gt;cbks.setxattr) {</div><div class='add'>+                QUORUM_CBK(fop-&gt;cbks.setxattr, fop, frame, cookie, this, op_ret,</div><div class='add'>+                           op_errno, xdata);</div><div class='add'>+            }</div><div class='add'>+            break;</div><div class='add'>+        case GF_FOP_REMOVEXATTR:</div><div class='add'>+            if (fop-&gt;cbks.removexattr) {</div><div class='add'>+                QUORUM_CBK(fop-&gt;cbks.removexattr, fop, frame, cookie, this,</div><div class='add'>+                           op_ret, op_errno, xdata);</div><div class='add'>+            }</div><div class='add'>+            break;</div><div class='add'>+        case GF_FOP_FSETXATTR:</div><div class='add'>+            if (fop-&gt;cbks.fsetxattr) {</div><div class='add'>+                QUORUM_CBK(fop-&gt;cbks.fsetxattr, fop, frame, cookie, this,</div><div class='add'>+                           op_ret, op_errno, xdata);</div><div class='add'>+            }</div><div class='add'>+            break;</div><div class='add'>+        case GF_FOP_FREMOVEXATTR:</div><div class='add'>+            if (fop-&gt;cbks.fremovexattr) {</div><div class='add'>+                QUORUM_CBK(fop-&gt;cbks.fremovexattr, fop, frame, cookie, this,</div><div class='add'>+                           op_ret, op_errno, xdata);</div><div class='add'>+            }</div><div class='add'>+            break;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_manager_xattr(ec_fop_data_t *fop, int32_t state)</div><div class='add'>+{</div><div class='add'>+    ec_cbk_data_t *cbk;</div><div class='add'>+</div><div class='add'>+    switch (state) {</div><div class='add'>+        case EC_STATE_INIT:</div><div class='add'>+        case EC_STATE_LOCK:</div><div class='add'>+            if (fop-&gt;fd == NULL) {</div><div class='add'>+                ec_lock_prepare_inode(fop, &amp;fop-&gt;loc[0],</div><div class='add'>+                                      EC_UPDATE_META | EC_QUERY_INFO, 0,</div><div class='add'>+                                      EC_RANGE_FULL);</div><div class='add'>+            } else {</div><div class='add'>+                ec_lock_prepare_fd(fop, fop-&gt;fd, EC_UPDATE_META | EC_QUERY_INFO,</div><div class='add'>+                                   0, EC_RANGE_FULL);</div><div class='add'>+            }</div><div class='add'>+            ec_lock(fop);</div><div class='add'>+</div><div class='add'>+            return EC_STATE_DISPATCH;</div><div class='add'>+</div><div class='add'>+        case EC_STATE_DISPATCH:</div><div class='add'>+            ec_dispatch_all(fop);</div><div class='add'>+</div><div class='add'>+            return EC_STATE_PREPARE_ANSWER;</div><div class='add'>+</div><div class='add'>+        case EC_STATE_PREPARE_ANSWER:</div><div class='add'>+            ec_fop_prepare_answer(fop, _gf_false);</div><div class='add'>+</div><div class='add'>+            return EC_STATE_REPORT;</div><div class='add'>+</div><div class='add'>+        case EC_STATE_REPORT:</div><div class='add'>+            cbk = fop-&gt;answer;</div><div class='add'>+</div><div class='add'>+            GF_ASSERT(cbk != NULL);</div><div class='add'>+</div><div class='add'>+            ec_xattr_cbk(fop-&gt;req_frame, fop, fop-&gt;xl, cbk-&gt;op_ret,</div><div class='add'>+                         cbk-&gt;op_errno, cbk-&gt;xdata);</div><div class='add'>+</div><div class='add'>+            return EC_STATE_LOCK_REUSE;</div><div class='add'>+</div><div class='add'>+        case -EC_STATE_INIT:</div><div class='add'>+        case -EC_STATE_LOCK:</div><div class='add'>+        case -EC_STATE_DISPATCH:</div><div class='add'>+        case -EC_STATE_PREPARE_ANSWER:</div><div class='add'>+        case -EC_STATE_REPORT:</div><div class='add'>+            GF_ASSERT(fop-&gt;error != 0);</div><div class='add'>+</div><div class='add'>+            ec_xattr_cbk(fop-&gt;req_frame, fop, fop-&gt;xl, -1, fop-&gt;error, NULL);</div><div class='add'>+</div><div class='add'>+            return EC_STATE_LOCK_REUSE;</div><div class='add'>+</div><div class='add'>+        case -EC_STATE_LOCK_REUSE:</div><div class='add'>+        case EC_STATE_LOCK_REUSE:</div><div class='add'>+            ec_lock_reuse(fop);</div><div class='add'>+</div><div class='add'>+            return EC_STATE_UNLOCK;</div><div class='add'>+</div><div class='add'>+        case -EC_STATE_UNLOCK:</div><div class='add'>+        case EC_STATE_UNLOCK:</div><div class='add'>+            ec_unlock(fop);</div><div class='add'>+</div><div class='add'>+            return EC_STATE_END;</div><div class='add'>+</div><div class='add'>+        default:</div><div class='add'>+            gf_msg(fop-&gt;xl-&gt;name, GF_LOG_ERROR, EINVAL, EC_MSG_UNHANDLED_STATE,</div><div class='add'>+                   "Unhandled state %d for %s", state, ec_fop_name(fop-&gt;id));</div><div class='add'>+</div><div class='add'>+            return EC_STATE_END;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_removexattr(call_frame_t *frame, xlator_t *this, uintptr_t target,</div><div class='add'>+               uint32_t fop_flags, fop_removexattr_cbk_t func, void *data,</div><div class='add'>+               loc_t *loc, const char *name, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    ec_cbk_t callback = {.removexattr = func};</div><div class='add'>+    ec_fop_data_t *fop = NULL;</div><div class='add'>+    int32_t error = ENOMEM;</div><div class='add'>+</div><div class='add'>+    gf_msg_trace("ec", 0, "EC(REMOVEXATTR) %p", frame);</div><div class='add'>+</div><div class='add'>+    VALIDATE_OR_GOTO(this, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, frame, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, this-&gt;private, out);</div><div class='add'>+</div><div class='add'>+    fop = ec_fop_data_allocate(frame, this, GF_FOP_REMOVEXATTR, 0, target,</div><div class='add'>+                               fop_flags, ec_wind_removexattr, ec_manager_xattr,</div><div class='add'>+                               callback, data);</div><div class='add'>+    if (fop == NULL) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (loc != NULL) {</div><div class='add'>+        if (loc_copy(&amp;fop-&gt;loc[0], loc) != 0) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, ENOMEM, EC_MSG_LOC_COPY_FAIL,</div><div class='add'>+                   "Failed to copy a location.");</div><div class='add'>+</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    if (name != NULL) {</div><div class='add'>+        fop-&gt;str[0] = gf_strdup(name);</div><div class='add'>+        if (fop-&gt;str[0] == NULL) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, ENOMEM, EC_MSG_NO_MEMORY,</div><div class='add'>+                   "Failed to duplicate a string.");</div><div class='add'>+</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    if (xdata != NULL) {</div><div class='add'>+        fop-&gt;xdata = dict_copy_with_ref(xdata, NULL);</div><div class='add'>+        if (fop-&gt;xdata == NULL) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, 0, EC_MSG_DICT_REF_FAIL,</div><div class='add'>+                   "Failed to reference a "</div><div class='add'>+                   "dictionary.");</div><div class='add'>+</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    error = 0;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (fop != NULL) {</div><div class='add'>+        ec_manager(fop, error);</div><div class='add'>+    } else {</div><div class='add'>+        func(frame, NULL, this, -1, error, NULL);</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* FOP: fremovexattr */</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_fremovexattr_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                    int32_t op_ret, int32_t op_errno, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    return ec_inode_write_cbk(frame, this, cookie, op_ret, op_errno, NULL, NULL,</div><div class='add'>+                              xdata);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_wind_fremovexattr(ec_t *ec, ec_fop_data_t *fop, int32_t idx)</div><div class='add'>+{</div><div class='add'>+    ec_trace("WIND", fop, "idx=%d", idx);</div><div class='add'>+</div><div class='add'>+    STACK_WIND_COOKIE(fop-&gt;frame, ec_fremovexattr_cbk, (void *)(uintptr_t)idx,</div><div class='add'>+                      ec-&gt;xl_list[idx], ec-&gt;xl_list[idx]-&gt;fops-&gt;fremovexattr,</div><div class='add'>+                      fop-&gt;fd, fop-&gt;str[0], fop-&gt;xdata);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_fremovexattr(call_frame_t *frame, xlator_t *this, uintptr_t target,</div><div class='add'>+                uint32_t fop_flags, fop_fremovexattr_cbk_t func, void *data,</div><div class='add'>+                fd_t *fd, const char *name, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    ec_cbk_t callback = {.fremovexattr = func};</div><div class='add'>+    ec_fop_data_t *fop = NULL;</div><div class='add'>+    int32_t error = ENOMEM;</div><div class='add'>+</div><div class='add'>+    gf_msg_trace("ec", 0, "EC(FREMOVEXATTR) %p", frame);</div><div class='add'>+</div><div class='add'>+    VALIDATE_OR_GOTO(this, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, frame, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, this-&gt;private, out);</div><div class='add'>+</div><div class='add'>+    fop = ec_fop_data_allocate(frame, this, GF_FOP_FREMOVEXATTR, 0, target,</div><div class='add'>+                               fop_flags, ec_wind_fremovexattr,</div><div class='add'>+                               ec_manager_xattr, callback, data);</div><div class='add'>+    if (fop == NULL) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    fop-&gt;use_fd = 1;</div><div class='add'>+</div><div class='add'>+    if (fd != NULL) {</div><div class='add'>+        fop-&gt;fd = fd_ref(fd);</div><div class='add'>+        if (fop-&gt;fd == NULL) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, 0, EC_MSG_FILE_DESC_REF_FAIL,</div><div class='add'>+                   "Failed to reference a "</div><div class='add'>+                   "file descriptor.");</div><div class='add'>+</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    if (name != NULL) {</div><div class='add'>+        fop-&gt;str[0] = gf_strdup(name);</div><div class='add'>+        if (fop-&gt;str[0] == NULL) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, ENOMEM, EC_MSG_NO_MEMORY,</div><div class='add'>+                   "Failed to duplicate a string.");</div><div class='add'>+</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    if (xdata != NULL) {</div><div class='add'>+        fop-&gt;xdata = dict_copy_with_ref(xdata, NULL);</div><div class='add'>+        if (fop-&gt;xdata == NULL) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, 0, EC_MSG_DICT_REF_FAIL,</div><div class='add'>+                   "Failed to reference a "</div><div class='add'>+                   "dictionary.");</div><div class='add'>+</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    error = 0;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (fop != NULL) {</div><div class='add'>+        ec_manager(fop, error);</div><div class='add'>+    } else {</div><div class='add'>+        func(frame, NULL, this, -1, error, NULL);</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* FOP: setattr */</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_setattr_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+               int32_t op_ret, int32_t op_errno, struct iatt *prestat,</div><div class='add'>+               struct iatt *poststat, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    return ec_inode_write_cbk(frame, this, cookie, op_ret, op_errno, prestat,</div><div class='add'>+                              poststat, xdata);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_wind_setattr(ec_t *ec, ec_fop_data_t *fop, int32_t idx)</div><div class='add'>+{</div><div class='add'>+    ec_trace("WIND", fop, "idx=%d", idx);</div><div class='add'>+</div><div class='add'>+    STACK_WIND_COOKIE(fop-&gt;frame, ec_setattr_cbk, (void *)(uintptr_t)idx,</div><div class='add'>+                      ec-&gt;xl_list[idx], ec-&gt;xl_list[idx]-&gt;fops-&gt;setattr,</div><div class='add'>+                      &amp;fop-&gt;loc[0], &amp;fop-&gt;iatt, fop-&gt;int32, fop-&gt;xdata);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_manager_setattr(ec_fop_data_t *fop, int32_t state)</div><div class='add'>+{</div><div class='add'>+    ec_cbk_data_t *cbk;</div><div class='add'>+</div><div class='add'>+    switch (state) {</div><div class='add'>+        case EC_STATE_INIT:</div><div class='add'>+        case EC_STATE_LOCK:</div><div class='add'>+            if (fop-&gt;fd == NULL) {</div><div class='add'>+                ec_lock_prepare_inode(fop, &amp;fop-&gt;loc[0],</div><div class='add'>+                                      EC_UPDATE_META | EC_QUERY_INFO, 0,</div><div class='add'>+                                      EC_RANGE_FULL);</div><div class='add'>+            } else {</div><div class='add'>+                ec_lock_prepare_fd(fop, fop-&gt;fd, EC_UPDATE_META | EC_QUERY_INFO,</div><div class='add'>+                                   0, EC_RANGE_FULL);</div><div class='add'>+            }</div><div class='add'>+            ec_lock(fop);</div><div class='add'>+</div><div class='add'>+            return EC_STATE_DISPATCH;</div><div class='add'>+</div><div class='add'>+        case EC_STATE_DISPATCH:</div><div class='add'>+            ec_dispatch_all(fop);</div><div class='add'>+</div><div class='add'>+            return EC_STATE_PREPARE_ANSWER;</div><div class='add'>+</div><div class='add'>+        case EC_STATE_PREPARE_ANSWER:</div><div class='add'>+            cbk = ec_fop_prepare_answer(fop, _gf_false);</div><div class='add'>+            if (cbk != NULL) {</div><div class='add'>+                if (cbk-&gt;iatt[0].ia_type == IA_IFREG) {</div><div class='add'>+                    ec_iatt_rebuild(fop-&gt;xl-&gt;private, cbk-&gt;iatt, 2, cbk-&gt;count);</div><div class='add'>+</div><div class='add'>+                    /* This shouldn't fail because we have the inode locked. */</div><div class='add'>+                    GF_ASSERT(ec_get_inode_size(fop,</div><div class='add'>+                                                fop-&gt;locks[0].lock-&gt;loc.inode,</div><div class='add'>+                                                &amp;cbk-&gt;iatt[0].ia_size));</div><div class='add'>+                    cbk-&gt;iatt[1].ia_size = cbk-&gt;iatt[0].ia_size;</div><div class='add'>+                }</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            return EC_STATE_REPORT;</div><div class='add'>+</div><div class='add'>+        case EC_STATE_REPORT:</div><div class='add'>+            cbk = fop-&gt;answer;</div><div class='add'>+</div><div class='add'>+            GF_ASSERT(cbk != NULL);</div><div class='add'>+</div><div class='add'>+            if (fop-&gt;id == GF_FOP_SETATTR) {</div><div class='add'>+                if (fop-&gt;cbks.setattr != NULL) {</div><div class='add'>+                    QUORUM_CBK(fop-&gt;cbks.setattr, fop, fop-&gt;req_frame, fop,</div><div class='add'>+                               fop-&gt;xl, cbk-&gt;op_ret, cbk-&gt;op_errno,</div><div class='add'>+                               &amp;cbk-&gt;iatt[0], &amp;cbk-&gt;iatt[1], cbk-&gt;xdata);</div><div class='add'>+                }</div><div class='add'>+            } else {</div><div class='add'>+                if (fop-&gt;cbks.fsetattr != NULL) {</div><div class='add'>+                    QUORUM_CBK(fop-&gt;cbks.fsetattr, fop, fop-&gt;req_frame, fop,</div><div class='add'>+                               fop-&gt;xl, cbk-&gt;op_ret, cbk-&gt;op_errno,</div><div class='add'>+                               &amp;cbk-&gt;iatt[0], &amp;cbk-&gt;iatt[1], cbk-&gt;xdata);</div><div class='add'>+                }</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            return EC_STATE_LOCK_REUSE;</div><div class='add'>+</div><div class='add'>+        case -EC_STATE_INIT:</div><div class='add'>+        case -EC_STATE_LOCK:</div><div class='add'>+        case -EC_STATE_DISPATCH:</div><div class='add'>+        case -EC_STATE_PREPARE_ANSWER:</div><div class='add'>+        case -EC_STATE_REPORT:</div><div class='add'>+            GF_ASSERT(fop-&gt;error != 0);</div><div class='add'>+</div><div class='add'>+            if (fop-&gt;id == GF_FOP_SETATTR) {</div><div class='add'>+                if (fop-&gt;cbks.setattr != NULL) {</div><div class='add'>+                    fop-&gt;cbks.setattr(fop-&gt;req_frame, fop, fop-&gt;xl, -1,</div><div class='add'>+                                      fop-&gt;error, NULL, NULL, NULL);</div><div class='add'>+                }</div><div class='add'>+            } else {</div><div class='add'>+                if (fop-&gt;cbks.fsetattr != NULL) {</div><div class='add'>+                    fop-&gt;cbks.fsetattr(fop-&gt;req_frame, fop, fop-&gt;xl, -1,</div><div class='add'>+                                       fop-&gt;error, NULL, NULL, NULL);</div><div class='add'>+                }</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            return EC_STATE_LOCK_REUSE;</div><div class='add'>+</div><div class='add'>+        case -EC_STATE_LOCK_REUSE:</div><div class='add'>+        case EC_STATE_LOCK_REUSE:</div><div class='add'>+            ec_lock_reuse(fop);</div><div class='add'>+</div><div class='add'>+            return EC_STATE_UNLOCK;</div><div class='add'>+</div><div class='add'>+        case -EC_STATE_UNLOCK:</div><div class='add'>+        case EC_STATE_UNLOCK:</div><div class='add'>+            ec_unlock(fop);</div><div class='add'>+</div><div class='add'>+            return EC_STATE_END;</div><div class='add'>+</div><div class='add'>+        default:</div><div class='add'>+            gf_msg(fop-&gt;xl-&gt;name, GF_LOG_ERROR, EINVAL, EC_MSG_UNHANDLED_STATE,</div><div class='add'>+                   "Unhandled state %d for %s", state, ec_fop_name(fop-&gt;id));</div><div class='add'>+</div><div class='add'>+            return EC_STATE_END;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_setattr(call_frame_t *frame, xlator_t *this, uintptr_t target,</div><div class='add'>+           uint32_t fop_flags, fop_setattr_cbk_t func, void *data, loc_t *loc,</div><div class='add'>+           struct iatt *stbuf, int32_t valid, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    ec_cbk_t callback = {.setattr = func};</div><div class='add'>+    ec_fop_data_t *fop = NULL;</div><div class='add'>+    int32_t error = ENOMEM;</div><div class='add'>+</div><div class='add'>+    gf_msg_trace("ec", 0, "EC(SETATTR) %p", frame);</div><div class='add'>+</div><div class='add'>+    VALIDATE_OR_GOTO(this, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, frame, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, this-&gt;private, out);</div><div class='add'>+</div><div class='add'>+    fop = ec_fop_data_allocate(frame, this, GF_FOP_SETATTR, 0, target,</div><div class='add'>+                               fop_flags, ec_wind_setattr, ec_manager_setattr,</div><div class='add'>+                               callback, data);</div><div class='add'>+    if (fop == NULL) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    fop-&gt;int32 = valid;</div><div class='add'>+</div><div class='add'>+    if (loc != NULL) {</div><div class='add'>+        if (loc_copy(&amp;fop-&gt;loc[0], loc) != 0) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, ENOMEM, EC_MSG_LOC_COPY_FAIL,</div><div class='add'>+                   "Failed to copy a location.");</div><div class='add'>+</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    if (stbuf != NULL) {</div><div class='add'>+        fop-&gt;iatt = *stbuf;</div><div class='add'>+    }</div><div class='add'>+    if (xdata != NULL) {</div><div class='add'>+        fop-&gt;xdata = dict_copy_with_ref(xdata, NULL);</div><div class='add'>+        if (fop-&gt;xdata == NULL) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, 0, EC_MSG_DICT_REF_FAIL,</div><div class='add'>+                   "Failed to reference a "</div><div class='add'>+                   "dictionary.");</div><div class='add'>+</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    error = 0;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (fop != NULL) {</div><div class='add'>+        ec_manager(fop, error);</div><div class='add'>+    } else {</div><div class='add'>+        func(frame, NULL, this, -1, error, NULL, NULL, NULL);</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* FOP: fsetattr */</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_fsetattr_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                int32_t op_ret, int32_t op_errno, struct iatt *prestat,</div><div class='add'>+                struct iatt *poststat, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    return ec_inode_write_cbk(frame, this, cookie, op_ret, op_errno, prestat,</div><div class='add'>+                              poststat, xdata);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_wind_fsetattr(ec_t *ec, ec_fop_data_t *fop, int32_t idx)</div><div class='add'>+{</div><div class='add'>+    ec_trace("WIND", fop, "idx=%d", idx);</div><div class='add'>+</div><div class='add'>+    STACK_WIND_COOKIE(fop-&gt;frame, ec_fsetattr_cbk, (void *)(uintptr_t)idx,</div><div class='add'>+                      ec-&gt;xl_list[idx], ec-&gt;xl_list[idx]-&gt;fops-&gt;fsetattr,</div><div class='add'>+                      fop-&gt;fd, &amp;fop-&gt;iatt, fop-&gt;int32, fop-&gt;xdata);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_fsetattr(call_frame_t *frame, xlator_t *this, uintptr_t target,</div><div class='add'>+            uint32_t fop_flags, fop_fsetattr_cbk_t func, void *data, fd_t *fd,</div><div class='add'>+            struct iatt *stbuf, int32_t valid, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    ec_cbk_t callback = {.fsetattr = func};</div><div class='add'>+    ec_fop_data_t *fop = NULL;</div><div class='add'>+    int32_t error = ENOMEM;</div><div class='add'>+</div><div class='add'>+    gf_msg_trace("ec", 0, "EC(FSETATTR) %p", frame);</div><div class='add'>+</div><div class='add'>+    VALIDATE_OR_GOTO(this, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, frame, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, this-&gt;private, out);</div><div class='add'>+</div><div class='add'>+    fop = ec_fop_data_allocate(frame, this, GF_FOP_FSETATTR, 0, target,</div><div class='add'>+                               fop_flags, ec_wind_fsetattr, ec_manager_setattr,</div><div class='add'>+                               callback, data);</div><div class='add'>+    if (fop == NULL) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    fop-&gt;use_fd = 1;</div><div class='add'>+</div><div class='add'>+    fop-&gt;int32 = valid;</div><div class='add'>+</div><div class='add'>+    if (fd != NULL) {</div><div class='add'>+        fop-&gt;fd = fd_ref(fd);</div><div class='add'>+        if (fop-&gt;fd == NULL) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, 0, EC_MSG_FILE_DESC_REF_FAIL,</div><div class='add'>+                   "Failed to reference a "</div><div class='add'>+                   "file descriptor.");</div><div class='add'>+</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    if (stbuf != NULL) {</div><div class='add'>+        fop-&gt;iatt = *stbuf;</div><div class='add'>+    }</div><div class='add'>+    if (xdata != NULL) {</div><div class='add'>+        fop-&gt;xdata = dict_copy_with_ref(xdata, NULL);</div><div class='add'>+        if (fop-&gt;xdata == NULL) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, 0, EC_MSG_DICT_REF_FAIL,</div><div class='add'>+                   "Failed to reference a "</div><div class='add'>+                   "dictionary.");</div><div class='add'>+</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    error = 0;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (fop != NULL) {</div><div class='add'>+        ec_manager(fop, error);</div><div class='add'>+    } else {</div><div class='add'>+        func(frame, NULL, this, -1, error, NULL, NULL, NULL);</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* FOP: setxattr */</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_setxattr_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                int32_t op_ret, int32_t op_errno, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    return ec_inode_write_cbk(frame, this, cookie, op_ret, op_errno, NULL, NULL,</div><div class='add'>+                              xdata);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_wind_setxattr(ec_t *ec, ec_fop_data_t *fop, int32_t idx)</div><div class='add'>+{</div><div class='add'>+    ec_trace("WIND", fop, "idx=%d", idx);</div><div class='add'>+</div><div class='add'>+    STACK_WIND_COOKIE(fop-&gt;frame, ec_setxattr_cbk, (void *)(uintptr_t)idx,</div><div class='add'>+                      ec-&gt;xl_list[idx], ec-&gt;xl_list[idx]-&gt;fops-&gt;setxattr,</div><div class='add'>+                      &amp;fop-&gt;loc[0], fop-&gt;dict, fop-&gt;int32, fop-&gt;xdata);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_setxattr(call_frame_t *frame, xlator_t *this, uintptr_t target,</div><div class='add'>+            uint32_t fop_flags, fop_setxattr_cbk_t func, void *data, loc_t *loc,</div><div class='add'>+            dict_t *dict, int32_t flags, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    ec_cbk_t callback = {.setxattr = func};</div><div class='add'>+    ec_fop_data_t *fop = NULL;</div><div class='add'>+    int32_t error = ENOMEM;</div><div class='add'>+</div><div class='add'>+    gf_msg_trace("ec", 0, "EC(SETXATTR) %p", frame);</div><div class='add'>+</div><div class='add'>+    VALIDATE_OR_GOTO(this, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, frame, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, this-&gt;private, out);</div><div class='add'>+</div><div class='add'>+    fop = ec_fop_data_allocate(frame, this, GF_FOP_SETXATTR, 0, target,</div><div class='add'>+                               fop_flags, ec_wind_setxattr, ec_manager_xattr,</div><div class='add'>+                               callback, data);</div><div class='add'>+    if (fop == NULL) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    fop-&gt;int32 = flags;</div><div class='add'>+</div><div class='add'>+    if (loc != NULL) {</div><div class='add'>+        if (loc_copy(&amp;fop-&gt;loc[0], loc) != 0) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, ENOMEM, EC_MSG_LOC_COPY_FAIL,</div><div class='add'>+                   "Failed to copy a location.");</div><div class='add'>+</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    if (dict != NULL) {</div><div class='add'>+        fop-&gt;dict = dict_copy_with_ref(dict, NULL);</div><div class='add'>+        if (fop-&gt;dict == NULL) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, 0, EC_MSG_DICT_REF_FAIL,</div><div class='add'>+                   "Failed to reference a "</div><div class='add'>+                   "dictionary.");</div><div class='add'>+</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    if (xdata != NULL) {</div><div class='add'>+        fop-&gt;xdata = dict_copy_with_ref(xdata, NULL);</div><div class='add'>+        if (fop-&gt;xdata == NULL) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, 0, EC_MSG_DICT_REF_FAIL,</div><div class='add'>+                   "Failed to reference a "</div><div class='add'>+                   "dictionary.");</div><div class='add'>+</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    error = 0;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (fop != NULL) {</div><div class='add'>+        ec_manager(fop, error);</div><div class='add'>+    } else {</div><div class='add'>+        func(frame, NULL, this, -1, error, NULL);</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* FOP: fsetxattr */</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_fsetxattr_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                 int32_t op_ret, int32_t op_errno, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    ec_fop_data_t *fop = NULL;</div><div class='add'>+    ec_cbk_data_t *cbk = NULL;</div><div class='add'>+    int32_t idx = (int32_t)(uintptr_t)cookie;</div><div class='add'>+</div><div class='add'>+    VALIDATE_OR_GOTO(this, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, frame, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, frame-&gt;local, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, this-&gt;private, out);</div><div class='add'>+</div><div class='add'>+    fop = frame-&gt;local;</div><div class='add'>+</div><div class='add'>+    ec_trace("CBK", fop, "idx=%d, frame=%p, op_ret=%d, op_errno=%d", idx, frame,</div><div class='add'>+             op_ret, op_errno);</div><div class='add'>+</div><div class='add'>+    cbk = ec_cbk_data_allocate(frame, this, fop, GF_FOP_FSETXATTR, idx, op_ret,</div><div class='add'>+                               op_errno);</div><div class='add'>+    if (cbk != NULL) {</div><div class='add'>+        if (xdata != NULL) {</div><div class='add'>+            cbk-&gt;xdata = dict_ref(xdata);</div><div class='add'>+            if (cbk-&gt;xdata == NULL) {</div><div class='add'>+                gf_msg(this-&gt;name, GF_LOG_ERROR, 0, EC_MSG_DICT_REF_FAIL,</div><div class='add'>+                       "Failed to reference a "</div><div class='add'>+                       "dictionary.");</div><div class='add'>+</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        ec_combine(cbk, NULL);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (fop != NULL) {</div><div class='add'>+        ec_complete(fop);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_wind_fsetxattr(ec_t *ec, ec_fop_data_t *fop, int32_t idx)</div><div class='add'>+{</div><div class='add'>+    ec_trace("WIND", fop, "idx=%d", idx);</div><div class='add'>+</div><div class='add'>+    STACK_WIND_COOKIE(fop-&gt;frame, ec_fsetxattr_cbk, (void *)(uintptr_t)idx,</div><div class='add'>+                      ec-&gt;xl_list[idx], ec-&gt;xl_list[idx]-&gt;fops-&gt;fsetxattr,</div><div class='add'>+                      fop-&gt;fd, fop-&gt;dict, fop-&gt;int32, fop-&gt;xdata);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_fsetxattr(call_frame_t *frame, xlator_t *this, uintptr_t target,</div><div class='add'>+             uint32_t fop_flags, fop_fsetxattr_cbk_t func, void *data, fd_t *fd,</div><div class='add'>+             dict_t *dict, int32_t flags, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    ec_cbk_t callback = {.fsetxattr = func};</div><div class='add'>+    ec_fop_data_t *fop = NULL;</div><div class='add'>+    int32_t error = ENOMEM;</div><div class='add'>+</div><div class='add'>+    gf_msg_trace("ec", 0, "EC(FSETXATTR) %p", frame);</div><div class='add'>+</div><div class='add'>+    VALIDATE_OR_GOTO(this, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, frame, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, this-&gt;private, out);</div><div class='add'>+</div><div class='add'>+    fop = ec_fop_data_allocate(frame, this, GF_FOP_FSETXATTR, 0, target,</div><div class='add'>+                               fop_flags, ec_wind_fsetxattr, ec_manager_xattr,</div><div class='add'>+                               callback, data);</div><div class='add'>+    if (fop == NULL) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    fop-&gt;use_fd = 1;</div><div class='add'>+</div><div class='add'>+    fop-&gt;int32 = flags;</div><div class='add'>+</div><div class='add'>+    if (fd != NULL) {</div><div class='add'>+        fop-&gt;fd = fd_ref(fd);</div><div class='add'>+        if (fop-&gt;fd == NULL) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, 0, EC_MSG_FILE_DESC_REF_FAIL,</div><div class='add'>+                   "Failed to reference a "</div><div class='add'>+                   "file descriptor.");</div><div class='add'>+</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    if (dict != NULL) {</div><div class='add'>+        fop-&gt;dict = dict_copy_with_ref(dict, NULL);</div><div class='add'>+        if (fop-&gt;dict == NULL) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, 0, EC_MSG_DICT_REF_FAIL,</div><div class='add'>+                   "Failed to reference a "</div><div class='add'>+                   "dictionary.");</div><div class='add'>+</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    if (xdata != NULL) {</div><div class='add'>+        fop-&gt;xdata = dict_copy_with_ref(xdata, NULL);</div><div class='add'>+        if (fop-&gt;xdata == NULL) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, 0, EC_MSG_DICT_REF_FAIL,</div><div class='add'>+                   "Failed to reference a "</div><div class='add'>+                   "dictionary.");</div><div class='add'>+</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    error = 0;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (fop != NULL) {</div><div class='add'>+        ec_manager(fop, error);</div><div class='add'>+    } else {</div><div class='add'>+        func(frame, NULL, this, -1, error, NULL);</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*********************************************************************</div><div class='add'>+ *</div><div class='add'>+ * File Operation : fallocate</div><div class='add'>+ *</div><div class='add'>+ *********************************************************************/</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_fallocate_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                 int32_t op_ret, int32_t op_errno, struct iatt *prebuf,</div><div class='add'>+                 struct iatt *postbuf, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    return ec_inode_write_cbk(frame, this, cookie, op_ret, op_errno, prebuf,</div><div class='add'>+                              postbuf, xdata);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_wind_fallocate(ec_t *ec, ec_fop_data_t *fop, int32_t idx)</div><div class='add'>+{</div><div class='add'>+    ec_trace("WIND", fop, "idx=%d", idx);</div><div class='add'>+</div><div class='add'>+    STACK_WIND_COOKIE(fop-&gt;frame, ec_fallocate_cbk, (void *)(uintptr_t)idx,</div><div class='add'>+                      ec-&gt;xl_list[idx], ec-&gt;xl_list[idx]-&gt;fops-&gt;fallocate,</div><div class='add'>+                      fop-&gt;fd, fop-&gt;int32, fop-&gt;offset, fop-&gt;size, fop-&gt;xdata);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_manager_fallocate(ec_fop_data_t *fop, int32_t state)</div><div class='add'>+{</div><div class='add'>+    ec_cbk_data_t *cbk = NULL;</div><div class='add'>+</div><div class='add'>+    switch (state) {</div><div class='add'>+        case EC_STATE_INIT:</div><div class='add'>+            if (fop-&gt;size == 0) {</div><div class='add'>+                ec_fop_set_error(fop, EINVAL);</div><div class='add'>+                return EC_STATE_REPORT;</div><div class='add'>+            }</div><div class='add'>+            if (fop-&gt;int32 &amp;</div><div class='add'>+                (FALLOC_FL_COLLAPSE_RANGE | FALLOC_FL_INSERT_RANGE |</div><div class='add'>+                 FALLOC_FL_ZERO_RANGE | FALLOC_FL_PUNCH_HOLE)) {</div><div class='add'>+                ec_fop_set_error(fop, ENOTSUP);</div><div class='add'>+                return EC_STATE_REPORT;</div><div class='add'>+            }</div><div class='add'>+            fop-&gt;user_size = fop-&gt;offset + fop-&gt;size;</div><div class='add'>+            fop-&gt;head = ec_adjust_offset_down(fop-&gt;xl-&gt;private, &amp;fop-&gt;offset,</div><div class='add'>+                                              _gf_true);</div><div class='add'>+            fop-&gt;size += fop-&gt;head;</div><div class='add'>+            ec_adjust_size_up(fop-&gt;xl-&gt;private, &amp;fop-&gt;size, _gf_true);</div><div class='add'>+</div><div class='add'>+            /* Fall through */</div><div class='add'>+</div><div class='add'>+        case EC_STATE_LOCK:</div><div class='add'>+            ec_lock_prepare_fd(fop, fop-&gt;fd,</div><div class='add'>+                               EC_UPDATE_DATA | EC_UPDATE_META | EC_QUERY_INFO,</div><div class='add'>+                               fop-&gt;offset, fop-&gt;size);</div><div class='add'>+            ec_lock(fop);</div><div class='add'>+</div><div class='add'>+            return EC_STATE_DISPATCH;</div><div class='add'>+</div><div class='add'>+        case EC_STATE_DISPATCH:</div><div class='add'>+</div><div class='add'>+            ec_dispatch_all(fop);</div><div class='add'>+</div><div class='add'>+            return EC_STATE_PREPARE_ANSWER;</div><div class='add'>+</div><div class='add'>+        case EC_STATE_PREPARE_ANSWER:</div><div class='add'>+            cbk = ec_fop_prepare_answer(fop, _gf_false);</div><div class='add'>+            if (cbk != NULL) {</div><div class='add'>+                ec_iatt_rebuild(fop-&gt;xl-&gt;private, cbk-&gt;iatt, 2, cbk-&gt;count);</div><div class='add'>+</div><div class='add'>+                /* This shouldn't fail because we have the inode locked. */</div><div class='add'>+                LOCK(&amp;fop-&gt;locks[0].lock-&gt;loc.inode-&gt;lock);</div><div class='add'>+                {</div><div class='add'>+                    GF_ASSERT(__ec_get_inode_size(fop,</div><div class='add'>+                                                  fop-&gt;locks[0].lock-&gt;loc.inode,</div><div class='add'>+                                                  &amp;cbk-&gt;iatt[0].ia_size));</div><div class='add'>+</div><div class='add'>+                    /*If mode has FALLOC_FL_KEEP_SIZE keep the size */</div><div class='add'>+                    if (fop-&gt;int32 &amp; FALLOC_FL_KEEP_SIZE) {</div><div class='add'>+                        cbk-&gt;iatt[1].ia_size = cbk-&gt;iatt[0].ia_size;</div><div class='add'>+                    } else if (fop-&gt;user_size &gt; cbk-&gt;iatt[0].ia_size) {</div><div class='add'>+                        cbk-&gt;iatt[1].ia_size = fop-&gt;user_size;</div><div class='add'>+</div><div class='add'>+                        /* This shouldn't fail because we have the inode</div><div class='add'>+                         * locked. */</div><div class='add'>+                        GF_ASSERT(__ec_set_inode_size(</div><div class='add'>+                            fop, fop-&gt;locks[0].lock-&gt;loc.inode,</div><div class='add'>+                            cbk-&gt;iatt[1].ia_size));</div><div class='add'>+                    } else {</div><div class='add'>+                        cbk-&gt;iatt[1].ia_size = cbk-&gt;iatt[0].ia_size;</div><div class='add'>+                    }</div><div class='add'>+                }</div><div class='add'>+                UNLOCK(&amp;fop-&gt;locks[0].lock-&gt;loc.inode-&gt;lock);</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            return EC_STATE_REPORT;</div><div class='add'>+</div><div class='add'>+        case EC_STATE_REPORT:</div><div class='add'>+            cbk = fop-&gt;answer;</div><div class='add'>+</div><div class='add'>+            GF_ASSERT(cbk != NULL);</div><div class='add'>+</div><div class='add'>+            if (fop-&gt;cbks.fallocate != NULL) {</div><div class='add'>+                QUORUM_CBK(fop-&gt;cbks.fallocate, fop, fop-&gt;req_frame, fop,</div><div class='add'>+                           fop-&gt;xl, cbk-&gt;op_ret, cbk-&gt;op_errno, &amp;cbk-&gt;iatt[0],</div><div class='add'>+                           &amp;cbk-&gt;iatt[1], cbk-&gt;xdata);</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            return EC_STATE_LOCK_REUSE;</div><div class='add'>+</div><div class='add'>+        case -EC_STATE_INIT:</div><div class='add'>+        case -EC_STATE_LOCK:</div><div class='add'>+        case -EC_STATE_DISPATCH:</div><div class='add'>+        case -EC_STATE_PREPARE_ANSWER:</div><div class='add'>+        case -EC_STATE_REPORT:</div><div class='add'>+            GF_ASSERT(fop-&gt;error != 0);</div><div class='add'>+</div><div class='add'>+            if (fop-&gt;cbks.fallocate != NULL) {</div><div class='add'>+                fop-&gt;cbks.fallocate(fop-&gt;req_frame, fop, fop-&gt;xl, -1,</div><div class='add'>+                                    fop-&gt;error, NULL, NULL, NULL);</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            return EC_STATE_LOCK_REUSE;</div><div class='add'>+</div><div class='add'>+        case -EC_STATE_LOCK_REUSE:</div><div class='add'>+        case EC_STATE_LOCK_REUSE:</div><div class='add'>+            ec_lock_reuse(fop);</div><div class='add'>+</div><div class='add'>+            return EC_STATE_UNLOCK;</div><div class='add'>+</div><div class='add'>+        case -EC_STATE_UNLOCK:</div><div class='add'>+        case EC_STATE_UNLOCK:</div><div class='add'>+            ec_unlock(fop);</div><div class='add'>+</div><div class='add'>+            return EC_STATE_END;</div><div class='add'>+</div><div class='add'>+        default:</div><div class='add'>+            gf_msg(fop-&gt;xl-&gt;name, GF_LOG_ERROR, EINVAL, EC_MSG_UNHANDLED_STATE,</div><div class='add'>+                   "Unhandled state %d for %s", state, ec_fop_name(fop-&gt;id));</div><div class='add'>+</div><div class='add'>+            return EC_STATE_END;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_fallocate(call_frame_t *frame, xlator_t *this, uintptr_t target,</div><div class='add'>+             uint32_t fop_flags, fop_fallocate_cbk_t func, void *data, fd_t *fd,</div><div class='add'>+             int32_t mode, off_t offset, size_t len, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    ec_cbk_t callback = {.fallocate = func};</div><div class='add'>+    ec_fop_data_t *fop = NULL;</div><div class='add'>+    int32_t error = ENOMEM;</div><div class='add'>+</div><div class='add'>+    gf_msg_trace("ec", 0, "EC(FALLOCATE) %p", frame);</div><div class='add'>+</div><div class='add'>+    VALIDATE_OR_GOTO(this, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, frame, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, this-&gt;private, out);</div><div class='add'>+</div><div class='add'>+    fop = ec_fop_data_allocate(frame, this, GF_FOP_FALLOCATE, 0, target,</div><div class='add'>+                               fop_flags, ec_wind_fallocate,</div><div class='add'>+                               ec_manager_fallocate, callback, data);</div><div class='add'>+    if (fop == NULL) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    fop-&gt;use_fd = 1;</div><div class='add'>+    fop-&gt;int32 = mode;</div><div class='add'>+    fop-&gt;offset = offset;</div><div class='add'>+    fop-&gt;size = len;</div><div class='add'>+</div><div class='add'>+    if (fd != NULL) {</div><div class='add'>+        fop-&gt;fd = fd_ref(fd);</div><div class='add'>+        if (fop-&gt;fd == NULL) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, 0, EC_MSG_FILE_DESC_REF_FAIL,</div><div class='add'>+                   "Failed to reference a "</div><div class='add'>+                   "file descriptor.");</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (xdata != NULL) {</div><div class='add'>+        fop-&gt;xdata = dict_ref(xdata);</div><div class='add'>+        if (fop-&gt;xdata == NULL) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, 0, EC_MSG_DICT_REF_FAIL,</div><div class='add'>+                   "Failed to reference a "</div><div class='add'>+                   "dictionary.");</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    error = 0;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (fop != NULL) {</div><div class='add'>+        ec_manager(fop, error);</div><div class='add'>+    } else {</div><div class='add'>+        func(frame, NULL, this, -1, error, NULL, NULL, NULL);</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*********************************************************************</div><div class='add'>+ *</div><div class='add'>+ * File Operation : Discard</div><div class='add'>+ *</div><div class='add'>+ *********************************************************************/</div><div class='add'>+void</div><div class='add'>+ec_update_discard_write(ec_fop_data_t *fop, uintptr_t mask)</div><div class='add'>+{</div><div class='add'>+    ec_t *ec = fop-&gt;xl-&gt;private;</div><div class='add'>+    off_t off_head = 0;</div><div class='add'>+    off_t off_tail = 0;</div><div class='add'>+    uint64_t size_head = 0;</div><div class='add'>+    uint64_t size_tail = 0;</div><div class='add'>+    int error = 0;</div><div class='add'>+</div><div class='add'>+    off_head = fop-&gt;offset * ec-&gt;fragments - fop-&gt;int32;</div><div class='add'>+    if (fop-&gt;size == 0) {</div><div class='add'>+        error = ec_update_write(fop, mask, off_head, fop-&gt;user_size);</div><div class='add'>+    } else {</div><div class='add'>+        size_head = fop-&gt;int32;</div><div class='add'>+        size_tail = (off_head + fop-&gt;user_size) % ec-&gt;stripe_size;</div><div class='add'>+        off_tail = off_head + fop-&gt;user_size - size_tail;</div><div class='add'>+        if (size_head) {</div><div class='add'>+            error = ec_update_write(fop, mask, off_head, size_head);</div><div class='add'>+            if (error) {</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+        if (size_tail) {</div><div class='add'>+            error = ec_update_write(fop, mask, off_tail, size_tail);</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+out:</div><div class='add'>+    if (error)</div><div class='add'>+        ec_fop_set_error(fop, -error);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_discard_adjust_offset_size(ec_fop_data_t *fop)</div><div class='add'>+{</div><div class='add'>+    ec_t *ec = fop-&gt;xl-&gt;private;</div><div class='add'>+</div><div class='add'>+    fop-&gt;user_size = fop-&gt;size;</div><div class='add'>+    /* If discard length covers at least a fragment on brick, we will</div><div class='add'>+     * perform discard operation(when fop-&gt;size is non-zero) else we just</div><div class='add'>+     * write zeros.</div><div class='add'>+     */</div><div class='add'>+    fop-&gt;int32 = ec_adjust_offset_up(ec, &amp;fop-&gt;offset, _gf_true);</div><div class='add'>+    fop-&gt;frag_range.first = fop-&gt;offset;</div><div class='add'>+    if (fop-&gt;size &lt; fop-&gt;int32) {</div><div class='add'>+        fop-&gt;size = 0;</div><div class='add'>+    } else {</div><div class='add'>+        fop-&gt;size -= fop-&gt;int32;</div><div class='add'>+        ec_adjust_size_down(ec, &amp;fop-&gt;size, _gf_true);</div><div class='add'>+    }</div><div class='add'>+    fop-&gt;frag_range.last = fop-&gt;offset + fop-&gt;size;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_discard_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+               int32_t op_ret, int32_t op_errno, struct iatt *prebuf,</div><div class='add'>+               struct iatt *postbuf, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    return ec_inode_write_cbk(frame, this, cookie, op_ret, op_errno, prebuf,</div><div class='add'>+                              postbuf, xdata);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_wind_discard(ec_t *ec, ec_fop_data_t *fop, int32_t idx)</div><div class='add'>+{</div><div class='add'>+    ec_trace("WIND", fop, "idx=%d", idx);</div><div class='add'>+</div><div class='add'>+    STACK_WIND_COOKIE(fop-&gt;frame, ec_discard_cbk, (void *)(uintptr_t)idx,</div><div class='add'>+                      ec-&gt;xl_list[idx], ec-&gt;xl_list[idx]-&gt;fops-&gt;discard,</div><div class='add'>+                      fop-&gt;fd, fop-&gt;offset, fop-&gt;size, fop-&gt;xdata);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_manager_discard(ec_fop_data_t *fop, int32_t state)</div><div class='add'>+{</div><div class='add'>+    ec_cbk_data_t *cbk = NULL;</div><div class='add'>+    off_t fl_start = 0;</div><div class='add'>+    uint64_t fl_size = 0;</div><div class='add'>+</div><div class='add'>+    switch (state) {</div><div class='add'>+        case EC_STATE_INIT:</div><div class='add'>+            if ((fop-&gt;size &lt;= 0) || (fop-&gt;offset &lt; 0)) {</div><div class='add'>+                ec_fop_set_error(fop, EINVAL);</div><div class='add'>+                return EC_STATE_REPORT;</div><div class='add'>+            }</div><div class='add'>+            /* Because of the head/tail writes, "discard" happens on the</div><div class='add'>+             * remaining regions, but we need to compute region including</div><div class='add'>+             * head/tail writes so compute them separately*/</div><div class='add'>+            fl_start = fop-&gt;offset;</div><div class='add'>+            fl_size = fop-&gt;size;</div><div class='add'>+            fl_size += ec_adjust_offset_down(fop-&gt;xl-&gt;private, &amp;fl_start,</div><div class='add'>+                                             _gf_true);</div><div class='add'>+            ec_adjust_size_up(fop-&gt;xl-&gt;private, &amp;fl_size, _gf_true);</div><div class='add'>+</div><div class='add'>+            ec_discard_adjust_offset_size(fop);</div><div class='add'>+</div><div class='add'>+            /* Fall through */</div><div class='add'>+</div><div class='add'>+        case EC_STATE_LOCK:</div><div class='add'>+            ec_lock_prepare_fd(fop, fop-&gt;fd,</div><div class='add'>+                               EC_UPDATE_DATA | EC_UPDATE_META | EC_QUERY_INFO,</div><div class='add'>+                               fl_start, fl_size);</div><div class='add'>+            ec_lock(fop);</div><div class='add'>+</div><div class='add'>+            return EC_STATE_DISPATCH;</div><div class='add'>+</div><div class='add'>+        case EC_STATE_DISPATCH:</div><div class='add'>+</div><div class='add'>+            /* Dispatch discard fop only if we have whole fragment</div><div class='add'>+             * to deallocate */</div><div class='add'>+            if (fop-&gt;size) {</div><div class='add'>+                ec_dispatch_all(fop);</div><div class='add'>+                return EC_STATE_DELAYED_START;</div><div class='add'>+            } else {</div><div class='add'>+                /* Assume discard to have succeeded on all bricks */</div><div class='add'>+                ec_succeed_all(fop);</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            /* Fall through */</div><div class='add'>+</div><div class='add'>+        case EC_STATE_DELAYED_START:</div><div class='add'>+</div><div class='add'>+            if (fop-&gt;size) {</div><div class='add'>+                if (fop-&gt;answer &amp;&amp; fop-&gt;answer-&gt;op_ret == 0)</div><div class='add'>+                    ec_update_discard_write(fop, fop-&gt;answer-&gt;mask);</div><div class='add'>+            } else {</div><div class='add'>+                ec_update_discard_write(fop, fop-&gt;mask);</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            return EC_STATE_PREPARE_ANSWER;</div><div class='add'>+</div><div class='add'>+        case EC_STATE_PREPARE_ANSWER:</div><div class='add'>+            cbk = ec_fop_prepare_answer(fop, _gf_false);</div><div class='add'>+            if (cbk != NULL) {</div><div class='add'>+                ec_iatt_rebuild(fop-&gt;xl-&gt;private, cbk-&gt;iatt, 2, cbk-&gt;count);</div><div class='add'>+</div><div class='add'>+                /* This shouldn't fail because we have the inode locked. */</div><div class='add'>+                GF_ASSERT(ec_get_inode_size(fop, fop-&gt;locks[0].lock-&gt;loc.inode,</div><div class='add'>+                                            &amp;cbk-&gt;iatt[0].ia_size));</div><div class='add'>+</div><div class='add'>+                cbk-&gt;iatt[1].ia_size = cbk-&gt;iatt[0].ia_size;</div><div class='add'>+            }</div><div class='add'>+            return EC_STATE_REPORT;</div><div class='add'>+</div><div class='add'>+        case EC_STATE_REPORT:</div><div class='add'>+            cbk = fop-&gt;answer;</div><div class='add'>+</div><div class='add'>+            GF_ASSERT(cbk != NULL);</div><div class='add'>+</div><div class='add'>+            if (fop-&gt;cbks.discard != NULL) {</div><div class='add'>+                QUORUM_CBK(fop-&gt;cbks.discard, fop, fop-&gt;req_frame, fop, fop-&gt;xl,</div><div class='add'>+                           cbk-&gt;op_ret, cbk-&gt;op_errno, &amp;cbk-&gt;iatt[0],</div><div class='add'>+                           &amp;cbk-&gt;iatt[1], cbk-&gt;xdata);</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            return EC_STATE_LOCK_REUSE;</div><div class='add'>+</div><div class='add'>+        case -EC_STATE_INIT:</div><div class='add'>+        case -EC_STATE_LOCK:</div><div class='add'>+        case -EC_STATE_DISPATCH:</div><div class='add'>+        case -EC_STATE_DELAYED_START:</div><div class='add'>+        case -EC_STATE_PREPARE_ANSWER:</div><div class='add'>+        case -EC_STATE_REPORT:</div><div class='add'>+            GF_ASSERT(fop-&gt;error != 0);</div><div class='add'>+</div><div class='add'>+            if (fop-&gt;cbks.discard != NULL) {</div><div class='add'>+                fop-&gt;cbks.discard(fop-&gt;req_frame, fop, fop-&gt;xl, -1, fop-&gt;error,</div><div class='add'>+                                  NULL, NULL, NULL);</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            return EC_STATE_LOCK_REUSE;</div><div class='add'>+</div><div class='add'>+        case -EC_STATE_LOCK_REUSE:</div><div class='add'>+        case EC_STATE_LOCK_REUSE:</div><div class='add'>+            ec_lock_reuse(fop);</div><div class='add'>+</div><div class='add'>+            return EC_STATE_UNLOCK;</div><div class='add'>+</div><div class='add'>+        case -EC_STATE_UNLOCK:</div><div class='add'>+        case EC_STATE_UNLOCK:</div><div class='add'>+            ec_unlock(fop);</div><div class='add'>+</div><div class='add'>+            return EC_STATE_END;</div><div class='add'>+</div><div class='add'>+        default:</div><div class='add'>+            gf_msg(fop-&gt;xl-&gt;name, GF_LOG_ERROR, EINVAL, EC_MSG_UNHANDLED_STATE,</div><div class='add'>+                   "Unhandled state %d for %s", state, ec_fop_name(fop-&gt;id));</div><div class='add'>+</div><div class='add'>+            return EC_STATE_END;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_discard(call_frame_t *frame, xlator_t *this, uintptr_t target,</div><div class='add'>+           uint32_t fop_flags, fop_discard_cbk_t func, void *data, fd_t *fd,</div><div class='add'>+           off_t offset, size_t len, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    ec_cbk_t callback = {.discard = func};</div><div class='add'>+    ec_fop_data_t *fop = NULL;</div><div class='add'>+    int32_t error = ENOMEM;</div><div class='add'>+</div><div class='add'>+    gf_msg_trace("ec", 0, "EC(DISCARD) %p", frame);</div><div class='add'>+</div><div class='add'>+    VALIDATE_OR_GOTO(this, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, frame, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, this-&gt;private, out);</div><div class='add'>+</div><div class='add'>+    fop = ec_fop_data_allocate(frame, this, GF_FOP_DISCARD, 0, target,</div><div class='add'>+                               fop_flags, ec_wind_discard, ec_manager_discard,</div><div class='add'>+                               callback, data);</div><div class='add'>+    if (fop == NULL) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    fop-&gt;use_fd = 1;</div><div class='add'>+    fop-&gt;offset = offset;</div><div class='add'>+    fop-&gt;size = len;</div><div class='add'>+</div><div class='add'>+    if (fd != NULL) {</div><div class='add'>+        fop-&gt;fd = fd_ref(fd);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (xdata != NULL) {</div><div class='add'>+        fop-&gt;xdata = dict_ref(xdata);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    error = 0;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (fop != NULL) {</div><div class='add'>+        ec_manager(fop, error);</div><div class='add'>+    } else {</div><div class='add'>+        func(frame, NULL, this, -1, error, NULL, NULL, NULL);</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*********************************************************************</div><div class='add'>+ *</div><div class='add'>+ * File Operation : truncate</div><div class='add'>+ *</div><div class='add'>+ *********************************************************************/</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_update_truncate_write(ec_fop_data_t *fop, uintptr_t mask)</div><div class='add'>+{</div><div class='add'>+    ec_t *ec = fop-&gt;xl-&gt;private;</div><div class='add'>+    uint64_t size = fop-&gt;offset * ec-&gt;fragments - fop-&gt;user_size;</div><div class='add'>+    return ec_update_write(fop, mask, fop-&gt;user_size, size);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_truncate_open_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                     int32_t op_ret, int32_t op_errno, fd_t *fd, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    ec_fop_data_t *fop = cookie;</div><div class='add'>+    int32_t err;</div><div class='add'>+</div><div class='add'>+    fop-&gt;parent-&gt;good &amp;= fop-&gt;good;</div><div class='add'>+    if (op_ret &gt;= 0) {</div><div class='add'>+        fd_bind(fd);</div><div class='add'>+        err = ec_update_truncate_write(fop-&gt;parent, fop-&gt;answer-&gt;mask);</div><div class='add'>+        if (err != 0) {</div><div class='add'>+            ec_fop_set_error(fop-&gt;parent, -err);</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_truncate_clean(ec_fop_data_t *fop)</div><div class='add'>+{</div><div class='add'>+    if (fop-&gt;fd == NULL) {</div><div class='add'>+        fop-&gt;fd = fd_create(fop-&gt;loc[0].inode, fop-&gt;frame-&gt;root-&gt;pid);</div><div class='add'>+        if (fop-&gt;fd == NULL) {</div><div class='add'>+            return -ENOMEM;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        ec_open(fop-&gt;frame, fop-&gt;xl, fop-&gt;answer-&gt;mask, fop-&gt;minimum,</div><div class='add'>+                ec_truncate_open_cbk, fop, &amp;fop-&gt;loc[0], O_RDWR, fop-&gt;fd, NULL);</div><div class='add'>+</div><div class='add'>+        return 0;</div><div class='add'>+    } else {</div><div class='add'>+        return ec_update_truncate_write(fop, fop-&gt;answer-&gt;mask);</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_truncate_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                int32_t op_ret, int32_t op_errno, struct iatt *prestat,</div><div class='add'>+                struct iatt *poststat, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    return ec_inode_write_cbk(frame, this, cookie, op_ret, op_errno, prestat,</div><div class='add'>+                              poststat, xdata);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_wind_truncate(ec_t *ec, ec_fop_data_t *fop, int32_t idx)</div><div class='add'>+{</div><div class='add'>+    ec_trace("WIND", fop, "idx=%d", idx);</div><div class='add'>+</div><div class='add'>+    STACK_WIND_COOKIE(fop-&gt;frame, ec_truncate_cbk, (void *)(uintptr_t)idx,</div><div class='add'>+                      ec-&gt;xl_list[idx], ec-&gt;xl_list[idx]-&gt;fops-&gt;truncate,</div><div class='add'>+                      &amp;fop-&gt;loc[0], fop-&gt;offset, fop-&gt;xdata);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_manager_truncate(ec_fop_data_t *fop, int32_t state)</div><div class='add'>+{</div><div class='add'>+    ec_cbk_data_t *cbk;</div><div class='add'>+    off_t offset_down;</div><div class='add'>+</div><div class='add'>+    switch (state) {</div><div class='add'>+        case EC_STATE_INIT:</div><div class='add'>+            fop-&gt;user_size = fop-&gt;offset;</div><div class='add'>+            ec_adjust_offset_up(fop-&gt;xl-&gt;private, &amp;fop-&gt;offset, _gf_true);</div><div class='add'>+            fop-&gt;frag_range.first = fop-&gt;offset;</div><div class='add'>+            fop-&gt;frag_range.last = UINT64_MAX;</div><div class='add'>+</div><div class='add'>+            /* Fall through */</div><div class='add'>+</div><div class='add'>+        case EC_STATE_LOCK:</div><div class='add'>+            offset_down = fop-&gt;user_size;</div><div class='add'>+            ec_adjust_offset_down(fop-&gt;xl-&gt;private, &amp;offset_down, _gf_true);</div><div class='add'>+</div><div class='add'>+            if (fop-&gt;id == GF_FOP_TRUNCATE) {</div><div class='add'>+                ec_lock_prepare_inode(</div><div class='add'>+                    fop, &amp;fop-&gt;loc[0],</div><div class='add'>+                    EC_UPDATE_DATA | EC_UPDATE_META | EC_QUERY_INFO,</div><div class='add'>+                    offset_down, EC_RANGE_FULL);</div><div class='add'>+            } else {</div><div class='add'>+                ec_lock_prepare_fd(</div><div class='add'>+                    fop, fop-&gt;fd,</div><div class='add'>+                    EC_UPDATE_DATA | EC_UPDATE_META | EC_QUERY_INFO,</div><div class='add'>+                    offset_down, EC_RANGE_FULL);</div><div class='add'>+            }</div><div class='add'>+            ec_lock(fop);</div><div class='add'>+</div><div class='add'>+            return EC_STATE_DISPATCH;</div><div class='add'>+</div><div class='add'>+        case EC_STATE_DISPATCH:</div><div class='add'>+            ec_dispatch_all(fop);</div><div class='add'>+</div><div class='add'>+            return EC_STATE_PREPARE_ANSWER;</div><div class='add'>+</div><div class='add'>+        case EC_STATE_PREPARE_ANSWER:</div><div class='add'>+            cbk = ec_fop_prepare_answer(fop, _gf_false);</div><div class='add'>+            if (cbk != NULL) {</div><div class='add'>+                int32_t err;</div><div class='add'>+</div><div class='add'>+                ec_iatt_rebuild(fop-&gt;xl-&gt;private, cbk-&gt;iatt, 2, cbk-&gt;count);</div><div class='add'>+</div><div class='add'>+                /* This shouldn't fail because we have the inode locked. */</div><div class='add'>+                /* Inode size doesn't need to be updated under locks, because</div><div class='add'>+                 * conflicting operations won't be in-flight</div><div class='add'>+                 */</div><div class='add'>+                GF_ASSERT(ec_get_inode_size(fop, fop-&gt;locks[0].lock-&gt;loc.inode,</div><div class='add'>+                                            &amp;cbk-&gt;iatt[0].ia_size));</div><div class='add'>+                cbk-&gt;iatt[1].ia_size = fop-&gt;user_size;</div><div class='add'>+                /* This shouldn't fail because we have the inode locked. */</div><div class='add'>+                GF_ASSERT(ec_set_inode_size(fop, fop-&gt;locks[0].lock-&gt;loc.inode,</div><div class='add'>+                                            fop-&gt;user_size));</div><div class='add'>+                if ((cbk-&gt;iatt[0].ia_size &gt; cbk-&gt;iatt[1].ia_size) &amp;&amp;</div><div class='add'>+                    (fop-&gt;user_size != fop-&gt;offset)) {</div><div class='add'>+                    err = ec_truncate_clean(fop);</div><div class='add'>+                    if (err != 0) {</div><div class='add'>+                        ec_cbk_set_error(cbk, -err, _gf_false);</div><div class='add'>+                    }</div><div class='add'>+                }</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            return EC_STATE_REPORT;</div><div class='add'>+</div><div class='add'>+        case EC_STATE_REPORT:</div><div class='add'>+            cbk = fop-&gt;answer;</div><div class='add'>+</div><div class='add'>+            GF_ASSERT(cbk != NULL);</div><div class='add'>+</div><div class='add'>+            if (fop-&gt;id == GF_FOP_TRUNCATE) {</div><div class='add'>+                if (fop-&gt;cbks.truncate != NULL) {</div><div class='add'>+                    QUORUM_CBK(fop-&gt;cbks.truncate, fop, fop-&gt;req_frame, fop,</div><div class='add'>+                               fop-&gt;xl, cbk-&gt;op_ret, cbk-&gt;op_errno,</div><div class='add'>+                               &amp;cbk-&gt;iatt[0], &amp;cbk-&gt;iatt[1], cbk-&gt;xdata);</div><div class='add'>+                }</div><div class='add'>+            } else {</div><div class='add'>+                if (fop-&gt;cbks.ftruncate != NULL) {</div><div class='add'>+                    QUORUM_CBK(fop-&gt;cbks.ftruncate, fop, fop-&gt;req_frame, fop,</div><div class='add'>+                               fop-&gt;xl, cbk-&gt;op_ret, cbk-&gt;op_errno,</div><div class='add'>+                               &amp;cbk-&gt;iatt[0], &amp;cbk-&gt;iatt[1], cbk-&gt;xdata);</div><div class='add'>+                }</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            return EC_STATE_LOCK_REUSE;</div><div class='add'>+</div><div class='add'>+        case -EC_STATE_INIT:</div><div class='add'>+        case -EC_STATE_LOCK:</div><div class='add'>+        case -EC_STATE_DISPATCH:</div><div class='add'>+        case -EC_STATE_PREPARE_ANSWER:</div><div class='add'>+        case -EC_STATE_REPORT:</div><div class='add'>+            GF_ASSERT(fop-&gt;error != 0);</div><div class='add'>+</div><div class='add'>+            if (fop-&gt;id == GF_FOP_TRUNCATE) {</div><div class='add'>+                if (fop-&gt;cbks.truncate != NULL) {</div><div class='add'>+                    fop-&gt;cbks.truncate(fop-&gt;req_frame, fop, fop-&gt;xl, -1,</div><div class='add'>+                                       fop-&gt;error, NULL, NULL, NULL);</div><div class='add'>+                }</div><div class='add'>+            } else {</div><div class='add'>+                if (fop-&gt;cbks.ftruncate != NULL) {</div><div class='add'>+                    fop-&gt;cbks.ftruncate(fop-&gt;req_frame, fop, fop-&gt;xl, -1,</div><div class='add'>+                                        fop-&gt;error, NULL, NULL, NULL);</div><div class='add'>+                }</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            return EC_STATE_LOCK_REUSE;</div><div class='add'>+</div><div class='add'>+        case -EC_STATE_LOCK_REUSE:</div><div class='add'>+        case EC_STATE_LOCK_REUSE:</div><div class='add'>+            ec_lock_reuse(fop);</div><div class='add'>+</div><div class='add'>+            return EC_STATE_UNLOCK;</div><div class='add'>+</div><div class='add'>+        case -EC_STATE_UNLOCK:</div><div class='add'>+        case EC_STATE_UNLOCK:</div><div class='add'>+            ec_unlock(fop);</div><div class='add'>+</div><div class='add'>+            return EC_STATE_END;</div><div class='add'>+</div><div class='add'>+        default:</div><div class='add'>+            gf_msg(fop-&gt;xl-&gt;name, GF_LOG_ERROR, EINVAL, EC_MSG_UNHANDLED_STATE,</div><div class='add'>+                   "Unhandled state %d for %s", state, ec_fop_name(fop-&gt;id));</div><div class='add'>+</div><div class='add'>+            return EC_STATE_END;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_truncate(call_frame_t *frame, xlator_t *this, uintptr_t target,</div><div class='add'>+            uint32_t fop_flags, fop_truncate_cbk_t func, void *data, loc_t *loc,</div><div class='add'>+            off_t offset, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    ec_cbk_t callback = {.truncate = func};</div><div class='add'>+    ec_fop_data_t *fop = NULL;</div><div class='add'>+    int32_t error = ENOMEM;</div><div class='add'>+</div><div class='add'>+    gf_msg_trace("ec", 0, "EC(TRUNCATE) %p", frame);</div><div class='add'>+</div><div class='add'>+    VALIDATE_OR_GOTO(this, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, frame, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, this-&gt;private, out);</div><div class='add'>+</div><div class='add'>+    fop = ec_fop_data_allocate(frame, this, GF_FOP_TRUNCATE, 0, target,</div><div class='add'>+                               fop_flags, ec_wind_truncate, ec_manager_truncate,</div><div class='add'>+                               callback, data);</div><div class='add'>+    if (fop == NULL) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    fop-&gt;offset = offset;</div><div class='add'>+</div><div class='add'>+    if (loc != NULL) {</div><div class='add'>+        if (loc_copy(&amp;fop-&gt;loc[0], loc) != 0) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, ENOMEM, EC_MSG_LOC_COPY_FAIL,</div><div class='add'>+                   "Failed to copy a location.");</div><div class='add'>+</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    if (xdata != NULL) {</div><div class='add'>+        fop-&gt;xdata = dict_copy_with_ref(xdata, NULL);</div><div class='add'>+        if (fop-&gt;xdata == NULL) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, 0, EC_MSG_DICT_REF_FAIL,</div><div class='add'>+                   "Failed to reference a "</div><div class='add'>+                   "dictionary.");</div><div class='add'>+</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    error = 0;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (fop != NULL) {</div><div class='add'>+        ec_manager(fop, error);</div><div class='add'>+    } else {</div><div class='add'>+        func(frame, NULL, this, -1, error, NULL, NULL, NULL);</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* FOP: ftruncate */</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_ftruncate_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                 int32_t op_ret, int32_t op_errno, struct iatt *prestat,</div><div class='add'>+                 struct iatt *poststat, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    return ec_inode_write_cbk(frame, this, cookie, op_ret, op_errno, prestat,</div><div class='add'>+                              poststat, xdata);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_wind_ftruncate(ec_t *ec, ec_fop_data_t *fop, int32_t idx)</div><div class='add'>+{</div><div class='add'>+    ec_trace("WIND", fop, "idx=%d", idx);</div><div class='add'>+</div><div class='add'>+    STACK_WIND_COOKIE(fop-&gt;frame, ec_ftruncate_cbk, (void *)(uintptr_t)idx,</div><div class='add'>+                      ec-&gt;xl_list[idx], ec-&gt;xl_list[idx]-&gt;fops-&gt;ftruncate,</div><div class='add'>+                      fop-&gt;fd, fop-&gt;offset, fop-&gt;xdata);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_ftruncate(call_frame_t *frame, xlator_t *this, uintptr_t target,</div><div class='add'>+             uint32_t fop_flags, fop_ftruncate_cbk_t func, void *data, fd_t *fd,</div><div class='add'>+             off_t offset, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    ec_cbk_t callback = {.ftruncate = func};</div><div class='add'>+    ec_fop_data_t *fop = NULL;</div><div class='add'>+    int32_t error = ENOMEM;</div><div class='add'>+</div><div class='add'>+    gf_msg_trace("ec", 0, "EC(FTRUNCATE) %p", frame);</div><div class='add'>+</div><div class='add'>+    VALIDATE_OR_GOTO(this, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, frame, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, this-&gt;private, out);</div><div class='add'>+</div><div class='add'>+    fop = ec_fop_data_allocate(frame, this, GF_FOP_FTRUNCATE, 0, target,</div><div class='add'>+                               fop_flags, ec_wind_ftruncate,</div><div class='add'>+                               ec_manager_truncate, callback, data);</div><div class='add'>+    if (fop == NULL) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    fop-&gt;use_fd = 1;</div><div class='add'>+</div><div class='add'>+    fop-&gt;offset = offset;</div><div class='add'>+</div><div class='add'>+    if (fd != NULL) {</div><div class='add'>+        fop-&gt;fd = fd_ref(fd);</div><div class='add'>+        if (fop-&gt;fd == NULL) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, 0, EC_MSG_FILE_DESC_REF_FAIL,</div><div class='add'>+                   "Failed to reference a "</div><div class='add'>+                   "file descriptor.");</div><div class='add'>+</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    if (xdata != NULL) {</div><div class='add'>+        fop-&gt;xdata = dict_copy_with_ref(xdata, NULL);</div><div class='add'>+        if (fop-&gt;xdata == NULL) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, 0, EC_MSG_DICT_REF_FAIL,</div><div class='add'>+                   "Failed to reference a "</div><div class='add'>+                   "dictionary.");</div><div class='add'>+</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    error = 0;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (fop != NULL) {</div><div class='add'>+        ec_manager(fop, error);</div><div class='add'>+    } else {</div><div class='add'>+        func(frame, NULL, this, -1, error, NULL, NULL, NULL);</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* FOP: writev */</div><div class='add'>+static ec_stripe_t *</div><div class='add'>+ec_allocate_stripe(ec_t *ec, ec_stripe_list_t *stripe_cache)</div><div class='add'>+{</div><div class='add'>+    ec_stripe_t *stripe = NULL;</div><div class='add'>+</div><div class='add'>+    if (stripe_cache-&gt;count &gt;= stripe_cache-&gt;max) {</div><div class='add'>+        GF_ASSERT(!list_empty(&amp;stripe_cache-&gt;lru));</div><div class='add'>+        stripe = list_first_entry(&amp;stripe_cache-&gt;lru, ec_stripe_t, lru);</div><div class='add'>+        list_move_tail(&amp;stripe-&gt;lru, &amp;stripe_cache-&gt;lru);</div><div class='add'>+        GF_ATOMIC_INC(ec-&gt;stats.stripe_cache.evicts);</div><div class='add'>+    } else {</div><div class='add'>+        stripe = GF_MALLOC(sizeof(ec_stripe_t) + ec-&gt;stripe_size,</div><div class='add'>+                           ec_mt_ec_stripe_t);</div><div class='add'>+        if (stripe != NULL) {</div><div class='add'>+            stripe_cache-&gt;count++;</div><div class='add'>+            list_add_tail(&amp;stripe-&gt;lru, &amp;stripe_cache-&gt;lru);</div><div class='add'>+            GF_ATOMIC_INC(ec-&gt;stats.stripe_cache.allocs);</div><div class='add'>+        } else {</div><div class='add'>+            GF_ATOMIC_INC(ec-&gt;stats.stripe_cache.errors);</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return stripe;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+ec_write_stripe_data(ec_t *ec, ec_fop_data_t *fop, ec_stripe_t *stripe)</div><div class='add'>+{</div><div class='add'>+    off_t base;</div><div class='add'>+</div><div class='add'>+    base = fop-&gt;size - ec-&gt;stripe_size;</div><div class='add'>+    memcpy(stripe-&gt;data, fop-&gt;vector[0].iov_base + base, ec-&gt;stripe_size);</div><div class='add'>+    stripe-&gt;frag_offset = fop-&gt;frag_range.last - ec-&gt;fragment_size;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+ec_add_stripe_in_cache(ec_t *ec, ec_fop_data_t *fop)</div><div class='add'>+{</div><div class='add'>+    ec_inode_t *ctx = NULL;</div><div class='add'>+    ec_stripe_t *stripe = NULL;</div><div class='add'>+    ec_stripe_list_t *stripe_cache = NULL;</div><div class='add'>+    gf_boolean_t failed = _gf_true;</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;fop-&gt;fd-&gt;inode-&gt;lock);</div><div class='add'>+</div><div class='add'>+    ctx = __ec_inode_get(fop-&gt;fd-&gt;inode, fop-&gt;xl);</div><div class='add'>+    if (ctx == NULL) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    stripe_cache = &amp;ctx-&gt;stripe_cache;</div><div class='add'>+    if (stripe_cache-&gt;max &gt; 0) {</div><div class='add'>+        stripe = ec_allocate_stripe(ec, stripe_cache);</div><div class='add'>+        if (stripe == NULL) {</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        ec_write_stripe_data(ec, fop, stripe);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    failed = _gf_false;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    UNLOCK(&amp;fop-&gt;fd-&gt;inode-&gt;lock);</div><div class='add'>+</div><div class='add'>+    if (failed) {</div><div class='add'>+        gf_msg(ec-&gt;xl-&gt;name, GF_LOG_DEBUG, ENOMEM, EC_MSG_FILE_DESC_REF_FAIL,</div><div class='add'>+               "Failed to create and add stripe in cache");</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_writev_merge_tail(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                     int32_t op_ret, int32_t op_errno, struct iovec *vector,</div><div class='add'>+                     int32_t count, struct iatt *stbuf, struct iobref *iobref,</div><div class='add'>+                     dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    ec_t *ec = this-&gt;private;</div><div class='add'>+    ec_fop_data_t *fop = frame-&gt;local;</div><div class='add'>+    uint64_t size, base, tmp;</div><div class='add'>+</div><div class='add'>+    if (op_ret &gt;= 0) {</div><div class='add'>+        tmp = 0;</div><div class='add'>+        size = fop-&gt;size - fop-&gt;user_size - fop-&gt;head;</div><div class='add'>+        base = ec-&gt;stripe_size - size;</div><div class='add'>+        if (op_ret &gt; base) {</div><div class='add'>+            tmp = min(op_ret - base, size);</div><div class='add'>+            ec_iov_copy_to(fop-&gt;vector[0].iov_base + fop-&gt;size - size, vector,</div><div class='add'>+                           count, base, tmp);</div><div class='add'>+</div><div class='add'>+            size -= tmp;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        if (size &gt; 0) {</div><div class='add'>+            memset(fop-&gt;vector[0].iov_base + fop-&gt;size - size, 0, size);</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        if (ec-&gt;stripe_cache) {</div><div class='add'>+            ec_add_stripe_in_cache(ec, fop);</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_writev_merge_head(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                     int32_t op_ret, int32_t op_errno, struct iovec *vector,</div><div class='add'>+                     int32_t count, struct iatt *stbuf, struct iobref *iobref,</div><div class='add'>+                     dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    ec_t *ec = this-&gt;private;</div><div class='add'>+    ec_fop_data_t *fop = frame-&gt;local;</div><div class='add'>+    uint64_t size, base;</div><div class='add'>+</div><div class='add'>+    if (op_ret &gt;= 0) {</div><div class='add'>+        size = fop-&gt;head;</div><div class='add'>+        base = 0;</div><div class='add'>+</div><div class='add'>+        if (op_ret &gt; 0) {</div><div class='add'>+            base = min(op_ret, size);</div><div class='add'>+            ec_iov_copy_to(fop-&gt;vector[0].iov_base, vector, count, 0, base);</div><div class='add'>+</div><div class='add'>+            size -= base;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        if (size &gt; 0) {</div><div class='add'>+            memset(fop-&gt;vector[0].iov_base + base, 0, size);</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        size = fop-&gt;size - fop-&gt;user_size - fop-&gt;head;</div><div class='add'>+        if ((size &gt; 0) &amp;&amp; (fop-&gt;size == ec-&gt;stripe_size)) {</div><div class='add'>+            ec_writev_merge_tail(frame, cookie, this, op_ret, op_errno, vector,</div><div class='add'>+                                 count, stbuf, iobref, xdata);</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+ec_make_internal_fop_xdata(dict_t **xdata)</div><div class='add'>+{</div><div class='add'>+    dict_t *dict = NULL;</div><div class='add'>+</div><div class='add'>+    if (*xdata)</div><div class='add'>+        return 0;</div><div class='add'>+</div><div class='add'>+    dict = dict_new();</div><div class='add'>+    if (!dict)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    if (dict_set_str(dict, GLUSTERFS_INTERNAL_FOP_KEY, "yes"))</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    *xdata = dict;</div><div class='add'>+    return 0;</div><div class='add'>+out:</div><div class='add'>+    if (dict)</div><div class='add'>+        dict_unref(dict);</div><div class='add'>+    return -1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int32_t</div><div class='add'>+ec_writev_prepare_buffers(ec_t *ec, ec_fop_data_t *fop)</div><div class='add'>+{</div><div class='add'>+    struct iobref *iobref = NULL;</div><div class='add'>+    struct iovec *iov;</div><div class='add'>+    void *ptr;</div><div class='add'>+    int32_t err;</div><div class='add'>+</div><div class='add'>+    fop-&gt;user_size = iov_length(fop-&gt;vector, fop-&gt;int32);</div><div class='add'>+    fop-&gt;head = ec_adjust_offset_down(ec, &amp;fop-&gt;offset, _gf_false);</div><div class='add'>+    fop-&gt;frag_range.first = fop-&gt;offset / ec-&gt;fragments;</div><div class='add'>+    fop-&gt;size = fop-&gt;user_size + fop-&gt;head;</div><div class='add'>+    ec_adjust_size_up(ec, &amp;fop-&gt;size, _gf_false);</div><div class='add'>+    fop-&gt;frag_range.last = fop-&gt;frag_range.first + fop-&gt;size / ec-&gt;fragments;</div><div class='add'>+</div><div class='add'>+    if ((fop-&gt;int32 != 1) || (fop-&gt;head != 0) || (fop-&gt;size &gt; fop-&gt;user_size) ||</div><div class='add'>+        !EC_ALIGN_CHECK(fop-&gt;vector[0].iov_base, EC_METHOD_WORD_SIZE)) {</div><div class='add'>+        err = ec_buffer_alloc(ec-&gt;xl, fop-&gt;size, &amp;iobref, &amp;ptr);</div><div class='add'>+        if (err != 0) {</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        ec_iov_copy_to(ptr + fop-&gt;head, fop-&gt;vector, fop-&gt;int32, 0,</div><div class='add'>+                       fop-&gt;user_size);</div><div class='add'>+</div><div class='add'>+        fop-&gt;vector[0].iov_base = ptr;</div><div class='add'>+        fop-&gt;vector[0].iov_len = fop-&gt;size;</div><div class='add'>+</div><div class='add'>+        iobref_unref(fop-&gt;buffers);</div><div class='add'>+        fop-&gt;buffers = iobref;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (fop-&gt;int32 != 2) {</div><div class='add'>+        iov = GF_MALLOC(VECTORSIZE(2), gf_common_mt_iovec);</div><div class='add'>+        if (iov == NULL) {</div><div class='add'>+            err = -ENOMEM;</div><div class='add'>+</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+        iov[0].iov_base = fop-&gt;vector[0].iov_base;</div><div class='add'>+        iov[0].iov_len = fop-&gt;vector[0].iov_len;</div><div class='add'>+</div><div class='add'>+        GF_FREE(fop-&gt;vector);</div><div class='add'>+        fop-&gt;vector = iov;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    fop-&gt;vector[1].iov_len = fop-&gt;size / ec-&gt;fragments;</div><div class='add'>+    err = ec_buffer_alloc(ec-&gt;xl, fop-&gt;vector[1].iov_len * ec-&gt;nodes,</div><div class='add'>+                          &amp;fop-&gt;buffers, &amp;fop-&gt;vector[1].iov_base);</div><div class='add'>+    if (err != 0) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    err = 0;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return err;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+ec_merge_stripe_head_locked(ec_t *ec, ec_fop_data_t *fop, ec_stripe_t *stripe)</div><div class='add'>+{</div><div class='add'>+    uint32_t head, size;</div><div class='add'>+</div><div class='add'>+    head = fop-&gt;head;</div><div class='add'>+    memcpy(fop-&gt;vector[0].iov_base, stripe-&gt;data, head);</div><div class='add'>+</div><div class='add'>+    size = ec-&gt;stripe_size - head;</div><div class='add'>+    if (size &gt; fop-&gt;user_size) {</div><div class='add'>+        head += fop-&gt;user_size;</div><div class='add'>+        size = ec-&gt;stripe_size - head;</div><div class='add'>+        memcpy(fop-&gt;vector[0].iov_base + head, stripe-&gt;data + head, size);</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+ec_merge_stripe_tail_locked(ec_t *ec, ec_fop_data_t *fop, ec_stripe_t *stripe)</div><div class='add'>+{</div><div class='add'>+    uint32_t head, tail;</div><div class='add'>+    off_t offset;</div><div class='add'>+</div><div class='add'>+    offset = fop-&gt;user_size + fop-&gt;head;</div><div class='add'>+    tail = fop-&gt;size - offset;</div><div class='add'>+    head = ec-&gt;stripe_size - tail;</div><div class='add'>+</div><div class='add'>+    memcpy(fop-&gt;vector[0].iov_base + offset, stripe-&gt;data + head, tail);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static ec_stripe_t *</div><div class='add'>+ec_get_stripe_from_cache_locked(ec_t *ec, ec_fop_data_t *fop,</div><div class='add'>+                                uint64_t frag_offset)</div><div class='add'>+{</div><div class='add'>+    ec_inode_t *ctx = NULL;</div><div class='add'>+    ec_stripe_t *stripe = NULL;</div><div class='add'>+    ec_stripe_list_t *stripe_cache = NULL;</div><div class='add'>+</div><div class='add'>+    ctx = __ec_inode_get(fop-&gt;fd-&gt;inode, fop-&gt;xl);</div><div class='add'>+    if (ctx == NULL) {</div><div class='add'>+        GF_ATOMIC_INC(ec-&gt;stats.stripe_cache.errors);</div><div class='add'>+        return NULL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    stripe_cache = &amp;ctx-&gt;stripe_cache;</div><div class='add'>+    list_for_each_entry(stripe, &amp;stripe_cache-&gt;lru, lru)</div><div class='add'>+    {</div><div class='add'>+        if (stripe-&gt;frag_offset == frag_offset) {</div><div class='add'>+            list_move_tail(&amp;stripe-&gt;lru, &amp;stripe_cache-&gt;lru);</div><div class='add'>+            GF_ATOMIC_INC(ec-&gt;stats.stripe_cache.hits);</div><div class='add'>+            return stripe;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    GF_ATOMIC_INC(ec-&gt;stats.stripe_cache.misses);</div><div class='add'>+</div><div class='add'>+    return NULL;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static gf_boolean_t</div><div class='add'>+ec_get_and_merge_stripe(ec_t *ec, ec_fop_data_t *fop, ec_stripe_part_t which)</div><div class='add'>+{</div><div class='add'>+    uint64_t frag_offset;</div><div class='add'>+    ec_stripe_t *stripe = NULL;</div><div class='add'>+    gf_boolean_t found = _gf_false;</div><div class='add'>+</div><div class='add'>+    if (!ec-&gt;stripe_cache) {</div><div class='add'>+        return found;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;fop-&gt;fd-&gt;inode-&gt;lock);</div><div class='add'>+    if (which == EC_STRIPE_HEAD) {</div><div class='add'>+        frag_offset = fop-&gt;frag_range.first;</div><div class='add'>+        stripe = ec_get_stripe_from_cache_locked(ec, fop, frag_offset);</div><div class='add'>+        if (stripe) {</div><div class='add'>+            ec_merge_stripe_head_locked(ec, fop, stripe);</div><div class='add'>+            found = _gf_true;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (which == EC_STRIPE_TAIL) {</div><div class='add'>+        frag_offset = fop-&gt;frag_range.last - ec-&gt;fragment_size;</div><div class='add'>+        stripe = ec_get_stripe_from_cache_locked(ec, fop, frag_offset);</div><div class='add'>+        if (stripe) {</div><div class='add'>+            ec_merge_stripe_tail_locked(ec, fop, stripe);</div><div class='add'>+            found = _gf_true;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    UNLOCK(&amp;fop-&gt;fd-&gt;inode-&gt;lock);</div><div class='add'>+</div><div class='add'>+    return found;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static uintptr_t</div><div class='add'>+ec_get_lock_good_mask(inode_t *inode, xlator_t *xl)</div><div class='add'>+{</div><div class='add'>+    ec_lock_t *lock = NULL;</div><div class='add'>+    ec_inode_t *ictx = NULL;</div><div class='add'>+    LOCK(&amp;inode-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        ictx = __ec_inode_get(inode, xl);</div><div class='add'>+        if (ictx)</div><div class='add'>+            lock = ictx-&gt;inode_lock;</div><div class='add'>+    }</div><div class='add'>+    UNLOCK(&amp;inode-&gt;lock);</div><div class='add'>+    if (lock)</div><div class='add'>+        return lock-&gt;good_mask;</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_writev_start(ec_fop_data_t *fop)</div><div class='add'>+{</div><div class='add'>+    ec_t *ec = fop-&gt;xl-&gt;private;</div><div class='add'>+    ec_fd_t *ctx;</div><div class='add'>+    fd_t *fd;</div><div class='add'>+    dict_t *xdata = NULL;</div><div class='add'>+    uint64_t tail, current;</div><div class='add'>+    int32_t err = -ENOMEM;</div><div class='add'>+    gf_boolean_t found_stripe = _gf_false;</div><div class='add'>+</div><div class='add'>+    /* This shouldn't fail because we have the inode locked. */</div><div class='add'>+    GF_ASSERT(ec_get_inode_size(fop, fop-&gt;fd-&gt;inode, &amp;current));</div><div class='add'>+</div><div class='add'>+    fd = fd_anonymous(fop-&gt;fd-&gt;inode);</div><div class='add'>+    if (fd == NULL) {</div><div class='add'>+        goto failed;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    fop-&gt;frame-&gt;root-&gt;uid = 0;</div><div class='add'>+    fop-&gt;frame-&gt;root-&gt;gid = 0;</div><div class='add'>+</div><div class='add'>+    ctx = ec_fd_get(fop-&gt;fd, fop-&gt;xl);</div><div class='add'>+    if (ctx != NULL) {</div><div class='add'>+        if ((ctx-&gt;flags &amp; O_APPEND) != 0) {</div><div class='add'>+            /* Appending writes take full locks so size won't change because</div><div class='add'>+             * of any parallel operations</div><div class='add'>+             */</div><div class='add'>+            fop-&gt;offset = current;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    err = ec_writev_prepare_buffers(ec, fop);</div><div class='add'>+    if (err != 0) {</div><div class='add'>+        goto failed_fd;</div><div class='add'>+    }</div><div class='add'>+    tail = fop-&gt;size - fop-&gt;user_size - fop-&gt;head;</div><div class='add'>+    if (fop-&gt;head &gt; 0) {</div><div class='add'>+        if (current &gt; fop-&gt;offset) {</div><div class='add'>+            found_stripe = ec_get_and_merge_stripe(ec, fop, EC_STRIPE_HEAD);</div><div class='add'>+            if (!found_stripe) {</div><div class='add'>+                if (ec_make_internal_fop_xdata(&amp;xdata)) {</div><div class='add'>+                    err = -ENOMEM;</div><div class='add'>+                    goto failed_xdata;</div><div class='add'>+                }</div><div class='add'>+                ec_readv(fop-&gt;frame, fop-&gt;xl,</div><div class='add'>+                         ec_get_lock_good_mask(fop-&gt;fd-&gt;inode, fop-&gt;xl),</div><div class='add'>+                         EC_MINIMUM_MIN, ec_writev_merge_head, NULL, fd,</div><div class='add'>+                         ec-&gt;stripe_size, fop-&gt;offset, 0, xdata);</div><div class='add'>+            }</div><div class='add'>+        } else {</div><div class='add'>+            memset(fop-&gt;vector[0].iov_base, 0, fop-&gt;head);</div><div class='add'>+            memset(fop-&gt;vector[0].iov_base + fop-&gt;size - tail, 0, tail);</div><div class='add'>+            if (ec-&gt;stripe_cache &amp;&amp; (fop-&gt;size &lt;= ec-&gt;stripe_size)) {</div><div class='add'>+                ec_add_stripe_in_cache(ec, fop);</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if ((tail &gt; 0) &amp;&amp; ((fop-&gt;head == 0) || (fop-&gt;size &gt; ec-&gt;stripe_size))) {</div><div class='add'>+        /* Current locking scheme will make sure the 'current' below will</div><div class='add'>+         * never decrease while the fop is in progress, so the checks will</div><div class='add'>+         * work as expected</div><div class='add'>+         */</div><div class='add'>+        if (current &gt; fop-&gt;offset + fop-&gt;head + fop-&gt;user_size) {</div><div class='add'>+            found_stripe = ec_get_and_merge_stripe(ec, fop, EC_STRIPE_TAIL);</div><div class='add'>+            if (!found_stripe) {</div><div class='add'>+                if (ec_make_internal_fop_xdata(&amp;xdata)) {</div><div class='add'>+                    err = -ENOMEM;</div><div class='add'>+                    goto failed_xdata;</div><div class='add'>+                }</div><div class='add'>+                ec_readv(fop-&gt;frame, fop-&gt;xl,</div><div class='add'>+                         ec_get_lock_good_mask(fop-&gt;fd-&gt;inode, fop-&gt;xl),</div><div class='add'>+                         EC_MINIMUM_MIN, ec_writev_merge_tail, NULL, fd,</div><div class='add'>+                         ec-&gt;stripe_size,</div><div class='add'>+                         fop-&gt;offset + fop-&gt;size - ec-&gt;stripe_size, 0, xdata);</div><div class='add'>+            }</div><div class='add'>+        } else {</div><div class='add'>+            memset(fop-&gt;vector[0].iov_base + fop-&gt;size - tail, 0, tail);</div><div class='add'>+            if (ec-&gt;stripe_cache) {</div><div class='add'>+                ec_add_stripe_in_cache(ec, fop);</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    err = 0;</div><div class='add'>+</div><div class='add'>+failed_xdata:</div><div class='add'>+    if (xdata) {</div><div class='add'>+        dict_unref(xdata);</div><div class='add'>+    }</div><div class='add'>+failed_fd:</div><div class='add'>+    fd_unref(fd);</div><div class='add'>+failed:</div><div class='add'>+    ec_fop_set_error(fop, -err);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_writev_cbk(call_frame_t *frame, void *cookie, xlator_t *this, int32_t op_ret,</div><div class='add'>+              int32_t op_errno, struct iatt *prestat, struct iatt *poststat,</div><div class='add'>+              dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    ec_t *ec = NULL;</div><div class='add'>+    if (this &amp;&amp; this-&gt;private) {</div><div class='add'>+        ec = this-&gt;private;</div><div class='add'>+        if ((op_ret &gt; 0) &amp;&amp; ((op_ret % ec-&gt;fragment_size) != 0)) {</div><div class='add'>+            op_ret = -1;</div><div class='add'>+            op_errno = EIO;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    return ec_inode_write_cbk(frame, this, cookie, op_ret, op_errno, prestat,</div><div class='add'>+                              poststat, xdata);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_wind_writev(ec_t *ec, ec_fop_data_t *fop, int32_t idx)</div><div class='add'>+{</div><div class='add'>+    ec_trace("WIND", fop, "idx=%d", idx);</div><div class='add'>+</div><div class='add'>+    struct iovec vector[1];</div><div class='add'>+    size_t size;</div><div class='add'>+</div><div class='add'>+    size = fop-&gt;vector[1].iov_len;</div><div class='add'>+</div><div class='add'>+    vector[0].iov_base = fop-&gt;vector[1].iov_base + idx * size;</div><div class='add'>+    vector[0].iov_len = size;</div><div class='add'>+</div><div class='add'>+    STACK_WIND_COOKIE(fop-&gt;frame, ec_writev_cbk, (void *)(uintptr_t)idx,</div><div class='add'>+                      ec-&gt;xl_list[idx], ec-&gt;xl_list[idx]-&gt;fops-&gt;writev, fop-&gt;fd,</div><div class='add'>+                      vector, 1, fop-&gt;offset / ec-&gt;fragments, fop-&gt;uint32,</div><div class='add'>+                      fop-&gt;buffers, fop-&gt;xdata);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+ec_writev_encode(ec_fop_data_t *fop)</div><div class='add'>+{</div><div class='add'>+    ec_t *ec = fop-&gt;xl-&gt;private;</div><div class='add'>+    void *blocks[ec-&gt;nodes];</div><div class='add'>+    uint32_t i;</div><div class='add'>+</div><div class='add'>+    blocks[0] = fop-&gt;vector[1].iov_base;</div><div class='add'>+    for (i = 1; i &lt; ec-&gt;nodes; i++) {</div><div class='add'>+        blocks[i] = blocks[i - 1] + fop-&gt;vector[1].iov_len;</div><div class='add'>+    }</div><div class='add'>+    ec_method_encode(&amp;ec-&gt;matrix, fop-&gt;vector[0].iov_len,</div><div class='add'>+                     fop-&gt;vector[0].iov_base, blocks);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_manager_writev(ec_fop_data_t *fop, int32_t state)</div><div class='add'>+{</div><div class='add'>+    ec_cbk_data_t *cbk;</div><div class='add'>+    ec_fd_t *ctx = NULL;</div><div class='add'>+    ec_t *ec = fop-&gt;xl-&gt;private;</div><div class='add'>+    off_t fl_start = 0;</div><div class='add'>+    uint64_t fl_size = LONG_MAX;</div><div class='add'>+</div><div class='add'>+    switch (state) {</div><div class='add'>+        case EC_STATE_INIT:</div><div class='add'>+        case EC_STATE_LOCK:</div><div class='add'>+            ctx = ec_fd_get(fop-&gt;fd, fop-&gt;xl);</div><div class='add'>+            if (ctx != NULL) {</div><div class='add'>+                if ((ctx-&gt;flags &amp; O_APPEND) == 0) {</div><div class='add'>+                    off_t user_size = 0;</div><div class='add'>+                    off_t head = 0;</div><div class='add'>+</div><div class='add'>+                    fl_start = fop-&gt;offset;</div><div class='add'>+                    user_size = iov_length(fop-&gt;vector, fop-&gt;int32);</div><div class='add'>+                    head = ec_adjust_offset_down(ec, &amp;fl_start, _gf_true);</div><div class='add'>+                    fl_size = user_size + head;</div><div class='add'>+                    ec_adjust_size_up(ec, &amp;fl_size, _gf_true);</div><div class='add'>+                }</div><div class='add'>+            }</div><div class='add'>+            ec_lock_prepare_fd(fop, fop-&gt;fd,</div><div class='add'>+                               EC_UPDATE_DATA | EC_UPDATE_META | EC_QUERY_INFO,</div><div class='add'>+                               fl_start, fl_size);</div><div class='add'>+            ec_lock(fop);</div><div class='add'>+</div><div class='add'>+            return EC_STATE_DISPATCH;</div><div class='add'>+</div><div class='add'>+        case EC_STATE_DISPATCH:</div><div class='add'>+            ec_writev_start(fop);</div><div class='add'>+</div><div class='add'>+            return EC_STATE_DELAYED_START;</div><div class='add'>+</div><div class='add'>+        case EC_STATE_DELAYED_START:</div><div class='add'>+            /* Restore uid, gid if they were changed to do some partial</div><div class='add'>+             * reads. */</div><div class='add'>+            fop-&gt;frame-&gt;root-&gt;uid = fop-&gt;uid;</div><div class='add'>+            fop-&gt;frame-&gt;root-&gt;gid = fop-&gt;gid;</div><div class='add'>+</div><div class='add'>+            ec_writev_encode(fop);</div><div class='add'>+</div><div class='add'>+            ec_dispatch_all(fop);</div><div class='add'>+</div><div class='add'>+            return EC_STATE_PREPARE_ANSWER;</div><div class='add'>+</div><div class='add'>+        case EC_STATE_PREPARE_ANSWER:</div><div class='add'>+            cbk = ec_fop_prepare_answer(fop, _gf_false);</div><div class='add'>+            if (cbk != NULL) {</div><div class='add'>+                ec_t *ec = fop-&gt;xl-&gt;private;</div><div class='add'>+                uint64_t size;</div><div class='add'>+</div><div class='add'>+                ec_iatt_rebuild(fop-&gt;xl-&gt;private, cbk-&gt;iatt, 2, cbk-&gt;count);</div><div class='add'>+</div><div class='add'>+                /* This shouldn't fail because we have the inode locked. */</div><div class='add'>+                LOCK(&amp;fop-&gt;fd-&gt;inode-&gt;lock);</div><div class='add'>+                {</div><div class='add'>+                    GF_ASSERT(__ec_get_inode_size(fop, fop-&gt;fd-&gt;inode,</div><div class='add'>+                                                  &amp;cbk-&gt;iatt[0].ia_size));</div><div class='add'>+                    cbk-&gt;iatt[1].ia_size = cbk-&gt;iatt[0].ia_size;</div><div class='add'>+                    size = fop-&gt;offset + fop-&gt;head + fop-&gt;user_size;</div><div class='add'>+                    if (size &gt; cbk-&gt;iatt[0].ia_size) {</div><div class='add'>+                        /* Only update inode size if this is a top level fop.</div><div class='add'>+                         * Otherwise this is an internal write and the top</div><div class='add'>+                         * level fop should take care of the real inode size.</div><div class='add'>+                         */</div><div class='add'>+                        if (fop-&gt;parent == NULL) {</div><div class='add'>+                            /* This shouldn't fail because we have the inode</div><div class='add'>+                             * locked. */</div><div class='add'>+                            GF_ASSERT(</div><div class='add'>+                                __ec_set_inode_size(fop, fop-&gt;fd-&gt;inode, size));</div><div class='add'>+                        }</div><div class='add'>+                        cbk-&gt;iatt[1].ia_size = size;</div><div class='add'>+                    }</div><div class='add'>+                }</div><div class='add'>+                UNLOCK(&amp;fop-&gt;fd-&gt;inode-&gt;lock);</div><div class='add'>+</div><div class='add'>+                if (fop-&gt;error == 0) {</div><div class='add'>+                    cbk-&gt;op_ret *= ec-&gt;fragments;</div><div class='add'>+                    if (cbk-&gt;op_ret &lt; fop-&gt;head) {</div><div class='add'>+                        cbk-&gt;op_ret = 0;</div><div class='add'>+                    } else {</div><div class='add'>+                        cbk-&gt;op_ret -= fop-&gt;head;</div><div class='add'>+                    }</div><div class='add'>+                    if (cbk-&gt;op_ret &gt; fop-&gt;user_size) {</div><div class='add'>+                        cbk-&gt;op_ret = fop-&gt;user_size;</div><div class='add'>+                    }</div><div class='add'>+                }</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            return EC_STATE_REPORT;</div><div class='add'>+</div><div class='add'>+        case EC_STATE_REPORT:</div><div class='add'>+            cbk = fop-&gt;answer;</div><div class='add'>+</div><div class='add'>+            GF_ASSERT(cbk != NULL);</div><div class='add'>+</div><div class='add'>+            if (fop-&gt;cbks.writev != NULL) {</div><div class='add'>+                QUORUM_CBK(fop-&gt;cbks.writev, fop, fop-&gt;req_frame, fop, fop-&gt;xl,</div><div class='add'>+                           cbk-&gt;op_ret, cbk-&gt;op_errno, &amp;cbk-&gt;iatt[0],</div><div class='add'>+                           &amp;cbk-&gt;iatt[1], cbk-&gt;xdata);</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            return EC_STATE_LOCK_REUSE;</div><div class='add'>+</div><div class='add'>+        case -EC_STATE_DELAYED_START:</div><div class='add'>+            /* We have failed while doing partial reads. We need to restore</div><div class='add'>+             * original uid, gid. */</div><div class='add'>+            fop-&gt;frame-&gt;root-&gt;uid = fop-&gt;uid;</div><div class='add'>+            fop-&gt;frame-&gt;root-&gt;gid = fop-&gt;gid;</div><div class='add'>+</div><div class='add'>+            /* Fall through */</div><div class='add'>+</div><div class='add'>+        case -EC_STATE_INIT:</div><div class='add'>+        case -EC_STATE_LOCK:</div><div class='add'>+        case -EC_STATE_DISPATCH:</div><div class='add'>+        case -EC_STATE_PREPARE_ANSWER:</div><div class='add'>+        case -EC_STATE_REPORT:</div><div class='add'>+            GF_ASSERT(fop-&gt;error != 0);</div><div class='add'>+</div><div class='add'>+            if (fop-&gt;cbks.writev != NULL) {</div><div class='add'>+                fop-&gt;cbks.writev(fop-&gt;req_frame, fop, fop-&gt;xl, -1, fop-&gt;error,</div><div class='add'>+                                 NULL, NULL, NULL);</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            return EC_STATE_LOCK_REUSE;</div><div class='add'>+</div><div class='add'>+        case -EC_STATE_LOCK_REUSE:</div><div class='add'>+        case EC_STATE_LOCK_REUSE:</div><div class='add'>+            ec_lock_reuse(fop);</div><div class='add'>+</div><div class='add'>+            return EC_STATE_UNLOCK;</div><div class='add'>+</div><div class='add'>+        case -EC_STATE_UNLOCK:</div><div class='add'>+        case EC_STATE_UNLOCK:</div><div class='add'>+            ec_unlock(fop);</div><div class='add'>+</div><div class='add'>+            return EC_STATE_END;</div><div class='add'>+</div><div class='add'>+        default:</div><div class='add'>+            gf_msg(fop-&gt;xl-&gt;name, GF_LOG_ERROR, EINVAL, EC_MSG_UNHANDLED_STATE,</div><div class='add'>+                   "Unhandled state %d for %s", state, ec_fop_name(fop-&gt;id));</div><div class='add'>+</div><div class='add'>+            return EC_STATE_END;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_writev(call_frame_t *frame, xlator_t *this, uintptr_t target,</div><div class='add'>+          uint32_t fop_flags, fop_writev_cbk_t func, void *data, fd_t *fd,</div><div class='add'>+          struct iovec *vector, int32_t count, off_t offset, uint32_t flags,</div><div class='add'>+          struct iobref *iobref, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    ec_cbk_t callback = {.writev = func};</div><div class='add'>+    ec_fop_data_t *fop = NULL;</div><div class='add'>+    int32_t error = ENOMEM;</div><div class='add'>+</div><div class='add'>+    gf_msg_trace("ec", 0, "EC(WRITE) %p", frame);</div><div class='add'>+</div><div class='add'>+    VALIDATE_OR_GOTO(this, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, frame, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, this-&gt;private, out);</div><div class='add'>+</div><div class='add'>+    fop = ec_fop_data_allocate(frame, this, GF_FOP_WRITE, 0, target, fop_flags,</div><div class='add'>+                               ec_wind_writev, ec_manager_writev, callback,</div><div class='add'>+                               data);</div><div class='add'>+    if (fop == NULL) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    fop-&gt;int32 = count;</div><div class='add'>+    fop-&gt;offset = offset;</div><div class='add'>+    fop-&gt;uint32 = flags;</div><div class='add'>+</div><div class='add'>+    fop-&gt;use_fd = 1;</div><div class='add'>+</div><div class='add'>+    if (fd != NULL) {</div><div class='add'>+        fop-&gt;fd = fd_ref(fd);</div><div class='add'>+        if (fop-&gt;fd == NULL) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, 0, EC_MSG_FILE_DESC_REF_FAIL,</div><div class='add'>+                   "Failed to reference a "</div><div class='add'>+                   "file descriptor.");</div><div class='add'>+</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    if (count &gt; 0) {</div><div class='add'>+        fop-&gt;vector = iov_dup(vector, count);</div><div class='add'>+        if (fop-&gt;vector == NULL) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, ENOMEM, EC_MSG_NO_MEMORY,</div><div class='add'>+                   "Failed to duplicate a "</div><div class='add'>+                   "vector list.");</div><div class='add'>+</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+        fop-&gt;int32 = count;</div><div class='add'>+    }</div><div class='add'>+    if (iobref != NULL) {</div><div class='add'>+        fop-&gt;buffers = iobref_ref(iobref);</div><div class='add'>+        if (fop-&gt;buffers == NULL) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, 0, EC_MSG_BUF_REF_FAIL,</div><div class='add'>+                   "Failed to reference a "</div><div class='add'>+                   "buffer.");</div><div class='add'>+</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    if (xdata != NULL) {</div><div class='add'>+        fop-&gt;xdata = dict_copy_with_ref(xdata, NULL);</div><div class='add'>+        if (fop-&gt;xdata == NULL) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, 0, EC_MSG_DICT_REF_FAIL,</div><div class='add'>+                   "Failed to reference a "</div><div class='add'>+                   "dictionary.");</div><div class='add'>+</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    error = 0;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (fop != NULL) {</div><div class='add'>+        ec_manager(fop, error);</div><div class='add'>+    } else {</div><div class='add'>+        func(frame, NULL, this, -1, error, NULL, NULL, NULL);</div><div class='add'>+    }</div><div class='add'>+}</div><div class='head'>diff --git a/xlators/cluster/ec/src/ec-locks.c b/xlators/cluster/ec/src/ec-locks.c<br/>new file mode 100644<br/>index 00000000000..601960d6154<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/xlators/cluster/ec/src/ec-locks.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>xlators/cluster/ec/src/ec-locks.c</a></div><div class='hunk'>@@ -0,0 +1,1128 @@</div><div class='add'>+/*</div><div class='add'>+  Copyright (c) 2012-2014 DataLab, s.l. &lt;http://www.datalab.es&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#include "ec-helpers.h"</div><div class='add'>+#include "ec-common.h"</div><div class='add'>+#include "ec-combine.h"</div><div class='add'>+#include "ec-fops.h"</div><div class='add'>+#include "ec-messages.h"</div><div class='add'>+</div><div class='add'>+#define EC_LOCK_MODE_NONE 0</div><div class='add'>+#define EC_LOCK_MODE_INC 1</div><div class='add'>+#define EC_LOCK_MODE_ALL 2</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_lock_check(ec_fop_data_t *fop, uintptr_t *mask)</div><div class='add'>+{</div><div class='add'>+    ec_t *ec = fop-&gt;xl-&gt;private;</div><div class='add'>+    ec_cbk_data_t *ans = NULL;</div><div class='add'>+    ec_cbk_data_t *cbk = NULL;</div><div class='add'>+    uintptr_t locked = 0;</div><div class='add'>+    int32_t good = 0;</div><div class='add'>+    int32_t eagain = 0;</div><div class='add'>+    int32_t estale = 0;</div><div class='add'>+    int32_t error = -1;</div><div class='add'>+</div><div class='add'>+    /* There are some errors that we'll handle in an special way while trying</div><div class='add'>+     * to acquire a lock.</div><div class='add'>+     *</div><div class='add'>+     *   EAGAIN:  If it's found during a parallel non-blocking lock request, we</div><div class='add'>+     *            consider that there's contention on the inode, so we consider</div><div class='add'>+     *            the acquisition a failure and try again with a sequential</div><div class='add'>+     *            blocking lock request. This will ensure that we get a lock on</div><div class='add'>+     *            as many bricks as possible (ignoring EAGAIN here would cause</div><div class='add'>+     *            unnecessary triggers of self-healing).</div><div class='add'>+     *</div><div class='add'>+     *            If it's found during a sequential blocking lock request, it's</div><div class='add'>+     *            considered an error. Lock will only succeed if there are</div><div class='add'>+     *            enough other bricks locked.</div><div class='add'>+     *</div><div class='add'>+     *   ESTALE:  This can appear during parallel or sequential lock request if</div><div class='add'>+     *            the inode has just been unlinked. We consider this error is</div><div class='add'>+     *            not recoverable, but we also don't consider it as fatal. So,</div><div class='add'>+     *            if it happens during parallel lock, we won't attempt a</div><div class='add'>+     *            sequential one unless there are EAGAIN errors on other</div><div class='add'>+     *            bricks (and are enough to form a quorum), but if we reach</div><div class='add'>+     *            quorum counting the ESTALE bricks, we consider the whole</div><div class='add'>+     *            result of the operation is ESTALE instead of EIO.</div><div class='add'>+     */</div><div class='add'>+</div><div class='add'>+    list_for_each_entry(ans, &amp;fop-&gt;cbk_list, list)</div><div class='add'>+    {</div><div class='add'>+        if (ans-&gt;op_ret &gt;= 0) {</div><div class='add'>+            if (locked != 0) {</div><div class='add'>+                error = EIO;</div><div class='add'>+            }</div><div class='add'>+            locked |= ans-&gt;mask;</div><div class='add'>+            good = ans-&gt;count;</div><div class='add'>+            cbk = ans;</div><div class='add'>+        } else if (ans-&gt;op_errno == ESTALE) {</div><div class='add'>+            estale += ans-&gt;count;</div><div class='add'>+        } else if ((ans-&gt;op_errno == EAGAIN) &amp;&amp;</div><div class='add'>+                   (fop-&gt;uint32 != EC_LOCK_MODE_INC)) {</div><div class='add'>+            eagain += ans-&gt;count;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (error == -1) {</div><div class='add'>+        /* If we have enough quorum with succeeded and EAGAIN answers, we</div><div class='add'>+         * ignore for now any ESTALE answer. If there are EAGAIN answers,</div><div class='add'>+         * we retry with a sequential blocking lock request if needed.</div><div class='add'>+         * Otherwise we succeed. */</div><div class='add'>+        if ((good + eagain) &gt;= ec-&gt;fragments) {</div><div class='add'>+            if (eagain == 0) {</div><div class='add'>+                if (fop-&gt;answer == NULL) {</div><div class='add'>+                    fop-&gt;answer = cbk;</div><div class='add'>+                }</div><div class='add'>+</div><div class='add'>+                ec_update_good(fop, locked);</div><div class='add'>+</div><div class='add'>+                error = 0;</div><div class='add'>+            } else {</div><div class='add'>+                switch (fop-&gt;uint32) {</div><div class='add'>+                    case EC_LOCK_MODE_NONE:</div><div class='add'>+                        error = EAGAIN;</div><div class='add'>+                        break;</div><div class='add'>+                    case EC_LOCK_MODE_ALL:</div><div class='add'>+                        fop-&gt;uint32 = EC_LOCK_MODE_INC;</div><div class='add'>+                        break;</div><div class='add'>+                    default:</div><div class='add'>+                        /* This shouldn't happen because eagain cannot be &gt; 0</div><div class='add'>+                         * when fop-&gt;uint32 is EC_LOCK_MODE_INC. */</div><div class='add'>+                        error = EIO;</div><div class='add'>+                        break;</div><div class='add'>+                }</div><div class='add'>+            }</div><div class='add'>+        } else {</div><div class='add'>+            /* We have been unable to find enough candidates that will be able</div><div class='add'>+             * to take the lock. If we have quorum on some answer, we return</div><div class='add'>+             * it. Otherwise we check if ESTALE answers allow us to reach</div><div class='add'>+             * quorum. If so, we return ESTALE. */</div><div class='add'>+            if (fop-&gt;answer &amp;&amp; fop-&gt;answer-&gt;op_ret &lt; 0) {</div><div class='add'>+                error = fop-&gt;answer-&gt;op_errno;</div><div class='add'>+            } else if ((good + eagain + estale) &gt;= ec-&gt;fragments) {</div><div class='add'>+                error = ESTALE;</div><div class='add'>+            } else {</div><div class='add'>+                error = EIO;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    *mask = locked;</div><div class='add'>+</div><div class='add'>+    return error;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_lock_unlocked(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                 int32_t op_ret, int32_t op_errno, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    if (op_ret &lt; 0) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_WARNING, op_errno, EC_MSG_UNLOCK_FAILED,</div><div class='add'>+               "Failed to unlock an entry/inode");</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_lock_lk_unlocked(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                    int32_t op_ret, int32_t op_errno, struct gf_flock *flock,</div><div class='add'>+                    dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    if (op_ret &lt; 0) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_WARNING, op_errno, EC_MSG_LK_UNLOCK_FAILED,</div><div class='add'>+               "Failed to unlock an lk");</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* FOP: entrylk */</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_entrylk_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+               int32_t op_ret, int32_t op_errno, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    ec_fop_data_t *fop = NULL;</div><div class='add'>+    ec_cbk_data_t *cbk = NULL;</div><div class='add'>+    int32_t idx = (int32_t)(uintptr_t)cookie;</div><div class='add'>+</div><div class='add'>+    VALIDATE_OR_GOTO(this, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, frame, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, frame-&gt;local, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, this-&gt;private, out);</div><div class='add'>+</div><div class='add'>+    fop = frame-&gt;local;</div><div class='add'>+</div><div class='add'>+    ec_trace("CBK", fop, "idx=%d, frame=%p, op_ret=%d, op_errno=%d", idx, frame,</div><div class='add'>+             op_ret, op_errno);</div><div class='add'>+</div><div class='add'>+    cbk = ec_cbk_data_allocate(frame, this, fop, GF_FOP_ENTRYLK, idx, op_ret,</div><div class='add'>+                               op_errno);</div><div class='add'>+    if (cbk != NULL) {</div><div class='add'>+        if (xdata != NULL) {</div><div class='add'>+            cbk-&gt;xdata = dict_ref(xdata);</div><div class='add'>+            if (cbk-&gt;xdata == NULL) {</div><div class='add'>+                gf_msg(this-&gt;name, GF_LOG_ERROR, 0, EC_MSG_DICT_REF_FAIL,</div><div class='add'>+                       "Failed to reference a "</div><div class='add'>+                       "dictionary.");</div><div class='add'>+</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        ec_combine(cbk, NULL);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (fop != NULL) {</div><div class='add'>+        ec_complete(fop);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_wind_entrylk(ec_t *ec, ec_fop_data_t *fop, int32_t idx)</div><div class='add'>+{</div><div class='add'>+    ec_trace("WIND", fop, "idx=%d", idx);</div><div class='add'>+</div><div class='add'>+    STACK_WIND_COOKIE(fop-&gt;frame, ec_entrylk_cbk, (void *)(uintptr_t)idx,</div><div class='add'>+                      ec-&gt;xl_list[idx], ec-&gt;xl_list[idx]-&gt;fops-&gt;entrylk,</div><div class='add'>+                      fop-&gt;str[0], &amp;fop-&gt;loc[0], fop-&gt;str[1], fop-&gt;entrylk_cmd,</div><div class='add'>+                      fop-&gt;entrylk_type, fop-&gt;xdata);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_manager_entrylk(ec_fop_data_t *fop, int32_t state)</div><div class='add'>+{</div><div class='add'>+    ec_cbk_data_t *cbk;</div><div class='add'>+</div><div class='add'>+    switch (state) {</div><div class='add'>+        case EC_STATE_INIT:</div><div class='add'>+            if (fop-&gt;entrylk_cmd == ENTRYLK_LOCK) {</div><div class='add'>+                fop-&gt;uint32 = EC_LOCK_MODE_ALL;</div><div class='add'>+                fop-&gt;entrylk_cmd = ENTRYLK_LOCK_NB;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            /* Fall through */</div><div class='add'>+</div><div class='add'>+        case EC_STATE_DISPATCH:</div><div class='add'>+            ec_dispatch_all(fop);</div><div class='add'>+</div><div class='add'>+            return EC_STATE_PREPARE_ANSWER;</div><div class='add'>+</div><div class='add'>+        case EC_STATE_PREPARE_ANSWER:</div><div class='add'>+        case -EC_STATE_PREPARE_ANSWER:</div><div class='add'>+            if (fop-&gt;entrylk_cmd != ENTRYLK_UNLOCK) {</div><div class='add'>+                uintptr_t mask;</div><div class='add'>+</div><div class='add'>+                ec_fop_set_error(fop, ec_lock_check(fop, &amp;mask));</div><div class='add'>+                if (fop-&gt;error != 0) {</div><div class='add'>+                    if (mask != 0) {</div><div class='add'>+                        if (fop-&gt;id == GF_FOP_ENTRYLK) {</div><div class='add'>+                            ec_entrylk(</div><div class='add'>+                                fop-&gt;frame, fop-&gt;xl, mask, 1, ec_lock_unlocked,</div><div class='add'>+                                NULL, fop-&gt;str[0], &amp;fop-&gt;loc[0], fop-&gt;str[1],</div><div class='add'>+                                ENTRYLK_UNLOCK, fop-&gt;entrylk_type, fop-&gt;xdata);</div><div class='add'>+                        } else {</div><div class='add'>+                            ec_fentrylk(fop-&gt;frame, fop-&gt;xl, mask, 1,</div><div class='add'>+                                        ec_lock_unlocked, NULL, fop-&gt;str[0],</div><div class='add'>+                                        fop-&gt;fd, fop-&gt;str[1], ENTRYLK_UNLOCK,</div><div class='add'>+                                        fop-&gt;entrylk_type, fop-&gt;xdata);</div><div class='add'>+                        }</div><div class='add'>+                    }</div><div class='add'>+                    if (fop-&gt;error &lt; 0) {</div><div class='add'>+                        fop-&gt;error = 0;</div><div class='add'>+</div><div class='add'>+                        fop-&gt;entrylk_cmd = ENTRYLK_LOCK;</div><div class='add'>+</div><div class='add'>+                        ec_dispatch_inc(fop);</div><div class='add'>+</div><div class='add'>+                        return EC_STATE_PREPARE_ANSWER;</div><div class='add'>+                    }</div><div class='add'>+                }</div><div class='add'>+            } else {</div><div class='add'>+                ec_fop_prepare_answer(fop, _gf_true);</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            return EC_STATE_REPORT;</div><div class='add'>+</div><div class='add'>+        case EC_STATE_REPORT:</div><div class='add'>+            cbk = fop-&gt;answer;</div><div class='add'>+</div><div class='add'>+            GF_ASSERT(cbk != NULL);</div><div class='add'>+</div><div class='add'>+            if (fop-&gt;id == GF_FOP_ENTRYLK) {</div><div class='add'>+                if (fop-&gt;cbks.entrylk != NULL) {</div><div class='add'>+                    fop-&gt;cbks.entrylk(fop-&gt;req_frame, fop, fop-&gt;xl, cbk-&gt;op_ret,</div><div class='add'>+                                      cbk-&gt;op_errno, cbk-&gt;xdata);</div><div class='add'>+                }</div><div class='add'>+            } else {</div><div class='add'>+                if (fop-&gt;cbks.fentrylk != NULL) {</div><div class='add'>+                    fop-&gt;cbks.fentrylk(fop-&gt;req_frame, fop, fop-&gt;xl,</div><div class='add'>+                                       cbk-&gt;op_ret, cbk-&gt;op_errno, cbk-&gt;xdata);</div><div class='add'>+                }</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            return EC_STATE_END;</div><div class='add'>+</div><div class='add'>+        case -EC_STATE_INIT:</div><div class='add'>+        case -EC_STATE_DISPATCH:</div><div class='add'>+        case -EC_STATE_REPORT:</div><div class='add'>+            GF_ASSERT(fop-&gt;error != 0);</div><div class='add'>+</div><div class='add'>+            if (fop-&gt;id == GF_FOP_ENTRYLK) {</div><div class='add'>+                if (fop-&gt;cbks.entrylk != NULL) {</div><div class='add'>+                    fop-&gt;cbks.entrylk(fop-&gt;req_frame, fop, fop-&gt;xl, -1,</div><div class='add'>+                                      fop-&gt;error, NULL);</div><div class='add'>+                }</div><div class='add'>+            } else {</div><div class='add'>+                if (fop-&gt;cbks.fentrylk != NULL) {</div><div class='add'>+                    fop-&gt;cbks.fentrylk(fop-&gt;req_frame, fop, fop-&gt;xl, -1,</div><div class='add'>+                                       fop-&gt;error, NULL);</div><div class='add'>+                }</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            return EC_STATE_END;</div><div class='add'>+</div><div class='add'>+        default:</div><div class='add'>+            gf_msg(fop-&gt;xl-&gt;name, GF_LOG_ERROR, EINVAL, EC_MSG_UNHANDLED_STATE,</div><div class='add'>+                   "Unhandled state %d for %s", state, ec_fop_name(fop-&gt;id));</div><div class='add'>+</div><div class='add'>+            return EC_STATE_END;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_entrylk(call_frame_t *frame, xlator_t *this, uintptr_t target,</div><div class='add'>+           uint32_t fop_flags, fop_entrylk_cbk_t func, void *data,</div><div class='add'>+           const char *volume, loc_t *loc, const char *basename,</div><div class='add'>+           entrylk_cmd cmd, entrylk_type type, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    ec_cbk_t callback = {.entrylk = func};</div><div class='add'>+    ec_fop_data_t *fop = NULL;</div><div class='add'>+    int32_t error = ENOMEM;</div><div class='add'>+</div><div class='add'>+    gf_msg_trace("ec", 0, "EC(ENTRYLK) %p", frame);</div><div class='add'>+</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, frame, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, this-&gt;private, out);</div><div class='add'>+</div><div class='add'>+    fop = ec_fop_data_allocate(frame, this, GF_FOP_ENTRYLK, 0, target,</div><div class='add'>+                               fop_flags, ec_wind_entrylk, ec_manager_entrylk,</div><div class='add'>+                               callback, data);</div><div class='add'>+    if (fop == NULL) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    fop-&gt;entrylk_cmd = cmd;</div><div class='add'>+    fop-&gt;entrylk_type = type;</div><div class='add'>+</div><div class='add'>+    if (volume != NULL) {</div><div class='add'>+        fop-&gt;str[0] = gf_strdup(volume);</div><div class='add'>+        if (fop-&gt;str[0] == NULL) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, ENOMEM, EC_MSG_NO_MEMORY,</div><div class='add'>+                   "Failed to duplicate a string.");</div><div class='add'>+</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    if (loc != NULL) {</div><div class='add'>+        if (loc_copy(&amp;fop-&gt;loc[0], loc) != 0) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, ENOMEM, EC_MSG_LOC_COPY_FAIL,</div><div class='add'>+                   "Failed to copy a location.");</div><div class='add'>+</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    if (basename != NULL) {</div><div class='add'>+        fop-&gt;str[1] = gf_strdup(basename);</div><div class='add'>+        if (fop-&gt;str[1] == NULL) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, ENOMEM, EC_MSG_NO_MEMORY,</div><div class='add'>+                   "Failed to duplicate a string.");</div><div class='add'>+</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    if (xdata != NULL) {</div><div class='add'>+        fop-&gt;xdata = dict_ref(xdata);</div><div class='add'>+        if (fop-&gt;xdata == NULL) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, 0, EC_MSG_DICT_REF_FAIL,</div><div class='add'>+                   "Failed to reference a "</div><div class='add'>+                   "dictionary.");</div><div class='add'>+</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    error = 0;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (fop != NULL) {</div><div class='add'>+        ec_manager(fop, error);</div><div class='add'>+    } else {</div><div class='add'>+        func(frame, NULL, this, -1, error, NULL);</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* FOP: fentrylk */</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_fentrylk_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                int32_t op_ret, int32_t op_errno, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    ec_fop_data_t *fop = NULL;</div><div class='add'>+    ec_cbk_data_t *cbk = NULL;</div><div class='add'>+    int32_t idx = (int32_t)(uintptr_t)cookie;</div><div class='add'>+</div><div class='add'>+    VALIDATE_OR_GOTO(this, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, frame, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, frame-&gt;local, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, this-&gt;private, out);</div><div class='add'>+</div><div class='add'>+    fop = frame-&gt;local;</div><div class='add'>+</div><div class='add'>+    ec_trace("CBK", fop, "idx=%d, frame=%p, op_ret=%d, op_errno=%d", idx, frame,</div><div class='add'>+             op_ret, op_errno);</div><div class='add'>+</div><div class='add'>+    cbk = ec_cbk_data_allocate(frame, this, fop, GF_FOP_FENTRYLK, idx, op_ret,</div><div class='add'>+                               op_errno);</div><div class='add'>+    if (cbk != NULL) {</div><div class='add'>+        if (xdata != NULL) {</div><div class='add'>+            cbk-&gt;xdata = dict_ref(xdata);</div><div class='add'>+            if (cbk-&gt;xdata == NULL) {</div><div class='add'>+                gf_msg(this-&gt;name, GF_LOG_ERROR, 0, EC_MSG_DICT_REF_FAIL,</div><div class='add'>+                       "Failed to reference a "</div><div class='add'>+                       "dictionary.");</div><div class='add'>+</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        ec_combine(cbk, NULL);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (fop != NULL) {</div><div class='add'>+        ec_complete(fop);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_wind_fentrylk(ec_t *ec, ec_fop_data_t *fop, int32_t idx)</div><div class='add'>+{</div><div class='add'>+    ec_trace("WIND", fop, "idx=%d", idx);</div><div class='add'>+</div><div class='add'>+    STACK_WIND_COOKIE(fop-&gt;frame, ec_fentrylk_cbk, (void *)(uintptr_t)idx,</div><div class='add'>+                      ec-&gt;xl_list[idx], ec-&gt;xl_list[idx]-&gt;fops-&gt;fentrylk,</div><div class='add'>+                      fop-&gt;str[0], fop-&gt;fd, fop-&gt;str[1], fop-&gt;entrylk_cmd,</div><div class='add'>+                      fop-&gt;entrylk_type, fop-&gt;xdata);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_fentrylk(call_frame_t *frame, xlator_t *this, uintptr_t target,</div><div class='add'>+            uint32_t fop_flags, fop_fentrylk_cbk_t func, void *data,</div><div class='add'>+            const char *volume, fd_t *fd, const char *basename, entrylk_cmd cmd,</div><div class='add'>+            entrylk_type type, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    ec_cbk_t callback = {.fentrylk = func};</div><div class='add'>+    ec_fop_data_t *fop = NULL;</div><div class='add'>+    int32_t error = ENOMEM;</div><div class='add'>+</div><div class='add'>+    gf_msg_trace("ec", 0, "EC(FENTRYLK) %p", frame);</div><div class='add'>+</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, frame, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, this-&gt;private, out);</div><div class='add'>+</div><div class='add'>+    fop = ec_fop_data_allocate(frame, this, GF_FOP_FENTRYLK, 0, target,</div><div class='add'>+                               fop_flags, ec_wind_fentrylk, ec_manager_entrylk,</div><div class='add'>+                               callback, data);</div><div class='add'>+    if (fop == NULL) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    fop-&gt;use_fd = 1;</div><div class='add'>+</div><div class='add'>+    fop-&gt;entrylk_cmd = cmd;</div><div class='add'>+    fop-&gt;entrylk_type = type;</div><div class='add'>+</div><div class='add'>+    if (volume != NULL) {</div><div class='add'>+        fop-&gt;str[0] = gf_strdup(volume);</div><div class='add'>+        if (fop-&gt;str[0] == NULL) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, ENOMEM, EC_MSG_NO_MEMORY,</div><div class='add'>+                   "Failed to duplicate a string.");</div><div class='add'>+</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    if (fd != NULL) {</div><div class='add'>+        fop-&gt;fd = fd_ref(fd);</div><div class='add'>+        if (fop-&gt;fd == NULL) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, 0, EC_MSG_FILE_DESC_REF_FAIL,</div><div class='add'>+                   "Failed to reference a "</div><div class='add'>+                   "file descriptor.");</div><div class='add'>+</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    if (basename != NULL) {</div><div class='add'>+        fop-&gt;str[1] = gf_strdup(basename);</div><div class='add'>+        if (fop-&gt;str[1] == NULL) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, ENOMEM, EC_MSG_NO_MEMORY,</div><div class='add'>+                   "Failed to duplicate a string.");</div><div class='add'>+</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    if (xdata != NULL) {</div><div class='add'>+        fop-&gt;xdata = dict_ref(xdata);</div><div class='add'>+        if (fop-&gt;xdata == NULL) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, 0, EC_MSG_DICT_REF_FAIL,</div><div class='add'>+                   "Failed to reference a "</div><div class='add'>+                   "dictionary.");</div><div class='add'>+</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    error = 0;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (fop != NULL) {</div><div class='add'>+        ec_manager(fop, error);</div><div class='add'>+    } else {</div><div class='add'>+        func(frame, NULL, this, -1, error, NULL);</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* FOP: inodelk */</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_inodelk_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+               int32_t op_ret, int32_t op_errno, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    ec_fop_data_t *fop = NULL;</div><div class='add'>+    ec_cbk_data_t *cbk = NULL;</div><div class='add'>+    int32_t idx = (int32_t)(uintptr_t)cookie;</div><div class='add'>+</div><div class='add'>+    VALIDATE_OR_GOTO(this, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, frame, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, frame-&gt;local, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, this-&gt;private, out);</div><div class='add'>+</div><div class='add'>+    fop = frame-&gt;local;</div><div class='add'>+</div><div class='add'>+    ec_trace("CBK", fop, "idx=%d, frame=%p, op_ret=%d, op_errno=%d", idx, frame,</div><div class='add'>+             op_ret, op_errno);</div><div class='add'>+</div><div class='add'>+    cbk = ec_cbk_data_allocate(frame, this, fop, GF_FOP_INODELK, idx, op_ret,</div><div class='add'>+                               op_errno);</div><div class='add'>+    if (cbk != NULL) {</div><div class='add'>+        if (xdata != NULL) {</div><div class='add'>+            cbk-&gt;xdata = dict_ref(xdata);</div><div class='add'>+            if (cbk-&gt;xdata == NULL) {</div><div class='add'>+                gf_msg(this-&gt;name, GF_LOG_ERROR, 0, EC_MSG_DICT_REF_FAIL,</div><div class='add'>+                       "Failed to reference a "</div><div class='add'>+                       "dictionary.");</div><div class='add'>+</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        ec_combine(cbk, NULL);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (fop != NULL) {</div><div class='add'>+        ec_complete(fop);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_wind_inodelk(ec_t *ec, ec_fop_data_t *fop, int32_t idx)</div><div class='add'>+{</div><div class='add'>+    ec_trace("WIND", fop, "idx=%d", idx);</div><div class='add'>+</div><div class='add'>+    STACK_WIND_COOKIE(fop-&gt;frame, ec_inodelk_cbk, (void *)(uintptr_t)idx,</div><div class='add'>+                      ec-&gt;xl_list[idx], ec-&gt;xl_list[idx]-&gt;fops-&gt;inodelk,</div><div class='add'>+                      fop-&gt;str[0], &amp;fop-&gt;loc[0], fop-&gt;int32, &amp;fop-&gt;flock,</div><div class='add'>+                      fop-&gt;xdata);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_manager_inodelk(ec_fop_data_t *fop, int32_t state)</div><div class='add'>+{</div><div class='add'>+    ec_cbk_data_t *cbk;</div><div class='add'>+</div><div class='add'>+    switch (state) {</div><div class='add'>+        case EC_STATE_INIT:</div><div class='add'>+            fop-&gt;flock.l_len += ec_adjust_offset_down(</div><div class='add'>+                fop-&gt;xl-&gt;private, &amp;fop-&gt;flock.l_start, _gf_true);</div><div class='add'>+            ec_adjust_offset_up(fop-&gt;xl-&gt;private, &amp;fop-&gt;flock.l_len, _gf_true);</div><div class='add'>+            if ((fop-&gt;int32 == F_SETLKW) &amp;&amp; (fop-&gt;flock.l_type != F_UNLCK)) {</div><div class='add'>+                fop-&gt;uint32 = EC_LOCK_MODE_ALL;</div><div class='add'>+                fop-&gt;int32 = F_SETLK;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            /* Fall through */</div><div class='add'>+</div><div class='add'>+        case EC_STATE_DISPATCH:</div><div class='add'>+            ec_dispatch_all(fop);</div><div class='add'>+</div><div class='add'>+            return EC_STATE_PREPARE_ANSWER;</div><div class='add'>+</div><div class='add'>+        case EC_STATE_PREPARE_ANSWER:</div><div class='add'>+        case -EC_STATE_PREPARE_ANSWER:</div><div class='add'>+            if (fop-&gt;flock.l_type != F_UNLCK) {</div><div class='add'>+                uintptr_t mask;</div><div class='add'>+</div><div class='add'>+                ec_fop_set_error(fop, ec_lock_check(fop, &amp;mask));</div><div class='add'>+                if (fop-&gt;error != 0) {</div><div class='add'>+                    if (mask != 0) {</div><div class='add'>+                        ec_t *ec = fop-&gt;xl-&gt;private;</div><div class='add'>+                        struct gf_flock flock;</div><div class='add'>+</div><div class='add'>+                        flock.l_type = F_UNLCK;</div><div class='add'>+                        flock.l_whence = fop-&gt;flock.l_whence;</div><div class='add'>+                        flock.l_start = fop-&gt;flock.l_start * ec-&gt;fragments;</div><div class='add'>+                        flock.l_len = fop-&gt;flock.l_len * ec-&gt;fragments;</div><div class='add'>+                        flock.l_pid = 0;</div><div class='add'>+                        flock.l_owner.len = 0;</div><div class='add'>+</div><div class='add'>+                        if (fop-&gt;id == GF_FOP_INODELK) {</div><div class='add'>+                            ec_inodelk(fop-&gt;frame, fop-&gt;xl,</div><div class='add'>+                                       &amp;fop-&gt;frame-&gt;root-&gt;lk_owner, mask, 1,</div><div class='add'>+                                       ec_lock_unlocked, NULL, fop-&gt;str[0],</div><div class='add'>+                                       &amp;fop-&gt;loc[0], F_SETLK, &amp;flock,</div><div class='add'>+                                       fop-&gt;xdata);</div><div class='add'>+                        } else {</div><div class='add'>+                            ec_finodelk(fop-&gt;frame, fop-&gt;xl,</div><div class='add'>+                                        &amp;fop-&gt;frame-&gt;root-&gt;lk_owner, mask, 1,</div><div class='add'>+                                        ec_lock_unlocked, NULL, fop-&gt;str[0],</div><div class='add'>+                                        fop-&gt;fd, F_SETLK, &amp;flock, fop-&gt;xdata);</div><div class='add'>+                        }</div><div class='add'>+                    }</div><div class='add'>+                    if (fop-&gt;error &lt; 0) {</div><div class='add'>+                        fop-&gt;error = 0;</div><div class='add'>+</div><div class='add'>+                        fop-&gt;int32 = F_SETLKW;</div><div class='add'>+</div><div class='add'>+                        ec_dispatch_inc(fop);</div><div class='add'>+</div><div class='add'>+                        return EC_STATE_PREPARE_ANSWER;</div><div class='add'>+                    }</div><div class='add'>+                }</div><div class='add'>+            } else {</div><div class='add'>+                ec_fop_prepare_answer(fop, _gf_true);</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            return EC_STATE_REPORT;</div><div class='add'>+</div><div class='add'>+        case EC_STATE_REPORT:</div><div class='add'>+            cbk = fop-&gt;answer;</div><div class='add'>+</div><div class='add'>+            GF_ASSERT(cbk != NULL);</div><div class='add'>+</div><div class='add'>+            if (fop-&gt;id == GF_FOP_INODELK) {</div><div class='add'>+                if (fop-&gt;cbks.inodelk != NULL) {</div><div class='add'>+                    fop-&gt;cbks.inodelk(fop-&gt;req_frame, fop, fop-&gt;xl, cbk-&gt;op_ret,</div><div class='add'>+                                      cbk-&gt;op_errno, cbk-&gt;xdata);</div><div class='add'>+                }</div><div class='add'>+            } else {</div><div class='add'>+                if (fop-&gt;cbks.finodelk != NULL) {</div><div class='add'>+                    fop-&gt;cbks.finodelk(fop-&gt;req_frame, fop, fop-&gt;xl,</div><div class='add'>+                                       cbk-&gt;op_ret, cbk-&gt;op_errno, cbk-&gt;xdata);</div><div class='add'>+                }</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            return EC_STATE_END;</div><div class='add'>+</div><div class='add'>+        case -EC_STATE_INIT:</div><div class='add'>+        case -EC_STATE_DISPATCH:</div><div class='add'>+        case -EC_STATE_REPORT:</div><div class='add'>+            GF_ASSERT(fop-&gt;error != 0);</div><div class='add'>+</div><div class='add'>+            if (fop-&gt;id == GF_FOP_INODELK) {</div><div class='add'>+                if (fop-&gt;cbks.inodelk != NULL) {</div><div class='add'>+                    fop-&gt;cbks.inodelk(fop-&gt;req_frame, fop, fop-&gt;xl, -1,</div><div class='add'>+                                      fop-&gt;error, NULL);</div><div class='add'>+                }</div><div class='add'>+            } else {</div><div class='add'>+                if (fop-&gt;cbks.finodelk != NULL) {</div><div class='add'>+                    fop-&gt;cbks.finodelk(fop-&gt;req_frame, fop, fop-&gt;xl, -1,</div><div class='add'>+                                       fop-&gt;error, NULL);</div><div class='add'>+                }</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            return EC_STATE_END;</div><div class='add'>+</div><div class='add'>+        default:</div><div class='add'>+            gf_msg(fop-&gt;xl-&gt;name, GF_LOG_ERROR, EINVAL, EC_MSG_UNHANDLED_STATE,</div><div class='add'>+                   "Unhandled state %d for %s", state, ec_fop_name(fop-&gt;id));</div><div class='add'>+</div><div class='add'>+            return EC_STATE_END;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_inodelk(call_frame_t *frame, xlator_t *this, gf_lkowner_t *owner,</div><div class='add'>+           uintptr_t target, uint32_t fop_flags, fop_inodelk_cbk_t func,</div><div class='add'>+           void *data, const char *volume, loc_t *loc, int32_t cmd,</div><div class='add'>+           struct gf_flock *flock, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    ec_cbk_t callback = {.inodelk = func};</div><div class='add'>+    ec_fop_data_t *fop = NULL;</div><div class='add'>+    int32_t error = ENOMEM;</div><div class='add'>+</div><div class='add'>+    gf_msg_trace("ec", 0, "EC(INODELK) %p", frame);</div><div class='add'>+</div><div class='add'>+    VALIDATE_OR_GOTO(this, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, frame, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, this-&gt;private, out);</div><div class='add'>+</div><div class='add'>+    fop = ec_fop_data_allocate(frame, this, GF_FOP_INODELK, 0, target,</div><div class='add'>+                               fop_flags, ec_wind_inodelk, ec_manager_inodelk,</div><div class='add'>+                               callback, data);</div><div class='add'>+    if (fop == NULL) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    fop-&gt;int32 = cmd;</div><div class='add'>+    ec_owner_copy(fop-&gt;frame, owner);</div><div class='add'>+</div><div class='add'>+    if (volume != NULL) {</div><div class='add'>+        fop-&gt;str[0] = gf_strdup(volume);</div><div class='add'>+        if (fop-&gt;str[0] == NULL) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, ENOMEM, EC_MSG_NO_MEMORY,</div><div class='add'>+                   "Failed to duplicate a string.");</div><div class='add'>+</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    if (loc != NULL) {</div><div class='add'>+        if (loc_copy(&amp;fop-&gt;loc[0], loc) != 0) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, ENOMEM, EC_MSG_LOC_COPY_FAIL,</div><div class='add'>+                   "Failed to copy a location.");</div><div class='add'>+</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    if (flock != NULL) {</div><div class='add'>+        fop-&gt;flock.l_type = flock-&gt;l_type;</div><div class='add'>+        fop-&gt;flock.l_whence = flock-&gt;l_whence;</div><div class='add'>+        fop-&gt;flock.l_start = flock-&gt;l_start;</div><div class='add'>+        fop-&gt;flock.l_len = flock-&gt;l_len;</div><div class='add'>+        fop-&gt;flock.l_pid = flock-&gt;l_pid;</div><div class='add'>+        fop-&gt;flock.l_owner.len = flock-&gt;l_owner.len;</div><div class='add'>+        if (flock-&gt;l_owner.len &gt; 0) {</div><div class='add'>+            memcpy(fop-&gt;flock.l_owner.data, flock-&gt;l_owner.data,</div><div class='add'>+                   flock-&gt;l_owner.len);</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    if (xdata != NULL) {</div><div class='add'>+        fop-&gt;xdata = dict_ref(xdata);</div><div class='add'>+        if (fop-&gt;xdata == NULL) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, 0, EC_MSG_DICT_REF_FAIL,</div><div class='add'>+                   "Failed to reference a "</div><div class='add'>+                   "dictionary.");</div><div class='add'>+</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    error = 0;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (fop != NULL) {</div><div class='add'>+        ec_manager(fop, error);</div><div class='add'>+    } else {</div><div class='add'>+        func(frame, NULL, this, -1, error, NULL);</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* FOP: finodelk */</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_finodelk_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                int32_t op_ret, int32_t op_errno, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    ec_fop_data_t *fop = NULL;</div><div class='add'>+    ec_cbk_data_t *cbk = NULL;</div><div class='add'>+    int32_t idx = (int32_t)(uintptr_t)cookie;</div><div class='add'>+</div><div class='add'>+    VALIDATE_OR_GOTO(this, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, frame, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, frame-&gt;local, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, this-&gt;private, out);</div><div class='add'>+</div><div class='add'>+    fop = frame-&gt;local;</div><div class='add'>+</div><div class='add'>+    ec_trace("CBK", fop, "idx=%d, frame=%p, op_ret=%d, op_errno=%d", idx, frame,</div><div class='add'>+             op_ret, op_errno);</div><div class='add'>+</div><div class='add'>+    cbk = ec_cbk_data_allocate(frame, this, fop, GF_FOP_FINODELK, idx, op_ret,</div><div class='add'>+                               op_errno);</div><div class='add'>+    if (cbk != NULL) {</div><div class='add'>+        if (xdata != NULL) {</div><div class='add'>+            cbk-&gt;xdata = dict_ref(xdata);</div><div class='add'>+            if (cbk-&gt;xdata == NULL) {</div><div class='add'>+                gf_msg(this-&gt;name, GF_LOG_ERROR, 0, EC_MSG_DICT_REF_FAIL,</div><div class='add'>+                       "Failed to reference a "</div><div class='add'>+                       "dictionary.");</div><div class='add'>+</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        ec_combine(cbk, NULL);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (fop != NULL) {</div><div class='add'>+        ec_complete(fop);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_wind_finodelk(ec_t *ec, ec_fop_data_t *fop, int32_t idx)</div><div class='add'>+{</div><div class='add'>+    ec_trace("WIND", fop, "idx=%d", idx);</div><div class='add'>+</div><div class='add'>+    STACK_WIND_COOKIE(fop-&gt;frame, ec_finodelk_cbk, (void *)(uintptr_t)idx,</div><div class='add'>+                      ec-&gt;xl_list[idx], ec-&gt;xl_list[idx]-&gt;fops-&gt;finodelk,</div><div class='add'>+                      fop-&gt;str[0], fop-&gt;fd, fop-&gt;int32, &amp;fop-&gt;flock,</div><div class='add'>+                      fop-&gt;xdata);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_finodelk(call_frame_t *frame, xlator_t *this, gf_lkowner_t *owner,</div><div class='add'>+            uintptr_t target, uint32_t fop_flags, fop_finodelk_cbk_t func,</div><div class='add'>+            void *data, const char *volume, fd_t *fd, int32_t cmd,</div><div class='add'>+            struct gf_flock *flock, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    ec_cbk_t callback = {.finodelk = func};</div><div class='add'>+    ec_fop_data_t *fop = NULL;</div><div class='add'>+    int32_t error = ENOMEM;</div><div class='add'>+</div><div class='add'>+    gf_msg_trace("ec", 0, "EC(FINODELK) %p", frame);</div><div class='add'>+</div><div class='add'>+    VALIDATE_OR_GOTO(this, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, frame, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, this-&gt;private, out);</div><div class='add'>+</div><div class='add'>+    fop = ec_fop_data_allocate(frame, this, GF_FOP_FINODELK, 0, target,</div><div class='add'>+                               fop_flags, ec_wind_finodelk, ec_manager_inodelk,</div><div class='add'>+                               callback, data);</div><div class='add'>+    if (fop == NULL) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    fop-&gt;use_fd = 1;</div><div class='add'>+</div><div class='add'>+    fop-&gt;int32 = cmd;</div><div class='add'>+    ec_owner_copy(fop-&gt;frame, owner);</div><div class='add'>+</div><div class='add'>+    if (volume != NULL) {</div><div class='add'>+        fop-&gt;str[0] = gf_strdup(volume);</div><div class='add'>+        if (fop-&gt;str[0] == NULL) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, ENOMEM, EC_MSG_NO_MEMORY,</div><div class='add'>+                   "Failed to duplicate a string.");</div><div class='add'>+</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    if (fd != NULL) {</div><div class='add'>+        fop-&gt;fd = fd_ref(fd);</div><div class='add'>+        if (fop-&gt;fd == NULL) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, 0, EC_MSG_DICT_REF_FAIL,</div><div class='add'>+                   "Failed to reference a "</div><div class='add'>+                   "file descriptor.");</div><div class='add'>+</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    if (flock != NULL) {</div><div class='add'>+        fop-&gt;flock.l_type = flock-&gt;l_type;</div><div class='add'>+        fop-&gt;flock.l_whence = flock-&gt;l_whence;</div><div class='add'>+        fop-&gt;flock.l_start = flock-&gt;l_start;</div><div class='add'>+        fop-&gt;flock.l_len = flock-&gt;l_len;</div><div class='add'>+        fop-&gt;flock.l_pid = flock-&gt;l_pid;</div><div class='add'>+        fop-&gt;flock.l_owner.len = flock-&gt;l_owner.len;</div><div class='add'>+        if (flock-&gt;l_owner.len &gt; 0) {</div><div class='add'>+            memcpy(fop-&gt;flock.l_owner.data, flock-&gt;l_owner.data,</div><div class='add'>+                   flock-&gt;l_owner.len);</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    if (xdata != NULL) {</div><div class='add'>+        fop-&gt;xdata = dict_ref(xdata);</div><div class='add'>+        if (fop-&gt;xdata == NULL) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, 0, EC_MSG_DICT_REF_FAIL,</div><div class='add'>+                   "Failed to reference a "</div><div class='add'>+                   "dictionary.");</div><div class='add'>+</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    error = 0;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (fop != NULL) {</div><div class='add'>+        ec_manager(fop, error);</div><div class='add'>+    } else {</div><div class='add'>+        func(frame, NULL, this, -1, error, NULL);</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* FOP: lk */</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_combine_lk(ec_fop_data_t *fop, ec_cbk_data_t *dst, ec_cbk_data_t *src)</div><div class='add'>+{</div><div class='add'>+    if (!ec_flock_compare(&amp;dst-&gt;flock, &amp;src-&gt;flock)) {</div><div class='add'>+        gf_msg(fop-&gt;xl-&gt;name, GF_LOG_NOTICE, 0, EC_MSG_LOCK_MISMATCH,</div><div class='add'>+               "Mismatching lock in "</div><div class='add'>+               "answers of 'GF_FOP_LK'");</div><div class='add'>+</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_lk_cbk(call_frame_t *frame, void *cookie, xlator_t *this, int32_t op_ret,</div><div class='add'>+          int32_t op_errno, struct gf_flock *flock, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    ec_fop_data_t *fop = NULL;</div><div class='add'>+    ec_cbk_data_t *cbk = NULL;</div><div class='add'>+    int32_t idx = (int32_t)(uintptr_t)cookie;</div><div class='add'>+</div><div class='add'>+    VALIDATE_OR_GOTO(this, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, frame, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, frame-&gt;local, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, this-&gt;private, out);</div><div class='add'>+</div><div class='add'>+    fop = frame-&gt;local;</div><div class='add'>+</div><div class='add'>+    ec_trace("CBK", fop, "idx=%d, frame=%p, op_ret=%d, op_errno=%d", idx, frame,</div><div class='add'>+             op_ret, op_errno);</div><div class='add'>+</div><div class='add'>+    cbk = ec_cbk_data_allocate(frame, this, fop, GF_FOP_LK, idx, op_ret,</div><div class='add'>+                               op_errno);</div><div class='add'>+    if (cbk != NULL) {</div><div class='add'>+        if (op_ret &gt;= 0) {</div><div class='add'>+            if (flock != NULL) {</div><div class='add'>+                cbk-&gt;flock.l_type = flock-&gt;l_type;</div><div class='add'>+                cbk-&gt;flock.l_whence = flock-&gt;l_whence;</div><div class='add'>+                cbk-&gt;flock.l_start = flock-&gt;l_start;</div><div class='add'>+                cbk-&gt;flock.l_len = flock-&gt;l_len;</div><div class='add'>+                cbk-&gt;flock.l_pid = flock-&gt;l_pid;</div><div class='add'>+                cbk-&gt;flock.l_owner.len = flock-&gt;l_owner.len;</div><div class='add'>+                if (flock-&gt;l_owner.len &gt; 0) {</div><div class='add'>+                    memcpy(cbk-&gt;flock.l_owner.data, flock-&gt;l_owner.data,</div><div class='add'>+                           flock-&gt;l_owner.len);</div><div class='add'>+                }</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+        if (xdata != NULL) {</div><div class='add'>+            cbk-&gt;xdata = dict_ref(xdata);</div><div class='add'>+            if (cbk-&gt;xdata == NULL) {</div><div class='add'>+                gf_msg(this-&gt;name, GF_LOG_ERROR, 0, EC_MSG_DICT_REF_FAIL,</div><div class='add'>+                       "Failed to reference a "</div><div class='add'>+                       "dictionary.");</div><div class='add'>+</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        ec_combine(cbk, ec_combine_lk);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (fop != NULL) {</div><div class='add'>+        ec_complete(fop);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_wind_lk(ec_t *ec, ec_fop_data_t *fop, int32_t idx)</div><div class='add'>+{</div><div class='add'>+    ec_trace("WIND", fop, "idx=%d", idx);</div><div class='add'>+</div><div class='add'>+    STACK_WIND_COOKIE(fop-&gt;frame, ec_lk_cbk, (void *)(uintptr_t)idx,</div><div class='add'>+                      ec-&gt;xl_list[idx], ec-&gt;xl_list[idx]-&gt;fops-&gt;lk, fop-&gt;fd,</div><div class='add'>+                      fop-&gt;int32, &amp;fop-&gt;flock, fop-&gt;xdata);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_manager_lk(ec_fop_data_t *fop, int32_t state)</div><div class='add'>+{</div><div class='add'>+    ec_cbk_data_t *cbk;</div><div class='add'>+</div><div class='add'>+    switch (state) {</div><div class='add'>+        case EC_STATE_INIT:</div><div class='add'>+            if ((fop-&gt;int32 == F_SETLKW) &amp;&amp; (fop-&gt;flock.l_type != F_UNLCK)) {</div><div class='add'>+                fop-&gt;uint32 = EC_LOCK_MODE_ALL;</div><div class='add'>+                fop-&gt;int32 = F_SETLK;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            /* Fall through */</div><div class='add'>+</div><div class='add'>+        case EC_STATE_DISPATCH:</div><div class='add'>+            ec_dispatch_all(fop);</div><div class='add'>+</div><div class='add'>+            return EC_STATE_PREPARE_ANSWER;</div><div class='add'>+</div><div class='add'>+        case EC_STATE_PREPARE_ANSWER:</div><div class='add'>+        case -EC_STATE_PREPARE_ANSWER:</div><div class='add'>+            if (fop-&gt;flock.l_type != F_UNLCK) {</div><div class='add'>+                uintptr_t mask;</div><div class='add'>+</div><div class='add'>+                ec_fop_set_error(fop, ec_lock_check(fop, &amp;mask));</div><div class='add'>+                if (fop-&gt;error != 0) {</div><div class='add'>+                    if (mask != 0) {</div><div class='add'>+                        struct gf_flock flock = {0};</div><div class='add'>+</div><div class='add'>+                        flock.l_type = F_UNLCK;</div><div class='add'>+                        flock.l_whence = fop-&gt;flock.l_whence;</div><div class='add'>+                        flock.l_start = fop-&gt;flock.l_start;</div><div class='add'>+                        flock.l_len = fop-&gt;flock.l_len;</div><div class='add'>+                        flock.l_pid = fop-&gt;flock.l_pid;</div><div class='add'>+                        lk_owner_copy(&amp;flock.l_owner, &amp;fop-&gt;flock.l_owner);</div><div class='add'>+</div><div class='add'>+                        ec_lk(fop-&gt;frame, fop-&gt;xl, mask, 1, ec_lock_lk_unlocked,</div><div class='add'>+                              NULL, fop-&gt;fd, F_SETLK, &amp;flock, fop-&gt;xdata);</div><div class='add'>+                    }</div><div class='add'>+</div><div class='add'>+                    if (fop-&gt;error &lt; 0) {</div><div class='add'>+                        fop-&gt;error = 0;</div><div class='add'>+</div><div class='add'>+                        fop-&gt;int32 = F_SETLKW;</div><div class='add'>+</div><div class='add'>+                        ec_dispatch_inc(fop);</div><div class='add'>+</div><div class='add'>+                        return EC_STATE_PREPARE_ANSWER;</div><div class='add'>+                    }</div><div class='add'>+                }</div><div class='add'>+            } else {</div><div class='add'>+                ec_fop_prepare_answer(fop, _gf_true);</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            return EC_STATE_REPORT;</div><div class='add'>+</div><div class='add'>+        case EC_STATE_REPORT:</div><div class='add'>+            cbk = fop-&gt;answer;</div><div class='add'>+</div><div class='add'>+            GF_ASSERT(cbk != NULL);</div><div class='add'>+</div><div class='add'>+            if (fop-&gt;cbks.lk != NULL) {</div><div class='add'>+                fop-&gt;cbks.lk(fop-&gt;req_frame, fop, fop-&gt;xl, cbk-&gt;op_ret,</div><div class='add'>+                             cbk-&gt;op_errno, &amp;cbk-&gt;flock, cbk-&gt;xdata);</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            return EC_STATE_END;</div><div class='add'>+</div><div class='add'>+        case -EC_STATE_INIT:</div><div class='add'>+        case -EC_STATE_DISPATCH:</div><div class='add'>+        case -EC_STATE_REPORT:</div><div class='add'>+            GF_ASSERT(fop-&gt;error != 0);</div><div class='add'>+</div><div class='add'>+            if (fop-&gt;cbks.lk != NULL) {</div><div class='add'>+                fop-&gt;cbks.lk(fop-&gt;req_frame, fop, fop-&gt;xl, -1, fop-&gt;error, NULL,</div><div class='add'>+                             NULL);</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            return EC_STATE_END;</div><div class='add'>+</div><div class='add'>+        default:</div><div class='add'>+            gf_msg(fop-&gt;xl-&gt;name, GF_LOG_ERROR, EINVAL, EC_MSG_UNHANDLED_STATE,</div><div class='add'>+                   "Unhandled state %d for %s", state, ec_fop_name(fop-&gt;id));</div><div class='add'>+</div><div class='add'>+            return EC_STATE_END;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_lk(call_frame_t *frame, xlator_t *this, uintptr_t target, uint32_t fop_flags,</div><div class='add'>+      fop_lk_cbk_t func, void *data, fd_t *fd, int32_t cmd,</div><div class='add'>+      struct gf_flock *flock, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    ec_cbk_t callback = {.lk = func};</div><div class='add'>+    ec_fop_data_t *fop = NULL;</div><div class='add'>+    int32_t error = ENOMEM;</div><div class='add'>+</div><div class='add'>+    gf_msg_trace("ec", 0, "EC(LK) %p", frame);</div><div class='add'>+</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, frame, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, this-&gt;private, out);</div><div class='add'>+</div><div class='add'>+    fop = ec_fop_data_allocate(frame, this, GF_FOP_LK, 0, target, fop_flags,</div><div class='add'>+                               ec_wind_lk, ec_manager_lk, callback, data);</div><div class='add'>+    if (fop == NULL) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    fop-&gt;use_fd = 1;</div><div class='add'>+</div><div class='add'>+    fop-&gt;int32 = cmd;</div><div class='add'>+</div><div class='add'>+    if (fd != NULL) {</div><div class='add'>+        fop-&gt;fd = fd_ref(fd);</div><div class='add'>+        if (fop-&gt;fd == NULL) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, 0, EC_MSG_FILE_DESC_REF_FAIL,</div><div class='add'>+                   "Failed to reference a "</div><div class='add'>+                   "file descriptor.");</div><div class='add'>+</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    if (flock != NULL) {</div><div class='add'>+        fop-&gt;flock.l_type = flock-&gt;l_type;</div><div class='add'>+        fop-&gt;flock.l_whence = flock-&gt;l_whence;</div><div class='add'>+        fop-&gt;flock.l_start = flock-&gt;l_start;</div><div class='add'>+        fop-&gt;flock.l_len = flock-&gt;l_len;</div><div class='add'>+        fop-&gt;flock.l_pid = flock-&gt;l_pid;</div><div class='add'>+        fop-&gt;flock.l_owner.len = flock-&gt;l_owner.len;</div><div class='add'>+        if (flock-&gt;l_owner.len &gt; 0) {</div><div class='add'>+            memcpy(fop-&gt;flock.l_owner.data, flock-&gt;l_owner.data,</div><div class='add'>+                   flock-&gt;l_owner.len);</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    if (xdata != NULL) {</div><div class='add'>+        fop-&gt;xdata = dict_ref(xdata);</div><div class='add'>+        if (fop-&gt;xdata == NULL) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, 0, EC_MSG_DICT_REF_FAIL,</div><div class='add'>+                   "Failed to reference a "</div><div class='add'>+                   "dictionary.");</div><div class='add'>+</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    error = 0;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (fop != NULL) {</div><div class='add'>+        ec_manager(fop, error);</div><div class='add'>+    } else {</div><div class='add'>+        func(frame, NULL, this, -1, error, NULL, NULL);</div><div class='add'>+    }</div><div class='add'>+}</div><div class='head'>diff --git a/xlators/cluster/ec/src/ec-mem-types.h b/xlators/cluster/ec/src/ec-mem-types.h<br/>new file mode 100644<br/>index 00000000000..3252c4c1c58<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/xlators/cluster/ec/src/ec-mem-types.h?id=d1d7a6f35c816822fab51c820e25023863c239c1'>xlators/cluster/ec/src/ec-mem-types.h</a></div><div class='hunk'>@@ -0,0 +1,30 @@</div><div class='add'>+/*</div><div class='add'>+  Copyright (c) 2012-2014 DataLab, s.l. &lt;http://www.datalab.es&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#ifndef __EC_MEM_TYPES_H__</div><div class='add'>+#define __EC_MEM_TYPES_H__</div><div class='add'>+</div><div class='add'>+#include &lt;glusterfs/mem-types.h&gt;</div><div class='add'>+</div><div class='add'>+enum gf_ec_mem_types_ {</div><div class='add'>+    ec_mt_ec_t = gf_common_mt_end + 1,</div><div class='add'>+    ec_mt_xlator_t,</div><div class='add'>+    ec_mt_ec_inode_t,</div><div class='add'>+    ec_mt_ec_fd_t,</div><div class='add'>+    ec_mt_subvol_healer_t,</div><div class='add'>+    ec_mt_ec_gf_t,</div><div class='add'>+    ec_mt_ec_code_t,</div><div class='add'>+    ec_mt_ec_code_builder_t,</div><div class='add'>+    ec_mt_ec_matrix_t,</div><div class='add'>+    ec_mt_ec_stripe_t,</div><div class='add'>+    ec_mt_end</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+#endif /* __EC_MEM_TYPES_H__ */</div><div class='head'>diff --git a/xlators/cluster/ec/src/ec-messages.h b/xlators/cluster/ec/src/ec-messages.h<br/>new file mode 100644<br/>index 00000000000..72e98f11286<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/xlators/cluster/ec/src/ec-messages.h?id=d1d7a6f35c816822fab51c820e25023863c239c1'>xlators/cluster/ec/src/ec-messages.h</a></div><div class='hunk'>@@ -0,0 +1,61 @@</div><div class='add'>+/*</div><div class='add'>+  Copyright (c) 2015 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#ifndef _EC_MESSAGES_H_</div><div class='add'>+#define _EC_MESSAGES_H_</div><div class='add'>+</div><div class='add'>+#include &lt;glusterfs/glfs-message-id.h&gt;</div><div class='add'>+</div><div class='add'>+/* To add new message IDs, append new identifiers at the end of the list.</div><div class='add'>+ *</div><div class='add'>+ * Never remove a message ID. If it's not used anymore, you can rename it or</div><div class='add'>+ * leave it as it is, but not delete it. This is to prevent reutilization of</div><div class='add'>+ * IDs by other messages.</div><div class='add'>+ *</div><div class='add'>+ * The component name must match one of the entries defined in</div><div class='add'>+ * glfs-message-id.h.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+GLFS_MSGID(EC, EC_MSG_INVALID_CONFIG, EC_MSG_HEAL_FAIL,</div><div class='add'>+           EC_MSG_DICT_COMBINE_FAIL, EC_MSG_STIME_COMBINE_FAIL,</div><div class='add'>+           EC_MSG_INVALID_DICT_NUMS, EC_MSG_IATT_COMBINE_FAIL,</div><div class='add'>+           EC_MSG_INVALID_FORMAT, EC_MSG_DICT_GET_FAILED,</div><div class='add'>+           EC_MSG_UNHANDLED_STATE, EC_MSG_FILE_DESC_REF_FAIL,</div><div class='add'>+           EC_MSG_LOC_COPY_FAIL, EC_MSG_BUF_REF_FAIL, EC_MSG_DICT_REF_FAIL,</div><div class='add'>+           EC_MSG_LK_UNLOCK_FAILED, EC_MSG_UNLOCK_FAILED,</div><div class='add'>+           EC_MSG_LOC_PARENT_INODE_MISSING, EC_MSG_INVALID_LOC_NAME,</div><div class='add'>+           EC_MSG_NO_MEMORY, EC_MSG_GFID_MISMATCH, EC_MSG_UNSUPPORTED_VERSION,</div><div class='add'>+           EC_MSG_FD_CREATE_FAIL, EC_MSG_READDIRP_REQ_PREP_FAIL,</div><div class='add'>+           EC_MSG_LOOKUP_REQ_PREP_FAIL, EC_MSG_INODE_REF_FAIL,</div><div class='add'>+           EC_MSG_LOOKUP_READAHEAD_FAIL, EC_MSG_FRAME_MISMATCH,</div><div class='add'>+           EC_MSG_XLATOR_MISMATCH, EC_MSG_VECTOR_MISMATCH, EC_MSG_IATT_MISMATCH,</div><div class='add'>+           EC_MSG_FD_MISMATCH, EC_MSG_DICT_MISMATCH, EC_MSG_INDEX_DIR_GET_FAIL,</div><div class='add'>+           EC_MSG_PREOP_LOCK_FAILED, EC_MSG_CHILDS_INSUFFICIENT,</div><div class='add'>+           EC_MSG_OP_EXEC_UNAVAIL, EC_MSG_UNLOCK_DELAY_FAILED,</div><div class='add'>+           EC_MSG_SIZE_VERS_UPDATE_FAIL, EC_MSG_INVALID_REQUEST,</div><div class='add'>+           EC_MSG_INVALID_LOCK_TYPE, EC_MSG_SIZE_VERS_GET_FAIL,</div><div class='add'>+           EC_MSG_FILE_SIZE_GET_FAIL, EC_MSG_FOP_MISMATCH,</div><div class='add'>+           EC_MSG_SUBVOL_ID_DICT_SET_FAIL, EC_MSG_SUBVOL_BUILD_FAIL,</div><div class='add'>+           EC_MSG_XLATOR_INIT_FAIL, EC_MSG_NO_PARENTS, EC_MSG_TIMER_CREATE_FAIL,</div><div class='add'>+           EC_MSG_TOO_MANY_SUBVOLS, EC_MSG_DATA_UNAVAILABLE,</div><div class='add'>+           EC_MSG_INODE_REMOVE_FAIL, EC_MSG_INVALID_REDUNDANCY,</div><div class='add'>+           EC_MSG_XLATOR_PARSE_OPT_FAIL, EC_MSG_OP_FAIL_ON_SUBVOLS,</div><div class='add'>+           EC_MSG_INVALID_INODE, EC_MSG_LOCK_MISMATCH, EC_MSG_XDATA_MISMATCH,</div><div class='add'>+           EC_MSG_HEALING_INFO, EC_MSG_HEAL_SUCCESS, EC_MSG_FULL_SWEEP_START,</div><div class='add'>+           EC_MSG_FULL_SWEEP_STOP, EC_MSG_INVALID_FOP, EC_MSG_EC_UP,</div><div class='add'>+           EC_MSG_EC_DOWN, EC_MSG_SIZE_XATTR_GET_FAIL,</div><div class='add'>+           EC_MSG_VER_XATTR_GET_FAIL, EC_MSG_CONFIG_XATTR_GET_FAIL,</div><div class='add'>+           EC_MSG_CONFIG_XATTR_INVALID, EC_MSG_EXTENSION, EC_MSG_EXTENSION_NONE,</div><div class='add'>+           EC_MSG_EXTENSION_UNKNOWN, EC_MSG_EXTENSION_UNSUPPORTED,</div><div class='add'>+           EC_MSG_EXTENSION_FAILED, EC_MSG_NO_GF, EC_MSG_MATRIX_FAILED,</div><div class='add'>+           EC_MSG_DYN_CREATE_FAILED, EC_MSG_DYN_CODEGEN_FAILED,</div><div class='add'>+           EC_MSG_THREAD_CLEANUP_FAILED, EC_MSG_FD_BAD);</div><div class='add'>+</div><div class='add'>+#endif /* !_EC_MESSAGES_H_ */</div><div class='head'>diff --git a/xlators/cluster/ec/src/ec-method.c b/xlators/cluster/ec/src/ec-method.c<br/>new file mode 100644<br/>index 00000000000..55faed0b193<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/xlators/cluster/ec/src/ec-method.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>xlators/cluster/ec/src/ec-method.c</a></div><div class='hunk'>@@ -0,0 +1,433 @@</div><div class='add'>+/*</div><div class='add'>+  Copyright (c) 2012-2015 DataLab, s.l. &lt;http://www.datalab.es&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#include &lt;string.h&gt;</div><div class='add'>+#include &lt;inttypes.h&gt;</div><div class='add'>+</div><div class='add'>+#include "ec-types.h"</div><div class='add'>+#include "ec-mem-types.h"</div><div class='add'>+#include "ec-galois.h"</div><div class='add'>+#include "ec-code.h"</div><div class='add'>+#include "ec-method.h"</div><div class='add'>+#include "ec-helpers.h"</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+ec_method_matrix_normal(ec_gf_t *gf, uint32_t *matrix, uint32_t columns,</div><div class='add'>+                        uint32_t *values, uint32_t count)</div><div class='add'>+{</div><div class='add'>+    uint32_t i, j, v, tmp;</div><div class='add'>+</div><div class='add'>+    columns--;</div><div class='add'>+    for (i = 0; i &lt; count; i++) {</div><div class='add'>+        v = *values++;</div><div class='add'>+        *matrix++ = tmp = ec_gf_exp(gf, v, columns);</div><div class='add'>+        for (j = 0; j &lt; columns; j++) {</div><div class='add'>+            *matrix++ = tmp = ec_gf_div(gf, tmp, v);</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+ec_method_matrix_inverse(ec_gf_t *gf, uint32_t *matrix, uint32_t *values,</div><div class='add'>+                         uint32_t count)</div><div class='add'>+{</div><div class='add'>+    uint32_t a[count];</div><div class='add'>+    uint32_t i, j, p, last, tmp;</div><div class='add'>+</div><div class='add'>+    last = count - 1;</div><div class='add'>+    for (i = 0; i &lt; last; i++) {</div><div class='add'>+        a[i] = 1;</div><div class='add'>+    }</div><div class='add'>+    a[i] = values[0];</div><div class='add'>+    for (i = last; i &gt; 0; i--) {</div><div class='add'>+        for (j = i - 1; j &lt; last; j++) {</div><div class='add'>+            a[j] = a[j + 1] ^ ec_gf_mul(gf, values[i], a[j]);</div><div class='add'>+        }</div><div class='add'>+        a[j] = ec_gf_mul(gf, values[i], a[j]);</div><div class='add'>+    }</div><div class='add'>+    for (i = 0; i &lt; count; i++) {</div><div class='add'>+        p = a[0];</div><div class='add'>+        matrix += count;</div><div class='add'>+        *matrix = tmp = p ^ values[i];</div><div class='add'>+        for (j = 1; j &lt; last; j++) {</div><div class='add'>+            matrix += count;</div><div class='add'>+            *matrix = tmp = a[j] ^ ec_gf_mul(gf, values[i], tmp);</div><div class='add'>+            p = tmp ^ ec_gf_mul(gf, values[i], p);</div><div class='add'>+        }</div><div class='add'>+        for (j = 0; j &lt; last; j++) {</div><div class='add'>+            *matrix = ec_gf_div(gf, *matrix, p);</div><div class='add'>+            matrix -= count;</div><div class='add'>+        }</div><div class='add'>+        *matrix = ec_gf_div(gf, 1, p);</div><div class='add'>+        matrix++;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+ec_method_matrix_init(ec_matrix_list_t *list, ec_matrix_t *matrix,</div><div class='add'>+                      uintptr_t mask, uint32_t *rows, gf_boolean_t inverse)</div><div class='add'>+{</div><div class='add'>+    uint32_t i;</div><div class='add'>+</div><div class='add'>+    matrix-&gt;refs = 1;</div><div class='add'>+    matrix-&gt;mask = mask;</div><div class='add'>+    matrix-&gt;code = list-&gt;code;</div><div class='add'>+    matrix-&gt;columns = list-&gt;columns;</div><div class='add'>+    INIT_LIST_HEAD(&amp;matrix-&gt;lru);</div><div class='add'>+</div><div class='add'>+    if (inverse) {</div><div class='add'>+        matrix-&gt;rows = list-&gt;columns;</div><div class='add'>+        ec_method_matrix_inverse(matrix-&gt;code-&gt;gf, matrix-&gt;values, rows,</div><div class='add'>+                                 matrix-&gt;rows);</div><div class='add'>+        for (i = 0; i &lt; matrix-&gt;rows; i++) {</div><div class='add'>+            matrix-&gt;row_data[i].values = matrix-&gt;values + i * matrix-&gt;columns;</div><div class='add'>+            matrix-&gt;row_data[i].func.interleaved = ec_code_build_interleaved(</div><div class='add'>+                matrix-&gt;code, EC_METHOD_WORD_SIZE, matrix-&gt;row_data[i].values,</div><div class='add'>+                matrix-&gt;columns);</div><div class='add'>+        }</div><div class='add'>+    } else {</div><div class='add'>+        matrix-&gt;rows = list-&gt;rows;</div><div class='add'>+        ec_method_matrix_normal(matrix-&gt;code-&gt;gf, matrix-&gt;values,</div><div class='add'>+                                matrix-&gt;columns, rows, matrix-&gt;rows);</div><div class='add'>+        for (i = 0; i &lt; matrix-&gt;rows; i++) {</div><div class='add'>+            matrix-&gt;row_data[i].values = matrix-&gt;values + i * matrix-&gt;columns;</div><div class='add'>+            matrix-&gt;row_data[i].func.linear = ec_code_build_linear(</div><div class='add'>+                matrix-&gt;code, EC_METHOD_WORD_SIZE, matrix-&gt;row_data[i].values,</div><div class='add'>+                matrix-&gt;columns);</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+ec_method_matrix_release(ec_matrix_t *matrix)</div><div class='add'>+{</div><div class='add'>+    uint32_t i;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; matrix-&gt;rows; i++) {</div><div class='add'>+        if (matrix-&gt;row_data[i].func.linear != NULL) {</div><div class='add'>+            ec_code_release(matrix-&gt;code, &amp;matrix-&gt;row_data[i].func);</div><div class='add'>+            matrix-&gt;row_data[i].func.linear = NULL;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+ec_method_matrix_destroy(ec_matrix_list_t *list, ec_matrix_t *matrix)</div><div class='add'>+{</div><div class='add'>+    list_del_init(&amp;matrix-&gt;lru);</div><div class='add'>+</div><div class='add'>+    ec_method_matrix_release(matrix);</div><div class='add'>+</div><div class='add'>+    mem_put(matrix);</div><div class='add'>+</div><div class='add'>+    list-&gt;count--;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+ec_method_matrix_unref(ec_matrix_list_t *list, ec_matrix_t *matrix)</div><div class='add'>+{</div><div class='add'>+    if (--matrix-&gt;refs == 0) {</div><div class='add'>+        list_add_tail(&amp;matrix-&gt;lru, &amp;list-&gt;lru);</div><div class='add'>+        if (list-&gt;count &gt; list-&gt;max) {</div><div class='add'>+            matrix = list_first_entry(&amp;list-&gt;lru, ec_matrix_t, lru);</div><div class='add'>+            ec_method_matrix_destroy(list, matrix);</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static ec_matrix_t *</div><div class='add'>+ec_method_matrix_lookup(ec_matrix_list_t *list, uintptr_t mask, uint32_t *pos)</div><div class='add'>+{</div><div class='add'>+    ec_matrix_t *matrix;</div><div class='add'>+    uint32_t i, j, k;</div><div class='add'>+</div><div class='add'>+    i = 0;</div><div class='add'>+    j = list-&gt;count;</div><div class='add'>+    while (i &lt; j) {</div><div class='add'>+        k = (i + j) &gt;&gt; 1;</div><div class='add'>+        matrix = list-&gt;objects[k];</div><div class='add'>+        if (matrix-&gt;mask == mask) {</div><div class='add'>+            *pos = k;</div><div class='add'>+            return matrix;</div><div class='add'>+        }</div><div class='add'>+        if (matrix-&gt;mask &lt; mask) {</div><div class='add'>+            i = k + 1;</div><div class='add'>+        } else {</div><div class='add'>+            j = k;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    *pos = i;</div><div class='add'>+</div><div class='add'>+    return NULL;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+ec_method_matrix_remove(ec_matrix_list_t *list, uintptr_t mask)</div><div class='add'>+{</div><div class='add'>+    uint32_t pos;</div><div class='add'>+</div><div class='add'>+    if (ec_method_matrix_lookup(list, mask, &amp;pos) != NULL) {</div><div class='add'>+        list-&gt;count--;</div><div class='add'>+        if (pos &lt; list-&gt;count) {</div><div class='add'>+            memmove(list-&gt;objects + pos, list-&gt;objects + pos + 1,</div><div class='add'>+                    sizeof(ec_matrix_t *) * (list-&gt;count - pos));</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+ec_method_matrix_insert(ec_matrix_list_t *list, ec_matrix_t *matrix)</div><div class='add'>+{</div><div class='add'>+    uint32_t pos;</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(ec_method_matrix_lookup(list, matrix-&gt;mask, &amp;pos) == NULL);</div><div class='add'>+</div><div class='add'>+    if (pos &lt; list-&gt;count) {</div><div class='add'>+        memmove(list-&gt;objects + pos + 1, list-&gt;objects + pos,</div><div class='add'>+                sizeof(ec_matrix_t *) * (list-&gt;count - pos));</div><div class='add'>+    }</div><div class='add'>+    list-&gt;objects[pos] = matrix;</div><div class='add'>+    list-&gt;count++;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static ec_matrix_t *</div><div class='add'>+ec_method_matrix_get(ec_matrix_list_t *list, uintptr_t mask, uint32_t *rows)</div><div class='add'>+{</div><div class='add'>+    ec_matrix_t *matrix;</div><div class='add'>+    uint32_t pos;</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;list-&gt;lock);</div><div class='add'>+</div><div class='add'>+    matrix = ec_method_matrix_lookup(list, mask, &amp;pos);</div><div class='add'>+    if (matrix != NULL) {</div><div class='add'>+        list_del_init(&amp;matrix-&gt;lru);</div><div class='add'>+        matrix-&gt;refs++;</div><div class='add'>+</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if ((list-&gt;count &gt;= list-&gt;max) &amp;&amp; !list_empty(&amp;list-&gt;lru)) {</div><div class='add'>+        matrix = list_first_entry(&amp;list-&gt;lru, ec_matrix_t, lru);</div><div class='add'>+        list_del_init(&amp;matrix-&gt;lru);</div><div class='add'>+</div><div class='add'>+        ec_method_matrix_remove(list, matrix-&gt;mask);</div><div class='add'>+</div><div class='add'>+        ec_method_matrix_release(matrix);</div><div class='add'>+    } else {</div><div class='add'>+        matrix = mem_get0(list-&gt;pool);</div><div class='add'>+        if (matrix == NULL) {</div><div class='add'>+            matrix = EC_ERR(ENOMEM);</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+        matrix-&gt;values = (uint32_t *)((uintptr_t)matrix + sizeof(ec_matrix_t) +</div><div class='add'>+                                      sizeof(ec_matrix_row_t) * list-&gt;columns);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ec_method_matrix_init(list, matrix, mask, rows, _gf_true);</div><div class='add'>+</div><div class='add'>+    if (list-&gt;count &lt; list-&gt;max) {</div><div class='add'>+        ec_method_matrix_insert(list, matrix);</div><div class='add'>+    } else {</div><div class='add'>+        matrix-&gt;mask = 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    UNLOCK(&amp;list-&gt;lock);</div><div class='add'>+</div><div class='add'>+    return matrix;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+ec_method_matrix_put(ec_matrix_list_t *list, ec_matrix_t *matrix)</div><div class='add'>+{</div><div class='add'>+    LOCK(&amp;list-&gt;lock);</div><div class='add'>+</div><div class='add'>+    ec_method_matrix_unref(list, matrix);</div><div class='add'>+</div><div class='add'>+    UNLOCK(&amp;list-&gt;lock);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int32_t</div><div class='add'>+ec_method_setup(xlator_t *xl, ec_matrix_list_t *list, const char *gen)</div><div class='add'>+{</div><div class='add'>+    ec_matrix_t *matrix;</div><div class='add'>+    uint32_t values[list-&gt;rows];</div><div class='add'>+    uint32_t i;</div><div class='add'>+    int32_t err;</div><div class='add'>+</div><div class='add'>+    matrix = GF_MALLOC(sizeof(ec_matrix_t) +</div><div class='add'>+                           sizeof(ec_matrix_row_t) * list-&gt;rows +</div><div class='add'>+                           sizeof(uint32_t) * list-&gt;columns * list-&gt;rows,</div><div class='add'>+                       ec_mt_ec_matrix_t);</div><div class='add'>+    if (matrix == NULL) {</div><div class='add'>+        err = -ENOMEM;</div><div class='add'>+        goto failed;</div><div class='add'>+    }</div><div class='add'>+    memset(matrix, 0, sizeof(ec_matrix_t));</div><div class='add'>+    matrix-&gt;values = (uint32_t *)((uintptr_t)matrix + sizeof(ec_matrix_t) +</div><div class='add'>+                                  sizeof(ec_matrix_row_t) * list-&gt;rows);</div><div class='add'>+</div><div class='add'>+    list-&gt;code = ec_code_create(list-&gt;gf, ec_code_detect(xl, gen));</div><div class='add'>+    if (EC_IS_ERR(list-&gt;code)) {</div><div class='add'>+        err = EC_GET_ERR(list-&gt;code);</div><div class='add'>+        list-&gt;code = NULL;</div><div class='add'>+        goto failed_matrix;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; list-&gt;rows; i++) {</div><div class='add'>+        values[i] = i + 1;</div><div class='add'>+    }</div><div class='add'>+    ec_method_matrix_init(list, matrix, 0, values, _gf_false);</div><div class='add'>+</div><div class='add'>+    list-&gt;encode = matrix;</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+</div><div class='add'>+failed_matrix:</div><div class='add'>+    GF_FREE(matrix);</div><div class='add'>+failed:</div><div class='add'>+    return err;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_method_init(xlator_t *xl, ec_matrix_list_t *list, uint32_t columns,</div><div class='add'>+               uint32_t rows, uint32_t max, const char *gen)</div><div class='add'>+{</div><div class='add'>+    list-&gt;columns = columns;</div><div class='add'>+    list-&gt;rows = rows;</div><div class='add'>+    list-&gt;max = max;</div><div class='add'>+    list-&gt;stripe = EC_METHOD_CHUNK_SIZE * list-&gt;columns;</div><div class='add'>+    INIT_LIST_HEAD(&amp;list-&gt;lru);</div><div class='add'>+    int32_t err;</div><div class='add'>+</div><div class='add'>+    list-&gt;pool = mem_pool_new_fn(xl-&gt;ctx,</div><div class='add'>+                                 sizeof(ec_matrix_t) +</div><div class='add'>+                                     sizeof(ec_matrix_row_t) * columns +</div><div class='add'>+                                     sizeof(uint32_t) * columns * columns,</div><div class='add'>+                                 128, "ec_matrix_t");</div><div class='add'>+    if (list-&gt;pool == NULL) {</div><div class='add'>+        err = -ENOMEM;</div><div class='add'>+        goto failed;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    list-&gt;objects = GF_MALLOC(sizeof(ec_matrix_t *) * max, ec_mt_ec_matrix_t);</div><div class='add'>+    if (list-&gt;objects == NULL) {</div><div class='add'>+        err = -ENOMEM;</div><div class='add'>+        goto failed_pool;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    list-&gt;gf = ec_gf_prepare(EC_GF_BITS, EC_GF_MOD);</div><div class='add'>+    if (EC_IS_ERR(list-&gt;gf)) {</div><div class='add'>+        err = EC_GET_ERR(list-&gt;gf);</div><div class='add'>+        goto failed_objects;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    err = ec_method_setup(xl, list, gen);</div><div class='add'>+    if (err != 0) {</div><div class='add'>+        goto failed_gf;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    LOCK_INIT(&amp;list-&gt;lock);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+</div><div class='add'>+failed_gf:</div><div class='add'>+    ec_gf_destroy(list-&gt;gf);</div><div class='add'>+failed_objects:</div><div class='add'>+    GF_FREE(list-&gt;objects);</div><div class='add'>+failed_pool:</div><div class='add'>+    mem_pool_destroy(list-&gt;pool);</div><div class='add'>+failed:</div><div class='add'>+    list-&gt;pool = NULL;</div><div class='add'>+    list-&gt;objects = NULL;</div><div class='add'>+    list-&gt;gf = NULL;</div><div class='add'>+</div><div class='add'>+    return err;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_method_fini(ec_matrix_list_t *list)</div><div class='add'>+{</div><div class='add'>+    ec_matrix_t *matrix;</div><div class='add'>+</div><div class='add'>+    if (list-&gt;encode == NULL) {</div><div class='add'>+        return;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    while (!list_empty(&amp;list-&gt;lru)) {</div><div class='add'>+        matrix = list_first_entry(&amp;list-&gt;lru, ec_matrix_t, lru);</div><div class='add'>+        ec_method_matrix_destroy(list, matrix);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(list-&gt;count == 0);</div><div class='add'>+</div><div class='add'>+    if (list-&gt;pool) /*Init was successful*/</div><div class='add'>+        LOCK_DESTROY(&amp;list-&gt;lock);</div><div class='add'>+</div><div class='add'>+    ec_method_matrix_release(list-&gt;encode);</div><div class='add'>+    GF_FREE(list-&gt;encode);</div><div class='add'>+</div><div class='add'>+    ec_code_destroy(list-&gt;code);</div><div class='add'>+    ec_gf_destroy(list-&gt;gf);</div><div class='add'>+    GF_FREE(list-&gt;objects);</div><div class='add'>+</div><div class='add'>+    if (list-&gt;pool)</div><div class='add'>+        mem_pool_destroy(list-&gt;pool);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_method_update(xlator_t *xl, ec_matrix_list_t *list, const char *gen)</div><div class='add'>+{</div><div class='add'>+    /* TODO: Allow changing code generator */</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_method_encode(ec_matrix_list_t *list, uint64_t size, void *in, void **out)</div><div class='add'>+{</div><div class='add'>+    ec_matrix_t *matrix;</div><div class='add'>+    uint64_t pos;</div><div class='add'>+    uint32_t i;</div><div class='add'>+</div><div class='add'>+    matrix = list-&gt;encode;</div><div class='add'>+    for (pos = 0; pos &lt; size; pos += list-&gt;stripe) {</div><div class='add'>+        for (i = 0; i &lt; matrix-&gt;rows; i++) {</div><div class='add'>+            matrix-&gt;row_data[i].func.linear(</div><div class='add'>+                out[i], in, pos, matrix-&gt;row_data[i].values, list-&gt;columns);</div><div class='add'>+            out[i] += EC_METHOD_CHUNK_SIZE;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_method_decode(ec_matrix_list_t *list, uint64_t size, uintptr_t mask,</div><div class='add'>+                 uint32_t *rows, void **in, void *out)</div><div class='add'>+{</div><div class='add'>+    ec_matrix_t *matrix;</div><div class='add'>+    uint64_t pos;</div><div class='add'>+    uint32_t i;</div><div class='add'>+</div><div class='add'>+    matrix = ec_method_matrix_get(list, mask, rows);</div><div class='add'>+    if (EC_IS_ERR(matrix)) {</div><div class='add'>+        return EC_GET_ERR(matrix);</div><div class='add'>+    }</div><div class='add'>+    for (pos = 0; pos &lt; size; pos += EC_METHOD_CHUNK_SIZE) {</div><div class='add'>+        for (i = 0; i &lt; matrix-&gt;rows; i++) {</div><div class='add'>+            matrix-&gt;row_data[i].func.interleaved(</div><div class='add'>+                out, in, pos, matrix-&gt;row_data[i].values, list-&gt;columns);</div><div class='add'>+            out += EC_METHOD_CHUNK_SIZE;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ec_method_matrix_put(list, matrix);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='head'>diff --git a/xlators/cluster/ec/src/ec-method.h b/xlators/cluster/ec/src/ec-method.h<br/>new file mode 100644<br/>index 00000000000..f91233b2f88<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/xlators/cluster/ec/src/ec-method.h?id=d1d7a6f35c816822fab51c820e25023863c239c1'>xlators/cluster/ec/src/ec-method.h</a></div><div class='hunk'>@@ -0,0 +1,48 @@</div><div class='add'>+/*</div><div class='add'>+  Copyright (c) 2012-2015 DataLab, s.l. &lt;http://www.datalab.es&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#ifndef __EC_METHOD_H__</div><div class='add'>+#define __EC_METHOD_H__</div><div class='add'>+</div><div class='add'>+#include "ec-types.h"</div><div class='add'>+#include "ec-galois.h"</div><div class='add'>+</div><div class='add'>+#define EC_GF_BITS 8</div><div class='add'>+#define EC_GF_MOD 0x11D</div><div class='add'>+</div><div class='add'>+#define EC_GF_SIZE (1 &lt;&lt; EC_GF_BITS)</div><div class='add'>+</div><div class='add'>+/* Determines the maximum size of the matrix used to encode/decode data */</div><div class='add'>+#define EC_METHOD_MAX_FRAGMENTS 16</div><div class='add'>+/* Determines the maximum number of usable elements in the Galois Field */</div><div class='add'>+#define EC_METHOD_MAX_NODES (EC_GF_SIZE - 1)</div><div class='add'>+</div><div class='add'>+#define EC_METHOD_WORD_SIZE 64</div><div class='add'>+</div><div class='add'>+#define EC_METHOD_CHUNK_SIZE (EC_METHOD_WORD_SIZE * EC_GF_BITS)</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_method_init(xlator_t *xl, ec_matrix_list_t *list, uint32_t columns,</div><div class='add'>+               uint32_t rows, uint32_t max, const char *gen);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_method_fini(ec_matrix_list_t *list);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_method_update(xlator_t *xl, ec_matrix_list_t *list, const char *gen);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_method_encode(ec_matrix_list_t *list, uint64_t size, void *in, void **out);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_method_decode(ec_matrix_list_t *list, uint64_t size, uintptr_t mask,</div><div class='add'>+                 uint32_t *rows, void **in, void *out);</div><div class='add'>+</div><div class='add'>+#endif /* __EC_METHOD_H__ */</div><div class='head'>diff --git a/xlators/cluster/ec/src/ec-types.h b/xlators/cluster/ec/src/ec-types.h<br/>new file mode 100644<br/>index 00000000000..de9b89bb2c9<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/xlators/cluster/ec/src/ec-types.h?id=d1d7a6f35c816822fab51c820e25023863c239c1'>xlators/cluster/ec/src/ec-types.h</a></div><div class='hunk'>@@ -0,0 +1,690 @@</div><div class='add'>+/*</div><div class='add'>+  Copyright (c) 2015 DataLab, s.l. &lt;http://www.datalab.es&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#ifndef __EC_TYPES_H__</div><div class='add'>+#define __EC_TYPES_H__</div><div class='add'>+</div><div class='add'>+#include &lt;glusterfs/xlator.h&gt;</div><div class='add'>+#include &lt;glusterfs/timer.h&gt;</div><div class='add'>+#include "libxlator.h"</div><div class='add'>+#include &lt;glusterfs/atomic.h&gt;</div><div class='add'>+</div><div class='add'>+#define EC_GF_MAX_REGS 16</div><div class='add'>+</div><div class='add'>+enum _ec_heal_need;</div><div class='add'>+typedef enum _ec_heal_need ec_heal_need_t;</div><div class='add'>+</div><div class='add'>+enum _ec_stripe_part;</div><div class='add'>+typedef enum _ec_stripe_part ec_stripe_part_t;</div><div class='add'>+</div><div class='add'>+enum _ec_read_policy;</div><div class='add'>+typedef enum _ec_read_policy ec_read_policy_t;</div><div class='add'>+</div><div class='add'>+struct _ec_config;</div><div class='add'>+typedef struct _ec_config ec_config_t;</div><div class='add'>+</div><div class='add'>+struct _ec_fd;</div><div class='add'>+typedef struct _ec_fd ec_fd_t;</div><div class='add'>+</div><div class='add'>+struct _ec_fragment_range;</div><div class='add'>+typedef struct _ec_fragment_range ec_fragment_range_t;</div><div class='add'>+</div><div class='add'>+struct _ec_inode;</div><div class='add'>+typedef struct _ec_inode ec_inode_t;</div><div class='add'>+</div><div class='add'>+union _ec_cbk;</div><div class='add'>+typedef union _ec_cbk ec_cbk_t;</div><div class='add'>+</div><div class='add'>+struct _ec_lock;</div><div class='add'>+typedef struct _ec_lock ec_lock_t;</div><div class='add'>+</div><div class='add'>+struct _ec_lock_link;</div><div class='add'>+typedef struct _ec_lock_link ec_lock_link_t;</div><div class='add'>+</div><div class='add'>+struct _ec_fop_data;</div><div class='add'>+typedef struct _ec_fop_data ec_fop_data_t;</div><div class='add'>+</div><div class='add'>+struct _ec_cbk_data;</div><div class='add'>+typedef struct _ec_cbk_data ec_cbk_data_t;</div><div class='add'>+</div><div class='add'>+enum _ec_gf_opcode;</div><div class='add'>+typedef enum _ec_gf_opcode ec_gf_opcode_t;</div><div class='add'>+</div><div class='add'>+struct _ec_gf_op;</div><div class='add'>+typedef struct _ec_gf_op ec_gf_op_t;</div><div class='add'>+</div><div class='add'>+struct _ec_gf_mul;</div><div class='add'>+typedef struct _ec_gf_mul ec_gf_mul_t;</div><div class='add'>+</div><div class='add'>+struct _ec_gf;</div><div class='add'>+typedef struct _ec_gf ec_gf_t;</div><div class='add'>+</div><div class='add'>+struct _ec_code_gen;</div><div class='add'>+typedef struct _ec_code_gen ec_code_gen_t;</div><div class='add'>+</div><div class='add'>+struct _ec_code;</div><div class='add'>+typedef struct _ec_code ec_code_t;</div><div class='add'>+</div><div class='add'>+struct _ec_code_arg;</div><div class='add'>+typedef struct _ec_code_arg ec_code_arg_t;</div><div class='add'>+</div><div class='add'>+struct _ec_code_op;</div><div class='add'>+typedef struct _ec_code_op ec_code_op_t;</div><div class='add'>+</div><div class='add'>+struct _ec_code_builder;</div><div class='add'>+typedef struct _ec_code_builder ec_code_builder_t;</div><div class='add'>+</div><div class='add'>+struct _ec_code_chunk;</div><div class='add'>+typedef struct _ec_code_chunk ec_code_chunk_t;</div><div class='add'>+</div><div class='add'>+struct _ec_stripe;</div><div class='add'>+typedef struct _ec_stripe ec_stripe_t;</div><div class='add'>+</div><div class='add'>+struct _ec_stripe_list;</div><div class='add'>+typedef struct _ec_stripe_list ec_stripe_list_t;</div><div class='add'>+</div><div class='add'>+struct _ec_code_space;</div><div class='add'>+typedef struct _ec_code_space ec_code_space_t;</div><div class='add'>+</div><div class='add'>+typedef void (*ec_code_func_linear_t)(void *dst, void *src, uint64_t offset,</div><div class='add'>+                                      uint32_t *values, uint32_t count);</div><div class='add'>+</div><div class='add'>+typedef void (*ec_code_func_interleaved_t)(void *dst, void **src,</div><div class='add'>+                                           uint64_t offset, uint32_t *values,</div><div class='add'>+                                           uint32_t count);</div><div class='add'>+</div><div class='add'>+union _ec_code_func;</div><div class='add'>+typedef union _ec_code_func ec_code_func_t;</div><div class='add'>+</div><div class='add'>+struct _ec_matrix_row;</div><div class='add'>+typedef struct _ec_matrix_row ec_matrix_row_t;</div><div class='add'>+</div><div class='add'>+struct _ec_matrix;</div><div class='add'>+typedef struct _ec_matrix ec_matrix_t;</div><div class='add'>+</div><div class='add'>+struct _ec_matrix_list;</div><div class='add'>+typedef struct _ec_matrix_list ec_matrix_list_t;</div><div class='add'>+</div><div class='add'>+struct _ec_heal;</div><div class='add'>+typedef struct _ec_heal ec_heal_t;</div><div class='add'>+</div><div class='add'>+struct _ec_self_heald;</div><div class='add'>+typedef struct _ec_self_heald ec_self_heald_t;</div><div class='add'>+</div><div class='add'>+struct _ec_statistics;</div><div class='add'>+typedef struct _ec_statistics ec_statistics_t;</div><div class='add'>+</div><div class='add'>+struct _ec;</div><div class='add'>+typedef struct _ec ec_t;</div><div class='add'>+</div><div class='add'>+typedef void (*ec_wind_f)(ec_t *, ec_fop_data_t *, int32_t);</div><div class='add'>+typedef int32_t (*ec_handler_f)(ec_fop_data_t *, int32_t);</div><div class='add'>+typedef void (*ec_resume_f)(ec_fop_data_t *, int32_t);</div><div class='add'>+</div><div class='add'>+enum _ec_read_policy { EC_ROUND_ROBIN, EC_GFID_HASH, EC_READ_POLICY_MAX };</div><div class='add'>+</div><div class='add'>+enum _ec_heal_need {</div><div class='add'>+    EC_HEAL_NONEED,</div><div class='add'>+    EC_HEAL_MAYBE,</div><div class='add'>+    EC_HEAL_MUST,</div><div class='add'>+    EC_HEAL_PURGE_INDEX</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+enum _ec_stripe_part { EC_STRIPE_HEAD, EC_STRIPE_TAIL };</div><div class='add'>+</div><div class='add'>+/* Enumartions to indicate FD status. */</div><div class='add'>+typedef enum { EC_FD_NOT_OPENED, EC_FD_OPENED, EC_FD_OPENING } ec_fd_status_t;</div><div class='add'>+</div><div class='add'>+struct _ec_config {</div><div class='add'>+    uint32_t version;</div><div class='add'>+    uint8_t algorithm;</div><div class='add'>+    uint8_t gf_word_size;</div><div class='add'>+    uint8_t bricks;</div><div class='add'>+    uint8_t redundancy;</div><div class='add'>+    uint32_t chunk_size;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct _ec_fd {</div><div class='add'>+    loc_t loc;</div><div class='add'>+    uintptr_t open;</div><div class='add'>+    int32_t flags;</div><div class='add'>+    uint64_t bad_version;</div><div class='add'>+    ec_fd_status_t fd_status[0];</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct _ec_stripe {</div><div class='add'>+    struct list_head lru; /* LRU list member */</div><div class='add'>+    uint64_t frag_offset; /* Fragment offset of this stripe */</div><div class='add'>+    char data[];          /* Contents of the stripe */</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct _ec_stripe_list {</div><div class='add'>+    struct list_head lru;</div><div class='add'>+    uint32_t count;</div><div class='add'>+    uint32_t max;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct _ec_inode {</div><div class='add'>+    ec_lock_t *inode_lock;</div><div class='add'>+    gf_boolean_t have_info;</div><div class='add'>+    gf_boolean_t have_config;</div><div class='add'>+    gf_boolean_t have_version;</div><div class='add'>+    gf_boolean_t have_size;</div><div class='add'>+    int32_t heal_count;</div><div class='add'>+    ec_config_t config;</div><div class='add'>+    uint64_t pre_version[2];</div><div class='add'>+    uint64_t post_version[2];</div><div class='add'>+    uint64_t pre_size;</div><div class='add'>+    uint64_t post_size;</div><div class='add'>+    uint64_t dirty[2];</div><div class='add'>+    struct list_head heal;</div><div class='add'>+    ec_stripe_list_t stripe_cache;</div><div class='add'>+    uint64_t bad_version;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+typedef int32_t (*fop_heal_cbk_t)(call_frame_t *, void *, xlator_t *, int32_t,</div><div class='add'>+                                  int32_t, uintptr_t, uintptr_t, uintptr_t,</div><div class='add'>+                                  uint32_t, dict_t *);</div><div class='add'>+typedef int32_t (*fop_fheal_cbk_t)(call_frame_t *, void *, xlator_t *, int32_t,</div><div class='add'>+                                   int32_t, uintptr_t, uintptr_t, uintptr_t,</div><div class='add'>+                                   uint32_t, dict_t *);</div><div class='add'>+</div><div class='add'>+union _ec_cbk {</div><div class='add'>+    fop_access_cbk_t access;</div><div class='add'>+    fop_create_cbk_t create;</div><div class='add'>+    fop_discard_cbk_t discard;</div><div class='add'>+    fop_entrylk_cbk_t entrylk;</div><div class='add'>+    fop_fentrylk_cbk_t fentrylk;</div><div class='add'>+    fop_fallocate_cbk_t fallocate;</div><div class='add'>+    fop_flush_cbk_t flush;</div><div class='add'>+    fop_fsync_cbk_t fsync;</div><div class='add'>+    fop_fsyncdir_cbk_t fsyncdir;</div><div class='add'>+    fop_getxattr_cbk_t getxattr;</div><div class='add'>+    fop_fgetxattr_cbk_t fgetxattr;</div><div class='add'>+    fop_heal_cbk_t heal;</div><div class='add'>+    fop_fheal_cbk_t fheal;</div><div class='add'>+    fop_inodelk_cbk_t inodelk;</div><div class='add'>+    fop_finodelk_cbk_t finodelk;</div><div class='add'>+    fop_link_cbk_t link;</div><div class='add'>+    fop_lk_cbk_t lk;</div><div class='add'>+    fop_lookup_cbk_t lookup;</div><div class='add'>+    fop_mkdir_cbk_t mkdir;</div><div class='add'>+    fop_mknod_cbk_t mknod;</div><div class='add'>+    fop_open_cbk_t open;</div><div class='add'>+    fop_opendir_cbk_t opendir;</div><div class='add'>+    fop_readdir_cbk_t readdir;</div><div class='add'>+    fop_readdirp_cbk_t readdirp;</div><div class='add'>+    fop_readlink_cbk_t readlink;</div><div class='add'>+    fop_readv_cbk_t readv;</div><div class='add'>+    fop_removexattr_cbk_t removexattr;</div><div class='add'>+    fop_fremovexattr_cbk_t fremovexattr;</div><div class='add'>+    fop_rename_cbk_t rename;</div><div class='add'>+    fop_rmdir_cbk_t rmdir;</div><div class='add'>+    fop_setattr_cbk_t setattr;</div><div class='add'>+    fop_fsetattr_cbk_t fsetattr;</div><div class='add'>+    fop_setxattr_cbk_t setxattr;</div><div class='add'>+    fop_fsetxattr_cbk_t fsetxattr;</div><div class='add'>+    fop_stat_cbk_t stat;</div><div class='add'>+    fop_fstat_cbk_t fstat;</div><div class='add'>+    fop_statfs_cbk_t statfs;</div><div class='add'>+    fop_symlink_cbk_t symlink;</div><div class='add'>+    fop_truncate_cbk_t truncate;</div><div class='add'>+    fop_ftruncate_cbk_t ftruncate;</div><div class='add'>+    fop_unlink_cbk_t unlink;</div><div class='add'>+    fop_writev_cbk_t writev;</div><div class='add'>+    fop_xattrop_cbk_t xattrop;</div><div class='add'>+    fop_fxattrop_cbk_t fxattrop;</div><div class='add'>+    fop_zerofill_cbk_t zerofill;</div><div class='add'>+    fop_seek_cbk_t seek;</div><div class='add'>+    fop_ipc_cbk_t ipc;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct _ec_lock {</div><div class='add'>+    ec_inode_t *ctx;</div><div class='add'>+    gf_timer_t *timer;</div><div class='add'>+</div><div class='add'>+    /* List of owners of this lock. All fops added to this list are running</div><div class='add'>+     * concurrently. */</div><div class='add'>+    struct list_head owners;</div><div class='add'>+</div><div class='add'>+    /* List of fops waiting to be an owner of the lock. Fops are added to this</div><div class='add'>+     * list when the current owner has an incompatible access (conflicting lock)</div><div class='add'>+     * or the lock is not acquired yet. */</div><div class='add'>+    struct list_head waiting;</div><div class='add'>+</div><div class='add'>+    /* List of fops that will wait until the next unlock/lock cycle. This</div><div class='add'>+     * happens when the currently acquired lock is decided to be released as</div><div class='add'>+     * soon as possible. In this case, all frozen fops will be continued only</div><div class='add'>+     * after the lock is reacquired. */</div><div class='add'>+    struct list_head frozen;</div><div class='add'>+</div><div class='add'>+    uintptr_t mask;</div><div class='add'>+    uintptr_t good_mask;</div><div class='add'>+    uintptr_t healing;</div><div class='add'>+    uint32_t refs_owners;   /* Refs for fops owning the lock */</div><div class='add'>+    uint32_t refs_pending;  /* Refs assigned to fops being prepared */</div><div class='add'>+    uint32_t waiting_flags; /*Track xattrop/dirty marking*/</div><div class='add'>+    gf_boolean_t acquired;</div><div class='add'>+    gf_boolean_t contention;</div><div class='add'>+    gf_boolean_t unlock_now;</div><div class='add'>+    gf_boolean_t release;</div><div class='add'>+    gf_boolean_t query;</div><div class='add'>+    fd_t *fd;</div><div class='add'>+    loc_t loc;</div><div class='add'>+    union {</div><div class='add'>+        entrylk_type type;</div><div class='add'>+        struct gf_flock flock;</div><div class='add'>+    };</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct _ec_lock_link {</div><div class='add'>+    ec_lock_t *lock;</div><div class='add'>+    ec_fop_data_t *fop;</div><div class='add'>+    struct list_head owner_list;</div><div class='add'>+    struct list_head wait_list;</div><div class='add'>+    gf_boolean_t update[2];</div><div class='add'>+    gf_boolean_t dirty[2];</div><div class='add'>+    gf_boolean_t optimistic_changelog;</div><div class='add'>+    loc_t *base;</div><div class='add'>+    uint64_t size;</div><div class='add'>+    uint32_t waiting_flags;</div><div class='add'>+    off_t fl_start;</div><div class='add'>+    off_t fl_end;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+/* This structure keeps a range of fragment offsets affected by a fop. Since</div><div class='add'>+ * real file offsets can be difficult to handle correctly because of overflows,</div><div class='add'>+ * we use the 'scaled' offset, which corresponds to the offset of the fragment</div><div class='add'>+ * seen by the bricks, which is always smaller and cannot overflow. */</div><div class='add'>+struct _ec_fragment_range {</div><div class='add'>+    uint64_t first; /* Address of the first affected fragment as seen by the</div><div class='add'>+                       bricks (offset on brick) */</div><div class='add'>+    uint64_t last;  /* Address of the first non affected fragment as seen by</div><div class='add'>+                       the bricks (offset on brick) */</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+/* EC xlator data structure to collect all the data required to perform</div><div class='add'>+ * the file operation.*/</div><div class='add'>+struct _ec_fop_data {</div><div class='add'>+    int32_t id; /* ID of the file operation */</div><div class='add'>+    int32_t refs;</div><div class='add'>+    int32_t state;</div><div class='add'>+    uint32_t minimum; /* Minimum number of successful</div><div class='add'>+                         operation required to conclude a</div><div class='add'>+                         fop as successful */</div><div class='add'>+    int32_t expected;</div><div class='add'>+    int32_t winds;</div><div class='add'>+    int32_t jobs;</div><div class='add'>+    int32_t error;</div><div class='add'>+    ec_fop_data_t *parent;</div><div class='add'>+    xlator_t *xl;                  /* points to EC xlator */</div><div class='add'>+    call_frame_t *req_frame;       /* frame of the calling xlator */</div><div class='add'>+    call_frame_t *frame;           /* frame used by this fop */</div><div class='add'>+    struct list_head cbk_list;     /* sorted list of groups of answers */</div><div class='add'>+    struct list_head answer_list;  /* list of answers */</div><div class='add'>+    struct list_head pending_list; /* member of ec_t.pending_fops */</div><div class='add'>+    ec_cbk_data_t *answer;         /* accepted answer */</div><div class='add'>+    int32_t lock_count;</div><div class='add'>+    int32_t locked;</div><div class='add'>+    gf_lock_t lock;</div><div class='add'>+    ec_lock_link_t locks[2];</div><div class='add'>+    int32_t first_lock;</div><div class='add'>+</div><div class='add'>+    uint32_t fop_flags; /* Flags passed by the caller. */</div><div class='add'>+    uint32_t flags;     /* Internal flags. */</div><div class='add'>+    uint32_t first;</div><div class='add'>+    uintptr_t mask;</div><div class='add'>+    uintptr_t healing; /*Dispatch is done but call is successful only</div><div class='add'>+                         if fop-&gt;minimum number of subvolumes succeed</div><div class='add'>+                         which are not healing*/</div><div class='add'>+    uintptr_t remaining;</div><div class='add'>+    uintptr_t received; /* Mask of responses */</div><div class='add'>+    uintptr_t good;</div><div class='add'>+</div><div class='add'>+    uid_t uid;</div><div class='add'>+    gid_t gid;</div><div class='add'>+</div><div class='add'>+    ec_wind_f wind;       /* Function to wind to */</div><div class='add'>+    ec_handler_f handler; /* FOP manager function */</div><div class='add'>+    ec_resume_f resume;</div><div class='add'>+    ec_cbk_t cbks; /* Callback function for this FOP */</div><div class='add'>+    void *data;</div><div class='add'>+    ec_heal_t *heal;</div><div class='add'>+    struct list_head healer;</div><div class='add'>+</div><div class='add'>+    uint64_t user_size;</div><div class='add'>+    uint32_t head;</div><div class='add'>+</div><div class='add'>+    int32_t use_fd; /* Indicates whether this FOP uses FD or</div><div class='add'>+                       not */</div><div class='add'>+</div><div class='add'>+    dict_t *xdata;</div><div class='add'>+    dict_t *dict;</div><div class='add'>+    int32_t int32;</div><div class='add'>+    uint32_t uint32;</div><div class='add'>+    uint64_t size;</div><div class='add'>+    off_t offset;</div><div class='add'>+    mode_t mode[2];</div><div class='add'>+    entrylk_cmd entrylk_cmd;</div><div class='add'>+    entrylk_type entrylk_type;</div><div class='add'>+    gf_xattrop_flags_t xattrop_flags;</div><div class='add'>+    dev_t dev;</div><div class='add'>+    inode_t *inode;</div><div class='add'>+    fd_t *fd; /* FD of the file on which FOP is</div><div class='add'>+                 being carried upon */</div><div class='add'>+    struct iatt iatt;</div><div class='add'>+    char *str[2];</div><div class='add'>+    loc_t loc[2]; /* Holds the location details for</div><div class='add'>+                     the file */</div><div class='add'>+    struct gf_flock flock;</div><div class='add'>+    struct iovec *vector;</div><div class='add'>+    struct iobref *buffers;</div><div class='add'>+    gf_seek_what_t seek;</div><div class='add'>+    ec_fragment_range_t frag_range; /* This will hold the range of stripes</div><div class='add'>+                                        affected by the fop. */</div><div class='add'>+    char *errstr;                   /*String of fop name, path and gfid</div><div class='add'>+                                     to be used in gf_msg. */</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct _ec_cbk_data {</div><div class='add'>+    struct list_head list;        /* item in the sorted list of groups */</div><div class='add'>+    struct list_head answer_list; /* item in the list of answers */</div><div class='add'>+    ec_fop_data_t *fop;</div><div class='add'>+    ec_cbk_data_t *next; /* next answer in the same group */</div><div class='add'>+    uint32_t idx;</div><div class='add'>+    int32_t op_ret;</div><div class='add'>+    int32_t op_errno;</div><div class='add'>+    int32_t count;</div><div class='add'>+    uintptr_t mask;</div><div class='add'>+</div><div class='add'>+    dict_t *xdata;</div><div class='add'>+    dict_t *dict;</div><div class='add'>+    int32_t int32;</div><div class='add'>+    uintptr_t uintptr[3];</div><div class='add'>+    uint64_t size;</div><div class='add'>+    uint64_t version[2];</div><div class='add'>+    inode_t *inode;</div><div class='add'>+    fd_t *fd;</div><div class='add'>+    struct statvfs statvfs;</div><div class='add'>+    struct iatt iatt[5];</div><div class='add'>+    struct gf_flock flock;</div><div class='add'>+    struct iovec *vector;</div><div class='add'>+    struct iobref *buffers;</div><div class='add'>+    char *str;</div><div class='add'>+    gf_dirent_t entries;</div><div class='add'>+    off_t offset;</div><div class='add'>+    gf_seek_what_t what;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+enum _ec_gf_opcode {</div><div class='add'>+    EC_GF_OP_LOAD,</div><div class='add'>+    EC_GF_OP_STORE,</div><div class='add'>+    EC_GF_OP_COPY,</div><div class='add'>+    EC_GF_OP_XOR2,</div><div class='add'>+    EC_GF_OP_XOR3,</div><div class='add'>+    EC_GF_OP_XORM,</div><div class='add'>+    EC_GF_OP_END</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct _ec_gf_op {</div><div class='add'>+    ec_gf_opcode_t op;</div><div class='add'>+    uint32_t arg1;</div><div class='add'>+    uint32_t arg2;</div><div class='add'>+    uint32_t arg3;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct _ec_gf_mul {</div><div class='add'>+    uint32_t regs;</div><div class='add'>+    uint32_t map[EC_GF_MAX_REGS];</div><div class='add'>+    ec_gf_op_t *ops;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct _ec_gf {</div><div class='add'>+    uint32_t bits;</div><div class='add'>+    uint32_t size;</div><div class='add'>+    uint32_t mod;</div><div class='add'>+    uint32_t min_ops;</div><div class='add'>+    uint32_t max_ops;</div><div class='add'>+    uint32_t avg_ops;</div><div class='add'>+    uint32_t *log;</div><div class='add'>+    uint32_t *pow;</div><div class='add'>+    ec_gf_mul_t **table;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct _ec_code_gen {</div><div class='add'>+    char *name;</div><div class='add'>+    char **flags;</div><div class='add'>+    uint32_t width;</div><div class='add'>+</div><div class='add'>+    void (*prolog)(ec_code_builder_t *builder);</div><div class='add'>+    void (*epilog)(ec_code_builder_t *builder);</div><div class='add'>+    void (*load)(ec_code_builder_t *builder, uint32_t reg, uint32_t offset,</div><div class='add'>+                 uint32_t bit);</div><div class='add'>+    void (*store)(ec_code_builder_t *builder, uint32_t reg, uint32_t bit);</div><div class='add'>+    void (*copy)(ec_code_builder_t *builder, uint32_t dst, uint32_t src);</div><div class='add'>+    void (*xor2)(ec_code_builder_t *builder, uint32_t dst, uint32_t src);</div><div class='add'>+    void (*xor3)(ec_code_builder_t *builder, uint32_t dst, uint32_t src1,</div><div class='add'>+                 uint32_t src2);</div><div class='add'>+    void (*xorm)(ec_code_builder_t *builder, uint32_t dst, uint32_t offset,</div><div class='add'>+                 uint32_t bit);</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct _ec_code {</div><div class='add'>+    gf_lock_t lock;</div><div class='add'>+    struct list_head spaces;</div><div class='add'>+    ec_gf_t *gf;</div><div class='add'>+    ec_code_gen_t *gen;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct _ec_code_arg {</div><div class='add'>+    uint32_t value;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct _ec_code_op {</div><div class='add'>+    ec_gf_opcode_t op;</div><div class='add'>+    ec_code_arg_t arg1;</div><div class='add'>+    ec_code_arg_t arg2;</div><div class='add'>+    ec_code_arg_t arg3;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct _ec_code_builder {</div><div class='add'>+    ec_code_t *code;</div><div class='add'>+    uint64_t address;</div><div class='add'>+    uint8_t *data;</div><div class='add'>+    uint32_t size;</div><div class='add'>+    int32_t error;</div><div class='add'>+    uint32_t regs;</div><div class='add'>+    uint32_t bits;</div><div class='add'>+    uint32_t width;</div><div class='add'>+    uint32_t count;</div><div class='add'>+    uint32_t base;</div><div class='add'>+    uint32_t map[EC_GF_MAX_REGS];</div><div class='add'>+    gf_boolean_t linear;</div><div class='add'>+    uint64_t loop;</div><div class='add'>+    ec_code_op_t ops[0];</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct _ec_code_chunk {</div><div class='add'>+    struct list_head list;</div><div class='add'>+    size_t size;</div><div class='add'>+    ec_code_space_t *space;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct _ec_code_space {</div><div class='add'>+    struct list_head list;</div><div class='add'>+    struct list_head chunks;</div><div class='add'>+    ec_code_t *code;</div><div class='add'>+    void *exec;</div><div class='add'>+    size_t size;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+union _ec_code_func {</div><div class='add'>+    ec_code_func_linear_t linear;</div><div class='add'>+    ec_code_func_interleaved_t interleaved;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct _ec_matrix_row {</div><div class='add'>+    ec_code_func_t func;</div><div class='add'>+    uint32_t *values;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct _ec_matrix {</div><div class='add'>+    struct list_head lru;</div><div class='add'>+    uint32_t refs;</div><div class='add'>+    uint32_t columns;</div><div class='add'>+    uint32_t rows;</div><div class='add'>+    uintptr_t mask;</div><div class='add'>+    ec_code_t *code;</div><div class='add'>+    uint32_t *values;</div><div class='add'>+    ec_matrix_row_t row_data[0];</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct _ec_matrix_list {</div><div class='add'>+    struct list_head lru;</div><div class='add'>+    gf_lock_t lock;</div><div class='add'>+    uint32_t columns;</div><div class='add'>+    uint32_t rows;</div><div class='add'>+    uint32_t max;</div><div class='add'>+    uint32_t count;</div><div class='add'>+    uint32_t stripe;</div><div class='add'>+    struct mem_pool *pool;</div><div class='add'>+    ec_gf_t *gf;</div><div class='add'>+    ec_code_t *code;</div><div class='add'>+    ec_matrix_t *encode;</div><div class='add'>+    ec_matrix_t **objects;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct _ec_heal {</div><div class='add'>+    struct list_head list;</div><div class='add'>+    gf_lock_t lock;</div><div class='add'>+    xlator_t *xl;</div><div class='add'>+    ec_fop_data_t *fop;</div><div class='add'>+    void *data;</div><div class='add'>+    ec_fop_data_t *lookup;</div><div class='add'>+    loc_t loc;</div><div class='add'>+    struct iatt iatt;</div><div class='add'>+    char *symlink;</div><div class='add'>+    fd_t *fd;</div><div class='add'>+    int32_t partial;</div><div class='add'>+    int32_t done;</div><div class='add'>+    int32_t error;</div><div class='add'>+    gf_boolean_t nameheal;</div><div class='add'>+    uintptr_t available;</div><div class='add'>+    uintptr_t good;</div><div class='add'>+    uintptr_t bad;</div><div class='add'>+    uintptr_t open;</div><div class='add'>+    uintptr_t fixed;</div><div class='add'>+    uint64_t offset;</div><div class='add'>+    uint64_t size;</div><div class='add'>+    uint64_t total_size;</div><div class='add'>+    uint64_t version[2];</div><div class='add'>+    uint64_t raw_size;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct subvol_healer {</div><div class='add'>+    xlator_t *this;</div><div class='add'>+    int subvol;</div><div class='add'>+    gf_boolean_t running;</div><div class='add'>+    gf_boolean_t rerun;</div><div class='add'>+    pthread_mutex_t mutex;</div><div class='add'>+    pthread_cond_t cond;</div><div class='add'>+    pthread_t thread;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct _ec_self_heald {</div><div class='add'>+    gf_boolean_t iamshd;</div><div class='add'>+    gf_boolean_t enabled;</div><div class='add'>+    int timeout;</div><div class='add'>+    uint32_t max_threads;</div><div class='add'>+    uint32_t wait_qlength;</div><div class='add'>+    struct subvol_healer *index_healers;</div><div class='add'>+    struct subvol_healer *full_healers;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct _ec_statistics {</div><div class='add'>+    struct {</div><div class='add'>+        gf_atomic_t hits;    /* Cache hits. */</div><div class='add'>+        gf_atomic_t misses;  /* Cache misses. */</div><div class='add'>+        gf_atomic_t updates; /* Number of times an existing stripe has</div><div class='add'>+                                been updated with new content. */</div><div class='add'>+        gf_atomic_t invals;  /* Number of times an existing stripe has</div><div class='add'>+                                been invalidated because of truncates</div><div class='add'>+                                or discards. */</div><div class='add'>+        gf_atomic_t evicts;  /* Number of times that an existing entry</div><div class='add'>+                                has been evicted to make room for newer</div><div class='add'>+                                entries. */</div><div class='add'>+        gf_atomic_t allocs;  /* Number of memory allocations made to</div><div class='add'>+                                store stripes. */</div><div class='add'>+        gf_atomic_t errors;  /* Number of errors that have caused extra</div><div class='add'>+                                requests. (Basically memory allocation</div><div class='add'>+                                errors). */</div><div class='add'>+    } stripe_cache;</div><div class='add'>+    struct {</div><div class='add'>+        gf_atomic_t attempted; /*Number of heals attempted on</div><div class='add'>+                                files/directories*/</div><div class='add'>+        gf_atomic_t completed; /*Number of heals complted on files/directories*/</div><div class='add'>+    } shd;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct _ec {</div><div class='add'>+    xlator_t *xl;</div><div class='add'>+    int32_t healers;</div><div class='add'>+    int32_t heal_waiters;</div><div class='add'>+    int32_t nodes; /* Total number of bricks(n) */</div><div class='add'>+    int32_t bits_for_nodes;</div><div class='add'>+    int32_t fragments;      /* Data bricks(k) */</div><div class='add'>+    int32_t redundancy;     /* Redundant bricks(m) */</div><div class='add'>+    uint32_t fragment_size; /* Size of fragment/chunk on a</div><div class='add'>+                               brick. */</div><div class='add'>+    uint32_t stripe_size;   /* (fragment_size * fragments)</div><div class='add'>+                               maximum size of user data</div><div class='add'>+                               stored in one stripe. */</div><div class='add'>+    int32_t up;             /* Represents whether EC volume is</div><div class='add'>+                               up or not. */</div><div class='add'>+    uint32_t idx;</div><div class='add'>+    uint32_t xl_up_count;     /* Number of UP bricks. */</div><div class='add'>+    uintptr_t xl_up;          /* Bit flag representing UP</div><div class='add'>+                                 bricks */</div><div class='add'>+    uint32_t xl_notify_count; /* Number of notifications. */</div><div class='add'>+    uintptr_t xl_notify;      /* Bit flag representing</div><div class='add'>+                                 notification for bricks. */</div><div class='add'>+    uintptr_t node_mask;</div><div class='add'>+    uintptr_t read_mask;         /*Stores user defined read-mask*/</div><div class='add'>+    gf_atomic_t async_fop_count; /* Number of on going asynchronous fops. */</div><div class='add'>+    xlator_t **xl_list;</div><div class='add'>+    gf_lock_t lock;</div><div class='add'>+    gf_timer_t *timer;</div><div class='add'>+    gf_boolean_t shutdown;</div><div class='add'>+    gf_boolean_t eager_lock;</div><div class='add'>+    gf_boolean_t other_eager_lock;</div><div class='add'>+    gf_boolean_t optimistic_changelog;</div><div class='add'>+    gf_boolean_t parallel_writes;</div><div class='add'>+    uint32_t stripe_cache;</div><div class='add'>+    uint32_t quorum_count;</div><div class='add'>+    uint32_t background_heals;</div><div class='add'>+    uint32_t heal_wait_qlen;</div><div class='add'>+    uint32_t self_heal_window_size; /* max size of read/writes */</div><div class='add'>+    uint32_t eager_lock_timeout;</div><div class='add'>+    uint32_t other_eager_lock_timeout;</div><div class='add'>+    struct list_head pending_fops;</div><div class='add'>+    struct list_head heal_waiting;</div><div class='add'>+    struct list_head healing;</div><div class='add'>+    struct mem_pool *fop_pool;</div><div class='add'>+    struct mem_pool *cbk_pool;</div><div class='add'>+    struct mem_pool *lock_pool;</div><div class='add'>+    ec_self_heald_t shd;</div><div class='add'>+    char vol_uuid[UUID_SIZE + 1];</div><div class='add'>+    dict_t *leaf_to_subvolid;</div><div class='add'>+    ec_read_policy_t read_policy;</div><div class='add'>+    ec_matrix_list_t matrix;</div><div class='add'>+    ec_statistics_t stats;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+#endif /* __EC_TYPES_H__ */</div><div class='head'>diff --git a/xlators/cluster/ec/src/ec.c b/xlators/cluster/ec/src/ec.c<br/>new file mode 100644<br/>index 00000000000..7344be4968d<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/xlators/cluster/ec/src/ec.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>xlators/cluster/ec/src/ec.c</a></div><div class='hunk'>@@ -0,0 +1,1873 @@</div><div class='add'>+/*</div><div class='add'>+  Copyright (c) 2012-2015 DataLab, s.l. &lt;http://www.datalab.es&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#include &lt;glusterfs/defaults.h&gt;</div><div class='add'>+#include &lt;glusterfs/statedump.h&gt;</div><div class='add'>+#include &lt;glusterfs/compat-errno.h&gt;</div><div class='add'>+#include &lt;glusterfs/upcall-utils.h&gt;</div><div class='add'>+</div><div class='add'>+#include "ec.h"</div><div class='add'>+#include "ec-messages.h"</div><div class='add'>+#include "ec-mem-types.h"</div><div class='add'>+#include "ec-types.h"</div><div class='add'>+#include "ec-helpers.h"</div><div class='add'>+#include "ec-common.h"</div><div class='add'>+#include "ec-fops.h"</div><div class='add'>+#include "ec-method.h"</div><div class='add'>+#include "ec-code.h"</div><div class='add'>+#include "ec-heald.h"</div><div class='add'>+#include &lt;glusterfs/events.h&gt;</div><div class='add'>+</div><div class='add'>+static char *ec_read_policies[EC_READ_POLICY_MAX + 1] = {</div><div class='add'>+    [EC_ROUND_ROBIN] = "round-robin",</div><div class='add'>+    [EC_GFID_HASH] = "gfid-hash",</div><div class='add'>+    [EC_READ_POLICY_MAX] = NULL};</div><div class='add'>+</div><div class='add'>+#define EC_INTERNAL_XATTR_OR_GOTO(name, xattr, op_errno, label)                \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        if (ec_is_internal_xattr(NULL, (char *)name, NULL, NULL)) {            \</div><div class='add'>+            op_errno = EPERM;                                                  \</div><div class='add'>+            goto label;                                                        \</div><div class='add'>+        }                                                                      \</div><div class='add'>+        if (name &amp;&amp; (strlen(name) == 0) &amp;&amp; xattr) {                            \</div><div class='add'>+            /* Bulk [f]removexattr/[f]setxattr */                              \</div><div class='add'>+            GF_IF_INTERNAL_XATTR_GOTO(EC_XATTR_PREFIX "*", xattr, op_errno,    \</div><div class='add'>+                                      label);                                  \</div><div class='add'>+        }                                                                      \</div><div class='add'>+    } while (0)</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_parse_options(xlator_t *this)</div><div class='add'>+{</div><div class='add'>+    ec_t *ec = this-&gt;private;</div><div class='add'>+    int32_t error = EINVAL;</div><div class='add'>+    uintptr_t mask;</div><div class='add'>+</div><div class='add'>+    GF_OPTION_INIT("redundancy", ec-&gt;redundancy, int32, out);</div><div class='add'>+    ec-&gt;fragments = ec-&gt;nodes - ec-&gt;redundancy;</div><div class='add'>+    if ((ec-&gt;redundancy &lt; 1) || (ec-&gt;redundancy &gt;= ec-&gt;fragments) ||</div><div class='add'>+        (ec-&gt;fragments &gt; EC_MAX_FRAGMENTS)) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_ERROR, EINVAL, EC_MSG_INVALID_REDUNDANCY,</div><div class='add'>+               "Invalid redundancy (must be between "</div><div class='add'>+               "1 and %d)",</div><div class='add'>+               (ec-&gt;nodes - 1) / 2);</div><div class='add'>+</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ec-&gt;bits_for_nodes = 1;</div><div class='add'>+    mask = 2;</div><div class='add'>+    while (ec-&gt;nodes &gt; mask) {</div><div class='add'>+        ec-&gt;bits_for_nodes++;</div><div class='add'>+        mask &lt;&lt;= 1;</div><div class='add'>+    }</div><div class='add'>+    ec-&gt;node_mask = (1ULL &lt;&lt; ec-&gt;nodes) - 1ULL;</div><div class='add'>+    ec-&gt;fragment_size = EC_METHOD_CHUNK_SIZE;</div><div class='add'>+    ec-&gt;stripe_size = ec-&gt;fragment_size * ec-&gt;fragments;</div><div class='add'>+</div><div class='add'>+    gf_msg_debug("ec", 0,</div><div class='add'>+                 "Initialized with: nodes=%u, fragments=%u, "</div><div class='add'>+                 "stripe_size=%u, node_mask=%" PRIxFAST32,</div><div class='add'>+                 ec-&gt;nodes, ec-&gt;fragments, ec-&gt;stripe_size, ec-&gt;node_mask);</div><div class='add'>+</div><div class='add'>+    error = 0;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return error;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_prepare_childs(xlator_t *this)</div><div class='add'>+{</div><div class='add'>+    ec_t *ec = this-&gt;private;</div><div class='add'>+    xlator_list_t *child = NULL;</div><div class='add'>+    int32_t count = 0;</div><div class='add'>+</div><div class='add'>+    for (child = this-&gt;children; child != NULL; child = child-&gt;next) {</div><div class='add'>+        count++;</div><div class='add'>+    }</div><div class='add'>+    if (count &gt; EC_MAX_NODES) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_ERROR, EINVAL, EC_MSG_TOO_MANY_SUBVOLS,</div><div class='add'>+               "Too many subvolumes");</div><div class='add'>+</div><div class='add'>+        return EINVAL;</div><div class='add'>+    }</div><div class='add'>+    ec-&gt;nodes = count;</div><div class='add'>+</div><div class='add'>+    ec-&gt;xl_list = GF_CALLOC(count, sizeof(ec-&gt;xl_list[0]), ec_mt_xlator_t);</div><div class='add'>+    if (ec-&gt;xl_list == NULL) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_ERROR, ENOMEM, EC_MSG_NO_MEMORY,</div><div class='add'>+               "Allocation of xlator list failed");</div><div class='add'>+</div><div class='add'>+        return ENOMEM;</div><div class='add'>+    }</div><div class='add'>+    ec-&gt;xl_up = 0;</div><div class='add'>+    ec-&gt;xl_up_count = 0;</div><div class='add'>+</div><div class='add'>+    count = 0;</div><div class='add'>+    for (child = this-&gt;children; child != NULL; child = child-&gt;next) {</div><div class='add'>+        ec-&gt;xl_list[count++] = child-&gt;xlator;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* This function transforms the subvol to subvol-id*/</div><div class='add'>+static int</div><div class='add'>+_subvol_to_subvolid(dict_t *this, char *key, data_t *value, void *data)</div><div class='add'>+{</div><div class='add'>+    ec_t *ec = data;</div><div class='add'>+    xlator_t *subvol = NULL;</div><div class='add'>+    int i = 0;</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    subvol = data_to_ptr(value);</div><div class='add'>+    for (i = 0; i &lt; ec-&gt;nodes; i++) {</div><div class='add'>+        if (ec-&gt;xl_list[i] == subvol) {</div><div class='add'>+            ret = dict_set_int32(this, key, i);</div><div class='add'>+            /* -1 stops dict_foreach and returns -1*/</div><div class='add'>+            if (ret &lt; 0)</div><div class='add'>+                ret = -1;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+ec_subvol_to_subvol_id_transform(ec_t *ec, dict_t *leaf_to_subvolid)</div><div class='add'>+{</div><div class='add'>+    return dict_foreach(leaf_to_subvolid, _subvol_to_subvolid, ec);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+__ec_destroy_private(xlator_t *this)</div><div class='add'>+{</div><div class='add'>+    ec_t *ec = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    if (ec != NULL) {</div><div class='add'>+        LOCK(&amp;ec-&gt;lock);</div><div class='add'>+</div><div class='add'>+        if (ec-&gt;timer != NULL) {</div><div class='add'>+            gf_timer_call_cancel(this-&gt;ctx, ec-&gt;timer);</div><div class='add'>+            ec-&gt;timer = NULL;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        UNLOCK(&amp;ec-&gt;lock);</div><div class='add'>+</div><div class='add'>+        /* There is a race with timer because there is no way to know if</div><div class='add'>+         * timer callback has really been cancelled or it has been scheduled</div><div class='add'>+         * for execution. If it has been scheduled, it will crash if we</div><div class='add'>+         * destroy ec too fast.</div><div class='add'>+         *</div><div class='add'>+         * Not sure how this can be solved without using global variables or</div><div class='add'>+         * having support from gf_timer_call_cancel()</div><div class='add'>+         */</div><div class='add'>+        sleep(2);</div><div class='add'>+</div><div class='add'>+        this-&gt;private = NULL;</div><div class='add'>+        if (ec-&gt;xl_list != NULL) {</div><div class='add'>+            GF_FREE(ec-&gt;xl_list);</div><div class='add'>+            ec-&gt;xl_list = NULL;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        if (ec-&gt;fop_pool != NULL) {</div><div class='add'>+            mem_pool_destroy(ec-&gt;fop_pool);</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        if (ec-&gt;cbk_pool != NULL) {</div><div class='add'>+            mem_pool_destroy(ec-&gt;cbk_pool);</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        if (ec-&gt;lock_pool != NULL) {</div><div class='add'>+            mem_pool_destroy(ec-&gt;lock_pool);</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        LOCK_DESTROY(&amp;ec-&gt;lock);</div><div class='add'>+</div><div class='add'>+        if (ec-&gt;leaf_to_subvolid)</div><div class='add'>+            dict_unref(ec-&gt;leaf_to_subvolid);</div><div class='add'>+</div><div class='add'>+        ec_method_fini(&amp;ec-&gt;matrix);</div><div class='add'>+</div><div class='add'>+        GF_FREE(ec);</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+mem_acct_init(xlator_t *this)</div><div class='add'>+{</div><div class='add'>+    if (xlator_mem_acct_init(this, ec_mt_end + 1) != 0) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_ERROR, ENOMEM, EC_MSG_NO_MEMORY,</div><div class='add'>+               "Memory accounting initialization "</div><div class='add'>+               "failed.");</div><div class='add'>+</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_configure_background_heal_opts(ec_t *ec, int background_heals,</div><div class='add'>+                                  int heal_wait_qlen)</div><div class='add'>+{</div><div class='add'>+    if (background_heals == 0) {</div><div class='add'>+        ec-&gt;heal_wait_qlen = 0;</div><div class='add'>+    } else {</div><div class='add'>+        ec-&gt;heal_wait_qlen = heal_wait_qlen;</div><div class='add'>+    }</div><div class='add'>+    ec-&gt;background_heals = background_heals;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+ec_assign_read_policy(ec_t *ec, char *read_policy)</div><div class='add'>+{</div><div class='add'>+    int read_policy_idx = -1;</div><div class='add'>+</div><div class='add'>+    read_policy_idx = gf_get_index_by_elem(ec_read_policies, read_policy);</div><div class='add'>+    if (read_policy_idx &lt; 0 || read_policy_idx &gt;= EC_READ_POLICY_MAX)</div><div class='add'>+        return -1;</div><div class='add'>+</div><div class='add'>+    ec-&gt;read_policy = read_policy_idx;</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+reconfigure(xlator_t *this, dict_t *options)</div><div class='add'>+{</div><div class='add'>+    ec_t *ec = this-&gt;private;</div><div class='add'>+    char *read_policy = NULL;</div><div class='add'>+    char *extensions = NULL;</div><div class='add'>+    uint32_t heal_wait_qlen = 0;</div><div class='add'>+    uint32_t background_heals = 0;</div><div class='add'>+    int32_t ret = -1;</div><div class='add'>+    int32_t err;</div><div class='add'>+</div><div class='add'>+    GF_OPTION_RECONF("cpu-extensions", extensions, options, str, failed);</div><div class='add'>+</div><div class='add'>+    GF_OPTION_RECONF("self-heal-daemon", ec-&gt;shd.enabled, options, bool,</div><div class='add'>+                     failed);</div><div class='add'>+    GF_OPTION_RECONF("iam-self-heal-daemon", ec-&gt;shd.iamshd, options, bool,</div><div class='add'>+                     failed);</div><div class='add'>+    GF_OPTION_RECONF("eager-lock", ec-&gt;eager_lock, options, bool, failed);</div><div class='add'>+    GF_OPTION_RECONF("other-eager-lock", ec-&gt;other_eager_lock, options, bool,</div><div class='add'>+                     failed);</div><div class='add'>+    GF_OPTION_RECONF("eager-lock-timeout", ec-&gt;eager_lock_timeout, options,</div><div class='add'>+                     uint32, failed);</div><div class='add'>+    GF_OPTION_RECONF("other-eager-lock-timeout", ec-&gt;other_eager_lock_timeout,</div><div class='add'>+                     options, uint32, failed);</div><div class='add'>+    GF_OPTION_RECONF("background-heals", background_heals, options, uint32,</div><div class='add'>+                     failed);</div><div class='add'>+    GF_OPTION_RECONF("heal-wait-qlength", heal_wait_qlen, options, uint32,</div><div class='add'>+                     failed);</div><div class='add'>+    GF_OPTION_RECONF("self-heal-window-size", ec-&gt;self_heal_window_size,</div><div class='add'>+                     options, uint32, failed);</div><div class='add'>+    GF_OPTION_RECONF("heal-timeout", ec-&gt;shd.timeout, options, int32, failed);</div><div class='add'>+    ec_configure_background_heal_opts(ec, background_heals, heal_wait_qlen);</div><div class='add'>+    GF_OPTION_RECONF("shd-max-threads", ec-&gt;shd.max_threads, options, uint32,</div><div class='add'>+                     failed);</div><div class='add'>+    GF_OPTION_RECONF("shd-wait-qlength", ec-&gt;shd.wait_qlength, options, uint32,</div><div class='add'>+                     failed);</div><div class='add'>+</div><div class='add'>+    GF_OPTION_RECONF("read-policy", read_policy, options, str, failed);</div><div class='add'>+</div><div class='add'>+    GF_OPTION_RECONF("optimistic-change-log", ec-&gt;optimistic_changelog, options,</div><div class='add'>+                     bool, failed);</div><div class='add'>+    GF_OPTION_RECONF("parallel-writes", ec-&gt;parallel_writes, options, bool,</div><div class='add'>+                     failed);</div><div class='add'>+    GF_OPTION_RECONF("stripe-cache", ec-&gt;stripe_cache, options, uint32, failed);</div><div class='add'>+    GF_OPTION_RECONF("quorum-count", ec-&gt;quorum_count, options, uint32, failed);</div><div class='add'>+    ret = 0;</div><div class='add'>+    if (ec_assign_read_policy(ec, read_policy)) {</div><div class='add'>+        ret = -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    err = ec_method_update(this, &amp;ec-&gt;matrix, extensions);</div><div class='add'>+    if (err != 0) {</div><div class='add'>+        ret = -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+failed:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+glusterfs_event_t</div><div class='add'>+ec_get_event_from_state(ec_t *ec)</div><div class='add'>+{</div><div class='add'>+    int down_count = 0;</div><div class='add'>+</div><div class='add'>+    if (ec-&gt;xl_up_count &gt;= ec-&gt;fragments) {</div><div class='add'>+        /* If ec is up but some subvolumes are yet to notify, give</div><div class='add'>+         * grace time for other subvols to notify to prevent start of</div><div class='add'>+         * I/O which may result in self-heals */</div><div class='add'>+        if (ec-&gt;xl_notify_count &lt; ec-&gt;nodes)</div><div class='add'>+            return GF_EVENT_MAXVAL;</div><div class='add'>+</div><div class='add'>+        return GF_EVENT_CHILD_UP;</div><div class='add'>+    } else {</div><div class='add'>+        down_count = ec-&gt;xl_notify_count - ec-&gt;xl_up_count;</div><div class='add'>+        if (down_count &gt; ec-&gt;redundancy)</div><div class='add'>+            return GF_EVENT_CHILD_DOWN;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return GF_EVENT_MAXVAL;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_up(xlator_t *this, ec_t *ec)</div><div class='add'>+{</div><div class='add'>+    char str1[32], str2[32];</div><div class='add'>+</div><div class='add'>+    if (ec-&gt;timer != NULL) {</div><div class='add'>+        gf_timer_call_cancel(this-&gt;ctx, ec-&gt;timer);</div><div class='add'>+        ec-&gt;timer = NULL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ec-&gt;up = 1;</div><div class='add'>+    gf_msg(this-&gt;name, GF_LOG_INFO, 0, EC_MSG_EC_UP,</div><div class='add'>+           "Going UP : Child UP = %s Child Notify = %s",</div><div class='add'>+           ec_bin(str1, sizeof(str1), ec-&gt;xl_up, ec-&gt;nodes),</div><div class='add'>+           ec_bin(str2, sizeof(str2), ec-&gt;xl_notify, ec-&gt;nodes));</div><div class='add'>+</div><div class='add'>+    gf_event(EVENT_EC_MIN_BRICKS_UP, "subvol=%s", this-&gt;name);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_down(xlator_t *this, ec_t *ec)</div><div class='add'>+{</div><div class='add'>+    char str1[32], str2[32];</div><div class='add'>+</div><div class='add'>+    if (ec-&gt;timer != NULL) {</div><div class='add'>+        gf_timer_call_cancel(this-&gt;ctx, ec-&gt;timer);</div><div class='add'>+        ec-&gt;timer = NULL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ec-&gt;up = 0;</div><div class='add'>+    gf_msg(this-&gt;name, GF_LOG_INFO, 0, EC_MSG_EC_DOWN,</div><div class='add'>+           "Going DOWN : Child UP = %s Child Notify = %s",</div><div class='add'>+           ec_bin(str1, sizeof(str1), ec-&gt;xl_up, ec-&gt;nodes),</div><div class='add'>+           ec_bin(str2, sizeof(str2), ec-&gt;xl_notify, ec-&gt;nodes));</div><div class='add'>+</div><div class='add'>+    gf_event(EVENT_EC_MIN_BRICKS_NOT_UP, "subvol=%s", this-&gt;name);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_notify_cbk(void *data)</div><div class='add'>+{</div><div class='add'>+    ec_t *ec = data;</div><div class='add'>+    glusterfs_event_t event = GF_EVENT_MAXVAL;</div><div class='add'>+    gf_boolean_t propagate = _gf_false;</div><div class='add'>+    gf_boolean_t launch_heal = _gf_false;</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;ec-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        if (!ec-&gt;timer) {</div><div class='add'>+            /*</div><div class='add'>+             * Either child_up/child_down is already sent to parent</div><div class='add'>+             * This is a spurious wake up.</div><div class='add'>+             */</div><div class='add'>+            goto unlock;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        gf_timer_call_cancel(ec-&gt;xl-&gt;ctx, ec-&gt;timer);</div><div class='add'>+        ec-&gt;timer = NULL;</div><div class='add'>+</div><div class='add'>+        /* The timeout has expired, so any subvolume that has not</div><div class='add'>+         * already reported its state, will be considered to be down.</div><div class='add'>+         * We mark as if all bricks had reported. */</div><div class='add'>+        ec-&gt;xl_notify = (1ULL &lt;&lt; ec-&gt;nodes) - 1ULL;</div><div class='add'>+        ec-&gt;xl_notify_count = ec-&gt;nodes;</div><div class='add'>+</div><div class='add'>+        /* Since we have marked all subvolumes as notified, it's</div><div class='add'>+         * guaranteed that ec_get_event_from_state() will return</div><div class='add'>+         * CHILD_UP or CHILD_DOWN, but not MAXVAL. */</div><div class='add'>+        event = ec_get_event_from_state(ec);</div><div class='add'>+        if (event == GF_EVENT_CHILD_UP) {</div><div class='add'>+            /* We are ready to bring the volume up. If there are</div><div class='add'>+             * still bricks DOWN, they will be healed when they</div><div class='add'>+             * come up. */</div><div class='add'>+            ec_up(ec-&gt;xl, ec);</div><div class='add'>+</div><div class='add'>+            if (ec-&gt;shd.iamshd &amp;&amp; !ec-&gt;shutdown) {</div><div class='add'>+                launch_heal = _gf_true;</div><div class='add'>+                GF_ATOMIC_INC(ec-&gt;async_fop_count);</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        propagate = _gf_true;</div><div class='add'>+    }</div><div class='add'>+unlock:</div><div class='add'>+    UNLOCK(&amp;ec-&gt;lock);</div><div class='add'>+</div><div class='add'>+    if (launch_heal) {</div><div class='add'>+        /* We have just brought the volume UP, so we trigger</div><div class='add'>+         * a self-heal check on the root directory. */</div><div class='add'>+        ec_launch_replace_heal(ec);</div><div class='add'>+    }</div><div class='add'>+    if (propagate) {</div><div class='add'>+        default_notify(ec-&gt;xl, event, NULL);</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_launch_notify_timer(xlator_t *this, ec_t *ec)</div><div class='add'>+{</div><div class='add'>+    struct timespec delay = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    gf_msg_debug(this-&gt;name, 0, "Initiating child-down timer");</div><div class='add'>+    delay.tv_sec = 10;</div><div class='add'>+    delay.tv_nsec = 0;</div><div class='add'>+    ec-&gt;timer = gf_timer_call_after(this-&gt;ctx, delay, ec_notify_cbk, ec);</div><div class='add'>+    if (ec-&gt;timer == NULL) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_ERROR, ENOMEM, EC_MSG_TIMER_CREATE_FAIL,</div><div class='add'>+               "Cannot create timer "</div><div class='add'>+               "for delayed initialization");</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+gf_boolean_t</div><div class='add'>+ec_disable_delays(ec_t *ec)</div><div class='add'>+{</div><div class='add'>+    ec-&gt;shutdown = _gf_true;</div><div class='add'>+</div><div class='add'>+    return __ec_is_last_fop(ec);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_cleanup_healer_object(ec_t *ec)</div><div class='add'>+{</div><div class='add'>+    struct subvol_healer *healer = NULL;</div><div class='add'>+    ec_self_heald_t *shd = NULL;</div><div class='add'>+    void *res = NULL;</div><div class='add'>+    int i = 0;</div><div class='add'>+    gf_boolean_t is_join = _gf_false;</div><div class='add'>+</div><div class='add'>+    shd = &amp;ec-&gt;shd;</div><div class='add'>+    if (!shd-&gt;iamshd)</div><div class='add'>+        return;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; ec-&gt;nodes; i++) {</div><div class='add'>+        healer = &amp;shd-&gt;index_healers[i];</div><div class='add'>+        pthread_mutex_lock(&amp;healer-&gt;mutex);</div><div class='add'>+        {</div><div class='add'>+            healer-&gt;rerun = 1;</div><div class='add'>+            if (healer-&gt;running) {</div><div class='add'>+                pthread_cond_signal(&amp;healer-&gt;cond);</div><div class='add'>+                is_join = _gf_true;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+        pthread_mutex_unlock(&amp;healer-&gt;mutex);</div><div class='add'>+        if (is_join) {</div><div class='add'>+            pthread_join(healer-&gt;thread, &amp;res);</div><div class='add'>+            is_join = _gf_false;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        healer = &amp;shd-&gt;full_healers[i];</div><div class='add'>+        pthread_mutex_lock(&amp;healer-&gt;mutex);</div><div class='add'>+        {</div><div class='add'>+            healer-&gt;rerun = 1;</div><div class='add'>+            if (healer-&gt;running) {</div><div class='add'>+                pthread_cond_signal(&amp;healer-&gt;cond);</div><div class='add'>+                is_join = _gf_true;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+        pthread_mutex_unlock(&amp;healer-&gt;mutex);</div><div class='add'>+        if (is_join) {</div><div class='add'>+            pthread_join(healer-&gt;thread, &amp;res);</div><div class='add'>+            is_join = _gf_false;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+void</div><div class='add'>+ec_pending_fops_completed(ec_t *ec)</div><div class='add'>+{</div><div class='add'>+    if (ec-&gt;shutdown) {</div><div class='add'>+        default_notify(ec-&gt;xl, GF_EVENT_PARENT_DOWN, NULL);</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static gf_boolean_t</div><div class='add'>+ec_set_up_state(ec_t *ec, uintptr_t index_mask, uintptr_t new_state)</div><div class='add'>+{</div><div class='add'>+    uintptr_t current_state = 0;</div><div class='add'>+</div><div class='add'>+    if (xlator_is_cleanup_starting(ec-&gt;xl))</div><div class='add'>+        return _gf_false;</div><div class='add'>+</div><div class='add'>+    if ((ec-&gt;xl_notify &amp; index_mask) == 0) {</div><div class='add'>+        ec-&gt;xl_notify |= index_mask;</div><div class='add'>+        ec-&gt;xl_notify_count++;</div><div class='add'>+    }</div><div class='add'>+    current_state = ec-&gt;xl_up &amp; index_mask;</div><div class='add'>+    if (current_state != new_state) {</div><div class='add'>+        ec-&gt;xl_up ^= index_mask;</div><div class='add'>+        ec-&gt;xl_up_count += (current_state ? -1 : 1);</div><div class='add'>+</div><div class='add'>+        return _gf_true;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return _gf_false;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static gf_boolean_t</div><div class='add'>+ec_upcall(ec_t *ec, struct gf_upcall *upcall)</div><div class='add'>+{</div><div class='add'>+    struct gf_upcall_cache_invalidation *ci = NULL;</div><div class='add'>+    struct gf_upcall_inodelk_contention *lc = NULL;</div><div class='add'>+    inode_t *inode;</div><div class='add'>+    inode_table_t *table;</div><div class='add'>+</div><div class='add'>+    switch (upcall-&gt;event_type) {</div><div class='add'>+        case GF_UPCALL_CACHE_INVALIDATION:</div><div class='add'>+            ci = upcall-&gt;data;</div><div class='add'>+            ci-&gt;flags |= UP_INVAL_ATTR;</div><div class='add'>+            return _gf_true;</div><div class='add'>+</div><div class='add'>+        case GF_UPCALL_INODELK_CONTENTION:</div><div class='add'>+            lc = upcall-&gt;data;</div><div class='add'>+            if (strcmp(lc-&gt;domain, ec-&gt;xl-&gt;name) != 0) {</div><div class='add'>+                /* The lock is not owned by EC, ignore it. */</div><div class='add'>+                return _gf_true;</div><div class='add'>+            }</div><div class='add'>+            table = ((xlator_t *)ec-&gt;xl-&gt;graph-&gt;top)-&gt;itable;</div><div class='add'>+            if (table == NULL) {</div><div class='add'>+                /* Self-heal daemon doesn't have an inode table on the top</div><div class='add'>+                 * xlator because it doesn't need it. In this case we should</div><div class='add'>+                 * use the inode table managed by EC itself where all inodes</div><div class='add'>+                 * being healed should be present. However self-heal doesn't</div><div class='add'>+                 * use eager-locking and inodelk's are already released as</div><div class='add'>+                 * soon as possible. In this case we can safely ignore these</div><div class='add'>+                 * notifications. */</div><div class='add'>+                return _gf_false;</div><div class='add'>+            }</div><div class='add'>+            inode = inode_find(table, upcall-&gt;gfid);</div><div class='add'>+            /* If inode is not found, it means that it's already released,</div><div class='add'>+             * so we can ignore it. Probably it has been released and</div><div class='add'>+             * destroyed while the contention notification was being sent.</div><div class='add'>+             */</div><div class='add'>+            if (inode != NULL) {</div><div class='add'>+                ec_lock_release(ec, inode);</div><div class='add'>+                inode_unref(inode);</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            return _gf_false;</div><div class='add'>+</div><div class='add'>+        default:</div><div class='add'>+            return _gf_true;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_notify(xlator_t *this, int32_t event, void *data, void *data2)</div><div class='add'>+{</div><div class='add'>+    ec_t *ec = this-&gt;private;</div><div class='add'>+    int32_t idx = 0;</div><div class='add'>+    int32_t error = 0;</div><div class='add'>+    glusterfs_event_t old_event = GF_EVENT_MAXVAL;</div><div class='add'>+    dict_t *input = NULL;</div><div class='add'>+    dict_t *output = NULL;</div><div class='add'>+    gf_boolean_t propagate = _gf_true;</div><div class='add'>+    gf_boolean_t needs_shd_check = _gf_false;</div><div class='add'>+    int32_t orig_event = event;</div><div class='add'>+    uintptr_t mask = 0;</div><div class='add'>+</div><div class='add'>+    gf_msg_trace(this-&gt;name, 0, "NOTIFY(%d): %p, %p", event, data, data2);</div><div class='add'>+</div><div class='add'>+    if (event == GF_EVENT_UPCALL) {</div><div class='add'>+        propagate = ec_upcall(ec, data);</div><div class='add'>+        goto done;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (event == GF_EVENT_TRANSLATOR_OP) {</div><div class='add'>+        if (!ec-&gt;up) {</div><div class='add'>+            error = -1;</div><div class='add'>+        } else {</div><div class='add'>+            input = data;</div><div class='add'>+            output = data2;</div><div class='add'>+            error = ec_xl_op(this, input, output);</div><div class='add'>+        }</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    for (idx = 0; idx &lt; ec-&gt;nodes; idx++) {</div><div class='add'>+        if (ec-&gt;xl_list[idx] == data) {</div><div class='add'>+            break;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;ec-&gt;lock);</div><div class='add'>+</div><div class='add'>+    if (event == GF_EVENT_PARENT_UP) {</div><div class='add'>+        /*</div><div class='add'>+         * Start a timer which sends appropriate event to parent</div><div class='add'>+         * xlator to prevent the 'mount' syscall from hanging.</div><div class='add'>+         */</div><div class='add'>+        ec_launch_notify_timer(this, ec);</div><div class='add'>+        goto unlock;</div><div class='add'>+    } else if (event == GF_EVENT_PARENT_DOWN) {</div><div class='add'>+        /* If there aren't pending fops running after we have waken up</div><div class='add'>+         * them, we immediately propagate the notification. */</div><div class='add'>+        propagate = ec_disable_delays(ec);</div><div class='add'>+        ec_cleanup_healer_object(ec);</div><div class='add'>+        goto unlock;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (idx &lt; ec-&gt;nodes) { /* CHILD_* events */</div><div class='add'>+        old_event = ec_get_event_from_state(ec);</div><div class='add'>+</div><div class='add'>+        mask = 1ULL &lt;&lt; idx;</div><div class='add'>+        if (event == GF_EVENT_CHILD_UP) {</div><div class='add'>+            /* We need to trigger a selfheal if a brick changes</div><div class='add'>+             * to UP state. */</div><div class='add'>+            if (ec_set_up_state(ec, mask, mask) &amp;&amp; ec-&gt;shd.iamshd &amp;&amp;</div><div class='add'>+                !ec-&gt;shutdown) {</div><div class='add'>+                needs_shd_check = _gf_true;</div><div class='add'>+            }</div><div class='add'>+        } else if (event == GF_EVENT_CHILD_DOWN) {</div><div class='add'>+            ec_set_up_state(ec, mask, 0);</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        event = ec_get_event_from_state(ec);</div><div class='add'>+</div><div class='add'>+        if (event == GF_EVENT_CHILD_UP) {</div><div class='add'>+            if (!ec-&gt;up) {</div><div class='add'>+                ec_up(this, ec);</div><div class='add'>+            }</div><div class='add'>+        } else {</div><div class='add'>+            /* If the volume is not UP, it's irrelevant if one</div><div class='add'>+             * brick has come up. We cannot heal anything. */</div><div class='add'>+            needs_shd_check = _gf_false;</div><div class='add'>+</div><div class='add'>+            if ((event == GF_EVENT_CHILD_DOWN) &amp;&amp; ec-&gt;up) {</div><div class='add'>+                ec_down(this, ec);</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        if (event != GF_EVENT_MAXVAL) {</div><div class='add'>+            if (event == old_event) {</div><div class='add'>+                if (orig_event == GF_EVENT_CHILD_UP)</div><div class='add'>+                    event = GF_EVENT_SOME_DESCENDENT_UP;</div><div class='add'>+                else /* orig_event has to be GF_EVENT_CHILD_DOWN */</div><div class='add'>+                    event = GF_EVENT_SOME_DESCENDENT_DOWN;</div><div class='add'>+            }</div><div class='add'>+        } else {</div><div class='add'>+            propagate = _gf_false;</div><div class='add'>+            needs_shd_check = _gf_false;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        if (needs_shd_check) {</div><div class='add'>+            GF_ATOMIC_INC(ec-&gt;async_fop_count);</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+unlock:</div><div class='add'>+    UNLOCK(&amp;ec-&gt;lock);</div><div class='add'>+</div><div class='add'>+done:</div><div class='add'>+    if (needs_shd_check) {</div><div class='add'>+        ec_launch_replace_heal(ec);</div><div class='add'>+    }</div><div class='add'>+    if (propagate) {</div><div class='add'>+        error = default_notify(this, event, data);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return error;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+notify(xlator_t *this, int32_t event, void *data, ...)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    va_list ap;</div><div class='add'>+    void *data2 = NULL;</div><div class='add'>+</div><div class='add'>+    va_start(ap, data);</div><div class='add'>+    data2 = va_arg(ap, dict_t *);</div><div class='add'>+    va_end(ap);</div><div class='add'>+    ret = ec_notify(this, event, data, data2);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+ec_statistics_init(ec_t *ec)</div><div class='add'>+{</div><div class='add'>+    GF_ATOMIC_INIT(ec-&gt;stats.stripe_cache.hits, 0);</div><div class='add'>+    GF_ATOMIC_INIT(ec-&gt;stats.stripe_cache.misses, 0);</div><div class='add'>+    GF_ATOMIC_INIT(ec-&gt;stats.stripe_cache.updates, 0);</div><div class='add'>+    GF_ATOMIC_INIT(ec-&gt;stats.stripe_cache.invals, 0);</div><div class='add'>+    GF_ATOMIC_INIT(ec-&gt;stats.stripe_cache.evicts, 0);</div><div class='add'>+    GF_ATOMIC_INIT(ec-&gt;stats.stripe_cache.allocs, 0);</div><div class='add'>+    GF_ATOMIC_INIT(ec-&gt;stats.stripe_cache.errors, 0);</div><div class='add'>+    GF_ATOMIC_INIT(ec-&gt;stats.shd.attempted, 0);</div><div class='add'>+    GF_ATOMIC_INIT(ec-&gt;stats.shd.completed, 0);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+ec_assign_read_mask(ec_t *ec, char *read_mask_str)</div><div class='add'>+{</div><div class='add'>+    char *mask = NULL;</div><div class='add'>+    char *maskptr = NULL;</div><div class='add'>+    char *saveptr = NULL;</div><div class='add'>+    char *id_str = NULL;</div><div class='add'>+    int id = 0;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    uintptr_t read_mask = 0;</div><div class='add'>+</div><div class='add'>+    if (!read_mask_str) {</div><div class='add'>+        ec-&gt;read_mask = 0;</div><div class='add'>+        ret = 0;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    mask = gf_strdup(read_mask_str);</div><div class='add'>+    if (!mask) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    maskptr = mask;</div><div class='add'>+</div><div class='add'>+    for (;;) {</div><div class='add'>+        id_str = strtok_r(maskptr, ":", &amp;saveptr);</div><div class='add'>+        if (id_str == NULL)</div><div class='add'>+            break;</div><div class='add'>+        if (gf_string2int(id_str, &amp;id)) {</div><div class='add'>+            gf_msg(ec-&gt;xl-&gt;name, GF_LOG_ERROR, 0, EC_MSG_XLATOR_INIT_FAIL,</div><div class='add'>+                   "In read-mask \"%s\" id %s is not a valid integer",</div><div class='add'>+                   read_mask_str, id_str);</div><div class='add'>+            ret = -1;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        if ((id &lt; 0) || (id &gt;= ec-&gt;nodes)) {</div><div class='add'>+            gf_msg(ec-&gt;xl-&gt;name, GF_LOG_ERROR, 0, EC_MSG_XLATOR_INIT_FAIL,</div><div class='add'>+                   "In read-mask \"%s\" id %d is not in range [0 - %d]",</div><div class='add'>+                   read_mask_str, id, ec-&gt;nodes - 1);</div><div class='add'>+            ret = -1;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+        read_mask |= (1UL &lt;&lt; id);</div><div class='add'>+        maskptr = NULL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (gf_bits_count(read_mask) &lt; ec-&gt;fragments) {</div><div class='add'>+        gf_msg(ec-&gt;xl-&gt;name, GF_LOG_ERROR, 0, EC_MSG_XLATOR_INIT_FAIL,</div><div class='add'>+               "read-mask \"%s\" should contain at least %d ids", read_mask_str,</div><div class='add'>+               ec-&gt;fragments);</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    ec-&gt;read_mask = read_mask;</div><div class='add'>+    ret = 0;</div><div class='add'>+out:</div><div class='add'>+    GF_FREE(mask);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+init(xlator_t *this)</div><div class='add'>+{</div><div class='add'>+    ec_t *ec = NULL;</div><div class='add'>+    char *read_policy = NULL;</div><div class='add'>+    char *extensions = NULL;</div><div class='add'>+    int32_t err;</div><div class='add'>+    char *read_mask_str = NULL;</div><div class='add'>+</div><div class='add'>+    if (this-&gt;parents == NULL) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_WARNING, 0, EC_MSG_NO_PARENTS,</div><div class='add'>+               "Volume does not have parents.");</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ec = GF_MALLOC(sizeof(*ec), ec_mt_ec_t);</div><div class='add'>+    if (ec == NULL) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_ERROR, ENOMEM, EC_MSG_NO_MEMORY,</div><div class='add'>+               "Failed to allocate private memory.");</div><div class='add'>+</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+    memset(ec, 0, sizeof(*ec));</div><div class='add'>+</div><div class='add'>+    this-&gt;private = ec;</div><div class='add'>+</div><div class='add'>+    ec-&gt;xl = this;</div><div class='add'>+    LOCK_INIT(&amp;ec-&gt;lock);</div><div class='add'>+</div><div class='add'>+    GF_ATOMIC_INIT(ec-&gt;async_fop_count, 0);</div><div class='add'>+    INIT_LIST_HEAD(&amp;ec-&gt;pending_fops);</div><div class='add'>+    INIT_LIST_HEAD(&amp;ec-&gt;heal_waiting);</div><div class='add'>+    INIT_LIST_HEAD(&amp;ec-&gt;healing);</div><div class='add'>+</div><div class='add'>+    ec-&gt;fop_pool = mem_pool_new(ec_fop_data_t, 1024);</div><div class='add'>+    ec-&gt;cbk_pool = mem_pool_new(ec_cbk_data_t, 4096);</div><div class='add'>+    ec-&gt;lock_pool = mem_pool_new(ec_lock_t, 1024);</div><div class='add'>+    if ((ec-&gt;fop_pool == NULL) || (ec-&gt;cbk_pool == NULL) ||</div><div class='add'>+        (ec-&gt;lock_pool == NULL)) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_ERROR, ENOMEM, EC_MSG_NO_MEMORY,</div><div class='add'>+               "Failed to create memory pools.");</div><div class='add'>+</div><div class='add'>+        goto failed;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (ec_prepare_childs(this) != 0) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_ERROR, 0, EC_MSG_XLATOR_INIT_FAIL,</div><div class='add'>+               "Failed to initialize xlator");</div><div class='add'>+</div><div class='add'>+        goto failed;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (ec_parse_options(this) != 0) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_ERROR, EINVAL, EC_MSG_XLATOR_PARSE_OPT_FAIL,</div><div class='add'>+               "Failed to parse xlator options");</div><div class='add'>+</div><div class='add'>+        goto failed;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    GF_OPTION_INIT("cpu-extensions", extensions, str, failed);</div><div class='add'>+</div><div class='add'>+    err = ec_method_init(this, &amp;ec-&gt;matrix, ec-&gt;fragments, ec-&gt;nodes,</div><div class='add'>+                         ec-&gt;nodes * 2, extensions);</div><div class='add'>+    if (err != 0) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_ERROR, -err, EC_MSG_MATRIX_FAILED,</div><div class='add'>+               "Failed to initialize matrix management");</div><div class='add'>+</div><div class='add'>+        goto failed;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    GF_OPTION_INIT("self-heal-daemon", ec-&gt;shd.enabled, bool, failed);</div><div class='add'>+    GF_OPTION_INIT("iam-self-heal-daemon", ec-&gt;shd.iamshd, bool, failed);</div><div class='add'>+    GF_OPTION_INIT("eager-lock", ec-&gt;eager_lock, bool, failed);</div><div class='add'>+    GF_OPTION_INIT("other-eager-lock", ec-&gt;other_eager_lock, bool, failed);</div><div class='add'>+    GF_OPTION_INIT("eager-lock-timeout", ec-&gt;eager_lock_timeout, uint32,</div><div class='add'>+                   failed);</div><div class='add'>+    GF_OPTION_INIT("other-eager-lock-timeout", ec-&gt;other_eager_lock_timeout,</div><div class='add'>+                   uint32, failed);</div><div class='add'>+    GF_OPTION_INIT("background-heals", ec-&gt;background_heals, uint32, failed);</div><div class='add'>+    GF_OPTION_INIT("heal-wait-qlength", ec-&gt;heal_wait_qlen, uint32, failed);</div><div class='add'>+    GF_OPTION_INIT("self-heal-window-size", ec-&gt;self_heal_window_size, uint32,</div><div class='add'>+                   failed);</div><div class='add'>+    ec_configure_background_heal_opts(ec, ec-&gt;background_heals,</div><div class='add'>+                                      ec-&gt;heal_wait_qlen);</div><div class='add'>+    GF_OPTION_INIT("read-policy", read_policy, str, failed);</div><div class='add'>+    if (ec_assign_read_policy(ec, read_policy))</div><div class='add'>+        goto failed;</div><div class='add'>+</div><div class='add'>+    GF_OPTION_INIT("heal-timeout", ec-&gt;shd.timeout, int32, failed);</div><div class='add'>+    GF_OPTION_INIT("shd-max-threads", ec-&gt;shd.max_threads, uint32, failed);</div><div class='add'>+    GF_OPTION_INIT("shd-wait-qlength", ec-&gt;shd.wait_qlength, uint32, failed);</div><div class='add'>+    GF_OPTION_INIT("optimistic-change-log", ec-&gt;optimistic_changelog, bool,</div><div class='add'>+                   failed);</div><div class='add'>+    GF_OPTION_INIT("parallel-writes", ec-&gt;parallel_writes, bool, failed);</div><div class='add'>+    GF_OPTION_INIT("stripe-cache", ec-&gt;stripe_cache, uint32, failed);</div><div class='add'>+    GF_OPTION_INIT("quorum-count", ec-&gt;quorum_count, uint32, failed);</div><div class='add'>+    GF_OPTION_INIT("ec-read-mask", read_mask_str, str, failed);</div><div class='add'>+</div><div class='add'>+    if (ec_assign_read_mask(ec, read_mask_str))</div><div class='add'>+        goto failed;</div><div class='add'>+</div><div class='add'>+    this-&gt;itable = inode_table_new(EC_SHD_INODE_LRU_LIMIT, this);</div><div class='add'>+    if (!this-&gt;itable)</div><div class='add'>+        goto failed;</div><div class='add'>+</div><div class='add'>+    if (ec-&gt;shd.iamshd)</div><div class='add'>+        ec_selfheal_daemon_init(this);</div><div class='add'>+    gf_msg_debug(this-&gt;name, 0, "Disperse translator initialized.");</div><div class='add'>+</div><div class='add'>+    ec-&gt;leaf_to_subvolid = dict_new();</div><div class='add'>+    if (!ec-&gt;leaf_to_subvolid)</div><div class='add'>+        goto failed;</div><div class='add'>+    if (glusterfs_reachable_leaves(this, ec-&gt;leaf_to_subvolid)) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_ERROR, 0, EC_MSG_SUBVOL_BUILD_FAIL,</div><div class='add'>+               "Failed to build subvol "</div><div class='add'>+               "dictionary");</div><div class='add'>+        goto failed;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (ec_subvol_to_subvol_id_transform(ec, ec-&gt;leaf_to_subvolid) &lt; 0) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_ERROR, 0, EC_MSG_SUBVOL_ID_DICT_SET_FAIL,</div><div class='add'>+               "Failed to build subvol-id "</div><div class='add'>+               "dictionary");</div><div class='add'>+        goto failed;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ec_statistics_init(ec);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+</div><div class='add'>+failed:</div><div class='add'>+    __ec_destroy_private(this);</div><div class='add'>+</div><div class='add'>+    return -1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+fini(xlator_t *this)</div><div class='add'>+{</div><div class='add'>+    ec_selfheal_daemon_fini(this);</div><div class='add'>+    __ec_destroy_private(this);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_gf_access(call_frame_t *frame, xlator_t *this, loc_t *loc, int32_t mask,</div><div class='add'>+             dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    ec_access(frame, this, -1, EC_MINIMUM_ONE, default_access_cbk, NULL, loc,</div><div class='add'>+              mask, xdata);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_gf_create(call_frame_t *frame, xlator_t *this, loc_t *loc, int32_t flags,</div><div class='add'>+             mode_t mode, mode_t umask, fd_t *fd, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    ec_create(frame, this, -1, EC_MINIMUM_MIN, default_create_cbk, NULL, loc,</div><div class='add'>+              flags, mode, umask, fd, xdata);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_gf_discard(call_frame_t *frame, xlator_t *this, fd_t *fd, off_t offset,</div><div class='add'>+              size_t len, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    ec_discard(frame, this, -1, EC_MINIMUM_MIN, default_discard_cbk, NULL, fd,</div><div class='add'>+               offset, len, xdata);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_gf_entrylk(call_frame_t *frame, xlator_t *this, const char *volume,</div><div class='add'>+              loc_t *loc, const char *basename, entrylk_cmd cmd,</div><div class='add'>+              entrylk_type type, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    uint32_t fop_flags = EC_MINIMUM_ALL;</div><div class='add'>+</div><div class='add'>+    if (cmd == ENTRYLK_UNLOCK)</div><div class='add'>+        fop_flags = EC_MINIMUM_ONE;</div><div class='add'>+    ec_entrylk(frame, this, -1, fop_flags, default_entrylk_cbk, NULL, volume,</div><div class='add'>+               loc, basename, cmd, type, xdata);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_gf_fentrylk(call_frame_t *frame, xlator_t *this, const char *volume,</div><div class='add'>+               fd_t *fd, const char *basename, entrylk_cmd cmd,</div><div class='add'>+               entrylk_type type, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    uint32_t fop_flags = EC_MINIMUM_ALL;</div><div class='add'>+</div><div class='add'>+    if (cmd == ENTRYLK_UNLOCK)</div><div class='add'>+        fop_flags = EC_MINIMUM_ONE;</div><div class='add'>+    ec_fentrylk(frame, this, -1, fop_flags, default_fentrylk_cbk, NULL, volume,</div><div class='add'>+                fd, basename, cmd, type, xdata);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_gf_fallocate(call_frame_t *frame, xlator_t *this, fd_t *fd, int32_t mode,</div><div class='add'>+                off_t offset, size_t len, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    ec_fallocate(frame, this, -1, EC_MINIMUM_MIN, default_fallocate_cbk, NULL,</div><div class='add'>+                 fd, mode, offset, len, xdata);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_gf_flush(call_frame_t *frame, xlator_t *this, fd_t *fd, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    ec_flush(frame, this, -1, EC_MINIMUM_MIN, default_flush_cbk, NULL, fd,</div><div class='add'>+             xdata);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_gf_fsync(call_frame_t *frame, xlator_t *this, fd_t *fd, int32_t datasync,</div><div class='add'>+            dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    ec_fsync(frame, this, -1, EC_MINIMUM_MIN, default_fsync_cbk, NULL, fd,</div><div class='add'>+             datasync, xdata);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_gf_fsyncdir(call_frame_t *frame, xlator_t *this, fd_t *fd, int32_t datasync,</div><div class='add'>+               dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    ec_fsyncdir(frame, this, -1, EC_MINIMUM_MIN, default_fsyncdir_cbk, NULL, fd,</div><div class='add'>+                datasync, xdata);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+ec_marker_populate_args(call_frame_t *frame, int type, int *gauge,</div><div class='add'>+                        xlator_t **subvols)</div><div class='add'>+{</div><div class='add'>+    xlator_t *this = frame-&gt;this;</div><div class='add'>+    ec_t *ec = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    memcpy(subvols, ec-&gt;xl_list, sizeof(*subvols) * ec-&gt;nodes);</div><div class='add'>+</div><div class='add'>+    if (type == MARKER_XTIME_TYPE) {</div><div class='add'>+        /*Don't error out on ENOENT/ENOTCONN */</div><div class='add'>+        gauge[MCNT_NOTFOUND] = 0;</div><div class='add'>+        gauge[MCNT_ENOTCONN] = 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return ec-&gt;nodes;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_handle_heal_commands(call_frame_t *frame, xlator_t *this, loc_t *loc,</div><div class='add'>+                        const char *name, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    dict_t *dict_rsp = NULL;</div><div class='add'>+    int op_ret = -1;</div><div class='add'>+    int op_errno = ENOMEM;</div><div class='add'>+</div><div class='add'>+    if (!name || strcmp(name, GF_HEAL_INFO))</div><div class='add'>+        return -1;</div><div class='add'>+</div><div class='add'>+    op_errno = -ec_get_heal_info(this, loc, &amp;dict_rsp);</div><div class='add'>+    if (op_errno &lt;= 0) {</div><div class='add'>+        op_errno = op_ret = 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    STACK_UNWIND_STRICT(getxattr, frame, op_ret, op_errno, dict_rsp, NULL);</div><div class='add'>+    if (dict_rsp)</div><div class='add'>+        dict_unref(dict_rsp);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_gf_getxattr(call_frame_t *frame, xlator_t *this, loc_t *loc,</div><div class='add'>+               const char *name, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    int error = 0;</div><div class='add'>+    ec_t *ec = this-&gt;private;</div><div class='add'>+    int32_t fop_flags = EC_MINIMUM_ONE;</div><div class='add'>+</div><div class='add'>+    if (name &amp;&amp; strcmp(name, EC_XATTR_HEAL) != 0) {</div><div class='add'>+        EC_INTERNAL_XATTR_OR_GOTO(name, NULL, error, out);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (ec_handle_heal_commands(frame, this, loc, name, xdata) == 0)</div><div class='add'>+        return 0;</div><div class='add'>+</div><div class='add'>+    if (cluster_handle_marker_getxattr(frame, loc, name, ec-&gt;vol_uuid, NULL,</div><div class='add'>+                                       ec_marker_populate_args) == 0)</div><div class='add'>+        return 0;</div><div class='add'>+</div><div class='add'>+    if (name &amp;&amp; ((fnmatch(GF_XATTR_STIME_PATTERN, name, 0) == 0) ||</div><div class='add'>+                 XATTR_IS_NODE_UUID(name) || XATTR_IS_NODE_UUID_LIST(name))) {</div><div class='add'>+        fop_flags = EC_MINIMUM_ALL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ec_getxattr(frame, this, -1, fop_flags, default_getxattr_cbk, NULL, loc,</div><div class='add'>+                name, xdata);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+out:</div><div class='add'>+    error = ENODATA;</div><div class='add'>+    STACK_UNWIND_STRICT(getxattr, frame, -1, error, NULL, NULL);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_gf_fgetxattr(call_frame_t *frame, xlator_t *this, fd_t *fd, const char *name,</div><div class='add'>+                dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    int error = 0;</div><div class='add'>+</div><div class='add'>+    EC_INTERNAL_XATTR_OR_GOTO(name, NULL, error, out);</div><div class='add'>+</div><div class='add'>+    ec_fgetxattr(frame, this, -1, EC_MINIMUM_ONE, default_fgetxattr_cbk, NULL,</div><div class='add'>+                 fd, name, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+out:</div><div class='add'>+    error = ENODATA;</div><div class='add'>+    STACK_UNWIND_STRICT(fgetxattr, frame, -1, error, NULL, NULL);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_gf_inodelk(call_frame_t *frame, xlator_t *this, const char *volume,</div><div class='add'>+              loc_t *loc, int32_t cmd, struct gf_flock *flock, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    int32_t fop_flags = EC_MINIMUM_ALL;</div><div class='add'>+</div><div class='add'>+    if (flock-&gt;l_type == F_UNLCK)</div><div class='add'>+        fop_flags = EC_MINIMUM_ONE;</div><div class='add'>+</div><div class='add'>+    ec_inodelk(frame, this, &amp;frame-&gt;root-&gt;lk_owner, -1, fop_flags,</div><div class='add'>+               default_inodelk_cbk, NULL, volume, loc, cmd, flock, xdata);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_gf_finodelk(call_frame_t *frame, xlator_t *this, const char *volume,</div><div class='add'>+               fd_t *fd, int32_t cmd, struct gf_flock *flock, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    int32_t fop_flags = EC_MINIMUM_ALL;</div><div class='add'>+</div><div class='add'>+    if (flock-&gt;l_type == F_UNLCK)</div><div class='add'>+        fop_flags = EC_MINIMUM_ONE;</div><div class='add'>+    ec_finodelk(frame, this, &amp;frame-&gt;root-&gt;lk_owner, -1, fop_flags,</div><div class='add'>+                default_finodelk_cbk, NULL, volume, fd, cmd, flock, xdata);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_gf_link(call_frame_t *frame, xlator_t *this, loc_t *oldloc, loc_t *newloc,</div><div class='add'>+           dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    ec_link(frame, this, -1, EC_MINIMUM_MIN, default_link_cbk, NULL, oldloc,</div><div class='add'>+            newloc, xdata);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_gf_lk(call_frame_t *frame, xlator_t *this, fd_t *fd, int32_t cmd,</div><div class='add'>+         struct gf_flock *flock, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    int32_t fop_flags = EC_MINIMUM_ALL;</div><div class='add'>+</div><div class='add'>+    if (flock-&gt;l_type == F_UNLCK)</div><div class='add'>+        fop_flags = EC_MINIMUM_ONE;</div><div class='add'>+    ec_lk(frame, this, -1, fop_flags, default_lk_cbk, NULL, fd, cmd, flock,</div><div class='add'>+          xdata);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_gf_lookup(call_frame_t *frame, xlator_t *this, loc_t *loc, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    ec_lookup(frame, this, -1, EC_MINIMUM_MIN, default_lookup_cbk, NULL, loc,</div><div class='add'>+              xdata);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_gf_mkdir(call_frame_t *frame, xlator_t *this, loc_t *loc, mode_t mode,</div><div class='add'>+            mode_t umask, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    ec_mkdir(frame, this, -1, EC_MINIMUM_MIN, default_mkdir_cbk, NULL, loc,</div><div class='add'>+             mode, umask, xdata);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_gf_mknod(call_frame_t *frame, xlator_t *this, loc_t *loc, mode_t mode,</div><div class='add'>+            dev_t rdev, mode_t umask, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    ec_mknod(frame, this, -1, EC_MINIMUM_MIN, default_mknod_cbk, NULL, loc,</div><div class='add'>+             mode, rdev, umask, xdata);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_gf_open(call_frame_t *frame, xlator_t *this, loc_t *loc, int32_t flags,</div><div class='add'>+           fd_t *fd, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    ec_open(frame, this, -1, EC_MINIMUM_MIN, default_open_cbk, NULL, loc, flags,</div><div class='add'>+            fd, xdata);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_gf_opendir(call_frame_t *frame, xlator_t *this, loc_t *loc, fd_t *fd,</div><div class='add'>+              dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    ec_opendir(frame, this, -1, EC_MINIMUM_MIN, default_opendir_cbk, NULL, loc,</div><div class='add'>+               fd, xdata);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_gf_readdir(call_frame_t *frame, xlator_t *this, fd_t *fd, size_t size,</div><div class='add'>+              off_t offset, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    ec_readdir(frame, this, -1, EC_MINIMUM_ONE, default_readdir_cbk, NULL, fd,</div><div class='add'>+               size, offset, xdata);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_gf_readdirp(call_frame_t *frame, xlator_t *this, fd_t *fd, size_t size,</div><div class='add'>+               off_t offset, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    ec_readdirp(frame, this, -1, EC_MINIMUM_ONE, default_readdirp_cbk, NULL, fd,</div><div class='add'>+                size, offset, xdata);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_gf_readlink(call_frame_t *frame, xlator_t *this, loc_t *loc, size_t size,</div><div class='add'>+               dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    ec_readlink(frame, this, -1, EC_MINIMUM_ONE, default_readlink_cbk, NULL,</div><div class='add'>+                loc, size, xdata);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_gf_readv(call_frame_t *frame, xlator_t *this, fd_t *fd, size_t size,</div><div class='add'>+            off_t offset, uint32_t flags, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    ec_readv(frame, this, -1, EC_MINIMUM_MIN, default_readv_cbk, NULL, fd, size,</div><div class='add'>+             offset, flags, xdata);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_gf_removexattr(call_frame_t *frame, xlator_t *this, loc_t *loc,</div><div class='add'>+                  const char *name, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    int error = 0;</div><div class='add'>+</div><div class='add'>+    EC_INTERNAL_XATTR_OR_GOTO(name, xdata, error, out);</div><div class='add'>+</div><div class='add'>+    ec_removexattr(frame, this, -1, EC_MINIMUM_MIN, default_removexattr_cbk,</div><div class='add'>+                   NULL, loc, name, xdata);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+out:</div><div class='add'>+    STACK_UNWIND_STRICT(removexattr, frame, -1, error, NULL);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_gf_fremovexattr(call_frame_t *frame, xlator_t *this, fd_t *fd,</div><div class='add'>+                   const char *name, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    int error = 0;</div><div class='add'>+</div><div class='add'>+    EC_INTERNAL_XATTR_OR_GOTO(name, xdata, error, out);</div><div class='add'>+</div><div class='add'>+    ec_fremovexattr(frame, this, -1, EC_MINIMUM_MIN, default_fremovexattr_cbk,</div><div class='add'>+                    NULL, fd, name, xdata);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+out:</div><div class='add'>+    STACK_UNWIND_STRICT(fremovexattr, frame, -1, error, NULL);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_gf_rename(call_frame_t *frame, xlator_t *this, loc_t *oldloc, loc_t *newloc,</div><div class='add'>+             dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    ec_rename(frame, this, -1, EC_MINIMUM_MIN, default_rename_cbk, NULL, oldloc,</div><div class='add'>+              newloc, xdata);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_gf_rmdir(call_frame_t *frame, xlator_t *this, loc_t *loc, int xflags,</div><div class='add'>+            dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    ec_rmdir(frame, this, -1, EC_MINIMUM_MIN, default_rmdir_cbk, NULL, loc,</div><div class='add'>+             xflags, xdata);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_gf_setattr(call_frame_t *frame, xlator_t *this, loc_t *loc,</div><div class='add'>+              struct iatt *stbuf, int32_t valid, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    ec_setattr(frame, this, -1, EC_MINIMUM_MIN, default_setattr_cbk, NULL, loc,</div><div class='add'>+               stbuf, valid, xdata);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_gf_fsetattr(call_frame_t *frame, xlator_t *this, fd_t *fd,</div><div class='add'>+               struct iatt *stbuf, int32_t valid, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    ec_fsetattr(frame, this, -1, EC_MINIMUM_MIN, default_fsetattr_cbk, NULL, fd,</div><div class='add'>+                stbuf, valid, xdata);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_gf_setxattr(call_frame_t *frame, xlator_t *this, loc_t *loc, dict_t *dict,</div><div class='add'>+               int32_t flags, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    int error = 0;</div><div class='add'>+</div><div class='add'>+    EC_INTERNAL_XATTR_OR_GOTO("", dict, error, out);</div><div class='add'>+</div><div class='add'>+    ec_setxattr(frame, this, -1, EC_MINIMUM_MIN, default_setxattr_cbk, NULL,</div><div class='add'>+                loc, dict, flags, xdata);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+out:</div><div class='add'>+    STACK_UNWIND_STRICT(setxattr, frame, -1, error, NULL);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_gf_fsetxattr(call_frame_t *frame, xlator_t *this, fd_t *fd, dict_t *dict,</div><div class='add'>+                int32_t flags, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    int error = 0;</div><div class='add'>+</div><div class='add'>+    EC_INTERNAL_XATTR_OR_GOTO("", dict, error, out);</div><div class='add'>+</div><div class='add'>+    ec_fsetxattr(frame, this, -1, EC_MINIMUM_MIN, default_fsetxattr_cbk, NULL,</div><div class='add'>+                 fd, dict, flags, xdata);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+out:</div><div class='add'>+    STACK_UNWIND_STRICT(fsetxattr, frame, -1, error, NULL);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_gf_stat(call_frame_t *frame, xlator_t *this, loc_t *loc, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    ec_stat(frame, this, -1, EC_MINIMUM_MIN, default_stat_cbk, NULL, loc,</div><div class='add'>+            xdata);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_gf_fstat(call_frame_t *frame, xlator_t *this, fd_t *fd, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    ec_fstat(frame, this, -1, EC_MINIMUM_MIN, default_fstat_cbk, NULL, fd,</div><div class='add'>+             xdata);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_gf_statfs(call_frame_t *frame, xlator_t *this, loc_t *loc, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    ec_statfs(frame, this, -1, EC_MINIMUM_MIN, default_statfs_cbk, NULL, loc,</div><div class='add'>+              xdata);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_gf_symlink(call_frame_t *frame, xlator_t *this, const char *linkname,</div><div class='add'>+              loc_t *loc, mode_t umask, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    ec_symlink(frame, this, -1, EC_MINIMUM_MIN, default_symlink_cbk, NULL,</div><div class='add'>+               linkname, loc, umask, xdata);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_gf_truncate(call_frame_t *frame, xlator_t *this, loc_t *loc, off_t offset,</div><div class='add'>+               dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    ec_truncate(frame, this, -1, EC_MINIMUM_MIN, default_truncate_cbk, NULL,</div><div class='add'>+                loc, offset, xdata);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_gf_ftruncate(call_frame_t *frame, xlator_t *this, fd_t *fd, off_t offset,</div><div class='add'>+                dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    ec_ftruncate(frame, this, -1, EC_MINIMUM_MIN, default_ftruncate_cbk, NULL,</div><div class='add'>+                 fd, offset, xdata);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_gf_unlink(call_frame_t *frame, xlator_t *this, loc_t *loc, int xflags,</div><div class='add'>+             dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    ec_unlink(frame, this, -1, EC_MINIMUM_MIN, default_unlink_cbk, NULL, loc,</div><div class='add'>+              xflags, xdata);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_gf_writev(call_frame_t *frame, xlator_t *this, fd_t *fd,</div><div class='add'>+             struct iovec *vector, int32_t count, off_t offset, uint32_t flags,</div><div class='add'>+             struct iobref *iobref, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    ec_writev(frame, this, -1, EC_MINIMUM_MIN, default_writev_cbk, NULL, fd,</div><div class='add'>+              vector, count, offset, flags, iobref, xdata);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_gf_xattrop(call_frame_t *frame, xlator_t *this, loc_t *loc,</div><div class='add'>+              gf_xattrop_flags_t optype, dict_t *xattr, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    ec_xattrop(frame, this, -1, EC_MINIMUM_MIN, default_xattrop_cbk, NULL, loc,</div><div class='add'>+               optype, xattr, xdata);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_gf_fxattrop(call_frame_t *frame, xlator_t *this, fd_t *fd,</div><div class='add'>+               gf_xattrop_flags_t optype, dict_t *xattr, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    ec_fxattrop(frame, this, -1, EC_MINIMUM_MIN, default_fxattrop_cbk, NULL, fd,</div><div class='add'>+                optype, xattr, xdata);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_gf_zerofill(call_frame_t *frame, xlator_t *this, fd_t *fd, off_t offset,</div><div class='add'>+               off_t len, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    default_zerofill_failure_cbk(frame, ENOTSUP);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_gf_seek(call_frame_t *frame, xlator_t *this, fd_t *fd, off_t offset,</div><div class='add'>+           gf_seek_what_t what, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    ec_seek(frame, this, -1, EC_MINIMUM_ONE, default_seek_cbk, NULL, fd, offset,</div><div class='add'>+            what, xdata);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_gf_ipc(call_frame_t *frame, xlator_t *this, int32_t op, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    ec_ipc(frame, this, -1, EC_MINIMUM_MIN, default_ipc_cbk, NULL, op, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_gf_forget(xlator_t *this, inode_t *inode)</div><div class='add'>+{</div><div class='add'>+    uint64_t value = 0;</div><div class='add'>+    ec_inode_t *ctx = NULL;</div><div class='add'>+</div><div class='add'>+    if ((inode_ctx_del(inode, this, &amp;value) == 0) &amp;&amp; (value != 0)) {</div><div class='add'>+        ctx = (ec_inode_t *)(uintptr_t)value;</div><div class='add'>+        /* We can only forget an inode if it has been unlocked, so the stripe</div><div class='add'>+         * cache should also be empty. */</div><div class='add'>+        GF_ASSERT(list_empty(&amp;ctx-&gt;stripe_cache.lru));</div><div class='add'>+        GF_FREE(ctx);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+ec_gf_release_fd(xlator_t *this, fd_t *fd)</div><div class='add'>+{</div><div class='add'>+    uint64_t value = 0;</div><div class='add'>+    ec_fd_t *ctx = NULL;</div><div class='add'>+</div><div class='add'>+    if ((fd_ctx_del(fd, this, &amp;value) == 0) &amp;&amp; (value != 0)) {</div><div class='add'>+        ctx = (ec_fd_t *)(uintptr_t)value;</div><div class='add'>+        loc_wipe(&amp;ctx-&gt;loc);</div><div class='add'>+        GF_FREE(ctx);</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_gf_release(xlator_t *this, fd_t *fd)</div><div class='add'>+{</div><div class='add'>+    ec_gf_release_fd(this, fd);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_gf_releasedir(xlator_t *this, fd_t *fd)</div><div class='add'>+{</div><div class='add'>+    ec_gf_release_fd(this, fd);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+ec_dump_private(xlator_t *this)</div><div class='add'>+{</div><div class='add'>+    ec_t *ec = NULL;</div><div class='add'>+    char key_prefix[GF_DUMP_MAX_BUF_LEN];</div><div class='add'>+    char tmp[65];</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(this);</div><div class='add'>+</div><div class='add'>+    ec = this-&gt;private;</div><div class='add'>+    GF_ASSERT(ec);</div><div class='add'>+</div><div class='add'>+    snprintf(key_prefix, GF_DUMP_MAX_BUF_LEN, "%s.%s", this-&gt;type, this-&gt;name);</div><div class='add'>+    gf_proc_dump_add_section("%s", key_prefix);</div><div class='add'>+    gf_proc_dump_write("up", "%u", ec-&gt;up);</div><div class='add'>+    gf_proc_dump_write("nodes", "%u", ec-&gt;nodes);</div><div class='add'>+    gf_proc_dump_write("redundancy", "%u", ec-&gt;redundancy);</div><div class='add'>+    gf_proc_dump_write("fragment_size", "%u", ec-&gt;fragment_size);</div><div class='add'>+    gf_proc_dump_write("stripe_size", "%u", ec-&gt;stripe_size);</div><div class='add'>+    gf_proc_dump_write("childs_up", "%u", ec-&gt;xl_up_count);</div><div class='add'>+    gf_proc_dump_write("childs_up_mask", "%s",</div><div class='add'>+                       ec_bin(tmp, sizeof(tmp), ec-&gt;xl_up, ec-&gt;nodes));</div><div class='add'>+    if (ec-&gt;read_mask) {</div><div class='add'>+        gf_proc_dump_write("read-mask", "%s",</div><div class='add'>+                           ec_bin(tmp, sizeof(tmp), ec-&gt;read_mask, ec-&gt;nodes));</div><div class='add'>+    }</div><div class='add'>+    gf_proc_dump_write("background-heals", "%d", ec-&gt;background_heals);</div><div class='add'>+    gf_proc_dump_write("heal-wait-qlength", "%d", ec-&gt;heal_wait_qlen);</div><div class='add'>+    gf_proc_dump_write("self-heal-window-size", "%" PRIu32,</div><div class='add'>+                       ec-&gt;self_heal_window_size);</div><div class='add'>+    gf_proc_dump_write("healers", "%d", ec-&gt;healers);</div><div class='add'>+    gf_proc_dump_write("heal-waiters", "%d", ec-&gt;heal_waiters);</div><div class='add'>+    gf_proc_dump_write("read-policy", "%s", ec_read_policies[ec-&gt;read_policy]);</div><div class='add'>+    gf_proc_dump_write("parallel-writes", "%d", ec-&gt;parallel_writes);</div><div class='add'>+    gf_proc_dump_write("quorum-count", "%u", ec-&gt;quorum_count);</div><div class='add'>+</div><div class='add'>+    snprintf(key_prefix, GF_DUMP_MAX_BUF_LEN, "%s.%s.stats.stripe_cache",</div><div class='add'>+             this-&gt;type, this-&gt;name);</div><div class='add'>+    gf_proc_dump_add_section("%s", key_prefix);</div><div class='add'>+</div><div class='add'>+    gf_proc_dump_write("hits", "%" GF_PRI_ATOMIC,</div><div class='add'>+                       GF_ATOMIC_GET(ec-&gt;stats.stripe_cache.hits));</div><div class='add'>+    gf_proc_dump_write("misses", "%" GF_PRI_ATOMIC,</div><div class='add'>+                       GF_ATOMIC_GET(ec-&gt;stats.stripe_cache.misses));</div><div class='add'>+    gf_proc_dump_write("updates", "%" GF_PRI_ATOMIC,</div><div class='add'>+                       GF_ATOMIC_GET(ec-&gt;stats.stripe_cache.updates));</div><div class='add'>+    gf_proc_dump_write("invalidations", "%" GF_PRI_ATOMIC,</div><div class='add'>+                       GF_ATOMIC_GET(ec-&gt;stats.stripe_cache.invals));</div><div class='add'>+    gf_proc_dump_write("evicts", "%" GF_PRI_ATOMIC,</div><div class='add'>+                       GF_ATOMIC_GET(ec-&gt;stats.stripe_cache.evicts));</div><div class='add'>+    gf_proc_dump_write("allocations", "%" GF_PRI_ATOMIC,</div><div class='add'>+                       GF_ATOMIC_GET(ec-&gt;stats.stripe_cache.allocs));</div><div class='add'>+    gf_proc_dump_write("errors", "%" GF_PRI_ATOMIC,</div><div class='add'>+                       GF_ATOMIC_GET(ec-&gt;stats.stripe_cache.errors));</div><div class='add'>+    gf_proc_dump_write("heals-attempted", "%" GF_PRI_ATOMIC,</div><div class='add'>+                       GF_ATOMIC_GET(ec-&gt;stats.shd.attempted));</div><div class='add'>+    gf_proc_dump_write("heals-completed", "%" GF_PRI_ATOMIC,</div><div class='add'>+                       GF_ATOMIC_GET(ec-&gt;stats.shd.completed));</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+struct xlator_fops fops = {.lookup = ec_gf_lookup,</div><div class='add'>+                           .stat = ec_gf_stat,</div><div class='add'>+                           .fstat = ec_gf_fstat,</div><div class='add'>+                           .truncate = ec_gf_truncate,</div><div class='add'>+                           .ftruncate = ec_gf_ftruncate,</div><div class='add'>+                           .access = ec_gf_access,</div><div class='add'>+                           .readlink = ec_gf_readlink,</div><div class='add'>+                           .mknod = ec_gf_mknod,</div><div class='add'>+                           .mkdir = ec_gf_mkdir,</div><div class='add'>+                           .unlink = ec_gf_unlink,</div><div class='add'>+                           .rmdir = ec_gf_rmdir,</div><div class='add'>+                           .symlink = ec_gf_symlink,</div><div class='add'>+                           .rename = ec_gf_rename,</div><div class='add'>+                           .link = ec_gf_link,</div><div class='add'>+                           .create = ec_gf_create,</div><div class='add'>+                           .open = ec_gf_open,</div><div class='add'>+                           .readv = ec_gf_readv,</div><div class='add'>+                           .writev = ec_gf_writev,</div><div class='add'>+                           .flush = ec_gf_flush,</div><div class='add'>+                           .fsync = ec_gf_fsync,</div><div class='add'>+                           .opendir = ec_gf_opendir,</div><div class='add'>+                           .readdir = ec_gf_readdir,</div><div class='add'>+                           .readdirp = ec_gf_readdirp,</div><div class='add'>+                           .fsyncdir = ec_gf_fsyncdir,</div><div class='add'>+                           .statfs = ec_gf_statfs,</div><div class='add'>+                           .setxattr = ec_gf_setxattr,</div><div class='add'>+                           .getxattr = ec_gf_getxattr,</div><div class='add'>+                           .fsetxattr = ec_gf_fsetxattr,</div><div class='add'>+                           .fgetxattr = ec_gf_fgetxattr,</div><div class='add'>+                           .removexattr = ec_gf_removexattr,</div><div class='add'>+                           .fremovexattr = ec_gf_fremovexattr,</div><div class='add'>+                           .lk = ec_gf_lk,</div><div class='add'>+                           .inodelk = ec_gf_inodelk,</div><div class='add'>+                           .finodelk = ec_gf_finodelk,</div><div class='add'>+                           .entrylk = ec_gf_entrylk,</div><div class='add'>+                           .fentrylk = ec_gf_fentrylk,</div><div class='add'>+                           .xattrop = ec_gf_xattrop,</div><div class='add'>+                           .fxattrop = ec_gf_fxattrop,</div><div class='add'>+                           .setattr = ec_gf_setattr,</div><div class='add'>+                           .fsetattr = ec_gf_fsetattr,</div><div class='add'>+                           .fallocate = ec_gf_fallocate,</div><div class='add'>+                           .discard = ec_gf_discard,</div><div class='add'>+                           .zerofill = ec_gf_zerofill,</div><div class='add'>+                           .seek = ec_gf_seek,</div><div class='add'>+                           .ipc = ec_gf_ipc};</div><div class='add'>+</div><div class='add'>+struct xlator_cbks cbks = {.forget = ec_gf_forget,</div><div class='add'>+                           .release = ec_gf_release,</div><div class='add'>+                           .releasedir = ec_gf_releasedir};</div><div class='add'>+</div><div class='add'>+struct xlator_dumpops dumpops = {.priv = ec_dump_private};</div><div class='add'>+</div><div class='add'>+struct volume_options options[] = {</div><div class='add'>+    {.key = {"redundancy"},</div><div class='add'>+     .type = GF_OPTION_TYPE_INT,</div><div class='add'>+     .default_value = "{{ volume.redundancy }}",</div><div class='add'>+     .description = "Maximum number of bricks that can fail "</div><div class='add'>+                    "simultaneously without losing data."},</div><div class='add'>+    {</div><div class='add'>+        .key = {"self-heal-daemon"},</div><div class='add'>+        .type = GF_OPTION_TYPE_BOOL,</div><div class='add'>+        .description = "self-heal daemon enable/disable",</div><div class='add'>+        .default_value = "enable",</div><div class='add'>+        .op_version = {GD_OP_VERSION_3_7_0},</div><div class='add'>+        .flags = OPT_FLAG_SETTABLE | OPT_FLAG_DOC,</div><div class='add'>+        .tags = {"disperse"},</div><div class='add'>+    },</div><div class='add'>+    {.key = {"iam-self-heal-daemon"},</div><div class='add'>+     .type = GF_OPTION_TYPE_BOOL,</div><div class='add'>+     .default_value = "off",</div><div class='add'>+     .description = "This option differentiates if the disperse "</div><div class='add'>+                    "translator is running as part of self-heal-daemon "</div><div class='add'>+                    "or not."},</div><div class='add'>+    {.key = {"eager-lock"},</div><div class='add'>+     .type = GF_OPTION_TYPE_BOOL,</div><div class='add'>+     .default_value = "on",</div><div class='add'>+     .op_version = {GD_OP_VERSION_3_7_10},</div><div class='add'>+     .flags = OPT_FLAG_SETTABLE | OPT_FLAG_CLIENT_OPT | OPT_FLAG_DOC,</div><div class='add'>+     .tags = {"disperse"},</div><div class='add'>+     .description = "Enable/Disable eager lock for regular files on a "</div><div class='add'>+                    "disperse volume. If a fop takes a lock and completes "</div><div class='add'>+                    "its operation, it waits for next 1 second before "</div><div class='add'>+                    "releasing the lock, to see if the lock can be reused "</div><div class='add'>+                    "for next fop from the same client. If ec finds any lock "</div><div class='add'>+                    "contention within 1 second it releases the lock "</div><div class='add'>+                    "immediately before time expires. This improves the "</div><div class='add'>+                    "performance of file operations. However, as it takes "</div><div class='add'>+                    "lock on first brick, for few operations like read, "</div><div class='add'>+                    "discovery of lock contention might take long time and "</div><div class='add'>+                    "can actually degrade the performance. If eager lock is "</div><div class='add'>+                    "disabled, lock will be released as soon as fop "</div><div class='add'>+                    "completes."},</div><div class='add'>+    {.key = {"other-eager-lock"},</div><div class='add'>+     .type = GF_OPTION_TYPE_BOOL,</div><div class='add'>+     .default_value = "on",</div><div class='add'>+     .op_version = {GD_OP_VERSION_3_13_0},</div><div class='add'>+     .flags = OPT_FLAG_SETTABLE | OPT_FLAG_CLIENT_OPT | OPT_FLAG_DOC,</div><div class='add'>+     .tags = {"disperse"},</div><div class='add'>+     .description = "It's equivalent to the eager-lock option but for non "</div><div class='add'>+                    "regular files."},</div><div class='add'>+    {.key = {"eager-lock-timeout"},</div><div class='add'>+     .type = GF_OPTION_TYPE_INT,</div><div class='add'>+     .min = 1,</div><div class='add'>+     .max = 60,</div><div class='add'>+     .default_value = "1",</div><div class='add'>+     .op_version = {GD_OP_VERSION_4_0_0},</div><div class='add'>+     .flags = OPT_FLAG_SETTABLE | OPT_FLAG_CLIENT_OPT | OPT_FLAG_DOC,</div><div class='add'>+     .tags = {"disperse", "locks", "timeout"},</div><div class='add'>+     .description = "Maximum time (in seconds) that a lock on an inode is "</div><div class='add'>+                    "kept held if no new operations on the inode are "</div><div class='add'>+                    "received."},</div><div class='add'>+    {.key = {"other-eager-lock-timeout"},</div><div class='add'>+     .type = GF_OPTION_TYPE_INT,</div><div class='add'>+     .min = 1,</div><div class='add'>+     .max = 60,</div><div class='add'>+     .default_value = "1",</div><div class='add'>+     .op_version = {GD_OP_VERSION_4_0_0},</div><div class='add'>+     .flags = OPT_FLAG_SETTABLE | OPT_FLAG_CLIENT_OPT | OPT_FLAG_DOC,</div><div class='add'>+     .tags = {"disperse", "locks", "timeout"},</div><div class='add'>+     .description = "It's equivalent to eager-lock-timeout option but for "</div><div class='add'>+                    "non regular files."},</div><div class='add'>+    {</div><div class='add'>+        .key = {"background-heals"},</div><div class='add'>+        .type = GF_OPTION_TYPE_INT,</div><div class='add'>+        .min = 0, /*Disabling background heals*/</div><div class='add'>+        .max = 256,</div><div class='add'>+        .default_value = "8",</div><div class='add'>+        .op_version = {GD_OP_VERSION_3_7_3},</div><div class='add'>+        .flags = OPT_FLAG_SETTABLE | OPT_FLAG_CLIENT_OPT | OPT_FLAG_DOC,</div><div class='add'>+        .tags = {"disperse"},</div><div class='add'>+        .description = "This option can be used to control number of parallel"</div><div class='add'>+                       " heals",</div><div class='add'>+    },</div><div class='add'>+    {</div><div class='add'>+        .key = {"heal-wait-qlength"},</div><div class='add'>+        .type = GF_OPTION_TYPE_INT,</div><div class='add'>+        .min = 0,</div><div class='add'>+        .max =</div><div class='add'>+            65536, /*Around 100MB as of now with sizeof(ec_fop_data_t) at 1800*/</div><div class='add'>+        .default_value = "128",</div><div class='add'>+        .op_version = {GD_OP_VERSION_3_7_3},</div><div class='add'>+        .flags = OPT_FLAG_SETTABLE | OPT_FLAG_CLIENT_OPT | OPT_FLAG_DOC,</div><div class='add'>+        .tags = {"disperse"},</div><div class='add'>+        .description = "This option can be used to control number of heals"</div><div class='add'>+                       " that can wait",</div><div class='add'>+    },</div><div class='add'>+    {.key = {"heal-timeout"},</div><div class='add'>+     .type = GF_OPTION_TYPE_INT,</div><div class='add'>+     .min = 60,</div><div class='add'>+     .max = INT_MAX,</div><div class='add'>+     .default_value = "600",</div><div class='add'>+     .op_version = {GD_OP_VERSION_3_7_3},</div><div class='add'>+     .flags = OPT_FLAG_SETTABLE,</div><div class='add'>+     .tags = {"disperse"},</div><div class='add'>+     .description = "time interval for checking the need to self-heal "</div><div class='add'>+                    "in self-heal-daemon"},</div><div class='add'>+    {</div><div class='add'>+        .key = {"read-policy"},</div><div class='add'>+        .type = GF_OPTION_TYPE_STR,</div><div class='add'>+        .value = {"round-robin", "gfid-hash"},</div><div class='add'>+        .default_value = "gfid-hash",</div><div class='add'>+        .op_version = {GD_OP_VERSION_3_7_6},</div><div class='add'>+        .flags = OPT_FLAG_SETTABLE | OPT_FLAG_CLIENT_OPT | OPT_FLAG_DOC,</div><div class='add'>+        .tags = {"disperse"},</div><div class='add'>+        .description =</div><div class='add'>+            "inode-read fops happen only on 'k' number of bricks in"</div><div class='add'>+            " n=k+m disperse subvolume. 'round-robin' selects the read"</div><div class='add'>+            " subvolume using round-robin algo. 'gfid-hash' selects read"</div><div class='add'>+            " subvolume based on hash of the gfid of that file/directory.",</div><div class='add'>+    },</div><div class='add'>+    {.key = {"shd-max-threads"},</div><div class='add'>+     .type = GF_OPTION_TYPE_INT,</div><div class='add'>+     .min = 1,</div><div class='add'>+     .max = 64,</div><div class='add'>+     .default_value = "1",</div><div class='add'>+     .op_version = {GD_OP_VERSION_3_9_0},</div><div class='add'>+     .flags = OPT_FLAG_SETTABLE | OPT_FLAG_DOC,</div><div class='add'>+     .tags = {"disperse"},</div><div class='add'>+     .description = "Maximum number of parallel heals SHD can do per local "</div><div class='add'>+                    "brick.  This can substantially lower heal times, "</div><div class='add'>+                    "but can also crush your bricks if you don't have "</div><div class='add'>+                    "the storage hardware to support this."},</div><div class='add'>+    {.key = {"shd-wait-qlength"},</div><div class='add'>+     .type = GF_OPTION_TYPE_INT,</div><div class='add'>+     .min = 1,</div><div class='add'>+     .max = 65536,</div><div class='add'>+     .default_value = "1024",</div><div class='add'>+     .op_version = {GD_OP_VERSION_3_9_0},</div><div class='add'>+     .flags = OPT_FLAG_SETTABLE | OPT_FLAG_DOC,</div><div class='add'>+     .tags = {"disperse"},</div><div class='add'>+     .description = "This option can be used to control number of heals"</div><div class='add'>+                    " that can wait in SHD per subvolume"},</div><div class='add'>+    {.key = {"cpu-extensions"},</div><div class='add'>+     .type = GF_OPTION_TYPE_STR,</div><div class='add'>+     .value = {"none", "auto", "x64", "sse", "avx"},</div><div class='add'>+     .default_value = "auto",</div><div class='add'>+     .op_version = {GD_OP_VERSION_3_9_0},</div><div class='add'>+     .flags = OPT_FLAG_SETTABLE | OPT_FLAG_CLIENT_OPT | OPT_FLAG_DOC,</div><div class='add'>+     .tags = {"disperse"},</div><div class='add'>+     .description = "force the cpu extensions to be used to accelerate the "</div><div class='add'>+                    "galois field computations."},</div><div class='add'>+    {.key = {"self-heal-window-size"},</div><div class='add'>+     .type = GF_OPTION_TYPE_INT,</div><div class='add'>+     .min = 1,</div><div class='add'>+     .max = 1024,</div><div class='add'>+     .default_value = "1",</div><div class='add'>+     .op_version = {GD_OP_VERSION_3_11_0},</div><div class='add'>+     .flags = OPT_FLAG_SETTABLE | OPT_FLAG_CLIENT_OPT | OPT_FLAG_DOC,</div><div class='add'>+     .tags = {"disperse"},</div><div class='add'>+     .description = "Maximum number blocks(128KB) per file for which "</div><div class='add'>+                    "self-heal process would be applied simultaneously."},</div><div class='add'>+    {.key = {"optimistic-change-log"},</div><div class='add'>+     .type = GF_OPTION_TYPE_BOOL,</div><div class='add'>+     .default_value = "on",</div><div class='add'>+     .op_version = {GD_OP_VERSION_3_10_1},</div><div class='add'>+     .flags = OPT_FLAG_SETTABLE | OPT_FLAG_CLIENT_OPT,</div><div class='add'>+     .tags = {"disperse"},</div><div class='add'>+     .description = "Set/Unset dirty flag for every update fop at the start"</div><div class='add'>+                    "of the fop. If OFF, this option impacts performance of"</div><div class='add'>+                    "entry  operations or metadata operations as it will"</div><div class='add'>+                    "set dirty flag at the start and unset it at the end of"</div><div class='add'>+                    "ALL update fop. If ON and all the bricks are good,"</div><div class='add'>+                    "dirty flag will be set at the start only for file fops"</div><div class='add'>+                    "For metadata and entry fops dirty flag will not be set"</div><div class='add'>+                    "at the start, if all the bricks are good. This does"</div><div class='add'>+                    "not impact performance for metadata operations and"</div><div class='add'>+                    "entry operation but has a very small window to miss"</div><div class='add'>+                    "marking entry as dirty in case it is required to be"</div><div class='add'>+                    "healed"},</div><div class='add'>+    {.key = {"parallel-writes"},</div><div class='add'>+     .type = GF_OPTION_TYPE_BOOL,</div><div class='add'>+     .default_value = "on",</div><div class='add'>+     .description = "This controls if writes can be wound in parallel as long"</div><div class='add'>+                    "as it doesn't modify same stripes"},</div><div class='add'>+    {.key = {"stripe-cache"},</div><div class='add'>+     .type = GF_OPTION_TYPE_INT,</div><div class='add'>+     .min = 0, /*Disabling stripe_cache*/</div><div class='add'>+     .max = EC_STRIPE_CACHE_MAX_SIZE,</div><div class='add'>+     .default_value = "4",</div><div class='add'>+     .description = "This option will keep the last stripe of write fop"</div><div class='add'>+                    "in memory. If next write falls in this stripe, we need"</div><div class='add'>+                    "not to read it again from backend and we can save READ"</div><div class='add'>+                    "fop going over the network. This will improve performance,"</div><div class='add'>+                    "specially for sequential writes. However, this will also"</div><div class='add'>+                    "lead to extra memory consumption, maximum "</div><div class='add'>+                    "(cache size * stripe size) Bytes per open file."},</div><div class='add'>+    {</div><div class='add'>+        .key = {"quorum-count"},</div><div class='add'>+        .type = GF_OPTION_TYPE_INT,</div><div class='add'>+        .default_value = "0",</div><div class='add'>+        .description =</div><div class='add'>+            "This option can be used to define how many successes on"</div><div class='add'>+            "the bricks constitute a success to the application. This"</div><div class='add'>+            " count should be in the range"</div><div class='add'>+            "[disperse-data-count,  disperse-count] (inclusive)",</div><div class='add'>+    },</div><div class='add'>+    {</div><div class='add'>+        .key = {"ec-read-mask"},</div><div class='add'>+        .type = GF_OPTION_TYPE_STR,</div><div class='add'>+        .default_value = NULL,</div><div class='add'>+        .description = "This option can be used to choose which bricks can be"</div><div class='add'>+                       " used for reading data/metadata of a file/directory",</div><div class='add'>+    },</div><div class='add'>+    {</div><div class='add'>+        .key = {NULL},</div><div class='add'>+    },</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+xlator_api_t xlator_api = {</div><div class='add'>+    .init = init,</div><div class='add'>+    .fini = fini,</div><div class='add'>+    .notify = notify,</div><div class='add'>+    .reconfigure = reconfigure,</div><div class='add'>+    .mem_acct_init = mem_acct_init,</div><div class='add'>+    .op_version = {1},</div><div class='add'>+    .dumpops = &amp;dumpops,</div><div class='add'>+    .fops = &amp;fops,</div><div class='add'>+    .cbks = &amp;cbks,</div><div class='add'>+    .options = options,</div><div class='add'>+    .identifier = "disperse",</div><div class='add'>+    .category = GF_MAINTAINED,</div><div class='add'>+};</div><div class='head'>diff --git a/xlators/cluster/ec/src/ec.h b/xlators/cluster/ec/src/ec.h<br/>new file mode 100644<br/>index 00000000000..6f6de6d5981<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/xlators/cluster/ec/src/ec.h?id=d1d7a6f35c816822fab51c820e25023863c239c1'>xlators/cluster/ec/src/ec.h</a></div><div class='hunk'>@@ -0,0 +1,34 @@</div><div class='add'>+/*</div><div class='add'>+  Copyright (c) 2012-2014 DataLab, s.l. &lt;http://www.datalab.es&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#ifndef __EC_H__</div><div class='add'>+#define __EC_H__</div><div class='add'>+</div><div class='add'>+#include "ec-method.h"</div><div class='add'>+</div><div class='add'>+#define EC_XATTR_PREFIX "trusted.ec."</div><div class='add'>+#define EC_XATTR_CONFIG EC_XATTR_PREFIX "config"</div><div class='add'>+#define EC_XATTR_SIZE EC_XATTR_PREFIX "size"</div><div class='add'>+#define EC_XATTR_VERSION EC_XATTR_PREFIX "version"</div><div class='add'>+#define EC_XATTR_HEAL EC_XATTR_PREFIX "heal"</div><div class='add'>+#define EC_XATTR_HEAL_NEW EC_XATTR_PREFIX "heal-new"</div><div class='add'>+#define EC_XATTR_DIRTY EC_XATTR_PREFIX "dirty"</div><div class='add'>+#define EC_STRIPE_CACHE_MAX_SIZE 10</div><div class='add'>+#define EC_VERSION_SIZE 2</div><div class='add'>+#define EC_SHD_INODE_LRU_LIMIT 10</div><div class='add'>+</div><div class='add'>+#define EC_MAX_FRAGMENTS EC_METHOD_MAX_FRAGMENTS</div><div class='add'>+/* The maximum number of nodes is derived from the maximum allowed fragments</div><div class='add'>+ * using the rule that redundancy cannot be equal or greater than the number</div><div class='add'>+ * of fragments.</div><div class='add'>+ */</div><div class='add'>+#define EC_MAX_NODES min(EC_MAX_FRAGMENTS * 2 - 1, EC_METHOD_MAX_NODES)</div><div class='add'>+</div><div class='add'>+#endif /* __EC_H__ */</div><div class='head'>diff --git a/xlators/cluster/ha/Makefile.am b/xlators/cluster/ha/Makefile.am<br/>deleted file mode 100644<br/>index d471a3f9243..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/xlators/cluster/ha/Makefile.am?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/cluster/ha/Makefile.am</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,3 +0,0 @@</div><div class='del'>-SUBDIRS = src</div><div class='del'>-</div><div class='del'>-CLEANFILES = </div><div class='head'>diff --git a/xlators/cluster/ha/src/Makefile.am b/xlators/cluster/ha/src/Makefile.am<br/>deleted file mode 100644<br/>index 5f78a296533..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/xlators/cluster/ha/src/Makefile.am?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/cluster/ha/src/Makefile.am</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,15 +0,0 @@</div><div class='del'>-xlator_LTLIBRARIES = ha.la</div><div class='del'>-xlatordir = $(libdir)/glusterfs/$(PACKAGE_VERSION)/xlator/testing/cluster</div><div class='del'>-</div><div class='del'>-ha_la_LDFLAGS = -module -avoidversion </div><div class='del'>-</div><div class='del'>-ha_la_SOURCES = ha-helpers.c ha.c</div><div class='del'>-ha_la_LIBADD = $(top_builddir)/libglusterfs/src/libglusterfs.la</div><div class='del'>-</div><div class='del'>-noinst_HEADERS = ha.h</div><div class='del'>-</div><div class='del'>-AM_CFLAGS = -fPIC -D_FILE_OFFSET_BITS=64 -D_GNU_SOURCE -Wall -D$(GF_HOST_OS) \</div><div class='del'>-	    -I$(top_srcdir)/libglusterfs/src -shared -nostartfiles $(GF_CFLAGS)</div><div class='del'>-</div><div class='del'>-CLEANFILES = </div><div class='del'>-</div><div class='head'>diff --git a/xlators/cluster/ha/src/ha-helpers.c b/xlators/cluster/ha/src/ha-helpers.c<br/>deleted file mode 100644<br/>index fb6593101a4..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/xlators/cluster/ha/src/ha-helpers.c?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/cluster/ha/src/ha-helpers.c</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,204 +0,0 @@</div><div class='del'>-/*</div><div class='del'>-  Copyright (c) 2008-2009 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='del'>-  This file is part of GlusterFS.</div><div class='del'>-</div><div class='del'>-  GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-  it under the terms of the GNU General Public License as published</div><div class='del'>-  by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-  or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-  GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-  WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-  General Public License for more details.</div><div class='del'>-</div><div class='del'>-  You should have received a copy of the GNU General Public License</div><div class='del'>-  along with this program.  If not, see</div><div class='del'>-  &lt;http://www.gnu.org/licenses/&gt;.</div><div class='del'>-*/</div><div class='del'>-</div><div class='del'>-#include "xlator.h"</div><div class='del'>-#include "call-stub.h"</div><div class='del'>-#include "defaults.h"</div><div class='del'>-#include "dict.h"</div><div class='del'>-#include "compat-errno.h"</div><div class='del'>-#include "ha.h"</div><div class='del'>-</div><div class='del'>-#define HA_TRANSPORT_NOTCONN(_ret, _errno, _fd) \</div><div class='del'>-	((_ret == -1) &amp;&amp; (_fd ? (_errno == EBADFD):(_errno == ENOTCONN)))</div><div class='del'>-</div><div class='del'>-int ha_alloc_init_fd (call_frame_t *frame, fd_t *fd)</div><div class='del'>-{</div><div class='del'>-	ha_local_t *local = NULL;</div><div class='del'>-	int i = -1;</div><div class='del'>-	ha_private_t *pvt = NULL;</div><div class='del'>-	int child_count = 0;</div><div class='del'>-	int ret = -1;</div><div class='del'>-	hafd_t *hafdp = NULL;</div><div class='del'>-	xlator_t *this = NULL;</div><div class='del'>-	uint64_t tmp_hafdp = 0;</div><div class='del'>-</div><div class='del'>-	this = frame-&gt;this;</div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-	pvt = this-&gt;private;</div><div class='del'>-	child_count = pvt-&gt;child_count;</div><div class='del'>-</div><div class='del'>-	if (local == NULL) {</div><div class='del'>-		ret = fd_ctx_get (fd, this, &amp;tmp_hafdp);</div><div class='del'>-		if (ret &lt; 0) {</div><div class='del'>-			goto out;</div><div class='del'>-		}</div><div class='del'>-		hafdp = (hafd_t *)(long)tmp_hafdp;</div><div class='del'>-                local = frame-&gt;local = GF_CALLOC (1, sizeof (*local), </div><div class='del'>-                                                  gf_ha_mt_ha_local_t);</div><div class='del'>-		if (local == NULL) {</div><div class='del'>-			ret = -ENOMEM;</div><div class='del'>-			goto out;</div><div class='del'>-		}</div><div class='del'>-                local-&gt;state = GF_CALLOC (1, child_count, </div><div class='del'>-                                          gf_ha_mt_child_count);</div><div class='del'>-		if (local-&gt;state == NULL) {</div><div class='del'>-			ret = -ENOMEM;</div><div class='del'>-			goto out;</div><div class='del'>-		}</div><div class='del'>-</div><div class='del'>-		/* take care of the preferred subvolume */</div><div class='del'>-		if (pvt-&gt;pref_subvol == -1)</div><div class='del'>-			local-&gt;active = hafdp-&gt;active;</div><div class='del'>-		else</div><div class='del'>-			local-&gt;active = pvt-&gt;pref_subvol;</div><div class='del'>-</div><div class='del'>-		LOCK (&amp;hafdp-&gt;lock);</div><div class='del'>-		memcpy (local-&gt;state, hafdp-&gt;fdstate, child_count);</div><div class='del'>-		UNLOCK (&amp;hafdp-&gt;lock);</div><div class='del'>-</div><div class='del'>-		/* in case the preferred subvolume is down */</div><div class='del'>-		if ((local-&gt;active != -1) &amp;&amp; (local-&gt;state[local-&gt;active] == 0))</div><div class='del'>-			local-&gt;active = -1;</div><div class='del'>-</div><div class='del'>-		for (i = 0; i &lt; child_count; i++) {</div><div class='del'>-			if (local-&gt;state[i]) {</div><div class='del'>-				if (local-&gt;active == -1)</div><div class='del'>-					local-&gt;active = i;</div><div class='del'>-				local-&gt;tries++;</div><div class='del'>-			}</div><div class='del'>-		}</div><div class='del'>-		if (local-&gt;active == -1) {</div><div class='del'>-			ret = -ENOTCONN;</div><div class='del'>-			goto out;</div><div class='del'>-		}</div><div class='del'>-		local-&gt;fd = fd_ref (fd);</div><div class='del'>-	}</div><div class='del'>-	ret = 0;</div><div class='del'>-out:</div><div class='del'>-	return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int ha_handle_cbk (call_frame_t *frame, void *cookie, int op_ret, int op_errno) </div><div class='del'>-{</div><div class='del'>-	xlator_t *xl = NULL;</div><div class='del'>-	ha_private_t *pvt = NULL;</div><div class='del'>-	xlator_t **children = NULL;</div><div class='del'>-	int prev_child = -1;</div><div class='del'>-	hafd_t *hafdp = NULL;</div><div class='del'>-	int ret = -1;</div><div class='del'>-	call_stub_t *stub = NULL;</div><div class='del'>-	ha_local_t *local = NULL;</div><div class='del'>-	uint64_t tmp_hafdp = 0;</div><div class='del'>-</div><div class='del'>-	xl = frame-&gt;this;</div><div class='del'>-	pvt = xl-&gt;private;</div><div class='del'>-	children = pvt-&gt;children;</div><div class='del'>-	prev_child = (long) cookie;</div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-</div><div class='del'>-	if (op_ret == -1) {</div><div class='del'>-		gf_log (xl-&gt;name, GF_LOG_ERROR ,"(child=%s) (op_ret=%d op_errno=%s)",</div><div class='del'>-			children[prev_child]-&gt;name, op_ret, strerror (op_errno));</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	if (HA_TRANSPORT_NOTCONN (op_ret, op_errno, (local-&gt;fd))) {</div><div class='del'>-		ret = 0;</div><div class='del'>-		if (local-&gt;fd) {</div><div class='del'>-			ret = fd_ctx_get (local-&gt;fd, xl, &amp;tmp_hafdp);</div><div class='del'>-		}</div><div class='del'>-		hafdp = (hafd_t *)(long)tmp_hafdp;		</div><div class='del'>-		if (ret == 0) {</div><div class='del'>-			if (local-&gt;fd) {</div><div class='del'>-				LOCK(&amp;hafdp-&gt;lock);</div><div class='del'>-				hafdp-&gt;fdstate[prev_child] = 0;</div><div class='del'>-				UNLOCK(&amp;hafdp-&gt;lock);</div><div class='del'>-			}</div><div class='del'>-			local-&gt;tries--;</div><div class='del'>-			if (local-&gt;tries != 0) {</div><div class='del'>-				while (1) {</div><div class='del'>-					local-&gt;active = (local-&gt;active + 1) % pvt-&gt;child_count;</div><div class='del'>-					if (local-&gt;state[local-&gt;active])</div><div class='del'>-						break;</div><div class='del'>-				}</div><div class='del'>-				stub = local-&gt;stub;</div><div class='del'>-				local-&gt;stub = NULL;</div><div class='del'>-				call_resume (stub);</div><div class='del'>-				return -1;</div><div class='del'>-			}</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='del'>-	if (local-&gt;stub) {</div><div class='del'>-		call_stub_destroy (local-&gt;stub);</div><div class='del'>-                local-&gt;stub = NULL;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-	if (local-&gt;fd) {</div><div class='del'>-		GF_FREE (local-&gt;state);</div><div class='del'>-                local-&gt;state = NULL;</div><div class='del'>-</div><div class='del'>-		fd_unref (local-&gt;fd);</div><div class='del'>-                local-&gt;fd = NULL;</div><div class='del'>-	}</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int ha_alloc_init_inode (call_frame_t *frame, inode_t *inode)</div><div class='del'>-{</div><div class='del'>-	int i = -1;</div><div class='del'>-	ha_private_t *pvt = NULL;</div><div class='del'>-	xlator_t *xl = NULL;</div><div class='del'>-	int ret = -1;</div><div class='del'>-	ha_local_t *local = NULL;</div><div class='del'>-	uint64_t tmp_state = 0;</div><div class='del'>-</div><div class='del'>-	xl = frame-&gt;this;</div><div class='del'>-	pvt = xl-&gt;private;</div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-</div><div class='del'>-	if (local == NULL) {</div><div class='del'>-                local = frame-&gt;local = GF_CALLOC (1, sizeof (*local), </div><div class='del'>-                                                  gf_ha_mt_ha_local_t);</div><div class='del'>-		if (local == NULL) {</div><div class='del'>-			ret = -ENOMEM;</div><div class='del'>-			goto out;</div><div class='del'>-		}</div><div class='del'>-		local-&gt;active = pvt-&gt;pref_subvol;</div><div class='del'>-		ret = inode_ctx_get (inode, xl, &amp;tmp_state);</div><div class='del'>-		if (ret &lt; 0) {</div><div class='del'>-			goto out;</div><div class='del'>-		}</div><div class='del'>-		local-&gt;state = (char *)(long)tmp_state;</div><div class='del'>-		if (local-&gt;active != -1 &amp;&amp; local-&gt;state[local-&gt;active] == 0)</div><div class='del'>-			local-&gt;active = -1;</div><div class='del'>-		for (i = 0; i &lt; pvt-&gt;child_count; i++) {</div><div class='del'>-			if (local-&gt;state[i]) {</div><div class='del'>-				if (local-&gt;active == -1)</div><div class='del'>-					local-&gt;active = i;</div><div class='del'>-				local-&gt;tries++;</div><div class='del'>-			}</div><div class='del'>-		}</div><div class='del'>-		if (local-&gt;active == -1) {</div><div class='del'>-			ret = -ENOTCONN;</div><div class='del'>-			goto out;</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='del'>-	ret = 0;</div><div class='del'>-out:</div><div class='del'>-	return ret;</div><div class='del'>-}</div><div class='head'>diff --git a/xlators/cluster/ha/src/ha-mem-types.h b/xlators/cluster/ha/src/ha-mem-types.h<br/>deleted file mode 100644<br/>index bdbfcb52b54..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/xlators/cluster/ha/src/ha-mem-types.h?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/cluster/ha/src/ha-mem-types.h</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,37 +0,0 @@</div><div class='del'>-</div><div class='del'>-/*</div><div class='del'>-   Copyright (c) 2008-2009 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='del'>-   This file is part of GlusterFS.</div><div class='del'>-</div><div class='del'>-   GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-   it under the terms of the GNU General Public License as published</div><div class='del'>-   by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-   or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-   GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-   WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-   General Public License for more details.</div><div class='del'>-</div><div class='del'>-   You should have received a copy of the GNU General Public License</div><div class='del'>-   along with this program.  If not, see</div><div class='del'>-   &lt;http://www.gnu.org/licenses/&gt;.</div><div class='del'>-*/</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-#ifndef __HA_MEM_TYPES_H__</div><div class='del'>-#define __HA_MEM_TYPES_H__</div><div class='del'>-</div><div class='del'>-#include "mem-types.h"</div><div class='del'>-</div><div class='del'>-enum gf_ha_mem_types_ {</div><div class='del'>-        gf_ha_mt_ha_local_t = gf_common_mt_end + 1,</div><div class='del'>-        gf_ha_mt_hafd_t,</div><div class='del'>-        gf_ha_mt_char,</div><div class='del'>-        gf_ha_mt_child_count,</div><div class='del'>-        gf_ha_mt_xlator_t,</div><div class='del'>-        gf_ha_mt_ha_private_t,</div><div class='del'>-        gf_ha_mt_end</div><div class='del'>-};</div><div class='del'>-#endif</div><div class='del'>-</div><div class='head'>diff --git a/xlators/cluster/ha/src/ha.c b/xlators/cluster/ha/src/ha.c<br/>deleted file mode 100644<br/>index 54b41858eee..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/xlators/cluster/ha/src/ha.c?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/cluster/ha/src/ha.c</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,4023 +0,0 @@</div><div class='del'>-/*</div><div class='del'>-  Copyright (c) 2008-2009 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='del'>-  This file is part of GlusterFS.</div><div class='del'>-</div><div class='del'>-  GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-  it under the terms of the GNU General Public License as published</div><div class='del'>-  by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-  or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-  GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-  WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-  General Public License for more details.</div><div class='del'>-</div><div class='del'>-  You should have received a copy of the GNU General Public License</div><div class='del'>-  along with this program.  If not, see</div><div class='del'>-  &lt;http://www.gnu.org/licenses/&gt;.</div><div class='del'>-*/</div><div class='del'>-</div><div class='del'>-/* generate errors randomly, code is simple now, better alogorithm</div><div class='del'>- * can be written to decide what error to be returned and when</div><div class='del'>- */</div><div class='del'>-</div><div class='del'>-#ifndef _CONFIG_H</div><div class='del'>-#define _CONFIG_H</div><div class='del'>-#include "config.h"</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-#include "xlator.h"</div><div class='del'>-#include "call-stub.h"</div><div class='del'>-#include "defaults.h"</div><div class='del'>-#include "dict.h"</div><div class='del'>-#include "compat-errno.h"</div><div class='del'>-#include "ha.h"</div><div class='del'>-</div><div class='del'>-/*</div><div class='del'>- * TODO:</div><div class='del'>- * - dbench fails if ha over server side afr</div><div class='del'>- * - lock calls - lock on all subvols.</div><div class='del'>- * - support preferred-subvolume option. code already there.</div><div class='del'>- * - do not alloc the call-stub in case only one subvol is up.</div><div class='del'>- */</div><div class='del'>-</div><div class='del'>-void</div><div class='del'>-ha_local_wipe (ha_local_t *local)</div><div class='del'>-{</div><div class='del'>-        if (local-&gt;stub) {</div><div class='del'>-                call_stub_destroy (local-&gt;stub);</div><div class='del'>-                local-&gt;stub = NULL;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (local-&gt;state) {</div><div class='del'>-                GF_FREE (local-&gt;state);</div><div class='del'>-                local-&gt;state = NULL;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (local-&gt;dict) {</div><div class='del'>-                dict_unref (local-&gt;dict);</div><div class='del'>-                local-&gt;dict = NULL;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        loc_wipe (&amp;local-&gt;loc);</div><div class='del'>-</div><div class='del'>-        if (local-&gt;fd) {</div><div class='del'>-                fd_unref (local-&gt;fd);</div><div class='del'>-                local-&gt;fd = NULL;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (local-&gt;inode) {</div><div class='del'>-                inode_unref (local-&gt;inode);</div><div class='del'>-                local-&gt;inode = NULL;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        GF_FREE (local);</div><div class='del'>-        return;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-ha_forget (xlator_t *this,</div><div class='del'>-	   inode_t *inode)</div><div class='del'>-{</div><div class='del'>-	uint64_t stateino = 0;</div><div class='del'>-	char *state = NULL;</div><div class='del'>-	if (!inode_ctx_del (inode, this, &amp;stateino)) {</div><div class='del'>-		state =  ((char *)(long)stateino);</div><div class='del'>-		GF_FREE (state);</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>-</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t </div><div class='del'>-ha_lookup_cbk (call_frame_t *frame,</div><div class='del'>-	       void *cookie,</div><div class='del'>-	       xlator_t *this,</div><div class='del'>-	       int32_t op_ret,</div><div class='del'>-	       int32_t op_errno,</div><div class='del'>-	       inode_t *inode,</div><div class='del'>-	       struct iatt *buf,</div><div class='del'>-               dict_t *dict,</div><div class='del'>-               struct iatt *postparent)</div><div class='del'>-{</div><div class='del'>-	ha_local_t *local = NULL;</div><div class='del'>-	ha_private_t *pvt = NULL;</div><div class='del'>-	int child_count = 0, i = 0, callcnt = 0;</div><div class='del'>-	char *state = NULL;</div><div class='del'>-	call_frame_t *prev_frame = NULL;</div><div class='del'>-	xlator_t **children = NULL;</div><div class='del'>-	uint64_t tmp_state = 0;</div><div class='del'>-</div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-	pvt = this-&gt;private;</div><div class='del'>-	child_count = pvt-&gt;child_count;</div><div class='del'>-	prev_frame = cookie;</div><div class='del'>-	children = pvt-&gt;children;</div><div class='del'>-</div><div class='del'>-	for (i = 0; i &lt; child_count; i++) {</div><div class='del'>-		if (pvt-&gt;children[i] == prev_frame-&gt;this)</div><div class='del'>-			break;</div><div class='del'>-	}</div><div class='del'>-	if ((op_ret == -1) &amp;&amp; (op_errno != ENOENT)) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_ERROR, "(child=%s) (op_ret=%d op_errno=%s)", </div><div class='del'>-			  children[i]-&gt;name, op_ret, strerror (op_errno));</div><div class='del'>-	}</div><div class='del'>-	inode_ctx_get (local-&gt;inode, this, &amp;tmp_state);</div><div class='del'>-	state = (char *)(long)tmp_state;</div><div class='del'>-</div><div class='del'>-	LOCK (&amp;frame-&gt;lock);</div><div class='del'>-	if (local-&gt;revalidate == 1) {</div><div class='del'>-		if ((!op_ret) != state[i]) {</div><div class='del'>-			local-&gt;revalidate_error = 1;</div><div class='del'>-			gf_log (this-&gt;name, GF_LOG_DEBUG, "revalidate error on %s", </div><div class='del'>-				pvt-&gt;children[i]-&gt;name);</div><div class='del'>-		}</div><div class='del'>-	} else {</div><div class='del'>-		if (op_ret == 0) {</div><div class='del'>-			state[i] = 1;</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='del'>-	if (local-&gt;op_ret == -1 &amp;&amp; op_ret == 0) {</div><div class='del'>-		local-&gt;op_ret = 0;</div><div class='del'>-		local-&gt;buf = *buf;</div><div class='del'>-                local-&gt;postparent = *postparent;</div><div class='del'>-		if (dict)</div><div class='del'>-			local-&gt;dict = dict_ref (dict);</div><div class='del'>-	}</div><div class='del'>-	if (op_ret == -1 &amp;&amp; op_ret != ENOTCONN)</div><div class='del'>-		local-&gt;op_errno = op_errno;</div><div class='del'>-	callcnt = --local-&gt;call_count;</div><div class='del'>-	UNLOCK (&amp;frame-&gt;lock);</div><div class='del'>-</div><div class='del'>-	if (callcnt == 0) {</div><div class='del'>-		dict_t *ctx = local-&gt;dict;</div><div class='del'>-		inode_t *inode = local-&gt;inode;</div><div class='del'>-		if (local-&gt;revalidate_error == 1) {</div><div class='del'>-			local-&gt;op_ret = -1;</div><div class='del'>-			local-&gt;op_errno = EIO;</div><div class='del'>-			gf_log (this-&gt;name, GF_LOG_DEBUG, "revalidate error, returning EIO");</div><div class='del'>-		}</div><div class='del'>-		STACK_UNWIND (frame,</div><div class='del'>-			      local-&gt;op_ret,</div><div class='del'>-			      local-&gt;op_errno,</div><div class='del'>-			      inode,</div><div class='del'>-			      &amp;local-&gt;buf,</div><div class='del'>-			      ctx,</div><div class='del'>-                              &amp;local-&gt;postparent);</div><div class='del'>-		if (inode)</div><div class='del'>-			inode_unref (inode);</div><div class='del'>-		if (ctx)</div><div class='del'>-			dict_unref (ctx);</div><div class='del'>-	}</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-ha_lookup (call_frame_t *frame,</div><div class='del'>-	   xlator_t *this,</div><div class='del'>-	   loc_t *loc,</div><div class='del'>-	   dict_t *xattr_req)</div><div class='del'>-{</div><div class='del'>-	ha_local_t *local = NULL;</div><div class='del'>-	ha_private_t *pvt = NULL;</div><div class='del'>-	int child_count = 0, i = 0;</div><div class='del'>-	char *state = NULL;</div><div class='del'>-	xlator_t **children = NULL;</div><div class='del'>-	int ret = -1;</div><div class='del'>-        int32_t op_errno = EINVAL;</div><div class='del'>-</div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-	pvt = this-&gt;private;</div><div class='del'>-	child_count = pvt-&gt;child_count;</div><div class='del'>-	children = pvt-&gt;children;</div><div class='del'>-</div><div class='del'>-	frame-&gt;local = local = GF_CALLOC (1, sizeof (*local), </div><div class='del'>-                                          gf_ha_mt_ha_local_t);</div><div class='del'>-        if (!local) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_ERROR, "out of memory");</div><div class='del'>-                op_errno = ENOMEM;</div><div class='del'>-                goto unwind;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-	child_count = pvt-&gt;child_count;</div><div class='del'>-	local-&gt;inode = inode_ref (loc-&gt;inode);</div><div class='del'>-</div><div class='del'>-	ret = inode_ctx_get (loc-&gt;inode, this, NULL);</div><div class='del'>-	if (ret) {</div><div class='del'>-		state = GF_CALLOC (1, child_count, gf_ha_mt_child_count);</div><div class='del'>-                if (state == NULL) {</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_ERROR, "out of memory");</div><div class='del'>-                        op_errno = ENOMEM;</div><div class='del'>-                        goto unwind;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-		inode_ctx_put (loc-&gt;inode, this, (uint64_t)(long)state);</div><div class='del'>-	} else</div><div class='del'>-		local-&gt;revalidate = 1;</div><div class='del'>-</div><div class='del'>-	local-&gt;op_ret = -1;</div><div class='del'>-	local-&gt;op_errno = ENOTCONN;</div><div class='del'>-	local-&gt;call_count = child_count;</div><div class='del'>-</div><div class='del'>-	for (i = 0; i &lt; child_count; i++) {</div><div class='del'>-		STACK_WIND (frame,</div><div class='del'>-			    ha_lookup_cbk,</div><div class='del'>-			    children[i],</div><div class='del'>-			    children[i]-&gt;fops-&gt;lookup,</div><div class='del'>-			    loc,</div><div class='del'>-			    xattr_req);</div><div class='del'>-	}</div><div class='del'>-	return 0;</div><div class='del'>-</div><div class='del'>-unwind:</div><div class='del'>-        local = frame-&gt;local;</div><div class='del'>-        frame-&gt;local = NULL;</div><div class='del'>-	STACK_UNWIND (frame, -1, op_errno, NULL, NULL, NULL, NULL);</div><div class='del'>-</div><div class='del'>-        ha_local_wipe (local);</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>- int32_t</div><div class='del'>-ha_stat_cbk (call_frame_t *frame,</div><div class='del'>-	     void *cookie,</div><div class='del'>-	     xlator_t *this,</div><div class='del'>-	     int32_t op_ret,</div><div class='del'>-	     int32_t op_errno,</div><div class='del'>-	     struct iatt *buf)</div><div class='del'>-{</div><div class='del'>-	int ret = -1;</div><div class='del'>-</div><div class='del'>-	ret = ha_handle_cbk (frame, cookie, op_ret, op_errno);</div><div class='del'>-</div><div class='del'>-	if (ret == 0) {</div><div class='del'>-		STACK_UNWIND (frame,</div><div class='del'>-			      op_ret,</div><div class='del'>-			      op_errno,</div><div class='del'>-			      buf);</div><div class='del'>-	}</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-ha_stat (call_frame_t *frame,</div><div class='del'>-	 xlator_t *this,</div><div class='del'>-	 loc_t *loc)</div><div class='del'>-{</div><div class='del'>-	ha_local_t *local = NULL;</div><div class='del'>-	int op_errno = ENOTCONN;</div><div class='del'>-</div><div class='del'>-	op_errno = ha_alloc_init_inode (frame, loc-&gt;inode);</div><div class='del'>-	if (op_errno &lt; 0) {</div><div class='del'>-		op_errno = -op_errno;</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-	local-&gt;stub = fop_stat_stub (frame, ha_stat, loc);</div><div class='del'>-</div><div class='del'>-	STACK_WIND_COOKIE (frame,</div><div class='del'>-			   ha_stat_cbk,</div><div class='del'>-			   (void *)(long)local-&gt;active,</div><div class='del'>-			   HA_ACTIVE_CHILD(this, local),</div><div class='del'>-			   HA_ACTIVE_CHILD(this, local)-&gt;fops-&gt;stat,</div><div class='del'>-			   loc);</div><div class='del'>-	return 0;</div><div class='del'>-err:</div><div class='del'>-	STACK_UNWIND (frame, -1, op_errno, NULL);</div><div class='del'>-	return 0;	</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-ha_setattr_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-                int32_t op_ret, int32_t op_errno, struct iatt *statpre,</div><div class='del'>-                struct iatt *statpost)</div><div class='del'>-{</div><div class='del'>-	int ret = -1;</div><div class='del'>-</div><div class='del'>-	ret = ha_handle_cbk (frame, cookie, op_ret, op_errno);</div><div class='del'>-</div><div class='del'>-	if (ret == 0) {</div><div class='del'>-		STACK_UNWIND (frame, op_ret, op_errno, statpre, statpost);</div><div class='del'>-	}</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-ha_setattr (call_frame_t *frame, xlator_t *this, loc_t *loc, struct iatt *stbuf,</div><div class='del'>-            int32_t valid)</div><div class='del'>-{</div><div class='del'>-	ha_local_t *local = NULL;</div><div class='del'>-	int op_errno = 0;</div><div class='del'>-</div><div class='del'>-	op_errno = ha_alloc_init_inode (frame, loc-&gt;inode);</div><div class='del'>-	if (op_errno &lt; 0) {</div><div class='del'>-		op_errno = -op_errno;</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-	local-&gt;stub = fop_setattr_stub (frame, ha_setattr, loc, stbuf, valid);</div><div class='del'>-</div><div class='del'>-	STACK_WIND_COOKIE (frame,</div><div class='del'>-			   ha_setattr_cbk,</div><div class='del'>-			   (void *)(long)local-&gt;active,</div><div class='del'>-			   HA_ACTIVE_CHILD(this, local),</div><div class='del'>-			   HA_ACTIVE_CHILD(this, local)-&gt;fops-&gt;setattr,</div><div class='del'>-			   loc, stbuf, valid);</div><div class='del'>-	return 0;</div><div class='del'>-err:</div><div class='del'>-	STACK_UNWIND (frame, -1, op_errno, NULL, NULL);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-ha_fsetattr (call_frame_t *frame, xlator_t *this, fd_t *fd, struct iatt *stbuf,</div><div class='del'>-             int32_t valid)</div><div class='del'>-{</div><div class='del'>-	ha_local_t *local = NULL;</div><div class='del'>-	int op_errno = 0;</div><div class='del'>-</div><div class='del'>-	op_errno = ha_alloc_init_fd (frame, fd);</div><div class='del'>-	if (op_errno &lt; 0) {</div><div class='del'>-		op_errno = -op_errno;</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-	local-&gt;stub = fop_fsetattr_stub (frame, ha_fsetattr, fd, stbuf, valid);</div><div class='del'>-</div><div class='del'>-	STACK_WIND_COOKIE (frame,	      </div><div class='del'>-			   ha_setattr_cbk,</div><div class='del'>-			   (void *)(long)local-&gt;active,</div><div class='del'>-			   HA_ACTIVE_CHILD(this, local),</div><div class='del'>-			   HA_ACTIVE_CHILD(this, local)-&gt;fops-&gt;fsetattr,</div><div class='del'>-			   fd, stbuf, valid);</div><div class='del'>-	return 0;</div><div class='del'>-err:</div><div class='del'>-	STACK_UNWIND (frame, -1, op_errno, NULL, NULL);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-ha_truncate_cbk (call_frame_t *frame,</div><div class='del'>-		 void *cookie,</div><div class='del'>-		 xlator_t *this,</div><div class='del'>-		 int32_t op_ret,</div><div class='del'>-		 int32_t op_errno,</div><div class='del'>-		 struct iatt *prebuf,</div><div class='del'>-                 struct iatt *postbuf)</div><div class='del'>-{</div><div class='del'>-	int ret = -1;</div><div class='del'>-</div><div class='del'>-	ret = ha_handle_cbk (frame, cookie, op_ret, op_errno);</div><div class='del'>-	if (ret == 0) {</div><div class='del'>-		STACK_UNWIND (frame,</div><div class='del'>-			      op_ret,</div><div class='del'>-			      op_errno,</div><div class='del'>-			      prebuf,</div><div class='del'>-                              postbuf);</div><div class='del'>-	}</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-ha_truncate (call_frame_t *frame,</div><div class='del'>-	     xlator_t *this,</div><div class='del'>-	     loc_t *loc,</div><div class='del'>-	     off_t offset)</div><div class='del'>-{</div><div class='del'>-	ha_local_t *local = NULL;</div><div class='del'>-	int op_errno = 0;</div><div class='del'>-</div><div class='del'>-	op_errno = ha_alloc_init_inode (frame, loc-&gt;inode);</div><div class='del'>-	if (op_errno &lt; 0) {</div><div class='del'>-		op_errno = -op_errno;</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-	local-&gt;stub = fop_truncate_stub (frame, ha_truncate, loc, offset);</div><div class='del'>-        if (!local-&gt;stub) {</div><div class='del'>-                op_errno = ENOMEM;</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_ERROR, "out of memory");</div><div class='del'>-                goto err;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-	STACK_WIND_COOKIE (frame,</div><div class='del'>-			   ha_truncate_cbk,</div><div class='del'>-			   (void *)(long)local-&gt;active,</div><div class='del'>-			   HA_ACTIVE_CHILD(this, local),</div><div class='del'>-			   HA_ACTIVE_CHILD(this, local)-&gt;fops-&gt;truncate,</div><div class='del'>-			   loc,</div><div class='del'>-			   offset);</div><div class='del'>-	return 0;</div><div class='del'>-err:</div><div class='del'>-	STACK_UNWIND (frame, -1, op_errno, NULL, NULL);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>- int32_t</div><div class='del'>-ha_ftruncate_cbk (call_frame_t *frame,</div><div class='del'>-		  void *cookie,</div><div class='del'>-		  xlator_t *this,</div><div class='del'>-		  int32_t op_ret,</div><div class='del'>-		  int32_t op_errno,</div><div class='del'>-		  struct iatt *prebuf,</div><div class='del'>-                  struct iatt *postbuf)</div><div class='del'>-{</div><div class='del'>-	int ret = -1;</div><div class='del'>-</div><div class='del'>-	ret = ha_handle_cbk (frame, cookie, op_ret, op_errno);</div><div class='del'>-</div><div class='del'>-	if (ret == 0) {</div><div class='del'>-		STACK_UNWIND (frame,</div><div class='del'>-			      op_ret,</div><div class='del'>-			      op_errno,</div><div class='del'>-			      prebuf, postbuf);</div><div class='del'>-	}</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-ha_ftruncate (call_frame_t *frame,</div><div class='del'>-	      xlator_t *this,</div><div class='del'>-	      fd_t *fd,</div><div class='del'>-	      off_t offset)</div><div class='del'>-{</div><div class='del'>-	ha_local_t *local = NULL;</div><div class='del'>-	int op_errno = 0;</div><div class='del'>-</div><div class='del'>-	op_errno = ha_alloc_init_fd (frame, fd);</div><div class='del'>-	if (op_errno &lt; 0) {</div><div class='del'>-		op_errno = -op_errno;</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-	local-&gt;stub = fop_ftruncate_stub (frame, ha_ftruncate, fd, offset);</div><div class='del'>-        if (!local-&gt;stub) {</div><div class='del'>-                op_errno = ENOMEM;</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_ERROR, "out of memory");</div><div class='del'>-                goto err;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-	STACK_WIND_COOKIE (frame,</div><div class='del'>-			   ha_ftruncate_cbk,</div><div class='del'>-			   (void *)(long)local-&gt;active,</div><div class='del'>-			   HA_ACTIVE_CHILD(this, local),</div><div class='del'>-			   HA_ACTIVE_CHILD(this, local)-&gt;fops-&gt;ftruncate,</div><div class='del'>-			   fd,</div><div class='del'>-			   offset);</div><div class='del'>-	return 0;</div><div class='del'>-err:</div><div class='del'>-        local = frame-&gt;local;</div><div class='del'>-        frame-&gt;local = NULL;</div><div class='del'>-</div><div class='del'>-	STACK_UNWIND (frame, -1, op_errno, NULL, NULL);</div><div class='del'>-</div><div class='del'>-        ha_local_wipe (local);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-ha_access_cbk (call_frame_t *frame,</div><div class='del'>-	       void *cookie,</div><div class='del'>-	       xlator_t *this,</div><div class='del'>-	       int32_t op_ret,</div><div class='del'>-	       int32_t op_errno)</div><div class='del'>-{</div><div class='del'>-	int ret = -1;</div><div class='del'>-</div><div class='del'>-	ret = ha_handle_cbk (frame, cookie, op_ret, op_errno);</div><div class='del'>-</div><div class='del'>-	if (ret == 0) {</div><div class='del'>-		STACK_UNWIND (frame,</div><div class='del'>-			      op_ret,</div><div class='del'>-			      op_errno);</div><div class='del'>-	}</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-ha_access (call_frame_t *frame,</div><div class='del'>-	   xlator_t *this,</div><div class='del'>-	   loc_t *loc,</div><div class='del'>-	   int32_t mask)</div><div class='del'>-{</div><div class='del'>-	ha_local_t *local = NULL;</div><div class='del'>-	int op_errno = 0;</div><div class='del'>-</div><div class='del'>-	op_errno = ha_alloc_init_inode (frame, loc-&gt;inode);</div><div class='del'>-	if (op_errno &lt; 0) {</div><div class='del'>-		op_errno = -op_errno;</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-	local-&gt;stub = fop_access_stub (frame, ha_access, loc, mask);</div><div class='del'>-        if (!local-&gt;stub) {</div><div class='del'>-                op_errno = ENOMEM;</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_ERROR, "out of memory");</div><div class='del'>-                goto err;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-	STACK_WIND_COOKIE (frame,</div><div class='del'>-			   ha_access_cbk,</div><div class='del'>-			   (void *)(long)local-&gt;active,</div><div class='del'>-			   HA_ACTIVE_CHILD(this, local),</div><div class='del'>-			   HA_ACTIVE_CHILD(this, local)-&gt;fops-&gt;access,</div><div class='del'>-			   loc,</div><div class='del'>-			   mask);</div><div class='del'>-	return 0;</div><div class='del'>-err:</div><div class='del'>-        local = frame-&gt;local;</div><div class='del'>-        frame-&gt;local = NULL;</div><div class='del'>-</div><div class='del'>-	STACK_UNWIND (frame, -1, op_errno);</div><div class='del'>-</div><div class='del'>-        ha_local_wipe (local);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>- int32_t</div><div class='del'>-ha_readlink_cbk (call_frame_t *frame,</div><div class='del'>-		 void *cookie,</div><div class='del'>-		 xlator_t *this,</div><div class='del'>-		 int32_t op_ret,</div><div class='del'>-		 int32_t op_errno,</div><div class='del'>-		 const char *path,</div><div class='del'>-                 struct iatt *sbuf)</div><div class='del'>-{</div><div class='del'>-	int ret = -1;</div><div class='del'>-</div><div class='del'>-	ret = ha_handle_cbk (frame, cookie, op_ret, op_errno);</div><div class='del'>-</div><div class='del'>-	if (ret == 0) {</div><div class='del'>-		STACK_UNWIND (frame,</div><div class='del'>-			      op_ret,</div><div class='del'>-			      op_errno,</div><div class='del'>-			      path,</div><div class='del'>-                              sbuf);</div><div class='del'>-	}</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-ha_readlink (call_frame_t *frame,</div><div class='del'>-	     xlator_t *this,</div><div class='del'>-	     loc_t *loc,</div><div class='del'>-	     size_t size)</div><div class='del'>-{</div><div class='del'>-	ha_local_t *local = frame-&gt;local;</div><div class='del'>-	int op_errno = 0;</div><div class='del'>-</div><div class='del'>-	op_errno = ha_alloc_init_inode (frame, loc-&gt;inode);</div><div class='del'>-	if (op_errno &lt; 0) {</div><div class='del'>-		op_errno = -op_errno;</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-	local-&gt;stub = fop_readlink_stub (frame, ha_readlink, loc, size);</div><div class='del'>-</div><div class='del'>-	STACK_WIND_COOKIE (frame,</div><div class='del'>-			   ha_readlink_cbk,</div><div class='del'>-			   (void *)(long)local-&gt;active,</div><div class='del'>-			   HA_ACTIVE_CHILD(this, local),</div><div class='del'>-			   HA_ACTIVE_CHILD(this, local)-&gt;fops-&gt;readlink,</div><div class='del'>-			   loc,</div><div class='del'>-			   size);</div><div class='del'>-	return 0;</div><div class='del'>-err:</div><div class='del'>-	STACK_UNWIND (frame, -1, op_errno, NULL, NULL);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-ha_mknod_lookup_cbk (call_frame_t *frame,</div><div class='del'>-		     void *cookie,</div><div class='del'>-		     xlator_t *this,</div><div class='del'>-		     int32_t op_ret,</div><div class='del'>-		     int32_t op_errno,</div><div class='del'>-		     inode_t *inode,</div><div class='del'>-		     struct iatt *buf,</div><div class='del'>-                     dict_t *dict,</div><div class='del'>-                     struct iatt *postparent)</div><div class='del'>-{</div><div class='del'>-	ha_local_t *local = NULL;</div><div class='del'>-	ha_private_t *pvt = NULL;</div><div class='del'>-	char *stateino = NULL;</div><div class='del'>-	int child_count = 0, i = 0, cnt = 0, ret = 0;</div><div class='del'>-	call_frame_t *prev_frame = NULL;</div><div class='del'>-	xlator_t **children = NULL;</div><div class='del'>-	uint64_t tmp_stateino = 0;</div><div class='del'>-</div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-	pvt = this-&gt;private;</div><div class='del'>-	child_count = pvt-&gt;child_count;</div><div class='del'>-	prev_frame = cookie;</div><div class='del'>-	children = pvt-&gt;children;</div><div class='del'>-</div><div class='del'>-	for (i = 0; i &lt; child_count; i++)</div><div class='del'>-		if (prev_frame-&gt;this == children[i])</div><div class='del'>-			break;</div><div class='del'>-</div><div class='del'>-	if (op_ret == -1) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_ERROR, </div><div class='del'>-			"(path=%s) (op_ret=%d op_errno=%d)", </div><div class='del'>-			local-&gt;stub-&gt;args.mknod.loc.path, op_ret, op_errno);</div><div class='del'>-	}</div><div class='del'>-	ret = inode_ctx_get (local-&gt;stub-&gt;args.mknod.loc.inode, </div><div class='del'>-			     this, &amp;tmp_stateino);</div><div class='del'>-	stateino = (char *)(long)tmp_stateino;</div><div class='del'>-	if (ret != 0) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_ERROR, </div><div class='del'>-			"unwind(-1), inode_ctx_get() error");</div><div class='del'>-		/* It is difficult to handle this error at this stage</div><div class='del'>-		 * as we still expect more cbks, we can't return as</div><div class='del'>-		 * of now</div><div class='del'>-		 */</div><div class='del'>-	} else if (op_ret == 0) {</div><div class='del'>-		stateino[i] = 1;</div><div class='del'>-	}</div><div class='del'>-	LOCK (&amp;frame-&gt;lock);</div><div class='del'>-	cnt = --local-&gt;call_count;</div><div class='del'>-	UNLOCK (&amp;frame-&gt;lock);</div><div class='del'>-</div><div class='del'>-	if (cnt == 0) {</div><div class='del'>-		call_stub_t *stub = local-&gt;stub;</div><div class='del'>-		GF_FREE (local-&gt;state);</div><div class='del'>-		STACK_UNWIND (frame,</div><div class='del'>-			      local-&gt;op_ret,</div><div class='del'>-			      local-&gt;op_errno,</div><div class='del'>-			      local-&gt;stub-&gt;args.mknod.loc.inode,</div><div class='del'>-			      &amp;local-&gt;buf, &amp;local-&gt;preparent,</div><div class='del'>-                              &amp;local-&gt;postparent);</div><div class='del'>-		call_stub_destroy (stub);</div><div class='del'>-	}</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-ha_mknod_cbk (call_frame_t *frame,</div><div class='del'>-	      void *cookie,</div><div class='del'>-	      xlator_t *this,</div><div class='del'>-	      int32_t op_ret,</div><div class='del'>-	      int32_t op_errno,</div><div class='del'>-	      inode_t *inode,</div><div class='del'>-              struct iatt *buf,</div><div class='del'>-              struct iatt *preparent,</div><div class='del'>-              struct iatt *postparent)</div><div class='del'>-{</div><div class='del'>-	ha_local_t *local = NULL;</div><div class='del'>-	ha_private_t *pvt = NULL;</div><div class='del'>-	char *stateino = NULL;</div><div class='del'>-	int child_count = 0, i = 0, cnt = 0, ret = 0;</div><div class='del'>-	call_frame_t *prev_frame = NULL;</div><div class='del'>-	xlator_t **children = NULL;</div><div class='del'>-	uint64_t tmp_stateino = 0;</div><div class='del'>-</div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-	pvt = this-&gt;private;</div><div class='del'>-	child_count = pvt-&gt;child_count;</div><div class='del'>-	prev_frame = cookie;</div><div class='del'>-	children = pvt-&gt;children;</div><div class='del'>-</div><div class='del'>-	for (i = 0; i &lt; child_count; i++)</div><div class='del'>-		if (prev_frame-&gt;this == children[i])</div><div class='del'>-			break;</div><div class='del'>-</div><div class='del'>-	if (op_ret == -1) {</div><div class='del'>-		local-&gt;op_errno = op_errno;</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_ERROR, "(path=%s) (op_ret=%d op_errno=%d)", local-&gt;stub-&gt;args.mknod.loc.path, op_ret, op_errno);</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	ret = inode_ctx_get (local-&gt;stub-&gt;args.mknod.loc.inode, </div><div class='del'>-			     this, &amp;tmp_stateino);</div><div class='del'>-	stateino = (char *)(long)tmp_stateino;</div><div class='del'>-</div><div class='del'>-	if (ret != 0) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_ERROR, "inode_ctx_get() error");</div><div class='del'>-		/* FIXME: handle the case */</div><div class='del'>-	}</div><div class='del'>-	if (op_ret == 0) {</div><div class='del'>-		stateino[i] = 1;</div><div class='del'>-		local-&gt;op_ret = 0;</div><div class='del'>-		local-&gt;first_success = 1;</div><div class='del'>-		local-&gt;buf = *buf;</div><div class='del'>-                local-&gt;preparent = *preparent;</div><div class='del'>-                local-&gt;postparent = *postparent;</div><div class='del'>-	}</div><div class='del'>-	cnt = --local-&gt;call_count;</div><div class='del'>-	for (i = local-&gt;active + 1; i &lt; child_count; i++) {</div><div class='del'>-		if (local-&gt;state[i])</div><div class='del'>-			break;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	if (cnt == 0 || i == child_count) {</div><div class='del'>-		call_stub_t *stub = local-&gt;stub;</div><div class='del'>-		GF_FREE (local-&gt;state);</div><div class='del'>-		stub = local-&gt;stub;</div><div class='del'>-		STACK_UNWIND (frame, local-&gt;op_ret, local-&gt;op_errno,</div><div class='del'>-                              local-&gt;stub-&gt;args.mknod.loc.inode, &amp;local-&gt;buf,</div><div class='del'>-                              &amp;local-&gt;preparent, &amp;local-&gt;postparent);</div><div class='del'>-		call_stub_destroy (stub);</div><div class='del'>-		return 0;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	local-&gt;active = i;</div><div class='del'>-</div><div class='del'>-	if (local-&gt;first_success == 0) {</div><div class='del'>-		STACK_WIND (frame,</div><div class='del'>-			    ha_mknod_cbk,</div><div class='del'>-			    children[i],</div><div class='del'>-			    children[i]-&gt;fops-&gt;mknod,</div><div class='del'>-			    &amp;local-&gt;stub-&gt;args.mknod.loc,</div><div class='del'>-			    local-&gt;stub-&gt;args.mknod.mode,</div><div class='del'>-			    local-&gt;stub-&gt;args.mknod.rdev);</div><div class='del'>-		return 0;</div><div class='del'>-	}</div><div class='del'>-	cnt = local-&gt;call_count;</div><div class='del'>-</div><div class='del'>-	for (; i &lt; child_count; i++) {</div><div class='del'>-		if (local-&gt;state[i]) {</div><div class='del'>-			STACK_WIND (frame,</div><div class='del'>-				    ha_mknod_lookup_cbk,</div><div class='del'>-				    children[i],</div><div class='del'>-				    children[i]-&gt;fops-&gt;lookup,</div><div class='del'>-				    &amp;local-&gt;stub-&gt;args.mknod.loc,</div><div class='del'>-				    0);</div><div class='del'>-			if (--cnt == 0)</div><div class='del'>-				break;</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-ha_mknod (call_frame_t *frame,</div><div class='del'>-	  xlator_t *this,</div><div class='del'>-	  loc_t *loc,</div><div class='del'>-	  mode_t mode,</div><div class='del'>-	  dev_t rdev)</div><div class='del'>-{</div><div class='del'>-	ha_local_t *local = NULL;</div><div class='del'>-	ha_private_t *pvt = NULL;</div><div class='del'>-	int child_count = 0, i = 0;</div><div class='del'>-	char *stateino = NULL;</div><div class='del'>-        int32_t op_errno = EINVAL;</div><div class='del'>-</div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-	pvt = this-&gt;private;</div><div class='del'>-	child_count = pvt-&gt;child_count;</div><div class='del'>-</div><div class='del'>-	frame-&gt;local = local = GF_CALLOC (1, sizeof (*local), </div><div class='del'>-                                          gf_ha_mt_ha_local_t);</div><div class='del'>-        if (!local) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_ERROR, "out of memory");</div><div class='del'>-                op_errno = ENOMEM;</div><div class='del'>-                goto err;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-	local-&gt;stub = fop_mknod_stub (frame, ha_mknod, loc, mode, rdev);</div><div class='del'>-        if (!local-&gt;stub) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_ERROR, "out of memory");</div><div class='del'>-                op_errno = ENOMEM;</div><div class='del'>-                goto err;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-	local-&gt;op_ret = -1;</div><div class='del'>-	local-&gt;op_errno = ENOTCONN;</div><div class='del'>-	local-&gt;state = GF_CALLOC (1, child_count, gf_ha_mt_char);</div><div class='del'>-        if (!local-&gt;state) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_ERROR, "out of memory");</div><div class='del'>-                op_errno = ENOMEM;</div><div class='del'>-                goto err;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-	memcpy (local-&gt;state, pvt-&gt;state, child_count);</div><div class='del'>-	local-&gt;active = -1;</div><div class='del'>-</div><div class='del'>-	stateino = GF_CALLOC (1, child_count, gf_ha_mt_char);</div><div class='del'>-        if (!stateino) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_ERROR, "out of memory");</div><div class='del'>-                op_errno = ENOMEM;</div><div class='del'>-                goto err;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-	inode_ctx_put (loc-&gt;inode, this, (uint64_t)(long)stateino);</div><div class='del'>-</div><div class='del'>-	for (i = 0; i &lt; child_count; i++) {</div><div class='del'>-		if (local-&gt;state[i]) {</div><div class='del'>-			local-&gt;call_count++;</div><div class='del'>-			if (local-&gt;active == -1) </div><div class='del'>-				local-&gt;active = i;</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	STACK_WIND (frame,</div><div class='del'>-		    ha_mknod_cbk,</div><div class='del'>-		    HA_ACTIVE_CHILD(this, local),</div><div class='del'>-		    HA_ACTIVE_CHILD(this, local)-&gt;fops-&gt;mknod,</div><div class='del'>-		    loc, mode, rdev);</div><div class='del'>-	return 0;</div><div class='del'>-</div><div class='del'>-err:</div><div class='del'>-        local = frame-&gt;local;</div><div class='del'>-        frame-&gt;local = NULL;</div><div class='del'>-</div><div class='del'>-	STACK_UNWIND (frame, -1, op_errno, NULL, NULL, NULL, NULL);</div><div class='del'>-        ha_local_wipe (local);</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-ha_mkdir_lookup_cbk (call_frame_t *frame,</div><div class='del'>-		     void *cookie,</div><div class='del'>-		     xlator_t *this,</div><div class='del'>-		     int32_t op_ret,</div><div class='del'>-		     int32_t op_errno,</div><div class='del'>-		     inode_t *inode,</div><div class='del'>-		     struct iatt *buf,</div><div class='del'>-                     dict_t *dict,</div><div class='del'>-                     struct iatt *postparent)</div><div class='del'>-{</div><div class='del'>-	ha_local_t *local = NULL;</div><div class='del'>-	ha_private_t *pvt = NULL;</div><div class='del'>-	char *stateino = NULL;</div><div class='del'>-	int child_count = 0, i = 0, cnt = 0;</div><div class='del'>-	call_frame_t *prev_frame = NULL;</div><div class='del'>-	xlator_t **children = NULL;</div><div class='del'>-	uint64_t tmp_stateino = 0;</div><div class='del'>-</div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-	pvt = this-&gt;private;</div><div class='del'>-	child_count = pvt-&gt;child_count;</div><div class='del'>-	prev_frame = cookie;</div><div class='del'>-	children = pvt-&gt;children;</div><div class='del'>-</div><div class='del'>-	for (i = 0; i &lt; child_count; i++)</div><div class='del'>-		if (prev_frame-&gt;this == children[i])</div><div class='del'>-			break;</div><div class='del'>-</div><div class='del'>-	if (op_ret == -1) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_ERROR, "(path=%s) (op_ret=%d op_errno=%d)", local-&gt;stub-&gt;args.mkdir.loc.path, op_ret, op_errno);</div><div class='del'>-	}</div><div class='del'>-	inode_ctx_get (local-&gt;stub-&gt;args.mkdir.loc.inode, </div><div class='del'>-		       this, &amp;tmp_stateino);  </div><div class='del'>-	stateino = (char *)(long)tmp_stateino;</div><div class='del'>-</div><div class='del'>-	if (op_ret == 0)</div><div class='del'>-		stateino[i] = 1;</div><div class='del'>-</div><div class='del'>-	LOCK (&amp;frame-&gt;lock);</div><div class='del'>-	cnt = --local-&gt;call_count;</div><div class='del'>-	UNLOCK (&amp;frame-&gt;lock);</div><div class='del'>-</div><div class='del'>-	if (cnt == 0) {</div><div class='del'>-		call_stub_t *stub = local-&gt;stub;</div><div class='del'>-		GF_FREE (local-&gt;state);</div><div class='del'>-		STACK_UNWIND (frame,</div><div class='del'>-			      local-&gt;op_ret,</div><div class='del'>-			      local-&gt;op_errno,</div><div class='del'>-			      local-&gt;stub-&gt;args.mkdir.loc.inode, &amp;local-&gt;buf,</div><div class='del'>-			      &amp;local-&gt;preparent, &amp;local-&gt;postparent);</div><div class='del'>-		call_stub_destroy (stub);</div><div class='del'>-	}</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-ha_mkdir_cbk (call_frame_t *frame,</div><div class='del'>-	      void *cookie,</div><div class='del'>-	      xlator_t *this,</div><div class='del'>-	      int32_t op_ret,</div><div class='del'>-	      int32_t op_errno,</div><div class='del'>-	      inode_t *inode,</div><div class='del'>-              struct iatt *buf,</div><div class='del'>-              struct iatt *preparent,</div><div class='del'>-              struct iatt *postparent)</div><div class='del'>-{</div><div class='del'>-	ha_local_t *local = NULL;</div><div class='del'>-	ha_private_t *pvt = NULL;</div><div class='del'>-	char *stateino = NULL;</div><div class='del'>-	int child_count = 0, i = 0, cnt = 0;</div><div class='del'>-	call_frame_t *prev_frame = NULL;</div><div class='del'>-	xlator_t **children = NULL;</div><div class='del'>-	uint64_t tmp_stateino = 0;</div><div class='del'>-</div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-	pvt = this-&gt;private;</div><div class='del'>-	child_count = pvt-&gt;child_count;</div><div class='del'>-	prev_frame = cookie;</div><div class='del'>-	children = pvt-&gt;children;</div><div class='del'>-	</div><div class='del'>-	for (i = 0; i &lt; child_count; i++)</div><div class='del'>-		if (prev_frame-&gt;this == children[i])</div><div class='del'>-			break;</div><div class='del'>-</div><div class='del'>-	if (op_ret == -1) {</div><div class='del'>-		local-&gt;op_errno = op_errno;</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_ERROR, "(path=%s) (op_ret=%d op_errno=%d)", local-&gt;stub-&gt;args.mkdir.loc.path, op_ret, op_errno);</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	inode_ctx_get (local-&gt;stub-&gt;args.mkdir.loc.inode, </div><div class='del'>-		       this, &amp;tmp_stateino);</div><div class='del'>-	stateino = (char *)(long)tmp_stateino;</div><div class='del'>-</div><div class='del'>-	if (op_ret == 0) {</div><div class='del'>-		stateino[i] = 1;</div><div class='del'>-		local-&gt;op_ret = 0;</div><div class='del'>-		local-&gt;first_success = 1;</div><div class='del'>-		local-&gt;buf = *buf;</div><div class='del'>-                local-&gt;preparent = *preparent;</div><div class='del'>-                local-&gt;postparent = *postparent;</div><div class='del'>-	}</div><div class='del'>-	cnt = --local-&gt;call_count;</div><div class='del'>-	for (i = local-&gt;active + 1; i &lt; child_count; i++) {</div><div class='del'>-		if (local-&gt;state[i])</div><div class='del'>-			break;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	if (cnt == 0 || i == child_count) {</div><div class='del'>-		call_stub_t *stub = local-&gt;stub;</div><div class='del'>-		GF_FREE (local-&gt;state);</div><div class='del'>-		stub = local-&gt;stub;</div><div class='del'>-		STACK_UNWIND (frame, local-&gt;op_ret, local-&gt;op_errno,</div><div class='del'>-                              local-&gt;stub-&gt;args.mkdir.loc.inode, &amp;local-&gt;buf,</div><div class='del'>-                              &amp;local-&gt;preparent, &amp;local-&gt;postparent);</div><div class='del'>-		call_stub_destroy (stub);</div><div class='del'>-		return 0;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	local-&gt;active = i;</div><div class='del'>-</div><div class='del'>-	if (local-&gt;first_success == 0) {</div><div class='del'>-		STACK_WIND (frame,</div><div class='del'>-			    ha_mkdir_cbk,</div><div class='del'>-			    children[i],</div><div class='del'>-			    children[i]-&gt;fops-&gt;mkdir,</div><div class='del'>-			    &amp;local-&gt;stub-&gt;args.mkdir.loc,</div><div class='del'>-			    local-&gt;stub-&gt;args.mkdir.mode);</div><div class='del'>-		return 0;</div><div class='del'>-	}</div><div class='del'>-	cnt = local-&gt;call_count;</div><div class='del'>-</div><div class='del'>-	for (; i &lt; child_count; i++) {</div><div class='del'>-		if (local-&gt;state[i]) {</div><div class='del'>-			STACK_WIND (frame,</div><div class='del'>-				    ha_mkdir_lookup_cbk,</div><div class='del'>-				    children[i],</div><div class='del'>-				    children[i]-&gt;fops-&gt;lookup,</div><div class='del'>-				    &amp;local-&gt;stub-&gt;args.mkdir.loc,</div><div class='del'>-				    0);</div><div class='del'>-			if (--cnt == 0)</div><div class='del'>-				break;</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-ha_mkdir (call_frame_t *frame,</div><div class='del'>-	  xlator_t *this,</div><div class='del'>-	  loc_t *loc,</div><div class='del'>-	  mode_t mode)</div><div class='del'>-{</div><div class='del'>-	ha_local_t *local = NULL;</div><div class='del'>-	ha_private_t *pvt = NULL;</div><div class='del'>-	int child_count = 0, i = 0;</div><div class='del'>-	char *stateino = NULL;</div><div class='del'>-        int32_t op_errno = EINVAL;</div><div class='del'>-</div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-	pvt = this-&gt;private;</div><div class='del'>-	child_count = pvt-&gt;child_count;</div><div class='del'>-</div><div class='del'>-	frame-&gt;local = local = GF_CALLOC (1, sizeof (*local), </div><div class='del'>-                                          gf_ha_mt_ha_local_t);</div><div class='del'>-        if (!frame-&gt;local) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_ERROR, "out of memory");</div><div class='del'>-                op_errno = ENOMEM;</div><div class='del'>-                goto err;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-	local-&gt;stub = fop_mkdir_stub (frame, ha_mkdir, loc, mode);</div><div class='del'>-        if (!local-&gt;stub) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_ERROR, "out of memory");</div><div class='del'>-                op_errno = ENOMEM;</div><div class='del'>-                goto err;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-	local-&gt;op_ret = -1;</div><div class='del'>-	local-&gt;op_errno = ENOTCONN;</div><div class='del'>-	local-&gt;state = GF_CALLOC (1, child_count, gf_ha_mt_char);</div><div class='del'>-        if (!local-&gt;state) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_ERROR, "out of memory");</div><div class='del'>-                op_errno = ENOMEM;</div><div class='del'>-                goto err;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-	memcpy (local-&gt;state, pvt-&gt;state, child_count);</div><div class='del'>-	local-&gt;active = -1;</div><div class='del'>-</div><div class='del'>-	stateino = GF_CALLOC (1, child_count, gf_ha_mt_char);</div><div class='del'>-        if (!stateino) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_ERROR, "out of memory");</div><div class='del'>-                op_errno = ENOMEM;</div><div class='del'>-                goto err;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-	inode_ctx_put (loc-&gt;inode, this, (uint64_t)(long)stateino);</div><div class='del'>-	for (i = 0; i &lt; child_count; i++) {</div><div class='del'>-		if (local-&gt;state[i]) {</div><div class='del'>-			local-&gt;call_count++;</div><div class='del'>-			if (local-&gt;active == -1)</div><div class='del'>-				local-&gt;active = i;</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	STACK_WIND (frame,</div><div class='del'>-		    ha_mkdir_cbk,</div><div class='del'>-		    HA_ACTIVE_CHILD(this, local),</div><div class='del'>-		    HA_ACTIVE_CHILD(this, local)-&gt;fops-&gt;mkdir,</div><div class='del'>-		    loc, mode);</div><div class='del'>-	return 0;</div><div class='del'>-err:</div><div class='del'>-        local = frame-&gt;local;</div><div class='del'>-        frame-&gt;local = NULL;</div><div class='del'>-</div><div class='del'>-	STACK_UNWIND (frame, -1, op_errno, NULL, NULL, NULL, NULL);</div><div class='del'>-        ha_local_wipe (local);</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>- int32_t</div><div class='del'>-ha_unlink_cbk (call_frame_t *frame,</div><div class='del'>-	       void *cookie,</div><div class='del'>-	       xlator_t *this,</div><div class='del'>-	       int32_t op_ret,</div><div class='del'>-	       int32_t op_errno,</div><div class='del'>-               struct iatt *preparent,</div><div class='del'>-               struct iatt *postparent)</div><div class='del'>-{</div><div class='del'>-	int ret = -1;</div><div class='del'>-</div><div class='del'>-	ret = ha_handle_cbk (frame, cookie, op_ret, op_errno);</div><div class='del'>-	if (ret == 0) {</div><div class='del'>-		STACK_UNWIND (frame, op_ret, op_errno, preparent, postparent);</div><div class='del'>-	}</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-ha_unlink (call_frame_t *frame,</div><div class='del'>-	   xlator_t *this,</div><div class='del'>-	   loc_t *loc)</div><div class='del'>-{</div><div class='del'>-	ha_local_t *local = NULL;</div><div class='del'>-	int op_errno = 0;</div><div class='del'>-</div><div class='del'>-	op_errno = ha_alloc_init_inode (frame, loc-&gt;inode);</div><div class='del'>-</div><div class='del'>-	if (op_errno &lt; 0) {</div><div class='del'>-		op_errno = -op_errno;</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-	local-&gt;stub = fop_unlink_stub (frame, ha_unlink, loc);</div><div class='del'>-        if (!local-&gt;stub) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_ERROR, "out of memory");</div><div class='del'>-                op_errno = ENOMEM;</div><div class='del'>-                goto err;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-	STACK_WIND_COOKIE (frame,</div><div class='del'>-			   ha_unlink_cbk,</div><div class='del'>-			   (void *)(long)local-&gt;active,</div><div class='del'>-			   HA_ACTIVE_CHILD(this, local),</div><div class='del'>-			   HA_ACTIVE_CHILD(this, local)-&gt;fops-&gt;unlink,</div><div class='del'>-			   loc);</div><div class='del'>-	return 0;</div><div class='del'>-err:</div><div class='del'>-	STACK_UNWIND (frame, -1, op_errno, NULL, NULL);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>- int32_t</div><div class='del'>-ha_rmdir_cbk (call_frame_t *frame,</div><div class='del'>-	      void *cookie,</div><div class='del'>-	      xlator_t *this,</div><div class='del'>-	      int32_t op_ret,</div><div class='del'>-	      int32_t op_errno,</div><div class='del'>-              struct iatt *preparent,</div><div class='del'>-              struct iatt *postparent)</div><div class='del'>-{</div><div class='del'>-	int ret = -1;</div><div class='del'>-</div><div class='del'>-	ret = ha_handle_cbk (frame, cookie, op_ret, op_errno);</div><div class='del'>-</div><div class='del'>-	if (ret == 0) {</div><div class='del'>-		STACK_UNWIND (frame,</div><div class='del'>-			      op_ret,</div><div class='del'>-			      op_errno,</div><div class='del'>-                              preparent,</div><div class='del'>-                              postparent);</div><div class='del'>-	}</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-ha_rmdir (call_frame_t *frame,</div><div class='del'>-	  xlator_t *this,</div><div class='del'>-	  loc_t *loc)</div><div class='del'>-{</div><div class='del'>-	ha_local_t *local = frame-&gt;local;</div><div class='del'>-	int op_errno = 0;</div><div class='del'>-</div><div class='del'>-	op_errno = ha_alloc_init_inode (frame, loc-&gt;inode);</div><div class='del'>-	if (op_errno &lt; 0) {</div><div class='del'>-		op_errno = -op_errno;</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-	local-&gt;stub = fop_rmdir_stub (frame, ha_rmdir, loc);</div><div class='del'>-        if (!local-&gt;stub) {</div><div class='del'>-                op_errno = ENOMEM;</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_ERROR, "out of memory");</div><div class='del'>-                goto err;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-	STACK_WIND_COOKIE (frame,</div><div class='del'>-			   ha_rmdir_cbk,</div><div class='del'>-			   (void *)(long)local-&gt;active,</div><div class='del'>-			   HA_ACTIVE_CHILD(this, local),</div><div class='del'>-			   HA_ACTIVE_CHILD(this, local)-&gt;fops-&gt;rmdir,</div><div class='del'>-			   loc);</div><div class='del'>-	return 0;</div><div class='del'>-err:</div><div class='del'>-	STACK_UNWIND (frame, -1, op_errno, NULL, NULL);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-ha_symlink_lookup_cbk (call_frame_t *frame,</div><div class='del'>-		       void *cookie,</div><div class='del'>-		       xlator_t *this,</div><div class='del'>-		       int32_t op_ret,</div><div class='del'>-		       int32_t op_errno,</div><div class='del'>-		       inode_t *inode,</div><div class='del'>-		       struct iatt *buf,</div><div class='del'>-                       dict_t *dict,</div><div class='del'>-                       struct iatt *postparent)</div><div class='del'>-{</div><div class='del'>-	ha_local_t *local = NULL;</div><div class='del'>-	ha_private_t *pvt = NULL;</div><div class='del'>-	char *stateino = NULL;</div><div class='del'>-	int child_count = 0, i = 0, cnt = 0;</div><div class='del'>-	call_frame_t *prev_frame = NULL;</div><div class='del'>-	xlator_t **children = NULL;</div><div class='del'>-	uint64_t tmp_stateino = 0;</div><div class='del'>-</div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-	pvt = this-&gt;private;</div><div class='del'>-	child_count = pvt-&gt;child_count;</div><div class='del'>-	prev_frame = cookie;</div><div class='del'>-	children = pvt-&gt;children;</div><div class='del'>-</div><div class='del'>-	for (i = 0; i &lt; child_count; i++)</div><div class='del'>-		if (prev_frame-&gt;this == children[i])</div><div class='del'>-			break;</div><div class='del'>-</div><div class='del'>-	if (op_ret == -1) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_ERROR, "(path=%s) (op_ret=%d op_errno=%d)", local-&gt;stub-&gt;args.symlink.loc.path, op_ret, op_errno);</div><div class='del'>-	}</div><div class='del'>-	inode_ctx_get (local-&gt;stub-&gt;args.symlink.loc.inode,</div><div class='del'>-		       this, &amp;tmp_stateino);  </div><div class='del'>-	stateino = (char *)(long)tmp_stateino;</div><div class='del'>-</div><div class='del'>-	if (op_ret == 0)</div><div class='del'>-		stateino[i] = 1;</div><div class='del'>-</div><div class='del'>-	LOCK (&amp;frame-&gt;lock);</div><div class='del'>-	cnt = --local-&gt;call_count;</div><div class='del'>-	UNLOCK (&amp;frame-&gt;lock);</div><div class='del'>-</div><div class='del'>-	if (cnt == 0) {</div><div class='del'>-		call_stub_t *stub = local-&gt;stub;</div><div class='del'>-		GF_FREE (local-&gt;state);</div><div class='del'>-		STACK_UNWIND (frame,</div><div class='del'>-			      local-&gt;op_ret,</div><div class='del'>-			      local-&gt;op_errno,</div><div class='del'>-			      local-&gt;stub-&gt;args.symlink.loc.inode, &amp;local-&gt;buf,</div><div class='del'>-                              &amp;local-&gt;preparent, &amp;local-&gt;postparent);</div><div class='del'>-		call_stub_destroy (stub);</div><div class='del'>-	}</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-ha_symlink_cbk (call_frame_t *frame,</div><div class='del'>-		void *cookie,</div><div class='del'>-		xlator_t *this,</div><div class='del'>-		int32_t op_ret,</div><div class='del'>-		int32_t op_errno,</div><div class='del'>-		inode_t *inode,</div><div class='del'>-                struct iatt *buf,</div><div class='del'>-                struct iatt *preparent,</div><div class='del'>-                struct iatt *postparent)</div><div class='del'>-{</div><div class='del'>-	ha_local_t *local = NULL;</div><div class='del'>-	ha_private_t *pvt = NULL;</div><div class='del'>-	char *stateino = NULL;</div><div class='del'>-	int child_count = 0, i = 0, cnt = 0;</div><div class='del'>-	call_frame_t *prev_frame = NULL;</div><div class='del'>-	xlator_t **children = NULL;</div><div class='del'>-	uint64_t tmp_stateino = 0;</div><div class='del'>-</div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-	pvt = this-&gt;private;</div><div class='del'>-	child_count = pvt-&gt;child_count;</div><div class='del'>-	prev_frame = cookie;</div><div class='del'>-	children = pvt-&gt;children;</div><div class='del'>-</div><div class='del'>-	for (i = 0; i &lt; child_count; i++)</div><div class='del'>-		if (prev_frame-&gt;this == children[i])</div><div class='del'>-			break;</div><div class='del'>-</div><div class='del'>-	if (op_ret == -1) {</div><div class='del'>-		local-&gt;op_errno = op_errno;</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_ERROR, "(path=%s) (op_ret=%d op_errno=%d)", local-&gt;stub-&gt;args.symlink.loc.path, op_ret, op_errno);</div><div class='del'>-	}</div><div class='del'>-	inode_ctx_get (local-&gt;stub-&gt;args.symlink.loc.inode, </div><div class='del'>-		       this, &amp;tmp_stateino);</div><div class='del'>-	stateino = (char *)(long)tmp_stateino;</div><div class='del'>-</div><div class='del'>-	if (op_ret == 0) {</div><div class='del'>-		stateino[i] = 1;</div><div class='del'>-		local-&gt;op_ret = 0;</div><div class='del'>-		local-&gt;first_success = 1;</div><div class='del'>-		local-&gt;buf = *buf;</div><div class='del'>-                local-&gt;preparent = *preparent;</div><div class='del'>-                local-&gt;postparent = *postparent;</div><div class='del'>-	}</div><div class='del'>-	cnt = --local-&gt;call_count;</div><div class='del'>-	for (i = local-&gt;active + 1; i &lt; child_count; i++) {</div><div class='del'>-		if (local-&gt;state[i])</div><div class='del'>-			break;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	if (cnt == 0 || i == child_count) {</div><div class='del'>-		call_stub_t *stub = local-&gt;stub;</div><div class='del'>-		GF_FREE (local-&gt;state);</div><div class='del'>-		stub = local-&gt;stub;</div><div class='del'>-		STACK_UNWIND (frame, local-&gt;op_ret, local-&gt;op_errno, </div><div class='del'>-			      local-&gt;stub-&gt;args.symlink.loc.inode, &amp;local-&gt;buf,</div><div class='del'>-                              &amp;local-&gt;preparent, &amp;local-&gt;postparent);</div><div class='del'>-		call_stub_destroy (stub);</div><div class='del'>-		return 0;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	local-&gt;active = i;</div><div class='del'>-</div><div class='del'>-	if (local-&gt;first_success == 0) {</div><div class='del'>-		STACK_WIND (frame,</div><div class='del'>-			    ha_symlink_cbk,</div><div class='del'>-			    children[i],</div><div class='del'>-			    children[i]-&gt;fops-&gt;symlink,</div><div class='del'>-			    local-&gt;stub-&gt;args.symlink.linkname,</div><div class='del'>-			    &amp;local-&gt;stub-&gt;args.symlink.loc);</div><div class='del'>-		return 0;</div><div class='del'>-	}</div><div class='del'>-	cnt = local-&gt;call_count;</div><div class='del'>-</div><div class='del'>-	for (; i &lt; child_count; i++) {</div><div class='del'>-		if (local-&gt;state[i]) {</div><div class='del'>-			STACK_WIND (frame,</div><div class='del'>-				    ha_symlink_lookup_cbk,</div><div class='del'>-				    children[i],</div><div class='del'>-				    children[i]-&gt;fops-&gt;lookup,</div><div class='del'>-				    &amp;local-&gt;stub-&gt;args.symlink.loc,</div><div class='del'>-				    0);</div><div class='del'>-			if (--cnt == 0)</div><div class='del'>-				break;</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-ha_symlink (call_frame_t *frame,</div><div class='del'>-	    xlator_t *this,</div><div class='del'>-	    const char *linkname,</div><div class='del'>-	    loc_t *loc)</div><div class='del'>-{</div><div class='del'>-	ha_local_t *local = NULL;</div><div class='del'>-	ha_private_t *pvt = NULL;</div><div class='del'>-	int child_count = 0, i = 0;</div><div class='del'>-	char *stateino = NULL;</div><div class='del'>-        int32_t op_errno = EINVAL;</div><div class='del'>-</div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-	pvt = this-&gt;private;</div><div class='del'>-	child_count = pvt-&gt;child_count;</div><div class='del'>-</div><div class='del'>-	frame-&gt;local = local = GF_CALLOC (1, sizeof (*local), </div><div class='del'>-                                          gf_ha_mt_ha_local_t);</div><div class='del'>-        if (!local) {</div><div class='del'>-                op_errno = ENOMEM;</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_ERROR, "out of memory");</div><div class='del'>-                goto err;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-	local-&gt;stub = fop_symlink_stub (frame, ha_symlink, linkname, loc);</div><div class='del'>-        if (!local-&gt;stub) {</div><div class='del'>-                op_errno = ENOMEM;</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_ERROR, "out of memory");</div><div class='del'>-                goto err;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-	local-&gt;op_ret = -1;</div><div class='del'>-	local-&gt;op_errno = ENOTCONN;</div><div class='del'>-	local-&gt;state = GF_CALLOC (1, child_count, gf_ha_mt_char);</div><div class='del'>-        if (!local-&gt;state) {</div><div class='del'>-                op_errno = ENOMEM;</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_ERROR, "out of memory");</div><div class='del'>-                goto err;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-	memcpy (local-&gt;state, pvt-&gt;state, child_count);</div><div class='del'>-	local-&gt;active = -1;</div><div class='del'>-</div><div class='del'>-	stateino = GF_CALLOC (1, child_count, gf_ha_mt_char);</div><div class='del'>-        if (!stateino) {</div><div class='del'>-                op_errno = ENOMEM;</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_ERROR, "out of memory");</div><div class='del'>-                goto err;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-	inode_ctx_put (loc-&gt;inode, this, (uint64_t)(long)stateino);</div><div class='del'>-</div><div class='del'>-	for (i = 0; i &lt; child_count; i++) {</div><div class='del'>-		if (local-&gt;state[i]) {</div><div class='del'>-			local-&gt;call_count++;</div><div class='del'>-			if (local-&gt;active == -1) {</div><div class='del'>-				local-&gt;active = i;</div><div class='del'>-			}</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	STACK_WIND (frame,</div><div class='del'>-		    ha_symlink_cbk,</div><div class='del'>-		    HA_ACTIVE_CHILD(this, local),</div><div class='del'>-		    HA_ACTIVE_CHILD(this, local)-&gt;fops-&gt;symlink,</div><div class='del'>-		    linkname, loc);</div><div class='del'>-	return 0;</div><div class='del'>-err:</div><div class='del'>-        local = frame-&gt;local;</div><div class='del'>-        frame-&gt;local = NULL;</div><div class='del'>-        STACK_UNWIND (frame, -1, op_errno, NULL, NULL, NULL, NULL);</div><div class='del'>-        ha_local_wipe (local);</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>- int32_t</div><div class='del'>-ha_rename_cbk (call_frame_t *frame,</div><div class='del'>-	       void *cookie,</div><div class='del'>-	       xlator_t *this,</div><div class='del'>-	       int32_t op_ret,</div><div class='del'>-	       int32_t op_errno,</div><div class='del'>-	       struct iatt *buf,</div><div class='del'>-               struct iatt *preoldparent,</div><div class='del'>-               struct iatt *postoldparent,</div><div class='del'>-               struct iatt *prenewparent,</div><div class='del'>-               struct iatt *postnewparent)</div><div class='del'>-{</div><div class='del'>-	int ret = -1;</div><div class='del'>-</div><div class='del'>-	ret = ha_handle_cbk (frame, cookie, op_ret, op_errno);</div><div class='del'>-</div><div class='del'>-	if (ret == 0) {</div><div class='del'>-		STACK_UNWIND (frame, op_ret, op_errno, buf, preoldparent,</div><div class='del'>-                              postoldparent, prenewparent, postnewparent);</div><div class='del'>-	}</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-ha_rename (call_frame_t *frame,</div><div class='del'>-	   xlator_t *this,</div><div class='del'>-	   loc_t *oldloc,</div><div class='del'>-	   loc_t *newloc)</div><div class='del'>-{</div><div class='del'>-	ha_local_t *local = NULL;</div><div class='del'>-	int op_errno = 0;</div><div class='del'>-</div><div class='del'>-	op_errno = ha_alloc_init_inode (frame, oldloc-&gt;inode);</div><div class='del'>-	if (op_errno &lt; 0) {</div><div class='del'>-		op_errno = -op_errno;</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-	local-&gt;stub = fop_rename_stub (frame, ha_rename, oldloc, newloc);</div><div class='del'>-        if (!local-&gt;stub) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_ERROR, "out of memory");</div><div class='del'>-                op_errno = ENOMEM;</div><div class='del'>-                goto err;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-	STACK_WIND_COOKIE (frame,</div><div class='del'>-			   ha_rename_cbk,</div><div class='del'>-			   (void *)(long)local-&gt;active,</div><div class='del'>-			   HA_ACTIVE_CHILD(this, local),</div><div class='del'>-			   HA_ACTIVE_CHILD(this, local)-&gt;fops-&gt;rename,</div><div class='del'>-			   oldloc, newloc);</div><div class='del'>-	return 0;</div><div class='del'>-err:</div><div class='del'>-	STACK_UNWIND (frame, -1, op_errno, NULL, NULL, NULL, NULL, NULL);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-ha_link_lookup_cbk (call_frame_t *frame,</div><div class='del'>-		    void *cookie,</div><div class='del'>-		    xlator_t *this,</div><div class='del'>-		    int32_t op_ret,</div><div class='del'>-		    int32_t op_errno,</div><div class='del'>-		    inode_t *inode,</div><div class='del'>-		    struct iatt *buf,</div><div class='del'>-                    dict_t *dict,</div><div class='del'>-                    struct iatt *postparent)</div><div class='del'>-{</div><div class='del'>-	ha_local_t *local = NULL;</div><div class='del'>-	ha_private_t *pvt = NULL;</div><div class='del'>-	char *stateino = NULL;</div><div class='del'>-	int child_count = 0, i = 0, cnt = 0;</div><div class='del'>-	call_frame_t *prev_frame = NULL;</div><div class='del'>-	xlator_t **children = NULL;</div><div class='del'>-	uint64_t tmp_stateino = 0;</div><div class='del'>-</div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-	pvt = this-&gt;private;</div><div class='del'>-	child_count = pvt-&gt;child_count;</div><div class='del'>-	prev_frame = cookie;</div><div class='del'>-	children = pvt-&gt;children;</div><div class='del'>-</div><div class='del'>-	for (i = 0; i &lt; child_count; i++)</div><div class='del'>-		if (prev_frame-&gt;this == children[i])</div><div class='del'>-			break;</div><div class='del'>-</div><div class='del'>-	if (op_ret == -1) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_ERROR, "(path=%s) (op_ret=%d op_errno=%d)", local-&gt;stub-&gt;args.link.newloc.path, op_ret, op_errno);</div><div class='del'>-	}</div><div class='del'>-	inode_ctx_get (local-&gt;stub-&gt;args.link.newloc.inode, </div><div class='del'>-		       this, &amp;tmp_stateino);  </div><div class='del'>-	stateino = (char *)(long)tmp_stateino;</div><div class='del'>-</div><div class='del'>-	if (op_ret == 0)</div><div class='del'>-		stateino[i] = 1;</div><div class='del'>-</div><div class='del'>-	LOCK (&amp;frame-&gt;lock);</div><div class='del'>-	cnt = --local-&gt;call_count;</div><div class='del'>-	UNLOCK (&amp;frame-&gt;lock);</div><div class='del'>-</div><div class='del'>-	if (cnt == 0) {</div><div class='del'>-		call_stub_t *stub = local-&gt;stub;</div><div class='del'>-		GF_FREE (local-&gt;state);</div><div class='del'>-		STACK_UNWIND (frame,</div><div class='del'>-			      local-&gt;op_ret,</div><div class='del'>-			      local-&gt;op_errno,</div><div class='del'>-			      local-&gt;stub-&gt;args.link.oldloc.inode, &amp;local-&gt;buf,</div><div class='del'>-                              &amp;local-&gt;preparent, &amp;local-&gt;postparent);</div><div class='del'>-		call_stub_destroy (stub);</div><div class='del'>-	}</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-ha_link_cbk (call_frame_t *frame,</div><div class='del'>-	     void *cookie,</div><div class='del'>-	     xlator_t *this,</div><div class='del'>-	     int32_t op_ret,</div><div class='del'>-	     int32_t op_errno,</div><div class='del'>-	     inode_t *inode,</div><div class='del'>-             struct iatt *buf,</div><div class='del'>-             struct iatt *preparent,</div><div class='del'>-             struct iatt *postparent)</div><div class='del'>-{</div><div class='del'>-	ha_local_t *local = NULL;</div><div class='del'>-	ha_private_t *pvt = NULL;</div><div class='del'>-	char *stateino = NULL;</div><div class='del'>-	int child_count = 0, i = 0, cnt = 0;</div><div class='del'>-	call_frame_t *prev_frame = NULL;</div><div class='del'>-	xlator_t **children = NULL;</div><div class='del'>-	uint64_t tmp_stateino = 0;</div><div class='del'>-</div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-	pvt = this-&gt;private;</div><div class='del'>-	child_count = pvt-&gt;child_count;</div><div class='del'>-	prev_frame = cookie;</div><div class='del'>-	children = pvt-&gt;children;</div><div class='del'>-</div><div class='del'>-	for (i = 0; i &lt; child_count; i++)</div><div class='del'>-		if (prev_frame-&gt;this == children[i])</div><div class='del'>-			break;</div><div class='del'>-</div><div class='del'>-	if (op_ret == -1) {</div><div class='del'>-		local-&gt;op_errno = op_errno;</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_ERROR, "(path=%s) (op_ret=%d op_errno=%d)", local-&gt;stub-&gt;args.link.newloc.path, op_ret, op_errno);</div><div class='del'>-	}</div><div class='del'>-	inode_ctx_get (local-&gt;stub-&gt;args.link.newloc.inode, </div><div class='del'>-		       this, &amp;tmp_stateino);</div><div class='del'>-	stateino = (char *)(long)tmp_stateino;</div><div class='del'>-</div><div class='del'>-	if (op_ret == 0) {</div><div class='del'>-		stateino[i] = 1;</div><div class='del'>-		local-&gt;op_ret = 0;</div><div class='del'>-		local-&gt;first_success = 1;</div><div class='del'>-		local-&gt;buf = *buf;</div><div class='del'>-                local-&gt;preparent = *preparent;</div><div class='del'>-                local-&gt;postparent = *postparent;</div><div class='del'>-	}</div><div class='del'>-	cnt = --local-&gt;call_count;</div><div class='del'>-	for (i = local-&gt;active + 1; i &lt; child_count; i++) {</div><div class='del'>-		if (local-&gt;state[i])</div><div class='del'>-			break;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	if (cnt == 0 || i == child_count) {</div><div class='del'>-		call_stub_t *stub = local-&gt;stub;</div><div class='del'>-		GF_FREE (local-&gt;state);</div><div class='del'>-		stub = local-&gt;stub;</div><div class='del'>-		STACK_UNWIND (frame, local-&gt;op_ret, local-&gt;op_errno,</div><div class='del'>-                              local-&gt;stub-&gt;args.link.oldloc.inode, &amp;local-&gt;buf,</div><div class='del'>-                              &amp;local-&gt;preparent, &amp;local-&gt;postparent);</div><div class='del'>-		call_stub_destroy (stub);</div><div class='del'>-		return 0;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	local-&gt;active = i;</div><div class='del'>-</div><div class='del'>-	if (local-&gt;first_success == 0) {</div><div class='del'>-		STACK_WIND (frame,</div><div class='del'>-			    ha_link_cbk,</div><div class='del'>-			    children[i],</div><div class='del'>-			    children[i]-&gt;fops-&gt;link,</div><div class='del'>-			    &amp;local-&gt;stub-&gt;args.link.oldloc,</div><div class='del'>-			    &amp;local-&gt;stub-&gt;args.link.newloc);</div><div class='del'>-		return 0;</div><div class='del'>-	}</div><div class='del'>-	cnt = local-&gt;call_count;</div><div class='del'>-</div><div class='del'>-	for (; i &lt; child_count; i++) {</div><div class='del'>-		if (local-&gt;state[i]) {</div><div class='del'>-			STACK_WIND (frame,</div><div class='del'>-				    ha_link_lookup_cbk,</div><div class='del'>-				    children[i],</div><div class='del'>-				    children[i]-&gt;fops-&gt;lookup,</div><div class='del'>-				    &amp;local-&gt;stub-&gt;args.link.newloc,</div><div class='del'>-				    0);</div><div class='del'>-			if (--cnt == 0)</div><div class='del'>-				break;</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-ha_link (call_frame_t *frame,</div><div class='del'>-	 xlator_t *this,</div><div class='del'>-	 loc_t *oldloc,</div><div class='del'>-	 loc_t *newloc)</div><div class='del'>-{</div><div class='del'>-	ha_local_t *local = NULL;</div><div class='del'>-	ha_private_t *pvt = NULL;</div><div class='del'>-	int child_count = 0, i = 0;</div><div class='del'>-	char *stateino = NULL;</div><div class='del'>-	int32_t ret = 0, op_errno = 0;</div><div class='del'>-	uint64_t tmp_stateino = 0;</div><div class='del'>-</div><div class='del'>-	ret = inode_ctx_get (newloc-&gt;inode, this, &amp;tmp_stateino);</div><div class='del'>-	if (ret != 0) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_ERROR, "dict_ptr_error()");</div><div class='del'>-	}</div><div class='del'>-	stateino = (char *)(long)tmp_stateino;</div><div class='del'>-</div><div class='del'>-	if (stateino == NULL) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_ERROR, </div><div class='del'>-			"newloc-&gt;inode's ctx is NULL, returning EINVAL");</div><div class='del'>-		STACK_UNWIND (frame, -1, EINVAL, oldloc-&gt;inode, NULL, NULL,</div><div class='del'>-                              NULL);</div><div class='del'>-		return 0;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-	pvt = this-&gt;private;</div><div class='del'>-	child_count = pvt-&gt;child_count;</div><div class='del'>-</div><div class='del'>-	frame-&gt;local = local = GF_CALLOC (1, sizeof (*local), </div><div class='del'>-                                          gf_ha_mt_ha_local_t);</div><div class='del'>-        if (!frame-&gt;local) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_ERROR, "out of memory");</div><div class='del'>-                op_errno = ENOMEM;</div><div class='del'>-                goto err;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-	local-&gt;stub = fop_link_stub (frame, ha_link, oldloc, newloc);</div><div class='del'>-        if (!local-&gt;stub) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_ERROR, "out of memory");</div><div class='del'>-                op_errno = ENOMEM;</div><div class='del'>-                goto err;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-	local-&gt;op_ret = -1;</div><div class='del'>-	local-&gt;op_errno = ENOTCONN;</div><div class='del'>-	local-&gt;state = GF_CALLOC (1, child_count, gf_ha_mt_char);</div><div class='del'>-        if (!local-&gt;state) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_ERROR, "out of memory");</div><div class='del'>-                op_errno = ENOMEM;</div><div class='del'>-                goto err;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-	memcpy (local-&gt;state, pvt-&gt;state, child_count);</div><div class='del'>-	local-&gt;active = -1;</div><div class='del'>-</div><div class='del'>-	for (i = 0; i &lt; child_count; i++) {</div><div class='del'>-		if (local-&gt;state[i]) {</div><div class='del'>-			local-&gt;call_count++;</div><div class='del'>-			if (local-&gt;active == -1)</div><div class='del'>-				local-&gt;active = i;</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	STACK_WIND (frame,</div><div class='del'>-		    ha_link_cbk,</div><div class='del'>-		    HA_ACTIVE_CHILD(this, local),</div><div class='del'>-		    HA_ACTIVE_CHILD(this, local)-&gt;fops-&gt;link,</div><div class='del'>-		    oldloc,</div><div class='del'>-		    newloc);</div><div class='del'>-	return 0;</div><div class='del'>-err:</div><div class='del'>-        local = frame-&gt;local;</div><div class='del'>-        frame-&gt;local = NULL;</div><div class='del'>-        STACK_UNWIND (frame, -1, op_errno, NULL, NULL, NULL, NULL);</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-ha_create_cbk (call_frame_t *frame,</div><div class='del'>-	       void *cookie,</div><div class='del'>-	       xlator_t *this,</div><div class='del'>-	       int32_t op_ret,</div><div class='del'>-	       int32_t op_errno,</div><div class='del'>-	       fd_t *fd,</div><div class='del'>-	       inode_t *inode,</div><div class='del'>-	       struct iatt *buf,</div><div class='del'>-               struct iatt *preparent,</div><div class='del'>-               struct iatt *postparent)</div><div class='del'>-{</div><div class='del'>-	ha_local_t *local = NULL;</div><div class='del'>-	ha_private_t *pvt = NULL;</div><div class='del'>-	int i, child_count = 0, cnt = 0, ret = 0;</div><div class='del'>-	char *stateino = NULL;</div><div class='del'>-	hafd_t *hafdp = NULL;</div><div class='del'>-	call_frame_t *prev_frame = NULL;</div><div class='del'>-	xlator_t **children = NULL;</div><div class='del'>-	uint64_t tmp_stateino = 0;</div><div class='del'>-	uint64_t tmp_hafdp = 0;</div><div class='del'>-</div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-	pvt = this-&gt;private;</div><div class='del'>-	child_count = pvt-&gt;child_count;</div><div class='del'>-	prev_frame = cookie;</div><div class='del'>-	children = pvt-&gt;children;</div><div class='del'>-</div><div class='del'>-	ret = inode_ctx_get (local-&gt;stub-&gt;args.create.loc.inode, </div><div class='del'>-			     this, &amp;tmp_stateino);</div><div class='del'>-	stateino = (char *)(long)tmp_stateino;</div><div class='del'>-</div><div class='del'>-	if (ret != 0) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_ERROR, "dict_to_ptr() error");</div><div class='del'>-		/* FIXME: handle */</div><div class='del'>-	}</div><div class='del'>-	ret = fd_ctx_get (local-&gt;stub-&gt;args.create.fd, this, &amp;tmp_hafdp);</div><div class='del'>-	if (ret != 0) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_ERROR, "dict_to_ptr() error");</div><div class='del'>-		/* FIXME: handle */</div><div class='del'>-	}</div><div class='del'>-	hafdp = (hafd_t *)(long)tmp_hafdp;</div><div class='del'>-</div><div class='del'>-	for (i = 0; i &lt; child_count; i++) {</div><div class='del'>-		if (prev_frame-&gt;this == children[i])</div><div class='del'>-			break;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	if (op_ret == -1) {</div><div class='del'>-		local-&gt;op_errno = op_errno;</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_ERROR, "(path=%s) (op_ret=%d op_errno=%d)", local-&gt;stub-&gt;args.create.loc.path, op_ret, op_errno);</div><div class='del'>-	}</div><div class='del'>-	if (op_ret != -1) {</div><div class='del'>-		stateino[i] = 1;</div><div class='del'>-		hafdp-&gt;fdstate[i] = 1;</div><div class='del'>-		if (local-&gt;op_ret == -1) {</div><div class='del'>-			local-&gt;op_ret = 0;</div><div class='del'>-			local-&gt;buf = *buf;</div><div class='del'>-                        local-&gt;preparent = *preparent;</div><div class='del'>-                        local-&gt;postparent = *postparent;</div><div class='del'>-			local-&gt;first_success = 1;</div><div class='del'>-		}</div><div class='del'>-		local-&gt;stub-&gt;args.create.flags &amp;= (~O_EXCL);</div><div class='del'>-	}</div><div class='del'>-	LOCK (&amp;frame-&gt;lock);</div><div class='del'>-	cnt = --local-&gt;call_count;</div><div class='del'>-	UNLOCK (&amp;frame-&gt;lock);</div><div class='del'>-</div><div class='del'>-	for (i = local-&gt;active + 1; i &lt; child_count; i++) {</div><div class='del'>-		if (local-&gt;state[i])</div><div class='del'>-			break;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	if (cnt == 0 || i == child_count) {</div><div class='del'>-		char *state = local-&gt;state;</div><div class='del'>-		call_stub_t *stub = local-&gt;stub;</div><div class='del'>-		STACK_UNWIND (frame, local-&gt;op_ret, local-&gt;op_errno,</div><div class='del'>-			      stub-&gt;args.create.fd,</div><div class='del'>-			      stub-&gt;args.create.loc.inode, &amp;local-&gt;buf,</div><div class='del'>-                              &amp;local-&gt;preparent, &amp;local-&gt;postparent);</div><div class='del'>-		GF_FREE (state);</div><div class='del'>-		call_stub_destroy (stub);</div><div class='del'>-		return 0;</div><div class='del'>-	}</div><div class='del'>-	local-&gt;active = i;</div><div class='del'>-	cnt = local-&gt;call_count;</div><div class='del'>-	for (; i &lt; child_count; i++) {</div><div class='del'>-		if (local-&gt;state[i]) {</div><div class='del'>-			STACK_WIND (frame,</div><div class='del'>-				    ha_create_cbk,</div><div class='del'>-				    children[i],</div><div class='del'>-				    children[i]-&gt;fops-&gt;create,</div><div class='del'>-				    &amp;local-&gt;stub-&gt;args.create.loc,</div><div class='del'>-				    local-&gt;stub-&gt;args.create.flags,</div><div class='del'>-				    local-&gt;stub-&gt;args.create.mode,</div><div class='del'>-				    local-&gt;stub-&gt;args.create.fd);</div><div class='del'>-			if ((local-&gt;first_success == 0) || (cnt == 0))</div><div class='del'>-				break;</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-ha_create (call_frame_t *frame,</div><div class='del'>-	   xlator_t *this,</div><div class='del'>-	   loc_t *loc,</div><div class='del'>-	   int32_t flags,</div><div class='del'>-	   mode_t mode, fd_t *fd)</div><div class='del'>-{</div><div class='del'>-	ha_local_t *local = NULL;</div><div class='del'>-	ha_private_t *pvt = NULL;</div><div class='del'>-	int i, child_count = 0;</div><div class='del'>-	char *stateino = NULL;</div><div class='del'>-	xlator_t **children = NULL;</div><div class='del'>-	hafd_t *hafdp = NULL;</div><div class='del'>-        int32_t op_errno = EINVAL;</div><div class='del'>-</div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-	pvt = this-&gt;private;</div><div class='del'>-	child_count = pvt-&gt;child_count;</div><div class='del'>-	children = pvt-&gt;children;</div><div class='del'>-</div><div class='del'>-	if (local == NULL) {</div><div class='del'>-                frame-&gt;local = local = GF_CALLOC (1, sizeof (*local), </div><div class='del'>-                                                  gf_ha_mt_ha_local_t);</div><div class='del'>-                if (!local) {</div><div class='del'>-                        op_errno = ENOMEM;</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_ERROR, "out of memory");</div><div class='del'>-                        goto err;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-		local-&gt;stub = fop_create_stub (frame, ha_create, loc, flags, mode, fd);</div><div class='del'>-                if (!local-&gt;stub) {</div><div class='del'>-                        op_errno = ENOMEM;</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_ERROR, "out of memory");</div><div class='del'>-                        goto err;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                local-&gt;state = GF_CALLOC (1, child_count, gf_ha_mt_char);</div><div class='del'>-                if (!local-&gt;state) {</div><div class='del'>-                        op_errno = ENOMEM;</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_ERROR, "out of memory");</div><div class='del'>-                        goto err;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-		local-&gt;active = -1;</div><div class='del'>-		local-&gt;op_ret = -1;</div><div class='del'>-		local-&gt;op_errno = ENOTCONN;</div><div class='del'>-		memcpy (local-&gt;state, pvt-&gt;state, child_count);</div><div class='del'>-</div><div class='del'>-		for (i = 0; i &lt; pvt-&gt;child_count; i++) {</div><div class='del'>-			if (local-&gt;state[i]) {</div><div class='del'>-				local-&gt;call_count++;</div><div class='del'>-				if (local-&gt;active == -1)</div><div class='del'>-					local-&gt;active = i;</div><div class='del'>-			}</div><div class='del'>-		}</div><div class='del'>-		/* FIXME handle active -1 */</div><div class='del'>-		stateino = GF_CALLOC (1, child_count, gf_ha_mt_char);</div><div class='del'>-                if (!stateino) {</div><div class='del'>-                        op_errno = ENOMEM;</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_ERROR, "out of memory");</div><div class='del'>-                        goto err;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-		hafdp = GF_CALLOC (1, sizeof (*hafdp), gf_ha_mt_hafd_t);</div><div class='del'>-                if (!hafdp) {</div><div class='del'>-                        op_errno = ENOMEM;</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_ERROR, "out of memory");</div><div class='del'>-                        goto err;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-		hafdp-&gt;fdstate = GF_CALLOC (1, child_count, gf_ha_mt_char);</div><div class='del'>-                if (!hafdp-&gt;fdstate) {</div><div class='del'>-                        op_errno = ENOMEM;</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_ERROR, "out of memory");</div><div class='del'>-                        goto err;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-		hafdp-&gt;path = gf_strdup(loc-&gt;path);</div><div class='del'>-                if (!hafdp-&gt;path) {</div><div class='del'>-                        op_errno = ENOMEM;</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_ERROR, "out of memory");</div><div class='del'>-                        goto err;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-		LOCK_INIT (&amp;hafdp-&gt;lock);</div><div class='del'>-		fd_ctx_set (fd, this, (uint64_t)(long)hafdp);</div><div class='del'>-		inode_ctx_put (loc-&gt;inode, this, (uint64_t)(long)stateino);</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	STACK_WIND (frame,</div><div class='del'>-		    ha_create_cbk,</div><div class='del'>-		    children[local-&gt;active],</div><div class='del'>-		    children[local-&gt;active]-&gt;fops-&gt;create,</div><div class='del'>-		    loc, flags, mode, fd);</div><div class='del'>-	return 0;</div><div class='del'>-err:</div><div class='del'>-        local = frame-&gt;local;</div><div class='del'>-        frame-&gt;local = NULL;</div><div class='del'>-        STACK_UNWIND (frame, -1, op_errno, NULL, NULL, NULL, NULL, NULL);</div><div class='del'>-        ha_local_wipe (local);</div><div class='del'>-</div><div class='del'>-        if (stateino) {</div><div class='del'>-                GF_FREE (stateino);</div><div class='del'>-                stateino = NULL;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (hafdp) {</div><div class='del'>-                if (hafdp-&gt;fdstate) {</div><div class='del'>-                        GF_FREE (hafdp-&gt;fdstate);</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                if (hafdp-&gt;path) {</div><div class='del'>-                        GF_FREE (hafdp-&gt;path);</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                GF_FREE (hafdp);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>- int32_t</div><div class='del'>-ha_open_cbk (call_frame_t *frame,</div><div class='del'>-	     void *cookie,</div><div class='del'>-	     xlator_t *this,</div><div class='del'>-	     int32_t op_ret,</div><div class='del'>-	     int32_t op_errno,</div><div class='del'>-	     fd_t *fd)</div><div class='del'>-{</div><div class='del'>-	ha_local_t *local = NULL;</div><div class='del'>-	ha_private_t *pvt = NULL;</div><div class='del'>-	xlator_t **children = NULL;</div><div class='del'>-	int i = 0, child_count = 0, callcnt = 0, ret = 0;</div><div class='del'>-	call_frame_t *prev_frame = NULL;</div><div class='del'>-	hafd_t *hafdp = NULL;</div><div class='del'>-	uint64_t tmp_hafdp = 0;</div><div class='del'>-</div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-	pvt = this-&gt;private;</div><div class='del'>-	children = pvt-&gt;children;</div><div class='del'>-	child_count = pvt-&gt;child_count;</div><div class='del'>-	prev_frame = cookie;</div><div class='del'>-</div><div class='del'>-	ret = fd_ctx_get (local-&gt;fd, this, &amp;tmp_hafdp);</div><div class='del'>-	if (ret != 0) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_ERROR, "dict_ptr_error()");</div><div class='del'>-	}</div><div class='del'>-	hafdp = (hafd_t *)(long)tmp_hafdp;</div><div class='del'>-</div><div class='del'>-	for (i = 0; i &lt; child_count; i++)</div><div class='del'>-		if (children[i] == prev_frame-&gt;this)</div><div class='del'>-			break;</div><div class='del'>-	LOCK (&amp;frame-&gt;lock);</div><div class='del'>-	if (op_ret != -1) {</div><div class='del'>-		hafdp-&gt;fdstate[i] = 1;</div><div class='del'>-		local-&gt;op_ret = 0;</div><div class='del'>-	}</div><div class='del'>-	if (op_ret == -1 &amp;&amp; op_errno != ENOTCONN)</div><div class='del'>-		local-&gt;op_errno = op_errno;</div><div class='del'>-	callcnt = --local-&gt;call_count;</div><div class='del'>-	UNLOCK (&amp;frame-&gt;lock);</div><div class='del'>-</div><div class='del'>-	if (callcnt == 0) {</div><div class='del'>-		STACK_UNWIND (frame,</div><div class='del'>-			      local-&gt;op_ret,</div><div class='del'>-			      local-&gt;op_errno,</div><div class='del'>-			      local-&gt;fd);</div><div class='del'>-	}</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-ha_open (call_frame_t *frame,</div><div class='del'>-	 xlator_t *this,</div><div class='del'>-	 loc_t *loc,</div><div class='del'>-	 int32_t flags, fd_t *fd, int wbflags)</div><div class='del'>-{</div><div class='del'>-	ha_local_t *local = NULL;</div><div class='del'>-	ha_private_t *pvt = NULL;</div><div class='del'>-	char *stateino = NULL;</div><div class='del'>-	xlator_t **children = NULL;</div><div class='del'>-	int cnt = 0, i, child_count = 0, ret = 0;</div><div class='del'>-	hafd_t *hafdp = NULL;</div><div class='del'>-	uint64_t tmp_stateino = 0;</div><div class='del'>-        int32_t op_errno = ENOMEM;</div><div class='del'>-</div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-	pvt = this-&gt;private;</div><div class='del'>-	children = pvt-&gt;children;</div><div class='del'>-	child_count = pvt-&gt;child_count;</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-	frame-&gt;local = local = GF_CALLOC (1, sizeof (*local), </div><div class='del'>-                                          gf_ha_mt_ha_local_t);</div><div class='del'>-        if (!local) {</div><div class='del'>-                op_errno = ENOMEM;</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_ERROR, "out of memory");</div><div class='del'>-                goto err;</div><div class='del'>-        }</div><div class='del'>-                </div><div class='del'>-	local-&gt;op_ret = -1;</div><div class='del'>-	local-&gt;op_errno = ENOTCONN;</div><div class='del'>-	local-&gt;fd = fd;</div><div class='del'>-</div><div class='del'>-	hafdp = GF_CALLOC (1, sizeof (*hafdp), gf_ha_mt_hafd_t);</div><div class='del'>-        if (!hafdp) {</div><div class='del'>-                op_errno = ENOMEM;</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_ERROR, "out of memory");</div><div class='del'>-                goto err;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-	hafdp-&gt;fdstate = GF_CALLOC (1, child_count, gf_ha_mt_char);</div><div class='del'>-        if (!hafdp-&gt;fdstate) {</div><div class='del'>-                op_errno = ENOMEM;</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_ERROR, "out of memory");</div><div class='del'>-                goto err;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-	hafdp-&gt;path = gf_strdup (loc-&gt;path);</div><div class='del'>-        if (!hafdp-&gt;path) {</div><div class='del'>-                op_errno = ENOMEM;</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_ERROR, "out of memory");</div><div class='del'>-                goto err;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-	hafdp-&gt;active = -1;</div><div class='del'>-	if (pvt-&gt;pref_subvol == -1) {</div><div class='del'>-		hafdp-&gt;active = fd-&gt;inode-&gt;ino % child_count;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	LOCK_INIT (&amp;hafdp-&gt;lock);</div><div class='del'>-	fd_ctx_set (fd, this, (uint64_t)(long)hafdp);</div><div class='del'>-	ret = inode_ctx_get (loc-&gt;inode, this, &amp;tmp_stateino);</div><div class='del'>-	stateino = (char *)(long)tmp_stateino;</div><div class='del'>-</div><div class='del'>-	for (i = 0; i &lt; child_count; i++)</div><div class='del'>-		if (stateino[i])</div><div class='del'>-			cnt++;</div><div class='del'>-	local-&gt;call_count = cnt;</div><div class='del'>-	for (i = 0; i &lt; child_count; i++) {</div><div class='del'>-		if (stateino[i]) {</div><div class='del'>-			STACK_WIND (frame,</div><div class='del'>-				    ha_open_cbk,</div><div class='del'>-				    children[i],</div><div class='del'>-				    children[i]-&gt;fops-&gt;open,</div><div class='del'>-				    loc, flags, fd, wbflags);</div><div class='del'>-			if (--cnt == 0)</div><div class='del'>-				break;</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='del'>-	return 0;</div><div class='del'>-err:</div><div class='del'>-        local = frame-&gt;local;</div><div class='del'>-        frame-&gt;local = NULL;</div><div class='del'>-</div><div class='del'>-	STACK_UNWIND (frame, -1, op_errno, fd);</div><div class='del'>-        if (hafdp) {</div><div class='del'>-                if (hafdp-&gt;fdstate) {</div><div class='del'>-                        GF_FREE (hafdp-&gt;fdstate);</div><div class='del'>-                        hafdp-&gt;fdstate = NULL;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                if (hafdp-&gt;path) {</div><div class='del'>-                        GF_FREE (hafdp-&gt;path);</div><div class='del'>-                        hafdp-&gt;path = NULL;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                GF_FREE (hafdp);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        ha_local_wipe (local);</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>- int32_t</div><div class='del'>-ha_readv_cbk (call_frame_t *frame,</div><div class='del'>-	      void *cookie,</div><div class='del'>-	      xlator_t *this,</div><div class='del'>-	      int32_t op_ret,</div><div class='del'>-	      int32_t op_errno,</div><div class='del'>-	      struct iovec *vector,</div><div class='del'>-	      int32_t count,</div><div class='del'>-	      struct iatt *stbuf,</div><div class='del'>-              struct iobref *iobref)</div><div class='del'>-{</div><div class='del'>-	int ret = 0;</div><div class='del'>-</div><div class='del'>-	ret = ha_handle_cbk (frame, cookie, op_ret, op_errno);</div><div class='del'>-</div><div class='del'>-	if (ret == 0) {</div><div class='del'>-		STACK_UNWIND (frame,</div><div class='del'>-			      op_ret,</div><div class='del'>-			      op_errno,</div><div class='del'>-			      vector,</div><div class='del'>-			      count,</div><div class='del'>-			      stbuf,</div><div class='del'>-                              iobref);</div><div class='del'>-	}</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-ha_readv (call_frame_t *frame,</div><div class='del'>-	  xlator_t *this,</div><div class='del'>-	  fd_t *fd,</div><div class='del'>-	  size_t size,</div><div class='del'>-	  off_t offset)</div><div class='del'>-{</div><div class='del'>-	ha_local_t *local = NULL;</div><div class='del'>-	int op_errno = 0;</div><div class='del'>-</div><div class='del'>-	op_errno = ha_alloc_init_fd (frame, fd);</div><div class='del'>-	if (op_errno &lt; 0) {</div><div class='del'>-		op_errno = -op_errno;</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-	local-&gt;stub = fop_readv_stub (frame, ha_readv, fd, size, offset);</div><div class='del'>-        if (!local-&gt;stub) {</div><div class='del'>-                op_errno = ENOMEM;</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_ERROR, "out of memory");</div><div class='del'>-                goto err;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-	STACK_WIND_COOKIE (frame,</div><div class='del'>-			   ha_readv_cbk,</div><div class='del'>-			   (void *)(long)local-&gt;active,</div><div class='del'>-			   HA_ACTIVE_CHILD(this, local),</div><div class='del'>-			   HA_ACTIVE_CHILD(this, local)-&gt;fops-&gt;readv,</div><div class='del'>-			   fd,</div><div class='del'>-			   size,</div><div class='del'>-			   offset);</div><div class='del'>-	return 0;</div><div class='del'>-err:</div><div class='del'>-        local = frame-&gt;local;</div><div class='del'>-        frame-&gt;local = NULL;</div><div class='del'>-</div><div class='del'>-	STACK_UNWIND (frame, -1, op_errno, NULL, 0, NULL, NULL);</div><div class='del'>-</div><div class='del'>-        ha_local_wipe (local);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>- int32_t</div><div class='del'>-ha_writev_cbk (call_frame_t *frame,</div><div class='del'>-	       void *cookie,</div><div class='del'>-	       xlator_t *this,</div><div class='del'>-	       int32_t op_ret,</div><div class='del'>-	       int32_t op_errno,</div><div class='del'>-               struct iatt *prebuf,</div><div class='del'>-	       struct iatt *postbuf)</div><div class='del'>-{</div><div class='del'>-	int ret = 0;</div><div class='del'>-	ret = ha_handle_cbk (frame, cookie, op_ret, op_errno);</div><div class='del'>-</div><div class='del'>-	if (ret == 0) {</div><div class='del'>-		STACK_UNWIND (frame,</div><div class='del'>-			      op_ret,</div><div class='del'>-			      op_errno,</div><div class='del'>-                              prebuf,</div><div class='del'>-			      postbuf);</div><div class='del'>-	}</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-ha_writev (call_frame_t *frame,</div><div class='del'>-	   xlator_t *this,</div><div class='del'>-	   fd_t *fd,</div><div class='del'>-	   struct iovec *vector,</div><div class='del'>-	   int32_t count,</div><div class='del'>-	   off_t off,</div><div class='del'>-           struct iobref *iobref)</div><div class='del'>-{</div><div class='del'>-	ha_local_t *local = NULL;</div><div class='del'>-	int op_errno = 0;</div><div class='del'>-</div><div class='del'>-	op_errno = ha_alloc_init_fd (frame, fd);</div><div class='del'>-	if (op_errno &lt; 0) {</div><div class='del'>-		op_errno = -op_errno;</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-	local-&gt;stub = fop_writev_stub (frame, ha_writev, fd, vector, count, off,</div><div class='del'>-                                       iobref);</div><div class='del'>-        if (!local-&gt;stub) {</div><div class='del'>-                op_errno = ENOMEM;</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_ERROR, "out of memory");</div><div class='del'>-                goto err;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-	STACK_WIND_COOKIE (frame,</div><div class='del'>-			   ha_writev_cbk,</div><div class='del'>-			   (void *)(long)local-&gt;active,</div><div class='del'>-			   HA_ACTIVE_CHILD(this, local),</div><div class='del'>-			   HA_ACTIVE_CHILD(this, local)-&gt;fops-&gt;writev,</div><div class='del'>-			   fd,</div><div class='del'>-			   vector,</div><div class='del'>-			   count,</div><div class='del'>-			   off,</div><div class='del'>-                           iobref);</div><div class='del'>-	return 0;</div><div class='del'>-err:</div><div class='del'>-        local = frame-&gt;local;</div><div class='del'>-        frame-&gt;local = NULL;</div><div class='del'>-</div><div class='del'>-	STACK_UNWIND (frame, -1, op_errno, NULL, NULL);</div><div class='del'>-</div><div class='del'>-        ha_local_wipe (local);</div><div class='del'>-	return 0;	</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>- int32_t</div><div class='del'>-ha_flush_cbk (call_frame_t *frame,</div><div class='del'>-	      void *cookie,</div><div class='del'>-	      xlator_t *this,</div><div class='del'>-	      int32_t op_ret,</div><div class='del'>-	      int32_t op_errno)</div><div class='del'>-{</div><div class='del'>-	int ret = 0;</div><div class='del'>-	ret = ha_handle_cbk (frame, cookie, op_ret, op_errno);</div><div class='del'>-</div><div class='del'>-	if (ret == 0) {</div><div class='del'>-		STACK_UNWIND (frame,</div><div class='del'>-			      op_ret,</div><div class='del'>-			      op_errno);</div><div class='del'>-	}</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-ha_flush (call_frame_t *frame,</div><div class='del'>-	  xlator_t *this,</div><div class='del'>-	  fd_t *fd)</div><div class='del'>-{</div><div class='del'>-	ha_local_t *local = NULL;</div><div class='del'>-	int op_errno = 0;</div><div class='del'>-</div><div class='del'>-	op_errno = ha_alloc_init_fd (frame, fd);</div><div class='del'>-	if (op_errno &lt; 0) {</div><div class='del'>-		op_errno = -op_errno;</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-	local-&gt;stub = fop_flush_stub (frame, ha_flush, fd);</div><div class='del'>-        if (!local-&gt;stub) {</div><div class='del'>-                op_errno = ENOMEM;</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_ERROR, "out of memory");</div><div class='del'>-                goto err;</div><div class='del'>-        }</div><div class='del'>-                </div><div class='del'>-	STACK_WIND_COOKIE (frame,</div><div class='del'>-			   ha_flush_cbk,</div><div class='del'>-			   (void *)(long)local-&gt;active,</div><div class='del'>-			   HA_ACTIVE_CHILD(this, local),</div><div class='del'>-			   HA_ACTIVE_CHILD(this, local)-&gt;fops-&gt;flush,</div><div class='del'>-			   fd);</div><div class='del'>-	return 0;</div><div class='del'>-err:</div><div class='del'>-        local = frame-&gt;local;</div><div class='del'>-        frame-&gt;local = NULL;</div><div class='del'>-</div><div class='del'>-	STACK_UNWIND (frame, -1, op_errno);</div><div class='del'>-</div><div class='del'>-        ha_local_wipe (local);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>- int32_t</div><div class='del'>-ha_fsync_cbk (call_frame_t *frame,</div><div class='del'>-	      void *cookie,</div><div class='del'>-	      xlator_t *this,</div><div class='del'>-	      int32_t op_ret,</div><div class='del'>-	      int32_t op_errno,</div><div class='del'>-              struct iatt *prebuf,</div><div class='del'>-              struct iatt *postbuf)</div><div class='del'>-{</div><div class='del'>-	int ret = 0;</div><div class='del'>-	ret = ha_handle_cbk (frame, cookie, op_ret, op_errno);</div><div class='del'>-</div><div class='del'>-	if (ret == 0) {</div><div class='del'>-		STACK_UNWIND (frame,</div><div class='del'>-			      op_ret,</div><div class='del'>-			      op_errno);</div><div class='del'>-	}</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-ha_fsync (call_frame_t *frame,</div><div class='del'>-	  xlator_t *this,</div><div class='del'>-	  fd_t *fd,</div><div class='del'>-	  int32_t flags)</div><div class='del'>-{</div><div class='del'>-	ha_local_t *local = NULL;</div><div class='del'>-	int op_errno = 0;</div><div class='del'>-</div><div class='del'>-	op_errno = ha_alloc_init_fd (frame, fd);</div><div class='del'>-	if (op_errno &lt; 0) {</div><div class='del'>-		op_errno = -op_errno;</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-	local-&gt;stub = fop_fsync_stub (frame, ha_fsync, fd, flags);</div><div class='del'>-        if (!local-&gt;stub) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_ERROR, "out of memory");</div><div class='del'>-                op_errno = ENOMEM;</div><div class='del'>-                goto err;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-	STACK_WIND_COOKIE (frame,</div><div class='del'>-			   ha_fsync_cbk,</div><div class='del'>-			   (void *)(long)local-&gt;active,</div><div class='del'>-			   HA_ACTIVE_CHILD(this, local),</div><div class='del'>-			   HA_ACTIVE_CHILD(this, local)-&gt;fops-&gt;fsync,</div><div class='del'>-			   fd,</div><div class='del'>-			   flags);</div><div class='del'>-	return 0;</div><div class='del'>-err:</div><div class='del'>-        local = frame-&gt;local;</div><div class='del'>-        frame-&gt;local = NULL;</div><div class='del'>-</div><div class='del'>-	STACK_UNWIND (frame, -1, op_errno);</div><div class='del'>-</div><div class='del'>-        ha_local_wipe (local);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>- int32_t</div><div class='del'>-ha_fstat_cbk (call_frame_t *frame,</div><div class='del'>-	      void *cookie,</div><div class='del'>-	      xlator_t *this,</div><div class='del'>-	      int32_t op_ret,</div><div class='del'>-	      int32_t op_errno,</div><div class='del'>-	      struct iatt *buf)</div><div class='del'>-{</div><div class='del'>-	int ret = 0;</div><div class='del'>-</div><div class='del'>-	ret = ha_handle_cbk (frame, cookie, op_ret, op_errno);</div><div class='del'>-</div><div class='del'>-	if (ret == 0) {</div><div class='del'>-		STACK_UNWIND (frame,</div><div class='del'>-			      op_ret,</div><div class='del'>-			      op_errno,</div><div class='del'>-			      buf);</div><div class='del'>-	}</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-ha_fstat (call_frame_t *frame,</div><div class='del'>-	  xlator_t *this,</div><div class='del'>-	  fd_t *fd)</div><div class='del'>-{</div><div class='del'>-	ha_local_t *local = NULL;</div><div class='del'>-	int op_errno = 0;</div><div class='del'>-</div><div class='del'>-	op_errno = ha_alloc_init_fd (frame, fd);</div><div class='del'>-</div><div class='del'>-	if (op_errno &lt; 0) {</div><div class='del'>-		op_errno = -op_errno;</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-	local-&gt;stub = fop_fstat_stub (frame, ha_fstat, fd);</div><div class='del'>-        if (!local-&gt;stub) {</div><div class='del'>-                op_errno = ENOMEM;</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_ERROR, "out of memory");</div><div class='del'>-                goto err;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-	STACK_WIND_COOKIE (frame,</div><div class='del'>-			   ha_fstat_cbk,</div><div class='del'>-			   (void *)(long)local-&gt;active,</div><div class='del'>-			   HA_ACTIVE_CHILD(this, local),</div><div class='del'>-			   HA_ACTIVE_CHILD(this, local)-&gt;fops-&gt;fstat,</div><div class='del'>-			   fd);</div><div class='del'>-	return 0;</div><div class='del'>-err:</div><div class='del'>-        local = frame-&gt;local;</div><div class='del'>-        frame-&gt;local = NULL;</div><div class='del'>-</div><div class='del'>-	STACK_UNWIND (frame, -1, op_errno, NULL);</div><div class='del'>-</div><div class='del'>-        ha_local_wipe (local);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-ha_opendir_cbk (call_frame_t *frame,</div><div class='del'>-		void *cookie,</div><div class='del'>-		xlator_t *this,</div><div class='del'>-		int32_t op_ret,</div><div class='del'>-		int32_t op_errno,</div><div class='del'>-		fd_t *fd)</div><div class='del'>-{</div><div class='del'>-	ha_local_t *local = NULL;</div><div class='del'>-	ha_private_t *pvt = NULL;</div><div class='del'>-	xlator_t **children = NULL;</div><div class='del'>-	int i = 0, child_count = 0, callcnt = 0, ret = 0;</div><div class='del'>-	call_frame_t *prev_frame = NULL;</div><div class='del'>-	hafd_t *hafdp = NULL;</div><div class='del'>-	uint64_t tmp_hafdp = 0;</div><div class='del'>-</div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-	pvt = this-&gt;private;</div><div class='del'>-	children = pvt-&gt;children;</div><div class='del'>-	child_count = pvt-&gt;child_count;</div><div class='del'>-	prev_frame = cookie;</div><div class='del'>-</div><div class='del'>-	ret = fd_ctx_get (local-&gt;fd, this, &amp;tmp_hafdp);</div><div class='del'>-	if (ret != 0) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_ERROR, "dict_ptr_error()");</div><div class='del'>-	}</div><div class='del'>-	hafdp = (hafd_t *)(long)tmp_hafdp;</div><div class='del'>-</div><div class='del'>-	for (i = 0; i &lt; child_count; i++)</div><div class='del'>-		if (children[i] == prev_frame-&gt;this)</div><div class='del'>-			break;</div><div class='del'>-	LOCK (&amp;frame-&gt;lock);</div><div class='del'>-	if (op_ret != -1) {</div><div class='del'>-		hafdp-&gt;fdstate[i] = 1;</div><div class='del'>-		local-&gt;op_ret = 0;</div><div class='del'>-	}</div><div class='del'>-	if (op_ret == -1 &amp;&amp; op_errno != ENOTCONN)</div><div class='del'>-		local-&gt;op_errno = op_errno;</div><div class='del'>-	callcnt = --local-&gt;call_count;</div><div class='del'>-	UNLOCK (&amp;frame-&gt;lock);</div><div class='del'>-</div><div class='del'>-	if (callcnt == 0) {</div><div class='del'>-		STACK_UNWIND (frame,</div><div class='del'>-			      local-&gt;op_ret,</div><div class='del'>-			      local-&gt;op_errno,</div><div class='del'>-			      local-&gt;fd);</div><div class='del'>-	}</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-ha_opendir (call_frame_t *frame,</div><div class='del'>-	    xlator_t *this,</div><div class='del'>-	    loc_t *loc, fd_t *fd)</div><div class='del'>-{</div><div class='del'>-	ha_local_t *local = NULL;</div><div class='del'>-	ha_private_t *pvt = NULL;</div><div class='del'>-	char *stateino = NULL;</div><div class='del'>-	xlator_t **children = NULL;</div><div class='del'>-	int cnt = 0, i, child_count = 0, ret = 0;</div><div class='del'>-	hafd_t *hafdp = NULL;</div><div class='del'>-	uint64_t tmp_stateino = 0;</div><div class='del'>-        int32_t op_errno = EINVAL;</div><div class='del'>-</div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-	pvt = this-&gt;private;</div><div class='del'>-	children = pvt-&gt;children;</div><div class='del'>-	child_count = pvt-&gt;child_count;</div><div class='del'>-</div><div class='del'>-	frame-&gt;local = local = GF_CALLOC (1, sizeof (*local), </div><div class='del'>-                                          gf_ha_mt_ha_local_t);</div><div class='del'>-        if (!local) {</div><div class='del'>-                op_errno = ENOMEM;</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_ERROR, "out of memory");</div><div class='del'>-                goto err;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-	local-&gt;op_ret = -1;</div><div class='del'>-	local-&gt;op_errno = ENOTCONN;</div><div class='del'>-	local-&gt;fd = fd;</div><div class='del'>-</div><div class='del'>-	hafdp = GF_CALLOC (1, sizeof (*hafdp), gf_ha_mt_hafd_t);</div><div class='del'>-        if (!hafdp) {</div><div class='del'>-                op_errno = ENOMEM;</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_ERROR, "out of memory");</div><div class='del'>-                goto err;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-	hafdp-&gt;fdstate = GF_CALLOC (1, child_count, gf_ha_mt_char);</div><div class='del'>-        if (!hafdp-&gt;fdstate) {</div><div class='del'>-                op_errno = ENOMEM;</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_ERROR, "out of memory");</div><div class='del'>-                goto err;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-	hafdp-&gt;path = gf_strdup (loc-&gt;path);</div><div class='del'>-        if (!hafdp-&gt;path) {</div><div class='del'>-                op_errno = ENOMEM;</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_ERROR, "out of memory");</div><div class='del'>-                goto err;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-	LOCK_INIT (&amp;hafdp-&gt;lock);</div><div class='del'>-	fd_ctx_set (fd, this, (uint64_t)(long)hafdp);</div><div class='del'>-	ret = inode_ctx_get (loc-&gt;inode, this, &amp;tmp_stateino);</div><div class='del'>-	stateino = (char *)(long)tmp_stateino;</div><div class='del'>-	</div><div class='del'>-	if (ret != 0) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_ERROR, "inode_ctx_get() error");</div><div class='del'>-	}</div><div class='del'>-	for (i = 0; i &lt; child_count; i++)</div><div class='del'>-		if (stateino[i])</div><div class='del'>-			cnt++;</div><div class='del'>-	local-&gt;call_count = cnt;</div><div class='del'>-	for (i = 0; i &lt; child_count; i++) {</div><div class='del'>-		if (stateino[i]) {</div><div class='del'>-			STACK_WIND (frame,</div><div class='del'>-				    ha_opendir_cbk,</div><div class='del'>-				    children[i],</div><div class='del'>-				    children[i]-&gt;fops-&gt;opendir,</div><div class='del'>-				    loc, fd);</div><div class='del'>-			if (--cnt == 0)</div><div class='del'>-				break;</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='del'>-	return 0;</div><div class='del'>-err:</div><div class='del'>-        local = frame-&gt;local;</div><div class='del'>-        frame-&gt;local = NULL;</div><div class='del'>-</div><div class='del'>-	STACK_UNWIND (frame, -1, op_errno, NULL);</div><div class='del'>-        ha_local_wipe (local);</div><div class='del'>-        if (hafdp) {</div><div class='del'>-                if (hafdp-&gt;fdstate) {</div><div class='del'>-                        GF_FREE (hafdp-&gt;fdstate);</div><div class='del'>-                        hafdp-&gt;fdstate = NULL;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                if (hafdp-&gt;path) {</div><div class='del'>-                        GF_FREE (hafdp-&gt;path);</div><div class='del'>-                        hafdp-&gt;path = NULL;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                GF_FREE (hafdp);</div><div class='del'>-        }</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>- int32_t</div><div class='del'>-ha_getdents_cbk (call_frame_t *frame,</div><div class='del'>-		 void *cookie,</div><div class='del'>-		 xlator_t *this,</div><div class='del'>-		 int32_t op_ret,</div><div class='del'>-		 int32_t op_errno,</div><div class='del'>-		 dir_entry_t *entries,</div><div class='del'>-		 int32_t count)</div><div class='del'>-{</div><div class='del'>-	int ret = 0;</div><div class='del'>-</div><div class='del'>-	ret = ha_handle_cbk (frame, cookie, op_ret, op_errno);</div><div class='del'>-	if (ret == 0) {</div><div class='del'>-		STACK_UNWIND (frame,</div><div class='del'>-			      op_ret,</div><div class='del'>-			      op_errno,</div><div class='del'>-			      entries,</div><div class='del'>-			      count);</div><div class='del'>-	}</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-ha_getdents (call_frame_t *frame,</div><div class='del'>-	     xlator_t *this,</div><div class='del'>-	     fd_t *fd,</div><div class='del'>-	     size_t size,</div><div class='del'>-	     off_t offset,</div><div class='del'>-	     int32_t flag)</div><div class='del'>-{</div><div class='del'>-	ha_local_t *local = NULL;</div><div class='del'>-	int op_errno = 0;</div><div class='del'>-</div><div class='del'>-	op_errno = ha_alloc_init_fd (frame, fd);</div><div class='del'>-	if (op_errno &lt; 0) {</div><div class='del'>-		op_errno = -op_errno;</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-	local-&gt;stub = fop_getdents_stub (frame, ha_getdents, fd, size, offset,</div><div class='del'>-                                         flag);</div><div class='del'>-        if (!local-&gt;stub) {</div><div class='del'>-                op_errno = ENOMEM;</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_ERROR, "out of memory");</div><div class='del'>-                goto err;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-	STACK_WIND_COOKIE (frame,</div><div class='del'>-			   ha_getdents_cbk,</div><div class='del'>-			   (void *)(long)local-&gt;active,</div><div class='del'>-			   HA_ACTIVE_CHILD(this, local),</div><div class='del'>-			   HA_ACTIVE_CHILD(this, local)-&gt;fops-&gt;getdents,</div><div class='del'>-			   fd,</div><div class='del'>-			   size,</div><div class='del'>-			   offset,</div><div class='del'>-			   flag);</div><div class='del'>-	return 0;</div><div class='del'>-err:</div><div class='del'>-        local = frame-&gt;local;</div><div class='del'>-        frame-&gt;local = NULL;</div><div class='del'>-</div><div class='del'>-	STACK_UNWIND (frame, -1, op_errno, NULL, 0);</div><div class='del'>-</div><div class='del'>-        ha_local_wipe (local);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>- int32_t</div><div class='del'>-ha_setdents_cbk (call_frame_t *frame,</div><div class='del'>-		 void *cookie,</div><div class='del'>-		 xlator_t *this,</div><div class='del'>-		 int32_t op_ret,</div><div class='del'>-		 int32_t op_errno)</div><div class='del'>-{</div><div class='del'>-	int ret = 0;</div><div class='del'>-</div><div class='del'>-	ret = ha_handle_cbk (frame, cookie, op_ret, op_errno);</div><div class='del'>-</div><div class='del'>-	if (ret == 0) {</div><div class='del'>-		STACK_UNWIND (frame,</div><div class='del'>-			      op_ret,</div><div class='del'>-			      op_errno);</div><div class='del'>-	}</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-ha_setdents (call_frame_t *frame,</div><div class='del'>-	     xlator_t *this,</div><div class='del'>-	     fd_t *fd,</div><div class='del'>-	     int32_t flags,</div><div class='del'>-	     dir_entry_t *entries,</div><div class='del'>-	     int32_t count)</div><div class='del'>-{</div><div class='del'>-	ha_local_t *local = NULL;</div><div class='del'>-	int op_errno = 0;</div><div class='del'>-</div><div class='del'>-	op_errno = ha_alloc_init_fd (frame, fd);</div><div class='del'>-	if (op_errno &lt; 0) {</div><div class='del'>-		op_errno = -op_errno;</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-</div><div class='del'>-	local-&gt;stub = fop_setdents_stub (frame, ha_setdents, fd, flags, entries,</div><div class='del'>-                                         count);</div><div class='del'>-        if (!local-&gt;stub) {</div><div class='del'>-                op_errno = ENOMEM;</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_ERROR, "out of memory");</div><div class='del'>-                goto err;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-	STACK_WIND_COOKIE (frame,</div><div class='del'>-			   ha_setdents_cbk,</div><div class='del'>-			   (void *)(long)local-&gt;active,</div><div class='del'>-			   HA_ACTIVE_CHILD(this, local),</div><div class='del'>-			   HA_ACTIVE_CHILD(this, local)-&gt;fops-&gt;setdents,</div><div class='del'>-			   fd,</div><div class='del'>-			   flags,</div><div class='del'>-			   entries,</div><div class='del'>-			   count);</div><div class='del'>-	return 0;</div><div class='del'>-err:</div><div class='del'>-        local = frame-&gt;local;</div><div class='del'>-        frame-&gt;local = NULL;</div><div class='del'>-</div><div class='del'>-	STACK_UNWIND (frame, -1, op_errno);</div><div class='del'>-</div><div class='del'>-        ha_local_wipe (local);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>- int32_t</div><div class='del'>-ha_fsyncdir_cbk (call_frame_t *frame,</div><div class='del'>-		 void *cookie,</div><div class='del'>-		 xlator_t *this,</div><div class='del'>-		 int32_t op_ret,</div><div class='del'>-		 int32_t op_errno)</div><div class='del'>-{</div><div class='del'>-	int ret = 0;</div><div class='del'>-</div><div class='del'>-	ret = ha_handle_cbk (frame, cookie, op_ret, op_errno);</div><div class='del'>-	if (ret == 0) {</div><div class='del'>-		STACK_UNWIND (frame,</div><div class='del'>-			      op_ret,</div><div class='del'>-			      op_errno);</div><div class='del'>-	}</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-ha_fsyncdir (call_frame_t *frame,</div><div class='del'>-	     xlator_t *this,</div><div class='del'>-	     fd_t *fd,</div><div class='del'>-	     int32_t flags)</div><div class='del'>-{</div><div class='del'>-	ha_local_t *local = NULL;</div><div class='del'>-	int op_errno = 0;</div><div class='del'>-</div><div class='del'>-	op_errno = ha_alloc_init_fd (frame, fd);</div><div class='del'>-	if (op_errno &lt; 0) {</div><div class='del'>-		op_errno = -op_errno;</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-	local-&gt;stub = fop_fsyncdir_stub (frame, ha_fsyncdir, fd, flags);</div><div class='del'>-        if (!local-&gt;stub) {</div><div class='del'>-                op_errno = ENOMEM;</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_ERROR, "out of memory");</div><div class='del'>-                goto err;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-	STACK_WIND_COOKIE (frame,</div><div class='del'>-			   ha_fsyncdir_cbk,</div><div class='del'>-			   (void *)(long)local-&gt;active,</div><div class='del'>-			   HA_ACTIVE_CHILD(this, local),</div><div class='del'>-			   HA_ACTIVE_CHILD(this, local)-&gt;fops-&gt;fsyncdir,</div><div class='del'>-			   fd,</div><div class='del'>-			   flags);</div><div class='del'>-	return 0;</div><div class='del'>-err:</div><div class='del'>-        local = frame-&gt;local;</div><div class='del'>-        frame-&gt;local = NULL;</div><div class='del'>- </div><div class='del'>-	STACK_UNWIND (frame, -1, op_errno, NULL, NULL);</div><div class='del'>-</div><div class='del'>-        ha_local_wipe (local);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>- int32_t</div><div class='del'>-ha_statfs_cbk (call_frame_t *frame,</div><div class='del'>-	       void *cookie,</div><div class='del'>-	       xlator_t *this,</div><div class='del'>-	       int32_t op_ret,</div><div class='del'>-	       int32_t op_errno,</div><div class='del'>-	       struct statvfs *buf)</div><div class='del'>-{</div><div class='del'>-        ha_local_t   *local = NULL;</div><div class='del'>-        ha_private_t *priv  = NULL;</div><div class='del'>-</div><div class='del'>-        local = frame-&gt;local;</div><div class='del'>-        if (-1 == op_ret) {</div><div class='del'>-                local-&gt;active = (local-&gt;active + 1) % priv-&gt;child_count;</div><div class='del'>-                local-&gt;tries--;</div><div class='del'>-                if (!local-&gt;tries)</div><div class='del'>-                        goto out;</div><div class='del'>-                </div><div class='del'>-                STACK_WIND (frame, ha_statfs_cbk,</div><div class='del'>-                            HA_ACTIVE_CHILD(this, local),</div><div class='del'>-                            HA_ACTIVE_CHILD(this, local)-&gt;fops-&gt;statfs, </div><div class='del'>-                            &amp;local-&gt;loc);</div><div class='del'>-                return 0;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>- out:</div><div class='del'>-        loc_wipe (&amp;local-&gt;loc);</div><div class='del'>-        STACK_UNWIND (frame, op_ret, op_errno, buf);</div><div class='del'>-        </div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-ha_statfs (call_frame_t *frame,</div><div class='del'>-	   xlator_t *this,</div><div class='del'>-	   loc_t *loc)</div><div class='del'>-{</div><div class='del'>-        ha_private_t *priv = NULL;</div><div class='del'>-	ha_local_t   *local = NULL;</div><div class='del'>-	int           op_errno = 0;</div><div class='del'>-</div><div class='del'>-        /* The normal way of handling failover doesn't work here</div><div class='del'>-         * as loc-&gt;inode may be null in this case.</div><div class='del'>-         */</div><div class='del'>-        local = GF_CALLOC (1, sizeof (*local), </div><div class='del'>-                           gf_ha_mt_ha_local_t);</div><div class='del'>-        if (!local) {</div><div class='del'>-                op_errno = ENOMEM;</div><div class='del'>-                goto err;</div><div class='del'>-        }</div><div class='del'>-        priv = this-&gt;private;</div><div class='del'>-        frame-&gt;local  = local;</div><div class='del'>-        local-&gt;active = priv-&gt;pref_subvol;</div><div class='del'>-        if (-1 == local-&gt;active)</div><div class='del'>-                local-&gt;active = 0;</div><div class='del'>-        local-&gt;tries  = priv-&gt;child_count;</div><div class='del'>-        loc_copy (&amp;local-&gt;loc, loc);</div><div class='del'>-</div><div class='del'>-	STACK_WIND (frame, ha_statfs_cbk, HA_ACTIVE_CHILD(this, local),</div><div class='del'>-                    HA_ACTIVE_CHILD(this, local)-&gt;fops-&gt;statfs, loc);</div><div class='del'>-	return 0;</div><div class='del'>-err:</div><div class='del'>-	STACK_UNWIND (frame, -1, op_errno, NULL);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>- int32_t</div><div class='del'>-ha_setxattr_cbk (call_frame_t *frame,</div><div class='del'>-		 void *cookie,</div><div class='del'>-		 xlator_t *this,</div><div class='del'>-		 int32_t op_ret,</div><div class='del'>-		 int32_t op_errno)</div><div class='del'>-{</div><div class='del'>-	int ret = -1;</div><div class='del'>-</div><div class='del'>-	ret = ha_handle_cbk (frame, cookie, op_ret, op_errno);</div><div class='del'>-</div><div class='del'>-	if (ret == 0) {</div><div class='del'>-		STACK_UNWIND (frame,</div><div class='del'>-			      op_ret,</div><div class='del'>-			      op_errno);</div><div class='del'>-	}</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-ha_setxattr (call_frame_t *frame,</div><div class='del'>-	     xlator_t *this,</div><div class='del'>-	     loc_t *loc,</div><div class='del'>-	     dict_t *dict,</div><div class='del'>-	     int32_t flags)</div><div class='del'>-{</div><div class='del'>-	ha_local_t *local = NULL;</div><div class='del'>-	int op_errno = 0;</div><div class='del'>-</div><div class='del'>-	op_errno = ha_alloc_init_inode (frame, loc-&gt;inode);</div><div class='del'>-	if (op_errno &lt; 0) {</div><div class='del'>-		op_errno = -op_errno;</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-	local-&gt;stub = fop_setxattr_stub (frame, ha_setxattr, loc, dict, flags);</div><div class='del'>-        if (!local-&gt;stub) {</div><div class='del'>-                op_errno = ENOMEM;</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_ERROR, "out of memory");</div><div class='del'>-                goto err;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-	STACK_WIND_COOKIE (frame,</div><div class='del'>-			   ha_setxattr_cbk,</div><div class='del'>-			   (void *)(long)local-&gt;active,</div><div class='del'>-			   HA_ACTIVE_CHILD(this, local),</div><div class='del'>-			   HA_ACTIVE_CHILD(this, local)-&gt;fops-&gt;setxattr,</div><div class='del'>-			   loc,</div><div class='del'>-			   dict,</div><div class='del'>-			   flags);</div><div class='del'>-	return 0;</div><div class='del'>-err:</div><div class='del'>-        local = frame-&gt;local;</div><div class='del'>-        frame-&gt;local = NULL;</div><div class='del'>-</div><div class='del'>-	STACK_UNWIND (frame, -1, op_errno);</div><div class='del'>-</div><div class='del'>-        ha_local_wipe (local);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>- int32_t</div><div class='del'>-ha_getxattr_cbk (call_frame_t *frame,</div><div class='del'>-		 void *cookie,</div><div class='del'>-		 xlator_t *this,</div><div class='del'>-		 int32_t op_ret,</div><div class='del'>-		 int32_t op_errno,</div><div class='del'>-		 dict_t *dict)</div><div class='del'>-{</div><div class='del'>-	int ret = -1;</div><div class='del'>-</div><div class='del'>-	ret = ha_handle_cbk (frame, cookie, op_ret, op_errno);</div><div class='del'>-</div><div class='del'>-	if (ret == 0) {</div><div class='del'>-		STACK_UNWIND (frame,</div><div class='del'>-			      op_ret,</div><div class='del'>-			      op_errno,</div><div class='del'>-			      dict);</div><div class='del'>-	}</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-ha_getxattr (call_frame_t *frame,</div><div class='del'>-	     xlator_t *this,</div><div class='del'>-	     loc_t *loc,</div><div class='del'>-	     const char *name)</div><div class='del'>-{</div><div class='del'>-	ha_local_t *local = NULL;</div><div class='del'>-	int op_errno = 0;</div><div class='del'>-</div><div class='del'>-	op_errno = ha_alloc_init_inode (frame, loc-&gt;inode);</div><div class='del'>-	if (op_errno &lt; 0) {</div><div class='del'>-		op_errno = -op_errno;</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-	local-&gt;stub = fop_getxattr_stub (frame, ha_getxattr, loc, name);</div><div class='del'>-        if (!local-&gt;stub) {</div><div class='del'>-                op_errno = ENOMEM;</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_ERROR, "out of memory");</div><div class='del'>-                goto err;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-	STACK_WIND_COOKIE (frame,</div><div class='del'>-			   ha_getxattr_cbk,</div><div class='del'>-			   (void *)(long)local-&gt;active,</div><div class='del'>-			   HA_ACTIVE_CHILD(this, local),</div><div class='del'>-			   HA_ACTIVE_CHILD(this, local)-&gt;fops-&gt;getxattr,</div><div class='del'>-			   loc,</div><div class='del'>-			   name);</div><div class='del'>-	return 0;</div><div class='del'>-err:</div><div class='del'>-        local = frame-&gt;local;</div><div class='del'>-        frame-&gt;local = NULL;</div><div class='del'>-</div><div class='del'>-	STACK_UNWIND (frame, -1, op_errno, NULL);</div><div class='del'>-</div><div class='del'>-        ha_local_wipe (local);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-ha_xattrop_cbk (call_frame_t *frame,</div><div class='del'>-		void *cookie,</div><div class='del'>-		xlator_t *this,</div><div class='del'>-		int32_t op_ret,</div><div class='del'>-		int32_t op_errno,</div><div class='del'>-		dict_t *dict)</div><div class='del'>-{</div><div class='del'>-	int ret = -1;</div><div class='del'>-	ret = ha_handle_cbk (frame, cookie, op_ret, op_errno);</div><div class='del'>-	if (ret == 0) {</div><div class='del'>-		STACK_UNWIND (frame, op_ret, op_errno, dict);</div><div class='del'>-	}</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-ha_xattrop (call_frame_t *frame,</div><div class='del'>-	    xlator_t *this,</div><div class='del'>-	    loc_t *loc,</div><div class='del'>-	    gf_xattrop_flags_t flags,</div><div class='del'>-	    dict_t *dict)</div><div class='del'>-{</div><div class='del'>-	ha_local_t *local = NULL;</div><div class='del'>-	int op_errno = 0;</div><div class='del'>-</div><div class='del'>-	op_errno = ha_alloc_init_inode (frame, loc-&gt;inode);</div><div class='del'>-	if (op_errno &lt; 0) {</div><div class='del'>-		op_errno = -op_errno;</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-</div><div class='del'>-	local-&gt;stub = fop_xattrop_stub (frame, ha_xattrop, loc, flags, dict);</div><div class='del'>-        if (!local-&gt;stub) {</div><div class='del'>-                op_errno = ENOMEM;</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_ERROR, "out of memory");</div><div class='del'>-                goto err;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-	STACK_WIND_COOKIE (frame,</div><div class='del'>-			   ha_xattrop_cbk,</div><div class='del'>-			   (void *)(long)local-&gt;active,</div><div class='del'>-			   HA_ACTIVE_CHILD(this, local),</div><div class='del'>-			   HA_ACTIVE_CHILD(this, local)-&gt;fops-&gt;xattrop,</div><div class='del'>-			   loc,</div><div class='del'>-			   flags,</div><div class='del'>-			   dict);</div><div class='del'>-	return 0;</div><div class='del'>-err:</div><div class='del'>-        local = frame-&gt;local;</div><div class='del'>-        frame-&gt;local = NULL;</div><div class='del'>-</div><div class='del'>-	STACK_UNWIND (frame, -1, op_errno, dict);</div><div class='del'>-</div><div class='del'>-        ha_local_wipe (local);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-ha_fxattrop_cbk (call_frame_t *frame,</div><div class='del'>-		 void *cookie,</div><div class='del'>-		 xlator_t *this,</div><div class='del'>-		 int32_t op_ret,</div><div class='del'>-		 int32_t op_errno,</div><div class='del'>-		 dict_t *dict)</div><div class='del'>-{</div><div class='del'>-	int ret = -1;</div><div class='del'>-	ret = ha_handle_cbk (frame, cookie, op_ret, op_errno);</div><div class='del'>-	if (ret == 0)</div><div class='del'>-		STACK_UNWIND (frame, op_ret, op_errno, dict);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-ha_fxattrop (call_frame_t *frame,</div><div class='del'>-	     xlator_t *this,</div><div class='del'>-	     fd_t *fd,</div><div class='del'>-	     gf_xattrop_flags_t flags,</div><div class='del'>-	     dict_t *dict)</div><div class='del'>-{</div><div class='del'>-	ha_local_t *local = NULL;</div><div class='del'>-	int op_errno = 0;</div><div class='del'>-</div><div class='del'>-	op_errno = ha_alloc_init_fd (frame, fd);</div><div class='del'>-	if (op_errno &lt; 0) {</div><div class='del'>-		op_errno = -op_errno;</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-	local-&gt;stub = fop_fxattrop_stub (frame, ha_fxattrop, fd, flags, dict);</div><div class='del'>-        if (!local-&gt;stub) {</div><div class='del'>-                op_errno = ENOMEM;</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_ERROR, "out of memory");</div><div class='del'>-                goto err;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-	STACK_WIND_COOKIE (frame,</div><div class='del'>-			   ha_fxattrop_cbk,</div><div class='del'>-			   (void *)(long)local-&gt;active,</div><div class='del'>-			   HA_ACTIVE_CHILD(this, local),</div><div class='del'>-			   HA_ACTIVE_CHILD(this, local)-&gt;fops-&gt;fxattrop,</div><div class='del'>-			   fd,</div><div class='del'>-			   flags,</div><div class='del'>-			   dict);</div><div class='del'>-	return 0;</div><div class='del'>-err:</div><div class='del'>-        local = frame-&gt;local;</div><div class='del'>-        frame-&gt;local = NULL;</div><div class='del'>-</div><div class='del'>-	STACK_UNWIND (frame, -1, op_errno, dict);</div><div class='del'>-</div><div class='del'>-        ha_local_wipe (local);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>- int32_t</div><div class='del'>-ha_removexattr_cbk (call_frame_t *frame,</div><div class='del'>-		    void *cookie,</div><div class='del'>-		    xlator_t *this,</div><div class='del'>-		    int32_t op_ret,</div><div class='del'>-		    int32_t op_errno)</div><div class='del'>-{</div><div class='del'>-	int ret = -1;</div><div class='del'>-	ret = ha_handle_cbk (frame, cookie, op_ret, op_errno);</div><div class='del'>-	if (ret == 0) {</div><div class='del'>-		STACK_UNWIND (frame,</div><div class='del'>-			      op_ret,</div><div class='del'>-			      op_errno);</div><div class='del'>-	}</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-ha_removexattr (call_frame_t *frame,</div><div class='del'>-		xlator_t *this,</div><div class='del'>-		loc_t *loc,</div><div class='del'>-		const char *name)</div><div class='del'>-{</div><div class='del'>-	ha_local_t *local = NULL;</div><div class='del'>-	int op_errno = 0;</div><div class='del'>-</div><div class='del'>-	op_errno = ha_alloc_init_inode (frame, loc-&gt;inode);</div><div class='del'>-	if (op_errno &lt; 0) {</div><div class='del'>-		op_errno = -op_errno;</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-	</div><div class='del'>-	local-&gt;stub = fop_removexattr_stub (frame, ha_removexattr, loc, name);</div><div class='del'>-        if (!local-&gt;stub) {</div><div class='del'>-                op_errno = ENOMEM;</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_ERROR, "out of memory");</div><div class='del'>-                goto err;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-	STACK_WIND_COOKIE (frame,</div><div class='del'>-			   ha_removexattr_cbk,</div><div class='del'>-			   (void *)(long)local-&gt;active,</div><div class='del'>-			   HA_ACTIVE_CHILD(this, local),</div><div class='del'>-			   HA_ACTIVE_CHILD(this, local)-&gt;fops-&gt;removexattr,</div><div class='del'>-			   loc,</div><div class='del'>-			   name);</div><div class='del'>-	return 0;</div><div class='del'>-err:</div><div class='del'>-        local = frame-&gt;local;</div><div class='del'>-        frame-&gt;local = NULL;</div><div class='del'>-</div><div class='del'>-	STACK_UNWIND (frame, -1, op_errno);</div><div class='del'>-</div><div class='del'>-        ha_local_wipe (local);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-ha_lk_setlk_unlck_cbk (call_frame_t *frame,</div><div class='del'>-		       void *cookie,</div><div class='del'>-		       xlator_t *this,</div><div class='del'>-		       int32_t op_ret,</div><div class='del'>-		       int32_t op_errno,</div><div class='del'>-		       struct flock *lock)</div><div class='del'>-{</div><div class='del'>-	ha_local_t *local = NULL;</div><div class='del'>-	int cnt = 0;</div><div class='del'>-	call_stub_t *stub = NULL;</div><div class='del'>-</div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-</div><div class='del'>-	LOCK (&amp;frame-&gt;lock);</div><div class='del'>-	cnt = --local-&gt;call_count;</div><div class='del'>-	if (op_ret == 0)</div><div class='del'>-		local-&gt;op_ret = 0;</div><div class='del'>-	UNLOCK (&amp;frame-&gt;lock);</div><div class='del'>-</div><div class='del'>-	if (cnt == 0) {</div><div class='del'>-		stub = local-&gt;stub;</div><div class='del'>-		GF_FREE (local-&gt;state);</div><div class='del'>-		if (stub-&gt;args.lk.lock.l_type == F_UNLCK) {</div><div class='del'>-			STACK_UNWIND (frame, local-&gt;op_ret, local-&gt;op_errno, &amp;stub-&gt;args.lk.lock);</div><div class='del'>-		} else {</div><div class='del'>-			STACK_UNWIND (frame, -1, EIO, NULL);</div><div class='del'>-		}</div><div class='del'>-		call_stub_destroy (stub);</div><div class='del'>-	}</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-ha_lk_setlk_cbk (call_frame_t *frame,</div><div class='del'>-		 void *cookie,</div><div class='del'>-		 xlator_t *this,</div><div class='del'>-		 int32_t op_ret,</div><div class='del'>-		 int32_t op_errno,</div><div class='del'>-		 struct flock *lock)</div><div class='del'>-{</div><div class='del'>-	ha_local_t *local = NULL;</div><div class='del'>-	ha_private_t *pvt = NULL;</div><div class='del'>-	xlator_t **children = NULL;</div><div class='del'>-	int i = 0, cnt = 0, j = 0;</div><div class='del'>-	int child_count = 0;</div><div class='del'>-	call_frame_t *prev_frame = NULL;</div><div class='del'>-	char *state = NULL;</div><div class='del'>-</div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-	pvt = this-&gt;private;</div><div class='del'>-	children = pvt-&gt;children;</div><div class='del'>-	child_count = pvt-&gt;child_count;</div><div class='del'>-	prev_frame = cookie;</div><div class='del'>-	state = local-&gt;state;</div><div class='del'>-</div><div class='del'>-	if (op_ret == 0)</div><div class='del'>-		local-&gt;op_ret = 0;</div><div class='del'>-</div><div class='del'>-	if ((op_ret == 0) || (op_ret == -1 &amp;&amp; op_errno == ENOTCONN)) {</div><div class='del'>-		for (i = 0; i &lt; child_count; i++) {</div><div class='del'>-			if (prev_frame-&gt;this == cookie)</div><div class='del'>-				break;</div><div class='del'>-		}</div><div class='del'>-		i++;</div><div class='del'>-		for (; i &lt; child_count; i++) {</div><div class='del'>-			if (local-&gt;state[i])</div><div class='del'>-				break;</div><div class='del'>-		}</div><div class='del'>-		if (i == child_count) {</div><div class='del'>-			call_stub_t *stub = local-&gt;stub;</div><div class='del'>-			GF_FREE (local-&gt;state);</div><div class='del'>-			STACK_UNWIND (frame, 0, op_errno, &amp;stub-&gt;args.lk.lock);</div><div class='del'>-			call_stub_destroy (stub);</div><div class='del'>-			return 0;</div><div class='del'>-		}</div><div class='del'>-		STACK_WIND (frame,</div><div class='del'>-			    ha_lk_setlk_cbk,</div><div class='del'>-			    children[i],</div><div class='del'>-			    children[i]-&gt;fops-&gt;lk,</div><div class='del'>-			    local-&gt;stub-&gt;args.lk.fd,</div><div class='del'>-			    local-&gt;stub-&gt;args.lk.cmd,</div><div class='del'>-			    &amp;local-&gt;stub-&gt;args.lk.lock);</div><div class='del'>-		return 0;</div><div class='del'>-	} else {</div><div class='del'>-		for (i = 0; i &lt; child_count; i++) {</div><div class='del'>-			if (prev_frame-&gt;this == cookie)</div><div class='del'>-				break;</div><div class='del'>-		}</div><div class='del'>-		cnt = 0;</div><div class='del'>-		for (j = 0; j &lt; i; j++) {</div><div class='del'>-			if (state[i])</div><div class='del'>-				cnt++;</div><div class='del'>-		}</div><div class='del'>-		if (cnt) {</div><div class='del'>-			struct flock lock;</div><div class='del'>-			lock = local-&gt;stub-&gt;args.lk.lock;</div><div class='del'>-			for (i = 0; i &lt; child_count; i++) {</div><div class='del'>-				if (state[i]) {</div><div class='del'>-					STACK_WIND (frame,</div><div class='del'>-						    ha_lk_setlk_unlck_cbk,</div><div class='del'>-						    children[i],</div><div class='del'>-						    children[i]-&gt;fops-&gt;lk,</div><div class='del'>-						    local-&gt;stub-&gt;args.lk.fd,</div><div class='del'>-						    local-&gt;stub-&gt;args.lk.cmd,</div><div class='del'>-						    &amp;lock);</div><div class='del'>-					if (--cnt == 0)</div><div class='del'>-						break;</div><div class='del'>-				}</div><div class='del'>-			}</div><div class='del'>-			return 0;</div><div class='del'>-		} else {</div><div class='del'>-			GF_FREE (local-&gt;state);</div><div class='del'>-			call_stub_destroy (local-&gt;stub);</div><div class='del'>-			STACK_UNWIND (frame,</div><div class='del'>-				      op_ret,</div><div class='del'>-				      op_errno,</div><div class='del'>-				      lock);</div><div class='del'>-			return 0;</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-ha_lk_getlk_cbk (call_frame_t *frame,</div><div class='del'>-		 void *cookie,</div><div class='del'>-		 xlator_t *this,</div><div class='del'>-		 int32_t op_ret,</div><div class='del'>-		 int32_t op_errno,</div><div class='del'>-		 struct flock *lock)</div><div class='del'>-{</div><div class='del'>-	ha_local_t *local = NULL;</div><div class='del'>-	ha_private_t *pvt = NULL;</div><div class='del'>-	fd_t *fd = NULL;</div><div class='del'>-	int child_count = 0, i = 0;</div><div class='del'>-	xlator_t **children = NULL;</div><div class='del'>-	call_frame_t *prev_frame = NULL;</div><div class='del'>-</div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-	pvt = this-&gt;private;</div><div class='del'>-	fd = local-&gt;stub-&gt;args.lk.fd;</div><div class='del'>-	child_count = pvt-&gt;child_count;</div><div class='del'>-	children = pvt-&gt;children;</div><div class='del'>-	prev_frame = cookie;</div><div class='del'>-</div><div class='del'>-	if (op_ret == 0) {</div><div class='del'>-		GF_FREE (local-&gt;state);</div><div class='del'>-		call_stub_destroy (local-&gt;stub);</div><div class='del'>-		STACK_UNWIND (frame, 0, 0, lock);</div><div class='del'>-		return 0;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	for (i = 0; i &lt; child_count; i++) {</div><div class='del'>-		if (prev_frame-&gt;this == children[i])</div><div class='del'>-			break;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	for (; i &lt; child_count; i++) {</div><div class='del'>-		if (local-&gt;state[i])</div><div class='del'>-			break;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	if (i == child_count) {</div><div class='del'>-		GF_FREE (local-&gt;state);</div><div class='del'>-		call_stub_destroy (local-&gt;stub);</div><div class='del'>-		STACK_UNWIND (frame, op_ret, op_errno, lock);</div><div class='del'>-		return 0;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	STACK_WIND (frame,</div><div class='del'>-		    ha_lk_getlk_cbk,</div><div class='del'>-		    children[i],</div><div class='del'>-		    children[i]-&gt;fops-&gt;lk,</div><div class='del'>-		    fd,</div><div class='del'>-		    local-&gt;stub-&gt;args.lk.cmd,</div><div class='del'>-		    &amp;local-&gt;stub-&gt;args.lk.lock);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-ha_lk (call_frame_t *frame,</div><div class='del'>-       xlator_t *this,</div><div class='del'>-       fd_t *fd,</div><div class='del'>-       int32_t cmd,</div><div class='del'>-       struct flock *lock)</div><div class='del'>-{</div><div class='del'>-	ha_local_t *local = NULL;</div><div class='del'>-	ha_private_t *pvt = NULL;</div><div class='del'>-	hafd_t *hafdp = NULL;</div><div class='del'>-	char *state = NULL;</div><div class='del'>-	int child_count = 0, i = 0, cnt = 0, ret = 0;</div><div class='del'>-	xlator_t **children = NULL;</div><div class='del'>-	uint64_t tmp_hafdp = 0;</div><div class='del'>-        int32_t op_errno = EINVAL;</div><div class='del'>-</div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-	pvt = this-&gt;private;</div><div class='del'>-	child_count = pvt-&gt;child_count;</div><div class='del'>-	children = pvt-&gt;children;</div><div class='del'>-	ret = fd_ctx_get (fd, this, &amp;tmp_hafdp);</div><div class='del'>-	if (ret &lt; 0)</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_ERROR, "fd_ctx_get failed");</div><div class='del'>-</div><div class='del'>-	if (local == NULL) {</div><div class='del'>-                local = frame-&gt;local = GF_CALLOC (1, sizeof (*local),</div><div class='del'>-                                                  gf_ha_mt_ha_local_t);</div><div class='del'>-                if (!local) {</div><div class='del'>-                        op_errno = ENOMEM;</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_ERROR, "out of memory");</div><div class='del'>-                        goto err;</div><div class='del'>-                }</div><div class='del'>-                        </div><div class='del'>-		local-&gt;active = -1;</div><div class='del'>-		local-&gt;op_ret = -1;</div><div class='del'>-		local-&gt;op_errno = ENOTCONN;</div><div class='del'>-	}</div><div class='del'>-	hafdp = (hafd_t *)(long)tmp_hafdp;</div><div class='del'>-</div><div class='del'>-	if (local-&gt;active == -1) {</div><div class='del'>-                op_errno = ENOTCONN;</div><div class='del'>-                goto err;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	local-&gt;stub = fop_lk_stub (frame, ha_lk, fd, cmd, lock);</div><div class='del'>-        if (!local-&gt;stub) {</div><div class='del'>-                op_errno = ENOMEM;</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_ERROR, "out of memory");</div><div class='del'>-                goto err;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-	local-&gt;state = GF_CALLOC (1, child_count, gf_ha_mt_char);</div><div class='del'>-        if (!local-&gt;state) {</div><div class='del'>-                op_errno = ENOMEM;</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_ERROR, "out of memory");</div><div class='del'>-                goto err;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-	state = hafdp-&gt;fdstate;</div><div class='del'>-	LOCK (&amp;hafdp-&gt;lock);</div><div class='del'>-	memcpy (local-&gt;state, state, child_count);</div><div class='del'>-	UNLOCK (&amp;hafdp-&gt;lock);</div><div class='del'>-	if (cmd == F_GETLK) {</div><div class='del'>-		for (i = 0; i &lt; child_count; i++) {</div><div class='del'>-			if (local-&gt;state[i])</div><div class='del'>-				break;</div><div class='del'>-		}</div><div class='del'>-		STACK_WIND (frame,</div><div class='del'>-			    ha_lk_getlk_cbk,</div><div class='del'>-			    children[i],</div><div class='del'>-			    children[i]-&gt;fops-&gt;lk,</div><div class='del'>-			    fd,</div><div class='del'>-			    cmd,</div><div class='del'>-			    lock);</div><div class='del'>-	} else if (cmd == F_SETLK &amp;&amp; lock-&gt;l_type == F_UNLCK) {</div><div class='del'>-		for (i = 0; i &lt; child_count; i++) {</div><div class='del'>-			if (local-&gt;state[i])</div><div class='del'>-				local-&gt;call_count++;</div><div class='del'>-		}</div><div class='del'>-		cnt = local-&gt;call_count;</div><div class='del'>-		for (i = 0; i &lt; child_count; i++) {</div><div class='del'>-			if (local-&gt;state[i]) {</div><div class='del'>-				STACK_WIND (frame,</div><div class='del'>-					    ha_lk_setlk_unlck_cbk,</div><div class='del'>-					    children[i],</div><div class='del'>-					    children[i]-&gt;fops-&gt;lk,</div><div class='del'>-					    fd, cmd, lock);</div><div class='del'>-				if (--cnt == 0)</div><div class='del'>-					break;</div><div class='del'>-			}</div><div class='del'>-		}</div><div class='del'>-	} else {</div><div class='del'>-		for (i = 0; i &lt; child_count; i++) {</div><div class='del'>-			if (local-&gt;state[i])</div><div class='del'>-				break;</div><div class='del'>-		}</div><div class='del'>-		STACK_WIND (frame,</div><div class='del'>-			    ha_lk_setlk_cbk,</div><div class='del'>-			    children[i],</div><div class='del'>-			    children[i]-&gt;fops-&gt;lk,</div><div class='del'>-			    fd,</div><div class='del'>-			    cmd,</div><div class='del'>-			    lock);</div><div class='del'>-	}</div><div class='del'>-	return 0;</div><div class='del'>-err:</div><div class='del'>-        local = frame-&gt;local;</div><div class='del'>-        frame-&gt;local = NULL;</div><div class='del'>-</div><div class='del'>-        STACK_UNWIND (frame, -1, op_errno, NULL);</div><div class='del'>-</div><div class='del'>-        ha_local_wipe (local);</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>- int32_t</div><div class='del'>-ha_inode_entry_lk_cbk (call_frame_t *frame,</div><div class='del'>-		       void *cookie,</div><div class='del'>-		       xlator_t *this,</div><div class='del'>-		       int32_t op_ret,</div><div class='del'>-		       int32_t op_errno)</div><div class='del'>-{</div><div class='del'>-	int ret = -1;</div><div class='del'>-</div><div class='del'>-	ret = ha_handle_cbk (frame, cookie, op_ret, op_errno);</div><div class='del'>-	if (ret == 0) {</div><div class='del'>-		STACK_UNWIND (frame,</div><div class='del'>-			      op_ret,</div><div class='del'>-			      op_errno);</div><div class='del'>-	}</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-ha_inodelk (call_frame_t *frame,</div><div class='del'>-	    xlator_t *this,</div><div class='del'>-            const char *volume,</div><div class='del'>-	    loc_t *loc,</div><div class='del'>-	    int32_t cmd,</div><div class='del'>-	    struct flock *lock)</div><div class='del'>-{</div><div class='del'>-	ha_local_t *local = NULL;</div><div class='del'>-	int op_errno = 0;</div><div class='del'>-</div><div class='del'>-	op_errno = ha_alloc_init_inode (frame, loc-&gt;inode);</div><div class='del'>-	if (op_errno &lt; 0) {</div><div class='del'>-		op_errno = -op_errno;</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-	local-&gt;stub = fop_inodelk_stub (frame, ha_inodelk, volume,</div><div class='del'>-                                        loc, cmd, lock);</div><div class='del'>-	STACK_WIND_COOKIE (frame,</div><div class='del'>-			   ha_inode_entry_lk_cbk,</div><div class='del'>-			   (void *)(long)local-&gt;active,</div><div class='del'>-			   HA_ACTIVE_CHILD(this, local),</div><div class='del'>-			   HA_ACTIVE_CHILD(this, local)-&gt;fops-&gt;inodelk,</div><div class='del'>-			   volume,</div><div class='del'>-                           loc,</div><div class='del'>-			   cmd,</div><div class='del'>-			   lock);</div><div class='del'>-	return 0;</div><div class='del'>-err:</div><div class='del'>-	STACK_UNWIND (frame, -1, op_errno);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-ha_entrylk (call_frame_t *frame,</div><div class='del'>-	    xlator_t *this,</div><div class='del'>-            const char *volume,</div><div class='del'>-	    loc_t *loc,</div><div class='del'>-	    const char *basename,</div><div class='del'>-	    entrylk_cmd cmd,</div><div class='del'>-	    entrylk_type type)</div><div class='del'>-{</div><div class='del'>-	ha_local_t *local = NULL;</div><div class='del'>-	int op_errno = 0;</div><div class='del'>-</div><div class='del'>-	op_errno = ha_alloc_init_inode (frame, loc-&gt;inode);</div><div class='del'>-	if (op_errno &lt; 0) {</div><div class='del'>-		op_errno = -op_errno;</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-	local-&gt;stub = fop_entrylk_stub (frame, ha_entrylk, volume,</div><div class='del'>-                                        loc, basename, cmd, type);</div><div class='del'>-	STACK_WIND_COOKIE (frame,</div><div class='del'>-			   ha_inode_entry_lk_cbk,</div><div class='del'>-			   (void *)(long)local-&gt;active,</div><div class='del'>-			   HA_ACTIVE_CHILD(this, local),</div><div class='del'>-			   HA_ACTIVE_CHILD(this, local)-&gt;fops-&gt;entrylk,</div><div class='del'>-			   volume, loc, basename, cmd, type);</div><div class='del'>-	return 0;</div><div class='del'>-err:</div><div class='del'>-	STACK_UNWIND (frame, -1, op_errno);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>- int32_t</div><div class='del'>-ha_checksum_cbk (call_frame_t *frame,</div><div class='del'>-		 void *cookie,</div><div class='del'>-		 xlator_t *this,</div><div class='del'>-		 int32_t op_ret,</div><div class='del'>-		 int32_t op_errno,</div><div class='del'>-		 uint8_t *file_checksum,</div><div class='del'>-		 uint8_t *dir_checksum)</div><div class='del'>-{</div><div class='del'>-	int ret = -1;</div><div class='del'>-</div><div class='del'>-	ret = ha_handle_cbk (frame, cookie, op_ret, op_errno);</div><div class='del'>-	if (ret == 0) {</div><div class='del'>-		STACK_UNWIND (frame,</div><div class='del'>-			      op_ret,</div><div class='del'>-			      op_errno,</div><div class='del'>-			      file_checksum,</div><div class='del'>-			      dir_checksum);</div><div class='del'>-	}</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-ha_checksum (call_frame_t *frame,</div><div class='del'>-	     xlator_t *this,</div><div class='del'>-	     loc_t *loc,</div><div class='del'>-	     int32_t flag)</div><div class='del'>-{</div><div class='del'>-	int op_errno = 0;</div><div class='del'>-	ha_local_t *local = NULL;</div><div class='del'>-</div><div class='del'>-	op_errno = ha_alloc_init_inode (frame, loc-&gt;inode);</div><div class='del'>-	if (op_errno &lt; 0) {</div><div class='del'>-		op_errno = -op_errno;</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-	local-&gt;stub = fop_checksum_stub (frame, ha_checksum, loc, flag);</div><div class='del'>-        if (!local-&gt;stub) {</div><div class='del'>-                op_errno = ENOMEM;</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_ERROR, "out of memory");</div><div class='del'>-                goto err;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-	STACK_WIND_COOKIE (frame,</div><div class='del'>-			   ha_checksum_cbk,</div><div class='del'>-			   (void *)(long)local-&gt;active,</div><div class='del'>-			   HA_ACTIVE_CHILD(this, local),</div><div class='del'>-			   HA_ACTIVE_CHILD(this, local)-&gt;fops-&gt;checksum,</div><div class='del'>-			   loc,</div><div class='del'>-			   flag);</div><div class='del'>-	return 0;</div><div class='del'>-err:</div><div class='del'>-        local = frame-&gt;local;</div><div class='del'>-        frame-&gt;local = NULL;</div><div class='del'>-</div><div class='del'>-	STACK_UNWIND (frame, -1, op_errno, NULL, NULL);</div><div class='del'>-</div><div class='del'>-        ha_local_wipe (local);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-ha_common_readdir_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-                       int32_t op_ret, int32_t op_errno, gf_dirent_t *entries)</div><div class='del'>-{</div><div class='del'>-	int ret = 0;</div><div class='del'>-</div><div class='del'>-	ret = ha_handle_cbk (frame, cookie, op_ret, op_errno);</div><div class='del'>-	if (ret == 0)</div><div class='del'>-		STACK_UNWIND (frame, op_ret, op_errno, entries);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-ha_readdir (call_frame_t *frame, xlator_t *this, fd_t *fd, size_t size,</div><div class='del'>-            off_t off);</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-ha_readdirp (call_frame_t *frame, xlator_t *this, fd_t *fd, size_t size,</div><div class='del'>-             off_t off);</div><div class='del'>-int32_t</div><div class='del'>-ha_do_readdir (call_frame_t *frame, xlator_t *this, fd_t *fd, size_t size,</div><div class='del'>-               off_t off, int whichop)</div><div class='del'>-{</div><div class='del'>-	ha_local_t *local = NULL;</div><div class='del'>-	int op_errno = 0;</div><div class='del'>-</div><div class='del'>-	op_errno = ha_alloc_init_fd (frame, fd);</div><div class='del'>-	if (op_errno &lt; 0) {</div><div class='del'>-		op_errno = -op_errno;</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-        if (whichop == GF_FOP_READDIR)</div><div class='del'>-                local-&gt;stub = fop_readdir_stub (frame, ha_readdir, fd, size,</div><div class='del'>-                                                off);</div><div class='del'>-        else</div><div class='del'>-                local-&gt;stub = fop_readdirp_stub (frame, ha_readdirp, fd, size,</div><div class='del'>-                                                 off);</div><div class='del'>-        if (!local-&gt;stub) {</div><div class='del'>-                op_errno = ENOMEM; </div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_ERROR, "out of memory");</div><div class='del'>-                goto err;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (whichop == GF_FOP_READDIR)</div><div class='del'>-                STACK_WIND_COOKIE (frame, ha_common_readdir_cbk,</div><div class='del'>-                                   (void *)(long)local-&gt;active,</div><div class='del'>-                                   HA_ACTIVE_CHILD(this, local),</div><div class='del'>-                                   HA_ACTIVE_CHILD(this, local)-&gt;fops-&gt;readdir,</div><div class='del'>-                                   fd, size, off);</div><div class='del'>-        else</div><div class='del'>-                STACK_WIND_COOKIE (frame, ha_common_readdir_cbk,</div><div class='del'>-                                   (void *)(long)local-&gt;active,</div><div class='del'>-                                   HA_ACTIVE_CHILD(this, local),</div><div class='del'>-                                   HA_ACTIVE_CHILD(this, local)-&gt;fops-&gt;readdirp,</div><div class='del'>-                                   fd, size, off);</div><div class='del'>-	return 0;</div><div class='del'>-err:</div><div class='del'>-        local = frame-&gt;local;</div><div class='del'>-        frame-&gt;local = NULL;</div><div class='del'>-</div><div class='del'>-	STACK_UNWIND (frame, -1, ENOTCONN, NULL);</div><div class='del'>-</div><div class='del'>-        ha_local_wipe (local);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-ha_readdir (call_frame_t *frame, xlator_t *this, fd_t *fd, size_t size,</div><div class='del'>-            off_t off)</div><div class='del'>-{</div><div class='del'>-        ha_do_readdir (frame, this, fd, size, off, GF_FOP_READDIR);</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-ha_readdirp (call_frame_t *frame, xlator_t *this, fd_t *fd, size_t size,</div><div class='del'>-             off_t off)</div><div class='del'>-{</div><div class='del'>-        ha_do_readdir (frame, this, fd, size, off, GF_FOP_READDIRP);</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-/* Management operations */</div><div class='del'>-</div><div class='del'>- int32_t</div><div class='del'>-ha_stats_cbk (call_frame_t *frame,</div><div class='del'>-	      void *cookie,</div><div class='del'>-	      xlator_t *this,</div><div class='del'>-	      int32_t op_ret,</div><div class='del'>-	      int32_t op_errno,</div><div class='del'>-	      struct xlator_stats *stats)</div><div class='del'>-{</div><div class='del'>-	ha_local_t *local = NULL;</div><div class='del'>-	ha_private_t *pvt = NULL;</div><div class='del'>-	call_frame_t *prev_frame = NULL;</div><div class='del'>-	xlator_t **children = NULL;</div><div class='del'>-	int i = 0;</div><div class='del'>-</div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-	pvt = this-&gt;private;</div><div class='del'>-	prev_frame = cookie;</div><div class='del'>-	children = pvt-&gt;children;</div><div class='del'>-</div><div class='del'>-	if (op_ret == -1 &amp;&amp; op_errno == ENOTCONN) {</div><div class='del'>-		for (i = 0; i &lt; pvt-&gt;child_count; i++) {</div><div class='del'>-			if (prev_frame-&gt;this == children[i])</div><div class='del'>-				break;</div><div class='del'>-		}</div><div class='del'>-		i++;</div><div class='del'>-		for (; i &lt; pvt-&gt;child_count; i++) {</div><div class='del'>-			if (pvt-&gt;state[i])</div><div class='del'>-				break;</div><div class='del'>-		}</div><div class='del'>-</div><div class='del'>-		if (i == pvt-&gt;child_count) {</div><div class='del'>-			STACK_UNWIND (frame, -1, ENOTCONN, NULL);</div><div class='del'>-			return 0;</div><div class='del'>-		}</div><div class='del'>-		STACK_WIND (frame,</div><div class='del'>-			    ha_stats_cbk,</div><div class='del'>-			    children[i],</div><div class='del'>-			    children[i]-&gt;mops-&gt;stats,</div><div class='del'>-			    local-&gt;flags);</div><div class='del'>-		return 0;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	STACK_UNWIND (frame,</div><div class='del'>-		      op_ret,</div><div class='del'>-		      op_errno,</div><div class='del'>-		      stats);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-ha_stats (call_frame_t *frame,</div><div class='del'>-	  xlator_t *this,</div><div class='del'>-	  int32_t flags)</div><div class='del'>-{</div><div class='del'>-	ha_local_t *local = NULL;</div><div class='del'>-	ha_private_t *pvt = NULL;</div><div class='del'>-	xlator_t **children = NULL;</div><div class='del'>-	int i = 0;</div><div class='del'>-        int32_t op_errno = EINVAL;</div><div class='del'>-</div><div class='del'>-	local = frame-&gt;local = GF_CALLOC (1, sizeof (*local),</div><div class='del'>-                                          gf_ha_mt_ha_local_t);</div><div class='del'>-        if (!local) {</div><div class='del'>-                op_errno = ENOMEM;</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_ERROR, "out of memory");</div><div class='del'>-                goto err;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-	pvt = this-&gt;private;</div><div class='del'>-	children = pvt-&gt;children;</div><div class='del'>-	for (i = 0; i &lt; pvt-&gt;child_count; i++) {</div><div class='del'>-		if (pvt-&gt;state[i])</div><div class='del'>-			break;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	if (i == pvt-&gt;child_count) {</div><div class='del'>-                op_errno = ENOTCONN;</div><div class='del'>-                goto err;</div><div class='del'>-	}</div><div class='del'>-	local-&gt;flags = flags;</div><div class='del'>-</div><div class='del'>-	STACK_WIND (frame,</div><div class='del'>-		    ha_stats_cbk,</div><div class='del'>-		    children[i],</div><div class='del'>-		    children[i]-&gt;mops-&gt;stats,</div><div class='del'>-		    flags);</div><div class='del'>-	return 0;</div><div class='del'>-</div><div class='del'>-err:</div><div class='del'>-        local = frame-&gt;local;</div><div class='del'>-        frame-&gt;local = NULL;</div><div class='del'>-</div><div class='del'>-        STACK_UNWIND (frame, -1, ENOTCONN, NULL);</div><div class='del'>-</div><div class='del'>-        ha_local_wipe (local);</div><div class='del'>-        return 0;</div><div class='del'>-</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-ha_getspec_cbk (call_frame_t *frame,</div><div class='del'>-		void *cookie,</div><div class='del'>-		xlator_t *this,</div><div class='del'>-		int32_t op_ret,</div><div class='del'>-		int32_t op_errno,</div><div class='del'>-		char *spec_data)</div><div class='del'>-{</div><div class='del'>-	ha_local_t *local = NULL;</div><div class='del'>-	ha_private_t *pvt = NULL;</div><div class='del'>-	call_frame_t *prev_frame = NULL;</div><div class='del'>-	xlator_t **children = NULL;</div><div class='del'>-	int i = 0;</div><div class='del'>-</div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-	pvt = this-&gt;private;</div><div class='del'>-	prev_frame = cookie;</div><div class='del'>-	children = pvt-&gt;children;</div><div class='del'>-</div><div class='del'>-	if (op_ret == -1 &amp;&amp; op_errno == ENOTCONN) {</div><div class='del'>-		for (i = 0; i &lt; pvt-&gt;child_count; i++) {</div><div class='del'>-			if (prev_frame-&gt;this == children[i])</div><div class='del'>-				break;</div><div class='del'>-		}</div><div class='del'>-		i++;</div><div class='del'>-		for (; i &lt; pvt-&gt;child_count; i++) {</div><div class='del'>-			if (pvt-&gt;state[i])</div><div class='del'>-				break;</div><div class='del'>-		}</div><div class='del'>-</div><div class='del'>-		if (i == pvt-&gt;child_count) {</div><div class='del'>-			STACK_UNWIND (frame, -1, ENOTCONN, NULL);</div><div class='del'>-			return 0;</div><div class='del'>-		}</div><div class='del'>-		STACK_WIND (frame,</div><div class='del'>-			    ha_getspec_cbk,</div><div class='del'>-			    children[i],</div><div class='del'>-			    children[i]-&gt;mops-&gt;getspec,</div><div class='del'>-			    local-&gt;pattern,</div><div class='del'>-			    local-&gt;flags);</div><div class='del'>-		return 0;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	STACK_UNWIND (frame,</div><div class='del'>-		      op_ret,</div><div class='del'>-		      op_errno,</div><div class='del'>-		      spec_data);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-ha_getspec (call_frame_t *frame,</div><div class='del'>-	    xlator_t *this,</div><div class='del'>-	    const char *key,</div><div class='del'>-	    int32_t flags)</div><div class='del'>-{</div><div class='del'>-	ha_local_t *local = NULL;</div><div class='del'>-	ha_private_t *pvt = NULL;</div><div class='del'>-	xlator_t **children = NULL;</div><div class='del'>-	int i = 0;</div><div class='del'>-        int32_t op_errno = EINVAL;</div><div class='del'>-</div><div class='del'>-	local = frame-&gt;local = GF_CALLOC (1, sizeof (*local), </div><div class='del'>-                                          gf_ha_mt_ha_local_t);</div><div class='del'>-        if (!local) {</div><div class='del'>-                op_errno = ENOMEM;</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_ERROR, "out of memory");</div><div class='del'>-                goto err;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-	pvt = this-&gt;private;</div><div class='del'>-	children = pvt-&gt;children;</div><div class='del'>-</div><div class='del'>-	for (i = 0; i &lt; pvt-&gt;child_count; i++) {</div><div class='del'>-		if (pvt-&gt;state[i])</div><div class='del'>-			break;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	if (i == pvt-&gt;child_count) {</div><div class='del'>-                op_errno = ENOTCONN;</div><div class='del'>-                goto err;</div><div class='del'>-	}</div><div class='del'>-	local-&gt;flags = flags;</div><div class='del'>-	local-&gt;pattern = (char *)key;</div><div class='del'>-</div><div class='del'>-	STACK_WIND (frame,</div><div class='del'>-		    ha_getspec_cbk,</div><div class='del'>-		    children[i],</div><div class='del'>-		    children[i]-&gt;mops-&gt;getspec,</div><div class='del'>-		    key, flags);</div><div class='del'>-	return 0;</div><div class='del'>-err:</div><div class='del'>-        local = frame-&gt;local;</div><div class='del'>-        frame-&gt;local = NULL;</div><div class='del'>-</div><div class='del'>-        STACK_UNWIND (frame, -1, ENOTCONN, NULL);</div><div class='del'>-</div><div class='del'>-        ha_local_wipe (local);</div><div class='del'>-        return 0;</div><div class='del'>-</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-ha_closedir (xlator_t *this,</div><div class='del'>-	     fd_t *fd)</div><div class='del'>-{</div><div class='del'>-	hafd_t *hafdp = NULL;</div><div class='del'>-	int op_errno = 0;</div><div class='del'>-	uint64_t tmp_hafdp = 0;</div><div class='del'>-</div><div class='del'>-	op_errno = fd_ctx_del (fd, this, &amp;tmp_hafdp);</div><div class='del'>-	if (op_errno != 0) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_ERROR, "fd_ctx_del() error");</div><div class='del'>-		return 0;</div><div class='del'>-	}</div><div class='del'>-	hafdp = (hafd_t *)(long)tmp_hafdp;</div><div class='del'>-</div><div class='del'>-	GF_FREE (hafdp-&gt;fdstate);</div><div class='del'>-	GF_FREE (hafdp-&gt;path);</div><div class='del'>-	LOCK_DESTROY (&amp;hafdp-&gt;lock);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-ha_close (xlator_t *this,</div><div class='del'>-	  fd_t *fd)</div><div class='del'>-{</div><div class='del'>-	hafd_t *hafdp = NULL;</div><div class='del'>-	int op_errno = 0;</div><div class='del'>-	uint64_t tmp_hafdp = 0;</div><div class='del'>-</div><div class='del'>-	op_errno = fd_ctx_del (fd, this, &amp;tmp_hafdp);</div><div class='del'>-	if (op_errno != 0) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_ERROR, "fd_ctx_del() error");</div><div class='del'>-		return 0;</div><div class='del'>-	}</div><div class='del'>-	hafdp = (hafd_t *)(long)tmp_hafdp;</div><div class='del'>-</div><div class='del'>-	GF_FREE (hafdp-&gt;fdstate);</div><div class='del'>-	GF_FREE (hafdp-&gt;path);</div><div class='del'>-	LOCK_DESTROY (&amp;hafdp-&gt;lock);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-/* notify */</div><div class='del'>-int32_t</div><div class='del'>-notify (xlator_t *this,</div><div class='del'>-	int32_t event,</div><div class='del'>-	void *data,</div><div class='del'>-	...)</div><div class='del'>-{</div><div class='del'>-	ha_private_t *pvt = NULL;</div><div class='del'>-	int32_t i = 0, upcnt = 0;</div><div class='del'>-</div><div class='del'>-	pvt = this-&gt;private;</div><div class='del'>-	if (pvt == NULL) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_DEBUG, "got notify before init()");</div><div class='del'>-		return 0;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	switch (event)</div><div class='del'>-	{</div><div class='del'>-	case GF_EVENT_CHILD_DOWN:</div><div class='del'>-	{</div><div class='del'>-		for (i = 0; i &lt; pvt-&gt;child_count; i++) {</div><div class='del'>-			if (data == pvt-&gt;children[i])</div><div class='del'>-				break;</div><div class='del'>-		}</div><div class='del'>-	        gf_log (this-&gt;name, GF_LOG_DEBUG, "GF_EVENT_CHILD_DOWN from %s", pvt-&gt;children[i]-&gt;name);</div><div class='del'>-		pvt-&gt;state[i] = 0;</div><div class='del'>-		for (i = 0; i &lt; pvt-&gt;child_count; i++) {</div><div class='del'>-			if (pvt-&gt;state[i])</div><div class='del'>-				break;</div><div class='del'>-		}</div><div class='del'>-		if (i == pvt-&gt;child_count) {</div><div class='del'>-			default_notify (this, event, data);</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='del'>-	break;</div><div class='del'>-	case GF_EVENT_CHILD_UP:</div><div class='del'>-	{</div><div class='del'>-		for (i = 0; i &lt; pvt-&gt;child_count; i++) {</div><div class='del'>-			if (data == pvt-&gt;children[i])</div><div class='del'>-				break;</div><div class='del'>-		}</div><div class='del'>-</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_DEBUG, "GF_EVENT_CHILD_UP from %s", pvt-&gt;children[i]-&gt;name);</div><div class='del'>-</div><div class='del'>-		pvt-&gt;state[i] = 1;</div><div class='del'>-</div><div class='del'>-		for (i = 0; i &lt; pvt-&gt;child_count; i++) {</div><div class='del'>-			if (pvt-&gt;state[i])</div><div class='del'>-				upcnt++;</div><div class='del'>-		}</div><div class='del'>-</div><div class='del'>-		if (upcnt == 1) {</div><div class='del'>-			default_notify (this, event, data);</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='del'>-	break;</div><div class='del'>-</div><div class='del'>-	default:</div><div class='del'>-	{</div><div class='del'>-		default_notify (this, event, data);</div><div class='del'>-	}</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-mem_acct_init (xlator_t *this)</div><div class='del'>-{</div><div class='del'>-        int     ret = -1;</div><div class='del'>-</div><div class='del'>-        if (!this)</div><div class='del'>-                return ret;</div><div class='del'>-</div><div class='del'>-        ret = xlator_mem_acct_init (this, gf_ha_mt_end + 1);</div><div class='del'>-        </div><div class='del'>-        if (ret != 0) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_ERROR, "Memory accounting init"</div><div class='del'>-                                "failed");</div><div class='del'>-                return ret;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-init (xlator_t *this)</div><div class='del'>-{</div><div class='del'>-	ha_private_t *pvt = NULL;</div><div class='del'>-	xlator_list_t *trav = NULL;</div><div class='del'>-	int count = 0, ret = 0;</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-	if (!this-&gt;children) {</div><div class='del'>-		gf_log (this-&gt;name,GF_LOG_ERROR, </div><div class='del'>-			"FATAL: ha should have one or more child defined");</div><div class='del'>-		return -1;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	if (!this-&gt;parents) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_WARNING,</div><div class='del'>-			"dangling volume. check volfile ");</div><div class='del'>-	}</div><div class='del'>-  </div><div class='del'>-	trav = this-&gt;children;</div><div class='del'>-	pvt = GF_CALLOC (1, sizeof (ha_private_t), gf_ha_mt_ha_private_t);</div><div class='del'>-</div><div class='del'>-	ret = dict_get_int32 (this-&gt;options, "preferred-subvolume", </div><div class='del'>-			      &amp;pvt-&gt;pref_subvol);</div><div class='del'>-	if (ret &lt; 0) {</div><div class='del'>-		pvt-&gt;pref_subvol = -1;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	trav = this-&gt;children;</div><div class='del'>-	while (trav) {</div><div class='del'>-		count++;</div><div class='del'>-		trav = trav-&gt;next;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	pvt-&gt;child_count = count;</div><div class='del'>-	pvt-&gt;children = GF_CALLOC (count, sizeof (xlator_t*), </div><div class='del'>-                                   gf_ha_mt_xlator_t);</div><div class='del'>-</div><div class='del'>-	trav = this-&gt;children;</div><div class='del'>-	count = 0;</div><div class='del'>-	while (trav) {</div><div class='del'>-		pvt-&gt;children[count] = trav-&gt;xlator;</div><div class='del'>-		count++;</div><div class='del'>-		trav = trav-&gt;next;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	pvt-&gt;state = GF_CALLOC (1, count, gf_ha_mt_char);</div><div class='del'>-	this-&gt;private = pvt;</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-void</div><div class='del'>-fini (xlator_t *this)</div><div class='del'>-{</div><div class='del'>-	ha_private_t *priv = NULL;</div><div class='del'>-	priv = this-&gt;private;</div><div class='del'>-	GF_FREE (priv);</div><div class='del'>-	return;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-struct xlator_fops fops = {</div><div class='del'>-	.lookup      = ha_lookup,</div><div class='del'>-	.stat        = ha_stat,</div><div class='del'>-	.readlink    = ha_readlink,</div><div class='del'>-	.mknod       = ha_mknod,</div><div class='del'>-	.mkdir       = ha_mkdir,</div><div class='del'>-	.unlink      = ha_unlink,</div><div class='del'>-	.rmdir       = ha_rmdir,</div><div class='del'>-	.symlink     = ha_symlink,</div><div class='del'>-	.rename      = ha_rename,</div><div class='del'>-	.link        = ha_link,</div><div class='del'>-	.truncate    = ha_truncate,</div><div class='del'>-	.create      = ha_create,</div><div class='del'>-	.open        = ha_open,</div><div class='del'>-	.readv       = ha_readv,</div><div class='del'>-	.writev      = ha_writev,</div><div class='del'>-	.statfs      = ha_statfs,</div><div class='del'>-	.flush       = ha_flush,</div><div class='del'>-	.fsync       = ha_fsync,</div><div class='del'>-	.setxattr    = ha_setxattr,</div><div class='del'>-	.getxattr    = ha_getxattr,</div><div class='del'>-	.removexattr = ha_removexattr,</div><div class='del'>-	.opendir     = ha_opendir,</div><div class='del'>-	.readdir     = ha_readdir,</div><div class='del'>-	.readdirp    = ha_readdirp,</div><div class='del'>-	.getdents    = ha_getdents,</div><div class='del'>-	.fsyncdir    = ha_fsyncdir,</div><div class='del'>-	.access      = ha_access,</div><div class='del'>-	.ftruncate   = ha_ftruncate,</div><div class='del'>-	.fstat       = ha_fstat,</div><div class='del'>-	.lk          = ha_lk,</div><div class='del'>-	.setdents    = ha_setdents,</div><div class='del'>-	.lookup_cbk  = ha_lookup_cbk,</div><div class='del'>-	.checksum    = ha_checksum,</div><div class='del'>-	.xattrop     = ha_xattrop,</div><div class='del'>-	.fxattrop    = ha_fxattrop,</div><div class='del'>-        .setattr     = ha_setattr,</div><div class='del'>-        .fsetattr    = ha_fsetattr,</div><div class='del'>-};</div><div class='del'>-</div><div class='del'>-struct xlator_cbks cbks = {</div><div class='del'>-	.release    = ha_close,</div><div class='del'>-	.releasedir = ha_closedir,</div><div class='del'>-	.forget     = ha_forget,</div><div class='del'>-};</div><div class='head'>diff --git a/xlators/cluster/ha/src/ha.h b/xlators/cluster/ha/src/ha.h<br/>deleted file mode 100644<br/>index 5e06b7e0201..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/xlators/cluster/ha/src/ha.h?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/cluster/ha/src/ha.h</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,63 +0,0 @@</div><div class='del'>-/*</div><div class='del'>-  Copyright (c) 2008-2009 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='del'>-  This file is part of GlusterFS.</div><div class='del'>-</div><div class='del'>-  GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-  it under the terms of the GNU General Public License as published</div><div class='del'>-  by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-  or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-  GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-  WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-  General Public License for more details.</div><div class='del'>-</div><div class='del'>-  You should have received a copy of the GNU General Public License</div><div class='del'>-  along with this program.  If not, see</div><div class='del'>-  &lt;http://www.gnu.org/licenses/&gt;.</div><div class='del'>-*/</div><div class='del'>-</div><div class='del'>-#ifndef __HA_H_</div><div class='del'>-#define __HA_H_</div><div class='del'>-</div><div class='del'>-#include "ha-mem-types.h"</div><div class='del'>-</div><div class='del'>-typedef struct {</div><div class='del'>-	call_stub_t *stub;</div><div class='del'>-	int32_t op_ret, op_errno;</div><div class='del'>-	int32_t active, tries, revalidate, revalidate_error;</div><div class='del'>-	int32_t call_count;</div><div class='del'>-	char *state, *pattern;</div><div class='del'>-	dict_t *dict;</div><div class='del'>-	loc_t loc;</div><div class='del'>-	struct iatt buf;</div><div class='del'>-        struct iatt postparent;</div><div class='del'>-        struct iatt preparent;</div><div class='del'>-	fd_t *fd;</div><div class='del'>-	inode_t *inode;</div><div class='del'>-	int32_t flags;</div><div class='del'>-	int32_t first_success;</div><div class='del'>-} ha_local_t;</div><div class='del'>-</div><div class='del'>-typedef struct {</div><div class='del'>-	char *state;</div><div class='del'>-	xlator_t **children;</div><div class='del'>-	int child_count, pref_subvol;</div><div class='del'>-} ha_private_t;</div><div class='del'>-</div><div class='del'>-typedef struct {</div><div class='del'>-	char *fdstate;</div><div class='del'>-	char *path;</div><div class='del'>-	gf_lock_t lock;</div><div class='del'>-	int active;</div><div class='del'>-} hafd_t;</div><div class='del'>-</div><div class='del'>-#define HA_ACTIVE_CHILD(this, local) (((ha_private_t *)this-&gt;private)-&gt;children[local-&gt;active])</div><div class='del'>-</div><div class='del'>-extern int ha_alloc_init_fd (call_frame_t *frame, fd_t *fd);</div><div class='del'>-</div><div class='del'>-extern int ha_handle_cbk (call_frame_t *frame, void *cookie, int op_ret, int op_errno) ;</div><div class='del'>-</div><div class='del'>-extern int ha_alloc_init_inode (call_frame_t *frame, inode_t *inode);</div><div class='del'>-</div><div class='del'>-#endif</div><div class='head'>diff --git a/xlators/cluster/map/Makefile.am b/xlators/cluster/map/Makefile.am<br/>deleted file mode 100644<br/>index d471a3f9243..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/xlators/cluster/map/Makefile.am?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/cluster/map/Makefile.am</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,3 +0,0 @@</div><div class='del'>-SUBDIRS = src</div><div class='del'>-</div><div class='del'>-CLEANFILES = </div><div class='head'>diff --git a/xlators/cluster/map/src/Makefile.am b/xlators/cluster/map/src/Makefile.am<br/>deleted file mode 100644<br/>index 26e19137a8b..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/xlators/cluster/map/src/Makefile.am?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/cluster/map/src/Makefile.am</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,15 +0,0 @@</div><div class='del'>-xlator_LTLIBRARIES = map.la</div><div class='del'>-xlatordir = $(libdir)/glusterfs/$(PACKAGE_VERSION)/xlator/testing/cluster</div><div class='del'>-</div><div class='del'>-map_la_LDFLAGS = -module -avoidversion </div><div class='del'>-</div><div class='del'>-map_la_SOURCES = map.c map-helper.c</div><div class='del'>-map_la_LIBADD = $(top_builddir)/libglusterfs/src/libglusterfs.la</div><div class='del'>-</div><div class='del'>-noinst_HEADERS = map.h</div><div class='del'>-</div><div class='del'>-AM_CFLAGS = -fPIC -D_FILE_OFFSET_BITS=64 -D_GNU_SOURCE -Wall -D$(GF_HOST_OS) \</div><div class='del'>-	    -I$(top_srcdir)/libglusterfs/src -shared -nostartfiles $(GF_CFLAGS)</div><div class='del'>-</div><div class='del'>-CLEANFILES = </div><div class='del'>-</div><div class='head'>diff --git a/xlators/cluster/map/src/map-helper.c b/xlators/cluster/map/src/map-helper.c<br/>deleted file mode 100644<br/>index ad01b2102dc..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/xlators/cluster/map/src/map-helper.c?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/cluster/map/src/map-helper.c</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,358 +0,0 @@</div><div class='del'>-/*</div><div class='del'>-  Copyright (c) 2009-2009 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='del'>-  This file is part of GlusterFS.</div><div class='del'>-</div><div class='del'>-  GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-  it under the terms of the GNU General Public License as published</div><div class='del'>-  by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-  or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-  GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-  WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-  General Public License for more details.</div><div class='del'>-</div><div class='del'>-  You should have received a copy of the GNU General Public License</div><div class='del'>-  along with this program.  If not, see</div><div class='del'>-  &lt;http://www.gnu.org/licenses/&gt;.</div><div class='del'>-*/</div><div class='del'>-</div><div class='del'>-#ifndef _CONFIG_H</div><div class='del'>-#define _CONFIG_H</div><div class='del'>-#include "config.h"</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-#include "xlator.h"</div><div class='del'>-#include "map.h"</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-xlator_t *</div><div class='del'>-map_subvol_next (xlator_t *this, xlator_t *prev)</div><div class='del'>-{</div><div class='del'>-	map_private_t *priv = NULL;</div><div class='del'>-	xlator_t      *next = NULL;</div><div class='del'>-	int            i = 0;</div><div class='del'>-</div><div class='del'>-	priv = this-&gt;private;</div><div class='del'>-</div><div class='del'>-	for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='del'>-		if (priv-&gt;xlarray[i].xl == prev) {</div><div class='del'>-			if ((i + 1) &lt; priv-&gt;child_count)</div><div class='del'>-				next = priv-&gt;xlarray[i + 1].xl;</div><div class='del'>-			break;</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	return next;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-map_subvol_cnt (xlator_t *this, xlator_t *subvol)</div><div class='del'>-{</div><div class='del'>-	int i = 0;</div><div class='del'>-	int ret = -1;</div><div class='del'>-	map_private_t *priv = NULL;</div><div class='del'>-</div><div class='del'>-	priv = this-&gt;private;</div><div class='del'>-</div><div class='del'>-	for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='del'>-		if (subvol == priv-&gt;xlarray[i].xl) {</div><div class='del'>-			ret = i;</div><div class='del'>-			break;</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-map_itransform (xlator_t *this, xlator_t *subvol, uint64_t x, uint64_t *y_p)</div><div class='del'>-{</div><div class='del'>-	map_private_t *priv = NULL;</div><div class='del'>-	int         cnt = 0;</div><div class='del'>-	int         max = 0;</div><div class='del'>-	uint64_t    y = 0;</div><div class='del'>-</div><div class='del'>-	if (x == ((uint64_t) -1)) {</div><div class='del'>-		y = (uint64_t) -1;</div><div class='del'>-		goto out;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	priv = this-&gt;private;</div><div class='del'>-</div><div class='del'>-	max = priv-&gt;child_count;</div><div class='del'>-	cnt = map_subvol_cnt (this, subvol);</div><div class='del'>-</div><div class='del'>-	y = ((x * max) + cnt);</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-	if (y_p)</div><div class='del'>-		*y_p = y;</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-map_deitransform (xlator_t *this, uint64_t y, xlator_t **subvol_p,</div><div class='del'>-		  uint64_t *x_p)</div><div class='del'>-{</div><div class='del'>-	int         cnt = 0;</div><div class='del'>-	int         max = 0;</div><div class='del'>-	uint64_t    x = 0;</div><div class='del'>-	xlator_t   *subvol = 0;</div><div class='del'>-	map_private_t *priv = NULL;</div><div class='del'>-</div><div class='del'>-	priv = this-&gt;private;</div><div class='del'>-	max = priv-&gt;child_count;</div><div class='del'>-</div><div class='del'>-	cnt = y % max;</div><div class='del'>-	x   = y / max;</div><div class='del'>-</div><div class='del'>-	subvol = priv-&gt;xlarray[cnt].xl;</div><div class='del'>-</div><div class='del'>-	if (subvol_p)</div><div class='del'>-		*subvol_p = subvol;</div><div class='del'>-</div><div class='del'>-	if (x_p)</div><div class='del'>-		*x_p = x;</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-xlator_t *</div><div class='del'>-get_mapping_subvol_from_path (xlator_t *this, const char *path) </div><div class='del'>-{</div><div class='del'>-	map_private_t      *priv = NULL;</div><div class='del'>-	struct map_pattern *map = NULL;</div><div class='del'>-</div><div class='del'>-	/* To make sure we handle '/' properly */</div><div class='del'>-	if (!strcmp (path, "/"))</div><div class='del'>-		return NULL;</div><div class='del'>-</div><div class='del'>-	priv = this-&gt;private;</div><div class='del'>-</div><div class='del'>-	map = priv-&gt;map;</div><div class='del'>-	while (map) {</div><div class='del'>-		if (!strncmp (map-&gt;directory, path, map-&gt;dir_len)) {</div><div class='del'>-			if ((path[map-&gt;dir_len] == '/') ||</div><div class='del'>-			    (path[map-&gt;dir_len] == '\0')) {</div><div class='del'>-				return map-&gt;xl;</div><div class='del'>-			}</div><div class='del'>-		}</div><div class='del'>-		</div><div class='del'>-		map = map-&gt;next;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	return priv-&gt;default_xl;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-xlator_t *</div><div class='del'>-get_mapping_subvol_from_ctx (xlator_t *this, inode_t *inode)</div><div class='del'>-{</div><div class='del'>-	uint64_t subvol = 0;</div><div class='del'>-	int      ret    = -1;</div><div class='del'>-</div><div class='del'>-	ret = inode_ctx_get (inode, this, &amp;subvol);</div><div class='del'>-	if (ret != 0) </div><div class='del'>-		return NULL;</div><div class='del'>-</div><div class='del'>-	return (xlator_t *)(long)subvol;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-check_multiple_volume_entry (xlator_t *this, </div><div class='del'>-			     xlator_t *subvol)</div><div class='del'>-{</div><div class='del'>-	int ret = -1;</div><div class='del'>-	int idx = 0;</div><div class='del'>-	map_private_t *priv = NULL;</div><div class='del'>-</div><div class='del'>-	priv = this-&gt;private;</div><div class='del'>-	</div><div class='del'>-	for (idx = 0; idx &lt; priv-&gt;child_count; idx++) {</div><div class='del'>-		if (priv-&gt;xlarray[idx].xl == subvol) {</div><div class='del'>-			if (priv-&gt;xlarray[idx].mapped) {</div><div class='del'>-				gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-					"subvolume '%s' is already mapped",</div><div class='del'>-					subvol-&gt;name);</div><div class='del'>-				goto out;</div><div class='del'>-			}</div><div class='del'>-			priv-&gt;xlarray[idx].mapped = 1;</div><div class='del'>-			ret = 0;</div><div class='del'>-			goto out;</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-		"subvolume '%s' is not found",</div><div class='del'>-		subvol-&gt;name);</div><div class='del'>-	</div><div class='del'>- out:</div><div class='del'>-	return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-verify_dir_and_assign_subvol (xlator_t *this, </div><div class='del'>-			      const char *directory, </div><div class='del'>-			      const char *subvol)</div><div class='del'>-{</div><div class='del'>-	int            default_flag = 0;</div><div class='del'>-	int            ret  = -1;</div><div class='del'>-	int            idx  = 0;</div><div class='del'>-	map_private_t *priv = NULL;</div><div class='del'>-	xlator_list_t *trav = NULL;</div><div class='del'>-	struct map_pattern *tmp_map = NULL;</div><div class='del'>-</div><div class='del'>-	priv = this-&gt;private;</div><div class='del'>-</div><div class='del'>-	/* check if directory is valid, ie, its a top level dir, and </div><div class='del'>-	 * not includes a '*' in it.</div><div class='del'>-	 */</div><div class='del'>-	if (!strcmp ("*", directory)) {</div><div class='del'>-		default_flag = 1;</div><div class='del'>-	} else {</div><div class='del'>-		if (directory[0] != '/') {</div><div class='del'>-			gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-				"map takes absolute path, starting with '/'. "</div><div class='del'>-				"not '%s'", directory);</div><div class='del'>-			goto out;</div><div class='del'>-		}</div><div class='del'>-		for (idx = 1; idx &lt; (strlen (directory) - 1); idx++) {</div><div class='del'>-			if (directory[idx] == '/') {</div><div class='del'>-				gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-					"map takes only top level directory, "</div><div class='del'>-					"not '%s'", directory);</div><div class='del'>-				goto out;</div><div class='del'>-			}</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	/* Assign proper subvolume */</div><div class='del'>-	trav = this-&gt;children;</div><div class='del'>-	while (trav) {</div><div class='del'>-		if (!strcmp (trav-&gt;xlator-&gt;name, subvol)) {</div><div class='del'>-			</div><div class='del'>-			/* Check if there is another directory for </div><div class='del'>-			 * same volume, if yes, return error.</div><div class='del'>-			 */</div><div class='del'>-			ret = check_multiple_volume_entry (this, </div><div class='del'>-							   trav-&gt;xlator);</div><div class='del'>-			if (ret != 0) {</div><div class='del'>-				goto out;</div><div class='del'>-			}</div><div class='del'>-</div><div class='del'>-			ret = 0;</div><div class='del'>-			if (default_flag) {</div><div class='del'>-				if (priv-&gt;default_xl) {</div><div class='del'>-					ret = -1;</div><div class='del'>-					gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-						"'*' specified more than "</div><div class='del'>-						"once. don't confuse me!!!");</div><div class='del'>-				}</div><div class='del'>-</div><div class='del'>-				priv-&gt;default_xl = trav-&gt;xlator;</div><div class='del'>-				goto out;</div><div class='del'>-			}</div><div class='del'>-</div><div class='del'>-			tmp_map = GF_CALLOC (1, sizeof (struct map_pattern),</div><div class='del'>-                                             gf_map_mt_map_pattern);</div><div class='del'>-			tmp_map-&gt;xl = trav-&gt;xlator;</div><div class='del'>-			tmp_map-&gt;dir_len = strlen (directory);</div><div class='del'>-</div><div class='del'>-			/* make sure that the top level directory starts </div><div class='del'>-			 * with '/' and ends without '/'</div><div class='del'>-			 */</div><div class='del'>-			tmp_map-&gt;directory = gf_strdup (directory);</div><div class='del'>-			if (directory[tmp_map-&gt;dir_len - 1] == '/') {</div><div class='del'>-				tmp_map-&gt;dir_len--;</div><div class='del'>-			}</div><div class='del'>-</div><div class='del'>-			if (!priv-&gt;map) </div><div class='del'>-				priv-&gt;map = tmp_map;</div><div class='del'>-			else {</div><div class='del'>-				struct map_pattern *trav_map = NULL;</div><div class='del'>-				trav_map = priv-&gt;map;</div><div class='del'>-				while (trav_map-&gt;next)</div><div class='del'>-					trav_map = trav_map-&gt;next;</div><div class='del'>-				trav_map-&gt;next = tmp_map;</div><div class='del'>-			}</div><div class='del'>-			</div><div class='del'>-			goto out;</div><div class='del'>-		}</div><div class='del'>-</div><div class='del'>-		trav = trav-&gt;next;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	gf_log (this-&gt;name, GF_LOG_ERROR, </div><div class='del'>-		"map volume '%s' is not proper subvolume", subvol);</div><div class='del'>-</div><div class='del'>- out:</div><div class='del'>-	return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int </div><div class='del'>-assign_default_subvol (xlator_t *this, const char *default_xl)</div><div class='del'>-{</div><div class='del'>-	int ret = -1;</div><div class='del'>-	map_private_t *priv = NULL;</div><div class='del'>-	xlator_list_t *trav = NULL;</div><div class='del'>-</div><div class='del'>-	priv = this-&gt;private;</div><div class='del'>-	trav = this-&gt;children;</div><div class='del'>-</div><div class='del'>-	while (trav) {</div><div class='del'>-		if (!strcmp (trav-&gt;xlator-&gt;name, default_xl)) {</div><div class='del'>-			ret = check_multiple_volume_entry (this, </div><div class='del'>-							   trav-&gt;xlator);</div><div class='del'>-			if (ret != 0) {</div><div class='del'>-				goto out;</div><div class='del'>-			}</div><div class='del'>-			if (priv-&gt;default_xl)</div><div class='del'>-				gf_log (this-&gt;name, GF_LOG_WARNING,</div><div class='del'>-					"default-volume option provided, "</div><div class='del'>-					"overriding earlier '*' option");</div><div class='del'>-			priv-&gt;default_xl = trav-&gt;xlator;</div><div class='del'>-			return 0;</div><div class='del'>-		}</div><div class='del'>-		trav = trav-&gt;next;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-		"default-volume value is not an valid subvolume. check again");</div><div class='del'>- out:</div><div class='del'>-	return -1;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-void</div><div class='del'>-verify_if_all_subvolumes_got_used (xlator_t *this)</div><div class='del'>-{</div><div class='del'>-	int idx = 0;</div><div class='del'>-	map_private_t *priv = NULL;</div><div class='del'>-</div><div class='del'>-	priv = this-&gt;private;</div><div class='del'>-	</div><div class='del'>-	for (idx = 0; idx &lt; priv-&gt;child_count; idx++) {</div><div class='del'>-		if (!priv-&gt;xlarray[idx].mapped) {</div><div class='del'>-			if (!priv-&gt;default_xl) {</div><div class='del'>-				priv-&gt;default_xl = priv-&gt;xlarray[idx].xl;</div><div class='del'>-				priv-&gt;xlarray[idx].mapped = 1;</div><div class='del'>-			} else {</div><div class='del'>-				gf_log (this-&gt;name, GF_LOG_WARNING,</div><div class='del'>-					"subvolume '%s' is not mapped to "</div><div class='del'>-					"any directory",</div><div class='del'>-					priv-&gt;xlarray[idx].xl-&gt;name);</div><div class='del'>-			}</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	if (!priv-&gt;default_xl) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_WARNING,</div><div class='del'>-			"default subvolume not specified, filesystem "</div><div class='del'>-			"may not work properly. Check 'map' translator "</div><div class='del'>-			"documentation for more info");</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	return ;</div><div class='del'>-}</div><div class='head'>diff --git a/xlators/cluster/map/src/map-mem-types.h b/xlators/cluster/map/src/map-mem-types.h<br/>deleted file mode 100644<br/>index f41ab420ace..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/xlators/cluster/map/src/map-mem-types.h?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/cluster/map/src/map-mem-types.h</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,35 +0,0 @@</div><div class='del'>-</div><div class='del'>-/*</div><div class='del'>-   Copyright (c) 2008-2009 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='del'>-   This file is part of GlusterFS.</div><div class='del'>-</div><div class='del'>-   GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-   it under the terms of the GNU General Public License as published</div><div class='del'>-   by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-   or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-   GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-   WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-   General Public License for more details.</div><div class='del'>-</div><div class='del'>-   You should have received a copy of the GNU General Public License</div><div class='del'>-   along with this program.  If not, see</div><div class='del'>-   &lt;http://www.gnu.org/licenses/&gt;.</div><div class='del'>-*/</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-#ifndef __MAP_MEM_TYPES_H__</div><div class='del'>-#define __MAP_MEM_TYPES_H__</div><div class='del'>-</div><div class='del'>-#include "mem-types.h"</div><div class='del'>-</div><div class='del'>-enum gf_map_mem_types_ {</div><div class='del'>-        gf_map_mt_map_private_t = gf_common_mt_end + 1,</div><div class='del'>-        gf_map_mt_map_local_t,</div><div class='del'>-        gf_map_mt_map_xlator_array,</div><div class='del'>-        gf_map_mt_map_pattern,</div><div class='del'>-        gf_map_mt_end</div><div class='del'>-};</div><div class='del'>-#endif</div><div class='del'>-</div><div class='head'>diff --git a/xlators/cluster/map/src/map.c b/xlators/cluster/map/src/map.c<br/>deleted file mode 100644<br/>index dd89d0ebee9..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/xlators/cluster/map/src/map.c?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/cluster/map/src/map.c</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,2577 +0,0 @@</div><div class='del'>-/*</div><div class='del'>-  Copyright (c) 2009 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='del'>-  This file is part of GlusterFS.</div><div class='del'>-</div><div class='del'>-  GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-  it under the terms of the GNU General Public License as published</div><div class='del'>-  by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-  or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-  GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-  WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-  General Public License for more details.</div><div class='del'>-</div><div class='del'>-  You should have received a copy of the GNU General Public License</div><div class='del'>-  along with this program.  If not, see</div><div class='del'>-  &lt;http://www.gnu.org/licenses/&gt;.</div><div class='del'>-*/</div><div class='del'>-</div><div class='del'>-#ifndef _CONFIG_H</div><div class='del'>-#define _CONFIG_H</div><div class='del'>-#include "config.h"</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-#include "xlator.h"</div><div class='del'>-#include "map.h"</div><div class='del'>-</div><div class='del'>-/* TODO : </div><div class='del'>- *     -&gt; support for 'get' 'put' API in through xattrs.</div><div class='del'>- *     -&gt; define the behavior of notify()</div><div class='del'>- */</div><div class='del'>-</div><div class='del'>-static int32_t</div><div class='del'>-map_stat_cbk (call_frame_t *frame,</div><div class='del'>-		  void *cookie,</div><div class='del'>-		  xlator_t *this,</div><div class='del'>-		  int32_t op_ret,</div><div class='del'>-		  int32_t op_errno,</div><div class='del'>-		  struct iatt *buf)</div><div class='del'>-</div><div class='del'>-{</div><div class='del'>-        call_frame_t *prev = NULL;</div><div class='del'>-        prev  = cookie;</div><div class='del'>-	</div><div class='del'>-	map_itransform (this, prev-&gt;this, buf-&gt;ia_ino, &amp;buf-&gt;ia_ino);</div><div class='del'>-</div><div class='del'>-	STACK_UNWIND (frame, op_ret, op_errno, buf);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-static int32_t</div><div class='del'>-map_setattr_cbk (call_frame_t *frame,</div><div class='del'>-                 void *cookie,</div><div class='del'>-                 xlator_t *this,</div><div class='del'>-                 int32_t op_ret,</div><div class='del'>-                 int32_t op_errno,</div><div class='del'>-                 struct iatt *statpre,</div><div class='del'>-                 struct iatt *statpost)</div><div class='del'>-{</div><div class='del'>-        call_frame_t *prev = NULL;</div><div class='del'>-        prev  = cookie;</div><div class='del'>-</div><div class='del'>-	map_itransform (this, prev-&gt;this, statpre-&gt;ia_ino, &amp;statpre-&gt;ia_ino);</div><div class='del'>-	map_itransform (this, prev-&gt;this, statpost-&gt;ia_ino, &amp;statpost-&gt;ia_ino);</div><div class='del'>-</div><div class='del'>-	STACK_UNWIND (frame, op_ret, op_errno, statpre, statpost);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-static int32_t</div><div class='del'>-map_fsetattr_cbk (call_frame_t *frame,</div><div class='del'>-                  void *cookie,</div><div class='del'>-                  xlator_t *this,</div><div class='del'>-                  int32_t op_ret,</div><div class='del'>-                  int32_t op_errno,</div><div class='del'>-                  struct iatt *statpre,</div><div class='del'>-                  struct iatt *statpost)</div><div class='del'>-{</div><div class='del'>-        call_frame_t *prev = NULL;</div><div class='del'>-        prev  = cookie;</div><div class='del'>-</div><div class='del'>-	map_itransform (this, prev-&gt;this, statpre-&gt;ia_ino, &amp;statpre-&gt;ia_ino);</div><div class='del'>-	map_itransform (this, prev-&gt;this, statpost-&gt;ia_ino, &amp;statpost-&gt;ia_ino);</div><div class='del'>-</div><div class='del'>-	STACK_UNWIND (frame, op_ret, op_errno, statpre, statpost);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-static int32_t</div><div class='del'>-map_truncate_cbk (call_frame_t *frame,</div><div class='del'>-		      void *cookie,</div><div class='del'>-		      xlator_t *this,</div><div class='del'>-		      int32_t op_ret,</div><div class='del'>-		      int32_t op_errno,</div><div class='del'>-		      struct iatt *prebuf,</div><div class='del'>-                      struct iatt *postbuf)</div><div class='del'>-{</div><div class='del'>-        call_frame_t *prev = NULL;</div><div class='del'>-        prev  = cookie;</div><div class='del'>-	</div><div class='del'>-	map_itransform (this, prev-&gt;this, postbuf-&gt;ia_ino, &amp;postbuf-&gt;ia_ino);</div><div class='del'>-</div><div class='del'>-	STACK_UNWIND (frame, op_ret, op_errno, prebuf, postbuf);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-static int32_t</div><div class='del'>-map_ftruncate_cbk (call_frame_t *frame,</div><div class='del'>-		       void *cookie,</div><div class='del'>-		       xlator_t *this,</div><div class='del'>-		       int32_t op_ret,</div><div class='del'>-		       int32_t op_errno,</div><div class='del'>-		       struct iatt *prebuf,</div><div class='del'>-                       struct iatt *postbuf)</div><div class='del'>-{</div><div class='del'>-        call_frame_t *prev = NULL;</div><div class='del'>-        prev  = cookie;</div><div class='del'>-	</div><div class='del'>-	map_itransform (this, prev-&gt;this, postbuf-&gt;ia_ino, &amp;postbuf-&gt;ia_ino);</div><div class='del'>-</div><div class='del'>-	STACK_UNWIND (frame, op_ret, op_errno, prebuf, postbuf);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-static int32_t</div><div class='del'>-map_access_cbk (call_frame_t *frame,</div><div class='del'>-		    void *cookie,</div><div class='del'>-		    xlator_t *this,</div><div class='del'>-		    int32_t op_ret,</div><div class='del'>-		    int32_t op_errno)</div><div class='del'>-{</div><div class='del'>-	STACK_UNWIND (frame, op_ret, op_errno);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-static int32_t</div><div class='del'>-map_readlink_cbk (call_frame_t *frame,</div><div class='del'>-		      void *cookie,</div><div class='del'>-		      xlator_t *this,</div><div class='del'>-		      int32_t op_ret,</div><div class='del'>-		      int32_t op_errno,</div><div class='del'>-		      const char *path,</div><div class='del'>-                      struct iatt *sbuf)</div><div class='del'>-{</div><div class='del'>-	STACK_UNWIND (frame, op_ret, op_errno, path, sbuf);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-static int32_t</div><div class='del'>-map_unlink_cbk (call_frame_t *frame,</div><div class='del'>-		    void *cookie,</div><div class='del'>-		    xlator_t *this,</div><div class='del'>-		    int32_t op_ret,</div><div class='del'>-		    int32_t op_errno,</div><div class='del'>-                    struct iatt *preparent,</div><div class='del'>-                    struct iatt *postparent)</div><div class='del'>-{</div><div class='del'>-	STACK_UNWIND (frame, op_ret, op_errno, preparent, postparent);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-static int32_t</div><div class='del'>-map_rmdir_cbk (call_frame_t *frame,</div><div class='del'>-		   void *cookie,</div><div class='del'>-		   xlator_t *this,</div><div class='del'>-		   int32_t op_ret,</div><div class='del'>-		   int32_t op_errno,</div><div class='del'>-                   struct iatt *preparent,</div><div class='del'>-                   struct iatt *postparent)</div><div class='del'>-{</div><div class='del'>-	STACK_UNWIND (frame, op_ret, op_errno, preparent, postparent);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-static int32_t</div><div class='del'>-map_rename_cbk (call_frame_t *frame,</div><div class='del'>-		    void *cookie,</div><div class='del'>-		    xlator_t *this,</div><div class='del'>-		    int32_t op_ret,</div><div class='del'>-		    int32_t op_errno,</div><div class='del'>-		    struct iatt *buf,</div><div class='del'>-                    struct iatt *preoldparent,</div><div class='del'>-                    struct iatt *postoldparent,</div><div class='del'>-                    struct iatt *prenewparent,</div><div class='del'>-                    struct iatt *postnewparent)</div><div class='del'>-{</div><div class='del'>-        call_frame_t *prev = NULL;</div><div class='del'>-        prev  = cookie;</div><div class='del'>-	</div><div class='del'>-	map_itransform (this, prev-&gt;this, buf-&gt;ia_ino, &amp;buf-&gt;ia_ino);</div><div class='del'>-</div><div class='del'>-	STACK_UNWIND (frame, op_ret, op_errno, buf);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-static int32_t</div><div class='del'>-map_link_cbk (call_frame_t *frame,</div><div class='del'>-		  void *cookie,</div><div class='del'>-		  xlator_t *this,</div><div class='del'>-		  int32_t op_ret,</div><div class='del'>-		  int32_t op_errno,</div><div class='del'>-		  inode_t *inode,</div><div class='del'>-                  struct iatt *buf,</div><div class='del'>-                  struct iatt *preparent,</div><div class='del'>-                  struct iatt *postparent)</div><div class='del'>-{</div><div class='del'>-        call_frame_t *prev = NULL;</div><div class='del'>-        prev  = cookie;</div><div class='del'>-	</div><div class='del'>-	map_itransform (this, prev-&gt;this, buf-&gt;ia_ino, &amp;buf-&gt;ia_ino);</div><div class='del'>-</div><div class='del'>-	STACK_UNWIND (frame, op_ret, op_errno, inode,	buf);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-static int32_t</div><div class='del'>-map_open_cbk (call_frame_t *frame,</div><div class='del'>-		  void *cookie,</div><div class='del'>-		  xlator_t *this,</div><div class='del'>-		  int32_t op_ret,</div><div class='del'>-		  int32_t op_errno,</div><div class='del'>-		  fd_t *fd)</div><div class='del'>-{</div><div class='del'>-	STACK_UNWIND (frame, op_ret, op_errno, fd);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-static int32_t</div><div class='del'>-map_readv_cbk (call_frame_t *frame,</div><div class='del'>-               void *cookie,</div><div class='del'>-               xlator_t *this,</div><div class='del'>-               int32_t op_ret,</div><div class='del'>-               int32_t op_errno,</div><div class='del'>-               struct iovec *vector,</div><div class='del'>-               int32_t count,</div><div class='del'>-               struct iatt *stbuf,</div><div class='del'>-               struct iobref *iobref)</div><div class='del'>-{</div><div class='del'>-        call_frame_t *prev = NULL;</div><div class='del'>-        prev  = cookie;</div><div class='del'>-	</div><div class='del'>-	map_itransform (this, prev-&gt;this, stbuf-&gt;ia_ino, &amp;stbuf-&gt;ia_ino);</div><div class='del'>-</div><div class='del'>-	STACK_UNWIND (frame, op_ret, op_errno, vector, count, stbuf, iobref);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-static int32_t</div><div class='del'>-map_writev_cbk (call_frame_t *frame,</div><div class='del'>-		    void *cookie,</div><div class='del'>-		    xlator_t *this,</div><div class='del'>-		    int32_t op_ret,</div><div class='del'>-		    int32_t op_errno,</div><div class='del'>-                    struct iatt *prebuf,</div><div class='del'>-		    struct iatt *postbuf)</div><div class='del'>-{</div><div class='del'>-        call_frame_t *prev = NULL;</div><div class='del'>-        prev  = cookie;</div><div class='del'>-	</div><div class='del'>-	map_itransform (this, prev-&gt;this, postbuf-&gt;ia_ino, &amp;postbuf-&gt;ia_ino);</div><div class='del'>-</div><div class='del'>-	STACK_UNWIND (frame, op_ret, op_errno, prebuf, postbuf);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-static int32_t</div><div class='del'>-map_flush_cbk (call_frame_t *frame,</div><div class='del'>-		   void *cookie,</div><div class='del'>-		   xlator_t *this,</div><div class='del'>-		   int32_t op_ret,</div><div class='del'>-		   int32_t op_errno)</div><div class='del'>-{</div><div class='del'>-	STACK_UNWIND (frame, op_ret, op_errno);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-static int32_t</div><div class='del'>-map_fsync_cbk (call_frame_t *frame,</div><div class='del'>-		   void *cookie,</div><div class='del'>-		   xlator_t *this,</div><div class='del'>-		   int32_t op_ret,</div><div class='del'>-		   int32_t op_errno,</div><div class='del'>-                   struct iatt *prebuf,</div><div class='del'>-                   struct iatt *postbuf)</div><div class='del'>-{</div><div class='del'>-	STACK_UNWIND (frame, op_ret, op_errno, prebuf, postbuf);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-static int32_t</div><div class='del'>-map_fstat_cbk (call_frame_t *frame,</div><div class='del'>-		   void *cookie,</div><div class='del'>-		   xlator_t *this,</div><div class='del'>-		   int32_t op_ret,</div><div class='del'>-		   int32_t op_errno,</div><div class='del'>-		   struct iatt *buf)</div><div class='del'>-{</div><div class='del'>-        call_frame_t *prev = NULL;</div><div class='del'>-        prev  = cookie;</div><div class='del'>-	</div><div class='del'>-	map_itransform (this, prev-&gt;this, buf-&gt;ia_ino, &amp;buf-&gt;ia_ino);</div><div class='del'>-</div><div class='del'>-	STACK_UNWIND (frame, op_ret, op_errno, buf);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-static int32_t</div><div class='del'>-map_getdents_cbk (call_frame_t *frame,</div><div class='del'>-		      void *cookie,</div><div class='del'>-		      xlator_t *this,</div><div class='del'>-		      int32_t op_ret,</div><div class='del'>-		      int32_t op_errno,</div><div class='del'>-		      dir_entry_t *entries,</div><div class='del'>-		      int32_t count)</div><div class='del'>-{</div><div class='del'>-	STACK_UNWIND (frame, op_ret, op_errno, entries, count);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-static int32_t</div><div class='del'>-map_setdents_cbk (call_frame_t *frame,</div><div class='del'>-		      void *cookie,</div><div class='del'>-		      xlator_t *this,</div><div class='del'>-		      int32_t op_ret,</div><div class='del'>-		      int32_t op_errno)</div><div class='del'>-{</div><div class='del'>-	STACK_UNWIND (frame, op_ret, op_errno);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-static int32_t</div><div class='del'>-map_fsyncdir_cbk (call_frame_t *frame,</div><div class='del'>-		      void *cookie,</div><div class='del'>-		      xlator_t *this,</div><div class='del'>-		      int32_t op_ret,</div><div class='del'>-		      int32_t op_errno)</div><div class='del'>-{</div><div class='del'>-	STACK_UNWIND (frame, op_ret, op_errno);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-static int32_t</div><div class='del'>-map_setxattr_cbk (call_frame_t *frame,</div><div class='del'>-		      void *cookie,</div><div class='del'>-		      xlator_t *this,</div><div class='del'>-		      int32_t op_ret,</div><div class='del'>-		      int32_t op_errno)</div><div class='del'>-{</div><div class='del'>-	STACK_UNWIND (frame, op_ret, op_errno);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-static int32_t</div><div class='del'>-map_fsetxattr_cbk (call_frame_t *frame,</div><div class='del'>-                       void *cookie,</div><div class='del'>-                       xlator_t *this,</div><div class='del'>-                       int32_t op_ret,</div><div class='del'>-                       int32_t op_errno)</div><div class='del'>-{</div><div class='del'>-	STACK_UNWIND (frame, op_ret, op_errno);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-static int32_t</div><div class='del'>-map_fgetxattr_cbk (call_frame_t *frame,</div><div class='del'>-                       void *cookie,</div><div class='del'>-                       xlator_t *this,</div><div class='del'>-                       int32_t op_ret,</div><div class='del'>-                       int32_t op_errno,</div><div class='del'>-                       dict_t *dict)</div><div class='del'>-{</div><div class='del'>-	STACK_UNWIND (frame, op_ret, op_errno, dict);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-static int32_t</div><div class='del'>-map_getxattr_cbk (call_frame_t *frame,</div><div class='del'>-                      void *cookie,</div><div class='del'>-                      xlator_t *this,</div><div class='del'>-                      int32_t op_ret,</div><div class='del'>-                      int32_t op_errno,</div><div class='del'>-                      dict_t *dict)</div><div class='del'>-{</div><div class='del'>-	STACK_UNWIND (frame, op_ret, op_errno, dict);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-map_xattrop_cbk (call_frame_t *frame,</div><div class='del'>-		     void *cookie,</div><div class='del'>-		     xlator_t *this,</div><div class='del'>-		     int32_t op_ret,</div><div class='del'>-		     int32_t op_errno,</div><div class='del'>-		     dict_t *dict)</div><div class='del'>-{</div><div class='del'>-	STACK_UNWIND (frame, op_ret, op_errno, dict);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-map_fxattrop_cbk (call_frame_t *frame,</div><div class='del'>-		      void *cookie,</div><div class='del'>-		      xlator_t *this,</div><div class='del'>-		      int32_t op_ret,</div><div class='del'>-		      int32_t op_errno,</div><div class='del'>-		      dict_t *dict)</div><div class='del'>-{</div><div class='del'>-	STACK_UNWIND (frame, op_ret, op_errno, dict);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-static int32_t</div><div class='del'>-map_removexattr_cbk (call_frame_t *frame,</div><div class='del'>-			 void *cookie,</div><div class='del'>-			 xlator_t *this,</div><div class='del'>-			 int32_t op_ret,</div><div class='del'>-			 int32_t op_errno)</div><div class='del'>-{</div><div class='del'>-	STACK_UNWIND (frame, op_ret, op_errno);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-static int32_t</div><div class='del'>-map_lk_cbk (call_frame_t *frame,</div><div class='del'>-		void *cookie,</div><div class='del'>-		xlator_t *this,</div><div class='del'>-		int32_t op_ret,</div><div class='del'>-		int32_t op_errno,</div><div class='del'>-		struct flock *lock)</div><div class='del'>-{</div><div class='del'>-	STACK_UNWIND (frame, op_ret, op_errno, lock);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-static int32_t</div><div class='del'>-map_inodelk_cbk (call_frame_t *frame, void *cookie,</div><div class='del'>-		     xlator_t *this, int32_t op_ret, int32_t op_errno)</div><div class='del'>-</div><div class='del'>-{</div><div class='del'>-	STACK_UNWIND (frame, op_ret, op_errno);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-static int32_t</div><div class='del'>-map_finodelk_cbk (call_frame_t *frame, void *cookie,</div><div class='del'>-		      xlator_t *this, int32_t op_ret, int32_t op_errno)</div><div class='del'>-</div><div class='del'>-{</div><div class='del'>-	STACK_UNWIND (frame, op_ret, op_errno);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-static int32_t</div><div class='del'>-map_entrylk_cbk (call_frame_t *frame, void *cookie,</div><div class='del'>-		     xlator_t *this, int32_t op_ret, int32_t op_errno)</div><div class='del'>-</div><div class='del'>-{</div><div class='del'>-	STACK_UNWIND (frame, op_ret, op_errno);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-static int32_t</div><div class='del'>-map_fentrylk_cbk (call_frame_t *frame, void *cookie,</div><div class='del'>-		      xlator_t *this, int32_t op_ret, int32_t op_errno)</div><div class='del'>-</div><div class='del'>-{</div><div class='del'>-	STACK_UNWIND (frame, op_ret, op_errno);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-static int32_t</div><div class='del'>-map_newentry_cbk (call_frame_t *frame,</div><div class='del'>-		  void *cookie,</div><div class='del'>-		  xlator_t *this,</div><div class='del'>-		  int32_t op_ret,</div><div class='del'>-		  int32_t op_errno,</div><div class='del'>-		  inode_t *inode,</div><div class='del'>-                  struct iatt *buf,</div><div class='del'>-                  struct iatt *preparent,</div><div class='del'>-                  struct iatt *postparent)</div><div class='del'>-{</div><div class='del'>-        call_frame_t *prev = NULL;</div><div class='del'>-        prev  = cookie;</div><div class='del'>-	</div><div class='del'>-	map_itransform (this, prev-&gt;this, buf-&gt;ia_ino, &amp;buf-&gt;ia_ino);</div><div class='del'>-</div><div class='del'>-	STACK_UNWIND (frame, op_ret, op_errno, inode, buf);</div><div class='del'>-	return 0;</div><div class='del'>-</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-static int32_t</div><div class='del'>-map_create_cbk (call_frame_t *frame,</div><div class='del'>-		void *cookie,</div><div class='del'>-		xlator_t *this,</div><div class='del'>-		int32_t op_ret,</div><div class='del'>-		int32_t op_errno,</div><div class='del'>-		fd_t *fd,</div><div class='del'>-		inode_t *inode,</div><div class='del'>-		struct iatt *buf,</div><div class='del'>-                struct iatt *preparent,</div><div class='del'>-                struct iatt *postparent)</div><div class='del'>-{</div><div class='del'>-        call_frame_t *prev = NULL;</div><div class='del'>-        prev  = cookie;</div><div class='del'>-	</div><div class='del'>-	map_itransform (this, prev-&gt;this, buf-&gt;ia_ino, &amp;buf-&gt;ia_ino);</div><div class='del'>-</div><div class='del'>-	STACK_UNWIND (frame, op_ret, op_errno, fd, inode, buf);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-/*</div><div class='del'>- * map_normalize_stats -</div><div class='del'>- */</div><div class='del'>-void</div><div class='del'>-map_normalize_stats (struct statvfs *buf,</div><div class='del'>-		     unsigned long bsize,</div><div class='del'>-		     unsigned long frsize)</div><div class='del'>-{</div><div class='del'>-	double factor;</div><div class='del'>-</div><div class='del'>-	if (buf-&gt;f_bsize != bsize) {</div><div class='del'>-		factor = ((double) buf-&gt;f_bsize) / bsize;</div><div class='del'>-		buf-&gt;f_bsize  = bsize;</div><div class='del'>-		buf-&gt;f_bfree  = (fsblkcnt_t) (factor * buf-&gt;f_bfree);</div><div class='del'>-		buf-&gt;f_bavail = (fsblkcnt_t) (factor * buf-&gt;f_bavail);</div><div class='del'>-	}</div><div class='del'>-  </div><div class='del'>-	if (buf-&gt;f_frsize != frsize) {</div><div class='del'>-		factor = ((double) buf-&gt;f_frsize) / frsize;</div><div class='del'>-		buf-&gt;f_frsize = frsize;</div><div class='del'>-		buf-&gt;f_blocks = (fsblkcnt_t) (factor * buf-&gt;f_blocks);</div><div class='del'>-	}</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-map_statfs_cbk (call_frame_t *frame,</div><div class='del'>-		void *cookie,</div><div class='del'>-		xlator_t *this,</div><div class='del'>-		int32_t op_ret,</div><div class='del'>-		int32_t op_errno,</div><div class='del'>-		struct statvfs *stbuf)</div><div class='del'>-{</div><div class='del'>-	struct statvfs *dict_buf = NULL;</div><div class='del'>-	map_local_t  *local = NULL;</div><div class='del'>-	int           this_call_cnt = 0;</div><div class='del'>-	unsigned long bsize;</div><div class='del'>-	unsigned long frsize;</div><div class='del'>-</div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-</div><div class='del'>-	LOCK (&amp;frame-&gt;lock);</div><div class='del'>-	{</div><div class='del'>-		this_call_cnt = --local-&gt;call_count;</div><div class='del'>-</div><div class='del'>-		if (op_ret == -1) {</div><div class='del'>-			local-&gt;op_errno = op_errno;</div><div class='del'>-			goto unlock;</div><div class='del'>-		}</div><div class='del'>-		local-&gt;op_ret = 0;</div><div class='del'>-		</div><div class='del'>-		/* when a call is successfull, add it to local-&gt;dict */</div><div class='del'>-		dict_buf = &amp;local-&gt;statvfs;</div><div class='del'>-		</div><div class='del'>-		if (dict_buf-&gt;f_bsize != 0) {</div><div class='del'>-			bsize  = max (dict_buf-&gt;f_bsize, </div><div class='del'>-				      stbuf-&gt;f_bsize);</div><div class='del'>-			</div><div class='del'>-			frsize = max (dict_buf-&gt;f_frsize, </div><div class='del'>-				      stbuf-&gt;f_frsize);</div><div class='del'>-			map_normalize_stats(dict_buf, bsize, frsize);</div><div class='del'>-			map_normalize_stats(stbuf, bsize, frsize);</div><div class='del'>-		} else {</div><div class='del'>-			dict_buf-&gt;f_bsize   = stbuf-&gt;f_bsize;</div><div class='del'>-			dict_buf-&gt;f_frsize  = stbuf-&gt;f_frsize;</div><div class='del'>-		}</div><div class='del'>-		</div><div class='del'>-		dict_buf-&gt;f_blocks += stbuf-&gt;f_blocks;</div><div class='del'>-		dict_buf-&gt;f_bfree  += stbuf-&gt;f_bfree;</div><div class='del'>-		dict_buf-&gt;f_bavail += stbuf-&gt;f_bavail;</div><div class='del'>-		dict_buf-&gt;f_files  += stbuf-&gt;f_files;</div><div class='del'>-		dict_buf-&gt;f_ffree  += stbuf-&gt;f_ffree;</div><div class='del'>-		dict_buf-&gt;f_favail += stbuf-&gt;f_favail;</div><div class='del'>-		dict_buf-&gt;f_fsid    = stbuf-&gt;f_fsid;</div><div class='del'>-		dict_buf-&gt;f_flag    = stbuf-&gt;f_flag;</div><div class='del'>-		dict_buf-&gt;f_namemax = stbuf-&gt;f_namemax;</div><div class='del'>-	}</div><div class='del'>-unlock:</div><div class='del'>-	UNLOCK (&amp;frame-&gt;lock);</div><div class='del'>-</div><div class='del'>-	if (!this_call_cnt) {</div><div class='del'>-		STACK_UNWIND (frame, local-&gt;op_ret, local-&gt;op_errno,</div><div class='del'>-			      &amp;local-&gt;statvfs);</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-map_single_lookup_cbk (call_frame_t *frame,</div><div class='del'>-		       void *cookie,</div><div class='del'>-		       xlator_t *this,</div><div class='del'>-		       int32_t op_ret,</div><div class='del'>-		       int32_t op_errno,</div><div class='del'>-		       inode_t *inode,</div><div class='del'>-		       struct iatt *buf,</div><div class='del'>-                       dict_t *dict,</div><div class='del'>-                       struct iatt *postparent)</div><div class='del'>-{</div><div class='del'>-        call_frame_t *prev = NULL;</div><div class='del'>-        prev  = cookie;</div><div class='del'>-	</div><div class='del'>-	map_itransform (this, prev-&gt;this, buf-&gt;ia_ino, &amp;buf-&gt;ia_ino);</div><div class='del'>-</div><div class='del'>-	STACK_UNWIND (frame, op_ret, op_errno, inode, buf, dict);</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-map_root_lookup_cbk (call_frame_t *frame,</div><div class='del'>-                     void *cookie,</div><div class='del'>-                     xlator_t *this,</div><div class='del'>-                     int32_t op_ret,</div><div class='del'>-                     int32_t op_errno,</div><div class='del'>-                     inode_t *inode,</div><div class='del'>-                     struct iatt *buf,</div><div class='del'>-                     dict_t *dict,</div><div class='del'>-                     struct iatt *postparent)</div><div class='del'>-{</div><div class='del'>-	int          callcnt = 0;</div><div class='del'>-	map_local_t *local = NULL;</div><div class='del'>-	inode_t     *tmp_inode = NULL;</div><div class='del'>-	dict_t      *tmp_dict = NULL;</div><div class='del'>-</div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-	LOCK (&amp;frame-&gt;lock);</div><div class='del'>-	{</div><div class='del'>-		callcnt = --local-&gt;call_count;</div><div class='del'>-		if ((op_ret == 0) &amp;&amp; (local-&gt;op_ret == -1)) {</div><div class='del'>-			local-&gt;op_ret = 0;</div><div class='del'>-			local-&gt;stbuf = *buf;</div><div class='del'>-			if (dict)</div><div class='del'>-				local-&gt;dict = dict_ref (dict);</div><div class='del'>-			local-&gt;inode = inode_ref (inode);</div><div class='del'>-		}</div><div class='del'>-		if (op_ret == -1)</div><div class='del'>-			local-&gt;op_errno = op_errno;</div><div class='del'>-		</div><div class='del'>-	}</div><div class='del'>-	UNLOCK (&amp;frame-&gt;lock);</div><div class='del'>-</div><div class='del'>-	if (!callcnt) {</div><div class='del'>-		tmp_dict = local-&gt;dict;</div><div class='del'>-		tmp_inode = local-&gt;inode;</div><div class='del'>-</div><div class='del'>-		STACK_UNWIND (frame, local-&gt;op_ret, </div><div class='del'>-			      local-&gt;op_errno, local-&gt;inode, </div><div class='del'>-			      &amp;local-&gt;stbuf, local-&gt;dict);</div><div class='del'>-</div><div class='del'>-		inode_unref (local-&gt;inode);</div><div class='del'>-		if (tmp_dict)</div><div class='del'>-			dict_unref (tmp_dict);</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-map_opendir_cbk (call_frame_t *frame,</div><div class='del'>-		 void *cookie,</div><div class='del'>-		 xlator_t *this,</div><div class='del'>-		 int32_t op_ret,</div><div class='del'>-		 int32_t op_errno,</div><div class='del'>-		 fd_t *fd)</div><div class='del'>-{</div><div class='del'>-	int callcnt = 0;</div><div class='del'>-	map_local_t *local = NULL;</div><div class='del'>-	fd_t *local_fd = NULL;</div><div class='del'>-</div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-	LOCK (&amp;frame-&gt;lock);</div><div class='del'>-	{</div><div class='del'>-		callcnt = --local-&gt;call_count;</div><div class='del'>-</div><div class='del'>-		if (op_ret == -1) {</div><div class='del'>-			local-&gt;op_errno = op_errno;</div><div class='del'>-			goto unlock;</div><div class='del'>-		}</div><div class='del'>-</div><div class='del'>-		local-&gt;op_ret = 0;</div><div class='del'>-	}</div><div class='del'>- unlock:</div><div class='del'>-	UNLOCK (&amp;frame-&gt;lock);</div><div class='del'>-</div><div class='del'>-	if (!callcnt) {</div><div class='del'>-		local_fd = local-&gt;fd;</div><div class='del'>-		local-&gt;fd = NULL;</div><div class='del'>-</div><div class='del'>-		STACK_UNWIND (frame, local-&gt;op_ret, </div><div class='del'>-			      local-&gt;op_errno, local_fd);</div><div class='del'>-</div><div class='del'>-		fd_unref (local_fd);</div><div class='del'>-	}</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-map_single_readdir_cbk (call_frame_t *frame,</div><div class='del'>-			void *cookie,</div><div class='del'>-			xlator_t *this,</div><div class='del'>-			int32_t op_ret,</div><div class='del'>-			int32_t op_errno,</div><div class='del'>-			gf_dirent_t *entries)</div><div class='del'>-{</div><div class='del'>-        call_frame_t *prev = NULL;</div><div class='del'>-	gf_dirent_t  *orig_entry = NULL;</div><div class='del'>-</div><div class='del'>-        prev  = cookie;</div><div class='del'>-</div><div class='del'>-	list_for_each_entry (orig_entry, &amp;entries-&gt;list, list) {</div><div class='del'>-		map_itransform (this, prev-&gt;this, orig_entry-&gt;d_ino, </div><div class='del'>-				&amp;orig_entry-&gt;d_ino);</div><div class='del'>-	}</div><div class='del'>-	STACK_UNWIND (frame, op_ret, op_errno, entries);</div><div class='del'>-	</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-map_single_readdirp_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-                         int32_t op_ret, int32_t op_errno, gf_dirent_t *entries)</div><div class='del'>-{</div><div class='del'>-        call_frame_t *prev = NULL;</div><div class='del'>-	gf_dirent_t  *orig_entry = NULL;</div><div class='del'>-</div><div class='del'>-        prev  = cookie;</div><div class='del'>-</div><div class='del'>-	list_for_each_entry (orig_entry, &amp;entries-&gt;list, list) {</div><div class='del'>-		map_itransform (this, prev-&gt;this, orig_entry-&gt;d_ino,</div><div class='del'>-				&amp;orig_entry-&gt;d_ino);</div><div class='del'>-                orig_entry-&gt;d_stat.ia_ino = orig_entry-&gt;d_ino;</div><div class='del'>-	}</div><div class='del'>-	STACK_UNWIND (frame, op_ret, op_errno, entries);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-map_readdir_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-                 int op_ret, int op_errno, gf_dirent_t *orig_entries);</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-map_readdirp_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-                 int op_ret, int op_errno, gf_dirent_t *orig_entries);</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-map_generic_readdir_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-                         int op_ret, int op_errno, gf_dirent_t *orig_entries,</div><div class='del'>-                         int whichop)</div><div class='del'>-{</div><div class='del'>-	map_local_t  *local = NULL;</div><div class='del'>-	gf_dirent_t   entries;</div><div class='del'>-	gf_dirent_t  *orig_entry = NULL;</div><div class='del'>-	gf_dirent_t  *entry = NULL;</div><div class='del'>-	call_frame_t *prev = NULL;</div><div class='del'>-	xlator_t     *subvol = NULL;</div><div class='del'>-	xlator_t     *next_subvol = NULL;</div><div class='del'>-        off_t         next_offset = 0;</div><div class='del'>-	int           count = 0;</div><div class='del'>-	fd_t         *local_fd = NULL;</div><div class='del'>-</div><div class='del'>-	INIT_LIST_HEAD (&amp;entries.list);</div><div class='del'>-	prev = cookie;</div><div class='del'>-	local = frame-&gt;local;</div><div class='del'>-</div><div class='del'>-	if (op_ret &lt; 0)</div><div class='del'>-		goto done;</div><div class='del'>-</div><div class='del'>-	list_for_each_entry (orig_entry, &amp;orig_entries-&gt;list, list) {</div><div class='del'>-		subvol = prev-&gt;this;</div><div class='del'>-</div><div class='del'>-		entry = gf_dirent_for_name (orig_entry-&gt;d_name);</div><div class='del'>-		if (!entry) {</div><div class='del'>-			gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-				"memory allocation failed :(");</div><div class='del'>-			goto unwind;</div><div class='del'>-		}</div><div class='del'>-		</div><div class='del'>-		map_itransform (this, subvol, orig_entry-&gt;d_ino,</div><div class='del'>-				&amp;entry-&gt;d_ino);</div><div class='del'>-		map_itransform (this, subvol, orig_entry-&gt;d_off,</div><div class='del'>-				&amp;entry-&gt;d_off);</div><div class='del'>-		</div><div class='del'>-                if (whichop == GF_FOP_READDIRP)</div><div class='del'>-                        entry-&gt;d_stat.ia_ino = entry-&gt;d_ino;</div><div class='del'>-		entry-&gt;d_type = orig_entry-&gt;d_type;</div><div class='del'>-		entry-&gt;d_len  = orig_entry-&gt;d_len;</div><div class='del'>-		</div><div class='del'>-		list_add_tail (&amp;entry-&gt;list, &amp;entries.list);</div><div class='del'>-		count++;</div><div class='del'>-                next_offset = orig_entry-&gt;d_off;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	op_ret = count;</div><div class='del'>-</div><div class='del'>-done:</div><div class='del'>-	if (count == 0) {</div><div class='del'>-                /* non-zero next_offset means that</div><div class='del'>-                   EOF is not yet hit on the current subvol</div><div class='del'>-                */</div><div class='del'>-                if (next_offset == 0) {</div><div class='del'>-                        next_subvol = map_subvol_next (this, prev-&gt;this);</div><div class='del'>-                } else {</div><div class='del'>-                        next_subvol = prev-&gt;this;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-		if (!next_subvol) {</div><div class='del'>-			goto unwind;</div><div class='del'>-		}</div><div class='del'>-</div><div class='del'>-                if (whichop == GF_FOP_READDIR)</div><div class='del'>-                        STACK_WIND (frame, map_readdir_cbk, next_subvol,</div><div class='del'>-                                    next_subvol-&gt;fops-&gt;readdir, local-&gt;fd,</div><div class='del'>-                                    local-&gt;size, 0);</div><div class='del'>-                else</div><div class='del'>-                        STACK_WIND (frame, map_readdirp_cbk, next_subvol,</div><div class='del'>-                                    next_subvol-&gt;fops-&gt;readdirp, local-&gt;fd,</div><div class='del'>-                                    local-&gt;size, 0);</div><div class='del'>-		return 0;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-unwind:</div><div class='del'>-	if (op_ret &lt; 0)</div><div class='del'>-		op_ret = 0;</div><div class='del'>-</div><div class='del'>-	local_fd = local-&gt;fd;</div><div class='del'>-	local-&gt;fd = NULL;</div><div class='del'>-</div><div class='del'>-	STACK_UNWIND (frame, op_ret, op_errno, &amp;entries);</div><div class='del'>-</div><div class='del'>-	fd_unref (local_fd);</div><div class='del'>-</div><div class='del'>-	gf_dirent_free (&amp;entries);</div><div class='del'>-</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-map_readdir_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-                 int op_ret, int op_errno, gf_dirent_t *orig_entries)</div><div class='del'>-{</div><div class='del'>-        map_generic_readdir_cbk (frame, cookie, this, op_ret, op_errno,</div><div class='del'>-                                 orig_entries, GF_FOP_READDIR);</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-map_readdirp_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-                  int op_ret, int op_errno, gf_dirent_t *orig_entries)</div><div class='del'>-{</div><div class='del'>-        map_generic_readdir_cbk (frame, cookie, this, op_ret, op_errno,</div><div class='del'>-                                 orig_entries, GF_FOP_READDIRP);</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-/* Management operations */</div><div class='del'>-</div><div class='del'>-static int32_t</div><div class='del'>-map_checksum_cbk (call_frame_t *frame,</div><div class='del'>-		      void *cookie,</div><div class='del'>-		      xlator_t *this,</div><div class='del'>-		      int32_t op_ret,</div><div class='del'>-		      int32_t op_errno,</div><div class='del'>-		      uint8_t *file_checksum,</div><div class='del'>-		      uint8_t *dir_checksum)</div><div class='del'>-{</div><div class='del'>-	STACK_UNWIND (frame, op_ret, op_errno, file_checksum, dir_checksum);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-/* Fops starts here */</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-map_stat (call_frame_t *frame,</div><div class='del'>-	  xlator_t *this,</div><div class='del'>-	  loc_t *loc)</div><div class='del'>-{</div><div class='del'>-	int32_t op_errno = 1;</div><div class='del'>-	xlator_t *subvol   = NULL;</div><div class='del'>-</div><div class='del'>-        VALIDATE_OR_GOTO (frame, err);</div><div class='del'>-        VALIDATE_OR_GOTO (this, err);</div><div class='del'>-        VALIDATE_OR_GOTO (loc, err);</div><div class='del'>-        VALIDATE_OR_GOTO (loc-&gt;inode, err);</div><div class='del'>-        VALIDATE_OR_GOTO (loc-&gt;path, err);</div><div class='del'>-</div><div class='del'>-	subvol = get_mapping_subvol_from_ctx (this, loc-&gt;inode);</div><div class='del'>-	if (!subvol) {</div><div class='del'>-		op_errno = EINVAL;</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	STACK_WIND (frame, map_stat_cbk, subvol, subvol-&gt;fops-&gt;stat, loc);</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>- err:</div><div class='del'>-	STACK_UNWIND (frame, -1, op_errno, NULL, NULL);</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-map_setattr (call_frame_t *frame,</div><div class='del'>-             xlator_t *this,</div><div class='del'>-             loc_t *loc,</div><div class='del'>-             struct iatt *stbuf,</div><div class='del'>-             int32_t valid)</div><div class='del'>-{</div><div class='del'>-	int32_t op_errno = 1;</div><div class='del'>-	xlator_t *subvol   = NULL;</div><div class='del'>-</div><div class='del'>-        GF_VALIDATE_OR_GOTO ("map", this, err);</div><div class='del'>-        GF_VALIDATE_OR_GOTO (this-&gt;name, frame, err);</div><div class='del'>-        GF_VALIDATE_OR_GOTO (this-&gt;name, loc, err);</div><div class='del'>-        GF_VALIDATE_OR_GOTO (this-&gt;name, loc-&gt;inode, err);</div><div class='del'>-        GF_VALIDATE_OR_GOTO (this-&gt;name, loc-&gt;path, err);</div><div class='del'>-        GF_VALIDATE_OR_GOTO (this-&gt;name, stbuf, err);</div><div class='del'>-</div><div class='del'>-	subvol = get_mapping_subvol_from_ctx (this, loc-&gt;inode);</div><div class='del'>-	if (!subvol) {</div><div class='del'>-		op_errno = EINVAL;</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	STACK_WIND (frame, map_setattr_cbk, subvol,</div><div class='del'>-		    subvol-&gt;fops-&gt;setattr, loc, stbuf, valid);</div><div class='del'>-	return 0;</div><div class='del'>- err:</div><div class='del'>-	STACK_UNWIND (frame, -1, op_errno, NULL, NULL);</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-map_fsetattr (call_frame_t *frame,</div><div class='del'>-              xlator_t *this,</div><div class='del'>-              fd_t *fd,</div><div class='del'>-              struct iatt *stbuf,</div><div class='del'>-              int32_t valid)</div><div class='del'>-{</div><div class='del'>-	int32_t op_errno = 1;</div><div class='del'>-	xlator_t *subvol   = NULL;</div><div class='del'>-</div><div class='del'>-        GF_VALIDATE_OR_GOTO ("map", this, err);</div><div class='del'>-        GF_VALIDATE_OR_GOTO (this-&gt;name, frame, err);</div><div class='del'>-        GF_VALIDATE_OR_GOTO (this-&gt;name, fd, err);</div><div class='del'>-        GF_VALIDATE_OR_GOTO (this-&gt;name, stbuf, err);</div><div class='del'>-</div><div class='del'>-	subvol = get_mapping_subvol_from_ctx (this, fd-&gt;inode);</div><div class='del'>-	if (!subvol) {</div><div class='del'>-		op_errno = EINVAL;</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	STACK_WIND (frame, map_fsetattr_cbk, subvol,</div><div class='del'>-		    subvol-&gt;fops-&gt;fsetattr, fd, stbuf, valid);</div><div class='del'>-	return 0;</div><div class='del'>- err:</div><div class='del'>-	STACK_UNWIND (frame, -1, op_errno, NULL, NULL);</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-map_truncate (call_frame_t *frame,</div><div class='del'>-	      xlator_t *this,</div><div class='del'>-	      loc_t *loc,</div><div class='del'>-	      off_t offset)</div><div class='del'>-{</div><div class='del'>-	int32_t op_errno = 1;</div><div class='del'>-	xlator_t *subvol   = NULL;</div><div class='del'>-</div><div class='del'>-        VALIDATE_OR_GOTO (frame, err);</div><div class='del'>-        VALIDATE_OR_GOTO (this, err);</div><div class='del'>-        VALIDATE_OR_GOTO (loc, err);</div><div class='del'>-        VALIDATE_OR_GOTO (loc-&gt;inode, err);</div><div class='del'>-        VALIDATE_OR_GOTO (loc-&gt;path, err);</div><div class='del'>-</div><div class='del'>-	subvol = get_mapping_subvol_from_ctx (this, loc-&gt;inode);</div><div class='del'>-	if (!subvol) {</div><div class='del'>-		op_errno = EINVAL;</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	STACK_WIND (frame, map_truncate_cbk, subvol, </div><div class='del'>-                    subvol-&gt;fops-&gt;truncate, loc, offset);</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>- err:</div><div class='del'>-	STACK_UNWIND (frame, -1, op_errno, NULL, NULL);</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-map_ftruncate (call_frame_t *frame,</div><div class='del'>-	       xlator_t *this,</div><div class='del'>-	       fd_t *fd,</div><div class='del'>-	       off_t offset)</div><div class='del'>-{</div><div class='del'>-	int32_t op_errno = 1;</div><div class='del'>-	xlator_t *subvol   = NULL;</div><div class='del'>-</div><div class='del'>-        VALIDATE_OR_GOTO (frame, err);</div><div class='del'>-        VALIDATE_OR_GOTO (this, err);</div><div class='del'>-        VALIDATE_OR_GOTO (fd, err);</div><div class='del'>-        VALIDATE_OR_GOTO (fd-&gt;inode, err);</div><div class='del'>-</div><div class='del'>-	subvol = get_mapping_subvol_from_ctx (this, fd-&gt;inode);</div><div class='del'>-	if (!subvol) {</div><div class='del'>-		op_errno = EINVAL;</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	STACK_WIND (frame, map_ftruncate_cbk, subvol,</div><div class='del'>-		    subvol-&gt;fops-&gt;ftruncate, fd, offset);</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>- err:</div><div class='del'>-	STACK_UNWIND (frame, -1, op_errno, NULL, NULL);</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-map_access (call_frame_t *frame,</div><div class='del'>-	    xlator_t *this,</div><div class='del'>-	    loc_t *loc,</div><div class='del'>-	    int32_t mask)</div><div class='del'>-{</div><div class='del'>-	int32_t op_errno = 1;</div><div class='del'>-	xlator_t *subvol   = NULL;</div><div class='del'>-</div><div class='del'>-        VALIDATE_OR_GOTO (frame, err);</div><div class='del'>-        VALIDATE_OR_GOTO (this, err);</div><div class='del'>-        VALIDATE_OR_GOTO (loc, err);</div><div class='del'>-        VALIDATE_OR_GOTO (loc-&gt;inode, err);</div><div class='del'>-        VALIDATE_OR_GOTO (loc-&gt;path, err);</div><div class='del'>-</div><div class='del'>-	subvol = get_mapping_subvol_from_ctx (this, loc-&gt;inode);</div><div class='del'>-	if (!subvol) {</div><div class='del'>-		op_errno = EINVAL;</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	STACK_WIND (frame, map_access_cbk, subvol,</div><div class='del'>-		    subvol-&gt;fops-&gt;access, loc, mask);</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>- err:</div><div class='del'>-	STACK_UNWIND (frame, -1, op_errno, NULL, NULL);</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-map_readlink (call_frame_t *frame,</div><div class='del'>-	      xlator_t *this,</div><div class='del'>-	      loc_t *loc,</div><div class='del'>-	      size_t size)</div><div class='del'>-{</div><div class='del'>-	int32_t op_errno = 1;</div><div class='del'>-	xlator_t *subvol   = NULL;</div><div class='del'>-</div><div class='del'>-        VALIDATE_OR_GOTO (frame, err);</div><div class='del'>-        VALIDATE_OR_GOTO (this, err);</div><div class='del'>-        VALIDATE_OR_GOTO (loc, err);</div><div class='del'>-        VALIDATE_OR_GOTO (loc-&gt;inode, err);</div><div class='del'>-        VALIDATE_OR_GOTO (loc-&gt;path, err);</div><div class='del'>-</div><div class='del'>-	subvol = get_mapping_subvol_from_ctx (this, loc-&gt;inode);</div><div class='del'>-	if (!subvol) {</div><div class='del'>-		op_errno = EINVAL;</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	STACK_WIND (frame, map_readlink_cbk, subvol,</div><div class='del'>-		    subvol-&gt;fops-&gt;readlink, loc, size);</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>- err:</div><div class='del'>-	STACK_UNWIND (frame, -1, op_errno, NULL, NULL);</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-map_unlink (call_frame_t *frame,</div><div class='del'>-	    xlator_t *this,</div><div class='del'>-	    loc_t *loc)</div><div class='del'>-{</div><div class='del'>-	int32_t op_errno = 1;</div><div class='del'>-	xlator_t *subvol   = NULL;</div><div class='del'>-</div><div class='del'>-        VALIDATE_OR_GOTO (frame, err);</div><div class='del'>-        VALIDATE_OR_GOTO (this, err);</div><div class='del'>-        VALIDATE_OR_GOTO (loc, err);</div><div class='del'>-        VALIDATE_OR_GOTO (loc-&gt;inode, err);</div><div class='del'>-        VALIDATE_OR_GOTO (loc-&gt;path, err);</div><div class='del'>-</div><div class='del'>-	subvol = get_mapping_subvol_from_ctx (this, loc-&gt;inode);</div><div class='del'>-	if (!subvol) {</div><div class='del'>-		op_errno = EINVAL;</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	STACK_WIND (frame, map_unlink_cbk, subvol, subvol-&gt;fops-&gt;unlink, loc);</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>- err:</div><div class='del'>-	STACK_UNWIND (frame, -1, op_errno, NULL, NULL);</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-map_rmdir (call_frame_t *frame,</div><div class='del'>-	   xlator_t *this,</div><div class='del'>-	   loc_t *loc)</div><div class='del'>-{</div><div class='del'>-	int32_t op_errno = 1;</div><div class='del'>-	xlator_t *subvol   = NULL;</div><div class='del'>-</div><div class='del'>-        VALIDATE_OR_GOTO (frame, err);</div><div class='del'>-        VALIDATE_OR_GOTO (this, err);</div><div class='del'>-        VALIDATE_OR_GOTO (loc, err);</div><div class='del'>-        VALIDATE_OR_GOTO (loc-&gt;inode, err);</div><div class='del'>-        VALIDATE_OR_GOTO (loc-&gt;path, err);</div><div class='del'>-</div><div class='del'>-	subvol = get_mapping_subvol_from_ctx (this, loc-&gt;inode);</div><div class='del'>-	if (!subvol) {</div><div class='del'>-		op_errno = EINVAL;</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	STACK_WIND (frame, map_rmdir_cbk, subvol, subvol-&gt;fops-&gt;rmdir, loc);</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>- err:</div><div class='del'>-	STACK_UNWIND (frame, -1, op_errno, NULL, NULL);</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-map_rename (call_frame_t *frame,</div><div class='del'>-	    xlator_t *this,</div><div class='del'>-	    loc_t *oldloc,</div><div class='del'>-	    loc_t *newloc)</div><div class='del'>-{</div><div class='del'>-	int32_t op_errno = 1;</div><div class='del'>-	xlator_t *old_subvol = NULL;</div><div class='del'>-	xlator_t *new_subvol = NULL;</div><div class='del'>-</div><div class='del'>-        VALIDATE_OR_GOTO (frame, err);</div><div class='del'>-        VALIDATE_OR_GOTO (this, err);</div><div class='del'>-        VALIDATE_OR_GOTO (oldloc, err);</div><div class='del'>-        VALIDATE_OR_GOTO (oldloc-&gt;inode, err);</div><div class='del'>-        VALIDATE_OR_GOTO (oldloc-&gt;path, err);</div><div class='del'>-        VALIDATE_OR_GOTO (newloc, err);</div><div class='del'>-</div><div class='del'>-	old_subvol = get_mapping_subvol_from_ctx (this, oldloc-&gt;inode);</div><div class='del'>-	if (!old_subvol) {</div><div class='del'>-		op_errno = EINVAL;</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	if (newloc-&gt;path) {</div><div class='del'>-		new_subvol = get_mapping_subvol_from_path (this, newloc-&gt;path);</div><div class='del'>-		if (new_subvol &amp;&amp; (new_subvol != old_subvol)) {</div><div class='del'>-			op_errno = EXDEV;</div><div class='del'>-			goto err;</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	STACK_WIND (frame, map_rename_cbk, old_subvol,</div><div class='del'>-		    old_subvol-&gt;fops-&gt;rename, oldloc, newloc);</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>- err:</div><div class='del'>-	STACK_UNWIND (frame, -1, op_errno, NULL, NULL);</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-map_link (call_frame_t *frame,</div><div class='del'>-	  xlator_t *this,</div><div class='del'>-	  loc_t *oldloc,</div><div class='del'>-	  loc_t *newloc)</div><div class='del'>-{</div><div class='del'>-	int32_t op_errno = 1;</div><div class='del'>-	xlator_t *old_subvol = NULL;</div><div class='del'>-	xlator_t *new_subvol = NULL;</div><div class='del'>-</div><div class='del'>-        VALIDATE_OR_GOTO (frame, err);</div><div class='del'>-        VALIDATE_OR_GOTO (this, err);</div><div class='del'>-        VALIDATE_OR_GOTO (oldloc, err);</div><div class='del'>-        VALIDATE_OR_GOTO (oldloc-&gt;inode, err);</div><div class='del'>-        VALIDATE_OR_GOTO (oldloc-&gt;path, err);</div><div class='del'>-        VALIDATE_OR_GOTO (newloc, err);</div><div class='del'>-</div><div class='del'>-	old_subvol = get_mapping_subvol_from_ctx (this, oldloc-&gt;inode);</div><div class='del'>-	if (!old_subvol) {</div><div class='del'>-		op_errno = EINVAL;</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	if (newloc-&gt;path) {</div><div class='del'>-		new_subvol = get_mapping_subvol_from_path (this, newloc-&gt;path);</div><div class='del'>-		if (new_subvol &amp;&amp; (new_subvol != old_subvol)) {</div><div class='del'>-			op_errno = EXDEV;</div><div class='del'>-			goto err;</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	STACK_WIND (frame, map_link_cbk, old_subvol,</div><div class='del'>-		    old_subvol-&gt;fops-&gt;link, oldloc, newloc);</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>- err:</div><div class='del'>-	STACK_UNWIND (frame, -1, op_errno, NULL, NULL);</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-map_open (call_frame_t *frame,</div><div class='del'>-	  xlator_t *this,</div><div class='del'>-	  loc_t *loc,</div><div class='del'>-	  int32_t flags, fd_t *fd, int wbflags)</div><div class='del'>-{</div><div class='del'>-	int32_t op_errno = 1;</div><div class='del'>-	xlator_t *subvol   = NULL;</div><div class='del'>-</div><div class='del'>-        VALIDATE_OR_GOTO (frame, err);</div><div class='del'>-        VALIDATE_OR_GOTO (this, err);</div><div class='del'>-        VALIDATE_OR_GOTO (loc, err);</div><div class='del'>-        VALIDATE_OR_GOTO (loc-&gt;inode, err);</div><div class='del'>-        VALIDATE_OR_GOTO (loc-&gt;path, err);</div><div class='del'>-</div><div class='del'>-	subvol = get_mapping_subvol_from_ctx (this, loc-&gt;inode);</div><div class='del'>-	if (!subvol) {</div><div class='del'>-		op_errno = EINVAL;</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	STACK_WIND (frame, map_open_cbk, subvol, </div><div class='del'>-                    subvol-&gt;fops-&gt;open, loc, flags, fd, wbflags);</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>- err:</div><div class='del'>-	STACK_UNWIND (frame, -1, op_errno, NULL, NULL);</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-map_readv (call_frame_t *frame,</div><div class='del'>-	   xlator_t *this,</div><div class='del'>-	   fd_t *fd,</div><div class='del'>-	   size_t size,</div><div class='del'>-	   off_t offset)</div><div class='del'>-{</div><div class='del'>-	int32_t op_errno = 1;</div><div class='del'>-	xlator_t *subvol   = NULL;</div><div class='del'>-</div><div class='del'>-        VALIDATE_OR_GOTO (frame, err);</div><div class='del'>-        VALIDATE_OR_GOTO (this, err);</div><div class='del'>-        VALIDATE_OR_GOTO (fd, err);</div><div class='del'>-        VALIDATE_OR_GOTO (fd-&gt;inode, err);</div><div class='del'>-</div><div class='del'>-	subvol = get_mapping_subvol_from_ctx (this, fd-&gt;inode);</div><div class='del'>-	if (!subvol) {</div><div class='del'>-		op_errno = EINVAL;</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	STACK_WIND (frame, map_readv_cbk, subvol,</div><div class='del'>-		    subvol-&gt;fops-&gt;readv, fd, size, offset);</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>- err:</div><div class='del'>-	STACK_UNWIND (frame, -1, op_errno, NULL, 0, NULL, NULL);</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-map_writev (call_frame_t *frame,</div><div class='del'>-	    xlator_t *this,</div><div class='del'>-	    fd_t *fd,</div><div class='del'>-	    struct iovec *vector,</div><div class='del'>-	    int32_t count,</div><div class='del'>-	    off_t off,</div><div class='del'>-            struct iobref *iobref)</div><div class='del'>-{</div><div class='del'>-	int32_t op_errno = 1;</div><div class='del'>-	xlator_t *subvol   = NULL;</div><div class='del'>-</div><div class='del'>-        VALIDATE_OR_GOTO (frame, err);</div><div class='del'>-        VALIDATE_OR_GOTO (this, err);</div><div class='del'>-        VALIDATE_OR_GOTO (fd, err);</div><div class='del'>-        VALIDATE_OR_GOTO (fd-&gt;inode, err);</div><div class='del'>-</div><div class='del'>-	subvol = get_mapping_subvol_from_ctx (this, fd-&gt;inode);</div><div class='del'>-	if (!subvol) {</div><div class='del'>-		op_errno = EINVAL;</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	STACK_WIND (frame, map_writev_cbk, subvol,</div><div class='del'>-		    subvol-&gt;fops-&gt;writev, fd, vector, count, off, iobref);</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>- err:</div><div class='del'>-	STACK_UNWIND (frame, -1, op_errno, NULL, NULL);</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-map_flush (call_frame_t *frame,</div><div class='del'>-	   xlator_t *this,</div><div class='del'>-	   fd_t *fd)</div><div class='del'>-{</div><div class='del'>-	int32_t op_errno = 1;</div><div class='del'>-	xlator_t *subvol   = NULL;</div><div class='del'>-</div><div class='del'>-        VALIDATE_OR_GOTO (frame, err);</div><div class='del'>-        VALIDATE_OR_GOTO (this, err);</div><div class='del'>-        VALIDATE_OR_GOTO (fd, err);</div><div class='del'>-        VALIDATE_OR_GOTO (fd-&gt;inode, err);</div><div class='del'>-</div><div class='del'>-	subvol = get_mapping_subvol_from_ctx (this, fd-&gt;inode);</div><div class='del'>-	if (!subvol) {</div><div class='del'>-		op_errno = EINVAL;</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	STACK_WIND (frame, map_flush_cbk, subvol, subvol-&gt;fops-&gt;flush, fd);</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>- err:</div><div class='del'>-	STACK_UNWIND (frame, -1, op_errno, NULL, NULL);</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-map_fsync (call_frame_t *frame,</div><div class='del'>-	   xlator_t *this,</div><div class='del'>-	   fd_t *fd,</div><div class='del'>-	   int32_t flags)</div><div class='del'>-{</div><div class='del'>-	int32_t op_errno = 1;</div><div class='del'>-	xlator_t *subvol   = NULL;</div><div class='del'>-</div><div class='del'>-        VALIDATE_OR_GOTO (frame, err);</div><div class='del'>-        VALIDATE_OR_GOTO (this, err);</div><div class='del'>-        VALIDATE_OR_GOTO (fd, err);</div><div class='del'>-        VALIDATE_OR_GOTO (fd-&gt;inode, err);</div><div class='del'>-</div><div class='del'>-	subvol = get_mapping_subvol_from_ctx (this, fd-&gt;inode);</div><div class='del'>-	if (!subvol) {</div><div class='del'>-		op_errno = EINVAL;</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	STACK_WIND (frame, map_fsync_cbk, subvol,</div><div class='del'>-		    subvol-&gt;fops-&gt;fsync, fd, flags);</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>- err:</div><div class='del'>-	STACK_UNWIND (frame, -1, op_errno, NULL, NULL);</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-map_fstat (call_frame_t *frame,</div><div class='del'>-	   xlator_t *this,</div><div class='del'>-	   fd_t *fd)</div><div class='del'>-{</div><div class='del'>-	int32_t op_errno = 1;</div><div class='del'>-	xlator_t *subvol   = NULL;</div><div class='del'>-</div><div class='del'>-        VALIDATE_OR_GOTO (frame, err);</div><div class='del'>-        VALIDATE_OR_GOTO (this, err);</div><div class='del'>-        VALIDATE_OR_GOTO (fd, err);</div><div class='del'>-        VALIDATE_OR_GOTO (fd-&gt;inode, err);</div><div class='del'>-</div><div class='del'>-	subvol = get_mapping_subvol_from_ctx (this, fd-&gt;inode);</div><div class='del'>-	if (!subvol) {</div><div class='del'>-		op_errno = EINVAL;</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	STACK_WIND (frame, map_fstat_cbk, subvol, subvol-&gt;fops-&gt;fstat, fd);</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>- err:</div><div class='del'>-	STACK_UNWIND (frame, -1, op_errno, NULL, NULL);</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-map_getdents (call_frame_t *frame,</div><div class='del'>-	      xlator_t *this,</div><div class='del'>-	      fd_t *fd,</div><div class='del'>-	      size_t size,</div><div class='del'>-	      off_t offset,</div><div class='del'>-	      int32_t flag)</div><div class='del'>-{</div><div class='del'>-	int32_t op_errno = 1;</div><div class='del'>-	xlator_t *subvol   = NULL;</div><div class='del'>-</div><div class='del'>-        VALIDATE_OR_GOTO (frame, err);</div><div class='del'>-        VALIDATE_OR_GOTO (this, err);</div><div class='del'>-        VALIDATE_OR_GOTO (fd, err);</div><div class='del'>-        VALIDATE_OR_GOTO (fd-&gt;inode, err);</div><div class='del'>-</div><div class='del'>-	subvol = get_mapping_subvol_from_ctx (this, fd-&gt;inode);</div><div class='del'>-	if (!subvol) {</div><div class='del'>-		op_errno = EINVAL;</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	STACK_WIND (frame, map_getdents_cbk, subvol,</div><div class='del'>-		    subvol-&gt;fops-&gt;getdents, fd, size, offset, flag);</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>- err:</div><div class='del'>-	STACK_UNWIND (frame, -1, op_errno, NULL, NULL);</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-map_setdents (call_frame_t *frame,</div><div class='del'>-	      xlator_t *this,</div><div class='del'>-	      fd_t *fd,</div><div class='del'>-	      int32_t flags,</div><div class='del'>-	      dir_entry_t *entries,</div><div class='del'>-	      int32_t count)</div><div class='del'>-{</div><div class='del'>-	int32_t op_errno = 1;</div><div class='del'>-	xlator_t *subvol   = NULL;</div><div class='del'>-</div><div class='del'>-        VALIDATE_OR_GOTO (frame, err);</div><div class='del'>-        VALIDATE_OR_GOTO (this, err);</div><div class='del'>-        VALIDATE_OR_GOTO (fd, err);</div><div class='del'>-        VALIDATE_OR_GOTO (fd-&gt;inode, err);</div><div class='del'>-</div><div class='del'>-	subvol = get_mapping_subvol_from_ctx (this, fd-&gt;inode);</div><div class='del'>-	if (!subvol) {</div><div class='del'>-		op_errno = EINVAL;</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	STACK_WIND (frame, map_setdents_cbk, subvol,</div><div class='del'>-		    subvol-&gt;fops-&gt;setdents, fd, flags, entries, count);</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>- err:</div><div class='del'>-	STACK_UNWIND (frame, -1, op_errno, NULL, NULL);</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-map_fsyncdir (call_frame_t *frame,</div><div class='del'>-	      xlator_t *this,</div><div class='del'>-	      fd_t *fd,</div><div class='del'>-	      int32_t flags)</div><div class='del'>-{</div><div class='del'>-	int32_t op_errno = 1;</div><div class='del'>-	xlator_t *subvol   = NULL;</div><div class='del'>-</div><div class='del'>-        VALIDATE_OR_GOTO (frame, err);</div><div class='del'>-        VALIDATE_OR_GOTO (this, err);</div><div class='del'>-        VALIDATE_OR_GOTO (fd, err);</div><div class='del'>-        VALIDATE_OR_GOTO (fd-&gt;inode, err);</div><div class='del'>-</div><div class='del'>-	subvol = get_mapping_subvol_from_ctx (this, fd-&gt;inode);</div><div class='del'>-	if (!subvol) {</div><div class='del'>-		op_errno = EINVAL;</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	STACK_WIND (frame, map_fsyncdir_cbk, subvol,</div><div class='del'>-		    subvol-&gt;fops-&gt;fsyncdir, fd, flags);</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>- err:</div><div class='del'>-	STACK_UNWIND (frame, -1, op_errno, NULL, NULL);</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-map_setxattr (call_frame_t *frame,</div><div class='del'>-	      xlator_t *this,</div><div class='del'>-	      loc_t *loc,</div><div class='del'>-	      dict_t *dict,</div><div class='del'>-	      int32_t flags)</div><div class='del'>-{</div><div class='del'>-	int32_t op_errno = 1;</div><div class='del'>-	xlator_t *subvol   = NULL;</div><div class='del'>-</div><div class='del'>-        VALIDATE_OR_GOTO (frame, err);</div><div class='del'>-        VALIDATE_OR_GOTO (this, err);</div><div class='del'>-        VALIDATE_OR_GOTO (loc, err);</div><div class='del'>-        VALIDATE_OR_GOTO (loc-&gt;inode, err);</div><div class='del'>-        VALIDATE_OR_GOTO (loc-&gt;path, err);</div><div class='del'>-</div><div class='del'>-	subvol = get_mapping_subvol_from_ctx (this, loc-&gt;inode);</div><div class='del'>-	if (!subvol) {</div><div class='del'>-		op_errno = EINVAL;</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	STACK_WIND (frame, map_setxattr_cbk, subvol,</div><div class='del'>-		    subvol-&gt;fops-&gt;setxattr, loc, dict, flags);</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>- err:</div><div class='del'>-	STACK_UNWIND (frame, -1, op_errno, NULL, NULL);</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-map_getxattr (call_frame_t *frame,</div><div class='del'>-	      xlator_t *this,</div><div class='del'>-	      loc_t *loc,</div><div class='del'>-	      const char *name)</div><div class='del'>-{</div><div class='del'>-	int32_t op_errno = 1;</div><div class='del'>-	xlator_t *subvol   = NULL;</div><div class='del'>-</div><div class='del'>-        VALIDATE_OR_GOTO (frame, err);</div><div class='del'>-        VALIDATE_OR_GOTO (this, err);</div><div class='del'>-        VALIDATE_OR_GOTO (loc, err);</div><div class='del'>-        VALIDATE_OR_GOTO (loc-&gt;inode, err);</div><div class='del'>-        VALIDATE_OR_GOTO (loc-&gt;path, err);</div><div class='del'>-</div><div class='del'>-	subvol = get_mapping_subvol_from_ctx (this, loc-&gt;inode);</div><div class='del'>-	if (!subvol) {</div><div class='del'>-		op_errno = EINVAL;</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	STACK_WIND (frame, map_getxattr_cbk, subvol,</div><div class='del'>-		    subvol-&gt;fops-&gt;getxattr, loc, name);</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>- err:</div><div class='del'>-	STACK_UNWIND (frame, -1, op_errno, NULL, NULL);</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-map_fsetxattr (call_frame_t *frame,</div><div class='del'>-               xlator_t *this,</div><div class='del'>-               fd_t *fd,</div><div class='del'>-               dict_t *dict,</div><div class='del'>-               int32_t flags)</div><div class='del'>-{</div><div class='del'>-	int32_t   op_errno = 1;</div><div class='del'>-	xlator_t *subvol   = NULL;</div><div class='del'>-</div><div class='del'>-        VALIDATE_OR_GOTO (frame, err);</div><div class='del'>-        VALIDATE_OR_GOTO (this, err);</div><div class='del'>-        VALIDATE_OR_GOTO (fd, err);</div><div class='del'>-        VALIDATE_OR_GOTO (fd-&gt;inode, err);</div><div class='del'>-</div><div class='del'>-	subvol = get_mapping_subvol_from_ctx (this, fd-&gt;inode);</div><div class='del'>-	if (!subvol) {</div><div class='del'>-		op_errno = EINVAL;</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	STACK_WIND (frame, map_fsetxattr_cbk, subvol, </div><div class='del'>-                    subvol-&gt;fops-&gt;fsetxattr, fd, dict, flags);</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>- err:</div><div class='del'>-	STACK_UNWIND (frame, -1, op_errno, NULL, NULL);</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-map_fgetxattr (call_frame_t *frame,</div><div class='del'>-               xlator_t *this,</div><div class='del'>-               fd_t *fd,</div><div class='del'>-               const char *name)</div><div class='del'>-{</div><div class='del'>-	int32_t   op_errno = 1;</div><div class='del'>-	xlator_t *subvol   = NULL;</div><div class='del'>-</div><div class='del'>-        VALIDATE_OR_GOTO (frame, err);</div><div class='del'>-        VALIDATE_OR_GOTO (this, err);</div><div class='del'>-        VALIDATE_OR_GOTO (fd, err);</div><div class='del'>-        VALIDATE_OR_GOTO (fd-&gt;inode, err);</div><div class='del'>-</div><div class='del'>-	subvol = get_mapping_subvol_from_ctx (this, fd-&gt;inode);</div><div class='del'>-	if (!subvol) {</div><div class='del'>-		op_errno = EINVAL;</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	STACK_WIND (frame, map_fgetxattr_cbk, subvol,</div><div class='del'>-		    subvol-&gt;fops-&gt;fgetxattr, fd, name);</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>- err:</div><div class='del'>-	STACK_UNWIND (frame, -1, op_errno, NULL, NULL);</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-map_xattrop (call_frame_t *frame,</div><div class='del'>-	     xlator_t *this,</div><div class='del'>-	     loc_t *loc,</div><div class='del'>-	     gf_xattrop_flags_t flags,</div><div class='del'>-	     dict_t *dict)</div><div class='del'>-{</div><div class='del'>-	int32_t op_errno = 1;</div><div class='del'>-	xlator_t *subvol   = NULL;</div><div class='del'>-</div><div class='del'>-        VALIDATE_OR_GOTO (frame, err);</div><div class='del'>-        VALIDATE_OR_GOTO (this, err);</div><div class='del'>-        VALIDATE_OR_GOTO (loc, err);</div><div class='del'>-        VALIDATE_OR_GOTO (loc-&gt;inode, err);</div><div class='del'>-        VALIDATE_OR_GOTO (loc-&gt;path, err);</div><div class='del'>-</div><div class='del'>-	subvol = get_mapping_subvol_from_ctx (this, loc-&gt;inode);</div><div class='del'>-	if (!subvol) {</div><div class='del'>-		op_errno = EINVAL;</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	STACK_WIND (frame, map_xattrop_cbk, subvol,</div><div class='del'>-		    subvol-&gt;fops-&gt;xattrop, loc, flags, dict);</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>- err:</div><div class='del'>-	STACK_UNWIND (frame, -1, op_errno, NULL, NULL);</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-map_fxattrop (call_frame_t *frame,</div><div class='del'>-	      xlator_t *this,</div><div class='del'>-	      fd_t *fd,</div><div class='del'>-	      gf_xattrop_flags_t flags,</div><div class='del'>-	      dict_t *dict)</div><div class='del'>-{</div><div class='del'>-	int32_t op_errno = 1;</div><div class='del'>-	xlator_t *subvol   = NULL;</div><div class='del'>-</div><div class='del'>-        VALIDATE_OR_GOTO (frame, err);</div><div class='del'>-        VALIDATE_OR_GOTO (this, err);</div><div class='del'>-        VALIDATE_OR_GOTO (fd, err);</div><div class='del'>-        VALIDATE_OR_GOTO (fd-&gt;inode, err);</div><div class='del'>-</div><div class='del'>-	subvol = get_mapping_subvol_from_ctx (this, fd-&gt;inode);</div><div class='del'>-	if (!subvol) {</div><div class='del'>-		op_errno = EINVAL;</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	STACK_WIND (frame, map_fxattrop_cbk, subvol,</div><div class='del'>-		    subvol-&gt;fops-&gt;fxattrop, fd, flags, dict);</div><div class='del'>-</div><div class='del'>-        return 0;</div><div class='del'>- err:</div><div class='del'>-	STACK_UNWIND (frame, -1, op_errno, NULL, NULL);</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-map_removexattr (call_frame_t *frame,</div><div class='del'>-		 xlator_t *this,</div><div class='del'>-		 loc_t *loc,</div><div class='del'>-		 const char *name)</div><div class='del'>-{</div><div class='del'>-	int32_t op_errno = 1;</div><div class='del'>-	xlator_t *subvol   = NULL;</div><div class='del'>-</div><div class='del'>-        VALIDATE_OR_GOTO (frame, err);</div><div class='del'>-        VALIDATE_OR_GOTO (this, err);</div><div class='del'>-        VALIDATE_OR_GOTO (loc, err);</div><div class='del'>-        VALIDATE_OR_GOTO (loc-&gt;inode, err);</div><div class='del'>-        VALIDATE_OR_GOTO (loc-&gt;path, err);</div><div class='del'>-</div><div class='del'>-	subvol = get_mapping_subvol_from_ctx (this, loc-&gt;inode);</div><div class='del'>-	if (!subvol) {</div><div class='del'>-		op_errno = EINVAL;</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	STACK_WIND (frame, map_removexattr_cbk, subvol,</div><div class='del'>-		    subvol-&gt;fops-&gt;removexattr, loc, name);</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>- err:</div><div class='del'>-	STACK_UNWIND (frame, -1, op_errno, NULL, NULL);</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-map_lk (call_frame_t *frame,</div><div class='del'>-	xlator_t *this,</div><div class='del'>-	fd_t *fd,</div><div class='del'>-	int32_t cmd,</div><div class='del'>-	struct flock *lock)</div><div class='del'>-{</div><div class='del'>-	int32_t op_errno = 1;</div><div class='del'>-	xlator_t *subvol   = NULL;</div><div class='del'>-</div><div class='del'>-        VALIDATE_OR_GOTO (frame, err);</div><div class='del'>-        VALIDATE_OR_GOTO (this, err);</div><div class='del'>-        VALIDATE_OR_GOTO (fd, err);</div><div class='del'>-        VALIDATE_OR_GOTO (fd-&gt;inode, err);</div><div class='del'>-</div><div class='del'>-	subvol = get_mapping_subvol_from_ctx (this, fd-&gt;inode);</div><div class='del'>-	if (!subvol) {</div><div class='del'>-		op_errno = EINVAL;</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	STACK_WIND (frame, map_lk_cbk, subvol,</div><div class='del'>-		    subvol-&gt;fops-&gt;lk, fd, cmd, lock);</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>- err:</div><div class='del'>-	STACK_UNWIND (frame, -1, op_errno, NULL, NULL);</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-map_inodelk (call_frame_t *frame, xlator_t *this,</div><div class='del'>-	     const char *volume, loc_t *loc, int32_t cmd, struct flock *lock)</div><div class='del'>-{</div><div class='del'>-	int32_t op_errno = 1;</div><div class='del'>-	xlator_t *subvol   = NULL;</div><div class='del'>-</div><div class='del'>-        VALIDATE_OR_GOTO (frame, err);</div><div class='del'>-        VALIDATE_OR_GOTO (this, err);</div><div class='del'>-        VALIDATE_OR_GOTO (loc, err);</div><div class='del'>-        VALIDATE_OR_GOTO (loc-&gt;inode, err);</div><div class='del'>-        VALIDATE_OR_GOTO (loc-&gt;path, err);</div><div class='del'>-</div><div class='del'>-	subvol = get_mapping_subvol_from_ctx (this, loc-&gt;inode);</div><div class='del'>-	if (!subvol) {</div><div class='del'>-		op_errno = EINVAL;</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	STACK_WIND (frame, map_inodelk_cbk, subvol,</div><div class='del'>-		    subvol-&gt;fops-&gt;inodelk, volume, loc, cmd, lock);</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>- err:</div><div class='del'>-	STACK_UNWIND (frame, -1, op_errno, NULL, NULL);</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-map_finodelk (call_frame_t *frame, xlator_t *this,</div><div class='del'>-	      const char *volume, fd_t *fd, int32_t cmd, struct flock *lock)</div><div class='del'>-{</div><div class='del'>-	int32_t op_errno = 1;</div><div class='del'>-	xlator_t *subvol   = NULL;</div><div class='del'>-</div><div class='del'>-        VALIDATE_OR_GOTO (frame, err);</div><div class='del'>-        VALIDATE_OR_GOTO (this, err);</div><div class='del'>-        VALIDATE_OR_GOTO (fd, err);</div><div class='del'>-        VALIDATE_OR_GOTO (fd-&gt;inode, err);</div><div class='del'>-</div><div class='del'>-	subvol = get_mapping_subvol_from_ctx (this, fd-&gt;inode);</div><div class='del'>-	if (!subvol) {</div><div class='del'>-		op_errno = EINVAL;</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	STACK_WIND (frame, map_finodelk_cbk, subvol,</div><div class='del'>-		    subvol-&gt;fops-&gt;finodelk, volume, fd, cmd, lock);</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>- err:</div><div class='del'>-	STACK_UNWIND (frame, -1, op_errno, NULL, NULL);</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-map_entrylk (call_frame_t *frame, xlator_t *this,</div><div class='del'>-	     const char *volume, loc_t *loc, const char *basename,</div><div class='del'>-	     entrylk_cmd cmd, entrylk_type type)</div><div class='del'>-{</div><div class='del'>-	int32_t op_errno = 1;</div><div class='del'>-	xlator_t *subvol   = NULL;</div><div class='del'>-</div><div class='del'>-        VALIDATE_OR_GOTO (frame, err);</div><div class='del'>-        VALIDATE_OR_GOTO (this, err);</div><div class='del'>-        VALIDATE_OR_GOTO (loc, err);</div><div class='del'>-        VALIDATE_OR_GOTO (loc-&gt;inode, err);</div><div class='del'>-        VALIDATE_OR_GOTO (loc-&gt;path, err);</div><div class='del'>-</div><div class='del'>-	subvol = get_mapping_subvol_from_ctx (this, loc-&gt;inode);</div><div class='del'>-	if (!subvol) {</div><div class='del'>-		op_errno = EINVAL;</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	STACK_WIND (frame, map_entrylk_cbk, subvol,</div><div class='del'>-		    subvol-&gt;fops-&gt;entrylk, volume, loc, basename, cmd, type);</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>- err:</div><div class='del'>-	STACK_UNWIND (frame, -1, op_errno, NULL, NULL);</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-map_fentrylk (call_frame_t *frame, xlator_t *this,</div><div class='del'>-	      const char *volume, fd_t *fd, const char *basename,</div><div class='del'>-	      entrylk_cmd cmd, entrylk_type type)</div><div class='del'>-{</div><div class='del'>-	int32_t op_errno = 1;</div><div class='del'>-	xlator_t *subvol   = NULL;</div><div class='del'>-</div><div class='del'>-        VALIDATE_OR_GOTO (frame, err);</div><div class='del'>-        VALIDATE_OR_GOTO (this, err);</div><div class='del'>-        VALIDATE_OR_GOTO (fd, err);</div><div class='del'>-        VALIDATE_OR_GOTO (fd-&gt;inode, err);</div><div class='del'>-</div><div class='del'>-	subvol = get_mapping_subvol_from_ctx (this, fd-&gt;inode);</div><div class='del'>-	if (!subvol) {</div><div class='del'>-		op_errno = EINVAL;</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	STACK_WIND (frame, map_fentrylk_cbk, subvol,</div><div class='del'>-		    subvol-&gt;fops-&gt;fentrylk, volume, fd, basename, cmd, type);</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>- err:</div><div class='del'>-	STACK_UNWIND (frame, -1, op_errno, NULL, NULL);</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-map_checksum (call_frame_t *frame,</div><div class='del'>-	      xlator_t *this,</div><div class='del'>-	      loc_t *loc,</div><div class='del'>-	      int32_t flag)</div><div class='del'>-{</div><div class='del'>-	int32_t op_errno = 1;</div><div class='del'>-	xlator_t *subvol   = NULL;</div><div class='del'>-</div><div class='del'>-        VALIDATE_OR_GOTO (frame, err);</div><div class='del'>-        VALIDATE_OR_GOTO (this, err);</div><div class='del'>-        VALIDATE_OR_GOTO (loc, err);</div><div class='del'>-        VALIDATE_OR_GOTO (loc-&gt;inode, err);</div><div class='del'>-        VALIDATE_OR_GOTO (loc-&gt;path, err);</div><div class='del'>-</div><div class='del'>-	subvol = get_mapping_subvol_from_ctx (this, loc-&gt;inode);</div><div class='del'>-	if (!subvol) {</div><div class='del'>-		op_errno = EINVAL;</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	STACK_WIND (frame, map_checksum_cbk, subvol,</div><div class='del'>-		    subvol-&gt;fops-&gt;checksum, loc, flag);</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>- err:</div><div class='del'>-	STACK_UNWIND (frame, -1, op_errno, NULL, NULL);</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-map_mknod (call_frame_t *frame,</div><div class='del'>-	   xlator_t *this,</div><div class='del'>-	   loc_t *loc,</div><div class='del'>-	   mode_t mode,</div><div class='del'>-	   dev_t rdev)</div><div class='del'>-{</div><div class='del'>-	int32_t op_errno = 1;</div><div class='del'>-	xlator_t *subvol   = NULL;</div><div class='del'>-</div><div class='del'>-        VALIDATE_OR_GOTO (frame, err);</div><div class='del'>-        VALIDATE_OR_GOTO (this, err);</div><div class='del'>-        VALIDATE_OR_GOTO (loc, err);</div><div class='del'>-        VALIDATE_OR_GOTO (loc-&gt;path, err);</div><div class='del'>-        VALIDATE_OR_GOTO (loc-&gt;inode, err);</div><div class='del'>-</div><div class='del'>-	subvol = get_mapping_subvol_from_path (this, loc-&gt;path);</div><div class='del'>-	if (!subvol) {</div><div class='del'>-		op_errno = EINVAL;</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='del'>-	</div><div class='del'>-	op_errno = inode_ctx_put (loc-&gt;inode, this, (uint64_t)(long)subvol);</div><div class='del'>-	if (op_errno != 0) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-			"%s: failed to set subvolume ptr in inode ctx",</div><div class='del'>-			loc-&gt;path);</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	STACK_WIND (frame, map_newentry_cbk, subvol,</div><div class='del'>-		    subvol-&gt;fops-&gt;mknod, loc, mode, rdev);</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>- err:</div><div class='del'>-	STACK_UNWIND (frame, -1, op_errno, NULL, NULL);</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-map_mkdir (call_frame_t *frame,</div><div class='del'>-	   xlator_t *this,</div><div class='del'>-	   loc_t *loc,</div><div class='del'>-	   mode_t mode)</div><div class='del'>-{</div><div class='del'>-	int32_t op_errno = 1;</div><div class='del'>-	xlator_t *subvol   = NULL;</div><div class='del'>-</div><div class='del'>-        VALIDATE_OR_GOTO (frame, err);</div><div class='del'>-        VALIDATE_OR_GOTO (this, err);</div><div class='del'>-        VALIDATE_OR_GOTO (loc, err);</div><div class='del'>-        VALIDATE_OR_GOTO (loc-&gt;path, err);</div><div class='del'>-        VALIDATE_OR_GOTO (loc-&gt;inode, err);</div><div class='del'>-</div><div class='del'>-	subvol = get_mapping_subvol_from_path (this, loc-&gt;path);</div><div class='del'>-	if (!subvol) {</div><div class='del'>-		op_errno = EINVAL;</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	op_errno = inode_ctx_put (loc-&gt;inode, this, (uint64_t)(long)subvol);</div><div class='del'>-	if (op_errno != 0) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-			"%s: failed to set subvolume ptr in inode ctx",</div><div class='del'>-			loc-&gt;path);</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	STACK_WIND (frame, map_newentry_cbk, subvol,</div><div class='del'>-		    subvol-&gt;fops-&gt;mkdir, loc, mode);</div><div class='del'>-	return 0;</div><div class='del'>- err:</div><div class='del'>-	STACK_UNWIND (frame, -1, op_errno, NULL, NULL);</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-map_symlink (call_frame_t *frame,</div><div class='del'>-	     xlator_t *this,</div><div class='del'>-	     const char *linkpath,</div><div class='del'>-	     loc_t *loc)</div><div class='del'>-{</div><div class='del'>-	int32_t op_errno = 1;</div><div class='del'>-	xlator_t *subvol   = NULL;</div><div class='del'>-</div><div class='del'>-        VALIDATE_OR_GOTO (frame, err);</div><div class='del'>-        VALIDATE_OR_GOTO (this, err);</div><div class='del'>-        VALIDATE_OR_GOTO (loc, err);</div><div class='del'>-        VALIDATE_OR_GOTO (loc-&gt;path, err);</div><div class='del'>-        VALIDATE_OR_GOTO (loc-&gt;inode, err);</div><div class='del'>-</div><div class='del'>-	subvol = get_mapping_subvol_from_path (this, loc-&gt;path);</div><div class='del'>-	if (!subvol) {</div><div class='del'>-		op_errno = EINVAL;</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='del'>-	</div><div class='del'>-	op_errno = inode_ctx_put (loc-&gt;inode, this, (uint64_t)(long)subvol);</div><div class='del'>-	if (op_errno != 0) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-			"%s: failed to set subvolume ptr in inode ctx",</div><div class='del'>-			loc-&gt;path);</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	STACK_WIND (frame, map_newentry_cbk, subvol,</div><div class='del'>-		    subvol-&gt;fops-&gt;symlink, linkpath, loc);</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>- err:</div><div class='del'>-	STACK_UNWIND (frame, -1, op_errno, NULL, NULL);</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-map_create (call_frame_t *frame,</div><div class='del'>-	    xlator_t *this,</div><div class='del'>-	    loc_t *loc,</div><div class='del'>-	    int32_t flags,</div><div class='del'>-	    mode_t mode, fd_t *fd)</div><div class='del'>-{</div><div class='del'>-	int32_t op_errno = 1;</div><div class='del'>-	xlator_t *subvol   = NULL;</div><div class='del'>-</div><div class='del'>-        VALIDATE_OR_GOTO (frame, err);</div><div class='del'>-        VALIDATE_OR_GOTO (this, err);</div><div class='del'>-        VALIDATE_OR_GOTO (loc, err);</div><div class='del'>-        VALIDATE_OR_GOTO (loc-&gt;path, err);</div><div class='del'>-        VALIDATE_OR_GOTO (loc-&gt;inode, err);</div><div class='del'>-</div><div class='del'>-	subvol = get_mapping_subvol_from_path (this, loc-&gt;path);</div><div class='del'>-	if (!subvol) {</div><div class='del'>-		op_errno = EINVAL;</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	op_errno = inode_ctx_put (loc-&gt;inode, this, (uint64_t)(long)subvol);</div><div class='del'>-	if (op_errno != 0) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-			"%s: failed to set subvolume ptr in inode ctx",</div><div class='del'>-			loc-&gt;path);</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	STACK_WIND (frame, map_create_cbk, subvol,</div><div class='del'>-		    subvol-&gt;fops-&gt;create, loc, flags, mode, fd);</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>- err:</div><div class='del'>-	STACK_UNWIND (frame, -1, op_errno, NULL, NULL);</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-map_lookup (call_frame_t *frame,</div><div class='del'>-	    xlator_t *this,</div><div class='del'>-	    loc_t *loc,</div><div class='del'>-	    dict_t *xattr_req)</div><div class='del'>-{</div><div class='del'>-	int32_t op_errno = EINVAL;</div><div class='del'>-	xlator_t *subvol   = NULL;</div><div class='del'>-	map_local_t *local = NULL;</div><div class='del'>-	map_private_t *priv = NULL;</div><div class='del'>-	xlator_list_t *trav = NULL;</div><div class='del'>-</div><div class='del'>-        VALIDATE_OR_GOTO (frame, err);</div><div class='del'>-        VALIDATE_OR_GOTO (this, err);</div><div class='del'>-        VALIDATE_OR_GOTO (loc, err);</div><div class='del'>-        VALIDATE_OR_GOTO (loc-&gt;path, err);</div><div class='del'>-        VALIDATE_OR_GOTO (loc-&gt;inode, err);</div><div class='del'>-</div><div class='del'>-	priv = this-&gt;private;</div><div class='del'>-</div><div class='del'>-	if (loc-&gt;inode-&gt;ino == 1)</div><div class='del'>-		goto root_inode;</div><div class='del'>-</div><div class='del'>-	subvol = get_mapping_subvol_from_ctx (this, loc-&gt;inode);</div><div class='del'>-	if (!subvol) {</div><div class='del'>-		subvol = get_mapping_subvol_from_path (this, loc-&gt;path);</div><div class='del'>-		if (!subvol) {</div><div class='del'>-			goto err;</div><div class='del'>-		}</div><div class='del'>-</div><div class='del'>-		op_errno = inode_ctx_put (loc-&gt;inode, this, </div><div class='del'>-					  (uint64_t)(long)subvol);</div><div class='del'>-		if (op_errno != 0) {</div><div class='del'>-			gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-				"%s: failed to set subvolume in inode ctx",</div><div class='del'>-				loc-&gt;path);</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	/* Just one callback */</div><div class='del'>-	STACK_WIND (frame, map_single_lookup_cbk, subvol,</div><div class='del'>-		    subvol-&gt;fops-&gt;lookup, loc, xattr_req);</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>-</div><div class='del'>- root_inode:</div><div class='del'>-	local = GF_CALLOC (1, sizeof (map_local_t),</div><div class='del'>-                           gf_map_mt_map_local_t);</div><div class='del'>-</div><div class='del'>-	frame-&gt;local = local;</div><div class='del'>-	local-&gt;call_count = priv-&gt;child_count;</div><div class='del'>-	local-&gt;op_ret = -1;</div><div class='del'>-</div><div class='del'>-	trav = this-&gt;children;</div><div class='del'>-	while (trav) {</div><div class='del'>-		STACK_WIND (frame, map_root_lookup_cbk, trav-&gt;xlator,</div><div class='del'>-			    trav-&gt;xlator-&gt;fops-&gt;lookup, loc, xattr_req);</div><div class='del'>-		trav = trav-&gt;next;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>-</div><div class='del'>- err:</div><div class='del'>-	STACK_UNWIND (frame, -1, op_errno, NULL, NULL);</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-map_statfs (call_frame_t *frame,</div><div class='del'>-	    xlator_t *this,</div><div class='del'>-	    loc_t *loc)</div><div class='del'>-{</div><div class='del'>-	int32_t op_errno = EINVAL;</div><div class='del'>-	xlator_t *subvol   = NULL;</div><div class='del'>-	map_local_t *local = NULL;</div><div class='del'>-	map_private_t *priv = NULL;</div><div class='del'>-	xlator_list_t *trav = NULL;</div><div class='del'>-</div><div class='del'>-        VALIDATE_OR_GOTO (frame, err);</div><div class='del'>-        VALIDATE_OR_GOTO (this, err);</div><div class='del'>-        VALIDATE_OR_GOTO (loc, err);</div><div class='del'>-        VALIDATE_OR_GOTO (loc-&gt;path, err);</div><div class='del'>-        VALIDATE_OR_GOTO (loc-&gt;inode, err);</div><div class='del'>-</div><div class='del'>-	if (loc-&gt;inode-&gt;ino == 1)</div><div class='del'>-		goto root_inode;</div><div class='del'>-	subvol = get_mapping_subvol_from_ctx (this, loc-&gt;inode);</div><div class='del'>-	if (!subvol) {</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='del'>-	</div><div class='del'>-	/* Just one callback */</div><div class='del'>-	STACK_WIND (frame, map_statfs_cbk, subvol, subvol-&gt;fops-&gt;statfs, loc);</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>-</div><div class='del'>- root_inode:</div><div class='del'>-	local = GF_CALLOC (1, sizeof (map_local_t),</div><div class='del'>-                           gf_map_mt_map_local_t);</div><div class='del'>-</div><div class='del'>-	priv = this-&gt;private;</div><div class='del'>-	frame-&gt;local = local;</div><div class='del'>-	local-&gt;call_count = priv-&gt;child_count;</div><div class='del'>-	local-&gt;op_ret = -1;</div><div class='del'>-</div><div class='del'>-	trav = this-&gt;children;</div><div class='del'>-	while (trav) {</div><div class='del'>-		STACK_WIND (frame, map_statfs_cbk, trav-&gt;xlator,</div><div class='del'>-			    trav-&gt;xlator-&gt;fops-&gt;statfs, loc);</div><div class='del'>-		trav = trav-&gt;next;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>- err:</div><div class='del'>-	STACK_UNWIND (frame, -1, op_errno, NULL);</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-map_opendir (call_frame_t *frame,</div><div class='del'>-	     xlator_t *this,</div><div class='del'>-	     loc_t *loc, fd_t *fd)</div><div class='del'>-{</div><div class='del'>-	int32_t op_errno = EINVAL;</div><div class='del'>-	xlator_t *subvol   = NULL;</div><div class='del'>-	map_local_t *local = NULL;</div><div class='del'>-	map_private_t *priv = NULL;</div><div class='del'>-	xlator_list_t *trav = NULL;</div><div class='del'>-</div><div class='del'>-        VALIDATE_OR_GOTO (frame, err);</div><div class='del'>-        VALIDATE_OR_GOTO (this, err);</div><div class='del'>-        VALIDATE_OR_GOTO (fd, err);</div><div class='del'>-        VALIDATE_OR_GOTO (fd-&gt;inode, err);</div><div class='del'>-</div><div class='del'>-	if (loc-&gt;inode-&gt;ino == 1) </div><div class='del'>-		goto root_inode;</div><div class='del'>-	</div><div class='del'>-	subvol = get_mapping_subvol_from_ctx (this, fd-&gt;inode);</div><div class='del'>-	if (!subvol) {</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='del'>-	</div><div class='del'>-	/* Just one callback */</div><div class='del'>-	STACK_WIND (frame, map_opendir_cbk, subvol,</div><div class='del'>-		    subvol-&gt;fops-&gt;opendir, loc, fd);</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>-</div><div class='del'>- root_inode:</div><div class='del'>-	local = GF_CALLOC (1, sizeof (map_local_t),</div><div class='del'>-                           gf_map_mt_map_local_t);</div><div class='del'>-</div><div class='del'>-	priv = this-&gt;private;</div><div class='del'>-	frame-&gt;local = local;</div><div class='del'>-	local-&gt;call_count = priv-&gt;child_count;</div><div class='del'>-	local-&gt;op_ret = -1;</div><div class='del'>-	local-&gt;fd = fd_ref (fd);</div><div class='del'>-</div><div class='del'>-	trav = this-&gt;children;</div><div class='del'>-	while (trav) {</div><div class='del'>-		STACK_WIND (frame, map_opendir_cbk, trav-&gt;xlator,</div><div class='del'>-			    trav-&gt;xlator-&gt;fops-&gt;opendir, loc, fd);</div><div class='del'>-		trav = trav-&gt;next;</div><div class='del'>-	}</div><div class='del'>-	</div><div class='del'>-	return 0;</div><div class='del'>- err:</div><div class='del'>-	STACK_UNWIND (frame, -1, op_errno, NULL);</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-map_do_readdir (call_frame_t *frame, xlator_t *this, fd_t *fd, size_t size,</div><div class='del'>-                off_t yoff, int whichop)</div><div class='del'>-{</div><div class='del'>-	int32_t        op_errno = EINVAL;</div><div class='del'>-	xlator_t      *subvol = NULL;</div><div class='del'>-	map_local_t   *local = NULL;</div><div class='del'>-	map_private_t *priv = NULL;</div><div class='del'>-	xlator_t      *xvol = NULL;</div><div class='del'>-	off_t          xoff = 0;</div><div class='del'>-</div><div class='del'>-        VALIDATE_OR_GOTO (frame, err);</div><div class='del'>-        VALIDATE_OR_GOTO (this, err);</div><div class='del'>-        VALIDATE_OR_GOTO (fd, err);</div><div class='del'>-        VALIDATE_OR_GOTO (fd-&gt;inode, err);</div><div class='del'>-</div><div class='del'>-	if (fd-&gt;inode-&gt;ino == 1) </div><div class='del'>-		goto root_inode;</div><div class='del'>-</div><div class='del'>-	subvol = get_mapping_subvol_from_ctx (this, fd-&gt;inode);</div><div class='del'>-	if (!subvol) {</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='del'>-	</div><div class='del'>-	/* Just one callback */</div><div class='del'>-        if (whichop == GF_FOP_READDIR)</div><div class='del'>-                STACK_WIND (frame, map_single_readdir_cbk, subvol,</div><div class='del'>-                            subvol-&gt;fops-&gt;readdir, fd, size, yoff);</div><div class='del'>-        else</div><div class='del'>-                STACK_WIND (frame, map_single_readdirp_cbk, subvol,</div><div class='del'>-                            subvol-&gt;fops-&gt;readdirp, fd, size, yoff);</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>-</div><div class='del'>- root_inode:</div><div class='del'>-	/* readdir on '/' */</div><div class='del'>-	local = GF_CALLOC (1, sizeof (map_local_t),</div><div class='del'>-                           gf_map_mt_map_local_t);</div><div class='del'>-	if (!local) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-			"memory allocation failed :(");</div><div class='del'>-		op_errno = ENOMEM;</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='del'>-	</div><div class='del'>-	priv = this-&gt;private;</div><div class='del'>-	frame-&gt;local = local;</div><div class='del'>-	local-&gt;op_errno = ENOENT;</div><div class='del'>-	local-&gt;op_ret = -1;</div><div class='del'>-</div><div class='del'>-	local-&gt;fd = fd_ref (fd);</div><div class='del'>-	local-&gt;size = size;</div><div class='del'>-</div><div class='del'>-	map_deitransform (this, yoff, &amp;xvol, (uint64_t *)&amp;xoff);</div><div class='del'>-</div><div class='del'>-        if (whichop == GF_FOP_READDIR)</div><div class='del'>-                STACK_WIND (frame, map_readdir_cbk, xvol, xvol-&gt;fops-&gt;readdir,</div><div class='del'>-                            fd, size, xoff);</div><div class='del'>-        else</div><div class='del'>-                STACK_WIND (frame, map_readdirp_cbk, xvol, xvol-&gt;fops-&gt;readdirp,</div><div class='del'>-                            fd, size, xoff);</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>- err:</div><div class='del'>-	STACK_UNWIND (frame, -1, op_errno, NULL);</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-map_readdir (call_frame_t *frame, xlator_t *this, fd_t *fd, size_t size,</div><div class='del'>-             off_t yoff)</div><div class='del'>-{</div><div class='del'>-        map_do_readdir (frame, this, fd, size, yoff, GF_FOP_READDIR);</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-map_readdirp (call_frame_t *frame, xlator_t *this, fd_t *fd, size_t size,</div><div class='del'>-              off_t yoff)</div><div class='del'>-{</div><div class='del'>-        map_do_readdir (frame, this, fd, size, yoff, GF_FOP_READDIRP);</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-void</div><div class='del'>-fini (xlator_t *this)</div><div class='del'>-{</div><div class='del'>-	map_private_t *priv = NULL;</div><div class='del'>-	struct map_pattern *trav_map = NULL;</div><div class='del'>-	struct map_pattern *tmp_map  = NULL;</div><div class='del'>-</div><div class='del'>-	priv = this-&gt;private;</div><div class='del'>-</div><div class='del'>-	if (priv) {</div><div class='del'>-		if (priv-&gt;xlarray)</div><div class='del'>-			GF_FREE (priv-&gt;xlarray);</div><div class='del'>-</div><div class='del'>-		trav_map = priv-&gt;map;</div><div class='del'>-		while (trav_map) {</div><div class='del'>-			tmp_map = trav_map;</div><div class='del'>-			trav_map = trav_map-&gt;next;</div><div class='del'>-			GF_FREE (tmp_map);</div><div class='del'>-		}</div><div class='del'>-</div><div class='del'>-		GF_FREE(priv);</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	return;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-mem_acct_init (xlator_t *this)</div><div class='del'>-{</div><div class='del'>-        int     ret = -1;</div><div class='del'>-</div><div class='del'>-        if (!this)</div><div class='del'>-                return ret;</div><div class='del'>-</div><div class='del'>-        ret = xlator_mem_acct_init (this, gf_map_mt_end + 1);</div><div class='del'>-        </div><div class='del'>-        if (ret != 0) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_ERROR, "Memory accounting init"</div><div class='del'>-                                "failed");</div><div class='del'>-                return ret;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-init (xlator_t *this)</div><div class='del'>-{</div><div class='del'>-	map_private_t *priv = NULL;</div><div class='del'>-	xlator_list_t *trav = NULL;</div><div class='del'>-	int   count = 0;</div><div class='del'>-	int   ret = -1;</div><div class='del'>-	char *pattern_string = NULL;</div><div class='del'>-	char *map_pair_str = NULL;</div><div class='del'>-	char *tmp_str = NULL;</div><div class='del'>-	char *tmp_str1 = NULL;</div><div class='del'>-	char *dup_map_pair = NULL;</div><div class='del'>-	char *dir_str = NULL;</div><div class='del'>-	char *subvol_str = NULL;</div><div class='del'>-	char *map_xl = NULL;</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-	if (!this-&gt;children) {</div><div class='del'>-		gf_log (this-&gt;name,GF_LOG_ERROR,</div><div class='del'>-			"FATAL: map should have one or more child defined");</div><div class='del'>-		return -1;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	if (!this-&gt;parents) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_WARNING,</div><div class='del'>-			"dangling volume. check volfile ");</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	priv = GF_CALLOC (1, sizeof (map_private_t),</div><div class='del'>-                          gf_map_mt_map_private_t);</div><div class='del'>-	this-&gt;private = priv;</div><div class='del'>-</div><div class='del'>-	/* allocate xlator array */</div><div class='del'>-	trav = this-&gt;children;</div><div class='del'>-	while (trav) {</div><div class='del'>-		count++;</div><div class='del'>-		trav = trav-&gt;next;</div><div class='del'>-	}</div><div class='del'>-	priv-&gt;xlarray = GF_CALLOC (1, sizeof (struct map_xlator_array) * count,</div><div class='del'>-                                   gf_map_mt_map_xlator_array);</div><div class='del'>-	priv-&gt;child_count = count;</div><div class='del'>-</div><div class='del'>-	/* build xlator array */</div><div class='del'>-	count = 0;</div><div class='del'>-	trav = this-&gt;children;</div><div class='del'>-	while (trav) {</div><div class='del'>-		priv-&gt;xlarray[count++].xl = trav-&gt;xlator;</div><div class='del'>-		trav = trav-&gt;next;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	/* map dir1:brick1;dir2:brick2;dir3:brick3;*:brick4 */</div><div class='del'>-	ret = dict_get_str (this-&gt;options, "map-directory", &amp;pattern_string);</div><div class='del'>-	if (ret != 0) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_ERROR, </div><div class='del'>-			"map.pattern not given, can't continue");</div><div class='del'>-		goto err;</div><div class='del'>-	}</div><div class='del'>-	map_pair_str = strtok_r (pattern_string, ";", &amp;tmp_str);</div><div class='del'>-	while (map_pair_str) {</div><div class='del'>-		dup_map_pair = gf_strdup (map_pair_str);</div><div class='del'>-		dir_str = strtok_r (dup_map_pair, ":", &amp;tmp_str1);</div><div class='del'>-		if (!dir_str) {</div><div class='del'>-			gf_log (this-&gt;name, GF_LOG_ERROR, </div><div class='del'>-				"directory string invalid");</div><div class='del'>-			goto err;</div><div class='del'>-		}</div><div class='del'>-		subvol_str = strtok_r (NULL, ":", &amp;tmp_str1);</div><div class='del'>-		if (!subvol_str) {</div><div class='del'>-			gf_log (this-&gt;name, GF_LOG_ERROR, </div><div class='del'>-				"mapping subvolume string invalid");</div><div class='del'>-			goto err;</div><div class='del'>-		}</div><div class='del'>-		ret = verify_dir_and_assign_subvol (this, </div><div class='del'>-						    dir_str, </div><div class='del'>-						    subvol_str);</div><div class='del'>-		if (ret != 0) {</div><div class='del'>-			gf_log (this-&gt;name, GF_LOG_ERROR, </div><div class='del'>-				"verification failed");</div><div class='del'>-			goto err;</div><div class='del'>-		}</div><div class='del'>-		</div><div class='del'>-		GF_FREE (dup_map_pair);</div><div class='del'>-</div><div class='del'>-		map_pair_str = strtok_r (NULL, ";", &amp;tmp_str);</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	/* default-volume brick4 */</div><div class='del'>-	ret = dict_get_str (this-&gt;options, "default-volume", &amp;map_xl);</div><div class='del'>-	if (ret == 0) {</div><div class='del'>-		ret = assign_default_subvol (this, map_xl);</div><div class='del'>-		if (ret != 0) {</div><div class='del'>-			gf_log (this-&gt;name, GF_LOG_ERROR, </div><div class='del'>-				"assigning default failed");</div><div class='del'>-			goto err;</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	verify_if_all_subvolumes_got_used (this);</div><div class='del'>-	</div><div class='del'>-	return 0;</div><div class='del'>- err:</div><div class='del'>-	fini (this);</div><div class='del'>-	return -1;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-struct xlator_fops fops = {</div><div class='del'>-	.lookup      = map_lookup,</div><div class='del'>-	.mknod       = map_mknod,</div><div class='del'>-	.create      = map_create,</div><div class='del'>-</div><div class='del'>-	.stat        = map_stat,</div><div class='del'>-	.fstat       = map_fstat,</div><div class='del'>-	.truncate    = map_truncate,</div><div class='del'>-	.ftruncate   = map_ftruncate,</div><div class='del'>-	.access      = map_access,</div><div class='del'>-	.readlink    = map_readlink,</div><div class='del'>-	.setxattr    = map_setxattr,</div><div class='del'>-	.getxattr    = map_getxattr,</div><div class='del'>-	.fsetxattr   = map_fsetxattr,</div><div class='del'>-	.fgetxattr   = map_fgetxattr,</div><div class='del'>-	.removexattr = map_removexattr,</div><div class='del'>-	.open        = map_open,</div><div class='del'>-	.readv       = map_readv,</div><div class='del'>-	.writev      = map_writev,</div><div class='del'>-	.flush       = map_flush,</div><div class='del'>-	.fsync       = map_fsync,</div><div class='del'>-	.statfs      = map_statfs,</div><div class='del'>-	.lk          = map_lk,</div><div class='del'>-	.opendir     = map_opendir,</div><div class='del'>-	.readdir     = map_readdir,</div><div class='del'>-	.readdirp    = map_readdirp,</div><div class='del'>-	.fsyncdir    = map_fsyncdir,</div><div class='del'>-	.symlink     = map_symlink,</div><div class='del'>-	.unlink      = map_unlink,</div><div class='del'>-	.link        = map_link,</div><div class='del'>-	.mkdir       = map_mkdir,</div><div class='del'>-	.rmdir       = map_rmdir,</div><div class='del'>-	.rename      = map_rename,</div><div class='del'>-	.inodelk     = map_inodelk,</div><div class='del'>-	.finodelk    = map_finodelk,</div><div class='del'>-	.entrylk     = map_entrylk,</div><div class='del'>-	.fentrylk    = map_fentrylk,</div><div class='del'>-	.xattrop     = map_xattrop,</div><div class='del'>-	.fxattrop    = map_fxattrop,</div><div class='del'>-	.setdents    = map_setdents,</div><div class='del'>-	.getdents    = map_getdents,</div><div class='del'>-	.checksum    = map_checksum,</div><div class='del'>-        .setattr     = map_setattr,</div><div class='del'>-        .fsetattr    = map_fsetattr,</div><div class='del'>-};</div><div class='del'>-</div><div class='del'>-struct xlator_cbks cbks = {</div><div class='del'>-};</div><div class='del'>-</div><div class='del'>-struct volume_options options[] = {</div><div class='del'>-	{ .key   = {"map-directory"},  </div><div class='del'>-	  .type  = GF_OPTION_TYPE_ANY </div><div class='del'>-	},</div><div class='del'>-	{ .key   = {"default-volume"},  </div><div class='del'>-	  .type  = GF_OPTION_TYPE_XLATOR </div><div class='del'>-	},</div><div class='del'>-	</div><div class='del'>-	{ .key = {NULL} }</div><div class='del'>-};</div><div class='head'>diff --git a/xlators/cluster/map/src/map.h b/xlators/cluster/map/src/map.h<br/>deleted file mode 100644<br/>index eb549eb06e7..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/xlators/cluster/map/src/map.h?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/cluster/map/src/map.h</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,77 +0,0 @@</div><div class='del'>-/*</div><div class='del'>-  Copyright (c) 2008-2009 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='del'>-  This file is part of GlusterFS.</div><div class='del'>-</div><div class='del'>-  GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-  it under the terms of the GNU General Public License as published</div><div class='del'>-  by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-  or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-  GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-  WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-  General Public License for more details.</div><div class='del'>-</div><div class='del'>-  You should have received a copy of the GNU General Public License</div><div class='del'>-  along with this program.  If not, see</div><div class='del'>-  &lt;http://www.gnu.org/licenses/&gt;.</div><div class='del'>-*/</div><div class='del'>-</div><div class='del'>-#ifndef __MAP_H__</div><div class='del'>-#define __MAP_H__</div><div class='del'>-</div><div class='del'>-#include "xlator.h"</div><div class='del'>-#include "map-mem-types.h"</div><div class='del'>-</div><div class='del'>-struct map_pattern {</div><div class='del'>-	struct map_pattern *next;</div><div class='del'>-	xlator_t           *xl;</div><div class='del'>-	char               *directory;</div><div class='del'>-	int                 dir_len;</div><div class='del'>-};</div><div class='del'>-</div><div class='del'>-struct map_xlator_array {</div><div class='del'>-	xlator_t *xl;</div><div class='del'>-	int       mapped; /* yes/no */</div><div class='del'>-};</div><div class='del'>-</div><div class='del'>-typedef struct {</div><div class='del'>-	struct map_pattern      *map;</div><div class='del'>-	xlator_t                *default_xl;</div><div class='del'>-	struct map_xlator_array *xlarray;</div><div class='del'>-	int                      child_count;</div><div class='del'>-} map_private_t;</div><div class='del'>-</div><div class='del'>-typedef struct {</div><div class='del'>-	int32_t        op_ret;</div><div class='del'>-	int32_t        op_errno;</div><div class='del'>-	int            call_count;</div><div class='del'>-	struct statvfs statvfs;</div><div class='del'>-	struct iatt    stbuf;</div><div class='del'>-	inode_t       *inode;</div><div class='del'>-	dict_t        *dict;</div><div class='del'>-	fd_t          *fd;</div><div class='del'>-</div><div class='del'>-	size_t        size;</div><div class='del'>-} map_local_t;</div><div class='del'>-</div><div class='del'>-xlator_t *map_subvol_next (xlator_t *this, xlator_t *prev);</div><div class='del'>-int map_subvol_cnt (xlator_t *this, xlator_t *subvol);</div><div class='del'>-</div><div class='del'>-int map_itransform (xlator_t *this, xlator_t *subvol, </div><div class='del'>-		    uint64_t x, uint64_t *y_p);</div><div class='del'>-int map_deitransform (xlator_t *this, uint64_t y, </div><div class='del'>-		      xlator_t **subvol_p, uint64_t *x_p);</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-xlator_t *get_mapping_subvol_from_path (xlator_t *this, const char *path);</div><div class='del'>-xlator_t *get_mapping_subvol_from_ctx (xlator_t *this, inode_t *inode);</div><div class='del'>-</div><div class='del'>-int check_multiple_volume_entry (xlator_t *this, xlator_t *subvol);</div><div class='del'>-int verify_dir_and_assign_subvol (xlator_t *this, </div><div class='del'>-				  const char *directory, const char *subvol);</div><div class='del'>-int assign_default_subvol (xlator_t *this, const char *default_xl);</div><div class='del'>-void verify_if_all_subvolumes_got_used (xlator_t *this);</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-#endif /* __MAP_H__ */</div><div class='head'>diff --git a/xlators/cluster/stripe/Makefile.am b/xlators/cluster/stripe/Makefile.am<br/>deleted file mode 100644<br/>index d471a3f9243..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/xlators/cluster/stripe/Makefile.am?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/cluster/stripe/Makefile.am</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,3 +0,0 @@</div><div class='del'>-SUBDIRS = src</div><div class='del'>-</div><div class='del'>-CLEANFILES = </div><div class='head'>diff --git a/xlators/cluster/stripe/src/Makefile.am b/xlators/cluster/stripe/src/Makefile.am<br/>deleted file mode 100644<br/>index 6d4fae4d268..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/xlators/cluster/stripe/src/Makefile.am?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/cluster/stripe/src/Makefile.am</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,16 +0,0 @@</div><div class='del'>-</div><div class='del'>-xlator_LTLIBRARIES = stripe.la</div><div class='del'>-xlatordir = $(libdir)/glusterfs/$(PACKAGE_VERSION)/xlator/cluster</div><div class='del'>-</div><div class='del'>-stripe_la_LDFLAGS = -module -avoidversion</div><div class='del'>-</div><div class='del'>-stripe_la_SOURCES = stripe.c</div><div class='del'>-stripe_la_LIBADD = $(top_builddir)/libglusterfs/src/libglusterfs.la</div><div class='del'>-</div><div class='del'>-noinst_HEADERS = stripe.h stripe-mem-types.h</div><div class='del'>-</div><div class='del'>-AM_CFLAGS = -fPIC -D_FILE_OFFSET_BITS=64 -D_GNU_SOURCE -Wall -D$(GF_HOST_OS)\</div><div class='del'>-	-I$(top_srcdir)/libglusterfs/src -shared -nostartfiles $(GF_CFLAGS)</div><div class='del'>-</div><div class='del'>-CLEANFILES = </div><div class='del'>-</div><div class='head'>diff --git a/xlators/cluster/stripe/src/stripe-mem-types.h b/xlators/cluster/stripe/src/stripe-mem-types.h<br/>deleted file mode 100644<br/>index 06667107d65..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/xlators/cluster/stripe/src/stripe-mem-types.h?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/cluster/stripe/src/stripe-mem-types.h</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,40 +0,0 @@</div><div class='del'>-</div><div class='del'>-/*</div><div class='del'>-   Copyright (c) 2008-2009 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='del'>-   This file is part of GlusterFS.</div><div class='del'>-</div><div class='del'>-   GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-   it under the terms of the GNU General Public License as published</div><div class='del'>-   by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-   or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-   GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-   WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-   General Public License for more details.</div><div class='del'>-</div><div class='del'>-   You should have received a copy of the GNU General Public License</div><div class='del'>-   along with this program.  If not, see</div><div class='del'>-   &lt;http://www.gnu.org/licenses/&gt;.</div><div class='del'>-*/</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-#ifndef __STRIPE_MEM_TYPES_H__</div><div class='del'>-#define __STRIPE_MEM_TYPES_H__</div><div class='del'>-</div><div class='del'>-#include "mem-types.h"</div><div class='del'>-</div><div class='del'>-enum gf_stripe_mem_types_ {</div><div class='del'>-        gf_stripe_mt_stripe_local_t = gf_common_mt_end + 1,</div><div class='del'>-        gf_stripe_mt_iovec,</div><div class='del'>-        gf_stripe_mt_readv_replies,</div><div class='del'>-        gf_stripe_mt_stripe_fd_ctx_t,</div><div class='del'>-        gf_stripe_mt_char,</div><div class='del'>-        gf_stripe_mt_int8_t,</div><div class='del'>-        gf_stripe_mt_xlator_t,</div><div class='del'>-        gf_stripe_mt_stripe_private_t,</div><div class='del'>-        gf_stripe_mt_stripe_options,</div><div class='del'>-        gf_stripe_mt_end</div><div class='del'>-};</div><div class='del'>-#endif</div><div class='del'>-</div><div class='head'>diff --git a/xlators/cluster/stripe/src/stripe.c b/xlators/cluster/stripe/src/stripe.c<br/>deleted file mode 100644<br/>index a9f62038914..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/xlators/cluster/stripe/src/stripe.c?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/cluster/stripe/src/stripe.c</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,3926 +0,0 @@</div><div class='del'>-/*</div><div class='del'>-  Copyright (c) 2007-2009 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='del'>-  This file is part of GlusterFS.</div><div class='del'>-</div><div class='del'>-  GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-  it under the terms of the GNU General Public License as published</div><div class='del'>-  by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-  or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-  GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-  WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-  General Public License for more details.</div><div class='del'>-</div><div class='del'>-  You should have received a copy of the GNU General Public License</div><div class='del'>-  along with this program.  If not, see</div><div class='del'>-  &lt;http://www.gnu.org/licenses/&gt;.</div><div class='del'>-*/</div><div class='del'>-</div><div class='del'>-/**</div><div class='del'>- * xlators/cluster/stripe:</div><div class='del'>- *    Stripe translator, stripes the data accross its child nodes,</div><div class='del'>- *    as per the options given in the volfile. The striping works</div><div class='del'>- *    fairly simple. It writes files at different offset as per</div><div class='del'>- *    calculation. So, 'ls -l' output at the real posix level will</div><div class='del'>- *    show file size bigger than the actual size. But when one does</div><div class='del'>- *    'df' or 'du &lt;file&gt;', real size of the file on the server is shown.</div><div class='del'>- *</div><div class='del'>- * WARNING:</div><div class='del'>- *  Stripe translator can't regenerate data if a child node gets disconnected.</div><div class='del'>- *  So, no 'self-heal' for stripe. Hence the advice, use stripe only when its</div><div class='del'>- *  very much necessary, or else, use it in combination with AFR, to have a</div><div class='del'>- *  backup copy.</div><div class='del'>- */</div><div class='del'>-</div><div class='del'>-#include "stripe.h"</div><div class='del'>-</div><div class='del'>-void</div><div class='del'>-stripe_local_wipe (stripe_local_t *local)</div><div class='del'>-{</div><div class='del'>-        if (!local)</div><div class='del'>-                goto out;</div><div class='del'>-</div><div class='del'>-        if (local-&gt;loc.path)</div><div class='del'>-                loc_wipe (&amp;local-&gt;loc);</div><div class='del'>-        if (local-&gt;loc2.path)</div><div class='del'>-                loc_wipe (&amp;local-&gt;loc2);</div><div class='del'>-out:</div><div class='del'>-        return;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-/**</div><div class='del'>- * stripe_get_matching_bs - Get the matching block size for the given path.</div><div class='del'>- */</div><div class='del'>-int32_t</div><div class='del'>-stripe_get_matching_bs (const char *path, struct stripe_options *opts,</div><div class='del'>-                        uint64_t default_bs)</div><div class='del'>-{</div><div class='del'>-        struct stripe_options *trav       = NULL;</div><div class='del'>-        char                  *pathname   = NULL;</div><div class='del'>-        uint64_t               block_size = 0;</div><div class='del'>-</div><div class='del'>-        block_size = default_bs;</div><div class='del'>-</div><div class='del'>-        if (!path || !opts)</div><div class='del'>-                goto out;</div><div class='del'>-</div><div class='del'>-        /* FIXME: is a strdup really necessary? */</div><div class='del'>-        pathname = gf_strdup (path);</div><div class='del'>-        if (!pathname)</div><div class='del'>-                goto out;</div><div class='del'>-</div><div class='del'>-        trav = opts;</div><div class='del'>-        while (trav) {</div><div class='del'>-                if (!fnmatch (trav-&gt;path_pattern, pathname, FNM_NOESCAPE)) {</div><div class='del'>-                        block_size = trav-&gt;block_size;</div><div class='del'>-                        break;</div><div class='del'>-                }</div><div class='del'>-                trav = trav-&gt;next;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        GF_FREE (pathname);</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        return block_size;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-stripe_sh_chown_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-                     int32_t op_ret, int32_t op_errno,</div><div class='del'>-                     struct iatt *preop, struct iatt *postop)</div><div class='del'>-{</div><div class='del'>-        int             callcnt = -1;</div><div class='del'>-        stripe_local_t *local   = NULL;</div><div class='del'>-</div><div class='del'>-        if (!this || !frame || !frame-&gt;local) {</div><div class='del'>-                gf_log ("stripe", GF_LOG_DEBUG, "possible NULL deref");</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        local = frame-&gt;local;</div><div class='del'>-</div><div class='del'>-        LOCK (&amp;frame-&gt;lock);</div><div class='del'>-        {</div><div class='del'>-                callcnt = --local-&gt;call_count;</div><div class='del'>-        }</div><div class='del'>-        UNLOCK (&amp;frame-&gt;lock);</div><div class='del'>-</div><div class='del'>-        if (!callcnt) {</div><div class='del'>-                stripe_local_wipe (local);</div><div class='del'>-                STACK_DESTROY (frame-&gt;root);</div><div class='del'>-        }</div><div class='del'>-out:</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-stripe_sh_make_entry_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-                          int32_t op_ret, int32_t op_errno, inode_t *inode,</div><div class='del'>-                          struct iatt *buf, struct iatt *preparent,</div><div class='del'>-                          struct iatt *postparent)</div><div class='del'>-{</div><div class='del'>-        stripe_local_t *local = NULL;</div><div class='del'>-        call_frame_t    *prev = NULL;</div><div class='del'>-</div><div class='del'>-        if (!frame || !frame-&gt;local || !cookie || !this) {</div><div class='del'>-                gf_log ("stripe", GF_LOG_DEBUG, "possible NULL deref");</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        prev  = cookie;</div><div class='del'>-        local = frame-&gt;local;</div><div class='del'>-</div><div class='del'>-        STACK_WIND (frame, stripe_sh_chown_cbk, prev-&gt;this,</div><div class='del'>-                    prev-&gt;this-&gt;fops-&gt;setattr, &amp;local-&gt;loc,</div><div class='del'>-                    &amp;local-&gt;stbuf, (GF_SET_ATTR_UID | GF_SET_ATTR_GID));</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-stripe_entry_self_heal (call_frame_t *frame, xlator_t *this,</div><div class='del'>-                        stripe_local_t *local)</div><div class='del'>-{</div><div class='del'>-        xlator_list_t    *trav   = NULL;</div><div class='del'>-        call_frame_t     *rframe = NULL;</div><div class='del'>-        stripe_local_t   *rlocal = NULL;</div><div class='del'>-        stripe_private_t *priv   = NULL;</div><div class='del'>-        dict_t           *dict   = NULL;</div><div class='del'>-        int               ret    = 0;</div><div class='del'>-</div><div class='del'>-        if (!local || !this || !frame) {</div><div class='del'>-                gf_log ("stripe", GF_LOG_DEBUG, "possible NULL deref");</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (!(IA_ISREG (local-&gt;stbuf.ia_type) ||</div><div class='del'>-              IA_ISDIR (local-&gt;stbuf.ia_type)))</div><div class='del'>-                return 0;</div><div class='del'>-</div><div class='del'>-        priv = this-&gt;private;</div><div class='del'>-        trav = this-&gt;children;</div><div class='del'>-        rframe = copy_frame (frame);</div><div class='del'>-        if (!rframe) {</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-        rlocal = GF_CALLOC (1, sizeof (stripe_local_t),</div><div class='del'>-                            gf_stripe_mt_stripe_local_t);</div><div class='del'>-        if (!rlocal) {</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-        rframe-&gt;local = rlocal;</div><div class='del'>-        rlocal-&gt;call_count = priv-&gt;child_count;</div><div class='del'>-        loc_copy (&amp;rlocal-&gt;loc, &amp;local-&gt;loc);</div><div class='del'>-        memcpy (&amp;rlocal-&gt;stbuf, &amp;local-&gt;stbuf, sizeof (struct iatt));</div><div class='del'>-</div><div class='del'>-        dict = dict_new ();</div><div class='del'>-        if (!dict)</div><div class='del'>-                goto out;</div><div class='del'>-</div><div class='del'>-        ret = dict_set_static_bin (dict, "gfid-req", local-&gt;stbuf.ia_gfid, 16);</div><div class='del'>-        if (ret)</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_WARNING,</div><div class='del'>-                        "failed to set gfid-req");</div><div class='del'>-</div><div class='del'>-        while (trav) {</div><div class='del'>-                if (IA_ISREG (local-&gt;stbuf.ia_type)) {</div><div class='del'>-                        STACK_WIND (rframe, stripe_sh_make_entry_cbk,</div><div class='del'>-                                    trav-&gt;xlator, trav-&gt;xlator-&gt;fops-&gt;mknod,</div><div class='del'>-                                    &amp;local-&gt;loc,</div><div class='del'>-                                    st_mode_from_ia (local-&gt;stbuf.ia_prot,</div><div class='del'>-                                                     local-&gt;stbuf.ia_type), 0,</div><div class='del'>-                                    dict);</div><div class='del'>-                }</div><div class='del'>-                if (IA_ISDIR (local-&gt;stbuf.ia_type)) {</div><div class='del'>-                        STACK_WIND (rframe, stripe_sh_make_entry_cbk,</div><div class='del'>-                                    trav-&gt;xlator, trav-&gt;xlator-&gt;fops-&gt;mkdir,</div><div class='del'>-                                    &amp;local-&gt;loc, st_mode_from_ia (local-&gt;stbuf.ia_prot,</div><div class='del'>-                                                                  local-&gt;stbuf.ia_type),</div><div class='del'>-                                    dict);</div><div class='del'>-                }</div><div class='del'>-                trav = trav-&gt;next;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        if (dict)</div><div class='del'>-                dict_unref (dict);</div><div class='del'>-</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-stripe_lookup_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-                   int32_t op_ret, int32_t op_errno, inode_t *inode,</div><div class='del'>-                   struct iatt *buf, dict_t *dict, struct iatt *postparent)</div><div class='del'>-{</div><div class='del'>-        int32_t         callcnt = 0;</div><div class='del'>-        dict_t         *tmp_dict = NULL;</div><div class='del'>-        inode_t        *tmp_inode = NULL;</div><div class='del'>-        stripe_local_t *local = NULL;</div><div class='del'>-        call_frame_t   *prev = NULL;</div><div class='del'>-</div><div class='del'>-        if (!this || !frame || !frame-&gt;local || !cookie) {</div><div class='del'>-                gf_log ("stripe", GF_LOG_DEBUG, "possible NULL deref");</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        prev = cookie;</div><div class='del'>-        local = frame-&gt;local;</div><div class='del'>-</div><div class='del'>-        LOCK (&amp;frame-&gt;lock);</div><div class='del'>-        {</div><div class='del'>-                callcnt = --local-&gt;call_count;</div><div class='del'>-</div><div class='del'>-                if (op_ret == -1) {</div><div class='del'>-                        if (op_errno != ENOENT)</div><div class='del'>-                                gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-                                        "%s returned error %s",</div><div class='del'>-                                        prev-&gt;this-&gt;name,</div><div class='del'>-                                        strerror (op_errno));</div><div class='del'>-                        if (local-&gt;op_errno != ESTALE)</div><div class='del'>-                                local-&gt;op_errno = op_errno;</div><div class='del'>-                        if ((op_errno != ENOENT) ||</div><div class='del'>-                            (prev-&gt;this == FIRST_CHILD (this)))</div><div class='del'>-                                local-&gt;failed = 1;</div><div class='del'>-                        if (op_errno == ENOENT)</div><div class='del'>-                                local-&gt;entry_self_heal_needed = 1;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                if (op_ret &gt;= 0) {</div><div class='del'>-                        local-&gt;op_ret = 0;</div><div class='del'>-</div><div class='del'>-                        if (FIRST_CHILD(this) == prev-&gt;this) {</div><div class='del'>-                                local-&gt;stbuf      = *buf;</div><div class='del'>-                                local-&gt;postparent = *postparent;</div><div class='del'>-                                local-&gt;inode = inode_ref (inode);</div><div class='del'>-                                local-&gt;dict = dict_ref (dict);</div><div class='del'>-                        }</div><div class='del'>-                        local-&gt;stbuf_blocks      += buf-&gt;ia_blocks;</div><div class='del'>-                        local-&gt;postparent_blocks += postparent-&gt;ia_blocks;</div><div class='del'>-</div><div class='del'>-                        if (local-&gt;stbuf_size &lt; buf-&gt;ia_size)</div><div class='del'>-                                local-&gt;stbuf_size = buf-&gt;ia_size;</div><div class='del'>-                        if (local-&gt;postparent_size &lt; postparent-&gt;ia_size)</div><div class='del'>-                                local-&gt;postparent_size = postparent-&gt;ia_size;</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='del'>-        UNLOCK (&amp;frame-&gt;lock);</div><div class='del'>-</div><div class='del'>-        if (!callcnt) {</div><div class='del'>-                if (local-&gt;op_ret == 0 &amp;&amp; local-&gt;entry_self_heal_needed)</div><div class='del'>-                        stripe_entry_self_heal (frame, this, local);</div><div class='del'>-</div><div class='del'>-                if (local-&gt;failed)</div><div class='del'>-                        local-&gt;op_ret = -1;</div><div class='del'>-</div><div class='del'>-                tmp_dict  = local-&gt;dict;</div><div class='del'>-                tmp_inode = local-&gt;inode;</div><div class='del'>-</div><div class='del'>-                if (local-&gt;op_ret != -1) {</div><div class='del'>-                        local-&gt;stbuf.ia_blocks      = local-&gt;stbuf_blocks;</div><div class='del'>-                        local-&gt;stbuf.ia_size        = local-&gt;stbuf_size;</div><div class='del'>-                        local-&gt;postparent.ia_blocks = local-&gt;postparent_blocks;</div><div class='del'>-                        local-&gt;postparent.ia_size   = local-&gt;postparent_size;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                stripe_local_wipe (local);</div><div class='del'>-                STACK_UNWIND_STRICT (lookup, frame, local-&gt;op_ret,</div><div class='del'>-                                     local-&gt;op_errno, local-&gt;inode,</div><div class='del'>-                                     &amp;local-&gt;stbuf, local-&gt;dict,</div><div class='del'>-                                     &amp;local-&gt;postparent);</div><div class='del'>-</div><div class='del'>-                if (tmp_inode)</div><div class='del'>-                        inode_unref (tmp_inode);</div><div class='del'>-                if (tmp_dict)</div><div class='del'>-                        dict_unref (tmp_dict);</div><div class='del'>-        }</div><div class='del'>-out:</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-stripe_lookup (call_frame_t *frame, xlator_t *this, loc_t *loc,</div><div class='del'>-               dict_t *xattr_req)</div><div class='del'>-{</div><div class='del'>-        stripe_local_t   *local = NULL;</div><div class='del'>-        xlator_list_t    *trav = NULL;</div><div class='del'>-        stripe_private_t *priv = NULL;</div><div class='del'>-        int32_t           op_errno = EINVAL;</div><div class='del'>-</div><div class='del'>-        VALIDATE_OR_GOTO (frame, err);</div><div class='del'>-        VALIDATE_OR_GOTO (this, err);</div><div class='del'>-        VALIDATE_OR_GOTO (loc, err);</div><div class='del'>-        VALIDATE_OR_GOTO (loc-&gt;path, err);</div><div class='del'>-        VALIDATE_OR_GOTO (loc-&gt;inode, err);</div><div class='del'>-</div><div class='del'>-        priv = this-&gt;private;</div><div class='del'>-        trav = this-&gt;children;</div><div class='del'>-</div><div class='del'>-        /* Initialization */</div><div class='del'>-        local = GF_CALLOC (1, sizeof (stripe_local_t),</div><div class='del'>-                           gf_stripe_mt_stripe_local_t);</div><div class='del'>-        if (!local) {</div><div class='del'>-                op_errno = ENOMEM;</div><div class='del'>-                goto err;</div><div class='del'>-        }</div><div class='del'>-        local-&gt;op_ret = -1;</div><div class='del'>-        frame-&gt;local = local;</div><div class='del'>-        loc_copy (&amp;local-&gt;loc, loc);</div><div class='del'>-</div><div class='del'>-        /* Everytime in stripe lookup, all child nodes</div><div class='del'>-           should be looked up */</div><div class='del'>-        local-&gt;call_count = priv-&gt;child_count;</div><div class='del'>-        while (trav) {</div><div class='del'>-                STACK_WIND (frame, stripe_lookup_cbk, trav-&gt;xlator,</div><div class='del'>-                            trav-&gt;xlator-&gt;fops-&gt;lookup,</div><div class='del'>-                            loc, xattr_req);</div><div class='del'>-                trav = trav-&gt;next;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        return 0;</div><div class='del'>-err:</div><div class='del'>-        STACK_UNWIND_STRICT (lookup, frame, -1, op_errno, NULL, NULL, NULL, NULL);</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-stripe_stat_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-                 int32_t op_ret, int32_t op_errno, struct iatt *buf)</div><div class='del'>-{</div><div class='del'>-        int32_t         callcnt = 0;</div><div class='del'>-        stripe_local_t *local = NULL;</div><div class='del'>-        call_frame_t   *prev = NULL;</div><div class='del'>-</div><div class='del'>-        if (!this || !frame || !frame-&gt;local || !cookie) {</div><div class='del'>-                gf_log ("stripe", GF_LOG_DEBUG, "possible NULL deref");</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-        prev  = cookie;</div><div class='del'>-        local = frame-&gt;local;</div><div class='del'>-</div><div class='del'>-        LOCK (&amp;frame-&gt;lock);</div><div class='del'>-        {</div><div class='del'>-                callcnt = --local-&gt;call_count;</div><div class='del'>-</div><div class='del'>-                if (op_ret == -1) {</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-                                "%s returned error %s",</div><div class='del'>-                                prev-&gt;this-&gt;name, strerror (op_errno));</div><div class='del'>-                        local-&gt;op_errno = op_errno;</div><div class='del'>-                        if ((op_errno != ENOENT) ||</div><div class='del'>-                            (prev-&gt;this == FIRST_CHILD (this)))</div><div class='del'>-                                local-&gt;failed = 1;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                if (op_ret == 0) {</div><div class='del'>-                        local-&gt;op_ret = 0;</div><div class='del'>-</div><div class='del'>-                        if (FIRST_CHILD(this) == prev-&gt;this) {</div><div class='del'>-                                local-&gt;stbuf = *buf;</div><div class='del'>-                        }</div><div class='del'>-</div><div class='del'>-                        local-&gt;stbuf_blocks += buf-&gt;ia_blocks;</div><div class='del'>-                        if (local-&gt;stbuf_size &lt; buf-&gt;ia_size)</div><div class='del'>-                                local-&gt;stbuf_size = buf-&gt;ia_size;</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='del'>-        UNLOCK (&amp;frame-&gt;lock);</div><div class='del'>-</div><div class='del'>-        if (!callcnt) {</div><div class='del'>-                if (local-&gt;failed)</div><div class='del'>-                        local-&gt;op_ret = -1;</div><div class='del'>-</div><div class='del'>-                if (local-&gt;op_ret != -1) {</div><div class='del'>-                        local-&gt;stbuf.ia_size   = local-&gt;stbuf_size;</div><div class='del'>-                        local-&gt;stbuf.ia_blocks = local-&gt;stbuf_blocks;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                stripe_local_wipe (local);</div><div class='del'>-                STACK_UNWIND_STRICT (stat, frame, local-&gt;op_ret,</div><div class='del'>-                                     local-&gt;op_errno, &amp;local-&gt;stbuf);</div><div class='del'>-        }</div><div class='del'>-out:</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-stripe_stat (call_frame_t *frame, xlator_t *this, loc_t *loc)</div><div class='del'>-{</div><div class='del'>-        xlator_list_t    *trav = NULL;</div><div class='del'>-        stripe_local_t   *local = NULL;</div><div class='del'>-        stripe_private_t *priv = NULL;</div><div class='del'>-        int32_t           op_errno = EINVAL;</div><div class='del'>-</div><div class='del'>-        VALIDATE_OR_GOTO (frame, err);</div><div class='del'>-        VALIDATE_OR_GOTO (this, err);</div><div class='del'>-        VALIDATE_OR_GOTO (loc, err);</div><div class='del'>-        VALIDATE_OR_GOTO (loc-&gt;path, err);</div><div class='del'>-        VALIDATE_OR_GOTO (loc-&gt;inode, err);</div><div class='del'>-</div><div class='del'>-        priv = this-&gt;private;</div><div class='del'>-        trav = this-&gt;children;</div><div class='del'>-</div><div class='del'>-        if (priv-&gt;first_child_down) {</div><div class='del'>-                op_errno = ENOTCONN;</div><div class='del'>-                goto err;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        /* Initialization */</div><div class='del'>-        local = GF_CALLOC (1, sizeof (stripe_local_t),</div><div class='del'>-                           gf_stripe_mt_stripe_local_t);</div><div class='del'>-        if (!local) {</div><div class='del'>-                op_errno = ENOMEM;</div><div class='del'>-                goto err;</div><div class='del'>-        }</div><div class='del'>-        local-&gt;op_ret = -1;</div><div class='del'>-        frame-&gt;local = local;</div><div class='del'>-        local-&gt;call_count = priv-&gt;child_count;</div><div class='del'>-</div><div class='del'>-        while (trav) {</div><div class='del'>-                STACK_WIND (frame, stripe_stat_cbk, trav-&gt;xlator,</div><div class='del'>-                            trav-&gt;xlator-&gt;fops-&gt;stat, loc);</div><div class='del'>-                trav = trav-&gt;next;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        return 0;</div><div class='del'>-</div><div class='del'>-err:</div><div class='del'>-        STACK_UNWIND_STRICT (stat, frame, -1, op_errno, NULL);</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-stripe_statfs_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-                   int32_t op_ret, int32_t op_errno, struct statvfs *stbuf)</div><div class='del'>-{</div><div class='del'>-        stripe_local_t *local = NULL;</div><div class='del'>-        int32_t         callcnt = 0;</div><div class='del'>-</div><div class='del'>-        if (!this || !frame || !frame-&gt;local) {</div><div class='del'>-                gf_log ("stripe", GF_LOG_DEBUG, "possible NULL deref");</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-        local = frame-&gt;local;</div><div class='del'>-</div><div class='del'>-        LOCK(&amp;frame-&gt;lock);</div><div class='del'>-        {</div><div class='del'>-                callcnt = --local-&gt;call_count;</div><div class='del'>-</div><div class='del'>-                if (op_ret &amp;&amp; (op_errno != ENOTCONN)) {</div><div class='del'>-                        local-&gt;op_errno = op_errno;</div><div class='del'>-                }</div><div class='del'>-                if (op_ret == 0) {</div><div class='del'>-                        struct statvfs *dict_buf = &amp;local-&gt;statvfs_buf;</div><div class='del'>-                        dict_buf-&gt;f_bsize   = stbuf-&gt;f_bsize;</div><div class='del'>-                        dict_buf-&gt;f_frsize  = stbuf-&gt;f_frsize;</div><div class='del'>-                        dict_buf-&gt;f_blocks += stbuf-&gt;f_blocks;</div><div class='del'>-                        dict_buf-&gt;f_bfree  += stbuf-&gt;f_bfree;</div><div class='del'>-                        dict_buf-&gt;f_bavail += stbuf-&gt;f_bavail;</div><div class='del'>-                        dict_buf-&gt;f_files  += stbuf-&gt;f_files;</div><div class='del'>-                        dict_buf-&gt;f_ffree  += stbuf-&gt;f_ffree;</div><div class='del'>-                        dict_buf-&gt;f_favail += stbuf-&gt;f_favail;</div><div class='del'>-                        dict_buf-&gt;f_fsid    = stbuf-&gt;f_fsid;</div><div class='del'>-                        dict_buf-&gt;f_flag    = stbuf-&gt;f_flag;</div><div class='del'>-                        dict_buf-&gt;f_namemax = stbuf-&gt;f_namemax;</div><div class='del'>-                        local-&gt;op_ret = 0;</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='del'>-        UNLOCK (&amp;frame-&gt;lock);</div><div class='del'>-</div><div class='del'>-        if (!callcnt) {</div><div class='del'>-                STACK_UNWIND_STRICT (statfs, frame, local-&gt;op_ret,</div><div class='del'>-                                     local-&gt;op_errno, &amp;local-&gt;statvfs_buf);</div><div class='del'>-        }</div><div class='del'>-out:</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-stripe_statfs (call_frame_t *frame, xlator_t *this, loc_t *loc)</div><div class='del'>-{</div><div class='del'>-        stripe_local_t   *local = NULL;</div><div class='del'>-        xlator_list_t    *trav = NULL;</div><div class='del'>-        stripe_private_t *priv = NULL;</div><div class='del'>-        int32_t           op_errno = EINVAL;</div><div class='del'>-</div><div class='del'>-        VALIDATE_OR_GOTO (frame, err);</div><div class='del'>-        VALIDATE_OR_GOTO (this, err);</div><div class='del'>-        VALIDATE_OR_GOTO (loc, err);</div><div class='del'>-</div><div class='del'>-        trav = this-&gt;children;</div><div class='del'>-        priv = this-&gt;private;</div><div class='del'>-</div><div class='del'>-        /* Initialization */</div><div class='del'>-        local = GF_CALLOC (1, sizeof (stripe_local_t),</div><div class='del'>-                           gf_stripe_mt_stripe_local_t);</div><div class='del'>-        if (!local) {</div><div class='del'>-                op_errno = ENOMEM;</div><div class='del'>-                goto err;</div><div class='del'>-        }</div><div class='del'>-        local-&gt;op_ret = -1;</div><div class='del'>-        local-&gt;op_errno = ENOTCONN;</div><div class='del'>-        frame-&gt;local = local;</div><div class='del'>-</div><div class='del'>-        local-&gt;call_count = priv-&gt;child_count;</div><div class='del'>-        while (trav) {</div><div class='del'>-                STACK_WIND (frame, stripe_statfs_cbk, trav-&gt;xlator,</div><div class='del'>-                            trav-&gt;xlator-&gt;fops-&gt;statfs, loc);</div><div class='del'>-                trav = trav-&gt;next;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        return 0;</div><div class='del'>-err:</div><div class='del'>-        STACK_UNWIND_STRICT (statfs, frame, -1, op_errno, NULL);</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-stripe_truncate_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-                     int32_t op_ret, int32_t op_errno, struct iatt *prebuf,</div><div class='del'>-                     struct iatt *postbuf)</div><div class='del'>-{</div><div class='del'>-        int32_t         callcnt = 0;</div><div class='del'>-        stripe_local_t *local = NULL;</div><div class='del'>-        call_frame_t   *prev = NULL;</div><div class='del'>-</div><div class='del'>-        if (!this || !frame || !frame-&gt;local || !cookie) {</div><div class='del'>-                gf_log ("stripe", GF_LOG_DEBUG, "possible NULL deref");</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        prev  = cookie;</div><div class='del'>-        local = frame-&gt;local;</div><div class='del'>-</div><div class='del'>-        LOCK (&amp;frame-&gt;lock);</div><div class='del'>-        {</div><div class='del'>-                callcnt = --local-&gt;call_count;</div><div class='del'>-</div><div class='del'>-                if (op_ret == -1) {</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-                                "%s returned error %s",</div><div class='del'>-                                prev-&gt;this-&gt;name, strerror (op_errno));</div><div class='del'>-                        local-&gt;op_errno = op_errno;</div><div class='del'>-                        if ((op_errno != ENOENT) ||</div><div class='del'>-                            (prev-&gt;this == FIRST_CHILD (this)))</div><div class='del'>-                                local-&gt;failed = 1;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                if (op_ret == 0) {</div><div class='del'>-                        local-&gt;op_ret = 0;</div><div class='del'>-                        if (FIRST_CHILD(this) == prev-&gt;this) {</div><div class='del'>-                                local-&gt;pre_buf  = *prebuf;</div><div class='del'>-                                local-&gt;post_buf = *postbuf;</div><div class='del'>-                        }</div><div class='del'>-</div><div class='del'>-                        local-&gt;prebuf_blocks  += prebuf-&gt;ia_blocks;</div><div class='del'>-                        local-&gt;postbuf_blocks += postbuf-&gt;ia_blocks;</div><div class='del'>-</div><div class='del'>-                        if (local-&gt;prebuf_size &lt; prebuf-&gt;ia_size)</div><div class='del'>-                                local-&gt;prebuf_size = prebuf-&gt;ia_size;</div><div class='del'>-</div><div class='del'>-                        if (local-&gt;postbuf_size &lt; postbuf-&gt;ia_size)</div><div class='del'>-                                local-&gt;postbuf_size = postbuf-&gt;ia_size;</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='del'>-        UNLOCK (&amp;frame-&gt;lock);</div><div class='del'>-</div><div class='del'>-        if (!callcnt) {</div><div class='del'>-                if (local-&gt;failed)</div><div class='del'>-                        local-&gt;op_ret = -1;</div><div class='del'>-</div><div class='del'>-                if (local-&gt;op_ret != -1) {</div><div class='del'>-                        local-&gt;pre_buf.ia_blocks  = local-&gt;prebuf_blocks;</div><div class='del'>-                        local-&gt;pre_buf.ia_size    = local-&gt;prebuf_size;</div><div class='del'>-                        local-&gt;post_buf.ia_blocks = local-&gt;postbuf_blocks;</div><div class='del'>-                        local-&gt;post_buf.ia_size   = local-&gt;postbuf_size;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                stripe_local_wipe (local);</div><div class='del'>-                STACK_UNWIND_STRICT (truncate, frame, local-&gt;op_ret,</div><div class='del'>-                                     local-&gt;op_errno, &amp;local-&gt;pre_buf,</div><div class='del'>-                                     &amp;local-&gt;post_buf);</div><div class='del'>-        }</div><div class='del'>-out:</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-stripe_truncate (call_frame_t *frame, xlator_t *this, loc_t *loc, off_t offset)</div><div class='del'>-{</div><div class='del'>-        xlator_list_t    *trav = NULL;</div><div class='del'>-        stripe_local_t   *local = NULL;</div><div class='del'>-        stripe_private_t *priv = NULL;</div><div class='del'>-        int32_t           op_errno = EINVAL;</div><div class='del'>-</div><div class='del'>-        VALIDATE_OR_GOTO (frame, err);</div><div class='del'>-        VALIDATE_OR_GOTO (this, err);</div><div class='del'>-        VALIDATE_OR_GOTO (loc, err);</div><div class='del'>-        VALIDATE_OR_GOTO (loc-&gt;path, err);</div><div class='del'>-        VALIDATE_OR_GOTO (loc-&gt;inode, err);</div><div class='del'>-</div><div class='del'>-        priv = this-&gt;private;</div><div class='del'>-        trav = this-&gt;children;</div><div class='del'>-</div><div class='del'>-        if (priv-&gt;first_child_down) {</div><div class='del'>-                op_errno = ENOTCONN;</div><div class='del'>-                goto err;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        /* Initialization */</div><div class='del'>-        local = GF_CALLOC (1, sizeof (stripe_local_t),</div><div class='del'>-                           gf_stripe_mt_stripe_local_t);</div><div class='del'>-        if (!local) {</div><div class='del'>-                op_errno = ENOMEM;</div><div class='del'>-                goto err;</div><div class='del'>-        }</div><div class='del'>-        local-&gt;op_ret = -1;</div><div class='del'>-        frame-&gt;local = local;</div><div class='del'>-        local-&gt;call_count = priv-&gt;child_count;</div><div class='del'>-</div><div class='del'>-        while (trav) {</div><div class='del'>-                STACK_WIND (frame, stripe_truncate_cbk, trav-&gt;xlator,</div><div class='del'>-                            trav-&gt;xlator-&gt;fops-&gt;truncate, loc, offset);</div><div class='del'>-                trav = trav-&gt;next;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        return 0;</div><div class='del'>-err:</div><div class='del'>-        STACK_UNWIND_STRICT (truncate, frame, -1, op_errno, NULL, NULL);</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-stripe_setattr_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-                    int32_t op_ret, int32_t op_errno,</div><div class='del'>-                    struct iatt *preop, struct iatt *postop)</div><div class='del'>-{</div><div class='del'>-        int32_t         callcnt = 0;</div><div class='del'>-        stripe_local_t *local = NULL;</div><div class='del'>-        call_frame_t   *prev = NULL;</div><div class='del'>-</div><div class='del'>-        if (!this || !frame || !frame-&gt;local || !cookie) {</div><div class='del'>-                gf_log ("stripe", GF_LOG_DEBUG, "possible NULL deref");</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        prev  = cookie;</div><div class='del'>-        local = frame-&gt;local;</div><div class='del'>-</div><div class='del'>-        LOCK (&amp;frame-&gt;lock);</div><div class='del'>-        {</div><div class='del'>-                callcnt = --local-&gt;call_count;</div><div class='del'>-</div><div class='del'>-                if (op_ret == -1) {</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-                                "%s returned error %s",</div><div class='del'>-                                prev-&gt;this-&gt;name, strerror (op_errno));</div><div class='del'>-                        local-&gt;op_errno = op_errno;</div><div class='del'>-                        if ((op_errno != ENOENT) ||</div><div class='del'>-                            (prev-&gt;this == FIRST_CHILD (this)))</div><div class='del'>-                                local-&gt;failed = 1;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                if (op_ret == 0) {</div><div class='del'>-                        local-&gt;op_ret = 0;</div><div class='del'>-</div><div class='del'>-                        if (FIRST_CHILD(this) == prev-&gt;this) {</div><div class='del'>-                                local-&gt;pre_buf  = *preop;</div><div class='del'>-                                local-&gt;post_buf = *postop;</div><div class='del'>-                        }</div><div class='del'>-</div><div class='del'>-                        local-&gt;prebuf_blocks  += preop-&gt;ia_blocks;</div><div class='del'>-                        local-&gt;postbuf_blocks += postop-&gt;ia_blocks;</div><div class='del'>-</div><div class='del'>-                        if (local-&gt;prebuf_size &lt; preop-&gt;ia_size)</div><div class='del'>-                                local-&gt;prebuf_size = preop-&gt;ia_size;</div><div class='del'>-                        if (local-&gt;postbuf_size &lt; postop-&gt;ia_size)</div><div class='del'>-                                local-&gt;postbuf_size = postop-&gt;ia_size;</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='del'>-        UNLOCK (&amp;frame-&gt;lock);</div><div class='del'>-</div><div class='del'>-        if (!callcnt) {</div><div class='del'>-                if (local-&gt;failed)</div><div class='del'>-                        local-&gt;op_ret = -1;</div><div class='del'>-</div><div class='del'>-                if (local-&gt;op_ret != -1) {</div><div class='del'>-                        local-&gt;pre_buf.ia_blocks  = local-&gt;prebuf_blocks;</div><div class='del'>-                        local-&gt;pre_buf.ia_size    = local-&gt;prebuf_size;</div><div class='del'>-                        local-&gt;post_buf.ia_blocks = local-&gt;postbuf_blocks;</div><div class='del'>-                        local-&gt;post_buf.ia_size   = local-&gt;postbuf_size;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                stripe_local_wipe (local);</div><div class='del'>-                STACK_UNWIND_STRICT (setattr, frame, local-&gt;op_ret,</div><div class='del'>-                                     local-&gt;op_errno, &amp;local-&gt;pre_buf,</div><div class='del'>-                                     &amp;local-&gt;post_buf);</div><div class='del'>-        }</div><div class='del'>-out:</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-stripe_setattr (call_frame_t *frame, xlator_t *this, loc_t *loc,</div><div class='del'>-                struct iatt *stbuf, int32_t valid)</div><div class='del'>-{</div><div class='del'>-        xlator_list_t    *trav = NULL;</div><div class='del'>-        stripe_local_t   *local = NULL;</div><div class='del'>-        stripe_private_t *priv = NULL;</div><div class='del'>-        int32_t           op_errno = EINVAL;</div><div class='del'>-</div><div class='del'>-        VALIDATE_OR_GOTO (frame, err);</div><div class='del'>-        VALIDATE_OR_GOTO (this, err);</div><div class='del'>-        VALIDATE_OR_GOTO (loc, err);</div><div class='del'>-        VALIDATE_OR_GOTO (loc-&gt;path, err);</div><div class='del'>-        VALIDATE_OR_GOTO (loc-&gt;inode, err);</div><div class='del'>-</div><div class='del'>-        priv = this-&gt;private;</div><div class='del'>-        trav = this-&gt;children;</div><div class='del'>-</div><div class='del'>-        if (priv-&gt;first_child_down) {</div><div class='del'>-                op_errno = ENOTCONN;</div><div class='del'>-                goto err;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        /* Initialization */</div><div class='del'>-        local = GF_CALLOC (1, sizeof (stripe_local_t),</div><div class='del'>-                           gf_stripe_mt_stripe_local_t);</div><div class='del'>-        if (!local) {</div><div class='del'>-                op_errno = ENOMEM;</div><div class='del'>-                goto err;</div><div class='del'>-        }</div><div class='del'>-        local-&gt;op_ret = -1;</div><div class='del'>-        frame-&gt;local = local;</div><div class='del'>-        local-&gt;call_count = priv-&gt;child_count;</div><div class='del'>-</div><div class='del'>-        while (trav) {</div><div class='del'>-                STACK_WIND (frame, stripe_setattr_cbk,</div><div class='del'>-                            trav-&gt;xlator, trav-&gt;xlator-&gt;fops-&gt;setattr,</div><div class='del'>-                            loc, stbuf, valid);</div><div class='del'>-                trav = trav-&gt;next;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        return 0;</div><div class='del'>-err:</div><div class='del'>-        STACK_UNWIND_STRICT (setattr, frame, -1, op_errno, NULL, NULL);</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-stripe_fsetattr (call_frame_t *frame, xlator_t *this, fd_t *fd,</div><div class='del'>-                 struct iatt *stbuf, int32_t valid)</div><div class='del'>-{</div><div class='del'>-        stripe_local_t   *local = NULL;</div><div class='del'>-        stripe_private_t *priv = NULL;</div><div class='del'>-        xlator_list_t    *trav = NULL;</div><div class='del'>-        int32_t           op_errno = EINVAL;</div><div class='del'>-</div><div class='del'>-        VALIDATE_OR_GOTO (frame, err);</div><div class='del'>-        VALIDATE_OR_GOTO (this, err);</div><div class='del'>-        VALIDATE_OR_GOTO (fd, err);</div><div class='del'>-        VALIDATE_OR_GOTO (fd-&gt;inode, err);</div><div class='del'>-</div><div class='del'>-        priv = this-&gt;private;</div><div class='del'>-        trav = this-&gt;children;</div><div class='del'>-</div><div class='del'>-        /* Initialization */</div><div class='del'>-        local = GF_CALLOC (1, sizeof (stripe_local_t),</div><div class='del'>-                           gf_stripe_mt_stripe_local_t);</div><div class='del'>-        if (!local) {</div><div class='del'>-                op_errno = ENOMEM;</div><div class='del'>-                goto err;</div><div class='del'>-        }</div><div class='del'>-        local-&gt;op_ret = -1;</div><div class='del'>-        frame-&gt;local = local;</div><div class='del'>-        local-&gt;call_count = priv-&gt;child_count;</div><div class='del'>-</div><div class='del'>-        while (trav) {</div><div class='del'>-                STACK_WIND (frame, stripe_setattr_cbk, trav-&gt;xlator,</div><div class='del'>-                            trav-&gt;xlator-&gt;fops-&gt;fsetattr, fd, stbuf, valid);</div><div class='del'>-                trav = trav-&gt;next;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        return 0;</div><div class='del'>-err:</div><div class='del'>-        STACK_UNWIND_STRICT (fsetattr, frame, -1, op_errno, NULL, NULL);</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-stripe_stack_rename_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-                         int32_t op_ret, int32_t op_errno, struct iatt *buf,</div><div class='del'>-                         struct iatt *preoldparent, struct iatt *postoldparent,</div><div class='del'>-                         struct iatt *prenewparent, struct iatt *postnewparent)</div><div class='del'>-{</div><div class='del'>-        int32_t         callcnt = 0;</div><div class='del'>-        stripe_local_t *local = NULL;</div><div class='del'>-        call_frame_t   *prev = NULL;</div><div class='del'>-</div><div class='del'>-        if (!this || !frame || !frame-&gt;local || !cookie) {</div><div class='del'>-                gf_log ("stripe", GF_LOG_DEBUG, "possible NULL deref");</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        prev  = cookie;</div><div class='del'>-        local = frame-&gt;local;</div><div class='del'>-</div><div class='del'>-        LOCK (&amp;frame-&gt;lock);</div><div class='del'>-        {</div><div class='del'>-                callcnt = --local-&gt;call_count;</div><div class='del'>-</div><div class='del'>-                if (op_ret == -1) {</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-                                "%s returned error %s",</div><div class='del'>-                                prev-&gt;this-&gt;name, strerror (op_errno));</div><div class='del'>-                        local-&gt;op_errno = op_errno;</div><div class='del'>-                        if ((op_errno != ENOENT) ||</div><div class='del'>-                            (prev-&gt;this == FIRST_CHILD (this)))</div><div class='del'>-                                local-&gt;failed = 1;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                if (op_ret == 0) {</div><div class='del'>-                        local-&gt;op_ret = 0;</div><div class='del'>-</div><div class='del'>-                        local-&gt;stbuf.ia_blocks      += buf-&gt;ia_blocks;</div><div class='del'>-                        local-&gt;preparent.ia_blocks  += preoldparent-&gt;ia_blocks;</div><div class='del'>-                        local-&gt;postparent.ia_blocks += postoldparent-&gt;ia_blocks;</div><div class='del'>-                        local-&gt;pre_buf.ia_blocks    += prenewparent-&gt;ia_blocks;</div><div class='del'>-                        local-&gt;post_buf.ia_blocks   += postnewparent-&gt;ia_blocks;</div><div class='del'>-</div><div class='del'>-                        if (local-&gt;stbuf.ia_size &lt; buf-&gt;ia_size)</div><div class='del'>-                                local-&gt;stbuf.ia_size =  buf-&gt;ia_size;</div><div class='del'>-</div><div class='del'>-                        if (local-&gt;preparent.ia_size &lt; preoldparent-&gt;ia_size)</div><div class='del'>-                                local-&gt;preparent.ia_size = preoldparent-&gt;ia_size;</div><div class='del'>-</div><div class='del'>-                        if (local-&gt;postparent.ia_size &lt; postoldparent-&gt;ia_size)</div><div class='del'>-                                local-&gt;postparent.ia_size = postoldparent-&gt;ia_size;</div><div class='del'>-</div><div class='del'>-                        if (local-&gt;pre_buf.ia_size &lt; prenewparent-&gt;ia_size)</div><div class='del'>-                                local-&gt;pre_buf.ia_size = prenewparent-&gt;ia_size;</div><div class='del'>-</div><div class='del'>-                        if (local-&gt;post_buf.ia_size &lt; postnewparent-&gt;ia_size)</div><div class='del'>-                                local-&gt;post_buf.ia_size = postnewparent-&gt;ia_size;</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='del'>-        UNLOCK (&amp;frame-&gt;lock);</div><div class='del'>-</div><div class='del'>-        if (!callcnt) {</div><div class='del'>-                if (local-&gt;failed)</div><div class='del'>-                        local-&gt;op_ret = -1;</div><div class='del'>-</div><div class='del'>-                stripe_local_wipe (local);</div><div class='del'>-                STACK_UNWIND_STRICT (rename, frame, local-&gt;op_ret, local-&gt;op_errno,</div><div class='del'>-                                     &amp;local-&gt;stbuf, &amp;local-&gt;preparent,</div><div class='del'>-                                     &amp;local-&gt;postparent,  &amp;local-&gt;pre_buf,</div><div class='del'>-                                     &amp;local-&gt;post_buf);</div><div class='del'>-        }</div><div class='del'>-out:</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-stripe_first_rename_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-                         int32_t op_ret, int32_t op_errno, struct iatt *buf,</div><div class='del'>-                         struct iatt *preoldparent, struct iatt *postoldparent,</div><div class='del'>-                         struct iatt *prenewparent, struct iatt *postnewparent)</div><div class='del'>-{</div><div class='del'>-        stripe_local_t *local = NULL;</div><div class='del'>-        xlator_list_t  *trav = NULL;</div><div class='del'>-</div><div class='del'>-        if (!this || !frame || !frame-&gt;local) {</div><div class='del'>-                gf_log ("stripe", GF_LOG_DEBUG, "possible NULL deref");</div><div class='del'>-                op_errno = EINVAL;</div><div class='del'>-                goto unwind;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (op_ret == -1) {</div><div class='del'>-                goto unwind;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        local = frame-&gt;local;</div><div class='del'>-        trav = this-&gt;children;</div><div class='del'>-</div><div class='del'>-        local-&gt;stbuf      = *buf;</div><div class='del'>-        local-&gt;preparent  = *preoldparent;</div><div class='del'>-        local-&gt;postparent = *postoldparent;</div><div class='del'>-        local-&gt;pre_buf    = *prenewparent;</div><div class='del'>-        local-&gt;post_buf   = *postnewparent;</div><div class='del'>-</div><div class='del'>-        local-&gt;op_ret = 0;</div><div class='del'>-        local-&gt;call_count--;</div><div class='del'>-</div><div class='del'>-        trav = trav-&gt;next; /* Skip first child */</div><div class='del'>-        while (trav) {</div><div class='del'>-                STACK_WIND (frame, stripe_stack_rename_cbk,</div><div class='del'>-                            trav-&gt;xlator, trav-&gt;xlator-&gt;fops-&gt;rename,</div><div class='del'>-                            &amp;local-&gt;loc, &amp;local-&gt;loc2);</div><div class='del'>-                trav = trav-&gt;next;</div><div class='del'>-        }</div><div class='del'>-        return 0;</div><div class='del'>-</div><div class='del'>-unwind:</div><div class='del'>-        stripe_local_wipe (local);</div><div class='del'>-        STACK_UNWIND_STRICT (rename, frame, -1, op_errno, buf, preoldparent,</div><div class='del'>-                             postoldparent, prenewparent, postnewparent);</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-stripe_rename (call_frame_t *frame, xlator_t *this, loc_t *oldloc,</div><div class='del'>-               loc_t *newloc)</div><div class='del'>-{</div><div class='del'>-        stripe_private_t *priv = NULL;</div><div class='del'>-        stripe_local_t   *local = NULL;</div><div class='del'>-        xlator_list_t    *trav = NULL;</div><div class='del'>-        int32_t           op_errno = EINVAL;</div><div class='del'>-</div><div class='del'>-        VALIDATE_OR_GOTO (frame, err);</div><div class='del'>-        VALIDATE_OR_GOTO (this, err);</div><div class='del'>-        VALIDATE_OR_GOTO (oldloc, err);</div><div class='del'>-        VALIDATE_OR_GOTO (oldloc-&gt;path, err);</div><div class='del'>-        VALIDATE_OR_GOTO (oldloc-&gt;inode, err);</div><div class='del'>-        VALIDATE_OR_GOTO (newloc, err);</div><div class='del'>-</div><div class='del'>-        priv = this-&gt;private;</div><div class='del'>-        trav = this-&gt;children;</div><div class='del'>-</div><div class='del'>-        /* If any one node is down, don't allow rename */</div><div class='del'>-        if (priv-&gt;nodes_down) {</div><div class='del'>-                op_errno = ENOTCONN;</div><div class='del'>-                goto err;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        /* Initialization */</div><div class='del'>-        local = GF_CALLOC (1, sizeof (stripe_local_t),</div><div class='del'>-                           gf_stripe_mt_stripe_local_t);</div><div class='del'>-        if (!local) {</div><div class='del'>-                op_errno = ENOMEM;</div><div class='del'>-                goto err;</div><div class='del'>-        }</div><div class='del'>-        local-&gt;op_ret = -1;</div><div class='del'>-        loc_copy (&amp;local-&gt;loc, oldloc);</div><div class='del'>-        loc_copy (&amp;local-&gt;loc2, newloc);</div><div class='del'>-</div><div class='del'>-        local-&gt;call_count = priv-&gt;child_count;</div><div class='del'>-</div><div class='del'>-        frame-&gt;local = local;</div><div class='del'>-</div><div class='del'>-        STACK_WIND (frame, stripe_first_rename_cbk, trav-&gt;xlator,</div><div class='del'>-                    trav-&gt;xlator-&gt;fops-&gt;rename, oldloc, newloc);</div><div class='del'>-</div><div class='del'>-        return 0;</div><div class='del'>-err:</div><div class='del'>-        STACK_UNWIND_STRICT (rename, frame, -1, op_errno, NULL, NULL, NULL,</div><div class='del'>-                             NULL, NULL);</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-stripe_unlink_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-                   int32_t op_ret, int32_t op_errno, struct iatt *preparent,</div><div class='del'>-                   struct iatt *postparent)</div><div class='del'>-{</div><div class='del'>-        int32_t         callcnt = 0;</div><div class='del'>-        stripe_local_t *local   = NULL;</div><div class='del'>-        call_frame_t   *prev = NULL;</div><div class='del'>-</div><div class='del'>-        if (!this || !frame || !frame-&gt;local || !cookie) {</div><div class='del'>-                gf_log ("stripe", GF_LOG_DEBUG, "possible NULL deref");</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        prev  = cookie;</div><div class='del'>-        local = frame-&gt;local;</div><div class='del'>-</div><div class='del'>-        LOCK (&amp;frame-&gt;lock);</div><div class='del'>-        {</div><div class='del'>-                callcnt = --local-&gt;call_count;</div><div class='del'>-</div><div class='del'>-                if (op_ret == -1) {</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_DEBUG, "%s returned %s",</div><div class='del'>-                                prev-&gt;this-&gt;name, strerror (op_errno));</div><div class='del'>-                        local-&gt;op_errno = op_errno;</div><div class='del'>-                        if ((op_errno != ENOENT) ||</div><div class='del'>-                            (prev-&gt;this == FIRST_CHILD (this)))</div><div class='del'>-                                local-&gt;failed = 1;</div><div class='del'>-                }</div><div class='del'>-                if (op_ret &gt;= 0) {</div><div class='del'>-                        local-&gt;op_ret = op_ret;</div><div class='del'>-                        if (FIRST_CHILD(this) == prev-&gt;this) {</div><div class='del'>-                                local-&gt;preparent  = *preparent;</div><div class='del'>-                                local-&gt;postparent = *postparent;</div><div class='del'>-                        }</div><div class='del'>-                        local-&gt;preparent_blocks  += preparent-&gt;ia_blocks;</div><div class='del'>-                        local-&gt;postparent_blocks += postparent-&gt;ia_blocks;</div><div class='del'>-</div><div class='del'>-                        if (local-&gt;preparent_size &lt; preparent-&gt;ia_size)</div><div class='del'>-                                local-&gt;preparent_size = preparent-&gt;ia_size;</div><div class='del'>-</div><div class='del'>-                        if (local-&gt;postparent_size &lt; postparent-&gt;ia_size)</div><div class='del'>-                                local-&gt;postparent_size = postparent-&gt;ia_size;</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='del'>-        UNLOCK (&amp;frame-&gt;lock);</div><div class='del'>-</div><div class='del'>-        if (!callcnt) {</div><div class='del'>-                if (local-&gt;failed)</div><div class='del'>-                        local-&gt;op_ret = -1;</div><div class='del'>-</div><div class='del'>-                if (local-&gt;op_ret != -1) {</div><div class='del'>-                        local-&gt;preparent.ia_blocks  = local-&gt;preparent_blocks;</div><div class='del'>-                        local-&gt;preparent.ia_size    = local-&gt;preparent_size;</div><div class='del'>-                        local-&gt;postparent.ia_blocks = local-&gt;postparent_blocks;</div><div class='del'>-                        local-&gt;postparent.ia_size   = local-&gt;postparent_size;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                stripe_local_wipe (local);</div><div class='del'>-                STACK_UNWIND_STRICT (unlink, frame, local-&gt;op_ret,</div><div class='del'>-                                     local-&gt;op_errno, &amp;local-&gt;preparent,</div><div class='del'>-                                     &amp;local-&gt;postparent);</div><div class='del'>-        }</div><div class='del'>-out:</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-stripe_unlink (call_frame_t *frame, xlator_t *this, loc_t *loc)</div><div class='del'>-{</div><div class='del'>-        xlator_list_t    *trav = NULL;</div><div class='del'>-        stripe_local_t   *local = NULL;</div><div class='del'>-        stripe_private_t *priv = NULL;</div><div class='del'>-        int32_t           op_errno = EINVAL;</div><div class='del'>-</div><div class='del'>-        VALIDATE_OR_GOTO (frame, err);</div><div class='del'>-        VALIDATE_OR_GOTO (this, err);</div><div class='del'>-        VALIDATE_OR_GOTO (loc, err);</div><div class='del'>-        VALIDATE_OR_GOTO (loc-&gt;path, err);</div><div class='del'>-        VALIDATE_OR_GOTO (loc-&gt;inode, err);</div><div class='del'>-</div><div class='del'>-        priv = this-&gt;private;</div><div class='del'>-        trav = this-&gt;children;</div><div class='del'>-</div><div class='del'>-        if (priv-&gt;first_child_down) {</div><div class='del'>-                op_errno = ENOTCONN;</div><div class='del'>-                goto err;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        /* Don't unlink a file if a node is down */</div><div class='del'>-        if (priv-&gt;nodes_down) {</div><div class='del'>-                op_errno = ENOTCONN;</div><div class='del'>-                goto err;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        /* Initialization */</div><div class='del'>-        local = GF_CALLOC (1, sizeof (stripe_local_t),</div><div class='del'>-                           gf_stripe_mt_stripe_local_t);</div><div class='del'>-        if (!local) {</div><div class='del'>-                op_errno = ENOMEM;</div><div class='del'>-                goto err;</div><div class='del'>-        }</div><div class='del'>-        local-&gt;op_ret = -1;</div><div class='del'>-        frame-&gt;local = local;</div><div class='del'>-        local-&gt;call_count = priv-&gt;child_count;</div><div class='del'>-</div><div class='del'>-        while (trav) {</div><div class='del'>-                STACK_WIND (frame, stripe_unlink_cbk,</div><div class='del'>-                            trav-&gt;xlator, trav-&gt;xlator-&gt;fops-&gt;unlink,</div><div class='del'>-                            loc);</div><div class='del'>-                trav = trav-&gt;next;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        return 0;</div><div class='del'>-err:</div><div class='del'>-        STACK_UNWIND_STRICT (unlink, frame, -1, op_errno, NULL, NULL);</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-stripe_first_rmdir_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-                        int32_t op_ret, int32_t op_errno,struct iatt *preparent,</div><div class='del'>-                        struct iatt *postparent)</div><div class='del'>-</div><div class='del'>-{</div><div class='del'>-        xlator_list_t *trav = NULL;</div><div class='del'>-        stripe_local_t *local = NULL;</div><div class='del'>-</div><div class='del'>-        if (!this || !frame || !frame-&gt;local) {</div><div class='del'>-                gf_log ("stripe", GF_LOG_DEBUG, "possible NULL deref");</div><div class='del'>-                op_errno = EINVAL;</div><div class='del'>-                goto err;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (op_ret == -1) {</div><div class='del'>-                goto err;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        trav = this-&gt;children;</div><div class='del'>-        local = frame-&gt;local;</div><div class='del'>-</div><div class='del'>-        local-&gt;call_count--; /* First child successful */</div><div class='del'>-        trav = trav-&gt;next; /* Skip first child */</div><div class='del'>-</div><div class='del'>-        local-&gt;preparent  = *preparent;</div><div class='del'>-        local-&gt;postparent = *postparent;</div><div class='del'>-        local-&gt;preparent_size  = preparent-&gt;ia_size;</div><div class='del'>-        local-&gt;postparent_size = postparent-&gt;ia_size;</div><div class='del'>-        local-&gt;preparent_blocks  += preparent-&gt;ia_blocks;</div><div class='del'>-        local-&gt;postparent_blocks += postparent-&gt;ia_blocks;</div><div class='del'>-</div><div class='del'>-        while (trav) {</div><div class='del'>-                STACK_WIND (frame, stripe_unlink_cbk, trav-&gt;xlator,</div><div class='del'>-                            trav-&gt;xlator-&gt;fops-&gt;rmdir, &amp;local-&gt;loc);</div><div class='del'>-                trav = trav-&gt;next;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        return 0;</div><div class='del'>-err:</div><div class='del'>-        STACK_UNWIND_STRICT (rmdir, frame, op_ret, op_errno, NULL, NULL);</div><div class='del'>-        return 0;</div><div class='del'>-</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-stripe_rmdir (call_frame_t *frame, xlator_t *this, loc_t *loc)</div><div class='del'>-{</div><div class='del'>-        xlator_list_t    *trav = NULL;</div><div class='del'>-        stripe_local_t   *local = NULL;</div><div class='del'>-        stripe_private_t *priv = NULL;</div><div class='del'>-        int32_t           op_errno = EINVAL;</div><div class='del'>-</div><div class='del'>-        VALIDATE_OR_GOTO (frame, err);</div><div class='del'>-        VALIDATE_OR_GOTO (this, err);</div><div class='del'>-        VALIDATE_OR_GOTO (loc, err);</div><div class='del'>-        VALIDATE_OR_GOTO (loc-&gt;path, err);</div><div class='del'>-        VALIDATE_OR_GOTO (loc-&gt;inode, err);</div><div class='del'>-</div><div class='del'>-        priv = this-&gt;private;</div><div class='del'>-        trav = this-&gt;children;</div><div class='del'>-</div><div class='del'>-        /* don't delete a directory if any of the subvolume is down */</div><div class='del'>-        if (priv-&gt;nodes_down) {</div><div class='del'>-                op_errno = ENOTCONN;</div><div class='del'>-                goto err;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        /* Initialization */</div><div class='del'>-        local = GF_CALLOC (1, sizeof (stripe_local_t),</div><div class='del'>-                           gf_stripe_mt_stripe_local_t);</div><div class='del'>-        if (!local) {</div><div class='del'>-                op_errno = ENOMEM;</div><div class='del'>-                goto err;</div><div class='del'>-        }</div><div class='del'>-        local-&gt;op_ret = -1;</div><div class='del'>-        frame-&gt;local = local;</div><div class='del'>-        loc_copy (&amp;local-&gt;loc, loc);</div><div class='del'>-        local-&gt;call_count = priv-&gt;child_count;</div><div class='del'>-</div><div class='del'>-        STACK_WIND (frame, stripe_first_rmdir_cbk,  trav-&gt;xlator,</div><div class='del'>-                    trav-&gt;xlator-&gt;fops-&gt;rmdir, loc);</div><div class='del'>-</div><div class='del'>-        return 0;</div><div class='del'>-err:</div><div class='del'>-        STACK_UNWIND_STRICT (rmdir, frame, -1, op_errno, NULL, NULL);</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-stripe_mknod_ifreg_fail_unlink_cbk (call_frame_t *frame, void *cookie,</div><div class='del'>-                                    xlator_t *this, int32_t op_ret,</div><div class='del'>-                                    int32_t op_errno, struct iatt *preparent,</div><div class='del'>-                                    struct iatt *postparent)</div><div class='del'>-{</div><div class='del'>-        int32_t         callcnt = 0;</div><div class='del'>-        stripe_local_t *local = NULL;</div><div class='del'>-</div><div class='del'>-        if (!this || !frame || !frame-&gt;local) {</div><div class='del'>-                gf_log ("stripe", GF_LOG_DEBUG, "possible NULL deref");</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        local = frame-&gt;local;</div><div class='del'>-</div><div class='del'>-        LOCK (&amp;frame-&gt;lock);</div><div class='del'>-        {</div><div class='del'>-                callcnt = --local-&gt;call_count;</div><div class='del'>-        }</div><div class='del'>-        UNLOCK (&amp;frame-&gt;lock);</div><div class='del'>-</div><div class='del'>-        if (!callcnt) {</div><div class='del'>-                stripe_local_wipe (local);</div><div class='del'>-                STACK_UNWIND_STRICT (mknod, frame, local-&gt;op_ret, local-&gt;op_errno,</div><div class='del'>-                                     local-&gt;inode, &amp;local-&gt;stbuf,</div><div class='del'>-                                     &amp;local-&gt;preparent, &amp;local-&gt;postparent);</div><div class='del'>-        }</div><div class='del'>-out:</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-/**</div><div class='del'>- */</div><div class='del'>-int32_t</div><div class='del'>-stripe_mknod_ifreg_setxattr_cbk (call_frame_t *frame, void *cookie,</div><div class='del'>-                                 xlator_t *this, int32_t op_ret,</div><div class='del'>-                                 int32_t op_errno)</div><div class='del'>-{</div><div class='del'>-        int32_t           callcnt = 0;</div><div class='del'>-        stripe_local_t   *local = NULL;</div><div class='del'>-        stripe_private_t *priv = NULL;</div><div class='del'>-        xlator_list_t    *trav = NULL;</div><div class='del'>-        call_frame_t     *prev = NULL;</div><div class='del'>-</div><div class='del'>-        if (!this || !frame || !frame-&gt;local || !cookie) {</div><div class='del'>-                gf_log ("stripe", GF_LOG_DEBUG, "possible NULL deref");</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        prev  = cookie;</div><div class='del'>-        priv  = this-&gt;private;</div><div class='del'>-        local = frame-&gt;local;</div><div class='del'>-</div><div class='del'>-	LOCK (&amp;frame-&gt;lock);</div><div class='del'>-        {</div><div class='del'>-                callcnt = --local-&gt;call_count;</div><div class='del'>-</div><div class='del'>-                if (op_ret == -1) {</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-                                "%s returned error %s",</div><div class='del'>-                                prev-&gt;this-&gt;name, strerror (op_errno));</div><div class='del'>-                        local-&gt;op_ret = -1;</div><div class='del'>-                        local-&gt;op_errno = op_errno;</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='del'>-        UNLOCK (&amp;frame-&gt;lock);</div><div class='del'>-</div><div class='del'>-        if (!callcnt) {</div><div class='del'>-                if (local-&gt;op_ret == -1) {</div><div class='del'>-                        local-&gt;call_count = priv-&gt;child_count;</div><div class='del'>-                        while (trav) {</div><div class='del'>-                                STACK_WIND (frame,</div><div class='del'>-                                            stripe_mknod_ifreg_fail_unlink_cbk,</div><div class='del'>-                                            trav-&gt;xlator,</div><div class='del'>-                                            trav-&gt;xlator-&gt;fops-&gt;unlink,</div><div class='del'>-                                            &amp;local-&gt;loc);</div><div class='del'>-                                trav = trav-&gt;next;</div><div class='del'>-                        }</div><div class='del'>-                        return 0;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                stripe_local_wipe (local);</div><div class='del'>-                STACK_UNWIND_STRICT (mknod, frame, local-&gt;op_ret, local-&gt;op_errno,</div><div class='del'>-                                     local-&gt;inode, &amp;local-&gt;stbuf,</div><div class='del'>-                                     &amp;local-&gt;preparent, &amp;local-&gt;postparent);</div><div class='del'>-        }</div><div class='del'>-out:</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-stripe_mknod_ifreg_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-                        int32_t op_ret, int32_t op_errno, inode_t *inode,</div><div class='del'>-                        struct iatt *buf, struct iatt *preparent,</div><div class='del'>-                        struct iatt *postparent)</div><div class='del'>-{</div><div class='del'>-        int               ret = 0;</div><div class='del'>-        int32_t           callcnt = 0;</div><div class='del'>-        stripe_local_t   *local = NULL;</div><div class='del'>-        stripe_private_t *priv = NULL;</div><div class='del'>-        call_frame_t     *prev = NULL;</div><div class='del'>-</div><div class='del'>-        if (!this || !frame || !frame-&gt;local || !cookie) {</div><div class='del'>-                gf_log ("stripe", GF_LOG_DEBUG, "possible NULL deref");</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        prev  = cookie;</div><div class='del'>-	priv  = this-&gt;private;</div><div class='del'>-        local = frame-&gt;local;</div><div class='del'>-</div><div class='del'>-        LOCK (&amp;frame-&gt;lock);</div><div class='del'>-        {</div><div class='del'>-                callcnt = --local-&gt;call_count;</div><div class='del'>-</div><div class='del'>-                if (op_ret == -1) {</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-                                "%s returned error %s",</div><div class='del'>-                                prev-&gt;this-&gt;name, strerror (op_errno));</div><div class='del'>-                        if ((op_errno != ENOENT) ||</div><div class='del'>-                            (prev-&gt;this == FIRST_CHILD (this)))</div><div class='del'>-                                local-&gt;failed = 1;</div><div class='del'>-                        local-&gt;op_errno = op_errno;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                if (op_ret &gt;= 0) {</div><div class='del'>-                        local-&gt;op_ret = op_ret;</div><div class='del'>-</div><div class='del'>-                        if (FIRST_CHILD(this) == prev-&gt;this) {</div><div class='del'>-                                local-&gt;stbuf      = *buf;</div><div class='del'>-                                local-&gt;preparent  = *preparent;</div><div class='del'>-                                local-&gt;postparent = *postparent;</div><div class='del'>-                        }</div><div class='del'>-</div><div class='del'>-                        local-&gt;stbuf_blocks += buf-&gt;ia_blocks;</div><div class='del'>-                        local-&gt;preparent_blocks  += preparent-&gt;ia_blocks;</div><div class='del'>-                        local-&gt;postparent_blocks += postparent-&gt;ia_blocks;</div><div class='del'>-</div><div class='del'>-                        if (local-&gt;stbuf_size &lt; buf-&gt;ia_size)</div><div class='del'>-                                local-&gt;stbuf_size = buf-&gt;ia_size;</div><div class='del'>-                        if (local-&gt;preparent_size &lt; preparent-&gt;ia_size)</div><div class='del'>-                                local-&gt;preparent_size = preparent-&gt;ia_size;</div><div class='del'>-                        if (local-&gt;postparent_size &lt; postparent-&gt;ia_size)</div><div class='del'>-                                local-&gt;postparent_size = postparent-&gt;ia_size;</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='del'>-        UNLOCK (&amp;frame-&gt;lock);</div><div class='del'>-</div><div class='del'>-        if (!callcnt) {</div><div class='del'>-                if (local-&gt;failed)</div><div class='del'>-                        local-&gt;op_ret = -1;</div><div class='del'>-</div><div class='del'>-                if (local-&gt;op_ret != -1) {</div><div class='del'>-                        local-&gt;preparent.ia_blocks  = local-&gt;preparent_blocks;</div><div class='del'>-                        local-&gt;preparent.ia_size    = local-&gt;preparent_size;</div><div class='del'>-                        local-&gt;postparent.ia_blocks = local-&gt;postparent_blocks;</div><div class='del'>-                        local-&gt;postparent.ia_size   = local-&gt;postparent_size;</div><div class='del'>-                        local-&gt;stbuf.ia_size        = local-&gt;stbuf_size;</div><div class='del'>-                        local-&gt;stbuf.ia_blocks      = local-&gt;stbuf_blocks;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                if ((local-&gt;op_ret != -1) &amp;&amp; priv-&gt;xattr_supported) {</div><div class='del'>-                        /* Send a setxattr request to nodes where the</div><div class='del'>-                           files are created */</div><div class='del'>-                        int32_t  i              = 0;</div><div class='del'>-                        char     size_key[256]  = {0,};</div><div class='del'>-                        char     index_key[256] = {0,};</div><div class='del'>-                        char     count_key[256] = {0,};</div><div class='del'>-                        dict_t  *dict           = NULL;</div><div class='del'>-</div><div class='del'>-                        sprintf (size_key,</div><div class='del'>-                                 "trusted.%s.stripe-size", this-&gt;name);</div><div class='del'>-                        sprintf (count_key,</div><div class='del'>-                                 "trusted.%s.stripe-count", this-&gt;name);</div><div class='del'>-                        sprintf (index_key,</div><div class='del'>-                                 "trusted.%s.stripe-index", this-&gt;name);</div><div class='del'>-</div><div class='del'>-                        local-&gt;call_count = priv-&gt;child_count;</div><div class='del'>-                        memcpy (local-&gt;loc.inode-&gt;gfid, local-&gt;stbuf.ia_gfid, 16);</div><div class='del'>-                        for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='del'>-                                dict = get_new_dict ();</div><div class='del'>-                                if (!dict) {</div><div class='del'>-                                        gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-                                                "failed to allocate dict");</div><div class='del'>-                                }</div><div class='del'>-</div><div class='del'>-                                dict_ref (dict);</div><div class='del'>-                                /* TODO: check return value */</div><div class='del'>-                                ret = dict_set_int64 (dict, size_key,</div><div class='del'>-                                                      local-&gt;stripe_size);</div><div class='del'>-                                if (ret)</div><div class='del'>-                                        gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-                                                "%s: set stripe-size failed",</div><div class='del'>-                                                local-&gt;loc.path);</div><div class='del'>-                                ret = dict_set_int32 (dict, count_key,</div><div class='del'>-                                                      priv-&gt;child_count);</div><div class='del'>-                                if (ret)</div><div class='del'>-                                        gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-                                                "%s: set child_count failed",</div><div class='del'>-                                                local-&gt;loc.path);</div><div class='del'>-                                ret = dict_set_int32 (dict, index_key, i);</div><div class='del'>-                                if (ret)</div><div class='del'>-                                        gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-                                                "%s: set stripe-index failed",</div><div class='del'>-                                                local-&gt;loc.path);</div><div class='del'>-</div><div class='del'>-                                STACK_WIND (frame,</div><div class='del'>-                                            stripe_mknod_ifreg_setxattr_cbk,</div><div class='del'>-                                            priv-&gt;xl_array[i],</div><div class='del'>-                                            priv-&gt;xl_array[i]-&gt;fops-&gt;setxattr,</div><div class='del'>-                                            &amp;local-&gt;loc, dict, 0);</div><div class='del'>-</div><div class='del'>-                                dict_unref (dict);</div><div class='del'>-                        }</div><div class='del'>-                        return 0;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                /* Create itself has failed.. so return</div><div class='del'>-                   without setxattring */</div><div class='del'>-                stripe_local_wipe (local);</div><div class='del'>-                STACK_UNWIND_STRICT (mknod, frame, local-&gt;op_ret, local-&gt;op_errno,</div><div class='del'>-                                     local-&gt;inode, &amp;local-&gt;stbuf,</div><div class='del'>-                                     &amp;local-&gt;preparent, &amp;local-&gt;postparent);</div><div class='del'>-        }</div><div class='del'>-out:</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-stripe_single_mknod_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-                         int32_t op_ret, int32_t op_errno, inode_t *inode,</div><div class='del'>-                         struct iatt *buf, struct iatt *preparent,</div><div class='del'>-                         struct iatt *postparent)</div><div class='del'>-{</div><div class='del'>-        STACK_UNWIND_STRICT (mknod, frame, op_ret, op_errno, inode, buf,</div><div class='del'>-                             preparent, postparent);</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-stripe_mknod (call_frame_t *frame, xlator_t *this, loc_t *loc, mode_t mode,</div><div class='del'>-              dev_t rdev, dict_t *params)</div><div class='del'>-{</div><div class='del'>-        stripe_private_t *priv = NULL;</div><div class='del'>-        stripe_local_t   *local = NULL;</div><div class='del'>-        xlator_list_t    *trav = NULL;</div><div class='del'>-        int32_t           op_errno = EINVAL;</div><div class='del'>-</div><div class='del'>-        VALIDATE_OR_GOTO (frame, err);</div><div class='del'>-        VALIDATE_OR_GOTO (this, err);</div><div class='del'>-        VALIDATE_OR_GOTO (loc, err);</div><div class='del'>-        VALIDATE_OR_GOTO (loc-&gt;path, err);</div><div class='del'>-        VALIDATE_OR_GOTO (loc-&gt;inode, err);</div><div class='del'>-</div><div class='del'>-        priv = this-&gt;private;</div><div class='del'>-        trav = this-&gt;children;</div><div class='del'>-</div><div class='del'>-        if (priv-&gt;first_child_down) {</div><div class='del'>-                op_errno = ENOTCONN;</div><div class='del'>-                goto err;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (S_ISREG(mode)) {</div><div class='del'>-                /* NOTE: on older kernels (older than 2.6.9),</div><div class='del'>-                   creat() fops is sent as mknod() + open(). Hence handling</div><div class='del'>-                   S_IFREG files is necessary */</div><div class='del'>-                if (priv-&gt;nodes_down) {</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_WARNING,</div><div class='del'>-                                "Some node down, returning EIO");</div><div class='del'>-                        op_errno = EIO;</div><div class='del'>-                        goto err;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                /* Initialization */</div><div class='del'>-                local = GF_CALLOC (1, sizeof (stripe_local_t),</div><div class='del'>-                                   gf_stripe_mt_stripe_local_t);</div><div class='del'>-                if (!local) {</div><div class='del'>-                        op_errno = ENOMEM;</div><div class='del'>-                        goto err;</div><div class='del'>-                }</div><div class='del'>-                local-&gt;op_ret = -1;</div><div class='del'>-                local-&gt;op_errno = ENOTCONN;</div><div class='del'>-                local-&gt;stripe_size = stripe_get_matching_bs (loc-&gt;path,</div><div class='del'>-                                                             priv-&gt;pattern,</div><div class='del'>-                                                             priv-&gt;block_size);</div><div class='del'>-                frame-&gt;local = local;</div><div class='del'>-                local-&gt;inode = loc-&gt;inode;</div><div class='del'>-                loc_copy (&amp;local-&gt;loc, loc);</div><div class='del'>-</div><div class='del'>-                /* Everytime in stripe lookup, all child nodes should</div><div class='del'>-                   be looked up */</div><div class='del'>-                local-&gt;call_count = priv-&gt;child_count;</div><div class='del'>-</div><div class='del'>-                while (trav) {</div><div class='del'>-                        STACK_WIND (frame, stripe_mknod_ifreg_cbk,</div><div class='del'>-                                    trav-&gt;xlator, trav-&gt;xlator-&gt;fops-&gt;mknod,</div><div class='del'>-                                    loc, mode, rdev, params);</div><div class='del'>-                        trav = trav-&gt;next;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                /* This case is handled, no need to continue further. */</div><div class='del'>-                return 0;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        STACK_WIND (frame, stripe_single_mknod_cbk,</div><div class='del'>-                    FIRST_CHILD(this), FIRST_CHILD(this)-&gt;fops-&gt;mknod,</div><div class='del'>-                    loc, mode, rdev, params);</div><div class='del'>-</div><div class='del'>-        return 0;</div><div class='del'>-err:</div><div class='del'>-        STACK_UNWIND_STRICT (mknod, frame, -1, op_errno, NULL, NULL, NULL, NULL);</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-stripe_mkdir_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-                  int32_t op_ret, int32_t op_errno, inode_t *inode,</div><div class='del'>-                  struct iatt *buf, struct iatt *preparent,</div><div class='del'>-                  struct iatt *postparent)</div><div class='del'>-{</div><div class='del'>-        int32_t         callcnt = 0;</div><div class='del'>-        stripe_local_t  *local   = NULL;</div><div class='del'>-        inode_t         *local_inode = NULL;</div><div class='del'>-        call_frame_t    *prev = NULL;</div><div class='del'>-</div><div class='del'>-        if (!this || !frame || !frame-&gt;local || !cookie) {</div><div class='del'>-                gf_log ("stripe", GF_LOG_DEBUG, "possible NULL deref");</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        prev  = cookie;</div><div class='del'>-        local = frame-&gt;local;</div><div class='del'>-</div><div class='del'>-        LOCK (&amp;frame-&gt;lock);</div><div class='del'>-        {</div><div class='del'>-                callcnt = --local-&gt;call_count;</div><div class='del'>-</div><div class='del'>-                if (op_ret == -1) {</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-                                "%s returned error %s",</div><div class='del'>-                                prev-&gt;this-&gt;name, strerror (op_errno));</div><div class='del'>-                        local-&gt;op_errno = op_errno;</div><div class='del'>-                        if ((op_errno != ENOENT) ||</div><div class='del'>-                            (prev-&gt;this == FIRST_CHILD (this)))</div><div class='del'>-                                local-&gt;failed = 1;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                if (op_ret &gt;= 0) {</div><div class='del'>-                        local-&gt;op_ret = 0;</div><div class='del'>-</div><div class='del'>-                        if (FIRST_CHILD(this) == prev-&gt;this) {</div><div class='del'>-                                local-&gt;inode      = inode_ref (inode);</div><div class='del'>-                                local-&gt;stbuf      = *buf;</div><div class='del'>-                                local-&gt;postparent = *postparent;</div><div class='del'>-                                local-&gt;preparent  = *preparent;</div><div class='del'>-                        }</div><div class='del'>-                        local-&gt;stbuf_blocks      += buf-&gt;ia_blocks;</div><div class='del'>-                        local-&gt;preparent_blocks  += preparent-&gt;ia_blocks;</div><div class='del'>-                        local-&gt;postparent_blocks += postparent-&gt;ia_blocks;</div><div class='del'>-</div><div class='del'>-                        if (local-&gt;stbuf_size &lt; buf-&gt;ia_size)</div><div class='del'>-                                local-&gt;stbuf_size = buf-&gt;ia_size;</div><div class='del'>-                        if (local-&gt;preparent_size &lt; preparent-&gt;ia_size)</div><div class='del'>-                                local-&gt;preparent_size = preparent-&gt;ia_size;</div><div class='del'>-                        if (local-&gt;postparent_size &lt; postparent-&gt;ia_size)</div><div class='del'>-                                local-&gt;postparent_size = postparent-&gt;ia_size;</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='del'>-        UNLOCK (&amp;frame-&gt;lock);</div><div class='del'>-</div><div class='del'>-        if (!callcnt) {</div><div class='del'>-                if (local-&gt;failed)</div><div class='del'>-                        local-&gt;op_ret = -1;</div><div class='del'>-</div><div class='del'>-                local_inode = local-&gt;inode;</div><div class='del'>-</div><div class='del'>-                if (local-&gt;op_ret != -1) {</div><div class='del'>-                        local-&gt;preparent.ia_blocks  = local-&gt;preparent_blocks;</div><div class='del'>-                        local-&gt;preparent.ia_size    = local-&gt;preparent_size;</div><div class='del'>-                        local-&gt;postparent.ia_blocks = local-&gt;postparent_blocks;</div><div class='del'>-                        local-&gt;postparent.ia_size   = local-&gt;postparent_size;</div><div class='del'>-                        local-&gt;stbuf.ia_size        = local-&gt;stbuf_size;</div><div class='del'>-                        local-&gt;stbuf.ia_blocks      = local-&gt;stbuf_blocks;</div><div class='del'>-                }</div><div class='del'>-                STACK_UNWIND_STRICT (mkdir, frame, local-&gt;op_ret,</div><div class='del'>-                                     local-&gt;op_errno, local-&gt;inode,</div><div class='del'>-                                     &amp;local-&gt;stbuf, &amp;local-&gt;preparent,</div><div class='del'>-                                     &amp;local-&gt;postparent);</div><div class='del'>-</div><div class='del'>-                if (local_inode)</div><div class='del'>-                        inode_unref (local_inode);</div><div class='del'>-        }</div><div class='del'>-out:</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-stripe_mkdir (call_frame_t *frame, xlator_t *this, loc_t *loc, mode_t mode,</div><div class='del'>-              dict_t *params)</div><div class='del'>-{</div><div class='del'>-        stripe_private_t *priv = NULL;</div><div class='del'>-        stripe_local_t   *local = NULL;</div><div class='del'>-        xlator_list_t    *trav = NULL;</div><div class='del'>-        int32_t           op_errno = 1;</div><div class='del'>-</div><div class='del'>-        VALIDATE_OR_GOTO (frame, err);</div><div class='del'>-        VALIDATE_OR_GOTO (this, err);</div><div class='del'>-        VALIDATE_OR_GOTO (loc, err);</div><div class='del'>-        VALIDATE_OR_GOTO (loc-&gt;path, err);</div><div class='del'>-        VALIDATE_OR_GOTO (loc-&gt;inode, err);</div><div class='del'>-</div><div class='del'>-        priv = this-&gt;private;</div><div class='del'>-        trav = this-&gt;children;</div><div class='del'>-</div><div class='del'>-        if (priv-&gt;first_child_down) {</div><div class='del'>-                op_errno = ENOTCONN;</div><div class='del'>-                goto err;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        /* Initialization */</div><div class='del'>-        local = GF_CALLOC (1, sizeof (stripe_local_t),</div><div class='del'>-                           gf_stripe_mt_stripe_local_t);</div><div class='del'>-        if (!local) {</div><div class='del'>-                op_errno = ENOMEM;</div><div class='del'>-                goto err;</div><div class='del'>-        }</div><div class='del'>-        local-&gt;op_ret = -1;</div><div class='del'>-        local-&gt;call_count = priv-&gt;child_count;</div><div class='del'>-        frame-&gt;local = local;</div><div class='del'>-</div><div class='del'>-        /* Everytime in stripe lookup, all child nodes should be looked up */</div><div class='del'>-        while (trav) {</div><div class='del'>-                STACK_WIND (frame, stripe_mkdir_cbk,</div><div class='del'>-                            trav-&gt;xlator, trav-&gt;xlator-&gt;fops-&gt;mkdir,</div><div class='del'>-                            loc, mode, params);</div><div class='del'>-                trav = trav-&gt;next;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        return 0;</div><div class='del'>-err:</div><div class='del'>-        STACK_UNWIND_STRICT (mkdir, frame, -1, op_errno, NULL, NULL, NULL, NULL);</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-stripe_link_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-                 int32_t op_ret, int32_t op_errno, inode_t *inode,</div><div class='del'>-                 struct iatt *buf, struct iatt *preparent,</div><div class='del'>-                 struct iatt *postparent)</div><div class='del'>-{</div><div class='del'>-        int32_t         callcnt = 0;</div><div class='del'>-        stripe_local_t  *local   = NULL;</div><div class='del'>-        inode_t         *local_inode = NULL;</div><div class='del'>-        call_frame_t    *prev = NULL;</div><div class='del'>-</div><div class='del'>-        if (!this || !frame || !frame-&gt;local || !cookie) {</div><div class='del'>-                gf_log ("stripe", GF_LOG_DEBUG, "possible NULL deref");</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        prev  = cookie;</div><div class='del'>-        local = frame-&gt;local;</div><div class='del'>-</div><div class='del'>-        LOCK (&amp;frame-&gt;lock);</div><div class='del'>-        {</div><div class='del'>-                callcnt = --local-&gt;call_count;</div><div class='del'>-</div><div class='del'>-                if (op_ret == -1) {</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-                                "%s returned error %s",</div><div class='del'>-                                prev-&gt;this-&gt;name, strerror (op_errno));</div><div class='del'>-                        local-&gt;op_errno = op_errno;</div><div class='del'>-                        if ((op_errno != ENOENT) ||</div><div class='del'>-                            (prev-&gt;this == FIRST_CHILD (this)))</div><div class='del'>-                                local-&gt;failed = 1;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                if (op_ret &gt;= 0) {</div><div class='del'>-                        local-&gt;op_ret = 0;</div><div class='del'>-</div><div class='del'>-                        if (FIRST_CHILD(this) == prev-&gt;this) {</div><div class='del'>-                                local-&gt;inode      = inode_ref (inode);</div><div class='del'>-                                local-&gt;stbuf      = *buf;</div><div class='del'>-                                local-&gt;postparent = *postparent;</div><div class='del'>-                                local-&gt;preparent  = *preparent;</div><div class='del'>-                        }</div><div class='del'>-                        local-&gt;stbuf_blocks      += buf-&gt;ia_blocks;</div><div class='del'>-                        local-&gt;preparent_blocks  += preparent-&gt;ia_blocks;</div><div class='del'>-                        local-&gt;postparent_blocks += postparent-&gt;ia_blocks;</div><div class='del'>-</div><div class='del'>-                        if (local-&gt;stbuf_size &lt; buf-&gt;ia_size)</div><div class='del'>-                                local-&gt;stbuf_size = buf-&gt;ia_size;</div><div class='del'>-                        if (local-&gt;preparent_size &lt; preparent-&gt;ia_size)</div><div class='del'>-                                local-&gt;preparent_size = preparent-&gt;ia_size;</div><div class='del'>-                        if (local-&gt;postparent_size &lt; postparent-&gt;ia_size)</div><div class='del'>-                                local-&gt;postparent_size = postparent-&gt;ia_size;</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='del'>-        UNLOCK (&amp;frame-&gt;lock);</div><div class='del'>-</div><div class='del'>-        if (!callcnt) {</div><div class='del'>-                if (local-&gt;failed)</div><div class='del'>-                        local-&gt;op_ret = -1;</div><div class='del'>-</div><div class='del'>-                local_inode = local-&gt;inode;</div><div class='del'>-</div><div class='del'>-                if (local-&gt;op_ret != -1) {</div><div class='del'>-                        local-&gt;preparent.ia_blocks  = local-&gt;preparent_blocks;</div><div class='del'>-                        local-&gt;preparent.ia_size    = local-&gt;preparent_size;</div><div class='del'>-                        local-&gt;postparent.ia_blocks = local-&gt;postparent_blocks;</div><div class='del'>-                        local-&gt;postparent.ia_size   = local-&gt;postparent_size;</div><div class='del'>-                        local-&gt;stbuf.ia_size        = local-&gt;stbuf_size;</div><div class='del'>-                        local-&gt;stbuf.ia_blocks      = local-&gt;stbuf_blocks;</div><div class='del'>-                }</div><div class='del'>-                STACK_UNWIND_STRICT (link, frame, local-&gt;op_ret,</div><div class='del'>-                                     local-&gt;op_errno, local-&gt;inode,</div><div class='del'>-                                     &amp;local-&gt;stbuf, &amp;local-&gt;preparent,</div><div class='del'>-                                     &amp;local-&gt;postparent);</div><div class='del'>-</div><div class='del'>-                if (local_inode)</div><div class='del'>-                        inode_unref (local_inode);</div><div class='del'>-        }</div><div class='del'>-out:</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-stripe_link (call_frame_t *frame, xlator_t *this, loc_t *oldloc, loc_t *newloc)</div><div class='del'>-{</div><div class='del'>-        xlator_list_t    *trav = NULL;</div><div class='del'>-        stripe_local_t   *local = NULL;</div><div class='del'>-        stripe_private_t *priv = NULL;</div><div class='del'>-        int32_t           op_errno = 1;</div><div class='del'>-</div><div class='del'>-        VALIDATE_OR_GOTO (frame, err);</div><div class='del'>-        VALIDATE_OR_GOTO (this, err);</div><div class='del'>-        VALIDATE_OR_GOTO (oldloc, err);</div><div class='del'>-        VALIDATE_OR_GOTO (oldloc-&gt;path, err);</div><div class='del'>-        VALIDATE_OR_GOTO (oldloc-&gt;inode, err);</div><div class='del'>-</div><div class='del'>-        priv = this-&gt;private;</div><div class='del'>-        trav = this-&gt;children;</div><div class='del'>-</div><div class='del'>-        /* If any one node is down, don't allow link operation */</div><div class='del'>-        if (priv-&gt;nodes_down) {</div><div class='del'>-                op_errno = ENOTCONN;</div><div class='del'>-                goto err;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        /* Initialization */</div><div class='del'>-        local = GF_CALLOC (1, sizeof (stripe_local_t),</div><div class='del'>-                           gf_stripe_mt_stripe_local_t);</div><div class='del'>-        if (!local) {</div><div class='del'>-                op_errno = ENOMEM;</div><div class='del'>-                goto err;</div><div class='del'>-        }</div><div class='del'>-        local-&gt;op_ret = -1;</div><div class='del'>-        frame-&gt;local = local;</div><div class='del'>-        local-&gt;call_count = priv-&gt;child_count;</div><div class='del'>-</div><div class='del'>-        /* Everytime in stripe lookup, all child</div><div class='del'>-           nodes should be looked up */</div><div class='del'>-        while (trav) {</div><div class='del'>-                STACK_WIND (frame, stripe_link_cbk,</div><div class='del'>-                            trav-&gt;xlator, trav-&gt;xlator-&gt;fops-&gt;link,</div><div class='del'>-                            oldloc, newloc);</div><div class='del'>-                trav = trav-&gt;next;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        return 0;</div><div class='del'>-err:</div><div class='del'>-        STACK_UNWIND_STRICT (link, frame, -1, op_errno, NULL, NULL, NULL, NULL);</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-stripe_create_fail_unlink_cbk (call_frame_t *frame, void *cookie,</div><div class='del'>-                               xlator_t *this, int32_t op_ret,</div><div class='del'>-                               int32_t op_errno, struct iatt *preparent,</div><div class='del'>-                               struct iatt *postparent)</div><div class='del'>-{</div><div class='del'>-        int32_t         callcnt = 0;</div><div class='del'>-        fd_t           *lfd = NULL;</div><div class='del'>-        stripe_local_t *local = NULL;</div><div class='del'>-        inode_t        *local_inode = NULL;</div><div class='del'>-</div><div class='del'>-        if (!this || !frame || !frame-&gt;local) {</div><div class='del'>-                gf_log ("stripe", GF_LOG_DEBUG, "possible NULL deref");</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        local = frame-&gt;local;</div><div class='del'>-</div><div class='del'>-        LOCK (&amp;frame-&gt;lock);</div><div class='del'>-        {</div><div class='del'>-                callcnt = --local-&gt;call_count;</div><div class='del'>-        }</div><div class='del'>-        UNLOCK (&amp;frame-&gt;lock);</div><div class='del'>-</div><div class='del'>-        if (!callcnt) {</div><div class='del'>-                local_inode = local-&gt;inode;</div><div class='del'>-                lfd = local-&gt;fd;</div><div class='del'>-</div><div class='del'>-                stripe_local_wipe (local);</div><div class='del'>-                STACK_UNWIND_STRICT (create, frame, local-&gt;op_ret, local-&gt;op_errno,</div><div class='del'>-                                     local-&gt;fd, local-&gt;inode, &amp;local-&gt;stbuf,</div><div class='del'>-                                     &amp;local-&gt;preparent, &amp;local-&gt;postparent);</div><div class='del'>-</div><div class='del'>-                if (local_inode)</div><div class='del'>-                        inode_unref (local_inode);</div><div class='del'>-                if (lfd)</div><div class='del'>-                        fd_unref (lfd);</div><div class='del'>-        }</div><div class='del'>-out:</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-stripe_create_setxattr_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-                            int32_t op_ret, int32_t op_errno)</div><div class='del'>-{</div><div class='del'>-        inode_t          *local_inode = NULL;</div><div class='del'>-        fd_t             *lfd = NULL;</div><div class='del'>-        stripe_local_t   *local = NULL;</div><div class='del'>-        stripe_private_t *priv = NULL;</div><div class='del'>-        xlator_list_t    *trav = NULL;</div><div class='del'>-        int32_t           callcnt = 0;</div><div class='del'>-        call_frame_t   *prev = NULL;</div><div class='del'>-</div><div class='del'>-        if (!this || !frame || !frame-&gt;local || !cookie) {</div><div class='del'>-                gf_log ("stripe", GF_LOG_DEBUG, "possible NULL deref");</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        prev  = cookie;</div><div class='del'>-	priv  = this-&gt;private;</div><div class='del'>-        local = frame-&gt;local;</div><div class='del'>-</div><div class='del'>-        LOCK (&amp;frame-&gt;lock);</div><div class='del'>-        {</div><div class='del'>-                callcnt = --local-&gt;call_count;</div><div class='del'>-</div><div class='del'>-                if (op_ret == -1) {</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-                                "%s returned error %s",</div><div class='del'>-                                prev-&gt;this-&gt;name, strerror (op_errno));</div><div class='del'>-                        local-&gt;op_ret = -1;</div><div class='del'>-                        local-&gt;op_errno = op_errno;</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='del'>-        UNLOCK (&amp;frame-&gt;lock);</div><div class='del'>-</div><div class='del'>-        if (!callcnt) {</div><div class='del'>-                if (local-&gt;op_ret == -1) {</div><div class='del'>-                        local-&gt;call_count = priv-&gt;child_count;</div><div class='del'>-                        trav = this-&gt;children;</div><div class='del'>-                        while (trav) {</div><div class='del'>-                                STACK_WIND (frame,</div><div class='del'>-                                            stripe_create_fail_unlink_cbk,</div><div class='del'>-                                            trav-&gt;xlator,</div><div class='del'>-                                            trav-&gt;xlator-&gt;fops-&gt;unlink,</div><div class='del'>-                                            &amp;local-&gt;loc);</div><div class='del'>-                                trav = trav-&gt;next;</div><div class='del'>-                        }</div><div class='del'>-</div><div class='del'>-                        return 0;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                lfd = local-&gt;fd;</div><div class='del'>-                local_inode = local-&gt;inode;</div><div class='del'>-</div><div class='del'>-                stripe_local_wipe (local);</div><div class='del'>-                STACK_UNWIND_STRICT (create, frame, local-&gt;op_ret, local-&gt;op_errno,</div><div class='del'>-                                     local-&gt;fd, local-&gt;inode, &amp;local-&gt;stbuf,</div><div class='del'>-                                     &amp;local-&gt;preparent, &amp;local-&gt;postparent);</div><div class='del'>-</div><div class='del'>-                if (local_inode)</div><div class='del'>-                        inode_unref (local_inode);</div><div class='del'>-                if (lfd)</div><div class='del'>-                        fd_unref (lfd);</div><div class='del'>-        }</div><div class='del'>-out:</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-stripe_create_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-                   int32_t op_ret, int32_t op_errno, fd_t *fd,</div><div class='del'>-                   inode_t *inode, struct iatt *buf, struct iatt *preparent,</div><div class='del'>-                   struct iatt *postparent)</div><div class='del'>-{</div><div class='del'>-        int32_t           callcnt = 0;</div><div class='del'>-        stripe_local_t   *local = NULL;</div><div class='del'>-        stripe_private_t *priv = NULL;</div><div class='del'>-        fd_t             *lfd = NULL;</div><div class='del'>-        stripe_fd_ctx_t  *fctx = NULL;</div><div class='del'>-        inode_t          *local_inode = NULL;</div><div class='del'>-        call_frame_t     *prev = NULL;</div><div class='del'>-        int               ret = 0;</div><div class='del'>-</div><div class='del'>-        if (!this || !frame || !frame-&gt;local || !cookie) {</div><div class='del'>-                gf_log ("stripe", GF_LOG_DEBUG, "possible NULL deref");</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        prev  = cookie;</div><div class='del'>-        priv  = this-&gt;private;</div><div class='del'>-        local = frame-&gt;local;</div><div class='del'>-</div><div class='del'>-        LOCK (&amp;frame-&gt;lock);</div><div class='del'>-        {</div><div class='del'>-                callcnt = --local-&gt;call_count;</div><div class='del'>-</div><div class='del'>-                if (op_ret == -1) {</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-                                "%s returned error %s",</div><div class='del'>-                                prev-&gt;this-&gt;name, strerror (op_errno));</div><div class='del'>-                        if ((op_errno != ENOENT) ||</div><div class='del'>-                            (prev-&gt;this == FIRST_CHILD (this)))</div><div class='del'>-                                local-&gt;failed = 1;</div><div class='del'>-                        local-&gt;op_errno = op_errno;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                if (op_ret &gt;= 0) {</div><div class='del'>-                        local-&gt;op_ret = op_ret;</div><div class='del'>-                        /* Get the mapping in inode private */</div><div class='del'>-                        /* Get the stat buf right */</div><div class='del'>-                        if (FIRST_CHILD(this) == prev-&gt;this) {</div><div class='del'>-                                local-&gt;stbuf      = *buf;</div><div class='del'>-                                local-&gt;preparent  = *preparent;</div><div class='del'>-                                local-&gt;postparent = *postparent;</div><div class='del'>-                        }</div><div class='del'>-</div><div class='del'>-                        local-&gt;stbuf_blocks += buf-&gt;ia_blocks;</div><div class='del'>-                        local-&gt;preparent_blocks  += preparent-&gt;ia_blocks;</div><div class='del'>-                        local-&gt;postparent_blocks += postparent-&gt;ia_blocks;</div><div class='del'>-</div><div class='del'>-                        if (local-&gt;stbuf_size &lt; buf-&gt;ia_size)</div><div class='del'>-                                local-&gt;stbuf_size = buf-&gt;ia_size;</div><div class='del'>-                        if (local-&gt;preparent_size &lt; preparent-&gt;ia_size)</div><div class='del'>-                                local-&gt;preparent_size = preparent-&gt;ia_size;</div><div class='del'>-                        if (local-&gt;postparent_size &lt; postparent-&gt;ia_size)</div><div class='del'>-                                local-&gt;postparent_size = postparent-&gt;ia_size;</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='del'>-        UNLOCK (&amp;frame-&gt;lock);</div><div class='del'>-</div><div class='del'>-        if (!callcnt) {</div><div class='del'>-                if (local-&gt;failed)</div><div class='del'>-                        local-&gt;op_ret = -1;</div><div class='del'>-</div><div class='del'>-                if (local-&gt;op_ret != -1) {</div><div class='del'>-                        local-&gt;preparent.ia_blocks  = local-&gt;preparent_blocks;</div><div class='del'>-                        local-&gt;preparent.ia_size    = local-&gt;preparent_size;</div><div class='del'>-                        local-&gt;postparent.ia_blocks = local-&gt;postparent_blocks;</div><div class='del'>-                        local-&gt;postparent.ia_size   = local-&gt;postparent_size;</div><div class='del'>-                        local-&gt;stbuf.ia_size        = local-&gt;stbuf_size;</div><div class='del'>-                        local-&gt;stbuf.ia_blocks      = local-&gt;stbuf_blocks;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                /* */</div><div class='del'>-                if (local-&gt;op_ret &gt;= 0) {</div><div class='del'>-                        fctx = GF_CALLOC (1, sizeof (stripe_fd_ctx_t),</div><div class='del'>-                                          gf_stripe_mt_stripe_fd_ctx_t);</div><div class='del'>-                        if (!fctx) {</div><div class='del'>-                                local-&gt;op_ret = -1;</div><div class='del'>-                                local-&gt;op_errno = ENOMEM;</div><div class='del'>-                                goto unwind;</div><div class='del'>-                        }</div><div class='del'>-</div><div class='del'>-                        fctx-&gt;stripe_size  = local-&gt;stripe_size;</div><div class='del'>-                        fctx-&gt;stripe_count = priv-&gt;child_count;</div><div class='del'>-                        fctx-&gt;static_array = 1;</div><div class='del'>-                        fctx-&gt;xl_array = priv-&gt;xl_array;</div><div class='del'>-                        fd_ctx_set (local-&gt;fd, this,</div><div class='del'>-                                    (uint64_t)(long)fctx);</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                if ((local-&gt;op_ret != -1) &amp;&amp;</div><div class='del'>-                    local-&gt;stripe_size &amp;&amp; priv-&gt;xattr_supported) {</div><div class='del'>-                        /* Send a setxattr request to nodes where</div><div class='del'>-                           the files are created */</div><div class='del'>-                        int32_t        i = 0;</div><div class='del'>-                        char           size_key[256] = {0,};</div><div class='del'>-                        char           index_key[256] = {0,};</div><div class='del'>-                        char           count_key[256] = {0,};</div><div class='del'>-                        dict_t        *dict = NULL;</div><div class='del'>-</div><div class='del'>-                        sprintf (size_key,</div><div class='del'>-                                 "trusted.%s.stripe-size", this-&gt;name);</div><div class='del'>-                        sprintf (count_key,</div><div class='del'>-                                 "trusted.%s.stripe-count", this-&gt;name);</div><div class='del'>-                        sprintf (index_key,</div><div class='del'>-                                 "trusted.%s.stripe-index", this-&gt;name);</div><div class='del'>-</div><div class='del'>-                        local-&gt;call_count = priv-&gt;child_count;</div><div class='del'>-                        memcpy (local-&gt;loc.inode-&gt;gfid, local-&gt;stbuf.ia_gfid, 16);</div><div class='del'>-                        for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='del'>-                                dict = get_new_dict ();</div><div class='del'>-                                if (!dict) {</div><div class='del'>-                                        gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-                                                "error allocating dict");</div><div class='del'>-                                }</div><div class='del'>-                                dict_ref (dict);</div><div class='del'>-</div><div class='del'>-                                /* TODO: check return values */</div><div class='del'>-                                ret = dict_set_int64 (dict, size_key,</div><div class='del'>-                                                      local-&gt;stripe_size);</div><div class='del'>-                                if (ret)</div><div class='del'>-                                        gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-                                                "%s: set stripe-size failed",</div><div class='del'>-                                                local-&gt;loc.path);</div><div class='del'>-</div><div class='del'>-                                ret = dict_set_int32 (dict, count_key,</div><div class='del'>-                                                      priv-&gt;child_count);</div><div class='del'>-                                if (ret)</div><div class='del'>-                                        gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-                                                "%s: set stripe-size failed",</div><div class='del'>-                                                local-&gt;loc.path);</div><div class='del'>-</div><div class='del'>-                                ret = dict_set_int32 (dict, index_key, i);</div><div class='del'>-                                if (ret)</div><div class='del'>-                                        gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-                                                "%s: set stripe-size failed",</div><div class='del'>-                                                local-&gt;loc.path);</div><div class='del'>-</div><div class='del'>-                                STACK_WIND (frame, stripe_create_setxattr_cbk,</div><div class='del'>-                                            priv-&gt;xl_array[i],</div><div class='del'>-                                            priv-&gt;xl_array[i]-&gt;fops-&gt;setxattr,</div><div class='del'>-                                            &amp;local-&gt;loc, dict, 0);</div><div class='del'>-</div><div class='del'>-                                dict_unref (dict);</div><div class='del'>-                        }</div><div class='del'>-                        return 0;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-unwind:</div><div class='del'>-                /* Create itself has failed.. so return</div><div class='del'>-                   without setxattring */</div><div class='del'>-                lfd = local-&gt;fd;</div><div class='del'>-                local_inode = local-&gt;inode;</div><div class='del'>-</div><div class='del'>-                stripe_local_wipe (local);</div><div class='del'>-                STACK_UNWIND_STRICT (create, frame, local-&gt;op_ret,</div><div class='del'>-                                     local-&gt;op_errno, local-&gt;fd,</div><div class='del'>-                                     local-&gt;inode, &amp;local-&gt;stbuf,</div><div class='del'>-                                     &amp;local-&gt;preparent, &amp;local-&gt;postparent);</div><div class='del'>-</div><div class='del'>-                if (local_inode)</div><div class='del'>-                        inode_unref (local_inode);</div><div class='del'>-                if (lfd)</div><div class='del'>-                        fd_unref (lfd);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-/**</div><div class='del'>- * stripe_create - If a block-size is specified for the 'name', create the</div><div class='del'>- *    file in all the child nodes. If not, create it in only first child.</div><div class='del'>- *</div><div class='del'>- * @name- complete path of the file to be created.</div><div class='del'>- */</div><div class='del'>-int32_t</div><div class='del'>-stripe_create (call_frame_t *frame, xlator_t *this, loc_t *loc,</div><div class='del'>-               int32_t flags, mode_t mode, fd_t *fd, dict_t *params)</div><div class='del'>-{</div><div class='del'>-        stripe_private_t *priv = NULL;</div><div class='del'>-        stripe_local_t   *local = NULL;</div><div class='del'>-        xlator_list_t    *trav = NULL;</div><div class='del'>-        int32_t           op_errno = EINVAL;</div><div class='del'>-</div><div class='del'>-        VALIDATE_OR_GOTO (frame, err);</div><div class='del'>-        VALIDATE_OR_GOTO (this, err);</div><div class='del'>-        VALIDATE_OR_GOTO (loc, err);</div><div class='del'>-        VALIDATE_OR_GOTO (loc-&gt;path, err);</div><div class='del'>-        VALIDATE_OR_GOTO (loc-&gt;inode, err);</div><div class='del'>-</div><div class='del'>-        priv = this-&gt;private;</div><div class='del'>-</div><div class='del'>-        /* files created in O_APPEND mode does not allow lseek() on fd */</div><div class='del'>-        flags &amp;= ~O_APPEND;</div><div class='del'>-</div><div class='del'>-        if (priv-&gt;first_child_down || priv-&gt;nodes_down) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-                        "First node down, returning EIO");</div><div class='del'>-                op_errno = EIO;</div><div class='del'>-                goto err;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        /* Initialization */</div><div class='del'>-        local = GF_CALLOC (1, sizeof (stripe_local_t),</div><div class='del'>-                           gf_stripe_mt_stripe_local_t);</div><div class='del'>-        if (!local) {</div><div class='del'>-                op_errno = ENOMEM;</div><div class='del'>-                goto err;</div><div class='del'>-        }</div><div class='del'>-        local-&gt;op_ret = -1;</div><div class='del'>-        local-&gt;op_errno = ENOTCONN;</div><div class='del'>-        local-&gt;stripe_size = stripe_get_matching_bs (loc-&gt;path,</div><div class='del'>-                                                     priv-&gt;pattern,</div><div class='del'>-                                                     priv-&gt;block_size);</div><div class='del'>-        frame-&gt;local = local;</div><div class='del'>-        local-&gt;inode = inode_ref (loc-&gt;inode);</div><div class='del'>-        loc_copy (&amp;local-&gt;loc, loc);</div><div class='del'>-        local-&gt;fd = fd_ref (fd);</div><div class='del'>-</div><div class='del'>-        local-&gt;call_count = priv-&gt;child_count;</div><div class='del'>-</div><div class='del'>-        trav = this-&gt;children;</div><div class='del'>-        while (trav) {</div><div class='del'>-                STACK_WIND (frame, stripe_create_cbk, trav-&gt;xlator,</div><div class='del'>-                            trav-&gt;xlator-&gt;fops-&gt;create, loc, flags,</div><div class='del'>-                            mode, fd, params);</div><div class='del'>-                trav = trav-&gt;next;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        return 0;</div><div class='del'>-err:</div><div class='del'>-        STACK_UNWIND_STRICT (create, frame, -1, op_errno, NULL, NULL, NULL,</div><div class='del'>-                             NULL, NULL);</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-stripe_open_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-                 int32_t op_ret, int32_t op_errno, fd_t *fd)</div><div class='del'>-{</div><div class='del'>-        int32_t         callcnt = 0;</div><div class='del'>-        stripe_local_t *local = NULL;</div><div class='del'>-        fd_t           *lfd = NULL;</div><div class='del'>-        call_frame_t   *prev = NULL;</div><div class='del'>-</div><div class='del'>-        if (!this || !frame || !frame-&gt;local || !cookie) {</div><div class='del'>-                gf_log ("stripe", GF_LOG_DEBUG, "possible NULL deref");</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        prev  = cookie;</div><div class='del'>-        local = frame-&gt;local;</div><div class='del'>-</div><div class='del'>-        LOCK (&amp;frame-&gt;lock);</div><div class='del'>-        {</div><div class='del'>-                callcnt = --local-&gt;call_count;</div><div class='del'>-</div><div class='del'>-                if (op_ret == -1) {</div><div class='del'>-</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-                                "%s returned error %s",</div><div class='del'>-                                prev-&gt;this-&gt;name, strerror (op_errno));</div><div class='del'>-                        if ((op_errno != ENOENT) ||</div><div class='del'>-                            (prev-&gt;this == FIRST_CHILD (this)))</div><div class='del'>-                                local-&gt;failed = 1;</div><div class='del'>-                        local-&gt;op_errno = op_errno;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                if (op_ret &gt;= 0)</div><div class='del'>-                        local-&gt;op_ret = op_ret;</div><div class='del'>-        }</div><div class='del'>-        UNLOCK (&amp;frame-&gt;lock);</div><div class='del'>-</div><div class='del'>-        if (!callcnt) {</div><div class='del'>-                if (local-&gt;failed)</div><div class='del'>-                        local-&gt;op_ret = -1;</div><div class='del'>-</div><div class='del'>-                if (local-&gt;op_ret == -1) {</div><div class='del'>-                        if (local-&gt;fctx) {</div><div class='del'>-                                if (!local-&gt;fctx-&gt;static_array)</div><div class='del'>-                                        GF_FREE (local-&gt;fctx-&gt;xl_array);</div><div class='del'>-                                GF_FREE (local-&gt;fctx);</div><div class='del'>-                        }</div><div class='del'>-                } else {</div><div class='del'>-                        fd_ctx_set (local-&gt;fd, this,</div><div class='del'>-                                    (uint64_t)(long)local-&gt;fctx);</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                lfd = local-&gt;fd;</div><div class='del'>-</div><div class='del'>-                stripe_local_wipe (local);</div><div class='del'>-                STACK_UNWIND_STRICT (open, frame, local-&gt;op_ret,</div><div class='del'>-                                     local-&gt;op_errno, local-&gt;fd);</div><div class='del'>-                if (lfd)</div><div class='del'>-                        fd_unref (lfd);</div><div class='del'>-</div><div class='del'>-        }</div><div class='del'>-out:</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-stripe_open_getxattr_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-                          int32_t op_ret, int32_t op_errno, dict_t *dict)</div><div class='del'>-{</div><div class='del'>-        int32_t           index = 0;</div><div class='del'>-        int32_t           callcnt = 0;</div><div class='del'>-        char              key[256] = {0,};</div><div class='del'>-        stripe_local_t   *local = NULL;</div><div class='del'>-        xlator_list_t    *trav = NULL;</div><div class='del'>-        stripe_private_t *priv = NULL;</div><div class='del'>-        data_t           *data = NULL;</div><div class='del'>-        call_frame_t     *prev = NULL;</div><div class='del'>-        fd_t             *lfd = NULL;</div><div class='del'>-</div><div class='del'>-        if (!this || !frame || !frame-&gt;local || !cookie) {</div><div class='del'>-                gf_log ("stripe", GF_LOG_DEBUG, "possible NULL deref");</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        prev  = (call_frame_t *)cookie;</div><div class='del'>-        priv  = this-&gt;private;</div><div class='del'>-        local = frame-&gt;local;</div><div class='del'>-</div><div class='del'>-        LOCK (&amp;frame-&gt;lock);</div><div class='del'>-        {</div><div class='del'>-                callcnt = --local-&gt;call_count;</div><div class='del'>-</div><div class='del'>-                if (op_ret == -1) {</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-                                "%s returned error %s",</div><div class='del'>-                                prev-&gt;this-&gt;name, strerror (op_errno));</div><div class='del'>-                        local-&gt;op_ret = -1;</div><div class='del'>-                        if (local-&gt;op_errno != EIO)</div><div class='del'>-                                local-&gt;op_errno = op_errno;</div><div class='del'>-                        if ((op_errno != ENOENT) ||</div><div class='del'>-                            (prev-&gt;this == FIRST_CHILD (this)))</div><div class='del'>-                                local-&gt;failed = 1;</div><div class='del'>-                        goto unlock;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                if (!dict)</div><div class='del'>-                        goto unlock;</div><div class='del'>-</div><div class='del'>-                if (!local-&gt;fctx) {</div><div class='del'>-                        local-&gt;fctx =  GF_CALLOC (1, sizeof (stripe_fd_ctx_t),</div><div class='del'>-                                                  gf_stripe_mt_stripe_fd_ctx_t);</div><div class='del'>-                        if (!local-&gt;fctx) {</div><div class='del'>-                                local-&gt;op_errno = ENOMEM;</div><div class='del'>-                                local-&gt;op_ret = -1;</div><div class='del'>-                                goto unlock;</div><div class='del'>-                        }</div><div class='del'>-</div><div class='del'>-                        local-&gt;fctx-&gt;static_array = 0;</div><div class='del'>-                }</div><div class='del'>-                /* Stripe block size */</div><div class='del'>-                sprintf (key, "trusted.%s.stripe-size", this-&gt;name);</div><div class='del'>-                data = dict_get (dict, key);</div><div class='del'>-                if (!data) {</div><div class='del'>-                        local-&gt;xattr_self_heal_needed = 1;</div><div class='del'>-                } else {</div><div class='del'>-                        if (!local-&gt;fctx-&gt;stripe_size) {</div><div class='del'>-                                local-&gt;fctx-&gt;stripe_size =</div><div class='del'>-                                        data_to_int64 (data);</div><div class='del'>-                        }</div><div class='del'>-</div><div class='del'>-                        if (local-&gt;fctx-&gt;stripe_size != data_to_int64 (data)) {</div><div class='del'>-                                gf_log (this-&gt;name, GF_LOG_WARNING,</div><div class='del'>-                                        "stripe-size mismatch in blocks");</div><div class='del'>-                                local-&gt;xattr_self_heal_needed = 1;</div><div class='del'>-                        }</div><div class='del'>-                }</div><div class='del'>-                /* Stripe count */</div><div class='del'>-                sprintf (key, "trusted.%s.stripe-count", this-&gt;name);</div><div class='del'>-                data = dict_get (dict, key);</div><div class='del'>-                if (!data) {</div><div class='del'>-                        local-&gt;xattr_self_heal_needed = 1;</div><div class='del'>-                        goto unlock;</div><div class='del'>-                }</div><div class='del'>-                if (!local-&gt;fctx-&gt;xl_array) {</div><div class='del'>-                        local-&gt;fctx-&gt;stripe_count = data_to_int32 (data);</div><div class='del'>-                        if (!local-&gt;fctx-&gt;stripe_count) {</div><div class='del'>-                                gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-                                        "error with stripe-count xattr");</div><div class='del'>-                                local-&gt;op_ret   = -1;</div><div class='del'>-                                local-&gt;op_errno = EIO;</div><div class='del'>-                                goto unlock;</div><div class='del'>-                        }</div><div class='del'>-</div><div class='del'>-                        local-&gt;fctx-&gt;xl_array =</div><div class='del'>-                                GF_CALLOC (local-&gt;fctx-&gt;stripe_count,</div><div class='del'>-                                           sizeof (xlator_t *),</div><div class='del'>-                                           gf_stripe_mt_xlator_t);</div><div class='del'>-                        if (!local-&gt;fctx-&gt;xl_array) {</div><div class='del'>-                                local-&gt;op_errno = ENOMEM;</div><div class='del'>-                                local-&gt;op_ret   = -1;</div><div class='del'>-                                goto unlock;</div><div class='del'>-                        }</div><div class='del'>-                }</div><div class='del'>-                if (local-&gt;fctx-&gt;stripe_count != data_to_int32 (data)) {</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-                                "error with stripe-count xattr (%d != %d)",</div><div class='del'>-                                local-&gt;fctx-&gt;stripe_count, data_to_int32 (data));</div><div class='del'>-                        local-&gt;op_ret   = -1;</div><div class='del'>-                        local-&gt;op_errno = EIO;</div><div class='del'>-                        goto unlock;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                /* index */</div><div class='del'>-                sprintf (key, "trusted.%s.stripe-index", this-&gt;name);</div><div class='del'>-                data = dict_get (dict, key);</div><div class='del'>-                if (!data) {</div><div class='del'>-                        local-&gt;xattr_self_heal_needed = 1;</div><div class='del'>-                        goto unlock;</div><div class='del'>-                }</div><div class='del'>-                index = data_to_int32 (data);</div><div class='del'>-                if (index &gt; priv-&gt;child_count) {</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-                                "error with stripe-index xattr (%d)", index);</div><div class='del'>-                        local-&gt;op_ret   = -1;</div><div class='del'>-                        local-&gt;op_errno = EIO;</div><div class='del'>-                        goto unlock;</div><div class='del'>-                }</div><div class='del'>-                if (local-&gt;fctx-&gt;xl_array) {</div><div class='del'>-                        if (local-&gt;fctx-&gt;xl_array[index]) {</div><div class='del'>-                                gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-                                        "duplicate entry @ index (%d)", index);</div><div class='del'>-                                local-&gt;op_ret   = -1;</div><div class='del'>-                                local-&gt;op_errno = EIO;</div><div class='del'>-                                goto unlock;</div><div class='del'>-                        }</div><div class='del'>-                        local-&gt;fctx-&gt;xl_array[index] = prev-&gt;this;</div><div class='del'>-                }</div><div class='del'>-                local-&gt;entry_count++;</div><div class='del'>-                local-&gt;op_ret = 0;</div><div class='del'>-        }</div><div class='del'>-unlock:</div><div class='del'>-        UNLOCK (&amp;frame-&gt;lock);</div><div class='del'>-</div><div class='del'>-        if (!callcnt) {</div><div class='del'>-                /* TODO: if self-heal flag is set, do it */</div><div class='del'>-                if (local-&gt;xattr_self_heal_needed) {</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-                                "%s: stripe info need to be healed",</div><div class='del'>-                                local-&gt;loc.path);</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                if (local-&gt;failed)</div><div class='del'>-                        local-&gt;op_ret = -1;</div><div class='del'>-</div><div class='del'>-                if (local-&gt;op_ret)</div><div class='del'>-                        goto err;</div><div class='del'>-</div><div class='del'>-                if (local-&gt;entry_count != local-&gt;fctx-&gt;stripe_count) {</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-                                "entry-count (%d) != stripe-count (%d)",</div><div class='del'>-                                local-&gt;entry_count, local-&gt;fctx-&gt;stripe_count);</div><div class='del'>-                        local-&gt;op_ret = -1;</div><div class='del'>-                        local-&gt;op_errno = EIO;</div><div class='del'>-                        goto err;</div><div class='del'>-                }</div><div class='del'>-                if (!local-&gt;fctx-&gt;stripe_size) {</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_ERROR, "stripe size not set");</div><div class='del'>-                        local-&gt;op_ret = -1;</div><div class='del'>-                        local-&gt;op_errno = EIO;</div><div class='del'>-                        goto err;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                local-&gt;call_count = local-&gt;fctx-&gt;stripe_count;</div><div class='del'>-</div><div class='del'>-                trav = this-&gt;children;</div><div class='del'>-                while (trav) {</div><div class='del'>-                        STACK_WIND (frame, stripe_open_cbk, trav-&gt;xlator,</div><div class='del'>-                                    trav-&gt;xlator-&gt;fops-&gt;open, &amp;local-&gt;loc,</div><div class='del'>-                                    local-&gt;flags, local-&gt;fd, 0);</div><div class='del'>-                        trav = trav-&gt;next;</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        return 0;</div><div class='del'>-err:</div><div class='del'>-        lfd = local-&gt;fd;</div><div class='del'>-</div><div class='del'>-        stripe_local_wipe (local);</div><div class='del'>-        STACK_UNWIND_STRICT (open, frame, local-&gt;op_ret, local-&gt;op_errno,</div><div class='del'>-                             local-&gt;fd);</div><div class='del'>-        if (lfd)</div><div class='del'>-                fd_unref (lfd);</div><div class='del'>-out:</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-/**</div><div class='del'>- * stripe_open -</div><div class='del'>- */</div><div class='del'>-int32_t</div><div class='del'>-stripe_open (call_frame_t *frame, xlator_t *this, loc_t *loc,</div><div class='del'>-             int32_t flags, fd_t *fd, int32_t wbflags)</div><div class='del'>-{</div><div class='del'>-        stripe_local_t   *local = NULL;</div><div class='del'>-        stripe_private_t *priv = NULL;</div><div class='del'>-        xlator_list_t    *trav = NULL;</div><div class='del'>-        int32_t           op_errno = 1;</div><div class='del'>-</div><div class='del'>-        VALIDATE_OR_GOTO (frame, err);</div><div class='del'>-        VALIDATE_OR_GOTO (this, err);</div><div class='del'>-        VALIDATE_OR_GOTO (loc, err);</div><div class='del'>-        VALIDATE_OR_GOTO (loc-&gt;path, err);</div><div class='del'>-        VALIDATE_OR_GOTO (loc-&gt;inode, err);</div><div class='del'>-</div><div class='del'>-        priv = this-&gt;private;</div><div class='del'>-        trav = this-&gt;children;</div><div class='del'>-</div><div class='del'>-        if (priv-&gt;first_child_down) {</div><div class='del'>-                op_errno = ENOTCONN;</div><div class='del'>-                goto err;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        /* Initialization */</div><div class='del'>-        local = GF_CALLOC (1, sizeof (stripe_local_t),</div><div class='del'>-                           gf_stripe_mt_stripe_local_t);</div><div class='del'>-        if (!local) {</div><div class='del'>-                op_errno = ENOMEM;</div><div class='del'>-                goto err;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        /* files opened in O_APPEND mode does not allow lseek() on fd */</div><div class='del'>-        flags &amp;= ~O_APPEND;</div><div class='del'>-</div><div class='del'>-        local-&gt;fd = fd_ref (fd);</div><div class='del'>-        frame-&gt;local = local;</div><div class='del'>-        loc_copy (&amp;local-&gt;loc, loc);</div><div class='del'>-</div><div class='del'>-        /* Striped files */</div><div class='del'>-        local-&gt;flags = flags;</div><div class='del'>-        local-&gt;call_count = priv-&gt;child_count;</div><div class='del'>-        local-&gt;stripe_size = stripe_get_matching_bs (loc-&gt;path,</div><div class='del'>-                                                     priv-&gt;pattern,</div><div class='del'>-                                                     priv-&gt;block_size);</div><div class='del'>-</div><div class='del'>-        if (priv-&gt;xattr_supported) {</div><div class='del'>-                while (trav) {</div><div class='del'>-                        STACK_WIND (frame, stripe_open_getxattr_cbk,</div><div class='del'>-                                    trav-&gt;xlator, trav-&gt;xlator-&gt;fops-&gt;getxattr,</div><div class='del'>-                                    loc, NULL);</div><div class='del'>-                        trav = trav-&gt;next;</div><div class='del'>-                }</div><div class='del'>-                return 0;</div><div class='del'>-        }</div><div class='del'>-        local-&gt;fctx =  GF_CALLOC (1, sizeof (stripe_fd_ctx_t),</div><div class='del'>-                                  gf_stripe_mt_stripe_fd_ctx_t);</div><div class='del'>-        if (!local-&gt;fctx) {</div><div class='del'>-                op_errno = ENOMEM;</div><div class='del'>-                goto err;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        local-&gt;fctx-&gt;static_array = 1;</div><div class='del'>-        local-&gt;fctx-&gt;stripe_size  = local-&gt;stripe_size;</div><div class='del'>-        local-&gt;fctx-&gt;stripe_count = priv-&gt;child_count;</div><div class='del'>-        local-&gt;fctx-&gt;xl_array     = priv-&gt;xl_array;</div><div class='del'>-</div><div class='del'>-        while (trav) {</div><div class='del'>-                STACK_WIND (frame, stripe_open_cbk, trav-&gt;xlator,</div><div class='del'>-                            trav-&gt;xlator-&gt;fops-&gt;open,</div><div class='del'>-                            &amp;local-&gt;loc, local-&gt;flags, local-&gt;fd,</div><div class='del'>-                            wbflags);</div><div class='del'>-                trav = trav-&gt;next;</div><div class='del'>-        }</div><div class='del'>-        return 0;</div><div class='del'>-err:</div><div class='del'>-        STACK_UNWIND_STRICT (open, frame, -1, op_errno, NULL);</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-stripe_opendir_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-                    int32_t op_ret, int32_t op_errno, fd_t *fd)</div><div class='del'>-{</div><div class='del'>-        int32_t         callcnt = 0;</div><div class='del'>-        stripe_local_t *local = NULL;</div><div class='del'>-        fd_t           *local_fd = NULL;</div><div class='del'>-        call_frame_t   *prev = NULL;</div><div class='del'>-</div><div class='del'>-        if (!this || !frame || !frame-&gt;local || !cookie) {</div><div class='del'>-                gf_log ("stripe", GF_LOG_DEBUG, "possible NULL deref");</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        prev  = cookie;</div><div class='del'>-        local = frame-&gt;local;</div><div class='del'>-</div><div class='del'>-        LOCK (&amp;frame-&gt;lock);</div><div class='del'>-        {</div><div class='del'>-                callcnt = --local-&gt;call_count;</div><div class='del'>-</div><div class='del'>-                if (op_ret == -1) {</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-                                "%s returned error %s",</div><div class='del'>-                                prev-&gt;this-&gt;name, strerror (op_errno));</div><div class='del'>-                        local-&gt;op_ret = -1;</div><div class='del'>-                        local-&gt;op_errno = op_errno;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                if (op_ret &gt;= 0)</div><div class='del'>-                        local-&gt;op_ret = op_ret;</div><div class='del'>-        }</div><div class='del'>-        UNLOCK (&amp;frame-&gt;lock);</div><div class='del'>-</div><div class='del'>-        if (!callcnt) {</div><div class='del'>-                local_fd = local-&gt;fd;</div><div class='del'>-                STACK_UNWIND_STRICT (opendir, frame, local-&gt;op_ret,</div><div class='del'>-                                     local-&gt;op_errno, local-&gt;fd);</div><div class='del'>-                if (local_fd)</div><div class='del'>-                        fd_unref (local_fd);</div><div class='del'>-        }</div><div class='del'>-out:</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-stripe_opendir (call_frame_t *frame, xlator_t *this, loc_t *loc, fd_t *fd)</div><div class='del'>-{</div><div class='del'>-        xlator_list_t    *trav = NULL;</div><div class='del'>-        stripe_local_t   *local = NULL;</div><div class='del'>-        stripe_private_t *priv = NULL;</div><div class='del'>-        int32_t           op_errno = EINVAL;</div><div class='del'>-</div><div class='del'>-        VALIDATE_OR_GOTO (frame, err);</div><div class='del'>-        VALIDATE_OR_GOTO (this, err);</div><div class='del'>-        VALIDATE_OR_GOTO (loc, err);</div><div class='del'>-        VALIDATE_OR_GOTO (loc-&gt;path, err);</div><div class='del'>-        VALIDATE_OR_GOTO (loc-&gt;inode, err);</div><div class='del'>-</div><div class='del'>-        priv = this-&gt;private;</div><div class='del'>-        trav = this-&gt;children;</div><div class='del'>-</div><div class='del'>-        if (priv-&gt;first_child_down) {</div><div class='del'>-                op_errno = ENOTCONN;</div><div class='del'>-                goto err;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        /* Initialization */</div><div class='del'>-        local = GF_CALLOC (1, sizeof (stripe_local_t),</div><div class='del'>-                           gf_stripe_mt_stripe_local_t);</div><div class='del'>-        if (!local) {</div><div class='del'>-                op_errno = ENOMEM;</div><div class='del'>-                goto err;</div><div class='del'>-        }</div><div class='del'>-        frame-&gt;local = local;</div><div class='del'>-        local-&gt;call_count = priv-&gt;child_count;</div><div class='del'>-        local-&gt;fd = fd_ref (fd);</div><div class='del'>-</div><div class='del'>-        while (trav) {</div><div class='del'>-                STACK_WIND (frame, stripe_opendir_cbk, trav-&gt;xlator,</div><div class='del'>-                            trav-&gt;xlator-&gt;fops-&gt;opendir, loc, fd);</div><div class='del'>-                trav = trav-&gt;next;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        return 0;</div><div class='del'>-err:</div><div class='del'>-        STACK_UNWIND_STRICT (opendir, frame, -1, op_errno, NULL);</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-stripe_lk_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-               int32_t op_ret, int32_t op_errno, struct flock *lock)</div><div class='del'>-{</div><div class='del'>-        int32_t         callcnt = 0;</div><div class='del'>-        stripe_local_t *local = NULL;</div><div class='del'>-        call_frame_t   *prev = NULL;</div><div class='del'>-</div><div class='del'>-        if (!this || !frame || !frame-&gt;local || !cookie) {</div><div class='del'>-                gf_log ("stripe", GF_LOG_DEBUG, "possible NULL deref");</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        prev  = cookie;</div><div class='del'>-        local = frame-&gt;local;</div><div class='del'>-</div><div class='del'>-        LOCK (&amp;frame-&gt;lock);</div><div class='del'>-        {</div><div class='del'>-                callcnt = --local-&gt;call_count;</div><div class='del'>-                if (op_ret == -1) {</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-                                "%s returned error %s",</div><div class='del'>-                                prev-&gt;this-&gt;name, strerror (op_errno));</div><div class='del'>-                        local-&gt;op_errno = op_errno;</div><div class='del'>-                        if ((op_errno != ENOENT) ||</div><div class='del'>-                            (prev-&gt;this == FIRST_CHILD (this)))</div><div class='del'>-                                local-&gt;failed = 1;</div><div class='del'>-                }</div><div class='del'>-                if (op_ret &gt;= 0) {</div><div class='del'>-                        if (FIRST_CHILD(this) == prev-&gt;this) {</div><div class='del'>-                                /* First successful call, copy the *lock */</div><div class='del'>-                                local-&gt;op_ret = op_ret;</div><div class='del'>-                                local-&gt;lock = *lock;</div><div class='del'>-                        }</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='del'>-        UNLOCK (&amp;frame-&gt;lock);</div><div class='del'>-</div><div class='del'>-        if (!callcnt) {</div><div class='del'>-                if (local-&gt;failed)</div><div class='del'>-                        local-&gt;op_ret = -1;</div><div class='del'>-                STACK_UNWIND_STRICT (lk, frame, local-&gt;op_ret,</div><div class='del'>-                                     local-&gt;op_errno, &amp;local-&gt;lock);</div><div class='del'>-        }</div><div class='del'>-out:</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-stripe_lk (call_frame_t *frame, xlator_t *this, fd_t *fd, int32_t cmd,</div><div class='del'>-           struct flock *lock)</div><div class='del'>-{</div><div class='del'>-        stripe_local_t   *local = NULL;</div><div class='del'>-        xlator_list_t    *trav = NULL;</div><div class='del'>-        stripe_private_t *priv = NULL;</div><div class='del'>-        int32_t           op_errno = EINVAL;</div><div class='del'>-</div><div class='del'>-        VALIDATE_OR_GOTO (frame, err);</div><div class='del'>-        VALIDATE_OR_GOTO (this, err);</div><div class='del'>-        VALIDATE_OR_GOTO (fd, err);</div><div class='del'>-        VALIDATE_OR_GOTO (fd-&gt;inode, err);</div><div class='del'>-</div><div class='del'>-        trav = this-&gt;children;</div><div class='del'>-        priv = this-&gt;private;</div><div class='del'>-</div><div class='del'>-        /* Initialization */</div><div class='del'>-        local = GF_CALLOC (1, sizeof (stripe_local_t),</div><div class='del'>-                           gf_stripe_mt_stripe_local_t);</div><div class='del'>-        if (!local) {</div><div class='del'>-                op_errno = ENOMEM;</div><div class='del'>-                goto err;</div><div class='del'>-        }</div><div class='del'>-        local-&gt;op_ret = -1;</div><div class='del'>-        frame-&gt;local = local;</div><div class='del'>-        local-&gt;call_count = priv-&gt;child_count;</div><div class='del'>-</div><div class='del'>-        while (trav) {</div><div class='del'>-                STACK_WIND (frame, stripe_lk_cbk, trav-&gt;xlator,</div><div class='del'>-                            trav-&gt;xlator-&gt;fops-&gt;lk, fd, cmd, lock);</div><div class='del'>-                trav = trav-&gt;next;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        return 0;</div><div class='del'>-err:</div><div class='del'>-        STACK_UNWIND_STRICT (lk, frame, -1, op_errno, NULL);</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-stripe_flush_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-                  int32_t op_ret, int32_t op_errno)</div><div class='del'>-{</div><div class='del'>-        int32_t         callcnt = 0;</div><div class='del'>-        stripe_local_t *local   = NULL;</div><div class='del'>-        call_frame_t   *prev = NULL;</div><div class='del'>-</div><div class='del'>-        if (!this || !frame || !frame-&gt;local || !cookie) {</div><div class='del'>-                gf_log ("stripe", GF_LOG_DEBUG, "possible NULL deref");</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        prev  = cookie;</div><div class='del'>-        local = frame-&gt;local;</div><div class='del'>-</div><div class='del'>-        LOCK (&amp;frame-&gt;lock);</div><div class='del'>-        {</div><div class='del'>-                callcnt = --local-&gt;call_count;</div><div class='del'>-</div><div class='del'>-                if (op_ret == -1) {</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-                                "%s returned %s",</div><div class='del'>-                                prev-&gt;this-&gt;name, strerror (op_errno));</div><div class='del'>-                        local-&gt;op_errno = op_errno;</div><div class='del'>-                        if ((op_errno != ENOENT) ||</div><div class='del'>-                            (prev-&gt;this == FIRST_CHILD (this)))</div><div class='del'>-                                local-&gt;failed = 1;</div><div class='del'>-                }</div><div class='del'>-                if (op_ret &gt;= 0)</div><div class='del'>-                        local-&gt;op_ret = op_ret;</div><div class='del'>-        }</div><div class='del'>-        UNLOCK (&amp;frame-&gt;lock);</div><div class='del'>-</div><div class='del'>-        if (!callcnt) {</div><div class='del'>-                if (local-&gt;failed)</div><div class='del'>-                        local-&gt;op_ret = -1;</div><div class='del'>-</div><div class='del'>-                stripe_local_wipe (local);</div><div class='del'>-                STACK_UNWIND_STRICT (flush, frame, local-&gt;op_ret,</div><div class='del'>-                                     local-&gt;op_errno);</div><div class='del'>-        }</div><div class='del'>-out:</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-stripe_flush (call_frame_t *frame, xlator_t *this, fd_t *fd)</div><div class='del'>-{</div><div class='del'>-        stripe_local_t   *local = NULL;</div><div class='del'>-        stripe_private_t *priv = NULL;</div><div class='del'>-        xlator_list_t    *trav = NULL;</div><div class='del'>-        int32_t           op_errno = 1;</div><div class='del'>-</div><div class='del'>-        VALIDATE_OR_GOTO (frame, err);</div><div class='del'>-        VALIDATE_OR_GOTO (this, err);</div><div class='del'>-        VALIDATE_OR_GOTO (fd, err);</div><div class='del'>-        VALIDATE_OR_GOTO (fd-&gt;inode, err);</div><div class='del'>-</div><div class='del'>-        priv = this-&gt;private;</div><div class='del'>-        trav = this-&gt;children;</div><div class='del'>-</div><div class='del'>-        if (priv-&gt;first_child_down) {</div><div class='del'>-                op_errno = ENOTCONN;</div><div class='del'>-                goto err;</div><div class='del'>-        }</div><div class='del'>-        /* Initialization */</div><div class='del'>-        local = GF_CALLOC (1, sizeof (stripe_local_t),</div><div class='del'>-                           gf_stripe_mt_stripe_local_t);</div><div class='del'>-        if (!local) {</div><div class='del'>-                op_errno = ENOMEM;</div><div class='del'>-                goto err;</div><div class='del'>-        }</div><div class='del'>-        local-&gt;op_ret = -1;</div><div class='del'>-        frame-&gt;local = local;</div><div class='del'>-        local-&gt;call_count = priv-&gt;child_count;</div><div class='del'>-</div><div class='del'>-        while (trav) {</div><div class='del'>-                STACK_WIND (frame, stripe_flush_cbk,  trav-&gt;xlator,</div><div class='del'>-                            trav-&gt;xlator-&gt;fops-&gt;flush, fd);</div><div class='del'>-                trav = trav-&gt;next;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        return 0;</div><div class='del'>-err:</div><div class='del'>-        STACK_UNWIND_STRICT (flush, frame, -1, op_errno);</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-stripe_fsync_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-                  int32_t op_ret, int32_t op_errno, struct iatt *prebuf,</div><div class='del'>-                  struct iatt *postbuf)</div><div class='del'>-{</div><div class='del'>-        int32_t         callcnt = 0;</div><div class='del'>-        stripe_local_t *local   = NULL;</div><div class='del'>-        call_frame_t   *prev = NULL;</div><div class='del'>-</div><div class='del'>-        if (!this || !frame || !frame-&gt;local || !cookie) {</div><div class='del'>-                gf_log ("stripe", GF_LOG_DEBUG, "possible NULL deref");</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        prev = cookie;</div><div class='del'>-        local = frame-&gt;local;</div><div class='del'>-</div><div class='del'>-        LOCK (&amp;frame-&gt;lock);</div><div class='del'>-        {</div><div class='del'>-                callcnt = --local-&gt;call_count;</div><div class='del'>-</div><div class='del'>-                if (op_ret == -1) {</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-                                "%s returned %s",</div><div class='del'>-                                prev-&gt;this-&gt;name, strerror (op_errno));</div><div class='del'>-                        local-&gt;op_errno = op_errno;</div><div class='del'>-                        if ((op_errno != ENOENT) ||</div><div class='del'>-                            (prev-&gt;this == FIRST_CHILD (this)))</div><div class='del'>-                                local-&gt;failed = 1;</div><div class='del'>-                }</div><div class='del'>-                if (op_ret &gt;= 0) {</div><div class='del'>-                        local-&gt;op_ret = op_ret;</div><div class='del'>-                        if (FIRST_CHILD(this) == prev-&gt;this) {</div><div class='del'>-                                local-&gt;pre_buf  = *prebuf;</div><div class='del'>-                                local-&gt;post_buf = *postbuf;</div><div class='del'>-                        }</div><div class='del'>-                        local-&gt;prebuf_blocks  += prebuf-&gt;ia_blocks;</div><div class='del'>-                        local-&gt;postbuf_blocks += postbuf-&gt;ia_blocks;</div><div class='del'>-</div><div class='del'>-                        if (local-&gt;prebuf_size &lt; prebuf-&gt;ia_size)</div><div class='del'>-                                local-&gt;prebuf_size = prebuf-&gt;ia_size;</div><div class='del'>-</div><div class='del'>-                        if (local-&gt;postbuf_size &lt; postbuf-&gt;ia_size)</div><div class='del'>-                                local-&gt;postbuf_size = postbuf-&gt;ia_size;</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='del'>-        UNLOCK (&amp;frame-&gt;lock);</div><div class='del'>-</div><div class='del'>-        if (!callcnt) {</div><div class='del'>-                if (local-&gt;failed)</div><div class='del'>-                        local-&gt;op_ret = -1;</div><div class='del'>-</div><div class='del'>-                if (local-&gt;op_ret != -1) {</div><div class='del'>-                        local-&gt;pre_buf.ia_blocks  = local-&gt;prebuf_blocks;</div><div class='del'>-                        local-&gt;pre_buf.ia_size    = local-&gt;prebuf_size;</div><div class='del'>-                        local-&gt;post_buf.ia_blocks = local-&gt;postbuf_blocks;</div><div class='del'>-                        local-&gt;post_buf.ia_size   = local-&gt;postbuf_size;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                stripe_local_wipe (local);</div><div class='del'>-                STACK_UNWIND_STRICT (fsync, frame, local-&gt;op_ret,</div><div class='del'>-                                     local-&gt;op_errno, &amp;local-&gt;pre_buf,</div><div class='del'>-                                     &amp;local-&gt;post_buf);</div><div class='del'>-        }</div><div class='del'>-out:</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-stripe_fsync (call_frame_t *frame, xlator_t *this, fd_t *fd, int32_t flags)</div><div class='del'>-{</div><div class='del'>-        stripe_local_t   *local = NULL;</div><div class='del'>-        stripe_private_t *priv = NULL;</div><div class='del'>-        xlator_list_t    *trav = NULL;</div><div class='del'>-        int32_t           op_errno = 1;</div><div class='del'>-</div><div class='del'>-        VALIDATE_OR_GOTO (frame, err);</div><div class='del'>-        VALIDATE_OR_GOTO (this, err);</div><div class='del'>-        VALIDATE_OR_GOTO (fd, err);</div><div class='del'>-        VALIDATE_OR_GOTO (fd-&gt;inode, err);</div><div class='del'>-</div><div class='del'>-        priv = this-&gt;private;</div><div class='del'>-        trav = this-&gt;children;</div><div class='del'>-</div><div class='del'>-        /* Initialization */</div><div class='del'>-        local = GF_CALLOC (1, sizeof (stripe_local_t),</div><div class='del'>-                           gf_stripe_mt_stripe_local_t);</div><div class='del'>-        if (!local) {</div><div class='del'>-                op_errno = ENOMEM;</div><div class='del'>-                goto err;</div><div class='del'>-        }</div><div class='del'>-        local-&gt;op_ret = -1;</div><div class='del'>-        frame-&gt;local = local;</div><div class='del'>-        local-&gt;call_count = priv-&gt;child_count;</div><div class='del'>-</div><div class='del'>-        while (trav) {</div><div class='del'>-                STACK_WIND (frame, stripe_fsync_cbk, trav-&gt;xlator,</div><div class='del'>-                            trav-&gt;xlator-&gt;fops-&gt;fsync, fd, flags);</div><div class='del'>-                trav = trav-&gt;next;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        return 0;</div><div class='del'>-err:</div><div class='del'>-        STACK_UNWIND_STRICT (fsync, frame, -1, op_errno, NULL, NULL);</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-stripe_fstat_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-                  int32_t op_ret, int32_t op_errno, struct iatt *buf)</div><div class='del'>-{</div><div class='del'>-        int32_t         callcnt = 0;</div><div class='del'>-        stripe_local_t *local = NULL;</div><div class='del'>-        call_frame_t   *prev = NULL;</div><div class='del'>-</div><div class='del'>-        if (!this || !frame || !frame-&gt;local || !cookie) {</div><div class='del'>-                gf_log ("stripe", GF_LOG_DEBUG, "possible NULL deref");</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        prev  = cookie;</div><div class='del'>-        local = frame-&gt;local;</div><div class='del'>-</div><div class='del'>-        LOCK (&amp;frame-&gt;lock);</div><div class='del'>-        {</div><div class='del'>-                callcnt = --local-&gt;call_count;</div><div class='del'>-</div><div class='del'>-                if (op_ret == -1) {</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-                                "%s returned error %s",</div><div class='del'>-                                prev-&gt;this-&gt;name, strerror (op_errno));</div><div class='del'>-                        local-&gt;op_errno = op_errno;</div><div class='del'>-                        if ((op_errno != ENOENT) ||</div><div class='del'>-                            (prev-&gt;this == FIRST_CHILD (this)))</div><div class='del'>-                                local-&gt;failed = 1;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                if (op_ret == 0) {</div><div class='del'>-                        local-&gt;op_ret = 0;</div><div class='del'>-</div><div class='del'>-                        if (FIRST_CHILD(this) == prev-&gt;this)</div><div class='del'>-                                local-&gt;stbuf = *buf;</div><div class='del'>-</div><div class='del'>-                        local-&gt;stbuf_blocks += buf-&gt;ia_blocks;</div><div class='del'>-                        if (local-&gt;stbuf_size &lt; buf-&gt;ia_size)</div><div class='del'>-                                local-&gt;stbuf_size = buf-&gt;ia_size;</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='del'>-        UNLOCK (&amp;frame-&gt;lock);</div><div class='del'>-</div><div class='del'>-        if (!callcnt) {</div><div class='del'>-                if (local-&gt;failed)</div><div class='del'>-                        local-&gt;op_ret = -1;</div><div class='del'>-</div><div class='del'>-                if (local-&gt;op_ret != -1) {</div><div class='del'>-                        local-&gt;stbuf.ia_size   = local-&gt;stbuf_size;</div><div class='del'>-                        local-&gt;stbuf.ia_blocks = local-&gt;stbuf_blocks;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                stripe_local_wipe (local);</div><div class='del'>-                STACK_UNWIND_STRICT (fstat, frame, local-&gt;op_ret,</div><div class='del'>-                                     local-&gt;op_errno, &amp;local-&gt;stbuf);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-stripe_fstat (call_frame_t *frame,</div><div class='del'>-              xlator_t *this,</div><div class='del'>-              fd_t *fd)</div><div class='del'>-{</div><div class='del'>-        stripe_local_t   *local = NULL;</div><div class='del'>-        stripe_private_t *priv = NULL;</div><div class='del'>-        xlator_list_t    *trav = NULL;</div><div class='del'>-        int32_t           op_errno = 1;</div><div class='del'>-</div><div class='del'>-        VALIDATE_OR_GOTO (frame, err);</div><div class='del'>-        VALIDATE_OR_GOTO (this, err);</div><div class='del'>-        VALIDATE_OR_GOTO (fd, err);</div><div class='del'>-        VALIDATE_OR_GOTO (fd-&gt;inode, err);</div><div class='del'>-</div><div class='del'>-        priv = this-&gt;private;</div><div class='del'>-        trav = this-&gt;children;</div><div class='del'>-</div><div class='del'>-        /* Initialization */</div><div class='del'>-        local = GF_CALLOC (1, sizeof (stripe_local_t),</div><div class='del'>-                           gf_stripe_mt_stripe_local_t);</div><div class='del'>-        if (!local) {</div><div class='del'>-                op_errno = ENOMEM;</div><div class='del'>-                goto err;</div><div class='del'>-        }</div><div class='del'>-        local-&gt;op_ret = -1;</div><div class='del'>-        frame-&gt;local = local;</div><div class='del'>-        local-&gt;call_count = priv-&gt;child_count;</div><div class='del'>-</div><div class='del'>-        while (trav) {</div><div class='del'>-                STACK_WIND (frame, stripe_fstat_cbk, trav-&gt;xlator,</div><div class='del'>-                            trav-&gt;xlator-&gt;fops-&gt;fstat, fd);</div><div class='del'>-                trav = trav-&gt;next;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        return 0;</div><div class='del'>-err:</div><div class='del'>-        STACK_UNWIND_STRICT (fstat, frame, -1, op_errno, NULL);</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-stripe_ftruncate (call_frame_t *frame, xlator_t *this, fd_t *fd, off_t offset)</div><div class='del'>-{</div><div class='del'>-        stripe_local_t   *local = NULL;</div><div class='del'>-        stripe_private_t *priv = NULL;</div><div class='del'>-        xlator_list_t    *trav = NULL;</div><div class='del'>-        int32_t           op_errno = 1;</div><div class='del'>-</div><div class='del'>-        VALIDATE_OR_GOTO (frame, err);</div><div class='del'>-        VALIDATE_OR_GOTO (this, err);</div><div class='del'>-        VALIDATE_OR_GOTO (fd, err);</div><div class='del'>-        VALIDATE_OR_GOTO (fd-&gt;inode, err);</div><div class='del'>-</div><div class='del'>-        priv = this-&gt;private;</div><div class='del'>-        trav = this-&gt;children;</div><div class='del'>-</div><div class='del'>-        /* Initialization */</div><div class='del'>-        local = GF_CALLOC (1, sizeof (stripe_local_t),</div><div class='del'>-                           gf_stripe_mt_stripe_local_t);</div><div class='del'>-        if (!local) {</div><div class='del'>-                op_errno = ENOMEM;</div><div class='del'>-                goto err;</div><div class='del'>-        }</div><div class='del'>-        local-&gt;op_ret = -1;</div><div class='del'>-        frame-&gt;local = local;</div><div class='del'>-        local-&gt;call_count = priv-&gt;child_count;</div><div class='del'>-</div><div class='del'>-        while (trav) {</div><div class='del'>-                STACK_WIND (frame, stripe_truncate_cbk, trav-&gt;xlator,</div><div class='del'>-                            trav-&gt;xlator-&gt;fops-&gt;ftruncate, fd, offset);</div><div class='del'>-                trav = trav-&gt;next;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        return 0;</div><div class='del'>-err:</div><div class='del'>-        STACK_UNWIND_STRICT (ftruncate, frame, -1, op_errno, NULL, NULL);</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-stripe_fsyncdir_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-                     int32_t op_ret, int32_t op_errno)</div><div class='del'>-{</div><div class='del'>-        int32_t         callcnt = 0;</div><div class='del'>-        stripe_local_t *local   = NULL;</div><div class='del'>-        call_frame_t   *prev = NULL;</div><div class='del'>-</div><div class='del'>-        if (!this || !frame || !frame-&gt;local || !cookie) {</div><div class='del'>-                gf_log ("stripe", GF_LOG_DEBUG, "possible NULL deref");</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        prev  = cookie;</div><div class='del'>-        local = frame-&gt;local;</div><div class='del'>-</div><div class='del'>-        LOCK (&amp;frame-&gt;lock);</div><div class='del'>-        {</div><div class='del'>-                callcnt = --local-&gt;call_count;</div><div class='del'>-</div><div class='del'>-                if (op_ret == -1) {</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-                                "%s returned %s",</div><div class='del'>-                                prev-&gt;this-&gt;name, strerror (op_errno));</div><div class='del'>-                        local-&gt;op_errno = op_errno;</div><div class='del'>-                        if ((op_errno != ENOENT) ||</div><div class='del'>-                            (prev-&gt;this == FIRST_CHILD (this)))</div><div class='del'>-                                local-&gt;failed = 1;</div><div class='del'>-                }</div><div class='del'>-                if (op_ret &gt;= 0)</div><div class='del'>-                        local-&gt;op_ret = op_ret;</div><div class='del'>-        }</div><div class='del'>-        UNLOCK (&amp;frame-&gt;lock);</div><div class='del'>-</div><div class='del'>-        if (!callcnt) {</div><div class='del'>-                if (local-&gt;failed)</div><div class='del'>-                        local-&gt;op_ret = -1;</div><div class='del'>-</div><div class='del'>-                stripe_local_wipe (local);</div><div class='del'>-                STACK_UNWIND_STRICT (fsyncdir, frame, local-&gt;op_ret,</div><div class='del'>-                                     local-&gt;op_errno);</div><div class='del'>-        }</div><div class='del'>-out:</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-stripe_fsyncdir (call_frame_t *frame, xlator_t *this, fd_t *fd, int32_t flags)</div><div class='del'>-{</div><div class='del'>-        stripe_local_t   *local = NULL;</div><div class='del'>-        stripe_private_t *priv = NULL;</div><div class='del'>-        xlator_list_t    *trav = NULL;</div><div class='del'>-        int32_t           op_errno = 1;</div><div class='del'>-</div><div class='del'>-        VALIDATE_OR_GOTO (frame, err);</div><div class='del'>-        VALIDATE_OR_GOTO (this, err);</div><div class='del'>-        VALIDATE_OR_GOTO (fd, err);</div><div class='del'>-        VALIDATE_OR_GOTO (fd-&gt;inode, err);</div><div class='del'>-</div><div class='del'>-        priv = this-&gt;private;</div><div class='del'>-        trav = this-&gt;children;</div><div class='del'>-</div><div class='del'>-        /* Initialization */</div><div class='del'>-        local = GF_CALLOC (1, sizeof (stripe_local_t),</div><div class='del'>-                           gf_stripe_mt_stripe_local_t);</div><div class='del'>-        if (!local) {</div><div class='del'>-                op_errno = ENOMEM;</div><div class='del'>-                goto err;</div><div class='del'>-        }</div><div class='del'>-        local-&gt;op_ret = -1;</div><div class='del'>-        frame-&gt;local = local;</div><div class='del'>-        local-&gt;call_count = priv-&gt;child_count;</div><div class='del'>-</div><div class='del'>-        while (trav) {</div><div class='del'>-                STACK_WIND (frame, stripe_fsyncdir_cbk, trav-&gt;xlator,</div><div class='del'>-                            trav-&gt;xlator-&gt;fops-&gt;fsyncdir, fd, flags);</div><div class='del'>-                trav = trav-&gt;next;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        return 0;</div><div class='del'>-err:</div><div class='del'>-        STACK_UNWIND_STRICT (fsyncdir, frame, -1, op_errno);</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-stripe_readv_fstat_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-                        int32_t op_ret, int32_t op_errno, struct iatt *buf)</div><div class='del'>-{</div><div class='del'>-        int32_t         i = 0;</div><div class='del'>-        int32_t         callcnt = 0;</div><div class='del'>-        int32_t         count = 0;</div><div class='del'>-        stripe_local_t *local = NULL;</div><div class='del'>-        struct iovec   *vec = NULL;</div><div class='del'>-        struct iatt     tmp_stbuf = {0,};</div><div class='del'>-        struct iobref  *tmp_iobref = NULL;</div><div class='del'>-        struct iobuf   *iobuf = NULL;</div><div class='del'>-</div><div class='del'>-        if (!this || !frame || !frame-&gt;local) {</div><div class='del'>-                gf_log ("stripe", GF_LOG_DEBUG, "possible NULL deref");</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        local = frame-&gt;local;</div><div class='del'>-</div><div class='del'>-        LOCK (&amp;frame-&gt;lock);</div><div class='del'>-        {</div><div class='del'>-                callcnt = --local-&gt;call_count;</div><div class='del'>-                if (op_ret != -1)</div><div class='del'>-                        if (local-&gt;stbuf_size &lt; buf-&gt;ia_size)</div><div class='del'>-                                local-&gt;stbuf_size = buf-&gt;ia_size;</div><div class='del'>-        }</div><div class='del'>-        UNLOCK (&amp;frame-&gt;lock);</div><div class='del'>-</div><div class='del'>-        if (!callcnt) {</div><div class='del'>-                op_ret = 0;</div><div class='del'>-</div><div class='del'>-                /* Keep extra space for filling in '\0's */</div><div class='del'>-                vec = GF_CALLOC ((local-&gt;count * 2), sizeof (struct iovec),</div><div class='del'>-                                 gf_stripe_mt_iovec);</div><div class='del'>-                if (!vec) {</div><div class='del'>-                        op_ret = -1;</div><div class='del'>-                        goto done;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                for (i = 0; i &lt; local-&gt;wind_count; i++) {</div><div class='del'>-                        if (local-&gt;replies[i].op_ret) {</div><div class='del'>-                                memcpy ((vec + count), local-&gt;replies[i].vector,</div><div class='del'>-                                        (local-&gt;replies[i].count * sizeof (struct iovec)));</div><div class='del'>-                                count +=  local-&gt;replies[i].count;</div><div class='del'>-                                op_ret += local-&gt;replies[i].op_ret;</div><div class='del'>-                        }</div><div class='del'>-                        if ((local-&gt;replies[i].op_ret &lt;</div><div class='del'>-                             local-&gt;replies[i].requested_size) &amp;&amp;</div><div class='del'>-                            (local-&gt;stbuf_size &gt; (local-&gt;offset + op_ret))) {</div><div class='del'>-                                /* Fill in 0s here */</div><div class='del'>-                                vec[count].iov_len  =</div><div class='del'>-                                        (local-&gt;replies[i].requested_size -</div><div class='del'>-                                         local-&gt;replies[i].op_ret);</div><div class='del'>-                                iobuf = iobuf_get (this-&gt;ctx-&gt;iobuf_pool);</div><div class='del'>-                                if (!iobuf) {</div><div class='del'>-                                        gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-                                                "Out of memory.");</div><div class='del'>-                                        op_ret = -1;</div><div class='del'>-                                        op_errno = ENOMEM;</div><div class='del'>-                                        goto done;</div><div class='del'>-                                }</div><div class='del'>-                                memset (iobuf-&gt;ptr, 0, vec[count].iov_len);</div><div class='del'>-                                iobref_add (local-&gt;iobref, iobuf);</div><div class='del'>-                                vec[count].iov_base = iobuf-&gt;ptr;</div><div class='del'>-</div><div class='del'>-                                op_ret += vec[count].iov_len;</div><div class='del'>-                                count++;</div><div class='del'>-                        }</div><div class='del'>-                        GF_FREE (local-&gt;replies[i].vector);</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                /* FIXME: notice that st_ino, and st_dev (gen) will be</div><div class='del'>-                 * different than what inode will have. Make sure this doesn't</div><div class='del'>-                 * cause any bugs at higher levels */</div><div class='del'>-                memcpy (&amp;tmp_stbuf, &amp;local-&gt;replies[0].stbuf,</div><div class='del'>-                        sizeof (struct iatt));</div><div class='del'>-                tmp_stbuf.ia_size = local-&gt;stbuf_size;</div><div class='del'>-</div><div class='del'>-        done:</div><div class='del'>-                GF_FREE (local-&gt;replies);</div><div class='del'>-                tmp_iobref = local-&gt;iobref;</div><div class='del'>-                fd_unref (local-&gt;fd);</div><div class='del'>-                STACK_UNWIND_STRICT (readv, frame, op_ret, op_errno, vec,</div><div class='del'>-                                     count, &amp;tmp_stbuf, tmp_iobref);</div><div class='del'>-</div><div class='del'>-                iobref_unref (tmp_iobref);</div><div class='del'>-                if (vec)</div><div class='del'>-                        GF_FREE (vec);</div><div class='del'>-        }</div><div class='del'>-out:</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-/**</div><div class='del'>- * stripe_readv_cbk - get all the striped reads, and order it properly, send it</div><div class='del'>- *        to above layer after putting it in a single vector.</div><div class='del'>- */</div><div class='del'>-int32_t</div><div class='del'>-stripe_readv_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-                  int32_t op_ret, int32_t op_errno, struct iovec *vector,</div><div class='del'>-                  int32_t count, struct iatt *stbuf, struct iobref *iobref)</div><div class='del'>-{</div><div class='del'>-        int32_t         index = 0;</div><div class='del'>-        int32_t         callcnt = 0;</div><div class='del'>-        int32_t         final_count = 0;</div><div class='del'>-        int32_t         need_to_check_proper_size = 0;</div><div class='del'>-        call_frame_t   *mframe = NULL;</div><div class='del'>-        stripe_local_t *mlocal = NULL;</div><div class='del'>-        stripe_local_t *local = NULL;</div><div class='del'>-        struct iovec   *final_vec = NULL;</div><div class='del'>-        struct iatt     tmp_stbuf = {0,};</div><div class='del'>-        struct iobref  *tmp_iobref = NULL;</div><div class='del'>-        stripe_fd_ctx_t  *fctx = NULL;</div><div class='del'>-</div><div class='del'>-        if (!this || !frame || !frame-&gt;local || !cookie) {</div><div class='del'>-                gf_log ("stripe", GF_LOG_DEBUG, "possible NULL deref");</div><div class='del'>-                goto end;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        local  = frame-&gt;local;</div><div class='del'>-        index  = local-&gt;node_index;</div><div class='del'>-        mframe = local-&gt;orig_frame;</div><div class='del'>-        if (!mframe)</div><div class='del'>-                goto out;</div><div class='del'>-</div><div class='del'>-        mlocal = mframe-&gt;local;</div><div class='del'>-        if (!mlocal)</div><div class='del'>-                goto out;</div><div class='del'>-</div><div class='del'>-        fctx = mlocal-&gt;fctx;</div><div class='del'>-</div><div class='del'>-        LOCK (&amp;mframe-&gt;lock);</div><div class='del'>-        {</div><div class='del'>-                mlocal-&gt;replies[index].op_ret = op_ret;</div><div class='del'>-                mlocal-&gt;replies[index].op_errno = op_errno;</div><div class='del'>-                mlocal-&gt;replies[index].requested_size = local-&gt;readv_size;</div><div class='del'>-                if (op_ret &gt;= 0) {</div><div class='del'>-                        mlocal-&gt;replies[index].stbuf  = *stbuf;</div><div class='del'>-                        mlocal-&gt;replies[index].count  = count;</div><div class='del'>-                        mlocal-&gt;replies[index].vector = iov_dup (vector, count);</div><div class='del'>-</div><div class='del'>-                        if (!mlocal-&gt;iobref)</div><div class='del'>-                                mlocal-&gt;iobref = iobref_new ();</div><div class='del'>-                        iobref_merge (mlocal-&gt;iobref, iobref);</div><div class='del'>-                }</div><div class='del'>-                callcnt = ++mlocal-&gt;call_count;</div><div class='del'>-        }</div><div class='del'>-        UNLOCK(&amp;mframe-&gt;lock);</div><div class='del'>-</div><div class='del'>-        if (callcnt == mlocal-&gt;wind_count) {</div><div class='del'>-                op_ret = 0;</div><div class='del'>-</div><div class='del'>-                for (index=0; index &lt; mlocal-&gt;wind_count; index++) {</div><div class='del'>-                        /* check whether each stripe returned</div><div class='del'>-                         * 'expected' number of bytes */</div><div class='del'>-                        if (mlocal-&gt;replies[index].op_ret == -1) {</div><div class='del'>-                                op_ret = -1;</div><div class='del'>-                                op_errno = mlocal-&gt;replies[index].op_errno;</div><div class='del'>-                                break;</div><div class='del'>-                        }</div><div class='del'>-                        /* TODO: handle the 'holes' within the read range</div><div class='del'>-                           properly */</div><div class='del'>-                        if (mlocal-&gt;replies[index].op_ret &lt;</div><div class='del'>-                            mlocal-&gt;replies[index].requested_size) {</div><div class='del'>-                                need_to_check_proper_size = 1;</div><div class='del'>-                        }</div><div class='del'>-</div><div class='del'>-                        op_ret       += mlocal-&gt;replies[index].op_ret;</div><div class='del'>-                        mlocal-&gt;count += mlocal-&gt;replies[index].count;</div><div class='del'>-                }</div><div class='del'>-                if (op_ret == -1)</div><div class='del'>-                        goto done;</div><div class='del'>-                if (need_to_check_proper_size)</div><div class='del'>-                        goto check_size;</div><div class='del'>-</div><div class='del'>-                final_vec = GF_CALLOC (mlocal-&gt;count, sizeof (struct iovec),</div><div class='del'>-                                       gf_stripe_mt_iovec);</div><div class='del'>-</div><div class='del'>-                if (!final_vec) {</div><div class='del'>-                        op_ret = -1;</div><div class='del'>-                        goto done;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                for (index = 0; index &lt; mlocal-&gt;wind_count; index++) {</div><div class='del'>-                        memcpy ((final_vec + final_count),</div><div class='del'>-                                mlocal-&gt;replies[index].vector,</div><div class='del'>-                                (mlocal-&gt;replies[index].count *</div><div class='del'>-                                 sizeof (struct iovec)));</div><div class='del'>-                        final_count +=  mlocal-&gt;replies[index].count;</div><div class='del'>-                        GF_FREE (mlocal-&gt;replies[index].vector);</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                /* FIXME: notice that st_ino, and st_dev (gen) will be</div><div class='del'>-                 * different than what inode will have. Make sure this doesn't</div><div class='del'>-                 * cause any bugs at higher levels */</div><div class='del'>-                memcpy (&amp;tmp_stbuf, &amp;mlocal-&gt;replies[0].stbuf,</div><div class='del'>-                        sizeof (struct iatt));</div><div class='del'>-</div><div class='del'>-        done:</div><div class='del'>-                /* */</div><div class='del'>-                GF_FREE (mlocal-&gt;replies);</div><div class='del'>-                tmp_iobref = mlocal-&gt;iobref;</div><div class='del'>-                fd_unref (mlocal-&gt;fd);</div><div class='del'>-                STACK_UNWIND_STRICT (readv, mframe, op_ret, op_errno, final_vec,</div><div class='del'>-                                     final_count, &amp;tmp_stbuf, tmp_iobref);</div><div class='del'>-</div><div class='del'>-                iobref_unref (tmp_iobref);</div><div class='del'>-                if (final_vec)</div><div class='del'>-                        GF_FREE (final_vec);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        goto out;</div><div class='del'>-</div><div class='del'>-check_size:</div><div class='del'>-        mlocal-&gt;call_count = fctx-&gt;stripe_count;</div><div class='del'>-</div><div class='del'>-        for (index = 0; index &lt; fctx-&gt;stripe_count; index++) {</div><div class='del'>-                STACK_WIND (mframe, stripe_readv_fstat_cbk,</div><div class='del'>-                            (fctx-&gt;xl_array[index]),</div><div class='del'>-                            (fctx-&gt;xl_array[index])-&gt;fops-&gt;fstat,</div><div class='del'>-                            mlocal-&gt;fd);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        STACK_DESTROY (frame-&gt;root);</div><div class='del'>-end:</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-stripe_readv (call_frame_t *frame, xlator_t *this, fd_t *fd,</div><div class='del'>-              size_t size, off_t offset)</div><div class='del'>-{</div><div class='del'>-        int32_t           op_errno = EINVAL;</div><div class='del'>-        int32_t           idx = 0;</div><div class='del'>-        int32_t           index = 0;</div><div class='del'>-        int32_t           num_stripe = 0;</div><div class='del'>-        int32_t           off_index = 0;</div><div class='del'>-        size_t            frame_size = 0;</div><div class='del'>-        off_t             rounded_end = 0;</div><div class='del'>-        uint64_t          tmp_fctx = 0;</div><div class='del'>-        uint64_t          stripe_size = 0;</div><div class='del'>-        off_t             rounded_start = 0;</div><div class='del'>-        off_t             frame_offset = offset;</div><div class='del'>-        stripe_local_t   *local = NULL;</div><div class='del'>-        call_frame_t     *rframe = NULL;</div><div class='del'>-        stripe_local_t   *rlocal = NULL;</div><div class='del'>-        stripe_fd_ctx_t  *fctx = NULL;</div><div class='del'>-</div><div class='del'>-        VALIDATE_OR_GOTO (frame, err);</div><div class='del'>-        VALIDATE_OR_GOTO (this, err);</div><div class='del'>-        VALIDATE_OR_GOTO (fd, err);</div><div class='del'>-        VALIDATE_OR_GOTO (fd-&gt;inode, err);</div><div class='del'>-</div><div class='del'>-        fd_ctx_get (fd, this, &amp;tmp_fctx);</div><div class='del'>-        if (!tmp_fctx) {</div><div class='del'>-                op_errno = EBADFD;</div><div class='del'>-                goto err;</div><div class='del'>-        }</div><div class='del'>-        fctx = (stripe_fd_ctx_t *)(long)tmp_fctx;</div><div class='del'>-        stripe_size = fctx-&gt;stripe_size;</div><div class='del'>-</div><div class='del'>-        if (!stripe_size) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-                        "Wrong stripe size for the file");</div><div class='del'>-                goto err;</div><div class='del'>-        }</div><div class='del'>-        /* The file is stripe across the child nodes. Send the read request</div><div class='del'>-         * to the child nodes appropriately after checking which region of</div><div class='del'>-         * the file is in which child node. Always '0-&lt;stripe_size&gt;' part of</div><div class='del'>-         * the file resides in the first child.</div><div class='del'>-         */</div><div class='del'>-        rounded_start = floor (offset, stripe_size);</div><div class='del'>-        rounded_end = roof (offset+size, stripe_size);</div><div class='del'>-        num_stripe = (rounded_end- rounded_start)/stripe_size;</div><div class='del'>-</div><div class='del'>-        local = GF_CALLOC (1, sizeof (stripe_local_t),</div><div class='del'>-                           gf_stripe_mt_stripe_local_t);</div><div class='del'>-        if (!local) {</div><div class='del'>-                op_errno = ENOMEM;</div><div class='del'>-                goto err;</div><div class='del'>-        }</div><div class='del'>-        frame-&gt;local = local;</div><div class='del'>-</div><div class='del'>-        /* This is where all the vectors should be copied. */</div><div class='del'>-        local-&gt;replies = GF_CALLOC (num_stripe, sizeof (struct readv_replies),</div><div class='del'>-                                    gf_stripe_mt_readv_replies);</div><div class='del'>-        if (!local-&gt;replies) {</div><div class='del'>-                op_errno = ENOMEM;</div><div class='del'>-                goto err;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        off_index = (offset / stripe_size) % fctx-&gt;stripe_count;</div><div class='del'>-        local-&gt;wind_count = num_stripe;</div><div class='del'>-        local-&gt;readv_size = size;</div><div class='del'>-        local-&gt;offset     = offset;</div><div class='del'>-        local-&gt;fd         = fd_ref (fd);</div><div class='del'>-        local-&gt;fctx       = fctx;</div><div class='del'>-</div><div class='del'>-        for (index = off_index; index &lt; (num_stripe + off_index); index++) {</div><div class='del'>-                rframe = copy_frame (frame);</div><div class='del'>-                rlocal = GF_CALLOC (1, sizeof (stripe_local_t),</div><div class='del'>-                                    gf_stripe_mt_stripe_local_t);</div><div class='del'>-                if (!rlocal) {</div><div class='del'>-                        op_errno = ENOMEM;</div><div class='del'>-                        goto err;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                frame_size = min (roof (frame_offset+1, stripe_size),</div><div class='del'>-                                  (offset + size)) - frame_offset;</div><div class='del'>-</div><div class='del'>-                rlocal-&gt;node_index = index - off_index;</div><div class='del'>-                rlocal-&gt;orig_frame = frame;</div><div class='del'>-                rlocal-&gt;readv_size = frame_size;</div><div class='del'>-                rframe-&gt;local = rlocal;</div><div class='del'>-                idx = (index % fctx-&gt;stripe_count);</div><div class='del'>-                STACK_WIND (rframe, stripe_readv_cbk, fctx-&gt;xl_array[idx],</div><div class='del'>-                            fctx-&gt;xl_array[idx]-&gt;fops-&gt;readv,</div><div class='del'>-                            fd, frame_size, frame_offset);</div><div class='del'>-</div><div class='del'>-                frame_offset += frame_size;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        return 0;</div><div class='del'>-err:</div><div class='del'>-        if (local &amp;&amp; local-&gt;fd)</div><div class='del'>-                fd_unref (local-&gt;fd);</div><div class='del'>-</div><div class='del'>-        STACK_UNWIND_STRICT (readv, frame, -1, op_errno, NULL, 0, NULL, NULL);</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-stripe_writev_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-                   int32_t op_ret, int32_t op_errno, struct iatt *prebuf,</div><div class='del'>-                   struct iatt *postbuf)</div><div class='del'>-{</div><div class='del'>-        int32_t         callcnt = 0;</div><div class='del'>-        stripe_local_t *local = NULL;</div><div class='del'>-        call_frame_t   *prev = NULL;</div><div class='del'>-</div><div class='del'>-        if (!this || !frame || !frame-&gt;local || !cookie) {</div><div class='del'>-                gf_log ("stripe", GF_LOG_DEBUG, "possible NULL deref");</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        prev  = cookie;</div><div class='del'>-        local = frame-&gt;local;</div><div class='del'>-</div><div class='del'>-        LOCK(&amp;frame-&gt;lock);</div><div class='del'>-        {</div><div class='del'>-                callcnt = ++local-&gt;call_count;</div><div class='del'>-</div><div class='del'>-                if (op_ret == -1) {</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-                                "%s returned error %s",</div><div class='del'>-                                prev-&gt;this-&gt;name, strerror (op_errno));</div><div class='del'>-                        local-&gt;op_errno = op_errno;</div><div class='del'>-                        local-&gt;op_ret = -1;</div><div class='del'>-                }</div><div class='del'>-                if (op_ret &gt;= 0) {</div><div class='del'>-                        local-&gt;op_ret += op_ret;</div><div class='del'>-                        local-&gt;post_buf = *postbuf;</div><div class='del'>-                        local-&gt;pre_buf = *prebuf;</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='del'>-        UNLOCK (&amp;frame-&gt;lock);</div><div class='del'>-</div><div class='del'>-        if ((callcnt == local-&gt;wind_count) &amp;&amp; local-&gt;unwind) {</div><div class='del'>-                STACK_UNWIND_STRICT (writev, frame, local-&gt;op_ret,</div><div class='del'>-                                     local-&gt;op_errno, &amp;local-&gt;pre_buf,</div><div class='del'>-                                     &amp;local-&gt;post_buf);</div><div class='del'>-        }</div><div class='del'>-out:</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-stripe_writev (call_frame_t *frame, xlator_t *this, fd_t *fd,</div><div class='del'>-               struct iovec *vector, int32_t count, off_t offset,</div><div class='del'>-               struct iobref *iobref)</div><div class='del'>-{</div><div class='del'>-        struct iovec     *tmp_vec = NULL;</div><div class='del'>-        stripe_local_t   *local = NULL;</div><div class='del'>-        stripe_fd_ctx_t  *fctx = NULL;</div><div class='del'>-        int32_t           op_errno = 1;</div><div class='del'>-        int32_t           idx = 0;</div><div class='del'>-        int32_t           total_size = 0;</div><div class='del'>-        int32_t           offset_offset = 0;</div><div class='del'>-        int32_t           remaining_size = 0;</div><div class='del'>-        int32_t           tmp_count = count;</div><div class='del'>-        off_t             fill_size = 0;</div><div class='del'>-        uint64_t          stripe_size = 0;</div><div class='del'>-        uint64_t          tmp_fctx = 0;</div><div class='del'>-</div><div class='del'>-        VALIDATE_OR_GOTO (frame, err);</div><div class='del'>-        VALIDATE_OR_GOTO (this, err);</div><div class='del'>-        VALIDATE_OR_GOTO (fd, err);</div><div class='del'>-        VALIDATE_OR_GOTO (fd-&gt;inode, err);</div><div class='del'>-</div><div class='del'>-        fd_ctx_get (fd, this, &amp;tmp_fctx);</div><div class='del'>-        if (!tmp_fctx) {</div><div class='del'>-                op_errno = EINVAL;</div><div class='del'>-                goto err;</div><div class='del'>-        }</div><div class='del'>-        fctx = (stripe_fd_ctx_t *)(long)tmp_fctx;</div><div class='del'>-        stripe_size = fctx-&gt;stripe_size;</div><div class='del'>-</div><div class='del'>-        /* File has to be stripped across the child nodes */</div><div class='del'>-        for (idx = 0; idx&lt; count; idx ++) {</div><div class='del'>-                total_size += vector[idx].iov_len;</div><div class='del'>-        }</div><div class='del'>-        remaining_size = total_size;</div><div class='del'>-</div><div class='del'>-        local = GF_CALLOC (1, sizeof (stripe_local_t),</div><div class='del'>-                           gf_stripe_mt_stripe_local_t);</div><div class='del'>-        if (!local) {</div><div class='del'>-                op_errno = ENOMEM;</div><div class='del'>-                goto err;</div><div class='del'>-        }</div><div class='del'>-        frame-&gt;local = local;</div><div class='del'>-        local-&gt;stripe_size = stripe_size;</div><div class='del'>-</div><div class='del'>-        while (1) {</div><div class='del'>-                /* Send striped chunk of the vector to child</div><div class='del'>-                   nodes appropriately. */</div><div class='del'>-                idx = (((offset + offset_offset) /</div><div class='del'>-                        local-&gt;stripe_size) % fctx-&gt;stripe_count);</div><div class='del'>-</div><div class='del'>-                fill_size = (local-&gt;stripe_size -</div><div class='del'>-                             ((offset + offset_offset) % local-&gt;stripe_size));</div><div class='del'>-                if (fill_size &gt; remaining_size)</div><div class='del'>-                        fill_size = remaining_size;</div><div class='del'>-</div><div class='del'>-                remaining_size -= fill_size;</div><div class='del'>-</div><div class='del'>-                tmp_count = iov_subset (vector, count, offset_offset,</div><div class='del'>-                                        offset_offset + fill_size, NULL);</div><div class='del'>-                tmp_vec = GF_CALLOC (tmp_count, sizeof (struct iovec),</div><div class='del'>-                                     gf_stripe_mt_iovec);</div><div class='del'>-                if (!tmp_vec) {</div><div class='del'>-                        op_errno = ENOMEM;</div><div class='del'>-                        goto err;</div><div class='del'>-                }</div><div class='del'>-                tmp_count = iov_subset (vector, count, offset_offset,</div><div class='del'>-                                        offset_offset + fill_size, tmp_vec);</div><div class='del'>-</div><div class='del'>-                local-&gt;wind_count++;</div><div class='del'>-                if (remaining_size == 0)</div><div class='del'>-                        local-&gt;unwind = 1;</div><div class='del'>-</div><div class='del'>-                STACK_WIND (frame, stripe_writev_cbk, fctx-&gt;xl_array[idx],</div><div class='del'>-                            fctx-&gt;xl_array[idx]-&gt;fops-&gt;writev, fd, tmp_vec,</div><div class='del'>-                            tmp_count, offset + offset_offset, iobref);</div><div class='del'>-                GF_FREE (tmp_vec);</div><div class='del'>-                offset_offset += fill_size;</div><div class='del'>-                if (remaining_size == 0)</div><div class='del'>-                        break;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        return 0;</div><div class='del'>-err:</div><div class='del'>-        STACK_UNWIND_STRICT (writev, frame, -1, op_errno, NULL, NULL);</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-stripe_release (xlator_t *this, fd_t *fd)</div><div class='del'>-{</div><div class='del'>-        uint64_t          tmp_fctx = 0;</div><div class='del'>-        stripe_fd_ctx_t  *fctx = NULL;</div><div class='del'>-</div><div class='del'>-        VALIDATE_OR_GOTO (this, err);</div><div class='del'>-        VALIDATE_OR_GOTO (fd, err);</div><div class='del'>-</div><div class='del'>-        fd_ctx_del (fd, this, &amp;tmp_fctx);</div><div class='del'>-        if (!tmp_fctx) {</div><div class='del'>-                goto err;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        fctx = (stripe_fd_ctx_t *)(long)tmp_fctx;</div><div class='del'>-</div><div class='del'>-        if (!fctx-&gt;static_array)</div><div class='del'>-                GF_FREE (fctx-&gt;xl_array);</div><div class='del'>-</div><div class='del'>-        GF_FREE (fctx);</div><div class='del'>-</div><div class='del'>-err:</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-notify (xlator_t *this, int32_t event, void *data, ...)</div><div class='del'>-{</div><div class='del'>-        stripe_private_t *priv = NULL;</div><div class='del'>-        int               down_client = 0;</div><div class='del'>-        int               i = 0;</div><div class='del'>-</div><div class='del'>-        if (!this)</div><div class='del'>-                return 0;</div><div class='del'>-</div><div class='del'>-        priv = this-&gt;private;</div><div class='del'>-        if (!priv)</div><div class='del'>-                return 0;</div><div class='del'>-</div><div class='del'>-        switch (event)</div><div class='del'>-        {</div><div class='del'>-        case GF_EVENT_CHILD_UP:</div><div class='del'>-        {</div><div class='del'>-                /* get an index number to set */</div><div class='del'>-                for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='del'>-                        if (data == priv-&gt;xl_array[i])</div><div class='del'>-                                break;</div><div class='del'>-                }</div><div class='del'>-                priv-&gt;state[i] = 1;</div><div class='del'>-                for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='del'>-                        if (!priv-&gt;state[i])</div><div class='del'>-                                down_client++;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                LOCK (&amp;priv-&gt;lock);</div><div class='del'>-                {</div><div class='del'>-                        priv-&gt;nodes_down = down_client;</div><div class='del'>-                        if (data == FIRST_CHILD (this))</div><div class='del'>-                                priv-&gt;first_child_down = 0;</div><div class='del'>-                        if (!priv-&gt;nodes_down)</div><div class='del'>-                                default_notify (this, event, data);</div><div class='del'>-                }</div><div class='del'>-                UNLOCK (&amp;priv-&gt;lock);</div><div class='del'>-        }</div><div class='del'>-        break;</div><div class='del'>-        case GF_EVENT_CHILD_DOWN:</div><div class='del'>-        {</div><div class='del'>-                /* get an index number to set */</div><div class='del'>-                for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='del'>-                        if (data == priv-&gt;xl_array[i])</div><div class='del'>-                                break;</div><div class='del'>-                }</div><div class='del'>-                priv-&gt;state[i] = 0;</div><div class='del'>-                for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='del'>-                        if (!priv-&gt;state[i])</div><div class='del'>-                                down_client++;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                LOCK (&amp;priv-&gt;lock);</div><div class='del'>-                {</div><div class='del'>-                        priv-&gt;nodes_down = down_client;</div><div class='del'>-</div><div class='del'>-                        if (data == FIRST_CHILD (this))</div><div class='del'>-                                priv-&gt;first_child_down = 1;</div><div class='del'>-                        if (priv-&gt;nodes_down)</div><div class='del'>-                                default_notify (this, event, data);</div><div class='del'>-                }</div><div class='del'>-                UNLOCK (&amp;priv-&gt;lock);</div><div class='del'>-        }</div><div class='del'>-        break;</div><div class='del'>-</div><div class='del'>-        default:</div><div class='del'>-        {</div><div class='del'>-                /* */</div><div class='del'>-                default_notify (this, event, data);</div><div class='del'>-        }</div><div class='del'>-        break;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-set_stripe_block_size (xlator_t *this, stripe_private_t *priv, char *data)</div><div class='del'>-{</div><div class='del'>-        int                    ret = -1;</div><div class='del'>-        char                  *tmp_str = NULL;</div><div class='del'>-        char                  *tmp_str1 = NULL;</div><div class='del'>-        char                  *dup_str = NULL;</div><div class='del'>-        char                  *stripe_str = NULL;</div><div class='del'>-        char                  *pattern = NULL;</div><div class='del'>-        char                  *num = NULL;</div><div class='del'>-        struct stripe_options *temp_stripeopt = NULL;</div><div class='del'>-        struct stripe_options *stripe_opt = NULL;</div><div class='del'>-</div><div class='del'>-        if (!this || !priv || !data)</div><div class='del'>-                goto out;</div><div class='del'>-</div><div class='del'>-        /* Get the pattern for striping.</div><div class='del'>-           "option block-size *avi:10MB" etc */</div><div class='del'>-        stripe_str = strtok_r (data, ",", &amp;tmp_str);</div><div class='del'>-        while (stripe_str) {</div><div class='del'>-                dup_str = gf_strdup (stripe_str);</div><div class='del'>-                stripe_opt = GF_CALLOC (1, sizeof (struct stripe_options),</div><div class='del'>-                                        gf_stripe_mt_stripe_options);</div><div class='del'>-                if (!stripe_opt) {</div><div class='del'>-                        GF_FREE (dup_str);</div><div class='del'>-                        goto out;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                pattern = strtok_r (dup_str, ":", &amp;tmp_str1);</div><div class='del'>-                num = strtok_r (NULL, ":", &amp;tmp_str1);</div><div class='del'>-                if (!num) {</div><div class='del'>-                        num = pattern;</div><div class='del'>-                        pattern = "*";</div><div class='del'>-                }</div><div class='del'>-                if (gf_string2bytesize (num, &amp;stripe_opt-&gt;block_size) != 0) {</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-                                "invalid number format \"%s\"", num);</div><div class='del'>-                        goto out;</div><div class='del'>-                }</div><div class='del'>-                memcpy (stripe_opt-&gt;path_pattern, pattern, strlen (pattern));</div><div class='del'>-</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-                        "block-size : pattern %s : size %"PRId64,</div><div class='del'>-                        stripe_opt-&gt;path_pattern, stripe_opt-&gt;block_size);</div><div class='del'>-</div><div class='del'>-                if (!priv-&gt;pattern) {</div><div class='del'>-                        priv-&gt;pattern = stripe_opt;</div><div class='del'>-                } else {</div><div class='del'>-                        temp_stripeopt = priv-&gt;pattern;</div><div class='del'>-                        while (temp_stripeopt-&gt;next)</div><div class='del'>-                                temp_stripeopt = temp_stripeopt-&gt;next;</div><div class='del'>-                        temp_stripeopt-&gt;next = stripe_opt;</div><div class='del'>-                }</div><div class='del'>-                stripe_str = strtok_r (NULL, ",", &amp;tmp_str);</div><div class='del'>-                GF_FREE (dup_str);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        ret = 0;</div><div class='del'>-out:</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-mem_acct_init (xlator_t *this)</div><div class='del'>-{</div><div class='del'>-        int     ret = -1;</div><div class='del'>-</div><div class='del'>-        if (!this)</div><div class='del'>-                goto out;</div><div class='del'>-</div><div class='del'>-        ret = xlator_mem_acct_init (this, gf_stripe_mt_end + 1);</div><div class='del'>-</div><div class='del'>-        if (ret != 0) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_ERROR, "Memory accounting init"</div><div class='del'>-                        "failed");</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-/**</div><div class='del'>- * init - This function is called when xlator-graph gets initialized.</div><div class='del'>- *     The option given in volfiles are parsed here.</div><div class='del'>- * @this -</div><div class='del'>- */</div><div class='del'>-int32_t</div><div class='del'>-init (xlator_t *this)</div><div class='del'>-{</div><div class='del'>-        stripe_private_t *priv = NULL;</div><div class='del'>-        xlator_list_t    *trav = NULL;</div><div class='del'>-        data_t           *data = NULL;</div><div class='del'>-        int32_t           count = 0;</div><div class='del'>-        int               ret = -1;</div><div class='del'>-</div><div class='del'>-        if (!this)</div><div class='del'>-                goto out;</div><div class='del'>-</div><div class='del'>-        trav = this-&gt;children;</div><div class='del'>-        while (trav) {</div><div class='del'>-                count++;</div><div class='del'>-                trav = trav-&gt;next;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (!count) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-                        "stripe configured without \"subvolumes\" option. "</div><div class='del'>-                        "exiting");</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (!this-&gt;parents) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_WARNING,</div><div class='del'>-                        "dangling volume. check volfile ");</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (count == 1) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-                        "stripe configured with only one \"subvolumes\" option."</div><div class='del'>-                        " please check the volume. exiting");</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        priv = GF_CALLOC (1, sizeof (stripe_private_t),</div><div class='del'>-                          gf_stripe_mt_stripe_private_t);</div><div class='del'>-</div><div class='del'>-        if (!priv)</div><div class='del'>-                goto out;</div><div class='del'>-        priv-&gt;xl_array = GF_CALLOC (count, sizeof (xlator_t *),</div><div class='del'>-                                    gf_stripe_mt_xlator_t);</div><div class='del'>-        if (!priv-&gt;xl_array)</div><div class='del'>-                goto out;</div><div class='del'>-</div><div class='del'>-        priv-&gt;state = GF_CALLOC (count, sizeof (int8_t),</div><div class='del'>-                                 gf_stripe_mt_int8_t);</div><div class='del'>-        if (!priv-&gt;state)</div><div class='del'>-                goto out;</div><div class='del'>-</div><div class='del'>-        priv-&gt;child_count = count;</div><div class='del'>-        LOCK_INIT (&amp;priv-&gt;lock);</div><div class='del'>-</div><div class='del'>-        trav = this-&gt;children;</div><div class='del'>-        count = 0;</div><div class='del'>-        while (trav) {</div><div class='del'>-                priv-&gt;xl_array[count++] = trav-&gt;xlator;</div><div class='del'>-                trav = trav-&gt;next;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (count &gt; 256) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-                        "maximum number of stripe subvolumes supported "</div><div class='del'>-                        "is 256");</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        priv-&gt;block_size = (128 * GF_UNIT_KB);</div><div class='del'>-        /* option stripe-pattern *avi:1GB,*pdf:4096 */</div><div class='del'>-        data = dict_get (this-&gt;options, "block-size");</div><div class='del'>-        if (!data) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-                        "No \"option block-size &lt;x&gt;\" given, defaulting "</div><div class='del'>-                        "to 128KB");</div><div class='del'>-        } else {</div><div class='del'>-                ret = set_stripe_block_size (this, priv, data-&gt;data);</div><div class='del'>-                if (ret)</div><div class='del'>-                        goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        priv-&gt;xattr_supported = 1;</div><div class='del'>-        data = dict_get (this-&gt;options, "use-xattr");</div><div class='del'>-        if (data) {</div><div class='del'>-                if (gf_string2boolean (data-&gt;data,</div><div class='del'>-                                       &amp;priv-&gt;xattr_supported) == -1) {</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-                                "error setting hard check for extended "</div><div class='del'>-                                "attribute");</div><div class='del'>-                        //return -1;</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        /* notify related */</div><div class='del'>-        priv-&gt;nodes_down = priv-&gt;child_count;</div><div class='del'>-        this-&gt;private = priv;</div><div class='del'>-</div><div class='del'>-        ret = 0;</div><div class='del'>-out:</div><div class='del'>-        if (ret) {</div><div class='del'>-                if (priv) {</div><div class='del'>-                        if (priv-&gt;xl_array)</div><div class='del'>-                                GF_FREE (priv-&gt;xl_array);</div><div class='del'>-                        GF_FREE (priv);</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-/**</div><div class='del'>- * fini -   Free all the private variables</div><div class='del'>- * @this -</div><div class='del'>- */</div><div class='del'>-void</div><div class='del'>-fini (xlator_t *this)</div><div class='del'>-{</div><div class='del'>-        stripe_private_t      *priv = NULL;</div><div class='del'>-        struct stripe_options *prev = NULL;</div><div class='del'>-        struct stripe_options *trav = NULL;</div><div class='del'>-</div><div class='del'>-        if (!this)</div><div class='del'>-                goto out;</div><div class='del'>-</div><div class='del'>-        priv = this-&gt;private;</div><div class='del'>-        if (priv) {</div><div class='del'>-                if (priv-&gt;xl_array)</div><div class='del'>-                        GF_FREE (priv-&gt;xl_array);</div><div class='del'>-</div><div class='del'>-                trav = priv-&gt;pattern;</div><div class='del'>-                while (trav) {</div><div class='del'>-                        prev = trav;</div><div class='del'>-                        trav = trav-&gt;next;</div><div class='del'>-                        GF_FREE (prev);</div><div class='del'>-                }</div><div class='del'>-                LOCK_DESTROY (&amp;priv-&gt;lock);</div><div class='del'>-                GF_FREE (priv);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        return;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-struct xlator_fops fops = {</div><div class='del'>-        .stat        = stripe_stat,</div><div class='del'>-        .unlink      = stripe_unlink,</div><div class='del'>-        .rename      = stripe_rename,</div><div class='del'>-        .link        = stripe_link,</div><div class='del'>-        .truncate    = stripe_truncate,</div><div class='del'>-        .create      = stripe_create,</div><div class='del'>-        .open        = stripe_open,</div><div class='del'>-        .readv       = stripe_readv,</div><div class='del'>-        .writev      = stripe_writev,</div><div class='del'>-        .statfs      = stripe_statfs,</div><div class='del'>-        .flush       = stripe_flush,</div><div class='del'>-        .fsync       = stripe_fsync,</div><div class='del'>-        .ftruncate   = stripe_ftruncate,</div><div class='del'>-        .fstat       = stripe_fstat,</div><div class='del'>-        .mkdir       = stripe_mkdir,</div><div class='del'>-        .rmdir       = stripe_rmdir,</div><div class='del'>-        .lk          = stripe_lk,</div><div class='del'>-        .opendir     = stripe_opendir,</div><div class='del'>-        .fsyncdir    = stripe_fsyncdir,</div><div class='del'>-        .setattr     = stripe_setattr,</div><div class='del'>-        .fsetattr    = stripe_fsetattr,</div><div class='del'>-        .lookup      = stripe_lookup,</div><div class='del'>-        .mknod       = stripe_mknod,</div><div class='del'>-};</div><div class='del'>-</div><div class='del'>-struct xlator_cbks cbks = {</div><div class='del'>-        .release = stripe_release,</div><div class='del'>-};</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-struct volume_options options[] = {</div><div class='del'>-        { .key  = {"block-size"},</div><div class='del'>-          .type = GF_OPTION_TYPE_ANY</div><div class='del'>-        },</div><div class='del'>-        { .key  = {"use-xattr"},</div><div class='del'>-          .type = GF_OPTION_TYPE_BOOL</div><div class='del'>-        },</div><div class='del'>-        { .key  = {NULL} },</div><div class='del'>-};</div><div class='head'>diff --git a/xlators/cluster/stripe/src/stripe.h b/xlators/cluster/stripe/src/stripe.h<br/>deleted file mode 100644<br/>index 8afc6aa9a58..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/xlators/cluster/stripe/src/stripe.h?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/cluster/stripe/src/stripe.h</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,159 +0,0 @@</div><div class='del'>-/*</div><div class='del'>-  Copyright (c) 2009 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='del'>-  This file is part of GlusterFS.</div><div class='del'>-</div><div class='del'>-  GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-  it under the terms of the GNU General Public License as published</div><div class='del'>-  by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-  or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-  GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-  WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-  General Public License for more details.</div><div class='del'>-</div><div class='del'>-  You should have received a copy of the GNU General Public License</div><div class='del'>-  along with this program.  If not, see</div><div class='del'>-  &lt;http://www.gnu.org/licenses/&gt;.</div><div class='del'>-*/</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-#ifndef _STRIPE_H_</div><div class='del'>-#define _STRIPE_H_</div><div class='del'>-</div><div class='del'>-#ifndef _CONFIG_H</div><div class='del'>-#define _CONFIG_H</div><div class='del'>-#include "config.h"</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-#include "xlator.h"</div><div class='del'>-#include "logging.h"</div><div class='del'>-#include "defaults.h"</div><div class='del'>-#include "common-utils.h"</div><div class='del'>-#include "compat.h"</div><div class='del'>-#include "compat-errno.h"</div><div class='del'>-#include "stripe-mem-types.h"</div><div class='del'>-#include &lt;fnmatch.h&gt;</div><div class='del'>-#include &lt;signal.h&gt;</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-/**</div><div class='del'>- * struct stripe_options : This keeps the pattern and the block-size</div><div class='del'>- *     information, which is used for striping on a file.</div><div class='del'>- */</div><div class='del'>-struct stripe_options {</div><div class='del'>-        struct stripe_options *next;</div><div class='del'>-        char                   path_pattern[256];</div><div class='del'>-        uint64_t               block_size;</div><div class='del'>-};</div><div class='del'>-</div><div class='del'>-/**</div><div class='del'>- * Private structure for stripe translator</div><div class='del'>- */</div><div class='del'>-struct stripe_private {</div><div class='del'>-        struct stripe_options  *pattern;</div><div class='del'>-        xlator_t              **xl_array;</div><div class='del'>-        uint64_t                block_size;</div><div class='del'>-        gf_lock_t               lock;</div><div class='del'>-        uint8_t                 nodes_down;</div><div class='del'>-        int8_t                  first_child_down;</div><div class='del'>-        int8_t                  child_count;</div><div class='del'>-        int8_t                 *state; /* Current state of child node */</div><div class='del'>-        gf_boolean_t            xattr_supported;  /* default yes */</div><div class='del'>-};</div><div class='del'>-</div><div class='del'>-/**</div><div class='del'>- * Used to keep info about the replies received from fops-&gt;readv calls</div><div class='del'>- */</div><div class='del'>-struct readv_replies {</div><div class='del'>-        struct iovec *vector;</div><div class='del'>-        int32_t       count;    //count of vector</div><div class='del'>-        int32_t       op_ret;   //op_ret of readv</div><div class='del'>-        int32_t       op_errno;</div><div class='del'>-        int32_t       requested_size;</div><div class='del'>-        struct iatt   stbuf;    /* 'stbuf' is also a part of reply */</div><div class='del'>-};</div><div class='del'>-</div><div class='del'>-typedef struct _stripe_fd_ctx {</div><div class='del'>-        off_t      stripe_size;</div><div class='del'>-        int        stripe_count;</div><div class='del'>-        int        static_array;</div><div class='del'>-        xlator_t **xl_array;</div><div class='del'>-} stripe_fd_ctx_t;</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-/**</div><div class='del'>- * Local structure to be passed with all the frames in case of STACK_WIND</div><div class='del'>- */</div><div class='del'>-struct stripe_local; /* this itself is used inside the structure; */</div><div class='del'>-</div><div class='del'>-struct stripe_local {</div><div class='del'>-        struct stripe_local *next;</div><div class='del'>-        call_frame_t        *orig_frame;</div><div class='del'>-</div><div class='del'>-        stripe_fd_ctx_t     *fctx;</div><div class='del'>-</div><div class='del'>-        /* Used by _cbk functions */</div><div class='del'>-        struct iatt          stbuf;</div><div class='del'>-        struct iatt          pre_buf;</div><div class='del'>-        struct iatt          post_buf;</div><div class='del'>-        struct iatt          preparent;</div><div class='del'>-        struct iatt          postparent;</div><div class='del'>-</div><div class='del'>-        off_t                stbuf_size;</div><div class='del'>-        off_t                prebuf_size;</div><div class='del'>-        off_t                postbuf_size;</div><div class='del'>-        off_t                preparent_size;</div><div class='del'>-        off_t                postparent_size;</div><div class='del'>-</div><div class='del'>-        blkcnt_t             stbuf_blocks;</div><div class='del'>-        blkcnt_t             prebuf_blocks;</div><div class='del'>-        blkcnt_t             postbuf_blocks;</div><div class='del'>-        blkcnt_t             preparent_blocks;</div><div class='del'>-        blkcnt_t             postparent_blocks;</div><div class='del'>-</div><div class='del'>-        struct readv_replies *replies;</div><div class='del'>-        struct statvfs       statvfs_buf;</div><div class='del'>-        dir_entry_t         *entry;</div><div class='del'>-</div><div class='del'>-        int8_t               revalidate;</div><div class='del'>-        int8_t               failed;</div><div class='del'>-        int8_t               unwind;</div><div class='del'>-</div><div class='del'>-        size_t               readv_size;</div><div class='del'>-        int32_t              entry_count;</div><div class='del'>-        int32_t              node_index;</div><div class='del'>-        int32_t              call_count;</div><div class='del'>-        int32_t              wind_count; /* used instead of child_cound</div><div class='del'>-                                            in case of read and write */</div><div class='del'>-        int32_t              op_ret;</div><div class='del'>-        int32_t              op_errno;</div><div class='del'>-        int32_t              count;</div><div class='del'>-        int32_t              flags;</div><div class='del'>-        char                *name;</div><div class='del'>-        inode_t             *inode;</div><div class='del'>-</div><div class='del'>-        loc_t                loc;</div><div class='del'>-        loc_t                loc2;</div><div class='del'>-</div><div class='del'>-        /* For File I/O fops */</div><div class='del'>-        dict_t              *dict;</div><div class='del'>-</div><div class='del'>-        /* General usage */</div><div class='del'>-        off_t                offset;</div><div class='del'>-        off_t                stripe_size;</div><div class='del'>-</div><div class='del'>-        int xattr_self_heal_needed;</div><div class='del'>-        int entry_self_heal_needed;</div><div class='del'>-</div><div class='del'>-        int8_t              *list;</div><div class='del'>-        struct flock         lock;</div><div class='del'>-        fd_t                *fd;</div><div class='del'>-        void                *value;</div><div class='del'>-        struct iobref       *iobref;</div><div class='del'>-};</div><div class='del'>-</div><div class='del'>-typedef struct stripe_local   stripe_local_t;</div><div class='del'>-typedef struct stripe_private stripe_private_t;</div><div class='del'>-</div><div class='del'>-#endif /* _STRIPE_H_ */</div><div class='head'>diff --git a/xlators/cluster/unify/Makefile.am b/xlators/cluster/unify/Makefile.am<br/>deleted file mode 100644<br/>index d471a3f9243..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/xlators/cluster/unify/Makefile.am?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/cluster/unify/Makefile.am</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,3 +0,0 @@</div><div class='del'>-SUBDIRS = src</div><div class='del'>-</div><div class='del'>-CLEANFILES = </div><div class='head'>diff --git a/xlators/cluster/unify/src/Makefile.am b/xlators/cluster/unify/src/Makefile.am<br/>deleted file mode 100644<br/>index 2a1fe837263..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/xlators/cluster/unify/src/Makefile.am?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/cluster/unify/src/Makefile.am</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,16 +0,0 @@</div><div class='del'>-</div><div class='del'>-xlator_LTLIBRARIES = unify.la</div><div class='del'>-xlatordir = $(libdir)/glusterfs/$(PACKAGE_VERSION)/xlator/legacy/cluster</div><div class='del'>-</div><div class='del'>-unify_la_LDFLAGS = -module -avoidversion</div><div class='del'>-</div><div class='del'>-unify_la_SOURCES = unify.c unify-self-heal.c</div><div class='del'>-unify_la_LIBADD = $(top_builddir)/libglusterfs/src/libglusterfs.la</div><div class='del'>-</div><div class='del'>-noinst_HEADERS = unify.h</div><div class='del'>-</div><div class='del'>-AM_CFLAGS = -fPIC -D_FILE_OFFSET_BITS=64 -D_GNU_SOURCE -Wall -D$(GF_HOST_OS) \</div><div class='del'>-	-I$(top_srcdir)/libglusterfs/src -shared -nostartfiles $(GF_CFLAGS)</div><div class='del'>-</div><div class='del'>-CLEANFILES = </div><div class='del'>-</div><div class='head'>diff --git a/xlators/cluster/unify/src/unify-mem-types.h b/xlators/cluster/unify/src/unify-mem-types.h<br/>deleted file mode 100644<br/>index 3b4abc8e9b8..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/xlators/cluster/unify/src/unify-mem-types.h?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/cluster/unify/src/unify-mem-types.h</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,41 +0,0 @@</div><div class='del'>-</div><div class='del'>-/*</div><div class='del'>-   Copyright (c) 2008-2009 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='del'>-   This file is part of GlusterFS.</div><div class='del'>-</div><div class='del'>-   GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-   it under the terms of the GNU General Public License as published</div><div class='del'>-   by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-   or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-   GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-   WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-   General Public License for more details.</div><div class='del'>-</div><div class='del'>-   You should have received a copy of the GNU General Public License</div><div class='del'>-   along with this program.  If not, see</div><div class='del'>-   &lt;http://www.gnu.org/licenses/&gt;.</div><div class='del'>-*/</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-#ifndef __UNIFY_MEM_TYPES_H__</div><div class='del'>-#define __UNIFY_MEM_TYPES_H__</div><div class='del'>-</div><div class='del'>-#include "mem-types.h"</div><div class='del'>-</div><div class='del'>-enum gf_unify_mem_types_ {</div><div class='del'>-        gf_unify_mt_char = gf_common_mt_end + 1,</div><div class='del'>-        gf_unify_mt_int16_t,</div><div class='del'>-        gf_unify_mt_xlator_t,</div><div class='del'>-        gf_unify_mt_unify_private_t,</div><div class='del'>-        gf_unify_mt_xlator_list_t,</div><div class='del'>-        gf_unify_mt_dir_entry_t,</div><div class='del'>-        gf_unify_mt_off_t,</div><div class='del'>-        gf_unify_mt_int,</div><div class='del'>-        gf_unify_mt_unify_self_heal_struct,</div><div class='del'>-        gf_unify_mt_unify_local_t,</div><div class='del'>-        gf_unify_mt_end</div><div class='del'>-};</div><div class='del'>-#endif</div><div class='del'>-</div><div class='head'>diff --git a/xlators/cluster/unify/src/unify-self-heal.c b/xlators/cluster/unify/src/unify-self-heal.c<br/>deleted file mode 100644<br/>index 88145af9a77..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/xlators/cluster/unify/src/unify-self-heal.c?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/cluster/unify/src/unify-self-heal.c</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,1239 +0,0 @@</div><div class='del'>-/*</div><div class='del'>-  Copyright (c) 2007-2009 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='del'>-  This file is part of GlusterFS.</div><div class='del'>-</div><div class='del'>-  GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-  it under the terms of the GNU General Public License as published</div><div class='del'>-  by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-  or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-  GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-  WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-  General Public License for more details.</div><div class='del'>-</div><div class='del'>-  You should have received a copy of the GNU General Public License</div><div class='del'>-  along with this program.  If not, see</div><div class='del'>-  &lt;http://www.gnu.org/licenses/&gt;.</div><div class='del'>-*/</div><div class='del'>-</div><div class='del'>-/**</div><div class='del'>- * unify-self-heal.c : </div><div class='del'>- *   This file implements few functions which enables 'unify' translator </div><div class='del'>- *  to be consistent in its behaviour when </div><div class='del'>- *     &gt; a node fails, </div><div class='del'>- *     &gt; a node gets added, </div><div class='del'>- *     &gt; a failed node comes back</div><div class='del'>- *     &gt; a new namespace server is added (ie, an fresh namespace server).</div><div class='del'>- * </div><div class='del'>- *  This functionality of 'unify' will enable glusterfs to support storage</div><div class='del'>- *  system failure, and maintain consistancy. This works both ways, ie, when</div><div class='del'>- *  an entry (either file or directory) is found on namespace server, and not</div><div class='del'>- *  on storage nodes, its created in storage nodes and vica-versa.</div><div class='del'>- * </div><div class='del'>- *  The two fops, where it can be implemented are 'getdents ()' and 'lookup ()'</div><div class='del'>- *</div><div class='del'>- */</div><div class='del'>-</div><div class='del'>-#ifndef _CONFIG_H</div><div class='del'>-#define _CONFIG_H</div><div class='del'>-#include "config.h"</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-#include "glusterfs.h"</div><div class='del'>-#include "unify.h"</div><div class='del'>-#include "dict.h"</div><div class='del'>-#include "xlator.h"</div><div class='del'>-#include "hashfn.h"</div><div class='del'>-#include "logging.h"</div><div class='del'>-#include "stack.h"</div><div class='del'>-#include "common-utils.h"</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-unify_sh_getdents_cbk (call_frame_t *frame,</div><div class='del'>-		       void *cookie,</div><div class='del'>-		       xlator_t *this,</div><div class='del'>-		       int32_t op_ret,</div><div class='del'>-		       int32_t op_errno,</div><div class='del'>-		       dir_entry_t *entry,</div><div class='del'>-		       int32_t count);</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-unify_sh_ns_getdents_cbk (call_frame_t *frame,</div><div class='del'>-			  void *cookie,</div><div class='del'>-			  xlator_t *this,</div><div class='del'>-			  int32_t op_ret,</div><div class='del'>-			  int32_t op_errno,</div><div class='del'>-			  dir_entry_t *entry,</div><div class='del'>-			  int32_t count);</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-unify_bgsh_getdents_cbk (call_frame_t *frame,</div><div class='del'>-			 void *cookie,</div><div class='del'>-			 xlator_t *this,</div><div class='del'>-			 int32_t op_ret,</div><div class='del'>-			 int32_t op_errno,</div><div class='del'>-			 dir_entry_t *entry,</div><div class='del'>-			 int32_t count);</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-unify_bgsh_ns_getdents_cbk (call_frame_t *frame,</div><div class='del'>-			    void *cookie,</div><div class='del'>-			    xlator_t *this,</div><div class='del'>-			    int32_t op_ret,</div><div class='del'>-			    int32_t op_errno,</div><div class='del'>-			    dir_entry_t *entry,</div><div class='del'>-			    int32_t count);</div><div class='del'>-</div><div class='del'>-/**</div><div class='del'>- * unify_local_wipe - free all the extra allocation of local-&gt;* here.</div><div class='del'>- */</div><div class='del'>-static void </div><div class='del'>-unify_local_wipe (unify_local_t *local)</div><div class='del'>-{</div><div class='del'>-	/* Free the strdup'd variables in the local structure */</div><div class='del'>-	if (local-&gt;name) {</div><div class='del'>-		GF_FREE (local-&gt;name);</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	if (local-&gt;sh_struct) {</div><div class='del'>-		if (local-&gt;sh_struct-&gt;offset_list)</div><div class='del'>-			GF_FREE (local-&gt;sh_struct-&gt;offset_list);</div><div class='del'>-</div><div class='del'>-		if (local-&gt;sh_struct-&gt;entry_list)</div><div class='del'>-			GF_FREE (local-&gt;sh_struct-&gt;entry_list);</div><div class='del'>-</div><div class='del'>-		if (local-&gt;sh_struct-&gt;count_list)</div><div class='del'>-			GF_FREE (local-&gt;sh_struct-&gt;count_list);</div><div class='del'>-</div><div class='del'>-		GF_FREE (local-&gt;sh_struct);</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	loc_wipe (&amp;local-&gt;loc1);</div><div class='del'>-	loc_wipe (&amp;local-&gt;loc2);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t </div><div class='del'>-unify_sh_setdents_cbk (call_frame_t *frame,</div><div class='del'>-		       void *cookie,</div><div class='del'>-		       xlator_t *this,</div><div class='del'>-		       int32_t op_ret,</div><div class='del'>-		       int32_t op_errno)</div><div class='del'>-{</div><div class='del'>-	int32_t callcnt = -1;</div><div class='del'>-	unify_local_t *local = frame-&gt;local;</div><div class='del'>-	inode_t *inode = NULL;</div><div class='del'>-	dict_t *tmp_dict = NULL;</div><div class='del'>-	dir_entry_t *prev, *entry, *trav;</div><div class='del'>-</div><div class='del'>-	LOCK (&amp;frame-&gt;lock);</div><div class='del'>-	{</div><div class='del'>-		/* if local-&gt;call_count == 0, that means, setdents on </div><div class='del'>-		 * storagenodes is still pending.</div><div class='del'>-		 */</div><div class='del'>-		if (local-&gt;call_count)</div><div class='del'>-			callcnt = --local-&gt;call_count;</div><div class='del'>-	}</div><div class='del'>-	UNLOCK (&amp;frame-&gt;lock);</div><div class='del'>-</div><div class='del'>-	if (callcnt == 0) {</div><div class='del'>-		if (local-&gt;sh_struct-&gt;entry_list[0]) {</div><div class='del'>-			prev = entry = local-&gt;sh_struct-&gt;entry_list[0];</div><div class='del'>-			if (!entry)</div><div class='del'>-				return 0;</div><div class='del'>-			trav = entry-&gt;next;</div><div class='del'>-			while (trav) {</div><div class='del'>-				prev-&gt;next = trav-&gt;next;</div><div class='del'>-				GF_FREE (trav-&gt;name);</div><div class='del'>-				if (IA_ISLNK (trav-&gt;buf.ia_type))</div><div class='del'>-					GF_FREE (trav-&gt;link);</div><div class='del'>-				GF_FREE (trav);</div><div class='del'>-				trav = prev-&gt;next;</div><div class='del'>-			}</div><div class='del'>-			GF_FREE (entry);</div><div class='del'>-		}</div><div class='del'>-</div><div class='del'>-		if (!local-&gt;flags) {</div><div class='del'>-			if (local-&gt;sh_struct-&gt;count_list[0] &gt;= </div><div class='del'>-			    UNIFY_SELF_HEAL_GETDENTS_COUNT) {</div><div class='del'>-				/* count == size, that means, there are more entries</div><div class='del'>-				   to read from */</div><div class='del'>-				//local-&gt;call_count = 0;</div><div class='del'>-				local-&gt;sh_struct-&gt;offset_list[0] += </div><div class='del'>-					UNIFY_SELF_HEAL_GETDENTS_COUNT;</div><div class='del'>-				STACK_WIND (frame,</div><div class='del'>-					    unify_sh_ns_getdents_cbk,</div><div class='del'>-					    NS(this),</div><div class='del'>-					    NS(this)-&gt;fops-&gt;getdents,</div><div class='del'>-					    local-&gt;fd,</div><div class='del'>-					    UNIFY_SELF_HEAL_GETDENTS_COUNT,</div><div class='del'>-					    local-&gt;sh_struct-&gt;offset_list[0],</div><div class='del'>-					    GF_GET_DIR_ONLY);</div><div class='del'>-			}		</div><div class='del'>-		} else {</div><div class='del'>-			inode = local-&gt;loc1.inode;</div><div class='del'>-			fd_unref (local-&gt;fd);</div><div class='del'>-			tmp_dict = local-&gt;dict;</div><div class='del'>-</div><div class='del'>-			unify_local_wipe (local);</div><div class='del'>-			</div><div class='del'>-			STACK_UNWIND (frame, local-&gt;op_ret, local-&gt;op_errno, </div><div class='del'>-				      inode, &amp;local-&gt;stbuf, local-&gt;dict,</div><div class='del'>-                                      &amp;local-&gt;oldpostparent);</div><div class='del'>-			if (tmp_dict)</div><div class='del'>-				dict_unref (tmp_dict);</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='del'>-  </div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-unify_sh_ns_getdents_cbk (call_frame_t *frame,</div><div class='del'>-			  void *cookie,</div><div class='del'>-			  xlator_t *this,</div><div class='del'>-			  int32_t op_ret,</div><div class='del'>-			  int32_t op_errno,</div><div class='del'>-			  dir_entry_t *entry,</div><div class='del'>-			  int32_t count)</div><div class='del'>-{</div><div class='del'>-	unify_local_t *local = frame-&gt;local;</div><div class='del'>-	unify_private_t *priv = this-&gt;private;</div><div class='del'>-	long index = 0;</div><div class='del'>-	unsigned long final = 0;</div><div class='del'>-	dir_entry_t *tmp = GF_CALLOC (1, sizeof (dir_entry_t),</div><div class='del'>-                                      gf_unify_mt_dir_entry_t);</div><div class='del'>-	</div><div class='del'>-	local-&gt;sh_struct-&gt;entry_list[0] = tmp;</div><div class='del'>-	local-&gt;sh_struct-&gt;count_list[0] = count;</div><div class='del'>-	if (entry) {</div><div class='del'>-		tmp-&gt;next = entry-&gt;next;</div><div class='del'>-		entry-&gt;next = NULL;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	if ((count &lt; UNIFY_SELF_HEAL_GETDENTS_COUNT) || !entry) {</div><div class='del'>-		final = 1;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	LOCK (&amp;frame-&gt;lock);</div><div class='del'>-	{</div><div class='del'>-		/* local-&gt;call_count will be '0' till now. make it 1 so, it </div><div class='del'>-		   can be UNWIND'ed for the last call. */</div><div class='del'>-		local-&gt;call_count = priv-&gt;child_count;</div><div class='del'>-		if (final)</div><div class='del'>-			local-&gt;flags = 1;</div><div class='del'>-	}</div><div class='del'>-	UNLOCK (&amp;frame-&gt;lock);</div><div class='del'>-</div><div class='del'>-	for (index = 0; index &lt; priv-&gt;child_count; index++) </div><div class='del'>-	{</div><div class='del'>-		STACK_WIND_COOKIE (frame,</div><div class='del'>-				   unify_sh_setdents_cbk, </div><div class='del'>-				   (void *)index,</div><div class='del'>-				   priv-&gt;xl_array[index],</div><div class='del'>-				   priv-&gt;xl_array[index]-&gt;fops-&gt;setdents,</div><div class='del'>-				   local-&gt;fd, GF_SET_DIR_ONLY,</div><div class='del'>-				   local-&gt;sh_struct-&gt;entry_list[0], count);</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t </div><div class='del'>-unify_sh_ns_setdents_cbk (call_frame_t *frame,</div><div class='del'>-			  void *cookie,</div><div class='del'>-			  xlator_t *this,</div><div class='del'>-			  int32_t op_ret,</div><div class='del'>-			  int32_t op_errno)</div><div class='del'>-{</div><div class='del'>-	int32_t callcnt = -1;</div><div class='del'>-	unify_local_t *local = frame-&gt;local;</div><div class='del'>-	unify_private_t *priv = this-&gt;private;</div><div class='del'>-	long index = (long)cookie;</div><div class='del'>-	dir_entry_t *prev, *entry, *trav;</div><div class='del'>-</div><div class='del'>-	LOCK (&amp;frame-&gt;lock);</div><div class='del'>-	{</div><div class='del'>-		if (local-&gt;sh_struct-&gt;entry_list[index]) {</div><div class='del'>-			prev = entry = local-&gt;sh_struct-&gt;entry_list[index];</div><div class='del'>-			trav = entry-&gt;next;</div><div class='del'>-			while (trav) {</div><div class='del'>-				prev-&gt;next = trav-&gt;next;</div><div class='del'>-				GF_FREE (trav-&gt;name);</div><div class='del'>-				if (IA_ISLNK (trav-&gt;buf.ia_type))</div><div class='del'>-					GF_FREE (trav-&gt;link);</div><div class='del'>-				GF_FREE (trav);</div><div class='del'>-				trav = prev-&gt;next;</div><div class='del'>-			}</div><div class='del'>-			GF_FREE (entry);</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='del'>-	UNLOCK (&amp;frame-&gt;lock);</div><div class='del'>-</div><div class='del'>-	if (local-&gt;sh_struct-&gt;count_list[index] &lt; </div><div class='del'>-	    UNIFY_SELF_HEAL_GETDENTS_COUNT) {</div><div class='del'>-		LOCK (&amp;frame-&gt;lock);</div><div class='del'>-		{</div><div class='del'>-			callcnt = --local-&gt;call_count;</div><div class='del'>-		}</div><div class='del'>-		UNLOCK (&amp;frame-&gt;lock);</div><div class='del'>-	} else {</div><div class='del'>-		/* count == size, that means, there are more entries </div><div class='del'>-		   to read from */</div><div class='del'>-		local-&gt;sh_struct-&gt;offset_list[index] += </div><div class='del'>-			UNIFY_SELF_HEAL_GETDENTS_COUNT;</div><div class='del'>-		STACK_WIND_COOKIE (frame,</div><div class='del'>-				   unify_sh_getdents_cbk,</div><div class='del'>-				   cookie,</div><div class='del'>-				   priv-&gt;xl_array[index],</div><div class='del'>-				   priv-&gt;xl_array[index]-&gt;fops-&gt;getdents,</div><div class='del'>-				   local-&gt;fd,</div><div class='del'>-				   UNIFY_SELF_HEAL_GETDENTS_COUNT,</div><div class='del'>-				   local-&gt;sh_struct-&gt;offset_list[index],</div><div class='del'>-				   GF_GET_ALL);</div><div class='del'>-    </div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_DEBUG, </div><div class='del'>-			"readdir on (%s) with offset %"PRId64"", </div><div class='del'>-			priv-&gt;xl_array[index]-&gt;name, </div><div class='del'>-			local-&gt;sh_struct-&gt;offset_list[index]);</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	if (!callcnt) {</div><div class='del'>-		/* All storage nodes have done unified setdents on NS node.</div><div class='del'>-		 * Now, do getdents from NS and do setdents on storage nodes.</div><div class='del'>-		 */</div><div class='del'>-    </div><div class='del'>-		/* sh_struct-&gt;offset_list is no longer required for</div><div class='del'>-		   storage nodes now */</div><div class='del'>-		local-&gt;sh_struct-&gt;offset_list[0] = 0; /* reset */</div><div class='del'>-</div><div class='del'>-		STACK_WIND (frame,</div><div class='del'>-			    unify_sh_ns_getdents_cbk,</div><div class='del'>-			    NS(this),</div><div class='del'>-			    NS(this)-&gt;fops-&gt;getdents,</div><div class='del'>-			    local-&gt;fd,</div><div class='del'>-			    UNIFY_SELF_HEAL_GETDENTS_COUNT,</div><div class='del'>-			    0, /* In this call, do send '0' as offset */</div><div class='del'>-			    GF_GET_DIR_ONLY);</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-/**</div><div class='del'>- * unify_sh_getdents_cbk -</div><div class='del'>- */</div><div class='del'>-int32_t</div><div class='del'>-unify_sh_getdents_cbk (call_frame_t *frame,</div><div class='del'>-		       void *cookie,</div><div class='del'>-		       xlator_t *this,</div><div class='del'>-		       int32_t op_ret,</div><div class='del'>-		       int32_t op_errno,</div><div class='del'>-		       dir_entry_t *entry,</div><div class='del'>-		       int32_t count)</div><div class='del'>-{</div><div class='del'>-	int32_t callcnt = -1;</div><div class='del'>-	unify_local_t *local = frame-&gt;local;</div><div class='del'>-	unify_private_t *priv = this-&gt;private;</div><div class='del'>-	long index = (long)cookie;</div><div class='del'>-	dir_entry_t *tmp = NULL; </div><div class='del'>-</div><div class='del'>-	if (op_ret &gt;= 0 &amp;&amp; count &gt; 0) {</div><div class='del'>-		/* There is some dentry found, just send the dentry to NS */</div><div class='del'>-		tmp = GF_CALLOC (1, sizeof (dir_entry_t),</div><div class='del'>-                                 gf_unify_mt_dir_entry_t);</div><div class='del'>-		local-&gt;sh_struct-&gt;entry_list[index] = tmp;</div><div class='del'>-		local-&gt;sh_struct-&gt;count_list[index] = count;</div><div class='del'>-		if (entry) {</div><div class='del'>-			tmp-&gt;next = entry-&gt;next;</div><div class='del'>-			entry-&gt;next = NULL;</div><div class='del'>-		}</div><div class='del'>-		STACK_WIND_COOKIE (frame,</div><div class='del'>-				   unify_sh_ns_setdents_cbk,</div><div class='del'>-				   cookie,</div><div class='del'>-				   NS(this),</div><div class='del'>-				   NS(this)-&gt;fops-&gt;setdents,</div><div class='del'>-				   local-&gt;fd,</div><div class='del'>-				   GF_SET_IF_NOT_PRESENT,</div><div class='del'>-				   local-&gt;sh_struct-&gt;entry_list[index],</div><div class='del'>-				   count);</div><div class='del'>-		return 0;</div><div class='del'>-	}</div><div class='del'>-  </div><div class='del'>-	if (count &lt; UNIFY_SELF_HEAL_GETDENTS_COUNT) {</div><div class='del'>-		LOCK (&amp;frame-&gt;lock);</div><div class='del'>-		{</div><div class='del'>-			callcnt = --local-&gt;call_count;</div><div class='del'>-		}</div><div class='del'>-		UNLOCK (&amp;frame-&gt;lock);</div><div class='del'>-	} else {</div><div class='del'>-		/* count == size, that means, there are more entries </div><div class='del'>-		   to read from */</div><div class='del'>-		local-&gt;sh_struct-&gt;offset_list[index] += </div><div class='del'>-			UNIFY_SELF_HEAL_GETDENTS_COUNT;</div><div class='del'>-		STACK_WIND_COOKIE (frame,</div><div class='del'>-				   unify_sh_getdents_cbk,</div><div class='del'>-				   cookie,</div><div class='del'>-				   priv-&gt;xl_array[index],</div><div class='del'>-				   priv-&gt;xl_array[index]-&gt;fops-&gt;getdents,</div><div class='del'>-				   local-&gt;fd,</div><div class='del'>-				   UNIFY_SELF_HEAL_GETDENTS_COUNT,</div><div class='del'>-				   local-&gt;sh_struct-&gt;offset_list[index],</div><div class='del'>-				   GF_GET_ALL);</div><div class='del'>-    </div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_DEBUG, </div><div class='del'>-			"readdir on (%s) with offset %"PRId64"", </div><div class='del'>-			priv-&gt;xl_array[index]-&gt;name, </div><div class='del'>-			local-&gt;sh_struct-&gt;offset_list[index]);</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	if (!callcnt) {</div><div class='del'>-		/* All storage nodes have done unified setdents on NS node.</div><div class='del'>-		 * Now, do getdents from NS and do setdents on storage nodes.</div><div class='del'>-		 */</div><div class='del'>-    </div><div class='del'>-		/* sh_struct-&gt;offset_list is no longer required for</div><div class='del'>-		   storage nodes now */</div><div class='del'>-		local-&gt;sh_struct-&gt;offset_list[0] = 0; /* reset */</div><div class='del'>-</div><div class='del'>-		STACK_WIND (frame,</div><div class='del'>-			    unify_sh_ns_getdents_cbk,</div><div class='del'>-			    NS(this),</div><div class='del'>-			    NS(this)-&gt;fops-&gt;getdents,</div><div class='del'>-			    local-&gt;fd,</div><div class='del'>-			    UNIFY_SELF_HEAL_GETDENTS_COUNT,</div><div class='del'>-			    0, /* In this call, do send '0' as offset */</div><div class='del'>-			    GF_GET_DIR_ONLY);</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-/**</div><div class='del'>- * unify_sh_opendir_cbk -</div><div class='del'>- *</div><div class='del'>- * @cookie: </div><div class='del'>- */</div><div class='del'>-int32_t </div><div class='del'>-unify_sh_opendir_cbk (call_frame_t *frame,</div><div class='del'>-		      void *cookie,</div><div class='del'>-		      xlator_t *this,</div><div class='del'>-		      int32_t op_ret,</div><div class='del'>-		      int32_t op_errno,</div><div class='del'>-		      fd_t *fd)</div><div class='del'>-{</div><div class='del'>-	int32_t callcnt = 0;</div><div class='del'>-	unify_local_t *local = frame-&gt;local;</div><div class='del'>-	unify_private_t *priv = this-&gt;private;</div><div class='del'>-	int16_t index = 0;</div><div class='del'>-	inode_t *inode = NULL;</div><div class='del'>-	dict_t *tmp_dict = NULL;</div><div class='del'>-</div><div class='del'>-	LOCK (&amp;frame-&gt;lock);</div><div class='del'>-	{</div><div class='del'>-		callcnt = --local-&gt;call_count;</div><div class='del'>-    </div><div class='del'>-		if (op_ret &gt;= 0) {</div><div class='del'>-			local-&gt;op_ret = op_ret;</div><div class='del'>-		} else {</div><div class='del'>-			gf_log (this-&gt;name, GF_LOG_WARNING, "failed");</div><div class='del'>-			local-&gt;failed = 1;</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='del'>-	UNLOCK (&amp;frame-&gt;lock);</div><div class='del'>-  </div><div class='del'>-	if (!callcnt) {</div><div class='del'>-		local-&gt;call_count = priv-&gt;child_count + 1;</div><div class='del'>-    </div><div class='del'>-		if (!local-&gt;failed) {</div><div class='del'>-			/* send getdents() namespace after finishing</div><div class='del'>-			   storage nodes */</div><div class='del'>-			local-&gt;call_count--; </div><div class='del'>-      </div><div class='del'>-			fd_bind (fd);</div><div class='del'>-</div><div class='del'>-			if (local-&gt;call_count) {</div><div class='del'>-				/* Used as the offset index. This list keeps</div><div class='del'>-				 * track of offset sent to each node during</div><div class='del'>-				 * STACK_WIND.</div><div class='del'>-				 */</div><div class='del'>-				local-&gt;sh_struct-&gt;offset_list = </div><div class='del'>-					GF_CALLOC (priv-&gt;child_count, </div><div class='del'>-					           sizeof (off_t),</div><div class='del'>-                                                   gf_unify_mt_off_t);</div><div class='del'>-				ERR_ABORT (local-&gt;sh_struct-&gt;offset_list);</div><div class='del'>-	</div><div class='del'>-				local-&gt;sh_struct-&gt;entry_list = </div><div class='del'>-					GF_CALLOC (priv-&gt;child_count, </div><div class='del'>-						   sizeof (dir_entry_t *),</div><div class='del'>-                                                   gf_unify_mt_dir_entry_t);</div><div class='del'>-				ERR_ABORT (local-&gt;sh_struct-&gt;entry_list);</div><div class='del'>-</div><div class='del'>-				local-&gt;sh_struct-&gt;count_list = </div><div class='del'>-					GF_CALLOC (priv-&gt;child_count, </div><div class='del'>-						   sizeof (int),</div><div class='del'>-                                                   gf_unify_mt_int);</div><div class='del'>-				ERR_ABORT (local-&gt;sh_struct-&gt;count_list);</div><div class='del'>-</div><div class='del'>-				/* Send getdents on all the fds */</div><div class='del'>-				for (index = 0; </div><div class='del'>-				     index &lt; priv-&gt;child_count; index++) {</div><div class='del'>-					STACK_WIND_COOKIE (frame,</div><div class='del'>-							   unify_sh_getdents_cbk,</div><div class='del'>-							   (void *)(long)index,</div><div class='del'>-							   priv-&gt;xl_array[index],</div><div class='del'>-							   priv-&gt;xl_array[index]-&gt;fops-&gt;getdents,</div><div class='del'>-							   local-&gt;fd,</div><div class='del'>-							   UNIFY_SELF_HEAL_GETDENTS_COUNT,</div><div class='del'>-							   0, /* In this call, do send '0' as offset */</div><div class='del'>-							   GF_GET_ALL);</div><div class='del'>-				}</div><div class='del'>-</div><div class='del'>-				/* did stack wind, so no need to unwind here */</div><div class='del'>-				return 0;</div><div class='del'>-			} /* (local-&gt;call_count) */</div><div class='del'>-		} /* (!local-&gt;failed) */</div><div class='del'>-</div><div class='del'>-		/* Opendir failed on one node. */ </div><div class='del'>-		inode = local-&gt;loc1.inode;</div><div class='del'>-		fd_unref (local-&gt;fd);</div><div class='del'>-		tmp_dict = local-&gt;dict;</div><div class='del'>-</div><div class='del'>-		unify_local_wipe (local);</div><div class='del'>-		/* Only 'self-heal' failed, lookup() was successful. */</div><div class='del'>-		local-&gt;op_ret = 0;</div><div class='del'>-</div><div class='del'>-		/* This is lookup_cbk ()'s UNWIND. */</div><div class='del'>-		STACK_UNWIND (frame, local-&gt;op_ret, local-&gt;op_errno, inode,</div><div class='del'>-			      &amp;local-&gt;stbuf, local-&gt;dict, &amp;local-&gt;oldpostparent);</div><div class='del'>-		if (tmp_dict)</div><div class='del'>-			dict_unref (tmp_dict);</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-/**</div><div class='del'>- * gf_sh_checksum_cbk - </div><div class='del'>- * </div><div class='del'>- * @frame: frame used in lookup. get a copy of it, and use that copy.</div><div class='del'>- * @this: pointer to unify xlator.</div><div class='del'>- * @inode: pointer to inode, for which the consistency check is required.</div><div class='del'>- *</div><div class='del'>- */</div><div class='del'>-int32_t </div><div class='del'>-unify_sh_checksum_cbk (call_frame_t *frame,</div><div class='del'>-		       void *cookie,</div><div class='del'>-		       xlator_t *this,</div><div class='del'>-		       int32_t op_ret,</div><div class='del'>-		       int32_t op_errno,</div><div class='del'>-		       uint8_t *file_checksum,</div><div class='del'>-		       uint8_t *dir_checksum)</div><div class='del'>-{</div><div class='del'>-	unify_local_t *local = frame-&gt;local;</div><div class='del'>-	unify_private_t *priv = this-&gt;private;</div><div class='del'>-	int16_t index = 0;</div><div class='del'>-	int32_t callcnt = 0;</div><div class='del'>-	inode_t *inode = NULL;</div><div class='del'>-	dict_t *tmp_dict = NULL;</div><div class='del'>-</div><div class='del'>-	LOCK (&amp;frame-&gt;lock);</div><div class='del'>-	{</div><div class='del'>-		callcnt = --local-&gt;call_count;</div><div class='del'>-		if (op_ret &gt;= 0) {</div><div class='del'>-			if (NS(this) == (xlator_t *)cookie) {</div><div class='del'>-				memcpy (local-&gt;sh_struct-&gt;ns_file_checksum, </div><div class='del'>-					file_checksum, NAME_MAX);</div><div class='del'>-				memcpy (local-&gt;sh_struct-&gt;ns_dir_checksum, </div><div class='del'>-					dir_checksum, NAME_MAX);</div><div class='del'>-			} else {</div><div class='del'>-				if (local-&gt;entry_count == 0) {</div><div class='del'>-					/* Initialize the dir_checksum to be </div><div class='del'>-					 * used for comparision with other</div><div class='del'>-					 * storage nodes. Should be done for</div><div class='del'>-					 * the first successful call *only*. </div><div class='del'>-					 */</div><div class='del'>-                                        /* Using 'entry_count' as a flag */</div><div class='del'>-					local-&gt;entry_count = 1;</div><div class='del'>-					memcpy (local-&gt;sh_struct-&gt;dir_checksum,</div><div class='del'>-						dir_checksum, NAME_MAX);</div><div class='del'>-				}</div><div class='del'>-</div><div class='del'>-				/* Reply from the storage nodes */</div><div class='del'>-				for (index = 0; </div><div class='del'>-				     index &lt; NAME_MAX; index++) {</div><div class='del'>-					/* Files should be present in</div><div class='del'>-					   only one node */</div><div class='del'>-					local-&gt;sh_struct-&gt;file_checksum[index] ^= file_checksum[index];</div><div class='del'>-	  </div><div class='del'>-					/* directory structure should be</div><div class='del'>-					   same accross */</div><div class='del'>-					if (local-&gt;sh_struct-&gt;dir_checksum[index] != dir_checksum[index])</div><div class='del'>-						local-&gt;failed = 1;</div><div class='del'>-				}</div><div class='del'>-			}</div><div class='del'>-		} </div><div class='del'>-	}</div><div class='del'>-	UNLOCK (&amp;frame-&gt;lock);</div><div class='del'>-</div><div class='del'>-	if (!callcnt) {</div><div class='del'>-		for (index = 0; index &lt; NAME_MAX ; index++) {</div><div class='del'>-			if (local-&gt;sh_struct-&gt;file_checksum[index] != </div><div class='del'>-			    local-&gt;sh_struct-&gt;ns_file_checksum[index]) {</div><div class='del'>-				local-&gt;failed = 1;</div><div class='del'>-				break;</div><div class='del'>-			}</div><div class='del'>-			if (local-&gt;sh_struct-&gt;dir_checksum[index] != </div><div class='del'>-			    local-&gt;sh_struct-&gt;ns_dir_checksum[index]) {</div><div class='del'>-				local-&gt;failed = 1;</div><div class='del'>-				break;</div><div class='del'>-			}</div><div class='del'>-		}</div><div class='del'>-	</div><div class='del'>-		if (local-&gt;failed) {</div><div class='del'>-			/* Log it, it should be a rare event */</div><div class='del'>-			gf_log (this-&gt;name, GF_LOG_WARNING, </div><div class='del'>-				"Self-heal triggered on directory %s", </div><div class='del'>-				local-&gt;loc1.path);</div><div class='del'>-</div><div class='del'>-			/* Any self heal will be done at directory level */</div><div class='del'>-			local-&gt;call_count = 0;</div><div class='del'>-			local-&gt;op_ret = -1;</div><div class='del'>-			local-&gt;failed = 0;</div><div class='del'>-      </div><div class='del'>-			local-&gt;fd = fd_create (local-&gt;loc1.inode, </div><div class='del'>-					       frame-&gt;root-&gt;pid);</div><div class='del'>-</div><div class='del'>-			local-&gt;call_count = priv-&gt;child_count + 1;</div><div class='del'>-	</div><div class='del'>-			for (index = 0; </div><div class='del'>-			     index &lt; (priv-&gt;child_count + 1); index++) {</div><div class='del'>-				STACK_WIND_COOKIE (frame,</div><div class='del'>-						   unify_sh_opendir_cbk,</div><div class='del'>-						   priv-&gt;xl_array[index]-&gt;name,</div><div class='del'>-						   priv-&gt;xl_array[index],</div><div class='del'>-						   priv-&gt;xl_array[index]-&gt;fops-&gt;opendir,</div><div class='del'>-						   &amp;local-&gt;loc1,</div><div class='del'>-						   local-&gt;fd);</div><div class='del'>-			}</div><div class='del'>-			/* opendir can be done on the directory */</div><div class='del'>-			return 0;</div><div class='del'>-		}</div><div class='del'>-</div><div class='del'>-		/* no mismatch */</div><div class='del'>-		inode = local-&gt;loc1.inode;</div><div class='del'>-		tmp_dict = local-&gt;dict;</div><div class='del'>-</div><div class='del'>-		unify_local_wipe (local);</div><div class='del'>-</div><div class='del'>-		/* This is lookup_cbk ()'s UNWIND. */</div><div class='del'>-		STACK_UNWIND (frame,</div><div class='del'>-			      local-&gt;op_ret,</div><div class='del'>-			      local-&gt;op_errno,</div><div class='del'>-			      inode,</div><div class='del'>-			      &amp;local-&gt;stbuf,</div><div class='del'>-			      local-&gt;dict, &amp;local-&gt;oldpostparent);</div><div class='del'>-		if (tmp_dict)</div><div class='del'>-			dict_unref (tmp_dict);</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-/* Foreground self-heal part over */</div><div class='del'>-</div><div class='del'>-/* Background self-heal part */</div><div class='del'>-</div><div class='del'>-int32_t </div><div class='del'>-unify_bgsh_setdents_cbk (call_frame_t *frame,</div><div class='del'>-			 void *cookie,</div><div class='del'>-			 xlator_t *this,</div><div class='del'>-			 int32_t op_ret,</div><div class='del'>-			 int32_t op_errno)</div><div class='del'>-{</div><div class='del'>-	int32_t callcnt = -1;</div><div class='del'>-	unify_local_t *local = frame-&gt;local;</div><div class='del'>-	dir_entry_t *prev, *entry, *trav;</div><div class='del'>-</div><div class='del'>-	LOCK (&amp;frame-&gt;lock);</div><div class='del'>-	{</div><div class='del'>-		/* if local-&gt;call_count == 0, that means, setdents </div><div class='del'>-		   on storagenodes is still pending. */</div><div class='del'>-		if (local-&gt;call_count)</div><div class='del'>-			callcnt = --local-&gt;call_count;</div><div class='del'>-	}</div><div class='del'>-	UNLOCK (&amp;frame-&gt;lock);</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-	if (callcnt == 0) {</div><div class='del'>-		if (local-&gt;sh_struct-&gt;entry_list[0]) {</div><div class='del'>-			prev = entry = local-&gt;sh_struct-&gt;entry_list[0];</div><div class='del'>-			trav = entry-&gt;next;</div><div class='del'>-			while (trav) {</div><div class='del'>-				prev-&gt;next = trav-&gt;next;</div><div class='del'>-				GF_FREE (trav-&gt;name);</div><div class='del'>-				if (IA_ISLNK (trav-&gt;buf.ia_type))</div><div class='del'>-					GF_FREE (trav-&gt;link);</div><div class='del'>-				GF_FREE (trav);</div><div class='del'>-				trav = prev-&gt;next;</div><div class='del'>-			}</div><div class='del'>-			GF_FREE (entry);</div><div class='del'>-		}</div><div class='del'>-</div><div class='del'>-		if (!local-&gt;flags) {</div><div class='del'>-			if (local-&gt;sh_struct-&gt;count_list[0] &gt;= </div><div class='del'>-			    UNIFY_SELF_HEAL_GETDENTS_COUNT) {</div><div class='del'>-				/* count == size, that means, there are more</div><div class='del'>-				   entries to read from */</div><div class='del'>-				//local-&gt;call_count = 0;</div><div class='del'>-				local-&gt;sh_struct-&gt;offset_list[0] += </div><div class='del'>-					UNIFY_SELF_HEAL_GETDENTS_COUNT;</div><div class='del'>-				STACK_WIND (frame,</div><div class='del'>-					    unify_bgsh_ns_getdents_cbk,</div><div class='del'>-					    NS(this),</div><div class='del'>-					    NS(this)-&gt;fops-&gt;getdents,</div><div class='del'>-					    local-&gt;fd,</div><div class='del'>-					    UNIFY_SELF_HEAL_GETDENTS_COUNT,</div><div class='del'>-					    local-&gt;sh_struct-&gt;offset_list[0],</div><div class='del'>-					    GF_GET_DIR_ONLY);</div><div class='del'>-			}		</div><div class='del'>-		} else {</div><div class='del'>-			fd_unref (local-&gt;fd);</div><div class='del'>-			unify_local_wipe (local);</div><div class='del'>-			STACK_DESTROY (frame-&gt;root);</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-unify_bgsh_ns_getdents_cbk (call_frame_t *frame,</div><div class='del'>-			    void *cookie,</div><div class='del'>-			    xlator_t *this,</div><div class='del'>-			    int32_t op_ret,</div><div class='del'>-			    int32_t op_errno,</div><div class='del'>-			    dir_entry_t *entry,</div><div class='del'>-			    int32_t count)</div><div class='del'>-{</div><div class='del'>-	unify_local_t *local = frame-&gt;local;</div><div class='del'>-	unify_private_t *priv = this-&gt;private;</div><div class='del'>-	long index = 0;</div><div class='del'>-	unsigned long final = 0;</div><div class='del'>-	dir_entry_t *tmp = GF_CALLOC (1, sizeof (dir_entry_t),</div><div class='del'>-                                      gf_unify_mt_dir_entry_t);</div><div class='del'>-</div><div class='del'>-	local-&gt;sh_struct-&gt;entry_list[0] = tmp;</div><div class='del'>-	local-&gt;sh_struct-&gt;count_list[0] = count;</div><div class='del'>-	if (entry) {</div><div class='del'>-		tmp-&gt;next = entry-&gt;next;</div><div class='del'>-		entry-&gt;next = NULL;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	if ((count &lt; UNIFY_SELF_HEAL_GETDENTS_COUNT) || !entry) {</div><div class='del'>-		final = 1;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	LOCK (&amp;frame-&gt;lock);</div><div class='del'>-	{</div><div class='del'>-		/* local-&gt;call_count will be '0' till now. make it 1 so, </div><div class='del'>-		   it can be UNWIND'ed for the last call. */</div><div class='del'>-		local-&gt;call_count = priv-&gt;child_count;</div><div class='del'>-		if (final)</div><div class='del'>-			local-&gt;flags = 1;</div><div class='del'>-	}</div><div class='del'>-	UNLOCK (&amp;frame-&gt;lock);</div><div class='del'>-</div><div class='del'>-	for (index = 0; index &lt; priv-&gt;child_count; index++) </div><div class='del'>-	{</div><div class='del'>-		STACK_WIND_COOKIE (frame,</div><div class='del'>-				   unify_bgsh_setdents_cbk, </div><div class='del'>-				   (void *)index,</div><div class='del'>-				   priv-&gt;xl_array[index],</div><div class='del'>-				   priv-&gt;xl_array[index]-&gt;fops-&gt;setdents,</div><div class='del'>-				   local-&gt;fd, GF_SET_DIR_ONLY,</div><div class='del'>-				   local-&gt;sh_struct-&gt;entry_list[0], count);</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t </div><div class='del'>-unify_bgsh_ns_setdents_cbk (call_frame_t *frame,</div><div class='del'>-			    void *cookie,</div><div class='del'>-			    xlator_t *this,</div><div class='del'>-			    int32_t op_ret,</div><div class='del'>-			    int32_t op_errno)</div><div class='del'>-{</div><div class='del'>-	int32_t callcnt = -1;</div><div class='del'>-	unify_local_t *local = frame-&gt;local;</div><div class='del'>-	unify_private_t *priv = this-&gt;private;</div><div class='del'>-	long index = (long)cookie;</div><div class='del'>-	dir_entry_t *prev, *entry, *trav;</div><div class='del'>-</div><div class='del'>-	if (local-&gt;sh_struct-&gt;entry_list[index]) {</div><div class='del'>-		prev = entry = local-&gt;sh_struct-&gt;entry_list[index];</div><div class='del'>-		if (!entry)</div><div class='del'>-			return 0;</div><div class='del'>-		trav = entry-&gt;next;</div><div class='del'>-		while (trav) {</div><div class='del'>-			prev-&gt;next = trav-&gt;next;</div><div class='del'>-			GF_FREE (trav-&gt;name);</div><div class='del'>-			if (IA_ISLNK (trav-&gt;buf.ia_type))</div><div class='del'>-				GF_FREE (trav-&gt;link);</div><div class='del'>-			GF_FREE (trav);</div><div class='del'>-			trav = prev-&gt;next;</div><div class='del'>-		}</div><div class='del'>-		GF_FREE (entry);</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	if (local-&gt;sh_struct-&gt;count_list[index] &lt; </div><div class='del'>-	    UNIFY_SELF_HEAL_GETDENTS_COUNT) {</div><div class='del'>-		LOCK (&amp;frame-&gt;lock);</div><div class='del'>-		{</div><div class='del'>-			callcnt = --local-&gt;call_count;</div><div class='del'>-		}</div><div class='del'>-		UNLOCK (&amp;frame-&gt;lock);</div><div class='del'>-	} else {</div><div class='del'>-		/* count == size, that means, there are more entries </div><div class='del'>-		   to read from */</div><div class='del'>-		local-&gt;sh_struct-&gt;offset_list[index] += </div><div class='del'>-			UNIFY_SELF_HEAL_GETDENTS_COUNT;</div><div class='del'>-		STACK_WIND_COOKIE (frame,</div><div class='del'>-				   unify_bgsh_getdents_cbk,</div><div class='del'>-				   cookie,</div><div class='del'>-				   priv-&gt;xl_array[index],</div><div class='del'>-				   priv-&gt;xl_array[index]-&gt;fops-&gt;getdents,</div><div class='del'>-				   local-&gt;fd,</div><div class='del'>-				   UNIFY_SELF_HEAL_GETDENTS_COUNT,</div><div class='del'>-				   local-&gt;sh_struct-&gt;offset_list[index],</div><div class='del'>-				   GF_GET_ALL);</div><div class='del'>-    </div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_DEBUG, </div><div class='del'>-			"readdir on (%s) with offset %"PRId64"", </div><div class='del'>-			priv-&gt;xl_array[index]-&gt;name, </div><div class='del'>-			local-&gt;sh_struct-&gt;offset_list[index]);</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	if (!callcnt) {</div><div class='del'>-		/* All storage nodes have done unified setdents on NS node.</div><div class='del'>-		 * Now, do getdents from NS and do setdents on storage nodes.</div><div class='del'>-		 */</div><div class='del'>-    </div><div class='del'>-		/* sh_struct-&gt;offset_list is no longer required for</div><div class='del'>-		   storage nodes now */</div><div class='del'>-		local-&gt;sh_struct-&gt;offset_list[0] = 0; /* reset */</div><div class='del'>-</div><div class='del'>-		STACK_WIND (frame,</div><div class='del'>-			    unify_bgsh_ns_getdents_cbk,</div><div class='del'>-			    NS(this),</div><div class='del'>-			    NS(this)-&gt;fops-&gt;getdents,</div><div class='del'>-			    local-&gt;fd,</div><div class='del'>-			    UNIFY_SELF_HEAL_GETDENTS_COUNT,</div><div class='del'>-			    0, /* In this call, do send '0' as offset */</div><div class='del'>-			    GF_GET_DIR_ONLY);</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-/**</div><div class='del'>- * unify_bgsh_getdents_cbk -</div><div class='del'>- */</div><div class='del'>-int32_t</div><div class='del'>-unify_bgsh_getdents_cbk (call_frame_t *frame,</div><div class='del'>-			 void *cookie,</div><div class='del'>-			 xlator_t *this,</div><div class='del'>-			 int32_t op_ret,</div><div class='del'>-			 int32_t op_errno,</div><div class='del'>-			 dir_entry_t *entry,</div><div class='del'>-			 int32_t count)</div><div class='del'>-{</div><div class='del'>-	int32_t callcnt = -1;</div><div class='del'>-	unify_local_t *local = frame-&gt;local;</div><div class='del'>-	unify_private_t *priv = this-&gt;private;</div><div class='del'>-	long index = (long)cookie;</div><div class='del'>-	dir_entry_t *tmp = NULL; </div><div class='del'>-</div><div class='del'>-	if (op_ret &gt;= 0 &amp;&amp; count &gt; 0) {</div><div class='del'>-		/* There is some dentry found, just send the dentry to NS */</div><div class='del'>-		tmp = GF_CALLOC (1, sizeof (dir_entry_t),</div><div class='del'>-                                 gf_unify_mt_dir_entry_t);</div><div class='del'>-		local-&gt;sh_struct-&gt;entry_list[index] = tmp;</div><div class='del'>-		local-&gt;sh_struct-&gt;count_list[index] = count;</div><div class='del'>-		if (entry) {</div><div class='del'>-			tmp-&gt;next = entry-&gt;next;</div><div class='del'>-			entry-&gt;next = NULL;</div><div class='del'>-		}</div><div class='del'>-		STACK_WIND_COOKIE (frame,</div><div class='del'>-				   unify_bgsh_ns_setdents_cbk,</div><div class='del'>-				   cookie,</div><div class='del'>-				   NS(this),</div><div class='del'>-				   NS(this)-&gt;fops-&gt;setdents,</div><div class='del'>-				   local-&gt;fd,</div><div class='del'>-				   GF_SET_IF_NOT_PRESENT,</div><div class='del'>-				   local-&gt;sh_struct-&gt;entry_list[index],</div><div class='del'>-				   count);</div><div class='del'>-		return 0;</div><div class='del'>-	}</div><div class='del'>-  </div><div class='del'>-	if (count &lt; UNIFY_SELF_HEAL_GETDENTS_COUNT) {</div><div class='del'>-		LOCK (&amp;frame-&gt;lock);</div><div class='del'>-		{</div><div class='del'>-			callcnt = --local-&gt;call_count;</div><div class='del'>-		}</div><div class='del'>-		UNLOCK (&amp;frame-&gt;lock);</div><div class='del'>-	} else {</div><div class='del'>-		/* count == size, that means, there are more entries to read from */</div><div class='del'>-		local-&gt;sh_struct-&gt;offset_list[index] += </div><div class='del'>-			UNIFY_SELF_HEAL_GETDENTS_COUNT;</div><div class='del'>-</div><div class='del'>-		STACK_WIND_COOKIE (frame,</div><div class='del'>-				   unify_bgsh_getdents_cbk,</div><div class='del'>-				   cookie,</div><div class='del'>-				   priv-&gt;xl_array[index],</div><div class='del'>-				   priv-&gt;xl_array[index]-&gt;fops-&gt;getdents,</div><div class='del'>-				   local-&gt;fd,</div><div class='del'>-				   UNIFY_SELF_HEAL_GETDENTS_COUNT,</div><div class='del'>-				   local-&gt;sh_struct-&gt;offset_list[index],</div><div class='del'>-				   GF_GET_ALL);</div><div class='del'>-    </div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_DEBUG, </div><div class='del'>-			"readdir on (%s) with offset %"PRId64"", </div><div class='del'>-			priv-&gt;xl_array[index]-&gt;name, </div><div class='del'>-			local-&gt;sh_struct-&gt;offset_list[index]);</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	if (!callcnt) {</div><div class='del'>-		/* All storage nodes have done unified setdents on NS node.</div><div class='del'>-		 * Now, do getdents from NS and do setdents on storage nodes.</div><div class='del'>-		 */</div><div class='del'>-    </div><div class='del'>-		/* sh_struct-&gt;offset_list is no longer required for </div><div class='del'>-		   storage nodes now */</div><div class='del'>-		local-&gt;sh_struct-&gt;offset_list[0] = 0; /* reset */</div><div class='del'>-</div><div class='del'>-		STACK_WIND (frame,</div><div class='del'>-			    unify_bgsh_ns_getdents_cbk,</div><div class='del'>-			    NS(this),</div><div class='del'>-			    NS(this)-&gt;fops-&gt;getdents,</div><div class='del'>-			    local-&gt;fd,</div><div class='del'>-			    UNIFY_SELF_HEAL_GETDENTS_COUNT,</div><div class='del'>-			    0, /* In this call, do send '0' as offset */</div><div class='del'>-			    GF_GET_DIR_ONLY);</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-/**</div><div class='del'>- * unify_bgsh_opendir_cbk -</div><div class='del'>- *</div><div class='del'>- * @cookie: </div><div class='del'>- */</div><div class='del'>-int32_t </div><div class='del'>-unify_bgsh_opendir_cbk (call_frame_t *frame,</div><div class='del'>-			void *cookie,</div><div class='del'>-			xlator_t *this,</div><div class='del'>-			int32_t op_ret,</div><div class='del'>-			int32_t op_errno,</div><div class='del'>-			fd_t *fd)</div><div class='del'>-{</div><div class='del'>-	unify_local_t *local = frame-&gt;local;</div><div class='del'>-	unify_private_t *priv = this-&gt;private;</div><div class='del'>-	int32_t callcnt = 0;</div><div class='del'>-	int16_t index = 0;</div><div class='del'>-</div><div class='del'>-	LOCK (&amp;frame-&gt;lock);</div><div class='del'>-	{</div><div class='del'>-		callcnt = --local-&gt;call_count;</div><div class='del'>-    </div><div class='del'>-		if (op_ret &gt;= 0) {</div><div class='del'>-			local-&gt;op_ret = op_ret;</div><div class='del'>-		} else {</div><div class='del'>-			local-&gt;failed = 1;</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='del'>-	UNLOCK (&amp;frame-&gt;lock);</div><div class='del'>-  </div><div class='del'>-	if (!callcnt) {</div><div class='del'>-		local-&gt;call_count = priv-&gt;child_count + 1;</div><div class='del'>-    </div><div class='del'>-		if (!local-&gt;failed) {</div><div class='del'>-			/* send getdents() namespace after finishing </div><div class='del'>-			   storage nodes */</div><div class='del'>-			local-&gt;call_count--; </div><div class='del'>-			callcnt = local-&gt;call_count;</div><div class='del'>-      </div><div class='del'>-			fd_bind (fd);</div><div class='del'>-</div><div class='del'>-			if (local-&gt;call_count) {</div><div class='del'>-				/* Used as the offset index. This list keeps </div><div class='del'>-				   track of offset sent to each node during </div><div class='del'>-				   STACK_WIND. */</div><div class='del'>-				local-&gt;sh_struct-&gt;offset_list = </div><div class='del'>-					GF_CALLOC (priv-&gt;child_count, </div><div class='del'>-					           sizeof (off_t),</div><div class='del'>-                                                   gf_unify_mt_off_t);</div><div class='del'>-				ERR_ABORT (local-&gt;sh_struct-&gt;offset_list);</div><div class='del'>-	</div><div class='del'>-				local-&gt;sh_struct-&gt;entry_list = </div><div class='del'>-					GF_CALLOC (priv-&gt;child_count, </div><div class='del'>-						   sizeof (dir_entry_t *),</div><div class='del'>-                                                   gf_unify_mt_dir_entry_t);</div><div class='del'>-				ERR_ABORT (local-&gt;sh_struct-&gt;entry_list);</div><div class='del'>-</div><div class='del'>-				local-&gt;sh_struct-&gt;count_list = </div><div class='del'>-					GF_CALLOC (priv-&gt;child_count, </div><div class='del'>-						   sizeof (int),</div><div class='del'>-                                                   gf_unify_mt_int);</div><div class='del'>-				ERR_ABORT (local-&gt;sh_struct-&gt;count_list);</div><div class='del'>-</div><div class='del'>-				/* Send getdents on all the fds */</div><div class='del'>-				for (index = 0; </div><div class='del'>-				     index &lt; priv-&gt;child_count; index++) {</div><div class='del'>-					STACK_WIND_COOKIE (frame,</div><div class='del'>-							   unify_bgsh_getdents_cbk,</div><div class='del'>-							   (void *)(long)index,</div><div class='del'>-							   priv-&gt;xl_array[index],</div><div class='del'>-							   priv-&gt;xl_array[index]-&gt;fops-&gt;getdents,</div><div class='del'>-							   local-&gt;fd,</div><div class='del'>-							   UNIFY_SELF_HEAL_GETDENTS_COUNT,</div><div class='del'>-							   0, /* In this call, do send '0' as offset */</div><div class='del'>-							   GF_GET_ALL);</div><div class='del'>-				}</div><div class='del'>-				/* did a stack wind, so no need to unwind here */</div><div class='del'>-				return 0;</div><div class='del'>-			} /* (local-&gt;call_count) */</div><div class='del'>-		} /* (!local-&gt;failed) */</div><div class='del'>-</div><div class='del'>-		/* Opendir failed on one node. 	 */</div><div class='del'>-		fd_unref (local-&gt;fd);</div><div class='del'>-		</div><div class='del'>-		unify_local_wipe (local);</div><div class='del'>-		STACK_DESTROY (frame-&gt;root);</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-/**</div><div class='del'>- * gf_bgsh_checksum_cbk - </div><div class='del'>- * </div><div class='del'>- * @frame: frame used in lookup. get a copy of it, and use that copy.</div><div class='del'>- * @this: pointer to unify xlator.</div><div class='del'>- * @inode: pointer to inode, for which the consistency check is required.</div><div class='del'>- *</div><div class='del'>- */</div><div class='del'>-int32_t </div><div class='del'>-unify_bgsh_checksum_cbk (call_frame_t *frame,</div><div class='del'>-			 void *cookie,</div><div class='del'>-			 xlator_t *this,</div><div class='del'>-			 int32_t op_ret,</div><div class='del'>-			 int32_t op_errno,</div><div class='del'>-			 uint8_t *file_checksum,</div><div class='del'>-			 uint8_t *dir_checksum)</div><div class='del'>-{</div><div class='del'>-	unify_local_t *local = frame-&gt;local;</div><div class='del'>-	unify_private_t *priv = this-&gt;private;</div><div class='del'>-	int16_t index = 0;</div><div class='del'>-	int32_t callcnt = 0;</div><div class='del'>-  </div><div class='del'>-	LOCK (&amp;frame-&gt;lock);</div><div class='del'>-	{</div><div class='del'>-		callcnt = --local-&gt;call_count;</div><div class='del'>-		if (op_ret &gt;= 0) {</div><div class='del'>-			if (NS(this) == (xlator_t *)cookie) {</div><div class='del'>-				memcpy (local-&gt;sh_struct-&gt;ns_file_checksum, </div><div class='del'>-					file_checksum, NAME_MAX);</div><div class='del'>-				memcpy (local-&gt;sh_struct-&gt;ns_dir_checksum, </div><div class='del'>-					dir_checksum, NAME_MAX);</div><div class='del'>-			} else {</div><div class='del'>-				if (local-&gt;entry_count == 0) {</div><div class='del'>-					/* Initialize the dir_checksum to be </div><div class='del'>-					 * used for comparision with other </div><div class='del'>-					 * storage nodes. Should be done for</div><div class='del'>-					 * the first successful call *only*. </div><div class='del'>-					 */</div><div class='del'>-					/* Using 'entry_count' as a flag */</div><div class='del'>-					local-&gt;entry_count = 1; </div><div class='del'>-					memcpy (local-&gt;sh_struct-&gt;dir_checksum,</div><div class='del'>-						dir_checksum, NAME_MAX);</div><div class='del'>-				}</div><div class='del'>-</div><div class='del'>-				/* Reply from the storage nodes */</div><div class='del'>-				for (index = 0; </div><div class='del'>-				     index &lt; NAME_MAX; index++) {</div><div class='del'>-					/* Files should be present in only </div><div class='del'>-					   one node */</div><div class='del'>-					local-&gt;sh_struct-&gt;file_checksum[index] ^= file_checksum[index];</div><div class='del'>-	  </div><div class='del'>-					/* directory structure should be same </div><div class='del'>-					   accross */</div><div class='del'>-					if (local-&gt;sh_struct-&gt;dir_checksum[index] != dir_checksum[index])</div><div class='del'>-						local-&gt;failed = 1;</div><div class='del'>-				}</div><div class='del'>-			}</div><div class='del'>-		} </div><div class='del'>-	}</div><div class='del'>-	UNLOCK (&amp;frame-&gt;lock);</div><div class='del'>-</div><div class='del'>-	if (!callcnt) {</div><div class='del'>-		for (index = 0; index &lt; NAME_MAX ; index++) {</div><div class='del'>-			if (local-&gt;sh_struct-&gt;file_checksum[index] != </div><div class='del'>-			    local-&gt;sh_struct-&gt;ns_file_checksum[index]) {</div><div class='del'>-				local-&gt;failed = 1;</div><div class='del'>-				break;</div><div class='del'>-			}</div><div class='del'>-			if (local-&gt;sh_struct-&gt;dir_checksum[index] != </div><div class='del'>-			    local-&gt;sh_struct-&gt;ns_dir_checksum[index]) {</div><div class='del'>-				local-&gt;failed = 1;</div><div class='del'>-				break;</div><div class='del'>-			}</div><div class='del'>-		}</div><div class='del'>-	</div><div class='del'>-		if (local-&gt;failed) {</div><div class='del'>-			/* Log it, it should be a rare event */</div><div class='del'>-			gf_log (this-&gt;name, GF_LOG_WARNING, </div><div class='del'>-				"Self-heal triggered on directory %s", </div><div class='del'>-				local-&gt;loc1.path);</div><div class='del'>-</div><div class='del'>-			/* Any self heal will be done at the directory level */</div><div class='del'>-			local-&gt;op_ret = -1;</div><div class='del'>-			local-&gt;failed = 0;</div><div class='del'>-      </div><div class='del'>-			local-&gt;fd = fd_create (local-&gt;loc1.inode, </div><div class='del'>-					       frame-&gt;root-&gt;pid);</div><div class='del'>-			local-&gt;call_count = priv-&gt;child_count + 1;</div><div class='del'>-	</div><div class='del'>-			for (index = 0; </div><div class='del'>-			     index &lt; (priv-&gt;child_count + 1); index++) {</div><div class='del'>-				STACK_WIND_COOKIE (frame,</div><div class='del'>-						   unify_bgsh_opendir_cbk,</div><div class='del'>-						   priv-&gt;xl_array[index]-&gt;name,</div><div class='del'>-						   priv-&gt;xl_array[index],</div><div class='del'>-						   priv-&gt;xl_array[index]-&gt;fops-&gt;opendir,</div><div class='del'>-						   &amp;local-&gt;loc1,</div><div class='del'>-						   local-&gt;fd);</div><div class='del'>-			}</div><div class='del'>-      </div><div class='del'>-			/* opendir can be done on the directory */</div><div class='del'>-			return 0;</div><div class='del'>-		}</div><div class='del'>-</div><div class='del'>-		/* no mismatch */</div><div class='del'>-		unify_local_wipe (local);</div><div class='del'>-		STACK_DESTROY (frame-&gt;root);</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-/* Background self-heal part over */</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-/**</div><div class='del'>- * zr_unify_self_heal - </div><div class='del'>- * </div><div class='del'>- * @frame: frame used in lookup. get a copy of it, and use that copy.</div><div class='del'>- * @this: pointer to unify xlator.</div><div class='del'>- * @inode: pointer to inode, for which the consistency check is required.</div><div class='del'>- *</div><div class='del'>- */</div><div class='del'>-int32_t </div><div class='del'>-zr_unify_self_heal (call_frame_t *frame,</div><div class='del'>-		    xlator_t *this,</div><div class='del'>-		    unify_local_t *local)</div><div class='del'>-{</div><div class='del'>-	unify_private_t *priv = this-&gt;private;</div><div class='del'>-	call_frame_t *bg_frame = NULL;</div><div class='del'>-	unify_local_t *bg_local = NULL;</div><div class='del'>-	inode_t *tmp_inode = NULL;</div><div class='del'>-	dict_t *tmp_dict = NULL;</div><div class='del'>-	int16_t index = 0;</div><div class='del'>-  </div><div class='del'>-	if (local-&gt;inode_generation &lt; priv-&gt;inode_generation) {</div><div class='del'>-		/* Any self heal will be done at the directory level */</div><div class='del'>-		/* Update the inode's generation to the current generation</div><div class='del'>-		   value. */</div><div class='del'>-		local-&gt;inode_generation = priv-&gt;inode_generation;</div><div class='del'>-		inode_ctx_put (local-&gt;loc1.inode, this, </div><div class='del'>-			  (uint64_t)(long)local-&gt;inode_generation);</div><div class='del'>-</div><div class='del'>-		if (priv-&gt;self_heal == ZR_UNIFY_FG_SELF_HEAL) {</div><div class='del'>-			local-&gt;op_ret = 0;</div><div class='del'>-			local-&gt;failed = 0;</div><div class='del'>-			local-&gt;call_count = priv-&gt;child_count + 1;</div><div class='del'>-			local-&gt;sh_struct = </div><div class='del'>-	         	     GF_CALLOC (1, sizeof (struct unify_self_heal_struct),</div><div class='del'>-                                        gf_unify_mt_unify_self_heal_struct);</div><div class='del'>-      </div><div class='del'>-			/* +1 is for NS */</div><div class='del'>-			for (index = 0; </div><div class='del'>-			     index &lt; (priv-&gt;child_count + 1); index++) {</div><div class='del'>-				STACK_WIND_COOKIE (frame,</div><div class='del'>-						   unify_sh_checksum_cbk,</div><div class='del'>-						   priv-&gt;xl_array[index],</div><div class='del'>-						   priv-&gt;xl_array[index],</div><div class='del'>-						   priv-&gt;xl_array[index]-&gt;fops-&gt;checksum,</div><div class='del'>-						   &amp;local-&gt;loc1,</div><div class='del'>-						   0);</div><div class='del'>-			}</div><div class='del'>-</div><div class='del'>-			/* Self-heal in foreground, hence no need </div><div class='del'>-			   to UNWIND here */</div><div class='del'>-			return 0;</div><div class='del'>-		}</div><div class='del'>-</div><div class='del'>-		/* Self Heal done in background */</div><div class='del'>-		bg_frame = copy_frame (frame);</div><div class='del'>-		INIT_LOCAL (bg_frame, bg_local);</div><div class='del'>-		loc_copy (&amp;bg_local-&gt;loc1, &amp;local-&gt;loc1);</div><div class='del'>-		bg_local-&gt;op_ret = 0;</div><div class='del'>-		bg_local-&gt;failed = 0;</div><div class='del'>-		bg_local-&gt;call_count = priv-&gt;child_count + 1;</div><div class='del'>-		bg_local-&gt;sh_struct = </div><div class='del'>-			GF_CALLOC (1, sizeof (struct unify_self_heal_struct),</div><div class='del'>-                                   gf_unify_mt_unify_self_heal_struct);</div><div class='del'>-    </div><div class='del'>-		/* +1 is for NS */</div><div class='del'>-		for (index = 0; index &lt; (priv-&gt;child_count + 1); index++) {</div><div class='del'>-			STACK_WIND_COOKIE (bg_frame,</div><div class='del'>-					   unify_bgsh_checksum_cbk,</div><div class='del'>-					   priv-&gt;xl_array[index],</div><div class='del'>-					   priv-&gt;xl_array[index],</div><div class='del'>-					   priv-&gt;xl_array[index]-&gt;fops-&gt;checksum,</div><div class='del'>-					   &amp;bg_local-&gt;loc1,</div><div class='del'>-					   0);</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	/* generation number matches, self heal already done or</div><div class='del'>-	 * self heal done in background: just do STACK_UNWIND </div><div class='del'>-	 */</div><div class='del'>-	tmp_inode = local-&gt;loc1.inode;</div><div class='del'>-	tmp_dict = local-&gt;dict;</div><div class='del'>-</div><div class='del'>-	unify_local_wipe (local);</div><div class='del'>-</div><div class='del'>-	/* This is lookup_cbk ()'s UNWIND. */</div><div class='del'>-	STACK_UNWIND (frame,</div><div class='del'>-		      local-&gt;op_ret,</div><div class='del'>-		      local-&gt;op_errno,</div><div class='del'>-		      tmp_inode,</div><div class='del'>-		      &amp;local-&gt;stbuf,</div><div class='del'>-		      local-&gt;dict,</div><div class='del'>-                      &amp;local-&gt;oldpostparent);</div><div class='del'>-</div><div class='del'>-	if (tmp_dict)</div><div class='del'>-		dict_unref (tmp_dict);</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='head'>diff --git a/xlators/cluster/unify/src/unify.c b/xlators/cluster/unify/src/unify.c<br/>deleted file mode 100644<br/>index e50d3274f3b..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/xlators/cluster/unify/src/unify.c?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/cluster/unify/src/unify.c</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,4589 +0,0 @@</div><div class='del'>-/*</div><div class='del'>-  Copyright (c) 2006-2009 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='del'>-  This file is part of GlusterFS.</div><div class='del'>-</div><div class='del'>-  GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-  it under the terms of the GNU General Public License as published</div><div class='del'>-  by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-  or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-  GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-  WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-  General Public License for more details.</div><div class='del'>-</div><div class='del'>-  You should have received a copy of the GNU General Public License</div><div class='del'>-  along with this program.  If not, see</div><div class='del'>-  &lt;http://www.gnu.org/licenses/&gt;.</div><div class='del'>-*/</div><div class='del'>-</div><div class='del'>-/**</div><div class='del'>- * xlators/cluster/unify:</div><div class='del'>- *     - This xlator is one of the main translator in GlusterFS, which</div><div class='del'>- *   actually does the clustering work of the file system. One need to </div><div class='del'>- *   understand that, unify assumes file to be existing in only one of </div><div class='del'>- *   the child node, and directories to be present on all the nodes. </div><div class='del'>- *</div><div class='del'>- * NOTE:</div><div class='del'>- *   Now, unify has support for global namespace, which is used to keep a </div><div class='del'>- * global view of fs's namespace tree. The stat for directories are taken</div><div class='del'>- * just from the namespace, where as for files, just 'ia_ino' is taken from</div><div class='del'>- * Namespace node, and other stat info is taken from the actual storage node.</div><div class='del'>- * Also Namespace node helps to keep consistant inode for files across </div><div class='del'>- * glusterfs (re-)mounts.</div><div class='del'>- */</div><div class='del'>-</div><div class='del'>-#ifndef _CONFIG_H</div><div class='del'>-#define _CONFIG_H</div><div class='del'>-#include "config.h"</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-#include "glusterfs.h"</div><div class='del'>-#include "unify.h"</div><div class='del'>-#include "dict.h"</div><div class='del'>-#include "xlator.h"</div><div class='del'>-#include "hashfn.h"</div><div class='del'>-#include "logging.h"</div><div class='del'>-#include "stack.h"</div><div class='del'>-#include "defaults.h"</div><div class='del'>-#include "common-utils.h"</div><div class='del'>-#include &lt;signal.h&gt;</div><div class='del'>-#include &lt;libgen.h&gt;</div><div class='del'>-#include "compat-errno.h"</div><div class='del'>-#include "compat.h"</div><div class='del'>-</div><div class='del'>-#define UNIFY_CHECK_INODE_CTX_AND_UNWIND_ON_ERR(_loc) do { \</div><div class='del'>-  if (!(_loc &amp;&amp; _loc-&gt;inode)) {                            \</div><div class='del'>-    STACK_UNWIND (frame, -1, EINVAL, NULL, NULL, NULL);    \</div><div class='del'>-    return 0;                                              \</div><div class='del'>-  }                                                        \</div><div class='del'>-} while(0)</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-#define UNIFY_CHECK_FD_CTX_AND_UNWIND_ON_ERR(_fd) do { \</div><div class='del'>-  if (!(_fd &amp;&amp; !fd_ctx_get (_fd, this, NULL))) {       \</div><div class='del'>-    STACK_UNWIND (frame, -1, EBADFD, NULL, NULL);      \</div><div class='del'>-    return 0;                                          \</div><div class='del'>-  }                                                    \</div><div class='del'>-} while(0)</div><div class='del'>-</div><div class='del'>-#define UNIFY_CHECK_FD_AND_UNWIND_ON_ERR(_fd) do { \</div><div class='del'>-  if (!_fd) {                                      \</div><div class='del'>-    STACK_UNWIND (frame, -1, EBADFD, NULL, NULL);  \</div><div class='del'>-    return 0;                                      \</div><div class='del'>-  }                                                \</div><div class='del'>-} while(0)</div><div class='del'>-</div><div class='del'>-/**</div><div class='del'>- * unify_local_wipe - free all the extra allocation of local-&gt;* here.</div><div class='del'>- */</div><div class='del'>-static void </div><div class='del'>-unify_local_wipe (unify_local_t *local)</div><div class='del'>-{</div><div class='del'>-	/* Free the strdup'd variables in the local structure */</div><div class='del'>-	if (local-&gt;name) {</div><div class='del'>-		GF_FREE (local-&gt;name);</div><div class='del'>-	}</div><div class='del'>-	loc_wipe (&amp;local-&gt;loc1);</div><div class='del'>-	loc_wipe (&amp;local-&gt;loc2);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-/*</div><div class='del'>- * unify_normalize_stats -</div><div class='del'>- */</div><div class='del'>-void</div><div class='del'>-unify_normalize_stats (struct statvfs *buf,</div><div class='del'>-		       unsigned long bsize,</div><div class='del'>-		       unsigned long frsize)</div><div class='del'>-{</div><div class='del'>-	double factor;</div><div class='del'>-</div><div class='del'>-	if (buf-&gt;f_bsize != bsize) {</div><div class='del'>-		factor = ((double) buf-&gt;f_bsize) / bsize;</div><div class='del'>-		buf-&gt;f_bsize  = bsize;</div><div class='del'>-		buf-&gt;f_bfree  = (fsblkcnt_t) (factor * buf-&gt;f_bfree);</div><div class='del'>-		buf-&gt;f_bavail = (fsblkcnt_t) (factor * buf-&gt;f_bavail);</div><div class='del'>-	}</div><div class='del'>-  </div><div class='del'>-	if (buf-&gt;f_frsize != frsize) {</div><div class='del'>-		factor = ((double) buf-&gt;f_frsize) / frsize;</div><div class='del'>-		buf-&gt;f_frsize = frsize;</div><div class='del'>-		buf-&gt;f_blocks = (fsblkcnt_t) (factor * buf-&gt;f_blocks);</div><div class='del'>-	}</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-xlator_t *</div><div class='del'>-unify_loc_subvol (loc_t *loc, xlator_t *this)</div><div class='del'>-{</div><div class='del'>-	unify_private_t *priv = NULL;</div><div class='del'>-	xlator_t        *subvol = NULL;</div><div class='del'>-	int16_t         *list = NULL;</div><div class='del'>-	long             index = 0;</div><div class='del'>-	xlator_t        *subvol_i = NULL;</div><div class='del'>-	int              ret = 0;</div><div class='del'>-	uint64_t         tmp_list = 0;</div><div class='del'>-</div><div class='del'>-	priv   = this-&gt;private;</div><div class='del'>-	subvol = NS (this);</div><div class='del'>-</div><div class='del'>-	if (!IA_ISDIR (loc-&gt;inode-&gt;ia_type)) {</div><div class='del'>-		ret = inode_ctx_get (loc-&gt;inode, this, &amp;tmp_list);</div><div class='del'>-		list = (int16_t *)(long)tmp_list;</div><div class='del'>-		if (!list)</div><div class='del'>-			goto out;</div><div class='del'>-</div><div class='del'>-		for (index = 0; list[index] != -1; index++) {</div><div class='del'>-			subvol_i = priv-&gt;xl_array[list[index]];</div><div class='del'>-			if (subvol_i != NS (this)) {</div><div class='del'>-				subvol = subvol_i;</div><div class='del'>-				break;</div><div class='del'>-			}</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='del'>-out:</div><div class='del'>-	return subvol;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-/**</div><div class='del'>- * unify_statfs_cbk -</div><div class='del'>- */</div><div class='del'>-int32_t</div><div class='del'>-unify_statfs_cbk (call_frame_t *frame,</div><div class='del'>-		  void *cookie,</div><div class='del'>-		  xlator_t *this,</div><div class='del'>-		  int32_t op_ret,</div><div class='del'>-		  int32_t op_errno,</div><div class='del'>-		  struct statvfs *stbuf)</div><div class='del'>-{</div><div class='del'>-	int32_t callcnt = 0;</div><div class='del'>-	struct statvfs *dict_buf = NULL;</div><div class='del'>-	unsigned long bsize;</div><div class='del'>-	unsigned long frsize;</div><div class='del'>-	unify_local_t *local = (unify_local_t *)frame-&gt;local;</div><div class='del'>-	call_frame_t *prev_frame = cookie;</div><div class='del'>-</div><div class='del'>-	LOCK (&amp;frame-&gt;lock);</div><div class='del'>-	{</div><div class='del'>-		if (op_ret &gt;= 0) {</div><div class='del'>-			/* when a call is successfull, add it to local-&gt;dict */</div><div class='del'>-			dict_buf = &amp;local-&gt;statvfs_buf;</div><div class='del'>-</div><div class='del'>-			if (dict_buf-&gt;f_bsize != 0) {</div><div class='del'>-				bsize  = max (dict_buf-&gt;f_bsize, </div><div class='del'>-					      stbuf-&gt;f_bsize);</div><div class='del'>-</div><div class='del'>-				frsize = max (dict_buf-&gt;f_frsize, </div><div class='del'>-					      stbuf-&gt;f_frsize);</div><div class='del'>-				unify_normalize_stats(dict_buf, bsize, frsize);</div><div class='del'>-				unify_normalize_stats(stbuf, bsize, frsize);</div><div class='del'>-			} else {</div><div class='del'>-				dict_buf-&gt;f_bsize   = stbuf-&gt;f_bsize;</div><div class='del'>-				dict_buf-&gt;f_frsize  = stbuf-&gt;f_frsize;</div><div class='del'>-			}</div><div class='del'>-      </div><div class='del'>-			dict_buf-&gt;f_blocks += stbuf-&gt;f_blocks;</div><div class='del'>-			dict_buf-&gt;f_bfree  += stbuf-&gt;f_bfree;</div><div class='del'>-			dict_buf-&gt;f_bavail += stbuf-&gt;f_bavail;</div><div class='del'>-			dict_buf-&gt;f_files  += stbuf-&gt;f_files;</div><div class='del'>-			dict_buf-&gt;f_ffree  += stbuf-&gt;f_ffree;</div><div class='del'>-			dict_buf-&gt;f_favail += stbuf-&gt;f_favail;</div><div class='del'>-			dict_buf-&gt;f_fsid    = stbuf-&gt;f_fsid;</div><div class='del'>-			dict_buf-&gt;f_flag    = stbuf-&gt;f_flag;</div><div class='del'>-			dict_buf-&gt;f_namemax = stbuf-&gt;f_namemax;</div><div class='del'>-			local-&gt;op_ret = op_ret;</div><div class='del'>-		} else {</div><div class='del'>-			/* fop on storage node has failed due to some error */</div><div class='del'>-			if (op_errno != ENOTCONN) {</div><div class='del'>-				gf_log (this-&gt;name, GF_LOG_ERROR, </div><div class='del'>-					"child(%s): %s", </div><div class='del'>-					prev_frame-&gt;this-&gt;name, </div><div class='del'>-					strerror (op_errno));</div><div class='del'>-			}</div><div class='del'>-			local-&gt;op_errno = op_errno;</div><div class='del'>-		}</div><div class='del'>-		callcnt = --local-&gt;call_count;</div><div class='del'>-	}</div><div class='del'>-	UNLOCK (&amp;frame-&gt;lock);</div><div class='del'>-</div><div class='del'>-	if (!callcnt) {</div><div class='del'>-		STACK_UNWIND (frame, local-&gt;op_ret, local-&gt;op_errno, </div><div class='del'>-			      &amp;local-&gt;statvfs_buf);</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-/**</div><div class='del'>- * unify_statfs -</div><div class='del'>- */</div><div class='del'>-int32_t</div><div class='del'>-unify_statfs (call_frame_t *frame,</div><div class='del'>-	      xlator_t *this,</div><div class='del'>-	      loc_t *loc)</div><div class='del'>-{</div><div class='del'>-	unify_local_t *local = NULL;</div><div class='del'>-	xlator_list_t *trav = this-&gt;children;</div><div class='del'>-</div><div class='del'>-	INIT_LOCAL (frame, local);</div><div class='del'>-	local-&gt;call_count = ((unify_private_t *)this-&gt;private)-&gt;child_count;</div><div class='del'>-</div><div class='del'>-	while(trav) {</div><div class='del'>-		STACK_WIND (frame,</div><div class='del'>-			    unify_statfs_cbk,</div><div class='del'>-			    trav-&gt;xlator,</div><div class='del'>-			    trav-&gt;xlator-&gt;fops-&gt;statfs,</div><div class='del'>-			    loc);</div><div class='del'>-		trav = trav-&gt;next;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-/**</div><div class='del'>- * unify_buf_cbk - </div><div class='del'>- */</div><div class='del'>-int32_t</div><div class='del'>-unify_buf_cbk (call_frame_t *frame,</div><div class='del'>-	       void *cookie,</div><div class='del'>-	       xlator_t *this,</div><div class='del'>-	       int32_t op_ret,</div><div class='del'>-	       int32_t op_errno,</div><div class='del'>-	       struct iatt *buf)</div><div class='del'>-{</div><div class='del'>-	int32_t callcnt = 0;</div><div class='del'>-	unify_private_t *priv = this-&gt;private;</div><div class='del'>-	unify_local_t *local = frame-&gt;local;</div><div class='del'>-	call_frame_t *prev_frame = cookie;</div><div class='del'>-</div><div class='del'>-	LOCK (&amp;frame-&gt;lock);</div><div class='del'>-	{</div><div class='del'>-		callcnt = --local-&gt;call_count;</div><div class='del'>-    </div><div class='del'>-		if (op_ret == -1) {</div><div class='del'>-			gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-				"%s(): child(%s): path(%s): %s", </div><div class='del'>-				gf_fop_list[frame-&gt;root-&gt;op],</div><div class='del'>-				prev_frame-&gt;this-&gt;name, </div><div class='del'>-				(local-&gt;loc1.path)?local-&gt;loc1.path:"", </div><div class='del'>-				strerror (op_errno));</div><div class='del'>-</div><div class='del'>-			local-&gt;op_errno = op_errno;</div><div class='del'>-			if ((op_errno == ENOENT) &amp;&amp; priv-&gt;optimist) </div><div class='del'>-				local-&gt;op_ret = 0;</div><div class='del'>-		}</div><div class='del'>-</div><div class='del'>-		if (op_ret &gt;= 0) {</div><div class='del'>-			local-&gt;op_ret = 0;</div><div class='del'>-</div><div class='del'>-			if (NS (this) == prev_frame-&gt;this) {</div><div class='del'>-				local-&gt;ia_ino = buf-&gt;ia_ino;</div><div class='del'>-				/* If the entry is directory, get the stat</div><div class='del'>-				   from NS node */</div><div class='del'>-				if (IA_ISDIR (buf-&gt;ia_type) || </div><div class='del'>-				    !local-&gt;stbuf.ia_blksize) {</div><div class='del'>-					local-&gt;stbuf = *buf;</div><div class='del'>-				}</div><div class='del'>-			}</div><div class='del'>-</div><div class='del'>-			if ((!IA_ISDIR (buf-&gt;ia_type)) &amp;&amp; </div><div class='del'>-			    (NS (this) != prev_frame-&gt;this)) {</div><div class='del'>-				/* If file, take the stat info from Storage </div><div class='del'>-				   node. */</div><div class='del'>-				local-&gt;stbuf = *buf;</div><div class='del'>-			}</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='del'>-	UNLOCK (&amp;frame-&gt;lock);</div><div class='del'>-    </div><div class='del'>-	if (!callcnt) {</div><div class='del'>-		/* If the inode number is not filled, operation should</div><div class='del'>-		   fail */</div><div class='del'>-		if (!local-&gt;ia_ino)</div><div class='del'>-			local-&gt;op_ret = -1;</div><div class='del'>-</div><div class='del'>-		local-&gt;stbuf.ia_ino = local-&gt;ia_ino;</div><div class='del'>-		unify_local_wipe (local);</div><div class='del'>-		STACK_UNWIND (frame, local-&gt;op_ret, local-&gt;op_errno, </div><div class='del'>-			      &amp;local-&gt;stbuf);</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-#define check_if_dht_linkfile(s) \</div><div class='del'>-        ((st_mode_from_ia (s-&gt;ia_prot, s-&gt;ia_type) &amp; ~S_IFMT) == S_ISVTX)</div><div class='del'>-</div><div class='del'>-/**</div><div class='del'>- * unify_lookup_cbk - </div><div class='del'>- */</div><div class='del'>-int32_t </div><div class='del'>-unify_lookup_cbk (call_frame_t *frame,</div><div class='del'>-		  void *cookie,</div><div class='del'>-		  xlator_t *this,</div><div class='del'>-		  int32_t op_ret,</div><div class='del'>-		  int32_t op_errno,</div><div class='del'>-		  inode_t *inode,</div><div class='del'>-		  struct iatt *buf,</div><div class='del'>-		  dict_t *dict,</div><div class='del'>-                  struct iatt *postparent)</div><div class='del'>-{</div><div class='del'>-	int32_t callcnt = 0;</div><div class='del'>-	unify_private_t *priv = this-&gt;private;</div><div class='del'>-	unify_local_t *local = frame-&gt;local;</div><div class='del'>-	inode_t *tmp_inode = NULL;</div><div class='del'>-	dict_t *local_dict = NULL;</div><div class='del'>-</div><div class='del'>-	LOCK (&amp;frame-&gt;lock);</div><div class='del'>-	{</div><div class='del'>-		callcnt = --local-&gt;call_count;</div><div class='del'>- </div><div class='del'>-		if (op_ret == -1) {</div><div class='del'>-                        if (local-&gt;revalidate &amp;&amp;</div><div class='del'>-                            (op_errno == ESTALE)) {</div><div class='del'>-                                /* ESTALE takes priority */</div><div class='del'>-                                local-&gt;op_errno = op_errno;</div><div class='del'>-                                local-&gt;failed = 1;</div><div class='del'>-                        }</div><div class='del'>-</div><div class='del'>-			if ((op_errno != ENOTCONN) </div><div class='del'>-                            &amp;&amp; (op_errno != ENOENT)</div><div class='del'>-                            &amp;&amp; (local-&gt;op_errno != ESTALE)) {</div><div class='del'>-                                /* if local-&gt;op_errno is already ESTALE, then</div><div class='del'>-                                 * ESTALE has to propogated to the parent first.</div><div class='del'>-                                 * do not enter here.</div><div class='del'>-                                 */</div><div class='del'>-				gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-					"child(%s): path(%s): %s", </div><div class='del'>-					priv-&gt;xl_array[(long)cookie]-&gt;name, </div><div class='del'>-					local-&gt;loc1.path, strerror (op_errno));</div><div class='del'>-                                local-&gt;op_errno = op_errno;</div><div class='del'>-				local-&gt;failed = 1;</div><div class='del'>-</div><div class='del'>-			} else if (local-&gt;revalidate &amp;&amp; </div><div class='del'>-                                   (local-&gt;op_errno != ESTALE) &amp;&amp;</div><div class='del'>-				   !(priv-&gt;optimist &amp;&amp; (op_errno == ENOENT))) {</div><div class='del'>-</div><div class='del'>-				gf_log (this-&gt;name, </div><div class='del'>-					(op_errno == ENOTCONN) ? </div><div class='del'>-					GF_LOG_DEBUG:GF_LOG_ERROR,</div><div class='del'>-					"child(%s): path(%s): %s", </div><div class='del'>-					priv-&gt;xl_array[(long)cookie]-&gt;name, </div><div class='del'>-					local-&gt;loc1.path, strerror (op_errno));</div><div class='del'>-				local-&gt;op_errno = op_errno;</div><div class='del'>-				local-&gt;failed = 1;</div><div class='del'>-			}</div><div class='del'>-		}</div><div class='del'>-</div><div class='del'>-		if (op_ret == 0) {</div><div class='del'>-			local-&gt;op_ret = 0; </div><div class='del'>-			</div><div class='del'>-			if (check_if_dht_linkfile(buf)) {</div><div class='del'>-				gf_log (this-&gt;name, GF_LOG_CRITICAL,</div><div class='del'>-					"file %s may be DHT link file on %s, "</div><div class='del'>-					"make sure the backend is not shared "</div><div class='del'>-					"between unify and DHT", </div><div class='del'>-					local-&gt;loc1.path, </div><div class='del'>-					priv-&gt;xl_array[(long)cookie]-&gt;name);</div><div class='del'>-			}</div><div class='del'>-</div><div class='del'>-			if (local-&gt;stbuf.ia_type &amp;&amp; local-&gt;stbuf.ia_blksize) {</div><div class='del'>-				/* make sure we already have a stbuf</div><div class='del'>-				   stored in local-&gt;stbuf */</div><div class='del'>-				if (IA_ISDIR (local-&gt;stbuf.ia_type) &amp;&amp; </div><div class='del'>-				    !IA_ISDIR (buf-&gt;ia_type)) {</div><div class='del'>-					gf_log (this-&gt;name, GF_LOG_CRITICAL, </div><div class='del'>-						"[CRITICAL] '%s' is directory "</div><div class='del'>-						"on namespace, non-directory "</div><div class='del'>-						"on node '%s', returning EIO",</div><div class='del'>-						local-&gt;loc1.path, </div><div class='del'>-						priv-&gt;xl_array[(long)cookie]-&gt;name);</div><div class='del'>-					local-&gt;return_eio = 1;</div><div class='del'>-				}</div><div class='del'>-				if (!IA_ISDIR (local-&gt;stbuf.ia_type) &amp;&amp; </div><div class='del'>-				    IA_ISDIR (buf-&gt;ia_type)) {</div><div class='del'>-					gf_log (this-&gt;name, GF_LOG_CRITICAL, </div><div class='del'>-						"[CRITICAL] '%s' is directory "</div><div class='del'>-						"on node '%s', non-directory "</div><div class='del'>-						"on namespace, returning EIO",</div><div class='del'>-						local-&gt;loc1.path, </div><div class='del'>-						priv-&gt;xl_array[(long)cookie]-&gt;name);</div><div class='del'>-					local-&gt;return_eio = 1;</div><div class='del'>-				}</div><div class='del'>-			}</div><div class='del'>-	</div><div class='del'>-			if (!local-&gt;revalidate &amp;&amp; !IA_ISDIR (buf-&gt;ia_type)) {</div><div class='del'>-				/* This is the first time lookup on file*/</div><div class='del'>-				if (!local-&gt;list) {</div><div class='del'>-					/* list is not allocated, allocate </div><div class='del'>-					   the max possible range */</div><div class='del'>-					local-&gt;list = GF_CALLOC (1, 2 * (priv-&gt;child_count + 2),</div><div class='del'>-                                                                 gf_unify_mt_int16_t);</div><div class='del'>-					if (!local-&gt;list) {</div><div class='del'>-						gf_log (this-&gt;name, </div><div class='del'>-							GF_LOG_CRITICAL, </div><div class='del'>-							"Not enough memory");</div><div class='del'>-						STACK_UNWIND (frame, -1, </div><div class='del'>-							      ENOMEM, inode, </div><div class='del'>-							      NULL, NULL, NULL);</div><div class='del'>-						return 0;</div><div class='del'>-					}</div><div class='del'>-				}</div><div class='del'>-				/* update the index of the list */</div><div class='del'>-				local-&gt;list [local-&gt;index++] = </div><div class='del'>-					(int16_t)(long)cookie;</div><div class='del'>-			}</div><div class='del'>-                        </div><div class='del'>-                        if (!local-&gt;revalidate &amp;&amp; IA_ISDIR (buf-&gt;ia_type)) {</div><div class='del'>-                                /* fresh lookup of a directory */</div><div class='del'>-                                inode_ctx_put (local-&gt;loc1.inode, this, </div><div class='del'>-                                               priv-&gt;inode_generation);</div><div class='del'>-                        }</div><div class='del'>-</div><div class='del'>-			if ((!local-&gt;dict) &amp;&amp; dict &amp;&amp;</div><div class='del'>-			    (priv-&gt;xl_array[(long)cookie] != NS(this)))	{</div><div class='del'>-				local-&gt;dict = dict_ref (dict);</div><div class='del'>-			}</div><div class='del'>-</div><div class='del'>-			/* index of NS node is == total child count */</div><div class='del'>-			if (priv-&gt;child_count == (int16_t)(long)cookie) {</div><div class='del'>-				/* Take the inode number from namespace */</div><div class='del'>-				local-&gt;ia_ino = buf-&gt;ia_ino;</div><div class='del'>-				if (IA_ISDIR (buf-&gt;ia_type) || </div><div class='del'>-				    !(local-&gt;stbuf.ia_blksize)) {</div><div class='del'>-					local-&gt;stbuf = *buf;</div><div class='del'>-                                        local-&gt;oldpostparent = *postparent;</div><div class='del'>-				}</div><div class='del'>-			} else if (!IA_ISDIR (buf-&gt;ia_type)) {</div><div class='del'>-				/* If file, then get the stat from </div><div class='del'>-				   storage node */</div><div class='del'>-				local-&gt;stbuf = *buf;</div><div class='del'>-			}</div><div class='del'>-</div><div class='del'>-			if (local-&gt;ia_nlink &lt; buf-&gt;ia_nlink) {</div><div class='del'>-				local-&gt;ia_nlink = buf-&gt;ia_nlink;</div><div class='del'>-			}</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='del'>-	UNLOCK (&amp;frame-&gt;lock);</div><div class='del'>-</div><div class='del'>-	if (!callcnt) {</div><div class='del'>-		local_dict = local-&gt;dict;</div><div class='del'>-		if (local-&gt;return_eio) {</div><div class='del'>-			gf_log (this-&gt;name, GF_LOG_CRITICAL, </div><div class='del'>-				"[CRITICAL] Unable to fix the path (%s) with "</div><div class='del'>-				"self-heal, try manual verification. "</div><div class='del'>-				"returning EIO.", local-&gt;loc1.path);</div><div class='del'>-			unify_local_wipe (local);</div><div class='del'>-			STACK_UNWIND (frame, -1, EIO, inode, NULL, NULL);</div><div class='del'>-			if (local_dict)	{</div><div class='del'>-				dict_unref (local_dict);</div><div class='del'>-			}</div><div class='del'>-			return 0;</div><div class='del'>-		}</div><div class='del'>-</div><div class='del'>-		if (!local-&gt;stbuf.ia_blksize) {</div><div class='del'>-			/* Inode not present */</div><div class='del'>-			local-&gt;op_ret = -1;</div><div class='del'>-		} else {</div><div class='del'>-			if (!local-&gt;revalidate &amp;&amp; </div><div class='del'>-			    !IA_ISDIR (local-&gt;stbuf.ia_type)) { </div><div class='del'>-				/* If its a file, big array is useless, </div><div class='del'>-				   allocate the smaller one */</div><div class='del'>-				int16_t *list = NULL;</div><div class='del'>-				list = GF_CALLOC (1, 2 * (local-&gt;index + 1),</div><div class='del'>-                                                  gf_unify_mt_int16_t);</div><div class='del'>-				ERR_ABORT (list);</div><div class='del'>-				memcpy (list, local-&gt;list, 2 * local-&gt;index);</div><div class='del'>-				/* Make the end of the list as -1 */</div><div class='del'>-				GF_FREE (local-&gt;list);</div><div class='del'>-				local-&gt;list = list;</div><div class='del'>-				local-&gt;list [local-&gt;index] = -1;</div><div class='del'>-				/* Update the inode's ctx with proper array */</div><div class='del'>-				/* TODO: log on failure */</div><div class='del'>-				inode_ctx_put (local-&gt;loc1.inode, this, </div><div class='del'>-					       (uint64_t)(long)local-&gt;list);</div><div class='del'>-			}</div><div class='del'>-</div><div class='del'>-			if (IA_ISDIR(local-&gt;loc1.inode-&gt;ia_type)) {</div><div class='del'>-				/* lookup is done for directory */</div><div class='del'>-				if (local-&gt;failed &amp;&amp; priv-&gt;self_heal) {</div><div class='del'>-					/* Triggering self-heal */</div><div class='del'>-                                        /* means, self-heal required for this </div><div class='del'>-					   inode */</div><div class='del'>-					local-&gt;inode_generation = 0; </div><div class='del'>-					priv-&gt;inode_generation++;</div><div class='del'>-				}</div><div class='del'>-			} else {</div><div class='del'>-				local-&gt;stbuf.ia_ino = local-&gt;ia_ino;</div><div class='del'>-			}</div><div class='del'>-	  </div><div class='del'>-			local-&gt;stbuf.ia_nlink = local-&gt;ia_nlink;</div><div class='del'>-		}</div><div class='del'>-		if (local-&gt;op_ret == -1) {</div><div class='del'>-			if (!local-&gt;revalidate &amp;&amp; local-&gt;list)</div><div class='del'>-				GF_FREE (local-&gt;list);</div><div class='del'>-		}</div><div class='del'>-</div><div class='del'>-		if ((local-&gt;op_ret &gt;= 0) &amp;&amp; local-&gt;failed &amp;&amp; </div><div class='del'>-		    local-&gt;revalidate) {</div><div class='del'>-			/* Done revalidate, but it failed */</div><div class='del'>-			if ((op_errno != ENOTCONN) </div><div class='del'>-                            &amp;&amp; (local-&gt;op_errno != ESTALE)) {</div><div class='del'>-				gf_log (this-&gt;name, GF_LOG_ERROR, </div><div class='del'>-					"Revalidate failed for path(%s): %s", </div><div class='del'>-					local-&gt;loc1.path, strerror (op_errno));</div><div class='del'>-			}</div><div class='del'>-			local-&gt;op_ret = -1;</div><div class='del'>-		}</div><div class='del'>-</div><div class='del'>-		if ((priv-&gt;self_heal &amp;&amp; !priv-&gt;optimist) &amp;&amp; </div><div class='del'>-		    (!local-&gt;revalidate &amp;&amp; (local-&gt;op_ret == 0) &amp;&amp; </div><div class='del'>-		     IA_ISDIR(local-&gt;stbuf.ia_type))) {</div><div class='del'>-			/* Let the self heal be done here */</div><div class='del'>-			zr_unify_self_heal (frame, this, local);</div><div class='del'>-			local_dict = NULL;</div><div class='del'>-		} else {</div><div class='del'>-                        if (local-&gt;failed) {</div><div class='del'>-                                /* NOTE: directory lookup is sent to all </div><div class='del'>-                                 * subvolumes and success from a subvolume</div><div class='del'>-                                 * might set local-&gt;op_ret to 0 (zero) */</div><div class='del'>-                                local-&gt;op_ret = -1;</div><div class='del'>-                        }</div><div class='del'>-</div><div class='del'>-			/* either no self heal, or op_ret == -1 (failure) */</div><div class='del'>-			tmp_inode = local-&gt;loc1.inode;</div><div class='del'>-			unify_local_wipe (local);</div><div class='del'>-			STACK_UNWIND (frame, local-&gt;op_ret, local-&gt;op_errno, </div><div class='del'>-				      tmp_inode, &amp;local-&gt;stbuf, local-&gt;dict,</div><div class='del'>-                                      &amp;local-&gt;oldpostparent);</div><div class='del'>-		}</div><div class='del'>-		if (local_dict) {</div><div class='del'>-			dict_unref (local_dict);</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='del'>-  </div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-/**</div><div class='del'>- * unify_lookup - </div><div class='del'>- */</div><div class='del'>-int32_t </div><div class='del'>-unify_lookup (call_frame_t *frame,</div><div class='del'>-	      xlator_t *this,</div><div class='del'>-	      loc_t *loc,</div><div class='del'>-	      dict_t *xattr_req)</div><div class='del'>-{</div><div class='del'>-	unify_local_t *local = NULL;</div><div class='del'>-	unify_private_t *priv = this-&gt;private;</div><div class='del'>-	int16_t *list = NULL;</div><div class='del'>-	long index = 0;</div><div class='del'>-</div><div class='del'>-	if (!(loc &amp;&amp; loc-&gt;inode)) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_ERROR, </div><div class='del'>-			"%s: Argument not right", loc?loc-&gt;path:"(null)");</div><div class='del'>-		STACK_UNWIND (frame, -1, EINVAL, NULL, NULL, NULL, NULL);</div><div class='del'>-		return 0;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	/* Initialization */</div><div class='del'>-	INIT_LOCAL (frame, local);</div><div class='del'>-	loc_copy (&amp;local-&gt;loc1, loc);</div><div class='del'>-	if (local-&gt;loc1.path == NULL) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_CRITICAL, "Not enough memory :O");</div><div class='del'>-		STACK_UNWIND (frame, -1, ENOMEM, loc-&gt;inode, NULL, NULL, NULL);</div><div class='del'>-		return 0;</div><div class='del'>-	}</div><div class='del'>-        </div><div class='del'>-        if (inode_ctx_get (loc-&gt;inode, this, NULL)</div><div class='del'>-            &amp;&amp; IA_ISDIR (loc-&gt;inode-&gt;ia_type)) {</div><div class='del'>-                local-&gt;revalidate = 1;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-	if (!inode_ctx_get (loc-&gt;inode, this, NULL) &amp;&amp; </div><div class='del'>-	    loc-&gt;inode-&gt;ia_type &amp;&amp; </div><div class='del'>-	    !IA_ISDIR (loc-&gt;inode-&gt;ia_type)) {</div><div class='del'>-		uint64_t tmp_list = 0;</div><div class='del'>-		/* check if revalidate or fresh lookup */</div><div class='del'>-		inode_ctx_get (loc-&gt;inode, this, &amp;tmp_list);</div><div class='del'>-		local-&gt;list = (int16_t *)(long)tmp_list;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	if (local-&gt;list) {</div><div class='del'>-		list = local-&gt;list;</div><div class='del'>-		for (index = 0; list[index] != -1; index++);</div><div class='del'>-		if (index != 2) {</div><div class='del'>-			if (index &lt; 2) {</div><div class='del'>-				gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-					"returning ESTALE for %s: file "</div><div class='del'>-					"count is %ld", loc-&gt;path, index);</div><div class='del'>-				/* Print where all the file is present */</div><div class='del'>-				for (index = 0; </div><div class='del'>-				     local-&gt;list[index] != -1; index++) {</div><div class='del'>-					gf_log (this-&gt;name, GF_LOG_ERROR, </div><div class='del'>-						"%s: found on %s", loc-&gt;path, </div><div class='del'>-						priv-&gt;xl_array[list[index]]-&gt;name);</div><div class='del'>-				}</div><div class='del'>-				unify_local_wipe (local);</div><div class='del'>-				STACK_UNWIND (frame, -1, ESTALE, </div><div class='del'>-					      NULL, NULL, NULL, NULL);</div><div class='del'>-				return 0;  </div><div class='del'>-			} else {</div><div class='del'>-				/* There are more than 2 presences */</div><div class='del'>-				/* Just log and continue */</div><div class='del'>-				gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-					"%s: file count is %ld", </div><div class='del'>-					loc-&gt;path, index);</div><div class='del'>-				/* Print where all the file is present */</div><div class='del'>-				for (index = 0; </div><div class='del'>-				     local-&gt;list[index] != -1; index++) {</div><div class='del'>-					gf_log (this-&gt;name, GF_LOG_ERROR, </div><div class='del'>-						"%s: found on %s", loc-&gt;path, </div><div class='del'>-						priv-&gt;xl_array[list[index]]-&gt;name);</div><div class='del'>-				}</div><div class='del'>-			}</div><div class='del'>-		}</div><div class='del'>-      </div><div class='del'>-		/* is revalidate */</div><div class='del'>-		local-&gt;revalidate = 1;</div><div class='del'>-      </div><div class='del'>-		for (index = 0; list[index] != -1; index++)</div><div class='del'>-			local-&gt;call_count++;</div><div class='del'>-      </div><div class='del'>-		for (index = 0; list[index] != -1; index++) {</div><div class='del'>-			char need_break = (list[index+1] == -1);</div><div class='del'>-			STACK_WIND_COOKIE (frame,</div><div class='del'>-					   unify_lookup_cbk,</div><div class='del'>-					   (void *)(long)list[index], //cookie</div><div class='del'>-					   priv-&gt;xl_array [list[index]],</div><div class='del'>-					   priv-&gt;xl_array [list[index]]-&gt;fops-&gt;lookup,</div><div class='del'>-					   loc,</div><div class='del'>-					   xattr_req);</div><div class='del'>-			if (need_break)</div><div class='del'>-				break;</div><div class='del'>-		}</div><div class='del'>-	} else {</div><div class='del'>-		if (loc-&gt;inode-&gt;ia_type) {</div><div class='del'>-			if (inode_ctx_get (loc-&gt;inode, this, NULL)) {</div><div class='del'>-				inode_ctx_get (loc-&gt;inode, this, </div><div class='del'>-					       &amp;local-&gt;inode_generation);</div><div class='del'>-			}</div><div class='del'>-		}</div><div class='del'>-		/* This is first call, there is no list */</div><div class='del'>-		/* call count should be all child + 1 namespace */</div><div class='del'>-		local-&gt;call_count = priv-&gt;child_count + 1;</div><div class='del'>-      </div><div class='del'>-		for (index = 0; index &lt;= priv-&gt;child_count; index++) {</div><div class='del'>-			STACK_WIND_COOKIE (frame,</div><div class='del'>-					   unify_lookup_cbk,</div><div class='del'>-					   (void *)index, //cookie</div><div class='del'>-					   priv-&gt;xl_array[index],</div><div class='del'>-					   priv-&gt;xl_array[index]-&gt;fops-&gt;lookup,</div><div class='del'>-					   loc,</div><div class='del'>-					   xattr_req);</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-/**</div><div class='del'>- * unify_stat - if directory, get the stat directly from NameSpace child.</div><div class='del'>- *     if file, check for a hint and send it only there (also to NS).</div><div class='del'>- *     if its a fresh stat, then do it on all the nodes.</div><div class='del'>- *</div><div class='del'>- * NOTE: for all the call, sending cookie as xlator pointer, which will be </div><div class='del'>- *       used in cbk.</div><div class='del'>- */</div><div class='del'>-int32_t</div><div class='del'>-unify_stat (call_frame_t *frame,</div><div class='del'>-	    xlator_t *this,</div><div class='del'>-	    loc_t *loc)</div><div class='del'>-{</div><div class='del'>-	unify_local_t *local = NULL;</div><div class='del'>-	unify_private_t *priv = this-&gt;private;</div><div class='del'>-	int16_t index = 0;</div><div class='del'>-	int16_t *list = NULL;</div><div class='del'>-	uint64_t tmp_list = 0;</div><div class='del'>-</div><div class='del'>-	UNIFY_CHECK_INODE_CTX_AND_UNWIND_ON_ERR (loc);</div><div class='del'>-</div><div class='del'>-	/* Initialization */</div><div class='del'>-	INIT_LOCAL (frame, local);</div><div class='del'>-	loc_copy (&amp;local-&gt;loc1, loc);</div><div class='del'>-	if (local-&gt;loc1.path == NULL) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_CRITICAL, "Not enough memory :O");</div><div class='del'>-		STACK_UNWIND (frame, -1, ENOMEM, NULL);</div><div class='del'>-		return 0;</div><div class='del'>-	}</div><div class='del'>-	local-&gt;ia_ino = loc-&gt;inode-&gt;ino;</div><div class='del'>-	if (IA_ISDIR (loc-&gt;inode-&gt;ia_type)) {</div><div class='del'>-		/* Directory */</div><div class='del'>-		local-&gt;call_count = 1;</div><div class='del'>-		STACK_WIND (frame, unify_buf_cbk, NS(this),</div><div class='del'>-			    NS(this)-&gt;fops-&gt;stat, loc);</div><div class='del'>-	} else {</div><div class='del'>-		/* File */</div><div class='del'>-		inode_ctx_get (loc-&gt;inode, this, &amp;tmp_list);</div><div class='del'>-    		list = (int16_t *)(long)tmp_list;</div><div class='del'>-</div><div class='del'>-		for (index = 0; list[index] != -1; index++)</div><div class='del'>-			local-&gt;call_count++;</div><div class='del'>-    </div><div class='del'>-		for (index = 0; list[index] != -1; index++) {</div><div class='del'>-			char need_break = (list[index+1] == -1);</div><div class='del'>-			STACK_WIND (frame,</div><div class='del'>-				    unify_buf_cbk,</div><div class='del'>-				    priv-&gt;xl_array[list[index]],</div><div class='del'>-				    priv-&gt;xl_array[list[index]]-&gt;fops-&gt;stat,</div><div class='del'>-				    loc);</div><div class='del'>-			if (need_break)</div><div class='del'>-				break;</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-/**</div><div class='del'>- * unify_access_cbk -</div><div class='del'>- */</div><div class='del'>-int32_t</div><div class='del'>-unify_access_cbk (call_frame_t *frame,</div><div class='del'>-		  void *cookie,</div><div class='del'>-		  xlator_t *this,</div><div class='del'>-		  int32_t op_ret,</div><div class='del'>-		  int32_t op_errno)</div><div class='del'>-{</div><div class='del'>-	STACK_UNWIND (frame, op_ret, op_errno);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-/**</div><div class='del'>- * unify_access - Send request to only namespace, which has all the </div><div class='del'>- *      attributes set for the file.</div><div class='del'>- */</div><div class='del'>-int32_t</div><div class='del'>-unify_access (call_frame_t *frame,</div><div class='del'>-	      xlator_t *this,</div><div class='del'>-	      loc_t *loc,</div><div class='del'>-	      int32_t mask)</div><div class='del'>-{</div><div class='del'>-	UNIFY_CHECK_INODE_CTX_AND_UNWIND_ON_ERR (loc);</div><div class='del'>-</div><div class='del'>-	STACK_WIND (frame,</div><div class='del'>-		    unify_access_cbk,</div><div class='del'>-		    NS(this),</div><div class='del'>-		    NS(this)-&gt;fops-&gt;access,</div><div class='del'>-		    loc,</div><div class='del'>-		    mask);</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-unify_mkdir_cbk (call_frame_t *frame,</div><div class='del'>-		 void *cookie,</div><div class='del'>-		 xlator_t *this,</div><div class='del'>-		 int32_t op_ret,</div><div class='del'>-		 int32_t op_errno,</div><div class='del'>-		 inode_t *inode,</div><div class='del'>-                 struct iatt *buf,</div><div class='del'>-                 struct iatt *preparent,</div><div class='del'>-                 struct iatt *postparent)</div><div class='del'>-{</div><div class='del'>-	int32_t callcnt = 0;</div><div class='del'>-	unify_private_t *priv = this-&gt;private;</div><div class='del'>-	unify_local_t *local = frame-&gt;local;</div><div class='del'>-	inode_t *tmp_inode = NULL;</div><div class='del'>-</div><div class='del'>-	LOCK (&amp;frame-&gt;lock);</div><div class='del'>-	{</div><div class='del'>-		callcnt = --local-&gt;call_count;</div><div class='del'>-  </div><div class='del'>-		if ((op_ret == -1) &amp;&amp; !(priv-&gt;optimist &amp;&amp; </div><div class='del'>-					(op_errno == ENOENT || </div><div class='del'>-					 op_errno == EEXIST))) {</div><div class='del'>-			/* TODO: Decrement the inode_generation of </div><div class='del'>-			 * this-&gt;inode's parent inode, hence the missing </div><div class='del'>-			 * directory is created properly by self-heal. </div><div class='del'>-			 * Currently, there is no way to get the parent </div><div class='del'>-			 * inode directly.</div><div class='del'>-			 */</div><div class='del'>-			gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-				"child(%s): path(%s): %s", </div><div class='del'>-				priv-&gt;xl_array[(long)cookie]-&gt;name, </div><div class='del'>-				local-&gt;loc1.path, strerror (op_errno));</div><div class='del'>-			if (op_errno != EEXIST)</div><div class='del'>-				local-&gt;failed = 1;</div><div class='del'>-			local-&gt;op_errno = op_errno;</div><div class='del'>-		}</div><div class='del'>-  </div><div class='del'>-		if (op_ret &gt;= 0)</div><div class='del'>-			local-&gt;op_ret = 0;</div><div class='del'>-</div><div class='del'>-	}</div><div class='del'>-	UNLOCK (&amp;frame-&gt;lock);</div><div class='del'>-  </div><div class='del'>-	if (!callcnt) {</div><div class='del'>-		if (!local-&gt;failed) {</div><div class='del'>-			inode_ctx_put (local-&gt;loc1.inode, this, </div><div class='del'>-				       priv-&gt;inode_generation);</div><div class='del'>-		}</div><div class='del'>-		</div><div class='del'>-		tmp_inode = local-&gt;loc1.inode;</div><div class='del'>-		unify_local_wipe (local);</div><div class='del'>-</div><div class='del'>-		STACK_UNWIND (frame, local-&gt;op_ret, local-&gt;op_errno, </div><div class='del'>-			      tmp_inode, &amp;local-&gt;stbuf,</div><div class='del'>-                              &amp;local-&gt;oldpreparent, &amp;local-&gt;oldpostparent);</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-/**</div><div class='del'>- * unify_ns_mkdir_cbk -</div><div class='del'>- */</div><div class='del'>-int32_t</div><div class='del'>-unify_ns_mkdir_cbk (call_frame_t *frame,</div><div class='del'>-		    void *cookie,</div><div class='del'>-		    xlator_t *this,</div><div class='del'>-		    int32_t op_ret,</div><div class='del'>-		    int32_t op_errno,</div><div class='del'>-		    inode_t *inode,</div><div class='del'>-                    struct iatt *buf,</div><div class='del'>-                    struct iatt *preparent,</div><div class='del'>-                    struct iatt *postparent)</div><div class='del'>-{</div><div class='del'>-	unify_private_t *priv = this-&gt;private;</div><div class='del'>-	unify_local_t *local = frame-&gt;local;</div><div class='del'>-	long index = 0;</div><div class='del'>-</div><div class='del'>-	if (op_ret == -1) {</div><div class='del'>-		/* No need to send mkdir request to other servers, </div><div class='del'>-		 * as namespace action failed </div><div class='del'>-		 */</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-			"namespace: path(%s): %s", </div><div class='del'>-			local-&gt;name, strerror (op_errno));</div><div class='del'>-		unify_local_wipe (local);</div><div class='del'>-		STACK_UNWIND (frame, op_ret, op_errno, inode, NULL,</div><div class='del'>-                              NULL, NULL);</div><div class='del'>-		return 0;</div><div class='del'>-	}</div><div class='del'>-  </div><div class='del'>-	/* Create one inode for this entry */</div><div class='del'>-	local-&gt;op_ret = 0;</div><div class='del'>-	local-&gt;stbuf = *buf;</div><div class='del'>-</div><div class='del'>-        local-&gt;oldpreparent = *preparent;</div><div class='del'>-        local-&gt;oldpostparent = *postparent;</div><div class='del'>-</div><div class='del'>-	local-&gt;call_count = priv-&gt;child_count;</div><div class='del'>-</div><div class='del'>-	/* Send mkdir request to all the nodes now */</div><div class='del'>-	for (index = 0; index &lt; priv-&gt;child_count; index++) {</div><div class='del'>-		STACK_WIND_COOKIE (frame,</div><div class='del'>-				   unify_mkdir_cbk,</div><div class='del'>-				   (void *)index, //cookie</div><div class='del'>-				   priv-&gt;xl_array[index],</div><div class='del'>-				   priv-&gt;xl_array[index]-&gt;fops-&gt;mkdir,</div><div class='del'>-				   &amp;local-&gt;loc1,</div><div class='del'>-				   local-&gt;mode);</div><div class='del'>-	}</div><div class='del'>-  </div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-/**</div><div class='del'>- * unify_mkdir -</div><div class='del'>- */</div><div class='del'>-int32_t</div><div class='del'>-unify_mkdir (call_frame_t *frame,</div><div class='del'>-	     xlator_t *this,</div><div class='del'>-	     loc_t *loc,</div><div class='del'>-	     mode_t mode)</div><div class='del'>-{</div><div class='del'>-	unify_local_t *local = NULL;</div><div class='del'>-</div><div class='del'>-	/* Initialization */</div><div class='del'>-	INIT_LOCAL (frame, local);</div><div class='del'>-	local-&gt;mode = mode;</div><div class='del'>-</div><div class='del'>-	loc_copy (&amp;local-&gt;loc1, loc);</div><div class='del'>-</div><div class='del'>-	if (local-&gt;loc1.path == NULL) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_CRITICAL, "Not enough memory :O");</div><div class='del'>-		STACK_UNWIND (frame, -1, ENOMEM, NULL, NULL);</div><div class='del'>-		return 0;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	STACK_WIND (frame,</div><div class='del'>-		    unify_ns_mkdir_cbk,</div><div class='del'>-		    NS(this),</div><div class='del'>-		    NS(this)-&gt;fops-&gt;mkdir,</div><div class='del'>-		    loc,</div><div class='del'>-		    mode);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-/**</div><div class='del'>- * unify_rmdir_cbk -</div><div class='del'>- */</div><div class='del'>-int32_t</div><div class='del'>-unify_rmdir_cbk (call_frame_t *frame,</div><div class='del'>-		 void *cookie,</div><div class='del'>-		 xlator_t *this,</div><div class='del'>-		 int32_t op_ret,</div><div class='del'>-		 int32_t op_errno,</div><div class='del'>-                 struct iatt *preparent,</div><div class='del'>-                 struct iatt *postparent)</div><div class='del'>-{</div><div class='del'>-	int32_t callcnt = 0;</div><div class='del'>-	unify_private_t *priv = this-&gt;private;</div><div class='del'>-	unify_local_t *local = frame-&gt;local;</div><div class='del'>-</div><div class='del'>-	LOCK (&amp;frame-&gt;lock);</div><div class='del'>-	{</div><div class='del'>-		callcnt = --local-&gt;call_count;</div><div class='del'>-		if (op_ret == 0 || (priv-&gt;optimist &amp;&amp; (op_errno == ENOENT)))</div><div class='del'>-			local-&gt;op_ret = 0;</div><div class='del'>-		if (op_ret == -1)</div><div class='del'>-			local-&gt;op_errno = op_errno;</div><div class='del'>-	}</div><div class='del'>-	UNLOCK (&amp;frame-&gt;lock);</div><div class='del'>-</div><div class='del'>-	if (!callcnt) {</div><div class='del'>-		unify_local_wipe (local);</div><div class='del'>-		STACK_UNWIND (frame, local-&gt;op_ret, local-&gt;op_errno,</div><div class='del'>-                              &amp;local-&gt;oldpreparent, &amp;local-&gt;oldpostparent);</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-/**</div><div class='del'>- * unify_ns_rmdir_cbk -</div><div class='del'>- */</div><div class='del'>-int32_t</div><div class='del'>-unify_ns_rmdir_cbk (call_frame_t *frame,</div><div class='del'>-		    void *cookie,</div><div class='del'>-		    xlator_t *this,</div><div class='del'>-		    int32_t op_ret,</div><div class='del'>-		    int32_t op_errno,</div><div class='del'>-                    struct iatt *preparent,</div><div class='del'>-                    struct iatt *postparent)</div><div class='del'>-{</div><div class='del'>-	int16_t index = 0;</div><div class='del'>-	unify_private_t *priv = this-&gt;private;</div><div class='del'>-	unify_local_t *local = frame-&gt;local;</div><div class='del'>-  </div><div class='del'>-	if (op_ret == -1) {</div><div class='del'>-		/* No need to send rmdir request to other servers, </div><div class='del'>-		 * as namespace action failed </div><div class='del'>-		 */</div><div class='del'>-		gf_log (this-&gt;name, </div><div class='del'>-			((op_errno != ENOTEMPTY) ? </div><div class='del'>-			 GF_LOG_ERROR : GF_LOG_DEBUG),</div><div class='del'>-			"namespace: path(%s): %s", </div><div class='del'>-			local-&gt;loc1.path, strerror (op_errno));</div><div class='del'>-		unify_local_wipe (local);</div><div class='del'>-		STACK_UNWIND (frame, op_ret, op_errno, NULL, NULL);</div><div class='del'>-		return 0;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	local-&gt;call_count = priv-&gt;child_count;</div><div class='del'>-</div><div class='del'>-        local-&gt;oldpreparent = *preparent;</div><div class='del'>-        local-&gt;oldpostparent = *postparent;</div><div class='del'>-</div><div class='del'>-	for (index = 0; index &lt; priv-&gt;child_count; index++) {</div><div class='del'>-		STACK_WIND (frame,</div><div class='del'>-			    unify_rmdir_cbk,</div><div class='del'>-			    priv-&gt;xl_array[index],</div><div class='del'>-			    priv-&gt;xl_array[index]-&gt;fops-&gt;rmdir,</div><div class='del'>-			    &amp;local-&gt;loc1);</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-/**</div><div class='del'>- * unify_rmdir -</div><div class='del'>- */</div><div class='del'>-int32_t</div><div class='del'>-unify_rmdir (call_frame_t *frame,</div><div class='del'>-	     xlator_t *this,</div><div class='del'>-	     loc_t *loc)</div><div class='del'>-{</div><div class='del'>-	unify_local_t *local = NULL;</div><div class='del'>-</div><div class='del'>-	UNIFY_CHECK_INODE_CTX_AND_UNWIND_ON_ERR (loc);</div><div class='del'>-</div><div class='del'>-	/* Initialization */</div><div class='del'>-	INIT_LOCAL (frame, local);</div><div class='del'>-</div><div class='del'>-	loc_copy (&amp;local-&gt;loc1, loc);</div><div class='del'>-	if (local-&gt;loc1.path == NULL) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_CRITICAL, "Not enough memory :O");</div><div class='del'>-		STACK_UNWIND (frame, -1, ENOMEM, NULL, NULL);</div><div class='del'>-		return 0;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	STACK_WIND (frame,</div><div class='del'>-		    unify_ns_rmdir_cbk,</div><div class='del'>-		    NS(this),</div><div class='del'>-		    NS(this)-&gt;fops-&gt;rmdir,</div><div class='del'>-		    loc);</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-/**</div><div class='del'>- * unify_open_cbk -</div><div class='del'>- */</div><div class='del'>-int32_t</div><div class='del'>-unify_open_cbk (call_frame_t *frame,</div><div class='del'>-		void *cookie,</div><div class='del'>-		xlator_t *this,</div><div class='del'>-		int32_t op_ret,</div><div class='del'>-		int32_t op_errno,</div><div class='del'>-		fd_t *fd)</div><div class='del'>-{</div><div class='del'>-	int32_t callcnt = 0;</div><div class='del'>-	unify_local_t *local = frame-&gt;local;</div><div class='del'>-</div><div class='del'>-	LOCK (&amp;frame-&gt;lock);</div><div class='del'>-	{</div><div class='del'>-		if (op_ret &gt;= 0) {</div><div class='del'>-			local-&gt;op_ret = op_ret;</div><div class='del'>-			if (NS(this) != (xlator_t *)cookie) {</div><div class='del'>-				/* Store child node's ptr, used in </div><div class='del'>-				   all the f*** / FileIO calls */</div><div class='del'>-				fd_ctx_set (fd, this, (uint64_t)(long)cookie);</div><div class='del'>-			}</div><div class='del'>-		}</div><div class='del'>-		if (op_ret == -1) {</div><div class='del'>-			local-&gt;op_errno = op_errno;</div><div class='del'>-			local-&gt;failed = 1;</div><div class='del'>-		}</div><div class='del'>-		callcnt = --local-&gt;call_count;</div><div class='del'>-	}</div><div class='del'>-	UNLOCK (&amp;frame-&gt;lock);</div><div class='del'>-  </div><div class='del'>-	if (!callcnt) {</div><div class='del'>-		if ((local-&gt;failed == 1) &amp;&amp; (local-&gt;op_ret &gt;= 0)) {</div><div class='del'>-			local-&gt;call_count = 1;</div><div class='del'>-			/* return -1 to user */</div><div class='del'>-			local-&gt;op_ret = -1;</div><div class='del'>-			//local-&gt;op_errno = EIO; </div><div class='del'>-      </div><div class='del'>-			if (!fd_ctx_get (local-&gt;fd, this, NULL)) {</div><div class='del'>-				gf_log (this-&gt;name, GF_LOG_ERROR, </div><div class='del'>-					"Open success on child node, "</div><div class='del'>-					"failed on namespace");</div><div class='del'>-			} else {</div><div class='del'>-				gf_log (this-&gt;name, GF_LOG_ERROR, </div><div class='del'>-					"Open success on namespace, "</div><div class='del'>-					"failed on child node");</div><div class='del'>-			}</div><div class='del'>-		}</div><div class='del'>-</div><div class='del'>-		unify_local_wipe (local);</div><div class='del'>-		STACK_UNWIND (frame, local-&gt;op_ret, </div><div class='del'>-			      local-&gt;op_errno, local-&gt;fd);</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-#ifdef GF_DARWIN_HOST_OS</div><div class='del'>-/**</div><div class='del'>- * unify_create_lookup_cbk - </div><div class='del'>- */</div><div class='del'>-int32_t </div><div class='del'>-unify_open_lookup_cbk (call_frame_t *frame,</div><div class='del'>-		       void *cookie,</div><div class='del'>-		       xlator_t *this,</div><div class='del'>-		       int32_t op_ret,</div><div class='del'>-		       int32_t op_errno,</div><div class='del'>-		       inode_t *inode,</div><div class='del'>-		       struct iatt *buf,</div><div class='del'>-		       dict_t *dict,</div><div class='del'>-		       struct iatt *postparent)</div><div class='del'>-{</div><div class='del'>-	int32_t callcnt = 0;</div><div class='del'>-	int16_t index = 0;</div><div class='del'>-	unify_private_t *priv = this-&gt;private;</div><div class='del'>-	unify_local_t *local = frame-&gt;local;</div><div class='del'>-</div><div class='del'>-	LOCK (&amp;frame-&gt;lock);</div><div class='del'>-	{</div><div class='del'>-		callcnt = --local-&gt;call_count;</div><div class='del'>-		if ((op_ret == -1) &amp;&amp; (op_errno != ENOENT)) {</div><div class='del'>-			gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-				"child(%s): path(%s): %s", </div><div class='del'>-				priv-&gt;xl_array[(long)cookie]-&gt;name, </div><div class='del'>-				local-&gt;loc1.path, strerror (op_errno));</div><div class='del'>-			local-&gt;op_errno = op_errno;</div><div class='del'>-		}</div><div class='del'>-    </div><div class='del'>-		if (op_ret &gt;= 0) {</div><div class='del'>-			local-&gt;op_ret = op_ret; </div><div class='del'>-			local-&gt;index++;</div><div class='del'>-			if (NS(this) == priv-&gt;xl_array[(long)cookie]) {</div><div class='del'>-				local-&gt;list[0] = (int16_t)(long)cookie;</div><div class='del'>-			} else {</div><div class='del'>-				local-&gt;list[1] = (int16_t)(long)cookie;</div><div class='del'>-			}</div><div class='del'>-			if (IA_ISDIR (buf-&gt;ia_type))</div><div class='del'>-				local-&gt;failed = 1;</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='del'>-	UNLOCK (&amp;frame-&gt;lock);</div><div class='del'>-</div><div class='del'>-	if (!callcnt) {</div><div class='del'>-		int16_t file_list[3] = {0,};</div><div class='del'>-		local-&gt;op_ret = -1;</div><div class='del'>-</div><div class='del'>-		file_list[0] = local-&gt;list[0];</div><div class='del'>-		file_list[1] = local-&gt;list[1];</div><div class='del'>-		file_list[2] = -1;</div><div class='del'>-</div><div class='del'>-		if (local-&gt;index != 2) {</div><div class='del'>-			/* Lookup failed, can't do open */</div><div class='del'>-			gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-				"%s: present on %d nodes", </div><div class='del'>-				local-&gt;name, local-&gt;index);</div><div class='del'>-</div><div class='del'>-			if (local-&gt;index &lt; 2) {</div><div class='del'>-				unify_local_wipe (local);</div><div class='del'>-				gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-					"returning as file found on less "</div><div class='del'>-					"than 2 nodes");</div><div class='del'>-				STACK_UNWIND (frame, local-&gt;op_ret, </div><div class='del'>-					      local-&gt;op_errno, local-&gt;fd);</div><div class='del'>-				return 0;</div><div class='del'>-			}</div><div class='del'>-		}</div><div class='del'>-</div><div class='del'>-		if (local-&gt;failed) {</div><div class='del'>-			/* Open on directory, return EISDIR */</div><div class='del'>-			unify_local_wipe (local);</div><div class='del'>-			STACK_UNWIND (frame, -1, EISDIR, local-&gt;fd);</div><div class='del'>-			return 0;</div><div class='del'>-		}</div><div class='del'>-</div><div class='del'>-		/* Everything is perfect :) */    </div><div class='del'>-		local-&gt;call_count = 2;</div><div class='del'>-    </div><div class='del'>-		for (index = 0; file_list[index] != -1; index++) {</div><div class='del'>-			char need_break = (file_list[index+1] == -1);</div><div class='del'>-			STACK_WIND_COOKIE (frame,</div><div class='del'>-					   unify_open_cbk,</div><div class='del'>-					   priv-&gt;xl_array[file_list[index]],</div><div class='del'>-					   priv-&gt;xl_array[file_list[index]],</div><div class='del'>-					   priv-&gt;xl_array[file_list[index]]-&gt;fops-&gt;open,</div><div class='del'>-					   &amp;local-&gt;loc1,</div><div class='del'>-					   local-&gt;flags,</div><div class='del'>-					   local-&gt;fd, local-&gt;wbflags);</div><div class='del'>-			if (need_break)</div><div class='del'>-				break;</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-unify_open_readlink_cbk (call_frame_t *frame,</div><div class='del'>-			 void *cookie,</div><div class='del'>-			 xlator_t *this,</div><div class='del'>-			 int32_t op_ret,</div><div class='del'>-			 int32_t op_errno,</div><div class='del'>-			 const char *path,</div><div class='del'>-			 struct iatt *sbuf)</div><div class='del'>-{</div><div class='del'>-	int16_t index = 0;</div><div class='del'>-	unify_private_t *priv = this-&gt;private;</div><div class='del'>-	unify_local_t *local = frame-&gt;local;</div><div class='del'>-</div><div class='del'>-	if (op_ret == -1) {</div><div class='del'>-		STACK_UNWIND (frame, -1, ENOENT);</div><div class='del'>-		return 0;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	if (path[0] == '/') {</div><div class='del'>-		local-&gt;name = gf_strdup (path);</div><div class='del'>-		ERR_ABORT (local-&gt;name);</div><div class='del'>-	} else {</div><div class='del'>-		char *tmp_str = gf_strdup (local-&gt;loc1.path);</div><div class='del'>-		char *tmp_base = dirname (tmp_str);</div><div class='del'>-		local-&gt;name = GF_CALLOC (1, ZR_PATH_MAX, gf_unify_mt_char);</div><div class='del'>-		strcpy (local-&gt;name, tmp_base);</div><div class='del'>-		strncat (local-&gt;name, "/", 1);</div><div class='del'>-		strcat (local-&gt;name, path);</div><div class='del'>-		GF_FREE (tmp_str);</div><div class='del'>-	}</div><div class='del'>-  </div><div class='del'>-	local-&gt;list = GF_CALLOC (1, sizeof (int16_t) * 3,</div><div class='del'>-                                 gf_unify_mt_int16_t);</div><div class='del'>-	ERR_ABORT (local-&gt;list);</div><div class='del'>-	local-&gt;call_count = priv-&gt;child_count + 1;</div><div class='del'>-	local-&gt;op_ret = -1;</div><div class='del'>-	for (index = 0; index &lt;= priv-&gt;child_count; index++) {</div><div class='del'>-		/* Send the lookup to all the nodes including namespace */</div><div class='del'>-		STACK_WIND_COOKIE (frame,</div><div class='del'>-				   unify_open_lookup_cbk,</div><div class='del'>-				   (void *)(long)index,</div><div class='del'>-				   priv-&gt;xl_array[index],</div><div class='del'>-				   priv-&gt;xl_array[index]-&gt;fops-&gt;lookup,</div><div class='del'>-				   &amp;local-&gt;loc1,</div><div class='del'>-				   NULL);</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-#endif /* GF_DARWIN_HOST_OS */</div><div class='del'>-</div><div class='del'>-/**</div><div class='del'>- * unify_open - </div><div class='del'>- */</div><div class='del'>-int32_t</div><div class='del'>-unify_open (call_frame_t *frame,</div><div class='del'>-	    xlator_t *this,</div><div class='del'>-	    loc_t *loc,</div><div class='del'>-	    int32_t flags,</div><div class='del'>-	    fd_t *fd,</div><div class='del'>-            int32_t wbflags)</div><div class='del'>-{</div><div class='del'>-	unify_private_t *priv = this-&gt;private;</div><div class='del'>-	unify_local_t *local = NULL;</div><div class='del'>-	int16_t *list = NULL;</div><div class='del'>-	int16_t index = 0;</div><div class='del'>-	int16_t file_list[3] = {0,};</div><div class='del'>-	uint64_t tmp_list = 0;</div><div class='del'>-</div><div class='del'>-	UNIFY_CHECK_INODE_CTX_AND_UNWIND_ON_ERR (loc);</div><div class='del'>-</div><div class='del'>-	/* Init */</div><div class='del'>-	INIT_LOCAL (frame, local);</div><div class='del'>-	loc_copy (&amp;local-&gt;loc1, loc);</div><div class='del'>-	local-&gt;fd    = fd;</div><div class='del'>-	local-&gt;flags = flags;</div><div class='del'>-        local-&gt;wbflags = wbflags;</div><div class='del'>-	inode_ctx_get (loc-&gt;inode, this, &amp;tmp_list);</div><div class='del'>-	list = (int16_t *)(long)tmp_list;</div><div class='del'>-</div><div class='del'>-	local-&gt;list = list;</div><div class='del'>-	file_list[0] = priv-&gt;child_count; /* Thats namespace */</div><div class='del'>-	file_list[2] = -1;</div><div class='del'>-	for (index = 0; list[index] != -1; index++) {</div><div class='del'>-		local-&gt;call_count++;</div><div class='del'>-		if (list[index] != priv-&gt;child_count)</div><div class='del'>-			file_list[1] = list[index];</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	if (local-&gt;call_count != 2) {</div><div class='del'>-		/* If the lookup was done for file */</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-			"%s: entry_count is %d",</div><div class='del'>-			loc-&gt;path, local-&gt;call_count);</div><div class='del'>-		for (index = 0; local-&gt;list[index] != -1; index++)</div><div class='del'>-			gf_log (this-&gt;name, GF_LOG_ERROR, "%s: found on %s",</div><div class='del'>-				loc-&gt;path, priv-&gt;xl_array[list[index]]-&gt;name);</div><div class='del'>-</div><div class='del'>-		if (local-&gt;call_count &lt; 2) {</div><div class='del'>-			gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-				"returning EIO as file found on onlyone node");</div><div class='del'>-			STACK_UNWIND (frame, -1, EIO, fd);</div><div class='del'>-			return 0;</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-#ifdef GF_DARWIN_HOST_OS</div><div class='del'>-	/* Handle symlink here */</div><div class='del'>-	if (IA_ISLNK (loc-&gt;inode-&gt;ia_type)) {</div><div class='del'>-		/* Callcount doesn't matter here */</div><div class='del'>-		STACK_WIND (frame,</div><div class='del'>-			    unify_open_readlink_cbk,</div><div class='del'>-			    NS(this),</div><div class='del'>-			    NS(this)-&gt;fops-&gt;readlink,</div><div class='del'>-			    loc, ZR_PATH_MAX);</div><div class='del'>-		return 0;</div><div class='del'>-	}</div><div class='del'>-#endif /* GF_DARWIN_HOST_OS */</div><div class='del'>-</div><div class='del'>-	local-&gt;call_count = 2;</div><div class='del'>-	for (index = 0; file_list[index] != -1; index++) {</div><div class='del'>-		char need_break = (file_list[index+1] == -1);</div><div class='del'>-		STACK_WIND_COOKIE (frame,</div><div class='del'>-				   unify_open_cbk,</div><div class='del'>-				   priv-&gt;xl_array[file_list[index]], //cookie</div><div class='del'>-				   priv-&gt;xl_array[file_list[index]],</div><div class='del'>-				   priv-&gt;xl_array[file_list[index]]-&gt;fops-&gt;open,</div><div class='del'>-				   loc,</div><div class='del'>-				   flags,</div><div class='del'>-				   fd, wbflags);</div><div class='del'>-		if (need_break)</div><div class='del'>-			break;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int32_t </div><div class='del'>-unify_create_unlink_cbk (call_frame_t *frame,</div><div class='del'>-			 void *cookie,</div><div class='del'>-			 xlator_t *this,</div><div class='del'>-			 int32_t op_ret,</div><div class='del'>-			 int32_t op_errno,</div><div class='del'>-                         struct iatt *preparent,</div><div class='del'>-                         struct iatt *postparent)</div><div class='del'>-{</div><div class='del'>-	unify_local_t *local = frame-&gt;local;</div><div class='del'>-	inode_t *inode = local-&gt;loc1.inode;</div><div class='del'>-</div><div class='del'>-	unify_local_wipe (local);</div><div class='del'>-</div><div class='del'>-	STACK_UNWIND (frame, local-&gt;op_ret, local-&gt;op_errno, local-&gt;fd, </div><div class='del'>-		      inode, &amp;local-&gt;stbuf,</div><div class='del'>-                      &amp;local-&gt;oldpreparent, &amp;local-&gt;oldpostparent);</div><div class='del'>-  </div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-/**</div><div class='del'>- * unify_create_open_cbk -</div><div class='del'>- */</div><div class='del'>-int32_t</div><div class='del'>-unify_create_open_cbk (call_frame_t *frame,</div><div class='del'>-		       void *cookie,</div><div class='del'>-		       xlator_t *this,</div><div class='del'>-		       int32_t op_ret,</div><div class='del'>-		       int32_t op_errno,</div><div class='del'>-		       fd_t *fd)</div><div class='del'>-{</div><div class='del'>-	int ret = 0;</div><div class='del'>-	int32_t callcnt = 0;</div><div class='del'>-	unify_local_t *local = frame-&gt;local;</div><div class='del'>-	inode_t *inode = NULL;</div><div class='del'>-	xlator_t *child = NULL;</div><div class='del'>-	uint64_t tmp_value = 0;</div><div class='del'>-</div><div class='del'>-	LOCK (&amp;frame-&gt;lock);</div><div class='del'>-	{</div><div class='del'>-		if (op_ret &gt;= 0) {</div><div class='del'>-			local-&gt;op_ret = op_ret;</div><div class='del'>-			if (NS(this) != (xlator_t *)cookie) {</div><div class='del'>-				/* Store child node's ptr, used in all </div><div class='del'>-				   the f*** / FileIO calls */</div><div class='del'>-				/* TODO: log on failure */</div><div class='del'>-				ret = fd_ctx_get (fd, this, &amp;tmp_value);</div><div class='del'>-				cookie = (void *)(long)tmp_value;</div><div class='del'>-			} else {</div><div class='del'>-				/* NOTE: open successful on namespace.</div><div class='del'>-				 *       fd's ctx can be used to identify open </div><div class='del'>-				 *       failure on storage subvolume. cool </div><div class='del'>-				 *       ide ;) */</div><div class='del'>-				local-&gt;failed = 0;</div><div class='del'>-			}</div><div class='del'>-		} else {</div><div class='del'>-			gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-				"child(%s): path(%s): %s", </div><div class='del'>-				((xlator_t *)cookie)-&gt;name,</div><div class='del'>-				local-&gt;loc1.path, strerror (op_errno));</div><div class='del'>-			local-&gt;op_errno = op_errno;</div><div class='del'>-			local-&gt;failed = 1;</div><div class='del'>-		}</div><div class='del'>-		callcnt = --local-&gt;call_count;</div><div class='del'>-	}</div><div class='del'>-	UNLOCK (&amp;frame-&gt;lock);</div><div class='del'>-  </div><div class='del'>-	if (!callcnt) {</div><div class='del'>-		if (local-&gt;failed == 1 &amp;&amp; (local-&gt;op_ret &gt;= 0)) {</div><div class='del'>-			local-&gt;call_count = 1;</div><div class='del'>-			/* return -1 to user */</div><div class='del'>-			local-&gt;op_ret = -1;</div><div class='del'>-			local-&gt;op_errno = EIO;</div><div class='del'>-			local-&gt;fd = fd;</div><div class='del'>-			local-&gt;call_count = 1;</div><div class='del'>-</div><div class='del'>-			if (!fd_ctx_get (local-&gt;fd, this, &amp;tmp_value)) {</div><div class='del'>-				child = (xlator_t *)(long)tmp_value;</div><div class='del'>-</div><div class='del'>-				gf_log (this-&gt;name, GF_LOG_ERROR, </div><div class='del'>-					"Create success on child node, "</div><div class='del'>-					"failed on namespace");</div><div class='del'>-</div><div class='del'>-				STACK_WIND (frame,</div><div class='del'>-					    unify_create_unlink_cbk,</div><div class='del'>-					    child,</div><div class='del'>-					    child-&gt;fops-&gt;unlink,</div><div class='del'>-					    &amp;local-&gt;loc1);</div><div class='del'>-			} else {</div><div class='del'>-				gf_log (this-&gt;name, GF_LOG_ERROR, </div><div class='del'>-					"Create success on namespace, "</div><div class='del'>-					"failed on child node");</div><div class='del'>-</div><div class='del'>-				STACK_WIND (frame,</div><div class='del'>-					    unify_create_unlink_cbk,</div><div class='del'>-					    NS(this),</div><div class='del'>-					    NS(this)-&gt;fops-&gt;unlink,</div><div class='del'>-					    &amp;local-&gt;loc1);</div><div class='del'>-			}</div><div class='del'>-			return 0;</div><div class='del'>-		}</div><div class='del'>-		inode = local-&gt;loc1.inode;</div><div class='del'>-		unify_local_wipe (local);</div><div class='del'>-		STACK_UNWIND (frame, local-&gt;op_ret, local-&gt;op_errno, fd,</div><div class='del'>-			      inode, &amp;local-&gt;stbuf,</div><div class='del'>-                              &amp;local-&gt;oldpreparent, &amp;local-&gt;oldpostparent);</div><div class='del'>-	}</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-/**</div><div class='del'>- * unify_create_lookup_cbk - </div><div class='del'>- */</div><div class='del'>-int32_t </div><div class='del'>-unify_create_lookup_cbk (call_frame_t *frame,</div><div class='del'>-			 void *cookie,</div><div class='del'>-			 xlator_t *this,</div><div class='del'>-			 int32_t op_ret,</div><div class='del'>-			 int32_t op_errno,</div><div class='del'>-			 inode_t *inode,</div><div class='del'>-			 struct iatt *buf,</div><div class='del'>-			 dict_t *dict,</div><div class='del'>-                         struct iatt *postparent)</div><div class='del'>-{</div><div class='del'>-	int32_t callcnt = 0;</div><div class='del'>-	int16_t index = 0;</div><div class='del'>-	unify_private_t *priv = this-&gt;private;</div><div class='del'>-	unify_local_t *local = frame-&gt;local;</div><div class='del'>-</div><div class='del'>-	LOCK (&amp;frame-&gt;lock);</div><div class='del'>-	{</div><div class='del'>-		callcnt = --local-&gt;call_count;</div><div class='del'>-		if (op_ret == -1) {</div><div class='del'>-			gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-				"child(%s): path(%s): %s", </div><div class='del'>-				priv-&gt;xl_array[(long)cookie]-&gt;name, </div><div class='del'>-				local-&gt;loc1.path, strerror (op_errno));</div><div class='del'>-			local-&gt;op_errno = op_errno;</div><div class='del'>-			local-&gt;failed = 1;</div><div class='del'>-		}</div><div class='del'>-</div><div class='del'>-		if (op_ret &gt;= 0) {</div><div class='del'>-			local-&gt;op_ret = op_ret; </div><div class='del'>-			local-&gt;list[local-&gt;index++] = (int16_t)(long)cookie;</div><div class='del'>-			if (NS(this) == priv-&gt;xl_array[(long)cookie]) {</div><div class='del'>-				local-&gt;ia_ino = buf-&gt;ia_ino;</div><div class='del'>-			} else {</div><div class='del'>-				local-&gt;stbuf = *buf;</div><div class='del'>-			}</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='del'>-	UNLOCK (&amp;frame-&gt;lock);</div><div class='del'>-</div><div class='del'>-	if (!callcnt) {</div><div class='del'>-		int16_t *list = local-&gt;list;</div><div class='del'>-		int16_t file_list[3] = {0,};</div><div class='del'>-		local-&gt;op_ret = -1;</div><div class='del'>-</div><div class='del'>-		local-&gt;list [local-&gt;index] = -1;</div><div class='del'>-		file_list[0] = list[0];</div><div class='del'>-		file_list[1] = list[1];</div><div class='del'>-		file_list[2] = -1;</div><div class='del'>-</div><div class='del'>-		local-&gt;stbuf.ia_ino = local-&gt;ia_ino;</div><div class='del'>-		/* TODO: log on failure */</div><div class='del'>-		inode_ctx_put (local-&gt;loc1.inode, this, </div><div class='del'>-			       (uint64_t)(long)local-&gt;list);</div><div class='del'>-</div><div class='del'>-		if (local-&gt;index != 2) {</div><div class='del'>-			/* Lookup failed, can't do open */</div><div class='del'>-			gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-				"%s: present on %d nodes", </div><div class='del'>-				local-&gt;loc1.path, local-&gt;index);</div><div class='del'>-			file_list[0] = priv-&gt;child_count;</div><div class='del'>-			for (index = 0; list[index] != -1; index++) {</div><div class='del'>-				gf_log (this-&gt;name, GF_LOG_ERROR, </div><div class='del'>-					"%s: found on %s", local-&gt;loc1.path, </div><div class='del'>-					priv-&gt;xl_array[list[index]]-&gt;name);</div><div class='del'>-				if (list[index] != priv-&gt;child_count)</div><div class='del'>-					file_list[1] = list[index];</div><div class='del'>-			}</div><div class='del'>-</div><div class='del'>-			if (local-&gt;index &lt; 2) {</div><div class='del'>-				unify_local_wipe (local);</div><div class='del'>-				gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-					"returning EIO as file found on "</div><div class='del'>-					"only one node");</div><div class='del'>-				STACK_UNWIND (frame, -1, EIO, </div><div class='del'>-					      local-&gt;fd, inode, NULL,</div><div class='del'>-                                              NULL, NULL);</div><div class='del'>-				return 0;</div><div class='del'>-			}</div><div class='del'>-		}</div><div class='del'>-		/* Everything is perfect :) */    </div><div class='del'>-		local-&gt;call_count = 2;</div><div class='del'>-    </div><div class='del'>-		for (index = 0; file_list[index] != -1; index++) {</div><div class='del'>-			char need_break = (file_list[index+1] == -1);</div><div class='del'>-			STACK_WIND_COOKIE (frame,</div><div class='del'>-					   unify_create_open_cbk,</div><div class='del'>-					   priv-&gt;xl_array[file_list[index]],</div><div class='del'>-					   priv-&gt;xl_array[file_list[index]],</div><div class='del'>-					   priv-&gt;xl_array[file_list[index]]-&gt;fops-&gt;open,</div><div class='del'>-					   &amp;local-&gt;loc1,</div><div class='del'>-					   local-&gt;flags,</div><div class='del'>-					   local-&gt;fd, 0);</div><div class='del'>-			if (need_break)</div><div class='del'>-				break;</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-/**</div><div class='del'>- * unify_create_cbk -</div><div class='del'>- */</div><div class='del'>-int32_t</div><div class='del'>-unify_create_cbk (call_frame_t *frame,</div><div class='del'>-		  void *cookie,</div><div class='del'>-		  xlator_t *this,</div><div class='del'>-		  int32_t op_ret,</div><div class='del'>-		  int32_t op_errno,</div><div class='del'>-		  fd_t *fd,</div><div class='del'>-		  inode_t *inode,</div><div class='del'>-		  struct iatt *buf,</div><div class='del'>-                  struct iatt *preparent,</div><div class='del'>-                  struct iatt *postparent)</div><div class='del'>-{</div><div class='del'>-	int ret = 0;</div><div class='del'>-	unify_local_t *local = frame-&gt;local;</div><div class='del'>-	call_frame_t *prev_frame = cookie;</div><div class='del'>-	inode_t *tmp_inode = NULL;</div><div class='del'>-</div><div class='del'>-	if (op_ret == -1) {</div><div class='del'>-		/* send unlink () on Namespace */</div><div class='del'>-		local-&gt;op_errno = op_errno;</div><div class='del'>-		local-&gt;op_ret = -1;</div><div class='del'>-		local-&gt;call_count = 1;</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-			"create failed on %s (file %s, error %s), "</div><div class='del'>-			"sending unlink to namespace", </div><div class='del'>-			prev_frame-&gt;this-&gt;name, </div><div class='del'>-			local-&gt;loc1.path, strerror (op_errno));</div><div class='del'>-</div><div class='del'>-		STACK_WIND (frame,</div><div class='del'>-			    unify_create_unlink_cbk,</div><div class='del'>-			    NS(this),</div><div class='del'>-			    NS(this)-&gt;fops-&gt;unlink,</div><div class='del'>-			    &amp;local-&gt;loc1);</div><div class='del'>-</div><div class='del'>-		return 0;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	if (op_ret &gt;= 0) {</div><div class='del'>-		local-&gt;op_ret = op_ret;</div><div class='del'>-		local-&gt;stbuf = *buf;</div><div class='del'>-		/* Just inode number should be from NS node */</div><div class='del'>-		local-&gt;stbuf.ia_ino = local-&gt;ia_ino;</div><div class='del'>-</div><div class='del'>-		/* TODO: log on failure */</div><div class='del'>-		ret = fd_ctx_set (fd, this, (uint64_t)(long)prev_frame-&gt;this);</div><div class='del'>-	}</div><div class='del'>-  </div><div class='del'>-	tmp_inode = local-&gt;loc1.inode;</div><div class='del'>-	unify_local_wipe (local);</div><div class='del'>-	STACK_UNWIND (frame, local-&gt;op_ret, local-&gt;op_errno, local-&gt;fd, </div><div class='del'>-		      tmp_inode, &amp;local-&gt;stbuf,</div><div class='del'>-                      &amp;local-&gt;oldpreparent, &amp;local-&gt;oldpostparent);</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-/**</div><div class='del'>- * unify_ns_create_cbk -</div><div class='del'>- * </div><div class='del'>- */</div><div class='del'>-int32_t</div><div class='del'>-unify_ns_create_cbk (call_frame_t *frame,</div><div class='del'>-		     void *cookie,</div><div class='del'>-		     xlator_t *this,</div><div class='del'>-		     int32_t op_ret,</div><div class='del'>-		     int32_t op_errno,</div><div class='del'>-		     fd_t *fd,</div><div class='del'>-		     inode_t *inode,</div><div class='del'>-		     struct iatt *buf,</div><div class='del'>-                     struct iatt *preparent,</div><div class='del'>-                     struct iatt *postparent)</div><div class='del'>-{</div><div class='del'>-	struct sched_ops *sched_ops = NULL;</div><div class='del'>-	xlator_t *sched_xl = NULL;</div><div class='del'>-	unify_local_t *local = frame-&gt;local;</div><div class='del'>-	unify_private_t *priv = this-&gt;private;</div><div class='del'>-	int16_t *list = NULL;</div><div class='del'>-	int16_t index = 0;</div><div class='del'>-</div><div class='del'>-	if (op_ret == -1) {</div><div class='del'>-		/* No need to send create request to other servers, as </div><div class='del'>-		   namespace action failed. Handle exclusive create here. */</div><div class='del'>-		if ((op_errno != EEXIST) || </div><div class='del'>-		    ((op_errno == EEXIST) &amp;&amp; </div><div class='del'>-		     ((local-&gt;flags &amp; O_EXCL) == O_EXCL))) {</div><div class='del'>-			/* If its just a create call without O_EXCL, </div><div class='del'>-			   don't do this */</div><div class='del'>-			gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-				"namespace: path(%s): %s", </div><div class='del'>-				local-&gt;loc1.path, strerror (op_errno));</div><div class='del'>-			unify_local_wipe (local);</div><div class='del'>-			STACK_UNWIND (frame, op_ret, op_errno, fd, inode, buf,</div><div class='del'>-                                      preparent, postparent);</div><div class='del'>-			return 0;</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='del'>-  </div><div class='del'>-	if (op_ret &gt;= 0) {</div><div class='del'>-		/* Get the inode number from the NS node */</div><div class='del'>-		local-&gt;ia_ino = buf-&gt;ia_ino;</div><div class='del'>-  </div><div class='del'>-                local-&gt;oldpreparent = *preparent;</div><div class='del'>-                local-&gt;oldpostparent = *postparent;</div><div class='del'>-</div><div class='del'>-		local-&gt;op_ret = -1;</div><div class='del'>-</div><div class='del'>-		/* Start the mapping list */</div><div class='del'>-		list = GF_CALLOC (1, sizeof (int16_t) * 3,</div><div class='del'>-                                  gf_unify_mt_int16_t);</div><div class='del'>-		ERR_ABORT (list);</div><div class='del'>-		inode_ctx_put (inode, this, (uint64_t)(long)list);</div><div class='del'>-		list[0] = priv-&gt;child_count;</div><div class='del'>-		list[2] = -1;</div><div class='del'>-</div><div class='del'>-		/* This means, file doesn't exist anywhere in the Filesystem */</div><div class='del'>-		sched_ops = priv-&gt;sched_ops;</div><div class='del'>-</div><div class='del'>-		/* Send create request to the scheduled node now */</div><div class='del'>-		sched_xl = sched_ops-&gt;schedule (this, local-&gt;loc1.path);</div><div class='del'>-		if (sched_xl == NULL)</div><div class='del'>-		{</div><div class='del'>-			/* send unlink () on Namespace */</div><div class='del'>-			local-&gt;op_errno = ENOTCONN;</div><div class='del'>-			local-&gt;op_ret = -1;</div><div class='del'>-			local-&gt;call_count = 1;</div><div class='del'>-			gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-				"no node online to schedule create:(file %s) "</div><div class='del'>-				"sending unlink to namespace", </div><div class='del'>-				(local-&gt;loc1.path)?local-&gt;loc1.path:"");</div><div class='del'>-</div><div class='del'>-			STACK_WIND (frame,</div><div class='del'>-				    unify_create_unlink_cbk,</div><div class='del'>-				    NS(this),</div><div class='del'>-				    NS(this)-&gt;fops-&gt;unlink,</div><div class='del'>-				    &amp;local-&gt;loc1);</div><div class='del'>-	</div><div class='del'>-			return 0;</div><div class='del'>-		}</div><div class='del'>-</div><div class='del'>-		for (index = 0; index &lt; priv-&gt;child_count; index++)</div><div class='del'>-			if (sched_xl == priv-&gt;xl_array[index])</div><div class='del'>-				break;</div><div class='del'>-		list[1] = index;</div><div class='del'>-</div><div class='del'>-		STACK_WIND (frame, unify_create_cbk,</div><div class='del'>-			    sched_xl, sched_xl-&gt;fops-&gt;create,</div><div class='del'>-			    &amp;local-&gt;loc1, local-&gt;flags, local-&gt;mode, fd);</div><div class='del'>-	} else {</div><div class='del'>-		/* File already exists, and there is no O_EXCL flag */</div><div class='del'>-</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_DEBUG, </div><div class='del'>-			"File(%s) already exists on namespace, sending "</div><div class='del'>-			"open instead", local-&gt;loc1.path);</div><div class='del'>-</div><div class='del'>-		local-&gt;list = GF_CALLOC (1, sizeof (int16_t) * 3,</div><div class='del'>-                                         gf_unify_mt_int16_t);</div><div class='del'>-		ERR_ABORT (local-&gt;list);</div><div class='del'>-		local-&gt;call_count = priv-&gt;child_count + 1;</div><div class='del'>-		local-&gt;op_ret = -1;</div><div class='del'>-		for (index = 0; index &lt;= priv-&gt;child_count; index++) {</div><div class='del'>-			/* Send lookup() to all nodes including namespace */</div><div class='del'>-			STACK_WIND_COOKIE (frame,</div><div class='del'>-					   unify_create_lookup_cbk,</div><div class='del'>-					   (void *)(long)index,</div><div class='del'>-					   priv-&gt;xl_array[index],</div><div class='del'>-					   priv-&gt;xl_array[index]-&gt;fops-&gt;lookup,</div><div class='del'>-					   &amp;local-&gt;loc1,</div><div class='del'>-					   NULL);</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-/**</div><div class='del'>- * unify_create - create a file in global namespace first, so other </div><div class='del'>- *    clients can see them. Create the file in storage nodes in background.</div><div class='del'>- */</div><div class='del'>-int32_t</div><div class='del'>-unify_create (call_frame_t *frame,</div><div class='del'>-	      xlator_t *this,</div><div class='del'>-	      loc_t *loc,</div><div class='del'>-	      int32_t flags,</div><div class='del'>-	      mode_t mode,</div><div class='del'>-	      fd_t *fd)</div><div class='del'>-{</div><div class='del'>-	unify_local_t *local = NULL;</div><div class='del'>-  </div><div class='del'>-	/* Initialization */</div><div class='del'>-	INIT_LOCAL (frame, local);</div><div class='del'>-	local-&gt;mode = mode;</div><div class='del'>-	local-&gt;flags = flags;</div><div class='del'>-	local-&gt;fd = fd;</div><div class='del'>-</div><div class='del'>-	loc_copy (&amp;local-&gt;loc1, loc);</div><div class='del'>-	if (local-&gt;loc1.path == NULL) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_CRITICAL, "Not enough memory :O");</div><div class='del'>-		STACK_UNWIND (frame, -1, ENOMEM, fd, loc-&gt;inode, NULL,</div><div class='del'>-                              NULL, NULL);</div><div class='del'>-		return 0;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	STACK_WIND (frame,</div><div class='del'>-		    unify_ns_create_cbk,</div><div class='del'>-		    NS(this),</div><div class='del'>-		    NS(this)-&gt;fops-&gt;create,</div><div class='del'>-		    loc,</div><div class='del'>-		    flags | O_EXCL,</div><div class='del'>-		    mode,</div><div class='del'>-		    fd);</div><div class='del'>-  </div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-/**</div><div class='del'>- * unify_opendir_cbk - </div><div class='del'>- */</div><div class='del'>-int32_t</div><div class='del'>-unify_opendir_cbk (call_frame_t *frame,</div><div class='del'>-		   void *cookie,</div><div class='del'>-		   xlator_t *this,</div><div class='del'>-		   int32_t op_ret,</div><div class='del'>-		   int32_t op_errno,</div><div class='del'>-		   fd_t *fd)</div><div class='del'>-{</div><div class='del'>-	STACK_UNWIND (frame, op_ret, op_errno, fd);</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-/** </div><div class='del'>- * unify_opendir -</div><div class='del'>- */</div><div class='del'>-int32_t</div><div class='del'>-unify_opendir (call_frame_t *frame,</div><div class='del'>-	       xlator_t *this,</div><div class='del'>-	       loc_t *loc,</div><div class='del'>-	       fd_t *fd)</div><div class='del'>-{</div><div class='del'>-	UNIFY_CHECK_INODE_CTX_AND_UNWIND_ON_ERR (loc);</div><div class='del'>-</div><div class='del'>-	STACK_WIND (frame, unify_opendir_cbk,</div><div class='del'>-		    NS(this), NS(this)-&gt;fops-&gt;opendir, loc, fd);</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-unify_setattr_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-                   int32_t op_ret, int32_t op_errno, struct iatt *statpre,</div><div class='del'>-                   struct iatt *statpost)</div><div class='del'>-{</div><div class='del'>-	int32_t callcnt = 0;</div><div class='del'>-	unify_private_t *priv = this-&gt;private;</div><div class='del'>-	unify_local_t *local = frame-&gt;local;</div><div class='del'>-	call_frame_t *prev_frame = cookie;</div><div class='del'>-</div><div class='del'>-	LOCK (&amp;frame-&gt;lock);</div><div class='del'>-	{</div><div class='del'>-		callcnt = --local-&gt;call_count;</div><div class='del'>-    </div><div class='del'>-		if (op_ret == -1) {</div><div class='del'>-			gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-				"%s(): child(%s): path(%s): %s", </div><div class='del'>-				gf_fop_list[frame-&gt;root-&gt;op],</div><div class='del'>-				prev_frame-&gt;this-&gt;name, </div><div class='del'>-				(local-&gt;loc1.path)?local-&gt;loc1.path:"", </div><div class='del'>-				strerror (op_errno));</div><div class='del'>-</div><div class='del'>-			local-&gt;op_errno = op_errno;</div><div class='del'>-			if ((op_errno == ENOENT) &amp;&amp; priv-&gt;optimist) </div><div class='del'>-				local-&gt;op_ret = 0;</div><div class='del'>-		}</div><div class='del'>-</div><div class='del'>-		if (op_ret &gt;= 0) {</div><div class='del'>-			local-&gt;op_ret = 0;</div><div class='del'>-</div><div class='del'>-			if (NS (this) == prev_frame-&gt;this) {</div><div class='del'>-				local-&gt;ia_ino = statpost-&gt;ia_ino;</div><div class='del'>-				/* If the entry is directory, get the stat</div><div class='del'>-				   from NS node */</div><div class='del'>-				if (IA_ISDIR (statpost-&gt;ia_type) || </div><div class='del'>-				    !local-&gt;stpost.ia_blksize) {</div><div class='del'>-					local-&gt;stpre = *statpre;</div><div class='del'>-                                        local-&gt;stpost = *statpost;</div><div class='del'>-				}</div><div class='del'>-			}</div><div class='del'>-</div><div class='del'>-			if ((!IA_ISDIR (statpost-&gt;ia_type)) &amp;&amp; </div><div class='del'>-			    (NS (this) != prev_frame-&gt;this)) {</div><div class='del'>-				/* If file, take the stat info from Storage </div><div class='del'>-				   node. */</div><div class='del'>-				local-&gt;stpre = *statpre;</div><div class='del'>-                                local-&gt;stpost = *statpost;</div><div class='del'>-			}</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='del'>-	UNLOCK (&amp;frame-&gt;lock);</div><div class='del'>-    </div><div class='del'>-	if (!callcnt) {</div><div class='del'>-		/* If the inode number is not filled, operation should</div><div class='del'>-		   fail */</div><div class='del'>-		if (!local-&gt;ia_ino)</div><div class='del'>-			local-&gt;op_ret = -1;</div><div class='del'>-</div><div class='del'>-                local-&gt;stpre.ia_ino = local-&gt;ia_ino;</div><div class='del'>-		local-&gt;stpost.ia_ino = local-&gt;ia_ino;</div><div class='del'>-		unify_local_wipe (local);</div><div class='del'>-		STACK_UNWIND (frame, local-&gt;op_ret, local-&gt;op_errno, </div><div class='del'>-			      &amp;local-&gt;stpre, &amp;local-&gt;stpost);</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-unify_setattr (call_frame_t *frame, xlator_t *this, loc_t *loc,</div><div class='del'>-               struct iatt *stbuf, int32_t valid)</div><div class='del'>-{</div><div class='del'>-	unify_local_t *local = NULL;</div><div class='del'>-	unify_private_t *priv = this-&gt;private;</div><div class='del'>-	int32_t index = 0;</div><div class='del'>-	int32_t callcnt = 0;</div><div class='del'>-  	uint64_t tmp_list = 0;</div><div class='del'>-</div><div class='del'>-        if (!(loc &amp;&amp; loc-&gt;inode)) {                     </div><div class='del'>-                STACK_UNWIND (frame, -1, EINVAL, NULL, NULL);</div><div class='del'>-                return 0;</div><div class='del'>-        }                                                    </div><div class='del'>-</div><div class='del'>-	/* Initialization */</div><div class='del'>-	INIT_LOCAL (frame, local);</div><div class='del'>-	loc_copy (&amp;local-&gt;loc1, loc);</div><div class='del'>-</div><div class='del'>-	if (IA_ISDIR (loc-&gt;inode-&gt;ia_type)) {</div><div class='del'>-		local-&gt;call_count = 1;</div><div class='del'>-      </div><div class='del'>-                STACK_WIND (frame,</div><div class='del'>-                            unify_setattr_cbk,</div><div class='del'>-                            NS (this),</div><div class='del'>-                            NS (this)-&gt;fops-&gt;setattr,</div><div class='del'>-                            loc, stbuf, valid);</div><div class='del'>-        } else {</div><div class='del'>-		inode_ctx_get (loc-&gt;inode, this, &amp;tmp_list);</div><div class='del'>-		local-&gt;list = (int16_t *)(long)tmp_list;</div><div class='del'>-</div><div class='del'>-		for (index = 0; local-&gt;list[index] != -1; index++) {</div><div class='del'>-			local-&gt;call_count++;</div><div class='del'>-			callcnt++;</div><div class='del'>-		}</div><div class='del'>-      </div><div class='del'>-		for (index = 0; local-&gt;list[index] != -1; index++) {</div><div class='del'>-			STACK_WIND (frame,</div><div class='del'>-				    unify_setattr_cbk,</div><div class='del'>-				    priv-&gt;xl_array[local-&gt;list[index]],</div><div class='del'>-				    priv-&gt;xl_array[local-&gt;list[index]]-&gt;fops-&gt;setattr,</div><div class='del'>-				    loc, stbuf, valid);</div><div class='del'>-</div><div class='del'>-			if (!--callcnt)</div><div class='del'>-				break;</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-unify_fsetattr (call_frame_t *frame, xlator_t *this, fd_t *fd,</div><div class='del'>-                struct iatt *stbuf, int32_t valid)</div><div class='del'>-{</div><div class='del'>-	unify_local_t *local = NULL;</div><div class='del'>-	xlator_t *child = NULL;</div><div class='del'>-	uint64_t tmp_child = 0;</div><div class='del'>-</div><div class='del'>-	UNIFY_CHECK_FD_AND_UNWIND_ON_ERR(fd);</div><div class='del'>-</div><div class='del'>-	/* Initialization */</div><div class='del'>-	INIT_LOCAL (frame, local);</div><div class='del'>-</div><div class='del'>-	if (!fd_ctx_get (fd, this, &amp;tmp_child)) {</div><div class='del'>-		/* If its set, then its file */</div><div class='del'>-		child = (xlator_t *)(long)tmp_child;		     </div><div class='del'>-</div><div class='del'>-		local-&gt;call_count = 2;</div><div class='del'>-</div><div class='del'>-		STACK_WIND (frame, unify_setattr_cbk, child,</div><div class='del'>-			    child-&gt;fops-&gt;fsetattr, fd, stbuf, valid);</div><div class='del'>-</div><div class='del'>-		STACK_WIND (frame, unify_setattr_cbk, NS(this),</div><div class='del'>-			    NS(this)-&gt;fops-&gt;fsetattr, fd, stbuf, valid);</div><div class='del'>-	} else {</div><div class='del'>-		local-&gt;call_count = 1;</div><div class='del'>-    </div><div class='del'>-		STACK_WIND (frame, unify_setattr_cbk,</div><div class='del'>-			    NS(this), NS(this)-&gt;fops-&gt;fsetattr,</div><div class='del'>-			    fd, stbuf, valid);</div><div class='del'>-	}</div><div class='del'>-  </div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-/**</div><div class='del'>- * unify_truncate_cbk - </div><div class='del'>- */</div><div class='del'>-int32_t</div><div class='del'>-unify_truncate_cbk (call_frame_t *frame,</div><div class='del'>-		    void *cookie,</div><div class='del'>-		    xlator_t *this,</div><div class='del'>-		    int32_t op_ret,</div><div class='del'>-		    int32_t op_errno,</div><div class='del'>-		    struct iatt *prebuf,</div><div class='del'>-                    struct iatt *postbuf)</div><div class='del'>-{</div><div class='del'>-	int32_t callcnt = 0;</div><div class='del'>-	unify_private_t *priv = this-&gt;private;</div><div class='del'>-	unify_local_t *local = frame-&gt;local;</div><div class='del'>-	call_frame_t *prev_frame = cookie;</div><div class='del'>-</div><div class='del'>-	LOCK (&amp;frame-&gt;lock);</div><div class='del'>-	{</div><div class='del'>-		callcnt = --local-&gt;call_count;</div><div class='del'>-    </div><div class='del'>-		if (op_ret == -1) {</div><div class='del'>-			gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-				"child(%s): path(%s): %s", </div><div class='del'>-				prev_frame-&gt;this-&gt;name, </div><div class='del'>-				(local-&gt;loc1.path)?local-&gt;loc1.path:"", </div><div class='del'>-				strerror (op_errno));</div><div class='del'>-			local-&gt;op_errno = op_errno;</div><div class='del'>-			if (!((op_errno == ENOENT) &amp;&amp; priv-&gt;optimist))</div><div class='del'>-				local-&gt;op_ret = -1;</div><div class='del'>-		}</div><div class='del'>-</div><div class='del'>-		if (op_ret &gt;= 0) {</div><div class='del'>-			if (NS (this) == prev_frame-&gt;this) {</div><div class='del'>-				local-&gt;ia_ino = postbuf-&gt;ia_ino;</div><div class='del'>-				/* If the entry is directory, get the </div><div class='del'>-				   stat from NS node */</div><div class='del'>-				if (IA_ISDIR (postbuf-&gt;ia_type) ||</div><div class='del'>-				    !local-&gt;stbuf.ia_blksize) {</div><div class='del'>-					local-&gt;stbuf = *prebuf;</div><div class='del'>-                                        local-&gt;poststbuf = *postbuf;</div><div class='del'>-				}</div><div class='del'>-			}</div><div class='del'>-</div><div class='del'>-			if ((!IA_ISDIR (postbuf-&gt;ia_type)) &amp;&amp;</div><div class='del'>-			    (NS (this) != prev_frame-&gt;this)) {</div><div class='del'>-				/* If file, take the stat info from </div><div class='del'>-				   Storage node. */</div><div class='del'>-				local-&gt;stbuf = *prebuf;</div><div class='del'>-                                local-&gt;poststbuf = *postbuf;</div><div class='del'>-			}</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='del'>-	UNLOCK (&amp;frame-&gt;lock);</div><div class='del'>-    </div><div class='del'>-	if (!callcnt) {</div><div class='del'>-		if (local-&gt;ia_ino) {</div><div class='del'>-			local-&gt;stbuf.ia_ino = local-&gt;ia_ino;</div><div class='del'>-                        local-&gt;poststbuf.ia_ino = local-&gt;ia_ino;</div><div class='del'>-                } else {</div><div class='del'>-			local-&gt;op_ret = -1;</div><div class='del'>-                }</div><div class='del'>-		unify_local_wipe (local);</div><div class='del'>-		STACK_UNWIND (frame, local-&gt;op_ret, local-&gt;op_errno, </div><div class='del'>-			      &amp;local-&gt;stbuf, &amp;local-&gt;poststbuf);</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-/**</div><div class='del'>- * unify_truncate - </div><div class='del'>- */</div><div class='del'>-int32_t</div><div class='del'>-unify_truncate (call_frame_t *frame,</div><div class='del'>-		xlator_t *this,</div><div class='del'>-		loc_t *loc,</div><div class='del'>-		off_t offset)</div><div class='del'>-{</div><div class='del'>-	unify_local_t *local = NULL;</div><div class='del'>-	unify_private_t *priv = this-&gt;private;</div><div class='del'>-	int32_t index = 0;</div><div class='del'>-	int32_t callcnt = 0;</div><div class='del'>-  	uint64_t tmp_list = 0;</div><div class='del'>-</div><div class='del'>-	UNIFY_CHECK_INODE_CTX_AND_UNWIND_ON_ERR (loc);</div><div class='del'>-</div><div class='del'>-	/* Initialization */</div><div class='del'>-	INIT_LOCAL (frame, local);</div><div class='del'>-	loc_copy (&amp;local-&gt;loc1, loc);</div><div class='del'>-	local-&gt;ia_ino = loc-&gt;inode-&gt;ino;</div><div class='del'>-</div><div class='del'>-	if (IA_ISDIR (loc-&gt;inode-&gt;ia_type)) {</div><div class='del'>-		local-&gt;call_count = 1;</div><div class='del'>-      </div><div class='del'>-		STACK_WIND (frame,</div><div class='del'>-			    unify_truncate_cbk,</div><div class='del'>-			    NS(this),</div><div class='del'>-			    NS(this)-&gt;fops-&gt;truncate,</div><div class='del'>-			    loc,</div><div class='del'>-                            0);</div><div class='del'>-	} else {</div><div class='del'>-		local-&gt;op_ret = 0;</div><div class='del'>-		inode_ctx_get (loc-&gt;inode, this, &amp;tmp_list);</div><div class='del'>-		local-&gt;list = (int16_t *)(long)tmp_list;</div><div class='del'>-</div><div class='del'>-		for (index = 0; local-&gt;list[index] != -1; index++) {</div><div class='del'>-			local-&gt;call_count++;</div><div class='del'>-			callcnt++;</div><div class='del'>-		}</div><div class='del'>-      </div><div class='del'>-		/* Don't send offset to NS truncate */</div><div class='del'>-		STACK_WIND (frame, unify_truncate_cbk, NS(this),</div><div class='del'>-			    NS(this)-&gt;fops-&gt;truncate, loc, 0);</div><div class='del'>-		callcnt--;</div><div class='del'>-</div><div class='del'>-		for (index = 0; local-&gt;list[index] != -1; index++) {</div><div class='del'>-			if (NS(this) != priv-&gt;xl_array[local-&gt;list[index]]) {</div><div class='del'>-				STACK_WIND (frame,</div><div class='del'>-					    unify_truncate_cbk,</div><div class='del'>-					    priv-&gt;xl_array[local-&gt;list[index]],</div><div class='del'>-					    priv-&gt;xl_array[local-&gt;list[index]]-&gt;fops-&gt;truncate,</div><div class='del'>-					    loc,</div><div class='del'>-					    offset);</div><div class='del'>-				if (!--callcnt)</div><div class='del'>-					break;</div><div class='del'>-			}</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-/**</div><div class='del'>- * unify_readlink_cbk - </div><div class='del'>- */</div><div class='del'>-int32_t</div><div class='del'>-unify_readlink_cbk (call_frame_t *frame,</div><div class='del'>-		    void *cookie,</div><div class='del'>-		    xlator_t *this,</div><div class='del'>-		    int32_t op_ret,</div><div class='del'>-		    int32_t op_errno,</div><div class='del'>-		    const char *path,</div><div class='del'>-                    struct iatt *sbuf)</div><div class='del'>-{</div><div class='del'>-	STACK_UNWIND (frame, op_ret, op_errno, path, sbuf);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-/**</div><div class='del'>- * unify_readlink - Read the link only from the storage node.</div><div class='del'>- */</div><div class='del'>-int32_t</div><div class='del'>-unify_readlink (call_frame_t *frame,</div><div class='del'>-		xlator_t *this,</div><div class='del'>-		loc_t *loc,</div><div class='del'>-		size_t size)</div><div class='del'>-{</div><div class='del'>-	unify_private_t *priv = this-&gt;private;</div><div class='del'>-	int32_t entry_count = 0;</div><div class='del'>-	int16_t *list = NULL;</div><div class='del'>-	int16_t index = 0;</div><div class='del'>-  	uint64_t tmp_list = 0;</div><div class='del'>-  </div><div class='del'>-	UNIFY_CHECK_INODE_CTX_AND_UNWIND_ON_ERR (loc);</div><div class='del'>-	</div><div class='del'>-	inode_ctx_get (loc-&gt;inode, this, &amp;tmp_list);</div><div class='del'>-	list = (int16_t *)(long)tmp_list;</div><div class='del'>-</div><div class='del'>-	for (index = 0; list[index] != -1; index++)</div><div class='del'>-		entry_count++;</div><div class='del'>-</div><div class='del'>-	if (entry_count &gt;= 2) {</div><div class='del'>-		for (index = 0; list[index] != -1; index++) {</div><div class='del'>-			if (priv-&gt;xl_array[list[index]] != NS(this)) {</div><div class='del'>-				STACK_WIND (frame,</div><div class='del'>-					    unify_readlink_cbk,</div><div class='del'>-					    priv-&gt;xl_array[list[index]],</div><div class='del'>-					    priv-&gt;xl_array[list[index]]-&gt;fops-&gt;readlink,</div><div class='del'>-					    loc,</div><div class='del'>-					    size);</div><div class='del'>-				break;</div><div class='del'>-			}</div><div class='del'>-		}</div><div class='del'>-	} else {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_ERROR, </div><div class='del'>-			"returning ENOENT, no softlink files found "</div><div class='del'>-			"on storage node");</div><div class='del'>-		STACK_UNWIND (frame, -1, ENOENT, NULL);</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-/**</div><div class='del'>- * unify_unlink_cbk - </div><div class='del'>- */</div><div class='del'>-int32_t</div><div class='del'>-unify_unlink_cbk (call_frame_t *frame,</div><div class='del'>-		  void *cookie,</div><div class='del'>-		  xlator_t *this,</div><div class='del'>-		  int32_t op_ret,</div><div class='del'>-		  int32_t op_errno,</div><div class='del'>-                  struct iatt *preparent,</div><div class='del'>-                  struct iatt *postparent)</div><div class='del'>-{</div><div class='del'>-	int32_t callcnt = 0;</div><div class='del'>-	unify_private_t *priv = this-&gt;private;</div><div class='del'>-	unify_local_t *local = frame-&gt;local;</div><div class='del'>-</div><div class='del'>-	LOCK (&amp;frame-&gt;lock);</div><div class='del'>-	{</div><div class='del'>-		callcnt = --local-&gt;call_count;</div><div class='del'>-		if (op_ret == 0  || ((op_errno == ENOENT) &amp;&amp; priv-&gt;optimist))</div><div class='del'>-			local-&gt;op_ret = 0;</div><div class='del'>-		if (op_ret == -1)</div><div class='del'>-			local-&gt;op_errno = op_errno;</div><div class='del'>-</div><div class='del'>-                if (((call_frame_t *)cookie)-&gt;this == NS(this)) {</div><div class='del'>-                        local-&gt;oldpreparent = *preparent;</div><div class='del'>-                        local-&gt;oldpostparent = *postparent;</div><div class='del'>-                }</div><div class='del'>-	}</div><div class='del'>-	UNLOCK (&amp;frame-&gt;lock);</div><div class='del'>-</div><div class='del'>-	if (!callcnt) {</div><div class='del'>-		unify_local_wipe (local);</div><div class='del'>-		STACK_UNWIND (frame, local-&gt;op_ret, local-&gt;op_errno,</div><div class='del'>-                              &amp;local-&gt;oldpreparent, &amp;local-&gt;oldpostparent);</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-/**</div><div class='del'>- * unify_unlink - </div><div class='del'>- */</div><div class='del'>-int32_t</div><div class='del'>-unify_unlink (call_frame_t *frame,</div><div class='del'>-	      xlator_t *this,</div><div class='del'>-	      loc_t *loc)</div><div class='del'>-{</div><div class='del'>-	unify_private_t *priv = this-&gt;private;</div><div class='del'>-	unify_local_t *local = NULL;</div><div class='del'>-	int16_t *list = NULL;</div><div class='del'>-	int16_t index = 0;</div><div class='del'>-  	uint64_t tmp_list = 0;</div><div class='del'>-</div><div class='del'>-	UNIFY_CHECK_INODE_CTX_AND_UNWIND_ON_ERR (loc);</div><div class='del'>-</div><div class='del'>-	/* Initialization */</div><div class='del'>-	INIT_LOCAL (frame, local);</div><div class='del'>-	loc_copy (&amp;local-&gt;loc1, loc);</div><div class='del'>-</div><div class='del'>-	inode_ctx_get (loc-&gt;inode, this, &amp;tmp_list);</div><div class='del'>-	list = (int16_t *)(long)tmp_list;</div><div class='del'>-</div><div class='del'>-	for (index = 0; list[index] != -1; index++)</div><div class='del'>-		local-&gt;call_count++;</div><div class='del'>-</div><div class='del'>-	if (local-&gt;call_count) {</div><div class='del'>-		for (index = 0; list[index] != -1; index++) {</div><div class='del'>-			char need_break = (list[index+1] == -1);</div><div class='del'>-			STACK_WIND (frame,</div><div class='del'>-				    unify_unlink_cbk,</div><div class='del'>-				    priv-&gt;xl_array[list[index]],</div><div class='del'>-				    priv-&gt;xl_array[list[index]]-&gt;fops-&gt;unlink,</div><div class='del'>-				    loc);</div><div class='del'>-			if (need_break)</div><div class='del'>-				break;</div><div class='del'>-		}</div><div class='del'>-	} else {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-			"%s: returning ENOENT", loc-&gt;path);</div><div class='del'>-		STACK_UNWIND (frame, -1, ENOENT, NULL, NULL);</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-/**</div><div class='del'>- * unify_readv_cbk - </div><div class='del'>- */</div><div class='del'>-int32_t</div><div class='del'>-unify_readv_cbk (call_frame_t *frame,</div><div class='del'>-		 void *cookie,</div><div class='del'>-		 xlator_t *this,</div><div class='del'>-		 int32_t op_ret,</div><div class='del'>-		 int32_t op_errno,</div><div class='del'>-		 struct iovec *vector,</div><div class='del'>-		 int32_t count,</div><div class='del'>-		 struct iatt *stbuf,</div><div class='del'>-                 struct iobref *iobref)</div><div class='del'>-{</div><div class='del'>-	STACK_UNWIND (frame, op_ret, op_errno, vector, count, stbuf, iobref);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-/**</div><div class='del'>- * unify_readv - </div><div class='del'>- */</div><div class='del'>-int32_t</div><div class='del'>-unify_readv (call_frame_t *frame,</div><div class='del'>-	     xlator_t *this,</div><div class='del'>-	     fd_t *fd,</div><div class='del'>-	     size_t size,</div><div class='del'>-	     off_t offset)</div><div class='del'>-{</div><div class='del'>-	UNIFY_CHECK_FD_CTX_AND_UNWIND_ON_ERR (fd);</div><div class='del'>-	xlator_t *child = NULL;</div><div class='del'>-	uint64_t tmp_child = 0;</div><div class='del'>-</div><div class='del'>-	fd_ctx_get (fd, this, &amp;tmp_child);</div><div class='del'>-	child = (xlator_t *)(long)tmp_child;		     </div><div class='del'>-</div><div class='del'>-	STACK_WIND (frame,</div><div class='del'>-		    unify_readv_cbk,</div><div class='del'>-		    child,</div><div class='del'>-		    child-&gt;fops-&gt;readv,</div><div class='del'>-		    fd,</div><div class='del'>-		    size,</div><div class='del'>-		    offset);</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-/**</div><div class='del'>- * unify_writev_cbk - </div><div class='del'>- */</div><div class='del'>-int32_t</div><div class='del'>-unify_writev_cbk (call_frame_t *frame,</div><div class='del'>-		  void *cookie,</div><div class='del'>-		  xlator_t *this,</div><div class='del'>-		  int32_t op_ret,</div><div class='del'>-		  int32_t op_errno,</div><div class='del'>-                  struct iatt *prebuf,</div><div class='del'>-		  struct iatt *postbuf)</div><div class='del'>-{</div><div class='del'>-	unify_local_t *local = NULL;</div><div class='del'>-</div><div class='del'>-        local = frame-&gt;local;</div><div class='del'>-</div><div class='del'>-        local-&gt;stbuf = *prebuf;</div><div class='del'>-        local-&gt;stbuf.ia_ino = local-&gt;ia_ino;</div><div class='del'>-</div><div class='del'>-        local-&gt;poststbuf = *postbuf;</div><div class='del'>-        local-&gt;poststbuf.ia_ino = local-&gt;ia_ino;</div><div class='del'>-</div><div class='del'>-	STACK_UNWIND (frame, op_ret, op_errno,</div><div class='del'>-                      &amp;local-&gt;stbuf, &amp;local-&gt;poststbuf);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-/**</div><div class='del'>- * unify_writev - </div><div class='del'>- */</div><div class='del'>-int32_t</div><div class='del'>-unify_writev (call_frame_t *frame,</div><div class='del'>-	      xlator_t *this,</div><div class='del'>-	      fd_t *fd,</div><div class='del'>-	      struct iovec *vector,</div><div class='del'>-	      int32_t count,</div><div class='del'>-	      off_t off,</div><div class='del'>-              struct iobref *iobref)</div><div class='del'>-{</div><div class='del'>-	UNIFY_CHECK_FD_CTX_AND_UNWIND_ON_ERR (fd);</div><div class='del'>-	xlator_t *child = NULL;</div><div class='del'>-	uint64_t tmp_child = 0;</div><div class='del'>-	unify_local_t *local = NULL;</div><div class='del'>-</div><div class='del'>-	INIT_LOCAL (frame, local);</div><div class='del'>-        local-&gt;ia_ino = fd-&gt;inode-&gt;ino;</div><div class='del'>-</div><div class='del'>-	fd_ctx_get (fd, this, &amp;tmp_child);</div><div class='del'>-	child = (xlator_t *)(long)tmp_child;		     </div><div class='del'>-</div><div class='del'>-	STACK_WIND (frame,</div><div class='del'>-		    unify_writev_cbk,</div><div class='del'>-		    child,</div><div class='del'>-		    child-&gt;fops-&gt;writev,</div><div class='del'>-		    fd,</div><div class='del'>-		    vector,</div><div class='del'>-		    count,</div><div class='del'>-		    off,</div><div class='del'>-                    iobref);</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-/**</div><div class='del'>- * unify_ftruncate -</div><div class='del'>- */</div><div class='del'>-int32_t</div><div class='del'>-unify_ftruncate (call_frame_t *frame,</div><div class='del'>-		 xlator_t *this,</div><div class='del'>-		 fd_t *fd,</div><div class='del'>-		 off_t offset)</div><div class='del'>-{</div><div class='del'>-	xlator_t *child = NULL;</div><div class='del'>-	unify_local_t *local = NULL;</div><div class='del'>-	uint64_t tmp_child = 0;</div><div class='del'>-</div><div class='del'>-	UNIFY_CHECK_FD_CTX_AND_UNWIND_ON_ERR(fd);</div><div class='del'>-</div><div class='del'>-	/* Initialization */</div><div class='del'>-	INIT_LOCAL (frame, local);</div><div class='del'>-	local-&gt;op_ret = 0;</div><div class='del'>-</div><div class='del'>-	fd_ctx_get (fd, this, &amp;tmp_child);</div><div class='del'>-	child = (xlator_t *)(long)tmp_child;		     </div><div class='del'>-</div><div class='del'>-	local-&gt;call_count = 2;</div><div class='del'>-  </div><div class='del'>-	STACK_WIND (frame, unify_truncate_cbk,</div><div class='del'>-		    child, child-&gt;fops-&gt;ftruncate,</div><div class='del'>-		    fd, offset);</div><div class='del'>-  </div><div class='del'>-	STACK_WIND (frame, unify_truncate_cbk,</div><div class='del'>-		    NS(this), NS(this)-&gt;fops-&gt;ftruncate,</div><div class='del'>-		    fd, 0);</div><div class='del'>-  </div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-/**</div><div class='del'>- * unify_flush_cbk - </div><div class='del'>- */</div><div class='del'>-int32_t</div><div class='del'>-unify_flush_cbk (call_frame_t *frame,</div><div class='del'>-		 void *cookie,</div><div class='del'>-		 xlator_t *this,</div><div class='del'>-		 int32_t op_ret,</div><div class='del'>-		 int32_t op_errno)</div><div class='del'>-{</div><div class='del'>-	STACK_UNWIND (frame, op_ret, op_errno);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-/**</div><div class='del'>- * unify_flush -</div><div class='del'>- */</div><div class='del'>-int32_t</div><div class='del'>-unify_flush (call_frame_t *frame,</div><div class='del'>-	     xlator_t *this,</div><div class='del'>-	     fd_t *fd)</div><div class='del'>-{</div><div class='del'>-	UNIFY_CHECK_FD_CTX_AND_UNWIND_ON_ERR (fd);</div><div class='del'>-	xlator_t *child = NULL;</div><div class='del'>-	uint64_t tmp_child = 0;</div><div class='del'>-</div><div class='del'>-	fd_ctx_get (fd, this, &amp;tmp_child);</div><div class='del'>-	child = (xlator_t *)(long)tmp_child;		     </div><div class='del'>-</div><div class='del'>-	STACK_WIND (frame, unify_flush_cbk, child, </div><div class='del'>-		    child-&gt;fops-&gt;flush, fd);</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-/**</div><div class='del'>- * unify_fsync_cbk - </div><div class='del'>- */</div><div class='del'>-int32_t</div><div class='del'>-unify_fsync_cbk (call_frame_t *frame,</div><div class='del'>-		 void *cookie,</div><div class='del'>-		 xlator_t *this,</div><div class='del'>-		 int32_t op_ret,</div><div class='del'>-		 int32_t op_errno,</div><div class='del'>-                 struct iatt *prebuf,</div><div class='del'>-                 struct iatt *postbuf)</div><div class='del'>-{</div><div class='del'>-	STACK_UNWIND (frame, op_ret, op_errno, prebuf, postbuf);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-/**</div><div class='del'>- * unify_fsync - </div><div class='del'>- */</div><div class='del'>-int32_t</div><div class='del'>-unify_fsync (call_frame_t *frame,</div><div class='del'>-	     xlator_t *this,</div><div class='del'>-	     fd_t *fd,</div><div class='del'>-	     int32_t flags)</div><div class='del'>-{</div><div class='del'>-	UNIFY_CHECK_FD_CTX_AND_UNWIND_ON_ERR (fd);</div><div class='del'>-	xlator_t *child = NULL;</div><div class='del'>-	uint64_t tmp_child = 0;</div><div class='del'>-</div><div class='del'>-	fd_ctx_get (fd, this, &amp;tmp_child);</div><div class='del'>-	child = (xlator_t *)(long)tmp_child;		     </div><div class='del'>-</div><div class='del'>-	STACK_WIND (frame, unify_fsync_cbk, child,</div><div class='del'>-		    child-&gt;fops-&gt;fsync, fd, flags);</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-/**</div><div class='del'>- * unify_fstat - Send fstat FOP to Namespace only if its directory, and to </div><div class='del'>- *     both namespace and the storage node if its a file.</div><div class='del'>- */</div><div class='del'>-int32_t</div><div class='del'>-unify_fstat (call_frame_t *frame,</div><div class='del'>-	     xlator_t *this,</div><div class='del'>-	     fd_t *fd)</div><div class='del'>-{</div><div class='del'>-	unify_local_t *local = NULL;</div><div class='del'>-	xlator_t *child = NULL;</div><div class='del'>-	uint64_t tmp_child = 0;</div><div class='del'>-</div><div class='del'>-	UNIFY_CHECK_FD_AND_UNWIND_ON_ERR(fd);</div><div class='del'>-</div><div class='del'>-	INIT_LOCAL (frame, local);</div><div class='del'>-	local-&gt;ia_ino = fd-&gt;inode-&gt;ino;</div><div class='del'>-</div><div class='del'>-	if (!fd_ctx_get (fd, this, &amp;tmp_child)) {</div><div class='del'>-		/* If its set, then its file */</div><div class='del'>-		child = (xlator_t *)(long)tmp_child;		     </div><div class='del'>-		local-&gt;call_count = 2;</div><div class='del'>-</div><div class='del'>-		STACK_WIND (frame, unify_buf_cbk, child,</div><div class='del'>-			    child-&gt;fops-&gt;fstat, fd);</div><div class='del'>-</div><div class='del'>-		STACK_WIND (frame, unify_buf_cbk, NS(this),</div><div class='del'>-			    NS(this)-&gt;fops-&gt;fstat, fd);</div><div class='del'>-</div><div class='del'>-	} else {</div><div class='del'>-		/* this is an directory */</div><div class='del'>-		local-&gt;call_count = 1;</div><div class='del'>-		STACK_WIND (frame, unify_buf_cbk, NS(this),</div><div class='del'>-			    NS(this)-&gt;fops-&gt;fstat, fd);</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-/**</div><div class='del'>- * unify_getdents_cbk - </div><div class='del'>- */</div><div class='del'>-int32_t</div><div class='del'>-unify_getdents_cbk (call_frame_t *frame,</div><div class='del'>-		    void *cookie,</div><div class='del'>-		    xlator_t *this,</div><div class='del'>-		    int32_t op_ret,</div><div class='del'>-		    int32_t op_errno,</div><div class='del'>-		    dir_entry_t *entry,</div><div class='del'>-		    int32_t count)</div><div class='del'>-{</div><div class='del'>-	STACK_UNWIND (frame, op_ret, op_errno, entry, count);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-/**</div><div class='del'>- * unify_getdents - send the FOP request to all the nodes.</div><div class='del'>- */</div><div class='del'>-int32_t</div><div class='del'>-unify_getdents (call_frame_t *frame,</div><div class='del'>-		xlator_t *this,</div><div class='del'>-		fd_t *fd,</div><div class='del'>-		size_t size,</div><div class='del'>-		off_t offset,</div><div class='del'>-		int32_t flag)</div><div class='del'>-{</div><div class='del'>-	UNIFY_CHECK_FD_AND_UNWIND_ON_ERR (fd);</div><div class='del'>-</div><div class='del'>-	STACK_WIND (frame, unify_getdents_cbk, NS(this),</div><div class='del'>-		    NS(this)-&gt;fops-&gt;getdents, fd, size, offset, flag);</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-/**</div><div class='del'>- * unify_readdir_cbk - </div><div class='del'>- */</div><div class='del'>-int32_t</div><div class='del'>-unify_readdir_cbk (call_frame_t *frame,</div><div class='del'>-		   void *cookie,</div><div class='del'>-		   xlator_t *this,</div><div class='del'>-		   int32_t op_ret,</div><div class='del'>-		   int32_t op_errno,</div><div class='del'>-		   gf_dirent_t *buf)</div><div class='del'>-{</div><div class='del'>-	STACK_UNWIND (frame, op_ret, op_errno, buf);</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-/**</div><div class='del'>- * unify_readdir - send the FOP request to all the nodes.</div><div class='del'>- */</div><div class='del'>-int32_t</div><div class='del'>-unify_readdir (call_frame_t *frame,</div><div class='del'>-	       xlator_t *this,</div><div class='del'>-	       fd_t *fd,</div><div class='del'>-	       size_t size,</div><div class='del'>-	       off_t offset)</div><div class='del'>-{</div><div class='del'>-	UNIFY_CHECK_FD_AND_UNWIND_ON_ERR (fd);</div><div class='del'>-</div><div class='del'>-	STACK_WIND (frame, unify_readdir_cbk, NS(this),</div><div class='del'>-		    NS(this)-&gt;fops-&gt;readdir, fd, size, offset);</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-unify_readdirp_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-                    int32_t op_ret, int32_t op_errno, gf_dirent_t *buf)</div><div class='del'>-{</div><div class='del'>-	STACK_UNWIND (frame, op_ret, op_errno, buf);</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-unify_readdirp (call_frame_t *frame, xlator_t *this, fd_t *fd, size_t size,</div><div class='del'>-                off_t offset)</div><div class='del'>-{</div><div class='del'>-	UNIFY_CHECK_FD_AND_UNWIND_ON_ERR (fd);</div><div class='del'>-</div><div class='del'>-	STACK_WIND (frame, unify_readdirp_cbk, NS(this),</div><div class='del'>-		    NS(this)-&gt;fops-&gt;readdirp, fd, size, offset);</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-/**</div><div class='del'>- * unify_fsyncdir_cbk - </div><div class='del'>- */</div><div class='del'>-int32_t</div><div class='del'>-unify_fsyncdir_cbk (call_frame_t *frame,</div><div class='del'>-		    void *cookie,</div><div class='del'>-		    xlator_t *this,</div><div class='del'>-		    int32_t op_ret,</div><div class='del'>-		    int32_t op_errno)</div><div class='del'>-{</div><div class='del'>-	STACK_UNWIND (frame, op_ret, op_errno);</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-/**</div><div class='del'>- * unify_fsyncdir -</div><div class='del'>- */</div><div class='del'>-int32_t</div><div class='del'>-unify_fsyncdir (call_frame_t *frame,</div><div class='del'>-		xlator_t *this,</div><div class='del'>-		fd_t *fd,</div><div class='del'>-		int32_t flags)</div><div class='del'>-{</div><div class='del'>-	UNIFY_CHECK_FD_AND_UNWIND_ON_ERR (fd);</div><div class='del'>-</div><div class='del'>-	STACK_WIND (frame, unify_fsyncdir_cbk,</div><div class='del'>-		    NS(this), NS(this)-&gt;fops-&gt;fsyncdir, fd, flags);</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-/**</div><div class='del'>- * unify_lk_cbk - UNWIND frame with the proper return arguments.</div><div class='del'>- */</div><div class='del'>-int32_t</div><div class='del'>-unify_lk_cbk (call_frame_t *frame,</div><div class='del'>-	      void *cookie,</div><div class='del'>-	      xlator_t *this,</div><div class='del'>-	      int32_t op_ret,</div><div class='del'>-	      int32_t op_errno,</div><div class='del'>-	      struct flock *lock)</div><div class='del'>-{</div><div class='del'>-	STACK_UNWIND (frame, op_ret, op_errno, lock);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-/**</div><div class='del'>- * unify_lk - Send it to all the storage nodes, (should be 1) which has file.</div><div class='del'>- */</div><div class='del'>-int32_t</div><div class='del'>-unify_lk (call_frame_t *frame,</div><div class='del'>-	  xlator_t *this,</div><div class='del'>-	  fd_t *fd,</div><div class='del'>-	  int32_t cmd,</div><div class='del'>-	  struct flock *lock)</div><div class='del'>-{</div><div class='del'>-	UNIFY_CHECK_FD_CTX_AND_UNWIND_ON_ERR (fd);</div><div class='del'>-	xlator_t *child = NULL;</div><div class='del'>-	uint64_t tmp_child = 0;</div><div class='del'>-</div><div class='del'>-	fd_ctx_get (fd, this, &amp;tmp_child);</div><div class='del'>-	child = (xlator_t *)(long)tmp_child;		     </div><div class='del'>-</div><div class='del'>-	STACK_WIND (frame, unify_lk_cbk, child,</div><div class='del'>-		    child-&gt;fops-&gt;lk, fd, cmd, lock);</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-unify_setxattr_cbk (call_frame_t *frame,</div><div class='del'>-		    void *cookie,</div><div class='del'>-		    xlator_t *this,</div><div class='del'>-		    int32_t op_ret,</div><div class='del'>-		    int32_t op_errno);</div><div class='del'>-</div><div class='del'>-static int32_t</div><div class='del'>-unify_setxattr_file_cbk (call_frame_t *frame,</div><div class='del'>-			 void *cookie,</div><div class='del'>-			 xlator_t *this,</div><div class='del'>-			 int32_t op_ret,</div><div class='del'>-			 int32_t op_errno)</div><div class='del'>-{</div><div class='del'>-	unify_private_t *private = this-&gt;private;</div><div class='del'>-	unify_local_t *local = frame-&gt;local;</div><div class='del'>-	xlator_t *sched_xl = NULL;</div><div class='del'>-	struct sched_ops *sched_ops = NULL;</div><div class='del'>-</div><div class='del'>-	if (op_ret == -1) {</div><div class='del'>-		if (!ENOTSUP)</div><div class='del'>-			gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-				"setxattr with XATTR_CREATE on ns: "</div><div class='del'>-				"path(%s) key(%s): %s",</div><div class='del'>-				local-&gt;loc1.path, local-&gt;name, </div><div class='del'>-				strerror (op_errno));</div><div class='del'>-		unify_local_wipe (local);</div><div class='del'>-		STACK_UNWIND (frame, op_ret, op_errno);</div><div class='del'>-		return 0;</div><div class='del'>-	} </div><div class='del'>-</div><div class='del'>-	LOCK (&amp;frame-&gt;lock);</div><div class='del'>-	{</div><div class='del'>-		local-&gt;failed = 0;</div><div class='del'>-		local-&gt;op_ret = 0;</div><div class='del'>-		local-&gt;op_errno = 0;</div><div class='del'>-		local-&gt;call_count = 1;</div><div class='del'>-	}</div><div class='del'>-	UNLOCK (&amp;frame-&gt;lock);</div><div class='del'>-</div><div class='del'>-	/* schedule XATTR_CREATE on one of the child node */</div><div class='del'>-	sched_ops = private-&gt;sched_ops;</div><div class='del'>-    </div><div class='del'>-	/* Send create request to the scheduled node now */</div><div class='del'>-	sched_xl = sched_ops-&gt;schedule (this, local-&gt;name); </div><div class='del'>-	if (!sched_xl) {</div><div class='del'>-		STACK_UNWIND (frame, -1, ENOTCONN);</div><div class='del'>-		return 0;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	STACK_WIND (frame,</div><div class='del'>-		    unify_setxattr_cbk,</div><div class='del'>-		    sched_xl,</div><div class='del'>-		    sched_xl-&gt;fops-&gt;setxattr,</div><div class='del'>-		    &amp;local-&gt;loc1,</div><div class='del'>-		    local-&gt;dict,</div><div class='del'>-		    local-&gt;flags);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-/**</div><div class='del'>- * unify_setxattr_cbk - When all the child nodes return, UNWIND frame.</div><div class='del'>- */</div><div class='del'>-int32_t</div><div class='del'>-unify_setxattr_cbk (call_frame_t *frame,</div><div class='del'>-		    void *cookie,</div><div class='del'>-		    xlator_t *this,</div><div class='del'>-		    int32_t op_ret,</div><div class='del'>-		    int32_t op_errno)</div><div class='del'>-{</div><div class='del'>-	int32_t callcnt = 0;</div><div class='del'>-	unify_local_t *local = frame-&gt;local;</div><div class='del'>-	call_frame_t *prev_frame = cookie;</div><div class='del'>-	dict_t *dict = NULL;</div><div class='del'>-</div><div class='del'>-	LOCK (&amp;frame-&gt;lock);</div><div class='del'>-	{</div><div class='del'>-		callcnt = --local-&gt;call_count;</div><div class='del'>-    </div><div class='del'>-		if (op_ret == -1) {</div><div class='del'>-			gf_log (this-&gt;name, (((op_errno == ENOENT) || </div><div class='del'>-					      (op_errno == ENOTSUP))? </div><div class='del'>-					     GF_LOG_DEBUG : GF_LOG_ERROR), </div><div class='del'>-				"child(%s): path(%s): %s", </div><div class='del'>-				prev_frame-&gt;this-&gt;name, </div><div class='del'>-				(local-&gt;loc1.path)?local-&gt;loc1.path:"", </div><div class='del'>-				strerror (op_errno));</div><div class='del'>-			if (local-&gt;failed == -1) {</div><div class='del'>-				local-&gt;failed = 1;</div><div class='del'>-			}</div><div class='del'>-			local-&gt;op_errno = op_errno;</div><div class='del'>-		} else {</div><div class='del'>-			local-&gt;failed = 0;</div><div class='del'>-			local-&gt;op_ret = op_ret;</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='del'>-	UNLOCK (&amp;frame-&gt;lock);</div><div class='del'>-  </div><div class='del'>-	if (!callcnt) {</div><div class='del'>-		if (local-&gt;failed &amp;&amp; local-&gt;name &amp;&amp; </div><div class='del'>-		    ZR_FILE_CONTENT_REQUEST(local-&gt;name)) {      </div><div class='del'>-			dict = get_new_dict ();</div><div class='del'>-			dict_set (dict, local-&gt;dict-&gt;members_list-&gt;key, </div><div class='del'>-				  data_from_dynptr(NULL, 0));</div><div class='del'>-			dict_ref (dict);</div><div class='del'>-</div><div class='del'>-			local-&gt;call_count = 1;</div><div class='del'>-</div><div class='del'>-			STACK_WIND (frame,</div><div class='del'>-				    unify_setxattr_file_cbk,</div><div class='del'>-				    NS(this),</div><div class='del'>-				    NS(this)-&gt;fops-&gt;setxattr,</div><div class='del'>-				    &amp;local-&gt;loc1,</div><div class='del'>-				    dict,</div><div class='del'>-				    XATTR_CREATE);</div><div class='del'>-</div><div class='del'>-			dict_unref (dict);</div><div class='del'>-			return 0;</div><div class='del'>-		}</div><div class='del'>-    </div><div class='del'>-		unify_local_wipe (local);</div><div class='del'>-		STACK_UNWIND (frame, local-&gt;op_ret, local-&gt;op_errno);</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-/**</div><div class='del'>- * unify_sexattr - This function should be sent to all the storage nodes, </div><div class='del'>- *       which contains the file, (excluding namespace).</div><div class='del'>- */</div><div class='del'>-int32_t</div><div class='del'>-unify_setxattr (call_frame_t *frame,</div><div class='del'>-		xlator_t *this,</div><div class='del'>-		loc_t *loc,</div><div class='del'>-		dict_t *dict,</div><div class='del'>-		int32_t flags)</div><div class='del'>-{</div><div class='del'>-	unify_private_t *priv = this-&gt;private;</div><div class='del'>-	unify_local_t *local = NULL;</div><div class='del'>-	int16_t *list = NULL;</div><div class='del'>-	int16_t index = 0;</div><div class='del'>-	int32_t call_count = 0;</div><div class='del'>-  	uint64_t tmp_list = 0;</div><div class='del'>-	data_pair_t *trav = dict-&gt;members_list;</div><div class='del'>-</div><div class='del'>-	UNIFY_CHECK_INODE_CTX_AND_UNWIND_ON_ERR (loc);</div><div class='del'>-</div><div class='del'>-	/* Initialization */</div><div class='del'>-	INIT_LOCAL (frame, local);</div><div class='del'>-	local-&gt;failed = -1;</div><div class='del'>-	loc_copy (&amp;local-&gt;loc1, loc);</div><div class='del'>-</div><div class='del'>-	if (IA_ISDIR (loc-&gt;inode-&gt;ia_type)) {</div><div class='del'>-</div><div class='del'>-		if (trav &amp;&amp; trav-&gt;key &amp;&amp; ZR_FILE_CONTENT_REQUEST(trav-&gt;key)) {</div><div class='del'>-			/* direct the storage xlators to change file </div><div class='del'>-			   content only if file exists */</div><div class='del'>-			local-&gt;flags = flags;</div><div class='del'>-			local-&gt;dict = dict;</div><div class='del'>-			local-&gt;name = gf_strdup (trav-&gt;key);</div><div class='del'>-			flags |= XATTR_REPLACE;</div><div class='del'>-		}</div><div class='del'>-</div><div class='del'>-		local-&gt;call_count = priv-&gt;child_count;</div><div class='del'>-		for (index = 0; index &lt; priv-&gt;child_count; index++) {</div><div class='del'>-			STACK_WIND (frame,</div><div class='del'>-				    unify_setxattr_cbk,</div><div class='del'>-				    priv-&gt;xl_array[index],</div><div class='del'>-				    priv-&gt;xl_array[index]-&gt;fops-&gt;setxattr,</div><div class='del'>-				    loc, dict, flags);</div><div class='del'>-		}</div><div class='del'>-		return 0;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	inode_ctx_get (loc-&gt;inode, this, &amp;tmp_list);</div><div class='del'>-	list = (int16_t *)(long)tmp_list;</div><div class='del'>-</div><div class='del'>-	for (index = 0; list[index] != -1; index++) {</div><div class='del'>-		if (NS(this) != priv-&gt;xl_array[list[index]]) {</div><div class='del'>-			local-&gt;call_count++;</div><div class='del'>-			call_count++;</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='del'>-  </div><div class='del'>-	if (local-&gt;call_count) {</div><div class='del'>-		for (index = 0; list[index] != -1; index++) {</div><div class='del'>-			if (priv-&gt;xl_array[list[index]] != NS(this)) {</div><div class='del'>-				STACK_WIND (frame,</div><div class='del'>-					    unify_setxattr_cbk,</div><div class='del'>-					    priv-&gt;xl_array[list[index]],</div><div class='del'>-					    priv-&gt;xl_array[list[index]]-&gt;fops-&gt;setxattr,</div><div class='del'>-					    loc,</div><div class='del'>-					    dict,</div><div class='del'>-					    flags);</div><div class='del'>-				if (!--call_count)</div><div class='del'>-					break;</div><div class='del'>-			}</div><div class='del'>-		}</div><div class='del'>-		return 0;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	/* No entry in storage nodes */</div><div class='del'>-	gf_log (this-&gt;name, GF_LOG_DEBUG, </div><div class='del'>-		"returning ENOENT, file not found on storage node.");</div><div class='del'>-	STACK_UNWIND (frame, -1, ENOENT);</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-/**</div><div class='del'>- * unify_getxattr_cbk - This function is called from only one child, so, no</div><div class='del'>- *     need of any lock or anything else, just send it to above layer </div><div class='del'>- */</div><div class='del'>-int32_t</div><div class='del'>-unify_getxattr_cbk (call_frame_t *frame,</div><div class='del'>-		    void *cookie,</div><div class='del'>-		    xlator_t *this,</div><div class='del'>-		    int32_t op_ret,</div><div class='del'>-		    int32_t op_errno,</div><div class='del'>-		    dict_t *value)</div><div class='del'>-{</div><div class='del'>-	int32_t callcnt = 0;</div><div class='del'>-	dict_t *local_value = NULL;</div><div class='del'>-	unify_local_t *local = frame-&gt;local;</div><div class='del'>-	call_frame_t *prev_frame = cookie;</div><div class='del'>-  </div><div class='del'>-	LOCK (&amp;frame-&gt;lock);</div><div class='del'>-	{</div><div class='del'>-		callcnt = --local-&gt;call_count;</div><div class='del'>-    </div><div class='del'>-		if (op_ret == -1) {</div><div class='del'>-			local-&gt;op_errno = op_errno;</div><div class='del'>-			gf_log (this-&gt;name, </div><div class='del'>-				(((op_errno == ENOENT) || </div><div class='del'>-				  (op_errno == ENODATA) || </div><div class='del'>-				  (op_errno == ENOTSUP)) ? </div><div class='del'>-				 GF_LOG_DEBUG : GF_LOG_ERROR), </div><div class='del'>-				"child(%s): path(%s): %s", </div><div class='del'>-				prev_frame-&gt;this-&gt;name, </div><div class='del'>-				(local-&gt;loc1.path)?local-&gt;loc1.path:"", </div><div class='del'>-				strerror (op_errno));</div><div class='del'>-		} else {</div><div class='del'>-			if (!local-&gt;dict)</div><div class='del'>-				local-&gt;dict = dict_ref (value);</div><div class='del'>-			local-&gt;op_ret = op_ret;</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='del'>-	UNLOCK (&amp;frame-&gt;lock);</div><div class='del'>-  </div><div class='del'>-	if (!callcnt) {</div><div class='del'>-		local_value = local-&gt;dict;</div><div class='del'>-		local-&gt;dict = NULL;</div><div class='del'>-      </div><div class='del'>-		STACK_UNWIND (frame, local-&gt;op_ret, local-&gt;op_errno, </div><div class='del'>-			      local_value);</div><div class='del'>-      </div><div class='del'>-		if (local_value)</div><div class='del'>-			dict_unref (local_value);</div><div class='del'>-	} </div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-/** </div><div class='del'>- * unify_getxattr - This FOP is sent to only the storage node.</div><div class='del'>- */</div><div class='del'>-int32_t</div><div class='del'>-unify_getxattr (call_frame_t *frame,</div><div class='del'>-		xlator_t *this,</div><div class='del'>-		loc_t *loc,</div><div class='del'>-		const char *name)</div><div class='del'>-{</div><div class='del'>-	unify_private_t *priv = this-&gt;private;</div><div class='del'>-	int16_t *list = NULL;</div><div class='del'>-	int16_t index = 0;</div><div class='del'>-	int16_t count = 0;</div><div class='del'>-	unify_local_t *local = NULL;</div><div class='del'>-  	uint64_t tmp_list = 0;</div><div class='del'>-</div><div class='del'>-	UNIFY_CHECK_INODE_CTX_AND_UNWIND_ON_ERR (loc);</div><div class='del'>-	INIT_LOCAL (frame, local);</div><div class='del'>-</div><div class='del'>-	if (IA_ISDIR (loc-&gt;inode-&gt;ia_type)) {</div><div class='del'>-		local-&gt;call_count = priv-&gt;child_count;</div><div class='del'>-		for (index = 0; index &lt; priv-&gt;child_count; index++)</div><div class='del'>-			STACK_WIND (frame,</div><div class='del'>-				    unify_getxattr_cbk,</div><div class='del'>-				    priv-&gt;xl_array[index],</div><div class='del'>-				    priv-&gt;xl_array[index]-&gt;fops-&gt;getxattr,</div><div class='del'>-				    loc,</div><div class='del'>-				    name);</div><div class='del'>-		return 0;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	inode_ctx_get (loc-&gt;inode, this, &amp;tmp_list);</div><div class='del'>-	list = (int16_t *)(long)tmp_list;</div><div class='del'>-</div><div class='del'>-	for (index = 0; list[index] != -1; index++) {</div><div class='del'>-		if (NS(this) != priv-&gt;xl_array[list[index]]) {</div><div class='del'>-			local-&gt;call_count++;</div><div class='del'>-			count++;</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	if (count) {</div><div class='del'>-		for (index = 0; list[index] != -1; index++) {</div><div class='del'>-			if (priv-&gt;xl_array[list[index]] != NS(this)) {</div><div class='del'>-				STACK_WIND (frame,</div><div class='del'>-					    unify_getxattr_cbk,</div><div class='del'>-					    priv-&gt;xl_array[list[index]],</div><div class='del'>-					    priv-&gt;xl_array[list[index]]-&gt;fops-&gt;getxattr,</div><div class='del'>-					    loc,</div><div class='del'>-					    name);</div><div class='del'>-				if (!--count)</div><div class='del'>-					break;</div><div class='del'>-			}</div><div class='del'>-		}</div><div class='del'>-	} else {</div><div class='del'>-		dict_t *tmp_dict = get_new_dict ();</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_DEBUG, </div><div class='del'>-			"%s: returning ENODATA, no file found on storage node",</div><div class='del'>-			loc-&gt;path);</div><div class='del'>-		STACK_UNWIND (frame, -1, ENODATA, tmp_dict);</div><div class='del'>-		dict_destroy (tmp_dict);</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-/**</div><div class='del'>- * unify_removexattr_cbk - Wait till all the child node returns the call</div><div class='del'>- *      and then UNWIND to above layer.</div><div class='del'>- */</div><div class='del'>-int32_t</div><div class='del'>-unify_removexattr_cbk (call_frame_t *frame,</div><div class='del'>-		       void *cookie,</div><div class='del'>-		       xlator_t *this,</div><div class='del'>-		       int32_t op_ret,</div><div class='del'>-		       int32_t op_errno)</div><div class='del'>-{</div><div class='del'>-	int32_t callcnt = 0;</div><div class='del'>-	unify_local_t *local = frame-&gt;local;</div><div class='del'>-	call_frame_t *prev_frame = cookie;</div><div class='del'>-</div><div class='del'>-	LOCK (&amp;frame-&gt;lock);</div><div class='del'>-	{ </div><div class='del'>-		callcnt = --local-&gt;call_count;</div><div class='del'>-		if (op_ret == -1) {</div><div class='del'>-			local-&gt;op_errno = op_errno;</div><div class='del'>-			if (op_errno != ENOTSUP)</div><div class='del'>-				gf_log (this-&gt;name, GF_LOG_ERROR, </div><div class='del'>-					"child(%s): path(%s): %s", </div><div class='del'>-					prev_frame-&gt;this-&gt;name, </div><div class='del'>-					local-&gt;loc1.path, strerror (op_errno));</div><div class='del'>-		} else {</div><div class='del'>-			local-&gt;op_ret = op_ret;</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='del'>-	UNLOCK (&amp;frame-&gt;lock);  </div><div class='del'>-</div><div class='del'>-	if (!callcnt) {</div><div class='del'>-		STACK_UNWIND (frame, local-&gt;op_ret, local-&gt;op_errno);</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-/**</div><div class='del'>- * unify_removexattr - Send it to all the child nodes which has the files.</div><div class='del'>- */</div><div class='del'>-int32_t</div><div class='del'>-unify_removexattr (call_frame_t *frame,</div><div class='del'>-		   xlator_t *this,</div><div class='del'>-		   loc_t *loc,</div><div class='del'>-		   const char *name)</div><div class='del'>-{</div><div class='del'>-	unify_private_t *priv = this-&gt;private;</div><div class='del'>-	unify_local_t *local = NULL;</div><div class='del'>-	int16_t *list = NULL;</div><div class='del'>-	int16_t index = 0;</div><div class='del'>-	int32_t call_count = 0;</div><div class='del'>-  	uint64_t tmp_list = 0;</div><div class='del'>-</div><div class='del'>-	UNIFY_CHECK_INODE_CTX_AND_UNWIND_ON_ERR (loc);</div><div class='del'>-</div><div class='del'>-	/* Initialization */</div><div class='del'>-	INIT_LOCAL (frame, local);</div><div class='del'>-</div><div class='del'>-	if (IA_ISDIR (loc-&gt;inode-&gt;ia_type)) {</div><div class='del'>-		local-&gt;call_count = priv-&gt;child_count;</div><div class='del'>-		for (index = 0; index &lt; priv-&gt;child_count; index++)</div><div class='del'>-			STACK_WIND (frame, 		    </div><div class='del'>-				    unify_removexattr_cbk,</div><div class='del'>-				    priv-&gt;xl_array[index],</div><div class='del'>-				    priv-&gt;xl_array[index]-&gt;fops-&gt;removexattr,</div><div class='del'>-				    loc,</div><div class='del'>-				    name);</div><div class='del'>-</div><div class='del'>-		return 0;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	inode_ctx_get (loc-&gt;inode, this, &amp;tmp_list);</div><div class='del'>-	list = (int16_t *)(long)tmp_list;</div><div class='del'>-</div><div class='del'>-	for (index = 0; list[index] != -1; index++) {</div><div class='del'>-		if (NS(this) != priv-&gt;xl_array[list[index]]) {</div><div class='del'>-			local-&gt;call_count++;</div><div class='del'>-			call_count++;</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	if (local-&gt;call_count) {</div><div class='del'>-		for (index = 0; list[index] != -1; index++) {</div><div class='del'>-			if (priv-&gt;xl_array[list[index]] != NS(this)) {</div><div class='del'>-				STACK_WIND (frame,</div><div class='del'>-					    unify_removexattr_cbk,</div><div class='del'>-					    priv-&gt;xl_array[list[index]],</div><div class='del'>-					    priv-&gt;xl_array[list[index]]-&gt;fops-&gt;removexattr,</div><div class='del'>-					    loc,</div><div class='del'>-					    name);</div><div class='del'>-				if (!--call_count)</div><div class='del'>-					break;</div><div class='del'>-			}</div><div class='del'>-		}</div><div class='del'>-		return 0;</div><div class='del'>-	} </div><div class='del'>-</div><div class='del'>-	gf_log (this-&gt;name, GF_LOG_DEBUG, </div><div class='del'>-		"%s: returning ENOENT, not found on storage node.", loc-&gt;path);</div><div class='del'>-	STACK_UNWIND (frame, -1, ENOENT);</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int32_t </div><div class='del'>-unify_mknod_unlink_cbk (call_frame_t *frame,</div><div class='del'>-			void *cookie,</div><div class='del'>-			xlator_t *this,</div><div class='del'>-			int32_t op_ret,</div><div class='del'>-			int32_t op_errno,</div><div class='del'>-                        struct iatt *preparent,</div><div class='del'>-                        struct iatt *postparent)</div><div class='del'>-{</div><div class='del'>-	unify_local_t *local = frame-&gt;local;</div><div class='del'>-</div><div class='del'>-	if (op_ret == -1)</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_ERROR, </div><div class='del'>-			"%s: %s", local-&gt;loc1.path, strerror (op_errno));</div><div class='del'>-  </div><div class='del'>-	unify_local_wipe (local);</div><div class='del'>-	/* No log required here as this -1 is for mknod call */</div><div class='del'>-	STACK_UNWIND (frame, -1, local-&gt;op_errno, NULL, NULL);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-/**</div><div class='del'>- * unify_mknod_cbk - </div><div class='del'>- */</div><div class='del'>-int32_t</div><div class='del'>-unify_mknod_cbk (call_frame_t *frame,</div><div class='del'>-		 void *cookie,</div><div class='del'>-		 xlator_t *this,</div><div class='del'>-		 int32_t op_ret,</div><div class='del'>-		 int32_t op_errno,</div><div class='del'>-		 inode_t *inode,</div><div class='del'>-                 struct iatt *buf,</div><div class='del'>-                 struct iatt *preparent,</div><div class='del'>-                 struct iatt *postparent)</div><div class='del'>-{</div><div class='del'>-	unify_local_t *local = frame-&gt;local;</div><div class='del'>-</div><div class='del'>-	if (op_ret == -1) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_ERROR, </div><div class='del'>-			"mknod failed on storage node, sending unlink to "</div><div class='del'>-			"namespace");</div><div class='del'>-		local-&gt;op_errno = op_errno;</div><div class='del'>-		STACK_WIND (frame,</div><div class='del'>-			    unify_mknod_unlink_cbk,</div><div class='del'>-			    NS(this),</div><div class='del'>-			    NS(this)-&gt;fops-&gt;unlink,</div><div class='del'>-			    &amp;local-&gt;loc1);</div><div class='del'>-		return 0;</div><div class='del'>-	}</div><div class='del'>-  </div><div class='del'>-	local-&gt;stbuf = *buf;</div><div class='del'>-	local-&gt;stbuf.ia_ino = local-&gt;ia_ino;</div><div class='del'>-	unify_local_wipe (local);</div><div class='del'>-	STACK_UNWIND (frame, op_ret, op_errno, inode, &amp;local-&gt;stbuf,</div><div class='del'>-                      &amp;local-&gt;oldpreparent, &amp;local-&gt;oldpostparent);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-/**</div><div class='del'>- * unify_ns_mknod_cbk - </div><div class='del'>- */</div><div class='del'>-int32_t</div><div class='del'>-unify_ns_mknod_cbk (call_frame_t *frame,</div><div class='del'>-		    void *cookie,</div><div class='del'>-		    xlator_t *this,</div><div class='del'>-		    int32_t op_ret,</div><div class='del'>-		    int32_t op_errno,</div><div class='del'>-		    inode_t *inode,</div><div class='del'>-                    struct iatt *buf,</div><div class='del'>-                    struct iatt *preparent,</div><div class='del'>-                    struct iatt *postparent)</div><div class='del'>-{</div><div class='del'>-	struct sched_ops *sched_ops = NULL;</div><div class='del'>-	xlator_t *sched_xl = NULL;</div><div class='del'>-	unify_local_t *local = frame-&gt;local;</div><div class='del'>-	unify_private_t *priv = this-&gt;private;</div><div class='del'>-	int16_t *list = NULL;</div><div class='del'>-	int16_t index = 0;</div><div class='del'>-	call_frame_t *prev_frame = cookie;</div><div class='del'>-</div><div class='del'>-	if (op_ret == -1) {</div><div class='del'>-		/* No need to send mknod request to other servers, </div><div class='del'>-		 * as namespace action failed </div><div class='del'>-		 */</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_ERROR, </div><div class='del'>-			"child(%s): path(%s): %s", </div><div class='del'>-			prev_frame-&gt;this-&gt;name, local-&gt;loc1.path, </div><div class='del'>-			strerror (op_errno));</div><div class='del'>-		unify_local_wipe (local);</div><div class='del'>-		STACK_UNWIND (frame, op_ret, op_errno, inode, buf,</div><div class='del'>-                              preparent, postparent);</div><div class='del'>-		return 0;</div><div class='del'>-	}</div><div class='del'>-  </div><div class='del'>-	/* Create one inode for this entry */</div><div class='del'>-	local-&gt;op_ret = 0;</div><div class='del'>-	local-&gt;stbuf = *buf;</div><div class='del'>-	local-&gt;ia_ino = buf-&gt;ia_ino;</div><div class='del'>-</div><div class='del'>-        local-&gt;oldpreparent = *preparent;</div><div class='del'>-        local-&gt;oldpostparent = *postparent;</div><div class='del'>-</div><div class='del'>-	list = GF_CALLOC (1, sizeof (int16_t) * 3, gf_unify_mt_int16_t);</div><div class='del'>-	ERR_ABORT (list);</div><div class='del'>-	list[0] = priv-&gt;child_count;</div><div class='del'>-	list[2] = -1;</div><div class='del'>-	inode_ctx_put (inode, this, (uint64_t)(long)list);</div><div class='del'>-</div><div class='del'>-	sched_ops = priv-&gt;sched_ops;</div><div class='del'>-</div><div class='del'>-	/* Send mknod request to scheduled node now */</div><div class='del'>-	sched_xl = sched_ops-&gt;schedule (this, local-&gt;loc1.path); </div><div class='del'>-	if (!sched_xl) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_ERROR, </div><div class='del'>-			"mknod failed on storage node, no node online "</div><div class='del'>-			"at the moment, sending unlink to NS");</div><div class='del'>-		local-&gt;op_errno = ENOTCONN;</div><div class='del'>-		STACK_WIND (frame,</div><div class='del'>-			    unify_mknod_unlink_cbk,</div><div class='del'>-			    NS(this),</div><div class='del'>-			    NS(this)-&gt;fops-&gt;unlink,</div><div class='del'>-			    &amp;local-&gt;loc1);</div><div class='del'>-      </div><div class='del'>-		return 0;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	for (index = 0; index &lt; priv-&gt;child_count; index++)</div><div class='del'>-		if (sched_xl == priv-&gt;xl_array[index])</div><div class='del'>-			break;</div><div class='del'>-	list[1] = index;</div><div class='del'>-  </div><div class='del'>-	STACK_WIND (frame,  unify_mknod_cbk,</div><div class='del'>-		    sched_xl,  sched_xl-&gt;fops-&gt;mknod,</div><div class='del'>-		    &amp;local-&gt;loc1, local-&gt;mode, local-&gt;dev);</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-/**</div><div class='del'>- * unify_mknod - Create a device on namespace first, and later create on </div><div class='del'>- *       the storage node.</div><div class='del'>- */</div><div class='del'>-int32_t</div><div class='del'>-unify_mknod (call_frame_t *frame,</div><div class='del'>-	     xlator_t *this,</div><div class='del'>-	     loc_t *loc,</div><div class='del'>-	     mode_t mode,</div><div class='del'>-	     dev_t rdev)</div><div class='del'>-{</div><div class='del'>-	unify_local_t *local = NULL;</div><div class='del'>-  </div><div class='del'>-	/* Initialization */</div><div class='del'>-	INIT_LOCAL (frame, local);</div><div class='del'>-	local-&gt;mode = mode;</div><div class='del'>-	local-&gt;dev = rdev;</div><div class='del'>-	loc_copy (&amp;local-&gt;loc1, loc);</div><div class='del'>-	if (local-&gt;loc1.path == NULL) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_CRITICAL, "Not enough memory :O");</div><div class='del'>-		STACK_UNWIND (frame, -1, ENOMEM, loc-&gt;inode, NULL);</div><div class='del'>-		return 0;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	STACK_WIND (frame,</div><div class='del'>-		    unify_ns_mknod_cbk,</div><div class='del'>-		    NS(this),</div><div class='del'>-		    NS(this)-&gt;fops-&gt;mknod,</div><div class='del'>-		    loc,</div><div class='del'>-		    mode,</div><div class='del'>-		    rdev);</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t </div><div class='del'>-unify_symlink_unlink_cbk (call_frame_t *frame,</div><div class='del'>-			  void *cookie,</div><div class='del'>-			  xlator_t *this,</div><div class='del'>-			  int32_t op_ret,</div><div class='del'>-			  int32_t op_errno,</div><div class='del'>-                          struct iatt *preparent,</div><div class='del'>-                          struct iatt *postparent)</div><div class='del'>-{</div><div class='del'>-	unify_local_t *local = frame-&gt;local;</div><div class='del'>-	if (op_ret == -1)</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_ERROR, </div><div class='del'>-			"%s: %s", local-&gt;loc1.path, strerror (op_errno));</div><div class='del'>-</div><div class='del'>-	unify_local_wipe (local);</div><div class='del'>-	STACK_UNWIND (frame, -1, local-&gt;op_errno, NULL, NULL);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-/**</div><div class='del'>- * unify_symlink_cbk - </div><div class='del'>- */</div><div class='del'>-int32_t</div><div class='del'>-unify_symlink_cbk (call_frame_t *frame,</div><div class='del'>-		   void *cookie,</div><div class='del'>-		   xlator_t *this,</div><div class='del'>-		   int32_t op_ret,</div><div class='del'>-		   int32_t op_errno,</div><div class='del'>-		   inode_t *inode,</div><div class='del'>-                   struct iatt *buf,</div><div class='del'>-                   struct iatt *preparent,</div><div class='del'>-                   struct iatt *postparent)</div><div class='del'>-{</div><div class='del'>-	unify_local_t *local = frame-&gt;local;</div><div class='del'>-</div><div class='del'>-	if (op_ret == -1) {</div><div class='del'>-		/* Symlink on storage node failed, hence send unlink </div><div class='del'>-		   to the NS node */</div><div class='del'>-		local-&gt;op_errno = op_errno;</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_ERROR, </div><div class='del'>-			"symlink on storage node failed, sending unlink "</div><div class='del'>-			"to namespace");</div><div class='del'>-</div><div class='del'>-		STACK_WIND (frame,</div><div class='del'>-			    unify_symlink_unlink_cbk,</div><div class='del'>-			    NS(this),</div><div class='del'>-			    NS(this)-&gt;fops-&gt;unlink,</div><div class='del'>-			    &amp;local-&gt;loc1);</div><div class='del'>-    </div><div class='del'>-		return 0;</div><div class='del'>-	}</div><div class='del'>-  </div><div class='del'>-	local-&gt;stbuf = *buf;</div><div class='del'>-	local-&gt;stbuf.ia_ino = local-&gt;ia_ino;</div><div class='del'>-	unify_local_wipe (local);</div><div class='del'>-	STACK_UNWIND (frame, op_ret, op_errno, inode, &amp;local-&gt;stbuf,</div><div class='del'>-                      &amp;local-&gt;oldpreparent, &amp;local-&gt;oldpostparent);</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-/**</div><div class='del'>- * unify_ns_symlink_cbk - </div><div class='del'>- */</div><div class='del'>-int32_t</div><div class='del'>-unify_ns_symlink_cbk (call_frame_t *frame,</div><div class='del'>-		      void *cookie,</div><div class='del'>-		      xlator_t *this,</div><div class='del'>-		      int32_t op_ret,</div><div class='del'>-		      int32_t op_errno,</div><div class='del'>-		      inode_t *inode,</div><div class='del'>-                      struct iatt *buf,</div><div class='del'>-                      struct iatt *preparent,</div><div class='del'>-                      struct iatt *postparent)</div><div class='del'>-{</div><div class='del'>-</div><div class='del'>-	struct sched_ops *sched_ops = NULL;</div><div class='del'>-	xlator_t *sched_xl = NULL;</div><div class='del'>-	int16_t *list = NULL;</div><div class='del'>-	unify_local_t *local = frame-&gt;local;</div><div class='del'>-	unify_private_t *priv = this-&gt;private;</div><div class='del'>-	int16_t index = 0;</div><div class='del'>-</div><div class='del'>-	if (op_ret == -1) {</div><div class='del'>-		/* No need to send symlink request to other servers, </div><div class='del'>-		 * as namespace action failed </div><div class='del'>-		 */</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_ERROR, </div><div class='del'>-			"namespace: path(%s): %s", </div><div class='del'>-			local-&gt;loc1.path, strerror (op_errno));</div><div class='del'>-		unify_local_wipe (local);</div><div class='del'>-		STACK_UNWIND (frame, op_ret, op_errno, NULL, buf,</div><div class='del'>-                              preparent, postparent);</div><div class='del'>-		return 0;</div><div class='del'>-	}</div><div class='del'>-  </div><div class='del'>-	/* Create one inode for this entry */</div><div class='del'>-	local-&gt;op_ret = 0;</div><div class='del'>-	local-&gt;ia_ino = buf-&gt;ia_ino;</div><div class='del'>-  </div><div class='del'>-        local-&gt;oldpreparent = *preparent;</div><div class='del'>-        local-&gt;oldpostparent = *postparent;</div><div class='del'>-</div><div class='del'>-	/* Start the mapping list */</div><div class='del'>-</div><div class='del'>-	list = GF_CALLOC (1, sizeof (int16_t) * 3, gf_unify_mt_int16_t);</div><div class='del'>-	ERR_ABORT (list);</div><div class='del'>-	list[0] = priv-&gt;child_count; //namespace's index</div><div class='del'>-	list[2] = -1;</div><div class='del'>-	inode_ctx_put (inode, this, (uint64_t)(long)list);</div><div class='del'>-</div><div class='del'>-	sched_ops = priv-&gt;sched_ops;</div><div class='del'>-</div><div class='del'>-	/* Send symlink request to all the nodes now */</div><div class='del'>-	sched_xl = sched_ops-&gt;schedule (this, local-&gt;loc1.path); </div><div class='del'>-	if (!sched_xl) {</div><div class='del'>-		/* Symlink on storage node failed, hence send unlink </div><div class='del'>-		   to the NS node */</div><div class='del'>-		local-&gt;op_errno = ENOTCONN;</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_ERROR, </div><div class='del'>-			"symlink on storage node failed, no node online, "</div><div class='del'>-			"sending unlink to namespace");</div><div class='del'>-      </div><div class='del'>-		STACK_WIND (frame,</div><div class='del'>-			    unify_symlink_unlink_cbk,</div><div class='del'>-			    NS(this),</div><div class='del'>-			    NS(this)-&gt;fops-&gt;unlink,</div><div class='del'>-			    &amp;local-&gt;loc1);</div><div class='del'>-      </div><div class='del'>-		return 0;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	for (index = 0; index &lt; priv-&gt;child_count; index++)</div><div class='del'>-		if (sched_xl == priv-&gt;xl_array[index])</div><div class='del'>-			break;</div><div class='del'>-	list[1] = index;</div><div class='del'>-	</div><div class='del'>-	STACK_WIND (frame,</div><div class='del'>-		    unify_symlink_cbk,</div><div class='del'>-		    sched_xl,</div><div class='del'>-		    sched_xl-&gt;fops-&gt;symlink,</div><div class='del'>-		    local-&gt;name,</div><div class='del'>-		    &amp;local-&gt;loc1);</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-/**</div><div class='del'>- * unify_symlink - </div><div class='del'>- */</div><div class='del'>-int32_t</div><div class='del'>-unify_symlink (call_frame_t *frame,</div><div class='del'>-	       xlator_t *this,</div><div class='del'>-	       const char *linkpath,</div><div class='del'>-	       loc_t *loc)</div><div class='del'>-{</div><div class='del'>-	unify_local_t *local = NULL;</div><div class='del'>-  </div><div class='del'>-	/* Initialization */</div><div class='del'>-	INIT_LOCAL (frame, local);</div><div class='del'>-	loc_copy (&amp;local-&gt;loc1, loc);</div><div class='del'>-	local-&gt;name = gf_strdup (linkpath);</div><div class='del'>-</div><div class='del'>-	if ((local-&gt;name == NULL) || </div><div class='del'>-	    (local-&gt;loc1.path == NULL)) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_CRITICAL, "Not enough memory :O");</div><div class='del'>-		STACK_UNWIND (frame, -1, ENOMEM, loc-&gt;inode, NULL);</div><div class='del'>-		return 0;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	STACK_WIND (frame,</div><div class='del'>-		    unify_ns_symlink_cbk,</div><div class='del'>-		    NS(this),</div><div class='del'>-		    NS(this)-&gt;fops-&gt;symlink,</div><div class='del'>-		    linkpath,</div><div class='del'>-		    loc);</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int32_t </div><div class='del'>-unify_rename_unlink_cbk (call_frame_t *frame,</div><div class='del'>-			 void *cookie,</div><div class='del'>-			 xlator_t *this,</div><div class='del'>-			 int32_t op_ret,</div><div class='del'>-			 int32_t op_errno,</div><div class='del'>-                         struct iatt *preparent,</div><div class='del'>-                         struct iatt *postparent)</div><div class='del'>-{</div><div class='del'>-	int32_t callcnt = 0;</div><div class='del'>-	unify_local_t *local = frame-&gt;local;</div><div class='del'>-	call_frame_t *prev_frame = cookie;</div><div class='del'>-  </div><div class='del'>-	if (op_ret == -1) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_ERROR, </div><div class='del'>-			"child(%s): path(%s -&gt; %s): %s", </div><div class='del'>-			prev_frame-&gt;this-&gt;name, </div><div class='del'>-			local-&gt;loc1.path, local-&gt;loc2.path, </div><div class='del'>-			strerror (op_errno));</div><div class='del'>-      </div><div class='del'>-	}</div><div class='del'>-	LOCK (&amp;frame-&gt;lock);</div><div class='del'>-	{</div><div class='del'>-		callcnt = --local-&gt;call_count;</div><div class='del'>-	}</div><div class='del'>-	UNLOCK (&amp;frame-&gt;lock);</div><div class='del'>-</div><div class='del'>-	if (!callcnt) {</div><div class='del'>-		local-&gt;stbuf.ia_ino = local-&gt;ia_ino;</div><div class='del'>-		unify_local_wipe (local);</div><div class='del'>-		STACK_UNWIND (frame, local-&gt;op_ret, local-&gt;op_errno, </div><div class='del'>-			      &amp;local-&gt;stbuf);</div><div class='del'>-	}</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t </div><div class='del'>-unify_ns_rename_undo_cbk (call_frame_t *frame,</div><div class='del'>-			  void *cookie,</div><div class='del'>-			  xlator_t *this,</div><div class='del'>-			  int32_t op_ret,</div><div class='del'>-			  int32_t op_errno,</div><div class='del'>-			  struct iatt *buf,</div><div class='del'>-                          struct iatt *preoldparent,</div><div class='del'>-                          struct iatt *postoldparent,</div><div class='del'>-                          struct iatt *prenewparent,</div><div class='del'>-                          struct iatt *postnewparent)</div><div class='del'>-{</div><div class='del'>-	unify_local_t *local = frame-&gt;local;</div><div class='del'>-</div><div class='del'>-	if (op_ret == -1) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_ERROR, </div><div class='del'>-			"namespace: path(%s -&gt; %s): %s", </div><div class='del'>-			local-&gt;loc1.path, local-&gt;loc2.path, </div><div class='del'>-			strerror (op_errno));</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	local-&gt;stbuf.ia_ino = local-&gt;ia_ino;</div><div class='del'>-	unify_local_wipe (local);</div><div class='del'>-	STACK_UNWIND (frame, local-&gt;op_ret, local-&gt;op_errno, &amp;local-&gt;stbuf);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t </div><div class='del'>-unify_rename_cbk (call_frame_t *frame,</div><div class='del'>-		  void *cookie,</div><div class='del'>-		  xlator_t *this,</div><div class='del'>-		  int32_t op_ret,</div><div class='del'>-		  int32_t op_errno,</div><div class='del'>-		  struct iatt *buf,</div><div class='del'>-                  struct iatt *preoldparent,</div><div class='del'>-                  struct iatt *postoldparent,</div><div class='del'>-                  struct iatt *prenewparent,</div><div class='del'>-                  struct iatt *postnewparent)</div><div class='del'>-{</div><div class='del'>-	int32_t index = 0;</div><div class='del'>-	int32_t callcnt = 0;</div><div class='del'>-	int16_t *list = NULL;</div><div class='del'>-	unify_private_t *priv = this-&gt;private;</div><div class='del'>-	unify_local_t *local = frame-&gt;local;</div><div class='del'>-	call_frame_t *prev_frame = cookie;</div><div class='del'>-  </div><div class='del'>-	LOCK (&amp;frame-&gt;lock);</div><div class='del'>-	{</div><div class='del'>-		callcnt = --local-&gt;call_count;</div><div class='del'>-		if (op_ret &gt;= 0) {</div><div class='del'>-			if (!IA_ISDIR (buf-&gt;ia_type))</div><div class='del'>-				local-&gt;stbuf = *buf;</div><div class='del'>-			local-&gt;op_ret = op_ret;</div><div class='del'>-		} else {</div><div class='del'>-			gf_log (this-&gt;name, GF_LOG_ERROR, </div><div class='del'>-				"child(%s): path(%s -&gt; %s): %s", </div><div class='del'>-				prev_frame-&gt;this-&gt;name, </div><div class='del'>-				local-&gt;loc1.path, local-&gt;loc2.path, </div><div class='del'>-				strerror (op_errno));</div><div class='del'>-			local-&gt;op_errno = op_errno;</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='del'>-	UNLOCK (&amp;frame-&gt;lock);</div><div class='del'>-</div><div class='del'>-	if (!callcnt) {</div><div class='del'>-		local-&gt;stbuf.ia_ino = local-&gt;ia_ino;</div><div class='del'>-		if (IA_ISDIR (local-&gt;loc1.inode-&gt;ia_type)) {</div><div class='del'>-			unify_local_wipe (local);</div><div class='del'>-			STACK_UNWIND (frame, local-&gt;op_ret, local-&gt;op_errno,</div><div class='del'>-                                      &amp;local-&gt;stbuf, &amp;local-&gt;oldpreparent,</div><div class='del'>-                                      &amp;local-&gt;oldpostparent, &amp;local-&gt;newpreparent,</div><div class='del'>-                                      &amp;local-&gt;newpostparent);</div><div class='del'>-			return 0;</div><div class='del'>-		}</div><div class='del'>-</div><div class='del'>-		if (local-&gt;op_ret == -1) {</div><div class='del'>-			/* TODO: check this logic */</div><div class='del'>-</div><div class='del'>-			/* Rename failed in storage node, successful on NS, </div><div class='del'>-			 * hence, rename back the entries in NS */</div><div class='del'>-			/* NOTE: this will be done only if the destination </div><div class='del'>-			 * doesn't exists, if  the destination exists, the </div><div class='del'>-			 * job of correcting NS is left to self-heal</div><div class='del'>-			 */</div><div class='del'>-			if (!local-&gt;index) {</div><div class='del'>-				loc_t tmp_oldloc = {</div><div class='del'>-                                        /* its actual 'newloc-&gt;path' */</div><div class='del'>-					.path = local-&gt;loc2.path, </div><div class='del'>-					.inode = local-&gt;loc1.inode,</div><div class='del'>-					.parent = local-&gt;loc2.parent</div><div class='del'>-				};</div><div class='del'>-	</div><div class='del'>-				loc_t tmp_newloc = {</div><div class='del'>-					/* Actual 'oldloc-&gt;path' */</div><div class='del'>-					.path = local-&gt;loc1.path,</div><div class='del'>-					.parent = local-&gt;loc1.parent</div><div class='del'>-				};</div><div class='del'>-</div><div class='del'>-				gf_log (this-&gt;name, GF_LOG_ERROR, </div><div class='del'>-					"rename succussful on namespace, on "</div><div class='del'>-					"stroage node failed, reverting back");</div><div class='del'>-</div><div class='del'>-				STACK_WIND (frame,</div><div class='del'>-					    unify_ns_rename_undo_cbk,</div><div class='del'>-					    NS(this),</div><div class='del'>-					    NS(this)-&gt;fops-&gt;rename,</div><div class='del'>-					    &amp;tmp_oldloc,</div><div class='del'>-					    &amp;tmp_newloc);</div><div class='del'>-				return 0;</div><div class='del'>-			}</div><div class='del'>-		} else {</div><div class='del'>-			/* Rename successful on storage nodes */</div><div class='del'>-</div><div class='del'>-			int32_t idx = 0;</div><div class='del'>-			int16_t *tmp_list = NULL;</div><div class='del'>-			uint64_t tmp_list_int64 = 0;</div><div class='del'>-			if (local-&gt;loc2.inode) {</div><div class='del'>-				inode_ctx_get (local-&gt;loc2.inode, </div><div class='del'>-					       this, &amp;tmp_list_int64);</div><div class='del'>-				list = (int16_t *)(long)tmp_list_int64;</div><div class='del'>-</div><div class='del'>-			}</div><div class='del'>-</div><div class='del'>-			if (list) {				</div><div class='del'>-				for (index = 0; list[index] != -1; index++);</div><div class='del'>-				tmp_list = GF_CALLOC (1, index * 2, </div><div class='del'>-                                                      gf_unify_mt_int16_t);</div><div class='del'>-				memcpy (tmp_list, list, index * 2);</div><div class='del'>-</div><div class='del'>-				for (index = 0; list[index] != -1; index++) {</div><div class='del'>-					/* TODO: Check this logic. */</div><div class='del'>-					/* If the destination file exists in </div><div class='del'>-					 * the same storage node where we sent</div><div class='del'>-					 * 'rename' call, no need to send </div><div class='del'>-					 * unlink </div><div class='del'>-					 */</div><div class='del'>-					for (idx = 0; </div><div class='del'>-					     local-&gt;list[idx] != -1; idx++) {</div><div class='del'>-						if (tmp_list[index] == local-&gt;list[idx]) {</div><div class='del'>-							tmp_list[index] = priv-&gt;child_count;</div><div class='del'>-							continue;</div><div class='del'>-						}</div><div class='del'>-					}</div><div class='del'>-	  </div><div class='del'>-					if (NS(this) != priv-&gt;xl_array[tmp_list[index]]) {</div><div class='del'>-						local-&gt;call_count++;</div><div class='del'>-						callcnt++;</div><div class='del'>-					}</div><div class='del'>-				}</div><div class='del'>-</div><div class='del'>-				if (local-&gt;call_count) {</div><div class='del'>-					if (callcnt &gt; 1)</div><div class='del'>-						gf_log (this-&gt;name, </div><div class='del'>-							GF_LOG_ERROR, </div><div class='del'>-							"%s-&gt;%s: more (%d) "</div><div class='del'>-							"subvolumes have the "</div><div class='del'>-							"newloc entry", </div><div class='del'>-							local-&gt;loc1.path, </div><div class='del'>-							local-&gt;loc2.path, </div><div class='del'>-							callcnt);</div><div class='del'>-</div><div class='del'>-					for (index=0; </div><div class='del'>-					     tmp_list[index] != -1; index++) {</div><div class='del'>-						if (NS(this) != priv-&gt;xl_array[tmp_list[index]]) {		    </div><div class='del'>-							STACK_WIND (frame,</div><div class='del'>-								    unify_rename_unlink_cbk,</div><div class='del'>-								    priv-&gt;xl_array[tmp_list[index]],</div><div class='del'>-								    priv-&gt;xl_array[tmp_list[index]]-&gt;fops-&gt;unlink,</div><div class='del'>-								    &amp;local-&gt;loc2);</div><div class='del'>-							if (!--callcnt)</div><div class='del'>-								break;</div><div class='del'>-						}</div><div class='del'>-					}</div><div class='del'>-</div><div class='del'>-					GF_FREE (tmp_list);</div><div class='del'>-					return 0;</div><div class='del'>-				}</div><div class='del'>-				if (tmp_list)</div><div class='del'>-					GF_FREE (tmp_list);</div><div class='del'>-			}</div><div class='del'>-		}</div><div class='del'>-    </div><div class='del'>-		/* Need not send 'unlink' to storage node */</div><div class='del'>-		unify_local_wipe (local);</div><div class='del'>-		STACK_UNWIND (frame, local-&gt;op_ret, </div><div class='del'>-			      local-&gt;op_errno, &amp;local-&gt;stbuf,</div><div class='del'>-                              &amp;local-&gt;oldpreparent, &amp;local-&gt;oldpostparent,</div><div class='del'>-                              &amp;local-&gt;newpreparent, &amp;local-&gt;newpostparent);</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t </div><div class='del'>-unify_ns_rename_cbk (call_frame_t *frame,</div><div class='del'>-		     void *cookie,</div><div class='del'>-		     xlator_t *this,</div><div class='del'>-		     int32_t op_ret,</div><div class='del'>-		     int32_t op_errno,</div><div class='del'>-		     struct iatt *buf,</div><div class='del'>-                     struct iatt *preoldparent,</div><div class='del'>-                     struct iatt *postoldparent,</div><div class='del'>-                     struct iatt *prenewparent,</div><div class='del'>-                     struct iatt *postnewparent)</div><div class='del'>-{</div><div class='del'>-	int32_t index = 0;</div><div class='del'>-	int32_t callcnt = 0;</div><div class='del'>-	int16_t *list = NULL;</div><div class='del'>-	unify_private_t *priv = this-&gt;private;</div><div class='del'>-	unify_local_t *local = frame-&gt;local;</div><div class='del'>-</div><div class='del'>-	if (op_ret == -1) {</div><div class='del'>-		/* Free local-&gt;new_inode */</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_ERROR, </div><div class='del'>-			"namespace: path(%s -&gt; %s): %s", </div><div class='del'>-			local-&gt;loc1.path, local-&gt;loc2.path, </div><div class='del'>-			strerror (op_errno));</div><div class='del'>-</div><div class='del'>-		unify_local_wipe (local);</div><div class='del'>-		STACK_UNWIND (frame, op_ret, op_errno, buf,</div><div class='del'>-                              preoldparent, postoldparent,</div><div class='del'>-                              prenewparent, postnewparent);</div><div class='del'>-		return 0;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	local-&gt;stbuf = *buf;</div><div class='del'>-	local-&gt;ia_ino = buf-&gt;ia_ino;</div><div class='del'>-</div><div class='del'>-        local-&gt;oldpreparent = *preoldparent;</div><div class='del'>-        local-&gt;oldpostparent = *postoldparent;</div><div class='del'>-        local-&gt;newpreparent = *prenewparent;</div><div class='del'>-        local-&gt;newpostparent = *postnewparent;</div><div class='del'>-</div><div class='del'>-	/* Everything is fine. */</div><div class='del'>-	if (IA_ISDIR (buf-&gt;ia_type)) {</div><div class='del'>-		local-&gt;call_count = priv-&gt;child_count;</div><div class='del'>-		for (index=0; index &lt; priv-&gt;child_count; index++) {</div><div class='del'>-			STACK_WIND (frame,</div><div class='del'>-				    unify_rename_cbk,</div><div class='del'>-				    priv-&gt;xl_array[index],</div><div class='del'>-				    priv-&gt;xl_array[index]-&gt;fops-&gt;rename,</div><div class='del'>-				    &amp;local-&gt;loc1,</div><div class='del'>-				    &amp;local-&gt;loc2);</div><div class='del'>-		}</div><div class='del'>-</div><div class='del'>-		return 0;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	local-&gt;call_count = 0;  </div><div class='del'>-	/* send rename */</div><div class='del'>-	list = local-&gt;list;</div><div class='del'>-	for (index=0; list[index] != -1; index++) {</div><div class='del'>-		if (NS(this) != priv-&gt;xl_array[list[index]]) {</div><div class='del'>-			local-&gt;call_count++;</div><div class='del'>-			callcnt++;</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	if (local-&gt;call_count) {</div><div class='del'>-		for (index=0; list[index] != -1; index++) {</div><div class='del'>-			if (NS(this) != priv-&gt;xl_array[list[index]]) {</div><div class='del'>-				STACK_WIND (frame,</div><div class='del'>-					    unify_rename_cbk,</div><div class='del'>-					    priv-&gt;xl_array[list[index]],</div><div class='del'>-					    priv-&gt;xl_array[list[index]]-&gt;fops-&gt;rename,</div><div class='del'>-					    &amp;local-&gt;loc1,</div><div class='del'>-					    &amp;local-&gt;loc2);</div><div class='del'>-				if (!--callcnt)</div><div class='del'>-					break;</div><div class='del'>-			}</div><div class='del'>-		}</div><div class='del'>-	} else {</div><div class='del'>-		/* file doesn't seem to be present in storage nodes */</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_CRITICAL,</div><div class='del'>-			"CRITICAL: source file not in storage node, "</div><div class='del'>-			"rename successful on namespace :O");</div><div class='del'>-		unify_local_wipe (local);</div><div class='del'>-		STACK_UNWIND (frame, -1, EIO, NULL,</div><div class='del'>-                              NULL, NULL, /* preoldparent, postoldparent */</div><div class='del'>-                              NULL, NULL); /* prenewparent, postnewparent */</div><div class='del'>-	}</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-/**</div><div class='del'>- * unify_rename - One of the tricky function. The deadliest of all :O</div><div class='del'>- */</div><div class='del'>-int32_t</div><div class='del'>-unify_rename (call_frame_t *frame,</div><div class='del'>-	      xlator_t *this,</div><div class='del'>-	      loc_t *oldloc,</div><div class='del'>-	      loc_t *newloc)</div><div class='del'>-{</div><div class='del'>-	unify_local_t *local = NULL;</div><div class='del'>-  	uint64_t tmp_list = 0;</div><div class='del'>-</div><div class='del'>-	/* Initialization */</div><div class='del'>-	INIT_LOCAL (frame, local);</div><div class='del'>-	loc_copy (&amp;local-&gt;loc1, oldloc);</div><div class='del'>-	loc_copy (&amp;local-&gt;loc2, newloc);</div><div class='del'>-</div><div class='del'>-	if ((local-&gt;loc1.path == NULL) || </div><div class='del'>-	    (local-&gt;loc2.path == NULL)) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_CRITICAL, "Not enough memory :O");</div><div class='del'>-		STACK_UNWIND (frame, -1, ENOMEM, NULL,</div><div class='del'>-                              NULL, NULL, /* preoldparent, postoldparent */</div><div class='del'>-                              NULL, NULL); /* prenewparent, postnewparent */</div><div class='del'>-		return 0;</div><div class='del'>-	}</div><div class='del'>-  </div><div class='del'>-	inode_ctx_get (oldloc-&gt;inode, this, &amp;tmp_list);</div><div class='del'>-	local-&gt;list = (int16_t *)(long)tmp_list;</div><div class='del'>-</div><div class='del'>-	STACK_WIND (frame,</div><div class='del'>-		    unify_ns_rename_cbk,</div><div class='del'>-		    NS(this),</div><div class='del'>-		    NS(this)-&gt;fops-&gt;rename,</div><div class='del'>-		    oldloc,</div><div class='del'>-		    newloc);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-/**</div><div class='del'>- * unify_link_cbk -</div><div class='del'>- */</div><div class='del'>-int32_t</div><div class='del'>-unify_link_cbk (call_frame_t *frame,</div><div class='del'>-		void *cookie,</div><div class='del'>-		xlator_t *this,</div><div class='del'>-		int32_t op_ret,</div><div class='del'>-		int32_t op_errno,</div><div class='del'>-		inode_t *inode,</div><div class='del'>-                struct iatt *buf,</div><div class='del'>-                struct iatt *preparent,</div><div class='del'>-                struct iatt *postparent)</div><div class='del'>-{</div><div class='del'>-	unify_local_t *local = frame-&gt;local;</div><div class='del'>-</div><div class='del'>-	if (op_ret &gt;= 0) </div><div class='del'>-		local-&gt;stbuf = *buf;</div><div class='del'>-	local-&gt;stbuf.ia_ino = local-&gt;ia_ino;</div><div class='del'>-</div><div class='del'>-	unify_local_wipe (local);</div><div class='del'>-	STACK_UNWIND (frame, op_ret, op_errno, inode, &amp;local-&gt;stbuf,</div><div class='del'>-                      &amp;local-&gt;oldpreparent, &amp;local-&gt;oldpostparent);</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-/**</div><div class='del'>- * unify_ns_link_cbk - </div><div class='del'>- */</div><div class='del'>-int32_t</div><div class='del'>-unify_ns_link_cbk (call_frame_t *frame,</div><div class='del'>-		   void *cookie,</div><div class='del'>-		   xlator_t *this,</div><div class='del'>-		   int32_t op_ret,</div><div class='del'>-		   int32_t op_errno,</div><div class='del'>-		   inode_t *inode,</div><div class='del'>-                   struct iatt *buf,</div><div class='del'>-                   struct iatt *preparent,</div><div class='del'>-                   struct iatt *postparent)</div><div class='del'>-{</div><div class='del'>-	unify_private_t *priv = this-&gt;private;</div><div class='del'>-	unify_local_t *local = frame-&gt;local;</div><div class='del'>-	int16_t *list = local-&gt;list;</div><div class='del'>-	int16_t index = 0;</div><div class='del'>-</div><div class='del'>-	if (op_ret == -1) {</div><div class='del'>-		/* No need to send link request to other servers, </div><div class='del'>-		 * as namespace action failed </div><div class='del'>-		 */</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_ERROR, </div><div class='del'>-			"namespace: path(%s -&gt; %s): %s", </div><div class='del'>-			local-&gt;loc1.path, local-&gt;loc2.path, </div><div class='del'>-			strerror (op_errno));</div><div class='del'>-		unify_local_wipe (local);</div><div class='del'>-		STACK_UNWIND (frame, op_ret, op_errno, inode, buf,</div><div class='del'>-                              preparent, postparent);</div><div class='del'>-		return 0;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	/* Update inode for this entry */</div><div class='del'>-	local-&gt;op_ret = 0;</div><div class='del'>-	local-&gt;ia_ino = buf-&gt;ia_ino;</div><div class='del'>-</div><div class='del'>-        local-&gt;oldpreparent = *preparent;</div><div class='del'>-        local-&gt;oldpostparent = *postparent;</div><div class='del'>-</div><div class='del'>-	/* Send link request to the node now */</div><div class='del'>-	for (index = 0; list[index] != -1; index++) {</div><div class='del'>-		char need_break = (list[index+1] == -1);</div><div class='del'>-		if (priv-&gt;xl_array[list[index]] != NS (this)) {</div><div class='del'>-			STACK_WIND (frame,</div><div class='del'>-				    unify_link_cbk,</div><div class='del'>-				    priv-&gt;xl_array[list[index]],</div><div class='del'>-				    priv-&gt;xl_array[list[index]]-&gt;fops-&gt;link,</div><div class='del'>-				    &amp;local-&gt;loc1,</div><div class='del'>-				    &amp;local-&gt;loc2);</div><div class='del'>-                        break;</div><div class='del'>-		}</div><div class='del'>-		if (need_break)</div><div class='del'>-			break;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-/**</div><div class='del'>- * unify_link - </div><div class='del'>- */</div><div class='del'>-int32_t</div><div class='del'>-unify_link (call_frame_t *frame,</div><div class='del'>-	    xlator_t *this,</div><div class='del'>-	    loc_t *oldloc,</div><div class='del'>-	    loc_t *newloc)</div><div class='del'>-{</div><div class='del'>-	unify_local_t *local = NULL;</div><div class='del'>-  	uint64_t tmp_list = 0;</div><div class='del'>-</div><div class='del'>-	UNIFY_CHECK_INODE_CTX_AND_UNWIND_ON_ERR (oldloc);</div><div class='del'>-	UNIFY_CHECK_INODE_CTX_AND_UNWIND_ON_ERR (newloc);</div><div class='del'>-</div><div class='del'>-	/* Initialization */</div><div class='del'>-	INIT_LOCAL (frame, local);</div><div class='del'>-</div><div class='del'>-	loc_copy (&amp;local-&gt;loc1, oldloc);</div><div class='del'>-	loc_copy (&amp;local-&gt;loc2, newloc);</div><div class='del'>-</div><div class='del'>-	inode_ctx_get (oldloc-&gt;inode, this, &amp;tmp_list);</div><div class='del'>-	local-&gt;list = (int16_t *)(long)tmp_list;</div><div class='del'>-</div><div class='del'>-	STACK_WIND (frame,</div><div class='del'>-		    unify_ns_link_cbk,</div><div class='del'>-		    NS(this),</div><div class='del'>-		    NS(this)-&gt;fops-&gt;link,</div><div class='del'>-		    oldloc,</div><div class='del'>-		    newloc);</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-/**</div><div class='del'>- * unify_checksum_cbk - </div><div class='del'>- */</div><div class='del'>-int32_t</div><div class='del'>-unify_checksum_cbk (call_frame_t *frame,</div><div class='del'>-		    void *cookie,</div><div class='del'>-		    xlator_t *this,</div><div class='del'>-		    int32_t op_ret,</div><div class='del'>-		    int32_t op_errno,</div><div class='del'>-		    uint8_t *fchecksum,</div><div class='del'>-		    uint8_t *dchecksum)</div><div class='del'>-{</div><div class='del'>-	STACK_UNWIND (frame, op_ret, op_errno, fchecksum, dchecksum);</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-/**</div><div class='del'>- * unify_checksum - </div><div class='del'>- */</div><div class='del'>-int32_t</div><div class='del'>-unify_checksum (call_frame_t *frame,</div><div class='del'>-		xlator_t *this,</div><div class='del'>-		loc_t *loc,</div><div class='del'>-		int32_t flag)</div><div class='del'>-{</div><div class='del'>-	STACK_WIND (frame,</div><div class='del'>-		    unify_checksum_cbk,</div><div class='del'>-		    NS(this),</div><div class='del'>-		    NS(this)-&gt;fops-&gt;checksum,</div><div class='del'>-		    loc,</div><div class='del'>-		    flag);</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-/**</div><div class='del'>- * unify_finodelk_cbk - </div><div class='del'>- */</div><div class='del'>-int</div><div class='del'>-unify_finodelk_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-		    int32_t op_ret, int32_t op_errno)</div><div class='del'>-{</div><div class='del'>-	STACK_UNWIND (frame, op_ret, op_errno);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-/**</div><div class='del'>- * unify_finodelk</div><div class='del'>- */</div><div class='del'>-int</div><div class='del'>-unify_finodelk (call_frame_t *frame, xlator_t *this,</div><div class='del'>-		const char *volume, fd_t *fd, int cmd, struct flock *flock)</div><div class='del'>-{</div><div class='del'>-	UNIFY_CHECK_FD_CTX_AND_UNWIND_ON_ERR (fd);</div><div class='del'>-	xlator_t *child = NULL;</div><div class='del'>-	uint64_t tmp_child = 0;</div><div class='del'>-</div><div class='del'>-	fd_ctx_get (fd, this, &amp;tmp_child);</div><div class='del'>-	child = (xlator_t *)(long)tmp_child;		     </div><div class='del'>-</div><div class='del'>-	STACK_WIND (frame, unify_finodelk_cbk,</div><div class='del'>-		    child, child-&gt;fops-&gt;finodelk,</div><div class='del'>-		    volume, fd, cmd, flock);</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-/**</div><div class='del'>- * unify_fentrylk_cbk - </div><div class='del'>- */</div><div class='del'>-int</div><div class='del'>-unify_fentrylk_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-		    int32_t op_ret, int32_t op_errno)</div><div class='del'>-{</div><div class='del'>-	STACK_UNWIND (frame, op_ret, op_errno);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-/**</div><div class='del'>- * unify_fentrylk</div><div class='del'>- */</div><div class='del'>-int</div><div class='del'>-unify_fentrylk (call_frame_t *frame, xlator_t *this,</div><div class='del'>-		const char *volume, fd_t *fd, const char *basename,</div><div class='del'>-		entrylk_cmd cmd, entrylk_type type)</div><div class='del'>-		</div><div class='del'>-{</div><div class='del'>-	UNIFY_CHECK_FD_CTX_AND_UNWIND_ON_ERR (fd);</div><div class='del'>-	xlator_t *child = NULL;</div><div class='del'>-	uint64_t tmp_child = 0;</div><div class='del'>-</div><div class='del'>-	fd_ctx_get (fd, this, &amp;tmp_child);</div><div class='del'>-	child = (xlator_t *)(long)tmp_child;		     </div><div class='del'>-</div><div class='del'>-	STACK_WIND (frame, unify_fentrylk_cbk,</div><div class='del'>-		    child, child-&gt;fops-&gt;fentrylk,</div><div class='del'>-		    volume, fd, basename, cmd, type);</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-/**</div><div class='del'>- * unify_fxattrop_cbk - </div><div class='del'>- */</div><div class='del'>-int</div><div class='del'>-unify_fxattrop_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-		    int32_t op_ret, int32_t op_errno, dict_t *xattr)</div><div class='del'>-{</div><div class='del'>-	STACK_UNWIND (frame, op_ret, op_errno, xattr);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-/**</div><div class='del'>- * unify_fxattrop</div><div class='del'>- */</div><div class='del'>-int</div><div class='del'>-unify_fxattrop (call_frame_t *frame, xlator_t *this,</div><div class='del'>-		fd_t *fd, gf_xattrop_flags_t optype, dict_t *xattr)</div><div class='del'>-{</div><div class='del'>-	UNIFY_CHECK_FD_CTX_AND_UNWIND_ON_ERR (fd);</div><div class='del'>-	xlator_t *child = NULL;</div><div class='del'>-	uint64_t tmp_child = 0;</div><div class='del'>-</div><div class='del'>-	fd_ctx_get (fd, this, &amp;tmp_child);</div><div class='del'>-	child = (xlator_t *)(long)tmp_child;		     </div><div class='del'>-</div><div class='del'>-	STACK_WIND (frame, unify_fxattrop_cbk,</div><div class='del'>-		    child, child-&gt;fops-&gt;fxattrop,</div><div class='del'>-		    fd, optype, xattr);</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-/**</div><div class='del'>- * unify_inodelk_cbk - </div><div class='del'>- */</div><div class='del'>-int</div><div class='del'>-unify_inodelk_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-		   int32_t op_ret, int32_t op_errno)</div><div class='del'>-{</div><div class='del'>-	STACK_UNWIND (frame, op_ret, op_errno);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-/**</div><div class='del'>- * unify_inodelk</div><div class='del'>- */</div><div class='del'>-int</div><div class='del'>-unify_inodelk (call_frame_t *frame, xlator_t *this,</div><div class='del'>-	       const char *volume, loc_t *loc, int cmd, struct flock *flock)</div><div class='del'>-{</div><div class='del'>-	xlator_t *child = NULL;</div><div class='del'>-</div><div class='del'>-	child = unify_loc_subvol (loc, this);</div><div class='del'>-</div><div class='del'>-	STACK_WIND (frame, unify_inodelk_cbk,</div><div class='del'>-		    child, child-&gt;fops-&gt;inodelk,</div><div class='del'>-		    volume, loc, cmd, flock);</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-/**</div><div class='del'>- * unify_entrylk_cbk - </div><div class='del'>- */</div><div class='del'>-int</div><div class='del'>-unify_entrylk_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-		   int32_t op_ret, int32_t op_errno)</div><div class='del'>-{</div><div class='del'>-	STACK_UNWIND (frame, op_ret, op_errno);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-/**</div><div class='del'>- * unify_entrylk</div><div class='del'>- */</div><div class='del'>-int</div><div class='del'>-unify_entrylk (call_frame_t *frame, xlator_t *this,</div><div class='del'>-	       const char *volume, loc_t *loc, const char *basename,</div><div class='del'>-	       entrylk_cmd cmd, entrylk_type type)</div><div class='del'>-		</div><div class='del'>-{</div><div class='del'>-	xlator_t *child = NULL;</div><div class='del'>-</div><div class='del'>-	child = unify_loc_subvol (loc, this);</div><div class='del'>-</div><div class='del'>-	STACK_WIND (frame, unify_entrylk_cbk,</div><div class='del'>-		    child, child-&gt;fops-&gt;entrylk,</div><div class='del'>-		    volume, loc, basename, cmd, type);</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-/**</div><div class='del'>- * unify_xattrop_cbk - </div><div class='del'>- */</div><div class='del'>-int</div><div class='del'>-unify_xattrop_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-		   int32_t op_ret, int32_t op_errno, dict_t *xattr)</div><div class='del'>-{</div><div class='del'>-	STACK_UNWIND (frame, op_ret, op_errno, xattr);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-/**</div><div class='del'>- * unify_xattrop</div><div class='del'>- */</div><div class='del'>-int</div><div class='del'>-unify_xattrop (call_frame_t *frame, xlator_t *this,</div><div class='del'>-		loc_t *loc, gf_xattrop_flags_t optype, dict_t *xattr)</div><div class='del'>-{</div><div class='del'>-	xlator_t *child = NULL;</div><div class='del'>-</div><div class='del'>-	child = unify_loc_subvol (loc, this);</div><div class='del'>-</div><div class='del'>-	STACK_WIND (frame, unify_xattrop_cbk,</div><div class='del'>-		    child, child-&gt;fops-&gt;xattrop,</div><div class='del'>-		    loc, optype, xattr);</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-unify_forget (xlator_t *this,</div><div class='del'>-              inode_t *inode)</div><div class='del'>-{</div><div class='del'>-        int16_t *list = NULL;</div><div class='del'>-        uint64_t tmp_list = 0;</div><div class='del'>-</div><div class='del'>-        if (inode-&gt;ia_type &amp;&amp; (!IA_ISDIR(inode-&gt;ia_type))) {</div><div class='del'>-                inode_ctx_get (inode, this, &amp;tmp_list);</div><div class='del'>-                if (tmp_list) {</div><div class='del'>-                        list = (int16_t *)(long)tmp_list;</div><div class='del'>-                        GF_FREE (list);</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-/**</div><div class='del'>- * notify</div><div class='del'>- */</div><div class='del'>-int32_t</div><div class='del'>-notify (xlator_t *this,</div><div class='del'>-        int32_t event,</div><div class='del'>-        void *data,</div><div class='del'>-        ...)</div><div class='del'>-{</div><div class='del'>-	unify_private_t *priv = this-&gt;private;</div><div class='del'>-	struct sched_ops *sched = NULL;</div><div class='del'>-</div><div class='del'>-	if (!priv) {</div><div class='del'>-		return 0;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	sched = priv-&gt;sched_ops;    </div><div class='del'>-	if (!sched) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_CRITICAL, "No scheduler :O");</div><div class='del'>-		raise (SIGTERM);</div><div class='del'>-		return 0;</div><div class='del'>-	}</div><div class='del'>-	if (priv-&gt;namespace == data) {</div><div class='del'>-		if (event == GF_EVENT_CHILD_UP) {</div><div class='del'>-			sched-&gt;notify (this, event, data);</div><div class='del'>-		}</div><div class='del'>-		return 0;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	switch (event)</div><div class='del'>-	{</div><div class='del'>-	case GF_EVENT_CHILD_UP:</div><div class='del'>-	{</div><div class='del'>-		/* Call scheduler's update () to enable it for scheduling */</div><div class='del'>-		sched-&gt;notify (this, event, data);</div><div class='del'>-	</div><div class='del'>-		LOCK (&amp;priv-&gt;lock);</div><div class='del'>-		{</div><div class='del'>-			/* Increment the inode's generation, which is </div><div class='del'>-			   used for self_heal */</div><div class='del'>-			++priv-&gt;inode_generation;</div><div class='del'>-			++priv-&gt;num_child_up;</div><div class='del'>-		}</div><div class='del'>-		UNLOCK (&amp;priv-&gt;lock);</div><div class='del'>-</div><div class='del'>-		if (!priv-&gt;is_up) {</div><div class='del'>-			default_notify (this, event, data);</div><div class='del'>-			priv-&gt;is_up = 1;</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='del'>-	break;</div><div class='del'>-	case GF_EVENT_CHILD_DOWN:</div><div class='del'>-	{</div><div class='del'>-		/* Call scheduler's update () to disable the child node </div><div class='del'>-		 * for scheduling</div><div class='del'>-		 */</div><div class='del'>-		sched-&gt;notify (this, event, data);</div><div class='del'>-		LOCK (&amp;priv-&gt;lock);</div><div class='del'>-		{</div><div class='del'>-			--priv-&gt;num_child_up;</div><div class='del'>-		}</div><div class='del'>-		UNLOCK (&amp;priv-&gt;lock);</div><div class='del'>-</div><div class='del'>-		if (priv-&gt;num_child_up == 0) {</div><div class='del'>-			/* Send CHILD_DOWN to upper layer */</div><div class='del'>-			default_notify (this, event, data);</div><div class='del'>-			priv-&gt;is_up = 0;</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='del'>-	break;</div><div class='del'>-</div><div class='del'>-	default:</div><div class='del'>-	{</div><div class='del'>-		default_notify (this, event, data);</div><div class='del'>-	}</div><div class='del'>-	break;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-mem_acct_init (xlator_t *this)</div><div class='del'>-{</div><div class='del'>-        int     ret = -1;</div><div class='del'>-</div><div class='del'>-        if (!this)</div><div class='del'>-                return ret;</div><div class='del'>-</div><div class='del'>-        ret = xlator_mem_acct_init (this, gf_unify_mt_end + 1);</div><div class='del'>-        </div><div class='del'>-        if (ret != 0) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_ERROR, "Memory accounting init"</div><div class='del'>-                                "failed");</div><div class='del'>-                return ret;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-/** </div><div class='del'>- * init - This function is called first in the xlator, while initializing.</div><div class='del'>- *   All the config file options are checked and appropriate flags are set.</div><div class='del'>- *</div><div class='del'>- * @this - </div><div class='del'>- */</div><div class='del'>-int32_t </div><div class='del'>-init (xlator_t *this)</div><div class='del'>-{</div><div class='del'>-	int32_t          ret       = 0;</div><div class='del'>-	int32_t          count     = 0;</div><div class='del'>-	data_t          *scheduler = NULL;</div><div class='del'>-	data_t          *data      = NULL;</div><div class='del'>-	xlator_t        *ns_xl     = NULL;</div><div class='del'>-	xlator_list_t   *trav      = NULL;</div><div class='del'>-	xlator_list_t   *xlparent  = NULL;</div><div class='del'>-	xlator_list_t   *parent    = NULL;</div><div class='del'>-	unify_private_t *_private  = NULL; </div><div class='del'>-</div><div class='del'>-</div><div class='del'>-	/* Check for number of child nodes, if there is no child nodes, exit */</div><div class='del'>-	if (!this-&gt;children) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-			"No child nodes specified. check \"subvolumes \" "</div><div class='del'>-			"option in volfile");</div><div class='del'>-		return -1;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-  	if (!this-&gt;parents) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_WARNING,</div><div class='del'>-			"dangling volume. check volfile ");</div><div class='del'>-	}</div><div class='del'>-  </div><div class='del'>-	/* Check for 'scheduler' in volume */</div><div class='del'>-	scheduler = dict_get (this-&gt;options, "scheduler");</div><div class='del'>-	if (!scheduler) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_ERROR, </div><div class='del'>-			"\"option scheduler &lt;x&gt;\" is missing in volfile");</div><div class='del'>-		return -1;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	/* Setting "option namespace &lt;node&gt;" */</div><div class='del'>-	data = dict_get (this-&gt;options, "namespace");</div><div class='del'>-	if(!data) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_CRITICAL, </div><div class='del'>-			"namespace option not specified, Exiting");</div><div class='del'>-		return -1;</div><div class='del'>-	}</div><div class='del'>-	/* Search namespace in the child node, if found, exit */</div><div class='del'>-	trav = this-&gt;children;</div><div class='del'>-	while (trav) {</div><div class='del'>-		if (strcmp (trav-&gt;xlator-&gt;name, data-&gt;data) == 0)</div><div class='del'>-			break;</div><div class='del'>-		trav = trav-&gt;next;</div><div class='del'>-	}</div><div class='del'>-	if (trav) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_CRITICAL, </div><div class='del'>-			"namespace node used as a subvolume, Exiting");</div><div class='del'>-		return -1;</div><div class='del'>-	}</div><div class='del'>-	</div><div class='del'>-	/* Search for the namespace node, if found, continue */</div><div class='del'>-	ns_xl = this-&gt;next;</div><div class='del'>-	while (ns_xl) {</div><div class='del'>-		if (strcmp (ns_xl-&gt;name, data-&gt;data) == 0)</div><div class='del'>-			break;</div><div class='del'>-		ns_xl = ns_xl-&gt;next;</div><div class='del'>-	}</div><div class='del'>-	if (!ns_xl) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_CRITICAL, </div><div class='del'>-			"namespace node not found in volfile, Exiting");</div><div class='del'>-		return -1;</div><div class='del'>-	}</div><div class='del'>-	</div><div class='del'>-	gf_log (this-&gt;name, GF_LOG_DEBUG, </div><div class='del'>-		"namespace node specified as %s", data-&gt;data);</div><div class='del'>-	</div><div class='del'>-	_private = GF_CALLOC (1, sizeof (*_private), </div><div class='del'>-                              gf_unify_mt_unify_private_t);</div><div class='del'>-	ERR_ABORT (_private);</div><div class='del'>-	_private-&gt;sched_ops = get_scheduler (this, scheduler-&gt;data);</div><div class='del'>-	if (!_private-&gt;sched_ops) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_CRITICAL, </div><div class='del'>-			"Error while loading scheduler. Exiting");</div><div class='del'>-		GF_FREE (_private);</div><div class='del'>-		return -1;</div><div class='del'>-	}</div><div class='del'>-	</div><div class='del'>-	if (ns_xl-&gt;parents) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_CRITICAL,</div><div class='del'>-			"Namespace node should not be a child of any other node. Exiting");</div><div class='del'>-		GF_FREE (_private);</div><div class='del'>-		return -1;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	_private-&gt;namespace = ns_xl;</div><div class='del'>-	</div><div class='del'>-	/* update _private structure */</div><div class='del'>-	{</div><div class='del'>-		count = 0;</div><div class='del'>-		trav = this-&gt;children;</div><div class='del'>-		/* Get the number of child count */</div><div class='del'>-		while (trav) {</div><div class='del'>-			count++;</div><div class='del'>-			trav = trav-&gt;next;</div><div class='del'>-		}</div><div class='del'>-		</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_DEBUG, </div><div class='del'>-			"Child node count is %d", count);    </div><div class='del'>-</div><div class='del'>-		_private-&gt;child_count = count;</div><div class='del'>-		if (count == 1) {</div><div class='del'>-			/* TODO: Should I error out here? */</div><div class='del'>-			gf_log (this-&gt;name, GF_LOG_CRITICAL, </div><div class='del'>-				"WARNING: You have defined only one "</div><div class='del'>-				"\"subvolumes\" for unify volume. It may not "</div><div class='del'>-				"be the desired config, review your volume "</div><div class='del'>-				"volfile. If this is how you are testing it,"</div><div class='del'>-				" you may hit some performance penalty");</div><div class='del'>-		}</div><div class='del'>-		</div><div class='del'>-		_private-&gt;xl_array = GF_CALLOC (1, </div><div class='del'>-					        sizeof (xlator_t) * (count + 1),</div><div class='del'>-                                                gf_unify_mt_xlator_t);</div><div class='del'>-		ERR_ABORT (_private-&gt;xl_array);</div><div class='del'>-		</div><div class='del'>-		count = 0;</div><div class='del'>-		trav = this-&gt;children;</div><div class='del'>-		while (trav) {</div><div class='del'>-			_private-&gt;xl_array[count++] = trav-&gt;xlator;</div><div class='del'>-			trav = trav-&gt;next;</div><div class='del'>-		}</div><div class='del'>-		_private-&gt;xl_array[count] = _private-&gt;namespace;</div><div class='del'>-		</div><div class='del'>-		/* self-heal part, start with generation '1' */</div><div class='del'>-		_private-&gt;inode_generation = 1; </div><div class='del'>-                /* Because, Foreground part is tested well */</div><div class='del'>-		_private-&gt;self_heal = ZR_UNIFY_FG_SELF_HEAL; </div><div class='del'>-		data = dict_get (this-&gt;options, "self-heal");</div><div class='del'>-		if (data) {</div><div class='del'>-			if (strcasecmp (data-&gt;data, "off") == 0) </div><div class='del'>-				_private-&gt;self_heal = ZR_UNIFY_SELF_HEAL_OFF;</div><div class='del'>-</div><div class='del'>-			if (strcasecmp (data-&gt;data, "foreground") == 0)</div><div class='del'>-				_private-&gt;self_heal = ZR_UNIFY_FG_SELF_HEAL;</div><div class='del'>-</div><div class='del'>-			if (strcasecmp (data-&gt;data, "background") == 0)</div><div class='del'>-				_private-&gt;self_heal = ZR_UNIFY_BG_SELF_HEAL;</div><div class='del'>-		}</div><div class='del'>-    </div><div class='del'>-		/* optimist - ask bulde for more about it */</div><div class='del'>-		data = dict_get (this-&gt;options, "optimist");</div><div class='del'>-		if (data) {</div><div class='del'>-			if (gf_string2boolean (data-&gt;data, </div><div class='del'>-					       &amp;_private-&gt;optimist) == -1) {</div><div class='del'>-				gf_log (this-&gt;name, GF_LOG_ERROR, </div><div class='del'>-					"optimist excepts only boolean "</div><div class='del'>-					"options");</div><div class='del'>-			}</div><div class='del'>-		}</div><div class='del'>-</div><div class='del'>-		LOCK_INIT (&amp;_private-&gt;lock);</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	/* Now that everything is fine. */</div><div class='del'>-	this-&gt;private = (void *)_private;</div><div class='del'>-	{</div><div class='del'>-                ret = _private-&gt;sched_ops-&gt;mem_acct_init (this);</div><div class='del'>-</div><div class='del'>-                if (ret == -1) {</div><div class='del'>-                        return -1;</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-		/* Initialize scheduler, if everything else is successful */</div><div class='del'>-		ret = _private-&gt;sched_ops-&gt;init (this); </div><div class='del'>-		if (ret == -1) {</div><div class='del'>-			gf_log (this-&gt;name, GF_LOG_CRITICAL,</div><div class='del'>-				"Initializing scheduler failed, Exiting");</div><div class='del'>-			GF_FREE (_private);</div><div class='del'>-			return -1;</div><div class='del'>-		}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-		ret = 0;</div><div class='del'>-</div><div class='del'>-		/* This section is required because some fops may look </div><div class='del'>-		 * for 'xl-&gt;parent' variable </div><div class='del'>-		 */</div><div class='del'>-		xlparent = GF_CALLOC (1, sizeof (*xlparent),</div><div class='del'>-                                      gf_unify_mt_xlator_list_t);</div><div class='del'>-		xlparent-&gt;xlator = this;</div><div class='del'>-		if (!ns_xl-&gt;parents) {</div><div class='del'>-			ns_xl-&gt;parents = xlparent;</div><div class='del'>-		} else {</div><div class='del'>-			parent = ns_xl-&gt;parents;</div><div class='del'>-			while (parent-&gt;next)</div><div class='del'>-				parent = parent-&gt;next;</div><div class='del'>-			parent-&gt;next = xlparent;</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	/* Tell namespace node that init is done */</div><div class='del'>-	xlator_notify (ns_xl, GF_EVENT_PARENT_UP, this);</div><div class='del'>-</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-/** </div><div class='del'>- * fini  - Free all the allocated memory </div><div class='del'>- */</div><div class='del'>-void</div><div class='del'>-fini (xlator_t *this)</div><div class='del'>-{</div><div class='del'>-	unify_private_t *priv = this-&gt;private;</div><div class='del'>-	priv-&gt;sched_ops-&gt;fini (this);</div><div class='del'>-	this-&gt;private = NULL;</div><div class='del'>-	LOCK_DESTROY (&amp;priv-&gt;lock);</div><div class='del'>-	GF_FREE (priv-&gt;xl_array);</div><div class='del'>-	GF_FREE (priv);</div><div class='del'>-	return;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-struct xlator_fops fops = {</div><div class='del'>-	.stat        = unify_stat,</div><div class='del'>-	.readlink    = unify_readlink,</div><div class='del'>-	.mknod       = unify_mknod,</div><div class='del'>-	.mkdir       = unify_mkdir,</div><div class='del'>-	.unlink      = unify_unlink,</div><div class='del'>-	.rmdir       = unify_rmdir,</div><div class='del'>-	.symlink     = unify_symlink,</div><div class='del'>-	.rename      = unify_rename,</div><div class='del'>-	.link        = unify_link,</div><div class='del'>-	.truncate    = unify_truncate,</div><div class='del'>-	.create      = unify_create,</div><div class='del'>-	.open        = unify_open,</div><div class='del'>-	.readv       = unify_readv,</div><div class='del'>-	.writev      = unify_writev,</div><div class='del'>-	.statfs      = unify_statfs,</div><div class='del'>-	.flush       = unify_flush,</div><div class='del'>-	.fsync       = unify_fsync,</div><div class='del'>-	.setxattr    = unify_setxattr,</div><div class='del'>-	.getxattr    = unify_getxattr,</div><div class='del'>-	.removexattr = unify_removexattr,</div><div class='del'>-	.opendir     = unify_opendir,</div><div class='del'>-	.readdir     = unify_readdir,</div><div class='del'>-	.readdirp    = unify_readdirp,</div><div class='del'>-	.fsyncdir    = unify_fsyncdir,</div><div class='del'>-	.access      = unify_access,</div><div class='del'>-	.ftruncate   = unify_ftruncate,</div><div class='del'>-	.fstat       = unify_fstat,</div><div class='del'>-	.lk          = unify_lk,</div><div class='del'>-	.lookup      = unify_lookup,</div><div class='del'>-	.getdents    = unify_getdents,</div><div class='del'>-	.checksum    = unify_checksum,</div><div class='del'>-	.inodelk     = unify_inodelk,</div><div class='del'>-	.finodelk    = unify_finodelk,</div><div class='del'>-	.entrylk     = unify_entrylk,</div><div class='del'>-	.fentrylk    = unify_fentrylk,</div><div class='del'>-	.xattrop     = unify_xattrop,</div><div class='del'>-	.fxattrop    = unify_fxattrop,</div><div class='del'>-        .setattr     = unify_setattr, </div><div class='del'>-        .fsetattr    = unify_fsetattr,</div><div class='del'>-};</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-struct xlator_cbks cbks = {</div><div class='del'>-        .forget  = unify_forget,</div><div class='del'>-};</div><div class='del'>-</div><div class='del'>-struct volume_options options[] = {</div><div class='del'>-	{ .key   = { "namespace" },  </div><div class='del'>-	  .type  = GF_OPTION_TYPE_XLATOR </div><div class='del'>-	},</div><div class='del'>-	{ .key   = { "scheduler" },  </div><div class='del'>-	  .value = { "alu", "rr", "random", "nufa", "switch" },</div><div class='del'>-	  .type  = GF_OPTION_TYPE_STR</div><div class='del'>-	},</div><div class='del'>-	{ .key   = {"self-heal"},  </div><div class='del'>-	  .value = { "foreground", "background", "off" },</div><div class='del'>-	  .type  = GF_OPTION_TYPE_STR</div><div class='del'>-	},</div><div class='del'>-	/* TODO: remove it some time later */</div><div class='del'>-	{ .key   = {"optimist"},  </div><div class='del'>-	  .type  = GF_OPTION_TYPE_BOOL </div><div class='del'>-	},</div><div class='del'>-</div><div class='del'>-	{ .key   = {NULL} },</div><div class='del'>-};</div><div class='head'>diff --git a/xlators/cluster/unify/src/unify.h b/xlators/cluster/unify/src/unify.h<br/>deleted file mode 100644<br/>index 8dcf1659821..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/xlators/cluster/unify/src/unify.h?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/cluster/unify/src/unify.h</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,146 +0,0 @@</div><div class='del'>-/*</div><div class='del'>-  Copyright (c) 2006-2009 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='del'>-  This file is part of GlusterFS.</div><div class='del'>-</div><div class='del'>-  GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-  it under the terms of the GNU General Public License as published</div><div class='del'>-  by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-  or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-  GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-  WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-  General Public License for more details.</div><div class='del'>-</div><div class='del'>-  You should have received a copy of the GNU General Public License</div><div class='del'>-  along with this program.  If not, see</div><div class='del'>-  &lt;http://www.gnu.org/licenses/&gt;.</div><div class='del'>-*/</div><div class='del'>-</div><div class='del'>-#ifndef _CONFIG_H</div><div class='del'>-#define _CONFIG_H</div><div class='del'>-#include "config.h"</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-#ifndef _UNIFY_H</div><div class='del'>-#define _UNIFY_H</div><div class='del'>-</div><div class='del'>-#include "scheduler.h"</div><div class='del'>-#include "list.h"</div><div class='del'>-#include "unify-mem-types.h"</div><div class='del'>-</div><div class='del'>-#define MAX_DIR_ENTRY_STRING     (32 * 1024)</div><div class='del'>-</div><div class='del'>-#define ZR_UNIFY_SELF_HEAL_OFF 0</div><div class='del'>-#define ZR_UNIFY_FG_SELF_HEAL  1</div><div class='del'>-#define ZR_UNIFY_BG_SELF_HEAL  2</div><div class='del'>-</div><div class='del'>-/* Sometimes one should use completely random numbers.. its good :p */</div><div class='del'>-#define UNIFY_SELF_HEAL_GETDENTS_COUNT 512</div><div class='del'>-</div><div class='del'>-#define NS(xl)          (((unify_private_t *)xl-&gt;private)-&gt;namespace)</div><div class='del'>-</div><div class='del'>-/* This is used to allocate memory for local structure */</div><div class='del'>-#define INIT_LOCAL(fr, loc)                   \</div><div class='del'>-do {                                          \</div><div class='del'>-  loc = GF_CALLOC (1, sizeof (unify_local_t), gf_unify_mt_unify_local_t);   \</div><div class='del'>-  ERR_ABORT (loc);			      \</div><div class='del'>-  if (!loc) {                                 \</div><div class='del'>-    STACK_UNWIND (fr, -1, ENOMEM);            \</div><div class='del'>-    return 0;                                 \</div><div class='del'>-  }                                           \</div><div class='del'>-  fr-&gt;local = loc;                            \</div><div class='del'>-  loc-&gt;op_ret = -1;                           \</div><div class='del'>-  loc-&gt;op_errno = ENOENT;                     \</div><div class='del'>-} while (0)</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-struct unify_private {</div><div class='del'>-	/* Update this structure depending on requirement */</div><div class='del'>-	void *scheduler;               /* THIS SHOULD BE THE FIRST VARIABLE, </div><div class='del'>-					  if xlator is using scheduler */</div><div class='del'>-	struct sched_ops *sched_ops;   /* Scheduler options  */</div><div class='del'>-	xlator_t *namespace;           /* ptr to namespace xlator */</div><div class='del'>-	xlator_t **xl_array;</div><div class='del'>-	gf_boolean_t optimist;</div><div class='del'>-	int16_t child_count;</div><div class='del'>-	int16_t num_child_up;</div><div class='del'>-	uint8_t self_heal;</div><div class='del'>-	uint8_t is_up;</div><div class='del'>-	uint64_t inode_generation;</div><div class='del'>-	gf_lock_t lock;</div><div class='del'>-};</div><div class='del'>-typedef struct unify_private unify_private_t;</div><div class='del'>-</div><div class='del'>-struct unify_self_heal_struct {</div><div class='del'>-	uint8_t dir_checksum[NAME_MAX];</div><div class='del'>-	uint8_t ns_dir_checksum[NAME_MAX];</div><div class='del'>-	uint8_t file_checksum[NAME_MAX];</div><div class='del'>-	uint8_t ns_file_checksum[NAME_MAX];</div><div class='del'>-	off_t *offset_list;</div><div class='del'>-	int   *count_list;</div><div class='del'>-	dir_entry_t **entry_list;</div><div class='del'>-};</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-struct _unify_local_t {</div><div class='del'>-	int32_t call_count;</div><div class='del'>-	int32_t op_ret;</div><div class='del'>-	int32_t op_errno;</div><div class='del'>-	mode_t mode;</div><div class='del'>-	off_t offset;</div><div class='del'>-	dev_t dev;</div><div class='del'>-	uid_t uid;</div><div class='del'>-	gid_t gid;</div><div class='del'>-	int32_t flags;</div><div class='del'>-	int32_t entry_count;</div><div class='del'>-	int32_t count;    // dir_entry_t count;</div><div class='del'>-	fd_t *fd;</div><div class='del'>-	struct iatt stbuf;</div><div class='del'>-        struct iatt stpre;</div><div class='del'>-        struct iatt stpost;</div><div class='del'>-	struct statvfs statvfs_buf;</div><div class='del'>-	struct timespec tv[2];</div><div class='del'>-	char *name;</div><div class='del'>-	int32_t revalidate;</div><div class='del'>-</div><div class='del'>-	ino_t ia_ino;</div><div class='del'>-	nlink_t ia_nlink;</div><div class='del'>-  </div><div class='del'>-	dict_t *dict;</div><div class='del'>-</div><div class='del'>-	int16_t *list;</div><div class='del'>-	int16_t *new_list; /* Used only in case of rename */</div><div class='del'>-	int16_t index;</div><div class='del'>-</div><div class='del'>-	int32_t failed;</div><div class='del'>-	int32_t return_eio;  /* Used in case of different st-mode </div><div class='del'>-				present for a given path */</div><div class='del'>-</div><div class='del'>-	uint64_t inode_generation; /* used to store the per directory </div><div class='del'>-				    * inode_generation. Got from inode's ctx </div><div class='del'>-				    * of directory inodes</div><div class='del'>-				    */</div><div class='del'>-</div><div class='del'>-	struct unify_self_heal_struct *sh_struct;</div><div class='del'>-	loc_t loc1, loc2;</div><div class='del'>-</div><div class='del'>-        struct iatt poststbuf;</div><div class='del'>-        /* When not used for rename, old*</div><div class='del'>-         * are used as the attrs for the current</div><div class='del'>-         * parent directory.</div><div class='del'>-         */</div><div class='del'>-        struct iatt oldpreparent;</div><div class='del'>-        struct iatt oldpostparent;</div><div class='del'>-        struct iatt newpreparent;</div><div class='del'>-        struct iatt newpostparent;</div><div class='del'>-        int32_t wbflags;</div><div class='del'>-};</div><div class='del'>-typedef struct _unify_local_t unify_local_t;</div><div class='del'>-</div><div class='del'>-int32_t zr_unify_self_heal (call_frame_t *frame,</div><div class='del'>-			    xlator_t *this,</div><div class='del'>-			    unify_local_t *local);</div><div class='del'>-</div><div class='del'>-#endif /* _UNIFY_H */</div><div class='head'>diff --git a/xlators/debug/Makefile.am b/xlators/debug/Makefile.am<br/>index b655554efec..88fac1c6d9e 100644<br/>--- a/<a href='/cgit/glusterfs.git/tree/xlators/debug/Makefile.am?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/debug/Makefile.am</a><br/>+++ b/<a href='/cgit/glusterfs.git/tree/xlators/debug/Makefile.am?id=d1d7a6f35c816822fab51c820e25023863c239c1'>xlators/debug/Makefile.am</a></div><div class='hunk'>@@ -1,3 +1,3 @@</div><div class='del'>-SUBDIRS = trace error-gen io-stats</div><div class='add'>+SUBDIRS = error-gen io-stats sink trace delay-gen</div><div class='ctx'> </div><div class='ctx'> CLEANFILES = </div><div class='head'>diff --git a/mod_glusterfs/apache/2.2/Makefile.am b/xlators/debug/delay-gen/Makefile.am<br/>index d471a3f9243..a985f42a877 100644<br/>--- a/<a href='/cgit/glusterfs.git/tree/mod_glusterfs/apache/2.2/Makefile.am?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>mod_glusterfs/apache/2.2/Makefile.am</a><br/>+++ b/<a href='/cgit/glusterfs.git/tree/xlators/debug/delay-gen/Makefile.am?id=d1d7a6f35c816822fab51c820e25023863c239c1'>xlators/debug/delay-gen/Makefile.am</a></div><div class='hunk'>@@ -1,3 +1,3 @@</div><div class='ctx'> SUBDIRS = src</div><div class='ctx'> </div><div class='del'>-CLEANFILES = </div><div class='add'>+CLEANFILES =</div><div class='head'>diff --git a/xlators/debug/delay-gen/src/Makefile.am b/xlators/debug/delay-gen/src/Makefile.am<br/>new file mode 100644<br/>index 00000000000..8f758dec199<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/xlators/debug/delay-gen/src/Makefile.am?id=d1d7a6f35c816822fab51c820e25023863c239c1'>xlators/debug/delay-gen/src/Makefile.am</a></div><div class='hunk'>@@ -0,0 +1,11 @@</div><div class='add'>+</div><div class='add'>+xlator_LTLIBRARIES = delay-gen.la</div><div class='add'>+xlatordir = $(libdir)/glusterfs/$(PACKAGE_VERSION)/xlator/debug</div><div class='add'>+delay_gen_la_LDFLAGS = -module $(GF_XLATOR_DEFAULT_LDFLAGS)</div><div class='add'>+delay_gen_la_SOURCES = delay-gen.c</div><div class='add'>+delay_gen_la_LIBADD = $(top_builddir)/libglusterfs/src/libglusterfs.la</div><div class='add'>+noinst_HEADERS = delay-gen.h delay-gen-mem-types.h delay-gen-messages.h</div><div class='add'>+AM_CPPFLAGS = $(GF_CPPFLAGS) -I$(top_srcdir)/libglusterfs/src \</div><div class='add'>+	   -I$(top_srcdir)/rpc/xdr/src -I$(top_builddir)/rpc/xdr/src</div><div class='add'>+AM_CFLAGS = -Wall -fno-strict-aliasing $(GF_CFLAGS)</div><div class='add'>+CLEANFILES =</div><div class='head'>diff --git a/xlators/debug/delay-gen/src/delay-gen-mem-types.h b/xlators/debug/delay-gen/src/delay-gen-mem-types.h<br/>new file mode 100644<br/>index 00000000000..c89a9217193<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/xlators/debug/delay-gen/src/delay-gen-mem-types.h?id=d1d7a6f35c816822fab51c820e25023863c239c1'>xlators/debug/delay-gen/src/delay-gen-mem-types.h</a></div><div class='hunk'>@@ -0,0 +1,21 @@</div><div class='add'>+/*</div><div class='add'>+ *   Copyright (c) 2017 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+ *   This file is part of GlusterFS.</div><div class='add'>+ *</div><div class='add'>+ *   This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+ *   General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+ *   later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+ *   cases as published by the Free Software Foundation.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+#ifndef __DELAY_GEN_MEM_TYPES_H__</div><div class='add'>+#define __DELAY_GEN_MEM_TYPES_H__</div><div class='add'>+</div><div class='add'>+#include &lt;glusterfs/mem-types.h&gt;</div><div class='add'>+</div><div class='add'>+enum gf_delay_gen_mem_types_ {</div><div class='add'>+    gf_delay_gen_mt_dg_t = gf_common_mt_end + 1,</div><div class='add'>+    gf_delay_gen_mt_end</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+#endif /* __DELAY_GEN_MEM_TYPES_H__ */</div><div class='head'>diff --git a/xlators/debug/delay-gen/src/delay-gen-messages.h b/xlators/debug/delay-gen/src/delay-gen-messages.h<br/>new file mode 100644<br/>index 00000000000..bc98cec2885<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/xlators/debug/delay-gen/src/delay-gen-messages.h?id=d1d7a6f35c816822fab51c820e25023863c239c1'>xlators/debug/delay-gen/src/delay-gen-messages.h</a></div><div class='hunk'>@@ -0,0 +1,26 @@</div><div class='add'>+/*</div><div class='add'>+ *   Copyright (c) 2017 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+ *   This file is part of GlusterFS.</div><div class='add'>+ *</div><div class='add'>+ *   This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+ *   General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+ *   later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+ *   cases as published by the Free Software Foundation.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+#ifndef __DELAY_GEN_MESSAGES_H__</div><div class='add'>+#define __DELAY_GEN_MESSAGES_H__</div><div class='add'>+</div><div class='add'>+#include &lt;glusterfs/glfs-message-id.h&gt;</div><div class='add'>+</div><div class='add'>+/* To add new message IDs, append new identifiers at the end of the list.</div><div class='add'>+ *</div><div class='add'>+ * Never remove a message ID. If it's not used anymore, you can rename it or</div><div class='add'>+ * leave it as it is, but not delete it. This is to prevent reutilization of</div><div class='add'>+ * IDs by other messages.</div><div class='add'>+ *</div><div class='add'>+ * The component name must match one of the entries defined in</div><div class='add'>+ * glfs-message-id.h.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+#endif /* __DELAY_GEN_MESSAGES_H__ */</div><div class='head'>diff --git a/xlators/debug/delay-gen/src/delay-gen.c b/xlators/debug/delay-gen/src/delay-gen.c<br/>new file mode 100644<br/>index 00000000000..4698f1fd785<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/xlators/debug/delay-gen/src/delay-gen.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>xlators/debug/delay-gen/src/delay-gen.c</a></div><div class='hunk'>@@ -0,0 +1,697 @@</div><div class='add'>+/*</div><div class='add'>+ *  Copyright (c) 2017 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+ *  This file is part of GlusterFS.</div><div class='add'>+ *</div><div class='add'>+ *  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+ *  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+ *  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+ *  cases as published by the Free Software Foundation.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+#include "delay-gen.h"</div><div class='add'>+</div><div class='add'>+#define DELAY_GRANULARITY (1 &lt;&lt; 20)</div><div class='add'>+</div><div class='add'>+#define DG_FOP(fop, name, frame, this, args...)                                \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        delay_gen(this, fop);                                                  \</div><div class='add'>+        default_##name(frame, this, args);                                     \</div><div class='add'>+    } while (0)</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+delay_gen(xlator_t *this, int fop)</div><div class='add'>+{</div><div class='add'>+    dg_t *dg = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    if (!dg-&gt;enable[fop] || !dg-&gt;delay_ppm)</div><div class='add'>+        return 0;</div><div class='add'>+</div><div class='add'>+    if ((rand() % DELAY_GRANULARITY) &lt; dg-&gt;delay_ppm)</div><div class='add'>+        gf_nanosleep(dg-&gt;delay_duration * GF_US_IN_NS);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+dg_rename(call_frame_t *frame, xlator_t *this, loc_t *oldloc, loc_t *newloc,</div><div class='add'>+          dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    DG_FOP(GF_FOP_RENAME, rename, frame, this, oldloc, newloc, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+dg_ipc(call_frame_t *frame, xlator_t *this, int32_t op, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    DG_FOP(GF_FOP_IPC, ipc, frame, this, op, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+dg_setactivelk(call_frame_t *frame, xlator_t *this, loc_t *loc,</div><div class='add'>+               lock_migration_info_t *locklist, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    DG_FOP(GF_FOP_SETACTIVELK, setactivelk, frame, this, loc, locklist, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+dg_flush(call_frame_t *frame, xlator_t *this, fd_t *fd, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    DG_FOP(GF_FOP_FLUSH, flush, frame, this, fd, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+dg_readdir(call_frame_t *frame, xlator_t *this, fd_t *fd, size_t size,</div><div class='add'>+           off_t off, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    DG_FOP(GF_FOP_READDIR, readdir, frame, this, fd, size, off, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+dg_setxattr(call_frame_t *frame, xlator_t *this, loc_t *loc, dict_t *dict,</div><div class='add'>+            int32_t flags, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    DG_FOP(GF_FOP_SETXATTR, setxattr, frame, this, loc, dict, flags, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+dg_mknod(call_frame_t *frame, xlator_t *this, loc_t *loc, mode_t mode,</div><div class='add'>+         dev_t rdev, mode_t umask, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    DG_FOP(GF_FOP_MKNOD, mknod, frame, this, loc, mode, rdev, umask, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+dg_fsetxattr(call_frame_t *frame, xlator_t *this, fd_t *fd, dict_t *dict,</div><div class='add'>+             int32_t flags, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    DG_FOP(GF_FOP_FSETXATTR, fsetxattr, frame, this, fd, dict, flags, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+dg_readv(call_frame_t *frame, xlator_t *this, fd_t *fd, size_t size,</div><div class='add'>+         off_t offset, uint32_t flags, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    DG_FOP(GF_FOP_READ, readv, frame, this, fd, size, offset, flags, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+dg_inodelk(call_frame_t *frame, xlator_t *this, const char *volume, loc_t *loc,</div><div class='add'>+           int32_t cmd, struct gf_flock *lock, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    DG_FOP(GF_FOP_INODELK, inodelk, frame, this, volume, loc, cmd, lock, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+dg_fremovexattr(call_frame_t *frame, xlator_t *this, fd_t *fd, const char *name,</div><div class='add'>+                dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    DG_FOP(GF_FOP_FREMOVEXATTR, fremovexattr, frame, this, fd, name, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+dg_open(call_frame_t *frame, xlator_t *this, loc_t *loc, int32_t flags,</div><div class='add'>+        fd_t *fd, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    DG_FOP(GF_FOP_OPEN, open, frame, this, loc, flags, fd, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+dg_xattrop(call_frame_t *frame, xlator_t *this, loc_t *loc,</div><div class='add'>+           gf_xattrop_flags_t flags, dict_t *dict, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    DG_FOP(GF_FOP_XATTROP, xattrop, frame, this, loc, flags, dict, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+dg_entrylk(call_frame_t *frame, xlator_t *this, const char *volume, loc_t *loc,</div><div class='add'>+           const char *basename, entrylk_cmd cmd, entrylk_type type,</div><div class='add'>+           dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    DG_FOP(GF_FOP_ENTRYLK, entrylk, frame, this, volume, loc, basename, cmd,</div><div class='add'>+           type, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+dg_getactivelk(call_frame_t *frame, xlator_t *this, loc_t *loc, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    DG_FOP(GF_FOP_GETACTIVELK, getactivelk, frame, this, loc, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+dg_finodelk(call_frame_t *frame, xlator_t *this, const char *volume, fd_t *fd,</div><div class='add'>+            int32_t cmd, struct gf_flock *lock, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    DG_FOP(GF_FOP_FINODELK, finodelk, frame, this, volume, fd, cmd, lock,</div><div class='add'>+           xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+dg_create(call_frame_t *frame, xlator_t *this, loc_t *loc, int32_t flags,</div><div class='add'>+          mode_t mode, mode_t umask, fd_t *fd, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    DG_FOP(GF_FOP_CREATE, create, frame, this, loc, flags, mode, umask, fd,</div><div class='add'>+           xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+dg_discard(call_frame_t *frame, xlator_t *this, fd_t *fd, off_t offset,</div><div class='add'>+           size_t len, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    DG_FOP(GF_FOP_DISCARD, discard, frame, this, fd, offset, len, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+dg_mkdir(call_frame_t *frame, xlator_t *this, loc_t *loc, mode_t mode,</div><div class='add'>+         mode_t umask, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    DG_FOP(GF_FOP_MKDIR, mkdir, frame, this, loc, mode, umask, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+dg_lk(call_frame_t *frame, xlator_t *this, fd_t *fd, int32_t cmd,</div><div class='add'>+      struct gf_flock *lock, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    DG_FOP(GF_FOP_LK, lk, frame, this, fd, cmd, lock, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+dg_writev(call_frame_t *frame, xlator_t *this, fd_t *fd, struct iovec *vector,</div><div class='add'>+          int32_t count, off_t off, uint32_t flags, struct iobref *iobref,</div><div class='add'>+          dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    DG_FOP(GF_FOP_WRITE, writev, frame, this, fd, vector, count, off, flags,</div><div class='add'>+           iobref, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+dg_access(call_frame_t *frame, xlator_t *this, loc_t *loc, int32_t mask,</div><div class='add'>+          dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    DG_FOP(GF_FOP_ACCESS, access, frame, this, loc, mask, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+dg_lookup(call_frame_t *frame, xlator_t *this, loc_t *loc, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    DG_FOP(GF_FOP_LOOKUP, lookup, frame, this, loc, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+dg_rmdir(call_frame_t *frame, xlator_t *this, loc_t *loc, int32_t flags,</div><div class='add'>+         dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    DG_FOP(GF_FOP_RMDIR, rmdir, frame, this, loc, flags, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+dg_fallocate(call_frame_t *frame, xlator_t *this, fd_t *fd, int32_t keep_size,</div><div class='add'>+             off_t offset, size_t len, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    DG_FOP(GF_FOP_FALLOCATE, fallocate, frame, this, fd, keep_size, offset, len,</div><div class='add'>+           xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+dg_fstat(call_frame_t *frame, xlator_t *this, fd_t *fd, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    DG_FOP(GF_FOP_FSTAT, fstat, frame, this, fd, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+dg_lease(call_frame_t *frame, xlator_t *this, loc_t *loc,</div><div class='add'>+         struct gf_lease *lease, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    DG_FOP(GF_FOP_LEASE, lease, frame, this, loc, lease, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+dg_stat(call_frame_t *frame, xlator_t *this, loc_t *loc, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    DG_FOP(GF_FOP_STAT, stat, frame, this, loc, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+dg_truncate(call_frame_t *frame, xlator_t *this, loc_t *loc, off_t offset,</div><div class='add'>+            dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    DG_FOP(GF_FOP_TRUNCATE, truncate, frame, this, loc, offset, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+dg_getxattr(call_frame_t *frame, xlator_t *this, loc_t *loc, const char *name,</div><div class='add'>+            dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    DG_FOP(GF_FOP_GETXATTR, getxattr, frame, this, loc, name, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+dg_symlink(call_frame_t *frame, xlator_t *this, const char *linkpath,</div><div class='add'>+           loc_t *loc, mode_t umask, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    DG_FOP(GF_FOP_SYMLINK, symlink, frame, this, linkpath, loc, umask, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+dg_zerofill(call_frame_t *frame, xlator_t *this, fd_t *fd, off_t offset,</div><div class='add'>+            off_t len, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    DG_FOP(GF_FOP_ZEROFILL, zerofill, frame, this, fd, offset, len, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+dg_fsyncdir(call_frame_t *frame, xlator_t *this, fd_t *fd, int32_t flags,</div><div class='add'>+            dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    DG_FOP(GF_FOP_FSYNCDIR, fsyncdir, frame, this, fd, flags, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+dg_fgetxattr(call_frame_t *frame, xlator_t *this, fd_t *fd, const char *name,</div><div class='add'>+             dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    DG_FOP(GF_FOP_FGETXATTR, fgetxattr, frame, this, fd, name, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+dg_readdirp(call_frame_t *frame, xlator_t *this, fd_t *fd, size_t size,</div><div class='add'>+            off_t off, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    DG_FOP(GF_FOP_READDIRP, readdirp, frame, this, fd, size, off, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+dg_link(call_frame_t *frame, xlator_t *this, loc_t *oldloc, loc_t *newloc,</div><div class='add'>+        dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    DG_FOP(GF_FOP_LINK, link, frame, this, oldloc, newloc, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+dg_fxattrop(call_frame_t *frame, xlator_t *this, fd_t *fd,</div><div class='add'>+            gf_xattrop_flags_t flags, dict_t *dict, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    DG_FOP(GF_FOP_FXATTROP, fxattrop, frame, this, fd, flags, dict, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+dg_ftruncate(call_frame_t *frame, xlator_t *this, fd_t *fd, off_t offset,</div><div class='add'>+             dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    DG_FOP(GF_FOP_FTRUNCATE, ftruncate, frame, this, fd, offset, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+dg_rchecksum(call_frame_t *frame, xlator_t *this, fd_t *fd, off_t offset,</div><div class='add'>+             int32_t len, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    DG_FOP(GF_FOP_RCHECKSUM, rchecksum, frame, this, fd, offset, len, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+dg_unlink(call_frame_t *frame, xlator_t *this, loc_t *loc, int32_t flags,</div><div class='add'>+          dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    DG_FOP(GF_FOP_UNLINK, unlink, frame, this, loc, flags, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+dg_fentrylk(call_frame_t *frame, xlator_t *this, const char *volume, fd_t *fd,</div><div class='add'>+            const char *basename, entrylk_cmd cmd, entrylk_type type,</div><div class='add'>+            dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    DG_FOP(GF_FOP_FENTRYLK, fentrylk, frame, this, volume, fd, basename, cmd,</div><div class='add'>+           type, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+dg_getspec(call_frame_t *frame, xlator_t *this, const char *key, int32_t flags)</div><div class='add'>+{</div><div class='add'>+    DG_FOP(GF_FOP_GETSPEC, getspec, frame, this, key, flags);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+dg_setattr(call_frame_t *frame, xlator_t *this, loc_t *loc, struct iatt *stbuf,</div><div class='add'>+           int32_t valid, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    DG_FOP(GF_FOP_SETATTR, setattr, frame, this, loc, stbuf, valid, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+dg_fsync(call_frame_t *frame, xlator_t *this, fd_t *fd, int32_t flags,</div><div class='add'>+         dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    DG_FOP(GF_FOP_FSYNC, fsync, frame, this, fd, flags, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+dg_statfs(call_frame_t *frame, xlator_t *this, loc_t *loc, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    DG_FOP(GF_FOP_STATFS, statfs, frame, this, loc, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+dg_seek(call_frame_t *frame, xlator_t *this, fd_t *fd, off_t offset,</div><div class='add'>+        gf_seek_what_t what, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    DG_FOP(GF_FOP_SEEK, seek, frame, this, fd, offset, what, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+dg_fsetattr(call_frame_t *frame, xlator_t *this, fd_t *fd, struct iatt *stbuf,</div><div class='add'>+            int32_t valid, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    DG_FOP(GF_FOP_FSETATTR, fsetattr, frame, this, fd, stbuf, valid, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+dg_opendir(call_frame_t *frame, xlator_t *this, loc_t *loc, fd_t *fd,</div><div class='add'>+           dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    DG_FOP(GF_FOP_OPENDIR, opendir, frame, this, loc, fd, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+dg_readlink(call_frame_t *frame, xlator_t *this, loc_t *loc, size_t size,</div><div class='add'>+            dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    DG_FOP(GF_FOP_READLINK, readlink, frame, this, loc, size, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+dg_removexattr(call_frame_t *frame, xlator_t *this, loc_t *loc,</div><div class='add'>+               const char *name, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    DG_FOP(GF_FOP_REMOVEXATTR, removexattr, frame, this, loc, name, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+dg_forget(xlator_t *this, inode_t *inode)</div><div class='add'>+{</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+dg_release(xlator_t *this, fd_t *fd)</div><div class='add'>+{</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+dg_releasedir(xlator_t *this, fd_t *fd)</div><div class='add'>+{</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+delay_gen_parse_fill_fops(dg_t *dg, char *enable_fops)</div><div class='add'>+{</div><div class='add'>+    char *op_no_str = NULL;</div><div class='add'>+    int op_no = -1;</div><div class='add'>+    int i = 0;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    xlator_t *this = THIS;</div><div class='add'>+    char *saveptr = NULL;</div><div class='add'>+    char *dup_enable_fops = NULL;</div><div class='add'>+</div><div class='add'>+    if (strlen(enable_fops) == 0) {</div><div class='add'>+        for (i = GF_FOP_NULL + 1; i &lt; GF_FOP_MAXVALUE; i++)</div><div class='add'>+            dg-&gt;enable[i] = 1;</div><div class='add'>+    } else {</div><div class='add'>+        dup_enable_fops = gf_strdup(enable_fops);</div><div class='add'>+        if (!dup_enable_fops) {</div><div class='add'>+            ret = -1;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+        op_no_str = strtok_r(dup_enable_fops, ",", &amp;saveptr);</div><div class='add'>+        while (op_no_str) {</div><div class='add'>+            op_no = gf_fop_int(op_no_str);</div><div class='add'>+            if (op_no == -1) {</div><div class='add'>+                gf_log(this-&gt;name, GF_LOG_WARNING, "Wrong option value %s",</div><div class='add'>+                       op_no_str);</div><div class='add'>+                ret = -1;</div><div class='add'>+                goto out;</div><div class='add'>+            } else {</div><div class='add'>+                dg-&gt;enable[op_no] = 1;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            op_no_str = strtok_r(NULL, ",", &amp;saveptr);</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+out:</div><div class='add'>+    GF_FREE(dup_enable_fops);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+delay_gen_set_delay_ppm(dg_t *dg, double percent)</div><div class='add'>+{</div><div class='add'>+    double ppm;</div><div class='add'>+</div><div class='add'>+    ppm = (percent / 100.0) * (double)DELAY_GRANULARITY;</div><div class='add'>+    dg-&gt;delay_ppm = ppm;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+init(xlator_t *this)</div><div class='add'>+{</div><div class='add'>+    dg_t *dg = NULL;</div><div class='add'>+    int32_t ret = 0;</div><div class='add'>+    double delay_percent = 0;</div><div class='add'>+    char *delay_enable_fops = NULL;</div><div class='add'>+</div><div class='add'>+    if (!this-&gt;children || this-&gt;children-&gt;next) {</div><div class='add'>+        gf_log(this-&gt;name, GF_LOG_ERROR,</div><div class='add'>+               "delay-gen not configured with one subvolume");</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (!this-&gt;parents) {</div><div class='add'>+        gf_log(this-&gt;name, GF_LOG_WARNING, "dangling volume. check volfile ");</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    dg = GF_CALLOC(1, sizeof(*dg), gf_delay_gen_mt_dg_t);</div><div class='add'>+</div><div class='add'>+    if (!dg) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = -1;</div><div class='add'>+</div><div class='add'>+    GF_OPTION_INIT("delay-percentage", delay_percent, percent, out);</div><div class='add'>+    GF_OPTION_INIT("enable", delay_enable_fops, str, out);</div><div class='add'>+    GF_OPTION_INIT("delay-duration", dg-&gt;delay_duration, int32, out);</div><div class='add'>+</div><div class='add'>+    delay_gen_set_delay_ppm(dg, delay_percent);</div><div class='add'>+</div><div class='add'>+    ret = delay_gen_parse_fill_fops(dg, delay_enable_fops);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    this-&gt;private = dg;</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+out:</div><div class='add'>+    if (ret)</div><div class='add'>+        GF_FREE(dg);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+fini(xlator_t *this)</div><div class='add'>+{</div><div class='add'>+    GF_FREE(this-&gt;private);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+mem_acct_init(xlator_t *this)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    if (!this)</div><div class='add'>+        return ret;</div><div class='add'>+</div><div class='add'>+    ret = xlator_mem_acct_init(this, gf_delay_gen_mt_end + 1);</div><div class='add'>+</div><div class='add'>+    if (ret != 0) {</div><div class='add'>+        gf_log(this-&gt;name, GF_LOG_ERROR,</div><div class='add'>+               "Memory accounting init"</div><div class='add'>+               " failed");</div><div class='add'>+        return ret;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+reconfigure(xlator_t *this, dict_t *dict)</div><div class='add'>+{</div><div class='add'>+    /*At the moment I don't see any need to implement this. In future</div><div class='add'>+     *if this is needed we can add code here.</div><div class='add'>+     */</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+notify(xlator_t *this, int event, void *data, ...)</div><div class='add'>+{</div><div class='add'>+    return default_notify(this, event, data);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+struct xlator_fops fops = {</div><div class='add'>+    .rename = dg_rename,</div><div class='add'>+    .ipc = dg_ipc,</div><div class='add'>+    .setactivelk = dg_setactivelk,</div><div class='add'>+    .flush = dg_flush,</div><div class='add'>+    .readdir = dg_readdir,</div><div class='add'>+    .setxattr = dg_setxattr,</div><div class='add'>+    .mknod = dg_mknod,</div><div class='add'>+    .fsetxattr = dg_fsetxattr,</div><div class='add'>+    .readv = dg_readv,</div><div class='add'>+    .inodelk = dg_inodelk,</div><div class='add'>+    .fremovexattr = dg_fremovexattr,</div><div class='add'>+    .open = dg_open,</div><div class='add'>+    .xattrop = dg_xattrop,</div><div class='add'>+    .entrylk = dg_entrylk,</div><div class='add'>+    .getactivelk = dg_getactivelk,</div><div class='add'>+    .finodelk = dg_finodelk,</div><div class='add'>+    .create = dg_create,</div><div class='add'>+    .discard = dg_discard,</div><div class='add'>+    .mkdir = dg_mkdir,</div><div class='add'>+    .lk = dg_lk,</div><div class='add'>+    .writev = dg_writev,</div><div class='add'>+    .access = dg_access,</div><div class='add'>+    .lookup = dg_lookup,</div><div class='add'>+    .rmdir = dg_rmdir,</div><div class='add'>+    .fallocate = dg_fallocate,</div><div class='add'>+    .fstat = dg_fstat,</div><div class='add'>+    .lease = dg_lease,</div><div class='add'>+    .stat = dg_stat,</div><div class='add'>+    .truncate = dg_truncate,</div><div class='add'>+    .getxattr = dg_getxattr,</div><div class='add'>+    .symlink = dg_symlink,</div><div class='add'>+    .zerofill = dg_zerofill,</div><div class='add'>+    .fsyncdir = dg_fsyncdir,</div><div class='add'>+    .fgetxattr = dg_fgetxattr,</div><div class='add'>+    .readdirp = dg_readdirp,</div><div class='add'>+    .link = dg_link,</div><div class='add'>+    .fxattrop = dg_fxattrop,</div><div class='add'>+    .ftruncate = dg_ftruncate,</div><div class='add'>+    .rchecksum = dg_rchecksum,</div><div class='add'>+    .unlink = dg_unlink,</div><div class='add'>+    .fentrylk = dg_fentrylk,</div><div class='add'>+    .getspec = dg_getspec,</div><div class='add'>+    .setattr = dg_setattr,</div><div class='add'>+    .fsync = dg_fsync,</div><div class='add'>+    .statfs = dg_statfs,</div><div class='add'>+    .seek = dg_seek,</div><div class='add'>+    .fsetattr = dg_fsetattr,</div><div class='add'>+    .opendir = dg_opendir,</div><div class='add'>+    .readlink = dg_readlink,</div><div class='add'>+    .removexattr = dg_removexattr,</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct xlator_cbks cbks = {</div><div class='add'>+    .forget = dg_forget,</div><div class='add'>+    .release = dg_release,</div><div class='add'>+    .releasedir = dg_releasedir,</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct volume_options options[] = {</div><div class='add'>+    {</div><div class='add'>+        .key = {"delay-percentage"},</div><div class='add'>+        .type = GF_OPTION_TYPE_PERCENT,</div><div class='add'>+        .default_value = "10%",</div><div class='add'>+        .description = "Percentage delay of operations when enabled.",</div><div class='add'>+        .op_version = {GD_OP_VERSION_3_13_0},</div><div class='add'>+        .flags = OPT_FLAG_SETTABLE,</div><div class='add'>+        .tags = {"delay-gen"},</div><div class='add'>+    },</div><div class='add'>+</div><div class='add'>+    {</div><div class='add'>+        .key = {"delay-duration"},</div><div class='add'>+        .type = GF_OPTION_TYPE_INT,</div><div class='add'>+        .description = "Delay duration in micro seconds",</div><div class='add'>+        .default_value = "100000",</div><div class='add'>+        .op_version = {GD_OP_VERSION_3_13_0},</div><div class='add'>+        .flags = OPT_FLAG_SETTABLE,</div><div class='add'>+        .tags = {"delay-gen"},</div><div class='add'>+    },</div><div class='add'>+</div><div class='add'>+    {</div><div class='add'>+        .key = {"enable"},</div><div class='add'>+        .type = GF_OPTION_TYPE_STR,</div><div class='add'>+        .description = "Accepts a string which takes ',' separated fop "</div><div class='add'>+                       "strings to denote which fops are enabled for delay",</div><div class='add'>+        .op_version = {GD_OP_VERSION_3_13_0},</div><div class='add'>+        .flags = OPT_FLAG_SETTABLE,</div><div class='add'>+        .tags = {"delay-gen"},</div><div class='add'>+        .default_value = "",</div><div class='add'>+    },</div><div class='add'>+</div><div class='add'>+    {.key = {NULL}},</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+xlator_api_t xlator_api = {</div><div class='add'>+    .init = init,</div><div class='add'>+    .fini = fini,</div><div class='add'>+    .notify = notify,</div><div class='add'>+    .reconfigure = reconfigure,</div><div class='add'>+    .mem_acct_init = mem_acct_init,</div><div class='add'>+    .op_version = {GD_OP_VERSION_3_12_0},</div><div class='add'>+    .fops = &amp;fops,</div><div class='add'>+    .cbks = &amp;cbks,</div><div class='add'>+    .options = options,</div><div class='add'>+    .identifier = "delay-gen",</div><div class='add'>+    .category = GF_TECH_PREVIEW,</div><div class='add'>+};</div><div class='head'>diff --git a/xlators/debug/delay-gen/src/delay-gen.h b/xlators/debug/delay-gen/src/delay-gen.h<br/>new file mode 100644<br/>index 00000000000..afa95e5eb2d<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/xlators/debug/delay-gen/src/delay-gen.h?id=d1d7a6f35c816822fab51c820e25023863c239c1'>xlators/debug/delay-gen/src/delay-gen.h</a></div><div class='hunk'>@@ -0,0 +1,27 @@</div><div class='add'>+/*</div><div class='add'>+ *   Copyright (c) 2017 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+ *   This file is part of GlusterFS.</div><div class='add'>+ *</div><div class='add'>+ *   This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+ *   General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+ *   later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+ *   cases as published by the Free Software Foundation.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+#ifndef __DELAY_GEN_H__</div><div class='add'>+#define __DELAY_GEN_H__</div><div class='add'>+</div><div class='add'>+#include "delay-gen-mem-types.h"</div><div class='add'>+#include "delay-gen-messages.h"</div><div class='add'>+#include &lt;glusterfs/glusterfs.h&gt;</div><div class='add'>+#include &lt;glusterfs/xlator.h&gt;</div><div class='add'>+#include &lt;glusterfs/defaults.h&gt;</div><div class='add'>+</div><div class='add'>+typedef struct {</div><div class='add'>+    int enable[GF_FOP_MAXVALUE];</div><div class='add'>+    int op_count;</div><div class='add'>+    int delay_ppm;</div><div class='add'>+    int delay_duration;</div><div class='add'>+} dg_t;</div><div class='add'>+</div><div class='add'>+#endif /* __DELAY_GEN_H__ */</div><div class='head'>diff --git a/xlators/debug/error-gen/src/Makefile.am b/xlators/debug/error-gen/src/Makefile.am<br/>index f353b61e69c..038d2e8e66d 100644<br/>--- a/<a href='/cgit/glusterfs.git/tree/xlators/debug/error-gen/src/Makefile.am?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/debug/error-gen/src/Makefile.am</a><br/>+++ b/<a href='/cgit/glusterfs.git/tree/xlators/debug/error-gen/src/Makefile.am?id=d1d7a6f35c816822fab51c820e25023863c239c1'>xlators/debug/error-gen/src/Makefile.am</a></div><div class='hunk'>@@ -2,15 +2,17 @@</div><div class='ctx'> xlator_LTLIBRARIES = error-gen.la</div><div class='ctx'> xlatordir = $(libdir)/glusterfs/$(PACKAGE_VERSION)/xlator/debug</div><div class='ctx'> </div><div class='del'>-error_gen_la_LDFLAGS = -module -avoidversion</div><div class='add'>+error_gen_la_LDFLAGS = -module $(GF_XLATOR_DEFAULT_LDFLAGS)</div><div class='ctx'> </div><div class='ctx'> error_gen_la_SOURCES = error-gen.c</div><div class='ctx'> error_gen_la_LIBADD = $(top_builddir)/libglusterfs/src/libglusterfs.la</div><div class='ctx'> </div><div class='del'>-noinst_HEADERS = error-gen.h</div><div class='add'>+noinst_HEADERS = error-gen.h error-gen-mem-types.h</div><div class='ctx'> </div><div class='del'>-AM_CFLAGS = -fPIC -D_FILE_OFFSET_BITS=64 -D_GNU_SOURCE -Wall -D$(GF_HOST_OS)\</div><div class='del'>-	-I$(top_srcdir)/libglusterfs/src -shared -nostartfiles $(GF_CFLAGS)</div><div class='add'>+AM_CPPFLAGS = $(GF_CPPFLAGS) -I$(top_srcdir)/libglusterfs/src \</div><div class='add'>+	-I$(top_srcdir)/rpc/xdr/src -I$(top_builddir)/rpc/xdr/src</div><div class='add'>+</div><div class='add'>+AM_CFLAGS = -Wall $(GF_CFLAGS)</div><div class='ctx'> </div><div class='ctx'> CLEANFILES = </div><div class='ctx'> </div><div class='head'>diff --git a/xlators/debug/error-gen/src/error-gen-mem-types.h b/xlators/debug/error-gen/src/error-gen-mem-types.h<br/>new file mode 100644<br/>index 00000000000..b9b713af8fc<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/xlators/debug/error-gen/src/error-gen-mem-types.h?id=d1d7a6f35c816822fab51c820e25023863c239c1'>xlators/debug/error-gen/src/error-gen-mem-types.h</a></div><div class='hunk'>@@ -0,0 +1,20 @@</div><div class='add'>+/*</div><div class='add'>+   Copyright (c) 2008-2012 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+   This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+   This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+   General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+   later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+   cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#ifndef __ERROR_GEN_MEM_TYPES_H__</div><div class='add'>+#define __ERROR_GEN_MEM_TYPES_H__</div><div class='add'>+</div><div class='add'>+#include &lt;glusterfs/mem-types.h&gt;</div><div class='add'>+</div><div class='add'>+enum gf_error_gen_mem_types_ {</div><div class='add'>+    gf_error_gen_mt_eg_t = gf_common_mt_end + 1,</div><div class='add'>+    gf_error_gen_mt_end</div><div class='add'>+};</div><div class='add'>+#endif</div><div class='head'>diff --git a/xlators/debug/error-gen/src/error-gen.c b/xlators/debug/error-gen/src/error-gen.c<br/>index 095b077b48e..d45655ef4c3 100644<br/>--- a/<a href='/cgit/glusterfs.git/tree/xlators/debug/error-gen/src/error-gen.c?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/debug/error-gen/src/error-gen.c</a><br/>+++ b/<a href='/cgit/glusterfs.git/tree/xlators/debug/error-gen/src/error-gen.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>xlators/debug/error-gen/src/error-gen.c</a></div><div class='hunk'>@@ -1,2024 +1,1663 @@</div><div class='ctx'> /*</div><div class='del'>-  Copyright (c) 2008-2009 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='del'>-  This file is part of GlusterFS.</div><div class='del'>-</div><div class='del'>-  GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-  it under the terms of the GNU General Public License as published</div><div class='del'>-  by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-  or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-  GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-  WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-  General Public License for more details.</div><div class='del'>-</div><div class='del'>-  You should have received a copy of the GNU General Public License</div><div class='del'>-  along with this program.  If not, see</div><div class='del'>-  &lt;http://www.gnu.org/licenses/&gt;.</div><div class='del'>-*/</div><div class='del'>-</div><div class='del'>-#ifndef _CONFIG_H</div><div class='del'>-#define _CONFIG_H</div><div class='del'>-#include "config.h"</div><div class='del'>-#endif</div><div class='add'>+   Copyright (c) 2008-2012 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+   This file is part of GlusterFS.</div><div class='ctx'> </div><div class='del'>-#include "xlator.h"</div><div class='add'>+   This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+   General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+   later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+   cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+#include &lt;glusterfs/xlator.h&gt;</div><div class='ctx'> #include "error-gen.h"</div><div class='add'>+#include &lt;glusterfs/statedump.h&gt;</div><div class='add'>+#include &lt;glusterfs/defaults.h&gt;</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+ * The user can specify an error probability as a float percentage, but we</div><div class='add'>+ * store it internally as a numerator with this as the denominator.  When it's</div><div class='add'>+ * used, it's like this:</div><div class='add'>+ *</div><div class='add'>+ *    (rand() % FAILURE_GRANULARITY) &lt; error_rate</div><div class='add'>+ *</div><div class='add'>+ * To minimize rounding errors from the modulo operation, it's good for this to</div><div class='add'>+ * be a power of two.</div><div class='add'>+ *</div><div class='add'>+ * (BTW this is just the normal case.  If "random-failure" is set, that does</div><div class='add'>+ * something completely different and this number is irrelevant.  See error_gen</div><div class='add'>+ * for the legacy code.)</div><div class='add'>+ */</div><div class='add'>+#define FAILURE_GRANULARITY (1 &lt;&lt; 20)</div><div class='ctx'> </div><div class='ctx'> sys_error_t error_no_list[] = {</div><div class='del'>-        [GF_FOP_LOOKUP]            = { .error_no_count = 4,</div><div class='del'>-                                    .error_no = {ENOENT,ENOTDIR,</div><div class='del'>-                                                 ENAMETOOLONG,EAGAIN}},</div><div class='del'>-        [GF_FOP_STAT]              = { .error_no_count = 7,</div><div class='del'>-                                    .error_no = {EACCES,EBADF,EFAULT,</div><div class='del'>-                                                 ENAMETOOLONG,ENOENT,</div><div class='del'>-                                                 ENOMEM,ENOTDIR}},</div><div class='del'>-        [GF_FOP_READLINK]          = { .error_no_count = 8,</div><div class='del'>-                                    .error_no = {EACCES,EFAULT,EINVAL,EIO,</div><div class='del'>-                                                 ENAMETOOLONG,ENOENT,ENOMEM,</div><div class='del'>-                                                 ENOTDIR}},</div><div class='del'>-        [GF_FOP_MKNOD]             = { .error_no_count = 11,</div><div class='del'>-                                    .error_no = {EACCES,EEXIST,EFAULT,</div><div class='del'>-                                                 EINVAL,ENAMETOOLONG,</div><div class='del'>-                                                 ENOENT,ENOMEM,ENOSPC,</div><div class='del'>-                                                 ENOTDIR,EPERM,EROFS}},</div><div class='del'>-        [GF_FOP_MKDIR]             = { .error_no_count = 10,</div><div class='del'>-                                    .error_no = {EACCES,EEXIST,EFAULT,</div><div class='del'>-                                                 ENAMETOOLONG,ENOENT,</div><div class='del'>-                                                 ENOMEM,ENOSPC,ENOTDIR,</div><div class='del'>-						 EPERM,EROFS}},</div><div class='del'>-        [GF_FOP_UNLINK]            = { .error_no_count = 10,</div><div class='del'>-                                    .error_no = {EACCES,EBUSY,EFAULT,EIO,</div><div class='del'>-                                                 EISDIR,ENAMETOOLONG,</div><div class='del'>-                                                 ENOENT,ENOMEM,ENOTDIR,</div><div class='del'>-                                                 EPERM,EROFS}},</div><div class='del'>-        [GF_FOP_RMDIR]             = { .error_no_count = 8,</div><div class='del'>-                                    .error_no = {EACCES,EBUSY,EFAULT,</div><div class='del'>-                                                 ENOMEM,ENOTDIR,ENOTEMPTY,</div><div class='del'>-                                                 EPERM,EROFS}},</div><div class='del'>-        [GF_FOP_SYMLINK]           = { .error_no_count = 11,</div><div class='del'>-                                    .error_no = {EACCES,EEXIST,EFAULT,EIO,</div><div class='del'>-                                                 ENAMETOOLONG,ENOENT,ENOMEM,</div><div class='del'>-                                                 ENOSPC,ENOTDIR,EPERM,</div><div class='del'>-                                                 EROFS}},</div><div class='del'>-        [GF_FOP_RENAME]            = { .error_no_count = 13,</div><div class='del'>-                                    .error_no = {EACCES,EBUSY,EFAULT,</div><div class='del'>-                                                 EINVAL,EISDIR,EMLINK,</div><div class='del'>-                                                 ENAMETOOLONG,ENOENT,ENOMEM,</div><div class='del'>-                                                 ENOSPC,ENOTDIR,EEXIST,</div><div class='del'>-                                                 EXDEV}},</div><div class='del'>-        [GF_FOP_LINK]              = { .error_no_count = 13,</div><div class='del'>-                                    .error_no = {EACCES,EFAULT,EEXIST,EIO,</div><div class='del'>-                                                 EMLINK,ENAMETOOLONG,</div><div class='del'>-                                                 ENOENT,ENOMEM,ENOSPC,</div><div class='del'>-                                                 ENOTDIR,EPERM,EROFS,</div><div class='del'>-                                                 EXDEV}},</div><div class='del'>-        [GF_FOP_TRUNCATE]          = { .error_no_count = 10,</div><div class='del'>-                                    .error_no = {EACCES,EFAULT,EFBIG,</div><div class='del'>-                                                 EINTR,EINVAL,EIO,EISDIR,</div><div class='del'>-                                                 ENAMETOOLONG,ENOENT,</div><div class='del'>-                                                 EISDIR}},</div><div class='del'>-        [GF_FOP_CREATE]            = {.error_no_count = 10,</div><div class='del'>-                                   .error_no = {EACCES,EEXIST,EFAULT,</div><div class='del'>-                                                EISDIR,EMFILE,ENAMETOOLONG,</div><div class='del'>-                                                ENFILE,ENODEV,ENOENT,</div><div class='del'>-                                                ENODEV}},</div><div class='del'>-        [GF_FOP_OPEN]              = { .error_no_count = 10,</div><div class='del'>-                                    .error_no = {EACCES,EEXIST,EFAULT,</div><div class='del'>-                                                 EISDIR,EMFILE,</div><div class='del'>-                                                 ENAMETOOLONG,ENFILE,</div><div class='del'>-                                                 ENODEV,ENOENT,ENOMEM}},</div><div class='del'>-        [GF_FOP_READ]              = { .error_no_count = 5,</div><div class='del'>-                                    .error_no = {EINVAL,EBADF,EFAULT,EISDIR,</div><div class='del'>-                                                 ENAMETOOLONG}},</div><div class='del'>-        [GF_FOP_WRITE]             = { .error_no_count = 5,</div><div class='del'>-                                    .error_no = {EINVAL,EBADF,EFAULT,EISDIR,</div><div class='del'>-                                                 ENAMETOOLONG}},</div><div class='del'>-        [GF_FOP_STATFS]            = {.error_no_count = 10,</div><div class='del'>-                                   .error_no = {EACCES,EBADF,EFAULT,EINTR,</div><div class='del'>-                                                EIO,ENAMETOOLONG,ENOENT,</div><div class='del'>-                                                ENOMEM,ENOSYS,ENOTDIR}},</div><div class='del'>-        [GF_FOP_FLUSH]             = { .error_no_count = 5,</div><div class='del'>-                                    .error_no = {EACCES,EFAULT,</div><div class='del'>-                                                 ENAMETOOLONG,ENOSYS,</div><div class='del'>-                                                 ENOENT}},</div><div class='del'>-        [GF_FOP_FSYNC]             = { .error_no_count = 4,</div><div class='del'>-                                    .error_no = {EBADF,EIO,EROFS,EINVAL}},</div><div class='del'>-        [GF_FOP_SETXATTR]          = { .error_no_count = 4,</div><div class='del'>-                                    .error_no = {EACCES,EBADF,EINTR,</div><div class='del'>-                                                 ENAMETOOLONG}},</div><div class='del'>-        [GF_FOP_GETXATTR]          = { .error_no_count = 4,</div><div class='del'>-                                    .error_no = {EACCES,EBADF,ENAMETOOLONG,</div><div class='del'>-                                                 EINTR}},</div><div class='del'>-        [GF_FOP_REMOVEXATTR]       = { .error_no_count = 4,</div><div class='del'>-                                    .error_no = {EACCES,EBADF,ENAMETOOLONG,</div><div class='del'>-                                                 EINTR}},</div><div class='del'>-        [GF_FOP_OPENDIR]           = { .error_no_count = 8,</div><div class='del'>-                                    .error_no = {EACCES,EEXIST,EFAULT,</div><div class='del'>-                                                 EISDIR,EMFILE,</div><div class='del'>-                                                 ENAMETOOLONG,ENFILE,</div><div class='del'>-                                                 ENODEV}},</div><div class='del'>-        [GF_FOP_READDIR]           = { .error_no_count = 5,</div><div class='del'>-                                    .error_no = {EINVAL,EACCES,EBADF,</div><div class='del'>-                                                 EMFILE,ENOENT}},</div><div class='del'>-        [GF_FOP_READDIRP]          = { .error_no_count = 5,</div><div class='del'>-                                    .error_no = {EINVAL,EACCES,EBADF,</div><div class='del'>-                                                 EMFILE,ENOENT}},</div><div class='del'>-        [GF_FOP_FSYNCDIR]          = { .error_no_count = 4,</div><div class='del'>-                                    .error_no = {EBADF,EIO,EROFS,EINVAL}},</div><div class='del'>-        [GF_FOP_ACCESS]            = { .error_no_count = 8,</div><div class='del'>-                                    .error_no = {EACCES,ENAMETOOLONG,</div><div class='del'>-                                                 ENOENT,ENOTDIR,EROFS,</div><div class='del'>-                                                 EFAULT,EINVAL,EIO}},</div><div class='del'>-        [GF_FOP_FTRUNCATE]         = { .error_no_count = 9,</div><div class='del'>-                                    .error_no = {EACCES,EFAULT,EFBIG,</div><div class='del'>-                                                 EINTR,EINVAL,EIO,EISDIR,</div><div class='del'>-                                                 ENAMETOOLONG,ENOENT}},</div><div class='del'>-        [GF_FOP_FSTAT]             = { .error_no_count = 7,</div><div class='del'>-                                    .error_no = {EACCES,EBADF,EFAULT,</div><div class='del'>-                                                 ENAMETOOLONG,ENOENT,</div><div class='del'>-                                                 ENOMEM,ENOTDIR}},</div><div class='del'>-        [GF_FOP_LK]                = { .error_no_count = 4,</div><div class='del'>-                                    .error_no = {EACCES,EFAULT,ENOENT,</div><div class='del'>-                                                 EINTR}},</div><div class='del'>-        [GF_FOP_XATTROP]           = { .error_no_count = 5,</div><div class='del'>-                                    .error_no = {EACCES,EFAULT,</div><div class='del'>-                                                 ENAMETOOLONG,ENOSYS,</div><div class='del'>-                                                 ENOENT}},</div><div class='del'>-        [GF_FOP_FXATTROP]          = { .error_no_count = 4,</div><div class='del'>-                                    .error_no = {EBADF,EIO,EROFS,EINVAL}},</div><div class='del'>-        [GF_FOP_INODELK]           = { .error_no_count = 4,</div><div class='del'>-                                    .error_no = {EACCES,EBADF,EINTR,</div><div class='del'>-                                                 ENAMETOOLONG}},</div><div class='del'>-        [GF_FOP_FINODELK]          = { .error_no_count = 4,</div><div class='del'>-                                    .error_no = {EACCES,EBADF,EINTR,</div><div class='del'>-                                                 ENAMETOOLONG}},</div><div class='del'>-        [GF_FOP_ENTRYLK]           = { .error_no_count = 4,</div><div class='del'>-                                    .error_no = {EACCES,EBADF,</div><div class='del'>-                                                 ENAMETOOLONG,EINTR}},</div><div class='del'>-        [GF_FOP_FENTRYLK]          = { .error_no_count = 10,</div><div class='del'>-                                    .error_no = {EACCES,EEXIST,EFAULT,</div><div class='del'>-                                                 EISDIR,EMFILE,</div><div class='del'>-                                                 ENAMETOOLONG,ENFILE,</div><div class='del'>-                                                 ENODEV,ENOENT,ENOMEM}},</div><div class='del'>-        [GF_FOP_SETATTR]           = {.error_no_count = 11,</div><div class='del'>-                                    .error_no = {EACCES,EFAULT,EIO,</div><div class='del'>-                                                 ENAMETOOLONG,ENOENT,</div><div class='del'>-                                                 ENOMEM,ENOTDIR,EPERM,</div><div class='del'>-                                                 EROFS,EBADF,EIO}},</div><div class='del'>-        [GF_FOP_FSETATTR]          = { .error_no_count = 11,</div><div class='del'>-                                    .error_no = {EACCES,EFAULT,EIO,</div><div class='del'>-                                                 ENAMETOOLONG,ENOENT,</div><div class='del'>-                                                 ENOMEM,ENOTDIR,EPERM,</div><div class='del'>-                                                 EROFS,EBADF,EIO}},</div><div class='del'>-        [GF_FOP_GETSPEC]           = { .error_no_count = 4,</div><div class='del'>-                                    .error_no = {EACCES,EBADF,ENAMETOOLONG,</div><div class='del'>-                                                 EINTR}}</div><div class='del'>-};</div><div class='add'>+    [GF_FOP_LOOKUP] = {.error_no_count = 4,</div><div class='add'>+                       .error_no = {ENOENT, ENOTDIR, ENAMETOOLONG, EAGAIN}},</div><div class='add'>+    [GF_FOP_STAT] = {.error_no_count = 6,</div><div class='add'>+                     .error_no = {EACCES, EFAULT, ENAMETOOLONG, ENOENT, ENOMEM,</div><div class='add'>+                                  ENOTDIR}},</div><div class='add'>+    [GF_FOP_READLINK] = {.error_no_count = 8,</div><div class='add'>+                         .error_no = {EACCES, EFAULT, EINVAL, EIO, ENAMETOOLONG,</div><div class='add'>+                                      ENOENT, ENOMEM, ENOTDIR}},</div><div class='add'>+    [GF_FOP_MKNOD] = {.error_no_count = 11,</div><div class='add'>+                      .error_no = {EACCES, EEXIST, EFAULT, EINVAL, ENAMETOOLONG,</div><div class='add'>+                                   ENOENT, ENOMEM, ENOSPC, ENOTDIR, EPERM,</div><div class='add'>+                                   EROFS}},</div><div class='add'>+    [GF_FOP_MKDIR] = {.error_no_count = 10,</div><div class='add'>+                      .error_no = {EACCES, EEXIST, EFAULT, ENAMETOOLONG, ENOENT,</div><div class='add'>+                                   ENOMEM, ENOSPC, ENOTDIR, EPERM, EROFS}},</div><div class='add'>+    [GF_FOP_UNLINK] = {.error_no_count = 10,</div><div class='add'>+                       .error_no = {EACCES, EBUSY, EFAULT, EIO, EISDIR,</div><div class='add'>+                                    ENAMETOOLONG, ENOENT, ENOMEM, ENOTDIR,</div><div class='add'>+                                    EPERM, EROFS}},</div><div class='add'>+    [GF_FOP_RMDIR] = {.error_no_count = 8,</div><div class='add'>+                      .error_no = {EACCES, EBUSY, EFAULT, ENOMEM, ENOTDIR,</div><div class='add'>+                                   ENOTEMPTY, EPERM, EROFS}},</div><div class='add'>+    [GF_FOP_SYMLINK] = {.error_no_count = 11,</div><div class='add'>+                        .error_no = {EACCES, EEXIST, EFAULT, EIO, ENAMETOOLONG,</div><div class='add'>+                                     ENOENT, ENOMEM, ENOSPC, ENOTDIR, EPERM,</div><div class='add'>+                                     EROFS}},</div><div class='add'>+    [GF_FOP_RENAME] = {.error_no_count = 13,</div><div class='add'>+                       .error_no = {EACCES, EBUSY, EFAULT, EINVAL, EISDIR,</div><div class='add'>+                                    EMLINK, ENAMETOOLONG, ENOENT, ENOMEM,</div><div class='add'>+                                    ENOSPC, ENOTDIR, EEXIST, EXDEV}},</div><div class='add'>+    [GF_FOP_LINK] = {.error_no_count = 13,</div><div class='add'>+                     .error_no = {EACCES, EFAULT, EEXIST, EIO, EMLINK,</div><div class='add'>+                                  ENAMETOOLONG, ENOENT, ENOMEM, ENOSPC, ENOTDIR,</div><div class='add'>+                                  EPERM, EROFS, EXDEV}},</div><div class='add'>+    [GF_FOP_TRUNCATE] = {.error_no_count = 10,</div><div class='add'>+                         .error_no = {EACCES, EFAULT, EFBIG, EINTR, EINVAL, EIO,</div><div class='add'>+                                      EISDIR, ENAMETOOLONG, ENOENT, EISDIR}},</div><div class='add'>+    [GF_FOP_CREATE] = {.error_no_count = 10,</div><div class='add'>+                       .error_no = {EACCES, EEXIST, EFAULT, EISDIR, EMFILE,</div><div class='add'>+                                    ENAMETOOLONG, ENFILE, ENODEV, ENOENT,</div><div class='add'>+                                    ENODEV}},</div><div class='add'>+    [GF_FOP_OPEN] = {.error_no_count = 10,</div><div class='add'>+                     .error_no = {EACCES, EEXIST, EFAULT, EISDIR, EMFILE,</div><div class='add'>+                                  ENAMETOOLONG, ENFILE, ENODEV, ENOENT,</div><div class='add'>+                                  ENOMEM}},</div><div class='add'>+    [GF_FOP_READ] = {.error_no_count = 5,</div><div class='add'>+                     .error_no = {EINVAL, EBADF, EFAULT, EISDIR, ENAMETOOLONG}},</div><div class='add'>+    [GF_FOP_WRITE] = {.error_no_count = 7,</div><div class='add'>+                      .error_no = {EINVAL, EBADF, EFAULT, EISDIR, ENAMETOOLONG,</div><div class='add'>+                                   ENOSPC, GF_ERROR_SHORT_WRITE}},</div><div class='add'>+    [GF_FOP_STATFS] = {.error_no_count = 9,</div><div class='add'>+                       .error_no = {EACCES, EFAULT, EINTR, EIO, ENAMETOOLONG,</div><div class='add'>+                                    ENOENT, ENOMEM, ENOSYS, ENOTDIR}},</div><div class='add'>+    [GF_FOP_FLUSH] = {.error_no_count = 5,</div><div class='add'>+                      .error_no = {EACCES, EFAULT, ENAMETOOLONG, ENOSYS,</div><div class='add'>+                                   ENOENT}},</div><div class='add'>+    [GF_FOP_FSYNC] = {.error_no_count = 4,</div><div class='add'>+                      .error_no = {EBADF, EIO, EROFS, EINVAL}},</div><div class='add'>+    [GF_FOP_SETXATTR] = {.error_no_count = 3,</div><div class='add'>+                         .error_no = {EACCES, EINTR, ENAMETOOLONG}},</div><div class='add'>+    [GF_FOP_GETXATTR] = {.error_no_count = 3,</div><div class='add'>+                         .error_no = {EACCES, ENAMETOOLONG, EINTR}},</div><div class='add'>+    [GF_FOP_REMOVEXATTR] = {.error_no_count = 3,</div><div class='add'>+                            .error_no = {EACCES, ENAMETOOLONG, EINTR}},</div><div class='add'>+    [GF_FOP_FSETXATTR] = {.error_no_count = 4,</div><div class='add'>+                          .error_no = {EACCES, EBADF, EINTR, ENAMETOOLONG}},</div><div class='add'>+    [GF_FOP_FGETXATTR] = {.error_no_count = 4,</div><div class='add'>+                          .error_no = {EACCES, EBADF, ENAMETOOLONG, EINTR}},</div><div class='add'>+    [GF_FOP_FREMOVEXATTR] = {.error_no_count = 4,</div><div class='add'>+                             .error_no = {EACCES, EBADF, ENAMETOOLONG, EINTR}},</div><div class='add'>+    [GF_FOP_OPENDIR] = {.error_no_count = 8,</div><div class='add'>+                        .error_no = {EACCES, EEXIST, EFAULT, EISDIR, EMFILE,</div><div class='add'>+                                     ENAMETOOLONG, ENFILE, ENODEV}},</div><div class='add'>+    [GF_FOP_READDIR] = {.error_no_count = 5,</div><div class='add'>+                        .error_no = {EINVAL, EACCES, EBADF, EMFILE, ENOENT}},</div><div class='add'>+    [GF_FOP_READDIRP] = {.error_no_count = 5,</div><div class='add'>+                         .error_no = {EINVAL, EACCES, EBADF, EMFILE, ENOENT}},</div><div class='add'>+    [GF_FOP_FSYNCDIR] = {.error_no_count = 4,</div><div class='add'>+                         .error_no = {EBADF, EIO, EROFS, EINVAL}},</div><div class='add'>+    [GF_FOP_ACCESS] = {.error_no_count = 8,</div><div class='add'>+                       .error_no = {EACCES, ENAMETOOLONG, ENOENT, ENOTDIR,</div><div class='add'>+                                    EROFS, EFAULT, EINVAL, EIO}},</div><div class='add'>+    [GF_FOP_FTRUNCATE] = {.error_no_count = 9,</div><div class='add'>+                          .error_no = {EACCES, EFAULT, EFBIG, EINTR, EINVAL,</div><div class='add'>+                                       EIO, EISDIR, ENAMETOOLONG, ENOENT}},</div><div class='add'>+    [GF_FOP_FSTAT] = {.error_no_count = 7,</div><div class='add'>+                      .error_no = {EACCES, EBADF, EFAULT, ENAMETOOLONG, ENOENT,</div><div class='add'>+                                   ENOMEM, ENOTDIR}},</div><div class='add'>+    [GF_FOP_LK] = {.error_no_count = 4,</div><div class='add'>+                   .error_no = {EACCES, EFAULT, ENOENT, EINTR}},</div><div class='add'>+    [GF_FOP_XATTROP] = {.error_no_count = 5,</div><div class='add'>+                        .error_no = {EACCES, EFAULT, ENAMETOOLONG, ENOSYS,</div><div class='add'>+                                     ENOENT}},</div><div class='add'>+    [GF_FOP_FXATTROP] = {.error_no_count = 4,</div><div class='add'>+                         .error_no = {EBADF, EIO, EROFS, EINVAL}},</div><div class='add'>+    [GF_FOP_INODELK] = {.error_no_count = 3,</div><div class='add'>+                        .error_no = {EACCES, EINTR, ENAMETOOLONG}},</div><div class='add'>+    [GF_FOP_FINODELK] = {.error_no_count = 4,</div><div class='add'>+                         .error_no = {EACCES, EBADF, EINTR, ENAMETOOLONG}},</div><div class='add'>+    [GF_FOP_ENTRYLK] = {.error_no_count = 3,</div><div class='add'>+                        .error_no = {EACCES, ENAMETOOLONG, EINTR}},</div><div class='add'>+    [GF_FOP_FENTRYLK] = {.error_no_count = 10,</div><div class='add'>+                         .error_no = {EACCES, EEXIST, EFAULT, EISDIR, EMFILE,</div><div class='add'>+                                      ENAMETOOLONG, ENFILE, ENODEV, ENOENT,</div><div class='add'>+                                      ENOMEM}},</div><div class='add'>+    [GF_FOP_SETATTR] = {.error_no_count = 10,</div><div class='add'>+                        .error_no = {EACCES, EFAULT, EIO, ENAMETOOLONG, ENOENT,</div><div class='add'>+                                     ENOMEM, ENOTDIR, EPERM, EROFS, EIO}},</div><div class='add'>+    [GF_FOP_FSETATTR] = {.error_no_count = 11,</div><div class='add'>+                         .error_no = {EACCES, EFAULT, EIO, ENAMETOOLONG, ENOENT,</div><div class='add'>+                                      ENOMEM, ENOTDIR, EPERM, EROFS, EBADF,</div><div class='add'>+                                      EIO}},</div><div class='add'>+    [GF_FOP_GETSPEC] = {.error_no_count = 3,</div><div class='add'>+                        .error_no = {EACCES, ENAMETOOLONG, EINTR}}};</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+generate_rand_no(int op_no)</div><div class='add'>+{</div><div class='add'>+    int rand_no = 0;</div><div class='add'>+    int error_no_list_size = 0;</div><div class='add'>+</div><div class='add'>+    error_no_list_size = sizeof(error_no_list) / sizeof(error_no_list[0]);</div><div class='add'>+</div><div class='add'>+    if (op_no &lt; error_no_list_size)</div><div class='add'>+        /* coverity[DC.WEAK_CRYPTO] */</div><div class='add'>+        rand_no = rand() % error_no_list[op_no].error_no_count;</div><div class='add'>+    return rand_no;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+conv_errno_to_int(char **error_no)</div><div class='add'>+{</div><div class='add'>+    if (!strcmp((*error_no), "ENOENT"))</div><div class='add'>+        return ENOENT;</div><div class='add'>+    else if (!strcmp((*error_no), "ENOTDIR"))</div><div class='add'>+        return ENOTDIR;</div><div class='add'>+    else if (!strcmp((*error_no), "ENAMETOOLONG"))</div><div class='add'>+        return ENAMETOOLONG;</div><div class='add'>+    else if (!strcmp((*error_no), "EACCES"))</div><div class='add'>+        return EACCES;</div><div class='add'>+    else if (!strcmp((*error_no), "EBADF"))</div><div class='add'>+        return EBADF;</div><div class='add'>+    else if (!strcmp((*error_no), "EFAULT"))</div><div class='add'>+        return EFAULT;</div><div class='add'>+    else if (!strcmp((*error_no), "ENOMEM"))</div><div class='add'>+        return ENOMEM;</div><div class='add'>+    else if (!strcmp((*error_no), "EINVAL"))</div><div class='add'>+        return EINVAL;</div><div class='add'>+    else if (!strcmp((*error_no), "EIO"))</div><div class='add'>+        return EIO;</div><div class='add'>+    else if (!strcmp((*error_no), "EEXIST"))</div><div class='add'>+        return EEXIST;</div><div class='add'>+    else if (!strcmp((*error_no), "ENOSPC"))</div><div class='add'>+        return ENOSPC;</div><div class='add'>+    else if (!strcmp((*error_no), "EPERM"))</div><div class='add'>+        return EPERM;</div><div class='add'>+    else if (!strcmp((*error_no), "EROFS"))</div><div class='add'>+        return EROFS;</div><div class='add'>+    else if (!strcmp((*error_no), "EBUSY"))</div><div class='add'>+        return EBUSY;</div><div class='add'>+    else if (!strcmp((*error_no), "EISDIR"))</div><div class='add'>+        return EISDIR;</div><div class='add'>+    else if (!strcmp((*error_no), "ENOTEMPTY"))</div><div class='add'>+        return ENOTEMPTY;</div><div class='add'>+    else if (!strcmp((*error_no), "EMLINK"))</div><div class='add'>+        return EMLINK;</div><div class='add'>+    else if (!strcmp((*error_no), "ENODEV"))</div><div class='add'>+        return ENODEV;</div><div class='add'>+    else if (!strcmp((*error_no), "EXDEV"))</div><div class='add'>+        return EXDEV;</div><div class='add'>+    else if (!strcmp((*error_no), "EMFILE"))</div><div class='add'>+        return EMFILE;</div><div class='add'>+    else if (!strcmp((*error_no), "ENFILE"))</div><div class='add'>+        return ENFILE;</div><div class='add'>+    else if (!strcmp((*error_no), "ENOSYS"))</div><div class='add'>+        return ENOSYS;</div><div class='add'>+    else if (!strcmp((*error_no), "EINTR"))</div><div class='add'>+        return EINTR;</div><div class='add'>+    else if (!strcmp((*error_no), "EFBIG"))</div><div class='add'>+        return EFBIG;</div><div class='add'>+    else if (!strcmp((*error_no), "GF_ERROR_SHORT_WRITE"))</div><div class='add'>+        return GF_ERROR_SHORT_WRITE;</div><div class='add'>+    else</div><div class='add'>+        return EAGAIN;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+error_gen(xlator_t *this, int op_no)</div><div class='add'>+{</div><div class='add'>+    eg_t *egp = NULL;</div><div class='add'>+    int count = 0;</div><div class='add'>+    int error_no_int = 0;</div><div class='add'>+    int rand_no = 0;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    gf_boolean_t should_err = _gf_false;</div><div class='add'>+    int error_no_list_size = 0;</div><div class='add'>+</div><div class='add'>+    egp = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    if (egp-&gt;random_failure) {</div><div class='add'>+        /*</div><div class='add'>+         * I honestly don't know why anyone would use this "feature"</div><div class='add'>+         * but I'll try to preserve its functionality anyway.  Without</div><div class='add'>+         * locking twice to update failure_iter_no and egp-&gt;op_count</div><div class='add'>+         * separately, then not locking at all to update</div><div class='add'>+         * egp-&gt;failure_iter_no.  That's not needed for compatibility,</div><div class='add'>+         * and it's abhorrently wrong.  I have *some* standards.</div><div class='add'>+         */</div><div class='add'>+        LOCK(&amp;egp-&gt;lock);</div><div class='add'>+        {</div><div class='add'>+            count = ++(egp-&gt;op_count);</div><div class='add'>+            error_no_int = egp-&gt;error_no_int;</div><div class='add'>+            if ((count % egp-&gt;failure_iter_no) == 0) {</div><div class='add'>+                egp-&gt;op_count = 0;</div><div class='add'>+                /* coverity[DC.WEAK_CRYPTO] */</div><div class='add'>+                egp-&gt;failure_iter_no = 3 + (rand() % GF_UNIVERSAL_ANSWER);</div><div class='add'>+                should_err = _gf_true;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+        UNLOCK(&amp;egp-&gt;lock);</div><div class='add'>+    } else {</div><div class='add'>+        /*</div><div class='add'>+         * It turns out that rand() is almost universally implemented</div><div class='add'>+         * as a linear congruential PRNG, which is about as cheap as</div><div class='add'>+         * it gets.  This gets us real random behavior, including</div><div class='add'>+         * phenomena like streaks and dry spells, with controllable</div><div class='add'>+         * long-term probability, cheaply.</div><div class='add'>+         */</div><div class='add'>+        if ((rand() % FAILURE_GRANULARITY) &lt; egp-&gt;failure_iter_no) {</div><div class='add'>+            should_err = _gf_true;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    error_no_list_size = sizeof(error_no_list) / sizeof(error_no_list[0]);</div><div class='add'>+    if (should_err) {</div><div class='add'>+        if (error_no_int)</div><div class='add'>+            ret = error_no_int;</div><div class='add'>+        else {</div><div class='add'>+            rand_no = generate_rand_no(op_no);</div><div class='add'>+            if (op_no &gt;= error_no_list_size)</div><div class='add'>+                op_no = 0;</div><div class='add'>+            if (rand_no &gt;= error_no_list[op_no].error_no_count)</div><div class='add'>+                rand_no = 0;</div><div class='add'>+            ret = error_no_list[op_no].error_no[rand_no];</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-generate_rand_no (int op_no)</div><div class='add'>+error_gen_lookup(call_frame_t *frame, xlator_t *this, loc_t *loc, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-        int             rand_no = 0;</div><div class='add'>+    int op_errno = 0;</div><div class='add'>+    eg_t *egp = NULL;</div><div class='add'>+    int enable = 1;</div><div class='add'>+</div><div class='add'>+    egp = this-&gt;private;</div><div class='add'>+    enable = egp-&gt;enable[GF_FOP_LOOKUP];</div><div class='add'>+</div><div class='add'>+    if (enable)</div><div class='add'>+        op_errno = error_gen(this, GF_FOP_LOOKUP);</div><div class='add'>+</div><div class='add'>+    if (op_errno) {</div><div class='add'>+        GF_ERROR(this, "unwind(-1, %s)", strerror(op_errno));</div><div class='add'>+        STACK_UNWIND_STRICT(lookup, frame, -1, op_errno, NULL, NULL, NULL,</div><div class='add'>+                            NULL);</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        if (op_no &lt; GF_FOP_MAXVALUE)</div><div class='del'>-                rand_no = rand () % error_no_list[op_no].error_no_count;</div><div class='del'>-        return rand_no;</div><div class='add'>+    STACK_WIND_TAIL(frame, FIRST_CHILD(this), FIRST_CHILD(this)-&gt;fops-&gt;lookup,</div><div class='add'>+                    loc, xdata);</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-conv_errno_to_int (char **error_no)</div><div class='add'>+error_gen_stat(call_frame_t *frame, xlator_t *this, loc_t *loc, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-        if (!strcmp ((*error_no), "ENOENT"))</div><div class='del'>-                return ENOENT;</div><div class='del'>-        else if (!strcmp ((*error_no), "ENOTDIR"))</div><div class='del'>-                return ENOTDIR;</div><div class='del'>-        else if (!strcmp ((*error_no), "ENAMETOOLONG"))</div><div class='del'>-                return ENAMETOOLONG;</div><div class='del'>-        else if (!strcmp ((*error_no), "EACCES"))</div><div class='del'>-                return EACCES;</div><div class='del'>-        else if (!strcmp ((*error_no), "EBADF"))</div><div class='del'>-                return EBADF;</div><div class='del'>-        else if (!strcmp ((*error_no), "EFAULT"))</div><div class='del'>-                return EFAULT;</div><div class='del'>-        else if (!strcmp ((*error_no), "ENOMEM"))</div><div class='del'>-                return ENOMEM;</div><div class='del'>-        else if (!strcmp ((*error_no), "EINVAL"))</div><div class='del'>-                return EINVAL;</div><div class='del'>-        else if (!strcmp ((*error_no), "EIO"))</div><div class='del'>-                return EIO;</div><div class='del'>-        else if (!strcmp ((*error_no), "EEXIST"))</div><div class='del'>-                return EEXIST;</div><div class='del'>-        else if (!strcmp ((*error_no), "ENOSPC"))</div><div class='del'>-                return ENOSPC;</div><div class='del'>-        else if (!strcmp ((*error_no), "EPERM"))</div><div class='del'>-                return EPERM;</div><div class='del'>-        else if (!strcmp ((*error_no), "EROFS"))</div><div class='del'>-                return EROFS;</div><div class='del'>-        else if (!strcmp ((*error_no), "EBUSY"))</div><div class='del'>-                return EBUSY;</div><div class='del'>-        else if (!strcmp ((*error_no), "EISDIR"))</div><div class='del'>-                return EISDIR;</div><div class='del'>-        else if (!strcmp ((*error_no), "ENOTEMPTY"))</div><div class='del'>-                return ENOTEMPTY;</div><div class='del'>-        else if (!strcmp ((*error_no), "EMLINK"))</div><div class='del'>-                return EMLINK;</div><div class='del'>-        else if (!strcmp ((*error_no), "ENODEV"))</div><div class='del'>-                return ENODEV;</div><div class='del'>-        else if (!strcmp ((*error_no), "EXDEV"))</div><div class='del'>-                return EXDEV;</div><div class='del'>-        else if (!strcmp ((*error_no), "EMFILE"))</div><div class='del'>-                return EMFILE;</div><div class='del'>-        else if (!strcmp ((*error_no), "ENFILE"))</div><div class='del'>-                return ENFILE;</div><div class='del'>-        else if (!strcmp ((*error_no), "ENOSYS"))</div><div class='del'>-                return ENOSYS;</div><div class='del'>-        else if (!strcmp ((*error_no), "EINTR"))</div><div class='del'>-                return EINTR;</div><div class='del'>-        else if (!strcmp ((*error_no), "EFBIG"))</div><div class='del'>-                return EFBIG;</div><div class='del'>-        else</div><div class='del'>-                return EAGAIN;</div><div class='add'>+    int op_errno = 0;</div><div class='add'>+    eg_t *egp = NULL;</div><div class='add'>+    int enable = 1;</div><div class='add'>+</div><div class='add'>+    egp = this-&gt;private;</div><div class='add'>+    enable = egp-&gt;enable[GF_FOP_STAT];</div><div class='add'>+</div><div class='add'>+    if (enable)</div><div class='add'>+        op_errno = error_gen(this, GF_FOP_STAT);</div><div class='add'>+</div><div class='add'>+    if (op_errno) {</div><div class='add'>+        GF_ERROR(this, "unwind(-1, %s)", strerror(op_errno));</div><div class='add'>+        STACK_UNWIND_STRICT(stat, frame, -1, op_errno, NULL, xdata);</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    STACK_WIND_TAIL(frame, FIRST_CHILD(this), FIRST_CHILD(this)-&gt;fops-&gt;stat,</div><div class='add'>+                    loc, xdata);</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-get_fop_int (char **op_no_str)</div><div class='add'>+error_gen_setattr(call_frame_t *frame, xlator_t *this, loc_t *loc,</div><div class='add'>+                  struct iatt *stbuf, int32_t valid, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-        if (!strcmp ((*op_no_str), "lookup"))</div><div class='del'>-                return GF_FOP_LOOKUP;</div><div class='del'>-        else if (!strcmp ((*op_no_str), "stat"))</div><div class='del'>-                return GF_FOP_STAT;</div><div class='del'>-        else if (!strcmp ((*op_no_str), "readlink"))</div><div class='del'>-                return GF_FOP_READLINK;</div><div class='del'>-        else if (!strcmp ((*op_no_str), "mknod"))</div><div class='del'>-                return GF_FOP_MKNOD;</div><div class='del'>-        else if (!strcmp ((*op_no_str), "mkdir"))</div><div class='del'>-                return GF_FOP_MKDIR;</div><div class='del'>-        else if (!strcmp ((*op_no_str), "unlink"))</div><div class='del'>-                return GF_FOP_UNLINK;</div><div class='del'>-        else if (!strcmp ((*op_no_str), "rmdir"))</div><div class='del'>-                return GF_FOP_RMDIR;</div><div class='del'>-        else if (!strcmp ((*op_no_str), "symlink"))</div><div class='del'>-                return GF_FOP_SYMLINK;</div><div class='del'>-        else if (!strcmp ((*op_no_str), "rename"))</div><div class='del'>-                return GF_FOP_RENAME;</div><div class='del'>-        else if (!strcmp ((*op_no_str), "link"))</div><div class='del'>-                return GF_FOP_LINK;</div><div class='del'>-        else if (!strcmp ((*op_no_str), "truncate"))</div><div class='del'>-                return GF_FOP_TRUNCATE;</div><div class='del'>-        else if (!strcmp ((*op_no_str), "create"))</div><div class='del'>-                return GF_FOP_CREATE;</div><div class='del'>-        else if (!strcmp ((*op_no_str), "open"))</div><div class='del'>-                return GF_FOP_OPEN;</div><div class='del'>-        else if (!strcmp ((*op_no_str), "readv"))</div><div class='del'>-                return GF_FOP_READ;</div><div class='del'>-        else if (!strcmp ((*op_no_str), "writev"))</div><div class='del'>-                return GF_FOP_WRITE;</div><div class='del'>-        else if (!strcmp ((*op_no_str), "statfs"))</div><div class='del'>-                return GF_FOP_STATFS;</div><div class='del'>-        else if (!strcmp ((*op_no_str), "flush"))</div><div class='del'>-                return GF_FOP_FLUSH;</div><div class='del'>-        else if (!strcmp ((*op_no_str), "fsync"))</div><div class='del'>-                return GF_FOP_FSYNC;</div><div class='del'>-        else if (!strcmp ((*op_no_str), "setxattr"))</div><div class='del'>-                return GF_FOP_SETXATTR;</div><div class='del'>-        else if (!strcmp ((*op_no_str), "getxattr"))</div><div class='del'>-                return GF_FOP_GETXATTR;</div><div class='del'>-        else if (!strcmp ((*op_no_str), "removexattr"))</div><div class='del'>-                return GF_FOP_REMOVEXATTR;</div><div class='del'>-        else if (!strcmp ((*op_no_str), "opendir"))</div><div class='del'>-                return GF_FOP_OPENDIR;</div><div class='del'>-        else if (!strcmp ((*op_no_str), "readdir"))</div><div class='del'>-                return GF_FOP_READDIR;</div><div class='del'>-        else if (!strcmp ((*op_no_str), "readdirp"))</div><div class='del'>-                return GF_FOP_READDIRP;</div><div class='del'>-        else if (!strcmp ((*op_no_str), "fsyncdir"))</div><div class='del'>-                return GF_FOP_FSYNCDIR;</div><div class='del'>-        else if (!strcmp ((*op_no_str), "access"))</div><div class='del'>-                return GF_FOP_ACCESS;</div><div class='del'>-        else if (!strcmp ((*op_no_str), "ftruncate"))</div><div class='del'>-                return GF_FOP_FTRUNCATE;</div><div class='del'>-        else if (!strcmp ((*op_no_str), "fstat"))</div><div class='del'>-                return GF_FOP_FSTAT;</div><div class='del'>-        else if (!strcmp ((*op_no_str), "lk"))</div><div class='del'>-                return GF_FOP_LK;</div><div class='del'>-        else if (!strcmp ((*op_no_str), "xattrop"))</div><div class='del'>-                return GF_FOP_XATTROP;</div><div class='del'>-        else if (!strcmp ((*op_no_str), "fxattrop"))</div><div class='del'>-                return GF_FOP_FXATTROP;</div><div class='del'>-        else if (!strcmp ((*op_no_str), "inodelk"))</div><div class='del'>-                return GF_FOP_INODELK;</div><div class='del'>-        else if (!strcmp ((*op_no_str), "finodelk"))</div><div class='del'>-                return GF_FOP_FINODELK;</div><div class='del'>-        else if (!strcmp ((*op_no_str), "etrylk"))</div><div class='del'>-                return GF_FOP_ENTRYLK;</div><div class='del'>-        else if (!strcmp ((*op_no_str), "fentrylk"))</div><div class='del'>-                return GF_FOP_FENTRYLK;</div><div class='del'>-        else if (!strcmp ((*op_no_str), "setattr"))</div><div class='del'>-                return GF_FOP_SETATTR;</div><div class='del'>-        else if (!strcmp ((*op_no_str), "fsetattr"))</div><div class='del'>-                return GF_FOP_FSETATTR;</div><div class='del'>-        else if (!strcmp ((*op_no_str), "getspec"))</div><div class='del'>-                return GF_FOP_GETSPEC;</div><div class='del'>-	else</div><div class='del'>-                return -1;</div><div class='add'>+    int op_errno = 0;</div><div class='add'>+    eg_t *egp = NULL;</div><div class='add'>+    int enable = 1;</div><div class='add'>+</div><div class='add'>+    egp = this-&gt;private;</div><div class='add'>+    enable = egp-&gt;enable[GF_FOP_SETATTR];</div><div class='add'>+</div><div class='add'>+    if (enable)</div><div class='add'>+        op_errno = error_gen(this, GF_FOP_SETATTR);</div><div class='add'>+</div><div class='add'>+    if (op_errno) {</div><div class='add'>+        GF_ERROR(this, "unwind(-1, %s)", strerror(op_errno));</div><div class='add'>+        STACK_UNWIND_STRICT(setattr, frame, -1, op_errno, NULL, NULL, xdata);</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    STACK_WIND_TAIL(frame, FIRST_CHILD(this), FIRST_CHILD(this)-&gt;fops-&gt;setattr,</div><div class='add'>+                    loc, stbuf, valid, xdata);</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-error_gen (xlator_t *this, int op_no)</div><div class='add'>+error_gen_fsetattr(call_frame_t *frame, xlator_t *this, fd_t *fd,</div><div class='add'>+                   struct iatt *stbuf, int32_t valid, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-        eg_t             *egp = NULL;</div><div class='del'>-        int              count = 0;</div><div class='del'>-        int              failure_iter_no = GF_FAILURE_DEFAULT;</div><div class='del'>-        char             *error_no = NULL;</div><div class='del'>-        int              rand_no = 0;</div><div class='del'>-        int              ret = 0;</div><div class='add'>+    int op_errno = 0;</div><div class='add'>+    eg_t *egp = NULL;</div><div class='add'>+    int enable = 1;</div><div class='ctx'> </div><div class='del'>-        egp = this-&gt;private;</div><div class='add'>+    egp = this-&gt;private;</div><div class='add'>+    enable = egp-&gt;enable[GF_FOP_FSETATTR];</div><div class='ctx'> </div><div class='del'>-        LOCK (&amp;egp-&gt;lock);</div><div class='del'>-        {</div><div class='del'>-                count = ++egp-&gt;op_count;</div><div class='del'>-                failure_iter_no = egp-&gt;failure_iter_no;</div><div class='del'>-                error_no = egp-&gt;error_no;</div><div class='del'>-        }</div><div class='del'>-        UNLOCK (&amp;egp-&gt;lock);</div><div class='del'>-</div><div class='del'>-        if((count % failure_iter_no) == 0) {</div><div class='del'>-                LOCK (&amp;egp-&gt;lock);</div><div class='del'>-                {</div><div class='del'>-                        egp-&gt;op_count = 0;</div><div class='del'>-                }</div><div class='del'>-                UNLOCK (&amp;egp-&gt;lock);</div><div class='del'>-</div><div class='del'>-                if (error_no)</div><div class='del'>-                        ret = conv_errno_to_int (&amp;error_no);</div><div class='del'>-                else {</div><div class='del'>-</div><div class='del'>-                        rand_no = generate_rand_no (op_no);</div><div class='del'>-                        if (op_no &gt;= GF_FOP_MAXVALUE)</div><div class='del'>-                                op_no = 0;</div><div class='del'>-                        if (rand_no &gt;= error_no_list[op_no].error_no_count)</div><div class='del'>-                                rand_no = 0;</div><div class='del'>-                        ret = error_no_list[op_no].error_no[rand_no];</div><div class='del'>-                }</div><div class='del'>-                egp-&gt;failure_iter_no = 3 + (rand () % GF_UNIVERSAL_ANSWER);</div><div class='del'>-        }</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='add'>+    if (enable)</div><div class='add'>+        op_errno = error_gen(this, GF_FOP_FSETATTR);</div><div class='ctx'> </div><div class='add'>+    if (op_errno) {</div><div class='add'>+        GF_ERROR(this, "unwind(-1, %s)", strerror(op_errno));</div><div class='add'>+        STACK_UNWIND_STRICT(fsetattr, frame, -1, op_errno, NULL, NULL, xdata);</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-error_gen_lookup_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-		      int32_t op_ret, int32_t op_errno, inode_t *inode,</div><div class='del'>-		      struct iatt *buf, dict_t *dict, struct iatt *postparent)</div><div class='del'>-{</div><div class='del'>-	STACK_UNWIND_STRICT (lookup, frame, op_ret, op_errno, inode,</div><div class='del'>-                             buf, dict, postparent);</div><div class='del'>-	return 0;</div><div class='add'>+    STACK_WIND_TAIL(frame, FIRST_CHILD(this), FIRST_CHILD(this)-&gt;fops-&gt;fsetattr,</div><div class='add'>+                    fd, stbuf, valid, xdata);</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-error_gen_lookup (call_frame_t *frame, xlator_t *this, loc_t *loc,</div><div class='del'>-                  dict_t *xattr_req)</div><div class='add'>+error_gen_truncate(call_frame_t *frame, xlator_t *this, loc_t *loc,</div><div class='add'>+                   off_t offset, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-	int              op_errno = 0;</div><div class='del'>-        eg_t            *egp = NULL;</div><div class='del'>-        int              enable = 1;</div><div class='del'>-</div><div class='del'>-        egp = this-&gt;private;</div><div class='del'>-        enable = egp-&gt;enable[GF_FOP_LOOKUP];</div><div class='del'>-</div><div class='del'>-        if (enable)</div><div class='del'>-                op_errno = error_gen (this, GF_FOP_LOOKUP);</div><div class='del'>-</div><div class='del'>-	if (op_errno) {</div><div class='del'>-		GF_ERROR(this, "unwind(-1, %s)", strerror (op_errno));</div><div class='del'>-		STACK_UNWIND_STRICT (lookup, frame, -1, op_errno, NULL, NULL, NULL,</div><div class='del'>-                              NULL);</div><div class='del'>-		return 0;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	STACK_WIND (frame, error_gen_lookup_cbk,</div><div class='del'>-		    FIRST_CHILD(this),</div><div class='del'>-		    FIRST_CHILD(this)-&gt;fops-&gt;lookup,</div><div class='del'>-		    loc, xattr_req);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='add'>+    int op_errno = 0;</div><div class='add'>+    eg_t *egp = NULL;</div><div class='add'>+    int enable = 1;</div><div class='ctx'> </div><div class='add'>+    egp = this-&gt;private;</div><div class='add'>+    enable = egp-&gt;enable[GF_FOP_TRUNCATE];</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-error_gen_forget (xlator_t *this, inode_t *inode)</div><div class='del'>-{</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='add'>+    if (enable)</div><div class='add'>+        op_errno = error_gen(this, GF_FOP_TRUNCATE);</div><div class='ctx'> </div><div class='add'>+    if (op_errno) {</div><div class='add'>+        GF_ERROR(this, "unwind(-1, %s)", strerror(op_errno));</div><div class='add'>+        STACK_UNWIND_STRICT(truncate, frame, -1, op_errno, NULL, NULL, xdata);</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    STACK_WIND_TAIL(frame, FIRST_CHILD(this), FIRST_CHILD(this)-&gt;fops-&gt;truncate,</div><div class='add'>+                    loc, offset, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-error_gen_stat_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-		    int32_t op_ret, int32_t op_errno, struct iatt *buf)</div><div class='add'>+error_gen_ftruncate(call_frame_t *frame, xlator_t *this, fd_t *fd, off_t offset,</div><div class='add'>+                    dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-	STACK_UNWIND_STRICT (stat, frame, op_ret, op_errno, buf);</div><div class='add'>+    int op_errno = 0;</div><div class='add'>+    eg_t *egp = NULL;</div><div class='add'>+    int enable = 1;</div><div class='ctx'> </div><div class='del'>-	return 0;</div><div class='add'>+    egp = this-&gt;private;</div><div class='add'>+    enable = egp-&gt;enable[GF_FOP_FTRUNCATE];</div><div class='add'>+</div><div class='add'>+    if (enable)</div><div class='add'>+        op_errno = error_gen(this, GF_FOP_FTRUNCATE);</div><div class='add'>+</div><div class='add'>+    if (op_errno) {</div><div class='add'>+        GF_ERROR(this, "unwind(-1, %s)", strerror(op_errno));</div><div class='add'>+        STACK_UNWIND_STRICT(ftruncate, frame, -1, op_errno, NULL, NULL, xdata);</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    STACK_WIND_TAIL(frame, FIRST_CHILD(this),</div><div class='add'>+                    FIRST_CHILD(this)-&gt;fops-&gt;ftruncate, fd, offset, xdata);</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-error_gen_stat (call_frame_t *frame, xlator_t *this, loc_t *loc)</div><div class='add'>+error_gen_access(call_frame_t *frame, xlator_t *this, loc_t *loc, int32_t mask,</div><div class='add'>+                 dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-	int              op_errno = 0;</div><div class='del'>-        eg_t            *egp = NULL;</div><div class='del'>-        int              enable = 1;</div><div class='del'>-</div><div class='del'>-        egp = this-&gt;private;</div><div class='del'>-        enable = egp-&gt;enable[GF_FOP_STAT];</div><div class='del'>-</div><div class='del'>-        if (enable)</div><div class='del'>-                op_errno = error_gen (this, GF_FOP_STAT);</div><div class='del'>-</div><div class='del'>-	if (op_errno) {</div><div class='del'>-		GF_ERROR(this, "unwind(-1, %s)", strerror (op_errno));</div><div class='del'>-		STACK_UNWIND_STRICT (stat, frame, -1, op_errno, NULL);</div><div class='del'>-		return 0;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	STACK_WIND (frame, error_gen_stat_cbk,</div><div class='del'>-		    FIRST_CHILD(this),</div><div class='del'>-		    FIRST_CHILD(this)-&gt;fops-&gt;stat,</div><div class='del'>-		    loc);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='add'>+    int op_errno = 0;</div><div class='add'>+    eg_t *egp = NULL;</div><div class='add'>+    int enable = 1;</div><div class='ctx'> </div><div class='add'>+    egp = this-&gt;private;</div><div class='add'>+    enable = egp-&gt;enable[GF_FOP_ACCESS];</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-error_gen_setattr_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-                       int32_t op_ret, int32_t op_errno,</div><div class='del'>-                       struct iatt *preop, struct iatt *postop)</div><div class='del'>-{</div><div class='del'>-	STACK_UNWIND_STRICT (setattr, frame, op_ret, op_errno, preop, postop);</div><div class='add'>+    if (enable)</div><div class='add'>+        op_errno = error_gen(this, GF_FOP_ACCESS);</div><div class='ctx'> </div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='add'>+    if (op_errno) {</div><div class='add'>+        GF_ERROR(this, "unwind(-1, %s)", strerror(op_errno));</div><div class='add'>+        STACK_UNWIND_STRICT(access, frame, -1, op_errno, xdata);</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='add'>+    STACK_WIND_TAIL(frame, FIRST_CHILD(this), FIRST_CHILD(this)-&gt;fops-&gt;access,</div><div class='add'>+                    loc, mask, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-error_gen_setattr (call_frame_t *frame, xlator_t *this, loc_t *loc,</div><div class='del'>-                   struct iatt *stbuf, int32_t valid)</div><div class='add'>+error_gen_readlink(call_frame_t *frame, xlator_t *this, loc_t *loc, size_t size,</div><div class='add'>+                   dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-	int              op_errno = 0;</div><div class='del'>-        eg_t            *egp = NULL;</div><div class='del'>-        int              enable = 1;</div><div class='del'>-</div><div class='del'>-        egp = this-&gt;private;</div><div class='del'>-        enable = egp-&gt;enable[GF_FOP_SETATTR];</div><div class='del'>-</div><div class='del'>-        if (enable)</div><div class='del'>-                op_errno = error_gen (this, GF_FOP_SETATTR);</div><div class='del'>-</div><div class='del'>-	if (op_errno) {</div><div class='del'>-		GF_ERROR(this, "unwind(-1, %s)", strerror (op_errno));</div><div class='del'>-		STACK_UNWIND_STRICT (setattr, frame, -1, op_errno, NULL, NULL);</div><div class='del'>-		return 0;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	STACK_WIND (frame, error_gen_setattr_cbk,</div><div class='del'>-		    FIRST_CHILD(this),</div><div class='del'>-		    FIRST_CHILD(this)-&gt;fops-&gt;setattr,</div><div class='del'>-		    loc, stbuf, valid);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='add'>+    int op_errno = 0;</div><div class='add'>+    eg_t *egp = NULL;</div><div class='add'>+    int enable = 1;</div><div class='ctx'> </div><div class='add'>+    egp = this-&gt;private;</div><div class='add'>+    enable = egp-&gt;enable[GF_FOP_READLINK];</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-error_gen_fsetattr (call_frame_t *frame, xlator_t *this, fd_t *fd,</div><div class='del'>-                    struct iatt *stbuf, int32_t valid)</div><div class='del'>-{</div><div class='del'>-	int             op_errno = 0;</div><div class='del'>-        eg_t            *egp = NULL;</div><div class='del'>-        int             enable = 1;</div><div class='del'>-</div><div class='del'>-        egp = this-&gt;private;</div><div class='del'>-        enable = egp-&gt;enable[GF_FOP_FSETATTR];</div><div class='del'>-</div><div class='del'>-        if (enable)</div><div class='del'>-                op_errno = error_gen (this, GF_FOP_FSETATTR);</div><div class='del'>-</div><div class='del'>-	if (op_errno) {</div><div class='del'>-		GF_ERROR(this, "unwind(-1, %s)", strerror (op_errno));</div><div class='del'>-		STACK_UNWIND_STRICT (fsetattr, frame, -1, op_errno, NULL, NULL);</div><div class='del'>-		return 0;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	STACK_WIND (frame, error_gen_setattr_cbk,</div><div class='del'>-		    FIRST_CHILD(this),</div><div class='del'>-		    FIRST_CHILD(this)-&gt;fops-&gt;fsetattr,</div><div class='del'>-		    fd, stbuf, valid);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='add'>+    if (enable)</div><div class='add'>+        op_errno = error_gen(this, GF_FOP_READLINK);</div><div class='ctx'> </div><div class='add'>+    if (op_errno) {</div><div class='add'>+        GF_ERROR(this, "unwind(-1, %s)", strerror(op_errno));</div><div class='add'>+        STACK_UNWIND_STRICT(readlink, frame, -1, op_errno, NULL, NULL, xdata);</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-error_gen_truncate_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-			int32_t op_ret, int32_t op_errno,</div><div class='del'>-			struct iatt *prebuf, struct iatt *postbuf)</div><div class='del'>-{</div><div class='del'>-	STACK_UNWIND_STRICT (truncate, frame, op_ret, op_errno,</div><div class='del'>-                             prebuf, postbuf);</div><div class='del'>-	return 0;</div><div class='add'>+    STACK_WIND_TAIL(frame, FIRST_CHILD(this), FIRST_CHILD(this)-&gt;fops-&gt;readlink,</div><div class='add'>+                    loc, size, xdata);</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-error_gen_truncate (call_frame_t *frame, xlator_t *this, loc_t *loc,</div><div class='del'>-                    off_t offset)</div><div class='add'>+error_gen_mknod(call_frame_t *frame, xlator_t *this, loc_t *loc, mode_t mode,</div><div class='add'>+                dev_t rdev, mode_t umask, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-	int              op_errno = 0;</div><div class='del'>-        eg_t            *egp = NULL;</div><div class='del'>-        int              enable = 1;</div><div class='del'>-</div><div class='del'>-        egp = this-&gt;private;</div><div class='del'>-        enable = egp-&gt;enable[GF_FOP_TRUNCATE];</div><div class='del'>-</div><div class='del'>-        if (enable)</div><div class='del'>-                op_errno = error_gen (this, GF_FOP_TRUNCATE);</div><div class='del'>-</div><div class='del'>-	if (op_errno) {</div><div class='del'>-		GF_ERROR(this, "unwind(-1, %s)", strerror (op_errno));</div><div class='del'>-		STACK_UNWIND_STRICT (truncate, frame, -1, op_errno,</div><div class='del'>-                                     NULL, NULL);</div><div class='del'>-		return 0;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	STACK_WIND (frame, error_gen_truncate_cbk,</div><div class='del'>-		    FIRST_CHILD(this),</div><div class='del'>-		    FIRST_CHILD(this)-&gt;fops-&gt;truncate,</div><div class='del'>-		    loc, offset);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='add'>+    int op_errno = 0;</div><div class='add'>+    eg_t *egp = NULL;</div><div class='add'>+    int enable = 1;</div><div class='ctx'> </div><div class='add'>+    egp = this-&gt;private;</div><div class='add'>+    enable = egp-&gt;enable[GF_FOP_MKNOD];</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-error_gen_ftruncate_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-			 int32_t op_ret, int32_t op_errno, struct iatt *prebuf,</div><div class='del'>-                         struct iatt *postbuf)</div><div class='del'>-{</div><div class='del'>-	STACK_UNWIND_STRICT (ftruncate, frame, op_ret, op_errno,</div><div class='del'>-                             prebuf, postbuf);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='add'>+    if (enable)</div><div class='add'>+        op_errno = error_gen(this, GF_FOP_MKNOD);</div><div class='ctx'> </div><div class='add'>+    if (op_errno) {</div><div class='add'>+        GF_ERROR(this, "unwind(-1, %s)", strerror(op_errno));</div><div class='add'>+        STACK_UNWIND_STRICT(mknod, frame, -1, op_errno, NULL, NULL, NULL, NULL,</div><div class='add'>+                            xdata);</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-error_gen_ftruncate (call_frame_t *frame, xlator_t *this, fd_t *fd,</div><div class='del'>-		     off_t offset)</div><div class='del'>-{</div><div class='del'>-	int              op_errno = 0;</div><div class='del'>-        eg_t            *egp =NULL;</div><div class='del'>-        int              enable = 1;</div><div class='del'>-</div><div class='del'>-        egp = this-&gt;private;</div><div class='del'>-        enable = egp-&gt;enable[GF_FOP_FTRUNCATE];</div><div class='del'>-</div><div class='del'>-        if (enable)</div><div class='del'>-                op_errno = error_gen (this, GF_FOP_FTRUNCATE);</div><div class='del'>-</div><div class='del'>-	if (op_errno) {</div><div class='del'>-		GF_ERROR(this, "unwind(-1, %s)", strerror (op_errno));</div><div class='del'>-		STACK_UNWIND_STRICT (ftruncate, frame, -1, op_errno,</div><div class='del'>-                                     NULL, NULL);</div><div class='del'>-		return 0;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	STACK_WIND (frame, error_gen_ftruncate_cbk,</div><div class='del'>-		    FIRST_CHILD(this),</div><div class='del'>-		    FIRST_CHILD(this)-&gt;fops-&gt;ftruncate,</div><div class='del'>-		    fd, offset);</div><div class='del'>-	return 0;</div><div class='add'>+    STACK_WIND_TAIL(frame, FIRST_CHILD(this), FIRST_CHILD(this)-&gt;fops-&gt;mknod,</div><div class='add'>+                    loc, mode, rdev, umask, xdata);</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-error_gen_access_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-		      int32_t op_ret, int32_t op_errno)</div><div class='add'>+error_gen_mkdir(call_frame_t *frame, xlator_t *this, loc_t *loc, mode_t mode,</div><div class='add'>+                mode_t umask, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-	STACK_UNWIND_STRICT (access, frame, op_ret, op_errno);</div><div class='add'>+    int op_errno = 0;</div><div class='add'>+    eg_t *egp = NULL;</div><div class='add'>+    int enable = 1;</div><div class='ctx'> </div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='add'>+    egp = this-&gt;private;</div><div class='add'>+    enable = egp-&gt;enable[GF_FOP_MKDIR];</div><div class='ctx'> </div><div class='add'>+    if (enable)</div><div class='add'>+        op_errno = error_gen(this, GF_FOP_MKDIR);</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-error_gen_access (call_frame_t *frame, xlator_t *this, loc_t *loc,</div><div class='del'>-		  int32_t mask)</div><div class='del'>-{</div><div class='del'>-	int              op_errno = 0;</div><div class='del'>-        eg_t            *egp = NULL;</div><div class='del'>-        int              enable = 1;</div><div class='del'>-</div><div class='del'>-        egp = this-&gt;private;</div><div class='del'>-        enable = egp-&gt;enable[GF_FOP_ACCESS];</div><div class='del'>-</div><div class='del'>-        if (enable)</div><div class='del'>-                op_errno = error_gen (this, GF_FOP_ACCESS);</div><div class='del'>-</div><div class='del'>-	if (op_errno) {</div><div class='del'>-		GF_ERROR(this, "unwind(-1, %s)", strerror (op_errno));</div><div class='del'>-		STACK_UNWIND_STRICT (access, frame, -1, op_errno);</div><div class='del'>-		return 0;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	STACK_WIND (frame, error_gen_access_cbk,</div><div class='del'>-		    FIRST_CHILD(this),</div><div class='del'>-		    FIRST_CHILD(this)-&gt;fops-&gt;access,</div><div class='del'>-		    loc, mask);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='add'>+    if (op_errno) {</div><div class='add'>+        GF_ERROR(this, "unwind(-1, %s)", strerror(op_errno));</div><div class='add'>+        STACK_UNWIND_STRICT(mkdir, frame, -1, op_errno, NULL, NULL, NULL, NULL,</div><div class='add'>+                            xdata);</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='add'>+    STACK_WIND_TAIL(frame, FIRST_CHILD(this), FIRST_CHILD(this)-&gt;fops-&gt;mkdir,</div><div class='add'>+                    loc, mode, umask, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-error_gen_readlink_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-			int32_t op_ret, int32_t op_errno,</div><div class='del'>-			const char *path, struct iatt *sbuf)</div><div class='add'>+error_gen_unlink(call_frame_t *frame, xlator_t *this, loc_t *loc, int xflag,</div><div class='add'>+                 dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-	STACK_UNWIND_STRICT (readlink, frame, op_ret, op_errno, path, sbuf);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='add'>+    int op_errno = 0;</div><div class='add'>+    eg_t *egp = NULL;</div><div class='add'>+    int enable = 1;</div><div class='ctx'> </div><div class='add'>+    egp = this-&gt;private;</div><div class='add'>+    enable = egp-&gt;enable[GF_FOP_UNLINK];</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-error_gen_readlink (call_frame_t *frame, xlator_t *this, loc_t *loc,</div><div class='del'>-                    size_t size)</div><div class='del'>-{</div><div class='del'>-	int              op_errno = 0;</div><div class='del'>-        eg_t            *egp = NULL;</div><div class='del'>-        int              enable = 1;</div><div class='del'>-</div><div class='del'>-        egp = this-&gt;private;</div><div class='del'>-        enable = egp-&gt;enable[GF_FOP_READLINK];</div><div class='del'>-</div><div class='del'>-        if (enable)</div><div class='del'>-                op_errno = error_gen (this, GF_FOP_READLINK);</div><div class='del'>-</div><div class='del'>-	if (op_errno) {</div><div class='del'>-		GF_ERROR(this, "unwind(-1, %s)", strerror (op_errno));</div><div class='del'>-		STACK_UNWIND_STRICT (readlink, frame, -1, op_errno, NULL, NULL);</div><div class='del'>-		return 0;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	STACK_WIND (frame, error_gen_readlink_cbk,</div><div class='del'>-		    FIRST_CHILD(this),</div><div class='del'>-		    FIRST_CHILD(this)-&gt;fops-&gt;readlink,</div><div class='del'>-		    loc, size);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='add'>+    if (enable)</div><div class='add'>+        op_errno = error_gen(this, GF_FOP_UNLINK);</div><div class='ctx'> </div><div class='add'>+    if (op_errno) {</div><div class='add'>+        GF_ERROR(this, "unwind(-1, %s)", strerror(op_errno));</div><div class='add'>+        STACK_UNWIND_STRICT(unlink, frame, -1, op_errno, NULL, NULL, xdata);</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-error_gen_mknod_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-		     int32_t op_ret, int32_t op_errno, inode_t *inode,</div><div class='del'>-                     struct iatt *buf, struct iatt *preparent,</div><div class='del'>-                     struct iatt *postparent)</div><div class='del'>-{</div><div class='del'>-	STACK_UNWIND_STRICT (mknod, frame, op_ret, op_errno,</div><div class='del'>-                             inode, buf,</div><div class='del'>-                             preparent, postparent);</div><div class='del'>-	return 0;</div><div class='add'>+    STACK_WIND_TAIL(frame, FIRST_CHILD(this), FIRST_CHILD(this)-&gt;fops-&gt;unlink,</div><div class='add'>+                    loc, xflag, xdata);</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-error_gen_mknod (call_frame_t *frame, xlator_t *this, loc_t *loc,</div><div class='del'>-		 mode_t mode, dev_t rdev, dict_t *params)</div><div class='add'>+error_gen_rmdir(call_frame_t *frame, xlator_t *this, loc_t *loc, int flags,</div><div class='add'>+                dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-	int              op_errno = 0;</div><div class='del'>-        eg_t            *egp = NULL;</div><div class='del'>-        int              enable = 1;</div><div class='del'>-</div><div class='del'>-        egp = this-&gt;private;</div><div class='del'>-        enable = egp-&gt;enable[GF_FOP_MKNOD];</div><div class='del'>-</div><div class='del'>-        if (enable)</div><div class='del'>-                op_errno = error_gen (this, GF_FOP_MKNOD);</div><div class='del'>-</div><div class='del'>-	if (op_errno) {</div><div class='del'>-		GF_ERROR(this, "unwind(-1, %s)", strerror (op_errno));</div><div class='del'>-		STACK_UNWIND_STRICT (mknod, frame, -1, op_errno, NULL, NULL,</div><div class='del'>-                                     NULL, NULL);</div><div class='del'>-		return 0;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	STACK_WIND (frame, error_gen_mknod_cbk,</div><div class='del'>-		    FIRST_CHILD(this),</div><div class='del'>-		    FIRST_CHILD(this)-&gt;fops-&gt;mknod,</div><div class='del'>-		    loc, mode, rdev, params);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='add'>+    int op_errno = 0;</div><div class='add'>+    eg_t *egp = NULL;</div><div class='add'>+    int enable = 1;</div><div class='ctx'> </div><div class='add'>+    egp = this-&gt;private;</div><div class='add'>+    enable = egp-&gt;enable[GF_FOP_RMDIR];</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-error_gen_mkdir_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-		     int32_t op_ret, int32_t op_errno, inode_t *inode,</div><div class='del'>-                     struct iatt *buf, struct iatt *preparent,</div><div class='del'>-                     struct iatt *postparent)</div><div class='del'>-{</div><div class='del'>-	STACK_UNWIND_STRICT (mkdir, frame, op_ret, op_errno,</div><div class='del'>-                             inode, buf,</div><div class='del'>-                             preparent, postparent);</div><div class='del'>-	return 0;</div><div class='add'>+    if (enable)</div><div class='add'>+        op_errno = error_gen(this, GF_FOP_RMDIR);</div><div class='add'>+</div><div class='add'>+    if (op_errno) {</div><div class='add'>+        GF_ERROR(this, "unwind(-1, %s)", strerror(op_errno));</div><div class='add'>+        STACK_UNWIND_STRICT(rmdir, frame, -1, op_errno, NULL, NULL, xdata);</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    STACK_WIND_TAIL(frame, FIRST_CHILD(this), FIRST_CHILD(this)-&gt;fops-&gt;rmdir,</div><div class='add'>+                    loc, flags, xdata);</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-error_gen_mkdir (call_frame_t *frame, xlator_t *this,</div><div class='del'>-		 loc_t *loc, mode_t mode, dict_t *params)</div><div class='add'>+error_gen_symlink(call_frame_t *frame, xlator_t *this, const char *linkpath,</div><div class='add'>+                  loc_t *loc, mode_t umask, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-	int              op_errno = 0;</div><div class='del'>-        eg_t            *egp = NULL;</div><div class='del'>-        int              enable = 1;</div><div class='del'>-</div><div class='del'>-        egp = this-&gt;private;</div><div class='del'>-        enable = egp-&gt;enable[GF_FOP_MKDIR];</div><div class='del'>-</div><div class='del'>-        if (enable)</div><div class='del'>-                op_errno = error_gen (this, GF_FOP_MKDIR);</div><div class='del'>-</div><div class='del'>-	if (op_errno) {</div><div class='del'>-		GF_ERROR(this, "unwind(-1, %s)", strerror (op_errno));</div><div class='del'>-		STACK_UNWIND_STRICT (mkdir, frame, -1, op_errno, NULL, NULL,</div><div class='del'>-                                     NULL, NULL);</div><div class='del'>-		return 0;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	STACK_WIND (frame, error_gen_mkdir_cbk,</div><div class='del'>-		    FIRST_CHILD(this),</div><div class='del'>-		    FIRST_CHILD(this)-&gt;fops-&gt;mkdir,</div><div class='del'>-		    loc, mode, params);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='add'>+    int op_errno = 0;</div><div class='add'>+    eg_t *egp = NULL;</div><div class='add'>+    int enable = 1;</div><div class='ctx'> </div><div class='add'>+    egp = this-&gt;private;</div><div class='add'>+    enable = egp-&gt;enable[GF_FOP_SYMLINK];</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-error_gen_unlink_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-		      int32_t op_ret, int32_t op_errno,</div><div class='del'>-                      struct iatt *preparent, struct iatt *postparent)</div><div class='del'>-{</div><div class='del'>-	STACK_UNWIND_STRICT (unlink, frame, op_ret, op_errno,</div><div class='del'>-                             preparent, postparent);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='add'>+    if (enable)</div><div class='add'>+        op_errno = error_gen(this, GF_FOP_SYMLINK);</div><div class='ctx'> </div><div class='add'>+    if (op_errno) {</div><div class='add'>+        GF_ERROR(this, "unwind(-1, %s)", strerror(op_errno));</div><div class='add'>+        STACK_UNWIND_STRICT(symlink, frame, -1, op_errno, NULL, NULL, NULL,</div><div class='add'>+                            NULL, NULL); /* pre &amp; post parent attr */</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-error_gen_unlink (call_frame_t *frame, xlator_t *this, loc_t *loc)</div><div class='del'>-{</div><div class='del'>-	int              op_errno = 0;</div><div class='del'>-        eg_t            *egp = NULL;</div><div class='del'>-        int              enable = 1;</div><div class='del'>-</div><div class='del'>-        egp = this-&gt;private;</div><div class='del'>-        enable = egp-&gt;enable[GF_FOP_UNLINK];</div><div class='del'>-</div><div class='del'>-        if (enable)</div><div class='del'>-                op_errno = error_gen (this, GF_FOP_UNLINK);</div><div class='del'>-</div><div class='del'>-	if (op_errno) {</div><div class='del'>-		GF_ERROR(this, "unwind(-1, %s)", strerror (op_errno));</div><div class='del'>-		STACK_UNWIND_STRICT (unlink, frame, -1, op_errno, NULL, NULL);</div><div class='del'>-		return 0;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	STACK_WIND (frame, error_gen_unlink_cbk,</div><div class='del'>-		    FIRST_CHILD(this),</div><div class='del'>-		    FIRST_CHILD(this)-&gt;fops-&gt;unlink,</div><div class='del'>-		    loc);</div><div class='del'>-	return 0;</div><div class='add'>+    STACK_WIND_TAIL(frame, FIRST_CHILD(this), FIRST_CHILD(this)-&gt;fops-&gt;symlink,</div><div class='add'>+                    linkpath, loc, umask, xdata);</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-error_gen_rmdir_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-		     int32_t op_ret, int32_t op_errno,</div><div class='del'>-                     struct iatt *preparent, struct iatt *postparent)</div><div class='add'>+error_gen_rename(call_frame_t *frame, xlator_t *this, loc_t *oldloc,</div><div class='add'>+                 loc_t *newloc, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-	STACK_UNWIND_STRICT (rmdir, frame, op_ret, op_errno,</div><div class='del'>-                             preparent, postparent);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='add'>+    int op_errno = 0;</div><div class='add'>+    eg_t *egp = NULL;</div><div class='add'>+    int enable = 1;</div><div class='ctx'> </div><div class='add'>+    egp = this-&gt;private;</div><div class='add'>+    enable = egp-&gt;enable[GF_FOP_RENAME];</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-error_gen_rmdir (call_frame_t *frame, xlator_t *this, loc_t *loc)</div><div class='del'>-{</div><div class='del'>-	int              op_errno = 0;</div><div class='del'>-        eg_t            *egp = NULL;</div><div class='del'>-        int              enable = 1;</div><div class='del'>-</div><div class='del'>-        egp = this-&gt;private;</div><div class='del'>-        enable = egp-&gt;enable[GF_FOP_RMDIR];</div><div class='del'>-</div><div class='del'>-        if (enable)</div><div class='del'>-                op_errno = error_gen (this, GF_FOP_RMDIR);</div><div class='del'>-</div><div class='del'>-	if (op_errno) {</div><div class='del'>-		GF_ERROR(this, "unwind(-1, %s)", strerror (op_errno));</div><div class='del'>-		STACK_UNWIND_STRICT (rmdir, frame, -1, op_errno, NULL, NULL);</div><div class='del'>-		return 0;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	STACK_WIND (frame, error_gen_rmdir_cbk,</div><div class='del'>-		    FIRST_CHILD(this),</div><div class='del'>-		    FIRST_CHILD(this)-&gt;fops-&gt;rmdir,</div><div class='del'>-		    loc);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='add'>+    if (enable)</div><div class='add'>+        op_errno = error_gen(this, GF_FOP_RENAME);</div><div class='ctx'> </div><div class='add'>+    if (op_errno) {</div><div class='add'>+        GF_ERROR(this, "unwind(-1, %s)", strerror(op_errno));</div><div class='add'>+        STACK_UNWIND_STRICT(rename, frame, -1, op_errno, NULL, NULL, NULL, NULL,</div><div class='add'>+                            NULL, NULL);</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-error_gen_symlink_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-		       int32_t op_ret, int32_t op_errno, inode_t *inode,</div><div class='del'>-                       struct iatt *buf, struct iatt *preparent,</div><div class='del'>-                       struct iatt *postparent)</div><div class='del'>-{</div><div class='del'>-	STACK_UNWIND_STRICT (symlink, frame, op_ret, op_errno, inode, buf,</div><div class='del'>-                             preparent, postparent);</div><div class='del'>-	return 0;</div><div class='add'>+    STACK_WIND_TAIL(frame, FIRST_CHILD(this), FIRST_CHILD(this)-&gt;fops-&gt;rename,</div><div class='add'>+                    oldloc, newloc, xdata);</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-error_gen_symlink (call_frame_t *frame, xlator_t *this, const char *linkpath,</div><div class='del'>-		   loc_t *loc, dict_t *params)</div><div class='add'>+error_gen_link(call_frame_t *frame, xlator_t *this, loc_t *oldloc,</div><div class='add'>+               loc_t *newloc, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-	int              op_errno = 0;</div><div class='del'>-        eg_t            *egp = NULL;</div><div class='del'>-        int              enable = 1;</div><div class='del'>-</div><div class='del'>-        egp = this-&gt;private;</div><div class='del'>-        enable = egp-&gt;enable[GF_FOP_SYMLINK];</div><div class='del'>-</div><div class='del'>-        if (enable)</div><div class='del'>-                op_errno = error_gen (this, GF_FOP_SYMLINK);</div><div class='del'>-</div><div class='del'>-	if (op_errno) {</div><div class='del'>-		GF_ERROR(this, "unwind(-1, %s)", strerror (op_errno));</div><div class='del'>-		STACK_UNWIND_STRICT (symlink, frame, -1, op_errno, NULL, NULL,</div><div class='del'>-                                     NULL, NULL); /* pre &amp; post parent attr */</div><div class='del'>-		return 0;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	STACK_WIND (frame, error_gen_symlink_cbk,</div><div class='del'>-		    FIRST_CHILD(this),</div><div class='del'>-		    FIRST_CHILD(this)-&gt;fops-&gt;symlink,</div><div class='del'>-		    linkpath, loc, params);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='add'>+    int op_errno = 0;</div><div class='add'>+    eg_t *egp = NULL;</div><div class='add'>+    int enable = 1;</div><div class='ctx'> </div><div class='add'>+    egp = this-&gt;private;</div><div class='add'>+    enable = egp-&gt;enable[GF_FOP_LINK];</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-error_gen_rename_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-		      int32_t op_ret, int32_t op_errno, struct iatt *buf,</div><div class='del'>-                      struct iatt *preoldparent, struct iatt *postoldparent,</div><div class='del'>-                      struct iatt *prenewparent, struct iatt *postnewparent)</div><div class='del'>-{</div><div class='del'>-	STACK_UNWIND_STRICT (rename, frame, op_ret, op_errno, buf,</div><div class='del'>-                             preoldparent, postoldparent,</div><div class='del'>-                             prenewparent, postnewparent);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='add'>+    if (enable)</div><div class='add'>+        op_errno = error_gen(this, GF_FOP_LINK);</div><div class='ctx'> </div><div class='add'>+    if (op_errno) {</div><div class='add'>+        GF_ERROR(this, "unwind(-1, %s)", strerror(op_errno));</div><div class='add'>+        STACK_UNWIND_STRICT(link, frame, -1, op_errno, NULL, NULL, NULL, NULL,</div><div class='add'>+                            NULL);</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-error_gen_rename (call_frame_t *frame, xlator_t *this,</div><div class='del'>-		  loc_t *oldloc, loc_t *newloc)</div><div class='del'>-{</div><div class='del'>-	int              op_errno = 0;</div><div class='del'>-        eg_t            *egp = NULL;</div><div class='del'>-        int              enable = 1;</div><div class='del'>-</div><div class='del'>-        egp = this-&gt;private;</div><div class='del'>-        enable = egp-&gt;enable[GF_FOP_RENAME];</div><div class='del'>-</div><div class='del'>-        if (enable)</div><div class='del'>-                op_errno = error_gen (this, GF_FOP_RENAME);</div><div class='del'>-</div><div class='del'>-	if (op_errno) {</div><div class='del'>-		GF_ERROR(this, "unwind(-1, %s)", strerror (op_errno));</div><div class='del'>-		STACK_UNWIND_STRICT (rename, frame, -1, op_errno, NULL,</div><div class='del'>-                                     NULL, NULL, NULL, NULL); /* pre &amp; post parent attr */</div><div class='del'>-		return 0;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	STACK_WIND (frame, error_gen_rename_cbk,</div><div class='del'>-		    FIRST_CHILD(this),</div><div class='del'>-		    FIRST_CHILD(this)-&gt;fops-&gt;rename,</div><div class='del'>-		    oldloc, newloc);</div><div class='del'>-	return 0;</div><div class='add'>+    STACK_WIND_TAIL(frame, FIRST_CHILD(this), FIRST_CHILD(this)-&gt;fops-&gt;link,</div><div class='add'>+                    oldloc, newloc, xdata);</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-error_gen_link_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-		    int32_t op_ret, int32_t op_errno, inode_t *inode,</div><div class='del'>-                    struct iatt *buf, struct iatt *preparent,</div><div class='del'>-                    struct iatt *postparent)</div><div class='add'>+error_gen_create(call_frame_t *frame, xlator_t *this, loc_t *loc, int32_t flags,</div><div class='add'>+                 mode_t mode, mode_t umask, fd_t *fd, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-	STACK_UNWIND_STRICT (link, frame, op_ret, op_errno, inode, buf,</div><div class='del'>-                             preparent, postparent);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='add'>+    int op_errno = 0;</div><div class='add'>+    eg_t *egp = NULL;</div><div class='add'>+    int enable = 1;</div><div class='ctx'> </div><div class='add'>+    egp = this-&gt;private;</div><div class='add'>+    enable = egp-&gt;enable[GF_FOP_CREATE];</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-error_gen_link (call_frame_t *frame, xlator_t *this,</div><div class='del'>-		loc_t *oldloc, loc_t *newloc)</div><div class='del'>-{</div><div class='del'>-	int             op_errno = 0;</div><div class='del'>-        eg_t            *egp = NULL;</div><div class='del'>-        int             enable = 1;</div><div class='del'>-</div><div class='del'>-        egp = this-&gt;private;</div><div class='del'>-        enable = egp-&gt;enable[GF_FOP_LINK];</div><div class='del'>-</div><div class='del'>-        if (enable)</div><div class='del'>-                op_errno = error_gen (this, GF_FOP_LINK);</div><div class='del'>-</div><div class='del'>-	if (op_errno) {</div><div class='del'>-		GF_ERROR(this, "unwind(-1, %s)", strerror (op_errno));</div><div class='del'>-		STACK_UNWIND_STRICT (link, frame, -1, op_errno, NULL, NULL,</div><div class='del'>-                                     NULL, NULL); /* pre &amp; post parent attr */</div><div class='del'>-		return 0;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	STACK_WIND (frame, error_gen_link_cbk,</div><div class='del'>-		    FIRST_CHILD(this),</div><div class='del'>-		    FIRST_CHILD(this)-&gt;fops-&gt;link,</div><div class='del'>-		    oldloc, newloc);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='add'>+    if (enable)</div><div class='add'>+        op_errno = error_gen(this, GF_FOP_CREATE);</div><div class='ctx'> </div><div class='add'>+    if (op_errno) {</div><div class='add'>+        GF_ERROR(this, "unwind(-1, %s)", strerror(op_errno));</div><div class='add'>+        STACK_UNWIND_STRICT(create, frame, -1, op_errno, NULL, NULL, NULL, NULL,</div><div class='add'>+                            NULL, NULL);</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-error_gen_create_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-		      int32_t op_ret, int32_t op_errno,</div><div class='del'>-		      fd_t *fd, inode_t *inode, struct iatt *buf,</div><div class='del'>-                      struct iatt *preparent, struct iatt *postparent)</div><div class='del'>-{</div><div class='del'>-	STACK_UNWIND_STRICT (create, frame, op_ret, op_errno, fd, inode, buf,</div><div class='del'>-                             preparent, postparent);</div><div class='del'>-	return 0;</div><div class='add'>+    STACK_WIND_TAIL(frame, FIRST_CHILD(this), FIRST_CHILD(this)-&gt;fops-&gt;create,</div><div class='add'>+                    loc, flags, mode, umask, fd, xdata);</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-error_gen_create (call_frame_t *frame, xlator_t *this, loc_t *loc,</div><div class='del'>-		  int32_t flags, mode_t mode, fd_t *fd, dict_t *params)</div><div class='add'>+error_gen_open(call_frame_t *frame, xlator_t *this, loc_t *loc, int32_t flags,</div><div class='add'>+               fd_t *fd, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-	int             op_errno = 0;</div><div class='del'>-        eg_t            *egp = NULL;</div><div class='del'>-        int             enable = 1;</div><div class='del'>-</div><div class='del'>-        egp = this-&gt;private;</div><div class='del'>-        enable = egp-&gt;enable[GF_FOP_CREATE];</div><div class='del'>-</div><div class='del'>-        if (enable)</div><div class='del'>-                op_errno = error_gen (this, GF_FOP_CREATE);</div><div class='del'>-</div><div class='del'>-	if (op_errno) {</div><div class='del'>-		GF_ERROR(this, "unwind(-1, %s)", strerror (op_errno));</div><div class='del'>-		STACK_UNWIND_STRICT (create, frame, -1, op_errno, NULL, NULL,</div><div class='del'>-                                     NULL, NULL, NULL); /* pre &amp; post attr */</div><div class='del'>-		return 0;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	STACK_WIND (frame, error_gen_create_cbk,</div><div class='del'>-		    FIRST_CHILD(this),</div><div class='del'>-		    FIRST_CHILD(this)-&gt;fops-&gt;create,</div><div class='del'>-		    loc, flags, mode, fd, params);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='add'>+    int op_errno = 0;</div><div class='add'>+    eg_t *egp = NULL;</div><div class='add'>+    int enable = 1;</div><div class='ctx'> </div><div class='add'>+    egp = this-&gt;private;</div><div class='add'>+    enable = egp-&gt;enable[GF_FOP_OPEN];</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-error_gen_open_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-		    int32_t op_ret, int32_t op_errno, fd_t *fd)</div><div class='del'>-{</div><div class='del'>-	STACK_UNWIND_STRICT (open, frame, op_ret, op_errno, fd);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='add'>+    if (enable)</div><div class='add'>+        op_errno = error_gen(this, GF_FOP_OPEN);</div><div class='ctx'> </div><div class='add'>+    if (op_errno) {</div><div class='add'>+        GF_ERROR(this, "unwind(-1, %s)", strerror(op_errno));</div><div class='add'>+        STACK_UNWIND_STRICT(open, frame, -1, op_errno, NULL, xdata);</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-error_gen_open (call_frame_t *frame, xlator_t *this, loc_t *loc,</div><div class='del'>-		int32_t flags, fd_t *fd, int32_t wbflags)</div><div class='del'>-{</div><div class='del'>-	int              op_errno = 0;</div><div class='del'>-        eg_t            *egp = NULL;</div><div class='del'>-        int              enable = 1;</div><div class='del'>-</div><div class='del'>-        egp = this-&gt;private;</div><div class='del'>-        enable = egp-&gt;enable[GF_FOP_OPEN];</div><div class='del'>-</div><div class='del'>-        if (enable)</div><div class='del'>-                op_errno = error_gen (this, GF_FOP_OPEN);</div><div class='del'>-</div><div class='del'>-	if (op_errno) {</div><div class='del'>-		GF_ERROR(this, "unwind(-1, %s)", strerror (op_errno));</div><div class='del'>-		STACK_UNWIND_STRICT (open, frame, -1, op_errno, NULL);</div><div class='del'>-		return 0;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	STACK_WIND (frame, error_gen_open_cbk,</div><div class='del'>-		    FIRST_CHILD(this),</div><div class='del'>-		    FIRST_CHILD(this)-&gt;fops-&gt;open,</div><div class='del'>-		    loc, flags, fd, wbflags);</div><div class='del'>-	return 0;</div><div class='add'>+    STACK_WIND_TAIL(frame, FIRST_CHILD(this), FIRST_CHILD(this)-&gt;fops-&gt;open,</div><div class='add'>+                    loc, flags, fd, xdata);</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-error_gen_readv_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-		     int32_t op_ret, int32_t op_errno,</div><div class='del'>-		     struct iovec *vector, int32_t count,</div><div class='del'>-		     struct iatt *stbuf, struct iobref *iobref)</div><div class='add'>+error_gen_readv(call_frame_t *frame, xlator_t *this, fd_t *fd, size_t size,</div><div class='add'>+                off_t offset, uint32_t flags, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-	STACK_UNWIND_STRICT (readv, frame, op_ret, op_errno,</div><div class='del'>-                             vector, count, stbuf, iobref);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='add'>+    int op_errno = 0;</div><div class='add'>+    eg_t *egp = NULL;</div><div class='add'>+    int enable = 1;</div><div class='add'>+</div><div class='add'>+    egp = this-&gt;private;</div><div class='add'>+    enable = egp-&gt;enable[GF_FOP_READ];</div><div class='add'>+</div><div class='add'>+    if (enable)</div><div class='add'>+        op_errno = error_gen(this, GF_FOP_READ);</div><div class='ctx'> </div><div class='add'>+    if (op_errno) {</div><div class='add'>+        GF_ERROR(this, "unwind(-1, %s)", strerror(op_errno));</div><div class='add'>+        STACK_UNWIND_STRICT(readv, frame, -1, op_errno, NULL, 0, NULL, NULL,</div><div class='add'>+                            xdata);</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    STACK_WIND_TAIL(frame, FIRST_CHILD(this), FIRST_CHILD(this)-&gt;fops-&gt;readv,</div><div class='add'>+                    fd, size, offset, flags, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-error_gen_readv (call_frame_t *frame, xlator_t *this,</div><div class='del'>-		 fd_t *fd, size_t size, off_t offset)</div><div class='add'>+error_gen_writev(call_frame_t *frame, xlator_t *this, fd_t *fd,</div><div class='add'>+                 struct iovec *vector, int32_t count, off_t off, uint32_t flags,</div><div class='add'>+                 struct iobref *iobref, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-	int              op_errno = 0;</div><div class='del'>-        eg_t            *egp = NULL;</div><div class='del'>-        int              enable = 1;</div><div class='add'>+    int op_errno = 0;</div><div class='add'>+    eg_t *egp = NULL;</div><div class='add'>+    int enable = 1;</div><div class='add'>+    struct iovec *shortvec = NULL;</div><div class='ctx'> </div><div class='del'>-        egp = this-&gt;private;</div><div class='del'>-        enable = egp-&gt;enable[GF_FOP_READ];</div><div class='add'>+    egp = this-&gt;private;</div><div class='add'>+    enable = egp-&gt;enable[GF_FOP_WRITE];</div><div class='ctx'> </div><div class='del'>-        if (enable)</div><div class='del'>-                op_errno = error_gen (this, GF_FOP_READ);</div><div class='add'>+    if (enable)</div><div class='add'>+        op_errno = error_gen(this, GF_FOP_WRITE);</div><div class='ctx'> </div><div class='del'>-	if (op_errno) {</div><div class='del'>-		GF_ERROR(this, "unwind(-1, %s)", strerror (op_errno));</div><div class='del'>-		STACK_UNWIND_STRICT (readv, frame, -1, op_errno, NULL, 0,</div><div class='del'>-                                     NULL, NULL);</div><div class='del'>-		return 0;</div><div class='del'>-	}</div><div class='add'>+    if (op_errno == GF_ERROR_SHORT_WRITE) {</div><div class='add'>+        /*</div><div class='add'>+         * A short write error returns some value less than what was</div><div class='add'>+         * requested from a write. To simulate this, replace the vector</div><div class='add'>+         * with one half the size;</div><div class='add'>+         */</div><div class='add'>+        shortvec = iov_dup(vector, 1);</div><div class='add'>+        shortvec-&gt;iov_len /= 2;</div><div class='add'>+        count = 1;</div><div class='add'>+        goto wind;</div><div class='add'>+    } else if (op_errno) {</div><div class='add'>+        GF_ERROR(this, "unwind(-1, %s)", strerror(op_errno));</div><div class='add'>+        STACK_UNWIND_STRICT(writev, frame, -1, op_errno, NULL, NULL, xdata);</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='add'>+wind:</div><div class='add'>+    STACK_WIND_TAIL(frame, FIRST_CHILD(this), FIRST_CHILD(this)-&gt;fops-&gt;writev,</div><div class='add'>+                    fd, shortvec ? shortvec : vector, count, off, flags, iobref,</div><div class='add'>+                    xdata);</div><div class='ctx'> </div><div class='del'>-</div><div class='del'>-	STACK_WIND (frame, error_gen_readv_cbk,</div><div class='del'>-		    FIRST_CHILD(this),</div><div class='del'>-		    FIRST_CHILD(this)-&gt;fops-&gt;readv,</div><div class='del'>-		    fd, size, offset);</div><div class='del'>-	return 0;</div><div class='add'>+    if (shortvec)</div><div class='add'>+        GF_FREE(shortvec);</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-error_gen_writev_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-		      int32_t op_ret, int32_t op_errno,</div><div class='del'>-                      struct iatt *prebuf, struct iatt *postbuf)</div><div class='add'>+error_gen_flush(call_frame_t *frame, xlator_t *this, fd_t *fd, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-	STACK_UNWIND_STRICT (writev, frame, op_ret, op_errno, prebuf, postbuf);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='add'>+    int op_errno = 0;</div><div class='add'>+    eg_t *egp = NULL;</div><div class='add'>+    int enable = 1;</div><div class='ctx'> </div><div class='add'>+    egp = this-&gt;private;</div><div class='add'>+    enable = egp-&gt;enable[GF_FOP_FLUSH];</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-error_gen_writev (call_frame_t *frame, xlator_t *this, fd_t *fd,</div><div class='del'>-		  struct iovec *vector, int32_t count,</div><div class='del'>-		  off_t off, struct iobref *iobref)</div><div class='del'>-{</div><div class='del'>-	int              op_errno = 0;</div><div class='del'>-        eg_t            *egp = NULL;</div><div class='del'>-        int              enable = 1;</div><div class='del'>-</div><div class='del'>-        egp = this-&gt;private;</div><div class='del'>-        enable = egp-&gt;enable[GF_FOP_WRITE];</div><div class='del'>-</div><div class='del'>-        if (enable)</div><div class='del'>-                op_errno = error_gen (this, GF_FOP_WRITE);</div><div class='del'>-</div><div class='del'>-	if (op_errno) {</div><div class='del'>-		GF_ERROR(this, "unwind(-1, %s)", strerror (op_errno));</div><div class='del'>-		STACK_UNWIND_STRICT (writev, frame, -1, op_errno, NULL, NULL);</div><div class='del'>-		return 0;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	STACK_WIND (frame, error_gen_writev_cbk,</div><div class='del'>-		    FIRST_CHILD(this),</div><div class='del'>-		    FIRST_CHILD(this)-&gt;fops-&gt;writev,</div><div class='del'>-		    fd, vector, count, off, iobref);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='add'>+    if (enable)</div><div class='add'>+        op_errno = error_gen(this, GF_FOP_FLUSH);</div><div class='ctx'> </div><div class='add'>+    if (op_errno) {</div><div class='add'>+        GF_ERROR(this, "unwind(-1, %s)", strerror(op_errno));</div><div class='add'>+        STACK_UNWIND_STRICT(flush, frame, -1, op_errno, xdata);</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-error_gen_flush_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-		     int32_t op_ret, int32_t op_errno)</div><div class='del'>-{</div><div class='del'>-	STACK_UNWIND_STRICT (flush, frame, op_ret, op_errno);</div><div class='del'>-	return 0;</div><div class='add'>+    STACK_WIND_TAIL(frame, FIRST_CHILD(this), FIRST_CHILD(this)-&gt;fops-&gt;flush,</div><div class='add'>+                    fd, xdata);</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-error_gen_flush (call_frame_t *frame, xlator_t *this, fd_t *fd)</div><div class='add'>+error_gen_fsync(call_frame_t *frame, xlator_t *this, fd_t *fd, int32_t flags,</div><div class='add'>+                dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-	int              op_errno = 0;</div><div class='del'>-        eg_t            *egp = NULL;</div><div class='del'>-        int              enable = 1;</div><div class='del'>-</div><div class='del'>-        egp = this-&gt;private;</div><div class='del'>-        enable = egp-&gt;enable[GF_FOP_FLUSH];</div><div class='del'>-</div><div class='del'>-        if (enable)</div><div class='del'>-                op_errno = error_gen (this, GF_FOP_FLUSH);</div><div class='del'>-</div><div class='del'>-	if (op_errno) {</div><div class='del'>-		GF_ERROR(this, "unwind(-1, %s)", strerror (op_errno));</div><div class='del'>-		STACK_UNWIND_STRICT (flush, frame, -1, op_errno);</div><div class='del'>-		return 0;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	STACK_WIND (frame, error_gen_flush_cbk,</div><div class='del'>-                    FIRST_CHILD(this),</div><div class='del'>-		    FIRST_CHILD(this)-&gt;fops-&gt;flush,</div><div class='del'>-		    fd);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='add'>+    int op_errno = 0;</div><div class='add'>+    eg_t *egp = NULL;</div><div class='add'>+    int enable = 1;</div><div class='ctx'> </div><div class='add'>+    egp = this-&gt;private;</div><div class='add'>+    enable = egp-&gt;enable[GF_FOP_FSYNC];</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-error_gen_fsync_cbk (call_frame_t *frame, void *cookie,</div><div class='del'>-		     xlator_t *this, int32_t op_ret,</div><div class='del'>-		     int32_t op_errno, struct iatt *prebuf,</div><div class='del'>-                     struct iatt *postbuf)</div><div class='del'>-{</div><div class='del'>-	STACK_UNWIND_STRICT (fsync, frame, op_ret, op_errno, prebuf, postbuf);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='add'>+    if (enable)</div><div class='add'>+        op_errno = error_gen(this, GF_FOP_FSYNC);</div><div class='ctx'> </div><div class='add'>+    if (op_errno) {</div><div class='add'>+        GF_ERROR(this, "unwind(-1, %s)", strerror(op_errno));</div><div class='add'>+        STACK_UNWIND_STRICT(fsync, frame, -1, op_errno, NULL, NULL, xdata);</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-error_gen_fsync (call_frame_t *frame, xlator_t *this, fd_t *fd, int32_t flags)</div><div class='del'>-{</div><div class='del'>-	int              op_errno = 0;</div><div class='del'>-        eg_t            *egp = NULL;</div><div class='del'>-        int              enable = 1;</div><div class='del'>-</div><div class='del'>-        egp = this-&gt;private;</div><div class='del'>-        enable = egp-&gt;enable[GF_FOP_FSYNC];</div><div class='del'>-</div><div class='del'>-        if (enable)</div><div class='del'>-                op_errno = error_gen (this, GF_FOP_FSYNC);</div><div class='del'>-</div><div class='del'>-	if (op_errno) {</div><div class='del'>-		GF_ERROR(this, "unwind(-1, %s)", strerror (op_errno));</div><div class='del'>-		STACK_UNWIND_STRICT (fsync, frame, -1, op_errno, NULL, NULL);</div><div class='del'>-		return 0;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	STACK_WIND (frame, error_gen_fsync_cbk,</div><div class='del'>-		    FIRST_CHILD(this),</div><div class='del'>-		    FIRST_CHILD(this)-&gt;fops-&gt;fsync,</div><div class='del'>-		    fd, flags);</div><div class='del'>-	return 0;</div><div class='add'>+    STACK_WIND_TAIL(frame, FIRST_CHILD(this), FIRST_CHILD(this)-&gt;fops-&gt;fsync,</div><div class='add'>+                    fd, flags, xdata);</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-error_gen_fstat_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-                     int32_t op_ret, int32_t op_errno, struct iatt *buf)</div><div class='add'>+error_gen_fstat(call_frame_t *frame, xlator_t *this, fd_t *fd, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-	STACK_UNWIND_STRICT (fstat, frame, op_ret, op_errno, buf);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='add'>+    int op_errno = 0;</div><div class='add'>+    eg_t *egp = NULL;</div><div class='add'>+    int enable = 1;</div><div class='ctx'> </div><div class='add'>+    egp = this-&gt;private;</div><div class='add'>+    enable = egp-&gt;enable[GF_FOP_FSTAT];</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-error_gen_fstat (call_frame_t *frame, xlator_t *this, fd_t *fd)</div><div class='del'>-{</div><div class='del'>-	int              op_errno = 0;</div><div class='del'>-        eg_t            *egp = NULL;</div><div class='del'>-        int              enable = 1;</div><div class='del'>-</div><div class='del'>-        egp = this-&gt;private;</div><div class='del'>-        enable = egp-&gt;enable[GF_FOP_FSTAT];</div><div class='del'>-</div><div class='del'>-        if (enable)</div><div class='del'>-                op_errno = error_gen (this, GF_FOP_FSTAT);</div><div class='del'>-</div><div class='del'>-	if (op_errno) {</div><div class='del'>-		GF_ERROR(this, "unwind(-1, %s)", strerror (op_errno));</div><div class='del'>-		STACK_UNWIND_STRICT (fstat, frame, -1, op_errno, NULL);</div><div class='del'>-		return 0;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	STACK_WIND (frame, error_gen_fstat_cbk,</div><div class='del'>-		    FIRST_CHILD(this),</div><div class='del'>-		    FIRST_CHILD(this)-&gt;fops-&gt;fstat,</div><div class='del'>-		    fd);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='add'>+    if (enable)</div><div class='add'>+        op_errno = error_gen(this, GF_FOP_FSTAT);</div><div class='ctx'> </div><div class='add'>+    if (op_errno) {</div><div class='add'>+        GF_ERROR(this, "unwind(-1, %s)", strerror(op_errno));</div><div class='add'>+        STACK_UNWIND_STRICT(fstat, frame, -1, op_errno, NULL, xdata);</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-error_gen_opendir_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-		       int32_t op_ret, int32_t op_errno, fd_t *fd)</div><div class='del'>-{</div><div class='del'>-	STACK_UNWIND_STRICT (opendir, frame, op_ret, op_errno, fd);</div><div class='del'>-	return 0;</div><div class='add'>+    STACK_WIND_TAIL(frame, FIRST_CHILD(this), FIRST_CHILD(this)-&gt;fops-&gt;fstat,</div><div class='add'>+                    fd, xdata);</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-error_gen_opendir (call_frame_t *frame, xlator_t *this, loc_t *loc, fd_t *fd)</div><div class='add'>+error_gen_opendir(call_frame_t *frame, xlator_t *this, loc_t *loc, fd_t *fd,</div><div class='add'>+                  dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-	int              op_errno = 0;</div><div class='del'>-        eg_t            *egp = NULL;</div><div class='del'>-        int              enable = 1;</div><div class='del'>-</div><div class='del'>-        egp = this-&gt;private;</div><div class='del'>-        enable = egp-&gt;enable[GF_FOP_OPENDIR];</div><div class='del'>-</div><div class='del'>-        if (enable)</div><div class='del'>-                op_errno = error_gen (this, GF_FOP_OPENDIR);</div><div class='del'>-</div><div class='del'>-	if (op_errno) {</div><div class='del'>-		GF_ERROR(this, "unwind(-1, %s)", strerror (op_errno));</div><div class='del'>-		STACK_UNWIND_STRICT (opendir, frame, -1, op_errno, NULL);</div><div class='del'>-		return 0;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	STACK_WIND (frame, error_gen_opendir_cbk,</div><div class='del'>-		    FIRST_CHILD(this),</div><div class='del'>-		    FIRST_CHILD(this)-&gt;fops-&gt;opendir,</div><div class='del'>-		    loc, fd);</div><div class='del'>-	return 0;</div><div class='add'>+    int op_errno = 0;</div><div class='add'>+    eg_t *egp = NULL;</div><div class='add'>+    int enable = 1;</div><div class='add'>+</div><div class='add'>+    egp = this-&gt;private;</div><div class='add'>+    enable = egp-&gt;enable[GF_FOP_OPENDIR];</div><div class='add'>+</div><div class='add'>+    if (enable)</div><div class='add'>+        op_errno = error_gen(this, GF_FOP_OPENDIR);</div><div class='add'>+</div><div class='add'>+    if (op_errno) {</div><div class='add'>+        GF_ERROR(this, "unwind(-1, %s)", strerror(op_errno));</div><div class='add'>+        STACK_UNWIND_STRICT(opendir, frame, -1, op_errno, NULL, xdata);</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    STACK_WIND_TAIL(frame, FIRST_CHILD(this), FIRST_CHILD(this)-&gt;fops-&gt;opendir,</div><div class='add'>+                    loc, fd, xdata);</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-error_gen_fsyncdir_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-			int32_t op_ret, int32_t op_errno)</div><div class='add'>+error_gen_fsyncdir(call_frame_t *frame, xlator_t *this, fd_t *fd, int32_t flags,</div><div class='add'>+                   dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-	STACK_UNWIND_STRICT (fsyncdir, frame, op_ret, op_errno);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='add'>+    int op_errno = 0;</div><div class='add'>+    eg_t *egp = NULL;</div><div class='add'>+    int enable = 1;</div><div class='ctx'> </div><div class='add'>+    egp = this-&gt;private;</div><div class='add'>+    enable = egp-&gt;enable[GF_FOP_FSYNCDIR];</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-error_gen_fsyncdir (call_frame_t *frame, xlator_t *this, fd_t *fd,</div><div class='del'>-                    int32_t flags)</div><div class='del'>-{</div><div class='del'>-	int              op_errno = 0;</div><div class='del'>-        eg_t            *egp = NULL;</div><div class='del'>-        int              enable = 1;</div><div class='del'>-</div><div class='del'>-        egp = this-&gt;private;</div><div class='del'>-        enable = egp-&gt;enable[GF_FOP_FSYNCDIR];</div><div class='del'>-</div><div class='del'>-        if (enable)</div><div class='del'>-                op_errno = error_gen (this, GF_FOP_FSYNCDIR);</div><div class='del'>-</div><div class='del'>-	if (op_errno) {</div><div class='del'>-		GF_ERROR(this, "unwind(-1, %s)", strerror (op_errno));</div><div class='del'>-		STACK_UNWIND_STRICT (fsyncdir, frame, -1, op_errno);</div><div class='del'>-		return 0;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	STACK_WIND (frame, error_gen_fsyncdir_cbk,</div><div class='del'>-		    FIRST_CHILD(this),</div><div class='del'>-		    FIRST_CHILD(this)-&gt;fops-&gt;fsyncdir,</div><div class='del'>-		    fd, flags);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='add'>+    if (enable)</div><div class='add'>+        op_errno = error_gen(this, GF_FOP_FSYNCDIR);</div><div class='ctx'> </div><div class='add'>+    if (op_errno) {</div><div class='add'>+        GF_ERROR(this, "unwind(-1, %s)", strerror(op_errno));</div><div class='add'>+        STACK_UNWIND_STRICT(fsyncdir, frame, -1, op_errno, xdata);</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    STACK_WIND_TAIL(frame, FIRST_CHILD(this), FIRST_CHILD(this)-&gt;fops-&gt;fsyncdir,</div><div class='add'>+                    fd, flags, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-error_gen_statfs_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-		      int32_t op_ret, int32_t op_errno, struct statvfs *buf)</div><div class='add'>+error_gen_statfs(call_frame_t *frame, xlator_t *this, loc_t *loc, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-	STACK_UNWIND_STRICT (statfs, frame, op_ret, op_errno, buf);</div><div class='add'>+    int op_errno = 0;</div><div class='add'>+    eg_t *egp = NULL;</div><div class='add'>+    int enable = 1;</div><div class='ctx'> </div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='add'>+    egp = this-&gt;private;</div><div class='add'>+    enable = egp-&gt;enable[GF_FOP_STATFS];</div><div class='ctx'> </div><div class='add'>+    if (enable)</div><div class='add'>+        op_errno = error_gen(this, GF_FOP_STATFS);</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-error_gen_statfs (call_frame_t *frame, xlator_t *this, loc_t *loc)</div><div class='del'>-{</div><div class='del'>-	int              op_errno = 0;</div><div class='del'>-        eg_t            *egp = NULL;</div><div class='del'>-        int              enable = 1;</div><div class='del'>-</div><div class='del'>-        egp = this-&gt;private;</div><div class='del'>-        enable = egp-&gt;enable[GF_FOP_STATFS];</div><div class='del'>-</div><div class='del'>-        if (enable)</div><div class='del'>-                op_errno = error_gen (this, GF_FOP_STATFS);</div><div class='del'>-</div><div class='del'>-	if (op_errno) {</div><div class='del'>-		GF_ERROR(this, "unwind(-1, %s)", strerror (op_errno));</div><div class='del'>-		STACK_UNWIND_STRICT (statfs, frame, -1, op_errno, NULL);</div><div class='del'>-		return 0;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	STACK_WIND (frame, error_gen_statfs_cbk,</div><div class='del'>-		    FIRST_CHILD(this),</div><div class='del'>-		    FIRST_CHILD(this)-&gt;fops-&gt;statfs,</div><div class='del'>-		    loc);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='add'>+    if (op_errno) {</div><div class='add'>+        GF_ERROR(this, "unwind(-1, %s)", strerror(op_errno));</div><div class='add'>+        STACK_UNWIND_STRICT(statfs, frame, -1, op_errno, NULL, xdata);</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='add'>+    STACK_WIND_TAIL(frame, FIRST_CHILD(this), FIRST_CHILD(this)-&gt;fops-&gt;statfs,</div><div class='add'>+                    loc, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-error_gen_setxattr_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-			int32_t op_ret, int32_t op_errno)</div><div class='add'>+error_gen_setxattr(call_frame_t *frame, xlator_t *this, loc_t *loc,</div><div class='add'>+                   dict_t *dict, int32_t flags, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-	STACK_UNWIND_STRICT (setxattr, frame, op_ret, op_errno);</div><div class='add'>+    int op_errno = 0;</div><div class='add'>+    eg_t *egp = NULL;</div><div class='add'>+    int enable = 1;</div><div class='ctx'> </div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='add'>+    egp = this-&gt;private;</div><div class='add'>+    enable = egp-&gt;enable[GF_FOP_SETXATTR];</div><div class='ctx'> </div><div class='add'>+    if (enable)</div><div class='add'>+        op_errno = error_gen(this, GF_FOP_SETXATTR);</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-error_gen_setxattr (call_frame_t *frame, xlator_t *this, loc_t *loc,</div><div class='del'>-		    dict_t *dict, int32_t flags)</div><div class='del'>-{</div><div class='del'>-	int              op_errno = 0;</div><div class='del'>-        eg_t            *egp = NULL;</div><div class='del'>-        int              enable = 1;</div><div class='del'>-</div><div class='del'>-        egp = this-&gt;private;</div><div class='del'>-        enable = egp-&gt;enable[GF_FOP_SETXATTR];</div><div class='del'>-</div><div class='del'>-        if (enable)</div><div class='del'>-                op_errno = error_gen (this, GF_FOP_SETXATTR);</div><div class='del'>-</div><div class='del'>-	if (op_errno) {</div><div class='del'>-		GF_ERROR(this, "unwind(-1, %s)", strerror (op_errno));</div><div class='del'>-		STACK_UNWIND_STRICT (setxattr, frame, -1, op_errno);</div><div class='del'>-		return 0;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	STACK_WIND (frame, error_gen_setxattr_cbk,</div><div class='del'>-		    FIRST_CHILD(this),</div><div class='del'>-		    FIRST_CHILD(this)-&gt;fops-&gt;setxattr,</div><div class='del'>-		    loc, dict, flags);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='add'>+    if (op_errno) {</div><div class='add'>+        GF_ERROR(this, "unwind(-1, %s)", strerror(op_errno));</div><div class='add'>+        STACK_UNWIND_STRICT(setxattr, frame, -1, op_errno, xdata);</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='add'>+    STACK_WIND_TAIL(frame, FIRST_CHILD(this), FIRST_CHILD(this)-&gt;fops-&gt;setxattr,</div><div class='add'>+                    loc, dict, flags, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-error_gen_getxattr_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-			int32_t op_ret, int32_t op_errno, dict_t *dict)</div><div class='add'>+error_gen_getxattr(call_frame_t *frame, xlator_t *this, loc_t *loc,</div><div class='add'>+                   const char *name, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-	STACK_UNWIND_STRICT (getxattr, frame, op_ret, op_errno, dict);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='add'>+    int op_errno = 0;</div><div class='add'>+    eg_t *egp = NULL;</div><div class='add'>+    int enable = 1;</div><div class='ctx'> </div><div class='add'>+    egp = this-&gt;private;</div><div class='add'>+    enable = egp-&gt;enable[GF_FOP_GETXATTR];</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-error_gen_getxattr (call_frame_t *frame, xlator_t *this, loc_t *loc,</div><div class='del'>-		    const char *name)</div><div class='del'>-{</div><div class='del'>-	int              op_errno = 0;</div><div class='del'>-        eg_t            *egp = NULL;</div><div class='del'>-        int              enable = 1;</div><div class='del'>-</div><div class='del'>-        egp = this-&gt;private;</div><div class='del'>-        enable = egp-&gt;enable[GF_FOP_GETXATTR];</div><div class='del'>-</div><div class='del'>-        if (enable)</div><div class='del'>-                op_errno = error_gen (this, GF_FOP_GETXATTR);</div><div class='del'>-</div><div class='del'>-	if (op_errno) {</div><div class='del'>-		GF_ERROR(this, "unwind(-1, %s)", strerror (op_errno));</div><div class='del'>-		STACK_UNWIND_STRICT (getxattr, frame, -1, op_errno, NULL);</div><div class='del'>-		return 0;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	STACK_WIND (frame, error_gen_getxattr_cbk,</div><div class='del'>-		    FIRST_CHILD(this),</div><div class='del'>-		    FIRST_CHILD(this)-&gt;fops-&gt;getxattr,</div><div class='del'>-		    loc, name);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='add'>+    if (enable)</div><div class='add'>+        op_errno = error_gen(this, GF_FOP_GETXATTR);</div><div class='add'>+</div><div class='add'>+    if (op_errno) {</div><div class='add'>+        GF_ERROR(this, "unwind(-1, %s)", strerror(op_errno));</div><div class='add'>+        STACK_UNWIND_STRICT(getxattr, frame, -1, op_errno, NULL, xdata);</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='add'>+    STACK_WIND_TAIL(frame, FIRST_CHILD(this), FIRST_CHILD(this)-&gt;fops-&gt;getxattr,</div><div class='add'>+                    loc, name, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-error_gen_xattrop_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-                       int32_t op_ret, int32_t op_errno, dict_t *dict)</div><div class='add'>+error_gen_fsetxattr(call_frame_t *frame, xlator_t *this, fd_t *fd, dict_t *dict,</div><div class='add'>+                    int32_t flags, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-	STACK_UNWIND_STRICT (xattrop, frame, op_ret, op_errno, dict);</div><div class='add'>+    int op_errno = 0;</div><div class='add'>+    eg_t *egp = NULL;</div><div class='add'>+    int enable = 1;</div><div class='ctx'> </div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='add'>+    egp = this-&gt;private;</div><div class='add'>+    enable = egp-&gt;enable[GF_FOP_FSETXATTR];</div><div class='ctx'> </div><div class='add'>+    if (enable)</div><div class='add'>+        op_errno = error_gen(this, GF_FOP_FSETXATTR);</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-error_gen_xattrop (call_frame_t *frame, xlator_t *this, loc_t *loc,</div><div class='del'>-		   gf_xattrop_flags_t flags, dict_t *dict)</div><div class='del'>-{</div><div class='del'>-	int              op_errno = 0;</div><div class='del'>-        eg_t            *egp = NULL;</div><div class='del'>-        int              enable = 1;</div><div class='del'>-</div><div class='del'>-        egp = this-&gt;private;</div><div class='del'>-        enable = egp-&gt;enable[GF_FOP_XATTROP];</div><div class='del'>-</div><div class='del'>-        if (enable)</div><div class='del'>-                op_errno = error_gen (this, GF_FOP_XATTROP);</div><div class='del'>-</div><div class='del'>-	if (op_errno) {</div><div class='del'>-		GF_ERROR(this, "unwind(-1, %s)", strerror (op_errno));</div><div class='del'>-		STACK_UNWIND_STRICT (xattrop, frame, -1, op_errno, NULL);</div><div class='del'>-		return 0;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	STACK_WIND (frame, error_gen_xattrop_cbk,</div><div class='del'>-		    FIRST_CHILD(this),</div><div class='del'>-		    FIRST_CHILD(this)-&gt;fops-&gt;xattrop,</div><div class='del'>-		    loc, flags, dict);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='add'>+    if (op_errno) {</div><div class='add'>+        GF_ERROR(this, "unwind(-1, %s)", strerror(op_errno));</div><div class='add'>+        STACK_UNWIND_STRICT(fsetxattr, frame, -1, op_errno, xdata);</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='add'>+    STACK_WIND_TAIL(frame, FIRST_CHILD(this),</div><div class='add'>+                    FIRST_CHILD(this)-&gt;fops-&gt;fsetxattr, fd, dict, flags, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-error_gen_fxattrop_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-			int32_t op_ret, int32_t op_errno, dict_t *dict)</div><div class='add'>+error_gen_fgetxattr(call_frame_t *frame, xlator_t *this, fd_t *fd,</div><div class='add'>+                    const char *name, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-	STACK_UNWIND_STRICT (fxattrop, frame, op_ret, op_errno, dict);</div><div class='add'>+    int op_errno = 0;</div><div class='add'>+    eg_t *egp = NULL;</div><div class='add'>+    int enable = 1;</div><div class='ctx'> </div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='add'>+    egp = this-&gt;private;</div><div class='add'>+    enable = egp-&gt;enable[GF_FOP_FGETXATTR];</div><div class='ctx'> </div><div class='add'>+    if (enable)</div><div class='add'>+        op_errno = error_gen(this, GF_FOP_FGETXATTR);</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-error_gen_fxattrop (call_frame_t *frame, xlator_t *this, fd_t *fd,</div><div class='del'>-		    gf_xattrop_flags_t flags, dict_t *dict)</div><div class='del'>-{</div><div class='del'>-	int              op_errno = 0;</div><div class='del'>-        eg_t            *egp = NULL;</div><div class='del'>-        int              enable = 1;</div><div class='del'>-</div><div class='del'>-        egp = this-&gt;private;</div><div class='del'>-        enable = egp-&gt;enable[GF_FOP_FXATTROP];</div><div class='del'>-</div><div class='del'>-        if (enable)</div><div class='del'>-                op_errno = error_gen (this, GF_FOP_FXATTROP);</div><div class='del'>-</div><div class='del'>-	if (op_errno) {</div><div class='del'>-		GF_ERROR(this, "unwind(-1, %s)", strerror (op_errno));</div><div class='del'>-		STACK_UNWIND_STRICT (fxattrop, frame, -1, op_errno, NULL);</div><div class='del'>-		return 0;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	STACK_WIND (frame, error_gen_fxattrop_cbk,</div><div class='del'>-		    FIRST_CHILD(this),</div><div class='del'>-		    FIRST_CHILD(this)-&gt;fops-&gt;fxattrop,</div><div class='del'>-		    fd, flags, dict);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='add'>+    if (op_errno) {</div><div class='add'>+        GF_ERROR(this, "unwind(-1, %s)", strerror(op_errno));</div><div class='add'>+        STACK_UNWIND_STRICT(fgetxattr, frame, -1, op_errno, NULL, xdata);</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='add'>+    STACK_WIND_TAIL(frame, FIRST_CHILD(this),</div><div class='add'>+                    FIRST_CHILD(this)-&gt;fops-&gt;fgetxattr, fd, name, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-error_gen_removexattr_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-			   int32_t op_ret, int32_t op_errno)</div><div class='add'>+error_gen_xattrop(call_frame_t *frame, xlator_t *this, loc_t *loc,</div><div class='add'>+                  gf_xattrop_flags_t flags, dict_t *dict, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-	STACK_UNWIND_STRICT (removexattr, frame, op_ret, op_errno);</div><div class='add'>+    int op_errno = 0;</div><div class='add'>+    eg_t *egp = NULL;</div><div class='add'>+    int enable = 1;</div><div class='ctx'> </div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='add'>+    egp = this-&gt;private;</div><div class='add'>+    enable = egp-&gt;enable[GF_FOP_XATTROP];</div><div class='ctx'> </div><div class='add'>+    if (enable)</div><div class='add'>+        op_errno = error_gen(this, GF_FOP_XATTROP);</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-error_gen_removexattr (call_frame_t *frame, xlator_t *this, loc_t *loc,</div><div class='del'>-		       const char *name)</div><div class='del'>-{</div><div class='del'>-	int              op_errno = 0;</div><div class='del'>-        eg_t            *egp = NULL;</div><div class='del'>-        int              enable = 1;</div><div class='del'>-</div><div class='del'>-        egp = this-&gt;private;</div><div class='del'>-        enable = egp-&gt;enable[GF_FOP_REMOVEXATTR];</div><div class='del'>-</div><div class='del'>-        if (enable)</div><div class='del'>-                op_errno = error_gen (this, GF_FOP_REMOVEXATTR);</div><div class='del'>-</div><div class='del'>-	if (op_errno) {</div><div class='del'>-		GF_ERROR(this, "unwind(-1, %s)", strerror (op_errno));</div><div class='del'>-		STACK_UNWIND_STRICT (removexattr, frame, -1, op_errno);</div><div class='del'>-		return 0;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	STACK_WIND (frame, error_gen_removexattr_cbk,</div><div class='del'>-		    FIRST_CHILD(this),</div><div class='del'>-		    FIRST_CHILD(this)-&gt;fops-&gt;removexattr,</div><div class='del'>-		    loc, name);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='add'>+    if (op_errno) {</div><div class='add'>+        GF_ERROR(this, "unwind(-1, %s)", strerror(op_errno));</div><div class='add'>+        STACK_UNWIND_STRICT(xattrop, frame, -1, op_errno, NULL, xdata);</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='add'>+    STACK_WIND_TAIL(frame, FIRST_CHILD(this), FIRST_CHILD(this)-&gt;fops-&gt;xattrop,</div><div class='add'>+                    loc, flags, dict, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-error_gen_lk_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-		  int32_t op_ret, int32_t op_errno, struct flock *lock)</div><div class='add'>+error_gen_fxattrop(call_frame_t *frame, xlator_t *this, fd_t *fd,</div><div class='add'>+                   gf_xattrop_flags_t flags, dict_t *dict, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-	STACK_UNWIND_STRICT (lk, frame, op_ret, op_errno, lock);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='add'>+    int op_errno = 0;</div><div class='add'>+    eg_t *egp = NULL;</div><div class='add'>+    int enable = 1;</div><div class='add'>+</div><div class='add'>+    egp = this-&gt;private;</div><div class='add'>+    enable = egp-&gt;enable[GF_FOP_FXATTROP];</div><div class='add'>+</div><div class='add'>+    if (enable)</div><div class='add'>+        op_errno = error_gen(this, GF_FOP_FXATTROP);</div><div class='add'>+</div><div class='add'>+    if (op_errno) {</div><div class='add'>+        GF_ERROR(this, "unwind(-1, %s)", strerror(op_errno));</div><div class='add'>+        STACK_UNWIND_STRICT(fxattrop, frame, -1, op_errno, NULL, xdata);</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='add'>+    STACK_WIND_TAIL(frame, FIRST_CHILD(this), FIRST_CHILD(this)-&gt;fops-&gt;fxattrop,</div><div class='add'>+                    fd, flags, dict, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-error_gen_lk (call_frame_t *frame, xlator_t *this, fd_t *fd, int32_t cmd,</div><div class='del'>-	      struct flock *lock)</div><div class='add'>+error_gen_removexattr(call_frame_t *frame, xlator_t *this, loc_t *loc,</div><div class='add'>+                      const char *name, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-	int              op_errno = 0;</div><div class='del'>-        eg_t            *egp = NULL;</div><div class='del'>-        int              enable = 1;</div><div class='del'>-</div><div class='del'>-        egp = this-&gt;private;</div><div class='del'>-        enable = egp-&gt;enable[GF_FOP_LK];</div><div class='del'>-</div><div class='del'>-        if (enable)</div><div class='del'>-                op_errno = error_gen (this, GF_FOP_LK);</div><div class='del'>-</div><div class='del'>-	if (op_errno) {</div><div class='del'>-		GF_ERROR(this, "unwind(-1, %s)", strerror (op_errno));</div><div class='del'>-		STACK_UNWIND_STRICT (lk, frame, -1, op_errno, NULL);</div><div class='del'>-		return 0;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	STACK_WIND (frame, error_gen_lk_cbk,</div><div class='del'>-		    FIRST_CHILD(this),</div><div class='del'>-		    FIRST_CHILD(this)-&gt;fops-&gt;lk,</div><div class='del'>-		    fd, cmd, lock);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='add'>+    int op_errno = 0;</div><div class='add'>+    eg_t *egp = NULL;</div><div class='add'>+    int enable = 1;</div><div class='ctx'> </div><div class='add'>+    egp = this-&gt;private;</div><div class='add'>+    enable = egp-&gt;enable[GF_FOP_REMOVEXATTR];</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-error_gen_inodelk_cbk (call_frame_t *frame, void *cookie,</div><div class='del'>-		       xlator_t *this, int32_t op_ret, int32_t op_errno)</div><div class='add'>+    if (enable)</div><div class='add'>+        op_errno = error_gen(this, GF_FOP_REMOVEXATTR);</div><div class='ctx'> </div><div class='del'>-{</div><div class='del'>-	STACK_UNWIND_STRICT (inodelk, frame, op_ret, op_errno);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='add'>+    if (op_errno) {</div><div class='add'>+        GF_ERROR(this, "unwind(-1, %s)", strerror(op_errno));</div><div class='add'>+        STACK_UNWIND_STRICT(removexattr, frame, -1, op_errno, xdata);</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='add'>+    STACK_WIND_TAIL(frame, FIRST_CHILD(this),</div><div class='add'>+                    FIRST_CHILD(this)-&gt;fops-&gt;removexattr, loc, name, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-error_gen_inodelk (call_frame_t *frame, xlator_t *this,</div><div class='del'>-		   const char *volume, loc_t *loc, int32_t cmd,</div><div class='del'>-                   struct flock *lock)</div><div class='add'>+error_gen_fremovexattr(call_frame_t *frame, xlator_t *this, fd_t *fd,</div><div class='add'>+                       const char *name, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-	int              op_errno = 0;</div><div class='del'>-        eg_t            *egp = NULL;</div><div class='del'>-        int              enable = 1;</div><div class='del'>-</div><div class='del'>-        egp = this-&gt;private;</div><div class='del'>-        enable = egp-&gt;enable[GF_FOP_INODELK];</div><div class='del'>-</div><div class='del'>-        if (enable)</div><div class='del'>-                op_errno = error_gen (this, GF_FOP_INODELK);</div><div class='del'>-</div><div class='del'>-	if (op_errno) {</div><div class='del'>-		GF_ERROR(this, "unwind(-1, %s)", strerror (op_errno));</div><div class='del'>-		STACK_UNWIND_STRICT (inodelk, frame, -1, op_errno);</div><div class='del'>-		return 0;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	STACK_WIND (frame, error_gen_inodelk_cbk,</div><div class='del'>-		    FIRST_CHILD(this),</div><div class='del'>-		    FIRST_CHILD(this)-&gt;fops-&gt;inodelk,</div><div class='del'>-		    volume, loc, cmd, lock);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='add'>+    int op_errno = 0;</div><div class='add'>+    eg_t *egp = NULL;</div><div class='add'>+    int enable = 1;</div><div class='ctx'> </div><div class='add'>+    egp = this-&gt;private;</div><div class='add'>+    enable = egp-&gt;enable[GF_FOP_FREMOVEXATTR];</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-error_gen_finodelk_cbk (call_frame_t *frame, void *cookie,</div><div class='del'>-			xlator_t *this, int32_t op_ret, int32_t op_errno)</div><div class='add'>+    if (enable)</div><div class='add'>+        op_errno = error_gen(this, GF_FOP_FREMOVEXATTR);</div><div class='ctx'> </div><div class='del'>-{</div><div class='del'>-	STACK_UNWIND_STRICT (finodelk, frame, op_ret, op_errno);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='add'>+    if (op_errno) {</div><div class='add'>+        GF_ERROR(this, "unwind(-1, %s)", strerror(op_errno));</div><div class='add'>+        STACK_UNWIND_STRICT(fremovexattr, frame, -1, op_errno, xdata);</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='add'>+    STACK_WIND_TAIL(frame, FIRST_CHILD(this),</div><div class='add'>+                    FIRST_CHILD(this)-&gt;fops-&gt;fremovexattr, fd, name, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-error_gen_finodelk (call_frame_t *frame, xlator_t *this,</div><div class='del'>-		    const char *volume, fd_t *fd, int32_t cmd,</div><div class='del'>-                    struct flock *lock)</div><div class='add'>+error_gen_lk(call_frame_t *frame, xlator_t *this, fd_t *fd, int32_t cmd,</div><div class='add'>+             struct gf_flock *lock, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-	int              op_errno = 0;</div><div class='del'>-        eg_t            *egp = NULL;</div><div class='del'>-        int              enable = 1;</div><div class='del'>-</div><div class='del'>-        egp = this-&gt;private;</div><div class='del'>-        enable = egp-&gt;enable[GF_FOP_FINODELK];</div><div class='del'>-</div><div class='del'>-        if (enable)</div><div class='del'>-                op_errno = error_gen (this, GF_FOP_FINODELK);</div><div class='del'>-</div><div class='del'>-	if (op_errno) {</div><div class='del'>-		GF_ERROR(this, "unwind(-1, %s)", strerror (op_errno));</div><div class='del'>-		STACK_UNWIND_STRICT (finodelk, frame, -1, op_errno);</div><div class='del'>-		return 0;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	STACK_WIND (frame, error_gen_finodelk_cbk,</div><div class='del'>-		    FIRST_CHILD(this),</div><div class='del'>-		    FIRST_CHILD(this)-&gt;fops-&gt;finodelk,</div><div class='del'>-		    volume, fd, cmd, lock);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='add'>+    int op_errno = 0;</div><div class='add'>+    eg_t *egp = NULL;</div><div class='add'>+    int enable = 1;</div><div class='ctx'> </div><div class='add'>+    egp = this-&gt;private;</div><div class='add'>+    enable = egp-&gt;enable[GF_FOP_LK];</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-error_gen_entrylk_cbk (call_frame_t *frame, void *cookie,</div><div class='del'>-		       xlator_t *this, int32_t op_ret, int32_t op_errno)</div><div class='add'>+    if (enable)</div><div class='add'>+        op_errno = error_gen(this, GF_FOP_LK);</div><div class='ctx'> </div><div class='del'>-{</div><div class='del'>-	STACK_UNWIND_STRICT (entrylk, frame, op_ret, op_errno);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='add'>+    if (op_errno) {</div><div class='add'>+        GF_ERROR(this, "unwind(-1, %s)", strerror(op_errno));</div><div class='add'>+        STACK_UNWIND_STRICT(lk, frame, -1, op_errno, NULL, xdata);</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='add'>+    STACK_WIND_TAIL(frame, FIRST_CHILD(this), FIRST_CHILD(this)-&gt;fops-&gt;lk, fd,</div><div class='add'>+                    cmd, lock, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-error_gen_entrylk (call_frame_t *frame, xlator_t *this,</div><div class='del'>-		   const char *volume, loc_t *loc, const char *basename,</div><div class='del'>-		   entrylk_cmd cmd, entrylk_type type)</div><div class='add'>+error_gen_inodelk(call_frame_t *frame, xlator_t *this, const char *volume,</div><div class='add'>+                  loc_t *loc, int32_t cmd, struct gf_flock *lock, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-	int              op_errno = 0;</div><div class='del'>-        eg_t            *egp = NULL;</div><div class='del'>-        int              enable = 1;</div><div class='del'>-</div><div class='del'>-        egp = this-&gt;private;</div><div class='del'>-        enable = egp-&gt;enable[GF_FOP_ENTRYLK];</div><div class='del'>-</div><div class='del'>-        if (enable)</div><div class='del'>-                op_errno = error_gen (this, GF_FOP_ENTRYLK);</div><div class='del'>-</div><div class='del'>-	if (op_errno) {</div><div class='del'>-		GF_ERROR(this, "unwind(-1, %s)", strerror (op_errno));</div><div class='del'>-		STACK_UNWIND_STRICT (entrylk, frame, -1, op_errno);</div><div class='del'>-		return 0;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	STACK_WIND (frame, error_gen_entrylk_cbk,</div><div class='del'>-		    FIRST_CHILD(this),</div><div class='del'>-		    FIRST_CHILD(this)-&gt;fops-&gt;entrylk,</div><div class='del'>-		    volume, loc, basename, cmd, type);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='add'>+    int op_errno = 0;</div><div class='add'>+    eg_t *egp = NULL;</div><div class='add'>+    int enable = 1;</div><div class='ctx'> </div><div class='add'>+    egp = this-&gt;private;</div><div class='add'>+    enable = egp-&gt;enable[GF_FOP_INODELK];</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-error_gen_fentrylk_cbk (call_frame_t *frame, void *cookie,</div><div class='del'>-			xlator_t *this, int32_t op_ret, int32_t op_errno)</div><div class='add'>+    if (enable)</div><div class='add'>+        op_errno = error_gen(this, GF_FOP_INODELK);</div><div class='ctx'> </div><div class='del'>-{</div><div class='del'>-	STACK_UNWIND_STRICT (fentrylk, frame, op_ret, op_errno);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='add'>+    if (op_errno) {</div><div class='add'>+        GF_ERROR(this, "unwind(-1, %s)", strerror(op_errno));</div><div class='add'>+        STACK_UNWIND_STRICT(inodelk, frame, -1, op_errno, xdata);</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='add'>+    STACK_WIND_TAIL(frame, FIRST_CHILD(this), FIRST_CHILD(this)-&gt;fops-&gt;inodelk,</div><div class='add'>+                    volume, loc, cmd, lock, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-error_gen_fentrylk (call_frame_t *frame, xlator_t *this,</div><div class='del'>-		    const char *volume, fd_t *fd, const char *basename,</div><div class='del'>-		    entrylk_cmd cmd, entrylk_type type)</div><div class='add'>+error_gen_finodelk(call_frame_t *frame, xlator_t *this, const char *volume,</div><div class='add'>+                   fd_t *fd, int32_t cmd, struct gf_flock *lock, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-	int             op_errno = 0;</div><div class='del'>-        eg_t            *egp = NULL;</div><div class='del'>-        int             enable = 1;</div><div class='del'>-</div><div class='del'>-        egp = this-&gt;private;</div><div class='del'>-        enable = egp-&gt;enable[GF_FOP_FENTRYLK];</div><div class='del'>-</div><div class='del'>-        if (enable)</div><div class='del'>-                op_errno = error_gen (this, GF_FOP_FENTRYLK);</div><div class='del'>-</div><div class='del'>-	if (op_errno) {</div><div class='del'>-		GF_ERROR(this, "unwind(-1, %s)", strerror (op_errno));</div><div class='del'>-		STACK_UNWIND_STRICT (fentrylk, frame, -1, op_errno);</div><div class='del'>-		return 0;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	STACK_WIND (frame, error_gen_fentrylk_cbk,</div><div class='del'>-		    FIRST_CHILD(this),</div><div class='del'>-		    FIRST_CHILD(this)-&gt;fops-&gt;fentrylk,</div><div class='del'>-		    volume, fd, basename, cmd, type);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='add'>+    int op_errno = 0;</div><div class='add'>+    eg_t *egp = NULL;</div><div class='add'>+    int enable = 1;</div><div class='ctx'> </div><div class='add'>+    egp = this-&gt;private;</div><div class='add'>+    enable = egp-&gt;enable[GF_FOP_FINODELK];</div><div class='ctx'> </div><div class='del'>-/* Management operations */</div><div class='add'>+    if (enable)</div><div class='add'>+        op_errno = error_gen(this, GF_FOP_FINODELK);</div><div class='ctx'> </div><div class='add'>+    if (op_errno) {</div><div class='add'>+        GF_ERROR(this, "unwind(-1, %s)", strerror(op_errno));</div><div class='add'>+        STACK_UNWIND_STRICT(finodelk, frame, -1, op_errno, xdata);</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    STACK_WIND_TAIL(frame, FIRST_CHILD(this), FIRST_CHILD(this)-&gt;fops-&gt;finodelk,</div><div class='add'>+                    volume, fd, cmd, lock, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-error_gen_getspec_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-		       int32_t op_ret, int32_t op_errno, char *spec_data)</div><div class='add'>+error_gen_entrylk(call_frame_t *frame, xlator_t *this, const char *volume,</div><div class='add'>+                  loc_t *loc, const char *basename, entrylk_cmd cmd,</div><div class='add'>+                  entrylk_type type, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-	STACK_UNWIND_STRICT (getspec, frame, op_ret, op_errno, spec_data);</div><div class='add'>+    int op_errno = 0;</div><div class='add'>+    eg_t *egp = NULL;</div><div class='add'>+    int enable = 1;</div><div class='ctx'> </div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='add'>+    egp = this-&gt;private;</div><div class='add'>+    enable = egp-&gt;enable[GF_FOP_ENTRYLK];</div><div class='add'>+</div><div class='add'>+    if (enable)</div><div class='add'>+        op_errno = error_gen(this, GF_FOP_ENTRYLK);</div><div class='ctx'> </div><div class='add'>+    if (op_errno) {</div><div class='add'>+        GF_ERROR(this, "unwind(-1, %s)", strerror(op_errno));</div><div class='add'>+        STACK_UNWIND_STRICT(entrylk, frame, -1, op_errno, xdata);</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    STACK_WIND_TAIL(frame, FIRST_CHILD(this), FIRST_CHILD(this)-&gt;fops-&gt;entrylk,</div><div class='add'>+                    volume, loc, basename, cmd, type, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-error_gen_getspec (call_frame_t *frame, xlator_t *this, const char *key,</div><div class='del'>-		   int32_t flags)</div><div class='add'>+error_gen_fentrylk(call_frame_t *frame, xlator_t *this, const char *volume,</div><div class='add'>+                   fd_t *fd, const char *basename, entrylk_cmd cmd,</div><div class='add'>+                   entrylk_type type, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-	int              op_errno = 0;</div><div class='del'>-        eg_t            *egp = NULL;</div><div class='del'>-        int              enable = 1;</div><div class='del'>-</div><div class='del'>-        egp = this-&gt;private;</div><div class='del'>-        enable = egp-&gt;enable[GF_FOP_GETSPEC];</div><div class='del'>-</div><div class='del'>-        if (enable)</div><div class='del'>-                op_errno = error_gen (this, GF_FOP_GETSPEC);</div><div class='del'>-</div><div class='del'>-	if (op_errno) {</div><div class='del'>-		GF_ERROR(this, "unwind(-1, %s)", strerror (op_errno));</div><div class='del'>-		STACK_UNWIND_STRICT (getspec, frame, -1, op_errno, NULL);</div><div class='del'>-		return 0;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	STACK_WIND (frame, error_gen_getspec_cbk,</div><div class='del'>-		    FIRST_CHILD(this),</div><div class='del'>-		    FIRST_CHILD(this)-&gt;fops-&gt;getspec,</div><div class='del'>-		    key, flags);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='add'>+    int op_errno = 0;</div><div class='add'>+    eg_t *egp = NULL;</div><div class='add'>+    int enable = 1;</div><div class='add'>+</div><div class='add'>+    egp = this-&gt;private;</div><div class='add'>+    enable = egp-&gt;enable[GF_FOP_FENTRYLK];</div><div class='add'>+</div><div class='add'>+    if (enable)</div><div class='add'>+        op_errno = error_gen(this, GF_FOP_FENTRYLK);</div><div class='ctx'> </div><div class='add'>+    if (op_errno) {</div><div class='add'>+        GF_ERROR(this, "unwind(-1, %s)", strerror(op_errno));</div><div class='add'>+        STACK_UNWIND_STRICT(fentrylk, frame, -1, op_errno, xdata);</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    STACK_WIND_TAIL(frame, FIRST_CHILD(this), FIRST_CHILD(this)-&gt;fops-&gt;fentrylk,</div><div class='add'>+                    volume, fd, basename, cmd, type, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-error_gen_readdir_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-		       int32_t op_ret, int32_t op_errno, gf_dirent_t *entries)</div><div class='add'>+error_gen_getspec(call_frame_t *frame, xlator_t *this, const char *key,</div><div class='add'>+                  int32_t flags)</div><div class='ctx'> {</div><div class='del'>-	STACK_UNWIND_STRICT (readdir, frame, op_ret, op_errno, entries);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='add'>+    int op_errno = 0;</div><div class='add'>+    eg_t *egp = NULL;</div><div class='add'>+    int enable = 1;</div><div class='add'>+</div><div class='add'>+    egp = this-&gt;private;</div><div class='add'>+    enable = egp-&gt;enable[GF_FOP_GETSPEC];</div><div class='ctx'> </div><div class='add'>+    if (enable)</div><div class='add'>+        op_errno = error_gen(this, GF_FOP_GETSPEC);</div><div class='add'>+</div><div class='add'>+    if (op_errno) {</div><div class='add'>+        GF_ERROR(this, "unwind(-1, %s)", strerror(op_errno));</div><div class='add'>+        STACK_UNWIND_STRICT(getspec, frame, -1, op_errno, NULL);</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    STACK_WIND_TAIL(frame, FIRST_CHILD(this), FIRST_CHILD(this)-&gt;fops-&gt;getspec,</div><div class='add'>+                    key, flags);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-error_gen_readdir (call_frame_t *frame, xlator_t *this, fd_t *fd,</div><div class='del'>-		   size_t size, off_t off)</div><div class='add'>+error_gen_readdir(call_frame_t *frame, xlator_t *this, fd_t *fd, size_t size,</div><div class='add'>+                  off_t off, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-	int              op_errno = 0;</div><div class='del'>-        eg_t            *egp = NULL;</div><div class='del'>-        int              enable = 1;</div><div class='del'>-</div><div class='del'>-        egp = this-&gt;private;</div><div class='del'>-        enable = egp-&gt;enable[GF_FOP_READDIR];</div><div class='del'>-</div><div class='del'>-        if (enable)</div><div class='del'>-                op_errno = error_gen (this, GF_FOP_READDIR);</div><div class='del'>-</div><div class='del'>-	if (op_errno) {</div><div class='del'>-		GF_ERROR(this, "unwind(-1, %s)", strerror (op_errno));</div><div class='del'>-		STACK_UNWIND_STRICT (readdir, frame, -1, op_errno, NULL);</div><div class='del'>-		return 0;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	STACK_WIND (frame, error_gen_readdir_cbk,</div><div class='del'>-		    FIRST_CHILD(this),</div><div class='del'>-		    FIRST_CHILD(this)-&gt;fops-&gt;readdir,</div><div class='del'>-		    fd, size, off);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='add'>+    int op_errno = 0;</div><div class='add'>+    eg_t *egp = NULL;</div><div class='add'>+    int enable = 1;</div><div class='add'>+</div><div class='add'>+    egp = this-&gt;private;</div><div class='add'>+    enable = egp-&gt;enable[GF_FOP_READDIR];</div><div class='add'>+</div><div class='add'>+    if (enable)</div><div class='add'>+        op_errno = error_gen(this, GF_FOP_READDIR);</div><div class='add'>+</div><div class='add'>+    if (op_errno) {</div><div class='add'>+        GF_ERROR(this, "unwind(-1, %s)", strerror(op_errno));</div><div class='add'>+        STACK_UNWIND_STRICT(readdir, frame, -1, op_errno, NULL, xdata);</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='add'>+    STACK_WIND_TAIL(frame, FIRST_CHILD(this), FIRST_CHILD(this)-&gt;fops-&gt;readdir,</div><div class='add'>+                    fd, size, off, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-error_gen_readdirp_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-                        int32_t op_ret, int32_t op_errno, gf_dirent_t *entries)</div><div class='add'>+error_gen_readdirp(call_frame_t *frame, xlator_t *this, fd_t *fd, size_t size,</div><div class='add'>+                   off_t off, dict_t *dict)</div><div class='ctx'> {</div><div class='del'>-	STACK_UNWIND_STRICT (readdirp, frame, op_ret, op_errno, entries);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='add'>+    int op_errno = 0;</div><div class='add'>+    eg_t *egp = NULL;</div><div class='add'>+    int enable = 1;</div><div class='ctx'> </div><div class='add'>+    egp = this-&gt;private;</div><div class='add'>+    enable = egp-&gt;enable[GF_FOP_READDIRP];</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-error_gen_readdirp (call_frame_t *frame, xlator_t *this, fd_t *fd, size_t size,</div><div class='del'>-                    off_t off)</div><div class='add'>+    if (enable)</div><div class='add'>+        op_errno = error_gen(this, GF_FOP_READDIRP);</div><div class='add'>+</div><div class='add'>+    if (op_errno) {</div><div class='add'>+        GF_ERROR(this, "unwind(-1, %s)", strerror(op_errno));</div><div class='add'>+        STACK_UNWIND_STRICT(readdirp, frame, -1, op_errno, NULL, NULL);</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    STACK_WIND_TAIL(frame, FIRST_CHILD(this), FIRST_CHILD(this)-&gt;fops-&gt;readdirp,</div><div class='add'>+                    fd, size, off, dict);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+error_gen_set_failure(eg_t *pvt, double percent)</div><div class='ctx'> {</div><div class='del'>-	int              op_errno = 0;</div><div class='del'>-        eg_t            *egp = NULL;</div><div class='del'>-        int              enable = 1;</div><div class='del'>-</div><div class='del'>-        egp = this-&gt;private;</div><div class='del'>-        enable = egp-&gt;enable[GF_FOP_READDIRP];</div><div class='del'>-</div><div class='del'>-        if (enable)</div><div class='del'>-                op_errno = error_gen (this, GF_FOP_READDIRP);</div><div class='del'>-</div><div class='del'>-	if (op_errno) {</div><div class='del'>-		GF_ERROR(this, "unwind(-1, %s)", strerror (op_errno));</div><div class='del'>-		STACK_UNWIND_STRICT (readdirp, frame, -1, op_errno, NULL);</div><div class='del'>-		return 0;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	STACK_WIND (frame, error_gen_readdirp_cbk,</div><div class='del'>-                    FIRST_CHILD(this),</div><div class='del'>-                    FIRST_CHILD(this)-&gt;fops-&gt;readdirp,</div><div class='del'>-                    fd, size, off);</div><div class='del'>-	return 0;</div><div class='add'>+    double ppm;</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(pvt);</div><div class='add'>+</div><div class='add'>+    ppm = (percent / 100.0) * (double)FAILURE_GRANULARITY;</div><div class='add'>+    pvt-&gt;failure_iter_no = (int)ppm;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+static void</div><div class='add'>+error_gen_parse_fill_fops(eg_t *pvt, char *enable_fops)</div><div class='add'>+{</div><div class='add'>+    char *op_no_str = NULL;</div><div class='add'>+    int op_no = -1;</div><div class='add'>+    int i = 0;</div><div class='add'>+    xlator_t *this = THIS;</div><div class='add'>+    char *saveptr = NULL;</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-error_gen_closedir (xlator_t *this, fd_t *fd)</div><div class='add'>+    GF_ASSERT(pvt);</div><div class='add'>+    GF_ASSERT(this);</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; GF_FOP_MAXVALUE; i++)</div><div class='add'>+        pvt-&gt;enable[i] = 0;</div><div class='add'>+</div><div class='add'>+    if (!enable_fops) {</div><div class='add'>+        gf_log(this-&gt;name, GF_LOG_WARNING, "All fops are enabled.");</div><div class='add'>+        for (i = 0; i &lt; GF_FOP_MAXVALUE; i++)</div><div class='add'>+            pvt-&gt;enable[i] = 1;</div><div class='add'>+    } else {</div><div class='add'>+        op_no_str = strtok_r(enable_fops, ",", &amp;saveptr);</div><div class='add'>+        while (op_no_str) {</div><div class='add'>+            op_no = gf_fop_int(op_no_str);</div><div class='add'>+            if (op_no == -1) {</div><div class='add'>+                gf_log(this-&gt;name, GF_LOG_WARNING, "Wrong option value %s",</div><div class='add'>+                       op_no_str);</div><div class='add'>+            } else</div><div class='add'>+                pvt-&gt;enable[op_no] = 1;</div><div class='add'>+</div><div class='add'>+            op_no_str = strtok_r(NULL, ",", &amp;saveptr);</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+error_gen_priv_dump(xlator_t *this)</div><div class='ctx'> {</div><div class='del'>-	return 0;</div><div class='add'>+    char key_prefix[GF_DUMP_MAX_BUF_LEN];</div><div class='add'>+    int ret = -1;</div><div class='add'>+    eg_t *conf = NULL;</div><div class='add'>+</div><div class='add'>+    if (!this)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    conf = this-&gt;private;</div><div class='add'>+    if (!conf)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    ret = TRY_LOCK(&amp;conf-&gt;lock);</div><div class='add'>+    if (ret != 0) {</div><div class='add'>+        return ret;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    gf_proc_dump_add_section("xlator.debug.error-gen.%s.priv", this-&gt;name);</div><div class='add'>+    gf_proc_dump_build_key(key_prefix, "xlator.debug.error-gen", "%s.priv",</div><div class='add'>+                           this-&gt;name);</div><div class='add'>+</div><div class='add'>+    gf_proc_dump_write("op_count", "%d", conf-&gt;op_count);</div><div class='add'>+    gf_proc_dump_write("failure_iter_no", "%d", conf-&gt;failure_iter_no);</div><div class='add'>+    gf_proc_dump_write("error_no", "%d", conf-&gt;error_no_int);</div><div class='add'>+    gf_proc_dump_write("random_failure", "%d", conf-&gt;random_failure);</div><div class='add'>+</div><div class='add'>+    UNLOCK(&amp;conf-&gt;lock);</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+int32_t</div><div class='add'>+mem_acct_init(xlator_t *this)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    if (!this)</div><div class='add'>+        return ret;</div><div class='add'>+</div><div class='add'>+    ret = xlator_mem_acct_init(this, gf_error_gen_mt_end + 1);</div><div class='add'>+</div><div class='add'>+    if (ret != 0) {</div><div class='add'>+        gf_log(this-&gt;name, GF_LOG_ERROR,</div><div class='add'>+               "Memory accounting init"</div><div class='add'>+               " failed");</div><div class='add'>+        return ret;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-error_gen_close (xlator_t *this, fd_t *fd)</div><div class='add'>+reconfigure(xlator_t *this, dict_t *options)</div><div class='ctx'> {</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='add'>+    eg_t *pvt = NULL;</div><div class='add'>+    int32_t ret = 0;</div><div class='add'>+    char *error_enable_fops = NULL;</div><div class='add'>+    char *error_no = NULL;</div><div class='add'>+    double failure_percent_dbl = 0.0;</div><div class='add'>+</div><div class='add'>+    if (!this || !this-&gt;private)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    pvt = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    ret = -1;</div><div class='add'>+</div><div class='add'>+    GF_OPTION_RECONF("error-no", error_no, options, str, out);</div><div class='add'>+</div><div class='add'>+    if (error_no)</div><div class='add'>+        pvt-&gt;error_no_int = conv_errno_to_int(&amp;error_no);</div><div class='add'>+</div><div class='add'>+    GF_OPTION_RECONF("failure", failure_percent_dbl, options, percent, out);</div><div class='add'>+</div><div class='add'>+    GF_OPTION_RECONF("enable", error_enable_fops, options, str, out);</div><div class='ctx'> </div><div class='add'>+    GF_OPTION_RECONF("random-failure", pvt-&gt;random_failure, options, bool, out);</div><div class='add'>+</div><div class='add'>+    error_gen_parse_fill_fops(pvt, error_enable_fops);</div><div class='add'>+    error_gen_set_failure(pvt, failure_percent_dbl);</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+out:</div><div class='add'>+    gf_log(this ? this-&gt;name : "error-gen", GF_LOG_DEBUG,</div><div class='add'>+           "reconfigure returning %d", ret);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-init (xlator_t *this)</div><div class='add'>+init(xlator_t *this)</div><div class='ctx'> {</div><div class='del'>-        eg_t            *pvt = NULL;</div><div class='del'>-        data_t          *error_no = NULL;</div><div class='del'>-        data_t          *failure_percent = NULL;</div><div class='del'>-        data_t          *enable = NULL;</div><div class='del'>-        int32_t          ret = 0;</div><div class='del'>-        char            *error_enable_fops = NULL;</div><div class='del'>-        char            *op_no_str = NULL;</div><div class='del'>-        int              op_no = -1;</div><div class='del'>-        int              i = 0;</div><div class='del'>-        int32_t          failure_percent_int = 0;</div><div class='del'>-</div><div class='del'>-        if (!this-&gt;children || this-&gt;children-&gt;next) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-                        "error-gen not configured with one subvolume");</div><div class='del'>-                ret = -1;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='add'>+    eg_t *pvt = NULL;</div><div class='add'>+    int32_t ret = 0;</div><div class='add'>+    char *error_enable_fops = NULL;</div><div class='add'>+    char *error_no = NULL;</div><div class='add'>+    double failure_percent_dbl = 0.0;</div><div class='ctx'> </div><div class='del'>-        if (!this-&gt;parents) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_WARNING,</div><div class='del'>-                        "dangling volume. check volfile ");</div><div class='del'>-        }</div><div class='add'>+    if (!this-&gt;children || this-&gt;children-&gt;next) {</div><div class='add'>+        gf_log(this-&gt;name, GF_LOG_ERROR,</div><div class='add'>+               "error-gen not configured with one subvolume");</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        error_no = dict_get (this-&gt;options, "error-no");</div><div class='del'>-        failure_percent = dict_get (this-&gt;options, "failure");</div><div class='del'>-        enable = dict_get (this-&gt;options, "enable");</div><div class='add'>+    if (!this-&gt;parents) {</div><div class='add'>+        gf_log(this-&gt;name, GF_LOG_WARNING, "dangling volume. check volfile ");</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        pvt = CALLOC (1, sizeof (eg_t));</div><div class='add'>+    pvt = GF_CALLOC(1, sizeof(eg_t), gf_error_gen_mt_eg_t);</div><div class='ctx'> </div><div class='del'>-        if (!pvt) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-                        "out of memory.");</div><div class='del'>-                ret = -1;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='add'>+    if (!pvt) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        LOCK_INIT (&amp;pvt-&gt;lock);</div><div class='add'>+    LOCK_INIT(&amp;pvt-&gt;lock);</div><div class='ctx'> </div><div class='del'>-        for (i = 0; i &lt; GF_FOP_MAXVALUE; i++)</div><div class='del'>-                pvt-&gt;enable[i] = 0;</div><div class='del'>-        if (!error_no) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-                        "error-no not specified.");</div><div class='del'>-        } else {</div><div class='del'>-                pvt-&gt;error_no = data_to_str (error_no);</div><div class='del'>-        }</div><div class='add'>+    ret = -1;</div><div class='ctx'> </div><div class='del'>-        if (!failure_percent) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-                        "failure percent not specified.");</div><div class='del'>-                pvt-&gt;failure_iter_no = 100/GF_FAILURE_DEFAULT;</div><div class='del'>-        } else {</div><div class='del'>-                failure_percent_int = data_to_int32 (failure_percent);</div><div class='del'>-                if (failure_percent_int)</div><div class='del'>-                        pvt-&gt;failure_iter_no = 100/failure_percent_int;</div><div class='del'>-                else</div><div class='del'>-                        pvt-&gt;failure_iter_no = 100/GF_FAILURE_DEFAULT;</div><div class='del'>-        }</div><div class='add'>+    GF_OPTION_INIT("error-no", error_no, str, out);</div><div class='ctx'> </div><div class='del'>-        if (!enable) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_WARNING,</div><div class='del'>-                        "All fops are enabled.");</div><div class='del'>-                for (i = 0; i &lt; GF_FOP_MAXVALUE; i++)</div><div class='del'>-                        pvt-&gt;enable[i] = 1;</div><div class='del'>-        } else {</div><div class='del'>-                error_enable_fops = data_to_str (enable);</div><div class='del'>-                op_no_str = error_enable_fops;</div><div class='del'>-                while ((*error_enable_fops) != '\0') {</div><div class='del'>-                        error_enable_fops++;</div><div class='del'>-                        if (((*error_enable_fops) == ',') ||</div><div class='del'>-                            ((*error_enable_fops) == '\0')) {</div><div class='del'>-                                if ((*error_enable_fops) != '\0') {</div><div class='del'>-                                        (*error_enable_fops) = '\0';</div><div class='del'>-                                        error_enable_fops++;</div><div class='del'>-                                }</div><div class='del'>-                                op_no = get_fop_int (&amp;op_no_str);</div><div class='del'>-                                if (op_no == -1) {</div><div class='del'>-                                        gf_log (this-&gt;name, GF_LOG_WARNING,</div><div class='del'>-                                                "Wrong option value %s",</div><div class='del'>-                                                op_no_str);</div><div class='del'>-                                } else</div><div class='del'>-                                        pvt-&gt;enable[op_no] = 1;</div><div class='del'>-                                op_no_str = error_enable_fops;</div><div class='del'>-                        }</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='del'>-        this-&gt;private = pvt;</div><div class='add'>+    if (error_no)</div><div class='add'>+        pvt-&gt;error_no_int = conv_errno_to_int(&amp;error_no);</div><div class='add'>+</div><div class='add'>+    GF_OPTION_INIT("failure", failure_percent_dbl, percent, out);</div><div class='add'>+</div><div class='add'>+    GF_OPTION_INIT("enable", error_enable_fops, str, out);</div><div class='add'>+</div><div class='add'>+    GF_OPTION_INIT("random-failure", pvt-&gt;random_failure, bool, out);</div><div class='ctx'> </div><div class='del'>-        /* Give some seed value here */</div><div class='del'>-        srand (time(NULL));</div><div class='add'>+    error_gen_parse_fill_fops(pvt, error_enable_fops);</div><div class='add'>+    error_gen_set_failure(pvt, failure_percent_dbl);</div><div class='add'>+</div><div class='add'>+    this-&gt;private = pvt;</div><div class='add'>+</div><div class='add'>+    /* Give some seed value here. */</div><div class='add'>+    srand(gf_time());</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='ctx'> out:</div><div class='del'>-        return ret;</div><div class='add'>+    if (ret)</div><div class='add'>+        GF_FREE(pvt);</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> void</div><div class='del'>-fini (xlator_t *this)</div><div class='add'>+fini(xlator_t *this)</div><div class='ctx'> {</div><div class='del'>-        eg_t            *pvt = NULL;</div><div class='del'>-</div><div class='del'>-        if (!this)</div><div class='del'>-                 return;</div><div class='del'>-        pvt = this-&gt;private;</div><div class='add'>+    eg_t *pvt = NULL;</div><div class='ctx'> </div><div class='del'>-        if (pvt) {</div><div class='del'>-                LOCK_DESTROY (&amp;pvt-&gt;lock);</div><div class='del'>-                FREE (pvt);</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_DEBUG, "fini called");</div><div class='del'>-        }</div><div class='add'>+    if (!this)</div><div class='ctx'>         return;</div><div class='add'>+    pvt = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    if (pvt) {</div><div class='add'>+        LOCK_DESTROY(&amp;pvt-&gt;lock);</div><div class='add'>+        GF_FREE(pvt);</div><div class='add'>+        gf_log(this-&gt;name, GF_LOG_DEBUG, "fini called");</div><div class='add'>+    }</div><div class='add'>+    return;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-struct xlator_fops fops = {</div><div class='del'>-	.lookup      = error_gen_lookup,</div><div class='del'>-	.stat        = error_gen_stat,</div><div class='del'>-	.readlink    = error_gen_readlink,</div><div class='del'>-	.mknod       = error_gen_mknod,</div><div class='del'>-	.mkdir       = error_gen_mkdir,</div><div class='del'>-	.unlink      = error_gen_unlink,</div><div class='del'>-	.rmdir       = error_gen_rmdir,</div><div class='del'>-	.symlink     = error_gen_symlink,</div><div class='del'>-	.rename      = error_gen_rename,</div><div class='del'>-	.link        = error_gen_link,</div><div class='del'>-	.truncate    = error_gen_truncate,</div><div class='del'>-	.create      = error_gen_create,</div><div class='del'>-	.open        = error_gen_open,</div><div class='del'>-	.readv       = error_gen_readv,</div><div class='del'>-	.writev      = error_gen_writev,</div><div class='del'>-	.statfs      = error_gen_statfs,</div><div class='del'>-	.flush       = error_gen_flush,</div><div class='del'>-	.fsync       = error_gen_fsync,</div><div class='del'>-	.setxattr    = error_gen_setxattr,</div><div class='del'>-	.getxattr    = error_gen_getxattr,</div><div class='del'>-	.removexattr = error_gen_removexattr,</div><div class='del'>-	.opendir     = error_gen_opendir,</div><div class='del'>-	.readdir     = error_gen_readdir,</div><div class='del'>-	.readdirp    = error_gen_readdirp,</div><div class='del'>-	.fsyncdir    = error_gen_fsyncdir,</div><div class='del'>-	.access      = error_gen_access,</div><div class='del'>-	.ftruncate   = error_gen_ftruncate,</div><div class='del'>-	.fstat       = error_gen_fstat,</div><div class='del'>-	.lk          = error_gen_lk,</div><div class='del'>-	.lookup_cbk  = error_gen_lookup_cbk,</div><div class='del'>-	.xattrop     = error_gen_xattrop,</div><div class='del'>-	.fxattrop    = error_gen_fxattrop,</div><div class='del'>-	.inodelk     = error_gen_inodelk,</div><div class='del'>-	.finodelk    = error_gen_finodelk,</div><div class='del'>-	.entrylk     = error_gen_entrylk,</div><div class='del'>-	.fentrylk    = error_gen_fentrylk,</div><div class='del'>-        .setattr     = error_gen_setattr,</div><div class='del'>-        .fsetattr    = error_gen_fsetattr,</div><div class='del'>-	.getspec     = error_gen_getspec,</div><div class='add'>+struct xlator_dumpops dumpops = {</div><div class='add'>+    .priv = error_gen_priv_dump,</div><div class='ctx'> };</div><div class='ctx'> </div><div class='del'>-struct xlator_cbks cbks = {</div><div class='del'>-	.release = error_gen_close,</div><div class='del'>-	.releasedir = error_gen_closedir,</div><div class='add'>+struct xlator_cbks cbks;</div><div class='add'>+</div><div class='add'>+struct xlator_fops fops = {</div><div class='add'>+    .lookup = error_gen_lookup,</div><div class='add'>+    .stat = error_gen_stat,</div><div class='add'>+    .readlink = error_gen_readlink,</div><div class='add'>+    .mknod = error_gen_mknod,</div><div class='add'>+    .mkdir = error_gen_mkdir,</div><div class='add'>+    .unlink = error_gen_unlink,</div><div class='add'>+    .rmdir = error_gen_rmdir,</div><div class='add'>+    .symlink = error_gen_symlink,</div><div class='add'>+    .rename = error_gen_rename,</div><div class='add'>+    .link = error_gen_link,</div><div class='add'>+    .truncate = error_gen_truncate,</div><div class='add'>+    .create = error_gen_create,</div><div class='add'>+    .open = error_gen_open,</div><div class='add'>+    .readv = error_gen_readv,</div><div class='add'>+    .writev = error_gen_writev,</div><div class='add'>+    .statfs = error_gen_statfs,</div><div class='add'>+    .flush = error_gen_flush,</div><div class='add'>+    .fsync = error_gen_fsync,</div><div class='add'>+    .setxattr = error_gen_setxattr,</div><div class='add'>+    .getxattr = error_gen_getxattr,</div><div class='add'>+    .removexattr = error_gen_removexattr,</div><div class='add'>+    .fsetxattr = error_gen_fsetxattr,</div><div class='add'>+    .fgetxattr = error_gen_fgetxattr,</div><div class='add'>+    .fremovexattr = error_gen_fremovexattr,</div><div class='add'>+    .opendir = error_gen_opendir,</div><div class='add'>+    .readdir = error_gen_readdir,</div><div class='add'>+    .readdirp = error_gen_readdirp,</div><div class='add'>+    .fsyncdir = error_gen_fsyncdir,</div><div class='add'>+    .access = error_gen_access,</div><div class='add'>+    .ftruncate = error_gen_ftruncate,</div><div class='add'>+    .fstat = error_gen_fstat,</div><div class='add'>+    .lk = error_gen_lk,</div><div class='add'>+    .xattrop = error_gen_xattrop,</div><div class='add'>+    .fxattrop = error_gen_fxattrop,</div><div class='add'>+    .inodelk = error_gen_inodelk,</div><div class='add'>+    .finodelk = error_gen_finodelk,</div><div class='add'>+    .entrylk = error_gen_entrylk,</div><div class='add'>+    .fentrylk = error_gen_fentrylk,</div><div class='add'>+    .setattr = error_gen_setattr,</div><div class='add'>+    .fsetattr = error_gen_fsetattr,</div><div class='add'>+    .getspec = error_gen_getspec,</div><div class='ctx'> };</div><div class='ctx'> </div><div class='ctx'> struct volume_options options[] = {</div><div class='del'>-        { .key  = {"failure"},</div><div class='del'>-          .type = GF_OPTION_TYPE_INT },</div><div class='del'>-        { .key  = {"error-no"},</div><div class='del'>-          .value = {"ENOENT","ENOTDIR","ENAMETOOLONG","EACCES","EBADF",</div><div class='del'>-                    "EFAULT","ENOMEM","EINVAL","EIO","EEXIST","ENOSPC",</div><div class='del'>-                    "EPERM","EROFS","EBUSY","EISDIR","ENOTEMPTY","EMLINK"</div><div class='del'>-                    "ENODEV","EXDEV","EMFILE","ENFILE","ENOSYS","EINTR",</div><div class='del'>-                    "EFBIG","EAGAIN"},</div><div class='del'>-          .type = GF_OPTION_TYPE_STR },</div><div class='del'>-        { .key  = {"enable"},</div><div class='del'>-          .type = GF_OPTION_TYPE_STR },</div><div class='del'>-        { .key  = {NULL} }</div><div class='add'>+    {</div><div class='add'>+        .key = {"failure"},</div><div class='add'>+        .type = GF_OPTION_TYPE_PERCENT,</div><div class='add'>+        .description = "Percentage failure of operations when enabled.",</div><div class='add'>+    },</div><div class='add'>+</div><div class='add'>+    {</div><div class='add'>+        .key = {"error-no"},</div><div class='add'>+        .value = {"ENOENT",</div><div class='add'>+                  "ENOTDIR",</div><div class='add'>+                  "ENAMETOOLONG",</div><div class='add'>+                  "EACCES",</div><div class='add'>+                  "EBADF",</div><div class='add'>+                  "EFAULT",</div><div class='add'>+                  "ENOMEM",</div><div class='add'>+                  "EINVAL",</div><div class='add'>+                  "EIO",</div><div class='add'>+                  "EEXIST",</div><div class='add'>+                  "ENOSPC",</div><div class='add'>+                  "EPERM",</div><div class='add'>+                  "EROFS",</div><div class='add'>+                  "EBUSY",</div><div class='add'>+                  "EISDIR",</div><div class='add'>+                  "ENOTEMPTY",</div><div class='add'>+                  "EMLINK"</div><div class='add'>+                  "ENODEV",</div><div class='add'>+                  "EXDEV",</div><div class='add'>+                  "EMFILE",</div><div class='add'>+                  "ENFILE",</div><div class='add'>+                  "ENOSYS",</div><div class='add'>+                  "EINTR",</div><div class='add'>+                  "EFBIG",</div><div class='add'>+                  "EAGAIN",</div><div class='add'>+                  "GF_ERROR_SHORT_WRITE"},</div><div class='add'>+        .type = GF_OPTION_TYPE_STR,</div><div class='add'>+        .op_version = {3},</div><div class='add'>+        .tags = {"error-gen"},</div><div class='add'>+        .flags = OPT_FLAG_SETTABLE,</div><div class='add'>+</div><div class='add'>+    },</div><div class='add'>+</div><div class='add'>+    {</div><div class='add'>+        .key = {"random-failure"},</div><div class='add'>+        .type = GF_OPTION_TYPE_BOOL,</div><div class='add'>+        .default_value = "off",</div><div class='add'>+        .op_version = {3},</div><div class='add'>+        .tags = {"error-gen"},</div><div class='add'>+        .flags = OPT_FLAG_SETTABLE,</div><div class='add'>+    },</div><div class='add'>+</div><div class='add'>+    {</div><div class='add'>+        .key = {"enable", "error-fops"},</div><div class='add'>+        .type = GF_OPTION_TYPE_STR,</div><div class='add'>+        .description = "Accepts a string which takes ',' separated fop "</div><div class='add'>+                       "strings to denote which fops are enabled for error",</div><div class='add'>+        .op_version = {3},</div><div class='add'>+        .tags = {"error-gen"},</div><div class='add'>+        .flags = OPT_FLAG_SETTABLE,</div><div class='add'>+    },</div><div class='add'>+</div><div class='add'>+    {.key = {NULL}},</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+xlator_api_t xlator_api = {</div><div class='add'>+    .init = init,</div><div class='add'>+    .fini = fini,</div><div class='add'>+    .reconfigure = reconfigure,</div><div class='add'>+    .mem_acct_init = mem_acct_init,</div><div class='add'>+    .op_version = {1},</div><div class='add'>+    .dumpops = &amp;dumpops,</div><div class='add'>+    .fops = &amp;fops,</div><div class='add'>+    .cbks = &amp;cbks,</div><div class='add'>+    .options = options,</div><div class='add'>+    .identifier = "error-gen",</div><div class='add'>+    .category = GF_TECH_PREVIEW,</div><div class='ctx'> };</div><div class='head'>diff --git a/xlators/debug/error-gen/src/error-gen.h b/xlators/debug/error-gen/src/error-gen.h<br/>index fc51fafc3aa..2478cd5b21c 100644<br/>--- a/<a href='/cgit/glusterfs.git/tree/xlators/debug/error-gen/src/error-gen.h?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/debug/error-gen/src/error-gen.h</a><br/>+++ b/<a href='/cgit/glusterfs.git/tree/xlators/debug/error-gen/src/error-gen.h?id=d1d7a6f35c816822fab51c820e25023863c239c1'>xlators/debug/error-gen/src/error-gen.h</a></div><div class='hunk'>@@ -1,43 +1,49 @@</div><div class='ctx'> /*</div><div class='del'>-  Copyright (c) 2008-2009 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='del'>-  This file is part of GlusterFS.</div><div class='add'>+   Copyright (c) 2008-2012 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+   This file is part of GlusterFS.</div><div class='ctx'> </div><div class='del'>-  GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-  it under the terms of the GNU General Public License as published</div><div class='del'>-  by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-  or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-  GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-  WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-  General Public License for more details.</div><div class='del'>-</div><div class='del'>-  You should have received a copy of the GNU General Public License</div><div class='del'>-  along with this program.  If not, see</div><div class='del'>-  &lt;http://www.gnu.org/licenses/&gt;.</div><div class='add'>+   This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+   General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+   later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+   cases as published by the Free Software Foundation.</div><div class='ctx'> */</div><div class='del'>-</div><div class='ctx'> #ifndef _ERROR_GEN_H</div><div class='ctx'> #define _ERROR_GEN_H</div><div class='ctx'> </div><div class='del'>-#ifndef _CONFIG_H</div><div class='del'>-#define _CONFIG_H</div><div class='del'>-#include "config.h"</div><div class='del'>-#endif</div><div class='add'>+#include "error-gen-mem-types.h"</div><div class='ctx'> </div><div class='ctx'> #define GF_FAILURE_DEFAULT 10</div><div class='ctx'> </div><div class='add'>+/*</div><div class='add'>+ * Pseudo-errors refer to errors beyond the scope of traditional &lt;-1, op_errno&gt;</div><div class='add'>+ * returns. This facilitates the ability to return unexpected, but not -1 values</div><div class='add'>+ * and/or to inject operations that lead to implicit error conditions. The range</div><div class='add'>+ * for pseudo errors resides at a high value to avoid conflicts with the errno</div><div class='add'>+ * range.</div><div class='add'>+ */</div><div class='add'>+enum GF_PSEUDO_ERRORS {</div><div class='add'>+    GF_ERROR_SHORT_WRITE = 1000, /* short writev return value */</div><div class='add'>+    GF_ERROR_MAX</div><div class='add'>+};</div><div class='add'>+</div><div class='ctx'> typedef struct {</div><div class='del'>-        int enable[GF_FOP_MAXVALUE];</div><div class='del'>-        int op_count;</div><div class='del'>-        int failure_iter_no;</div><div class='del'>-        char *error_no;</div><div class='del'>-        gf_lock_t lock;</div><div class='add'>+    int enable[GF_FOP_MAXVALUE];</div><div class='add'>+    int op_count;</div><div class='add'>+    /*</div><div class='add'>+     * This is only an iteration number in the random-failure case.  For</div><div class='add'>+     * the normal controlled-probability case, it's actually a numerator</div><div class='add'>+     * for the failure probability (see FAILURE_GRANULARITY declaration).</div><div class='add'>+     * It's just not worth blowing up the diff by changing it.</div><div class='add'>+     */</div><div class='add'>+    int failure_iter_no;</div><div class='add'>+    int error_no_int;</div><div class='add'>+    gf_boolean_t random_failure;</div><div class='add'>+    gf_lock_t lock;</div><div class='ctx'> } eg_t;</div><div class='ctx'> </div><div class='ctx'> typedef struct {</div><div class='del'>-        int error_no_count;</div><div class='del'>-	int error_no[20];</div><div class='add'>+    int error_no_count;</div><div class='add'>+    int error_no[20];</div><div class='ctx'> } sys_error_t;</div><div class='ctx'> </div><div class='ctx'> #endif</div><div class='head'>diff --git a/xlators/debug/io-stats/src/Makefile.am b/xlators/debug/io-stats/src/Makefile.am<br/>index b894e79c3fe..c69f3caf0fe 100644<br/>--- a/<a href='/cgit/glusterfs.git/tree/xlators/debug/io-stats/src/Makefile.am?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/debug/io-stats/src/Makefile.am</a><br/>+++ b/<a href='/cgit/glusterfs.git/tree/xlators/debug/io-stats/src/Makefile.am?id=d1d7a6f35c816822fab51c820e25023863c239c1'>xlators/debug/io-stats/src/Makefile.am</a></div><div class='hunk'>@@ -2,14 +2,18 @@</div><div class='ctx'> xlator_LTLIBRARIES = io-stats.la</div><div class='ctx'> xlatordir = $(libdir)/glusterfs/$(PACKAGE_VERSION)/xlator/debug</div><div class='ctx'> </div><div class='del'>-io_stats_la_LDFLAGS = -module -avoidversion</div><div class='add'>+io_stats_la_LDFLAGS = -module $(GF_XLATOR_DEFAULT_LDFLAGS)</div><div class='ctx'> </div><div class='ctx'> io_stats_la_SOURCES = io-stats.c</div><div class='ctx'> io_stats_la_LIBADD = $(top_builddir)/libglusterfs/src/libglusterfs.la</div><div class='ctx'> </div><div class='ctx'> noinst_HEADERS = io-stats-mem-types.h</div><div class='ctx'> </div><div class='del'>-AM_CFLAGS = -fPIC -D_FILE_OFFSET_BITS=64 -D_GNU_SOURCE -Wall -D$(GF_HOST_OS)\</div><div class='del'>-	-I$(top_srcdir)/libglusterfs/src -shared -nostartfiles $(GF_CFLAGS)</div><div class='add'>+AM_CPPFLAGS = $(GF_CPPFLAGS) -I$(top_srcdir)/libglusterfs/src \</div><div class='add'>+	-I$(top_srcdir)/rpc/xdr/src -I$(top_builddir)/rpc/xdr/src \</div><div class='add'>+	-I$(top_srcdir)/rpc/rpc-lib/src \</div><div class='add'>+	-DDATADIR=\"$(localstatedir)\"</div><div class='add'>+</div><div class='add'>+AM_CFLAGS = -Wall $(GF_CFLAGS)</div><div class='ctx'> </div><div class='ctx'> CLEANFILES =</div><div class='head'>diff --git a/xlators/debug/io-stats/src/io-stats-mem-types.h b/xlators/debug/io-stats/src/io-stats-mem-types.h<br/>index d9b434d579f..51d38d8b97c 100644<br/>--- a/<a href='/cgit/glusterfs.git/tree/xlators/debug/io-stats/src/io-stats-mem-types.h?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/debug/io-stats/src/io-stats-mem-types.h</a><br/>+++ b/<a href='/cgit/glusterfs.git/tree/xlators/debug/io-stats/src/io-stats-mem-types.h?id=d1d7a6f35c816822fab51c820e25023863c239c1'>xlators/debug/io-stats/src/io-stats-mem-types.h</a></div><div class='hunk'>@@ -1,33 +1,27 @@</div><div class='del'>-</div><div class='ctx'> /*</div><div class='del'>-   Copyright (c) 2008-2009 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='add'>+   Copyright (c) 2008-2012 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='ctx'>    This file is part of GlusterFS.</div><div class='ctx'> </div><div class='del'>-   GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-   it under the terms of the GNU General Public License as published</div><div class='del'>-   by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-   or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-   GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-   WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-   General Public License for more details.</div><div class='del'>-</div><div class='del'>-   You should have received a copy of the GNU General Public License</div><div class='del'>-   along with this program.  If not, see</div><div class='del'>-   &lt;http://www.gnu.org/licenses/&gt;.</div><div class='add'>+   This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+   General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+   later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+   cases as published by the Free Software Foundation.</div><div class='ctx'> */</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> #ifndef __IO_STATS_MEM_TYPES_H__</div><div class='ctx'> #define __IO_STATS_MEM_TYPES_H__</div><div class='ctx'> </div><div class='del'>-#include "mem-types.h"</div><div class='add'>+#include &lt;glusterfs/mem-types.h&gt;</div><div class='add'>+</div><div class='add'>+extern const char *__progname;</div><div class='ctx'> </div><div class='ctx'> enum gf_io_stats_mem_types_ {</div><div class='del'>-        gf_io_stats_mt_ios_conf = gf_common_mt_end + 1,</div><div class='del'>-        gf_io_stats_mt_ios_fd,</div><div class='del'>-        gf_io_stats_mt_end</div><div class='add'>+    gf_io_stats_mt_ios_conf = gf_common_mt_end + 1,</div><div class='add'>+    gf_io_stats_mt_ios_fd,</div><div class='add'>+    gf_io_stats_mt_ios_stat,</div><div class='add'>+    gf_io_stats_mt_ios_stat_list,</div><div class='add'>+    gf_io_stats_mt_ios_sample_buf,</div><div class='add'>+    gf_io_stats_mt_ios_sample,</div><div class='add'>+    gf_io_stats_mt_end</div><div class='ctx'> };</div><div class='ctx'> #endif</div><div class='del'>-</div><div class='head'>diff --git a/xlators/debug/io-stats/src/io-stats.c b/xlators/debug/io-stats/src/io-stats.c<br/>index ee0e9336512..aa00c446e5a 100644<br/>--- a/<a href='/cgit/glusterfs.git/tree/xlators/debug/io-stats/src/io-stats.c?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/debug/io-stats/src/io-stats.c</a><br/>+++ b/<a href='/cgit/glusterfs.git/tree/xlators/debug/io-stats/src/io-stats.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>xlators/debug/io-stats/src/io-stats.c</a></div><div class='hunk'>@@ -1,26 +1,14 @@</div><div class='ctx'> /*</div><div class='del'>-  Copyright (c) 2006-2009 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='del'>-  This file is part of GlusterFS.</div><div class='del'>-</div><div class='del'>-  GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-  it under the terms of the GNU General Public License as published</div><div class='del'>-  by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-  or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-  GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-  WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-  General Public License for more details.</div><div class='del'>-</div><div class='del'>-  You should have received a copy of the GNU General Public License</div><div class='del'>-  along with this program.  If not, see</div><div class='del'>-  &lt;http://www.gnu.org/licenses/&gt;.</div><div class='del'>-*/</div><div class='add'>+   Copyright (c) 2006-2012 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+   This file is part of GlusterFS.</div><div class='ctx'> </div><div class='del'>-#ifndef _CONFIG_H</div><div class='del'>-#define _CONFIG_H</div><div class='del'>-#include "config.h"</div><div class='del'>-#endif</div><div class='add'>+   This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+   General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+   later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+   cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+#include &lt;glusterfs/xlator.h&gt;</div><div class='add'>+#include &lt;glusterfs/syscall.h&gt;</div><div class='ctx'> </div><div class='ctx'> /**</div><div class='ctx'>  * xlators/debug/io_stats :</div><div class='hunk'>@@ -29,1481 +17,4464 @@</div><div class='ctx'>  *</div><div class='ctx'>  *  a) total read data - since process start, last interval and per fd</div><div class='ctx'>  *  b) total write data - since process start, last interval and per fd</div><div class='del'>- *  c) counts of read IO block size - since process start, last interval and per fd</div><div class='del'>- *  d) counts of write IO block size - since process start, last interval and per fd</div><div class='del'>- *  e) counts of all FOP types passing through it</div><div class='add'>+ *  c) counts of read IO block size - since process start, last interval and per</div><div class='add'>+ * fd d) counts of write IO block size - since process start, last interval and</div><div class='add'>+ * per fd e) counts of all FOP types passing through it</div><div class='ctx'>  *</div><div class='del'>- *  Usage: setfattr -n io-stats-dump /tmp/filename /mnt/gluster</div><div class='add'>+ *  Usage: setfattr -n trusted.io-stats-dump /tmp/filename /mnt/gluster</div><div class='add'>+ *      output is written to /tmp/filename.&lt;iostats xlator instance name&gt;</div><div class='ctx'>  *</div><div class='ctx'>  */</div><div class='ctx'> </div><div class='ctx'> #include &lt;fnmatch.h&gt;</div><div class='ctx'> #include &lt;errno.h&gt;</div><div class='del'>-#include "glusterfs.h"</div><div class='del'>-#include "xlator.h"</div><div class='add'>+#include &lt;glusterfs/glusterfs.h&gt;</div><div class='add'>+#include &lt;glusterfs/xlator.h&gt;</div><div class='ctx'> #include "io-stats-mem-types.h"</div><div class='add'>+#include &lt;stdarg.h&gt;</div><div class='add'>+#include &lt;glusterfs/defaults.h&gt;</div><div class='add'>+#include &lt;glusterfs/logging.h&gt;</div><div class='add'>+#include &lt;glusterfs/statedump.h&gt;</div><div class='add'>+#include &lt;glusterfs/syncop.h&gt;</div><div class='add'>+#include &lt;pwd.h&gt;</div><div class='add'>+#include &lt;grp.h&gt;</div><div class='add'>+#include &lt;glusterfs/upcall-utils.h&gt;</div><div class='add'>+#include &lt;glusterfs/async.h&gt;</div><div class='add'>+</div><div class='add'>+#define MAX_LIST_MEMBERS 100</div><div class='add'>+#define DEFAULT_PWD_BUF_SZ 16384</div><div class='add'>+#define DEFAULT_GRP_BUF_SZ 16384</div><div class='add'>+#define IOS_BLOCK_COUNT_SIZE 32</div><div class='add'>+</div><div class='add'>+#define IOS_STATS_DUMP_DIR DEFAULT_VAR_RUN_DIRECTORY</div><div class='add'>+</div><div class='add'>+typedef enum {</div><div class='add'>+    IOS_STATS_TYPE_NONE,</div><div class='add'>+    IOS_STATS_TYPE_OPEN,</div><div class='add'>+    IOS_STATS_TYPE_READ,</div><div class='add'>+    IOS_STATS_TYPE_WRITE,</div><div class='add'>+    IOS_STATS_TYPE_OPENDIR,</div><div class='add'>+    IOS_STATS_TYPE_READDIRP,</div><div class='add'>+    IOS_STATS_TYPE_READ_THROUGHPUT,</div><div class='add'>+    IOS_STATS_TYPE_WRITE_THROUGHPUT,</div><div class='add'>+    IOS_STATS_TYPE_MAX</div><div class='add'>+} ios_stats_type_t;</div><div class='add'>+</div><div class='add'>+typedef enum {</div><div class='add'>+    IOS_STATS_THRU_READ,</div><div class='add'>+    IOS_STATS_THRU_WRITE,</div><div class='add'>+    IOS_STATS_THRU_MAX,</div><div class='add'>+} ios_stats_thru_t;</div><div class='add'>+</div><div class='add'>+/* This is same as gf1_cli_info_op */</div><div class='add'>+/* had to be defined here again, so we have modularity between</div><div class='add'>+ xdr, xlator, and library functions */</div><div class='add'>+typedef enum ios_info_op {</div><div class='add'>+    GF_IOS_INFO_NONE = 0,</div><div class='add'>+    GF_IOS_INFO_ALL = 1,</div><div class='add'>+    GF_IOS_INFO_INCREMENTAL = 2,</div><div class='add'>+    GF_IOS_INFO_CUMULATIVE = 3,</div><div class='add'>+    GF_IOS_INFO_CLEAR = 4,</div><div class='add'>+} ios_info_op_t;</div><div class='add'>+</div><div class='add'>+struct ios_stat_lat {</div><div class='add'>+    struct timeval time;</div><div class='add'>+    double throughput;</div><div class='add'>+};</div><div class='ctx'> </div><div class='add'>+struct ios_stat {</div><div class='add'>+    gf_lock_t lock;</div><div class='add'>+    uuid_t gfid;</div><div class='add'>+    char *filename;</div><div class='add'>+    gf_atomic_t counters[IOS_STATS_TYPE_MAX];</div><div class='add'>+    struct ios_stat_lat thru_counters[IOS_STATS_THRU_MAX];</div><div class='add'>+    gf_atomic_t refcnt;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct ios_stat_list {</div><div class='add'>+    struct list_head list;</div><div class='add'>+    struct ios_stat *iosstat;</div><div class='add'>+    double value;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct ios_stat_head {</div><div class='add'>+    gf_lock_t lock;</div><div class='add'>+    double min_cnt;</div><div class='add'>+    uint64_t members;</div><div class='add'>+    struct ios_stat_list *iosstats;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+typedef struct _ios_sample_t {</div><div class='add'>+    uid_t uid;</div><div class='add'>+    gid_t gid;</div><div class='add'>+    char identifier[UNIX_PATH_MAX];</div><div class='add'>+    glusterfs_fop_t fop_type;</div><div class='add'>+    struct timeval timestamp;</div><div class='add'>+    double elapsed;</div><div class='add'>+} ios_sample_t;</div><div class='add'>+</div><div class='add'>+typedef struct _ios_sample_buf_t {</div><div class='add'>+    uint64_t pos;              /* Position in write buffer */</div><div class='add'>+    uint64_t size;             /* Size of ring buffer */</div><div class='add'>+    uint64_t collected;        /* Number of samples we've collected */</div><div class='add'>+    uint64_t observed;         /* Number of FOPs we've observed */</div><div class='add'>+    ios_sample_t *ios_samples; /* Our list of samples */</div><div class='add'>+} ios_sample_buf_t;</div><div class='add'>+</div><div class='add'>+struct ios_lat {</div><div class='add'>+    double min;</div><div class='add'>+    double max;</div><div class='add'>+    double avg;</div><div class='add'>+    uint64_t total;</div><div class='add'>+};</div><div class='ctx'> </div><div class='ctx'> struct ios_global_stats {</div><div class='del'>-        uint64_t        data_written;</div><div class='del'>-        uint64_t        data_read;</div><div class='del'>-        uint64_t        block_count_write[32];</div><div class='del'>-        uint64_t        block_count_read[32];</div><div class='del'>-        uint64_t        fop_hits[GF_FOP_MAXVALUE];</div><div class='del'>-        struct timeval  started_at;</div><div class='add'>+    gf_atomic_t data_written;</div><div class='add'>+    gf_atomic_t data_read;</div><div class='add'>+    gf_atomic_t block_count_write[IOS_BLOCK_COUNT_SIZE];</div><div class='add'>+    gf_atomic_t block_count_read[IOS_BLOCK_COUNT_SIZE];</div><div class='add'>+    gf_atomic_t fop_hits[GF_FOP_MAXVALUE];</div><div class='add'>+    gf_atomic_t upcall_hits[GF_UPCALL_FLAGS_MAXVALUE];</div><div class='add'>+    time_t started_at;</div><div class='add'>+    struct ios_lat latency[GF_FOP_MAXVALUE];</div><div class='add'>+    uint64_t nr_opens;</div><div class='add'>+    uint64_t max_nr_opens;</div><div class='add'>+    struct timeval max_openfd_time;</div><div class='ctx'> };</div><div class='ctx'> </div><div class='add'>+typedef enum {</div><div class='add'>+    IOS_DUMP_TYPE_NONE = 0,</div><div class='add'>+    IOS_DUMP_TYPE_FILE = 1,</div><div class='add'>+    IOS_DUMP_TYPE_DICT = 2,</div><div class='add'>+    IOS_DUMP_TYPE_JSON_FILE = 3,</div><div class='add'>+    IOS_DUMP_TYPE_SAMPLES = 4,</div><div class='add'>+    IOS_DUMP_TYPE_MAX = 5</div><div class='add'>+} ios_dump_type_t;</div><div class='ctx'> </div><div class='ctx'> struct ios_conf {</div><div class='del'>-        gf_lock_t                 lock;</div><div class='del'>-        struct ios_global_stats   cumulative;</div><div class='del'>-        uint64_t                  increment;</div><div class='del'>-        struct ios_global_stats   incremental;</div><div class='del'>-        gf_boolean_t              dump_fd_stats;</div><div class='add'>+    gf_lock_t lock;</div><div class='add'>+    struct ios_global_stats cumulative;</div><div class='add'>+    uint64_t increment;</div><div class='add'>+    struct ios_global_stats incremental;</div><div class='add'>+    gf_boolean_t dump_fd_stats;</div><div class='add'>+    gf_boolean_t count_fop_hits;</div><div class='add'>+    gf_boolean_t measure_latency;</div><div class='add'>+    struct ios_stat_head list[IOS_STATS_TYPE_MAX];</div><div class='add'>+    struct ios_stat_head thru_list[IOS_STATS_THRU_MAX];</div><div class='add'>+    int32_t ios_dump_interval;</div><div class='add'>+    pthread_t dump_thread;</div><div class='add'>+    gf_boolean_t dump_thread_should_die;</div><div class='add'>+    gf_boolean_t dump_thread_running;</div><div class='add'>+    gf_lock_t ios_sampling_lock;</div><div class='add'>+    int32_t ios_sample_interval;</div><div class='add'>+    int32_t ios_sample_buf_size;</div><div class='add'>+    ios_sample_buf_t *ios_sample_buf;</div><div class='add'>+    struct dnscache *dnscache;</div><div class='add'>+    int32_t ios_dnscache_ttl_sec;</div><div class='add'>+    /*</div><div class='add'>+     * What we really need here is just a unique value to keep files</div><div class='add'>+     * created by this instance distinct from those created by any other.</div><div class='add'>+     * On the client side this isn't a problem, so we just use the</div><div class='add'>+     * translator name.  On the server side conflicts can occur, so the</div><div class='add'>+     * volfile-generation code automatically sets this (via an option)</div><div class='add'>+     * to be the brick path.</div><div class='add'>+     *</div><div class='add'>+     * NB While the *field* name has changed, it didn't seem worth changing</div><div class='add'>+     * all of the cases where "xlator_name" is used as a *variable* name.</div><div class='add'>+     */</div><div class='add'>+    char *unique_id;</div><div class='add'>+    ios_dump_type_t dump_format;</div><div class='ctx'> };</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> struct ios_fd {</div><div class='del'>-        char           *filename;</div><div class='del'>-        uint64_t        data_written;</div><div class='del'>-        uint64_t        data_read;</div><div class='del'>-        uint64_t        block_count_write[32];</div><div class='del'>-        uint64_t        block_count_read[32];</div><div class='del'>-        struct timeval  opened_at;</div><div class='add'>+    char *filename;</div><div class='add'>+    gf_atomic_t data_written;</div><div class='add'>+    gf_atomic_t data_read;</div><div class='add'>+    gf_atomic_t block_count_write[IOS_BLOCK_COUNT_SIZE];</div><div class='add'>+    gf_atomic_t block_count_read[IOS_BLOCK_COUNT_SIZE];</div><div class='add'>+    struct timeval opened_at;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct ios_dump_args {</div><div class='add'>+    ios_dump_type_t type;</div><div class='add'>+    union {</div><div class='add'>+        FILE *logfp;</div><div class='add'>+        dict_t *dict;</div><div class='add'>+    } u;</div><div class='ctx'> };</div><div class='ctx'> </div><div class='add'>+typedef int (*block_dump_func)(xlator_t *, struct ios_dump_args *, int, int,</div><div class='add'>+                               uint64_t);</div><div class='ctx'> </div><div class='ctx'> struct ios_local {</div><div class='del'>-        struct timeval  wind_at;</div><div class='del'>-        struct timeval  unwind_at;</div><div class='add'>+    struct timeval wind_at;</div><div class='add'>+    struct timeval unwind_at;</div><div class='ctx'> };</div><div class='ctx'> </div><div class='add'>+struct volume_options options[];</div><div class='ctx'> </div><div class='del'>-#define BUMP_FOP(op)                                                    \</div><div class='del'>-        do {                                                            \</div><div class='del'>-                struct ios_conf  *conf = NULL;                          \</div><div class='del'>-                                                                        \</div><div class='del'>-                conf = this-&gt;private;                                   \</div><div class='del'>-                LOCK (&amp;conf-&gt;lock);                                     \</div><div class='del'>-                {                                                       \</div><div class='del'>-                        conf-&gt;cumulative.fop_hits[GF_FOP_##op]++;       \</div><div class='del'>-                        conf-&gt;incremental.fop_hits[GF_FOP_##op]++;      \</div><div class='del'>-                }                                                       \</div><div class='del'>-                UNLOCK (&amp;conf-&gt;lock);                                   \</div><div class='del'>-        } while (0)</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-#define BUMP_READ(fd, len)                                              \</div><div class='del'>-        do {                                                            \</div><div class='del'>-                struct ios_conf  *conf = NULL;                          \</div><div class='del'>-                struct ios_fd    *iosfd = NULL;                         \</div><div class='del'>-                int               lb2 = 0;                              \</div><div class='del'>-                                                                        \</div><div class='del'>-                conf = this-&gt;private;                                   \</div><div class='del'>-                lb2 = log_base2 (len);                                  \</div><div class='del'>-                ios_fd_ctx_get (fd, this, &amp;iosfd);                      \</div><div class='del'>-                                                                        \</div><div class='del'>-                LOCK (&amp;conf-&gt;lock);                                     \</div><div class='del'>-                {                                                       \</div><div class='del'>-                        conf-&gt;cumulative.data_read += len;              \</div><div class='del'>-                        conf-&gt;incremental.data_read += len;             \</div><div class='del'>-                        conf-&gt;cumulative.block_count_read[lb2]++;       \</div><div class='del'>-                        conf-&gt;incremental.block_count_read[lb2]++;      \</div><div class='del'>-                                                                        \</div><div class='del'>-                        if (iosfd) {                                    \</div><div class='del'>-                                iosfd-&gt;data_read += len;                \</div><div class='del'>-                                iosfd-&gt;block_count_read[lb2]++;         \</div><div class='del'>-                        }                                               \</div><div class='del'>-                }                                                       \</div><div class='del'>-                UNLOCK (&amp;conf-&gt;lock);                                   \</div><div class='del'>-        } while (0)</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-#define BUMP_WRITE(fd, len)                                             \</div><div class='del'>-        do {                                                            \</div><div class='del'>-                struct ios_conf  *conf = NULL;                          \</div><div class='del'>-                struct ios_fd    *iosfd = NULL;                         \</div><div class='del'>-                int               lb2 = 0;                              \</div><div class='del'>-                                                                        \</div><div class='del'>-                conf = this-&gt;private;                                   \</div><div class='del'>-                lb2 = log_base2 (len);                                  \</div><div class='del'>-                ios_fd_ctx_get (fd, this, &amp;iosfd);                      \</div><div class='del'>-                                                                        \</div><div class='del'>-                LOCK (&amp;conf-&gt;lock);                                     \</div><div class='del'>-                {                                                       \</div><div class='del'>-                        conf-&gt;cumulative.data_written += len;           \</div><div class='del'>-                        conf-&gt;incremental.data_written += len;          \</div><div class='del'>-                        conf-&gt;cumulative.block_count_write[lb2]++;      \</div><div class='del'>-                        conf-&gt;incremental.block_count_write[lb2]++;     \</div><div class='del'>-                                                                        \</div><div class='del'>-                        if (iosfd) {                                    \</div><div class='del'>-                                iosfd-&gt;data_written += len;             \</div><div class='del'>-                                iosfd-&gt;block_count_write[lb2]++;        \</div><div class='del'>-                        }                                               \</div><div class='del'>-                }                                                       \</div><div class='del'>-                UNLOCK (&amp;conf-&gt;lock);                                   \</div><div class='del'>-        } while (0)</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-ios_fd_ctx_get (fd_t *fd, xlator_t *this, struct ios_fd **iosfd)</div><div class='del'>-{</div><div class='del'>-        uint64_t      iosfd64 = 0;</div><div class='del'>-        unsigned long iosfdlong = 0;</div><div class='del'>-        int           ret = 0;</div><div class='del'>-</div><div class='del'>-        ret = fd_ctx_get (fd, this, &amp;iosfd64);</div><div class='del'>-        iosfdlong = iosfd64;</div><div class='del'>-        if (ret != -1)</div><div class='del'>-                *iosfd = (void *) iosfdlong;</div><div class='del'>-</div><div class='del'>-        return ret;</div><div class='add'>+static int</div><div class='add'>+is_fop_latency_started(call_frame_t *frame)</div><div class='add'>+{</div><div class='add'>+    GF_ASSERT(frame);</div><div class='add'>+    struct timeval epoch = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    return memcmp(&amp;frame-&gt;begin, &amp;epoch, sizeof(epoch));</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+#define _IOS_SAMP_DIR DEFAULT_LOG_FILE_DIRECTORY "/samples"</div><div class='add'>+#ifdef GF_LINUX_HOST_OS</div><div class='add'>+#define _IOS_DUMP_DIR DATADIR "/lib/glusterd/stats"</div><div class='add'>+#else</div><div class='add'>+#define _IOS_DUMP_DIR DATADIR "/db/glusterd/stats"</div><div class='add'>+#endif</div><div class='ctx'> </div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-ios_fd_ctx_set (fd_t *fd, xlator_t *this, struct ios_fd *iosfd)</div><div class='add'>+#define END_FOP_LATENCY(frame, op)                                             \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        struct ios_conf *conf = NULL;                                          \</div><div class='add'>+                                                                               \</div><div class='add'>+        conf = this-&gt;private;                                                  \</div><div class='add'>+        if (conf &amp;&amp; conf-&gt;measure_latency) {                                   \</div><div class='add'>+            timespec_now(&amp;frame-&gt;end);                                         \</div><div class='add'>+            update_ios_latency(conf, frame, GF_FOP_##op);                      \</div><div class='add'>+        }                                                                      \</div><div class='add'>+    } while (0)</div><div class='add'>+</div><div class='add'>+#define START_FOP_LATENCY(frame)                                               \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        struct ios_conf *conf = NULL;                                          \</div><div class='add'>+                                                                               \</div><div class='add'>+        conf = this-&gt;private;                                                  \</div><div class='add'>+        if (conf &amp;&amp; conf-&gt;measure_latency) {                                   \</div><div class='add'>+            timespec_now(&amp;frame-&gt;begin);                                       \</div><div class='add'>+        } else {                                                               \</div><div class='add'>+            memset(&amp;frame-&gt;begin, 0, sizeof(frame-&gt;begin));                    \</div><div class='add'>+        }                                                                      \</div><div class='add'>+    } while (0)</div><div class='add'>+</div><div class='add'>+#define BUMP_FOP(op)                                                           \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        struct ios_conf *conf = NULL;                                          \</div><div class='add'>+                                                                               \</div><div class='add'>+        conf = this-&gt;private;                                                  \</div><div class='add'>+        if (!conf)                                                             \</div><div class='add'>+            break;                                                             \</div><div class='add'>+        GF_ATOMIC_INC(conf-&gt;cumulative.fop_hits[GF_FOP_##op]);                 \</div><div class='add'>+        GF_ATOMIC_INC(conf-&gt;incremental.fop_hits[GF_FOP_##op]);                \</div><div class='add'>+    } while (0)</div><div class='add'>+</div><div class='add'>+#define UPDATE_PROFILE_STATS(frame, op)                                        \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        struct ios_conf *conf = NULL;                                          \</div><div class='add'>+                                                                               \</div><div class='add'>+        if (!is_fop_latency_started(frame))                                    \</div><div class='add'>+            break;                                                             \</div><div class='add'>+        conf = this-&gt;private;                                                  \</div><div class='add'>+        if (conf &amp;&amp; conf-&gt;measure_latency &amp;&amp; conf-&gt;count_fop_hits) {           \</div><div class='add'>+            BUMP_FOP(op);                                                      \</div><div class='add'>+            timespec_now(&amp;frame-&gt;end);                                         \</div><div class='add'>+            update_ios_latency(conf, frame, GF_FOP_##op);                      \</div><div class='add'>+        }                                                                      \</div><div class='add'>+    } while (0)</div><div class='add'>+</div><div class='add'>+#define BUMP_THROUGHPUT(iosstat, type)                                         \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        struct ios_conf *conf = NULL;                                          \</div><div class='add'>+        double elapsed;                                                        \</div><div class='add'>+        struct timespec *begin, *end;                                          \</div><div class='add'>+        double throughput;                                                     \</div><div class='add'>+        int flag = 0;                                                          \</div><div class='add'>+        struct timeval tv = {                                                  \</div><div class='add'>+            0,                                                                 \</div><div class='add'>+        };                                                                     \</div><div class='add'>+                                                                               \</div><div class='add'>+        begin = &amp;frame-&gt;begin;                                                 \</div><div class='add'>+        end = &amp;frame-&gt;end;                                                     \</div><div class='add'>+                                                                               \</div><div class='add'>+        elapsed = gf_tsdiff(begin, end) / 1000.0;                              \</div><div class='add'>+        throughput = op_ret / elapsed;                                         \</div><div class='add'>+                                                                               \</div><div class='add'>+        conf = this-&gt;private;                                                  \</div><div class='add'>+        gettimeofday(&amp;tv, NULL);                                               \</div><div class='add'>+        LOCK(&amp;iosstat-&gt;lock);                                                  \</div><div class='add'>+        {                                                                      \</div><div class='add'>+            if (iosstat-&gt;thru_counters[type].throughput &lt;= throughput) {       \</div><div class='add'>+                iosstat-&gt;thru_counters[type].throughput = throughput;          \</div><div class='add'>+                memcpy(&amp;iosstat-&gt;thru_counters[type].time, &amp;tv,                \</div><div class='add'>+                       sizeof(struct timeval));                                \</div><div class='add'>+                flag = 1;                                                      \</div><div class='add'>+            }                                                                  \</div><div class='add'>+        }                                                                      \</div><div class='add'>+        UNLOCK(&amp;iosstat-&gt;lock);                                                \</div><div class='add'>+        if (flag)                                                              \</div><div class='add'>+            ios_stat_add_to_list(&amp;conf-&gt;thru_list[type], throughput, iosstat); \</div><div class='add'>+    } while (0)</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+ios_fd_ctx_get(fd_t *fd, xlator_t *this, struct ios_fd **iosfd)</div><div class='ctx'> {</div><div class='del'>-        uint64_t   iosfd64 = 0;</div><div class='del'>-        int        ret = 0;</div><div class='add'>+    uint64_t iosfd64 = 0;</div><div class='add'>+    unsigned long iosfdlong = 0;</div><div class='add'>+    int ret = 0;</div><div class='ctx'> </div><div class='del'>-        iosfd64 = (unsigned long) iosfd;</div><div class='del'>-        ret = fd_ctx_set (fd, this, iosfd64);</div><div class='add'>+    ret = fd_ctx_get(fd, this, &amp;iosfd64);</div><div class='add'>+    iosfdlong = iosfd64;</div><div class='add'>+    if (ret != -1)</div><div class='add'>+        *iosfd = (void *)iosfdlong;</div><div class='ctx'> </div><div class='del'>-        return ret;</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+static int</div><div class='add'>+ios_fd_ctx_set(fd_t *fd, xlator_t *this, struct ios_fd *iosfd)</div><div class='add'>+{</div><div class='add'>+    uint64_t iosfd64 = 0;</div><div class='add'>+    int ret = 0;</div><div class='ctx'> </div><div class='del'>-#define ios_log(this, logfp, fmt ...)                           \</div><div class='del'>-        do {                                                    \</div><div class='del'>-                if (logfp) {                                    \</div><div class='del'>-                        fprintf (logfp, fmt);                   \</div><div class='del'>-                        fprintf (logfp, "\n");                  \</div><div class='del'>-                }                                               \</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_NORMAL, fmt);        \</div><div class='del'>-        } while (0)</div><div class='add'>+    iosfd64 = (unsigned long)iosfd;</div><div class='add'>+    ret = fd_ctx_set(fd, this, iosfd64);</div><div class='ctx'> </div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-io_stats_dump_global (xlator_t *this, struct ios_global_stats *stats,</div><div class='del'>-                      struct timeval *now, int interval, FILE *logfp)</div><div class='add'>+static int</div><div class='add'>+ios_stat_ref(struct ios_stat *iosstat)</div><div class='ctx'> {</div><div class='del'>-        int    i = 0;</div><div class='add'>+    uint64_t refcnt = 0;</div><div class='add'>+    refcnt = GF_ATOMIC_INC(iosstat-&gt;refcnt);</div><div class='ctx'> </div><div class='del'>-        if (interval == -1)</div><div class='del'>-                ios_log (this, logfp, "=== Cumulative stats ===");</div><div class='del'>-        else</div><div class='del'>-                ios_log (this, logfp, "=== Interval %d stats ===",</div><div class='del'>-                         interval);</div><div class='del'>-        ios_log (this, logfp, "      Duration : %"PRId64"secs",</div><div class='del'>-                 (uint64_t) (now-&gt;tv_sec - stats-&gt;started_at.tv_sec));</div><div class='del'>-        ios_log (this, logfp, "     BytesRead : %"PRId64,</div><div class='del'>-                 stats-&gt;data_read);</div><div class='del'>-        ios_log (this, logfp, "  BytesWritten : %"PRId64,</div><div class='del'>-                 stats-&gt;data_written);</div><div class='del'>-</div><div class='del'>-        for (i = 0; i &lt; 32; i++) {</div><div class='del'>-                if (stats-&gt;block_count_read[i])</div><div class='del'>-                        ios_log (this, logfp, " Read %06db+ : %"PRId64,</div><div class='del'>-                                 (1 &lt;&lt; i), stats-&gt;block_count_read[i]);</div><div class='del'>-        }</div><div class='add'>+    return refcnt;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        for (i = 0; i &lt; 32; i++) {</div><div class='del'>-                if (stats-&gt;block_count_write[i])</div><div class='del'>-                        ios_log (this, logfp, "Write %06db+ : %"PRId64,</div><div class='del'>-                                 (1 &lt;&lt; i), stats-&gt;block_count_write[i]);</div><div class='add'>+static int</div><div class='add'>+ios_stat_unref(struct ios_stat *iosstat)</div><div class='add'>+{</div><div class='add'>+    int cleanup = 0;</div><div class='add'>+    uint64_t refcnt = 0;</div><div class='add'>+</div><div class='add'>+    refcnt = GF_ATOMIC_DEC(iosstat-&gt;refcnt);</div><div class='add'>+    if (refcnt == 0) {</div><div class='add'>+        if (iosstat-&gt;filename) {</div><div class='add'>+            GF_FREE(iosstat-&gt;filename);</div><div class='add'>+            iosstat-&gt;filename = NULL;</div><div class='ctx'>         }</div><div class='add'>+        cleanup = 1;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        for (i = 0; i &lt; GF_FOP_MAXVALUE; i++)</div><div class='del'>-                if (stats-&gt;fop_hits[i])</div><div class='del'>-                        ios_log (this, logfp, "%14s : %"PRId64,</div><div class='del'>-                                 gf_fop_list[i], stats-&gt;fop_hits[i]);</div><div class='add'>+    if (cleanup) {</div><div class='add'>+        LOCK_DESTROY(&amp;iosstat-&gt;lock);</div><div class='add'>+        GF_FREE(iosstat);</div><div class='add'>+        iosstat = NULL;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        return 0;</div><div class='add'>+static int</div><div class='add'>+ios_stat_add_to_list(struct ios_stat_head *list_head, uint64_t value,</div><div class='add'>+                     struct ios_stat *iosstat)</div><div class='add'>+{</div><div class='add'>+    struct ios_stat_list *new = NULL;</div><div class='add'>+    struct ios_stat_list *entry = NULL;</div><div class='add'>+    struct ios_stat_list *t = NULL;</div><div class='add'>+    struct ios_stat_list *list_entry = NULL;</div><div class='add'>+    struct ios_stat_list *tmp = NULL;</div><div class='add'>+    struct ios_stat_list *last = NULL;</div><div class='add'>+    struct ios_stat *stat = NULL;</div><div class='add'>+    int cnt = 0;</div><div class='add'>+    int found = 0;</div><div class='add'>+    int reposition = 0;</div><div class='add'>+    double min_count = 0;</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;list_head-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        if (list_head-&gt;min_cnt == 0)</div><div class='add'>+            list_head-&gt;min_cnt = value;</div><div class='add'>+        if ((list_head-&gt;members == MAX_LIST_MEMBERS) &amp;&amp;</div><div class='add'>+            (list_head-&gt;min_cnt &gt; value))</div><div class='add'>+            goto out;</div><div class='add'>+</div><div class='add'>+        list_for_each_entry_safe(entry, t, &amp;list_head-&gt;iosstats-&gt;list, list)</div><div class='add'>+        {</div><div class='add'>+            cnt++;</div><div class='add'>+            if (cnt == list_head-&gt;members)</div><div class='add'>+                last = entry;</div><div class='add'>+</div><div class='add'>+            if (!gf_uuid_compare(iosstat-&gt;gfid, entry-&gt;iosstat-&gt;gfid)) {</div><div class='add'>+                list_entry = entry;</div><div class='add'>+                found = cnt;</div><div class='add'>+                entry-&gt;value = value;</div><div class='add'>+                if (!reposition) {</div><div class='add'>+                    if (cnt == list_head-&gt;members)</div><div class='add'>+                        list_head-&gt;min_cnt = value;</div><div class='add'>+                    goto out;</div><div class='add'>+                }</div><div class='add'>+                break;</div><div class='add'>+            } else if (entry-&gt;value &lt;= value &amp;&amp; !reposition) {</div><div class='add'>+                reposition = cnt;</div><div class='add'>+                tmp = entry;</div><div class='add'>+                if (cnt == list_head-&gt;members - 1)</div><div class='add'>+                    min_count = entry-&gt;value;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+        if (found) {</div><div class='add'>+            list_del(&amp;list_entry-&gt;list);</div><div class='add'>+            list_add_tail(&amp;list_entry-&gt;list, &amp;tmp-&gt;list);</div><div class='add'>+            if (min_count)</div><div class='add'>+                list_head-&gt;min_cnt = min_count;</div><div class='add'>+            goto out;</div><div class='add'>+        } else if (list_head-&gt;members == MAX_LIST_MEMBERS &amp;&amp; reposition) {</div><div class='add'>+            new = GF_CALLOC(1, sizeof(*new), gf_io_stats_mt_ios_stat_list);</div><div class='add'>+            new-&gt;iosstat = iosstat;</div><div class='add'>+            new-&gt;value = value;</div><div class='add'>+            ios_stat_ref(iosstat);</div><div class='add'>+            list_add_tail(&amp;new-&gt;list, &amp;tmp-&gt;list);</div><div class='add'>+            if (last) {</div><div class='add'>+                stat = last-&gt;iosstat;</div><div class='add'>+                last-&gt;iosstat = NULL;</div><div class='add'>+                ios_stat_unref(stat);</div><div class='add'>+                list_del(&amp;last-&gt;list);</div><div class='add'>+                GF_FREE(last);</div><div class='add'>+            }</div><div class='add'>+            if (reposition == MAX_LIST_MEMBERS)</div><div class='add'>+                list_head-&gt;min_cnt = value;</div><div class='add'>+            else if (min_count) {</div><div class='add'>+                list_head-&gt;min_cnt = min_count;</div><div class='add'>+            }</div><div class='add'>+        } else if (list_head-&gt;members &lt; MAX_LIST_MEMBERS) {</div><div class='add'>+            new = GF_CALLOC(1, sizeof(*new), gf_io_stats_mt_ios_stat_list);</div><div class='add'>+            new-&gt;iosstat = iosstat;</div><div class='add'>+            new-&gt;value = value;</div><div class='add'>+            ios_stat_ref(iosstat);</div><div class='add'>+            if (reposition) {</div><div class='add'>+                list_add_tail(&amp;new-&gt;list, &amp;tmp-&gt;list);</div><div class='add'>+            } else {</div><div class='add'>+                list_add_tail(&amp;new-&gt;list, &amp;entry-&gt;list);</div><div class='add'>+            }</div><div class='add'>+            list_head-&gt;members++;</div><div class='add'>+            if (list_head-&gt;min_cnt &gt; value)</div><div class='add'>+                list_head-&gt;min_cnt = value;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+out:</div><div class='add'>+    UNLOCK(&amp;list_head-&gt;lock);</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+static void</div><div class='add'>+ios_bump_read(xlator_t *this, fd_t *fd, size_t len)</div><div class='add'>+{</div><div class='add'>+    struct ios_conf *conf = NULL;</div><div class='add'>+    struct ios_fd *iosfd = NULL;</div><div class='add'>+    int lb2 = 0;</div><div class='add'>+</div><div class='add'>+    conf = this-&gt;private;</div><div class='add'>+    lb2 = log_base2(len);</div><div class='add'>+    ios_fd_ctx_get(fd, this, &amp;iosfd);</div><div class='add'>+    if (!conf)</div><div class='add'>+        return;</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-io_stats_dump (xlator_t *this, char *filename, inode_t *inode,</div><div class='del'>-               const char *path)</div><div class='add'>+    GF_ATOMIC_ADD(conf-&gt;cumulative.data_read, len);</div><div class='add'>+    GF_ATOMIC_ADD(conf-&gt;incremental.data_read, len);</div><div class='add'>+    GF_ATOMIC_INC(conf-&gt;cumulative.block_count_read[lb2]);</div><div class='add'>+    GF_ATOMIC_INC(conf-&gt;incremental.block_count_read[lb2]);</div><div class='add'>+</div><div class='add'>+    if (iosfd) {</div><div class='add'>+        GF_ATOMIC_ADD(iosfd-&gt;data_read, len);</div><div class='add'>+        GF_ATOMIC_INC(iosfd-&gt;block_count_read[lb2]);</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+ios_bump_write(xlator_t *this, fd_t *fd, size_t len)</div><div class='ctx'> {</div><div class='del'>-        struct ios_conf         *conf = NULL;</div><div class='del'>-        struct ios_global_stats  cumulative = {0, };</div><div class='del'>-        struct ios_global_stats  incremental = {0, };</div><div class='del'>-        int                      increment = 0;</div><div class='del'>-        struct timeval           now;</div><div class='del'>-        FILE                    *logfp = NULL;</div><div class='add'>+    struct ios_conf *conf = NULL;</div><div class='add'>+    struct ios_fd *iosfd = NULL;</div><div class='add'>+    int lb2 = 0;</div><div class='add'>+</div><div class='add'>+    conf = this-&gt;private;</div><div class='add'>+    lb2 = log_base2(len);</div><div class='add'>+    ios_fd_ctx_get(fd, this, &amp;iosfd);</div><div class='add'>+    if (!conf)</div><div class='add'>+        return;</div><div class='ctx'> </div><div class='del'>-        conf = this-&gt;private;</div><div class='add'>+    GF_ATOMIC_ADD(conf-&gt;cumulative.data_written, len);</div><div class='add'>+    GF_ATOMIC_ADD(conf-&gt;incremental.data_written, len);</div><div class='add'>+    GF_ATOMIC_INC(conf-&gt;cumulative.block_count_write[lb2]);</div><div class='add'>+    GF_ATOMIC_INC(conf-&gt;incremental.block_count_write[lb2]);</div><div class='ctx'> </div><div class='del'>-        gettimeofday (&amp;now, NULL);</div><div class='del'>-        LOCK (&amp;conf-&gt;lock);</div><div class='del'>-        {</div><div class='del'>-                cumulative  = conf-&gt;cumulative;</div><div class='del'>-                incremental = conf-&gt;incremental;</div><div class='add'>+    if (iosfd) {</div><div class='add'>+        GF_ATOMIC_ADD(iosfd-&gt;data_written, len);</div><div class='add'>+        GF_ATOMIC_INC(iosfd-&gt;block_count_write[lb2]);</div><div class='add'>+    }</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-                increment = conf-&gt;increment++;</div><div class='add'>+static void</div><div class='add'>+ios_bump_upcall(xlator_t *this, gf_upcall_flags_t event)</div><div class='add'>+{</div><div class='add'>+    struct ios_conf *conf = NULL;</div><div class='ctx'> </div><div class='del'>-                memset (&amp;conf-&gt;incremental, 0, sizeof (conf-&gt;incremental));</div><div class='del'>-                conf-&gt;incremental.started_at = now;</div><div class='del'>-        }</div><div class='del'>-        UNLOCK (&amp;conf-&gt;lock);</div><div class='add'>+    conf = this-&gt;private;</div><div class='add'>+    if (!conf)</div><div class='add'>+        return;</div><div class='add'>+    if (conf-&gt;count_fop_hits) {</div><div class='add'>+        GF_ATOMIC_INC(conf-&gt;cumulative.upcall_hits[event]);</div><div class='add'>+        GF_ATOMIC_INC(conf-&gt;incremental.upcall_hits[event]);</div><div class='add'>+    }</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        logfp = fopen (filename, "w+");</div><div class='del'>-        io_stats_dump_global (this, &amp;cumulative, &amp;now, -1, logfp);</div><div class='del'>-        io_stats_dump_global (this, &amp;incremental, &amp;now, increment, logfp);</div><div class='add'>+static void</div><div class='add'>+ios_bump_stats(xlator_t *this, struct ios_stat *iosstat, ios_stats_type_t type)</div><div class='add'>+{</div><div class='add'>+    struct ios_conf *conf = NULL;</div><div class='add'>+    uint64_t value = 0;</div><div class='ctx'> </div><div class='del'>-        if (logfp)</div><div class='del'>-                fclose (logfp);</div><div class='del'>-        return 0;</div><div class='add'>+    conf = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    value = GF_ATOMIC_INC(iosstat-&gt;counters[type]);</div><div class='add'>+    ios_stat_add_to_list(&amp;conf-&gt;list[type], value, iosstat);</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+int</div><div class='add'>+ios_inode_ctx_set(inode_t *inode, xlator_t *this, struct ios_stat *iosstat)</div><div class='add'>+{</div><div class='add'>+    uint64_t iosstat64 = 0;</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    ios_stat_ref(iosstat);</div><div class='add'>+    iosstat64 = (unsigned long)iosstat;</div><div class='add'>+    ret = inode_ctx_put(inode, this, iosstat64);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-io_stats_dump_fd (xlator_t *this, struct ios_fd *iosfd)</div><div class='add'>+ios_inode_ctx_get(inode_t *inode, xlator_t *this, struct ios_stat **iosstat)</div><div class='ctx'> {</div><div class='del'>-        struct ios_conf         *conf = NULL;</div><div class='del'>-        struct timeval           now;</div><div class='del'>-        uint64_t                 sec = 0;</div><div class='del'>-        uint64_t                 usec = 0;</div><div class='del'>-        int                      i = 0;</div><div class='add'>+    uint64_t iosstat64 = 0;</div><div class='add'>+    unsigned long iosstatlong = 0;</div><div class='add'>+    int ret = 0;</div><div class='ctx'> </div><div class='del'>-        conf = this-&gt;private;</div><div class='add'>+    ret = inode_ctx_get(inode, this, &amp;iosstat64);</div><div class='add'>+    iosstatlong = iosstat64;</div><div class='add'>+    if (ret != -1)</div><div class='add'>+        *iosstat = (void *)iosstatlong;</div><div class='ctx'> </div><div class='del'>-        if (!conf-&gt;dump_fd_stats)</div><div class='del'>-                return 0;</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        if (!iosfd)</div><div class='del'>-                return 0;</div><div class='add'>+/*</div><div class='add'>+ * So why goto all this trouble?  Why not just queue up some samples in</div><div class='add'>+ * a big list and malloc away?  Well malloc is expensive relative</div><div class='add'>+ * to what we are measuring, so cannot have any malloc's (or worse</div><div class='add'>+ * callocs) in our measurement code paths.  Instead, we are going to</div><div class='add'>+ * pre-allocate a circular buffer and collect a maximum number of samples.</div><div class='add'>+ * Prior to dumping them all we'll create a new buffer and swap the</div><div class='add'>+ * old buffer with the new, and then proceed to dump the statistics</div><div class='add'>+ * in our dump thread.</div><div class='add'>+ *</div><div class='add'>+ */</div><div class='add'>+ios_sample_buf_t *</div><div class='add'>+ios_create_sample_buf(size_t buf_size)</div><div class='add'>+{</div><div class='add'>+    ios_sample_buf_t *ios_sample_buf = NULL;</div><div class='add'>+    ios_sample_t *ios_samples = NULL;</div><div class='add'>+</div><div class='add'>+    ios_sample_buf = GF_CALLOC(1, sizeof(*ios_sample_buf),</div><div class='add'>+                               gf_io_stats_mt_ios_sample_buf);</div><div class='add'>+    if (!ios_sample_buf)</div><div class='add'>+        goto err;</div><div class='add'>+</div><div class='add'>+    ios_samples = GF_CALLOC(buf_size, sizeof(*ios_samples),</div><div class='add'>+                            gf_io_stats_mt_ios_sample);</div><div class='add'>+</div><div class='add'>+    if (!ios_samples)</div><div class='add'>+        goto err;</div><div class='add'>+</div><div class='add'>+    ios_sample_buf-&gt;ios_samples = ios_samples;</div><div class='add'>+    ios_sample_buf-&gt;size = buf_size;</div><div class='add'>+    ios_sample_buf-&gt;pos = 0;</div><div class='add'>+    ios_sample_buf-&gt;observed = 0;</div><div class='add'>+    ios_sample_buf-&gt;collected = 0;</div><div class='add'>+</div><div class='add'>+    return ios_sample_buf;</div><div class='add'>+err:</div><div class='add'>+    GF_FREE(ios_sample_buf);</div><div class='add'>+    return NULL;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        gettimeofday (&amp;now, NULL);</div><div class='add'>+void</div><div class='add'>+ios_destroy_sample_buf(ios_sample_buf_t *ios_sample_buf)</div><div class='add'>+{</div><div class='add'>+    GF_FREE(ios_sample_buf-&gt;ios_samples);</div><div class='add'>+    GF_FREE(ios_sample_buf);</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        if (iosfd-&gt;opened_at.tv_usec &gt; now.tv_usec) {</div><div class='del'>-                now.tv_usec += 1000000;</div><div class='del'>-                now.tv_usec--;</div><div class='del'>-        }</div><div class='add'>+static int</div><div class='add'>+ios_init_sample_buf(struct ios_conf *conf)</div><div class='add'>+{</div><div class='add'>+    int32_t ret = -1;</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(conf);</div><div class='add'>+    LOCK(&amp;conf-&gt;lock);</div><div class='add'>+    conf-&gt;ios_sample_buf = ios_create_sample_buf(conf-&gt;ios_sample_buf_size);</div><div class='add'>+    if (!conf-&gt;ios_sample_buf)</div><div class='add'>+        goto out;</div><div class='add'>+    ret = 0;</div><div class='add'>+out:</div><div class='add'>+    UNLOCK(&amp;conf-&gt;lock);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        sec = now.tv_sec - iosfd-&gt;opened_at.tv_sec;</div><div class='del'>-        usec = now.tv_usec - iosfd-&gt;opened_at.tv_usec;</div><div class='del'>-</div><div class='del'>-        gf_log (this-&gt;name, GF_LOG_NORMAL,</div><div class='del'>-                "--- fd stats ---");</div><div class='del'>-</div><div class='del'>-        if (iosfd-&gt;filename)</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_NORMAL,</div><div class='del'>-                        "      Filename : %s",</div><div class='del'>-                        iosfd-&gt;filename);</div><div class='del'>-</div><div class='del'>-        if (sec)</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_NORMAL,</div><div class='del'>-                        "      Lifetime : %"PRId64"secs, %"PRId64"usecs",</div><div class='del'>-                        sec, usec);</div><div class='del'>-</div><div class='del'>-        if (iosfd-&gt;data_read)</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_NORMAL,</div><div class='del'>-                        "     BytesRead : %"PRId64" bytes",</div><div class='del'>-                        iosfd-&gt;data_read);</div><div class='del'>-</div><div class='del'>-        if (iosfd-&gt;data_written)</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_NORMAL,</div><div class='del'>-                        "  BytesWritten : %"PRId64" bytes",</div><div class='del'>-                        iosfd-&gt;data_written);</div><div class='del'>-</div><div class='del'>-        for (i = 0; i &lt; 32; i++) {</div><div class='del'>-                if (iosfd-&gt;block_count_read[i])</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_NORMAL,</div><div class='del'>-                                " Read %06db+ : %"PRId64,</div><div class='del'>-                                (1 &lt;&lt; i), iosfd-&gt;block_count_read[i]);</div><div class='del'>-        }</div><div class='del'>-        for (i = 0; i &lt; 32; i++) {</div><div class='del'>-                if (iosfd-&gt;block_count_write[i])</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_NORMAL,</div><div class='del'>-                                "Write %06db+ : %"PRId64,</div><div class='del'>-                                (1 &lt;&lt; i), iosfd-&gt;block_count_write[i]);</div><div class='del'>-        }</div><div class='add'>+static int</div><div class='add'>+ios_stats_cleanup(xlator_t *this, inode_t *inode)</div><div class='add'>+{</div><div class='add'>+    struct ios_stat *iosstat = NULL;</div><div class='add'>+    uint64_t iosstat64 = 0;</div><div class='add'>+</div><div class='add'>+    inode_ctx_del(inode, this, &amp;iosstat64);</div><div class='add'>+    if (!iosstat64) {</div><div class='add'>+        gf_log(this-&gt;name, GF_LOG_WARNING, "could not get inode ctx");</div><div class='ctx'>         return 0;</div><div class='add'>+    }</div><div class='add'>+    iosstat = (void *)(long)iosstat64;</div><div class='add'>+    if (iosstat) {</div><div class='add'>+        ios_stat_unref(iosstat);</div><div class='add'>+    }</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+#define ios_log(this, logfp, fmt...)                                           \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        if (logfp) {                                                           \</div><div class='add'>+            fprintf(logfp, fmt);                                               \</div><div class='add'>+            fprintf(logfp, "\n");                                              \</div><div class='add'>+        }                                                                      \</div><div class='add'>+        gf_log(this-&gt;name, GF_LOG_DEBUG, fmt);                                 \</div><div class='add'>+    } while (0)</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-io_stats_create_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-                     int32_t op_ret, int32_t op_errno, fd_t *fd,</div><div class='del'>-                     inode_t *inode, struct iatt *buf,</div><div class='del'>-                     struct iatt *preparent, struct iatt *postparent)</div><div class='add'>+ios_dump_file_stats(struct ios_stat_head *list_head, xlator_t *this,</div><div class='add'>+                    FILE *logfp)</div><div class='ctx'> {</div><div class='del'>-        struct ios_fd *iosfd = NULL;</div><div class='del'>-        char          *path = NULL;</div><div class='add'>+    struct ios_stat_list *entry = NULL;</div><div class='ctx'> </div><div class='del'>-        path = frame-&gt;local;</div><div class='del'>-        frame-&gt;local = NULL;</div><div class='add'>+    LOCK(&amp;list_head-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        list_for_each_entry(entry, &amp;list_head-&gt;iosstats-&gt;list, list)</div><div class='add'>+        {</div><div class='add'>+            ios_log(this, logfp, "%-12.0f %s", entry-&gt;value,</div><div class='add'>+                    entry-&gt;iosstat-&gt;filename);</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    UNLOCK(&amp;list_head-&gt;lock);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        if (!path)</div><div class='del'>-                goto unwind;</div><div class='add'>+int</div><div class='add'>+ios_dump_throughput_stats(struct ios_stat_head *list_head, xlator_t *this,</div><div class='add'>+                          FILE *logfp, ios_stats_thru_t type)</div><div class='add'>+{</div><div class='add'>+    struct ios_stat_list *entry = NULL;</div><div class='add'>+    char timestr[GF_TIMESTR_SIZE] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;list_head-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        list_for_each_entry(entry, &amp;list_head-&gt;iosstats-&gt;list, list)</div><div class='add'>+        {</div><div class='add'>+            gf_time_fmt_tv(timestr, sizeof timestr,</div><div class='add'>+                           &amp;entry-&gt;iosstat-&gt;thru_counters[type].time,</div><div class='add'>+                           gf_timefmt_FT);</div><div class='add'>+</div><div class='add'>+            ios_log(this, logfp, "%s \t %-10.2f  \t  %s", timestr, entry-&gt;value,</div><div class='add'>+                    entry-&gt;iosstat-&gt;filename);</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    UNLOCK(&amp;list_head-&gt;lock);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+_io_stats_get_key_prefix(xlator_t *this, char **key_prefix)</div><div class='add'>+{</div><div class='add'>+    char *key_root = "gluster";</div><div class='add'>+    char *xlator_name = NULL;</div><div class='add'>+    char *instance_name = NULL;</div><div class='add'>+    size_t key_len = 0;</div><div class='add'>+    int bytes_written = 0;</div><div class='add'>+    int i = 0;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    struct ios_conf *conf = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    xlator_name = strdupa(conf-&gt;unique_id);</div><div class='add'>+    for (i = 0; i &lt; strlen(xlator_name); i++) {</div><div class='add'>+        if (xlator_name[i] == '/')</div><div class='add'>+            xlator_name[i] = '_';</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    instance_name = this-&gt;instance_name;</div><div class='add'>+    if (this-&gt;name &amp;&amp; strcmp(this-&gt;name, "glustershd") == 0) {</div><div class='add'>+        xlator_name = "shd";</div><div class='add'>+    } else if (this-&gt;prev &amp;&amp; strcmp(this-&gt;prev-&gt;name, "nfs-server") == 0) {</div><div class='add'>+        xlator_name = "nfsd";</div><div class='add'>+        if (this-&gt;prev-&gt;instance_name)</div><div class='add'>+            instance_name = strdupa(this-&gt;prev-&gt;instance_name);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (strcmp(__progname, "glusterfsd") == 0)</div><div class='add'>+        key_root = "gluster.brick";</div><div class='add'>+</div><div class='add'>+    if (instance_name) {</div><div class='add'>+        /* +3 for 2 x "." + NULL */</div><div class='add'>+        key_len = strlen(key_root) + strlen(xlator_name) +</div><div class='add'>+                  strlen(instance_name) + 3;</div><div class='add'>+        *key_prefix = GF_CALLOC(key_len, sizeof(char), gf_common_mt_char);</div><div class='add'>+        if (!*key_prefix) {</div><div class='add'>+            ret = -ENOMEM;</div><div class='add'>+            goto err;</div><div class='add'>+        }</div><div class='add'>+        bytes_written = snprintf(*key_prefix, key_len, "%s.%s.%s", key_root,</div><div class='add'>+                                 xlator_name, instance_name);</div><div class='add'>+        if (bytes_written != key_len - 1) {</div><div class='add'>+            ret = -EINVAL;</div><div class='add'>+            goto err;</div><div class='add'>+        }</div><div class='add'>+    } else {</div><div class='add'>+        /* +2 for 1 x "." + NULL */</div><div class='add'>+        key_len = strlen(key_root) + strlen(xlator_name) + 2;</div><div class='add'>+        *key_prefix = GF_CALLOC(key_len, sizeof(char), gf_common_mt_char);</div><div class='add'>+        if (!*key_prefix) {</div><div class='add'>+            ret = -ENOMEM;</div><div class='add'>+            goto err;</div><div class='add'>+        }</div><div class='add'>+        bytes_written = snprintf(*key_prefix, key_len, "%s.%s", key_root,</div><div class='add'>+                                 xlator_name);</div><div class='add'>+        if (bytes_written != key_len - 1) {</div><div class='add'>+            ret = -EINVAL;</div><div class='add'>+            goto err;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    return 0;</div><div class='add'>+err:</div><div class='add'>+    GF_FREE(*key_prefix);</div><div class='add'>+    *key_prefix = NULL;</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        if (op_ret &lt; 0) {</div><div class='del'>-                GF_FREE (path);</div><div class='del'>-                goto unwind;</div><div class='add'>+int</div><div class='add'>+io_stats_dump_global_to_json_logfp(xlator_t *this,</div><div class='add'>+                                   struct ios_global_stats *stats, time_t now,</div><div class='add'>+                                   int interval, FILE *logfp)</div><div class='add'>+{</div><div class='add'>+    int i = 0;</div><div class='add'>+    int j = 0;</div><div class='add'>+    struct ios_conf *conf = NULL;</div><div class='add'>+    char *key_prefix = NULL;</div><div class='add'>+    char *str_prefix = NULL;</div><div class='add'>+    char *lc_fop_name = NULL;</div><div class='add'>+    int ret = 1; /* Default to error */</div><div class='add'>+    int rw_size;</div><div class='add'>+    char *rw_unit = NULL;</div><div class='add'>+    uint64_t fop_hits;</div><div class='add'>+    float fop_lat_ave;</div><div class='add'>+    float fop_lat_min;</div><div class='add'>+    float fop_lat_max;</div><div class='add'>+    double interval_sec;</div><div class='add'>+    double fop_ave_usec = 0.0;</div><div class='add'>+    double fop_ave_usec_sum = 0.0;</div><div class='add'>+    double weighted_fop_ave_usec = 0.0;</div><div class='add'>+    double weighted_fop_ave_usec_sum = 0.0;</div><div class='add'>+    long total_fop_hits = 0;</div><div class='add'>+    loc_t unused_loc = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    dict_t *xattr = NULL;</div><div class='add'>+</div><div class='add'>+    interval_sec = (double)(now - stats-&gt;started_at);</div><div class='add'>+</div><div class='add'>+    conf = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    ret = _io_stats_get_key_prefix(this, &amp;key_prefix);</div><div class='add'>+    if (ret) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (interval == -1) {</div><div class='add'>+        str_prefix = "aggr";</div><div class='add'>+</div><div class='add'>+    } else {</div><div class='add'>+        str_prefix = "inter";</div><div class='add'>+    }</div><div class='add'>+    ios_log(this, logfp, "{");</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; 31; i++) {</div><div class='add'>+        rw_size = (1 &lt;&lt; i);</div><div class='add'>+        if (rw_size &gt;= 1024 * 1024) {</div><div class='add'>+            rw_size = rw_size / (1024 * 1024);</div><div class='add'>+            rw_unit = "mb";</div><div class='add'>+        } else if (rw_size &gt;= 1024) {</div><div class='add'>+            rw_size = rw_size / 1024;</div><div class='add'>+            rw_unit = "kb";</div><div class='add'>+        } else {</div><div class='add'>+            rw_unit = "b";</div><div class='ctx'>         }</div><div class='ctx'> </div><div class='del'>-        iosfd = GF_CALLOC (1, sizeof (*iosfd), gf_io_stats_mt_ios_fd);</div><div class='del'>-        if (!iosfd) {</div><div class='del'>-                GF_FREE (path);</div><div class='del'>-                goto unwind;</div><div class='add'>+        if (interval == -1) {</div><div class='add'>+            ios_log(this, logfp, "\"%s.%s.read_%d%s\": %" GF_PRI_ATOMIC ",",</div><div class='add'>+                    key_prefix, str_prefix, rw_size, rw_unit,</div><div class='add'>+                    GF_ATOMIC_GET(stats-&gt;block_count_read[i]));</div><div class='add'>+            ios_log(this, logfp, "\"%s.%s.write_%d%s\": %" GF_PRI_ATOMIC ",",</div><div class='add'>+                    key_prefix, str_prefix, rw_size, rw_unit,</div><div class='add'>+                    GF_ATOMIC_GET(stats-&gt;block_count_write[i]));</div><div class='add'>+        } else {</div><div class='add'>+            ios_log(this, logfp, "\"%s.%s.read_%d%s_per_sec\": %0.2lf,",</div><div class='add'>+                    key_prefix, str_prefix, rw_size, rw_unit,</div><div class='add'>+                    (double)(GF_ATOMIC_GET(stats-&gt;block_count_read[i]) /</div><div class='add'>+                             interval_sec));</div><div class='add'>+            ios_log(this, logfp, "\"%s.%s.write_%d%s_per_sec\": %0.2lf,",</div><div class='add'>+                    key_prefix, str_prefix, rw_size, rw_unit,</div><div class='add'>+                    (double)(GF_ATOMIC_GET(stats-&gt;block_count_write[i]) /</div><div class='add'>+                             interval_sec));</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (interval == -1) {</div><div class='add'>+        ios_log(this, logfp, "\"%s.%s.fds.open_count\": %" PRId64 ",",</div><div class='add'>+                key_prefix, str_prefix, conf-&gt;cumulative.nr_opens);</div><div class='add'>+        ios_log(this, logfp, "\"%s.%s.fds.max_open_count\": %" PRId64 ",",</div><div class='add'>+                key_prefix, str_prefix, conf-&gt;cumulative.max_nr_opens);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; GF_FOP_MAXVALUE; i++) {</div><div class='add'>+        lc_fop_name = strdupa(gf_fop_list[i]);</div><div class='add'>+        for (j = 0; lc_fop_name[j]; j++) {</div><div class='add'>+            lc_fop_name[j] = tolower(lc_fop_name[j]);</div><div class='ctx'>         }</div><div class='ctx'> </div><div class='del'>-        iosfd-&gt;filename = path;</div><div class='del'>-        gettimeofday (&amp;iosfd-&gt;opened_at, NULL);</div><div class='add'>+        fop_hits = GF_ATOMIC_GET(stats-&gt;fop_hits[i]);</div><div class='add'>+        fop_lat_ave = 0.0;</div><div class='add'>+        fop_lat_min = 0.0;</div><div class='add'>+        fop_lat_max = 0.0;</div><div class='add'>+        if (fop_hits) {</div><div class='add'>+            if (stats-&gt;latency[i].avg) {</div><div class='add'>+                fop_lat_ave = stats-&gt;latency[i].avg;</div><div class='add'>+                fop_lat_min = stats-&gt;latency[i].min;</div><div class='add'>+                fop_lat_max = stats-&gt;latency[i].max;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+        if (interval == -1) {</div><div class='add'>+            ios_log(this, logfp, "\"%s.%s.fop.%s.count\": %" GF_PRI_ATOMIC ",",</div><div class='add'>+                    key_prefix, str_prefix, lc_fop_name, fop_hits);</div><div class='add'>+        } else {</div><div class='add'>+            ios_log(this, logfp, "\"%s.%s.fop.%s.per_sec\": %0.2lf,",</div><div class='add'>+                    key_prefix, str_prefix, lc_fop_name,</div><div class='add'>+                    (double)(fop_hits / interval_sec));</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-        ios_fd_ctx_set (fd, this, iosfd);</div><div class='add'>+        ios_log(this, logfp, "\"%s.%s.fop.%s.latency_ave_usec\": %0.2lf,",</div><div class='add'>+                key_prefix, str_prefix, lc_fop_name, fop_lat_ave);</div><div class='add'>+        ios_log(this, logfp, "\"%s.%s.fop.%s.latency_min_usec\": %0.2lf,",</div><div class='add'>+                key_prefix, str_prefix, lc_fop_name, fop_lat_min);</div><div class='add'>+        ios_log(this, logfp, "\"%s.%s.fop.%s.latency_max_usec\": %0.2lf,",</div><div class='add'>+                key_prefix, str_prefix, lc_fop_name, fop_lat_max);</div><div class='add'>+</div><div class='add'>+        fop_ave_usec_sum += fop_lat_ave;</div><div class='add'>+        weighted_fop_ave_usec_sum += fop_hits * fop_lat_ave;</div><div class='add'>+        total_fop_hits += fop_hits;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (total_fop_hits) {</div><div class='add'>+        weighted_fop_ave_usec = weighted_fop_ave_usec_sum / total_fop_hits;</div><div class='add'>+        /* Extra key that does not print out an entry w/ 0.00 for</div><div class='add'>+         * intervals with no data</div><div class='add'>+         */</div><div class='add'>+        ios_log(this, logfp,</div><div class='add'>+                "\"%s.%s.fop.weighted_latency_ave_usec_nozerofill\": "</div><div class='add'>+                "%0.4lf,",</div><div class='add'>+                key_prefix, str_prefix, weighted_fop_ave_usec);</div><div class='add'>+    }</div><div class='add'>+    ios_log(this, logfp, "\"%s.%s.fop.weighted_latency_ave_usec\": %0.4lf,",</div><div class='add'>+            key_prefix, str_prefix, weighted_fop_ave_usec);</div><div class='add'>+    ios_log(this, logfp, "\"%s.%s.fop.weighted_fop_count\": %ld,", key_prefix,</div><div class='add'>+            str_prefix, total_fop_hits);</div><div class='add'>+</div><div class='add'>+    fop_ave_usec = fop_ave_usec_sum / GF_FOP_MAXVALUE;</div><div class='add'>+    ios_log(this, logfp, "\"%s.%s.fop.unweighted_latency_ave_usec\":%0.4lf,",</div><div class='add'>+            key_prefix, str_prefix, fop_ave_usec);</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; GF_UPCALL_FLAGS_MAXVALUE; i++) {</div><div class='add'>+        lc_fop_name = strdupa(gf_upcall_list[i]);</div><div class='add'>+        for (j = 0; lc_fop_name[j]; j++) {</div><div class='add'>+            lc_fop_name[j] = tolower(lc_fop_name[j]);</div><div class='add'>+        }</div><div class='add'>+        fop_hits = GF_ATOMIC_GET(stats-&gt;upcall_hits[i]);</div><div class='add'>+        if (interval == -1) {</div><div class='add'>+            ios_log(this, logfp, "\"%s.%s.fop.%s.count\": %" GF_PRI_ATOMIC ",",</div><div class='add'>+                    key_prefix, str_prefix, lc_fop_name, fop_hits);</div><div class='add'>+        } else {</div><div class='add'>+            ios_log(this, logfp, "\"%s.%s.fop.%s.per_sec\": %0.2lf,",</div><div class='add'>+                    key_prefix, str_prefix, lc_fop_name,</div><div class='add'>+                    (double)(fop_hits / interval_sec));</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = syncop_getxattr(this, &amp;unused_loc, &amp;xattr, IO_THREADS_QUEUE_SIZE_KEY,</div><div class='add'>+                          NULL, NULL);</div><div class='add'>+    if (xattr) {</div><div class='add'>+        /*</div><div class='add'>+         * Iterate over the dictionary returned to us by io-threads and</div><div class='add'>+         * dump the results to the stats file.</div><div class='add'>+         */</div><div class='add'>+        data_pair_t *curr = NULL;</div><div class='add'>+</div><div class='add'>+        dict_foreach_inline(xattr, curr)</div><div class='add'>+        {</div><div class='add'>+            ios_log(this, logfp, "\"%s.%s.%s.queue_size\": %d,", key_prefix,</div><div class='add'>+                    str_prefix, curr-&gt;key, data_to_int32(curr-&gt;value));</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-unwind:</div><div class='del'>-        STACK_UNWIND_STRICT (create, frame, op_ret, op_errno, fd, inode, buf,</div><div class='del'>-                             preparent, postparent);</div><div class='del'>-        return 0;</div><div class='add'>+        /* Free the dictionary */</div><div class='add'>+        dict_unref(xattr);</div><div class='add'>+    } else {</div><div class='add'>+        gf_log(this-&gt;name, GF_LOG_WARNING,</div><div class='add'>+               "Unable to get queue size counts from "</div><div class='add'>+               "the io-threads translator!");</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (interval == -1) {</div><div class='add'>+        ios_log(this, logfp, "\"%s.%s.uptime\": %" PRIu64 ",", key_prefix,</div><div class='add'>+                str_prefix, (uint64_t)(now - stats-&gt;started_at));</div><div class='add'>+        ios_log(this, logfp,</div><div class='add'>+                "\"%s.%s.bytes_read\": "</div><div class='add'>+                "%" GF_PRI_ATOMIC ",",</div><div class='add'>+                key_prefix, str_prefix, GF_ATOMIC_GET(stats-&gt;data_read));</div><div class='add'>+        ios_log(this, logfp,</div><div class='add'>+                "\"%s.%s.bytes_written\": "</div><div class='add'>+                "%" GF_PRI_ATOMIC "",</div><div class='add'>+                key_prefix, str_prefix, GF_ATOMIC_GET(stats-&gt;data_written));</div><div class='add'>+    } else {</div><div class='add'>+        ios_log(this, logfp, "\"%s.%s.sample_interval_sec\": %0.2lf,",</div><div class='add'>+                key_prefix, str_prefix, interval_sec);</div><div class='add'>+        ios_log(this, logfp, "\"%s.%s.bytes_read_per_sec\": %0.2lf,",</div><div class='add'>+                key_prefix, str_prefix,</div><div class='add'>+                (double)(GF_ATOMIC_GET(stats-&gt;data_read) / interval_sec));</div><div class='add'>+        ios_log(this, logfp, "\"%s.%s.bytes_written_per_sec\": %0.2lf",</div><div class='add'>+                key_prefix, str_prefix,</div><div class='add'>+                (double)(GF_ATOMIC_GET(stats-&gt;data_written) / interval_sec));</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ios_log(this, logfp, "}");</div><div class='add'>+    ret = 0;</div><div class='add'>+out:</div><div class='add'>+    GF_FREE(key_prefix);</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+char *</div><div class='add'>+_resolve_username(xlator_t *this, uid_t uid)</div><div class='add'>+{</div><div class='add'>+    struct passwd pwd;</div><div class='add'>+    struct passwd *pwd_result = NULL;</div><div class='add'>+    size_t pwd_buf_len;</div><div class='add'>+    char *pwd_buf = NULL;</div><div class='add'>+    char *ret = NULL;</div><div class='add'>+</div><div class='add'>+    /* Prepare our buffer for the uid-&gt;username translation */</div><div class='add'>+#ifdef _SC_GETGR_R_SIZE_MAX</div><div class='add'>+    pwd_buf_len = sysconf(_SC_GETGR_R_SIZE_MAX);</div><div class='add'>+#else</div><div class='add'>+    pwd_buf_len = -1;</div><div class='add'>+#endif</div><div class='add'>+    if (pwd_buf_len == -1) {</div><div class='add'>+        pwd_buf_len = DEFAULT_PWD_BUF_SZ; /* per the man page */</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    pwd_buf = alloca(pwd_buf_len);</div><div class='add'>+    if (!pwd_buf)</div><div class='add'>+        goto err;</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-io_stats_open_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-                   int32_t op_ret, int32_t op_errno, fd_t *fd)</div><div class='add'>+    getpwuid_r(uid, &amp;pwd, pwd_buf, pwd_buf_len, &amp;pwd_result);</div><div class='add'>+    if (!pwd_result)</div><div class='add'>+        goto err;</div><div class='add'>+</div><div class='add'>+    ret = gf_strdup(pwd.pw_name);</div><div class='add'>+    if (ret)</div><div class='add'>+        return ret;</div><div class='add'>+    else</div><div class='add'>+        gf_log(this-&gt;name, GF_LOG_ERROR,</div><div class='add'>+               "gf_strdup failed, failing username "</div><div class='add'>+               "resolution.");</div><div class='add'>+err:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+char *</div><div class='add'>+_resolve_group_name(xlator_t *this, gid_t gid)</div><div class='ctx'> {</div><div class='del'>-        struct ios_fd *iosfd = NULL;</div><div class='del'>-        char          *path = NULL;</div><div class='add'>+    struct group grp;</div><div class='add'>+    struct group *grp_result = NULL;</div><div class='add'>+    size_t grp_buf_len;</div><div class='add'>+    char *grp_buf = NULL;</div><div class='add'>+    char *ret = NULL;</div><div class='add'>+</div><div class='add'>+    /* Prepare our buffer for the gid-&gt;group name translation */</div><div class='add'>+#ifdef _SC_GETGR_R_SIZE_MAX</div><div class='add'>+    grp_buf_len = sysconf(_SC_GETGR_R_SIZE_MAX);</div><div class='add'>+#else</div><div class='add'>+    grp_buf_len = -1;</div><div class='add'>+#endif</div><div class='add'>+    if (grp_buf_len == -1) {</div><div class='add'>+        grp_buf_len = DEFAULT_GRP_BUF_SZ; /* per the man page */</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        path = frame-&gt;local;</div><div class='del'>-        frame-&gt;local = NULL;</div><div class='add'>+    grp_buf = alloca(grp_buf_len);</div><div class='add'>+    if (!grp_buf) {</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        if (!path)</div><div class='del'>-                goto unwind;</div><div class='add'>+    if (getgrgid_r(gid, &amp;grp, grp_buf, grp_buf_len, &amp;grp_result) != 0)</div><div class='add'>+        goto err;</div><div class='ctx'> </div><div class='del'>-        if (op_ret &lt; 0) {</div><div class='del'>-                GF_FREE (path);</div><div class='del'>-                goto unwind;</div><div class='del'>-        }</div><div class='add'>+    if (!grp_result)</div><div class='add'>+        goto err;</div><div class='add'>+</div><div class='add'>+    ret = gf_strdup(grp.gr_name);</div><div class='add'>+    if (ret)</div><div class='add'>+        return ret;</div><div class='add'>+    else</div><div class='add'>+        gf_log(this-&gt;name, GF_LOG_ERROR,</div><div class='add'>+               "gf_strdup failed, failing username "</div><div class='add'>+               "resolution.");</div><div class='add'>+err:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        iosfd = GF_CALLOC (1, sizeof (*iosfd), gf_io_stats_mt_ios_fd);</div><div class='del'>-        if (!iosfd) {</div><div class='del'>-                GF_FREE (path);</div><div class='del'>-                goto unwind;</div><div class='add'>+/*</div><div class='add'>+ * This function writes out a latency sample to a given file descriptor</div><div class='add'>+ * and beautifies the output in the process.</div><div class='add'>+ */</div><div class='add'>+void</div><div class='add'>+_io_stats_write_latency_sample(xlator_t *this, ios_sample_t *sample,</div><div class='add'>+                               FILE *logfp)</div><div class='add'>+{</div><div class='add'>+    double epoch_time = 0.00;</div><div class='add'>+    char *xlator_name = NULL;</div><div class='add'>+    char *instance_name = NULL;</div><div class='add'>+    char *hostname = NULL;</div><div class='add'>+    char *identifier = NULL;</div><div class='add'>+    char *port = NULL;</div><div class='add'>+    char *port_pos = NULL;</div><div class='add'>+    char *group_name = NULL;</div><div class='add'>+    char *username = NULL;</div><div class='add'>+    struct ios_conf *conf = NULL;</div><div class='add'>+</div><div class='add'>+    conf = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    epoch_time = (sample-&gt;timestamp).tv_sec +</div><div class='add'>+                 ((sample-&gt;timestamp).tv_usec / 1000000.0);</div><div class='add'>+</div><div class='add'>+    if (strlen(sample-&gt;identifier) == 0) {</div><div class='add'>+        hostname = "Unknown";</div><div class='add'>+        port = "Unknown";</div><div class='add'>+    } else {</div><div class='add'>+        identifier = strdupa(sample-&gt;identifier);</div><div class='add'>+        port_pos = strrchr(identifier, ':');</div><div class='add'>+        if (!port_pos || strlen(port_pos) &lt; 2)</div><div class='add'>+            goto err;</div><div class='add'>+        port = strdupa(port_pos + 1);</div><div class='add'>+        if (!port)</div><div class='add'>+            goto err;</div><div class='add'>+        *port_pos = '\0';</div><div class='add'>+        hostname = gf_rev_dns_lookup_cached(identifier, conf-&gt;dnscache);</div><div class='add'>+        if (!hostname)</div><div class='add'>+            hostname = "Unknown";</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    xlator_name = conf-&gt;unique_id;</div><div class='add'>+    if (!xlator_name || strlen(xlator_name) == 0)</div><div class='add'>+        xlator_name = "Unknown";</div><div class='add'>+</div><div class='add'>+    instance_name = this-&gt;instance_name;</div><div class='add'>+    if (!instance_name || strlen(instance_name) == 0)</div><div class='add'>+        instance_name = "N/A";</div><div class='add'>+</div><div class='add'>+    /* Resolve the UID to a string username */</div><div class='add'>+    username = _resolve_username(this, sample-&gt;uid);</div><div class='add'>+    if (!username) {</div><div class='add'>+        username = GF_MALLOC(30, gf_common_mt_char);</div><div class='add'>+        if (!username) {</div><div class='add'>+            goto out;</div><div class='ctx'>         }</div><div class='add'>+        sprintf(username, "%d", (int32_t)sample-&gt;uid);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Resolve the GID to a string group name */</div><div class='add'>+    group_name = _resolve_group_name(this, sample-&gt;gid);</div><div class='add'>+    if (!group_name) {</div><div class='add'>+        group_name = GF_MALLOC(30, gf_common_mt_char);</div><div class='add'>+        if (!group_name) {</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+        sprintf(group_name, "%d", (int32_t)sample-&gt;gid);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ios_log(this, logfp, "%0.6lf,%s,%s,%0.4lf,%s,%s,%s,%s,%s,%s", epoch_time,</div><div class='add'>+            fop_enum_to_pri_string(sample-&gt;fop_type),</div><div class='add'>+            gf_fop_string(sample-&gt;fop_type), sample-&gt;elapsed, xlator_name,</div><div class='add'>+            instance_name, username, group_name, hostname, port);</div><div class='add'>+    goto out;</div><div class='add'>+err:</div><div class='add'>+    gf_log(this-&gt;name, GF_LOG_ERROR, "Error parsing socket identifier");</div><div class='add'>+out:</div><div class='add'>+    GF_FREE(group_name);</div><div class='add'>+    GF_FREE(username);</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        iosfd-&gt;filename = path;</div><div class='del'>-        gettimeofday (&amp;iosfd-&gt;opened_at, NULL);</div><div class='add'>+/*</div><div class='add'>+ * Takes our current sample buffer in conf-&gt;io_sample_buf, and saves</div><div class='add'>+ * a reference to this, init's a new buffer, and then dumps out the</div><div class='add'>+ * contents of the saved reference.</div><div class='add'>+ */</div><div class='add'>+int</div><div class='add'>+io_stats_dump_latency_samples_logfp(xlator_t *this, FILE *logfp)</div><div class='add'>+{</div><div class='add'>+    uint64_t i = 0;</div><div class='add'>+    struct ios_conf *conf = NULL;</div><div class='add'>+    ios_sample_buf_t *sample_buf = NULL;</div><div class='add'>+    int ret = 1; /* Default to error */</div><div class='add'>+</div><div class='add'>+    conf = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    /* Save pointer to old buffer; the CS equivalent of</div><div class='add'>+     * Indiana Jones: https://www.youtube.com/watch?v=Pr-8AP0To4k,</div><div class='add'>+     * though ours will end better I hope!</div><div class='add'>+     */</div><div class='add'>+    sample_buf = conf-&gt;ios_sample_buf;</div><div class='add'>+    if (!sample_buf) {</div><div class='add'>+        gf_log(this-&gt;name, GF_LOG_WARNING, "Sampling buffer is null, bailing!");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Empty case, nothing to do, exit. */</div><div class='add'>+    if (sample_buf-&gt;collected == 0) {</div><div class='add'>+        gf_log(this-&gt;name, GF_LOG_DEBUG, "No samples, dump not required.");</div><div class='add'>+        ret = 0;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Init a new buffer, so we are free to work on the one we saved a</div><div class='add'>+     * reference to above.</div><div class='add'>+     */</div><div class='add'>+    if (ios_init_sample_buf(conf) != 0) {</div><div class='add'>+        gf_log(this-&gt;name, GF_LOG_WARNING,</div><div class='add'>+               "Failed to init new sampling buffer, out of memory?");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Wrap-around case, dump from pos to sample_buf-&gt;size -1</div><div class='add'>+     * and then from 0 to sample_buf-&gt;pos (covered off by</div><div class='add'>+     * "simple case")</div><div class='add'>+     */</div><div class='add'>+    if (sample_buf-&gt;collected &gt; sample_buf-&gt;pos + 1) {</div><div class='add'>+        for (i = sample_buf-&gt;pos; i &lt; sample_buf-&gt;size; i++) {</div><div class='add'>+            _io_stats_write_latency_sample(this, &amp;(sample_buf-&gt;ios_samples[i]),</div><div class='add'>+                                           logfp);</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        ios_fd_ctx_set (fd, this, iosfd);</div><div class='add'>+    /* Simple case: Dump from 0 to sample_buf-&gt;pos */</div><div class='add'>+    for (i = 0; i &lt; sample_buf-&gt;pos; i++) {</div><div class='add'>+        _io_stats_write_latency_sample(this, &amp;(sample_buf-&gt;ios_samples[i]),</div><div class='add'>+                                       logfp);</div><div class='add'>+    }</div><div class='add'>+    ios_destroy_sample_buf(sample_buf);</div><div class='ctx'> </div><div class='del'>-unwind:</div><div class='del'>-        STACK_UNWIND_STRICT (open, frame, op_ret, op_errno, fd);</div><div class='del'>-        return 0;</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+int</div><div class='add'>+io_stats_dump_global_to_logfp(xlator_t *this, struct ios_global_stats *stats,</div><div class='add'>+                              time_t now, int interval, FILE *logfp)</div><div class='add'>+{</div><div class='add'>+    int i = 0;</div><div class='add'>+    int per_line = 0;</div><div class='add'>+    int index = 0;</div><div class='add'>+    struct ios_stat_head *list_head = NULL;</div><div class='add'>+    struct ios_conf *conf = NULL;</div><div class='add'>+    char timestr[GF_TIMESTR_SIZE] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    char str_header[128] = {0};</div><div class='add'>+    char str_read[128] = {0};</div><div class='add'>+    char str_write[128] = {0};</div><div class='add'>+    uint64_t fop_hits = 0;</div><div class='add'>+    uint64_t block_count_read = 0;</div><div class='add'>+    uint64_t block_count_write = 0;</div><div class='add'>+</div><div class='add'>+    conf = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    if (interval == -1)</div><div class='add'>+        ios_log(this, logfp, "\n=== Cumulative stats ===");</div><div class='add'>+    else</div><div class='add'>+        ios_log(this, logfp, "\n=== Interval %d stats ===", interval);</div><div class='add'>+    ios_log(this, logfp, "      Duration : %" PRIu64 " secs",</div><div class='add'>+            (uint64_t)(now - stats-&gt;started_at));</div><div class='add'>+    ios_log(this, logfp, "     BytesRead : %" GF_PRI_ATOMIC,</div><div class='add'>+            GF_ATOMIC_GET(stats-&gt;data_read));</div><div class='add'>+    ios_log(this, logfp, "  BytesWritten : %" GF_PRI_ATOMIC "\n",</div><div class='add'>+            GF_ATOMIC_GET(stats-&gt;data_written));</div><div class='add'>+</div><div class='add'>+    snprintf(str_header, sizeof(str_header), "%-12s %c", "Block Size", ':');</div><div class='add'>+    snprintf(str_read, sizeof(str_read), "%-12s %c", "Read Count", ':');</div><div class='add'>+    snprintf(str_write, sizeof(str_write), "%-12s %c", "Write Count", ':');</div><div class='add'>+    index = 14;</div><div class='add'>+    for (i = 0; i &lt; IOS_BLOCK_COUNT_SIZE; i++) {</div><div class='add'>+        block_count_read = GF_ATOMIC_GET(stats-&gt;block_count_read[i]);</div><div class='add'>+        block_count_write = GF_ATOMIC_GET(stats-&gt;block_count_write[i]);</div><div class='add'>+        if ((block_count_read == 0) &amp;&amp; (block_count_write == 0))</div><div class='add'>+            continue;</div><div class='add'>+        per_line++;</div><div class='add'>+</div><div class='add'>+        snprintf(str_header + index, sizeof(str_header) - index, "%16dB+",</div><div class='add'>+                 (1 &lt;&lt; i));</div><div class='add'>+        if (block_count_read)</div><div class='add'>+            snprintf(str_read + index, sizeof(str_read) - index, "%18" PRId64,</div><div class='add'>+                     block_count_read);</div><div class='add'>+        else</div><div class='add'>+            snprintf(str_read + index, sizeof(str_read) - index, "%18s", "0");</div><div class='add'>+        if (block_count_write)</div><div class='add'>+            snprintf(str_write + index, sizeof(str_write) - index,</div><div class='add'>+                     "%18" GF_PRI_ATOMIC, block_count_write);</div><div class='add'>+        else</div><div class='add'>+            snprintf(str_write + index, sizeof(str_write) - index, "%18s", "0");</div><div class='add'>+</div><div class='add'>+        index += 18;</div><div class='add'>+        if (per_line == 3) {</div><div class='add'>+            ios_log(this, logfp, "%s", str_header);</div><div class='add'>+            ios_log(this, logfp, "%s", str_read);</div><div class='add'>+            ios_log(this, logfp, "%s\n", str_write);</div><div class='add'>+</div><div class='add'>+            snprintf(str_header, sizeof(str_header), "%-12s %c", "Block Size",</div><div class='add'>+                     ':');</div><div class='add'>+            snprintf(str_read, sizeof(str_read), "%-12s %c", "Read Count", ':');</div><div class='add'>+            snprintf(str_write, sizeof(str_write), "%-12s %c", "Write Count",</div><div class='add'>+                     ':');</div><div class='add'>+</div><div class='add'>+            index = 14;</div><div class='add'>+            per_line = 0;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (per_line != 0) {</div><div class='add'>+        ios_log(this, logfp, "%s", str_header);</div><div class='add'>+        ios_log(this, logfp, "%s", str_read);</div><div class='add'>+        ios_log(this, logfp, "%s\n", str_write);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ios_log(this, logfp, "%-13s %10s %14s %14s %14s", "Fop", "Call Count",</div><div class='add'>+            "Avg-Latency", "Min-Latency", "Max-Latency");</div><div class='add'>+    ios_log(this, logfp, "%-13s %10s %14s %14s %14s", "---", "----------",</div><div class='add'>+            "-----------", "-----------", "-----------");</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; GF_FOP_MAXVALUE; i++) {</div><div class='add'>+        fop_hits = GF_ATOMIC_GET(stats-&gt;fop_hits[i]);</div><div class='add'>+        if (fop_hits &amp;&amp; !stats-&gt;latency[i].avg)</div><div class='add'>+            ios_log(this, logfp,</div><div class='add'>+                    "%-13s %10" GF_PRI_ATOMIC</div><div class='add'>+                    " %11s "</div><div class='add'>+                    "us %11s us %11s us",</div><div class='add'>+                    gf_fop_list[i], fop_hits, "0", "0", "0");</div><div class='add'>+        else if (fop_hits &amp;&amp; stats-&gt;latency[i].avg)</div><div class='add'>+            ios_log(this, logfp,</div><div class='add'>+                    "%-13s %10" GF_PRI_ATOMIC</div><div class='add'>+                    " "</div><div class='add'>+                    "%11.2lf us %11.2lf us %11.2lf us",</div><div class='add'>+                    gf_fop_list[i], fop_hits, stats-&gt;latency[i].avg,</div><div class='add'>+                    stats-&gt;latency[i].min, stats-&gt;latency[i].max);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; GF_UPCALL_FLAGS_MAXVALUE; i++) {</div><div class='add'>+        fop_hits = GF_ATOMIC_GET(stats-&gt;upcall_hits[i]);</div><div class='add'>+        if (fop_hits)</div><div class='add'>+            ios_log(this, logfp,</div><div class='add'>+                    "%-13s %10" PRId64</div><div class='add'>+                    " %11s "</div><div class='add'>+                    "us %11s us %11s us",</div><div class='add'>+                    gf_upcall_list[i], fop_hits, "0", "0", "0");</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ios_log(this, logfp,</div><div class='add'>+            "------ ----- ----- ----- ----- ----- ----- ----- "</div><div class='add'>+            " ----- ----- ----- -----\n");</div><div class='add'>+</div><div class='add'>+    if (interval == -1) {</div><div class='add'>+        LOCK(&amp;conf-&gt;lock);</div><div class='add'>+        {</div><div class='add'>+            gf_time_fmt_tv(timestr, sizeof timestr,</div><div class='add'>+                           &amp;conf-&gt;cumulative.max_openfd_time, gf_timefmt_FT);</div><div class='add'>+            ios_log(this, logfp,</div><div class='add'>+                    "Current open fd's: %" PRId64 " Max open fd's: %" PRId64</div><div class='add'>+                    " time %s",</div><div class='add'>+                    conf-&gt;cumulative.nr_opens, conf-&gt;cumulative.max_nr_opens,</div><div class='add'>+                    timestr);</div><div class='add'>+        }</div><div class='add'>+        UNLOCK(&amp;conf-&gt;lock);</div><div class='add'>+        ios_log(this, logfp, "\n==========Open File Stats========");</div><div class='add'>+        ios_log(this, logfp, "\nCOUNT:  \t  FILE NAME");</div><div class='add'>+        list_head = &amp;conf-&gt;list[IOS_STATS_TYPE_OPEN];</div><div class='add'>+        ios_dump_file_stats(list_head, this, logfp);</div><div class='add'>+</div><div class='add'>+        ios_log(this, logfp, "\n==========Read File Stats========");</div><div class='add'>+        ios_log(this, logfp, "\nCOUNT:  \t  FILE NAME");</div><div class='add'>+        list_head = &amp;conf-&gt;list[IOS_STATS_TYPE_READ];</div><div class='add'>+        ios_dump_file_stats(list_head, this, logfp);</div><div class='add'>+</div><div class='add'>+        ios_log(this, logfp, "\n==========Write File Stats========");</div><div class='add'>+        ios_log(this, logfp, "\nCOUNT:  \t  FILE NAME");</div><div class='add'>+        list_head = &amp;conf-&gt;list[IOS_STATS_TYPE_WRITE];</div><div class='add'>+        ios_dump_file_stats(list_head, this, logfp);</div><div class='add'>+</div><div class='add'>+        ios_log(this, logfp, "\n==========Directory open stats========");</div><div class='add'>+        ios_log(this, logfp, "\nCOUNT:  \t  DIRECTORY NAME");</div><div class='add'>+        list_head = &amp;conf-&gt;list[IOS_STATS_TYPE_OPENDIR];</div><div class='add'>+        ios_dump_file_stats(list_head, this, logfp);</div><div class='add'>+</div><div class='add'>+        ios_log(this, logfp, "\n========Directory readdirp Stats=======");</div><div class='add'>+        ios_log(this, logfp, "\nCOUNT:  \t  DIRECTORY NAME");</div><div class='add'>+        list_head = &amp;conf-&gt;list[IOS_STATS_TYPE_READDIRP];</div><div class='add'>+        ios_dump_file_stats(list_head, this, logfp);</div><div class='add'>+</div><div class='add'>+        ios_log(this, logfp, "\n========Read Throughput File Stats=====");</div><div class='add'>+        ios_log(this, logfp,</div><div class='add'>+                "\nTIMESTAMP \t\t\t THROUGHPUT(KBPS)"</div><div class='add'>+                "\tFILE NAME");</div><div class='add'>+        list_head = &amp;conf-&gt;thru_list[IOS_STATS_THRU_READ];</div><div class='add'>+        ios_dump_throughput_stats(list_head, this, logfp, IOS_STATS_THRU_READ);</div><div class='add'>+</div><div class='add'>+        ios_log(this, logfp, "\n======Write Throughput File Stats======");</div><div class='add'>+        ios_log(this, logfp,</div><div class='add'>+                "\nTIMESTAMP \t\t\t THROUGHPUT(KBPS)"</div><div class='add'>+                "\tFILE NAME");</div><div class='add'>+        list_head = &amp;conf-&gt;thru_list[IOS_STATS_THRU_WRITE];</div><div class='add'>+        ios_dump_throughput_stats(list_head, this, logfp, IOS_STATS_THRU_WRITE);</div><div class='add'>+    }</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-io_stats_stat_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-                   int32_t op_ret, int32_t op_errno, struct iatt *buf)</div><div class='add'>+io_stats_dump_global_to_dict(xlator_t *this, struct ios_global_stats *stats,</div><div class='add'>+                             time_t now, int interval, dict_t *dict)</div><div class='ctx'> {</div><div class='del'>-        STACK_UNWIND_STRICT (stat, frame, op_ret, op_errno, buf);</div><div class='del'>-        return 0;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    char key[64] = {0};</div><div class='add'>+    uint64_t sec = 0;</div><div class='add'>+    int i = 0;</div><div class='add'>+    uint64_t count = 0;</div><div class='add'>+    uint64_t fop_hits = 0;</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(stats);</div><div class='add'>+    GF_ASSERT(now);</div><div class='add'>+    GF_ASSERT(dict);</div><div class='add'>+    GF_ASSERT(this);</div><div class='add'>+</div><div class='add'>+    if (interval == -1)</div><div class='add'>+        snprintf(key, sizeof(key), "cumulative");</div><div class='add'>+    else</div><div class='add'>+        snprintf(key, sizeof(key), "interval");</div><div class='add'>+    ret = dict_set_int32(dict, key, interval);</div><div class='add'>+    if (ret)</div><div class='add'>+        gf_log(this-&gt;name, GF_LOG_ERROR,</div><div class='add'>+               "failed to set "</div><div class='add'>+               "interval %d",</div><div class='add'>+               interval);</div><div class='add'>+</div><div class='add'>+    snprintf(key, sizeof(key), "%d-duration", interval);</div><div class='add'>+    sec = now - stats-&gt;started_at;</div><div class='add'>+    ret = dict_set_uint64(dict, key, sec);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log(this-&gt;name, GF_LOG_ERROR,</div><div class='add'>+               "failed to set "</div><div class='add'>+               "duration(%d) - %" PRId64,</div><div class='add'>+               interval, sec);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    snprintf(key, sizeof(key), "%d-total-read", interval);</div><div class='add'>+    ret = dict_set_uint64(dict, key, GF_ATOMIC_GET(stats-&gt;data_read));</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log(this-&gt;name, GF_LOG_ERROR,</div><div class='add'>+               "failed to set total "</div><div class='add'>+               "read(%d) - %" GF_PRI_ATOMIC,</div><div class='add'>+               interval, GF_ATOMIC_GET(stats-&gt;data_read));</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    snprintf(key, sizeof(key), "%d-total-write", interval);</div><div class='add'>+    ret = dict_set_uint64(dict, key, GF_ATOMIC_GET(stats-&gt;data_written));</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log(this-&gt;name, GF_LOG_ERROR,</div><div class='add'>+               "failed to set total "</div><div class='add'>+               "write(%d) - %" GF_PRI_ATOMIC,</div><div class='add'>+               interval, GF_ATOMIC_GET(stats-&gt;data_written));</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    for (i = 0; i &lt; 32; i++) {</div><div class='add'>+        count = GF_ATOMIC_GET(stats-&gt;block_count_read[i]);</div><div class='add'>+        if (count) {</div><div class='add'>+            snprintf(key, sizeof(key), "%d-read-%d", interval, (1 &lt;&lt; i));</div><div class='add'>+            ret = dict_set_uint64(dict, key, count);</div><div class='add'>+            if (ret) {</div><div class='add'>+                gf_log(this-&gt;name, GF_LOG_ERROR,</div><div class='add'>+                       "failed to "</div><div class='add'>+                       "set read-%db+, with: %" PRId64,</div><div class='add'>+                       (1 &lt;&lt; i), count);</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; IOS_BLOCK_COUNT_SIZE; i++) {</div><div class='add'>+        count = GF_ATOMIC_GET(stats-&gt;block_count_write[i]);</div><div class='add'>+        if (count) {</div><div class='add'>+            snprintf(key, sizeof(key), "%d-write-%d", interval, (1 &lt;&lt; i));</div><div class='add'>+            ret = dict_set_uint64(dict, key, count);</div><div class='add'>+            if (ret) {</div><div class='add'>+                gf_log(this-&gt;name, GF_LOG_ERROR,</div><div class='add'>+                       "failed to "</div><div class='add'>+                       "set write-%db+, with: %" PRId64,</div><div class='add'>+                       (1 &lt;&lt; i), count);</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; GF_FOP_MAXVALUE; i++) {</div><div class='add'>+        fop_hits = GF_ATOMIC_GET(stats-&gt;fop_hits[i]);</div><div class='add'>+        if (fop_hits == 0)</div><div class='add'>+            continue;</div><div class='add'>+        snprintf(key, sizeof(key), "%d-%d-hits", interval, i);</div><div class='add'>+        ret = dict_set_uint64(dict, key, fop_hits);</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_log(this-&gt;name, GF_LOG_ERROR,</div><div class='add'>+                   "failed to set "</div><div class='add'>+                   "%s-fop-hits: %" GF_PRI_ATOMIC,</div><div class='add'>+                   gf_fop_list[i], fop_hits);</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        if (stats-&gt;latency[i].avg == 0)</div><div class='add'>+            continue;</div><div class='add'>+        snprintf(key, sizeof(key), "%d-%d-avglatency", interval, i);</div><div class='add'>+        ret = dict_set_double(dict, key, stats-&gt;latency[i].avg);</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_log(this-&gt;name, GF_LOG_ERROR,</div><div class='add'>+                   "failed to set %s "</div><div class='add'>+                   "avglatency(%d) with %f",</div><div class='add'>+                   gf_fop_list[i], interval, stats-&gt;latency[i].avg);</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+        snprintf(key, sizeof(key), "%d-%d-minlatency", interval, i);</div><div class='add'>+        ret = dict_set_double(dict, key, stats-&gt;latency[i].min);</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_log(this-&gt;name, GF_LOG_ERROR,</div><div class='add'>+                   "failed to set %s "</div><div class='add'>+                   "minlatency(%d) with %f",</div><div class='add'>+                   gf_fop_list[i], interval, stats-&gt;latency[i].min);</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+        snprintf(key, sizeof(key), "%d-%d-maxlatency", interval, i);</div><div class='add'>+        ret = dict_set_double(dict, key, stats-&gt;latency[i].max);</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_log(this-&gt;name, GF_LOG_ERROR,</div><div class='add'>+                   "failed to set %s "</div><div class='add'>+                   "maxlatency(%d) with %f",</div><div class='add'>+                   gf_fop_list[i], interval, stats-&gt;latency[i].max);</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    for (i = 0; i &lt; GF_UPCALL_FLAGS_MAXVALUE; i++) {</div><div class='add'>+        fop_hits = GF_ATOMIC_GET(stats-&gt;upcall_hits[i]);</div><div class='add'>+        if (fop_hits == 0)</div><div class='add'>+            continue;</div><div class='add'>+        snprintf(key, sizeof(key), "%d-%d-upcall-hits", interval, i);</div><div class='add'>+        ret = dict_set_uint64(dict, key, fop_hits);</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_log(this-&gt;name, GF_LOG_ERROR,</div><div class='add'>+                   "failed to "</div><div class='add'>+                   "set %s-upcall-hits: %" PRIu64,</div><div class='add'>+                   gf_upcall_list[i], fop_hits);</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+out:</div><div class='add'>+    gf_log(this-&gt;name, GF_LOG_DEBUG, "returning %d", ret);</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+int</div><div class='add'>+io_stats_dump_global(xlator_t *this, struct ios_global_stats *stats, time_t now,</div><div class='add'>+                     int interval, struct ios_dump_args *args)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(args);</div><div class='add'>+    GF_ASSERT(now);</div><div class='add'>+    GF_ASSERT(stats);</div><div class='add'>+    GF_ASSERT(this);</div><div class='add'>+</div><div class='add'>+    switch (args-&gt;type) {</div><div class='add'>+        case IOS_DUMP_TYPE_JSON_FILE:</div><div class='add'>+            ret = io_stats_dump_global_to_json_logfp(this, stats, now, interval,</div><div class='add'>+                                                     args-&gt;u.logfp);</div><div class='add'>+            break;</div><div class='add'>+        case IOS_DUMP_TYPE_FILE:</div><div class='add'>+            ret = io_stats_dump_global_to_logfp(this, stats, now, interval,</div><div class='add'>+                                                args-&gt;u.logfp);</div><div class='add'>+            break;</div><div class='add'>+        case IOS_DUMP_TYPE_DICT:</div><div class='add'>+            ret = io_stats_dump_global_to_dict(this, stats, now, interval,</div><div class='add'>+                                               args-&gt;u.dict);</div><div class='add'>+            break;</div><div class='add'>+        default:</div><div class='add'>+            GF_ASSERT(0);</div><div class='add'>+            ret = -1;</div><div class='add'>+            break;</div><div class='add'>+    }</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-io_stats_readv_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-                    int32_t op_ret, int32_t op_errno,</div><div class='del'>-                    struct iovec *vector, int32_t count,</div><div class='del'>-                    struct iatt *buf, struct iobref *iobref)</div><div class='add'>+ios_dump_args_init(struct ios_dump_args *args, ios_dump_type_t type,</div><div class='add'>+                   void *output)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(args);</div><div class='add'>+    GF_ASSERT(type &gt; IOS_DUMP_TYPE_NONE &amp;&amp; type &lt; IOS_DUMP_TYPE_MAX);</div><div class='add'>+    GF_ASSERT(output);</div><div class='add'>+</div><div class='add'>+    args-&gt;type = type;</div><div class='add'>+    switch (args-&gt;type) {</div><div class='add'>+        case IOS_DUMP_TYPE_JSON_FILE:</div><div class='add'>+        case IOS_DUMP_TYPE_FILE:</div><div class='add'>+            args-&gt;u.logfp = output;</div><div class='add'>+            break;</div><div class='add'>+        case IOS_DUMP_TYPE_DICT:</div><div class='add'>+            args-&gt;u.dict = output;</div><div class='add'>+            break;</div><div class='add'>+        default:</div><div class='add'>+            GF_ASSERT(0);</div><div class='add'>+            ret = -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+ios_global_stats_clear(struct ios_global_stats *stats, time_t now)</div><div class='ctx'> {</div><div class='del'>-        int              len = 0;</div><div class='del'>-        fd_t            *fd = NULL;</div><div class='add'>+    GF_ASSERT(stats);</div><div class='add'>+    GF_ASSERT(now);</div><div class='ctx'> </div><div class='add'>+    memset(stats, 0, sizeof(*stats));</div><div class='add'>+    stats-&gt;started_at = now;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        fd = frame-&gt;local;</div><div class='del'>-        frame-&gt;local = NULL;</div><div class='add'>+int</div><div class='add'>+io_stats_dump(xlator_t *this, struct ios_dump_args *args, ios_info_op_t op,</div><div class='add'>+              gf_boolean_t is_peek)</div><div class='add'>+{</div><div class='add'>+    struct ios_conf *conf = NULL;</div><div class='add'>+    struct ios_global_stats cumulative = {};</div><div class='add'>+    struct ios_global_stats incremental = {};</div><div class='add'>+    int increment = 0;</div><div class='add'>+    time_t now = 0;</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(this);</div><div class='add'>+    GF_ASSERT(args);</div><div class='add'>+    GF_ASSERT(args-&gt;type &gt; IOS_DUMP_TYPE_NONE);</div><div class='add'>+    GF_ASSERT(args-&gt;type &lt; IOS_DUMP_TYPE_MAX);</div><div class='add'>+</div><div class='add'>+    conf = this-&gt;private;</div><div class='add'>+    now = gf_time();</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;conf-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        if (op == GF_IOS_INFO_ALL || op == GF_IOS_INFO_CUMULATIVE)</div><div class='add'>+            cumulative = conf-&gt;cumulative;</div><div class='add'>+</div><div class='add'>+        if (op == GF_IOS_INFO_ALL || op == GF_IOS_INFO_INCREMENTAL) {</div><div class='add'>+            incremental = conf-&gt;incremental;</div><div class='add'>+            increment = conf-&gt;increment;</div><div class='add'>+</div><div class='add'>+            if (!is_peek) {</div><div class='add'>+                increment = conf-&gt;increment++;</div><div class='ctx'> </div><div class='del'>-        if (op_ret &gt; 0) {</div><div class='del'>-                len = iov_length (vector, count);</div><div class='del'>-                BUMP_READ (fd, len);</div><div class='add'>+                ios_global_stats_clear(&amp;conf-&gt;incremental, now);</div><div class='add'>+            }</div><div class='ctx'>         }</div><div class='add'>+    }</div><div class='add'>+    UNLOCK(&amp;conf-&gt;lock);</div><div class='ctx'> </div><div class='del'>-        STACK_UNWIND_STRICT (readv, frame, op_ret, op_errno,</div><div class='del'>-                             vector, count, buf, iobref);</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='add'>+    if (op == GF_IOS_INFO_ALL || op == GF_IOS_INFO_CUMULATIVE)</div><div class='add'>+        io_stats_dump_global(this, &amp;cumulative, now, -1, args);</div><div class='ctx'> </div><div class='add'>+    if (op == GF_IOS_INFO_ALL || op == GF_IOS_INFO_INCREMENTAL)</div><div class='add'>+        io_stats_dump_global(this, &amp;incremental, now, increment, args);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-io_stats_writev_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-                     int32_t op_ret, int32_t op_errno,</div><div class='del'>-                     struct iatt *prebuf, struct iatt *postbuf)</div><div class='add'>+io_stats_dump_fd(xlator_t *this, struct ios_fd *iosfd)</div><div class='ctx'> {</div><div class='del'>-        STACK_UNWIND_STRICT (writev, frame, op_ret, op_errno, prebuf, postbuf);</div><div class='add'>+    struct ios_conf *conf = NULL;</div><div class='add'>+    struct timeval now;</div><div class='add'>+    int i = 0;</div><div class='add'>+    double usecs = 0;</div><div class='add'>+    uint64_t data_read = 0;</div><div class='add'>+    uint64_t data_written = 0;</div><div class='add'>+    uint64_t block_count_read = 0;</div><div class='add'>+    uint64_t block_count_write = 0;</div><div class='add'>+</div><div class='add'>+    conf = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    if (!conf-&gt;dump_fd_stats)</div><div class='add'>+        return 0;</div><div class='add'>+</div><div class='add'>+    if (!iosfd)</div><div class='ctx'>         return 0;</div><div class='add'>+</div><div class='add'>+    gettimeofday(&amp;now, NULL);</div><div class='add'>+    usecs = gf_tvdiff(&amp;iosfd-&gt;opened_at, &amp;now);</div><div class='add'>+</div><div class='add'>+    gf_log(this-&gt;name, GF_LOG_INFO, "--- fd stats ---");</div><div class='add'>+</div><div class='add'>+    if (iosfd-&gt;filename)</div><div class='add'>+        gf_log(this-&gt;name, GF_LOG_INFO, "      Filename : %s", iosfd-&gt;filename);</div><div class='add'>+</div><div class='add'>+    if (usecs)</div><div class='add'>+        gf_log(this-&gt;name, GF_LOG_INFO, "      Lifetime : %lf secs", usecs);</div><div class='add'>+</div><div class='add'>+    data_read = GF_ATOMIC_GET(iosfd-&gt;data_read);</div><div class='add'>+    if (data_read)</div><div class='add'>+        gf_log(this-&gt;name, GF_LOG_INFO, "     BytesRead : %" PRId64 " bytes",</div><div class='add'>+               data_read);</div><div class='add'>+</div><div class='add'>+    data_written = GF_ATOMIC_GET(iosfd-&gt;data_written);</div><div class='add'>+    if (data_written)</div><div class='add'>+        gf_log(this-&gt;name, GF_LOG_INFO, "  BytesWritten : %" PRId64 " bytes",</div><div class='add'>+               data_written);</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; 32; i++) {</div><div class='add'>+        block_count_read = GF_ATOMIC_GET(iosfd-&gt;block_count_read[i]);</div><div class='add'>+        if (block_count_read)</div><div class='add'>+            gf_log(this-&gt;name, GF_LOG_INFO,</div><div class='add'>+                   " Read %06db+ :"</div><div class='add'>+                   "%" PRId64,</div><div class='add'>+                   (1 &lt;&lt; i), block_count_read);</div><div class='add'>+    }</div><div class='add'>+    for (i = 0; i &lt; IOS_BLOCK_COUNT_SIZE; i++) {</div><div class='add'>+        block_count_write = GF_ATOMIC_GET(iosfd-&gt;block_count_write[i]);</div><div class='add'>+        if (block_count_write)</div><div class='add'>+            gf_log(this-&gt;name, GF_LOG_INFO, "Write %06db+ : %" PRId64, (1 &lt;&lt; i),</div><div class='add'>+                   block_count_write);</div><div class='add'>+    }</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+collect_ios_latency_sample(struct ios_conf *conf, glusterfs_fop_t fop_type,</div><div class='add'>+                           double elapsed, call_frame_t *frame)</div><div class='add'>+{</div><div class='add'>+    ios_sample_buf_t *ios_sample_buf = NULL;</div><div class='add'>+    ios_sample_t *ios_sample = NULL;</div><div class='add'>+    struct timespec *timestamp = NULL;</div><div class='add'>+    call_stack_t *root = NULL;</div><div class='add'>+</div><div class='add'>+    ios_sample_buf = conf-&gt;ios_sample_buf;</div><div class='add'>+    LOCK(&amp;conf-&gt;ios_sampling_lock);</div><div class='add'>+    if (conf-&gt;ios_sample_interval == 0 ||</div><div class='add'>+        ios_sample_buf-&gt;observed % conf-&gt;ios_sample_interval != 0)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    timestamp = &amp;frame-&gt;begin;</div><div class='add'>+    root = frame-&gt;root;</div><div class='add'>+</div><div class='add'>+    ios_sample = &amp;(ios_sample_buf-&gt;ios_samples[ios_sample_buf-&gt;pos]);</div><div class='add'>+    ios_sample-&gt;elapsed = elapsed;</div><div class='add'>+    ios_sample-&gt;fop_type = fop_type;</div><div class='add'>+    ios_sample-&gt;uid = root-&gt;uid;</div><div class='add'>+    ios_sample-&gt;gid = root-&gt;gid;</div><div class='add'>+    (ios_sample-&gt;timestamp).tv_sec = timestamp-&gt;tv_sec;</div><div class='add'>+    (ios_sample-&gt;timestamp).tv_usec = timestamp-&gt;tv_nsec / 1000;</div><div class='add'>+    memcpy(&amp;ios_sample-&gt;identifier, &amp;root-&gt;identifier,</div><div class='add'>+           sizeof(root-&gt;identifier));</div><div class='add'>+</div><div class='add'>+    /* We've reached the end of the circular buffer, start from the</div><div class='add'>+     * beginning. */</div><div class='add'>+    if (ios_sample_buf-&gt;pos == (ios_sample_buf-&gt;size - 1))</div><div class='add'>+        ios_sample_buf-&gt;pos = 0;</div><div class='add'>+    else</div><div class='add'>+        ios_sample_buf-&gt;pos++;</div><div class='add'>+    ios_sample_buf-&gt;collected++;</div><div class='add'>+out:</div><div class='add'>+    ios_sample_buf-&gt;observed++;</div><div class='add'>+    UNLOCK(&amp;conf-&gt;ios_sampling_lock);</div><div class='add'>+    return;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+static void</div><div class='add'>+update_ios_latency_stats(struct ios_global_stats *stats, double elapsed,</div><div class='add'>+                         glusterfs_fop_t op)</div><div class='add'>+{</div><div class='add'>+    double avg;</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(stats);</div><div class='add'>+</div><div class='add'>+    stats-&gt;latency[op].total += elapsed;</div><div class='ctx'> </div><div class='add'>+    if (!stats-&gt;latency[op].min)</div><div class='add'>+        stats-&gt;latency[op].min = elapsed;</div><div class='add'>+    if (stats-&gt;latency[op].min &gt; elapsed)</div><div class='add'>+        stats-&gt;latency[op].min = elapsed;</div><div class='add'>+    if (stats-&gt;latency[op].max &lt; elapsed)</div><div class='add'>+        stats-&gt;latency[op].max = elapsed;</div><div class='ctx'> </div><div class='add'>+    avg = stats-&gt;latency[op].avg;</div><div class='add'>+</div><div class='add'>+    stats-&gt;latency[op].avg = avg + (elapsed - avg) /</div><div class='add'>+                                       GF_ATOMIC_GET(stats-&gt;fop_hits[op]);</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-io_stats_readdirp_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-                       int32_t op_ret, int32_t op_errno, gf_dirent_t *buf)</div><div class='add'>+update_ios_latency(struct ios_conf *conf, call_frame_t *frame,</div><div class='add'>+                   glusterfs_fop_t op)</div><div class='ctx'> {</div><div class='del'>-        STACK_UNWIND_STRICT (readdirp, frame, op_ret, op_errno, buf);</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='add'>+    double elapsed;</div><div class='add'>+    struct timespec *begin, *end;</div><div class='ctx'> </div><div class='add'>+    begin = &amp;frame-&gt;begin;</div><div class='add'>+    end = &amp;frame-&gt;end;</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-io_stats_readdir_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-                      int32_t op_ret, int32_t op_errno, gf_dirent_t *buf)</div><div class='add'>+    elapsed = gf_tsdiff(begin, end) / 1000.0;</div><div class='add'>+</div><div class='add'>+    update_ios_latency_stats(&amp;conf-&gt;cumulative, elapsed, op);</div><div class='add'>+    update_ios_latency_stats(&amp;conf-&gt;incremental, elapsed, op);</div><div class='add'>+    collect_ios_latency_sample(conf, op, elapsed, frame);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+io_stats_dump_stats_to_dict(xlator_t *this, dict_t *resp,</div><div class='add'>+                            ios_stats_type_t flags, int32_t list_cnt)</div><div class='ctx'> {</div><div class='del'>-        STACK_UNWIND_STRICT (readdir, frame, op_ret, op_errno, buf);</div><div class='del'>-        return 0;</div><div class='add'>+    struct ios_conf *conf = NULL;</div><div class='add'>+    int cnt = 0;</div><div class='add'>+    char key[32];</div><div class='add'>+    int keylen;</div><div class='add'>+    struct ios_stat_head *list_head = NULL;</div><div class='add'>+    struct ios_stat_list *entry = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    ios_stats_thru_t index = IOS_STATS_THRU_MAX;</div><div class='add'>+    char timestr[GF_TIMESTR_SIZE] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    char *dict_timestr = NULL;</div><div class='add'>+</div><div class='add'>+    conf = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    switch (flags) {</div><div class='add'>+        case IOS_STATS_TYPE_OPEN:</div><div class='add'>+            list_head = &amp;conf-&gt;list[IOS_STATS_TYPE_OPEN];</div><div class='add'>+            LOCK(&amp;conf-&gt;lock);</div><div class='add'>+            {</div><div class='add'>+                ret = dict_set_uint64(resp, "current-open",</div><div class='add'>+                                      conf-&gt;cumulative.nr_opens);</div><div class='add'>+                if (ret)</div><div class='add'>+                    goto unlock;</div><div class='add'>+                ret = dict_set_uint64(resp, "max-open",</div><div class='add'>+                                      conf-&gt;cumulative.max_nr_opens);</div><div class='add'>+</div><div class='add'>+                gf_time_fmt_tv(timestr, sizeof timestr,</div><div class='add'>+                               &amp;conf-&gt;cumulative.max_openfd_time,</div><div class='add'>+                               gf_timefmt_FT);</div><div class='add'>+</div><div class='add'>+                dict_timestr = gf_strdup(timestr);</div><div class='add'>+                if (!dict_timestr)</div><div class='add'>+                    goto unlock;</div><div class='add'>+                ret = dict_set_dynstr(resp, "max-openfd-time", dict_timestr);</div><div class='add'>+                if (ret)</div><div class='add'>+                    goto unlock;</div><div class='add'>+            }</div><div class='add'>+        unlock:</div><div class='add'>+            UNLOCK(&amp;conf-&gt;lock);</div><div class='add'>+            /* Do not proceed if we came here because of some error</div><div class='add'>+             * during the dict operation */</div><div class='add'>+            if (ret)</div><div class='add'>+                goto out;</div><div class='add'>+            break;</div><div class='add'>+        case IOS_STATS_TYPE_READ:</div><div class='add'>+            list_head = &amp;conf-&gt;list[IOS_STATS_TYPE_READ];</div><div class='add'>+            break;</div><div class='add'>+        case IOS_STATS_TYPE_WRITE:</div><div class='add'>+            list_head = &amp;conf-&gt;list[IOS_STATS_TYPE_WRITE];</div><div class='add'>+            break;</div><div class='add'>+        case IOS_STATS_TYPE_OPENDIR:</div><div class='add'>+            list_head = &amp;conf-&gt;list[IOS_STATS_TYPE_OPENDIR];</div><div class='add'>+            break;</div><div class='add'>+        case IOS_STATS_TYPE_READDIRP:</div><div class='add'>+            list_head = &amp;conf-&gt;list[IOS_STATS_TYPE_READDIRP];</div><div class='add'>+            break;</div><div class='add'>+        case IOS_STATS_TYPE_READ_THROUGHPUT:</div><div class='add'>+            list_head = &amp;conf-&gt;thru_list[IOS_STATS_THRU_READ];</div><div class='add'>+            index = IOS_STATS_THRU_READ;</div><div class='add'>+            break;</div><div class='add'>+        case IOS_STATS_TYPE_WRITE_THROUGHPUT:</div><div class='add'>+            list_head = &amp;conf-&gt;thru_list[IOS_STATS_THRU_WRITE];</div><div class='add'>+            index = IOS_STATS_THRU_WRITE;</div><div class='add'>+            break;</div><div class='add'>+</div><div class='add'>+        default:</div><div class='add'>+            goto out;</div><div class='add'>+    }</div><div class='add'>+    ret = dict_set_int32_sizen(resp, "top-op", flags);</div><div class='add'>+    if (!list_cnt)</div><div class='add'>+        goto out;</div><div class='add'>+    LOCK(&amp;list_head-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        list_for_each_entry(entry, &amp;list_head-&gt;iosstats-&gt;list, list)</div><div class='add'>+        {</div><div class='add'>+            cnt++;</div><div class='add'>+            keylen = snprintf(key, sizeof(key), "filename-%d", cnt);</div><div class='add'>+            ret = dict_set_strn(resp, key, keylen, entry-&gt;iosstat-&gt;filename);</div><div class='add'>+            if (ret)</div><div class='add'>+                goto unlock_list_head;</div><div class='add'>+            snprintf(key, sizeof(key), "value-%d", cnt);</div><div class='add'>+            ret = dict_set_uint64(resp, key, entry-&gt;value);</div><div class='add'>+            if (ret)</div><div class='add'>+                goto unlock_list_head;</div><div class='add'>+            if (index != IOS_STATS_THRU_MAX) {</div><div class='add'>+                keylen = snprintf(key, sizeof(key), "time-sec-%d", cnt);</div><div class='add'>+                ret = dict_set_int32n(</div><div class='add'>+                    resp, key, keylen,</div><div class='add'>+                    entry-&gt;iosstat-&gt;thru_counters[index].time.tv_sec);</div><div class='add'>+                if (ret)</div><div class='add'>+                    goto unlock_list_head;</div><div class='add'>+                keylen = snprintf(key, sizeof(key), "time-usec-%d", cnt);</div><div class='add'>+                ret = dict_set_int32n(</div><div class='add'>+                    resp, key, keylen,</div><div class='add'>+                    entry-&gt;iosstat-&gt;thru_counters[index].time.tv_usec);</div><div class='add'>+                if (ret)</div><div class='add'>+                    goto unlock_list_head;</div><div class='add'>+            }</div><div class='add'>+            if (cnt == list_cnt)</div><div class='add'>+                break;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+unlock_list_head:</div><div class='add'>+    UNLOCK(&amp;list_head-&gt;lock);</div><div class='add'>+    /* ret is !=0 if some dict operation in the above critical region</div><div class='add'>+     * failed. */</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+    ret = dict_set_int32_sizen(resp, "members", cnt);</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+static struct ios_stat *</div><div class='add'>+ios_init_iosstat(xlator_t *this, char *path, uuid_t gfid, inode_t *inode)</div><div class='add'>+{</div><div class='add'>+    struct ios_stat *iosstat = NULL;</div><div class='add'>+    int i = 0;</div><div class='add'>+</div><div class='add'>+    iosstat = GF_CALLOC(1, sizeof(*iosstat), gf_io_stats_mt_ios_stat);</div><div class='add'>+    if (!iosstat)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    iosstat-&gt;filename = gf_strdup(path);</div><div class='add'>+    gf_uuid_copy(iosstat-&gt;gfid, gfid);</div><div class='add'>+    LOCK_INIT(&amp;iosstat-&gt;lock);</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; IOS_STATS_TYPE_MAX; i++)</div><div class='add'>+        GF_ATOMIC_INIT(iosstat-&gt;counters[i], 0);</div><div class='add'>+</div><div class='add'>+    ios_inode_ctx_set(inode, this, iosstat);</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return iosstat;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-io_stats_fsync_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-                    int32_t op_ret, int32_t op_errno,</div><div class='del'>-                    struct iatt *prebuf, struct iatt *postbuf)</div><div class='add'>+io_stats_create_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                    int32_t op_ret, int32_t op_errno, fd_t *fd, inode_t *inode,</div><div class='add'>+                    struct iatt *buf, struct iatt *preparent,</div><div class='add'>+                    struct iatt *postparent, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-        STACK_UNWIND_STRICT (fsync, frame, op_ret, op_errno, prebuf, postbuf);</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='add'>+    struct ios_fd *iosfd = NULL;</div><div class='add'>+    char *path = NULL;</div><div class='add'>+    struct ios_stat *iosstat = NULL;</div><div class='add'>+    struct ios_conf *conf = NULL;</div><div class='add'>+</div><div class='add'>+    conf = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    path = frame-&gt;local;</div><div class='add'>+    frame-&gt;local = NULL;</div><div class='add'>+</div><div class='add'>+    if (!path)</div><div class='add'>+        goto unwind;</div><div class='add'>+</div><div class='add'>+    if (op_ret &lt; 0) {</div><div class='add'>+        GF_FREE(path);</div><div class='add'>+        goto unwind;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    iosfd = GF_CALLOC(1, sizeof(*iosfd), gf_io_stats_mt_ios_fd);</div><div class='add'>+    if (!iosfd) {</div><div class='add'>+        GF_FREE(path);</div><div class='add'>+        goto unwind;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    iosfd-&gt;filename = path;</div><div class='add'>+    gettimeofday(&amp;iosfd-&gt;opened_at, NULL);</div><div class='add'>+</div><div class='add'>+    ios_fd_ctx_set(fd, this, iosfd);</div><div class='add'>+    LOCK(&amp;conf-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        conf-&gt;cumulative.nr_opens++;</div><div class='add'>+        if (conf-&gt;cumulative.nr_opens &gt; conf-&gt;cumulative.max_nr_opens) {</div><div class='add'>+            conf-&gt;cumulative.max_nr_opens = conf-&gt;cumulative.nr_opens;</div><div class='add'>+            conf-&gt;cumulative.max_openfd_time = iosfd-&gt;opened_at;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    UNLOCK(&amp;conf-&gt;lock);</div><div class='add'>+</div><div class='add'>+    iosstat = ios_init_iosstat(this, path, buf-&gt;ia_gfid, inode);</div><div class='add'>+    if (!iosstat)</div><div class='add'>+        GF_FREE(path);</div><div class='ctx'> </div><div class='add'>+unwind:</div><div class='add'>+    UPDATE_PROFILE_STATS(frame, CREATE);</div><div class='add'>+    STACK_UNWIND_STRICT(create, frame, op_ret, op_errno, fd, inode, buf,</div><div class='add'>+                        preparent, postparent, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-io_stats_setattr_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-                      int32_t op_ret, int32_t op_errno,</div><div class='del'>-                      struct iatt *preop, struct iatt *postop)</div><div class='add'>+io_stats_open_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                  int32_t op_ret, int32_t op_errno, fd_t *fd, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-        STACK_UNWIND_STRICT (setattr, frame, op_ret, op_errno, preop, postop);</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='add'>+    struct ios_fd *iosfd = NULL;</div><div class='add'>+    char *path = NULL;</div><div class='add'>+    struct ios_stat *iosstat = NULL;</div><div class='add'>+    struct ios_conf *conf = NULL;</div><div class='add'>+    int i = 0;</div><div class='add'>+</div><div class='add'>+    conf = this-&gt;private;</div><div class='add'>+    path = frame-&gt;local;</div><div class='add'>+    frame-&gt;local = NULL;</div><div class='add'>+</div><div class='add'>+    if (!path)</div><div class='add'>+        goto unwind;</div><div class='add'>+</div><div class='add'>+    if (op_ret &lt; 0) {</div><div class='add'>+        GF_FREE(path);</div><div class='add'>+        goto unwind;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    iosfd = GF_CALLOC(1, sizeof(*iosfd), gf_io_stats_mt_ios_fd);</div><div class='add'>+    if (!iosfd) {</div><div class='add'>+        GF_FREE(path);</div><div class='add'>+        goto unwind;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    iosfd-&gt;filename = path;</div><div class='add'>+    GF_ATOMIC_INIT(iosfd-&gt;data_read, 0);</div><div class='add'>+    GF_ATOMIC_INIT(iosfd-&gt;data_written, 0);</div><div class='add'>+    for (i = 0; i &lt; IOS_BLOCK_COUNT_SIZE; i++) {</div><div class='add'>+        GF_ATOMIC_INIT(iosfd-&gt;block_count_write[i], 0);</div><div class='add'>+        GF_ATOMIC_INIT(iosfd-&gt;block_count_read[i], 0);</div><div class='add'>+    }</div><div class='add'>+    gettimeofday(&amp;iosfd-&gt;opened_at, NULL);</div><div class='add'>+</div><div class='add'>+    ios_fd_ctx_set(fd, this, iosfd);</div><div class='add'>+</div><div class='add'>+    ios_inode_ctx_get(fd-&gt;inode, this, &amp;iosstat);</div><div class='add'>+    if (!iosstat) {</div><div class='add'>+        iosstat = ios_init_iosstat(this, path, fd-&gt;inode-&gt;gfid, fd-&gt;inode);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;conf-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        conf-&gt;cumulative.nr_opens++;</div><div class='add'>+        if (conf-&gt;cumulative.nr_opens &gt; conf-&gt;cumulative.max_nr_opens) {</div><div class='add'>+            conf-&gt;cumulative.max_nr_opens = conf-&gt;cumulative.nr_opens;</div><div class='add'>+            conf-&gt;cumulative.max_openfd_time = iosfd-&gt;opened_at;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    UNLOCK(&amp;conf-&gt;lock);</div><div class='add'>+    if (iosstat) {</div><div class='add'>+        ios_bump_stats(this, iosstat, IOS_STATS_TYPE_OPEN);</div><div class='add'>+        iosstat = NULL;</div><div class='add'>+    }</div><div class='add'>+unwind:</div><div class='add'>+    UPDATE_PROFILE_STATS(frame, OPEN);</div><div class='ctx'> </div><div class='add'>+    STACK_UNWIND_STRICT(open, frame, op_ret, op_errno, fd, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-io_stats_unlink_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-                     int32_t op_ret, int32_t op_errno,</div><div class='del'>-                     struct iatt *preparent, struct iatt *postparent)</div><div class='add'>+io_stats_stat_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                  int32_t op_ret, int32_t op_errno, struct iatt *buf,</div><div class='add'>+                  dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-        STACK_UNWIND_STRICT (unlink, frame, op_ret, op_errno,</div><div class='del'>-                             preparent, postparent);</div><div class='del'>-        return 0;</div><div class='add'>+    UPDATE_PROFILE_STATS(frame, STAT);</div><div class='add'>+    STACK_UNWIND_STRICT(stat, frame, op_ret, op_errno, buf, xdata);</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-io_stats_rename_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-                     int32_t op_ret, int32_t op_errno, struct iatt *buf,</div><div class='del'>-                     struct iatt *preoldparent, struct iatt *postoldparent,</div><div class='del'>-                     struct iatt *prenewparent, struct iatt *postnewparent)</div><div class='add'>+io_stats_readv_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                   int32_t op_ret, int32_t op_errno, struct iovec *vector,</div><div class='add'>+                   int32_t count, struct iatt *buf, struct iobref *iobref,</div><div class='add'>+                   dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-        STACK_UNWIND_STRICT (rename, frame, op_ret, op_errno, buf,</div><div class='del'>-                             preoldparent, postoldparent,</div><div class='del'>-                             prenewparent, postnewparent);</div><div class='del'>-        return 0;</div><div class='add'>+    int len = 0;</div><div class='add'>+    fd_t *fd = NULL;</div><div class='add'>+    struct ios_stat *iosstat = NULL;</div><div class='add'>+</div><div class='add'>+    fd = frame-&gt;local;</div><div class='add'>+    frame-&gt;local = NULL;</div><div class='add'>+</div><div class='add'>+    if (op_ret &gt; 0) {</div><div class='add'>+        len = iov_length(vector, count);</div><div class='add'>+        ios_bump_read(this, fd, len);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    UPDATE_PROFILE_STATS(frame, READ);</div><div class='add'>+    ios_inode_ctx_get(fd-&gt;inode, this, &amp;iosstat);</div><div class='add'>+</div><div class='add'>+    if (iosstat) {</div><div class='add'>+        ios_bump_stats(this, iosstat, IOS_STATS_TYPE_READ);</div><div class='add'>+        BUMP_THROUGHPUT(iosstat, IOS_STATS_THRU_READ);</div><div class='add'>+        iosstat = NULL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    STACK_UNWIND_STRICT(readv, frame, op_ret, op_errno, vector, count, buf,</div><div class='add'>+                        iobref, xdata);</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+int</div><div class='add'>+io_stats_writev_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                    int32_t op_ret, int32_t op_errno, struct iatt *prebuf,</div><div class='add'>+                    struct iatt *postbuf, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    struct ios_stat *iosstat = NULL;</div><div class='add'>+    inode_t *inode = NULL;</div><div class='add'>+</div><div class='add'>+    UPDATE_PROFILE_STATS(frame, WRITE);</div><div class='add'>+    if (frame-&gt;local) {</div><div class='add'>+        inode = frame-&gt;local;</div><div class='add'>+        frame-&gt;local = NULL;</div><div class='add'>+        ios_inode_ctx_get(inode, this, &amp;iosstat);</div><div class='add'>+        if (iosstat) {</div><div class='add'>+            ios_bump_stats(this, iosstat, IOS_STATS_TYPE_WRITE);</div><div class='add'>+            BUMP_THROUGHPUT(iosstat, IOS_STATS_THRU_WRITE);</div><div class='add'>+            inode = NULL;</div><div class='add'>+            iosstat = NULL;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    STACK_UNWIND_STRICT(writev, frame, op_ret, op_errno, prebuf, postbuf,</div><div class='add'>+                        xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-io_stats_readlink_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-                       int32_t op_ret, int32_t op_errno, const char *buf,</div><div class='del'>-                       struct iatt *sbuf)</div><div class='add'>+io_stats_copy_file_range_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                             int32_t op_ret, int32_t op_errno,</div><div class='add'>+                             struct iatt *stbuf, struct iatt *prebuf_dst,</div><div class='add'>+                             struct iatt *postbuf_dst, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-        STACK_UNWIND_STRICT (readlink, frame, op_ret, op_errno, buf, sbuf);</div><div class='del'>-        return 0;</div><div class='add'>+    UPDATE_PROFILE_STATS(frame, COPY_FILE_RANGE);</div><div class='add'>+</div><div class='add'>+    STACK_UNWIND_STRICT(copy_file_range, frame, op_ret, op_errno, stbuf,</div><div class='add'>+                        prebuf_dst, postbuf_dst, xdata);</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+int</div><div class='add'>+io_stats_readdirp_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                      int32_t op_ret, int32_t op_errno, gf_dirent_t *buf,</div><div class='add'>+                      dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    struct ios_stat *iosstat = NULL;</div><div class='add'>+    inode_t *inode = frame-&gt;local;</div><div class='add'>+</div><div class='add'>+    frame-&gt;local = NULL;</div><div class='add'>+</div><div class='add'>+    UPDATE_PROFILE_STATS(frame, READDIRP);</div><div class='add'>+</div><div class='add'>+    ios_inode_ctx_get(inode, this, &amp;iosstat);</div><div class='add'>+</div><div class='add'>+    if (iosstat) {</div><div class='add'>+        ios_bump_stats(this, iosstat, IOS_STATS_TYPE_READDIRP);</div><div class='add'>+        iosstat = NULL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    STACK_UNWIND_STRICT(readdirp, frame, op_ret, op_errno, buf, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-io_stats_lookup_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-                     int32_t op_ret, int32_t op_errno,</div><div class='del'>-                     inode_t *inode, struct iatt *buf,</div><div class='del'>-                     dict_t *xattr, struct iatt *postparent)</div><div class='add'>+io_stats_readdir_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                     int32_t op_ret, int32_t op_errno, gf_dirent_t *buf,</div><div class='add'>+                     dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-        STACK_UNWIND_STRICT (lookup, frame, op_ret, op_errno, inode, buf, xattr,</div><div class='del'>-                             postparent);</div><div class='del'>-        return 0;</div><div class='add'>+    UPDATE_PROFILE_STATS(frame, READDIR);</div><div class='add'>+    STACK_UNWIND_STRICT(readdir, frame, op_ret, op_errno, buf, xdata);</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+int</div><div class='add'>+io_stats_fsync_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                   int32_t op_ret, int32_t op_errno, struct iatt *prebuf,</div><div class='add'>+                   struct iatt *postbuf, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    UPDATE_PROFILE_STATS(frame, FSYNC);</div><div class='add'>+    STACK_UNWIND_STRICT(fsync, frame, op_ret, op_errno, prebuf, postbuf, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-io_stats_symlink_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-                      int32_t op_ret, int32_t op_errno,</div><div class='del'>-                      inode_t *inode, struct iatt *buf,</div><div class='del'>-                      struct iatt *preparent, struct iatt *postparent)</div><div class='add'>+io_stats_setattr_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                     int32_t op_ret, int32_t op_errno, struct iatt *preop,</div><div class='add'>+                     struct iatt *postop, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-        STACK_UNWIND_STRICT (symlink, frame, op_ret, op_errno, inode, buf,</div><div class='del'>-                             preparent, postparent);</div><div class='del'>-        return 0;</div><div class='add'>+    UPDATE_PROFILE_STATS(frame, SETATTR);</div><div class='add'>+    STACK_UNWIND_STRICT(setattr, frame, op_ret, op_errno, preop, postop, xdata);</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+int</div><div class='add'>+io_stats_unlink_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                    int32_t op_ret, int32_t op_errno, struct iatt *preparent,</div><div class='add'>+                    struct iatt *postparent, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    UPDATE_PROFILE_STATS(frame, UNLINK);</div><div class='add'>+    STACK_UNWIND_STRICT(unlink, frame, op_ret, op_errno, preparent, postparent,</div><div class='add'>+                        xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-io_stats_mknod_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-                    int32_t op_ret, int32_t op_errno,</div><div class='del'>-                    inode_t *inode, struct iatt *buf,</div><div class='del'>-                    struct iatt *preparent, struct iatt *postparent)</div><div class='add'>+io_stats_rename_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                    int32_t op_ret, int32_t op_errno, struct iatt *buf,</div><div class='add'>+                    struct iatt *preoldparent, struct iatt *postoldparent,</div><div class='add'>+                    struct iatt *prenewparent, struct iatt *postnewparent,</div><div class='add'>+                    dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-        STACK_UNWIND_STRICT (mknod, frame, op_ret, op_errno, inode, buf,</div><div class='del'>-                             preparent, postparent);</div><div class='del'>-        return 0;</div><div class='add'>+    UPDATE_PROFILE_STATS(frame, RENAME);</div><div class='add'>+    STACK_UNWIND_STRICT(rename, frame, op_ret, op_errno, buf, preoldparent,</div><div class='add'>+                        postoldparent, prenewparent, postnewparent, xdata);</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+int</div><div class='add'>+io_stats_readlink_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                      int32_t op_ret, int32_t op_errno, const char *buf,</div><div class='add'>+                      struct iatt *sbuf, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    UPDATE_PROFILE_STATS(frame, READLINK);</div><div class='add'>+    STACK_UNWIND_STRICT(readlink, frame, op_ret, op_errno, buf, sbuf, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-io_stats_mkdir_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-                    int32_t op_ret, int32_t op_errno,</div><div class='del'>-                    inode_t *inode, struct iatt *buf,</div><div class='del'>-                    struct iatt *preparent, struct iatt *postparent)</div><div class='add'>+io_stats_lookup_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                    int32_t op_ret, int32_t op_errno, inode_t *inode,</div><div class='add'>+                    struct iatt *buf, dict_t *xdata, struct iatt *postparent)</div><div class='ctx'> {</div><div class='del'>-        STACK_UNWIND_STRICT (mkdir, frame, op_ret, op_errno, inode, buf,</div><div class='del'>-                             preparent, postparent);</div><div class='del'>-        return 0;</div><div class='add'>+    UPDATE_PROFILE_STATS(frame, LOOKUP);</div><div class='add'>+    STACK_UNWIND_STRICT(lookup, frame, op_ret, op_errno, inode, buf, xdata,</div><div class='add'>+                        postparent);</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+int</div><div class='add'>+io_stats_symlink_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                     int32_t op_ret, int32_t op_errno, inode_t *inode,</div><div class='add'>+                     struct iatt *buf, struct iatt *preparent,</div><div class='add'>+                     struct iatt *postparent, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    UPDATE_PROFILE_STATS(frame, SYMLINK);</div><div class='add'>+    STACK_UNWIND_STRICT(symlink, frame, op_ret, op_errno, inode, buf, preparent,</div><div class='add'>+                        postparent, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-io_stats_link_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-                   int32_t op_ret, int32_t op_errno,</div><div class='del'>-                   inode_t *inode, struct iatt *buf,</div><div class='del'>-                   struct iatt *preparent, struct iatt *postparent)</div><div class='add'>+io_stats_mknod_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                   int32_t op_ret, int32_t op_errno, inode_t *inode,</div><div class='add'>+                   struct iatt *buf, struct iatt *preparent,</div><div class='add'>+                   struct iatt *postparent, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-        STACK_UNWIND_STRICT (link, frame, op_ret, op_errno, inode, buf,</div><div class='del'>-                             preparent, postparent);</div><div class='del'>-        return 0;</div><div class='add'>+    UPDATE_PROFILE_STATS(frame, MKNOD);</div><div class='add'>+    STACK_UNWIND_STRICT(mknod, frame, op_ret, op_errno, inode, buf, preparent,</div><div class='add'>+                        postparent, xdata);</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+int</div><div class='add'>+io_stats_mkdir_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                   int32_t op_ret, int32_t op_errno, inode_t *inode,</div><div class='add'>+                   struct iatt *buf, struct iatt *preparent,</div><div class='add'>+                   struct iatt *postparent, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    char *path = frame-&gt;local;</div><div class='add'>+</div><div class='add'>+    if (!path)</div><div class='add'>+        goto unwind;</div><div class='add'>+</div><div class='add'>+    UPDATE_PROFILE_STATS(frame, MKDIR);</div><div class='add'>+    if (op_ret &lt; 0)</div><div class='add'>+        goto unwind;</div><div class='add'>+</div><div class='add'>+    /* allocate a struct ios_stat and set the inode ctx */</div><div class='add'>+    ios_init_iosstat(this, path, buf-&gt;ia_gfid, inode);</div><div class='add'>+</div><div class='add'>+unwind:</div><div class='add'>+    /* local is assigned with path */</div><div class='add'>+    GF_FREE(frame-&gt;local);</div><div class='add'>+    frame-&gt;local = NULL;</div><div class='add'>+    STACK_UNWIND_STRICT(mkdir, frame, op_ret, op_errno, inode, buf, preparent,</div><div class='add'>+                        postparent, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-io_stats_flush_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-                    int32_t op_ret, int32_t op_errno)</div><div class='add'>+io_stats_link_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                  int32_t op_ret, int32_t op_errno, inode_t *inode,</div><div class='add'>+                  struct iatt *buf, struct iatt *preparent,</div><div class='add'>+                  struct iatt *postparent, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-        STACK_UNWIND_STRICT (flush, frame, op_ret, op_errno);</div><div class='del'>-        return 0;</div><div class='add'>+    UPDATE_PROFILE_STATS(frame, LINK);</div><div class='add'>+    STACK_UNWIND_STRICT(link, frame, op_ret, op_errno, inode, buf, preparent,</div><div class='add'>+                        postparent, xdata);</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+int</div><div class='add'>+io_stats_flush_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                   int32_t op_ret, int32_t op_errno, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    UPDATE_PROFILE_STATS(frame, FLUSH);</div><div class='add'>+    STACK_UNWIND_STRICT(flush, frame, op_ret, op_errno, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-io_stats_opendir_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-                      int32_t op_ret, int32_t op_errno, fd_t *fd)</div><div class='add'>+io_stats_opendir_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                     int32_t op_ret, int32_t op_errno, fd_t *fd, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-        if (op_ret &gt;= 0)</div><div class='del'>-                ios_fd_ctx_set (fd, this, 0);</div><div class='add'>+    struct ios_stat *iosstat = NULL;</div><div class='add'>+    int ret = -1;</div><div class='ctx'> </div><div class='del'>-        STACK_UNWIND_STRICT (opendir, frame, op_ret, op_errno, fd);</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='add'>+    UPDATE_PROFILE_STATS(frame, OPENDIR);</div><div class='add'>+    if (op_ret &lt; 0)</div><div class='add'>+        goto unwind;</div><div class='add'>+</div><div class='add'>+    ios_fd_ctx_set(fd, this, 0);</div><div class='ctx'> </div><div class='add'>+    ret = ios_inode_ctx_get(fd-&gt;inode, this, &amp;iosstat);</div><div class='add'>+    if (!ret)</div><div class='add'>+        ios_bump_stats(this, iosstat, IOS_STATS_TYPE_OPENDIR);</div><div class='add'>+</div><div class='add'>+unwind:</div><div class='add'>+    STACK_UNWIND_STRICT(opendir, frame, op_ret, op_errno, fd, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-io_stats_rmdir_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-                    int32_t op_ret, int32_t op_errno,</div><div class='del'>-                    struct iatt *preparent, struct iatt *postparent)</div><div class='add'>+io_stats_rmdir_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                   int32_t op_ret, int32_t op_errno, struct iatt *preparent,</div><div class='add'>+                   struct iatt *postparent, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-        STACK_UNWIND_STRICT (rmdir, frame, op_ret, op_errno,</div><div class='del'>-                             preparent, postparent);</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='add'>+    UPDATE_PROFILE_STATS(frame, RMDIR);</div><div class='ctx'> </div><div class='add'>+    STACK_UNWIND_STRICT(rmdir, frame, op_ret, op_errno, preparent, postparent,</div><div class='add'>+                        xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-io_stats_truncate_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-                       int32_t op_ret, int32_t op_errno,</div><div class='del'>-                       struct iatt *prebuf, struct iatt *postbuf)</div><div class='add'>+io_stats_truncate_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                      int32_t op_ret, int32_t op_errno, struct iatt *prebuf,</div><div class='add'>+                      struct iatt *postbuf, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-        STACK_UNWIND_STRICT (truncate, frame, op_ret, op_errno,</div><div class='del'>-                             prebuf, postbuf);</div><div class='del'>-        return 0;</div><div class='add'>+    UPDATE_PROFILE_STATS(frame, TRUNCATE);</div><div class='add'>+    STACK_UNWIND_STRICT(truncate, frame, op_ret, op_errno, prebuf, postbuf,</div><div class='add'>+                        xdata);</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+int</div><div class='add'>+io_stats_statfs_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                    int32_t op_ret, int32_t op_errno, struct statvfs *buf,</div><div class='add'>+                    dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    UPDATE_PROFILE_STATS(frame, STATFS);</div><div class='add'>+    STACK_UNWIND_STRICT(statfs, frame, op_ret, op_errno, buf, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-io_stats_statfs_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-                     int32_t op_ret, int32_t op_errno, struct statvfs *buf)</div><div class='add'>+io_stats_setxattr_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                      int32_t op_ret, int32_t op_errno, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-        STACK_UNWIND_STRICT (statfs, frame, op_ret, op_errno, buf);</div><div class='del'>-        return 0;</div><div class='add'>+    UPDATE_PROFILE_STATS(frame, SETXATTR);</div><div class='add'>+    STACK_UNWIND_STRICT(setxattr, frame, op_ret, op_errno, xdata);</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+int</div><div class='add'>+io_stats_getxattr_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                      int32_t op_ret, int32_t op_errno, dict_t *dict,</div><div class='add'>+                      dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    UPDATE_PROFILE_STATS(frame, GETXATTR);</div><div class='add'>+    STACK_UNWIND_STRICT(getxattr, frame, op_ret, op_errno, dict, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-io_stats_setxattr_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-                       int32_t op_ret, int32_t op_errno)</div><div class='add'>+io_stats_removexattr_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                         int32_t op_ret, int32_t op_errno, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-        STACK_UNWIND_STRICT (setxattr, frame, op_ret, op_errno);</div><div class='del'>-        return 0;</div><div class='add'>+    UPDATE_PROFILE_STATS(frame, REMOVEXATTR);</div><div class='add'>+    STACK_UNWIND_STRICT(removexattr, frame, op_ret, op_errno, xdata);</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+int</div><div class='add'>+io_stats_fsetxattr_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                       int32_t op_ret, int32_t op_errno, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    UPDATE_PROFILE_STATS(frame, FSETXATTR);</div><div class='add'>+    STACK_UNWIND_STRICT(fsetxattr, frame, op_ret, op_errno, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-io_stats_getxattr_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-                       int32_t op_ret, int32_t op_errno, dict_t *dict)</div><div class='add'>+io_stats_fgetxattr_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                       int32_t op_ret, int32_t op_errno, dict_t *dict,</div><div class='add'>+                       dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-        STACK_UNWIND_STRICT (getxattr, frame, op_ret, op_errno, dict);</div><div class='del'>-        return 0;</div><div class='add'>+    UPDATE_PROFILE_STATS(frame, FGETXATTR);</div><div class='add'>+    STACK_UNWIND_STRICT(fgetxattr, frame, op_ret, op_errno, dict, xdata);</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+int</div><div class='add'>+io_stats_fremovexattr_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                          int32_t op_ret, int32_t op_errno, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    UPDATE_PROFILE_STATS(frame, FREMOVEXATTR);</div><div class='add'>+    STACK_UNWIND_STRICT(fremovexattr, frame, op_ret, op_errno, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-io_stats_removexattr_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-                          int32_t op_ret, int32_t op_errno)</div><div class='add'>+io_stats_fsyncdir_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                      int32_t op_ret, int32_t op_errno, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-        STACK_UNWIND_STRICT (removexattr, frame, op_ret, op_errno);</div><div class='del'>-        return 0;</div><div class='add'>+    UPDATE_PROFILE_STATS(frame, FSYNCDIR);</div><div class='add'>+    STACK_UNWIND_STRICT(fsyncdir, frame, op_ret, op_errno, xdata);</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+int</div><div class='add'>+io_stats_access_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                    int32_t op_ret, int32_t op_errno, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    UPDATE_PROFILE_STATS(frame, ACCESS);</div><div class='add'>+    STACK_UNWIND_STRICT(access, frame, op_ret, op_errno, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-io_stats_fsyncdir_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-                       int32_t op_ret, int32_t op_errno)</div><div class='add'>+io_stats_ftruncate_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                       int32_t op_ret, int32_t op_errno, struct iatt *prebuf,</div><div class='add'>+                       struct iatt *postbuf, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-        STACK_UNWIND_STRICT (fsyncdir, frame, op_ret, op_errno);</div><div class='del'>-        return 0;</div><div class='add'>+    UPDATE_PROFILE_STATS(frame, FTRUNCATE);</div><div class='add'>+    STACK_UNWIND_STRICT(ftruncate, frame, op_ret, op_errno, prebuf, postbuf,</div><div class='add'>+                        xdata);</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+int</div><div class='add'>+io_stats_fstat_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                   int32_t op_ret, int32_t op_errno, struct iatt *buf,</div><div class='add'>+                   dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    UPDATE_PROFILE_STATS(frame, FSTAT);</div><div class='add'>+    STACK_UNWIND_STRICT(fstat, frame, op_ret, op_errno, buf, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-io_stats_access_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-                     int32_t op_ret, int32_t op_errno)</div><div class='add'>+io_stats_fallocate_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                       int32_t op_ret, int32_t op_errno, struct iatt *prebuf,</div><div class='add'>+                       struct iatt *postbuf, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-        STACK_UNWIND_STRICT (access, frame, op_ret, op_errno);</div><div class='del'>-        return 0;</div><div class='add'>+    UPDATE_PROFILE_STATS(frame, FALLOCATE);</div><div class='add'>+    STACK_UNWIND_STRICT(fallocate, frame, op_ret, op_errno, prebuf, postbuf,</div><div class='add'>+                        xdata);</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+int</div><div class='add'>+io_stats_discard_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                     int32_t op_ret, int32_t op_errno, struct iatt *prebuf,</div><div class='add'>+                     struct iatt *postbuf, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    UPDATE_PROFILE_STATS(frame, DISCARD);</div><div class='add'>+    STACK_UNWIND_STRICT(discard, frame, op_ret, op_errno, prebuf, postbuf,</div><div class='add'>+                        xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-io_stats_ftruncate_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-                        int32_t op_ret, int32_t op_errno,</div><div class='del'>-                        struct iatt *prebuf, struct iatt *postbuf)</div><div class='add'>+io_stats_zerofill_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                      int32_t op_ret, int32_t op_errno, struct iatt *prebuf,</div><div class='add'>+                      struct iatt *postbuf, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-        STACK_UNWIND_STRICT (ftruncate, frame, op_ret, op_errno,</div><div class='del'>-                             prebuf, postbuf);</div><div class='del'>-        return 0;</div><div class='add'>+    UPDATE_PROFILE_STATS(frame, ZEROFILL);</div><div class='add'>+    STACK_UNWIND_STRICT(zerofill, frame, op_ret, op_errno, prebuf, postbuf,</div><div class='add'>+                        xdata);</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+int32_t</div><div class='add'>+io_stats_ipc_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                 int32_t op_ret, int32_t op_errno, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    UPDATE_PROFILE_STATS(frame, IPC);</div><div class='add'>+    STACK_UNWIND_STRICT(ipc, frame, op_ret, op_errno, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-io_stats_fstat_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-                    int32_t op_ret, int32_t op_errno, struct iatt *buf)</div><div class='add'>+io_stats_lk_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                int32_t op_ret, int32_t op_errno, struct gf_flock *lock,</div><div class='add'>+                dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-        STACK_UNWIND_STRICT (fstat, frame, op_ret, op_errno, buf);</div><div class='del'>-        return 0;</div><div class='add'>+    UPDATE_PROFILE_STATS(frame, LK);</div><div class='add'>+    STACK_UNWIND_STRICT(lk, frame, op_ret, op_errno, lock, xdata);</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+int</div><div class='add'>+io_stats_entrylk_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                     int32_t op_ret, int32_t op_errno, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    UPDATE_PROFILE_STATS(frame, ENTRYLK);</div><div class='add'>+    STACK_UNWIND_STRICT(entrylk, frame, op_ret, op_errno, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-io_stats_lk_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-                 int32_t op_ret, int32_t op_errno, struct flock *lock)</div><div class='add'>+io_stats_fentrylk_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                      int32_t op_ret, int32_t op_errno, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-        STACK_UNWIND_STRICT (lk, frame, op_ret, op_errno, lock);</div><div class='del'>-        return 0;</div><div class='add'>+    UPDATE_PROFILE_STATS(frame, FENTRYLK);</div><div class='add'>+    STACK_UNWIND_STRICT(fentrylk, frame, op_ret, op_errno, xdata);</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+int</div><div class='add'>+io_stats_rchecksum_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                       int32_t op_ret, int32_t op_errno, uint32_t weak_checksum,</div><div class='add'>+                       uint8_t *strong_checksum, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    UPDATE_PROFILE_STATS(frame, RCHECKSUM);</div><div class='add'>+    STACK_UNWIND_STRICT(rchecksum, frame, op_ret, op_errno, weak_checksum,</div><div class='add'>+                        strong_checksum, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-io_stats_entrylk_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-                      int32_t op_ret, int32_t op_errno)</div><div class='add'>+io_stats_seek_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                  int32_t op_ret, int32_t op_errno, off_t offset, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-        STACK_UNWIND_STRICT (entrylk, frame, op_ret, op_errno);</div><div class='del'>-        return 0;</div><div class='add'>+    UPDATE_PROFILE_STATS(frame, SEEK);</div><div class='add'>+    STACK_UNWIND_STRICT(seek, frame, op_ret, op_errno, offset, xdata);</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+int</div><div class='add'>+io_stats_lease_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                   int32_t op_ret, int32_t op_errno, struct gf_lease *lease,</div><div class='add'>+                   dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    UPDATE_PROFILE_STATS(frame, LEASE);</div><div class='add'>+    STACK_UNWIND_STRICT(lease, frame, op_ret, op_errno, lease, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-io_stats_xattrop_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-                      int32_t op_ret, int32_t op_errno, dict_t *dict)</div><div class='add'>+io_stats_getactivelk_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                         int32_t op_ret, int32_t op_errno,</div><div class='add'>+                         lock_migration_info_t *locklist, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-        STACK_UNWIND_STRICT (xattrop, frame, op_ret, op_errno, dict);</div><div class='del'>-        return 0;</div><div class='add'>+    UPDATE_PROFILE_STATS(frame, GETACTIVELK);</div><div class='add'>+    STACK_UNWIND_STRICT(getactivelk, frame, op_ret, op_errno, locklist, xdata);</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+int</div><div class='add'>+io_stats_setactivelk_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                         int32_t op_ret, int32_t op_errno, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    UPDATE_PROFILE_STATS(frame, SETACTIVELK);</div><div class='add'>+    STACK_UNWIND_STRICT(setactivelk, frame, op_ret, op_errno, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-io_stats_fxattrop_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-                       int32_t op_ret, int32_t op_errno, dict_t *dict)</div><div class='add'>+io_stats_compound_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                      int32_t op_ret, int32_t op_errno, void *data,</div><div class='add'>+                      dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-        STACK_UNWIND_STRICT (fxattrop, frame, op_ret, op_errno, dict);</div><div class='del'>-        return 0;</div><div class='add'>+    UPDATE_PROFILE_STATS(frame, COMPOUND);</div><div class='add'>+    STACK_UNWIND_STRICT(compound, frame, op_ret, op_errno, data, xdata);</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+int</div><div class='add'>+io_stats_xattrop_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                     int32_t op_ret, int32_t op_errno, dict_t *dict,</div><div class='add'>+                     dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    UPDATE_PROFILE_STATS(frame, XATTROP);</div><div class='add'>+    STACK_UNWIND_STRICT(xattrop, frame, op_ret, op_errno, dict, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-io_stats_inodelk_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-                      int32_t op_ret, int32_t op_errno)</div><div class='add'>+io_stats_fxattrop_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                      int32_t op_ret, int32_t op_errno, dict_t *dict,</div><div class='add'>+                      dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-        STACK_UNWIND_STRICT (inodelk, frame, op_ret, op_errno);</div><div class='del'>-        return 0;</div><div class='add'>+    UPDATE_PROFILE_STATS(frame, FXATTROP);</div><div class='add'>+    STACK_UNWIND_STRICT(fxattrop, frame, op_ret, op_errno, dict, xdata);</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+int</div><div class='add'>+io_stats_inodelk_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                     int32_t op_ret, int32_t op_errno, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    UPDATE_PROFILE_STATS(frame, INODELK);</div><div class='add'>+    STACK_UNWIND_STRICT(inodelk, frame, op_ret, op_errno, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-io_stats_entrylk (call_frame_t *frame, xlator_t *this,</div><div class='del'>-                  const char *volume, loc_t *loc, const char *basename,</div><div class='del'>-                  entrylk_cmd cmd, entrylk_type type)</div><div class='add'>+io_stats_entrylk(call_frame_t *frame, xlator_t *this, const char *volume,</div><div class='add'>+                 loc_t *loc, const char *basename, entrylk_cmd cmd,</div><div class='add'>+                 entrylk_type type, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-        BUMP_FOP (ENTRYLK);</div><div class='add'>+    START_FOP_LATENCY(frame);</div><div class='ctx'> </div><div class='del'>-        STACK_WIND (frame, io_stats_entrylk_cbk,</div><div class='del'>-                    FIRST_CHILD (this),</div><div class='del'>-                    FIRST_CHILD (this)-&gt;fops-&gt;entrylk,</div><div class='del'>-                    volume, loc, basename, cmd, type);</div><div class='del'>-        return 0;</div><div class='add'>+    STACK_WIND(frame, io_stats_entrylk_cbk, FIRST_CHILD(this),</div><div class='add'>+               FIRST_CHILD(this)-&gt;fops-&gt;entrylk, volume, loc, basename, cmd,</div><div class='add'>+               type, xdata);</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-io_stats_inodelk (call_frame_t *frame, xlator_t *this,</div><div class='del'>-                  const char *volume, loc_t *loc, int32_t cmd, struct flock *flock)</div><div class='add'>+io_stats_fentrylk(call_frame_t *frame, xlator_t *this, const char *volume,</div><div class='add'>+                  fd_t *fd, const char *basename, entrylk_cmd cmd,</div><div class='add'>+                  entrylk_type type, dict_t *xdata)</div><div class='ctx'> {</div><div class='add'>+    START_FOP_LATENCY(frame);</div><div class='ctx'> </div><div class='del'>-        BUMP_FOP (INODELK);</div><div class='del'>-</div><div class='del'>-        STACK_WIND (frame, io_stats_inodelk_cbk,</div><div class='del'>-                    FIRST_CHILD (this),</div><div class='del'>-                    FIRST_CHILD (this)-&gt;fops-&gt;inodelk,</div><div class='del'>-                    volume, loc, cmd, flock);</div><div class='del'>-        return 0;</div><div class='add'>+    STACK_WIND(frame, io_stats_fentrylk_cbk, FIRST_CHILD(this),</div><div class='add'>+               FIRST_CHILD(this)-&gt;fops-&gt;fentrylk, volume, fd, basename, cmd,</div><div class='add'>+               type, xdata);</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-io_stats_finodelk_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-                       int32_t op_ret, int32_t op_errno)</div><div class='add'>+io_stats_inodelk(call_frame_t *frame, xlator_t *this, const char *volume,</div><div class='add'>+                 loc_t *loc, int32_t cmd, struct gf_flock *flock, dict_t *xdata)</div><div class='ctx'> {</div><div class='add'>+    START_FOP_LATENCY(frame);</div><div class='ctx'> </div><div class='del'>-        STACK_UNWIND_STRICT (finodelk, frame, op_ret, op_errno);</div><div class='del'>-        return 0;</div><div class='add'>+    STACK_WIND(frame, io_stats_inodelk_cbk, FIRST_CHILD(this),</div><div class='add'>+               FIRST_CHILD(this)-&gt;fops-&gt;inodelk, volume, loc, cmd, flock,</div><div class='add'>+               xdata);</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+int</div><div class='add'>+io_stats_finodelk_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                      int32_t op_ret, int32_t op_errno, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    UPDATE_PROFILE_STATS(frame, FINODELK);</div><div class='add'>+    STACK_UNWIND_STRICT(finodelk, frame, op_ret, op_errno, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-io_stats_finodelk (call_frame_t *frame, xlator_t *this,</div><div class='del'>-                   const char *volume, fd_t *fd, int32_t cmd, struct flock *flock)</div><div class='add'>+io_stats_finodelk(call_frame_t *frame, xlator_t *this, const char *volume,</div><div class='add'>+                  fd_t *fd, int32_t cmd, struct gf_flock *flock, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-        BUMP_FOP (FINODELK);</div><div class='add'>+    START_FOP_LATENCY(frame);</div><div class='ctx'> </div><div class='del'>-        STACK_WIND (frame, io_stats_finodelk_cbk,</div><div class='del'>-                    FIRST_CHILD (this),</div><div class='del'>-                    FIRST_CHILD (this)-&gt;fops-&gt;finodelk,</div><div class='del'>-                    volume, fd, cmd, flock);</div><div class='del'>-        return 0;</div><div class='add'>+    STACK_WIND(frame, io_stats_finodelk_cbk, FIRST_CHILD(this),</div><div class='add'>+               FIRST_CHILD(this)-&gt;fops-&gt;finodelk, volume, fd, cmd, flock,</div><div class='add'>+               xdata);</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-io_stats_xattrop (call_frame_t *frame, xlator_t *this,</div><div class='del'>-                  loc_t *loc, gf_xattrop_flags_t flags, dict_t *dict)</div><div class='add'>+io_stats_xattrop(call_frame_t *frame, xlator_t *this, loc_t *loc,</div><div class='add'>+                 gf_xattrop_flags_t flags, dict_t *dict, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-        BUMP_FOP (XATTROP);</div><div class='add'>+    START_FOP_LATENCY(frame);</div><div class='ctx'> </div><div class='del'>-        STACK_WIND (frame, io_stats_xattrop_cbk,</div><div class='del'>-                    FIRST_CHILD(this),</div><div class='del'>-                    FIRST_CHILD(this)-&gt;fops-&gt;xattrop,</div><div class='del'>-                    loc, flags, dict);</div><div class='del'>-</div><div class='del'>-        return 0;</div><div class='add'>+    STACK_WIND(frame, io_stats_xattrop_cbk, FIRST_CHILD(this),</div><div class='add'>+               FIRST_CHILD(this)-&gt;fops-&gt;xattrop, loc, flags, dict, xdata);</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-io_stats_fxattrop (call_frame_t *frame, xlator_t *this,</div><div class='del'>-                   fd_t *fd, gf_xattrop_flags_t flags, dict_t *dict)</div><div class='add'>+io_stats_fxattrop(call_frame_t *frame, xlator_t *this, fd_t *fd,</div><div class='add'>+                  gf_xattrop_flags_t flags, dict_t *dict, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-        BUMP_FOP (FXATTROP);</div><div class='del'>-</div><div class='del'>-        STACK_WIND (frame, io_stats_fxattrop_cbk,</div><div class='del'>-                    FIRST_CHILD(this),</div><div class='del'>-                    FIRST_CHILD(this)-&gt;fops-&gt;fxattrop,</div><div class='del'>-                    fd, flags, dict);</div><div class='add'>+    START_FOP_LATENCY(frame);</div><div class='ctx'> </div><div class='del'>-        return 0;</div><div class='add'>+    STACK_WIND(frame, io_stats_fxattrop_cbk, FIRST_CHILD(this),</div><div class='add'>+               FIRST_CHILD(this)-&gt;fops-&gt;fxattrop, fd, flags, dict, xdata);</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-io_stats_lookup (call_frame_t *frame, xlator_t *this,</div><div class='del'>-                 loc_t *loc, dict_t *xattr_req)</div><div class='add'>+io_stats_lookup(call_frame_t *frame, xlator_t *this, loc_t *loc, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-        BUMP_FOP (LOOKUP);</div><div class='add'>+    START_FOP_LATENCY(frame);</div><div class='ctx'> </div><div class='del'>-        STACK_WIND (frame, io_stats_lookup_cbk,</div><div class='del'>-                    FIRST_CHILD(this),</div><div class='del'>-                    FIRST_CHILD(this)-&gt;fops-&gt;lookup,</div><div class='del'>-                    loc, xattr_req);</div><div class='del'>-</div><div class='del'>-        return 0;</div><div class='add'>+    STACK_WIND(frame, io_stats_lookup_cbk, FIRST_CHILD(this),</div><div class='add'>+               FIRST_CHILD(this)-&gt;fops-&gt;lookup, loc, xdata);</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-io_stats_stat (call_frame_t *frame, xlator_t *this, loc_t *loc)</div><div class='add'>+io_stats_stat(call_frame_t *frame, xlator_t *this, loc_t *loc, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-        BUMP_FOP (STAT);</div><div class='del'>-</div><div class='del'>-        STACK_WIND (frame, io_stats_stat_cbk,</div><div class='del'>-                    FIRST_CHILD(this),</div><div class='del'>-                    FIRST_CHILD(this)-&gt;fops-&gt;stat,</div><div class='del'>-                    loc);</div><div class='add'>+    START_FOP_LATENCY(frame);</div><div class='ctx'> </div><div class='del'>-        return 0;</div><div class='add'>+    STACK_WIND(frame, io_stats_stat_cbk, FIRST_CHILD(this),</div><div class='add'>+               FIRST_CHILD(this)-&gt;fops-&gt;stat, loc, xdata);</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-io_stats_readlink (call_frame_t *frame, xlator_t *this,</div><div class='del'>-                   loc_t *loc, size_t size)</div><div class='add'>+io_stats_readlink(call_frame_t *frame, xlator_t *this, loc_t *loc, size_t size,</div><div class='add'>+                  dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-        BUMP_FOP (READLINK);</div><div class='add'>+    START_FOP_LATENCY(frame);</div><div class='ctx'> </div><div class='del'>-        STACK_WIND (frame, io_stats_readlink_cbk,</div><div class='del'>-                    FIRST_CHILD(this),</div><div class='del'>-                    FIRST_CHILD(this)-&gt;fops-&gt;readlink,</div><div class='del'>-                    loc, size);</div><div class='del'>-</div><div class='del'>-        return 0;</div><div class='add'>+    STACK_WIND(frame, io_stats_readlink_cbk, FIRST_CHILD(this),</div><div class='add'>+               FIRST_CHILD(this)-&gt;fops-&gt;readlink, loc, size, xdata);</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+int</div><div class='add'>+io_stats_mknod(call_frame_t *frame, xlator_t *this, loc_t *loc, mode_t mode,</div><div class='add'>+               dev_t dev, mode_t umask, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    START_FOP_LATENCY(frame);</div><div class='add'>+</div><div class='add'>+    STACK_WIND(frame, io_stats_mknod_cbk, FIRST_CHILD(this),</div><div class='add'>+               FIRST_CHILD(this)-&gt;fops-&gt;mknod, loc, mode, dev, umask, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-io_stats_mknod (call_frame_t *frame, xlator_t *this,</div><div class='del'>-                loc_t *loc, mode_t mode, dev_t dev, dict_t *params)</div><div class='add'>+io_stats_mkdir(call_frame_t *frame, xlator_t *this, loc_t *loc, mode_t mode,</div><div class='add'>+               mode_t umask, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-        BUMP_FOP (MKNOD);</div><div class='add'>+    if (loc-&gt;path)</div><div class='add'>+        frame-&gt;local = gf_strdup(loc-&gt;path);</div><div class='ctx'> </div><div class='del'>-        STACK_WIND (frame, io_stats_mknod_cbk,</div><div class='del'>-                    FIRST_CHILD(this),</div><div class='del'>-                    FIRST_CHILD(this)-&gt;fops-&gt;mknod,</div><div class='del'>-                    loc, mode, dev, params);</div><div class='add'>+    START_FOP_LATENCY(frame);</div><div class='ctx'> </div><div class='del'>-        return 0;</div><div class='add'>+    STACK_WIND(frame, io_stats_mkdir_cbk, FIRST_CHILD(this),</div><div class='add'>+               FIRST_CHILD(this)-&gt;fops-&gt;mkdir, loc, mode, umask, xdata);</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-io_stats_mkdir (call_frame_t *frame, xlator_t *this,</div><div class='del'>-                loc_t *loc, mode_t mode, dict_t *params)</div><div class='add'>+io_stats_unlink(call_frame_t *frame, xlator_t *this, loc_t *loc, int xflag,</div><div class='add'>+                dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-        BUMP_FOP (MKDIR);</div><div class='add'>+    START_FOP_LATENCY(frame);</div><div class='ctx'> </div><div class='del'>-        STACK_WIND (frame, io_stats_mkdir_cbk,</div><div class='del'>-                    FIRST_CHILD(this),</div><div class='del'>-                    FIRST_CHILD(this)-&gt;fops-&gt;mkdir,</div><div class='del'>-                    loc, mode, params);</div><div class='del'>-        return 0;</div><div class='add'>+    STACK_WIND(frame, io_stats_unlink_cbk, FIRST_CHILD(this),</div><div class='add'>+               FIRST_CHILD(this)-&gt;fops-&gt;unlink, loc, xflag, xdata);</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-io_stats_unlink (call_frame_t *frame, xlator_t *this,</div><div class='del'>-                 loc_t *loc)</div><div class='add'>+io_stats_rmdir(call_frame_t *frame, xlator_t *this, loc_t *loc, int flags,</div><div class='add'>+               dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-        BUMP_FOP (UNLINK);</div><div class='add'>+    START_FOP_LATENCY(frame);</div><div class='ctx'> </div><div class='del'>-        STACK_WIND (frame, io_stats_unlink_cbk,</div><div class='del'>-                    FIRST_CHILD(this),</div><div class='del'>-                    FIRST_CHILD(this)-&gt;fops-&gt;unlink,</div><div class='del'>-                    loc);</div><div class='del'>-        return 0;</div><div class='add'>+    STACK_WIND(frame, io_stats_rmdir_cbk, FIRST_CHILD(this),</div><div class='add'>+               FIRST_CHILD(this)-&gt;fops-&gt;rmdir, loc, flags, xdata);</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-io_stats_rmdir (call_frame_t *frame, xlator_t *this,</div><div class='del'>-                loc_t *loc)</div><div class='add'>+io_stats_symlink(call_frame_t *frame, xlator_t *this, const char *linkpath,</div><div class='add'>+                 loc_t *loc, mode_t umask, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-        BUMP_FOP (RMDIR);</div><div class='del'>-</div><div class='del'>-        STACK_WIND (frame, io_stats_rmdir_cbk,</div><div class='del'>-                    FIRST_CHILD(this),</div><div class='del'>-                    FIRST_CHILD(this)-&gt;fops-&gt;rmdir,</div><div class='del'>-                    loc);</div><div class='add'>+    START_FOP_LATENCY(frame);</div><div class='ctx'> </div><div class='del'>-        return 0;</div><div class='add'>+    STACK_WIND(frame, io_stats_symlink_cbk, FIRST_CHILD(this),</div><div class='add'>+               FIRST_CHILD(this)-&gt;fops-&gt;symlink, linkpath, loc, umask, xdata);</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-io_stats_symlink (call_frame_t *frame, xlator_t *this,</div><div class='del'>-                  const char *linkpath, loc_t *loc, dict_t *params)</div><div class='add'>+io_stats_rename(call_frame_t *frame, xlator_t *this, loc_t *oldloc,</div><div class='add'>+                loc_t *newloc, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-        BUMP_FOP (SYMLINK);</div><div class='add'>+    START_FOP_LATENCY(frame);</div><div class='ctx'> </div><div class='del'>-        STACK_WIND (frame, io_stats_symlink_cbk,</div><div class='del'>-                    FIRST_CHILD(this),</div><div class='del'>-                    FIRST_CHILD(this)-&gt;fops-&gt;symlink,</div><div class='del'>-                    linkpath, loc, params);</div><div class='del'>-</div><div class='del'>-        return 0;</div><div class='add'>+    STACK_WIND(frame, io_stats_rename_cbk, FIRST_CHILD(this),</div><div class='add'>+               FIRST_CHILD(this)-&gt;fops-&gt;rename, oldloc, newloc, xdata);</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-io_stats_rename (call_frame_t *frame, xlator_t *this,</div><div class='del'>-                 loc_t *oldloc, loc_t *newloc)</div><div class='add'>+io_stats_link(call_frame_t *frame, xlator_t *this, loc_t *oldloc, loc_t *newloc,</div><div class='add'>+              dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-        BUMP_FOP (RENAME);</div><div class='del'>-</div><div class='del'>-        STACK_WIND (frame, io_stats_rename_cbk,</div><div class='del'>-                    FIRST_CHILD(this),</div><div class='del'>-                    FIRST_CHILD(this)-&gt;fops-&gt;rename,</div><div class='del'>-                    oldloc, newloc);</div><div class='add'>+    START_FOP_LATENCY(frame);</div><div class='ctx'> </div><div class='del'>-        return 0;</div><div class='add'>+    STACK_WIND(frame, io_stats_link_cbk, FIRST_CHILD(this),</div><div class='add'>+               FIRST_CHILD(this)-&gt;fops-&gt;link, oldloc, newloc, xdata);</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-io_stats_link (call_frame_t *frame, xlator_t *this,</div><div class='del'>-               loc_t *oldloc, loc_t *newloc)</div><div class='add'>+io_stats_setattr(call_frame_t *frame, xlator_t *this, loc_t *loc,</div><div class='add'>+                 struct iatt *stbuf, int32_t valid, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-        BUMP_FOP (LINK);</div><div class='add'>+    START_FOP_LATENCY(frame);</div><div class='ctx'> </div><div class='del'>-        STACK_WIND (frame, io_stats_link_cbk,</div><div class='del'>-                    FIRST_CHILD(this),</div><div class='del'>-                    FIRST_CHILD(this)-&gt;fops-&gt;link,</div><div class='del'>-                    oldloc, newloc);</div><div class='del'>-        return 0;</div><div class='add'>+    STACK_WIND(frame, io_stats_setattr_cbk, FIRST_CHILD(this),</div><div class='add'>+               FIRST_CHILD(this)-&gt;fops-&gt;setattr, loc, stbuf, valid, xdata);</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-io_stats_setattr (call_frame_t *frame, xlator_t *this,</div><div class='del'>-                  loc_t *loc, struct iatt *stbuf, int32_t valid)</div><div class='add'>+io_stats_truncate(call_frame_t *frame, xlator_t *this, loc_t *loc, off_t offset,</div><div class='add'>+                  dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-        BUMP_FOP (SETATTR);</div><div class='del'>-</div><div class='del'>-        STACK_WIND (frame, io_stats_setattr_cbk,</div><div class='del'>-                    FIRST_CHILD(this),</div><div class='del'>-                    FIRST_CHILD(this)-&gt;fops-&gt;setattr,</div><div class='del'>-                    loc, stbuf, valid);</div><div class='add'>+    START_FOP_LATENCY(frame);</div><div class='ctx'> </div><div class='del'>-        return 0;</div><div class='add'>+    STACK_WIND(frame, io_stats_truncate_cbk, FIRST_CHILD(this),</div><div class='add'>+               FIRST_CHILD(this)-&gt;fops-&gt;truncate, loc, offset, xdata);</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-io_stats_truncate (call_frame_t *frame, xlator_t *this,</div><div class='del'>-                   loc_t *loc, off_t offset)</div><div class='add'>+io_stats_open(call_frame_t *frame, xlator_t *this, loc_t *loc, int32_t flags,</div><div class='add'>+              fd_t *fd, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-        BUMP_FOP (TRUNCATE);</div><div class='add'>+    if (loc-&gt;path)</div><div class='add'>+        frame-&gt;local = gf_strdup(loc-&gt;path);</div><div class='ctx'> </div><div class='del'>-        STACK_WIND (frame, io_stats_truncate_cbk,</div><div class='del'>-                    FIRST_CHILD(this),</div><div class='del'>-                    FIRST_CHILD(this)-&gt;fops-&gt;truncate,</div><div class='del'>-                    loc, offset);</div><div class='add'>+    START_FOP_LATENCY(frame);</div><div class='ctx'> </div><div class='del'>-        return 0;</div><div class='add'>+    STACK_WIND(frame, io_stats_open_cbk, FIRST_CHILD(this),</div><div class='add'>+               FIRST_CHILD(this)-&gt;fops-&gt;open, loc, flags, fd, xdata);</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-io_stats_open (call_frame_t *frame, xlator_t *this,</div><div class='del'>-               loc_t *loc, int32_t flags, fd_t *fd, int32_t wbflags)</div><div class='add'>+io_stats_create(call_frame_t *frame, xlator_t *this, loc_t *loc, int32_t flags,</div><div class='add'>+                mode_t mode, mode_t umask, fd_t *fd, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-        BUMP_FOP (OPEN);</div><div class='add'>+    if (loc-&gt;path)</div><div class='add'>+        frame-&gt;local = gf_strdup(loc-&gt;path);</div><div class='ctx'> </div><div class='del'>-        frame-&gt;local = gf_strdup (loc-&gt;path);</div><div class='add'>+    START_FOP_LATENCY(frame);</div><div class='ctx'> </div><div class='del'>-        STACK_WIND (frame, io_stats_open_cbk,</div><div class='del'>-                    FIRST_CHILD(this),</div><div class='del'>-                    FIRST_CHILD(this)-&gt;fops-&gt;open,</div><div class='del'>-                    loc, flags, fd, wbflags);</div><div class='del'>-        return 0;</div><div class='add'>+    STACK_WIND(frame, io_stats_create_cbk, FIRST_CHILD(this),</div><div class='add'>+               FIRST_CHILD(this)-&gt;fops-&gt;create, loc, flags, mode, umask, fd,</div><div class='add'>+               xdata);</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-io_stats_create (call_frame_t *frame, xlator_t *this,</div><div class='del'>-                 loc_t *loc, int32_t flags, mode_t mode,</div><div class='del'>-                 fd_t *fd, dict_t *params)</div><div class='add'>+io_stats_readv(call_frame_t *frame, xlator_t *this, fd_t *fd, size_t size,</div><div class='add'>+               off_t offset, uint32_t flags, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-        BUMP_FOP (CREATE);</div><div class='add'>+    frame-&gt;local = fd;</div><div class='ctx'> </div><div class='del'>-        frame-&gt;local = gf_strdup (loc-&gt;path);</div><div class='add'>+    START_FOP_LATENCY(frame);</div><div class='ctx'> </div><div class='del'>-        STACK_WIND (frame, io_stats_create_cbk,</div><div class='del'>-                    FIRST_CHILD(this),</div><div class='del'>-                    FIRST_CHILD(this)-&gt;fops-&gt;create,</div><div class='del'>-                    loc, flags, mode, fd, params);</div><div class='del'>-        return 0;</div><div class='add'>+    STACK_WIND(frame, io_stats_readv_cbk, FIRST_CHILD(this),</div><div class='add'>+               FIRST_CHILD(this)-&gt;fops-&gt;readv, fd, size, offset, flags, xdata);</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-io_stats_readv (call_frame_t *frame, xlator_t *this,</div><div class='del'>-                fd_t *fd, size_t size, off_t offset)</div><div class='add'>+io_stats_writev(call_frame_t *frame, xlator_t *this, fd_t *fd,</div><div class='add'>+                struct iovec *vector, int32_t count, off_t offset,</div><div class='add'>+                uint32_t flags, struct iobref *iobref, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-        BUMP_FOP (READ);</div><div class='add'>+    int len = 0;</div><div class='ctx'> </div><div class='del'>-        frame-&gt;local = fd;</div><div class='add'>+    if (fd-&gt;inode)</div><div class='add'>+        frame-&gt;local = fd-&gt;inode;</div><div class='add'>+    len = iov_length(vector, count);</div><div class='ctx'> </div><div class='del'>-        STACK_WIND (frame, io_stats_readv_cbk,</div><div class='del'>-                    FIRST_CHILD(this),</div><div class='del'>-                    FIRST_CHILD(this)-&gt;fops-&gt;readv,</div><div class='del'>-                    fd, size, offset);</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='add'>+    ios_bump_write(this, fd, len);</div><div class='add'>+    START_FOP_LATENCY(frame);</div><div class='ctx'> </div><div class='add'>+    STACK_WIND(frame, io_stats_writev_cbk, FIRST_CHILD(this),</div><div class='add'>+               FIRST_CHILD(this)-&gt;fops-&gt;writev, fd, vector, count, offset,</div><div class='add'>+               flags, iobref, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-io_stats_writev (call_frame_t *frame, xlator_t *this,</div><div class='del'>-                 fd_t *fd, struct iovec *vector,</div><div class='del'>-                 int32_t count, off_t offset,</div><div class='del'>-                 struct iobref *iobref)</div><div class='add'>+io_stats_copy_file_range(call_frame_t *frame, xlator_t *this, fd_t *fd_in,</div><div class='add'>+                         off_t off_in, fd_t *fd_out, off_t off_out, size_t len,</div><div class='add'>+                         uint32_t flags, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-        int                 len = 0;</div><div class='del'>-</div><div class='add'>+    START_FOP_LATENCY(frame);</div><div class='ctx'> </div><div class='del'>-        len = iov_length (vector, count);</div><div class='add'>+    STACK_WIND(frame, io_stats_copy_file_range_cbk, FIRST_CHILD(this),</div><div class='add'>+               FIRST_CHILD(this)-&gt;fops-&gt;copy_file_range, fd_in, off_in, fd_out,</div><div class='add'>+               off_out, len, flags, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        BUMP_FOP (WRITE);</div><div class='del'>-        BUMP_WRITE (fd, len);</div><div class='add'>+int</div><div class='add'>+io_stats_statfs(call_frame_t *frame, xlator_t *this, loc_t *loc, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    START_FOP_LATENCY(frame);</div><div class='ctx'> </div><div class='del'>-        STACK_WIND (frame, io_stats_writev_cbk,</div><div class='del'>-                    FIRST_CHILD(this),</div><div class='del'>-                    FIRST_CHILD(this)-&gt;fops-&gt;writev,</div><div class='del'>-                    fd, vector, count, offset, iobref);</div><div class='del'>-        return 0;</div><div class='add'>+    STACK_WIND(frame, io_stats_statfs_cbk, FIRST_CHILD(this),</div><div class='add'>+               FIRST_CHILD(this)-&gt;fops-&gt;statfs, loc, xdata);</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-io_stats_statfs (call_frame_t *frame, xlator_t *this,</div><div class='del'>-                 loc_t *loc)</div><div class='add'>+io_stats_flush(call_frame_t *frame, xlator_t *this, fd_t *fd, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-        BUMP_FOP (STATFS);</div><div class='add'>+    START_FOP_LATENCY(frame);</div><div class='ctx'> </div><div class='del'>-        STACK_WIND (frame, io_stats_statfs_cbk,</div><div class='del'>-                    FIRST_CHILD(this),</div><div class='del'>-                    FIRST_CHILD(this)-&gt;fops-&gt;statfs,</div><div class='del'>-                    loc);</div><div class='del'>-        return 0;</div><div class='add'>+    STACK_WIND(frame, io_stats_flush_cbk, FIRST_CHILD(this),</div><div class='add'>+               FIRST_CHILD(this)-&gt;fops-&gt;flush, fd, xdata);</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-io_stats_flush (call_frame_t *frame, xlator_t *this,</div><div class='del'>-                fd_t *fd)</div><div class='add'>+io_stats_fsync(call_frame_t *frame, xlator_t *this, fd_t *fd, int32_t flags,</div><div class='add'>+               dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-        BUMP_FOP (FLUSH);</div><div class='add'>+    START_FOP_LATENCY(frame);</div><div class='ctx'> </div><div class='del'>-        STACK_WIND (frame, io_stats_flush_cbk,</div><div class='del'>-                    FIRST_CHILD(this),</div><div class='del'>-                    FIRST_CHILD(this)-&gt;fops-&gt;flush,</div><div class='del'>-                    fd);</div><div class='del'>-        return 0;</div><div class='add'>+    STACK_WIND(frame, io_stats_fsync_cbk, FIRST_CHILD(this),</div><div class='add'>+               FIRST_CHILD(this)-&gt;fops-&gt;fsync, fd, flags, xdata);</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-io_stats_fsync (call_frame_t *frame, xlator_t *this,</div><div class='del'>-                fd_t *fd, int32_t flags)</div><div class='add'>+conditional_dump(dict_t *dict, char *key, data_t *value, void *data)</div><div class='ctx'> {</div><div class='del'>-        BUMP_FOP (FSYNC);</div><div class='del'>-</div><div class='del'>-        STACK_WIND (frame, io_stats_fsync_cbk,</div><div class='del'>-                    FIRST_CHILD(this),</div><div class='del'>-                    FIRST_CHILD(this)-&gt;fops-&gt;fsync,</div><div class='del'>-                    fd, flags);</div><div class='del'>-        return 0;</div><div class='add'>+    struct {</div><div class='add'>+        xlator_t *this;</div><div class='add'>+        inode_t *inode;</div><div class='add'>+        const char *path;</div><div class='add'>+    } * stub;</div><div class='add'>+    xlator_t *this = NULL;</div><div class='add'>+    char *filename = NULL;</div><div class='add'>+    FILE *logfp = NULL;</div><div class='add'>+    struct ios_dump_args args = {0};</div><div class='add'>+    int pid, namelen, dirlen;</div><div class='add'>+    char dump_key[100];</div><div class='add'>+    char *slash_ptr = NULL;</div><div class='add'>+    char *path_in_value = NULL;</div><div class='add'>+    char *identifier = NULL;</div><div class='add'>+    struct ios_conf *conf = NULL;</div><div class='add'>+</div><div class='add'>+    stub = data;</div><div class='add'>+    this = stub-&gt;this;</div><div class='add'>+    conf = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    /* Don't do this on 'brick-side', only do this on client side */</div><div class='add'>+    /* Addresses CVE-2018-14659 */</div><div class='add'>+    if (this-&gt;ctx-&gt;process_mode != GF_CLIENT_PROCESS) {</div><div class='add'>+        gf_log(this-&gt;name, GF_LOG_DEBUG,</div><div class='add'>+               "taking io-stats dump using setxattr not permitted on brick."</div><div class='add'>+               " Use 'gluster profile' instead");</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Create a file name that is appended with the io-stats instance</div><div class='add'>+    name as well. This helps when there is more than a single io-stats</div><div class='add'>+    instance in the graph, or the client and server processes are running</div><div class='add'>+    on the same node */</div><div class='add'>+    /* For the sanity of where the file should be located, we should make</div><div class='add'>+       sure file is written only inside RUNDIR (ie, /var/run/gluster) */</div><div class='add'>+    /* TODO: provide an option to dump it to different directory of</div><div class='add'>+       choice, based on options */</div><div class='add'>+    /* name format: /var/run/gluster/&lt;passed in path/filename&gt;.&lt;xlator name</div><div class='add'>+     * slashes to -&gt; */</div><div class='add'>+</div><div class='add'>+    path_in_value = alloca0(value-&gt;len + 1);</div><div class='add'>+</div><div class='add'>+    /* We need a memcpy here because of the way dict_unserialize works */</div><div class='add'>+</div><div class='add'>+    memcpy(path_in_value, data_to_str(value), value-&gt;len);</div><div class='add'>+    path_in_value[value-&gt;len] = '\0';</div><div class='add'>+</div><div class='add'>+    if (strstr(path_in_value, "../")) {</div><div class='add'>+        gf_log(this-&gt;name, GF_LOG_ERROR, "%s: no \"../\" allowed in path",</div><div class='add'>+               path_in_value);</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (path_in_value[0] == '/') {</div><div class='add'>+        path_in_value = path_in_value + 1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    dirlen = strlen(IOS_STATS_DUMP_DIR);</div><div class='add'>+    if (conf-&gt;unique_id) {</div><div class='add'>+        /* this-&gt;name will be the same for all bricks of the volume */</div><div class='add'>+        identifier = conf-&gt;unique_id;</div><div class='add'>+    } else {</div><div class='add'>+        identifier = this-&gt;name;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    namelen = (dirlen + value-&gt;len + strlen(identifier) + 3);</div><div class='add'>+    /* +3 for '/', '.' and '\0' added in snprintf below*/</div><div class='add'>+</div><div class='add'>+    filename = alloca0(namelen);</div><div class='add'>+    snprintf(filename, namelen, "%s/%s.%s", IOS_STATS_DUMP_DIR, path_in_value,</div><div class='add'>+             identifier);</div><div class='add'>+</div><div class='add'>+    /* convert any slashes to '-' so that fopen works correctly */</div><div class='add'>+    slash_ptr = strchr(filename + dirlen + 1, '/');</div><div class='add'>+    while (slash_ptr) {</div><div class='add'>+        *slash_ptr = '-';</div><div class='add'>+        slash_ptr = strchr(slash_ptr, '/');</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    pid = getpid();</div><div class='add'>+</div><div class='add'>+    if (!strncmp(filename, "", 1)) {</div><div class='add'>+        gf_log(this-&gt;name, GF_LOG_ERROR, "No filename given");</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+    logfp = fopen(filename, "w+");</div><div class='add'>+    if (!logfp) {</div><div class='add'>+        gf_log(this-&gt;name, GF_LOG_ERROR,</div><div class='add'>+               "failed to open %s "</div><div class='add'>+               "for writing",</div><div class='add'>+               filename);</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+    sprintf(dump_key, "*io*stat*%d_json_dump", pid);</div><div class='add'>+    if (fnmatch(dump_key, key, 0) == 0) {</div><div class='add'>+        (void)ios_dump_args_init(&amp;args, IOS_DUMP_TYPE_JSON_FILE, logfp);</div><div class='add'>+    } else {</div><div class='add'>+        (void)ios_dump_args_init(&amp;args, IOS_DUMP_TYPE_FILE, logfp);</div><div class='add'>+    }</div><div class='add'>+    io_stats_dump(this, &amp;args, GF_IOS_INFO_ALL, _gf_false);</div><div class='add'>+    fclose(logfp);</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+int</div><div class='add'>+_ios_destroy_dump_thread(struct ios_conf *conf)</div><div class='add'>+{</div><div class='add'>+    conf-&gt;dump_thread_should_die = _gf_true;</div><div class='add'>+    if (conf-&gt;dump_thread_running) {</div><div class='add'>+        (void)pthread_cancel(conf-&gt;dump_thread);</div><div class='add'>+        (void)pthread_join(conf-&gt;dump_thread, NULL);</div><div class='add'>+    }</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-void</div><div class='del'>-conditional_dump (dict_t *dict, char *key, data_t *value, void *data)</div><div class='del'>-{</div><div class='del'>-        struct {</div><div class='del'>-                xlator_t       *this;</div><div class='del'>-                inode_t        *inode;</div><div class='del'>-                const char     *path;</div><div class='del'>-        } *stub;</div><div class='del'>-        xlator_t   *this = NULL;</div><div class='del'>-        inode_t    *inode = NULL;</div><div class='del'>-        const char *path = NULL;</div><div class='del'>-        char       *filename = NULL;</div><div class='del'>-</div><div class='del'>-        stub  = data;</div><div class='del'>-        this  = stub-&gt;this;</div><div class='del'>-        inode = stub-&gt;inode;</div><div class='del'>-        path  = stub-&gt;path;</div><div class='del'>-</div><div class='del'>-        filename = alloca (value-&gt;len + 1);</div><div class='del'>-        memset (filename, 0, value-&gt;len + 1);</div><div class='del'>-        memcpy (filename, data_to_str (value), value-&gt;len);</div><div class='del'>-</div><div class='del'>-        if (fnmatch ("*io*stat*dump", key, 0) == 0) {</div><div class='del'>-                io_stats_dump (this, filename, inode, path);</div><div class='add'>+void *</div><div class='add'>+_ios_dump_thread(xlator_t *this)</div><div class='add'>+{</div><div class='add'>+    struct ios_conf *conf = NULL;</div><div class='add'>+    FILE *stats_logfp = NULL;</div><div class='add'>+    FILE *samples_logfp = NULL;</div><div class='add'>+    struct ios_dump_args args = {0};</div><div class='add'>+    int i;</div><div class='add'>+    int stats_bytes_written = 0;</div><div class='add'>+    int samples_bytes_written = 0;</div><div class='add'>+    char stats_filename[PATH_MAX];</div><div class='add'>+    char samples_filename[PATH_MAX];</div><div class='add'>+    char *xlator_name;</div><div class='add'>+    char *instance_name;</div><div class='add'>+    gf_boolean_t log_stats_fopen_failure = _gf_true;</div><div class='add'>+    gf_boolean_t log_samples_fopen_failure = _gf_true;</div><div class='add'>+    int old_cancel_type;</div><div class='add'>+</div><div class='add'>+    conf = this-&gt;private;</div><div class='add'>+    gf_log(this-&gt;name, GF_LOG_INFO,</div><div class='add'>+           "IO stats dump thread started, "</div><div class='add'>+           "polling IO stats every %d seconds",</div><div class='add'>+           conf-&gt;ios_dump_interval);</div><div class='add'>+    xlator_name = strdupa(conf-&gt;unique_id);</div><div class='add'>+    for (i = 0; i &lt; strlen(xlator_name); i++) {</div><div class='add'>+        if (xlator_name[i] == '/')</div><div class='add'>+            xlator_name[i] = '_';</div><div class='add'>+    }</div><div class='add'>+    instance_name = this-&gt;instance_name;</div><div class='add'>+    if (this-&gt;name &amp;&amp; strcmp(this-&gt;name, "glustershd") == 0) {</div><div class='add'>+        xlator_name = "shd";</div><div class='add'>+    } else if (this-&gt;prev &amp;&amp; strcmp(this-&gt;prev-&gt;name, "nfs-server") == 0) {</div><div class='add'>+        xlator_name = "nfsd";</div><div class='add'>+        instance_name = this-&gt;prev-&gt;instance_name;</div><div class='add'>+    }</div><div class='add'>+    if (sys_mkdir(_IOS_DUMP_DIR, S_IRWXU | S_IRWXO | S_IRWXG) == (-1)) {</div><div class='add'>+        if (errno != EEXIST) {</div><div class='add'>+            gf_log(this-&gt;name, GF_LOG_ERROR,</div><div class='add'>+                   "could not create stats-dump directory %s", _IOS_DUMP_DIR);</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    if (sys_mkdir(_IOS_SAMP_DIR, S_IRWXU | S_IRWXO | S_IRWXG) == (-1)) {</div><div class='add'>+        if (errno != EEXIST) {</div><div class='add'>+            gf_log(this-&gt;name, GF_LOG_ERROR,</div><div class='add'>+                   "could not create stats-sample directory %s", _IOS_SAMP_DIR);</div><div class='add'>+            goto out;</div><div class='ctx'>         }</div><div class='add'>+    }</div><div class='add'>+    if (instance_name) {</div><div class='add'>+        stats_bytes_written = snprintf(stats_filename, PATH_MAX,</div><div class='add'>+                                       "%s/%s_%s_%s.dump", _IOS_DUMP_DIR,</div><div class='add'>+                                       __progname, xlator_name, instance_name);</div><div class='add'>+        samples_bytes_written = snprintf(</div><div class='add'>+            samples_filename, PATH_MAX, "%s/%s_%s_%s.samp", _IOS_SAMP_DIR,</div><div class='add'>+            __progname, xlator_name, instance_name);</div><div class='add'>+    } else {</div><div class='add'>+        stats_bytes_written = snprintf(stats_filename, PATH_MAX,</div><div class='add'>+                                       "%s/%s_%s.dump", _IOS_DUMP_DIR,</div><div class='add'>+                                       __progname, xlator_name);</div><div class='add'>+        samples_bytes_written = snprintf(samples_filename, PATH_MAX,</div><div class='add'>+                                         "%s/%s_%s.samp", _IOS_SAMP_DIR,</div><div class='add'>+                                         __progname, xlator_name);</div><div class='add'>+    }</div><div class='add'>+    if ((stats_bytes_written &gt;= PATH_MAX) ||</div><div class='add'>+        (samples_bytes_written &gt;= PATH_MAX)) {</div><div class='add'>+        gf_log(this-&gt;name, GF_LOG_ERROR,</div><div class='add'>+               "Invalid path for stats dump (%s) and/or latency "</div><div class='add'>+               "samples (%s)",</div><div class='add'>+               stats_filename, samples_filename);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    while (1) {</div><div class='add'>+        if (conf-&gt;dump_thread_should_die)</div><div class='add'>+            break;</div><div class='add'>+        (void)pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS,</div><div class='add'>+                                    &amp;old_cancel_type);</div><div class='add'>+        sleep(conf-&gt;ios_dump_interval);</div><div class='add'>+        (void)pthread_setcanceltype(PTHREAD_CANCEL_DEFERRED, &amp;old_cancel_type);</div><div class='add'>+        /*</div><div class='add'>+         * It's not clear whether we should reopen this each time, or</div><div class='add'>+         * just hold it open and rewind/truncate on each iteration.</div><div class='add'>+         * Leaving it alone for now.</div><div class='add'>+         */</div><div class='add'>+        stats_logfp = fopen(stats_filename, "w+");</div><div class='add'>+        if (stats_logfp) {</div><div class='add'>+            (void)ios_dump_args_init(&amp;args, conf-&gt;dump_format, stats_logfp);</div><div class='add'>+            io_stats_dump(this, &amp;args, GF_IOS_INFO_ALL, _gf_false);</div><div class='add'>+            fclose(stats_logfp);</div><div class='add'>+            log_stats_fopen_failure = _gf_true;</div><div class='add'>+        } else if (log_stats_fopen_failure) {</div><div class='add'>+            gf_log(this-&gt;name, GF_LOG_ERROR,</div><div class='add'>+                   "could not open stats-dump file %s (%s)", stats_filename,</div><div class='add'>+                   strerror(errno));</div><div class='add'>+            log_stats_fopen_failure = _gf_false;</div><div class='add'>+        }</div><div class='add'>+        samples_logfp = fopen(samples_filename, "w+");</div><div class='add'>+        if (samples_logfp) {</div><div class='add'>+            io_stats_dump_latency_samples_logfp(this, samples_logfp);</div><div class='add'>+            fclose(samples_logfp);</div><div class='add'>+            log_samples_fopen_failure = _gf_true;</div><div class='add'>+        } else if (log_samples_fopen_failure) {</div><div class='add'>+            gf_log(this-&gt;name, GF_LOG_ERROR,</div><div class='add'>+                   "could not open samples-dump file %s (%s)", samples_filename,</div><div class='add'>+                   strerror(errno));</div><div class='add'>+            log_samples_fopen_failure = _gf_false;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+out:</div><div class='add'>+    conf-&gt;dump_thread_running = _gf_false;</div><div class='add'>+    gf_log(this-&gt;name, GF_LOG_INFO, "IO stats dump thread terminated");</div><div class='add'>+    return NULL;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+static gf_boolean_t</div><div class='add'>+match_special_xattr(dict_t *d, char *k, data_t *val, void *mdata)</div><div class='add'>+{</div><div class='add'>+    gf_boolean_t ret = _gf_false;</div><div class='add'>+    if (fnmatch("*io*stat*dump", k, 0) == 0) {</div><div class='add'>+        ret = _gf_true;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-io_stats_setxattr (call_frame_t *frame, xlator_t *this,</div><div class='del'>-                   loc_t *loc, dict_t *dict,</div><div class='del'>-                   int32_t flags)</div><div class='add'>+io_stats_setxattr(call_frame_t *frame, xlator_t *this, loc_t *loc, dict_t *dict,</div><div class='add'>+                  int32_t flags, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-        struct {</div><div class='del'>-                xlator_t     *this;</div><div class='del'>-                inode_t      *inode;</div><div class='del'>-                const char   *path;</div><div class='del'>-        } stub;</div><div class='add'>+    struct {</div><div class='add'>+        xlator_t *this;</div><div class='add'>+        inode_t *inode;</div><div class='add'>+        const char *path;</div><div class='add'>+    } stub;</div><div class='ctx'> </div><div class='del'>-        BUMP_FOP (SETXATTR);</div><div class='add'>+    stub.this = this;</div><div class='add'>+    stub.inode = loc-&gt;inode;</div><div class='add'>+    stub.path = loc-&gt;path;</div><div class='ctx'> </div><div class='del'>-        stub.this  = this;</div><div class='del'>-        stub.inode = loc-&gt;inode;</div><div class='del'>-        stub.path  = loc-&gt;path;</div><div class='add'>+    (void)dict_foreach_match(dict, match_special_xattr, NULL, conditional_dump,</div><div class='add'>+                             &amp;stub);</div><div class='ctx'> </div><div class='del'>-        dict_foreach (dict, conditional_dump, &amp;stub);</div><div class='add'>+    START_FOP_LATENCY(frame);</div><div class='ctx'> </div><div class='del'>-        STACK_WIND (frame, io_stats_setxattr_cbk,</div><div class='del'>-                    FIRST_CHILD(this),</div><div class='del'>-                    FIRST_CHILD(this)-&gt;fops-&gt;setxattr,</div><div class='del'>-                    loc, dict, flags);</div><div class='del'>-        return 0;</div><div class='add'>+    STACK_WIND(frame, io_stats_setxattr_cbk, FIRST_CHILD(this),</div><div class='add'>+               FIRST_CHILD(this)-&gt;fops-&gt;setxattr, loc, dict, flags, xdata);</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-io_stats_getxattr (call_frame_t *frame, xlator_t *this,</div><div class='del'>-                   loc_t *loc, const char *name)</div><div class='add'>+io_stats_getxattr(call_frame_t *frame, xlator_t *this, loc_t *loc,</div><div class='add'>+                  const char *name, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-        BUMP_FOP (GETXATTR);</div><div class='add'>+    START_FOP_LATENCY(frame);</div><div class='ctx'> </div><div class='del'>-        STACK_WIND (frame, io_stats_getxattr_cbk,</div><div class='del'>-                    FIRST_CHILD(this),</div><div class='del'>-                    FIRST_CHILD(this)-&gt;fops-&gt;getxattr,</div><div class='del'>-                    loc, name);</div><div class='del'>-        return 0;</div><div class='add'>+    STACK_WIND(frame, io_stats_getxattr_cbk, FIRST_CHILD(this),</div><div class='add'>+               FIRST_CHILD(this)-&gt;fops-&gt;getxattr, loc, name, xdata);</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-io_stats_removexattr (call_frame_t *frame, xlator_t *this,</div><div class='del'>-                      loc_t *loc, const char *name)</div><div class='add'>+io_stats_removexattr(call_frame_t *frame, xlator_t *this, loc_t *loc,</div><div class='add'>+                     const char *name, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-        BUMP_FOP (REMOVEXATTR);</div><div class='add'>+    START_FOP_LATENCY(frame);</div><div class='ctx'> </div><div class='del'>-        STACK_WIND (frame, io_stats_removexattr_cbk,</div><div class='del'>-                    FIRST_CHILD(this),</div><div class='del'>-                    FIRST_CHILD(this)-&gt;fops-&gt;removexattr,</div><div class='del'>-                    loc, name);</div><div class='add'>+    STACK_WIND(frame, io_stats_removexattr_cbk, FIRST_CHILD(this),</div><div class='add'>+               FIRST_CHILD(this)-&gt;fops-&gt;removexattr, loc, name, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        return 0;</div><div class='add'>+int</div><div class='add'>+io_stats_fsetxattr(call_frame_t *frame, xlator_t *this, fd_t *fd, dict_t *dict,</div><div class='add'>+                   int32_t flags, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    START_FOP_LATENCY(frame);</div><div class='add'>+</div><div class='add'>+    STACK_WIND(frame, io_stats_fsetxattr_cbk, FIRST_CHILD(this),</div><div class='add'>+               FIRST_CHILD(this)-&gt;fops-&gt;fsetxattr, fd, dict, flags, xdata);</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+int</div><div class='add'>+io_stats_fgetxattr(call_frame_t *frame, xlator_t *this, fd_t *fd,</div><div class='add'>+                   const char *name, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    START_FOP_LATENCY(frame);</div><div class='add'>+</div><div class='add'>+    STACK_WIND(frame, io_stats_fgetxattr_cbk, FIRST_CHILD(this),</div><div class='add'>+               FIRST_CHILD(this)-&gt;fops-&gt;fgetxattr, fd, name, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-io_stats_opendir (call_frame_t *frame, xlator_t *this,</div><div class='del'>-                  loc_t *loc, fd_t *fd)</div><div class='add'>+io_stats_fremovexattr(call_frame_t *frame, xlator_t *this, fd_t *fd,</div><div class='add'>+                      const char *name, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-        BUMP_FOP (OPENDIR);</div><div class='add'>+    START_FOP_LATENCY(frame);</div><div class='ctx'> </div><div class='del'>-        STACK_WIND (frame, io_stats_opendir_cbk,</div><div class='del'>-                    FIRST_CHILD(this),</div><div class='del'>-                    FIRST_CHILD(this)-&gt;fops-&gt;opendir,</div><div class='del'>-                    loc, fd);</div><div class='del'>-        return 0;</div><div class='add'>+    STACK_WIND(frame, io_stats_fremovexattr_cbk, FIRST_CHILD(this),</div><div class='add'>+               FIRST_CHILD(this)-&gt;fops-&gt;fremovexattr, fd, name, xdata);</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-io_stats_readdirp (call_frame_t *frame, xlator_t *this, fd_t *fd, size_t size,</div><div class='del'>-                   off_t offset)</div><div class='add'>+io_stats_opendir(call_frame_t *frame, xlator_t *this, loc_t *loc, fd_t *fd,</div><div class='add'>+                 dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-        BUMP_FOP (READDIRP);</div><div class='add'>+    START_FOP_LATENCY(frame);</div><div class='ctx'> </div><div class='del'>-        STACK_WIND (frame, io_stats_readdirp_cbk,</div><div class='del'>-                    FIRST_CHILD(this),</div><div class='del'>-                    FIRST_CHILD(this)-&gt;fops-&gt;readdirp,</div><div class='del'>-                    fd, size, offset);</div><div class='add'>+    STACK_WIND(frame, io_stats_opendir_cbk, FIRST_CHILD(this),</div><div class='add'>+               FIRST_CHILD(this)-&gt;fops-&gt;opendir, loc, fd, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        return 0;</div><div class='add'>+int</div><div class='add'>+io_stats_readdirp(call_frame_t *frame, xlator_t *this, fd_t *fd, size_t size,</div><div class='add'>+                  off_t offset, dict_t *dict)</div><div class='add'>+{</div><div class='add'>+    frame-&gt;local = fd-&gt;inode;</div><div class='add'>+    START_FOP_LATENCY(frame);</div><div class='add'>+</div><div class='add'>+    STACK_WIND(frame, io_stats_readdirp_cbk, FIRST_CHILD(this),</div><div class='add'>+               FIRST_CHILD(this)-&gt;fops-&gt;readdirp, fd, size, offset, dict);</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+int</div><div class='add'>+io_stats_readdir(call_frame_t *frame, xlator_t *this, fd_t *fd, size_t size,</div><div class='add'>+                 off_t offset, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    START_FOP_LATENCY(frame);</div><div class='add'>+</div><div class='add'>+    STACK_WIND(frame, io_stats_readdir_cbk, FIRST_CHILD(this),</div><div class='add'>+               FIRST_CHILD(this)-&gt;fops-&gt;readdir, fd, size, offset, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-io_stats_readdir (call_frame_t *frame, xlator_t *this,</div><div class='del'>-                  fd_t *fd, size_t size, off_t offset)</div><div class='add'>+io_stats_fsyncdir(call_frame_t *frame, xlator_t *this, fd_t *fd,</div><div class='add'>+                  int32_t datasync, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-        BUMP_FOP (READDIR);</div><div class='add'>+    START_FOP_LATENCY(frame);</div><div class='ctx'> </div><div class='del'>-        STACK_WIND (frame, io_stats_readdir_cbk,</div><div class='del'>-                    FIRST_CHILD(this),</div><div class='del'>-                    FIRST_CHILD(this)-&gt;fops-&gt;readdir,</div><div class='del'>-                    fd, size, offset);</div><div class='add'>+    STACK_WIND(frame, io_stats_fsyncdir_cbk, FIRST_CHILD(this),</div><div class='add'>+               FIRST_CHILD(this)-&gt;fops-&gt;fsyncdir, fd, datasync, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        return 0;</div><div class='add'>+int</div><div class='add'>+io_stats_access(call_frame_t *frame, xlator_t *this, loc_t *loc, int32_t mask,</div><div class='add'>+                dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    START_FOP_LATENCY(frame);</div><div class='add'>+</div><div class='add'>+    STACK_WIND(frame, io_stats_access_cbk, FIRST_CHILD(this),</div><div class='add'>+               FIRST_CHILD(this)-&gt;fops-&gt;access, loc, mask, xdata);</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+int</div><div class='add'>+io_stats_ftruncate(call_frame_t *frame, xlator_t *this, fd_t *fd, off_t offset,</div><div class='add'>+                   dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    START_FOP_LATENCY(frame);</div><div class='add'>+</div><div class='add'>+    STACK_WIND(frame, io_stats_ftruncate_cbk, FIRST_CHILD(this),</div><div class='add'>+               FIRST_CHILD(this)-&gt;fops-&gt;ftruncate, fd, offset, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-io_stats_fsyncdir (call_frame_t *frame, xlator_t *this,</div><div class='del'>-                   fd_t *fd, int32_t datasync)</div><div class='add'>+io_stats_fsetattr(call_frame_t *frame, xlator_t *this, fd_t *fd,</div><div class='add'>+                  struct iatt *stbuf, int32_t valid, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-        BUMP_FOP (FSYNCDIR);</div><div class='add'>+    START_FOP_LATENCY(frame);</div><div class='ctx'> </div><div class='del'>-        STACK_WIND (frame, io_stats_fsyncdir_cbk,</div><div class='del'>-                    FIRST_CHILD(this),</div><div class='del'>-                    FIRST_CHILD(this)-&gt;fops-&gt;fsyncdir,</div><div class='del'>-                    fd, datasync);</div><div class='del'>-        return 0;</div><div class='add'>+    STACK_WIND(frame, io_stats_setattr_cbk, FIRST_CHILD(this),</div><div class='add'>+               FIRST_CHILD(this)-&gt;fops-&gt;fsetattr, fd, stbuf, valid, xdata);</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+int</div><div class='add'>+io_stats_fstat(call_frame_t *frame, xlator_t *this, fd_t *fd, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    START_FOP_LATENCY(frame);</div><div class='add'>+</div><div class='add'>+    STACK_WIND(frame, io_stats_fstat_cbk, FIRST_CHILD(this),</div><div class='add'>+               FIRST_CHILD(this)-&gt;fops-&gt;fstat, fd, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-io_stats_access (call_frame_t *frame, xlator_t *this,</div><div class='del'>-                 loc_t *loc, int32_t mask)</div><div class='add'>+io_stats_fallocate(call_frame_t *frame, xlator_t *this, fd_t *fd, int32_t mode,</div><div class='add'>+                   off_t offset, size_t len, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-        BUMP_FOP (ACCESS);</div><div class='add'>+    START_FOP_LATENCY(frame);</div><div class='ctx'> </div><div class='del'>-        STACK_WIND (frame, io_stats_access_cbk,</div><div class='del'>-                    FIRST_CHILD(this),</div><div class='del'>-                    FIRST_CHILD(this)-&gt;fops-&gt;access,</div><div class='del'>-                    loc, mask);</div><div class='del'>-        return 0;</div><div class='add'>+    STACK_WIND(frame, io_stats_fallocate_cbk, FIRST_CHILD(this),</div><div class='add'>+               FIRST_CHILD(this)-&gt;fops-&gt;fallocate, fd, mode, offset, len,</div><div class='add'>+               xdata);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+int</div><div class='add'>+io_stats_discard(call_frame_t *frame, xlator_t *this, fd_t *fd, off_t offset,</div><div class='add'>+                 size_t len, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    START_FOP_LATENCY(frame);</div><div class='add'>+</div><div class='add'>+    STACK_WIND(frame, io_stats_discard_cbk, FIRST_CHILD(this),</div><div class='add'>+               FIRST_CHILD(this)-&gt;fops-&gt;discard, fd, offset, len, xdata);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-io_stats_ftruncate (call_frame_t *frame, xlator_t *this,</div><div class='del'>-                    fd_t *fd, off_t offset)</div><div class='add'>+io_stats_zerofill(call_frame_t *frame, xlator_t *this, fd_t *fd, off_t offset,</div><div class='add'>+                  off_t len, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-        BUMP_FOP (FTRUNCATE);</div><div class='add'>+    START_FOP_LATENCY(frame);</div><div class='ctx'> </div><div class='del'>-        STACK_WIND (frame, io_stats_ftruncate_cbk,</div><div class='del'>-                    FIRST_CHILD(this),</div><div class='del'>-                    FIRST_CHILD(this)-&gt;fops-&gt;ftruncate,</div><div class='del'>-                    fd, offset);</div><div class='add'>+    STACK_WIND(frame, io_stats_zerofill_cbk, FIRST_CHILD(this),</div><div class='add'>+               FIRST_CHILD(this)-&gt;fops-&gt;zerofill, fd, offset, len, xdata);</div><div class='ctx'> </div><div class='del'>-        return 0;</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+int32_t</div><div class='add'>+io_stats_ipc(call_frame_t *frame, xlator_t *this, int32_t op, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    START_FOP_LATENCY(frame);</div><div class='add'>+</div><div class='add'>+    STACK_WIND(frame, io_stats_ipc_cbk, FIRST_CHILD(this),</div><div class='add'>+               FIRST_CHILD(this)-&gt;fops-&gt;ipc, op, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-io_stats_fsetattr (call_frame_t *frame, xlator_t *this,</div><div class='del'>-                   fd_t *fd, struct iatt *stbuf, int32_t valid)</div><div class='add'>+io_stats_lk(call_frame_t *frame, xlator_t *this, fd_t *fd, int32_t cmd,</div><div class='add'>+            struct gf_flock *lock, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-        BUMP_FOP (FSETATTR);</div><div class='add'>+    START_FOP_LATENCY(frame);</div><div class='ctx'> </div><div class='del'>-        STACK_WIND (frame, io_stats_setattr_cbk,</div><div class='del'>-                    FIRST_CHILD(this),</div><div class='del'>-                    FIRST_CHILD(this)-&gt;fops-&gt;fsetattr,</div><div class='del'>-                    fd, stbuf, valid);</div><div class='del'>-        return 0;</div><div class='add'>+    STACK_WIND(frame, io_stats_lk_cbk, FIRST_CHILD(this),</div><div class='add'>+               FIRST_CHILD(this)-&gt;fops-&gt;lk, fd, cmd, lock, xdata);</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+int</div><div class='add'>+io_stats_rchecksum(call_frame_t *frame, xlator_t *this, fd_t *fd, off_t offset,</div><div class='add'>+                   int32_t len, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    START_FOP_LATENCY(frame);</div><div class='add'>+</div><div class='add'>+    STACK_WIND(frame, io_stats_rchecksum_cbk, FIRST_CHILD(this),</div><div class='add'>+               FIRST_CHILD(this)-&gt;fops-&gt;rchecksum, fd, offset, len, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-io_stats_fstat (call_frame_t *frame, xlator_t *this,</div><div class='del'>-                fd_t *fd)</div><div class='add'>+io_stats_seek(call_frame_t *frame, xlator_t *this, fd_t *fd, off_t offset,</div><div class='add'>+              gf_seek_what_t what, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-        BUMP_FOP (FSTAT);</div><div class='add'>+    START_FOP_LATENCY(frame);</div><div class='ctx'> </div><div class='del'>-        STACK_WIND (frame, io_stats_fstat_cbk,</div><div class='del'>-                    FIRST_CHILD(this),</div><div class='del'>-                    FIRST_CHILD(this)-&gt;fops-&gt;fstat,</div><div class='del'>-                    fd);</div><div class='del'>-        return 0;</div><div class='add'>+    STACK_WIND(frame, io_stats_seek_cbk, FIRST_CHILD(this),</div><div class='add'>+               FIRST_CHILD(this)-&gt;fops-&gt;seek, fd, offset, what, xdata);</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+int</div><div class='add'>+io_stats_lease(call_frame_t *frame, xlator_t *this, loc_t *loc,</div><div class='add'>+               struct gf_lease *lease, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    START_FOP_LATENCY(frame);</div><div class='add'>+</div><div class='add'>+    STACK_WIND(frame, io_stats_lease_cbk, FIRST_CHILD(this),</div><div class='add'>+               FIRST_CHILD(this)-&gt;fops-&gt;lease, loc, lease, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-io_stats_lk (call_frame_t *frame, xlator_t *this,</div><div class='del'>-             fd_t *fd, int32_t cmd, struct flock *lock)</div><div class='add'>+io_stats_getactivelk(call_frame_t *frame, xlator_t *this, loc_t *loc,</div><div class='add'>+                     dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-        BUMP_FOP (LK);</div><div class='add'>+    START_FOP_LATENCY(frame);</div><div class='ctx'> </div><div class='del'>-        STACK_WIND (frame, io_stats_lk_cbk,</div><div class='del'>-                    FIRST_CHILD(this),</div><div class='del'>-                    FIRST_CHILD(this)-&gt;fops-&gt;lk,</div><div class='del'>-                    fd, cmd, lock);</div><div class='del'>-        return 0;</div><div class='add'>+    STACK_WIND(frame, io_stats_getactivelk_cbk, FIRST_CHILD(this),</div><div class='add'>+               FIRST_CHILD(this)-&gt;fops-&gt;getactivelk, loc, xdata);</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+int</div><div class='add'>+io_stats_setactivelk(call_frame_t *frame, xlator_t *this, loc_t *loc,</div><div class='add'>+                     lock_migration_info_t *locklist, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    START_FOP_LATENCY(frame);</div><div class='add'>+</div><div class='add'>+    STACK_WIND(frame, io_stats_setactivelk_cbk, FIRST_CHILD(this),</div><div class='add'>+               FIRST_CHILD(this)-&gt;fops-&gt;setactivelk, loc, locklist, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-io_stats_release (xlator_t *this, fd_t *fd)</div><div class='add'>+io_stats_compound(call_frame_t *frame, xlator_t *this, void *args,</div><div class='add'>+                  dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-        struct ios_fd  *iosfd = NULL;</div><div class='add'>+    START_FOP_LATENCY(frame);</div><div class='add'>+</div><div class='add'>+    STACK_WIND(frame, io_stats_compound_cbk, FIRST_CHILD(this),</div><div class='add'>+               FIRST_CHILD(this)-&gt;fops-&gt;compound, args, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        BUMP_FOP (RELEASE);</div><div class='add'>+int</div><div class='add'>+io_stats_release(xlator_t *this, fd_t *fd)</div><div class='add'>+{</div><div class='add'>+    struct ios_fd *iosfd = NULL;</div><div class='add'>+    struct ios_conf *conf = NULL;</div><div class='ctx'> </div><div class='del'>-        ios_fd_ctx_get (fd, this, &amp;iosfd);</div><div class='del'>-        if (iosfd) {</div><div class='del'>-                io_stats_dump_fd (this, iosfd);</div><div class='add'>+    BUMP_FOP(RELEASE);</div><div class='ctx'> </div><div class='del'>-                if (iosfd-&gt;filename)</div><div class='del'>-                        GF_FREE (iosfd-&gt;filename);</div><div class='del'>-                GF_FREE (iosfd);</div><div class='add'>+    conf = this-&gt;private;</div><div class='add'>+    if (conf) {</div><div class='add'>+        LOCK(&amp;conf-&gt;lock);</div><div class='add'>+        {</div><div class='add'>+            conf-&gt;cumulative.nr_opens--;</div><div class='ctx'>         }</div><div class='add'>+        UNLOCK(&amp;conf-&gt;lock);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='add'>+    ios_fd_ctx_get(fd, this, &amp;iosfd);</div><div class='add'>+    if (iosfd) {</div><div class='add'>+        io_stats_dump_fd(this, iosfd);</div><div class='ctx'> </div><div class='add'>+        GF_FREE(iosfd-&gt;filename);</div><div class='add'>+        GF_FREE(iosfd);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-io_stats_releasedir (xlator_t *this, fd_t *fd)</div><div class='add'>+io_stats_releasedir(xlator_t *this, fd_t *fd)</div><div class='ctx'> {</div><div class='del'>-        BUMP_FOP (RELEASEDIR);</div><div class='add'>+    BUMP_FOP(RELEASEDIR);</div><div class='ctx'> </div><div class='del'>-        return 0;</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-io_stats_forget (xlator_t *this, inode_t *inode)</div><div class='add'>+io_stats_forget(xlator_t *this, inode_t *inode)</div><div class='ctx'> {</div><div class='del'>-        BUMP_FOP (FORGET);</div><div class='del'>-</div><div class='del'>-        return 0;</div><div class='add'>+    BUMP_FOP(FORGET);</div><div class='add'>+    ios_stats_cleanup(this, inode);</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-int32_t</div><div class='del'>-mem_acct_init (xlator_t *this)</div><div class='add'>+static int</div><div class='add'>+ios_init_top_stats(struct ios_conf *conf)</div><div class='ctx'> {</div><div class='del'>-        int     ret = -1;</div><div class='add'>+    int i = 0;</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(conf);</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; IOS_STATS_TYPE_MAX; i++) {</div><div class='add'>+        conf-&gt;list[i].iosstats = GF_CALLOC(1, sizeof(*conf-&gt;list[i].iosstats),</div><div class='add'>+                                           gf_io_stats_mt_ios_stat);</div><div class='ctx'> </div><div class='del'>-        if (!this)</div><div class='del'>-                return ret;</div><div class='add'>+        if (!conf-&gt;list[i].iosstats)</div><div class='add'>+            return -1;</div><div class='ctx'> </div><div class='del'>-        ret = xlator_mem_acct_init (this, gf_io_stats_mt_end + 1);</div><div class='del'>-        </div><div class='del'>-        if (ret != 0) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_ERROR, "Memory accounting init"</div><div class='del'>-                        " failed");</div><div class='del'>-                return ret;</div><div class='add'>+        INIT_LIST_HEAD(&amp;conf-&gt;list[i].iosstats-&gt;list);</div><div class='add'>+        LOCK_INIT(&amp;conf-&gt;list[i].lock);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; IOS_STATS_THRU_MAX; i++) {</div><div class='add'>+        conf-&gt;thru_list[i].iosstats = GF_CALLOC(</div><div class='add'>+            1, sizeof(*conf-&gt;thru_list[i].iosstats), gf_io_stats_mt_ios_stat);</div><div class='add'>+</div><div class='add'>+        if (!conf-&gt;thru_list[i].iosstats)</div><div class='add'>+            return -1;</div><div class='add'>+</div><div class='add'>+        INIT_LIST_HEAD(&amp;conf-&gt;thru_list[i].iosstats-&gt;list);</div><div class='add'>+        LOCK_INIT(&amp;conf-&gt;thru_list[i].lock);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+ios_destroy_top_stats(struct ios_conf *conf)</div><div class='add'>+{</div><div class='add'>+    int i = 0;</div><div class='add'>+    struct ios_stat_head *list_head = NULL;</div><div class='add'>+    struct ios_stat_list *entry = NULL;</div><div class='add'>+    struct ios_stat_list *tmp = NULL;</div><div class='add'>+    struct ios_stat_list *list = NULL;</div><div class='add'>+    struct ios_stat *stat = NULL;</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(conf);</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;conf-&gt;lock);</div><div class='add'>+</div><div class='add'>+    conf-&gt;cumulative.nr_opens = 0;</div><div class='add'>+    conf-&gt;cumulative.max_nr_opens = 0;</div><div class='add'>+    conf-&gt;cumulative.max_openfd_time.tv_sec = 0;</div><div class='add'>+    conf-&gt;cumulative.max_openfd_time.tv_usec = 0;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; IOS_STATS_TYPE_MAX; i++) {</div><div class='add'>+        list_head = &amp;conf-&gt;list[i];</div><div class='add'>+        if (!list_head)</div><div class='add'>+            continue;</div><div class='add'>+        list_for_each_entry_safe(entry, tmp, &amp;list_head-&gt;iosstats-&gt;list, list)</div><div class='add'>+        {</div><div class='add'>+            list = entry;</div><div class='add'>+            stat = list-&gt;iosstat;</div><div class='add'>+            ios_stat_unref(stat);</div><div class='add'>+            list_del(&amp;list-&gt;list);</div><div class='add'>+            GF_FREE(list);</div><div class='add'>+            list_head-&gt;members--;</div><div class='ctx'>         }</div><div class='add'>+        GF_FREE(list_head-&gt;iosstats);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; IOS_STATS_THRU_MAX; i++) {</div><div class='add'>+        list_head = &amp;conf-&gt;thru_list[i];</div><div class='add'>+        if (!list_head)</div><div class='add'>+            continue;</div><div class='add'>+        list_for_each_entry_safe(entry, tmp, &amp;list_head-&gt;iosstats-&gt;list, list)</div><div class='add'>+        {</div><div class='add'>+            list = entry;</div><div class='add'>+            stat = list-&gt;iosstat;</div><div class='add'>+            ios_stat_unref(stat);</div><div class='add'>+            list_del(&amp;list-&gt;list);</div><div class='add'>+            GF_FREE(list);</div><div class='add'>+            list_head-&gt;members--;</div><div class='add'>+        }</div><div class='add'>+        GF_FREE(list_head-&gt;iosstats);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        return ret;</div><div class='add'>+    UNLOCK(&amp;conf-&gt;lock);</div><div class='add'>+</div><div class='add'>+    return;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-init (xlator_t *this)</div><div class='add'>+static void</div><div class='add'>+io_stats_clear(struct ios_conf *conf)</div><div class='add'>+{</div><div class='add'>+    time_t now = 0;</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(conf);</div><div class='add'>+    now = gf_time();</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;conf-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        ios_global_stats_clear(&amp;conf-&gt;cumulative, now);</div><div class='add'>+        ios_global_stats_clear(&amp;conf-&gt;incremental, now);</div><div class='add'>+        conf-&gt;increment = 0;</div><div class='add'>+    }</div><div class='add'>+    UNLOCK(&amp;conf-&gt;lock);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+io_priv(xlator_t *this)</div><div class='ctx'> {</div><div class='del'>-        dict_t             *options = NULL;</div><div class='del'>-        struct ios_conf    *conf = NULL;</div><div class='del'>-        char               *str = NULL;</div><div class='del'>-        int                 ret = 0;</div><div class='add'>+    int i;</div><div class='add'>+    char key[GF_DUMP_MAX_BUF_LEN];</div><div class='add'>+    char key_prefix_cumulative[GF_DUMP_MAX_BUF_LEN];</div><div class='add'>+    char key_prefix_incremental[GF_DUMP_MAX_BUF_LEN];</div><div class='add'>+    double min, max, avg;</div><div class='add'>+    uint64_t count, total;</div><div class='add'>+    struct ios_conf *conf = NULL;</div><div class='add'>+</div><div class='add'>+    conf = this-&gt;private;</div><div class='add'>+    if (!conf)</div><div class='add'>+        return -1;</div><div class='add'>+</div><div class='add'>+    if (!conf-&gt;count_fop_hits || !conf-&gt;measure_latency)</div><div class='add'>+        return -1;</div><div class='add'>+</div><div class='add'>+    gf_proc_dump_write("cumulative.data_read", "%" GF_PRI_ATOMIC,</div><div class='add'>+                       GF_ATOMIC_GET(conf-&gt;cumulative.data_read));</div><div class='add'>+    gf_proc_dump_write("cumulative.data_written", "%" GF_PRI_ATOMIC,</div><div class='add'>+                       GF_ATOMIC_GET(conf-&gt;cumulative.data_written));</div><div class='add'>+</div><div class='add'>+    gf_proc_dump_write("incremental.data_read", "%" GF_PRI_ATOMIC,</div><div class='add'>+                       GF_ATOMIC_GET(conf-&gt;incremental.data_read));</div><div class='add'>+    gf_proc_dump_write("incremental.data_written", "%" GF_PRI_ATOMIC,</div><div class='add'>+                       GF_ATOMIC_GET(conf-&gt;incremental.data_written));</div><div class='add'>+</div><div class='add'>+    snprintf(key_prefix_cumulative, GF_DUMP_MAX_BUF_LEN, "%s.cumulative",</div><div class='add'>+             this-&gt;name);</div><div class='add'>+    snprintf(key_prefix_incremental, GF_DUMP_MAX_BUF_LEN, "%s.incremental",</div><div class='add'>+             this-&gt;name);</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; GF_FOP_MAXVALUE; i++) {</div><div class='add'>+        count = GF_ATOMIC_GET(conf-&gt;cumulative.fop_hits[i]);</div><div class='add'>+        total = conf-&gt;cumulative.latency[i].total;</div><div class='add'>+        min = conf-&gt;cumulative.latency[i].min;</div><div class='add'>+        max = conf-&gt;cumulative.latency[i].max;</div><div class='add'>+        avg = conf-&gt;cumulative.latency[i].avg;</div><div class='add'>+</div><div class='add'>+        gf_proc_dump_build_key(key, key_prefix_cumulative, "%s",</div><div class='add'>+                               (char *)gf_fop_list[i]);</div><div class='add'>+</div><div class='add'>+        gf_proc_dump_write(key, "%" PRId64 ",%" PRId64 ",%.03f,%.03f,%.03f",</div><div class='add'>+                           count, total, min, max, avg);</div><div class='add'>+</div><div class='add'>+        count = GF_ATOMIC_GET(conf-&gt;incremental.fop_hits[i]);</div><div class='add'>+        total = conf-&gt;incremental.latency[i].total;</div><div class='add'>+        min = conf-&gt;incremental.latency[i].min;</div><div class='add'>+        max = conf-&gt;incremental.latency[i].max;</div><div class='add'>+        avg = conf-&gt;incremental.latency[i].avg;</div><div class='add'>+</div><div class='add'>+        gf_proc_dump_build_key(key, key_prefix_incremental, "%s",</div><div class='add'>+                               (char *)gf_fop_list[i]);</div><div class='add'>+</div><div class='add'>+        gf_proc_dump_write(key, "%" PRId64 ",%" PRId64 ",%.03f,%.03f,%.03f",</div><div class='add'>+                           count, total, min, max, avg);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        if (!this)</div><div class='del'>-                return -1;</div><div class='add'>+static void</div><div class='add'>+ios_set_log_format_code(struct ios_conf *conf, char *dump_format_str)</div><div class='add'>+{</div><div class='add'>+    if (strcmp(dump_format_str, "json") == 0)</div><div class='add'>+        conf-&gt;dump_format = IOS_DUMP_TYPE_JSON_FILE;</div><div class='add'>+    else if (strcmp(dump_format_str, "text") == 0)</div><div class='add'>+        conf-&gt;dump_format = IOS_DUMP_TYPE_FILE;</div><div class='add'>+    else if (strcmp(dump_format_str, "dict") == 0)</div><div class='add'>+        conf-&gt;dump_format = IOS_DUMP_TYPE_DICT;</div><div class='add'>+    else if (strcmp(dump_format_str, "samples") == 0)</div><div class='add'>+        conf-&gt;dump_format = IOS_DUMP_TYPE_SAMPLES;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+xlator_set_loglevel(xlator_t *this, int log_level)</div><div class='add'>+{</div><div class='add'>+    glusterfs_ctx_t *ctx = NULL;</div><div class='add'>+    glusterfs_graph_t *active = NULL;</div><div class='add'>+    xlator_t *top = NULL;</div><div class='add'>+    xlator_t *trav = this;</div><div class='add'>+</div><div class='add'>+    ctx = this-&gt;ctx;</div><div class='add'>+    GF_ASSERT(ctx);</div><div class='add'>+    active = ctx-&gt;active;</div><div class='add'>+    top = active-&gt;first;</div><div class='add'>+</div><div class='add'>+    if (log_level == -1)</div><div class='add'>+        return;</div><div class='ctx'> </div><div class='del'>-        if (!this-&gt;children || this-&gt;children-&gt;next) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-                        "io_stats translator requires one subvolume");</div><div class='del'>-                return -1;</div><div class='add'>+    if (ctx-&gt;cmd_args.brick_mux) {</div><div class='add'>+        /* Set log-level for all brick xlators */</div><div class='add'>+        top-&gt;loglevel = log_level;</div><div class='add'>+</div><div class='add'>+        /* Set log-level for parent xlator */</div><div class='add'>+        if (this-&gt;parents)</div><div class='add'>+            this-&gt;parents-&gt;xlator-&gt;loglevel = log_level;</div><div class='add'>+</div><div class='add'>+        while (trav) {</div><div class='add'>+            trav-&gt;loglevel = log_level;</div><div class='add'>+            trav = trav-&gt;next;</div><div class='ctx'>         }</div><div class='add'>+    } else {</div><div class='add'>+        gf_log_set_loglevel(this-&gt;ctx, log_level);</div><div class='add'>+    }</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        if (!this-&gt;parents) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_WARNING,</div><div class='del'>-                        "dangling volume. check volfile ");</div><div class='add'>+int</div><div class='add'>+reconfigure(xlator_t *this, dict_t *options)</div><div class='add'>+{</div><div class='add'>+    struct ios_conf *conf = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    char *sys_log_str = NULL;</div><div class='add'>+    char *log_format_str = NULL;</div><div class='add'>+    char *logger_str = NULL;</div><div class='add'>+    char *dump_format_str = NULL;</div><div class='add'>+    int sys_log_level = -1;</div><div class='add'>+    char *log_str = NULL;</div><div class='add'>+    int log_level = -1;</div><div class='add'>+    int log_format = -1;</div><div class='add'>+    int logger = -1;</div><div class='add'>+    uint32_t log_buf_size = 0;</div><div class='add'>+    uint32_t log_flush_timeout = 0;</div><div class='add'>+    int32_t old_dump_interval;</div><div class='add'>+    int32_t threads;</div><div class='add'>+</div><div class='add'>+    if (!this || !this-&gt;private)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    conf = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    GF_OPTION_RECONF("dump-fd-stats", conf-&gt;dump_fd_stats, options, bool, out);</div><div class='add'>+</div><div class='add'>+    GF_OPTION_RECONF("count-fop-hits", conf-&gt;count_fop_hits, options, bool,</div><div class='add'>+                     out);</div><div class='add'>+</div><div class='add'>+    GF_OPTION_RECONF("latency-measurement", conf-&gt;measure_latency, options,</div><div class='add'>+                     bool, out);</div><div class='add'>+</div><div class='add'>+    old_dump_interval = conf-&gt;ios_dump_interval;</div><div class='add'>+    GF_OPTION_RECONF("ios-dump-interval", conf-&gt;ios_dump_interval, options,</div><div class='add'>+                     int32, out);</div><div class='add'>+    if ((old_dump_interval &lt;= 0) &amp;&amp; (conf-&gt;ios_dump_interval &gt; 0)) {</div><div class='add'>+        conf-&gt;dump_thread_running = _gf_true;</div><div class='add'>+        conf-&gt;dump_thread_should_die = _gf_false;</div><div class='add'>+        ret = gf_thread_create(&amp;conf-&gt;dump_thread, NULL,</div><div class='add'>+                               (void *)&amp;_ios_dump_thread, this, "iosdump");</div><div class='add'>+        if (ret) {</div><div class='add'>+            conf-&gt;dump_thread_running = _gf_false;</div><div class='add'>+            gf_log(this ? this-&gt;name : "io-stats", GF_LOG_ERROR,</div><div class='add'>+                   "Failed to start thread"</div><div class='add'>+                   "while reconfigure. Returning %d",</div><div class='add'>+                   ret);</div><div class='add'>+            goto out;</div><div class='ctx'>         }</div><div class='add'>+    } else if ((old_dump_interval &gt; 0) &amp;&amp; (conf-&gt;ios_dump_interval == 0)) {</div><div class='add'>+        _ios_destroy_dump_thread(conf);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    GF_OPTION_RECONF("ios-sample-interval", conf-&gt;ios_sample_interval, options,</div><div class='add'>+                     int32, out);</div><div class='add'>+    GF_OPTION_RECONF("ios-dump-format", dump_format_str, options, str, out);</div><div class='add'>+    ios_set_log_format_code(conf, dump_format_str);</div><div class='add'>+    GF_OPTION_RECONF("ios-sample-buf-size", conf-&gt;ios_sample_buf_size, options,</div><div class='add'>+                     int32, out);</div><div class='add'>+    GF_OPTION_RECONF("sys-log-level", sys_log_str, options, str, out);</div><div class='add'>+    if (sys_log_str) {</div><div class='add'>+        sys_log_level = glusterd_check_log_level(sys_log_str);</div><div class='add'>+        set_sys_log_level(sys_log_level);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    GF_OPTION_RECONF("log-level", log_str, options, str, out);</div><div class='add'>+    if (log_str) {</div><div class='add'>+        log_level = glusterd_check_log_level(log_str);</div><div class='add'>+        /* Set loglevel for all children and server xlators */</div><div class='add'>+        xlator_set_loglevel(this, log_level);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    GF_OPTION_RECONF("logger", logger_str, options, str, out);</div><div class='add'>+    if (logger_str) {</div><div class='add'>+        logger = gf_check_logger(logger_str);</div><div class='add'>+        gf_log_set_logger(logger);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    GF_OPTION_RECONF("log-format", log_format_str, options, str, out);</div><div class='add'>+    if (log_format_str) {</div><div class='add'>+        log_format = gf_check_log_format(log_format_str);</div><div class='add'>+        gf_log_set_logformat(log_format);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    GF_OPTION_RECONF("log-buf-size", log_buf_size, options, uint32, out);</div><div class='add'>+    gf_log_set_log_buf_size(log_buf_size);</div><div class='add'>+</div><div class='add'>+    GF_OPTION_RECONF("log-flush-timeout", log_flush_timeout, options, time,</div><div class='add'>+                     out);</div><div class='add'>+    gf_log_set_log_flush_timeout(log_flush_timeout);</div><div class='add'>+</div><div class='add'>+    GF_OPTION_RECONF("threads", threads, options, int32, out);</div><div class='add'>+    gf_async_adjust_threads(threads);</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+out:</div><div class='add'>+    gf_log(this ? this-&gt;name : "io-stats", GF_LOG_DEBUG,</div><div class='add'>+           "reconfigure returning %d", ret);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        options = this-&gt;options;</div><div class='add'>+int32_t</div><div class='add'>+mem_acct_init(xlator_t *this)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='ctx'> </div><div class='del'>-        conf = GF_CALLOC (1, sizeof(*conf), gf_io_stats_mt_ios_conf);</div><div class='add'>+    if (!this)</div><div class='add'>+        return ret;</div><div class='ctx'> </div><div class='del'>-        if (!conf) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-                        "Out of memory.");</div><div class='del'>-                return -1;</div><div class='del'>-        }</div><div class='add'>+    ret = xlator_mem_acct_init(this, gf_io_stats_mt_end + 1);</div><div class='ctx'> </div><div class='del'>-        LOCK_INIT (&amp;conf-&gt;lock);</div><div class='add'>+    if (ret != 0) {</div><div class='add'>+        gf_log(this-&gt;name, GF_LOG_ERROR,</div><div class='add'>+               "Memory accounting init"</div><div class='add'>+               " failed");</div><div class='add'>+        return ret;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        gettimeofday (&amp;conf-&gt;cumulative.started_at, NULL);</div><div class='del'>-        gettimeofday (&amp;conf-&gt;incremental.started_at, NULL);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        ret = dict_get_str (options, "dump-fd-stats", &amp;str);</div><div class='del'>-        if (ret == 0) {</div><div class='del'>-                ret = gf_string2boolean (str, &amp;conf-&gt;dump_fd_stats);</div><div class='del'>-                if (ret == -1) {</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-                                "'dump-fd-stats' takes only boolean arguments");</div><div class='del'>-                        return -1;</div><div class='del'>-                }</div><div class='add'>+void</div><div class='add'>+ios_conf_destroy(struct ios_conf *conf)</div><div class='add'>+{</div><div class='add'>+    if (!conf)</div><div class='add'>+        return;</div><div class='ctx'> </div><div class='del'>-                if (conf-&gt;dump_fd_stats) {</div><div class='del'>-			gf_log (this-&gt;name, GF_LOG_DEBUG,</div><div class='del'>-				"enabling dump-fd-stats");</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='add'>+    ios_destroy_top_stats(conf);</div><div class='add'>+    _ios_destroy_dump_thread(conf);</div><div class='add'>+    ios_destroy_sample_buf(conf-&gt;ios_sample_buf);</div><div class='add'>+    LOCK_DESTROY(&amp;conf-&gt;lock);</div><div class='add'>+    gf_dnscache_deinit(conf-&gt;dnscache);</div><div class='add'>+    GF_FREE(conf);</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        this-&gt;private = conf;</div><div class='add'>+static void</div><div class='add'>+ios_init_stats(struct ios_global_stats *stats)</div><div class='add'>+{</div><div class='add'>+    int i = 0;</div><div class='ctx'> </div><div class='del'>-        return 0;</div><div class='add'>+    GF_ATOMIC_INIT(stats-&gt;data_read, 0);</div><div class='add'>+    GF_ATOMIC_INIT(stats-&gt;data_written, 0);</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; IOS_BLOCK_COUNT_SIZE; i++) {</div><div class='add'>+        GF_ATOMIC_INIT(stats-&gt;block_count_write[i], 0);</div><div class='add'>+        GF_ATOMIC_INIT(stats-&gt;block_count_read[i], 0);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; GF_FOP_MAXVALUE; i++)</div><div class='add'>+        GF_ATOMIC_INIT(stats-&gt;fop_hits[i], 0);</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; GF_UPCALL_FLAGS_MAXVALUE; i++)</div><div class='add'>+        GF_ATOMIC_INIT(stats-&gt;upcall_hits[i], 0);</div><div class='add'>+</div><div class='add'>+    stats-&gt;started_at = gf_time();</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+int</div><div class='add'>+init(xlator_t *this)</div><div class='add'>+{</div><div class='add'>+    struct ios_conf *conf = NULL;</div><div class='add'>+    char *volume_id = NULL;</div><div class='add'>+    char *sys_log_str = NULL;</div><div class='add'>+    char *logger_str = NULL;</div><div class='add'>+    char *log_format_str = NULL;</div><div class='add'>+    char *dump_format_str = NULL;</div><div class='add'>+    int logger = -1;</div><div class='add'>+    int log_format = -1;</div><div class='add'>+    int sys_log_level = -1;</div><div class='add'>+    char *log_str = NULL;</div><div class='add'>+    int log_level = -1;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    uint32_t log_buf_size = 0;</div><div class='add'>+    uint32_t log_flush_timeout = 0;</div><div class='add'>+    int32_t threads;</div><div class='add'>+</div><div class='add'>+    if (!this)</div><div class='add'>+        return -1;</div><div class='add'>+</div><div class='add'>+    if (!this-&gt;children) {</div><div class='add'>+        gf_log(this-&gt;name, GF_LOG_ERROR,</div><div class='add'>+               "io_stats translator requires at least one subvolume");</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (!this-&gt;parents) {</div><div class='add'>+        /* This is very much valid as io-stats currently is loaded</div><div class='add'>+         * on top of volumes on both client and server, hence this is</div><div class='add'>+         * not an warning message */</div><div class='add'>+        gf_log(this-&gt;name, GF_LOG_DEBUG, "dangling volume. check volfile ");</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    conf = GF_CALLOC(1, sizeof(*conf), gf_io_stats_mt_ios_conf);</div><div class='add'>+</div><div class='add'>+    if (!conf)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    if (dict_get_str(this-&gt;options, "unique-id", &amp;conf-&gt;unique_id) != 0) {</div><div class='add'>+        /* This is always set on servers, so we must be a client. */</div><div class='add'>+        conf-&gt;unique_id = this-&gt;name;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_get_strn(this-&gt;options, "volume-id", SLEN("volume-id"),</div><div class='add'>+                        &amp;volume_id);</div><div class='add'>+    if (!ret) {</div><div class='add'>+        strncpy(this-&gt;graph-&gt;volume_id, volume_id, GF_UUID_BUF_SIZE);</div><div class='add'>+    }</div><div class='add'>+    /*</div><div class='add'>+     * Init it just after calloc, so that we are sure the lock is inited</div><div class='add'>+     * in case of error paths.</div><div class='add'>+     */</div><div class='add'>+    LOCK_INIT(&amp;conf-&gt;lock);</div><div class='add'>+    LOCK_INIT(&amp;conf-&gt;ios_sampling_lock);</div><div class='add'>+</div><div class='add'>+    ios_init_stats(&amp;conf-&gt;cumulative);</div><div class='add'>+    ios_init_stats(&amp;conf-&gt;incremental);</div><div class='add'>+</div><div class='add'>+    ret = ios_init_top_stats(conf);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    GF_OPTION_INIT("dump-fd-stats", conf-&gt;dump_fd_stats, bool, out);</div><div class='add'>+</div><div class='add'>+    GF_OPTION_INIT("count-fop-hits", conf-&gt;count_fop_hits, bool, out);</div><div class='add'>+</div><div class='add'>+    GF_OPTION_INIT("latency-measurement", conf-&gt;measure_latency, bool, out);</div><div class='add'>+</div><div class='add'>+    GF_OPTION_INIT("ios-dump-interval", conf-&gt;ios_dump_interval, int32, out);</div><div class='add'>+</div><div class='add'>+    GF_OPTION_INIT("ios-sample-interval", conf-&gt;ios_sample_interval, int32,</div><div class='add'>+                   out);</div><div class='add'>+</div><div class='add'>+    GF_OPTION_INIT("ios-dump-format", dump_format_str, str, out);</div><div class='add'>+    ios_set_log_format_code(conf, dump_format_str);</div><div class='add'>+</div><div class='add'>+    GF_OPTION_INIT("ios-sample-buf-size", conf-&gt;ios_sample_buf_size, int32,</div><div class='add'>+                   out);</div><div class='add'>+</div><div class='add'>+    ret = ios_init_sample_buf(conf);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_log(this-&gt;name, GF_LOG_ERROR, "Out of memory.");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    GF_OPTION_INIT("ios-dnscache-ttl-sec", conf-&gt;ios_dnscache_ttl_sec, int32,</div><div class='add'>+                   out);</div><div class='add'>+    conf-&gt;dnscache = gf_dnscache_init(conf-&gt;ios_dnscache_ttl_sec);</div><div class='add'>+    if (!conf-&gt;dnscache) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    GF_OPTION_INIT("sys-log-level", sys_log_str, str, out);</div><div class='add'>+    if (sys_log_str) {</div><div class='add'>+        sys_log_level = glusterd_check_log_level(sys_log_str);</div><div class='add'>+        set_sys_log_level(sys_log_level);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    GF_OPTION_INIT("log-level", log_str, str, out);</div><div class='add'>+    if (log_str) {</div><div class='add'>+        log_level = glusterd_check_log_level(log_str);</div><div class='add'>+        if (DEFAULT_LOG_LEVEL != log_level)</div><div class='add'>+            gf_log_set_loglevel(this-&gt;ctx, log_level);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    GF_OPTION_INIT("logger", logger_str, str, out);</div><div class='add'>+    if (logger_str) {</div><div class='add'>+        logger = gf_check_logger(logger_str);</div><div class='add'>+        gf_log_set_logger(logger);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    GF_OPTION_INIT("log-format", log_format_str, str, out);</div><div class='add'>+    if (log_format_str) {</div><div class='add'>+        log_format = gf_check_log_format(log_format_str);</div><div class='add'>+        gf_log_set_logformat(log_format);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    GF_OPTION_INIT("log-buf-size", log_buf_size, uint32, out);</div><div class='add'>+    gf_log_set_log_buf_size(log_buf_size);</div><div class='add'>+</div><div class='add'>+    GF_OPTION_INIT("log-flush-timeout", log_flush_timeout, time, out);</div><div class='add'>+    gf_log_set_log_flush_timeout(log_flush_timeout);</div><div class='add'>+</div><div class='add'>+    GF_OPTION_INIT("threads", threads, int32, out);</div><div class='add'>+    gf_async_adjust_threads(threads);</div><div class='add'>+</div><div class='add'>+    this-&gt;private = conf;</div><div class='add'>+    if (conf-&gt;ios_dump_interval &gt; 0) {</div><div class='add'>+        conf-&gt;dump_thread_running = _gf_true;</div><div class='add'>+        conf-&gt;dump_thread_should_die = _gf_false;</div><div class='add'>+        ret = gf_thread_create(&amp;conf-&gt;dump_thread, NULL,</div><div class='add'>+                               (void *)&amp;_ios_dump_thread, this, "iosdump");</div><div class='add'>+        if (ret) {</div><div class='add'>+            conf-&gt;dump_thread_running = _gf_false;</div><div class='add'>+            gf_log(this ? this-&gt;name : "io-stats", GF_LOG_ERROR,</div><div class='add'>+                   "Failed to start thread"</div><div class='add'>+                   "in init. Returning %d",</div><div class='add'>+                   ret);</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    return 0;</div><div class='add'>+out:</div><div class='add'>+    ios_conf_destroy(conf);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> void</div><div class='del'>-fini (xlator_t *this)</div><div class='add'>+fini(xlator_t *this)</div><div class='ctx'> {</div><div class='del'>-        struct ios_conf *conf = NULL;</div><div class='add'>+    struct ios_conf *conf = NULL;</div><div class='ctx'> </div><div class='del'>-        if (!this)</div><div class='del'>-                return;</div><div class='add'>+    if (!this)</div><div class='add'>+        return;</div><div class='ctx'> </div><div class='del'>-        conf = this-&gt;private;</div><div class='add'>+    conf = this-&gt;private;</div><div class='ctx'> </div><div class='del'>-        GF_FREE(conf);</div><div class='add'>+    ios_conf_destroy(conf);</div><div class='add'>+    this-&gt;private = NULL;</div><div class='add'>+    gf_log(this-&gt;name, GF_LOG_INFO, "io-stats translator unloaded");</div><div class='add'>+    return;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        gf_log (this-&gt;name, GF_LOG_NORMAL,</div><div class='del'>-                "io-stats translator unloaded");</div><div class='del'>-        return;</div><div class='add'>+int</div><div class='add'>+notify(xlator_t *this, int32_t event, void *data, ...)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+    struct ios_dump_args args = {0};</div><div class='add'>+    dict_t *output = NULL;</div><div class='add'>+    dict_t *dict = NULL;</div><div class='add'>+    int32_t op = 0;</div><div class='add'>+    int32_t list_cnt = 0;</div><div class='add'>+    double throughput = 0;</div><div class='add'>+    double time = 0;</div><div class='add'>+    gf_boolean_t is_peek = _gf_false;</div><div class='add'>+    va_list ap;</div><div class='add'>+    struct gf_upcall *up_data = NULL;</div><div class='add'>+    struct gf_upcall_cache_invalidation *up_ci = NULL;</div><div class='add'>+</div><div class='add'>+    dict = data;</div><div class='add'>+    va_start(ap, data);</div><div class='add'>+    output = va_arg(ap, dict_t *);</div><div class='add'>+    va_end(ap);</div><div class='add'>+    switch (event) {</div><div class='add'>+        case GF_EVENT_TRANSLATOR_INFO:</div><div class='add'>+            ret = dict_get_str_boolean(dict, "clear-stats", _gf_false);</div><div class='add'>+            if (ret) {</div><div class='add'>+                ret = dict_set_int32(output, "top-op", op);</div><div class='add'>+                if (ret) {</div><div class='add'>+                    gf_log(this-&gt;name, GF_LOG_ERROR,</div><div class='add'>+                           "Failed to set top-op in dict");</div><div class='add'>+                    goto out;</div><div class='add'>+                }</div><div class='add'>+                ios_destroy_top_stats(this-&gt;private);</div><div class='add'>+                ret = ios_init_top_stats(this-&gt;private);</div><div class='add'>+                if (ret)</div><div class='add'>+                    gf_log(this-&gt;name, GF_LOG_ERROR,</div><div class='add'>+                           "Failed to reset top stats");</div><div class='add'>+                ret = dict_set_int32(output, "stats-cleared", ret ? 0 : 1);</div><div class='add'>+                if (ret)</div><div class='add'>+                    gf_log(this-&gt;name, GF_LOG_ERROR,</div><div class='add'>+                           "Failed to set stats-cleared"</div><div class='add'>+                           " in dict");</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            ret = dict_get_int32(dict, "top-op", &amp;op);</div><div class='add'>+            if (!ret) {</div><div class='add'>+                ret = dict_get_int32(dict, "list-cnt", &amp;list_cnt);</div><div class='add'>+                if (op &gt; IOS_STATS_TYPE_NONE &amp;&amp; op &lt; IOS_STATS_TYPE_MAX)</div><div class='add'>+                    ret = io_stats_dump_stats_to_dict(this, output, op,</div><div class='add'>+                                                      list_cnt);</div><div class='add'>+                if (op == IOS_STATS_TYPE_READ_THROUGHPUT ||</div><div class='add'>+                    op == IOS_STATS_TYPE_WRITE_THROUGHPUT) {</div><div class='add'>+                    ret = dict_get_double(dict, "throughput", &amp;throughput);</div><div class='add'>+                    if (!ret) {</div><div class='add'>+                        ret = dict_get_double(dict, "time", &amp;time);</div><div class='add'>+                        if (ret)</div><div class='add'>+                            goto out;</div><div class='add'>+                        ret = dict_set_double(output, "throughput", throughput);</div><div class='add'>+                        if (ret)</div><div class='add'>+                            goto out;</div><div class='add'>+                        ret = dict_set_double(output, "time", time);</div><div class='add'>+                        if (ret)</div><div class='add'>+                            goto out;</div><div class='add'>+                    }</div><div class='add'>+                    ret = 0;</div><div class='add'>+                }</div><div class='add'>+            } else {</div><div class='add'>+                ret = dict_get_int32(dict, "info-op", &amp;op);</div><div class='add'>+                if (ret || op &lt; GF_IOS_INFO_ALL || GF_IOS_INFO_CLEAR &lt; op)</div><div class='add'>+                    op = GF_IOS_INFO_ALL;</div><div class='add'>+</div><div class='add'>+                ret = dict_set_int32(output, "info-op", op);</div><div class='add'>+                if (ret) {</div><div class='add'>+                    gf_log(this-&gt;name, GF_LOG_ERROR,</div><div class='add'>+                           "Failed to set info-op in dict");</div><div class='add'>+                    goto out;</div><div class='add'>+                }</div><div class='add'>+</div><div class='add'>+                if (GF_IOS_INFO_CLEAR == op) {</div><div class='add'>+                    io_stats_clear(this-&gt;private);</div><div class='add'>+</div><div class='add'>+                    ret = dict_set_int32(output, "stats-cleared", 1);</div><div class='add'>+                    if (ret)</div><div class='add'>+                        gf_log(this-&gt;name, GF_LOG_ERROR,</div><div class='add'>+                               "Failed to set stats-cleared"</div><div class='add'>+                               " in dict");</div><div class='add'>+                } else {</div><div class='add'>+                    ret = dict_get_str_boolean(dict, "peek", _gf_false);</div><div class='add'>+                    if (-1 != ret)</div><div class='add'>+                        is_peek = ret;</div><div class='add'>+</div><div class='add'>+                    (void)ios_dump_args_init(&amp;args, IOS_DUMP_TYPE_DICT, output);</div><div class='add'>+                    ret = io_stats_dump(this, &amp;args, op, is_peek);</div><div class='add'>+                }</div><div class='add'>+            }</div><div class='add'>+            break;</div><div class='add'>+        case GF_EVENT_UPCALL:</div><div class='add'>+            up_data = (struct gf_upcall *)data;</div><div class='add'>+            ios_bump_upcall(this, GF_UPCALL);</div><div class='add'>+</div><div class='add'>+            switch (up_data-&gt;event_type) {</div><div class='add'>+                case GF_UPCALL_RECALL_LEASE:</div><div class='add'>+                    ios_bump_upcall(this, GF_UPCALL_LEASE_RECALL);</div><div class='add'>+                    break;</div><div class='add'>+                case GF_UPCALL_CACHE_INVALIDATION:</div><div class='add'>+                    up_ci = (struct gf_upcall_cache_invalidation *)</div><div class='add'>+                                up_data-&gt;data;</div><div class='add'>+                    if (up_ci-&gt;flags &amp; (UP_XATTR | UP_XATTR_RM))</div><div class='add'>+                        ios_bump_upcall(this, GF_UPCALL_CI_XATTR);</div><div class='add'>+                    if (up_ci-&gt;flags &amp; IATT_UPDATE_FLAGS)</div><div class='add'>+                        ios_bump_upcall(this, GF_UPCALL_CI_STAT);</div><div class='add'>+                    if (up_ci-&gt;flags &amp; UP_RENAME_FLAGS)</div><div class='add'>+                        ios_bump_upcall(this, GF_UPCALL_CI_RENAME);</div><div class='add'>+                    if (up_ci-&gt;flags &amp; UP_FORGET)</div><div class='add'>+                        ios_bump_upcall(this, GF_UPCALL_CI_FORGET);</div><div class='add'>+                    if (up_ci-&gt;flags &amp; UP_NLINK)</div><div class='add'>+                        ios_bump_upcall(this, GF_UPCALL_CI_NLINK);</div><div class='add'>+                    break;</div><div class='add'>+                default:</div><div class='add'>+                    gf_msg_debug(this-&gt;name, 0,</div><div class='add'>+                                 "Unknown upcall event "</div><div class='add'>+                                 "type :%d",</div><div class='add'>+                                 up_data-&gt;event_type);</div><div class='add'>+                    break;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            default_notify(this, event, data);</div><div class='add'>+            break;</div><div class='add'>+        default:</div><div class='add'>+            default_notify(this, event, data);</div><div class='add'>+            break;</div><div class='add'>+    }</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+struct xlator_dumpops dumpops = {.priv = io_priv};</div><div class='ctx'> </div><div class='ctx'> struct xlator_fops fops = {</div><div class='del'>-        .stat        = io_stats_stat,</div><div class='del'>-        .readlink    = io_stats_readlink,</div><div class='del'>-        .mknod       = io_stats_mknod,</div><div class='del'>-        .mkdir       = io_stats_mkdir,</div><div class='del'>-        .unlink      = io_stats_unlink,</div><div class='del'>-        .rmdir       = io_stats_rmdir,</div><div class='del'>-        .symlink     = io_stats_symlink,</div><div class='del'>-        .rename      = io_stats_rename,</div><div class='del'>-        .link        = io_stats_link,</div><div class='del'>-        .truncate    = io_stats_truncate,</div><div class='del'>-        .open        = io_stats_open,</div><div class='del'>-        .readv       = io_stats_readv,</div><div class='del'>-        .writev      = io_stats_writev,</div><div class='del'>-        .statfs      = io_stats_statfs,</div><div class='del'>-        .flush       = io_stats_flush,</div><div class='del'>-        .fsync       = io_stats_fsync,</div><div class='del'>-        .setxattr    = io_stats_setxattr,</div><div class='del'>-        .getxattr    = io_stats_getxattr,</div><div class='del'>-        .removexattr = io_stats_removexattr,</div><div class='del'>-        .opendir     = io_stats_opendir,</div><div class='del'>-        .readdir     = io_stats_readdir,</div><div class='del'>-        .readdirp    = io_stats_readdirp,</div><div class='del'>-        .fsyncdir    = io_stats_fsyncdir,</div><div class='del'>-        .access      = io_stats_access,</div><div class='del'>-        .ftruncate   = io_stats_ftruncate,</div><div class='del'>-        .fstat       = io_stats_fstat,</div><div class='del'>-        .create      = io_stats_create,</div><div class='del'>-        .lk          = io_stats_lk,</div><div class='del'>-        .inodelk     = io_stats_inodelk,</div><div class='del'>-        .finodelk    = io_stats_finodelk,</div><div class='del'>-        .entrylk     = io_stats_entrylk,</div><div class='del'>-        .lookup      = io_stats_lookup,</div><div class='del'>-        .xattrop     = io_stats_xattrop,</div><div class='del'>-        .fxattrop    = io_stats_fxattrop,</div><div class='del'>-        .setattr     = io_stats_setattr,</div><div class='del'>-        .fsetattr    = io_stats_fsetattr,</div><div class='add'>+    .stat = io_stats_stat,</div><div class='add'>+    .readlink = io_stats_readlink,</div><div class='add'>+    .mknod = io_stats_mknod,</div><div class='add'>+    .mkdir = io_stats_mkdir,</div><div class='add'>+    .unlink = io_stats_unlink,</div><div class='add'>+    .rmdir = io_stats_rmdir,</div><div class='add'>+    .symlink = io_stats_symlink,</div><div class='add'>+    .rename = io_stats_rename,</div><div class='add'>+    .link = io_stats_link,</div><div class='add'>+    .truncate = io_stats_truncate,</div><div class='add'>+    .open = io_stats_open,</div><div class='add'>+    .readv = io_stats_readv,</div><div class='add'>+    .writev = io_stats_writev,</div><div class='add'>+    .statfs = io_stats_statfs,</div><div class='add'>+    .flush = io_stats_flush,</div><div class='add'>+    .fsync = io_stats_fsync,</div><div class='add'>+    .setxattr = io_stats_setxattr,</div><div class='add'>+    .getxattr = io_stats_getxattr,</div><div class='add'>+    .removexattr = io_stats_removexattr,</div><div class='add'>+    .fsetxattr = io_stats_fsetxattr,</div><div class='add'>+    .fgetxattr = io_stats_fgetxattr,</div><div class='add'>+    .fremovexattr = io_stats_fremovexattr,</div><div class='add'>+    .opendir = io_stats_opendir,</div><div class='add'>+    .readdir = io_stats_readdir,</div><div class='add'>+    .readdirp = io_stats_readdirp,</div><div class='add'>+    .fsyncdir = io_stats_fsyncdir,</div><div class='add'>+    .access = io_stats_access,</div><div class='add'>+    .ftruncate = io_stats_ftruncate,</div><div class='add'>+    .fstat = io_stats_fstat,</div><div class='add'>+    .create = io_stats_create,</div><div class='add'>+    .lk = io_stats_lk,</div><div class='add'>+    .inodelk = io_stats_inodelk,</div><div class='add'>+    .finodelk = io_stats_finodelk,</div><div class='add'>+    .entrylk = io_stats_entrylk,</div><div class='add'>+    .fentrylk = io_stats_fentrylk,</div><div class='add'>+    .lookup = io_stats_lookup,</div><div class='add'>+    .xattrop = io_stats_xattrop,</div><div class='add'>+    .fxattrop = io_stats_fxattrop,</div><div class='add'>+    .setattr = io_stats_setattr,</div><div class='add'>+    .fsetattr = io_stats_fsetattr,</div><div class='add'>+    .fallocate = io_stats_fallocate,</div><div class='add'>+    .discard = io_stats_discard,</div><div class='add'>+    .zerofill = io_stats_zerofill,</div><div class='add'>+    .ipc = io_stats_ipc,</div><div class='add'>+    .rchecksum = io_stats_rchecksum,</div><div class='add'>+    .seek = io_stats_seek,</div><div class='add'>+    .lease = io_stats_lease,</div><div class='add'>+    .getactivelk = io_stats_getactivelk,</div><div class='add'>+    .setactivelk = io_stats_setactivelk,</div><div class='add'>+    .compound = io_stats_compound,</div><div class='add'>+    .copy_file_range = io_stats_copy_file_range,</div><div class='ctx'> };</div><div class='ctx'> </div><div class='ctx'> struct xlator_cbks cbks = {</div><div class='del'>-        .release     = io_stats_release,</div><div class='del'>-        .releasedir  = io_stats_releasedir,</div><div class='del'>-        .forget      = io_stats_forget,</div><div class='add'>+    .release = io_stats_release,</div><div class='add'>+    .releasedir = io_stats_releasedir,</div><div class='add'>+    .forget = io_stats_forget,</div><div class='ctx'> };</div><div class='ctx'> </div><div class='ctx'> struct volume_options options[] = {</div><div class='del'>-        { .key  = {"dump-fd-stats"},</div><div class='del'>-          .type = GF_OPTION_TYPE_BOOL,</div><div class='del'>-        },</div><div class='del'>-        { .key  = {NULL} },</div><div class='add'>+    {.key = {"dump-fd-stats"},</div><div class='add'>+     .op_version = {1},</div><div class='add'>+     .flags = OPT_FLAG_SETTABLE | OPT_FLAG_DOC,</div><div class='add'>+     .tags = {"io-stats"},</div><div class='add'>+     .type = GF_OPTION_TYPE_BOOL,</div><div class='add'>+     .default_value = "off",</div><div class='add'>+     .description = "If on stats related to file-operations would be "</div><div class='add'>+                    "tracked inside GlusterFS data-structures."},</div><div class='add'>+    {.key = {"ios-dump-interval"},</div><div class='add'>+     .type = GF_OPTION_TYPE_INT,</div><div class='add'>+     .op_version = {1},</div><div class='add'>+     .flags = OPT_FLAG_SETTABLE | OPT_FLAG_DOC,</div><div class='add'>+     .tags = {"io-stats"},</div><div class='add'>+     .min = 0,</div><div class='add'>+     .max = 3600,</div><div class='add'>+     .default_value = "0",</div><div class='add'>+     .description = "Interval (in seconds) at which to auto-dump "</div><div class='add'>+                    "statistics. Zero disables automatic dumping."},</div><div class='add'>+    {.key = {"ios-sample-interval"},</div><div class='add'>+     .type = GF_OPTION_TYPE_INT,</div><div class='add'>+     .op_version = {1},</div><div class='add'>+     .flags = OPT_FLAG_SETTABLE | OPT_FLAG_DOC,</div><div class='add'>+     .tags = {"io-stats"},</div><div class='add'>+     .min = 0,</div><div class='add'>+     .max = 65535,</div><div class='add'>+     .default_value = "0",</div><div class='add'>+     .description = "Interval in which we want to collect FOP latency "</div><div class='add'>+                    "samples.  2 means collect a sample every 2nd FOP."},</div><div class='add'>+    {.key = {"ios-dump-format"},</div><div class='add'>+     .type = GF_OPTION_TYPE_STR,</div><div class='add'>+     .op_version = {GD_OP_VERSION_3_12_0},</div><div class='add'>+     .flags = OPT_FLAG_SETTABLE | OPT_FLAG_DOC,</div><div class='add'>+     .tags = {"io-stats"},</div><div class='add'>+     .default_value = "json",</div><div class='add'>+     .description = " The dump-format option specifies the format in which"</div><div class='add'>+                    " to dump the statistics. Select between \"text\", "</div><div class='add'>+                    "\"json\", \"dict\" and \"samples\". Default is "</div><div class='add'>+                    "\"json\".",</div><div class='add'>+     .value = {"text", "json", "dict", "samples"}},</div><div class='add'>+    {.key = {"ios-sample-buf-size"},</div><div class='add'>+     .type = GF_OPTION_TYPE_INT,</div><div class='add'>+     .op_version = {1},</div><div class='add'>+     .flags = OPT_FLAG_SETTABLE | OPT_FLAG_DOC,</div><div class='add'>+     .tags = {"io-stats"},</div><div class='add'>+     .min = 1024,</div><div class='add'>+     .max = 1024 * 1024,</div><div class='add'>+     .default_value = "65535",</div><div class='add'>+     .description = "The maximum size of our FOP sampling ring buffer."},</div><div class='add'>+    {.key = {"ios-dnscache-ttl-sec"},</div><div class='add'>+     .type = GF_OPTION_TYPE_INT,</div><div class='add'>+     .op_version = {1},</div><div class='add'>+     .flags = OPT_FLAG_SETTABLE | OPT_FLAG_DOC,</div><div class='add'>+     .tags = {"io-stats"},</div><div class='add'>+     .min = 1,</div><div class='add'>+     .max = 3600 * 72,</div><div class='add'>+     .default_value = "86400",</div><div class='add'>+     .description = "The interval after wish a cached DNS entry will be "</div><div class='add'>+                    "re-validated.  Default: 24 hrs"},</div><div class='add'>+    {.key = {"latency-measurement"},</div><div class='add'>+     .type = GF_OPTION_TYPE_BOOL,</div><div class='add'>+     .op_version = {1},</div><div class='add'>+     .flags = OPT_FLAG_SETTABLE | OPT_FLAG_DOC,</div><div class='add'>+     .tags = {"io-stats"},</div><div class='add'>+     .default_value = "off",</div><div class='add'>+     .description = "If on stats related to the latency of each operation "</div><div class='add'>+                    "would be tracked inside GlusterFS data-structures. "},</div><div class='add'>+    {</div><div class='add'>+        .key = {"count-fop-hits"},</div><div class='add'>+        .type = GF_OPTION_TYPE_BOOL,</div><div class='add'>+        .op_version = {1},</div><div class='add'>+        .flags = OPT_FLAG_SETTABLE,</div><div class='add'>+        .tags = {"io-stats"},</div><div class='add'>+    },</div><div class='add'>+    {.key = {"log-level"},</div><div class='add'>+     .type = GF_OPTION_TYPE_STR,</div><div class='add'>+     .value = {"DEBUG", "WARNING", "ERROR", "INFO", "CRITICAL", "NONE",</div><div class='add'>+               "TRACE"}},</div><div class='add'>+</div><div class='add'>+    /* These are synthetic entries to assist validation of CLI's  *</div><div class='add'>+     *  volume set  command                                       */</div><div class='add'>+    {.key = {"client-log-level"},</div><div class='add'>+     .type = GF_OPTION_TYPE_STR,</div><div class='add'>+     .op_version = {1},</div><div class='add'>+     .flags = OPT_FLAG_SETTABLE | OPT_FLAG_CLIENT_OPT | OPT_FLAG_DOC,</div><div class='add'>+     .tags = {"io-stats"},</div><div class='add'>+     .default_value = "INFO",</div><div class='add'>+     .description = "Changes the log-level of the clients",</div><div class='add'>+     .value = {"DEBUG", "WARNING", "ERROR", "INFO", "CRITICAL", "NONE",</div><div class='add'>+               "TRACE"}},</div><div class='add'>+    {.key = {"sys-log-level"},</div><div class='add'>+     .type = GF_OPTION_TYPE_STR,</div><div class='add'>+     .default_value = "CRITICAL",</div><div class='add'>+     .description = "Gluster's syslog log-level",</div><div class='add'>+     .value = {"WARNING", "ERROR", "INFO", "CRITICAL"}},</div><div class='add'>+    {.key = {"brick-log-level"},</div><div class='add'>+     .type = GF_OPTION_TYPE_STR,</div><div class='add'>+     .op_version = {1},</div><div class='add'>+     .flags = OPT_FLAG_SETTABLE | OPT_FLAG_DOC,</div><div class='add'>+     .tags = {"io-stats"},</div><div class='add'>+     .default_value = "INFO",</div><div class='add'>+     .description = "Changes the log-level of the bricks",</div><div class='add'>+     .value = {"DEBUG", "WARNING", "ERROR", "INFO", "CRITICAL", "NONE",</div><div class='add'>+               "TRACE"}},</div><div class='add'>+    {.key = {"logger"},</div><div class='add'>+     .type = GF_OPTION_TYPE_STR,</div><div class='add'>+     .value = {GF_LOGGER_GLUSTER_LOG, GF_LOGGER_SYSLOG}},</div><div class='add'>+    {.key = {"client-logger"},</div><div class='add'>+     .type = GF_OPTION_TYPE_STR,</div><div class='add'>+     .op_version = {GD_OP_VERSION_3_6_0},</div><div class='add'>+     .flags = OPT_FLAG_SETTABLE | OPT_FLAG_CLIENT_OPT | OPT_FLAG_DOC,</div><div class='add'>+     .tags = {"io-stats"},</div><div class='add'>+     .default_value = GF_LOGGER_GLUSTER_LOG,</div><div class='add'>+     .description = "Changes the logging sub-system to log to, for the "</div><div class='add'>+                    "clients",</div><div class='add'>+     .value = {GF_LOGGER_GLUSTER_LOG, GF_LOGGER_SYSLOG}},</div><div class='add'>+    {.key = {"brick-logger"},</div><div class='add'>+     .type = GF_OPTION_TYPE_STR,</div><div class='add'>+     .op_version = {GD_OP_VERSION_3_6_0},</div><div class='add'>+     .flags = OPT_FLAG_SETTABLE | OPT_FLAG_DOC,</div><div class='add'>+     .tags = {"io-stats"},</div><div class='add'>+     .default_value = GF_LOGGER_GLUSTER_LOG,</div><div class='add'>+     .description = "Changes the logging sub-system to log to, for the "</div><div class='add'>+                    "bricks",</div><div class='add'>+     .value = {GF_LOGGER_GLUSTER_LOG, GF_LOGGER_SYSLOG}},</div><div class='add'>+    {.key = {"log-format"},</div><div class='add'>+     .type = GF_OPTION_TYPE_STR,</div><div class='add'>+     .value = {GF_LOG_FORMAT_NO_MSG_ID, GF_LOG_FORMAT_WITH_MSG_ID}},</div><div class='add'>+    {.key = {"client-log-format"},</div><div class='add'>+     .type = GF_OPTION_TYPE_STR,</div><div class='add'>+     .op_version = {GD_OP_VERSION_3_6_0},</div><div class='add'>+     .flags = OPT_FLAG_SETTABLE | OPT_FLAG_CLIENT_OPT | OPT_FLAG_DOC,</div><div class='add'>+     .tags = {"io-stats"},</div><div class='add'>+     .default_value = GF_LOG_FORMAT_WITH_MSG_ID,</div><div class='add'>+     .description = "Changes log format for the clients",</div><div class='add'>+     .value = {GF_LOG_FORMAT_NO_MSG_ID, GF_LOG_FORMAT_WITH_MSG_ID}},</div><div class='add'>+    {.key = {"brick-log-format"},</div><div class='add'>+     .type = GF_OPTION_TYPE_STR,</div><div class='add'>+     .op_version = {GD_OP_VERSION_3_6_0},</div><div class='add'>+     .flags = OPT_FLAG_SETTABLE | OPT_FLAG_DOC,</div><div class='add'>+     .tags = {"io-stats"},</div><div class='add'>+     .default_value = GF_LOG_FORMAT_WITH_MSG_ID,</div><div class='add'>+     .description = "Changes the log format for the bricks",</div><div class='add'>+     .value = {GF_LOG_FORMAT_NO_MSG_ID, GF_LOG_FORMAT_WITH_MSG_ID}},</div><div class='add'>+    {</div><div class='add'>+        .key = {"log-buf-size"},</div><div class='add'>+        .type = GF_OPTION_TYPE_INT,</div><div class='add'>+        .min = GF_LOG_LRU_BUFSIZE_MIN,</div><div class='add'>+        .max = GF_LOG_LRU_BUFSIZE_MAX,</div><div class='add'>+        .default_value = "5",</div><div class='add'>+    },</div><div class='add'>+    {.key = {"client-log-buf-size"},</div><div class='add'>+     .type = GF_OPTION_TYPE_INT,</div><div class='add'>+     .op_version = {GD_OP_VERSION_3_6_0},</div><div class='add'>+     .flags = OPT_FLAG_SETTABLE | OPT_FLAG_CLIENT_OPT | OPT_FLAG_DOC,</div><div class='add'>+     .tags = {"io-stats"},</div><div class='add'>+     .min = GF_LOG_LRU_BUFSIZE_MIN,</div><div class='add'>+     .max = GF_LOG_LRU_BUFSIZE_MAX,</div><div class='add'>+     .default_value = "5",</div><div class='add'>+     .description = "This option determines the maximum number of unique "</div><div class='add'>+                    "log messages that can be buffered for a time equal to"</div><div class='add'>+                    " the value of the option client-log-flush-timeout."},</div><div class='add'>+    {.key = {"brick-log-buf-size"},</div><div class='add'>+     .type = GF_OPTION_TYPE_INT,</div><div class='add'>+     .op_version = {GD_OP_VERSION_3_6_0},</div><div class='add'>+     .flags = OPT_FLAG_SETTABLE | OPT_FLAG_DOC,</div><div class='add'>+     .tags = {"io-stats"},</div><div class='add'>+     .min = GF_LOG_LRU_BUFSIZE_MIN,</div><div class='add'>+     .max = GF_LOG_LRU_BUFSIZE_MAX,</div><div class='add'>+     .default_value = "5",</div><div class='add'>+     .description = "This option determines the maximum number of unique "</div><div class='add'>+                    "log messages that can be buffered for a time equal to"</div><div class='add'>+                    " the value of the option brick-log-flush-timeout."},</div><div class='add'>+    {</div><div class='add'>+        .key = {"log-flush-timeout"},</div><div class='add'>+        .type = GF_OPTION_TYPE_TIME,</div><div class='add'>+        .min = GF_LOG_FLUSH_TIMEOUT_MIN,</div><div class='add'>+        .max = GF_LOG_FLUSH_TIMEOUT_MAX,</div><div class='add'>+        .default_value = "120",</div><div class='add'>+    },</div><div class='add'>+    {.key = {"client-log-flush-timeout"},</div><div class='add'>+     .type = GF_OPTION_TYPE_TIME,</div><div class='add'>+     .op_version = {GD_OP_VERSION_3_6_0},</div><div class='add'>+     .flags = OPT_FLAG_SETTABLE | OPT_FLAG_CLIENT_OPT | OPT_FLAG_DOC,</div><div class='add'>+     .tags = {"io-stats"},</div><div class='add'>+     .min = GF_LOG_FLUSH_TIMEOUT_MIN,</div><div class='add'>+     .max = GF_LOG_FLUSH_TIMEOUT_MAX,</div><div class='add'>+     .default_value = "120",</div><div class='add'>+     .description = "This option determines the maximum number of unique "</div><div class='add'>+                    "log messages that can be buffered for a time equal to"</div><div class='add'>+                    " the value of the option client-log-flush-timeout."},</div><div class='add'>+    {.key = {"brick-log-flush-timeout"},</div><div class='add'>+     .type = GF_OPTION_TYPE_TIME,</div><div class='add'>+     .op_version = {GD_OP_VERSION_3_6_0},</div><div class='add'>+     .flags = OPT_FLAG_SETTABLE | OPT_FLAG_DOC,</div><div class='add'>+     .tags = {"io-stats"},</div><div class='add'>+     .min = GF_LOG_FLUSH_TIMEOUT_MIN,</div><div class='add'>+     .max = GF_LOG_FLUSH_TIMEOUT_MAX,</div><div class='add'>+     .default_value = "120",</div><div class='add'>+     .description = "This option determines the maximum number of unique "</div><div class='add'>+                    "log messages that can be buffered for a time equal to"</div><div class='add'>+                    " the value of the option brick-log-flush-timeout."},</div><div class='add'>+    {.key = {"unique-id"},</div><div class='add'>+     .type = GF_OPTION_TYPE_STR,</div><div class='add'>+     .default_value = "/no/such/path",</div><div class='add'>+     .description = "Unique ID for our files."},</div><div class='add'>+    {.key = {"global-threading"},</div><div class='add'>+     .type = GF_OPTION_TYPE_BOOL,</div><div class='add'>+     .default_value = "off",</div><div class='add'>+     .op_version = {GD_OP_VERSION_6_0},</div><div class='add'>+     .flags = OPT_FLAG_SETTABLE,</div><div class='add'>+     .tags = {"io-stats", "threading"},</div><div class='add'>+     .description = "This option enables the global threading support for "</div><div class='add'>+                    "bricks. If enabled, it's recommended to also enable "</div><div class='add'>+                    "'performance.iot-pass-through'"},</div><div class='add'>+    {.key = {"threads"}, .type = GF_OPTION_TYPE_INT},</div><div class='add'>+    {.key = {"brick-threads"},</div><div class='add'>+     .type = GF_OPTION_TYPE_INT,</div><div class='add'>+     .default_value = "16",</div><div class='add'>+     .min = 0,</div><div class='add'>+     .max = GF_ASYNC_MAX_THREADS,</div><div class='add'>+     .op_version = {GD_OP_VERSION_6_0},</div><div class='add'>+     .flags = OPT_FLAG_SETTABLE | OPT_FLAG_DOC,</div><div class='add'>+     .tags = {"io-stats", "threading"},</div><div class='add'>+     .description = "When global threading is used, this value determines the "</div><div class='add'>+                    "maximum amount of threads that can be created on bricks"},</div><div class='add'>+    {.key = {"client-threads"},</div><div class='add'>+     .type = GF_OPTION_TYPE_INT,</div><div class='add'>+     .default_value = "16",</div><div class='add'>+     .min = 0,</div><div class='add'>+     .max = GF_ASYNC_MAX_THREADS,</div><div class='add'>+     .op_version = {GD_OP_VERSION_6_0},</div><div class='add'>+     .flags = OPT_FLAG_SETTABLE | OPT_FLAG_DOC | OPT_FLAG_CLIENT_OPT,</div><div class='add'>+     .tags = {"io-stats", "threading"},</div><div class='add'>+     .description = "When global threading is used, this value determines the "</div><div class='add'>+                    "maximum amount of threads that can be created on clients"},</div><div class='add'>+    {.key = {"volume-id"},</div><div class='add'>+     .type = GF_OPTION_TYPE_STR,</div><div class='add'>+     .op_version = {GD_OP_VERSION_7_1},</div><div class='add'>+     .tags = {"global", "volume-id"},</div><div class='add'>+     .description =</div><div class='add'>+         "This option points to the 'unique' UUID particular to this "</div><div class='add'>+         "volume, which would be set in 'graph-&gt;volume_id'"},</div><div class='add'>+    {.key = {NULL}},</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+xlator_api_t xlator_api = {</div><div class='add'>+    .init = init,</div><div class='add'>+    .fini = fini,</div><div class='add'>+    .notify = notify,</div><div class='add'>+    .reconfigure = reconfigure,</div><div class='add'>+    .mem_acct_init = mem_acct_init,</div><div class='add'>+    .op_version = {1}, /* Present from the initial version */</div><div class='add'>+    .dumpops = &amp;dumpops,</div><div class='add'>+    .fops = &amp;fops,</div><div class='add'>+    .cbks = &amp;cbks,</div><div class='add'>+    .options = options,</div><div class='add'>+    .identifier = "io-stats",</div><div class='add'>+    .category = GF_MAINTAINED,</div><div class='ctx'> };</div><div class='head'>diff --git a/scheduler/alu/Makefile.am b/xlators/debug/sink/Makefile.am<br/>index d471a3f9243..f2689244371 100644<br/>--- a/<a href='/cgit/glusterfs.git/tree/scheduler/alu/Makefile.am?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>scheduler/alu/Makefile.am</a><br/>+++ b/<a href='/cgit/glusterfs.git/tree/xlators/debug/sink/Makefile.am?id=d1d7a6f35c816822fab51c820e25023863c239c1'>xlators/debug/sink/Makefile.am</a></div><div class='hunk'>@@ -1,3 +1,2 @@</div><div class='ctx'> SUBDIRS = src</div><div class='ctx'> </div><div class='del'>-CLEANFILES = </div><div class='head'>diff --git a/xlators/debug/sink/src/Makefile.am b/xlators/debug/sink/src/Makefile.am<br/>new file mode 100644<br/>index 00000000000..f952c2ce6bc<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/xlators/debug/sink/src/Makefile.am?id=d1d7a6f35c816822fab51c820e25023863c239c1'>xlators/debug/sink/src/Makefile.am</a></div><div class='hunk'>@@ -0,0 +1,14 @@</div><div class='add'>+xlator_LTLIBRARIES = sink.la</div><div class='add'>+xlatordir = $(libdir)/glusterfs/$(PACKAGE_VERSION)/xlator/debug</div><div class='add'>+</div><div class='add'>+AM_CPPFLAGS = $(GF_CPPFLAGS) -I$(top_srcdir)/libglusterfs/src \</div><div class='add'>+        -I$(top_builddir)/rpc/xdr/src</div><div class='add'>+AM_CFLAGS = -Wall $(GF_CFLAGS)</div><div class='add'>+</div><div class='add'>+sink_la_LDFLAGS = -module $(GF_XLATOR_DEFAULT_LDFLAGS)</div><div class='add'>+</div><div class='add'>+sink_la_SOURCES = sink.c</div><div class='add'>+sink_la_LIBADD = $(top_builddir)/libglusterfs/src/libglusterfs.la</div><div class='add'>+</div><div class='add'>+CLEANFILES =</div><div class='add'>+</div><div class='head'>diff --git a/xlators/debug/sink/src/sink.c b/xlators/debug/sink/src/sink.c<br/>new file mode 100644<br/>index 00000000000..9822bbb732e<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/xlators/debug/sink/src/sink.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>xlators/debug/sink/src/sink.c</a></div><div class='hunk'>@@ -0,0 +1,94 @@</div><div class='add'>+/*</div><div class='add'>+   Copyright (c) 2017 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+   This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+   This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+   General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+   later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+   cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#include &lt;glusterfs/xlator.h&gt;</div><div class='add'>+#include &lt;glusterfs/defaults.h&gt;</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+init(xlator_t *this)</div><div class='add'>+{</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+fini(xlator_t *this)</div><div class='add'>+{</div><div class='add'>+    return;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+ * notify - when parent sends PARENT_UP, send CHILD_UP event from here</div><div class='add'>+ */</div><div class='add'>+int32_t</div><div class='add'>+notify(xlator_t *this, int32_t event, void *data, ...)</div><div class='add'>+{</div><div class='add'>+    switch (event) {</div><div class='add'>+        case GF_EVENT_PARENT_UP:</div><div class='add'>+            /* Tell the parent that this xlator is up */</div><div class='add'>+            default_notify(this, GF_EVENT_CHILD_UP, data);</div><div class='add'>+            break;</div><div class='add'>+        case GF_EVENT_PARENT_DOWN:</div><div class='add'>+            /* Tell the parent that this xlator is down */</div><div class='add'>+            default_notify(this, GF_EVENT_CHILD_DOWN, data);</div><div class='add'>+            break;</div><div class='add'>+        default:</div><div class='add'>+            break;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+ * A lookup on "/" is done while mounting or glfs_init() is performed. This</div><div class='add'>+ * needs to return a valid directory for the root of the mountpoint.</div><div class='add'>+ *</div><div class='add'>+ * In case this xlator is used for more advanced debugging, it will need to be</div><div class='add'>+ * extended to support different LOOKUPs too.</div><div class='add'>+ */</div><div class='add'>+static int32_t</div><div class='add'>+sink_lookup(call_frame_t *frame, xlator_t *this, loc_t *loc, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    struct iatt stbuf = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    struct iatt postparent = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    /* the root of the volume always need to be a directory */</div><div class='add'>+    stbuf.ia_type = IA_IFDIR;</div><div class='add'>+</div><div class='add'>+    STACK_UNWIND_STRICT(lookup, frame, 0, 0, loc ? loc-&gt;inode : NULL, &amp;stbuf,</div><div class='add'>+                        xdata, &amp;postparent);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+struct xlator_fops fops = {</div><div class='add'>+    .lookup = sink_lookup,</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct xlator_cbks cbks = {};</div><div class='add'>+</div><div class='add'>+struct volume_options options[] = {</div><div class='add'>+    {.key = {NULL}},</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+xlator_api_t xlator_api = {</div><div class='add'>+    .init = init,</div><div class='add'>+    .fini = fini,</div><div class='add'>+    .notify = notify,</div><div class='add'>+    .op_version = {GD_OP_VERSION_3_12_0},</div><div class='add'>+    .fops = &amp;fops,</div><div class='add'>+    .cbks = &amp;cbks,</div><div class='add'>+    .options = options,</div><div class='add'>+    .identifier = "sink",</div><div class='add'>+    .category = GF_TECH_PREVIEW,</div><div class='add'>+};</div><div class='head'>diff --git a/xlators/debug/trace/src/Makefile.am b/xlators/debug/trace/src/Makefile.am<br/>index 0f1679a049d..a37ea63af04 100644<br/>--- a/<a href='/cgit/glusterfs.git/tree/xlators/debug/trace/src/Makefile.am?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/debug/trace/src/Makefile.am</a><br/>+++ b/<a href='/cgit/glusterfs.git/tree/xlators/debug/trace/src/Makefile.am?id=d1d7a6f35c816822fab51c820e25023863c239c1'>xlators/debug/trace/src/Makefile.am</a></div><div class='hunk'>@@ -2,13 +2,16 @@</div><div class='ctx'> xlator_LTLIBRARIES = trace.la</div><div class='ctx'> xlatordir = $(libdir)/glusterfs/$(PACKAGE_VERSION)/xlator/debug</div><div class='ctx'> </div><div class='del'>-trace_la_LDFLAGS = -module -avoidversion</div><div class='add'>+trace_la_LDFLAGS = -module $(GF_XLATOR_DEFAULT_LDFLAGS)</div><div class='ctx'> </div><div class='ctx'> trace_la_SOURCES = trace.c</div><div class='ctx'> trace_la_LIBADD = $(top_builddir)/libglusterfs/src/libglusterfs.la</div><div class='ctx'> </div><div class='del'>-AM_CFLAGS = -fPIC -D_FILE_OFFSET_BITS=64 -D_GNU_SOURCE -Wall -D$(GF_HOST_OS)\</div><div class='del'>-	-I$(top_srcdir)/libglusterfs/src -shared -nostartfiles $(GF_CFLAGS)</div><div class='add'>+noinst_HEADERS = trace.h trace-mem-types.h</div><div class='add'>+AM_CPPFLAGS = $(GF_CPPFLAGS) -I$(top_srcdir)/libglusterfs/src \</div><div class='add'>+	-I$(top_srcdir)/rpc/xdr/src -I$(top_builddir)/rpc/xdr/src</div><div class='add'>+</div><div class='add'>+AM_CFLAGS = -Wall $(GF_CFLAGS)</div><div class='ctx'> </div><div class='ctx'> CLEANFILES = </div><div class='ctx'> </div><div class='head'>diff --git a/xlators/debug/trace/src/trace-mem-types.h b/xlators/debug/trace/src/trace-mem-types.h<br/>new file mode 100644<br/>index 00000000000..18a7e0414a6<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/xlators/debug/trace/src/trace-mem-types.h?id=d1d7a6f35c816822fab51c820e25023863c239c1'>xlators/debug/trace/src/trace-mem-types.h</a></div><div class='hunk'>@@ -0,0 +1,20 @@</div><div class='add'>+/*</div><div class='add'>+   Copyright (c) 2006-2012 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+   This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+   This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+   General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+   later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+   cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#ifndef __TRACE_MEM_TYPES_H__</div><div class='add'>+#define __TRACE_MEM_TYPES_H__</div><div class='add'>+</div><div class='add'>+#include &lt;glusterfs/mem-types.h&gt;</div><div class='add'>+</div><div class='add'>+enum gf_trace_mem_types_ {</div><div class='add'>+    gf_trace_mt_trace_conf_t = gf_common_mt_end + 1,</div><div class='add'>+    gf_trace_mt_end</div><div class='add'>+};</div><div class='add'>+#endif</div><div class='head'>diff --git a/xlators/debug/trace/src/trace.c b/xlators/debug/trace/src/trace.c<br/>index 32a3869e6df..6ed0ca00342 100644<br/>--- a/<a href='/cgit/glusterfs.git/tree/xlators/debug/trace/src/trace.c?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/debug/trace/src/trace.c</a><br/>+++ b/<a href='/cgit/glusterfs.git/tree/xlators/debug/trace/src/trace.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>xlators/debug/trace/src/trace.c</a></div><div class='hunk'>@@ -1,26 +1,15 @@</div><div class='ctx'> /*</div><div class='del'>-  Copyright (c) 2006-2009 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='add'>+  Copyright (c) 2006-2012 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='ctx'>   This file is part of GlusterFS.</div><div class='ctx'> </div><div class='del'>-  GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-  it under the terms of the GNU General Public License as published</div><div class='del'>-  by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-  or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-  GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-  WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-  General Public License for more details.</div><div class='del'>-</div><div class='del'>-  You should have received a copy of the GNU General Public License</div><div class='del'>-  along with this program.  If not, see</div><div class='del'>-  &lt;http://www.gnu.org/licenses/&gt;.</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='ctx'> */</div><div class='ctx'> </div><div class='del'>-#ifndef _CONFIG_H</div><div class='del'>-#define _CONFIG_H</div><div class='del'>-#include "config.h"</div><div class='del'>-#endif</div><div class='add'>+#include "trace.h"</div><div class='add'>+#include "trace-mem-types.h"</div><div class='ctx'> </div><div class='ctx'> /**</div><div class='ctx'>  * xlators/debug/trace :</div><div class='hunk'>@@ -28,2108 +17,3518 @@</div><div class='ctx'>  *    their _cbk functions, which later passes the call to next layer.</div><div class='ctx'>  *    Very helpful translator for debugging.</div><div class='ctx'>  */</div><div class='add'>+#define TRACE_STAT_TO_STR(buf, str) trace_stat_to_str(buf, str, sizeof(str))</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+trace_stat_to_str(struct iatt *buf, char *str, size_t len)</div><div class='add'>+{</div><div class='add'>+    char atime_buf[GF_TIMESTR_SIZE] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    char mtime_buf[GF_TIMESTR_SIZE] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    char ctime_buf[GF_TIMESTR_SIZE] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    if (!buf)</div><div class='add'>+        return;</div><div class='ctx'> </div><div class='del'>-#include &lt;time.h&gt;</div><div class='del'>-#include &lt;errno.h&gt;</div><div class='del'>-#include "glusterfs.h"</div><div class='del'>-#include "xlator.h"</div><div class='del'>-#include "common-utils.h"</div><div class='del'>-</div><div class='del'>-#define ERR_EINVAL_NORETURN(cond)                               \</div><div class='del'>-        do                                                      \</div><div class='del'>-        {                                                       \</div><div class='del'>-                if ((cond))                                     \</div><div class='del'>-                {                                               \</div><div class='del'>-                        gf_log ("ERROR", GF_LOG_ERROR,          \</div><div class='del'>-                                "%s: %s: (%s) is true",         \</div><div class='del'>-                                __FILE__, __FUNCTION__, #cond); \</div><div class='del'>-                }                                               \</div><div class='del'>-        } while (0)</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-typedef struct trace_private {</div><div class='del'>-        int32_t debug_flag;</div><div class='del'>-} trace_private_t;</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-struct {</div><div class='del'>-        char *name;</div><div class='del'>-        int enabled;</div><div class='del'>-} trace_fop_names[GF_FOP_MAXVALUE];</div><div class='del'>-</div><div class='del'>-int trace_log_level = GF_LOG_NORMAL;</div><div class='del'>-</div><div class='del'>-static char *</div><div class='del'>-trace_stat_to_str (struct iatt *stbuf)</div><div class='del'>-{</div><div class='del'>-        char    *statstr           = NULL;</div><div class='del'>-        char     atime_buf[256]    = {0,};</div><div class='del'>-        char     mtime_buf[256]    = {0,};</div><div class='del'>-        char     ctime_buf[256]    = {0,};</div><div class='del'>-        int      asprint_ret_value = 0;</div><div class='del'>-        uint64_t ia_time           = 0;</div><div class='del'>-</div><div class='del'>-        ia_time = stbuf-&gt;ia_atime;</div><div class='del'>-        strftime (atime_buf, 256, "[%b %d %H:%M:%S]",</div><div class='del'>-                  localtime ((time_t *)&amp;ia_time));</div><div class='del'>-</div><div class='del'>-        ia_time = stbuf-&gt;ia_mtime;</div><div class='del'>-        strftime (mtime_buf, 256, "[%b %d %H:%M:%S]",</div><div class='del'>-                  localtime ((time_t *)&amp;ia_time));</div><div class='del'>-</div><div class='del'>-        ia_time = stbuf-&gt;ia_ctime;</div><div class='del'>-        strftime (ctime_buf, 256, "[%b %d %H:%M:%S]",</div><div class='del'>-                  localtime ((time_t *)&amp;ia_time));</div><div class='del'>-</div><div class='del'>-        asprint_ret_value = gf_asprintf (&amp;statstr,</div><div class='del'>-                                      "ia_ino=%"PRIu64", ia_gen=%"PRIu64</div><div class='del'>-                                      ", st_mode=%o, ia_nlink=%"GF_PRI_NLINK", "</div><div class='del'>-                                      "ia_uid=%d, ia_gid=%d, ia_size=%"PRId64", ia_blocks=%"PRId64</div><div class='del'>-                                      ", ia_atime=%s, ia_mtime=%s, ia_ctime=%s",</div><div class='del'>-                                      stbuf-&gt;ia_ino, stbuf-&gt;ia_gen,</div><div class='del'>-                                      st_mode_from_ia (stbuf-&gt;ia_prot, stbuf-&gt;ia_type),</div><div class='del'>-                                      stbuf-&gt;ia_nlink, stbuf-&gt;ia_uid,</div><div class='del'>-                                      stbuf-&gt;ia_gid, stbuf-&gt;ia_size,</div><div class='del'>-                                      stbuf-&gt;ia_blocks, atime_buf,</div><div class='del'>-                                      mtime_buf, ctime_buf);</div><div class='del'>-</div><div class='del'>-        if (asprint_ret_value &lt; 0)</div><div class='del'>-                statstr = NULL;</div><div class='del'>-</div><div class='del'>-        return statstr;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-trace_create_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-                  int32_t op_ret, int32_t op_errno, fd_t *fd,</div><div class='del'>-                  inode_t *inode, struct iatt *buf,</div><div class='del'>-                  struct iatt *preparent, struct iatt *postparent)</div><div class='del'>-{</div><div class='del'>-        char  *statstr = NULL;</div><div class='del'>-        char  *preparentstr = NULL;</div><div class='del'>-        char  *postparentstr = NULL;</div><div class='del'>-</div><div class='del'>-        if (trace_fop_names[GF_FOP_CREATE].enabled) {</div><div class='del'>-                if (op_ret &gt;= 0) {</div><div class='del'>-                        statstr = trace_stat_to_str (buf);</div><div class='del'>-                        preparentstr = trace_stat_to_str (preparent);</div><div class='del'>-                        postparentstr = trace_stat_to_str (postparent);</div><div class='del'>-</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_NORMAL,</div><div class='del'>-                                "%"PRId64": (op_ret=%d, fd=%p, ino=%"PRIu64" "</div><div class='del'>-                                "*stbuf {%s}, *preparent {%s}, *postparent = "</div><div class='del'>-                                "{%s})",</div><div class='del'>-                                frame-&gt;root-&gt;unique, op_ret, fd, inode-&gt;ino,</div><div class='del'>-                                statstr, preparentstr, postparentstr);</div><div class='del'>-</div><div class='del'>-                        if (statstr)</div><div class='del'>-                                GF_FREE (statstr);</div><div class='del'>-                        if (preparentstr)</div><div class='del'>-                                GF_FREE (preparentstr);</div><div class='del'>-                        if (postparentstr)</div><div class='del'>-                                GF_FREE (postparentstr);</div><div class='del'>-                } else {</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_NORMAL,</div><div class='del'>-                                "%"PRId64": (op_ret=%d, op_errno=%d)",</div><div class='del'>-                                frame-&gt;root-&gt;unique, op_ret, op_errno);</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='add'>+    gf_time_fmt(atime_buf, sizeof atime_buf, buf-&gt;ia_atime, gf_timefmt_dirent);</div><div class='ctx'> </div><div class='del'>-        STACK_UNWIND_STRICT (create, frame, op_ret, op_errno, fd, inode, buf,</div><div class='del'>-                             preparent, postparent);</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='add'>+    gf_time_fmt(mtime_buf, sizeof mtime_buf, buf-&gt;ia_mtime, gf_timefmt_dirent);</div><div class='ctx'> </div><div class='add'>+    gf_time_fmt(ctime_buf, sizeof ctime_buf, buf-&gt;ia_ctime, gf_timefmt_dirent);</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-trace_open_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-                int32_t op_ret, int32_t op_errno, fd_t *fd)</div><div class='del'>-{</div><div class='add'>+    snprintf(str, len,</div><div class='add'>+             "gfid=%s ino=%" PRIu64</div><div class='add'>+             ", mode=%o, "</div><div class='add'>+             "nlink=%" GF_PRI_NLINK ", uid=%u, gid=%u, size=%" PRIu64</div><div class='add'>+             ", "</div><div class='add'>+             "blocks=%" PRIu64</div><div class='add'>+             ", atime=%s mtime=%s ctime=%s "</div><div class='add'>+             "atime_sec=%" PRId64 ", atime_nsec=%" PRIu32</div><div class='add'>+             ","</div><div class='add'>+             " mtime_sec=%" PRId64 ", mtime_nsec=%" PRIu32</div><div class='add'>+             ", "</div><div class='add'>+             "ctime_sec=%" PRId64 ", ctime_nsec=%" PRIu32 "",</div><div class='add'>+             uuid_utoa(buf-&gt;ia_gfid), buf-&gt;ia_ino,</div><div class='add'>+             st_mode_from_ia(buf-&gt;ia_prot, buf-&gt;ia_type), buf-&gt;ia_nlink,</div><div class='add'>+             buf-&gt;ia_uid, buf-&gt;ia_gid, buf-&gt;ia_size, buf-&gt;ia_blocks, atime_buf,</div><div class='add'>+             mtime_buf, ctime_buf, buf-&gt;ia_atime, buf-&gt;ia_atime_nsec,</div><div class='add'>+             buf-&gt;ia_mtime, buf-&gt;ia_mtime_nsec, buf-&gt;ia_ctime,</div><div class='add'>+             buf-&gt;ia_ctime_nsec);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+dump_history_trace(circular_buffer_t *cb, void *data)</div><div class='add'>+{</div><div class='add'>+    char timestr[GF_TIMESTR_SIZE] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='ctx'> </div><div class='del'>-        if (trace_fop_names[GF_FOP_OPEN].enabled) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_NORMAL,</div><div class='del'>-                        "%"PRId64": (op_ret=%d, op_errno=%d, *fd=%p)",</div><div class='del'>-                        frame-&gt;root-&gt;unique, op_ret, op_errno, fd);</div><div class='del'>-        }</div><div class='add'>+    /* Since we are continuing with adding entries to the buffer even when</div><div class='add'>+       gettimeofday () fails, it's safe to check tm and then dump the time</div><div class='add'>+       at which the entry was added to the buffer */</div><div class='ctx'> </div><div class='del'>-        STACK_UNWIND_STRICT (open, frame, op_ret, op_errno, fd);</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-trace_stat_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-                int32_t op_ret, int32_t op_errno, struct iatt *buf)</div><div class='del'>-{</div><div class='del'>-        uint64_t ia_time = 0;</div><div class='del'>-        char     atime_buf[256];</div><div class='del'>-        char     mtime_buf[256];</div><div class='del'>-        char     ctime_buf[256];</div><div class='del'>-</div><div class='del'>-        if (trace_fop_names[GF_FOP_STAT].enabled) {</div><div class='del'>-                if (op_ret &gt;= 0) {</div><div class='del'>-                        ia_time = buf-&gt;ia_atime;</div><div class='del'>-                        strftime (atime_buf, 256, "[%b %d %H:%M:%S]",</div><div class='del'>-                                  localtime ((time_t *)&amp;ia_time));</div><div class='del'>-</div><div class='del'>-                        ia_time = buf-&gt;ia_mtime;</div><div class='del'>-                        strftime (mtime_buf, 256, "[%b %d %H:%M:%S]",</div><div class='del'>-                                  localtime ((time_t *)&amp;ia_time));</div><div class='del'>-</div><div class='del'>-                        ia_time = buf-&gt;ia_ctime;</div><div class='del'>-                        strftime (ctime_buf, 256, "[%b %d %H:%M:%S]",</div><div class='del'>-                                  localtime ((time_t *)&amp;ia_time));</div><div class='del'>-</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_NORMAL,</div><div class='del'>-                                "%"PRId64": (op_ret=%d, buf {ia_gen=%"PRIu64", "</div><div class='del'>-                                "ia_ino=%"PRIu64", st_mode=%o, ia_nlink=%"GF_PRI_NLINK", "</div><div class='del'>-                                "ia_uid=%d, ia_gid=%d, ia_rdev=%"PRIu64", ia_size=%"PRId64</div><div class='del'>-                                ", ia_blksize=%"GF_PRI_BLKSIZE", ia_blocks=%"PRId64", "</div><div class='del'>-                                "ia_atime=%s, ia_mtime=%s, ia_ctime=%s})",</div><div class='del'>-                                frame-&gt;root-&gt;unique, op_ret, buf-&gt;ia_gen, buf-&gt;ia_ino,</div><div class='del'>-                                st_mode_from_ia (buf-&gt;ia_prot, buf-&gt;ia_type),</div><div class='del'>-                                buf-&gt;ia_nlink, buf-&gt;ia_uid, buf-&gt;ia_gid,</div><div class='del'>-                                buf-&gt;ia_rdev, buf-&gt;ia_size, buf-&gt;ia_blksize,</div><div class='del'>-                                buf-&gt;ia_blocks, atime_buf, mtime_buf, ctime_buf);</div><div class='del'>-                } else {</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_NORMAL,</div><div class='del'>-                                "%"PRId64": (op_ret=%d, op_errno=%d)",</div><div class='del'>-                                frame-&gt;root-&gt;unique, op_ret, op_errno);</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='add'>+    gf_time_fmt_tv(timestr, sizeof timestr, &amp;cb-&gt;tv, gf_timefmt_Ymd_T);</div><div class='add'>+    gf_proc_dump_write("TIME", "%s", timestr);</div><div class='add'>+</div><div class='add'>+    gf_proc_dump_write("FOP", "%s\n", (char *)cb-&gt;data);</div><div class='ctx'> </div><div class='del'>-        STACK_UNWIND_STRICT (stat, frame, op_ret, op_errno, buf);</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-trace_readv_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-                 int32_t op_ret, int32_t op_errno, struct iovec *vector,</div><div class='del'>-                 int32_t count, struct iatt *buf, struct iobref *iobref)</div><div class='del'>-{</div><div class='del'>-        uint64_t ia_time = 0;</div><div class='del'>-        char     atime_buf[256];</div><div class='del'>-        char     mtime_buf[256];</div><div class='del'>-        char     ctime_buf[256];</div><div class='del'>-</div><div class='del'>-        if (trace_fop_names[GF_FOP_READ].enabled) {</div><div class='del'>-                if (op_ret &gt;= 0) {</div><div class='del'>-                        ia_time = buf-&gt;ia_atime;</div><div class='del'>-                        strftime (atime_buf, 256, "[%b %d %H:%M:%S]",</div><div class='del'>-                                  localtime ((time_t *)&amp;ia_time));</div><div class='del'>-</div><div class='del'>-                        ia_time = buf-&gt;ia_mtime;</div><div class='del'>-                        strftime (mtime_buf, 256, "[%b %d %H:%M:%S]",</div><div class='del'>-                                  localtime ((time_t *)&amp;ia_time));</div><div class='del'>-</div><div class='del'>-                        ia_time = buf-&gt;ia_ctime;</div><div class='del'>-                        strftime (ctime_buf, 256, "[%b %d %H:%M:%S]",</div><div class='del'>-                                  localtime ((time_t *)&amp;ia_time));</div><div class='del'>-</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_NORMAL,</div><div class='del'>-                                "%"PRId64": (op_ret=%d, op_errno=%d, *buf {ia_gen=%"PRIu64", "</div><div class='del'>-                                "ia_ino=%"PRIu64", st_mode=%o, ia_nlink=%"GF_PRI_NLINK", "</div><div class='del'>-                                "ia_uid=%d, ia_gid=%d, ia_rdev=%"PRIu64", "</div><div class='del'>-                                "ia_size=%"PRId64", ia_blksize=%"GF_PRI_BLKSIZE", "</div><div class='del'>-                                "ia_blocks=%"PRId64", ia_atime=%s, ia_mtime=%s, ia_ctime=%s})",</div><div class='del'>-                                frame-&gt;root-&gt;unique, op_ret, op_errno, buf-&gt;ia_gen, buf-&gt;ia_ino,</div><div class='del'>-                                st_mode_from_ia (buf-&gt;ia_prot, buf-&gt;ia_type),</div><div class='del'>-                                buf-&gt;ia_nlink, buf-&gt;ia_uid, buf-&gt;ia_gid,</div><div class='del'>-                                buf-&gt;ia_rdev, buf-&gt;ia_size, buf-&gt;ia_blksize, buf-&gt;ia_blocks,</div><div class='del'>-                                atime_buf, mtime_buf, ctime_buf);</div><div class='del'>-                } else {</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_NORMAL,</div><div class='del'>-                                "%"PRId64": (op_ret=%d, op_errno=%d)",</div><div class='del'>-                                frame-&gt;root-&gt;unique, op_ret, op_errno);</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        STACK_UNWIND_STRICT (readv, frame, op_ret, op_errno, vector, count,</div><div class='del'>-                             buf, iobref);</div><div class='del'>-        return 0;</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-trace_writev_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-                  int32_t op_ret, int32_t op_errno,</div><div class='del'>-                  struct iatt *prebuf, struct iatt *postbuf)</div><div class='del'>-{</div><div class='del'>-        char  *preopstr = NULL;</div><div class='del'>-        char  *postopstr = NULL;</div><div class='add'>+trace_create_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                 int32_t op_ret, int32_t op_errno, fd_t *fd, inode_t *inode,</div><div class='add'>+                 struct iatt *buf, struct iatt *preparent,</div><div class='add'>+                 struct iatt *postparent, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    char statstr[1024] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    char preparentstr[1024] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    char postparentstr[1024] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    trace_conf_t *conf = NULL;</div><div class='add'>+</div><div class='add'>+    conf = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    if (!conf-&gt;log_file &amp;&amp; !conf-&gt;log_history)</div><div class='add'>+        goto out;</div><div class='add'>+    if (trace_fop_names[GF_FOP_CREATE].enabled) {</div><div class='add'>+        char string[4096] = {</div><div class='add'>+            0,</div><div class='add'>+        };</div><div class='add'>+        if (op_ret &gt;= 0) {</div><div class='add'>+            TRACE_STAT_TO_STR(buf, statstr);</div><div class='add'>+            TRACE_STAT_TO_STR(preparent, preparentstr);</div><div class='add'>+            TRACE_STAT_TO_STR(postparent, postparentstr);</div><div class='add'>+</div><div class='add'>+            snprintf(string, sizeof(string),</div><div class='add'>+                     "%" PRId64</div><div class='add'>+                     ": gfid=%s (op_ret=%d, fd=%p"</div><div class='add'>+                     "*stbuf {%s}, *preparent {%s}, "</div><div class='add'>+                     "*postparent = {%s})",</div><div class='add'>+                     frame-&gt;root-&gt;unique, uuid_utoa(inode-&gt;gfid), op_ret, fd,</div><div class='add'>+                     statstr, preparentstr, postparentstr);</div><div class='add'>+</div><div class='add'>+            /* for 'release' log */</div><div class='add'>+            fd_ctx_set(fd, this, 0);</div><div class='add'>+        } else {</div><div class='add'>+            snprintf(string, sizeof(string),</div><div class='add'>+                     "%" PRId64 ": (op_ret=%d, op_errno=%d)",</div><div class='add'>+                     frame-&gt;root-&gt;unique, op_ret, op_errno);</div><div class='add'>+        }</div><div class='add'>+        LOG_ELEMENT(conf, string);</div><div class='add'>+    }</div><div class='add'>+out:</div><div class='add'>+    TRACE_STACK_UNWIND(create, frame, op_ret, op_errno, fd, inode, buf,</div><div class='add'>+                       preparent, postparent, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+trace_open_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+               int32_t op_ret, int32_t op_errno, fd_t *fd, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    trace_conf_t *conf = NULL;</div><div class='add'>+</div><div class='add'>+    conf = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    if (!conf-&gt;log_file &amp;&amp; !conf-&gt;log_history)</div><div class='add'>+        goto out;</div><div class='add'>+    if (trace_fop_names[GF_FOP_OPEN].enabled) {</div><div class='add'>+        char string[4096] = {</div><div class='add'>+            0,</div><div class='add'>+        };</div><div class='add'>+        snprintf(string, sizeof(string),</div><div class='add'>+                 "%" PRId64</div><div class='add'>+                 ": gfid=%s op_ret=%d, op_errno=%d, "</div><div class='add'>+                 "*fd=%p",</div><div class='add'>+                 frame-&gt;root-&gt;unique, uuid_utoa(frame-&gt;local), op_ret, op_errno,</div><div class='add'>+                 fd);</div><div class='add'>+</div><div class='add'>+        LOG_ELEMENT(conf, string);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    /* for 'release' log */</div><div class='add'>+    if (op_ret &gt;= 0)</div><div class='add'>+        fd_ctx_set(fd, this, 0);</div><div class='add'>+</div><div class='add'>+    TRACE_STACK_UNWIND(open, frame, op_ret, op_errno, fd, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+trace_stat_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+               int32_t op_ret, int32_t op_errno, struct iatt *buf,</div><div class='add'>+               dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    char statstr[1024] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    trace_conf_t *conf = NULL;</div><div class='add'>+</div><div class='add'>+    conf = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    if (!conf-&gt;log_file &amp;&amp; !conf-&gt;log_history)</div><div class='add'>+        goto out;</div><div class='add'>+    if (trace_fop_names[GF_FOP_STAT].enabled) {</div><div class='add'>+        char string[4096] = {</div><div class='add'>+            0,</div><div class='add'>+        };</div><div class='add'>+        if (op_ret == 0) {</div><div class='add'>+            TRACE_STAT_TO_STR(buf, statstr);</div><div class='add'>+            (void)snprintf(</div><div class='add'>+                string, sizeof(string), "%" PRId64 ": gfid=%s op_ret=%d buf=%s",</div><div class='add'>+                frame-&gt;root-&gt;unique, uuid_utoa(frame-&gt;local), op_ret, statstr);</div><div class='add'>+        } else {</div><div class='add'>+            (void)snprintf(string, sizeof(string),</div><div class='add'>+                           "%" PRId64</div><div class='add'>+                           ": gfid=%s op_ret=%d, "</div><div class='add'>+                           "op_errno=%d)",</div><div class='add'>+                           frame-&gt;root-&gt;unique, uuid_utoa(frame-&gt;local), op_ret,</div><div class='add'>+                           op_errno);</div><div class='add'>+        }</div><div class='add'>+        LOG_ELEMENT(conf, string);</div><div class='add'>+    }</div><div class='add'>+out:</div><div class='add'>+    TRACE_STACK_UNWIND(stat, frame, op_ret, op_errno, buf, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+trace_readv_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                int32_t op_ret, int32_t op_errno, struct iovec *vector,</div><div class='add'>+                int32_t count, struct iatt *buf, struct iobref *iobref,</div><div class='add'>+                dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    char statstr[1024] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    trace_conf_t *conf = NULL;</div><div class='add'>+</div><div class='add'>+    conf = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    if (!conf-&gt;log_file &amp;&amp; !conf-&gt;log_history)</div><div class='add'>+        goto out;</div><div class='add'>+    if (trace_fop_names[GF_FOP_READ].enabled) {</div><div class='add'>+        char string[4096] = {</div><div class='add'>+            0,</div><div class='add'>+        };</div><div class='add'>+        if (op_ret &gt;= 0) {</div><div class='add'>+            TRACE_STAT_TO_STR(buf, statstr);</div><div class='add'>+            snprintf(</div><div class='add'>+                string, sizeof(string), "%" PRId64 ": gfid=%s op_ret=%d buf=%s",</div><div class='add'>+                frame-&gt;root-&gt;unique, uuid_utoa(frame-&gt;local), op_ret, statstr);</div><div class='add'>+        } else {</div><div class='add'>+            snprintf(string, sizeof(string),</div><div class='add'>+                     "%" PRId64</div><div class='add'>+                     ": gfid=%s op_ret=%d, "</div><div class='add'>+                     "op_errno=%d)",</div><div class='add'>+                     frame-&gt;root-&gt;unique, uuid_utoa(frame-&gt;local), op_ret,</div><div class='add'>+                     op_errno);</div><div class='add'>+        }</div><div class='add'>+        LOG_ELEMENT(conf, string);</div><div class='add'>+    }</div><div class='add'>+out:</div><div class='add'>+    TRACE_STACK_UNWIND(readv, frame, op_ret, op_errno, vector, count, buf,</div><div class='add'>+                       iobref, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+trace_writev_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                 int32_t op_ret, int32_t op_errno, struct iatt *prebuf,</div><div class='add'>+                 struct iatt *postbuf, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    char preopstr[1024] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    char postopstr[1024] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    trace_conf_t *conf = NULL;</div><div class='add'>+</div><div class='add'>+    conf = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    if (!conf-&gt;log_file &amp;&amp; !conf-&gt;log_history)</div><div class='add'>+        goto out;</div><div class='add'>+    if (trace_fop_names[GF_FOP_WRITE].enabled) {</div><div class='add'>+        char string[4096] = {</div><div class='add'>+            0,</div><div class='add'>+        };</div><div class='add'>+        if (op_ret &gt;= 0) {</div><div class='add'>+            TRACE_STAT_TO_STR(prebuf, preopstr);</div><div class='add'>+            TRACE_STAT_TO_STR(postbuf, postopstr);</div><div class='add'>+</div><div class='add'>+            snprintf(string, sizeof(string),</div><div class='add'>+                     "%" PRId64</div><div class='add'>+                     ": (op_ret=%d, "</div><div class='add'>+                     "*prebuf = {%s}, *postbuf = {%s})",</div><div class='add'>+                     frame-&gt;root-&gt;unique, op_ret, preopstr, postopstr);</div><div class='add'>+        } else {</div><div class='add'>+            snprintf(string, sizeof(string),</div><div class='add'>+                     "%" PRId64</div><div class='add'>+                     ": gfid=%s op_ret=%d, "</div><div class='add'>+                     "op_errno=%d",</div><div class='add'>+                     frame-&gt;root-&gt;unique, uuid_utoa(frame-&gt;local), op_ret,</div><div class='add'>+                     op_errno);</div><div class='add'>+        }</div><div class='add'>+        LOG_ELEMENT(conf, string);</div><div class='add'>+    }</div><div class='add'>+out:</div><div class='add'>+    TRACE_STACK_UNWIND(writev, frame, op_ret, op_errno, prebuf, postbuf, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+trace_readdir_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                  int32_t op_ret, int32_t op_errno, gf_dirent_t *buf,</div><div class='add'>+                  dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    trace_conf_t *conf = NULL;</div><div class='add'>+</div><div class='add'>+    conf = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    if (!conf-&gt;log_file &amp;&amp; !conf-&gt;log_history)</div><div class='add'>+        goto out;</div><div class='add'>+    if (trace_fop_names[GF_FOP_READDIR].enabled) {</div><div class='add'>+        char string[4096] = {</div><div class='add'>+            0,</div><div class='add'>+        };</div><div class='add'>+        snprintf(string, sizeof(string),</div><div class='add'>+                 "%" PRId64 " : gfid=%s op_ret=%d, op_errno=%d",</div><div class='add'>+                 frame-&gt;root-&gt;unique, uuid_utoa(frame-&gt;local), op_ret,</div><div class='add'>+                 op_errno);</div><div class='add'>+</div><div class='add'>+        LOG_ELEMENT(conf, string);</div><div class='add'>+    }</div><div class='add'>+out:</div><div class='add'>+    TRACE_STACK_UNWIND(readdir, frame, op_ret, op_errno, buf, xdata);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+trace_readdirp_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                   int32_t op_ret, int32_t op_errno, gf_dirent_t *buf,</div><div class='add'>+                   dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    int count = 0;</div><div class='add'>+    char statstr[1024] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    char string[4096] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    trace_conf_t *conf = NULL;</div><div class='add'>+    gf_dirent_t *entry = NULL;</div><div class='add'>+</div><div class='add'>+    conf = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    if (!conf-&gt;log_file &amp;&amp; !conf-&gt;log_history)</div><div class='add'>+        goto out;</div><div class='add'>+    if (trace_fop_names[GF_FOP_READDIRP].enabled) {</div><div class='add'>+        snprintf(string, sizeof(string),</div><div class='add'>+                 "%" PRId64 " : gfid=%s op_ret=%d, op_errno=%d",</div><div class='add'>+                 frame-&gt;root-&gt;unique, uuid_utoa(frame-&gt;local), op_ret,</div><div class='add'>+                 op_errno);</div><div class='add'>+</div><div class='add'>+        LOG_ELEMENT(conf, string);</div><div class='add'>+    }</div><div class='add'>+    if (op_ret &lt; 0)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    list_for_each_entry(entry, &amp;buf-&gt;list, list)</div><div class='add'>+    {</div><div class='add'>+        count++;</div><div class='add'>+        TRACE_STAT_TO_STR(&amp;entry-&gt;d_stat, statstr);</div><div class='add'>+        snprintf(string, sizeof(string),</div><div class='add'>+                 "entry no. %d, pargfid=%s, "</div><div class='add'>+                 "bname=%s *buf {%s}",</div><div class='add'>+                 count, uuid_utoa(frame-&gt;local), entry-&gt;d_name, statstr);</div><div class='add'>+        LOG_ELEMENT(conf, string);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    TRACE_STACK_UNWIND(readdirp, frame, op_ret, op_errno, buf, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+trace_fsync_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                int32_t op_ret, int32_t op_errno, struct iatt *prebuf,</div><div class='add'>+                struct iatt *postbuf, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    char preopstr[1024] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    char postopstr[1024] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    trace_conf_t *conf = NULL;</div><div class='add'>+</div><div class='add'>+    conf = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    if (!conf-&gt;log_file &amp;&amp; !conf-&gt;log_history)</div><div class='add'>+        goto out;</div><div class='add'>+    if (trace_fop_names[GF_FOP_FSYNC].enabled) {</div><div class='add'>+        char string[4096] = {</div><div class='add'>+            0,</div><div class='add'>+        };</div><div class='add'>+        if (op_ret == 0) {</div><div class='add'>+            TRACE_STAT_TO_STR(prebuf, preopstr);</div><div class='add'>+            TRACE_STAT_TO_STR(postbuf, postopstr);</div><div class='add'>+</div><div class='add'>+            snprintf(string, sizeof(string),</div><div class='add'>+                     "%" PRId64</div><div class='add'>+                     ": (op_ret=%d, "</div><div class='add'>+                     "*prebuf = {%s}, *postbuf = {%s}",</div><div class='add'>+                     frame-&gt;root-&gt;unique, op_ret, preopstr, postopstr);</div><div class='add'>+        } else {</div><div class='add'>+            snprintf(string, sizeof(string),</div><div class='add'>+                     "%" PRId64</div><div class='add'>+                     ": gfid=%s op_ret=%d, "</div><div class='add'>+                     "op_errno=%d",</div><div class='add'>+                     frame-&gt;root-&gt;unique, uuid_utoa(frame-&gt;local), op_ret,</div><div class='add'>+                     op_errno);</div><div class='add'>+        }</div><div class='add'>+        LOG_ELEMENT(conf, string);</div><div class='add'>+    }</div><div class='add'>+out:</div><div class='add'>+    TRACE_STACK_UNWIND(fsync, frame, op_ret, op_errno, prebuf, postbuf, xdata);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+trace_setattr_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                  int32_t op_ret, int32_t op_errno, struct iatt *statpre,</div><div class='add'>+                  struct iatt *statpost, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    char preopstr[1024] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    char postopstr[1024] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    trace_conf_t *conf = NULL;</div><div class='add'>+</div><div class='add'>+    conf = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    if (!conf-&gt;log_file &amp;&amp; !conf-&gt;log_history)</div><div class='add'>+        goto out;</div><div class='add'>+    if (trace_fop_names[GF_FOP_SETATTR].enabled) {</div><div class='add'>+        char string[4096] = {</div><div class='add'>+            0,</div><div class='add'>+        };</div><div class='add'>+        if (op_ret == 0) {</div><div class='add'>+            TRACE_STAT_TO_STR(statpre, preopstr);</div><div class='add'>+            TRACE_STAT_TO_STR(statpost, postopstr);</div><div class='add'>+</div><div class='add'>+            snprintf(string, sizeof(string),</div><div class='add'>+                     "%" PRId64</div><div class='add'>+                     ": (op_ret=%d, "</div><div class='add'>+                     "*prebuf = {%s}, *postbuf = {%s})",</div><div class='add'>+                     frame-&gt;root-&gt;unique, op_ret, preopstr, postopstr);</div><div class='add'>+        } else {</div><div class='add'>+            snprintf(string, sizeof(string),</div><div class='add'>+                     "%" PRId64</div><div class='add'>+                     ": gfid=%s op_ret=%d, "</div><div class='add'>+                     "op_errno=%d)",</div><div class='add'>+                     frame-&gt;root-&gt;unique, uuid_utoa(frame-&gt;local), op_ret,</div><div class='add'>+                     op_errno);</div><div class='add'>+        }</div><div class='add'>+        LOG_ELEMENT(conf, string);</div><div class='add'>+    }</div><div class='add'>+out:</div><div class='add'>+    TRACE_STACK_UNWIND(setattr, frame, op_ret, op_errno, statpre, statpost,</div><div class='add'>+                       xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+trace_fsetattr_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                   int32_t op_ret, int32_t op_errno, struct iatt *statpre,</div><div class='add'>+                   struct iatt *statpost, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    char preopstr[1024] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    char postopstr[1024] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    trace_conf_t *conf = NULL;</div><div class='add'>+</div><div class='add'>+    conf = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    if (!conf-&gt;log_file &amp;&amp; !conf-&gt;log_history)</div><div class='add'>+        goto out;</div><div class='add'>+    if (trace_fop_names[GF_FOP_FSETATTR].enabled) {</div><div class='add'>+        char string[4096] = {</div><div class='add'>+            0,</div><div class='add'>+        };</div><div class='add'>+        if (op_ret == 0) {</div><div class='add'>+            TRACE_STAT_TO_STR(statpre, preopstr);</div><div class='add'>+            TRACE_STAT_TO_STR(statpost, postopstr);</div><div class='add'>+</div><div class='add'>+            snprintf(string, sizeof(string),</div><div class='add'>+                     "%" PRId64</div><div class='add'>+                     ": (op_ret=%d, "</div><div class='add'>+                     "*prebuf = {%s}, *postbuf = {%s})",</div><div class='add'>+                     frame-&gt;root-&gt;unique, op_ret, preopstr, postopstr);</div><div class='add'>+        } else {</div><div class='add'>+            snprintf(string, sizeof(string),</div><div class='add'>+                     "%" PRId64 ": gfid=%s op_ret=%d, op_errno=%d)",</div><div class='add'>+                     frame-&gt;root-&gt;unique, uuid_utoa(frame-&gt;local), op_ret,</div><div class='add'>+                     op_errno);</div><div class='add'>+        }</div><div class='add'>+        LOG_ELEMENT(conf, string);</div><div class='add'>+    }</div><div class='add'>+out:</div><div class='add'>+    TRACE_STACK_UNWIND(fsetattr, frame, op_ret, op_errno, statpre, statpost,</div><div class='add'>+                       xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+trace_unlink_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                 int32_t op_ret, int32_t op_errno, struct iatt *preparent,</div><div class='add'>+                 struct iatt *postparent, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    char preparentstr[1024] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    char postparentstr[1024] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    trace_conf_t *conf = NULL;</div><div class='add'>+</div><div class='add'>+    conf = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    if (!conf-&gt;log_file &amp;&amp; !conf-&gt;log_history)</div><div class='add'>+        goto out;</div><div class='add'>+    if (trace_fop_names[GF_FOP_UNLINK].enabled) {</div><div class='add'>+        char string[4096] = {</div><div class='add'>+            0,</div><div class='add'>+        };</div><div class='add'>+        if (op_ret == 0) {</div><div class='add'>+            TRACE_STAT_TO_STR(preparent, preparentstr);</div><div class='add'>+            TRACE_STAT_TO_STR(postparent, postparentstr);</div><div class='add'>+</div><div class='add'>+            snprintf(string, sizeof(string),</div><div class='add'>+                     "%" PRId64</div><div class='add'>+                     ": gfid=%s op_ret=%d, "</div><div class='add'>+                     " *preparent = {%s}, "</div><div class='add'>+                     "*postparent = {%s})",</div><div class='add'>+                     frame-&gt;root-&gt;unique, uuid_utoa(frame-&gt;local), op_ret,</div><div class='add'>+                     preparentstr, postparentstr);</div><div class='add'>+        } else {</div><div class='add'>+            snprintf(string, sizeof(string),</div><div class='add'>+                     "%" PRId64</div><div class='add'>+                     ": gfid=%s op_ret=%d, "</div><div class='add'>+                     "op_errno=%d)",</div><div class='add'>+                     frame-&gt;root-&gt;unique, uuid_utoa(frame-&gt;local), op_ret,</div><div class='add'>+                     op_errno);</div><div class='add'>+        }</div><div class='add'>+        LOG_ELEMENT(conf, string);</div><div class='add'>+    }</div><div class='add'>+out:</div><div class='add'>+    TRACE_STACK_UNWIND(unlink, frame, op_ret, op_errno, preparent, postparent,</div><div class='add'>+                       xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+trace_rename_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                 int32_t op_ret, int32_t op_errno, struct iatt *buf,</div><div class='add'>+                 struct iatt *preoldparent, struct iatt *postoldparent,</div><div class='add'>+                 struct iatt *prenewparent, struct iatt *postnewparent,</div><div class='add'>+                 dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    char statstr[1024] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    char preoldparentstr[1024] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    char postoldparentstr[1024] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    char prenewparentstr[1024] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    char postnewparentstr[1024] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    trace_conf_t *conf = NULL;</div><div class='add'>+</div><div class='add'>+    conf = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    if (!conf-&gt;log_file &amp;&amp; !conf-&gt;log_history)</div><div class='add'>+        goto out;</div><div class='add'>+    if (trace_fop_names[GF_FOP_RENAME].enabled) {</div><div class='add'>+        char string[6044] = {</div><div class='add'>+            0,</div><div class='add'>+        };</div><div class='add'>+        if (op_ret == 0) {</div><div class='add'>+            TRACE_STAT_TO_STR(buf, statstr);</div><div class='add'>+            TRACE_STAT_TO_STR(preoldparent, preoldparentstr);</div><div class='add'>+            TRACE_STAT_TO_STR(postoldparent, postoldparentstr);</div><div class='add'>+            TRACE_STAT_TO_STR(prenewparent, prenewparentstr);</div><div class='add'>+            TRACE_STAT_TO_STR(postnewparent, postnewparentstr);</div><div class='add'>+</div><div class='add'>+            snprintf(string, sizeof(string),</div><div class='add'>+                     "%" PRId64</div><div class='add'>+                     ": (op_ret=%d, "</div><div class='add'>+                     "*stbuf = {%s}, *preoldparent = {%s},"</div><div class='add'>+                     " *postoldparent = {%s}"</div><div class='add'>+                     " *prenewparent = {%s}, "</div><div class='add'>+                     "*postnewparent = {%s})",</div><div class='add'>+                     frame-&gt;root-&gt;unique, op_ret, statstr, preoldparentstr,</div><div class='add'>+                     postoldparentstr, prenewparentstr, postnewparentstr);</div><div class='add'>+        } else {</div><div class='add'>+            snprintf(string, sizeof(string),</div><div class='add'>+                     "%" PRId64</div><div class='add'>+                     ": gfid=%s op_ret=%d, "</div><div class='add'>+                     "op_errno=%d",</div><div class='add'>+                     frame-&gt;root-&gt;unique, uuid_utoa(frame-&gt;local), op_ret,</div><div class='add'>+                     op_errno);</div><div class='add'>+        }</div><div class='add'>+        LOG_ELEMENT(conf, string);</div><div class='add'>+    }</div><div class='add'>+out:</div><div class='add'>+    TRACE_STACK_UNWIND(rename, frame, op_ret, op_errno, buf, preoldparent,</div><div class='add'>+                       postoldparent, prenewparent, postnewparent, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+trace_readlink_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                   int32_t op_ret, int32_t op_errno, const char *buf,</div><div class='add'>+                   struct iatt *stbuf, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    char statstr[1024] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    trace_conf_t *conf = NULL;</div><div class='add'>+</div><div class='add'>+    conf = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    if (!conf-&gt;log_file &amp;&amp; !conf-&gt;log_history)</div><div class='add'>+        goto out;</div><div class='add'>+    if (trace_fop_names[GF_FOP_READLINK].enabled) {</div><div class='add'>+        char string[4096] = {</div><div class='add'>+            0,</div><div class='add'>+        };</div><div class='add'>+        if (op_ret == 0) {</div><div class='add'>+            TRACE_STAT_TO_STR(stbuf, statstr);</div><div class='add'>+            snprintf(string, sizeof(string),</div><div class='add'>+                     "%" PRId64</div><div class='add'>+                     ": (op_ret=%d, op_errno=%d,"</div><div class='add'>+                     "buf=%s, stbuf = { %s })",</div><div class='add'>+                     frame-&gt;root-&gt;unique, op_ret, op_errno, buf, statstr);</div><div class='add'>+        } else {</div><div class='add'>+            snprintf(string, sizeof(string),</div><div class='add'>+                     "%" PRId64</div><div class='add'>+                     ": gfid=%s op_ret=%d, "</div><div class='add'>+                     "op_errno=%d",</div><div class='add'>+                     frame-&gt;root-&gt;unique, uuid_utoa(frame-&gt;local), op_ret,</div><div class='add'>+                     op_errno);</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        LOG_ELEMENT(conf, string);</div><div class='add'>+    }</div><div class='add'>+out:</div><div class='add'>+    TRACE_STACK_UNWIND(readlink, frame, op_ret, op_errno, buf, stbuf, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+trace_lookup_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                 int32_t op_ret, int32_t op_errno, inode_t *inode,</div><div class='add'>+                 struct iatt *buf, dict_t *xdata, struct iatt *postparent)</div><div class='add'>+{</div><div class='add'>+    char statstr[1024] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    char postparentstr[1024] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    trace_conf_t *conf = NULL;</div><div class='add'>+</div><div class='add'>+    conf = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    if (!conf-&gt;log_file &amp;&amp; !conf-&gt;log_history)</div><div class='add'>+        goto out;</div><div class='add'>+    if (trace_fop_names[GF_FOP_LOOKUP].enabled) {</div><div class='add'>+        char string[4096] = {</div><div class='add'>+            0,</div><div class='add'>+        };</div><div class='add'>+        if (op_ret == 0) {</div><div class='add'>+            TRACE_STAT_TO_STR(buf, statstr);</div><div class='add'>+            TRACE_STAT_TO_STR(postparent, postparentstr);</div><div class='add'>+            /* print buf-&gt;ia_gfid instead of inode-&gt;gfid,</div><div class='add'>+             * since if the inode is not yet linked to the</div><div class='add'>+             * inode table (fresh lookup) then null gfid</div><div class='add'>+             * will be printed.</div><div class='add'>+             */</div><div class='add'>+            snprintf(string, sizeof(string),</div><div class='add'>+                     "%" PRId64</div><div class='add'>+                     ": gfid=%s (op_ret=%d "</div><div class='add'>+                     "*buf {%s}, *postparent {%s}",</div><div class='add'>+                     frame-&gt;root-&gt;unique, uuid_utoa(buf-&gt;ia_gfid), op_ret,</div><div class='add'>+                     statstr, postparentstr);</div><div class='add'>+</div><div class='add'>+            /* For 'forget' */</div><div class='add'>+            inode_ctx_put(inode, this, 0);</div><div class='add'>+        } else {</div><div class='add'>+            snprintf(string, sizeof(string),</div><div class='add'>+                     "%" PRId64</div><div class='add'>+                     ": gfid=%s op_ret=%d, "</div><div class='add'>+                     "op_errno=%d)",</div><div class='add'>+                     frame-&gt;root-&gt;unique, uuid_utoa(frame-&gt;local), op_ret,</div><div class='add'>+                     op_errno);</div><div class='add'>+        }</div><div class='add'>+        LOG_ELEMENT(conf, string);</div><div class='add'>+    }</div><div class='add'>+out:</div><div class='add'>+    TRACE_STACK_UNWIND(lookup, frame, op_ret, op_errno, inode, buf, xdata,</div><div class='add'>+                       postparent);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+trace_symlink_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                  int32_t op_ret, int32_t op_errno, inode_t *inode,</div><div class='add'>+                  struct iatt *buf, struct iatt *preparent,</div><div class='add'>+                  struct iatt *postparent, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    char statstr[1024] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    char preparentstr[1024] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    char postparentstr[1024] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    trace_conf_t *conf = NULL;</div><div class='add'>+</div><div class='add'>+    conf = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    if (!conf-&gt;log_file &amp;&amp; !conf-&gt;log_history)</div><div class='add'>+        goto out;</div><div class='add'>+    if (trace_fop_names[GF_FOP_SYMLINK].enabled) {</div><div class='add'>+        char string[4096] = {</div><div class='add'>+            0,</div><div class='add'>+        };</div><div class='add'>+        if (op_ret == 0) {</div><div class='add'>+            TRACE_STAT_TO_STR(buf, statstr);</div><div class='add'>+            TRACE_STAT_TO_STR(preparent, preparentstr);</div><div class='add'>+            TRACE_STAT_TO_STR(postparent, postparentstr);</div><div class='add'>+</div><div class='add'>+            snprintf(string, sizeof(string),</div><div class='add'>+                     "%" PRId64</div><div class='add'>+                     ": gfid=%s (op_ret=%d "</div><div class='add'>+                     "*stbuf = {%s}, *preparent = {%s}, "</div><div class='add'>+                     "*postparent = {%s})",</div><div class='add'>+                     frame-&gt;root-&gt;unique, uuid_utoa(inode-&gt;gfid), op_ret,</div><div class='add'>+                     statstr, preparentstr, postparentstr);</div><div class='add'>+        } else {</div><div class='add'>+            snprintf(string, sizeof(string),</div><div class='add'>+                     "%" PRId64 ": op_ret=%d, op_errno=%d", frame-&gt;root-&gt;unique,</div><div class='add'>+                     op_ret, op_errno);</div><div class='add'>+        }</div><div class='add'>+        LOG_ELEMENT(conf, string);</div><div class='add'>+    }</div><div class='add'>+out:</div><div class='add'>+    TRACE_STACK_UNWIND(symlink, frame, op_ret, op_errno, inode, buf, preparent,</div><div class='add'>+                       postparent, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+trace_mknod_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                int32_t op_ret, int32_t op_errno, inode_t *inode,</div><div class='add'>+                struct iatt *buf, struct iatt *preparent,</div><div class='add'>+                struct iatt *postparent, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    char statstr[1024] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    char preparentstr[1024] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    char postparentstr[1024] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    trace_conf_t *conf = NULL;</div><div class='add'>+</div><div class='add'>+    conf = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    if (!conf-&gt;log_file &amp;&amp; !conf-&gt;log_history)</div><div class='add'>+        goto out;</div><div class='add'>+    char string[4096] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    if (trace_fop_names[GF_FOP_MKNOD].enabled) {</div><div class='add'>+        if (op_ret == 0) {</div><div class='add'>+            TRACE_STAT_TO_STR(buf, statstr);</div><div class='add'>+            TRACE_STAT_TO_STR(preparent, preparentstr);</div><div class='add'>+            TRACE_STAT_TO_STR(postparent, postparentstr);</div><div class='add'>+</div><div class='add'>+            snprintf(string, sizeof(string),</div><div class='add'>+                     "%" PRId64</div><div class='add'>+                     ": gfid=%s (op_ret=%d "</div><div class='add'>+                     "*stbuf = {%s}, *preparent = {%s}, "</div><div class='add'>+                     "*postparent = {%s})",</div><div class='add'>+                     frame-&gt;root-&gt;unique, uuid_utoa(inode-&gt;gfid), op_ret,</div><div class='add'>+                     statstr, preparentstr, postparentstr);</div><div class='add'>+        } else {</div><div class='add'>+            snprintf(string, sizeof(string),</div><div class='add'>+                     "%" PRId64 ": (op_ret=%d, op_errno=%d)",</div><div class='add'>+                     frame-&gt;root-&gt;unique, op_ret, op_errno);</div><div class='add'>+        }</div><div class='add'>+        LOG_ELEMENT(conf, string);</div><div class='add'>+    }</div><div class='add'>+out:</div><div class='add'>+    TRACE_STACK_UNWIND(mknod, frame, op_ret, op_errno, inode, buf, preparent,</div><div class='add'>+                       postparent, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+trace_mkdir_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                int32_t op_ret, int32_t op_errno, inode_t *inode,</div><div class='add'>+                struct iatt *buf, struct iatt *preparent,</div><div class='add'>+                struct iatt *postparent, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    char statstr[1024] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    char preparentstr[1024] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    char postparentstr[1024] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    trace_conf_t *conf = NULL;</div><div class='add'>+</div><div class='add'>+    conf = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    if (!conf-&gt;log_file &amp;&amp; !conf-&gt;log_history)</div><div class='add'>+        goto out;</div><div class='add'>+    if (trace_fop_names[GF_FOP_MKDIR].enabled) {</div><div class='add'>+        char string[4096] = {</div><div class='add'>+            0,</div><div class='add'>+        };</div><div class='add'>+        if (op_ret == 0) {</div><div class='add'>+            TRACE_STAT_TO_STR(buf, statstr);</div><div class='add'>+            TRACE_STAT_TO_STR(preparent, preparentstr);</div><div class='add'>+            TRACE_STAT_TO_STR(postparent, postparentstr);</div><div class='add'>+</div><div class='add'>+            snprintf(string, sizeof(string),</div><div class='add'>+                     "%" PRId64</div><div class='add'>+                     ": gfid=%s (op_ret=%d "</div><div class='add'>+                     ", *stbuf = {%s}, *prebuf = {%s}, "</div><div class='add'>+                     "*postbuf = {%s} )",</div><div class='add'>+                     frame-&gt;root-&gt;unique, uuid_utoa(inode-&gt;gfid), op_ret,</div><div class='add'>+                     statstr, preparentstr, postparentstr);</div><div class='add'>+        } else {</div><div class='add'>+            snprintf(string, sizeof(string),</div><div class='add'>+                     "%" PRId64 ": (op_ret=%d, op_errno=%d)",</div><div class='add'>+                     frame-&gt;root-&gt;unique, op_ret, op_errno);</div><div class='add'>+        }</div><div class='add'>+        LOG_ELEMENT(conf, string);</div><div class='add'>+    }</div><div class='add'>+out:</div><div class='add'>+    TRACE_STACK_UNWIND(mkdir, frame, op_ret, op_errno, inode, buf, preparent,</div><div class='add'>+                       postparent, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+trace_link_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+               int32_t op_ret, int32_t op_errno, inode_t *inode,</div><div class='add'>+               struct iatt *buf, struct iatt *preparent,</div><div class='add'>+               struct iatt *postparent, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    char statstr[1024] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    char preparentstr[1024] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    char postparentstr[1024] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    trace_conf_t *conf = NULL;</div><div class='add'>+</div><div class='add'>+    conf = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    if (!conf-&gt;log_file &amp;&amp; !conf-&gt;log_history)</div><div class='add'>+        goto out;</div><div class='add'>+    char string[4096] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    if (trace_fop_names[GF_FOP_LINK].enabled) {</div><div class='add'>+        if (op_ret == 0) {</div><div class='add'>+            TRACE_STAT_TO_STR(buf, statstr);</div><div class='add'>+            TRACE_STAT_TO_STR(preparent, preparentstr);</div><div class='add'>+            TRACE_STAT_TO_STR(postparent, postparentstr);</div><div class='add'>+</div><div class='add'>+            snprintf(string, sizeof(string),</div><div class='add'>+                     "%" PRId64</div><div class='add'>+                     ": (op_ret=%d, "</div><div class='add'>+                     "*stbuf = {%s},  *prebuf = {%s},"</div><div class='add'>+                     " *postbuf = {%s})",</div><div class='add'>+                     frame-&gt;root-&gt;unique, op_ret, statstr, preparentstr,</div><div class='add'>+                     postparentstr);</div><div class='add'>+        } else {</div><div class='add'>+            snprintf(string, sizeof(string),</div><div class='add'>+                     "%" PRId64</div><div class='add'>+                     ": gfid=%s op_ret=%d, "</div><div class='add'>+                     "op_errno=%d",</div><div class='add'>+                     frame-&gt;root-&gt;unique, uuid_utoa(frame-&gt;local), op_ret,</div><div class='add'>+                     op_errno);</div><div class='add'>+        }</div><div class='add'>+        LOG_ELEMENT(conf, string);</div><div class='add'>+    }</div><div class='add'>+out:</div><div class='add'>+    TRACE_STACK_UNWIND(link, frame, op_ret, op_errno, inode, buf, preparent,</div><div class='add'>+                       postparent, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+trace_flush_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                int32_t op_ret, int32_t op_errno, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    trace_conf_t *conf = NULL;</div><div class='add'>+</div><div class='add'>+    conf = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    if (!conf-&gt;log_file &amp;&amp; !conf-&gt;log_history)</div><div class='add'>+        goto out;</div><div class='add'>+    char string[4096] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    if (trace_fop_names[GF_FOP_FLUSH].enabled) {</div><div class='add'>+        snprintf(string, sizeof(string),</div><div class='add'>+                 "%" PRId64 ": gfid=%s op_ret=%d, op_errno=%d",</div><div class='add'>+                 frame-&gt;root-&gt;unique, uuid_utoa(frame-&gt;local), op_ret,</div><div class='add'>+                 op_errno);</div><div class='add'>+</div><div class='add'>+        LOG_ELEMENT(conf, string);</div><div class='add'>+    }</div><div class='add'>+out:</div><div class='add'>+    TRACE_STACK_UNWIND(flush, frame, op_ret, op_errno, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+trace_opendir_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                  int32_t op_ret, int32_t op_errno, fd_t *fd, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    trace_conf_t *conf = NULL;</div><div class='add'>+</div><div class='add'>+    conf = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    if (!conf-&gt;log_file &amp;&amp; !conf-&gt;log_history)</div><div class='add'>+        goto out;</div><div class='add'>+    char string[4096] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    if (trace_fop_names[GF_FOP_OPENDIR].enabled) {</div><div class='add'>+        snprintf(string, sizeof(string),</div><div class='add'>+                 "%" PRId64</div><div class='add'>+                 ": gfid=%s op_ret=%d, op_errno=%d,"</div><div class='add'>+                 " fd=%p",</div><div class='add'>+                 frame-&gt;root-&gt;unique, uuid_utoa(frame-&gt;local), op_ret, op_errno,</div><div class='add'>+                 fd);</div><div class='add'>+</div><div class='add'>+        LOG_ELEMENT(conf, string);</div><div class='add'>+    }</div><div class='add'>+out:</div><div class='add'>+    /* for 'releasedir' log */</div><div class='add'>+    if (op_ret &gt;= 0)</div><div class='add'>+        fd_ctx_set(fd, this, 0);</div><div class='add'>+</div><div class='add'>+    TRACE_STACK_UNWIND(opendir, frame, op_ret, op_errno, fd, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+trace_rmdir_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                int32_t op_ret, int32_t op_errno, struct iatt *preparent,</div><div class='add'>+                struct iatt *postparent, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    char preparentstr[1024] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    char postparentstr[1024] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    trace_conf_t *conf = NULL;</div><div class='add'>+</div><div class='add'>+    conf = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    if (!conf-&gt;log_file &amp;&amp; !conf-&gt;log_history)</div><div class='add'>+        goto out;</div><div class='add'>+    if (trace_fop_names[GF_FOP_RMDIR].enabled) {</div><div class='add'>+        char string[4096] = {</div><div class='add'>+            0,</div><div class='add'>+        };</div><div class='add'>+        if (op_ret == 0) {</div><div class='add'>+            TRACE_STAT_TO_STR(preparent, preparentstr);</div><div class='add'>+            TRACE_STAT_TO_STR(postparent, postparentstr);</div><div class='add'>+</div><div class='add'>+            snprintf(string, sizeof(string),</div><div class='add'>+                     "%" PRId64</div><div class='add'>+                     ": gfid=%s op_ret=%d, "</div><div class='add'>+                     "*prebuf={%s},  *postbuf={%s}",</div><div class='add'>+                     frame-&gt;root-&gt;unique, uuid_utoa(frame-&gt;local), op_ret,</div><div class='add'>+                     preparentstr, postparentstr);</div><div class='add'>+        } else {</div><div class='add'>+            snprintf(string, sizeof(string),</div><div class='add'>+                     "%" PRId64</div><div class='add'>+                     ": gfid=%s op_ret=%d, "</div><div class='add'>+                     "op_errno=%d",</div><div class='add'>+                     frame-&gt;root-&gt;unique, uuid_utoa(frame-&gt;local), op_ret,</div><div class='add'>+                     op_errno);</div><div class='add'>+        }</div><div class='add'>+        LOG_ELEMENT(conf, string);</div><div class='add'>+    }</div><div class='add'>+out:</div><div class='add'>+    TRACE_STACK_UNWIND(rmdir, frame, op_ret, op_errno, preparent, postparent,</div><div class='add'>+                       xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+trace_truncate_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                   int32_t op_ret, int32_t op_errno, struct iatt *prebuf,</div><div class='add'>+                   struct iatt *postbuf, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    char preopstr[1024] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    char postopstr[1024] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    trace_conf_t *conf = NULL;</div><div class='add'>+</div><div class='add'>+    conf = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    if (!conf-&gt;log_file &amp;&amp; !conf-&gt;log_history)</div><div class='add'>+        goto out;</div><div class='add'>+    if (trace_fop_names[GF_FOP_TRUNCATE].enabled) {</div><div class='add'>+        char string[4096] = {</div><div class='add'>+            0,</div><div class='add'>+        };</div><div class='add'>+        if (op_ret == 0) {</div><div class='add'>+            TRACE_STAT_TO_STR(prebuf, preopstr);</div><div class='add'>+            TRACE_STAT_TO_STR(postbuf, postopstr);</div><div class='add'>+</div><div class='add'>+            snprintf(string, sizeof(string),</div><div class='add'>+                     "%" PRId64</div><div class='add'>+                     ": (op_ret=%d, "</div><div class='add'>+                     "*prebuf = {%s}, *postbuf = {%s} )",</div><div class='add'>+                     frame-&gt;root-&gt;unique, op_ret, preopstr, postopstr);</div><div class='add'>+        } else {</div><div class='add'>+            snprintf(string, sizeof(string),</div><div class='add'>+                     "%" PRId64</div><div class='add'>+                     ": gfid=%s op_ret=%d, "</div><div class='add'>+                     "op_errno=%d",</div><div class='add'>+                     frame-&gt;root-&gt;unique, uuid_utoa(frame-&gt;local), op_ret,</div><div class='add'>+                     op_errno);</div><div class='add'>+        }</div><div class='add'>+        LOG_ELEMENT(conf, string);</div><div class='add'>+    }</div><div class='add'>+out:</div><div class='add'>+    TRACE_STACK_UNWIND(truncate, frame, op_ret, op_errno, prebuf, postbuf,</div><div class='add'>+                       xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+trace_statfs_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                 int32_t op_ret, int32_t op_errno, struct statvfs *buf,</div><div class='add'>+                 dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    trace_conf_t *conf = NULL;</div><div class='add'>+</div><div class='add'>+    conf = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    if (!conf-&gt;log_file &amp;&amp; !conf-&gt;log_history)</div><div class='add'>+        goto out;</div><div class='add'>+    if (trace_fop_names[GF_FOP_STATFS].enabled) {</div><div class='add'>+        char string[4096] = {</div><div class='add'>+            0,</div><div class='add'>+        };</div><div class='add'>+        if (op_ret == 0) {</div><div class='add'>+            snprintf(string, sizeof(string),</div><div class='add'>+                     "%" PRId64</div><div class='add'>+                     ": ({f_bsize=%lu, "</div><div class='add'>+                     "f_frsize=%lu, "</div><div class='add'>+                     "f_blocks=%" GF_PRI_FSBLK ", f_bfree=%" GF_PRI_FSBLK</div><div class='add'>+                     ", "</div><div class='add'>+                     "f_bavail=%" GF_PRI_FSBLK</div><div class='add'>+                     ", "</div><div class='add'>+                     "f_files=%" GF_PRI_FSBLK</div><div class='add'>+                     ", "</div><div class='add'>+                     "f_ffree=%" GF_PRI_FSBLK</div><div class='add'>+                     ", "</div><div class='add'>+                     "f_favail=%" GF_PRI_FSBLK</div><div class='add'>+                     ", "</div><div class='add'>+                     "f_fsid=%lu, f_flag=%lu, "</div><div class='add'>+                     "f_namemax=%lu}) =&gt; ret=%d",</div><div class='add'>+                     frame-&gt;root-&gt;unique, buf-&gt;f_bsize, buf-&gt;f_frsize,</div><div class='add'>+                     buf-&gt;f_blocks, buf-&gt;f_bfree, buf-&gt;f_bavail, buf-&gt;f_files,</div><div class='add'>+                     buf-&gt;f_ffree, buf-&gt;f_favail, buf-&gt;f_fsid, buf-&gt;f_flag,</div><div class='add'>+                     buf-&gt;f_namemax, op_ret);</div><div class='add'>+        } else {</div><div class='add'>+            snprintf(string, sizeof(string),</div><div class='add'>+                     "%" PRId64</div><div class='add'>+                     ": (op_ret=%d, "</div><div class='add'>+                     "op_errno=%d)",</div><div class='add'>+                     frame-&gt;root-&gt;unique, op_ret, op_errno);</div><div class='add'>+        }</div><div class='add'>+        LOG_ELEMENT(conf, string);</div><div class='add'>+    }</div><div class='add'>+out:</div><div class='add'>+    TRACE_STACK_UNWIND(statfs, frame, op_ret, op_errno, buf, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+trace_setxattr_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                   int32_t op_ret, int32_t op_errno, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    trace_conf_t *conf = NULL;</div><div class='add'>+</div><div class='add'>+    conf = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    if (!conf-&gt;log_file &amp;&amp; !conf-&gt;log_history)</div><div class='add'>+        goto out;</div><div class='add'>+    if (trace_fop_names[GF_FOP_SETXATTR].enabled) {</div><div class='add'>+        char string[4096] = {</div><div class='add'>+            0,</div><div class='add'>+        };</div><div class='add'>+        snprintf(string, sizeof(string),</div><div class='add'>+                 "%" PRId64 ": gfid=%s op_ret=%d, op_errno=%d",</div><div class='add'>+                 frame-&gt;root-&gt;unique, uuid_utoa(frame-&gt;local), op_ret,</div><div class='add'>+                 op_errno);</div><div class='add'>+</div><div class='add'>+        LOG_ELEMENT(conf, string);</div><div class='add'>+    }</div><div class='add'>+out:</div><div class='add'>+    TRACE_STACK_UNWIND(setxattr, frame, op_ret, op_errno, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+trace_getxattr_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                   int32_t op_ret, int32_t op_errno, dict_t *dict,</div><div class='add'>+                   dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    trace_conf_t *conf = NULL;</div><div class='add'>+</div><div class='add'>+    conf = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    if (!conf-&gt;log_file &amp;&amp; !conf-&gt;log_history)</div><div class='add'>+        goto out;</div><div class='add'>+    if (trace_fop_names[GF_FOP_GETXATTR].enabled) {</div><div class='add'>+        char string[4096] = {</div><div class='add'>+            0,</div><div class='add'>+        };</div><div class='add'>+        snprintf(string, sizeof(string),</div><div class='add'>+                 "%" PRId64</div><div class='add'>+                 ": gfid=%s op_ret=%d, op_errno=%d,"</div><div class='add'>+                 " dict=%p",</div><div class='add'>+                 frame-&gt;root-&gt;unique, uuid_utoa(frame-&gt;local), op_ret, op_errno,</div><div class='add'>+                 dict);</div><div class='ctx'> </div><div class='del'>-        if (trace_fop_names[GF_FOP_WRITE].enabled) {</div><div class='del'>-                if (op_ret &gt;= 0) {</div><div class='del'>-                        preopstr = trace_stat_to_str (prebuf);</div><div class='del'>-                        postopstr = trace_stat_to_str (postbuf);</div><div class='add'>+        LOG_ELEMENT(conf, string);</div><div class='add'>+    }</div><div class='add'>+out:</div><div class='add'>+    TRACE_STACK_UNWIND(getxattr, frame, op_ret, op_errno, dict, xdata);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+trace_fsetxattr_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                    int32_t op_ret, int32_t op_errno, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    trace_conf_t *conf = NULL;</div><div class='add'>+</div><div class='add'>+    conf = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    if (!conf-&gt;log_file &amp;&amp; !conf-&gt;log_history)</div><div class='add'>+        goto out;</div><div class='add'>+    if (trace_fop_names[GF_FOP_FSETXATTR].enabled) {</div><div class='add'>+        char string[4096] = {</div><div class='add'>+            0,</div><div class='add'>+        };</div><div class='add'>+        snprintf(string, sizeof(string),</div><div class='add'>+                 "%" PRId64 ": gfid=%s op_ret=%d, op_errno=%d",</div><div class='add'>+                 frame-&gt;root-&gt;unique, uuid_utoa(frame-&gt;local), op_ret,</div><div class='add'>+                 op_errno);</div><div class='ctx'> </div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_NORMAL,</div><div class='del'>-                                "%"PRId64": (op_ret=%d, ino = %"PRIu64</div><div class='del'>-                                ", *prebuf = {%s}, *postbuf = {%s})",</div><div class='del'>-                                frame-&gt;root-&gt;unique, op_ret, postbuf-&gt;ia_ino,</div><div class='del'>-                                preopstr, postopstr);</div><div class='add'>+        LOG_ELEMENT(conf, string);</div><div class='add'>+    }</div><div class='add'>+out:</div><div class='add'>+    TRACE_STACK_UNWIND(fsetxattr, frame, op_ret, op_errno, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-                        if (preopstr)</div><div class='del'>-                                GF_FREE (preopstr);</div><div class='add'>+int</div><div class='add'>+trace_fgetxattr_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                    int32_t op_ret, int32_t op_errno, dict_t *dict,</div><div class='add'>+                    dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    trace_conf_t *conf = NULL;</div><div class='ctx'> </div><div class='del'>-                        if (postopstr)</div><div class='del'>-                                GF_FREE (postopstr);</div><div class='del'>-                } else {</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_NORMAL,</div><div class='del'>-                                "%"PRId64": (op_ret=%d, op_errno=%d)",</div><div class='del'>-                                frame-&gt;root-&gt;unique, op_ret, op_errno);</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='add'>+    conf = this-&gt;private;</div><div class='ctx'> </div><div class='del'>-        STACK_UNWIND_STRICT (writev, frame, op_ret, op_errno, prebuf, postbuf);</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='add'>+    if (!conf-&gt;log_file &amp;&amp; !conf-&gt;log_history)</div><div class='add'>+        goto out;</div><div class='add'>+    if (trace_fop_names[GF_FOP_FGETXATTR].enabled) {</div><div class='add'>+        char string[4096] = {</div><div class='add'>+            0,</div><div class='add'>+        };</div><div class='add'>+        snprintf(string, sizeof(string),</div><div class='add'>+                 "%" PRId64</div><div class='add'>+                 ": gfid=%s op_ret=%d, op_errno=%d,"</div><div class='add'>+                 " dict=%p",</div><div class='add'>+                 frame-&gt;root-&gt;unique, uuid_utoa(frame-&gt;local), op_ret, op_errno,</div><div class='add'>+                 dict);</div><div class='ctx'> </div><div class='add'>+        LOG_ELEMENT(conf, string);</div><div class='add'>+    }</div><div class='add'>+out:</div><div class='add'>+    TRACE_STACK_UNWIND(fgetxattr, frame, op_ret, op_errno, dict, xdata);</div><div class='ctx'> </div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-trace_readdir_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-                   int32_t op_ret, int32_t op_errno, gf_dirent_t *buf)</div><div class='add'>+trace_removexattr_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                      int32_t op_ret, int32_t op_errno, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-        if (trace_fop_names[GF_FOP_READDIR].enabled) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_NORMAL,</div><div class='del'>-                        "%"PRId64" :(op_ret=%d, op_errno=%d)",</div><div class='del'>-                        frame-&gt;root-&gt;unique, op_ret, op_errno);</div><div class='del'>-        }</div><div class='add'>+    trace_conf_t *conf = NULL;</div><div class='ctx'> </div><div class='del'>-        STACK_UNWIND_STRICT (readdir, frame, op_ret, op_errno, buf);</div><div class='del'>-</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='add'>+    conf = this-&gt;private;</div><div class='ctx'> </div><div class='add'>+    if (!conf-&gt;log_file &amp;&amp; !conf-&gt;log_history)</div><div class='add'>+        goto out;</div><div class='add'>+    if (trace_fop_names[GF_FOP_REMOVEXATTR].enabled) {</div><div class='add'>+        char string[4096] = {</div><div class='add'>+            0,</div><div class='add'>+        };</div><div class='add'>+        snprintf(string, sizeof(string),</div><div class='add'>+                 "%" PRId64 ": gfid=%s op_ret=%d, op_errno=%d",</div><div class='add'>+                 frame-&gt;root-&gt;unique, uuid_utoa(frame-&gt;local), op_ret,</div><div class='add'>+                 op_errno);</div><div class='add'>+</div><div class='add'>+        LOG_ELEMENT(conf, string);</div><div class='add'>+    }</div><div class='add'>+out:</div><div class='add'>+    TRACE_STACK_UNWIND(removexattr, frame, op_ret, op_errno, xdata);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-trace_readdirp_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-                    int32_t op_ret, int32_t op_errno, gf_dirent_t *buf)</div><div class='add'>+trace_fsyncdir_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                   int32_t op_ret, int32_t op_errno, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-        if (trace_fop_names[GF_FOP_READDIRP].enabled) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_NORMAL,</div><div class='del'>-                        "%"PRId64" :(op_ret=%d, op_errno=%d)",</div><div class='del'>-                        frame-&gt;root-&gt;unique, op_ret, op_errno);</div><div class='del'>-        }</div><div class='add'>+    trace_conf_t *conf = NULL;</div><div class='ctx'> </div><div class='del'>-        STACK_UNWIND_STRICT (readdirp, frame, op_ret, op_errno, buf);</div><div class='add'>+    conf = this-&gt;private;</div><div class='ctx'> </div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='add'>+    if (!conf-&gt;log_file &amp;&amp; !conf-&gt;log_history)</div><div class='add'>+        goto out;</div><div class='add'>+    if (trace_fop_names[GF_FOP_FSYNCDIR].enabled) {</div><div class='add'>+        char string[4096] = {</div><div class='add'>+            0,</div><div class='add'>+        };</div><div class='add'>+        snprintf(string, sizeof(string),</div><div class='add'>+                 "%" PRId64 ": gfid=%s op_ret=%d, op_errno=%d",</div><div class='add'>+                 frame-&gt;root-&gt;unique, uuid_utoa(frame-&gt;local), op_ret,</div><div class='add'>+                 op_errno);</div><div class='add'>+</div><div class='add'>+        LOG_ELEMENT(conf, string);</div><div class='add'>+    }</div><div class='add'>+out:</div><div class='add'>+    TRACE_STACK_UNWIND(fsyncdir, frame, op_ret, op_errno, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+trace_access_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                 int32_t op_ret, int32_t op_errno, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    trace_conf_t *conf = NULL;</div><div class='add'>+</div><div class='add'>+    conf = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    if (!conf-&gt;log_file &amp;&amp; !conf-&gt;log_history)</div><div class='add'>+        goto out;</div><div class='add'>+    if (trace_fop_names[GF_FOP_ACCESS].enabled) {</div><div class='add'>+        char string[4096] = {</div><div class='add'>+            0,</div><div class='add'>+        };</div><div class='add'>+        snprintf(string, sizeof(string),</div><div class='add'>+                 "%" PRId64</div><div class='add'>+                 ": gfid=%s op_ret=%d, "</div><div class='add'>+                 "op_errno=%d)",</div><div class='add'>+                 frame-&gt;root-&gt;unique, uuid_utoa(frame-&gt;local), op_ret,</div><div class='add'>+                 op_errno);</div><div class='add'>+</div><div class='add'>+        LOG_ELEMENT(conf, string);</div><div class='add'>+    }</div><div class='add'>+out:</div><div class='add'>+    TRACE_STACK_UNWIND(access, frame, op_ret, op_errno, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+trace_ftruncate_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                    int32_t op_ret, int32_t op_errno, struct iatt *prebuf,</div><div class='add'>+                    struct iatt *postbuf, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    char prebufstr[1024] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    char postbufstr[1024] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    trace_conf_t *conf = NULL;</div><div class='add'>+</div><div class='add'>+    conf = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    if (!conf-&gt;log_file &amp;&amp; !conf-&gt;log_history)</div><div class='add'>+        goto out;</div><div class='add'>+    if (trace_fop_names[GF_FOP_FTRUNCATE].enabled) {</div><div class='add'>+        char string[4096] = {</div><div class='add'>+            0,</div><div class='add'>+        };</div><div class='add'>+        if (op_ret == 0) {</div><div class='add'>+            TRACE_STAT_TO_STR(prebuf, prebufstr);</div><div class='add'>+            TRACE_STAT_TO_STR(postbuf, postbufstr);</div><div class='add'>+</div><div class='add'>+            snprintf(string, sizeof(string),</div><div class='add'>+                     "%" PRId64</div><div class='add'>+                     ": op_ret=%d, "</div><div class='add'>+                     "*prebuf = {%s}, *postbuf = {%s} )",</div><div class='add'>+                     frame-&gt;root-&gt;unique, op_ret, prebufstr, postbufstr);</div><div class='add'>+        } else {</div><div class='add'>+            snprintf(string, sizeof(string),</div><div class='add'>+                     "%" PRId64</div><div class='add'>+                     ": gfid=%s op_ret=%d, "</div><div class='add'>+                     "op_errno=%d",</div><div class='add'>+                     frame-&gt;root-&gt;unique, uuid_utoa(frame-&gt;local), op_ret,</div><div class='add'>+                     op_errno);</div><div class='add'>+        }</div><div class='add'>+        LOG_ELEMENT(conf, string);</div><div class='add'>+    }</div><div class='add'>+out:</div><div class='add'>+    TRACE_STACK_UNWIND(ftruncate, frame, op_ret, op_errno, prebuf, postbuf,</div><div class='add'>+                       xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+trace_fstat_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                int32_t op_ret, int32_t op_errno, struct iatt *buf,</div><div class='add'>+                dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    char statstr[1024] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    trace_conf_t *conf = NULL;</div><div class='add'>+</div><div class='add'>+    conf = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    if (!conf-&gt;log_file &amp;&amp; !conf-&gt;log_history)</div><div class='add'>+        goto out;</div><div class='add'>+    if (trace_fop_names[GF_FOP_FSTAT].enabled) {</div><div class='add'>+        char string[4096] = {0.};</div><div class='add'>+        if (op_ret == 0) {</div><div class='add'>+            TRACE_STAT_TO_STR(buf, statstr);</div><div class='add'>+            snprintf(string, sizeof(string),</div><div class='add'>+                     "%" PRId64</div><div class='add'>+                     ": gfid=%s op_ret=%d "</div><div class='add'>+                     "buf=%s",</div><div class='add'>+                     frame-&gt;root-&gt;unique, uuid_utoa(frame-&gt;local), op_ret,</div><div class='add'>+                     statstr);</div><div class='add'>+        } else {</div><div class='add'>+            snprintf(string, sizeof(string),</div><div class='add'>+                     "%" PRId64</div><div class='add'>+                     ": gfid=%s op_ret=%d, "</div><div class='add'>+                     "op_errno=%d",</div><div class='add'>+                     frame-&gt;root-&gt;unique, uuid_utoa(frame-&gt;local), op_ret,</div><div class='add'>+                     op_errno);</div><div class='add'>+        }</div><div class='add'>+        LOG_ELEMENT(conf, string);</div><div class='add'>+    }</div><div class='add'>+out:</div><div class='add'>+    TRACE_STACK_UNWIND(fstat, frame, op_ret, op_errno, buf, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+trace_lk_cbk(call_frame_t *frame, void *cookie, xlator_t *this, int32_t op_ret,</div><div class='add'>+             int32_t op_errno, struct gf_flock *lock, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    trace_conf_t *conf = NULL;</div><div class='add'>+</div><div class='add'>+    conf = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    if (!conf-&gt;log_file &amp;&amp; !conf-&gt;log_history)</div><div class='add'>+        goto out;</div><div class='add'>+    if (trace_fop_names[GF_FOP_LK].enabled) {</div><div class='add'>+        char string[4096] = {</div><div class='add'>+            0,</div><div class='add'>+        };</div><div class='add'>+        if (op_ret == 0) {</div><div class='add'>+            snprintf(string, sizeof(string),</div><div class='add'>+                     "%" PRId64</div><div class='add'>+                     ": gfid=%s op_ret=%d, "</div><div class='add'>+                     "{l_type=%d, l_whence=%d, "</div><div class='add'>+                     "l_start=%" PRId64</div><div class='add'>+                     ", "</div><div class='add'>+                     "l_len=%" PRId64 ", l_pid=%u})",</div><div class='add'>+                     frame-&gt;root-&gt;unique, uuid_utoa(frame-&gt;local), op_ret,</div><div class='add'>+                     lock-&gt;l_type, lock-&gt;l_whence, lock-&gt;l_start, lock-&gt;l_len,</div><div class='add'>+                     lock-&gt;l_pid);</div><div class='add'>+        } else {</div><div class='add'>+            snprintf(string, sizeof(string),</div><div class='add'>+                     "%" PRId64</div><div class='add'>+                     ": gfid=%s op_ret=%d, "</div><div class='add'>+                     "op_errno=%d)",</div><div class='add'>+                     frame-&gt;root-&gt;unique, uuid_utoa(frame-&gt;local), op_ret,</div><div class='add'>+                     op_errno);</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        LOG_ELEMENT(conf, string);</div><div class='add'>+    }</div><div class='add'>+out:</div><div class='add'>+    TRACE_STACK_UNWIND(lk, frame, op_ret, op_errno, lock, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+trace_entrylk_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                  int32_t op_ret, int32_t op_errno, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    trace_conf_t *conf = NULL;</div><div class='add'>+</div><div class='add'>+    conf = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    if (!conf-&gt;log_file &amp;&amp; !conf-&gt;log_history)</div><div class='add'>+        goto out;</div><div class='add'>+    if (trace_fop_names[GF_FOP_ENTRYLK].enabled) {</div><div class='add'>+        char string[4096] = {</div><div class='add'>+            0,</div><div class='add'>+        };</div><div class='add'>+        snprintf(string, sizeof(string),</div><div class='add'>+                 "%" PRId64 ": gfid=%s op_ret=%d, op_errno=%d",</div><div class='add'>+                 frame-&gt;root-&gt;unique, uuid_utoa(frame-&gt;local), op_ret,</div><div class='add'>+                 op_errno);</div><div class='add'>+</div><div class='add'>+        LOG_ELEMENT(conf, string);</div><div class='add'>+    }</div><div class='add'>+out:</div><div class='add'>+    TRACE_STACK_UNWIND(entrylk, frame, op_ret, op_errno, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+trace_fentrylk_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                   int32_t op_ret, int32_t op_errno, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    trace_conf_t *conf = NULL;</div><div class='add'>+</div><div class='add'>+    conf = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    if (!conf-&gt;log_file &amp;&amp; !conf-&gt;log_history)</div><div class='add'>+        goto out;</div><div class='add'>+    if (trace_fop_names[GF_FOP_FENTRYLK].enabled) {</div><div class='add'>+        char string[4096] = {</div><div class='add'>+            0,</div><div class='add'>+        };</div><div class='add'>+        snprintf(string, sizeof(string),</div><div class='add'>+                 "%" PRId64 ": gfid=%s op_ret=%d, op_errno=%d",</div><div class='add'>+                 frame-&gt;root-&gt;unique, uuid_utoa(frame-&gt;local), op_ret,</div><div class='add'>+                 op_errno);</div><div class='ctx'> </div><div class='add'>+        LOG_ELEMENT(conf, string);</div><div class='add'>+    }</div><div class='add'>+out:</div><div class='add'>+    TRACE_STACK_UNWIND(fentrylk, frame, op_ret, op_errno, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-trace_fsync_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-                 int32_t op_ret, int32_t op_errno,</div><div class='del'>-                 struct iatt *prebuf, struct iatt *postbuf)</div><div class='add'>+trace_xattrop_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                  int32_t op_ret, int32_t op_errno, dict_t *dict, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-        char  *preopstr = NULL;</div><div class='del'>-        char  *postopstr = NULL;</div><div class='add'>+    trace_conf_t *conf = NULL;</div><div class='ctx'> </div><div class='del'>-        if (trace_fop_names[GF_FOP_FSYNC].enabled) {</div><div class='del'>-                if (op_ret &gt;= 0) {</div><div class='del'>-                        preopstr = trace_stat_to_str (prebuf);</div><div class='del'>-                        postopstr = trace_stat_to_str (postbuf);</div><div class='add'>+    conf = this-&gt;private;</div><div class='ctx'> </div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_NORMAL,</div><div class='del'>-                                "%"PRId64": (op_ret=%d, ino = %"PRIu64</div><div class='del'>-                                ", *prebuf = {%s}, *postbuf = {%s}",</div><div class='del'>-                                frame-&gt;root-&gt;unique, op_ret, postbuf-&gt;ia_ino,</div><div class='del'>-                                preopstr, postopstr);</div><div class='add'>+    if (!conf-&gt;log_file &amp;&amp; !conf-&gt;log_history)</div><div class='add'>+        goto out;</div><div class='add'>+    if (trace_fop_names[GF_FOP_XATTROP].enabled) {</div><div class='add'>+        char string[4096] = {</div><div class='add'>+            0,</div><div class='add'>+        };</div><div class='add'>+        snprintf(string, sizeof(string),</div><div class='add'>+                 "%" PRId64 ": gfid=%s op_ret=%d, op_errno=%d",</div><div class='add'>+                 frame-&gt;root-&gt;unique, uuid_utoa(frame-&gt;local), op_ret,</div><div class='add'>+                 op_errno);</div><div class='ctx'> </div><div class='del'>-                        if (preopstr)</div><div class='del'>-                                GF_FREE (preopstr);</div><div class='add'>+        LOG_ELEMENT(conf, string);</div><div class='add'>+    }</div><div class='add'>+out:</div><div class='add'>+    TRACE_STACK_UNWIND(xattrop, frame, op_ret, op_errno, dict, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-                        if (postopstr)</div><div class='del'>-                                GF_FREE (postopstr);</div><div class='del'>-                } else {</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_NORMAL,</div><div class='del'>-                                "%"PRId64": (op_ret=%d, op_errno=%d)",</div><div class='del'>-                                frame-&gt;root-&gt;unique, op_ret, op_errno);</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='add'>+int</div><div class='add'>+trace_fxattrop_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                   int32_t op_ret, int32_t op_errno, dict_t *dict,</div><div class='add'>+                   dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    trace_conf_t *conf = NULL;</div><div class='ctx'> </div><div class='del'>-        STACK_UNWIND_STRICT (fsync, frame, op_ret, op_errno, prebuf, postbuf);</div><div class='del'>-</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-trace_setattr_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-                   int32_t op_ret, int32_t op_errno,</div><div class='del'>-                   struct iatt *statpre, struct iatt *statpost)</div><div class='del'>-{</div><div class='del'>-        uint64_t ia_time         = 0;</div><div class='del'>-        char     atime_pre[256]  = {0,};</div><div class='del'>-        char     mtime_pre[256]  = {0,};</div><div class='del'>-        char     ctime_pre[256]  = {0,};</div><div class='del'>-        char     atime_post[256] = {0,};</div><div class='del'>-        char     mtime_post[256] = {0,};</div><div class='del'>-        char     ctime_post[256] = {0,};</div><div class='del'>-</div><div class='del'>-        if (trace_fop_names[GF_FOP_SETATTR].enabled) {</div><div class='del'>-                if (op_ret &gt;= 0) {</div><div class='del'>-                        ia_time = statpre-&gt;ia_atime;</div><div class='del'>-                        strftime (atime_pre, 256, "[%b %d %H:%M:%S]",</div><div class='del'>-                                  localtime ((time_t *)&amp;ia_time));</div><div class='del'>-</div><div class='del'>-                        ia_time = statpre-&gt;ia_mtime;</div><div class='del'>-                        strftime (mtime_pre, 256, "[%b %d %H:%M:%S]",</div><div class='del'>-                                  localtime ((time_t *)&amp;ia_time));</div><div class='del'>-</div><div class='del'>-                        ia_time = statpre-&gt;ia_ctime;</div><div class='del'>-                        strftime (ctime_pre, 256, "[%b %d %H:%M:%S]",</div><div class='del'>-                                  localtime ((time_t *)&amp;ia_time));</div><div class='del'>-</div><div class='del'>-                        ia_time = statpost-&gt;ia_atime;</div><div class='del'>-                        strftime (atime_post, 256, "[%b %d %H:%M:%S]",</div><div class='del'>-                                  localtime ((time_t *)&amp;ia_time));</div><div class='del'>-</div><div class='del'>-                        ia_time = statpost-&gt;ia_mtime;</div><div class='del'>-                        strftime (mtime_post, 256, "[%b %d %H:%M:%S]",</div><div class='del'>-                                  localtime ((time_t *)&amp;ia_time));</div><div class='del'>-</div><div class='del'>-                        ia_time = statpost-&gt;ia_ctime;</div><div class='del'>-                        strftime (ctime_post, 256, "[%b %d %H:%M:%S]",</div><div class='del'>-                                  localtime ((time_t *)&amp;ia_time));</div><div class='del'>-</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_NORMAL,</div><div class='del'>-                                "%"PRId64": (op_ret=%d, *statpre "</div><div class='del'>-                                "{ia_ino=%"PRIu64", st_mode=%o, ia_uid=%d, "</div><div class='del'>-                                "ia_gid=%d, ia_atime=%s, ia_mtime=%s, "</div><div class='del'>-                                "ia_ctime=%s}, *statpost {ia_ino=%"PRIu64", "</div><div class='del'>-                                "st_mode=%o, ia_uid=%d, ia_gid=%d, ia_atime=%s,"</div><div class='del'>-                                " ia_mtime=%s, ia_ctime=%s})",</div><div class='del'>-                                frame-&gt;root-&gt;unique, op_ret, statpre-&gt;ia_ino,</div><div class='del'>-                                st_mode_from_ia (statpre-&gt;ia_prot, statpre-&gt;ia_type),</div><div class='del'>-                                statpre-&gt;ia_uid,</div><div class='del'>-                                statpre-&gt;ia_gid, atime_pre, mtime_pre,</div><div class='del'>-                                ctime_pre, statpost-&gt;ia_ino,</div><div class='del'>-                                st_mode_from_ia (statpost-&gt;ia_prot, statpost-&gt;ia_type),</div><div class='del'>-                                statpost-&gt;ia_uid, statpost-&gt;ia_gid, atime_post,</div><div class='del'>-                                mtime_post, ctime_post);</div><div class='del'>-                } else {</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_NORMAL,</div><div class='del'>-                                "%"PRId64": (op_ret=%d, op_errno=%d)",</div><div class='del'>-                                frame-&gt;root-&gt;unique, op_ret, op_errno);</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='add'>+    conf = this-&gt;private;</div><div class='ctx'> </div><div class='del'>-        STACK_UNWIND_STRICT (setattr, frame, op_ret, op_errno, statpre, statpost);</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-trace_fsetattr_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-                    int32_t op_ret, int32_t op_errno,</div><div class='del'>-                    struct iatt *statpre, struct iatt *statpost)</div><div class='del'>-{</div><div class='del'>-        uint64_t ia_time         = 0;</div><div class='del'>-        char     atime_pre[256]  = {0,};</div><div class='del'>-        char     mtime_pre[256]  = {0,};</div><div class='del'>-        char     ctime_pre[256]  = {0,};</div><div class='del'>-        char     atime_post[256] = {0,};</div><div class='del'>-        char     mtime_post[256] = {0,};</div><div class='del'>-        char     ctime_post[256] = {0,};</div><div class='del'>-</div><div class='del'>-        if (trace_fop_names[GF_FOP_FSETATTR].enabled) {</div><div class='del'>-                if (op_ret &gt;= 0) {</div><div class='del'>-                        ia_time = statpre-&gt;ia_atime;</div><div class='del'>-                        strftime (atime_pre, 256, "[%b %d %H:%M:%S]",</div><div class='del'>-                                  localtime ((time_t *)&amp;ia_time));</div><div class='del'>-</div><div class='del'>-                        ia_time = statpre-&gt;ia_mtime; </div><div class='del'>-                        strftime (mtime_pre, 256, "[%b %d %H:%M:%S]",</div><div class='del'>-                                  localtime ((time_t *)&amp;ia_time));</div><div class='del'>-</div><div class='del'>-                        ia_time = statpre-&gt;ia_ctime;</div><div class='del'>-                        strftime (ctime_pre, 256, "[%b %d %H:%M:%S]",</div><div class='del'>-                                  localtime ((time_t *)&amp;ia_time));</div><div class='del'>-</div><div class='del'>-                        ia_time = statpost-&gt;ia_atime;</div><div class='del'>-                        strftime (atime_post, 256, "[%b %d %H:%M:%S]",</div><div class='del'>-                                  localtime ((time_t *)&amp;ia_time));</div><div class='del'>-</div><div class='del'>-                        ia_time = statpost-&gt;ia_mtime;</div><div class='del'>-                        strftime (mtime_post, 256, "[%b %d %H:%M:%S]",</div><div class='del'>-                                  localtime ((time_t *)&amp;ia_time));</div><div class='del'>-</div><div class='del'>-                        ia_time = statpost-&gt;ia_ctime;</div><div class='del'>-                        strftime (ctime_post, 256, "[%b %d %H:%M:%S]",</div><div class='del'>-                                  localtime ((time_t *)&amp;ia_time));</div><div class='del'>-</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_NORMAL,</div><div class='del'>-                                "%"PRId64": (op_ret=%d, *statpre "</div><div class='del'>-                                "{ia_ino=%"PRIu64", st_mode=%o, ia_uid=%d, "</div><div class='del'>-                                "ia_gid=%d, ia_atime=%s, ia_mtime=%s, "</div><div class='del'>-                                "ia_ctime=%s}, *statpost {ia_ino=%"PRIu64", "</div><div class='del'>-                                "st_mode=%o, ia_uid=%d, ia_gid=%d, ia_atime=%s,"</div><div class='del'>-                                " ia_mtime=%s, ia_ctime=%s})",</div><div class='del'>-                                frame-&gt;root-&gt;unique, op_ret, statpre-&gt;ia_ino,</div><div class='del'>-                                st_mode_from_ia (statpre-&gt;ia_prot, statpre-&gt;ia_type),</div><div class='del'>-                                statpre-&gt;ia_uid,</div><div class='del'>-                                statpre-&gt;ia_gid, atime_pre, mtime_pre,</div><div class='del'>-                                ctime_pre, statpost-&gt;ia_ino,</div><div class='del'>-                                st_mode_from_ia (statpost-&gt;ia_prot, statpost-&gt;ia_type),</div><div class='del'>-                                statpost-&gt;ia_uid, statpost-&gt;ia_gid, atime_post,</div><div class='del'>-                                mtime_post, ctime_post);</div><div class='del'>-                } else {</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_NORMAL,</div><div class='del'>-                                "%"PRId64": (op_ret=%d, op_errno=%d)",</div><div class='del'>-                                frame-&gt;root-&gt;unique, op_ret, op_errno);</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='add'>+    if (!conf-&gt;log_file &amp;&amp; !conf-&gt;log_history)</div><div class='add'>+        goto out;</div><div class='add'>+    if (trace_fop_names[GF_FOP_FXATTROP].enabled) {</div><div class='add'>+        char string[4096] = {</div><div class='add'>+            0,</div><div class='add'>+        };</div><div class='add'>+        snprintf(string, sizeof(string),</div><div class='add'>+                 "%" PRId64 ": gfid=%s op_ret=%d, op_errno=%d",</div><div class='add'>+                 frame-&gt;root-&gt;unique, uuid_utoa(frame-&gt;local), op_ret,</div><div class='add'>+                 op_errno);</div><div class='ctx'> </div><div class='del'>-        STACK_UNWIND_STRICT (fsetattr, frame, op_ret, op_errno,</div><div class='del'>-                             statpre, statpost);</div><div class='del'>-        return 0;</div><div class='add'>+        LOG_ELEMENT(conf, string);</div><div class='add'>+    }</div><div class='add'>+out:</div><div class='add'>+    TRACE_STACK_UNWIND(fxattrop, frame, op_ret, op_errno, dict, xdata);</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-trace_unlink_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-                  int32_t op_ret, int32_t op_errno,</div><div class='del'>-                  struct iatt *preparent, struct iatt *postparent)</div><div class='add'>+trace_inodelk_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                  int32_t op_ret, int32_t op_errno, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-        char *preparentstr = NULL;</div><div class='del'>-        char *postparentstr = NULL;</div><div class='add'>+    trace_conf_t *conf = NULL;</div><div class='ctx'> </div><div class='del'>-        if (trace_fop_names[GF_FOP_UNLINK].enabled) {</div><div class='del'>-                if (op_ret &gt;= 0) {</div><div class='del'>-                        preparentstr = trace_stat_to_str (preparent);</div><div class='del'>-                        postparentstr = trace_stat_to_str (postparent);</div><div class='add'>+    conf = this-&gt;private;</div><div class='ctx'> </div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_NORMAL,</div><div class='del'>-                                "%"PRId64": (op_ret=%d, *preparent = {%s}, "</div><div class='del'>-                                "*postparent = {%s})",</div><div class='del'>-                                frame-&gt;root-&gt;unique, op_ret, preparentstr,</div><div class='del'>-                                postparentstr);</div><div class='add'>+    if (!conf-&gt;log_file &amp;&amp; !conf-&gt;log_history)</div><div class='add'>+        goto out;</div><div class='add'>+    if (trace_fop_names[GF_FOP_INODELK].enabled) {</div><div class='add'>+        char string[4096] = {</div><div class='add'>+            0,</div><div class='add'>+        };</div><div class='add'>+        snprintf(string, sizeof(string),</div><div class='add'>+                 "%" PRId64 ": gfid=%s op_ret=%d, op_errno=%d",</div><div class='add'>+                 frame-&gt;root-&gt;unique, uuid_utoa(frame-&gt;local), op_ret,</div><div class='add'>+                 op_errno);</div><div class='ctx'> </div><div class='del'>-                        if (preparentstr)</div><div class='del'>-                                GF_FREE (preparentstr);</div><div class='add'>+        LOG_ELEMENT(conf, string);</div><div class='add'>+    }</div><div class='add'>+out:</div><div class='add'>+    TRACE_STACK_UNWIND(inodelk, frame, op_ret, op_errno, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-                        if (postparentstr)</div><div class='del'>-                                GF_FREE (postparentstr);</div><div class='del'>-                } else {</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_NORMAL,</div><div class='del'>-                                "%"PRId64": (op_ret=%d, op_errno=%d)",</div><div class='del'>-                                frame-&gt;root-&gt;unique, op_ret, op_errno);</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='add'>+int</div><div class='add'>+trace_finodelk_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                   int32_t op_ret, int32_t op_errno, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    trace_conf_t *conf = NULL;</div><div class='ctx'> </div><div class='del'>-        STACK_UNWIND_STRICT (unlink, frame, op_ret, op_errno,</div><div class='del'>-                             preparent, postparent);</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-trace_rename_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-                  int32_t op_ret, int32_t op_errno, struct iatt *buf,</div><div class='del'>-                  struct iatt *preoldparent, struct iatt *postoldparent,</div><div class='del'>-                  struct iatt *prenewparent, struct iatt *postnewparent)</div><div class='del'>-{</div><div class='del'>-        char  *statstr = NULL;</div><div class='del'>-        char  *preoldparentstr = NULL;</div><div class='del'>-        char  *postoldparentstr = NULL;</div><div class='del'>-        char  *prenewparentstr = NULL;</div><div class='del'>-        char  *postnewparentstr = NULL;</div><div class='del'>-</div><div class='del'>-        if (trace_fop_names[GF_FOP_RENAME].enabled) {</div><div class='del'>-                if (op_ret &gt;= 0) {</div><div class='del'>-                        statstr = trace_stat_to_str (buf);</div><div class='del'>-                        preoldparentstr = trace_stat_to_str (preoldparent);</div><div class='del'>-                        postoldparentstr = trace_stat_to_str (postoldparent);</div><div class='del'>-</div><div class='del'>-                        prenewparentstr = trace_stat_to_str (prenewparent);</div><div class='del'>-                        postnewparentstr = trace_stat_to_str (postnewparent);</div><div class='del'>-</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_NORMAL,</div><div class='del'>-                                "%"PRId64": (op_ret=%d, *stbuf = {%s}, "</div><div class='del'>-                                "*preoldparent = {%s}, *postoldparent = {%s}"</div><div class='del'>-                                " *prenewparent = {%s}, *postnewparent = {%s})",</div><div class='del'>-                                frame-&gt;root-&gt;unique, op_ret, statstr,</div><div class='del'>-                                preoldparentstr, postoldparentstr,</div><div class='del'>-                                prenewparentstr, postnewparentstr);</div><div class='del'>-</div><div class='del'>-                        if (preoldparentstr)</div><div class='del'>-                                GF_FREE (preoldparentstr);</div><div class='del'>-</div><div class='del'>-                        if (postoldparentstr)</div><div class='del'>-                                GF_FREE (postoldparentstr);</div><div class='del'>-</div><div class='del'>-                        if (prenewparentstr)</div><div class='del'>-                                GF_FREE (prenewparentstr);</div><div class='del'>-</div><div class='del'>-                        if (postnewparentstr)</div><div class='del'>-                                GF_FREE (postnewparentstr);</div><div class='del'>-                } else {</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_NORMAL,</div><div class='del'>-                                "%"PRId64": (op_ret=%d, op_errno=%d)",</div><div class='del'>-                                frame-&gt;root-&gt;unique, op_ret, op_errno);</div><div class='del'>-                }</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_NORMAL,</div><div class='del'>-                        "%"PRId64": (op_ret=%d, op_errno=%d, buf {ia_ino=%"PRIu64"})",</div><div class='del'>-                        frame-&gt;root-&gt;unique, op_ret, op_errno,</div><div class='del'>-                        (buf? buf-&gt;ia_ino : 0));</div><div class='del'>-        }</div><div class='add'>+    conf = this-&gt;private;</div><div class='ctx'> </div><div class='del'>-        STACK_UNWIND_STRICT (rename, frame, op_ret, op_errno, buf,</div><div class='del'>-                             preoldparent, postoldparent,</div><div class='del'>-                             prenewparent, postnewparent);</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='add'>+    if (!conf-&gt;log_file &amp;&amp; !conf-&gt;log_history)</div><div class='add'>+        goto out;</div><div class='add'>+    if (trace_fop_names[GF_FOP_FINODELK].enabled) {</div><div class='add'>+        char string[4096] = {</div><div class='add'>+            0,</div><div class='add'>+        };</div><div class='add'>+        snprintf(string, sizeof(string),</div><div class='add'>+                 "%" PRId64 ": gfid=%s op_ret=%d, op_errno=%d",</div><div class='add'>+                 frame-&gt;root-&gt;unique, uuid_utoa(frame-&gt;local), op_ret,</div><div class='add'>+                 op_errno);</div><div class='ctx'> </div><div class='add'>+        LOG_ELEMENT(conf, string);</div><div class='add'>+    }</div><div class='add'>+out:</div><div class='add'>+    TRACE_STACK_UNWIND(finodelk, frame, op_ret, op_errno, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-trace_readlink_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-                    int32_t op_ret, int32_t op_errno,</div><div class='del'>-                    const char *buf, struct iatt *stbuf)</div><div class='add'>+trace_rchecksum_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                    int32_t op_ret, int32_t op_errno, uint32_t weak_checksum,</div><div class='add'>+                    uint8_t *strong_checksum, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-        char *statstr = NULL;</div><div class='add'>+    trace_conf_t *conf = NULL;</div><div class='ctx'> </div><div class='del'>-        if (trace_fop_names[GF_FOP_READLINK].enabled) {</div><div class='add'>+    conf = this-&gt;private;</div><div class='ctx'> </div><div class='del'>-                if (op_ret == 0) {</div><div class='del'>-                        statstr = trace_stat_to_str (stbuf);</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_NORMAL,</div><div class='del'>-                                "%"PRId64": (op_ret=%d, op_errno=%d, buf=%s, "</div><div class='del'>-                                "stbuf = { %s })",</div><div class='del'>-                                frame-&gt;root-&gt;unique, op_ret, op_errno, buf,</div><div class='del'>-                                statstr);</div><div class='del'>-                } else</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_NORMAL,</div><div class='del'>-                                "%"PRId64": (op_ret=%d, op_errno=%d",</div><div class='del'>-                                frame-&gt;root-&gt;unique, op_ret, op_errno);</div><div class='add'>+    if (!conf-&gt;log_file &amp;&amp; !conf-&gt;log_history)</div><div class='add'>+        goto out;</div><div class='add'>+    if (trace_fop_names[GF_FOP_RCHECKSUM].enabled) {</div><div class='add'>+        char string[4096] = {</div><div class='add'>+            0,</div><div class='add'>+        };</div><div class='add'>+        snprintf(string, sizeof(string),</div><div class='add'>+                 "%" PRId64 ": gfid=%s op_ret=%d op_errno=%d",</div><div class='add'>+                 frame-&gt;root-&gt;unique, uuid_utoa(frame-&gt;local), op_ret,</div><div class='add'>+                 op_errno);</div><div class='ctx'> </div><div class='del'>-                if (statstr)</div><div class='del'>-                        GF_FREE (statstr);</div><div class='del'>-        }</div><div class='add'>+        LOG_ELEMENT(conf, string);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        STACK_UNWIND_STRICT (readlink, frame, op_ret, op_errno, buf, stbuf);</div><div class='del'>-        return 0;</div><div class='add'>+out:</div><div class='add'>+    TRACE_STACK_UNWIND(rchecksum, frame, op_ret, op_errno, weak_checksum,</div><div class='add'>+                       strong_checksum, xdata);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+/* *_cbk section over &lt;----------&gt; fop section start */</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-trace_lookup_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-                  int32_t op_ret, int32_t op_errno,</div><div class='del'>-                  inode_t *inode, struct iatt *buf,</div><div class='del'>-                  dict_t *xattr, struct iatt *postparent)</div><div class='add'>+trace_entrylk(call_frame_t *frame, xlator_t *this, const char *volume,</div><div class='add'>+              loc_t *loc, const char *basename, entrylk_cmd cmd,</div><div class='add'>+              entrylk_type type, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-        char  *statstr = NULL;</div><div class='del'>-        char  *postparentstr = NULL;</div><div class='add'>+    trace_conf_t *conf = NULL;</div><div class='ctx'> </div><div class='del'>-        if (trace_fop_names[GF_FOP_LOOKUP].enabled) {</div><div class='del'>-                if (op_ret &gt;= 0) {</div><div class='del'>-                        statstr = trace_stat_to_str (buf);</div><div class='del'>-                        postparentstr = trace_stat_to_str (postparent);</div><div class='add'>+    conf = this-&gt;private;</div><div class='ctx'> </div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_NORMAL,</div><div class='del'>-                                "%"PRId64": (op_ret=%d, ino=%"PRIu64", "</div><div class='del'>-                                "*buf {%s}, *postparent {%s}",</div><div class='del'>-                                frame-&gt;root-&gt;unique, op_ret, inode-&gt;ino,</div><div class='del'>-                                statstr, postparentstr);</div><div class='add'>+    if (!conf-&gt;log_file &amp;&amp; !conf-&gt;log_history)</div><div class='add'>+        goto out;</div><div class='add'>+    if (trace_fop_names[GF_FOP_ENTRYLK].enabled) {</div><div class='add'>+        char string[4096] = {</div><div class='add'>+            0,</div><div class='add'>+        };</div><div class='add'>+        snprintf(string, sizeof(string),</div><div class='add'>+                 "%" PRId64</div><div class='add'>+                 ": gfid=%s volume=%s, (path=%s "</div><div class='add'>+                 "basename=%s, cmd=%s, type=%s)",</div><div class='add'>+                 frame-&gt;root-&gt;unique, uuid_utoa(loc-&gt;inode-&gt;gfid), volume,</div><div class='add'>+                 loc-&gt;path, basename,</div><div class='add'>+                 ((cmd == ENTRYLK_LOCK) ? "ENTRYLK_LOCK" : "ENTRYLK_UNLOCK"),</div><div class='add'>+                 ((type == ENTRYLK_RDLCK) ? "ENTRYLK_RDLCK" : "ENTRYLK_WRLCK"));</div><div class='ctx'> </div><div class='del'>-                        if (statstr)</div><div class='del'>-                                GF_FREE (statstr);</div><div class='del'>-                        if (postparentstr)</div><div class='del'>-                                GF_FREE (postparentstr);</div><div class='del'>-                } else {</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_NORMAL,</div><div class='del'>-                                "%"PRId64": (op_ret=%d, op_errno=%d)",</div><div class='del'>-                                frame-&gt;root-&gt;unique, op_ret, op_errno);</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='add'>+        frame-&gt;local = loc-&gt;inode-&gt;gfid;</div><div class='ctx'> </div><div class='del'>-        STACK_UNWIND_STRICT (lookup, frame, op_ret, op_errno, inode, buf,</div><div class='del'>-                             xattr, postparent);</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='add'>+        LOG_ELEMENT(conf, string);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='add'>+out:</div><div class='add'>+    STACK_WIND(frame, trace_entrylk_cbk, FIRST_CHILD(this),</div><div class='add'>+               FIRST_CHILD(this)-&gt;fops-&gt;entrylk, volume, loc, basename, cmd,</div><div class='add'>+               type, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-trace_symlink_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-                   int32_t op_ret, int32_t op_errno,</div><div class='del'>-                   inode_t *inode, struct iatt *buf,</div><div class='del'>-                   struct iatt *preparent, struct iatt *postparent)</div><div class='add'>+trace_inodelk(call_frame_t *frame, xlator_t *this, const char *volume,</div><div class='add'>+              loc_t *loc, int32_t cmd, struct gf_flock *flock, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-        char  *statstr = NULL;</div><div class='del'>-        char  *preparentstr = NULL;</div><div class='del'>-        char  *postparentstr = NULL;</div><div class='add'>+    char *cmd_str = NULL;</div><div class='add'>+    char *type_str = NULL;</div><div class='add'>+    trace_conf_t *conf = NULL;</div><div class='ctx'> </div><div class='del'>-        if (trace_fop_names[GF_FOP_SYMLINK].enabled) {</div><div class='del'>-                if (op_ret &gt;= 0) {</div><div class='del'>-                        statstr = trace_stat_to_str (buf);</div><div class='del'>-                        preparentstr = trace_stat_to_str (preparent);</div><div class='del'>-                        postparentstr = trace_stat_to_str (postparent);</div><div class='add'>+    conf = this-&gt;private;</div><div class='ctx'> </div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_NORMAL,</div><div class='del'>-                                "%"PRId64": (op_ret=%d, ino=%"PRIu64", "</div><div class='del'>-                                "*stbuf = {%s}, *preparent = {%s}, "</div><div class='del'>-                                "*postparent = {%s})",</div><div class='del'>-                                frame-&gt;root-&gt;unique, op_ret, inode-&gt;ino,</div><div class='del'>-                                statstr, preparentstr, postparentstr);</div><div class='add'>+    if (!conf-&gt;log_file &amp;&amp; !conf-&gt;log_history)</div><div class='add'>+        goto out;</div><div class='add'>+    if (trace_fop_names[GF_FOP_INODELK].enabled) {</div><div class='add'>+        char string[4096] = {</div><div class='add'>+            0,</div><div class='add'>+        };</div><div class='add'>+        switch (cmd) {</div><div class='add'>+#if F_GETLK != F_GETLK64</div><div class='add'>+            case F_GETLK64:</div><div class='add'>+#endif</div><div class='add'>+            case F_GETLK:</div><div class='add'>+                cmd_str = "GETLK";</div><div class='add'>+                break;</div><div class='ctx'> </div><div class='del'>-                        if (statstr)</div><div class='del'>-                                GF_FREE (statstr);</div><div class='add'>+#if F_SETLK != F_SETLK64</div><div class='add'>+            case F_SETLK64:</div><div class='add'>+#endif</div><div class='add'>+            case F_SETLK:</div><div class='add'>+                cmd_str = "SETLK";</div><div class='add'>+                break;</div><div class='ctx'> </div><div class='del'>-                        if (preparentstr)</div><div class='del'>-                                GF_FREE (preparentstr);</div><div class='add'>+#if F_SETLKW != F_SETLKW64</div><div class='add'>+            case F_SETLKW64:</div><div class='add'>+#endif</div><div class='add'>+            case F_SETLKW:</div><div class='add'>+                cmd_str = "SETLKW";</div><div class='add'>+                break;</div><div class='add'>+</div><div class='add'>+            default:</div><div class='add'>+                cmd_str = "UNKNOWN";</div><div class='add'>+                break;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        switch (flock-&gt;l_type) {</div><div class='add'>+            case F_RDLCK:</div><div class='add'>+                type_str = "READ";</div><div class='add'>+                break;</div><div class='add'>+            case F_WRLCK:</div><div class='add'>+                type_str = "WRITE";</div><div class='add'>+                break;</div><div class='add'>+            case F_UNLCK:</div><div class='add'>+                type_str = "UNLOCK";</div><div class='add'>+                break;</div><div class='add'>+            default:</div><div class='add'>+                type_str = "UNKNOWN";</div><div class='add'>+                break;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        snprintf(</div><div class='add'>+            string, sizeof(string),</div><div class='add'>+            "%" PRId64</div><div class='add'>+            ": gfid=%s volume=%s, (path=%s "</div><div class='add'>+            "cmd=%s, type=%s, start=%llu, len=%llu, "</div><div class='add'>+            "pid=%llu)",</div><div class='add'>+            frame-&gt;root-&gt;unique, uuid_utoa(loc-&gt;inode-&gt;gfid), volume, loc-&gt;path,</div><div class='add'>+            cmd_str, type_str, (unsigned long long)flock-&gt;l_start,</div><div class='add'>+            (unsigned long long)flock-&gt;l_len, (unsigned long long)flock-&gt;l_pid);</div><div class='add'>+</div><div class='add'>+        frame-&gt;local = loc-&gt;inode-&gt;gfid;</div><div class='add'>+</div><div class='add'>+        LOG_ELEMENT(conf, string);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    STACK_WIND(frame, trace_inodelk_cbk, FIRST_CHILD(this),</div><div class='add'>+               FIRST_CHILD(this)-&gt;fops-&gt;inodelk, volume, loc, cmd, flock,</div><div class='add'>+               xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+trace_finodelk(call_frame_t *frame, xlator_t *this, const char *volume,</div><div class='add'>+               fd_t *fd, int32_t cmd, struct gf_flock *flock, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    char *cmd_str = NULL;</div><div class='add'>+    char *type_str = NULL;</div><div class='add'>+    trace_conf_t *conf = NULL;</div><div class='add'>+</div><div class='add'>+    conf = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    if (!conf-&gt;log_file &amp;&amp; !conf-&gt;log_history)</div><div class='add'>+        goto out;</div><div class='add'>+    if (trace_fop_names[GF_FOP_FINODELK].enabled) {</div><div class='add'>+        char string[4096] = {</div><div class='add'>+            0,</div><div class='add'>+        };</div><div class='add'>+        switch (cmd) {</div><div class='add'>+#if F_GETLK != F_GETLK64</div><div class='add'>+            case F_GETLK64:</div><div class='add'>+#endif</div><div class='add'>+            case F_GETLK:</div><div class='add'>+                cmd_str = "GETLK";</div><div class='add'>+                break;</div><div class='ctx'> </div><div class='del'>-                        if (postparentstr)</div><div class='del'>-                                GF_FREE (postparentstr);</div><div class='add'>+#if F_SETLK != F_SETLK64</div><div class='add'>+            case F_SETLK64:</div><div class='add'>+#endif</div><div class='add'>+            case F_SETLK:</div><div class='add'>+                cmd_str = "SETLK";</div><div class='add'>+                break;</div><div class='add'>+</div><div class='add'>+#if F_SETLKW != F_SETLKW64</div><div class='add'>+            case F_SETLKW64:</div><div class='add'>+#endif</div><div class='add'>+            case F_SETLKW:</div><div class='add'>+                cmd_str = "SETLKW";</div><div class='add'>+                break;</div><div class='ctx'> </div><div class='del'>-                } else {</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_NORMAL,</div><div class='del'>-                                "%"PRId64": (op_ret=%d, op_errno=%d)",</div><div class='del'>-                                frame-&gt;root-&gt;unique, op_ret, op_errno);</div><div class='del'>-                }</div><div class='add'>+            default:</div><div class='add'>+                cmd_str = "UNKNOWN";</div><div class='add'>+                break;</div><div class='ctx'>         }</div><div class='ctx'> </div><div class='del'>-        STACK_UNWIND_STRICT (symlink, frame, op_ret, op_errno, inode, buf,</div><div class='del'>-                             preparent, postparent);</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='add'>+        switch (flock-&gt;l_type) {</div><div class='add'>+            case F_RDLCK:</div><div class='add'>+                type_str = "READ";</div><div class='add'>+                break;</div><div class='add'>+            case F_WRLCK:</div><div class='add'>+                type_str = "WRITE";</div><div class='add'>+                break;</div><div class='add'>+            case F_UNLCK:</div><div class='add'>+                type_str = "UNLOCK";</div><div class='add'>+                break;</div><div class='add'>+            default:</div><div class='add'>+                type_str = "UNKNOWN";</div><div class='add'>+                break;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        snprintf(string, sizeof(string),</div><div class='add'>+                 "%" PRId64</div><div class='add'>+                 ": gfid=%s volume=%s, (fd =%p "</div><div class='add'>+                 "cmd=%s, type=%s, start=%llu, len=%llu, "</div><div class='add'>+                 "pid=%llu)",</div><div class='add'>+                 frame-&gt;root-&gt;unique, uuid_utoa(fd-&gt;inode-&gt;gfid), volume, fd,</div><div class='add'>+                 cmd_str, type_str, (unsigned long long)flock-&gt;l_start,</div><div class='add'>+                 (unsigned long long)flock-&gt;l_len,</div><div class='add'>+                 (unsigned long long)flock-&gt;l_pid);</div><div class='ctx'> </div><div class='add'>+        frame-&gt;local = fd-&gt;inode-&gt;gfid;</div><div class='add'>+</div><div class='add'>+        LOG_ELEMENT(conf, string);</div><div class='add'>+    }</div><div class='add'>+out:</div><div class='add'>+    STACK_WIND(frame, trace_finodelk_cbk, FIRST_CHILD(this),</div><div class='add'>+               FIRST_CHILD(this)-&gt;fops-&gt;finodelk, volume, fd, cmd, flock,</div><div class='add'>+               xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-trace_mknod_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-                 int32_t op_ret, int32_t op_errno,</div><div class='del'>-                 inode_t *inode, struct iatt *buf,</div><div class='del'>-                 struct iatt *preparent, struct iatt *postparent)</div><div class='add'>+trace_xattrop(call_frame_t *frame, xlator_t *this, loc_t *loc,</div><div class='add'>+              gf_xattrop_flags_t flags, dict_t *dict, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-        char *statstr = NULL;</div><div class='del'>-        char *preparentstr = NULL;</div><div class='del'>-        char *postparentstr = NULL;</div><div class='add'>+    trace_conf_t *conf = NULL;</div><div class='ctx'> </div><div class='del'>-        if (trace_fop_names[GF_FOP_MKNOD].enabled) {</div><div class='del'>-                if (op_ret &gt;= 0) {</div><div class='del'>-                        statstr = trace_stat_to_str (buf);</div><div class='del'>-                        preparentstr = trace_stat_to_str (preparent);</div><div class='del'>-                        postparentstr = trace_stat_to_str (postparent);</div><div class='add'>+    conf = this-&gt;private;</div><div class='ctx'> </div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_NORMAL,</div><div class='del'>-                                "%"PRId64": (op_ret=%d, ino=%"PRIu64", "</div><div class='del'>-                                "*stbuf = {%s}, *preparent = {%s}, "</div><div class='del'>-                                "*postparent = {%s})",</div><div class='del'>-                                frame-&gt;root-&gt;unique, op_ret, inode-&gt;ino,</div><div class='del'>-                                statstr, preparentstr, postparentstr);</div><div class='add'>+    if (!conf-&gt;log_file &amp;&amp; !conf-&gt;log_history)</div><div class='add'>+        goto out;</div><div class='add'>+    if (trace_fop_names[GF_FOP_XATTROP].enabled) {</div><div class='add'>+        char string[4096] = {</div><div class='add'>+            0,</div><div class='add'>+        };</div><div class='add'>+        snprintf(string, sizeof(string),</div><div class='add'>+                 "%" PRId64 ": gfid=%s (path=%s flags=%d)", frame-&gt;root-&gt;unique,</div><div class='add'>+                 uuid_utoa(loc-&gt;inode-&gt;gfid), loc-&gt;path, flags);</div><div class='ctx'> </div><div class='del'>-                        if (statstr)</div><div class='del'>-                                GF_FREE (statstr);</div><div class='add'>+        frame-&gt;local = loc-&gt;inode-&gt;gfid;</div><div class='ctx'> </div><div class='del'>-                        if (preparentstr)</div><div class='del'>-                                GF_FREE (preparentstr);</div><div class='add'>+        LOG_ELEMENT(conf, string);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-                        if (postparentstr)</div><div class='del'>-                                GF_FREE (postparentstr);</div><div class='del'>-                } else {</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_NORMAL,</div><div class='del'>-                                "%"PRId64": (op_ret=%d, op_errno=%d)",</div><div class='del'>-                                frame-&gt;root-&gt;unique, op_ret, op_errno);</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='add'>+out:</div><div class='add'>+    STACK_WIND(frame, trace_xattrop_cbk, FIRST_CHILD(this),</div><div class='add'>+               FIRST_CHILD(this)-&gt;fops-&gt;xattrop, loc, flags, dict, xdata);</div><div class='ctx'> </div><div class='del'>-        STACK_UNWIND_STRICT (mknod, frame, op_ret, op_errno, inode, buf,</div><div class='del'>-                             preparent, postparent);</div><div class='del'>-        return 0;</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-trace_mkdir_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-                 int32_t op_ret, int32_t op_errno,</div><div class='del'>-                 inode_t *inode, struct iatt *buf,</div><div class='del'>-                 struct iatt *preparent, struct iatt *postparent)</div><div class='add'>+trace_fxattrop(call_frame_t *frame, xlator_t *this, fd_t *fd,</div><div class='add'>+               gf_xattrop_flags_t flags, dict_t *dict, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-        char  *statstr = NULL;</div><div class='del'>-        char  *preparentstr = NULL;</div><div class='del'>-        char  *postparentstr = NULL;</div><div class='add'>+    trace_conf_t *conf = NULL;</div><div class='ctx'> </div><div class='del'>-        if (trace_fop_names[GF_FOP_MKDIR].enabled) {</div><div class='del'>-                if (op_ret &gt;= 0) {</div><div class='del'>-                        statstr = trace_stat_to_str (buf);</div><div class='del'>-                        preparentstr = trace_stat_to_str (preparent);</div><div class='del'>-                        postparentstr = trace_stat_to_str (postparent);</div><div class='add'>+    conf = this-&gt;private;</div><div class='ctx'> </div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_NORMAL,</div><div class='del'>-                                "%"PRId64": (op_ret=%d, ino = %"PRIu64</div><div class='del'>-                                ", *stbuf = {%s}, *prebuf = {%s}, "</div><div class='del'>-                                "*postbuf = {%s} )",</div><div class='del'>-                                frame-&gt;root-&gt;unique, op_ret, buf-&gt;ia_ino,</div><div class='del'>-                                statstr, preparentstr, postparentstr);</div><div class='add'>+    if (!conf-&gt;log_file &amp;&amp; !conf-&gt;log_history)</div><div class='add'>+        goto out;</div><div class='add'>+    if (trace_fop_names[GF_FOP_FXATTROP].enabled) {</div><div class='add'>+        char string[4096] = {</div><div class='add'>+            0,</div><div class='add'>+        };</div><div class='add'>+        snprintf(string, sizeof(string), "%" PRId64 ": gfid=%s fd=%p, flags=%d",</div><div class='add'>+                 frame-&gt;root-&gt;unique, uuid_utoa(fd-&gt;inode-&gt;gfid), fd, flags);</div><div class='ctx'> </div><div class='del'>-                        if (statstr)</div><div class='del'>-                                GF_FREE (statstr);</div><div class='add'>+        frame-&gt;local = fd-&gt;inode-&gt;gfid;</div><div class='ctx'> </div><div class='del'>-                        if (preparentstr)</div><div class='del'>-                                GF_FREE (preparentstr);</div><div class='add'>+        LOG_ELEMENT(conf, string);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-                        if (postparentstr)</div><div class='del'>-                                GF_FREE (postparentstr);</div><div class='del'>-                } else {</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_NORMAL,</div><div class='del'>-                                "%"PRId64": (op_ret=%d, op_errno=%d)",</div><div class='del'>-                                frame-&gt;root-&gt;unique, op_ret, op_errno);</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='add'>+out:</div><div class='add'>+    STACK_WIND(frame, trace_fxattrop_cbk, FIRST_CHILD(this),</div><div class='add'>+               FIRST_CHILD(this)-&gt;fops-&gt;fxattrop, fd, flags, dict, xdata);</div><div class='ctx'> </div><div class='del'>-        STACK_UNWIND_STRICT (mkdir, frame, op_ret, op_errno, inode, buf,</div><div class='del'>-                             preparent, postparent);</div><div class='del'>-        return 0;</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-trace_link_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-                int32_t op_ret, int32_t op_errno,</div><div class='del'>-                inode_t *inode, struct iatt *buf,</div><div class='del'>-                struct iatt *preparent, struct iatt *postparent)</div><div class='add'>+trace_lookup(call_frame_t *frame, xlator_t *this, loc_t *loc, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-        char  *statstr = NULL;</div><div class='del'>-        char  *preparentstr = NULL;</div><div class='del'>-        char  *postparentstr = NULL;</div><div class='add'>+    trace_conf_t *conf = NULL;</div><div class='ctx'> </div><div class='del'>-        if (trace_fop_names[GF_FOP_LINK].enabled) {</div><div class='del'>-                if (op_ret &gt;= 0) {</div><div class='del'>-                        statstr = trace_stat_to_str (buf);</div><div class='del'>-                        preparentstr = trace_stat_to_str (preparent);</div><div class='del'>-                        postparentstr = trace_stat_to_str (postparent);</div><div class='add'>+    conf = this-&gt;private;</div><div class='ctx'> </div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_NORMAL,</div><div class='del'>-                                "%"PRId64": (op_ret=%d, ino = %"PRIu64</div><div class='del'>-                                ", *stbuf = {%s}, *prebuf = {%s}, "</div><div class='del'>-                                "*postbuf = {%s})",</div><div class='del'>-                                frame-&gt;root-&gt;unique, op_ret, buf-&gt;ia_ino,</div><div class='del'>-                                statstr, preparentstr, postparentstr);</div><div class='add'>+    if (!conf-&gt;log_file &amp;&amp; !conf-&gt;log_history)</div><div class='add'>+        goto out;</div><div class='add'>+    if (trace_fop_names[GF_FOP_LOOKUP].enabled) {</div><div class='add'>+        char string[4096] = {</div><div class='add'>+            0,</div><div class='add'>+        };</div><div class='add'>+        /* TODO: print all the keys mentioned in xattr_req */</div><div class='add'>+        snprintf(string, sizeof(string), "%" PRId64 ": gfid=%s path=%s",</div><div class='add'>+                 frame-&gt;root-&gt;unique, uuid_utoa(loc-&gt;inode-&gt;gfid), loc-&gt;path);</div><div class='ctx'> </div><div class='del'>-                        if (statstr)</div><div class='del'>-                                GF_FREE (statstr);</div><div class='add'>+        frame-&gt;local = loc-&gt;inode-&gt;gfid;</div><div class='ctx'> </div><div class='del'>-                        if (preparentstr)</div><div class='del'>-                                GF_FREE (preparentstr);</div><div class='add'>+        LOG_ELEMENT(conf, string);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-                        if (postparentstr)</div><div class='del'>-                                GF_FREE (postparentstr);</div><div class='del'>-                } else {</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_NORMAL,</div><div class='del'>-                                "%"PRId64": (op_ret=%d, op_errno=%d)",</div><div class='del'>-                                frame-&gt;root-&gt;unique, op_ret, op_errno);</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='add'>+out:</div><div class='add'>+    STACK_WIND(frame, trace_lookup_cbk, FIRST_CHILD(this),</div><div class='add'>+               FIRST_CHILD(this)-&gt;fops-&gt;lookup, loc, xdata);</div><div class='ctx'> </div><div class='del'>-        STACK_UNWIND_STRICT (link, frame, op_ret, op_errno, inode, buf,</div><div class='del'>-                             preparent, postparent);</div><div class='del'>-        return 0;</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-trace_flush_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-                 int32_t op_ret, int32_t op_errno)</div><div class='add'>+trace_stat(call_frame_t *frame, xlator_t *this, loc_t *loc, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-        if (trace_fop_names[GF_FOP_FLUSH].enabled) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_NORMAL,</div><div class='del'>-                        "%"PRId64": (op_ret=%d, op_errno=%d)",</div><div class='del'>-                        frame-&gt;root-&gt;unique, op_ret, op_errno);</div><div class='del'>-        }</div><div class='add'>+    trace_conf_t *conf = NULL;</div><div class='ctx'> </div><div class='del'>-        STACK_UNWIND_STRICT (flush, frame, op_ret, op_errno);</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='add'>+    conf = this-&gt;private;</div><div class='ctx'> </div><div class='add'>+    if (!conf-&gt;log_file &amp;&amp; !conf-&gt;log_history)</div><div class='add'>+        goto out;</div><div class='add'>+    if (trace_fop_names[GF_FOP_STAT].enabled) {</div><div class='add'>+        char string[4096] = {</div><div class='add'>+            0,</div><div class='add'>+        };</div><div class='add'>+        snprintf(string, sizeof(string), "%" PRId64 ": gfid=%s path=%s",</div><div class='add'>+                 frame-&gt;root-&gt;unique, uuid_utoa(loc-&gt;inode-&gt;gfid), loc-&gt;path);</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-trace_opendir_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-                   int32_t op_ret, int32_t op_errno, fd_t *fd)</div><div class='del'>-{</div><div class='del'>-        if (trace_fop_names[GF_FOP_OPENDIR].enabled) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_NORMAL,</div><div class='del'>-                        "%"PRId64": (op_ret=%d, op_errno=%d, fd=%p)",</div><div class='del'>-                        frame-&gt;root-&gt;unique, op_ret, op_errno, fd);</div><div class='del'>-        }</div><div class='add'>+        frame-&gt;local = loc-&gt;inode-&gt;gfid;</div><div class='ctx'> </div><div class='del'>-        STACK_UNWIND_STRICT (opendir, frame, op_ret, op_errno, fd);</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='add'>+        LOG_ELEMENT(conf, string);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='add'>+out:</div><div class='add'>+    STACK_WIND(frame, trace_stat_cbk, FIRST_CHILD(this),</div><div class='add'>+               FIRST_CHILD(this)-&gt;fops-&gt;stat, loc, xdata);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-trace_rmdir_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-                 int32_t op_ret, int32_t op_errno,</div><div class='del'>-                 struct iatt *preparent, struct iatt *postparent)</div><div class='add'>+trace_readlink(call_frame_t *frame, xlator_t *this, loc_t *loc, size_t size,</div><div class='add'>+               dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-        char  *preparentstr = NULL;</div><div class='del'>-        char  *postparentstr = NULL;</div><div class='add'>+    trace_conf_t *conf = NULL;</div><div class='ctx'> </div><div class='del'>-        if (trace_fop_names[GF_FOP_RMDIR].enabled) {</div><div class='del'>-                if (op_ret &gt;= 0) {</div><div class='del'>-                        preparentstr = trace_stat_to_str (preparent);</div><div class='del'>-                        postparentstr = trace_stat_to_str (postparent);</div><div class='add'>+    conf = this-&gt;private;</div><div class='ctx'> </div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_NORMAL,</div><div class='del'>-                                "%"PRId64": (op_ret=%d, *prebuf = {%s}, "</div><div class='del'>-                                "*postbuf = {%s}",</div><div class='del'>-                                frame-&gt;root-&gt;unique, op_ret, preparentstr,</div><div class='del'>-                                postparentstr);</div><div class='add'>+    if (!conf-&gt;log_file &amp;&amp; !conf-&gt;log_history)</div><div class='add'>+        goto out;</div><div class='add'>+    if (trace_fop_names[GF_FOP_READLINK].enabled) {</div><div class='add'>+        char string[4096] = {</div><div class='add'>+            0,</div><div class='add'>+        };</div><div class='add'>+        snprintf(string, sizeof(string),</div><div class='add'>+                 "%" PRId64</div><div class='add'>+                 ": gfid=%s path=%s, "</div><div class='add'>+                 "size=%" GF_PRI_SIZET ")",</div><div class='add'>+                 frame-&gt;root-&gt;unique, uuid_utoa(loc-&gt;inode-&gt;gfid), loc-&gt;path,</div><div class='add'>+                 size);</div><div class='ctx'> </div><div class='del'>-                        if (preparentstr)</div><div class='del'>-                                GF_FREE (preparentstr);</div><div class='add'>+        frame-&gt;local = loc-&gt;inode-&gt;gfid;</div><div class='ctx'> </div><div class='del'>-                        if (postparentstr)</div><div class='del'>-                                GF_FREE (postparentstr);</div><div class='del'>-                } else {</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_NORMAL,</div><div class='del'>-                                "%"PRId64": (op_ret=%d, op_errno=%d)",</div><div class='del'>-                                frame-&gt;root-&gt;unique, op_ret, op_errno);</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='add'>+        LOG_ELEMENT(conf, string);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        STACK_UNWIND_STRICT (rmdir, frame, op_ret, op_errno,</div><div class='del'>-                             preparent, postparent);</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='add'>+out:</div><div class='add'>+    STACK_WIND(frame, trace_readlink_cbk, FIRST_CHILD(this),</div><div class='add'>+               FIRST_CHILD(this)-&gt;fops-&gt;readlink, loc, size, xdata);</div><div class='ctx'> </div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-trace_truncate_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-                    int32_t op_ret, int32_t op_errno,</div><div class='del'>-                    struct iatt *prebuf, struct iatt *postbuf)</div><div class='add'>+trace_mknod(call_frame_t *frame, xlator_t *this, loc_t *loc, mode_t mode,</div><div class='add'>+            dev_t dev, mode_t umask, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-        char  *preopstr = NULL;</div><div class='del'>-        char  *postopstr = NULL;</div><div class='add'>+    trace_conf_t *conf = NULL;</div><div class='ctx'> </div><div class='del'>-        if (trace_fop_names[GF_FOP_TRUNCATE].enabled) {</div><div class='del'>-                if (op_ret &gt;= 0) {</div><div class='del'>-                        preopstr = trace_stat_to_str (prebuf);</div><div class='del'>-                        postopstr = trace_stat_to_str (postbuf);</div><div class='add'>+    conf = this-&gt;private;</div><div class='ctx'> </div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_NORMAL,</div><div class='del'>-                                "%"PRId64": (op_ret=%d, *prebuf = {%s}, "</div><div class='del'>-                                "*postbuf = {%s} )",</div><div class='del'>-                                frame-&gt;root-&gt;unique, op_ret, preopstr,</div><div class='del'>-                                postopstr);</div><div class='add'>+    if (!conf-&gt;log_file &amp;&amp; !conf-&gt;log_history)</div><div class='add'>+        goto out;</div><div class='add'>+    if (trace_fop_names[GF_FOP_MKNOD].enabled) {</div><div class='add'>+        char string[4096] = {</div><div class='add'>+            0,</div><div class='add'>+        };</div><div class='add'>+        snprintf(string, sizeof(string),</div><div class='add'>+                 "%" PRId64</div><div class='add'>+                 ": gfid=%s path=%s mode=%d "</div><div class='add'>+                 "umask=0%o, dev=%" GF_PRI_DEV ")",</div><div class='add'>+                 frame-&gt;root-&gt;unique, uuid_utoa(loc-&gt;inode-&gt;gfid), loc-&gt;path,</div><div class='add'>+                 mode, umask, dev);</div><div class='ctx'> </div><div class='del'>-                        if (preopstr)</div><div class='del'>-                                GF_FREE (preopstr);</div><div class='add'>+        LOG_ELEMENT(conf, string);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-                        if (postopstr)</div><div class='del'>-                                GF_FREE (postopstr);</div><div class='del'>-                } else {</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_NORMAL,</div><div class='del'>-                                "%"PRId64": (op_ret=%d, op_errno=%d)",</div><div class='del'>-                                frame-&gt;root-&gt;unique, op_ret, op_errno);</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='add'>+out:</div><div class='add'>+    STACK_WIND(frame, trace_mknod_cbk, FIRST_CHILD(this),</div><div class='add'>+               FIRST_CHILD(this)-&gt;fops-&gt;mknod, loc, mode, dev, umask, xdata);</div><div class='ctx'> </div><div class='del'>-        STACK_UNWIND_STRICT (truncate, frame, op_ret, op_errno, prebuf, postbuf);</div><div class='del'>-        return 0;</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-trace_statfs_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-                  int32_t op_ret, int32_t op_errno, struct statvfs *buf)</div><div class='add'>+trace_mkdir(call_frame_t *frame, xlator_t *this, loc_t *loc, mode_t mode,</div><div class='add'>+            mode_t umask, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-        if (trace_fop_names[GF_FOP_STATFS].enabled) {</div><div class='del'>-                if (op_ret &gt;= 0) {</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_NORMAL,</div><div class='del'>-                                "%"PRId64": ({f_bsize=%lu, f_frsize=%lu, f_blocks=%"GF_PRI_FSBLK</div><div class='del'>-                                ", f_bfree=%"GF_PRI_FSBLK", f_bavail=%"GF_PRI_FSBLK", "</div><div class='del'>-                                "f_files=%"GF_PRI_FSBLK", f_ffree=%"GF_PRI_FSBLK", f_favail=%"</div><div class='del'>-                                GF_PRI_FSBLK", f_fsid=%lu, f_flag=%lu, f_namemax=%lu}) =&gt; ret=%d",</div><div class='del'>-                                frame-&gt;root-&gt;unique, buf-&gt;f_bsize, buf-&gt;f_frsize, buf-&gt;f_blocks,</div><div class='del'>-                                buf-&gt;f_bfree, buf-&gt;f_bavail, buf-&gt;f_files, buf-&gt;f_ffree,</div><div class='del'>-                                buf-&gt;f_favail, buf-&gt;f_fsid, buf-&gt;f_flag, buf-&gt;f_namemax, op_ret);</div><div class='del'>-                } else {</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_NORMAL,</div><div class='del'>-                                "%"PRId64": (op_ret=%d, op_errno=%d)",</div><div class='del'>-                                frame-&gt;root-&gt;unique, op_ret, op_errno);</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='add'>+    trace_conf_t *conf = NULL;</div><div class='ctx'> </div><div class='del'>-        STACK_UNWIND_STRICT (statfs, frame, op_ret, op_errno, buf);</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='add'>+    conf = this-&gt;private;</div><div class='ctx'> </div><div class='add'>+    if (!conf-&gt;log_file &amp;&amp; !conf-&gt;log_history)</div><div class='add'>+        goto out;</div><div class='add'>+    if (trace_fop_names[GF_FOP_MKDIR].enabled) {</div><div class='add'>+        char string[4096] = {</div><div class='add'>+            0,</div><div class='add'>+        };</div><div class='add'>+        snprintf(string, sizeof(string),</div><div class='add'>+                 "%" PRId64</div><div class='add'>+                 ": gfid=%s path=%s mode=%d"</div><div class='add'>+                 " umask=0%o",</div><div class='add'>+                 frame-&gt;root-&gt;unique, uuid_utoa(loc-&gt;inode-&gt;gfid), loc-&gt;path,</div><div class='add'>+                 mode, umask);</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-trace_setxattr_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-                    int32_t op_ret, int32_t op_errno)</div><div class='del'>-{</div><div class='del'>-        if (trace_fop_names[GF_FOP_SETXATTR].enabled) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_NORMAL,</div><div class='del'>-                        "%"PRId64": (op_ret=%d, op_errno=%d)",</div><div class='del'>-                        frame-&gt;root-&gt;unique, op_ret, op_errno);</div><div class='del'>-        }</div><div class='add'>+        LOG_ELEMENT(conf, string);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        STACK_UNWIND_STRICT (setxattr, frame, op_ret, op_errno);</div><div class='del'>-        return 0;</div><div class='add'>+out:</div><div class='add'>+    STACK_WIND(frame, trace_mkdir_cbk, FIRST_CHILD(this),</div><div class='add'>+               FIRST_CHILD(this)-&gt;fops-&gt;mkdir, loc, mode, umask, xdata);</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-trace_getxattr_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-                    int32_t op_ret, int32_t op_errno, dict_t *dict)</div><div class='add'>+trace_unlink(call_frame_t *frame, xlator_t *this, loc_t *loc, int xflag,</div><div class='add'>+             dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-        if (trace_fop_names[GF_FOP_GETXATTR].enabled) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_NORMAL,</div><div class='del'>-                        "%"PRId64": (op_ret=%d, op_errno=%d, dict=%p)",</div><div class='del'>-                        frame-&gt;root-&gt;unique, op_ret, op_errno, dict);</div><div class='del'>-        }</div><div class='add'>+    trace_conf_t *conf = NULL;</div><div class='ctx'> </div><div class='del'>-        STACK_UNWIND_STRICT (getxattr, frame, op_ret, op_errno, dict);</div><div class='add'>+    conf = this-&gt;private;</div><div class='ctx'> </div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='add'>+    if (!conf-&gt;log_file &amp;&amp; !conf-&gt;log_history)</div><div class='add'>+        goto out;</div><div class='add'>+    if (trace_fop_names[GF_FOP_UNLINK].enabled) {</div><div class='add'>+        char string[4096] = {</div><div class='add'>+            0,</div><div class='add'>+        };</div><div class='add'>+        snprintf(string, sizeof(string), "%" PRId64 ": gfid=%s path=%s flag=%d",</div><div class='add'>+                 frame-&gt;root-&gt;unique, uuid_utoa(loc-&gt;inode-&gt;gfid), loc-&gt;path,</div><div class='add'>+                 xflag);</div><div class='add'>+</div><div class='add'>+        frame-&gt;local = loc-&gt;inode-&gt;gfid;</div><div class='ctx'> </div><div class='add'>+        LOG_ELEMENT(conf, string);</div><div class='add'>+    }</div><div class='add'>+out:</div><div class='add'>+    STACK_WIND(frame, trace_unlink_cbk, FIRST_CHILD(this),</div><div class='add'>+               FIRST_CHILD(this)-&gt;fops-&gt;unlink, loc, xflag, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-trace_removexattr_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-                       int32_t op_ret, int32_t op_errno)</div><div class='add'>+trace_rmdir(call_frame_t *frame, xlator_t *this, loc_t *loc, int flags,</div><div class='add'>+            dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-        if (trace_fop_names[GF_FOP_REMOVEXATTR].enabled) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_NORMAL,</div><div class='del'>-                        "%"PRId64": (op_ret=%d, op_errno=%d)",</div><div class='del'>-                        frame-&gt;root-&gt;unique, op_ret, op_errno);</div><div class='del'>-        }</div><div class='add'>+    trace_conf_t *conf = NULL;</div><div class='ctx'> </div><div class='del'>-        STACK_UNWIND_STRICT (removexattr, frame, op_ret, op_errno);</div><div class='add'>+    conf = this-&gt;private;</div><div class='ctx'> </div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='add'>+    if (!conf-&gt;log_file &amp;&amp; !conf-&gt;log_history)</div><div class='add'>+        goto out;</div><div class='add'>+    if (trace_fop_names[GF_FOP_RMDIR].enabled) {</div><div class='add'>+        char string[4096] = {</div><div class='add'>+            0,</div><div class='add'>+        };</div><div class='add'>+        snprintf(string, sizeof(string),</div><div class='add'>+                 "%" PRId64 ": gfid=%s path=%s flags=%d", frame-&gt;root-&gt;unique,</div><div class='add'>+                 uuid_utoa(loc-&gt;inode-&gt;gfid), loc-&gt;path, flags);</div><div class='ctx'> </div><div class='add'>+        frame-&gt;local = loc-&gt;inode-&gt;gfid;</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-trace_fsyncdir_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-                    int32_t op_ret, int32_t op_errno)</div><div class='del'>-{</div><div class='del'>-        if (trace_fop_names[GF_FOP_FSYNCDIR].enabled) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_NORMAL,</div><div class='del'>-                        "%"PRId64": (op_ret=%d, op_errno=%d)",</div><div class='del'>-                        frame-&gt;root-&gt;unique, op_ret, op_errno);</div><div class='del'>-        }</div><div class='add'>+        LOG_ELEMENT(conf, string);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        STACK_UNWIND_STRICT (fsyncdir, frame, op_ret, op_errno);</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='add'>+out:</div><div class='add'>+    STACK_WIND(frame, trace_rmdir_cbk, FIRST_CHILD(this),</div><div class='add'>+               FIRST_CHILD(this)-&gt;fops-&gt;rmdir, loc, flags, xdata);</div><div class='ctx'> </div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-trace_access_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-                  int32_t op_ret, int32_t op_errno)</div><div class='add'>+trace_symlink(call_frame_t *frame, xlator_t *this, const char *linkpath,</div><div class='add'>+              loc_t *loc, mode_t umask, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-        if (trace_fop_names[GF_FOP_ACCESS].enabled) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_NORMAL,</div><div class='del'>-                        "%"PRId64": (op_ret=%d, op_errno=%d)",</div><div class='del'>-                        frame-&gt;root-&gt;unique, op_ret, op_errno);</div><div class='del'>-        }</div><div class='add'>+    trace_conf_t *conf = NULL;</div><div class='ctx'> </div><div class='del'>-        STACK_UNWIND_STRICT (access, frame, op_ret, op_errno);</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='add'>+    conf = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    if (!conf-&gt;log_file &amp;&amp; !conf-&gt;log_history)</div><div class='add'>+        goto out;</div><div class='add'>+    if (trace_fop_names[GF_FOP_SYMLINK].enabled) {</div><div class='add'>+        char string[4096] = {</div><div class='add'>+            0,</div><div class='add'>+        };</div><div class='add'>+        snprintf(string, sizeof(string),</div><div class='add'>+                 "%" PRId64</div><div class='add'>+                 ": gfid=%s linkpath=%s, path=%s"</div><div class='add'>+                 " umask=0%o",</div><div class='add'>+                 frame-&gt;root-&gt;unique, uuid_utoa(loc-&gt;inode-&gt;gfid), linkpath,</div><div class='add'>+                 loc-&gt;path, umask);</div><div class='add'>+</div><div class='add'>+        LOG_ELEMENT(conf, string);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    STACK_WIND(frame, trace_symlink_cbk, FIRST_CHILD(this),</div><div class='add'>+               FIRST_CHILD(this)-&gt;fops-&gt;symlink, linkpath, loc, umask, xdata);</div><div class='ctx'> </div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-trace_ftruncate_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-                     int32_t op_ret, int32_t op_errno,</div><div class='del'>-                     struct iatt *prebuf, struct iatt *postbuf)</div><div class='add'>+trace_rename(call_frame_t *frame, xlator_t *this, loc_t *oldloc, loc_t *newloc,</div><div class='add'>+             dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-        char  *prebufstr = NULL;</div><div class='del'>-        char  *postbufstr = NULL;</div><div class='add'>+    char oldgfid[50] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    char newgfid[50] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    trace_conf_t *conf = NULL;</div><div class='ctx'> </div><div class='del'>-        if (trace_fop_names[GF_FOP_FTRUNCATE].enabled) {</div><div class='del'>-                if (op_ret &gt;= 0) {</div><div class='del'>-                        prebufstr = trace_stat_to_str (prebuf);</div><div class='del'>-                        postbufstr = trace_stat_to_str (postbuf);</div><div class='add'>+    conf = this-&gt;private;</div><div class='ctx'> </div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_NORMAL,</div><div class='del'>-                                "%"PRId64": (op_ret=%d, *prebuf = {%s}, "</div><div class='del'>-                                "*postbuf = {%s} )",</div><div class='del'>-                                frame-&gt;root-&gt;unique, op_ret,</div><div class='del'>-                                prebufstr, postbufstr);</div><div class='add'>+    if (!conf-&gt;log_file &amp;&amp; !conf-&gt;log_history)</div><div class='add'>+        goto out;</div><div class='add'>+    if (trace_fop_names[GF_FOP_RENAME].enabled) {</div><div class='add'>+        char string[4096] = {</div><div class='add'>+            0,</div><div class='add'>+        };</div><div class='add'>+        if (newloc-&gt;inode)</div><div class='add'>+            uuid_utoa_r(newloc-&gt;inode-&gt;gfid, newgfid);</div><div class='add'>+        else</div><div class='add'>+            strcpy(newgfid, "0");</div><div class='ctx'> </div><div class='del'>-                        if (prebufstr)</div><div class='del'>-                                GF_FREE (prebufstr);</div><div class='add'>+        uuid_utoa_r(oldloc-&gt;inode-&gt;gfid, oldgfid);</div><div class='ctx'> </div><div class='del'>-                        if (postbufstr)</div><div class='del'>-                                GF_FREE (postbufstr);</div><div class='add'>+        snprintf(string, sizeof(string),</div><div class='add'>+                 "%" PRId64</div><div class='add'>+                 ": oldgfid=%s oldpath=%s --&gt; "</div><div class='add'>+                 "newgfid=%s newpath=%s",</div><div class='add'>+                 frame-&gt;root-&gt;unique, oldgfid, oldloc-&gt;path, newgfid,</div><div class='add'>+                 newloc-&gt;path);</div><div class='ctx'> </div><div class='del'>-                } else {</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_NORMAL,</div><div class='del'>-                                "%"PRId64": (op_ret=%d, op_errno=%d)",</div><div class='del'>-                                frame-&gt;root-&gt;unique, op_ret, op_errno);</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='add'>+        frame-&gt;local = oldloc-&gt;inode-&gt;gfid;</div><div class='ctx'> </div><div class='del'>-        STACK_UNWIND_STRICT (ftruncate, frame, op_ret, op_errno, prebuf, postbuf);</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-trace_fstat_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-                 int32_t op_ret, int32_t op_errno, struct iatt *buf)</div><div class='del'>-{</div><div class='del'>-        uint64_t ia_time        = 0;</div><div class='del'>-        char     atime_buf[256] = {0, };</div><div class='del'>-        char     mtime_buf[256] = {0, };</div><div class='del'>-        char     ctime_buf[256] = {0, };</div><div class='del'>-</div><div class='del'>-        if (trace_fop_names[GF_FOP_FSTAT].enabled) {</div><div class='del'>-                if (op_ret &gt;= 0) {</div><div class='del'>-                        ia_time = buf-&gt;ia_atime;</div><div class='del'>-                        strftime (atime_buf, 256, "[%b %d %H:%M:%S]",</div><div class='del'>-                                  localtime ((time_t *)&amp;ia_time));</div><div class='del'>-</div><div class='del'>-                        ia_time = buf-&gt;ia_mtime;</div><div class='del'>-                        strftime (mtime_buf, 256, "[%b %d %H:%M:%S]",</div><div class='del'>-                                  localtime ((time_t *)&amp;ia_time));</div><div class='del'>-</div><div class='del'>-                        ia_time = buf-&gt;ia_ctime;</div><div class='del'>-                        strftime (ctime_buf, 256, "[%b %d %H:%M:%S]",</div><div class='del'>-                                  localtime ((time_t *)&amp;ia_time));</div><div class='del'>-</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_NORMAL,</div><div class='del'>-                                "%"PRId64": (op_ret=%d, *buf {ia_gen=%"PRIu64", "</div><div class='del'>-                                "ia_ino=%"PRIu64", st_mode=%o, ia_nlink=%"GF_PRI_NLINK", "</div><div class='del'>-                                "ia_uid=%d, ia_gid=%d, ia_rdev=%"PRIu64", ia_size=%"PRId64", "</div><div class='del'>-                                "ia_blksize=%"GF_PRI_BLKSIZE", ia_blocks=%"PRId64", ia_atime=%s, "</div><div class='del'>-                                "ia_mtime=%s, ia_ctime=%s})",</div><div class='del'>-                                frame-&gt;root-&gt;unique, op_ret, buf-&gt;ia_gen, buf-&gt;ia_ino,</div><div class='del'>-                                st_mode_from_ia (buf-&gt;ia_prot, buf-&gt;ia_type),</div><div class='del'>-                                buf-&gt;ia_nlink, buf-&gt;ia_uid, buf-&gt;ia_gid,</div><div class='del'>-                                buf-&gt;ia_rdev, buf-&gt;ia_size, buf-&gt;ia_blksize,</div><div class='del'>-                                buf-&gt;ia_blocks, atime_buf, mtime_buf, ctime_buf);</div><div class='del'>-                } else {</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_NORMAL,</div><div class='del'>-                                "%"PRId64": (op_ret=%d, op_errno=%d)",</div><div class='del'>-                                frame-&gt;root-&gt;unique, op_ret, op_errno);</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='add'>+        LOG_ELEMENT(conf, string);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        STACK_UNWIND_STRICT (fstat, frame, op_ret, op_errno, buf);</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='add'>+out:</div><div class='add'>+    STACK_WIND(frame, trace_rename_cbk, FIRST_CHILD(this),</div><div class='add'>+               FIRST_CHILD(this)-&gt;fops-&gt;rename, oldloc, newloc, xdata);</div><div class='ctx'> </div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-trace_lk_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-              int32_t op_ret, int32_t op_errno, struct flock *lock)</div><div class='add'>+trace_link(call_frame_t *frame, xlator_t *this, loc_t *oldloc, loc_t *newloc,</div><div class='add'>+           dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-        if (trace_fop_names[GF_FOP_LK].enabled) {</div><div class='del'>-                if (op_ret &gt;= 0) {</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_NORMAL,</div><div class='del'>-                                "%"PRId64": (op_ret=%d, {l_type=%d, l_whence=%d, "</div><div class='del'>-                                "l_start=%"PRId64", l_len=%"PRId64", l_pid=%u})",</div><div class='del'>-                                frame-&gt;root-&gt;unique, op_ret, lock-&gt;l_type, lock-&gt;l_whence,</div><div class='del'>-                                lock-&gt;l_start, lock-&gt;l_len, lock-&gt;l_pid);</div><div class='del'>-                } else {</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_NORMAL,</div><div class='del'>-                                "%"PRId64": (op_ret=%d, op_errno=%d)",</div><div class='del'>-                                frame-&gt;root-&gt;unique, op_ret, op_errno);</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='add'>+    char oldgfid[50] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    char newgfid[50] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    trace_conf_t *conf = NULL;</div><div class='ctx'> </div><div class='del'>-        STACK_UNWIND_STRICT (lk, frame, op_ret, op_errno, lock);</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='add'>+    conf = this-&gt;private;</div><div class='ctx'> </div><div class='add'>+    if (!conf-&gt;log_file &amp;&amp; !conf-&gt;log_history)</div><div class='add'>+        goto out;</div><div class='add'>+    if (trace_fop_names[GF_FOP_LINK].enabled) {</div><div class='add'>+        char string[4096] = {</div><div class='add'>+            0,</div><div class='add'>+        };</div><div class='add'>+        if (newloc-&gt;inode)</div><div class='add'>+            uuid_utoa_r(newloc-&gt;inode-&gt;gfid, newgfid);</div><div class='add'>+        else</div><div class='add'>+            strcpy(newgfid, "0");</div><div class='ctx'> </div><div class='add'>+        uuid_utoa_r(oldloc-&gt;inode-&gt;gfid, oldgfid);</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-trace_entrylk_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-                   int32_t op_ret, int32_t op_errno)</div><div class='del'>-{</div><div class='del'>-        if (trace_fop_names[GF_FOP_ENTRYLK].enabled) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_NORMAL,</div><div class='del'>-                        "%"PRId64": op_ret=%d, op_errno=%d",</div><div class='del'>-                        frame-&gt;root-&gt;unique, op_ret, op_errno);</div><div class='del'>-        }</div><div class='add'>+        snprintf(string, sizeof(string),</div><div class='add'>+                 "%" PRId64</div><div class='add'>+                 ": oldgfid=%s oldpath=%s --&gt; "</div><div class='add'>+                 "newgfid=%s newpath=%s",</div><div class='add'>+                 frame-&gt;root-&gt;unique, oldgfid, oldloc-&gt;path, newgfid,</div><div class='add'>+                 newloc-&gt;path);</div><div class='ctx'> </div><div class='del'>-        STACK_UNWIND_STRICT (entrylk, frame, op_ret, op_errno);</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='add'>+        frame-&gt;local = oldloc-&gt;inode-&gt;gfid;</div><div class='add'>+</div><div class='add'>+        LOG_ELEMENT(conf, string);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='add'>+out:</div><div class='add'>+    STACK_WIND(frame, trace_link_cbk, FIRST_CHILD(this),</div><div class='add'>+               FIRST_CHILD(this)-&gt;fops-&gt;link, oldloc, newloc, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-trace_xattrop_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-                   int32_t op_ret, int32_t op_errno, dict_t *dict)</div><div class='add'>+trace_setattr(call_frame_t *frame, xlator_t *this, loc_t *loc,</div><div class='add'>+              struct iatt *stbuf, int32_t valid, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-        if (trace_fop_names[GF_FOP_XATTROP].enabled) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_NORMAL,</div><div class='del'>-                        "%"PRId64": (op_ret=%d, op_errno=%d)",</div><div class='del'>-                        frame-&gt;root-&gt;unique, op_ret, op_errno);</div><div class='del'>-        }</div><div class='add'>+    char actime_str[GF_TIMESTR_SIZE] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    char modtime_str[GF_TIMESTR_SIZE] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    trace_conf_t *conf = NULL;</div><div class='ctx'> </div><div class='del'>-        STACK_UNWIND_STRICT (xattrop, frame, op_ret, op_errno, dict);</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='add'>+    conf = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    if (!conf-&gt;log_file &amp;&amp; !conf-&gt;log_history)</div><div class='add'>+        goto out;</div><div class='add'>+    if (trace_fop_names[GF_FOP_SETATTR].enabled) {</div><div class='add'>+        char string[4096] = {</div><div class='add'>+            0,</div><div class='add'>+        };</div><div class='add'>+        if (valid &amp; GF_SET_ATTR_MODE) {</div><div class='add'>+            snprintf(</div><div class='add'>+                string, sizeof(string), "%" PRId64 ": gfid=%s path=%s mode=%o)",</div><div class='add'>+                frame-&gt;root-&gt;unique, uuid_utoa(loc-&gt;inode-&gt;gfid), loc-&gt;path,</div><div class='add'>+                st_mode_from_ia(stbuf-&gt;ia_prot, stbuf-&gt;ia_type));</div><div class='ctx'> </div><div class='add'>+            LOG_ELEMENT(conf, string);</div><div class='add'>+            memset(string, 0, sizeof(string));</div><div class='add'>+        }</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-trace_fxattrop_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-                    int32_t op_ret, int32_t op_errno, dict_t *dict)</div><div class='del'>-{</div><div class='del'>-        if (trace_fop_names[GF_FOP_FXATTROP].enabled) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_NORMAL,</div><div class='del'>-                        "%"PRId64": (op_ret=%d, op_errno=%d)",</div><div class='del'>-                        frame-&gt;root-&gt;unique, op_ret, op_errno);</div><div class='add'>+        if (valid &amp; (GF_SET_ATTR_UID | GF_SET_ATTR_GID)) {</div><div class='add'>+            snprintf(string, sizeof(string),</div><div class='add'>+                     "%" PRId64</div><div class='add'>+                     ": gfid=%s path=%s uid=%o,"</div><div class='add'>+                     " gid=%o",</div><div class='add'>+                     frame-&gt;root-&gt;unique, uuid_utoa(loc-&gt;inode-&gt;gfid),</div><div class='add'>+                     loc-&gt;path, stbuf-&gt;ia_uid, stbuf-&gt;ia_gid);</div><div class='add'>+</div><div class='add'>+            LOG_ELEMENT(conf, string);</div><div class='add'>+            memset(string, 0, sizeof(string));</div><div class='ctx'>         }</div><div class='ctx'> </div><div class='del'>-        STACK_UNWIND_STRICT (fxattrop, frame, op_ret, op_errno, dict);</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='add'>+        if (valid &amp; (GF_SET_ATTR_ATIME | GF_SET_ATTR_MTIME)) {</div><div class='add'>+            gf_time_fmt(actime_str, sizeof actime_str, stbuf-&gt;ia_atime,</div><div class='add'>+                        gf_timefmt_bdT);</div><div class='ctx'> </div><div class='add'>+            gf_time_fmt(modtime_str, sizeof modtime_str, stbuf-&gt;ia_mtime,</div><div class='add'>+                        gf_timefmt_bdT);</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-trace_inodelk_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-                   int32_t op_ret, int32_t op_errno)</div><div class='del'>-{</div><div class='del'>-        if (trace_fop_names[GF_FOP_INODELK].enabled) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_NORMAL,</div><div class='del'>-                        "%"PRId64": op_ret=%d, op_errno=%d",</div><div class='del'>-                        frame-&gt;root-&gt;unique, op_ret, op_errno);</div><div class='del'>-        }</div><div class='add'>+            snprintf(string, sizeof(string),</div><div class='add'>+                     "%" PRId64</div><div class='add'>+                     ": gfid=%s path=%s "</div><div class='add'>+                     "ia_atime=%s, ia_mtime=%s",</div><div class='add'>+                     frame-&gt;root-&gt;unique, uuid_utoa(loc-&gt;inode-&gt;gfid),</div><div class='add'>+                     loc-&gt;path, actime_str, modtime_str);</div><div class='add'>+</div><div class='add'>+            LOG_ELEMENT(conf, string);</div><div class='add'>+            memset(string, 0, sizeof(string));</div><div class='add'>+        }</div><div class='add'>+        frame-&gt;local = loc-&gt;inode-&gt;gfid;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    STACK_WIND(frame, trace_setattr_cbk, FIRST_CHILD(this),</div><div class='add'>+               FIRST_CHILD(this)-&gt;fops-&gt;setattr, loc, stbuf, valid, xdata);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        STACK_UNWIND_STRICT (inodelk, frame, op_ret, op_errno);</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='add'>+int</div><div class='add'>+trace_fsetattr(call_frame_t *frame, xlator_t *this, fd_t *fd,</div><div class='add'>+               struct iatt *stbuf, int32_t valid, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    char actime_str[GF_TIMESTR_SIZE] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    char modtime_str[GF_TIMESTR_SIZE] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    trace_conf_t *conf = NULL;</div><div class='add'>+</div><div class='add'>+    conf = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    if (!conf-&gt;log_file &amp;&amp; !conf-&gt;log_history)</div><div class='add'>+        goto out;</div><div class='add'>+    if (trace_fop_names[GF_FOP_FSETATTR].enabled) {</div><div class='add'>+        char string[4096] = {</div><div class='add'>+            0,</div><div class='add'>+        };</div><div class='add'>+        if (valid &amp; GF_SET_ATTR_MODE) {</div><div class='add'>+            snprintf(string, sizeof(string),</div><div class='add'>+                     "%" PRId64 ": gfid=%s fd=%p, mode=%o", frame-&gt;root-&gt;unique,</div><div class='add'>+                     uuid_utoa(fd-&gt;inode-&gt;gfid), fd,</div><div class='add'>+                     st_mode_from_ia(stbuf-&gt;ia_prot, stbuf-&gt;ia_type));</div><div class='add'>+</div><div class='add'>+            LOG_ELEMENT(conf, string);</div><div class='add'>+            memset(string, 0, sizeof(string));</div><div class='add'>+        }</div><div class='ctx'> </div><div class='add'>+        if (valid &amp; (GF_SET_ATTR_UID | GF_SET_ATTR_GID)) {</div><div class='add'>+            snprintf(string, sizeof(string),</div><div class='add'>+                     "%" PRId64</div><div class='add'>+                     ": gfid=%s fd=%p, uid=%o, "</div><div class='add'>+                     "gid=%o",</div><div class='add'>+                     frame-&gt;root-&gt;unique, uuid_utoa(fd-&gt;inode-&gt;gfid), fd,</div><div class='add'>+                     stbuf-&gt;ia_uid, stbuf-&gt;ia_gid);</div><div class='add'>+</div><div class='add'>+            LOG_ELEMENT(conf, string);</div><div class='add'>+            memset(string, 0, sizeof(string));</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        if (valid &amp; (GF_SET_ATTR_ATIME | GF_SET_ATTR_MTIME)) {</div><div class='add'>+            gf_time_fmt(actime_str, sizeof actime_str, stbuf-&gt;ia_atime,</div><div class='add'>+                        gf_timefmt_bdT);</div><div class='add'>+</div><div class='add'>+            gf_time_fmt(modtime_str, sizeof modtime_str, stbuf-&gt;ia_mtime,</div><div class='add'>+                        gf_timefmt_bdT);</div><div class='add'>+</div><div class='add'>+            snprintf(string, sizeof(string),</div><div class='add'>+                     "%" PRId64</div><div class='add'>+                     ": gfid=%s fd=%p "</div><div class='add'>+                     "ia_atime=%s, ia_mtime=%s",</div><div class='add'>+                     frame-&gt;root-&gt;unique, uuid_utoa(fd-&gt;inode-&gt;gfid), fd,</div><div class='add'>+                     actime_str, modtime_str);</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-trace_entrylk (call_frame_t *frame, xlator_t *this,</div><div class='del'>-               const char *volume, loc_t *loc, const char *basename,</div><div class='del'>-               entrylk_cmd cmd, entrylk_type type)</div><div class='del'>-{</div><div class='del'>-        if (trace_fop_names[GF_FOP_ENTRYLK].enabled) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_NORMAL,</div><div class='del'>-                        "%"PRId64": volume=%s, (loc= {path=%s, ino=%"PRIu64"} basename=%s, cmd=%s, type=%s)",</div><div class='del'>-                        frame-&gt;root-&gt;unique, volume, loc-&gt;path, loc-&gt;inode-&gt;ino, basename,</div><div class='del'>-                        ((cmd == ENTRYLK_LOCK) ? "ENTRYLK_LOCK" : "ENTRYLK_UNLOCK"),</div><div class='del'>-                        ((type == ENTRYLK_RDLCK) ? "ENTRYLK_RDLCK" : "ENTRYLK_WRLCK"));</div><div class='add'>+            LOG_ELEMENT(conf, string);</div><div class='add'>+            memset(string, 0, sizeof(string));</div><div class='ctx'>         }</div><div class='add'>+        frame-&gt;local = fd-&gt;inode-&gt;gfid;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        STACK_WIND (frame, trace_entrylk_cbk,</div><div class='del'>-                    FIRST_CHILD (this),</div><div class='del'>-                    FIRST_CHILD (this)-&gt;fops-&gt;entrylk,</div><div class='del'>-                    volume, loc, basename, cmd, type);</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='add'>+out:</div><div class='add'>+    STACK_WIND(frame, trace_fsetattr_cbk, FIRST_CHILD(this),</div><div class='add'>+               FIRST_CHILD(this)-&gt;fops-&gt;fsetattr, fd, stbuf, valid, xdata);</div><div class='ctx'> </div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-trace_inodelk (call_frame_t *frame, xlator_t *this, const char *volume,</div><div class='del'>-               loc_t *loc, int32_t cmd, struct flock *flock)</div><div class='add'>+static int</div><div class='add'>+trace_seek_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+               int32_t op_ret, int32_t op_errno, off_t offset, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-        if (trace_fop_names[GF_FOP_INODELK].enabled) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_NORMAL,</div><div class='del'>-                        "%"PRId64": volume=%s, (loc {path=%s, ino=%"PRIu64"}, cmd=%s)",</div><div class='del'>-                        frame-&gt;root-&gt;unique, volume, loc-&gt;path, loc-&gt;inode-&gt;ino,</div><div class='del'>-                        ((cmd == F_SETLK)? "F_SETLK" : "unknown"));</div><div class='del'>-        }</div><div class='add'>+    trace_conf_t *conf = this-&gt;private;</div><div class='ctx'> </div><div class='del'>-        STACK_WIND (frame, trace_inodelk_cbk,</div><div class='del'>-                    FIRST_CHILD (this),</div><div class='del'>-                    FIRST_CHILD (this)-&gt;fops-&gt;inodelk,</div><div class='del'>-                    volume, loc, cmd, flock);</div><div class='del'>-        return 0;</div><div class='add'>+    if (!conf-&gt;log_file &amp;&amp; !conf-&gt;log_history)</div><div class='add'>+        goto out;</div><div class='add'>+    if (trace_fop_names[GF_FOP_SEEK].enabled) {</div><div class='add'>+        char string[4096] = {</div><div class='add'>+            0,</div><div class='add'>+        };</div><div class='add'>+        snprintf(string, sizeof(string),</div><div class='add'>+                 "%" PRId64</div><div class='add'>+                 ": gfid=%s op_ret=%d op_errno=%d, "</div><div class='add'>+                 "offset=%" PRId64 "",</div><div class='add'>+                 frame-&gt;root-&gt;unique, uuid_utoa(frame-&gt;local), op_ret, op_errno,</div><div class='add'>+                 offset);</div><div class='add'>+        LOG_ELEMENT(conf, string);</div><div class='add'>+    }</div><div class='add'>+out:</div><div class='add'>+    TRACE_STACK_UNWIND(seek, frame, op_ret, op_errno, offset, xdata);</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-trace_finodelk_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-                    int32_t op_ret, int32_t op_errno)</div><div class='add'>+static int</div><div class='add'>+trace_seek(call_frame_t *frame, xlator_t *this, fd_t *fd, off_t offset,</div><div class='add'>+           gf_seek_what_t what, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-        if (trace_fop_names[GF_FOP_FINODELK].enabled) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_NORMAL,</div><div class='del'>-                        "%"PRId64": op_ret=%d, op_errno=%d",</div><div class='del'>-                        frame-&gt;root-&gt;unique, op_ret, op_errno);</div><div class='del'>-        }</div><div class='add'>+    trace_conf_t *conf = this-&gt;private;</div><div class='ctx'> </div><div class='del'>-        STACK_UNWIND_STRICT (finodelk, frame, op_ret, op_errno);</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='add'>+    if (!conf-&gt;log_file &amp;&amp; !conf-&gt;log_history)</div><div class='add'>+        goto out;</div><div class='add'>+    if (trace_fop_names[GF_FOP_SEEK].enabled) {</div><div class='add'>+        char string[4096] = {</div><div class='add'>+            0,</div><div class='add'>+        };</div><div class='add'>+        snprintf(string, sizeof(string),</div><div class='add'>+                 "%" PRId64</div><div class='add'>+                 ": gfid=%s fd=%p "</div><div class='add'>+                 "offset=%" PRId64 " what=%d",</div><div class='add'>+                 frame-&gt;root-&gt;unique, uuid_utoa(fd-&gt;inode-&gt;gfid), fd, offset,</div><div class='add'>+                 what);</div><div class='ctx'> </div><div class='add'>+        frame-&gt;local = fd-&gt;inode-&gt;gfid;</div><div class='add'>+        LOG_ELEMENT(conf, string);</div><div class='add'>+    }</div><div class='add'>+out:</div><div class='add'>+    STACK_WIND(frame, trace_seek_cbk, FIRST_CHILD(this),</div><div class='add'>+               FIRST_CHILD(this)-&gt;fops-&gt;seek, fd, offset, what, xdata);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-trace_finodelk (call_frame_t *frame, xlator_t *this, const char *volume,</div><div class='del'>-                fd_t *fd, int32_t cmd, struct flock *flock)</div><div class='add'>+trace_truncate(call_frame_t *frame, xlator_t *this, loc_t *loc, off_t offset,</div><div class='add'>+               dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-        if (trace_fop_names[GF_FOP_FINODELK].enabled) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_NORMAL,</div><div class='del'>-                        "%"PRId64": volume=%s, (fd=%p, cmd=%s)",</div><div class='del'>-                        frame-&gt;root-&gt;unique, volume, fd,</div><div class='del'>-                        ((cmd == F_SETLK) ? "F_SETLK" : "unknown"));</div><div class='del'>-        }</div><div class='add'>+    trace_conf_t *conf = NULL;</div><div class='ctx'> </div><div class='del'>-        STACK_WIND (frame, trace_finodelk_cbk,</div><div class='del'>-                    FIRST_CHILD (this),</div><div class='del'>-                    FIRST_CHILD (this)-&gt;fops-&gt;finodelk,</div><div class='del'>-                    volume, fd, cmd, flock);</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='add'>+    conf = this-&gt;private;</div><div class='ctx'> </div><div class='add'>+    if (!conf-&gt;log_file &amp;&amp; !conf-&gt;log_history)</div><div class='add'>+        goto out;</div><div class='add'>+    if (trace_fop_names[GF_FOP_TRUNCATE].enabled) {</div><div class='add'>+        char string[4096] = {</div><div class='add'>+            0,</div><div class='add'>+        };</div><div class='add'>+        snprintf(string, sizeof(string),</div><div class='add'>+                 "%" PRId64</div><div class='add'>+                 ": gfid=%s path=%s, "</div><div class='add'>+                 "offset=%" PRId64 "",</div><div class='add'>+                 frame-&gt;root-&gt;unique, uuid_utoa(loc-&gt;inode-&gt;gfid), loc-&gt;path,</div><div class='add'>+                 offset);</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-trace_xattrop (call_frame_t *frame, xlator_t *this, loc_t *loc,</div><div class='del'>-               gf_xattrop_flags_t flags, dict_t *dict)</div><div class='del'>-{</div><div class='del'>-        if (trace_fop_names[GF_FOP_XATTROP].enabled) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_NORMAL,</div><div class='del'>-                        "%"PRId64": (path=%s, ino=%"PRIu64" flags=%d)",</div><div class='del'>-                        frame-&gt;root-&gt;unique, loc-&gt;path, loc-&gt;inode-&gt;ino, flags);</div><div class='add'>+        frame-&gt;local = loc-&gt;inode-&gt;gfid;</div><div class='ctx'> </div><div class='del'>-        }</div><div class='add'>+        LOG_ELEMENT(conf, string);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        STACK_WIND (frame, trace_xattrop_cbk,</div><div class='del'>-                    FIRST_CHILD(this),</div><div class='del'>-                    FIRST_CHILD(this)-&gt;fops-&gt;xattrop,</div><div class='del'>-                    loc, flags, dict);</div><div class='add'>+out:</div><div class='add'>+    STACK_WIND(frame, trace_truncate_cbk, FIRST_CHILD(this),</div><div class='add'>+               FIRST_CHILD(this)-&gt;fops-&gt;truncate, loc, offset, xdata);</div><div class='ctx'> </div><div class='del'>-        return 0;</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-trace_fxattrop (call_frame_t *frame, xlator_t *this, fd_t *fd,</div><div class='del'>-                gf_xattrop_flags_t flags, dict_t *dict)</div><div class='add'>+trace_open(call_frame_t *frame, xlator_t *this, loc_t *loc, int32_t flags,</div><div class='add'>+           fd_t *fd, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-        if (trace_fop_names[GF_FOP_FXATTROP].enabled) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_NORMAL,</div><div class='del'>-                        "%"PRId64": (fd=%p, flags=%d)",</div><div class='del'>-                        frame-&gt;root-&gt;unique, fd, flags);</div><div class='add'>+    trace_conf_t *conf = NULL;</div><div class='ctx'> </div><div class='del'>-        }</div><div class='add'>+    conf = this-&gt;private;</div><div class='ctx'> </div><div class='del'>-        STACK_WIND (frame, trace_fxattrop_cbk,</div><div class='del'>-                    FIRST_CHILD(this),</div><div class='del'>-                    FIRST_CHILD(this)-&gt;fops-&gt;fxattrop,</div><div class='del'>-                    fd, flags, dict);</div><div class='add'>+    if (!conf-&gt;log_file &amp;&amp; !conf-&gt;log_history)</div><div class='add'>+        goto out;</div><div class='add'>+    if (trace_fop_names[GF_FOP_OPEN].enabled) {</div><div class='add'>+        char string[4096] = {</div><div class='add'>+            0,</div><div class='add'>+        };</div><div class='add'>+        snprintf(string, sizeof(string),</div><div class='add'>+                 "%" PRId64 ": gfid=%s path=%s flags=%d fd=%p",</div><div class='add'>+                 frame-&gt;root-&gt;unique, uuid_utoa(loc-&gt;inode-&gt;gfid), loc-&gt;path,</div><div class='add'>+                 flags, fd);</div><div class='ctx'> </div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='add'>+        frame-&gt;local = loc-&gt;inode-&gt;gfid;</div><div class='ctx'> </div><div class='add'>+        LOG_ELEMENT(conf, string);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    STACK_WIND(frame, trace_open_cbk, FIRST_CHILD(this),</div><div class='add'>+               FIRST_CHILD(this)-&gt;fops-&gt;open, loc, flags, fd, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-trace_lookup (call_frame_t *frame, xlator_t *this,</div><div class='del'>-              loc_t *loc, dict_t *xattr_req)</div><div class='add'>+trace_create(call_frame_t *frame, xlator_t *this, loc_t *loc, int32_t flags,</div><div class='add'>+             mode_t mode, mode_t umask, fd_t *fd, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-        if (trace_fop_names[GF_FOP_LOOKUP].enabled) {</div><div class='del'>-                /* TODO: print all the keys mentioned in xattr_req */</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_NORMAL,</div><div class='del'>-                        "%"PRId64": (loc {path=%s, ino=%"PRIu64"})",</div><div class='del'>-                        frame-&gt;root-&gt;unique, loc-&gt;path,</div><div class='del'>-                        loc-&gt;inode-&gt;ino);</div><div class='del'>-        }</div><div class='add'>+    trace_conf_t *conf = NULL;</div><div class='ctx'> </div><div class='del'>-        STACK_WIND (frame, trace_lookup_cbk,</div><div class='del'>-                    FIRST_CHILD(this),</div><div class='del'>-                    FIRST_CHILD(this)-&gt;fops-&gt;lookup,</div><div class='del'>-                    loc, xattr_req);</div><div class='add'>+    conf = this-&gt;private;</div><div class='ctx'> </div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='add'>+    if (!conf-&gt;log_file &amp;&amp; !conf-&gt;log_history)</div><div class='add'>+        goto out;</div><div class='add'>+    if (trace_fop_names[GF_FOP_CREATE].enabled) {</div><div class='add'>+        char string[4096] = {</div><div class='add'>+            0,</div><div class='add'>+        };</div><div class='add'>+        snprintf(string, sizeof(string),</div><div class='add'>+                 "%" PRId64</div><div class='add'>+                 ": gfid=%s path=%s, fd=%p, "</div><div class='add'>+                 "flags=0%o mode=0%o umask=0%o",</div><div class='add'>+                 frame-&gt;root-&gt;unique, uuid_utoa(loc-&gt;inode-&gt;gfid), loc-&gt;path,</div><div class='add'>+                 fd, flags, mode, umask);</div><div class='ctx'> </div><div class='add'>+        LOG_ELEMENT(conf, string);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    STACK_WIND(frame, trace_create_cbk, FIRST_CHILD(this),</div><div class='add'>+               FIRST_CHILD(this)-&gt;fops-&gt;create, loc, flags, mode, umask, fd,</div><div class='add'>+               xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-trace_stat (call_frame_t *frame, xlator_t *this, loc_t *loc)</div><div class='add'>+trace_readv(call_frame_t *frame, xlator_t *this, fd_t *fd, size_t size,</div><div class='add'>+            off_t offset, uint32_t flags, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-        if (trace_fop_names[GF_FOP_STAT].enabled) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_NORMAL,</div><div class='del'>-                        "%"PRId64": (loc {path=%s, ino=%"PRIu64"})",</div><div class='del'>-                        frame-&gt;root-&gt;unique, loc-&gt;path, loc-&gt;inode-&gt;ino);</div><div class='del'>-        }</div><div class='add'>+    trace_conf_t *conf = NULL;</div><div class='ctx'> </div><div class='del'>-        STACK_WIND (frame, trace_stat_cbk,</div><div class='del'>-                    FIRST_CHILD(this),</div><div class='del'>-                    FIRST_CHILD(this)-&gt;fops-&gt;stat,</div><div class='del'>-                    loc);</div><div class='add'>+    conf = this-&gt;private;</div><div class='ctx'> </div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='add'>+    if (!conf-&gt;log_file &amp;&amp; !conf-&gt;log_history)</div><div class='add'>+        goto out;</div><div class='add'>+    if (trace_fop_names[GF_FOP_READ].enabled) {</div><div class='add'>+        char string[4096] = {</div><div class='add'>+            0,</div><div class='add'>+        };</div><div class='add'>+        snprintf(string, sizeof(string),</div><div class='add'>+                 "%" PRId64 ": gfid=%s fd=%p, size=%" GF_PRI_SIZET</div><div class='add'>+                 "offset=%" PRId64 " flags=0%x)",</div><div class='add'>+                 frame-&gt;root-&gt;unique, uuid_utoa(fd-&gt;inode-&gt;gfid), fd, size,</div><div class='add'>+                 offset, flags);</div><div class='add'>+</div><div class='add'>+        frame-&gt;local = fd-&gt;inode-&gt;gfid;</div><div class='ctx'> </div><div class='add'>+        LOG_ELEMENT(conf, string);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    STACK_WIND(frame, trace_readv_cbk, FIRST_CHILD(this),</div><div class='add'>+               FIRST_CHILD(this)-&gt;fops-&gt;readv, fd, size, offset, flags, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-trace_readlink (call_frame_t *frame, xlator_t *this, loc_t *loc, size_t size)</div><div class='add'>+trace_writev(call_frame_t *frame, xlator_t *this, fd_t *fd,</div><div class='add'>+             struct iovec *vector, int32_t count, off_t offset, uint32_t flags,</div><div class='add'>+             struct iobref *iobref, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-        if (trace_fop_names[GF_FOP_READLINK].enabled) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_NORMAL,</div><div class='del'>-                        "%"PRId64": (loc {path=%s, ino=%"PRIu64"}, size=%"GF_PRI_SIZET")",</div><div class='del'>-                        frame-&gt;root-&gt;unique, loc-&gt;path, loc-&gt;inode-&gt;ino, size);</div><div class='del'>-        }</div><div class='add'>+    trace_conf_t *conf = NULL;</div><div class='add'>+    int i = 0;</div><div class='add'>+    size_t total_size = 0;</div><div class='ctx'> </div><div class='del'>-        STACK_WIND (frame, trace_readlink_cbk,</div><div class='del'>-                    FIRST_CHILD(this),</div><div class='del'>-                    FIRST_CHILD(this)-&gt;fops-&gt;readlink,</div><div class='del'>-                    loc, size);</div><div class='add'>+    conf = this-&gt;private;</div><div class='ctx'> </div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='add'>+    if (!conf-&gt;log_file &amp;&amp; !conf-&gt;log_history)</div><div class='add'>+        goto out;</div><div class='add'>+    if (trace_fop_names[GF_FOP_WRITE].enabled) {</div><div class='add'>+        char string[4096] = {</div><div class='add'>+            0,</div><div class='add'>+        };</div><div class='add'>+        for (i = 0; i &lt; count; i++)</div><div class='add'>+            total_size += vector[i].iov_len;</div><div class='ctx'> </div><div class='add'>+        snprintf(string, sizeof(string),</div><div class='add'>+                 "%" PRId64</div><div class='add'>+                 ": gfid=%s fd=%p, count=%d, "</div><div class='add'>+                 " offset=%" PRId64 " flags=0%x write_size=%zu",</div><div class='add'>+                 frame-&gt;root-&gt;unique, uuid_utoa(fd-&gt;inode-&gt;gfid), fd, count,</div><div class='add'>+                 offset, flags, total_size);</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-trace_mknod (call_frame_t *frame, xlator_t *this, loc_t *loc,</div><div class='del'>-             mode_t mode, dev_t dev, dict_t *params)</div><div class='del'>-{</div><div class='del'>-        if (trace_fop_names[GF_FOP_MKNOD].enabled) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_NORMAL,</div><div class='del'>-                        "%"PRId64": (loc {path=%s, ino=%"PRIu64"}, mode=%d, dev=%"GF_PRI_DEV")",</div><div class='del'>-                        frame-&gt;root-&gt;unique, loc-&gt;path, loc-&gt;inode-&gt;ino, mode, dev);</div><div class='del'>-        }</div><div class='add'>+        frame-&gt;local = fd-&gt;inode-&gt;gfid;</div><div class='ctx'> </div><div class='del'>-        STACK_WIND (frame, trace_mknod_cbk,</div><div class='del'>-                    FIRST_CHILD(this),</div><div class='del'>-                    FIRST_CHILD(this)-&gt;fops-&gt;mknod,</div><div class='del'>-                    loc, mode, dev, params);</div><div class='add'>+        LOG_ELEMENT(conf, string);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        return 0;</div><div class='add'>+out:</div><div class='add'>+    STACK_WIND(frame, trace_writev_cbk, FIRST_CHILD(this),</div><div class='add'>+               FIRST_CHILD(this)-&gt;fops-&gt;writev, fd, vector, count, offset,</div><div class='add'>+               flags, iobref, xdata);</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-trace_mkdir (call_frame_t *frame, xlator_t *this, loc_t *loc, mode_t mode,</div><div class='del'>-             dict_t *params)</div><div class='add'>+trace_statfs(call_frame_t *frame, xlator_t *this, loc_t *loc, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-        if (trace_fop_names[GF_FOP_MKDIR].enabled) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_NORMAL,</div><div class='del'>-                        "%"PRId64": (path=%s, ino=%"PRIu64", mode=%d)",</div><div class='del'>-                        frame-&gt;root-&gt;unique, loc-&gt;path,</div><div class='del'>-                        ((loc-&gt;inode)? loc-&gt;inode-&gt;ino : 0), mode);</div><div class='del'>-        }</div><div class='add'>+    trace_conf_t *conf = NULL;</div><div class='ctx'> </div><div class='del'>-        STACK_WIND (frame, trace_mkdir_cbk,</div><div class='del'>-                    FIRST_CHILD(this),</div><div class='del'>-                    FIRST_CHILD(this)-&gt;fops-&gt;mkdir,</div><div class='del'>-                    loc, mode, params);</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='add'>+    conf = this-&gt;private;</div><div class='ctx'> </div><div class='add'>+    if (!conf-&gt;log_file &amp;&amp; !conf-&gt;log_history)</div><div class='add'>+        goto out;</div><div class='add'>+    if (trace_fop_names[GF_FOP_STATFS].enabled) {</div><div class='add'>+        char string[4096] = {</div><div class='add'>+            0,</div><div class='add'>+        };</div><div class='add'>+        snprintf(string, sizeof(string), "%" PRId64 ": gfid=%s path=%s",</div><div class='add'>+                 frame-&gt;root-&gt;unique,</div><div class='add'>+                 (loc-&gt;inode) ? uuid_utoa(loc-&gt;inode-&gt;gfid) : "0", loc-&gt;path);</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-trace_unlink (call_frame_t *frame, xlator_t *this, loc_t *loc)</div><div class='del'>-{</div><div class='del'>-        if (trace_fop_names[GF_FOP_UNLINK].enabled) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_NORMAL,</div><div class='del'>-                        "%"PRId64": (loc {path=%s, ino=%"PRIu64"})",</div><div class='del'>-                        frame-&gt;root-&gt;unique, loc-&gt;path, loc-&gt;inode-&gt;ino);</div><div class='del'>-        }</div><div class='add'>+        LOG_ELEMENT(conf, string);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        STACK_WIND (frame, trace_unlink_cbk,</div><div class='del'>-                    FIRST_CHILD(this),</div><div class='del'>-                    FIRST_CHILD(this)-&gt;fops-&gt;unlink,</div><div class='del'>-                    loc);</div><div class='del'>-        return 0;</div><div class='add'>+out:</div><div class='add'>+    STACK_WIND(frame, trace_statfs_cbk, FIRST_CHILD(this),</div><div class='add'>+               FIRST_CHILD(this)-&gt;fops-&gt;statfs, loc, xdata);</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-trace_rmdir (call_frame_t *frame, xlator_t *this, loc_t *loc)</div><div class='add'>+trace_flush(call_frame_t *frame, xlator_t *this, fd_t *fd, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-        if (trace_fop_names[GF_FOP_RMDIR].enabled) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_NORMAL,</div><div class='del'>-                        "%"PRId64": (loc {path=%s, ino=%"PRIu64"})",</div><div class='del'>-                        frame-&gt;root-&gt;unique, loc-&gt;path, loc-&gt;inode-&gt;ino);</div><div class='del'>-        }</div><div class='add'>+    trace_conf_t *conf = NULL;</div><div class='ctx'> </div><div class='del'>-        STACK_WIND (frame, trace_rmdir_cbk,</div><div class='del'>-                    FIRST_CHILD(this),</div><div class='del'>-                    FIRST_CHILD(this)-&gt;fops-&gt;rmdir,</div><div class='del'>-                    loc);</div><div class='add'>+    conf = this-&gt;private;</div><div class='ctx'> </div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='add'>+    if (!conf-&gt;log_file &amp;&amp; !conf-&gt;log_history)</div><div class='add'>+        goto out;</div><div class='add'>+    if (trace_fop_names[GF_FOP_FLUSH].enabled) {</div><div class='add'>+        char string[4096] = {</div><div class='add'>+            0,</div><div class='add'>+        };</div><div class='add'>+        snprintf(string, sizeof(string), "%" PRId64 ": gfid=%s fd=%p",</div><div class='add'>+                 frame-&gt;root-&gt;unique, uuid_utoa(fd-&gt;inode-&gt;gfid), fd);</div><div class='add'>+</div><div class='add'>+        frame-&gt;local = fd-&gt;inode-&gt;gfid;</div><div class='ctx'> </div><div class='add'>+        LOG_ELEMENT(conf, string);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    STACK_WIND(frame, trace_flush_cbk, FIRST_CHILD(this),</div><div class='add'>+               FIRST_CHILD(this)-&gt;fops-&gt;flush, fd, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-trace_symlink (call_frame_t *frame, xlator_t *this, const char *linkpath,</div><div class='del'>-               loc_t *loc, dict_t *params)</div><div class='add'>+trace_fsync(call_frame_t *frame, xlator_t *this, fd_t *fd, int32_t flags,</div><div class='add'>+            dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-        if (trace_fop_names[GF_FOP_SYMLINK].enabled) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_NORMAL,</div><div class='del'>-                        "%"PRId64": (linkpath=%s, loc {path=%s, ino=%"PRIu64"})",</div><div class='del'>-                        frame-&gt;root-&gt;unique, linkpath, loc-&gt;path,</div><div class='del'>-                        ((loc-&gt;inode)? loc-&gt;inode-&gt;ino : 0));</div><div class='del'>-        }</div><div class='add'>+    trace_conf_t *conf = NULL;</div><div class='ctx'> </div><div class='del'>-        STACK_WIND (frame, trace_symlink_cbk,</div><div class='del'>-                    FIRST_CHILD(this),</div><div class='del'>-                    FIRST_CHILD(this)-&gt;fops-&gt;symlink,</div><div class='del'>-                    linkpath, loc, params);</div><div class='add'>+    conf = this-&gt;private;</div><div class='ctx'> </div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='add'>+    if (!conf-&gt;log_file &amp;&amp; !conf-&gt;log_history)</div><div class='add'>+        goto out;</div><div class='add'>+    if (trace_fop_names[GF_FOP_FSYNC].enabled) {</div><div class='add'>+        char string[4096] = {</div><div class='add'>+            0,</div><div class='add'>+        };</div><div class='add'>+        snprintf(string, sizeof(string), "%" PRId64 ": gfid=%s flags=%d fd=%p",</div><div class='add'>+                 frame-&gt;root-&gt;unique, uuid_utoa(fd-&gt;inode-&gt;gfid), flags, fd);</div><div class='ctx'> </div><div class='add'>+        frame-&gt;local = fd-&gt;inode-&gt;gfid;</div><div class='add'>+</div><div class='add'>+        LOG_ELEMENT(conf, string);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    STACK_WIND(frame, trace_fsync_cbk, FIRST_CHILD(this),</div><div class='add'>+               FIRST_CHILD(this)-&gt;fops-&gt;fsync, fd, flags, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-trace_rename (call_frame_t *frame, xlator_t *this, loc_t *oldloc, loc_t *newloc)</div><div class='add'>+trace_setxattr(call_frame_t *frame, xlator_t *this, loc_t *loc, dict_t *dict,</div><div class='add'>+               int32_t flags, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-        if (trace_fop_names[GF_FOP_RENAME].enabled) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_NORMAL,</div><div class='del'>-                        "%"PRId64": (oldloc {path=%s, ino=%"PRIu64"}, "</div><div class='del'>-                        "newloc{path=%s, ino=%"PRIu64"})",</div><div class='del'>-                        frame-&gt;root-&gt;unique, oldloc-&gt;path, oldloc-&gt;ino,</div><div class='del'>-                        newloc-&gt;path, newloc-&gt;ino);</div><div class='del'>-        }</div><div class='add'>+    trace_conf_t *conf = NULL;</div><div class='ctx'> </div><div class='del'>-        STACK_WIND (frame, trace_rename_cbk,</div><div class='del'>-                    FIRST_CHILD(this),</div><div class='del'>-                    FIRST_CHILD(this)-&gt;fops-&gt;rename,</div><div class='del'>-                    oldloc, newloc);</div><div class='add'>+    conf = this-&gt;private;</div><div class='ctx'> </div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='add'>+    if (!conf-&gt;log_file &amp;&amp; !conf-&gt;log_history)</div><div class='add'>+        goto out;</div><div class='add'>+    if (trace_fop_names[GF_FOP_SETXATTR].enabled) {</div><div class='add'>+        char string[4096] = {</div><div class='add'>+            0,</div><div class='add'>+        };</div><div class='add'>+        snprintf(string, sizeof(string),</div><div class='add'>+                 "%" PRId64 ": gfid=%s path=%s flags=%d", frame-&gt;root-&gt;unique,</div><div class='add'>+                 uuid_utoa(loc-&gt;inode-&gt;gfid), loc-&gt;path, flags);</div><div class='add'>+</div><div class='add'>+        frame-&gt;local = loc-&gt;inode-&gt;gfid;</div><div class='add'>+</div><div class='add'>+        LOG_ELEMENT(conf, string);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='add'>+out:</div><div class='add'>+    STACK_WIND(frame, trace_setxattr_cbk, FIRST_CHILD(this),</div><div class='add'>+               FIRST_CHILD(this)-&gt;fops-&gt;setxattr, loc, dict, flags, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-trace_link (call_frame_t *frame, xlator_t *this, loc_t *oldloc, loc_t *newloc)</div><div class='add'>+trace_getxattr(call_frame_t *frame, xlator_t *this, loc_t *loc,</div><div class='add'>+               const char *name, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-        if (trace_fop_names[GF_FOP_LINK].enabled) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_NORMAL,</div><div class='del'>-                        "%"PRId64": (oldloc {path=%s, ino=%"PRIu64"}, "</div><div class='del'>-                        "newloc {path=%s, ino=%"PRIu64"})",</div><div class='del'>-                        frame-&gt;root-&gt;unique, oldloc-&gt;path, oldloc-&gt;inode-&gt;ino,</div><div class='del'>-                        newloc-&gt;path, newloc-&gt;inode-&gt;ino);</div><div class='del'>-        }</div><div class='add'>+    trace_conf_t *conf = NULL;</div><div class='ctx'> </div><div class='del'>-        STACK_WIND (frame, trace_link_cbk,</div><div class='del'>-                    FIRST_CHILD(this),</div><div class='del'>-                    FIRST_CHILD(this)-&gt;fops-&gt;link,</div><div class='del'>-                    oldloc, newloc);</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-trace_setattr (call_frame_t *frame, xlator_t *this, loc_t *loc,</div><div class='del'>-               struct iatt *stbuf, int32_t valid)</div><div class='del'>-{</div><div class='del'>-        uint64_t ia_time          = 0;</div><div class='del'>-        char     actime_str[256]  = {0,};</div><div class='del'>-        char     modtime_str[256] = {0,};</div><div class='del'>-</div><div class='del'>-        if (trace_fop_names[GF_FOP_SETATTR].enabled) {</div><div class='del'>-                if (valid &amp; GF_SET_ATTR_MODE) {</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_NORMAL,</div><div class='del'>-                                "%"PRId64": (loc {path=%s, ino=%"PRIu64"},"</div><div class='del'>-                                " mode=%o)", frame-&gt;root-&gt;unique, loc-&gt;path,</div><div class='del'>-                                loc-&gt;inode-&gt;ino,</div><div class='del'>-                                st_mode_from_ia (stbuf-&gt;ia_prot, stbuf-&gt;ia_type));</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                if (valid &amp; (GF_SET_ATTR_UID | GF_SET_ATTR_GID)) {</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_NORMAL,</div><div class='del'>-                                "%"PRId64": (loc {path=%s, ino=%"PRIu64"},"</div><div class='del'>-                                " uid=%o, gid=%o)",</div><div class='del'>-                                frame-&gt;root-&gt;unique, loc-&gt;path, loc-&gt;inode-&gt;ino,</div><div class='del'>-                                stbuf-&gt;ia_uid, stbuf-&gt;ia_gid);</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                if (valid &amp; (GF_SET_ATTR_ATIME | GF_SET_ATTR_MTIME)) {</div><div class='del'>-                        ia_time = stbuf-&gt;ia_atime;</div><div class='del'>-                        strftime (actime_str, 256, "[%b %d %H:%M:%S]",</div><div class='del'>-                                  localtime ((time_t *)&amp;ia_time));</div><div class='del'>-</div><div class='del'>-                        ia_time = stbuf-&gt;ia_mtime;</div><div class='del'>-                        strftime (modtime_str, 256, "[%b %d %H:%M:%S]",</div><div class='del'>-                                  localtime ((time_t *)&amp;ia_time));</div><div class='del'>-</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_NORMAL,</div><div class='del'>-                                "%"PRId64": (loc {path=%s, ino=%"PRIu64"}, "</div><div class='del'>-                                "*stbuf=%p {ia_atime=%s, ia_mtime=%s})",</div><div class='del'>-                                frame-&gt;root-&gt;unique, loc-&gt;path, loc-&gt;inode-&gt;ino,</div><div class='del'>-                                stbuf, actime_str, modtime_str);</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='add'>+    conf = this-&gt;private;</div><div class='ctx'> </div><div class='del'>-        STACK_WIND (frame, trace_setattr_cbk,</div><div class='del'>-                    FIRST_CHILD(this),</div><div class='del'>-                    FIRST_CHILD(this)-&gt;fops-&gt;setattr,</div><div class='del'>-                    loc, stbuf, valid);</div><div class='add'>+    if (!conf-&gt;log_file &amp;&amp; !conf-&gt;log_history)</div><div class='add'>+        goto out;</div><div class='add'>+    if (trace_fop_names[GF_FOP_GETXATTR].enabled) {</div><div class='add'>+        char string[4096] = {</div><div class='add'>+            0,</div><div class='add'>+        };</div><div class='add'>+        snprintf(string, sizeof(string), "%" PRId64 ": gfid=%s path=%s name=%s",</div><div class='add'>+                 frame-&gt;root-&gt;unique, uuid_utoa(loc-&gt;inode-&gt;gfid), loc-&gt;path,</div><div class='add'>+                 name);</div><div class='ctx'> </div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='add'>+        frame-&gt;local = loc-&gt;inode-&gt;gfid;</div><div class='ctx'> </div><div class='add'>+        LOG_ELEMENT(conf, string);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    STACK_WIND(frame, trace_getxattr_cbk, FIRST_CHILD(this),</div><div class='add'>+               FIRST_CHILD(this)-&gt;fops-&gt;getxattr, loc, name, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-trace_fsetattr (call_frame_t *frame, xlator_t *this, fd_t *fd,</div><div class='del'>-                struct iatt *stbuf, int32_t valid)</div><div class='add'>+trace_removexattr(call_frame_t *frame, xlator_t *this, loc_t *loc,</div><div class='add'>+                  const char *name, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-        uint64_t ia_time          = 0;</div><div class='del'>-        char     actime_str[256]  = {0,};</div><div class='del'>-        char     modtime_str[256] = {0,};</div><div class='del'>-</div><div class='del'>-        if (trace_fop_names[GF_FOP_FSETATTR].enabled) {</div><div class='del'>-                if (valid &amp; GF_SET_ATTR_MODE) {</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_NORMAL,</div><div class='del'>-                                "%"PRId64": (*fd=%p, mode=%o)",</div><div class='del'>-                                frame-&gt;root-&gt;unique, fd,</div><div class='del'>-                                st_mode_from_ia (stbuf-&gt;ia_prot, stbuf-&gt;ia_type));</div><div class='del'>-                }</div><div class='add'>+    trace_conf_t *conf = NULL;</div><div class='ctx'> </div><div class='del'>-                if (valid &amp; (GF_SET_ATTR_UID | GF_SET_ATTR_GID)) {</div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_NORMAL,</div><div class='del'>-                                "%"PRId64": (*fd=%p, uid=%o, gid=%o)",</div><div class='del'>-                                frame-&gt;root-&gt;unique, fd,</div><div class='del'>-                                stbuf-&gt;ia_uid, stbuf-&gt;ia_gid);</div><div class='del'>-                }</div><div class='add'>+    conf = this-&gt;private;</div><div class='ctx'> </div><div class='del'>-                if (valid &amp; (GF_SET_ATTR_ATIME | GF_SET_ATTR_MTIME)) {</div><div class='del'>-                        ia_time = stbuf-&gt;ia_atime;</div><div class='del'>-                        strftime (actime_str, 256, "[%b %d %H:%M:%S]",</div><div class='del'>-                                  localtime ((time_t *)&amp;ia_time));</div><div class='add'>+    if (!conf-&gt;log_file &amp;&amp; !conf-&gt;log_history)</div><div class='add'>+        goto out;</div><div class='add'>+    if (trace_fop_names[GF_FOP_REMOVEXATTR].enabled) {</div><div class='add'>+        char string[4096] = {</div><div class='add'>+            0,</div><div class='add'>+        };</div><div class='add'>+        snprintf(string, sizeof(string), "%" PRId64 ": gfid=%s path=%s name=%s",</div><div class='add'>+                 frame-&gt;root-&gt;unique, uuid_utoa(loc-&gt;inode-&gt;gfid), loc-&gt;path,</div><div class='add'>+                 name);</div><div class='ctx'> </div><div class='del'>-                        ia_time = stbuf-&gt;ia_mtime;</div><div class='del'>-                        strftime (modtime_str, 256, "[%b %d %H:%M:%S]",</div><div class='del'>-                                  localtime ((time_t *)&amp;ia_time));</div><div class='add'>+        frame-&gt;local = loc-&gt;inode-&gt;gfid;</div><div class='ctx'> </div><div class='del'>-                        gf_log (this-&gt;name, GF_LOG_NORMAL,</div><div class='del'>-                                "%"PRId64": (*fd=%p"</div><div class='del'>-                                "*stbuf=%p {ia_atime=%s, ia_mtime=%s})",</div><div class='del'>-                                frame-&gt;root-&gt;unique, fd, stbuf, actime_str,</div><div class='del'>-                                modtime_str);</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='add'>+        LOG_ELEMENT(conf, string);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        STACK_WIND (frame, trace_fsetattr_cbk,</div><div class='del'>-                    FIRST_CHILD(this),</div><div class='del'>-                    FIRST_CHILD(this)-&gt;fops-&gt;fsetattr,</div><div class='del'>-                    fd, stbuf, valid);</div><div class='add'>+out:</div><div class='add'>+    STACK_WIND(frame, trace_removexattr_cbk, FIRST_CHILD(this),</div><div class='add'>+               FIRST_CHILD(this)-&gt;fops-&gt;removexattr, loc, name, xdata);</div><div class='ctx'> </div><div class='del'>-        return 0;</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-trace_truncate (call_frame_t *frame, xlator_t *this, loc_t *loc,</div><div class='del'>-                off_t offset)</div><div class='add'>+trace_opendir(call_frame_t *frame, xlator_t *this, loc_t *loc, fd_t *fd,</div><div class='add'>+              dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-        if (trace_fop_names[GF_FOP_TRUNCATE].enabled) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_NORMAL,</div><div class='del'>-                        "%"PRId64": (loc {path=%s, ino=%"PRIu64"}, offset=%"PRId64")",</div><div class='del'>-                        frame-&gt;root-&gt;unique, loc-&gt;path, loc-&gt;inode-&gt;ino, offset);</div><div class='del'>-        }</div><div class='add'>+    trace_conf_t *conf = NULL;</div><div class='ctx'> </div><div class='del'>-        STACK_WIND (frame, trace_truncate_cbk,</div><div class='del'>-                    FIRST_CHILD(this),</div><div class='del'>-                    FIRST_CHILD(this)-&gt;fops-&gt;truncate,</div><div class='del'>-                    loc, offset);</div><div class='add'>+    conf = this-&gt;private;</div><div class='ctx'> </div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='add'>+    if (!conf-&gt;log_file &amp;&amp; !conf-&gt;log_history)</div><div class='add'>+        goto out;</div><div class='add'>+    if (trace_fop_names[GF_FOP_OPENDIR].enabled) {</div><div class='add'>+        char string[4096] = {</div><div class='add'>+            0,</div><div class='add'>+        };</div><div class='add'>+        snprintf(string, sizeof(string), "%" PRId64 ": gfid=%s path=%s fd=%p",</div><div class='add'>+                 frame-&gt;root-&gt;unique, uuid_utoa(loc-&gt;inode-&gt;gfid), loc-&gt;path,</div><div class='add'>+                 fd);</div><div class='ctx'> </div><div class='add'>+        frame-&gt;local = loc-&gt;inode-&gt;gfid;</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-trace_open (call_frame_t *frame, xlator_t *this, loc_t *loc,</div><div class='del'>-            int32_t flags, fd_t *fd, int32_t wbflags)</div><div class='del'>-{</div><div class='del'>-        if (trace_fop_names[GF_FOP_OPEN].enabled) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_NORMAL,</div><div class='del'>-                        "%"PRId64": (loc {path=%s, ino=%"PRIu64"}, flags=%d, "</div><div class='del'>-                        "fd=%p, wbflags=%d)",</div><div class='del'>-                        frame-&gt;root-&gt;unique, loc-&gt;path, loc-&gt;inode-&gt;ino, flags,</div><div class='del'>-                        fd, wbflags);</div><div class='del'>-        }</div><div class='add'>+        LOG_ELEMENT(conf, string);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        STACK_WIND (frame, trace_open_cbk,</div><div class='del'>-                    FIRST_CHILD(this),</div><div class='del'>-                    FIRST_CHILD(this)-&gt;fops-&gt;open,</div><div class='del'>-                    loc, flags, fd, wbflags);</div><div class='del'>-        return 0;</div><div class='add'>+out:</div><div class='add'>+    STACK_WIND(frame, trace_opendir_cbk, FIRST_CHILD(this),</div><div class='add'>+               FIRST_CHILD(this)-&gt;fops-&gt;opendir, loc, fd, xdata);</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> int</div><div class='del'>-trace_create (call_frame_t *frame, xlator_t *this, loc_t *loc,</div><div class='del'>-              int32_t flags, mode_t mode, fd_t *fd, dict_t *params)</div><div class='add'>+trace_readdirp(call_frame_t *frame, xlator_t *this, fd_t *fd, size_t size,</div><div class='add'>+               off_t offset, dict_t *dict)</div><div class='ctx'> {</div><div class='del'>-        if (trace_fop_names[GF_FOP_CREATE].enabled) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_NORMAL,</div><div class='del'>-                        "%"PRId64": (loc {path=%s, ino=%"PRIu64"}, flags=0%o mode=0%o)",</div><div class='del'>-                        frame-&gt;root-&gt;unique, loc-&gt;path, loc-&gt;inode-&gt;ino, flags, mode);</div><div class='del'>-        }</div><div class='add'>+    trace_conf_t *conf = NULL;</div><div class='ctx'> </div><div class='del'>-        STACK_WIND (frame, trace_create_cbk,</div><div class='del'>-                    FIRST_CHILD(this),</div><div class='del'>-                    FIRST_CHILD(this)-&gt;fops-&gt;create,</div><div class='del'>-                    loc, flags, mode, fd, params);</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='add'>+    conf = this-&gt;private;</div><div class='ctx'> </div><div class='add'>+    if (!conf-&gt;log_file &amp;&amp; !conf-&gt;log_history)</div><div class='add'>+        goto out;</div><div class='add'>+    if (trace_fop_names[GF_FOP_READDIRP].enabled) {</div><div class='add'>+        char string[4096] = {</div><div class='add'>+            0,</div><div class='add'>+        };</div><div class='add'>+        snprintf(string, sizeof(string),</div><div class='add'>+                 "%" PRId64 ": gfid=%s fd=%p, size=%" GF_PRI_SIZET</div><div class='add'>+                 ", offset=%" PRId64 " dict=%p",</div><div class='add'>+                 frame-&gt;root-&gt;unique, uuid_utoa(fd-&gt;inode-&gt;gfid), fd, size,</div><div class='add'>+                 offset, dict);</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-trace_readv (call_frame_t *frame, xlator_t *this, fd_t *fd,</div><div class='del'>-             size_t size, off_t offset)</div><div class='del'>-{</div><div class='del'>-        if (trace_fop_names[GF_FOP_READ].enabled) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_NORMAL,</div><div class='del'>-                        "%"PRId64": (*fd=%p, size=%"GF_PRI_SIZET", offset=%"PRId64")",</div><div class='del'>-                        frame-&gt;root-&gt;unique, fd, size, offset);</div><div class='del'>-        }</div><div class='add'>+        frame-&gt;local = fd-&gt;inode-&gt;gfid;</div><div class='ctx'> </div><div class='del'>-        STACK_WIND (frame, trace_readv_cbk,</div><div class='del'>-                    FIRST_CHILD(this),</div><div class='del'>-                    FIRST_CHILD(this)-&gt;fops-&gt;readv,</div><div class='del'>-                    fd, size, offset);</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='add'>+        LOG_ELEMENT(conf, string);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    STACK_WIND(frame, trace_readdirp_cbk, FIRST_CHILD(this),</div><div class='add'>+               FIRST_CHILD(this)-&gt;fops-&gt;readdirp, fd, size, offset, dict);</div><div class='ctx'> </div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-trace_writev (call_frame_t *frame, xlator_t *this, fd_t *fd,</div><div class='del'>-              struct iovec *vector, int32_t count,</div><div class='del'>-              off_t offset, struct iobref *iobref)</div><div class='add'>+trace_readdir(call_frame_t *frame, xlator_t *this, fd_t *fd, size_t size,</div><div class='add'>+              off_t offset, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-        if (trace_fop_names[GF_FOP_WRITE].enabled) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_NORMAL,</div><div class='del'>-                        "%"PRId64": (*fd=%p, *vector=%p, count=%d, offset=%"PRId64")",</div><div class='del'>-                        frame-&gt;root-&gt;unique, fd, vector, count, offset);</div><div class='del'>-        }</div><div class='add'>+    trace_conf_t *conf = NULL;</div><div class='ctx'> </div><div class='del'>-        STACK_WIND (frame, trace_writev_cbk,</div><div class='del'>-                    FIRST_CHILD(this),</div><div class='del'>-                    FIRST_CHILD(this)-&gt;fops-&gt;writev,</div><div class='del'>-                    fd, vector, count, offset, iobref);</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='add'>+    conf = this-&gt;private;</div><div class='ctx'> </div><div class='add'>+    if (!conf-&gt;log_file &amp;&amp; !conf-&gt;log_history)</div><div class='add'>+        goto out;</div><div class='add'>+    if (trace_fop_names[GF_FOP_READDIR].enabled) {</div><div class='add'>+        char string[4096] = {</div><div class='add'>+            0,</div><div class='add'>+        };</div><div class='add'>+        snprintf(string, sizeof(string),</div><div class='add'>+                 "%" PRId64 ": gfid=%s fd=%p, size=%" GF_PRI_SIZET</div><div class='add'>+                 ", offset=%" PRId64,</div><div class='add'>+                 frame-&gt;root-&gt;unique, uuid_utoa(fd-&gt;inode-&gt;gfid), fd, size,</div><div class='add'>+                 offset);</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-trace_statfs (call_frame_t *frame, xlator_t *this, loc_t *loc)</div><div class='del'>-{</div><div class='del'>-        if (trace_fop_names[GF_FOP_STATFS].enabled) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_NORMAL,</div><div class='del'>-                        "%"PRId64": (loc {path=%s, ino=%"PRIu64"})",</div><div class='del'>-                        frame-&gt;root-&gt;unique, loc-&gt;path,</div><div class='del'>-                        ((loc-&gt;inode)? loc-&gt;inode-&gt;ino : 0));</div><div class='del'>-        }</div><div class='add'>+        frame-&gt;local = fd-&gt;inode-&gt;gfid;</div><div class='ctx'> </div><div class='del'>-        STACK_WIND (frame, trace_statfs_cbk,</div><div class='del'>-                    FIRST_CHILD(this),</div><div class='del'>-                    FIRST_CHILD(this)-&gt;fops-&gt;statfs,</div><div class='del'>-                    loc);</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='add'>+        LOG_ELEMENT(conf, string);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    STACK_WIND(frame, trace_readdir_cbk, FIRST_CHILD(this),</div><div class='add'>+               FIRST_CHILD(this)-&gt;fops-&gt;readdir, fd, size, offset, xdata);</div><div class='ctx'> </div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-trace_flush (call_frame_t *frame, xlator_t *this, fd_t *fd)</div><div class='add'>+trace_fsyncdir(call_frame_t *frame, xlator_t *this, fd_t *fd, int32_t datasync,</div><div class='add'>+               dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-        if (trace_fop_names[GF_FOP_FLUSH].enabled) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_NORMAL,</div><div class='del'>-                        "%"PRId64": (*fd=%p)",</div><div class='del'>-                        frame-&gt;root-&gt;unique, fd);</div><div class='del'>-        }</div><div class='add'>+    trace_conf_t *conf = NULL;</div><div class='ctx'> </div><div class='del'>-        STACK_WIND (frame, trace_flush_cbk,</div><div class='del'>-                    FIRST_CHILD(this),</div><div class='del'>-                    FIRST_CHILD(this)-&gt;fops-&gt;flush,</div><div class='del'>-                    fd);</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='add'>+    conf = this-&gt;private;</div><div class='ctx'> </div><div class='add'>+    if (!conf-&gt;log_file &amp;&amp; !conf-&gt;log_history)</div><div class='add'>+        goto out;</div><div class='add'>+    if (trace_fop_names[GF_FOP_FSYNCDIR].enabled) {</div><div class='add'>+        char string[4096] = {</div><div class='add'>+            0,</div><div class='add'>+        };</div><div class='add'>+        snprintf(string, sizeof(string),</div><div class='add'>+                 "%" PRId64 ": gfid=%s datasync=%d fd=%p", frame-&gt;root-&gt;unique,</div><div class='add'>+                 uuid_utoa(fd-&gt;inode-&gt;gfid), datasync, fd);</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-trace_fsync (call_frame_t *frame, xlator_t *this, fd_t *fd, int32_t flags)</div><div class='del'>-{</div><div class='del'>-        if (trace_fop_names[GF_FOP_FSYNC].enabled) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_NORMAL,</div><div class='del'>-                        "%"PRId64": (flags=%d, *fd=%p)",</div><div class='del'>-                        frame-&gt;root-&gt;unique, flags, fd);</div><div class='del'>-        }</div><div class='add'>+        frame-&gt;local = fd-&gt;inode-&gt;gfid;</div><div class='ctx'> </div><div class='del'>-        STACK_WIND (frame, trace_fsync_cbk,</div><div class='del'>-                    FIRST_CHILD(this),</div><div class='del'>-                    FIRST_CHILD(this)-&gt;fops-&gt;fsync,</div><div class='del'>-                    fd, flags);</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='add'>+        LOG_ELEMENT(conf, string);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='add'>+out:</div><div class='add'>+    STACK_WIND(frame, trace_fsyncdir_cbk, FIRST_CHILD(this),</div><div class='add'>+               FIRST_CHILD(this)-&gt;fops-&gt;fsyncdir, fd, datasync, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-trace_setxattr (call_frame_t *frame, xlator_t *this,</div><div class='del'>-                loc_t *loc, dict_t *dict, int32_t flags)</div><div class='add'>+trace_access(call_frame_t *frame, xlator_t *this, loc_t *loc, int32_t mask,</div><div class='add'>+             dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-        if (trace_fop_names[GF_FOP_SETXATTR].enabled) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_NORMAL,</div><div class='del'>-                        "%"PRId64": (loc {path=%s, ino=%"PRIu64"}, dict=%p, flags=%d)",</div><div class='del'>-                        frame-&gt;root-&gt;unique, loc-&gt;path,</div><div class='del'>-                        ((loc-&gt;inode)? loc-&gt;inode-&gt;ino : 0), dict, flags);</div><div class='del'>-        }</div><div class='add'>+    trace_conf_t *conf = NULL;</div><div class='ctx'> </div><div class='del'>-        STACK_WIND (frame, trace_setxattr_cbk,</div><div class='del'>-                    FIRST_CHILD(this),</div><div class='del'>-                    FIRST_CHILD(this)-&gt;fops-&gt;setxattr,</div><div class='del'>-                    loc, dict, flags);</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='add'>+    conf = this-&gt;private;</div><div class='ctx'> </div><div class='add'>+    if (!conf-&gt;log_file &amp;&amp; !conf-&gt;log_history)</div><div class='add'>+        goto out;</div><div class='add'>+    if (trace_fop_names[GF_FOP_ACCESS].enabled) {</div><div class='add'>+        char string[4096] = {</div><div class='add'>+            0,</div><div class='add'>+        };</div><div class='add'>+        snprintf(string, sizeof(string),</div><div class='add'>+                 "%" PRId64 ": gfid=%s path=%s mask=0%o", frame-&gt;root-&gt;unique,</div><div class='add'>+                 uuid_utoa(loc-&gt;inode-&gt;gfid), loc-&gt;path, mask);</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-trace_getxattr (call_frame_t *frame, xlator_t *this,</div><div class='del'>-                loc_t *loc, const char *name)</div><div class='del'>-{</div><div class='del'>-        if (trace_fop_names[GF_FOP_GETXATTR].enabled) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_NORMAL,</div><div class='del'>-                        "%"PRId64": (loc {path=%s, ino=%"PRIu64"}), name=%s",</div><div class='del'>-                        frame-&gt;root-&gt;unique, loc-&gt;path,</div><div class='del'>-                        ((loc-&gt;inode)? loc-&gt;inode-&gt;ino : 0), name);</div><div class='del'>-        }</div><div class='add'>+        frame-&gt;local = loc-&gt;inode-&gt;gfid;</div><div class='ctx'> </div><div class='del'>-        STACK_WIND (frame, trace_getxattr_cbk,</div><div class='del'>-                    FIRST_CHILD(this),</div><div class='del'>-                    FIRST_CHILD(this)-&gt;fops-&gt;getxattr,</div><div class='del'>-                    loc, name);</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='add'>+        LOG_ELEMENT(conf, string);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='add'>+out:</div><div class='add'>+    STACK_WIND(frame, trace_access_cbk, FIRST_CHILD(this),</div><div class='add'>+               FIRST_CHILD(this)-&gt;fops-&gt;access, loc, mask, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-trace_removexattr (call_frame_t *frame, xlator_t *this,</div><div class='del'>-                   loc_t *loc, const char *name)</div><div class='add'>+int32_t</div><div class='add'>+trace_rchecksum(call_frame_t *frame, xlator_t *this, fd_t *fd, off_t offset,</div><div class='add'>+                int32_t len, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-        if (trace_fop_names[GF_FOP_REMOVEXATTR].enabled) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_NORMAL,</div><div class='del'>-                        "%"PRId64": (loc {path=%s, ino=%"PRIu64"}, name=%s)",</div><div class='del'>-                        frame-&gt;root-&gt;unique, loc-&gt;path,</div><div class='del'>-                        ((loc-&gt;inode)? loc-&gt;inode-&gt;ino : 0), name);</div><div class='del'>-        }</div><div class='add'>+    trace_conf_t *conf = NULL;</div><div class='ctx'> </div><div class='del'>-        STACK_WIND (frame, trace_removexattr_cbk,</div><div class='del'>-                    FIRST_CHILD(this),</div><div class='del'>-                    FIRST_CHILD(this)-&gt;fops-&gt;removexattr,</div><div class='del'>-                    loc, name);</div><div class='add'>+    conf = this-&gt;private;</div><div class='ctx'> </div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='add'>+    if (!conf-&gt;log_file &amp;&amp; !conf-&gt;log_history)</div><div class='add'>+        goto out;</div><div class='add'>+    if (trace_fop_names[GF_FOP_RCHECKSUM].enabled) {</div><div class='add'>+        char string[4096] = {</div><div class='add'>+            0,</div><div class='add'>+        };</div><div class='add'>+        snprintf(string, sizeof(string),</div><div class='add'>+                 "%" PRId64 ": gfid=%s offset=%" PRId64 "len=%u fd=%p",</div><div class='add'>+                 frame-&gt;root-&gt;unique, uuid_utoa(fd-&gt;inode-&gt;gfid), offset, len,</div><div class='add'>+                 fd);</div><div class='ctx'> </div><div class='add'>+        frame-&gt;local = fd-&gt;inode-&gt;gfid;</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-trace_opendir (call_frame_t *frame, xlator_t *this, loc_t *loc, fd_t *fd)</div><div class='del'>-{</div><div class='del'>-        if (trace_fop_names[GF_FOP_OPENDIR].enabled) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_NORMAL,</div><div class='del'>-                        "%"PRId64":( loc {path=%s, ino=%"PRIu64"}, fd=%p)",</div><div class='del'>-                        frame-&gt;root-&gt;unique, loc-&gt;path, loc-&gt;inode-&gt;ino, fd);</div><div class='del'>-        }</div><div class='add'>+        LOG_ELEMENT(conf, string);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    STACK_WIND(frame, trace_rchecksum_cbk, FIRST_CHILD(this),</div><div class='add'>+               FIRST_CHILD(this)-&gt;fops-&gt;rchecksum, fd, offset, len, xdata);</div><div class='ctx'> </div><div class='del'>-        STACK_WIND (frame, trace_opendir_cbk,</div><div class='del'>-                    FIRST_CHILD(this),</div><div class='del'>-                    FIRST_CHILD(this)-&gt;fops-&gt;opendir,</div><div class='del'>-                    loc, fd);</div><div class='del'>-        return 0;</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-trace_readdirp (call_frame_t *frame, xlator_t *this, fd_t *fd, size_t size,</div><div class='del'>-                off_t offset)</div><div class='add'>+int32_t</div><div class='add'>+trace_fentrylk(call_frame_t *frame, xlator_t *this, const char *volume,</div><div class='add'>+               fd_t *fd, const char *basename, entrylk_cmd cmd,</div><div class='add'>+               entrylk_type type, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-        if (trace_fop_names[GF_FOP_READDIRP].enabled) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_NORMAL,</div><div class='del'>-                        "%"PRId64": (fd=%p, size=%"GF_PRI_SIZET", offset=%"PRId64")",</div><div class='del'>-                        frame-&gt;root-&gt;unique, fd, size, offset);</div><div class='del'>-        }</div><div class='add'>+    trace_conf_t *conf = NULL;</div><div class='ctx'> </div><div class='del'>-        STACK_WIND (frame, trace_readdirp_cbk,</div><div class='del'>-                    FIRST_CHILD(this),</div><div class='del'>-                    FIRST_CHILD(this)-&gt;fops-&gt;readdirp,</div><div class='del'>-                    fd, size, offset);</div><div class='add'>+    conf = this-&gt;private;</div><div class='ctx'> </div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='add'>+    if (!conf-&gt;log_file &amp;&amp; !conf-&gt;log_history)</div><div class='add'>+        goto out;</div><div class='add'>+    if (trace_fop_names[GF_FOP_FENTRYLK].enabled) {</div><div class='add'>+        char string[4096] = {</div><div class='add'>+            0,</div><div class='add'>+        };</div><div class='add'>+        snprintf(string, sizeof(string),</div><div class='add'>+                 "%" PRId64</div><div class='add'>+                 ": gfid=%s volume=%s, (fd=%p "</div><div class='add'>+                 "basename=%s, cmd=%s, type=%s)",</div><div class='add'>+                 frame-&gt;root-&gt;unique, uuid_utoa(fd-&gt;inode-&gt;gfid), volume, fd,</div><div class='add'>+                 basename,</div><div class='add'>+                 ((cmd == ENTRYLK_LOCK) ? "ENTRYLK_LOCK" : "ENTRYLK_UNLOCK"),</div><div class='add'>+                 ((type == ENTRYLK_RDLCK) ? "ENTRYLK_RDLCK" : "ENTRYLK_WRLCK"));</div><div class='ctx'> </div><div class='add'>+        frame-&gt;local = fd-&gt;inode-&gt;gfid;</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-trace_readdir (call_frame_t *frame, xlator_t *this, fd_t *fd,</div><div class='del'>-               size_t size, off_t offset)</div><div class='add'>+        LOG_ELEMENT(conf, string);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    STACK_WIND(frame, trace_fentrylk_cbk, FIRST_CHILD(this),</div><div class='add'>+               FIRST_CHILD(this)-&gt;fops-&gt;fentrylk, volume, fd, basename, cmd,</div><div class='add'>+               type, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+trace_fgetxattr(call_frame_t *frame, xlator_t *this, fd_t *fd, const char *name,</div><div class='add'>+                dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-        if (trace_fop_names[GF_FOP_READDIR].enabled) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_NORMAL,</div><div class='del'>-                        "%"PRId64": (fd=%p, size=%"GF_PRI_SIZET", offset=%"PRId64")",</div><div class='del'>-                        frame-&gt;root-&gt;unique, fd, size, offset);</div><div class='del'>-        }</div><div class='add'>+    trace_conf_t *conf = NULL;</div><div class='ctx'> </div><div class='del'>-        STACK_WIND (frame, trace_readdir_cbk,</div><div class='del'>-                    FIRST_CHILD(this),</div><div class='del'>-                    FIRST_CHILD(this)-&gt;fops-&gt;readdir,</div><div class='del'>-                    fd, size, offset);</div><div class='add'>+    conf = this-&gt;private;</div><div class='ctx'> </div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='add'>+    if (!conf-&gt;log_file &amp;&amp; !conf-&gt;log_history)</div><div class='add'>+        goto out;</div><div class='add'>+    if (trace_fop_names[GF_FOP_FGETXATTR].enabled) {</div><div class='add'>+        char string[4096] = {</div><div class='add'>+            0,</div><div class='add'>+        };</div><div class='add'>+        snprintf(string, sizeof(string), "%" PRId64 ": gfid=%s fd=%p name=%s",</div><div class='add'>+                 frame-&gt;root-&gt;unique, uuid_utoa(fd-&gt;inode-&gt;gfid), fd, name);</div><div class='ctx'> </div><div class='add'>+        frame-&gt;local = fd-&gt;inode-&gt;gfid;</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-trace_fsyncdir (call_frame_t *frame, xlator_t *this,</div><div class='del'>-                fd_t *fd, int32_t datasync)</div><div class='del'>-{</div><div class='del'>-        if (trace_fop_names[GF_FOP_FSYNCDIR].enabled) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_NORMAL,</div><div class='del'>-                        "%"PRId64": (datasync=%d, *fd=%p)",</div><div class='del'>-                        frame-&gt;root-&gt;unique, datasync, fd);</div><div class='del'>-        }</div><div class='add'>+        LOG_ELEMENT(conf, string);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        STACK_WIND (frame, trace_fsyncdir_cbk,</div><div class='del'>-                    FIRST_CHILD(this),</div><div class='del'>-                    FIRST_CHILD(this)-&gt;fops-&gt;fsyncdir,</div><div class='del'>-                    fd, datasync);</div><div class='del'>-        return 0;</div><div class='add'>+out:</div><div class='add'>+    STACK_WIND(frame, trace_fgetxattr_cbk, FIRST_CHILD(this),</div><div class='add'>+               FIRST_CHILD(this)-&gt;fops-&gt;fgetxattr, fd, name, xdata);</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+int32_t</div><div class='add'>+trace_fsetxattr(call_frame_t *frame, xlator_t *this, fd_t *fd, dict_t *dict,</div><div class='add'>+                int32_t flags, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    trace_conf_t *conf = NULL;</div><div class='add'>+</div><div class='add'>+    conf = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    if (!conf-&gt;log_file &amp;&amp; !conf-&gt;log_history)</div><div class='add'>+        goto out;</div><div class='add'>+    if (trace_fop_names[GF_FOP_FSETXATTR].enabled) {</div><div class='add'>+        char string[4096] = {</div><div class='add'>+            0,</div><div class='add'>+        };</div><div class='add'>+        snprintf(string, sizeof(string), "%" PRId64 ": gfid=%s fd=%p flags=%d",</div><div class='add'>+                 frame-&gt;root-&gt;unique, uuid_utoa(fd-&gt;inode-&gt;gfid), fd, flags);</div><div class='add'>+</div><div class='add'>+        frame-&gt;local = fd-&gt;inode-&gt;gfid;</div><div class='add'>+</div><div class='add'>+        LOG_ELEMENT(conf, string);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    STACK_WIND(frame, trace_fsetxattr_cbk, FIRST_CHILD(this),</div><div class='add'>+               FIRST_CHILD(this)-&gt;fops-&gt;fsetxattr, fd, dict, flags, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-trace_access (call_frame_t *frame, xlator_t *this, loc_t *loc, int32_t mask)</div><div class='add'>+trace_ftruncate(call_frame_t *frame, xlator_t *this, fd_t *fd, off_t offset,</div><div class='add'>+                dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-        if (trace_fop_names[GF_FOP_ACCESS].enabled) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_NORMAL,</div><div class='del'>-                        "%"PRId64": (*loc {path=%s, ino=%"PRIu64"}, mask=0%o)",</div><div class='del'>-                        frame-&gt;root-&gt;unique, loc-&gt;path,</div><div class='del'>-                        ((loc-&gt;inode)? loc-&gt;inode-&gt;ino : 0), mask);</div><div class='del'>-        }</div><div class='add'>+    trace_conf_t *conf = NULL;</div><div class='ctx'> </div><div class='del'>-        STACK_WIND (frame, trace_access_cbk,</div><div class='del'>-                    FIRST_CHILD(this),</div><div class='del'>-                    FIRST_CHILD(this)-&gt;fops-&gt;access,</div><div class='del'>-                    loc, mask);</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='add'>+    conf = this-&gt;private;</div><div class='ctx'> </div><div class='add'>+    if (!conf-&gt;log_file &amp;&amp; !conf-&gt;log_history)</div><div class='add'>+        goto out;</div><div class='add'>+    if (trace_fop_names[GF_FOP_FTRUNCATE].enabled) {</div><div class='add'>+        char string[4096] = {</div><div class='add'>+            0,</div><div class='add'>+        };</div><div class='add'>+        snprintf(string, sizeof(string),</div><div class='add'>+                 "%" PRId64 ": gfid=%s offset=%" PRId64 " fd=%p",</div><div class='add'>+                 frame-&gt;root-&gt;unique, uuid_utoa(fd-&gt;inode-&gt;gfid), offset, fd);</div><div class='add'>+</div><div class='add'>+        frame-&gt;local = fd-&gt;inode-&gt;gfid;</div><div class='add'>+</div><div class='add'>+        LOG_ELEMENT(conf, string);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    STACK_WIND(frame, trace_ftruncate_cbk, FIRST_CHILD(this),</div><div class='add'>+               FIRST_CHILD(this)-&gt;fops-&gt;ftruncate, fd, offset, xdata);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-trace_ftruncate (call_frame_t *frame, xlator_t *this,</div><div class='del'>-                 fd_t *fd, off_t offset)</div><div class='add'>+trace_fstat(call_frame_t *frame, xlator_t *this, fd_t *fd, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-        if (trace_fop_names[GF_FOP_FTRUNCATE].enabled) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_NORMAL,</div><div class='del'>-                        "%"PRId64": (offset=%"PRId64", *fd=%p)",</div><div class='del'>-                        frame-&gt;root-&gt;unique, offset, fd);</div><div class='del'>-        }</div><div class='add'>+    trace_conf_t *conf = NULL;</div><div class='ctx'> </div><div class='del'>-        STACK_WIND (frame, trace_ftruncate_cbk,</div><div class='del'>-                    FIRST_CHILD(this),</div><div class='del'>-                    FIRST_CHILD(this)-&gt;fops-&gt;ftruncate,</div><div class='del'>-                    fd, offset);</div><div class='add'>+    conf = this-&gt;private;</div><div class='ctx'> </div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='add'>+    if (!conf-&gt;log_file &amp;&amp; !conf-&gt;log_history)</div><div class='add'>+        goto out;</div><div class='add'>+    if (trace_fop_names[GF_FOP_FSTAT].enabled) {</div><div class='add'>+        char string[4096] = {</div><div class='add'>+            0,</div><div class='add'>+        };</div><div class='add'>+        snprintf(string, sizeof(string), "%" PRId64 ": gfid=%s fd=%p",</div><div class='add'>+                 frame-&gt;root-&gt;unique, uuid_utoa(fd-&gt;inode-&gt;gfid), fd);</div><div class='add'>+</div><div class='add'>+        frame-&gt;local = fd-&gt;inode-&gt;gfid;</div><div class='ctx'> </div><div class='add'>+        LOG_ELEMENT(conf, string);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    STACK_WIND(frame, trace_fstat_cbk, FIRST_CHILD(this),</div><div class='add'>+               FIRST_CHILD(this)-&gt;fops-&gt;fstat, fd, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int</div><div class='del'>-trace_fstat (call_frame_t *frame, xlator_t *this, fd_t *fd)</div><div class='add'>+trace_lk(call_frame_t *frame, xlator_t *this, fd_t *fd, int32_t cmd,</div><div class='add'>+         struct gf_flock *lock, dict_t *xdata)</div><div class='ctx'> {</div><div class='del'>-        if (trace_fop_names[GF_FOP_FSTAT].enabled) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_NORMAL,</div><div class='del'>-                        "%"PRId64": (*fd=%p)",</div><div class='del'>-                        frame-&gt;root-&gt;unique, fd);</div><div class='del'>-        }</div><div class='add'>+    trace_conf_t *conf = NULL;</div><div class='add'>+</div><div class='add'>+    conf = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    if (!conf-&gt;log_file &amp;&amp; !conf-&gt;log_history)</div><div class='add'>+        goto out;</div><div class='add'>+    if (trace_fop_names[GF_FOP_LK].enabled) {</div><div class='add'>+        char string[4096] = {</div><div class='add'>+            0,</div><div class='add'>+        };</div><div class='add'>+        snprintf(string, sizeof(string),</div><div class='add'>+                 "%" PRId64</div><div class='add'>+                 ": gfid=%s fd=%p, cmd=%d, "</div><div class='add'>+                 "lock {l_type=%d, "</div><div class='add'>+                 "l_whence=%d, l_start=%" PRId64</div><div class='add'>+                 ", "</div><div class='add'>+                 "l_len=%" PRId64 ", l_pid=%u})",</div><div class='add'>+                 frame-&gt;root-&gt;unique, uuid_utoa(fd-&gt;inode-&gt;gfid), fd, cmd,</div><div class='add'>+                 lock-&gt;l_type, lock-&gt;l_whence, lock-&gt;l_start, lock-&gt;l_len,</div><div class='add'>+                 lock-&gt;l_pid);</div><div class='add'>+</div><div class='add'>+        frame-&gt;local = fd-&gt;inode-&gt;gfid;</div><div class='add'>+</div><div class='add'>+        LOG_ELEMENT(conf, string);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        STACK_WIND (frame, trace_fstat_cbk,</div><div class='del'>-                    FIRST_CHILD(this),</div><div class='del'>-                    FIRST_CHILD(this)-&gt;fops-&gt;fstat,</div><div class='del'>-                    fd);</div><div class='del'>-        return 0;</div><div class='add'>+out:</div><div class='add'>+    STACK_WIND(frame, trace_lk_cbk, FIRST_CHILD(this),</div><div class='add'>+               FIRST_CHILD(this)-&gt;fops-&gt;lk, fd, cmd, lock, xdata);</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+int32_t</div><div class='add'>+trace_forget(xlator_t *this, inode_t *inode)</div><div class='add'>+{</div><div class='add'>+    trace_conf_t *conf = NULL;</div><div class='ctx'> </div><div class='del'>-int</div><div class='del'>-trace_lk (call_frame_t *frame, xlator_t *this, fd_t *fd,</div><div class='del'>-          int32_t cmd, struct flock *lock)</div><div class='add'>+    conf = this-&gt;private;</div><div class='add'>+    /* If user want to understand when a lookup happens,</div><div class='add'>+       he should know about 'forget' too */</div><div class='add'>+    if (!conf-&gt;log_file &amp;&amp; !conf-&gt;log_history)</div><div class='add'>+        goto out;</div><div class='add'>+    if (trace_fop_names[GF_FOP_LOOKUP].enabled) {</div><div class='add'>+        char string[4096] = {</div><div class='add'>+            0,</div><div class='add'>+        };</div><div class='add'>+        snprintf(string, sizeof(string), "gfid=%s", uuid_utoa(inode-&gt;gfid));</div><div class='add'>+</div><div class='add'>+        LOG_ELEMENT(conf, string);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+trace_releasedir(xlator_t *this, fd_t *fd)</div><div class='ctx'> {</div><div class='del'>-        if (trace_fop_names[GF_FOP_LK].enabled) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_NORMAL,</div><div class='del'>-                        "%"PRId64": (*fd=%p, cmd=%d, lock {l_type=%d, l_whence=%d, "</div><div class='del'>-                        "l_start=%"PRId64", l_len=%"PRId64", l_pid=%u})",</div><div class='del'>-                        frame-&gt;root-&gt;unique, fd, cmd, lock-&gt;l_type, lock-&gt;l_whence,</div><div class='del'>-                        lock-&gt;l_start, lock-&gt;l_len, lock-&gt;l_pid);</div><div class='del'>-        }</div><div class='add'>+    trace_conf_t *conf = NULL;</div><div class='add'>+</div><div class='add'>+    conf = this-&gt;private;</div><div class='ctx'> </div><div class='del'>-        STACK_WIND (frame, trace_lk_cbk,</div><div class='del'>-                    FIRST_CHILD(this),</div><div class='del'>-                    FIRST_CHILD(this)-&gt;fops-&gt;lk,</div><div class='del'>-                    fd, cmd, lock);</div><div class='del'>-        return 0;</div><div class='add'>+    if (!conf-&gt;log_file &amp;&amp; !conf-&gt;log_history)</div><div class='add'>+        goto out;</div><div class='add'>+    if (trace_fop_names[GF_FOP_OPENDIR].enabled) {</div><div class='add'>+        char string[4096] = {</div><div class='add'>+            0,</div><div class='add'>+        };</div><div class='add'>+        snprintf(string, sizeof(string), "gfid=%s fd=%p",</div><div class='add'>+                 uuid_utoa(fd-&gt;inode-&gt;gfid), fd);</div><div class='add'>+</div><div class='add'>+        LOG_ELEMENT(conf, string);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return 0;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+int32_t</div><div class='add'>+trace_release(xlator_t *this, fd_t *fd)</div><div class='add'>+{</div><div class='add'>+    trace_conf_t *conf = NULL;</div><div class='add'>+</div><div class='add'>+    conf = this-&gt;private;</div><div class='ctx'> </div><div class='add'>+    if (!conf-&gt;log_file &amp;&amp; !conf-&gt;log_history)</div><div class='add'>+        goto out;</div><div class='add'>+    if (trace_fop_names[GF_FOP_OPEN].enabled ||</div><div class='add'>+        trace_fop_names[GF_FOP_CREATE].enabled) {</div><div class='add'>+        char string[4096] = {</div><div class='add'>+            0,</div><div class='add'>+        };</div><div class='add'>+        snprintf(string, sizeof(string), "gfid=%s fd=%p",</div><div class='add'>+                 uuid_utoa(fd-&gt;inode-&gt;gfid), fd);</div><div class='add'>+</div><div class='add'>+        LOG_ELEMENT(conf, string);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> void</div><div class='del'>-enable_all_calls (int enabled)</div><div class='add'>+enable_all_calls(int enabled)</div><div class='ctx'> {</div><div class='del'>-        int i;</div><div class='add'>+    int i;</div><div class='ctx'> </div><div class='del'>-        for (i = 0; i &lt; GF_FOP_MAXVALUE; i++)</div><div class='del'>-                trace_fop_names[i].enabled = enabled;</div><div class='add'>+    for (i = 0; i &lt; GF_FOP_MAXVALUE; i++)</div><div class='add'>+        trace_fop_names[i].enabled = enabled;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> void</div><div class='del'>-enable_call (const char *name, int enabled)</div><div class='add'>+enable_call(const char *name, int enabled)</div><div class='ctx'> {</div><div class='del'>-        int i;</div><div class='del'>-        for (i = 0; i &lt; GF_FOP_MAXVALUE; i++)</div><div class='del'>-                if (!strcasecmp(trace_fop_names[i].name, name))</div><div class='del'>-                        trace_fop_names[i].enabled = enabled;</div><div class='add'>+    int i;</div><div class='add'>+    for (i = 0; i &lt; GF_FOP_MAXVALUE; i++)</div><div class='add'>+        if (!strcasecmp(trace_fop_names[i].name, name))</div><div class='add'>+            trace_fop_names[i].enabled = enabled;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> /*</div><div class='ctx'>   include = 1 for "include-ops"</div><div class='ctx'>   = 0 for "exclude-ops"</div><div class='ctx'> */</div><div class='ctx'> void</div><div class='del'>-process_call_list (const char *list, int include)</div><div class='add'>+process_call_list(const char *list, int include)</div><div class='ctx'> {</div><div class='del'>-        enable_all_calls (include ? 0 : 1);</div><div class='add'>+    enable_all_calls(include ? 0 : 1);</div><div class='ctx'> </div><div class='del'>-        char *call = strsep ((char **)&amp;list, ",");</div><div class='add'>+    char *call = strsep((char **)&amp;list, ",");</div><div class='ctx'> </div><div class='del'>-        while (call) {</div><div class='del'>-                enable_call (call, include);</div><div class='del'>-                call = strsep ((char **)&amp;list, ",");</div><div class='del'>-        }</div><div class='add'>+    while (call) {</div><div class='add'>+        enable_call(call, include);</div><div class='add'>+        call = strsep((char **)&amp;list, ",");</div><div class='add'>+    }</div><div class='ctx'> }</div><div class='ctx'> </div><div class='add'>+int32_t</div><div class='add'>+trace_dump_history(xlator_t *this)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    char key_prefix[GF_DUMP_MAX_BUF_LEN] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    trace_conf_t *conf = NULL;</div><div class='add'>+</div><div class='add'>+    GF_VALIDATE_OR_GOTO("trace", this, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, this-&gt;history, out);</div><div class='add'>+</div><div class='add'>+    conf = this-&gt;private;</div><div class='add'>+    // Is it ok to return silently if log-history option his off?</div><div class='add'>+    if (conf &amp;&amp; conf-&gt;log_history == _gf_true) {</div><div class='add'>+        gf_proc_dump_build_key(key_prefix, "xlator.debug.trace", "history");</div><div class='add'>+        gf_proc_dump_add_section("%s", key_prefix);</div><div class='add'>+        eh_dump(this-&gt;history, NULL, dump_history_trace);</div><div class='add'>+    }</div><div class='add'>+    ret = 0;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='ctx'> int32_t</div><div class='del'>-init (xlator_t *this)</div><div class='add'>+mem_acct_init(xlator_t *this)</div><div class='ctx'> {</div><div class='del'>-        dict_t *options = NULL;</div><div class='del'>-        char *includes = NULL, *excludes = NULL;</div><div class='del'>-        char *forced_loglevel = NULL;</div><div class='add'>+    int ret = -1;</div><div class='ctx'> </div><div class='del'>-        if (!this)</div><div class='del'>-                return -1;</div><div class='add'>+    if (!this)</div><div class='add'>+        return ret;</div><div class='ctx'> </div><div class='del'>-        if (!this-&gt;children || this-&gt;children-&gt;next) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-                        "trace translator requires one subvolume");</div><div class='del'>-                return -1;</div><div class='del'>-        }</div><div class='del'>-        if (!this-&gt;parents) {</div><div class='del'>-                gf_log (this-&gt;name, GF_LOG_WARNING,</div><div class='del'>-                        "dangling volume. check volfile ");</div><div class='del'>-        }</div><div class='add'>+    ret = xlator_mem_acct_init(this, gf_trace_mt_end + 1);</div><div class='ctx'> </div><div class='add'>+    if (ret != 0) {</div><div class='add'>+        gf_log(this-&gt;name, GF_LOG_ERROR,</div><div class='add'>+               "Memory accounting init"</div><div class='add'>+               " failed");</div><div class='add'>+        return ret;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        options = this-&gt;options;</div><div class='del'>-        includes = data_to_str (dict_get (options, "include-ops"));</div><div class='del'>-        excludes = data_to_str (dict_get (options, "exclude-ops"));</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='ctx'> </div><div class='del'>-        {</div><div class='del'>-                int i;</div><div class='del'>-                for (i = 0; i &lt; GF_FOP_MAXVALUE; i++) {</div><div class='del'>-                        trace_fop_names[i].name = (gf_fop_list[i] ?</div><div class='del'>-                                                   gf_fop_list[i] : ":O");</div><div class='del'>-                        trace_fop_names[i].enabled = 1;</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='add'>+int</div><div class='add'>+reconfigure(xlator_t *this, dict_t *options)</div><div class='add'>+{</div><div class='add'>+    int32_t ret = -1;</div><div class='add'>+    trace_conf_t *conf = NULL;</div><div class='add'>+    char *includes = NULL, *excludes = NULL;</div><div class='ctx'> </div><div class='del'>-        if (includes &amp;&amp; excludes) {</div><div class='del'>-                gf_log (this-&gt;name,</div><div class='del'>-                        GF_LOG_ERROR,</div><div class='del'>-                        "must specify only one of 'include-ops' and 'exclude-ops'");</div><div class='del'>-                return -1;</div><div class='del'>-        }</div><div class='del'>-        if (includes)</div><div class='del'>-                process_call_list (includes, 1);</div><div class='del'>-        if (excludes)</div><div class='del'>-                process_call_list (excludes, 0);</div><div class='del'>-</div><div class='del'>-        if (dict_get (options, "force-log-level")) {</div><div class='del'>-                forced_loglevel = data_to_str (dict_get (options,</div><div class='del'>-                                               "force-log-level"));</div><div class='del'>-                if (!forced_loglevel)</div><div class='del'>-                        goto setloglevel;</div><div class='del'>-</div><div class='del'>-                if (strcmp (forced_loglevel, "NORMAL") == 0)</div><div class='del'>-                        trace_log_level = GF_LOG_NORMAL;</div><div class='del'>-                else if (strcmp (forced_loglevel, "TRACE") == 0)</div><div class='del'>-                        trace_log_level = GF_LOG_TRACE;</div><div class='del'>-                else if (strcmp (forced_loglevel, "ERROR") == 0)</div><div class='del'>-                        trace_log_level = GF_LOG_ERROR;</div><div class='del'>-                else if (strcmp (forced_loglevel, "DEBUG") == 0)</div><div class='del'>-                        trace_log_level = GF_LOG_DEBUG;</div><div class='del'>-                else if (strcmp (forced_loglevel, "WARNING") == 0)</div><div class='del'>-                        trace_log_level = GF_LOG_WARNING;</div><div class='del'>-                else if (strcmp (forced_loglevel, "CRITICAL") == 0)</div><div class='del'>-                        trace_log_level = GF_LOG_CRITICAL;</div><div class='del'>-                else if (strcmp (forced_loglevel, "NONE") == 0)</div><div class='del'>-                        trace_log_level = GF_LOG_NONE;</div><div class='add'>+    GF_VALIDATE_OR_GOTO("quick-read", this, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, this-&gt;private, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, options, out);</div><div class='add'>+</div><div class='add'>+    conf = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    includes = data_to_str(dict_get(options, "include-ops"));</div><div class='add'>+    excludes = data_to_str(dict_get(options, "exclude-ops"));</div><div class='add'>+</div><div class='add'>+    {</div><div class='add'>+        int i;</div><div class='add'>+        for (i = 0; i &lt; GF_FOP_MAXVALUE; i++) {</div><div class='add'>+            if (gf_fop_list[i])</div><div class='add'>+                strncpy(trace_fop_names[i].name, gf_fop_list[i],</div><div class='add'>+                        sizeof(trace_fop_names[i].name));</div><div class='add'>+            else</div><div class='add'>+                strncpy(trace_fop_names[i].name, ":0",</div><div class='add'>+                        sizeof(trace_fop_names[i].name));</div><div class='add'>+            trace_fop_names[i].enabled = 1;</div><div class='add'>+            trace_fop_names[i].name[sizeof(trace_fop_names[i].name) - 1] = 0;</div><div class='ctx'>         }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (includes &amp;&amp; excludes) {</div><div class='add'>+        gf_log(this-&gt;name, GF_LOG_ERROR,</div><div class='add'>+               "must specify only one of 'include-ops' and "</div><div class='add'>+               "'exclude-ops'");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (includes)</div><div class='add'>+        process_call_list(includes, 1);</div><div class='add'>+    if (excludes)</div><div class='add'>+        process_call_list(excludes, 0);</div><div class='add'>+</div><div class='add'>+    /* Should resizing of the event-history be allowed in reconfigure?</div><div class='add'>+     * for which a new event_history might have to be allocated and the</div><div class='add'>+     * older history has to be freed.</div><div class='add'>+     */</div><div class='add'>+    GF_OPTION_RECONF("log-file", conf-&gt;log_file, options, bool, out);</div><div class='add'>+</div><div class='add'>+    GF_OPTION_RECONF("log-history", conf-&gt;log_history, options, bool, out);</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+init(xlator_t *this)</div><div class='add'>+{</div><div class='add'>+    dict_t *options = NULL;</div><div class='add'>+    char *includes = NULL, *excludes = NULL;</div><div class='add'>+    char *forced_loglevel = NULL;</div><div class='add'>+    eh_t *history = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    uint64_t history_size = TRACE_DEFAULT_HISTORY_SIZE;</div><div class='add'>+    trace_conf_t *conf = NULL;</div><div class='add'>+</div><div class='add'>+    if (!this)</div><div class='add'>+        return -1;</div><div class='add'>+</div><div class='add'>+    if (!this-&gt;children || this-&gt;children-&gt;next) {</div><div class='add'>+        gf_log(this-&gt;name, GF_LOG_ERROR,</div><div class='add'>+               "trace translator requires one subvolume");</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+    if (!this-&gt;parents) {</div><div class='add'>+        gf_log(this-&gt;name, GF_LOG_WARNING, "dangling volume. check volfile ");</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    conf = GF_CALLOC(1, sizeof(trace_conf_t), gf_trace_mt_trace_conf_t);</div><div class='add'>+    if (!conf) {</div><div class='add'>+        gf_log(this-&gt;name, GF_LOG_ERROR,</div><div class='add'>+               "cannot allocate "</div><div class='add'>+               "xl-&gt;private");</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    options = this-&gt;options;</div><div class='add'>+    includes = data_to_str(dict_get(options, "include-ops"));</div><div class='add'>+    excludes = data_to_str(dict_get(options, "exclude-ops"));</div><div class='add'>+</div><div class='add'>+    {</div><div class='add'>+        int i;</div><div class='add'>+        for (i = 0; i &lt; GF_FOP_MAXVALUE; i++) {</div><div class='add'>+            if (gf_fop_list[i])</div><div class='add'>+                strncpy(trace_fop_names[i].name, gf_fop_list[i],</div><div class='add'>+                        sizeof(trace_fop_names[i].name));</div><div class='add'>+            else</div><div class='add'>+                strncpy(trace_fop_names[i].name, ":O",</div><div class='add'>+                        sizeof(trace_fop_names[i].name));</div><div class='add'>+            trace_fop_names[i].enabled = 1;</div><div class='add'>+            trace_fop_names[i].name[sizeof(trace_fop_names[i].name) - 1] = 0;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (includes &amp;&amp; excludes) {</div><div class='add'>+        gf_log(this-&gt;name, GF_LOG_ERROR,</div><div class='add'>+               "must specify only one of 'include-ops' and "</div><div class='add'>+               "'exclude-ops'");</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (includes)</div><div class='add'>+        process_call_list(includes, 1);</div><div class='add'>+    if (excludes)</div><div class='add'>+        process_call_list(excludes, 0);</div><div class='add'>+</div><div class='add'>+    GF_OPTION_INIT("history-size", history_size, size, out);</div><div class='add'>+    conf-&gt;history_size = history_size;</div><div class='add'>+</div><div class='add'>+    gf_log(this-&gt;name, GF_LOG_INFO, "history size %" PRIu64, history_size);</div><div class='add'>+</div><div class='add'>+    GF_OPTION_INIT("log-file", conf-&gt;log_file, bool, out);</div><div class='add'>+</div><div class='add'>+    gf_log(this-&gt;name, GF_LOG_INFO, "logging to file %s",</div><div class='add'>+           (conf-&gt;log_file == _gf_true) ? "enabled" : "disabled");</div><div class='add'>+</div><div class='add'>+    GF_OPTION_INIT("log-history", conf-&gt;log_history, bool, out);</div><div class='add'>+</div><div class='add'>+    gf_log(this-&gt;name, GF_LOG_DEBUG, "logging to history %s",</div><div class='add'>+           (conf-&gt;log_history == _gf_true) ? "enabled" : "disabled");</div><div class='add'>+</div><div class='add'>+    history = eh_new(history_size, _gf_false, NULL);</div><div class='add'>+    if (!history) {</div><div class='add'>+        gf_log(this-&gt;name, GF_LOG_ERROR,</div><div class='add'>+               "event history cannot be "</div><div class='add'>+               "initialized");</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    this-&gt;history = history;</div><div class='add'>+</div><div class='add'>+    conf-&gt;trace_log_level = GF_LOG_INFO;</div><div class='add'>+</div><div class='add'>+    if (dict_get(options, "force-log-level")) {</div><div class='add'>+        forced_loglevel = data_to_str(dict_get(options, "force-log-level"));</div><div class='add'>+        if (!forced_loglevel)</div><div class='add'>+            goto setloglevel;</div><div class='add'>+</div><div class='add'>+        if (strcmp(forced_loglevel, "INFO") == 0)</div><div class='add'>+            conf-&gt;trace_log_level = GF_LOG_INFO;</div><div class='add'>+        else if (strcmp(forced_loglevel, "TRACE") == 0)</div><div class='add'>+            conf-&gt;trace_log_level = GF_LOG_TRACE;</div><div class='add'>+        else if (strcmp(forced_loglevel, "ERROR") == 0)</div><div class='add'>+            conf-&gt;trace_log_level = GF_LOG_ERROR;</div><div class='add'>+        else if (strcmp(forced_loglevel, "DEBUG") == 0)</div><div class='add'>+            conf-&gt;trace_log_level = GF_LOG_DEBUG;</div><div class='add'>+        else if (strcmp(forced_loglevel, "WARNING") == 0)</div><div class='add'>+            conf-&gt;trace_log_level = GF_LOG_WARNING;</div><div class='add'>+        else if (strcmp(forced_loglevel, "CRITICAL") == 0)</div><div class='add'>+            conf-&gt;trace_log_level = GF_LOG_CRITICAL;</div><div class='add'>+        else if (strcmp(forced_loglevel, "NONE") == 0)</div><div class='add'>+            conf-&gt;trace_log_level = GF_LOG_NONE;</div><div class='add'>+    }</div><div class='ctx'> </div><div class='ctx'> setloglevel:</div><div class='del'>-        gf_log_set_loglevel (trace_log_level);</div><div class='add'>+    gf_log_set_loglevel(this-&gt;ctx, conf-&gt;trace_log_level);</div><div class='add'>+    this-&gt;private = conf;</div><div class='add'>+    ret = 0;</div><div class='add'>+out:</div><div class='add'>+    if (ret == -1) {</div><div class='add'>+        if (history)</div><div class='add'>+            GF_FREE(history);</div><div class='add'>+        if (conf)</div><div class='add'>+            GF_FREE(conf);</div><div class='add'>+    }</div><div class='ctx'> </div><div class='del'>-        return 0;</div><div class='add'>+    return ret;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> void</div><div class='del'>-fini (xlator_t *this)</div><div class='add'>+fini(xlator_t *this)</div><div class='ctx'> {</div><div class='del'>-        if (!this)</div><div class='del'>-                return;</div><div class='del'>-</div><div class='del'>-        gf_log (this-&gt;name, GF_LOG_NORMAL,</div><div class='del'>-                "trace translator unloaded");</div><div class='add'>+    if (!this)</div><div class='ctx'>         return;</div><div class='add'>+</div><div class='add'>+    if (this-&gt;history)</div><div class='add'>+        eh_destroy(this-&gt;history);</div><div class='add'>+</div><div class='add'>+    gf_log(this-&gt;name, GF_LOG_INFO, "trace translator unloaded");</div><div class='add'>+    return;</div><div class='ctx'> }</div><div class='ctx'> </div><div class='ctx'> struct xlator_fops fops = {</div><div class='del'>-        .stat        = trace_stat,</div><div class='del'>-        .readlink    = trace_readlink,</div><div class='del'>-        .mknod       = trace_mknod,</div><div class='del'>-        .mkdir       = trace_mkdir,</div><div class='del'>-        .unlink      = trace_unlink,</div><div class='del'>-        .rmdir       = trace_rmdir,</div><div class='del'>-        .symlink     = trace_symlink,</div><div class='del'>-        .rename      = trace_rename,</div><div class='del'>-        .link        = trace_link,</div><div class='del'>-        .truncate    = trace_truncate,</div><div class='del'>-        .open        = trace_open,</div><div class='del'>-        .readv       = trace_readv,</div><div class='del'>-        .writev      = trace_writev,</div><div class='del'>-        .statfs      = trace_statfs,</div><div class='del'>-        .flush       = trace_flush,</div><div class='del'>-        .fsync       = trace_fsync,</div><div class='del'>-        .setxattr    = trace_setxattr,</div><div class='del'>-        .getxattr    = trace_getxattr,</div><div class='del'>-        .removexattr = trace_removexattr,</div><div class='del'>-        .opendir     = trace_opendir,</div><div class='del'>-        .readdir     = trace_readdir,</div><div class='del'>-        .readdirp    = trace_readdirp,</div><div class='del'>-        .fsyncdir    = trace_fsyncdir,</div><div class='del'>-        .access      = trace_access,</div><div class='del'>-        .ftruncate   = trace_ftruncate,</div><div class='del'>-        .fstat       = trace_fstat,</div><div class='del'>-        .create      = trace_create,</div><div class='del'>-        .lk          = trace_lk,</div><div class='del'>-        .inodelk     = trace_inodelk,</div><div class='del'>-        .finodelk    = trace_finodelk,</div><div class='del'>-        .entrylk     = trace_entrylk,</div><div class='del'>-        .lookup      = trace_lookup,</div><div class='del'>-        .xattrop     = trace_xattrop,</div><div class='del'>-        .fxattrop    = trace_fxattrop,</div><div class='del'>-        .setattr     = trace_setattr,</div><div class='del'>-        .fsetattr    = trace_fsetattr,</div><div class='add'>+    .stat = trace_stat,</div><div class='add'>+    .readlink = trace_readlink,</div><div class='add'>+    .mknod = trace_mknod,</div><div class='add'>+    .mkdir = trace_mkdir,</div><div class='add'>+    .unlink = trace_unlink,</div><div class='add'>+    .rmdir = trace_rmdir,</div><div class='add'>+    .symlink = trace_symlink,</div><div class='add'>+    .rename = trace_rename,</div><div class='add'>+    .link = trace_link,</div><div class='add'>+    .truncate = trace_truncate,</div><div class='add'>+    .open = trace_open,</div><div class='add'>+    .readv = trace_readv,</div><div class='add'>+    .writev = trace_writev,</div><div class='add'>+    .statfs = trace_statfs,</div><div class='add'>+    .flush = trace_flush,</div><div class='add'>+    .fsync = trace_fsync,</div><div class='add'>+    .setxattr = trace_setxattr,</div><div class='add'>+    .getxattr = trace_getxattr,</div><div class='add'>+    .fsetxattr = trace_fsetxattr,</div><div class='add'>+    .fgetxattr = trace_fgetxattr,</div><div class='add'>+    .removexattr = trace_removexattr,</div><div class='add'>+    .opendir = trace_opendir,</div><div class='add'>+    .readdir = trace_readdir,</div><div class='add'>+    .readdirp = trace_readdirp,</div><div class='add'>+    .fsyncdir = trace_fsyncdir,</div><div class='add'>+    .access = trace_access,</div><div class='add'>+    .ftruncate = trace_ftruncate,</div><div class='add'>+    .fstat = trace_fstat,</div><div class='add'>+    .create = trace_create,</div><div class='add'>+    .lk = trace_lk,</div><div class='add'>+    .inodelk = trace_inodelk,</div><div class='add'>+    .finodelk = trace_finodelk,</div><div class='add'>+    .entrylk = trace_entrylk,</div><div class='add'>+    .fentrylk = trace_fentrylk,</div><div class='add'>+    .lookup = trace_lookup,</div><div class='add'>+    .rchecksum = trace_rchecksum,</div><div class='add'>+    .xattrop = trace_xattrop,</div><div class='add'>+    .fxattrop = trace_fxattrop,</div><div class='add'>+    .setattr = trace_setattr,</div><div class='add'>+    .fsetattr = trace_fsetattr,</div><div class='add'>+    .seek = trace_seek,</div><div class='ctx'> };</div><div class='ctx'> </div><div class='del'>-</div><div class='ctx'> struct xlator_cbks cbks = {</div><div class='add'>+    .release = trace_release,</div><div class='add'>+    .releasedir = trace_releasedir,</div><div class='add'>+    .forget = trace_forget,</div><div class='ctx'> };</div><div class='ctx'> </div><div class='ctx'> struct volume_options options[] = {</div><div class='del'>-        { .key  = {"include-ops", "include"},</div><div class='del'>-          .type = GF_OPTION_TYPE_STR,</div><div class='del'>-          /*.value = { ""} */</div><div class='del'>-        },</div><div class='del'>-        { .key  = {"exclude-ops", "exclude"},</div><div class='del'>-          .type = GF_OPTION_TYPE_STR</div><div class='del'>-          /*.value = { ""} */</div><div class='del'>-        },</div><div class='del'>-        { .key  = {NULL} },</div><div class='add'>+    {</div><div class='add'>+        .key = {"include-ops", "include"},</div><div class='add'>+        .type = GF_OPTION_TYPE_STR,</div><div class='add'>+        /*.value = { ""} */</div><div class='add'>+    },</div><div class='add'>+    {</div><div class='add'>+        .key = {"exclude-ops", "exclude"},</div><div class='add'>+        .type = GF_OPTION_TYPE_STR</div><div class='add'>+        /*.value = { ""} */</div><div class='add'>+    },</div><div class='add'>+    {</div><div class='add'>+        .key = {"history-size"},</div><div class='add'>+        .type = GF_OPTION_TYPE_SIZET,</div><div class='add'>+        .default_value = "1024",</div><div class='add'>+    },</div><div class='add'>+    {</div><div class='add'>+        .key = {"log-file"},</div><div class='add'>+        .type = GF_OPTION_TYPE_BOOL,</div><div class='add'>+        .default_value = "no",</div><div class='add'>+    },</div><div class='add'>+    {</div><div class='add'>+        .key = {"log-history"},</div><div class='add'>+        .type = GF_OPTION_TYPE_BOOL,</div><div class='add'>+        .default_value = "no",</div><div class='add'>+    },</div><div class='add'>+    {.key = {NULL}},</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct xlator_dumpops dumpops = {.history = trace_dump_history};</div><div class='add'>+</div><div class='add'>+xlator_api_t xlator_api = {</div><div class='add'>+    .init = init,</div><div class='add'>+    .fini = fini,</div><div class='add'>+    .reconfigure = reconfigure,</div><div class='add'>+    .mem_acct_init = mem_acct_init,</div><div class='add'>+    .op_version = {1},</div><div class='add'>+    .dumpops = &amp;dumpops,</div><div class='add'>+    .fops = &amp;fops,</div><div class='add'>+    .cbks = &amp;cbks,</div><div class='add'>+    .options = options,</div><div class='add'>+    .identifier = "trace",</div><div class='add'>+    .category = GF_TECH_PREVIEW,</div><div class='ctx'> };</div><div class='head'>diff --git a/xlators/debug/trace/src/trace.h b/xlators/debug/trace/src/trace.h<br/>new file mode 100644<br/>index 00000000000..b16304799da<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/xlators/debug/trace/src/trace.h?id=d1d7a6f35c816822fab51c820e25023863c239c1'>xlators/debug/trace/src/trace.h</a></div><div class='hunk'>@@ -0,0 +1,55 @@</div><div class='add'>+/*</div><div class='add'>+   Copyright (c) 2006-2012 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+   This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+   This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+   General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+   later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+   cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#include &lt;time.h&gt;</div><div class='add'>+#include &lt;errno.h&gt;</div><div class='add'>+#include &lt;glusterfs/glusterfs.h&gt;</div><div class='add'>+#include &lt;glusterfs/xlator.h&gt;</div><div class='add'>+#include &lt;glusterfs/common-utils.h&gt;</div><div class='add'>+#include &lt;glusterfs/event-history.h&gt;</div><div class='add'>+#include &lt;glusterfs/logging.h&gt;</div><div class='add'>+#include &lt;glusterfs/circ-buff.h&gt;</div><div class='add'>+#include &lt;glusterfs/statedump.h&gt;</div><div class='add'>+#include &lt;glusterfs/options.h&gt;</div><div class='add'>+</div><div class='add'>+#define TRACE_DEFAULT_HISTORY_SIZE 1024</div><div class='add'>+</div><div class='add'>+typedef struct {</div><div class='add'>+    /* Since the longest fop name is fremovexattr i.e 12 characters, array size</div><div class='add'>+     * is kept 24, i.e double of the maximum.</div><div class='add'>+     */</div><div class='add'>+    char name[24];</div><div class='add'>+    int enabled;</div><div class='add'>+} trace_fop_name_t;</div><div class='add'>+</div><div class='add'>+trace_fop_name_t trace_fop_names[GF_FOP_MAXVALUE];</div><div class='add'>+</div><div class='add'>+typedef struct {</div><div class='add'>+    gf_boolean_t log_file;</div><div class='add'>+    gf_boolean_t log_history;</div><div class='add'>+    uint64_t history_size;</div><div class='add'>+    int trace_log_level;</div><div class='add'>+} trace_conf_t;</div><div class='add'>+</div><div class='add'>+#define TRACE_STACK_UNWIND(op, frame, params...)                               \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        frame-&gt;local = NULL;                                                   \</div><div class='add'>+        STACK_UNWIND_STRICT(op, frame, params);                                \</div><div class='add'>+    } while (0);</div><div class='add'>+</div><div class='add'>+#define LOG_ELEMENT(_conf, _string)                                            \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        if (_conf) {                                                           \</div><div class='add'>+            if ((_conf-&gt;log_history) == _gf_true)                              \</div><div class='add'>+                gf_log_eh("%s", _string);                                      \</div><div class='add'>+            if ((_conf-&gt;log_file) == _gf_true)                                 \</div><div class='add'>+                gf_log(THIS-&gt;name, _conf-&gt;trace_log_level, "%s", _string);     \</div><div class='add'>+        }                                                                      \</div><div class='add'>+    } while (0);</div><div class='head'>diff --git a/xlators/encryption/Makefile.am b/xlators/encryption/Makefile.am<br/>deleted file mode 100644<br/>index 2cbde680fac..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/xlators/encryption/Makefile.am?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/encryption/Makefile.am</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,3 +0,0 @@</div><div class='del'>-SUBDIRS = rot-13</div><div class='del'>-</div><div class='del'>-CLEANFILES = </div><div class='head'>diff --git a/xlators/encryption/rot-13/Makefile.am b/xlators/encryption/rot-13/Makefile.am<br/>deleted file mode 100644<br/>index d471a3f9243..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/xlators/encryption/rot-13/Makefile.am?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/encryption/rot-13/Makefile.am</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,3 +0,0 @@</div><div class='del'>-SUBDIRS = src</div><div class='del'>-</div><div class='del'>-CLEANFILES = </div><div class='head'>diff --git a/xlators/encryption/rot-13/src/rot-13.c b/xlators/encryption/rot-13/src/rot-13.c<br/>deleted file mode 100644<br/>index 9d5dab03307..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/xlators/encryption/rot-13/src/rot-13.c?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/encryption/rot-13/src/rot-13.c</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,205 +0,0 @@</div><div class='del'>-/*</div><div class='del'>-  Copyright (c) 2006-2009 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='del'>-  This file is part of GlusterFS.</div><div class='del'>-</div><div class='del'>-  GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-  it under the terms of the GNU General Public License as published</div><div class='del'>-  by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-  or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-  GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-  WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-  General Public License for more details.</div><div class='del'>-</div><div class='del'>-  You should have received a copy of the GNU General Public License</div><div class='del'>-  along with this program.  If not, see</div><div class='del'>-  &lt;http://www.gnu.org/licenses/&gt;.</div><div class='del'>-*/</div><div class='del'>-</div><div class='del'>-#include &lt;ctype.h&gt;</div><div class='del'>-#include &lt;sys/uio.h&gt;</div><div class='del'>-</div><div class='del'>-#ifndef _CONFIG_H</div><div class='del'>-#define _CONFIG_H</div><div class='del'>-#include "config.h"</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-#include "glusterfs.h"</div><div class='del'>-#include "xlator.h"</div><div class='del'>-#include "logging.h"</div><div class='del'>-</div><div class='del'>-#include "rot-13.h"</div><div class='del'>-</div><div class='del'>-/*</div><div class='del'>- * This is a rot13 ``encryption'' xlator. It rot13's data when </div><div class='del'>- * writing to disk and rot13's it back when reading it. </div><div class='del'>- * This xlator is meant as an example, NOT FOR PRODUCTION</div><div class='del'>- * USE ;) (hence no error-checking)</div><div class='del'>- */</div><div class='del'>-</div><div class='del'>-void </div><div class='del'>-rot13 (char *buf, int len)</div><div class='del'>-{</div><div class='del'>-	int i;</div><div class='del'>-	for (i = 0; i &lt; len; i++) {</div><div class='del'>-		if (buf[i] &gt;= 'a' &amp;&amp; buf[i] &lt;= 'z')</div><div class='del'>-			buf[i] = 'a' + ((buf[i] - 'a' + 13) % 26);</div><div class='del'>-		else if (buf[i] &gt;= 'A' &amp;&amp; buf[i] &lt;= 'Z')</div><div class='del'>-			buf[i] = 'A' + ((buf[i] - 'A' + 13) % 26);</div><div class='del'>-	}</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-void</div><div class='del'>-rot13_iovec (struct iovec *vector, int count)</div><div class='del'>-{</div><div class='del'>-	int i;</div><div class='del'>-	for (i = 0; i &lt; count; i++) {</div><div class='del'>-		rot13 (vector[i].iov_base, vector[i].iov_len);</div><div class='del'>-	}</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-rot13_readv_cbk (call_frame_t *frame,</div><div class='del'>-                 void *cookie,</div><div class='del'>-                 xlator_t *this,</div><div class='del'>-                 int32_t op_ret,</div><div class='del'>-                 int32_t op_errno,</div><div class='del'>-                 struct iovec *vector,</div><div class='del'>-                 int32_t count,</div><div class='del'>-		 struct iatt *stbuf,</div><div class='del'>-                 struct iobref *iobref)</div><div class='del'>-{</div><div class='del'>-	rot_13_private_t *priv = (rot_13_private_t *)this-&gt;private;</div><div class='del'>-  </div><div class='del'>-	if (priv-&gt;decrypt_read)</div><div class='del'>-		rot13_iovec (vector, count);</div><div class='del'>-</div><div class='del'>-	STACK_UNWIND_STRICT (readv, frame, op_ret, op_errno, vector, count, stbuf, iobref);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-rot13_readv (call_frame_t *frame,</div><div class='del'>-             xlator_t *this,</div><div class='del'>-             fd_t *fd,</div><div class='del'>-             size_t size,</div><div class='del'>-             off_t offset)</div><div class='del'>-{</div><div class='del'>-	STACK_WIND (frame,</div><div class='del'>-		    rot13_readv_cbk,</div><div class='del'>-		    FIRST_CHILD (this),</div><div class='del'>-		    FIRST_CHILD (this)-&gt;fops-&gt;readv,</div><div class='del'>-		    fd, size, offset);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-rot13_writev_cbk (call_frame_t *frame,</div><div class='del'>-                  void *cookie,</div><div class='del'>-                  xlator_t *this,</div><div class='del'>-                  int32_t op_ret,</div><div class='del'>-                  int32_t op_errno,</div><div class='del'>-                  struct iatt *prebuf,</div><div class='del'>-		  struct iatt *postbuf)</div><div class='del'>-{</div><div class='del'>-	STACK_UNWIND_STRICT (writev, frame, op_ret, op_errno, prebuf, postbuf);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-rot13_writev (call_frame_t *frame,</div><div class='del'>-              xlator_t *this,</div><div class='del'>-              fd_t *fd,</div><div class='del'>-              struct iovec *vector,</div><div class='del'>-              int32_t count, </div><div class='del'>-              off_t offset,</div><div class='del'>-              struct iobref *iobref)</div><div class='del'>-{</div><div class='del'>-	rot_13_private_t *priv = (rot_13_private_t *)this-&gt;private;</div><div class='del'>-	if (priv-&gt;encrypt_write)</div><div class='del'>-		rot13_iovec (vector, count);</div><div class='del'>-</div><div class='del'>-	STACK_WIND (frame, </div><div class='del'>-		    rot13_writev_cbk,</div><div class='del'>-		    FIRST_CHILD (this),</div><div class='del'>-		    FIRST_CHILD (this)-&gt;fops-&gt;writev,</div><div class='del'>-		    fd, vector, count, offset,</div><div class='del'>-                    iobref);</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-init (xlator_t *this)</div><div class='del'>-{</div><div class='del'>-	data_t *data = NULL;</div><div class='del'>-	rot_13_private_t *priv = NULL;</div><div class='del'>-</div><div class='del'>-	if (!this-&gt;children || this-&gt;children-&gt;next) {</div><div class='del'>-		gf_log ("rot13", GF_LOG_ERROR, </div><div class='del'>-			"FATAL: rot13 should have exactly one child");</div><div class='del'>-		return -1;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	if (!this-&gt;parents) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_WARNING,</div><div class='del'>-			"dangling volume. check volfile ");</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	priv = GF_CALLOC (sizeof (rot_13_private_t), 1, 0);</div><div class='del'>-        if (!priv)</div><div class='del'>-                return -1;</div><div class='del'>-</div><div class='del'>-	priv-&gt;decrypt_read = 1;</div><div class='del'>-	priv-&gt;encrypt_write = 1;</div><div class='del'>-</div><div class='del'>-	data = dict_get (this-&gt;options, "encrypt-write");</div><div class='del'>-	if (data) {</div><div class='del'>-		if (gf_string2boolean (data-&gt;data, &amp;priv-&gt;encrypt_write) == -1) {</div><div class='del'>-			gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-				"encrypt-write takes only boolean options");</div><div class='del'>-			return -1;</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	data = dict_get (this-&gt;options, "decrypt-read");</div><div class='del'>-	if (data) {</div><div class='del'>-		if (gf_string2boolean (data-&gt;data, &amp;priv-&gt;decrypt_read) == -1) {</div><div class='del'>-			gf_log (this-&gt;name, GF_LOG_ERROR,</div><div class='del'>-				"decrypt-read takes only boolean options");</div><div class='del'>-			return -1;</div><div class='del'>-		}</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-	this-&gt;private = priv;</div><div class='del'>-	gf_log ("rot13", GF_LOG_DEBUG, "rot13 xlator loaded");</div><div class='del'>-	return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-void</div><div class='del'>-fini (xlator_t *this)</div><div class='del'>-{</div><div class='del'>-	rot_13_private_t *priv = this-&gt;private;</div><div class='del'>-</div><div class='del'>-	GF_FREE (priv);</div><div class='del'>-</div><div class='del'>-	return;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-struct xlator_fops fops = {</div><div class='del'>-	.readv        = rot13_readv,</div><div class='del'>-	.writev       = rot13_writev</div><div class='del'>-};</div><div class='del'>-</div><div class='del'>-struct xlator_cbks cbks = {</div><div class='del'>-};</div><div class='del'>-</div><div class='del'>-struct volume_options options[] = {</div><div class='del'>-	{ .key  = {"encrypt-write"}, </div><div class='del'>-	  .type = GF_OPTION_TYPE_BOOL</div><div class='del'>-	},</div><div class='del'>-	{ .key  = {"decrypt-read"}, </div><div class='del'>-	  .type = GF_OPTION_TYPE_BOOL </div><div class='del'>-	},</div><div class='del'>-	{ .key  = {NULL} },</div><div class='del'>-};</div><div class='head'>diff --git a/xlators/encryption/rot-13/src/rot-13.h b/xlators/encryption/rot-13/src/rot-13.h<br/>deleted file mode 100644<br/>index 35a2df2da29..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/xlators/encryption/rot-13/src/rot-13.h?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/encryption/rot-13/src/rot-13.h</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,33 +0,0 @@</div><div class='del'>-/*</div><div class='del'>-   Copyright (c) 2006-2009 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='del'>-   This file is part of GlusterFS.</div><div class='del'>-</div><div class='del'>-   GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-   it under the terms of the GNU General Public License as published</div><div class='del'>-   by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-   or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-   GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-   WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-   General Public License for more details.</div><div class='del'>-</div><div class='del'>-   You should have received a copy of the GNU General Public License</div><div class='del'>-   along with this program.  If not, see</div><div class='del'>-   &lt;http://www.gnu.org/licenses/&gt;.</div><div class='del'>-*/</div><div class='del'>-</div><div class='del'>-#ifndef __ROT_13_H__</div><div class='del'>-#define __ROT_13_H__</div><div class='del'>-</div><div class='del'>-#ifndef _CONFIG_H</div><div class='del'>-#define _CONFIG_H</div><div class='del'>-#include "config.h"</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-typedef struct {</div><div class='del'>-	gf_boolean_t encrypt_write;</div><div class='del'>-	gf_boolean_t decrypt_read;</div><div class='del'>-} rot_13_private_t;</div><div class='del'>-</div><div class='del'>-#endif /* __ROT_13_H__ */</div><div class='head'>diff --git a/xlators/features/Makefile.am b/xlators/features/Makefile.am<br/>index 6496f3ab0c9..c57897f11ea 100644<br/>--- a/<a href='/cgit/glusterfs.git/tree/xlators/features/Makefile.am?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/Makefile.am</a><br/>+++ b/<a href='/cgit/glusterfs.git/tree/xlators/features/Makefile.am?id=d1d7a6f35c816822fab51c820e25023863c239c1'>xlators/features/Makefile.am</a></div><div class='hunk'>@@ -1,3 +1,14 @@</div><div class='del'>-SUBDIRS = locks trash quota read-only access-control mac-compat #path-converter # filter</div><div class='add'>+if BUILD_CLOUDSYNC</div><div class='add'>+  CLOUDSYNC_DIR = cloudsync</div><div class='add'>+endif</div><div class='ctx'> </div><div class='del'>-CLEANFILES = </div><div class='add'>+if BUILD_METADISP</div><div class='add'>+  METADISP_DIR = metadisp</div><div class='add'>+endif</div><div class='add'>+</div><div class='add'>+SUBDIRS = locks quota read-only quiesce marker index barrier arbiter upcall \</div><div class='add'>+	compress changelog gfid-access snapview-client snapview-server trash \</div><div class='add'>+	shard bit-rot leases selinux sdfs namespace $(CLOUDSYNC_DIR) thin-arbiter \</div><div class='add'>+	utime $(METADISP_DIR)</div><div class='add'>+</div><div class='add'>+CLEANFILES =</div><div class='head'>diff --git a/xlators/features/access-control/src/Makefile.am b/xlators/features/access-control/src/Makefile.am<br/>deleted file mode 100644<br/>index 6ab8cc4ec4e..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/xlators/features/access-control/src/Makefile.am?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/access-control/src/Makefile.am</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,13 +0,0 @@</div><div class='del'>-xlator_LTLIBRARIES = access-control.la</div><div class='del'>-xlatordir = $(libdir)/glusterfs/$(PACKAGE_VERSION)/xlator/features</div><div class='del'>-access_control_la_LDFLAGS = -module -avoidversion</div><div class='del'>-access_control_la_SOURCES = access-control.c</div><div class='del'>-access_control_la_LIBADD = $(top_builddir)/libglusterfs/src/libglusterfs.la</div><div class='del'>-</div><div class='del'>-noinst_HEADERS = access-control.h</div><div class='del'>-</div><div class='del'>-AM_CFLAGS = -fPIC -D_FILE_OFFSET_BITS=64 -D_GNU_SOURCE -Wall -D$(GF_HOST_OS)\</div><div class='del'>-	-I$(top_srcdir)/libglusterfs/src -shared -nostartfiles $(GF_CFLAGS)\</div><div class='del'>-	-L$(xlatordir)/</div><div class='del'>-</div><div class='del'>-CLEANFILES =</div><div class='head'>diff --git a/xlators/features/access-control/src/access-control.c b/xlators/features/access-control/src/access-control.c<br/>deleted file mode 100644<br/>index b659a013309..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/xlators/features/access-control/src/access-control.c?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/access-control/src/access-control.c</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,1846 +0,0 @@</div><div class='del'>-/*</div><div class='del'>-  Copyright (c) 2010 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='del'>-  This file is part of GlusterFS.</div><div class='del'>-</div><div class='del'>-  GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-  it under the terms of the GNU General Public License as published</div><div class='del'>-  by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-  or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-  GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-  WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-  General Public License for more details.</div><div class='del'>-</div><div class='del'>-  You should have received a copy of the GNU General Public License</div><div class='del'>-  along with this program.  If not, see</div><div class='del'>-  &lt;http://www.gnu.org/licenses/&gt;.</div><div class='del'>-*/</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-#ifndef _CONFIG_H</div><div class='del'>-#define _CONFIG_H</div><div class='del'>-#include "config.h"</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-#include "access-control.h"</div><div class='del'>-#include "xlator.h"</div><div class='del'>-#include "call-stub.h"</div><div class='del'>-#include "defaults.h"</div><div class='del'>-#include "iatt.h"</div><div class='del'>-</div><div class='del'>-/* Careful, this function erases the stub from frame-&gt;local. Dont call this if</div><div class='del'>- * a subsequent callback requires retaining access to the stub. This should be</div><div class='del'>- * called at the end of all access-control related operations, i.e. once the</div><div class='del'>- * frame will be handed off to the actual fop and the next callback that will</div><div class='del'>- * be called is the default callback. IOW, the function where call_resume is</div><div class='del'>- * called.</div><div class='del'>- * NOTE: this is required because FRAME_DESTROY tries to free frame-&gt;local if</div><div class='del'>- * it finds it to be non-NULL.</div><div class='del'>- */</div><div class='del'>-call_stub_t *</div><div class='del'>-__get_frame_stub (call_frame_t *fr)</div><div class='del'>-{</div><div class='del'>-        call_stub_t     *st = NULL;</div><div class='del'>-</div><div class='del'>-        if (!fr)</div><div class='del'>-                return NULL;</div><div class='del'>-</div><div class='del'>-        st = fr-&gt;local;</div><div class='del'>-        fr-&gt;local = NULL;</div><div class='del'>-</div><div class='del'>-        return st;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-ac_test_owner_access (struct iatt *ia, uid_t uid, int accesstest)</div><div class='del'>-{</div><div class='del'>-        int     ret = -1;</div><div class='del'>-</div><div class='del'>-        if (!ia)</div><div class='del'>-                return -1;</div><div class='del'>-</div><div class='del'>-        /* First test permissions using the uid. */</div><div class='del'>-        if (ia-&gt;ia_uid != uid) {</div><div class='del'>-                ret = -1;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        /* At this point we know, the uid matches that of the stat structure, so</div><div class='del'>-         * if the caller does not care, we should return success.</div><div class='del'>-         */</div><div class='del'>-        if (ac_test_dontcare (accesstest)) {</div><div class='del'>-                ret = 0;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (ac_test_read (accesstest))</div><div class='del'>-                ret = IA_PROT_RUSR (ia-&gt;ia_prot);</div><div class='del'>-</div><div class='del'>-        if (ac_test_write (accesstest))</div><div class='del'>-                ret = IA_PROT_WUSR (ia-&gt;ia_prot);</div><div class='del'>-</div><div class='del'>-        if (ac_test_exec (accesstest))</div><div class='del'>-                ret = IA_PROT_XUSR (ia-&gt;ia_prot);</div><div class='del'>-</div><div class='del'>-        /* For failed access test for owner, we need to return EACCES */</div><div class='del'>-        if (!ret)</div><div class='del'>-                ret = -1;</div><div class='del'>-        else</div><div class='del'>-                ret = 0;</div><div class='del'>-out:</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-ac_test_group_access (struct iatt *ia, gid_t gid, gid_t *auxgids, int auxcount,</div><div class='del'>-                      int accesstest)</div><div class='del'>-{</div><div class='del'>-        int     ret = -1;</div><div class='del'>-        int     testgid = -1;</div><div class='del'>-        int     x = 0;</div><div class='del'>-</div><div class='del'>-        if (!ia)</div><div class='del'>-                return -1;</div><div class='del'>-        /* First, determine which gid to test against. This will be determined</div><div class='del'>-         * by first checking which of the gids given to us match the gid in the</div><div class='del'>-         * stat. If none match, then we go to checking with others as the user.</div><div class='del'>-         */</div><div class='del'>-</div><div class='del'>-        /* If we are only given the primary gid. Dont depend on @auxgids</div><div class='del'>-         * being NULL since I know users of this function can pass statically</div><div class='del'>-         * allocated arrays which cant be NULL and yet contain no valid gids.</div><div class='del'>-         */</div><div class='del'>-</div><div class='del'>-        if ((ia-&gt;ia_gid != gid) &amp;&amp; (auxcount == 0)) {</div><div class='del'>-                ret = -1;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (ia-&gt;ia_gid == gid)</div><div class='del'>-                testgid = gid;</div><div class='del'>-        else {</div><div class='del'>-                for (; x &lt; auxcount; ++x) {</div><div class='del'>-                        if (ia-&gt;ia_gid == auxgids[x]) {</div><div class='del'>-                                testgid = ia-&gt;ia_gid;</div><div class='del'>-                                break;</div><div class='del'>-                        }</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        /* None of the gids match with the gid in the stat. */</div><div class='del'>-        if (testgid == -1) {</div><div class='del'>-                ret = -1;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        /* At this point, at least one gid matches that in the stat, now we must</div><div class='del'>-         * check whether the caller is interested in the access check at all.</div><div class='del'>-         */</div><div class='del'>-        if (ac_test_dontcare (accesstest)) {</div><div class='del'>-                ret = 0;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (ac_test_read (accesstest))</div><div class='del'>-                ret = IA_PROT_RGRP (ia-&gt;ia_prot);</div><div class='del'>-</div><div class='del'>-        if (ac_test_write (accesstest))</div><div class='del'>-                ret = IA_PROT_WGRP (ia-&gt;ia_prot);</div><div class='del'>-</div><div class='del'>-        if (ac_test_exec (accesstest))</div><div class='del'>-                ret = IA_PROT_XGRP (ia-&gt;ia_prot);</div><div class='del'>-</div><div class='del'>-        if (!ret)</div><div class='del'>-                ret = -1;</div><div class='del'>-        else</div><div class='del'>-                ret = 0;</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-ac_test_other_access (struct iatt *ia, int accesstest)</div><div class='del'>-{</div><div class='del'>-        int     ret = 0;</div><div class='del'>-</div><div class='del'>-        if (!ia)</div><div class='del'>-                return -1;</div><div class='del'>-</div><div class='del'>-        if (ac_test_read (accesstest))</div><div class='del'>-                ret = IA_PROT_ROTH (ia-&gt;ia_prot);</div><div class='del'>-</div><div class='del'>-        if (ac_test_write (accesstest))</div><div class='del'>-                ret = IA_PROT_WOTH (ia-&gt;ia_prot);</div><div class='del'>-</div><div class='del'>-        if (ac_test_exec (accesstest))</div><div class='del'>-                ret = IA_PROT_XOTH (ia-&gt;ia_prot);</div><div class='del'>-</div><div class='del'>-        if (!ret)</div><div class='del'>-                ret = -1;</div><div class='del'>-        else</div><div class='del'>-                ret = 0;</div><div class='del'>-</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-/* Returns -1 on a failed access test with @operrno set to the relevant error</div><div class='del'>- * number.</div><div class='del'>- */</div><div class='del'>-int</div><div class='del'>-ac_test_access (struct iatt *ia, uid_t uid, gid_t gid, gid_t *auxgids,</div><div class='del'>-                int auxcount, int accesstest, int testwho, int *operrno)</div><div class='del'>-{</div><div class='del'>-        int             ret = -1;</div><div class='del'>-</div><div class='del'>-        if ((!ia) || (!operrno))</div><div class='del'>-                return -1;</div><div class='del'>-</div><div class='del'>-        if ((uid == 0) &amp;&amp; (gid == 0)) {</div><div class='del'>-                gf_log (ACTRL, GF_LOG_TRACE, "Root has access");</div><div class='del'>-                return 0;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (ac_test_owner (testwho)) {</div><div class='del'>-                gf_log (ACTRL, GF_LOG_TRACE, "Testing owner access");</div><div class='del'>-                ret = ac_test_owner_access (ia, uid, accesstest);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (ret == 0) {</div><div class='del'>-                gf_log (ACTRL, GF_LOG_TRACE, "Owner has access");</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (ac_test_group (testwho)) {</div><div class='del'>-                gf_log (ACTRL, GF_LOG_TRACE, "Testing group access");</div><div class='del'>-                ret = ac_test_group_access (ia, gid, auxgids, auxcount,</div><div class='del'>-                                            accesstest);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (ret == 0) {</div><div class='del'>-                gf_log (ACTRL, GF_LOG_TRACE, "Group has access");</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (ac_test_other (testwho)) {</div><div class='del'>-                gf_log (ACTRL, GF_LOG_TRACE, "Testing other access");</div><div class='del'>-                ret = ac_test_other_access (ia, accesstest);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (ret == 0)</div><div class='del'>-                gf_log (ACTRL, GF_LOG_TRACE, "Other has access");</div><div class='del'>-out:</div><div class='del'>-        if (ret == -1) {</div><div class='del'>-                gf_log (ACTRL, GF_LOG_TRACE, "No access allowed");</div><div class='del'>-                *operrno = EPERM;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-ac_loc_fill (loc_t *loc, inode_t *inode, inode_t *parent, char *path)</div><div class='del'>-{</div><div class='del'>-        int     ret = -EFAULT;</div><div class='del'>-</div><div class='del'>-        if (!loc)</div><div class='del'>-                return ret;</div><div class='del'>-</div><div class='del'>-        if (inode) {</div><div class='del'>-                loc-&gt;inode = inode_ref (inode);</div><div class='del'>-                loc-&gt;ino = inode-&gt;ino;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (parent)</div><div class='del'>-                loc-&gt;parent = inode_ref (parent);</div><div class='del'>-</div><div class='del'>-        loc-&gt;path = gf_strdup (path);</div><div class='del'>-        if (!loc-&gt;path) {</div><div class='del'>-                gf_log (ACTRL, GF_LOG_ERROR, "strdup failed");</div><div class='del'>-                goto loc_wipe;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        loc-&gt;name = strrchr (loc-&gt;path, '/');</div><div class='del'>-        if (loc-&gt;name)</div><div class='del'>-                loc-&gt;name++;</div><div class='del'>-        else</div><div class='del'>-                goto loc_wipe;</div><div class='del'>-</div><div class='del'>-        ret = 0;</div><div class='del'>-loc_wipe:</div><div class='del'>-        if (ret &lt; 0)</div><div class='del'>-                loc_wipe (loc);</div><div class='del'>-</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-ac_inode_loc_fill (inode_t *inode, loc_t *loc)</div><div class='del'>-{</div><div class='del'>-        char            *resolvedpath = NULL;</div><div class='del'>-        inode_t         *parent = NULL;</div><div class='del'>-        int             ret = -EFAULT;</div><div class='del'>-</div><div class='del'>-        if ((!inode) || (!loc))</div><div class='del'>-                return ret;</div><div class='del'>-</div><div class='del'>-        if ((inode) &amp;&amp; (inode-&gt;ino == 1))</div><div class='del'>-                goto ignore_parent;</div><div class='del'>-</div><div class='del'>-        parent = inode_parent (inode, 0, NULL);</div><div class='del'>-        if (!parent)</div><div class='del'>-                goto err;</div><div class='del'>-</div><div class='del'>-ignore_parent:</div><div class='del'>-        ret = inode_path (inode, NULL, &amp;resolvedpath);</div><div class='del'>-        if (ret &lt; 0)</div><div class='del'>-                goto err;</div><div class='del'>-</div><div class='del'>-        ret = ac_loc_fill (loc, inode, parent, resolvedpath);</div><div class='del'>-        if (ret &lt; 0)</div><div class='del'>-                goto err;</div><div class='del'>-</div><div class='del'>-err:</div><div class='del'>-        if (parent)</div><div class='del'>-                inode_unref (parent);</div><div class='del'>-</div><div class='del'>-        if (resolvedpath)</div><div class='del'>-                GF_FREE (resolvedpath);</div><div class='del'>-</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-ac_parent_loc_fill (loc_t *parentloc, loc_t *childloc)</div><div class='del'>-{</div><div class='del'>-        if ((!parentloc) || (!childloc))</div><div class='del'>-                return -1;</div><div class='del'>-</div><div class='del'>-        return ac_inode_loc_fill (childloc-&gt;parent, parentloc);</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-ac_truncate_resume (call_frame_t *frame, xlator_t *this, loc_t *loc,</div><div class='del'>-                    off_t offset)</div><div class='del'>-{</div><div class='del'>-        STACK_WIND (frame, default_truncate_cbk, FIRST_CHILD(this),</div><div class='del'>-                    FIRST_CHILD(this)-&gt;fops-&gt;truncate, loc, offset);</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-ac_truncate_stat_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-                      int32_t op_ret, int32_t op_errno, struct iatt *buf)</div><div class='del'>-{</div><div class='del'>-        call_stub_t     *stub = NULL;</div><div class='del'>-</div><div class='del'>-        stub = __get_frame_stub (frame);</div><div class='del'>-        if (op_ret == -1)</div><div class='del'>-                goto out;</div><div class='del'>-</div><div class='del'>-        op_ret = ac_test_access (buf, frame-&gt;root-&gt;uid, frame-&gt;root-&gt;gid,</div><div class='del'>-                                 frame-&gt;root-&gt;groups, frame-&gt;root-&gt;ngrps,</div><div class='del'>-                                 ACCTEST_WRITE, ACCTEST_ANY, &amp;op_errno);</div><div class='del'>-        if (op_ret == -1)</div><div class='del'>-                goto out;</div><div class='del'>-</div><div class='del'>-        call_resume (stub);</div><div class='del'>-out:</div><div class='del'>-        if (op_ret &lt; 0) {</div><div class='del'>-                STACK_UNWIND_STRICT (truncate, frame, -1, op_errno, NULL, NULL);</div><div class='del'>-                if (stub)</div><div class='del'>-                        call_stub_destroy (stub);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-ac_truncate (call_frame_t *frame, xlator_t *this, loc_t *loc, off_t offset)</div><div class='del'>-{</div><div class='del'>-        call_stub_t     *stub = NULL;</div><div class='del'>-        int             ret = -EFAULT;</div><div class='del'>-</div><div class='del'>-        stub = fop_truncate_stub (frame, ac_truncate_resume, loc, offset);</div><div class='del'>-	if (!stub) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_ERROR, "cannot create call stub: "</div><div class='del'>-                        "(out of memory)");</div><div class='del'>-                ret = -ENOMEM;</div><div class='del'>-                goto out;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-        frame-&gt;local = stub;</div><div class='del'>-        STACK_WIND (frame, ac_truncate_stat_cbk, FIRST_CHILD (this),</div><div class='del'>-                    FIRST_CHILD (this)-&gt;fops-&gt;stat, loc);</div><div class='del'>-</div><div class='del'>-        ret = 0;</div><div class='del'>-out:</div><div class='del'>-        if (ret &lt; 0)</div><div class='del'>-                STACK_UNWIND_STRICT (truncate, frame, -1, -ret, NULL, NULL);</div><div class='del'>-</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-ac_access_resume (call_frame_t *frame, xlator_t *this, loc_t *loc, int32_t mask)</div><div class='del'>-{</div><div class='del'>-        STACK_WIND (frame, default_access_cbk, FIRST_CHILD(this),</div><div class='del'>-                    FIRST_CHILD(this)-&gt;fops-&gt;access, loc, mask);</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-ac_access_stat_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-                    int32_t op_ret, int32_t op_errno, struct iatt *buf)</div><div class='del'>-{</div><div class='del'>-        call_stub_t     *stub = NULL;</div><div class='del'>-        int32_t         mask = 0;</div><div class='del'>-        int             acctest = 0;</div><div class='del'>-</div><div class='del'>-        stub = __get_frame_stub (frame);</div><div class='del'>-        mask = stub-&gt;args.access.mask;</div><div class='del'>-</div><div class='del'>-        /* If mask requests test for file existence then do not</div><div class='del'>-         * return a failure with ENOENT, instead return a failed</div><div class='del'>-         * access test.</div><div class='del'>-         */</div><div class='del'>-        if (op_ret == -1) {</div><div class='del'>-                if (mask &amp; F_OK)</div><div class='del'>-                        op_errno = EACCES;</div><div class='del'>-                else</div><div class='del'>-                        op_errno = errno;</div><div class='del'>-</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        if (R_OK &amp; mask)</div><div class='del'>-                acctest |= ACCTEST_READ;</div><div class='del'>-        else if (W_OK &amp; mask)</div><div class='del'>-                acctest |= ACCTEST_WRITE;</div><div class='del'>-        else if (X_OK &amp; mask)</div><div class='del'>-                acctest |= ACCTEST_EXEC;</div><div class='del'>-        else</div><div class='del'>-                acctest = 0;</div><div class='del'>-</div><div class='del'>-        op_ret = ac_test_access (buf, frame-&gt;root-&gt;uid, frame-&gt;root-&gt;gid,</div><div class='del'>-                                 frame-&gt;root-&gt;groups, frame-&gt;root-&gt;ngrps,</div><div class='del'>-                                 acctest, ACCTEST_ANY, &amp;op_errno);</div><div class='del'>-        if (op_ret == -1)</div><div class='del'>-                goto out;</div><div class='del'>-</div><div class='del'>-        call_resume (stub);</div><div class='del'>-out:</div><div class='del'>-        if (op_ret &lt; 0) {</div><div class='del'>-                STACK_UNWIND_STRICT (access, frame, -1, op_errno);</div><div class='del'>-                if (stub)</div><div class='del'>-                        call_stub_destroy (stub);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-ac_access (call_frame_t *frame, xlator_t *this, loc_t *loc, int32_t mask)</div><div class='del'>-{</div><div class='del'>-        call_stub_t     *stub = NULL;</div><div class='del'>-        int             ret = -EFAULT;</div><div class='del'>-</div><div class='del'>-        stub = fop_access_stub (frame, ac_access_resume, loc, mask);</div><div class='del'>-	if (!stub) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_ERROR, "cannot create call stub: "</div><div class='del'>-                        "(out of memory)");</div><div class='del'>-                ret = -ENOMEM;</div><div class='del'>-                goto out;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-        frame-&gt;local = stub;</div><div class='del'>-        STACK_WIND (frame, ac_access_stat_cbk, FIRST_CHILD (this),</div><div class='del'>-                    FIRST_CHILD (this)-&gt;fops-&gt;stat, loc);</div><div class='del'>-        ret = 0;</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        if (ret &lt; 0)</div><div class='del'>-                STACK_UNWIND_STRICT (access, frame, -1, -ret);</div><div class='del'>-</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-ac_readlink_resume (call_frame_t *frame, xlator_t *this, loc_t *loc,</div><div class='del'>-                    size_t size)</div><div class='del'>-{</div><div class='del'>-        STACK_WIND (frame, default_readlink_cbk, FIRST_CHILD(this),</div><div class='del'>-                    FIRST_CHILD(this)-&gt;fops-&gt;readlink, loc, size);</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-ac_readlink_stat_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-                      int32_t op_ret, int32_t op_errno, struct iatt *buf)</div><div class='del'>-{</div><div class='del'>-        call_stub_t     *stub = NULL;</div><div class='del'>-</div><div class='del'>-        stub = __get_frame_stub (frame);</div><div class='del'>-        if (op_ret == -1)</div><div class='del'>-                goto out;</div><div class='del'>-</div><div class='del'>-        op_ret = ac_test_access (buf, frame-&gt;root-&gt;uid, frame-&gt;root-&gt;gid,</div><div class='del'>-                                 frame-&gt;root-&gt;groups, frame-&gt;root-&gt;ngrps,</div><div class='del'>-                                 ACCTEST_READ, ACCTEST_ANY, &amp;op_errno);</div><div class='del'>-        if (op_ret == -1)</div><div class='del'>-                goto out;</div><div class='del'>-</div><div class='del'>-        call_resume (stub);</div><div class='del'>-out:</div><div class='del'>-        if (op_ret &lt; 0) {</div><div class='del'>-                STACK_UNWIND_STRICT (readlink, frame, -1, op_errno, NULL, NULL);</div><div class='del'>-                if (stub)</div><div class='del'>-                        call_stub_destroy (stub);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-ac_readlink (call_frame_t *frame, xlator_t *this, loc_t *loc, size_t size)</div><div class='del'>-{</div><div class='del'>-        call_stub_t     *stub = NULL;</div><div class='del'>-        int             ret = -EFAULT;</div><div class='del'>-</div><div class='del'>-        stub = fop_readlink_stub (frame, ac_readlink_resume, loc, size);</div><div class='del'>-	if (!stub) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_ERROR, "cannot create call stub: "</div><div class='del'>-                        "(out of memory)");</div><div class='del'>-                ret = -ENOMEM;</div><div class='del'>-                goto out;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-        frame-&gt;local = stub;</div><div class='del'>-        STACK_WIND (frame, ac_readlink_stat_cbk, FIRST_CHILD (this),</div><div class='del'>-                    FIRST_CHILD (this)-&gt;fops-&gt;stat, loc);</div><div class='del'>-        ret = 0;</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        if (ret &lt; 0)</div><div class='del'>-                STACK_UNWIND_STRICT (readlink, frame, -1, -ret, NULL, NULL);</div><div class='del'>-</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-ac_mknod_resume (call_frame_t *frame, xlator_t *this, loc_t *loc, mode_t mode,</div><div class='del'>-                 dev_t rdev, dict_t *params)</div><div class='del'>-{</div><div class='del'>-        STACK_WIND (frame, default_mknod_cbk, FIRST_CHILD(this),</div><div class='del'>-                    FIRST_CHILD(this)-&gt;fops-&gt;mknod, loc, mode, rdev, params);</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-ac_mknod_stat_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-                   int32_t op_ret, int32_t op_errno, struct iatt *buf)</div><div class='del'>-{</div><div class='del'>-        call_stub_t     *stub = NULL;</div><div class='del'>-</div><div class='del'>-        stub = __get_frame_stub (frame);</div><div class='del'>-        if (op_ret == -1)</div><div class='del'>-                goto out;</div><div class='del'>-</div><div class='del'>-        op_ret = ac_test_access (buf, frame-&gt;root-&gt;uid, frame-&gt;root-&gt;gid,</div><div class='del'>-                                 frame-&gt;root-&gt;groups, frame-&gt;root-&gt;ngrps,</div><div class='del'>-                                 ACCTEST_WRITE, ACCTEST_ANY, &amp;op_errno);</div><div class='del'>-        if (op_ret == -1) {</div><div class='del'>-                op_errno = EACCES;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        call_resume (stub);</div><div class='del'>-out:</div><div class='del'>-        if (op_ret &lt; 0) {</div><div class='del'>-                STACK_UNWIND_STRICT (mknod, frame, -1, op_errno, NULL, NULL,</div><div class='del'>-                                     NULL, NULL);</div><div class='del'>-                if (stub)</div><div class='del'>-                        call_stub_destroy (stub);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-ac_mknod (call_frame_t *frame, xlator_t *this, loc_t *loc, mode_t mode,</div><div class='del'>-          dev_t rdev, dict_t *params)</div><div class='del'>-{</div><div class='del'>-        call_stub_t     *stub = NULL;</div><div class='del'>-        int             ret = -EFAULT;</div><div class='del'>-        loc_t           parentloc = {0, };</div><div class='del'>-</div><div class='del'>-        stub = fop_mknod_stub (frame, ac_mknod_resume, loc, mode, rdev, params);</div><div class='del'>-	if (!stub) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_ERROR, "cannot create call stub: "</div><div class='del'>-                        "(out of memory)");</div><div class='del'>-                ret = -ENOMEM;</div><div class='del'>-                goto out;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-        frame-&gt;local = stub;</div><div class='del'>-        ret = ac_parent_loc_fill (&amp;parentloc, loc);</div><div class='del'>-        if (ret &lt; 0)</div><div class='del'>-                goto out;</div><div class='del'>-</div><div class='del'>-        STACK_WIND (frame, ac_mknod_stat_cbk, FIRST_CHILD (this),</div><div class='del'>-                    FIRST_CHILD (this)-&gt;fops-&gt;stat, &amp;parentloc);</div><div class='del'>-        loc_wipe (&amp;parentloc);</div><div class='del'>-        ret = 0;</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        if (ret &lt; 0) {</div><div class='del'>-                /* Erase any stored frame before unwinding. */</div><div class='del'>-                stub = __get_frame_stub (frame);</div><div class='del'>-                if (stub)</div><div class='del'>-                        call_stub_destroy (stub);</div><div class='del'>-                STACK_UNWIND_STRICT (mknod, frame, -1, -ret, NULL, NULL, NULL,</div><div class='del'>-                                     NULL);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-ac_mkdir_resume (call_frame_t *frame, xlator_t *this, loc_t *loc, mode_t mode,</div><div class='del'>-                 dict_t *params)</div><div class='del'>-{</div><div class='del'>-        STACK_WIND (frame, default_mkdir_cbk, FIRST_CHILD(this),</div><div class='del'>-                    FIRST_CHILD(this)-&gt;fops-&gt;mkdir, loc, mode, params);</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-ac_mkdir_stat_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-                   int32_t op_ret, int32_t op_errno, struct iatt *buf)</div><div class='del'>-{</div><div class='del'>-        call_stub_t     *stub = NULL;</div><div class='del'>-</div><div class='del'>-        stub = __get_frame_stub (frame);</div><div class='del'>-        if (op_ret == -1)</div><div class='del'>-                goto out;</div><div class='del'>-</div><div class='del'>-        op_ret = ac_test_access (buf, frame-&gt;root-&gt;uid, frame-&gt;root-&gt;gid,</div><div class='del'>-                                 frame-&gt;root-&gt;groups, frame-&gt;root-&gt;ngrps,</div><div class='del'>-                                 ACCTEST_WRITE, ACCTEST_ANY, &amp;op_errno);</div><div class='del'>-        if (op_ret == -1) {</div><div class='del'>-                /* On a failed  write test on parent dir, we need to return</div><div class='del'>-                 * EACCES, not EPERM that is returned by default by</div><div class='del'>-                 * ac_test_access.</div><div class='del'>-                 */</div><div class='del'>-                op_errno = EACCES;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        call_resume (stub);</div><div class='del'>-out:</div><div class='del'>-        if (op_ret &lt; 0) {</div><div class='del'>-                STACK_UNWIND_STRICT (mkdir, frame, -1, op_errno, NULL, NULL,</div><div class='del'>-                                     NULL, NULL);</div><div class='del'>-                if (stub)</div><div class='del'>-                        call_stub_destroy (stub);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-ac_mkdir (call_frame_t *frame, xlator_t *this, loc_t *loc, mode_t mode,</div><div class='del'>-          dict_t *params)</div><div class='del'>-{</div><div class='del'>-        call_stub_t     *stub = NULL;</div><div class='del'>-        int             ret = -EFAULT;</div><div class='del'>-        loc_t           parentloc = {0, };</div><div class='del'>-</div><div class='del'>-        stub = fop_mkdir_stub (frame, ac_mkdir_resume, loc, mode, params);</div><div class='del'>-	if (!stub) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_ERROR, "cannot create call stub: "</div><div class='del'>-                        "(out of memory)");</div><div class='del'>-                ret = -ENOMEM;</div><div class='del'>-                goto out;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-        frame-&gt;local = stub;</div><div class='del'>-        ret = ac_parent_loc_fill (&amp;parentloc, loc);</div><div class='del'>-        if (ret &lt; 0)</div><div class='del'>-                goto out;</div><div class='del'>-</div><div class='del'>-        STACK_WIND (frame, ac_mkdir_stat_cbk, FIRST_CHILD (this),</div><div class='del'>-                    FIRST_CHILD (this)-&gt;fops-&gt;stat, &amp;parentloc);</div><div class='del'>-        loc_wipe (&amp;parentloc);</div><div class='del'>-        ret = 0;</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        if (ret &lt; 0) {</div><div class='del'>-                /* Erase the stored stub before unwinding. */</div><div class='del'>-                stub = __get_frame_stub (frame);</div><div class='del'>-                if (stub)</div><div class='del'>-                        call_stub_destroy (stub);</div><div class='del'>-                STACK_UNWIND_STRICT (mkdir, frame, -1, -ret, NULL, NULL, NULL,</div><div class='del'>-                                     NULL);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-ac_unlink_resume (call_frame_t *frame, xlator_t *this, loc_t *loc)</div><div class='del'>-{</div><div class='del'>-        STACK_WIND (frame, default_unlink_cbk, FIRST_CHILD(this),</div><div class='del'>-                    FIRST_CHILD(this)-&gt;fops-&gt;unlink, loc);</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-ac_unlink_stat_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-                    int32_t op_ret, int32_t op_errno, struct iatt *buf)</div><div class='del'>-{</div><div class='del'>-        call_stub_t     *stub = NULL;</div><div class='del'>-</div><div class='del'>-        stub = __get_frame_stub (frame);</div><div class='del'>-        if (op_ret == -1)</div><div class='del'>-                goto out;</div><div class='del'>-</div><div class='del'>-        op_ret = ac_test_access (buf, frame-&gt;root-&gt;uid, frame-&gt;root-&gt;gid,</div><div class='del'>-                                 frame-&gt;root-&gt;groups, frame-&gt;root-&gt;ngrps,</div><div class='del'>-                                 ACCTEST_WRITE, ACCTEST_ANY, &amp;op_errno);</div><div class='del'>-        if (op_ret == -1) {</div><div class='del'>-                op_errno = EACCES;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        call_resume (stub);</div><div class='del'>-out:</div><div class='del'>-        if (op_ret &lt; 0) {</div><div class='del'>-                STACK_UNWIND_STRICT (unlink, frame, -1, op_errno, NULL, NULL);</div><div class='del'>-                if (stub)</div><div class='del'>-                        call_stub_destroy (stub);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-ac_unlink (call_frame_t *frame, xlator_t *this, loc_t *loc)</div><div class='del'>-{</div><div class='del'>-        call_stub_t     *stub = NULL;</div><div class='del'>-        int             ret = -EFAULT;</div><div class='del'>-        loc_t           parentloc = {0, };</div><div class='del'>-</div><div class='del'>-        stub = fop_unlink_stub (frame, ac_unlink_resume, loc);</div><div class='del'>-	if (!stub) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_ERROR, "cannot create call stub: "</div><div class='del'>-                        "(out of memory)");</div><div class='del'>-                ret = -ENOMEM;</div><div class='del'>-                goto out;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-        frame-&gt;local = stub;</div><div class='del'>-        ret = ac_parent_loc_fill (&amp;parentloc, loc);</div><div class='del'>-        if (ret &lt; 0)</div><div class='del'>-                goto out;</div><div class='del'>-</div><div class='del'>-        STACK_WIND (frame, ac_unlink_stat_cbk, FIRST_CHILD (this),</div><div class='del'>-                    FIRST_CHILD (this)-&gt;fops-&gt;stat, &amp;parentloc);</div><div class='del'>-        loc_wipe (&amp;parentloc);</div><div class='del'>-        ret = 0;</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        if (ret &lt; 0) {</div><div class='del'>-                /* Erase the stored stub before unwinding. */</div><div class='del'>-                stub = __get_frame_stub (frame);</div><div class='del'>-                if (stub)</div><div class='del'>-                        call_stub_destroy (stub);</div><div class='del'>-                STACK_UNWIND_STRICT (unlink, frame, -1, -ret, NULL, NULL);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-ac_rmdir_resume (call_frame_t *frame, xlator_t *this, loc_t *loc)</div><div class='del'>-{</div><div class='del'>-        STACK_WIND (frame, default_rmdir_cbk, FIRST_CHILD(this),</div><div class='del'>-                    FIRST_CHILD(this)-&gt;fops-&gt;rmdir, loc);</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-ac_rmdir_stat_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-                   int32_t op_ret, int32_t op_errno, struct iatt *buf)</div><div class='del'>-{</div><div class='del'>-        call_stub_t     *stub = NULL;</div><div class='del'>-</div><div class='del'>-        stub = __get_frame_stub (frame);</div><div class='del'>-        if (op_ret == -1)</div><div class='del'>-                goto out;</div><div class='del'>-</div><div class='del'>-        op_ret = ac_test_access (buf, frame-&gt;root-&gt;uid, frame-&gt;root-&gt;gid,</div><div class='del'>-                                 frame-&gt;root-&gt;groups, frame-&gt;root-&gt;ngrps,</div><div class='del'>-                                 ACCTEST_WRITE, ACCTEST_ANY, &amp;op_errno);</div><div class='del'>-        if (op_ret == -1) {</div><div class='del'>-                op_errno = EACCES;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        call_resume (stub);</div><div class='del'>-out:</div><div class='del'>-        if (op_ret &lt; 0) {</div><div class='del'>-                STACK_UNWIND_STRICT (rmdir, frame, -1, op_errno, NULL, NULL);</div><div class='del'>-                if (stub)</div><div class='del'>-                        call_stub_destroy (stub);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-ac_rmdir (call_frame_t *frame, xlator_t *this, loc_t *loc)</div><div class='del'>-{</div><div class='del'>-        call_stub_t     *stub = NULL;</div><div class='del'>-        int             ret = -EFAULT;</div><div class='del'>-        loc_t           parentloc = {0, };</div><div class='del'>-</div><div class='del'>-        stub = fop_rmdir_stub (frame, ac_rmdir_resume, loc);</div><div class='del'>-	if (!stub) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_ERROR, "cannot create call stub: "</div><div class='del'>-                        "(out of memory)");</div><div class='del'>-                ret = -ENOMEM;</div><div class='del'>-                goto out;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-        frame-&gt;local = stub;</div><div class='del'>-        ret = ac_parent_loc_fill (&amp;parentloc, loc);</div><div class='del'>-        if (ret &lt; 0)</div><div class='del'>-                goto out;</div><div class='del'>-</div><div class='del'>-        STACK_WIND (frame, ac_rmdir_stat_cbk, FIRST_CHILD (this),</div><div class='del'>-                    FIRST_CHILD (this)-&gt;fops-&gt;stat, &amp;parentloc);</div><div class='del'>-        loc_wipe (&amp;parentloc);</div><div class='del'>-        ret = 0;</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        if (ret &lt; 0) {</div><div class='del'>-                /* Erase the stored stub before unwinding. */</div><div class='del'>-                stub = __get_frame_stub (frame);</div><div class='del'>-                if (stub)</div><div class='del'>-                        call_stub_destroy (stub);</div><div class='del'>-                STACK_UNWIND_STRICT (rmdir, frame, -1, -ret, NULL, NULL);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-ac_symlink_resume (call_frame_t *frame, xlator_t *this, const char *linkname,</div><div class='del'>-                   loc_t *loc, dict_t *params)</div><div class='del'>-{</div><div class='del'>-        STACK_WIND (frame, default_symlink_cbk, FIRST_CHILD(this),</div><div class='del'>-                    FIRST_CHILD(this)-&gt;fops-&gt;symlink, linkname, loc, params);</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-ac_symlink_stat_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-                     int32_t op_ret, int32_t op_errno, struct iatt *buf)</div><div class='del'>-{</div><div class='del'>-        call_stub_t     *stub = NULL;</div><div class='del'>-</div><div class='del'>-        stub = __get_frame_stub (frame);</div><div class='del'>-        if (op_ret == -1)</div><div class='del'>-                goto out;</div><div class='del'>-</div><div class='del'>-        op_ret = ac_test_access (buf, frame-&gt;root-&gt;uid, frame-&gt;root-&gt;gid,</div><div class='del'>-                                 frame-&gt;root-&gt;groups, frame-&gt;root-&gt;ngrps,</div><div class='del'>-                                 ACCTEST_WRITE, ACCTEST_ANY, &amp;op_errno);</div><div class='del'>-        if (op_ret == -1) {</div><div class='del'>-                op_errno = EACCES;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        call_resume (stub);</div><div class='del'>-out:</div><div class='del'>-        if (op_ret &lt; 0) {</div><div class='del'>-                STACK_UNWIND_STRICT (symlink, frame, -1, op_errno, NULL, NULL,</div><div class='del'>-                                     NULL, NULL);</div><div class='del'>-                if (stub)</div><div class='del'>-                        call_stub_destroy (stub);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-ac_symlink (call_frame_t *frame, xlator_t *this, const char *linkname,</div><div class='del'>-            loc_t *loc, dict_t *params)</div><div class='del'>-{</div><div class='del'>-        call_stub_t     *stub = NULL;</div><div class='del'>-        int             ret = -EFAULT;</div><div class='del'>-        loc_t           parentloc = {0, };</div><div class='del'>-</div><div class='del'>-        stub = fop_symlink_stub (frame, ac_symlink_resume, linkname, loc,</div><div class='del'>-                                 params);</div><div class='del'>-	if (!stub) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_ERROR, "cannot create call stub: "</div><div class='del'>-                        "(out of memory)");</div><div class='del'>-                ret = -ENOMEM;</div><div class='del'>-                goto out;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-        frame-&gt;local = stub;</div><div class='del'>-        ret = ac_parent_loc_fill (&amp;parentloc, loc);</div><div class='del'>-        if (ret &lt; 0)</div><div class='del'>-                goto out;</div><div class='del'>-</div><div class='del'>-        STACK_WIND (frame, ac_symlink_stat_cbk, FIRST_CHILD (this),</div><div class='del'>-                    FIRST_CHILD (this)-&gt;fops-&gt;stat, &amp;parentloc);</div><div class='del'>-        loc_wipe (&amp;parentloc);</div><div class='del'>-        ret = 0;</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        if (ret &lt; 0) {</div><div class='del'>-                /* Erase the stored stub before unwinding. */</div><div class='del'>-                stub = __get_frame_stub (frame);</div><div class='del'>-                if (stub)</div><div class='del'>-                        call_stub_destroy (stub);</div><div class='del'>-                STACK_UNWIND_STRICT (symlink, frame, -1, -ret, NULL, NULL, NULL,</div><div class='del'>-                                     NULL);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-ac_rename_resume (call_frame_t *frame, xlator_t *this, loc_t *oldloc,</div><div class='del'>-                  loc_t *newloc)</div><div class='del'>-{</div><div class='del'>-        STACK_WIND (frame, default_rename_cbk, FIRST_CHILD(this),</div><div class='del'>-                    FIRST_CHILD(this)-&gt;fops-&gt;rename, oldloc, newloc);</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-ac_rename_dst_stat_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-                        int32_t op_ret, int32_t op_errno, struct iatt *buf)</div><div class='del'>-{</div><div class='del'>-        call_stub_t     *stub = NULL;</div><div class='del'>-</div><div class='del'>-        stub = __get_frame_stub (frame);</div><div class='del'>-        if (op_ret == -1)</div><div class='del'>-                goto out;</div><div class='del'>-</div><div class='del'>-        op_ret = ac_test_access (buf, frame-&gt;root-&gt;uid,</div><div class='del'>-                                 frame-&gt;root-&gt;gid, frame-&gt;root-&gt;groups,</div><div class='del'>-                                 frame-&gt;root-&gt;ngrps, ACCTEST_WRITE,</div><div class='del'>-                                 ACCTEST_ANY, &amp;op_errno);</div><div class='del'>-        if (op_ret == -1) {</div><div class='del'>-                op_errno = EACCES;</div><div class='del'>-               goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        call_resume (stub);</div><div class='del'>-out:</div><div class='del'>-        if (op_ret &lt; 0) {</div><div class='del'>-                STACK_UNWIND_STRICT (rename, frame, -1, op_errno, NULL, NULL,</div><div class='del'>-                                     NULL, NULL, NULL);</div><div class='del'>-                if (stub)</div><div class='del'>-                        call_stub_destroy (stub);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-ac_rename_src_stat_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-                        int32_t op_ret, int32_t op_errno, struct iatt *buf)</div><div class='del'>-{</div><div class='del'>-        call_stub_t     *stub = NULL;</div><div class='del'>-        loc_t           parentloc = {0, };</div><div class='del'>-</div><div class='del'>-        stub = frame-&gt;local;</div><div class='del'>-        if (op_ret == -1)</div><div class='del'>-                goto out;</div><div class='del'>-</div><div class='del'>-        op_ret = ac_test_access (buf, frame-&gt;root-&gt;uid,</div><div class='del'>-                                 frame-&gt;root-&gt;gid, frame-&gt;root-&gt;groups,</div><div class='del'>-                                 frame-&gt;root-&gt;ngrps, ACCTEST_WRITE,</div><div class='del'>-                                 ACCTEST_ANY, &amp;op_errno);</div><div class='del'>-        if (op_ret == -1) {</div><div class='del'>-                op_errno = EACCES;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        op_ret = ac_parent_loc_fill (&amp;parentloc, &amp;stub-&gt;args.rename.new);</div><div class='del'>-        if (op_ret == -1) {</div><div class='del'>-                op_errno = -EFAULT;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        STACK_WIND (frame, ac_rename_dst_stat_cbk, FIRST_CHILD (this),</div><div class='del'>-                    FIRST_CHILD (this)-&gt;fops-&gt;stat, &amp;parentloc);</div><div class='del'>-        loc_wipe (&amp;parentloc);</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        if (op_ret &lt; 0) {</div><div class='del'>-                /* Erase the stored stub before unwinding. */</div><div class='del'>-                stub = __get_frame_stub (frame);</div><div class='del'>-                if (stub)</div><div class='del'>-                        call_stub_destroy (stub);</div><div class='del'>-                STACK_UNWIND_STRICT (rename, frame, -1, op_errno, NULL, NULL,</div><div class='del'>-                                     NULL, NULL, NULL);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-ac_rename (call_frame_t *frame, xlator_t *this, loc_t *oldloc, loc_t *newloc)</div><div class='del'>-{</div><div class='del'>-        call_stub_t     *stub = NULL;</div><div class='del'>-        int             ret = -EFAULT;</div><div class='del'>-        loc_t           parentloc = {0, };</div><div class='del'>-</div><div class='del'>-        stub = fop_rename_stub (frame, ac_rename_resume, oldloc, newloc);</div><div class='del'>-	if (!stub) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_ERROR, "cannot create call stub: "</div><div class='del'>-                        "(out of memory)");</div><div class='del'>-                ret = -ENOMEM;</div><div class='del'>-                goto out;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-        frame-&gt;local = stub;</div><div class='del'>-        ret = ac_parent_loc_fill (&amp;parentloc, oldloc);</div><div class='del'>-        if (ret &lt; 0)</div><div class='del'>-                goto out;</div><div class='del'>-</div><div class='del'>-        STACK_WIND (frame, ac_rename_src_stat_cbk, FIRST_CHILD (this),</div><div class='del'>-                    FIRST_CHILD (this)-&gt;fops-&gt;stat, &amp;parentloc);</div><div class='del'>-        loc_wipe (&amp;parentloc);</div><div class='del'>-        ret = 0;</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        if (ret &lt; 0) {</div><div class='del'>-                /* Erase the stored stub before unwinding. */</div><div class='del'>-                stub = __get_frame_stub (frame);</div><div class='del'>-                if (stub)</div><div class='del'>-                        call_stub_destroy (stub);</div><div class='del'>-                STACK_UNWIND_STRICT (rename, frame, -1, -ret, NULL, NULL, NULL,</div><div class='del'>-                                     NULL, NULL);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-ac_link_resume (call_frame_t *frame, xlator_t *this, loc_t *oldloc,</div><div class='del'>-                loc_t *newloc)</div><div class='del'>-{</div><div class='del'>-        STACK_WIND (frame, default_link_cbk, FIRST_CHILD(this),</div><div class='del'>-                    FIRST_CHILD(this)-&gt;fops-&gt;link, oldloc, newloc);</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-ac_link_stat_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-                   int32_t op_ret, int32_t op_errno, struct iatt *buf)</div><div class='del'>-{</div><div class='del'>-        call_stub_t     *stub = NULL;</div><div class='del'>-</div><div class='del'>-        stub = __get_frame_stub (frame);</div><div class='del'>-        if (op_ret == -1)</div><div class='del'>-                goto out;</div><div class='del'>-</div><div class='del'>-        op_ret = ac_test_access (buf, frame-&gt;root-&gt;uid, frame-&gt;root-&gt;gid,</div><div class='del'>-                                 frame-&gt;root-&gt;groups, frame-&gt;root-&gt;ngrps,</div><div class='del'>-                                 ACCTEST_WRITE, ACCTEST_ANY, &amp;op_errno);</div><div class='del'>-        if (op_ret == -1) {</div><div class='del'>-                /* By default ac_test_access sets the op_errno to EPERM</div><div class='del'>-                 * but in the case of link, we need to return EACCES to meet</div><div class='del'>-                 * posix requirements when a write permission is not available</div><div class='del'>-                 * for the new directory.</div><div class='del'>-                 */</div><div class='del'>-                op_errno = EACCES;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        call_resume (stub);</div><div class='del'>-out:</div><div class='del'>-        if (op_ret &lt; 0) {</div><div class='del'>-                STACK_UNWIND_STRICT (link, frame, -1, op_errno, NULL, NULL,</div><div class='del'>-                                     NULL, NULL);</div><div class='del'>-                if (stub)</div><div class='del'>-                        call_stub_destroy (stub);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-ac_link (call_frame_t *frame, xlator_t *this, loc_t *oldloc, loc_t *newloc)</div><div class='del'>-{</div><div class='del'>-        call_stub_t     *stub = NULL;</div><div class='del'>-        int             ret = -EFAULT;</div><div class='del'>-        loc_t           parentloc = {0, };</div><div class='del'>-</div><div class='del'>-        stub = fop_link_stub (frame, ac_link_resume, oldloc, newloc);</div><div class='del'>-	if (!stub) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_ERROR, "cannot create call stub: "</div><div class='del'>-                        "(out of memory)");</div><div class='del'>-                ret = -ENOMEM;</div><div class='del'>-                goto out;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-        frame-&gt;local = stub;</div><div class='del'>-        ret = ac_parent_loc_fill (&amp;parentloc, newloc);</div><div class='del'>-        if (ret &lt; 0)</div><div class='del'>-                goto out;</div><div class='del'>-</div><div class='del'>-        STACK_WIND (frame, ac_link_stat_cbk, FIRST_CHILD (this),</div><div class='del'>-                    FIRST_CHILD (this)-&gt;fops-&gt;stat, &amp;parentloc);</div><div class='del'>-        loc_wipe (&amp;parentloc);</div><div class='del'>-        ret = 0;</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        if (ret &lt; 0) {</div><div class='del'>-                /* Erase the stored stub before unwinding. */</div><div class='del'>-                stub = __get_frame_stub (frame);</div><div class='del'>-                if (stub)</div><div class='del'>-                        call_stub_destroy (stub);</div><div class='del'>-                STACK_UNWIND_STRICT (link, frame, -1, -ret, NULL, NULL, NULL,</div><div class='del'>-                                     NULL);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-ac_create_resume (call_frame_t *frame, xlator_t *this, loc_t *loc,</div><div class='del'>-                  int32_t flags, mode_t mode, fd_t *fd, dict_t *params)</div><div class='del'>-{</div><div class='del'>-        STACK_WIND (frame, default_create_cbk, FIRST_CHILD(this),</div><div class='del'>-                    FIRST_CHILD(this)-&gt;fops-&gt;create, loc, flags, mode,</div><div class='del'>-                    fd, params);</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-ac_create_stat_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-                    int32_t op_ret, int32_t op_errno, struct iatt *buf)</div><div class='del'>-{</div><div class='del'>-        call_stub_t     *stub = NULL;</div><div class='del'>-</div><div class='del'>-        stub = __get_frame_stub (frame);</div><div class='del'>-        if (op_ret == -1)</div><div class='del'>-                goto out;</div><div class='del'>-</div><div class='del'>-        op_ret = ac_test_access (buf, frame-&gt;root-&gt;uid, frame-&gt;root-&gt;gid,</div><div class='del'>-                                 frame-&gt;root-&gt;groups, frame-&gt;root-&gt;ngrps,</div><div class='del'>-                                 ACCTEST_WRITE, ACCTEST_ANY, &amp;op_errno);</div><div class='del'>-         if (op_ret == -1) {</div><div class='del'>-                op_errno = EACCES;</div><div class='del'>-                goto out;</div><div class='del'>-         }</div><div class='del'>-</div><div class='del'>-        call_resume (stub);</div><div class='del'>-out:</div><div class='del'>-        if (op_ret &lt; 0) {</div><div class='del'>-                STACK_UNWIND_STRICT (create, frame, -1, op_errno, NULL, NULL,</div><div class='del'>-                                     NULL, NULL, NULL);</div><div class='del'>-                if (stub)</div><div class='del'>-                        call_stub_destroy (stub);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-ac_create (call_frame_t *frame, xlator_t *this, loc_t *loc, int32_t flags,</div><div class='del'>-           mode_t mode, fd_t *fd, dict_t *params)</div><div class='del'>-{</div><div class='del'>-        call_stub_t     *stub = NULL;</div><div class='del'>-        int             ret = -EFAULT;</div><div class='del'>-        loc_t           parentloc = {0, };</div><div class='del'>-</div><div class='del'>-        stub = fop_create_stub (frame, ac_create_resume, loc, flags, mode,</div><div class='del'>-                                fd, params);</div><div class='del'>-	if (!stub) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_ERROR, "cannot create call stub: "</div><div class='del'>-                        "(out of memory)");</div><div class='del'>-                ret = -ENOMEM;</div><div class='del'>-                goto out;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-        frame-&gt;local = stub;</div><div class='del'>-        ret = ac_parent_loc_fill (&amp;parentloc, loc);</div><div class='del'>-        if (ret &lt; 0)</div><div class='del'>-                goto out;</div><div class='del'>-</div><div class='del'>-        STACK_WIND (frame, ac_create_stat_cbk, FIRST_CHILD (this),</div><div class='del'>-                    FIRST_CHILD (this)-&gt;fops-&gt;stat, &amp;parentloc);</div><div class='del'>-        loc_wipe (&amp;parentloc);</div><div class='del'>-        ret = 0;</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        if (ret &lt; 0) {</div><div class='del'>-                /* Erase the stored stub before unwinding. */</div><div class='del'>-                stub = __get_frame_stub (frame);</div><div class='del'>-                if (stub)</div><div class='del'>-                        call_stub_destroy (stub);</div><div class='del'>-                STACK_UNWIND_STRICT (create, frame, -1, -ret, NULL, NULL, NULL,</div><div class='del'>-                                     NULL, NULL);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-ac_open_resume (call_frame_t *frame, xlator_t *this, loc_t *loc, int32_t flags,</div><div class='del'>-                fd_t *fd, int32_t wbflags)</div><div class='del'>-{</div><div class='del'>-        STACK_WIND (frame, default_open_cbk, FIRST_CHILD(this),</div><div class='del'>-                    FIRST_CHILD(this)-&gt;fops-&gt;open, loc, flags, fd, wbflags);</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-ac_open_create_stat_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-                         int32_t op_ret, int32_t op_errno, struct iatt *buf)</div><div class='del'>-{</div><div class='del'>-        call_stub_t     *stub = NULL;</div><div class='del'>-</div><div class='del'>-        stub = __get_frame_stub (frame);</div><div class='del'>-        if (op_ret == -1)</div><div class='del'>-                goto out;</div><div class='del'>-</div><div class='del'>-        op_ret = ac_test_access (buf, frame-&gt;root-&gt;uid, frame-&gt;root-&gt;gid,</div><div class='del'>-                                 frame-&gt;root-&gt;groups, frame-&gt;root-&gt;ngrps,</div><div class='del'>-                                 ACCTEST_WRITE, ACCTEST_ANY, &amp;op_errno);</div><div class='del'>-         if (op_ret == -1) {</div><div class='del'>-                op_errno = EACCES;</div><div class='del'>-                goto out;</div><div class='del'>-         }</div><div class='del'>-</div><div class='del'>-        call_resume (stub);</div><div class='del'>-out:</div><div class='del'>-        if (op_ret &lt; 0) {</div><div class='del'>-                STACK_UNWIND_STRICT (open, frame, -1, op_errno, NULL);</div><div class='del'>-                if (stub)</div><div class='del'>-                        call_stub_destroy (stub);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-ac_open_create (call_stub_t *stub)</div><div class='del'>-{</div><div class='del'>-        int             ret = -EFAULT;</div><div class='del'>-        loc_t           parentloc = {0, };</div><div class='del'>-        xlator_t        *this = NULL;</div><div class='del'>-</div><div class='del'>-        if (!stub)</div><div class='del'>-                return ret;</div><div class='del'>-</div><div class='del'>-        ret = ac_parent_loc_fill (&amp;parentloc, &amp;stub-&gt;args.open.loc);</div><div class='del'>-        if (ret &lt; 0)</div><div class='del'>-                goto out;</div><div class='del'>-</div><div class='del'>-        this = stub-&gt;frame-&gt;this;</div><div class='del'>-        STACK_WIND (stub-&gt;frame, ac_open_create_stat_cbk, FIRST_CHILD (this),</div><div class='del'>-                    FIRST_CHILD (this)-&gt;fops-&gt;stat, &amp;parentloc);</div><div class='del'>-        loc_wipe (&amp;parentloc);</div><div class='del'>-        ret = 0;</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        return ret;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-ac_open_only_stat_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-                       int32_t op_ret, int32_t op_errno, struct iatt *buf)</div><div class='del'>-{</div><div class='del'>-        call_stub_t     *stub = NULL;</div><div class='del'>-        int             acctest = 0;</div><div class='del'>-        int32_t         flags = 0;</div><div class='del'>-</div><div class='del'>-        stub = __get_frame_stub (frame);</div><div class='del'>-        if (op_ret == -1)</div><div class='del'>-                goto out;</div><div class='del'>-</div><div class='del'>-        flags = stub-&gt;args.open.flags;</div><div class='del'>-        /* The permissions we test for depend on how the open needs to be</div><div class='del'>-         * performed. */</div><div class='del'>-        if ((flags &amp; O_ACCMODE) == O_RDONLY)</div><div class='del'>-                acctest = ACCTEST_READ;</div><div class='del'>-        else if (((flags &amp; O_ACCMODE) == O_RDWR) ||</div><div class='del'>-                 ((flags &amp; O_ACCMODE) == O_WRONLY))</div><div class='del'>-                acctest = ACCTEST_WRITE;</div><div class='del'>-</div><div class='del'>-        op_ret = ac_test_access (buf, frame-&gt;root-&gt;uid, frame-&gt;root-&gt;gid,</div><div class='del'>-                                 frame-&gt;root-&gt;groups, frame-&gt;root-&gt;ngrps,</div><div class='del'>-                                 acctest, ACCTEST_ANY, &amp;op_errno);</div><div class='del'>-        if (op_ret == -1)</div><div class='del'>-                goto out;</div><div class='del'>-</div><div class='del'>-        call_resume (stub);</div><div class='del'>-out:</div><div class='del'>-        if (op_ret &lt; 0) {</div><div class='del'>-                STACK_UNWIND_STRICT (open, frame, -1, op_errno, NULL);</div><div class='del'>-                if (stub)</div><div class='del'>-                        call_stub_destroy (stub);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-ac_open_only (call_stub_t *stub)</div><div class='del'>-{</div><div class='del'>-        int             ret = -EFAULT;</div><div class='del'>-        xlator_t        *this = NULL;</div><div class='del'>-</div><div class='del'>-        if (!stub)</div><div class='del'>-                return ret;</div><div class='del'>-</div><div class='del'>-        this = stub-&gt;frame-&gt;this;</div><div class='del'>-        STACK_WIND (stub-&gt;frame, ac_open_only_stat_cbk, FIRST_CHILD (this),</div><div class='del'>-                    FIRST_CHILD (this)-&gt;fops-&gt;stat, &amp;stub-&gt;args.open.loc);</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-ac_open (call_frame_t *frame, xlator_t *this, loc_t *loc, int32_t flags,</div><div class='del'>-         fd_t *fd, int32_t wbflags)</div><div class='del'>-{</div><div class='del'>-        call_stub_t     *stub = NULL;</div><div class='del'>-        int             ret = -EFAULT;</div><div class='del'>-</div><div class='del'>-        stub = fop_open_stub (frame, ac_open_resume, loc, flags, fd, wbflags);</div><div class='del'>-	if (!stub) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_ERROR, "cannot create call stub: "</div><div class='del'>-                        "(out of memory)");</div><div class='del'>-                ret = -ENOMEM;</div><div class='del'>-                goto out;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-        frame-&gt;local = stub;</div><div class='del'>-        /* If we are not supposed to create the file then there is no need to</div><div class='del'>-         * check the parent dir permissions. */</div><div class='del'>-        if (flags &amp; O_CREAT)</div><div class='del'>-                ret = ac_open_create (stub);</div><div class='del'>-        else</div><div class='del'>-                ret = ac_open_only (stub);</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        if (ret &lt; 0) {</div><div class='del'>-                /* Erase the stored stub before unwinding. */</div><div class='del'>-                stub = __get_frame_stub (frame);</div><div class='del'>-                if (stub)</div><div class='del'>-                        call_stub_destroy (stub);</div><div class='del'>-                STACK_UNWIND_STRICT (open, frame, -1, -ret, NULL);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-ac_readv_resume (call_frame_t *frame, xlator_t *this, fd_t *fd, size_t size,</div><div class='del'>-                 off_t offset)</div><div class='del'>-{</div><div class='del'>-        STACK_WIND (frame, default_readv_cbk, FIRST_CHILD (this),</div><div class='del'>-                    FIRST_CHILD (this)-&gt;fops-&gt;readv, fd, size, offset);</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-ac_readv_fstat_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-                    int32_t op_ret, int32_t op_errno, struct iatt *buf)</div><div class='del'>-{</div><div class='del'>-        call_stub_t     *stub = NULL;</div><div class='del'>-</div><div class='del'>-        stub = __get_frame_stub (frame);</div><div class='del'>-        if (op_ret == -1)</div><div class='del'>-                goto out;</div><div class='del'>-</div><div class='del'>-        op_ret = ac_test_access (buf, frame-&gt;root-&gt;uid, frame-&gt;root-&gt;gid,</div><div class='del'>-                                 frame-&gt;root-&gt;groups, frame-&gt;root-&gt;ngrps,</div><div class='del'>-                                 ACCTEST_READ, ACCTEST_ANY, &amp;op_errno);</div><div class='del'>-        if (op_ret == -1) {</div><div class='del'>-                op_errno = EACCES;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        call_resume (stub);</div><div class='del'>-out:</div><div class='del'>-        if (op_ret &lt; 0) {</div><div class='del'>-                STACK_UNWIND_STRICT (readv, frame, -1, op_errno, NULL, 0, NULL,</div><div class='del'>-                                     NULL);</div><div class='del'>-                if (stub)</div><div class='del'>-                        call_stub_destroy (stub);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-ac_readv (call_frame_t *frame, xlator_t *this, fd_t *fd, size_t size,</div><div class='del'>-          off_t offset)</div><div class='del'>-{</div><div class='del'>-        call_stub_t     *stub = NULL;</div><div class='del'>-        int             ret = -EFAULT;</div><div class='del'>-</div><div class='del'>-        stub = fop_readv_stub (frame, ac_readv_resume, fd, size, offset);</div><div class='del'>-	if (!stub) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_ERROR, "cannot create call stub: "</div><div class='del'>-                        "(out of memory)");</div><div class='del'>-                ret = -ENOMEM;</div><div class='del'>-                goto out;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-        frame-&gt;local = stub;</div><div class='del'>-        STACK_WIND (frame, ac_readv_fstat_cbk, FIRST_CHILD (this),</div><div class='del'>-                    FIRST_CHILD (this)-&gt;fops-&gt;fstat, fd);</div><div class='del'>-        ret = 0;</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        if (ret &lt; 0)</div><div class='del'>-                STACK_UNWIND_STRICT (readv, frame, -1, -ret, NULL, 0, NULL,</div><div class='del'>-                                     NULL);</div><div class='del'>-</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-ac_writev_resume (call_frame_t *frame, xlator_t *this, fd_t *fd,</div><div class='del'>-                  struct iovec *vector, int32_t count, off_t offset,</div><div class='del'>-                  struct iobref *iobref)</div><div class='del'>-{</div><div class='del'>-        STACK_WIND (frame, default_writev_cbk, FIRST_CHILD (this),</div><div class='del'>-                    FIRST_CHILD (this)-&gt;fops-&gt;writev, fd, vector, count, offset,</div><div class='del'>-                    iobref);</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-ac_writev_fstat_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-                     int32_t op_ret, int32_t op_errno, struct iatt *buf)</div><div class='del'>-{</div><div class='del'>-        call_stub_t     *stub = NULL;</div><div class='del'>-</div><div class='del'>-        stub = __get_frame_stub (frame);</div><div class='del'>-        if (op_ret == -1)</div><div class='del'>-                goto out;</div><div class='del'>-</div><div class='del'>-        op_ret = ac_test_access (buf, frame-&gt;root-&gt;uid, frame-&gt;root-&gt;gid,</div><div class='del'>-                                 frame-&gt;root-&gt;groups, frame-&gt;root-&gt;ngrps,</div><div class='del'>-                                 ACCTEST_WRITE, ACCTEST_ANY, &amp;op_errno);</div><div class='del'>-        if (op_ret == -1) {</div><div class='del'>-                op_errno = EACCES;</div><div class='del'>-                goto out;</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        call_resume (stub);</div><div class='del'>-out:</div><div class='del'>-        if (op_ret &lt; 0) {</div><div class='del'>-                STACK_UNWIND_STRICT (writev, frame, -1, op_errno, NULL, NULL);</div><div class='del'>-                if (stub)</div><div class='del'>-                        call_stub_destroy (stub);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-ac_writev (call_frame_t *frame, xlator_t *this, fd_t *fd, struct iovec *vector,</div><div class='del'>-           int32_t count, off_t offset, struct iobref *iobref)</div><div class='del'>-{</div><div class='del'>-        call_stub_t     *stub = NULL;</div><div class='del'>-        int             ret = -EFAULT;</div><div class='del'>-</div><div class='del'>-        stub = fop_writev_stub (frame, ac_writev_resume, fd, vector, count,</div><div class='del'>-                                offset, iobref);</div><div class='del'>-	if (!stub) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_ERROR, "cannot create call stub: "</div><div class='del'>-                        "(out of memory)");</div><div class='del'>-                ret = -ENOMEM;</div><div class='del'>-                goto out;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-        frame-&gt;local = stub;</div><div class='del'>-        STACK_WIND (frame, ac_writev_fstat_cbk, FIRST_CHILD (this),</div><div class='del'>-                    FIRST_CHILD (this)-&gt;fops-&gt;fstat, fd);</div><div class='del'>-        ret = 0;</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        if (ret &lt; 0)</div><div class='del'>-                STACK_UNWIND_STRICT (writev, frame, -1, -ret, NULL, NULL);</div><div class='del'>-</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-ac_opendir_resume (call_frame_t *frame, xlator_t *this, loc_t *loc, fd_t *fd)</div><div class='del'>-{</div><div class='del'>-        STACK_WIND (frame, default_opendir_cbk, FIRST_CHILD(this),</div><div class='del'>-                    FIRST_CHILD(this)-&gt;fops-&gt;opendir, loc, fd);</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-ac_opendir_stat_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-                     int32_t op_ret, int32_t op_errno, struct iatt *buf)</div><div class='del'>-{</div><div class='del'>-        call_stub_t     *stub = NULL;</div><div class='del'>-</div><div class='del'>-        stub = __get_frame_stub (frame);</div><div class='del'>-        if (op_ret == -1)</div><div class='del'>-                goto out;</div><div class='del'>-</div><div class='del'>-        op_ret = ac_test_access (buf, frame-&gt;root-&gt;uid, frame-&gt;root-&gt;gid,</div><div class='del'>-                                 frame-&gt;root-&gt;groups, frame-&gt;root-&gt;ngrps,</div><div class='del'>-                                 ACCTEST_READ, ACCTEST_ANY, &amp;op_errno);</div><div class='del'>-        if (op_ret == -1)</div><div class='del'>-                goto out;</div><div class='del'>-</div><div class='del'>-        call_resume (stub);</div><div class='del'>-out:</div><div class='del'>-        if (op_ret &lt; 0) {</div><div class='del'>-                STACK_UNWIND_STRICT (opendir, frame, -1, op_errno, NULL);</div><div class='del'>-                if (stub)</div><div class='del'>-                        call_stub_destroy (stub);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-ac_opendir (call_frame_t *frame, xlator_t *this, loc_t *loc, fd_t *fd)</div><div class='del'>-{</div><div class='del'>-        call_stub_t     *stub = NULL;</div><div class='del'>-        int             ret = -EFAULT;</div><div class='del'>-</div><div class='del'>-        stub = fop_opendir_stub (frame, ac_opendir_resume, loc, fd);</div><div class='del'>-	if (!stub) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_ERROR, "cannot create call stub: "</div><div class='del'>-                        "(out of memory)");</div><div class='del'>-                ret = -ENOMEM;</div><div class='del'>-                goto out;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-        frame-&gt;local = stub;</div><div class='del'>-        STACK_WIND (frame, ac_opendir_stat_cbk, FIRST_CHILD (this),</div><div class='del'>-                    FIRST_CHILD (this)-&gt;fops-&gt;stat, loc);</div><div class='del'>-        ret = 0;</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        if (ret &lt; 0)</div><div class='del'>-                STACK_UNWIND_STRICT (opendir, frame, -1, -ret, NULL);</div><div class='del'>-</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-ac_setattr_resume (call_frame_t *frame, xlator_t *this, loc_t *loc,</div><div class='del'>-                   struct iatt *buf, int32_t valid)</div><div class='del'>-{</div><div class='del'>-        STACK_WIND (frame, default_setattr_cbk, FIRST_CHILD(this),</div><div class='del'>-                    FIRST_CHILD(this)-&gt;fops-&gt;setattr, loc, buf, valid);</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-ac_setattr_stat_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-                     int32_t op_ret, int32_t op_errno, struct iatt *buf)</div><div class='del'>-{</div><div class='del'>-        call_stub_t     *stub = NULL;</div><div class='del'>-        int32_t         valid = 0;</div><div class='del'>-        struct iatt     *setbuf = NULL;</div><div class='del'>-</div><div class='del'>-        stub = __get_frame_stub (frame);</div><div class='del'>-        if (op_ret == -1)</div><div class='del'>-                goto out;</div><div class='del'>-</div><div class='del'>-        op_ret = ac_test_access (buf, frame-&gt;root-&gt;uid, frame-&gt;root-&gt;gid,</div><div class='del'>-                                 frame-&gt;root-&gt;groups, frame-&gt;root-&gt;ngrps,</div><div class='del'>-                                 ACCTEST_DONTCARE, ACCTEST_OWNER,</div><div class='del'>-                                 &amp;op_errno);</div><div class='del'>-        if (op_ret == -1)</div><div class='del'>-                goto out;</div><div class='del'>-</div><div class='del'>-        valid = stub-&gt;args.setattr.valid;</div><div class='del'>-        setbuf = &amp;stub-&gt;args.setattr.stbuf;</div><div class='del'>-        if (gf_attr_uid_set (valid) || gf_attr_gid_set (valid)) {</div><div class='del'>-                /* chown returns EPERM if the operation would change the</div><div class='del'>-                 * ownership, but the effective user ID is not the</div><div class='del'>-                 * super-user and the process is not an owner of the file.</div><div class='del'>-                 * Ref: posix-testsuite/chown/07.t</div><div class='del'>-                 */</div><div class='del'>-                if ((frame-&gt;root-&gt;uid != 0) &amp;&amp; (gf_attr_uid_set (valid))) {</div><div class='del'>-                        if (buf-&gt;ia_uid != setbuf-&gt;ia_uid) {</div><div class='del'>-                                op_ret = -1;</div><div class='del'>-                                op_errno = EPERM;</div><div class='del'>-                                goto out;</div><div class='del'>-                        }</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                /* non-super-user can modify file group if he is owner of a</div><div class='del'>-                 * file and gid he is setting is in his groups list.</div><div class='del'>-                 * Ref: posix-testsuite/chown/00.t</div><div class='del'>-                 */</div><div class='del'>-                if ((frame-&gt;root-&gt;uid != 0) &amp;&amp; (gf_attr_gid_set (valid))) {</div><div class='del'>-                        if (frame-&gt;root-&gt;uid != buf-&gt;ia_uid) {</div><div class='del'>-                                op_ret = -1;</div><div class='del'>-                                op_errno = EPERM;</div><div class='del'>-                                goto out;</div><div class='del'>-                        }</div><div class='del'>-</div><div class='del'>-                        op_ret = ac_test_access (setbuf, 0, frame-&gt;root-&gt;gid,</div><div class='del'>-                                                 frame-&gt;root-&gt;groups,</div><div class='del'>-                                                 frame-&gt;root-&gt;ngrps,</div><div class='del'>-                                                 ACCTEST_DONTCARE,</div><div class='del'>-                                                 ACCTEST_GROUP, &amp;op_errno);</div><div class='del'>-                        if (op_ret == -1)</div><div class='del'>-                                goto out;</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        call_resume (stub);</div><div class='del'>-out:</div><div class='del'>-        if (op_ret &lt; 0) {</div><div class='del'>-                STACK_UNWIND_STRICT (setattr, frame, -1, op_errno, NULL, NULL);</div><div class='del'>-                if (stub)</div><div class='del'>-                        call_stub_destroy (stub);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-ac_setattr (call_frame_t *frame, xlator_t *this, loc_t *loc, struct iatt *buf,</div><div class='del'>-            int32_t valid)</div><div class='del'>-{</div><div class='del'>-        call_stub_t     *stub = NULL;</div><div class='del'>-        int             ret = -EFAULT;</div><div class='del'>-</div><div class='del'>-        stub = fop_setattr_stub (frame, ac_setattr_resume, loc, buf, valid);</div><div class='del'>-	if (!stub) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_ERROR, "cannot create call stub: "</div><div class='del'>-                        "(out of memory)");</div><div class='del'>-                ret = -ENOMEM;</div><div class='del'>-                goto out;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-        frame-&gt;local = stub;</div><div class='del'>-        STACK_WIND (frame, ac_setattr_stat_cbk, FIRST_CHILD (this),</div><div class='del'>-                    FIRST_CHILD (this)-&gt;fops-&gt;stat, loc);</div><div class='del'>-        ret = 0;</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        if (ret &lt; 0)</div><div class='del'>-                STACK_UNWIND_STRICT (setattr, frame, -1, -ret, NULL, NULL);</div><div class='del'>-</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-ac_fsetattr_resume (call_frame_t *frame, xlator_t *this, fd_t *fd,</div><div class='del'>-                    struct iatt *buf, int32_t valid)</div><div class='del'>-{</div><div class='del'>-        STACK_WIND (frame, default_fsetattr_cbk, FIRST_CHILD(this),</div><div class='del'>-                    FIRST_CHILD(this)-&gt;fops-&gt;fsetattr, fd, buf, valid);</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-ac_fsetattr_fstat_cbk (call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='del'>-                       int32_t op_ret, int32_t op_errno, struct iatt *buf)</div><div class='del'>-{</div><div class='del'>-        call_stub_t     *stub = NULL;</div><div class='del'>-        int32_t         valid = 0;</div><div class='del'>-        struct iatt     *setbuf = NULL;</div><div class='del'>-</div><div class='del'>-        stub = __get_frame_stub (frame);</div><div class='del'>-        if (op_ret == -1)</div><div class='del'>-                goto out;</div><div class='del'>-</div><div class='del'>-        op_ret = ac_test_access (buf, frame-&gt;root-&gt;uid, frame-&gt;root-&gt;gid,</div><div class='del'>-                                 frame-&gt;root-&gt;groups, frame-&gt;root-&gt;ngrps,</div><div class='del'>-                                 ACCTEST_DONTCARE, ACCTEST_OWNER,</div><div class='del'>-                                 &amp;op_errno);</div><div class='del'>-        if (op_ret == -1)</div><div class='del'>-                goto out;</div><div class='del'>-</div><div class='del'>-        valid = stub-&gt;args.fsetattr.valid;</div><div class='del'>-        setbuf = &amp;stub-&gt;args.fsetattr.stbuf;</div><div class='del'>-        if (gf_attr_uid_set (valid) &amp;&amp; gf_attr_gid_set (valid)) {</div><div class='del'>-                /* chown returns EPERM if the operation would change the</div><div class='del'>-                 * ownership, but the effective user ID is not the</div><div class='del'>-                 * super-user and the process is not an owner of the file.</div><div class='del'>-                 * Ref: posix-testsuite/chown/07.t</div><div class='del'>-                 */</div><div class='del'>-                if ((frame-&gt;root-&gt;uid != 0) &amp;&amp; (gf_attr_uid_set (valid))) {</div><div class='del'>-                        if (buf-&gt;ia_uid != setbuf-&gt;ia_uid) {</div><div class='del'>-                                op_ret = -1;</div><div class='del'>-                                op_errno = EPERM;</div><div class='del'>-                                goto out;</div><div class='del'>-                        }</div><div class='del'>-                }</div><div class='del'>-</div><div class='del'>-                /* non-super-user can modify file group if he is owner of a</div><div class='del'>-                 * file and gid he is setting is in his groups list.</div><div class='del'>-                 * Ref: posix-testsuite/chown/00.t</div><div class='del'>-                 */</div><div class='del'>-                if ((frame-&gt;root-&gt;uid != 0) &amp;&amp; (gf_attr_gid_set (valid))) {</div><div class='del'>-                        if (frame-&gt;root-&gt;uid != buf-&gt;ia_uid) {</div><div class='del'>-                                op_ret = -1;</div><div class='del'>-                                op_errno = EPERM;</div><div class='del'>-                                goto out;</div><div class='del'>-                        }</div><div class='del'>-</div><div class='del'>-                        op_ret = ac_test_access (buf, 0, frame-&gt;root-&gt;gid,</div><div class='del'>-                                                 frame-&gt;root-&gt;groups,</div><div class='del'>-                                                 frame-&gt;root-&gt;ngrps,</div><div class='del'>-                                                 ACCTEST_DONTCARE,</div><div class='del'>-                                                 ACCTEST_GROUP, &amp;op_errno);</div><div class='del'>-                        if (op_ret == -1)</div><div class='del'>-                                goto out;</div><div class='del'>-                }</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        call_resume (stub);</div><div class='del'>-out:</div><div class='del'>-        if (op_ret &lt; 0) {</div><div class='del'>-                STACK_UNWIND_STRICT (fsetattr, frame, -1, op_errno, NULL, NULL);</div><div class='del'>-                if (stub)</div><div class='del'>-                        call_stub_destroy (stub);</div><div class='del'>-        }</div><div class='del'>-</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-int32_t</div><div class='del'>-ac_fsetattr (call_frame_t *frame, xlator_t *this, fd_t *fd, struct iatt *buf,</div><div class='del'>-             int32_t valid)</div><div class='del'>-{</div><div class='del'>-        call_stub_t     *stub = NULL;</div><div class='del'>-        int             ret = -EFAULT;</div><div class='del'>-</div><div class='del'>-        stub = fop_fsetattr_stub (frame, ac_fsetattr_resume, fd, buf, valid);</div><div class='del'>-	if (!stub) {</div><div class='del'>-		gf_log (this-&gt;name, GF_LOG_ERROR, "cannot create call stub: "</div><div class='del'>-                        "(out of memory)");</div><div class='del'>-                ret = -ENOMEM;</div><div class='del'>-                goto out;</div><div class='del'>-	}</div><div class='del'>-</div><div class='del'>-        frame-&gt;local = stub;</div><div class='del'>-        STACK_WIND (frame, ac_fsetattr_fstat_cbk, FIRST_CHILD (this),</div><div class='del'>-                    FIRST_CHILD (this)-&gt;fops-&gt;fstat, fd);</div><div class='del'>-        ret = 0;</div><div class='del'>-</div><div class='del'>-out:</div><div class='del'>-        if (ret &lt; 0)</div><div class='del'>-                STACK_UNWIND_STRICT (fsetattr, frame, -1, -ret, NULL, NULL);</div><div class='del'>-</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-struct xlator_fops fops = {</div><div class='del'>-        .truncate       = ac_truncate,</div><div class='del'>-        .access         = ac_access,</div><div class='del'>-        .readlink       = ac_readlink,</div><div class='del'>-        .mknod          = ac_mknod,</div><div class='del'>-        .mkdir          = ac_mkdir,</div><div class='del'>-        .unlink         = ac_unlink,</div><div class='del'>-        .rmdir          = ac_rmdir,</div><div class='del'>-        .symlink        = ac_symlink,</div><div class='del'>-        .rename         = ac_rename,</div><div class='del'>-        .link           = ac_link,</div><div class='del'>-        .create         = ac_create,</div><div class='del'>-        .open           = ac_open,</div><div class='del'>-        .readv          = ac_readv,</div><div class='del'>-        .writev         = ac_writev,</div><div class='del'>-        .opendir        = ac_opendir,</div><div class='del'>-        .setattr        = ac_setattr,</div><div class='del'>-        .fsetattr       = ac_fsetattr,</div><div class='del'>-};</div><div class='del'>-</div><div class='del'>-int</div><div class='del'>-init (xlator_t *this)</div><div class='del'>-{</div><div class='del'>-        return 0;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-void</div><div class='del'>-fini (xlator_t *this)</div><div class='del'>-{</div><div class='del'>-        return;</div><div class='del'>-}</div><div class='del'>-</div><div class='del'>-struct xlator_cbks cbks = {</div><div class='del'>-};</div><div class='head'>diff --git a/xlators/features/access-control/src/access-control.h b/xlators/features/access-control/src/access-control.h<br/>deleted file mode 100644<br/>index bfc0d775270..00000000000<br/>--- a/<a href='/cgit/glusterfs.git/tree/xlators/features/access-control/src/access-control.h?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>xlators/features/access-control/src/access-control.h</a><br/>+++ /dev/null</div><div class='hunk'>@@ -1,55 +0,0 @@</div><div class='del'>-/*</div><div class='del'>-  Copyright (c) 2010 Gluster, Inc. &lt;http://www.gluster.com&gt;</div><div class='del'>-  This file is part of GlusterFS.</div><div class='del'>-</div><div class='del'>-  GlusterFS is free software; you can redistribute it and/or modify</div><div class='del'>-  it under the terms of the GNU General Public License as published</div><div class='del'>-  by the Free Software Foundation; either version 3 of the License,</div><div class='del'>-  or (at your option) any later version.</div><div class='del'>-</div><div class='del'>-  GlusterFS is distributed in the hope that it will be useful, but</div><div class='del'>-  WITHOUT ANY WARRANTY; without even the implied warranty of</div><div class='del'>-  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</div><div class='del'>-  General Public License for more details.</div><div class='del'>-</div><div class='del'>-  You should have received a copy of the GNU General Public License</div><div class='del'>-  along with this program.  If not, see</div><div class='del'>-  &lt;http://www.gnu.org/licenses/&gt;.</div><div class='del'>-*/</div><div class='del'>-</div><div class='del'>-</div><div class='del'>-#ifndef __ACCESS_CONTROL_H_</div><div class='del'>-#define __ACCESS_CONTROL_H_</div><div class='del'>-</div><div class='del'>-#ifndef _CONFIG_H</div><div class='del'>-#define _CONFIG_H</div><div class='del'>-#include "config.h"</div><div class='del'>-#endif</div><div class='del'>-</div><div class='del'>-#define ACTRL                   "access-control"</div><div class='del'>-#define ACCTEST_READ            0x1</div><div class='del'>-#define ACCTEST_WRITE           0x2</div><div class='del'>-#define ACCTEST_EXEC            0x4</div><div class='del'>-#define ACCTEST_DONTCARE        0x8</div><div class='del'>-</div><div class='del'>-/* Note if the caller is only interested in ownership test i.e. one of the below</div><div class='del'>-+ * in combination with GF_ACCTEST_DONTCARE, then only one type of user's owner</div><div class='del'>-+ * ship can be tested with one call to gf_test_access, i.e. we can only</div><div class='del'>-+ * check of either owner and group, if both need to be tested for a specific</div><div class='del'>-+ * (uid, gid) pair then two calls will be needed.</div><div class='del'>-+ */</div><div class='del'>-#define ACCTEST_OWNER           0x1</div><div class='del'>-#define ACCTEST_GROUP           0x2</div><div class='del'>-#define ACCTEST_OTHER           0x4</div><div class='del'>-</div><div class='del'>-/* Signifies any user, as long as we get access. */</div><div class='del'>-#define ACCTEST_ANY             (ACCTEST_OWNER | ACCTEST_GROUP | ACCTEST_OTHER)</div><div class='del'>-</div><div class='del'>-#define ac_test_owner(acc)      ((acc) &amp; ACCTEST_OWNER)</div><div class='del'>-#define ac_test_group(acc)      ((acc) &amp; ACCTEST_GROUP)</div><div class='del'>-#define ac_test_other(acc)      ((acc) &amp; ACCTEST_OTHER)</div><div class='del'>-#define ac_test_dontcare(acc)   ((acc) &amp; ACCTEST_DONTCARE)</div><div class='del'>-#define ac_test_read(acc)       ((acc) &amp; ACCTEST_READ)</div><div class='del'>-#define ac_test_write(acc)      ((acc) &amp; ACCTEST_WRITE)</div><div class='del'>-#define ac_test_exec(acc)       ((acc) &amp; ACCTEST_EXEC)</div><div class='del'>-#endif</div><div class='head'>diff --git a/scheduler/random/Makefile.am b/xlators/features/arbiter/Makefile.am<br/>index d471a3f9243..a985f42a877 100644<br/>--- a/<a href='/cgit/glusterfs.git/tree/scheduler/random/Makefile.am?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>scheduler/random/Makefile.am</a><br/>+++ b/<a href='/cgit/glusterfs.git/tree/xlators/features/arbiter/Makefile.am?id=d1d7a6f35c816822fab51c820e25023863c239c1'>xlators/features/arbiter/Makefile.am</a></div><div class='hunk'>@@ -1,3 +1,3 @@</div><div class='ctx'> SUBDIRS = src</div><div class='ctx'> </div><div class='del'>-CLEANFILES = </div><div class='add'>+CLEANFILES =</div><div class='head'>diff --git a/xlators/features/arbiter/src/Makefile.am b/xlators/features/arbiter/src/Makefile.am<br/>new file mode 100644<br/>index 00000000000..badc42f37be<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/xlators/features/arbiter/src/Makefile.am?id=d1d7a6f35c816822fab51c820e25023863c239c1'>xlators/features/arbiter/src/Makefile.am</a></div><div class='hunk'>@@ -0,0 +1,19 @@</div><div class='add'>+if WITH_SERVER</div><div class='add'>+xlator_LTLIBRARIES = arbiter.la</div><div class='add'>+endif</div><div class='add'>+</div><div class='add'>+xlatordir = $(libdir)/glusterfs/$(PACKAGE_VERSION)/xlator/features</div><div class='add'>+</div><div class='add'>+arbiter_la_LDFLAGS = -module $(GF_XLATOR_DEFAULT_LDFLAGS)</div><div class='add'>+</div><div class='add'>+arbiter_la_SOURCES = arbiter.c</div><div class='add'>+arbiter_la_LIBADD = $(top_builddir)/libglusterfs/src/libglusterfs.la</div><div class='add'>+</div><div class='add'>+noinst_HEADERS = arbiter.h arbiter-mem-types.h</div><div class='add'>+</div><div class='add'>+AM_CPPFLAGS = $(GF_CPPFLAGS) -I$(top_srcdir)/libglusterfs/src \</div><div class='add'>+	-I$(top_srcdir)/rpc/xdr/src -I$(top_builddir)/rpc/xdr/src</div><div class='add'>+</div><div class='add'>+AM_CFLAGS = -Wall $(GF_CFLAGS)</div><div class='add'>+</div><div class='add'>+CLEANFILES =</div><div class='head'>diff --git a/xlators/features/arbiter/src/arbiter-mem-types.h b/xlators/features/arbiter/src/arbiter-mem-types.h<br/>new file mode 100644<br/>index 00000000000..05d18374c46<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/xlators/features/arbiter/src/arbiter-mem-types.h?id=d1d7a6f35c816822fab51c820e25023863c239c1'>xlators/features/arbiter/src/arbiter-mem-types.h</a></div><div class='hunk'>@@ -0,0 +1,18 @@</div><div class='add'>+/*</div><div class='add'>+  Copyright (c) 2015 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#ifndef __ARBITER_MEM_TYPES_H__</div><div class='add'>+#define __ARBITER_MEM_TYPES_H__</div><div class='add'>+#include &lt;glusterfs/mem-types.h&gt;</div><div class='add'>+</div><div class='add'>+typedef enum gf_arbiter_mem_types_ {</div><div class='add'>+    gf_arbiter_mt_inode_ctx_t = gf_common_mt_end + 1,</div><div class='add'>+    gf_arbiter_mt_end</div><div class='add'>+} gf_arbiter_mem_types_t;</div><div class='add'>+#endif</div><div class='head'>diff --git a/xlators/features/arbiter/src/arbiter.c b/xlators/features/arbiter/src/arbiter.c<br/>new file mode 100644<br/>index 00000000000..83a97e3354b<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/xlators/features/arbiter/src/arbiter.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>xlators/features/arbiter/src/arbiter.c</a></div><div class='hunk'>@@ -0,0 +1,380 @@</div><div class='add'>+/*</div><div class='add'>+  Copyright (c) 2015 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#include "arbiter.h"</div><div class='add'>+#include "arbiter-mem-types.h"</div><div class='add'>+#include &lt;glusterfs/glusterfs.h&gt;</div><div class='add'>+#include &lt;glusterfs/xlator.h&gt;</div><div class='add'>+#include &lt;glusterfs/logging.h&gt;</div><div class='add'>+</div><div class='add'>+static arbiter_inode_ctx_t *</div><div class='add'>+__arbiter_inode_ctx_get(inode_t *inode, xlator_t *this)</div><div class='add'>+{</div><div class='add'>+    arbiter_inode_ctx_t *ctx = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    uint64_t ctx_addr = 0;</div><div class='add'>+</div><div class='add'>+    ret = __inode_ctx_get(inode, this, &amp;ctx_addr);</div><div class='add'>+    if (ret == 0) {</div><div class='add'>+        ctx = (arbiter_inode_ctx_t *)(long)ctx_addr;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ctx = GF_CALLOC(1, sizeof(*ctx), gf_arbiter_mt_inode_ctx_t);</div><div class='add'>+    if (!ctx)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    ret = __inode_ctx_put(inode, this, (uint64_t)(uintptr_t)ctx);</div><div class='add'>+    if (ret) {</div><div class='add'>+        GF_FREE(ctx);</div><div class='add'>+        ctx = NULL;</div><div class='add'>+        gf_log_callingfn(this-&gt;name, GF_LOG_ERROR,</div><div class='add'>+                         "failed to "</div><div class='add'>+                         "set the inode ctx (%s)",</div><div class='add'>+                         uuid_utoa(inode-&gt;gfid));</div><div class='add'>+    }</div><div class='add'>+out:</div><div class='add'>+    return ctx;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static arbiter_inode_ctx_t *</div><div class='add'>+arbiter_inode_ctx_get(inode_t *inode, xlator_t *this)</div><div class='add'>+{</div><div class='add'>+    arbiter_inode_ctx_t *ctx = NULL;</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;inode-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        ctx = __arbiter_inode_ctx_get(inode, this);</div><div class='add'>+    }</div><div class='add'>+    UNLOCK(&amp;inode-&gt;lock);</div><div class='add'>+    return ctx;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+arbiter_lookup_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                   int32_t op_ret, int32_t op_errno, inode_t *inode,</div><div class='add'>+                   struct iatt *buf, dict_t *xdata, struct iatt *postparent)</div><div class='add'>+{</div><div class='add'>+    arbiter_inode_ctx_t *ctx = NULL;</div><div class='add'>+</div><div class='add'>+    if (op_ret != 0)</div><div class='add'>+        goto unwind;</div><div class='add'>+    ctx = arbiter_inode_ctx_get(inode, this);</div><div class='add'>+    if (!ctx) {</div><div class='add'>+        op_ret = -1;</div><div class='add'>+        op_errno = ENOMEM;</div><div class='add'>+        goto unwind;</div><div class='add'>+    }</div><div class='add'>+    memcpy(&amp;ctx-&gt;iattbuf, buf, sizeof(ctx-&gt;iattbuf));</div><div class='add'>+</div><div class='add'>+unwind:</div><div class='add'>+    STACK_UNWIND_STRICT(lookup, frame, op_ret, op_errno, inode, buf, xdata,</div><div class='add'>+                        postparent);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+arbiter_lookup(call_frame_t *frame, xlator_t *this, loc_t *loc, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    STACK_WIND(frame, arbiter_lookup_cbk, FIRST_CHILD(this),</div><div class='add'>+               FIRST_CHILD(this)-&gt;fops-&gt;lookup, loc, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+arbiter_truncate(call_frame_t *frame, xlator_t *this, loc_t *loc, off_t offset,</div><div class='add'>+                 dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    arbiter_inode_ctx_t *ctx = NULL;</div><div class='add'>+    struct iatt *buf = NULL;</div><div class='add'>+    int32_t op_ret = 0;</div><div class='add'>+    int32_t op_errno = 0;</div><div class='add'>+</div><div class='add'>+    ctx = arbiter_inode_ctx_get(loc-&gt;inode, this);</div><div class='add'>+    if (!ctx) {</div><div class='add'>+        op_ret = -1;</div><div class='add'>+        op_errno = ENOMEM;</div><div class='add'>+        goto unwind;</div><div class='add'>+    }</div><div class='add'>+    buf = &amp;ctx-&gt;iattbuf;</div><div class='add'>+unwind:</div><div class='add'>+    STACK_UNWIND_STRICT(truncate, frame, op_ret, op_errno, buf, buf, NULL);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+arbiter_ftruncate(call_frame_t *frame, xlator_t *this, fd_t *fd, off_t offset,</div><div class='add'>+                  dict_t *xdata)</div><div class='add'>+</div><div class='add'>+{</div><div class='add'>+    arbiter_inode_ctx_t *ctx = NULL;</div><div class='add'>+    struct iatt *buf = NULL;</div><div class='add'>+    int32_t op_ret = 0;</div><div class='add'>+    int32_t op_errno = 0;</div><div class='add'>+</div><div class='add'>+    ctx = arbiter_inode_ctx_get(fd-&gt;inode, this);</div><div class='add'>+    if (!ctx) {</div><div class='add'>+        op_ret = -1;</div><div class='add'>+        op_errno = ENOMEM;</div><div class='add'>+        goto unwind;</div><div class='add'>+    }</div><div class='add'>+    buf = &amp;ctx-&gt;iattbuf;</div><div class='add'>+unwind:</div><div class='add'>+    STACK_UNWIND_STRICT(ftruncate, frame, op_ret, op_errno, buf, buf, NULL);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+dict_t *</div><div class='add'>+arbiter_fill_writev_xdata(fd_t *fd, dict_t *xdata, xlator_t *this)</div><div class='add'>+{</div><div class='add'>+    dict_t *rsp_xdata = NULL;</div><div class='add'>+    int32_t ret = 0;</div><div class='add'>+    int is_append = 1;</div><div class='add'>+</div><div class='add'>+    if (!fd || !fd-&gt;inode || gf_uuid_is_null(fd-&gt;inode-&gt;gfid)) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (!xdata)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    rsp_xdata = dict_new();</div><div class='add'>+    if (!rsp_xdata)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    if (dict_get(xdata, GLUSTERFS_OPEN_FD_COUNT)) {</div><div class='add'>+        ret = dict_set_uint32(rsp_xdata, GLUSTERFS_OPEN_FD_COUNT,</div><div class='add'>+                              fd-&gt;inode-&gt;fd_count);</div><div class='add'>+        if (ret &lt; 0) {</div><div class='add'>+            gf_msg_debug(this-&gt;name, 0,</div><div class='add'>+                         "Failed to set dict value"</div><div class='add'>+                         " for GLUSTERFS_OPEN_FD_COUNT");</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    if (dict_get(xdata, GLUSTERFS_WRITE_IS_APPEND)) {</div><div class='add'>+        ret = dict_set_uint32(rsp_xdata, GLUSTERFS_WRITE_IS_APPEND, is_append);</div><div class='add'>+        if (ret &lt; 0) {</div><div class='add'>+            gf_msg_debug(this-&gt;name, 0,</div><div class='add'>+                         "Failed to set dict value"</div><div class='add'>+                         " for GLUSTERFS_WRITE_IS_APPEND");</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+out:</div><div class='add'>+    return rsp_xdata;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+arbiter_writev(call_frame_t *frame, xlator_t *this, fd_t *fd,</div><div class='add'>+               struct iovec *vector, int32_t count, off_t off, uint32_t flags,</div><div class='add'>+               struct iobref *iobref, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    arbiter_inode_ctx_t *ctx = NULL;</div><div class='add'>+    struct iatt *buf = NULL;</div><div class='add'>+    dict_t *rsp_xdata = NULL;</div><div class='add'>+    int op_ret = 0;</div><div class='add'>+    int op_errno = 0;</div><div class='add'>+</div><div class='add'>+    ctx = arbiter_inode_ctx_get(fd-&gt;inode, this);</div><div class='add'>+    if (!ctx) {</div><div class='add'>+        op_ret = -1;</div><div class='add'>+        op_errno = ENOMEM;</div><div class='add'>+        goto unwind;</div><div class='add'>+    }</div><div class='add'>+    buf = &amp;ctx-&gt;iattbuf;</div><div class='add'>+    op_ret = iov_length(vector, count);</div><div class='add'>+    rsp_xdata = arbiter_fill_writev_xdata(fd, xdata, this);</div><div class='add'>+unwind:</div><div class='add'>+    STACK_UNWIND_STRICT(writev, frame, op_ret, op_errno, buf, buf, rsp_xdata);</div><div class='add'>+    if (rsp_xdata)</div><div class='add'>+        dict_unref(rsp_xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+arbiter_fallocate(call_frame_t *frame, xlator_t *this, fd_t *fd,</div><div class='add'>+                  int32_t keep_size, off_t offset, size_t len, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    arbiter_inode_ctx_t *ctx = NULL;</div><div class='add'>+    struct iatt *buf = NULL;</div><div class='add'>+    int op_ret = 0;</div><div class='add'>+    int op_errno = 0;</div><div class='add'>+</div><div class='add'>+    ctx = arbiter_inode_ctx_get(fd-&gt;inode, this);</div><div class='add'>+    if (!ctx) {</div><div class='add'>+        op_ret = -1;</div><div class='add'>+        op_errno = ENOMEM;</div><div class='add'>+        goto unwind;</div><div class='add'>+    }</div><div class='add'>+    buf = &amp;ctx-&gt;iattbuf;</div><div class='add'>+unwind:</div><div class='add'>+    STACK_UNWIND_STRICT(fallocate, frame, op_ret, op_errno, buf, buf, NULL);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+arbiter_discard(call_frame_t *frame, xlator_t *this, fd_t *fd, off_t offset,</div><div class='add'>+                size_t len, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    arbiter_inode_ctx_t *ctx = NULL;</div><div class='add'>+    struct iatt *buf = NULL;</div><div class='add'>+    int op_ret = 0;</div><div class='add'>+    int op_errno = 0;</div><div class='add'>+</div><div class='add'>+    ctx = arbiter_inode_ctx_get(fd-&gt;inode, this);</div><div class='add'>+    if (!ctx) {</div><div class='add'>+        op_ret = -1;</div><div class='add'>+        op_errno = ENOMEM;</div><div class='add'>+        goto unwind;</div><div class='add'>+    }</div><div class='add'>+    buf = &amp;ctx-&gt;iattbuf;</div><div class='add'>+unwind:</div><div class='add'>+    STACK_UNWIND_STRICT(discard, frame, op_ret, op_errno, buf, buf, NULL);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+arbiter_zerofill(call_frame_t *frame, xlator_t *this, fd_t *fd, off_t offset,</div><div class='add'>+                 off_t len, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    arbiter_inode_ctx_t *ctx = NULL;</div><div class='add'>+    struct iatt *buf = NULL;</div><div class='add'>+    int op_ret = 0;</div><div class='add'>+    int op_errno = 0;</div><div class='add'>+</div><div class='add'>+    ctx = arbiter_inode_ctx_get(fd-&gt;inode, this);</div><div class='add'>+    if (!ctx) {</div><div class='add'>+        op_ret = -1;</div><div class='add'>+        op_errno = ENOMEM;</div><div class='add'>+        goto unwind;</div><div class='add'>+    }</div><div class='add'>+    buf = &amp;ctx-&gt;iattbuf;</div><div class='add'>+unwind:</div><div class='add'>+    STACK_UNWIND_STRICT(zerofill, frame, op_ret, op_errno, buf, buf, NULL);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int32_t</div><div class='add'>+arbiter_readv(call_frame_t *frame, xlator_t *this, fd_t *fd, size_t size,</div><div class='add'>+              off_t offset, uint32_t flags, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    STACK_UNWIND_STRICT(readv, frame, -1, ENOSYS, NULL, 0, NULL, NULL, NULL);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int32_t</div><div class='add'>+arbiter_seek(call_frame_t *frame, xlator_t *this, fd_t *fd, off_t offset,</div><div class='add'>+             gf_seek_what_t what, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    STACK_UNWIND_STRICT(seek, frame, -1, ENOSYS, 0, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+mem_acct_init(xlator_t *this)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    ret = xlator_mem_acct_init(this, gf_arbiter_mt_end + 1);</div><div class='add'>+    if (ret)</div><div class='add'>+        gf_log(this-&gt;name, GF_LOG_ERROR,</div><div class='add'>+               "Memory accounting "</div><div class='add'>+               "initialization failed.");</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+reconfigure(xlator_t *this, dict_t *options)</div><div class='add'>+{</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+arbiter_forget(xlator_t *this, inode_t *inode)</div><div class='add'>+{</div><div class='add'>+    arbiter_inode_ctx_t *ctx = NULL;</div><div class='add'>+    uint64_t ctx_addr = 0;</div><div class='add'>+</div><div class='add'>+    inode_ctx_del(inode, this, &amp;ctx_addr);</div><div class='add'>+    if (!ctx_addr)</div><div class='add'>+        return 0;</div><div class='add'>+    ctx = (arbiter_inode_ctx_t *)(long)ctx_addr;</div><div class='add'>+    GF_FREE(ctx);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+init(xlator_t *this)</div><div class='add'>+{</div><div class='add'>+    if (!this-&gt;children || this-&gt;children-&gt;next) {</div><div class='add'>+        gf_log(this-&gt;name, GF_LOG_ERROR,</div><div class='add'>+               "'arbiter' not configured with exactly one child");</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (!this-&gt;parents)</div><div class='add'>+        gf_log(this-&gt;name, GF_LOG_ERROR, "dangling volume. check volfile ");</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+fini(xlator_t *this)</div><div class='add'>+{</div><div class='add'>+    return;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+struct xlator_fops fops = {</div><div class='add'>+    .lookup = arbiter_lookup,</div><div class='add'>+</div><div class='add'>+    /* Return success for these inode write FOPS without winding it down to</div><div class='add'>+     * posix; this is needed for AFR write transaction logic to work.*/</div><div class='add'>+    .truncate = arbiter_truncate,</div><div class='add'>+    .writev = arbiter_writev,</div><div class='add'>+    .ftruncate = arbiter_ftruncate,</div><div class='add'>+    .fallocate = arbiter_fallocate,</div><div class='add'>+    .discard = arbiter_discard,</div><div class='add'>+    .zerofill = arbiter_zerofill,</div><div class='add'>+</div><div class='add'>+    /* AFR is not expected to wind these inode read FOPS initiated by the</div><div class='add'>+     * application to the arbiter brick. But in case a bug causes them</div><div class='add'>+     * to be called, we return ENOSYS. */</div><div class='add'>+    .readv = arbiter_readv,</div><div class='add'>+    .seek = arbiter_seek,</div><div class='add'>+</div><div class='add'>+    /* The following inode read FOPS initiated by the application are not</div><div class='add'>+     * wound by AFR either but internal logic like  shd, glfsheal and</div><div class='add'>+     * client side healing in AFR will send them for selfheal/ inode refresh</div><div class='add'>+     * operations etc.,so we need to wind them down to posix:</div><div class='add'>+     *</div><div class='add'>+     * (f)stat, readdir(p), readlink, (f)getxattr.*/</div><div class='add'>+</div><div class='add'>+    /* All other FOPs not listed here are safe to be wound down to posix.*/</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct xlator_cbks cbks = {</div><div class='add'>+    .forget = arbiter_forget,</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct volume_options options[] = {</div><div class='add'>+    {.key = {NULL}},</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+xlator_api_t xlator_api = {</div><div class='add'>+    .init = init,</div><div class='add'>+    .fini = fini,</div><div class='add'>+    .reconfigure = reconfigure,</div><div class='add'>+    .mem_acct_init = mem_acct_init,</div><div class='add'>+    .op_version = {1}, /* Present from the initial version */</div><div class='add'>+    .fops = &amp;fops,</div><div class='add'>+    .cbks = &amp;cbks,</div><div class='add'>+    .options = options,</div><div class='add'>+    .identifier = "arbiter",</div><div class='add'>+    .category = GF_MAINTAINED,</div><div class='add'>+};</div><div class='head'>diff --git a/xlators/features/arbiter/src/arbiter.h b/xlators/features/arbiter/src/arbiter.h<br/>new file mode 100644<br/>index 00000000000..546db7b751a<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/xlators/features/arbiter/src/arbiter.h?id=d1d7a6f35c816822fab51c820e25023863c239c1'>xlators/features/arbiter/src/arbiter.h</a></div><div class='hunk'>@@ -0,0 +1,21 @@</div><div class='add'>+/*</div><div class='add'>+  Copyright (c) 2015 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#ifndef _ARBITER_H</div><div class='add'>+#define _ARBITER_H</div><div class='add'>+</div><div class='add'>+#include &lt;glusterfs/locking.h&gt;</div><div class='add'>+#include &lt;glusterfs/common-utils.h&gt;</div><div class='add'>+</div><div class='add'>+typedef struct arbiter_inode_ctx_ {</div><div class='add'>+    struct iatt iattbuf;</div><div class='add'>+} arbiter_inode_ctx_t;</div><div class='add'>+</div><div class='add'>+#endif /* _ARBITER_H */</div><div class='head'>diff --git a/xlators/features/barrier/Makefile.am b/xlators/features/barrier/Makefile.am<br/>new file mode 100644<br/>index 00000000000..a985f42a877<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/xlators/features/barrier/Makefile.am?id=d1d7a6f35c816822fab51c820e25023863c239c1'>xlators/features/barrier/Makefile.am</a></div><div class='hunk'>@@ -0,0 +1,3 @@</div><div class='add'>+SUBDIRS = src</div><div class='add'>+</div><div class='add'>+CLEANFILES =</div><div class='head'>diff --git a/xlators/features/barrier/src/Makefile.am b/xlators/features/barrier/src/Makefile.am<br/>new file mode 100644<br/>index 00000000000..25099bc56e5<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/xlators/features/barrier/src/Makefile.am?id=d1d7a6f35c816822fab51c820e25023863c239c1'>xlators/features/barrier/src/Makefile.am</a></div><div class='hunk'>@@ -0,0 +1,17 @@</div><div class='add'>+xlator_LTLIBRARIES = barrier.la</div><div class='add'>+xlatordir = $(libdir)/glusterfs/$(PACKAGE_VERSION)/xlator/features</div><div class='add'>+</div><div class='add'>+barrier_la_LDFLAGS = -module $(GF_XLATOR_DEFAULT_LDFLAGS)</div><div class='add'>+</div><div class='add'>+barrier_la_SOURCES = barrier.c</div><div class='add'>+</div><div class='add'>+barrier_la_LIBADD = $(top_builddir)/libglusterfs/src/libglusterfs.la</div><div class='add'>+</div><div class='add'>+noinst_HEADERS = barrier.h barrier-mem-types.h</div><div class='add'>+</div><div class='add'>+AM_CPPFLAGS = $(GF_CPPFLAGS) -I$(top_srcdir)/libglusterfs/src \</div><div class='add'>+	-I$(top_srcdir)/rpc/xdr/src -I$(top_builddir)/rpc/xdr/src</div><div class='add'>+</div><div class='add'>+AM_CFLAGS = -Wall $(GF_CFLAGS)</div><div class='add'>+</div><div class='add'>+CLEANFILES =</div><div class='head'>diff --git a/xlators/features/barrier/src/barrier-mem-types.h b/xlators/features/barrier/src/barrier-mem-types.h<br/>new file mode 100644<br/>index 00000000000..71ed7898d9c<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/xlators/features/barrier/src/barrier-mem-types.h?id=d1d7a6f35c816822fab51c820e25023863c239c1'>xlators/features/barrier/src/barrier-mem-types.h</a></div><div class='hunk'>@@ -0,0 +1,20 @@</div><div class='add'>+/*</div><div class='add'>+   Copyright (c) 2014 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+   This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+   This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+   General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+   later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+   cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#ifndef __BARRIER_MEM_TYPES_H__</div><div class='add'>+#define __BARRIER_MEM_TYPES_H__</div><div class='add'>+</div><div class='add'>+#include &lt;glusterfs/mem-types.h&gt;</div><div class='add'>+</div><div class='add'>+enum gf_barrier_mem_types_ {</div><div class='add'>+    gf_barrier_mt_priv_t = gf_common_mt_end + 1,</div><div class='add'>+    gf_barrier_mt_end</div><div class='add'>+};</div><div class='add'>+#endif</div><div class='head'>diff --git a/xlators/features/barrier/src/barrier.c b/xlators/features/barrier/src/barrier.c<br/>new file mode 100644<br/>index 00000000000..852bbacb99d<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/xlators/features/barrier/src/barrier.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>xlators/features/barrier/src/barrier.c</a></div><div class='hunk'>@@ -0,0 +1,809 @@</div><div class='add'>+/*</div><div class='add'>+   Copyright (c) 2014 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+   This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+   This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+   General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+   later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+   cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#include "barrier.h"</div><div class='add'>+#include &lt;glusterfs/defaults.h&gt;</div><div class='add'>+#include &lt;glusterfs/call-stub.h&gt;</div><div class='add'>+</div><div class='add'>+#include &lt;glusterfs/statedump.h&gt;</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+barrier_local_set_gfid(call_frame_t *frame, uuid_t gfid, xlator_t *this)</div><div class='add'>+{</div><div class='add'>+    if (gfid) {</div><div class='add'>+        uuid_t *id = GF_MALLOC(sizeof(uuid_t), gf_common_mt_uuid_t);</div><div class='add'>+        if (!id) {</div><div class='add'>+            gf_log(this-&gt;name, GF_LOG_WARNING,</div><div class='add'>+                   "Could not set gfid"</div><div class='add'>+                   ". gfid will not be dumped in statedump file.");</div><div class='add'>+            return;</div><div class='add'>+        }</div><div class='add'>+        gf_uuid_copy(*id, gfid);</div><div class='add'>+        frame-&gt;local = id;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+barrier_local_free_gfid(call_frame_t *frame)</div><div class='add'>+{</div><div class='add'>+    if (frame-&gt;local) {</div><div class='add'>+        GF_FREE(frame-&gt;local);</div><div class='add'>+        frame-&gt;local = NULL;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+barrier_truncate_cbk_resume(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                            int32_t op_ret, int32_t op_errno,</div><div class='add'>+                            struct iatt *prebuf, struct iatt *postbuf,</div><div class='add'>+                            dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    barrier_local_free_gfid(frame);</div><div class='add'>+    STACK_UNWIND_STRICT(truncate, frame, op_ret, op_errno, prebuf, postbuf,</div><div class='add'>+                        xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+barrier_ftruncate_cbk_resume(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                             int32_t op_ret, int32_t op_errno,</div><div class='add'>+                             struct iatt *prebuf, struct iatt *postbuf,</div><div class='add'>+                             dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    barrier_local_free_gfid(frame);</div><div class='add'>+    STACK_UNWIND_STRICT(ftruncate, frame, op_ret, op_errno, prebuf, postbuf,</div><div class='add'>+                        xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+barrier_unlink_cbk_resume(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                          int32_t op_ret, int32_t op_errno,</div><div class='add'>+                          struct iatt *preparent, struct iatt *postparent,</div><div class='add'>+                          dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    barrier_local_free_gfid(frame);</div><div class='add'>+    STACK_UNWIND_STRICT(unlink, frame, op_ret, op_errno, preparent, postparent,</div><div class='add'>+                        xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+barrier_rmdir_cbk_resume(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                         int32_t op_ret, int32_t op_errno,</div><div class='add'>+                         struct iatt *preparent, struct iatt *postparent,</div><div class='add'>+                         dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    barrier_local_free_gfid(frame);</div><div class='add'>+    STACK_UNWIND_STRICT(rmdir, frame, op_ret, op_errno, preparent, postparent,</div><div class='add'>+                        xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+barrier_rename_cbk_resume(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                          int32_t op_ret, int32_t op_errno, struct iatt *buf,</div><div class='add'>+                          struct iatt *preoldparent, struct iatt *postoldparent,</div><div class='add'>+                          struct iatt *prenewparent, struct iatt *postnewparent,</div><div class='add'>+                          dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    barrier_local_free_gfid(frame);</div><div class='add'>+    STACK_UNWIND_STRICT(rename, frame, op_ret, op_errno, buf, preoldparent,</div><div class='add'>+                        postoldparent, prenewparent, postnewparent, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+barrier_writev_cbk_resume(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                          int32_t op_ret, int32_t op_errno, struct iatt *prebuf,</div><div class='add'>+                          struct iatt *postbuf, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    barrier_local_free_gfid(frame);</div><div class='add'>+    STACK_UNWIND_STRICT(writev, frame, op_ret, op_errno, prebuf, postbuf,</div><div class='add'>+                        xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+barrier_fsync_cbk_resume(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                         int32_t op_ret, int32_t op_errno, struct iatt *prebuf,</div><div class='add'>+                         struct iatt *postbuf, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    barrier_local_free_gfid(frame);</div><div class='add'>+    STACK_UNWIND_STRICT(fsync, frame, op_ret, op_errno, prebuf, postbuf, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+barrier_removexattr_cbk_resume(call_frame_t *frame, void *cookie,</div><div class='add'>+                               xlator_t *this, int32_t op_ret, int32_t op_errno,</div><div class='add'>+                               dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    barrier_local_free_gfid(frame);</div><div class='add'>+    STACK_UNWIND_STRICT(removexattr, frame, op_ret, op_errno, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+barrier_fremovexattr_cbk_resume(call_frame_t *frame, void *cookie,</div><div class='add'>+                                xlator_t *this, int32_t op_ret,</div><div class='add'>+                                int32_t op_errno, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    barrier_local_free_gfid(frame);</div><div class='add'>+    STACK_UNWIND_STRICT(fremovexattr, frame, op_ret, op_errno, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+barrier_writev_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                   int32_t op_ret, int32_t op_errno, struct iatt *prebuf,</div><div class='add'>+                   struct iatt *postbuf, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    BARRIER_FOP_CBK(writev, out, frame, this, op_ret, op_errno, prebuf, postbuf,</div><div class='add'>+                    xdata);</div><div class='add'>+out:</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+barrier_fremovexattr_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                         int32_t op_ret, int32_t op_errno, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    BARRIER_FOP_CBK(fremovexattr, out, frame, this, op_ret, op_errno, xdata);</div><div class='add'>+out:</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+barrier_removexattr_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                        int32_t op_ret, int32_t op_errno, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    BARRIER_FOP_CBK(removexattr, out, frame, this, op_ret, op_errno, xdata);</div><div class='add'>+out:</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+barrier_truncate_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                     int32_t op_ret, int32_t op_errno, struct iatt *prebuf,</div><div class='add'>+                     struct iatt *postbuf, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    BARRIER_FOP_CBK(truncate, out, frame, this, op_ret, op_errno, prebuf,</div><div class='add'>+                    postbuf, xdata);</div><div class='add'>+out:</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+barrier_ftruncate_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                      int32_t op_ret, int32_t op_errno, struct iatt *prebuf,</div><div class='add'>+                      struct iatt *postbuf, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    BARRIER_FOP_CBK(ftruncate, out, frame, this, op_ret, op_errno, prebuf,</div><div class='add'>+                    postbuf, xdata);</div><div class='add'>+out:</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+barrier_rename_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                   int32_t op_ret, int32_t op_errno, struct iatt *buf,</div><div class='add'>+                   struct iatt *preoldparent, struct iatt *postoldparent,</div><div class='add'>+                   struct iatt *prenewparent, struct iatt *postnewparent,</div><div class='add'>+                   dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    BARRIER_FOP_CBK(rename, out, frame, this, op_ret, op_errno, buf,</div><div class='add'>+                    preoldparent, postoldparent, prenewparent, postnewparent,</div><div class='add'>+                    xdata);</div><div class='add'>+out:</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+barrier_rmdir_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                  int32_t op_ret, int32_t op_errno, struct iatt *preparent,</div><div class='add'>+                  struct iatt *postparent, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    BARRIER_FOP_CBK(rmdir, out, frame, this, op_ret, op_errno, preparent,</div><div class='add'>+                    postparent, xdata);</div><div class='add'>+out:</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+barrier_unlink_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                   int32_t op_ret, int32_t op_errno, struct iatt *preparent,</div><div class='add'>+                   struct iatt *postparent, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    BARRIER_FOP_CBK(unlink, out, frame, this, op_ret, op_errno, preparent,</div><div class='add'>+                    postparent, xdata);</div><div class='add'>+out:</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+barrier_fsync_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                  int32_t op_ret, int32_t op_errno, struct iatt *prebuf,</div><div class='add'>+                  struct iatt *postbuf, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    BARRIER_FOP_CBK(fsync, out, frame, this, op_ret, op_errno, prebuf, postbuf,</div><div class='add'>+                    xdata);</div><div class='add'>+out:</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+barrier_writev(call_frame_t *frame, xlator_t *this, fd_t *fd,</div><div class='add'>+               struct iovec *vector, int32_t count, off_t off, uint32_t flags,</div><div class='add'>+               struct iobref *iobref, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    if (!((flags | fd-&gt;flags) &amp; (O_SYNC | O_DSYNC))) {</div><div class='add'>+        STACK_WIND_TAIL(frame, FIRST_CHILD(this),</div><div class='add'>+                        FIRST_CHILD(this)-&gt;fops-&gt;writev, fd, vector, count, off,</div><div class='add'>+                        flags, iobref, xdata);</div><div class='add'>+</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    barrier_local_set_gfid(frame, fd-&gt;inode-&gt;gfid, this);</div><div class='add'>+    STACK_WIND(frame, barrier_writev_cbk, FIRST_CHILD(this),</div><div class='add'>+               FIRST_CHILD(this)-&gt;fops-&gt;writev, fd, vector, count, off, flags,</div><div class='add'>+               iobref, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+barrier_fremovexattr(call_frame_t *frame, xlator_t *this, fd_t *fd,</div><div class='add'>+                     const char *name, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    barrier_local_set_gfid(frame, fd-&gt;inode-&gt;gfid, this);</div><div class='add'>+    STACK_WIND(frame, barrier_fremovexattr_cbk, FIRST_CHILD(this),</div><div class='add'>+               FIRST_CHILD(this)-&gt;fops-&gt;fremovexattr, fd, name, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+barrier_removexattr(call_frame_t *frame, xlator_t *this, loc_t *loc,</div><div class='add'>+                    const char *name, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    barrier_local_set_gfid(frame, loc-&gt;inode-&gt;gfid, this);</div><div class='add'>+    STACK_WIND(frame, barrier_removexattr_cbk, FIRST_CHILD(this),</div><div class='add'>+               FIRST_CHILD(this)-&gt;fops-&gt;removexattr, loc, name, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+barrier_truncate(call_frame_t *frame, xlator_t *this, loc_t *loc, off_t offset,</div><div class='add'>+                 dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    barrier_local_set_gfid(frame, loc-&gt;inode-&gt;gfid, this);</div><div class='add'>+    STACK_WIND(frame, barrier_truncate_cbk, FIRST_CHILD(this),</div><div class='add'>+               FIRST_CHILD(this)-&gt;fops-&gt;truncate, loc, offset, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+barrier_rename(call_frame_t *frame, xlator_t *this, loc_t *oldloc,</div><div class='add'>+               loc_t *newloc, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    barrier_local_set_gfid(frame, oldloc-&gt;inode-&gt;gfid, this);</div><div class='add'>+    STACK_WIND(frame, barrier_rename_cbk, FIRST_CHILD(this),</div><div class='add'>+               FIRST_CHILD(this)-&gt;fops-&gt;rename, oldloc, newloc, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+barrier_rmdir(call_frame_t *frame, xlator_t *this, loc_t *loc, int flags,</div><div class='add'>+              dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    barrier_local_set_gfid(frame, loc-&gt;inode-&gt;gfid, this);</div><div class='add'>+    STACK_WIND(frame, barrier_rmdir_cbk, FIRST_CHILD(this),</div><div class='add'>+               FIRST_CHILD(this)-&gt;fops-&gt;rmdir, loc, flags, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+barrier_unlink(call_frame_t *frame, xlator_t *this, loc_t *loc, int xflag,</div><div class='add'>+               dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    barrier_local_set_gfid(frame, loc-&gt;inode-&gt;gfid, this);</div><div class='add'>+    STACK_WIND(frame, barrier_unlink_cbk, FIRST_CHILD(this),</div><div class='add'>+               FIRST_CHILD(this)-&gt;fops-&gt;unlink, loc, xflag, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+barrier_ftruncate(call_frame_t *frame, xlator_t *this, fd_t *fd, off_t offset,</div><div class='add'>+                  dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    barrier_local_set_gfid(frame, fd-&gt;inode-&gt;gfid, this);</div><div class='add'>+    STACK_WIND(frame, barrier_ftruncate_cbk, FIRST_CHILD(this),</div><div class='add'>+               FIRST_CHILD(this)-&gt;fops-&gt;ftruncate, fd, offset, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+barrier_fsync(call_frame_t *frame, xlator_t *this, fd_t *fd, int32_t flags,</div><div class='add'>+              dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    barrier_local_set_gfid(frame, fd-&gt;inode-&gt;gfid, this);</div><div class='add'>+    STACK_WIND(frame, barrier_fsync_cbk, FIRST_CHILD(this),</div><div class='add'>+               FIRST_CHILD(this)-&gt;fops-&gt;fsync, fd, flags, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+call_stub_t *</div><div class='add'>+__barrier_dequeue(xlator_t *this, struct list_head *queue)</div><div class='add'>+{</div><div class='add'>+    call_stub_t *stub = NULL;</div><div class='add'>+    barrier_priv_t *priv = NULL;</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+    GF_ASSERT(priv);</div><div class='add'>+</div><div class='add'>+    if (list_empty(queue))</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    stub = list_entry(queue-&gt;next, call_stub_t, list);</div><div class='add'>+    list_del_init(&amp;stub-&gt;list);</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return stub;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+barrier_dequeue_all(xlator_t *this, struct list_head *queue)</div><div class='add'>+{</div><div class='add'>+    call_stub_t *stub = NULL;</div><div class='add'>+</div><div class='add'>+    gf_log(this-&gt;name, GF_LOG_INFO, "Dequeuing all the barriered fops");</div><div class='add'>+</div><div class='add'>+    /* TODO: Start the below task in a new thread */</div><div class='add'>+    while ((stub = __barrier_dequeue(this, queue)))</div><div class='add'>+        call_resume(stub);</div><div class='add'>+</div><div class='add'>+    gf_log(this-&gt;name, GF_LOG_INFO,</div><div class='add'>+           "Dequeuing the barriered fops is "</div><div class='add'>+           "finished");</div><div class='add'>+    return;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+barrier_timeout(void *data)</div><div class='add'>+{</div><div class='add'>+    xlator_t *this = NULL;</div><div class='add'>+    barrier_priv_t *priv = NULL;</div><div class='add'>+    struct list_head queue = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    this = data;</div><div class='add'>+    THIS = this;</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    INIT_LIST_HEAD(&amp;queue);</div><div class='add'>+</div><div class='add'>+    gf_log(this-&gt;name, GF_LOG_CRITICAL,</div><div class='add'>+           "Disabling barrier because of "</div><div class='add'>+           "the barrier timeout.");</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;priv-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        __barrier_disable(this, &amp;queue);</div><div class='add'>+    }</div><div class='add'>+    UNLOCK(&amp;priv-&gt;lock);</div><div class='add'>+</div><div class='add'>+    barrier_dequeue_all(this, &amp;queue);</div><div class='add'>+</div><div class='add'>+    return;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+__barrier_enqueue(xlator_t *this, call_stub_t *stub)</div><div class='add'>+{</div><div class='add'>+    barrier_priv_t *priv = NULL;</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+    GF_ASSERT(priv);</div><div class='add'>+</div><div class='add'>+    list_add_tail(&amp;stub-&gt;list, &amp;priv-&gt;queue);</div><div class='add'>+    priv-&gt;queue_size++;</div><div class='add'>+</div><div class='add'>+    return;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+__barrier_disable(xlator_t *this, struct list_head *queue)</div><div class='add'>+{</div><div class='add'>+    GF_UNUSED int ret = 0;</div><div class='add'>+    barrier_priv_t *priv = NULL;</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+    GF_ASSERT(priv);</div><div class='add'>+</div><div class='add'>+    if (priv-&gt;timer) {</div><div class='add'>+        ret = gf_timer_call_cancel(this-&gt;ctx, priv-&gt;timer);</div><div class='add'>+        priv-&gt;timer = NULL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    list_splice_init(&amp;priv-&gt;queue, queue);</div><div class='add'>+    priv-&gt;queue_size = 0;</div><div class='add'>+    priv-&gt;barrier_enabled = _gf_false;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+__barrier_enable(xlator_t *this, barrier_priv_t *priv)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    priv-&gt;timer = gf_timer_call_after(this-&gt;ctx, priv-&gt;timeout, barrier_timeout,</div><div class='add'>+                                      (void *)this);</div><div class='add'>+    if (!priv-&gt;timer) {</div><div class='add'>+        gf_log(this-&gt;name, GF_LOG_CRITICAL,</div><div class='add'>+               "Couldn't add barrier "</div><div class='add'>+               "timeout event.");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    priv-&gt;barrier_enabled = _gf_true;</div><div class='add'>+    ret = 0;</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+notify(xlator_t *this, int event, void *data, ...)</div><div class='add'>+{</div><div class='add'>+    barrier_priv_t *priv = this-&gt;private;</div><div class='add'>+    dict_t *dict = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int barrier_enabled = _gf_false;</div><div class='add'>+    struct list_head queue = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(priv);</div><div class='add'>+    INIT_LIST_HEAD(&amp;queue);</div><div class='add'>+</div><div class='add'>+    switch (event) {</div><div class='add'>+        case GF_EVENT_TRANSLATOR_OP: {</div><div class='add'>+            dict = data;</div><div class='add'>+            barrier_enabled = dict_get_str_boolean(dict, "barrier", -1);</div><div class='add'>+</div><div class='add'>+            if (barrier_enabled == -1) {</div><div class='add'>+                gf_log(this-&gt;name, GF_LOG_ERROR,</div><div class='add'>+                       "Could not fetch "</div><div class='add'>+                       " barrier key from the dictionary.");</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            LOCK(&amp;priv-&gt;lock);</div><div class='add'>+            {</div><div class='add'>+                if (!priv-&gt;barrier_enabled) {</div><div class='add'>+                    if (barrier_enabled) {</div><div class='add'>+                        ret = __barrier_enable(this, priv);</div><div class='add'>+                    } else {</div><div class='add'>+                        UNLOCK(&amp;priv-&gt;lock);</div><div class='add'>+                        gf_log(this-&gt;name, GF_LOG_ERROR, "Already disabled.");</div><div class='add'>+                        goto post_unlock;</div><div class='add'>+                    }</div><div class='add'>+                } else {</div><div class='add'>+                    if (!barrier_enabled) {</div><div class='add'>+                        __barrier_disable(this, &amp;queue);</div><div class='add'>+                        ret = 0;</div><div class='add'>+                    } else {</div><div class='add'>+                        UNLOCK(&amp;priv-&gt;lock);</div><div class='add'>+                        gf_log(this-&gt;name, GF_LOG_ERROR, "Already enabled");</div><div class='add'>+                        goto post_unlock;</div><div class='add'>+                    }</div><div class='add'>+                }</div><div class='add'>+            }</div><div class='add'>+            UNLOCK(&amp;priv-&gt;lock);</div><div class='add'>+        post_unlock:</div><div class='add'>+            if (!list_empty(&amp;queue))</div><div class='add'>+                barrier_dequeue_all(this, &amp;queue);</div><div class='add'>+</div><div class='add'>+            break;</div><div class='add'>+        }</div><div class='add'>+        default: {</div><div class='add'>+            default_notify(this, event, data);</div><div class='add'>+            ret = 0;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+reconfigure(xlator_t *this, dict_t *options)</div><div class='add'>+{</div><div class='add'>+    barrier_priv_t *priv = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    gf_boolean_t barrier_enabled = _gf_false;</div><div class='add'>+    uint32_t timeout = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    struct list_head queue = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+    GF_ASSERT(priv);</div><div class='add'>+</div><div class='add'>+    GF_OPTION_RECONF("barrier", barrier_enabled, options, bool, out);</div><div class='add'>+    GF_OPTION_RECONF("barrier-timeout", timeout, options, time, out);</div><div class='add'>+</div><div class='add'>+    INIT_LIST_HEAD(&amp;queue);</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;priv-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        if (!priv-&gt;barrier_enabled) {</div><div class='add'>+            if (barrier_enabled) {</div><div class='add'>+                ret = __barrier_enable(this, priv);</div><div class='add'>+                if (ret) {</div><div class='add'>+                    goto unlock;</div><div class='add'>+                }</div><div class='add'>+            }</div><div class='add'>+        } else {</div><div class='add'>+            if (!barrier_enabled) {</div><div class='add'>+                __barrier_disable(this, &amp;queue);</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+        priv-&gt;timeout.tv_sec = timeout;</div><div class='add'>+        ret = 0;</div><div class='add'>+    }</div><div class='add'>+unlock:</div><div class='add'>+    UNLOCK(&amp;priv-&gt;lock);</div><div class='add'>+</div><div class='add'>+    if (!list_empty(&amp;queue))</div><div class='add'>+        barrier_dequeue_all(this, &amp;queue);</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+mem_acct_init(xlator_t *this)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    ret = xlator_mem_acct_init(this, gf_barrier_mt_end + 1);</div><div class='add'>+    if (ret)</div><div class='add'>+        gf_log(this-&gt;name, GF_LOG_ERROR,</div><div class='add'>+               "Memory accounting "</div><div class='add'>+               "initialization failed.");</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+init(xlator_t *this)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    barrier_priv_t *priv = NULL;</div><div class='add'>+    uint32_t timeout = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    if (!this-&gt;children || this-&gt;children-&gt;next) {</div><div class='add'>+        gf_log(this-&gt;name, GF_LOG_ERROR,</div><div class='add'>+               "'barrier' not configured with exactly one child");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (!this-&gt;parents)</div><div class='add'>+        gf_log(this-&gt;name, GF_LOG_WARNING, "dangling volume. check volfile ");</div><div class='add'>+</div><div class='add'>+    priv = GF_CALLOC(1, sizeof(*priv), gf_barrier_mt_priv_t);</div><div class='add'>+    if (!priv)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    LOCK_INIT(&amp;priv-&gt;lock);</div><div class='add'>+</div><div class='add'>+    GF_OPTION_INIT("barrier", priv-&gt;barrier_enabled, bool, out);</div><div class='add'>+    GF_OPTION_INIT("barrier-timeout", timeout, time, out);</div><div class='add'>+    priv-&gt;timeout.tv_sec = timeout;</div><div class='add'>+</div><div class='add'>+    INIT_LIST_HEAD(&amp;priv-&gt;queue);</div><div class='add'>+</div><div class='add'>+    if (priv-&gt;barrier_enabled) {</div><div class='add'>+        ret = __barrier_enable(this, priv);</div><div class='add'>+        if (ret == -1)</div><div class='add'>+            goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    this-&gt;private = priv;</div><div class='add'>+    ret = 0;</div><div class='add'>+out:</div><div class='add'>+    if (ret &amp;&amp; priv)</div><div class='add'>+        GF_FREE(priv);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+fini(xlator_t *this)</div><div class='add'>+{</div><div class='add'>+    barrier_priv_t *priv = NULL;</div><div class='add'>+    struct list_head queue = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+    if (!priv)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    INIT_LIST_HEAD(&amp;queue);</div><div class='add'>+</div><div class='add'>+    gf_log(this-&gt;name, GF_LOG_INFO,</div><div class='add'>+           "Disabling barriering and dequeuing "</div><div class='add'>+           "all the queued fops");</div><div class='add'>+    LOCK(&amp;priv-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        __barrier_disable(this, &amp;queue);</div><div class='add'>+    }</div><div class='add'>+    UNLOCK(&amp;priv-&gt;lock);</div><div class='add'>+</div><div class='add'>+    if (!list_empty(&amp;queue))</div><div class='add'>+        barrier_dequeue_all(this, &amp;queue);</div><div class='add'>+</div><div class='add'>+    this-&gt;private = NULL;</div><div class='add'>+</div><div class='add'>+    LOCK_DESTROY(&amp;priv-&gt;lock);</div><div class='add'>+    GF_FREE(priv);</div><div class='add'>+out:</div><div class='add'>+    return;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+barrier_dump_stub(call_stub_t *stub, char *prefix)</div><div class='add'>+{</div><div class='add'>+    char key[GF_DUMP_MAX_BUF_LEN] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    gf_proc_dump_build_key(key, prefix, "fop");</div><div class='add'>+    gf_proc_dump_write(key, "%s", gf_fop_list[stub-&gt;fop]);</div><div class='add'>+</div><div class='add'>+    if (stub-&gt;frame-&gt;local) {</div><div class='add'>+        gf_proc_dump_build_key(key, prefix, "gfid");</div><div class='add'>+        gf_proc_dump_write(key, "%s",</div><div class='add'>+                           uuid_utoa(*(uuid_t *)(stub-&gt;frame-&gt;local)));</div><div class='add'>+    }</div><div class='add'>+    if (stub-&gt;args.loc.path) {</div><div class='add'>+        gf_proc_dump_build_key(key, prefix, "path");</div><div class='add'>+        gf_proc_dump_write(key, "%s", stub-&gt;args.loc.path);</div><div class='add'>+    }</div><div class='add'>+    if (stub-&gt;args.loc.name) {</div><div class='add'>+        gf_proc_dump_build_key(key, prefix, "name");</div><div class='add'>+        gf_proc_dump_write(key, "%s", stub-&gt;args.loc.name);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+__barrier_dump_queue(barrier_priv_t *priv)</div><div class='add'>+{</div><div class='add'>+    call_stub_t *stub = NULL;</div><div class='add'>+    char key[GF_DUMP_MAX_BUF_LEN] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int i = 0;</div><div class='add'>+</div><div class='add'>+    GF_VALIDATE_OR_GOTO("barrier", priv, out);</div><div class='add'>+</div><div class='add'>+    list_for_each_entry(stub, &amp;priv-&gt;queue, list)</div><div class='add'>+    {</div><div class='add'>+        snprintf(key, sizeof(key), "stub.%d", i++);</div><div class='add'>+        gf_proc_dump_add_section("%s", key);</div><div class='add'>+        barrier_dump_stub(stub, key);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+barrier_dump_priv(xlator_t *this)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    char key[GF_DUMP_MAX_BUF_LEN] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    barrier_priv_t *priv = NULL;</div><div class='add'>+</div><div class='add'>+    GF_VALIDATE_OR_GOTO("barrier", this, out);</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+    if (!priv)</div><div class='add'>+        return 0;</div><div class='add'>+</div><div class='add'>+    gf_proc_dump_build_key(key, "xlator.features.barrier", "priv");</div><div class='add'>+    gf_proc_dump_add_section("%s", key);</div><div class='add'>+    gf_proc_dump_build_key(key, "barrier", "enabled");</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;priv-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        gf_proc_dump_write(key, "%d", priv-&gt;barrier_enabled);</div><div class='add'>+        gf_proc_dump_build_key(key, "barrier", "timeout");</div><div class='add'>+        gf_proc_dump_write(key, "%ld", priv-&gt;timeout.tv_sec);</div><div class='add'>+        if (priv-&gt;barrier_enabled) {</div><div class='add'>+            gf_proc_dump_build_key(key, "barrier", "queue_size");</div><div class='add'>+            gf_proc_dump_write(key, "%d", priv-&gt;queue_size);</div><div class='add'>+            __barrier_dump_queue(priv);</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    UNLOCK(&amp;priv-&gt;lock);</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+struct xlator_fops fops = {</div><div class='add'>+</div><div class='add'>+    /* Barrier Class fops */</div><div class='add'>+    .rmdir = barrier_rmdir,</div><div class='add'>+    .unlink = barrier_unlink,</div><div class='add'>+    .rename = barrier_rename,</div><div class='add'>+    .removexattr = barrier_removexattr,</div><div class='add'>+    .fremovexattr = barrier_fremovexattr,</div><div class='add'>+    .truncate = barrier_truncate,</div><div class='add'>+    .ftruncate = barrier_ftruncate,</div><div class='add'>+    .fsync = barrier_fsync,</div><div class='add'>+</div><div class='add'>+    /* Writes with only O_SYNC flag */</div><div class='add'>+    .writev = barrier_writev,</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct xlator_dumpops dumpops = {</div><div class='add'>+    .priv = barrier_dump_priv,</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct xlator_cbks cbks;</div><div class='add'>+</div><div class='add'>+struct volume_options options[] = {</div><div class='add'>+    {.key = {"barrier"},</div><div class='add'>+     .type = GF_OPTION_TYPE_BOOL,</div><div class='add'>+     .default_value = "disable",</div><div class='add'>+     .op_version = {GD_OP_VERSION_3_6_0},</div><div class='add'>+     .flags = OPT_FLAG_SETTABLE,</div><div class='add'>+     .description = "When \"enabled\", blocks acknowledgements to application "</div><div class='add'>+                    "for file operations such as rmdir, rename, unlink, "</div><div class='add'>+                    "removexattr, fremovexattr, truncate, ftruncate, "</div><div class='add'>+                    "write (with O_SYNC), fsync. It is turned \"off\" by "</div><div class='add'>+                    "default."},</div><div class='add'>+    {.key = {"barrier-timeout"},</div><div class='add'>+     .type = GF_OPTION_TYPE_TIME,</div><div class='add'>+     .default_value = BARRIER_TIMEOUT,</div><div class='add'>+     .op_version = {GD_OP_VERSION_3_6_0},</div><div class='add'>+     .flags = OPT_FLAG_SETTABLE,</div><div class='add'>+     .description = "After 'timeout' seconds since the time 'barrier' "</div><div class='add'>+                    "option was set to \"on\", acknowledgements to file "</div><div class='add'>+                    "operations are no longer blocked and previously "</div><div class='add'>+                    "blocked acknowledgements are sent to the application"},</div><div class='add'>+    {.key = {NULL}},</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+xlator_api_t xlator_api = {</div><div class='add'>+    .init = init,</div><div class='add'>+    .fini = fini,</div><div class='add'>+    .notify = notify,</div><div class='add'>+    .reconfigure = reconfigure,</div><div class='add'>+    .mem_acct_init = mem_acct_init,</div><div class='add'>+    .op_version = {1}, /* Present from the initial version */</div><div class='add'>+    .dumpops = &amp;dumpops,</div><div class='add'>+    .fops = &amp;fops,</div><div class='add'>+    .cbks = &amp;cbks,</div><div class='add'>+    .options = options,</div><div class='add'>+    .identifier = "barrier",</div><div class='add'>+    .category = GF_MAINTAINED,</div><div class='add'>+};</div><div class='head'>diff --git a/xlators/features/barrier/src/barrier.h b/xlators/features/barrier/src/barrier.h<br/>new file mode 100644<br/>index 00000000000..1337f311f7d<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/xlators/features/barrier/src/barrier.h?id=d1d7a6f35c816822fab51c820e25023863c239c1'>xlators/features/barrier/src/barrier.h</a></div><div class='hunk'>@@ -0,0 +1,89 @@</div><div class='add'>+/*</div><div class='add'>+   Copyright (c) 2014 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+   This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+   This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+   General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+   later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+   cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#ifndef __BARRIER_H__</div><div class='add'>+#define __BARRIER_H__</div><div class='add'>+</div><div class='add'>+#include "barrier-mem-types.h"</div><div class='add'>+#include &lt;glusterfs/xlator.h&gt;</div><div class='add'>+#include &lt;glusterfs/timer.h&gt;</div><div class='add'>+#include &lt;glusterfs/call-stub.h&gt;</div><div class='add'>+</div><div class='add'>+#define BARRIER_FOP_CBK(fop_name, label, frame, this, params...)               \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        barrier_priv_t *_priv = NULL;                                          \</div><div class='add'>+        call_stub_t *_stub = NULL;                                             \</div><div class='add'>+        gf_boolean_t _barrier_enabled = _gf_false;                             \</div><div class='add'>+        struct list_head queue = {                                             \</div><div class='add'>+            0,                                                                 \</div><div class='add'>+        };                                                                     \</div><div class='add'>+                                                                               \</div><div class='add'>+        INIT_LIST_HEAD(&amp;queue);                                                \</div><div class='add'>+                                                                               \</div><div class='add'>+        _priv = this-&gt;private;                                                 \</div><div class='add'>+        GF_ASSERT(_priv);                                                      \</div><div class='add'>+                                                                               \</div><div class='add'>+        LOCK(&amp;_priv-&gt;lock);                                                    \</div><div class='add'>+        {                                                                      \</div><div class='add'>+            if (_priv-&gt;barrier_enabled) {                                      \</div><div class='add'>+                _barrier_enabled = _priv-&gt;barrier_enabled;                     \</div><div class='add'>+                                                                               \</div><div class='add'>+                _stub = fop_##fop_name##_cbk_stub(                             \</div><div class='add'>+                    frame, barrier_##fop_name##_cbk_resume, params);           \</div><div class='add'>+                if (!_stub) {                                                  \</div><div class='add'>+                    __barrier_disable(this, &amp;queue);                           \</div><div class='add'>+                    goto unlock;                                               \</div><div class='add'>+                }                                                              \</div><div class='add'>+                                                                               \</div><div class='add'>+                __barrier_enqueue(this, _stub);                                \</div><div class='add'>+            }                                                                  \</div><div class='add'>+        }                                                                      \</div><div class='add'>+    unlock:                                                                    \</div><div class='add'>+        UNLOCK(&amp;_priv-&gt;lock);                                                  \</div><div class='add'>+                                                                               \</div><div class='add'>+        if (_stub)                                                             \</div><div class='add'>+            goto label;                                                        \</div><div class='add'>+                                                                               \</div><div class='add'>+        if (_barrier_enabled &amp;&amp; !_stub) {                                      \</div><div class='add'>+            gf_log(this-&gt;name, GF_LOG_CRITICAL,                                \</div><div class='add'>+                   "Failed to barrier FOPs, disabling "                        \</div><div class='add'>+                   "barrier. FOP: %s, ERROR: %s",                              \</div><div class='add'>+                   #fop_name, strerror(ENOMEM));                               \</div><div class='add'>+            barrier_dequeue_all(this, &amp;queue);                                 \</div><div class='add'>+        }                                                                      \</div><div class='add'>+        barrier_local_free_gfid(frame);                                        \</div><div class='add'>+        STACK_UNWIND_STRICT(fop_name, frame, params);                          \</div><div class='add'>+        goto label;                                                            \</div><div class='add'>+    } while (0)</div><div class='add'>+</div><div class='add'>+typedef struct {</div><div class='add'>+    gf_timer_t *timer;</div><div class='add'>+    gf_lock_t lock;</div><div class='add'>+    struct list_head queue;</div><div class='add'>+    struct timespec timeout;</div><div class='add'>+    uint32_t queue_size;</div><div class='add'>+    gf_boolean_t barrier_enabled;</div><div class='add'>+    char _pad[3]; /* manual padding */</div><div class='add'>+} barrier_priv_t;</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+__barrier_enable(xlator_t *this, barrier_priv_t *priv);</div><div class='add'>+void</div><div class='add'>+__barrier_enqueue(xlator_t *this, call_stub_t *stub);</div><div class='add'>+void</div><div class='add'>+__barrier_disable(xlator_t *this, struct list_head *queue);</div><div class='add'>+void</div><div class='add'>+barrier_timeout(void *data);</div><div class='add'>+void</div><div class='add'>+barrier_dequeue_all(xlator_t *this, struct list_head *queue);</div><div class='add'>+call_stub_t *</div><div class='add'>+__barrier_dequeue(xlator_t *this, struct list_head *queue);</div><div class='add'>+</div><div class='add'>+#endif</div><div class='head'>diff --git a/rpc/rpc-transport/rdma/Makefile.am b/xlators/features/bit-rot/Makefile.am<br/>index f963effea22..f963effea22 100644<br/>--- a/<a href='/cgit/glusterfs.git/tree/rpc/rpc-transport/rdma/Makefile.am?id=6ee84e00f0d96e292163ebad86b2e7521776dca1'>rpc/rpc-transport/rdma/Makefile.am</a><br/>+++ b/<a href='/cgit/glusterfs.git/tree/xlators/features/bit-rot/Makefile.am?id=d1d7a6f35c816822fab51c820e25023863c239c1'>xlators/features/bit-rot/Makefile.am</a></div><div class='head'>diff --git a/xlators/features/bit-rot/src/Makefile.am b/xlators/features/bit-rot/src/Makefile.am<br/>new file mode 100644<br/>index 00000000000..b5e4a7d62a0<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/xlators/features/bit-rot/src/Makefile.am?id=d1d7a6f35c816822fab51c820e25023863c239c1'>xlators/features/bit-rot/src/Makefile.am</a></div><div class='hunk'>@@ -0,0 +1 @@</div><div class='add'>+SUBDIRS = stub bitd</div><div class='head'>diff --git a/xlators/features/bit-rot/src/bitd/Makefile.am b/xlators/features/bit-rot/src/bitd/Makefile.am<br/>new file mode 100644<br/>index 00000000000..6db800e6565<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/xlators/features/bit-rot/src/bitd/Makefile.am?id=d1d7a6f35c816822fab51c820e25023863c239c1'>xlators/features/bit-rot/src/bitd/Makefile.am</a></div><div class='hunk'>@@ -0,0 +1,23 @@</div><div class='add'>+if WITH_SERVER</div><div class='add'>+xlator_LTLIBRARIES = bit-rot.la</div><div class='add'>+endif</div><div class='add'>+xlatordir = $(libdir)/glusterfs/$(PACKAGE_VERSION)/xlator/features</div><div class='add'>+</div><div class='add'>+bit_rot_la_LDFLAGS = -module $(GF_XLATOR_DEFAULT_LDFLAGS)</div><div class='add'>+</div><div class='add'>+AM_CPPFLAGS = $(GF_CPPFLAGS) -I$(top_srcdir)/libglusterfs/src \</div><div class='add'>+	-I$(top_srcdir)/rpc/xdr/src/ -I$(top_builddir)/rpc/xdr/src/ \</div><div class='add'>+	-I$(top_srcdir)/rpc/rpc-lib/src -I$(CONTRIBDIR)/timer-wheel \</div><div class='add'>+	-I$(top_srcdir)/xlators/features/bit-rot/src/stub</div><div class='add'>+</div><div class='add'>+bit_rot_la_SOURCES = bit-rot.c bit-rot-scrub.c bit-rot-ssm.c \</div><div class='add'>+		     bit-rot-scrub-status.c</div><div class='add'>+bit_rot_la_LIBADD = $(top_builddir)/libglusterfs/src/libglusterfs.la \</div><div class='add'>+	$(top_builddir)/xlators/features/changelog/lib/src/libgfchangelog.la</div><div class='add'>+</div><div class='add'>+noinst_HEADERS = bit-rot.h bit-rot-scrub.h bit-rot-bitd-messages.h bit-rot-ssm.h \</div><div class='add'>+		 bit-rot-scrub-status.h</div><div class='add'>+</div><div class='add'>+AM_CFLAGS = -Wall -DBR_RATE_LIMIT_SIGNER $(GF_CFLAGS)</div><div class='add'>+</div><div class='add'>+CLEANFILES =</div><div class='head'>diff --git a/xlators/features/bit-rot/src/bitd/bit-rot-bitd-messages.h b/xlators/features/bit-rot/src/bitd/bit-rot-bitd-messages.h<br/>new file mode 100644<br/>index 00000000000..5bc5103a27c<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/xlators/features/bit-rot/src/bitd/bit-rot-bitd-messages.h?id=d1d7a6f35c816822fab51c820e25023863c239c1'>xlators/features/bit-rot/src/bitd/bit-rot-bitd-messages.h</a></div><div class='hunk'>@@ -0,0 +1,101 @@</div><div class='add'>+/*</div><div class='add'>+ Copyright (c) 2015 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+ This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+ This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+ General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+ later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+ cases as published by the Free Software Foundation.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+#ifndef _BITROT_BITD_MESSAGES_H_</div><div class='add'>+#define _BITROT_BITD_MESSAGES_H_</div><div class='add'>+</div><div class='add'>+#include &lt;glusterfs/glfs-message-id.h&gt;</div><div class='add'>+</div><div class='add'>+/* To add new message IDs, append new identifiers at the end of the list.</div><div class='add'>+ *</div><div class='add'>+ * Never remove a message ID. If it's not used anymore, you can rename it or</div><div class='add'>+ * leave it as it is, but not delete it. This is to prevent reutilization of</div><div class='add'>+ * IDs by other messages.</div><div class='add'>+ *</div><div class='add'>+ * The component name must match one of the entries defined in</div><div class='add'>+ * glfs-message-id.h.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+GLFS_MSGID(BITROT_BITD, BRB_MSG_FD_CREATE_FAILED, BRB_MSG_READV_FAILED,</div><div class='add'>+           BRB_MSG_BLOCK_READ_FAILED, BRB_MSG_CALC_CHECKSUM_FAILED,</div><div class='add'>+           BRB_MSG_NO_MEMORY, BRB_MSG_GET_SIGN_FAILED, BRB_MSG_SET_SIGN_FAILED,</div><div class='add'>+           BRB_MSG_OP_FAILED, BRB_MSG_READ_AND_SIGN_FAILED, BRB_MSG_SIGN_FAILED,</div><div class='add'>+           BRB_MSG_GET_SUBVOL_FAILED, BRB_MSG_SET_TIMER_FAILED,</div><div class='add'>+           BRB_MSG_GET_INFO_FAILED, BRB_MSG_PATH_FAILED, BRB_MSG_MARK_BAD_FILE,</div><div class='add'>+           BRB_MSG_TRIGGER_SIGN, BRB_MSG_REGISTER_FAILED,</div><div class='add'>+           BRB_MSG_CRAWLING_START, BRB_MSG_SPAWN_FAILED,</div><div class='add'>+           BRB_MSG_INVALID_SUBVOL_CHILD, BRB_MSG_SKIP_OBJECT, BRB_MSG_NO_CHILD,</div><div class='add'>+           BRB_MSG_CHECKSUM_MISMATCH, BRB_MSG_MARK_CORRUPTED,</div><div class='add'>+           BRB_MSG_CRAWLING_FINISH, BRB_MSG_CALC_ERROR, BRB_MSG_LOOKUP_FAILED,</div><div class='add'>+           BRB_MSG_PARTIAL_VERSION_PRESENCE, BRB_MSG_MEM_ACNT_FAILED,</div><div class='add'>+           BRB_MSG_TIMER_WHEEL_UNAVAILABLE, BRB_MSG_BITROT_LOADED,</div><div class='add'>+           BRB_MSG_SCALE_DOWN_FAILED, BRB_MSG_SCALE_UP_FAILED,</div><div class='add'>+           BRB_MSG_SCALE_DOWN_SCRUBBER, BRB_MSG_SCALING_UP_SCRUBBER,</div><div class='add'>+           BRB_MSG_UNKNOWN_THROTTLE, BRB_MSG_RATE_LIMIT_INFO,</div><div class='add'>+           BRB_MSG_SCRUB_INFO, BRB_MSG_CONNECTED_TO_BRICK, BRB_MSG_BRICK_INFO,</div><div class='add'>+           BRB_MSG_SUBVOL_CONNECT_FAILED, BRB_MSG_INVALID_SUBVOL,</div><div class='add'>+           BRB_MSG_RESCHEDULE_SCRUBBER_FAILED, BRB_MSG_SCRUB_START,</div><div class='add'>+           BRB_MSG_SCRUB_FINISH, BRB_MSG_SCRUB_RUNNING,</div><div class='add'>+           BRB_MSG_SCRUB_RESCHEDULED, BRB_MSG_SCRUB_TUNABLE,</div><div class='add'>+           BRB_MSG_SCRUB_THREAD_CLEANUP, BRB_MSG_SCRUBBER_CLEANED,</div><div class='add'>+           BRB_MSG_GENERIC_SSM_INFO, BRB_MSG_ZERO_TIMEOUT_BUG,</div><div class='add'>+           BRB_MSG_BAD_OBJ_READDIR_FAIL, BRB_MSG_SSM_FAILED,</div><div class='add'>+           BRB_MSG_SCRUB_WAIT_FAILED, BRB_MSG_TRIGGER_SIGN_FAILED,</div><div class='add'>+           BRB_MSG_EVENT_UNHANDLED, BRB_MSG_COULD_NOT_SCHEDULE_SCRUB,</div><div class='add'>+           BRB_MSG_THREAD_CREATION_FAILED, BRB_MSG_MEM_POOL_ALLOC,</div><div class='add'>+           BRB_MSG_SAVING_HASH_FAILED);</div><div class='add'>+</div><div class='add'>+#define BRB_MSG_FD_CREATE_FAILED_STR "failed to create fd for the inode"</div><div class='add'>+#define BRB_MSG_READV_FAILED_STR "readv failed"</div><div class='add'>+#define BRB_MSG_BLOCK_READ_FAILED_STR "reading block failed"</div><div class='add'>+#define BRB_MSG_NO_MEMORY_STR "failed to allocate memory"</div><div class='add'>+#define BRB_MSG_CALC_CHECKSUM_FAILED_STR "calculating checksum failed"</div><div class='add'>+#define BRB_MSG_GET_SIGN_FAILED_STR "failed to get the signature"</div><div class='add'>+#define BRB_MSG_SET_SIGN_FAILED_STR "signing failed"</div><div class='add'>+#define BRB_MSG_OP_FAILED_STR "failed on object"</div><div class='add'>+#define BRB_MSG_TRIGGER_SIGN_FAILED_STR "Could not trigger signing"</div><div class='add'>+#define BRB_MSG_READ_AND_SIGN_FAILED_STR "reading and signing of object failed"</div><div class='add'>+#define BRB_MSG_SET_TIMER_FAILED_STR "Failed to allocate object expiry timer"</div><div class='add'>+#define BRB_MSG_GET_SUBVOL_FAILED_STR                                          \</div><div class='add'>+    "failed to get the subvolume for the brick"</div><div class='add'>+#define BRB_MSG_PATH_FAILED_STR "path failed"</div><div class='add'>+#define BRB_MSG_SKIP_OBJECT_STR "Entry is marked corrupted. skipping"</div><div class='add'>+#define BRB_MSG_PARTIAL_VERSION_PRESENCE_STR                                   \</div><div class='add'>+    "PArtial version xattr presence detected, ignoring"</div><div class='add'>+#define BRB_MSG_TRIGGER_SIGN_STR "Triggering signing"</div><div class='add'>+#define BRB_MSG_CRAWLING_START_STR                                             \</div><div class='add'>+    "Crawling brick, scanning for unsigned objects"</div><div class='add'>+#define BRB_MSG_CRAWLING_FINISH_STR "Completed crawling brick"</div><div class='add'>+#define BRB_MSG_REGISTER_FAILED_STR "Register to changelog failed"</div><div class='add'>+#define BRB_MSG_SPAWN_FAILED_STR "failed to spawn"</div><div class='add'>+#define BRB_MSG_CONNECTED_TO_BRICK_STR "Connected to brick"</div><div class='add'>+#define BRB_MSG_LOOKUP_FAILED_STR "lookup on root failed"</div><div class='add'>+#define BRB_MSG_GET_INFO_FAILED_STR "failed to get stub info"</div><div class='add'>+#define BRB_MSG_SCRUB_THREAD_CLEANUP_STR "Error cleaning up scanner thread"</div><div class='add'>+#define BRB_MSG_SCRUBBER_CLEANED_STR "clened up scrubber for brick"</div><div class='add'>+#define BRB_MSG_SUBVOL_CONNECT_FAILED_STR                                      \</div><div class='add'>+    "callback handler for subvolume failed"</div><div class='add'>+#define BRB_MSG_MEM_ACNT_FAILED_STR "Memory accounting init failed"</div><div class='add'>+#define BRB_MSG_EVENT_UNHANDLED_STR "Event unhandled for child"</div><div class='add'>+#define BRB_MSG_INVALID_SUBVOL_STR "Got event from invalid subvolume"</div><div class='add'>+#define BRB_MSG_RESCHEDULE_SCRUBBER_FAILED_STR                                 \</div><div class='add'>+    "on demand scrub schedule failed. Scrubber is not in pending state."</div><div class='add'>+#define BRB_MSG_COULD_NOT_SCHEDULE_SCRUB_STR                                   \</div><div class='add'>+    "Could not schedule ondemand scrubbing. Scrubbing will continue "          \</div><div class='add'>+    "according to old frequency."</div><div class='add'>+#define BRB_MSG_THREAD_CREATION_FAILED_STR "thread creation failed"</div><div class='add'>+#define BRB_MSG_RATE_LIMIT_INFO_STR "Rate Limit Info"</div><div class='add'>+#define BRB_MSG_MEM_POOL_ALLOC_STR "failed to allocate mem-pool for timer"</div><div class='add'>+#define BRB_MSG_NO_CHILD_STR "FATAL: no children"</div><div class='add'>+#define BRB_MSG_TIMER_WHEEL_UNAVAILABLE_STR "global timer wheel unavailable"</div><div class='add'>+#define BRB_MSG_BITROT_LOADED_STR "bit-rot xlator loaded"</div><div class='add'>+#define BRB_MSG_SAVING_HASH_FAILED_STR                                         \</div><div class='add'>+    "failed to allocate memory for saving hash of the object"</div><div class='add'>+#endif /* !_BITROT_BITD_MESSAGES_H_ */</div><div class='head'>diff --git a/xlators/features/bit-rot/src/bitd/bit-rot-scrub-status.c b/xlators/features/bit-rot/src/bitd/bit-rot-scrub-status.c<br/>new file mode 100644<br/>index 00000000000..5cef2ffa5e5<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/xlators/features/bit-rot/src/bitd/bit-rot-scrub-status.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>xlators/features/bit-rot/src/bitd/bit-rot-scrub-status.c</a></div><div class='hunk'>@@ -0,0 +1,78 @@</div><div class='add'>+/*</div><div class='add'>+  Copyright (c) 2016 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#include &lt;string.h&gt;</div><div class='add'>+#include &lt;stdio.h&gt;</div><div class='add'>+</div><div class='add'>+#include "bit-rot-scrub-status.h"</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+br_inc_unsigned_file_count(br_scrub_stats_t *scrub_stat)</div><div class='add'>+{</div><div class='add'>+    if (!scrub_stat)</div><div class='add'>+        return;</div><div class='add'>+</div><div class='add'>+    pthread_mutex_lock(&amp;scrub_stat-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        scrub_stat-&gt;unsigned_files++;</div><div class='add'>+    }</div><div class='add'>+    pthread_mutex_unlock(&amp;scrub_stat-&gt;lock);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+br_inc_scrubbed_file(br_scrub_stats_t *scrub_stat)</div><div class='add'>+{</div><div class='add'>+    if (!scrub_stat)</div><div class='add'>+        return;</div><div class='add'>+</div><div class='add'>+    pthread_mutex_lock(&amp;scrub_stat-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        scrub_stat-&gt;scrubbed_files++;</div><div class='add'>+    }</div><div class='add'>+    pthread_mutex_unlock(&amp;scrub_stat-&gt;lock);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+br_update_scrub_start_time(br_scrub_stats_t *scrub_stat, time_t time)</div><div class='add'>+{</div><div class='add'>+    if (!scrub_stat)</div><div class='add'>+        return;</div><div class='add'>+</div><div class='add'>+    pthread_mutex_lock(&amp;scrub_stat-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        scrub_stat-&gt;scrub_start_time = time;</div><div class='add'>+    }</div><div class='add'>+    pthread_mutex_unlock(&amp;scrub_stat-&gt;lock);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+br_update_scrub_finish_time(br_scrub_stats_t *scrub_stat, char *timestr,</div><div class='add'>+                            time_t time)</div><div class='add'>+{</div><div class='add'>+    int lst_size = 0;</div><div class='add'>+</div><div class='add'>+    if (!scrub_stat)</div><div class='add'>+        return;</div><div class='add'>+</div><div class='add'>+    lst_size = sizeof(scrub_stat-&gt;last_scrub_time);</div><div class='add'>+    if (strlen(timestr) &gt;= lst_size)</div><div class='add'>+        return;</div><div class='add'>+</div><div class='add'>+    pthread_mutex_lock(&amp;scrub_stat-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        scrub_stat-&gt;scrub_end_time = time;</div><div class='add'>+</div><div class='add'>+        scrub_stat-&gt;scrub_duration = scrub_stat-&gt;scrub_end_time -</div><div class='add'>+                                     scrub_stat-&gt;scrub_start_time;</div><div class='add'>+</div><div class='add'>+        snprintf(scrub_stat-&gt;last_scrub_time, lst_size, "%s", timestr);</div><div class='add'>+    }</div><div class='add'>+    pthread_mutex_unlock(&amp;scrub_stat-&gt;lock);</div><div class='add'>+}</div><div class='head'>diff --git a/xlators/features/bit-rot/src/bitd/bit-rot-scrub-status.h b/xlators/features/bit-rot/src/bitd/bit-rot-scrub-status.h<br/>new file mode 100644<br/>index 00000000000..f022aa831eb<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/xlators/features/bit-rot/src/bitd/bit-rot-scrub-status.h?id=d1d7a6f35c816822fab51c820e25023863c239c1'>xlators/features/bit-rot/src/bitd/bit-rot-scrub-status.h</a></div><div class='hunk'>@@ -0,0 +1,50 @@</div><div class='add'>+/*</div><div class='add'>+   Copyright (c) 2016 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+   This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+   This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+   General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+   later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+   cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#ifndef __BIT_ROT_SCRUB_STATUS_H__</div><div class='add'>+#define __BIT_ROT_SCRUB_STATUS_H__</div><div class='add'>+</div><div class='add'>+#include &lt;stdint.h&gt;</div><div class='add'>+#include &lt;sys/time.h&gt;</div><div class='add'>+#include &lt;pthread.h&gt;</div><div class='add'>+</div><div class='add'>+#include &lt;glusterfs/common-utils.h&gt;</div><div class='add'>+</div><div class='add'>+struct br_scrub_stats {</div><div class='add'>+    uint64_t scrubbed_files; /* Total number of scrubbed files. */</div><div class='add'>+</div><div class='add'>+    uint64_t unsigned_files; /* Total number of unsigned files. */</div><div class='add'>+</div><div class='add'>+    uint64_t scrub_duration; /* Duration of last scrub. */</div><div class='add'>+</div><div class='add'>+    char last_scrub_time[GF_TIMESTR_SIZE]; /* Last scrub completion time. */</div><div class='add'>+</div><div class='add'>+    time_t scrub_start_time; /* Scrubbing starting time. */</div><div class='add'>+</div><div class='add'>+    time_t scrub_end_time; /* Scrubbing finishing time. */</div><div class='add'>+</div><div class='add'>+    int8_t scrub_running; /* Whether scrub running or not. */</div><div class='add'>+</div><div class='add'>+    pthread_mutex_t lock;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+typedef struct br_scrub_stats br_scrub_stats_t;</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+br_inc_unsigned_file_count(br_scrub_stats_t *scrub_stat);</div><div class='add'>+void</div><div class='add'>+br_inc_scrubbed_file(br_scrub_stats_t *scrub_stat);</div><div class='add'>+void</div><div class='add'>+br_update_scrub_start_time(br_scrub_stats_t *scrub_stat, time_t time);</div><div class='add'>+void</div><div class='add'>+br_update_scrub_finish_time(br_scrub_stats_t *scrub_stat, char *timestr,</div><div class='add'>+                            time_t time);</div><div class='add'>+</div><div class='add'>+#endif /* __BIT_ROT_SCRUB_STATUS_H__ */</div><div class='head'>diff --git a/xlators/features/bit-rot/src/bitd/bit-rot-scrub.c b/xlators/features/bit-rot/src/bitd/bit-rot-scrub.c<br/>new file mode 100644<br/>index 00000000000..289dd53f610<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/xlators/features/bit-rot/src/bitd/bit-rot-scrub.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>xlators/features/bit-rot/src/bitd/bit-rot-scrub.c</a></div><div class='hunk'>@@ -0,0 +1,2070 @@</div><div class='add'>+/*</div><div class='add'>+   Copyright (c) 2015 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+   This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+   This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+   General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+   later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+   cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#include &lt;math.h&gt;</div><div class='add'>+#include &lt;ctype.h&gt;</div><div class='add'>+#include &lt;sys/uio.h&gt;</div><div class='add'>+</div><div class='add'>+#include &lt;glusterfs/glusterfs.h&gt;</div><div class='add'>+#include &lt;glusterfs/logging.h&gt;</div><div class='add'>+#include &lt;glusterfs/common-utils.h&gt;</div><div class='add'>+</div><div class='add'>+#include "bit-rot-scrub.h"</div><div class='add'>+#include &lt;pthread.h&gt;</div><div class='add'>+#include "bit-rot-bitd-messages.h"</div><div class='add'>+#include "bit-rot-scrub-status.h"</div><div class='add'>+#include &lt;glusterfs/events.h&gt;</div><div class='add'>+</div><div class='add'>+struct br_scrubbers {</div><div class='add'>+    pthread_t scrubthread;</div><div class='add'>+</div><div class='add'>+    struct list_head list;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct br_fsscan_entry {</div><div class='add'>+    void *data;</div><div class='add'>+</div><div class='add'>+    loc_t parent;</div><div class='add'>+</div><div class='add'>+    gf_dirent_t *entry;</div><div class='add'>+</div><div class='add'>+    struct br_scanfs *fsscan; /* backpointer to subvolume scanner */</div><div class='add'>+</div><div class='add'>+    struct list_head list;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+/**</div><div class='add'>+ * fetch signature extended attribute from an object's fd.</div><div class='add'>+ * NOTE: On success @xattr is not unref'd as @sign points</div><div class='add'>+ * to the dictionary value.</div><div class='add'>+ */</div><div class='add'>+static int32_t</div><div class='add'>+bitd_fetch_signature(xlator_t *this, br_child_t *child, fd_t *fd,</div><div class='add'>+                     dict_t **xattr, br_isignature_out_t **sign)</div><div class='add'>+{</div><div class='add'>+    int32_t ret = -1;</div><div class='add'>+</div><div class='add'>+    ret = syncop_fgetxattr(child-&gt;xl, fd, xattr, GLUSTERFS_GET_OBJECT_SIGNATURE,</div><div class='add'>+                           NULL, NULL);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        br_log_object(this, "fgetxattr", fd-&gt;inode-&gt;gfid, -ret);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_get_ptr(*xattr, GLUSTERFS_GET_OBJECT_SIGNATURE, (void **)sign);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_ERROR, 0, BRB_MSG_GET_SIGN_FAILED,</div><div class='add'>+               "failed to extract signature info [GFID: %s]",</div><div class='add'>+               uuid_utoa(fd-&gt;inode-&gt;gfid));</div><div class='add'>+        goto unref_dict;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+</div><div class='add'>+unref_dict:</div><div class='add'>+    dict_unref(*xattr);</div><div class='add'>+out:</div><div class='add'>+    return -1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/**</div><div class='add'>+ * POST COMPUTE CHECK</div><div class='add'>+ *</div><div class='add'>+ * Checks to be performed before verifying calculated signature</div><div class='add'>+ * Object is skipped if:</div><div class='add'>+ *  - has stale signature</div><div class='add'>+ *  - mismatches versions caches in pre-compute check</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+bitd_scrub_post_compute_check(xlator_t *this, br_child_t *child, fd_t *fd,</div><div class='add'>+                              unsigned long version,</div><div class='add'>+                              br_isignature_out_t **signature,</div><div class='add'>+                              br_scrub_stats_t *scrub_stat,</div><div class='add'>+                              gf_boolean_t skip_stat)</div><div class='add'>+{</div><div class='add'>+    int32_t ret = 0;</div><div class='add'>+    size_t signlen = 0;</div><div class='add'>+    dict_t *xattr = NULL;</div><div class='add'>+    br_isignature_out_t *signptr = NULL;</div><div class='add'>+</div><div class='add'>+    ret = bitd_fetch_signature(this, child, fd, &amp;xattr, &amp;signptr);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        if (!skip_stat)</div><div class='add'>+            br_inc_unsigned_file_count(scrub_stat);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /**</div><div class='add'>+     * Either the object got dirtied during the time the signature was</div><div class='add'>+     * calculated OR the version we saved during pre-compute check does</div><div class='add'>+     * not match now, implying that the object got dirtied and signed in</div><div class='add'>+     * between scrubs pre &amp; post compute checks (checksum window).</div><div class='add'>+     *</div><div class='add'>+     * The log entry looks pretty ugly, but helps in debugging..</div><div class='add'>+     */</div><div class='add'>+    if (signptr-&gt;stale || (signptr-&gt;version != version)) {</div><div class='add'>+        if (!skip_stat)</div><div class='add'>+            br_inc_unsigned_file_count(scrub_stat);</div><div class='add'>+        gf_msg_debug(this-&gt;name, 0,</div><div class='add'>+                     "&lt;STAGE: POST&gt; Object [GFID: %s] "</div><div class='add'>+                     "either has a stale signature OR underwent "</div><div class='add'>+                     "signing during checksumming {Stale: %d | "</div><div class='add'>+                     "Version: %lu,%lu}",</div><div class='add'>+                     uuid_utoa(fd-&gt;inode-&gt;gfid), (signptr-&gt;stale) ? 1 : 0,</div><div class='add'>+                     version, signptr-&gt;version);</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto unref_dict;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    signlen = signptr-&gt;signaturelen;</div><div class='add'>+    *signature = GF_MALLOC(sizeof(br_isignature_out_t) + signlen,</div><div class='add'>+                           gf_common_mt_char);</div><div class='add'>+</div><div class='add'>+    (void)memcpy(*signature, signptr, sizeof(br_isignature_out_t) + signlen);</div><div class='add'>+</div><div class='add'>+    (*signature)-&gt;signaturelen = signlen;</div><div class='add'>+</div><div class='add'>+unref_dict:</div><div class='add'>+    dict_unref(xattr);</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int32_t</div><div class='add'>+bitd_signature_staleness(xlator_t *this, br_child_t *child, fd_t *fd,</div><div class='add'>+                         int *stale, unsigned long *version,</div><div class='add'>+                         br_scrub_stats_t *scrub_stat, gf_boolean_t skip_stat)</div><div class='add'>+{</div><div class='add'>+    int32_t ret = -1;</div><div class='add'>+    dict_t *xattr = NULL;</div><div class='add'>+    br_isignature_out_t *signptr = NULL;</div><div class='add'>+</div><div class='add'>+    ret = bitd_fetch_signature(this, child, fd, &amp;xattr, &amp;signptr);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        if (!skip_stat)</div><div class='add'>+            br_inc_unsigned_file_count(scrub_stat);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /**</div><div class='add'>+     * save version for validation in post compute stage</div><div class='add'>+     * c.f. bitd_scrub_post_compute_check()</div><div class='add'>+     */</div><div class='add'>+    *stale = signptr-&gt;stale ? 1 : 0;</div><div class='add'>+    *version = signptr-&gt;version;</div><div class='add'>+</div><div class='add'>+    dict_unref(xattr);</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/**</div><div class='add'>+ * PRE COMPUTE CHECK</div><div class='add'>+ *</div><div class='add'>+ * Checks to be performed before initiating object signature calculation.</div><div class='add'>+ * An object is skipped if:</div><div class='add'>+ *  - it's already marked corrupted</div><div class='add'>+ *  - has stale signature</div><div class='add'>+ */</div><div class='add'>+int32_t</div><div class='add'>+bitd_scrub_pre_compute_check(xlator_t *this, br_child_t *child, fd_t *fd,</div><div class='add'>+                             unsigned long *version,</div><div class='add'>+                             br_scrub_stats_t *scrub_stat,</div><div class='add'>+                             gf_boolean_t skip_stat)</div><div class='add'>+{</div><div class='add'>+    int stale = 0;</div><div class='add'>+    int32_t ret = -1;</div><div class='add'>+</div><div class='add'>+    if (bitd_is_bad_file(this, child, NULL, fd)) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_WARNING, 0, BRB_MSG_SKIP_OBJECT,</div><div class='add'>+               "Object [GFID: %s] is marked corrupted, skipping..",</div><div class='add'>+               uuid_utoa(fd-&gt;inode-&gt;gfid));</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = bitd_signature_staleness(this, child, fd, &amp;stale, version, scrub_stat,</div><div class='add'>+                                   skip_stat);</div><div class='add'>+    if (!ret &amp;&amp; stale) {</div><div class='add'>+        if (!skip_stat)</div><div class='add'>+            br_inc_unsigned_file_count(scrub_stat);</div><div class='add'>+        gf_msg_debug(this-&gt;name, 0,</div><div class='add'>+                     "&lt;STAGE: PRE&gt; Object [GFID: %s] "</div><div class='add'>+                     "has stale signature",</div><div class='add'>+                     uuid_utoa(fd-&gt;inode-&gt;gfid));</div><div class='add'>+        ret = -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* static int */</div><div class='add'>+int</div><div class='add'>+bitd_compare_ckum(xlator_t *this, br_isignature_out_t *sign, unsigned char *md,</div><div class='add'>+                  inode_t *linked_inode, gf_dirent_t *entry, fd_t *fd,</div><div class='add'>+                  br_child_t *child, loc_t *loc)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    dict_t *xattr = NULL;</div><div class='add'>+</div><div class='add'>+    GF_VALIDATE_OR_GOTO("bit-rot", this, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, sign, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, fd, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, child, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, linked_inode, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, md, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, entry, out);</div><div class='add'>+</div><div class='add'>+    if (strncmp(sign-&gt;signature, (char *)md, sign-&gt;signaturelen) == 0) {</div><div class='add'>+        gf_msg_debug(this-&gt;name, 0,</div><div class='add'>+                     "%s [GFID: %s | Brick: %s] "</div><div class='add'>+                     "matches calculated checksum",</div><div class='add'>+                     loc-&gt;path, uuid_utoa(linked_inode-&gt;gfid),</div><div class='add'>+                     child-&gt;brick_path);</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    gf_msg(this-&gt;name, GF_LOG_DEBUG, 0, BRB_MSG_CHECKSUM_MISMATCH,</div><div class='add'>+           "Object checksum mismatch: %s [GFID: %s | Brick: %s]", loc-&gt;path,</div><div class='add'>+           uuid_utoa(linked_inode-&gt;gfid), child-&gt;brick_path);</div><div class='add'>+    gf_msg(this-&gt;name, GF_LOG_ALERT, 0, BRB_MSG_CHECKSUM_MISMATCH,</div><div class='add'>+           "CORRUPTION DETECTED: Object %s {Brick: %s | GFID: %s}", loc-&gt;path,</div><div class='add'>+           child-&gt;brick_path, uuid_utoa(linked_inode-&gt;gfid));</div><div class='add'>+</div><div class='add'>+    /* Perform bad-file marking */</div><div class='add'>+    xattr = dict_new();</div><div class='add'>+    if (!xattr) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_set_int32(xattr, BITROT_OBJECT_BAD_KEY, _gf_true);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_ERROR, 0, BRB_MSG_MARK_BAD_FILE,</div><div class='add'>+               "Error setting bad-file marker for %s [GFID: %s | "</div><div class='add'>+               "Brick: %s]",</div><div class='add'>+               loc-&gt;path, uuid_utoa(linked_inode-&gt;gfid), child-&gt;brick_path);</div><div class='add'>+        goto dictfree;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    gf_msg(this-&gt;name, GF_LOG_ALERT, 0, BRB_MSG_MARK_CORRUPTED,</div><div class='add'>+           "Marking"</div><div class='add'>+           " %s [GFID: %s | Brick: %s] as corrupted..",</div><div class='add'>+           loc-&gt;path, uuid_utoa(linked_inode-&gt;gfid), child-&gt;brick_path);</div><div class='add'>+    gf_event(EVENT_BITROT_BAD_FILE, "gfid=%s;path=%s;brick=%s",</div><div class='add'>+             uuid_utoa(linked_inode-&gt;gfid), loc-&gt;path, child-&gt;brick_path);</div><div class='add'>+    ret = syncop_fsetxattr(child-&gt;xl, fd, xattr, 0, NULL, NULL);</div><div class='add'>+    if (ret)</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_ERROR, 0, BRB_MSG_MARK_BAD_FILE,</div><div class='add'>+               "Error marking object %s [GFID: %s] as corrupted", loc-&gt;path,</div><div class='add'>+               uuid_utoa(linked_inode-&gt;gfid));</div><div class='add'>+</div><div class='add'>+dictfree:</div><div class='add'>+    dict_unref(xattr);</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/**</div><div class='add'>+ * "The Scrubber"</div><div class='add'>+ *</div><div class='add'>+ * Perform signature validation for a given object with the assumption</div><div class='add'>+ * that the signature is SHA256 (because signer as of now _always_</div><div class='add'>+ * signs with SHA256).</div><div class='add'>+ */</div><div class='add'>+int</div><div class='add'>+br_scrubber_scrub_begin(xlator_t *this, struct br_fsscan_entry *fsentry)</div><div class='add'>+{</div><div class='add'>+    int32_t ret = -1;</div><div class='add'>+    fd_t *fd = NULL;</div><div class='add'>+    loc_t loc = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    struct iatt iatt = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    struct iatt parent_buf = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    pid_t pid = 0;</div><div class='add'>+    br_child_t *child = NULL;</div><div class='add'>+    unsigned char *md = NULL;</div><div class='add'>+    inode_t *linked_inode = NULL;</div><div class='add'>+    br_isignature_out_t *sign = NULL;</div><div class='add'>+    unsigned long signedversion = 0;</div><div class='add'>+    gf_dirent_t *entry = NULL;</div><div class='add'>+    br_private_t *priv = NULL;</div><div class='add'>+    loc_t *parent = NULL;</div><div class='add'>+    gf_boolean_t skip_stat = _gf_false;</div><div class='add'>+    uuid_t shard_root_gfid = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    GF_VALIDATE_OR_GOTO("bit-rot", fsentry, out);</div><div class='add'>+</div><div class='add'>+    entry = fsentry-&gt;entry;</div><div class='add'>+    parent = &amp;fsentry-&gt;parent;</div><div class='add'>+    child = fsentry-&gt;data;</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    GF_VALIDATE_OR_GOTO("bit-rot", entry, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("bit-rot", parent, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("bit-rot", child, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("bit-rot", priv, out);</div><div class='add'>+</div><div class='add'>+    pid = GF_CLIENT_PID_SCRUB;</div><div class='add'>+</div><div class='add'>+    ret = br_prepare_loc(this, child, parent, entry, &amp;loc);</div><div class='add'>+    if (!ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    syncopctx_setfspid(&amp;pid);</div><div class='add'>+</div><div class='add'>+    ret = syncop_lookup(child-&gt;xl, &amp;loc, &amp;iatt, &amp;parent_buf, NULL, NULL);</div><div class='add'>+    if (ret) {</div><div class='add'>+        br_log_object_path(this, "lookup", loc.path, -ret);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    linked_inode = inode_link(loc.inode, parent-&gt;inode, loc.name, &amp;iatt);</div><div class='add'>+    if (linked_inode)</div><div class='add'>+        inode_lookup(linked_inode);</div><div class='add'>+</div><div class='add'>+    gf_msg_debug(this-&gt;name, 0, "Scrubbing object %s [GFID: %s]", entry-&gt;d_name,</div><div class='add'>+                 uuid_utoa(linked_inode-&gt;gfid));</div><div class='add'>+</div><div class='add'>+    if (iatt.ia_type != IA_IFREG) {</div><div class='add'>+        gf_msg_debug(this-&gt;name, 0, "%s is not a regular file", entry-&gt;d_name);</div><div class='add'>+        ret = 0;</div><div class='add'>+        goto unref_inode;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (IS_DHT_LINKFILE_MODE((&amp;iatt))) {</div><div class='add'>+        gf_msg_debug(this-&gt;name, 0, "%s is a dht sticky bit file",</div><div class='add'>+                     entry-&gt;d_name);</div><div class='add'>+        ret = 0;</div><div class='add'>+        goto unref_inode;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* skip updating scrub statistics for shard entries */</div><div class='add'>+    gf_uuid_parse(SHARD_ROOT_GFID, shard_root_gfid);</div><div class='add'>+    if (gf_uuid_compare(loc.pargfid, shard_root_gfid) == 0)</div><div class='add'>+        skip_stat = _gf_true;</div><div class='add'>+</div><div class='add'>+    /**</div><div class='add'>+     * open() an fd for subsequent operations</div><div class='add'>+     */</div><div class='add'>+    fd = fd_create(linked_inode, 0);</div><div class='add'>+    if (!fd) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_ERROR, 0, BRB_MSG_FD_CREATE_FAILED,</div><div class='add'>+               "failed to create fd for inode %s",</div><div class='add'>+               uuid_utoa(linked_inode-&gt;gfid));</div><div class='add'>+        goto unref_inode;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = syncop_open(child-&gt;xl, &amp;loc, O_RDWR, fd, NULL, NULL);</div><div class='add'>+    if (ret) {</div><div class='add'>+        br_log_object(this, "open", linked_inode-&gt;gfid, -ret);</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto unrefd;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    fd_bind(fd);</div><div class='add'>+</div><div class='add'>+    /**</div><div class='add'>+     * perform pre compute checks before initiating checksum</div><div class='add'>+     * computation</div><div class='add'>+     *  - presence of bad object</div><div class='add'>+     *  - signature staleness</div><div class='add'>+     */</div><div class='add'>+    ret = bitd_scrub_pre_compute_check(this, child, fd, &amp;signedversion,</div><div class='add'>+                                       &amp;priv-&gt;scrub_stat, skip_stat);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto unrefd; /* skip this object */</div><div class='add'>+</div><div class='add'>+    /* if all's good, proceed to calculate the hash */</div><div class='add'>+    md = GF_MALLOC(SHA256_DIGEST_LENGTH, gf_common_mt_char);</div><div class='add'>+    if (!md)</div><div class='add'>+        goto unrefd;</div><div class='add'>+</div><div class='add'>+    ret = br_calculate_obj_checksum(md, child, fd, &amp;iatt);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_ERROR, 0, BRB_MSG_CALC_ERROR,</div><div class='add'>+               "error calculating hash for object [GFID: %s]",</div><div class='add'>+               uuid_utoa(fd-&gt;inode-&gt;gfid));</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto free_md;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /**</div><div class='add'>+     * perform post compute checks as an object's signature may have</div><div class='add'>+     * become stale while scrubber calculated checksum.</div><div class='add'>+     */</div><div class='add'>+    ret = bitd_scrub_post_compute_check(this, child, fd, signedversion, &amp;sign,</div><div class='add'>+                                        &amp;priv-&gt;scrub_stat, skip_stat);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto free_md;</div><div class='add'>+</div><div class='add'>+    ret = bitd_compare_ckum(this, sign, md, linked_inode, entry, fd, child,</div><div class='add'>+                            &amp;loc);</div><div class='add'>+</div><div class='add'>+    if (!skip_stat)</div><div class='add'>+        br_inc_scrubbed_file(&amp;priv-&gt;scrub_stat);</div><div class='add'>+</div><div class='add'>+    GF_FREE(sign); /* allocated on post-compute */</div><div class='add'>+</div><div class='add'>+    /** fd_unref() takes care of closing fd.. like syncop_close() */</div><div class='add'>+</div><div class='add'>+free_md:</div><div class='add'>+    GF_FREE(md);</div><div class='add'>+unrefd:</div><div class='add'>+    fd_unref(fd);</div><div class='add'>+unref_inode:</div><div class='add'>+    inode_unref(linked_inode);</div><div class='add'>+out:</div><div class='add'>+    loc_wipe(&amp;loc);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+_br_lock_cleaner(void *arg)</div><div class='add'>+{</div><div class='add'>+    pthread_mutex_t *mutex = arg;</div><div class='add'>+</div><div class='add'>+    pthread_mutex_unlock(mutex);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+wait_for_scrubbing(xlator_t *this, struct br_scanfs *fsscan)</div><div class='add'>+{</div><div class='add'>+    br_private_t *priv = NULL;</div><div class='add'>+    struct br_scrubber *fsscrub = NULL;</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+    fsscrub = &amp;priv-&gt;fsscrub;</div><div class='add'>+</div><div class='add'>+    pthread_cleanup_push(_br_lock_cleaner, &amp;fsscan-&gt;waitlock);</div><div class='add'>+    pthread_mutex_lock(&amp;fsscan-&gt;waitlock);</div><div class='add'>+    {</div><div class='add'>+        pthread_cleanup_push(_br_lock_cleaner, &amp;fsscrub-&gt;mutex);</div><div class='add'>+        pthread_mutex_lock(&amp;fsscrub-&gt;mutex);</div><div class='add'>+        {</div><div class='add'>+            list_replace_init(&amp;fsscan-&gt;queued, &amp;fsscan-&gt;ready);</div><div class='add'>+</div><div class='add'>+            /* wake up scrubbers */</div><div class='add'>+            pthread_cond_broadcast(&amp;fsscrub-&gt;cond);</div><div class='add'>+        }</div><div class='add'>+        pthread_mutex_unlock(&amp;fsscrub-&gt;mutex);</div><div class='add'>+        pthread_cleanup_pop(0);</div><div class='add'>+</div><div class='add'>+        while (fsscan-&gt;entries != 0)</div><div class='add'>+            pthread_cond_wait(&amp;fsscan-&gt;waitcond, &amp;fsscan-&gt;waitlock);</div><div class='add'>+    }</div><div class='add'>+    pthread_mutex_unlock(&amp;fsscan-&gt;waitlock);</div><div class='add'>+    pthread_cleanup_pop(0);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+_br_fsscan_inc_entry_count(struct br_scanfs *fsscan)</div><div class='add'>+{</div><div class='add'>+    fsscan-&gt;entries++;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+_br_fsscan_dec_entry_count(struct br_scanfs *fsscan)</div><div class='add'>+{</div><div class='add'>+    if (--fsscan-&gt;entries == 0) {</div><div class='add'>+        pthread_mutex_lock(&amp;fsscan-&gt;waitlock);</div><div class='add'>+        {</div><div class='add'>+            pthread_cond_signal(&amp;fsscan-&gt;waitcond);</div><div class='add'>+        }</div><div class='add'>+        pthread_mutex_unlock(&amp;fsscan-&gt;waitlock);</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+_br_fsscan_collect_entry(struct br_scanfs *fsscan,</div><div class='add'>+                         struct br_fsscan_entry *fsentry)</div><div class='add'>+{</div><div class='add'>+    list_add_tail(&amp;fsentry-&gt;list, &amp;fsscan-&gt;queued);</div><div class='add'>+    _br_fsscan_inc_entry_count(fsscan);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#define NR_ENTRIES (1 &lt;&lt; 7) /* ..bulk scrubbing */</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+br_fsscanner_handle_entry(xlator_t *subvol, gf_dirent_t *entry, loc_t *parent,</div><div class='add'>+                          void *data)</div><div class='add'>+{</div><div class='add'>+    int32_t ret = -1;</div><div class='add'>+    int scrub = 0;</div><div class='add'>+    br_child_t *child = NULL;</div><div class='add'>+    xlator_t *this = NULL;</div><div class='add'>+    struct br_scanfs *fsscan = NULL;</div><div class='add'>+    struct br_fsscan_entry *fsentry = NULL;</div><div class='add'>+</div><div class='add'>+    GF_VALIDATE_OR_GOTO("bit-rot", subvol, error_return);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("bit-rot", data, error_return);</div><div class='add'>+</div><div class='add'>+    child = data;</div><div class='add'>+    this = child-&gt;this;</div><div class='add'>+    fsscan = &amp;child-&gt;fsscan;</div><div class='add'>+</div><div class='add'>+    _mask_cancellation();</div><div class='add'>+</div><div class='add'>+    fsentry = GF_CALLOC(1, sizeof(*fsentry), gf_br_mt_br_fsscan_entry_t);</div><div class='add'>+    if (!fsentry)</div><div class='add'>+        goto error_return;</div><div class='add'>+</div><div class='add'>+    {</div><div class='add'>+        fsentry-&gt;data = data;</div><div class='add'>+        fsentry-&gt;fsscan = &amp;child-&gt;fsscan;</div><div class='add'>+</div><div class='add'>+        /* copy parent loc */</div><div class='add'>+        ret = loc_copy(&amp;fsentry-&gt;parent, parent);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto dealloc;</div><div class='add'>+</div><div class='add'>+        /* copy child entry */</div><div class='add'>+        fsentry-&gt;entry = entry_copy(entry);</div><div class='add'>+        if (!fsentry-&gt;entry)</div><div class='add'>+            goto locwipe;</div><div class='add'>+</div><div class='add'>+        INIT_LIST_HEAD(&amp;fsentry-&gt;list);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;fsscan-&gt;entrylock);</div><div class='add'>+    {</div><div class='add'>+        _br_fsscan_collect_entry(fsscan, fsentry);</div><div class='add'>+</div><div class='add'>+        /**</div><div class='add'>+         * need not be a equality check as entries may be pushed</div><div class='add'>+         * back onto the scanned queue when thread(s) are cleaned.</div><div class='add'>+         */</div><div class='add'>+        if (fsscan-&gt;entries &gt;= NR_ENTRIES)</div><div class='add'>+            scrub = 1;</div><div class='add'>+    }</div><div class='add'>+    UNLOCK(&amp;fsscan-&gt;entrylock);</div><div class='add'>+</div><div class='add'>+    _unmask_cancellation();</div><div class='add'>+</div><div class='add'>+    if (scrub)</div><div class='add'>+        wait_for_scrubbing(this, fsscan);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+</div><div class='add'>+locwipe:</div><div class='add'>+    loc_wipe(&amp;fsentry-&gt;parent);</div><div class='add'>+dealloc:</div><div class='add'>+    GF_FREE(fsentry);</div><div class='add'>+error_return:</div><div class='add'>+    return -1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+br_fsscan_deactivate(xlator_t *this)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+    br_private_t *priv = NULL;</div><div class='add'>+    br_scrub_state_t nstate = 0;</div><div class='add'>+    struct br_monitor *scrub_monitor = NULL;</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+    scrub_monitor = &amp;priv-&gt;scrub_monitor;</div><div class='add'>+</div><div class='add'>+    ret = gf_tw_del_timer(priv-&gt;timer_wheel, scrub_monitor-&gt;timer);</div><div class='add'>+    if (ret == 0) {</div><div class='add'>+        nstate = BR_SCRUB_STATE_STALLED;</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_INFO, 0, BRB_MSG_SCRUB_INFO,</div><div class='add'>+               "Volume is under active scrubbing. Pausing scrub..");</div><div class='add'>+    } else {</div><div class='add'>+        nstate = BR_SCRUB_STATE_PAUSED;</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_INFO, 0, BRB_MSG_SCRUB_INFO,</div><div class='add'>+               "Scrubber paused");</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    _br_monitor_set_scrub_state(scrub_monitor, nstate);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+br_scrubber_log_time(xlator_t *this, const char *sfx)</div><div class='add'>+{</div><div class='add'>+    char timestr[GF_TIMESTR_SIZE] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    br_private_t *priv = NULL;</div><div class='add'>+    time_t now = 0;</div><div class='add'>+</div><div class='add'>+    now = gf_time();</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    gf_time_fmt(timestr, sizeof(timestr), now, gf_timefmt_FT);</div><div class='add'>+</div><div class='add'>+    if (strcasecmp(sfx, "started") == 0) {</div><div class='add'>+        br_update_scrub_start_time(&amp;priv-&gt;scrub_stat, now);</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_INFO, 0, BRB_MSG_SCRUB_START,</div><div class='add'>+               "Scrubbing %s at %s", sfx, timestr);</div><div class='add'>+    } else {</div><div class='add'>+        br_update_scrub_finish_time(&amp;priv-&gt;scrub_stat, timestr, now);</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_INFO, 0, BRB_MSG_SCRUB_FINISH,</div><div class='add'>+               "Scrubbing %s at %s", sfx, timestr);</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+br_fsscanner_log_time(xlator_t *this, br_child_t *child, const char *sfx)</div><div class='add'>+{</div><div class='add'>+    char timestr[GF_TIMESTR_SIZE] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    time_t now = 0;</div><div class='add'>+</div><div class='add'>+    now = gf_time();</div><div class='add'>+    gf_time_fmt(timestr, sizeof(timestr), now, gf_timefmt_FT);</div><div class='add'>+</div><div class='add'>+    if (strcasecmp(sfx, "started") == 0) {</div><div class='add'>+        gf_msg_debug(this-&gt;name, 0, "Scrubbing \"%s\" %s at %s",</div><div class='add'>+                     child-&gt;brick_path, sfx, timestr);</div><div class='add'>+    } else {</div><div class='add'>+        gf_msg_debug(this-&gt;name, 0, "Scrubbing \"%s\" %s at %s",</div><div class='add'>+                     child-&gt;brick_path, sfx, timestr);</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+br_child_set_scrub_state(br_child_t *child, gf_boolean_t state)</div><div class='add'>+{</div><div class='add'>+    child-&gt;active_scrubbing = state;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+br_fsscanner_wait_until_kicked(xlator_t *this, br_child_t *child)</div><div class='add'>+{</div><div class='add'>+    br_private_t *priv = NULL;</div><div class='add'>+    struct br_monitor *scrub_monitor = NULL;</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+    scrub_monitor = &amp;priv-&gt;scrub_monitor;</div><div class='add'>+</div><div class='add'>+    pthread_cleanup_push(_br_lock_cleaner, &amp;scrub_monitor-&gt;wakelock);</div><div class='add'>+    pthread_mutex_lock(&amp;scrub_monitor-&gt;wakelock);</div><div class='add'>+    {</div><div class='add'>+        while (!scrub_monitor-&gt;kick)</div><div class='add'>+            pthread_cond_wait(&amp;scrub_monitor-&gt;wakecond,</div><div class='add'>+                              &amp;scrub_monitor-&gt;wakelock);</div><div class='add'>+</div><div class='add'>+        /* Child lock is to synchronize with disconnect events */</div><div class='add'>+        pthread_cleanup_push(_br_lock_cleaner, &amp;child-&gt;lock);</div><div class='add'>+        pthread_mutex_lock(&amp;child-&gt;lock);</div><div class='add'>+        {</div><div class='add'>+            scrub_monitor-&gt;active_child_count++;</div><div class='add'>+            br_child_set_scrub_state(child, _gf_true);</div><div class='add'>+        }</div><div class='add'>+        pthread_mutex_unlock(&amp;child-&gt;lock);</div><div class='add'>+        pthread_cleanup_pop(0);</div><div class='add'>+    }</div><div class='add'>+    pthread_mutex_unlock(&amp;scrub_monitor-&gt;wakelock);</div><div class='add'>+    pthread_cleanup_pop(0);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+br_scrubber_entry_control(xlator_t *this)</div><div class='add'>+{</div><div class='add'>+    br_private_t *priv = NULL;</div><div class='add'>+    struct br_monitor *scrub_monitor = NULL;</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+    scrub_monitor = &amp;priv-&gt;scrub_monitor;</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;scrub_monitor-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        /* Move the state to BR_SCRUB_STATE_ACTIVE */</div><div class='add'>+        if (scrub_monitor-&gt;state == BR_SCRUB_STATE_PENDING)</div><div class='add'>+            scrub_monitor-&gt;state = BR_SCRUB_STATE_ACTIVE;</div><div class='add'>+        br_scrubber_log_time(this, "started");</div><div class='add'>+        priv-&gt;scrub_stat.scrub_running = 1;</div><div class='add'>+    }</div><div class='add'>+    UNLOCK(&amp;scrub_monitor-&gt;lock);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+br_scrubber_exit_control(xlator_t *this)</div><div class='add'>+{</div><div class='add'>+    br_private_t *priv = NULL;</div><div class='add'>+    struct br_monitor *scrub_monitor = NULL;</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+    scrub_monitor = &amp;priv-&gt;scrub_monitor;</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;scrub_monitor-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        br_scrubber_log_time(this, "finished");</div><div class='add'>+        priv-&gt;scrub_stat.scrub_running = 0;</div><div class='add'>+</div><div class='add'>+        if (scrub_monitor-&gt;state == BR_SCRUB_STATE_ACTIVE) {</div><div class='add'>+            (void)br_fsscan_activate(this);</div><div class='add'>+        } else {</div><div class='add'>+            UNLOCK(&amp;scrub_monitor-&gt;lock);</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_INFO, 0, BRB_MSG_SCRUB_INFO,</div><div class='add'>+                   "Volume waiting to get rescheduled..");</div><div class='add'>+            return;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    UNLOCK(&amp;scrub_monitor-&gt;lock);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+br_fsscanner_entry_control(xlator_t *this, br_child_t *child)</div><div class='add'>+{</div><div class='add'>+    br_fsscanner_log_time(this, child, "started");</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+br_fsscanner_exit_control(xlator_t *this, br_child_t *child)</div><div class='add'>+{</div><div class='add'>+    br_private_t *priv = NULL;</div><div class='add'>+    struct br_monitor *scrub_monitor = NULL;</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+    scrub_monitor = &amp;priv-&gt;scrub_monitor;</div><div class='add'>+</div><div class='add'>+    if (!_br_is_child_connected(child)) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_WARNING, 0, BRB_MSG_SCRUB_INFO,</div><div class='add'>+               "Brick [%s] disconnected while scrubbing. Scrubbing "</div><div class='add'>+               "might be incomplete",</div><div class='add'>+               child-&gt;brick_path);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    br_fsscanner_log_time(this, child, "finished");</div><div class='add'>+</div><div class='add'>+    pthread_cleanup_push(_br_lock_cleaner, &amp;scrub_monitor-&gt;wakelock);</div><div class='add'>+    pthread_mutex_lock(&amp;scrub_monitor-&gt;wakelock);</div><div class='add'>+    {</div><div class='add'>+        scrub_monitor-&gt;active_child_count--;</div><div class='add'>+        pthread_cleanup_push(_br_lock_cleaner, &amp;child-&gt;lock);</div><div class='add'>+        pthread_mutex_lock(&amp;child-&gt;lock);</div><div class='add'>+        {</div><div class='add'>+            br_child_set_scrub_state(child, _gf_false);</div><div class='add'>+        }</div><div class='add'>+        pthread_mutex_unlock(&amp;child-&gt;lock);</div><div class='add'>+        pthread_cleanup_pop(0);</div><div class='add'>+</div><div class='add'>+        if (scrub_monitor-&gt;active_child_count == 0) {</div><div class='add'>+            /* The last child has finished scrubbing.</div><div class='add'>+             * Set the kick to false and  wake up other</div><div class='add'>+             * children who are waiting for the last</div><div class='add'>+             * child to complete scrubbing.</div><div class='add'>+             */</div><div class='add'>+            scrub_monitor-&gt;kick = _gf_false;</div><div class='add'>+            pthread_cond_broadcast(&amp;scrub_monitor-&gt;wakecond);</div><div class='add'>+</div><div class='add'>+            /* Signal monitor thread waiting for the all</div><div class='add'>+             * the children to finish scrubbing.</div><div class='add'>+             */</div><div class='add'>+            pthread_cleanup_push(_br_lock_cleaner, &amp;scrub_monitor-&gt;donelock);</div><div class='add'>+            pthread_mutex_lock(&amp;scrub_monitor-&gt;donelock);</div><div class='add'>+            {</div><div class='add'>+                scrub_monitor-&gt;done = _gf_true;</div><div class='add'>+                pthread_cond_signal(&amp;scrub_monitor-&gt;donecond);</div><div class='add'>+            }</div><div class='add'>+            pthread_mutex_unlock(&amp;scrub_monitor-&gt;donelock);</div><div class='add'>+            pthread_cleanup_pop(0);</div><div class='add'>+        } else {</div><div class='add'>+            while (scrub_monitor-&gt;active_child_count)</div><div class='add'>+                pthread_cond_wait(&amp;scrub_monitor-&gt;wakecond,</div><div class='add'>+                                  &amp;scrub_monitor-&gt;wakelock);</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    pthread_mutex_unlock(&amp;scrub_monitor-&gt;wakelock);</div><div class='add'>+    pthread_cleanup_pop(0);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void *</div><div class='add'>+br_fsscanner(void *arg)</div><div class='add'>+{</div><div class='add'>+    loc_t loc = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    br_child_t *child = NULL;</div><div class='add'>+    xlator_t *this = NULL;</div><div class='add'>+    struct br_scanfs *fsscan = NULL;</div><div class='add'>+</div><div class='add'>+    child = arg;</div><div class='add'>+    this = child-&gt;this;</div><div class='add'>+    fsscan = &amp;child-&gt;fsscan;</div><div class='add'>+</div><div class='add'>+    THIS = this;</div><div class='add'>+    loc.inode = child-&gt;table-&gt;root;</div><div class='add'>+</div><div class='add'>+    while (1) {</div><div class='add'>+        br_fsscanner_wait_until_kicked(this, child);</div><div class='add'>+        {</div><div class='add'>+            /* precursor for scrub */</div><div class='add'>+            br_fsscanner_entry_control(this, child);</div><div class='add'>+</div><div class='add'>+            /* scrub */</div><div class='add'>+            (void)syncop_ftw(child-&gt;xl, &amp;loc, GF_CLIENT_PID_SCRUB, child,</div><div class='add'>+                             br_fsscanner_handle_entry);</div><div class='add'>+            if (!list_empty(&amp;fsscan-&gt;queued))</div><div class='add'>+                wait_for_scrubbing(this, fsscan);</div><div class='add'>+</div><div class='add'>+            /* scrub exit criteria */</div><div class='add'>+            br_fsscanner_exit_control(this, child);</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return NULL;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/**</div><div class='add'>+ * Keep this routine extremely simple and do not ever try to acquire</div><div class='add'>+ * child-&gt;lock here: it may lead to deadlock. Scrubber state is</div><div class='add'>+ * modified in br_fsscanner(). An intermediate state change to pause</div><div class='add'>+ * changes the scrub state to the _correct_ state by identifying a</div><div class='add'>+ * non-pending timer.</div><div class='add'>+ */</div><div class='add'>+void</div><div class='add'>+br_kickstart_scanner(struct gf_tw_timer_list *timer, void *data,</div><div class='add'>+                     unsigned long calltime)</div><div class='add'>+{</div><div class='add'>+    xlator_t *this = NULL;</div><div class='add'>+    struct br_monitor *scrub_monitor = data;</div><div class='add'>+    br_private_t *priv = NULL;</div><div class='add'>+</div><div class='add'>+    THIS = this = scrub_monitor-&gt;this;</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    /* Reset scrub statistics */</div><div class='add'>+    priv-&gt;scrub_stat.scrubbed_files = 0;</div><div class='add'>+    priv-&gt;scrub_stat.unsigned_files = 0;</div><div class='add'>+</div><div class='add'>+    /* Moves state from PENDING to ACTIVE */</div><div class='add'>+    (void)br_scrubber_entry_control(this);</div><div class='add'>+</div><div class='add'>+    /* kickstart scanning.. */</div><div class='add'>+    pthread_mutex_lock(&amp;scrub_monitor-&gt;wakelock);</div><div class='add'>+    {</div><div class='add'>+        scrub_monitor-&gt;kick = _gf_true;</div><div class='add'>+        GF_ASSERT(scrub_monitor-&gt;active_child_count == 0);</div><div class='add'>+        pthread_cond_broadcast(&amp;scrub_monitor-&gt;wakecond);</div><div class='add'>+    }</div><div class='add'>+    pthread_mutex_unlock(&amp;scrub_monitor-&gt;wakelock);</div><div class='add'>+</div><div class='add'>+    return;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static uint32_t</div><div class='add'>+br_fsscan_calculate_delta(uint32_t times)</div><div class='add'>+{</div><div class='add'>+    return times;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#define BR_SCRUB_ONDEMAND (1)</div><div class='add'>+#define BR_SCRUB_MINUTE (60)</div><div class='add'>+#define BR_SCRUB_HOURLY (60 * 60)</div><div class='add'>+#define BR_SCRUB_DAILY (1 * 24 * 60 * 60)</div><div class='add'>+#define BR_SCRUB_WEEKLY (7 * 24 * 60 * 60)</div><div class='add'>+#define BR_SCRUB_BIWEEKLY (14 * 24 * 60 * 60)</div><div class='add'>+#define BR_SCRUB_MONTHLY (30 * 24 * 60 * 60)</div><div class='add'>+</div><div class='add'>+static unsigned int</div><div class='add'>+br_fsscan_calculate_timeout(scrub_freq_t freq)</div><div class='add'>+{</div><div class='add'>+    uint32_t timo = 0;</div><div class='add'>+</div><div class='add'>+    switch (freq) {</div><div class='add'>+        case BR_FSSCRUB_FREQ_MINUTE:</div><div class='add'>+            timo = br_fsscan_calculate_delta(BR_SCRUB_MINUTE);</div><div class='add'>+            break;</div><div class='add'>+        case BR_FSSCRUB_FREQ_HOURLY:</div><div class='add'>+            timo = br_fsscan_calculate_delta(BR_SCRUB_HOURLY);</div><div class='add'>+            break;</div><div class='add'>+        case BR_FSSCRUB_FREQ_DAILY:</div><div class='add'>+            timo = br_fsscan_calculate_delta(BR_SCRUB_DAILY);</div><div class='add'>+            break;</div><div class='add'>+        case BR_FSSCRUB_FREQ_WEEKLY:</div><div class='add'>+            timo = br_fsscan_calculate_delta(BR_SCRUB_WEEKLY);</div><div class='add'>+            break;</div><div class='add'>+        case BR_FSSCRUB_FREQ_BIWEEKLY:</div><div class='add'>+            timo = br_fsscan_calculate_delta(BR_SCRUB_BIWEEKLY);</div><div class='add'>+            break;</div><div class='add'>+        case BR_FSSCRUB_FREQ_MONTHLY:</div><div class='add'>+            timo = br_fsscan_calculate_delta(BR_SCRUB_MONTHLY);</div><div class='add'>+            break;</div><div class='add'>+        default:</div><div class='add'>+            timo = 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return timo;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+br_fsscan_schedule(xlator_t *this)</div><div class='add'>+{</div><div class='add'>+    uint32_t timo = 0;</div><div class='add'>+    br_private_t *priv = NULL;</div><div class='add'>+    char timestr[GF_TIMESTR_SIZE] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    struct br_scrubber *fsscrub = NULL;</div><div class='add'>+    struct gf_tw_timer_list *timer = NULL;</div><div class='add'>+    struct br_monitor *scrub_monitor = NULL;</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+    fsscrub = &amp;priv-&gt;fsscrub;</div><div class='add'>+    scrub_monitor = &amp;priv-&gt;scrub_monitor;</div><div class='add'>+</div><div class='add'>+    scrub_monitor-&gt;boot = gf_time();</div><div class='add'>+</div><div class='add'>+    timo = br_fsscan_calculate_timeout(fsscrub-&gt;frequency);</div><div class='add'>+    if (timo == 0) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_ERROR, 0, BRB_MSG_ZERO_TIMEOUT_BUG,</div><div class='add'>+               "BUG: Zero schedule timeout");</div><div class='add'>+        goto error_return;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    scrub_monitor-&gt;timer = GF_CALLOC(1, sizeof(*scrub_monitor-&gt;timer),</div><div class='add'>+                                     gf_br_stub_mt_br_scanner_freq_t);</div><div class='add'>+    if (!scrub_monitor-&gt;timer)</div><div class='add'>+        goto error_return;</div><div class='add'>+</div><div class='add'>+    timer = scrub_monitor-&gt;timer;</div><div class='add'>+    INIT_LIST_HEAD(&amp;timer-&gt;entry);</div><div class='add'>+</div><div class='add'>+    timer-&gt;data = scrub_monitor;</div><div class='add'>+    timer-&gt;expires = timo;</div><div class='add'>+    timer-&gt;function = br_kickstart_scanner;</div><div class='add'>+</div><div class='add'>+    gf_tw_add_timer(priv-&gt;timer_wheel, timer);</div><div class='add'>+    _br_monitor_set_scrub_state(scrub_monitor, BR_SCRUB_STATE_PENDING);</div><div class='add'>+</div><div class='add'>+    gf_time_fmt(timestr, sizeof(timestr), (scrub_monitor-&gt;boot + timo),</div><div class='add'>+                gf_timefmt_FT);</div><div class='add'>+    gf_msg(this-&gt;name, GF_LOG_INFO, 0, BRB_MSG_SCRUB_INFO,</div><div class='add'>+           "Scrubbing is "</div><div class='add'>+           "scheduled to run at %s",</div><div class='add'>+           timestr);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+</div><div class='add'>+error_return:</div><div class='add'>+    return -1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+br_fsscan_activate(xlator_t *this)</div><div class='add'>+{</div><div class='add'>+    uint32_t timo = 0;</div><div class='add'>+    char timestr[GF_TIMESTR_SIZE] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    time_t now = 0;</div><div class='add'>+    br_private_t *priv = NULL;</div><div class='add'>+    struct br_scrubber *fsscrub = NULL;</div><div class='add'>+    struct br_monitor *scrub_monitor = NULL;</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+    fsscrub = &amp;priv-&gt;fsscrub;</div><div class='add'>+    scrub_monitor = &amp;priv-&gt;scrub_monitor;</div><div class='add'>+</div><div class='add'>+    now = gf_time();</div><div class='add'>+    timo = br_fsscan_calculate_timeout(fsscrub-&gt;frequency);</div><div class='add'>+    if (timo == 0) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_ERROR, 0, BRB_MSG_ZERO_TIMEOUT_BUG,</div><div class='add'>+               "BUG: Zero schedule timeout");</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    pthread_mutex_lock(&amp;scrub_monitor-&gt;donelock);</div><div class='add'>+    {</div><div class='add'>+        scrub_monitor-&gt;done = _gf_false;</div><div class='add'>+    }</div><div class='add'>+    pthread_mutex_unlock(&amp;scrub_monitor-&gt;donelock);</div><div class='add'>+</div><div class='add'>+    gf_time_fmt(timestr, sizeof(timestr), now + timo, gf_timefmt_FT);</div><div class='add'>+    (void)gf_tw_mod_timer(priv-&gt;timer_wheel, scrub_monitor-&gt;timer, timo);</div><div class='add'>+</div><div class='add'>+    _br_monitor_set_scrub_state(scrub_monitor, BR_SCRUB_STATE_PENDING);</div><div class='add'>+    gf_msg(this-&gt;name, GF_LOG_INFO, 0, BRB_MSG_SCRUB_INFO,</div><div class='add'>+           "Scrubbing is "</div><div class='add'>+           "rescheduled to run at %s",</div><div class='add'>+           timestr);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+br_fsscan_reschedule(xlator_t *this)</div><div class='add'>+{</div><div class='add'>+    int32_t ret = 0;</div><div class='add'>+    uint32_t timo = 0;</div><div class='add'>+    char timestr[GF_TIMESTR_SIZE] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    time_t now = 0;</div><div class='add'>+    br_private_t *priv = NULL;</div><div class='add'>+    struct br_scrubber *fsscrub = NULL;</div><div class='add'>+    struct br_monitor *scrub_monitor = NULL;</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+    fsscrub = &amp;priv-&gt;fsscrub;</div><div class='add'>+    scrub_monitor = &amp;priv-&gt;scrub_monitor;</div><div class='add'>+</div><div class='add'>+    if (!fsscrub-&gt;frequency_reconf)</div><div class='add'>+        return 0;</div><div class='add'>+</div><div class='add'>+    now = gf_time();</div><div class='add'>+    timo = br_fsscan_calculate_timeout(fsscrub-&gt;frequency);</div><div class='add'>+    if (timo == 0) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_ERROR, 0, BRB_MSG_ZERO_TIMEOUT_BUG,</div><div class='add'>+               "BUG: Zero schedule timeout");</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    gf_time_fmt(timestr, sizeof(timestr), now + timo, gf_timefmt_FT);</div><div class='add'>+</div><div class='add'>+    pthread_mutex_lock(&amp;scrub_monitor-&gt;donelock);</div><div class='add'>+    {</div><div class='add'>+        scrub_monitor-&gt;done = _gf_false;</div><div class='add'>+    }</div><div class='add'>+    pthread_mutex_unlock(&amp;scrub_monitor-&gt;donelock);</div><div class='add'>+</div><div class='add'>+    ret = gf_tw_mod_timer_pending(priv-&gt;timer_wheel, scrub_monitor-&gt;timer,</div><div class='add'>+                                  timo);</div><div class='add'>+    if (ret == 0)</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_INFO, 0, BRB_MSG_SCRUB_INFO,</div><div class='add'>+               "Scrubber is currently running and would be "</div><div class='add'>+               "rescheduled after completion");</div><div class='add'>+    else {</div><div class='add'>+        _br_monitor_set_scrub_state(scrub_monitor, BR_SCRUB_STATE_PENDING);</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_INFO, 0, BRB_MSG_SCRUB_INFO,</div><div class='add'>+               "Scrubbing rescheduled to run at %s", timestr);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+br_fsscan_ondemand(xlator_t *this)</div><div class='add'>+{</div><div class='add'>+    int32_t ret = 0;</div><div class='add'>+    uint32_t timo = 0;</div><div class='add'>+    char timestr[GF_TIMESTR_SIZE] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    time_t now = 0;</div><div class='add'>+    br_private_t *priv = NULL;</div><div class='add'>+    struct br_monitor *scrub_monitor = NULL;</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+    scrub_monitor = &amp;priv-&gt;scrub_monitor;</div><div class='add'>+</div><div class='add'>+    now = gf_time();</div><div class='add'>+    timo = BR_SCRUB_ONDEMAND;</div><div class='add'>+    gf_time_fmt(timestr, sizeof(timestr), now + timo, gf_timefmt_FT);</div><div class='add'>+</div><div class='add'>+    pthread_mutex_lock(&amp;scrub_monitor-&gt;donelock);</div><div class='add'>+    {</div><div class='add'>+        scrub_monitor-&gt;done = _gf_false;</div><div class='add'>+    }</div><div class='add'>+    pthread_mutex_unlock(&amp;scrub_monitor-&gt;donelock);</div><div class='add'>+</div><div class='add'>+    ret = gf_tw_mod_timer_pending(priv-&gt;timer_wheel, scrub_monitor-&gt;timer,</div><div class='add'>+                                  timo);</div><div class='add'>+    if (ret == 0)</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_INFO, 0, BRB_MSG_SCRUB_INFO,</div><div class='add'>+               "Scrubber is currently running and would be "</div><div class='add'>+               "rescheduled after completion");</div><div class='add'>+    else {</div><div class='add'>+        _br_monitor_set_scrub_state(scrub_monitor, BR_SCRUB_STATE_PENDING);</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_INFO, 0, BRB_MSG_SCRUB_INFO,</div><div class='add'>+               "Ondemand Scrubbing scheduled to run at %s", timestr);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#define BR_SCRUB_THREAD_SCALE_LAZY 0</div><div class='add'>+#define BR_SCRUB_THREAD_SCALE_NORMAL 0.4</div><div class='add'>+#define BR_SCRUB_THREAD_SCALE_AGGRESSIVE 1.0</div><div class='add'>+</div><div class='add'>+#ifndef M_E</div><div class='add'>+#define M_E 2.718</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+/**</div><div class='add'>+ * This is just a simple exponential scale to a fixed value selected</div><div class='add'>+ * per throttle config. We probably need to be more smart and select</div><div class='add'>+ * the scale based on the number of processor cores too.</div><div class='add'>+ */</div><div class='add'>+static unsigned int</div><div class='add'>+br_scrubber_calc_scale(xlator_t *this, br_private_t *priv,</div><div class='add'>+                       scrub_throttle_t throttle)</div><div class='add'>+{</div><div class='add'>+    unsigned int scale = 0;</div><div class='add'>+</div><div class='add'>+    switch (throttle) {</div><div class='add'>+        case BR_SCRUB_THROTTLE_VOID:</div><div class='add'>+        case BR_SCRUB_THROTTLE_STALLED:</div><div class='add'>+            scale = 0;</div><div class='add'>+            break;</div><div class='add'>+        case BR_SCRUB_THROTTLE_LAZY:</div><div class='add'>+            scale = priv-&gt;child_count * pow(M_E, BR_SCRUB_THREAD_SCALE_LAZY);</div><div class='add'>+            break;</div><div class='add'>+        case BR_SCRUB_THROTTLE_NORMAL:</div><div class='add'>+            scale = priv-&gt;child_count * pow(M_E, BR_SCRUB_THREAD_SCALE_NORMAL);</div><div class='add'>+            break;</div><div class='add'>+        case BR_SCRUB_THROTTLE_AGGRESSIVE:</div><div class='add'>+            scale = priv-&gt;child_count *</div><div class='add'>+                    pow(M_E, BR_SCRUB_THREAD_SCALE_AGGRESSIVE);</div><div class='add'>+            break;</div><div class='add'>+        default:</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, 0, BRB_MSG_UNKNOWN_THROTTLE,</div><div class='add'>+                   "Unknown throttle %d", throttle);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return scale;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static br_child_t *</div><div class='add'>+_br_scrubber_get_next_child(struct br_scrubber *fsscrub)</div><div class='add'>+{</div><div class='add'>+    br_child_t *child = NULL;</div><div class='add'>+</div><div class='add'>+    child = list_first_entry(&amp;fsscrub-&gt;scrublist, br_child_t, list);</div><div class='add'>+    list_rotate_left(&amp;fsscrub-&gt;scrublist);</div><div class='add'>+</div><div class='add'>+    return child;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+_br_scrubber_get_entry(br_child_t *child, struct br_fsscan_entry **fsentry)</div><div class='add'>+{</div><div class='add'>+    struct br_scanfs *fsscan = &amp;child-&gt;fsscan;</div><div class='add'>+</div><div class='add'>+    if (list_empty(&amp;fsscan-&gt;ready))</div><div class='add'>+        return;</div><div class='add'>+    *fsentry = list_first_entry(&amp;fsscan-&gt;ready, struct br_fsscan_entry, list);</div><div class='add'>+    list_del_init(&amp;(*fsentry)-&gt;list);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+_br_scrubber_find_scrubbable_entry(struct br_scrubber *fsscrub,</div><div class='add'>+                                   struct br_fsscan_entry **fsentry)</div><div class='add'>+{</div><div class='add'>+    br_child_t *child = NULL;</div><div class='add'>+    br_child_t *firstchild = NULL;</div><div class='add'>+</div><div class='add'>+    while (1) {</div><div class='add'>+        while (list_empty(&amp;fsscrub-&gt;scrublist))</div><div class='add'>+            pthread_cond_wait(&amp;fsscrub-&gt;cond, &amp;fsscrub-&gt;mutex);</div><div class='add'>+</div><div class='add'>+        firstchild = NULL;</div><div class='add'>+        for (child = _br_scrubber_get_next_child(fsscrub); child != firstchild;</div><div class='add'>+             child = _br_scrubber_get_next_child(fsscrub)) {</div><div class='add'>+            if (!firstchild)</div><div class='add'>+                firstchild = child;</div><div class='add'>+</div><div class='add'>+            _br_scrubber_get_entry(child, fsentry);</div><div class='add'>+            if (*fsentry)</div><div class='add'>+                break;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        if (*fsentry)</div><div class='add'>+            break;</div><div class='add'>+</div><div class='add'>+        /* nothing to work on.. wait till available */</div><div class='add'>+        pthread_cond_wait(&amp;fsscrub-&gt;cond, &amp;fsscrub-&gt;mutex);</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+br_scrubber_pick_entry(struct br_scrubber *fsscrub,</div><div class='add'>+                       struct br_fsscan_entry **fsentry)</div><div class='add'>+{</div><div class='add'>+    pthread_cleanup_push(_br_lock_cleaner, &amp;fsscrub-&gt;mutex);</div><div class='add'>+</div><div class='add'>+    pthread_mutex_lock(&amp;fsscrub-&gt;mutex);</div><div class='add'>+    {</div><div class='add'>+        *fsentry = NULL;</div><div class='add'>+        _br_scrubber_find_scrubbable_entry(fsscrub, fsentry);</div><div class='add'>+    }</div><div class='add'>+    pthread_mutex_unlock(&amp;fsscrub-&gt;mutex);</div><div class='add'>+</div><div class='add'>+    pthread_cleanup_pop(0);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+struct br_scrub_entry {</div><div class='add'>+    gf_boolean_t scrubbed;</div><div class='add'>+    struct br_fsscan_entry *fsentry;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+/**</div><div class='add'>+ * We need to be a bit careful here. These thread(s) are prone to cancellations</div><div class='add'>+ * when threads are scaled down (depending on the thottling value configured)</div><div class='add'>+ * and pausing scrub. A thread can get cancelled while it's waiting for entries</div><div class='add'>+ * in the -&gt;pending queue or when an object is undergoing scrubbing.</div><div class='add'>+ */</div><div class='add'>+static void</div><div class='add'>+br_scrubber_entry_handle(void *arg)</div><div class='add'>+{</div><div class='add'>+    struct br_scanfs *fsscan = NULL;</div><div class='add'>+    struct br_scrub_entry *sentry = NULL;</div><div class='add'>+    struct br_fsscan_entry *fsentry = NULL;</div><div class='add'>+</div><div class='add'>+    sentry = arg;</div><div class='add'>+</div><div class='add'>+    fsentry = sentry-&gt;fsentry;</div><div class='add'>+    fsscan = fsentry-&gt;fsscan;</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;fsscan-&gt;entrylock);</div><div class='add'>+    {</div><div class='add'>+        if (sentry-&gt;scrubbed) {</div><div class='add'>+            _br_fsscan_dec_entry_count(fsscan);</div><div class='add'>+</div><div class='add'>+            /* cleanup -&gt;entry */</div><div class='add'>+            fsentry-&gt;data = NULL;</div><div class='add'>+            fsentry-&gt;fsscan = NULL;</div><div class='add'>+            loc_wipe(&amp;fsentry-&gt;parent);</div><div class='add'>+            gf_dirent_entry_free(fsentry-&gt;entry);</div><div class='add'>+</div><div class='add'>+            GF_FREE(sentry-&gt;fsentry);</div><div class='add'>+        } else {</div><div class='add'>+            /* (re)queue the entry again for scrub */</div><div class='add'>+            _br_fsscan_collect_entry(fsscan, sentry-&gt;fsentry);</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    UNLOCK(&amp;fsscan-&gt;entrylock);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+br_scrubber_scrub_entry(xlator_t *this, struct br_fsscan_entry *fsentry)</div><div class='add'>+{</div><div class='add'>+    struct br_scrub_entry sentry = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    sentry.scrubbed = 0;</div><div class='add'>+    sentry.fsentry = fsentry;</div><div class='add'>+</div><div class='add'>+    pthread_cleanup_push(br_scrubber_entry_handle, &amp;sentry);</div><div class='add'>+    {</div><div class='add'>+        (void)br_scrubber_scrub_begin(this, fsentry);</div><div class='add'>+        sentry.scrubbed = 1;</div><div class='add'>+    }</div><div class='add'>+    pthread_cleanup_pop(1);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void *</div><div class='add'>+br_scrubber_proc(void *arg)</div><div class='add'>+{</div><div class='add'>+    xlator_t *this = NULL;</div><div class='add'>+    struct br_scrubber *fsscrub = NULL;</div><div class='add'>+    struct br_fsscan_entry *fsentry = NULL;</div><div class='add'>+</div><div class='add'>+    fsscrub = arg;</div><div class='add'>+    THIS = this = fsscrub-&gt;this;</div><div class='add'>+</div><div class='add'>+    while (1) {</div><div class='add'>+        br_scrubber_pick_entry(fsscrub, &amp;fsentry);</div><div class='add'>+        br_scrubber_scrub_entry(this, fsentry);</div><div class='add'>+        sleep(1);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return NULL;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int32_t</div><div class='add'>+br_scrubber_scale_up(xlator_t *this, struct br_scrubber *fsscrub,</div><div class='add'>+                     unsigned int v1, unsigned int v2)</div><div class='add'>+{</div><div class='add'>+    int i = 0;</div><div class='add'>+    int32_t ret = -1;</div><div class='add'>+    int diff = 0;</div><div class='add'>+    struct br_scrubbers *scrub = NULL;</div><div class='add'>+</div><div class='add'>+    diff = (int)(v2 - v1);</div><div class='add'>+</div><div class='add'>+    gf_msg(this-&gt;name, GF_LOG_INFO, 0, BRB_MSG_SCALING_UP_SCRUBBER,</div><div class='add'>+           "Scaling up scrubbers [%d =&gt; %d]", v1, v2);</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; diff; i++) {</div><div class='add'>+        scrub = GF_CALLOC(diff, sizeof(*scrub), gf_br_mt_br_scrubber_t);</div><div class='add'>+        if (!scrub)</div><div class='add'>+            break;</div><div class='add'>+</div><div class='add'>+        INIT_LIST_HEAD(&amp;scrub-&gt;list);</div><div class='add'>+        ret = gf_thread_create(&amp;scrub-&gt;scrubthread, NULL, br_scrubber_proc,</div><div class='add'>+                               fsscrub, "brsproc");</div><div class='add'>+        if (ret)</div><div class='add'>+            break;</div><div class='add'>+</div><div class='add'>+        fsscrub-&gt;nr_scrubbers++;</div><div class='add'>+        list_add_tail(&amp;scrub-&gt;list, &amp;fsscrub-&gt;scrubbers);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if ((i != diff) &amp;&amp; !scrub)</div><div class='add'>+        goto error_return;</div><div class='add'>+</div><div class='add'>+    if (i != diff) /* degraded scaling.. */</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_WARNING, 0, BRB_MSG_SCALE_UP_FAILED,</div><div class='add'>+               "Could not fully scale up to %d scrubber(s). Spawned "</div><div class='add'>+               "%d/%d [total scrubber(s): %d]",</div><div class='add'>+               v2, i, diff, (v1 + i));</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+</div><div class='add'>+error_return:</div><div class='add'>+    return -1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int32_t</div><div class='add'>+br_scrubber_scale_down(xlator_t *this, struct br_scrubber *fsscrub,</div><div class='add'>+                       unsigned int v1, unsigned int v2)</div><div class='add'>+{</div><div class='add'>+    int i = 0;</div><div class='add'>+    int diff = 0;</div><div class='add'>+    int32_t ret = -1;</div><div class='add'>+    struct br_scrubbers *scrub = NULL;</div><div class='add'>+</div><div class='add'>+    diff = (int)(v1 - v2);</div><div class='add'>+</div><div class='add'>+    gf_msg(this-&gt;name, GF_LOG_INFO, 0, BRB_MSG_SCALE_DOWN_SCRUBBER,</div><div class='add'>+           "Scaling down scrubbers [%d =&gt; %d]", v1, v2);</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; diff; i++) {</div><div class='add'>+        scrub = list_first_entry(&amp;fsscrub-&gt;scrubbers, struct br_scrubbers,</div><div class='add'>+                                 list);</div><div class='add'>+</div><div class='add'>+        list_del_init(&amp;scrub-&gt;list);</div><div class='add'>+        ret = gf_thread_cleanup_xint(scrub-&gt;scrubthread);</div><div class='add'>+        if (ret)</div><div class='add'>+            break;</div><div class='add'>+        GF_FREE(scrub);</div><div class='add'>+</div><div class='add'>+        fsscrub-&gt;nr_scrubbers--;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_WARNING, 0, BRB_MSG_SCALE_DOWN_FAILED,</div><div class='add'>+               "Could not fully scale down "</div><div class='add'>+               "to %d scrubber(s). Terminated %d/%d [total "</div><div class='add'>+               "scrubber(s): %d]",</div><div class='add'>+               v1, i, diff, (v2 - i));</div><div class='add'>+        ret = 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int32_t</div><div class='add'>+br_scrubber_configure(xlator_t *this, br_private_t *priv,</div><div class='add'>+                      struct br_scrubber *fsscrub, scrub_throttle_t nthrottle)</div><div class='add'>+{</div><div class='add'>+    int32_t ret = 0;</div><div class='add'>+    unsigned int v1 = 0;</div><div class='add'>+    unsigned int v2 = 0;</div><div class='add'>+</div><div class='add'>+    v1 = fsscrub-&gt;nr_scrubbers;</div><div class='add'>+    v2 = br_scrubber_calc_scale(this, priv, nthrottle);</div><div class='add'>+</div><div class='add'>+    if (v1 == v2)</div><div class='add'>+        return 0;</div><div class='add'>+</div><div class='add'>+    if (v1 &gt; v2)</div><div class='add'>+        ret = br_scrubber_scale_down(this, fsscrub, v1, v2);</div><div class='add'>+    else</div><div class='add'>+        ret = br_scrubber_scale_up(this, fsscrub, v1, v2);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int32_t</div><div class='add'>+br_scrubber_fetch_option(xlator_t *this, char *opt, dict_t *options,</div><div class='add'>+                         char **value)</div><div class='add'>+{</div><div class='add'>+    if (options)</div><div class='add'>+        GF_OPTION_RECONF(opt, *value, options, str, error_return);</div><div class='add'>+    else</div><div class='add'>+        GF_OPTION_INIT(opt, *value, str, error_return);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+</div><div class='add'>+error_return:</div><div class='add'>+    return -1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* internal "throttle" override */</div><div class='add'>+#define BR_SCRUB_STALLED "STALLED"</div><div class='add'>+</div><div class='add'>+/* TODO: token buket spec */</div><div class='add'>+static int32_t</div><div class='add'>+br_scrubber_handle_throttle(xlator_t *this, br_private_t *priv, dict_t *options,</div><div class='add'>+                            gf_boolean_t scrubstall)</div><div class='add'>+{</div><div class='add'>+    int32_t ret = 0;</div><div class='add'>+    char *tmp = NULL;</div><div class='add'>+    struct br_scrubber *fsscrub = NULL;</div><div class='add'>+    scrub_throttle_t nthrottle = BR_SCRUB_THROTTLE_VOID;</div><div class='add'>+</div><div class='add'>+    fsscrub = &amp;priv-&gt;fsscrub;</div><div class='add'>+    fsscrub-&gt;throttle_reconf = _gf_false;</div><div class='add'>+</div><div class='add'>+    ret = br_scrubber_fetch_option(this, "scrub-throttle", options, &amp;tmp);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto error_return;</div><div class='add'>+</div><div class='add'>+    if (scrubstall)</div><div class='add'>+        tmp = BR_SCRUB_STALLED;</div><div class='add'>+</div><div class='add'>+    if (strcasecmp(tmp, "lazy") == 0)</div><div class='add'>+        nthrottle = BR_SCRUB_THROTTLE_LAZY;</div><div class='add'>+    else if (strcasecmp(tmp, "normal") == 0)</div><div class='add'>+        nthrottle = BR_SCRUB_THROTTLE_NORMAL;</div><div class='add'>+    else if (strcasecmp(tmp, "aggressive") == 0)</div><div class='add'>+        nthrottle = BR_SCRUB_THROTTLE_AGGRESSIVE;</div><div class='add'>+    else if (strcasecmp(tmp, BR_SCRUB_STALLED) == 0)</div><div class='add'>+        nthrottle = BR_SCRUB_THROTTLE_STALLED;</div><div class='add'>+    else</div><div class='add'>+        goto error_return;</div><div class='add'>+</div><div class='add'>+    /* on failure old throttling value is preserved */</div><div class='add'>+    ret = br_scrubber_configure(this, priv, fsscrub, nthrottle);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto error_return;</div><div class='add'>+</div><div class='add'>+    if (fsscrub-&gt;throttle != nthrottle)</div><div class='add'>+        fsscrub-&gt;throttle_reconf = _gf_true;</div><div class='add'>+</div><div class='add'>+    fsscrub-&gt;throttle = nthrottle;</div><div class='add'>+    return 0;</div><div class='add'>+</div><div class='add'>+error_return:</div><div class='add'>+    return -1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int32_t</div><div class='add'>+br_scrubber_handle_stall(xlator_t *this, br_private_t *priv, dict_t *options,</div><div class='add'>+                         gf_boolean_t *scrubstall)</div><div class='add'>+{</div><div class='add'>+    int32_t ret = 0;</div><div class='add'>+    char *tmp = NULL;</div><div class='add'>+</div><div class='add'>+    ret = br_scrubber_fetch_option(this, "scrub-state", options, &amp;tmp);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto error_return;</div><div class='add'>+</div><div class='add'>+    if (strcasecmp(tmp, "pause") == 0) /* anything else is active */</div><div class='add'>+        *scrubstall = _gf_true;</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+</div><div class='add'>+error_return:</div><div class='add'>+    return -1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int32_t</div><div class='add'>+br_scrubber_handle_freq(xlator_t *this, br_private_t *priv, dict_t *options,</div><div class='add'>+                        gf_boolean_t scrubstall)</div><div class='add'>+{</div><div class='add'>+    int32_t ret = -1;</div><div class='add'>+    char *tmp = NULL;</div><div class='add'>+    scrub_freq_t frequency = BR_FSSCRUB_FREQ_HOURLY;</div><div class='add'>+    struct br_scrubber *fsscrub = NULL;</div><div class='add'>+</div><div class='add'>+    fsscrub = &amp;priv-&gt;fsscrub;</div><div class='add'>+    fsscrub-&gt;frequency_reconf = _gf_true;</div><div class='add'>+</div><div class='add'>+    ret = br_scrubber_fetch_option(this, "scrub-freq", options, &amp;tmp);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto error_return;</div><div class='add'>+</div><div class='add'>+    if (scrubstall)</div><div class='add'>+        tmp = BR_SCRUB_STALLED;</div><div class='add'>+</div><div class='add'>+    if (strcasecmp(tmp, "hourly") == 0) {</div><div class='add'>+        frequency = BR_FSSCRUB_FREQ_HOURLY;</div><div class='add'>+    } else if (strcasecmp(tmp, "daily") == 0) {</div><div class='add'>+        frequency = BR_FSSCRUB_FREQ_DAILY;</div><div class='add'>+    } else if (strcasecmp(tmp, "weekly") == 0) {</div><div class='add'>+        frequency = BR_FSSCRUB_FREQ_WEEKLY;</div><div class='add'>+    } else if (strcasecmp(tmp, "biweekly") == 0) {</div><div class='add'>+        frequency = BR_FSSCRUB_FREQ_BIWEEKLY;</div><div class='add'>+    } else if (strcasecmp(tmp, "monthly") == 0) {</div><div class='add'>+        frequency = BR_FSSCRUB_FREQ_MONTHLY;</div><div class='add'>+    } else if (strcasecmp(tmp, "minute") == 0) {</div><div class='add'>+        frequency = BR_FSSCRUB_FREQ_MINUTE;</div><div class='add'>+    } else if (strcasecmp(tmp, BR_SCRUB_STALLED) == 0) {</div><div class='add'>+        frequency = BR_FSSCRUB_FREQ_STALLED;</div><div class='add'>+    } else</div><div class='add'>+        goto error_return;</div><div class='add'>+</div><div class='add'>+    if (fsscrub-&gt;frequency == frequency)</div><div class='add'>+        fsscrub-&gt;frequency_reconf = _gf_false;</div><div class='add'>+    else</div><div class='add'>+        fsscrub-&gt;frequency = frequency;</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+</div><div class='add'>+error_return:</div><div class='add'>+    return -1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+br_scrubber_log_option(xlator_t *this, br_private_t *priv,</div><div class='add'>+                       gf_boolean_t scrubstall)</div><div class='add'>+{</div><div class='add'>+    struct br_scrubber *fsscrub = &amp;priv-&gt;fsscrub;</div><div class='add'>+    char *scrub_throttle_str[] = {</div><div class='add'>+        [BR_SCRUB_THROTTLE_LAZY] = "lazy",</div><div class='add'>+        [BR_SCRUB_THROTTLE_NORMAL] = "normal",</div><div class='add'>+        [BR_SCRUB_THROTTLE_AGGRESSIVE] = "aggressive",</div><div class='add'>+        [BR_SCRUB_THROTTLE_STALLED] = "stalled",</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    char *scrub_freq_str[] = {</div><div class='add'>+        [0] = "",</div><div class='add'>+        [BR_FSSCRUB_FREQ_HOURLY] = "hourly",</div><div class='add'>+        [BR_FSSCRUB_FREQ_DAILY] = "daily",</div><div class='add'>+        [BR_FSSCRUB_FREQ_WEEKLY] = "weekly",</div><div class='add'>+        [BR_FSSCRUB_FREQ_BIWEEKLY] = "biweekly",</div><div class='add'>+        [BR_FSSCRUB_FREQ_MONTHLY] = "monthly (30 days)",</div><div class='add'>+        [BR_FSSCRUB_FREQ_MINUTE] = "every minute",</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    if (scrubstall)</div><div class='add'>+        return; /* logged as pause */</div><div class='add'>+</div><div class='add'>+    if (fsscrub-&gt;frequency_reconf || fsscrub-&gt;throttle_reconf) {</div><div class='add'>+        if (fsscrub-&gt;throttle == BR_SCRUB_THROTTLE_VOID)</div><div class='add'>+            return;</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_INFO, 0, BRB_MSG_SCRUB_TUNABLE,</div><div class='add'>+               "SCRUB TUNABLES:: [Frequency: %s, Throttle: %s]",</div><div class='add'>+               scrub_freq_str[fsscrub-&gt;frequency],</div><div class='add'>+               scrub_throttle_str[fsscrub-&gt;throttle]);</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+br_scrubber_handle_options(xlator_t *this, br_private_t *priv, dict_t *options)</div><div class='add'>+{</div><div class='add'>+    int32_t ret = 0;</div><div class='add'>+    gf_boolean_t scrubstall = _gf_false; /* not as dangerous as it sounds */</div><div class='add'>+</div><div class='add'>+    ret = br_scrubber_handle_stall(this, priv, options, &amp;scrubstall);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto error_return;</div><div class='add'>+</div><div class='add'>+    ret = br_scrubber_handle_throttle(this, priv, options, scrubstall);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto error_return;</div><div class='add'>+</div><div class='add'>+    ret = br_scrubber_handle_freq(this, priv, options, scrubstall);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto error_return;</div><div class='add'>+</div><div class='add'>+    br_scrubber_log_option(this, priv, scrubstall);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+</div><div class='add'>+error_return:</div><div class='add'>+    return -1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+inode_t *</div><div class='add'>+br_lookup_bad_obj_dir(xlator_t *this, br_child_t *child, uuid_t gfid)</div><div class='add'>+{</div><div class='add'>+    struct iatt statbuf = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    inode_table_t *table = NULL;</div><div class='add'>+    int32_t ret = -1;</div><div class='add'>+    loc_t loc = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    inode_t *linked_inode = NULL;</div><div class='add'>+    int32_t op_errno = 0;</div><div class='add'>+</div><div class='add'>+    GF_VALIDATE_OR_GOTO("bit-rot-scrubber", this, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, this-&gt;private, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, child, out);</div><div class='add'>+</div><div class='add'>+    table = child-&gt;table;</div><div class='add'>+</div><div class='add'>+    loc.inode = inode_new(table);</div><div class='add'>+    if (!loc.inode) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_ERROR, ENOMEM, BRB_MSG_NO_MEMORY,</div><div class='add'>+               "failed to allocate a new inode for"</div><div class='add'>+               "bad object directory");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    gf_uuid_copy(loc.gfid, gfid);</div><div class='add'>+</div><div class='add'>+    ret = syncop_lookup(child-&gt;xl, &amp;loc, &amp;statbuf, NULL, NULL, NULL);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        op_errno = -ret;</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_ERROR, 0, BRB_MSG_LOOKUP_FAILED,</div><div class='add'>+               "failed to lookup the bad "</div><div class='add'>+               "objects directory (gfid: %s (%s))",</div><div class='add'>+               uuid_utoa(gfid), strerror(op_errno));</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    linked_inode = inode_link(loc.inode, NULL, NULL, &amp;statbuf);</div><div class='add'>+    if (linked_inode)</div><div class='add'>+        inode_lookup(linked_inode);</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    loc_wipe(&amp;loc);</div><div class='add'>+    return linked_inode;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+br_read_bad_object_dir(xlator_t *this, br_child_t *child, fd_t *fd,</div><div class='add'>+                       dict_t *dict)</div><div class='add'>+{</div><div class='add'>+    gf_dirent_t entries;</div><div class='add'>+    gf_dirent_t *entry = NULL;</div><div class='add'>+    int32_t ret = -1;</div><div class='add'>+    off_t offset = 0;</div><div class='add'>+    int32_t count = 0;</div><div class='add'>+    char key[32] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    dict_t *out_dict = NULL;</div><div class='add'>+</div><div class='add'>+    INIT_LIST_HEAD(&amp;entries.list);</div><div class='add'>+</div><div class='add'>+    while ((ret = syncop_readdir(child-&gt;xl, fd, 131072, offset, &amp;entries, NULL,</div><div class='add'>+                                 &amp;out_dict))) {</div><div class='add'>+        if (ret &lt; 0)</div><div class='add'>+            goto out;</div><div class='add'>+</div><div class='add'>+        list_for_each_entry(entry, &amp;entries.list, list)</div><div class='add'>+        {</div><div class='add'>+            offset = entry-&gt;d_off;</div><div class='add'>+</div><div class='add'>+            snprintf(key, sizeof(key), "quarantine-%d", count);</div><div class='add'>+</div><div class='add'>+            /*</div><div class='add'>+             * ignore the dict_set errors for now. The intention is</div><div class='add'>+             * to get as many bad objects as possible instead of</div><div class='add'>+             * erroring out at the first failure.</div><div class='add'>+             */</div><div class='add'>+            ret = dict_set_dynstr_with_alloc(dict, key, entry-&gt;d_name);</div><div class='add'>+            if (!ret)</div><div class='add'>+                count++;</div><div class='add'>+</div><div class='add'>+            if (out_dict) {</div><div class='add'>+                dict_copy(out_dict, dict);</div><div class='add'>+                dict_unref(out_dict);</div><div class='add'>+                out_dict = NULL;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        gf_dirent_free(&amp;entries);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = count;</div><div class='add'>+    ret = dict_set_int32_sizen(dict, "count", count);</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+br_get_bad_objects_from_child(xlator_t *this, dict_t *dict, br_child_t *child)</div><div class='add'>+{</div><div class='add'>+    inode_t *inode = NULL;</div><div class='add'>+    inode_table_t *table = NULL;</div><div class='add'>+    fd_t *fd = NULL;</div><div class='add'>+    int32_t ret = -1;</div><div class='add'>+    loc_t loc = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int32_t op_errno = 0;</div><div class='add'>+</div><div class='add'>+    GF_VALIDATE_OR_GOTO("bit-rot-scrubber", this, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, this-&gt;private, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, child, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, dict, out);</div><div class='add'>+</div><div class='add'>+    table = child-&gt;table;</div><div class='add'>+</div><div class='add'>+    inode = inode_find(table, BR_BAD_OBJ_CONTAINER);</div><div class='add'>+    if (!inode) {</div><div class='add'>+        inode = br_lookup_bad_obj_dir(this, child, BR_BAD_OBJ_CONTAINER);</div><div class='add'>+        if (!inode)</div><div class='add'>+            goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    fd = fd_create(inode, 0);</div><div class='add'>+    if (!fd) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_ERROR, ENOMEM, BRB_MSG_FD_CREATE_FAILED,</div><div class='add'>+               "fd creation for the bad "</div><div class='add'>+               "objects directory failed (gfid: %s)",</div><div class='add'>+               uuid_utoa(BR_BAD_OBJ_CONTAINER));</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    loc.inode = inode;</div><div class='add'>+    gf_uuid_copy(loc.gfid, inode-&gt;gfid);</div><div class='add'>+</div><div class='add'>+    ret = syncop_opendir(child-&gt;xl, &amp;loc, fd, NULL, NULL);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        op_errno = -ret;</div><div class='add'>+        fd_unref(fd);</div><div class='add'>+        fd = NULL;</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_ERROR, op_errno, BRB_MSG_FD_CREATE_FAILED,</div><div class='add'>+               "failed to open the bad "</div><div class='add'>+               "objects directory %s",</div><div class='add'>+               uuid_utoa(BR_BAD_OBJ_CONTAINER));</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    fd_bind(fd);</div><div class='add'>+</div><div class='add'>+    ret = br_read_bad_object_dir(this, child, fd, dict);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_ERROR, 0, BRB_MSG_BAD_OBJ_READDIR_FAIL,</div><div class='add'>+               "readdir of the bad "</div><div class='add'>+               "objects directory (%s) failed ",</div><div class='add'>+               uuid_utoa(BR_BAD_OBJ_CONTAINER));</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    loc_wipe(&amp;loc);</div><div class='add'>+    if (fd)</div><div class='add'>+        fd_unref(fd);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+br_collect_bad_objects_of_child(xlator_t *this, br_child_t *child, dict_t *dict,</div><div class='add'>+                                dict_t *child_dict, int32_t total_count)</div><div class='add'>+{</div><div class='add'>+    int32_t ret = -1;</div><div class='add'>+    int32_t count = 0;</div><div class='add'>+    char key[32] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    char main_key[32] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int32_t j = 0;</div><div class='add'>+    int32_t tmp_count = 0;</div><div class='add'>+    char *entry = NULL;</div><div class='add'>+    char tmp[PATH_MAX] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    char *path = NULL;</div><div class='add'>+    int32_t len = 0;</div><div class='add'>+</div><div class='add'>+    ret = dict_get_int32_sizen(child_dict, "count", &amp;count);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    tmp_count = total_count;</div><div class='add'>+</div><div class='add'>+    for (j = 0; j &lt; count; j++) {</div><div class='add'>+        len = snprintf(key, sizeof(key), "quarantine-%d", j);</div><div class='add'>+        ret = dict_get_strn(child_dict, key, len, &amp;entry);</div><div class='add'>+        if (ret)</div><div class='add'>+            continue;</div><div class='add'>+</div><div class='add'>+        ret = dict_get_str(child_dict, entry, &amp;path);</div><div class='add'>+        len = snprintf(tmp, PATH_MAX, "%s ==&gt; BRICK: %s\n path: %s", entry,</div><div class='add'>+                       child-&gt;brick_path, path);</div><div class='add'>+        if ((len &lt; 0) || (len &gt;= PATH_MAX)) {</div><div class='add'>+            continue;</div><div class='add'>+        }</div><div class='add'>+        snprintf(main_key, sizeof(main_key), "quarantine-%d", tmp_count);</div><div class='add'>+</div><div class='add'>+        ret = dict_set_dynstr_with_alloc(dict, main_key, tmp);</div><div class='add'>+        if (!ret)</div><div class='add'>+            tmp_count++;</div><div class='add'>+        path = NULL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = tmp_count;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+br_collect_bad_objects_from_children(xlator_t *this, dict_t *dict)</div><div class='add'>+{</div><div class='add'>+    int32_t ret = -1;</div><div class='add'>+    dict_t *child_dict = NULL;</div><div class='add'>+    int32_t i = 0;</div><div class='add'>+    int32_t total_count = 0;</div><div class='add'>+    br_child_t *child = NULL;</div><div class='add'>+    br_private_t *priv = NULL;</div><div class='add'>+    dict_t *tmp_dict = NULL;</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+    tmp_dict = dict;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+        child = &amp;priv-&gt;children[i];</div><div class='add'>+        GF_ASSERT(child);</div><div class='add'>+        if (!_br_is_child_connected(child))</div><div class='add'>+            continue;</div><div class='add'>+</div><div class='add'>+        child_dict = dict_new();</div><div class='add'>+        if (!child_dict) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, ENOMEM, BRB_MSG_NO_MEMORY,</div><div class='add'>+                   "failed to allocate dict");</div><div class='add'>+            continue;</div><div class='add'>+        }</div><div class='add'>+        ret = br_get_bad_objects_from_child(this, child_dict, child);</div><div class='add'>+        /*</div><div class='add'>+         * Continue asking the remaining children for the list of</div><div class='add'>+         * bad objects even though getting the list from one of them</div><div class='add'>+         * fails.</div><div class='add'>+         */</div><div class='add'>+        if (ret) {</div><div class='add'>+            dict_unref(child_dict);</div><div class='add'>+            continue;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        ret = br_collect_bad_objects_of_child(this, child, tmp_dict, child_dict,</div><div class='add'>+                                              total_count);</div><div class='add'>+        if (ret &lt; 0) {</div><div class='add'>+            dict_unref(child_dict);</div><div class='add'>+            continue;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        total_count = ret;</div><div class='add'>+        dict_unref(child_dict);</div><div class='add'>+        child_dict = NULL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_set_int32(tmp_dict, "total-count", total_count);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+br_get_bad_objects_list(xlator_t *this, dict_t **dict)</div><div class='add'>+{</div><div class='add'>+    int32_t ret = -1;</div><div class='add'>+    dict_t *tmp_dict = NULL;</div><div class='add'>+</div><div class='add'>+    GF_VALIDATE_OR_GOTO("bir-rot-scrubber", this, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, dict, out);</div><div class='add'>+</div><div class='add'>+    tmp_dict = *dict;</div><div class='add'>+    if (!tmp_dict) {</div><div class='add'>+        tmp_dict = dict_new();</div><div class='add'>+        if (!tmp_dict) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, ENOMEM, BRB_MSG_NO_MEMORY,</div><div class='add'>+                   "failed to allocate dict");</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+        *dict = tmp_dict;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = br_collect_bad_objects_from_children(this, tmp_dict);</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+wait_for_scrub_to_finish(xlator_t *this)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    br_private_t *priv = NULL;</div><div class='add'>+    struct br_monitor *scrub_monitor = NULL;</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+    scrub_monitor = &amp;priv-&gt;scrub_monitor;</div><div class='add'>+</div><div class='add'>+    GF_VALIDATE_OR_GOTO("bit-rot", scrub_monitor, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("bit-rot", this, out);</div><div class='add'>+</div><div class='add'>+    gf_msg(this-&gt;name, GF_LOG_INFO, 0, BRB_MSG_SCRUB_INFO,</div><div class='add'>+           "Waiting for all children to start and finish scrub");</div><div class='add'>+</div><div class='add'>+    pthread_mutex_lock(&amp;scrub_monitor-&gt;donelock);</div><div class='add'>+    {</div><div class='add'>+        while (!scrub_monitor-&gt;done)</div><div class='add'>+            pthread_cond_wait(&amp;scrub_monitor-&gt;donecond,</div><div class='add'>+                              &amp;scrub_monitor-&gt;donelock);</div><div class='add'>+    }</div><div class='add'>+    pthread_mutex_unlock(&amp;scrub_monitor-&gt;donelock);</div><div class='add'>+    ret = 0;</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/**</div><div class='add'>+ * This function is executed in a separate thread. This is scrubber monitor</div><div class='add'>+ * thread that takes care of state machine.</div><div class='add'>+ */</div><div class='add'>+void *</div><div class='add'>+br_monitor_thread(void *arg)</div><div class='add'>+{</div><div class='add'>+    int32_t ret = 0;</div><div class='add'>+    xlator_t *this = NULL;</div><div class='add'>+    br_private_t *priv = NULL;</div><div class='add'>+    struct br_monitor *scrub_monitor = NULL;</div><div class='add'>+</div><div class='add'>+    this = arg;</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    /*</div><div class='add'>+     * Since, this is the topmost xlator, THIS has to be set by bit-rot</div><div class='add'>+     * xlator itself (STACK_WIND won't help in this case). Also it has</div><div class='add'>+     * to be done for each thread that gets spawned. Otherwise, a new</div><div class='add'>+     * thread will get global_xlator's pointer when it does "THIS".</div><div class='add'>+     */</div><div class='add'>+    THIS = this;</div><div class='add'>+</div><div class='add'>+    scrub_monitor = &amp;priv-&gt;scrub_monitor;</div><div class='add'>+</div><div class='add'>+    pthread_mutex_lock(&amp;scrub_monitor-&gt;mutex);</div><div class='add'>+    {</div><div class='add'>+        while (!scrub_monitor-&gt;inited)</div><div class='add'>+            pthread_cond_wait(&amp;scrub_monitor-&gt;cond, &amp;scrub_monitor-&gt;mutex);</div><div class='add'>+    }</div><div class='add'>+    pthread_mutex_unlock(&amp;scrub_monitor-&gt;mutex);</div><div class='add'>+</div><div class='add'>+    /* this needs to be serialized with reconfigure() */</div><div class='add'>+    pthread_mutex_lock(&amp;priv-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        ret = br_scrub_state_machine(this, _gf_false);</div><div class='add'>+    }</div><div class='add'>+    pthread_mutex_unlock(&amp;priv-&gt;lock);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_ERROR, -ret, BRB_MSG_SSM_FAILED,</div><div class='add'>+               "Scrub state machine failed");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    while (1) {</div><div class='add'>+        /* Wait for all children to finish scrubbing */</div><div class='add'>+        ret = wait_for_scrub_to_finish(this);</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, -ret, BRB_MSG_SCRUB_WAIT_FAILED,</div><div class='add'>+                   "Scrub wait failed");</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        /* scrub exit criteria: Move the state to PENDING */</div><div class='add'>+        br_scrubber_exit_control(this);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return NULL;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+br_set_scrub_state(struct br_monitor *scrub_monitor, br_scrub_state_t state)</div><div class='add'>+{</div><div class='add'>+    LOCK(&amp;scrub_monitor-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        _br_monitor_set_scrub_state(scrub_monitor, state);</div><div class='add'>+    }</div><div class='add'>+    UNLOCK(&amp;scrub_monitor-&gt;lock);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+br_scrubber_monitor_init(xlator_t *this, br_private_t *priv)</div><div class='add'>+{</div><div class='add'>+    struct br_monitor *scrub_monitor = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    scrub_monitor = &amp;priv-&gt;scrub_monitor;</div><div class='add'>+</div><div class='add'>+    LOCK_INIT(&amp;scrub_monitor-&gt;lock);</div><div class='add'>+    scrub_monitor-&gt;this = this;</div><div class='add'>+</div><div class='add'>+    scrub_monitor-&gt;inited = _gf_false;</div><div class='add'>+    pthread_mutex_init(&amp;scrub_monitor-&gt;mutex, NULL);</div><div class='add'>+    pthread_cond_init(&amp;scrub_monitor-&gt;cond, NULL);</div><div class='add'>+</div><div class='add'>+    scrub_monitor-&gt;kick = _gf_false;</div><div class='add'>+    scrub_monitor-&gt;active_child_count = 0;</div><div class='add'>+    pthread_mutex_init(&amp;scrub_monitor-&gt;wakelock, NULL);</div><div class='add'>+    pthread_cond_init(&amp;scrub_monitor-&gt;wakecond, NULL);</div><div class='add'>+</div><div class='add'>+    scrub_monitor-&gt;done = _gf_false;</div><div class='add'>+    pthread_mutex_init(&amp;scrub_monitor-&gt;donelock, NULL);</div><div class='add'>+    pthread_cond_init(&amp;scrub_monitor-&gt;donecond, NULL);</div><div class='add'>+</div><div class='add'>+    /* Set the state to INACTIVE */</div><div class='add'>+    br_set_scrub_state(&amp;priv-&gt;scrub_monitor, BR_SCRUB_STATE_INACTIVE);</div><div class='add'>+</div><div class='add'>+    /* Start the monitor thread */</div><div class='add'>+    ret = gf_thread_create(&amp;scrub_monitor-&gt;thread, NULL, br_monitor_thread,</div><div class='add'>+                           this, "brmon");</div><div class='add'>+    if (ret != 0) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_ERROR, -ret, BRB_MSG_SPAWN_FAILED,</div><div class='add'>+               "monitor thread creation failed");</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+err:</div><div class='add'>+    pthread_mutex_destroy(&amp;scrub_monitor-&gt;mutex);</div><div class='add'>+    pthread_cond_destroy(&amp;scrub_monitor-&gt;cond);</div><div class='add'>+</div><div class='add'>+    pthread_mutex_destroy(&amp;scrub_monitor-&gt;wakelock);</div><div class='add'>+    pthread_cond_destroy(&amp;scrub_monitor-&gt;wakecond);</div><div class='add'>+</div><div class='add'>+    pthread_mutex_destroy(&amp;scrub_monitor-&gt;donelock);</div><div class='add'>+    pthread_cond_destroy(&amp;scrub_monitor-&gt;donecond);</div><div class='add'>+</div><div class='add'>+    LOCK_DESTROY(&amp;scrub_monitor-&gt;lock);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+br_scrubber_init(xlator_t *this, br_private_t *priv)</div><div class='add'>+{</div><div class='add'>+    struct br_scrubber *fsscrub = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    priv-&gt;tbf = tbf_init(NULL, 0);</div><div class='add'>+    if (!priv-&gt;tbf)</div><div class='add'>+        return -1;</div><div class='add'>+</div><div class='add'>+    ret = br_scrubber_monitor_init(this, priv);</div><div class='add'>+    if (ret)</div><div class='add'>+        return -1;</div><div class='add'>+</div><div class='add'>+    fsscrub = &amp;priv-&gt;fsscrub;</div><div class='add'>+</div><div class='add'>+    fsscrub-&gt;this = this;</div><div class='add'>+    fsscrub-&gt;throttle = BR_SCRUB_THROTTLE_VOID;</div><div class='add'>+</div><div class='add'>+    pthread_mutex_init(&amp;fsscrub-&gt;mutex, NULL);</div><div class='add'>+    pthread_cond_init(&amp;fsscrub-&gt;cond, NULL);</div><div class='add'>+</div><div class='add'>+    fsscrub-&gt;nr_scrubbers = 0;</div><div class='add'>+    INIT_LIST_HEAD(&amp;fsscrub-&gt;scrubbers);</div><div class='add'>+    INIT_LIST_HEAD(&amp;fsscrub-&gt;scrublist);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='head'>diff --git a/xlators/features/bit-rot/src/bitd/bit-rot-scrub.h b/xlators/features/bit-rot/src/bitd/bit-rot-scrub.h<br/>new file mode 100644<br/>index 00000000000..4e5f67bc021<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/xlators/features/bit-rot/src/bitd/bit-rot-scrub.h?id=d1d7a6f35c816822fab51c820e25023863c239c1'>xlators/features/bit-rot/src/bitd/bit-rot-scrub.h</a></div><div class='hunk'>@@ -0,0 +1,46 @@</div><div class='add'>+/*</div><div class='add'>+   Copyright (c) 2015 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+   This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+   This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+   General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+   later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+   cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#ifndef __BIT_ROT_SCRUB_H__</div><div class='add'>+#define __BIT_ROT_SCRUB_H__</div><div class='add'>+</div><div class='add'>+#include &lt;glusterfs/xlator.h&gt;</div><div class='add'>+#include "bit-rot.h"</div><div class='add'>+</div><div class='add'>+void *</div><div class='add'>+br_fsscanner(void *);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+br_fsscan_schedule(xlator_t *);</div><div class='add'>+int32_t</div><div class='add'>+br_fsscan_reschedule(xlator_t *);</div><div class='add'>+int32_t</div><div class='add'>+br_fsscan_activate(xlator_t *);</div><div class='add'>+int32_t</div><div class='add'>+br_fsscan_deactivate(xlator_t *);</div><div class='add'>+int32_t</div><div class='add'>+br_fsscan_ondemand(xlator_t *);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+br_scrubber_handle_options(xlator_t *, br_private_t *, dict_t *);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+br_scrubber_monitor_init(xlator_t *, br_private_t *);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+br_scrubber_init(xlator_t *, br_private_t *);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+br_collect_bad_objects_from_children(xlator_t *this, dict_t *dict);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+br_child_set_scrub_state(br_child_t *, gf_boolean_t);</div><div class='add'>+</div><div class='add'>+#endif /* __BIT_ROT_SCRUB_H__ */</div><div class='head'>diff --git a/xlators/features/bit-rot/src/bitd/bit-rot-ssm.c b/xlators/features/bit-rot/src/bitd/bit-rot-ssm.c<br/>new file mode 100644<br/>index 00000000000..753e31a3b23<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/xlators/features/bit-rot/src/bitd/bit-rot-ssm.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>xlators/features/bit-rot/src/bitd/bit-rot-ssm.c</a></div><div class='hunk'>@@ -0,0 +1,124 @@</div><div class='add'>+/*</div><div class='add'>+   Copyright (c) 2015 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+   This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+   This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+   General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+   later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+   cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#include "bit-rot-ssm.h"</div><div class='add'>+#include "bit-rot-scrub.h"</div><div class='add'>+#include "bit-rot-bitd-messages.h"</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+br_scrub_ssm_noop(xlator_t *this)</div><div class='add'>+{</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+br_scrub_ssm_state_pause(xlator_t *this)</div><div class='add'>+{</div><div class='add'>+    br_private_t *priv = NULL;</div><div class='add'>+    struct br_monitor *scrub_monitor = NULL;</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+    scrub_monitor = &amp;priv-&gt;scrub_monitor;</div><div class='add'>+</div><div class='add'>+    gf_msg(this-&gt;name, GF_LOG_INFO, 0, BRB_MSG_GENERIC_SSM_INFO,</div><div class='add'>+           "Scrubber paused");</div><div class='add'>+    _br_monitor_set_scrub_state(scrub_monitor, BR_SCRUB_STATE_PAUSED);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+br_scrub_ssm_state_ipause(xlator_t *this)</div><div class='add'>+{</div><div class='add'>+    br_private_t *priv = NULL;</div><div class='add'>+    struct br_monitor *scrub_monitor = NULL;</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+    scrub_monitor = &amp;priv-&gt;scrub_monitor;</div><div class='add'>+</div><div class='add'>+    gf_msg(this-&gt;name, GF_LOG_INFO, 0, BRB_MSG_GENERIC_SSM_INFO,</div><div class='add'>+           "Scrubber paused");</div><div class='add'>+    _br_monitor_set_scrub_state(scrub_monitor, BR_SCRUB_STATE_IPAUSED);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+br_scrub_ssm_state_active(xlator_t *this)</div><div class='add'>+{</div><div class='add'>+    br_private_t *priv = NULL;</div><div class='add'>+    struct br_monitor *scrub_monitor = NULL;</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+    scrub_monitor = &amp;priv-&gt;scrub_monitor;</div><div class='add'>+</div><div class='add'>+    if (scrub_monitor-&gt;done) {</div><div class='add'>+        (void)br_fsscan_activate(this);</div><div class='add'>+    } else {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_INFO, 0, BRB_MSG_GENERIC_SSM_INFO,</div><div class='add'>+               "Scrubbing resumed");</div><div class='add'>+        _br_monitor_set_scrub_state(scrub_monitor, BR_SCRUB_STATE_ACTIVE);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+br_scrub_ssm_state_stall(xlator_t *this)</div><div class='add'>+{</div><div class='add'>+    br_private_t *priv = NULL;</div><div class='add'>+    struct br_monitor *scrub_monitor = NULL;</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+    scrub_monitor = &amp;priv-&gt;scrub_monitor;</div><div class='add'>+</div><div class='add'>+    gf_msg(this-&gt;name, GF_LOG_INFO, 0, BRB_MSG_GENERIC_SSM_INFO,</div><div class='add'>+           "Volume is under active scrubbing. Pausing scrub..");</div><div class='add'>+    _br_monitor_set_scrub_state(scrub_monitor, BR_SCRUB_STATE_STALLED);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static br_scrub_ssm_call *br_scrub_ssm[BR_SCRUB_MAXSTATES][BR_SCRUB_MAXEVENTS] =</div><div class='add'>+    {</div><div class='add'>+        /* INACTIVE */</div><div class='add'>+        {br_fsscan_schedule, br_scrub_ssm_state_ipause, br_scrub_ssm_noop},</div><div class='add'>+        /* PENDING  */</div><div class='add'>+        {br_fsscan_reschedule, br_fsscan_deactivate, br_fsscan_ondemand},</div><div class='add'>+        /* ACTIVE   */</div><div class='add'>+        {br_scrub_ssm_noop, br_scrub_ssm_state_stall, br_scrub_ssm_noop},</div><div class='add'>+        /* PAUSED   */</div><div class='add'>+        {br_fsscan_activate, br_scrub_ssm_noop, br_scrub_ssm_noop},</div><div class='add'>+        /* IPAUSED  */</div><div class='add'>+        {br_fsscan_schedule, br_scrub_ssm_noop, br_scrub_ssm_noop},</div><div class='add'>+        /* STALLED  */</div><div class='add'>+        {br_scrub_ssm_state_active, br_scrub_ssm_noop, br_scrub_ssm_noop},</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+br_scrub_state_machine(xlator_t *this, gf_boolean_t scrub_ondemand)</div><div class='add'>+{</div><div class='add'>+    br_private_t *priv = NULL;</div><div class='add'>+    br_scrub_ssm_call *call = NULL;</div><div class='add'>+    struct br_scrubber *fsscrub = NULL;</div><div class='add'>+    br_scrub_state_t currstate = 0;</div><div class='add'>+    br_scrub_event_t event = 0;</div><div class='add'>+    struct br_monitor *scrub_monitor = NULL;</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+    fsscrub = &amp;priv-&gt;fsscrub;</div><div class='add'>+    scrub_monitor = &amp;priv-&gt;scrub_monitor;</div><div class='add'>+</div><div class='add'>+    currstate = scrub_monitor-&gt;state;</div><div class='add'>+    if (scrub_ondemand)</div><div class='add'>+        event = BR_SCRUB_EVENT_ONDEMAND;</div><div class='add'>+    else</div><div class='add'>+        event = _br_child_get_scrub_event(fsscrub);</div><div class='add'>+</div><div class='add'>+    call = br_scrub_ssm[currstate][event];</div><div class='add'>+    return call(this);</div><div class='add'>+}</div><div class='head'>diff --git a/xlators/features/bit-rot/src/bitd/bit-rot-ssm.h b/xlators/features/bit-rot/src/bitd/bit-rot-ssm.h<br/>new file mode 100644<br/>index 00000000000..37b45a42eac<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/xlators/features/bit-rot/src/bitd/bit-rot-ssm.h?id=d1d7a6f35c816822fab51c820e25023863c239c1'>xlators/features/bit-rot/src/bitd/bit-rot-ssm.h</a></div><div class='hunk'>@@ -0,0 +1,38 @@</div><div class='add'>+/*</div><div class='add'>+   Copyright (c) 2015 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+   This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+   This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+   General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+   later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+   cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#ifndef __BIT_ROT_SSM_H__</div><div class='add'>+#define __BIT_ROT_SSM_H__</div><div class='add'>+</div><div class='add'>+#include &lt;glusterfs/xlator.h&gt;</div><div class='add'>+</div><div class='add'>+typedef enum br_scrub_state {</div><div class='add'>+    BR_SCRUB_STATE_INACTIVE = 0,</div><div class='add'>+    BR_SCRUB_STATE_PENDING,</div><div class='add'>+    BR_SCRUB_STATE_ACTIVE,</div><div class='add'>+    BR_SCRUB_STATE_PAUSED,</div><div class='add'>+    BR_SCRUB_STATE_IPAUSED,</div><div class='add'>+    BR_SCRUB_STATE_STALLED,</div><div class='add'>+    BR_SCRUB_MAXSTATES,</div><div class='add'>+} br_scrub_state_t;</div><div class='add'>+</div><div class='add'>+typedef enum br_scrub_event {</div><div class='add'>+    BR_SCRUB_EVENT_SCHEDULE = 0,</div><div class='add'>+    BR_SCRUB_EVENT_PAUSE,</div><div class='add'>+    BR_SCRUB_EVENT_ONDEMAND,</div><div class='add'>+    BR_SCRUB_MAXEVENTS,</div><div class='add'>+} br_scrub_event_t;</div><div class='add'>+</div><div class='add'>+struct br_monitor;</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+br_scrub_state_machine(xlator_t *, gf_boolean_t);</div><div class='add'>+</div><div class='add'>+#endif /* __BIT_ROT_SSM_H__ */</div><div class='head'>diff --git a/xlators/features/bit-rot/src/bitd/bit-rot.c b/xlators/features/bit-rot/src/bitd/bit-rot.c<br/>new file mode 100644<br/>index 00000000000..a2f1c343a1d<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/xlators/features/bit-rot/src/bitd/bit-rot.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>xlators/features/bit-rot/src/bitd/bit-rot.c</a></div><div class='hunk'>@@ -0,0 +1,2232 @@</div><div class='add'>+/*</div><div class='add'>+   Copyright (c) 2015 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+   This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+   This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+   General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+   later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+   cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#include &lt;ctype.h&gt;</div><div class='add'>+</div><div class='add'>+#include &lt;glusterfs/logging.h&gt;</div><div class='add'>+#include &lt;glusterfs/compat-errno.h&gt;</div><div class='add'>+</div><div class='add'>+#include "bit-rot.h"</div><div class='add'>+#include "bit-rot-scrub.h"</div><div class='add'>+#include &lt;pthread.h&gt;</div><div class='add'>+#include "bit-rot-bitd-messages.h"</div><div class='add'>+</div><div class='add'>+#define BR_HASH_CALC_READ_SIZE (128 * 1024)</div><div class='add'>+</div><div class='add'>+typedef int32_t(br_child_handler)(xlator_t *, br_child_t *);</div><div class='add'>+</div><div class='add'>+struct br_child_event {</div><div class='add'>+    xlator_t *this;</div><div class='add'>+</div><div class='add'>+    br_child_t *child;</div><div class='add'>+</div><div class='add'>+    br_child_handler *call;</div><div class='add'>+</div><div class='add'>+    struct list_head list;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+br_find_child_index(xlator_t *this, xlator_t *child)</div><div class='add'>+{</div><div class='add'>+    br_private_t *priv = NULL;</div><div class='add'>+    int i = -1;</div><div class='add'>+    int index = -1;</div><div class='add'>+</div><div class='add'>+    GF_VALIDATE_OR_GOTO("bit-rot", this, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, this-&gt;private, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, child, out);</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+        if (child == priv-&gt;children[i].xl) {</div><div class='add'>+            index = i;</div><div class='add'>+            break;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return index;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+br_child_t *</div><div class='add'>+br_get_child_from_brick_path(xlator_t *this, char *brick_path)</div><div class='add'>+{</div><div class='add'>+    br_private_t *priv = NULL;</div><div class='add'>+    br_child_t *child = NULL;</div><div class='add'>+    br_child_t *tmp = NULL;</div><div class='add'>+    int i = 0;</div><div class='add'>+</div><div class='add'>+    GF_VALIDATE_OR_GOTO("bit-rot", this, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, this-&gt;private, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, brick_path, out);</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    pthread_mutex_lock(&amp;priv-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        for (i = 0; i &lt; priv-&gt;child_count; i++) {</div><div class='add'>+            tmp = &amp;priv-&gt;children[i];</div><div class='add'>+            if (!strcmp(tmp-&gt;brick_path, brick_path)) {</div><div class='add'>+                child = tmp;</div><div class='add'>+                break;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    pthread_mutex_unlock(&amp;priv-&gt;lock);</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return child;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/**</div><div class='add'>+ * probably we'll encapsulate brick inside our own structure when</div><div class='add'>+ * needed -- later.</div><div class='add'>+ */</div><div class='add'>+void *</div><div class='add'>+br_brick_init(void *xl, struct gf_brick_spec *brick)</div><div class='add'>+{</div><div class='add'>+    return brick;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/**</div><div class='add'>+ * and cleanup things here when allocated br_brick_init().</div><div class='add'>+ */</div><div class='add'>+void</div><div class='add'>+br_brick_fini(void *xl, char *brick, void *data)</div><div class='add'>+{</div><div class='add'>+    return;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/**</div><div class='add'>+ * TODO: Signature can contain null terminators which causes bitrot</div><div class='add'>+ * stub to store truncated hash as it depends on string length of</div><div class='add'>+ * the hash.</div><div class='add'>+ *</div><div class='add'>+ * FIX: Send the string length as part of the signature struct and</div><div class='add'>+ *      change stub to handle this change.</div><div class='add'>+ */</div><div class='add'>+static br_isignature_t *</div><div class='add'>+br_prepare_signature(const unsigned char *sign, unsigned long hashlen,</div><div class='add'>+                     int8_t hashtype, br_object_t *object)</div><div class='add'>+{</div><div class='add'>+    br_isignature_t *signature = NULL;</div><div class='add'>+</div><div class='add'>+    /* TODO: use mem-pool */</div><div class='add'>+    signature = GF_CALLOC(1, signature_size(hashlen + 1),</div><div class='add'>+                          gf_br_stub_mt_signature_t);</div><div class='add'>+    if (!signature)</div><div class='add'>+        return NULL;</div><div class='add'>+</div><div class='add'>+    /* object version */</div><div class='add'>+    signature-&gt;signedversion = object-&gt;signedversion;</div><div class='add'>+</div><div class='add'>+    /* signature length &amp; type */</div><div class='add'>+    signature-&gt;signaturelen = hashlen;</div><div class='add'>+    signature-&gt;signaturetype = hashtype;</div><div class='add'>+</div><div class='add'>+    /* signature itself */</div><div class='add'>+    memcpy(signature-&gt;signature, (char *)sign, hashlen);</div><div class='add'>+    signature-&gt;signature[hashlen + 1] = '\0';</div><div class='add'>+</div><div class='add'>+    return signature;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+gf_boolean_t</div><div class='add'>+bitd_is_bad_file(xlator_t *this, br_child_t *child, loc_t *loc, fd_t *fd)</div><div class='add'>+{</div><div class='add'>+    int32_t ret = -1;</div><div class='add'>+    dict_t *xattr = NULL;</div><div class='add'>+    inode_t *inode = NULL;</div><div class='add'>+    gf_boolean_t bad_file = _gf_false;</div><div class='add'>+</div><div class='add'>+    GF_VALIDATE_OR_GOTO("bit-rot", this, out);</div><div class='add'>+</div><div class='add'>+    inode = (loc) ? loc-&gt;inode : fd-&gt;inode;</div><div class='add'>+</div><div class='add'>+    if (fd)</div><div class='add'>+        ret = syncop_fgetxattr(child-&gt;xl, fd, &amp;xattr, BITROT_OBJECT_BAD_KEY,</div><div class='add'>+                               NULL, NULL);</div><div class='add'>+    else if (loc)</div><div class='add'>+        ret = syncop_getxattr(child-&gt;xl, loc, &amp;xattr, BITROT_OBJECT_BAD_KEY,</div><div class='add'>+                              NULL, NULL);</div><div class='add'>+</div><div class='add'>+    if (!ret) {</div><div class='add'>+        gf_msg_debug(this-&gt;name, 0, "[GFID: %s] is marked corrupted",</div><div class='add'>+                     uuid_utoa(inode-&gt;gfid));</div><div class='add'>+        bad_file = _gf_true;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (xattr)</div><div class='add'>+        dict_unref(xattr);</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return bad_file;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/**</div><div class='add'>+ * Do a lookup on the gfid present within the object.</div><div class='add'>+ */</div><div class='add'>+static int32_t</div><div class='add'>+br_object_lookup(xlator_t *this, br_object_t *object, struct iatt *iatt,</div><div class='add'>+                 inode_t **linked_inode)</div><div class='add'>+{</div><div class='add'>+    int ret = -EINVAL;</div><div class='add'>+    loc_t loc = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    inode_t *inode = NULL;</div><div class='add'>+</div><div class='add'>+    GF_VALIDATE_OR_GOTO("bit-rot", this, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, object, out);</div><div class='add'>+</div><div class='add'>+    inode = inode_find(object-&gt;child-&gt;table, object-&gt;gfid);</div><div class='add'>+</div><div class='add'>+    if (inode)</div><div class='add'>+        loc.inode = inode;</div><div class='add'>+    else</div><div class='add'>+        loc.inode = inode_new(object-&gt;child-&gt;table);</div><div class='add'>+</div><div class='add'>+    if (!loc.inode) {</div><div class='add'>+        ret = -ENOMEM;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    gf_uuid_copy(loc.gfid, object-&gt;gfid);</div><div class='add'>+</div><div class='add'>+    ret = syncop_lookup(object-&gt;child-&gt;xl, &amp;loc, iatt, NULL, NULL, NULL);</div><div class='add'>+    if (ret &lt; 0)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    /*</div><div class='add'>+     * The file might have been deleted by the application</div><div class='add'>+     * after getting the event, but before doing a lookup.</div><div class='add'>+     * So use linked_inode after inode_link is done.</div><div class='add'>+     */</div><div class='add'>+    *linked_inode = inode_link(loc.inode, NULL, NULL, iatt);</div><div class='add'>+    if (*linked_inode)</div><div class='add'>+        inode_lookup(*linked_inode);</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    loc_wipe(&amp;loc);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/**</div><div class='add'>+ * open the object with O_RDONLY flags and return the fd. How to let brick</div><div class='add'>+ * know that open is being done by bitd because syncop framework does not allow</div><div class='add'>+ * passing xdata -- may be use frame-&gt;root-&gt;pid itself.</div><div class='add'>+ */</div><div class='add'>+static int32_t</div><div class='add'>+br_object_open(xlator_t *this, br_object_t *object, inode_t *inode,</div><div class='add'>+               fd_t **openfd)</div><div class='add'>+{</div><div class='add'>+    int32_t ret = -1;</div><div class='add'>+    fd_t *fd = NULL;</div><div class='add'>+    loc_t loc = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    GF_VALIDATE_OR_GOTO("bit-rot", this, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, object, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, inode, out);</div><div class='add'>+</div><div class='add'>+    ret = -EINVAL;</div><div class='add'>+    fd = fd_create(inode, 0);</div><div class='add'>+    if (!fd) {</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_ERROR, 0, BRB_MSG_FD_CREATE_FAILED,</div><div class='add'>+                "gfid=%s", uuid_utoa(inode-&gt;gfid), NULL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    loc.inode = inode_ref(inode);</div><div class='add'>+    gf_uuid_copy(loc.gfid, inode-&gt;gfid);</div><div class='add'>+</div><div class='add'>+    ret = syncop_open(object-&gt;child-&gt;xl, &amp;loc, O_RDONLY, fd, NULL, NULL);</div><div class='add'>+    if (ret) {</div><div class='add'>+        br_log_object(this, "open", inode-&gt;gfid, -ret);</div><div class='add'>+        fd_unref(fd);</div><div class='add'>+        fd = NULL;</div><div class='add'>+    } else {</div><div class='add'>+        fd_bind(fd);</div><div class='add'>+        *openfd = fd;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    loc_wipe(&amp;loc);</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/**</div><div class='add'>+ * read 128k block from the object @object from the offset @offset</div><div class='add'>+ * and return the buffer.</div><div class='add'>+ */</div><div class='add'>+static int32_t</div><div class='add'>+br_object_read_block_and_sign(xlator_t *this, fd_t *fd, br_child_t *child,</div><div class='add'>+                              off_t offset, size_t size, SHA256_CTX *sha256)</div><div class='add'>+{</div><div class='add'>+    int32_t ret = -1;</div><div class='add'>+    tbf_t *tbf = NULL;</div><div class='add'>+    struct iovec *iovec = NULL;</div><div class='add'>+    struct iobref *iobref = NULL;</div><div class='add'>+    br_private_t *priv = NULL;</div><div class='add'>+    int count = 0;</div><div class='add'>+    int i = 0;</div><div class='add'>+</div><div class='add'>+    GF_VALIDATE_OR_GOTO("bit-rot", this, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, fd, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, fd-&gt;inode, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, child, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, this-&gt;private, out);</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, priv-&gt;tbf, out);</div><div class='add'>+    tbf = priv-&gt;tbf;</div><div class='add'>+</div><div class='add'>+    ret = syncop_readv(child-&gt;xl, fd, size, offset, 0, &amp;iovec, &amp;count, &amp;iobref,</div><div class='add'>+                       NULL, NULL, NULL);</div><div class='add'>+</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_ERROR, errno, BRB_MSG_READV_FAILED,</div><div class='add'>+                "gfid=%s", uuid_utoa(fd-&gt;inode-&gt;gfid), NULL);</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (ret == 0)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; count; i++) {</div><div class='add'>+        TBF_THROTTLE_BEGIN(tbf, TBF_OP_HASH, iovec[i].iov_len);</div><div class='add'>+        {</div><div class='add'>+            SHA256_Update(sha256, (const unsigned char *)(iovec[i].iov_base),</div><div class='add'>+                          iovec[i].iov_len);</div><div class='add'>+        }</div><div class='add'>+        TBF_THROTTLE_BEGIN(tbf, TBF_OP_HASH, iovec[i].iov_len);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (iovec)</div><div class='add'>+        GF_FREE(iovec);</div><div class='add'>+</div><div class='add'>+    if (iobref)</div><div class='add'>+        iobref_unref(iobref);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+br_calculate_obj_checksum(unsigned char *md, br_child_t *child, fd_t *fd,</div><div class='add'>+                          struct iatt *iatt)</div><div class='add'>+{</div><div class='add'>+    int32_t ret = -1;</div><div class='add'>+    off_t offset = 0;</div><div class='add'>+    size_t block = BR_HASH_CALC_READ_SIZE;</div><div class='add'>+    xlator_t *this = NULL;</div><div class='add'>+</div><div class='add'>+    SHA256_CTX sha256;</div><div class='add'>+</div><div class='add'>+    GF_VALIDATE_OR_GOTO("bit-rot", child, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("bit-rot", iatt, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("bit-rot", fd, out);</div><div class='add'>+</div><div class='add'>+    this = child-&gt;this;</div><div class='add'>+</div><div class='add'>+    SHA256_Init(&amp;sha256);</div><div class='add'>+</div><div class='add'>+    while (1) {</div><div class='add'>+        ret = br_object_read_block_and_sign(this, fd, child, offset, block,</div><div class='add'>+                                            &amp;sha256);</div><div class='add'>+        if (ret &lt; 0) {</div><div class='add'>+            gf_smsg(this-&gt;name, GF_LOG_ERROR, 0, BRB_MSG_BLOCK_READ_FAILED,</div><div class='add'>+                    "offset=%" PRIu64, offset, "object-gfid=%s",</div><div class='add'>+                    uuid_utoa(fd-&gt;inode-&gt;gfid), NULL);</div><div class='add'>+            break;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        if (ret == 0)</div><div class='add'>+            break;</div><div class='add'>+</div><div class='add'>+        offset += ret;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (ret == 0)</div><div class='add'>+        SHA256_Final(md, &amp;sha256);</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int32_t</div><div class='add'>+br_object_checksum(unsigned char *md, br_object_t *object, fd_t *fd,</div><div class='add'>+                   struct iatt *iatt)</div><div class='add'>+{</div><div class='add'>+    return br_calculate_obj_checksum(md, object-&gt;child, fd, iatt);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int32_t</div><div class='add'>+br_object_read_sign(inode_t *linked_inode, fd_t *fd, br_object_t *object,</div><div class='add'>+                    struct iatt *iatt)</div><div class='add'>+{</div><div class='add'>+    int32_t ret = -1;</div><div class='add'>+    xlator_t *this = NULL;</div><div class='add'>+    dict_t *xattr = NULL;</div><div class='add'>+    unsigned char *md = NULL;</div><div class='add'>+    br_isignature_t *sign = NULL;</div><div class='add'>+</div><div class='add'>+    GF_VALIDATE_OR_GOTO("bit-rot", object, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("bit-rot", linked_inode, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("bit-rot", fd, out);</div><div class='add'>+</div><div class='add'>+    this = object-&gt;this;</div><div class='add'>+</div><div class='add'>+    md = GF_MALLOC(SHA256_DIGEST_LENGTH, gf_common_mt_char);</div><div class='add'>+    if (!md) {</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_ERROR, ENOMEM, BRB_MSG_SAVING_HASH_FAILED,</div><div class='add'>+                "object-gfid=%s", uuid_utoa(fd-&gt;inode-&gt;gfid), NULL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = br_object_checksum(md, object, fd, iatt);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_ERROR, 0, BRB_MSG_CALC_CHECKSUM_FAILED,</div><div class='add'>+                "object-gfid=%s", uuid_utoa(linked_inode-&gt;gfid), NULL);</div><div class='add'>+        goto free_signature;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    sign = br_prepare_signature(md, SHA256_DIGEST_LENGTH,</div><div class='add'>+                                BR_SIGNATURE_TYPE_SHA256, object);</div><div class='add'>+    if (!sign) {</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_ERROR, 0, BRB_MSG_GET_SIGN_FAILED,</div><div class='add'>+                "object-gfid=%s", uuid_utoa(fd-&gt;inode-&gt;gfid), NULL);</div><div class='add'>+        goto free_signature;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    xattr = dict_for_key_value(GLUSTERFS_SET_OBJECT_SIGNATURE, (void *)sign,</div><div class='add'>+                               signature_size(SHA256_DIGEST_LENGTH), _gf_true);</div><div class='add'>+</div><div class='add'>+    if (!xattr) {</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_ERROR, 0, BRB_MSG_SET_SIGN_FAILED,</div><div class='add'>+                "dict-allocation object-gfid=%s", uuid_utoa(fd-&gt;inode-&gt;gfid),</div><div class='add'>+                NULL);</div><div class='add'>+        goto free_isign;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = syncop_fsetxattr(object-&gt;child-&gt;xl, fd, xattr, 0, NULL, NULL);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_ERROR, 0, BRB_MSG_SET_SIGN_FAILED,</div><div class='add'>+                "fsetxattr object-gfid=%s", uuid_utoa(fd-&gt;inode-&gt;gfid), NULL);</div><div class='add'>+        goto unref_dict;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+</div><div class='add'>+unref_dict:</div><div class='add'>+    dict_unref(xattr);</div><div class='add'>+free_isign:</div><div class='add'>+    GF_FREE(sign);</div><div class='add'>+free_signature:</div><div class='add'>+    GF_FREE(md);</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+br_object_sign_softerror(int32_t op_errno)</div><div class='add'>+{</div><div class='add'>+    return ((op_errno == ENOENT) || (op_errno == ESTALE) ||</div><div class='add'>+            (op_errno == ENODATA));</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+br_log_object(xlator_t *this, char *op, uuid_t gfid, int32_t op_errno)</div><div class='add'>+{</div><div class='add'>+    int softerror = br_object_sign_softerror(op_errno);</div><div class='add'>+    if (softerror) {</div><div class='add'>+        gf_msg_debug(this-&gt;name, 0,</div><div class='add'>+                     "%s() failed on object %s "</div><div class='add'>+                     "[reason: %s]",</div><div class='add'>+                     op, uuid_utoa(gfid), strerror(op_errno));</div><div class='add'>+    } else {</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_ERROR, op_errno, BRB_MSG_OP_FAILED, "op=%s",</div><div class='add'>+                op, "gfid=%s", uuid_utoa(gfid), NULL);</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+br_log_object_path(xlator_t *this, char *op, const char *path, int32_t op_errno)</div><div class='add'>+{</div><div class='add'>+    int softerror = br_object_sign_softerror(op_errno);</div><div class='add'>+    if (softerror) {</div><div class='add'>+        gf_msg_debug(this-&gt;name, 0,</div><div class='add'>+                     "%s() failed on object %s "</div><div class='add'>+                     "[reason: %s]",</div><div class='add'>+                     op, path, strerror(op_errno));</div><div class='add'>+    } else {</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_ERROR, op_errno, BRB_MSG_OP_FAILED, "op=%s",</div><div class='add'>+                op, "path=%s", path, NULL);</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+br_trigger_sign(xlator_t *this, br_child_t *child, inode_t *linked_inode,</div><div class='add'>+                loc_t *loc, gf_boolean_t need_reopen)</div><div class='add'>+{</div><div class='add'>+    fd_t *fd = NULL;</div><div class='add'>+    int32_t ret = -1;</div><div class='add'>+    uint32_t val = 0;</div><div class='add'>+    dict_t *dict = NULL;</div><div class='add'>+    pid_t pid = GF_CLIENT_PID_BITD;</div><div class='add'>+</div><div class='add'>+    syncopctx_setfspid(&amp;pid);</div><div class='add'>+</div><div class='add'>+    val = (need_reopen == _gf_true) ? BR_OBJECT_REOPEN : BR_OBJECT_RESIGN;</div><div class='add'>+</div><div class='add'>+    dict = dict_new();</div><div class='add'>+    if (!dict)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    ret = dict_set_uint32(dict, BR_REOPEN_SIGN_HINT_KEY, val);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto cleanup_dict;</div><div class='add'>+</div><div class='add'>+    ret = -1;</div><div class='add'>+    fd = fd_create(linked_inode, 0);</div><div class='add'>+    if (!fd) {</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_ERROR, 0, BRB_MSG_FD_CREATE_FAILED,</div><div class='add'>+                "gfid=%s", uuid_utoa(linked_inode-&gt;gfid), NULL);</div><div class='add'>+        goto cleanup_dict;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = syncop_open(child-&gt;xl, loc, O_RDWR, fd, NULL, NULL);</div><div class='add'>+    if (ret) {</div><div class='add'>+        br_log_object(this, "open", linked_inode-&gt;gfid, -ret);</div><div class='add'>+        goto unref_fd;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    fd_bind(fd);</div><div class='add'>+</div><div class='add'>+    ret = syncop_fsetxattr(child-&gt;xl, fd, dict, 0, NULL, NULL);</div><div class='add'>+    if (ret)</div><div class='add'>+        br_log_object(this, "fsetxattr", linked_inode-&gt;gfid, -ret);</div><div class='add'>+</div><div class='add'>+    /* passthough: fd_unref() */</div><div class='add'>+</div><div class='add'>+unref_fd:</div><div class='add'>+    fd_unref(fd);</div><div class='add'>+cleanup_dict:</div><div class='add'>+    dict_unref(dict);</div><div class='add'>+out:</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_WARNING, 0, BRB_MSG_TRIGGER_SIGN_FAILED,</div><div class='add'>+                "gfid=%s", uuid_utoa(linked_inode-&gt;gfid), "reopen-hint-val=%d",</div><div class='add'>+                val, NULL);</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+br_object_resign(xlator_t *this, br_object_t *object, inode_t *linked_inode)</div><div class='add'>+{</div><div class='add'>+    loc_t loc = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    loc.inode = inode_ref(linked_inode);</div><div class='add'>+    gf_uuid_copy(loc.gfid, linked_inode-&gt;gfid);</div><div class='add'>+</div><div class='add'>+    br_trigger_sign(this, object-&gt;child, linked_inode, &amp;loc, _gf_false);</div><div class='add'>+</div><div class='add'>+    loc_wipe(&amp;loc);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/**</div><div class='add'>+ * Sign a given object. This routine runs full throttle. There needs to be</div><div class='add'>+ * some form of priority scheduling and/or read burstness to avoid starving</div><div class='add'>+ * (or kicking) client I/O's.</div><div class='add'>+ */</div><div class='add'>+static int32_t</div><div class='add'>+br_sign_object(br_object_t *object)</div><div class='add'>+{</div><div class='add'>+    int32_t ret = -1;</div><div class='add'>+    inode_t *linked_inode = NULL;</div><div class='add'>+    xlator_t *this = NULL;</div><div class='add'>+    fd_t *fd = NULL;</div><div class='add'>+    struct iatt iatt = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    pid_t pid = GF_CLIENT_PID_BITD;</div><div class='add'>+    br_sign_state_t sign_info = BR_SIGN_NORMAL;</div><div class='add'>+</div><div class='add'>+    GF_VALIDATE_OR_GOTO("bit-rot", object, out);</div><div class='add'>+</div><div class='add'>+    this = object-&gt;this;</div><div class='add'>+</div><div class='add'>+    /**</div><div class='add'>+     * FIXME: This is required as signing an object is restricted to</div><div class='add'>+     * clients with special frame-&gt;root-&gt;pid. Change the way client</div><div class='add'>+     * pid is set.</div><div class='add'>+     */</div><div class='add'>+    syncopctx_setfspid(&amp;pid);</div><div class='add'>+</div><div class='add'>+    ret = br_object_lookup(this, object, &amp;iatt, &amp;linked_inode);</div><div class='add'>+    if (ret) {</div><div class='add'>+        br_log_object(this, "lookup", object-&gt;gfid, -ret);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /**</div><div class='add'>+     * For fd's that have notified for reopening, we send an explicit</div><div class='add'>+     * open() followed by a dummy write() call. This triggers the</div><div class='add'>+     * actual signing of the object.</div><div class='add'>+     */</div><div class='add'>+    sign_info = ntohl(object-&gt;sign_info);</div><div class='add'>+    if (sign_info == BR_SIGN_REOPEN_WAIT) {</div><div class='add'>+        br_object_resign(this, object, linked_inode);</div><div class='add'>+        goto unref_inode;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = br_object_open(this, object, linked_inode, &amp;fd);</div><div class='add'>+    if (!fd) {</div><div class='add'>+        br_log_object(this, "open", object-&gt;gfid, -ret);</div><div class='add'>+        goto unref_inode;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /**</div><div class='add'>+     * we have an open file descriptor on the object. from here on,</div><div class='add'>+     * do not be generous to file operation errors.</div><div class='add'>+     */</div><div class='add'>+    gf_msg_debug(this-&gt;name, 0, "Signing object [%s]",</div><div class='add'>+                 uuid_utoa(linked_inode-&gt;gfid));</div><div class='add'>+</div><div class='add'>+    ret = br_object_read_sign(linked_inode, fd, object, &amp;iatt);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_ERROR, 0, BRB_MSG_READ_AND_SIGN_FAILED,</div><div class='add'>+                "gfid=%s", uuid_utoa(linked_inode-&gt;gfid), NULL);</div><div class='add'>+        goto unref_fd;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+</div><div class='add'>+unref_fd:</div><div class='add'>+    fd_unref(fd);</div><div class='add'>+unref_inode:</div><div class='add'>+    inode_unref(linked_inode);</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static br_object_t *</div><div class='add'>+__br_pick_object(br_private_t *priv)</div><div class='add'>+{</div><div class='add'>+    br_object_t *object = NULL;</div><div class='add'>+</div><div class='add'>+    while (list_empty(&amp;priv-&gt;obj_queue-&gt;objects)) {</div><div class='add'>+        pthread_cond_wait(&amp;priv-&gt;object_cond, &amp;priv-&gt;lock);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    object = list_first_entry(&amp;priv-&gt;obj_queue-&gt;objects, br_object_t, list);</div><div class='add'>+    list_del_init(&amp;object-&gt;list);</div><div class='add'>+</div><div class='add'>+    return object;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/**</div><div class='add'>+ * This is the place where the signing of the objects is triggered.</div><div class='add'>+ */</div><div class='add'>+void *</div><div class='add'>+br_process_object(void *arg)</div><div class='add'>+{</div><div class='add'>+    xlator_t *this = NULL;</div><div class='add'>+    br_object_t *object = NULL;</div><div class='add'>+    br_private_t *priv = NULL;</div><div class='add'>+    int32_t ret = -1;</div><div class='add'>+</div><div class='add'>+    this = arg;</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    THIS = this;</div><div class='add'>+</div><div class='add'>+    for (;;) {</div><div class='add'>+        pthread_mutex_lock(&amp;priv-&gt;lock);</div><div class='add'>+        {</div><div class='add'>+            object = __br_pick_object(priv);</div><div class='add'>+        }</div><div class='add'>+        pthread_mutex_unlock(&amp;priv-&gt;lock);</div><div class='add'>+</div><div class='add'>+        ret = br_sign_object(object);</div><div class='add'>+        if (ret &amp;&amp; !br_object_sign_softerror(-ret))</div><div class='add'>+            gf_smsg(this-&gt;name, GF_LOG_ERROR, 0, BRB_MSG_SET_SIGN_FAILED,</div><div class='add'>+                    "gfid=%s", uuid_utoa(object-&gt;gfid), NULL);</div><div class='add'>+        GF_FREE(object);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return NULL;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/**</div><div class='add'>+ * This function gets kicked in once the object is expired from the</div><div class='add'>+ * timer wheel. This actually adds the object received via notification</div><div class='add'>+ * from the changelog to the queue from where the objects gets picked</div><div class='add'>+ * up for signing.</div><div class='add'>+ *</div><div class='add'>+ * This routine can be made lightweight by introducing an alternate</div><div class='add'>+ * timer-wheel API that dispatches _all_ expired objects in one-shot</div><div class='add'>+ * rather than an object at-a-time. This routine can then just simply</div><div class='add'>+ * be a call to list_splice_tail().</div><div class='add'>+ *</div><div class='add'>+ * NOTE: use call_time to instrument signing time in br_sign_object().</div><div class='add'>+ */</div><div class='add'>+void</div><div class='add'>+br_add_object_to_queue(struct gf_tw_timer_list *timer, void *data,</div><div class='add'>+                       unsigned long call_time)</div><div class='add'>+{</div><div class='add'>+    br_object_t *object = NULL;</div><div class='add'>+    xlator_t *this = NULL;</div><div class='add'>+    br_private_t *priv = NULL;</div><div class='add'>+</div><div class='add'>+    object = data;</div><div class='add'>+    this = object-&gt;this;</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    THIS = this;</div><div class='add'>+</div><div class='add'>+    pthread_mutex_lock(&amp;priv-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        list_add_tail(&amp;object-&gt;list, &amp;priv-&gt;obj_queue-&gt;objects);</div><div class='add'>+        pthread_cond_broadcast(&amp;priv-&gt;object_cond);</div><div class='add'>+    }</div><div class='add'>+    pthread_mutex_unlock(&amp;priv-&gt;lock);</div><div class='add'>+</div><div class='add'>+    if (timer)</div><div class='add'>+        mem_put(timer);</div><div class='add'>+    return;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static br_object_t *</div><div class='add'>+br_initialize_object(xlator_t *this, br_child_t *child, changelog_event_t *ev)</div><div class='add'>+{</div><div class='add'>+    br_object_t *object = NULL;</div><div class='add'>+</div><div class='add'>+    object = GF_CALLOC(1, sizeof(*object), gf_br_mt_br_object_t);</div><div class='add'>+    if (!object)</div><div class='add'>+        goto out;</div><div class='add'>+    INIT_LIST_HEAD(&amp;object-&gt;list);</div><div class='add'>+</div><div class='add'>+    object-&gt;this = this;</div><div class='add'>+    object-&gt;child = child;</div><div class='add'>+    gf_uuid_copy(object-&gt;gfid, ev-&gt;u.releasebr.gfid);</div><div class='add'>+</div><div class='add'>+    /* NOTE: it's BE, but no worry */</div><div class='add'>+    object-&gt;signedversion = ev-&gt;u.releasebr.version;</div><div class='add'>+    object-&gt;sign_info = ev-&gt;u.releasebr.sign_info;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return object;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static struct gf_tw_timer_list *</div><div class='add'>+br_initialize_timer(xlator_t *this, br_object_t *object, br_child_t *child,</div><div class='add'>+                    changelog_event_t *ev)</div><div class='add'>+{</div><div class='add'>+    br_private_t *priv = NULL;</div><div class='add'>+    struct gf_tw_timer_list *timer = NULL;</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    timer = mem_get0(child-&gt;timer_pool);</div><div class='add'>+    if (!timer)</div><div class='add'>+        goto out;</div><div class='add'>+    INIT_LIST_HEAD(&amp;timer-&gt;entry);</div><div class='add'>+</div><div class='add'>+    timer-&gt;expires = priv-&gt;expiry_time;</div><div class='add'>+    if (!timer-&gt;expires)</div><div class='add'>+        timer-&gt;expires = 1;</div><div class='add'>+</div><div class='add'>+    timer-&gt;data = object;</div><div class='add'>+    timer-&gt;function = br_add_object_to_queue;</div><div class='add'>+    gf_tw_add_timer(priv-&gt;timer_wheel, timer);</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return timer;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int32_t</div><div class='add'>+br_schedule_object_reopen(xlator_t *this, br_object_t *object,</div><div class='add'>+                          br_child_t *child, changelog_event_t *ev)</div><div class='add'>+{</div><div class='add'>+    struct gf_tw_timer_list *timer = NULL;</div><div class='add'>+</div><div class='add'>+    timer = br_initialize_timer(this, object, child, ev);</div><div class='add'>+    if (!timer)</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_ERROR, 0, BRB_MSG_SET_TIMER_FAILED,</div><div class='add'>+                "gfid=%s", uuid_utoa(object-&gt;gfid), NULL);</div><div class='add'>+    return timer ? 0 : -1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int32_t</div><div class='add'>+br_object_quicksign(xlator_t *this, br_object_t *object)</div><div class='add'>+{</div><div class='add'>+    br_add_object_to_queue(NULL, object, 0ULL);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/**</div><div class='add'>+ * This callback function registered with the changelog is executed</div><div class='add'>+ * whenever a notification from the changelog is received. This should</div><div class='add'>+ * add the object (or the gfid) on which the notification has come to</div><div class='add'>+ * the timer-wheel with some expiry time.</div><div class='add'>+ *</div><div class='add'>+ * TODO: use mem-pool for allocations and maybe allocate timer and</div><div class='add'>+ * object as a single alloc and bifurcate their respective pointers.</div><div class='add'>+ */</div><div class='add'>+void</div><div class='add'>+br_brick_callback(void *xl, char *brick, void *data, changelog_event_t *ev)</div><div class='add'>+{</div><div class='add'>+    int32_t ret = 0;</div><div class='add'>+    uuid_t gfid = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    xlator_t *this = NULL;</div><div class='add'>+    br_object_t *object = NULL;</div><div class='add'>+    br_child_t *child = NULL;</div><div class='add'>+    br_sign_state_t sign_info = BR_SIGN_INVALID;</div><div class='add'>+</div><div class='add'>+    this = xl;</div><div class='add'>+</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, ev, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("bit-rot", this, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, this-&gt;private, out);</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(ev-&gt;ev_type == CHANGELOG_OP_TYPE_BR_RELEASE);</div><div class='add'>+    GF_ASSERT(!gf_uuid_is_null(ev-&gt;u.releasebr.gfid));</div><div class='add'>+</div><div class='add'>+    gf_uuid_copy(gfid, ev-&gt;u.releasebr.gfid);</div><div class='add'>+</div><div class='add'>+    gf_msg_debug(this-&gt;name, 0, "RELEASE EVENT [GFID %s]", uuid_utoa(gfid));</div><div class='add'>+</div><div class='add'>+    child = br_get_child_from_brick_path(this, brick);</div><div class='add'>+    if (!child) {</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_ERROR, 0, BRB_MSG_GET_SUBVOL_FAILED,</div><div class='add'>+                "brick=%s", brick, NULL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    object = br_initialize_object(this, child, ev);</div><div class='add'>+    if (!object) {</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_ERROR, ENOMEM, BRB_MSG_NO_MEMORY,</div><div class='add'>+                "object-gfid=%s", uuid_utoa(gfid), NULL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* sanity check */</div><div class='add'>+    sign_info = ntohl(object-&gt;sign_info);</div><div class='add'>+    GF_ASSERT(sign_info != BR_SIGN_NORMAL);</div><div class='add'>+</div><div class='add'>+    if (sign_info == BR_SIGN_REOPEN_WAIT)</div><div class='add'>+        ret = br_schedule_object_reopen(this, object, child, ev);</div><div class='add'>+    else</div><div class='add'>+        ret = br_object_quicksign(this, object);</div><div class='add'>+</div><div class='add'>+    if (ret)</div><div class='add'>+        goto free_object;</div><div class='add'>+</div><div class='add'>+    gf_msg_debug(this-&gt;name, 0, "-&gt;callback: brick [%s], type [%d]\n", brick,</div><div class='add'>+                 ev-&gt;ev_type);</div><div class='add'>+    return;</div><div class='add'>+</div><div class='add'>+free_object:</div><div class='add'>+    GF_FREE(object);</div><div class='add'>+out:</div><div class='add'>+    return;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+br_fill_brick_spec(struct gf_brick_spec *brick, char *path)</div><div class='add'>+{</div><div class='add'>+    brick-&gt;brick_path = gf_strdup(path);</div><div class='add'>+    brick-&gt;filter = CHANGELOG_OP_TYPE_BR_RELEASE;</div><div class='add'>+</div><div class='add'>+    brick-&gt;init = br_brick_init;</div><div class='add'>+    brick-&gt;fini = br_brick_fini;</div><div class='add'>+    brick-&gt;callback = br_brick_callback;</div><div class='add'>+    brick-&gt;connected = NULL;</div><div class='add'>+    brick-&gt;disconnected = NULL;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static gf_boolean_t</div><div class='add'>+br_check_object_need_sign(xlator_t *this, dict_t *xattr, br_child_t *child)</div><div class='add'>+{</div><div class='add'>+    int32_t ret = -1;</div><div class='add'>+    gf_boolean_t need_sign = _gf_false;</div><div class='add'>+    br_isignature_out_t *sign = NULL;</div><div class='add'>+</div><div class='add'>+    GF_VALIDATE_OR_GOTO("bit-rot", this, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, xattr, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, child, out);</div><div class='add'>+</div><div class='add'>+    ret = dict_get_ptr(xattr, GLUSTERFS_GET_OBJECT_SIGNATURE, (void **)&amp;sign);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_ERROR, 0, BRB_MSG_GET_SIGN_FAILED,</div><div class='add'>+                "object-info", NULL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Object has been opened and hence dirty. Do not sign it */</div><div class='add'>+    if (sign-&gt;stale)</div><div class='add'>+        need_sign = _gf_true;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return need_sign;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+br_prepare_loc(xlator_t *this, br_child_t *child, loc_t *parent,</div><div class='add'>+               gf_dirent_t *entry, loc_t *loc)</div><div class='add'>+{</div><div class='add'>+    int32_t ret = -1;</div><div class='add'>+    inode_t *inode = NULL;</div><div class='add'>+</div><div class='add'>+    inode = inode_grep(child-&gt;table, parent-&gt;inode, entry-&gt;d_name);</div><div class='add'>+    if (!inode)</div><div class='add'>+        loc-&gt;inode = inode_new(child-&gt;table);</div><div class='add'>+    else {</div><div class='add'>+        loc-&gt;inode = inode;</div><div class='add'>+        if (loc-&gt;inode-&gt;ia_type != IA_IFREG) {</div><div class='add'>+            gf_msg_debug(this-&gt;name, 0,</div><div class='add'>+                         "%s is not a regular "</div><div class='add'>+                         "file",</div><div class='add'>+                         entry-&gt;d_name);</div><div class='add'>+            ret = 0;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    loc-&gt;parent = inode_ref(parent-&gt;inode);</div><div class='add'>+    gf_uuid_copy(loc-&gt;pargfid, parent-&gt;inode-&gt;gfid);</div><div class='add'>+</div><div class='add'>+    ret = inode_path(parent-&gt;inode, entry-&gt;d_name, (char **)&amp;loc-&gt;path);</div><div class='add'>+    if (ret &lt; 0 || !loc-&gt;path) {</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_ERROR, 0, BRB_MSG_PATH_FAILED,</div><div class='add'>+                "inode_path=%s", entry-&gt;d_name, "parent-gfid=%s",</div><div class='add'>+                uuid_utoa(parent-&gt;inode-&gt;gfid), NULL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    loc-&gt;name = strrchr(loc-&gt;path, '/');</div><div class='add'>+    if (loc-&gt;name)</div><div class='add'>+        loc-&gt;name++;</div><div class='add'>+</div><div class='add'>+    ret = 1;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/**</div><div class='add'>+ * Oneshot crawler</div><div class='add'>+ * ---------------</div><div class='add'>+ * This is a catchup mechanism. Objects that remained unsigned from the</div><div class='add'>+ * last run for whatever reason (node crashes, reboots, etc..) become</div><div class='add'>+ * candidates for signing. This allows the signature to "catch up" with</div><div class='add'>+ * the current state of the object. Triggering signing is easy: perform</div><div class='add'>+ * an open() followed by a close() thereby resulting in call boomerang.</div><div class='add'>+ * (though not back to itself :))</div><div class='add'>+ */</div><div class='add'>+int</div><div class='add'>+bitd_oneshot_crawl(xlator_t *subvol, gf_dirent_t *entry, loc_t *parent,</div><div class='add'>+                   void *data)</div><div class='add'>+{</div><div class='add'>+    int op_errno = 0;</div><div class='add'>+    br_child_t *child = NULL;</div><div class='add'>+    xlator_t *this = NULL;</div><div class='add'>+    loc_t loc = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    struct iatt iatt = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    struct iatt parent_buf = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    dict_t *xattr = NULL;</div><div class='add'>+    int32_t ret = -1;</div><div class='add'>+    inode_t *linked_inode = NULL;</div><div class='add'>+    gf_boolean_t need_signing = _gf_false;</div><div class='add'>+    gf_boolean_t need_reopen = _gf_true;</div><div class='add'>+</div><div class='add'>+    GF_VALIDATE_OR_GOTO("bit-rot", subvol, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO("bit-rot", data, out);</div><div class='add'>+</div><div class='add'>+    child = data;</div><div class='add'>+    this = child-&gt;this;</div><div class='add'>+</div><div class='add'>+    ret = br_prepare_loc(this, child, parent, entry, &amp;loc);</div><div class='add'>+    if (!ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    ret = syncop_lookup(child-&gt;xl, &amp;loc, &amp;iatt, &amp;parent_buf, NULL, NULL);</div><div class='add'>+    if (ret) {</div><div class='add'>+        br_log_object_path(this, "lookup", loc.path, -ret);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    linked_inode = inode_link(loc.inode, parent-&gt;inode, loc.name, &amp;iatt);</div><div class='add'>+    if (linked_inode)</div><div class='add'>+        inode_lookup(linked_inode);</div><div class='add'>+</div><div class='add'>+    if (iatt.ia_type != IA_IFREG) {</div><div class='add'>+        gf_msg_debug(this-&gt;name, 0,</div><div class='add'>+                     "%s is not a regular file, "</div><div class='add'>+                     "skipping..",</div><div class='add'>+                     entry-&gt;d_name);</div><div class='add'>+        ret = 0;</div><div class='add'>+        goto unref_inode;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /**</div><div class='add'>+     * As of now, 2 cases  are possible and handled.</div><div class='add'>+     * 1) GlusterFS is upgraded from a previous version which does not</div><div class='add'>+     *    have any idea about bit-rot and have data in the filesystem.</div><div class='add'>+     *    In this case syncop_getxattr fails with ENODATA and the object</div><div class='add'>+     *    is signed. (In real, when crawler sends lookup, bit-rot-stub</div><div class='add'>+     *    creates the xattrs before returning lookup reply)</div><div class='add'>+     * 2) Bit-rot was not enabled or BitD was does for some reasons, during</div><div class='add'>+     *    which some files were created, but since BitD was down, were not</div><div class='add'>+     *    signed.</div><div class='add'>+     * If the file was just created and was being written some data when</div><div class='add'>+     * the down BitD came up, then bit-rot stub should be intelligent to</div><div class='add'>+     * identify this case (by comparing the ongoing version or by checking</div><div class='add'>+     * if there are any fds present for that inode) and handle properly.</div><div class='add'>+     */</div><div class='add'>+</div><div class='add'>+    if (bitd_is_bad_file(this, child, &amp;loc, NULL)) {</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_WARNING, 0, BRB_MSG_SKIP_OBJECT, "path=%s",</div><div class='add'>+                loc.path, NULL);</div><div class='add'>+        goto unref_inode;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = syncop_getxattr(child-&gt;xl, &amp;loc, &amp;xattr,</div><div class='add'>+                          GLUSTERFS_GET_OBJECT_SIGNATURE, NULL, NULL);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        op_errno = -ret;</div><div class='add'>+        br_log_object(this, "getxattr", linked_inode-&gt;gfid, op_errno);</div><div class='add'>+</div><div class='add'>+        /**</div><div class='add'>+         * No need to sign the zero byte objects as the signing</div><div class='add'>+         * happens upon first modification of the object.</div><div class='add'>+         */</div><div class='add'>+        if (op_errno == ENODATA &amp;&amp; (iatt.ia_size != 0))</div><div class='add'>+            need_signing = _gf_true;</div><div class='add'>+        if (op_errno == EINVAL)</div><div class='add'>+            gf_smsg(this-&gt;name, GF_LOG_WARNING, 0,</div><div class='add'>+                    BRB_MSG_PARTIAL_VERSION_PRESENCE, "gfid=%s",</div><div class='add'>+                    uuid_utoa(linked_inode-&gt;gfid), NULL);</div><div class='add'>+    } else {</div><div class='add'>+        need_signing = br_check_object_need_sign(this, xattr, child);</div><div class='add'>+</div><div class='add'>+        /*</div><div class='add'>+         * If we are here means, bitrot daemon has started. Is it just</div><div class='add'>+         * a simple restart of the daemon or is it started because the</div><div class='add'>+         * feature is enabled is something hard to determine. Hence,</div><div class='add'>+         * if need_signing is false (because bit-rot version and signature</div><div class='add'>+         * are present), then still go ahead and sign it.</div><div class='add'>+         */</div><div class='add'>+        if (!need_signing) {</div><div class='add'>+            need_signing = _gf_true;</div><div class='add'>+            need_reopen = _gf_true;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (!need_signing)</div><div class='add'>+        goto unref_dict;</div><div class='add'>+</div><div class='add'>+    gf_smsg(this-&gt;name, GF_LOG_INFO, 0, BRB_MSG_TRIGGER_SIGN, "path=%s",</div><div class='add'>+            loc.path, "gfid=%s", uuid_utoa(linked_inode-&gt;gfid), "Brick-path=%s",</div><div class='add'>+            child-&gt;brick_path, NULL);</div><div class='add'>+    br_trigger_sign(this, child, linked_inode, &amp;loc, need_reopen);</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+</div><div class='add'>+unref_dict:</div><div class='add'>+    if (xattr)</div><div class='add'>+        dict_unref(xattr);</div><div class='add'>+unref_inode:</div><div class='add'>+    inode_unref(linked_inode);</div><div class='add'>+out:</div><div class='add'>+    loc_wipe(&amp;loc);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#define BR_CRAWL_THROTTLE_COUNT 50</div><div class='add'>+#define BR_CRAWL_THROTTLE_ZZZ 5</div><div class='add'>+</div><div class='add'>+void *</div><div class='add'>+br_oneshot_signer(void *arg)</div><div class='add'>+{</div><div class='add'>+    loc_t loc = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    xlator_t *this = NULL;</div><div class='add'>+    br_child_t *child = NULL;</div><div class='add'>+</div><div class='add'>+    child = arg;</div><div class='add'>+    this = child-&gt;this;</div><div class='add'>+</div><div class='add'>+    THIS = this;</div><div class='add'>+</div><div class='add'>+    gf_smsg(this-&gt;name, GF_LOG_INFO, 0, BRB_MSG_CRAWLING_START, "brick-path=%s",</div><div class='add'>+            child-&gt;brick_path, NULL);</div><div class='add'>+</div><div class='add'>+    loc.inode = child-&gt;table-&gt;root;</div><div class='add'>+    (void)syncop_ftw_throttle(child-&gt;xl, &amp;loc, GF_CLIENT_PID_BITD, child,</div><div class='add'>+                              bitd_oneshot_crawl, BR_CRAWL_THROTTLE_COUNT,</div><div class='add'>+                              BR_CRAWL_THROTTLE_ZZZ);</div><div class='add'>+</div><div class='add'>+    gf_smsg(this-&gt;name, GF_LOG_INFO, 0, BRB_MSG_CRAWLING_FINISH,</div><div class='add'>+            "brick-path=%s", child-&gt;brick_path, NULL);</div><div class='add'>+</div><div class='add'>+    return NULL;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+br_set_child_state(br_child_t *child, br_child_state_t state)</div><div class='add'>+{</div><div class='add'>+    pthread_mutex_lock(&amp;child-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        _br_set_child_state(child, state);</div><div class='add'>+    }</div><div class='add'>+    pthread_mutex_unlock(&amp;child-&gt;lock);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/**</div><div class='add'>+ * At this point a thread is spawned to crawl the filesystem (in</div><div class='add'>+ * tortoise pace) to sign objects that were not signed in previous run(s).</div><div class='add'>+ * Such objects are identified by examining it's dirtyness and timestamp.</div><div class='add'>+ *</div><div class='add'>+ *    pick object:</div><div class='add'>+ *       signature_is_stale() &amp;&amp; (object_timestamp() &lt;= stub_init_time())</div><div class='add'>+ *</div><div class='add'>+ * Also, we register to the changelog library to subscribe for event</div><div class='add'>+ * notifications.</div><div class='add'>+ */</div><div class='add'>+static int32_t</div><div class='add'>+br_enact_signer(xlator_t *this, br_child_t *child, br_stub_init_t *stub)</div><div class='add'>+{</div><div class='add'>+    int32_t ret = 0;</div><div class='add'>+    br_private_t *priv = NULL;</div><div class='add'>+    struct gf_brick_spec *brick = NULL;</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    brick = GF_CALLOC(1, sizeof(struct gf_brick_spec),</div><div class='add'>+                      gf_common_mt_gf_brick_spec_t);</div><div class='add'>+    if (!brick)</div><div class='add'>+        goto error_return;</div><div class='add'>+</div><div class='add'>+    br_fill_brick_spec(brick, stub-&gt;export);</div><div class='add'>+    ret = gf_changelog_register_generic(brick, 1, 1,</div><div class='add'>+                                        this-&gt;ctx-&gt;cmd_args.log_file, -1, this);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_ERROR, errno, BRB_MSG_REGISTER_FAILED, NULL);</div><div class='add'>+        goto dealloc;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    child-&gt;threadrunning = 0;</div><div class='add'>+    ret = gf_thread_create(&amp;child-&gt;thread, NULL, br_oneshot_signer, child,</div><div class='add'>+                           "brosign");</div><div class='add'>+    if (ret)</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_WARNING, 0, BRB_MSG_SPAWN_FAILED,</div><div class='add'>+                "FS-crawler-thread", NULL);</div><div class='add'>+    else</div><div class='add'>+        child-&gt;threadrunning = 1;</div><div class='add'>+</div><div class='add'>+    /* it's OK to continue, "old" objects would be signed when modified */</div><div class='add'>+    list_add_tail(&amp;child-&gt;list, &amp;priv-&gt;signing);</div><div class='add'>+    return 0;</div><div class='add'>+</div><div class='add'>+dealloc:</div><div class='add'>+    GF_FREE(brick);</div><div class='add'>+error_return:</div><div class='add'>+    return -1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int32_t</div><div class='add'>+br_launch_scrubber(xlator_t *this, br_child_t *child, struct br_scanfs *fsscan,</div><div class='add'>+                   struct br_scrubber *fsscrub)</div><div class='add'>+{</div><div class='add'>+    int32_t ret = -1;</div><div class='add'>+    br_private_t *priv = NULL;</div><div class='add'>+    struct br_monitor *scrub_monitor = NULL;</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    scrub_monitor = &amp;priv-&gt;scrub_monitor;</div><div class='add'>+    ret = gf_thread_create(&amp;child-&gt;thread, NULL, br_fsscanner, child,</div><div class='add'>+                           "brfsscan");</div><div class='add'>+    if (ret != 0) {</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_ALERT, 0, BRB_MSG_SPAWN_FAILED,</div><div class='add'>+                "bitrot-scrubber-daemon Brick-path=%s", child-&gt;brick_path,</div><div class='add'>+                NULL);</div><div class='add'>+        goto error_return;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Signal monitor to kick off state machine*/</div><div class='add'>+    pthread_mutex_lock(&amp;scrub_monitor-&gt;mutex);</div><div class='add'>+    {</div><div class='add'>+        if (!scrub_monitor-&gt;inited)</div><div class='add'>+            pthread_cond_signal(&amp;scrub_monitor-&gt;cond);</div><div class='add'>+        scrub_monitor-&gt;inited = _gf_true;</div><div class='add'>+    }</div><div class='add'>+    pthread_mutex_unlock(&amp;scrub_monitor-&gt;mutex);</div><div class='add'>+</div><div class='add'>+    /**</div><div class='add'>+     * Everything has been setup.. add this subvolume to scrubbers</div><div class='add'>+     * list.</div><div class='add'>+     */</div><div class='add'>+    pthread_mutex_lock(&amp;fsscrub-&gt;mutex);</div><div class='add'>+    {</div><div class='add'>+        list_add_tail(&amp;child-&gt;list, &amp;fsscrub-&gt;scrublist);</div><div class='add'>+        pthread_cond_broadcast(&amp;fsscrub-&gt;cond);</div><div class='add'>+    }</div><div class='add'>+    pthread_mutex_unlock(&amp;fsscrub-&gt;mutex);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+</div><div class='add'>+error_return:</div><div class='add'>+    return -1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int32_t</div><div class='add'>+br_enact_scrubber(xlator_t *this, br_child_t *child)</div><div class='add'>+{</div><div class='add'>+    int32_t ret = 0;</div><div class='add'>+    br_private_t *priv = NULL;</div><div class='add'>+    struct br_scanfs *fsscan = NULL;</div><div class='add'>+    struct br_scrubber *fsscrub = NULL;</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    fsscan = &amp;child-&gt;fsscan;</div><div class='add'>+    fsscrub = &amp;priv-&gt;fsscrub;</div><div class='add'>+</div><div class='add'>+    /**</div><div class='add'>+     * if this child already witnesses a successful connection earlier</div><div class='add'>+     * there's no need to initialize mutexes, condvars, etc..</div><div class='add'>+     */</div><div class='add'>+    if (_br_child_witnessed_connection(child))</div><div class='add'>+        return br_launch_scrubber(this, child, fsscan, fsscrub);</div><div class='add'>+</div><div class='add'>+    LOCK_INIT(&amp;fsscan-&gt;entrylock);</div><div class='add'>+    pthread_mutex_init(&amp;fsscan-&gt;waitlock, NULL);</div><div class='add'>+    pthread_cond_init(&amp;fsscan-&gt;waitcond, NULL);</div><div class='add'>+</div><div class='add'>+    fsscan-&gt;entries = 0;</div><div class='add'>+    INIT_LIST_HEAD(&amp;fsscan-&gt;queued);</div><div class='add'>+    INIT_LIST_HEAD(&amp;fsscan-&gt;ready);</div><div class='add'>+</div><div class='add'>+    ret = br_launch_scrubber(this, child, fsscan, fsscrub);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto error_return;</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+</div><div class='add'>+error_return:</div><div class='add'>+    LOCK_DESTROY(&amp;fsscan-&gt;entrylock);</div><div class='add'>+    pthread_mutex_destroy(&amp;fsscan-&gt;waitlock);</div><div class='add'>+    pthread_cond_destroy(&amp;fsscan-&gt;waitcond);</div><div class='add'>+</div><div class='add'>+    return -1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int32_t</div><div class='add'>+br_child_enaction(xlator_t *this, br_child_t *child, br_stub_init_t *stub)</div><div class='add'>+{</div><div class='add'>+    int32_t ret = -1;</div><div class='add'>+    br_private_t *priv = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    pthread_mutex_lock(&amp;child-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        if (priv-&gt;iamscrubber)</div><div class='add'>+            ret = br_enact_scrubber(this, child);</div><div class='add'>+        else</div><div class='add'>+            ret = br_enact_signer(this, child, stub);</div><div class='add'>+</div><div class='add'>+        if (!ret) {</div><div class='add'>+            child-&gt;witnessed = 1;</div><div class='add'>+            _br_set_child_state(child, BR_CHILD_STATE_CONNECTED);</div><div class='add'>+            gf_smsg(this-&gt;name, GF_LOG_INFO, 0, BRB_MSG_CONNECTED_TO_BRICK,</div><div class='add'>+                    "brick-path=%s", child-&gt;brick_path, NULL);</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    pthread_mutex_unlock(&amp;child-&gt;lock);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/**</div><div class='add'>+ * This routine fetches various attributes associated with a child which</div><div class='add'>+ * is basically a subvolume. Attributes include brick path and the stub</div><div class='add'>+ * birth time. This is done by performing a lookup on the root followed</div><div class='add'>+ * by getxattr() on a virtual key. Depending on the configuration, the</div><div class='add'>+ * process either acts as a signer or a scrubber.</div><div class='add'>+ */</div><div class='add'>+int32_t</div><div class='add'>+br_brick_connect(xlator_t *this, br_child_t *child)</div><div class='add'>+{</div><div class='add'>+    int32_t ret = -1;</div><div class='add'>+    loc_t loc = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    struct iatt buf = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    struct iatt parent = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    br_stub_init_t *stub = NULL;</div><div class='add'>+    dict_t *xattr = NULL;</div><div class='add'>+    int op_errno = 0;</div><div class='add'>+</div><div class='add'>+    GF_VALIDATE_OR_GOTO("bit-rot", this, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, child, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, this-&gt;private, out);</div><div class='add'>+</div><div class='add'>+    br_child_set_scrub_state(child, _gf_false);</div><div class='add'>+    br_set_child_state(child, BR_CHILD_STATE_INITIALIZING);</div><div class='add'>+</div><div class='add'>+    loc.inode = inode_ref(child-&gt;table-&gt;root);</div><div class='add'>+    gf_uuid_copy(loc.gfid, loc.inode-&gt;gfid);</div><div class='add'>+    loc.path = gf_strdup("/");</div><div class='add'>+</div><div class='add'>+    ret = syncop_lookup(child-&gt;xl, &amp;loc, &amp;buf, &amp;parent, NULL, NULL);</div><div class='add'>+    if (ret) {</div><div class='add'>+        op_errno = -ret;</div><div class='add'>+        ret = -1;</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_ERROR, op_errno, BRB_MSG_LOOKUP_FAILED,</div><div class='add'>+                NULL);</div><div class='add'>+        goto wipeloc;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = syncop_getxattr(child-&gt;xl, &amp;loc, &amp;xattr,</div><div class='add'>+                          GLUSTERFS_GET_BR_STUB_INIT_TIME, NULL, NULL);</div><div class='add'>+    if (ret) {</div><div class='add'>+        op_errno = -ret;</div><div class='add'>+        ret = -1;</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_ERROR, op_errno, BRB_MSG_GET_INFO_FAILED,</div><div class='add'>+                NULL);</div><div class='add'>+        goto wipeloc;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_get_ptr(xattr, GLUSTERFS_GET_BR_STUB_INIT_TIME, (void **)&amp;stub);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_ERROR, 0, BRB_MSG_GET_INFO_FAILED, NULL);</div><div class='add'>+        goto free_dict;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    memcpy(child-&gt;brick_path, stub-&gt;export, strlen(stub-&gt;export) + 1);</div><div class='add'>+    child-&gt;tv.tv_sec = ntohl(stub-&gt;timebuf[0]);</div><div class='add'>+    child-&gt;tv.tv_usec = ntohl(stub-&gt;timebuf[1]);</div><div class='add'>+</div><div class='add'>+    ret = br_child_enaction(this, child, stub);</div><div class='add'>+</div><div class='add'>+free_dict:</div><div class='add'>+    dict_unref(xattr);</div><div class='add'>+wipeloc:</div><div class='add'>+    loc_wipe(&amp;loc);</div><div class='add'>+out:</div><div class='add'>+    if (ret)</div><div class='add'>+        br_set_child_state(child, BR_CHILD_STATE_CONNFAILED);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* TODO: cleanup signer */</div><div class='add'>+static int32_t</div><div class='add'>+br_cleanup_signer(xlator_t *this, br_child_t *child)</div><div class='add'>+{</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int32_t</div><div class='add'>+br_cleanup_scrubber(xlator_t *this, br_child_t *child)</div><div class='add'>+{</div><div class='add'>+    int32_t ret = 0;</div><div class='add'>+    br_private_t *priv = NULL;</div><div class='add'>+    struct br_scrubber *fsscrub = NULL;</div><div class='add'>+    struct br_monitor *scrub_monitor = NULL;</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+    fsscrub = &amp;priv-&gt;fsscrub;</div><div class='add'>+    scrub_monitor = &amp;priv-&gt;scrub_monitor;</div><div class='add'>+</div><div class='add'>+    if (_br_is_child_scrub_active(child)) {</div><div class='add'>+        scrub_monitor-&gt;active_child_count--;</div><div class='add'>+        br_child_set_scrub_state(child, _gf_false);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /**</div><div class='add'>+     * 0x0: child (brick) goes out of rotation</div><div class='add'>+     *</div><div class='add'>+     * This is fully safe w.r.t. entries for this child being actively</div><div class='add'>+     * scrubbed. Each of the scrubber thread(s) would finish scrubbing</div><div class='add'>+     * the entry (probably failing due to disconnection) and either</div><div class='add'>+     * putting the entry back into the queue or continuing further.</div><div class='add'>+     * Either way, pending entries for this child's queue need not be</div><div class='add'>+     * drained; entries just sit there in the queued/ready list to be</div><div class='add'>+     * consumed later upon re-connection.</div><div class='add'>+     */</div><div class='add'>+    pthread_mutex_lock(&amp;fsscrub-&gt;mutex);</div><div class='add'>+    {</div><div class='add'>+        list_del_init(&amp;child-&gt;list);</div><div class='add'>+    }</div><div class='add'>+    pthread_mutex_unlock(&amp;fsscrub-&gt;mutex);</div><div class='add'>+</div><div class='add'>+    /**</div><div class='add'>+     * 0x1: cleanup scanner thread</div><div class='add'>+     *</div><div class='add'>+     * The pending timer needs to be removed _after_ cleaning up the</div><div class='add'>+     * filesystem scanner (scheduling the next scrub time is not a</div><div class='add'>+     * cancellation point).</div><div class='add'>+     */</div><div class='add'>+    ret = gf_thread_cleanup_xint(child-&gt;thread);</div><div class='add'>+    if (ret)</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_INFO, 0, BRB_MSG_SCRUB_THREAD_CLEANUP, NULL);</div><div class='add'>+</div><div class='add'>+    gf_smsg(this-&gt;name, GF_LOG_INFO, 0, BRB_MSG_SCRUBBER_CLEANED,</div><div class='add'>+            "brick-path=%s", child-&gt;brick_path, NULL);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/**</div><div class='add'>+ * OK.. this child has made it's mind to go down the drain. So,</div><div class='add'>+ * let's clean up what it touched. (NOTE: there's no need to clean</div><div class='add'>+ * the inode table, it's just reused taking care of stale inodes)</div><div class='add'>+ */</div><div class='add'>+int32_t</div><div class='add'>+br_brick_disconnect(xlator_t *this, br_child_t *child)</div><div class='add'>+{</div><div class='add'>+    int32_t ret = 0;</div><div class='add'>+    struct br_monitor *scrub_monitor = NULL;</div><div class='add'>+    br_private_t *priv = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    scrub_monitor = &amp;priv-&gt;scrub_monitor;</div><div class='add'>+</div><div class='add'>+    /* Lock order should be wakelock and then child lock to</div><div class='add'>+     * dead locks.</div><div class='add'>+     */</div><div class='add'>+    pthread_mutex_lock(&amp;scrub_monitor-&gt;wakelock);</div><div class='add'>+    {</div><div class='add'>+        pthread_mutex_lock(&amp;child-&gt;lock);</div><div class='add'>+        {</div><div class='add'>+            if (!_br_is_child_connected(child))</div><div class='add'>+                goto unblock;</div><div class='add'>+</div><div class='add'>+            /* child is on death row.. */</div><div class='add'>+            _br_set_child_state(child, BR_CHILD_STATE_DISCONNECTED);</div><div class='add'>+</div><div class='add'>+            if (priv-&gt;iamscrubber)</div><div class='add'>+                ret = br_cleanup_scrubber(this, child);</div><div class='add'>+            else</div><div class='add'>+                ret = br_cleanup_signer(this, child);</div><div class='add'>+        }</div><div class='add'>+    unblock:</div><div class='add'>+        pthread_mutex_unlock(&amp;child-&gt;lock);</div><div class='add'>+    }</div><div class='add'>+    pthread_mutex_unlock(&amp;scrub_monitor-&gt;wakelock);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/**</div><div class='add'>+ * This function is executed in a separate thread. The thread gets the</div><div class='add'>+ * brick from where CHILD_UP has received from the queue and gets the</div><div class='add'>+ * information regarding that brick (such as brick path).</div><div class='add'>+ */</div><div class='add'>+void *</div><div class='add'>+br_handle_events(void *arg)</div><div class='add'>+{</div><div class='add'>+    int32_t ret = 0;</div><div class='add'>+    xlator_t *this = NULL;</div><div class='add'>+    br_private_t *priv = NULL;</div><div class='add'>+    br_child_t *child = NULL;</div><div class='add'>+    struct br_child_event *childev = NULL;</div><div class='add'>+</div><div class='add'>+    this = arg;</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    /*</div><div class='add'>+     * Since, this is the topmost xlator, THIS has to be set by bit-rot</div><div class='add'>+     * xlator itself (STACK_WIND won't help in this case). Also it has</div><div class='add'>+     * to be done for each thread that gets spawned. Otherwise, a new</div><div class='add'>+     * thread will get global_xlator's pointer when it does "THIS".</div><div class='add'>+     */</div><div class='add'>+    THIS = this;</div><div class='add'>+</div><div class='add'>+    while (1) {</div><div class='add'>+        pthread_mutex_lock(&amp;priv-&gt;lock);</div><div class='add'>+        {</div><div class='add'>+            while (list_empty(&amp;priv-&gt;bricks))</div><div class='add'>+                pthread_cond_wait(&amp;priv-&gt;cond, &amp;priv-&gt;lock);</div><div class='add'>+</div><div class='add'>+            childev = list_first_entry(&amp;priv-&gt;bricks, struct br_child_event,</div><div class='add'>+                                       list);</div><div class='add'>+            list_del_init(&amp;childev-&gt;list);</div><div class='add'>+        }</div><div class='add'>+        pthread_mutex_unlock(&amp;priv-&gt;lock);</div><div class='add'>+</div><div class='add'>+        child = childev-&gt;child;</div><div class='add'>+        ret = childev-&gt;call(this, child);</div><div class='add'>+        if (ret)</div><div class='add'>+            gf_smsg(this-&gt;name, GF_LOG_ERROR, 0, BRB_MSG_SUBVOL_CONNECT_FAILED,</div><div class='add'>+                    "name=%s", child-&gt;xl-&gt;name, NULL);</div><div class='add'>+        GF_FREE(childev);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return NULL;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+mem_acct_init(xlator_t *this)</div><div class='add'>+{</div><div class='add'>+    int32_t ret = -1;</div><div class='add'>+</div><div class='add'>+    if (!this)</div><div class='add'>+        return ret;</div><div class='add'>+</div><div class='add'>+    ret = xlator_mem_acct_init(this, gf_br_stub_mt_end + 1);</div><div class='add'>+</div><div class='add'>+    if (ret != 0) {</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_WARNING, 0, BRB_MSG_MEM_ACNT_FAILED, NULL);</div><div class='add'>+        return ret;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+_br_qchild_event(xlator_t *this, br_child_t *child, br_child_handler *call)</div><div class='add'>+{</div><div class='add'>+    br_private_t *priv = NULL;</div><div class='add'>+    struct br_child_event *childev = NULL;</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    childev = GF_CALLOC(1, sizeof(*childev), gf_br_mt_br_child_event_t);</div><div class='add'>+    if (!childev) {</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_ERROR, ENOMEM, BRB_MSG_EVENT_UNHANDLED,</div><div class='add'>+                "Brick-name=%s", child-&gt;xl-&gt;name, NULL);</div><div class='add'>+        return;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    INIT_LIST_HEAD(&amp;childev-&gt;list);</div><div class='add'>+    childev-&gt;this = this;</div><div class='add'>+    childev-&gt;child = child;</div><div class='add'>+    childev-&gt;call = call;</div><div class='add'>+</div><div class='add'>+    list_add_tail(&amp;childev-&gt;list, &amp;priv-&gt;bricks);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+br_scrubber_status_get(xlator_t *this, dict_t **dict)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    br_private_t *priv = NULL;</div><div class='add'>+    struct br_scrub_stats *scrub_stats = NULL;</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    GF_VALIDATE_OR_GOTO("bit-rot", priv, out);</div><div class='add'>+</div><div class='add'>+    scrub_stats = &amp;priv-&gt;scrub_stat;</div><div class='add'>+</div><div class='add'>+    ret = br_get_bad_objects_list(this, dict);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_msg_debug(this-&gt;name, 0,</div><div class='add'>+                     "Failed to collect corrupt "</div><div class='add'>+                     "files");</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_set_int8(*dict, "scrub-running", scrub_stats-&gt;scrub_running);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_msg_debug(this-&gt;name, 0,</div><div class='add'>+                     "Failed setting scrub_running "</div><div class='add'>+                     "entry to the dictionary");</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_set_uint64(*dict, "scrubbed-files", scrub_stats-&gt;scrubbed_files);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_msg_debug(this-&gt;name, 0,</div><div class='add'>+                     "Failed to setting scrubbed file "</div><div class='add'>+                     "entry to the dictionary");</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_set_uint64(*dict, "unsigned-files", scrub_stats-&gt;unsigned_files);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_msg_debug(this-&gt;name, 0,</div><div class='add'>+                     "Failed to set unsigned file count"</div><div class='add'>+                     " entry to the dictionary");</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_set_uint64(*dict, "scrub-duration", scrub_stats-&gt;scrub_duration);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_msg_debug(this-&gt;name, 0,</div><div class='add'>+                     "Failed to set scrub duration"</div><div class='add'>+                     " entry to the dictionary");</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_set_dynstr_with_alloc(*dict, "last-scrub-time",</div><div class='add'>+                                     scrub_stats-&gt;last_scrub_time);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_msg_debug(this-&gt;name, 0,</div><div class='add'>+                     "Failed to set "</div><div class='add'>+                     "last scrub time value");</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+notify(xlator_t *this, int32_t event, void *data, ...)</div><div class='add'>+{</div><div class='add'>+    int idx = -1;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    xlator_t *subvol = NULL;</div><div class='add'>+    br_child_t *child = NULL;</div><div class='add'>+    br_private_t *priv = NULL;</div><div class='add'>+    dict_t *output = NULL;</div><div class='add'>+    va_list ap;</div><div class='add'>+    struct br_monitor *scrub_monitor = NULL;</div><div class='add'>+</div><div class='add'>+    subvol = (xlator_t *)data;</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+    scrub_monitor = &amp;priv-&gt;scrub_monitor;</div><div class='add'>+</div><div class='add'>+    gf_msg_trace(this-&gt;name, 0, "Notification received: %d", event);</div><div class='add'>+</div><div class='add'>+    idx = br_find_child_index(this, subvol);</div><div class='add'>+</div><div class='add'>+    switch (event) {</div><div class='add'>+        case GF_EVENT_CHILD_UP:</div><div class='add'>+            if (idx &lt; 0) {</div><div class='add'>+                gf_smsg(this-&gt;name, GF_LOG_ERROR, 0, BRB_MSG_INVALID_SUBVOL,</div><div class='add'>+                        "event=%d", event, NULL);</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            pthread_mutex_lock(&amp;priv-&gt;lock);</div><div class='add'>+            {</div><div class='add'>+                child = &amp;priv-&gt;children[idx];</div><div class='add'>+                if (child-&gt;child_up == 1)</div><div class='add'>+                    goto unblock_0;</div><div class='add'>+                priv-&gt;up_children++;</div><div class='add'>+</div><div class='add'>+                child-&gt;child_up = 1;</div><div class='add'>+                child-&gt;xl = subvol;</div><div class='add'>+                if (!child-&gt;table)</div><div class='add'>+                    child-&gt;table = inode_table_new(4096, subvol);</div><div class='add'>+</div><div class='add'>+                _br_qchild_event(this, child, br_brick_connect);</div><div class='add'>+                pthread_cond_signal(&amp;priv-&gt;cond);</div><div class='add'>+            }</div><div class='add'>+        unblock_0:</div><div class='add'>+            pthread_mutex_unlock(&amp;priv-&gt;lock);</div><div class='add'>+</div><div class='add'>+            if (priv-&gt;up_children == priv-&gt;child_count)</div><div class='add'>+                default_notify(this, event, data);</div><div class='add'>+            break;</div><div class='add'>+</div><div class='add'>+        case GF_EVENT_CHILD_DOWN:</div><div class='add'>+            if (idx &lt; 0) {</div><div class='add'>+                gf_smsg(this-&gt;name, GF_LOG_ERROR, 0, BRB_MSG_INVALID_SUBVOL,</div><div class='add'>+                        "event=%d", event, NULL);</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            pthread_mutex_lock(&amp;priv-&gt;lock);</div><div class='add'>+            {</div><div class='add'>+                child = &amp;priv-&gt;children[idx];</div><div class='add'>+                if (child-&gt;child_up == 0)</div><div class='add'>+                    goto unblock_1;</div><div class='add'>+</div><div class='add'>+                child-&gt;child_up = 0;</div><div class='add'>+                priv-&gt;up_children--;</div><div class='add'>+</div><div class='add'>+                _br_qchild_event(this, child, br_brick_disconnect);</div><div class='add'>+                pthread_cond_signal(&amp;priv-&gt;cond);</div><div class='add'>+            }</div><div class='add'>+        unblock_1:</div><div class='add'>+            pthread_mutex_unlock(&amp;priv-&gt;lock);</div><div class='add'>+</div><div class='add'>+            if (priv-&gt;up_children == 0)</div><div class='add'>+                default_notify(this, event, data);</div><div class='add'>+            break;</div><div class='add'>+</div><div class='add'>+        case GF_EVENT_SCRUB_STATUS:</div><div class='add'>+            gf_msg_debug(this-&gt;name, GF_LOG_INFO,</div><div class='add'>+                         "BitRot scrub status "</div><div class='add'>+                         "called");</div><div class='add'>+            va_start(ap, data);</div><div class='add'>+            output = va_arg(ap, dict_t *);</div><div class='add'>+            va_end(ap);</div><div class='add'>+</div><div class='add'>+            ret = br_scrubber_status_get(this, &amp;output);</div><div class='add'>+            gf_msg_debug(this-&gt;name, 0, "returning %d", ret);</div><div class='add'>+            break;</div><div class='add'>+</div><div class='add'>+        case GF_EVENT_SCRUB_ONDEMAND:</div><div class='add'>+            gf_log(this-&gt;name, GF_LOG_INFO,</div><div class='add'>+                   "BitRot scrub ondemand "</div><div class='add'>+                   "called");</div><div class='add'>+</div><div class='add'>+            if (scrub_monitor-&gt;state != BR_SCRUB_STATE_PENDING) {</div><div class='add'>+                gf_smsg(this-&gt;name, GF_LOG_ERROR, 0,</div><div class='add'>+                        BRB_MSG_RESCHEDULE_SCRUBBER_FAILED, "Current-state=%d",</div><div class='add'>+                        scrub_monitor-&gt;state, NULL);</div><div class='add'>+                return -2;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            /* Needs synchronization with reconfigure thread */</div><div class='add'>+            pthread_mutex_lock(&amp;priv-&gt;lock);</div><div class='add'>+            {</div><div class='add'>+                ret = br_scrub_state_machine(this, _gf_true);</div><div class='add'>+            }</div><div class='add'>+            pthread_mutex_unlock(&amp;priv-&gt;lock);</div><div class='add'>+</div><div class='add'>+            if (ret) {</div><div class='add'>+                gf_smsg(this-&gt;name, GF_LOG_ERROR, 0,</div><div class='add'>+                        BRB_MSG_COULD_NOT_SCHEDULE_SCRUB, NULL);</div><div class='add'>+            }</div><div class='add'>+            gf_msg_debug(this-&gt;name, 0, "returning %d", ret);</div><div class='add'>+            break;</div><div class='add'>+        default:</div><div class='add'>+            default_notify(this, event, data);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+br_fini_signer(xlator_t *this, br_private_t *priv)</div><div class='add'>+{</div><div class='add'>+    int i = 0;</div><div class='add'>+</div><div class='add'>+    if (priv == NULL)</div><div class='add'>+        return;</div><div class='add'>+</div><div class='add'>+    for (; i &lt; priv-&gt;signer_th_count; i++) {</div><div class='add'>+        (void)gf_thread_cleanup_xint(priv-&gt;obj_queue-&gt;workers[i]);</div><div class='add'>+    }</div><div class='add'>+    GF_FREE(priv-&gt;obj_queue-&gt;workers);</div><div class='add'>+</div><div class='add'>+    pthread_cond_destroy(&amp;priv-&gt;object_cond);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/**</div><div class='add'>+ * Initialize signer specific structures, spawn worker threads.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+static int32_t</div><div class='add'>+br_init_signer(xlator_t *this, br_private_t *priv)</div><div class='add'>+{</div><div class='add'>+    int i = 0;</div><div class='add'>+    int32_t ret = -1;</div><div class='add'>+</div><div class='add'>+    /* initialize gfchangelog xlator context */</div><div class='add'>+    ret = gf_changelog_init(this);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    pthread_cond_init(&amp;priv-&gt;object_cond, NULL);</div><div class='add'>+</div><div class='add'>+    priv-&gt;obj_queue = GF_CALLOC(1, sizeof(*priv-&gt;obj_queue),</div><div class='add'>+                                gf_br_mt_br_ob_n_wk_t);</div><div class='add'>+    if (!priv-&gt;obj_queue)</div><div class='add'>+        goto cleanup_cond;</div><div class='add'>+    INIT_LIST_HEAD(&amp;priv-&gt;obj_queue-&gt;objects);</div><div class='add'>+</div><div class='add'>+    priv-&gt;obj_queue-&gt;workers = GF_CALLOC(</div><div class='add'>+        priv-&gt;signer_th_count, sizeof(pthread_t), gf_br_mt_br_worker_t);</div><div class='add'>+    if (!priv-&gt;obj_queue-&gt;workers)</div><div class='add'>+        goto cleanup_obj_queue;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; priv-&gt;signer_th_count; i++) {</div><div class='add'>+        ret = gf_thread_create(&amp;priv-&gt;obj_queue-&gt;workers[i], NULL,</div><div class='add'>+                               br_process_object, this, "brpobj");</div><div class='add'>+        if (ret != 0) {</div><div class='add'>+            gf_smsg(this-&gt;name, GF_LOG_ERROR, -ret,</div><div class='add'>+                    BRB_MSG_THREAD_CREATION_FAILED, NULL);</div><div class='add'>+            ret = -1;</div><div class='add'>+            goto cleanup_threads;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+</div><div class='add'>+cleanup_threads:</div><div class='add'>+    for (i--; i &gt;= 0; i--) {</div><div class='add'>+        (void)gf_thread_cleanup_xint(priv-&gt;obj_queue-&gt;workers[i]);</div><div class='add'>+    }</div><div class='add'>+    GF_FREE(priv-&gt;obj_queue-&gt;workers);</div><div class='add'>+</div><div class='add'>+cleanup_obj_queue:</div><div class='add'>+    GF_FREE(priv-&gt;obj_queue);</div><div class='add'>+</div><div class='add'>+cleanup_cond:</div><div class='add'>+    /* that's explicit */</div><div class='add'>+    pthread_cond_destroy(&amp;priv-&gt;object_cond);</div><div class='add'>+out:</div><div class='add'>+    return -1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/**</div><div class='add'>+ * For signer, only rate limit CPU usage (during hash calculation) when</div><div class='add'>+ * compiled with -DBR_RATE_LIMIT_SIGNER cflags, else let it run full</div><div class='add'>+ * throttle.</div><div class='add'>+ */</div><div class='add'>+static int32_t</div><div class='add'>+br_rate_limit_signer(xlator_t *this, int child_count, int numbricks)</div><div class='add'>+{</div><div class='add'>+    br_private_t *priv = NULL;</div><div class='add'>+    tbf_opspec_t spec = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    spec.op = TBF_OP_HASH;</div><div class='add'>+    spec.rate = 0;</div><div class='add'>+    spec.maxlimit = 0;</div><div class='add'>+</div><div class='add'>+    /**</div><div class='add'>+     * OK. Most implementations of TBF I've come across generate tokens</div><div class='add'>+     * every second (UML, etc..) and some chose sub-second granularity</div><div class='add'>+     * (blk-iothrottle cgroups). TBF algorithm itself does not enforce</div><div class='add'>+     * any logic for choosing generation interval and it seems pretty</div><div class='add'>+     * logical as one could jack up token count per interval w.r.t.</div><div class='add'>+     * generation rate.</div><div class='add'>+     *</div><div class='add'>+     * Value used here is chosen based on a series of test(s) performed</div><div class='add'>+     * to balance object signing time and not maxing out on all available</div><div class='add'>+     * CPU cores. It's obvious to have seconds granularity and jack up</div><div class='add'>+     * token count per interval, thereby achieving close to similar</div><div class='add'>+     * results. Let's stick to this as it seems to be working fine for</div><div class='add'>+     * the set of ops that are throttled.</div><div class='add'>+     **/</div><div class='add'>+    spec.token_gen_interval = 600000; /* In usec */</div><div class='add'>+</div><div class='add'>+#ifdef BR_RATE_LIMIT_SIGNER</div><div class='add'>+</div><div class='add'>+    double contribution = 0;</div><div class='add'>+    contribution = ((double)1 - ((double)child_count / (double)numbricks));</div><div class='add'>+    if (contribution == 0)</div><div class='add'>+        contribution = 1;</div><div class='add'>+    spec.rate = BR_HASH_CALC_READ_SIZE * contribution;</div><div class='add'>+    spec.maxlimit = priv-&gt;signer_th_count * BR_HASH_CALC_READ_SIZE;</div><div class='add'>+</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+    if (!spec.rate)</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_INFO, 0, BRB_MSG_RATE_LIMIT_INFO,</div><div class='add'>+                "FULL THROTTLE", NULL);</div><div class='add'>+    else</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_INFO, 0, BRB_MSG_RATE_LIMIT_INFO,</div><div class='add'>+                "tokens/sec-rate=%lu", spec.rate, "maxlimit=%lu", spec.maxlimit,</div><div class='add'>+                NULL);</div><div class='add'>+</div><div class='add'>+    priv-&gt;tbf = tbf_init(&amp;spec, 1);</div><div class='add'>+    return priv-&gt;tbf ? 0 : -1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int32_t</div><div class='add'>+br_signer_handle_options(xlator_t *this, br_private_t *priv, dict_t *options)</div><div class='add'>+{</div><div class='add'>+    if (options) {</div><div class='add'>+        GF_OPTION_RECONF("expiry-time", priv-&gt;expiry_time, options, uint32,</div><div class='add'>+                         error_return);</div><div class='add'>+        GF_OPTION_RECONF("signer-threads", priv-&gt;signer_th_count, options,</div><div class='add'>+                         uint32, error_return);</div><div class='add'>+    } else {</div><div class='add'>+        GF_OPTION_INIT("expiry-time", priv-&gt;expiry_time, uint32, error_return);</div><div class='add'>+        GF_OPTION_INIT("signer-threads", priv-&gt;signer_th_count, uint32,</div><div class='add'>+                       error_return);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+</div><div class='add'>+error_return:</div><div class='add'>+    return -1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int32_t</div><div class='add'>+br_signer_init(xlator_t *this, br_private_t *priv)</div><div class='add'>+{</div><div class='add'>+    int32_t ret = 0;</div><div class='add'>+    int numbricks = 0;</div><div class='add'>+</div><div class='add'>+    GF_OPTION_INIT("expiry-time", priv-&gt;expiry_time, uint32, error_return);</div><div class='add'>+    GF_OPTION_INIT("brick-count", numbricks, int32, error_return);</div><div class='add'>+    GF_OPTION_INIT("signer-threads", priv-&gt;signer_th_count, uint32,</div><div class='add'>+                   error_return);</div><div class='add'>+</div><div class='add'>+    ret = br_rate_limit_signer(this, priv-&gt;child_count, numbricks);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto error_return;</div><div class='add'>+</div><div class='add'>+    ret = br_init_signer(this, priv);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto cleanup_tbf;</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+</div><div class='add'>+cleanup_tbf:</div><div class='add'>+    /* cleanup TBF */</div><div class='add'>+error_return:</div><div class='add'>+    return -1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+br_free_scrubber_monitor(xlator_t *this, br_private_t *priv)</div><div class='add'>+{</div><div class='add'>+    struct br_monitor *scrub_monitor = &amp;priv-&gt;scrub_monitor;</div><div class='add'>+</div><div class='add'>+    if (scrub_monitor-&gt;timer) {</div><div class='add'>+        (void)gf_tw_del_timer(priv-&gt;timer_wheel, scrub_monitor-&gt;timer);</div><div class='add'>+</div><div class='add'>+        GF_FREE(scrub_monitor-&gt;timer);</div><div class='add'>+        scrub_monitor-&gt;timer = NULL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    (void)gf_thread_cleanup_xint(scrub_monitor-&gt;thread);</div><div class='add'>+</div><div class='add'>+    /* Clean up cond and mutex variables */</div><div class='add'>+    pthread_mutex_destroy(&amp;scrub_monitor-&gt;mutex);</div><div class='add'>+    pthread_cond_destroy(&amp;scrub_monitor-&gt;cond);</div><div class='add'>+</div><div class='add'>+    pthread_mutex_destroy(&amp;scrub_monitor-&gt;wakelock);</div><div class='add'>+    pthread_cond_destroy(&amp;scrub_monitor-&gt;wakecond);</div><div class='add'>+</div><div class='add'>+    pthread_mutex_destroy(&amp;scrub_monitor-&gt;donelock);</div><div class='add'>+    pthread_cond_destroy(&amp;scrub_monitor-&gt;donecond);</div><div class='add'>+</div><div class='add'>+    LOCK_DESTROY(&amp;scrub_monitor-&gt;lock);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+br_free_children(xlator_t *this, br_private_t *priv, int count)</div><div class='add'>+{</div><div class='add'>+    br_child_t *child = NULL;</div><div class='add'>+</div><div class='add'>+    for (--count; count &gt;= 0; count--) {</div><div class='add'>+        child = &amp;priv-&gt;children[count];</div><div class='add'>+        mem_pool_destroy(child-&gt;timer_pool);</div><div class='add'>+        pthread_mutex_destroy(&amp;child-&gt;lock);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    GF_FREE(priv-&gt;children);</div><div class='add'>+    priv-&gt;children = NULL;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+br_init_children(xlator_t *this, br_private_t *priv)</div><div class='add'>+{</div><div class='add'>+    int i = 0;</div><div class='add'>+    br_child_t *child = NULL;</div><div class='add'>+    xlator_list_t *trav = NULL;</div><div class='add'>+</div><div class='add'>+    priv-&gt;child_count = xlator_subvolume_count(this);</div><div class='add'>+    priv-&gt;children = GF_CALLOC(priv-&gt;child_count, sizeof(*priv-&gt;children),</div><div class='add'>+                               gf_br_mt_br_child_t);</div><div class='add'>+    if (!priv-&gt;children)</div><div class='add'>+        goto err;</div><div class='add'>+</div><div class='add'>+    trav = this-&gt;children;</div><div class='add'>+    while (trav) {</div><div class='add'>+        child = &amp;priv-&gt;children[i];</div><div class='add'>+</div><div class='add'>+        pthread_mutex_init(&amp;child-&gt;lock, NULL);</div><div class='add'>+        child-&gt;witnessed = 0;</div><div class='add'>+</div><div class='add'>+        br_set_child_state(child, BR_CHILD_STATE_DISCONNECTED);</div><div class='add'>+</div><div class='add'>+        child-&gt;this = this;</div><div class='add'>+        child-&gt;xl = trav-&gt;xlator;</div><div class='add'>+</div><div class='add'>+        child-&gt;timer_pool = mem_pool_new(struct gf_tw_timer_list, 4096);</div><div class='add'>+        if (!child-&gt;timer_pool) {</div><div class='add'>+            gf_smsg(this-&gt;name, GF_LOG_ERROR, ENOMEM, BRB_MSG_MEM_POOL_ALLOC,</div><div class='add'>+                    NULL);</div><div class='add'>+            errno = ENOMEM;</div><div class='add'>+            goto freechild;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        INIT_LIST_HEAD(&amp;child-&gt;list);</div><div class='add'>+</div><div class='add'>+        i++;</div><div class='add'>+        trav = trav-&gt;next;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+</div><div class='add'>+freechild:</div><div class='add'>+    br_free_children(this, priv, i);</div><div class='add'>+err:</div><div class='add'>+    return -1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+init(xlator_t *this)</div><div class='add'>+{</div><div class='add'>+    int32_t ret = -1;</div><div class='add'>+    br_private_t *priv = NULL;</div><div class='add'>+</div><div class='add'>+    if (!this-&gt;children) {</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_ERROR, 0, BRB_MSG_NO_CHILD, NULL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    priv = GF_CALLOC(1, sizeof(*priv), gf_br_mt_br_private_t);</div><div class='add'>+    if (!priv) {</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_ERROR, ENOMEM, BRB_MSG_NO_MEMORY, NULL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    GF_OPTION_INIT("scrubber", priv-&gt;iamscrubber, bool, free_priv);</div><div class='add'>+</div><div class='add'>+    ret = br_init_children(this, priv);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto free_priv;</div><div class='add'>+</div><div class='add'>+    pthread_mutex_init(&amp;priv-&gt;lock, NULL);</div><div class='add'>+    pthread_cond_init(&amp;priv-&gt;cond, NULL);</div><div class='add'>+</div><div class='add'>+    INIT_LIST_HEAD(&amp;priv-&gt;bricks);</div><div class='add'>+    INIT_LIST_HEAD(&amp;priv-&gt;signing);</div><div class='add'>+</div><div class='add'>+    priv-&gt;timer_wheel = glusterfs_ctx_tw_get(this-&gt;ctx);</div><div class='add'>+    if (!priv-&gt;timer_wheel) {</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_ERROR, 0, BRB_MSG_TIMER_WHEEL_UNAVAILABLE,</div><div class='add'>+                NULL);</div><div class='add'>+        goto cleanup;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    this-&gt;private = priv;</div><div class='add'>+</div><div class='add'>+    if (!priv-&gt;iamscrubber) {</div><div class='add'>+        ret = br_signer_init(this, priv);</div><div class='add'>+        if (!ret)</div><div class='add'>+            ret = br_signer_handle_options(this, priv, NULL);</div><div class='add'>+    } else {</div><div class='add'>+        ret = br_scrubber_init(this, priv);</div><div class='add'>+        if (!ret)</div><div class='add'>+            ret = br_scrubber_handle_options(this, priv, NULL);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (ret)</div><div class='add'>+        goto cleanup;</div><div class='add'>+</div><div class='add'>+    ret = gf_thread_create(&amp;priv-&gt;thread, NULL, br_handle_events, this,</div><div class='add'>+                           "brhevent");</div><div class='add'>+    if (ret != 0) {</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_ERROR, -ret, BRB_MSG_THREAD_CREATION_FAILED,</div><div class='add'>+                NULL);</div><div class='add'>+        ret = -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (!ret) {</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_INFO, 0, BRB_MSG_BITROT_LOADED, "mode=%s",</div><div class='add'>+                (priv-&gt;iamscrubber) ? "SCRUBBER" : "SIGNER", NULL);</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+cleanup:</div><div class='add'>+    (void)pthread_cond_destroy(&amp;priv-&gt;cond);</div><div class='add'>+    (void)pthread_mutex_destroy(&amp;priv-&gt;lock);</div><div class='add'>+</div><div class='add'>+    br_free_children(this, priv, priv-&gt;child_count);</div><div class='add'>+</div><div class='add'>+free_priv:</div><div class='add'>+    GF_FREE(priv);</div><div class='add'>+out:</div><div class='add'>+    this-&gt;private = NULL;</div><div class='add'>+    return -1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+fini(xlator_t *this)</div><div class='add'>+{</div><div class='add'>+    br_private_t *priv = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    if (!priv)</div><div class='add'>+        return;</div><div class='add'>+</div><div class='add'>+    if (!priv-&gt;iamscrubber)</div><div class='add'>+        br_fini_signer(this, priv);</div><div class='add'>+    else</div><div class='add'>+        (void)br_free_scrubber_monitor(this, priv);</div><div class='add'>+</div><div class='add'>+    br_free_children(this, priv, priv-&gt;child_count);</div><div class='add'>+</div><div class='add'>+    this-&gt;private = NULL;</div><div class='add'>+    GF_FREE(priv);</div><div class='add'>+</div><div class='add'>+    glusterfs_ctx_tw_put(this-&gt;ctx);</div><div class='add'>+</div><div class='add'>+    return;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+br_reconfigure_monitor(xlator_t *this)</div><div class='add'>+{</div><div class='add'>+    int32_t ret = 0;</div><div class='add'>+</div><div class='add'>+    ret = br_scrub_state_machine(this, _gf_false);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_ERROR, 0, BRB_MSG_COULD_NOT_SCHEDULE_SCRUB,</div><div class='add'>+                NULL);</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+br_reconfigure_scrubber(xlator_t *this, dict_t *options)</div><div class='add'>+{</div><div class='add'>+    int32_t ret = -1;</div><div class='add'>+    br_private_t *priv = NULL;</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    pthread_mutex_lock(&amp;priv-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        ret = br_scrubber_handle_options(this, priv, options);</div><div class='add'>+    }</div><div class='add'>+    pthread_mutex_unlock(&amp;priv-&gt;lock);</div><div class='add'>+</div><div class='add'>+    if (ret)</div><div class='add'>+        goto err;</div><div class='add'>+</div><div class='add'>+    /* change state for all _up_ subvolume(s) */</div><div class='add'>+    pthread_mutex_lock(&amp;priv-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        br_reconfigure_monitor(this);</div><div class='add'>+    }</div><div class='add'>+    pthread_mutex_unlock(&amp;priv-&gt;lock);</div><div class='add'>+</div><div class='add'>+err:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+br_reconfigure_signer(xlator_t *this, dict_t *options)</div><div class='add'>+{</div><div class='add'>+    br_private_t *priv = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    return br_signer_handle_options(this, priv, options);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+reconfigure(xlator_t *this, dict_t *options)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+    br_private_t *priv = NULL;</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    if (priv-&gt;iamscrubber)</div><div class='add'>+        ret = br_reconfigure_scrubber(this, options);</div><div class='add'>+    else</div><div class='add'>+        ret = br_reconfigure_signer(this, options);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+struct xlator_fops fops;</div><div class='add'>+</div><div class='add'>+struct xlator_cbks cbks;</div><div class='add'>+</div><div class='add'>+struct volume_options options[] = {</div><div class='add'>+    {</div><div class='add'>+        .key = {"expiry-time"},</div><div class='add'>+        .type = GF_OPTION_TYPE_INT,</div><div class='add'>+        .default_value = SIGNING_TIMEOUT,</div><div class='add'>+        .op_version = {GD_OP_VERSION_3_7_0},</div><div class='add'>+        .flags = OPT_FLAG_SETTABLE,</div><div class='add'>+        .description = "Waiting time for an object on which it waits "</div><div class='add'>+                       "before it is signed",</div><div class='add'>+    },</div><div class='add'>+    {</div><div class='add'>+        .key = {"brick-count"},</div><div class='add'>+        .type = GF_OPTION_TYPE_STR,</div><div class='add'>+        .description = "Total number of bricks for the current node for "</div><div class='add'>+                       "all volumes in the trusted storage pool.",</div><div class='add'>+    },</div><div class='add'>+    {</div><div class='add'>+        .key = {"scrubber", "scrub"},</div><div class='add'>+        .type = GF_OPTION_TYPE_BOOL,</div><div class='add'>+        .default_value = "false",</div><div class='add'>+        .op_version = {GD_OP_VERSION_3_7_0},</div><div class='add'>+        .flags = OPT_FLAG_SETTABLE | OPT_FLAG_FORCE,</div><div class='add'>+        .description = "option to run as a scrubber",</div><div class='add'>+    },</div><div class='add'>+    {</div><div class='add'>+        .key = {"scrub-throttle"},</div><div class='add'>+        .type = GF_OPTION_TYPE_STR,</div><div class='add'>+        .default_value = "lazy",</div><div class='add'>+        .op_version = {GD_OP_VERSION_3_7_0},</div><div class='add'>+        .flags = OPT_FLAG_SETTABLE,</div><div class='add'>+        .description = "Scrub-throttle value is a measure of how fast "</div><div class='add'>+                       "or slow the scrubber scrubs the filesystem for "</div><div class='add'>+                       "volume &lt;VOLNAME&gt;",</div><div class='add'>+    },</div><div class='add'>+    {</div><div class='add'>+        .key = {"scrub-freq"},</div><div class='add'>+        .type = GF_OPTION_TYPE_STR,</div><div class='add'>+        .default_value = "biweekly",</div><div class='add'>+        .op_version = {GD_OP_VERSION_3_7_0},</div><div class='add'>+        .flags = OPT_FLAG_SETTABLE,</div><div class='add'>+        .description = "Scrub frequency for volume &lt;VOLNAME&gt;",</div><div class='add'>+    },</div><div class='add'>+    {</div><div class='add'>+        .key = {"scrub-state"},</div><div class='add'>+        .type = GF_OPTION_TYPE_STR,</div><div class='add'>+        .default_value = "active",</div><div class='add'>+        .op_version = {GD_OP_VERSION_4_0_0},</div><div class='add'>+        .flags = OPT_FLAG_SETTABLE,</div><div class='add'>+        .description = "Pause/Resume scrub. Upon resume, scrubber "</div><div class='add'>+                       "continues from where it left off.",</div><div class='add'>+    },</div><div class='add'>+    {</div><div class='add'>+        .key = {"signer-threads"},</div><div class='add'>+        .type = GF_OPTION_TYPE_INT,</div><div class='add'>+        .default_value = BR_WORKERS,</div><div class='add'>+        .op_version = {GD_OP_VERSION_8_0},</div><div class='add'>+        .flags = OPT_FLAG_SETTABLE,</div><div class='add'>+        .description = "Number of signing process threads. As a best "</div><div class='add'>+                       "practice, set this to the number of processor cores",</div><div class='add'>+    },</div><div class='add'>+    {.key = {NULL}},</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+xlator_api_t xlator_api = {</div><div class='add'>+    .init = init,</div><div class='add'>+    .fini = fini,</div><div class='add'>+    .notify = notify,</div><div class='add'>+    .reconfigure = reconfigure,</div><div class='add'>+    .mem_acct_init = mem_acct_init,</div><div class='add'>+    .op_version = {1}, /* Present from the initial version */</div><div class='add'>+    .fops = &amp;fops,</div><div class='add'>+    .cbks = &amp;cbks,</div><div class='add'>+    .options = options,</div><div class='add'>+    .identifier = "bit-rot",</div><div class='add'>+    .category = GF_MAINTAINED,</div><div class='add'>+};</div><div class='head'>diff --git a/xlators/features/bit-rot/src/bitd/bit-rot.h b/xlators/features/bit-rot/src/bitd/bit-rot.h<br/>new file mode 100644<br/>index 00000000000..8ac7dcdac3d<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/xlators/features/bit-rot/src/bitd/bit-rot.h?id=d1d7a6f35c816822fab51c820e25023863c239c1'>xlators/features/bit-rot/src/bitd/bit-rot.h</a></div><div class='hunk'>@@ -0,0 +1,302 @@</div><div class='add'>+/*</div><div class='add'>+   Copyright (c) 2015 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+   This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+   This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+   General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+   later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+   cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#ifndef __BIT_ROT_H__</div><div class='add'>+#define __BIT_ROT_H__</div><div class='add'>+</div><div class='add'>+#include &lt;glusterfs/glusterfs.h&gt;</div><div class='add'>+#include &lt;glusterfs/logging.h&gt;</div><div class='add'>+#include &lt;glusterfs/dict.h&gt;</div><div class='add'>+#include &lt;glusterfs/xlator.h&gt;</div><div class='add'>+#include &lt;glusterfs/defaults.h&gt;</div><div class='add'>+#include &lt;glusterfs/syncop.h&gt;</div><div class='add'>+#include &lt;glusterfs/syncop-utils.h&gt;</div><div class='add'>+#include "changelog.h"</div><div class='add'>+#include "timer-wheel.h"</div><div class='add'>+</div><div class='add'>+#include &lt;glusterfs/throttle-tbf.h&gt;</div><div class='add'>+#include "bit-rot-ssm.h"</div><div class='add'>+</div><div class='add'>+#include "bit-rot-common.h"</div><div class='add'>+#include "bit-rot-stub-mem-types.h"</div><div class='add'>+#include "bit-rot-scrub-status.h"</div><div class='add'>+</div><div class='add'>+#include &lt;openssl/sha.h&gt;</div><div class='add'>+</div><div class='add'>+typedef enum scrub_throttle {</div><div class='add'>+    BR_SCRUB_THROTTLE_VOID = -1,</div><div class='add'>+    BR_SCRUB_THROTTLE_LAZY = 0,</div><div class='add'>+    BR_SCRUB_THROTTLE_NORMAL = 1,</div><div class='add'>+    BR_SCRUB_THROTTLE_AGGRESSIVE = 2,</div><div class='add'>+    BR_SCRUB_THROTTLE_STALLED = 3,</div><div class='add'>+} scrub_throttle_t;</div><div class='add'>+</div><div class='add'>+typedef enum scrub_freq {</div><div class='add'>+    BR_FSSCRUB_FREQ_HOURLY = 1,</div><div class='add'>+    BR_FSSCRUB_FREQ_DAILY,</div><div class='add'>+    BR_FSSCRUB_FREQ_WEEKLY,</div><div class='add'>+    BR_FSSCRUB_FREQ_BIWEEKLY,</div><div class='add'>+    BR_FSSCRUB_FREQ_MONTHLY,</div><div class='add'>+    BR_FSSCRUB_FREQ_MINUTE,</div><div class='add'>+    BR_FSSCRUB_FREQ_STALLED,</div><div class='add'>+} scrub_freq_t;</div><div class='add'>+</div><div class='add'>+#define signature_size(hl) (sizeof(br_isignature_t) + hl + 1)</div><div class='add'>+</div><div class='add'>+struct br_scanfs {</div><div class='add'>+    gf_lock_t entrylock;</div><div class='add'>+</div><div class='add'>+    pthread_mutex_t waitlock;</div><div class='add'>+    pthread_cond_t waitcond;</div><div class='add'>+</div><div class='add'>+    unsigned int entries;</div><div class='add'>+    struct list_head queued;</div><div class='add'>+    struct list_head ready;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+/* just need three states to track child status */</div><div class='add'>+typedef enum br_child_state {</div><div class='add'>+    BR_CHILD_STATE_CONNECTED = 1,</div><div class='add'>+    BR_CHILD_STATE_INITIALIZING,</div><div class='add'>+    BR_CHILD_STATE_CONNFAILED,</div><div class='add'>+    BR_CHILD_STATE_DISCONNECTED,</div><div class='add'>+} br_child_state_t;</div><div class='add'>+</div><div class='add'>+struct br_child {</div><div class='add'>+    pthread_mutex_t lock;     /* protects child state */</div><div class='add'>+    char witnessed;           /* witnessed at least one successful</div><div class='add'>+                                 connection */</div><div class='add'>+    br_child_state_t c_state; /* current state of this child */</div><div class='add'>+</div><div class='add'>+    char child_up;             /* Indicates whether this child is</div><div class='add'>+                                  up or not */</div><div class='add'>+    xlator_t *xl;              /* client xlator corresponding to</div><div class='add'>+                                  this child */</div><div class='add'>+    inode_table_t *table;      /* inode table for this child */</div><div class='add'>+    char brick_path[PATH_MAX]; /* brick export directory of this</div><div class='add'>+                                  child */</div><div class='add'>+    struct list_head list;     /* hook to attach to the list of</div><div class='add'>+                                  UP children */</div><div class='add'>+    xlator_t *this;            /* Bit rot xlator */</div><div class='add'>+</div><div class='add'>+    pthread_t thread;  /* initial crawler for unsigned</div><div class='add'>+                          object(s) or scrub crawler */</div><div class='add'>+    int threadrunning; /* active thread */</div><div class='add'>+</div><div class='add'>+    struct mem_pool *timer_pool; /* timer-wheel's timer mem-pool */</div><div class='add'>+</div><div class='add'>+    struct timeval tv;</div><div class='add'>+</div><div class='add'>+    struct br_scanfs fsscan; /* per subvolume FS scanner */</div><div class='add'>+</div><div class='add'>+    gf_boolean_t active_scrubbing; /* Actively scrubbing or not */</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+typedef struct br_child br_child_t;</div><div class='add'>+</div><div class='add'>+struct br_obj_n_workers {</div><div class='add'>+    struct list_head objects; /* queue of objects expired from the</div><div class='add'>+                                 timer wheel and ready to be picked</div><div class='add'>+                                 up for signing */</div><div class='add'>+    pthread_t *workers;       /* Threads which pick up the objects</div><div class='add'>+                                 from the above queue and start</div><div class='add'>+                                 signing each object */</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct br_scrubber {</div><div class='add'>+    xlator_t *this;</div><div class='add'>+</div><div class='add'>+    scrub_throttle_t throttle;</div><div class='add'>+</div><div class='add'>+    /**</div><div class='add'>+     * frequency of scanning for this subvolume. this should</div><div class='add'>+     * normally be per-child, but since all children follow the</div><div class='add'>+     * same frequency for a volume, this option ends up here</div><div class='add'>+     * instead of br_child_t.</div><div class='add'>+     */</div><div class='add'>+    scrub_freq_t frequency;</div><div class='add'>+</div><div class='add'>+    gf_boolean_t frequency_reconf;</div><div class='add'>+    gf_boolean_t throttle_reconf;</div><div class='add'>+</div><div class='add'>+    pthread_mutex_t mutex;</div><div class='add'>+    pthread_cond_t cond;</div><div class='add'>+</div><div class='add'>+    unsigned int nr_scrubbers;</div><div class='add'>+    struct list_head scrubbers;</div><div class='add'>+</div><div class='add'>+    /**</div><div class='add'>+     * list of "rotatable" subvolume(s) undergoing scrubbing</div><div class='add'>+     */</div><div class='add'>+    struct list_head scrublist;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct br_monitor {</div><div class='add'>+    gf_lock_t lock;</div><div class='add'>+    pthread_t thread; /* Monitor thread */</div><div class='add'>+</div><div class='add'>+    gf_boolean_t inited;</div><div class='add'>+    pthread_mutex_t mutex;</div><div class='add'>+    pthread_cond_t cond; /* Thread starts and will be waiting on cond.</div><div class='add'>+                            First child which is up wakes this up */</div><div class='add'>+</div><div class='add'>+    xlator_t *this;</div><div class='add'>+    /* scheduler */</div><div class='add'>+    uint32_t boot;</div><div class='add'>+</div><div class='add'>+    int32_t active_child_count; /* Number of children currently scrubbing */</div><div class='add'>+    gf_boolean_t kick;          /* This variable tracks the scrubber is</div><div class='add'>+                                 * kicked or not. Both 'kick' and</div><div class='add'>+                                 * 'active_child_count' uses the same pair</div><div class='add'>+                                 * of mutex-cond variable, i.e, wakelock and</div><div class='add'>+                                 * wakecond. */</div><div class='add'>+</div><div class='add'>+    pthread_mutex_t wakelock;</div><div class='add'>+    pthread_cond_t wakecond;</div><div class='add'>+</div><div class='add'>+    gf_boolean_t done;</div><div class='add'>+    pthread_mutex_t donelock;</div><div class='add'>+    pthread_cond_t donecond;</div><div class='add'>+</div><div class='add'>+    struct gf_tw_timer_list *timer;</div><div class='add'>+    br_scrub_state_t state; /* current scrub state */</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+typedef struct br_obj_n_workers br_obj_n_workers_t;</div><div class='add'>+</div><div class='add'>+typedef struct br_private br_private_t;</div><div class='add'>+</div><div class='add'>+typedef void (*br_scrubbed_file_update)(br_private_t *priv);</div><div class='add'>+</div><div class='add'>+struct br_private {</div><div class='add'>+    pthread_mutex_t lock;</div><div class='add'>+</div><div class='add'>+    struct list_head bricks; /* list of bricks from which enents</div><div class='add'>+                                have been received */</div><div class='add'>+</div><div class='add'>+    struct list_head signing;</div><div class='add'>+</div><div class='add'>+    pthread_cond_t object_cond; /* handling signing of objects */</div><div class='add'>+    int child_count;</div><div class='add'>+    br_child_t *children; /* list of subvolumes */</div><div class='add'>+    int up_children;</div><div class='add'>+</div><div class='add'>+    pthread_cond_t cond; /* handling CHILD_UP notifications */</div><div class='add'>+    pthread_t thread;    /* thread for connecting each UP</div><div class='add'>+                            child with changelog */</div><div class='add'>+</div><div class='add'>+    struct tvec_base *timer_wheel; /* timer wheel where the objects which</div><div class='add'>+                                      changelog has sent sits and waits</div><div class='add'>+                                      for expiry */</div><div class='add'>+    br_obj_n_workers_t *obj_queue; /* place holder for all the objects</div><div class='add'>+                                      that are expired from timer wheel</div><div class='add'>+                                      and ready to be picked up for</div><div class='add'>+                                      signing and the workers which sign</div><div class='add'>+                                      the objects */</div><div class='add'>+</div><div class='add'>+    uint32_t expiry_time; /* objects "wait" time */</div><div class='add'>+</div><div class='add'>+    uint32_t signer_th_count; /* Number of signing process threads */</div><div class='add'>+</div><div class='add'>+    tbf_t *tbf; /* token bucket filter */</div><div class='add'>+</div><div class='add'>+    gf_boolean_t iamscrubber; /* function as a fs scrubber */</div><div class='add'>+</div><div class='add'>+    struct br_scrub_stats scrub_stat; /* statistics of scrub*/</div><div class='add'>+</div><div class='add'>+    struct br_scrubber fsscrub; /* scrubbers for this subvolume */</div><div class='add'>+</div><div class='add'>+    struct br_monitor scrub_monitor; /* scrubber monitor */</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct br_object {</div><div class='add'>+    xlator_t *this;</div><div class='add'>+</div><div class='add'>+    uuid_t gfid;</div><div class='add'>+</div><div class='add'>+    unsigned long signedversion; /* version against which this object will</div><div class='add'>+                                    be signed */</div><div class='add'>+    br_child_t *child;           /* object's subvolume */</div><div class='add'>+</div><div class='add'>+    int sign_info;</div><div class='add'>+</div><div class='add'>+    struct list_head list; /* hook to add to the queue once the</div><div class='add'>+                              object is expired from timer wheel */</div><div class='add'>+    void *data;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+typedef struct br_object br_object_t;</div><div class='add'>+typedef int32_t(br_scrub_ssm_call)(xlator_t *);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+br_log_object(xlator_t *, char *, uuid_t, int32_t);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+br_log_object_path(xlator_t *, char *, const char *, int32_t);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+br_calculate_obj_checksum(unsigned char *, br_child_t *, fd_t *, struct iatt *);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+br_prepare_loc(xlator_t *, br_child_t *, loc_t *, gf_dirent_t *, loc_t *);</div><div class='add'>+</div><div class='add'>+gf_boolean_t</div><div class='add'>+bitd_is_bad_file(xlator_t *, br_child_t *, loc_t *, fd_t *);</div><div class='add'>+</div><div class='add'>+static inline void</div><div class='add'>+_br_set_child_state(br_child_t *child, br_child_state_t state)</div><div class='add'>+{</div><div class='add'>+    child-&gt;c_state = state;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static inline int</div><div class='add'>+_br_is_child_connected(br_child_t *child)</div><div class='add'>+{</div><div class='add'>+    return (child-&gt;c_state == BR_CHILD_STATE_CONNECTED);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static inline int</div><div class='add'>+_br_is_child_scrub_active(br_child_t *child)</div><div class='add'>+{</div><div class='add'>+    return child-&gt;active_scrubbing;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static inline int</div><div class='add'>+_br_child_failed_conn(br_child_t *child)</div><div class='add'>+{</div><div class='add'>+    return (child-&gt;c_state == BR_CHILD_STATE_CONNFAILED);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static inline int</div><div class='add'>+_br_child_witnessed_connection(br_child_t *child)</div><div class='add'>+{</div><div class='add'>+    return (child-&gt;witnessed == 1);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* scrub state */</div><div class='add'>+static inline void</div><div class='add'>+_br_monitor_set_scrub_state(struct br_monitor *scrub_monitor,</div><div class='add'>+                            br_scrub_state_t state)</div><div class='add'>+{</div><div class='add'>+    scrub_monitor-&gt;state = state;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static inline br_scrub_event_t</div><div class='add'>+_br_child_get_scrub_event(struct br_scrubber *fsscrub)</div><div class='add'>+{</div><div class='add'>+    return (fsscrub-&gt;frequency == BR_FSSCRUB_FREQ_STALLED)</div><div class='add'>+               ? BR_SCRUB_EVENT_PAUSE</div><div class='add'>+               : BR_SCRUB_EVENT_SCHEDULE;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+br_get_bad_objects_list(xlator_t *this, dict_t **dict);</div><div class='add'>+</div><div class='add'>+#endif /* __BIT_ROT_H__ */</div><div class='head'>diff --git a/xlators/features/bit-rot/src/stub/Makefile.am b/xlators/features/bit-rot/src/stub/Makefile.am<br/>new file mode 100644<br/>index 00000000000..f13de7145fc<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/xlators/features/bit-rot/src/stub/Makefile.am?id=d1d7a6f35c816822fab51c820e25023863c239c1'>xlators/features/bit-rot/src/stub/Makefile.am</a></div><div class='hunk'>@@ -0,0 +1,20 @@</div><div class='add'>+if WITH_SERVER</div><div class='add'>+xlator_LTLIBRARIES = bitrot-stub.la</div><div class='add'>+endif</div><div class='add'>+xlatordir = $(libdir)/glusterfs/$(PACKAGE_VERSION)/xlator/features</div><div class='add'>+</div><div class='add'>+bitrot_stub_la_LDFLAGS = -module $(GF_XLATOR_DEFAULT_LDFLAGS)</div><div class='add'>+</div><div class='add'>+bitrot_stub_la_SOURCES = bit-rot-stub-helpers.c bit-rot-stub.c</div><div class='add'>+bitrot_stub_la_LIBADD = $(top_builddir)/libglusterfs/src/libglusterfs.la</div><div class='add'>+</div><div class='add'>+noinst_HEADERS = bit-rot-stub.h bit-rot-common.h bit-rot-stub-mem-types.h \</div><div class='add'>+	bit-rot-object-version.h bit-rot-stub-messages.h</div><div class='add'>+</div><div class='add'>+AM_CPPFLAGS = $(GF_CPPFLAGS) -I$(top_srcdir)/libglusterfs/src \</div><div class='add'>+	-I$(top_srcdir)/rpc/xdr/src -I$(top_builddir)/rpc/xdr/src \</div><div class='add'>+	-I$(top_srcdir)/rpc/rpc-lib/src</div><div class='add'>+</div><div class='add'>+AM_CFLAGS = -Wall $(GF_CFLAGS)</div><div class='add'>+</div><div class='add'>+CLEANFILES =</div><div class='head'>diff --git a/xlators/features/bit-rot/src/stub/bit-rot-common.h b/xlators/features/bit-rot/src/stub/bit-rot-common.h<br/>new file mode 100644<br/>index 00000000000..20561aa7764<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/xlators/features/bit-rot/src/stub/bit-rot-common.h?id=d1d7a6f35c816822fab51c820e25023863c239c1'>xlators/features/bit-rot/src/stub/bit-rot-common.h</a></div><div class='hunk'>@@ -0,0 +1,178 @@</div><div class='add'>+/*</div><div class='add'>+   Copyright (c) 2015 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+   This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+   This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+   General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+   later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+   cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#ifndef __BIT_ROT_COMMON_H__</div><div class='add'>+#define __BIT_ROT_COMMON_H__</div><div class='add'>+</div><div class='add'>+#include &lt;glusterfs/glusterfs.h&gt;</div><div class='add'>+#include "bit-rot-object-version.h"</div><div class='add'>+</div><div class='add'>+#define BR_VXATTR_VERSION (1 &lt;&lt; 0)</div><div class='add'>+#define BR_VXATTR_SIGNATURE (1 &lt;&lt; 1)</div><div class='add'>+</div><div class='add'>+#define BR_VXATTR_SIGN_MISSING (BR_VXATTR_SIGNATURE)</div><div class='add'>+#define BR_VXATTR_ALL_MISSING (BR_VXATTR_VERSION | BR_VXATTR_SIGNATURE)</div><div class='add'>+</div><div class='add'>+#define BR_BAD_OBJ_CONTAINER                                                   \</div><div class='add'>+    (uuid_t) { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8 }</div><div class='add'>+</div><div class='add'>+typedef enum br_vxattr_state {</div><div class='add'>+    BR_VXATTR_STATUS_FULL = 0,</div><div class='add'>+    BR_VXATTR_STATUS_MISSING = 1,</div><div class='add'>+    BR_VXATTR_STATUS_UNSIGNED = 2,</div><div class='add'>+    BR_VXATTR_STATUS_INVALID = 3,</div><div class='add'>+} br_vxattr_status_t;</div><div class='add'>+</div><div class='add'>+typedef enum br_sign_state {</div><div class='add'>+    BR_SIGN_INVALID = -1,</div><div class='add'>+    BR_SIGN_NORMAL = 0,</div><div class='add'>+    BR_SIGN_REOPEN_WAIT = 1,</div><div class='add'>+    BR_SIGN_QUICK = 2,</div><div class='add'>+} br_sign_state_t;</div><div class='add'>+</div><div class='add'>+static inline br_vxattr_status_t</div><div class='add'>+br_version_xattr_state(dict_t *xattr, br_version_t **obuf,</div><div class='add'>+                       br_signature_t **sbuf, gf_boolean_t *objbad)</div><div class='add'>+{</div><div class='add'>+    int32_t ret = 0;</div><div class='add'>+    int32_t vxattr = 0;</div><div class='add'>+    br_vxattr_status_t status;</div><div class='add'>+    void *data = NULL;</div><div class='add'>+</div><div class='add'>+    /**</div><div class='add'>+     * The key being present in the dict indicates the xattr was set on</div><div class='add'>+     * disk. The presence of xattr itself as of now is suffecient to say</div><div class='add'>+     * the the object is bad.</div><div class='add'>+     */</div><div class='add'>+    *objbad = _gf_false;</div><div class='add'>+    ret = dict_get_bin(xattr, BITROT_OBJECT_BAD_KEY, (void **)&amp;data);</div><div class='add'>+    if (!ret)</div><div class='add'>+        *objbad = _gf_true;</div><div class='add'>+</div><div class='add'>+    ret = dict_get_bin(xattr, BITROT_CURRENT_VERSION_KEY, (void **)obuf);</div><div class='add'>+    if (ret)</div><div class='add'>+        vxattr |= BR_VXATTR_VERSION;</div><div class='add'>+</div><div class='add'>+    ret = dict_get_bin(xattr, BITROT_SIGNING_VERSION_KEY, (void **)sbuf);</div><div class='add'>+    if (ret)</div><div class='add'>+        vxattr |= BR_VXATTR_SIGNATURE;</div><div class='add'>+</div><div class='add'>+    switch (vxattr) {</div><div class='add'>+        case 0:</div><div class='add'>+            status = BR_VXATTR_STATUS_FULL;</div><div class='add'>+            break;</div><div class='add'>+        case BR_VXATTR_SIGN_MISSING:</div><div class='add'>+            status = BR_VXATTR_STATUS_UNSIGNED;</div><div class='add'>+            break;</div><div class='add'>+        case BR_VXATTR_ALL_MISSING:</div><div class='add'>+            status = BR_VXATTR_STATUS_MISSING;</div><div class='add'>+            break;</div><div class='add'>+        default:</div><div class='add'>+            status = BR_VXATTR_STATUS_INVALID;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return status;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/**</div><div class='add'>+ * in-memory representation of signature used by signer for object</div><div class='add'>+ * signing.</div><div class='add'>+ */</div><div class='add'>+typedef struct br_isignature_in {</div><div class='add'>+    int8_t signaturetype; /* signature type            */</div><div class='add'>+</div><div class='add'>+    unsigned long signedversion; /* version against which the</div><div class='add'>+                                    object was signed         */</div><div class='add'>+</div><div class='add'>+    size_t signaturelen; /* signature length          */</div><div class='add'>+    char signature[0];   /* object signature          */</div><div class='add'>+} br_isignature_t;</div><div class='add'>+</div><div class='add'>+/**</div><div class='add'>+ * in-memory representation of signature used by scrubber for object</div><div class='add'>+ * verification.</div><div class='add'>+ */</div><div class='add'>+typedef struct br_isignature_out {</div><div class='add'>+    char stale; /* stale signature?          */</div><div class='add'>+</div><div class='add'>+    unsigned long version; /* current signed version    */</div><div class='add'>+</div><div class='add'>+    uint32_t time[2]; /* time when the object</div><div class='add'>+                         got dirtied               */</div><div class='add'>+</div><div class='add'>+    int8_t signaturetype; /* hash type                 */</div><div class='add'>+    size_t signaturelen;  /* signature length          */</div><div class='add'>+    char signature[0];    /* signature (hash)          */</div><div class='add'>+} br_isignature_out_t;</div><div class='add'>+</div><div class='add'>+typedef struct br_stub_init {</div><div class='add'>+    uint32_t timebuf[2];</div><div class='add'>+    char export[PATH_MAX];</div><div class='add'>+} br_stub_init_t;</div><div class='add'>+</div><div class='add'>+typedef enum {</div><div class='add'>+    BR_SIGNATURE_TYPE_VOID = -1,  /* object is not signed       */</div><div class='add'>+    BR_SIGNATURE_TYPE_ZERO = 0,   /* min boundary               */</div><div class='add'>+    BR_SIGNATURE_TYPE_SHA256 = 1, /* signed with SHA256         */</div><div class='add'>+    BR_SIGNATURE_TYPE_MAX = 2,    /* max boundary               */</div><div class='add'>+} br_signature_type;</div><div class='add'>+</div><div class='add'>+/* BitRot stub start time (virtual xattr) */</div><div class='add'>+#define GLUSTERFS_GET_BR_STUB_INIT_TIME "trusted.glusterfs.bit-rot.stub-init"</div><div class='add'>+</div><div class='add'>+/* signing/reopen hint */</div><div class='add'>+#define BR_OBJECT_RESIGN 0</div><div class='add'>+#define BR_OBJECT_REOPEN 1</div><div class='add'>+#define BR_REOPEN_SIGN_HINT_KEY "trusted.glusterfs.bit-rot.reopen-hint"</div><div class='add'>+</div><div class='add'>+static inline int</div><div class='add'>+br_is_signature_type_valid(int8_t signaturetype)</div><div class='add'>+{</div><div class='add'>+    return ((signaturetype &gt; BR_SIGNATURE_TYPE_ZERO) &amp;&amp;</div><div class='add'>+            (signaturetype &lt; BR_SIGNATURE_TYPE_MAX));</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static inline void</div><div class='add'>+br_set_default_ongoingversion(br_version_t *buf, uint32_t *tv)</div><div class='add'>+{</div><div class='add'>+    buf-&gt;ongoingversion = BITROT_DEFAULT_CURRENT_VERSION;</div><div class='add'>+    buf-&gt;timebuf[0] = tv[0];</div><div class='add'>+    buf-&gt;timebuf[1] = tv[1];</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static inline void</div><div class='add'>+br_set_default_signature(br_signature_t *buf, size_t *size)</div><div class='add'>+{</div><div class='add'>+    buf-&gt;signaturetype = (int8_t)BR_SIGNATURE_TYPE_VOID;</div><div class='add'>+    buf-&gt;signedversion = BITROT_DEFAULT_SIGNING_VERSION;</div><div class='add'>+</div><div class='add'>+    *size = sizeof(br_signature_t); /* no signature */</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static inline void</div><div class='add'>+br_set_ongoingversion(br_version_t *buf, unsigned long version, uint32_t *tv)</div><div class='add'>+{</div><div class='add'>+    buf-&gt;ongoingversion = version;</div><div class='add'>+    buf-&gt;timebuf[0] = tv[0];</div><div class='add'>+    buf-&gt;timebuf[1] = tv[1];</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static inline void</div><div class='add'>+br_set_signature(br_signature_t *buf, br_isignature_t *sign,</div><div class='add'>+                 size_t signaturelen, size_t *size)</div><div class='add'>+{</div><div class='add'>+    buf-&gt;signaturetype = sign-&gt;signaturetype;</div><div class='add'>+    buf-&gt;signedversion = ntohl(sign-&gt;signedversion);</div><div class='add'>+</div><div class='add'>+    memcpy(buf-&gt;signature, sign-&gt;signature, signaturelen);</div><div class='add'>+    *size = sizeof(br_signature_t) + signaturelen;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#endif /* __BIT_ROT_COMMON_H__ */</div><div class='head'>diff --git a/xlators/features/bit-rot/src/stub/bit-rot-object-version.h b/xlators/features/bit-rot/src/stub/bit-rot-object-version.h<br/>new file mode 100644<br/>index 00000000000..7ae6a5200df<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/xlators/features/bit-rot/src/stub/bit-rot-object-version.h?id=d1d7a6f35c816822fab51c820e25023863c239c1'>xlators/features/bit-rot/src/stub/bit-rot-object-version.h</a></div><div class='hunk'>@@ -0,0 +1,30 @@</div><div class='add'>+/*</div><div class='add'>+   Copyright (c) 2015 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+   This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+   This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+   General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+   later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+   cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#ifndef __BIT_ROT_OBJECT_VERSION_H</div><div class='add'>+#define __BIT_ROT_OBJECT_VERSION_H</div><div class='add'>+</div><div class='add'>+/**</div><div class='add'>+ * on-disk formats for ongoing version and object signature.</div><div class='add'>+ */</div><div class='add'>+typedef struct br_version {</div><div class='add'>+    unsigned long ongoingversion;</div><div class='add'>+    uint32_t timebuf[2];</div><div class='add'>+} br_version_t;</div><div class='add'>+</div><div class='add'>+typedef struct __attribute__((__packed__)) br_signature {</div><div class='add'>+    int8_t signaturetype;</div><div class='add'>+</div><div class='add'>+    unsigned long signedversion;</div><div class='add'>+</div><div class='add'>+    char signature[0];</div><div class='add'>+} br_signature_t;</div><div class='add'>+</div><div class='add'>+#endif</div><div class='head'>diff --git a/xlators/features/bit-rot/src/stub/bit-rot-stub-helpers.c b/xlators/features/bit-rot/src/stub/bit-rot-stub-helpers.c<br/>new file mode 100644<br/>index 00000000000..8ac13a09941<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/xlators/features/bit-rot/src/stub/bit-rot-stub-helpers.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>xlators/features/bit-rot/src/stub/bit-rot-stub-helpers.c</a></div><div class='hunk'>@@ -0,0 +1,796 @@</div><div class='add'>+/*</div><div class='add'>+   Copyright (c) 2015 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+   This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+   This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+   General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+   later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+   cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#include "bit-rot-stub.h"</div><div class='add'>+</div><div class='add'>+br_stub_fd_t *</div><div class='add'>+br_stub_fd_new(void)</div><div class='add'>+{</div><div class='add'>+    br_stub_fd_t *br_stub_fd = NULL;</div><div class='add'>+</div><div class='add'>+    br_stub_fd = GF_CALLOC(1, sizeof(*br_stub_fd), gf_br_stub_mt_br_stub_fd_t);</div><div class='add'>+</div><div class='add'>+    return br_stub_fd;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+__br_stub_fd_ctx_set(xlator_t *this, fd_t *fd, br_stub_fd_t *br_stub_fd)</div><div class='add'>+{</div><div class='add'>+    uint64_t value = 0;</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    GF_VALIDATE_OR_GOTO("bit-rot-stub", this, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, fd, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, br_stub_fd, out);</div><div class='add'>+</div><div class='add'>+    value = (uint64_t)(long)br_stub_fd;</div><div class='add'>+</div><div class='add'>+    ret = __fd_ctx_set(fd, this, value);</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+br_stub_fd_t *</div><div class='add'>+__br_stub_fd_ctx_get(xlator_t *this, fd_t *fd)</div><div class='add'>+{</div><div class='add'>+    br_stub_fd_t *br_stub_fd = NULL;</div><div class='add'>+    uint64_t value = 0;</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    GF_VALIDATE_OR_GOTO("bit-rot-stub", this, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, fd, out);</div><div class='add'>+</div><div class='add'>+    ret = __fd_ctx_get(fd, this, &amp;value);</div><div class='add'>+    if (ret)</div><div class='add'>+        return NULL;</div><div class='add'>+</div><div class='add'>+    br_stub_fd = (br_stub_fd_t *)((long)value);</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return br_stub_fd;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+br_stub_fd_t *</div><div class='add'>+br_stub_fd_ctx_get(xlator_t *this, fd_t *fd)</div><div class='add'>+{</div><div class='add'>+    br_stub_fd_t *br_stub_fd = NULL;</div><div class='add'>+</div><div class='add'>+    GF_VALIDATE_OR_GOTO("bit-rot-stub", this, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, fd, out);</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;fd-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        br_stub_fd = __br_stub_fd_ctx_get(this, fd);</div><div class='add'>+    }</div><div class='add'>+    UNLOCK(&amp;fd-&gt;lock);</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return br_stub_fd;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+br_stub_fd_ctx_set(xlator_t *this, fd_t *fd, br_stub_fd_t *br_stub_fd)</div><div class='add'>+{</div><div class='add'>+    int32_t ret = -1;</div><div class='add'>+</div><div class='add'>+    GF_VALIDATE_OR_GOTO("bit-rot-stub", this, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, fd, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, br_stub_fd, out);</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;fd-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        ret = __br_stub_fd_ctx_set(this, fd, br_stub_fd);</div><div class='add'>+    }</div><div class='add'>+    UNLOCK(&amp;fd-&gt;lock);</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/**</div><div class='add'>+ * Adds an entry to the bad objects directory.</div><div class='add'>+ * @gfid: gfid of the bad object being added to the bad objects directory</div><div class='add'>+ */</div><div class='add'>+int</div><div class='add'>+br_stub_add(xlator_t *this, uuid_t gfid)</div><div class='add'>+{</div><div class='add'>+    char gfid_path[BR_PATH_MAX_PLUS] = {0};</div><div class='add'>+    char bad_gfid_path[BR_PATH_MAX_PLUS] = {0};</div><div class='add'>+    int ret = 0;</div><div class='add'>+    br_stub_private_t *priv = NULL;</div><div class='add'>+    struct stat st = {0};</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+    GF_ASSERT_AND_GOTO_WITH_ERROR(this-&gt;name, !gf_uuid_is_null(gfid), out,</div><div class='add'>+                                  errno, EINVAL);</div><div class='add'>+</div><div class='add'>+    snprintf(gfid_path, sizeof(gfid_path), "%s/%s", priv-&gt;stub_basepath,</div><div class='add'>+             uuid_utoa(gfid));</div><div class='add'>+</div><div class='add'>+    ret = sys_stat(gfid_path, &amp;st);</div><div class='add'>+    if (!ret)</div><div class='add'>+        goto out;</div><div class='add'>+    snprintf(bad_gfid_path, sizeof(bad_gfid_path), "%s/stub-%s",</div><div class='add'>+             priv-&gt;stub_basepath, uuid_utoa(priv-&gt;bad_object_dir_gfid));</div><div class='add'>+</div><div class='add'>+    ret = sys_link(bad_gfid_path, gfid_path);</div><div class='add'>+    if (ret) {</div><div class='add'>+        if ((errno != ENOENT) &amp;&amp; (errno != EMLINK) &amp;&amp; (errno != EEXIST))</div><div class='add'>+            goto out;</div><div class='add'>+</div><div class='add'>+        /*</div><div class='add'>+         * Continue with success. At least we'll have half of the</div><div class='add'>+         * functionality, in the sense, object is marked bad and</div><div class='add'>+         * would be inaccessible. It's only scrub status that would</div><div class='add'>+         * show up less number of objects. That's fine as we'll have</div><div class='add'>+         * the log files that will have the missing information.</div><div class='add'>+         */</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_WARNING, errno, BRS_MSG_LINK_FAIL, "gfid=%s",</div><div class='add'>+                uuid_utoa(gfid), NULL);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+out:</div><div class='add'>+    return -1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+br_stub_del(xlator_t *this, uuid_t gfid)</div><div class='add'>+{</div><div class='add'>+    int32_t op_errno __attribute__((unused)) = 0;</div><div class='add'>+    br_stub_private_t *priv = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    char gfid_path[BR_PATH_MAX_PLUS] = {0};</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+    GF_ASSERT_AND_GOTO_WITH_ERROR(this-&gt;name, !gf_uuid_is_null(gfid), out,</div><div class='add'>+                                  op_errno, EINVAL);</div><div class='add'>+    snprintf(gfid_path, sizeof(gfid_path), "%s/%s", priv-&gt;stub_basepath,</div><div class='add'>+             uuid_utoa(gfid));</div><div class='add'>+    ret = sys_unlink(gfid_path);</div><div class='add'>+    if (ret &amp;&amp; (errno != ENOENT)) {</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_ERROR, errno, BRS_MSG_BAD_OBJ_UNLINK_FAIL,</div><div class='add'>+                "path=%s", gfid_path, NULL);</div><div class='add'>+        ret = -errno;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+br_stub_check_stub_directory(xlator_t *this, char *fullpath)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+    struct stat st = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    char oldpath[BR_PATH_MAX_PLUS] = {0};</div><div class='add'>+    br_stub_private_t *priv = NULL;</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    snprintf(oldpath, sizeof(oldpath), "%s/%s", priv-&gt;export,</div><div class='add'>+             OLD_BR_STUB_QUARANTINE_DIR);</div><div class='add'>+</div><div class='add'>+    ret = sys_stat(fullpath, &amp;st);</div><div class='add'>+    if (!ret &amp;&amp; !S_ISDIR(st.st_mode))</div><div class='add'>+        goto error_return;</div><div class='add'>+    if (ret) {</div><div class='add'>+        if (errno != ENOENT)</div><div class='add'>+            goto error_return;</div><div class='add'>+        ret = sys_stat(oldpath, &amp;st);</div><div class='add'>+        if (ret)</div><div class='add'>+            ret = mkdir_p(fullpath, 0600, _gf_true);</div><div class='add'>+        else</div><div class='add'>+            ret = sys_rename(oldpath, fullpath);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (ret)</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_ERROR, errno, BRS_MSG_BAD_OBJECT_DIR_FAIL,</div><div class='add'>+                "create-path=%s", fullpath, NULL);</div><div class='add'>+    return ret;</div><div class='add'>+</div><div class='add'>+error_return:</div><div class='add'>+    gf_smsg(this-&gt;name, GF_LOG_ERROR, errno, BRS_MSG_BAD_OBJECT_DIR_FAIL,</div><div class='add'>+            "verify-path=%s", fullpath, NULL);</div><div class='add'>+    return -1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/**</div><div class='add'>+ * Function to create the container for the bad objects within the bad objects</div><div class='add'>+ * directory.</div><div class='add'>+ */</div><div class='add'>+static int</div><div class='add'>+br_stub_check_stub_file(xlator_t *this, char *path)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+    int fd = -1;</div><div class='add'>+    struct stat st = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    ret = sys_stat(path, &amp;st);</div><div class='add'>+    if (!ret &amp;&amp; !S_ISREG(st.st_mode))</div><div class='add'>+        goto error_return;</div><div class='add'>+    if (ret) {</div><div class='add'>+        if (errno != ENOENT)</div><div class='add'>+            goto error_return;</div><div class='add'>+        fd = sys_creat(path, 0);</div><div class='add'>+        if (fd &lt; 0)</div><div class='add'>+            gf_smsg(this-&gt;name, GF_LOG_ERROR, errno,</div><div class='add'>+                    BRS_MSG_BAD_OBJECT_DIR_FAIL, "create-path=%s", path, NULL);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (fd &gt;= 0) {</div><div class='add'>+        sys_close(fd);</div><div class='add'>+        ret = 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+</div><div class='add'>+error_return:</div><div class='add'>+    gf_smsg(this-&gt;name, GF_LOG_ERROR, errno, BRS_MSG_BAD_OBJECT_DIR_FAIL,</div><div class='add'>+            "verify-path=%s", path, NULL);</div><div class='add'>+    return -1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+br_stub_dir_create(xlator_t *this, br_stub_private_t *priv)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    char fullpath[BR_PATH_MAX_PLUS] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    char stub_gfid_path[BR_PATH_MAX_PLUS] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    gf_uuid_copy(priv-&gt;bad_object_dir_gfid, BR_BAD_OBJ_CONTAINER);</div><div class='add'>+</div><div class='add'>+    if (snprintf(fullpath, sizeof(fullpath), "%s", priv-&gt;stub_basepath) &gt;=</div><div class='add'>+        sizeof(fullpath))</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    if (snprintf(stub_gfid_path, sizeof(stub_gfid_path), "%s/stub-%s",</div><div class='add'>+                 priv-&gt;stub_basepath, uuid_utoa(priv-&gt;bad_object_dir_gfid)) &gt;=</div><div class='add'>+        sizeof(stub_gfid_path))</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    ret = br_stub_check_stub_directory(this, fullpath);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+    ret = br_stub_check_stub_file(this, stub_gfid_path);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return -1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+call_stub_t *</div><div class='add'>+__br_stub_dequeue(struct list_head *callstubs)</div><div class='add'>+{</div><div class='add'>+    call_stub_t *stub = NULL;</div><div class='add'>+</div><div class='add'>+    if (!list_empty(callstubs)) {</div><div class='add'>+        stub = list_entry(callstubs-&gt;next, call_stub_t, list);</div><div class='add'>+        list_del_init(&amp;stub-&gt;list);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return stub;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+__br_stub_enqueue(struct list_head *callstubs, call_stub_t *stub)</div><div class='add'>+{</div><div class='add'>+    list_add_tail(&amp;stub-&gt;list, callstubs);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+br_stub_worker_enqueue(xlator_t *this, call_stub_t *stub)</div><div class='add'>+{</div><div class='add'>+    br_stub_private_t *priv = NULL;</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+    pthread_mutex_lock(&amp;priv-&gt;container.bad_lock);</div><div class='add'>+    {</div><div class='add'>+        __br_stub_enqueue(&amp;priv-&gt;container.bad_queue, stub);</div><div class='add'>+        pthread_cond_signal(&amp;priv-&gt;container.bad_cond);</div><div class='add'>+    }</div><div class='add'>+    pthread_mutex_unlock(&amp;priv-&gt;container.bad_lock);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void *</div><div class='add'>+br_stub_worker(void *data)</div><div class='add'>+{</div><div class='add'>+    br_stub_private_t *priv = NULL;</div><div class='add'>+    xlator_t *this = NULL;</div><div class='add'>+    call_stub_t *stub = NULL;</div><div class='add'>+</div><div class='add'>+    THIS = data;</div><div class='add'>+    this = data;</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    for (;;) {</div><div class='add'>+        pthread_mutex_lock(&amp;priv-&gt;container.bad_lock);</div><div class='add'>+        {</div><div class='add'>+            while (list_empty(&amp;priv-&gt;container.bad_queue)) {</div><div class='add'>+                (void)pthread_cond_wait(&amp;priv-&gt;container.bad_cond,</div><div class='add'>+                                        &amp;priv-&gt;container.bad_lock);</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            stub = __br_stub_dequeue(&amp;priv-&gt;container.bad_queue);</div><div class='add'>+        }</div><div class='add'>+        pthread_mutex_unlock(&amp;priv-&gt;container.bad_lock);</div><div class='add'>+</div><div class='add'>+        if (stub) /* guard against spurious wakeups */</div><div class='add'>+            call_resume(stub);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return NULL;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+br_stub_lookup_wrapper(call_frame_t *frame, xlator_t *this, loc_t *loc,</div><div class='add'>+                       dict_t *xattr_req)</div><div class='add'>+{</div><div class='add'>+    br_stub_private_t *priv = NULL;</div><div class='add'>+    struct stat lstatbuf = {0};</div><div class='add'>+    int ret = 0;</div><div class='add'>+    int32_t op_errno = EINVAL;</div><div class='add'>+    int32_t op_ret = -1;</div><div class='add'>+    struct iatt stbuf = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    struct iatt postparent = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    dict_t *xattr = NULL;</div><div class='add'>+    gf_boolean_t ver_enabled = _gf_false;</div><div class='add'>+</div><div class='add'>+    BR_STUB_VER_ENABLED_IN_CALLPATH(frame, ver_enabled);</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+    BR_STUB_VER_COND_GOTO(priv, (!ver_enabled), done);</div><div class='add'>+</div><div class='add'>+    VALIDATE_OR_GOTO(loc, done);</div><div class='add'>+    if (gf_uuid_compare(loc-&gt;gfid, priv-&gt;bad_object_dir_gfid))</div><div class='add'>+        goto done;</div><div class='add'>+</div><div class='add'>+    ret = sys_lstat(priv-&gt;stub_basepath, &amp;lstatbuf);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_msg_debug(this-&gt;name, errno,</div><div class='add'>+                     "Stat failed on stub bad "</div><div class='add'>+                     "object dir");</div><div class='add'>+        op_errno = errno;</div><div class='add'>+        goto done;</div><div class='add'>+    } else if (!S_ISDIR(lstatbuf.st_mode)) {</div><div class='add'>+        gf_msg_debug(this-&gt;name, errno,</div><div class='add'>+                     "bad object container is not "</div><div class='add'>+                     "a directory");</div><div class='add'>+        op_errno = ENOTDIR;</div><div class='add'>+        goto done;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    iatt_from_stat(&amp;stbuf, &amp;lstatbuf);</div><div class='add'>+    gf_uuid_copy(stbuf.ia_gfid, priv-&gt;bad_object_dir_gfid);</div><div class='add'>+</div><div class='add'>+    op_ret = op_errno = 0;</div><div class='add'>+    xattr = dict_new();</div><div class='add'>+    if (!xattr) {</div><div class='add'>+        op_ret = -1;</div><div class='add'>+        op_errno = ENOMEM;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+done:</div><div class='add'>+    STACK_UNWIND_STRICT(lookup, frame, op_ret, op_errno, loc-&gt;inode, &amp;stbuf,</div><div class='add'>+                        xattr, &amp;postparent);</div><div class='add'>+    if (xattr)</div><div class='add'>+        dict_unref(xattr);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+is_bad_gfid_file_current(char *filename, uuid_t gfid)</div><div class='add'>+{</div><div class='add'>+    char current_stub_gfid[GF_UUID_BUF_SIZE + 16] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    snprintf(current_stub_gfid, sizeof current_stub_gfid, "stub-%s",</div><div class='add'>+             uuid_utoa(gfid));</div><div class='add'>+    return (!strcmp(filename, current_stub_gfid));</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+check_delete_stale_bad_file(xlator_t *this, char *filename)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+    struct stat st = {0};</div><div class='add'>+    char filepath[BR_PATH_MAX_PLUS] = {0};</div><div class='add'>+    br_stub_private_t *priv = NULL;</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    if (is_bad_gfid_file_current(filename, priv-&gt;bad_object_dir_gfid))</div><div class='add'>+        return;</div><div class='add'>+</div><div class='add'>+    snprintf(filepath, sizeof(filepath), "%s/%s", priv-&gt;stub_basepath,</div><div class='add'>+             filename);</div><div class='add'>+</div><div class='add'>+    ret = sys_stat(filepath, &amp;st);</div><div class='add'>+    if (!ret &amp;&amp; st.st_nlink == 1)</div><div class='add'>+        sys_unlink(filepath);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+br_stub_fill_readdir(fd_t *fd, br_stub_fd_t *fctx, DIR *dir, off_t off,</div><div class='add'>+                     size_t size, gf_dirent_t *entries)</div><div class='add'>+{</div><div class='add'>+    off_t in_case = -1;</div><div class='add'>+    off_t last_off = 0;</div><div class='add'>+    size_t filled = 0;</div><div class='add'>+    int count = 0;</div><div class='add'>+    int32_t this_size = -1;</div><div class='add'>+    gf_dirent_t *this_entry = NULL;</div><div class='add'>+    xlator_t *this = NULL;</div><div class='add'>+    struct dirent *entry = NULL;</div><div class='add'>+    struct dirent scratch[2] = {</div><div class='add'>+        {</div><div class='add'>+            0,</div><div class='add'>+        },</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    this = THIS;</div><div class='add'>+    if (!off) {</div><div class='add'>+        rewinddir(dir);</div><div class='add'>+    } else {</div><div class='add'>+        seekdir(dir, off);</div><div class='add'>+#ifndef GF_LINUX_HOST_OS</div><div class='add'>+        if ((u_long)telldir(dir) != off &amp;&amp; off != fctx-&gt;bad_object.dir_eof) {</div><div class='add'>+            gf_smsg(THIS-&gt;name, GF_LOG_ERROR, 0,</div><div class='add'>+                    BRS_MSG_BAD_OBJECT_DIR_SEEK_FAIL, "off=(0x%llx)", off,</div><div class='add'>+                    "dir=%p", dir, NULL);</div><div class='add'>+            errno = EINVAL;</div><div class='add'>+            count = -1;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+#endif /* GF_LINUX_HOST_OS */</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    while (filled &lt;= size) {</div><div class='add'>+        in_case = (u_long)telldir(dir);</div><div class='add'>+</div><div class='add'>+        if (in_case == -1) {</div><div class='add'>+            gf_smsg(THIS-&gt;name, GF_LOG_ERROR, 0,</div><div class='add'>+                    BRS_MSG_BAD_OBJECT_DIR_TELL_FAIL, "dir=%p", dir, "err=%s",</div><div class='add'>+                    strerror(errno), NULL);</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        errno = 0;</div><div class='add'>+        entry = sys_readdir(dir, scratch);</div><div class='add'>+        if (!entry || errno != 0) {</div><div class='add'>+            if (errno == EBADF) {</div><div class='add'>+                gf_smsg(THIS-&gt;name, GF_LOG_WARNING, 0,</div><div class='add'>+                        BRS_MSG_BAD_OBJECT_DIR_READ_FAIL, "dir=%p", dir,</div><div class='add'>+                        "err=%s", strerror(errno), NULL);</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+            break;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        if (!strcmp(entry-&gt;d_name, ".") || !strcmp(entry-&gt;d_name, ".."))</div><div class='add'>+            continue;</div><div class='add'>+</div><div class='add'>+        if (!strncmp(entry-&gt;d_name, "stub-", strlen("stub-"))) {</div><div class='add'>+            check_delete_stale_bad_file(this, entry-&gt;d_name);</div><div class='add'>+            continue;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        this_size = max(sizeof(gf_dirent_t), sizeof(gfs3_dirplist)) +</div><div class='add'>+                    strlen(entry-&gt;d_name) + 1;</div><div class='add'>+</div><div class='add'>+        if (this_size + filled &gt; size) {</div><div class='add'>+            seekdir(dir, in_case);</div><div class='add'>+#ifndef GF_LINUX_HOST_OS</div><div class='add'>+            if ((u_long)telldir(dir) != in_case &amp;&amp;</div><div class='add'>+                in_case != fctx-&gt;bad_object.dir_eof) {</div><div class='add'>+                gf_smsg(THIS-&gt;name, GF_LOG_ERROR, 0,</div><div class='add'>+                        BRS_MSG_BAD_OBJECT_DIR_SEEK_FAIL, "in_case=(0x%llx)",</div><div class='add'>+                        in_case, "dir=%p", dir, NULL);</div><div class='add'>+                errno = EINVAL;</div><div class='add'>+                count = -1;</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+#endif /* GF_LINUX_HOST_OS */</div><div class='add'>+            break;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        this_entry = gf_dirent_for_name(entry-&gt;d_name);</div><div class='add'>+</div><div class='add'>+        if (!this_entry) {</div><div class='add'>+            gf_smsg(THIS-&gt;name, GF_LOG_ERROR, 0,</div><div class='add'>+                    BRS_MSG_CREATE_GF_DIRENT_FAILED, "entry-name=%s",</div><div class='add'>+                    entry-&gt;d_name, "err=%s", strerror(errno), NULL);</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+        /*</div><div class='add'>+         * we store the offset of next entry here, which is</div><div class='add'>+         * probably not intended, but code using syncop_readdir()</div><div class='add'>+         * (glfs-heal.c, afr-self-heald.c, pump.c) rely on it</div><div class='add'>+         * for directory read resumption.</div><div class='add'>+         */</div><div class='add'>+        last_off = (u_long)telldir(dir);</div><div class='add'>+        this_entry-&gt;d_off = last_off;</div><div class='add'>+        this_entry-&gt;d_ino = entry-&gt;d_ino;</div><div class='add'>+</div><div class='add'>+        list_add_tail(&amp;this_entry-&gt;list, &amp;entries-&gt;list);</div><div class='add'>+</div><div class='add'>+        filled += this_size;</div><div class='add'>+        count++;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if ((!sys_readdir(dir, scratch) &amp;&amp; (errno == 0))) {</div><div class='add'>+        /* Indicate EOF */</div><div class='add'>+        errno = ENOENT;</div><div class='add'>+        /* Remember EOF offset for later detection */</div><div class='add'>+        fctx-&gt;bad_object.dir_eof = last_off;</div><div class='add'>+    }</div><div class='add'>+out:</div><div class='add'>+    return count;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+br_stub_readdir_wrapper(call_frame_t *frame, xlator_t *this, fd_t *fd,</div><div class='add'>+                        size_t size, off_t off, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    br_stub_fd_t *fctx = NULL;</div><div class='add'>+    DIR *dir = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int32_t op_ret = -1;</div><div class='add'>+    int32_t op_errno = 0;</div><div class='add'>+    int count = 0;</div><div class='add'>+    gf_dirent_t entries;</div><div class='add'>+    gf_boolean_t xdata_unref = _gf_false;</div><div class='add'>+    dict_t *dict = NULL;</div><div class='add'>+</div><div class='add'>+    INIT_LIST_HEAD(&amp;entries.list);</div><div class='add'>+</div><div class='add'>+    fctx = br_stub_fd_ctx_get(this, fd);</div><div class='add'>+    if (!fctx) {</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_WARNING, 0, BRS_MSG_GET_FD_CONTEXT_FAILED,</div><div class='add'>+                "fd=%p", fd, NULL);</div><div class='add'>+        op_errno = -ret;</div><div class='add'>+        goto done;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    dir = fctx-&gt;bad_object.dir;</div><div class='add'>+</div><div class='add'>+    if (!dir) {</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_WARNING, 0, BRS_MSG_BAD_HANDLE_DIR_NULL,</div><div class='add'>+                "fd=%p", fd, NULL);</div><div class='add'>+        op_errno = EINVAL;</div><div class='add'>+        goto done;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    count = br_stub_fill_readdir(fd, fctx, dir, off, size, &amp;entries);</div><div class='add'>+</div><div class='add'>+    /* pick ENOENT to indicate EOF */</div><div class='add'>+    op_errno = errno;</div><div class='add'>+    op_ret = count;</div><div class='add'>+</div><div class='add'>+    dict = xdata;</div><div class='add'>+    (void)br_stub_bad_objects_path(this, fd, &amp;entries, &amp;dict);</div><div class='add'>+    if (!xdata &amp;&amp; dict) {</div><div class='add'>+        xdata = dict;</div><div class='add'>+        xdata_unref = _gf_true;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+done:</div><div class='add'>+    STACK_UNWIND_STRICT(readdir, frame, op_ret, op_errno, &amp;entries, xdata);</div><div class='add'>+    gf_dirent_free(&amp;entries);</div><div class='add'>+    if (xdata_unref)</div><div class='add'>+        dict_unref(xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/**</div><div class='add'>+ * This function is called to mainly obtain the paths of the corrupt</div><div class='add'>+ * objects (files as of now). Currently scrub status prints only the</div><div class='add'>+ * gfid of the corrupted files. Reason is, bitrot-stub maintains the</div><div class='add'>+ * list of the corrupted objects as entries inside the quarantine</div><div class='add'>+ * directory (&lt;brick export&gt;/.glusterfs/quarantine)</div><div class='add'>+ *</div><div class='add'>+ * And the name of each entry in the qurantine directory is the gfid</div><div class='add'>+ * of the corrupted object. So scrub status will just show that info.</div><div class='add'>+ * But it helps the users a lot if the actual path to the object is</div><div class='add'>+ * also reported. Hence the below function to get that information.</div><div class='add'>+ * The function allocates a new dict to be returned (if it does not</div><div class='add'>+ * get one from the caller of readdir i.e. scrubber as of now), and</div><div class='add'>+ * stores the paths of each corrupted gfid there. The gfid is used as</div><div class='add'>+ * the key and path is used as the value.</div><div class='add'>+ *</div><div class='add'>+ * NOTE: The path will be there in following situations</div><div class='add'>+ * 1) gfid2path option has been enabled (posix xlator option)</div><div class='add'>+ *    and the corrupted file contains the path as an extended</div><div class='add'>+ *    attribute.</div><div class='add'>+ * 2) If the gfid2path option is not enabled, OR if the xattr</div><div class='add'>+ *    is absent, then the inode table should have it.</div><div class='add'>+ *    The path will be there if a name based lookup has happened</div><div class='add'>+ *    on the file which has been corrupted. With lookup a inode and</div><div class='add'>+ *    dentry would be created in the inode table. And the path is</div><div class='add'>+ *    constructed using the in memory inode and dentry. If a lookup</div><div class='add'>+ *    has not happened OR the inode corresponding to the corrupted</div><div class='add'>+ *    file does not exist in the inode table (because it got purged</div><div class='add'>+ *    as lru limit of the inodes exceeded) OR a nameless lookup had</div><div class='add'>+ *    happened to populate the inode in the inode table, then the</div><div class='add'>+ *    path will not be printed in scrub and only the gfid will be there.</div><div class='add'>+ **/</div><div class='add'>+int</div><div class='add'>+br_stub_bad_objects_path(xlator_t *this, fd_t *fd, gf_dirent_t *entries,</div><div class='add'>+                         dict_t **dict)</div><div class='add'>+{</div><div class='add'>+    gf_dirent_t *entry = NULL;</div><div class='add'>+    inode_t *inode = NULL;</div><div class='add'>+    char *hpath = NULL;</div><div class='add'>+    uuid_t gfid = {0};</div><div class='add'>+    int ret = -1;</div><div class='add'>+    dict_t *tmp_dict = NULL;</div><div class='add'>+    char str_gfid[64] = {0};</div><div class='add'>+</div><div class='add'>+    if (list_empty(&amp;entries-&gt;list))</div><div class='add'>+        return 0;</div><div class='add'>+</div><div class='add'>+    tmp_dict = *dict;</div><div class='add'>+</div><div class='add'>+    if (!tmp_dict) {</div><div class='add'>+        tmp_dict = dict_new();</div><div class='add'>+        /*</div><div class='add'>+         * If the allocation of dict fails then no need treat it</div><div class='add'>+         * it as a error. This path (or function) is executed when</div><div class='add'>+         * "gluster volume bitrot &lt;volume name&gt; scrub status" is</div><div class='add'>+         * executed, to get the list of the corrupted objects.</div><div class='add'>+         * And the motive of this function is to get the paths of</div><div class='add'>+         * the corrupted objects. If the dict allocation fails, then</div><div class='add'>+         * the scrub status will only show the gfids of those corrupted</div><div class='add'>+         * objects (which is the behavior as of the time of this patch</div><div class='add'>+         * being worked upon). So just return and only the gfids will</div><div class='add'>+         * be shown.</div><div class='add'>+         */</div><div class='add'>+        if (!tmp_dict) {</div><div class='add'>+            gf_smsg(this-&gt;name, GF_LOG_ERROR, 0, BRS_MSG_ALLOC_FAILED, NULL);</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    list_for_each_entry(entry, &amp;entries-&gt;list, list)</div><div class='add'>+    {</div><div class='add'>+        gf_uuid_clear(gfid);</div><div class='add'>+        gf_uuid_parse(entry-&gt;d_name, gfid);</div><div class='add'>+</div><div class='add'>+        inode = inode_find(fd-&gt;inode-&gt;table, gfid);</div><div class='add'>+</div><div class='add'>+        /* No need to check the return value here.</div><div class='add'>+         * Because @hpath is examined.</div><div class='add'>+         */</div><div class='add'>+        (void)br_stub_get_path_of_gfid(this, fd-&gt;inode, inode, gfid, &amp;hpath);</div><div class='add'>+</div><div class='add'>+        if (hpath) {</div><div class='add'>+            gf_msg_debug(this-&gt;name, 0,</div><div class='add'>+                         "path of the corrupted "</div><div class='add'>+                         "object (gfid: %s) is %s",</div><div class='add'>+                         uuid_utoa(gfid), hpath);</div><div class='add'>+            br_stub_entry_xattr_fill(this, hpath, entry, tmp_dict);</div><div class='add'>+        } else</div><div class='add'>+            gf_smsg(this-&gt;name, GF_LOG_WARNING, 0, BRS_MSG_PATH_GET_FAILED,</div><div class='add'>+                    "gfid=%s", uuid_utoa_r(gfid, str_gfid), NULL);</div><div class='add'>+</div><div class='add'>+        inode = NULL;</div><div class='add'>+        hpath = NULL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+    *dict = tmp_dict;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+br_stub_get_path_of_gfid(xlator_t *this, inode_t *parent, inode_t *inode,</div><div class='add'>+                         uuid_t gfid, char **path)</div><div class='add'>+{</div><div class='add'>+    int32_t ret = -1;</div><div class='add'>+    char gfid_str[64] = {0};</div><div class='add'>+</div><div class='add'>+    GF_VALIDATE_OR_GOTO("bitrot-stub", this, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, parent, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, path, out);</div><div class='add'>+</div><div class='add'>+    /* Above, No need to validate the @inode for hard resolution. Because</div><div class='add'>+     * inode can be NULL and if it is NULL, then syncop_gfid_to_path_hard</div><div class='add'>+     * will allocate a new inode and proceed. So no need to bother about</div><div class='add'>+     * @inode. Because we need it only to send a syncop_getxattr call</div><div class='add'>+     * from inside syncop_gfid_to_path_hard. And getxattr fetches the</div><div class='add'>+     * path from the backend.</div><div class='add'>+     */</div><div class='add'>+</div><div class='add'>+    ret = syncop_gfid_to_path_hard(parent-&gt;table, FIRST_CHILD(this), gfid,</div><div class='add'>+                                   inode, path, _gf_true);</div><div class='add'>+    if (ret &lt; 0)</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_WARNING, 0, BRS_MSG_PATH_GET_FAILED,</div><div class='add'>+                "gfid=%s", uuid_utoa_r(gfid, gfid_str), NULL);</div><div class='add'>+</div><div class='add'>+    /*</div><div class='add'>+     * Try with soft resolution of path if hard resolve fails. Because</div><div class='add'>+     * checking the xattr on disk to get the path of a inode (or gfid)</div><div class='add'>+     * is dependent on whether that option is enabled in the posix</div><div class='add'>+     * xlator or not. If it is not enabled, then hard resolution by</div><div class='add'>+     * checking the on disk xattr fails.</div><div class='add'>+     *</div><div class='add'>+     * Thus in such situations fall back to the soft resolution which</div><div class='add'>+     * mainly depends on the inode_path() function. And for using</div><div class='add'>+     * inode_path, @inode has to be linked i.e. a successful lookup should</div><div class='add'>+     * have happened on the gfid (or the path) to link the inode to the</div><div class='add'>+     * inode table. And if @inode is NULL, means, the inode has not been</div><div class='add'>+     * found in the inode table and better not to do inode_path() on the</div><div class='add'>+     * inode which has not been linked.</div><div class='add'>+     */</div><div class='add'>+    if (ret &lt; 0 &amp;&amp; inode) {</div><div class='add'>+        ret = syncop_gfid_to_path_hard(parent-&gt;table, FIRST_CHILD(this), gfid,</div><div class='add'>+                                       inode, path, _gf_false);</div><div class='add'>+        if (ret &lt; 0)</div><div class='add'>+            gf_smsg(this-&gt;name, GF_LOG_WARNING, 0, BRS_MSG_PATH_GET_FAILED,</div><div class='add'>+                    "from-memory  gfid=%s", uuid_utoa_r(gfid, gfid_str), NULL);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/**</div><div class='add'>+ * NOTE: If the file has multiple hardlinks (in gluster volume</div><div class='add'>+ * namespace), the path would be one of the hardlinks. Its up to</div><div class='add'>+ * the user to find the remaining hardlinks (using find -samefile)</div><div class='add'>+ * and remove them.</div><div class='add'>+ **/</div><div class='add'>+void</div><div class='add'>+br_stub_entry_xattr_fill(xlator_t *this, char *hpath, gf_dirent_t *entry,</div><div class='add'>+                         dict_t *dict)</div><div class='add'>+{</div><div class='add'>+    int32_t ret = -1;</div><div class='add'>+</div><div class='add'>+    GF_VALIDATE_OR_GOTO("bit-rot-stub", this, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, hpath, out);</div><div class='add'>+</div><div class='add'>+    /*</div><div class='add'>+     * Use the entry-&gt;d_name (which is nothing but the gfid of the</div><div class='add'>+     * corrupted object) as the key. And the value will be the actual</div><div class='add'>+     * path of that object (or file).</div><div class='add'>+     *</div><div class='add'>+     * ALso ignore the dict_set errors. scrubber will get the gfid of</div><div class='add'>+     * the corrupted object for sure. So, for now lets just log the</div><div class='add'>+     * dict_set_dynstr failure and move on.</div><div class='add'>+     */</div><div class='add'>+</div><div class='add'>+    ret = dict_set_dynstr(dict, entry-&gt;d_name, hpath);</div><div class='add'>+    if (ret)</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_WARNING, 0, BRS_MSG_DICT_SET_FAILED,</div><div class='add'>+                "path=%s", hpath, "object-name=%s", entry-&gt;d_name, NULL);</div><div class='add'>+out:</div><div class='add'>+    return;</div><div class='add'>+}</div><div class='head'>diff --git a/xlators/features/bit-rot/src/stub/bit-rot-stub-mem-types.h b/xlators/features/bit-rot/src/stub/bit-rot-stub-mem-types.h<br/>new file mode 100644<br/>index 00000000000..9d93caf069f<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/xlators/features/bit-rot/src/stub/bit-rot-stub-mem-types.h?id=d1d7a6f35c816822fab51c820e25023863c239c1'>xlators/features/bit-rot/src/stub/bit-rot-stub-mem-types.h</a></div><div class='hunk'>@@ -0,0 +1,36 @@</div><div class='add'>+/*</div><div class='add'>+   Copyright (c) 2015 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+   This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+   This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+   General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+   later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+   cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#ifndef _BR_MEM_TYPES_H</div><div class='add'>+#define _BR_MEM_TYPES_H</div><div class='add'>+</div><div class='add'>+#include &lt;glusterfs/mem-types.h&gt;</div><div class='add'>+</div><div class='add'>+enum br_mem_types {</div><div class='add'>+    gf_br_stub_mt_private_t = gf_common_mt_end + 1,</div><div class='add'>+    gf_br_stub_mt_version_t,</div><div class='add'>+    gf_br_stub_mt_inode_ctx_t,</div><div class='add'>+    gf_br_stub_mt_signature_t,</div><div class='add'>+    gf_br_mt_br_private_t,</div><div class='add'>+    gf_br_mt_br_child_t,</div><div class='add'>+    gf_br_mt_br_object_t,</div><div class='add'>+    gf_br_mt_br_ob_n_wk_t,</div><div class='add'>+    gf_br_mt_br_scrubber_t,</div><div class='add'>+    gf_br_mt_br_fsscan_entry_t,</div><div class='add'>+    gf_br_stub_mt_br_stub_fd_t,</div><div class='add'>+    gf_br_stub_mt_br_scanner_freq_t,</div><div class='add'>+    gf_br_stub_mt_sigstub_t,</div><div class='add'>+    gf_br_mt_br_child_event_t,</div><div class='add'>+    gf_br_stub_mt_misc,</div><div class='add'>+    gf_br_mt_br_worker_t,</div><div class='add'>+    gf_br_stub_mt_end,</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+#endif</div><div class='head'>diff --git a/xlators/features/bit-rot/src/stub/bit-rot-stub-messages.h b/xlators/features/bit-rot/src/stub/bit-rot-stub-messages.h<br/>new file mode 100644<br/>index 00000000000..6c15a166f18<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/xlators/features/bit-rot/src/stub/bit-rot-stub-messages.h?id=d1d7a6f35c816822fab51c820e25023863c239c1'>xlators/features/bit-rot/src/stub/bit-rot-stub-messages.h</a></div><div class='hunk'>@@ -0,0 +1,117 @@</div><div class='add'>+/*</div><div class='add'>+ Copyright (c) 2015 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+ This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+ This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+ General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+ later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+ cases as published by the Free Software Foundation.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+#ifndef _BITROT_STUB_MESSAGES_H_</div><div class='add'>+#define _BITROT_STUB_MESSAGES_H_</div><div class='add'>+</div><div class='add'>+#include &lt;glusterfs/glfs-message-id.h&gt;</div><div class='add'>+</div><div class='add'>+/* To add new message IDs, append new identifiers at the end of the list.</div><div class='add'>+ *</div><div class='add'>+ * Never remove a message ID. If it's not used anymore, you can rename it or</div><div class='add'>+ * leave it as it is, but not delete it. This is to prevent reutilization of</div><div class='add'>+ * IDs by other messages.</div><div class='add'>+ *</div><div class='add'>+ * The component name must match one of the entries defined in</div><div class='add'>+ * glfs-message-id.h.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+GLFS_MSGID(BITROT_STUB, BRS_MSG_NO_MEMORY, BRS_MSG_SET_EVENT_FAILED,</div><div class='add'>+           BRS_MSG_MEM_ACNT_FAILED, BRS_MSG_CREATE_FRAME_FAILED,</div><div class='add'>+           BRS_MSG_SET_CONTEXT_FAILED, BRS_MSG_CHANGE_VERSION_FAILED,</div><div class='add'>+           BRS_MSG_ADD_FD_TO_LIST_FAILED, BRS_MSG_SET_FD_CONTEXT_FAILED,</div><div class='add'>+           BRS_MSG_CREATE_ANONYMOUS_FD_FAILED, BRS_MSG_NO_CHILD,</div><div class='add'>+           BRS_MSG_STUB_ALLOC_FAILED, BRS_MSG_GET_INODE_CONTEXT_FAILED,</div><div class='add'>+           BRS_MSG_CANCEL_SIGN_THREAD_FAILED, BRS_MSG_ADD_FD_TO_INODE,</div><div class='add'>+           BRS_MSG_SIGN_VERSION_ERROR, BRS_MSG_BAD_OBJ_MARK_FAIL,</div><div class='add'>+           BRS_MSG_NON_SCRUB_BAD_OBJ_MARK, BRS_MSG_REMOVE_INTERNAL_XATTR,</div><div class='add'>+           BRS_MSG_SET_INTERNAL_XATTR, BRS_MSG_BAD_OBJECT_ACCESS,</div><div class='add'>+           BRS_MSG_BAD_CONTAINER_FAIL, BRS_MSG_BAD_OBJECT_DIR_FAIL,</div><div class='add'>+           BRS_MSG_BAD_OBJECT_DIR_SEEK_FAIL, BRS_MSG_BAD_OBJECT_DIR_TELL_FAIL,</div><div class='add'>+           BRS_MSG_BAD_OBJECT_DIR_READ_FAIL, BRS_MSG_GET_FD_CONTEXT_FAILED,</div><div class='add'>+           BRS_MSG_BAD_HANDLE_DIR_NULL, BRS_MSG_BAD_OBJ_THREAD_FAIL,</div><div class='add'>+           BRS_MSG_BAD_OBJ_DIR_CLOSE_FAIL, BRS_MSG_LINK_FAIL,</div><div class='add'>+           BRS_MSG_BAD_OBJ_UNLINK_FAIL, BRS_MSG_DICT_SET_FAILED,</div><div class='add'>+           BRS_MSG_PATH_GET_FAILED, BRS_MSG_NULL_LOCAL,</div><div class='add'>+           BRS_MSG_SPAWN_SIGN_THRD_FAILED, BRS_MSG_KILL_SIGN_THREAD,</div><div class='add'>+           BRS_MSG_NON_BITD_PID, BRS_MSG_SIGN_PREPARE_FAIL,</div><div class='add'>+           BRS_MSG_USING_DEFAULT_THREAD_SIZE, BRS_MSG_ALLOC_MEM_FAILED,</div><div class='add'>+           BRS_MSG_DICT_ALLOC_FAILED, BRS_MSG_CREATE_GF_DIRENT_FAILED,</div><div class='add'>+           BRS_MSG_ALLOC_FAILED, BRS_MSG_PATH_XATTR_GET_FAILED,</div><div class='add'>+           BRS_MSG_VERSION_PREPARE_FAIL);</div><div class='add'>+</div><div class='add'>+#define BRS_MSG_MEM_ACNT_FAILED_STR "Memory accounting init failed"</div><div class='add'>+#define BRS_MSG_BAD_OBJ_THREAD_FAIL_STR "pthread_init failed"</div><div class='add'>+#define BRS_MSG_USING_DEFAULT_THREAD_SIZE_STR "Using default thread stack size"</div><div class='add'>+#define BRS_MSG_NO_CHILD_STR "FATAL: no children"</div><div class='add'>+#define BRS_MSG_SPAWN_SIGN_THRD_FAILED_STR                                     \</div><div class='add'>+    "failed to create the new thread for signer"</div><div class='add'>+#define BRS_MSG_BAD_CONTAINER_FAIL_STR                                         \</div><div class='add'>+    "failed to launch the thread for storing bad gfids"</div><div class='add'>+#define BRS_MSG_CANCEL_SIGN_THREAD_FAILED_STR                                  \</div><div class='add'>+    "Could not cancel sign serializer thread"</div><div class='add'>+#define BRS_MSG_KILL_SIGN_THREAD_STR "killed the signer thread"</div><div class='add'>+#define BRS_MSG_GET_INODE_CONTEXT_FAILED_STR                                   \</div><div class='add'>+    "failed to init the inode context for the inode"</div><div class='add'>+#define BRS_MSG_ADD_FD_TO_INODE_STR "failed to add fd to the inode"</div><div class='add'>+#define BRS_MSG_NO_MEMORY_STR "local allocation failed"</div><div class='add'>+#define BRS_MSG_BAD_OBJECT_ACCESS_STR "bad object accessed. Returning"</div><div class='add'>+#define BRS_MSG_SIGN_VERSION_ERROR_STR "Signing version exceeds current version"</div><div class='add'>+#define BRS_MSG_NON_BITD_PID_STR                                               \</div><div class='add'>+    "PID from where signature request came, does not belong to bit-rot "       \</div><div class='add'>+    "daemon. Unwinding the fop"</div><div class='add'>+#define BRS_MSG_SIGN_PREPARE_FAIL_STR                                          \</div><div class='add'>+    "failed to prepare the signature. Unwinding the fop"</div><div class='add'>+#define BRS_MSG_VERSION_PREPARE_FAIL_STR                                       \</div><div class='add'>+    "failed to prepare the version. Unwinding the fop"</div><div class='add'>+#define BRS_MSG_STUB_ALLOC_FAILED_STR "failed to allocate stub fop, Unwinding"</div><div class='add'>+#define BRS_MSG_BAD_OBJ_MARK_FAIL_STR "failed to mark object as bad"</div><div class='add'>+#define BRS_MSG_NON_SCRUB_BAD_OBJ_MARK_STR                                     \</div><div class='add'>+    "bad object marking is not from the scrubber"</div><div class='add'>+#define BRS_MSG_ALLOC_MEM_FAILED_STR "failed to allocate memory"</div><div class='add'>+#define BRS_MSG_SET_INTERNAL_XATTR_STR "called on the internal xattr"</div><div class='add'>+#define BRS_MSG_REMOVE_INTERNAL_XATTR_STR "removexattr called on internal xattr"</div><div class='add'>+#define BRS_MSG_CREATE_ANONYMOUS_FD_FAILED_STR                                 \</div><div class='add'>+    "failed to create anonymous fd for the inode"</div><div class='add'>+#define BRS_MSG_ADD_FD_TO_LIST_FAILED_STR "failed add fd to the list"</div><div class='add'>+#define BRS_MSG_SET_FD_CONTEXT_FAILED_STR                                      \</div><div class='add'>+    "failed to set the fd context for the file"</div><div class='add'>+#define BRS_MSG_NULL_LOCAL_STR "local is NULL"</div><div class='add'>+#define BRS_MSG_DICT_ALLOC_FAILED_STR                                          \</div><div class='add'>+    "dict allocation failed: cannot send IPC FOP to changelog"</div><div class='add'>+#define BRS_MSG_SET_EVENT_FAILED_STR "cannot set release event in dict"</div><div class='add'>+#define BRS_MSG_CREATE_FRAME_FAILED_STR "create_frame() failure"</div><div class='add'>+#define BRS_MSG_BAD_OBJ_DIR_CLOSE_FAIL_STR "closedir error"</div><div class='add'>+#define BRS_MSG_LINK_FAIL_STR "failed to record gfid"</div><div class='add'>+#define BRS_MSG_BAD_OBJ_UNLINK_FAIL_STR                                        \</div><div class='add'>+    "failed to delete bad object link from quaratine directory"</div><div class='add'>+#define BRS_MSG_BAD_OBJECT_DIR_FAIL_STR "failed stub directory"</div><div class='add'>+#define BRS_MSG_BAD_OBJECT_DIR_SEEK_FAIL_STR                                   \</div><div class='add'>+    "seekdir failed. Invalid argument (offset reused from another DIR * "      \</div><div class='add'>+    "structure)"</div><div class='add'>+#define BRS_MSG_BAD_OBJECT_DIR_TELL_FAIL_STR "telldir failed on dir"</div><div class='add'>+#define BRS_MSG_BAD_OBJECT_DIR_READ_FAIL_STR "readdir failed on dir"</div><div class='add'>+#define BRS_MSG_CREATE_GF_DIRENT_FAILED_STR "could not create gf_dirent"</div><div class='add'>+#define BRS_MSG_GET_FD_CONTEXT_FAILED_STR "pfd is NULL"</div><div class='add'>+#define BRS_MSG_BAD_HANDLE_DIR_NULL_STR "dir if NULL"</div><div class='add'>+#define BRS_MSG_ALLOC_FAILED_STR                                               \</div><div class='add'>+    "failed to allocate new dict for saving the paths of the corrupted "       \</div><div class='add'>+    "objects. Scrub status will only display the gfid"</div><div class='add'>+#define BRS_MSG_PATH_GET_FAILED_STR "failed to get the path"</div><div class='add'>+#define BRS_MSG_PATH_XATTR_GET_FAILED_STR                                      \</div><div class='add'>+    "failed to get the path xattr from disk for the gfid. Trying to get path " \</div><div class='add'>+    "from the memory"</div><div class='add'>+#define BRS_MSG_DICT_SET_FAILED_STR                                            \</div><div class='add'>+    "failed to set the actual path as the value in the dict for the "          \</div><div class='add'>+    "corrupted object"</div><div class='add'>+#define BRS_MSG_SET_CONTEXT_FAILED_STR                                         \</div><div class='add'>+    "could not set fd context for release callback"</div><div class='add'>+#define BRS_MSG_CHANGE_VERSION_FAILED_STR "change version failed"</div><div class='add'>+#endif /* !_BITROT_STUB_MESSAGES_H_ */</div><div class='head'>diff --git a/xlators/features/bit-rot/src/stub/bit-rot-stub.c b/xlators/features/bit-rot/src/stub/bit-rot-stub.c<br/>new file mode 100644<br/>index 00000000000..447dd47ff41<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/xlators/features/bit-rot/src/stub/bit-rot-stub.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>xlators/features/bit-rot/src/stub/bit-rot-stub.c</a></div><div class='hunk'>@@ -0,0 +1,3590 @@</div><div class='add'>+/*</div><div class='add'>+   Copyright (c) 2015 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+   This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+   This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+   General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+   later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+   cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#include &lt;ctype.h&gt;</div><div class='add'>+#include &lt;sys/uio.h&gt;</div><div class='add'>+#include &lt;signal.h&gt;</div><div class='add'>+</div><div class='add'>+#include &lt;glusterfs/glusterfs.h&gt;</div><div class='add'>+#include &lt;glusterfs/logging.h&gt;</div><div class='add'>+#include "changelog.h"</div><div class='add'>+#include &lt;glusterfs/compat-errno.h&gt;</div><div class='add'>+#include &lt;glusterfs/call-stub.h&gt;</div><div class='add'>+</div><div class='add'>+#include "bit-rot-stub.h"</div><div class='add'>+#include "bit-rot-stub-mem-types.h"</div><div class='add'>+#include "bit-rot-stub-messages.h"</div><div class='add'>+#include "bit-rot-common.h"</div><div class='add'>+</div><div class='add'>+#define BR_STUB_REQUEST_COOKIE 0x1</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+br_stub_lock_cleaner(void *arg)</div><div class='add'>+{</div><div class='add'>+    pthread_mutex_t *clean_mutex = arg;</div><div class='add'>+</div><div class='add'>+    pthread_mutex_unlock(clean_mutex);</div><div class='add'>+    return;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void *</div><div class='add'>+br_stub_signth(void *);</div><div class='add'>+</div><div class='add'>+struct br_stub_signentry {</div><div class='add'>+    unsigned long v;</div><div class='add'>+</div><div class='add'>+    call_stub_t *stub;</div><div class='add'>+</div><div class='add'>+    struct list_head list;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+mem_acct_init(xlator_t *this)</div><div class='add'>+{</div><div class='add'>+    int32_t ret = -1;</div><div class='add'>+</div><div class='add'>+    if (!this)</div><div class='add'>+        return ret;</div><div class='add'>+</div><div class='add'>+    ret = xlator_mem_acct_init(this, gf_br_stub_mt_end + 1);</div><div class='add'>+</div><div class='add'>+    if (ret != 0) {</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_WARNING, 0, BRS_MSG_MEM_ACNT_FAILED, NULL);</div><div class='add'>+        return ret;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+br_stub_bad_object_container_init(xlator_t *this, br_stub_private_t *priv)</div><div class='add'>+{</div><div class='add'>+    pthread_attr_t w_attr;</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    ret = pthread_cond_init(&amp;priv-&gt;container.bad_cond, NULL);</div><div class='add'>+    if (ret != 0) {</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_ERROR, 0, BRS_MSG_BAD_OBJ_THREAD_FAIL,</div><div class='add'>+                "cond_init ret=%d", ret, NULL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = pthread_mutex_init(&amp;priv-&gt;container.bad_lock, NULL);</div><div class='add'>+    if (ret != 0) {</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_ERROR, 0, BRS_MSG_BAD_OBJ_THREAD_FAIL,</div><div class='add'>+                "mutex_init ret=%d", ret, NULL);</div><div class='add'>+        goto cleanup_cond;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = pthread_attr_init(&amp;w_attr);</div><div class='add'>+    if (ret != 0) {</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_ERROR, 0, BRS_MSG_BAD_OBJ_THREAD_FAIL,</div><div class='add'>+                "attr_init ret=%d", ret, NULL);</div><div class='add'>+        goto cleanup_lock;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = pthread_attr_setstacksize(&amp;w_attr, BAD_OBJECT_THREAD_STACK_SIZE);</div><div class='add'>+    if (ret == EINVAL) {</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_WARNING, 0,</div><div class='add'>+                BRS_MSG_USING_DEFAULT_THREAD_SIZE, NULL);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    INIT_LIST_HEAD(&amp;priv-&gt;container.bad_queue);</div><div class='add'>+    ret = br_stub_dir_create(this, priv);</div><div class='add'>+    if (ret &lt; 0)</div><div class='add'>+        goto cleanup_lock;</div><div class='add'>+</div><div class='add'>+    ret = gf_thread_create(&amp;priv-&gt;container.thread, &amp;w_attr, br_stub_worker,</div><div class='add'>+                           this, "brswrker");</div><div class='add'>+    if (ret)</div><div class='add'>+        goto cleanup_attr;</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+</div><div class='add'>+cleanup_attr:</div><div class='add'>+    pthread_attr_destroy(&amp;w_attr);</div><div class='add'>+cleanup_lock:</div><div class='add'>+    pthread_mutex_destroy(&amp;priv-&gt;container.bad_lock);</div><div class='add'>+cleanup_cond:</div><div class='add'>+    pthread_cond_destroy(&amp;priv-&gt;container.bad_cond);</div><div class='add'>+out:</div><div class='add'>+    return -1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+init(xlator_t *this)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+    char *tmp = NULL;</div><div class='add'>+    struct timeval tv = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    br_stub_private_t *priv = NULL;</div><div class='add'>+</div><div class='add'>+    if (!this-&gt;children) {</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_ERROR, 0, BRS_MSG_NO_CHILD, NULL);</div><div class='add'>+        goto error_return;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    priv = GF_CALLOC(1, sizeof(*priv), gf_br_stub_mt_private_t);</div><div class='add'>+    if (!priv)</div><div class='add'>+        goto error_return;</div><div class='add'>+</div><div class='add'>+    priv-&gt;local_pool = mem_pool_new(br_stub_local_t, 512);</div><div class='add'>+    if (!priv-&gt;local_pool)</div><div class='add'>+        goto free_priv;</div><div class='add'>+</div><div class='add'>+    GF_OPTION_INIT("bitrot", priv-&gt;do_versioning, bool, free_mempool);</div><div class='add'>+</div><div class='add'>+    GF_OPTION_INIT("export", tmp, str, free_mempool);</div><div class='add'>+</div><div class='add'>+    if (snprintf(priv-&gt;export, PATH_MAX, "%s", tmp) &gt;= PATH_MAX)</div><div class='add'>+        goto free_mempool;</div><div class='add'>+</div><div class='add'>+    if (snprintf(priv-&gt;stub_basepath, sizeof(priv-&gt;stub_basepath), "%s/%s",</div><div class='add'>+                 priv-&gt;export,</div><div class='add'>+                 BR_STUB_QUARANTINE_DIR) &gt;= sizeof(priv-&gt;stub_basepath))</div><div class='add'>+        goto free_mempool;</div><div class='add'>+</div><div class='add'>+    (void)gettimeofday(&amp;tv, NULL);</div><div class='add'>+</div><div class='add'>+    /* boot time is in network endian format */</div><div class='add'>+    priv-&gt;boot[0] = htonl(tv.tv_sec);</div><div class='add'>+    priv-&gt;boot[1] = htonl(tv.tv_usec);</div><div class='add'>+</div><div class='add'>+    pthread_mutex_init(&amp;priv-&gt;lock, NULL);</div><div class='add'>+    pthread_cond_init(&amp;priv-&gt;cond, NULL);</div><div class='add'>+    INIT_LIST_HEAD(&amp;priv-&gt;squeue);</div><div class='add'>+</div><div class='add'>+    /* Thread creations need 'this' to be passed so that THIS can be</div><div class='add'>+     * assigned inside the thread. So setting this-&gt;private here.</div><div class='add'>+     */</div><div class='add'>+    this-&gt;private = priv;</div><div class='add'>+    if (!priv-&gt;do_versioning)</div><div class='add'>+        return 0;</div><div class='add'>+</div><div class='add'>+    ret = gf_thread_create(&amp;priv-&gt;signth, NULL, br_stub_signth, this,</div><div class='add'>+                           "brssign");</div><div class='add'>+    if (ret != 0) {</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_WARNING, 0, BRS_MSG_SPAWN_SIGN_THRD_FAILED,</div><div class='add'>+                NULL);</div><div class='add'>+        goto cleanup_lock;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = br_stub_bad_object_container_init(this, priv);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_ERROR, 0, BRS_MSG_BAD_CONTAINER_FAIL, NULL);</div><div class='add'>+        goto cleanup_lock;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    gf_msg_debug(this-&gt;name, 0, "bit-rot stub loaded");</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+</div><div class='add'>+cleanup_lock:</div><div class='add'>+    pthread_cond_destroy(&amp;priv-&gt;cond);</div><div class='add'>+    pthread_mutex_destroy(&amp;priv-&gt;lock);</div><div class='add'>+free_mempool:</div><div class='add'>+    mem_pool_destroy(priv-&gt;local_pool);</div><div class='add'>+    priv-&gt;local_pool = NULL;</div><div class='add'>+free_priv:</div><div class='add'>+    GF_FREE(priv);</div><div class='add'>+    this-&gt;private = NULL;</div><div class='add'>+error_return:</div><div class='add'>+    return -1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* TODO:</div><div class='add'>+ * As of now enabling bitrot option does 2 things.</div><div class='add'>+ * 1) Start the Bitrot Daemon which signs the objects (currently files only)</div><div class='add'>+ *    upon getting notified by the stub.</div><div class='add'>+ * 2) Enable versioning of the objects. Object versions (again files only) are</div><div class='add'>+ *    incremented upon modification.</div><div class='add'>+ * So object versioning is tied to bitrot daemon's signing. In future, object</div><div class='add'>+ * versioning might be necessary for other things as well apart from bit-rot</div><div class='add'>+ * detection (well that's the objective of bringing in object-versioning :)).</div><div class='add'>+ * In that case, better to make versioning a new option and letting it to be</div><div class='add'>+ * enabled despite bit-rot detection is not needed.</div><div class='add'>+ * Ex: ICAP.</div><div class='add'>+ */</div><div class='add'>+int32_t</div><div class='add'>+reconfigure(xlator_t *this, dict_t *options)</div><div class='add'>+{</div><div class='add'>+    int32_t ret = -1;</div><div class='add'>+    br_stub_private_t *priv = NULL;</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    GF_OPTION_RECONF("bitrot", priv-&gt;do_versioning, options, bool, err);</div><div class='add'>+    if (priv-&gt;do_versioning &amp;&amp; !priv-&gt;signth) {</div><div class='add'>+        ret = gf_thread_create(&amp;priv-&gt;signth, NULL, br_stub_signth, this,</div><div class='add'>+                               "brssign");</div><div class='add'>+        if (ret != 0) {</div><div class='add'>+            gf_smsg(this-&gt;name, GF_LOG_WARNING, 0,</div><div class='add'>+                    BRS_MSG_SPAWN_SIGN_THRD_FAILED, NULL);</div><div class='add'>+            goto err;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        ret = br_stub_bad_object_container_init(this, priv);</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_smsg(this-&gt;name, GF_LOG_ERROR, 0, BRS_MSG_BAD_CONTAINER_FAIL,</div><div class='add'>+                    NULL);</div><div class='add'>+            goto err;</div><div class='add'>+        }</div><div class='add'>+    } else {</div><div class='add'>+        if (priv-&gt;signth) {</div><div class='add'>+            if (gf_thread_cleanup_xint(priv-&gt;signth)) {</div><div class='add'>+                gf_smsg(this-&gt;name, GF_LOG_ERROR, 0,</div><div class='add'>+                        BRS_MSG_CANCEL_SIGN_THREAD_FAILED, NULL);</div><div class='add'>+            } else {</div><div class='add'>+                gf_smsg(this-&gt;name, GF_LOG_INFO, 0, BRS_MSG_KILL_SIGN_THREAD,</div><div class='add'>+                        NULL);</div><div class='add'>+                priv-&gt;signth = 0;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        if (priv-&gt;container.thread) {</div><div class='add'>+            if (gf_thread_cleanup_xint(priv-&gt;container.thread)) {</div><div class='add'>+                gf_smsg(this-&gt;name, GF_LOG_ERROR, 0,</div><div class='add'>+                        BRS_MSG_CANCEL_SIGN_THREAD_FAILED, NULL);</div><div class='add'>+            }</div><div class='add'>+            priv-&gt;container.thread = 0;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+    return ret;</div><div class='add'>+err:</div><div class='add'>+    if (priv-&gt;signth) {</div><div class='add'>+        if (gf_thread_cleanup_xint(priv-&gt;signth)) {</div><div class='add'>+            gf_smsg(this-&gt;name, GF_LOG_ERROR, 0,</div><div class='add'>+                    BRS_MSG_CANCEL_SIGN_THREAD_FAILED, NULL);</div><div class='add'>+        }</div><div class='add'>+        priv-&gt;signth = 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (priv-&gt;container.thread) {</div><div class='add'>+        if (gf_thread_cleanup_xint(priv-&gt;container.thread)) {</div><div class='add'>+            gf_smsg(this-&gt;name, GF_LOG_ERROR, 0,</div><div class='add'>+                    BRS_MSG_CANCEL_SIGN_THREAD_FAILED, NULL);</div><div class='add'>+        }</div><div class='add'>+        priv-&gt;container.thread = 0;</div><div class='add'>+    }</div><div class='add'>+    ret = -1;</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+notify(xlator_t *this, int event, void *data, ...)</div><div class='add'>+{</div><div class='add'>+    br_stub_private_t *priv = NULL;</div><div class='add'>+</div><div class='add'>+    if (!this)</div><div class='add'>+        return 0;</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+    if (!priv)</div><div class='add'>+        return 0;</div><div class='add'>+</div><div class='add'>+    default_notify(this, event, data);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+fini(xlator_t *this)</div><div class='add'>+{</div><div class='add'>+    int32_t ret = 0;</div><div class='add'>+    br_stub_private_t *priv = this-&gt;private;</div><div class='add'>+    struct br_stub_signentry *sigstub = NULL;</div><div class='add'>+    call_stub_t *stub = NULL;</div><div class='add'>+</div><div class='add'>+    if (!priv)</div><div class='add'>+        return;</div><div class='add'>+</div><div class='add'>+    if (!priv-&gt;do_versioning)</div><div class='add'>+        goto cleanup;</div><div class='add'>+</div><div class='add'>+    ret = gf_thread_cleanup_xint(priv-&gt;signth);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_ERROR, 0, BRS_MSG_CANCEL_SIGN_THREAD_FAILED,</div><div class='add'>+                NULL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    priv-&gt;signth = 0;</div><div class='add'>+</div><div class='add'>+    while (!list_empty(&amp;priv-&gt;squeue)) {</div><div class='add'>+        sigstub = list_first_entry(&amp;priv-&gt;squeue, struct br_stub_signentry,</div><div class='add'>+                                   list);</div><div class='add'>+        list_del_init(&amp;sigstub-&gt;list);</div><div class='add'>+</div><div class='add'>+        call_stub_destroy(sigstub-&gt;stub);</div><div class='add'>+        GF_FREE(sigstub);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = gf_thread_cleanup_xint(priv-&gt;container.thread);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_ERROR, 0, BRS_MSG_CANCEL_SIGN_THREAD_FAILED,</div><div class='add'>+                NULL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    priv-&gt;container.thread = 0;</div><div class='add'>+</div><div class='add'>+    while (!list_empty(&amp;priv-&gt;container.bad_queue)) {</div><div class='add'>+        stub = list_first_entry(&amp;priv-&gt;container.bad_queue, call_stub_t, list);</div><div class='add'>+        list_del_init(&amp;stub-&gt;list);</div><div class='add'>+        call_stub_destroy(stub);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    pthread_mutex_destroy(&amp;priv-&gt;container.bad_lock);</div><div class='add'>+    pthread_cond_destroy(&amp;priv-&gt;container.bad_cond);</div><div class='add'>+</div><div class='add'>+cleanup:</div><div class='add'>+    pthread_mutex_destroy(&amp;priv-&gt;lock);</div><div class='add'>+    pthread_cond_destroy(&amp;priv-&gt;cond);</div><div class='add'>+</div><div class='add'>+    if (priv-&gt;local_pool) {</div><div class='add'>+        mem_pool_destroy(priv-&gt;local_pool);</div><div class='add'>+        priv-&gt;local_pool = NULL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    this-&gt;private = NULL;</div><div class='add'>+    GF_FREE(priv);</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+br_stub_alloc_versions(br_version_t **obuf, br_signature_t **sbuf,</div><div class='add'>+                       size_t signaturelen)</div><div class='add'>+{</div><div class='add'>+    void *mem = NULL;</div><div class='add'>+    size_t size = 0;</div><div class='add'>+</div><div class='add'>+    if (obuf)</div><div class='add'>+        size += sizeof(br_version_t);</div><div class='add'>+    if (sbuf)</div><div class='add'>+        size += sizeof(br_signature_t) + signaturelen;</div><div class='add'>+</div><div class='add'>+    mem = GF_CALLOC(1, size, gf_br_stub_mt_version_t);</div><div class='add'>+    if (!mem)</div><div class='add'>+        goto error_return;</div><div class='add'>+</div><div class='add'>+    if (obuf) {</div><div class='add'>+        *obuf = (br_version_t *)mem;</div><div class='add'>+        mem = ((char *)mem + sizeof(br_version_t));</div><div class='add'>+    }</div><div class='add'>+    if (sbuf) {</div><div class='add'>+        *sbuf = (br_signature_t *)mem;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+</div><div class='add'>+error_return:</div><div class='add'>+    return -1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+br_stub_dealloc_versions(void *mem)</div><div class='add'>+{</div><div class='add'>+    GF_FREE(mem);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static br_stub_local_t *</div><div class='add'>+br_stub_alloc_local(xlator_t *this)</div><div class='add'>+{</div><div class='add'>+    br_stub_private_t *priv = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    return mem_get0(priv-&gt;local_pool);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+br_stub_dealloc_local(br_stub_local_t *ptr)</div><div class='add'>+{</div><div class='add'>+    if (!ptr)</div><div class='add'>+        return;</div><div class='add'>+</div><div class='add'>+    mem_put(ptr);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+br_stub_prepare_version_request(xlator_t *this, dict_t *dict,</div><div class='add'>+                                br_version_t *obuf, unsigned long oversion)</div><div class='add'>+{</div><div class='add'>+    br_stub_private_t *priv = NULL;</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+    br_set_ongoingversion(obuf, oversion, priv-&gt;boot);</div><div class='add'>+</div><div class='add'>+    return dict_set_bin(dict, BITROT_CURRENT_VERSION_KEY, (void *)obuf,</div><div class='add'>+                        sizeof(br_version_t));</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+br_stub_prepare_signing_request(dict_t *dict, br_signature_t *sbuf,</div><div class='add'>+                                br_isignature_t *sign, size_t signaturelen)</div><div class='add'>+{</div><div class='add'>+    size_t size = 0;</div><div class='add'>+</div><div class='add'>+    br_set_signature(sbuf, sign, signaturelen, &amp;size);</div><div class='add'>+</div><div class='add'>+    return dict_set_bin(dict, BITROT_SIGNING_VERSION_KEY, (void *)sbuf, size);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/**</div><div class='add'>+ * initialize an inode context starting with a given ongoing version.</div><div class='add'>+ * a fresh lookup() or a first creat() call initializes the inode</div><div class='add'>+ * context, hence the inode is marked dirty. this routine also</div><div class='add'>+ * initializes the transient inode version.</div><div class='add'>+ */</div><div class='add'>+static int</div><div class='add'>+br_stub_init_inode_versions(xlator_t *this, fd_t *fd, inode_t *inode,</div><div class='add'>+                            unsigned long version, gf_boolean_t markdirty,</div><div class='add'>+                            gf_boolean_t bad_object, uint64_t *ctx_addr)</div><div class='add'>+{</div><div class='add'>+    int32_t ret = 0;</div><div class='add'>+    br_stub_inode_ctx_t *ctx = NULL;</div><div class='add'>+</div><div class='add'>+    ctx = GF_CALLOC(1, sizeof(br_stub_inode_ctx_t), gf_br_stub_mt_inode_ctx_t);</div><div class='add'>+    if (!ctx)</div><div class='add'>+        goto error_return;</div><div class='add'>+</div><div class='add'>+    INIT_LIST_HEAD(&amp;ctx-&gt;fd_list);</div><div class='add'>+    (markdirty) ? __br_stub_mark_inode_dirty(ctx)</div><div class='add'>+                : __br_stub_mark_inode_synced(ctx);</div><div class='add'>+    __br_stub_set_ongoing_version(ctx, version);</div><div class='add'>+</div><div class='add'>+    if (bad_object)</div><div class='add'>+        __br_stub_mark_object_bad(ctx);</div><div class='add'>+</div><div class='add'>+    if (fd) {</div><div class='add'>+        ret = br_stub_add_fd_to_inode(this, fd, ctx);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto free_ctx;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = br_stub_set_inode_ctx(this, inode, ctx);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto free_ctx;</div><div class='add'>+</div><div class='add'>+    if (ctx_addr)</div><div class='add'>+        *ctx_addr = (uint64_t)(uintptr_t)ctx;</div><div class='add'>+    return 0;</div><div class='add'>+</div><div class='add'>+free_ctx:</div><div class='add'>+    GF_FREE(ctx);</div><div class='add'>+error_return:</div><div class='add'>+    return -1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/**</div><div class='add'>+ * modify the ongoing version of an inode.</div><div class='add'>+ */</div><div class='add'>+static int</div><div class='add'>+br_stub_mod_inode_versions(xlator_t *this, fd_t *fd, inode_t *inode,</div><div class='add'>+                           unsigned long version)</div><div class='add'>+{</div><div class='add'>+    int32_t ret = -1;</div><div class='add'>+    br_stub_inode_ctx_t *ctx = 0;</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;inode-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        ctx = __br_stub_get_ongoing_version_ctx(this, inode, NULL);</div><div class='add'>+        if (ctx == NULL)</div><div class='add'>+            goto unblock;</div><div class='add'>+        if (__br_stub_is_inode_dirty(ctx)) {</div><div class='add'>+            __br_stub_set_ongoing_version(ctx, version);</div><div class='add'>+            __br_stub_mark_inode_synced(ctx);</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        ret = 0;</div><div class='add'>+    }</div><div class='add'>+unblock:</div><div class='add'>+    UNLOCK(&amp;inode-&gt;lock);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+br_stub_fill_local(br_stub_local_t *local, call_stub_t *stub, fd_t *fd,</div><div class='add'>+                   inode_t *inode, uuid_t gfid, int versioningtype,</div><div class='add'>+                   unsigned long memversion)</div><div class='add'>+{</div><div class='add'>+    local-&gt;fopstub = stub;</div><div class='add'>+    local-&gt;versioningtype = versioningtype;</div><div class='add'>+    local-&gt;u.context.version = memversion;</div><div class='add'>+    if (fd)</div><div class='add'>+        local-&gt;u.context.fd = fd_ref(fd);</div><div class='add'>+    if (inode)</div><div class='add'>+        local-&gt;u.context.inode = inode_ref(inode);</div><div class='add'>+    gf_uuid_copy(local-&gt;u.context.gfid, gfid);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+br_stub_cleanup_local(br_stub_local_t *local)</div><div class='add'>+{</div><div class='add'>+    if (!local)</div><div class='add'>+        return;</div><div class='add'>+</div><div class='add'>+    local-&gt;fopstub = NULL;</div><div class='add'>+    local-&gt;versioningtype = 0;</div><div class='add'>+    local-&gt;u.context.version = 0;</div><div class='add'>+    if (local-&gt;u.context.fd) {</div><div class='add'>+        fd_unref(local-&gt;u.context.fd);</div><div class='add'>+        local-&gt;u.context.fd = NULL;</div><div class='add'>+    }</div><div class='add'>+    if (local-&gt;u.context.inode) {</div><div class='add'>+        inode_unref(local-&gt;u.context.inode);</div><div class='add'>+        local-&gt;u.context.inode = NULL;</div><div class='add'>+    }</div><div class='add'>+    memset(local-&gt;u.context.gfid, '\0', sizeof(uuid_t));</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+br_stub_need_versioning(xlator_t *this, fd_t *fd, gf_boolean_t *versioning,</div><div class='add'>+                        gf_boolean_t *modified, br_stub_inode_ctx_t **ctx)</div><div class='add'>+{</div><div class='add'>+    int32_t ret = -1;</div><div class='add'>+    uint64_t ctx_addr = 0;</div><div class='add'>+    br_stub_inode_ctx_t *c = NULL;</div><div class='add'>+    unsigned long version = BITROT_DEFAULT_CURRENT_VERSION;</div><div class='add'>+</div><div class='add'>+    *versioning = _gf_false;</div><div class='add'>+    *modified = _gf_false;</div><div class='add'>+</div><div class='add'>+    /* Bitrot stub inode context was initialized only in lookup, create</div><div class='add'>+     * and mknod cbk path. Object versioning was enabled by default</div><div class='add'>+     * irrespective of bitrot enabled or not. But it's made optional now.</div><div class='add'>+     * As a consequence there could be cases where getting inode ctx would</div><div class='add'>+     * fail because it's not set yet.</div><div class='add'>+     * e.g., If versioning (with bitrot enable) is enabled while I/O is</div><div class='add'>+     * happening, it could directly get other fops like writev without</div><div class='add'>+     * lookup, where getting inode ctx would fail. Hence initialize the</div><div class='add'>+     * inode ctx on failure to get ctx. This is done in all places where</div><div class='add'>+     * applicable.</div><div class='add'>+     */</div><div class='add'>+    ret = br_stub_get_inode_ctx(this, fd-&gt;inode, &amp;ctx_addr);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        ret = br_stub_init_inode_versions(this, fd, fd-&gt;inode, version,</div><div class='add'>+                                          _gf_true, _gf_false, &amp;ctx_addr);</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_smsg(this-&gt;name, GF_LOG_ERROR, 0,</div><div class='add'>+                    BRS_MSG_GET_INODE_CONTEXT_FAILED, "gfid=%s",</div><div class='add'>+                    uuid_utoa(fd-&gt;inode-&gt;gfid), NULL);</div><div class='add'>+            goto error_return;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    c = (br_stub_inode_ctx_t *)(long)ctx_addr;</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;fd-&gt;inode-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        if (__br_stub_is_inode_dirty(c))</div><div class='add'>+            *versioning = _gf_true;</div><div class='add'>+        if (__br_stub_is_inode_modified(c))</div><div class='add'>+            *modified = _gf_true;</div><div class='add'>+    }</div><div class='add'>+    UNLOCK(&amp;fd-&gt;inode-&gt;lock);</div><div class='add'>+</div><div class='add'>+    if (ctx)</div><div class='add'>+        *ctx = c;</div><div class='add'>+    return 0;</div><div class='add'>+</div><div class='add'>+error_return:</div><div class='add'>+    return -1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int32_t</div><div class='add'>+br_stub_anon_fd_ctx(xlator_t *this, fd_t *fd, br_stub_inode_ctx_t *ctx)</div><div class='add'>+{</div><div class='add'>+    int32_t ret = -1;</div><div class='add'>+    br_stub_fd_t *br_stub_fd = NULL;</div><div class='add'>+</div><div class='add'>+    br_stub_fd = br_stub_fd_ctx_get(this, fd);</div><div class='add'>+    if (!br_stub_fd) {</div><div class='add'>+        ret = br_stub_add_fd_to_inode(this, fd, ctx);</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_smsg(this-&gt;name, GF_LOG_ERROR, 0, BRS_MSG_ADD_FD_TO_INODE,</div><div class='add'>+                    "gfid=%s", uuid_utoa(fd-&gt;inode-&gt;gfid), NULL);</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+br_stub_versioning_prep(call_frame_t *frame, xlator_t *this, fd_t *fd,</div><div class='add'>+                        br_stub_inode_ctx_t *ctx)</div><div class='add'>+{</div><div class='add'>+    int32_t ret = -1;</div><div class='add'>+    br_stub_local_t *local = NULL;</div><div class='add'>+</div><div class='add'>+    local = br_stub_alloc_local(this);</div><div class='add'>+    if (!local) {</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_ERROR, ENOMEM, BRS_MSG_NO_MEMORY, "gfid=%s",</div><div class='add'>+                uuid_utoa(fd-&gt;inode-&gt;gfid), NULL);</div><div class='add'>+        goto error_return;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (fd_is_anonymous(fd)) {</div><div class='add'>+        ret = br_stub_anon_fd_ctx(this, fd, ctx);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto free_local;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    frame-&gt;local = local;</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+</div><div class='add'>+free_local:</div><div class='add'>+    br_stub_dealloc_local(local);</div><div class='add'>+error_return:</div><div class='add'>+    return -1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+br_stub_mark_inode_modified(xlator_t *this, br_stub_local_t *local)</div><div class='add'>+{</div><div class='add'>+    fd_t *fd = NULL;</div><div class='add'>+    int32_t ret = 0;</div><div class='add'>+    uint64_t ctx_addr = 0;</div><div class='add'>+    br_stub_inode_ctx_t *ctx = NULL;</div><div class='add'>+    unsigned long version = BITROT_DEFAULT_CURRENT_VERSION;</div><div class='add'>+</div><div class='add'>+    fd = local-&gt;u.context.fd;</div><div class='add'>+</div><div class='add'>+    ret = br_stub_get_inode_ctx(this, fd-&gt;inode, &amp;ctx_addr);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        ret = br_stub_init_inode_versions(this, fd, fd-&gt;inode, version,</div><div class='add'>+                                          _gf_true, _gf_false, &amp;ctx_addr);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto error_return;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ctx = (br_stub_inode_ctx_t *)(long)ctx_addr;</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;fd-&gt;inode-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        __br_stub_set_inode_modified(ctx);</div><div class='add'>+    }</div><div class='add'>+    UNLOCK(&amp;fd-&gt;inode-&gt;lock);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+</div><div class='add'>+error_return:</div><div class='add'>+    return -1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/**</div><div class='add'>+ * The possible return values from br_stub_is_bad_object () are:</div><div class='add'>+ * 1) 0  =&gt; as per the inode context object is not bad</div><div class='add'>+ * 2) -1 =&gt; Failed to get the inode context itself</div><div class='add'>+ * 3) -2 =&gt; As per the inode context object is bad</div><div class='add'>+ * Both -ve values means the fop which called this function is failed</div><div class='add'>+ * and error is returned upwards.</div><div class='add'>+ */</div><div class='add'>+static int</div><div class='add'>+br_stub_check_bad_object(xlator_t *this, inode_t *inode, int32_t *op_ret,</div><div class='add'>+                         int32_t *op_errno)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    unsigned long version = BITROT_DEFAULT_CURRENT_VERSION;</div><div class='add'>+</div><div class='add'>+    ret = br_stub_is_bad_object(this, inode);</div><div class='add'>+    if (ret == -2) {</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_ERROR, 0, BRS_MSG_BAD_OBJECT_ACCESS,</div><div class='add'>+                "gfid=%s", uuid_utoa(inode-&gt;gfid), NULL);</div><div class='add'>+        *op_ret = -1;</div><div class='add'>+        *op_errno = EIO;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (ret == -1) {</div><div class='add'>+        ret = br_stub_init_inode_versions(this, NULL, inode, version, _gf_true,</div><div class='add'>+                                          _gf_false, NULL);</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_smsg(this-&gt;name, GF_LOG_ERROR, 0,</div><div class='add'>+                    BRS_MSG_GET_INODE_CONTEXT_FAILED, "gfid=%s",</div><div class='add'>+                    uuid_utoa(inode-&gt;gfid), NULL);</div><div class='add'>+            *op_ret = -1;</div><div class='add'>+            *op_errno = EINVAL;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/**</div><div class='add'>+ * callback for inode/fd versioning</div><div class='add'>+ */</div><div class='add'>+int</div><div class='add'>+br_stub_fd_incversioning_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                             int op_ret, int op_errno, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    fd_t *fd = NULL;</div><div class='add'>+    inode_t *inode = NULL;</div><div class='add'>+    unsigned long version = 0;</div><div class='add'>+    br_stub_local_t *local = NULL;</div><div class='add'>+</div><div class='add'>+    local = (br_stub_local_t *)frame-&gt;local;</div><div class='add'>+    if (op_ret &lt; 0)</div><div class='add'>+        goto done;</div><div class='add'>+    fd = local-&gt;u.context.fd;</div><div class='add'>+    inode = local-&gt;u.context.inode;</div><div class='add'>+    version = local-&gt;u.context.version;</div><div class='add'>+</div><div class='add'>+    op_ret = br_stub_mod_inode_versions(this, fd, inode, version);</div><div class='add'>+    if (op_ret &lt; 0)</div><div class='add'>+        op_errno = EINVAL;</div><div class='add'>+</div><div class='add'>+done:</div><div class='add'>+    if (op_ret &lt; 0) {</div><div class='add'>+        frame-&gt;local = NULL;</div><div class='add'>+        call_unwind_error(local-&gt;fopstub, -1, op_errno);</div><div class='add'>+        br_stub_cleanup_local(local);</div><div class='add'>+        br_stub_dealloc_local(local);</div><div class='add'>+    } else {</div><div class='add'>+        call_resume(local-&gt;fopstub);</div><div class='add'>+    }</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/**</div><div class='add'>+ * Initial object versioning</div><div class='add'>+ *</div><div class='add'>+ * Version persists two (2) extended attributes as explained below:</div><div class='add'>+ *   1. Current (ongoing) version: This is incremented on an writev ()</div><div class='add'>+ *      or truncate () and is the running version for an object.</div><div class='add'>+ *   2. Signing version: This is the version against which an object</div><div class='add'>+ *      was signed (checksummed).</div><div class='add'>+ *</div><div class='add'>+ * During initial versioning, both ongoing and signing versions are</div><div class='add'>+ * set of one and zero respectively. A write() call increments the</div><div class='add'>+ * ongoing version as an indication of modification to the object.</div><div class='add'>+ * Additionally this needs to be persisted on disk and needs to be</div><div class='add'>+ * durable: fsync().. :-/</div><div class='add'>+ * As an optimization only the first write() synchronizes the ongoing</div><div class='add'>+ * version to disk, subsequent write()s before the *last* release()</div><div class='add'>+ * are no-op's.</div><div class='add'>+ *</div><div class='add'>+ * create(), just like lookup() initializes the object versions to</div><div class='add'>+ * the default. As an optimization this is not a durable operation:</div><div class='add'>+ * in case of a crash, hard reboot etc.. absence of versioning xattrs</div><div class='add'>+ * is ignored in scrubber along with the one time crawler explicitly</div><div class='add'>+ * triggering signing for such objects.</div><div class='add'>+ *</div><div class='add'>+ * c.f. br_stub_writev() / br_stub_truncate()</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+/**</div><div class='add'>+ * perform full or incremental versioning on an inode pointd by an</div><div class='add'>+ * fd. incremental versioning is done when an inode is dirty and a</div><div class='add'>+ * writeback is triggered.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+br_stub_fd_versioning(xlator_t *this, call_frame_t *frame, call_stub_t *stub,</div><div class='add'>+                      dict_t *dict, fd_t *fd, br_stub_version_cbk *callback,</div><div class='add'>+                      unsigned long memversion, int versioningtype, int durable)</div><div class='add'>+{</div><div class='add'>+    int32_t ret = -1;</div><div class='add'>+    int flags = 0;</div><div class='add'>+    dict_t *xdata = NULL;</div><div class='add'>+    br_stub_local_t *local = NULL;</div><div class='add'>+</div><div class='add'>+    xdata = dict_new();</div><div class='add'>+    if (!xdata)</div><div class='add'>+        goto done;</div><div class='add'>+</div><div class='add'>+    ret = dict_set_int32(xdata, GLUSTERFS_INTERNAL_FOP_KEY, 1);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto dealloc_xdata;</div><div class='add'>+</div><div class='add'>+    if (durable) {</div><div class='add'>+        ret = dict_set_int32(xdata, GLUSTERFS_DURABLE_OP, 0);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto dealloc_xdata;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+</div><div class='add'>+    br_stub_fill_local(local, stub, fd, fd-&gt;inode, fd-&gt;inode-&gt;gfid,</div><div class='add'>+                       versioningtype, memversion);</div><div class='add'>+</div><div class='add'>+    STACK_WIND(frame, callback, FIRST_CHILD(this),</div><div class='add'>+               FIRST_CHILD(this)-&gt;fops-&gt;fsetxattr, fd, dict, flags, xdata);</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+</div><div class='add'>+dealloc_xdata:</div><div class='add'>+    dict_unref(xdata);</div><div class='add'>+done:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+br_stub_perform_incversioning(xlator_t *this, call_frame_t *frame,</div><div class='add'>+                              call_stub_t *stub, fd_t *fd,</div><div class='add'>+                              br_stub_inode_ctx_t *ctx)</div><div class='add'>+{</div><div class='add'>+    int32_t ret = -1;</div><div class='add'>+    dict_t *dict = NULL;</div><div class='add'>+    br_version_t *obuf = NULL;</div><div class='add'>+    unsigned long writeback_version = 0;</div><div class='add'>+    int op_errno = 0;</div><div class='add'>+    br_stub_local_t *local = NULL;</div><div class='add'>+</div><div class='add'>+    op_errno = EINVAL;</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+</div><div class='add'>+    writeback_version = __br_stub_writeback_version(ctx);</div><div class='add'>+</div><div class='add'>+    op_errno = ENOMEM;</div><div class='add'>+    dict = dict_new();</div><div class='add'>+    if (!dict)</div><div class='add'>+        goto out;</div><div class='add'>+    ret = br_stub_alloc_versions(&amp;obuf, NULL, 0);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_ERROR, 0, BRS_MSG_ALLOC_MEM_FAILED,</div><div class='add'>+                "gfid=%s", uuid_utoa(fd-&gt;inode-&gt;gfid), NULL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    ret = br_stub_prepare_version_request(this, dict, obuf, writeback_version);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_ERROR, 0, BRS_MSG_VERSION_PREPARE_FAIL,</div><div class='add'>+                "gfid=%s", uuid_utoa(fd-&gt;inode-&gt;gfid), NULL);</div><div class='add'>+        br_stub_dealloc_versions(obuf);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = br_stub_fd_versioning(</div><div class='add'>+        this, frame, stub, dict, fd, br_stub_fd_incversioning_cbk,</div><div class='add'>+        writeback_version, BR_STUB_INCREMENTAL_VERSIONING, !WRITEBACK_DURABLE);</div><div class='add'>+out:</div><div class='add'>+    if (dict)</div><div class='add'>+        dict_unref(dict);</div><div class='add'>+    if (ret) {</div><div class='add'>+        if (local)</div><div class='add'>+            frame-&gt;local = NULL;</div><div class='add'>+        call_unwind_error(stub, -1, op_errno);</div><div class='add'>+        if (local) {</div><div class='add'>+            br_stub_cleanup_local(local);</div><div class='add'>+            br_stub_dealloc_local(local);</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/** {{{ */</div><div class='add'>+</div><div class='add'>+/* fsetxattr() */</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+br_stub_perform_objsign(call_frame_t *frame, xlator_t *this, fd_t *fd,</div><div class='add'>+                        dict_t *dict, int flags, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    STACK_WIND(frame, default_fsetxattr_cbk, FIRST_CHILD(this),</div><div class='add'>+               FIRST_CHILD(this)-&gt;fops-&gt;fsetxattr, fd, dict, flags, xdata);</div><div class='add'>+</div><div class='add'>+    dict_unref(xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void *</div><div class='add'>+br_stub_signth(void *arg)</div><div class='add'>+{</div><div class='add'>+    xlator_t *this = arg;</div><div class='add'>+    br_stub_private_t *priv = this-&gt;private;</div><div class='add'>+    struct br_stub_signentry *sigstub = NULL;</div><div class='add'>+</div><div class='add'>+    THIS = this;</div><div class='add'>+    while (1) {</div><div class='add'>+        /*</div><div class='add'>+         * Disabling bit-rot feature leads to this particular thread</div><div class='add'>+         * getting cleaned up by reconfigure via a call to the function</div><div class='add'>+         * gf_thread_cleanup_xint (which in turn calls pthread_cancel</div><div class='add'>+         * and pthread_join). But, if this thread had held the mutex</div><div class='add'>+         * &amp;priv-&gt;lock at the time of cancellation, then it leads to</div><div class='add'>+         * deadlock in future when bit-rot feature is enabled (which</div><div class='add'>+         * again spawns this thread which cant hold the lock as the</div><div class='add'>+         * mutex is still held by the previous instance of the thread</div><div class='add'>+         * which got killed). Also, the br_stub_handle_object_signature</div><div class='add'>+         * function which is called whenever file has to be signed</div><div class='add'>+         * also gets blocked as it too attempts to acquire &amp;priv-&gt;lock.</div><div class='add'>+         *</div><div class='add'>+         * So, arrange for the lock to be unlocked as part of the</div><div class='add'>+         * cleanup of this thread using pthread_cleanup_push and</div><div class='add'>+         * pthread_cleanup_pop.</div><div class='add'>+         */</div><div class='add'>+        pthread_cleanup_push(br_stub_lock_cleaner, &amp;priv-&gt;lock);</div><div class='add'>+        pthread_mutex_lock(&amp;priv-&gt;lock);</div><div class='add'>+        {</div><div class='add'>+            while (list_empty(&amp;priv-&gt;squeue))</div><div class='add'>+                pthread_cond_wait(&amp;priv-&gt;cond, &amp;priv-&gt;lock);</div><div class='add'>+</div><div class='add'>+            sigstub = list_first_entry(&amp;priv-&gt;squeue, struct br_stub_signentry,</div><div class='add'>+                                       list);</div><div class='add'>+            list_del_init(&amp;sigstub-&gt;list);</div><div class='add'>+        }</div><div class='add'>+        pthread_mutex_unlock(&amp;priv-&gt;lock);</div><div class='add'>+        pthread_cleanup_pop(0);</div><div class='add'>+</div><div class='add'>+        call_resume(sigstub-&gt;stub);</div><div class='add'>+</div><div class='add'>+        GF_FREE(sigstub);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return NULL;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static gf_boolean_t</div><div class='add'>+br_stub_internal_xattr(dict_t *dict)</div><div class='add'>+{</div><div class='add'>+    if (dict_get(dict, GLUSTERFS_SET_OBJECT_SIGNATURE) ||</div><div class='add'>+        dict_get(dict, GLUSTERFS_GET_OBJECT_SIGNATURE) ||</div><div class='add'>+        dict_get(dict, BR_REOPEN_SIGN_HINT_KEY) ||</div><div class='add'>+        dict_get(dict, BITROT_OBJECT_BAD_KEY) ||</div><div class='add'>+        dict_get(dict, BITROT_SIGNING_VERSION_KEY) ||</div><div class='add'>+        dict_get(dict, BITROT_CURRENT_VERSION_KEY))</div><div class='add'>+        return _gf_true;</div><div class='add'>+</div><div class='add'>+    return _gf_false;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+orderq(struct list_head *elem1, struct list_head *elem2)</div><div class='add'>+{</div><div class='add'>+    struct br_stub_signentry *s1 = NULL;</div><div class='add'>+    struct br_stub_signentry *s2 = NULL;</div><div class='add'>+</div><div class='add'>+    s1 = list_entry(elem1, struct br_stub_signentry, list);</div><div class='add'>+    s2 = list_entry(elem2, struct br_stub_signentry, list);</div><div class='add'>+</div><div class='add'>+    return (s1-&gt;v &gt; s2-&gt;v);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+br_stub_compare_sign_version(xlator_t *this, inode_t *inode,</div><div class='add'>+                             br_signature_t *sbuf, dict_t *dict,</div><div class='add'>+                             int *fakesuccess)</div><div class='add'>+{</div><div class='add'>+    int32_t ret = -1;</div><div class='add'>+    uint64_t tmp_ctx = 0;</div><div class='add'>+    gf_boolean_t invalid = _gf_false;</div><div class='add'>+    br_stub_inode_ctx_t *ctx = NULL;</div><div class='add'>+</div><div class='add'>+    GF_VALIDATE_OR_GOTO("bit-rot-stub", this, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, inode, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, sbuf, out);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, dict, out);</div><div class='add'>+</div><div class='add'>+    ret = br_stub_get_inode_ctx(this, inode, &amp;tmp_ctx);</div><div class='add'>+    if (ret) {</div><div class='add'>+        dict_del(dict, BITROT_SIGNING_VERSION_KEY);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ctx = (br_stub_inode_ctx_t *)(long)tmp_ctx;</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;inode-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        if (ctx-&gt;currentversion &lt; sbuf-&gt;signedversion) {</div><div class='add'>+            invalid = _gf_true;</div><div class='add'>+        } else if (ctx-&gt;currentversion &gt; sbuf-&gt;signedversion) {</div><div class='add'>+            gf_msg_debug(this-&gt;name, 0,</div><div class='add'>+                         "\"Signing version\" "</div><div class='add'>+                         "(%lu) lower than \"Current version \" "</div><div class='add'>+                         "(%lu)",</div><div class='add'>+                         ctx-&gt;currentversion, sbuf-&gt;signedversion);</div><div class='add'>+            *fakesuccess = 1;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    UNLOCK(&amp;inode-&gt;lock);</div><div class='add'>+</div><div class='add'>+    if (invalid) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_WARNING, 0, BRS_MSG_SIGN_VERSION_ERROR,</div><div class='add'>+                "Signing-ver=%lu", sbuf-&gt;signedversion, "current-ver=%lu",</div><div class='add'>+                ctx-&gt;currentversion, NULL);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+br_stub_prepare_signature(xlator_t *this, dict_t *dict, inode_t *inode,</div><div class='add'>+                          br_isignature_t *sign, int *fakesuccess)</div><div class='add'>+{</div><div class='add'>+    int32_t ret = -1;</div><div class='add'>+    size_t signaturelen = 0;</div><div class='add'>+    br_signature_t *sbuf = NULL;</div><div class='add'>+</div><div class='add'>+    if (!br_is_signature_type_valid(sign-&gt;signaturetype))</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    signaturelen = sign-&gt;signaturelen;</div><div class='add'>+    ret = br_stub_alloc_versions(NULL, &amp;sbuf, signaturelen);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_ERROR, 0, BRS_MSG_ALLOC_MEM_FAILED,</div><div class='add'>+                "gfid=%s", uuid_utoa(inode-&gt;gfid), NULL);</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    ret = br_stub_prepare_signing_request(dict, sbuf, sign, signaturelen);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_ERROR, 0, BRS_MSG_SIGN_PREPARE_FAIL,</div><div class='add'>+                "gfid=%s", uuid_utoa(inode-&gt;gfid), NULL);</div><div class='add'>+        ret = -1;</div><div class='add'>+        br_stub_dealloc_versions(sbuf);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* At this point sbuf has been added to dict, so the memory will be freed</div><div class='add'>+     * when the data from the dict is destroyed</div><div class='add'>+     */</div><div class='add'>+    ret = br_stub_compare_sign_version(this, inode, sbuf, dict, fakesuccess);</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+br_stub_handle_object_signature(call_frame_t *frame, xlator_t *this, fd_t *fd,</div><div class='add'>+                                dict_t *dict, br_isignature_t *sign,</div><div class='add'>+                                dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    int32_t ret = -1;</div><div class='add'>+    int32_t op_ret = -1;</div><div class='add'>+    int32_t op_errno = EINVAL;</div><div class='add'>+    int fakesuccess = 0;</div><div class='add'>+    br_stub_private_t *priv = NULL;</div><div class='add'>+    struct br_stub_signentry *sigstub = NULL;</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    if (frame-&gt;root-&gt;pid != GF_CLIENT_PID_BITD) {</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_WARNING, op_errno, BRS_MSG_NON_BITD_PID,</div><div class='add'>+                "PID=%d", frame-&gt;root-&gt;pid, NULL);</div><div class='add'>+        goto dofop;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = br_stub_prepare_signature(this, dict, fd-&gt;inode, sign, &amp;fakesuccess);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_WARNING, 0, BRS_MSG_SIGN_PREPARE_FAIL,</div><div class='add'>+                "gfid=%s", uuid_utoa(fd-&gt;inode-&gt;gfid), NULL);</div><div class='add'>+        goto dofop;</div><div class='add'>+    }</div><div class='add'>+    if (fakesuccess) {</div><div class='add'>+        op_ret = op_errno = 0;</div><div class='add'>+        goto dofop;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    dict_del(dict, GLUSTERFS_SET_OBJECT_SIGNATURE);</div><div class='add'>+</div><div class='add'>+    ret = -1;</div><div class='add'>+    if (!xdata) {</div><div class='add'>+        xdata = dict_new();</div><div class='add'>+        if (!xdata)</div><div class='add'>+            goto dofop;</div><div class='add'>+    } else {</div><div class='add'>+        dict_ref(xdata);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_set_int32(xdata, GLUSTERFS_DURABLE_OP, 0);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto unref_dict;</div><div class='add'>+</div><div class='add'>+    /* prepare dispatch stub to order object signing */</div><div class='add'>+    sigstub = GF_CALLOC(1, sizeof(*sigstub), gf_br_stub_mt_sigstub_t);</div><div class='add'>+    if (!sigstub)</div><div class='add'>+        goto unref_dict;</div><div class='add'>+</div><div class='add'>+    INIT_LIST_HEAD(&amp;sigstub-&gt;list);</div><div class='add'>+    sigstub-&gt;v = ntohl(sign-&gt;signedversion);</div><div class='add'>+    sigstub-&gt;stub = fop_fsetxattr_stub(frame, br_stub_perform_objsign, fd, dict,</div><div class='add'>+                                       0, xdata);</div><div class='add'>+    if (!sigstub-&gt;stub)</div><div class='add'>+        goto cleanup_stub;</div><div class='add'>+</div><div class='add'>+    pthread_mutex_lock(&amp;priv-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        list_add_order(&amp;sigstub-&gt;list, &amp;priv-&gt;squeue, orderq);</div><div class='add'>+        pthread_cond_signal(&amp;priv-&gt;cond);</div><div class='add'>+    }</div><div class='add'>+    pthread_mutex_unlock(&amp;priv-&gt;lock);</div><div class='add'>+</div><div class='add'>+    return;</div><div class='add'>+</div><div class='add'>+cleanup_stub:</div><div class='add'>+    GF_FREE(sigstub);</div><div class='add'>+unref_dict:</div><div class='add'>+    dict_unref(xdata);</div><div class='add'>+dofop:</div><div class='add'>+    STACK_UNWIND_STRICT(fsetxattr, frame, op_ret, op_errno, NULL);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+br_stub_fsetxattr_resume(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                         int32_t op_ret, int32_t op_errno, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    int32_t ret = -1;</div><div class='add'>+    br_stub_local_t *local = NULL;</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    frame-&gt;local = NULL;</div><div class='add'>+</div><div class='add'>+    ret = br_stub_mark_inode_modified(this, local);</div><div class='add'>+    if (ret) {</div><div class='add'>+        op_ret = -1;</div><div class='add'>+        op_errno = EINVAL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    STACK_UNWIND_STRICT(fsetxattr, frame, op_ret, op_errno, xdata);</div><div class='add'>+</div><div class='add'>+    br_stub_cleanup_local(local);</div><div class='add'>+    br_stub_dealloc_local(local);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/**</div><div class='add'>+ * Handles object reopens. Object reopens can be of 3 types. 2 are from</div><div class='add'>+ * oneshot crawler and 1 from the regular signer.</div><div class='add'>+ * ONESHOT CRAWLER:</div><div class='add'>+ * For those objects which were created before bitrot was enabled. oneshow</div><div class='add'>+ * crawler crawls the namespace and signs all the objects. It has to do</div><div class='add'>+ * the versioning before making bit-rot-stub send a sign notification.</div><div class='add'>+ * So it sends fsetxattr with BR_OBJECT_REOPEN as the value. And bit-rot-stub</div><div class='add'>+ * upon getting BR_OBJECT_REOPEN value checks if the version has to be</div><div class='add'>+ * increased or not. By default the version will be increased. But if the</div><div class='add'>+ * object is modified before BR_OBJECT_REOPEN from oneshot crawler, then</div><div class='add'>+ * versioning need not be done. In that case simply a success is returned.</div><div class='add'>+ * SIGNER:</div><div class='add'>+ * Signer wait for 2 minutes upon getting the notification from bit-rot-stub</div><div class='add'>+ * and then it sends a dummy write (in reality a fsetxattr) call, to change</div><div class='add'>+ * the state of the inode from REOPEN_WAIT to SIGN_QUICK. The funny part here</div><div class='add'>+ * is though the inode's state is REOPEN_WAIT, the call sent by signer is</div><div class='add'>+ * BR_OBJECT_RESIGN. Once the state is changed to SIGN_QUICK, then yet another</div><div class='add'>+ * notification is sent upon release (RESIGN would have happened via fsetxattr,</div><div class='add'>+ * so a fd is needed) and the object is signed truly this time.</div><div class='add'>+ * There is a challenge in the above RESIGN method by signer. After sending</div><div class='add'>+ * the 1st notification, the inode could be forgotten before RESIGN request</div><div class='add'>+ * is received. In that case, the inode's context (the newly looked up inode)</div><div class='add'>+ * would not indicate the inode as being modified (it would be in the default</div><div class='add'>+ * state) and because of this, a SIGN_QUICK notification to truly sign the</div><div class='add'>+ * object would not be sent. So, this is how its handled.</div><div class='add'>+ * if (request == RESIGN) {</div><div class='add'>+ *    if (inode-&gt;sign_info == NORMAL) {</div><div class='add'>+ *        mark_inode_non_dirty;</div><div class='add'>+ *        mark_inode_modified;</div><div class='add'>+ *    }</div><div class='add'>+ *    GOBACK (means unwind without doing versioning)</div><div class='add'>+ * }</div><div class='add'>+ */</div><div class='add'>+static void</div><div class='add'>+br_stub_handle_object_reopen(call_frame_t *frame, xlator_t *this, fd_t *fd,</div><div class='add'>+                             uint32_t val)</div><div class='add'>+{</div><div class='add'>+    int32_t ret = -1;</div><div class='add'>+    int32_t op_ret = -1;</div><div class='add'>+    int32_t op_errno = EINVAL;</div><div class='add'>+    call_stub_t *stub = NULL;</div><div class='add'>+    gf_boolean_t inc_version = _gf_false;</div><div class='add'>+    gf_boolean_t modified = _gf_false;</div><div class='add'>+    br_stub_inode_ctx_t *ctx = NULL;</div><div class='add'>+    br_stub_local_t *local = NULL;</div><div class='add'>+    gf_boolean_t goback = _gf_true;</div><div class='add'>+</div><div class='add'>+    ret = br_stub_need_versioning(this, fd, &amp;inc_version, &amp;modified, &amp;ctx);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto unwind;</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;fd-&gt;inode-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        if ((val == BR_OBJECT_REOPEN) &amp;&amp; inc_version)</div><div class='add'>+            goback = _gf_false;</div><div class='add'>+        if (val == BR_OBJECT_RESIGN &amp;&amp; ctx-&gt;info_sign == BR_SIGN_NORMAL) {</div><div class='add'>+            __br_stub_mark_inode_synced(ctx);</div><div class='add'>+            __br_stub_set_inode_modified(ctx);</div><div class='add'>+        }</div><div class='add'>+        (void)__br_stub_inode_sign_state(ctx, GF_FOP_FSETXATTR, fd);</div><div class='add'>+    }</div><div class='add'>+    UNLOCK(&amp;fd-&gt;inode-&gt;lock);</div><div class='add'>+</div><div class='add'>+    if (goback) {</div><div class='add'>+        op_ret = op_errno = 0;</div><div class='add'>+        goto unwind;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = br_stub_versioning_prep(frame, this, fd, ctx);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto unwind;</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+</div><div class='add'>+    stub = fop_fsetxattr_cbk_stub(frame, br_stub_fsetxattr_resume, 0, 0, NULL);</div><div class='add'>+    if (!stub) {</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_ERROR, 0, BRS_MSG_STUB_ALLOC_FAILED,</div><div class='add'>+                "fsetxattr gfid=%s", uuid_utoa(fd-&gt;inode-&gt;gfid), NULL);</div><div class='add'>+        goto cleanup_local;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    (void)br_stub_perform_incversioning(this, frame, stub, fd, ctx);</div><div class='add'>+    return;</div><div class='add'>+</div><div class='add'>+cleanup_local:</div><div class='add'>+    br_stub_cleanup_local(local);</div><div class='add'>+    br_stub_dealloc_local(local);</div><div class='add'>+</div><div class='add'>+unwind:</div><div class='add'>+    frame-&gt;local = NULL;</div><div class='add'>+    STACK_UNWIND_STRICT(fsetxattr, frame, op_ret, op_errno, NULL);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/**</div><div class='add'>+ * This function only handles bad file identification. Instead of checking in</div><div class='add'>+ * fops like open, readv, writev whether the object is bad or not by doing</div><div class='add'>+ * getxattr calls, better to catch them when scrubber marks it as bad.</div><div class='add'>+ * So this callback is called only when the fsetxattr is sent by the scrubber</div><div class='add'>+ * to mark the object as bad.</div><div class='add'>+ */</div><div class='add'>+int</div><div class='add'>+br_stub_fsetxattr_bad_object_cbk(call_frame_t *frame, void *cookie,</div><div class='add'>+                                 xlator_t *this, int32_t op_ret,</div><div class='add'>+                                 int32_t op_errno, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    br_stub_local_t *local = NULL;</div><div class='add'>+    int32_t ret = -1;</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    frame-&gt;local = NULL;</div><div class='add'>+</div><div class='add'>+    if (op_ret &lt; 0)</div><div class='add'>+        goto unwind;</div><div class='add'>+</div><div class='add'>+    /*</div><div class='add'>+     * What to do if marking the object as bad fails? (i.e. in memory</div><div class='add'>+     * marking within the inode context. If we are here means fsetxattr</div><div class='add'>+     * fop has succeeded on disk and the bad object xattr has been set).</div><div class='add'>+     * We can return failure to scruber, but there is nothing the scrubber</div><div class='add'>+     * can do with it (it might assume that the on disk setxattr itself has</div><div class='add'>+     * failed). The main purpose of this operation is to help identify the</div><div class='add'>+     * bad object by checking the inode context itself (thus avoiding the</div><div class='add'>+     * necessity of doing a getxattr fop on the disk).</div><div class='add'>+     *</div><div class='add'>+     * So as of now, success itself is being returned even though inode</div><div class='add'>+     * context set operation fails.</div><div class='add'>+     * In future if there is any change in the policy which can handle this,</div><div class='add'>+     * then appropriate response should be sent (i.e. success or error).</div><div class='add'>+     */</div><div class='add'>+    ret = br_stub_mark_object_bad(this, local-&gt;u.context.inode);</div><div class='add'>+    if (ret)</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_ERROR, 0, BRS_MSG_BAD_OBJ_MARK_FAIL,</div><div class='add'>+                "gfid=%s", uuid_utoa(local-&gt;u.context.inode-&gt;gfid), NULL);</div><div class='add'>+</div><div class='add'>+    ret = br_stub_add(this, local-&gt;u.context.inode-&gt;gfid);</div><div class='add'>+</div><div class='add'>+unwind:</div><div class='add'>+    STACK_UNWIND_STRICT(fsetxattr, frame, op_ret, op_errno, xdata);</div><div class='add'>+    br_stub_cleanup_local(local);</div><div class='add'>+    br_stub_dealloc_local(local);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int32_t</div><div class='add'>+br_stub_handle_bad_object_key(call_frame_t *frame, xlator_t *this, fd_t *fd,</div><div class='add'>+                              dict_t *dict, int flags, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    br_stub_local_t *local = NULL;</div><div class='add'>+    int32_t op_ret = -1;</div><div class='add'>+    int32_t op_errno = EINVAL;</div><div class='add'>+</div><div class='add'>+    if (frame-&gt;root-&gt;pid != GF_CLIENT_PID_SCRUB) {</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_ERROR, 0, BRS_MSG_NON_SCRUB_BAD_OBJ_MARK,</div><div class='add'>+                "gfid=%s", uuid_utoa(fd-&gt;inode-&gt;gfid), NULL);</div><div class='add'>+        goto unwind;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    local = br_stub_alloc_local(this);</div><div class='add'>+    if (!local) {</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_ERROR, 0, BRS_MSG_ALLOC_MEM_FAILED,</div><div class='add'>+                "fsetxattr gfid=%s", uuid_utoa(fd-&gt;inode-&gt;gfid), NULL);</div><div class='add'>+        op_ret = -1;</div><div class='add'>+        op_errno = ENOMEM;</div><div class='add'>+        goto unwind;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    br_stub_fill_local(local, NULL, fd, fd-&gt;inode, fd-&gt;inode-&gt;gfid,</div><div class='add'>+                       BR_STUB_NO_VERSIONING, 0);</div><div class='add'>+    frame-&gt;local = local;</div><div class='add'>+</div><div class='add'>+    STACK_WIND(frame, br_stub_fsetxattr_bad_object_cbk, FIRST_CHILD(this),</div><div class='add'>+               FIRST_CHILD(this)-&gt;fops-&gt;fsetxattr, fd, dict, flags, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+unwind:</div><div class='add'>+    STACK_UNWIND_STRICT(fsetxattr, frame, op_ret, op_errno, NULL);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/**</div><div class='add'>+ * As of now, versioning is done by the stub (though as a setxattr</div><div class='add'>+ * operation) as part of inode modification operations such as writev,</div><div class='add'>+ * truncate, ftruncate. And signing is done by BitD by a fsetxattr call.</div><div class='add'>+ * So any kind of setxattr coming on the versioning and the signing xattr is</div><div class='add'>+ * not allowed (i.e. BITROT_CURRENT_VERSION_KEY and BITROT_SIGNING_VERSION_KEY).</div><div class='add'>+ * In future if BitD/scrubber are allowed to change the versioning</div><div class='add'>+ * xattrs (though I cannot see a reason for it as of now), then the below</div><div class='add'>+ * function can be modified to block setxattr on version for only applications.</div><div class='add'>+ *</div><div class='add'>+ * NOTE: BitD sends sign request on GLUSTERFS_SET_OBJECT_SIGNATURE key.</div><div class='add'>+ *       BITROT_SIGNING_VERSION_KEY is the xattr used to save the signature.</div><div class='add'>+ *</div><div class='add'>+ */</div><div class='add'>+static int32_t</div><div class='add'>+br_stub_handle_internal_xattr(call_frame_t *frame, xlator_t *this, fd_t *fd,</div><div class='add'>+                              char *key)</div><div class='add'>+{</div><div class='add'>+    int32_t op_ret = -1;</div><div class='add'>+    int32_t op_errno = EINVAL;</div><div class='add'>+</div><div class='add'>+    gf_smsg(this-&gt;name, GF_LOG_ERROR, 0, BRS_MSG_SET_INTERNAL_XATTR,</div><div class='add'>+            "setxattr key=%s", key, "inode-gfid=%s", uuid_utoa(fd-&gt;inode-&gt;gfid),</div><div class='add'>+            NULL);</div><div class='add'>+</div><div class='add'>+    STACK_UNWIND_STRICT(fsetxattr, frame, op_ret, op_errno, NULL);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+br_stub_dump_xattr(xlator_t *this, dict_t *dict, int *op_errno)</div><div class='add'>+{</div><div class='add'>+    char *format = "(%s:%s)";</div><div class='add'>+    char *dump = NULL;</div><div class='add'>+</div><div class='add'>+    dump = GF_CALLOC(1, BR_STUB_DUMP_STR_SIZE, gf_br_stub_mt_misc);</div><div class='add'>+    if (!dump) {</div><div class='add'>+        *op_errno = ENOMEM;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    dict_dump_to_str(dict, dump, BR_STUB_DUMP_STR_SIZE, format);</div><div class='add'>+    gf_smsg(this-&gt;name, GF_LOG_ERROR, 0, BRS_MSG_SET_INTERNAL_XATTR,</div><div class='add'>+            "fsetxattr dump=%s", dump, NULL);</div><div class='add'>+out:</div><div class='add'>+    if (dump) {</div><div class='add'>+        GF_FREE(dump);</div><div class='add'>+    }</div><div class='add'>+    return;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+br_stub_fsetxattr(call_frame_t *frame, xlator_t *this, fd_t *fd, dict_t *dict,</div><div class='add'>+                  int flags, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    int32_t ret = 0;</div><div class='add'>+    uint32_t val = 0;</div><div class='add'>+    br_isignature_t *sign = NULL;</div><div class='add'>+    br_stub_private_t *priv = NULL;</div><div class='add'>+    int32_t op_ret = -1;</div><div class='add'>+    int32_t op_errno = EINVAL;</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    if ((frame-&gt;root-&gt;pid != GF_CLIENT_PID_BITD &amp;&amp;</div><div class='add'>+         frame-&gt;root-&gt;pid != GF_CLIENT_PID_SCRUB) &amp;&amp;</div><div class='add'>+        br_stub_internal_xattr(dict)) {</div><div class='add'>+        br_stub_dump_xattr(this, dict, &amp;op_errno);</div><div class='add'>+        goto unwind;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (!priv-&gt;do_versioning)</div><div class='add'>+        goto wind;</div><div class='add'>+</div><div class='add'>+    if (!IA_ISREG(fd-&gt;inode-&gt;ia_type))</div><div class='add'>+        goto wind;</div><div class='add'>+</div><div class='add'>+    /* object signature request */</div><div class='add'>+    ret = dict_get_bin(dict, GLUSTERFS_SET_OBJECT_SIGNATURE, (void **)&amp;sign);</div><div class='add'>+    if (!ret) {</div><div class='add'>+        gf_msg_debug(this-&gt;name, 0, "got SIGNATURE request on %s",</div><div class='add'>+                     uuid_utoa(fd-&gt;inode-&gt;gfid));</div><div class='add'>+        br_stub_handle_object_signature(frame, this, fd, dict, sign, xdata);</div><div class='add'>+        goto done;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* signing xattr */</div><div class='add'>+    if (dict_get(dict, BITROT_SIGNING_VERSION_KEY)) {</div><div class='add'>+        br_stub_handle_internal_xattr(frame, this, fd,</div><div class='add'>+                                      BITROT_SIGNING_VERSION_KEY);</div><div class='add'>+        goto done;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* version xattr */</div><div class='add'>+    if (dict_get(dict, BITROT_CURRENT_VERSION_KEY)) {</div><div class='add'>+        br_stub_handle_internal_xattr(frame, this, fd,</div><div class='add'>+                                      BITROT_CURRENT_VERSION_KEY);</div><div class='add'>+        goto done;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (dict_get(dict, GLUSTERFS_GET_OBJECT_SIGNATURE)) {</div><div class='add'>+        br_stub_handle_internal_xattr(frame, this, fd,</div><div class='add'>+                                      GLUSTERFS_GET_OBJECT_SIGNATURE);</div><div class='add'>+        goto done;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* object reopen request */</div><div class='add'>+    ret = dict_get_uint32(dict, BR_REOPEN_SIGN_HINT_KEY, &amp;val);</div><div class='add'>+    if (!ret) {</div><div class='add'>+        br_stub_handle_object_reopen(frame, this, fd, val);</div><div class='add'>+        goto done;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* handle bad object */</div><div class='add'>+    if (dict_get(dict, BITROT_OBJECT_BAD_KEY)) {</div><div class='add'>+        br_stub_handle_bad_object_key(frame, this, fd, dict, flags, xdata);</div><div class='add'>+        goto done;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+wind:</div><div class='add'>+    STACK_WIND(frame, default_fsetxattr_cbk, FIRST_CHILD(this),</div><div class='add'>+               FIRST_CHILD(this)-&gt;fops-&gt;fsetxattr, fd, dict, flags, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+</div><div class='add'>+unwind:</div><div class='add'>+    STACK_UNWIND_STRICT(fsetxattr, frame, op_ret, op_errno, NULL);</div><div class='add'>+</div><div class='add'>+done:</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/**</div><div class='add'>+ * Currently BitD and scrubber are doing fsetxattr to either sign the object</div><div class='add'>+ * or to mark it as bad. Hence setxattr on any of those keys is denied directly</div><div class='add'>+ * without checking from where the fop is coming.</div><div class='add'>+ * Later, if BitD or Scrubber does setxattr of those keys, then appropriate</div><div class='add'>+ * check has to be added below.</div><div class='add'>+ */</div><div class='add'>+int</div><div class='add'>+br_stub_setxattr(call_frame_t *frame, xlator_t *this, loc_t *loc, dict_t *dict,</div><div class='add'>+                 int flags, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    int32_t op_ret = -1;</div><div class='add'>+    int32_t op_errno = EINVAL;</div><div class='add'>+</div><div class='add'>+    if (br_stub_internal_xattr(dict)) {</div><div class='add'>+        br_stub_dump_xattr(this, dict, &amp;op_errno);</div><div class='add'>+        goto unwind;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    STACK_WIND_TAIL(frame, FIRST_CHILD(this), FIRST_CHILD(this)-&gt;fops-&gt;setxattr,</div><div class='add'>+                    loc, dict, flags, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+unwind:</div><div class='add'>+    STACK_UNWIND_STRICT(setxattr, frame, op_ret, op_errno, NULL);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/** }}} */</div><div class='add'>+</div><div class='add'>+/** {{{ */</div><div class='add'>+</div><div class='add'>+/* {f}removexattr() */</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+br_stub_removexattr(call_frame_t *frame, xlator_t *this, loc_t *loc,</div><div class='add'>+                    const char *name, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    int32_t op_ret = -1;</div><div class='add'>+    int32_t op_errno = EINVAL;</div><div class='add'>+</div><div class='add'>+    if (!strcmp(BITROT_OBJECT_BAD_KEY, name) ||</div><div class='add'>+        !strcmp(BITROT_SIGNING_VERSION_KEY, name) ||</div><div class='add'>+        !strcmp(BITROT_CURRENT_VERSION_KEY, name)) {</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_WARNING, 0, BRS_MSG_REMOVE_INTERNAL_XATTR,</div><div class='add'>+                "name=%s", name, "file-path=%s", loc-&gt;path, NULL);</div><div class='add'>+        goto unwind;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    STACK_WIND_TAIL(frame, FIRST_CHILD(this),</div><div class='add'>+                    FIRST_CHILD(this)-&gt;fops-&gt;removexattr, loc, name, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+unwind:</div><div class='add'>+    STACK_UNWIND_STRICT(removexattr, frame, op_ret, op_errno, NULL);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+br_stub_fremovexattr(call_frame_t *frame, xlator_t *this, fd_t *fd,</div><div class='add'>+                     const char *name, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    int32_t op_ret = -1;</div><div class='add'>+    int32_t op_errno = EINVAL;</div><div class='add'>+</div><div class='add'>+    if (!strcmp(BITROT_OBJECT_BAD_KEY, name) ||</div><div class='add'>+        !strcmp(BITROT_SIGNING_VERSION_KEY, name) ||</div><div class='add'>+        !strcmp(BITROT_CURRENT_VERSION_KEY, name)) {</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_WARNING, 0, BRS_MSG_REMOVE_INTERNAL_XATTR,</div><div class='add'>+                "name=%s", name, "inode-gfid=%s", uuid_utoa(fd-&gt;inode-&gt;gfid),</div><div class='add'>+                NULL);</div><div class='add'>+        goto unwind;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    STACK_WIND_TAIL(frame, FIRST_CHILD(this),</div><div class='add'>+                    FIRST_CHILD(this)-&gt;fops-&gt;fremovexattr, fd, name, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+unwind:</div><div class='add'>+    STACK_UNWIND_STRICT(fremovexattr, frame, op_ret, op_errno, NULL);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/** }}} */</div><div class='add'>+</div><div class='add'>+/** {{{ */</div><div class='add'>+</div><div class='add'>+/* {f}getxattr() */</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+br_stub_listxattr_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                      int op_ret, int op_errno, dict_t *xattr, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    if (op_ret &lt; 0)</div><div class='add'>+        goto unwind;</div><div class='add'>+</div><div class='add'>+    br_stub_remove_vxattrs(xattr, _gf_true);</div><div class='add'>+</div><div class='add'>+unwind:</div><div class='add'>+    STACK_UNWIND_STRICT(getxattr, frame, op_ret, op_errno, xattr, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/**</div><div class='add'>+ * ONE SHOT CRAWLER from BitD signs the objects that it encounters while</div><div class='add'>+ * crawling, if the object is identified as stale by the stub. Stub follows</div><div class='add'>+ * the below logic to mark an object as stale or not.</div><div class='add'>+ * If the ongoing version and the signed_version match, then the object is not</div><div class='add'>+ * stale. Just return. Otherwise if they does not match, then it means one</div><div class='add'>+ * of the below things.</div><div class='add'>+ * 1) If the inode does not need write back of the version and the sign state is</div><div class='add'>+ *    is NORMAL, then some active i/o is going on the object. So skip it.</div><div class='add'>+ *    A notification will be sent to trigger the sign once the release is</div><div class='add'>+ *    received on the object.</div><div class='add'>+ * 2) If inode does not need writeback of the version and the sign state is</div><div class='add'>+ *    either reopen wait or quick sign, then it means:</div><div class='add'>+ *    A) BitD restarted and it is not sure whether the object it encountered</div><div class='add'>+ *       while crawling is in its timer wheel or not. Since there is no way to</div><div class='add'>+ *       scan the timer wheel as of now, ONE SHOT CRAWLER just goes ahead and</div><div class='add'>+ *       signs the object. Since the inode does not need writeback, version will</div><div class='add'>+ *       not be incremented and directly the object will be signed.</div><div class='add'>+ * 3) If the inode needs writeback, then it means the inode was forgotten after</div><div class='add'>+ *    the versioning and it has to be signed now.</div><div class='add'>+ *</div><div class='add'>+ * This is the algorithm followed:</div><div class='add'>+ * if (ongoing_version == signed_version); then</div><div class='add'>+ *     object_is_not_stale;</div><div class='add'>+ *     return;</div><div class='add'>+ * else; then</div><div class='add'>+ *      if (!inode_needs_writeback &amp;&amp; inode_sign_state != NORMAL); then</div><div class='add'>+ *            object_is_stale;</div><div class='add'>+ *      if (inode_needs_writeback); then</div><div class='add'>+ *            object_is_stale;</div><div class='add'>+ *</div><div class='add'>+ * For SCRUBBER, no need to check for the sign state and inode writeback.</div><div class='add'>+ * If the ondisk ongoingversion and the ondisk signed version does not match,</div><div class='add'>+ * then treat the object as stale.</div><div class='add'>+ */</div><div class='add'>+char</div><div class='add'>+br_stub_is_object_stale(xlator_t *this, call_frame_t *frame, inode_t *inode,</div><div class='add'>+                        br_version_t *obuf, br_signature_t *sbuf)</div><div class='add'>+{</div><div class='add'>+    uint64_t ctx_addr = 0;</div><div class='add'>+    br_stub_inode_ctx_t *ctx = NULL;</div><div class='add'>+    int32_t ret = -1;</div><div class='add'>+    char stale = 0;</div><div class='add'>+</div><div class='add'>+    if (obuf-&gt;ongoingversion == sbuf-&gt;signedversion)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    if (frame-&gt;root-&gt;pid == GF_CLIENT_PID_SCRUB) {</div><div class='add'>+        stale = 1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = br_stub_get_inode_ctx(this, inode, &amp;ctx_addr);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_ERROR, 0, BRS_MSG_GET_INODE_CONTEXT_FAILED,</div><div class='add'>+                "gfid=%s", uuid_utoa(inode-&gt;gfid), NULL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ctx = (br_stub_inode_ctx_t *)(long)ctx_addr;</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;inode-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        if ((!__br_stub_is_inode_dirty(ctx) &amp;&amp;</div><div class='add'>+             ctx-&gt;info_sign != BR_SIGN_NORMAL) ||</div><div class='add'>+            __br_stub_is_inode_dirty(ctx))</div><div class='add'>+            stale = 1;</div><div class='add'>+    }</div><div class='add'>+    UNLOCK(&amp;inode-&gt;lock);</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return stale;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+br_stub_getxattr_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                     int op_ret, int op_errno, dict_t *xattr, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    int32_t ret = 0;</div><div class='add'>+    size_t totallen = 0;</div><div class='add'>+    size_t signaturelen = 0;</div><div class='add'>+    br_stub_private_t *priv = NULL;</div><div class='add'>+    br_version_t *obuf = NULL;</div><div class='add'>+    br_signature_t *sbuf = NULL;</div><div class='add'>+    br_isignature_out_t *sign = NULL;</div><div class='add'>+    br_vxattr_status_t status;</div><div class='add'>+    br_stub_local_t *local = NULL;</div><div class='add'>+    inode_t *inode = NULL;</div><div class='add'>+    gf_boolean_t bad_object = _gf_false;</div><div class='add'>+    gf_boolean_t ver_enabled = _gf_false;</div><div class='add'>+</div><div class='add'>+    BR_STUB_VER_ENABLED_IN_CALLPATH(frame, ver_enabled);</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    if (op_ret &lt; 0)</div><div class='add'>+        goto unwind;</div><div class='add'>+    BR_STUB_VER_COND_GOTO(priv, (!ver_enabled), delkeys);</div><div class='add'>+</div><div class='add'>+    if (cookie != (void *)BR_STUB_REQUEST_COOKIE)</div><div class='add'>+        goto unwind;</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    frame-&gt;local = NULL;</div><div class='add'>+    if (!local) {</div><div class='add'>+        op_ret = -1;</div><div class='add'>+        op_errno = EINVAL;</div><div class='add'>+        goto unwind;</div><div class='add'>+    }</div><div class='add'>+    inode = local-&gt;u.context.inode;</div><div class='add'>+</div><div class='add'>+    op_ret = -1;</div><div class='add'>+    status = br_version_xattr_state(xattr, &amp;obuf, &amp;sbuf, &amp;bad_object);</div><div class='add'>+</div><div class='add'>+    op_errno = EIO;</div><div class='add'>+    if (bad_object)</div><div class='add'>+        goto delkeys;</div><div class='add'>+</div><div class='add'>+    op_errno = EINVAL;</div><div class='add'>+    if (status == BR_VXATTR_STATUS_INVALID)</div><div class='add'>+        goto delkeys;</div><div class='add'>+</div><div class='add'>+    op_errno = ENODATA;</div><div class='add'>+    if ((status == BR_VXATTR_STATUS_MISSING) ||</div><div class='add'>+        (status == BR_VXATTR_STATUS_UNSIGNED))</div><div class='add'>+        goto delkeys;</div><div class='add'>+</div><div class='add'>+    /**</div><div class='add'>+     * okay.. we have enough information to satisfy the request,</div><div class='add'>+     * namely: version and signing extended attribute. what's</div><div class='add'>+     * pending is the signature length -- that's figured out</div><div class='add'>+     * indirectly via the size of the _whole_ xattr and the</div><div class='add'>+     * on-disk signing xattr header size.</div><div class='add'>+     */</div><div class='add'>+    op_errno = EINVAL;</div><div class='add'>+    ret = dict_get_uint32(xattr, BITROT_SIGNING_XATTR_SIZE_KEY,</div><div class='add'>+                          (uint32_t *)&amp;signaturelen);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto delkeys;</div><div class='add'>+</div><div class='add'>+    signaturelen -= sizeof(br_signature_t);</div><div class='add'>+    totallen = sizeof(br_isignature_out_t) + signaturelen;</div><div class='add'>+</div><div class='add'>+    op_errno = ENOMEM;</div><div class='add'>+    sign = GF_CALLOC(1, totallen, gf_br_stub_mt_signature_t);</div><div class='add'>+    if (!sign)</div><div class='add'>+        goto delkeys;</div><div class='add'>+</div><div class='add'>+    sign-&gt;time[0] = obuf-&gt;timebuf[0];</div><div class='add'>+    sign-&gt;time[1] = obuf-&gt;timebuf[1];</div><div class='add'>+</div><div class='add'>+    /* Object's dirty state &amp; current signed version */</div><div class='add'>+    sign-&gt;version = sbuf-&gt;signedversion;</div><div class='add'>+    sign-&gt;stale = br_stub_is_object_stale(this, frame, inode, obuf, sbuf);</div><div class='add'>+</div><div class='add'>+    /* Object's signature */</div><div class='add'>+    sign-&gt;signaturelen = signaturelen;</div><div class='add'>+    sign-&gt;signaturetype = sbuf-&gt;signaturetype;</div><div class='add'>+    (void)memcpy(sign-&gt;signature, sbuf-&gt;signature, signaturelen);</div><div class='add'>+</div><div class='add'>+    op_errno = EINVAL;</div><div class='add'>+    ret = dict_set_bin(xattr, GLUSTERFS_GET_OBJECT_SIGNATURE, (void *)sign,</div><div class='add'>+                       totallen);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        GF_FREE(sign);</div><div class='add'>+        goto delkeys;</div><div class='add'>+    }</div><div class='add'>+    op_errno = 0;</div><div class='add'>+    op_ret = totallen;</div><div class='add'>+</div><div class='add'>+delkeys:</div><div class='add'>+    br_stub_remove_vxattrs(xattr, _gf_true);</div><div class='add'>+</div><div class='add'>+unwind:</div><div class='add'>+    STACK_UNWIND_STRICT(getxattr, frame, op_ret, op_errno, xattr, xdata);</div><div class='add'>+    br_stub_cleanup_local(local);</div><div class='add'>+    br_stub_dealloc_local(local);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+br_stub_send_stub_init_time(call_frame_t *frame, xlator_t *this)</div><div class='add'>+{</div><div class='add'>+    int op_ret = 0;</div><div class='add'>+    int op_errno = 0;</div><div class='add'>+    dict_t *xattr = NULL;</div><div class='add'>+    br_stub_init_t stub = {</div><div class='add'>+        {</div><div class='add'>+            0,</div><div class='add'>+        },</div><div class='add'>+    };</div><div class='add'>+    br_stub_private_t *priv = NULL;</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    xattr = dict_new();</div><div class='add'>+    if (!xattr) {</div><div class='add'>+        op_ret = -1;</div><div class='add'>+        op_errno = ENOMEM;</div><div class='add'>+        goto unwind;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    stub.timebuf[0] = priv-&gt;boot[0];</div><div class='add'>+    stub.timebuf[1] = priv-&gt;boot[1];</div><div class='add'>+    memcpy(stub.export, priv-&gt;export, strlen(priv-&gt;export) + 1);</div><div class='add'>+</div><div class='add'>+    op_ret = dict_set_static_bin(xattr, GLUSTERFS_GET_BR_STUB_INIT_TIME,</div><div class='add'>+                                 (void *)&amp;stub, sizeof(br_stub_init_t));</div><div class='add'>+    if (op_ret &lt; 0) {</div><div class='add'>+        op_errno = EINVAL;</div><div class='add'>+        goto unwind;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    op_ret = sizeof(br_stub_init_t);</div><div class='add'>+</div><div class='add'>+unwind:</div><div class='add'>+    STACK_UNWIND_STRICT(getxattr, frame, op_ret, op_errno, xattr, NULL);</div><div class='add'>+</div><div class='add'>+    if (xattr)</div><div class='add'>+        dict_unref(xattr);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+br_stub_getxattr(call_frame_t *frame, xlator_t *this, loc_t *loc,</div><div class='add'>+                 const char *name, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    void *cookie = NULL;</div><div class='add'>+    static uuid_t rootgfid = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1};</div><div class='add'>+    fop_getxattr_cbk_t cbk = br_stub_getxattr_cbk;</div><div class='add'>+    int32_t op_ret = -1;</div><div class='add'>+    int32_t op_errno = EINVAL;</div><div class='add'>+    br_stub_local_t *local = NULL;</div><div class='add'>+    br_stub_private_t *priv = NULL;</div><div class='add'>+</div><div class='add'>+    GF_VALIDATE_OR_GOTO("bit-rot-stub", this, unwind);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, loc, unwind);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, this-&gt;private, unwind);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, loc-&gt;inode, unwind);</div><div class='add'>+</div><div class='add'>+    if (!name) {</div><div class='add'>+        cbk = br_stub_listxattr_cbk;</div><div class='add'>+        goto wind;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (br_stub_is_internal_xattr(name))</div><div class='add'>+        goto unwind;</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+    BR_STUB_VER_NOT_ACTIVE_THEN_GOTO(frame, priv, wind);</div><div class='add'>+</div><div class='add'>+    /**</div><div class='add'>+     * If xattr is node-uuid and the inode is marked bad, return EIO.</div><div class='add'>+     * Returning EIO would result in AFR to choose correct node-uuid</div><div class='add'>+     * corresponding to the subvolume * where the good copy of the</div><div class='add'>+     * file resides.</div><div class='add'>+     */</div><div class='add'>+    if (IA_ISREG(loc-&gt;inode-&gt;ia_type) &amp;&amp; XATTR_IS_NODE_UUID(name) &amp;&amp;</div><div class='add'>+        br_stub_check_bad_object(this, loc-&gt;inode, &amp;op_ret, &amp;op_errno)) {</div><div class='add'>+        goto unwind;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /**</div><div class='add'>+     * this special extended attribute is allowed only on root</div><div class='add'>+     */</div><div class='add'>+    if (name &amp;&amp;</div><div class='add'>+        (strncmp(name, GLUSTERFS_GET_BR_STUB_INIT_TIME,</div><div class='add'>+                 sizeof(GLUSTERFS_GET_BR_STUB_INIT_TIME) - 1) == 0) &amp;&amp;</div><div class='add'>+        ((gf_uuid_compare(loc-&gt;gfid, rootgfid) == 0) ||</div><div class='add'>+         (gf_uuid_compare(loc-&gt;inode-&gt;gfid, rootgfid) == 0))) {</div><div class='add'>+        BR_STUB_RESET_LOCAL_NULL(frame);</div><div class='add'>+        br_stub_send_stub_init_time(frame, this);</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (!IA_ISREG(loc-&gt;inode-&gt;ia_type))</div><div class='add'>+        goto wind;</div><div class='add'>+</div><div class='add'>+    if (name &amp;&amp; (strncmp(name, GLUSTERFS_GET_OBJECT_SIGNATURE,</div><div class='add'>+                         sizeof(GLUSTERFS_GET_OBJECT_SIGNATURE) - 1) == 0)) {</div><div class='add'>+        cookie = (void *)BR_STUB_REQUEST_COOKIE;</div><div class='add'>+</div><div class='add'>+        local = br_stub_alloc_local(this);</div><div class='add'>+        if (!local) {</div><div class='add'>+            op_ret = -1;</div><div class='add'>+            op_errno = ENOMEM;</div><div class='add'>+            goto unwind;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        br_stub_fill_local(local, NULL, NULL, loc-&gt;inode, loc-&gt;inode-&gt;gfid,</div><div class='add'>+                           BR_STUB_NO_VERSIONING, 0);</div><div class='add'>+        frame-&gt;local = local;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+wind:</div><div class='add'>+    STACK_WIND_COOKIE(frame, cbk, cookie, FIRST_CHILD(this),</div><div class='add'>+                      FIRST_CHILD(this)-&gt;fops-&gt;getxattr, loc, name, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+unwind:</div><div class='add'>+    BR_STUB_RESET_LOCAL_NULL(frame);</div><div class='add'>+    STACK_UNWIND_STRICT(getxattr, frame, op_ret, op_errno, NULL, NULL);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+br_stub_fgetxattr(call_frame_t *frame, xlator_t *this, fd_t *fd,</div><div class='add'>+                  const char *name, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    void *cookie = NULL;</div><div class='add'>+    static uuid_t rootgfid = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1};</div><div class='add'>+    fop_fgetxattr_cbk_t cbk = br_stub_getxattr_cbk;</div><div class='add'>+    int32_t op_ret = -1;</div><div class='add'>+    int32_t op_errno = EINVAL;</div><div class='add'>+    br_stub_local_t *local = NULL;</div><div class='add'>+    br_stub_private_t *priv = NULL;</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    if (!name) {</div><div class='add'>+        cbk = br_stub_listxattr_cbk;</div><div class='add'>+        goto wind;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (br_stub_is_internal_xattr(name))</div><div class='add'>+        goto unwind;</div><div class='add'>+</div><div class='add'>+    BR_STUB_VER_NOT_ACTIVE_THEN_GOTO(frame, priv, wind);</div><div class='add'>+</div><div class='add'>+    /**</div><div class='add'>+     * If xattr is node-uuid and the inode is marked bad, return EIO.</div><div class='add'>+     * Returning EIO would result in AFR to choose correct node-uuid</div><div class='add'>+     * corresponding to the subvolume * where the good copy of the</div><div class='add'>+     * file resides.</div><div class='add'>+     */</div><div class='add'>+    if (IA_ISREG(fd-&gt;inode-&gt;ia_type) &amp;&amp; XATTR_IS_NODE_UUID(name) &amp;&amp;</div><div class='add'>+        br_stub_check_bad_object(this, fd-&gt;inode, &amp;op_ret, &amp;op_errno)) {</div><div class='add'>+        goto unwind;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /**</div><div class='add'>+     * this special extended attribute is allowed only on root</div><div class='add'>+     */</div><div class='add'>+    if (name &amp;&amp;</div><div class='add'>+        (strncmp(name, GLUSTERFS_GET_BR_STUB_INIT_TIME,</div><div class='add'>+                 sizeof(GLUSTERFS_GET_BR_STUB_INIT_TIME) - 1) == 0) &amp;&amp;</div><div class='add'>+        (gf_uuid_compare(fd-&gt;inode-&gt;gfid, rootgfid) == 0)) {</div><div class='add'>+        BR_STUB_RESET_LOCAL_NULL(frame);</div><div class='add'>+        br_stub_send_stub_init_time(frame, this);</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (!IA_ISREG(fd-&gt;inode-&gt;ia_type))</div><div class='add'>+        goto wind;</div><div class='add'>+</div><div class='add'>+    if (name &amp;&amp; (strncmp(name, GLUSTERFS_GET_OBJECT_SIGNATURE,</div><div class='add'>+                         sizeof(GLUSTERFS_GET_OBJECT_SIGNATURE) - 1) == 0)) {</div><div class='add'>+        cookie = (void *)BR_STUB_REQUEST_COOKIE;</div><div class='add'>+</div><div class='add'>+        local = br_stub_alloc_local(this);</div><div class='add'>+        if (!local) {</div><div class='add'>+            op_ret = -1;</div><div class='add'>+            op_errno = ENOMEM;</div><div class='add'>+            goto unwind;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        br_stub_fill_local(local, NULL, fd, fd-&gt;inode, fd-&gt;inode-&gt;gfid,</div><div class='add'>+                           BR_STUB_NO_VERSIONING, 0);</div><div class='add'>+        frame-&gt;local = local;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+wind:</div><div class='add'>+    STACK_WIND_COOKIE(frame, cbk, cookie, FIRST_CHILD(this),</div><div class='add'>+                      FIRST_CHILD(this)-&gt;fops-&gt;fgetxattr, fd, name, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+unwind:</div><div class='add'>+    BR_STUB_RESET_LOCAL_NULL(frame);</div><div class='add'>+    STACK_UNWIND_STRICT(fgetxattr, frame, op_ret, op_errno, NULL, NULL);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+br_stub_readv(call_frame_t *frame, xlator_t *this, fd_t *fd, size_t size,</div><div class='add'>+              off_t offset, uint32_t flags, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    int32_t op_ret = -1;</div><div class='add'>+    int32_t op_errno = EINVAL;</div><div class='add'>+    int32_t ret = -1;</div><div class='add'>+    br_stub_private_t *priv = NULL;</div><div class='add'>+</div><div class='add'>+    GF_VALIDATE_OR_GOTO("bit-rot-stub", this, unwind);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, frame, unwind);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, this-&gt;private, unwind);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, fd, unwind);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, fd-&gt;inode, unwind);</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+    if (!priv-&gt;do_versioning)</div><div class='add'>+        goto wind;</div><div class='add'>+</div><div class='add'>+    ret = br_stub_check_bad_object(this, fd-&gt;inode, &amp;op_ret, &amp;op_errno);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto unwind;</div><div class='add'>+</div><div class='add'>+wind:</div><div class='add'>+    STACK_WIND_TAIL(frame, FIRST_CHILD(this), FIRST_CHILD(this)-&gt;fops-&gt;readv,</div><div class='add'>+                    fd, size, offset, flags, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+</div><div class='add'>+unwind:</div><div class='add'>+    STACK_UNWIND_STRICT(readv, frame, op_ret, op_errno, NULL, 0, NULL, NULL,</div><div class='add'>+                        NULL);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/**</div><div class='add'>+ * The first write response on the first fd in the list of fds will set</div><div class='add'>+ * the flag to indicate that the inode is modified. The subsequent write</div><div class='add'>+ * respnses coming on either the first fd or some other fd will not change</div><div class='add'>+ * the fd. The inode-modified flag is unset only upon release of all the</div><div class='add'>+ * fds.</div><div class='add'>+ */</div><div class='add'>+int32_t</div><div class='add'>+br_stub_writev_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                   int32_t op_ret, int32_t op_errno, struct iatt *prebuf,</div><div class='add'>+                   struct iatt *postbuf, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    int32_t ret = 0;</div><div class='add'>+    br_stub_local_t *local = NULL;</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    frame-&gt;local = NULL;</div><div class='add'>+</div><div class='add'>+    if (op_ret &lt; 0)</div><div class='add'>+        goto unwind;</div><div class='add'>+</div><div class='add'>+    ret = br_stub_mark_inode_modified(this, local);</div><div class='add'>+    if (ret) {</div><div class='add'>+        op_ret = -1;</div><div class='add'>+        op_errno = EINVAL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+unwind:</div><div class='add'>+    STACK_UNWIND_STRICT(writev, frame, op_ret, op_errno, prebuf, postbuf,</div><div class='add'>+                        xdata);</div><div class='add'>+</div><div class='add'>+    br_stub_cleanup_local(local);</div><div class='add'>+    br_stub_dealloc_local(local);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+br_stub_writev_resume(call_frame_t *frame, xlator_t *this, fd_t *fd,</div><div class='add'>+                      struct iovec *vector, int32_t count, off_t offset,</div><div class='add'>+                      uint32_t flags, struct iobref *iobref, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    STACK_WIND(frame, br_stub_writev_cbk, FIRST_CHILD(this),</div><div class='add'>+               FIRST_CHILD(this)-&gt;fops-&gt;writev, fd, vector, count, offset,</div><div class='add'>+               flags, iobref, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/**</div><div class='add'>+ * This is probably the most crucial part about the whole versioning thing.</div><div class='add'>+ * There's absolutely no differentiation as such between an anonymous fd</div><div class='add'>+ * and a regular fd except the fd context initialization. Object versioning</div><div class='add'>+ * is performed when the inode is dirty. Parallel write operations are no</div><div class='add'>+ * special with each write performing object versioning followed by marking</div><div class='add'>+ * the inode as non-dirty (synced). This is followed by the actual operation</div><div class='add'>+ * (writev() in this case) which on a success marks the inode as modified.</div><div class='add'>+ * This prevents signing of objects that have not been modified.</div><div class='add'>+ */</div><div class='add'>+int32_t</div><div class='add'>+br_stub_writev(call_frame_t *frame, xlator_t *this, fd_t *fd,</div><div class='add'>+               struct iovec *vector, int32_t count, off_t offset,</div><div class='add'>+               uint32_t flags, struct iobref *iobref, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    call_stub_t *stub = NULL;</div><div class='add'>+    int32_t op_ret = -1;</div><div class='add'>+    int32_t op_errno = EINVAL;</div><div class='add'>+    gf_boolean_t inc_version = _gf_false;</div><div class='add'>+    gf_boolean_t modified = _gf_false;</div><div class='add'>+    br_stub_inode_ctx_t *ctx = NULL;</div><div class='add'>+    int32_t ret = -1;</div><div class='add'>+    fop_writev_cbk_t cbk = default_writev_cbk;</div><div class='add'>+    br_stub_local_t *local = NULL;</div><div class='add'>+    br_stub_private_t *priv = NULL;</div><div class='add'>+</div><div class='add'>+    GF_VALIDATE_OR_GOTO("bit-rot-stub", this, unwind);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, this-&gt;private, unwind);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, frame, unwind);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, fd, unwind);</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+    if (!priv-&gt;do_versioning)</div><div class='add'>+        goto wind;</div><div class='add'>+</div><div class='add'>+    ret = br_stub_need_versioning(this, fd, &amp;inc_version, &amp;modified, &amp;ctx);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto unwind;</div><div class='add'>+</div><div class='add'>+    ret = br_stub_check_bad_object(this, fd-&gt;inode, &amp;op_ret, &amp;op_errno);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto unwind;</div><div class='add'>+</div><div class='add'>+    /**</div><div class='add'>+     * The inode is not dirty and also witnessed at least one successful</div><div class='add'>+     * modification operation. Therefore, subsequent operations need not</div><div class='add'>+     * perform any special tracking.</div><div class='add'>+     */</div><div class='add'>+    if (!inc_version &amp;&amp; modified)</div><div class='add'>+        goto wind;</div><div class='add'>+</div><div class='add'>+    /**</div><div class='add'>+     * okay.. so, either the inode needs versioning or the modification</div><div class='add'>+     * needs to be tracked. -&gt;cbk is set to the appropriate callback</div><div class='add'>+     * routine for this.</div><div class='add'>+     * NOTE: -&gt;local needs to be deallocated on failures from here on.</div><div class='add'>+     */</div><div class='add'>+    ret = br_stub_versioning_prep(frame, this, fd, ctx);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto unwind;</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    if (!inc_version) {</div><div class='add'>+        br_stub_fill_local(local, NULL, fd, fd-&gt;inode, fd-&gt;inode-&gt;gfid,</div><div class='add'>+                           BR_STUB_NO_VERSIONING, 0);</div><div class='add'>+        cbk = br_stub_writev_cbk;</div><div class='add'>+        goto wind;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    stub = fop_writev_stub(frame, br_stub_writev_resume, fd, vector, count,</div><div class='add'>+                           offset, flags, iobref, xdata);</div><div class='add'>+</div><div class='add'>+    if (!stub) {</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_ERROR, 0, BRS_MSG_STUB_ALLOC_FAILED,</div><div class='add'>+                "write  gfid=%s", uuid_utoa(fd-&gt;inode-&gt;gfid), NULL);</div><div class='add'>+        goto cleanup_local;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Perform Versioning */</div><div class='add'>+    return br_stub_perform_incversioning(this, frame, stub, fd, ctx);</div><div class='add'>+</div><div class='add'>+wind:</div><div class='add'>+    STACK_WIND(frame, cbk, FIRST_CHILD(this), FIRST_CHILD(this)-&gt;fops-&gt;writev,</div><div class='add'>+               fd, vector, count, offset, flags, iobref, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+</div><div class='add'>+cleanup_local:</div><div class='add'>+    br_stub_cleanup_local(local);</div><div class='add'>+    br_stub_dealloc_local(local);</div><div class='add'>+</div><div class='add'>+unwind:</div><div class='add'>+    frame-&gt;local = NULL;</div><div class='add'>+    STACK_UNWIND_STRICT(writev, frame, op_ret, op_errno, NULL, NULL, NULL);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+br_stub_ftruncate_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                      int32_t op_ret, int32_t op_errno, struct iatt *prebuf,</div><div class='add'>+                      struct iatt *postbuf, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    int32_t ret = -1;</div><div class='add'>+    br_stub_local_t *local = NULL;</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    frame-&gt;local = NULL;</div><div class='add'>+</div><div class='add'>+    if (op_ret &lt; 0)</div><div class='add'>+        goto unwind;</div><div class='add'>+</div><div class='add'>+    ret = br_stub_mark_inode_modified(this, local);</div><div class='add'>+    if (ret) {</div><div class='add'>+        op_ret = -1;</div><div class='add'>+        op_errno = EINVAL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+unwind:</div><div class='add'>+    STACK_UNWIND_STRICT(ftruncate, frame, op_ret, op_errno, prebuf, postbuf,</div><div class='add'>+                        xdata);</div><div class='add'>+</div><div class='add'>+    br_stub_cleanup_local(local);</div><div class='add'>+    br_stub_dealloc_local(local);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+br_stub_ftruncate_resume(call_frame_t *frame, xlator_t *this, fd_t *fd,</div><div class='add'>+                         off_t offset, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    STACK_WIND(frame, br_stub_ftruncate_cbk, FIRST_CHILD(this),</div><div class='add'>+               FIRST_CHILD(this)-&gt;fops-&gt;ftruncate, fd, offset, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* c.f. br_stub_writev() for explanation */</div><div class='add'>+int32_t</div><div class='add'>+br_stub_ftruncate(call_frame_t *frame, xlator_t *this, fd_t *fd, off_t offset,</div><div class='add'>+                  dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    br_stub_local_t *local = NULL;</div><div class='add'>+    call_stub_t *stub = NULL;</div><div class='add'>+    int32_t op_ret = -1;</div><div class='add'>+    int32_t op_errno = EINVAL;</div><div class='add'>+    gf_boolean_t inc_version = _gf_false;</div><div class='add'>+    gf_boolean_t modified = _gf_false;</div><div class='add'>+    br_stub_inode_ctx_t *ctx = NULL;</div><div class='add'>+    int32_t ret = -1;</div><div class='add'>+    fop_ftruncate_cbk_t cbk = default_ftruncate_cbk;</div><div class='add'>+    br_stub_private_t *priv = NULL;</div><div class='add'>+</div><div class='add'>+    GF_VALIDATE_OR_GOTO("bit-rot-stub", this, unwind);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, this-&gt;private, unwind);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, frame, unwind);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, fd, unwind);</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+    if (!priv-&gt;do_versioning)</div><div class='add'>+        goto wind;</div><div class='add'>+</div><div class='add'>+    ret = br_stub_need_versioning(this, fd, &amp;inc_version, &amp;modified, &amp;ctx);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto unwind;</div><div class='add'>+</div><div class='add'>+    ret = br_stub_check_bad_object(this, fd-&gt;inode, &amp;op_ret, &amp;op_errno);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto unwind;</div><div class='add'>+</div><div class='add'>+    if (!inc_version &amp;&amp; modified)</div><div class='add'>+        goto wind;</div><div class='add'>+</div><div class='add'>+    ret = br_stub_versioning_prep(frame, this, fd, ctx);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto unwind;</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    if (!inc_version) {</div><div class='add'>+        br_stub_fill_local(local, NULL, fd, fd-&gt;inode, fd-&gt;inode-&gt;gfid,</div><div class='add'>+                           BR_STUB_NO_VERSIONING, 0);</div><div class='add'>+        cbk = br_stub_ftruncate_cbk;</div><div class='add'>+        goto wind;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    stub = fop_ftruncate_stub(frame, br_stub_ftruncate_resume, fd, offset,</div><div class='add'>+                              xdata);</div><div class='add'>+    if (!stub) {</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_ERROR, 0, BRS_MSG_STUB_ALLOC_FAILED,</div><div class='add'>+                "ftruncate gfid=%s", uuid_utoa(fd-&gt;inode-&gt;gfid), NULL);</div><div class='add'>+        goto cleanup_local;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return br_stub_perform_incversioning(this, frame, stub, fd, ctx);</div><div class='add'>+</div><div class='add'>+wind:</div><div class='add'>+    STACK_WIND(frame, cbk, FIRST_CHILD(this),</div><div class='add'>+               FIRST_CHILD(this)-&gt;fops-&gt;ftruncate, fd, offset, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+</div><div class='add'>+cleanup_local:</div><div class='add'>+    br_stub_cleanup_local(local);</div><div class='add'>+    br_stub_dealloc_local(local);</div><div class='add'>+</div><div class='add'>+unwind:</div><div class='add'>+    frame-&gt;local = NULL;</div><div class='add'>+    STACK_UNWIND_STRICT(ftruncate, frame, op_ret, op_errno, NULL, NULL, NULL);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+br_stub_truncate_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                     int32_t op_ret, int32_t op_errno, struct iatt *prebuf,</div><div class='add'>+                     struct iatt *postbuf, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    int32_t ret = 0;</div><div class='add'>+    br_stub_local_t *local = NULL;</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    frame-&gt;local = NULL;</div><div class='add'>+</div><div class='add'>+    if (op_ret &lt; 0)</div><div class='add'>+        goto unwind;</div><div class='add'>+</div><div class='add'>+    ret = br_stub_mark_inode_modified(this, local);</div><div class='add'>+    if (ret) {</div><div class='add'>+        op_ret = -1;</div><div class='add'>+        op_errno = EINVAL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+unwind:</div><div class='add'>+    STACK_UNWIND_STRICT(truncate, frame, op_ret, op_errno, prebuf, postbuf,</div><div class='add'>+                        xdata);</div><div class='add'>+    br_stub_cleanup_local(local);</div><div class='add'>+    br_stub_dealloc_local(local);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+br_stub_truncate_resume(call_frame_t *frame, xlator_t *this, loc_t *loc,</div><div class='add'>+                        off_t offset, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    br_stub_local_t *local = frame-&gt;local;</div><div class='add'>+</div><div class='add'>+    fd_unref(local-&gt;u.context.fd);</div><div class='add'>+    STACK_WIND(frame, br_stub_ftruncate_cbk, FIRST_CHILD(this),</div><div class='add'>+               FIRST_CHILD(this)-&gt;fops-&gt;truncate, loc, offset, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/**</div><div class='add'>+ * Bit-rot-stub depends heavily on the fd based operations to for doing</div><div class='add'>+ * versioning and sending notification. It starts tracking the operation</div><div class='add'>+ * upon getting first fd based modify operation by doing versioning and</div><div class='add'>+ * sends notification when last fd using which the inode was modified is</div><div class='add'>+ * released.</div><div class='add'>+ * But for truncate there is no fd and hence it becomes difficult to do</div><div class='add'>+ * the versioning and send notification. It is handled by doing versioning</div><div class='add'>+ * on an anonymous fd. The fd will be valid till the completion of the</div><div class='add'>+ * truncate call. It guarantees that release on this anonymous fd will happen</div><div class='add'>+ * after the truncate call and notification is sent after the truncate call.</div><div class='add'>+ *</div><div class='add'>+ * c.f. br_writev_cbk() for explanation</div><div class='add'>+ */</div><div class='add'>+int32_t</div><div class='add'>+br_stub_truncate(call_frame_t *frame, xlator_t *this, loc_t *loc, off_t offset,</div><div class='add'>+                 dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    br_stub_local_t *local = NULL;</div><div class='add'>+    call_stub_t *stub = NULL;</div><div class='add'>+    int32_t op_ret = -1;</div><div class='add'>+    int32_t op_errno = EINVAL;</div><div class='add'>+    gf_boolean_t inc_version = _gf_false;</div><div class='add'>+    gf_boolean_t modified = _gf_false;</div><div class='add'>+    br_stub_inode_ctx_t *ctx = NULL;</div><div class='add'>+    int32_t ret = -1;</div><div class='add'>+    fd_t *fd = NULL;</div><div class='add'>+    fop_truncate_cbk_t cbk = default_truncate_cbk;</div><div class='add'>+    br_stub_private_t *priv = NULL;</div><div class='add'>+</div><div class='add'>+    GF_VALIDATE_OR_GOTO("bit-rot-stub", this, unwind);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, this-&gt;private, unwind);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, frame, unwind);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, loc, unwind);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, loc-&gt;inode, unwind);</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+    if (!priv-&gt;do_versioning)</div><div class='add'>+        goto wind;</div><div class='add'>+</div><div class='add'>+    fd = fd_anonymous(loc-&gt;inode);</div><div class='add'>+    if (!fd) {</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_ERROR, 0, BRS_MSG_CREATE_ANONYMOUS_FD_FAILED,</div><div class='add'>+                "inode-gfid=%s", uuid_utoa(loc-&gt;inode-&gt;gfid), NULL);</div><div class='add'>+        goto unwind;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = br_stub_need_versioning(this, fd, &amp;inc_version, &amp;modified, &amp;ctx);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto cleanup_fd;</div><div class='add'>+</div><div class='add'>+    ret = br_stub_check_bad_object(this, fd-&gt;inode, &amp;op_ret, &amp;op_errno);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto unwind;</div><div class='add'>+</div><div class='add'>+    if (!inc_version &amp;&amp; modified)</div><div class='add'>+        goto wind;</div><div class='add'>+</div><div class='add'>+    ret = br_stub_versioning_prep(frame, this, fd, ctx);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto cleanup_fd;</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    if (!inc_version) {</div><div class='add'>+        br_stub_fill_local(local, NULL, fd, fd-&gt;inode, fd-&gt;inode-&gt;gfid,</div><div class='add'>+                           BR_STUB_NO_VERSIONING, 0);</div><div class='add'>+        cbk = br_stub_truncate_cbk;</div><div class='add'>+        goto wind;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    stub = fop_truncate_stub(frame, br_stub_truncate_resume, loc, offset,</div><div class='add'>+                             xdata);</div><div class='add'>+    if (!stub) {</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_ERROR, 0, BRS_MSG_STUB_ALLOC_FAILED,</div><div class='add'>+                "truncate gfid=%s", uuid_utoa(fd-&gt;inode-&gt;gfid), NULL);</div><div class='add'>+        goto cleanup_local;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return br_stub_perform_incversioning(this, frame, stub, fd, ctx);</div><div class='add'>+</div><div class='add'>+wind:</div><div class='add'>+    STACK_WIND(frame, cbk, FIRST_CHILD(this), FIRST_CHILD(this)-&gt;fops-&gt;truncate,</div><div class='add'>+               loc, offset, xdata);</div><div class='add'>+    if (fd)</div><div class='add'>+        fd_unref(fd);</div><div class='add'>+    return 0;</div><div class='add'>+</div><div class='add'>+cleanup_local:</div><div class='add'>+    br_stub_cleanup_local(local);</div><div class='add'>+    br_stub_dealloc_local(local);</div><div class='add'>+cleanup_fd:</div><div class='add'>+    fd_unref(fd);</div><div class='add'>+unwind:</div><div class='add'>+    frame-&gt;local = NULL;</div><div class='add'>+    STACK_UNWIND_STRICT(truncate, frame, op_ret, op_errno, NULL, NULL, NULL);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/** }}} */</div><div class='add'>+</div><div class='add'>+/** {{{ */</div><div class='add'>+</div><div class='add'>+/* open() */</div><div class='add'>+</div><div class='add'>+/**</div><div class='add'>+ * It's probably worth mentioning a bit about why some of the housekeeping</div><div class='add'>+ * work is done in open() call path, rather than the callback path.</div><div class='add'>+ * Two (or more) open()'s in parallel can race and lead to a situation</div><div class='add'>+ * where a release() gets triggered (possibly after a series of write()</div><div class='add'>+ * calls) when *other* open()'s have still not reached callback path</div><div class='add'>+ * thereby having an active fd on an inode that is in process of getting</div><div class='add'>+ * signed with the current version.</div><div class='add'>+ *</div><div class='add'>+ * Maintaining fd list in the call path ensures that a release() would</div><div class='add'>+ * not be triggered if an open() call races ahead (followed by a close())</div><div class='add'>+ * threby finding non-empty fd list.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+br_stub_open(call_frame_t *frame, xlator_t *this, loc_t *loc, int32_t flags,</div><div class='add'>+             fd_t *fd, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    int32_t ret = -1;</div><div class='add'>+    br_stub_inode_ctx_t *ctx = NULL;</div><div class='add'>+    uint64_t ctx_addr = 0;</div><div class='add'>+    int32_t op_ret = -1;</div><div class='add'>+    int32_t op_errno = EINVAL;</div><div class='add'>+    br_stub_private_t *priv = NULL;</div><div class='add'>+    unsigned long version = BITROT_DEFAULT_CURRENT_VERSION;</div><div class='add'>+</div><div class='add'>+    GF_VALIDATE_OR_GOTO("bit-rot-stub", this, unwind);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, this-&gt;private, unwind);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, loc, unwind);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, fd, unwind);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, fd-&gt;inode, unwind);</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    if (!priv-&gt;do_versioning)</div><div class='add'>+        goto wind;</div><div class='add'>+</div><div class='add'>+    ret = br_stub_get_inode_ctx(this, fd-&gt;inode, &amp;ctx_addr);</div><div class='add'>+    if (ret) {</div><div class='add'>+        ret = br_stub_init_inode_versions(this, fd, fd-&gt;inode, version,</div><div class='add'>+                                          _gf_true, _gf_false, &amp;ctx_addr);</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_smsg(this-&gt;name, GF_LOG_ERROR, 0,</div><div class='add'>+                    BRS_MSG_GET_INODE_CONTEXT_FAILED, "path=%s", loc-&gt;path,</div><div class='add'>+                    "gfid=%s", uuid_utoa(fd-&gt;inode-&gt;gfid), NULL);</div><div class='add'>+            goto unwind;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ctx = (br_stub_inode_ctx_t *)(long)ctx_addr;</div><div class='add'>+</div><div class='add'>+    ret = br_stub_check_bad_object(this, fd-&gt;inode, &amp;op_ret, &amp;op_errno);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto unwind;</div><div class='add'>+</div><div class='add'>+    if (frame-&gt;root-&gt;pid == GF_CLIENT_PID_SCRUB)</div><div class='add'>+        goto wind;</div><div class='add'>+</div><div class='add'>+    if (flags == O_RDONLY)</div><div class='add'>+        goto wind;</div><div class='add'>+</div><div class='add'>+    ret = br_stub_add_fd_to_inode(this, fd, ctx);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_ERROR, 0, BRS_MSG_ADD_FD_TO_LIST_FAILED,</div><div class='add'>+                "gfid=%s", uuid_utoa(fd-&gt;inode-&gt;gfid), NULL);</div><div class='add'>+        goto unwind;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+wind:</div><div class='add'>+    STACK_WIND(frame, default_open_cbk, FIRST_CHILD(this),</div><div class='add'>+               FIRST_CHILD(this)-&gt;fops-&gt;open, loc, flags, fd, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+unwind:</div><div class='add'>+    STACK_UNWIND_STRICT(open, frame, op_ret, op_errno, NULL, NULL);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/** }}} */</div><div class='add'>+</div><div class='add'>+/** {{{ */</div><div class='add'>+</div><div class='add'>+/* creat() */</div><div class='add'>+</div><div class='add'>+/**</div><div class='add'>+ * This routine registers a release callback for the given fd and adds the</div><div class='add'>+ * fd to the inode context fd tracking list.</div><div class='add'>+ */</div><div class='add'>+int32_t</div><div class='add'>+br_stub_add_fd_to_inode(xlator_t *this, fd_t *fd, br_stub_inode_ctx_t *ctx)</div><div class='add'>+{</div><div class='add'>+    int32_t ret = -1;</div><div class='add'>+    br_stub_fd_t *br_stub_fd = NULL;</div><div class='add'>+</div><div class='add'>+    ret = br_stub_require_release_call(this, fd, &amp;br_stub_fd);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_ERROR, 0, BRS_MSG_SET_FD_CONTEXT_FAILED,</div><div class='add'>+                "gfid=%s", uuid_utoa(fd-&gt;inode-&gt;gfid), NULL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;fd-&gt;inode-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        list_add_tail(&amp;ctx-&gt;fd_list, &amp;br_stub_fd-&gt;list);</div><div class='add'>+    }</div><div class='add'>+    UNLOCK(&amp;fd-&gt;inode-&gt;lock);</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+br_stub_create_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                   int op_ret, int op_errno, fd_t *fd, inode_t *inode,</div><div class='add'>+                   struct iatt *stbuf, struct iatt *preparent,</div><div class='add'>+                   struct iatt *postparent, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    int32_t ret = 0;</div><div class='add'>+    uint64_t ctx_addr = 0;</div><div class='add'>+    br_stub_inode_ctx_t *ctx = NULL;</div><div class='add'>+    unsigned long version = BITROT_DEFAULT_CURRENT_VERSION;</div><div class='add'>+    br_stub_private_t *priv = NULL;</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    if (op_ret &lt; 0)</div><div class='add'>+        goto unwind;</div><div class='add'>+</div><div class='add'>+    if (!priv-&gt;do_versioning)</div><div class='add'>+        goto unwind;</div><div class='add'>+</div><div class='add'>+    ret = br_stub_get_inode_ctx(this, fd-&gt;inode, &amp;ctx_addr);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        ret = br_stub_init_inode_versions(this, fd, inode, version, _gf_true,</div><div class='add'>+                                          _gf_false, &amp;ctx_addr);</div><div class='add'>+        if (ret) {</div><div class='add'>+            op_ret = -1;</div><div class='add'>+            op_errno = EINVAL;</div><div class='add'>+        }</div><div class='add'>+    } else {</div><div class='add'>+        ctx = (br_stub_inode_ctx_t *)(long)ctx_addr;</div><div class='add'>+        ret = br_stub_add_fd_to_inode(this, fd, ctx);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+unwind:</div><div class='add'>+    STACK_UNWIND_STRICT(create, frame, op_ret, op_errno, fd, inode, stbuf,</div><div class='add'>+                        preparent, postparent, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+br_stub_create(call_frame_t *frame, xlator_t *this, loc_t *loc, int32_t flags,</div><div class='add'>+               mode_t mode, mode_t umask, fd_t *fd, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    GF_VALIDATE_OR_GOTO("bit-rot-stub", this, unwind);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, loc, unwind);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, loc-&gt;inode, unwind);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, fd, unwind);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, fd-&gt;inode, unwind);</div><div class='add'>+</div><div class='add'>+    STACK_WIND(frame, br_stub_create_cbk, FIRST_CHILD(this),</div><div class='add'>+               FIRST_CHILD(this)-&gt;fops-&gt;create, loc, flags, mode, umask, fd,</div><div class='add'>+               xdata);</div><div class='add'>+    return 0;</div><div class='add'>+unwind:</div><div class='add'>+    STACK_UNWIND_STRICT(create, frame, -1, EINVAL, NULL, NULL, NULL, NULL, NULL,</div><div class='add'>+                        NULL);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+br_stub_mknod_cbk(call_frame_t *frame, void *cookie, xlator_t *this, int op_ret,</div><div class='add'>+                  int op_errno, inode_t *inode, struct iatt *stbuf,</div><div class='add'>+                  struct iatt *preparent, struct iatt *postparent,</div><div class='add'>+                  dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    int32_t ret = -1;</div><div class='add'>+    unsigned long version = BITROT_DEFAULT_CURRENT_VERSION;</div><div class='add'>+    br_stub_private_t *priv = NULL;</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    if (op_ret &lt; 0)</div><div class='add'>+        goto unwind;</div><div class='add'>+</div><div class='add'>+    if (!priv-&gt;do_versioning)</div><div class='add'>+        goto unwind;</div><div class='add'>+</div><div class='add'>+    ret = br_stub_init_inode_versions(this, NULL, inode, version, _gf_true,</div><div class='add'>+                                      _gf_false, NULL);</div><div class='add'>+    /**</div><div class='add'>+     * Like lookup, if init_inode_versions fail, return EINVAL</div><div class='add'>+     */</div><div class='add'>+    if (ret) {</div><div class='add'>+        op_ret = -1;</div><div class='add'>+        op_errno = EINVAL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+unwind:</div><div class='add'>+    STACK_UNWIND_STRICT(mknod, frame, op_ret, op_errno, inode, stbuf, preparent,</div><div class='add'>+                        postparent, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+br_stub_mknod(call_frame_t *frame, xlator_t *this, loc_t *loc, mode_t mode,</div><div class='add'>+              dev_t dev, mode_t umask, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    GF_VALIDATE_OR_GOTO("bit-rot-stub", this, unwind);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, loc, unwind);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, loc-&gt;inode, unwind);</div><div class='add'>+</div><div class='add'>+    STACK_WIND(frame, br_stub_mknod_cbk, FIRST_CHILD(this),</div><div class='add'>+               FIRST_CHILD(this)-&gt;fops-&gt;mknod, loc, mode, dev, umask, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+unwind:</div><div class='add'>+    STACK_UNWIND_STRICT(mknod, frame, -1, EINVAL, NULL, NULL, NULL, NULL, NULL);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/** }}} */</div><div class='add'>+</div><div class='add'>+/**</div><div class='add'>+ * As of now, only lookup searches for bad object xattr and marks the</div><div class='add'>+ * object as bad in its inode context if the xattr is present. But there</div><div class='add'>+ * is a possibility that, at the time of the lookup the object was not</div><div class='add'>+ * marked bad (i.e. bad object xattr was not set), and later its marked</div><div class='add'>+ * as bad. In this case, object is not bad, so when a fop such as open or</div><div class='add'>+ * readv or writev comes on the object, the fop will be sent downward instead</div><div class='add'>+ * of sending as error upwards.</div><div class='add'>+ * The solution for this is to do a getxattr for the below list of fops.</div><div class='add'>+ * lookup, readdirp, open, readv, writev.</div><div class='add'>+ * But doing getxattr for each of the above fops might be costly.</div><div class='add'>+ * So another method followed is to catch the bad file marking by the scrubber</div><div class='add'>+ * and set that info within the object's inode context. In this way getxattr</div><div class='add'>+ * calls can be avoided and bad objects can be caught instantly. Fetching the</div><div class='add'>+ * xattr is needed only in lookups when there is a brick restart or inode</div><div class='add'>+ * forget.</div><div class='add'>+ *</div><div class='add'>+ * If the dict (@xattr) is NULL, then how should that be handled? Fail the</div><div class='add'>+ * lookup operation? Or let it continue with version being initialized to</div><div class='add'>+ * BITROT_DEFAULT_CURRENT_VERSION. But what if the version was different</div><div class='add'>+ * on disk (and also a right signature was there), but posix failed to</div><div class='add'>+ * successfully allocate the dict? Posix does not treat call back xdata</div><div class='add'>+ * creattion failure as the lookup failure.</div><div class='add'>+ */</div><div class='add'>+static int32_t</div><div class='add'>+br_stub_lookup_version(xlator_t *this, uuid_t gfid, inode_t *inode,</div><div class='add'>+                       dict_t *xattr)</div><div class='add'>+{</div><div class='add'>+    unsigned long version = 0;</div><div class='add'>+    br_version_t *obuf = NULL;</div><div class='add'>+    br_signature_t *sbuf = NULL;</div><div class='add'>+    br_vxattr_status_t status;</div><div class='add'>+    gf_boolean_t bad_object = _gf_false;</div><div class='add'>+</div><div class='add'>+    /**</div><div class='add'>+     * versioning xattrs were requested from POSIX. if available, figure</div><div class='add'>+     * out the correct version to use in the inode context (start with</div><div class='add'>+     * the default version if unavailable). As of now versions are not</div><div class='add'>+     * persisted on-disk. The inode is marked dirty, so that the first</div><div class='add'>+     * operation (such as write(), etc..) triggers synchronization to</div><div class='add'>+     * disk.</div><div class='add'>+     */</div><div class='add'>+    status = br_version_xattr_state(xattr, &amp;obuf, &amp;sbuf, &amp;bad_object);</div><div class='add'>+    version = ((status == BR_VXATTR_STATUS_FULL) ||</div><div class='add'>+               (status == BR_VXATTR_STATUS_UNSIGNED))</div><div class='add'>+                  ? obuf-&gt;ongoingversion</div><div class='add'>+                  : BITROT_DEFAULT_CURRENT_VERSION;</div><div class='add'>+</div><div class='add'>+    /**</div><div class='add'>+     * If signature is there, but version is not there then that status is</div><div class='add'>+     * is treated as INVALID. So in that case, we should not initialize the</div><div class='add'>+     * inode context with wrong version names etc.</div><div class='add'>+     */</div><div class='add'>+    if (status == BR_VXATTR_STATUS_INVALID)</div><div class='add'>+        return -1;</div><div class='add'>+</div><div class='add'>+    return br_stub_init_inode_versions(this, NULL, inode, version, _gf_true,</div><div class='add'>+                                       bad_object, NULL);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/** {{{ */</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+br_stub_opendir(call_frame_t *frame, xlator_t *this, loc_t *loc, fd_t *fd,</div><div class='add'>+                dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    br_stub_private_t *priv = NULL;</div><div class='add'>+    br_stub_fd_t *fd_ctx = NULL;</div><div class='add'>+    int32_t op_ret = -1;</div><div class='add'>+    int32_t op_errno = EINVAL;</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+    if (gf_uuid_compare(fd-&gt;inode-&gt;gfid, priv-&gt;bad_object_dir_gfid))</div><div class='add'>+        goto normal;</div><div class='add'>+</div><div class='add'>+    fd_ctx = br_stub_fd_new();</div><div class='add'>+    if (!fd_ctx) {</div><div class='add'>+        op_errno = ENOMEM;</div><div class='add'>+        goto unwind;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    fd_ctx-&gt;bad_object.dir_eof = -1;</div><div class='add'>+    fd_ctx-&gt;bad_object.dir = sys_opendir(priv-&gt;stub_basepath);</div><div class='add'>+    if (!fd_ctx-&gt;bad_object.dir) {</div><div class='add'>+        op_errno = errno;</div><div class='add'>+        goto err_freectx;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    op_ret = br_stub_fd_ctx_set(this, fd, fd_ctx);</div><div class='add'>+    if (!op_ret)</div><div class='add'>+        goto unwind;</div><div class='add'>+</div><div class='add'>+    sys_closedir(fd_ctx-&gt;bad_object.dir);</div><div class='add'>+</div><div class='add'>+err_freectx:</div><div class='add'>+    GF_FREE(fd_ctx);</div><div class='add'>+unwind:</div><div class='add'>+    STACK_UNWIND_STRICT(opendir, frame, op_ret, op_errno, fd, NULL);</div><div class='add'>+    return 0;</div><div class='add'>+</div><div class='add'>+normal:</div><div class='add'>+    STACK_WIND(frame, default_opendir_cbk, FIRST_CHILD(this),</div><div class='add'>+               FIRST_CHILD(this)-&gt;fops-&gt;opendir, loc, fd, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+br_stub_readdir(call_frame_t *frame, xlator_t *this, fd_t *fd, size_t size,</div><div class='add'>+                off_t off, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    call_stub_t *stub = NULL;</div><div class='add'>+    br_stub_private_t *priv = NULL;</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+    if (!priv-&gt;do_versioning)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    if (gf_uuid_compare(fd-&gt;inode-&gt;gfid, priv-&gt;bad_object_dir_gfid))</div><div class='add'>+        goto out;</div><div class='add'>+    stub = fop_readdir_stub(frame, br_stub_readdir_wrapper, fd, size, off,</div><div class='add'>+                            xdata);</div><div class='add'>+    if (!stub) {</div><div class='add'>+        STACK_UNWIND_STRICT(readdir, frame, -1, ENOMEM, NULL, NULL);</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='add'>+    br_stub_worker_enqueue(this, stub);</div><div class='add'>+    return 0;</div><div class='add'>+out:</div><div class='add'>+    STACK_WIND(frame, default_readdir_cbk, FIRST_CHILD(this),</div><div class='add'>+               FIRST_CHILD(this)-&gt;fops-&gt;readdir, fd, size, off, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+br_stub_readdirp_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                     int op_ret, int op_errno, gf_dirent_t *entries,</div><div class='add'>+                     dict_t *dict)</div><div class='add'>+{</div><div class='add'>+    int32_t ret = 0;</div><div class='add'>+    uint64_t ctxaddr = 0;</div><div class='add'>+    gf_dirent_t *entry = NULL;</div><div class='add'>+    br_stub_private_t *priv = NULL;</div><div class='add'>+    gf_boolean_t ver_enabled = _gf_false;</div><div class='add'>+</div><div class='add'>+    BR_STUB_VER_ENABLED_IN_CALLPATH(frame, ver_enabled);</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+    BR_STUB_VER_COND_GOTO(priv, (!ver_enabled), unwind);</div><div class='add'>+</div><div class='add'>+    if (op_ret &lt; 0)</div><div class='add'>+        goto unwind;</div><div class='add'>+</div><div class='add'>+    list_for_each_entry(entry, &amp;entries-&gt;list, list)</div><div class='add'>+    {</div><div class='add'>+        if ((strcmp(entry-&gt;d_name, ".") == 0) ||</div><div class='add'>+            (strcmp(entry-&gt;d_name, "..") == 0))</div><div class='add'>+            continue;</div><div class='add'>+</div><div class='add'>+        if (!IA_ISREG(entry-&gt;d_stat.ia_type))</div><div class='add'>+            continue;</div><div class='add'>+</div><div class='add'>+        /*</div><div class='add'>+         * Readdirp for most part is a bulk lookup for all the entries</div><div class='add'>+         * present in the directory being read. Ideally, for each</div><div class='add'>+         * entry, the handling should be similar to that of a lookup</div><div class='add'>+         * callback. But for now, just keeping this as it has been</div><div class='add'>+         * until now (which means, this comment has been added much</div><div class='add'>+         * later as part of a change that wanted to send the flag</div><div class='add'>+         * of true/false to br_stub_remove_vxattrs to indicate whether</div><div class='add'>+         * the bad-object xattr should be removed from the entry-&gt;dict</div><div class='add'>+         * or not). Until this change, the function br_stub_remove_vxattrs</div><div class='add'>+         * was just removing all the xattrs associated with bit-rot-stub</div><div class='add'>+         * (like version, bad-object, signature etc). But, there are</div><div class='add'>+         * scenarios where we only want to send bad-object xattr and not</div><div class='add'>+         * others. So this comment is part of that change which also</div><div class='add'>+         * mentions about another possible change that might be needed</div><div class='add'>+         * in future.</div><div class='add'>+         * But for now, adding _gf_true means functionally its same as</div><div class='add'>+         * what this function was doing before. Just remove all the stub</div><div class='add'>+         * related xattrs.</div><div class='add'>+         */</div><div class='add'>+        ret = br_stub_get_inode_ctx(this, entry-&gt;inode, &amp;ctxaddr);</div><div class='add'>+        if (ret &lt; 0)</div><div class='add'>+            ctxaddr = 0;</div><div class='add'>+        if (ctxaddr) { /* already has the context */</div><div class='add'>+            br_stub_remove_vxattrs(entry-&gt;dict, _gf_true);</div><div class='add'>+            continue;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        ret = br_stub_lookup_version(this, entry-&gt;inode-&gt;gfid, entry-&gt;inode,</div><div class='add'>+                                     entry-&gt;dict);</div><div class='add'>+        br_stub_remove_vxattrs(entry-&gt;dict, _gf_true);</div><div class='add'>+        if (ret) {</div><div class='add'>+            /**</div><div class='add'>+             * there's no per-file granularity support in case of</div><div class='add'>+             * failure. let's fail the entire request for now..</div><div class='add'>+             */</div><div class='add'>+            break;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (ret) {</div><div class='add'>+        op_ret = -1;</div><div class='add'>+        op_errno = EINVAL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+unwind:</div><div class='add'>+    STACK_UNWIND_STRICT(readdirp, frame, op_ret, op_errno, entries, dict);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+br_stub_readdirp(call_frame_t *frame, xlator_t *this, fd_t *fd, size_t size,</div><div class='add'>+                 off_t offset, dict_t *dict)</div><div class='add'>+{</div><div class='add'>+    int32_t ret = -1;</div><div class='add'>+    int op_errno = 0;</div><div class='add'>+    gf_boolean_t xref = _gf_false;</div><div class='add'>+    br_stub_private_t *priv = NULL;</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+    BR_STUB_VER_NOT_ACTIVE_THEN_GOTO(frame, priv, wind);</div><div class='add'>+</div><div class='add'>+    op_errno = ENOMEM;</div><div class='add'>+    if (!dict) {</div><div class='add'>+        dict = dict_new();</div><div class='add'>+        if (!dict)</div><div class='add'>+            goto unwind;</div><div class='add'>+    } else {</div><div class='add'>+        dict = dict_ref(dict);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    xref = _gf_true;</div><div class='add'>+</div><div class='add'>+    op_errno = EINVAL;</div><div class='add'>+    ret = dict_set_uint32(dict, BITROT_CURRENT_VERSION_KEY, 0);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto unwind;</div><div class='add'>+    ret = dict_set_uint32(dict, BITROT_SIGNING_VERSION_KEY, 0);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto unwind;</div><div class='add'>+    ret = dict_set_uint32(dict, BITROT_OBJECT_BAD_KEY, 0);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto unwind;</div><div class='add'>+</div><div class='add'>+wind:</div><div class='add'>+    STACK_WIND(frame, br_stub_readdirp_cbk, FIRST_CHILD(this),</div><div class='add'>+               FIRST_CHILD(this)-&gt;fops-&gt;readdirp, fd, size, offset, dict);</div><div class='add'>+    goto unref_dict;</div><div class='add'>+</div><div class='add'>+unwind:</div><div class='add'>+    if (frame-&gt;local == (void *)0x1)</div><div class='add'>+        frame-&gt;local = NULL;</div><div class='add'>+    STACK_UNWIND_STRICT(readdirp, frame, -1, op_errno, NULL, NULL);</div><div class='add'>+    return 0;</div><div class='add'>+</div><div class='add'>+unref_dict:</div><div class='add'>+    if (xref)</div><div class='add'>+        dict_unref(dict);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/** }}} */</div><div class='add'>+</div><div class='add'>+/** {{{ */</div><div class='add'>+</div><div class='add'>+/* lookup() */</div><div class='add'>+</div><div class='add'>+/**</div><div class='add'>+ * This function mainly handles the ENOENT error for the bad objects. Though</div><div class='add'>+ * br_stub_forget () handles removal of the link for the bad object from the</div><div class='add'>+ * quarantine directory, its better to handle it in lookup as well, where</div><div class='add'>+ * a failed lookup on a bad object with ENOENT, will trigger deletion of the</div><div class='add'>+ * link for the bad object from quarantine directory. So whoever comes first</div><div class='add'>+ * either forget () or lookup () will take care of removing the link.</div><div class='add'>+ */</div><div class='add'>+void</div><div class='add'>+br_stub_handle_lookup_error(xlator_t *this, inode_t *inode, int32_t op_errno)</div><div class='add'>+{</div><div class='add'>+    int32_t ret = -1;</div><div class='add'>+    uint64_t ctx_addr = 0;</div><div class='add'>+    br_stub_inode_ctx_t *ctx = NULL;</div><div class='add'>+</div><div class='add'>+    if (op_errno != ENOENT)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    if (!inode_is_linked(inode))</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    ret = br_stub_get_inode_ctx(this, inode, &amp;ctx_addr);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    ctx = (br_stub_inode_ctx_t *)(long)ctx_addr;</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;inode-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        if (__br_stub_is_bad_object(ctx))</div><div class='add'>+            (void)br_stub_del(this, inode-&gt;gfid);</div><div class='add'>+    }</div><div class='add'>+    UNLOCK(&amp;inode-&gt;lock);</div><div class='add'>+</div><div class='add'>+    if (__br_stub_is_bad_object(ctx)) {</div><div class='add'>+        /* File is not present, might be deleted for recovery,</div><div class='add'>+         * del the bitrot inode context</div><div class='add'>+         */</div><div class='add'>+        ctx_addr = 0;</div><div class='add'>+        inode_ctx_del(inode, this, &amp;ctx_addr);</div><div class='add'>+        if (ctx_addr) {</div><div class='add'>+            ctx = (br_stub_inode_ctx_t *)(long)ctx_addr;</div><div class='add'>+            GF_FREE(ctx);</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+br_stub_lookup_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                   int op_ret, int op_errno, inode_t *inode, struct iatt *stbuf,</div><div class='add'>+                   dict_t *xattr, struct iatt *postparent)</div><div class='add'>+{</div><div class='add'>+    int32_t ret = 0;</div><div class='add'>+    br_stub_private_t *priv = NULL;</div><div class='add'>+    gf_boolean_t ver_enabled = _gf_false;</div><div class='add'>+    gf_boolean_t remove_bad_file_marker = _gf_true;</div><div class='add'>+</div><div class='add'>+    BR_STUB_VER_ENABLED_IN_CALLPATH(frame, ver_enabled);</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    if (op_ret &lt; 0) {</div><div class='add'>+        (void)br_stub_handle_lookup_error(this, inode, op_errno);</div><div class='add'>+</div><div class='add'>+        /*</div><div class='add'>+         * If the lookup error is not ENOENT, then it is better</div><div class='add'>+         * to send the bad file marker to the higher layer (if</div><div class='add'>+         * it has been set)</div><div class='add'>+         */</div><div class='add'>+        if (op_errno != ENOENT)</div><div class='add'>+            remove_bad_file_marker = _gf_false;</div><div class='add'>+        goto delkey;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    BR_STUB_VER_COND_GOTO(priv, (!ver_enabled), delkey);</div><div class='add'>+</div><div class='add'>+    if (!IA_ISREG(stbuf-&gt;ia_type))</div><div class='add'>+        goto unwind;</div><div class='add'>+</div><div class='add'>+    /**</div><div class='add'>+     * If the object is bad, then "bad inode" marker has to be sent back</div><div class='add'>+     * in resoinse, for revalidated lookups as well. Some xlators such as</div><div class='add'>+     * quick-read might cache the data in revalidated lookup as fresh</div><div class='add'>+     * lookup would anyway have sent "bad inode" marker.</div><div class='add'>+     * In general send bad inode marker for every lookup operation on the</div><div class='add'>+     * bad object.</div><div class='add'>+     */</div><div class='add'>+    if (cookie != (void *)BR_STUB_REQUEST_COOKIE) {</div><div class='add'>+        ret = br_stub_mark_xdata_bad_object(this, inode, xattr);</div><div class='add'>+        if (ret) {</div><div class='add'>+            op_ret = -1;</div><div class='add'>+            op_errno = EIO;</div><div class='add'>+            /*</div><div class='add'>+             * This flag ensures that in the label @delkey below,</div><div class='add'>+             * bad file marker is not removed from the dictinary,</div><div class='add'>+             * but other virtual xattrs (such as version, signature)</div><div class='add'>+             * are removed.</div><div class='add'>+             */</div><div class='add'>+            remove_bad_file_marker = _gf_false;</div><div class='add'>+        }</div><div class='add'>+        goto delkey;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = br_stub_lookup_version(this, stbuf-&gt;ia_gfid, inode, xattr);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        op_ret = -1;</div><div class='add'>+        op_errno = EINVAL;</div><div class='add'>+        goto delkey;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /**</div><div class='add'>+     * If the object is bad, send "bad inode" marker back in response</div><div class='add'>+     * for xlator(s) to act accordingly (such as quick-read, etc..)</div><div class='add'>+     */</div><div class='add'>+    ret = br_stub_mark_xdata_bad_object(this, inode, xattr);</div><div class='add'>+    if (ret) {</div><div class='add'>+        /**</div><div class='add'>+         * aaha! bad object, but sorry we would not</div><div class='add'>+         * satisfy the request on allocation failures.</div><div class='add'>+         */</div><div class='add'>+        op_ret = -1;</div><div class='add'>+        op_errno = EIO;</div><div class='add'>+        goto delkey;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+delkey:</div><div class='add'>+    br_stub_remove_vxattrs(xattr, remove_bad_file_marker);</div><div class='add'>+unwind:</div><div class='add'>+    STACK_UNWIND_STRICT(lookup, frame, op_ret, op_errno, inode, stbuf, xattr,</div><div class='add'>+                        postparent);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+br_stub_lookup(call_frame_t *frame, xlator_t *this, loc_t *loc, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    int32_t ret = 0;</div><div class='add'>+    int op_errno = 0;</div><div class='add'>+    void *cookie = NULL;</div><div class='add'>+    uint64_t ctx_addr = 0;</div><div class='add'>+    gf_boolean_t xref = _gf_false;</div><div class='add'>+    br_stub_private_t *priv = NULL;</div><div class='add'>+    call_stub_t *stub = NULL;</div><div class='add'>+</div><div class='add'>+    GF_VALIDATE_OR_GOTO("bit-rot-stub", this, unwind);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, loc, unwind);</div><div class='add'>+    GF_VALIDATE_OR_GOTO(this-&gt;name, loc-&gt;inode, unwind);</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    BR_STUB_VER_NOT_ACTIVE_THEN_GOTO(frame, priv, wind);</div><div class='add'>+</div><div class='add'>+    if (!gf_uuid_compare(loc-&gt;gfid, priv-&gt;bad_object_dir_gfid) ||</div><div class='add'>+        !gf_uuid_compare(loc-&gt;pargfid, priv-&gt;bad_object_dir_gfid)) {</div><div class='add'>+        stub = fop_lookup_stub(frame, br_stub_lookup_wrapper, loc, xdata);</div><div class='add'>+        if (!stub) {</div><div class='add'>+            op_errno = ENOMEM;</div><div class='add'>+            goto unwind;</div><div class='add'>+        }</div><div class='add'>+        br_stub_worker_enqueue(this, stub);</div><div class='add'>+        return 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = br_stub_get_inode_ctx(this, loc-&gt;inode, &amp;ctx_addr);</div><div class='add'>+    if (ret &lt; 0)</div><div class='add'>+        ctx_addr = 0;</div><div class='add'>+    if (ctx_addr != 0)</div><div class='add'>+        goto wind;</div><div class='add'>+</div><div class='add'>+    /**</div><div class='add'>+     * fresh lookup: request version keys from POSIX</div><div class='add'>+     */</div><div class='add'>+    op_errno = ENOMEM;</div><div class='add'>+    if (!xdata) {</div><div class='add'>+        xdata = dict_new();</div><div class='add'>+        if (!xdata)</div><div class='add'>+            goto unwind;</div><div class='add'>+    } else {</div><div class='add'>+        xdata = dict_ref(xdata);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    xref = _gf_true;</div><div class='add'>+</div><div class='add'>+    /**</div><div class='add'>+     * Requesting both xattrs provides a way of sanity checking the</div><div class='add'>+     * object. Anomaly checking is done in cbk by examining absence</div><div class='add'>+     * of either or both xattrs.</div><div class='add'>+     */</div><div class='add'>+    op_errno = EINVAL;</div><div class='add'>+    ret = dict_set_uint32(xdata, BITROT_CURRENT_VERSION_KEY, 0);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto unwind;</div><div class='add'>+    ret = dict_set_uint32(xdata, BITROT_SIGNING_VERSION_KEY, 0);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto unwind;</div><div class='add'>+    ret = dict_set_uint32(xdata, BITROT_OBJECT_BAD_KEY, 0);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto unwind;</div><div class='add'>+    cookie = (void *)BR_STUB_REQUEST_COOKIE;</div><div class='add'>+</div><div class='add'>+wind:</div><div class='add'>+    STACK_WIND_COOKIE(frame, br_stub_lookup_cbk, cookie, FIRST_CHILD(this),</div><div class='add'>+                      FIRST_CHILD(this)-&gt;fops-&gt;lookup, loc, xdata);</div><div class='add'>+    goto dealloc_dict;</div><div class='add'>+</div><div class='add'>+unwind:</div><div class='add'>+    if (frame-&gt;local == (void *)0x1)</div><div class='add'>+        frame-&gt;local = NULL;</div><div class='add'>+    STACK_UNWIND_STRICT(lookup, frame, -1, op_errno, NULL, NULL, NULL, NULL);</div><div class='add'>+dealloc_dict:</div><div class='add'>+    if (xref)</div><div class='add'>+        dict_unref(xdata);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/** }}} */</div><div class='add'>+</div><div class='add'>+/** {{{ */</div><div class='add'>+</div><div class='add'>+/* stat */</div><div class='add'>+int</div><div class='add'>+br_stub_stat(call_frame_t *frame, xlator_t *this, loc_t *loc, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    int32_t ret = 0;</div><div class='add'>+    int32_t op_ret = -1;</div><div class='add'>+    int32_t op_errno = EINVAL;</div><div class='add'>+    br_stub_private_t *priv = NULL;</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    if (!priv-&gt;do_versioning)</div><div class='add'>+        goto wind;</div><div class='add'>+</div><div class='add'>+    if (!IA_ISREG(loc-&gt;inode-&gt;ia_type))</div><div class='add'>+        goto wind;</div><div class='add'>+</div><div class='add'>+    ret = br_stub_check_bad_object(this, loc-&gt;inode, &amp;op_ret, &amp;op_errno);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto unwind;</div><div class='add'>+</div><div class='add'>+wind:</div><div class='add'>+    STACK_WIND_TAIL(frame, FIRST_CHILD(this), FIRST_CHILD(this)-&gt;fops-&gt;stat,</div><div class='add'>+                    loc, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+</div><div class='add'>+unwind:</div><div class='add'>+    STACK_UNWIND_STRICT(stat, frame, op_ret, op_errno, NULL, NULL);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* fstat */</div><div class='add'>+int</div><div class='add'>+br_stub_fstat(call_frame_t *frame, xlator_t *this, fd_t *fd, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    int32_t ret = 0;</div><div class='add'>+    int32_t op_ret = -1;</div><div class='add'>+    int32_t op_errno = EINVAL;</div><div class='add'>+    br_stub_private_t *priv = NULL;</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    if (!priv-&gt;do_versioning)</div><div class='add'>+        goto wind;</div><div class='add'>+</div><div class='add'>+    if (!IA_ISREG(fd-&gt;inode-&gt;ia_type))</div><div class='add'>+        goto wind;</div><div class='add'>+</div><div class='add'>+    ret = br_stub_check_bad_object(this, fd-&gt;inode, &amp;op_ret, &amp;op_errno);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto unwind;</div><div class='add'>+</div><div class='add'>+wind:</div><div class='add'>+    STACK_WIND_TAIL(frame, FIRST_CHILD(this), FIRST_CHILD(this)-&gt;fops-&gt;fstat,</div><div class='add'>+                    fd, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+</div><div class='add'>+unwind:</div><div class='add'>+    STACK_UNWIND_STRICT(fstat, frame, op_ret, op_errno, NULL, NULL);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/** }}} */</div><div class='add'>+</div><div class='add'>+/** {{{ */</div><div class='add'>+</div><div class='add'>+/* unlink() */</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+br_stub_unlink_cbk(call_frame_t *frame, void *cookie, xlator_t *this,</div><div class='add'>+                   int32_t op_ret, int32_t op_errno, struct iatt *preparent,</div><div class='add'>+                   struct iatt *postparent, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    br_stub_local_t *local = NULL;</div><div class='add'>+    inode_t *inode = NULL;</div><div class='add'>+    uint64_t ctx_addr = 0;</div><div class='add'>+    br_stub_inode_ctx_t *ctx = NULL;</div><div class='add'>+    int32_t ret = -1;</div><div class='add'>+    br_stub_private_t *priv = NULL;</div><div class='add'>+    gf_boolean_t ver_enabled = _gf_false;</div><div class='add'>+</div><div class='add'>+    BR_STUB_VER_ENABLED_IN_CALLPATH(frame, ver_enabled);</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+    BR_STUB_VER_COND_GOTO(priv, (!ver_enabled), unwind);</div><div class='add'>+</div><div class='add'>+    local = frame-&gt;local;</div><div class='add'>+    frame-&gt;local = NULL;</div><div class='add'>+</div><div class='add'>+    if (op_ret &lt; 0)</div><div class='add'>+        goto unwind;</div><div class='add'>+</div><div class='add'>+    if (!local) {</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_WARNING, 0, BRS_MSG_NULL_LOCAL, NULL);</div><div class='add'>+        goto unwind;</div><div class='add'>+    }</div><div class='add'>+    inode = local-&gt;u.context.inode;</div><div class='add'>+    if (!IA_ISREG(inode-&gt;ia_type))</div><div class='add'>+        goto unwind;</div><div class='add'>+</div><div class='add'>+    ret = br_stub_get_inode_ctx(this, inode, &amp;ctx_addr);</div><div class='add'>+    if (ret) {</div><div class='add'>+        /**</div><div class='add'>+         * If the inode is bad AND context is not there, then there</div><div class='add'>+         * is a possibility of the gfid of the object being listed</div><div class='add'>+         * in the quarantine directory and will be shown in the</div><div class='add'>+         * bad objects list. So continuing with the fop with a</div><div class='add'>+         * warning log. The entry from the quarantine directory</div><div class='add'>+         * has to be removed manually. Its not a good idea to fail</div><div class='add'>+         * the fop, as the object has already been deleted.</div><div class='add'>+         */</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_WARNING, 0, BRS_MSG_GET_INODE_CONTEXT_FAILED,</div><div class='add'>+                "inode-gfid=%s", uuid_utoa(inode-&gt;gfid), NULL);</div><div class='add'>+        goto unwind;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ctx = (br_stub_inode_ctx_t *)(long)ctx_addr;</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;inode-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        /**</div><div class='add'>+         * Ignoring the return value of br_stub_del ().</div><div class='add'>+         * There is not much that can be done if unlinking</div><div class='add'>+         * of the entry in the quarantine directory fails.</div><div class='add'>+         * The failure is logged.</div><div class='add'>+         */</div><div class='add'>+        if (__br_stub_is_bad_object(ctx))</div><div class='add'>+            (void)br_stub_del(this, inode-&gt;gfid);</div><div class='add'>+    }</div><div class='add'>+    UNLOCK(&amp;inode-&gt;lock);</div><div class='add'>+</div><div class='add'>+unwind:</div><div class='add'>+    STACK_UNWIND_STRICT(unlink, frame, op_ret, op_errno, preparent, postparent,</div><div class='add'>+                        xdata);</div><div class='add'>+    br_stub_cleanup_local(local);</div><div class='add'>+    br_stub_dealloc_local(local);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+br_stub_unlink(call_frame_t *frame, xlator_t *this, loc_t *loc, int flag,</div><div class='add'>+               dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    br_stub_local_t *local = NULL;</div><div class='add'>+    int32_t op_ret = -1;</div><div class='add'>+    int32_t op_errno = 0;</div><div class='add'>+    br_stub_private_t *priv = NULL;</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+    BR_STUB_VER_NOT_ACTIVE_THEN_GOTO(frame, priv, wind);</div><div class='add'>+</div><div class='add'>+    local = br_stub_alloc_local(this);</div><div class='add'>+    if (!local) {</div><div class='add'>+        op_ret = -1;</div><div class='add'>+        op_errno = ENOMEM;</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_ERROR, ENOMEM, BRS_MSG_ALLOC_MEM_FAILED,</div><div class='add'>+                "local path=%s", loc-&gt;path, "gfid=%s",</div><div class='add'>+                uuid_utoa(loc-&gt;inode-&gt;gfid), NULL);</div><div class='add'>+        goto unwind;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    br_stub_fill_local(local, NULL, NULL, loc-&gt;inode, loc-&gt;inode-&gt;gfid,</div><div class='add'>+                       BR_STUB_NO_VERSIONING, 0);</div><div class='add'>+</div><div class='add'>+    frame-&gt;local = local;</div><div class='add'>+</div><div class='add'>+wind:</div><div class='add'>+    STACK_WIND(frame, br_stub_unlink_cbk, FIRST_CHILD(this),</div><div class='add'>+               FIRST_CHILD(this)-&gt;fops-&gt;unlink, loc, flag, xdata);</div><div class='add'>+    return 0;</div><div class='add'>+</div><div class='add'>+unwind:</div><div class='add'>+    if (frame-&gt;local == (void *)0x1)</div><div class='add'>+        frame-&gt;local = NULL;</div><div class='add'>+    STACK_UNWIND_STRICT(unlink, frame, op_ret, op_errno, NULL, NULL, NULL);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/** }}} */</div><div class='add'>+</div><div class='add'>+/** {{{ */</div><div class='add'>+</div><div class='add'>+/* forget() */</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+br_stub_forget(xlator_t *this, inode_t *inode)</div><div class='add'>+{</div><div class='add'>+    uint64_t ctx_addr = 0;</div><div class='add'>+    br_stub_inode_ctx_t *ctx = NULL;</div><div class='add'>+</div><div class='add'>+    inode_ctx_del(inode, this, &amp;ctx_addr);</div><div class='add'>+    if (!ctx_addr)</div><div class='add'>+        return 0;</div><div class='add'>+</div><div class='add'>+    ctx = (br_stub_inode_ctx_t *)(long)ctx_addr;</div><div class='add'>+</div><div class='add'>+    GF_FREE(ctx);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/** }}} */</div><div class='add'>+</div><div class='add'>+/** {{{ */</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+br_stub_noop(call_frame_t *frame, void *cookie, xlator_t *this, int32_t op_ret,</div><div class='add'>+             int32_t op_errno, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    STACK_DESTROY(frame-&gt;root);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+br_stub_send_ipc_fop(xlator_t *this, fd_t *fd, unsigned long releaseversion,</div><div class='add'>+                     int sign_info)</div><div class='add'>+{</div><div class='add'>+    int32_t op = 0;</div><div class='add'>+    int32_t ret = 0;</div><div class='add'>+    dict_t *xdata = NULL;</div><div class='add'>+    call_frame_t *frame = NULL;</div><div class='add'>+    changelog_event_t ev = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    ev.ev_type = CHANGELOG_OP_TYPE_BR_RELEASE;</div><div class='add'>+    ev.u.releasebr.version = releaseversion;</div><div class='add'>+    ev.u.releasebr.sign_info = sign_info;</div><div class='add'>+    gf_uuid_copy(ev.u.releasebr.gfid, fd-&gt;inode-&gt;gfid);</div><div class='add'>+</div><div class='add'>+    xdata = dict_new();</div><div class='add'>+    if (!xdata) {</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_WARNING, ENOMEM, BRS_MSG_DICT_ALLOC_FAILED,</div><div class='add'>+                NULL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = dict_set_static_bin(xdata, "RELEASE-EVENT", &amp;ev, CHANGELOG_EV_SIZE);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_WARNING, 0, BRS_MSG_SET_EVENT_FAILED, NULL);</div><div class='add'>+        goto dealloc_dict;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    frame = create_frame(this, this-&gt;ctx-&gt;pool);</div><div class='add'>+    if (!frame) {</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_WARNING, 0, BRS_MSG_CREATE_FRAME_FAILED,</div><div class='add'>+                NULL);</div><div class='add'>+        goto dealloc_dict;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    op = GF_IPC_TARGET_CHANGELOG;</div><div class='add'>+    STACK_WIND(frame, br_stub_noop, FIRST_CHILD(this),</div><div class='add'>+               FIRST_CHILD(this)-&gt;fops-&gt;ipc, op, xdata);</div><div class='add'>+</div><div class='add'>+dealloc_dict:</div><div class='add'>+    dict_unref(xdata);</div><div class='add'>+out:</div><div class='add'>+    return;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/**</div><div class='add'>+ * This is how the state machine of sign info works:</div><div class='add'>+ * 3 states:</div><div class='add'>+ * 1) BR_SIGN_NORMAL =&gt; The default State of the inode</div><div class='add'>+ * 2) BR_SIGN_REOPEN_WAIT =&gt; A release has been sent and is waiting for reopen</div><div class='add'>+ * 3) BR_SIGN_QUICK =&gt; reopen has happened and this release should trigger sign</div><div class='add'>+ * 2 events:</div><div class='add'>+ * 1) GF_FOP_RELEASE</div><div class='add'>+ * 2) GF_FOP_WRITE (actually a dummy write for BitD)</div><div class='add'>+ *</div><div class='add'>+ * This is how states are changed based on events:</div><div class='add'>+ * EVENT: GF_FOP_RELEASE:</div><div class='add'>+ * if (state == BR_SIGN_NORMAL) ; then</div><div class='add'>+ *     set state = BR_SIGN_REOPEN_WAIT;</div><div class='add'>+ * if (state == BR_SIGN_QUICK); then</div><div class='add'>+ *     set state = BR_SIGN_NORMAL;</div><div class='add'>+ * EVENT: GF_FOP_WRITE:</div><div class='add'>+ *  if (state == BR_SIGN_REOPEN_WAIT); then</div><div class='add'>+ *     set state = BR_SIGN_QUICK;</div><div class='add'>+ */</div><div class='add'>+br_sign_state_t</div><div class='add'>+__br_stub_inode_sign_state(br_stub_inode_ctx_t *ctx, glusterfs_fop_t fop,</div><div class='add'>+                           fd_t *fd)</div><div class='add'>+{</div><div class='add'>+    br_sign_state_t sign_info = BR_SIGN_INVALID;</div><div class='add'>+</div><div class='add'>+    switch (fop) {</div><div class='add'>+        case GF_FOP_FSETXATTR:</div><div class='add'>+            sign_info = ctx-&gt;info_sign = BR_SIGN_QUICK;</div><div class='add'>+            break;</div><div class='add'>+</div><div class='add'>+        case GF_FOP_RELEASE:</div><div class='add'>+            GF_ASSERT(ctx-&gt;info_sign != BR_SIGN_REOPEN_WAIT);</div><div class='add'>+</div><div class='add'>+            if (ctx-&gt;info_sign == BR_SIGN_NORMAL) {</div><div class='add'>+                sign_info = ctx-&gt;info_sign = BR_SIGN_REOPEN_WAIT;</div><div class='add'>+            } else {</div><div class='add'>+                sign_info = ctx-&gt;info_sign;</div><div class='add'>+                ctx-&gt;info_sign = BR_SIGN_NORMAL;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            break;</div><div class='add'>+        default:</div><div class='add'>+            break;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return sign_info;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+br_stub_release(xlator_t *this, fd_t *fd)</div><div class='add'>+{</div><div class='add'>+    int32_t ret = 0;</div><div class='add'>+    int32_t flags = 0;</div><div class='add'>+    inode_t *inode = NULL;</div><div class='add'>+    unsigned long releaseversion = 0;</div><div class='add'>+    br_stub_inode_ctx_t *ctx = NULL;</div><div class='add'>+    uint64_t tmp = 0;</div><div class='add'>+    br_stub_fd_t *br_stub_fd = NULL;</div><div class='add'>+    int32_t signinfo = 0;</div><div class='add'>+</div><div class='add'>+    inode = fd-&gt;inode;</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;inode-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        ctx = __br_stub_get_ongoing_version_ctx(this, inode, NULL);</div><div class='add'>+        if (ctx == NULL)</div><div class='add'>+            goto unblock;</div><div class='add'>+        br_stub_fd = br_stub_fd_ctx_get(this, fd);</div><div class='add'>+        if (br_stub_fd) {</div><div class='add'>+            list_del_init(&amp;br_stub_fd-&gt;list);</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        ret = __br_stub_can_trigger_release(inode, ctx, &amp;releaseversion);</div><div class='add'>+        if (!ret)</div><div class='add'>+            goto unblock;</div><div class='add'>+</div><div class='add'>+        signinfo = __br_stub_inode_sign_state(ctx, GF_FOP_RELEASE, fd);</div><div class='add'>+        signinfo = htonl(signinfo);</div><div class='add'>+</div><div class='add'>+        /* inode back to initital state: mark dirty */</div><div class='add'>+        if (ctx-&gt;info_sign == BR_SIGN_NORMAL) {</div><div class='add'>+            __br_stub_mark_inode_dirty(ctx);</div><div class='add'>+            __br_stub_unset_inode_modified(ctx);</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+unblock:</div><div class='add'>+    UNLOCK(&amp;inode-&gt;lock);</div><div class='add'>+</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_msg_debug(this-&gt;name, 0,</div><div class='add'>+                     "releaseversion: %lu | flags: %d "</div><div class='add'>+                     "| signinfo: %d",</div><div class='add'>+                     (unsigned long)ntohl(releaseversion), flags,</div><div class='add'>+                     ntohl(signinfo));</div><div class='add'>+        br_stub_send_ipc_fop(this, fd, releaseversion, signinfo);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = fd_ctx_del(fd, this, &amp;tmp);</div><div class='add'>+    br_stub_fd = (br_stub_fd_t *)(long)tmp;</div><div class='add'>+</div><div class='add'>+    GF_FREE(br_stub_fd);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+br_stub_releasedir(xlator_t *this, fd_t *fd)</div><div class='add'>+{</div><div class='add'>+    br_stub_fd_t *fctx = NULL;</div><div class='add'>+    uint64_t ctx = 0;</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    ret = fd_ctx_del(fd, this, &amp;ctx);</div><div class='add'>+    if (ret &lt; 0)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    fctx = (br_stub_fd_t *)(long)ctx;</div><div class='add'>+    if (fctx-&gt;bad_object.dir) {</div><div class='add'>+        ret = sys_closedir(fctx-&gt;bad_object.dir);</div><div class='add'>+        if (ret)</div><div class='add'>+            gf_smsg(this-&gt;name, GF_LOG_ERROR, 0, BRS_MSG_BAD_OBJ_DIR_CLOSE_FAIL,</div><div class='add'>+                    "error=%s", strerror(errno), NULL);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    GF_FREE(fctx);</div><div class='add'>+out:</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/** }}} */</div><div class='add'>+</div><div class='add'>+/** {{{ */</div><div class='add'>+</div><div class='add'>+/* ictxmerge */</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+br_stub_ictxmerge(xlator_t *this, fd_t *fd, inode_t *inode,</div><div class='add'>+                  inode_t *linked_inode)</div><div class='add'>+{</div><div class='add'>+    int32_t ret = 0;</div><div class='add'>+    uint64_t ctxaddr = 0;</div><div class='add'>+    uint64_t lctxaddr = 0;</div><div class='add'>+    br_stub_inode_ctx_t *ctx = NULL;</div><div class='add'>+    br_stub_inode_ctx_t *lctx = NULL;</div><div class='add'>+    br_stub_fd_t *br_stub_fd = NULL;</div><div class='add'>+</div><div class='add'>+    ret = br_stub_get_inode_ctx(this, inode, &amp;ctxaddr);</div><div class='add'>+    if (ret &lt; 0)</div><div class='add'>+        goto done;</div><div class='add'>+    ctx = (br_stub_inode_ctx_t *)(uintptr_t)ctxaddr;</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;linked_inode-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        ret = __br_stub_get_inode_ctx(this, linked_inode, &amp;lctxaddr);</div><div class='add'>+        if (ret &lt; 0)</div><div class='add'>+            goto unblock;</div><div class='add'>+        lctx = (br_stub_inode_ctx_t *)(uintptr_t)lctxaddr;</div><div class='add'>+</div><div class='add'>+        GF_ASSERT(list_is_singular(&amp;ctx-&gt;fd_list));</div><div class='add'>+        br_stub_fd = list_first_entry(&amp;ctx-&gt;fd_list, br_stub_fd_t, list);</div><div class='add'>+        if (br_stub_fd) {</div><div class='add'>+            GF_ASSERT(br_stub_fd-&gt;fd == fd);</div><div class='add'>+            list_move_tail(&amp;br_stub_fd-&gt;list, &amp;lctx-&gt;fd_list);</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+unblock:</div><div class='add'>+    UNLOCK(&amp;linked_inode-&gt;lock);</div><div class='add'>+</div><div class='add'>+done:</div><div class='add'>+    return;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/** }}} */</div><div class='add'>+</div><div class='add'>+struct xlator_fops fops = {</div><div class='add'>+    .lookup = br_stub_lookup,</div><div class='add'>+    .stat = br_stub_stat,</div><div class='add'>+    .fstat = br_stub_fstat,</div><div class='add'>+    .open = br_stub_open,</div><div class='add'>+    .create = br_stub_create,</div><div class='add'>+    .readdirp = br_stub_readdirp,</div><div class='add'>+    .getxattr = br_stub_getxattr,</div><div class='add'>+    .fgetxattr = br_stub_fgetxattr,</div><div class='add'>+    .fsetxattr = br_stub_fsetxattr,</div><div class='add'>+    .writev = br_stub_writev,</div><div class='add'>+    .truncate = br_stub_truncate,</div><div class='add'>+    .ftruncate = br_stub_ftruncate,</div><div class='add'>+    .mknod = br_stub_mknod,</div><div class='add'>+    .readv = br_stub_readv,</div><div class='add'>+    .removexattr = br_stub_removexattr,</div><div class='add'>+    .fremovexattr = br_stub_fremovexattr,</div><div class='add'>+    .setxattr = br_stub_setxattr,</div><div class='add'>+    .opendir = br_stub_opendir,</div><div class='add'>+    .readdir = br_stub_readdir,</div><div class='add'>+    .unlink = br_stub_unlink,</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct xlator_cbks cbks = {</div><div class='add'>+    .forget = br_stub_forget,</div><div class='add'>+    .release = br_stub_release,</div><div class='add'>+    .ictxmerge = br_stub_ictxmerge,</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct volume_options options[] = {</div><div class='add'>+    {.key = {"bitrot"},</div><div class='add'>+     .type = GF_OPTION_TYPE_BOOL,</div><div class='add'>+     .default_value = "off",</div><div class='add'>+     .op_version = {GD_OP_VERSION_3_7_0},</div><div class='add'>+     .flags = OPT_FLAG_SETTABLE | OPT_FLAG_FORCE,</div><div class='add'>+     .tags = {"bitrot"},</div><div class='add'>+     .description = "enable/disable bitrot stub"},</div><div class='add'>+    {.key = {"export"},</div><div class='add'>+     .type = GF_OPTION_TYPE_PATH,</div><div class='add'>+     .op_version = {GD_OP_VERSION_3_7_0},</div><div class='add'>+     .tags = {"bitrot"},</div><div class='add'>+     .description = "brick path for versioning",</div><div class='add'>+     .default_value = "{{ brick.path }}"},</div><div class='add'>+    {.key = {NULL}},</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+xlator_api_t xlator_api = {</div><div class='add'>+    .init = init,</div><div class='add'>+    .fini = fini,</div><div class='add'>+    .notify = notify,</div><div class='add'>+    .reconfigure = reconfigure,</div><div class='add'>+    .mem_acct_init = mem_acct_init,</div><div class='add'>+    .op_version = {1}, /* Present from the initial version */</div><div class='add'>+    .fops = &amp;fops,</div><div class='add'>+    .cbks = &amp;cbks,</div><div class='add'>+    .options = options,</div><div class='add'>+    .identifier = "bitrot-stub",</div><div class='add'>+    .category = GF_MAINTAINED,</div><div class='add'>+};</div><div class='head'>diff --git a/xlators/features/bit-rot/src/stub/bit-rot-stub.h b/xlators/features/bit-rot/src/stub/bit-rot-stub.h<br/>new file mode 100644<br/>index 00000000000..edd79a77e4f<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/xlators/features/bit-rot/src/stub/bit-rot-stub.h?id=d1d7a6f35c816822fab51c820e25023863c239c1'>xlators/features/bit-rot/src/stub/bit-rot-stub.h</a></div><div class='hunk'>@@ -0,0 +1,515 @@</div><div class='add'>+/*</div><div class='add'>+  Copyright (c) 2015 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+  This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+  This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+  General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+  later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+  cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+#ifndef __BIT_ROT_STUB_H__</div><div class='add'>+#define __BIT_ROT_STUB_H__</div><div class='add'>+</div><div class='add'>+#include &lt;glusterfs/glusterfs.h&gt;</div><div class='add'>+#include &lt;glusterfs/logging.h&gt;</div><div class='add'>+#include &lt;glusterfs/dict.h&gt;</div><div class='add'>+#include &lt;glusterfs/xlator.h&gt;</div><div class='add'>+#include &lt;glusterfs/defaults.h&gt;</div><div class='add'>+#include &lt;glusterfs/call-stub.h&gt;</div><div class='add'>+#include "bit-rot-stub-mem-types.h"</div><div class='add'>+#include &lt;glusterfs/syscall.h&gt;</div><div class='add'>+#include &lt;glusterfs/common-utils.h&gt;</div><div class='add'>+#include "bit-rot-common.h"</div><div class='add'>+#include "bit-rot-stub-messages.h"</div><div class='add'>+#include "glusterfs3-xdr.h"</div><div class='add'>+#include &lt;glusterfs/syncop.h&gt;</div><div class='add'>+#include &lt;glusterfs/syncop-utils.h&gt;</div><div class='add'>+</div><div class='add'>+#define BAD_OBJECT_THREAD_STACK_SIZE ((size_t)(1024 * 1024))</div><div class='add'>+#define BR_STUB_DUMP_STR_SIZE 65536</div><div class='add'>+</div><div class='add'>+#define BR_PATH_MAX_EXTRA (PATH_MAX + 1024)</div><div class='add'>+#define BR_PATH_MAX_PLUS (PATH_MAX + 2048)</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+ * Oops. Spelling mistake. Correcting it</div><div class='add'>+ */</div><div class='add'>+#define OLD_BR_STUB_QUARANTINE_DIR GF_HIDDEN_PATH "/quanrantine"</div><div class='add'>+#define BR_STUB_QUARANTINE_DIR GF_HIDDEN_PATH "/quarantine"</div><div class='add'>+</div><div class='add'>+/* do not reference frame-&gt;local in cbk unless initialized.</div><div class='add'>+ * Assigned 0x1 marks verisoning flag between call path and</div><div class='add'>+ * cbk path.</div><div class='add'>+ */</div><div class='add'>+#define BR_STUB_VER_NOT_ACTIVE_THEN_GOTO(frame, priv, label)                   \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        if (priv-&gt;do_versioning)                                               \</div><div class='add'>+            frame-&gt;local = (void *)0x1;                                        \</div><div class='add'>+        else                                                                   \</div><div class='add'>+            goto label;                                                        \</div><div class='add'>+    } while (0)</div><div class='add'>+</div><div class='add'>+#define BR_STUB_VER_COND_GOTO(priv, cond, label)                               \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        if (!priv-&gt;do_versioning || cond)                                      \</div><div class='add'>+            goto label;                                                        \</div><div class='add'>+    } while (0)</div><div class='add'>+</div><div class='add'>+#define BR_STUB_VER_ENABLED_IN_CALLPATH(frame, flag)                           \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        if (frame-&gt;local)                                                      \</div><div class='add'>+            flag = _gf_true;                                                   \</div><div class='add'>+        if (frame-&gt;local == (void *)0x1)                                       \</div><div class='add'>+            frame-&gt;local = NULL;                                               \</div><div class='add'>+    } while (0)</div><div class='add'>+</div><div class='add'>+#define BR_STUB_RESET_LOCAL_NULL(frame)                                        \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        if (frame-&gt;local == (void *)0x1)                                       \</div><div class='add'>+            frame-&gt;local = NULL;                                               \</div><div class='add'>+    } while (0)</div><div class='add'>+</div><div class='add'>+typedef int(br_stub_version_cbk)(call_frame_t *, void *, xlator_t *, int32_t,</div><div class='add'>+                                 int32_t, dict_t *);</div><div class='add'>+</div><div class='add'>+typedef struct br_stub_inode_ctx {</div><div class='add'>+    int need_writeback;           /* does the inode need</div><div class='add'>+                                        a writeback to disk? */</div><div class='add'>+    unsigned long currentversion; /* ongoing version */</div><div class='add'>+</div><div class='add'>+    int info_sign;</div><div class='add'>+    struct list_head fd_list; /* list of open fds or fds participating in</div><div class='add'>+                                 write operations */</div><div class='add'>+    gf_boolean_t bad_object;</div><div class='add'>+} br_stub_inode_ctx_t;</div><div class='add'>+</div><div class='add'>+typedef struct br_stub_fd {</div><div class='add'>+    fd_t *fd;</div><div class='add'>+    struct list_head list;</div><div class='add'>+    struct bad_object_dir {</div><div class='add'>+        DIR *dir;</div><div class='add'>+        off_t dir_eof;</div><div class='add'>+    } bad_object;</div><div class='add'>+} br_stub_fd_t;</div><div class='add'>+</div><div class='add'>+#define I_DIRTY (1 &lt;&lt; 0) /* inode needs writeback */</div><div class='add'>+#define I_MODIFIED (1 &lt;&lt; 1)</div><div class='add'>+#define WRITEBACK_DURABLE 1 /* writeback is durable */</div><div class='add'>+</div><div class='add'>+/**</div><div class='add'>+ * This could just have been a plain struct without unions and all,</div><div class='add'>+ * but we may need additional things in the future.</div><div class='add'>+ */</div><div class='add'>+typedef struct br_stub_local {</div><div class='add'>+    call_stub_t *fopstub; /* stub for original fop */</div><div class='add'>+</div><div class='add'>+    int versioningtype; /* not much used atm */</div><div class='add'>+</div><div class='add'>+    union {</div><div class='add'>+        struct br_stub_ctx {</div><div class='add'>+            fd_t *fd;</div><div class='add'>+            uuid_t gfid;</div><div class='add'>+            inode_t *inode;</div><div class='add'>+            unsigned long version;</div><div class='add'>+        } context;</div><div class='add'>+    } u;</div><div class='add'>+} br_stub_local_t;</div><div class='add'>+</div><div class='add'>+#define BR_STUB_NO_VERSIONING (1 &lt;&lt; 0)</div><div class='add'>+#define BR_STUB_INCREMENTAL_VERSIONING (1 &lt;&lt; 1)</div><div class='add'>+</div><div class='add'>+typedef struct br_stub_private {</div><div class='add'>+    gf_boolean_t do_versioning;</div><div class='add'>+</div><div class='add'>+    uint32_t boot[2];</div><div class='add'>+    char export[PATH_MAX];</div><div class='add'>+</div><div class='add'>+    pthread_mutex_t lock;</div><div class='add'>+    pthread_cond_t cond;</div><div class='add'>+</div><div class='add'>+    struct list_head squeue; /* ordered signing queue */</div><div class='add'>+    pthread_t signth;</div><div class='add'>+    struct bad_objects_container {</div><div class='add'>+        pthread_t thread;</div><div class='add'>+        pthread_mutex_t bad_lock;</div><div class='add'>+        pthread_cond_t bad_cond;</div><div class='add'>+        struct list_head bad_queue;</div><div class='add'>+    } container;</div><div class='add'>+    struct mem_pool *local_pool;</div><div class='add'>+</div><div class='add'>+    char stub_basepath[BR_PATH_MAX_EXTRA];</div><div class='add'>+</div><div class='add'>+    uuid_t bad_object_dir_gfid;</div><div class='add'>+} br_stub_private_t;</div><div class='add'>+</div><div class='add'>+br_stub_fd_t *</div><div class='add'>+br_stub_fd_new(void);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+__br_stub_fd_ctx_set(xlator_t *this, fd_t *fd, br_stub_fd_t *br_stub_fd);</div><div class='add'>+</div><div class='add'>+br_stub_fd_t *</div><div class='add'>+__br_stub_fd_ctx_get(xlator_t *this, fd_t *fd);</div><div class='add'>+</div><div class='add'>+br_stub_fd_t *</div><div class='add'>+br_stub_fd_ctx_get(xlator_t *this, fd_t *fd);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+br_stub_fd_ctx_set(xlator_t *this, fd_t *fd, br_stub_fd_t *br_stub_fd);</div><div class='add'>+</div><div class='add'>+static inline gf_boolean_t</div><div class='add'>+__br_stub_is_bad_object(br_stub_inode_ctx_t *ctx)</div><div class='add'>+{</div><div class='add'>+    return ctx-&gt;bad_object;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static inline void</div><div class='add'>+__br_stub_mark_object_bad(br_stub_inode_ctx_t *ctx)</div><div class='add'>+{</div><div class='add'>+    ctx-&gt;bad_object = _gf_true;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* inode writeback helpers */</div><div class='add'>+static inline void</div><div class='add'>+__br_stub_mark_inode_dirty(br_stub_inode_ctx_t *ctx)</div><div class='add'>+{</div><div class='add'>+    ctx-&gt;need_writeback |= I_DIRTY;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static inline void</div><div class='add'>+__br_stub_mark_inode_synced(br_stub_inode_ctx_t *ctx)</div><div class='add'>+{</div><div class='add'>+    ctx-&gt;need_writeback &amp;= ~I_DIRTY;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static inline int</div><div class='add'>+__br_stub_is_inode_dirty(br_stub_inode_ctx_t *ctx)</div><div class='add'>+{</div><div class='add'>+    return (ctx-&gt;need_writeback &amp; I_DIRTY);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* inode mofification markers */</div><div class='add'>+static inline void</div><div class='add'>+__br_stub_set_inode_modified(br_stub_inode_ctx_t *ctx)</div><div class='add'>+{</div><div class='add'>+    ctx-&gt;need_writeback |= I_MODIFIED;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static inline void</div><div class='add'>+__br_stub_unset_inode_modified(br_stub_inode_ctx_t *ctx)</div><div class='add'>+{</div><div class='add'>+    ctx-&gt;need_writeback &amp;= ~I_MODIFIED;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static inline int</div><div class='add'>+__br_stub_is_inode_modified(br_stub_inode_ctx_t *ctx)</div><div class='add'>+{</div><div class='add'>+    return (ctx-&gt;need_writeback &amp; I_MODIFIED);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static inline int</div><div class='add'>+br_stub_require_release_call(xlator_t *this, fd_t *fd, br_stub_fd_t **fd_ctx)</div><div class='add'>+{</div><div class='add'>+    int32_t ret = 0;</div><div class='add'>+    br_stub_fd_t *br_stub_fd = NULL;</div><div class='add'>+</div><div class='add'>+    br_stub_fd = br_stub_fd_new();</div><div class='add'>+    if (!br_stub_fd)</div><div class='add'>+        return -1;</div><div class='add'>+</div><div class='add'>+    br_stub_fd-&gt;fd = fd;</div><div class='add'>+    INIT_LIST_HEAD(&amp;br_stub_fd-&gt;list);</div><div class='add'>+</div><div class='add'>+    ret = br_stub_fd_ctx_set(this, fd, br_stub_fd);</div><div class='add'>+    if (ret)</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_WARNING, 0, BRS_MSG_SET_CONTEXT_FAILED,</div><div class='add'>+                NULL);</div><div class='add'>+    else</div><div class='add'>+        *fd_ctx = br_stub_fd;</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* get/set inode context helpers */</div><div class='add'>+</div><div class='add'>+static inline int</div><div class='add'>+__br_stub_get_inode_ctx(xlator_t *this, inode_t *inode, uint64_t *ctx)</div><div class='add'>+{</div><div class='add'>+    return __inode_ctx_get(inode, this, ctx);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static inline int</div><div class='add'>+br_stub_get_inode_ctx(xlator_t *this, inode_t *inode, uint64_t *ctx)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;inode-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        ret = __br_stub_get_inode_ctx(this, inode, ctx);</div><div class='add'>+    }</div><div class='add'>+    UNLOCK(&amp;inode-&gt;lock);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static inline int</div><div class='add'>+br_stub_set_inode_ctx(xlator_t *this, inode_t *inode, br_stub_inode_ctx_t *ctx)</div><div class='add'>+{</div><div class='add'>+    uint64_t ctx_addr = (uint64_t)(uintptr_t)ctx;</div><div class='add'>+    return inode_ctx_set(inode, this, &amp;ctx_addr);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* version get/set helpers */</div><div class='add'>+</div><div class='add'>+static inline unsigned long</div><div class='add'>+__br_stub_writeback_version(br_stub_inode_ctx_t *ctx)</div><div class='add'>+{</div><div class='add'>+    return (ctx-&gt;currentversion + 1);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static inline void</div><div class='add'>+__br_stub_set_ongoing_version(br_stub_inode_ctx_t *ctx, unsigned long version)</div><div class='add'>+{</div><div class='add'>+    if (ctx-&gt;currentversion &lt; version)</div><div class='add'>+        ctx-&gt;currentversion = version;</div><div class='add'>+    else</div><div class='add'>+        gf_smsg("bit-rot-stub", GF_LOG_WARNING, 0,</div><div class='add'>+                BRS_MSG_CHANGE_VERSION_FAILED, "current version=%lu",</div><div class='add'>+                ctx-&gt;currentversion, "new version=%lu", version, NULL);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static inline int</div><div class='add'>+__br_stub_can_trigger_release(inode_t *inode, br_stub_inode_ctx_t *ctx,</div><div class='add'>+                              unsigned long *version)</div><div class='add'>+{</div><div class='add'>+    /**</div><div class='add'>+     * If the inode is modified, then it has to be dirty. An inode is</div><div class='add'>+     * marked dirty once version is increased. Its marked as modified</div><div class='add'>+     * when the modification call (write/truncate) which triggered</div><div class='add'>+     * the versioning is successful.</div><div class='add'>+     */</div><div class='add'>+    if (__br_stub_is_inode_modified(ctx) &amp;&amp; list_empty(&amp;ctx-&gt;fd_list) &amp;&amp;</div><div class='add'>+        (ctx-&gt;info_sign != BR_SIGN_REOPEN_WAIT)) {</div><div class='add'>+        GF_ASSERT(__br_stub_is_inode_dirty(ctx) == 0);</div><div class='add'>+</div><div class='add'>+        if (version)</div><div class='add'>+            *version = htonl(ctx-&gt;currentversion);</div><div class='add'>+        return 1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static inline int32_t</div><div class='add'>+br_stub_get_ongoing_version(xlator_t *this, inode_t *inode,</div><div class='add'>+                            unsigned long *version)</div><div class='add'>+{</div><div class='add'>+    int32_t ret = 0;</div><div class='add'>+    uint64_t ctx_addr = 0;</div><div class='add'>+    br_stub_inode_ctx_t *ctx = NULL;</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;inode-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        ret = __inode_ctx_get(inode, this, &amp;ctx_addr);</div><div class='add'>+        if (ret &lt; 0)</div><div class='add'>+            goto unblock;</div><div class='add'>+        ctx = (br_stub_inode_ctx_t *)(long)ctx_addr;</div><div class='add'>+        *version = ctx-&gt;currentversion;</div><div class='add'>+    }</div><div class='add'>+unblock:</div><div class='add'>+    UNLOCK(&amp;inode-&gt;lock);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/**</div><div class='add'>+ * fetch the current version from inode and return the context.</div><div class='add'>+ * inode-&gt;lock should be held before invoking this as context</div><div class='add'>+ * *needs* to be valid in the caller.</div><div class='add'>+ */</div><div class='add'>+static inline br_stub_inode_ctx_t *</div><div class='add'>+__br_stub_get_ongoing_version_ctx(xlator_t *this, inode_t *inode,</div><div class='add'>+                                  unsigned long *version)</div><div class='add'>+{</div><div class='add'>+    int32_t ret = 0;</div><div class='add'>+    uint64_t ctx_addr = 0;</div><div class='add'>+    br_stub_inode_ctx_t *ctx = NULL;</div><div class='add'>+</div><div class='add'>+    ret = __inode_ctx_get(inode, this, &amp;ctx_addr);</div><div class='add'>+    if (ret &lt; 0)</div><div class='add'>+        return NULL;</div><div class='add'>+    ctx = (br_stub_inode_ctx_t *)(long)ctx_addr;</div><div class='add'>+    if (version)</div><div class='add'>+        *version = ctx-&gt;currentversion;</div><div class='add'>+</div><div class='add'>+    return ctx;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* filter for xattr fetch */</div><div class='add'>+static inline int</div><div class='add'>+br_stub_is_internal_xattr(const char *name)</div><div class='add'>+{</div><div class='add'>+    if (name &amp;&amp; ((strncmp(name, BITROT_CURRENT_VERSION_KEY,</div><div class='add'>+                          SLEN(BITROT_CURRENT_VERSION_KEY)) == 0) ||</div><div class='add'>+                 (strncmp(name, BITROT_SIGNING_VERSION_KEY,</div><div class='add'>+                          SLEN(BITROT_SIGNING_VERSION_KEY)) == 0)))</div><div class='add'>+        return 1;</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static inline void</div><div class='add'>+br_stub_remove_vxattrs(dict_t *xattr, gf_boolean_t remove_bad_marker)</div><div class='add'>+{</div><div class='add'>+    if (xattr) {</div><div class='add'>+        /*</div><div class='add'>+         * When a file is corrupted, bad-object should be</div><div class='add'>+         * set in the dict. But, other info such as version,</div><div class='add'>+         * signature etc should not be set. Hence the flag</div><div class='add'>+         * remove_bad_marker. The consumer should know whether</div><div class='add'>+         * to send the bad-object info in the dict or not.</div><div class='add'>+         */</div><div class='add'>+        if (remove_bad_marker)</div><div class='add'>+            dict_del(xattr, BITROT_OBJECT_BAD_KEY);</div><div class='add'>+        dict_del(xattr, BITROT_CURRENT_VERSION_KEY);</div><div class='add'>+        dict_del(xattr, BITROT_SIGNING_VERSION_KEY);</div><div class='add'>+        dict_del(xattr, BITROT_SIGNING_XATTR_SIZE_KEY);</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/**</div><div class='add'>+ * This function returns the below values for different situations</div><div class='add'>+ * 0  =&gt; as per the inode context object is not bad</div><div class='add'>+ * -1 =&gt; Failed to get the inode context itself</div><div class='add'>+ * -2 =&gt; As per the inode context object is bad</div><div class='add'>+ * Both -ve values means the fop which called this function is failed</div><div class='add'>+ * and error is returned upwards.</div><div class='add'>+ * In future if needed or more errors have to be handled, then those</div><div class='add'>+ * errors can be made into enums.</div><div class='add'>+ */</div><div class='add'>+static inline int</div><div class='add'>+br_stub_is_bad_object(xlator_t *this, inode_t *inode)</div><div class='add'>+{</div><div class='add'>+    int bad_object = 0;</div><div class='add'>+    gf_boolean_t tmp = _gf_false;</div><div class='add'>+    uint64_t ctx_addr = 0;</div><div class='add'>+    br_stub_inode_ctx_t *ctx = NULL;</div><div class='add'>+    int32_t ret = -1;</div><div class='add'>+</div><div class='add'>+    ret = br_stub_get_inode_ctx(this, inode, &amp;ctx_addr);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_ERROR, 0, BRS_MSG_GET_INODE_CONTEXT_FAILED,</div><div class='add'>+                "inode-gfid=%s", uuid_utoa(inode-&gt;gfid), NULL);</div><div class='add'>+        bad_object = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ctx = (br_stub_inode_ctx_t *)(long)ctx_addr;</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;inode-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        tmp = __br_stub_is_bad_object(ctx);</div><div class='add'>+        if (tmp)</div><div class='add'>+            bad_object = -2;</div><div class='add'>+    }</div><div class='add'>+    UNLOCK(&amp;inode-&gt;lock);</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return bad_object;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static inline int32_t</div><div class='add'>+br_stub_mark_object_bad(xlator_t *this, inode_t *inode)</div><div class='add'>+{</div><div class='add'>+    int32_t ret = -1;</div><div class='add'>+    uint64_t ctx_addr = 0;</div><div class='add'>+    br_stub_inode_ctx_t *ctx = NULL;</div><div class='add'>+</div><div class='add'>+    ret = br_stub_get_inode_ctx(this, inode, &amp;ctx_addr);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_ERROR, 0, BRS_MSG_GET_INODE_CONTEXT_FAILED,</div><div class='add'>+                "inode-gfid=%s", uuid_utoa(inode-&gt;gfid), NULL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ctx = (br_stub_inode_ctx_t *)(long)ctx_addr;</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;inode-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        __br_stub_mark_object_bad(ctx);</div><div class='add'>+    }</div><div class='add'>+    UNLOCK(&amp;inode-&gt;lock);</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/**</div><div class='add'>+ * There is a possibility that dict_set might fail. The o/p of dict_set is</div><div class='add'>+ * given to the caller and the caller has to decide what to do.</div><div class='add'>+ */</div><div class='add'>+static inline int32_t</div><div class='add'>+br_stub_mark_xdata_bad_object(xlator_t *this, inode_t *inode, dict_t *xdata)</div><div class='add'>+{</div><div class='add'>+    int32_t ret = 0;</div><div class='add'>+</div><div class='add'>+    if (br_stub_is_bad_object(this, inode) == -2)</div><div class='add'>+        ret = dict_set_int32(xdata, GLUSTERFS_BAD_INODE, 1);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+br_stub_add_fd_to_inode(xlator_t *this, fd_t *fd, br_stub_inode_ctx_t *ctx);</div><div class='add'>+</div><div class='add'>+br_sign_state_t</div><div class='add'>+__br_stub_inode_sign_state(br_stub_inode_ctx_t *ctx, glusterfs_fop_t fop,</div><div class='add'>+                           fd_t *fd);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+br_stub_dir_create(xlator_t *this, br_stub_private_t *priv);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+br_stub_add(xlator_t *this, uuid_t gfid);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+br_stub_create_stub_gfid(xlator_t *this, char *stub_gfid_path, uuid_t gfid);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+br_stub_dir_create(xlator_t *this, br_stub_private_t *priv);</div><div class='add'>+</div><div class='add'>+call_stub_t *</div><div class='add'>+__br_stub_dequeue(struct list_head *callstubs);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+__br_stub_enqueue(struct list_head *callstubs, call_stub_t *stub);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+br_stub_worker_enqueue(xlator_t *this, call_stub_t *stub);</div><div class='add'>+</div><div class='add'>+void *</div><div class='add'>+br_stub_worker(void *data);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+br_stub_lookup_wrapper(call_frame_t *frame, xlator_t *this, loc_t *loc,</div><div class='add'>+                       dict_t *xattr_req);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+br_stub_readdir_wrapper(call_frame_t *frame, xlator_t *this, fd_t *fd,</div><div class='add'>+                        size_t size, off_t off, dict_t *xdata);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+br_stub_del(xlator_t *this, uuid_t gfid);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+br_stub_bad_objects_path(xlator_t *this, fd_t *fd, gf_dirent_t *entries,</div><div class='add'>+                         dict_t **dict);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+br_stub_entry_xattr_fill(xlator_t *this, char *hpath, gf_dirent_t *entry,</div><div class='add'>+                         dict_t *dict);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+br_stub_get_path_of_gfid(xlator_t *this, inode_t *parent, inode_t *inode,</div><div class='add'>+                         uuid_t gfid, char **path);</div><div class='add'>+</div><div class='add'>+#endif /* __BIT_ROT_STUB_H__ */</div><div class='head'>diff --git a/xlators/features/changelog/Makefile.am b/xlators/features/changelog/Makefile.am<br/>new file mode 100644<br/>index 00000000000..153bb685076<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/xlators/features/changelog/Makefile.am?id=d1d7a6f35c816822fab51c820e25023863c239c1'>xlators/features/changelog/Makefile.am</a></div><div class='hunk'>@@ -0,0 +1,3 @@</div><div class='add'>+SUBDIRS = src lib</div><div class='add'>+</div><div class='add'>+CLEANFILES =</div><div class='head'>diff --git a/xlators/features/changelog/lib/Makefile.am b/xlators/features/changelog/lib/Makefile.am<br/>new file mode 100644<br/>index 00000000000..a985f42a877<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/xlators/features/changelog/lib/Makefile.am?id=d1d7a6f35c816822fab51c820e25023863c239c1'>xlators/features/changelog/lib/Makefile.am</a></div><div class='hunk'>@@ -0,0 +1,3 @@</div><div class='add'>+SUBDIRS = src</div><div class='add'>+</div><div class='add'>+CLEANFILES =</div><div class='head'>diff --git a/xlators/features/changelog/lib/examples/c/get-changes-multi.c b/xlators/features/changelog/lib/examples/c/get-changes-multi.c<br/>new file mode 100644<br/>index 00000000000..5ea5bbb6630<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/xlators/features/changelog/lib/examples/c/get-changes-multi.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>xlators/features/changelog/lib/examples/c/get-changes-multi.c</a></div><div class='hunk'>@@ -0,0 +1,90 @@</div><div class='add'>+/*</div><div class='add'>+   Copyright (c) 2013 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+   This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+   This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+   General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+   later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+   cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+/**</div><div class='add'>+ * Compile it using:</div><div class='add'>+ *  gcc -o getchanges-multi `pkg-config --cflags libgfchangelog` \</div><div class='add'>+ *  get-changes-multi.c `pkg-config --libs libgfchangelog`</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+#include &lt;stdio.h&gt;</div><div class='add'>+#include &lt;stdlib.h&gt;</div><div class='add'>+#include &lt;unistd.h&gt;</div><div class='add'>+#include &lt;sys/un.h&gt;</div><div class='add'>+#include &lt;limits.h&gt;</div><div class='add'>+#include &lt;sys/socket.h&gt;</div><div class='add'>+#include &lt;sys/types.h&gt;</div><div class='add'>+#include &lt;errno.h&gt;</div><div class='add'>+</div><div class='add'>+#include "changelog.h"</div><div class='add'>+</div><div class='add'>+void *</div><div class='add'>+brick_init(void *xl, struct gf_brick_spec *brick)</div><div class='add'>+{</div><div class='add'>+    return brick;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+brick_fini(void *xl, char *brick, void *data)</div><div class='add'>+{</div><div class='add'>+    return;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+brick_callback(void *xl, char *brick, void *data, changelog_event_t *ev)</div><div class='add'>+{</div><div class='add'>+    printf("-&gt;callback: (brick,type) [%s:%d]\n", brick, ev-&gt;ev_type);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+fill_brick_spec(struct gf_brick_spec *brick, char *path)</div><div class='add'>+{</div><div class='add'>+    brick-&gt;brick_path = strdup(path);</div><div class='add'>+    brick-&gt;filter = CHANGELOG_OP_TYPE_BR_RELEASE;</div><div class='add'>+</div><div class='add'>+    brick-&gt;init = brick_init;</div><div class='add'>+    brick-&gt;fini = brick_fini;</div><div class='add'>+    brick-&gt;callback = brick_callback;</div><div class='add'>+    brick-&gt;connected = NULL;</div><div class='add'>+    brick-&gt;disconnected = NULL;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+main(int argc, char **argv)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+    void *bricks = NULL;</div><div class='add'>+    struct gf_brick_spec *brick = NULL;</div><div class='add'>+</div><div class='add'>+    bricks = calloc(2, sizeof(struct gf_brick_spec));</div><div class='add'>+    if (!bricks)</div><div class='add'>+        goto error_return;</div><div class='add'>+</div><div class='add'>+    brick = (struct gf_brick_spec *)bricks;</div><div class='add'>+    fill_brick_spec(brick, "/export/z1/zwoop");</div><div class='add'>+</div><div class='add'>+    brick++;</div><div class='add'>+    fill_brick_spec(brick, "/export/z2/zwoop");</div><div class='add'>+</div><div class='add'>+    ret = gf_changelog_init(NULL);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto error_return;</div><div class='add'>+</div><div class='add'>+    ret = gf_changelog_register_generic((struct gf_brick_spec *)bricks, 2, 0,</div><div class='add'>+                                        "/tmp/multi-changes.log", 9, NULL);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto error_return;</div><div class='add'>+</div><div class='add'>+    /* let callbacks do the job */</div><div class='add'>+    select(0, NULL, NULL, NULL, NULL);</div><div class='add'>+</div><div class='add'>+error_return:</div><div class='add'>+    return -1;</div><div class='add'>+}</div><div class='head'>diff --git a/xlators/features/changelog/lib/examples/c/get-changes.c b/xlators/features/changelog/lib/examples/c/get-changes.c<br/>new file mode 100644<br/>index 00000000000..8bc651c24a4<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/xlators/features/changelog/lib/examples/c/get-changes.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>xlators/features/changelog/lib/examples/c/get-changes.c</a></div><div class='hunk'>@@ -0,0 +1,93 @@</div><div class='add'>+/*</div><div class='add'>+   Copyright (c) 2013 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+   This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+   This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+   General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+   later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+   cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+/**</div><div class='add'>+ * get set of new changes every 10 seconds (just print the file names)</div><div class='add'>+ *</div><div class='add'>+ * Compile it using:</div><div class='add'>+ *  gcc -o getchanges `pkg-config --cflags libgfchangelog` get-changes.c \</div><div class='add'>+ *  `pkg-config --libs libgfchangelog`</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+#include &lt;stdio.h&gt;</div><div class='add'>+#include &lt;stdlib.h&gt;</div><div class='add'>+#include &lt;unistd.h&gt;</div><div class='add'>+#include &lt;sys/un.h&gt;</div><div class='add'>+#include &lt;limits.h&gt;</div><div class='add'>+#include &lt;sys/socket.h&gt;</div><div class='add'>+#include &lt;sys/types.h&gt;</div><div class='add'>+#include &lt;errno.h&gt;</div><div class='add'>+</div><div class='add'>+#include "changelog.h"</div><div class='add'>+</div><div class='add'>+#define handle_error(fn) printf("%s (reason: %s)\n", fn, strerror(errno))</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+main(int argc, char **argv)</div><div class='add'>+{</div><div class='add'>+    int i = 0;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    ssize_t nr_changes = 0;</div><div class='add'>+    ssize_t changes = 0;</div><div class='add'>+    char fbuf[PATH_MAX] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    ret = gf_changelog_init(NULL);</div><div class='add'>+    if (ret) {</div><div class='add'>+        handle_error("Init failed");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* get changes for brick "/home/vshankar/export/yow/yow-1" */</div><div class='add'>+    ret = gf_changelog_register("/export/z1/zwoop", "/tmp/scratch",</div><div class='add'>+                                "/tmp/change.log", 9, 5);</div><div class='add'>+    if (ret) {</div><div class='add'>+        handle_error("register failed");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    while (1) {</div><div class='add'>+        i = 0;</div><div class='add'>+        nr_changes = gf_changelog_scan();</div><div class='add'>+        if (nr_changes &lt; 0) {</div><div class='add'>+            handle_error("scan(): ");</div><div class='add'>+            break;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        if (nr_changes == 0)</div><div class='add'>+            goto next;</div><div class='add'>+</div><div class='add'>+        printf("Got %ld changelog files\n", nr_changes);</div><div class='add'>+</div><div class='add'>+        while ((changes = gf_changelog_next_change(fbuf, PATH_MAX)) &gt; 0) {</div><div class='add'>+            printf("changelog file [%d]: %s\n", ++i, fbuf);</div><div class='add'>+</div><div class='add'>+            /* process changelog */</div><div class='add'>+            /* ... */</div><div class='add'>+            /* ... */</div><div class='add'>+            /* ... */</div><div class='add'>+            /* done processing */</div><div class='add'>+</div><div class='add'>+            ret = gf_changelog_done(fbuf);</div><div class='add'>+            if (ret)</div><div class='add'>+                handle_error("gf_changelog_done");</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        if (changes == -1)</div><div class='add'>+            handle_error("gf_changelog_next_change");</div><div class='add'>+</div><div class='add'>+    next:</div><div class='add'>+        sleep(10);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='head'>diff --git a/xlators/features/changelog/lib/examples/c/get-history.c b/xlators/features/changelog/lib/examples/c/get-history.c<br/>new file mode 100644<br/>index 00000000000..3e888d75ca6<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/xlators/features/changelog/lib/examples/c/get-history.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>xlators/features/changelog/lib/examples/c/get-history.c</a></div><div class='hunk'>@@ -0,0 +1,116 @@</div><div class='add'>+/*</div><div class='add'>+   Copyright (c) 2013 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+   This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+   This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+   General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+   later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+   cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+/**</div><div class='add'>+ * get set of new changes every 10 seconds (just print the file names)</div><div class='add'>+ *</div><div class='add'>+ * Compile it using:</div><div class='add'>+ *  gcc -o gethistory `pkg-config --cflags libgfchangelog` get-history.c \</div><div class='add'>+ *  `pkg-config --libs libgfchangelog`</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+#include &lt;stdio.h&gt;</div><div class='add'>+#include &lt;stdlib.h&gt;</div><div class='add'>+#include &lt;unistd.h&gt;</div><div class='add'>+#include &lt;sys/un.h&gt;</div><div class='add'>+#include &lt;limits.h&gt;</div><div class='add'>+#include &lt;sys/socket.h&gt;</div><div class='add'>+#include &lt;sys/types.h&gt;</div><div class='add'>+#include &lt;errno.h&gt;</div><div class='add'>+</div><div class='add'>+#include "changelog.h"</div><div class='add'>+</div><div class='add'>+#define handle_error(fn) printf("%s (reason: %s)\n", fn, strerror(errno))</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+main(int argc, char **argv)</div><div class='add'>+{</div><div class='add'>+    int i = 0;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    ssize_t nr_changes = 0;</div><div class='add'>+    ssize_t changes = 0;</div><div class='add'>+    char fbuf[PATH_MAX] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    unsigned long end_ts = 0;</div><div class='add'>+</div><div class='add'>+    ret = gf_changelog_init(NULL);</div><div class='add'>+    if (ret) {</div><div class='add'>+        handle_error("init failed");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = gf_changelog_register("/export/z1/zwoop", "/tmp/scratch_v1",</div><div class='add'>+                                "/tmp/changes.log", 9, 5);</div><div class='add'>+    if (ret) {</div><div class='add'>+        handle_error("register failed");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    int a, b;</div><div class='add'>+    printf("give the two numbers start and end\t");</div><div class='add'>+    scanf("%d%d", &amp;a, &amp;b);</div><div class='add'>+    ret = gf_history_changelog("/export/z1/zwoop/.glusterfs/changelogs", a, b,</div><div class='add'>+                               3, &amp;end_ts);</div><div class='add'>+    if (ret == -1) {</div><div class='add'>+        printf("history failed");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    printf("end time till when changelog available : %d , ret(%d) \t", end_ts,</div><div class='add'>+           ret);</div><div class='add'>+    fflush(stdout);</div><div class='add'>+</div><div class='add'>+    while (1) {</div><div class='add'>+        nr_changes = gf_history_changelog_scan();</div><div class='add'>+        printf("scanned, nr_changes : %d\n", nr_changes);</div><div class='add'>+        if (nr_changes &lt; 0) {</div><div class='add'>+            handle_error("scan(): ");</div><div class='add'>+            break;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        if (nr_changes == 0) {</div><div class='add'>+            printf("done scanning \n");</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        printf("Got %ld changelog files\n", nr_changes);</div><div class='add'>+</div><div class='add'>+        while ((changes = gf_history_changelog_next_change(fbuf, PATH_MAX)) &gt;</div><div class='add'>+               0) {</div><div class='add'>+            printf("changelog file [%d]: %s\n", ++i, fbuf);</div><div class='add'>+</div><div class='add'>+            /* process changelog */</div><div class='add'>+            /* ... */</div><div class='add'>+            /* ... */</div><div class='add'>+            /* ... */</div><div class='add'>+            /* done processing */</div><div class='add'>+</div><div class='add'>+            ret = gf_history_changelog_done(fbuf);</div><div class='add'>+            if (ret)</div><div class='add'>+                handle_error("gf_changelog_done");</div><div class='add'>+        }</div><div class='add'>+        /*</div><div class='add'>+        if (changes == -1)</div><div class='add'>+                handle_error ("gf_changelog_next_change");</div><div class='add'>+        if (nr_changes ==1){</div><div class='add'>+                printf("continue scanning\n");</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        if(nr_changes == 0){</div><div class='add'>+                printf("done scanning \n");</div><div class='add'>+                goto out;</div><div class='add'>+        }</div><div class='add'>+        */</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='head'>diff --git a/xlators/features/changelog/lib/examples/python/changes.py b/xlators/features/changelog/lib/examples/python/changes.py<br/>new file mode 100755<br/>index 00000000000..c410d3b000d<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/xlators/features/changelog/lib/examples/python/changes.py?id=d1d7a6f35c816822fab51c820e25023863c239c1'>xlators/features/changelog/lib/examples/python/changes.py</a></div><div class='hunk'>@@ -0,0 +1,34 @@</div><div class='add'>+#!/usr/bin/python3</div><div class='add'>+</div><div class='add'>+from __future__ import print_function</div><div class='add'>+import os</div><div class='add'>+import sys</div><div class='add'>+import time</div><div class='add'>+import libgfchangelog</div><div class='add'>+</div><div class='add'>+cl = libgfchangelog.Changes()</div><div class='add'>+</div><div class='add'>+def get_changes(brick, scratch_dir, log_file, log_level, interval):</div><div class='add'>+    change_list = []</div><div class='add'>+    try:</div><div class='add'>+        cl.cl_init()</div><div class='add'>+        cl.cl_register(brick, scratch_dir, log_file, log_level)</div><div class='add'>+        while True:</div><div class='add'>+            cl.cl_scan()</div><div class='add'>+            change_list = cl.cl_getchanges()</div><div class='add'>+            if change_list:</div><div class='add'>+                print(change_list)</div><div class='add'>+            for change in change_list:</div><div class='add'>+                print(('done with %s' % (change)))</div><div class='add'>+                cl.cl_done(change)</div><div class='add'>+            time.sleep(interval)</div><div class='add'>+    except OSError:</div><div class='add'>+        ex = sys.exc_info()[1]</div><div class='add'>+        print(ex)</div><div class='add'>+</div><div class='add'>+if __name__ == '__main__':</div><div class='add'>+    if len(sys.argv) != 6:</div><div class='add'>+        print(("usage: %s &lt;brick&gt; &lt;scratch-dir&gt; &lt;log-file&gt; &lt;fetch-interval&gt;"</div><div class='add'>+              % (sys.argv[0])))</div><div class='add'>+        sys.exit(1)</div><div class='add'>+    get_changes(sys.argv[1], sys.argv[2], sys.argv[3], 9, int(sys.argv[4]))</div><div class='head'>diff --git a/xlators/features/changelog/lib/examples/python/libgfchangelog.py b/xlators/features/changelog/lib/examples/python/libgfchangelog.py<br/>new file mode 100644<br/>index 00000000000..2da9f2d2a8c<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/xlators/features/changelog/lib/examples/python/libgfchangelog.py?id=d1d7a6f35c816822fab51c820e25023863c239c1'>xlators/features/changelog/lib/examples/python/libgfchangelog.py</a></div><div class='hunk'>@@ -0,0 +1,71 @@</div><div class='add'>+import os</div><div class='add'>+from ctypes import *</div><div class='add'>+from ctypes.util import find_library</div><div class='add'>+</div><div class='add'>+class Changes(object):</div><div class='add'>+    libgfc = CDLL(find_library("gfchangelog"), mode=RTLD_GLOBAL,</div><div class='add'>+                  use_errno=True)</div><div class='add'>+</div><div class='add'>+    @classmethod</div><div class='add'>+    def geterrno(cls):</div><div class='add'>+        return get_errno()</div><div class='add'>+</div><div class='add'>+    @classmethod</div><div class='add'>+    def raise_oserr(cls):</div><div class='add'>+        errn = cls.geterrno()</div><div class='add'>+        raise OSError(errn, os.strerror(errn))</div><div class='add'>+</div><div class='add'>+    @classmethod</div><div class='add'>+    def _get_api(cls, call):</div><div class='add'>+        return getattr(cls.libgfc, call)</div><div class='add'>+</div><div class='add'>+    @classmethod</div><div class='add'>+    def cl_init(cls):</div><div class='add'>+        ret = cls._get_api('gf_changelog_init')(None)</div><div class='add'>+        if ret == -1:</div><div class='add'>+            cls.raise_changelog_err()</div><div class='add'>+</div><div class='add'>+    @classmethod</div><div class='add'>+    def cl_register(cls, brick, path, log_file, log_level, retries = 0):</div><div class='add'>+        ret = cls._get_api('gf_changelog_register')(brick, path,</div><div class='add'>+                                                    log_file, log_level, retries)</div><div class='add'>+        if ret == -1:</div><div class='add'>+            cls.raise_oserr()</div><div class='add'>+</div><div class='add'>+    @classmethod</div><div class='add'>+    def cl_scan(cls):</div><div class='add'>+        ret = cls._get_api('gf_changelog_scan')()</div><div class='add'>+        if ret == -1:</div><div class='add'>+            cls.raise_oserr()</div><div class='add'>+</div><div class='add'>+    @classmethod</div><div class='add'>+    def cl_startfresh(cls):</div><div class='add'>+        ret = cls._get_api('gf_changelog_start_fresh')()</div><div class='add'>+        if ret == -1:</div><div class='add'>+            cls.raise_oserr()</div><div class='add'>+</div><div class='add'>+    @classmethod</div><div class='add'>+    def cl_getchanges(cls):</div><div class='add'>+        """ remove hardcoding for path name length """</div><div class='add'>+        def clsort(f):</div><div class='add'>+            return f.split('.')[-1]</div><div class='add'>+        changes = []</div><div class='add'>+        buf = create_string_buffer('\0', 4096)</div><div class='add'>+        call = cls._get_api('gf_changelog_next_change')</div><div class='add'>+</div><div class='add'>+        while True:</div><div class='add'>+            ret = call(buf, 4096)</div><div class='add'>+            if ret in (0, -1):</div><div class='add'>+                break;</div><div class='add'>+            changes.append(buf.raw[:ret-1])</div><div class='add'>+        if ret == -1:</div><div class='add'>+            cls.raise_oserr()</div><div class='add'>+        # cleanup tracker</div><div class='add'>+        cls.cl_startfresh()</div><div class='add'>+        return sorted(changes, key=clsort)</div><div class='add'>+</div><div class='add'>+    @classmethod</div><div class='add'>+    def cl_done(cls, clfile):</div><div class='add'>+        ret = cls._get_api('gf_changelog_done')(clfile)</div><div class='add'>+        if ret == -1:</div><div class='add'>+            cls.raise_oserr()</div><div class='head'>diff --git a/xlators/features/changelog/lib/src/Makefile.am b/xlators/features/changelog/lib/src/Makefile.am<br/>new file mode 100644<br/>index 00000000000..c933ec53ed2<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/xlators/features/changelog/lib/src/Makefile.am?id=d1d7a6f35c816822fab51c820e25023863c239c1'>xlators/features/changelog/lib/src/Makefile.am</a></div><div class='hunk'>@@ -0,0 +1,35 @@</div><div class='add'>+libgfchangelog_la_CFLAGS = -Wall $(GF_CFLAGS) $(GF_DARWIN_LIBGLUSTERFS_CFLAGS) \</div><div class='add'>+	-DDATADIR=\"$(localstatedir)\"</div><div class='add'>+</div><div class='add'>+libgfchangelog_la_CPPFLAGS = $(GF_CPPFLAGS) -D__USE_FILE_OFFSET64 -D__USE_LARGEFILE64 -fpic \</div><div class='add'>+	-I../../../src/ -I$(top_srcdir)/libglusterfs/src \</div><div class='add'>+	-I$(top_srcdir)/xlators/features/changelog/src \</div><div class='add'>+	-I$(top_srcdir)/rpc/xdr/src -I$(top_builddir)/rpc/xdr/src \</div><div class='add'>+	-I$(top_srcdir)/rpc/rpc-lib/src \</div><div class='add'>+	-I$(top_srcdir)/rpc/rpc-transport/socket/src \</div><div class='add'>+	-DDATADIR=\"$(localstatedir)\"</div><div class='add'>+</div><div class='add'>+libgfchangelog_la_LIBADD = $(top_builddir)/libglusterfs/src/libglusterfs.la \</div><div class='add'>+	$(top_builddir)/rpc/xdr/src/libgfxdr.la \</div><div class='add'>+	$(top_builddir)/rpc/rpc-lib/src/libgfrpc.la</div><div class='add'>+</div><div class='add'>+libgfchangelog_la_LDFLAGS = $(GF_LDFLAGS) \</div><div class='add'>+        -version-info $(LIBGFCHANGELOG_LT_VERSION) \</div><div class='add'>+        $(GF_NO_UNDEFINED)</div><div class='add'>+</div><div class='add'>+lib_LTLIBRARIES = libgfchangelog.la</div><div class='add'>+</div><div class='add'>+CONTRIB_BUILDDIR = $(top_builddir)/contrib</div><div class='add'>+</div><div class='add'>+libgfchangelog_la_SOURCES = gf-changelog.c gf-changelog-journal-handler.c \</div><div class='add'>+	gf-changelog-helpers.c gf-changelog-api.c gf-history-changelog.c \</div><div class='add'>+	gf-changelog-rpc.c gf-changelog-reborp.c \</div><div class='add'>+	$(top_srcdir)/xlators/features/changelog/src/changelog-rpc-common.c</div><div class='add'>+</div><div class='add'>+noinst_HEADERS = gf-changelog-helpers.h gf-changelog-rpc.h \</div><div class='add'>+	gf-changelog-journal.h changelog-lib-messages.h</div><div class='add'>+</div><div class='add'>+CLEANFILES =</div><div class='add'>+</div><div class='add'>+$(top_builddir)/libglusterfs/src/libglusterfs.la:</div><div class='add'>+	$(MAKE) -C $(top_builddir)/libglusterfs/src/ all</div><div class='head'>diff --git a/xlators/features/changelog/lib/src/changelog-lib-messages.h b/xlators/features/changelog/lib/src/changelog-lib-messages.h<br/>new file mode 100644<br/>index 00000000000..d7fe7274353<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/xlators/features/changelog/lib/src/changelog-lib-messages.h?id=d1d7a6f35c816822fab51c820e25023863c239c1'>xlators/features/changelog/lib/src/changelog-lib-messages.h</a></div><div class='hunk'>@@ -0,0 +1,74 @@</div><div class='add'>+/*</div><div class='add'>+ Copyright (c) 2015 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+ This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+ This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+ General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+ later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+ cases as published by the Free Software Foundation.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+#ifndef _CHANGELOG_LIB_MESSAGES_H_</div><div class='add'>+#define _CHANGELOG_LIB_MESSAGES_H_</div><div class='add'>+</div><div class='add'>+#include &lt;glusterfs/glfs-message-id.h&gt;</div><div class='add'>+</div><div class='add'>+/* To add new message IDs, append new identifiers at the end of the list.</div><div class='add'>+ *</div><div class='add'>+ * Never remove a message ID. If it's not used anymore, you can rename it or</div><div class='add'>+ * leave it as it is, but not delete it. This is to prevent reutilization of</div><div class='add'>+ * IDs by other messages.</div><div class='add'>+ *</div><div class='add'>+ * The component name must match one of the entries defined in</div><div class='add'>+ * glfs-message-id.h.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+GLFS_MSGID(</div><div class='add'>+    CHANGELOG_LIB, CHANGELOG_LIB_MSG_OPEN_FAILED,</div><div class='add'>+    CHANGELOG_LIB_MSG_FAILED_TO_RMDIR,</div><div class='add'>+    CHANGELOG_LIB_MSG_SCRATCH_DIR_ENTRIES_CREATION_ERROR,</div><div class='add'>+    CHANGELOG_LIB_MSG_THREAD_CREATION_FAILED, CHANGELOG_LIB_MSG_OPENDIR_ERROR,</div><div class='add'>+    CHANGELOG_LIB_MSG_RENAME_FAILED, CHANGELOG_LIB_MSG_READ_ERROR,</div><div class='add'>+    CHANGELOG_LIB_MSG_HTIME_ERROR, CHANGELOG_LIB_MSG_GET_TIME_ERROR,</div><div class='add'>+    CHANGELOG_LIB_MSG_WRITE_FAILED, CHANGELOG_LIB_MSG_PTHREAD_ERROR,</div><div class='add'>+    CHANGELOG_LIB_MSG_MMAP_FAILED, CHANGELOG_LIB_MSG_MUNMAP_FAILED,</div><div class='add'>+    CHANGELOG_LIB_MSG_ASCII_ERROR, CHANGELOG_LIB_MSG_STAT_FAILED,</div><div class='add'>+    CHANGELOG_LIB_MSG_GET_XATTR_FAILED, CHANGELOG_LIB_MSG_PUBLISH_ERROR,</div><div class='add'>+    CHANGELOG_LIB_MSG_PARSE_ERROR, CHANGELOG_LIB_MSG_MIN_MAX_INFO,</div><div class='add'>+    CHANGELOG_LIB_MSG_CLEANUP_ERROR, CHANGELOG_LIB_MSG_UNLINK_FAILED,</div><div class='add'>+    CHANGELOG_LIB_MSG_NOTIFY_REGISTER_FAILED,</div><div class='add'>+    CHANGELOG_LIB_MSG_INVOKE_RPC_FAILED, CHANGELOG_LIB_MSG_DRAINING_EVENT_INFO,</div><div class='add'>+    CHANGELOG_LIB_MSG_CLEANING_BRICK_ENTRY_INFO,</div><div class='add'>+    CHANGELOG_LIB_MSG_FREEING_ENTRY_INFO, CHANGELOG_LIB_MSG_XDR_DECODING_FAILED,</div><div class='add'>+    CHANGELOG_LIB_MSG_NOTIFY_REGISTER_INFO,</div><div class='add'>+    CHANGELOG_LIB_MSG_THREAD_CLEANUP_WARNING,</div><div class='add'>+    CHANGELOG_LIB_MSG_COPY_FROM_BUFFER_FAILED,</div><div class='add'>+    CHANGELOG_LIB_MSG_PTHREAD_JOIN_FAILED, CHANGELOG_LIB_MSG_HIST_FAILED,</div><div class='add'>+    CHANGELOG_LIB_MSG_DRAINED_EVENT_INFO, CHANGELOG_LIB_MSG_PARSE_ERROR_CEASED,</div><div class='add'>+    CHANGELOG_LIB_MSG_REQUESTING_INFO, CHANGELOG_LIB_MSG_FINAL_INFO);</div><div class='add'>+</div><div class='add'>+#define CHANGELOG_LIB_MSG_NOTIFY_REGISTER_INFO_STR "Registering brick"</div><div class='add'>+#define CHANGELOG_LIB_MSG_RENAME_FAILED_STR "error moving changelog file"</div><div class='add'>+#define CHANGELOG_LIB_MSG_OPEN_FAILED_STR "cannot open changelog file"</div><div class='add'>+#define CHANGELOG_LIB_MSG_UNLINK_FAILED_STR "failed to unlink"</div><div class='add'>+#define CHANGELOG_LIB_MSG_FAILED_TO_RMDIR_STR "failed to rmdir"</div><div class='add'>+#define CHANGELOG_LIB_MSG_STAT_FAILED_STR "stat failed on changelog file"</div><div class='add'>+#define CHANGELOG_LIB_MSG_PARSE_ERROR_STR "could not parse changelog"</div><div class='add'>+#define CHANGELOG_LIB_MSG_PARSE_ERROR_CEASED_STR                               \</div><div class='add'>+    "parsing error, ceased publishing..."</div><div class='add'>+#define CHANGELOG_LIB_MSG_HTIME_ERROR_STR "fop failed on htime file"</div><div class='add'>+#define CHANGELOG_LIB_MSG_GET_XATTR_FAILED_STR                                 \</div><div class='add'>+    "error extracting max timstamp from htime file"</div><div class='add'>+#define CHANGELOG_LIB_MSG_MIN_MAX_INFO_STR "changelogs min max"</div><div class='add'>+#define CHANGELOG_LIB_MSG_REQUESTING_INFO_STR "Requesting historical changelogs"</div><div class='add'>+#define CHANGELOG_LIB_MSG_FINAL_INFO_STR "FINAL"</div><div class='add'>+#define CHANGELOG_LIB_MSG_HIST_FAILED_STR                                      \</div><div class='add'>+    "Requested changelog range is not available"</div><div class='add'>+#define CHANGELOG_LIB_MSG_GET_TIME_ERROR_STR "wrong result"</div><div class='add'>+#define CHANGELOG_LIB_MSG_CLEANING_BRICK_ENTRY_INFO_STR                        \</div><div class='add'>+    "Cleaning brick entry for brick"</div><div class='add'>+#define CHANGELOG_LIB_MSG_DRAINING_EVENT_INFO_STR "Draining event"</div><div class='add'>+#define CHANGELOG_LIB_MSG_DRAINED_EVENT_INFO_STR "Drained event"</div><div class='add'>+#define CHANGELOG_LIB_MSG_FREEING_ENTRY_INFO_STR "freeing entry"</div><div class='add'>+</div><div class='add'>+#endif /* !_CHANGELOG_MESSAGES_H_ */</div><div class='head'>diff --git a/xlators/features/changelog/lib/src/gf-changelog-api.c b/xlators/features/changelog/lib/src/gf-changelog-api.c<br/>new file mode 100644<br/>index 00000000000..81a5cbfec10<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/xlators/features/changelog/lib/src/gf-changelog-api.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>xlators/features/changelog/lib/src/gf-changelog-api.c</a></div><div class='hunk'>@@ -0,0 +1,224 @@</div><div class='add'>+/*</div><div class='add'>+   Copyright (c) 2015 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+   This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+   This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+   General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+   later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+   cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#include &lt;glusterfs/compat-uuid.h&gt;</div><div class='add'>+#include &lt;glusterfs/globals.h&gt;</div><div class='add'>+#include &lt;glusterfs/glusterfs.h&gt;</div><div class='add'>+#include &lt;glusterfs/syscall.h&gt;</div><div class='add'>+</div><div class='add'>+#include "gf-changelog-helpers.h"</div><div class='add'>+#include "gf-changelog-journal.h"</div><div class='add'>+#include "changelog-mem-types.h"</div><div class='add'>+#include "changelog-lib-messages.h"</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+gf_changelog_done(char *file)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    char *buffer = NULL;</div><div class='add'>+    xlator_t *this = NULL;</div><div class='add'>+    gf_changelog_journal_t *jnl = NULL;</div><div class='add'>+    char to_path[PATH_MAX] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    errno = EINVAL;</div><div class='add'>+</div><div class='add'>+    this = THIS;</div><div class='add'>+    if (!this)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    jnl = (gf_changelog_journal_t *)GF_CHANGELOG_GET_API_PTR(this);</div><div class='add'>+    if (!jnl)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    if (!file || !strlen(file))</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    /* make sure 'file' is inside -&gt;jnl_working_dir */</div><div class='add'>+    buffer = realpath(file, NULL);</div><div class='add'>+    if (!buffer)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    if (strncmp(jnl-&gt;jnl_working_dir, buffer, strlen(jnl-&gt;jnl_working_dir)))</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    (void)snprintf(to_path, PATH_MAX, "%s%s", jnl-&gt;jnl_processed_dir,</div><div class='add'>+                   basename(buffer));</div><div class='add'>+    gf_msg_debug(this-&gt;name, 0, "moving %s to processed directory", file);</div><div class='add'>+    ret = sys_rename(buffer, to_path);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_ERROR, errno,</div><div class='add'>+                CHANGELOG_LIB_MSG_RENAME_FAILED, "from=%s", file, "to=%s",</div><div class='add'>+                to_path, NULL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (buffer)</div><div class='add'>+        free(buffer); /* allocated by realpath() */</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/**</div><div class='add'>+ * @API</div><div class='add'>+ *  for a set of changelogs, start from the beginning</div><div class='add'>+ */</div><div class='add'>+int</div><div class='add'>+gf_changelog_start_fresh()</div><div class='add'>+{</div><div class='add'>+    xlator_t *this = NULL;</div><div class='add'>+    gf_changelog_journal_t *jnl = NULL;</div><div class='add'>+</div><div class='add'>+    this = THIS;</div><div class='add'>+    if (!this)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    errno = EINVAL;</div><div class='add'>+</div><div class='add'>+    jnl = (gf_changelog_journal_t *)GF_CHANGELOG_GET_API_PTR(this);</div><div class='add'>+    if (!jnl)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    if (gf_ftruncate(jnl-&gt;jnl_fd, 0))</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return -1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/**</div><div class='add'>+ * @API</div><div class='add'>+ * return the next changelog file entry. zero means all chanelogs</div><div class='add'>+ * consumed.</div><div class='add'>+ */</div><div class='add'>+ssize_t</div><div class='add'>+gf_changelog_next_change(char *bufptr, size_t maxlen)</div><div class='add'>+{</div><div class='add'>+    ssize_t size = -1;</div><div class='add'>+    int tracker_fd = 0;</div><div class='add'>+    xlator_t *this = NULL;</div><div class='add'>+    gf_changelog_journal_t *jnl = NULL;</div><div class='add'>+    char buffer[PATH_MAX] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    errno = EINVAL;</div><div class='add'>+</div><div class='add'>+    this = THIS;</div><div class='add'>+    if (!this)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    jnl = (gf_changelog_journal_t *)GF_CHANGELOG_GET_API_PTR(this);</div><div class='add'>+    if (!jnl)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    tracker_fd = jnl-&gt;jnl_fd;</div><div class='add'>+</div><div class='add'>+    size = gf_readline(tracker_fd, buffer, maxlen);</div><div class='add'>+    if (size &lt; 0) {</div><div class='add'>+        size = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (size == 0)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    memcpy(bufptr, buffer, size - 1);</div><div class='add'>+    bufptr[size - 1] = '\0';</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return size;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/**</div><div class='add'>+ * @API</div><div class='add'>+ *  gf_changelog_scan() - scan and generate a list of change entries</div><div class='add'>+ *</div><div class='add'>+ * calling this api multiple times (without calling gf_changlog_done())</div><div class='add'>+ * would result new changelogs(s) being refreshed in the tracker file.</div><div class='add'>+ * This call also acts as a cancellation point for the consumer.</div><div class='add'>+ */</div><div class='add'>+ssize_t</div><div class='add'>+gf_changelog_scan()</div><div class='add'>+{</div><div class='add'>+    int tracker_fd = 0;</div><div class='add'>+    size_t off = 0;</div><div class='add'>+    xlator_t *this = NULL;</div><div class='add'>+    size_t nr_entries = 0;</div><div class='add'>+    gf_changelog_journal_t *jnl = NULL;</div><div class='add'>+    struct dirent *entry = NULL;</div><div class='add'>+    struct dirent scratch[2] = {</div><div class='add'>+        {</div><div class='add'>+            0,</div><div class='add'>+        },</div><div class='add'>+    };</div><div class='add'>+    char buffer[PATH_MAX] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    this = THIS;</div><div class='add'>+    if (!this)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    jnl = (gf_changelog_journal_t *)GF_CHANGELOG_GET_API_PTR(this);</div><div class='add'>+    if (!jnl)</div><div class='add'>+        goto out;</div><div class='add'>+    if (JNL_IS_API_DISCONNECTED(jnl)) {</div><div class='add'>+        errno = ENOTCONN;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    errno = EINVAL;</div><div class='add'>+</div><div class='add'>+    tracker_fd = jnl-&gt;jnl_fd;</div><div class='add'>+    if (gf_ftruncate(tracker_fd, 0))</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    rewinddir(jnl-&gt;jnl_dir);</div><div class='add'>+</div><div class='add'>+    for (;;) {</div><div class='add'>+        errno = 0;</div><div class='add'>+        entry = sys_readdir(jnl-&gt;jnl_dir, scratch);</div><div class='add'>+        if (!entry || errno != 0)</div><div class='add'>+            break;</div><div class='add'>+</div><div class='add'>+        if (!strcmp(basename(entry-&gt;d_name), ".") ||</div><div class='add'>+            !strcmp(basename(entry-&gt;d_name), ".."))</div><div class='add'>+            continue;</div><div class='add'>+</div><div class='add'>+        nr_entries++;</div><div class='add'>+</div><div class='add'>+        GF_CHANGELOG_FILL_BUFFER(jnl-&gt;jnl_processing_dir, buffer, off,</div><div class='add'>+                                 strlen(jnl-&gt;jnl_processing_dir));</div><div class='add'>+        GF_CHANGELOG_FILL_BUFFER(entry-&gt;d_name, buffer, off,</div><div class='add'>+                                 strlen(entry-&gt;d_name));</div><div class='add'>+        GF_CHANGELOG_FILL_BUFFER("\n", buffer, off, 1);</div><div class='add'>+</div><div class='add'>+        if (gf_changelog_write(tracker_fd, buffer, off) != off) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, 0, CHANGELOG_LIB_MSG_WRITE_FAILED,</div><div class='add'>+                   "error writing changelog filename"</div><div class='add'>+                   " to tracker file");</div><div class='add'>+            break;</div><div class='add'>+        }</div><div class='add'>+        off = 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (!entry) {</div><div class='add'>+        if (gf_lseek(tracker_fd, 0, SEEK_SET) != -1)</div><div class='add'>+            return nr_entries;</div><div class='add'>+    }</div><div class='add'>+out:</div><div class='add'>+    return -1;</div><div class='add'>+}</div><div class='head'>diff --git a/xlators/features/changelog/lib/src/gf-changelog-helpers.c b/xlators/features/changelog/lib/src/gf-changelog-helpers.c<br/>new file mode 100644<br/>index 00000000000..75f8a6dfc08<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/xlators/features/changelog/lib/src/gf-changelog-helpers.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>xlators/features/changelog/lib/src/gf-changelog-helpers.c</a></div><div class='hunk'>@@ -0,0 +1,170 @@</div><div class='add'>+/*</div><div class='add'>+   Copyright (c) 2013 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+   This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+   This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+   General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+   later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+   cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#include "changelog-mem-types.h"</div><div class='add'>+#include "gf-changelog-helpers.h"</div><div class='add'>+#include "changelog-lib-messages.h"</div><div class='add'>+#include &lt;glusterfs/syscall.h&gt;</div><div class='add'>+</div><div class='add'>+size_t</div><div class='add'>+gf_changelog_write(int fd, char *buffer, size_t len)</div><div class='add'>+{</div><div class='add'>+    ssize_t size = 0;</div><div class='add'>+    size_t written = 0;</div><div class='add'>+</div><div class='add'>+    while (written &lt; len) {</div><div class='add'>+        size = sys_write(fd, buffer + written, len - written);</div><div class='add'>+        if (size &lt;= 0)</div><div class='add'>+            break;</div><div class='add'>+</div><div class='add'>+        written += size;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return written;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+gf_rfc3986_encode_space_newline(unsigned char *s, char *enc, char *estr)</div><div class='add'>+{</div><div class='add'>+    for (; *s; s++) {</div><div class='add'>+        if (estr[*s])</div><div class='add'>+            sprintf(enc, "%c", estr[*s]);</div><div class='add'>+        else</div><div class='add'>+            sprintf(enc, "%%%02X", *s);</div><div class='add'>+        while (*++enc)</div><div class='add'>+            ;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/**</div><div class='add'>+ * thread safe version of readline with buffering</div><div class='add'>+ * (taken from Unix Network Programming Volume I, W.R. Stevens)</div><div class='add'>+ *</div><div class='add'>+ * This is favoured over fgets() as we'd need to ftruncate()</div><div class='add'>+ * (see gf_changelog_scan() API) to record new changelog files.</div><div class='add'>+ * stream open functions does have a truncate like api (although</div><div class='add'>+ * that can be done via @fflush(fp), @ftruncate(fd) and @fseek(fp),</div><div class='add'>+ * but this involves mixing POSIX file descriptors and stream FILE *).</div><div class='add'>+ *</div><div class='add'>+ * NOTE: This implementation still does work with more than one fd's</div><div class='add'>+ *       used to perform gf_readline(). For this very reason it's not</div><div class='add'>+ *       made a part of libglusterfs.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+static __thread read_line_t thread_tsd = {};</div><div class='add'>+</div><div class='add'>+static ssize_t</div><div class='add'>+my_read(read_line_t *tsd, int fd, char *ptr)</div><div class='add'>+{</div><div class='add'>+    if (tsd-&gt;rl_cnt &lt;= 0) {</div><div class='add'>+        tsd-&gt;rl_cnt = sys_read(fd, tsd-&gt;rl_buf, MAXLINE);</div><div class='add'>+</div><div class='add'>+        if (tsd-&gt;rl_cnt &lt; 0)</div><div class='add'>+            return -1;</div><div class='add'>+        else if (tsd-&gt;rl_cnt == 0)</div><div class='add'>+            return 0;</div><div class='add'>+        tsd-&gt;rl_bufptr = tsd-&gt;rl_buf;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    tsd-&gt;rl_cnt--;</div><div class='add'>+    *ptr = *tsd-&gt;rl_bufptr++;</div><div class='add'>+    return 1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+ssize_t</div><div class='add'>+gf_readline(int fd, void *vptr, size_t maxlen)</div><div class='add'>+{</div><div class='add'>+    size_t n = 0;</div><div class='add'>+    size_t rc = 0;</div><div class='add'>+    char c = ' ';</div><div class='add'>+    char *ptr = NULL;</div><div class='add'>+    read_line_t *tsd = &amp;thread_tsd;</div><div class='add'>+</div><div class='add'>+    ptr = vptr;</div><div class='add'>+    for (n = 1; n &lt; maxlen; n++) {</div><div class='add'>+        if ((rc = my_read(tsd, fd, &amp;c)) == 1) {</div><div class='add'>+            *ptr++ = c;</div><div class='add'>+            if (c == '\n')</div><div class='add'>+                break;</div><div class='add'>+        } else if (rc == 0) {</div><div class='add'>+            *ptr = '\0';</div><div class='add'>+            return (n - 1);</div><div class='add'>+        } else</div><div class='add'>+            return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    *ptr = '\0';</div><div class='add'>+    return n;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+off_t</div><div class='add'>+gf_lseek(int fd, off_t offset, int whence)</div><div class='add'>+{</div><div class='add'>+    off_t off = 0;</div><div class='add'>+    read_line_t *tsd = &amp;thread_tsd;</div><div class='add'>+</div><div class='add'>+    off = sys_lseek(fd, offset, whence);</div><div class='add'>+    if (off == -1)</div><div class='add'>+        return -1;</div><div class='add'>+</div><div class='add'>+    tsd-&gt;rl_cnt = 0;</div><div class='add'>+    tsd-&gt;rl_bufptr = tsd-&gt;rl_buf;</div><div class='add'>+</div><div class='add'>+    return off;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+gf_ftruncate(int fd, off_t length)</div><div class='add'>+{</div><div class='add'>+    read_line_t *tsd = &amp;thread_tsd;</div><div class='add'>+</div><div class='add'>+    if (sys_ftruncate(fd, 0))</div><div class='add'>+        return -1;</div><div class='add'>+</div><div class='add'>+    tsd-&gt;rl_cnt = 0;</div><div class='add'>+    tsd-&gt;rl_bufptr = tsd-&gt;rl_buf;</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+gf_thread_cleanup(xlator_t *this, pthread_t thread)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+    void *res = NULL;</div><div class='add'>+</div><div class='add'>+    ret = pthread_cancel(thread);</div><div class='add'>+    if (ret != 0) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_WARNING, 0,</div><div class='add'>+               CHANGELOG_LIB_MSG_THREAD_CLEANUP_WARNING,</div><div class='add'>+               "Failed to send cancellation to thread");</div><div class='add'>+        goto error_return;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = pthread_join(thread, &amp;res);</div><div class='add'>+    if (ret != 0) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_WARNING, 0,</div><div class='add'>+               CHANGELOG_LIB_MSG_THREAD_CLEANUP_WARNING,</div><div class='add'>+               "failed to join thread");</div><div class='add'>+        goto error_return;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (res != PTHREAD_CANCELED) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_WARNING, 0,</div><div class='add'>+               CHANGELOG_LIB_MSG_THREAD_CLEANUP_WARNING,</div><div class='add'>+               "Thread could not be cleaned up");</div><div class='add'>+        goto error_return;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+</div><div class='add'>+error_return:</div><div class='add'>+    return -1;</div><div class='add'>+}</div><div class='head'>diff --git a/xlators/features/changelog/lib/src/gf-changelog-helpers.h b/xlators/features/changelog/lib/src/gf-changelog-helpers.h<br/>new file mode 100644<br/>index 00000000000..9c609d33172<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/xlators/features/changelog/lib/src/gf-changelog-helpers.h?id=d1d7a6f35c816822fab51c820e25023863c239c1'>xlators/features/changelog/lib/src/gf-changelog-helpers.h</a></div><div class='hunk'>@@ -0,0 +1,255 @@</div><div class='add'>+/*</div><div class='add'>+   Copyright (c) 2013 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+   This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+   This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+   General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+   later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+   cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#ifndef _GF_CHANGELOG_HELPERS_H</div><div class='add'>+#define _GF_CHANGELOG_HELPERS_H</div><div class='add'>+</div><div class='add'>+#include &lt;unistd.h&gt;</div><div class='add'>+#include &lt;dirent.h&gt;</div><div class='add'>+#include &lt;limits.h&gt;</div><div class='add'>+#include &lt;glusterfs/locking.h&gt;</div><div class='add'>+</div><div class='add'>+#include &lt;glusterfs/xlator.h&gt;</div><div class='add'>+</div><div class='add'>+#include "changelog.h"</div><div class='add'>+</div><div class='add'>+#include "changelog-rpc-common.h"</div><div class='add'>+#include "gf-changelog-journal.h"</div><div class='add'>+</div><div class='add'>+#define GF_CHANGELOG_TRACKER "tracker"</div><div class='add'>+</div><div class='add'>+#define GF_CHANGELOG_CURRENT_DIR ".current"</div><div class='add'>+#define GF_CHANGELOG_PROCESSED_DIR ".processed"</div><div class='add'>+#define GF_CHANGELOG_PROCESSING_DIR ".processing"</div><div class='add'>+#define GF_CHANGELOG_HISTORY_DIR ".history"</div><div class='add'>+#define TIMESTAMP_LENGTH 10</div><div class='add'>+</div><div class='add'>+#ifndef MAXLINE</div><div class='add'>+#define MAXLINE 4096</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#define GF_CHANGELOG_FILL_BUFFER(ptr, ascii, off, len)                         \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        memcpy(ascii + off, ptr, len);                                         \</div><div class='add'>+        off += len;                                                            \</div><div class='add'>+    } while (0)</div><div class='add'>+</div><div class='add'>+typedef struct read_line {</div><div class='add'>+    int rl_cnt;</div><div class='add'>+    char *rl_bufptr;</div><div class='add'>+    char rl_buf[MAXLINE];</div><div class='add'>+} read_line_t;</div><div class='add'>+</div><div class='add'>+struct gf_changelog;</div><div class='add'>+struct gf_event;</div><div class='add'>+</div><div class='add'>+/**</div><div class='add'>+ * Event list for ordered event notification</div><div class='add'>+ *</div><div class='add'>+ * -&gt;next_seq holds the next _expected_ sequence number.</div><div class='add'>+ */</div><div class='add'>+struct gf_event_list {</div><div class='add'>+    pthread_mutex_t lock; /* protects this structure */</div><div class='add'>+    pthread_cond_t cond;</div><div class='add'>+</div><div class='add'>+    pthread_t invoker;</div><div class='add'>+</div><div class='add'>+    unsigned long next_seq; /* next sequence number expected:</div><div class='add'>+                               zero during bootstrap */</div><div class='add'>+</div><div class='add'>+    struct gf_changelog *entry; /* backpointer to it's brick</div><div class='add'>+                                   encapsulator (entry) */</div><div class='add'>+    struct list_head events;    /* list of events */</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+/**</div><div class='add'>+ * include a refcount if it's of use by additional layers</div><div class='add'>+ */</div><div class='add'>+struct gf_event {</div><div class='add'>+    int count;</div><div class='add'>+</div><div class='add'>+    unsigned long seq;</div><div class='add'>+</div><div class='add'>+    struct list_head list;</div><div class='add'>+</div><div class='add'>+    struct iovec iov[0];</div><div class='add'>+};</div><div class='add'>+#define GF_EVENT_CALLOC_SIZE(cnt, len)                                         \</div><div class='add'>+    (sizeof(struct gf_event) + (cnt * sizeof(struct iovec)) + len)</div><div class='add'>+</div><div class='add'>+/**</div><div class='add'>+ * assign the base address of the IO vector to the correct memory</div><div class='add'>+o * area and set it's addressable length.</div><div class='add'>+ */</div><div class='add'>+#define GF_EVENT_ASSIGN_IOVEC(vec, event, len, pos)                            \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        vec-&gt;iov_base = ((char *)event) + sizeof(struct gf_event) +            \</div><div class='add'>+                        (event-&gt;count * sizeof(struct iovec)) + pos;           \</div><div class='add'>+        vec-&gt;iov_len = len;                                                    \</div><div class='add'>+        pos += len;                                                            \</div><div class='add'>+    } while (0)</div><div class='add'>+</div><div class='add'>+typedef enum gf_changelog_conn_state {</div><div class='add'>+    GF_CHANGELOG_CONN_STATE_PENDING = 0,</div><div class='add'>+    GF_CHANGELOG_CONN_STATE_ACCEPTED,</div><div class='add'>+    GF_CHANGELOG_CONN_STATE_DISCONNECTED,</div><div class='add'>+} gf_changelog_conn_state_t;</div><div class='add'>+</div><div class='add'>+/**</div><div class='add'>+ * An instance of this structure is allocated for each brick for which</div><div class='add'>+ * notifications are streamed.</div><div class='add'>+ */</div><div class='add'>+typedef struct gf_changelog {</div><div class='add'>+    gf_lock_t statelock;</div><div class='add'>+    gf_changelog_conn_state_t connstate;</div><div class='add'>+</div><div class='add'>+    xlator_t *this;</div><div class='add'>+</div><div class='add'>+    struct list_head list; /* list of instances */</div><div class='add'>+</div><div class='add'>+    char brick[PATH_MAX]; /* brick path for this end-point */</div><div class='add'>+</div><div class='add'>+    changelog_rpc_t grpc; /* rpc{-clnt,svc} for this brick */</div><div class='add'>+#define RPC_PROBER(ent) ent-&gt;grpc.rpc</div><div class='add'>+#define RPC_REBORP(ent) ent-&gt;grpc.svc</div><div class='add'>+#define RPC_SOCK(ent) ent-&gt;grpc.sock</div><div class='add'>+</div><div class='add'>+    unsigned int notify; /* notification flag(s) */</div><div class='add'>+</div><div class='add'>+    FINI *fini;               /* destructor callback */</div><div class='add'>+    CALLBACK *callback;       /* event callback dispatcher */</div><div class='add'>+    CONNECT *connected;       /* connect callback */</div><div class='add'>+    DISCONNECT *disconnected; /* disconnection callback */</div><div class='add'>+</div><div class='add'>+    void *ptr;           /* owner specific private data */</div><div class='add'>+    xlator_t *invokerxl; /* consumers _this_, if valid,</div><div class='add'>+                            assigned to THIS before cbk is</div><div class='add'>+                            invoked */</div><div class='add'>+</div><div class='add'>+    gf_boolean_t ordered;</div><div class='add'>+</div><div class='add'>+    void (*queueevent)(struct gf_event_list *, struct gf_event *);</div><div class='add'>+    void (*pickevent)(struct gf_event_list *, struct gf_event **);</div><div class='add'>+</div><div class='add'>+    struct gf_event_list event;</div><div class='add'>+} gf_changelog_t;</div><div class='add'>+</div><div class='add'>+static inline int</div><div class='add'>+gf_changelog_filter_check(gf_changelog_t *entry, changelog_event_t *event)</div><div class='add'>+{</div><div class='add'>+    if (event-&gt;ev_type &amp; entry-&gt;notify)</div><div class='add'>+        return 1;</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#define GF_NEED_ORDERED_EVENTS(ent) (ent-&gt;ordered == _gf_true)</div><div class='add'>+</div><div class='add'>+/** private structure */</div><div class='add'>+typedef struct gf_private {</div><div class='add'>+    pthread_mutex_t lock; /* protects -&gt;connections, cleanups */</div><div class='add'>+    pthread_cond_t cond;</div><div class='add'>+</div><div class='add'>+    void *api; /* pointer for API access */</div><div class='add'>+</div><div class='add'>+    pthread_t poller;            /* event poller thread */</div><div class='add'>+    pthread_t connectionjanitor; /* connection cleaner */</div><div class='add'>+</div><div class='add'>+    struct list_head connections; /* list of connections */</div><div class='add'>+    struct list_head cleanups;    /* list of connection to be</div><div class='add'>+                                     cleaned up */</div><div class='add'>+} gf_private_t;</div><div class='add'>+</div><div class='add'>+#define GF_CHANGELOG_GET_API_PTR(this) (((gf_private_t *)this-&gt;private)-&gt;api)</div><div class='add'>+</div><div class='add'>+/**</div><div class='add'>+ * upcall: invoke callback with _correct_ THIS</div><div class='add'>+ */</div><div class='add'>+#define GF_CHANGELOG_INVOKE_CBK(this, cbk, brick, args...)                     \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        xlator_t *old_this = NULL;                                             \</div><div class='add'>+        xlator_t *invokerxl = NULL;                                            \</div><div class='add'>+                                                                               \</div><div class='add'>+        invokerxl = entry-&gt;invokerxl;                                          \</div><div class='add'>+        old_this = this;                                                       \</div><div class='add'>+                                                                               \</div><div class='add'>+        if (invokerxl) {                                                       \</div><div class='add'>+            THIS = invokerxl;                                                  \</div><div class='add'>+        }                                                                      \</div><div class='add'>+                                                                               \</div><div class='add'>+        cbk(invokerxl, brick, args);                                           \</div><div class='add'>+        THIS = old_this;                                                       \</div><div class='add'>+                                                                               \</div><div class='add'>+    } while (0)</div><div class='add'>+</div><div class='add'>+#define SAVE_THIS(xl)                                                          \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        old_this = xl;                                                         \</div><div class='add'>+        THIS = master;                                                         \</div><div class='add'>+    } while (0)</div><div class='add'>+</div><div class='add'>+#define RESTORE_THIS()                                                         \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        if (old_this)                                                          \</div><div class='add'>+            THIS = old_this;                                                   \</div><div class='add'>+    } while (0)</div><div class='add'>+</div><div class='add'>+/** APIs and the rest */</div><div class='add'>+</div><div class='add'>+void *</div><div class='add'>+gf_changelog_process(void *data);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+gf_rfc3986_encode_space_newline(unsigned char *s, char *enc, char *estr);</div><div class='add'>+</div><div class='add'>+size_t</div><div class='add'>+gf_changelog_write(int fd, char *buffer, size_t len);</div><div class='add'>+</div><div class='add'>+ssize_t</div><div class='add'>+gf_readline(int fd, void *vptr, size_t maxlen);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+gf_ftruncate(int fd, off_t length);</div><div class='add'>+</div><div class='add'>+off_t</div><div class='add'>+gf_lseek(int fd, off_t offset, int whence);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+gf_changelog_consume(xlator_t *this, gf_changelog_journal_t *jnl,</div><div class='add'>+                     char *from_path, gf_boolean_t no_publish);</div><div class='add'>+int</div><div class='add'>+gf_changelog_publish(xlator_t *this, gf_changelog_journal_t *jnl,</div><div class='add'>+                     char *from_path);</div><div class='add'>+int</div><div class='add'>+gf_thread_cleanup(xlator_t *this, pthread_t thread);</div><div class='add'>+void *</div><div class='add'>+gf_changelog_callback_invoker(void *arg);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+gf_cleanup_event(xlator_t *, struct gf_event_list *);</div><div class='add'>+</div><div class='add'>+/* (un)ordered event queueing */</div><div class='add'>+void</div><div class='add'>+queue_ordered_event(struct gf_event_list *, struct gf_event *);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+queue_unordered_event(struct gf_event_list *, struct gf_event *);</div><div class='add'>+</div><div class='add'>+/* (un)ordered event picking */</div><div class='add'>+void</div><div class='add'>+pick_event_ordered(struct gf_event_list *, struct gf_event **);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+pick_event_unordered(struct gf_event_list *, struct gf_event **);</div><div class='add'>+</div><div class='add'>+/* connection janitor thread */</div><div class='add'>+void *</div><div class='add'>+gf_changelog_connection_janitor(void *);</div><div class='add'>+</div><div class='add'>+#endif</div><div class='head'>diff --git a/xlators/features/changelog/lib/src/gf-changelog-journal-handler.c b/xlators/features/changelog/lib/src/gf-changelog-journal-handler.c<br/>new file mode 100644<br/>index 00000000000..7f6e2329e71<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/xlators/features/changelog/lib/src/gf-changelog-journal-handler.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>xlators/features/changelog/lib/src/gf-changelog-journal-handler.c</a></div><div class='hunk'>@@ -0,0 +1,1029 @@</div><div class='add'>+/*</div><div class='add'>+   Copyright (c) 2015 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+   This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+   This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+   General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+   later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+   cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#include &lt;glusterfs/compat-uuid.h&gt;</div><div class='add'>+#include &lt;glusterfs/globals.h&gt;</div><div class='add'>+#include &lt;glusterfs/glusterfs.h&gt;</div><div class='add'>+#include &lt;glusterfs/syscall.h&gt;</div><div class='add'>+#include &lt;glusterfs/compat-errno.h&gt;</div><div class='add'>+</div><div class='add'>+#include "gf-changelog-helpers.h"</div><div class='add'>+</div><div class='add'>+/* from the changelog translator */</div><div class='add'>+#include "changelog-misc.h"</div><div class='add'>+#include "changelog-mem-types.h"</div><div class='add'>+</div><div class='add'>+#include "gf-changelog-journal.h"</div><div class='add'>+#include "changelog-lib-messages.h"</div><div class='add'>+</div><div class='add'>+extern int byebye;</div><div class='add'>+</div><div class='add'>+enum changelog_versions { VERSION_1_1 = 0, VERSION_1_2 = 1 };</div><div class='add'>+</div><div class='add'>+/**</div><div class='add'>+ * number of gfid records after fop number</div><div class='add'>+ */</div><div class='add'>+int nr_gfids[2][GF_FOP_MAXVALUE] = {{</div><div class='add'>+                                        [GF_FOP_MKNOD] = 1,</div><div class='add'>+                                        [GF_FOP_MKDIR] = 1,</div><div class='add'>+                                        [GF_FOP_UNLINK] = 1,</div><div class='add'>+                                        [GF_FOP_RMDIR] = 1,</div><div class='add'>+                                        [GF_FOP_SYMLINK] = 1,</div><div class='add'>+                                        [GF_FOP_RENAME] = 2,</div><div class='add'>+                                        [GF_FOP_LINK] = 1,</div><div class='add'>+                                        [GF_FOP_CREATE] = 1,</div><div class='add'>+                                    },</div><div class='add'>+                                    {</div><div class='add'>+                                        [GF_FOP_MKNOD] = 1,</div><div class='add'>+                                        [GF_FOP_MKDIR] = 1,</div><div class='add'>+                                        [GF_FOP_UNLINK] = 2,</div><div class='add'>+                                        [GF_FOP_RMDIR] = 2,</div><div class='add'>+                                        [GF_FOP_SYMLINK] = 1,</div><div class='add'>+                                        [GF_FOP_RENAME] = 2,</div><div class='add'>+                                        [GF_FOP_LINK] = 1,</div><div class='add'>+                                        [GF_FOP_CREATE] = 1,</div><div class='add'>+                                    }};</div><div class='add'>+</div><div class='add'>+int nr_extra_recs[2][GF_FOP_MAXVALUE] = {{</div><div class='add'>+                                             [GF_FOP_MKNOD] = 3,</div><div class='add'>+                                             [GF_FOP_MKDIR] = 3,</div><div class='add'>+                                             [GF_FOP_UNLINK] = 0,</div><div class='add'>+                                             [GF_FOP_RMDIR] = 0,</div><div class='add'>+                                             [GF_FOP_SYMLINK] = 0,</div><div class='add'>+                                             [GF_FOP_RENAME] = 0,</div><div class='add'>+                                             [GF_FOP_LINK] = 0,</div><div class='add'>+                                             [GF_FOP_CREATE] = 3,</div><div class='add'>+                                         },</div><div class='add'>+                                         {</div><div class='add'>+                                             [GF_FOP_MKNOD] = 3,</div><div class='add'>+                                             [GF_FOP_MKDIR] = 3,</div><div class='add'>+                                             [GF_FOP_UNLINK] = 0,</div><div class='add'>+                                             [GF_FOP_RMDIR] = 0,</div><div class='add'>+                                             [GF_FOP_SYMLINK] = 0,</div><div class='add'>+                                             [GF_FOP_RENAME] = 0,</div><div class='add'>+                                             [GF_FOP_LINK] = 0,</div><div class='add'>+                                             [GF_FOP_CREATE] = 3,</div><div class='add'>+                                         }};</div><div class='add'>+</div><div class='add'>+static char *</div><div class='add'>+binary_to_ascii(uuid_t uuid)</div><div class='add'>+{</div><div class='add'>+    return uuid_utoa(uuid);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static char *</div><div class='add'>+conv_noop(char *ptr)</div><div class='add'>+{</div><div class='add'>+    return ptr;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#define VERIFY_SEPARATOR(ptr, plen, perr)                                      \</div><div class='add'>+    {                                                                          \</div><div class='add'>+        if (*(ptr + plen) != '\0') {                                           \</div><div class='add'>+            perr = 1;                                                          \</div><div class='add'>+            break;                                                             \</div><div class='add'>+        }                                                                      \</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+#define MOVER_MOVE(mover, nleft, bytes)                                        \</div><div class='add'>+    {                                                                          \</div><div class='add'>+        mover += bytes;                                                        \</div><div class='add'>+        nleft -= bytes;                                                        \</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+#define PARSE_GFID(mov, ptr, le, fn, perr)                                     \</div><div class='add'>+    {                                                                          \</div><div class='add'>+        VERIFY_SEPARATOR(mov, le, perr);                                       \</div><div class='add'>+        ptr = fn(mov);                                                         \</div><div class='add'>+        if (!ptr) {                                                            \</div><div class='add'>+            perr = 1;                                                          \</div><div class='add'>+            break;                                                             \</div><div class='add'>+        }                                                                      \</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+#define FILL_AND_MOVE(pt, buf, of, mo, nl, le)                                 \</div><div class='add'>+    {                                                                          \</div><div class='add'>+        GF_CHANGELOG_FILL_BUFFER(pt, buf, of, strlen(pt));                     \</div><div class='add'>+        MOVER_MOVE(mo, nl, le);                                                \</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+#define PARSE_GFID_MOVE(ptr, uuid, mover, nleft, perr)                         \</div><div class='add'>+    {                                                                          \</div><div class='add'>+        memcpy(uuid, mover, sizeof(uuid_t));                                   \</div><div class='add'>+        ptr = binary_to_ascii(uuid);                                           \</div><div class='add'>+        if (!ptr) {                                                            \</div><div class='add'>+            perr = 1;                                                          \</div><div class='add'>+            break;                                                             \</div><div class='add'>+        }                                                                      \</div><div class='add'>+        MOVER_MOVE(mover, nleft, sizeof(uuid_t));                              \</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+#define LINE_BUFSIZE (3 * PATH_MAX) /* enough buffer for extra chars too */</div><div class='add'>+</div><div class='add'>+/**</div><div class='add'>+ * using mmap() makes parsing easy. fgets() cannot be used here as</div><div class='add'>+ * the binary gfid could contain a line-feed (0x0A), in that case fgets()</div><div class='add'>+ * would read an incomplete line and parsing would fail. using POSIX fds</div><div class='add'>+ * would result is additional code to maintain state in case of partial</div><div class='add'>+ * reads of data (where multiple entries do not fit extirely in the buffer).</div><div class='add'>+ *</div><div class='add'>+ * mmap() gives the flexibility of pointing to an offset in the file</div><div class='add'>+ * without us worrying about reading it in memory (VM does that for us for</div><div class='add'>+ * free).</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+gf_changelog_parse_binary(xlator_t *this, gf_changelog_journal_t *jnl,</div><div class='add'>+                          int from_fd, int to_fd, size_t start_offset,</div><div class='add'>+                          struct stat *stbuf, int version_idx)</div><div class='add'>+</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    off_t off = 0;</div><div class='add'>+    off_t nleft = 0;</div><div class='add'>+    uuid_t uuid = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    char *ptr = NULL;</div><div class='add'>+    char *bname_start = NULL;</div><div class='add'>+    char *bname_end = NULL;</div><div class='add'>+    char *mover = NULL;</div><div class='add'>+    void *start = NULL;</div><div class='add'>+    char current_mover = ' ';</div><div class='add'>+    size_t blen = 0;</div><div class='add'>+    int parse_err = 0;</div><div class='add'>+    char *ascii = NULL;</div><div class='add'>+</div><div class='add'>+    ascii = GF_CALLOC(LINE_BUFSIZE, sizeof(char), gf_common_mt_char);</div><div class='add'>+</div><div class='add'>+    nleft = stbuf-&gt;st_size;</div><div class='add'>+</div><div class='add'>+    start = mmap(NULL, nleft, PROT_READ, MAP_PRIVATE, from_fd, 0);</div><div class='add'>+    if (start == MAP_FAILED) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_ERROR, errno, CHANGELOG_LIB_MSG_MMAP_FAILED,</div><div class='add'>+               "mmap() error");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    mover = start;</div><div class='add'>+</div><div class='add'>+    MOVER_MOVE(mover, nleft, start_offset);</div><div class='add'>+</div><div class='add'>+    while (nleft &gt; 0) {</div><div class='add'>+        off = blen = 0;</div><div class='add'>+        ptr = bname_start = bname_end = NULL;</div><div class='add'>+</div><div class='add'>+        current_mover = *mover;</div><div class='add'>+</div><div class='add'>+        switch (current_mover) {</div><div class='add'>+            case 'D':</div><div class='add'>+            case 'M':</div><div class='add'>+                MOVER_MOVE(mover, nleft, 1);</div><div class='add'>+                PARSE_GFID_MOVE(ptr, uuid, mover, nleft, parse_err);</div><div class='add'>+</div><div class='add'>+                break;</div><div class='add'>+</div><div class='add'>+            case 'E':</div><div class='add'>+                MOVER_MOVE(mover, nleft, 1);</div><div class='add'>+                PARSE_GFID_MOVE(ptr, uuid, mover, nleft, parse_err);</div><div class='add'>+</div><div class='add'>+                bname_start = mover;</div><div class='add'>+                bname_end = strchr(mover, '\n');</div><div class='add'>+                if (bname_end == NULL) {</div><div class='add'>+                    parse_err = 1;</div><div class='add'>+                    break;</div><div class='add'>+                }</div><div class='add'>+</div><div class='add'>+                blen = bname_end - bname_start;</div><div class='add'>+                MOVER_MOVE(mover, nleft, blen);</div><div class='add'>+</div><div class='add'>+                break;</div><div class='add'>+</div><div class='add'>+            default:</div><div class='add'>+                parse_err = 1;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        if (parse_err)</div><div class='add'>+            break;</div><div class='add'>+</div><div class='add'>+        GF_CHANGELOG_FILL_BUFFER(&amp;current_mover, ascii, off, 1);</div><div class='add'>+        GF_CHANGELOG_FILL_BUFFER(" ", ascii, off, 1);</div><div class='add'>+        GF_CHANGELOG_FILL_BUFFER(ptr, ascii, off, strlen(ptr));</div><div class='add'>+        if (blen)</div><div class='add'>+            GF_CHANGELOG_FILL_BUFFER(bname_start, ascii, off, blen);</div><div class='add'>+        GF_CHANGELOG_FILL_BUFFER("\n", ascii, off, 1);</div><div class='add'>+</div><div class='add'>+        if (gf_changelog_write(to_fd, ascii, off) != off) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, errno,</div><div class='add'>+                   CHANGELOG_LIB_MSG_ASCII_ERROR,</div><div class='add'>+                   "processing binary changelog failed due to "</div><div class='add'>+                   " error in writing ascii change");</div><div class='add'>+            break;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        MOVER_MOVE(mover, nleft, 1);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if ((nleft == 0) &amp;&amp; (!parse_err))</div><div class='add'>+        ret = 0;</div><div class='add'>+</div><div class='add'>+    if (munmap(start, stbuf-&gt;st_size))</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_ERROR, errno, CHANGELOG_LIB_MSG_MUNMAP_FAILED,</div><div class='add'>+               "munmap() error");</div><div class='add'>+out:</div><div class='add'>+    if (ascii)</div><div class='add'>+        GF_FREE(ascii);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/**</div><div class='add'>+ * ascii decoder:</div><div class='add'>+ *  - separate out one entry from another</div><div class='add'>+ *  - use fop name rather than fop number</div><div class='add'>+ */</div><div class='add'>+static int</div><div class='add'>+gf_changelog_parse_ascii(xlator_t *this, gf_changelog_journal_t *jnl,</div><div class='add'>+                         int from_fd, int to_fd, size_t start_offset,</div><div class='add'>+                         struct stat *stbuf, int version_idx)</div><div class='add'>+{</div><div class='add'>+    int ng = 0;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int fop = 0;</div><div class='add'>+    int len = 0;</div><div class='add'>+    off_t off = 0;</div><div class='add'>+    off_t nleft = 0;</div><div class='add'>+    char *ptr = NULL;</div><div class='add'>+    char *eptr = NULL;</div><div class='add'>+    void *start = NULL;</div><div class='add'>+    char *mover = NULL;</div><div class='add'>+    int parse_err = 0;</div><div class='add'>+    char current_mover = ' ';</div><div class='add'>+    char *ascii = NULL;</div><div class='add'>+    const char *fopname = NULL;</div><div class='add'>+</div><div class='add'>+    ascii = GF_CALLOC(LINE_BUFSIZE, sizeof(char), gf_common_mt_char);</div><div class='add'>+</div><div class='add'>+    nleft = stbuf-&gt;st_size;</div><div class='add'>+</div><div class='add'>+    start = mmap(NULL, nleft, PROT_READ, MAP_PRIVATE, from_fd, 0);</div><div class='add'>+    if (start == MAP_FAILED) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_ERROR, errno, CHANGELOG_LIB_MSG_MMAP_FAILED,</div><div class='add'>+               "mmap() error");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    mover = start;</div><div class='add'>+</div><div class='add'>+    MOVER_MOVE(mover, nleft, start_offset);</div><div class='add'>+</div><div class='add'>+    while (nleft &gt; 0) {</div><div class='add'>+        off = 0;</div><div class='add'>+        current_mover = *mover;</div><div class='add'>+</div><div class='add'>+        GF_CHANGELOG_FILL_BUFFER(&amp;current_mover, ascii, off, 1);</div><div class='add'>+        GF_CHANGELOG_FILL_BUFFER(" ", ascii, off, 1);</div><div class='add'>+</div><div class='add'>+        switch (current_mover) {</div><div class='add'>+            case 'D':</div><div class='add'>+                MOVER_MOVE(mover, nleft, 1);</div><div class='add'>+</div><div class='add'>+                /* target gfid */</div><div class='add'>+                PARSE_GFID(mover, ptr, UUID_CANONICAL_FORM_LEN, conv_noop,</div><div class='add'>+                           parse_err);</div><div class='add'>+                FILL_AND_MOVE(ptr, ascii, off, mover, nleft,</div><div class='add'>+                              UUID_CANONICAL_FORM_LEN);</div><div class='add'>+                break;</div><div class='add'>+            case 'M':</div><div class='add'>+                MOVER_MOVE(mover, nleft, 1);</div><div class='add'>+</div><div class='add'>+                /* target gfid */</div><div class='add'>+                PARSE_GFID(mover, ptr, UUID_CANONICAL_FORM_LEN, conv_noop,</div><div class='add'>+                           parse_err);</div><div class='add'>+                FILL_AND_MOVE(ptr, ascii, off, mover, nleft,</div><div class='add'>+                              UUID_CANONICAL_FORM_LEN);</div><div class='add'>+                FILL_AND_MOVE(" ", ascii, off, mover, nleft, 1);</div><div class='add'>+</div><div class='add'>+                /* fop */</div><div class='add'>+                len = strlen(mover);</div><div class='add'>+                VERIFY_SEPARATOR(mover, len, parse_err);</div><div class='add'>+</div><div class='add'>+                fop = atoi(mover);</div><div class='add'>+                fopname = gf_fop_list[fop];</div><div class='add'>+                if (fopname == NULL) {</div><div class='add'>+                    parse_err = 1;</div><div class='add'>+                    break;</div><div class='add'>+                }</div><div class='add'>+</div><div class='add'>+                MOVER_MOVE(mover, nleft, len);</div><div class='add'>+</div><div class='add'>+                len = strlen(fopname);</div><div class='add'>+                GF_CHANGELOG_FILL_BUFFER(fopname, ascii, off, len);</div><div class='add'>+</div><div class='add'>+                break;</div><div class='add'>+</div><div class='add'>+            case 'E':</div><div class='add'>+                MOVER_MOVE(mover, nleft, 1);</div><div class='add'>+</div><div class='add'>+                /* target gfid */</div><div class='add'>+                PARSE_GFID(mover, ptr, UUID_CANONICAL_FORM_LEN, conv_noop,</div><div class='add'>+                           parse_err);</div><div class='add'>+                FILL_AND_MOVE(ptr, ascii, off, mover, nleft,</div><div class='add'>+                              UUID_CANONICAL_FORM_LEN);</div><div class='add'>+                FILL_AND_MOVE(" ", ascii, off, mover, nleft, 1);</div><div class='add'>+</div><div class='add'>+                /* fop */</div><div class='add'>+                len = strlen(mover);</div><div class='add'>+                VERIFY_SEPARATOR(mover, len, parse_err);</div><div class='add'>+</div><div class='add'>+                fop = atoi(mover);</div><div class='add'>+                fopname = gf_fop_list[fop];</div><div class='add'>+                if (fopname == NULL) {</div><div class='add'>+                    parse_err = 1;</div><div class='add'>+                    break;</div><div class='add'>+                }</div><div class='add'>+</div><div class='add'>+                MOVER_MOVE(mover, nleft, len);</div><div class='add'>+</div><div class='add'>+                len = strlen(fopname);</div><div class='add'>+                GF_CHANGELOG_FILL_BUFFER(fopname, ascii, off, len);</div><div class='add'>+</div><div class='add'>+                ng = nr_extra_recs[version_idx][fop];</div><div class='add'>+                for (; ng &gt; 0; ng--) {</div><div class='add'>+                    MOVER_MOVE(mover, nleft, 1);</div><div class='add'>+                    len = strlen(mover);</div><div class='add'>+                    VERIFY_SEPARATOR(mover, len, parse_err);</div><div class='add'>+</div><div class='add'>+                    GF_CHANGELOG_FILL_BUFFER(" ", ascii, off, 1);</div><div class='add'>+                    FILL_AND_MOVE(mover, ascii, off, mover, nleft, len);</div><div class='add'>+                }</div><div class='add'>+</div><div class='add'>+                /* pargfid + bname */</div><div class='add'>+                ng = nr_gfids[version_idx][fop];</div><div class='add'>+                while (ng-- &gt; 0) {</div><div class='add'>+                    MOVER_MOVE(mover, nleft, 1);</div><div class='add'>+                    len = strlen(mover);</div><div class='add'>+                    if (!len) {</div><div class='add'>+                        MOVER_MOVE(mover, nleft, 1);</div><div class='add'>+                        continue;</div><div class='add'>+                    }</div><div class='add'>+</div><div class='add'>+                    GF_CHANGELOG_FILL_BUFFER(" ", ascii, off, 1);</div><div class='add'>+</div><div class='add'>+                    PARSE_GFID(mover, ptr, len, conv_noop, parse_err);</div><div class='add'>+                    eptr = calloc(3, strlen(ptr));</div><div class='add'>+                    if (!eptr) {</div><div class='add'>+                        parse_err = 1;</div><div class='add'>+                        break;</div><div class='add'>+                    }</div><div class='add'>+</div><div class='add'>+                    gf_rfc3986_encode_space_newline((unsigned char *)ptr, eptr,</div><div class='add'>+                                                    jnl-&gt;rfc3986_space_newline);</div><div class='add'>+                    FILL_AND_MOVE(eptr, ascii, off, mover, nleft, len);</div><div class='add'>+                    free(eptr);</div><div class='add'>+                }</div><div class='add'>+</div><div class='add'>+                break;</div><div class='add'>+            default:</div><div class='add'>+                parse_err = 1;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        if (parse_err)</div><div class='add'>+            break;</div><div class='add'>+</div><div class='add'>+        GF_CHANGELOG_FILL_BUFFER("\n", ascii, off, 1);</div><div class='add'>+</div><div class='add'>+        if (gf_changelog_write(to_fd, ascii, off) != off) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, errno,</div><div class='add'>+                   CHANGELOG_LIB_MSG_ASCII_ERROR,</div><div class='add'>+                   "processing ascii changelog failed due to "</div><div class='add'>+                   " error in writing change");</div><div class='add'>+            break;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        MOVER_MOVE(mover, nleft, 1);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if ((nleft == 0) &amp;&amp; (!parse_err))</div><div class='add'>+        ret = 0;</div><div class='add'>+</div><div class='add'>+    if (munmap(start, stbuf-&gt;st_size))</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_ERROR, errno, CHANGELOG_LIB_MSG_MUNMAP_FAILED,</div><div class='add'>+               "munmap() error");</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (ascii)</div><div class='add'>+        GF_FREE(ascii);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+gf_changelog_decode(xlator_t *this, gf_changelog_journal_t *jnl, int from_fd,</div><div class='add'>+                    int to_fd, struct stat *stbuf, int *zerob)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int encoding = -1;</div><div class='add'>+    int major_version = -1;</div><div class='add'>+    int minor_version = -1;</div><div class='add'>+    int version_idx = -1;</div><div class='add'>+    size_t elen = 0;</div><div class='add'>+    char buffer[1024] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    CHANGELOG_GET_HEADER_INFO(from_fd, buffer, sizeof(buffer), encoding,</div><div class='add'>+                              major_version, minor_version, elen);</div><div class='add'>+    if (encoding == -1) /* unknown encoding */</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    if (major_version == -1) /* unknown major version */</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    if (minor_version == -1) /* unknown minor version */</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    if (!CHANGELOG_VALID_ENCODING(encoding))</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    if (elen == stbuf-&gt;st_size) {</div><div class='add'>+        *zerob = 1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (major_version == 1 &amp;&amp; minor_version == 1) {</div><div class='add'>+        version_idx = VERSION_1_1;</div><div class='add'>+    } else if (major_version == 1 &amp;&amp; minor_version == 2) {</div><div class='add'>+        version_idx = VERSION_1_2;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (version_idx == -1) /* unknown version number */</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    /**</div><div class='add'>+     * start processing after the header</div><div class='add'>+     */</div><div class='add'>+    if (sys_lseek(from_fd, elen, SEEK_SET) &lt; 0) {</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    switch (encoding) {</div><div class='add'>+        case CHANGELOG_ENCODE_BINARY:</div><div class='add'>+            /**</div><div class='add'>+             * this ideally should have been a part of changelog-encoders.c</div><div class='add'>+             * (ie. part of the changelog translator).</div><div class='add'>+             */</div><div class='add'>+            ret = gf_changelog_parse_binary(this, jnl, from_fd, to_fd, elen,</div><div class='add'>+                                            stbuf, version_idx);</div><div class='add'>+            break;</div><div class='add'>+</div><div class='add'>+        case CHANGELOG_ENCODE_ASCII:</div><div class='add'>+            ret = gf_changelog_parse_ascii(this, jnl, from_fd, to_fd, elen,</div><div class='add'>+                                           stbuf, version_idx);</div><div class='add'>+            break;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+gf_changelog_publish(xlator_t *this, gf_changelog_journal_t *jnl,</div><div class='add'>+                     char *from_path)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+    char dest[PATH_MAX] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    char to_path[PATH_MAX] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    struct stat stbuf = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    if (snprintf(to_path, PATH_MAX, "%s%s", jnl-&gt;jnl_current_dir,</div><div class='add'>+                 basename(from_path)) &gt;= PATH_MAX)</div><div class='add'>+        return -1;</div><div class='add'>+</div><div class='add'>+    /* handle zerob file that won't exist in current */</div><div class='add'>+    ret = sys_stat(to_path, &amp;stbuf);</div><div class='add'>+    if (ret) {</div><div class='add'>+        if (errno == ENOENT)</div><div class='add'>+            ret = 0;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (snprintf(dest, PATH_MAX, "%s%s", jnl-&gt;jnl_processing_dir,</div><div class='add'>+                 basename(from_path)) &gt;= PATH_MAX)</div><div class='add'>+        return -1;</div><div class='add'>+</div><div class='add'>+    ret = sys_rename(to_path, dest);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_ERROR, errno,</div><div class='add'>+                CHANGELOG_LIB_MSG_RENAME_FAILED, "from=%s", to_path, "to=%s",</div><div class='add'>+                dest, NULL);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+gf_changelog_consume(xlator_t *this, gf_changelog_journal_t *jnl,</div><div class='add'>+                     char *from_path, gf_boolean_t no_publish)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int fd1 = 0;</div><div class='add'>+    int fd2 = 0;</div><div class='add'>+    int zerob = 0;</div><div class='add'>+    struct stat stbuf = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    char dest[PATH_MAX] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    char to_path[PATH_MAX] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    if (snprintf(to_path, PATH_MAX, "%s%s", jnl-&gt;jnl_current_dir,</div><div class='add'>+                 basename(from_path)) &gt;= PATH_MAX)</div><div class='add'>+        goto out;</div><div class='add'>+    if (snprintf(dest, PATH_MAX, "%s%s", jnl-&gt;jnl_processing_dir,</div><div class='add'>+                 basename(from_path)) &gt;= PATH_MAX)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    ret = sys_stat(from_path, &amp;stbuf);</div><div class='add'>+    if (ret || !S_ISREG(stbuf.st_mode)) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_ERROR, errno, CHANGELOG_LIB_MSG_STAT_FAILED,</div><div class='add'>+                "path=%s", from_path, NULL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    fd1 = open(from_path, O_RDONLY);</div><div class='add'>+    if (fd1 &lt; 0) {</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_ERROR, errno, CHANGELOG_LIB_MSG_OPEN_FAILED,</div><div class='add'>+                "path=%s", from_path, NULL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    fd2 = open(to_path, O_CREAT | O_TRUNC | O_RDWR,</div><div class='add'>+               S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);</div><div class='add'>+    if (fd2 &lt; 0) {</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_ERROR, errno, CHANGELOG_LIB_MSG_OPEN_FAILED,</div><div class='add'>+                "path=%s", to_path, NULL);</div><div class='add'>+        goto close_fd;</div><div class='add'>+    } else {</div><div class='add'>+        ret = gf_changelog_decode(this, jnl, fd1, fd2, &amp;stbuf, &amp;zerob);</div><div class='add'>+</div><div class='add'>+        sys_close(fd2);</div><div class='add'>+</div><div class='add'>+        if (!ret) {</div><div class='add'>+            /* move it to processing on a successful</div><div class='add'>+               decode */</div><div class='add'>+            if (no_publish == _gf_true)</div><div class='add'>+                goto close_fd;</div><div class='add'>+            ret = sys_rename(to_path, dest);</div><div class='add'>+            if (ret)</div><div class='add'>+                gf_smsg(this-&gt;name, GF_LOG_ERROR, errno,</div><div class='add'>+                        CHANGELOG_LIB_MSG_RENAME_FAILED, "from=%s", to_path,</div><div class='add'>+                        "to=%s", dest, NULL);</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        /* remove it from .current if it's an empty file */</div><div class='add'>+        if (zerob) {</div><div class='add'>+            /* zerob changelogs must be unlinked */</div><div class='add'>+            ret = sys_unlink(to_path);</div><div class='add'>+            if (ret)</div><div class='add'>+                gf_smsg(this-&gt;name, GF_LOG_ERROR, errno,</div><div class='add'>+                        CHANGELOG_LIB_MSG_UNLINK_FAILED, "name=empty changelog",</div><div class='add'>+                        "path=%s", to_path, NULL);</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+close_fd:</div><div class='add'>+    sys_close(fd1);</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void *</div><div class='add'>+gf_changelog_process(void *data)</div><div class='add'>+{</div><div class='add'>+    xlator_t *this = NULL;</div><div class='add'>+    gf_changelog_journal_t *jnl = NULL;</div><div class='add'>+    gf_changelog_entry_t *entry = NULL;</div><div class='add'>+    gf_changelog_processor_t *jnl_proc = NULL;</div><div class='add'>+</div><div class='add'>+    jnl = data;</div><div class='add'>+    jnl_proc = jnl-&gt;jnl_proc;</div><div class='add'>+    THIS = jnl-&gt;this;</div><div class='add'>+    this = jnl-&gt;this;</div><div class='add'>+</div><div class='add'>+    while (1) {</div><div class='add'>+        pthread_mutex_lock(&amp;jnl_proc-&gt;lock);</div><div class='add'>+        {</div><div class='add'>+            while (list_empty(&amp;jnl_proc-&gt;entries)) {</div><div class='add'>+                jnl_proc-&gt;waiting = _gf_true;</div><div class='add'>+                pthread_cond_wait(&amp;jnl_proc-&gt;cond, &amp;jnl_proc-&gt;lock);</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            entry = list_first_entry(&amp;jnl_proc-&gt;entries, gf_changelog_entry_t,</div><div class='add'>+                                     list);</div><div class='add'>+            if (entry)</div><div class='add'>+                list_del(&amp;entry-&gt;list);</div><div class='add'>+</div><div class='add'>+            jnl_proc-&gt;waiting = _gf_false;</div><div class='add'>+        }</div><div class='add'>+        pthread_mutex_unlock(&amp;jnl_proc-&gt;lock);</div><div class='add'>+</div><div class='add'>+        if (entry) {</div><div class='add'>+            (void)gf_changelog_consume(this, jnl, entry-&gt;path, _gf_false);</div><div class='add'>+            GF_FREE(entry);</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return NULL;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+gf_changelog_queue_journal(gf_changelog_processor_t *jnl_proc,</div><div class='add'>+                           changelog_event_t *event)</div><div class='add'>+{</div><div class='add'>+    size_t len = 0;</div><div class='add'>+    gf_changelog_entry_t *entry = NULL;</div><div class='add'>+</div><div class='add'>+    entry = GF_CALLOC(1, sizeof(gf_changelog_entry_t),</div><div class='add'>+                      gf_changelog_mt_libgfchangelog_entry_t);</div><div class='add'>+    if (!entry)</div><div class='add'>+        return;</div><div class='add'>+    INIT_LIST_HEAD(&amp;entry-&gt;list);</div><div class='add'>+</div><div class='add'>+    len = strlen(event-&gt;u.journal.path);</div><div class='add'>+    (void)memcpy(entry-&gt;path, event-&gt;u.journal.path, len + 1);</div><div class='add'>+    entry-&gt;path[len] = '\0';</div><div class='add'>+</div><div class='add'>+    pthread_mutex_lock(&amp;jnl_proc-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        list_add_tail(&amp;entry-&gt;list, &amp;jnl_proc-&gt;entries);</div><div class='add'>+        if (jnl_proc-&gt;waiting)</div><div class='add'>+            pthread_cond_signal(&amp;jnl_proc-&gt;cond);</div><div class='add'>+    }</div><div class='add'>+    pthread_mutex_unlock(&amp;jnl_proc-&gt;lock);</div><div class='add'>+</div><div class='add'>+    return;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+gf_changelog_handle_journal(void *xl, char *brick, void *cbkdata,</div><div class='add'>+                            changelog_event_t *event)</div><div class='add'>+{</div><div class='add'>+    gf_changelog_journal_t *jnl = NULL;</div><div class='add'>+    gf_changelog_processor_t *jnl_proc = NULL;</div><div class='add'>+</div><div class='add'>+    jnl = cbkdata;</div><div class='add'>+    jnl_proc = jnl-&gt;jnl_proc;</div><div class='add'>+</div><div class='add'>+    gf_changelog_queue_journal(jnl_proc, event);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+gf_changelog_journal_disconnect(void *xl, char *brick, void *data)</div><div class='add'>+{</div><div class='add'>+    gf_changelog_journal_t *jnl = NULL;</div><div class='add'>+</div><div class='add'>+    jnl = data;</div><div class='add'>+</div><div class='add'>+    pthread_spin_lock(&amp;jnl-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        JNL_SET_API_STATE(jnl, JNL_API_DISCONNECTED);</div><div class='add'>+    };</div><div class='add'>+    pthread_spin_unlock(&amp;jnl-&gt;lock);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+gf_changelog_journal_connect(void *xl, char *brick, void *data)</div><div class='add'>+{</div><div class='add'>+    gf_changelog_journal_t *jnl = NULL;</div><div class='add'>+</div><div class='add'>+    jnl = data;</div><div class='add'>+</div><div class='add'>+    pthread_spin_lock(&amp;jnl-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        JNL_SET_API_STATE(jnl, JNL_API_CONNECTED);</div><div class='add'>+    };</div><div class='add'>+    pthread_spin_unlock(&amp;jnl-&gt;lock);</div><div class='add'>+</div><div class='add'>+    return;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+gf_changelog_cleanup_processor(gf_changelog_journal_t *jnl)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+    xlator_t *this = NULL;</div><div class='add'>+    gf_changelog_processor_t *jnl_proc = NULL;</div><div class='add'>+</div><div class='add'>+    this = THIS;</div><div class='add'>+    if (!this || !jnl || !jnl-&gt;jnl_proc)</div><div class='add'>+        goto error_return;</div><div class='add'>+</div><div class='add'>+    jnl_proc = jnl-&gt;jnl_proc;</div><div class='add'>+</div><div class='add'>+    ret = gf_thread_cleanup(this, jnl_proc-&gt;processor);</div><div class='add'>+    if (ret != 0) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_ERROR, 0, CHANGELOG_LIB_MSG_CLEANUP_ERROR,</div><div class='add'>+               "failed to cleanup processor thread");</div><div class='add'>+        goto error_return;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    (void)pthread_mutex_destroy(&amp;jnl_proc-&gt;lock);</div><div class='add'>+    (void)pthread_cond_destroy(&amp;jnl_proc-&gt;cond);</div><div class='add'>+</div><div class='add'>+    GF_FREE(jnl_proc);</div><div class='add'>+</div><div class='add'>+error_return:</div><div class='add'>+    return;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+gf_changelog_init_processor(gf_changelog_journal_t *jnl)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    gf_changelog_processor_t *jnl_proc = NULL;</div><div class='add'>+</div><div class='add'>+    jnl_proc = GF_CALLOC(1, sizeof(gf_changelog_processor_t),</div><div class='add'>+                         gf_changelog_mt_libgfchangelog_t);</div><div class='add'>+    if (!jnl_proc)</div><div class='add'>+        goto error_return;</div><div class='add'>+</div><div class='add'>+    ret = pthread_mutex_init(&amp;jnl_proc-&gt;lock, NULL);</div><div class='add'>+    if (ret != 0)</div><div class='add'>+        goto free_jnl_proc;</div><div class='add'>+    ret = pthread_cond_init(&amp;jnl_proc-&gt;cond, NULL);</div><div class='add'>+    if (ret != 0)</div><div class='add'>+        goto cleanup_mutex;</div><div class='add'>+</div><div class='add'>+    INIT_LIST_HEAD(&amp;jnl_proc-&gt;entries);</div><div class='add'>+    jnl_proc-&gt;waiting = _gf_false;</div><div class='add'>+    jnl-&gt;jnl_proc = jnl_proc;</div><div class='add'>+</div><div class='add'>+    ret = gf_thread_create(&amp;jnl_proc-&gt;processor, NULL, gf_changelog_process,</div><div class='add'>+                           jnl, "clogproc");</div><div class='add'>+    if (ret != 0) {</div><div class='add'>+        jnl-&gt;jnl_proc = NULL;</div><div class='add'>+        goto cleanup_cond;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+</div><div class='add'>+cleanup_cond:</div><div class='add'>+    (void)pthread_cond_destroy(&amp;jnl_proc-&gt;cond);</div><div class='add'>+cleanup_mutex:</div><div class='add'>+    (void)pthread_mutex_destroy(&amp;jnl_proc-&gt;lock);</div><div class='add'>+free_jnl_proc:</div><div class='add'>+    GF_FREE(jnl_proc);</div><div class='add'>+error_return:</div><div class='add'>+    return -1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+gf_changelog_cleanup_fds(gf_changelog_journal_t *jnl)</div><div class='add'>+{</div><div class='add'>+    /* tracker fd */</div><div class='add'>+    if (jnl-&gt;jnl_fd != -1)</div><div class='add'>+        sys_close(jnl-&gt;jnl_fd);</div><div class='add'>+    /* processing dir */</div><div class='add'>+    if (jnl-&gt;jnl_dir)</div><div class='add'>+        sys_closedir(jnl-&gt;jnl_dir);</div><div class='add'>+</div><div class='add'>+    if (jnl-&gt;jnl_working_dir)</div><div class='add'>+        free(jnl-&gt;jnl_working_dir); /* allocated by realpath */</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+gf_changelog_open_dirs(xlator_t *this, gf_changelog_journal_t *jnl)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    DIR *dir = NULL;</div><div class='add'>+    int tracker_fd = 0;</div><div class='add'>+    char tracker_path[PATH_MAX] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    /* .current */</div><div class='add'>+    (void)snprintf(jnl-&gt;jnl_current_dir, PATH_MAX,</div><div class='add'>+                   "%s/" GF_CHANGELOG_CURRENT_DIR "/", jnl-&gt;jnl_working_dir);</div><div class='add'>+    ret = recursive_rmdir(jnl-&gt;jnl_current_dir);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_ERROR, errno,</div><div class='add'>+                CHANGELOG_LIB_MSG_FAILED_TO_RMDIR, "path=%s",</div><div class='add'>+                jnl-&gt;jnl_current_dir, NULL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    ret = mkdir_p(jnl-&gt;jnl_current_dir, 0600, _gf_false);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    /* .processed */</div><div class='add'>+    (void)snprintf(jnl-&gt;jnl_processed_dir, PATH_MAX,</div><div class='add'>+                   "%s/" GF_CHANGELOG_PROCESSED_DIR "/", jnl-&gt;jnl_working_dir);</div><div class='add'>+    ret = mkdir_p(jnl-&gt;jnl_processed_dir, 0600, _gf_false);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    /* .processing */</div><div class='add'>+    (void)snprintf(jnl-&gt;jnl_processing_dir, PATH_MAX,</div><div class='add'>+                   "%s/" GF_CHANGELOG_PROCESSING_DIR "/", jnl-&gt;jnl_working_dir);</div><div class='add'>+    ret = recursive_rmdir(jnl-&gt;jnl_processing_dir);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_ERROR, errno,</div><div class='add'>+                CHANGELOG_LIB_MSG_FAILED_TO_RMDIR, "path=%s",</div><div class='add'>+                jnl-&gt;jnl_processing_dir, NULL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = mkdir_p(jnl-&gt;jnl_processing_dir, 0600, _gf_false);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    dir = sys_opendir(jnl-&gt;jnl_processing_dir);</div><div class='add'>+    if (!dir) {</div><div class='add'>+        gf_msg("", GF_LOG_ERROR, errno, CHANGELOG_LIB_MSG_OPENDIR_ERROR,</div><div class='add'>+               "opendir() error");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    jnl-&gt;jnl_dir = dir;</div><div class='add'>+</div><div class='add'>+    (void)snprintf(tracker_path, PATH_MAX, "%s/" GF_CHANGELOG_TRACKER,</div><div class='add'>+                   jnl-&gt;jnl_working_dir);</div><div class='add'>+</div><div class='add'>+    tracker_fd = open(tracker_path, O_CREAT | O_APPEND | O_RDWR,</div><div class='add'>+                      S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);</div><div class='add'>+    if (tracker_fd &lt; 0) {</div><div class='add'>+        sys_closedir(jnl-&gt;jnl_dir);</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    jnl-&gt;jnl_fd = tracker_fd;</div><div class='add'>+    ret = 0;</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+gf_changelog_init_history(xlator_t *this, gf_changelog_journal_t *jnl,</div><div class='add'>+                          char *brick_path)</div><div class='add'>+{</div><div class='add'>+    int i = 0;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    char hist_scratch_dir[PATH_MAX] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    jnl-&gt;hist_jnl = GF_CALLOC(1, sizeof(*jnl),</div><div class='add'>+                              gf_changelog_mt_libgfchangelog_t);</div><div class='add'>+    if (!jnl-&gt;hist_jnl)</div><div class='add'>+        goto error_return;</div><div class='add'>+</div><div class='add'>+    jnl-&gt;hist_jnl-&gt;jnl_dir = NULL;</div><div class='add'>+    jnl-&gt;hist_jnl-&gt;jnl_fd = -1;</div><div class='add'>+</div><div class='add'>+    (void)snprintf(hist_scratch_dir, PATH_MAX,</div><div class='add'>+                   "%s/" GF_CHANGELOG_HISTORY_DIR "/", jnl-&gt;jnl_working_dir);</div><div class='add'>+</div><div class='add'>+    ret = mkdir_p(hist_scratch_dir, 0600, _gf_false);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto dealloc_hist;</div><div class='add'>+</div><div class='add'>+    jnl-&gt;hist_jnl-&gt;jnl_working_dir = realpath(hist_scratch_dir, NULL);</div><div class='add'>+    if (!jnl-&gt;hist_jnl-&gt;jnl_working_dir)</div><div class='add'>+        goto dealloc_hist;</div><div class='add'>+</div><div class='add'>+    ret = gf_changelog_open_dirs(this, jnl-&gt;hist_jnl);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_ERROR, 0, CHANGELOG_LIB_MSG_OPENDIR_ERROR,</div><div class='add'>+               "could not create entries in history scratch dir");</div><div class='add'>+        goto dealloc_hist;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (snprintf(jnl-&gt;hist_jnl-&gt;jnl_brickpath, PATH_MAX, "%s", brick_path) &gt;=</div><div class='add'>+        PATH_MAX)</div><div class='add'>+        goto dealloc_hist;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; 256; i++) {</div><div class='add'>+        jnl-&gt;hist_jnl-&gt;rfc3986_space_newline[i] = (i == ' ' || i == '\n' ||</div><div class='add'>+                                                   i == '%')</div><div class='add'>+                                                      ? 0</div><div class='add'>+                                                      : i;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+</div><div class='add'>+dealloc_hist:</div><div class='add'>+    GF_FREE(jnl-&gt;hist_jnl);</div><div class='add'>+    jnl-&gt;hist_jnl = NULL;</div><div class='add'>+error_return:</div><div class='add'>+    return -1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+gf_changelog_journal_fini(void *xl, char *brick, void *data)</div><div class='add'>+{</div><div class='add'>+    gf_changelog_journal_t *jnl = NULL;</div><div class='add'>+</div><div class='add'>+    jnl = data;</div><div class='add'>+</div><div class='add'>+    gf_changelog_cleanup_processor(jnl);</div><div class='add'>+</div><div class='add'>+    gf_changelog_cleanup_fds(jnl);</div><div class='add'>+    if (jnl-&gt;hist_jnl)</div><div class='add'>+        gf_changelog_cleanup_fds(jnl-&gt;hist_jnl);</div><div class='add'>+</div><div class='add'>+    GF_FREE(jnl);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void *</div><div class='add'>+gf_changelog_journal_init(void *xl, struct gf_brick_spec *brick)</div><div class='add'>+{</div><div class='add'>+    int i = 0;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    xlator_t *this = NULL;</div><div class='add'>+    struct stat buf = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    char *scratch_dir = NULL;</div><div class='add'>+    gf_changelog_journal_t *jnl = NULL;</div><div class='add'>+</div><div class='add'>+    this = xl;</div><div class='add'>+    scratch_dir = (char *)brick-&gt;ptr;</div><div class='add'>+</div><div class='add'>+    jnl = GF_CALLOC(1, sizeof(gf_changelog_journal_t),</div><div class='add'>+                    gf_changelog_mt_libgfchangelog_t);</div><div class='add'>+    if (!jnl)</div><div class='add'>+        goto error_return;</div><div class='add'>+</div><div class='add'>+    if (snprintf(jnl-&gt;jnl_brickpath, PATH_MAX, "%s", brick-&gt;brick_path) &gt;=</div><div class='add'>+        PATH_MAX)</div><div class='add'>+        goto dealloc_private;</div><div class='add'>+</div><div class='add'>+    if (sys_stat(scratch_dir, &amp;buf) &amp;&amp; errno == ENOENT) {</div><div class='add'>+        ret = mkdir_p(scratch_dir, 0600, _gf_true);</div><div class='add'>+        if (ret)</div><div class='add'>+            goto dealloc_private;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    jnl-&gt;jnl_working_dir = realpath(scratch_dir, NULL);</div><div class='add'>+    if (!jnl-&gt;jnl_working_dir)</div><div class='add'>+        goto dealloc_private;</div><div class='add'>+</div><div class='add'>+    ret = gf_changelog_open_dirs(this, jnl);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_ERROR, 0, CHANGELOG_LIB_MSG_OPENDIR_ERROR,</div><div class='add'>+               "could not create entries in scratch dir");</div><div class='add'>+        goto dealloc_private;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* RFC 3986 {de,en}coding */</div><div class='add'>+    for (i = 0; i &lt; 256; i++) {</div><div class='add'>+        jnl-&gt;rfc3986_space_newline[i] = (i == ' ' || i == '\n' || i == '%') ? 0</div><div class='add'>+                                                                            : i;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = gf_changelog_init_history(this, jnl, brick-&gt;brick_path);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto cleanup_fds;</div><div class='add'>+</div><div class='add'>+    /* initialize journal processor */</div><div class='add'>+    jnl-&gt;this = this;</div><div class='add'>+    ret = gf_changelog_init_processor(jnl);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto cleanup_fds;</div><div class='add'>+</div><div class='add'>+    JNL_SET_API_STATE(jnl, JNL_API_CONN_INPROGESS);</div><div class='add'>+    ret = pthread_spin_init(&amp;jnl-&gt;lock, 0);</div><div class='add'>+    if (ret != 0)</div><div class='add'>+        goto cleanup_processor;</div><div class='add'>+    return jnl;</div><div class='add'>+</div><div class='add'>+cleanup_processor:</div><div class='add'>+    gf_changelog_cleanup_processor(jnl);</div><div class='add'>+cleanup_fds:</div><div class='add'>+    gf_changelog_cleanup_fds(jnl);</div><div class='add'>+    if (jnl-&gt;hist_jnl)</div><div class='add'>+        gf_changelog_cleanup_fds(jnl-&gt;hist_jnl);</div><div class='add'>+dealloc_private:</div><div class='add'>+    GF_FREE(jnl);</div><div class='add'>+error_return:</div><div class='add'>+    return NULL;</div><div class='add'>+}</div><div class='head'>diff --git a/xlators/features/changelog/lib/src/gf-changelog-journal.h b/xlators/features/changelog/lib/src/gf-changelog-journal.h<br/>new file mode 100644<br/>index 00000000000..ba5b9bf827e<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/xlators/features/changelog/lib/src/gf-changelog-journal.h?id=d1d7a6f35c816822fab51c820e25023863c239c1'>xlators/features/changelog/lib/src/gf-changelog-journal.h</a></div><div class='hunk'>@@ -0,0 +1,116 @@</div><div class='add'>+/*</div><div class='add'>+   Copyright (c) 2015 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+   This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+   This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+   General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+   later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+   cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#ifndef __GF_CHANGELOG_JOURNAL_H</div><div class='add'>+#define __GF_CHANGELOG_JOURNAL_H</div><div class='add'>+</div><div class='add'>+#include &lt;unistd.h&gt;</div><div class='add'>+#include &lt;pthread.h&gt;</div><div class='add'>+</div><div class='add'>+#include "changelog.h"</div><div class='add'>+</div><div class='add'>+enum api_conn {</div><div class='add'>+    JNL_API_CONNECTED,</div><div class='add'>+    JNL_API_CONN_INPROGESS,</div><div class='add'>+    JNL_API_DISCONNECTED,</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+typedef struct gf_changelog_entry {</div><div class='add'>+    char path[PATH_MAX];</div><div class='add'>+</div><div class='add'>+    struct list_head list;</div><div class='add'>+} gf_changelog_entry_t;</div><div class='add'>+</div><div class='add'>+typedef struct gf_changelog_processor {</div><div class='add'>+    pthread_mutex_t lock; /* protects -&gt;entries */</div><div class='add'>+    pthread_cond_t cond;  /* waiter during empty list */</div><div class='add'>+    gf_boolean_t waiting;</div><div class='add'>+</div><div class='add'>+    pthread_t processor; /* thread-id of journal processing thread */</div><div class='add'>+</div><div class='add'>+    struct list_head entries;</div><div class='add'>+} gf_changelog_processor_t;</div><div class='add'>+</div><div class='add'>+typedef struct gf_changelog_journal {</div><div class='add'>+    DIR *jnl_dir; /* 'processing' directory stream */</div><div class='add'>+</div><div class='add'>+    int jnl_fd; /* fd to the tracker file */</div><div class='add'>+</div><div class='add'>+    char jnl_brickpath[PATH_MAX]; /* brick path for this end-point */</div><div class='add'>+</div><div class='add'>+    gf_changelog_processor_t *jnl_proc;</div><div class='add'>+</div><div class='add'>+    char *jnl_working_dir; /* scratch directory */</div><div class='add'>+</div><div class='add'>+    char jnl_current_dir[PATH_MAX];</div><div class='add'>+    char jnl_processed_dir[PATH_MAX];</div><div class='add'>+    char jnl_processing_dir[PATH_MAX];</div><div class='add'>+</div><div class='add'>+    char rfc3986_space_newline[256]; /* RFC 3986 string encoding */</div><div class='add'>+</div><div class='add'>+    struct gf_changelog_journal *hist_jnl;</div><div class='add'>+    int hist_done; /* holds 0 done scanning,</div><div class='add'>+                      1 keep scanning and -1 error */</div><div class='add'>+</div><div class='add'>+    pthread_spinlock_t lock;</div><div class='add'>+    int connected;</div><div class='add'>+    xlator_t *this;</div><div class='add'>+} gf_changelog_journal_t;</div><div class='add'>+</div><div class='add'>+#define JNL_SET_API_STATE(jnl, state) (jnl-&gt;connected = state)</div><div class='add'>+#define JNL_IS_API_DISCONNECTED(jnl) (jnl-&gt;connected == JNL_API_DISCONNECTED)</div><div class='add'>+</div><div class='add'>+/* History API */</div><div class='add'>+typedef struct gf_changelog_history_data {</div><div class='add'>+    int len;</div><div class='add'>+</div><div class='add'>+    int htime_fd;</div><div class='add'>+</div><div class='add'>+    /* parallelism count */</div><div class='add'>+    int n_parallel;</div><div class='add'>+</div><div class='add'>+    /* history from, to indexes */</div><div class='add'>+    unsigned long from;</div><div class='add'>+    unsigned long to;</div><div class='add'>+    xlator_t *this;</div><div class='add'>+} gf_changelog_history_data_t;</div><div class='add'>+</div><div class='add'>+typedef struct gf_changelog_consume_data {</div><div class='add'>+    /** set of inputs */</div><div class='add'>+</div><div class='add'>+    /* fd to read from */</div><div class='add'>+    int fd;</div><div class='add'>+</div><div class='add'>+    /* from @offset */</div><div class='add'>+    off_t offset;</div><div class='add'>+</div><div class='add'>+    xlator_t *this;</div><div class='add'>+</div><div class='add'>+    gf_changelog_journal_t *jnl;</div><div class='add'>+</div><div class='add'>+    /** set of outputs */</div><div class='add'>+</div><div class='add'>+    /* return value */</div><div class='add'>+    int retval;</div><div class='add'>+</div><div class='add'>+    /* journal processed */</div><div class='add'>+    char changelog[PATH_MAX];</div><div class='add'>+} gf_changelog_consume_data_t;</div><div class='add'>+</div><div class='add'>+/* event handler */</div><div class='add'>+CALLBACK gf_changelog_handle_journal;</div><div class='add'>+</div><div class='add'>+/* init, connect &amp; disconnect handler */</div><div class='add'>+INIT gf_changelog_journal_init;</div><div class='add'>+FINI gf_changelog_journal_fini;</div><div class='add'>+CONNECT gf_changelog_journal_connect;</div><div class='add'>+DISCONNECT gf_changelog_journal_disconnect;</div><div class='add'>+</div><div class='add'>+#endif</div><div class='head'>diff --git a/xlators/features/changelog/lib/src/gf-changelog-reborp.c b/xlators/features/changelog/lib/src/gf-changelog-reborp.c<br/>new file mode 100644<br/>index 00000000000..56b11cbb705<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/xlators/features/changelog/lib/src/gf-changelog-reborp.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>xlators/features/changelog/lib/src/gf-changelog-reborp.c</a></div><div class='hunk'>@@ -0,0 +1,413 @@</div><div class='add'>+/*</div><div class='add'>+   Copyright (c) 2015 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+   This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+   This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+   General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+   later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+   cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#include "changelog-misc.h"</div><div class='add'>+#include "changelog-mem-types.h"</div><div class='add'>+</div><div class='add'>+#include "gf-changelog-helpers.h"</div><div class='add'>+#include "changelog-rpc-common.h"</div><div class='add'>+#include "changelog-lib-messages.h"</div><div class='add'>+</div><div class='add'>+#include &lt;glusterfs/syscall.h&gt;</div><div class='add'>+</div><div class='add'>+/**</div><div class='add'>+ * Reverse socket: actual data transfer handler. Connection</div><div class='add'>+ * initiator is PROBER, data transfer is REBORP.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+static struct rpcsvc_program *gf_changelog_reborp_programs[];</div><div class='add'>+</div><div class='add'>+void *</div><div class='add'>+gf_changelog_connection_janitor(void *arg)</div><div class='add'>+{</div><div class='add'>+    int32_t ret = 0;</div><div class='add'>+    xlator_t *this = NULL;</div><div class='add'>+    gf_private_t *priv = NULL;</div><div class='add'>+    gf_changelog_t *entry = NULL;</div><div class='add'>+    struct gf_event *event = NULL;</div><div class='add'>+    struct gf_event_list *ev = NULL;</div><div class='add'>+    unsigned long drained = 0;</div><div class='add'>+</div><div class='add'>+    this = arg;</div><div class='add'>+    THIS = this;</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    while (1) {</div><div class='add'>+        pthread_mutex_lock(&amp;priv-&gt;lock);</div><div class='add'>+        {</div><div class='add'>+            while (list_empty(&amp;priv-&gt;cleanups))</div><div class='add'>+                pthread_cond_wait(&amp;priv-&gt;cond, &amp;priv-&gt;lock);</div><div class='add'>+</div><div class='add'>+            entry = list_first_entry(&amp;priv-&gt;cleanups, gf_changelog_t, list);</div><div class='add'>+            list_del_init(&amp;entry-&gt;list);</div><div class='add'>+        }</div><div class='add'>+        pthread_mutex_unlock(&amp;priv-&gt;lock);</div><div class='add'>+</div><div class='add'>+        drained = 0;</div><div class='add'>+        ev = &amp;entry-&gt;event;</div><div class='add'>+</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_INFO, 0,</div><div class='add'>+                CHANGELOG_LIB_MSG_CLEANING_BRICK_ENTRY_INFO, "brick=%s",</div><div class='add'>+                entry-&gt;brick, NULL);</div><div class='add'>+</div><div class='add'>+        /* 0x0: disable rpc-clnt */</div><div class='add'>+        rpc_clnt_disable(RPC_PROBER(entry));</div><div class='add'>+</div><div class='add'>+        /* 0x1: cleanup callback invoker thread */</div><div class='add'>+        ret = gf_cleanup_event(this, ev);</div><div class='add'>+        if (ret)</div><div class='add'>+            continue;</div><div class='add'>+</div><div class='add'>+        /* 0x2: drain pending events */</div><div class='add'>+        while (!list_empty(&amp;ev-&gt;events)) {</div><div class='add'>+            event = list_first_entry(&amp;ev-&gt;events, struct gf_event, list);</div><div class='add'>+            gf_smsg(this-&gt;name, GF_LOG_INFO, 0,</div><div class='add'>+                    CHANGELOG_LIB_MSG_DRAINING_EVENT_INFO, "seq=%lu",</div><div class='add'>+                    event-&gt;seq, "payload=%d", event-&gt;count, NULL);</div><div class='add'>+</div><div class='add'>+            GF_FREE(event);</div><div class='add'>+            drained++;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_INFO, 0,</div><div class='add'>+                CHANGELOG_LIB_MSG_DRAINED_EVENT_INFO, "num=%lu", drained, NULL);</div><div class='add'>+</div><div class='add'>+        /* 0x3: freeup brick entry */</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_INFO, 0,</div><div class='add'>+                CHANGELOG_LIB_MSG_FREEING_ENTRY_INFO, "entry=%p", entry, NULL);</div><div class='add'>+        LOCK_DESTROY(&amp;entry-&gt;statelock);</div><div class='add'>+        GF_FREE(entry);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return NULL;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+gf_changelog_reborp_rpcsvc_notify(rpcsvc_t *rpc, void *mydata,</div><div class='add'>+                                  rpcsvc_event_t event, void *data)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+    xlator_t *this = NULL;</div><div class='add'>+    gf_changelog_t *entry = NULL;</div><div class='add'>+</div><div class='add'>+    if (!(event == RPCSVC_EVENT_ACCEPT || event == RPCSVC_EVENT_DISCONNECT))</div><div class='add'>+        return 0;</div><div class='add'>+</div><div class='add'>+    entry = mydata;</div><div class='add'>+    this = entry-&gt;this;</div><div class='add'>+</div><div class='add'>+    switch (event) {</div><div class='add'>+        case RPCSVC_EVENT_ACCEPT:</div><div class='add'>+            ret = sys_unlink(RPC_SOCK(entry));</div><div class='add'>+            if (ret != 0)</div><div class='add'>+                gf_smsg(this-&gt;name, GF_LOG_WARNING, errno,</div><div class='add'>+                        CHANGELOG_LIB_MSG_UNLINK_FAILED, "name=reverse socket",</div><div class='add'>+                        "path=%s", RPC_SOCK(entry), NULL);</div><div class='add'>+            if (entry-&gt;connected)</div><div class='add'>+                GF_CHANGELOG_INVOKE_CBK(this, entry-&gt;connected, entry-&gt;brick,</div><div class='add'>+                                        entry-&gt;ptr);</div><div class='add'>+            break;</div><div class='add'>+        case RPCSVC_EVENT_DISCONNECT:</div><div class='add'>+            if (entry-&gt;disconnected)</div><div class='add'>+                GF_CHANGELOG_INVOKE_CBK(this, entry-&gt;disconnected, entry-&gt;brick,</div><div class='add'>+                                        entry-&gt;ptr);</div><div class='add'>+            /* passthrough */</div><div class='add'>+        default:</div><div class='add'>+            break;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+rpcsvc_t *</div><div class='add'>+gf_changelog_reborp_init_rpc_listner(xlator_t *this, char *path, char *sock,</div><div class='add'>+                                     void *cbkdata)</div><div class='add'>+{</div><div class='add'>+    CHANGELOG_MAKE_TMP_SOCKET_PATH(path, sock, UNIX_PATH_MAX);</div><div class='add'>+    return changelog_rpc_server_init(this, sock, cbkdata,</div><div class='add'>+                                     gf_changelog_reborp_rpcsvc_notify,</div><div class='add'>+                                     gf_changelog_reborp_programs);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/**</div><div class='add'>+ * This is dirty and painful as of now until there is event filtering in the</div><div class='add'>+ * server. The entire event buffer is scanned and interested events are picked,</div><div class='add'>+ * whereas we _should_ be notified with the events we were interested in</div><div class='add'>+ * (selected at the time of probe). As of now this is complete BS and needs</div><div class='add'>+ * fixture ASAP. I just made it work, it needs to be better.</div><div class='add'>+ *</div><div class='add'>+ * @FIXME: cleanup this bugger once server filters events.</div><div class='add'>+ */</div><div class='add'>+void</div><div class='add'>+gf_changelog_invoke_callback(gf_changelog_t *entry, struct iovec **vec,</div><div class='add'>+                             int payloadcnt)</div><div class='add'>+{</div><div class='add'>+    int i = 0;</div><div class='add'>+    int evsize = 0;</div><div class='add'>+    xlator_t *this = NULL;</div><div class='add'>+    changelog_event_t *event = NULL;</div><div class='add'>+</div><div class='add'>+    this = entry-&gt;this;</div><div class='add'>+</div><div class='add'>+    for (; i &lt; payloadcnt; i++) {</div><div class='add'>+        event = (changelog_event_t *)vec[i]-&gt;iov_base;</div><div class='add'>+        evsize = vec[i]-&gt;iov_len / CHANGELOG_EV_SIZE;</div><div class='add'>+</div><div class='add'>+        for (; evsize &gt; 0; evsize--, event++) {</div><div class='add'>+            if (gf_changelog_filter_check(entry, event)) {</div><div class='add'>+                GF_CHANGELOG_INVOKE_CBK(this, entry-&gt;callback, entry-&gt;brick,</div><div class='add'>+                                        entry-&gt;ptr, event);</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/**</div><div class='add'>+ * Ordered event handler is self-adaptive.. if the event sequence number</div><div class='add'>+ * is what's expected (-&gt;next_seq) there is no ordering list that's</div><div class='add'>+ * maintained. On out-of-order event notifications, event buffers are</div><div class='add'>+ * dynamically allocated and ordered.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+__is_expected_sequence(struct gf_event_list *ev, struct gf_event *event)</div><div class='add'>+{</div><div class='add'>+    return (ev-&gt;next_seq == event-&gt;seq);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+__can_process_event(struct gf_event_list *ev, struct gf_event **event)</div><div class='add'>+{</div><div class='add'>+    *event = list_first_entry(&amp;ev-&gt;events, struct gf_event, list);</div><div class='add'>+</div><div class='add'>+    if (__is_expected_sequence(ev, *event)) {</div><div class='add'>+        list_del(&amp;(*event)-&gt;list);</div><div class='add'>+        ev-&gt;next_seq++;</div><div class='add'>+        return 1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+pick_event_ordered(struct gf_event_list *ev, struct gf_event **event)</div><div class='add'>+{</div><div class='add'>+    pthread_mutex_lock(&amp;ev-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        while (list_empty(&amp;ev-&gt;events) || !__can_process_event(ev, event))</div><div class='add'>+            pthread_cond_wait(&amp;ev-&gt;cond, &amp;ev-&gt;lock);</div><div class='add'>+    }</div><div class='add'>+    pthread_mutex_unlock(&amp;ev-&gt;lock);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+pick_event_unordered(struct gf_event_list *ev, struct gf_event **event)</div><div class='add'>+{</div><div class='add'>+    pthread_mutex_lock(&amp;ev-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        while (list_empty(&amp;ev-&gt;events))</div><div class='add'>+            pthread_cond_wait(&amp;ev-&gt;cond, &amp;ev-&gt;lock);</div><div class='add'>+        *event = list_first_entry(&amp;ev-&gt;events, struct gf_event, list);</div><div class='add'>+        list_del(&amp;(*event)-&gt;list);</div><div class='add'>+    }</div><div class='add'>+    pthread_mutex_unlock(&amp;ev-&gt;lock);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void *</div><div class='add'>+gf_changelog_callback_invoker(void *arg)</div><div class='add'>+{</div><div class='add'>+    xlator_t *this = NULL;</div><div class='add'>+    gf_changelog_t *entry = NULL;</div><div class='add'>+    struct iovec *vec = NULL;</div><div class='add'>+    struct gf_event *event = NULL;</div><div class='add'>+    struct gf_event_list *ev = NULL;</div><div class='add'>+</div><div class='add'>+    ev = arg;</div><div class='add'>+    entry = ev-&gt;entry;</div><div class='add'>+    THIS = this = entry-&gt;this;</div><div class='add'>+</div><div class='add'>+    while (1) {</div><div class='add'>+        entry-&gt;pickevent(ev, &amp;event);</div><div class='add'>+</div><div class='add'>+        vec = (struct iovec *)&amp;event-&gt;iov;</div><div class='add'>+        gf_changelog_invoke_callback(entry, &amp;vec, event-&gt;count);</div><div class='add'>+</div><div class='add'>+        GF_FREE(event);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return NULL;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+orderfn(struct list_head *pos1, struct list_head *pos2)</div><div class='add'>+{</div><div class='add'>+    struct gf_event *event1 = NULL;</div><div class='add'>+    struct gf_event *event2 = NULL;</div><div class='add'>+</div><div class='add'>+    event1 = list_entry(pos1, struct gf_event, list);</div><div class='add'>+    event2 = list_entry(pos2, struct gf_event, list);</div><div class='add'>+</div><div class='add'>+    if (event1-&gt;seq &gt; event2-&gt;seq)</div><div class='add'>+        return 1;</div><div class='add'>+    return -1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+queue_ordered_event(struct gf_event_list *ev, struct gf_event *event)</div><div class='add'>+{</div><div class='add'>+    /* add event to the ordered event list and wake up listener(s) */</div><div class='add'>+    pthread_mutex_lock(&amp;ev-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        list_add_order(&amp;event-&gt;list, &amp;ev-&gt;events, orderfn);</div><div class='add'>+        if (!ev-&gt;next_seq)</div><div class='add'>+            ev-&gt;next_seq = event-&gt;seq;</div><div class='add'>+        if (ev-&gt;next_seq == event-&gt;seq)</div><div class='add'>+            pthread_cond_signal(&amp;ev-&gt;cond);</div><div class='add'>+    }</div><div class='add'>+    pthread_mutex_unlock(&amp;ev-&gt;lock);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+queue_unordered_event(struct gf_event_list *ev, struct gf_event *event)</div><div class='add'>+{</div><div class='add'>+    /* add event to the tail of the queue and wake up listener(s) */</div><div class='add'>+    pthread_mutex_lock(&amp;ev-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        list_add_tail(&amp;event-&gt;list, &amp;ev-&gt;events);</div><div class='add'>+        pthread_cond_signal(&amp;ev-&gt;cond);</div><div class='add'>+    }</div><div class='add'>+    pthread_mutex_unlock(&amp;ev-&gt;lock);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+gf_changelog_event_handler(rpcsvc_request_t *req, xlator_t *this,</div><div class='add'>+                           gf_changelog_t *entry)</div><div class='add'>+{</div><div class='add'>+    int i = 0;</div><div class='add'>+    size_t payloadlen = 0;</div><div class='add'>+    ssize_t len = 0;</div><div class='add'>+    int payloadcnt = 0;</div><div class='add'>+    changelog_event_req rpc_req = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    changelog_event_rsp rpc_rsp = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    struct iovec *vec = NULL;</div><div class='add'>+    struct gf_event *event = NULL;</div><div class='add'>+    struct gf_event_list *ev = NULL;</div><div class='add'>+</div><div class='add'>+    ev = &amp;entry-&gt;event;</div><div class='add'>+</div><div class='add'>+    len = xdr_to_generic(req-&gt;msg[0], &amp;rpc_req,</div><div class='add'>+                         (xdrproc_t)xdr_changelog_event_req);</div><div class='add'>+    if (len &lt; 0) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_ERROR, 0,</div><div class='add'>+               CHANGELOG_LIB_MSG_XDR_DECODING_FAILED, "xdr decoding failed");</div><div class='add'>+        req-&gt;rpc_err = GARBAGE_ARGS;</div><div class='add'>+        goto handle_xdr_error;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (len &lt; req-&gt;msg[0].iov_len) {</div><div class='add'>+        payloadcnt = 1;</div><div class='add'>+        payloadlen = (req-&gt;msg[0].iov_len - len);</div><div class='add'>+    }</div><div class='add'>+    for (i = 1; i &lt; req-&gt;count; i++) {</div><div class='add'>+        payloadcnt++;</div><div class='add'>+        payloadlen += req-&gt;msg[i].iov_len;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    event = GF_CALLOC(1, GF_EVENT_CALLOC_SIZE(payloadcnt, payloadlen),</div><div class='add'>+                      gf_changelog_mt_libgfchangelog_event_t);</div><div class='add'>+    if (!event)</div><div class='add'>+        goto handle_xdr_error;</div><div class='add'>+    INIT_LIST_HEAD(&amp;event-&gt;list);</div><div class='add'>+</div><div class='add'>+    payloadlen = 0;</div><div class='add'>+    event-&gt;seq = rpc_req.seq;</div><div class='add'>+    event-&gt;count = payloadcnt;</div><div class='add'>+</div><div class='add'>+    /* deep copy IO vectors */</div><div class='add'>+    vec = &amp;event-&gt;iov[0];</div><div class='add'>+    GF_EVENT_ASSIGN_IOVEC(vec, event, (req-&gt;msg[0].iov_len - len), payloadlen);</div><div class='add'>+    (void)memcpy(vec-&gt;iov_base, req-&gt;msg[0].iov_base + len, vec-&gt;iov_len);</div><div class='add'>+</div><div class='add'>+    for (i = 1; i &lt; req-&gt;count; i++) {</div><div class='add'>+        vec = &amp;event-&gt;iov[i];</div><div class='add'>+        GF_EVENT_ASSIGN_IOVEC(vec, event, req-&gt;msg[i].iov_len, payloadlen);</div><div class='add'>+        (void)memcpy(event-&gt;iov[i].iov_base, req-&gt;msg[i].iov_base,</div><div class='add'>+                     req-&gt;msg[i].iov_len);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    gf_msg_debug(this-&gt;name, 0,</div><div class='add'>+                 "seq: %" PRIu64 " [%s] (time: %" PRIu64 ".%" PRIu64</div><div class='add'>+                 "), "</div><div class='add'>+                 "(vec: %d, len: %zd)",</div><div class='add'>+                 rpc_req.seq, entry-&gt;brick, rpc_req.tv_sec, rpc_req.tv_usec,</div><div class='add'>+                 payloadcnt, payloadlen);</div><div class='add'>+</div><div class='add'>+    /* dispatch event */</div><div class='add'>+    entry-&gt;queueevent(ev, event);</div><div class='add'>+</div><div class='add'>+    /* ack sequence number */</div><div class='add'>+    rpc_rsp.op_ret = 0;</div><div class='add'>+    rpc_rsp.seq = rpc_req.seq;</div><div class='add'>+</div><div class='add'>+    goto submit_rpc;</div><div class='add'>+</div><div class='add'>+handle_xdr_error:</div><div class='add'>+    rpc_rsp.op_ret = -1;</div><div class='add'>+    rpc_rsp.seq = 0; /* invalid */</div><div class='add'>+submit_rpc:</div><div class='add'>+    return changelog_rpc_sumbit_reply(req, &amp;rpc_rsp, NULL, 0, NULL,</div><div class='add'>+                                      (xdrproc_t)xdr_changelog_event_rsp);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+gf_changelog_reborp_handle_event(rpcsvc_request_t *req)</div><div class='add'>+{</div><div class='add'>+    xlator_t *this = NULL;</div><div class='add'>+    rpcsvc_t *svc = NULL;</div><div class='add'>+    gf_changelog_t *entry = NULL;</div><div class='add'>+</div><div class='add'>+    svc = rpcsvc_request_service(req);</div><div class='add'>+    entry = svc-&gt;mydata;</div><div class='add'>+</div><div class='add'>+    this = THIS = entry-&gt;this;</div><div class='add'>+</div><div class='add'>+    return gf_changelog_event_handler(req, this, entry);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static rpcsvc_actor_t gf_changelog_reborp_actors[CHANGELOG_REV_PROC_MAX] = {</div><div class='add'>+    [CHANGELOG_REV_PROC_EVENT] = {"CHANGELOG EVENT HANDLER",</div><div class='add'>+                                  gf_changelog_reborp_handle_event, NULL,</div><div class='add'>+                                  CHANGELOG_REV_PROC_EVENT, DRC_NA, 0},</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+/**</div><div class='add'>+ * Do not use synctask as the RPC layer dereferences -&gt;mydata as THIS.</div><div class='add'>+ * In gf_changelog_setup_rpc(), @cbkdata is of type @gf_changelog_t,</div><div class='add'>+ * and that's required to invoke the callback with the appropriate</div><div class='add'>+ * brick path and it's private data.</div><div class='add'>+ */</div><div class='add'>+static struct rpcsvc_program gf_changelog_reborp_prog = {</div><div class='add'>+    .progname = "LIBGFCHANGELOG REBORP",</div><div class='add'>+    .prognum = CHANGELOG_REV_RPC_PROCNUM,</div><div class='add'>+    .progver = CHANGELOG_REV_RPC_PROCVER,</div><div class='add'>+    .numactors = CHANGELOG_REV_PROC_MAX,</div><div class='add'>+    .actors = gf_changelog_reborp_actors,</div><div class='add'>+    .synctask = _gf_false,</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+static struct rpcsvc_program *gf_changelog_reborp_programs[] = {</div><div class='add'>+    &amp;gf_changelog_reborp_prog,</div><div class='add'>+    NULL,</div><div class='add'>+};</div><div class='head'>diff --git a/xlators/features/changelog/lib/src/gf-changelog-rpc.c b/xlators/features/changelog/lib/src/gf-changelog-rpc.c<br/>new file mode 100644<br/>index 00000000000..8ec6ffbcebc<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/xlators/features/changelog/lib/src/gf-changelog-rpc.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>xlators/features/changelog/lib/src/gf-changelog-rpc.c</a></div><div class='hunk'>@@ -0,0 +1,98 @@</div><div class='add'>+/*</div><div class='add'>+   Copyright (c) 2013 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+   This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+   This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+   General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+   later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+   cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#include "gf-changelog-rpc.h"</div><div class='add'>+#include "changelog-misc.h"</div><div class='add'>+#include "changelog-mem-types.h"</div><div class='add'>+</div><div class='add'>+struct rpc_clnt_program gf_changelog_clnt;</div><div class='add'>+</div><div class='add'>+/* TODO: piggyback reconnect to called (upcall) */</div><div class='add'>+int</div><div class='add'>+gf_changelog_rpc_notify(struct rpc_clnt *rpc, void *mydata,</div><div class='add'>+                        rpc_clnt_event_t event, void *data)</div><div class='add'>+{</div><div class='add'>+    switch (event) {</div><div class='add'>+        case RPC_CLNT_CONNECT:</div><div class='add'>+            break;</div><div class='add'>+        case RPC_CLNT_DISCONNECT:</div><div class='add'>+        case RPC_CLNT_MSG:</div><div class='add'>+        case RPC_CLNT_DESTROY:</div><div class='add'>+        case RPC_CLNT_PING:</div><div class='add'>+            break;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+struct rpc_clnt *</div><div class='add'>+gf_changelog_rpc_init(xlator_t *this, gf_changelog_t *entry)</div><div class='add'>+{</div><div class='add'>+    char sockfile[UNIX_PATH_MAX] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    CHANGELOG_MAKE_SOCKET_PATH(entry-&gt;brick, sockfile, UNIX_PATH_MAX);</div><div class='add'>+    return changelog_rpc_client_init(this, entry, sockfile,</div><div class='add'>+                                     gf_changelog_rpc_notify);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/**</div><div class='add'>+ * remote procedure calls declarations.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+gf_probe_changelog_cbk(struct rpc_req *req, struct iovec *iovec, int count,</div><div class='add'>+                       void *myframe)</div><div class='add'>+{</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+gf_probe_changelog_filter(call_frame_t *frame, xlator_t *this, void *data)</div><div class='add'>+{</div><div class='add'>+    char *sock = NULL;</div><div class='add'>+    gf_changelog_t *entry = NULL;</div><div class='add'>+    changelog_probe_req req = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    entry = data;</div><div class='add'>+    sock = RPC_SOCK(entry);</div><div class='add'>+</div><div class='add'>+    (void)memcpy(&amp;req.sock, sock, strlen(sock));</div><div class='add'>+    req.filter = entry-&gt;notify;</div><div class='add'>+</div><div class='add'>+    /* invoke RPC */</div><div class='add'>+    return changelog_rpc_sumbit_req(</div><div class='add'>+        RPC_PROBER(entry), (void *)&amp;req, frame, &amp;gf_changelog_clnt,</div><div class='add'>+        CHANGELOG_RPC_PROBE_FILTER, NULL, 0, NULL, this, gf_probe_changelog_cbk,</div><div class='add'>+        (xdrproc_t)xdr_changelog_probe_req);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+gf_changelog_invoke_rpc(xlator_t *this, gf_changelog_t *entry, int procidx)</div><div class='add'>+{</div><div class='add'>+    return changelog_invoke_rpc(this, RPC_PROBER(entry), &amp;gf_changelog_clnt,</div><div class='add'>+                                procidx, entry);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+struct rpc_clnt_procedure gf_changelog_procs[CHANGELOG_RPC_PROC_MAX] = {</div><div class='add'>+    [CHANGELOG_RPC_PROC_NULL] = {"NULL", NULL},</div><div class='add'>+    [CHANGELOG_RPC_PROBE_FILTER] = {"PROBE FILTER", gf_probe_changelog_filter},</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct rpc_clnt_program gf_changelog_clnt = {</div><div class='add'>+    .progname = "LIBGFCHANGELOG",</div><div class='add'>+    .prognum = CHANGELOG_RPC_PROGNUM,</div><div class='add'>+    .progver = CHANGELOG_RPC_PROGVER,</div><div class='add'>+    .numproc = CHANGELOG_RPC_PROC_MAX,</div><div class='add'>+    .proctable = gf_changelog_procs,</div><div class='add'>+};</div><div class='head'>diff --git a/xlators/features/changelog/lib/src/gf-changelog-rpc.h b/xlators/features/changelog/lib/src/gf-changelog-rpc.h<br/>new file mode 100644<br/>index 00000000000..5c82d6f1c08<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/xlators/features/changelog/lib/src/gf-changelog-rpc.h?id=d1d7a6f35c816822fab51c820e25023863c239c1'>xlators/features/changelog/lib/src/gf-changelog-rpc.h</a></div><div class='hunk'>@@ -0,0 +1,28 @@</div><div class='add'>+/*</div><div class='add'>+   Copyright (c) 2013 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+   This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+   This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+   General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+   later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+   cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#ifndef __GF_CHANGELOG_RPC_H</div><div class='add'>+#define __GF_CHANGELOG_RPC_H</div><div class='add'>+</div><div class='add'>+#include &lt;glusterfs/xlator.h&gt;</div><div class='add'>+</div><div class='add'>+#include "gf-changelog-helpers.h"</div><div class='add'>+#include "changelog-rpc-common.h"</div><div class='add'>+</div><div class='add'>+struct rpc_clnt *</div><div class='add'>+gf_changelog_rpc_init(xlator_t *, gf_changelog_t *);</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+gf_changelog_invoke_rpc(xlator_t *, gf_changelog_t *, int);</div><div class='add'>+</div><div class='add'>+rpcsvc_t *</div><div class='add'>+gf_changelog_reborp_init_rpc_listner(xlator_t *, char *, char *, void *);</div><div class='add'>+</div><div class='add'>+#endif</div><div class='head'>diff --git a/xlators/features/changelog/lib/src/gf-changelog.c b/xlators/features/changelog/lib/src/gf-changelog.c<br/>new file mode 100644<br/>index 00000000000..57c3d39ef76<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/xlators/features/changelog/lib/src/gf-changelog.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>xlators/features/changelog/lib/src/gf-changelog.c</a></div><div class='hunk'>@@ -0,0 +1,652 @@</div><div class='add'>+/*</div><div class='add'>+   Copyright (c) 2015 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+   This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+   This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+   General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+   later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+   cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#include &lt;errno.h&gt;</div><div class='add'>+#include &lt;dirent.h&gt;</div><div class='add'>+#include &lt;stddef.h&gt;</div><div class='add'>+#include &lt;sys/types.h&gt;</div><div class='add'>+#include &lt;sys/socket.h&gt;</div><div class='add'>+#include &lt;sys/un.h&gt;</div><div class='add'>+#include &lt;sys/time.h&gt;</div><div class='add'>+#include &lt;sys/resource.h&gt;</div><div class='add'>+</div><div class='add'>+#ifndef _GNU_SOURCE</div><div class='add'>+#define _GNU_SOURCE</div><div class='add'>+#endif</div><div class='add'>+#include &lt;string.h&gt;</div><div class='add'>+</div><div class='add'>+#include &lt;glusterfs/globals.h&gt;</div><div class='add'>+#include &lt;glusterfs/glusterfs.h&gt;</div><div class='add'>+#include &lt;glusterfs/logging.h&gt;</div><div class='add'>+#include &lt;glusterfs/defaults.h&gt;</div><div class='add'>+#include &lt;glusterfs/syncop.h&gt;</div><div class='add'>+</div><div class='add'>+#include "gf-changelog-rpc.h"</div><div class='add'>+#include "gf-changelog-helpers.h"</div><div class='add'>+</div><div class='add'>+/* from the changelog translator */</div><div class='add'>+#include "changelog-misc.h"</div><div class='add'>+#include "changelog-mem-types.h"</div><div class='add'>+#include "changelog-lib-messages.h"</div><div class='add'>+</div><div class='add'>+/**</div><div class='add'>+ * Global singleton xlator pointer for the library, initialized</div><div class='add'>+ * during library load. This should probably be hidden inside</div><div class='add'>+ * an initialized object which is an handle for the consumer.</div><div class='add'>+ *</div><div class='add'>+ * TODO: do away with the global..</div><div class='add'>+ */</div><div class='add'>+xlator_t *master = NULL;</div><div class='add'>+</div><div class='add'>+static inline gf_private_t *</div><div class='add'>+gf_changelog_alloc_priv()</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+    gf_private_t *priv = NULL;</div><div class='add'>+</div><div class='add'>+    priv = GF_CALLOC(1, sizeof(*priv), gf_changelog_mt_priv_t);</div><div class='add'>+    if (!priv)</div><div class='add'>+        goto error_return;</div><div class='add'>+    INIT_LIST_HEAD(&amp;priv-&gt;connections);</div><div class='add'>+    INIT_LIST_HEAD(&amp;priv-&gt;cleanups);</div><div class='add'>+</div><div class='add'>+    ret = pthread_mutex_init(&amp;priv-&gt;lock, NULL);</div><div class='add'>+    if (ret != 0)</div><div class='add'>+        goto free_priv;</div><div class='add'>+    ret = pthread_cond_init(&amp;priv-&gt;cond, NULL);</div><div class='add'>+    if (ret != 0)</div><div class='add'>+        goto cleanup_mutex;</div><div class='add'>+</div><div class='add'>+    priv-&gt;api = NULL;</div><div class='add'>+    return priv;</div><div class='add'>+</div><div class='add'>+cleanup_mutex:</div><div class='add'>+    (void)pthread_mutex_destroy(&amp;priv-&gt;lock);</div><div class='add'>+free_priv:</div><div class='add'>+    GF_FREE(priv);</div><div class='add'>+error_return:</div><div class='add'>+    return NULL;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#define GF_CHANGELOG_EVENT_POOL_SIZE 16384</div><div class='add'>+#define GF_CHANGELOG_EVENT_THREAD_COUNT 4</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+gf_changelog_ctx_defaults_init(glusterfs_ctx_t *ctx)</div><div class='add'>+{</div><div class='add'>+    cmd_args_t *cmd_args = NULL;</div><div class='add'>+    struct rlimit lim = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    call_pool_t *pool = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    ret = xlator_mem_acct_init(THIS, gf_changelog_mt_end);</div><div class='add'>+    if (ret != 0)</div><div class='add'>+        return -1;</div><div class='add'>+</div><div class='add'>+    ctx-&gt;process_uuid = generate_glusterfs_ctx_id();</div><div class='add'>+    if (!ctx-&gt;process_uuid)</div><div class='add'>+        return -1;</div><div class='add'>+</div><div class='add'>+    ctx-&gt;page_size = 128 * GF_UNIT_KB;</div><div class='add'>+</div><div class='add'>+    ctx-&gt;iobuf_pool = iobuf_pool_new();</div><div class='add'>+    if (!ctx-&gt;iobuf_pool)</div><div class='add'>+        goto free_pool;</div><div class='add'>+</div><div class='add'>+    ctx-&gt;event_pool = gf_event_pool_new(GF_CHANGELOG_EVENT_POOL_SIZE,</div><div class='add'>+                                        GF_CHANGELOG_EVENT_THREAD_COUNT);</div><div class='add'>+    if (!ctx-&gt;event_pool)</div><div class='add'>+        goto free_pool;</div><div class='add'>+</div><div class='add'>+    pool = GF_CALLOC(1, sizeof(call_pool_t),</div><div class='add'>+                     gf_changelog_mt_libgfchangelog_call_pool_t);</div><div class='add'>+    if (!pool)</div><div class='add'>+        goto free_pool;</div><div class='add'>+</div><div class='add'>+    /* frame_mem_pool size 112 * 64 */</div><div class='add'>+    pool-&gt;frame_mem_pool = mem_pool_new(call_frame_t, 32);</div><div class='add'>+    if (!pool-&gt;frame_mem_pool)</div><div class='add'>+        goto free_pool;</div><div class='add'>+</div><div class='add'>+    /* stack_mem_pool size 256 * 128 */</div><div class='add'>+    pool-&gt;stack_mem_pool = mem_pool_new(call_stack_t, 16);</div><div class='add'>+</div><div class='add'>+    if (!pool-&gt;stack_mem_pool)</div><div class='add'>+        goto free_pool;</div><div class='add'>+</div><div class='add'>+    ctx-&gt;stub_mem_pool = mem_pool_new(call_stub_t, 16);</div><div class='add'>+    if (!ctx-&gt;stub_mem_pool)</div><div class='add'>+        goto free_pool;</div><div class='add'>+</div><div class='add'>+    ctx-&gt;dict_pool = mem_pool_new(dict_t, 32);</div><div class='add'>+    if (!ctx-&gt;dict_pool)</div><div class='add'>+        goto free_pool;</div><div class='add'>+</div><div class='add'>+    ctx-&gt;dict_pair_pool = mem_pool_new(data_pair_t, 512);</div><div class='add'>+    if (!ctx-&gt;dict_pair_pool)</div><div class='add'>+        goto free_pool;</div><div class='add'>+</div><div class='add'>+    ctx-&gt;dict_data_pool = mem_pool_new(data_t, 512);</div><div class='add'>+    if (!ctx-&gt;dict_data_pool)</div><div class='add'>+        goto free_pool;</div><div class='add'>+</div><div class='add'>+    ctx-&gt;logbuf_pool = mem_pool_new(log_buf_t, 256);</div><div class='add'>+    if (!ctx-&gt;logbuf_pool)</div><div class='add'>+        goto free_pool;</div><div class='add'>+</div><div class='add'>+    INIT_LIST_HEAD(&amp;pool-&gt;all_frames);</div><div class='add'>+    LOCK_INIT(&amp;pool-&gt;lock);</div><div class='add'>+    ctx-&gt;pool = pool;</div><div class='add'>+</div><div class='add'>+    LOCK_INIT(&amp;ctx-&gt;lock);</div><div class='add'>+</div><div class='add'>+    cmd_args = &amp;ctx-&gt;cmd_args;</div><div class='add'>+</div><div class='add'>+    INIT_LIST_HEAD(&amp;cmd_args-&gt;xlator_options);</div><div class='add'>+</div><div class='add'>+    lim.rlim_cur = RLIM_INFINITY;</div><div class='add'>+    lim.rlim_max = RLIM_INFINITY;</div><div class='add'>+    setrlimit(RLIMIT_CORE, &amp;lim);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+</div><div class='add'>+free_pool:</div><div class='add'>+    if (pool) {</div><div class='add'>+        GF_FREE(pool-&gt;frame_mem_pool);</div><div class='add'>+</div><div class='add'>+        GF_FREE(pool-&gt;stack_mem_pool);</div><div class='add'>+</div><div class='add'>+        GF_FREE(pool);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    GF_FREE(ctx-&gt;stub_mem_pool);</div><div class='add'>+</div><div class='add'>+    GF_FREE(ctx-&gt;dict_pool);</div><div class='add'>+</div><div class='add'>+    GF_FREE(ctx-&gt;dict_pair_pool);</div><div class='add'>+</div><div class='add'>+    GF_FREE(ctx-&gt;dict_data_pool);</div><div class='add'>+</div><div class='add'>+    GF_FREE(ctx-&gt;logbuf_pool);</div><div class='add'>+</div><div class='add'>+    GF_FREE(ctx-&gt;iobuf_pool);</div><div class='add'>+</div><div class='add'>+    GF_FREE(ctx-&gt;event_pool);</div><div class='add'>+</div><div class='add'>+    return -1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* TODO: cleanup ctx defaults */</div><div class='add'>+void</div><div class='add'>+gf_changelog_cleanup_this(xlator_t *this)</div><div class='add'>+{</div><div class='add'>+    glusterfs_ctx_t *ctx = NULL;</div><div class='add'>+</div><div class='add'>+    if (!this)</div><div class='add'>+        return;</div><div class='add'>+</div><div class='add'>+    ctx = this-&gt;ctx;</div><div class='add'>+    syncenv_destroy(ctx-&gt;env);</div><div class='add'>+    free(ctx);</div><div class='add'>+</div><div class='add'>+    this-&gt;private = NULL;</div><div class='add'>+    this-&gt;ctx = NULL;</div><div class='add'>+</div><div class='add'>+    mem_pools_fini();</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+gf_changelog_init_context()</div><div class='add'>+{</div><div class='add'>+    glusterfs_ctx_t *ctx = NULL;</div><div class='add'>+</div><div class='add'>+    ctx = glusterfs_ctx_new();</div><div class='add'>+    if (!ctx)</div><div class='add'>+        goto error_return;</div><div class='add'>+</div><div class='add'>+    if (glusterfs_globals_init(ctx))</div><div class='add'>+        goto free_ctx;</div><div class='add'>+</div><div class='add'>+    THIS-&gt;ctx = ctx;</div><div class='add'>+    if (gf_changelog_ctx_defaults_init(ctx))</div><div class='add'>+        goto free_ctx;</div><div class='add'>+</div><div class='add'>+    ctx-&gt;env = syncenv_new(0, 0, 0);</div><div class='add'>+    if (!ctx-&gt;env)</div><div class='add'>+        goto free_ctx;</div><div class='add'>+    return 0;</div><div class='add'>+</div><div class='add'>+free_ctx:</div><div class='add'>+    free(ctx);</div><div class='add'>+    THIS-&gt;ctx = NULL;</div><div class='add'>+error_return:</div><div class='add'>+    return -1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+gf_changelog_init_master()</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    ret = gf_changelog_init_context();</div><div class='add'>+    mem_pools_init();</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* TODO: cleanup clnt/svc on failure */</div><div class='add'>+int</div><div class='add'>+gf_changelog_setup_rpc(xlator_t *this, gf_changelog_t *entry, int proc)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+    rpcsvc_t *svc = NULL;</div><div class='add'>+    struct rpc_clnt *rpc = NULL;</div><div class='add'>+</div><div class='add'>+    /**</div><div class='add'>+     * Initialize a connect back socket. A probe() RPC call to the server</div><div class='add'>+     * triggers a reverse connect.</div><div class='add'>+     */</div><div class='add'>+    svc = gf_changelog_reborp_init_rpc_listner(this, entry-&gt;brick,</div><div class='add'>+                                               RPC_SOCK(entry), entry);</div><div class='add'>+    if (!svc)</div><div class='add'>+        goto error_return;</div><div class='add'>+    RPC_REBORP(entry) = svc;</div><div class='add'>+</div><div class='add'>+    /* Initialize an RPC client */</div><div class='add'>+    rpc = gf_changelog_rpc_init(this, entry);</div><div class='add'>+    if (!rpc)</div><div class='add'>+        goto error_return;</div><div class='add'>+    RPC_PROBER(entry) = rpc;</div><div class='add'>+</div><div class='add'>+    /**</div><div class='add'>+     * @FIXME</div><div class='add'>+     * till we have connection state machine, let's delay the RPC call</div><div class='add'>+     * for now..</div><div class='add'>+     */</div><div class='add'>+    sleep(2);</div><div class='add'>+</div><div class='add'>+    /**</div><div class='add'>+     * Probe changelog translator for reverse connection. After a successful</div><div class='add'>+     * call, there's less use of the client and can be disconnected, but</div><div class='add'>+     * let's leave the connection active for any future RPC calls.</div><div class='add'>+     */</div><div class='add'>+    ret = gf_changelog_invoke_rpc(this, entry, proc);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_ERROR, 0, CHANGELOG_LIB_MSG_INVOKE_RPC_FAILED,</div><div class='add'>+               "Could not initiate probe RPC, bailing out!!!");</div><div class='add'>+        goto error_return;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+</div><div class='add'>+error_return:</div><div class='add'>+    return -1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+gf_cleanup_event(xlator_t *this, struct gf_event_list *ev)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    ret = gf_thread_cleanup(this, ev-&gt;invoker);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_WARNING, -ret,</div><div class='add'>+               CHANGELOG_LIB_MSG_CLEANUP_ERROR,</div><div class='add'>+               "cannot cleanup callback invoker thread."</div><div class='add'>+               " Not freeing resources");</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ev-&gt;entry = NULL;</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+gf_init_event(gf_changelog_t *entry)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+    struct gf_event_list *ev = NULL;</div><div class='add'>+</div><div class='add'>+    ev = &amp;entry-&gt;event;</div><div class='add'>+    ev-&gt;entry = entry;</div><div class='add'>+</div><div class='add'>+    ret = pthread_mutex_init(&amp;ev-&gt;lock, NULL);</div><div class='add'>+    if (ret != 0)</div><div class='add'>+        goto error_return;</div><div class='add'>+    ret = pthread_cond_init(&amp;ev-&gt;cond, NULL);</div><div class='add'>+    if (ret != 0)</div><div class='add'>+        goto cleanup_mutex;</div><div class='add'>+    INIT_LIST_HEAD(&amp;ev-&gt;events);</div><div class='add'>+</div><div class='add'>+    ev-&gt;next_seq = 0; /* bootstrap sequencing */</div><div class='add'>+</div><div class='add'>+    if (GF_NEED_ORDERED_EVENTS(entry)) {</div><div class='add'>+        entry-&gt;pickevent = pick_event_ordered;</div><div class='add'>+        entry-&gt;queueevent = queue_ordered_event;</div><div class='add'>+    } else {</div><div class='add'>+        entry-&gt;pickevent = pick_event_unordered;</div><div class='add'>+        entry-&gt;queueevent = queue_unordered_event;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = gf_thread_create(&amp;ev-&gt;invoker, NULL, gf_changelog_callback_invoker,</div><div class='add'>+                           ev, "clogcbki");</div><div class='add'>+    if (ret != 0) {</div><div class='add'>+        entry-&gt;pickevent = NULL;</div><div class='add'>+        entry-&gt;queueevent = NULL;</div><div class='add'>+        goto cleanup_cond;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+</div><div class='add'>+cleanup_cond:</div><div class='add'>+    (void)pthread_cond_destroy(&amp;ev-&gt;cond);</div><div class='add'>+cleanup_mutex:</div><div class='add'>+    (void)pthread_mutex_destroy(&amp;ev-&gt;lock);</div><div class='add'>+error_return:</div><div class='add'>+    return -1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/**</div><div class='add'>+ * TODO:</div><div class='add'>+ *  - cleanup invoker thread</div><div class='add'>+ *  - cleanup event list</div><div class='add'>+ *  - destroy rpc{-clnt, svc}</div><div class='add'>+ */</div><div class='add'>+int</div><div class='add'>+gf_cleanup_brick_connection(xlator_t *this, gf_changelog_t *entry)</div><div class='add'>+{</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+gf_cleanup_connections(xlator_t *this)</div><div class='add'>+{</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+gf_setup_brick_connection(xlator_t *this, struct gf_brick_spec *brick,</div><div class='add'>+                          gf_boolean_t ordered, void *xl)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+    gf_private_t *priv = NULL;</div><div class='add'>+    gf_changelog_t *entry = NULL;</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    if (!brick-&gt;callback || !brick-&gt;init || !brick-&gt;fini)</div><div class='add'>+        goto error_return;</div><div class='add'>+</div><div class='add'>+    entry = GF_CALLOC(1, sizeof(*entry), gf_changelog_mt_libgfchangelog_t);</div><div class='add'>+    if (!entry)</div><div class='add'>+        goto error_return;</div><div class='add'>+    INIT_LIST_HEAD(&amp;entry-&gt;list);</div><div class='add'>+</div><div class='add'>+    LOCK_INIT(&amp;entry-&gt;statelock);</div><div class='add'>+    entry-&gt;connstate = GF_CHANGELOG_CONN_STATE_PENDING;</div><div class='add'>+</div><div class='add'>+    entry-&gt;notify = brick-&gt;filter;</div><div class='add'>+    if (snprintf(entry-&gt;brick, PATH_MAX, "%s", brick-&gt;brick_path) &gt;= PATH_MAX)</div><div class='add'>+        goto free_entry;</div><div class='add'>+</div><div class='add'>+    entry-&gt;this = this;</div><div class='add'>+    entry-&gt;invokerxl = xl;</div><div class='add'>+</div><div class='add'>+    entry-&gt;ordered = ordered;</div><div class='add'>+    ret = gf_init_event(entry);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto free_entry;</div><div class='add'>+</div><div class='add'>+    entry-&gt;fini = brick-&gt;fini;</div><div class='add'>+    entry-&gt;callback = brick-&gt;callback;</div><div class='add'>+    entry-&gt;connected = brick-&gt;connected;</div><div class='add'>+    entry-&gt;disconnected = brick-&gt;disconnected;</div><div class='add'>+</div><div class='add'>+    entry-&gt;ptr = brick-&gt;init(this, brick);</div><div class='add'>+    if (!entry-&gt;ptr)</div><div class='add'>+        goto cleanup_event;</div><div class='add'>+    priv-&gt;api = entry-&gt;ptr; /* pointer to API, if required */</div><div class='add'>+</div><div class='add'>+    pthread_mutex_lock(&amp;priv-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        list_add_tail(&amp;entry-&gt;list, &amp;priv-&gt;connections);</div><div class='add'>+    }</div><div class='add'>+    pthread_mutex_unlock(&amp;priv-&gt;lock);</div><div class='add'>+</div><div class='add'>+    ret = gf_changelog_setup_rpc(this, entry, CHANGELOG_RPC_PROBE_FILTER);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto cleanup_event;</div><div class='add'>+    return 0;</div><div class='add'>+</div><div class='add'>+cleanup_event:</div><div class='add'>+    (void)gf_cleanup_event(this, &amp;entry-&gt;event);</div><div class='add'>+free_entry:</div><div class='add'>+    gf_msg_debug(this-&gt;name, 0, "freeing entry %p", entry);</div><div class='add'>+    list_del(&amp;entry-&gt;list); /* FIXME: kludge for now */</div><div class='add'>+    GF_FREE(entry);</div><div class='add'>+error_return:</div><div class='add'>+    return -1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+gf_changelog_register_brick(xlator_t *this, struct gf_brick_spec *brick,</div><div class='add'>+                            gf_boolean_t ordered, void *xl)</div><div class='add'>+{</div><div class='add'>+    return gf_setup_brick_connection(this, brick, ordered, xl);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+gf_changelog_setup_logging(xlator_t *this, char *logfile, int loglevel)</div><div class='add'>+{</div><div class='add'>+    /* passing ident as NULL means to use default ident for syslog */</div><div class='add'>+    if (gf_log_init(this-&gt;ctx, logfile, NULL))</div><div class='add'>+        return -1;</div><div class='add'>+</div><div class='add'>+    gf_log_set_loglevel(this-&gt;ctx, (loglevel == -1) ? GF_LOG_INFO : loglevel);</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+gf_changelog_set_master(xlator_t *master, void *xl)</div><div class='add'>+{</div><div class='add'>+    int32_t ret = 0;</div><div class='add'>+    xlator_t *this = NULL;</div><div class='add'>+    xlator_t *old_this = NULL;</div><div class='add'>+    gf_private_t *priv = NULL;</div><div class='add'>+</div><div class='add'>+    this = xl;</div><div class='add'>+    if (!this || !this-&gt;ctx) {</div><div class='add'>+        ret = gf_changelog_init_master();</div><div class='add'>+        if (ret)</div><div class='add'>+            return -1;</div><div class='add'>+        this = THIS;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    master-&gt;ctx = this-&gt;ctx;</div><div class='add'>+</div><div class='add'>+    INIT_LIST_HEAD(&amp;master-&gt;volume_options);</div><div class='add'>+    SAVE_THIS(THIS);</div><div class='add'>+</div><div class='add'>+    ret = xlator_mem_acct_init(THIS, gf_changelog_mt_end);</div><div class='add'>+    if (ret != 0)</div><div class='add'>+        goto restore_this;</div><div class='add'>+</div><div class='add'>+    priv = gf_changelog_alloc_priv();</div><div class='add'>+    if (!priv) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto restore_this;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (!xl) {</div><div class='add'>+        /* poller thread */</div><div class='add'>+        ret = gf_thread_create(&amp;priv-&gt;poller, NULL, changelog_rpc_poller, THIS,</div><div class='add'>+                               "clogpoll");</div><div class='add'>+        if (ret != 0) {</div><div class='add'>+            GF_FREE(priv);</div><div class='add'>+            gf_msg(master-&gt;name, GF_LOG_ERROR, 0,</div><div class='add'>+                   CHANGELOG_LIB_MSG_THREAD_CREATION_FAILED,</div><div class='add'>+                   "failed to spawn poller thread");</div><div class='add'>+            goto restore_this;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    master-&gt;private = priv;</div><div class='add'>+</div><div class='add'>+restore_this:</div><div class='add'>+    RESTORE_THIS();</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+gf_changelog_init(void *xl)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+    gf_private_t *priv = NULL;</div><div class='add'>+</div><div class='add'>+    if (master)</div><div class='add'>+        return 0;</div><div class='add'>+</div><div class='add'>+    master = calloc(1, sizeof(*master));</div><div class='add'>+    if (!master)</div><div class='add'>+        goto error_return;</div><div class='add'>+</div><div class='add'>+    master-&gt;name = strdup("gfchangelog");</div><div class='add'>+    if (!master-&gt;name)</div><div class='add'>+        goto dealloc_master;</div><div class='add'>+</div><div class='add'>+    ret = gf_changelog_set_master(master, xl);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto dealloc_name;</div><div class='add'>+</div><div class='add'>+    priv = master-&gt;private;</div><div class='add'>+    ret = gf_thread_create(&amp;priv-&gt;connectionjanitor, NULL,</div><div class='add'>+                           gf_changelog_connection_janitor, master, "clogjan");</div><div class='add'>+    if (ret != 0) {</div><div class='add'>+        /* TODO: cleanup priv, mutex (poller thread for !xl) */</div><div class='add'>+        goto dealloc_name;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+</div><div class='add'>+dealloc_name:</div><div class='add'>+    free(master-&gt;name);</div><div class='add'>+dealloc_master:</div><div class='add'>+    free(master);</div><div class='add'>+    master = NULL;</div><div class='add'>+error_return:</div><div class='add'>+    return -1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+gf_changelog_register_generic(struct gf_brick_spec *bricks, int count,</div><div class='add'>+                              int ordered, char *logfile, int lvl, void *xl)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+    xlator_t *this = NULL;</div><div class='add'>+    xlator_t *old_this = NULL;</div><div class='add'>+    struct gf_brick_spec *brick = NULL;</div><div class='add'>+    gf_boolean_t need_order = _gf_false;</div><div class='add'>+</div><div class='add'>+    SAVE_THIS(xl);</div><div class='add'>+</div><div class='add'>+    this = THIS;</div><div class='add'>+    if (!this)</div><div class='add'>+        goto error_return;</div><div class='add'>+</div><div class='add'>+    ret = gf_changelog_setup_logging(this, logfile, lvl);</div><div class='add'>+    if (ret)</div><div class='add'>+        goto error_return;</div><div class='add'>+</div><div class='add'>+    need_order = (ordered) ? _gf_true : _gf_false;</div><div class='add'>+</div><div class='add'>+    brick = bricks;</div><div class='add'>+    while (count--) {</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_INFO, 0,</div><div class='add'>+                CHANGELOG_LIB_MSG_NOTIFY_REGISTER_INFO, "brick=%s",</div><div class='add'>+                brick-&gt;brick_path, "notify_filter=%d", brick-&gt;filter, NULL);</div><div class='add'>+</div><div class='add'>+        ret = gf_changelog_register_brick(this, brick, need_order, xl);</div><div class='add'>+        if (ret != 0) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, 0,</div><div class='add'>+                   CHANGELOG_LIB_MSG_NOTIFY_REGISTER_FAILED,</div><div class='add'>+                   "Error registering with changelog xlator");</div><div class='add'>+            break;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        brick++;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (ret != 0)</div><div class='add'>+        goto cleanup_inited_bricks;</div><div class='add'>+</div><div class='add'>+    RESTORE_THIS();</div><div class='add'>+    return 0;</div><div class='add'>+</div><div class='add'>+cleanup_inited_bricks:</div><div class='add'>+    gf_cleanup_connections(this);</div><div class='add'>+error_return:</div><div class='add'>+    RESTORE_THIS();</div><div class='add'>+    return -1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/**</div><div class='add'>+ * @API</div><div class='add'>+ *  gf_changelog_register()</div><div class='add'>+ *</div><div class='add'>+ * This is _NOT_ a generic register API. It's a special API to handle</div><div class='add'>+ * updates at a journal granulality. This is used by consumers wanting</div><div class='add'>+ * to process persistent journal such as geo-replication via a set of</div><div class='add'>+ * APIs. All of this is required to maintain backward compatibility.</div><div class='add'>+ * Owner specific private data is stored in -&gt;api (in gf_private_t),</div><div class='add'>+ * which is used by APIs to access it's private data. This limits</div><div class='add'>+ * the library access to a single brick, but that's how it used to</div><div class='add'>+ * be anyway. Furthermore, this API solely _owns_ "this", therefore</div><div class='add'>+ * callers already having a notion of "this" are expected to use the</div><div class='add'>+ * newer API.</div><div class='add'>+ *</div><div class='add'>+ * Newer applications wanting to use this library need not face this</div><div class='add'>+ * limitation and reply of the much more feature rich generic register</div><div class='add'>+ * API, which is purely callback based.</div><div class='add'>+ *</div><div class='add'>+ * NOTE: @max_reconnects is not used but required for backward compat.</div><div class='add'>+ *</div><div class='add'>+ * For generic API, refer gf_changelog_register_generic().</div><div class='add'>+ */</div><div class='add'>+int</div><div class='add'>+gf_changelog_register(char *brick_path, char *scratch_dir, char *log_file,</div><div class='add'>+                      int log_level, int max_reconnects)</div><div class='add'>+{</div><div class='add'>+    struct gf_brick_spec brick = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    if (master)</div><div class='add'>+        THIS = master;</div><div class='add'>+    else</div><div class='add'>+        return -1;</div><div class='add'>+</div><div class='add'>+    brick.brick_path = brick_path;</div><div class='add'>+    brick.filter = CHANGELOG_OP_TYPE_JOURNAL;</div><div class='add'>+</div><div class='add'>+    brick.init = gf_changelog_journal_init;</div><div class='add'>+    brick.fini = gf_changelog_journal_fini;</div><div class='add'>+    brick.callback = gf_changelog_handle_journal;</div><div class='add'>+    brick.connected = gf_changelog_journal_connect;</div><div class='add'>+    brick.disconnected = gf_changelog_journal_disconnect;</div><div class='add'>+</div><div class='add'>+    brick.ptr = scratch_dir;</div><div class='add'>+</div><div class='add'>+    return gf_changelog_register_generic(&amp;brick, 1, 1, log_file, log_level,</div><div class='add'>+                                         NULL);</div><div class='add'>+}</div><div class='head'>diff --git a/xlators/features/changelog/lib/src/gf-history-changelog.c b/xlators/features/changelog/lib/src/gf-history-changelog.c<br/>new file mode 100644<br/>index 00000000000..a16219f3664<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/xlators/features/changelog/lib/src/gf-history-changelog.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>xlators/features/changelog/lib/src/gf-history-changelog.c</a></div><div class='hunk'>@@ -0,0 +1,1020 @@</div><div class='add'>+#include &lt;errno.h&gt;</div><div class='add'>+#include &lt;dirent.h&gt;</div><div class='add'>+#include &lt;stddef.h&gt;</div><div class='add'>+#include &lt;sys/types.h&gt;</div><div class='add'>+</div><div class='add'>+#ifndef _GNU_SOURCE</div><div class='add'>+#define _GNU_SOURCE</div><div class='add'>+#endif</div><div class='add'>+#include &lt;string.h&gt;</div><div class='add'>+</div><div class='add'>+#include &lt;glusterfs/globals.h&gt;</div><div class='add'>+#include &lt;glusterfs/glusterfs.h&gt;</div><div class='add'>+#include &lt;glusterfs/logging.h&gt;</div><div class='add'>+#include &lt;glusterfs/syscall.h&gt;</div><div class='add'>+</div><div class='add'>+#include "gf-changelog-helpers.h"</div><div class='add'>+#include "gf-changelog-journal.h"</div><div class='add'>+</div><div class='add'>+/* from the changelog translator */</div><div class='add'>+#include "changelog-misc.h"</div><div class='add'>+#include "changelog-lib-messages.h"</div><div class='add'>+#include "changelog-mem-types.h"</div><div class='add'>+</div><div class='add'>+/**</div><div class='add'>+ * @API</div><div class='add'>+ * gf_history_changelog_done:</div><div class='add'>+ *    Move processed history changelog file from .processing</div><div class='add'>+ *    to .processed</div><div class='add'>+ *</div><div class='add'>+ * ARGUMENTS:</div><div class='add'>+ *    file(IN): path to processed history changelog file in</div><div class='add'>+ *    .processing directory.</div><div class='add'>+ *</div><div class='add'>+ * RETURN VALUE:</div><div class='add'>+ *    0: On success.</div><div class='add'>+ *   -1: On error.</div><div class='add'>+ */</div><div class='add'>+int</div><div class='add'>+gf_history_changelog_done(char *file)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    char *buffer = NULL;</div><div class='add'>+    xlator_t *this = NULL;</div><div class='add'>+    gf_changelog_journal_t *jnl = NULL;</div><div class='add'>+    gf_changelog_journal_t *hist_jnl = NULL;</div><div class='add'>+    char to_path[PATH_MAX] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    errno = EINVAL;</div><div class='add'>+</div><div class='add'>+    this = THIS;</div><div class='add'>+    if (!this)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    jnl = (gf_changelog_journal_t *)GF_CHANGELOG_GET_API_PTR(this);</div><div class='add'>+    if (!jnl)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    hist_jnl = jnl-&gt;hist_jnl;</div><div class='add'>+    if (!hist_jnl)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    if (!file || !strlen(file))</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    /* make sure 'file' is inside -&gt;jnl_working_dir */</div><div class='add'>+    buffer = realpath(file, NULL);</div><div class='add'>+    if (!buffer)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    if (strncmp(hist_jnl-&gt;jnl_working_dir, buffer,</div><div class='add'>+                strlen(hist_jnl-&gt;jnl_working_dir)))</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    (void)snprintf(to_path, PATH_MAX, "%s%s", hist_jnl-&gt;jnl_processed_dir,</div><div class='add'>+                   basename(buffer));</div><div class='add'>+    gf_msg_debug(this-&gt;name, 0, "moving %s to processed directory", file);</div><div class='add'>+    ret = sys_rename(buffer, to_path);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_ERROR, errno,</div><div class='add'>+                CHANGELOG_LIB_MSG_RENAME_FAILED, "from=%s", file, "to=%s",</div><div class='add'>+                to_path, NULL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (buffer)</div><div class='add'>+        free(buffer); /* allocated by realpath() */</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/**</div><div class='add'>+ * @API</div><div class='add'>+ *  gf_history_changelog_start_fresh:</div><div class='add'>+ *     For a set of changelogs, start from the beginning.</div><div class='add'>+ *     It will truncates the history tracker fd.</div><div class='add'>+ *</div><div class='add'>+ *  RETURN VALUES:</div><div class='add'>+ *     0: On success.</div><div class='add'>+ *    -1: On error.</div><div class='add'>+ */</div><div class='add'>+int</div><div class='add'>+gf_history_changelog_start_fresh()</div><div class='add'>+{</div><div class='add'>+    xlator_t *this = NULL;</div><div class='add'>+    gf_changelog_journal_t *jnl = NULL;</div><div class='add'>+    gf_changelog_journal_t *hist_jnl = NULL;</div><div class='add'>+</div><div class='add'>+    this = THIS;</div><div class='add'>+    if (!this)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    errno = EINVAL;</div><div class='add'>+</div><div class='add'>+    jnl = (gf_changelog_journal_t *)GF_CHANGELOG_GET_API_PTR(this);</div><div class='add'>+    if (!jnl)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    hist_jnl = jnl-&gt;hist_jnl;</div><div class='add'>+    if (!hist_jnl)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    if (gf_ftruncate(hist_jnl-&gt;jnl_fd, 0))</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return -1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/**</div><div class='add'>+ * @API</div><div class='add'>+ *  gf_history_changelog_next_change:</div><div class='add'>+ *     Return the next history changelog file entry. Zero means all</div><div class='add'>+ *     history chanelogs are consumed.</div><div class='add'>+ *</div><div class='add'>+ *  ARGUMENTS:</div><div class='add'>+ *     bufptr(OUT): Path to unprocessed history changelog file</div><div class='add'>+ *                  from tracker file.</div><div class='add'>+ *     maxlen(IN): Usually PATH_MAX.</div><div class='add'>+ *</div><div class='add'>+ *  RETURN VALUES:</div><div class='add'>+ *     size: On success.</div><div class='add'>+ *     -1  : On error.</div><div class='add'>+ */</div><div class='add'>+ssize_t</div><div class='add'>+gf_history_changelog_next_change(char *bufptr, size_t maxlen)</div><div class='add'>+{</div><div class='add'>+    ssize_t size = -1;</div><div class='add'>+    int tracker_fd = 0;</div><div class='add'>+    xlator_t *this = NULL;</div><div class='add'>+    gf_changelog_journal_t *jnl = NULL;</div><div class='add'>+    gf_changelog_journal_t *hist_jnl = NULL;</div><div class='add'>+    char buffer[PATH_MAX] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    if (maxlen &gt; PATH_MAX) {</div><div class='add'>+        errno = ENAMETOOLONG;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    errno = EINVAL;</div><div class='add'>+</div><div class='add'>+    this = THIS;</div><div class='add'>+    if (!this)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    jnl = (gf_changelog_journal_t *)GF_CHANGELOG_GET_API_PTR(this);</div><div class='add'>+    if (!jnl)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    hist_jnl = jnl-&gt;hist_jnl;</div><div class='add'>+    if (!hist_jnl)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    tracker_fd = hist_jnl-&gt;jnl_fd;</div><div class='add'>+</div><div class='add'>+    size = gf_readline(tracker_fd, buffer, maxlen);</div><div class='add'>+    if (size &lt; 0) {</div><div class='add'>+        size = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (size == 0)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    memcpy(bufptr, buffer, size - 1);</div><div class='add'>+    bufptr[size - 1] = '\0';</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return size;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/**</div><div class='add'>+ * @API</div><div class='add'>+ *  gf_history_changelog_scan:</div><div class='add'>+ *     Scan and generate a list of change entries.</div><div class='add'>+ *     Calling this api multiple times (without calling gf_changlog_done())</div><div class='add'>+ *     would result new changelogs(s) being refreshed in the tracker file.</div><div class='add'>+ *     This call also acts as a cancellation point for the consumer.</div><div class='add'>+ *</div><div class='add'>+ *  RETURN VALUES:</div><div class='add'>+ *      +ve integer : success and keep scanning.(count of changelogs)</div><div class='add'>+ *      0           : success and done scanning.</div><div class='add'>+ *     -1           : error.</div><div class='add'>+ *</div><div class='add'>+ *  NOTE: After first 0 return call_get_next change for once more time</div><div class='add'>+ *        to empty the tracker</div><div class='add'>+ *</div><div class='add'>+ */</div><div class='add'>+ssize_t</div><div class='add'>+gf_history_changelog_scan()</div><div class='add'>+{</div><div class='add'>+    int tracker_fd = 0;</div><div class='add'>+    size_t off = 0;</div><div class='add'>+    xlator_t *this = NULL;</div><div class='add'>+    size_t nr_entries = 0;</div><div class='add'>+    gf_changelog_journal_t *jnl = NULL;</div><div class='add'>+    gf_changelog_journal_t *hist_jnl = NULL;</div><div class='add'>+    struct dirent *entry = NULL;</div><div class='add'>+    struct dirent scratch[2] = {</div><div class='add'>+        {</div><div class='add'>+            0,</div><div class='add'>+        },</div><div class='add'>+    };</div><div class='add'>+    char buffer[PATH_MAX] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    static int is_last_scan;</div><div class='add'>+</div><div class='add'>+    this = THIS;</div><div class='add'>+    if (!this)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    jnl = (gf_changelog_journal_t *)GF_CHANGELOG_GET_API_PTR(this);</div><div class='add'>+    if (!jnl)</div><div class='add'>+        goto out;</div><div class='add'>+    if (JNL_IS_API_DISCONNECTED(jnl)) {</div><div class='add'>+        errno = ENOTCONN;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    hist_jnl = jnl-&gt;hist_jnl;</div><div class='add'>+    if (!hist_jnl)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+retry:</div><div class='add'>+    if (is_last_scan == 1)</div><div class='add'>+        return 0;</div><div class='add'>+    if (hist_jnl-&gt;hist_done == 0)</div><div class='add'>+        is_last_scan = 1;</div><div class='add'>+</div><div class='add'>+    errno = EINVAL;</div><div class='add'>+    if (hist_jnl-&gt;hist_done == -1)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    tracker_fd = hist_jnl-&gt;jnl_fd;</div><div class='add'>+</div><div class='add'>+    if (gf_ftruncate(tracker_fd, 0))</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    rewinddir(hist_jnl-&gt;jnl_dir);</div><div class='add'>+</div><div class='add'>+    for (;;) {</div><div class='add'>+        errno = 0;</div><div class='add'>+        entry = sys_readdir(hist_jnl-&gt;jnl_dir, scratch);</div><div class='add'>+        if (!entry || errno != 0)</div><div class='add'>+            break;</div><div class='add'>+</div><div class='add'>+        if (strcmp(basename(entry-&gt;d_name), ".") == 0 ||</div><div class='add'>+            strcmp(basename(entry-&gt;d_name), "..") == 0)</div><div class='add'>+            continue;</div><div class='add'>+</div><div class='add'>+        nr_entries++;</div><div class='add'>+</div><div class='add'>+        GF_CHANGELOG_FILL_BUFFER(hist_jnl-&gt;jnl_processing_dir, buffer, off,</div><div class='add'>+                                 strlen(hist_jnl-&gt;jnl_processing_dir));</div><div class='add'>+        GF_CHANGELOG_FILL_BUFFER(entry-&gt;d_name, buffer, off,</div><div class='add'>+                                 strlen(entry-&gt;d_name));</div><div class='add'>+        GF_CHANGELOG_FILL_BUFFER("\n", buffer, off, 1);</div><div class='add'>+</div><div class='add'>+        if (gf_changelog_write(tracker_fd, buffer, off) != off) {</div><div class='add'>+            gf_msg(this-&gt;name, GF_LOG_ERROR, 0, CHANGELOG_LIB_MSG_WRITE_FAILED,</div><div class='add'>+                   "error writing changelog filename"</div><div class='add'>+                   " to tracker file");</div><div class='add'>+            break;</div><div class='add'>+        }</div><div class='add'>+        off = 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    gf_msg_debug(this-&gt;name, 0, "hist_done %d, is_last_scan: %d",</div><div class='add'>+                 hist_jnl-&gt;hist_done, is_last_scan);</div><div class='add'>+</div><div class='add'>+    if (!entry) {</div><div class='add'>+        if (gf_lseek(tracker_fd, 0, SEEK_SET) != -1) {</div><div class='add'>+            if (nr_entries &gt; 0)</div><div class='add'>+                return nr_entries;</div><div class='add'>+            else {</div><div class='add'>+                sleep(1);</div><div class='add'>+                goto retry;</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+out:</div><div class='add'>+    return -1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+ * Gets timestamp value at the changelog path at index.</div><div class='add'>+ * Returns 0 on success(updates given time-stamp), -1 on failure.</div><div class='add'>+ */</div><div class='add'>+int</div><div class='add'>+gf_history_get_timestamp(int fd, int index, int len, unsigned long *ts)</div><div class='add'>+{</div><div class='add'>+    xlator_t *this = NULL;</div><div class='add'>+    int n_read = -1;</div><div class='add'>+    char path_buf[PATH_MAX] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    char *iter = path_buf;</div><div class='add'>+    size_t offset = index * (len + 1);</div><div class='add'>+    unsigned long value = 0;</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    this = THIS;</div><div class='add'>+    if (!this) {</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    n_read = sys_pread(fd, path_buf, len, offset);</div><div class='add'>+    if (n_read &lt; 0) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_ERROR, errno, CHANGELOG_LIB_MSG_READ_ERROR,</div><div class='add'>+               "could not read from htime file");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    iter += len - TIMESTAMP_LENGTH;</div><div class='add'>+    sscanf(iter, "%lu", &amp;value);</div><div class='add'>+out:</div><div class='add'>+    if (ret == 0)</div><div class='add'>+        *ts = value;</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+ * Function to ensure correctness of search</div><div class='add'>+ * Checks whether @value is there next to @target_index or not</div><div class='add'>+ */</div><div class='add'>+int</div><div class='add'>+gf_history_check(int fd, int target_index, unsigned long value, int len)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+    unsigned long ts1 = 0;</div><div class='add'>+    unsigned long ts2 = 0;</div><div class='add'>+</div><div class='add'>+    if (target_index == 0) {</div><div class='add'>+        ret = gf_history_get_timestamp(fd, target_index, len, &amp;ts1);</div><div class='add'>+        if (ret == -1)</div><div class='add'>+            goto out;</div><div class='add'>+        if (value &lt;= ts1)</div><div class='add'>+            goto out;</div><div class='add'>+        else {</div><div class='add'>+            ret = -1;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = gf_history_get_timestamp(fd, target_index, len, &amp;ts1);</div><div class='add'>+    if (ret == -1)</div><div class='add'>+        goto out;</div><div class='add'>+    ret = gf_history_get_timestamp(fd, target_index - 1, len, &amp;ts2);</div><div class='add'>+    if (ret == -1)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    if ((value &lt;= ts1) &amp;&amp; (value &gt; ts2)) {</div><div class='add'>+        goto out;</div><div class='add'>+    } else</div><div class='add'>+        ret = -1;</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+ * This is a "binary search" based search function which checks neighbours</div><div class='add'>+ * for in-range availability of the value to be searched and provides the</div><div class='add'>+ * index at which the changelog file nearest to the requested timestamp(value)</div><div class='add'>+ * can be read from.</div><div class='add'>+ *</div><div class='add'>+ * Actual offset can be calculated as (index* (len+1) ).</div><div class='add'>+ * "1" is because the changelog paths are null terminated.</div><div class='add'>+ *</div><div class='add'>+ * @path        : Htime file to search in</div><div class='add'>+ * @value       : time stamp to search</div><div class='add'>+ * @from        : start index to search</div><div class='add'>+ * @to          : end index to search</div><div class='add'>+ * @len         : length of fixes length strings separated by null</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+gf_history_b_search(int fd, unsigned long value, unsigned long from,</div><div class='add'>+                    unsigned long to, int len)</div><div class='add'>+{</div><div class='add'>+    int m_index = -1;</div><div class='add'>+    unsigned long cur_value = 0;</div><div class='add'>+    unsigned long ts1 = 0;</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    m_index = (from + to) / 2;</div><div class='add'>+</div><div class='add'>+    if ((to - from) &lt;= 1) {</div><div class='add'>+        /* either one or 2 changelogs left */</div><div class='add'>+        if (to != from) {</div><div class='add'>+            /* check if value is less or greater than to</div><div class='add'>+             * return accordingly</div><div class='add'>+             */</div><div class='add'>+            ret = gf_history_get_timestamp(fd, from, len, &amp;ts1);</div><div class='add'>+            if (ret == -1)</div><div class='add'>+                goto out;</div><div class='add'>+            if (ts1 &gt;= value) {</div><div class='add'>+                /* actually compatision should be</div><div class='add'>+                 * exactly == but considering</div><div class='add'>+                 *</div><div class='add'>+                 * case of only 2 changelogs in htime file</div><div class='add'>+                 */</div><div class='add'>+                return from;</div><div class='add'>+            } else</div><div class='add'>+                return to;</div><div class='add'>+        } else</div><div class='add'>+            return to;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = gf_history_get_timestamp(fd, m_index, len, &amp;cur_value);</div><div class='add'>+    if (ret == -1)</div><div class='add'>+        goto out;</div><div class='add'>+    if (cur_value == value) {</div><div class='add'>+        return m_index;</div><div class='add'>+    } else if (value &gt; cur_value) {</div><div class='add'>+        ret = gf_history_get_timestamp(fd, m_index + 1, len, &amp;cur_value);</div><div class='add'>+        if (ret == -1)</div><div class='add'>+            goto out;</div><div class='add'>+        if (value &lt; cur_value)</div><div class='add'>+            return m_index + 1;</div><div class='add'>+        else</div><div class='add'>+            return gf_history_b_search(fd, value, m_index + 1, to, len);</div><div class='add'>+    } else {</div><div class='add'>+        if (m_index == 0) {</div><div class='add'>+            /*  we are sure that values exists</div><div class='add'>+             *  in this htime file</div><div class='add'>+             */</div><div class='add'>+            return 0;</div><div class='add'>+        } else {</div><div class='add'>+            ret = gf_history_get_timestamp(fd, m_index - 1, len, &amp;cur_value);</div><div class='add'>+            if (ret == -1)</div><div class='add'>+                goto out;</div><div class='add'>+            if (value &gt; cur_value) {</div><div class='add'>+                return m_index;</div><div class='add'>+            } else</div><div class='add'>+                return gf_history_b_search(fd, value, from, m_index - 1, len);</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+out:</div><div class='add'>+    return -1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+ * Description: Checks if the changelog path is usable or not,</div><div class='add'>+ *              which is differentiated by checking for "changelog"</div><div class='add'>+ *              in the path and not "CHANGELOG".</div><div class='add'>+ *</div><div class='add'>+ * Returns:</div><div class='add'>+ * 1 : Yes, usable ( contains "CHANGELOG" )</div><div class='add'>+ * 0 : No, Not usable ( contains, "changelog")</div><div class='add'>+ */</div><div class='add'>+int</div><div class='add'>+gf_is_changelog_usable(char *cl_path)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    const char low_c[] = "changelog";</div><div class='add'>+    char *str_ret = NULL;</div><div class='add'>+    char *bname = NULL;</div><div class='add'>+</div><div class='add'>+    bname = basename(cl_path);</div><div class='add'>+</div><div class='add'>+    str_ret = strstr(bname, low_c);</div><div class='add'>+</div><div class='add'>+    if (str_ret != NULL)</div><div class='add'>+        ret = 0;</div><div class='add'>+    else</div><div class='add'>+        ret = 1;</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void *</div><div class='add'>+gf_changelog_consume_wrap(void *data)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    ssize_t nread = 0;</div><div class='add'>+    xlator_t *this = NULL;</div><div class='add'>+    gf_changelog_consume_data_t *ccd = NULL;</div><div class='add'>+</div><div class='add'>+    ccd = (gf_changelog_consume_data_t *)data;</div><div class='add'>+    this = ccd-&gt;this;</div><div class='add'>+</div><div class='add'>+    ccd-&gt;retval = -1;</div><div class='add'>+</div><div class='add'>+    nread = sys_pread(ccd-&gt;fd, ccd-&gt;changelog, PATH_MAX - 1, ccd-&gt;offset);</div><div class='add'>+    if (nread &lt; 0) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_ERROR, errno, CHANGELOG_LIB_MSG_READ_ERROR,</div><div class='add'>+               "cannot read from history metadata file");</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* TODO: handle short reads and EOF. */</div><div class='add'>+    if (gf_is_changelog_usable(ccd-&gt;changelog) == 1) {</div><div class='add'>+        ret = gf_changelog_consume(ccd-&gt;this, ccd-&gt;jnl, ccd-&gt;changelog,</div><div class='add'>+                                   _gf_true);</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_smsg(this-&gt;name, GF_LOG_ERROR, 0, CHANGELOG_LIB_MSG_PARSE_ERROR,</div><div class='add'>+                    "name=%s", ccd-&gt;changelog, NULL);</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    ccd-&gt;retval = 0;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return NULL;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/**</div><div class='add'>+ * "gf_history_consume" is a worker function for history.</div><div class='add'>+ * parses and moves changelogs files from index "from"</div><div class='add'>+ * to index "to" in open htime file whose fd is "fd".</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+#define MAX_PARALLELS 10</div><div class='add'>+</div><div class='add'>+void *</div><div class='add'>+gf_history_consume(void *data)</div><div class='add'>+{</div><div class='add'>+    xlator_t *this = NULL;</div><div class='add'>+    gf_changelog_journal_t *jnl = NULL;</div><div class='add'>+    gf_changelog_journal_t *hist_jnl = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    int iter = 0;</div><div class='add'>+    int fd = -1;</div><div class='add'>+    int from = -1;</div><div class='add'>+    int to = -1;</div><div class='add'>+    int len = -1;</div><div class='add'>+    int n_parallel = 0;</div><div class='add'>+    int n_envoked = 0;</div><div class='add'>+    gf_boolean_t publish = _gf_true;</div><div class='add'>+    pthread_t th_id[MAX_PARALLELS] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    gf_changelog_history_data_t *hist_data = NULL;</div><div class='add'>+    gf_changelog_consume_data_t ccd[MAX_PARALLELS] = {</div><div class='add'>+        {0},</div><div class='add'>+    };</div><div class='add'>+    gf_changelog_consume_data_t *curr = NULL;</div><div class='add'>+</div><div class='add'>+    hist_data = (gf_changelog_history_data_t *)data;</div><div class='add'>+    if (hist_data == NULL) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    fd = hist_data-&gt;htime_fd;</div><div class='add'>+    from = hist_data-&gt;from;</div><div class='add'>+    to = hist_data-&gt;to;</div><div class='add'>+    len = hist_data-&gt;len;</div><div class='add'>+    n_parallel = hist_data-&gt;n_parallel;</div><div class='add'>+</div><div class='add'>+    THIS = hist_data-&gt;this;</div><div class='add'>+    this = hist_data-&gt;this;</div><div class='add'>+    if (!this) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    jnl = (gf_changelog_journal_t *)GF_CHANGELOG_GET_API_PTR(this);</div><div class='add'>+    if (!jnl) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    hist_jnl = jnl-&gt;hist_jnl;</div><div class='add'>+    if (!hist_jnl) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    while (from &lt;= to) {</div><div class='add'>+        n_envoked = 0;</div><div class='add'>+</div><div class='add'>+        for (iter = 0; (iter &lt; n_parallel) &amp;&amp; (from &lt;= to); iter++) {</div><div class='add'>+            curr = &amp;ccd[iter];</div><div class='add'>+</div><div class='add'>+            curr-&gt;this = this;</div><div class='add'>+            curr-&gt;jnl = hist_jnl;</div><div class='add'>+            curr-&gt;fd = fd;</div><div class='add'>+            curr-&gt;offset = from * (len + 1);</div><div class='add'>+</div><div class='add'>+            curr-&gt;retval = 0;</div><div class='add'>+            memset(curr-&gt;changelog, '\0', PATH_MAX);</div><div class='add'>+</div><div class='add'>+            ret = gf_thread_create(&amp;th_id[iter], NULL,</div><div class='add'>+                                   gf_changelog_consume_wrap, curr,</div><div class='add'>+                                   "clogc%03hx", (iter + 1) &amp; 0x3ff);</div><div class='add'>+            if (ret) {</div><div class='add'>+                gf_msg(this-&gt;name, GF_LOG_ERROR, ret,</div><div class='add'>+                       CHANGELOG_LIB_MSG_THREAD_CREATION_FAILED,</div><div class='add'>+                       "could not create consume-thread");</div><div class='add'>+                goto sync;</div><div class='add'>+            } else</div><div class='add'>+                n_envoked++;</div><div class='add'>+</div><div class='add'>+            from++;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+    sync:</div><div class='add'>+        for (iter = 0; iter &lt; n_envoked; iter++) {</div><div class='add'>+            ret = pthread_join(th_id[iter], NULL);</div><div class='add'>+            if (ret) {</div><div class='add'>+                publish = _gf_false;</div><div class='add'>+                gf_msg(this-&gt;name, GF_LOG_ERROR, ret,</div><div class='add'>+                       CHANGELOG_LIB_MSG_PTHREAD_JOIN_FAILED,</div><div class='add'>+                       "pthread_join() error");</div><div class='add'>+                /* try to join the rest */</div><div class='add'>+                continue;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            if (publish == _gf_false)</div><div class='add'>+                continue;</div><div class='add'>+</div><div class='add'>+            curr = &amp;ccd[iter];</div><div class='add'>+            if (ccd-&gt;retval) {</div><div class='add'>+                publish = _gf_false;</div><div class='add'>+                gf_smsg(this-&gt;name, GF_LOG_ERROR, 0,</div><div class='add'>+                        CHANGELOG_LIB_MSG_PARSE_ERROR_CEASED, NULL);</div><div class='add'>+                continue;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            ret = gf_changelog_publish(curr-&gt;this, curr-&gt;jnl, curr-&gt;changelog);</div><div class='add'>+            if (ret) {</div><div class='add'>+                publish = _gf_false;</div><div class='add'>+                gf_msg(this-&gt;name, GF_LOG_ERROR, 0,</div><div class='add'>+                       CHANGELOG_LIB_MSG_PUBLISH_ERROR,</div><div class='add'>+                       "publish error, ceased publishing...");</div><div class='add'>+            }</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* informing "parsing done". */</div><div class='add'>+    hist_jnl-&gt;hist_done = (publish == _gf_true) ? 0 : -1;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (fd != -1)</div><div class='add'>+        (void)sys_close(fd);</div><div class='add'>+    GF_FREE(hist_data);</div><div class='add'>+    return NULL;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/**</div><div class='add'>+ * @API</div><div class='add'>+ * gf_history_changelog() : Get/parse historical changelogs and get them ready</div><div class='add'>+ * for consumption.</div><div class='add'>+ *</div><div class='add'>+ * Arguments:</div><div class='add'>+ * @changelog_dir : Directory location from where history changelogs are</div><div class='add'>+ * supposed to be consumed.</div><div class='add'>+ * @start: Unix timestamp FROM where changelogs should be consumed.</div><div class='add'>+ * @end: Unix timestamp TO where changelogsshould be consumed.</div><div class='add'>+ * @n_parallel : degree of parallelism while changelog parsing.</div><div class='add'>+ * @actual_end : the end time till where changelogs are available.</div><div class='add'>+ *</div><div class='add'>+ * Return:</div><div class='add'>+ * Returns &lt;timestamp&gt; on success, the last time till where changelogs are</div><div class='add'>+ *      available.</div><div class='add'>+ * Returns -1 on failure(error).</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+/**</div><div class='add'>+ * Extract timestamp range from a historical metadata file</div><div class='add'>+ * Returns:</div><div class='add'>+ *    0 : Success ({min,max}_ts with the appropriate values)</div><div class='add'>+ *   -1 : Failure</div><div class='add'>+ *   -2 : Ignore this metadata file and process next</div><div class='add'>+ */</div><div class='add'>+int</div><div class='add'>+gf_changelog_extract_min_max(const char *dname, const char *htime_dir, int *fd,</div><div class='add'>+                             unsigned long *total, unsigned long *min_ts,</div><div class='add'>+                             unsigned long *max_ts)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    xlator_t *this = NULL;</div><div class='add'>+    char htime_file[PATH_MAX] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    struct stat stbuf = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    char *iter = NULL;</div><div class='add'>+    char x_value[30] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    this = THIS;</div><div class='add'>+</div><div class='add'>+    snprintf(htime_file, PATH_MAX, "%s/%s", htime_dir, dname);</div><div class='add'>+</div><div class='add'>+    iter = (htime_file + strlen(htime_file) - TIMESTAMP_LENGTH);</div><div class='add'>+    sscanf(iter, "%lu", min_ts);</div><div class='add'>+</div><div class='add'>+    ret = sys_stat(htime_file, &amp;stbuf);</div><div class='add'>+    if (ret) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_ERROR, errno, CHANGELOG_LIB_MSG_HTIME_ERROR,</div><div class='add'>+                "op=stat", "path=%s", htime_file, NULL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* ignore everything except regular files */</div><div class='add'>+    if (!S_ISREG(stbuf.st_mode)) {</div><div class='add'>+        ret = -2;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    *fd = open(htime_file, O_RDONLY);</div><div class='add'>+    if (*fd &lt; 0) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_ERROR, errno, CHANGELOG_LIB_MSG_HTIME_ERROR,</div><div class='add'>+                "op=open", "path=%s", htime_file, NULL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Looks good, extract max timestamp */</div><div class='add'>+    ret = sys_fgetxattr(*fd, HTIME_KEY, x_value, sizeof(x_value));</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_ERROR, errno,</div><div class='add'>+                CHANGELOG_LIB_MSG_GET_XATTR_FAILED, "path=%s", htime_file,</div><div class='add'>+                NULL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    sscanf(x_value, "%lu:%lu", max_ts, total);</div><div class='add'>+    gf_smsg(this-&gt;name, GF_LOG_INFO, 0, CHANGELOG_LIB_MSG_MIN_MAX_INFO,</div><div class='add'>+            "min=%lu", *min_ts, "max=%lu", *max_ts, "total_changelogs=%lu",</div><div class='add'>+            *total, NULL);</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* gf_history_changelog returns actual_end and spawns threads to</div><div class='add'>+ * parse historical changelogs. The return values are as follows.</div><div class='add'>+ *     0 : On success</div><div class='add'>+ *     1 : Successful, but partial historical changelogs available,</div><div class='add'>+ *         end time falls into different htime file or future time</div><div class='add'>+ *    -2 : Error, requested historical changelog not available, not</div><div class='add'>+ *         even partial</div><div class='add'>+ *    -1 : On any error</div><div class='add'>+ */</div><div class='add'>+int</div><div class='add'>+gf_history_changelog(char *changelog_dir, unsigned long start,</div><div class='add'>+                     unsigned long end, int n_parallel,</div><div class='add'>+                     unsigned long *actual_end)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+    int len = -1;</div><div class='add'>+    int fd = -1;</div><div class='add'>+    int n_read = -1;</div><div class='add'>+    unsigned long min_ts = 0;</div><div class='add'>+    unsigned long max_ts = 0;</div><div class='add'>+    unsigned long end2 = 0;</div><div class='add'>+    unsigned long ts1 = 0;</div><div class='add'>+    unsigned long ts2 = 0;</div><div class='add'>+    unsigned long to = 0;</div><div class='add'>+    unsigned long from = 0;</div><div class='add'>+    unsigned long total_changelog = 0;</div><div class='add'>+    xlator_t *this = NULL;</div><div class='add'>+    gf_changelog_journal_t *jnl = NULL;</div><div class='add'>+    gf_changelog_journal_t *hist_jnl = NULL;</div><div class='add'>+    gf_changelog_history_data_t *hist_data = NULL;</div><div class='add'>+    DIR *dirp = NULL;</div><div class='add'>+    struct dirent *entry = NULL;</div><div class='add'>+    struct dirent scratch[2] = {</div><div class='add'>+        {</div><div class='add'>+            0,</div><div class='add'>+        },</div><div class='add'>+    };</div><div class='add'>+    pthread_t consume_th = 0;</div><div class='add'>+    char htime_dir[PATH_MAX] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    char buffer[PATH_MAX] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    gf_boolean_t partial_history = _gf_false;</div><div class='add'>+</div><div class='add'>+    pthread_attr_t attr;</div><div class='add'>+</div><div class='add'>+    this = THIS;</div><div class='add'>+    if (!this) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = pthread_attr_init(&amp;attr);</div><div class='add'>+    if (ret != 0) {</div><div class='add'>+        gf_msg(this-&gt;name, GF_LOG_ERROR, errno, CHANGELOG_LIB_MSG_PTHREAD_ERROR,</div><div class='add'>+               "Pthread init failed");</div><div class='add'>+        return -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    jnl = (gf_changelog_journal_t *)GF_CHANGELOG_GET_API_PTR(this);</div><div class='add'>+    if (!jnl) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    hist_jnl = (gf_changelog_journal_t *)jnl-&gt;hist_jnl;</div><div class='add'>+    if (!hist_jnl) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    gf_smsg(this-&gt;name, GF_LOG_INFO, 0, CHANGELOG_LIB_MSG_REQUESTING_INFO,</div><div class='add'>+            "start=%lu", start, "end=%lu", end, NULL);</div><div class='add'>+</div><div class='add'>+    /* basic sanity check */</div><div class='add'>+    if (start &gt; end || n_parallel &lt;= 0) {</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_ERROR, errno, CHANGELOG_LIB_MSG_HIST_FAILED,</div><div class='add'>+                "start=%lu", start, "end=%lu", end, "thread_count=%d",</div><div class='add'>+                n_parallel, NULL);</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* cap parallelism count */</div><div class='add'>+    if (n_parallel &gt; MAX_PARALLELS)</div><div class='add'>+        n_parallel = MAX_PARALLELS;</div><div class='add'>+</div><div class='add'>+    CHANGELOG_FILL_HTIME_DIR(changelog_dir, htime_dir);</div><div class='add'>+</div><div class='add'>+    dirp = sys_opendir(htime_dir);</div><div class='add'>+    if (dirp == NULL) {</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_ERROR, errno, CHANGELOG_LIB_MSG_HTIME_ERROR,</div><div class='add'>+                "op=opendir", "path=%s", htime_dir, NULL);</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    for (;;) {</div><div class='add'>+        errno = 0;</div><div class='add'>+</div><div class='add'>+        entry = sys_readdir(dirp, scratch);</div><div class='add'>+</div><div class='add'>+        if (!entry || errno != 0) {</div><div class='add'>+            gf_smsg(this-&gt;name, GF_LOG_ERROR, errno,</div><div class='add'>+                    CHANGELOG_LIB_MSG_HIST_FAILED, "start=%lu", start,</div><div class='add'>+                    "end=%lu", end, NULL);</div><div class='add'>+            ret = -2;</div><div class='add'>+            break;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        ret = gf_changelog_extract_min_max(entry-&gt;d_name, htime_dir, &amp;fd,</div><div class='add'>+                                           &amp;total_changelog, &amp;min_ts, &amp;max_ts);</div><div class='add'>+        if (ret) {</div><div class='add'>+            if (-2 == ret)</div><div class='add'>+                continue;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        if (start &gt;= min_ts &amp;&amp; start &lt; max_ts) {</div><div class='add'>+            /**</div><div class='add'>+             * TODO: handle short reads later...</div><div class='add'>+             */</div><div class='add'>+            n_read = sys_read(fd, buffer, PATH_MAX);</div><div class='add'>+            if (n_read &lt; 0) {</div><div class='add'>+                ret = -1;</div><div class='add'>+                gf_msg(this-&gt;name, GF_LOG_ERROR, errno,</div><div class='add'>+                       CHANGELOG_LIB_MSG_READ_ERROR,</div><div class='add'>+                       "unable to read htime file");</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            len = strlen(buffer);</div><div class='add'>+</div><div class='add'>+            /**</div><div class='add'>+             * search @start in the htime file returning it's index</div><div class='add'>+             * (@from)</div><div class='add'>+             */</div><div class='add'>+            from = gf_history_b_search(fd, start, 0, total_changelog - 1, len);</div><div class='add'>+</div><div class='add'>+            /* ensuring correctness of gf_b_search */</div><div class='add'>+            if (gf_history_check(fd, from, start, len) != 0) {</div><div class='add'>+                ret = -1;</div><div class='add'>+                gf_smsg(this-&gt;name, GF_LOG_ERROR, 0,</div><div class='add'>+                        CHANGELOG_LIB_MSG_GET_TIME_ERROR, "for=start",</div><div class='add'>+                        "start=%lu", start, "idx=%lu", from, NULL);</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            end2 = (end &lt;= max_ts) ? end : max_ts;</div><div class='add'>+</div><div class='add'>+            /* Check if end falls out of same HTIME file. The end</div><div class='add'>+             * falling to a different htime file or changelog</div><div class='add'>+             * disable-enable is detected only after 20 seconds.</div><div class='add'>+             * This is required because, applications generally</div><div class='add'>+             * asks historical changelogs till current time and</div><div class='add'>+             * it is possible changelog is not rolled over yet.</div><div class='add'>+             * So, buffer time of default rollover time plus 5</div><div class='add'>+             * seconds is subtracted.  If the application requests</div><div class='add'>+             * the end time with in half a minute of changelog</div><div class='add'>+             * disable, it's not detected as changelog disable and</div><div class='add'>+             * it's application's responsibility to retry after</div><div class='add'>+             * 20 seconds before confirming it as partial history.</div><div class='add'>+             */</div><div class='add'>+            if ((end - 20) &gt; max_ts) {</div><div class='add'>+                partial_history = _gf_true;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            /**</div><div class='add'>+             * search @end2 in htime file returning it's index (@to)</div><div class='add'>+             */</div><div class='add'>+            to = gf_history_b_search(fd, end2, 0, total_changelog - 1, len);</div><div class='add'>+</div><div class='add'>+            if (gf_history_check(fd, to, end2, len) != 0) {</div><div class='add'>+                ret = -1;</div><div class='add'>+                gf_smsg(this-&gt;name, GF_LOG_ERROR, 0,</div><div class='add'>+                        CHANGELOG_LIB_MSG_GET_TIME_ERROR, "for=end",</div><div class='add'>+                        "start=%lu", end2, "idx=%lu", to, NULL);</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            ret = gf_history_get_timestamp(fd, from, len, &amp;ts1);</div><div class='add'>+            if (ret == -1)</div><div class='add'>+                goto out;</div><div class='add'>+</div><div class='add'>+            ret = gf_history_get_timestamp(fd, to, len, &amp;ts2);</div><div class='add'>+            if (ret == -1)</div><div class='add'>+                goto out;</div><div class='add'>+</div><div class='add'>+            gf_smsg(this-&gt;name, GF_LOG_INFO, 0, CHANGELOG_LIB_MSG_FINAL_INFO,</div><div class='add'>+                    "from=%lu", ts1, "to=%lu", ts2, "changes=%lu",</div><div class='add'>+                    (to - from + 1), NULL);</div><div class='add'>+</div><div class='add'>+            hist_data = GF_CALLOC(1, sizeof(gf_changelog_history_data_t),</div><div class='add'>+                                  gf_changelog_mt_history_data_t);</div><div class='add'>+</div><div class='add'>+            hist_data-&gt;htime_fd = fd;</div><div class='add'>+            hist_data-&gt;from = from;</div><div class='add'>+            hist_data-&gt;to = to;</div><div class='add'>+            hist_data-&gt;len = len;</div><div class='add'>+            hist_data-&gt;n_parallel = n_parallel;</div><div class='add'>+            hist_data-&gt;this = this;</div><div class='add'>+</div><div class='add'>+            ret = pthread_attr_setdetachstate(&amp;attr, PTHREAD_CREATE_DETACHED);</div><div class='add'>+            if (ret != 0) {</div><div class='add'>+                gf_msg(this-&gt;name, GF_LOG_ERROR, ret,</div><div class='add'>+                       CHANGELOG_LIB_MSG_PTHREAD_ERROR,</div><div class='add'>+                       "unable to sets the detach"</div><div class='add'>+                       " state attribute");</div><div class='add'>+                ret = -1;</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            /* spawn a thread for background parsing &amp; publishing */</div><div class='add'>+            ret = gf_thread_create(&amp;consume_th, &amp;attr, gf_history_consume,</div><div class='add'>+                                   hist_data, "cloghcon");</div><div class='add'>+            if (ret) {</div><div class='add'>+                gf_msg(this-&gt;name, GF_LOG_ERROR, ret,</div><div class='add'>+                       CHANGELOG_LIB_MSG_THREAD_CREATION_FAILED,</div><div class='add'>+                       "creation of consume parent-thread"</div><div class='add'>+                       " failed.");</div><div class='add'>+                ret = -1;</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            goto out;</div><div class='add'>+</div><div class='add'>+        } else { /* end of range check */</div><div class='add'>+            gf_smsg(this-&gt;name, GF_LOG_ERROR, errno,</div><div class='add'>+                    CHANGELOG_LIB_MSG_HIST_FAILED, "start=%lu", start,</div><div class='add'>+                    "end=%lu", end, "chlog_min=%lu", min_ts, "chlog_max=%lu",</div><div class='add'>+                    max_ts, NULL);</div><div class='add'>+        }</div><div class='add'>+    } /* end of readdir() */</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (dirp != NULL)</div><div class='add'>+        (void)sys_closedir(dirp);</div><div class='add'>+</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        if (fd != -1)</div><div class='add'>+            (void)sys_close(fd);</div><div class='add'>+        GF_FREE(hist_data);</div><div class='add'>+        (void)pthread_attr_destroy(&amp;attr);</div><div class='add'>+</div><div class='add'>+        return ret;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    hist_jnl-&gt;hist_done = 1;</div><div class='add'>+    *actual_end = ts2;</div><div class='add'>+</div><div class='add'>+    if (partial_history) {</div><div class='add'>+        ret = 1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='head'>diff --git a/xlators/features/changelog/src/Makefile.am b/xlators/features/changelog/src/Makefile.am<br/>new file mode 100644<br/>index 00000000000..eee7dfa238d<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/xlators/features/changelog/src/Makefile.am?id=d1d7a6f35c816822fab51c820e25023863c239c1'>xlators/features/changelog/src/Makefile.am</a></div><div class='hunk'>@@ -0,0 +1,29 @@</div><div class='add'>+xlator_LTLIBRARIES = changelog.la</div><div class='add'>+</div><div class='add'>+xlatordir = $(libdir)/glusterfs/$(PACKAGE_VERSION)/xlator/features</div><div class='add'>+</div><div class='add'>+noinst_HEADERS = changelog-helpers.h changelog-mem-types.h changelog-rt.h \</div><div class='add'>+	changelog-rpc-common.h changelog-misc.h changelog-encoders.h \</div><div class='add'>+	changelog-rpc-common.h changelog-rpc.h changelog-ev-handle.h \</div><div class='add'>+	changelog-messages.h</div><div class='add'>+</div><div class='add'>+changelog_la_LDFLAGS = -module $(GF_XLATOR_DEFAULT_LDFLAGS)</div><div class='add'>+</div><div class='add'>+changelog_la_SOURCES = changelog.c changelog-rt.c changelog-helpers.c \</div><div class='add'>+	changelog-encoders.c changelog-rpc.c changelog-barrier.c \</div><div class='add'>+	changelog-rpc-common.c changelog-ev-handle.c</div><div class='add'>+changelog_la_LIBADD = $(top_builddir)/libglusterfs/src/libglusterfs.la \</div><div class='add'>+	$(top_builddir)/rpc/xdr/src/libgfxdr.la \</div><div class='add'>+	$(top_builddir)/rpc/rpc-lib/src/libgfrpc.la</div><div class='add'>+</div><div class='add'>+AM_CPPFLAGS = $(GF_CPPFLAGS) -I$(top_srcdir)/libglusterfs/src \</div><div class='add'>+	-I$(top_srcdir)/rpc/xdr/src -I$(top_builddir)/rpc/xdr/src \</div><div class='add'>+	-I$(top_srcdir)/rpc/rpc-lib/src \</div><div class='add'>+	-I$(top_srcdir)/rpc/rpc-transport/socket/src \</div><div class='add'>+	-I$(top_srcdir)/xlators/features/changelog/lib/src/ \</div><div class='add'>+	-fPIC -D_FILE_OFFSET_BITS=64 -D_GNU_SOURCE -D$(GF_HOST_OS) \</div><div class='add'>+	-DDATADIR=\"$(localstatedir)\"</div><div class='add'>+</div><div class='add'>+AM_CFLAGS = -Wall $(GF_CFLAGS)</div><div class='add'>+</div><div class='add'>+CLEANFILES =</div><div class='head'>diff --git a/xlators/features/changelog/src/changelog-barrier.c b/xlators/features/changelog/src/changelog-barrier.c<br/>new file mode 100644<br/>index 00000000000..0fb89ddb127<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/xlators/features/changelog/src/changelog-barrier.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>xlators/features/changelog/src/changelog-barrier.c</a></div><div class='hunk'>@@ -0,0 +1,131 @@</div><div class='add'>+/*</div><div class='add'>+     Copyright (c) 2014 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+     This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+     This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+     General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+     later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+     cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#include "changelog-helpers.h"</div><div class='add'>+#include "changelog-messages.h"</div><div class='add'>+#include &lt;glusterfs/call-stub.h&gt;</div><div class='add'>+</div><div class='add'>+/* Enqueue a stub*/</div><div class='add'>+void</div><div class='add'>+__chlog_barrier_enqueue(xlator_t *this, call_stub_t *stub)</div><div class='add'>+{</div><div class='add'>+    changelog_priv_t *priv = NULL;</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+    GF_ASSERT(priv);</div><div class='add'>+</div><div class='add'>+    list_add_tail(&amp;stub-&gt;list, &amp;priv-&gt;queue);</div><div class='add'>+    priv-&gt;queue_size++;</div><div class='add'>+</div><div class='add'>+    return;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* Dequeue a stub */</div><div class='add'>+call_stub_t *</div><div class='add'>+__chlog_barrier_dequeue(xlator_t *this, struct list_head *queue)</div><div class='add'>+{</div><div class='add'>+    call_stub_t *stub = NULL;</div><div class='add'>+    changelog_priv_t *priv = NULL;</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+    GF_ASSERT(priv);</div><div class='add'>+</div><div class='add'>+    if (list_empty(queue))</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    stub = list_entry(queue-&gt;next, call_stub_t, list);</div><div class='add'>+    list_del_init(&amp;stub-&gt;list);</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return stub;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* Dequeue all the stubs and call corresponding resume functions */</div><div class='add'>+void</div><div class='add'>+chlog_barrier_dequeue_all(xlator_t *this, struct list_head *queue)</div><div class='add'>+{</div><div class='add'>+    call_stub_t *stub = NULL;</div><div class='add'>+</div><div class='add'>+    gf_smsg(this-&gt;name, GF_LOG_INFO, 0, CHANGELOG_MSG_DEQUEUING_BARRIER_FOPS,</div><div class='add'>+            NULL);</div><div class='add'>+</div><div class='add'>+    while ((stub = __chlog_barrier_dequeue(this, queue)))</div><div class='add'>+        call_resume(stub);</div><div class='add'>+</div><div class='add'>+    gf_smsg(this-&gt;name, GF_LOG_INFO, 0,</div><div class='add'>+            CHANGELOG_MSG_DEQUEUING_BARRIER_FOPS_FINISHED, NULL);</div><div class='add'>+    return;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* Function called on changelog barrier timeout */</div><div class='add'>+void</div><div class='add'>+chlog_barrier_timeout(void *data)</div><div class='add'>+{</div><div class='add'>+    xlator_t *this = NULL;</div><div class='add'>+    changelog_priv_t *priv = NULL;</div><div class='add'>+    struct list_head queue = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    this = data;</div><div class='add'>+    THIS = this;</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    INIT_LIST_HEAD(&amp;queue);</div><div class='add'>+</div><div class='add'>+    gf_smsg(this-&gt;name, GF_LOG_ERROR, 0, CHANGELOG_MSG_BARRIER_TIMEOUT, NULL);</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;priv-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        __chlog_barrier_disable(this, &amp;queue);</div><div class='add'>+    }</div><div class='add'>+    UNLOCK(&amp;priv-&gt;lock);</div><div class='add'>+</div><div class='add'>+    chlog_barrier_dequeue_all(this, &amp;queue);</div><div class='add'>+</div><div class='add'>+    return;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* Disable changelog barrier enable flag */</div><div class='add'>+void</div><div class='add'>+__chlog_barrier_disable(xlator_t *this, struct list_head *queue)</div><div class='add'>+{</div><div class='add'>+    changelog_priv_t *priv = this-&gt;private;</div><div class='add'>+    GF_ASSERT(priv);</div><div class='add'>+</div><div class='add'>+    if (priv-&gt;timer) {</div><div class='add'>+        gf_timer_call_cancel(this-&gt;ctx, priv-&gt;timer);</div><div class='add'>+        priv-&gt;timer = NULL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    list_splice_init(&amp;priv-&gt;queue, queue);</div><div class='add'>+    priv-&gt;queue_size = 0;</div><div class='add'>+    priv-&gt;barrier_enabled = _gf_false;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* Enable chagelog barrier enable with timer */</div><div class='add'>+int</div><div class='add'>+__chlog_barrier_enable(xlator_t *this, changelog_priv_t *priv)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    priv-&gt;timer = gf_timer_call_after(this-&gt;ctx, priv-&gt;timeout,</div><div class='add'>+                                      chlog_barrier_timeout, (void *)this);</div><div class='add'>+    if (!priv-&gt;timer) {</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_CRITICAL, 0,</div><div class='add'>+                CHANGELOG_MSG_TIMEOUT_ADD_FAILED, NULL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    priv-&gt;barrier_enabled = _gf_true;</div><div class='add'>+    ret = 0;</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='head'>diff --git a/xlators/features/changelog/src/changelog-encoders.c b/xlators/features/changelog/src/changelog-encoders.c<br/>new file mode 100644<br/>index 00000000000..63754516c2e<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/xlators/features/changelog/src/changelog-encoders.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>xlators/features/changelog/src/changelog-encoders.c</a></div><div class='hunk'>@@ -0,0 +1,232 @@</div><div class='add'>+/*</div><div class='add'>+   Copyright (c) 2013 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+   This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+   This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+   General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+   later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+   cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#include "changelog-encoders.h"</div><div class='add'>+</div><div class='add'>+size_t</div><div class='add'>+entry_fn(void *data, char *buffer, gf_boolean_t encode)</div><div class='add'>+{</div><div class='add'>+    char *tmpbuf = NULL;</div><div class='add'>+    size_t bufsz = 0;</div><div class='add'>+    struct changelog_entry_fields *ce = NULL;</div><div class='add'>+</div><div class='add'>+    ce = (struct changelog_entry_fields *)data;</div><div class='add'>+</div><div class='add'>+    if (encode) {</div><div class='add'>+        tmpbuf = uuid_utoa(ce-&gt;cef_uuid);</div><div class='add'>+        CHANGELOG_FILL_BUFFER(buffer, bufsz, tmpbuf, strlen(tmpbuf));</div><div class='add'>+    } else {</div><div class='add'>+        CHANGELOG_FILL_BUFFER(buffer, bufsz, ce-&gt;cef_uuid, sizeof(uuid_t));</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    CHANGELOG_FILL_BUFFER(buffer, bufsz, "/", 1);</div><div class='add'>+    CHANGELOG_FILL_BUFFER(buffer, bufsz, ce-&gt;cef_bname, strlen(ce-&gt;cef_bname));</div><div class='add'>+    return bufsz;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+size_t</div><div class='add'>+del_entry_fn(void *data, char *buffer, gf_boolean_t encode)</div><div class='add'>+{</div><div class='add'>+    char *tmpbuf = NULL;</div><div class='add'>+    size_t bufsz = 0;</div><div class='add'>+    struct changelog_entry_fields *ce = NULL;</div><div class='add'>+</div><div class='add'>+    ce = (struct changelog_entry_fields *)data;</div><div class='add'>+</div><div class='add'>+    if (encode) {</div><div class='add'>+        tmpbuf = uuid_utoa(ce-&gt;cef_uuid);</div><div class='add'>+        CHANGELOG_FILL_BUFFER(buffer, bufsz, tmpbuf, strlen(tmpbuf));</div><div class='add'>+    } else {</div><div class='add'>+        CHANGELOG_FILL_BUFFER(buffer, bufsz, ce-&gt;cef_uuid, sizeof(uuid_t));</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    CHANGELOG_FILL_BUFFER(buffer, bufsz, "/", 1);</div><div class='add'>+    CHANGELOG_FILL_BUFFER(buffer, bufsz, ce-&gt;cef_bname, strlen(ce-&gt;cef_bname));</div><div class='add'>+    CHANGELOG_FILL_BUFFER(buffer, bufsz, "\0", 1);</div><div class='add'>+</div><div class='add'>+    if (ce-&gt;cef_path[0] == '\0') {</div><div class='add'>+        CHANGELOG_FILL_BUFFER(buffer, bufsz, "\0", 1);</div><div class='add'>+    } else {</div><div class='add'>+        CHANGELOG_FILL_BUFFER(buffer, bufsz, ce-&gt;cef_path,</div><div class='add'>+                              strlen(ce-&gt;cef_path));</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return bufsz;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+size_t</div><div class='add'>+fop_fn(void *data, char *buffer, gf_boolean_t encode)</div><div class='add'>+{</div><div class='add'>+    char buf[10] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    size_t bufsz = 0;</div><div class='add'>+    glusterfs_fop_t fop = 0;</div><div class='add'>+</div><div class='add'>+    fop = *(glusterfs_fop_t *)data;</div><div class='add'>+</div><div class='add'>+    if (encode) {</div><div class='add'>+        (void)snprintf(buf, sizeof(buf), "%d", fop);</div><div class='add'>+        CHANGELOG_FILL_BUFFER(buffer, bufsz, buf, strlen(buf));</div><div class='add'>+    } else</div><div class='add'>+        CHANGELOG_FILL_BUFFER(buffer, bufsz, &amp;fop, sizeof(fop));</div><div class='add'>+</div><div class='add'>+    return bufsz;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+size_t</div><div class='add'>+number_fn(void *data, char *buffer, gf_boolean_t encode)</div><div class='add'>+{</div><div class='add'>+    size_t bufsz = 0;</div><div class='add'>+    unsigned int nr = 0;</div><div class='add'>+    char buf[20] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    nr = *(unsigned int *)data;</div><div class='add'>+</div><div class='add'>+    if (encode) {</div><div class='add'>+        (void)snprintf(buf, sizeof(buf), "%u", nr);</div><div class='add'>+        CHANGELOG_FILL_BUFFER(buffer, bufsz, buf, strlen(buf));</div><div class='add'>+    } else</div><div class='add'>+        CHANGELOG_FILL_BUFFER(buffer, bufsz, &amp;nr, sizeof(unsigned int));</div><div class='add'>+</div><div class='add'>+    return bufsz;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+entry_free_fn(void *data)</div><div class='add'>+{</div><div class='add'>+    changelog_opt_t *co = data;</div><div class='add'>+</div><div class='add'>+    if (!co)</div><div class='add'>+        return;</div><div class='add'>+</div><div class='add'>+    GF_FREE(co-&gt;co_entry.cef_bname);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+del_entry_free_fn(void *data)</div><div class='add'>+{</div><div class='add'>+    changelog_opt_t *co = data;</div><div class='add'>+</div><div class='add'>+    if (!co)</div><div class='add'>+        return;</div><div class='add'>+</div><div class='add'>+    GF_FREE(co-&gt;co_entry.cef_bname);</div><div class='add'>+    GF_FREE(co-&gt;co_entry.cef_path);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/**</div><div class='add'>+ * try to write all data in one shot</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+changelog_encode_write_xtra(changelog_log_data_t *cld, char *buffer,</div><div class='add'>+                            size_t *off, gf_boolean_t encode)</div><div class='add'>+{</div><div class='add'>+    int i = 0;</div><div class='add'>+    size_t offset = 0;</div><div class='add'>+    void *data = NULL;</div><div class='add'>+    changelog_opt_t *co = NULL;</div><div class='add'>+</div><div class='add'>+    offset = *off;</div><div class='add'>+</div><div class='add'>+    co = (changelog_opt_t *)cld-&gt;cld_ptr;</div><div class='add'>+</div><div class='add'>+    for (; i &lt; cld-&gt;cld_xtra_records; i++, co++) {</div><div class='add'>+        CHANGELOG_FILL_BUFFER(buffer, offset, "\0", 1);</div><div class='add'>+</div><div class='add'>+        switch (co-&gt;co_type) {</div><div class='add'>+            case CHANGELOG_OPT_REC_FOP:</div><div class='add'>+                data = &amp;co-&gt;co_fop;</div><div class='add'>+                break;</div><div class='add'>+            case CHANGELOG_OPT_REC_ENTRY:</div><div class='add'>+                data = &amp;co-&gt;co_entry;</div><div class='add'>+                break;</div><div class='add'>+            case CHANGELOG_OPT_REC_UINT32:</div><div class='add'>+                data = &amp;co-&gt;co_uint32;</div><div class='add'>+                break;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        if (co-&gt;co_convert)</div><div class='add'>+            offset += co-&gt;co_convert(data, buffer + offset, encode);</div><div class='add'>+        else /* no coversion: write it out as it is */</div><div class='add'>+            CHANGELOG_FILL_BUFFER(buffer, offset, data, co-&gt;co_len);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    *off = offset;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+changelog_encode_ascii(xlator_t *this, changelog_log_data_t *cld)</div><div class='add'>+{</div><div class='add'>+    size_t off = 0;</div><div class='add'>+    size_t gfid_len = 0;</div><div class='add'>+    char *gfid_str = NULL;</div><div class='add'>+    char *buffer = NULL;</div><div class='add'>+    changelog_priv_t *priv = NULL;</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    gfid_str = uuid_utoa(cld-&gt;cld_gfid);</div><div class='add'>+    gfid_len = strlen(gfid_str);</div><div class='add'>+</div><div class='add'>+    /* extra bytes for decorations */</div><div class='add'>+    buffer = alloca(gfid_len + cld-&gt;cld_ptr_len + 10);</div><div class='add'>+    CHANGELOG_STORE_ASCII(priv, buffer, off, gfid_str, gfid_len, cld);</div><div class='add'>+</div><div class='add'>+    if (cld-&gt;cld_xtra_records)</div><div class='add'>+        changelog_encode_write_xtra(cld, buffer, &amp;off, _gf_true);</div><div class='add'>+</div><div class='add'>+    CHANGELOG_FILL_BUFFER(buffer, off, "\0", 1);</div><div class='add'>+</div><div class='add'>+    return changelog_write_change(priv, buffer, off);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+changelog_encode_binary(xlator_t *this, changelog_log_data_t *cld)</div><div class='add'>+{</div><div class='add'>+    size_t off = 0;</div><div class='add'>+    char *buffer = NULL;</div><div class='add'>+    changelog_priv_t *priv = NULL;</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    /* extra bytes for decorations */</div><div class='add'>+    buffer = alloca(sizeof(uuid_t) + cld-&gt;cld_ptr_len + 10);</div><div class='add'>+    CHANGELOG_STORE_BINARY(priv, buffer, off, cld-&gt;cld_gfid, cld);</div><div class='add'>+</div><div class='add'>+    if (cld-&gt;cld_xtra_records)</div><div class='add'>+        changelog_encode_write_xtra(cld, buffer, &amp;off, _gf_false);</div><div class='add'>+</div><div class='add'>+    CHANGELOG_FILL_BUFFER(buffer, off, "\0", 1);</div><div class='add'>+</div><div class='add'>+    return changelog_write_change(priv, buffer, off);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static struct changelog_encoder cb_encoder[] = {</div><div class='add'>+    [CHANGELOG_ENCODE_BINARY] =</div><div class='add'>+        {</div><div class='add'>+            .encoder = CHANGELOG_ENCODE_BINARY,</div><div class='add'>+            .encode = changelog_encode_binary,</div><div class='add'>+        },</div><div class='add'>+    [CHANGELOG_ENCODE_ASCII] =</div><div class='add'>+        {</div><div class='add'>+            .encoder = CHANGELOG_ENCODE_ASCII,</div><div class='add'>+            .encode = changelog_encode_ascii,</div><div class='add'>+        },</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+changelog_encode_change(changelog_priv_t *priv)</div><div class='add'>+{</div><div class='add'>+    priv-&gt;ce = &amp;cb_encoder[priv-&gt;encode_mode];</div><div class='add'>+}</div><div class='head'>diff --git a/xlators/features/changelog/src/changelog-encoders.h b/xlators/features/changelog/src/changelog-encoders.h<br/>new file mode 100644<br/>index 00000000000..26252696d56<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/xlators/features/changelog/src/changelog-encoders.h?id=d1d7a6f35c816822fab51c820e25023863c239c1'>xlators/features/changelog/src/changelog-encoders.h</a></div><div class='hunk'>@@ -0,0 +1,50 @@</div><div class='add'>+/*</div><div class='add'>+   Copyright (c) 2013 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+   This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+   This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+   General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+   later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+   cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#ifndef _CHANGELOG_ENCODERS_H</div><div class='add'>+#define _CHANGELOG_ENCODERS_H</div><div class='add'>+</div><div class='add'>+#include &lt;glusterfs/xlator.h&gt;</div><div class='add'>+#include &lt;glusterfs/defaults.h&gt;</div><div class='add'>+</div><div class='add'>+#include "changelog-helpers.h"</div><div class='add'>+</div><div class='add'>+#define CHANGELOG_STORE_ASCII(priv, buf, off, gfid, gfid_len, cld)             \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        CHANGELOG_FILL_BUFFER(buffer, off, priv-&gt;maps[cld-&gt;cld_type], 1);      \</div><div class='add'>+        CHANGELOG_FILL_BUFFER(buffer, off, gfid, gfid_len);                    \</div><div class='add'>+    } while (0)</div><div class='add'>+</div><div class='add'>+#define CHANGELOG_STORE_BINARY(priv, buf, off, gfid, cld)                      \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        CHANGELOG_FILL_BUFFER(buffer, off, priv-&gt;maps[cld-&gt;cld_type], 1);      \</div><div class='add'>+        CHANGELOG_FILL_BUFFER(buffer, off, gfid, sizeof(uuid_t));              \</div><div class='add'>+    } while (0)</div><div class='add'>+</div><div class='add'>+size_t</div><div class='add'>+entry_fn(void *data, char *buffer, gf_boolean_t encode);</div><div class='add'>+size_t</div><div class='add'>+del_entry_fn(void *data, char *buffer, gf_boolean_t encode);</div><div class='add'>+size_t</div><div class='add'>+fop_fn(void *data, char *buffer, gf_boolean_t encode);</div><div class='add'>+size_t</div><div class='add'>+number_fn(void *data, char *buffer, gf_boolean_t encode);</div><div class='add'>+void</div><div class='add'>+entry_free_fn(void *data);</div><div class='add'>+void</div><div class='add'>+del_entry_free_fn(void *data);</div><div class='add'>+int</div><div class='add'>+changelog_encode_binary(xlator_t *, changelog_log_data_t *);</div><div class='add'>+int</div><div class='add'>+changelog_encode_ascii(xlator_t *, changelog_log_data_t *);</div><div class='add'>+void</div><div class='add'>+changelog_encode_change(changelog_priv_t *);</div><div class='add'>+</div><div class='add'>+#endif /* _CHANGELOG_ENCODERS_H */</div><div class='head'>diff --git a/xlators/features/changelog/src/changelog-ev-handle.c b/xlators/features/changelog/src/changelog-ev-handle.c<br/>new file mode 100644<br/>index 00000000000..aa94459de5a<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/xlators/features/changelog/src/changelog-ev-handle.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>xlators/features/changelog/src/changelog-ev-handle.c</a></div><div class='hunk'>@@ -0,0 +1,412 @@</div><div class='add'>+/*</div><div class='add'>+   Copyright (c) 2015 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+   This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+   This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+   General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+   later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+   cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#include "changelog-ev-handle.h"</div><div class='add'>+#include "changelog-rpc-common.h"</div><div class='add'>+#include "changelog-helpers.h"</div><div class='add'>+</div><div class='add'>+struct rpc_clnt_program changelog_ev_program;</div><div class='add'>+</div><div class='add'>+#define NR_IOVEC (MAX_IOVEC - 3)</div><div class='add'>+struct ev_rpc_vec {</div><div class='add'>+    int count;</div><div class='add'>+    struct iovec vector[NR_IOVEC];</div><div class='add'>+</div><div class='add'>+    /* sequence number */</div><div class='add'>+    unsigned long seq;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct ev_rpc {</div><div class='add'>+    rbuf_list_t *rlist;</div><div class='add'>+    struct rpc_clnt *rpc;</div><div class='add'>+    struct ev_rpc_vec vec;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+/**</div><div class='add'>+ * As of now this just does the minimal (retval logging). Going further</div><div class='add'>+ * un-acknowledges sequence numbers can be retransmitted and other</div><div class='add'>+ * intelligence can be built into the server.</div><div class='add'>+ */</div><div class='add'>+int</div><div class='add'>+changelog_event_dispatch_cbk(struct rpc_req *req, struct iovec *iov, int count,</div><div class='add'>+                             void *myframe)</div><div class='add'>+{</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* dispatcher RPC */</div><div class='add'>+int</div><div class='add'>+changelog_dispatch_vec(call_frame_t *frame, xlator_t *this,</div><div class='add'>+                       struct rpc_clnt *rpc, struct ev_rpc_vec *vec)</div><div class='add'>+{</div><div class='add'>+    struct timeval tv = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    changelog_event_req req = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    (void)gettimeofday(&amp;tv, NULL);</div><div class='add'>+</div><div class='add'>+    /**</div><div class='add'>+     * Event dispatch RPC header contains a sequence number for each</div><div class='add'>+     * dispatch. This allows the receiver to order the request before</div><div class='add'>+     * processing.</div><div class='add'>+     */</div><div class='add'>+    req.seq = vec-&gt;seq;</div><div class='add'>+    req.tv_sec = tv.tv_sec;</div><div class='add'>+    req.tv_usec = tv.tv_usec;</div><div class='add'>+</div><div class='add'>+    return changelog_rpc_sumbit_req(</div><div class='add'>+        rpc, (void *)&amp;req, frame, &amp;changelog_ev_program,</div><div class='add'>+        CHANGELOG_REV_PROC_EVENT, vec-&gt;vector, vec-&gt;count, NULL, this,</div><div class='add'>+        changelog_event_dispatch_cbk, (xdrproc_t)xdr_changelog_event_req);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+changelog_event_dispatch_rpc(call_frame_t *frame, xlator_t *this, void *data)</div><div class='add'>+{</div><div class='add'>+    int idx = 0;</div><div class='add'>+    int count = 0;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    unsigned long sequence = 0;</div><div class='add'>+    rbuf_iovec_t *rvec = NULL;</div><div class='add'>+    struct ev_rpc *erpc = NULL;</div><div class='add'>+    struct rlist_iter riter = {</div><div class='add'>+        {</div><div class='add'>+            0,</div><div class='add'>+        },</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    /* dispatch NR_IOVEC IO vectors at a time. */</div><div class='add'>+</div><div class='add'>+    erpc = data;</div><div class='add'>+    sequence = erpc-&gt;rlist-&gt;seq[0];</div><div class='add'>+</div><div class='add'>+    rlist_iter_init(&amp;riter, erpc-&gt;rlist);</div><div class='add'>+</div><div class='add'>+    rvec_for_each_entry(rvec, &amp;riter)</div><div class='add'>+    {</div><div class='add'>+        idx = count % NR_IOVEC;</div><div class='add'>+        if (++count == NR_IOVEC) {</div><div class='add'>+            erpc-&gt;vec.vector[idx] = rvec-&gt;iov;</div><div class='add'>+            erpc-&gt;vec.seq = sequence++;</div><div class='add'>+            erpc-&gt;vec.count = NR_IOVEC;</div><div class='add'>+</div><div class='add'>+            ret = changelog_dispatch_vec(frame, this, erpc-&gt;rpc, &amp;erpc-&gt;vec);</div><div class='add'>+            if (ret)</div><div class='add'>+                break;</div><div class='add'>+            count = 0;</div><div class='add'>+            continue;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        erpc-&gt;vec.vector[idx] = rvec-&gt;iov;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (ret)</div><div class='add'>+        goto error_return;</div><div class='add'>+</div><div class='add'>+    idx = count % NR_IOVEC;</div><div class='add'>+    if (idx) {</div><div class='add'>+        erpc-&gt;vec.seq = sequence;</div><div class='add'>+        erpc-&gt;vec.count = idx;</div><div class='add'>+</div><div class='add'>+        ret = changelog_dispatch_vec(frame, this, erpc-&gt;rpc, &amp;erpc-&gt;vec);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+error_return:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+changelog_rpc_notify(struct rpc_clnt *rpc, void *mydata, rpc_clnt_event_t event,</div><div class='add'>+                     void *data)</div><div class='add'>+{</div><div class='add'>+    xlator_t *this = NULL;</div><div class='add'>+    changelog_rpc_clnt_t *crpc = NULL;</div><div class='add'>+    changelog_clnt_t *c_clnt = NULL;</div><div class='add'>+    changelog_priv_t *priv = NULL;</div><div class='add'>+    changelog_ev_selector_t *selection = NULL;</div><div class='add'>+    uint64_t clntcnt = 0;</div><div class='add'>+    uint64_t xprtcnt = 0;</div><div class='add'>+</div><div class='add'>+    crpc = mydata;</div><div class='add'>+    this = crpc-&gt;this;</div><div class='add'>+    c_clnt = crpc-&gt;c_clnt;</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    switch (event) {</div><div class='add'>+        case RPC_CLNT_CONNECT:</div><div class='add'>+            selection = &amp;priv-&gt;ev_selection;</div><div class='add'>+            GF_ATOMIC_INC(priv-&gt;clntcnt);</div><div class='add'>+</div><div class='add'>+            LOCK(&amp;c_clnt-&gt;wait_lock);</div><div class='add'>+            {</div><div class='add'>+                LOCK(&amp;c_clnt-&gt;active_lock);</div><div class='add'>+                {</div><div class='add'>+                    changelog_select_event(this, selection, crpc-&gt;filter);</div><div class='add'>+                    list_move_tail(&amp;crpc-&gt;list, &amp;c_clnt-&gt;active);</div><div class='add'>+                }</div><div class='add'>+                UNLOCK(&amp;c_clnt-&gt;active_lock);</div><div class='add'>+            }</div><div class='add'>+            UNLOCK(&amp;c_clnt-&gt;wait_lock);</div><div class='add'>+</div><div class='add'>+            break;</div><div class='add'>+        case RPC_CLNT_DISCONNECT:</div><div class='add'>+            rpc_clnt_disable(crpc-&gt;rpc);</div><div class='add'>+</div><div class='add'>+            /* rpc_clnt_disable doesn't unref the rpc. It just marks</div><div class='add'>+             * the rpc as disabled and cancels reconnection timer.</div><div class='add'>+             * Hence unref the rpc object to free it.</div><div class='add'>+             */</div><div class='add'>+            rpc_clnt_unref(crpc-&gt;rpc);</div><div class='add'>+</div><div class='add'>+            if (priv)</div><div class='add'>+                selection = &amp;priv-&gt;ev_selection;</div><div class='add'>+</div><div class='add'>+            LOCK(&amp;crpc-&gt;lock);</div><div class='add'>+            {</div><div class='add'>+                if (selection)</div><div class='add'>+                    changelog_deselect_event(this, selection, crpc-&gt;filter);</div><div class='add'>+                changelog_set_disconnect_flag(crpc, _gf_true);</div><div class='add'>+            }</div><div class='add'>+            UNLOCK(&amp;crpc-&gt;lock);</div><div class='add'>+            LOCK(&amp;c_clnt-&gt;active_lock);</div><div class='add'>+            {</div><div class='add'>+                list_del_init(&amp;crpc-&gt;list);</div><div class='add'>+            }</div><div class='add'>+            UNLOCK(&amp;c_clnt-&gt;active_lock);</div><div class='add'>+</div><div class='add'>+            break;</div><div class='add'>+        case RPC_CLNT_MSG:</div><div class='add'>+        case RPC_CLNT_DESTROY:</div><div class='add'>+            /* Free up mydata */</div><div class='add'>+            changelog_rpc_clnt_unref(crpc);</div><div class='add'>+            clntcnt = GF_ATOMIC_DEC(priv-&gt;clntcnt);</div><div class='add'>+            xprtcnt = GF_ATOMIC_GET(priv-&gt;xprtcnt);</div><div class='add'>+            if (this-&gt;cleanup_starting) {</div><div class='add'>+                if (!clntcnt &amp;&amp; !xprtcnt)</div><div class='add'>+                    changelog_process_cleanup_event(this);</div><div class='add'>+            }</div><div class='add'>+            break;</div><div class='add'>+        case RPC_CLNT_PING:</div><div class='add'>+            break;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void *</div><div class='add'>+changelog_ev_connector(void *data)</div><div class='add'>+{</div><div class='add'>+    xlator_t *this = NULL;</div><div class='add'>+    changelog_clnt_t *c_clnt = NULL;</div><div class='add'>+    changelog_rpc_clnt_t *crpc = NULL;</div><div class='add'>+</div><div class='add'>+    c_clnt = data;</div><div class='add'>+    this = c_clnt-&gt;this;</div><div class='add'>+</div><div class='add'>+    while (1) {</div><div class='add'>+        pthread_mutex_lock(&amp;c_clnt-&gt;pending_lock);</div><div class='add'>+        {</div><div class='add'>+            while (list_empty(&amp;c_clnt-&gt;pending))</div><div class='add'>+                pthread_cond_wait(&amp;c_clnt-&gt;pending_cond, &amp;c_clnt-&gt;pending_lock);</div><div class='add'>+            crpc = list_first_entry(&amp;c_clnt-&gt;pending, changelog_rpc_clnt_t,</div><div class='add'>+                                    list);</div><div class='add'>+            crpc-&gt;rpc = changelog_rpc_client_init(this, crpc, crpc-&gt;sock,</div><div class='add'>+                                                  changelog_rpc_notify);</div><div class='add'>+            if (!crpc-&gt;rpc) {</div><div class='add'>+                gf_smsg(this-&gt;name, GF_LOG_ERROR, 0,</div><div class='add'>+                        CHANGELOG_MSG_RPC_CONNECT_ERROR, "path=%s", crpc-&gt;sock,</div><div class='add'>+                        NULL);</div><div class='add'>+                crpc-&gt;cleanup(crpc);</div><div class='add'>+                goto mutex_unlock;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            LOCK(&amp;c_clnt-&gt;wait_lock);</div><div class='add'>+            {</div><div class='add'>+                list_move_tail(&amp;crpc-&gt;list, &amp;c_clnt-&gt;waitq);</div><div class='add'>+            }</div><div class='add'>+            UNLOCK(&amp;c_clnt-&gt;wait_lock);</div><div class='add'>+        }</div><div class='add'>+    mutex_unlock:</div><div class='add'>+        pthread_mutex_unlock(&amp;c_clnt-&gt;pending_lock);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return NULL;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+changelog_ev_cleanup_connections(xlator_t *this, changelog_clnt_t *c_clnt)</div><div class='add'>+{</div><div class='add'>+    changelog_rpc_clnt_t *crpc = NULL;</div><div class='add'>+</div><div class='add'>+    /* cleanup active connections */</div><div class='add'>+    LOCK(&amp;c_clnt-&gt;active_lock);</div><div class='add'>+    {</div><div class='add'>+        list_for_each_entry(crpc, &amp;c_clnt-&gt;active, list)</div><div class='add'>+        {</div><div class='add'>+            rpc_clnt_disable(crpc-&gt;rpc);</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    UNLOCK(&amp;c_clnt-&gt;active_lock);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/**</div><div class='add'>+ * TODO: granularize lock</div><div class='add'>+ *</div><div class='add'>+ * If we have multiple threads dispatching events, doing it this way is</div><div class='add'>+ * a performance bottleneck.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+static changelog_rpc_clnt_t *</div><div class='add'>+get_client(changelog_clnt_t *c_clnt, struct list_head **next)</div><div class='add'>+{</div><div class='add'>+    changelog_rpc_clnt_t *crpc = NULL;</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;c_clnt-&gt;active_lock);</div><div class='add'>+    {</div><div class='add'>+        if (*next == &amp;c_clnt-&gt;active)</div><div class='add'>+            goto unblock;</div><div class='add'>+        crpc = list_entry(*next, changelog_rpc_clnt_t, list);</div><div class='add'>+        /* ref rpc as DISCONNECT might unref the rpc asynchronously */</div><div class='add'>+        changelog_rpc_clnt_ref(crpc);</div><div class='add'>+        rpc_clnt_ref(crpc-&gt;rpc);</div><div class='add'>+        *next = (*next)-&gt;next;</div><div class='add'>+    }</div><div class='add'>+unblock:</div><div class='add'>+    UNLOCK(&amp;c_clnt-&gt;active_lock);</div><div class='add'>+</div><div class='add'>+    return crpc;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+put_client(changelog_clnt_t *c_clnt, changelog_rpc_clnt_t *crpc)</div><div class='add'>+{</div><div class='add'>+    LOCK(&amp;c_clnt-&gt;active_lock);</div><div class='add'>+    {</div><div class='add'>+        rpc_clnt_unref(crpc-&gt;rpc);</div><div class='add'>+        changelog_rpc_clnt_unref(crpc);</div><div class='add'>+    }</div><div class='add'>+    UNLOCK(&amp;c_clnt-&gt;active_lock);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+_dispatcher(rbuf_list_t *rlist, void *arg)</div><div class='add'>+{</div><div class='add'>+    xlator_t *this = NULL;</div><div class='add'>+    changelog_clnt_t *c_clnt = NULL;</div><div class='add'>+    changelog_rpc_clnt_t *crpc = NULL;</div><div class='add'>+    struct ev_rpc erpc = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    struct list_head *next = NULL;</div><div class='add'>+</div><div class='add'>+    c_clnt = arg;</div><div class='add'>+    this = c_clnt-&gt;this;</div><div class='add'>+</div><div class='add'>+    erpc.rlist = rlist;</div><div class='add'>+    next = c_clnt-&gt;active.next;</div><div class='add'>+</div><div class='add'>+    while (1) {</div><div class='add'>+        crpc = get_client(c_clnt, &amp;next);</div><div class='add'>+        if (!crpc)</div><div class='add'>+            break;</div><div class='add'>+        erpc.rpc = crpc-&gt;rpc;</div><div class='add'>+        (void)changelog_invoke_rpc(this, crpc-&gt;rpc, &amp;changelog_ev_program,</div><div class='add'>+                                   CHANGELOG_REV_PROC_EVENT, &amp;erpc);</div><div class='add'>+        put_client(c_clnt, crpc);</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/** this is called under rotbuff's lock */</div><div class='add'>+void</div><div class='add'>+sequencer(rbuf_list_t *rlist, void *mydata)</div><div class='add'>+{</div><div class='add'>+    unsigned long range = 0;</div><div class='add'>+    changelog_clnt_t *c_clnt = 0;</div><div class='add'>+</div><div class='add'>+    c_clnt = mydata;</div><div class='add'>+</div><div class='add'>+    range = (RLIST_ENTRY_COUNT(rlist)) / NR_IOVEC;</div><div class='add'>+    if ((RLIST_ENTRY_COUNT(rlist)) % NR_IOVEC)</div><div class='add'>+        range++;</div><div class='add'>+    RLIST_STORE_SEQ(rlist, c_clnt-&gt;sequence, range);</div><div class='add'>+</div><div class='add'>+    c_clnt-&gt;sequence += range;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void *</div><div class='add'>+changelog_ev_dispatch(void *data)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+    void *opaque = NULL;</div><div class='add'>+    xlator_t *this = NULL;</div><div class='add'>+    changelog_clnt_t *c_clnt = NULL;</div><div class='add'>+    struct timeval tv = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    c_clnt = data;</div><div class='add'>+    this = c_clnt-&gt;this;</div><div class='add'>+</div><div class='add'>+    while (1) {</div><div class='add'>+        /* TODO: change this to be pthread cond based.. later */</div><div class='add'>+</div><div class='add'>+        tv.tv_sec = 1;</div><div class='add'>+        tv.tv_usec = 0;</div><div class='add'>+        select(0, NULL, NULL, NULL, &amp;tv);</div><div class='add'>+</div><div class='add'>+        ret = rbuf_get_buffer(c_clnt-&gt;rbuf, &amp;opaque, sequencer, c_clnt);</div><div class='add'>+        if (ret != RBUF_CONSUMABLE) {</div><div class='add'>+            if (ret != RBUF_EMPTY)</div><div class='add'>+                gf_smsg(this-&gt;name, GF_LOG_WARNING, 0,</div><div class='add'>+                        CHANGELOG_MSG_BUFFER_STARVATION_ERROR,</div><div class='add'>+                        "Failed to get buffer for RPC dispatch",</div><div class='add'>+                        "rbuf_retval=%d", ret, NULL);</div><div class='add'>+            continue;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        ret = rbuf_wait_for_completion(c_clnt-&gt;rbuf, opaque, _dispatcher,</div><div class='add'>+                                       c_clnt);</div><div class='add'>+        if (ret)</div><div class='add'>+            gf_smsg(this-&gt;name, GF_LOG_WARNING, 0,</div><div class='add'>+                    CHANGELOG_MSG_PUT_BUFFER_FAILED, NULL);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return NULL;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+changelog_ev_queue_connection(changelog_clnt_t *c_clnt,</div><div class='add'>+                              changelog_rpc_clnt_t *crpc)</div><div class='add'>+{</div><div class='add'>+    pthread_mutex_lock(&amp;c_clnt-&gt;pending_lock);</div><div class='add'>+    {</div><div class='add'>+        list_add_tail(&amp;crpc-&gt;list, &amp;c_clnt-&gt;pending);</div><div class='add'>+        pthread_cond_signal(&amp;c_clnt-&gt;pending_cond);</div><div class='add'>+    }</div><div class='add'>+    pthread_mutex_unlock(&amp;c_clnt-&gt;pending_lock);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+struct rpc_clnt_procedure changelog_ev_procs[CHANGELOG_REV_PROC_MAX] = {</div><div class='add'>+    [CHANGELOG_REV_PROC_NULL] = {"NULL", NULL},</div><div class='add'>+    [CHANGELOG_REV_PROC_EVENT] = {"EVENT DISPATCH",</div><div class='add'>+                                  changelog_event_dispatch_rpc},</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct rpc_clnt_program changelog_ev_program = {</div><div class='add'>+    .progname = "CHANGELOG EVENT DISPATCHER",</div><div class='add'>+    .prognum = CHANGELOG_REV_RPC_PROCNUM,</div><div class='add'>+    .progver = CHANGELOG_REV_RPC_PROCVER,</div><div class='add'>+    .numproc = CHANGELOG_REV_PROC_MAX,</div><div class='add'>+    .proctable = changelog_ev_procs,</div><div class='add'>+};</div><div class='head'>diff --git a/xlators/features/changelog/src/changelog-ev-handle.h b/xlators/features/changelog/src/changelog-ev-handle.h<br/>new file mode 100644<br/>index 00000000000..cc1af58a276<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/xlators/features/changelog/src/changelog-ev-handle.h?id=d1d7a6f35c816822fab51c820e25023863c239c1'>xlators/features/changelog/src/changelog-ev-handle.h</a></div><div class='hunk'>@@ -0,0 +1,136 @@</div><div class='add'>+/*</div><div class='add'>+   Copyright (c) 2015 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+   This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+   This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+   General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+   later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+   cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#ifndef __CHANGELOG_EV_HANDLE_H</div><div class='add'>+#define __CHANGELOG_EV_HANDLE_H</div><div class='add'>+</div><div class='add'>+#include &lt;glusterfs/list.h&gt;</div><div class='add'>+#include &lt;glusterfs/xlator.h&gt;</div><div class='add'>+#include "rpc-clnt.h"</div><div class='add'>+</div><div class='add'>+#include &lt;glusterfs/rot-buffs.h&gt;</div><div class='add'>+</div><div class='add'>+struct changelog_clnt;</div><div class='add'>+</div><div class='add'>+typedef struct changelog_rpc_clnt {</div><div class='add'>+    xlator_t *this;</div><div class='add'>+</div><div class='add'>+    gf_lock_t lock;</div><div class='add'>+</div><div class='add'>+    gf_atomic_t ref;</div><div class='add'>+    gf_boolean_t disconnected;</div><div class='add'>+</div><div class='add'>+    unsigned int filter;</div><div class='add'>+    char sock[UNIX_PATH_MAX];</div><div class='add'>+</div><div class='add'>+    struct changelog_clnt *c_clnt; /* back pointer to list holder */</div><div class='add'>+</div><div class='add'>+    struct rpc_clnt *rpc; /* RPC client endpoint */</div><div class='add'>+</div><div class='add'>+    struct list_head list; /* -&gt;pending, -&gt;waitq, -&gt;active */</div><div class='add'>+</div><div class='add'>+    void (*cleanup)(struct changelog_rpc_clnt *); /* cleanup handler */</div><div class='add'>+} changelog_rpc_clnt_t;</div><div class='add'>+</div><div class='add'>+static inline void</div><div class='add'>+changelog_rpc_clnt_ref(changelog_rpc_clnt_t *crpc)</div><div class='add'>+{</div><div class='add'>+    GF_ATOMIC_INC(crpc-&gt;ref);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static inline void</div><div class='add'>+changelog_set_disconnect_flag(changelog_rpc_clnt_t *crpc, gf_boolean_t flag)</div><div class='add'>+{</div><div class='add'>+    crpc-&gt;disconnected = flag;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static inline int</div><div class='add'>+changelog_rpc_clnt_is_disconnected(changelog_rpc_clnt_t *crpc)</div><div class='add'>+{</div><div class='add'>+    return (crpc-&gt;disconnected == _gf_true);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static inline void</div><div class='add'>+changelog_rpc_clnt_unref(changelog_rpc_clnt_t *crpc)</div><div class='add'>+{</div><div class='add'>+    gf_boolean_t gone = _gf_false;</div><div class='add'>+    uint64_t ref = 0;</div><div class='add'>+</div><div class='add'>+    ref = GF_ATOMIC_DEC(crpc-&gt;ref);</div><div class='add'>+</div><div class='add'>+    if (!ref &amp;&amp; changelog_rpc_clnt_is_disconnected(crpc)) {</div><div class='add'>+        list_del(&amp;crpc-&gt;list);</div><div class='add'>+        gone = _gf_true;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (gone)</div><div class='add'>+        crpc-&gt;cleanup(crpc);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/**</div><div class='add'>+ * This structure holds pending and active clients. On probe RPC all</div><div class='add'>+ * an instance of the above structure (@changelog_rpc_clnt) is placed</div><div class='add'>+ * in -&gt;pending and gets moved to -&gt;active on a successful connect.</div><div class='add'>+ *</div><div class='add'>+ * locking rules:</div><div class='add'>+ *</div><div class='add'>+ * Manipulating -&gt;pending</div><div class='add'>+ * -&gt;pending_lock</div><div class='add'>+ *    -&gt;pending</div><div class='add'>+ *</div><div class='add'>+ * Manipulating -&gt;active</div><div class='add'>+ * -&gt;active_lock</div><div class='add'>+ *    -&gt;active</div><div class='add'>+ *</div><div class='add'>+ * Moving object from -&gt;pending to -&gt;active</div><div class='add'>+ * -&gt;pending_lock</div><div class='add'>+ *   -&gt;active_lock</div><div class='add'>+ *</div><div class='add'>+ * Objects are _never_ moved from -&gt;active to -&gt;pending, i.e., during</div><div class='add'>+ * disconnection, the object is destroyed. Well, we could have tried</div><div class='add'>+ * to reconnect, but that's pure waste.. let the other end reconnect.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+typedef struct changelog_clnt {</div><div class='add'>+    xlator_t *this;</div><div class='add'>+</div><div class='add'>+    /* pending connections */</div><div class='add'>+    pthread_mutex_t pending_lock;</div><div class='add'>+    pthread_cond_t pending_cond;</div><div class='add'>+    struct list_head pending;</div><div class='add'>+</div><div class='add'>+    /* current active connections */</div><div class='add'>+    gf_lock_t active_lock;</div><div class='add'>+    struct list_head active;</div><div class='add'>+</div><div class='add'>+    gf_lock_t wait_lock;</div><div class='add'>+    struct list_head waitq;</div><div class='add'>+</div><div class='add'>+    /* consumer part of rot-buffs */</div><div class='add'>+    rbuf_t *rbuf;</div><div class='add'>+    unsigned long sequence;</div><div class='add'>+} changelog_clnt_t;</div><div class='add'>+</div><div class='add'>+void *</div><div class='add'>+changelog_ev_connector(void *);</div><div class='add'>+</div><div class='add'>+void *</div><div class='add'>+changelog_ev_dispatch(void *);</div><div class='add'>+</div><div class='add'>+/* APIs */</div><div class='add'>+void</div><div class='add'>+changelog_ev_queue_connection(changelog_clnt_t *, changelog_rpc_clnt_t *);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+changelog_ev_cleanup_connections(xlator_t *, changelog_clnt_t *);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+changelog_process_cleanup_event(xlator_t *);</div><div class='add'>+#endif</div><div class='head'>diff --git a/xlators/features/changelog/src/changelog-helpers.c b/xlators/features/changelog/src/changelog-helpers.c<br/>new file mode 100644<br/>index 00000000000..e561997d858<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/xlators/features/changelog/src/changelog-helpers.c?id=d1d7a6f35c816822fab51c820e25023863c239c1'>xlators/features/changelog/src/changelog-helpers.c</a></div><div class='hunk'>@@ -0,0 +1,1977 @@</div><div class='add'>+/*</div><div class='add'>+   Copyright (c) 2013 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+   This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+   This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+   General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+   later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+   cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#include &lt;glusterfs/xlator.h&gt;</div><div class='add'>+#include &lt;glusterfs/defaults.h&gt;</div><div class='add'>+#include &lt;glusterfs/logging.h&gt;</div><div class='add'>+#include &lt;glusterfs/iobuf.h&gt;</div><div class='add'>+#include &lt;glusterfs/syscall.h&gt;</div><div class='add'>+</div><div class='add'>+#include "changelog-helpers.h"</div><div class='add'>+#include "changelog-encoders.h"</div><div class='add'>+#include "changelog-mem-types.h"</div><div class='add'>+#include "changelog-messages.h"</div><div class='add'>+</div><div class='add'>+#include "changelog-encoders.h"</div><div class='add'>+#include "changelog-rpc-common.h"</div><div class='add'>+#include &lt;pthread.h&gt;</div><div class='add'>+#include &lt;time.h&gt;</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+changelog_cleanup_free_mutex(void *arg_mutex)</div><div class='add'>+{</div><div class='add'>+    pthread_mutex_t *p_mutex = (pthread_mutex_t *)arg_mutex;</div><div class='add'>+</div><div class='add'>+    if (p_mutex)</div><div class='add'>+        pthread_mutex_unlock(p_mutex);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+changelog_thread_cleanup(xlator_t *this, pthread_t thr_id)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+    void *retval = NULL;</div><div class='add'>+</div><div class='add'>+    /* send a cancel request to the thread */</div><div class='add'>+    ret = pthread_cancel(thr_id);</div><div class='add'>+    if (ret != 0) {</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_ERROR, errno,</div><div class='add'>+                CHANGELOG_MSG_PTHREAD_CANCEL_FAILED, NULL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = pthread_join(thr_id, &amp;retval);</div><div class='add'>+    if ((ret != 0) || (retval != PTHREAD_CANCELED)) {</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_ERROR, errno,</div><div class='add'>+                CHANGELOG_MSG_PTHREAD_CANCEL_FAILED, NULL);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void *</div><div class='add'>+changelog_get_usable_buffer(changelog_local_t *local)</div><div class='add'>+{</div><div class='add'>+    changelog_log_data_t *cld = NULL;</div><div class='add'>+</div><div class='add'>+    if (!local)</div><div class='add'>+        return NULL;</div><div class='add'>+</div><div class='add'>+    cld = &amp;local-&gt;cld;</div><div class='add'>+    if (!cld-&gt;cld_iobuf)</div><div class='add'>+        return NULL;</div><div class='add'>+</div><div class='add'>+    return cld-&gt;cld_iobuf-&gt;ptr;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+changelog_selector_index(unsigned int selector)</div><div class='add'>+{</div><div class='add'>+    return (ffs(selector) - 1);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+changelog_ev_selected(xlator_t *this, changelog_ev_selector_t *selection,</div><div class='add'>+                      unsigned int selector)</div><div class='add'>+{</div><div class='add'>+    int idx = 0;</div><div class='add'>+</div><div class='add'>+    idx = changelog_selector_index(selector);</div><div class='add'>+    gf_msg_debug(this-&gt;name, 0, "selector ref count for %d (idx: %d): %d",</div><div class='add'>+                 selector, idx, selection-&gt;ref[idx]);</div><div class='add'>+    /* this can be lockless */</div><div class='add'>+    return (idx &lt; CHANGELOG_EV_SELECTION_RANGE &amp;&amp; (selection-&gt;ref[idx] &gt; 0));</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+changelog_select_event(xlator_t *this, changelog_ev_selector_t *selection,</div><div class='add'>+                       unsigned int selector)</div><div class='add'>+{</div><div class='add'>+    int idx = 0;</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;selection-&gt;reflock);</div><div class='add'>+    {</div><div class='add'>+        while (selector) {</div><div class='add'>+            idx = changelog_selector_index(selector);</div><div class='add'>+            if (idx &lt; CHANGELOG_EV_SELECTION_RANGE) {</div><div class='add'>+                selection-&gt;ref[idx]++;</div><div class='add'>+                gf_msg_debug(this-&gt;name, 0, "selecting event %d", idx);</div><div class='add'>+            }</div><div class='add'>+            selector &amp;= ~(1 &lt;&lt; idx);</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    UNLOCK(&amp;selection-&gt;reflock);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+changelog_deselect_event(xlator_t *this, changelog_ev_selector_t *selection,</div><div class='add'>+                         unsigned int selector)</div><div class='add'>+{</div><div class='add'>+    int idx = 0;</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;selection-&gt;reflock);</div><div class='add'>+    {</div><div class='add'>+        while (selector) {</div><div class='add'>+            idx = changelog_selector_index(selector);</div><div class='add'>+            if (idx &lt; CHANGELOG_EV_SELECTION_RANGE) {</div><div class='add'>+                selection-&gt;ref[idx]--;</div><div class='add'>+                gf_msg_debug(this-&gt;name, 0, "de-selecting event %d", idx);</div><div class='add'>+            }</div><div class='add'>+            selector &amp;= ~(1 &lt;&lt; idx);</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    UNLOCK(&amp;selection-&gt;reflock);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+changelog_init_event_selection(xlator_t *this,</div><div class='add'>+                               changelog_ev_selector_t *selection)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+    int j = CHANGELOG_EV_SELECTION_RANGE;</div><div class='add'>+</div><div class='add'>+    ret = LOCK_INIT(&amp;selection-&gt;reflock);</div><div class='add'>+    if (ret != 0)</div><div class='add'>+        return -1;</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;selection-&gt;reflock);</div><div class='add'>+    {</div><div class='add'>+        while (j--) {</div><div class='add'>+            selection-&gt;ref[j] = 0;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+    UNLOCK(&amp;selection-&gt;reflock);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+changelog_perform_dispatch(xlator_t *this, changelog_priv_t *priv, void *mem,</div><div class='add'>+                           size_t size)</div><div class='add'>+{</div><div class='add'>+    char *buf = NULL;</div><div class='add'>+    void *opaque = NULL;</div><div class='add'>+</div><div class='add'>+    buf = rbuf_reserve_write_area(priv-&gt;rbuf, size, &amp;opaque);</div><div class='add'>+    if (!buf) {</div><div class='add'>+        gf_msg_callingfn(this-&gt;name, GF_LOG_WARNING, 0,</div><div class='add'>+                         CHANGELOG_MSG_DISPATCH_EVENT_FAILED,</div><div class='add'>+                         "failed to dispatch event");</div><div class='add'>+        return;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    memcpy(buf, mem, size);</div><div class='add'>+    rbuf_write_complete(opaque);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+changelog_dispatch_event(xlator_t *this, changelog_priv_t *priv,</div><div class='add'>+                         changelog_event_t *ev)</div><div class='add'>+{</div><div class='add'>+    changelog_ev_selector_t *selection = NULL;</div><div class='add'>+</div><div class='add'>+    selection = &amp;priv-&gt;ev_selection;</div><div class='add'>+    if (changelog_ev_selected(this, selection, ev-&gt;ev_type)) {</div><div class='add'>+        changelog_perform_dispatch(this, priv, ev, CHANGELOG_EV_SIZE);</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+changelog_set_usable_record_and_length(changelog_local_t *local, size_t len,</div><div class='add'>+                                       int xr)</div><div class='add'>+{</div><div class='add'>+    changelog_log_data_t *cld = NULL;</div><div class='add'>+</div><div class='add'>+    cld = &amp;local-&gt;cld;</div><div class='add'>+</div><div class='add'>+    cld-&gt;cld_ptr_len = len;</div><div class='add'>+    cld-&gt;cld_xtra_records = xr;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+changelog_local_cleanup(xlator_t *xl, changelog_local_t *local)</div><div class='add'>+{</div><div class='add'>+    int i = 0;</div><div class='add'>+    changelog_opt_t *co = NULL;</div><div class='add'>+    changelog_log_data_t *cld = NULL;</div><div class='add'>+</div><div class='add'>+    if (!local)</div><div class='add'>+        return;</div><div class='add'>+</div><div class='add'>+    cld = &amp;local-&gt;cld;</div><div class='add'>+</div><div class='add'>+    /* cleanup dynamic allocation for extra records */</div><div class='add'>+    if (cld-&gt;cld_xtra_records) {</div><div class='add'>+        co = (changelog_opt_t *)cld-&gt;cld_ptr;</div><div class='add'>+        for (; i &lt; cld-&gt;cld_xtra_records; i++, co++)</div><div class='add'>+            if (co-&gt;co_free)</div><div class='add'>+                co-&gt;co_free(co);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    CHANGELOG_IOBUF_UNREF(cld-&gt;cld_iobuf);</div><div class='add'>+</div><div class='add'>+    if (local-&gt;inode)</div><div class='add'>+        inode_unref(local-&gt;inode);</div><div class='add'>+</div><div class='add'>+    mem_put(local);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+changelog_write(int fd, char *buffer, size_t len)</div><div class='add'>+{</div><div class='add'>+    ssize_t size = 0;</div><div class='add'>+    size_t written = 0;</div><div class='add'>+</div><div class='add'>+    while (written &lt; len) {</div><div class='add'>+        size = sys_write(fd, buffer + written, len - written);</div><div class='add'>+        if (size &lt;= 0)</div><div class='add'>+            break;</div><div class='add'>+</div><div class='add'>+        written += size;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return (written != len);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+htime_update(xlator_t *this, changelog_priv_t *priv, time_t ts, char *buffer)</div><div class='add'>+{</div><div class='add'>+    char changelog_path[PATH_MAX + 1] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int len = -1;</div><div class='add'>+    char x_value[25] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    /* time stamp(10) + : (1) + rolltime (12 ) + buffer (2) */</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    if (priv-&gt;htime_fd == -1) {</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_ERROR, 0, CHANGELOG_MSG_HTIME_ERROR,</div><div class='add'>+                "reason=fd not available", NULL);</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    len = snprintf(changelog_path, PATH_MAX, "%s", buffer);</div><div class='add'>+    if (len &gt;= PATH_MAX) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    if (changelog_write(priv-&gt;htime_fd, (void *)changelog_path, len + 1) &lt; 0) {</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_ERROR, 0, CHANGELOG_MSG_HTIME_ERROR,</div><div class='add'>+                "reason=write failed", NULL);</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    len = snprintf(x_value, sizeof(x_value), "%ld:%d", ts,</div><div class='add'>+                   priv-&gt;rollover_count);</div><div class='add'>+    if (len &gt;= sizeof(x_value)) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (sys_fsetxattr(priv-&gt;htime_fd, HTIME_KEY, x_value, len, XATTR_REPLACE)) {</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_ERROR, errno, CHANGELOG_MSG_HTIME_ERROR,</div><div class='add'>+                "reason=xattr updation failed", "XATTR_REPLACE=true",</div><div class='add'>+                "changelog=%s", changelog_path, NULL);</div><div class='add'>+</div><div class='add'>+        if (sys_fsetxattr(priv-&gt;htime_fd, HTIME_KEY, x_value, len, 0)) {</div><div class='add'>+            gf_smsg(this-&gt;name, GF_LOG_ERROR, errno, CHANGELOG_MSG_HTIME_ERROR,</div><div class='add'>+                    "reason=xattr updation failed", "changelog=%s",</div><div class='add'>+                    changelog_path, NULL);</div><div class='add'>+            ret = -1;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    priv-&gt;rollover_count += 1;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+ * Description: Check if the changelog to rollover is empty or not.</div><div class='add'>+ * It is assumed that fd passed is already verified.</div><div class='add'>+ *</div><div class='add'>+ * Returns:</div><div class='add'>+ * 1 : If found empty, changed path from "CHANGELOG.&lt;TS&gt;" to "changelog.&lt;TS&gt;"</div><div class='add'>+ * 0 : If NOT empty, proceed usual.</div><div class='add'>+ */</div><div class='add'>+int</div><div class='add'>+cl_is_empty(xlator_t *this, int fd)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    size_t elen = 0;</div><div class='add'>+    int encoding = -1;</div><div class='add'>+    char buffer[1024] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    struct stat stbuf = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int major_version = -1;</div><div class='add'>+    int minor_version = -1;</div><div class='add'>+</div><div class='add'>+    ret = sys_fstat(fd, &amp;stbuf);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_ERROR, errno, CHANGELOG_MSG_FSTAT_OP_FAILED,</div><div class='add'>+                NULL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = sys_lseek(fd, 0, SEEK_SET);</div><div class='add'>+    if (ret == -1) {</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_ERROR, errno, CHANGELOG_MSG_LSEEK_OP_FAILED,</div><div class='add'>+                NULL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    CHANGELOG_GET_HEADER_INFO(fd, buffer, sizeof(buffer), encoding,</div><div class='add'>+                              major_version, minor_version, elen);</div><div class='add'>+</div><div class='add'>+    if (elen == stbuf.st_size) {</div><div class='add'>+        ret = 1;</div><div class='add'>+    } else {</div><div class='add'>+        ret = 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+ * Description: Updates "CHANGELOG" to "changelog" for writing changelog path</div><div class='add'>+ * to htime file.</div><div class='add'>+ *</div><div class='add'>+ * Returns:</div><div class='add'>+ * 0  : Success</div><div class='add'>+ * -1 : Error</div><div class='add'>+ */</div><div class='add'>+int</div><div class='add'>+update_path(xlator_t *this, char *cl_path)</div><div class='add'>+{</div><div class='add'>+    const char low_cl[] = "changelog";</div><div class='add'>+    const char up_cl[] = "CHANGELOG";</div><div class='add'>+    char *found = NULL;</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    found = strstr(cl_path, up_cl);</div><div class='add'>+</div><div class='add'>+    if (found == NULL) {</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_ERROR, errno, CHANGELOG_MSG_PATH_NOT_FOUND,</div><div class='add'>+                NULL);</div><div class='add'>+        goto out;</div><div class='add'>+    } else {</div><div class='add'>+        memcpy(found, low_cl, sizeof(low_cl) - 1);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+changelog_rollover_changelog(xlator_t *this, changelog_priv_t *priv, time_t ts)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int notify = 0;</div><div class='add'>+    int cl_empty_flag = 0;</div><div class='add'>+    struct tm *gmt;</div><div class='add'>+    char yyyymmdd[40];</div><div class='add'>+    char ofile[PATH_MAX] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    char nfile[PATH_MAX] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    char nfile_dir[PATH_MAX] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    changelog_event_t ev = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    if (priv-&gt;changelog_fd != -1) {</div><div class='add'>+        ret = sys_fsync(priv-&gt;changelog_fd);</div><div class='add'>+        if (ret &lt; 0) {</div><div class='add'>+            gf_smsg(this-&gt;name, GF_LOG_ERROR, errno,</div><div class='add'>+                    CHANGELOG_MSG_FSYNC_OP_FAILED, NULL);</div><div class='add'>+        }</div><div class='add'>+        ret = cl_is_empty(this, priv-&gt;changelog_fd);</div><div class='add'>+        if (ret == 1) {</div><div class='add'>+            cl_empty_flag = 1;</div><div class='add'>+        } else if (ret == -1) {</div><div class='add'>+            /* Log error but proceed as usual */</div><div class='add'>+            gf_smsg(this-&gt;name, GF_LOG_WARNING, 0,</div><div class='add'>+                    CHANGELOG_MSG_DETECT_EMPTY_CHANGELOG_FAILED, NULL);</div><div class='add'>+        }</div><div class='add'>+        sys_close(priv-&gt;changelog_fd);</div><div class='add'>+        priv-&gt;changelog_fd = -1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Get GMT time. */</div><div class='add'>+    gmt = gmtime(&amp;ts);</div><div class='add'>+</div><div class='add'>+    strftime(yyyymmdd, sizeof(yyyymmdd), "%Y/%m/%d", gmt);</div><div class='add'>+</div><div class='add'>+    (void)snprintf(ofile, PATH_MAX, "%s/" CHANGELOG_FILE_NAME,</div><div class='add'>+                   priv-&gt;changelog_dir);</div><div class='add'>+    (void)snprintf(nfile, PATH_MAX, "%s/%s/" CHANGELOG_FILE_NAME ".%ld",</div><div class='add'>+                   priv-&gt;changelog_dir, yyyymmdd, ts);</div><div class='add'>+    (void)snprintf(nfile_dir, PATH_MAX, "%s/%s", priv-&gt;changelog_dir, yyyymmdd);</div><div class='add'>+</div><div class='add'>+    if (cl_empty_flag == 1) {</div><div class='add'>+        ret = sys_unlink(ofile);</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_smsg(this-&gt;name, GF_LOG_ERROR, errno,</div><div class='add'>+                    CHANGELOG_MSG_UNLINK_OP_FAILED, "path=%s", ofile, NULL);</div><div class='add'>+            ret = 0; /* Error in unlinking empty changelog should</div><div class='add'>+                        not break further changelog operation, so</div><div class='add'>+                        reset return value to 0*/</div><div class='add'>+        }</div><div class='add'>+    } else {</div><div class='add'>+        ret = sys_rename(ofile, nfile);</div><div class='add'>+</div><div class='add'>+        /* Changelog file rename gets ENOENT when parent dir doesn't exist */</div><div class='add'>+        if (errno == ENOENT) {</div><div class='add'>+            ret = mkdir_p(nfile_dir, 0600, _gf_true);</div><div class='add'>+</div><div class='add'>+            if ((ret == -1) &amp;&amp; (EEXIST != errno)) {</div><div class='add'>+                gf_smsg(this-&gt;name, GF_LOG_ERROR, errno,</div><div class='add'>+                        CHANGELOG_MSG_MKDIR_ERROR, "%s", nfile_dir, NULL);</div><div class='add'>+                goto out;</div><div class='add'>+            }</div><div class='add'>+</div><div class='add'>+            ret = sys_rename(ofile, nfile);</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        if (ret &amp;&amp; (errno == ENOENT)) {</div><div class='add'>+            ret = 0;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+        if (ret) {</div><div class='add'>+            gf_smsg(this-&gt;name, GF_LOG_ERROR, errno, CHANGELOG_MSG_RENAME_ERROR,</div><div class='add'>+                    "from=%s", ofile, "to=%s", nfile, NULL);</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (!ret &amp;&amp; (cl_empty_flag == 0)) {</div><div class='add'>+        notify = 1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (!ret) {</div><div class='add'>+        if (cl_empty_flag) {</div><div class='add'>+            update_path(this, nfile);</div><div class='add'>+        }</div><div class='add'>+        ret = htime_update(this, priv, ts, nfile);</div><div class='add'>+        if (ret == -1) {</div><div class='add'>+            gf_smsg(this-&gt;name, GF_LOG_ERROR, 0, CHANGELOG_MSG_HTIME_ERROR,</div><div class='add'>+                    NULL);</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (notify) {</div><div class='add'>+        ev.ev_type = CHANGELOG_OP_TYPE_JOURNAL;</div><div class='add'>+        memcpy(ev.u.journal.path, nfile, strlen(nfile) + 1);</div><div class='add'>+        changelog_dispatch_event(this, priv, &amp;ev);</div><div class='add'>+    }</div><div class='add'>+out:</div><div class='add'>+    /* If this is explicit rollover initiated by snapshot,</div><div class='add'>+     * wakeup reconfigure thread waiting for changelog to</div><div class='add'>+     * rollover. This should happen even in failure cases as</div><div class='add'>+     * well otherwise snapshot will timeout and fail. Hence</div><div class='add'>+     * moved under out.</div><div class='add'>+     */</div><div class='add'>+    if (priv-&gt;explicit_rollover) {</div><div class='add'>+        priv-&gt;explicit_rollover = _gf_false;</div><div class='add'>+</div><div class='add'>+        pthread_mutex_lock(&amp;priv-&gt;bn.bnotify_mutex);</div><div class='add'>+        {</div><div class='add'>+            if (ret) {</div><div class='add'>+                priv-&gt;bn.bnotify_error = _gf_true;</div><div class='add'>+                gf_smsg(this-&gt;name, GF_LOG_ERROR, 0,</div><div class='add'>+                        CHANGELOG_MSG_EXPLICIT_ROLLOVER_FAILED, NULL);</div><div class='add'>+            } else {</div><div class='add'>+                gf_smsg(this-&gt;name, GF_LOG_INFO, 0, CHANGELOG_MSG_BNOTIFY_INFO,</div><div class='add'>+                        "changelog=%s", nfile, NULL);</div><div class='add'>+            }</div><div class='add'>+            priv-&gt;bn.bnotify = _gf_false;</div><div class='add'>+            pthread_cond_signal(&amp;priv-&gt;bn.bnotify_cond);</div><div class='add'>+        }</div><div class='add'>+        pthread_mutex_unlock(&amp;priv-&gt;bn.bnotify_mutex);</div><div class='add'>+    }</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+filter_cur_par_dirs(const struct dirent *entry)</div><div class='add'>+{</div><div class='add'>+    if (entry == NULL)</div><div class='add'>+        return 0;</div><div class='add'>+</div><div class='add'>+    if ((strcmp(entry-&gt;d_name, ".") == 0) || (strcmp(entry-&gt;d_name, "..") == 0))</div><div class='add'>+        return 0;</div><div class='add'>+    else</div><div class='add'>+        return 1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+ * find_current_htime:</div><div class='add'>+ *       It finds the latest htime file and sets the HTIME_CURRENT</div><div class='add'>+ *       xattr.</div><div class='add'>+ *       RETURN VALUE:</div><div class='add'>+ *           -1 : Error</div><div class='add'>+ *           ret: Number of directory entries;</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+find_current_htime(int ht_dir_fd, const char *ht_dir_path, char *ht_file_bname)</div><div class='add'>+{</div><div class='add'>+    struct dirent **namelist = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    int cnt = 0;</div><div class='add'>+    int i = 0;</div><div class='add'>+    xlator_t *this = NULL;</div><div class='add'>+</div><div class='add'>+    this = THIS;</div><div class='add'>+    GF_ASSERT(this);</div><div class='add'>+    GF_ASSERT(ht_dir_path);</div><div class='add'>+</div><div class='add'>+    cnt = scandir(ht_dir_path, &amp;namelist, filter_cur_par_dirs, alphasort);</div><div class='add'>+    if (cnt &lt; 0) {</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_ERROR, errno, CHANGELOG_MSG_SCAN_DIR_FAILED,</div><div class='add'>+                NULL);</div><div class='add'>+    } else if (cnt &gt; 0) {</div><div class='add'>+        if (snprintf(ht_file_bname, NAME_MAX, "%s",</div><div class='add'>+                     namelist[cnt - 1]-&gt;d_name) &gt;= NAME_MAX) {</div><div class='add'>+            ret = -1;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+        if (sys_fsetxattr(ht_dir_fd, HTIME_CURRENT, ht_file_bname,</div><div class='add'>+                          strlen(ht_file_bname), 0)) {</div><div class='add'>+            gf_smsg(this-&gt;name, GF_LOG_ERROR, errno,</div><div class='add'>+                    CHANGELOG_MSG_FSETXATTR_FAILED, "HTIME_CURRENT", NULL);</div><div class='add'>+            ret = -1;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        if (sys_fsync(ht_dir_fd) &lt; 0) {</div><div class='add'>+            gf_smsg(this-&gt;name, GF_LOG_ERROR, errno,</div><div class='add'>+                    CHANGELOG_MSG_FSYNC_OP_FAILED, NULL);</div><div class='add'>+            ret = -1;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    for (i = 0; i &lt; cnt; i++)</div><div class='add'>+        free(namelist[i]);</div><div class='add'>+    free(namelist);</div><div class='add'>+</div><div class='add'>+    if (ret)</div><div class='add'>+        cnt = ret;</div><div class='add'>+</div><div class='add'>+    return cnt;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* Returns 0 on successful open of htime file</div><div class='add'>+ * returns -1 on failure or error</div><div class='add'>+ */</div><div class='add'>+int</div><div class='add'>+htime_open(xlator_t *this, changelog_priv_t *priv, time_t ts)</div><div class='add'>+{</div><div class='add'>+    int ht_file_fd = -1;</div><div class='add'>+    int ht_dir_fd = -1;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    int cnt = 0;</div><div class='add'>+    char ht_dir_path[PATH_MAX] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    char ht_file_path[PATH_MAX] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    char ht_file_bname[NAME_MAX] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    char x_value[NAME_MAX] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int flags = 0;</div><div class='add'>+    unsigned long min_ts = 0;</div><div class='add'>+    unsigned long max_ts = 0;</div><div class='add'>+    unsigned long total = 0;</div><div class='add'>+    unsigned long total1 = 0;</div><div class='add'>+    ssize_t size = 0;</div><div class='add'>+    struct stat stat_buf = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    unsigned long record_len = 0;</div><div class='add'>+    int32_t len = 0;</div><div class='add'>+</div><div class='add'>+    CHANGELOG_FILL_HTIME_DIR(priv-&gt;changelog_dir, ht_dir_path);</div><div class='add'>+</div><div class='add'>+    /* Open htime directory to get HTIME_CURRENT */</div><div class='add'>+    ht_dir_fd = open(ht_dir_path, O_RDONLY);</div><div class='add'>+    if (ht_dir_fd == -1) {</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_ERROR, errno, CHANGELOG_MSG_OPEN_FAILED,</div><div class='add'>+                "path=%s", ht_dir_path, NULL);</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    size = sys_fgetxattr(ht_dir_fd, HTIME_CURRENT, ht_file_bname,</div><div class='add'>+                         sizeof(ht_file_bname));</div><div class='add'>+    if (size &lt; 0) {</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_ERROR, errno, CHANGELOG_MSG_FGETXATTR_FAILED,</div><div class='add'>+                "name=HTIME_CURRENT", NULL);</div><div class='add'>+</div><div class='add'>+        /* If upgrade scenario, find the latest HTIME.TSTAMP file</div><div class='add'>+         * and use the same. If error, create a new HTIME.TSTAMP</div><div class='add'>+         * file.</div><div class='add'>+         */</div><div class='add'>+        cnt = find_current_htime(ht_dir_fd, ht_dir_path, ht_file_bname);</div><div class='add'>+        if (cnt &lt;= 0) {</div><div class='add'>+            gf_smsg(this-&gt;name, GF_LOG_INFO, errno,</div><div class='add'>+                    CHANGELOG_MSG_NO_HTIME_CURRENT, NULL);</div><div class='add'>+            sys_close(ht_dir_fd);</div><div class='add'>+            return htime_create(this, priv, ts);</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_ERROR, errno,</div><div class='add'>+                CHANGELOG_MSG_HTIME_CURRENT_ERROR, NULL);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    gf_smsg(this-&gt;name, GF_LOG_INFO, 0, CHANGELOG_MSG_HTIME_CURRENT, "path=%s",</div><div class='add'>+            ht_file_bname, NULL);</div><div class='add'>+    len = snprintf(ht_file_path, PATH_MAX, "%s/%s", ht_dir_path, ht_file_bname);</div><div class='add'>+    if ((len &lt; 0) || (len &gt;= PATH_MAX)) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Open in append mode as existing htime file is used */</div><div class='add'>+    flags |= (O_RDWR | O_SYNC | O_APPEND);</div><div class='add'>+    ht_file_fd = open(ht_file_path, flags,</div><div class='add'>+                      S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);</div><div class='add'>+    if (ht_file_fd &lt; 0) {</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_ERROR, errno, CHANGELOG_MSG_OPEN_FAILED,</div><div class='add'>+                "path=%s", ht_file_path, NULL);</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* save this htime_fd in priv-&gt;htime_fd */</div><div class='add'>+    priv-&gt;htime_fd = ht_file_fd;</div><div class='add'>+</div><div class='add'>+    ret = sys_fstat(ht_file_fd, &amp;stat_buf);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_ERROR, errno, CHANGELOG_MSG_HTIME_STAT_ERROR,</div><div class='add'>+                "path=%s", ht_file_path, NULL);</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Initialize rollover-number in priv to current number */</div><div class='add'>+    size = sys_fgetxattr(ht_file_fd, HTIME_KEY, x_value, sizeof(x_value));</div><div class='add'>+    if (size &lt; 0) {</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_ERROR, errno, CHANGELOG_MSG_FGETXATTR_FAILED,</div><div class='add'>+                "name=%s", HTIME_KEY, "path=%s", ht_file_path, NULL);</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    sscanf(x_value, "%lu:%lu", &amp;max_ts, &amp;total);</div><div class='add'>+</div><div class='add'>+    /* 22 = 1(/) + 20(CHANGELOG.TIMESTAMP) + 1(\x00) */</div><div class='add'>+    record_len = strlen(priv-&gt;changelog_dir) + 22;</div><div class='add'>+    total1 = stat_buf.st_size / record_len;</div><div class='add'>+    if (total != total1) {</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_INFO, 0, CHANGELOG_MSG_TOTAL_LOG_INFO,</div><div class='add'>+                "xattr_total=%lu", total, "size_total=%lu", total1, NULL);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    gf_smsg(this-&gt;name, GF_LOG_INFO, 0, CHANGELOG_MSG_TOTAL_LOG_INFO, "min=%lu",</div><div class='add'>+            min_ts, "max=%lu", max_ts, "total_changelogs=%lu", total, NULL);</div><div class='add'>+</div><div class='add'>+    if (total &lt; total1)</div><div class='add'>+        priv-&gt;rollover_count = total1 + 1;</div><div class='add'>+    else</div><div class='add'>+        priv-&gt;rollover_count = total + 1;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (ht_dir_fd != -1)</div><div class='add'>+        sys_close(ht_dir_fd);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* Returns 0 on successful creation of htime file</div><div class='add'>+ * returns -1 on failure or error</div><div class='add'>+ */</div><div class='add'>+int</div><div class='add'>+htime_create(xlator_t *this, changelog_priv_t *priv, time_t ts)</div><div class='add'>+{</div><div class='add'>+    int ht_file_fd = -1;</div><div class='add'>+    int ht_dir_fd = -1;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    char ht_dir_path[PATH_MAX] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    char ht_file_path[PATH_MAX] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    char ht_file_bname[NAME_MAX + 1] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int flags = 0;</div><div class='add'>+    int32_t len = 0;</div><div class='add'>+</div><div class='add'>+    gf_smsg(this-&gt;name, GF_LOG_INFO, 0, CHANGELOG_MSG_NEW_HTIME_FILE,</div><div class='add'>+            "name=%ld", ts, NULL);</div><div class='add'>+</div><div class='add'>+    CHANGELOG_FILL_HTIME_DIR(priv-&gt;changelog_dir, ht_dir_path);</div><div class='add'>+</div><div class='add'>+    /* get the htime file name in ht_file_path */</div><div class='add'>+    len = snprintf(ht_file_path, PATH_MAX, "%s/%s.%ld", ht_dir_path,</div><div class='add'>+                   HTIME_FILE_NAME, ts);</div><div class='add'>+    if ((len &lt; 0) || (len &gt;= PATH_MAX)) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    flags |= (O_CREAT | O_RDWR | O_SYNC);</div><div class='add'>+    ht_file_fd = open(ht_file_path, flags,</div><div class='add'>+                      S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);</div><div class='add'>+    if (ht_file_fd &lt; 0) {</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_ERROR, errno, CHANGELOG_MSG_OPEN_FAILED,</div><div class='add'>+                "path=%s", ht_file_path, NULL);</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (sys_fsetxattr(ht_file_fd, HTIME_KEY, HTIME_INITIAL_VALUE,</div><div class='add'>+                      sizeof(HTIME_INITIAL_VALUE) - 1, 0)) {</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_ERROR, errno,</div><div class='add'>+                CHANGELOG_MSG_XATTR_INIT_FAILED, NULL);</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = sys_fsync(ht_file_fd);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_ERROR, errno, CHANGELOG_MSG_FSYNC_OP_FAILED,</div><div class='add'>+                NULL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* save this htime_fd in priv-&gt;htime_fd */</div><div class='add'>+    priv-&gt;htime_fd = ht_file_fd;</div><div class='add'>+</div><div class='add'>+    ht_file_fd = -1;</div><div class='add'>+</div><div class='add'>+    /* Set xattr HTIME_CURRENT on htime directory to htime filename */</div><div class='add'>+    ht_dir_fd = open(ht_dir_path, O_RDONLY);</div><div class='add'>+    if (ht_dir_fd == -1) {</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_ERROR, errno, CHANGELOG_MSG_OPEN_FAILED,</div><div class='add'>+                "path=%s", ht_dir_path, NULL);</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    (void)snprintf(ht_file_bname, sizeof(ht_file_bname), "%s.%ld",</div><div class='add'>+                   HTIME_FILE_NAME, ts);</div><div class='add'>+    if (sys_fsetxattr(ht_dir_fd, HTIME_CURRENT, ht_file_bname,</div><div class='add'>+                      strlen(ht_file_bname), 0)) {</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_ERROR, errno, CHANGELOG_MSG_FSETXATTR_FAILED,</div><div class='add'>+                " HTIME_CURRENT", NULL);</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = sys_fsync(ht_dir_fd);</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_ERROR, errno, CHANGELOG_MSG_FSYNC_OP_FAILED,</div><div class='add'>+                NULL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* initialize rollover-number in priv to 1 */</div><div class='add'>+    priv-&gt;rollover_count = 1;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (ht_dir_fd != -1)</div><div class='add'>+        sys_close(ht_dir_fd);</div><div class='add'>+    if (ht_file_fd != -1)</div><div class='add'>+        sys_close(ht_file_fd);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* Description:</div><div class='add'>+ *      Opens the snap changelog to log call path fops in it.</div><div class='add'>+ *      This changelos name is "CHANGELOG.SNAP", stored in</div><div class='add'>+ *      path ".glusterfs/changelogs/csnap".</div><div class='add'>+ * Returns:</div><div class='add'>+ *       0  : On success.</div><div class='add'>+ *      -1  : On failure.</div><div class='add'>+ */</div><div class='add'>+int</div><div class='add'>+changelog_snap_open(xlator_t *this, changelog_priv_t *priv)</div><div class='add'>+{</div><div class='add'>+    int fd = -1;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    int flags = 0;</div><div class='add'>+    char buffer[1024] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    char c_snap_path[PATH_MAX] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    char csnap_dir_path[PATH_MAX] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    int32_t len = 0;</div><div class='add'>+</div><div class='add'>+    CHANGELOG_FILL_CSNAP_DIR(priv-&gt;changelog_dir, csnap_dir_path);</div><div class='add'>+</div><div class='add'>+    len = snprintf(c_snap_path, PATH_MAX, "%s/" CSNAP_FILE_NAME,</div><div class='add'>+                   csnap_dir_path);</div><div class='add'>+    if ((len &lt; 0) || (len &gt;= PATH_MAX)) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    flags |= (O_CREAT | O_RDWR | O_TRUNC);</div><div class='add'>+</div><div class='add'>+    fd = open(c_snap_path, flags, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);</div><div class='add'>+    if (fd &lt; 0) {</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_ERROR, errno, CHANGELOG_MSG_OPEN_FAILED,</div><div class='add'>+                "path=%s", c_snap_path, NULL);</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+    priv-&gt;c_snap_fd = fd;</div><div class='add'>+</div><div class='add'>+    (void)snprintf(buffer, 1024, CHANGELOG_HEADER, CHANGELOG_VERSION_MAJOR,</div><div class='add'>+                   CHANGELOG_VERSION_MINOR, priv-&gt;ce-&gt;encoder);</div><div class='add'>+    ret = changelog_snap_write_change(priv, buffer, strlen(buffer));</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        sys_close(priv-&gt;c_snap_fd);</div><div class='add'>+        priv-&gt;c_snap_fd = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+ * Description:</div><div class='add'>+ *      Starts logging fop details in CSNAP journal.</div><div class='add'>+ * Returns:</div><div class='add'>+ *       0 : On success.</div><div class='add'>+ *      -1 : On Failure.</div><div class='add'>+ */</div><div class='add'>+int</div><div class='add'>+changelog_snap_logging_start(xlator_t *this, changelog_priv_t *priv)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    ret = changelog_snap_open(this, priv);</div><div class='add'>+    gf_smsg(this-&gt;name, GF_LOG_INFO, 0, CHANGELOG_MSG_SNAP_INFO, "starting",</div><div class='add'>+            NULL);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+ * Description:</div><div class='add'>+ *      Stops logging fop details in CSNAP journal.</div><div class='add'>+ * Returns:</div><div class='add'>+ *       0 : On success.</div><div class='add'>+ *      -1 : On Failure.</div><div class='add'>+ */</div><div class='add'>+int</div><div class='add'>+changelog_snap_logging_stop(xlator_t *this, changelog_priv_t *priv)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    sys_close(priv-&gt;c_snap_fd);</div><div class='add'>+    priv-&gt;c_snap_fd = -1;</div><div class='add'>+</div><div class='add'>+    gf_smsg(this-&gt;name, GF_LOG_INFO, 0, CHANGELOG_MSG_SNAP_INFO, "Stopped",</div><div class='add'>+            NULL);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+changelog_open_journal(xlator_t *this, changelog_priv_t *priv)</div><div class='add'>+{</div><div class='add'>+    int fd = 0;</div><div class='add'>+    int ret = -1;</div><div class='add'>+    int flags = 0;</div><div class='add'>+    char buffer[1024] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    char changelog_path[PATH_MAX] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    (void)snprintf(changelog_path, PATH_MAX, "%s/" CHANGELOG_FILE_NAME,</div><div class='add'>+                   priv-&gt;changelog_dir);</div><div class='add'>+</div><div class='add'>+    flags |= (O_CREAT | O_RDWR);</div><div class='add'>+    if (priv-&gt;fsync_interval == 0)</div><div class='add'>+        flags |= O_SYNC;</div><div class='add'>+</div><div class='add'>+    fd = open(changelog_path, flags, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);</div><div class='add'>+    if (fd &lt; 0) {</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_ERROR, errno, CHANGELOG_MSG_OPEN_FAILED,</div><div class='add'>+                "path=%s", changelog_path, NULL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    priv-&gt;changelog_fd = fd;</div><div class='add'>+</div><div class='add'>+    (void)snprintf(buffer, 1024, CHANGELOG_HEADER, CHANGELOG_VERSION_MAJOR,</div><div class='add'>+                   CHANGELOG_VERSION_MINOR, priv-&gt;ce-&gt;encoder);</div><div class='add'>+    ret = changelog_write_change(priv, buffer, strlen(buffer));</div><div class='add'>+    if (ret) {</div><div class='add'>+        sys_close(priv-&gt;changelog_fd);</div><div class='add'>+        priv-&gt;changelog_fd = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = 0;</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+changelog_start_next_change(xlator_t *this, changelog_priv_t *priv, time_t ts,</div><div class='add'>+                            gf_boolean_t finale)</div><div class='add'>+{</div><div class='add'>+    int ret = -1;</div><div class='add'>+</div><div class='add'>+    ret = changelog_rollover_changelog(this, priv, ts);</div><div class='add'>+</div><div class='add'>+    if (!ret &amp;&amp; !finale)</div><div class='add'>+        ret = changelog_open_journal(this, priv);</div><div class='add'>+</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/**</div><div class='add'>+ * return the length of entry</div><div class='add'>+ */</div><div class='add'>+size_t</div><div class='add'>+changelog_entry_length()</div><div class='add'>+{</div><div class='add'>+    return sizeof(changelog_log_data_t);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+changelog_fill_rollover_data(changelog_log_data_t *cld, gf_boolean_t is_last)</div><div class='add'>+{</div><div class='add'>+    cld-&gt;cld_type = CHANGELOG_TYPE_ROLLOVER;</div><div class='add'>+    cld-&gt;cld_roll_time = gf_time();</div><div class='add'>+    cld-&gt;cld_finale = is_last;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+changelog_snap_write_change(changelog_priv_t *priv, char *buffer, size_t len)</div><div class='add'>+{</div><div class='add'>+    return changelog_write(priv-&gt;c_snap_fd, buffer, len);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+changelog_write_change(changelog_priv_t *priv, char *buffer, size_t len)</div><div class='add'>+{</div><div class='add'>+    return changelog_write(priv-&gt;changelog_fd, buffer, len);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+ * Descriptions:</div><div class='add'>+ *      Writes fop details in ascii format to CSNAP.</div><div class='add'>+ * Issues:</div><div class='add'>+ *      Not Encoding agnostic.</div><div class='add'>+ * Returns:</div><div class='add'>+ *      0 : On Success.</div><div class='add'>+ *     -1 : On Failure.</div><div class='add'>+ */</div><div class='add'>+int</div><div class='add'>+changelog_snap_handle_ascii_change(xlator_t *this, changelog_log_data_t *cld)</div><div class='add'>+{</div><div class='add'>+    size_t off = 0;</div><div class='add'>+    size_t gfid_len = 0;</div><div class='add'>+    char *gfid_str = NULL;</div><div class='add'>+    char *buffer = NULL;</div><div class='add'>+    changelog_priv_t *priv = NULL;</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    if (this == NULL) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+</div><div class='add'>+    if (priv == NULL) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    gfid_str = uuid_utoa(cld-&gt;cld_gfid);</div><div class='add'>+    gfid_len = strlen(gfid_str);</div><div class='add'>+</div><div class='add'>+    /*  extra bytes for decorations */</div><div class='add'>+    buffer = alloca(gfid_len + cld-&gt;cld_ptr_len + 10);</div><div class='add'>+    CHANGELOG_STORE_ASCII(priv, buffer, off, gfid_str, gfid_len, cld);</div><div class='add'>+</div><div class='add'>+    CHANGELOG_FILL_BUFFER(buffer, off, "\0", 1);</div><div class='add'>+</div><div class='add'>+    ret = changelog_snap_write_change(priv, buffer, off);</div><div class='add'>+</div><div class='add'>+    if (ret &lt; 0) {</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_ERROR, 0, CHANGELOG_MSG_WRITE_FAILED,</div><div class='add'>+                "csnap", NULL);</div><div class='add'>+    }</div><div class='add'>+    gf_smsg(this-&gt;name, GF_LOG_INFO, 0, CHANGELOG_MSG_WROTE_TO_CSNAP, NULL);</div><div class='add'>+    ret = 0;</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+changelog_handle_change(xlator_t *this, changelog_priv_t *priv,</div><div class='add'>+                        changelog_log_data_t *cld)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    if (CHANGELOG_TYPE_IS_ROLLOVER(cld-&gt;cld_type)) {</div><div class='add'>+        changelog_encode_change(priv);</div><div class='add'>+        ret = changelog_start_next_change(this, priv, cld-&gt;cld_roll_time,</div><div class='add'>+                                          cld-&gt;cld_finale);</div><div class='add'>+        if (ret)</div><div class='add'>+            gf_smsg(this-&gt;name, GF_LOG_ERROR, 0,</div><div class='add'>+                    CHANGELOG_MSG_GET_TIME_OP_FAILED, NULL);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /**</div><div class='add'>+     * case when there is reconfigure done (disabling changelog) and there</div><div class='add'>+     * are still fops that have updates in prgress.</div><div class='add'>+     */</div><div class='add'>+    if (priv-&gt;changelog_fd == -1)</div><div class='add'>+        return 0;</div><div class='add'>+</div><div class='add'>+    if (CHANGELOG_TYPE_IS_FSYNC(cld-&gt;cld_type)) {</div><div class='add'>+        ret = sys_fsync(priv-&gt;changelog_fd);</div><div class='add'>+        if (ret &lt; 0) {</div><div class='add'>+            gf_smsg(this-&gt;name, GF_LOG_ERROR, errno,</div><div class='add'>+                    CHANGELOG_MSG_FSYNC_OP_FAILED, NULL);</div><div class='add'>+        }</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ret = priv-&gt;ce-&gt;encode(this, cld);</div><div class='add'>+    if (ret) {</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_ERROR, 0, CHANGELOG_MSG_WRITE_FAILED,</div><div class='add'>+                "changelog", NULL);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+changelog_local_t *</div><div class='add'>+changelog_local_init(xlator_t *this, inode_t *inode, uuid_t gfid,</div><div class='add'>+                     int xtra_records, gf_boolean_t update_flag)</div><div class='add'>+{</div><div class='add'>+    changelog_local_t *local = NULL;</div><div class='add'>+    struct iobuf *iobuf = NULL;</div><div class='add'>+</div><div class='add'>+    /**</div><div class='add'>+     * We relax the presence of inode if @update_flag is true.</div><div class='add'>+     * The caller (implementation of the fop) needs to be careful to</div><div class='add'>+     * not blindly use local-&gt;inode.</div><div class='add'>+     */</div><div class='add'>+    if (!update_flag &amp;&amp; !inode) {</div><div class='add'>+        gf_msg_callingfn(this-&gt;name, GF_LOG_WARNING, 0,</div><div class='add'>+                         CHANGELOG_MSG_INODE_NOT_FOUND,</div><div class='add'>+                         "inode needed for version checking !!!");</div><div class='add'>+</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (xtra_records) {</div><div class='add'>+        iobuf = iobuf_get2(this-&gt;ctx-&gt;iobuf_pool,</div><div class='add'>+                           xtra_records * CHANGELOG_OPT_RECORD_LEN);</div><div class='add'>+        if (!iobuf)</div><div class='add'>+            goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    local = mem_get0(this-&gt;local_pool);</div><div class='add'>+    if (!local) {</div><div class='add'>+        CHANGELOG_IOBUF_UNREF(iobuf);</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    local-&gt;update_no_check = update_flag;</div><div class='add'>+</div><div class='add'>+    gf_uuid_copy(local-&gt;cld.cld_gfid, gfid);</div><div class='add'>+</div><div class='add'>+    local-&gt;cld.cld_iobuf = iobuf;</div><div class='add'>+    local-&gt;cld.cld_xtra_records = 0; /* set by the caller */</div><div class='add'>+</div><div class='add'>+    if (inode)</div><div class='add'>+        local-&gt;inode = inode_ref(inode);</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return local;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+changelog_forget(xlator_t *this, inode_t *inode)</div><div class='add'>+{</div><div class='add'>+    uint64_t ctx_addr = 0;</div><div class='add'>+    changelog_inode_ctx_t *ctx = NULL;</div><div class='add'>+</div><div class='add'>+    inode_ctx_del(inode, this, &amp;ctx_addr);</div><div class='add'>+    if (!ctx_addr)</div><div class='add'>+        return 0;</div><div class='add'>+</div><div class='add'>+    ctx = (changelog_inode_ctx_t *)(long)ctx_addr;</div><div class='add'>+    GF_FREE(ctx);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+changelog_inject_single_event(xlator_t *this, changelog_priv_t *priv,</div><div class='add'>+                              changelog_log_data_t *cld)</div><div class='add'>+{</div><div class='add'>+    return priv-&gt;cd.dispatchfn(this, priv, priv-&gt;cd.cd_data, cld, NULL);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* Wait till all the black fops are drained */</div><div class='add'>+void</div><div class='add'>+changelog_drain_black_fops(xlator_t *this, changelog_priv_t *priv)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    /* clean up framework of pthread_mutex is required here as</div><div class='add'>+     * 'reconfigure' terminates the changelog_rollover thread</div><div class='add'>+     * on graph change.</div><div class='add'>+     */</div><div class='add'>+    pthread_cleanup_push(changelog_cleanup_free_mutex,</div><div class='add'>+                         &amp;priv-&gt;dm.drain_black_mutex);</div><div class='add'>+    ret = pthread_mutex_lock(&amp;priv-&gt;dm.drain_black_mutex);</div><div class='add'>+    if (ret)</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_ERROR, errno, CHANGELOG_MSG_PTHREAD_ERROR,</div><div class='add'>+                "error=%d", ret, NULL);</div><div class='add'>+    while (priv-&gt;dm.black_fop_cnt &gt; 0) {</div><div class='add'>+        gf_msg_debug(this-&gt;name, 0, "Conditional wait on black fops: %ld",</div><div class='add'>+                     priv-&gt;dm.black_fop_cnt);</div><div class='add'>+        priv-&gt;dm.drain_wait_black = _gf_true;</div><div class='add'>+        ret = pthread_cond_wait(&amp;priv-&gt;dm.drain_black_cond,</div><div class='add'>+                                &amp;priv-&gt;dm.drain_black_mutex);</div><div class='add'>+        if (ret)</div><div class='add'>+            gf_smsg(this-&gt;name, GF_LOG_ERROR, errno,</div><div class='add'>+                    CHANGELOG_MSG_PTHREAD_COND_WAIT_FAILED, "error=%d", ret,</div><div class='add'>+                    NULL);</div><div class='add'>+    }</div><div class='add'>+    priv-&gt;dm.drain_wait_black = _gf_false;</div><div class='add'>+    ret = pthread_mutex_unlock(&amp;priv-&gt;dm.drain_black_mutex);</div><div class='add'>+    if (ret)</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_ERROR, errno, CHANGELOG_MSG_PTHREAD_ERROR,</div><div class='add'>+                "error=%d", ret, NULL);</div><div class='add'>+    pthread_cleanup_pop(0);</div><div class='add'>+    gf_msg_debug(this-&gt;name, 0, "Woke up: Conditional wait on black fops");</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* Wait till all the white  fops are drained */</div><div class='add'>+void</div><div class='add'>+changelog_drain_white_fops(xlator_t *this, changelog_priv_t *priv)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    /* clean up framework of pthread_mutex is required here as</div><div class='add'>+     * 'reconfigure' terminates the changelog_rollover thread</div><div class='add'>+     * on graph change.</div><div class='add'>+     */</div><div class='add'>+    pthread_cleanup_push(changelog_cleanup_free_mutex,</div><div class='add'>+                         &amp;priv-&gt;dm.drain_white_mutex);</div><div class='add'>+    ret = pthread_mutex_lock(&amp;priv-&gt;dm.drain_white_mutex);</div><div class='add'>+    if (ret)</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_ERROR, errno, CHANGELOG_MSG_PTHREAD_ERROR,</div><div class='add'>+                "error=%d", ret, NULL);</div><div class='add'>+    while (priv-&gt;dm.white_fop_cnt &gt; 0) {</div><div class='add'>+        gf_msg_debug(this-&gt;name, 0, "Conditional wait on white fops : %ld",</div><div class='add'>+                     priv-&gt;dm.white_fop_cnt);</div><div class='add'>+        priv-&gt;dm.drain_wait_white = _gf_true;</div><div class='add'>+        ret = pthread_cond_wait(&amp;priv-&gt;dm.drain_white_cond,</div><div class='add'>+                                &amp;priv-&gt;dm.drain_white_mutex);</div><div class='add'>+        if (ret)</div><div class='add'>+            gf_smsg(this-&gt;name, GF_LOG_ERROR, errno,</div><div class='add'>+                    CHANGELOG_MSG_PTHREAD_COND_WAIT_FAILED, "error=%d", ret,</div><div class='add'>+                    NULL);</div><div class='add'>+    }</div><div class='add'>+    priv-&gt;dm.drain_wait_white = _gf_false;</div><div class='add'>+    ret = pthread_mutex_unlock(&amp;priv-&gt;dm.drain_white_mutex);</div><div class='add'>+    if (ret)</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_ERROR, errno, CHANGELOG_MSG_PTHREAD_ERROR,</div><div class='add'>+                "error=%d", ret, NULL);</div><div class='add'>+    pthread_cleanup_pop(0);</div><div class='add'>+    gf_msg_debug(this-&gt;name, 0, "Woke up: Conditional wait on white fops");</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/**</div><div class='add'>+ * TODO: these threads have many thing in common (wake up after</div><div class='add'>+ * a certain time etc..). move them into separate routine.</div><div class='add'>+ */</div><div class='add'>+void *</div><div class='add'>+changelog_rollover(void *data)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+    xlator_t *this = NULL;</div><div class='add'>+    struct timespec tv = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    changelog_log_data_t cld = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    changelog_time_slice_t *slice = NULL;</div><div class='add'>+    changelog_priv_t *priv = data;</div><div class='add'>+</div><div class='add'>+    this = priv-&gt;cr.this;</div><div class='add'>+    slice = &amp;priv-&gt;slice;</div><div class='add'>+</div><div class='add'>+    while (1) {</div><div class='add'>+        (void)pthread_testcancel();</div><div class='add'>+</div><div class='add'>+        tv.tv_sec = gf_time() + priv-&gt;rollover_time;</div><div class='add'>+        tv.tv_nsec = 0;</div><div class='add'>+        ret = 0; /* Reset ret to zero */</div><div class='add'>+</div><div class='add'>+        /* The race between actual rollover and explicit rollover is</div><div class='add'>+         * handled. If actual rollover is being done and the</div><div class='add'>+         * explicit rollover event comes, the event is not missed.</div><div class='add'>+         * Since explicit rollover sets 'cr.notify' to true, this</div><div class='add'>+         * thread doesn't wait on 'pthread_cond_timedwait'.</div><div class='add'>+         */</div><div class='add'>+        pthread_cleanup_push(changelog_cleanup_free_mutex, &amp;priv-&gt;cr.lock);</div><div class='add'>+        pthread_mutex_lock(&amp;priv-&gt;cr.lock);</div><div class='add'>+        {</div><div class='add'>+            while (ret == 0 &amp;&amp; !priv-&gt;cr.notify)</div><div class='add'>+                ret = pthread_cond_timedwait(&amp;priv-&gt;cr.cond, &amp;priv-&gt;cr.lock,</div><div class='add'>+                                             &amp;tv);</div><div class='add'>+            if (ret == 0)</div><div class='add'>+                priv-&gt;cr.notify = _gf_false;</div><div class='add'>+        }</div><div class='add'>+        pthread_mutex_unlock(&amp;priv-&gt;cr.lock);</div><div class='add'>+        pthread_cleanup_pop(0);</div><div class='add'>+</div><div class='add'>+        if (ret == 0) {</div><div class='add'>+            gf_smsg(this-&gt;name, GF_LOG_INFO, 0, CHANGELOG_MSG_BARRIER_INFO,</div><div class='add'>+                    NULL);</div><div class='add'>+            priv-&gt;explicit_rollover = _gf_true;</div><div class='add'>+        } else if (ret &amp;&amp; ret != ETIMEDOUT) {</div><div class='add'>+            gf_smsg(this-&gt;name, GF_LOG_ERROR, errno,</div><div class='add'>+                    CHANGELOG_MSG_SELECT_FAILED, NULL);</div><div class='add'>+            continue;</div><div class='add'>+        } else if (ret &amp;&amp; ret == ETIMEDOUT) {</div><div class='add'>+            gf_msg_debug(this-&gt;name, 0, "Wokeup on timeout");</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        /* Reading curent_color without lock is fine here</div><div class='add'>+         * as it is only modified here and is next to reading.</div><div class='add'>+         */</div><div class='add'>+        if (priv-&gt;current_color == FOP_COLOR_BLACK) {</div><div class='add'>+            LOCK(&amp;priv-&gt;lock);</div><div class='add'>+            priv-&gt;current_color = FOP_COLOR_WHITE;</div><div class='add'>+            UNLOCK(&amp;priv-&gt;lock);</div><div class='add'>+            gf_msg_debug(this-&gt;name, 0,</div><div class='add'>+                         "Black fops"</div><div class='add'>+                         " to be drained:%ld",</div><div class='add'>+                         priv-&gt;dm.black_fop_cnt);</div><div class='add'>+            changelog_drain_black_fops(this, priv);</div><div class='add'>+        } else {</div><div class='add'>+            LOCK(&amp;priv-&gt;lock);</div><div class='add'>+            priv-&gt;current_color = FOP_COLOR_BLACK;</div><div class='add'>+            UNLOCK(&amp;priv-&gt;lock);</div><div class='add'>+            gf_msg_debug(this-&gt;name, 0,</div><div class='add'>+                         "White fops"</div><div class='add'>+                         " to be drained:%ld",</div><div class='add'>+                         priv-&gt;dm.white_fop_cnt);</div><div class='add'>+            changelog_drain_white_fops(this, priv);</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        /* Adding delay of 1 second only during explicit rollover:</div><div class='add'>+         *</div><div class='add'>+         * Changelog rollover can happen either due to actual</div><div class='add'>+         * or the explicit rollover during snapshot. Actual</div><div class='add'>+         * rollover is controlled by tuneable called 'rollover-time'.</div><div class='add'>+         * The minimum granularity for rollover-time is 1 second.</div><div class='add'>+         * Explicit rollover is asynchronous in nature and happens</div><div class='add'>+         * during snapshot.</div><div class='add'>+         *</div><div class='add'>+         * Basically, rollover renames the current CHANGELOG file</div><div class='add'>+         * to CHANGELOG.TIMESTAMP. Let's assume, at time 't1',</div><div class='add'>+         * actual and explicit rollover raced against  each</div><div class='add'>+         * other and actual rollover won the race renaming the</div><div class='add'>+         * CHANGELOG file to CHANGELOG.t1 and opens a new</div><div class='add'>+         * CHANGELOG file. There is high chance that, an immediate</div><div class='add'>+         * explicit rollover at time 't1' can happen with in the same</div><div class='add'>+         * second to rename CHANGELOG file to CHANGELOG.t1 resulting in</div><div class='add'>+         * purging the earlier CHANGELOG.t1 file created by actual</div><div class='add'>+         * rollover. So adding a delay of 1 second guarantees unique</div><div class='add'>+         * CHANGELOG.TIMESTAMP during  explicit rollover.</div><div class='add'>+         */</div><div class='add'>+        if (priv-&gt;explicit_rollover == _gf_true)</div><div class='add'>+            sleep(1);</div><div class='add'>+</div><div class='add'>+        changelog_fill_rollover_data(&amp;cld, _gf_false);</div><div class='add'>+</div><div class='add'>+        _mask_cancellation();</div><div class='add'>+</div><div class='add'>+        LOCK(&amp;priv-&gt;lock);</div><div class='add'>+        {</div><div class='add'>+            ret = changelog_inject_single_event(this, priv, &amp;cld);</div><div class='add'>+            if (!ret)</div><div class='add'>+                SLICE_VERSION_UPDATE(slice);</div><div class='add'>+        }</div><div class='add'>+        UNLOCK(&amp;priv-&gt;lock);</div><div class='add'>+</div><div class='add'>+        _unmask_cancellation();</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return NULL;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void *</div><div class='add'>+changelog_fsync_thread(void *data)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+    xlator_t *this = NULL;</div><div class='add'>+    struct timeval tv = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    changelog_log_data_t cld = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    changelog_priv_t *priv = data;</div><div class='add'>+</div><div class='add'>+    this = priv-&gt;cf.this;</div><div class='add'>+    cld.cld_type = CHANGELOG_TYPE_FSYNC;</div><div class='add'>+</div><div class='add'>+    while (1) {</div><div class='add'>+        (void)pthread_testcancel();</div><div class='add'>+</div><div class='add'>+        tv.tv_sec = priv-&gt;fsync_interval;</div><div class='add'>+        tv.tv_usec = 0;</div><div class='add'>+</div><div class='add'>+        ret = select(0, NULL, NULL, NULL, &amp;tv);</div><div class='add'>+        if (ret)</div><div class='add'>+            continue;</div><div class='add'>+</div><div class='add'>+        _mask_cancellation();</div><div class='add'>+</div><div class='add'>+        ret = changelog_inject_single_event(this, priv, &amp;cld);</div><div class='add'>+        if (ret)</div><div class='add'>+            gf_smsg(this-&gt;name, GF_LOG_ERROR, 0,</div><div class='add'>+                    CHANGELOG_MSG_INJECT_FSYNC_FAILED, NULL);</div><div class='add'>+</div><div class='add'>+        _unmask_cancellation();</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return NULL;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* macros for inode/changelog version checks */</div><div class='add'>+</div><div class='add'>+#define INODE_VERSION_UPDATE(priv, inode, iver, slice, type)                   \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        LOCK(&amp;inode-&gt;lock);                                                    \</div><div class='add'>+        {                                                                      \</div><div class='add'>+            LOCK(&amp;priv-&gt;lock);                                                 \</div><div class='add'>+            {                                                                  \</div><div class='add'>+                *iver = slice-&gt;changelog_version[type];                        \</div><div class='add'>+            }                                                                  \</div><div class='add'>+            UNLOCK(&amp;priv-&gt;lock);                                               \</div><div class='add'>+        }                                                                      \</div><div class='add'>+        UNLOCK(&amp;inode-&gt;lock);                                                  \</div><div class='add'>+    } while (0)</div><div class='add'>+</div><div class='add'>+#define INODE_VERSION_EQUALS_SLICE(priv, ver, slice, type, upd)                \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        LOCK(&amp;priv-&gt;lock);                                                     \</div><div class='add'>+        {                                                                      \</div><div class='add'>+            upd = (ver == slice-&gt;changelog_version[type]) ? _gf_false          \</div><div class='add'>+                                                          : _gf_true;          \</div><div class='add'>+        }                                                                      \</div><div class='add'>+        UNLOCK(&amp;priv-&gt;lock);                                                   \</div><div class='add'>+    } while (0)</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+__changelog_inode_ctx_set(xlator_t *this, inode_t *inode,</div><div class='add'>+                          changelog_inode_ctx_t *ctx)</div><div class='add'>+{</div><div class='add'>+    uint64_t ctx_addr = (uint64_t)(uintptr_t)ctx;</div><div class='add'>+    return __inode_ctx_set(inode, this, &amp;ctx_addr);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/**</div><div class='add'>+ * one shot routine to get the address and the value of a inode version</div><div class='add'>+ * for a particular type.</div><div class='add'>+ */</div><div class='add'>+changelog_inode_ctx_t *</div><div class='add'>+__changelog_inode_ctx_get(xlator_t *this, inode_t *inode, unsigned long **iver,</div><div class='add'>+                          unsigned long *version, changelog_log_type type)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+    uint64_t ctx_addr = 0;</div><div class='add'>+    changelog_inode_ctx_t *ctx = NULL;</div><div class='add'>+</div><div class='add'>+    ret = __inode_ctx_get(inode, this, &amp;ctx_addr);</div><div class='add'>+    if (ret &lt; 0)</div><div class='add'>+        ctx_addr = 0;</div><div class='add'>+    if (ctx_addr != 0) {</div><div class='add'>+        ctx = (changelog_inode_ctx_t *)(long)ctx_addr;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ctx = GF_CALLOC(1, sizeof(*ctx), gf_changelog_mt_inode_ctx_t);</div><div class='add'>+    if (!ctx)</div><div class='add'>+        goto out;</div><div class='add'>+</div><div class='add'>+    ret = __changelog_inode_ctx_set(this, inode, ctx);</div><div class='add'>+    if (ret) {</div><div class='add'>+        GF_FREE(ctx);</div><div class='add'>+        ctx = NULL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    if (ctx &amp;&amp; iver &amp;&amp; version) {</div><div class='add'>+        *iver = CHANGELOG_INODE_VERSION_TYPE(ctx, type);</div><div class='add'>+        *version = **iver;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return ctx;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static changelog_inode_ctx_t *</div><div class='add'>+changelog_inode_ctx_get(xlator_t *this, inode_t *inode, unsigned long **iver,</div><div class='add'>+                        unsigned long *version, changelog_log_type type)</div><div class='add'>+{</div><div class='add'>+    changelog_inode_ctx_t *ctx = NULL;</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;inode-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        ctx = __changelog_inode_ctx_get(this, inode, iver, version, type);</div><div class='add'>+    }</div><div class='add'>+    UNLOCK(&amp;inode-&gt;lock);</div><div class='add'>+</div><div class='add'>+    return ctx;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/**</div><div class='add'>+ * This is the main update routine. Locking has been made granular so as to</div><div class='add'>+ * maximize parallelism of fops - I'll try to explain it below using execution</div><div class='add'>+ * timelines.</div><div class='add'>+ *</div><div class='add'>+ * Basically, the contention is between multiple execution threads of this</div><div class='add'>+ * routine and the roll-over thread. So, instead of having a big lock, we hold</div><div class='add'>+ * granular locks: inode-&gt;lock and priv-&gt;lock. Now I'll explain what happens</div><div class='add'>+ * when there is an update and a roll-over at just about the same time.</div><div class='add'>+ * NOTE:</div><div class='add'>+ *  - the dispatcher itself synchronizes updates via it's own lock</div><div class='add'>+ *  - the slice version in incremented by the roll-over thread</div><div class='add'>+ *</div><div class='add'>+ * Case 1: When the rollover thread wins before the inode version can be</div><div class='add'>+ * compared with the slice version.</div><div class='add'>+ *</div><div class='add'>+ *          [updater]                 |             [rollover]</div><div class='add'>+ *                                    |</div><div class='add'>+ *                                    |           &lt;SLICE: 1, 1, 1&gt;</div><div class='add'>+ * &lt;changelog_update&gt;                 |</div><div class='add'>+ *   &lt;changelog_inode_ctx_get&gt;        |</div><div class='add'>+ *      &lt;CTX: 1, 1, 1&gt;                |</div><div class='add'>+ *                                    |         &lt;dispatch-rollover-event&gt;</div><div class='add'>+ *                                    |         LOCK (&amp;priv-&gt;lock)</div><div class='add'>+ *                                    |            &lt;SLICE_VERSION_UPDATE&gt;</div><div class='add'>+ *                                    |              &lt;SLICE: 2, 2, 2&gt;</div><div class='add'>+ *                                    |         UNLOCK (&amp;priv-&gt;lock)</div><div class='add'>+ *                                    |</div><div class='add'>+ * LOCK (&amp;priv-&gt;lock)                 |</div><div class='add'>+ *   &lt;INODE_VERSION_EQUALS_SLICE&gt;     |</div><div class='add'>+ *    I: 1 &lt;-&gt; S: 2                   |</div><div class='add'>+ *    update: true                    |</div><div class='add'>+ * UNLOCK (&amp;priv-&gt;lock)               |</div><div class='add'>+ *                                    |</div><div class='add'>+ * &lt;if update == true&gt;                |</div><div class='add'>+ *  &lt;dispath-update-event&gt;            |</div><div class='add'>+ *  &lt;INODE_VERSION_UPDATE&gt;            |</div><div class='add'>+ *   LOCK (&amp;inode-&gt;lock)              |</div><div class='add'>+ *    LOCK (&amp;priv-&gt;lock)              |</div><div class='add'>+ *     &lt;CTX: 2, 1, 1&gt;                 |</div><div class='add'>+ *    UNLOCK (&amp;priv-&gt;lock)            |</div><div class='add'>+ *   UNLOCK (&amp;inode-&gt;lock)            |</div><div class='add'>+ *</div><div class='add'>+ * Therefore, the change gets recorded in the next change (no lost change). If</div><div class='add'>+ * the slice version was ahead of the inode version (say I:1, S: 2), then</div><div class='add'>+ * anyway the comparison would result in a update (I: 1, S: 3).</div><div class='add'>+ *</div><div class='add'>+ * If the rollover time is too less, then there is another contention when the</div><div class='add'>+ * updater tries to bring up inode version to the slice version (this is also</div><div class='add'>+ * the case when the roll-over thread wakes up during INODE_VERSION_UPDATE.</div><div class='add'>+ *</div><div class='add'>+ *   &lt;CTX: 1, 1, 1&gt;                   |       &lt;SLICE: 2, 2, 2&gt;</div><div class='add'>+ *                                    |</div><div class='add'>+ *                                    |</div><div class='add'>+ * &lt;dispath-update-event&gt;             |</div><div class='add'>+ * &lt;INODE_VERSION_UPDATE&gt;             |</div><div class='add'>+ *  LOCK (&amp;inode-&gt;lock)               |</div><div class='add'>+ *   LOCK (&amp;priv-&gt;lock)               |</div><div class='add'>+ *    &lt;CTX: 2, 1, 1&gt;                  |</div><div class='add'>+ *   UNLOCK (&amp;priv-&gt;lock)             |</div><div class='add'>+ *  UNLOCK (&amp;inode-&gt;lock)             |</div><div class='add'>+ *                                    |         &lt;dispatch-rollover-event&gt;</div><div class='add'>+ *                                    |         LOCK (&amp;priv-&gt;lock)</div><div class='add'>+ *                                    |            &lt;SLICE_VERSION_UPDATE&gt;</div><div class='add'>+ *                                    |              &lt;SLICE: 3, 3, 3&gt;</div><div class='add'>+ *                                    |         UNLOCK (&amp;priv-&gt;lock)</div><div class='add'>+ *</div><div class='add'>+ *</div><div class='add'>+ * Case 2: When the fop thread wins</div><div class='add'>+ *</div><div class='add'>+ *          [updater]                 |             [rollover]</div><div class='add'>+ *                                    |</div><div class='add'>+ *                                    |           &lt;SLICE: 1, 1, 1&gt;</div><div class='add'>+ * &lt;changelog_update&gt;                 |</div><div class='add'>+ *   &lt;changelog_inode_ctx_get&gt;        |</div><div class='add'>+ *      &lt;CTX: 0, 0, 0&gt;                |</div><div class='add'>+ *                                    |</div><div class='add'>+ * LOCK (&amp;priv-&gt;lock)                 |</div><div class='add'>+ *   &lt;INODE_VERSION_EQUALS_SLICE&gt;     |</div><div class='add'>+ *    I: 0 &lt;-&gt; S: 1                   |</div><div class='add'>+ *    update: true                    |</div><div class='add'>+ * UNLOCK (&amp;priv-&gt;lock)               |</div><div class='add'>+ *                                    |         &lt;dispatch-rollover-event&gt;</div><div class='add'>+ *                                    |         LOCK (&amp;priv-&gt;lock)</div><div class='add'>+ *                                    |            &lt;SLICE_VERSION_UPDATE&gt;</div><div class='add'>+ *                                    |              &lt;SLICE: 2, 2, 2&gt;</div><div class='add'>+ *                                    |         UNLOCK (&amp;priv-&gt;lock)</div><div class='add'>+ * &lt;if update == true&gt;                |</div><div class='add'>+ *  &lt;dispath-update-event&gt;            |</div><div class='add'>+ *  &lt;INODE_VERSION_UPDATE&gt;            |</div><div class='add'>+ *   LOCK (&amp;inode-&gt;lock)              |</div><div class='add'>+ *    LOCK (&amp;priv-&gt;lock)              |</div><div class='add'>+ *     &lt;CTX: 2, 0, 0&gt;                 |</div><div class='add'>+ *    UNLOCK (&amp;priv-&gt;lock)            |</div><div class='add'>+ *   UNLOCK (&amp;inode-&gt;lock)            |</div><div class='add'>+ *</div><div class='add'>+ * Here again, if the inode version was equal to the slice version (I: 1, S: 1)</div><div class='add'>+ * then there is no need to record an update (as the equality of the two version</div><div class='add'>+ * signifies an update was recorded in the current time slice).</div><div class='add'>+ */</div><div class='add'>+void</div><div class='add'>+changelog_update(xlator_t *this, changelog_priv_t *priv,</div><div class='add'>+                 changelog_local_t *local, changelog_log_type type)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+    unsigned long *iver = NULL;</div><div class='add'>+    unsigned long version = 0;</div><div class='add'>+    inode_t *inode = NULL;</div><div class='add'>+    changelog_time_slice_t *slice = NULL;</div><div class='add'>+    changelog_inode_ctx_t *ctx = NULL;</div><div class='add'>+    changelog_log_data_t *cld_0 = NULL;</div><div class='add'>+    changelog_log_data_t *cld_1 = NULL;</div><div class='add'>+    changelog_local_t *next_local = NULL;</div><div class='add'>+    gf_boolean_t need_upd = _gf_true;</div><div class='add'>+</div><div class='add'>+    slice = &amp;priv-&gt;slice;</div><div class='add'>+</div><div class='add'>+    /**</div><div class='add'>+     * for fops that do not require inode version checking</div><div class='add'>+     */</div><div class='add'>+    if (local-&gt;update_no_check)</div><div class='add'>+        goto update;</div><div class='add'>+</div><div class='add'>+    inode = local-&gt;inode;</div><div class='add'>+</div><div class='add'>+    ctx = changelog_inode_ctx_get(this, inode, &amp;iver, &amp;version, type);</div><div class='add'>+    if (!ctx)</div><div class='add'>+        goto update;</div><div class='add'>+</div><div class='add'>+    INODE_VERSION_EQUALS_SLICE(priv, version, slice, type, need_upd);</div><div class='add'>+</div><div class='add'>+update:</div><div class='add'>+    if (need_upd) {</div><div class='add'>+        cld_0 = &amp;local-&gt;cld;</div><div class='add'>+        cld_0-&gt;cld_type = type;</div><div class='add'>+</div><div class='add'>+        if ((next_local = local-&gt;prev_entry) != NULL) {</div><div class='add'>+            cld_1 = &amp;next_local-&gt;cld;</div><div class='add'>+            cld_1-&gt;cld_type = type;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        ret = priv-&gt;cd.dispatchfn(this, priv, priv-&gt;cd.cd_data, cld_0, cld_1);</div><div class='add'>+</div><div class='add'>+        /**</div><div class='add'>+         * update after the dispatcher has successfully done</div><div class='add'>+         * it's job.</div><div class='add'>+         */</div><div class='add'>+        if (!local-&gt;update_no_check &amp;&amp; iver &amp;&amp; !ret)</div><div class='add'>+            INODE_VERSION_UPDATE(priv, inode, iver, slice, type);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* Begin: Geo-rep snapshot dependency changes */</div><div class='add'>+</div><div class='add'>+/* changelog_color_fop_and_inc_cnt: Assign color and inc fop cnt.</div><div class='add'>+ *</div><div class='add'>+ * Assigning color and increment of corresponding fop count should happen</div><div class='add'>+ * in a lock (i.e., there should be no window between them). If it does not,</div><div class='add'>+ * we might miss draining those fops which are colored but not yet incremented</div><div class='add'>+ * the count. Let's assume black fops are draining. If the black fop count</div><div class='add'>+ * reaches zero, we say draining is completed but we miss black fops which are</div><div class='add'>+ * not incremented fop count but color is assigned black.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+changelog_color_fop_and_inc_cnt(xlator_t *this, changelog_priv_t *priv,</div><div class='add'>+                                changelog_local_t *local)</div><div class='add'>+{</div><div class='add'>+    if (!priv || !local)</div><div class='add'>+        return;</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;priv-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        local-&gt;color = priv-&gt;current_color;</div><div class='add'>+        changelog_inc_fop_cnt(this, priv, local);</div><div class='add'>+    }</div><div class='add'>+    UNLOCK(&amp;priv-&gt;lock);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* Increments the respective fop counter based on the fop color */</div><div class='add'>+void</div><div class='add'>+changelog_inc_fop_cnt(xlator_t *this, changelog_priv_t *priv,</div><div class='add'>+                      changelog_local_t *local)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    if (local) {</div><div class='add'>+        if (local-&gt;color == FOP_COLOR_BLACK) {</div><div class='add'>+            ret = pthread_mutex_lock(&amp;priv-&gt;dm.drain_black_mutex);</div><div class='add'>+            CHANGELOG_PTHREAD_ERROR_HANDLE_0(ret, out);</div><div class='add'>+            {</div><div class='add'>+                priv-&gt;dm.black_fop_cnt++;</div><div class='add'>+            }</div><div class='add'>+            ret = pthread_mutex_unlock(&amp;priv-&gt;dm.drain_black_mutex);</div><div class='add'>+            CHANGELOG_PTHREAD_ERROR_HANDLE_0(ret, out);</div><div class='add'>+        } else {</div><div class='add'>+            ret = pthread_mutex_lock(&amp;priv-&gt;dm.drain_white_mutex);</div><div class='add'>+            CHANGELOG_PTHREAD_ERROR_HANDLE_0(ret, out);</div><div class='add'>+            {</div><div class='add'>+                priv-&gt;dm.white_fop_cnt++;</div><div class='add'>+            }</div><div class='add'>+            ret = pthread_mutex_unlock(&amp;priv-&gt;dm.drain_white_mutex);</div><div class='add'>+            CHANGELOG_PTHREAD_ERROR_HANDLE_0(ret, out);</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+out:</div><div class='add'>+    return;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* Decrements the respective fop counter based on the fop color */</div><div class='add'>+void</div><div class='add'>+changelog_dec_fop_cnt(xlator_t *this, changelog_priv_t *priv,</div><div class='add'>+                      changelog_local_t *local)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    if (local) {</div><div class='add'>+        if (local-&gt;color == FOP_COLOR_BLACK) {</div><div class='add'>+            ret = pthread_mutex_lock(&amp;priv-&gt;dm.drain_black_mutex);</div><div class='add'>+            CHANGELOG_PTHREAD_ERROR_HANDLE_0(ret, out);</div><div class='add'>+            {</div><div class='add'>+                priv-&gt;dm.black_fop_cnt--;</div><div class='add'>+                if (priv-&gt;dm.black_fop_cnt == 0 &amp;&amp;</div><div class='add'>+                    priv-&gt;dm.drain_wait_black == _gf_true) {</div><div class='add'>+                    ret = pthread_cond_signal(&amp;priv-&gt;dm.drain_black_cond);</div><div class='add'>+                    CHANGELOG_PTHREAD_ERROR_HANDLE_2(</div><div class='add'>+                        ret, out, priv-&gt;dm.drain_black_mutex);</div><div class='add'>+                    gf_msg_debug(this-&gt;name, 0,</div><div class='add'>+                                 "Signalled "</div><div class='add'>+                                 "draining of black");</div><div class='add'>+                }</div><div class='add'>+            }</div><div class='add'>+            ret = pthread_mutex_unlock(&amp;priv-&gt;dm.drain_black_mutex);</div><div class='add'>+            CHANGELOG_PTHREAD_ERROR_HANDLE_0(ret, out);</div><div class='add'>+        } else {</div><div class='add'>+            ret = pthread_mutex_lock(&amp;priv-&gt;dm.drain_white_mutex);</div><div class='add'>+            CHANGELOG_PTHREAD_ERROR_HANDLE_0(ret, out);</div><div class='add'>+            {</div><div class='add'>+                priv-&gt;dm.white_fop_cnt--;</div><div class='add'>+                if (priv-&gt;dm.white_fop_cnt == 0 &amp;&amp;</div><div class='add'>+                    priv-&gt;dm.drain_wait_white == _gf_true) {</div><div class='add'>+                    ret = pthread_cond_signal(&amp;priv-&gt;dm.drain_white_cond);</div><div class='add'>+                    CHANGELOG_PTHREAD_ERROR_HANDLE_2(</div><div class='add'>+                        ret, out, priv-&gt;dm.drain_white_mutex);</div><div class='add'>+                    gf_msg_debug(this-&gt;name, 0,</div><div class='add'>+                                 "Signalled "</div><div class='add'>+                                 "draining of white");</div><div class='add'>+                }</div><div class='add'>+            }</div><div class='add'>+            ret = pthread_mutex_unlock(&amp;priv-&gt;dm.drain_white_mutex);</div><div class='add'>+            CHANGELOG_PTHREAD_ERROR_HANDLE_0(ret, out);</div><div class='add'>+        }</div><div class='add'>+    }</div><div class='add'>+out:</div><div class='add'>+    return;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* Write to a pipe setup between changelog main thread and changelog</div><div class='add'>+ * rollover thread to initiate explicit rollover of changelog journal.</div><div class='add'>+ */</div><div class='add'>+int</div><div class='add'>+changelog_barrier_notify(changelog_priv_t *priv, char *buf)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    pthread_mutex_lock(&amp;priv-&gt;cr.lock);</div><div class='add'>+    {</div><div class='add'>+        ret = pthread_cond_signal(&amp;priv-&gt;cr.cond);</div><div class='add'>+        priv-&gt;cr.notify = _gf_true;</div><div class='add'>+    }</div><div class='add'>+    pthread_mutex_unlock(&amp;priv-&gt;cr.lock);</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* Clean up flags set on barrier notification */</div><div class='add'>+void</div><div class='add'>+changelog_barrier_cleanup(xlator_t *this, changelog_priv_t *priv,</div><div class='add'>+                          struct list_head *queue)</div><div class='add'>+{</div><div class='add'>+    int ret = 0;</div><div class='add'>+</div><div class='add'>+    LOCK(&amp;priv-&gt;bflags.lock);</div><div class='add'>+    priv-&gt;bflags.barrier_ext = _gf_false;</div><div class='add'>+    UNLOCK(&amp;priv-&gt;bflags.lock);</div><div class='add'>+</div><div class='add'>+    ret = pthread_mutex_lock(&amp;priv-&gt;bn.bnotify_mutex);</div><div class='add'>+    CHANGELOG_PTHREAD_ERROR_HANDLE_0(ret, out);</div><div class='add'>+    {</div><div class='add'>+        priv-&gt;bn.bnotify = _gf_false;</div><div class='add'>+    }</div><div class='add'>+    ret = pthread_mutex_unlock(&amp;priv-&gt;bn.bnotify_mutex);</div><div class='add'>+    CHANGELOG_PTHREAD_ERROR_HANDLE_0(ret, out);</div><div class='add'>+</div><div class='add'>+    /* Disable changelog barrier and dequeue fops */</div><div class='add'>+    LOCK(&amp;priv-&gt;lock);</div><div class='add'>+    {</div><div class='add'>+        if (priv-&gt;barrier_enabled == _gf_true)</div><div class='add'>+            __chlog_barrier_disable(this, queue);</div><div class='add'>+        else</div><div class='add'>+            ret = -1;</div><div class='add'>+    }</div><div class='add'>+    UNLOCK(&amp;priv-&gt;lock);</div><div class='add'>+    if (ret == 0)</div><div class='add'>+        chlog_barrier_dequeue_all(this, queue);</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return;</div><div class='add'>+}</div><div class='add'>+/* End: Geo-Rep snapshot dependency changes */</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+changelog_fill_entry_buf(call_frame_t *frame, xlator_t *this, loc_t *loc,</div><div class='add'>+                         changelog_local_t **local)</div><div class='add'>+{</div><div class='add'>+    changelog_opt_t *co = NULL;</div><div class='add'>+    size_t xtra_len = 0;</div><div class='add'>+    char *dup_path = NULL;</div><div class='add'>+    char *bname = NULL;</div><div class='add'>+    inode_t *parent = NULL;</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(this);</div><div class='add'>+</div><div class='add'>+    parent = inode_parent(loc-&gt;inode, 0, 0);</div><div class='add'>+    if (!parent) {</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_ERROR, errno, CHANGELOG_MSG_INODE_NOT_FOUND,</div><div class='add'>+                "type=parent", "gfid=%s", uuid_utoa(loc-&gt;inode-&gt;gfid), NULL);</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    CHANGELOG_INIT_NOCHECK(this, *local, loc-&gt;inode, loc-&gt;inode-&gt;gfid, 5);</div><div class='add'>+    if (!(*local)) {</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_ERROR, 0, CHANGELOG_MSG_LOCAL_INIT_FAILED,</div><div class='add'>+                NULL);</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    co = changelog_get_usable_buffer(*local);</div><div class='add'>+    if (!co) {</div><div class='add'>+        gf_smsg(this-&gt;name, GF_LOG_ERROR, 0, CHANGELOG_MSG_GET_BUFFER_FAILED,</div><div class='add'>+                NULL);</div><div class='add'>+        goto err;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (loc-&gt;inode-&gt;ia_type == IA_IFDIR) {</div><div class='add'>+        CHANGLOG_FILL_FOP_NUMBER(co, GF_FOP_MKDIR, fop_fn, xtra_len);</div><div class='add'>+        co++;</div><div class='add'>+        CHANGELOG_FILL_UINT32(co, S_IFDIR | 0755, number_fn, xtra_len);</div><div class='add'>+        co++;</div><div class='add'>+    } else {</div><div class='add'>+        CHANGLOG_FILL_FOP_NUMBER(co, GF_FOP_CREATE, fop_fn, xtra_len);</div><div class='add'>+        co++;</div><div class='add'>+        CHANGELOG_FILL_UINT32(co, S_IFREG | 0644, number_fn, xtra_len);</div><div class='add'>+        co++;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    CHANGELOG_FILL_UINT32(co, frame-&gt;root-&gt;uid, number_fn, xtra_len);</div><div class='add'>+    co++;</div><div class='add'>+</div><div class='add'>+    CHANGELOG_FILL_UINT32(co, frame-&gt;root-&gt;gid, number_fn, xtra_len);</div><div class='add'>+    co++;</div><div class='add'>+</div><div class='add'>+    dup_path = gf_strdup(loc-&gt;path);</div><div class='add'>+    bname = basename(dup_path);</div><div class='add'>+</div><div class='add'>+    CHANGELOG_FILL_ENTRY(co, parent-&gt;gfid, bname, entry_fn, entry_free_fn,</div><div class='add'>+                         xtra_len, err);</div><div class='add'>+    changelog_set_usable_record_and_length(*local, xtra_len, 5);</div><div class='add'>+</div><div class='add'>+    if (dup_path)</div><div class='add'>+        GF_FREE(dup_path);</div><div class='add'>+    if (parent)</div><div class='add'>+        inode_unref(parent);</div><div class='add'>+    return 0;</div><div class='add'>+</div><div class='add'>+err:</div><div class='add'>+    if (dup_path)</div><div class='add'>+        GF_FREE(dup_path);</div><div class='add'>+    if (parent)</div><div class='add'>+        inode_unref(parent);</div><div class='add'>+    return -1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+ * resolve_pargfid_to_path:</div><div class='add'>+ *      It converts given pargfid to path by doing recursive readlinks at the</div><div class='add'>+ * backend. If bname is given, it suffixes bname to pargfid to form the</div><div class='add'>+ * complete path else it doesn't. It allocates memory for the path and is</div><div class='add'>+ * caller's responsibility to free the same. If bname is NULL and pargfid</div><div class='add'>+ * is ROOT, then it returns "."</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+resolve_pargfid_to_path(xlator_t *this, const uuid_t pgfid, char **path,</div><div class='add'>+                        char *bname)</div><div class='add'>+{</div><div class='add'>+    char *linkname = NULL;</div><div class='add'>+    char *dir_handle = NULL;</div><div class='add'>+    char *pgfidstr = NULL;</div><div class='add'>+    char *saveptr = NULL;</div><div class='add'>+    ssize_t len = 0;</div><div class='add'>+    int ret = 0;</div><div class='add'>+    uuid_t tmp_gfid = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    uuid_t pargfid = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    changelog_priv_t *priv = NULL;</div><div class='add'>+    char gpath[PATH_MAX] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    char result[PATH_MAX] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+    char *dir_name = NULL;</div><div class='add'>+    char pre_dir_name[PATH_MAX] = {</div><div class='add'>+        0,</div><div class='add'>+    };</div><div class='add'>+</div><div class='add'>+    GF_ASSERT(this);</div><div class='add'>+    priv = this-&gt;private;</div><div class='add'>+    GF_ASSERT(priv);</div><div class='add'>+</div><div class='add'>+    gf_uuid_copy(pargfid, pgfid);</div><div class='add'>+    if (!path || gf_uuid_is_null(pargfid)) {</div><div class='add'>+        ret = -1;</div><div class='add'>+        goto out;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (__is_root_gfid(pargfid)) {</div><div class='add'>+        if (bname)</div><div class='add'>+            *path = gf_strdup(bname);</div><div class='add'>+        else</div><div class='add'>+            *path = gf_strdup(".");</div><div class='add'>+        return ret;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    dir_handle = alloca(PATH_MAX);</div><div class='add'>+    linkname = alloca(PATH_MAX);</div><div class='add'>+    (void)snprintf(gpath, PATH_MAX, "%s/.glusterfs/", priv-&gt;changelog_brick);</div><div class='add'>+</div><div class='add'>+    while (!(__is_root_gfid(pargfid))) {</div><div class='add'>+        len = snprintf(dir_handle, PATH_MAX, "%s/%02x/%02x/%s", gpath,</div><div class='add'>+                       pargfid[0], pargfid[1], uuid_utoa(pargfid));</div><div class='add'>+        if ((len &lt; 0) || (len &gt;= PATH_MAX)) {</div><div class='add'>+            ret = -1;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        len = sys_readlink(dir_handle, linkname, PATH_MAX);</div><div class='add'>+        if (len &lt; 0) {</div><div class='add'>+            gf_smsg(this-&gt;name, GF_LOG_ERROR, errno,</div><div class='add'>+                    CHANGELOG_MSG_READLINK_OP_FAILED,</div><div class='add'>+                    "could not read the "</div><div class='add'>+                    "link from the gfid handle",</div><div class='add'>+                    "handle=%s", dir_handle, NULL);</div><div class='add'>+            ret = -1;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        linkname[len] = '\0';</div><div class='add'>+</div><div class='add'>+        pgfidstr = strtok_r(linkname + strlen("../../00/00/"), "/", &amp;saveptr);</div><div class='add'>+        dir_name = strtok_r(NULL, "/", &amp;saveptr);</div><div class='add'>+</div><div class='add'>+        len = snprintf(result, PATH_MAX, "%s/%s", dir_name, pre_dir_name);</div><div class='add'>+        if ((len &lt; 0) || (len &gt;= PATH_MAX)) {</div><div class='add'>+            ret = -1;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+        if (snprintf(pre_dir_name, len + 1, "%s", result) &gt;= len + 1) {</div><div class='add'>+            ret = -1;</div><div class='add'>+            goto out;</div><div class='add'>+        }</div><div class='add'>+</div><div class='add'>+        gf_uuid_parse(pgfidstr, tmp_gfid);</div><div class='add'>+        gf_uuid_copy(pargfid, tmp_gfid);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (bname)</div><div class='add'>+        strncat(result, bname, strlen(bname) + 1);</div><div class='add'>+</div><div class='add'>+    *path = gf_strdup(result);</div><div class='add'>+</div><div class='add'>+out:</div><div class='add'>+    return ret;</div><div class='add'>+}</div><div class='head'>diff --git a/xlators/features/changelog/src/changelog-helpers.h b/xlators/features/changelog/src/changelog-helpers.h<br/>new file mode 100644<br/>index 00000000000..38fa7590c32<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/xlators/features/changelog/src/changelog-helpers.h?id=d1d7a6f35c816822fab51c820e25023863c239c1'>xlators/features/changelog/src/changelog-helpers.h</a></div><div class='hunk'>@@ -0,0 +1,716 @@</div><div class='add'>+/*</div><div class='add'>+   Copyright (c) 2013 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+   This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+   This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+   General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+   later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+   cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#ifndef _CHANGELOG_HELPERS_H</div><div class='add'>+#define _CHANGELOG_HELPERS_H</div><div class='add'>+</div><div class='add'>+#include &lt;glusterfs/locking.h&gt;</div><div class='add'>+#include &lt;glusterfs/timer.h&gt;</div><div class='add'>+#include "pthread.h"</div><div class='add'>+#include &lt;glusterfs/iobuf.h&gt;</div><div class='add'>+#include &lt;glusterfs/rot-buffs.h&gt;</div><div class='add'>+</div><div class='add'>+#include "changelog-misc.h"</div><div class='add'>+#include &lt;glusterfs/call-stub.h&gt;</div><div class='add'>+</div><div class='add'>+#include "rpcsvc.h"</div><div class='add'>+#include "changelog-ev-handle.h"</div><div class='add'>+</div><div class='add'>+#include "changelog.h"</div><div class='add'>+#include "changelog-messages.h"</div><div class='add'>+</div><div class='add'>+/**</div><div class='add'>+ * the changelog entry</div><div class='add'>+ */</div><div class='add'>+typedef struct changelog_log_data {</div><div class='add'>+    /* rollover related */</div><div class='add'>+    time_t cld_roll_time;</div><div class='add'>+</div><div class='add'>+    /* reopen changelog? */</div><div class='add'>+    gf_boolean_t cld_finale;</div><div class='add'>+</div><div class='add'>+    changelog_log_type cld_type;</div><div class='add'>+</div><div class='add'>+    /**</div><div class='add'>+     * sincd gfid is _always_ a necessity, it's not a part</div><div class='add'>+     * of the iobuf. by doing this we do not add any overhead</div><div class='add'>+     * for data and metadata related fops.</div><div class='add'>+     */</div><div class='add'>+    uuid_t cld_gfid;</div><div class='add'>+</div><div class='add'>+    /**</div><div class='add'>+     * iobufs are used for optionals records: pargfid, path,</div><div class='add'>+     * write offsets etc.. It's the fop implementers job</div><div class='add'>+     * to allocate (iobuf_get() in the fop) and get unref'ed</div><div class='add'>+     * in the callback (CHANGELOG_STACK_UNWIND).</div><div class='add'>+     */</div><div class='add'>+    struct iobuf *cld_iobuf;</div><div class='add'>+</div><div class='add'>+#define cld_ptr cld_iobuf-&gt;ptr</div><div class='add'>+</div><div class='add'>+    /**</div><div class='add'>+     * after allocation you can point this to the length of</div><div class='add'>+     * usable data, but make sure it does not exceed the</div><div class='add'>+     * the size of the requested iobuf.</div><div class='add'>+     */</div><div class='add'>+    size_t cld_iobuf_len;</div><div class='add'>+</div><div class='add'>+#define cld_ptr_len cld_iobuf_len</div><div class='add'>+</div><div class='add'>+    /**</div><div class='add'>+     * number of optional records</div><div class='add'>+     */</div><div class='add'>+    int cld_xtra_records;</div><div class='add'>+} changelog_log_data_t;</div><div class='add'>+</div><div class='add'>+/**</div><div class='add'>+ * holder for dispatch function and private data</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+typedef struct changelog_priv changelog_priv_t;</div><div class='add'>+</div><div class='add'>+typedef struct changelog_dispatcher {</div><div class='add'>+    void *cd_data;</div><div class='add'>+    int (*dispatchfn)(xlator_t *, changelog_priv_t *, void *,</div><div class='add'>+                      changelog_log_data_t *, changelog_log_data_t *);</div><div class='add'>+} changelog_dispatcher_t;</div><div class='add'>+</div><div class='add'>+struct changelog_bootstrap {</div><div class='add'>+    changelog_mode_t mode;</div><div class='add'>+    int (*ctor)(xlator_t *, changelog_dispatcher_t *);</div><div class='add'>+    int (*dtor)(xlator_t *, changelog_dispatcher_t *);</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct changelog_encoder {</div><div class='add'>+    changelog_encoder_t encoder;</div><div class='add'>+    int (*encode)(xlator_t *, changelog_log_data_t *);</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+/* xlator private */</div><div class='add'>+</div><div class='add'>+typedef struct changelog_time_slice {</div><div class='add'>+    /**</div><div class='add'>+     * version of changelog file, incremented each time changes</div><div class='add'>+     * rollover.</div><div class='add'>+     */</div><div class='add'>+    unsigned long changelog_version[CHANGELOG_MAX_TYPE];</div><div class='add'>+} changelog_time_slice_t;</div><div class='add'>+</div><div class='add'>+typedef struct changelog_rollover {</div><div class='add'>+    /* rollover thread */</div><div class='add'>+    pthread_t rollover_th;</div><div class='add'>+</div><div class='add'>+    xlator_t *this;</div><div class='add'>+</div><div class='add'>+    pthread_mutex_t lock;</div><div class='add'>+    pthread_cond_t cond;</div><div class='add'>+    gf_boolean_t notify;</div><div class='add'>+} changelog_rollover_t;</div><div class='add'>+</div><div class='add'>+typedef struct changelog_fsync {</div><div class='add'>+    /* fsync() thread */</div><div class='add'>+    pthread_t fsync_th;</div><div class='add'>+</div><div class='add'>+    xlator_t *this;</div><div class='add'>+} changelog_fsync_t;</div><div class='add'>+</div><div class='add'>+/* Draining during changelog rollover (for geo-rep snapshot dependency):</div><div class='add'>+ * --------------------------------------------------------------------</div><div class='add'>+ * The introduction of draining of in-transit fops during changelog rollover</div><div class='add'>+ * (both explicit/timeout triggered) requires coloring of fops. Basically the</div><div class='add'>+ * implementation requires two counters, one counter which keeps the count of</div><div class='add'>+ * current intransit fops which should end up in current changelog and the other</div><div class='add'>+ * counter to keep track of incoming fops which should be drained as part of</div><div class='add'>+ * next changelog rollover event. The fops are colored w.r.t these counters.</div><div class='add'>+ * The fops that are to be drained as part of current changelog rollover is</div><div class='add'>+ * given one color and the fops which keep incoming during this and not</div><div class='add'>+ * necessarily should end up in current changelog and should be drained as part</div><div class='add'>+ * of next changelog rollover are given other color. The color switching</div><div class='add'>+ * continues with each changelog rollover. Two colors(black and white) are</div><div class='add'>+ * chosen here and initially black is chosen is default.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+typedef enum chlog_fop_color {</div><div class='add'>+    FOP_COLOR_BLACK,</div><div class='add'>+    FOP_COLOR_WHITE</div><div class='add'>+} chlog_fop_color_t;</div><div class='add'>+</div><div class='add'>+/* Barrier notify variable */</div><div class='add'>+typedef struct barrier_notify {</div><div class='add'>+    pthread_mutex_t bnotify_mutex;</div><div class='add'>+    pthread_cond_t bnotify_cond;</div><div class='add'>+    gf_boolean_t bnotify;</div><div class='add'>+    gf_boolean_t bnotify_error;</div><div class='add'>+} barrier_notify_t;</div><div class='add'>+</div><div class='add'>+/* Two separate mutex and conditional variable set is used</div><div class='add'>+ * to drain white and black fops. */</div><div class='add'>+</div><div class='add'>+typedef struct drain_mgmt {</div><div class='add'>+    pthread_mutex_t drain_black_mutex;</div><div class='add'>+    pthread_cond_t drain_black_cond;</div><div class='add'>+    pthread_mutex_t drain_white_mutex;</div><div class='add'>+    pthread_cond_t drain_white_cond;</div><div class='add'>+    /* Represents black fops count in-transit */</div><div class='add'>+    unsigned long black_fop_cnt;</div><div class='add'>+    /* Represents white fops count in-transit */</div><div class='add'>+    unsigned long white_fop_cnt;</div><div class='add'>+    gf_boolean_t drain_wait_black;</div><div class='add'>+    gf_boolean_t drain_wait_white;</div><div class='add'>+} drain_mgmt_t;</div><div class='add'>+</div><div class='add'>+/* External barrier as a result of snap on/off indicating flag*/</div><div class='add'>+typedef struct barrier_flags {</div><div class='add'>+    gf_lock_t lock;</div><div class='add'>+    gf_boolean_t barrier_ext;</div><div class='add'>+} barrier_flags_t;</div><div class='add'>+</div><div class='add'>+/* Event selection */</div><div class='add'>+typedef struct changelog_ev_selector {</div><div class='add'>+    gf_lock_t reflock;</div><div class='add'>+</div><div class='add'>+    /**</div><div class='add'>+     * Array of references for each selection bit.</div><div class='add'>+     */</div><div class='add'>+    unsigned int ref[CHANGELOG_EV_SELECTION_RANGE];</div><div class='add'>+} changelog_ev_selector_t;</div><div class='add'>+</div><div class='add'>+/* changelog's private structure */</div><div class='add'>+struct changelog_priv {</div><div class='add'>+    /* changelog journalling */</div><div class='add'>+    gf_boolean_t active;</div><div class='add'>+</div><div class='add'>+    /* changelog live notifications */</div><div class='add'>+    gf_boolean_t rpc_active;</div><div class='add'>+</div><div class='add'>+    /* to generate unique socket file per brick */</div><div class='add'>+    char *changelog_brick;</div><div class='add'>+</div><div class='add'>+    /* logging directory */</div><div class='add'>+    char *changelog_dir;</div><div class='add'>+</div><div class='add'>+    /* htime directory */</div><div class='add'>+    char *htime_dir;</div><div class='add'>+</div><div class='add'>+    /* one file for all changelog types */</div><div class='add'>+    int changelog_fd;</div><div class='add'>+</div><div class='add'>+    /* htime fd for current changelog session */</div><div class='add'>+    int htime_fd;</div><div class='add'>+</div><div class='add'>+    /*  c_snap_fd is fd for call-path changelog */</div><div class='add'>+    int c_snap_fd;</div><div class='add'>+</div><div class='add'>+    /* rollover_count used by htime */</div><div class='add'>+    int rollover_count;</div><div class='add'>+</div><div class='add'>+    gf_lock_t lock;</div><div class='add'>+</div><div class='add'>+    /*  lock to synchronize CSNAP updation */</div><div class='add'>+    gf_lock_t c_snap_lock;</div><div class='add'>+</div><div class='add'>+    /* written end of the pipe */</div><div class='add'>+    int wfd;</div><div class='add'>+</div><div class='add'>+    /* rollover time */</div><div class='add'>+    int32_t rollover_time;</div><div class='add'>+</div><div class='add'>+    /* fsync() interval */</div><div class='add'>+    int32_t fsync_interval;</div><div class='add'>+</div><div class='add'>+    /* changelog type maps */</div><div class='add'>+    const char *maps[CHANGELOG_MAX_TYPE];</div><div class='add'>+</div><div class='add'>+    /* time slicer */</div><div class='add'>+    changelog_time_slice_t slice;</div><div class='add'>+</div><div class='add'>+    /* context of the updater */</div><div class='add'>+    changelog_dispatcher_t cd;</div><div class='add'>+</div><div class='add'>+    /* context of the rollover thread */</div><div class='add'>+    changelog_rollover_t cr;</div><div class='add'>+</div><div class='add'>+    /* context of fsync thread */</div><div class='add'>+    changelog_fsync_t cf;</div><div class='add'>+</div><div class='add'>+    /* operation mode */</div><div class='add'>+    changelog_mode_t op_mode;</div><div class='add'>+</div><div class='add'>+    /* bootstrap routine for 'current' logger */</div><div class='add'>+    struct changelog_bootstrap *cb;</div><div class='add'>+</div><div class='add'>+    /* encoder mode */</div><div class='add'>+    changelog_encoder_t encode_mode;</div><div class='add'>+</div><div class='add'>+    /* encoder */</div><div class='add'>+    struct changelog_encoder *ce;</div><div class='add'>+</div><div class='add'>+    /**</div><div class='add'>+     * snapshot dependency changes</div><div class='add'>+     */</div><div class='add'>+</div><div class='add'>+    /* Draining of fops*/</div><div class='add'>+    drain_mgmt_t dm;</div><div class='add'>+</div><div class='add'>+    /* Represents the active color. Initially by default black */</div><div class='add'>+    chlog_fop_color_t current_color;</div><div class='add'>+</div><div class='add'>+    /* flag to determine explicit rollover is triggered */</div><div class='add'>+    gf_boolean_t explicit_rollover;</div><div class='add'>+</div><div class='add'>+    /* barrier notification variable protected by mutex */</div><div class='add'>+    barrier_notify_t bn;</div><div class='add'>+</div><div class='add'>+    /* barrier on/off indicating flags */</div><div class='add'>+    barrier_flags_t bflags;</div><div class='add'>+</div><div class='add'>+    /* changelog barrier on/off indicating flag */</div><div class='add'>+    gf_boolean_t barrier_enabled;</div><div class='add'>+    struct list_head queue;</div><div class='add'>+    uint32_t queue_size;</div><div class='add'>+    gf_timer_t *timer;</div><div class='add'>+    struct timespec timeout;</div><div class='add'>+</div><div class='add'>+    /**</div><div class='add'>+     * buffers, RPC, event selection, notifications and other</div><div class='add'>+     * beasts.</div><div class='add'>+     */</div><div class='add'>+</div><div class='add'>+    /* epoll pthread */</div><div class='add'>+    pthread_t poller;</div><div class='add'>+</div><div class='add'>+    /* rotational buffer */</div><div class='add'>+    rbuf_t *rbuf;</div><div class='add'>+</div><div class='add'>+    /* changelog RPC server */</div><div class='add'>+    rpcsvc_t *rpc;</div><div class='add'>+</div><div class='add'>+    /* event selection */</div><div class='add'>+    changelog_ev_selector_t ev_selection;</div><div class='add'>+</div><div class='add'>+    /* client handling (reverse connection) */</div><div class='add'>+    pthread_t connector;</div><div class='add'>+</div><div class='add'>+    int nr_dispatchers;</div><div class='add'>+    pthread_t *ev_dispatcher;</div><div class='add'>+</div><div class='add'>+    changelog_clnt_t connections;</div><div class='add'>+</div><div class='add'>+    /* glusterfind dependency to capture paths on deleted entries*/</div><div class='add'>+    gf_boolean_t capture_del_path;</div><div class='add'>+</div><div class='add'>+    /* Save total no. of listners */</div><div class='add'>+    gf_atomic_t listnercnt;</div><div class='add'>+</div><div class='add'>+    /* Save total no. of xprt are associated with listner */</div><div class='add'>+    gf_atomic_t xprtcnt;</div><div class='add'>+</div><div class='add'>+    /* Save xprt list */</div><div class='add'>+    struct list_head xprt_list;</div><div class='add'>+</div><div class='add'>+    /* Save total no. of client connection */</div><div class='add'>+    gf_atomic_t clntcnt;</div><div class='add'>+</div><div class='add'>+    /* Save cleanup brick in victim */</div><div class='add'>+    xlator_t *victim;</div><div class='add'>+</div><div class='add'>+    /* Status to save cleanup notify status */</div><div class='add'>+    gf_boolean_t notify_down;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct changelog_local {</div><div class='add'>+    inode_t *inode;</div><div class='add'>+    gf_boolean_t update_no_check;</div><div class='add'>+</div><div class='add'>+    changelog_log_data_t cld;</div><div class='add'>+</div><div class='add'>+    /**</div><div class='add'>+     * -&gt;prev_entry is used in cases when there needs to be</div><div class='add'>+     * additional changelog entry for the parent (eg. rename)</div><div class='add'>+     * It's analogous to -&gt;next in single linked list world,</div><div class='add'>+     * but we call it as -&gt;prev_entry... ha ha ha</div><div class='add'>+     */</div><div class='add'>+    struct changelog_local *prev_entry;</div><div class='add'>+</div><div class='add'>+    /* snap dependency changes */</div><div class='add'>+    chlog_fop_color_t color;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+typedef struct changelog_local changelog_local_t;</div><div class='add'>+</div><div class='add'>+/* inode version is stored in inode ctx */</div><div class='add'>+typedef struct changelog_inode_ctx {</div><div class='add'>+    unsigned long iversion[CHANGELOG_MAX_TYPE];</div><div class='add'>+} changelog_inode_ctx_t;</div><div class='add'>+</div><div class='add'>+#define CHANGELOG_INODE_VERSION_TYPE(ctx, type) &amp;(ctx-&gt;iversion[type])</div><div class='add'>+</div><div class='add'>+/**</div><div class='add'>+ * Optional Records:</div><div class='add'>+ *  fops that need to save additional information request a array of</div><div class='add'>+ *  @changelog_opt_t struct. The array is allocated via @iobufs.</div><div class='add'>+ */</div><div class='add'>+typedef enum {</div><div class='add'>+    CHANGELOG_OPT_REC_FOP,</div><div class='add'>+    CHANGELOG_OPT_REC_ENTRY,</div><div class='add'>+    CHANGELOG_OPT_REC_UINT32,</div><div class='add'>+} changelog_optional_rec_type_t;</div><div class='add'>+</div><div class='add'>+struct changelog_entry_fields {</div><div class='add'>+    uuid_t cef_uuid;</div><div class='add'>+    char *cef_bname;</div><div class='add'>+    char *cef_path;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+typedef struct {</div><div class='add'>+    /**</div><div class='add'>+     * @co_covert can be used to do post-processing of the record before</div><div class='add'>+     * it's persisted to the CHANGELOG. If this is NULL, then the record</div><div class='add'>+     * is persisted as per it's in memory format.</div><div class='add'>+     */</div><div class='add'>+    size_t (*co_convert)(void *data, char *buffer, gf_boolean_t encode);</div><div class='add'>+</div><div class='add'>+    /* release routines */</div><div class='add'>+    void (*co_free)(void *data);</div><div class='add'>+</div><div class='add'>+    /* type of the field */</div><div class='add'>+    changelog_optional_rec_type_t co_type;</div><div class='add'>+</div><div class='add'>+    /**</div><div class='add'>+     * sizeof of the 'valid' field in the union. This field is not used if</div><div class='add'>+     * @co_convert is specified.</div><div class='add'>+     */</div><div class='add'>+    size_t co_len;</div><div class='add'>+</div><div class='add'>+    union {</div><div class='add'>+        unsigned int co_uint32;</div><div class='add'>+        glusterfs_fop_t co_fop;</div><div class='add'>+        struct changelog_entry_fields co_entry;</div><div class='add'>+    };</div><div class='add'>+} changelog_opt_t;</div><div class='add'>+</div><div class='add'>+#define CHANGELOG_OPT_RECORD_LEN sizeof(changelog_opt_t)</div><div class='add'>+</div><div class='add'>+/**</div><div class='add'>+ * helpers routines</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+changelog_thread_cleanup(xlator_t *this, pthread_t thr_id);</div><div class='add'>+</div><div class='add'>+void *</div><div class='add'>+changelog_get_usable_buffer(changelog_local_t *local);</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+changelog_set_usable_record_and_length(changelog_local_t *local, size_t len,</div><div class='add'>+                                       int xr);</div><div class='add'>+void</div><div class='add'>+changelog_local_cleanup(xlator_t *xl, changelog_local_t *local);</div><div class='add'>+changelog_local_t *</div><div class='add'>+changelog_local_init(xlator_t *this, inode_t *inode, uuid_t gfid,</div><div class='add'>+                     int xtra_records, gf_boolean_t update_flag);</div><div class='add'>+int</div><div class='add'>+changelog_start_next_change(xlator_t *this, changelog_priv_t *priv, time_t ts,</div><div class='add'>+                            gf_boolean_t finale);</div><div class='add'>+int</div><div class='add'>+changelog_open_journal(xlator_t *this, changelog_priv_t *priv);</div><div class='add'>+void</div><div class='add'>+changelog_fill_rollover_data(changelog_log_data_t *cld, gf_boolean_t is_last);</div><div class='add'>+int</div><div class='add'>+changelog_inject_single_event(xlator_t *this, changelog_priv_t *priv,</div><div class='add'>+                              changelog_log_data_t *cld);</div><div class='add'>+size_t</div><div class='add'>+changelog_entry_length();</div><div class='add'>+int</div><div class='add'>+changelog_write(int fd, char *buffer, size_t len);</div><div class='add'>+int</div><div class='add'>+changelog_write_change(changelog_priv_t *priv, char *buffer, size_t len);</div><div class='add'>+int</div><div class='add'>+changelog_handle_change(xlator_t *this, changelog_priv_t *priv,</div><div class='add'>+                        changelog_log_data_t *cld);</div><div class='add'>+void</div><div class='add'>+changelog_update(xlator_t *this, changelog_priv_t *priv,</div><div class='add'>+                 changelog_local_t *local, changelog_log_type type);</div><div class='add'>+void *</div><div class='add'>+changelog_rollover(void *data);</div><div class='add'>+void *</div><div class='add'>+changelog_fsync_thread(void *data);</div><div class='add'>+int</div><div class='add'>+changelog_forget(xlator_t *this, inode_t *inode);</div><div class='add'>+int</div><div class='add'>+htime_update(xlator_t *this, changelog_priv_t *priv, time_t ts, char *buffer);</div><div class='add'>+int</div><div class='add'>+htime_open(xlator_t *this, changelog_priv_t *priv, time_t ts);</div><div class='add'>+int</div><div class='add'>+htime_create(xlator_t *this, changelog_priv_t *priv, time_t ts);</div><div class='add'>+</div><div class='add'>+/* Geo-Rep snapshot dependency changes */</div><div class='add'>+void</div><div class='add'>+changelog_color_fop_and_inc_cnt(xlator_t *this, changelog_priv_t *priv,</div><div class='add'>+                                changelog_local_t *local);</div><div class='add'>+void</div><div class='add'>+changelog_inc_fop_cnt(xlator_t *this, changelog_priv_t *priv,</div><div class='add'>+                      changelog_local_t *local);</div><div class='add'>+void</div><div class='add'>+changelog_dec_fop_cnt(xlator_t *this, changelog_priv_t *priv,</div><div class='add'>+                      changelog_local_t *local);</div><div class='add'>+int</div><div class='add'>+changelog_barrier_notify(changelog_priv_t *priv, char *buf);</div><div class='add'>+void</div><div class='add'>+changelog_barrier_cleanup(xlator_t *this, changelog_priv_t *priv,</div><div class='add'>+                          struct list_head *queue);</div><div class='add'>+void</div><div class='add'>+changelog_drain_white_fops(xlator_t *this, changelog_priv_t *priv);</div><div class='add'>+void</div><div class='add'>+changelog_drain_black_fops(xlator_t *this, changelog_priv_t *priv);</div><div class='add'>+</div><div class='add'>+/* Crash consistency of changelog wrt snapshot */</div><div class='add'>+int</div><div class='add'>+changelog_snap_logging_stop(xlator_t *this, changelog_priv_t *priv);</div><div class='add'>+int</div><div class='add'>+changelog_snap_logging_start(xlator_t *this, changelog_priv_t *priv);</div><div class='add'>+int</div><div class='add'>+changelog_snap_open(xlator_t *this, changelog_priv_t *priv);</div><div class='add'>+int</div><div class='add'>+changelog_snap_handle_ascii_change(xlator_t *this, changelog_log_data_t *cld);</div><div class='add'>+int</div><div class='add'>+changelog_snap_write_change(changelog_priv_t *priv, char *buffer, size_t len);</div><div class='add'>+</div><div class='add'>+/* Changelog barrier routines */</div><div class='add'>+void</div><div class='add'>+__chlog_barrier_enqueue(xlator_t *this, call_stub_t *stub);</div><div class='add'>+void</div><div class='add'>+__chlog_barrier_disable(xlator_t *this, struct list_head *queue);</div><div class='add'>+void</div><div class='add'>+chlog_barrier_dequeue_all(xlator_t *this, struct list_head *queue);</div><div class='add'>+call_stub_t *</div><div class='add'>+__chlog_barrier_dequeue(xlator_t *this, struct list_head *queue);</div><div class='add'>+int</div><div class='add'>+__chlog_barrier_enable(xlator_t *this, changelog_priv_t *priv);</div><div class='add'>+</div><div class='add'>+int32_t</div><div class='add'>+changelog_fill_entry_buf(call_frame_t *frame, xlator_t *this, loc_t *loc,</div><div class='add'>+                         changelog_local_t **local);</div><div class='add'>+</div><div class='add'>+/* event selection routines */</div><div class='add'>+void</div><div class='add'>+changelog_select_event(xlator_t *, changelog_ev_selector_t *, unsigned int);</div><div class='add'>+void</div><div class='add'>+changelog_deselect_event(xlator_t *, changelog_ev_selector_t *, unsigned int);</div><div class='add'>+int</div><div class='add'>+changelog_init_event_selection(xlator_t *, changelog_ev_selector_t *);</div><div class='add'>+int</div><div class='add'>+changelog_ev_selected(xlator_t *, changelog_ev_selector_t *, unsigned int);</div><div class='add'>+void</div><div class='add'>+changelog_dispatch_event(xlator_t *, changelog_priv_t *, changelog_event_t *);</div><div class='add'>+</div><div class='add'>+changelog_inode_ctx_t *</div><div class='add'>+__changelog_inode_ctx_get(xlator_t *, inode_t *, unsigned long **,</div><div class='add'>+                          unsigned long *, changelog_log_type);</div><div class='add'>+int</div><div class='add'>+resolve_pargfid_to_path(xlator_t *this, const uuid_t gfid, char **path,</div><div class='add'>+                        char *bname);</div><div class='add'>+</div><div class='add'>+/* macros */</div><div class='add'>+</div><div class='add'>+#define CHANGELOG_STACK_UNWIND(fop, frame, params...)                          \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        changelog_local_t *__local = NULL;                                     \</div><div class='add'>+        xlator_t *__xl = NULL;                                                 \</div><div class='add'>+        if (frame) {                                                           \</div><div class='add'>+            __local = frame-&gt;local;                                            \</div><div class='add'>+            __xl = frame-&gt;this;                                                \</div><div class='add'>+            frame-&gt;local = NULL;                                               \</div><div class='add'>+        }                                                                      \</div><div class='add'>+        STACK_UNWIND_STRICT(fop, frame, params);                               \</div><div class='add'>+        if (__local &amp;&amp; __local-&gt;prev_entry)                                    \</div><div class='add'>+            changelog_local_cleanup(__xl, __local-&gt;prev_entry);                \</div><div class='add'>+        changelog_local_cleanup(__xl, __local);                                \</div><div class='add'>+    } while (0)</div><div class='add'>+</div><div class='add'>+#define CHANGELOG_IOBUF_REF(iobuf)                                             \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        if (iobuf)                                                             \</div><div class='add'>+            iobuf_ref(iobuf);                                                  \</div><div class='add'>+    } while (0)</div><div class='add'>+</div><div class='add'>+#define CHANGELOG_IOBUF_UNREF(iobuf)                                           \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        if (iobuf)                                                             \</div><div class='add'>+            iobuf_unref(iobuf);                                                \</div><div class='add'>+    } while (0)</div><div class='add'>+</div><div class='add'>+#define CHANGELOG_FILL_BUFFER(buffer, off, val, len)                           \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        memcpy(buffer + off, val, len);                                        \</div><div class='add'>+        off += len;                                                            \</div><div class='add'>+    } while (0)</div><div class='add'>+</div><div class='add'>+#define SLICE_VERSION_UPDATE(slice)                                            \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        int i = 0;                                                             \</div><div class='add'>+        for (; i &lt; CHANGELOG_MAX_TYPE; i++) {                                  \</div><div class='add'>+            slice-&gt;changelog_version[i]++;                                     \</div><div class='add'>+        }                                                                      \</div><div class='add'>+    } while (0)</div><div class='add'>+</div><div class='add'>+#define CHANGELOG_FILL_UINT32(co, number, converter, xlen)                     \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        co-&gt;co_convert = converter;                                            \</div><div class='add'>+        co-&gt;co_free = NULL;                                                    \</div><div class='add'>+        co-&gt;co_type = CHANGELOG_OPT_REC_UINT32;                                \</div><div class='add'>+        co-&gt;co_uint32 = number;                                                \</div><div class='add'>+        xlen += sizeof(unsigned int);                                          \</div><div class='add'>+    } while (0)</div><div class='add'>+</div><div class='add'>+#define CHANGLOG_FILL_FOP_NUMBER(co, fop, converter, xlen)                     \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        co-&gt;co_convert = converter;                                            \</div><div class='add'>+        co-&gt;co_free = NULL;                                                    \</div><div class='add'>+        co-&gt;co_type = CHANGELOG_OPT_REC_FOP;                                   \</div><div class='add'>+        co-&gt;co_fop = fop;                                                      \</div><div class='add'>+        xlen += sizeof(fop);                                                   \</div><div class='add'>+    } while (0)</div><div class='add'>+</div><div class='add'>+#define CHANGELOG_FILL_ENTRY(co, pargfid, bname, converter, freefn, xlen,      \</div><div class='add'>+                             label)                                            \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        co-&gt;co_convert = converter;                                            \</div><div class='add'>+        co-&gt;co_free = freefn;                                                  \</div><div class='add'>+        co-&gt;co_type = CHANGELOG_OPT_REC_ENTRY;                                 \</div><div class='add'>+        gf_uuid_copy(co-&gt;co_entry.cef_uuid, pargfid);                          \</div><div class='add'>+        co-&gt;co_entry.cef_bname = gf_strdup(bname);                             \</div><div class='add'>+        if (!co-&gt;co_entry.cef_bname)                                           \</div><div class='add'>+            goto label;                                                        \</div><div class='add'>+        xlen += (UUID_CANONICAL_FORM_LEN + strlen(bname));                     \</div><div class='add'>+    } while (0)</div><div class='add'>+</div><div class='add'>+#define CHANGELOG_FILL_ENTRY_DIR_PATH(co, pargfid, bname, converter,           \</div><div class='add'>+                                      del_freefn, xlen, label, capture_del)    \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        co-&gt;co_convert = converter;                                            \</div><div class='add'>+        co-&gt;co_free = del_freefn;                                              \</div><div class='add'>+        co-&gt;co_type = CHANGELOG_OPT_REC_ENTRY;                                 \</div><div class='add'>+        gf_uuid_copy(co-&gt;co_entry.cef_uuid, pargfid);                          \</div><div class='add'>+        co-&gt;co_entry.cef_bname = gf_strdup(bname);                             \</div><div class='add'>+        if (!co-&gt;co_entry.cef_bname)                                           \</div><div class='add'>+            goto label;                                                        \</div><div class='add'>+        xlen += (UUID_CANONICAL_FORM_LEN + strlen(bname));                     \</div><div class='add'>+        if (!capture_del ||                                                    \</div><div class='add'>+            resolve_pargfid_to_path(this, pargfid, &amp;(co-&gt;co_entry.cef_path),   \</div><div class='add'>+                                    co-&gt;co_entry.cef_bname)) {                 \</div><div class='add'>+            co-&gt;co_entry.cef_path = gf_strdup("\0");                           \</div><div class='add'>+            xlen += 1;                                                         \</div><div class='add'>+        } else {                                                               \</div><div class='add'>+            xlen += (strlen(co-&gt;co_entry.cef_path));                           \</div><div class='add'>+        }                                                                      \</div><div class='add'>+    } while (0)</div><div class='add'>+</div><div class='add'>+#define CHANGELOG_INIT(this, local, inode, gfid, xrec)                         \</div><div class='add'>+    local = changelog_local_init(this, inode, gfid, xrec, _gf_false)</div><div class='add'>+</div><div class='add'>+#define CHANGELOG_INIT_NOCHECK(this, local, inode, gfid, xrec)                 \</div><div class='add'>+    local = changelog_local_init(this, inode, gfid, xrec, _gf_true)</div><div class='add'>+</div><div class='add'>+#define CHANGELOG_NOT_ACTIVE_THEN_GOTO(frame, priv, label)                     \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        if (!priv-&gt;active)                                                     \</div><div class='add'>+            goto label;                                                        \</div><div class='add'>+        /* ignore rebalance process's activity. */                             \</div><div class='add'>+        if ((frame-&gt;root-&gt;pid == GF_CLIENT_PID_DEFRAG) ||                      \</div><div class='add'>+            (frame-&gt;root-&gt;pid == GF_CLIENT_PID_TIER_DEFRAG))                   \</div><div class='add'>+            goto label;                                                        \</div><div class='add'>+    } while (0)</div><div class='add'>+</div><div class='add'>+/* If it is a METADATA entry and fop num being GF_FOP_NULL, don't</div><div class='add'>+ * log in the changelog as it is of no use. And also if it is</div><div class='add'>+ * logged, since slicing version checking is done for metadata</div><div class='add'>+ * entries, the subsequent entries with valid fop num which falls</div><div class='add'>+ * to same changelog will be missed. Hence check for boundary</div><div class='add'>+ * condition.</div><div class='add'>+ */</div><div class='add'>+#define CHANGELOG_OP_BOUNDARY_CHECK(frame, label)                              \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        if (frame-&gt;root-&gt;op &lt;= GF_FOP_NULL ||                                  \</div><div class='add'>+            frame-&gt;root-&gt;op &gt;= GF_FOP_MAXVALUE)                                \</div><div class='add'>+            goto label;                                                        \</div><div class='add'>+    } while (0)</div><div class='add'>+</div><div class='add'>+/**</div><div class='add'>+ * ignore internal fops for all clients except AFR self-heal daemon</div><div class='add'>+ */</div><div class='add'>+#define CHANGELOG_IF_INTERNAL_FOP_THEN_GOTO(frame, dict, label)                \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        if ((frame-&gt;root-&gt;pid != GF_CLIENT_PID_SELF_HEALD) &amp;&amp; dict &amp;&amp;          \</div><div class='add'>+            dict_get(dict, GLUSTERFS_INTERNAL_FOP_KEY))                        \</div><div class='add'>+            goto label;                                                        \</div><div class='add'>+    } while (0)</div><div class='add'>+</div><div class='add'>+#define CHANGELOG_COND_GOTO(priv, cond, label)                                 \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        if (!priv-&gt;active || cond)                                             \</div><div class='add'>+            goto label;                                                        \</div><div class='add'>+    } while (0)</div><div class='add'>+</div><div class='add'>+/* Begin: Geo-Rep snapshot dependency changes */</div><div class='add'>+</div><div class='add'>+#define DICT_ERROR -1</div><div class='add'>+#define BARRIER_OFF 0</div><div class='add'>+#define BARRIER_ON 1</div><div class='add'>+#define DICT_DEFAULT 2</div><div class='add'>+</div><div class='add'>+#define CHANGELOG_NOT_ON_THEN_GOTO(priv, ret, label)                           \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        if (!priv-&gt;active) {                                                   \</div><div class='add'>+            gf_smsg(this-&gt;name, GF_LOG_WARNING, 0,                             \</div><div class='add'>+                    CHANGELOG_MSG_CHANGELOG_NOT_ACTIVE, NULL);                 \</div><div class='add'>+            ret = 0;                                                           \</div><div class='add'>+            goto label;                                                        \</div><div class='add'>+        }                                                                      \</div><div class='add'>+    } while (0)</div><div class='add'>+</div><div class='add'>+/* Log pthread error and goto label */</div><div class='add'>+#define CHANGELOG_PTHREAD_ERROR_HANDLE_0(ret, label)                           \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        if (ret) {                                                             \</div><div class='add'>+            gf_smsg(this-&gt;name, GF_LOG_ERROR, 0, CHANGELOG_MSG_PTHREAD_ERROR,  \</div><div class='add'>+                    "error=%d", ret, NULL);                                    \</div><div class='add'>+            ret = -1;                                                          \</div><div class='add'>+            goto label;                                                        \</div><div class='add'>+        }                                                                      \</div><div class='add'>+    } while (0);</div><div class='add'>+</div><div class='add'>+/* Log pthread error, set flag and goto label */</div><div class='add'>+#define CHANGELOG_PTHREAD_ERROR_HANDLE_1(ret, label, flag)                     \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        if (ret) {                                                             \</div><div class='add'>+            gf_smsg(this-&gt;name, GF_LOG_ERROR, 0, CHANGELOG_MSG_PTHREAD_ERROR,  \</div><div class='add'>+                    "error=%d", ret, NULL);                                    \</div><div class='add'>+            ret = -1;                                                          \</div><div class='add'>+            flag = _gf_true;                                                   \</div><div class='add'>+            goto label;                                                        \</div><div class='add'>+        }                                                                      \</div><div class='add'>+    } while (0)</div><div class='add'>+</div><div class='add'>+/* Log pthread error, unlock mutex and goto label */</div><div class='add'>+#define CHANGELOG_PTHREAD_ERROR_HANDLE_2(ret, label, mutex)                    \</div><div class='add'>+    do {                                                                       \</div><div class='add'>+        if (ret) {                                                             \</div><div class='add'>+            gf_smsg(this-&gt;name, GF_LOG_ERROR, 0, CHANGELOG_MSG_PTHREAD_ERROR,  \</div><div class='add'>+                    "error=%d", ret, NULL);                                    \</div><div class='add'>+            ret = -1;                                                          \</div><div class='add'>+            pthread_mutex_unlock(&amp;mutex);                                      \</div><div class='add'>+            goto label;                                                        \</div><div class='add'>+        }                                                                      \</div><div class='add'>+    } while (0)</div><div class='add'>+</div><div class='add'>+/* End: Geo-Rep snapshot dependency changes */</div><div class='add'>+</div><div class='add'>+#endif /* _CHANGELOG_HELPERS_H */</div><div class='head'>diff --git a/xlators/features/changelog/src/changelog-mem-types.h b/xlators/features/changelog/src/changelog-mem-types.h<br/>new file mode 100644<br/>index 00000000000..a2d8a9cbe93<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/xlators/features/changelog/src/changelog-mem-types.h?id=d1d7a6f35c816822fab51c820e25023863c239c1'>xlators/features/changelog/src/changelog-mem-types.h</a></div><div class='hunk'>@@ -0,0 +1,34 @@</div><div class='add'>+/*</div><div class='add'>+   Copyright (c) 2013 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+   This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+   This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+   General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+   later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+   cases as published by the Free Software Foundation.</div><div class='add'>+*/</div><div class='add'>+</div><div class='add'>+#ifndef _CHANGELOG_MEM_TYPES_H</div><div class='add'>+#define _CHANGELOG_MEM_TYPES_H</div><div class='add'>+</div><div class='add'>+#include &lt;glusterfs/mem-types.h&gt;</div><div class='add'>+</div><div class='add'>+enum gf_changelog_mem_types {</div><div class='add'>+    gf_changelog_mt_priv_t = gf_common_mt_end + 1,</div><div class='add'>+    gf_changelog_mt_str_t = gf_common_mt_end + 2,</div><div class='add'>+    gf_changelog_mt_batch_t = gf_common_mt_end + 3,</div><div class='add'>+    gf_changelog_mt_rt_t = gf_common_mt_end + 4,</div><div class='add'>+    gf_changelog_mt_inode_ctx_t = gf_common_mt_end + 5,</div><div class='add'>+    gf_changelog_mt_rpc_clnt_t = gf_common_mt_end + 6,</div><div class='add'>+    gf_changelog_mt_libgfchangelog_t = gf_common_mt_end + 7,</div><div class='add'>+    gf_changelog_mt_libgfchangelog_entry_t = gf_common_mt_end + 8,</div><div class='add'>+    gf_changelog_mt_libgfchangelog_rl_t = gf_common_mt_end + 9,</div><div class='add'>+    gf_changelog_mt_changelog_buffer_t = gf_common_mt_end + 10,</div><div class='add'>+    gf_changelog_mt_history_data_t = gf_common_mt_end + 11,</div><div class='add'>+    gf_changelog_mt_libgfchangelog_call_pool_t = gf_common_mt_end + 12,</div><div class='add'>+    gf_changelog_mt_libgfchangelog_event_t = gf_common_mt_end + 13,</div><div class='add'>+    gf_changelog_mt_ev_dispatcher_t = gf_common_mt_end + 14,</div><div class='add'>+    gf_changelog_mt_end</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+#endif</div><div class='head'>diff --git a/xlators/features/changelog/src/changelog-messages.h b/xlators/features/changelog/src/changelog-messages.h<br/>new file mode 100644<br/>index 00000000000..cb0e16c85d8<br/>--- /dev/null<br/>+++ b/<a href='/cgit/glusterfs.git/tree/xlators/features/changelog/src/changelog-messages.h?id=d1d7a6f35c816822fab51c820e25023863c239c1'>xlators/features/changelog/src/changelog-messages.h</a></div><div class='hunk'>@@ -0,0 +1,172 @@</div><div class='add'>+/*</div><div class='add'>+ Copyright (c) 2015 Red Hat, Inc. &lt;http://www.redhat.com&gt;</div><div class='add'>+ This file is part of GlusterFS.</div><div class='add'>+</div><div class='add'>+ This file is licensed to you under your choice of the GNU Lesser</div><div class='add'>+ General Public License, version 3 or any later version (LGPLv3 or</div><div class='add'>+ later), or the GNU General Public License, version 2 (GPLv2), in all</div><div class='add'>+ cases as published by the Free Software Foundation.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+#ifndef _CHANGELOG_MESSAGES_H_</div><div class='add'>+#define _CHANGELOG_MESSAGES_H_</div><div class='add'>+</div><div class='add'>+#include &lt;glusterfs/glfs-message-id.h&gt;</div><div class='add'>+</div><div class='add'>+/* To add new message IDs, append new identifiers at the end of the list.</div><div class='add'>+ *</div><div class='add'>+ * Never remove a message ID. If it's not used anymore, you can rename it or</div><div class='add'>+ * leave it as it is, but not delete it. This is to prevent reutilization of</div><div class='add'>+ * IDs by other messages.</div><div class='add'>+ *</div><div class='add'>+ * The component name must match one of the entries defined in</div><div class='add'>+ * glfs-message-id.h.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+GLFS_MSGID(</div><div class='add'>+    CHANGELOG, CHANGELOG_MSG_OPEN_FAILED, CHANGELOG_MSG_BARRIER_FOP_FAILED,</div><div class='add'>+    CHANGELOG_MSG_VOL_MISCONFIGURED, CHANGELOG_MSG_RENAME_ERROR,</div><div class='add'>+    CHANGELOG_MSG_READ_ERROR, CHANGELOG_MSG_HTIME_ERROR,</div><div class='add'>+    CHANGELOG_MSG_PTHREAD_MUTEX_INIT_FAILED,</div><div class='add'>+    CHANGELOG_MSG_PTHREAD_COND_INIT_FAILED, CHANGELOG_MSG_CHILD_MISCONFIGURED,</div><div class='add'>+    CHANGELOG_MSG_DIR_OPTIONS_NOT_SET, CHANGELOG_MSG_CLOSE_ERROR,</div><div class='add'>+    CHANGELOG_MSG_PIPE_CREATION_ERROR, CHANGELOG_MSG_DICT_GET_FAILED,</div><div class='add'>+    CHANGELOG_MSG_BARRIER_INFO, CHANGELOG_MSG_BARRIER_ERROR,</div><div class='add'>+    CHANGELOG_MSG_GET_TIME_OP_FAILED, CHANGELOG_MSG_WRITE_FAILED,</div><div class='add'>+    CHANGELOG_MSG_PTHREAD_ERROR, CHANGELOG_MSG_INODE_NOT_FOUND,</div><div class='add'>+    CHANGELOG_MSG_FSYNC_OP_FAILED, CHANGELOG_MSG_TOTAL_LOG_INFO,</div><div class='add'>+    CHANGELOG_MSG_SNAP_INFO, CHANGELOG_MSG_SELECT_FAILED,</div><div class='add'>+    CHANGELOG_MSG_FCNTL_FAILED, CHANGELOG_MSG_BNOTIFY_INFO,</div><div class='add'>+    CHANGELOG_MSG_ENTRY_BUF_INFO, CHANGELOG_MSG_CHANGELOG_NOT_ACTIVE,</div><div class='add'>+    CHANGELOG_MSG_LOCAL_INIT_FAILED, CHANGELOG_MSG_NOTIFY_REGISTER_FAILED,</div><div class='add'>+    CHANGELOG_MSG_PROGRAM_NAME_REG_FAILED, CHANGELOG_MSG_HANDLE_PROBE_ERROR,</div><div class='add'>+    CHANGELOG_MSG_SET_FD_CONTEXT, CHANGELOG_MSG_FREEUP_FAILED,</div><div class='add'>+    CHANGELOG_MSG_RECONFIGURE, CHANGELOG_MSG_RPC_SUBMIT_REPLY_FAILED,</div><div class='add'>+    CHANGELOG_MSG_RPC_BUILD_ERROR, CHANGELOG_MSG_RPC_CONNECT_ERROR,</div><div class='add'>+    CHANGELOG_MSG_RPC_START_ERROR, CHANGELOG_MSG_BUFFER_STARVATION_ERROR,</div><div class='add'>+    CHANGELOG_MSG_SCAN_DIR_FAILED, CHANGELOG_MSG_FSETXATTR_FAILED,</div><div class='add'>+    CHANGELOG_MSG_FGETXATTR_FAILED, CHANGELOG_MSG_CLEANUP_ON_ACTIVE_REF,</div><div class='add'>+    CHANGELOG_MSG_DISPATCH_EVENT_FAILED, CHANGELOG_MSG_PUT_BUFFER_FAILED,</div><div class='add'>+    CHANGELOG_MSG_PTHREAD_COND_WAIT_FAILED, CHANGELOG_MSG_PTHREAD_CANCEL_FAILED,</div><div class='add'>+    CHANGELOG_MSG_INJECT_FSYNC_FAILED, CHANGELOG_MSG_CREATE_FRAME_FAILED,</div><div class='add'>+    CHANGELOG_MSG_FSTAT_OP_FAILED, CHANGELOG_MSG_LSEEK_OP_FAILED,</div><div class='add'>+    CHANGELOG_MSG_STRSTR_OP_FAILED, CHANGELOG_MSG_UNLINK_OP_FAILED,</div><div class='add'>+    CHANGELOG_MSG_DETECT_EMPTY_CHANGELOG_FAILED,</div><div class='add'>+    CHANGELOG_MSG_READLINK_OP_FAILED, CHANGELOG_MSG_EXPLICIT_ROLLOVER_FAILED,</div><div class='add'>+    CHANGELOG_MSG_RPCSVC_NOTIFY_FAILED, CHANGELOG_MSG_MEMORY_INIT_FAILED,</div><div class='add'>+    CHANGELOG_MSG_NO_MEMORY, CHANGELOG_MSG_HTIME_STAT_ERROR,</div><div class='add'>+    CHANGELOG_MSG_HTIME_CURRENT_ERROR, CHANGELOG_MSG_BNOTIFY_COND_INFO,</div><div class='add'>+    CHANGELOG_MSG_NO_HTIME_CURRENT, CHANGELOG_MSG_HTIME_CURRENT,</div><div class='add'>+    CHANGELOG_MSG_NEW_HTIME_FILE, CHANGELOG_MSG_MKDIR_ERROR,</div><div class='add'>+    CHANGELOG_MSG_PATH_NOT_FOUND, CHANGELOG_MSG_XATTR_INIT_FAILED,</div><div class='add'>+    CHANGELOG_MSG_WROTE_TO_CSNAP, CHANGELOG_MSG_UNUSED_0,</div><div class='add'>+    CHANGELOG_MSG_GET_BUFFER_FAILED, CHANGELOG_MSG_BARRIER_STATE_NOTIFY,</div><div class='add'>+    CHANGELOG_MSG_BARRIER_DISABLED, CHANGELOG_MSG_BARRIER_ALREADY_DISABLED,</div><div class='add'>+    CHANGELOG_MSG_BARRIER_ON_ERROR, CHANGELOG_MSG_BARRIER_ENABLE,</div><div class='add'>+    CHANGELOG_MSG_BARRIER_KEY_NOT_FOUND, CHANGELOG_MSG_ERROR_IN_DICT_GET,</div><div class='add'>+    CHANGELOG_MSG_UNUSED_1, CHANGELOG_MSG_UNUSED_2,</div><div class='add'>+    CHANGELOG_MSG_DEQUEUING_BARRIER_FOPS,</div><div class='add'>+    CHANGELOG_MSG_DEQUEUING_BARRIER_FOPS_FINISHED,</div><div class='add'>+    CHANGELOG_MSG_BARRIER_TIMEOUT, CHANGELOG_MSG_TIMEOUT_ADD_FAILED,</div><div class='add'>+    CHANGELOG_MSG_CLEANUP_ALREADY_SET);</div><div class='add'>+</div><div class='add'>+#define CHANGELOG_MSG_BARRIER_FOP_FAILED_STR                                   \</div><div class='add'>+    "failed to barrier FOPs, disabling changelog barrier"</div><div class='add'>+#define CHANGELOG_MSG_MEMORY_INIT_FAILED_STR "memory accounting init failed"</div><div class='add'>+#define CHANGELOG_MSG_NO_MEMORY_STR "failed to create local memory pool"</div><div class='add'>+#define CHANGELOG_MSG_ENTRY_BUF_INFO_STR                                       \</div><div class='add'>+    "Entry cannot be captured for gfid, Capturing DATA entry."</div><div class='add'>+#define CHANGELOG_MSG_PTHREAD_ERROR_STR "pthread error"</div><div class='add'>+#define CHANGELOG_MSG_PTHREAD_MUTEX_INIT_FAILED_STR "pthread_mutex_init failed"</div><div class='add'>+#define CHANGELOG_MSG_PTHREAD_COND_INIT_FAILED_STR "pthread_cond_init failed"</div><div class='add'>+#define CHANGELOG_MSG_HTIME_ERROR_STR "failed to update HTIME file"</div><div class='add'>+#define CHANGELOG_MSG_HTIME_STAT_ERROR_STR "unable to stat htime file"</div><div class='add'>+#define CHANGELOG_MSG_HTIME_CURRENT_ERROR_STR "Error extracting HTIME_CURRENT."</div><div class='add'>+#define CHANGELOG_MSG_UNLINK_OP_FAILED_STR "error unlinking empty changelog"</div><div class='add'>+#define CHANGELOG_MSG_RENAME_ERROR_STR "error renaming"</div><div class='add'>+#define CHANGELOG_MSG_MKDIR_ERROR_STR "unable to create directory"</div><div class='add'>+#define CHANGELOG_MSG_BNOTIFY_INFO_STR                                         \</div><div class='add'>+    "Explicit rollover changelog signaling bnotify"</div><div class='add'>+#define CHANGELOG_MSG_BNOTIFY_COND_INFO_STR "Woke up: bnotify conditional wait"</div><div class='add'>+#define CHANGELOG_MSG_RECONFIGURE_STR "Reconfigure: Changelog Enable"</div><div class='add'>+#define CHANGELOG_MSG_NO_HTIME_CURRENT_STR                                     \</div><div class='add'>+    "HTIME_CURRENT not found. Changelog enabled before init"</div><div class='add'>+#define CHANGELOG_MSG_HTIME_CURRENT_STR "HTIME_CURRENT"</div><div class='add'>+#define CHANGELOG_MSG_NEW_HTIME_FILE_STR                                       \</div><div class='add'>+    "Changelog enable: Creating new HTIME file"</div><div class='add'>+#define CHANGELOG_MSG_FGETXATTR_FAILED_STR "fgetxattr failed"</div><div class='add'>+#define CHANGELOG_MSG_TOTAL_LOG_INFO_STR "changelog info"</div><div class='add'>+#define CHANGELOG_MSG_PTHREAD_COND_WAIT_FAILED_STR "pthread cond wait failed"</div><div class='add'>+#define CHANGELOG_MSG_INODE_NOT_FOUND_STR "inode not found"</div><div class='add'>+#define CHANGELOG_MSG_READLINK_OP_FAILED_STR                                   \</div><div class='add'>+    "could not read the link from the gfid handle"</div><div class='add'>+#define CHANGELOG_MSG_OPEN_FAILED_STR "unable to open file"</div><div class='add'>+#define CHANGELOG_MSG_RPC_CONNECT_ERROR_STR "failed to connect back"</div><div class='add'>+#define CHANGELOG_MSG_BUFFER_STARVATION_ERROR_STR                              \</div><div class='add'>+    "Failed to get buffer for RPC dispatch"</div><div class='add'>+#define CHANGELOG_MSG_PTHREAD_CANCEL_FAILED_STR "could not cancel thread"</div><div class='add'>+#define CHANGELOG_MSG_FSTAT_OP_FAILED_STR "Could not stat (CHANGELOG)"</div><div class='add'>+#define CHANGELOG_MSG_LSEEK_OP_FAILED_STR "Could not lseek (changelog)"</div><div class='add'>+#define CHANGELOG_MSG_PATH_NOT_FOUND_STR                                       \</div><div class='add'>+    "Could not find CHANGELOG in changelog path"</div><div class='add'>+#define CHANGELOG_MSG_FSYNC_OP_FAILED_STR "fsync failed"</div><div class='add'>+#define CHANGELOG_MSG_DETECT_EMPTY_CHANGELOG_FAILED_STR                        \</div><div class='add'>+    "Error detecting empty changelog"</div><div class='add'>+#define CHANGELOG_MSG_EXPLICIT_ROLLOVER_FAILED_STR                             \</div><div class='add'>+    "Fail snapshot because of previous errors"</div><div class='add'>+#define CHANGELOG_MSG_SCAN_DIR_FAILED_STR "scandir failed"</div><div class='add'>+#define CHANGELOG_MSG_FSETXATTR_FAILED_STR "fsetxattr failed"</div><div class='add'>+#define CHANGELOG_MSG_XATTR_INIT_FAILED_STR "Htime xattr initialization failed"</div><div class='add'>+#define CHANGELOG_MSG_SNAP_INFO_STR "log in call path"</div><div class='add'>+#define CHANGELOG_MSG_WRITE_FAILED_STR "error writing to disk"</div><div class='add'>+#define CHANGELOG_MSG_WROTE_TO_CSNAP_STR "Successfully wrote to csnap"</div><div class='add'>+#define CHANGELOG_MSG_GET_TIME_OP_FAILED_STR "Problem rolling over changelog(s)"</div><div class='add'>+#define CHANGELOG_MSG_BARRIER_INFO_STR "Explicit wakeup on barrier notify"</div><div class='add'>+#define CHANGELOG_MSG_SELECT_FAILED_STR "pthread_cond_timedwait failed"</div><div class='add'>+#define CHANGELOG_MSG_INJECT_FSYNC_FAILED_STR "failed to inject fsync event"</div><div class='add'>+#define CHANGELOG_MSG_LOCAL_INIT_FAILED_STR                                    \</div><div class='add'>+    "changelog local initialization failed"</div><div class='add'>+#define CHANGELOG_MSG_GET_BUFFER_FAILED_STR "Failed to get buffer"</div><div class='add'>+#define CHANGELOG_MSG_SET_FD_CONTEXT_STR                                       \</div><div class='add'>+    "could not set fd context(for release cbk)"</div><div class='add'>+#define CHANGELOG_MSG_DICT_GET_FAILED_STR "Barrier failed"</div><div class='add'>+#define CHANGELOG_MSG_BARRIER_STATE_NOTIFY_STR "Barrier notification"</div><div class='add'>+#define CHANGELOG_MSG_BARRIER_ERROR_STR                                        \</div><div class='add'>+    "Received another barrier off notification while already off"</div><div class='add'>+#define CHANGELOG_MSG_BARRIER_DISABLED_STR "disabled changelog barrier"</div><div class='add'>+#define CHANGELOG_MSG_BARRIER_ALREADY_DISABLED_STR                             \</div><div class='add'>+    "Changelog barrier already disabled"</div><div class='add'>+#define CHANGELOG_MSG_BARRIER_ON_ERROR_STR                                     \</div><div class='add'>+    "Received another barrier on notification when last one is not served yet"</div><div class='add'>+#define CHANGELOG_MSG_BARRIER_ENABLE_STR "Enabled changelog barrier"</div><div class='add'>+#define CHANGELOG_MSG_BARRIER_KEY_NOT_FOUND_STR "barrier key not found"</div><div class='add'>+#define CHANGELOG_MSG_ERROR_IN_DICT_GET_STR                                    \</div><div class='add'>+    "Something went wrong in dict_get_str_boolean"</div><div class='add'>+#define CHANGELOG_MSG_DIR_OPTIONS_NOT_SET_STR "changelog-dir option is not set"